Remove llgo per discussion on llvm-dev:

http://lists.llvm.org/pipermail/llvm-dev/2020-February/139058.html

Approved by dblaikie, pcc.

GitOrigin-RevId: 372bfc65deb859219270e8d467ee2918fb939599
diff --git a/.arcconfig b/.arcconfig
deleted file mode 100644
index 38ac279..0000000
--- a/.arcconfig
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "project_id" : "llgo",
-  "conduit_uri" : "https://reviews.llvm.org/"
-}
diff --git a/CMakeLists.txt b/CMakeLists.txt
deleted file mode 100644
index abe8962..0000000
--- a/CMakeLists.txt
+++ /dev/null
@@ -1,265 +0,0 @@
-include(ExternalProject)
-include(ProcessorCount)
-
-# Provide a config.h which exposes build system information.
-configure_file(
-  cmd/gllgo/config.h.cmake
-  ${CMAKE_CURRENT_BINARY_DIR}/cmd/gllgo/config.h)
-include_directories(${CMAKE_CURRENT_BINARY_DIR}/cmd/gllgo)
-
-list(APPEND LLVM_GO_PACKAGES "llvm.org/llgo=${CMAKE_CURRENT_SOURCE_DIR}")
-
-llvm_add_go_executable(llgo llvm.org/llgo/cmd/gllgo ALL DEPENDS
-  build/context.go
-  cmd/gllgo/gllgo.go
-  debug/debug.go
-  driver/parser.go
-  irgen/annotations.go
-  irgen/attribute.go
-  irgen/builtins.go
-  irgen/cabi.go
-  irgen/call.go
-  irgen/channels.go
-  irgen/closures.go
-  irgen/compiler.go
-  irgen/errors.go
-  irgen/indirect.go
-  irgen/interfaces.go
-  irgen/maps.go
-  irgen/predicates.go
-  irgen/println.go
-  irgen/runtime.go
-  irgen/slice.go
-  irgen/ssa.go
-  irgen/strings.go
-  irgen/switches.go
-  irgen/targets.go
-  irgen/typemap.go
-  irgen/types.go
-  irgen/utils.go
-  irgen/value.go
-  irgen/version.go
-  ssaopt/esc.go
-)
-
-string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" LLGO_VERSION
-  ${PACKAGE_VERSION})
-
-configure_file(
-  cmd/go/zdefaultcc.go.in
-  ${CMAKE_CURRENT_BINARY_DIR}/cmd/go/zdefaultcc.go)
-
-set(LLGO_GO_SOURCES
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/build.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/clean.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/context.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/discovery.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/doc.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/env.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/fix.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/fmt.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/generate.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/get.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/go11.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/help.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/http.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/list.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/main.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/note.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/pkg.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/run.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/signal.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/signal_unix.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/testflag.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/test.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/tool.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/vcs.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/version.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/go/vet.go
-  ${CMAKE_CURRENT_BINARY_DIR}/cmd/go/zdefaultcc.go
-)
-
-add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX}
-  COMMAND ${CMAKE_BINARY_DIR}/bin/llgo -static-libgo
-          -I ${CMAKE_CURRENT_BINARY_DIR}/libgo
-          -o ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX}
-          ${LLGO_GO_SOURCES}
-          ${CMAKE_CURRENT_BINARY_DIR}/libgo/zstdpkglist.go
-  DEPENDS llgo libgo ${LLGO_GO_SOURCES}
-  COMMENT "Building Go executable llgo-go"
-  VERBATIM)
-add_custom_target(llgo-go ALL DEPENDS ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX})
-
-set(LLGO_CGO_SOURCES
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/ast.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/doc.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/gcc.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/godefs.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/main.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/out.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo/go/cmd/cgo/util.go
-  ${CMAKE_CURRENT_SOURCE_DIR}/cmd/cgo/zdefaultcc.go
-)
-
-add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo
-  COMMAND ${CMAKE_BINARY_DIR}/bin/llgo -static-libgo
-          -o ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo
-          ${LLGO_CGO_SOURCES}
-  DEPENDS llgo libgo ${LLGO_CGO_SOURCES}
-  COMMENT "Building Go executable cgo"
-  VERBATIM)
-add_custom_target(cgo ALL DEPENDS ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo)
-
-llvm_add_go_executable(llgo-stage2 llvm.org/llgo/cmd/gllgo
-  DEPENDS libgo ${CMAKE_BINARY_DIR}/bin/llgo${CMAKE_EXECUTABLE_SUFFIX}
-          ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo
-          ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX}
-  GOFLAGS "cc=${CMAKE_BINARY_DIR}/bin/clang"
-          "cxx=${CMAKE_BINARY_DIR}/bin/clang++"
-          "go=${CMAKE_BINARY_DIR}/bin/llgo-go"
-)
-
-llvm_add_go_executable(llgo-stage3 llvm.org/llgo/cmd/gllgo
-  DEPENDS libgo ${CMAKE_BINARY_DIR}/bin/llgo-stage2${CMAKE_EXECUTABLE_SUFFIX}
-  GOFLAGS "cc=${CMAKE_BINARY_DIR}/bin/clang"
-          "cxx=${CMAKE_BINARY_DIR}/bin/clang++"
-          "go=${CMAKE_BINARY_DIR}/bin/llgo-go"
-          "llgo=${CMAKE_BINARY_DIR}/bin/llgo-stage2${CMAKE_EXECUTABLE_SUFFIX}"
-)
-
-llvm_add_go_executable(cc-wrapper llvm.org/llgo/cmd/cc-wrapper DEPENDS
-  cmd/cc-wrapper/main.go
-)
-
-llvm_add_go_executable(llgoi llvm.org/llgo/cmd/llgoi ALL
-  DEPENDS libgo ${CMAKE_BINARY_DIR}/bin/llgo${CMAKE_EXECUTABLE_SUFFIX}
-          ${CMAKE_BINARY_DIR}/lib/go/llgo-${LLGO_VERSION}/cgo
-          ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX}
-          cmd/llgoi/llgoi.go
-  GOFLAGS "cc=${CMAKE_BINARY_DIR}/bin/clang"
-          "cxx=${CMAKE_BINARY_DIR}/bin/clang++"
-          "go=${CMAKE_BINARY_DIR}/bin/llgo-go"
-)
-
-install(FILES ${CMAKE_BINARY_DIR}/bin/llgo${CMAKE_EXECUTABLE_SUFFIX}
-              ${CMAKE_BINARY_DIR}/bin/llgoi${CMAKE_EXECUTABLE_SUFFIX}
-              ${CMAKE_BINARY_DIR}/bin/llgo-go${CMAKE_EXECUTABLE_SUFFIX}
-        DESTINATION bin
-        PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
-                    GROUP_READ GROUP_EXECUTE
-                    WORLD_READ WORLD_EXECUTE)
-
-function(add_clobber_steps name)
-  ExternalProject_Add_Step(${name} force-reconfigure
-    DEPENDERS configure
-    ALWAYS 1
-    )
-
-  ExternalProject_Add_Step(${name} clobber
-    COMMAND ${CMAKE_COMMAND} -E remove_directory <BINARY_DIR>
-    COMMAND ${CMAKE_COMMAND} -E make_directory <BINARY_DIR>
-    COMMENT "Clobbering ${name} build directory..."
-    DEPENDERS configure
-    DEPENDS ${ARGN}
-    )
-endfunction()
-
-processorcount(PROCESSOR_COUNT)
-
-function(add_libgo_variant suffix cflags gocflags deps exclude_from_all)
-  externalproject_add(libbacktrace${suffix}
-    DEPENDS clang ${deps}
-    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libbacktrace
-    BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${suffix}/libbacktrace
-    CONFIGURE_COMMAND <SOURCE_DIR>/configure --disable-multilib --enable-host-shared "CC=${CMAKE_BINARY_DIR}/bin/clang ${cflags}"
-    BUILD_COMMAND make -j${PROCESSOR_COUNT}
-    INSTALL_COMMAND ""
-    LOG_CONFIGURE 1
-    LOG_BUILD 1
-  )
-  set_property(TARGET libbacktrace${suffix}
-               PROPERTY EXCLUDE_FROM_ALL ${exclude_from_all})
-
-  add_clobber_steps(libbacktrace${suffix} clang ${deps})
-
-  externalproject_add(libffi${suffix}
-    DEPENDS clang ${deps}
-    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libffi
-    BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${suffix}/libffi
-    CONFIGURE_COMMAND <SOURCE_DIR>/configure --disable-multilib "CC=${CMAKE_BINARY_DIR}/bin/clang ${cflags}"
-    BUILD_COMMAND make -j${PROCESSOR_COUNT}
-    INSTALL_COMMAND ""
-    LOG_CONFIGURE 1
-    LOG_BUILD 1
-  )
-  set_property(TARGET libffi${suffix}
-               PROPERTY EXCLUDE_FROM_ALL ${exclude_from_all})
-
-  add_clobber_steps(libffi${suffix} clang ${deps})
-
-  externalproject_add(libgo${suffix}
-    DEPENDS clang llgo cc-wrapper libbacktrace${suffix} libffi${suffix} ${deps}
-    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/gofrontend/libgo
-    BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${suffix}/libgo
-    INSTALL_DIR ${CMAKE_BINARY_DIR}
-    CONFIGURE_COMMAND <SOURCE_DIR>/configure --disable-multilib --without-libatomic --prefix=<INSTALL_DIR> "CC=env REAL_CC=${CMAKE_BINARY_DIR}/bin/clang@SPACE@${cflags} ${CMAKE_BINARY_DIR}/bin/cc-wrapper" "GOC=${CMAKE_BINARY_DIR}/bin/llgo -no-prefix -fcompilerrt-prefix=${CMAKE_BINARY_DIR} ${gocflags}"
-    BUILD_COMMAND make -j${PROCESSOR_COUNT}
-    LOG_CONFIGURE 1
-    LOG_BUILD 1
-    LOG_INSTALL 1
-  )
-  set_property(TARGET libgo${suffix}
-               PROPERTY EXCLUDE_FROM_ALL ${exclude_from_all})
-
-  add_clobber_steps(libgo${suffix} clang
-    ${CMAKE_BINARY_DIR}/bin/llgo${CMAKE_EXECUTABLE_SUFFIX}
-    ${CMAKE_BINARY_DIR}/bin/cc-wrapper${CMAKE_EXECUTABLE_SUFFIX})
-endfunction()
-
-add_libgo_variant("" "" "" "" FALSE)
-
-if(TARGET asan)
-  add_libgo_variant("_asan" "-fsanitize=address" "-fsanitize=address" asan TRUE)
-endif()
-
-if(TARGET tsan)
-  add_libgo_variant("_tsan" "-fsanitize=thread" "-fsanitize=thread" tsan TRUE)
-endif()
-
-if(TARGET msan)
-  add_libgo_variant("_msan" "-fsanitize=memory" "-fsanitize=memory" msan TRUE)
-endif()
-
-if(TARGET dfsan)
-  add_libgo_variant("_dfsan" "-fsanitize=dataflow" "-fsanitize=dataflow" dfsan TRUE)
-endif()
-
-set(LLGO_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
-
-install(FILES ${LLGO_LIBRARY_DIR}/libgo-llgo.a
-              ${LLGO_LIBRARY_DIR}/libgo-llgo.so
-              ${LLGO_LIBRARY_DIR}/libgo-llgo.so.8
-              ${LLGO_LIBRARY_DIR}/libgo-llgo.so.8.0.0
-              ${LLGO_LIBRARY_DIR}/libgobegin-llgo.a
-        DESTINATION lib${LLVM_LIBDIR_SUFFIX})
-
-install(DIRECTORY ${LLGO_LIBRARY_DIR}/go
-        DESTINATION lib${LLVM_LIBDIR_SUFFIX})
-
-add_custom_target(check-libgo
-  COMMAND make -C ${CMAKE_CURRENT_BINARY_DIR}/libgo -j${PROCESSOR_COUNT} check
-  DEPENDS libgo
-  ${cmake_3_2_USES_TERMINAL}
-  COMMENT "Running libgo tests")
-
-add_custom_target(check-llgo-bootstrap
-  COMMAND strip -R .note.gnu.build-id -o ${CMAKE_CURRENT_BINARY_DIR}/llgo-stage2.stripped
-          ${CMAKE_BINARY_DIR}/bin/llgo-stage2${CMAKE_EXECUTABLE_SUFFIX}
-  COMMAND strip -R .note.gnu.build-id -o ${CMAKE_CURRENT_BINARY_DIR}/llgo-stage3.stripped
-          ${CMAKE_BINARY_DIR}/bin/llgo-stage3${CMAKE_EXECUTABLE_SUFFIX}
-  COMMAND cmp ${CMAKE_CURRENT_BINARY_DIR}/llgo-stage2.stripped
-          ${CMAKE_CURRENT_BINARY_DIR}/llgo-stage3.stripped
-  DEPENDS llgo-stage2 llgo-stage3
-  COMMENT "Checking llgo bootstrap")
-
-add_subdirectory(test)
diff --git a/LICENSE.TXT b/LICENSE.TXT
deleted file mode 100644
index 2d94553..0000000
--- a/LICENSE.TXT
+++ /dev/null
@@ -1,308 +0,0 @@
-==============================================================================
-The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
-==============================================================================
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-    1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-    2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-    3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-    4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-    5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-    6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-    7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-    8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-    9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-    END OF TERMS AND CONDITIONS
-
-    APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-    Copyright [yyyy] [name of copyright owner]
-
-    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.
-
-
----- LLVM Exceptions to the Apache 2.0 License ----
-
-As an exception, if, as a result of your compiling your source code, portions
-of this Software are embedded into an Object form of such source code, you
-may redistribute such embedded portions in such Object form without complying
-with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
-
-In addition, if you combine or link compiled forms of this Software with
-software that is licensed under the GPLv2 ("Combined Software") and if a
-court of competent jurisdiction determines that the patent provision (Section
-3), the indemnity provision (Section 9) or other Section of the License
-conflicts with the conditions of the GPLv2, you may retroactively and
-prospectively choose to deem waived or otherwise exclude such Section(s) of
-the License, but only in their entirety and only with respect to the Combined
-Software.
-
-==============================================================================
-Software from third parties included in the LLVM Project:
-==============================================================================
-The LLVM Project contains third party software which is under different license
-terms. All such code will be identified clearly using at least one of two
-mechanisms:
-1) It will be in a separate directory tree with its own `LICENSE.txt` or
-   `LICENSE` file at the top containing the specific license and restrictions
-   which apply to that software, or
-2) It will contain specific license and restriction terms at the top of every
-   file.
-
-==============================================================================
-Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):
-==============================================================================
-The llgo distribution, excluding the contents of the 'include' and any third
-party software is licensed under the University of Illinois "BSD-Like" license.
-
-The contents of the 'include' directory are dual licensed under both the
-University of Illinois "BSD-Like" license and the MIT license.  As a user of
-this code you may choose to use it under either license.  As a contributor,
-you agree to allow your code to be used under both.
-
-Full text of the relevant licenses is included below.
-
-==============================================================================
-
-University of Illinois/NCSA
-Open Source License
-
-Copyright (c) 2007-2019 University of Illinois at Urbana-Champaign.
-All rights reserved.
-
-Developed by:
-
-    LLVM Team
-
-    http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-    * Redistributions of source code must retain the above copyright notice,
-      this list of conditions and the following disclaimers.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-      this list of conditions and the following disclaimers in the
-      documentation and/or other materials provided with the distribution.
-
-    * Neither the names of the LLVM Team, University of Illinois at
-      Urbana-Champaign, nor the names of its contributors may be used to
-      endorse or promote products derived from this Software without specific
-      prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
-
-==============================================================================
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/README.TXT b/README.TXT
deleted file mode 100644
index c48e855..0000000
--- a/README.TXT
+++ /dev/null
@@ -1,74 +0,0 @@
-llgo
-====
-
-llgo is a Go (http://golang.org) frontend for LLVM, written in Go.
-
-llgo is under active development. It compiles and passes most of the
-standard library test suite and a substantial portion of the gc test suite,
-but there are some corner cases that are known not to be handled correctly
-yet. Nevertheless it can compile modestly substantial programs (including
-itself; it is self hosting on x86-64 Linux).
-
-Mailing list: https://groups.google.com/d/forum/llgo-dev
-
-Supported platforms
--------------------
-
-llgo is currently only supported on the x86-64 Linux platform. Contributions
-that add support for other platforms are welcome.
-
-There are two components which would need to be ported to new platforms: the
-compiler and the runtime library. The compiler has little platform-specific
-code; the most significant is in irgen/cabi.go. The main limiting factor
-for new platforms is the runtime library in third_party/gofrontend/libgo,
-which inherits some support for other platforms from the gc compiler's
-runtime library, but this support tends to be incomplete.
-
-Installation
-------------
-
-llgo requires:
-* Go 1.3 or later.
-* CMake 2.8.8 or later (to build LLVM).
-* A modern C++ toolchain (to build LLVM).
-  http://llvm.org/docs/GettingStarted.html#getting-a-modern-host-c-toolchain
-
-Note that Ubuntu Precise is one Linux distribution which does not package
-a sufficiently new CMake or C++ toolchain.
-
-To build and install llgo:
-
-    # Checkout llvm project.
-    git clone https://github.com/llvm/llvm-project.git
-
-    # Build LLVM, Clang and llgo: (see also http://llvm.org/docs/CMake.html)
-    cd llvm-project
-    mkdir build
-    cd build
-    cmake ../llvm -DLLVM_ENABLE_PROJECTS='clang;llgo' -DCMAKE_INSTALL_PREFIX=/path/to/llvm-inst
-    make install
-
-Running
--------
-
-llgo-go is llgo's version of the "go" command. It has the same command line
-interface as go, and works the same way, but it uses llgo to compile.
-
-llgoi is an interactive REPL for Go. It supports expressions, statements, most
-declarations and imports, including binary imports from the standard library
-and source imports from $GOPATH. See docs/llgoi.rst for more information.
-
-llgo is the compiler binary. It has a command line interface that is intended
-to be compatible to a large extent with gccgo.
-
-Contributing
-------------
-
-Changes to code outside the third_party directory should be contributed in
-the normal way by sending patches to <llvm-commits@lists.llvm.org>.
-
-Changes to code in the third_party directory must first be made in the
-respective upstream project, from which they will be mirrored into the llgo
-repository. See the script update_third_party.sh for the locations of the
-upstream projects and details of how the mirroring works.
-
diff --git a/autoconf/config.sub b/autoconf/config.sub
deleted file mode 100644
index 2583c90..0000000
--- a/autoconf/config.sub
+++ /dev/null
@@ -1,1770 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011 Free Software Foundation, Inc.
-
-timestamp='2011-11-02'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
-Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
-  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
-  kopensolaris*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze)
-		os=
-		basic_machine=$1
-		;;
-	-bluegene*)
-		os=-cnk
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
-	-chorusrdb)
-		os=-chorusrdb
-		basic_machine=$1
-		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-   | aarch64 | aarch64_be \
-   | be32 | be64 \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| fido | fr30 | frv \
-	| hexagon \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| le32 | le64 \
-	| lm32 \
-	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep | metag \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64octeon | mips64octeonel \
-	| mips64orion | mips64orionel \
-	| mips64r5900 | mips64r5900el \
-	| mips64vr | mips64vrel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| moxie \
-	| mt \
-	| msp430 \
-	| nds32 | nds32le | nds32be \
-	| nios | nios2 \
-	| ns16k | ns32k \
-	| open8 \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle \
-	| pyramid \
-	| rx \
-	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu \
-	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
-	| ubicom32 \
-	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
-	| we32k \
-	| x86 | xc16x | xstormy16 | xtensa \
-	| z8k | z80)
-		basic_machine=$basic_machine-unknown
-		;;
-	c54x)
-		basic_machine=tic54x-unknown
-		;;
-	c55x)
-		basic_machine=tic55x-unknown
-		;;
-	c6x)
-		basic_machine=tic6x-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
-		# Motorola 68HC11/12.
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	strongarm | thumb | xscale)
-		basic_machine=arm-unknown
-		;;
-
-	xscaleeb)
-		basic_machine=armeb-unknown
-		;;
-
-	xscaleel)
-		basic_machine=armel-unknown
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-   | aarch64-* | aarch64_be-* \
-	| avr-* | avr32-* \
-	| be32-* | be64-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hexagon-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| le32-* | le64-* \
-	| lm32-* \
-	| m32c-* | m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64octeon-* | mips64octeonel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64r5900-* | mips64r5900el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nds32-* | nds32le-* | nds32be-* \
-	| nios-* | nios2-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| open8-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
-	| pyramid-* \
-	| romp-* | rs6000-* | rx-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
-	| tahoe-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tile*-* \
-	| tron-* \
-	| ubicom32-* \
-	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
-	| vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* \
-	| xstormy16-* | xtensa*-* \
-	| ymp-* \
-	| z8k-* | z80-*)
-		;;
-	# Recognize the basic CPU types without company name, with glob match.
-	xtensa*)
-		basic_machine=$basic_machine-unknown
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aros)
-		basic_machine=i386-pc
-		os=-aros
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	blackfin)
-		basic_machine=bfin-unknown
-		os=-linux
-		;;
-	blackfin-*)
-		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	bluegene*)
-		basic_machine=powerpc-ibm
-		os=-cnk
-		;;
-	c54x-*)
-		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c55x-*)
-		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c6x-*)
-		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-	cegcc)
-		basic_machine=arm-unknown
-		os=-cegcc
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16 | cr16-*)
-		basic_machine=cr16-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	dicos)
-		basic_machine=i686-pc
-		os=-dicos
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m68knommu)
-		basic_machine=m68k-unknown
-		os=-linux
-		;;
-	m68knommu-*)
-		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-	microblaze)
-		basic_machine=microblaze-xilinx
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	mingw32ce)
-		basic_machine=arm-unknown
-		os=-mingw32ce
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	nacl)
-		basic_machine=le32-unknown
-		os=-nacl
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	neo-tandem)
-		basic_machine=neo-tandem
-		;;
-	nse-tandem)
-		basic_machine=nse-tandem
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	parisc)
-		basic_machine=hppa-unknown
-		os=-linux
-		;;
-	parisc-*)
-		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
-		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc | ppcbe)	basic_machine=powerpc-unknown
-		;;
-	ppc-* | ppcbe-*)
-		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sde)
-		basic_machine=mipsisa32-sde
-		os=-elf
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh5el)
-		basic_machine=sh5le-unknown
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	strongarm-* | thumb-*)
-		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-	tile*)
-		basic_machine=$basic_machine-unknown
-		os=-linux-gnu
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	xscale-* | xscalee[bl]-*)
-		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	z80-*-coff)
-		basic_machine=z80-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-	# First match some system type aliases
-	# that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-	-auroraux)
-		os=-auroraux
-		;;
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-android* \
-	      | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -bitrig*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-	-os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-	-tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-dicos*)
-		os=-dicos
-		;;
-	-nacl*)
-		;;
-	-ps4)
-		;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-	score-*)
-		os=-elf
-		;;
-	spu-*)
-		os=-elf
-		;;
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-	c4x-* | tic4x-*)
-		os=-coff
-		;;
-	tic54x-*)
-		os=-coff
-		;;
-	tic55x-*)
-		os=-coff
-		;;
-	tic6x-*)
-		os=-coff
-		;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-	mep-*)
-		os=-elf
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-cnk*|-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/build/context.go b/build/context.go
deleted file mode 100644
index f0847a2..0000000
--- a/build/context.go
+++ /dev/null
@@ -1,94 +0,0 @@
-//===- context.go - Build context utilities for llgo ----------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// Build context utilities for llgo.
-//
-//===----------------------------------------------------------------------===//
-
-package build
-
-import (
-	"errors"
-	"go/build"
-	"regexp"
-	"strings"
-)
-
-type Context struct {
-	build.Context
-
-	// LLVM triple
-	Triple string
-}
-
-// ContextFromTriple returns a new go/build.Context with GOOS and GOARCH
-// configured from the given triple.
-func ContextFromTriple(triple string) (*Context, error) {
-	goos, goarch, err := parseTriple(triple)
-	if err != nil {
-		return nil, err
-	}
-	ctx := &Context{Context: build.Default, Triple: triple}
-	ctx.GOOS = goos
-	ctx.GOARCH = goarch
-	ctx.BuildTags = append(ctx.BuildTags, "llgo")
-	if triple == "pnacl" {
-		ctx.BuildTags = append(ctx.BuildTags, "pnacl")
-	}
-	return ctx, nil
-}
-
-func parseTriple(triple string) (goos string, goarch string, err error) {
-	if strings.ToLower(triple) == "pnacl" {
-		return "nacl", "le32", nil
-	}
-
-	type REs struct{ re, out string }
-	// reference: http://llvm.org/docs/doxygen/html/Triple_8cpp_source.html
-	goarchREs := []REs{
-		{"amd64|x86_64", "amd64"},
-		{"i[3-9]86", "386"},
-		{"xscale|((arm|thumb)(v.*)?)", "arm"},
-	}
-	goosREs := []REs{
-		{"linux.*", "linux"},
-		{"(darwin|macosx|ios).*", "darwin"},
-		{"k?freebsd.*", "freebsd"},
-		{"netbsd.*", "netbsd"},
-		{"openbsd.*", "openbsd"},
-	}
-	match := func(list []REs, s string) string {
-		for _, t := range list {
-			if matched, _ := regexp.MatchString(t.re, s); matched {
-				return t.out
-			}
-		}
-		return ""
-	}
-
-	s := strings.Split(triple, "-")
-	switch l := len(s); l {
-	default:
-		return "", "", errors.New("triple should be made up of 2, 3, or 4 parts.")
-	case 2, 3: // ARCHITECTURE-(VENDOR-)OPERATING_SYSTEM
-		goarch = s[0]
-		goos = s[l-1]
-	case 4: // ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT
-		goarch = s[0]
-		goos = s[2]
-	}
-	goarch = match(goarchREs, goarch)
-	if goarch == "" {
-		return "", "", errors.New("unknown architecture in triple")
-	}
-	goos = match(goosREs, goos)
-	if goos == "" {
-		return "", "", errors.New("unknown OS in triple")
-	}
-	return goos, goarch, nil
-}
diff --git a/buildslave-config.yaml b/buildslave-config.yaml
deleted file mode 100644
index 76e2403..0000000
--- a/buildslave-config.yaml
+++ /dev/null
@@ -1,31 +0,0 @@
-# This file contains llgo's configuration for the buildbot-slave Juju charm.
-# 
-# The slave is deployed with the following command in a Juju environment:
-#     juju deploy cs:~axwalk/buildbot-slave --config buildslave-config.yaml
-#
-# The charm generates a random password on first run, in the file
-# /srv/buildbot/password. If the password is regenerated, it must
-# be updated in the buildbot master.
-#
-buildbot-slave:
-  name: llgo-builder
-  master: lab.llvm.org:9990
-  admin-info: Andrew Wilkins <axwalk@gmail.com>
-  apt-packages: subversion git cmake gcc g++ gccgo python-dev
-  pip-versions: sqlalchemy==0.7.9 buildbot==0.8.5 buildbot_slave==0.8.5 twisted==12.0.0
-  post-install: |
-      #!/bin/bash
-      #
-      # Fetch, build and install Ninja.
-      rm -fr /tmp/ninja
-      cd /tmp && git clone git://github.com/martine/ninja.git
-      cd /tmp/ninja && ./configure.py --bootstrap
-      cp /tmp/ninja/ninja /usr/local/bin
-      # Fetch and unpack Go.
-      cd /tmp && wget https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz
-      sha1sum <<EOF
-      5020af94b52b65cc9b6f11d50a67e4bae07b0aff go1.4.2.linux-amd64.tar.gz
-      EOF
-      cd /usr/local && tar xzf /tmp/go1.4.2.linux-amd64.tar.gz
-      ln -f -s /usr/local/go/bin/go /usr/local/bin/go
-
diff --git a/cmd/cc-wrapper/main.go b/cmd/cc-wrapper/main.go
deleted file mode 100644
index b01ee63..0000000
--- a/cmd/cc-wrapper/main.go
+++ /dev/null
@@ -1,70 +0,0 @@
-//===- main.go - Clang compiler wrapper for building libgo ----------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This is a wrapper for Clang that passes invocations with -fdump-go-spec to
-// GCC, and rewrites -fplan9-extensions to -fms-extensions. It is intended to
-// go away once libgo's build no longer uses these flags.
-//
-//===----------------------------------------------------------------------===//
-
-package main
-
-import (
-	"fmt"
-	"os"
-	"os/exec"
-	"strings"
-)
-
-func runproc(name string, argv []string) {
-	path, err := exec.LookPath(name)
-	if err != nil {
-		fmt.Fprintf(os.Stderr, "cc-wrapper: could not find %s: %v\n", name, err)
-		os.Exit(1)
-	}
-
-	proc, err := os.StartProcess(path, append([]string{name}, argv...), &os.ProcAttr{
-		Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
-	})
-	if err != nil {
-		fmt.Fprintf(os.Stderr, "cc-wrapper: could not start %s: %v\n", name, err)
-		os.Exit(1)
-	}
-
-	state, err := proc.Wait()
-	if err != nil {
-		fmt.Fprintf(os.Stderr, "cc-wrapper: could not wait for %s: %v\n", name, err)
-		os.Exit(1)
-	}
-
-	if state.Success() {
-		os.Exit(0)
-	} else {
-		os.Exit(1)
-	}
-}
-
-func main() {
-	newargs := make([]string, len(os.Args)-1)
-	for i, arg := range os.Args[1:] {
-		switch {
-		case strings.HasPrefix(arg, "-fdump-go-spec"):
-			runproc("gcc", os.Args[1:])
-
-		case arg == "-fplan9-extensions":
-			newargs[i] = "-fms-extensions"
-			newargs = append(newargs, "-Wno-microsoft")
-
-		default:
-			newargs[i] = arg
-		}
-	}
-
-	ccargs := strings.Split(os.Getenv("REAL_CC"), "@SPACE@")
-	runproc(ccargs[0], append(ccargs[1:], newargs...))
-}
diff --git a/cmd/cgo/zdefaultcc.go b/cmd/cgo/zdefaultcc.go
deleted file mode 100644
index 87bdd46..0000000
--- a/cmd/cgo/zdefaultcc.go
+++ /dev/null
@@ -1,45 +0,0 @@
-//===- zdefaultcc.go - default compiler locations -------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file provides a default location for cc.
-//
-//===----------------------------------------------------------------------===//
-
-package main
-
-import (
-	"path/filepath"
-	"os"
-	"os/exec"
-)
-
-var defaultCC string
-
-func getInstPrefix() (string, error) {
-	path, err := exec.LookPath(os.Args[0])
-	if err != nil {
-		return "", err
-	}
-
-	path, err = filepath.EvalSymlinks(path)
-	if err != nil {
-		return "", err
-	}
-
-	prefix := filepath.Join(path, "..", "..", "..", "..")
-	return prefix, nil
-}
-
-func init() {
-	prefix, err := getInstPrefix()
-	if err != nil {
-		panic(err.Error())
-	}
-
-	defaultCC = filepath.Join(prefix, "bin", "clang")
-}
diff --git a/cmd/gllgo/config.h.cmake b/cmd/gllgo/config.h.cmake
deleted file mode 100644
index 4dc0fb9..0000000
--- a/cmd/gllgo/config.h.cmake
+++ /dev/null
@@ -1,11 +0,0 @@
-/* This generated file is for internal use. Do not include it from headers. */
-
-#ifdef CONFIG_H
-#error config.h can only be included once
-#else
-#define CONFIG_H
-
-/* Multilib suffix for libdir. */
-#define LLVM_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}"
-
-#endif
diff --git a/cmd/gllgo/gllgo.go b/cmd/gllgo/gllgo.go
deleted file mode 100644
index cef90c0..0000000
--- a/cmd/gllgo/gllgo.go
+++ /dev/null
@@ -1,837 +0,0 @@
-//===- gllgo.go - gccgo-like driver for llgo ------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This is llgo's driver. It has a gccgo-like interface in order to easily
-// interoperate with the "go" command and the libgo build system.
-//
-//===----------------------------------------------------------------------===//
-
-package main
-
-/*
-#include "config.h"
-*/
-import "C"
-
-import (
-	"errors"
-	"fmt"
-	"go/scanner"
-	"go/token"
-	"io/ioutil"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-
-	"llvm.org/llgo/debug"
-	"llvm.org/llgo/driver"
-	"llvm.org/llgo/irgen"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-const LibDirSuffix = C.LLVM_LIBDIR_SUFFIX
-
-func report(err error) {
-	if list, ok := err.(scanner.ErrorList); ok {
-		for _, e := range list {
-			fmt.Fprintf(os.Stderr, "%s\n", e)
-		}
-	} else if err != nil {
-		fmt.Fprintf(os.Stderr, "gllgo: error: %s\n", err)
-	}
-}
-
-func llvmVersion() string {
-	return strings.Replace(llvm.Version, "svn", "", 1)
-}
-
-func displayVersion() {
-	fmt.Printf("llgo version %s (%s)\n\n", llvmVersion(), irgen.GoVersion())
-	os.Exit(0)
-}
-
-func initCompiler(opts *driverOptions) (*irgen.Compiler, error) {
-	importPaths := make([]string, len(opts.importPaths)+len(opts.libPaths))
-	copy(importPaths, opts.importPaths)
-	copy(importPaths[len(opts.importPaths):], opts.libPaths)
-	if opts.prefix != "" {
-		importPaths = append(importPaths, filepath.Join(opts.prefix, "lib"+LibDirSuffix, "go", "llgo-"+llvmVersion()))
-	}
-	copts := irgen.CompilerOptions{
-		TargetTriple:       opts.triple,
-		GenerateDebug:      opts.generateDebug,
-		DebugPrefixMaps:    opts.debugPrefixMaps,
-		DumpSSA:            opts.dumpSSA,
-		GccgoPath:          opts.gccgoPath,
-		GccgoABI:           opts.gccgoPath != "",
-		ImportPaths:        importPaths,
-		SanitizerAttribute: opts.sanitizer.getAttribute(),
-	}
-	if opts.dumpTrace {
-		copts.Logger = log.New(os.Stderr, "", 0)
-	}
-	return irgen.NewCompiler(copts)
-}
-
-type actionKind int
-
-const (
-	actionAssemble = actionKind(iota)
-	actionCompile
-	actionLink
-	actionPrint
-)
-
-type action struct {
-	kind   actionKind
-	inputs []string
-}
-
-type sanitizerOptions struct {
-	blacklist string
-	crtPrefix string
-
-	address, thread, memory, dataflow bool
-}
-
-func (san *sanitizerOptions) resourcePath() string {
-	return filepath.Join(san.crtPrefix, "lib"+LibDirSuffix, "clang", llvmVersion())
-}
-
-func (san *sanitizerOptions) isPIEDefault() bool {
-	return san.thread || san.memory || san.dataflow
-}
-
-func (san *sanitizerOptions) addPasses(mpm, fpm llvm.PassManager) {
-	switch {
-	case san.address:
-		mpm.AddAddressSanitizerModulePass()
-		fpm.AddAddressSanitizerFunctionPass()
-	case san.thread:
-		mpm.AddThreadSanitizerPass()
-	case san.memory:
-		mpm.AddMemorySanitizerLegacyPassPass()
-	case san.dataflow:
-		blacklist := san.blacklist
-		if blacklist == "" {
-			blacklist = filepath.Join(san.resourcePath(), "dfsan_abilist.txt")
-		}
-		mpm.AddDataFlowSanitizerPass([]string{blacklist})
-	}
-}
-
-func (san *sanitizerOptions) libPath(triple, sanitizerName string) string {
-	s := strings.Split(triple, "-")
-	return filepath.Join(san.resourcePath(), "lib", s[2], "libclang_rt."+sanitizerName+"-"+s[0]+".a")
-}
-
-func (san *sanitizerOptions) addLibsForSanitizer(flags []string, triple, sanitizerName string) []string {
-	return append(flags, san.libPath(triple, sanitizerName),
-		"-Wl,--no-as-needed", "-lpthread", "-lrt", "-lm", "-ldl")
-}
-
-func (san *sanitizerOptions) addLibs(triple string, flags []string) []string {
-	switch {
-	case san.address:
-		flags = san.addLibsForSanitizer(flags, triple, "asan")
-	case san.thread:
-		flags = san.addLibsForSanitizer(flags, triple, "tsan")
-	case san.memory:
-		flags = san.addLibsForSanitizer(flags, triple, "msan")
-	case san.dataflow:
-		flags = san.addLibsForSanitizer(flags, triple, "dfsan")
-	}
-
-	return flags
-}
-
-func (san *sanitizerOptions) getAttribute() llvm.Attribute {
-	var attrKind uint
-
-	switch {
-	case san.address:
-		attrKind = llvm.AttributeKindID("sanitize_address")
-	case san.thread:
-		attrKind = llvm.AttributeKindID("sanitize_thread")
-	case san.memory:
-		attrKind = llvm.AttributeKindID("sanitize_memory")
-	default:
-		attrKind = 0
-	}
-
-	ctx := llvm.GlobalContext()
-	return ctx.CreateEnumAttribute(attrKind, 0)
-}
-
-type driverOptions struct {
-	actions []action
-	output  string
-
-	bprefix         string
-	debugPrefixMaps []debug.PrefixMap
-	dumpSSA         bool
-	dumpTrace       bool
-	emitIR          bool
-	gccgoPath       string
-	generateDebug   bool
-	importPaths     []string
-	libPaths        []string
-	llvmArgs        []string
-	lto             bool
-	optLevel        int
-	pic             bool
-	pieLink         bool
-	pkgpath         string
-	plugins         []string
-	prefix          string
-	sanitizer       sanitizerOptions
-	sizeLevel       int
-	staticLibgcc    bool
-	staticLibgo     bool
-	staticLink      bool
-	triple          string
-}
-
-func getInstPrefix() (string, error) {
-	path, err := exec.LookPath(os.Args[0])
-	if err != nil {
-		return "", err
-	}
-
-	path, err = filepath.EvalSymlinks(path)
-	if err != nil {
-		return "", err
-	}
-
-	prefix := filepath.Join(path, "..", "..")
-	return prefix, nil
-}
-
-func parseArguments(args []string) (opts driverOptions, err error) {
-	var goInputs, otherInputs []string
-	hasOtherNonFlagInputs := false
-	noPrefix := false
-	actionKind := actionLink
-	opts.triple = llvm.DefaultTargetTriple()
-
-	for len(args) > 0 {
-		consumedArgs := 1
-
-		switch {
-		case !strings.HasPrefix(args[0], "-"):
-			if strings.HasSuffix(args[0], ".go") {
-				goInputs = append(goInputs, args[0])
-			} else {
-				hasOtherNonFlagInputs = true
-				otherInputs = append(otherInputs, args[0])
-			}
-
-		case strings.HasPrefix(args[0], "-Wl,"), strings.HasPrefix(args[0], "-l"), strings.HasPrefix(args[0], "--sysroot="):
-			// TODO(pcc): Handle these correctly.
-			otherInputs = append(otherInputs, args[0])
-
-		case args[0] == "-B":
-			if len(args) == 1 {
-				return opts, errors.New("missing argument after '-B'")
-			}
-			opts.bprefix = args[1]
-			consumedArgs = 2
-
-		case args[0] == "-D":
-			if len(args) == 1 {
-				return opts, errors.New("missing argument after '-D'")
-			}
-			otherInputs = append(otherInputs, args[0], args[1])
-			consumedArgs = 2
-
-		case strings.HasPrefix(args[0], "-D"):
-			otherInputs = append(otherInputs, args[0])
-
-		case args[0] == "-I":
-			if len(args) == 1 {
-				return opts, errors.New("missing argument after '-I'")
-			}
-			opts.importPaths = append(opts.importPaths, args[1])
-			consumedArgs = 2
-
-		case strings.HasPrefix(args[0], "-I"):
-			opts.importPaths = append(opts.importPaths, args[0][2:])
-
-		case args[0] == "-isystem":
-			if len(args) == 1 {
-				return opts, errors.New("missing argument after '-isystem'")
-			}
-			otherInputs = append(otherInputs, args[0], args[1])
-			consumedArgs = 2
-
-		case args[0] == "-L":
-			if len(args) == 1 {
-				return opts, errors.New("missing argument after '-L'")
-			}
-			opts.libPaths = append(opts.libPaths, args[1])
-			consumedArgs = 2
-
-		case strings.HasPrefix(args[0], "-L"):
-			opts.libPaths = append(opts.libPaths, args[0][2:])
-
-		case args[0] == "-O0":
-			opts.optLevel = 0
-
-		case args[0] == "-O1", args[0] == "-O":
-			opts.optLevel = 1
-
-		case args[0] == "-O2":
-			opts.optLevel = 2
-
-		case args[0] == "-Os":
-			opts.optLevel = 2
-			opts.sizeLevel = 1
-
-		case args[0] == "-O3":
-			opts.optLevel = 3
-
-		case args[0] == "-S":
-			actionKind = actionAssemble
-
-		case args[0] == "-c":
-			actionKind = actionCompile
-
-		case strings.HasPrefix(args[0], "-fcompilerrt-prefix="):
-			opts.sanitizer.crtPrefix = args[0][20:]
-
-		case strings.HasPrefix(args[0], "-fdebug-prefix-map="):
-			split := strings.SplitN(args[0][19:], "=", 2)
-			if len(split) < 2 {
-				return opts, fmt.Errorf("argument '%s' must be of form '-fdebug-prefix-map=SOURCE=REPLACEMENT'", args[0])
-			}
-			opts.debugPrefixMaps = append(opts.debugPrefixMaps, debug.PrefixMap{split[0], split[1]})
-
-		case args[0] == "-fdump-ssa":
-			opts.dumpSSA = true
-
-		case args[0] == "-fdump-trace":
-			opts.dumpTrace = true
-
-		case strings.HasPrefix(args[0], "-fgccgo-path="):
-			opts.gccgoPath = args[0][13:]
-
-		case strings.HasPrefix(args[0], "-fgo-pkgpath="):
-			opts.pkgpath = args[0][13:]
-
-		case strings.HasPrefix(args[0], "-fgo-relative-import-path="):
-			// TODO(pcc): Handle this.
-
-		case strings.HasPrefix(args[0], "-fstack-protector"):
-			// TODO(axw) set ssp function attributes. This can be useful
-			// even for Go, if it interfaces with code written in a non-
-			// memory safe language (e.g. via cgo).
-
-		case strings.HasPrefix(args[0], "-W"):
-			// Go doesn't do warnings. Ignore.
-
-		case args[0] == "-fload-plugin":
-			if len(args) == 1 {
-				return opts, errors.New("missing argument after '-fload-plugin'")
-			}
-			opts.plugins = append(opts.plugins, args[1])
-			consumedArgs = 2
-
-		case args[0] == "-fno-toplevel-reorder":
-			// This is a GCC-specific code generation option. Ignore.
-
-		case args[0] == "-emit-llvm":
-			opts.emitIR = true
-
-		case args[0] == "-flto":
-			opts.lto = true
-
-		case args[0] == "-fPIC":
-			opts.pic = true
-
-		case strings.HasPrefix(args[0], "-fsanitize-blacklist="):
-			opts.sanitizer.blacklist = args[0][21:]
-
-		// TODO(pcc): Enforce mutual exclusion between sanitizers.
-
-		case args[0] == "-fsanitize=address":
-			opts.sanitizer.address = true
-
-		case args[0] == "-fsanitize=thread":
-			opts.sanitizer.thread = true
-
-		case args[0] == "-fsanitize=memory":
-			opts.sanitizer.memory = true
-
-		case args[0] == "-fsanitize=dataflow":
-			opts.sanitizer.dataflow = true
-
-		case args[0] == "-g":
-			opts.generateDebug = true
-
-		case args[0] == "-mllvm":
-			if len(args) == 1 {
-				return opts, errors.New("missing argument after '-mllvm'")
-			}
-			opts.llvmArgs = append(opts.llvmArgs, args[1])
-			consumedArgs = 2
-
-		case strings.HasPrefix(args[0], "-m"), args[0] == "-funsafe-math-optimizations", args[0] == "-ffp-contract=off":
-			// TODO(pcc): Handle code generation options.
-
-		case args[0] == "-no-prefix":
-			noPrefix = true
-
-		case args[0] == "-o":
-			if len(args) == 1 {
-				return opts, errors.New("missing argument after '-o'")
-			}
-			opts.output = args[1]
-			consumedArgs = 2
-
-		case args[0] == "-pie":
-			opts.pieLink = true
-
-		case args[0] == "-dumpversion",
-			args[0] == "-print-libgcc-file-name",
-			args[0] == "-print-multi-os-directory",
-			args[0] == "--version":
-			actionKind = actionPrint
-			opts.output = args[0]
-
-		case args[0] == "-static":
-			opts.staticLink = true
-
-		case args[0] == "-static-libgcc":
-			opts.staticLibgcc = true
-
-		case args[0] == "-static-libgo":
-			opts.staticLibgo = true
-
-		default:
-			return opts, fmt.Errorf("unrecognized command line option '%s'", args[0])
-		}
-
-		args = args[consumedArgs:]
-	}
-
-	if actionKind != actionPrint && len(goInputs) == 0 && !hasOtherNonFlagInputs {
-		return opts, errors.New("no input files")
-	}
-
-	if !noPrefix {
-		opts.prefix, err = getInstPrefix()
-		if err != nil {
-			return opts, err
-		}
-	}
-
-	if opts.sanitizer.crtPrefix == "" {
-		opts.sanitizer.crtPrefix = opts.prefix
-	}
-
-	if opts.sanitizer.isPIEDefault() {
-		// This should really only be turning on -fPIE, but this isn't
-		// easy to do from Go, and -fPIC is a superset of it anyway.
-		opts.pic = true
-		opts.pieLink = true
-	}
-
-	switch actionKind {
-	case actionLink:
-		if len(goInputs) != 0 {
-			opts.actions = []action{action{actionCompile, goInputs}}
-		}
-		opts.actions = append(opts.actions, action{actionLink, otherInputs})
-
-	case actionCompile, actionAssemble:
-		if len(goInputs) != 0 {
-			opts.actions = []action{action{actionKind, goInputs}}
-		}
-
-	case actionPrint:
-		opts.actions = []action{action{actionKind, nil}}
-	}
-
-	if opts.output == "" && len(opts.actions) != 0 {
-		switch actionKind {
-		case actionCompile, actionAssemble:
-			base := filepath.Base(goInputs[0])
-			base = base[0 : len(base)-3]
-			if actionKind == actionCompile {
-				opts.output = base + ".o"
-			} else {
-				opts.output = base + ".s"
-			}
-
-		case actionLink:
-			opts.output = "a.out"
-		}
-	}
-
-	return opts, nil
-}
-
-func runPasses(opts *driverOptions, tm llvm.TargetMachine, m llvm.Module) {
-	fpm := llvm.NewFunctionPassManagerForModule(m)
-	defer fpm.Dispose()
-
-	mpm := llvm.NewPassManager()
-	defer mpm.Dispose()
-
-	pmb := llvm.NewPassManagerBuilder()
-	defer pmb.Dispose()
-
-	pmb.SetOptLevel(opts.optLevel)
-	pmb.SetSizeLevel(opts.sizeLevel)
-
-	tm.AddAnalysisPasses(mpm)
-	tm.AddAnalysisPasses(fpm)
-
-	mpm.AddVerifierPass()
-	fpm.AddVerifierPass()
-
-	pmb.Populate(mpm)
-	pmb.PopulateFunc(fpm)
-
-	if opts.optLevel == 0 {
-		// Remove references (via the descriptor) to dead functions,
-		// for compatibility with other compilers.
-		mpm.AddGlobalDCEPass()
-	}
-
-	opts.sanitizer.addPasses(mpm, fpm)
-
-	fpm.InitializeFunc()
-	for fn := m.FirstFunction(); !fn.IsNil(); fn = llvm.NextFunction(fn) {
-		fpm.RunFunc(fn)
-	}
-	fpm.FinalizeFunc()
-
-	mpm.Run(m)
-}
-
-func getMetadataSectionInlineAsm(name string) string {
-	// ELF: creates a non-allocated excluded section.
-	return ".section \"" + name + "\", \"e\"\n"
-}
-
-func getDataInlineAsm(data []byte) string {
-	edata := make([]byte, 0, len(data)*4+10)
-
-	edata = append(edata, ".ascii \""...)
-	for i := range data {
-		switch data[i] {
-		case '\000':
-			edata = append(edata, "\\000"...)
-			continue
-		case '\n':
-			edata = append(edata, "\\n"...)
-			continue
-		case '"', '\\':
-			edata = append(edata, '\\')
-		}
-		edata = append(edata, data[i])
-	}
-	edata = append(edata, "\"\n"...)
-	return string(edata)
-}
-
-// Get the lib path to the standard libraries for the given driver options.
-// This is normally 'lib' but can vary for cross compilation, LTO, sanitizers
-// etc.
-func getLibDir(opts *driverOptions) string {
-	lib := "lib" + LibDirSuffix
-	switch {
-	case opts.lto:
-		return filepath.Join(lib, "llvm-lto.0")
-	case opts.sanitizer.address:
-		return filepath.Join(lib, "llvm-asan.0")
-	case opts.sanitizer.thread:
-		return filepath.Join(lib, "llvm-tsan.0")
-	case opts.sanitizer.memory:
-		return filepath.Join(lib, "llvm-msan.0")
-	case opts.sanitizer.dataflow:
-		return filepath.Join(lib, "llvm-dfsan.0")
-	default:
-		return lib
-	}
-}
-
-func performAction(opts *driverOptions, kind actionKind, inputs []string, output string) error {
-	switch kind {
-	case actionPrint:
-		switch opts.output {
-		case "-dumpversion":
-			fmt.Println("llgo-" + llvmVersion())
-			return nil
-		case "-print-libgcc-file-name":
-			cmd := exec.Command(opts.bprefix+"gcc", "-print-libgcc-file-name")
-			out, err := cmd.CombinedOutput()
-			os.Stdout.Write(out)
-			return err
-		case "-print-multi-os-directory":
-			fmt.Println(filepath.Join("..", getLibDir(opts)))
-			return nil
-		case "--version":
-			displayVersion()
-			return nil
-		default:
-			panic("unexpected print command")
-		}
-
-	case actionCompile, actionAssemble:
-		compiler, err := initCompiler(opts)
-		if err != nil {
-			return err
-		}
-
-		fset := token.NewFileSet()
-		files, err := driver.ParseFiles(fset, inputs)
-		if err != nil {
-			return err
-		}
-
-		module, err := compiler.Compile(fset, files, opts.pkgpath)
-		if err != nil {
-			return err
-		}
-
-		defer module.Dispose()
-
-		target, err := llvm.GetTargetFromTriple(opts.triple)
-		if err != nil {
-			return err
-		}
-
-		optLevel := [...]llvm.CodeGenOptLevel{
-			llvm.CodeGenLevelNone,
-			llvm.CodeGenLevelLess,
-			llvm.CodeGenLevelDefault,
-			llvm.CodeGenLevelAggressive,
-		}[opts.optLevel]
-
-		relocMode := llvm.RelocStatic
-		if opts.pic {
-			relocMode = llvm.RelocPIC
-		}
-
-		tm := target.CreateTargetMachine(opts.triple, "", "", optLevel,
-			relocMode, llvm.CodeModelDefault)
-		defer tm.Dispose()
-
-		runPasses(opts, tm, module.Module)
-
-		var file *os.File
-		if output == "-" {
-			file = os.Stdout
-		} else {
-			file, err = os.Create(output)
-			if err != nil {
-				return err
-			}
-			defer file.Close()
-		}
-
-		switch {
-		case !opts.lto && !opts.emitIR:
-			if module.ExportData != nil {
-				asm := getMetadataSectionInlineAsm(".go_export")
-				asm += getDataInlineAsm(module.ExportData)
-				module.Module.SetInlineAsm(asm)
-			}
-
-			fileType := llvm.AssemblyFile
-			if kind == actionCompile {
-				fileType = llvm.ObjectFile
-			}
-			mb, err := tm.EmitToMemoryBuffer(module.Module, fileType)
-			if err != nil {
-				return err
-			}
-			defer mb.Dispose()
-
-			bytes := mb.Bytes()
-			_, err = file.Write(bytes)
-			return err
-
-		case opts.lto:
-			bcmb := llvm.WriteBitcodeToMemoryBuffer(module.Module)
-			defer bcmb.Dispose()
-
-			// This is a bit of a hack. We just want an object file
-			// containing some metadata sections. This might be simpler
-			// if we had bindings for the MC library, but for now we create
-			// a fresh module containing only inline asm that creates the
-			// sections.
-			outmodule := llvm.NewModule("")
-			defer outmodule.Dispose()
-			asm := getMetadataSectionInlineAsm(".llvmbc")
-			asm += getDataInlineAsm(bcmb.Bytes())
-			if module.ExportData != nil {
-				asm += getMetadataSectionInlineAsm(".go_export")
-				asm += getDataInlineAsm(module.ExportData)
-			}
-			outmodule.SetInlineAsm(asm)
-
-			fileType := llvm.AssemblyFile
-			if kind == actionCompile {
-				fileType = llvm.ObjectFile
-			}
-			mb, err := tm.EmitToMemoryBuffer(outmodule, fileType)
-			if err != nil {
-				return err
-			}
-			defer mb.Dispose()
-
-			bytes := mb.Bytes()
-			_, err = file.Write(bytes)
-			return err
-
-		case kind == actionCompile:
-			err := llvm.WriteBitcodeToFile(module.Module, file)
-			return err
-
-		case kind == actionAssemble:
-			_, err := file.WriteString(module.Module.String())
-			return err
-
-		default:
-			panic("unexpected action kind")
-		}
-
-	case actionLink:
-		// TODO(pcc): Teach this to do LTO.
-		args := []string{"-o", output}
-		if opts.pic {
-			args = append(args, "-fPIC")
-		}
-		if opts.pieLink {
-			args = append(args, "-pie")
-		}
-		if opts.staticLink {
-			args = append(args, "-static")
-		}
-		if opts.staticLibgcc {
-			args = append(args, "-static-libgcc")
-		}
-		for _, p := range opts.libPaths {
-			args = append(args, "-L", p)
-		}
-		for _, p := range opts.importPaths {
-			args = append(args, "-I", p)
-		}
-		args = append(args, inputs...)
-		var linkerPath string
-		if opts.gccgoPath == "" {
-			// TODO(pcc): See if we can avoid calling gcc here.
-			// We currently rely on it to find crt*.o and compile
-			// any C source files passed as arguments.
-			linkerPath = opts.bprefix + "gcc"
-
-			if opts.prefix != "" {
-				libdir := filepath.Join(opts.prefix, getLibDir(opts))
-				args = append(args, "-L", libdir)
-				if !opts.staticLibgo {
-					args = append(args, "-Wl,-rpath,"+libdir)
-				}
-			}
-
-			args = append(args, "-lgobegin-llgo")
-			if opts.staticLibgo {
-				args = append(args, "-Wl,-Bstatic", "-lgo-llgo", "-Wl,-Bdynamic", "-lpthread", "-lm")
-			} else {
-				args = append(args, "-lgo-llgo", "-lm")
-			}
-		} else {
-			linkerPath = opts.gccgoPath
-			if opts.staticLibgo {
-				args = append(args, "-static-libgo")
-			}
-		}
-
-		args = opts.sanitizer.addLibs(opts.triple, args)
-
-		cmd := exec.Command(linkerPath, args...)
-		out, err := cmd.CombinedOutput()
-		if err != nil {
-			os.Stderr.Write(out)
-		}
-		return err
-
-	default:
-		panic("unexpected action kind")
-	}
-}
-
-func performActions(opts *driverOptions) error {
-	var extraInput string
-
-	for _, plugin := range opts.plugins {
-		err := llvm.LoadLibraryPermanently(plugin)
-		if err != nil {
-			return err
-		}
-	}
-
-	llvm.ParseCommandLineOptions(append([]string{"llgo"}, opts.llvmArgs...), "llgo (LLVM option parsing)\n")
-
-	for i, action := range opts.actions {
-		var output string
-		if i == len(opts.actions)-1 {
-			output = opts.output
-		} else {
-			tmpfile, err := ioutil.TempFile("", "llgo")
-			if err != nil {
-				return err
-			}
-			output = tmpfile.Name() + ".o"
-			tmpfile.Close()
-			err = os.Remove(tmpfile.Name())
-			if err != nil {
-				return err
-			}
-			defer os.Remove(output)
-		}
-
-		inputs := action.inputs
-		if extraInput != "" {
-			inputs = append([]string{extraInput}, inputs...)
-		}
-
-		err := performAction(opts, action.kind, inputs, output)
-		if err != nil {
-			return err
-		}
-
-		extraInput = output
-	}
-
-	return nil
-}
-
-func main() {
-	llvm.InitializeAllTargets()
-	llvm.InitializeAllTargetMCs()
-	llvm.InitializeAllTargetInfos()
-	llvm.InitializeAllAsmParsers()
-	llvm.InitializeAllAsmPrinters()
-
-	opts, err := parseArguments(os.Args[1:])
-	if err != nil {
-		report(err)
-		os.Exit(1)
-	}
-
-	err = performActions(&opts)
-	if err != nil {
-		report(err)
-		os.Exit(1)
-	}
-}
diff --git a/cmd/go/zdefaultcc.go.in b/cmd/go/zdefaultcc.go.in
deleted file mode 100644
index 66d52d9..0000000
--- a/cmd/go/zdefaultcc.go.in
+++ /dev/null
@@ -1,54 +0,0 @@
-//===- zdefaultcc.go - default compiler locations -------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file provides default locations for cc, cxx and llgo.
-//
-//===----------------------------------------------------------------------===//
-
-package main
-
-import (
-	"path/filepath"
-	"os"
-	"os/exec"
-)
-
-var defaultGCCGO, defaultCC, defaultCXX string
-
-func getInstPrefix() (string, error) {
-	path, err := exec.LookPath(os.Args[0])
-	if err != nil {
-		return "", err
-	}
-
-	path, err = filepath.EvalSymlinks(path)
-	if err != nil {
-		return "", err
-	}
-
-	prefix := filepath.Join(path, "..", "..")
-	return prefix, nil
-}
-
-func init() {
-	prefix, err := getInstPrefix()
-	if err != nil {
-		panic(err.Error())
-	}
-
-	defaultCC = filepath.Join(prefix, "bin", "clang")
-	defaultCXX = filepath.Join(prefix, "bin", "clang++")
-	defaultGCCGO = filepath.Join(prefix, "bin", "llgo")
-	toolDir = filepath.Join(prefix, "lib", "go", "llgo-@LLGO_VERSION@")
-
-	gccgoName = os.Getenv("GCCGO")
-	if gccgoName == "" {
-		gccgoName = defaultGCCGO
-	}
-	gccgoBin, _ = exec.LookPath(gccgoName)
-}
diff --git a/cmd/llgoi/llgoi.go b/cmd/llgoi/llgoi.go
deleted file mode 100644
index 39d9af6..0000000
--- a/cmd/llgoi/llgoi.go
+++ /dev/null
@@ -1,596 +0,0 @@
-//===- llgoi.go - llgo-based Go REPL --------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This is llgoi, a Go REPL based on llgo and the LLVM JIT.
-//
-//===----------------------------------------------------------------------===//
-
-package main
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"go/ast"
-	"go/build"
-	"go/parser"
-	"go/scanner"
-	"go/token"
-	"io"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime/debug"
-	"strconv"
-	"strings"
-	"unsafe"
-
-	"llvm.org/llgo/driver"
-	"llvm.org/llgo/irgen"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/liner"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-// /* Force exporting __morestack if it's available, so that it is
-//    available to the engine when linking with libLLVM.so. */
-//
-// void *__morestack __attribute__((weak));
-import "C"
-
-func getInstPrefix() (string, error) {
-	path, err := exec.LookPath(os.Args[0])
-	if err != nil {
-		return "", err
-	}
-
-	path, err = filepath.EvalSymlinks(path)
-	if err != nil {
-		return "", err
-	}
-
-	prefix := filepath.Join(path, "..", "..")
-	return prefix, nil
-}
-
-func llvmVersion() string {
-	return strings.Replace(llvm.Version, "svn", "", 1)
-}
-
-type line struct {
-	line     string
-	isStmt   bool
-	declName string
-	assigns  []string
-
-	parens, bracks, braces int
-}
-
-type interp struct {
-	engine llvm.ExecutionEngine
-
-	liner       *liner.State
-	pendingLine line
-
-	copts irgen.CompilerOptions
-
-	imports []*types.Package
-	scope   map[string]types.Object
-
-	modules map[string]llvm.Module
-	pkgmap  map[string]*types.Package
-	pkgnum  int
-}
-
-func (in *interp) makeCompilerOptions() error {
-	prefix, err := getInstPrefix()
-	if err != nil {
-		return err
-	}
-
-	importPaths := []string{filepath.Join(prefix, "lib", "go", "llgo-"+llvmVersion())}
-	in.copts = irgen.CompilerOptions{
-		TargetTriple:  llvm.DefaultTargetTriple(),
-		ImportPaths:   importPaths,
-		GenerateDebug: true,
-		Packages:      in.pkgmap,
-	}
-	err = in.copts.MakeImporter()
-	if err != nil {
-		return err
-	}
-
-	origImporter := in.copts.Importer
-	in.copts.Importer = func(pkgmap map[string]*types.Package, pkgpath string) (*types.Package, error) {
-		if pkg, ok := pkgmap[pkgpath]; ok && pkg.Complete() {
-			return pkg, nil
-		}
-		return origImporter(pkgmap, pkgpath)
-	}
-	return nil
-}
-
-func (in *interp) init() error {
-	in.liner = liner.NewLiner()
-	in.scope = make(map[string]types.Object)
-	in.pkgmap = make(map[string]*types.Package)
-	in.modules = make(map[string]llvm.Module)
-
-	err := in.makeCompilerOptions()
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func (in *interp) dispose() {
-	in.liner.Close()
-	in.engine.Dispose()
-}
-
-func (in *interp) loadSourcePackageFromCode(pkgcode, pkgpath string, copts irgen.CompilerOptions) (*types.Package, error) {
-	fset := token.NewFileSet()
-	file, err := parser.ParseFile(fset, "<input>", pkgcode, parser.DeclarationErrors|parser.ParseComments)
-	if err != nil {
-		return nil, err
-	}
-	files := []*ast.File{file}
-	return in.loadSourcePackage(fset, files, pkgpath, copts)
-}
-
-func (in *interp) loadSourcePackage(fset *token.FileSet, files []*ast.File, pkgpath string, copts irgen.CompilerOptions) (_ *types.Package, resultErr error) {
-	compiler, err := irgen.NewCompiler(copts)
-	if err != nil {
-		return nil, err
-	}
-
-	module, err := compiler.Compile(fset, files, pkgpath)
-	if err != nil {
-		return nil, err
-	}
-	in.modules[pkgpath] = module.Module
-
-	if in.engine.C != nil {
-		in.engine.AddModule(module.Module)
-	} else {
-		options := llvm.NewMCJITCompilerOptions()
-		in.engine, err = llvm.NewMCJITCompiler(module.Module, options)
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	var importFunc func()
-	importAddress := in.getPackageSymbol(pkgpath, ".import$descriptor")
-	*(*unsafe.Pointer)(unsafe.Pointer(&importFunc)) = importAddress
-
-	defer func() {
-		p := recover()
-		if p != nil {
-			resultErr = fmt.Errorf("panic: %v\n%v", p, string(debug.Stack()))
-		}
-	}()
-	importFunc()
-	in.pkgmap[pkgpath] = module.Package
-
-	return module.Package, nil
-}
-
-func (in *interp) getPackageSymbol(pkgpath, name string) unsafe.Pointer {
-	symbolName := irgen.ManglePackagePath(pkgpath) + "." + name
-	global := in.modules[pkgpath].NamedGlobal(symbolName)
-	if global.IsNil() {
-		return nil
-	}
-	return in.engine.PointerToGlobal(global)
-}
-
-func (in *interp) augmentPackageScope(pkg *types.Package) {
-	for _, obj := range in.scope {
-		pkg.Scope().Insert(obj)
-	}
-}
-
-func (l *line) append(str string, assigns []string) {
-	var s scanner.Scanner
-	fset := token.NewFileSet()
-	file := fset.AddFile("", fset.Base(), len(str))
-	s.Init(file, []byte(str), nil, 0)
-
-	_, tok, _ := s.Scan()
-	if l.line == "" {
-		switch tok {
-		case token.FOR, token.GO, token.IF, token.LBRACE, token.SELECT, token.SWITCH:
-			l.isStmt = true
-		case token.CONST, token.FUNC, token.TYPE, token.VAR:
-			var lit string
-			_, tok, lit = s.Scan()
-			if tok == token.IDENT {
-				l.declName = lit
-			}
-		}
-	}
-
-	for tok != token.EOF {
-		switch tok {
-		case token.LPAREN:
-			l.parens++
-		case token.RPAREN:
-			l.parens--
-		case token.LBRACE:
-			l.braces++
-		case token.RBRACE:
-			l.braces--
-		case token.LBRACK:
-			l.bracks++
-		case token.RBRACK:
-			l.bracks--
-		case token.DEC, token.INC,
-			token.ASSIGN, token.ADD_ASSIGN, token.SUB_ASSIGN,
-			token.MUL_ASSIGN, token.QUO_ASSIGN, token.REM_ASSIGN,
-			token.AND_ASSIGN, token.OR_ASSIGN, token.XOR_ASSIGN,
-			token.SHL_ASSIGN, token.SHR_ASSIGN, token.AND_NOT_ASSIGN:
-			if l.parens == 0 && l.bracks == 0 && l.braces == 0 {
-				l.isStmt = true
-			}
-		}
-		_, tok, _ = s.Scan()
-	}
-
-	if l.line == "" {
-		l.assigns = assigns
-	}
-	l.line += str
-}
-
-func (l *line) ready() bool {
-	return l.parens <= 0 && l.bracks <= 0 && l.braces <= 0
-}
-
-func (in *interp) readExprLine(str string, assigns []string) ([]interface{}, error) {
-	in.pendingLine.append(str, assigns)
-	if !in.pendingLine.ready() {
-		return nil, nil
-	}
-	results, err := in.interpretLine(in.pendingLine)
-	in.pendingLine = line{}
-	return results, err
-}
-
-func (in *interp) interpretLine(l line) ([]interface{}, error) {
-	pkgname := fmt.Sprintf("input%05d", in.pkgnum)
-	in.pkgnum++
-
-	pkg := types.NewPackage(pkgname, pkgname)
-	scope := pkg.Scope()
-
-	for _, imppkg := range in.imports {
-		obj := types.NewPkgName(token.NoPos, pkg, imppkg.Name(), imppkg)
-		scope.Insert(obj)
-	}
-
-	in.augmentPackageScope(pkg)
-
-	var tv types.TypeAndValue
-	if l.declName == "" && !l.isStmt {
-		var err error
-		tv, err = types.Eval(l.line, pkg, scope)
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	var code bytes.Buffer
-	fmt.Fprintf(&code, "package %s\n", pkgname)
-
-	for _, pkg := range in.imports {
-		fmt.Fprintf(&code, "import %q\n", pkg.Path())
-	}
-
-	if l.declName != "" {
-		code.WriteString(l.line)
-	} else if !l.isStmt && tv.IsValue() {
-		var typs []types.Type
-		if tuple, ok := tv.Type.(*types.Tuple); ok {
-			typs = make([]types.Type, tuple.Len())
-			for i := range typs {
-				typs[i] = tuple.At(i).Type()
-			}
-		} else {
-			typs = []types.Type{tv.Type}
-		}
-		if len(l.assigns) == 2 && tv.HasOk() {
-			typs = append(typs, types.Typ[types.Bool])
-		}
-		if len(l.assigns) != 0 && len(l.assigns) != len(typs) {
-			return nil, errors.New("return value mismatch")
-		}
-
-		code.WriteString("var ")
-		for i := range typs {
-			if i != 0 {
-				code.WriteString(", ")
-			}
-			if len(l.assigns) != 0 && l.assigns[i] != "" {
-				if _, ok := in.scope[l.assigns[i]]; ok {
-					fmt.Fprintf(&code, "__llgoiV%d", i)
-				} else {
-					code.WriteString(l.assigns[i])
-				}
-			} else {
-				fmt.Fprintf(&code, "__llgoiV%d", i)
-			}
-		}
-		fmt.Fprintf(&code, " = %s\n", l.line)
-
-		code.WriteString("func init() {\n")
-		varnames := make([]string, len(typs))
-		for i := range typs {
-			var varname string
-			if len(l.assigns) != 0 && l.assigns[i] != "" {
-				if _, ok := in.scope[l.assigns[i]]; ok {
-					fmt.Fprintf(&code, "\t%s = __llgoiV%d\n", l.assigns[i], i)
-				}
-				varname = l.assigns[i]
-			} else {
-				varname = fmt.Sprintf("__llgoiV%d", i)
-			}
-			varnames[i] = varname
-		}
-		code.WriteString("}\n\n")
-
-		code.WriteString("func __llgoiResults() []interface{} {\n")
-		code.WriteString("\treturn []interface{}{\n")
-		for _, varname := range varnames {
-			fmt.Fprintf(&code, "\t\t%s,\n", varname)
-		}
-		code.WriteString("\t}\n")
-		code.WriteString("}\n")
-	} else {
-		if len(l.assigns) != 0 {
-			return nil, errors.New("return value mismatch")
-		}
-
-		fmt.Fprintf(&code, "func init() {\n\t%s}", l.line)
-	}
-
-	copts := in.copts
-	copts.PackageCreated = in.augmentPackageScope
-	copts.DisableUnusedImportCheck = true
-	pkg, err := in.loadSourcePackageFromCode(code.String(), pkgname, copts)
-	if err != nil {
-		return nil, err
-	}
-	in.imports = append(in.imports, pkg)
-
-	var results []interface{}
-	llgoiResultsAddress := in.getPackageSymbol(pkgname, "__llgoiResults$descriptor")
-	if llgoiResultsAddress != nil {
-		var resultsFunc func() []interface{}
-		*(*unsafe.Pointer)(unsafe.Pointer(&resultsFunc)) = llgoiResultsAddress
-		results = resultsFunc()
-	}
-
-	for _, assign := range l.assigns {
-		if assign != "" {
-			if _, ok := in.scope[assign]; !ok {
-				in.scope[assign] = pkg.Scope().Lookup(assign)
-			}
-		}
-	}
-
-	if l.declName != "" {
-		in.scope[l.declName] = pkg.Scope().Lookup(l.declName)
-	}
-
-	return results, nil
-}
-
-func (in *interp) maybeReadAssignment(line string, s *scanner.Scanner, initial string, base int) (bool, error) {
-	if initial == "_" {
-		initial = ""
-	}
-	assigns := []string{initial}
-
-	pos, tok, lit := s.Scan()
-	for tok == token.COMMA {
-		pos, tok, lit = s.Scan()
-		if tok != token.IDENT {
-			return false, nil
-		}
-
-		if lit == "_" {
-			lit = ""
-		}
-		assigns = append(assigns, lit)
-
-		pos, tok, lit = s.Scan()
-	}
-
-	if tok != token.DEFINE {
-		return false, nil
-	}
-
-	// It's an assignment statement, there are no results.
-	_, err := in.readExprLine(line[int(pos)-base+2:], assigns)
-	return true, err
-}
-
-func (in *interp) loadPackage(pkgpath string) (*types.Package, error) {
-	pkg, err := in.copts.Importer(in.pkgmap, pkgpath)
-	if err == nil {
-		return pkg, nil
-	}
-
-	buildpkg, err := build.Import(pkgpath, ".", 0)
-	if err != nil {
-		return nil, err
-	}
-	if len(buildpkg.CgoFiles) != 0 {
-		return nil, fmt.Errorf("%s: cannot load cgo package", pkgpath)
-	}
-
-	for _, imp := range buildpkg.Imports {
-		_, err := in.loadPackage(imp)
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	inputs := make([]string, len(buildpkg.GoFiles))
-	for i, file := range buildpkg.GoFiles {
-		inputs[i] = filepath.Join(buildpkg.Dir, file)
-	}
-
-	fset := token.NewFileSet()
-	files, err := driver.ParseFiles(fset, inputs)
-	if err != nil {
-		return nil, err
-	}
-
-	return in.loadSourcePackage(fset, files, pkgpath, in.copts)
-}
-
-// readLine accumulates lines of input, including trailing newlines,
-// executing statements as they are completed.
-func (in *interp) readLine(line string) ([]interface{}, error) {
-	if !in.pendingLine.ready() {
-		return in.readExprLine(line, nil)
-	}
-
-	var s scanner.Scanner
-	fset := token.NewFileSet()
-	file := fset.AddFile("", fset.Base(), len(line))
-	s.Init(file, []byte(line), nil, 0)
-
-	_, tok, lit := s.Scan()
-	switch tok {
-	case token.EOF:
-		return nil, nil
-
-	case token.IMPORT:
-		_, tok, lit = s.Scan()
-		if tok != token.STRING {
-			return nil, errors.New("expected string literal")
-		}
-		pkgpath, err := strconv.Unquote(lit)
-		if err != nil {
-			return nil, err
-		}
-		pkg, err := in.loadPackage(pkgpath)
-		if err != nil {
-			return nil, err
-		}
-		in.imports = append(in.imports, pkg)
-		return nil, nil
-
-	case token.IDENT:
-		ok, err := in.maybeReadAssignment(line, &s, lit, file.Base())
-		if err != nil {
-			return nil, err
-		}
-		if ok {
-			return nil, nil
-		}
-		fallthrough
-
-	default:
-		return in.readExprLine(line, nil)
-	}
-}
-
-// printResult prints a value that was the result of an expression evaluated
-// by the interpreter.
-func printResult(w io.Writer, v interface{}) {
-	// TODO the result should be formatted in Go syntax, without
-	// package qualifiers for types defined within the interpreter.
-	fmt.Fprintf(w, "%+v", v)
-}
-
-// formatHistory reformats the provided Go source by collapsing all lines
-// and adding semicolons where required, suitable for adding to line history.
-func formatHistory(input []byte) string {
-	var buf bytes.Buffer
-	var s scanner.Scanner
-	fset := token.NewFileSet()
-	file := fset.AddFile("", fset.Base(), len(input))
-	s.Init(file, input, nil, 0)
-	pos, tok, lit := s.Scan()
-	for tok != token.EOF {
-		if int(pos)-1 > buf.Len() {
-			n := int(pos) - 1 - buf.Len()
-			buf.WriteString(strings.Repeat(" ", n))
-		}
-		var semicolon bool
-		if tok == token.SEMICOLON {
-			semicolon = true
-		} else if lit != "" {
-			buf.WriteString(lit)
-		} else {
-			buf.WriteString(tok.String())
-		}
-		pos, tok, lit = s.Scan()
-		if semicolon {
-			switch tok {
-			case token.RBRACE, token.RPAREN, token.EOF:
-			default:
-				buf.WriteRune(';')
-			}
-		}
-	}
-	return buf.String()
-}
-
-func main() {
-	llvm.LinkInMCJIT()
-	llvm.InitializeNativeTarget()
-	llvm.InitializeNativeAsmPrinter()
-
-	var in interp
-	err := in.init()
-	if err != nil {
-		panic(err)
-	}
-	defer in.dispose()
-
-	var buf bytes.Buffer
-	for {
-		if in.pendingLine.ready() && buf.Len() > 0 {
-			history := formatHistory(buf.Bytes())
-			in.liner.AppendHistory(history)
-			buf.Reset()
-		}
-		prompt := "(llgo) "
-		if !in.pendingLine.ready() {
-			prompt = strings.Repeat(" ", len(prompt))
-		}
-		line, err := in.liner.Prompt(prompt)
-		if err == io.EOF {
-			break
-		} else if err != nil {
-			panic(err)
-		}
-		if line == "" {
-			continue
-		}
-		buf.WriteString(line + "\n")
-		results, err := in.readLine(line + "\n")
-		if err != nil {
-			fmt.Println(err)
-		}
-		for _, result := range results {
-			printResult(os.Stdout, result)
-			fmt.Println()
-		}
-	}
-
-	if liner.TerminalSupported() {
-		fmt.Println()
-	}
-}
diff --git a/debug/debug.go b/debug/debug.go
deleted file mode 100644
index 561360a..0000000
--- a/debug/debug.go
+++ /dev/null
@@ -1,431 +0,0 @@
-//===- debug.go - debug info builder --------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This package builds LLVM debug info from go/* data structures.
-//
-//===----------------------------------------------------------------------===//
-
-package debug
-
-import (
-	"debug/dwarf"
-	"fmt"
-	"go/token"
-	"os"
-	"strings"
-
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-const (
-	// non-standard debug metadata tags
-	tagAutoVariable dwarf.Tag = 0x100
-	tagArgVariable  dwarf.Tag = 0x101
-)
-
-type PrefixMap struct {
-	Source, Replacement string
-}
-
-// DIBuilder builds debug metadata for Go programs.
-type DIBuilder struct {
-	// builder is the current builder; there is one per CU.
-	builder    *llvm.DIBuilder
-	module     llvm.Module
-	files      map[*token.File]llvm.Metadata
-	cu, fn, lb llvm.Metadata
-	fnFile     string
-	sizes      types.Sizes
-	fset       *token.FileSet
-	prefixMaps []PrefixMap
-	types      typeutil.Map
-	voidType   llvm.Metadata
-}
-
-// NewDIBuilder creates a new debug information builder.
-func NewDIBuilder(sizes types.Sizes, module llvm.Module, fset *token.FileSet, prefixMaps []PrefixMap) *DIBuilder {
-	var d DIBuilder
-	d.module = module
-	d.files = make(map[*token.File]llvm.Metadata)
-	d.sizes = sizes
-	d.fset = fset
-	d.prefixMaps = prefixMaps
-	d.builder = llvm.NewDIBuilder(d.module)
-	d.cu = d.createCompileUnit()
-	return &d
-}
-
-// Destroy destroys the DIBuilder.
-func (d *DIBuilder) Destroy() {
-	d.builder.Destroy()
-}
-
-func (d *DIBuilder) scope() llvm.Metadata {
-	if d.lb.C != nil {
-		return d.lb
-	}
-	if d.fn.C != nil {
-		return d.fn
-	}
-	return d.cu
-}
-
-func (d *DIBuilder) remapFilePath(path string) string {
-	for _, pm := range d.prefixMaps {
-		if strings.HasPrefix(path, pm.Source) {
-			return pm.Replacement + path[len(pm.Source):]
-		}
-	}
-	return path
-}
-
-func (d *DIBuilder) getFile(file *token.File) llvm.Metadata {
-	if diFile := d.files[file]; diFile.C != nil {
-		return diFile
-	}
-	diFile := d.builder.CreateFile(d.remapFilePath(file.Name()), "")
-	d.files[file] = diFile
-	return diFile
-}
-
-// createCompileUnit creates and returns debug metadata for the compile
-// unit as a whole, using the first file in the file set as a representative
-// (the choice of file is arbitrary).
-func (d *DIBuilder) createCompileUnit() llvm.Metadata {
-	var file *token.File
-	d.fset.Iterate(func(f *token.File) bool {
-		file = f
-		return false
-	})
-	dir, err := os.Getwd()
-	if err != nil {
-		panic("could not get current directory: " + err.Error())
-	}
-	return d.builder.CreateCompileUnit(llvm.DICompileUnit{
-		Language: llvm.DW_LANG_Go,
-		File:     d.remapFilePath(file.Name()),
-		Dir:      dir,
-		Producer: "llgo",
-	})
-}
-
-// PushFunction creates debug metadata for the specified function,
-// and pushes it onto the scope stack.
-func (d *DIBuilder) PushFunction(fnptr llvm.Value, sig *types.Signature, pos token.Pos) {
-	var diFile llvm.Metadata
-	var line int
-	if file := d.fset.File(pos); file != nil {
-		d.fnFile = file.Name()
-		diFile = d.getFile(file)
-		line = file.Line(pos)
-	}
-	d.fn = d.builder.CreateFunction(d.scope(), llvm.DIFunction{
-		Name:         fnptr.Name(), // TODO(axw) unmangled name?
-		LinkageName:  fnptr.Name(),
-		File:         diFile,
-		Line:         line,
-		Type:         d.DIType(sig),
-		IsDefinition: true,
-	})
-	fnptr.SetSubprogram(d.fn)
-}
-
-// PopFunction pops the previously pushed function off the scope stack.
-func (d *DIBuilder) PopFunction() {
-	d.lb = llvm.Metadata{}
-	d.fn = llvm.Metadata{}
-	d.fnFile = ""
-}
-
-// Value creates an llvm.dbg.value call for the specified register value.
-func (d *DIBuilder) Value(b llvm.Builder, v ssa.Value, llv llvm.Value, paramIndex int) {
-	// TODO(axw)
-}
-
-// SetLocation sets the current debug location.
-func (d *DIBuilder) SetLocation(b llvm.Builder, pos token.Pos) {
-	position := d.fset.Position(pos)
-	d.lb = llvm.Metadata{}
-	if position.Filename != d.fnFile && position.Filename != "" {
-		// This can happen rarely, e.g. in init functions.
-		diFile := d.builder.CreateFile(d.remapFilePath(position.Filename), "")
-		d.lb = d.builder.CreateLexicalBlockFile(d.scope(), diFile, 0)
-	}
-	b.SetCurrentDebugLocation(uint(position.Line), uint(position.Column), d.scope(), llvm.Metadata{})
-}
-
-// Finalize must be called after all compilation units are translated,
-// generating the final debug metadata for the module.
-func (d *DIBuilder) Finalize() {
-	d.module.AddNamedMetadataOperand(
-		"llvm.module.flags",
-		llvm.GlobalContext().MDNode([]llvm.Metadata{
-			llvm.ConstInt(llvm.Int32Type(), 2, false).ConstantAsMetadata(), // Warn on mismatch
-			llvm.GlobalContext().MDString("Dwarf Version"),
-			llvm.ConstInt(llvm.Int32Type(), 4, false).ConstantAsMetadata(),
-		}),
-	)
-	d.module.AddNamedMetadataOperand(
-		"llvm.module.flags",
-		llvm.GlobalContext().MDNode([]llvm.Metadata{
-			llvm.ConstInt(llvm.Int32Type(), 1, false).ConstantAsMetadata(), // Error on mismatch
-			llvm.GlobalContext().MDString("Debug Info Version"),
-			llvm.ConstInt(llvm.Int32Type(), 3, false).ConstantAsMetadata(),
-		}),
-	)
-	d.builder.Finalize()
-}
-
-// DIType maps a Go type to DIType debug metadata value.
-func (d *DIBuilder) DIType(t types.Type) llvm.Metadata {
-	return d.typeDebugDescriptor(t, types.TypeString(nil, t))
-}
-
-func (d *DIBuilder) typeDebugDescriptor(t types.Type, name string) llvm.Metadata {
-	// Signature needs to be handled specially, to preprocess
-	// methods, moving the receiver to the parameter list.
-	if t, ok := t.(*types.Signature); ok {
-		return d.descriptorSignature(t, name)
-	}
-	if t == nil {
-		if d.voidType.C == nil {
-			d.voidType = d.builder.CreateBasicType(llvm.DIBasicType{Name: "void"})
-		}
-		return d.voidType
-	}
-	if dt, ok := d.types.At(t).(llvm.Metadata); ok {
-		return dt
-	}
-	dt := d.descriptor(t, name)
-	d.types.Set(t, dt)
-	return dt
-}
-
-func (d *DIBuilder) descriptor(t types.Type, name string) llvm.Metadata {
-	switch t := t.(type) {
-	case *types.Basic:
-		return d.descriptorBasic(t, name)
-	case *types.Pointer:
-		return d.descriptorPointer(t)
-	case *types.Struct:
-		return d.descriptorStruct(t, name)
-	case *types.Named:
-		return d.descriptorNamed(t)
-	case *types.Array:
-		return d.descriptorArray(t, name)
-	case *types.Slice:
-		return d.descriptorSlice(t, name)
-	case *types.Map:
-		return d.descriptorMap(t, name)
-	case *types.Chan:
-		return d.descriptorChan(t, name)
-	case *types.Interface:
-		return d.descriptorInterface(t, name)
-	default:
-		panic(fmt.Sprintf("unhandled type: %T", t))
-	}
-}
-
-func (d *DIBuilder) descriptorBasic(t *types.Basic, name string) llvm.Metadata {
-	switch t.Kind() {
-	case types.String:
-		return d.typeDebugDescriptor(types.NewStruct([]*types.Var{
-			types.NewVar(0, nil, "ptr", types.NewPointer(types.Typ[types.Uint8])),
-			types.NewVar(0, nil, "len", types.Typ[types.Int]),
-		}, nil), name)
-	case types.UnsafePointer:
-		return d.builder.CreateBasicType(llvm.DIBasicType{
-			Name:        name,
-			SizeInBits:  uint64(d.sizes.Sizeof(t) * 8),
-			Encoding:    llvm.DW_ATE_unsigned,
-		})
-	default:
-		bt := llvm.DIBasicType{
-			Name:        t.String(),
-			SizeInBits:  uint64(d.sizes.Sizeof(t) * 8),
-		}
-		switch bi := t.Info(); {
-		case bi&types.IsBoolean != 0:
-			bt.Encoding = llvm.DW_ATE_boolean
-		case bi&types.IsUnsigned != 0:
-			bt.Encoding = llvm.DW_ATE_unsigned
-		case bi&types.IsInteger != 0:
-			bt.Encoding = llvm.DW_ATE_signed
-		case bi&types.IsFloat != 0:
-			bt.Encoding = llvm.DW_ATE_float
-		case bi&types.IsComplex != 0:
-			bt.Encoding = llvm.DW_ATE_imaginary_float
-		case bi&types.IsUnsigned != 0:
-			bt.Encoding = llvm.DW_ATE_unsigned
-		default:
-			panic(fmt.Sprintf("unhandled: %#v", t))
-		}
-		return d.builder.CreateBasicType(bt)
-	}
-}
-
-func (d *DIBuilder) descriptorPointer(t *types.Pointer) llvm.Metadata {
-	return d.builder.CreatePointerType(llvm.DIPointerType{
-		Pointee:     d.DIType(t.Elem()),
-		SizeInBits:  uint64(d.sizes.Sizeof(t) * 8),
-		AlignInBits: uint32(d.sizes.Alignof(t) * 8),
-	})
-}
-
-func (d *DIBuilder) descriptorStruct(t *types.Struct, name string) llvm.Metadata {
-	fields := make([]*types.Var, t.NumFields())
-	for i := range fields {
-		fields[i] = t.Field(i)
-	}
-	offsets := d.sizes.Offsetsof(fields)
-	members := make([]llvm.Metadata, len(fields))
-	for i, f := range fields {
-		// TODO(axw) file/line where member is defined.
-		t := f.Type()
-		members[i] = d.builder.CreateMemberType(d.cu, llvm.DIMemberType{
-			Name:         f.Name(),
-			Type:         d.DIType(t),
-			SizeInBits:   uint64(d.sizes.Sizeof(t) * 8),
-			AlignInBits:  uint32(d.sizes.Alignof(t) * 8),
-			OffsetInBits: uint64(offsets[i] * 8),
-		})
-	}
-	// TODO(axw) file/line where struct is defined.
-	return d.builder.CreateStructType(d.cu, llvm.DIStructType{
-		Name:        name,
-		SizeInBits:  uint64(d.sizes.Sizeof(t) * 8),
-		AlignInBits: uint32(d.sizes.Alignof(t) * 8),
-		Elements:    members,
-	})
-}
-
-func (d *DIBuilder) descriptorNamed(t *types.Named) llvm.Metadata {
-	var diFile llvm.Metadata
-	var line int
-	if file := d.fset.File(t.Obj().Pos()); file != nil {
-		line = file.Line(t.Obj().Pos())
-		diFile = d.getFile(file)
-	}
-
-	// Create a placeholder for the named type, to terminate cycles.
-	name := t.Obj().Name()
-	placeholder := d.builder.CreateReplaceableCompositeType(d.scope(), llvm.DIReplaceableCompositeType{
-		Tag:  dwarf.TagStructType,
-		Name: name,
-		File: diFile,
-		Line: line,
-	})
-	d.types.Set(t, placeholder)
-
-	typedef := d.builder.CreateTypedef(llvm.DITypedef{
-		Type: d.DIType(t.Underlying()),
-		Name: name,
-		File: diFile,
-		Line: line,
-	})
-	placeholder.ReplaceAllUsesWith(typedef)
-	return typedef
-}
-
-func (d *DIBuilder) descriptorArray(t *types.Array, name string) llvm.Metadata {
-	return d.builder.CreateArrayType(llvm.DIArrayType{
-		SizeInBits:  uint64(d.sizes.Sizeof(t) * 8),
-		AlignInBits: uint32(d.sizes.Alignof(t) * 8),
-		ElementType: d.DIType(t.Elem()),
-		Subscripts:  []llvm.DISubrange{{Count: t.Len()}},
-	})
-}
-
-func (d *DIBuilder) descriptorSlice(t *types.Slice, name string) llvm.Metadata {
-	sliceStruct := types.NewStruct([]*types.Var{
-		types.NewVar(0, nil, "ptr", types.NewPointer(t.Elem())),
-		types.NewVar(0, nil, "len", types.Typ[types.Int]),
-		types.NewVar(0, nil, "cap", types.Typ[types.Int]),
-	}, nil)
-	return d.typeDebugDescriptor(sliceStruct, name)
-}
-
-func (d *DIBuilder) descriptorMap(t *types.Map, name string) llvm.Metadata {
-	// FIXME: This should be DW_TAG_pointer_type to __go_map.
-	return d.descriptorBasic(types.Typ[types.Uintptr], name)
-}
-
-func (d *DIBuilder) descriptorChan(t *types.Chan, name string) llvm.Metadata {
-	// FIXME: This should be DW_TAG_pointer_type to __go_channel.
-	return d.descriptorBasic(types.Typ[types.Uintptr], name)
-}
-
-func (d *DIBuilder) descriptorInterface(t *types.Interface, name string) llvm.Metadata {
-	ifaceStruct := types.NewStruct([]*types.Var{
-		types.NewVar(0, nil, "type", types.NewPointer(types.Typ[types.Uint8])),
-		types.NewVar(0, nil, "data", types.NewPointer(types.Typ[types.Uint8])),
-	}, nil)
-	return d.typeDebugDescriptor(ifaceStruct, name)
-}
-
-func (d *DIBuilder) descriptorSignature(t *types.Signature, name string) llvm.Metadata {
-	// If there's a receiver change the receiver to an
-	// additional (first) parameter, and take the value of
-	// the resulting signature instead.
-	if recv := t.Recv(); recv != nil {
-		params := t.Params()
-		paramvars := make([]*types.Var, int(params.Len()+1))
-		paramvars[0] = recv
-		for i := 0; i < int(params.Len()); i++ {
-			paramvars[i+1] = params.At(i)
-		}
-		params = types.NewTuple(paramvars...)
-		t := types.NewSignature(nil, nil, params, t.Results(), t.Variadic())
-		return d.typeDebugDescriptor(t, name)
-	}
-	if dt, ok := d.types.At(t).(llvm.Metadata); ok {
-		return dt
-	}
-
-	var returnType llvm.Metadata
-	results := t.Results()
-	switch n := results.Len(); n {
-	case 0:
-		returnType = d.DIType(nil) // void
-	case 1:
-		returnType = d.DIType(results.At(0).Type())
-	default:
-		fields := make([]*types.Var, results.Len())
-		for i := range fields {
-			f := results.At(i)
-			// Structs may not have multiple fields
-			// with the same name, excepting "_".
-			if f.Name() == "" {
-				f = types.NewVar(f.Pos(), f.Pkg(), "_", f.Type())
-			}
-			fields[i] = f
-		}
-		returnType = d.typeDebugDescriptor(types.NewStruct(fields, nil), "")
-	}
-
-	var paramTypes []llvm.Metadata
-	params := t.Params()
-	if params != nil && params.Len() > 0 {
-		paramTypes = make([]llvm.Metadata, params.Len()+1)
-		paramTypes[0] = returnType
-		for i := range paramTypes[1:] {
-			paramTypes[i+1] = d.DIType(params.At(i).Type())
-		}
-	} else {
-		paramTypes = []llvm.Metadata{returnType}
-	}
-
-	// TODO(axw) get position of type definition for File field
-	return d.builder.CreateSubroutineType(llvm.DISubroutineType{
-		Parameters: paramTypes,
-	})
-}
diff --git a/docs/Makefile.sphinx b/docs/Makefile.sphinx
deleted file mode 100644
index b3083d5..0000000
--- a/docs/Makefile.sphinx
+++ /dev/null
@@ -1,177 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS    =
-SPHINXBUILD   = sphinx-build
-PAPER         =
-BUILDDIR      = _build
-
-# User-friendly check for sphinx-build
-ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
-$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
-endif
-
-# Internal variables.
-PAPEROPT_a4     = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
-
-help:
-	@echo "Please use \`make <target>' where <target> is one of"
-	@echo "  html       to make standalone HTML files"
-	@echo "  dirhtml    to make HTML files named index.html in directories"
-	@echo "  singlehtml to make a single large HTML file"
-	@echo "  pickle     to make pickle files"
-	@echo "  json       to make JSON files"
-	@echo "  htmlhelp   to make HTML files and a HTML help project"
-	@echo "  qthelp     to make HTML files and a qthelp project"
-	@echo "  devhelp    to make HTML files and a Devhelp project"
-	@echo "  epub       to make an epub"
-	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
-	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
-	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
-	@echo "  text       to make text files"
-	@echo "  man        to make manual pages"
-	@echo "  texinfo    to make Texinfo files"
-	@echo "  info       to make Texinfo files and run them through makeinfo"
-	@echo "  gettext    to make PO message catalogs"
-	@echo "  changes    to make an overview of all changed/added/deprecated items"
-	@echo "  xml        to make Docutils-native XML files"
-	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
-	@echo "  linkcheck  to check all external links for integrity"
-	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
-
-clean:
-	rm -rf $(BUILDDIR)/*
-
-html:
-	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-dirhtml:
-	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-singlehtml:
-	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
-	@echo
-	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-pickle:
-	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
-	@echo
-	@echo "Build finished; now you can process the pickle files."
-
-json:
-	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
-	@echo
-	@echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
-	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
-	@echo
-	@echo "Build finished; now you can run HTML Help Workshop with the" \
-	      ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-qthelp:
-	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
-	@echo
-	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
-	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
-	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/llgo.qhcp"
-	@echo "To view the help file:"
-	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/llgo.qhc"
-
-devhelp:
-	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
-	@echo
-	@echo "Build finished."
-	@echo "To view the help file:"
-	@echo "# mkdir -p $$HOME/.local/share/devhelp/llgo"
-	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/llgo"
-	@echo "# devhelp"
-
-epub:
-	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
-	@echo
-	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-latex:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo
-	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
-	@echo "Run \`make' in that directory to run these through (pdf)latex" \
-	      "(use \`make latexpdf' here to do that automatically)."
-
-latexpdf:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through pdflatex..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-latexpdfja:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through platex and dvipdfmx..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-text:
-	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
-	@echo
-	@echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-man:
-	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
-	@echo
-	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-texinfo:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo
-	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
-	@echo "Run \`make' in that directory to run these through makeinfo" \
-	      "(use \`make info' here to do that automatically)."
-
-info:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo "Running Texinfo files through makeinfo..."
-	make -C $(BUILDDIR)/texinfo info
-	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-gettext:
-	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
-	@echo
-	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-changes:
-	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
-	@echo
-	@echo "The overview file is in $(BUILDDIR)/changes."
-
-linkcheck:
-	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
-	@echo
-	@echo "Link check complete; look for any errors in the above output " \
-	      "or in $(BUILDDIR)/linkcheck/output.txt."
-
-doctest:
-	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
-	@echo "Testing of doctests in the sources finished, look at the " \
-	      "results in $(BUILDDIR)/doctest/output.txt."
-
-xml:
-	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
-	@echo
-	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
-
-pseudoxml:
-	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
-	@echo
-	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
diff --git a/docs/conf.py b/docs/conf.py
deleted file mode 100644
index 11a5e51..0000000
--- a/docs/conf.py
+++ /dev/null
@@ -1,258 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# llgo documentation build configuration file, created by
-# sphinx-quickstart on Sun Apr  5 16:02:16 2015.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import sys
-import os
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#sys.path.insert(0, os.path.abspath('.'))
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = []
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix of source filenames.
-source_suffix = '.rst'
-
-# The encoding of source files.
-#source_encoding = 'utf-8-sig'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'llgo'
-copyright = u'2015, LLVM Team'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = '3.7'
-# The full version, including alpha/beta/rc tags.
-release = '3.7'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#today = ''
-# Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = ['_build']
-
-# The reST default role (used for this markup: `text`) to use for all
-# documents.
-#default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-#add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-#show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
-
-# If true, keep warnings as "system message" paragraphs in the built documents.
-#keep_warnings = False
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-html_theme = 'default'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further.  For a list of options available for each theme, see the
-# documentation.
-#html_theme_options = {}
-
-# Add any paths that contain custom themes here, relative to this directory.
-#html_theme_path = []
-
-# The name for this set of Sphinx documents.  If None, it defaults to
-# "<project> v<release> documentation".
-#html_title = None
-
-# A shorter title for the navigation bar.  Default is the same as html_title.
-#html_short_title = None
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-#html_logo = None
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-#html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
-
-# Add any extra paths that contain custom files (such as robots.txt or
-# .htaccess) here, relative to this directory. These files are copied
-# directly to the root of the documentation.
-#html_extra_path = []
-
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-#html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-#html_additional_pages = {}
-
-# If false, no module index is generated.
-#html_domain_indices = True
-
-# If false, no index is generated.
-#html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-#html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
-
-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-#html_show_sphinx = True
-
-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#html_show_copyright = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it.  The value of this option must be the
-# base URL from which the finished HTML is served.
-#html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = None
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'llgodoc'
-
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
-# The paper size ('letterpaper' or 'a4paper').
-#'papersize': 'letterpaper',
-
-# The font size ('10pt', '11pt' or '12pt').
-#'pointsize': '10pt',
-
-# Additional stuff for the LaTeX preamble.
-#'preamble': '',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-#  author, documentclass [howto, manual, or own class]).
-latex_documents = [
-  ('index', 'llgo.tex', u'llgo Documentation',
-   u'LLVM Team', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-#latex_logo = None
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-#latex_use_parts = False
-
-# If true, show page references after internal links.
-#latex_show_pagerefs = False
-
-# If true, show URL addresses after external links.
-#latex_show_urls = False
-
-# Documents to append as an appendix to all manuals.
-#latex_appendices = []
-
-# If false, no module index is generated.
-#latex_domain_indices = True
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
-    ('index', 'llgo', u'llgo Documentation',
-     [u'LLVM Team'], 1)
-]
-
-# If true, show URL addresses after external links.
-#man_show_urls = False
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-#  dir menu entry, description, category)
-texinfo_documents = [
-  ('index', 'llgo', u'llgo Documentation',
-   u'LLVM Team', 'llgo', 'One line description of project.',
-   'Miscellaneous'),
-]
-
-# Documents to append as an appendix to all manuals.
-#texinfo_appendices = []
-
-# If false, no module index is generated.
-#texinfo_domain_indices = True
-
-# How to display URL addresses: 'footnote', 'no', or 'inline'.
-#texinfo_show_urls = 'footnote'
-
-# If true, do not generate a @detailmenu in the "Top" node's menu.
-#texinfo_no_detailmenu = False
diff --git a/docs/index.rst b/docs/index.rst
deleted file mode 100644
index 40cfc43..0000000
--- a/docs/index.rst
+++ /dev/null
@@ -1,23 +0,0 @@
-.. llgo documentation master file, created by
-   sphinx-quickstart on Sun Apr  5 16:02:16 2015.
-   You can adapt this file completely to your liking, but it should at least
-   contain the root `toctree` directive.
-
-Welcome to llgo's documentation!
-================================
-
-Contents:
-
-.. toctree::
-   :maxdepth: 2
-
-   llgoi
-
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
-
diff --git a/docs/llgoi.rst b/docs/llgoi.rst
deleted file mode 100644
index c7def7d..0000000
--- a/docs/llgoi.rst
+++ /dev/null
@@ -1,80 +0,0 @@
-=====
-llgoi
-=====
-
-Introduction
-============
-
-llgoi is an interactive REPL for Go. It supports expressions, statements,
-most declarations and imports, including binary imports from the standard
-library and source imports from ``$GOPATH``.
-
-Example usage
-=============
-
-.. code-block:: none
-
-  (llgo) 1+1
-  #0 untyped int = 2
-  (llgo) x := 1
-  x untyped int = 1
-  (llgo) x++
-  (llgo) x
-  #0 int = 2
-  (llgo) import "fmt"
-  (llgo) fmt.Println("hello world")
-  hello world
-  #0 int = 12
-  #1 error (<nil>) = <nil>
-  (llgo) for i := 0; i != 3; i++ {
-         fmt.Println(i)
-         }
-  0
-  1
-  2
-  (llgo) func foo() {
-         fmt.Println("hello decl")
-         }
-  (llgo) foo()
-  hello decl
-  (llgo) import "golang.org/x/tools/go/types"
-  # golang.org/x/tools/go/ast/astutil
-  # golang.org/x/tools/go/exact
-  # golang.org/x/tools/go/types
-  (llgo) types.Eval("1+1", nil, nil)
-  #0 golang.org/x/tools/go/types.TypeAndValue = {mode:4 Type:untyped int Value:2}
-  #1 error (<nil>) = <nil>
-
-Expressions
-===========
-
-Expressions can be evaluated by entering them at the llgoi prompt. The
-result of evaluating the expression is displayed as if printed with the
-format string ``"%+v"``. If the expression has multiple values (e.g. calls),
-each value is displayed separately.
-
-Declarations
-============
-
-Declarations introduce new entities into llgoi's scope. For example, entering
-``x := 1`` introduces into the scope a variable named ``x`` with an initial
-value of 1. In addition to short variable declarations (i.e. variables declared
-with ``:=``), llgoi supports constant declarations, function declarations,
-variable declarations and type declarations.
-
-Imports
-=======
-
-To import a package, enter ``import`` followed by the name of a package
-surrounded by quotes. This introduces the package name into llgoi's
-scope. The package may be a standard library package, or a source package on
-``$GOPATH``. In the latter case, llgoi will first compile the package and
-its dependencies.
-
-Statements
-==========
-
-Aside from declarations and expressions, the following kinds of statements
-can be evaluated by entering them at the llgoi prompt: IncDec statements,
-assignments, go statements, blocks, if statements, switch statements, select
-statements and for statements.
diff --git a/docs/make.bat b/docs/make.bat
deleted file mode 100644
index 449a79d..0000000
--- a/docs/make.bat
+++ /dev/null
@@ -1,242 +0,0 @@
-@ECHO OFF

-

-REM Command file for Sphinx documentation

-

-if "%SPHINXBUILD%" == "" (

-	set SPHINXBUILD=sphinx-build

-)

-set BUILDDIR=_build

-set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .

-set I18NSPHINXOPTS=%SPHINXOPTS% .

-if NOT "%PAPER%" == "" (

-	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%

-	set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%

-)

-

-if "%1" == "" goto help

-

-if "%1" == "help" (

-	:help

-	echo.Please use `make ^<target^>` where ^<target^> is one of

-	echo.  html       to make standalone HTML files

-	echo.  dirhtml    to make HTML files named index.html in directories

-	echo.  singlehtml to make a single large HTML file

-	echo.  pickle     to make pickle files

-	echo.  json       to make JSON files

-	echo.  htmlhelp   to make HTML files and a HTML help project

-	echo.  qthelp     to make HTML files and a qthelp project

-	echo.  devhelp    to make HTML files and a Devhelp project

-	echo.  epub       to make an epub

-	echo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter

-	echo.  text       to make text files

-	echo.  man        to make manual pages

-	echo.  texinfo    to make Texinfo files

-	echo.  gettext    to make PO message catalogs

-	echo.  changes    to make an overview over all changed/added/deprecated items

-	echo.  xml        to make Docutils-native XML files

-	echo.  pseudoxml  to make pseudoxml-XML files for display purposes

-	echo.  linkcheck  to check all external links for integrity

-	echo.  doctest    to run all doctests embedded in the documentation if enabled

-	goto end

-)

-

-if "%1" == "clean" (

-	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i

-	del /q /s %BUILDDIR%\*

-	goto end

-)

-

-

-%SPHINXBUILD% 2> nul

-if errorlevel 9009 (

-	echo.

-	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx

-	echo.installed, then set the SPHINXBUILD environment variable to point

-	echo.to the full path of the 'sphinx-build' executable. Alternatively you

-	echo.may add the Sphinx directory to PATH.

-	echo.

-	echo.If you don't have Sphinx installed, grab it from

-	echo.http://sphinx-doc.org/

-	exit /b 1

-)

-

-if "%1" == "html" (

-	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished. The HTML pages are in %BUILDDIR%/html.

-	goto end

-)

-

-if "%1" == "dirhtml" (

-	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.

-	goto end

-)

-

-if "%1" == "singlehtml" (

-	%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.

-	goto end

-)

-

-if "%1" == "pickle" (

-	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished; now you can process the pickle files.

-	goto end

-)

-

-if "%1" == "json" (

-	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished; now you can process the JSON files.

-	goto end

-)

-

-if "%1" == "htmlhelp" (

-	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished; now you can run HTML Help Workshop with the ^

-.hhp project file in %BUILDDIR%/htmlhelp.

-	goto end

-)

-

-if "%1" == "qthelp" (

-	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished; now you can run "qcollectiongenerator" with the ^

-.qhcp project file in %BUILDDIR%/qthelp, like this:

-	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\llgo.qhcp

-	echo.To view the help file:

-	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\llgo.ghc

-	goto end

-)

-

-if "%1" == "devhelp" (

-	%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished.

-	goto end

-)

-

-if "%1" == "epub" (

-	%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished. The epub file is in %BUILDDIR%/epub.

-	goto end

-)

-

-if "%1" == "latex" (

-	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.

-	goto end

-)

-

-if "%1" == "latexpdf" (

-	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex

-	cd %BUILDDIR%/latex

-	make all-pdf

-	cd %BUILDDIR%/..

-	echo.

-	echo.Build finished; the PDF files are in %BUILDDIR%/latex.

-	goto end

-)

-

-if "%1" == "latexpdfja" (

-	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex

-	cd %BUILDDIR%/latex

-	make all-pdf-ja

-	cd %BUILDDIR%/..

-	echo.

-	echo.Build finished; the PDF files are in %BUILDDIR%/latex.

-	goto end

-)

-

-if "%1" == "text" (

-	%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished. The text files are in %BUILDDIR%/text.

-	goto end

-)

-

-if "%1" == "man" (

-	%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished. The manual pages are in %BUILDDIR%/man.

-	goto end

-)

-

-if "%1" == "texinfo" (

-	%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.

-	goto end

-)

-

-if "%1" == "gettext" (

-	%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished. The message catalogs are in %BUILDDIR%/locale.

-	goto end

-)

-

-if "%1" == "changes" (

-	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.The overview file is in %BUILDDIR%/changes.

-	goto end

-)

-

-if "%1" == "linkcheck" (

-	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Link check complete; look for any errors in the above output ^

-or in %BUILDDIR%/linkcheck/output.txt.

-	goto end

-)

-

-if "%1" == "doctest" (

-	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Testing of doctests in the sources finished, look at the ^

-results in %BUILDDIR%/doctest/output.txt.

-	goto end

-)

-

-if "%1" == "xml" (

-	%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished. The XML files are in %BUILDDIR%/xml.

-	goto end

-)

-

-if "%1" == "pseudoxml" (

-	%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml

-	if errorlevel 1 exit /b 1

-	echo.

-	echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.

-	goto end

-)

-

-:end

diff --git a/driver/parser.go b/driver/parser.go
deleted file mode 100644
index 94ae3fd..0000000
--- a/driver/parser.go
+++ /dev/null
@@ -1,42 +0,0 @@
-//===- parser.go - parser wrapper -----------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file contains functions for calling the parser in an appropriate way for
-// llgo.
-//
-//===----------------------------------------------------------------------===//
-
-package driver
-
-import (
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/scanner"
-	"go/token"
-)
-
-func parseFile(fset *token.FileSet, filename string) (*ast.File, error) {
-	// Retain comments; this is important for annotation processing.
-	mode := parser.DeclarationErrors | parser.ParseComments
-	return parser.ParseFile(fset, filename, nil, mode)
-}
-
-func ParseFiles(fset *token.FileSet, filenames []string) ([]*ast.File, error) {
-	files := make([]*ast.File, len(filenames))
-	for i, filename := range filenames {
-		file, err := parseFile(fset, filename)
-		if _, ok := err.(scanner.ErrorList); ok {
-			return nil, err
-		} else if err != nil {
-			return nil, fmt.Errorf("%q: %v", filename, err)
-		}
-		files[i] = file
-	}
-	return files, nil
-}
diff --git a/include/dwarf2.h b/include/dwarf2.h
deleted file mode 100644
index 9824fc0..0000000
--- a/include/dwarf2.h
+++ /dev/null
@@ -1,93 +0,0 @@
-//===----------------------------- dwarf2.h -------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-// DWARF constants. Derived from:
-//   - libcxxabi/src/Unwind/dwarf2.h
-//   - DWARF 4 specification
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef DWARF2_H
-#define DWARF2_H
-
-enum dwarf_attribute {
-  DW_AT_name = 0x03,
-  DW_AT_stmt_list = 0x10,
-  DW_AT_low_pc = 0x11,
-  DW_AT_high_pc = 0x12,
-  DW_AT_comp_dir = 0x1b,
-  DW_AT_abstract_origin = 0x31,
-  DW_AT_specification = 0x47,
-  DW_AT_ranges = 0x55,
-  DW_AT_call_file = 0x58,
-  DW_AT_call_line = 0x59,
-  DW_AT_linkage_name = 0x6e,
-  DW_AT_MIPS_linkage_name = 0x2007
-};
-
-enum dwarf_form {
-  DW_FORM_addr = 0x01,
-  DW_FORM_block2 = 0x03,
-  DW_FORM_block4 = 0x04,
-  DW_FORM_data2 = 0x05,
-  DW_FORM_data4 = 0x06,
-  DW_FORM_data8 = 0x07,
-  DW_FORM_string = 0x08,
-  DW_FORM_block = 0x09,
-  DW_FORM_block1 = 0x0a,
-  DW_FORM_data1 = 0x0b,
-  DW_FORM_flag = 0x0c,
-  DW_FORM_sdata = 0x0d,
-  DW_FORM_strp = 0x0e,
-  DW_FORM_udata = 0x0f,
-  DW_FORM_ref_addr = 0x10,
-  DW_FORM_ref1 = 0x11,
-  DW_FORM_ref2 = 0x12,
-  DW_FORM_ref4 = 0x13,
-  DW_FORM_ref8 = 0x14,
-  DW_FORM_ref_udata = 0x15,
-  DW_FORM_indirect = 0x16,
-  DW_FORM_sec_offset = 0x17,
-  DW_FORM_exprloc = 0x18,
-  DW_FORM_flag_present = 0x19,
-  DW_FORM_ref_sig8 = 0x20,
-  DW_FORM_GNU_addr_index = 0x1f01,
-  DW_FORM_GNU_str_index = 0x1f02,
-  DW_FORM_GNU_ref_alt = 0x1f20,
-  DW_FORM_GNU_strp_alt = 0x1f21
-};
-
-enum dwarf_tag {
-  DW_TAG_entry_point = 0x03,
-  DW_TAG_compile_unit = 0x11,
-  DW_TAG_inlined_subroutine = 0x1d,
-  DW_TAG_subprogram = 0x2e
-};
-
-enum dwarf_lns {
-  DW_LNS_extended_op = 0x00,
-  DW_LNS_copy = 0x01,
-  DW_LNS_advance_pc = 0x02,
-  DW_LNS_advance_line = 0x03,
-  DW_LNS_set_file = 0x04,
-  DW_LNS_set_column = 0x05,
-  DW_LNS_negate_stmt = 0x06,
-  DW_LNS_set_basic_block = 0x07,
-  DW_LNS_const_add_pc = 0x08,
-  DW_LNS_fixed_advance_pc = 0x09,
-  DW_LNS_set_prologue_end = 0x0a,
-  DW_LNS_set_epilogue_begin = 0x0b,
-  DW_LNS_set_isa = 0x0c
-};
-
-enum dwarf_lne {
-  DW_LNE_end_sequence = 0x01,
-  DW_LNE_set_address = 0x02,
-  DW_LNE_define_file = 0x03,
-  DW_LNE_set_discriminator = 0x04
-};
-
-#endif  // DWARF2_H
diff --git a/include/filenames.h b/include/filenames.h
deleted file mode 100644
index 005b302..0000000
--- a/include/filenames.h
+++ /dev/null
@@ -1,14 +0,0 @@
-//===----------------------------- filenames.h ----------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef FILENAMES_H
-#define FILENAMES_H
-
-#define IS_ABSOLUTE_PATH(path) ((path)[0] == '/')
-
-#endif
diff --git a/include/unwind-pe.h b/include/unwind-pe.h
deleted file mode 100644
index 8655a92..0000000
--- a/include/unwind-pe.h
+++ /dev/null
@@ -1,200 +0,0 @@
-//===----------------------------- unwind-pe.h ----------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-// Pointer-Encoding decoder. Derived from:
-//   - libcxxabi/src/Unwind/dwarf2.h
-//   - libcxxabi/src/Unwind/AddressSpace.h
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef UNWIND_PE_H
-#define UNWIND_PE_H
-
-#include <assert.h>
-#include <stdint.h>
-#include <string.h>
-
-// FSF exception handling Pointer-Encoding constants
-// Used in CFI augmentation by GCC
-enum {
-  DW_EH_PE_ptr       = 0x00,
-  DW_EH_PE_uleb128   = 0x01,
-  DW_EH_PE_udata2    = 0x02,
-  DW_EH_PE_udata4    = 0x03,
-  DW_EH_PE_udata8    = 0x04,
-  DW_EH_PE_signed    = 0x08,
-  DW_EH_PE_sleb128   = 0x09,
-  DW_EH_PE_sdata2    = 0x0A,
-  DW_EH_PE_sdata4    = 0x0B,
-  DW_EH_PE_sdata8    = 0x0C,
-  DW_EH_PE_absptr    = 0x00,
-  DW_EH_PE_pcrel     = 0x10,
-  DW_EH_PE_textrel   = 0x20,
-  DW_EH_PE_datarel   = 0x30,
-  DW_EH_PE_funcrel   = 0x40,
-  DW_EH_PE_aligned   = 0x50,
-  DW_EH_PE_indirect  = 0x80,
-  DW_EH_PE_omit      = 0xFF
-};
-
-/// Read a ULEB128 into a 64-bit word.
-static uint64_t unw_getULEB128(uintptr_t *addr) {
-  const uint8_t *p = (uint8_t *)*addr;
-  uint64_t result = 0;
-  int bit = 0;
-  do {
-    uint64_t b;
-
-    b = *p & 0x7f;
-
-    if (bit >= 64 || b << bit >> bit != b) {
-      assert(!"malformed uleb128 expression");
-    } else {
-      result |= b << bit;
-      bit += 7;
-    }
-  } while (*p++ >= 0x80);
-  *addr = (uintptr_t) p;
-  return result;
-}
-
-/// Read a SLEB128 into a 64-bit word.
-static int64_t unw_getSLEB128(uintptr_t *addr) {
-  const uint8_t *p = (uint8_t *)addr;
-  int64_t result = 0;
-  int bit = 0;
-  uint8_t byte;
-  do {
-    byte = *p++;
-    result |= ((byte & 0x7f) << bit);
-    bit += 7;
-  } while (byte & 0x80);
-  // sign extend negative numbers
-  if ((byte & 0x40) != 0)
-    result |= (-1LL) << bit;
-  *addr = (uintptr_t) p;
-  return result;
-}
-
-static uint16_t unw_get16(uintptr_t addr) {
-  uint16_t val;
-  memcpy(&val, (void *)addr, sizeof(val));
-  return val;
-}
-
-static uint32_t unw_get32(uintptr_t addr) {
-  uint32_t val;
-  memcpy(&val, (void *)addr, sizeof(val));
-  return val;
-}
-
-static uint64_t unw_get64(uintptr_t addr) {
-  uint64_t val;
-  memcpy(&val, (void *)addr, sizeof(val));
-  return val;
-}
-
-static uintptr_t unw_getP(uintptr_t addr) {
-  if (sizeof(uintptr_t) == 8)
-    return unw_get64(addr);
-  else
-    return unw_get32(addr);
-}
-
-static const unsigned char *read_uleb128(const unsigned char *p,
-                                         _uleb128_t *ret) {
-  uintptr_t addr = (uintptr_t)p;
-  *ret = unw_getULEB128(&addr);
-  return (unsigned char *)addr;
-}
-
-static const unsigned char *read_encoded_value(struct _Unwind_Context *ctx,
-                                               unsigned char encoding,
-                                               const unsigned char *p,
-                                               _Unwind_Ptr *ret) {
-  uintptr_t addr = (uintptr_t)p;
-  uintptr_t startAddr = addr;
-  uintptr_t result;
-
-  (void)ctx;
-
-  // first get value
-  switch (encoding & 0x0F) {
-  case DW_EH_PE_ptr:
-    result = unw_getP(addr);
-    p += sizeof(uintptr_t);
-    break;
-  case DW_EH_PE_uleb128:
-    result = (uintptr_t)unw_getULEB128(&addr);
-    p = (const unsigned char *)addr;
-    break;
-  case DW_EH_PE_udata2:
-    result = unw_get16(addr);
-    p += 2;
-    break;
-  case DW_EH_PE_udata4:
-    result = unw_get32(addr);
-    p += 4;
-    break;
-  case DW_EH_PE_udata8:
-    result = (uintptr_t)unw_get64(addr);
-    p += 8;
-    break;
-  case DW_EH_PE_sleb128:
-    result = (uintptr_t)unw_getSLEB128(&addr);
-    p = (const unsigned char *)addr;
-    break;
-  case DW_EH_PE_sdata2:
-    // Sign extend from signed 16-bit value.
-    result = (uintptr_t)(int16_t)unw_get16(addr);
-    p += 2;
-    break;
-  case DW_EH_PE_sdata4:
-    // Sign extend from signed 32-bit value.
-    result = (uintptr_t)(int32_t)unw_get32(addr);
-    p += 4;
-    break;
-  case DW_EH_PE_sdata8:
-    result = (uintptr_t)unw_get64(addr);
-    p += 8;
-    break;
-  default:
-    assert(!"unknown pointer encoding");
-  }
-
-  // then add relative offset
-  switch (encoding & 0x70) {
-  case DW_EH_PE_absptr:
-    // do nothing
-    break;
-  case DW_EH_PE_pcrel:
-    result += startAddr;
-    break;
-  case DW_EH_PE_textrel:
-    assert(!"DW_EH_PE_textrel pointer encoding not supported");
-    break;
-  case DW_EH_PE_datarel:
-    assert(!"DW_EH_PE_datarel pointer encoding not supported");
-    break;
-  case DW_EH_PE_funcrel:
-    assert(!"DW_EH_PE_funcrel pointer encoding not supported");
-    break;
-  case DW_EH_PE_aligned:
-    assert(!"DW_EH_PE_aligned pointer encoding not supported");
-    break;
-  default:
-    assert(!"unknown pointer encoding");
-    break;
-  }
-
-  if (encoding & DW_EH_PE_indirect)
-    result = unw_getP(result);
-
-  *ret = result;
-  return p;
-}
-
-#endif  // UNWIND_PE_H
diff --git a/irgen/annotations.go b/irgen/annotations.go
deleted file mode 100644
index 5bda7a1..0000000
--- a/irgen/annotations.go
+++ /dev/null
@@ -1,63 +0,0 @@
-//===- annotations.go - annotation processor ------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file converts llgo annotations into attributes.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"go/ast"
-	"go/token"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-// processAnnotations takes an *ssa.Package and a
-// *importer.PackageInfo, and processes all of the
-// llgo source annotations attached to each top-level
-// function and global variable.
-func (c *compiler) processAnnotations(u *unit, pkginfo *loader.PackageInfo) {
-	members := make(map[types.Object]llvm.Value, len(u.globals))
-	for k, v := range u.globals {
-		members[k.(ssa.Member).Object()] = v
-	}
-	applyAttributes := func(attrs []Attribute, idents ...*ast.Ident) {
-		if len(attrs) == 0 {
-			return
-		}
-		for _, ident := range idents {
-			if v := members[pkginfo.ObjectOf(ident)]; !v.IsNil() {
-				for _, attr := range attrs {
-					attr.Apply(v)
-				}
-			}
-		}
-	}
-	for _, f := range pkginfo.Files {
-		for _, decl := range f.Decls {
-			switch decl := decl.(type) {
-			case *ast.FuncDecl:
-				attrs := parseAttributes(decl.Doc)
-				applyAttributes(attrs, decl.Name)
-			case *ast.GenDecl:
-				if decl.Tok != token.VAR {
-					continue
-				}
-				for _, spec := range decl.Specs {
-					varspec := spec.(*ast.ValueSpec)
-					attrs := parseAttributes(decl.Doc)
-					applyAttributes(attrs, varspec.Names...)
-				}
-			}
-		}
-	}
-}
diff --git a/irgen/attribute.go b/irgen/attribute.go
deleted file mode 100644
index e986e5e..0000000
--- a/irgen/attribute.go
+++ /dev/null
@@ -1,146 +0,0 @@
-//===- attribute.go - attribute processor ---------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file processes llgo and //extern attributes.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"fmt"
-	"go/ast"
-	"llvm.org/llvm/bindings/go/llvm"
-	"strings"
-)
-
-const AttributeCommentPrefix = "#llgo "
-
-// Attribute represents an attribute associated with a
-// global variable or function.
-type Attribute interface {
-	Apply(llvm.Value)
-}
-
-// parseAttribute parses zero or more #llgo comment attributes associated with
-// a global variable or function. The comment group provided will be processed
-// one line at a time using parseAttribute.
-func parseAttributes(doc *ast.CommentGroup) []Attribute {
-	var attributes []Attribute
-	if doc == nil {
-		return attributes
-	}
-	for _, comment := range doc.List {
-		if strings.HasPrefix(comment.Text, "//extern ") {
-			nameattr := nameAttribute(strings.TrimSpace(comment.Text[9:]))
-			attributes = append(attributes, nameattr)
-			continue
-		}
-		text := comment.Text[2:]
-		if strings.HasPrefix(comment.Text, "/*") {
-			text = text[:len(text)-2]
-		}
-		attr := parseAttribute(strings.TrimSpace(text))
-		if attr != nil {
-			attributes = append(attributes, attr)
-		}
-	}
-	return attributes
-}
-
-// parseAttribute parses a single #llgo comment attribute associated with
-// a global variable or function. The string provided will be parsed
-// if it begins with AttributeCommentPrefix, otherwise nil is returned.
-func parseAttribute(line string) Attribute {
-	if !strings.HasPrefix(line, AttributeCommentPrefix) {
-		return nil
-	}
-	line = strings.TrimSpace(line[len(AttributeCommentPrefix):])
-	colon := strings.IndexRune(line, ':')
-	var key, value string
-	if colon == -1 {
-		key = line
-	} else {
-		key, value = line[:colon], line[colon+1:]
-	}
-	switch key {
-	case "linkage":
-		return parseLinkageAttribute(value)
-	case "name":
-		return nameAttribute(strings.TrimSpace(value))
-	case "thread_local":
-		return tlsAttribute{}
-	default:
-		// FIXME decide what to do here. return error? log warning?
-		panic("unknown attribute key: " + key)
-	}
-	return nil
-}
-
-type linkageAttribute llvm.Linkage
-
-func (a linkageAttribute) Apply(v llvm.Value) {
-	v.SetLinkage(llvm.Linkage(a))
-}
-
-func parseLinkageAttribute(value string) linkageAttribute {
-	var result linkageAttribute
-	value = strings.Replace(value, ",", " ", -1)
-	for _, field := range strings.Fields(value) {
-		switch strings.ToLower(field) {
-		case "private":
-			result |= linkageAttribute(llvm.PrivateLinkage)
-		case "internal":
-			result |= linkageAttribute(llvm.InternalLinkage)
-		case "available_externally":
-			result |= linkageAttribute(llvm.AvailableExternallyLinkage)
-		case "linkonce":
-			result |= linkageAttribute(llvm.LinkOnceAnyLinkage)
-		case "common":
-			result |= linkageAttribute(llvm.CommonLinkage)
-		case "weak":
-			result |= linkageAttribute(llvm.WeakAnyLinkage)
-		case "appending":
-			result |= linkageAttribute(llvm.AppendingLinkage)
-		case "extern_weak":
-			result |= linkageAttribute(llvm.ExternalWeakLinkage)
-		case "linkonce_odr":
-			result |= linkageAttribute(llvm.LinkOnceODRLinkage)
-		case "weak_odr":
-			result |= linkageAttribute(llvm.WeakODRLinkage)
-		case "external":
-			result |= linkageAttribute(llvm.ExternalLinkage)
-		}
-	}
-	return result
-}
-
-type nameAttribute string
-
-func (a nameAttribute) Apply(v llvm.Value) {
-	if !v.IsAFunction().IsNil() {
-		name := string(a)
-		curr := v.GlobalParent().NamedFunction(name)
-		if !curr.IsNil() && curr != v {
-			if curr.BasicBlocksCount() != 0 {
-				panic(fmt.Errorf("Want to take the name %s from a function that has a body!", name))
-			}
-			curr.SetName(name + "_llgo_replaced")
-			curr.ReplaceAllUsesWith(llvm.ConstBitCast(v, curr.Type()))
-		}
-		v.SetName(name)
-	} else {
-		v.SetName(string(a))
-	}
-}
-
-type tlsAttribute struct{}
-
-func (tlsAttribute) Apply(v llvm.Value) {
-	v.SetThreadLocal(true)
-}
diff --git a/irgen/builtins.go b/irgen/builtins.go
deleted file mode 100644
index 7a33ef0..0000000
--- a/irgen/builtins.go
+++ /dev/null
@@ -1,117 +0,0 @@
-//===- builtins.go - IR generation for builtins ---------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements IR generation for the built-in functions.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-func (fr *frame) callCap(arg *govalue) *govalue {
-	var v llvm.Value
-	switch typ := arg.Type().Underlying().(type) {
-	case *types.Array:
-		v = llvm.ConstInt(fr.llvmtypes.inttype, uint64(typ.Len()), false)
-	case *types.Pointer:
-		atyp := typ.Elem().Underlying().(*types.Array)
-		v = llvm.ConstInt(fr.llvmtypes.inttype, uint64(atyp.Len()), false)
-	case *types.Slice:
-		v = fr.builder.CreateExtractValue(arg.value, 2, "")
-	case *types.Chan:
-		v = fr.runtime.chanCap.call(fr, arg.value)[0]
-	}
-	return newValue(v, types.Typ[types.Int])
-}
-
-func (fr *frame) callLen(arg *govalue) *govalue {
-	var lenvalue llvm.Value
-	switch typ := arg.Type().Underlying().(type) {
-	case *types.Array:
-		lenvalue = llvm.ConstInt(fr.llvmtypes.inttype, uint64(typ.Len()), false)
-	case *types.Pointer:
-		atyp := typ.Elem().Underlying().(*types.Array)
-		lenvalue = llvm.ConstInt(fr.llvmtypes.inttype, uint64(atyp.Len()), false)
-	case *types.Slice:
-		lenvalue = fr.builder.CreateExtractValue(arg.value, 1, "")
-	case *types.Map:
-		lenvalue = fr.runtime.mapLen.call(fr, arg.value)[0]
-	case *types.Basic:
-		if isString(typ) {
-			lenvalue = fr.builder.CreateExtractValue(arg.value, 1, "")
-		}
-	case *types.Chan:
-		lenvalue = fr.runtime.chanLen.call(fr, arg.value)[0]
-	}
-	return newValue(lenvalue, types.Typ[types.Int])
-}
-
-// callAppend takes two slices of the same type, and yields
-// the result of appending the second to the first.
-func (fr *frame) callAppend(a, b *govalue) *govalue {
-	bptr := fr.builder.CreateExtractValue(b.value, 0, "")
-	blen := fr.builder.CreateExtractValue(b.value, 1, "")
-	elemsizeInt64 := fr.types.Sizeof(a.Type().Underlying().(*types.Slice).Elem())
-	elemsize := llvm.ConstInt(fr.target.IntPtrType(), uint64(elemsizeInt64), false)
-	result := fr.runtime.append.call(fr, a.value, bptr, blen, elemsize)[0]
-	return newValue(result, a.Type())
-}
-
-// callCopy takes two slices a and b of the same type, and
-// yields the result of calling "copy(a, b)".
-func (fr *frame) callCopy(dest, source *govalue) *govalue {
-	aptr := fr.builder.CreateExtractValue(dest.value, 0, "")
-	alen := fr.builder.CreateExtractValue(dest.value, 1, "")
-	bptr := fr.builder.CreateExtractValue(source.value, 0, "")
-	blen := fr.builder.CreateExtractValue(source.value, 1, "")
-	aless := fr.builder.CreateICmp(llvm.IntULT, alen, blen, "")
-	minlen := fr.builder.CreateSelect(aless, alen, blen, "")
-	elemsizeInt64 := fr.types.Sizeof(dest.Type().Underlying().(*types.Slice).Elem())
-	elemsize := llvm.ConstInt(fr.types.inttype, uint64(elemsizeInt64), false)
-	bytes := fr.builder.CreateMul(minlen, elemsize, "")
-	fr.runtime.copy.call(fr, aptr, bptr, bytes)
-	return newValue(minlen, types.Typ[types.Int])
-}
-
-func (fr *frame) callRecover(isDeferredRecover bool) *govalue {
-	startbb := fr.builder.GetInsertBlock()
-	recoverbb := llvm.AddBasicBlock(fr.function, "")
-	contbb := llvm.AddBasicBlock(fr.function, "")
-	canRecover := fr.builder.CreateTrunc(fr.canRecover, llvm.Int1Type(), "")
-	fr.builder.CreateCondBr(canRecover, recoverbb, contbb)
-
-	fr.builder.SetInsertPointAtEnd(recoverbb)
-	var recovered llvm.Value
-	if isDeferredRecover {
-		recovered = fr.runtime.deferredRecover.call(fr)[0]
-	} else {
-		recovered = fr.runtime.recover.call(fr)[0]
-	}
-	recoverbb = fr.builder.GetInsertBlock()
-	fr.builder.CreateBr(contbb)
-
-	fr.builder.SetInsertPointAtEnd(contbb)
-	eface := types.NewInterface(nil, nil)
-	llv := fr.builder.CreatePHI(fr.types.ToLLVM(eface), "")
-	llv.AddIncoming(
-		[]llvm.Value{llvm.ConstNull(llv.Type()), recovered},
-		[]llvm.BasicBlock{startbb, recoverbb},
-	)
-	return newValue(llv, eface)
-}
-
-func (fr *frame) callPanic(arg *govalue, term bool) {
-	fr.runtime.panic.call(fr, arg.value)
-	if term {
-		fr.builder.CreateUnreachable()
-	}
-}
diff --git a/irgen/cabi.go b/irgen/cabi.go
deleted file mode 100644
index 02def37..0000000
--- a/irgen/cabi.go
+++ /dev/null
@@ -1,695 +0,0 @@
-//===- cabi.go - C ABI abstraction layer ----------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements an abstraction layer for the platform's C ABI (currently
-// supports only Linux/x86_64).
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-type abiArgInfo int
-
-const (
-	AIK_Direct = abiArgInfo(iota)
-	AIK_Indirect
-)
-
-type backendType interface {
-	ToLLVM(llvm.Context) llvm.Type
-}
-
-type ptrBType struct {
-}
-
-func (t ptrBType) ToLLVM(c llvm.Context) llvm.Type {
-	return llvm.PointerType(c.Int8Type(), 0)
-}
-
-type intBType struct {
-	width  int
-	signed bool
-}
-
-func (t intBType) ToLLVM(c llvm.Context) llvm.Type {
-	return c.IntType(t.width * 8)
-}
-
-type floatBType struct {
-	isDouble bool
-}
-
-func (t floatBType) ToLLVM(c llvm.Context) llvm.Type {
-	if t.isDouble {
-		return c.DoubleType()
-	} else {
-		return c.FloatType()
-	}
-}
-
-type structBType struct {
-	fields []backendType
-}
-
-func (t structBType) ToLLVM(c llvm.Context) llvm.Type {
-	var lfields []llvm.Type
-	for _, f := range t.fields {
-		lfields = append(lfields, f.ToLLVM(c))
-	}
-	return c.StructType(lfields, false)
-}
-
-type arrayBType struct {
-	length uint64
-	elem   backendType
-}
-
-func (t arrayBType) ToLLVM(c llvm.Context) llvm.Type {
-	return llvm.ArrayType(t.elem.ToLLVM(c), int(t.length))
-}
-
-// align returns the smallest y >= x such that y % a == 0.
-func align(x, a int64) int64 {
-	y := x + a - 1
-	return y - y%a
-}
-
-func (tm *llvmTypeMap) sizeofStruct(fields ...types.Type) int64 {
-	var o int64
-	for _, f := range fields {
-		a := tm.Alignof(f)
-		o = align(o, a)
-		o += tm.Sizeof(f)
-	}
-	return o
-}
-
-// This decides whether the x86_64 classification algorithm produces MEMORY for
-// the given type. Given the subset of types that Go supports, this is exactly
-// equivalent to testing the type's size.  See in particular the first step of
-// the algorithm and its footnote.
-func (tm *llvmTypeMap) classify(t ...types.Type) abiArgInfo {
-	if tm.sizeofStruct(t...) > 16 {
-		return AIK_Indirect
-	}
-	return AIK_Direct
-}
-
-func (tm *llvmTypeMap) sliceBackendType() backendType {
-	i8ptr := &ptrBType{}
-	uintptr := &intBType{tm.target.PointerSize(), false}
-	return &structBType{[]backendType{i8ptr, uintptr, uintptr}}
-}
-
-func (tm *llvmTypeMap) getBackendType(t types.Type) backendType {
-	switch t := t.(type) {
-	case *types.Named:
-		return tm.getBackendType(t.Underlying())
-
-	case *types.Basic:
-		switch t.Kind() {
-		case types.Bool, types.Uint8:
-			return &intBType{1, false}
-		case types.Int8:
-			return &intBType{1, true}
-		case types.Uint16:
-			return &intBType{2, false}
-		case types.Int16:
-			return &intBType{2, true}
-		case types.Uint32:
-			return &intBType{4, false}
-		case types.Int32:
-			return &intBType{4, true}
-		case types.Uint64:
-			return &intBType{8, false}
-		case types.Int64:
-			return &intBType{8, true}
-		case types.Uint, types.Uintptr:
-			return &intBType{tm.target.PointerSize(), false}
-		case types.Int:
-			return &intBType{tm.target.PointerSize(), true}
-		case types.Float32:
-			return &floatBType{false}
-		case types.Float64:
-			return &floatBType{true}
-		case types.UnsafePointer:
-			return &ptrBType{}
-		case types.Complex64:
-			f32 := &floatBType{false}
-			return &structBType{[]backendType{f32, f32}}
-		case types.Complex128:
-			f64 := &floatBType{true}
-			return &structBType{[]backendType{f64, f64}}
-		case types.String:
-			return &structBType{[]backendType{&ptrBType{}, &intBType{tm.target.PointerSize(), false}}}
-		}
-
-	case *types.Struct:
-		var fields []backendType
-		for i := 0; i != t.NumFields(); i++ {
-			f := t.Field(i)
-			fields = append(fields, tm.getBackendType(f.Type()))
-		}
-		return &structBType{fields}
-
-	case *types.Pointer, *types.Signature, *types.Map, *types.Chan:
-		return &ptrBType{}
-
-	case *types.Interface:
-		i8ptr := &ptrBType{}
-		return &structBType{[]backendType{i8ptr, i8ptr}}
-
-	case *types.Slice:
-		return tm.sliceBackendType()
-
-	case *types.Array:
-		return &arrayBType{uint64(t.Len()), tm.getBackendType(t.Elem())}
-	}
-
-	panic("unhandled type: " + t.String())
-}
-
-type offsetedType struct {
-	typ    backendType
-	offset uint64
-}
-
-func (tm *llvmTypeMap) getBackendOffsets(bt backendType) (offsets []offsetedType) {
-	switch bt := bt.(type) {
-	case *structBType:
-		t := bt.ToLLVM(tm.ctx)
-		for i, f := range bt.fields {
-			offset := tm.target.ElementOffset(t, i)
-			fieldOffsets := tm.getBackendOffsets(f)
-			for _, fo := range fieldOffsets {
-				offsets = append(offsets, offsetedType{fo.typ, offset + fo.offset})
-			}
-		}
-
-	case *arrayBType:
-		size := tm.target.TypeAllocSize(bt.elem.ToLLVM(tm.ctx))
-		fieldOffsets := tm.getBackendOffsets(bt.elem)
-		for i := uint64(0); i != bt.length; i++ {
-			for _, fo := range fieldOffsets {
-				offsets = append(offsets, offsetedType{fo.typ, i*size + fo.offset})
-			}
-		}
-
-	default:
-		offsets = []offsetedType{offsetedType{bt, 0}}
-	}
-
-	return
-}
-
-func (tm *llvmTypeMap) classifyEightbyte(offsets []offsetedType, numInt, numSSE *int) llvm.Type {
-	if len(offsets) == 1 {
-		if _, ok := offsets[0].typ.(*floatBType); ok {
-			*numSSE++
-		} else {
-			*numInt++
-		}
-		return offsets[0].typ.ToLLVM(tm.ctx)
-	}
-	// This implements classification for the basic types and step 4 of the
-	// classification algorithm. At this point, the only two possible
-	// classifications are SSE (floats) and INTEGER (everything else).
-	sse := true
-	for _, ot := range offsets {
-		if _, ok := ot.typ.(*floatBType); !ok {
-			sse = false
-			break
-		}
-	}
-	if sse {
-		// This can only be (float, float), which uses an SSE vector.
-		*numSSE++
-		return llvm.VectorType(tm.ctx.FloatType(), 2)
-	} else {
-		*numInt++
-		width := offsets[len(offsets)-1].offset + tm.target.TypeAllocSize(offsets[len(offsets)-1].typ.ToLLVM(tm.ctx)) - offsets[0].offset
-		return tm.ctx.IntType(int(width) * 8)
-	}
-}
-
-func (tm *llvmTypeMap) expandType(argTypes []llvm.Type, argAttrs []llvm.Attribute, bt backendType) ([]llvm.Type, []llvm.Attribute, int, int) {
-	var numInt, numSSE int
-	var argAttr llvm.Attribute
-
-	switch bt := bt.(type) {
-	case *structBType, *arrayBType:
-		noneAttr := tm.ctx.CreateEnumAttribute(0, 0)
-		bo := tm.getBackendOffsets(bt)
-		sp := 0
-		for sp != len(bo) && bo[sp].offset < 8 {
-			sp++
-		}
-		eb1 := bo[0:sp]
-		eb2 := bo[sp:]
-		if len(eb2) > 0 {
-			argTypes = append(argTypes, tm.classifyEightbyte(eb1, &numInt, &numSSE), tm.classifyEightbyte(eb2, &numInt, &numSSE))
-			argAttrs = append(argAttrs, noneAttr, noneAttr)
-		} else {
-			argTypes = append(argTypes, tm.classifyEightbyte(eb1, &numInt, &numSSE))
-			argAttrs = append(argAttrs, noneAttr)
-		}
-
-		return argTypes, argAttrs, numInt, numSSE
-
-	case *intBType:
-		if bt.width < 4 {
-			var argAttrKind uint
-			if bt.signed {
-				argAttrKind = llvm.AttributeKindID("signext")
-			} else {
-				argAttrKind = llvm.AttributeKindID("zeroext")
-			}
-			argAttr = tm.ctx.CreateEnumAttribute(argAttrKind, 0)
-		}
-	}
-
-	argTypes = append(argTypes, tm.classifyEightbyte([]offsetedType{{bt, 0}}, &numInt, &numSSE))
-	argAttrs = append(argAttrs, argAttr)
-
-	return argTypes, argAttrs, numInt, numSSE
-}
-
-type argInfo interface {
-	// Emit instructions to builder to ABI encode val and store result to args.
-	encode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, args []llvm.Value, val llvm.Value)
-
-	// Emit instructions to builder to ABI decode and return the resulting Value.
-	decode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder) llvm.Value
-}
-
-type retInfo interface {
-	// Prepare args to receive a value. allocaBuilder refers to a builder in the entry block.
-	prepare(ctx llvm.Context, allocaBuilder llvm.Builder, args []llvm.Value)
-
-	// Emit instructions to builder to ABI decode the return value(s), if any. call is the
-	// call instruction. Must be called after prepare().
-	decode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, call llvm.Value) []llvm.Value
-
-	// Emit instructions to builder to ABI encode the return value(s), if any, and return.
-	encode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, vals []llvm.Value)
-}
-
-type directArgInfo struct {
-	argOffset int
-	argTypes  []llvm.Type
-	valType   llvm.Type
-}
-
-func directEncode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, argTypes []llvm.Type, args []llvm.Value, val llvm.Value) {
-	valType := val.Type()
-
-	switch len(argTypes) {
-	case 0:
-		// do nothing
-
-	case 1:
-		if argTypes[0].C == valType.C {
-			args[0] = val
-			return
-		}
-		alloca := allocaBuilder.CreateAlloca(valType, "")
-		bitcast := builder.CreateBitCast(alloca, llvm.PointerType(argTypes[0], 0), "")
-		builder.CreateStore(val, alloca)
-		args[0] = builder.CreateLoad(bitcast, "")
-
-	case 2:
-		encodeType := llvm.StructType(argTypes, false)
-		alloca := allocaBuilder.CreateAlloca(valType, "")
-		bitcast := builder.CreateBitCast(alloca, llvm.PointerType(encodeType, 0), "")
-		builder.CreateStore(val, alloca)
-		args[0] = builder.CreateLoad(builder.CreateStructGEP(bitcast, 0, ""), "")
-		args[1] = builder.CreateLoad(builder.CreateStructGEP(bitcast, 1, ""), "")
-
-	default:
-		panic("unexpected argTypes size")
-	}
-}
-
-func (ai *directArgInfo) encode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, args []llvm.Value, val llvm.Value) {
-	directEncode(ctx, allocaBuilder, builder, ai.argTypes, args[ai.argOffset:ai.argOffset+len(ai.argTypes)], val)
-}
-
-func directDecode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, valType llvm.Type, args []llvm.Value) llvm.Value {
-	var alloca llvm.Value
-
-	switch len(args) {
-	case 0:
-		return llvm.ConstNull(ctx.StructType(nil, false))
-
-	case 1:
-		if args[0].Type().C == valType.C {
-			return args[0]
-		}
-		alloca = allocaBuilder.CreateAlloca(valType, "")
-		bitcast := builder.CreateBitCast(alloca, llvm.PointerType(args[0].Type(), 0), "")
-		builder.CreateStore(args[0], bitcast)
-
-	case 2:
-		alloca = allocaBuilder.CreateAlloca(valType, "")
-		var argTypes []llvm.Type
-		for _, a := range args {
-			argTypes = append(argTypes, a.Type())
-		}
-		encodeType := ctx.StructType(argTypes, false)
-		bitcast := builder.CreateBitCast(alloca, llvm.PointerType(encodeType, 0), "")
-		builder.CreateStore(args[0], builder.CreateStructGEP(bitcast, 0, ""))
-		builder.CreateStore(args[1], builder.CreateStructGEP(bitcast, 1, ""))
-
-	default:
-		panic("unexpected argTypes size")
-	}
-
-	return builder.CreateLoad(alloca, "")
-}
-
-func (ai *directArgInfo) decode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder) llvm.Value {
-	var args []llvm.Value
-	fn := builder.GetInsertBlock().Parent()
-	for i, _ := range ai.argTypes {
-		args = append(args, fn.Param(ai.argOffset+i))
-	}
-	return directDecode(ctx, allocaBuilder, builder, ai.valType, args)
-}
-
-type indirectArgInfo struct {
-	argOffset int
-}
-
-func (ai *indirectArgInfo) encode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, args []llvm.Value, val llvm.Value) {
-	alloca := allocaBuilder.CreateAlloca(val.Type(), "")
-	builder.CreateStore(val, alloca)
-	args[ai.argOffset] = alloca
-}
-
-func (ai *indirectArgInfo) decode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder) llvm.Value {
-	fn := builder.GetInsertBlock().Parent()
-	return builder.CreateLoad(fn.Param(ai.argOffset), "")
-}
-
-type directRetInfo struct {
-	numResults  int
-	retTypes    []llvm.Type
-	resultsType llvm.Type
-}
-
-func (ri *directRetInfo) prepare(ctx llvm.Context, allocaBuilder llvm.Builder, args []llvm.Value) {
-}
-
-func (ri *directRetInfo) decode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, call llvm.Value) []llvm.Value {
-	var args []llvm.Value
-	switch len(ri.retTypes) {
-	case 0:
-		return nil
-	case 1:
-		args = []llvm.Value{call}
-	default:
-		args = make([]llvm.Value, len(ri.retTypes))
-		for i := 0; i != len(ri.retTypes); i++ {
-			args[i] = builder.CreateExtractValue(call, i, "")
-		}
-	}
-
-	d := directDecode(ctx, allocaBuilder, builder, ri.resultsType, args)
-
-	if ri.numResults == 1 {
-		return []llvm.Value{d}
-	} else {
-		results := make([]llvm.Value, ri.numResults)
-		for i := 0; i != ri.numResults; i++ {
-			results[i] = builder.CreateExtractValue(d, i, "")
-		}
-		return results
-	}
-}
-
-func (ri *directRetInfo) encode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, vals []llvm.Value) {
-	if len(ri.retTypes) == 0 {
-		builder.CreateRetVoid()
-		return
-	}
-
-	var val llvm.Value
-	switch ri.numResults {
-	case 1:
-		val = vals[0]
-	default:
-		val = llvm.Undef(ri.resultsType)
-		for i, v := range vals {
-			val = builder.CreateInsertValue(val, v, i, "")
-		}
-	}
-
-	args := make([]llvm.Value, len(ri.retTypes))
-	directEncode(ctx, allocaBuilder, builder, ri.retTypes, args, val)
-
-	var retval llvm.Value
-	switch len(ri.retTypes) {
-	case 1:
-		retval = args[0]
-	default:
-		retval = llvm.Undef(ctx.StructType(ri.retTypes, false))
-		for i, a := range args {
-			retval = builder.CreateInsertValue(retval, a, i, "")
-		}
-	}
-	builder.CreateRet(retval)
-}
-
-type indirectRetInfo struct {
-	numResults  int
-	sretSlot    llvm.Value
-	resultsType llvm.Type
-}
-
-func (ri *indirectRetInfo) prepare(ctx llvm.Context, allocaBuilder llvm.Builder, args []llvm.Value) {
-	ri.sretSlot = allocaBuilder.CreateAlloca(ri.resultsType, "")
-	args[0] = ri.sretSlot
-}
-
-func (ri *indirectRetInfo) decode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, call llvm.Value) []llvm.Value {
-	if ri.numResults == 1 {
-		return []llvm.Value{builder.CreateLoad(ri.sretSlot, "")}
-	} else {
-		vals := make([]llvm.Value, ri.numResults)
-		for i, _ := range vals {
-			vals[i] = builder.CreateLoad(builder.CreateStructGEP(ri.sretSlot, i, ""), "")
-		}
-		return vals
-	}
-}
-
-func (ri *indirectRetInfo) encode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, vals []llvm.Value) {
-	fn := builder.GetInsertBlock().Parent()
-	sretSlot := fn.Param(0)
-
-	if ri.numResults == 1 {
-		builder.CreateStore(vals[0], sretSlot)
-	} else {
-		for i, v := range vals {
-			builder.CreateStore(v, builder.CreateStructGEP(sretSlot, i, ""))
-		}
-	}
-	builder.CreateRetVoid()
-}
-
-type functionTypeInfo struct {
-	functionType llvm.Type
-	argAttrs     []llvm.Attribute
-	retAttr      llvm.Attribute
-	argInfos     []argInfo
-	retInf       retInfo
-	chainIndex   int
-}
-
-func (fi *functionTypeInfo) declare(m llvm.Module, name string) llvm.Value {
-	fn := llvm.AddFunction(m, name, fi.functionType)
-	if fi.retAttr.GetEnumKind() != 0 {
-		fn.AddAttributeAtIndex(0, fi.retAttr)
-	}
-	for i, a := range fi.argAttrs {
-		if a.GetEnumKind() != 0 {
-			fn.AddAttributeAtIndex(i + 1, a)
-		}
-	}
-	return fn
-}
-
-func (fi *functionTypeInfo) call(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, callee llvm.Value, chain llvm.Value, args []llvm.Value) []llvm.Value {
-	callArgs := make([]llvm.Value, len(fi.argAttrs))
-	if chain.C == nil {
-		chain = llvm.Undef(llvm.PointerType(ctx.Int8Type(), 0))
-	}
-	callArgs[fi.chainIndex] = chain
-	for i, a := range args {
-		fi.argInfos[i].encode(ctx, allocaBuilder, builder, callArgs, a)
-	}
-	fi.retInf.prepare(ctx, allocaBuilder, callArgs)
-	typedCallee := builder.CreateBitCast(callee, llvm.PointerType(fi.functionType, 0), "")
-	call := builder.CreateCall(typedCallee, callArgs, "")
-	if fi.retAttr.GetEnumKind() != 0 {
-		call.AddCallSiteAttribute(0, fi.retAttr)
-	}
-	for i, a := range fi.argAttrs {
-		if a.GetEnumKind() != 0 {
-			call.AddCallSiteAttribute(i + 1, a)
-		}
-	}
-	return fi.retInf.decode(ctx, allocaBuilder, builder, call)
-}
-
-func (fi *functionTypeInfo) invoke(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, callee llvm.Value, chain llvm.Value, args []llvm.Value, cont, lpad llvm.BasicBlock) []llvm.Value {
-	callArgs := make([]llvm.Value, len(fi.argAttrs))
-	if chain.C == nil {
-		chain = llvm.Undef(llvm.PointerType(ctx.Int8Type(), 0))
-	}
-	callArgs[fi.chainIndex] = chain
-	for i, a := range args {
-		fi.argInfos[i].encode(ctx, allocaBuilder, builder, callArgs, a)
-	}
-	fi.retInf.prepare(ctx, allocaBuilder, callArgs)
-	typedCallee := builder.CreateBitCast(callee, llvm.PointerType(fi.functionType, 0), "")
-	call := builder.CreateInvoke(typedCallee, callArgs, cont, lpad, "")
-	if fi.retAttr.GetEnumKind() != 0 {
-		call.AddCallSiteAttribute(0, fi.retAttr)
-	}
-	for i, a := range fi.argAttrs {
-		if a.GetEnumKind() != 0 {
-			call.AddCallSiteAttribute(i + 1, a)
-		}
-	}
-	builder.SetInsertPointAtEnd(cont)
-	return fi.retInf.decode(ctx, allocaBuilder, builder, call)
-}
-
-func (tm *llvmTypeMap) getFunctionTypeInfo(args []types.Type, results []types.Type) (fi functionTypeInfo) {
-	var returnType llvm.Type
-	var argTypes []llvm.Type
-	var argAttrKind uint
-	if len(results) == 0 {
-		returnType = llvm.VoidType()
-		fi.retInf = &directRetInfo{}
-	} else {
-		aik := tm.classify(results...)
-
-		var resultsType llvm.Type
-		if len(results) == 1 {
-			resultsType = tm.ToLLVM(results[0])
-		} else {
-			elements := make([]llvm.Type, len(results))
-			for i := range elements {
-				elements[i] = tm.ToLLVM(results[i])
-			}
-			resultsType = tm.ctx.StructType(elements, false)
-		}
-
-		switch aik {
-		case AIK_Direct:
-			var retFields []backendType
-			for _, t := range results {
-				retFields = append(retFields, tm.getBackendType(t))
-			}
-			bt := &structBType{retFields}
-
-			retTypes, retAttrs, _, _ := tm.expandType(nil, nil, bt)
-			switch len(retTypes) {
-			case 0: // e.g., empty struct
-				returnType = llvm.VoidType()
-			case 1:
-				returnType = retTypes[0]
-				fi.retAttr = retAttrs[0]
-			case 2:
-				returnType = llvm.StructType(retTypes, false)
-			default:
-				panic("unexpected expandType result")
-			}
-			fi.retInf = &directRetInfo{numResults: len(results), retTypes: retTypes, resultsType: resultsType}
-
-		case AIK_Indirect:
-			returnType = llvm.VoidType()
-			argTypes = []llvm.Type{llvm.PointerType(resultsType, 0)}
-			argAttrKind = llvm.AttributeKindID("sret")
-			fi.argAttrs = []llvm.Attribute{tm.ctx.CreateEnumAttribute(argAttrKind, 0)}
-			fi.retInf = &indirectRetInfo{numResults: len(results), resultsType: resultsType}
-		}
-	}
-
-	// Allocate an argument for the call chain.
-	fi.chainIndex = len(argTypes)
-	argTypes = append(argTypes, llvm.PointerType(tm.ctx.Int8Type(), 0))
-	argAttrKind = llvm.AttributeKindID("nest")
-	fi.argAttrs = append(fi.argAttrs, tm.ctx.CreateEnumAttribute(argAttrKind, 0))
-
-	// Keep track of the number of INTEGER/SSE class registers remaining.
-	remainingInt := 6
-	remainingSSE := 8
-
-	for _, arg := range args {
-		aik := tm.classify(arg)
-
-		isDirect := aik == AIK_Direct
-		if isDirect {
-			bt := tm.getBackendType(arg)
-			directArgTypes, directArgAttrs, numInt, numSSE := tm.expandType(argTypes, fi.argAttrs, bt)
-
-			// Check if the argument can fit into the remaining registers, or if
-			// it would just occupy one register (which pushes the whole argument
-			// onto the stack anyway).
-			if numInt <= remainingInt && numSSE <= remainingSSE || numInt+numSSE == 1 {
-				remainingInt -= numInt
-				remainingSSE -= numSSE
-				argInfo := &directArgInfo{argOffset: len(argTypes), valType: bt.ToLLVM(tm.ctx)}
-				fi.argInfos = append(fi.argInfos, argInfo)
-				argTypes = directArgTypes
-				fi.argAttrs = directArgAttrs
-				argInfo.argTypes = argTypes[argInfo.argOffset:len(argTypes)]
-			} else {
-				// No remaining registers; pass on the stack.
-				isDirect = false
-			}
-		}
-
-		if !isDirect {
-			fi.argInfos = append(fi.argInfos, &indirectArgInfo{len(argTypes)})
-			argTypes = append(argTypes, llvm.PointerType(tm.ToLLVM(arg), 0))
-			argAttrKind = llvm.AttributeKindID("byval")
-			fi.argAttrs = append(fi.argAttrs, tm.ctx.CreateEnumAttribute(argAttrKind, 0))
-		}
-	}
-
-	fi.functionType = llvm.FunctionType(returnType, argTypes, false)
-	return
-}
-
-func (tm *llvmTypeMap) getSignatureInfo(sig *types.Signature) functionTypeInfo {
-	var args, results []types.Type
-	if sig.Recv() != nil {
-		recvtype := sig.Recv().Type()
-		if _, ok := recvtype.Underlying().(*types.Pointer); !ok && recvtype != types.Typ[types.UnsafePointer] {
-			recvtype = types.NewPointer(recvtype)
-		}
-		args = []types.Type{recvtype}
-	}
-
-	for i := 0; i != sig.Params().Len(); i++ {
-		args = append(args, sig.Params().At(i).Type())
-	}
-	for i := 0; i != sig.Results().Len(); i++ {
-		results = append(results, sig.Results().At(i).Type())
-	}
-	return tm.getFunctionTypeInfo(args, results)
-}
diff --git a/irgen/call.go b/irgen/call.go
deleted file mode 100644
index e3874c3..0000000
--- a/irgen/call.go
+++ /dev/null
@@ -1,43 +0,0 @@
-//===- call.go - IR generation for calls ----------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements IR generation for calls.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-// createCall emits the code for a function call,
-// taking into account receivers, and panic/defer.
-func (fr *frame) createCall(fn *govalue, chain llvm.Value, argValues []*govalue) []*govalue {
-	fntyp := fn.Type().Underlying().(*types.Signature)
-	typinfo := fr.types.getSignatureInfo(fntyp)
-
-	args := make([]llvm.Value, len(argValues))
-	for i, arg := range argValues {
-		args[i] = arg.value
-	}
-	var results []llvm.Value
-	if fr.unwindBlock.IsNil() {
-		results = typinfo.call(fr.types.ctx, fr.allocaBuilder, fr.builder, fn.value, chain, args)
-	} else {
-		contbb := llvm.AddBasicBlock(fr.function, "")
-		results = typinfo.invoke(fr.types.ctx, fr.allocaBuilder, fr.builder, fn.value, chain, args, contbb, fr.unwindBlock)
-	}
-
-	resultValues := make([]*govalue, len(results))
-	for i, res := range results {
-		resultValues[i] = newValue(res, fntyp.Results().At(i).Type())
-	}
-	return resultValues
-}
diff --git a/irgen/channels.go b/irgen/channels.go
deleted file mode 100644
index 5a4e2d5..0000000
--- a/irgen/channels.go
+++ /dev/null
@@ -1,133 +0,0 @@
-//===- channels.go - IR generation for channels ---------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements IR generation for channels.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-// makeChan implements make(chantype[, size])
-func (fr *frame) makeChan(chantyp types.Type, size *govalue) *govalue {
-	// TODO(pcc): call __go_new_channel_big here if needed
-	dyntyp := fr.types.ToRuntime(chantyp)
-	size = fr.convert(size, types.Typ[types.Uintptr])
-	ch := fr.runtime.newChannel.call(fr, dyntyp, size.value)[0]
-	return newValue(ch, chantyp)
-}
-
-// chanSend implements ch<- x
-func (fr *frame) chanSend(ch *govalue, elem *govalue) {
-	elemtyp := ch.Type().Underlying().(*types.Chan).Elem()
-	elem = fr.convert(elem, elemtyp)
-	elemptr := fr.allocaBuilder.CreateAlloca(elem.value.Type(), "")
-	fr.builder.CreateStore(elem.value, elemptr)
-	elemptr = fr.builder.CreateBitCast(elemptr, llvm.PointerType(llvm.Int8Type(), 0), "")
-	chantyp := fr.types.ToRuntime(ch.Type())
-	fr.runtime.sendBig.call(fr, chantyp, ch.value, elemptr)
-}
-
-// chanRecv implements x[, ok] = <-ch
-func (fr *frame) chanRecv(ch *govalue, commaOk bool) (x, ok *govalue) {
-	elemtyp := ch.Type().Underlying().(*types.Chan).Elem()
-	ptr := fr.allocaBuilder.CreateAlloca(fr.types.ToLLVM(elemtyp), "")
-	ptri8 := fr.builder.CreateBitCast(ptr, llvm.PointerType(llvm.Int8Type(), 0), "")
-	chantyp := fr.types.ToRuntime(ch.Type())
-
-	if commaOk {
-		okval := fr.runtime.chanrecv2.call(fr, chantyp, ch.value, ptri8)[0]
-		ok = newValue(okval, types.Typ[types.Bool])
-	} else {
-		fr.runtime.receive.call(fr, chantyp, ch.value, ptri8)
-	}
-	x = newValue(fr.builder.CreateLoad(ptr, ""), elemtyp)
-	return
-}
-
-// chanClose implements close(ch)
-func (fr *frame) chanClose(ch *govalue) {
-	fr.runtime.builtinClose.call(fr, ch.value)
-}
-
-func (fr *frame) chanSelect(sel *ssa.Select) (index, recvOk *govalue, recvElems []*govalue) {
-	n := uint64(len(sel.States))
-	if !sel.Blocking {
-		// non-blocking means there's a default case
-		n++
-	}
-	size := llvm.ConstInt(llvm.Int32Type(), n, false)
-	selectp := fr.runtime.newSelect.call(fr, size)[0]
-
-	// Allocate stack for the values to send and receive.
-	ptrs := make([]llvm.Value, len(sel.States))
-	for i, state := range sel.States {
-		chantyp := state.Chan.Type().Underlying().(*types.Chan)
-		elemtyp := fr.types.ToLLVM(chantyp.Elem())
-		if state.Dir == types.SendOnly {
-			ptrs[i] = fr.allocaBuilder.CreateAlloca(elemtyp, "")
-			fr.builder.CreateStore(fr.llvmvalue(state.Send), ptrs[i])
-		} else {
-			// Only allocate stack space if the received value is used.
-			used := chanSelectStateUsed(sel, len(recvElems))
-			if used {
-				ptrs[i] = fr.allocaBuilder.CreateAlloca(elemtyp, "")
-			} else {
-				ptrs[i] = llvm.ConstNull(llvm.PointerType(llvm.Int8Type(), 0))
-			}
-			recvElems = append(recvElems, newValue(ptrs[i], chantyp.Elem()))
-		}
-	}
-
-	// Create select{send,recv2} calls.
-	var receivedp llvm.Value
-	if len(recvElems) > 0 {
-		receivedp = fr.allocaBuilder.CreateAlloca(fr.types.ToLLVM(types.Typ[types.Bool]), "")
-	}
-	if !sel.Blocking {
-		// If the default case is chosen, the index must be -1.
-		fr.runtime.selectdefault.call(fr, selectp, llvm.ConstAllOnes(llvm.Int32Type()))
-	}
-	for i, state := range sel.States {
-		ch := fr.llvmvalue(state.Chan)
-		index := llvm.ConstInt(llvm.Int32Type(), uint64(i), false)
-		if state.Dir == types.SendOnly {
-			fr.runtime.selectsend.call(fr, selectp, ch, ptrs[i], index)
-		} else {
-			fr.runtime.selectrecv2.call(fr, selectp, ch, ptrs[i], receivedp, index)
-		}
-	}
-
-	// Fire off the select.
-	index = newValue(fr.runtime.selectgo.call(fr, selectp)[0], types.Typ[types.Int])
-	if len(recvElems) > 0 {
-		recvOk = newValue(fr.builder.CreateLoad(receivedp, ""), types.Typ[types.Bool])
-		for _, recvElem := range recvElems {
-			recvElem.value = fr.builder.CreateLoad(recvElem.value, "")
-		}
-	}
-	return index, recvOk, recvElems
-}
-
-func chanSelectStateUsed(sel *ssa.Select, recvIndex int) bool {
-	for _, instr := range *sel.Referrers() {
-		extract, ok := instr.(*ssa.Extract)
-		if !ok || extract.Index != (recvIndex+2) {
-			continue
-		}
-		if len(*extract.Referrers()) > 0 {
-			return true
-		}
-	}
-	return false
-}
diff --git a/irgen/closures.go b/irgen/closures.go
deleted file mode 100644
index 0895ac2..0000000
--- a/irgen/closures.go
+++ /dev/null
@@ -1,36 +0,0 @@
-//===- closures.go - IR generation for closures ---------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements IR generation for closures.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// makeClosure creates a closure from a function pointer and
-// a set of bindings. The bindings are addresses of captured
-// variables.
-func (fr *frame) makeClosure(fn *govalue, bindings []*govalue) *govalue {
-	govalues := append([]*govalue{fn}, bindings...)
-	fields := make([]*types.Var, len(govalues))
-	for i, v := range govalues {
-		field := types.NewField(0, nil, "_", v.Type(), false)
-		fields[i] = field
-	}
-	block := fr.createTypeMalloc(types.NewStruct(fields, nil))
-	for i, v := range govalues {
-		addressPtr := fr.builder.CreateStructGEP(block, i, "")
-		fr.builder.CreateStore(v.value, addressPtr)
-	}
-	closure := fr.builder.CreateBitCast(block, fn.value.Type(), "")
-	return newValue(closure, fn.Type())
-}
diff --git a/irgen/compiler.go b/irgen/compiler.go
deleted file mode 100644
index 69934df..0000000
--- a/irgen/compiler.go
+++ /dev/null
@@ -1,394 +0,0 @@
-//===- compiler.go - IR generator entry point -----------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements the main IR generator entry point, (*Compiler).Compile.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"bytes"
-	"go/ast"
-	"go/token"
-	"log"
-	"sort"
-	"strconv"
-
-	llgobuild "llvm.org/llgo/build"
-	"llvm.org/llgo/debug"
-	"llvm.org/llvm/bindings/go/llvm"
-
-	"llvm.org/llgo/third_party/gotools/go/gccgoimporter"
-	"llvm.org/llgo/third_party/gotools/go/importer"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-type Module struct {
-	llvm.Module
-	Path       string
-	ExportData []byte
-	Package    *types.Package
-	disposed   bool
-}
-
-func (m *Module) Dispose() {
-	if m.disposed {
-		return
-	}
-	m.Module.Dispose()
-	m.disposed = true
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-type CompilerOptions struct {
-	// TargetTriple is the LLVM triple for the target.
-	TargetTriple string
-
-	// GenerateDebug decides whether debug data is
-	// generated in the output module.
-	GenerateDebug bool
-
-	// DebugPrefixMaps is a list of mappings from source prefixes to
-	// replacement prefixes, to be applied in debug info.
-	DebugPrefixMaps []debug.PrefixMap
-
-	// Logger is a logger used for tracing compilation.
-	Logger *log.Logger
-
-	// DumpSSA is a debugging option that dumps each SSA function
-	// to stderr before generating code for it.
-	DumpSSA bool
-
-	// GccgoPath is the path to the gccgo binary whose libgo we read import
-	// data from. If blank, the caller is expected to supply an import
-	// path in ImportPaths.
-	GccgoPath string
-
-	// Whether to use the gccgo ABI.
-	GccgoABI bool
-
-	// ImportPaths is the list of additional import paths
-	ImportPaths []string
-
-	// SanitizerAttribute is an attribute to apply to functions to enable
-	// dynamic instrumentation using a sanitizer.
-	SanitizerAttribute llvm.Attribute
-
-	// Importer is the importer. If nil, the compiler will set this field
-	// automatically using MakeImporter().
-	Importer types.Importer
-
-	// InitMap is the init map used by Importer. If Importer is nil, the
-	// compiler will set this field automatically using MakeImporter().
-	// If Importer is non-nil, InitMap must be non-nil also.
-	InitMap map[*types.Package]gccgoimporter.InitData
-
-	// PackageCreated is a hook passed to the go/loader package via
-	// loader.Config, see the documentation for that package for more
-	// information.
-	PackageCreated func(*types.Package)
-
-	// DisableUnusedImportCheck disables the unused import check performed
-	// by go/types if set to true.
-	DisableUnusedImportCheck bool
-
-	// Packages is used by go/types as the imported package map if non-nil.
-	Packages map[string]*types.Package
-}
-
-type Compiler struct {
-	opts       CompilerOptions
-	dataLayout string
-}
-
-func NewCompiler(opts CompilerOptions) (*Compiler, error) {
-	compiler := &Compiler{opts: opts}
-	dataLayout, err := llvmDataLayout(compiler.opts.TargetTriple)
-	if err != nil {
-		return nil, err
-	}
-	compiler.dataLayout = dataLayout
-	return compiler, nil
-}
-
-func (c *Compiler) Compile(fset *token.FileSet, astFiles []*ast.File, importpath string) (m *Module, err error) {
-	target := llvm.NewTargetData(c.dataLayout)
-	compiler := &compiler{
-		CompilerOptions: c.opts,
-		dataLayout:      c.dataLayout,
-		target:          target,
-		llvmtypes:       NewLLVMTypeMap(llvm.GlobalContext(), target),
-	}
-	return compiler.compile(fset, astFiles, importpath)
-}
-
-type compiler struct {
-	CompilerOptions
-
-	module     *Module
-	dataLayout string
-	target     llvm.TargetData
-	fileset    *token.FileSet
-
-	runtime   *runtimeInterface
-	llvmtypes *llvmTypeMap
-	types     *TypeMap
-
-	debug *debug.DIBuilder
-}
-
-func (c *compiler) logf(format string, v ...interface{}) {
-	if c.Logger != nil {
-		c.Logger.Printf(format, v...)
-	}
-}
-
-func (c *compiler) addCommonFunctionAttrs(fn llvm.Value) {
-	fn.AddTargetDependentFunctionAttr("disable-tail-calls", "true")
-	fn.AddTargetDependentFunctionAttr("split-stack", "")
-	if c.SanitizerAttribute.GetEnumKind() != 0 {
-		fn.AddFunctionAttr(c.SanitizerAttribute)
-	}
-}
-
-// MakeImporter sets CompilerOptions.Importer to an appropriate importer
-// for the search paths given in CompilerOptions.ImportPaths, and sets
-// CompilerOptions.InitMap to an init map belonging to that importer.
-// If CompilerOptions.GccgoPath is non-empty, the importer will also use
-// the search paths for that gccgo installation.
-func (opts *CompilerOptions) MakeImporter() error {
-	opts.InitMap = make(map[*types.Package]gccgoimporter.InitData)
-	if opts.GccgoPath == "" {
-		paths := append(append([]string{}, opts.ImportPaths...), ".")
-		opts.Importer = gccgoimporter.GetImporter(paths, opts.InitMap)
-	} else {
-		var inst gccgoimporter.GccgoInstallation
-		err := inst.InitFromDriver(opts.GccgoPath)
-		if err != nil {
-			return err
-		}
-		opts.Importer = inst.GetImporter(opts.ImportPaths, opts.InitMap)
-	}
-	return nil
-}
-
-func (compiler *compiler) compile(fset *token.FileSet, astFiles []*ast.File, importpath string) (m *Module, err error) {
-	buildctx, err := llgobuild.ContextFromTriple(compiler.TargetTriple)
-	if err != nil {
-		return nil, err
-	}
-
-	if compiler.Importer == nil {
-		err = compiler.MakeImporter()
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	impcfg := &loader.Config{
-		Fset: fset,
-		TypeChecker: types.Config{
-			Packages: compiler.Packages,
-			Import:   compiler.Importer,
-			Sizes:    compiler.llvmtypes,
-			DisableUnusedImportCheck: compiler.DisableUnusedImportCheck,
-		},
-		ImportFromBinary: true,
-		Build:            &buildctx.Context,
-		PackageCreated:   compiler.PackageCreated,
-	}
-	// If no import path is specified, then set the import
-	// path to be the same as the package's name.
-	if importpath == "" {
-		importpath = astFiles[0].Name.String()
-	}
-	impcfg.CreateFromFiles(importpath, astFiles...)
-	iprog, err := impcfg.Load()
-	if err != nil {
-		return nil, err
-	}
-	program := ssa.Create(iprog, ssa.BareInits)
-	mainPkginfo := iprog.InitialPackages()[0]
-	mainPkg := program.CreatePackage(mainPkginfo)
-
-	// Create a Module, which contains the LLVM module.
-	modulename := importpath
-	compiler.module = &Module{Module: llvm.NewModule(modulename), Path: modulename, Package: mainPkg.Object}
-	compiler.module.SetTarget(compiler.TargetTriple)
-	compiler.module.SetDataLayout(compiler.dataLayout)
-
-	// Create a new translation unit.
-	unit := newUnit(compiler, mainPkg)
-
-	// Create the runtime interface.
-	compiler.runtime, err = newRuntimeInterface(compiler.module.Module, compiler.llvmtypes)
-	if err != nil {
-		return nil, err
-	}
-
-	mainPkg.Build()
-
-	// Create a struct responsible for mapping static types to LLVM types,
-	// and to runtime/dynamic type values.
-	compiler.types = NewTypeMap(
-		mainPkg,
-		compiler.llvmtypes,
-		compiler.module.Module,
-		compiler.runtime,
-		MethodResolver(unit),
-	)
-
-	if compiler.GenerateDebug {
-		compiler.debug = debug.NewDIBuilder(
-			types.Sizes(compiler.llvmtypes),
-			compiler.module.Module,
-			impcfg.Fset,
-			compiler.DebugPrefixMaps,
-		)
-		defer compiler.debug.Destroy()
-		defer compiler.debug.Finalize()
-	}
-
-	unit.translatePackage(mainPkg)
-	compiler.processAnnotations(unit, mainPkginfo)
-
-	if importpath == "main" {
-		compiler.createInitMainFunction(mainPkg)
-	} else {
-		compiler.module.ExportData = compiler.buildExportData(mainPkg)
-	}
-
-	return compiler.module, nil
-}
-
-type byPriorityThenFunc []gccgoimporter.PackageInit
-
-func (a byPriorityThenFunc) Len() int      { return len(a) }
-func (a byPriorityThenFunc) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-func (a byPriorityThenFunc) Less(i, j int) bool {
-	switch {
-	case a[i].Priority < a[j].Priority:
-		return true
-	case a[i].Priority > a[j].Priority:
-		return false
-	case a[i].InitFunc < a[j].InitFunc:
-		return true
-	default:
-		return false
-	}
-}
-
-func (c *compiler) buildPackageInitData(mainPkg *ssa.Package) gccgoimporter.InitData {
-	var inits []gccgoimporter.PackageInit
-	for _, imp := range mainPkg.Object.Imports() {
-		inits = append(inits, c.InitMap[imp].Inits...)
-	}
-	sort.Sort(byPriorityThenFunc(inits))
-
-	// Deduplicate init entries. We want to preserve the entry with the highest priority.
-	// Normally a package's priorities will be consistent among its dependencies, but it is
-	// possible for them to be different. For example, if a standard library test augments a
-	// package which is a dependency of 'regexp' (which is imported by every test main package)
-	// with additional dependencies, those dependencies may cause the package under test to
-	// receive a higher priority than indicated by its init clause in 'regexp'.
-	uniqinits := make([]gccgoimporter.PackageInit, len(inits))
-	uniqinitpos := len(inits)
-	uniqinitnames := make(map[string]struct{})
-	for i, _ := range inits {
-		init := inits[len(inits)-1-i]
-		if _, ok := uniqinitnames[init.InitFunc]; !ok {
-			uniqinitnames[init.InitFunc] = struct{}{}
-			uniqinitpos--
-			uniqinits[uniqinitpos] = init
-		}
-	}
-	uniqinits = uniqinits[uniqinitpos:]
-
-	ourprio := 1
-	if len(uniqinits) != 0 {
-		ourprio = uniqinits[len(uniqinits)-1].Priority + 1
-	}
-
-	if imp := mainPkg.Func("init"); imp != nil {
-		impname := c.types.mc.mangleFunctionName(imp)
-		uniqinits = append(uniqinits, gccgoimporter.PackageInit{mainPkg.Object.Name(), impname, ourprio})
-	}
-
-	return gccgoimporter.InitData{ourprio, uniqinits}
-}
-
-func (c *compiler) createInitMainFunction(mainPkg *ssa.Package) {
-	int8ptr := llvm.PointerType(c.types.ctx.Int8Type(), 0)
-	ftyp := llvm.FunctionType(llvm.VoidType(), []llvm.Type{int8ptr}, false)
-	initMain := llvm.AddFunction(c.module.Module, "__go_init_main", ftyp)
-	c.addCommonFunctionAttrs(initMain)
-	entry := llvm.AddBasicBlock(initMain, "entry")
-
-	builder := llvm.GlobalContext().NewBuilder()
-	defer builder.Dispose()
-	builder.SetInsertPointAtEnd(entry)
-
-	args := []llvm.Value{llvm.Undef(int8ptr)}
-
-	if !c.GccgoABI {
-		initfn := c.module.Module.NamedFunction("main..import")
-		if !initfn.IsNil() {
-			builder.CreateCall(initfn, args, "")
-		}
-		builder.CreateRetVoid()
-		return
-	}
-
-	initdata := c.buildPackageInitData(mainPkg)
-
-	for _, init := range initdata.Inits {
-		initfn := c.module.Module.NamedFunction(init.InitFunc)
-		if initfn.IsNil() {
-			initfn = llvm.AddFunction(c.module.Module, init.InitFunc, ftyp)
-		}
-		builder.CreateCall(initfn, args, "")
-	}
-
-	builder.CreateRetVoid()
-}
-
-func (c *compiler) buildExportData(mainPkg *ssa.Package) []byte {
-	exportData := importer.ExportData(mainPkg.Object)
-	b := bytes.NewBuffer(exportData)
-
-	b.WriteString("v1;\n")
-	if !c.GccgoABI {
-		return b.Bytes()
-	}
-
-	initdata := c.buildPackageInitData(mainPkg)
-	b.WriteString("priority ")
-	b.WriteString(strconv.Itoa(initdata.Priority))
-	b.WriteString(";\n")
-
-	if len(initdata.Inits) != 0 {
-		b.WriteString("init")
-		for _, init := range initdata.Inits {
-			b.WriteRune(' ')
-			b.WriteString(init.Name)
-			b.WriteRune(' ')
-			b.WriteString(init.InitFunc)
-			b.WriteRune(' ')
-			b.WriteString(strconv.Itoa(init.Priority))
-		}
-		b.WriteString(";\n")
-	}
-
-	return b.Bytes()
-}
-
-// vim: set ft=go :
diff --git a/irgen/errors.go b/irgen/errors.go
deleted file mode 100644
index 01be69b..0000000
--- a/irgen/errors.go
+++ /dev/null
@@ -1,71 +0,0 @@
-//===- errors.go - IR generation for run-time panics ----------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements IR generation for triggering run-time panics.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-const (
-	// From go-runtime-error.c
-	gccgoRuntimeErrorSLICE_INDEX_OUT_OF_BOUNDS  = 0
-	gccgoRuntimeErrorARRAY_INDEX_OUT_OF_BOUNDS  = 1
-	gccgoRuntimeErrorSTRING_INDEX_OUT_OF_BOUNDS = 2
-	gccgoRuntimeErrorSLICE_SLICE_OUT_OF_BOUNDS  = 3
-	gccgoRuntimeErrorARRAY_SLICE_OUT_OF_BOUNDS  = 4
-	gccgoRuntimeErrorSTRING_SLICE_OUT_OF_BOUNDS = 5
-	gccgoRuntimeErrorNIL_DEREFERENCE            = 6
-	gccgoRuntimeErrorMAKE_SLICE_OUT_OF_BOUNDS   = 7
-	gccgoRuntimeErrorMAKE_MAP_OUT_OF_BOUNDS     = 8
-	gccgoRuntimeErrorMAKE_CHAN_OUT_OF_BOUNDS    = 9
-	gccgoRuntimeErrorDIVISION_BY_ZERO           = 10
-	gccgoRuntimeErrorCount                      = 11
-)
-
-func (fr *frame) setBranchWeightMetadata(br llvm.Value, trueweight, falseweight uint64) {
-	mdprof := llvm.MDKindID("prof")
-
-	mdnode := llvm.GlobalContext().MDNode([]llvm.Metadata{
-		llvm.GlobalContext().MDString("branch_weights"),
-		llvm.ConstInt(llvm.Int32Type(), trueweight, false).ConstantAsMetadata(),
-		llvm.ConstInt(llvm.Int32Type(), falseweight, false).ConstantAsMetadata(),
-	})
-
-	br.SetMetadata(mdprof, mdnode)
-}
-
-func (fr *frame) condBrRuntimeError(cond llvm.Value, errcode uint64) {
-	if cond.IsNull() {
-		return
-	}
-
-	errorbb := fr.runtimeErrorBlocks[errcode]
-	newbb := errorbb.C == nil
-	if newbb {
-		errorbb = llvm.AddBasicBlock(fr.function, "")
-		fr.runtimeErrorBlocks[errcode] = errorbb
-	}
-
-	contbb := llvm.AddBasicBlock(fr.function, "")
-
-	br := fr.builder.CreateCondBr(cond, errorbb, contbb)
-	fr.setBranchWeightMetadata(br, 1, 1000)
-
-	if newbb {
-		fr.builder.SetInsertPointAtEnd(errorbb)
-		fr.runtime.runtimeError.call(fr, llvm.ConstInt(llvm.Int32Type(), errcode, false))
-		fr.builder.CreateUnreachable()
-	}
-
-	fr.builder.SetInsertPointAtEnd(contbb)
-}
diff --git a/irgen/indirect.go b/irgen/indirect.go
deleted file mode 100644
index 5007429..0000000
--- a/irgen/indirect.go
+++ /dev/null
@@ -1,124 +0,0 @@
-//===- indirect.go - IR generation for thunks -----------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements IR generation for thunks required by the "defer" and
-// "go" builtins.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-// createThunk creates a thunk from a
-// given function and arguments, suitable for use with
-// "defer" and "go".
-func (fr *frame) createThunk(call ssa.CallInstruction) (thunk llvm.Value, arg llvm.Value) {
-	seenarg := make(map[ssa.Value]bool)
-	var args []ssa.Value
-	var argtypes []*types.Var
-
-	packArg := func(arg ssa.Value) {
-		switch arg.(type) {
-		case *ssa.Builtin, *ssa.Function, *ssa.Const, *ssa.Global:
-			// Do nothing: we can generate these in the thunk
-		default:
-			if !seenarg[arg] {
-				seenarg[arg] = true
-				args = append(args, arg)
-				field := types.NewField(0, nil, "_", arg.Type(), true)
-				argtypes = append(argtypes, field)
-			}
-		}
-	}
-
-	packArg(call.Common().Value)
-	for _, arg := range call.Common().Args {
-		packArg(arg)
-	}
-
-	var isRecoverCall bool
-	i8ptr := llvm.PointerType(llvm.Int8Type(), 0)
-	var structllptr llvm.Type
-	if len(args) == 0 {
-		if builtin, ok := call.Common().Value.(*ssa.Builtin); ok {
-			isRecoverCall = builtin.Name() == "recover"
-		}
-		if isRecoverCall {
-			// When creating a thunk for recover(), we must pass fr.canRecover.
-			arg = fr.builder.CreateZExt(fr.canRecover, fr.target.IntPtrType(), "")
-			arg = fr.builder.CreateIntToPtr(arg, i8ptr, "")
-		} else {
-			arg = llvm.ConstPointerNull(i8ptr)
-		}
-	} else {
-		structtype := types.NewStruct(argtypes, nil)
-		arg = fr.createTypeMalloc(structtype)
-		structllptr = arg.Type()
-		for i, ssaarg := range args {
-			argptr := fr.builder.CreateStructGEP(arg, i, "")
-			fr.builder.CreateStore(fr.llvmvalue(ssaarg), argptr)
-		}
-		arg = fr.builder.CreateBitCast(arg, i8ptr, "")
-	}
-
-	thunkfntype := llvm.FunctionType(llvm.VoidType(), []llvm.Type{i8ptr}, false)
-	thunkfn := llvm.AddFunction(fr.module.Module, "", thunkfntype)
-	thunkfn.SetLinkage(llvm.InternalLinkage)
-	fr.addCommonFunctionAttrs(thunkfn)
-
-	thunkfr := newFrame(fr.unit, thunkfn)
-	defer thunkfr.dispose()
-
-	prologuebb := llvm.AddBasicBlock(thunkfn, "prologue")
-	thunkfr.builder.SetInsertPointAtEnd(prologuebb)
-
-	if isRecoverCall {
-		thunkarg := thunkfn.Param(0)
-		thunkarg = thunkfr.builder.CreatePtrToInt(thunkarg, fr.target.IntPtrType(), "")
-		thunkfr.canRecover = thunkfr.builder.CreateTrunc(thunkarg, llvm.Int1Type(), "")
-	} else if len(args) > 0 {
-		thunkarg := thunkfn.Param(0)
-		thunkarg = thunkfr.builder.CreateBitCast(thunkarg, structllptr, "")
-		for i, ssaarg := range args {
-			thunkargptr := thunkfr.builder.CreateStructGEP(thunkarg, i, "")
-			thunkarg := thunkfr.builder.CreateLoad(thunkargptr, "")
-			thunkfr.env[ssaarg] = newValue(thunkarg, ssaarg.Type())
-		}
-	}
-
-	_, isDefer := call.(*ssa.Defer)
-
-	entrybb := llvm.AddBasicBlock(thunkfn, "entry")
-	br := thunkfr.builder.CreateBr(entrybb)
-	thunkfr.allocaBuilder.SetInsertPointBefore(br)
-
-	thunkfr.builder.SetInsertPointAtEnd(entrybb)
-	var exitbb llvm.BasicBlock
-	if isDefer {
-		exitbb = llvm.AddBasicBlock(thunkfn, "exit")
-		thunkfr.runtime.setDeferRetaddr.call(thunkfr, llvm.BlockAddress(thunkfn, exitbb))
-	}
-	if isDefer && isRecoverCall {
-		thunkfr.callRecover(true)
-	} else {
-		thunkfr.callInstruction(call)
-	}
-	if isDefer {
-		thunkfr.builder.CreateBr(exitbb)
-		thunkfr.builder.SetInsertPointAtEnd(exitbb)
-	}
-	thunkfr.builder.CreateRetVoid()
-
-	thunk = fr.builder.CreateBitCast(thunkfn, i8ptr, "")
-	return
-}
diff --git a/irgen/interfaces.go b/irgen/interfaces.go
deleted file mode 100644
index 6ebaa55..0000000
--- a/irgen/interfaces.go
+++ /dev/null
@@ -1,195 +0,0 @@
-//===- interfaces.go - IR generation for interfaces -----------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements IR generation for dealing with interface values.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-// interfaceMethod returns a function and receiver pointer for the specified
-// interface and method pair.
-func (fr *frame) interfaceMethod(lliface llvm.Value, ifacety types.Type, method *types.Func) (fn, recv *govalue) {
-	llitab := fr.builder.CreateExtractValue(lliface, 0, "")
-	recv = newValue(fr.builder.CreateExtractValue(lliface, 1, ""), types.Typ[types.UnsafePointer])
-	methodset := fr.types.MethodSet(ifacety)
-	// TODO(axw) cache ordered method index
-	index := -1
-	for i, m := range orderedMethodSet(methodset) {
-		if m.Obj() == method {
-			index = i
-			break
-		}
-	}
-	if index == -1 {
-		panic("could not find method index")
-	}
-	llitab = fr.builder.CreateBitCast(llitab, llvm.PointerType(llvm.PointerType(llvm.Int8Type(), 0), 0), "")
-	// Skip runtime type pointer.
-	llifnptr := fr.builder.CreateGEP(llitab, []llvm.Value{
-		llvm.ConstInt(llvm.Int32Type(), uint64(index+1), false),
-	}, "")
-
-	llifn := fr.builder.CreateLoad(llifnptr, "")
-	// Replace receiver type with unsafe.Pointer.
-	recvparam := types.NewParam(0, nil, "", types.Typ[types.UnsafePointer])
-	sig := method.Type().(*types.Signature)
-	sig = types.NewSignature(nil, recvparam, sig.Params(), sig.Results(), sig.Variadic())
-	fn = newValue(llifn, sig)
-	return
-}
-
-// compareInterfaces emits code to compare two interfaces for
-// equality.
-func (fr *frame) compareInterfaces(a, b *govalue) *govalue {
-	aNull := a.value.IsNull()
-	bNull := b.value.IsNull()
-	if aNull && bNull {
-		return newValue(boolLLVMValue(true), types.Typ[types.Bool])
-	}
-
-	compare := fr.runtime.emptyInterfaceCompare
-	aI := a.Type().Underlying().(*types.Interface).NumMethods() > 0
-	bI := b.Type().Underlying().(*types.Interface).NumMethods() > 0
-	switch {
-	case aI && bI:
-		compare = fr.runtime.interfaceCompare
-	case aI:
-		a = fr.convertI2E(a)
-	case bI:
-		b = fr.convertI2E(b)
-	}
-
-	result := compare.call(fr, a.value, b.value)[0]
-	result = fr.builder.CreateIsNull(result, "")
-	result = fr.builder.CreateZExt(result, llvm.Int8Type(), "")
-	return newValue(result, types.Typ[types.Bool])
-}
-
-func (fr *frame) makeInterface(llv llvm.Value, vty types.Type, iface types.Type) *govalue {
-	if _, ok := vty.Underlying().(*types.Pointer); !ok {
-		ptr := fr.createTypeMalloc(vty)
-		fr.builder.CreateStore(llv, ptr)
-		llv = ptr
-	}
-	return fr.makeInterfaceFromPointer(llv, vty, iface)
-}
-
-func (fr *frame) makeInterfaceFromPointer(vptr llvm.Value, vty types.Type, iface types.Type) *govalue {
-	i8ptr := llvm.PointerType(llvm.Int8Type(), 0)
-	llv := fr.builder.CreateBitCast(vptr, i8ptr, "")
-	value := llvm.Undef(fr.types.ToLLVM(iface))
-	itab := fr.types.getItabPointer(vty, iface.Underlying().(*types.Interface))
-	value = fr.builder.CreateInsertValue(value, itab, 0, "")
-	value = fr.builder.CreateInsertValue(value, llv, 1, "")
-	return newValue(value, iface)
-}
-
-// Reads the type descriptor from the given interface type.
-func (fr *frame) getInterfaceTypeDescriptor(v *govalue) llvm.Value {
-	isempty := v.Type().Underlying().(*types.Interface).NumMethods() == 0
-	itab := fr.builder.CreateExtractValue(v.value, 0, "")
-	if isempty {
-		return itab
-	} else {
-		itabnonnull := fr.builder.CreateIsNotNull(itab, "")
-		return fr.loadOrNull(itabnonnull, itab, types.Typ[types.UnsafePointer]).value
-	}
-}
-
-// Reads the value from the given interface type, assuming that the
-// interface holds a value of the correct type.
-func (fr *frame) getInterfaceValue(v *govalue, ty types.Type) *govalue {
-	val := fr.builder.CreateExtractValue(v.value, 1, "")
-	if _, ok := ty.Underlying().(*types.Pointer); !ok {
-		typedval := fr.builder.CreateBitCast(val, llvm.PointerType(fr.types.ToLLVM(ty), 0), "")
-		val = fr.builder.CreateLoad(typedval, "")
-	}
-	return newValue(val, ty)
-}
-
-// If cond is true, reads the value from the given interface type, otherwise
-// returns a nil value.
-func (fr *frame) getInterfaceValueOrNull(cond llvm.Value, v *govalue, ty types.Type) *govalue {
-	val := fr.builder.CreateExtractValue(v.value, 1, "")
-	if _, ok := ty.Underlying().(*types.Pointer); ok {
-		val = fr.builder.CreateSelect(cond, val, llvm.ConstNull(val.Type()), "")
-	} else {
-		val = fr.loadOrNull(cond, val, ty).value
-	}
-	return newValue(val, ty)
-}
-
-func (fr *frame) interfaceTypeCheck(val *govalue, ty types.Type) (v *govalue, okval *govalue) {
-	tytd := fr.types.ToRuntime(ty)
-	if _, ok := ty.Underlying().(*types.Interface); ok {
-		var result []llvm.Value
-		if val.Type().Underlying().(*types.Interface).NumMethods() > 0 {
-			result = fr.runtime.ifaceI2I2.call(fr, tytd, val.value)
-		} else {
-			result = fr.runtime.ifaceE2I2.call(fr, tytd, val.value)
-		}
-		v = newValue(result[0], ty)
-		okval = newValue(result[1], types.Typ[types.Bool])
-	} else {
-		valtd := fr.getInterfaceTypeDescriptor(val)
-		tyequal := fr.runtime.typeDescriptorsEqual.call(fr, valtd, tytd)[0]
-		okval = newValue(tyequal, types.Typ[types.Bool])
-		tyequal = fr.builder.CreateTrunc(tyequal, llvm.Int1Type(), "")
-
-		v = fr.getInterfaceValueOrNull(tyequal, val, ty)
-	}
-	return
-}
-
-func (fr *frame) interfaceTypeAssert(val *govalue, ty types.Type) *govalue {
-	if _, ok := ty.Underlying().(*types.Interface); ok {
-		return fr.changeInterface(val, ty, true)
-	} else {
-		valtytd := fr.types.ToRuntime(val.Type())
-		valtd := fr.getInterfaceTypeDescriptor(val)
-		tytd := fr.types.ToRuntime(ty)
-		fr.runtime.checkInterfaceType.call(fr, valtd, tytd, valtytd)
-
-		return fr.getInterfaceValue(val, ty)
-	}
-}
-
-// convertI2E converts a non-empty interface value to an empty interface.
-func (fr *frame) convertI2E(v *govalue) *govalue {
-	td := fr.getInterfaceTypeDescriptor(v)
-	val := fr.builder.CreateExtractValue(v.value, 1, "")
-
-	typ := types.NewInterface(nil, nil)
-	intf := llvm.Undef(fr.types.ToLLVM(typ))
-	intf = fr.builder.CreateInsertValue(intf, td, 0, "")
-	intf = fr.builder.CreateInsertValue(intf, val, 1, "")
-	return newValue(intf, typ)
-}
-
-func (fr *frame) changeInterface(v *govalue, ty types.Type, assert bool) *govalue {
-	td := fr.getInterfaceTypeDescriptor(v)
-	tytd := fr.types.ToRuntime(ty)
-	var itab llvm.Value
-	if assert {
-		itab = fr.runtime.assertInterface.call(fr, tytd, td)[0]
-	} else {
-		itab = fr.runtime.convertInterface.call(fr, tytd, td)[0]
-	}
-	val := fr.builder.CreateExtractValue(v.value, 1, "")
-
-	intf := llvm.Undef(fr.types.ToLLVM(ty))
-	intf = fr.builder.CreateInsertValue(intf, itab, 0, "")
-	intf = fr.builder.CreateInsertValue(intf, val, 1, "")
-	return newValue(intf, ty)
-}
diff --git a/irgen/maps.go b/irgen/maps.go
deleted file mode 100644
index f729b07..0000000
--- a/irgen/maps.go
+++ /dev/null
@@ -1,156 +0,0 @@
-//===- maps.go - IR generation for maps -----------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements IR generation for maps.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-// makeMap implements make(maptype[, initial space])
-func (fr *frame) makeMap(typ types.Type, cap_ *govalue) *govalue {
-	// TODO(pcc): call __go_new_map_big here if needed
-	dyntyp := fr.types.getMapDescriptorPointer(typ)
-	dyntyp = fr.builder.CreateBitCast(dyntyp, llvm.PointerType(llvm.Int8Type(), 0), "")
-	var cap llvm.Value
-	if cap_ != nil {
-		cap = fr.convert(cap_, types.Typ[types.Uintptr]).value
-	} else {
-		cap = llvm.ConstNull(fr.types.inttype)
-	}
-	m := fr.runtime.newMap.call(fr, dyntyp, cap)
-	return newValue(m[0], typ)
-}
-
-// mapLookup implements v[, ok] = m[k]
-func (fr *frame) mapLookup(m, k *govalue) (v *govalue, ok *govalue) {
-	llk := k.value
-	pk := fr.allocaBuilder.CreateAlloca(llk.Type(), "")
-	fr.builder.CreateStore(llk, pk)
-	valptr := fr.runtime.mapIndex.call(fr, m.value, pk, boolLLVMValue(false))[0]
-	attrkind := llvm.AttributeKindID("nocapture")
-	valptr.AddCallSiteAttribute(2, fr.types.ctx.CreateEnumAttribute(attrkind, 0))
-	attrkind = llvm.AttributeKindID("readonly")
-	valptr.AddCallSiteAttribute(2, fr.types.ctx.CreateEnumAttribute(attrkind, 0))
-	okbit := fr.builder.CreateIsNotNull(valptr, "")
-
-	elemtyp := m.Type().Underlying().(*types.Map).Elem()
-	ok = newValue(fr.builder.CreateZExt(okbit, llvm.Int8Type(), ""), types.Typ[types.Bool])
-	v = fr.loadOrNull(okbit, valptr, elemtyp)
-	return
-}
-
-// mapUpdate implements m[k] = v
-func (fr *frame) mapUpdate(m, k, v *govalue) {
-	llk := k.value
-	pk := fr.allocaBuilder.CreateAlloca(llk.Type(), "")
-	fr.builder.CreateStore(llk, pk)
-	valptr := fr.runtime.mapIndex.call(fr, m.value, pk, boolLLVMValue(true))[0]
-	attrkind := llvm.AttributeKindID("nocapture")
-	valptr.AddCallSiteAttribute(2, fr.types.ctx.CreateEnumAttribute(attrkind, 0))
-	attrkind = llvm.AttributeKindID("readonly")
-	valptr.AddCallSiteAttribute(2, fr.types.ctx.CreateEnumAttribute(attrkind, 0))
-
-	elemtyp := m.Type().Underlying().(*types.Map).Elem()
-	llelemtyp := fr.types.ToLLVM(elemtyp)
-	typedvalptr := fr.builder.CreateBitCast(valptr, llvm.PointerType(llelemtyp, 0), "")
-	fr.builder.CreateStore(v.value, typedvalptr)
-}
-
-// mapDelete implements delete(m, k)
-func (fr *frame) mapDelete(m, k *govalue) {
-	llk := k.value
-	pk := fr.allocaBuilder.CreateAlloca(llk.Type(), "")
-	fr.builder.CreateStore(llk, pk)
-	fr.runtime.mapdelete.call(fr, m.value, pk)
-}
-
-// mapIterInit creates a map iterator
-func (fr *frame) mapIterInit(m *govalue) []*govalue {
-	// We represent an iterator as a tuple (map, *bool). The second element
-	// controls whether the code we generate for "next" (below) calls the
-	// runtime function for the first or the next element. We let the
-	// optimizer reorganize this into something more sensible.
-	isinit := fr.allocaBuilder.CreateAlloca(llvm.Int1Type(), "")
-	fr.builder.CreateStore(llvm.ConstNull(llvm.Int1Type()), isinit)
-
-	return []*govalue{m, newValue(isinit, types.NewPointer(types.Typ[types.Bool]))}
-}
-
-// mapIterNext advances the iterator, and returns the tuple (ok, k, v).
-func (fr *frame) mapIterNext(iter []*govalue) []*govalue {
-	maptyp := iter[0].Type().Underlying().(*types.Map)
-	ktyp := maptyp.Key()
-	klltyp := fr.types.ToLLVM(ktyp)
-	vtyp := maptyp.Elem()
-	vlltyp := fr.types.ToLLVM(vtyp)
-
-	m, isinitptr := iter[0], iter[1]
-
-	i8ptr := llvm.PointerType(llvm.Int8Type(), 0)
-	mapiterbufty := llvm.ArrayType(i8ptr, 4)
-	mapiterbuf := fr.allocaBuilder.CreateAlloca(mapiterbufty, "")
-	mapiterbufelem0ptr := fr.builder.CreateStructGEP(mapiterbuf, 0, "")
-
-	keybuf := fr.allocaBuilder.CreateAlloca(klltyp, "")
-	keyptr := fr.builder.CreateBitCast(keybuf, i8ptr, "")
-	valbuf := fr.allocaBuilder.CreateAlloca(vlltyp, "")
-	valptr := fr.builder.CreateBitCast(valbuf, i8ptr, "")
-
-	isinit := fr.builder.CreateLoad(isinitptr.value, "")
-
-	initbb := llvm.AddBasicBlock(fr.function, "")
-	nextbb := llvm.AddBasicBlock(fr.function, "")
-	contbb := llvm.AddBasicBlock(fr.function, "")
-
-	fr.builder.CreateCondBr(isinit, nextbb, initbb)
-
-	fr.builder.SetInsertPointAtEnd(initbb)
-	fr.builder.CreateStore(llvm.ConstAllOnes(llvm.Int1Type()), isinitptr.value)
-	fr.runtime.mapiterinit.call(fr, m.value, mapiterbufelem0ptr)
-	fr.builder.CreateBr(contbb)
-
-	fr.builder.SetInsertPointAtEnd(nextbb)
-	fr.runtime.mapiternext.call(fr, mapiterbufelem0ptr)
-	fr.builder.CreateBr(contbb)
-
-	fr.builder.SetInsertPointAtEnd(contbb)
-	mapiterbufelem0 := fr.builder.CreateLoad(mapiterbufelem0ptr, "")
-	okbit := fr.builder.CreateIsNotNull(mapiterbufelem0, "")
-	ok := fr.builder.CreateZExt(okbit, llvm.Int8Type(), "")
-
-	loadbb := llvm.AddBasicBlock(fr.function, "")
-	cont2bb := llvm.AddBasicBlock(fr.function, "")
-	fr.builder.CreateCondBr(okbit, loadbb, cont2bb)
-
-	fr.builder.SetInsertPointAtEnd(loadbb)
-	fr.runtime.mapiter2.call(fr, mapiterbufelem0ptr, keyptr, valptr)
-	loadbb = fr.builder.GetInsertBlock()
-	loadedkey := fr.builder.CreateLoad(keybuf, "")
-	loadedval := fr.builder.CreateLoad(valbuf, "")
-	fr.builder.CreateBr(cont2bb)
-
-	fr.builder.SetInsertPointAtEnd(cont2bb)
-	k := fr.builder.CreatePHI(klltyp, "")
-	k.AddIncoming(
-		[]llvm.Value{llvm.ConstNull(klltyp), loadedkey},
-		[]llvm.BasicBlock{contbb, loadbb},
-	)
-	v := fr.builder.CreatePHI(vlltyp, "")
-	v.AddIncoming(
-		[]llvm.Value{llvm.ConstNull(vlltyp), loadedval},
-		[]llvm.BasicBlock{contbb, loadbb},
-	)
-
-	return []*govalue{newValue(ok, types.Typ[types.Bool]), newValue(k, ktyp), newValue(v, vtyp)}
-}
diff --git a/irgen/predicates.go b/irgen/predicates.go
deleted file mode 100644
index 52e9e2c..0000000
--- a/irgen/predicates.go
+++ /dev/null
@@ -1,57 +0,0 @@
-//===- predicates.go - type predicates ------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements commonly used type predicates.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-func isBoolean(typ types.Type) bool {
-	t, ok := typ.Underlying().(*types.Basic)
-	return ok && t.Info()&types.IsBoolean != 0
-}
-
-func isInteger(typ types.Type) bool {
-	t, ok := typ.Underlying().(*types.Basic)
-	return ok && t.Info()&types.IsInteger != 0
-}
-
-func isUnsigned(typ types.Type) bool {
-	t, ok := typ.Underlying().(*types.Basic)
-	return ok && t.Info()&types.IsUnsigned != 0
-}
-
-func isFloat(typ types.Type) bool {
-	t, ok := typ.Underlying().(*types.Basic)
-	return ok && t.Info()&types.IsFloat != 0
-}
-
-func isComplex(typ types.Type) bool {
-	t, ok := typ.Underlying().(*types.Basic)
-	return ok && t.Info()&types.IsComplex != 0
-}
-
-func isString(typ types.Type) bool {
-	t, ok := typ.Underlying().(*types.Basic)
-	return ok && t.Info()&types.IsString != 0
-}
-
-func isUntyped(typ types.Type) bool {
-	t, ok := typ.Underlying().(*types.Basic)
-	return ok && t.Info()&types.IsUntyped != 0
-}
-
-func isSlice(typ types.Type, bkind types.BasicKind) bool {
-	t, ok := typ.Underlying().(*types.Slice)
-	return ok && types.Identical(t.Elem().Underlying(), types.Typ[bkind])
-}
diff --git a/irgen/println.go b/irgen/println.go
deleted file mode 100644
index caeaff2..0000000
--- a/irgen/println.go
+++ /dev/null
@@ -1,92 +0,0 @@
-//===- println.go - IR generation for print and println -------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements IR generation for the print and println built-in
-// functions.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"fmt"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-func (fr *frame) printValues(println_ bool, values ...*govalue) {
-	for i, value := range values {
-		llvm_value := value.value
-
-		typ := value.Type().Underlying()
-		if name, isname := typ.(*types.Named); isname {
-			typ = name.Underlying()
-		}
-
-		if println_ && i > 0 {
-			fr.runtime.printSpace.call(fr)
-		}
-		switch typ := typ.(type) {
-		case *types.Basic:
-			switch typ.Kind() {
-			case types.Uint8, types.Uint16, types.Uint32, types.Uintptr, types.Uint, types.Uint64:
-				i64 := fr.llvmtypes.ctx.Int64Type()
-				zext := fr.builder.CreateZExt(llvm_value, i64, "")
-				fr.runtime.printUint64.call(fr, zext)
-
-			case types.Int, types.Int8, types.Int16, types.Int32, types.Int64:
-				i64 := fr.llvmtypes.ctx.Int64Type()
-				sext := fr.builder.CreateSExt(llvm_value, i64, "")
-				fr.runtime.printInt64.call(fr, sext)
-
-			case types.Float32:
-				llvm_value = fr.builder.CreateFPExt(llvm_value, fr.llvmtypes.ctx.DoubleType(), "")
-				fallthrough
-			case types.Float64:
-				fr.runtime.printDouble.call(fr, llvm_value)
-
-			case types.Complex64:
-				llvm_value = fr.convert(value, types.Typ[types.Complex128]).value
-				fallthrough
-			case types.Complex128:
-				fr.runtime.printComplex.call(fr, llvm_value)
-
-			case types.String, types.UntypedString:
-				fr.runtime.printString.call(fr, llvm_value)
-
-			case types.Bool:
-				fr.runtime.printBool.call(fr, llvm_value)
-
-			case types.UnsafePointer:
-				fr.runtime.printPointer.call(fr, llvm_value)
-
-			default:
-				panic(fmt.Sprint("Unhandled Basic Kind: ", typ.Kind))
-			}
-
-		case *types.Interface:
-			if typ.Empty() {
-				fr.runtime.printEmptyInterface.call(fr, llvm_value)
-			} else {
-				fr.runtime.printInterface.call(fr, llvm_value)
-			}
-
-		case *types.Slice:
-			fr.runtime.printSlice.call(fr, llvm_value)
-
-		case *types.Pointer, *types.Map, *types.Chan, *types.Signature:
-			fr.runtime.printPointer.call(fr, llvm_value)
-
-		default:
-			panic(fmt.Sprintf("Unhandled type kind: %s (%T)", typ, typ))
-		}
-	}
-	if println_ {
-		fr.runtime.printNl.call(fr)
-	}
-}
diff --git a/irgen/runtime.go b/irgen/runtime.go
deleted file mode 100644
index 3731ff1..0000000
--- a/irgen/runtime.go
+++ /dev/null
@@ -1,607 +0,0 @@
-//===- runtime.go - IR generation for runtime calls -----------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements IR generation for calls to the runtime library.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"strconv"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-type runtimeFnInfo struct {
-	fi *functionTypeInfo
-	fn llvm.Value
-}
-
-func (rfi *runtimeFnInfo) init(tm *llvmTypeMap, m llvm.Module, name string, args []types.Type, results []types.Type) {
-	rfi.fi = new(functionTypeInfo)
-	*rfi.fi = tm.getFunctionTypeInfo(args, results)
-	rfi.fn = rfi.fi.declare(m, name)
-}
-
-func (rfi *runtimeFnInfo) call(f *frame, args ...llvm.Value) []llvm.Value {
-	if f.unwindBlock.IsNil() {
-		return rfi.callOnly(f, args...)
-	} else {
-		return rfi.invoke(f, f.unwindBlock, args...)
-	}
-}
-
-func (rfi *runtimeFnInfo) callOnly(f *frame, args ...llvm.Value) []llvm.Value {
-	return rfi.fi.call(f.llvmtypes.ctx, f.allocaBuilder, f.builder, rfi.fn, llvm.Value{nil}, args)
-}
-
-func (rfi *runtimeFnInfo) invoke(f *frame, lpad llvm.BasicBlock, args ...llvm.Value) []llvm.Value {
-	contbb := llvm.AddBasicBlock(f.function, "")
-	return rfi.fi.invoke(f.llvmtypes.ctx, f.allocaBuilder, f.builder, rfi.fn, llvm.Value{nil}, args, contbb, lpad)
-}
-
-// runtimeInterface is a struct containing references to
-// runtime types and intrinsic function declarations.
-type runtimeInterface struct {
-	// LLVM intrinsics
-	memcpy,
-	memset,
-	returnaddress llvm.Value
-
-	// Exception handling support
-	gccgoPersonality   llvm.Value
-	gccgoExceptionType llvm.Type
-
-	// Runtime intrinsics
-	append,
-	assertInterface,
-	byteArrayToString,
-	canRecover,
-	chanCap,
-	chanLen,
-	chanrecv2,
-	checkDefer,
-	checkInterfaceType,
-	builtinClose,
-	convertInterface,
-	copy,
-	Defer,
-	deferredRecover,
-	emptyInterfaceCompare,
-	Go,
-	ifaceE2I2,
-	ifaceI2I2,
-	intArrayToString,
-	interfaceCompare,
-	intToString,
-	makeSlice,
-	mapdelete,
-	mapiter2,
-	mapiterinit,
-	mapiternext,
-	mapIndex,
-	mapLen,
-	New,
-	newChannel,
-	newMap,
-	newSelect,
-	panic,
-	printBool,
-	printComplex,
-	printDouble,
-	printEmptyInterface,
-	printInterface,
-	printInt64,
-	printNl,
-	printPointer,
-	printSlice,
-	printSpace,
-	printString,
-	printUint64,
-	receive,
-	recover,
-	registerGcRoots,
-	runtimeError,
-	selectdefault,
-	selectrecv2,
-	selectsend,
-	selectgo,
-	sendBig,
-	setDeferRetaddr,
-	strcmp,
-	stringiter2,
-	stringPlus,
-	stringSlice,
-	stringToByteArray,
-	stringToIntArray,
-	typeDescriptorsEqual,
-	undefer runtimeFnInfo
-}
-
-func newRuntimeInterface(module llvm.Module, tm *llvmTypeMap) (*runtimeInterface, error) {
-	var ri runtimeInterface
-
-	Bool := types.Typ[types.Bool]
-	Complex128 := types.Typ[types.Complex128]
-	Float64 := types.Typ[types.Float64]
-	Int32 := types.Typ[types.Int32]
-	Int64 := types.Typ[types.Int64]
-	Int := types.Typ[types.Int]
-	Rune := types.Typ[types.Rune]
-	String := types.Typ[types.String]
-	Uintptr := types.Typ[types.Uintptr]
-	UnsafePointer := types.Typ[types.UnsafePointer]
-
-	EmptyInterface := types.NewInterface(nil, nil)
-	ByteSlice := types.NewSlice(types.Typ[types.Byte])
-	IntSlice := types.NewSlice(types.Typ[types.Int])
-
-	AttrKind := llvm.AttributeKindID("nounwind")
-	NoUnwindAttr := module.Context().CreateEnumAttribute(AttrKind, 0)
-	AttrKind = llvm.AttributeKindID("noreturn")
-	NoReturnAttr := module.Context().CreateEnumAttribute(AttrKind, 0)
-
-	for _, rt := range [...]struct {
-		name      string
-		rfi       *runtimeFnInfo
-		args, res []types.Type
-		attrs     []llvm.Attribute
-	}{
-		{
-			name: "__go_append",
-			rfi:  &ri.append,
-			args: []types.Type{IntSlice, UnsafePointer, Uintptr, Uintptr},
-			res:  []types.Type{IntSlice},
-		},
-		{
-			name: "__go_assert_interface",
-			rfi:  &ri.assertInterface,
-			args: []types.Type{UnsafePointer, UnsafePointer},
-			res:  []types.Type{UnsafePointer},
-		},
-		{
-			name:  "__go_byte_array_to_string",
-			rfi:   &ri.byteArrayToString,
-			args:  []types.Type{UnsafePointer, Int},
-			res:   []types.Type{String},
-			attrs: []llvm.Attribute{NoUnwindAttr},
-		},
-		{
-			name: "__go_can_recover",
-			rfi:  &ri.canRecover,
-			args: []types.Type{UnsafePointer},
-			res:  []types.Type{Bool},
-		},
-		{
-			name: "__go_chan_cap",
-			rfi:  &ri.chanCap,
-			args: []types.Type{UnsafePointer},
-			res:  []types.Type{Int},
-		},
-		{
-			name: "__go_chan_len",
-			rfi:  &ri.chanLen,
-			args: []types.Type{UnsafePointer},
-			res:  []types.Type{Int},
-		},
-		{
-			name: "runtime.chanrecv2",
-			rfi:  &ri.chanrecv2,
-			args: []types.Type{UnsafePointer, UnsafePointer, UnsafePointer},
-			res:  []types.Type{Bool},
-		},
-		{
-			name: "__go_check_defer",
-			rfi:  &ri.checkDefer,
-			args: []types.Type{UnsafePointer},
-		},
-		{
-			name: "__go_check_interface_type",
-			rfi:  &ri.checkInterfaceType,
-			args: []types.Type{UnsafePointer, UnsafePointer, UnsafePointer},
-		},
-		{
-			name: "__go_builtin_close",
-			rfi:  &ri.builtinClose,
-			args: []types.Type{UnsafePointer},
-		},
-		{
-			name: "__go_convert_interface",
-			rfi:  &ri.convertInterface,
-			args: []types.Type{UnsafePointer, UnsafePointer},
-			res:  []types.Type{UnsafePointer},
-		},
-		{
-			name: "__go_copy",
-			rfi:  &ri.copy,
-			args: []types.Type{UnsafePointer, UnsafePointer, Uintptr},
-		},
-		{
-			name: "__go_defer",
-			rfi:  &ri.Defer,
-			args: []types.Type{UnsafePointer, UnsafePointer, UnsafePointer},
-		},
-		{
-			name: "__go_deferred_recover",
-			rfi:  &ri.deferredRecover,
-			res:  []types.Type{EmptyInterface},
-		},
-		{
-			name: "__go_empty_interface_compare",
-			rfi:  &ri.emptyInterfaceCompare,
-			args: []types.Type{EmptyInterface, EmptyInterface},
-			res:  []types.Type{Int},
-		},
-		{
-			name: "__go_go",
-			rfi:  &ri.Go,
-			args: []types.Type{UnsafePointer, UnsafePointer},
-		},
-		{
-			name: "runtime.ifaceE2I2",
-			rfi:  &ri.ifaceE2I2,
-			args: []types.Type{UnsafePointer, EmptyInterface},
-			res:  []types.Type{EmptyInterface, Bool},
-		},
-		{
-			name: "runtime.ifaceI2I2",
-			rfi:  &ri.ifaceI2I2,
-			args: []types.Type{UnsafePointer, EmptyInterface},
-			res:  []types.Type{EmptyInterface, Bool},
-		},
-		{
-			name: "__go_int_array_to_string",
-			rfi:  &ri.intArrayToString,
-			args: []types.Type{UnsafePointer, Int},
-			res:  []types.Type{String},
-		},
-		{
-			name: "__go_int_to_string",
-			rfi:  &ri.intToString,
-			args: []types.Type{Int},
-			res:  []types.Type{String},
-		},
-		{
-			name: "__go_interface_compare",
-			rfi:  &ri.interfaceCompare,
-			args: []types.Type{EmptyInterface, EmptyInterface},
-			res:  []types.Type{Int},
-		},
-		{
-			name: "__go_make_slice2",
-			rfi:  &ri.makeSlice,
-			args: []types.Type{UnsafePointer, Uintptr, Uintptr},
-			res:  []types.Type{IntSlice},
-		},
-		{
-			name: "runtime.mapdelete",
-			rfi:  &ri.mapdelete,
-			args: []types.Type{UnsafePointer, UnsafePointer},
-		},
-		{
-			name: "runtime.mapiter2",
-			rfi:  &ri.mapiter2,
-			args: []types.Type{UnsafePointer, UnsafePointer, UnsafePointer},
-		},
-		{
-			name: "runtime.mapiterinit",
-			rfi:  &ri.mapiterinit,
-			args: []types.Type{UnsafePointer, UnsafePointer},
-		},
-		{
-			name: "runtime.mapiternext",
-			rfi:  &ri.mapiternext,
-			args: []types.Type{UnsafePointer},
-		},
-		{
-			name: "__go_map_index",
-			rfi:  &ri.mapIndex,
-			args: []types.Type{UnsafePointer, UnsafePointer, Bool},
-			res:  []types.Type{UnsafePointer},
-		},
-		{
-			name: "__go_map_len",
-			rfi:  &ri.mapLen,
-			args: []types.Type{UnsafePointer},
-			res:  []types.Type{Int},
-		},
-		{
-			name:  "__go_new",
-			rfi:   &ri.New,
-			args:  []types.Type{UnsafePointer, Uintptr},
-			res:   []types.Type{UnsafePointer},
-			attrs: []llvm.Attribute{NoUnwindAttr},
-		},
-		{
-			name: "__go_new_channel",
-			rfi:  &ri.newChannel,
-			args: []types.Type{UnsafePointer, Uintptr},
-			res:  []types.Type{UnsafePointer},
-		},
-		{
-			name: "__go_new_map",
-			rfi:  &ri.newMap,
-			args: []types.Type{UnsafePointer, Uintptr},
-			res:  []types.Type{UnsafePointer},
-		},
-		{
-			name: "runtime.newselect",
-			rfi:  &ri.newSelect,
-			args: []types.Type{Int32},
-			res:  []types.Type{UnsafePointer},
-		},
-		{
-			name:  "__go_panic",
-			rfi:   &ri.panic,
-			args:  []types.Type{EmptyInterface},
-			attrs: []llvm.Attribute{NoReturnAttr},
-		},
-		{
-			name: "__go_print_bool",
-			rfi:  &ri.printBool,
-			args: []types.Type{Bool},
-		},
-		{
-			name: "__go_print_complex",
-			rfi:  &ri.printComplex,
-			args: []types.Type{Complex128},
-		},
-		{
-			name: "__go_print_double",
-			rfi:  &ri.printDouble,
-			args: []types.Type{Float64},
-		},
-		{
-			name: "__go_print_empty_interface",
-			rfi:  &ri.printEmptyInterface,
-			args: []types.Type{EmptyInterface},
-		},
-		{
-			name: "__go_print_interface",
-			rfi:  &ri.printInterface,
-			args: []types.Type{EmptyInterface},
-		},
-		{
-			name: "__go_print_int64",
-			rfi:  &ri.printInt64,
-			args: []types.Type{Int64},
-		},
-		{
-			name: "__go_print_nl",
-			rfi:  &ri.printNl,
-		},
-		{
-			name: "__go_print_pointer",
-			rfi:  &ri.printPointer,
-			args: []types.Type{UnsafePointer},
-		},
-		{
-			name: "__go_print_slice",
-			rfi:  &ri.printSlice,
-			args: []types.Type{IntSlice},
-		},
-		{
-			name: "__go_print_space",
-			rfi:  &ri.printSpace,
-		},
-		{
-			name: "__go_print_string",
-			rfi:  &ri.printString,
-			args: []types.Type{String},
-		},
-		{
-			name: "__go_print_uint64",
-			rfi:  &ri.printUint64,
-			args: []types.Type{Int64},
-		},
-		{
-			name: "__go_receive",
-			rfi:  &ri.receive,
-			args: []types.Type{UnsafePointer, UnsafePointer, UnsafePointer},
-		},
-		{
-			name: "__go_recover",
-			rfi:  &ri.recover,
-			res:  []types.Type{EmptyInterface},
-		},
-		{
-			name: "__go_register_gc_roots",
-			rfi:  &ri.registerGcRoots,
-			args: []types.Type{UnsafePointer},
-		},
-		{
-			name:  "__go_runtime_error",
-			rfi:   &ri.runtimeError,
-			args:  []types.Type{Int32},
-			attrs: []llvm.Attribute{NoReturnAttr},
-		},
-		{
-			name: "runtime.selectdefault",
-			rfi:  &ri.selectdefault,
-			args: []types.Type{UnsafePointer, Int32},
-		},
-		{
-			name: "runtime.selectgo",
-			rfi:  &ri.selectgo,
-			args: []types.Type{UnsafePointer},
-			res:  []types.Type{Int},
-		},
-		{
-			name: "runtime.selectrecv2",
-			rfi:  &ri.selectrecv2,
-			args: []types.Type{UnsafePointer, UnsafePointer, UnsafePointer, UnsafePointer, Int32},
-		},
-		{
-			name: "runtime.selectsend",
-			rfi:  &ri.selectsend,
-			args: []types.Type{UnsafePointer, UnsafePointer, UnsafePointer, Int32},
-		},
-		{
-			name: "__go_send_big",
-			rfi:  &ri.sendBig,
-			args: []types.Type{UnsafePointer, UnsafePointer, UnsafePointer},
-		},
-		{
-			name: "__go_set_defer_retaddr",
-			rfi:  &ri.setDeferRetaddr,
-			args: []types.Type{UnsafePointer},
-			res:  []types.Type{Bool},
-		},
-		{
-			name: "__go_strcmp",
-			rfi:  &ri.strcmp,
-			args: []types.Type{String, String},
-			res:  []types.Type{Int},
-		},
-		{
-			name: "__go_string_plus",
-			rfi:  &ri.stringPlus,
-			args: []types.Type{String, String},
-			res:  []types.Type{String},
-		},
-		{
-			name: "__go_string_slice",
-			rfi:  &ri.stringSlice,
-			args: []types.Type{String, Int, Int},
-			res:  []types.Type{String},
-		},
-		{
-			name:  "__go_string_to_byte_array",
-			rfi:   &ri.stringToByteArray,
-			args:  []types.Type{String},
-			res:   []types.Type{ByteSlice},
-			attrs: []llvm.Attribute{NoUnwindAttr},
-		},
-		{
-			name: "__go_string_to_int_array",
-			rfi:  &ri.stringToIntArray,
-			args: []types.Type{String},
-			res:  []types.Type{IntSlice},
-		},
-		{
-			name: "runtime.stringiter2",
-			rfi:  &ri.stringiter2,
-			args: []types.Type{String, Int},
-			res:  []types.Type{Int, Rune},
-		},
-		{
-			name: "__go_type_descriptors_equal",
-			rfi:  &ri.typeDescriptorsEqual,
-			args: []types.Type{UnsafePointer, UnsafePointer},
-			res:  []types.Type{Bool},
-		},
-		{
-			name: "__go_undefer",
-			rfi:  &ri.undefer,
-			args: []types.Type{UnsafePointer},
-		},
-	} {
-		rt.rfi.init(tm, module, rt.name, rt.args, rt.res)
-		for _, attr := range rt.attrs {
-			rt.rfi.fn.AddFunctionAttr(attr)
-		}
-	}
-
-	memsetName := "llvm.memset.p0i8.i" + strconv.Itoa(tm.target.IntPtrType().IntTypeWidth())
-	memsetType := llvm.FunctionType(
-		llvm.VoidType(),
-		[]llvm.Type{
-			llvm.PointerType(llvm.Int8Type(), 0),
-			llvm.Int8Type(),
-			tm.target.IntPtrType(),
-			llvm.Int1Type(),
-		},
-		false,
-	)
-	ri.memset = llvm.AddFunction(module, memsetName, memsetType)
-
-	memcpyName := "llvm.memcpy.p0i8.p0i8.i" + strconv.Itoa(tm.target.IntPtrType().IntTypeWidth())
-	memcpyType := llvm.FunctionType(
-		llvm.VoidType(),
-		[]llvm.Type{
-			llvm.PointerType(llvm.Int8Type(), 0),
-			llvm.PointerType(llvm.Int8Type(), 0),
-			llvm.Int64Type(),
-			llvm.Int1Type(),
-		},
-		false,
-	)
-	ri.memcpy = llvm.AddFunction(module, memcpyName, memcpyType)
-
-	returnaddressType := llvm.FunctionType(
-		llvm.PointerType(llvm.Int8Type(), 0),
-		[]llvm.Type{llvm.Int32Type()},
-		false,
-	)
-	ri.returnaddress = llvm.AddFunction(module, "llvm.returnaddress", returnaddressType)
-
-	gccgoPersonalityType := llvm.FunctionType(
-		llvm.Int32Type(),
-		[]llvm.Type{
-			llvm.Int32Type(),
-			llvm.Int64Type(),
-			llvm.PointerType(llvm.Int8Type(), 0),
-			llvm.PointerType(llvm.Int8Type(), 0),
-		},
-		false,
-	)
-	ri.gccgoPersonality = llvm.AddFunction(module, "__gccgo_personality_v0", gccgoPersonalityType)
-
-	ri.gccgoExceptionType = llvm.StructType(
-		[]llvm.Type{
-			llvm.PointerType(llvm.Int8Type(), 0),
-			llvm.Int32Type(),
-		},
-		false,
-	)
-
-	return &ri, nil
-}
-
-func (fr *frame) createZExtOrTrunc(v llvm.Value, t llvm.Type, name string) llvm.Value {
-	switch n := v.Type().IntTypeWidth() - t.IntTypeWidth(); {
-	case n < 0:
-		v = fr.builder.CreateZExt(v, fr.target.IntPtrType(), name)
-	case n > 0:
-		v = fr.builder.CreateTrunc(v, fr.target.IntPtrType(), name)
-	}
-	return v
-}
-
-func (fr *frame) createTypeMalloc(t types.Type) llvm.Value {
-	size := llvm.ConstInt(fr.target.IntPtrType(), uint64(fr.llvmtypes.Sizeof(t)), false)
-	malloc := fr.runtime.New.callOnly(fr, fr.types.ToRuntime(t), size)[0]
-	return fr.builder.CreateBitCast(malloc, llvm.PointerType(fr.types.ToLLVM(t), 0), "")
-}
-
-func (fr *frame) memsetZero(ptr llvm.Value, size llvm.Value) {
-	memset := fr.runtime.memset
-	ptr = fr.builder.CreateBitCast(ptr, llvm.PointerType(llvm.Int8Type(), 0), "")
-	fill := llvm.ConstNull(llvm.Int8Type())
-	size = fr.createZExtOrTrunc(size, fr.target.IntPtrType(), "")
-	isvolatile := llvm.ConstNull(llvm.Int1Type())
-	fr.builder.CreateCall(memset, []llvm.Value{ptr, fill, size, isvolatile}, "")
-}
-
-func (fr *frame) memcpy(dest llvm.Value, src llvm.Value, size llvm.Value) {
-	memcpy := fr.runtime.memcpy
-	dest = fr.builder.CreateBitCast(dest, llvm.PointerType(llvm.Int8Type(), 0), "")
-	src = fr.builder.CreateBitCast(src, llvm.PointerType(llvm.Int8Type(), 0), "")
-	size = fr.createZExtOrTrunc(size, fr.target.IntPtrType(), "")
-	isvolatile := llvm.ConstNull(llvm.Int1Type())
-	fr.builder.CreateCall(memcpy, []llvm.Value{dest, src, size, isvolatile}, "")
-}
-
-func (fr *frame) returnAddress(level uint64) llvm.Value {
-	returnaddress := fr.runtime.returnaddress
-	levelValue := llvm.ConstInt(llvm.Int32Type(), level, false)
-	return fr.builder.CreateCall(returnaddress, []llvm.Value{levelValue}, "")
-}
diff --git a/irgen/slice.go b/irgen/slice.go
deleted file mode 100644
index f987155..0000000
--- a/irgen/slice.go
+++ /dev/null
@@ -1,105 +0,0 @@
-//===- slice.go - IR generation for slices --------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements IR generation for slices.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-// makeSlice allocates a new slice with the optional length and capacity,
-// initialising its contents to their zero values.
-func (fr *frame) makeSlice(sliceType types.Type, length, capacity *govalue) *govalue {
-	length = fr.convert(length, types.Typ[types.Uintptr])
-	capacity = fr.convert(capacity, types.Typ[types.Uintptr])
-	runtimeType := fr.types.ToRuntime(sliceType)
-	llslice := fr.runtime.makeSlice.call(fr, runtimeType, length.value, capacity.value)
-	return newValue(llslice[0], sliceType)
-}
-
-func (fr *frame) slice(x llvm.Value, xtyp types.Type, low, high, max llvm.Value) llvm.Value {
-	if !low.IsNil() {
-		low = fr.createZExtOrTrunc(low, fr.types.inttype, "")
-	} else {
-		low = llvm.ConstNull(fr.types.inttype)
-	}
-	if !high.IsNil() {
-		high = fr.createZExtOrTrunc(high, fr.types.inttype, "")
-	}
-	if !max.IsNil() {
-		max = fr.createZExtOrTrunc(max, fr.types.inttype, "")
-	}
-
-	var arrayptr, arraylen, arraycap llvm.Value
-	var elemtyp types.Type
-	var errcode uint64
-	switch typ := xtyp.Underlying().(type) {
-	case *types.Pointer: // *array
-		errcode = gccgoRuntimeErrorARRAY_SLICE_OUT_OF_BOUNDS
-		arraytyp := typ.Elem().Underlying().(*types.Array)
-		elemtyp = arraytyp.Elem()
-		arrayptr = x
-		arrayptr = fr.builder.CreateBitCast(arrayptr, llvm.PointerType(llvm.Int8Type(), 0), "")
-		arraylen = llvm.ConstInt(fr.llvmtypes.inttype, uint64(arraytyp.Len()), false)
-		arraycap = arraylen
-	case *types.Slice:
-		errcode = gccgoRuntimeErrorSLICE_SLICE_OUT_OF_BOUNDS
-		elemtyp = typ.Elem()
-		arrayptr = fr.builder.CreateExtractValue(x, 0, "")
-		arraylen = fr.builder.CreateExtractValue(x, 1, "")
-		arraycap = fr.builder.CreateExtractValue(x, 2, "")
-	case *types.Basic:
-		if high.IsNil() {
-			high = llvm.ConstAllOnes(fr.types.inttype) // -1
-		}
-		result := fr.runtime.stringSlice.call(fr, x, low, high)
-		return result[0]
-	default:
-		panic("unimplemented")
-	}
-	if high.IsNil() {
-		high = arraylen
-	}
-	if max.IsNil() {
-		max = arraycap
-	}
-
-	// Bounds checking: 0 <= low <= high <= max <= cap
-	zero := llvm.ConstNull(fr.types.inttype)
-	l0 := fr.builder.CreateICmp(llvm.IntSLT, low, zero, "")
-	hl := fr.builder.CreateICmp(llvm.IntSLT, high, low, "")
-	mh := fr.builder.CreateICmp(llvm.IntSLT, max, high, "")
-	cm := fr.builder.CreateICmp(llvm.IntSLT, arraycap, max, "")
-
-	cond := fr.builder.CreateOr(l0, hl, "")
-	cond = fr.builder.CreateOr(cond, mh, "")
-	cond = fr.builder.CreateOr(cond, cm, "")
-
-	fr.condBrRuntimeError(cond, errcode)
-
-	slicelen := fr.builder.CreateSub(high, low, "")
-	slicecap := fr.builder.CreateSub(max, low, "")
-
-	elemsize := llvm.ConstInt(fr.llvmtypes.inttype, uint64(fr.llvmtypes.Sizeof(elemtyp)), false)
-	offset := fr.builder.CreateMul(low, elemsize, "")
-
-	sliceptr := fr.builder.CreateInBoundsGEP(arrayptr, []llvm.Value{offset}, "")
-
-	llslicetyp := fr.llvmtypes.sliceBackendType().ToLLVM(fr.llvmtypes.ctx)
-	sliceValue := llvm.Undef(llslicetyp)
-	sliceValue = fr.builder.CreateInsertValue(sliceValue, sliceptr, 0, "")
-	sliceValue = fr.builder.CreateInsertValue(sliceValue, slicelen, 1, "")
-	sliceValue = fr.builder.CreateInsertValue(sliceValue, slicecap, 2, "")
-
-	return sliceValue
-}
diff --git a/irgen/ssa.go b/irgen/ssa.go
deleted file mode 100644
index ed45e2c..0000000
--- a/irgen/ssa.go
+++ /dev/null
@@ -1,1342 +0,0 @@
-//===- ssa.go - IR generation from go/ssa ---------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements the top-level LLVM IR generation from go/ssa form.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"fmt"
-	"go/ast"
-	"go/token"
-	"os"
-	"sort"
-
-	"llvm.org/llgo/ssaopt"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/ssa/ssautil"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-// A globalInit is used to temporarily store a global's initializer until
-// we are ready to build it.
-type globalInit struct {
-	val   llvm.Value
-	elems []globalInit
-}
-
-func (gi *globalInit) update(typ llvm.Type, indices []uint32, val llvm.Value) {
-	if len(indices) == 0 {
-		gi.val = val
-		return
-	}
-
-	if gi.val.C != nil {
-		gi.val = llvm.ConstInsertValue(gi.val, val, indices)
-	}
-
-	tk := typ.TypeKind()
-
-	if len(gi.elems) == 0 {
-		switch tk {
-		case llvm.StructTypeKind:
-			gi.elems = make([]globalInit, typ.StructElementTypesCount())
-		case llvm.ArrayTypeKind:
-			gi.elems = make([]globalInit, typ.ArrayLength())
-		default:
-			panic("unexpected type")
-		}
-	}
-
-	var eltyp llvm.Type
-	switch tk {
-	case llvm.StructTypeKind:
-		eltyp = typ.StructElementTypes()[indices[0]]
-	case llvm.ArrayTypeKind:
-		eltyp = typ.ElementType()
-	default:
-		panic("unexpected type")
-	}
-
-	gi.elems[indices[0]].update(eltyp, indices[1:], val)
-}
-
-func (gi *globalInit) build(typ llvm.Type) llvm.Value {
-	if gi.val.C != nil {
-		return gi.val
-	}
-	if len(gi.elems) == 0 {
-		return llvm.ConstNull(typ)
-	}
-
-	switch typ.TypeKind() {
-	case llvm.StructTypeKind:
-		eltypes := typ.StructElementTypes()
-		elems := make([]llvm.Value, len(eltypes))
-		for i, eltyp := range eltypes {
-			elems[i] = gi.elems[i].build(eltyp)
-		}
-		return llvm.ConstStruct(elems, false)
-	case llvm.ArrayTypeKind:
-		eltyp := typ.ElementType()
-		elems := make([]llvm.Value, len(gi.elems))
-		for i := range gi.elems {
-			elems[i] = gi.elems[i].build(eltyp)
-		}
-		return llvm.ConstArray(eltyp, elems)
-	default:
-		panic("unexpected type")
-	}
-}
-
-type unit struct {
-	*compiler
-	pkg         *ssa.Package
-	globals     map[ssa.Value]llvm.Value
-	globalInits map[llvm.Value]*globalInit
-
-	// funcDescriptors maps *ssa.Functions to function descriptors,
-	// the first-class representation of functions.
-	funcDescriptors map[*ssa.Function]llvm.Value
-
-	// undefinedFuncs contains functions that have been resolved
-	// (declared) but not defined.
-	undefinedFuncs map[*ssa.Function]bool
-
-	gcRoots []llvm.Value
-}
-
-func newUnit(c *compiler, pkg *ssa.Package) *unit {
-	u := &unit{
-		compiler:        c,
-		pkg:             pkg,
-		globals:         make(map[ssa.Value]llvm.Value),
-		globalInits:     make(map[llvm.Value]*globalInit),
-		funcDescriptors: make(map[*ssa.Function]llvm.Value),
-		undefinedFuncs:  make(map[*ssa.Function]bool),
-	}
-	return u
-}
-
-type byMemberName []ssa.Member
-
-func (ms byMemberName) Len() int { return len(ms) }
-func (ms byMemberName) Swap(i, j int) {
-	ms[i], ms[j] = ms[j], ms[i]
-}
-func (ms byMemberName) Less(i, j int) bool {
-	return ms[i].Name() < ms[j].Name()
-}
-
-type byFunctionString []*ssa.Function
-
-func (fns byFunctionString) Len() int { return len(fns) }
-func (fns byFunctionString) Swap(i, j int) {
-	fns[i], fns[j] = fns[j], fns[i]
-}
-func (fns byFunctionString) Less(i, j int) bool {
-	return fns[i].String() < fns[j].String()
-}
-
-// Emit functions in order of their fully qualified names. This is so that a
-// bootstrap build can be verified by comparing the stage2 and stage3 binaries.
-func (u *unit) defineFunctionsInOrder(functions map[*ssa.Function]bool) {
-	fns := []*ssa.Function{}
-	for f, _ := range functions {
-		fns = append(fns, f)
-	}
-	sort.Sort(byFunctionString(fns))
-	for _, f := range fns {
-		u.defineFunction(f)
-	}
-}
-
-// translatePackage translates an *ssa.Package into an LLVM module, and returns
-// the translation unit information.
-func (u *unit) translatePackage(pkg *ssa.Package) {
-	ms := make([]ssa.Member, len(pkg.Members))
-	i := 0
-	for _, m := range pkg.Members {
-		ms[i] = m
-		i++
-	}
-
-	sort.Sort(byMemberName(ms))
-
-	// Initialize global storage and type descriptors for this package.
-	// We must create globals regardless of whether they're referenced,
-	// hence the duplication in frame.value.
-	for _, m := range ms {
-		switch v := m.(type) {
-		case *ssa.Global:
-			elemtyp := deref(v.Type())
-			llelemtyp := u.llvmtypes.ToLLVM(elemtyp)
-			vname := u.types.mc.mangleGlobalName(v)
-			global := llvm.AddGlobal(u.module.Module, llelemtyp, vname)
-			if !v.Object().Exported() {
-				global.SetLinkage(llvm.InternalLinkage)
-			}
-			u.addGlobal(global, elemtyp)
-			global = llvm.ConstBitCast(global, u.llvmtypes.ToLLVM(v.Type()))
-			u.globals[v] = global
-		case *ssa.Type:
-			u.types.getTypeDescriptorPointer(v.Type())
-		}
-	}
-
-	// Define functions.
-	u.defineFunctionsInOrder(ssautil.AllFunctions(pkg.Prog))
-
-	// Emit initializers for type descriptors, which may trigger
-	// the resolution of additional functions.
-	u.types.emitTypeDescInitializers()
-
-	// Define remaining functions that were resolved during
-	// runtime type mapping, but not defined.
-	u.defineFunctionsInOrder(u.undefinedFuncs)
-
-	// Set initializers for globals.
-	for global, init := range u.globalInits {
-		initval := init.build(global.Type().ElementType())
-		global.SetInitializer(initval)
-	}
-}
-
-func (u *unit) addGlobal(global llvm.Value, ty types.Type) {
-	u.globalInits[global] = new(globalInit)
-
-	if hasPointers(ty) {
-		global = llvm.ConstBitCast(global, llvm.PointerType(llvm.Int8Type(), 0))
-		size := llvm.ConstInt(u.types.inttype, uint64(u.types.Sizeof(ty)), false)
-		root := llvm.ConstStruct([]llvm.Value{global, size}, false)
-		u.gcRoots = append(u.gcRoots, root)
-	}
-}
-
-// ResolveMethod implements MethodResolver.ResolveMethod.
-func (u *unit) ResolveMethod(s *types.Selection) *govalue {
-	m := u.pkg.Prog.Method(s)
-	llfn := u.resolveFunctionGlobal(m)
-	llfn = llvm.ConstBitCast(llfn, llvm.PointerType(llvm.Int8Type(), 0))
-	return newValue(llfn, m.Signature)
-}
-
-// resolveFunctionDescriptorGlobal returns a reference to the LLVM global
-// storing the function's descriptor.
-func (u *unit) resolveFunctionDescriptorGlobal(f *ssa.Function) llvm.Value {
-	llfd, ok := u.funcDescriptors[f]
-	if !ok {
-		name := u.types.mc.mangleFunctionName(f) + "$descriptor"
-		llfd = llvm.AddGlobal(u.module.Module, llvm.PointerType(llvm.Int8Type(), 0), name)
-		llfd.SetGlobalConstant(true)
-		u.funcDescriptors[f] = llfd
-	}
-	return llfd
-}
-
-// resolveFunctionDescriptor returns a function's
-// first-class value representation.
-func (u *unit) resolveFunctionDescriptor(f *ssa.Function) *govalue {
-	llfd := u.resolveFunctionDescriptorGlobal(f)
-	llfd = llvm.ConstBitCast(llfd, llvm.PointerType(llvm.Int8Type(), 0))
-	return newValue(llfd, f.Signature)
-}
-
-// resolveFunctionGlobal returns an llvm.Value for a function global.
-func (u *unit) resolveFunctionGlobal(f *ssa.Function) llvm.Value {
-	if v, ok := u.globals[f]; ok {
-		return v
-	}
-	name := u.types.mc.mangleFunctionName(f)
-	// It's possible that the function already exists in the module;
-	// for example, if it's a runtime intrinsic that the compiler
-	// has already referenced.
-	llvmFunction := u.module.Module.NamedFunction(name)
-	if llvmFunction.IsNil() {
-		fti := u.llvmtypes.getSignatureInfo(f.Signature)
-		llvmFunction = fti.declare(u.module.Module, name)
-		u.undefinedFuncs[f] = true
-	}
-	u.globals[f] = llvmFunction
-	return llvmFunction
-}
-
-func (u *unit) getFunctionLinkage(f *ssa.Function) llvm.Linkage {
-	switch {
-	case f.Pkg == nil:
-		// Synthetic functions outside packages may appear in multiple packages.
-		return llvm.LinkOnceODRLinkage
-
-	case f.Parent() != nil:
-		// Anonymous.
-		return llvm.InternalLinkage
-
-	case f.Signature.Recv() == nil && !ast.IsExported(f.Name()) &&
-		!(f.Name() == "main" && f.Pkg.Object.Path() == "main") &&
-		f.Name() != "init":
-		// Unexported methods may be referenced as part of an interface method
-		// table in another package. TODO(pcc): detect when this cannot happen.
-		return llvm.InternalLinkage
-
-	default:
-		return llvm.ExternalLinkage
-	}
-}
-
-func (u *unit) defineFunction(f *ssa.Function) {
-	// Only define functions from this package, or synthetic
-	// wrappers (which do not have a package).
-	if f.Pkg != nil && f.Pkg != u.pkg {
-		return
-	}
-
-	llfn := u.resolveFunctionGlobal(f)
-	linkage := u.getFunctionLinkage(f)
-
-	isMethod := f.Signature.Recv() != nil
-
-	// Methods cannot be referred to via a descriptor.
-	if !isMethod {
-		llfd := u.resolveFunctionDescriptorGlobal(f)
-		llfd.SetInitializer(llvm.ConstBitCast(llfn, llvm.PointerType(llvm.Int8Type(), 0)))
-		llfd.SetLinkage(linkage)
-	}
-
-	// We only need to emit a descriptor for functions without bodies.
-	if len(f.Blocks) == 0 {
-		return
-	}
-
-	ssaopt.LowerAllocsToStack(f)
-
-	if u.DumpSSA {
-		f.WriteTo(os.Stderr)
-	}
-
-	fr := newFrame(u, llfn)
-	defer fr.dispose()
-	fr.addCommonFunctionAttrs(fr.function)
-	fr.function.SetLinkage(linkage)
-
-	fr.logf("Define function: %s @ %s", f.String(), fr.pkg.Prog.Fset.Position(f.Pos()))
-	fti := u.llvmtypes.getSignatureInfo(f.Signature)
-	delete(u.undefinedFuncs, f)
-	fr.retInf = fti.retInf
-
-	// Push the compile unit and function onto the debug context.
-	if u.GenerateDebug {
-		u.debug.PushFunction(fr.function, f.Signature, f.Pos())
-		defer u.debug.PopFunction()
-		u.debug.SetLocation(fr.builder, f.Pos())
-	}
-
-	// If a function calls recover, we create a separate function to
-	// hold the real function, and this function calls __go_can_recover
-	// and bridges to it.
-	if callsRecover(f) {
-		fr = fr.bridgeRecoverFunc(fr.function, fti)
-	}
-
-	fr.blocks = make([]llvm.BasicBlock, len(f.Blocks))
-	fr.lastBlocks = make([]llvm.BasicBlock, len(f.Blocks))
-	for i, block := range f.Blocks {
-		fr.blocks[i] = llvm.AddBasicBlock(fr.function, fmt.Sprintf(".%d.%s", i, block.Comment))
-	}
-	fr.builder.SetInsertPointAtEnd(fr.blocks[0])
-	fr.transformSwitches(f)
-
-	prologueBlock := llvm.InsertBasicBlock(fr.blocks[0], "prologue")
-	fr.builder.SetInsertPointAtEnd(prologueBlock)
-
-	for i, param := range f.Params {
-		llparam := fti.argInfos[i].decode(llvm.GlobalContext(), fr.builder, fr.builder)
-		if isMethod && i == 0 {
-			if _, ok := param.Type().Underlying().(*types.Pointer); !ok {
-				llparam = fr.builder.CreateBitCast(llparam, llvm.PointerType(fr.types.ToLLVM(param.Type()), 0), "")
-				llparam = fr.builder.CreateLoad(llparam, "")
-			}
-		}
-		fr.env[param] = newValue(llparam, param.Type())
-	}
-
-	// Load closure, extract free vars.
-	if len(f.FreeVars) > 0 {
-		for _, fv := range f.FreeVars {
-			fr.env[fv] = newValue(llvm.ConstNull(u.llvmtypes.ToLLVM(fv.Type())), fv.Type())
-		}
-		elemTypes := make([]llvm.Type, len(f.FreeVars)+1)
-		elemTypes[0] = llvm.PointerType(llvm.Int8Type(), 0) // function pointer
-		for i, fv := range f.FreeVars {
-			elemTypes[i+1] = u.llvmtypes.ToLLVM(fv.Type())
-		}
-		structType := llvm.StructType(elemTypes, false)
-		closure := fr.function.Param(fti.chainIndex)
-		closure = fr.builder.CreateBitCast(closure, llvm.PointerType(structType, 0), "")
-		for i, fv := range f.FreeVars {
-			ptr := fr.builder.CreateStructGEP(closure, i+1, "")
-			ptr = fr.builder.CreateLoad(ptr, "")
-			fr.env[fv] = newValue(ptr, fv.Type())
-		}
-	}
-
-	// Allocate stack space for locals in the prologue block.
-	for _, local := range f.Locals {
-		typ := fr.llvmtypes.ToLLVM(deref(local.Type()))
-		alloca := fr.builder.CreateAlloca(typ, local.Comment)
-		fr.memsetZero(alloca, llvm.SizeOf(typ))
-		bcalloca := fr.builder.CreateBitCast(alloca, llvm.PointerType(llvm.Int8Type(), 0), "")
-		value := newValue(bcalloca, local.Type())
-		fr.env[local] = value
-	}
-
-	// If the function contains any defers, we must first create
-	// an unwind block. We can short-circuit the check for defers with
-	// f.Recover != nil.
-	if f.Recover != nil || hasDefer(f) {
-		fr.unwindBlock = llvm.AddBasicBlock(fr.function, "unwind")
-		fr.frameptr = fr.builder.CreateAlloca(llvm.Int8Type(), "")
-	}
-
-	// Keep track of the block into which we need to insert the call
-	// to __go_register_gc_roots. This needs to be inserted after the
-	// init guard check under the llgo ABI.
-	var registerGcBlock llvm.BasicBlock
-
-	// If this is the "init" function, emit the init guard check and
-	// enable init-specific optimizations.
-	if !isMethod && f.Name() == "init" {
-		registerGcBlock = fr.emitInitPrologue()
-		fr.isInit = true
-	}
-
-	fr.builder.CreateBr(fr.blocks[0])
-	fr.allocaBuilder.SetInsertPointBefore(prologueBlock.FirstInstruction())
-
-	for _, block := range f.DomPreorder() {
-		llblock := fr.blocks[block.Index]
-		if llblock.IsNil() {
-			continue
-		}
-		fr.translateBlock(block, llblock)
-	}
-
-	fr.fixupPhis()
-
-	if !fr.unwindBlock.IsNil() {
-		fr.setupUnwindBlock(f.Recover)
-	}
-
-	// The init function needs to register the GC roots first. We do this
-	// after generating code for it because allocations may have caused
-	// additional GC roots to be created.
-	if fr.isInit {
-		fr.builder.SetInsertPointBefore(registerGcBlock.FirstInstruction())
-		fr.registerGcRoots()
-	}
-}
-
-type pendingPhi struct {
-	ssa  *ssa.Phi
-	llvm llvm.Value
-}
-
-type frame struct {
-	*unit
-	function               llvm.Value
-	builder, allocaBuilder llvm.Builder
-	retInf                 retInfo
-	blocks                 []llvm.BasicBlock
-	lastBlocks             []llvm.BasicBlock
-	runtimeErrorBlocks     [gccgoRuntimeErrorCount]llvm.BasicBlock
-	unwindBlock            llvm.BasicBlock
-	frameptr               llvm.Value
-	env                    map[ssa.Value]*govalue
-	ptr                    map[ssa.Value]llvm.Value
-	tuples                 map[ssa.Value][]*govalue
-	phis                   []pendingPhi
-	canRecover             llvm.Value
-	isInit                 bool
-}
-
-func newFrame(u *unit, fn llvm.Value) *frame {
-	return &frame{
-		unit:          u,
-		function:      fn,
-		builder:       llvm.GlobalContext().NewBuilder(),
-		allocaBuilder: llvm.GlobalContext().NewBuilder(),
-		env:           make(map[ssa.Value]*govalue),
-		ptr:           make(map[ssa.Value]llvm.Value),
-		tuples:        make(map[ssa.Value][]*govalue),
-	}
-}
-
-func (fr *frame) dispose() {
-	fr.builder.Dispose()
-	fr.allocaBuilder.Dispose()
-}
-
-// emitInitPrologue emits the init-specific function prologue (guard check and
-// initialization of dependent packages under the llgo native ABI), and returns
-// the basic block into which the GC registration call should be emitted.
-func (fr *frame) emitInitPrologue() llvm.BasicBlock {
-	if fr.GccgoABI {
-		return fr.builder.GetInsertBlock()
-	}
-
-	initGuard := llvm.AddGlobal(fr.module.Module, llvm.Int1Type(), "init$guard")
-	initGuard.SetLinkage(llvm.InternalLinkage)
-	initGuard.SetInitializer(llvm.ConstNull(llvm.Int1Type()))
-
-	returnBlock := llvm.AddBasicBlock(fr.function, "")
-	initBlock := llvm.AddBasicBlock(fr.function, "")
-
-	initGuardVal := fr.builder.CreateLoad(initGuard, "")
-	fr.builder.CreateCondBr(initGuardVal, returnBlock, initBlock)
-
-	fr.builder.SetInsertPointAtEnd(returnBlock)
-	fr.builder.CreateRetVoid()
-
-	fr.builder.SetInsertPointAtEnd(initBlock)
-	fr.builder.CreateStore(llvm.ConstInt(llvm.Int1Type(), 1, false), initGuard)
-	int8ptr := llvm.PointerType(fr.types.ctx.Int8Type(), 0)
-	ftyp := llvm.FunctionType(llvm.VoidType(), []llvm.Type{int8ptr}, false)
-	for _, pkg := range fr.pkg.Object.Imports() {
-		initname := ManglePackagePath(pkg.Path()) + "..import"
-		initfn := fr.module.Module.NamedFunction(initname)
-		if initfn.IsNil() {
-			initfn = llvm.AddFunction(fr.module.Module, initname, ftyp)
-		}
-		args := []llvm.Value{llvm.Undef(int8ptr)}
-		fr.builder.CreateCall(initfn, args, "")
-	}
-
-	return initBlock
-}
-
-// bridgeRecoverFunc creates a function that may call recover(), and creates
-// a call to it from the current frame. The created function will be called
-// with a boolean parameter that indicates whether it may call recover().
-//
-// The created function will have the same name as the current frame's function
-// with "$recover" appended, having the same return types and parameters with
-// an additional boolean parameter appended.
-//
-// A new frame will be returned for the newly created function.
-func (fr *frame) bridgeRecoverFunc(llfn llvm.Value, fti functionTypeInfo) *frame {
-	// The bridging function must not be inlined, or the return address
-	// may not correspond to the source function.
-	attrKind := llvm.AttributeKindID("noinline")
-	noInlineAttr := fr.module.Context().CreateEnumAttribute(attrKind, 0)
-	llfn.AddFunctionAttr(noInlineAttr)
-
-	// Call __go_can_recover, passing in the function's return address.
-	entry := llvm.AddBasicBlock(llfn, "entry")
-	fr.builder.SetInsertPointAtEnd(entry)
-	canRecover := fr.runtime.canRecover.call(fr, fr.returnAddress(0))[0]
-	returnType := fti.functionType.ReturnType()
-	argTypes := fti.functionType.ParamTypes()
-	argTypes = append(argTypes, canRecover.Type())
-
-	// Create and call the $recover function.
-	ftiRecover := fti
-	ftiRecover.functionType = llvm.FunctionType(returnType, argTypes, false)
-	llfnRecover := ftiRecover.declare(fr.module.Module, llfn.Name()+"$recover")
-	fr.addCommonFunctionAttrs(llfnRecover)
-	llfnRecover.SetLinkage(llvm.InternalLinkage)
-	args := make([]llvm.Value, len(argTypes)-1, len(argTypes))
-	for i := range args {
-		args[i] = llfn.Param(i)
-	}
-	args = append(args, canRecover)
-	result := fr.builder.CreateCall(llfnRecover, args, "")
-	if returnType.TypeKind() == llvm.VoidTypeKind {
-		fr.builder.CreateRetVoid()
-	} else {
-		fr.builder.CreateRet(result)
-	}
-
-	// The $recover function must condition calls to __go_recover on
-	// the result of __go_can_recover passed in as an argument.
-	fr = newFrame(fr.unit, llfnRecover)
-	fr.retInf = ftiRecover.retInf
-	fr.canRecover = fr.function.Param(len(argTypes) - 1)
-	return fr
-}
-
-func (fr *frame) registerGcRoots() {
-	if len(fr.gcRoots) != 0 {
-		rootty := fr.gcRoots[0].Type()
-		roots := append(fr.gcRoots, llvm.ConstNull(rootty))
-		rootsarr := llvm.ConstArray(rootty, roots)
-		rootsstruct := llvm.ConstStruct([]llvm.Value{llvm.ConstNull(llvm.PointerType(llvm.Int8Type(), 0)), rootsarr}, false)
-
-		rootsglobal := llvm.AddGlobal(fr.module.Module, rootsstruct.Type(), "")
-		rootsglobal.SetInitializer(rootsstruct)
-		rootsglobal.SetLinkage(llvm.InternalLinkage)
-		fr.runtime.registerGcRoots.callOnly(fr, llvm.ConstBitCast(rootsglobal, llvm.PointerType(llvm.Int8Type(), 0)))
-	}
-}
-
-func (fr *frame) fixupPhis() {
-	for _, phi := range fr.phis {
-		values := make([]llvm.Value, len(phi.ssa.Edges))
-		blocks := make([]llvm.BasicBlock, len(phi.ssa.Edges))
-		block := phi.ssa.Block()
-		for i, edge := range phi.ssa.Edges {
-			values[i] = fr.llvmvalue(edge)
-			blocks[i] = fr.lastBlock(block.Preds[i])
-		}
-		phi.llvm.AddIncoming(values, blocks)
-	}
-}
-
-func (fr *frame) createLandingPad(cleanup bool) llvm.Value {
-	fr.function.SetPersonality(fr.runtime.gccgoPersonality)
-	lp := fr.builder.CreateLandingPad(fr.runtime.gccgoExceptionType, 0, "")
-	if cleanup {
-		lp.SetCleanup(true)
-	} else {
-		lp.AddClause(llvm.ConstNull(llvm.PointerType(llvm.Int8Type(), 0)))
-	}
-	return lp
-}
-
-// Runs defers. If a defer panics, check for recovers in later defers.
-func (fr *frame) runDefers() {
-	loopbb := llvm.AddBasicBlock(fr.function, "")
-	fr.builder.CreateBr(loopbb)
-
-	retrylpad := llvm.AddBasicBlock(fr.function, "")
-	fr.builder.SetInsertPointAtEnd(retrylpad)
-	fr.createLandingPad(false)
-	fr.runtime.checkDefer.callOnly(fr, fr.frameptr)
-	fr.builder.CreateBr(loopbb)
-
-	fr.builder.SetInsertPointAtEnd(loopbb)
-	fr.runtime.undefer.invoke(fr, retrylpad, fr.frameptr)
-}
-
-func (fr *frame) setupUnwindBlock(rec *ssa.BasicBlock) {
-	var recoverbb llvm.BasicBlock
-	if rec != nil {
-		recoverbb = fr.blocks[rec.Index]
-	} else {
-		recoverbb = llvm.AddBasicBlock(fr.function, "recover")
-		fr.builder.SetInsertPointAtEnd(recoverbb)
-		fr.builder.CreateUnreachable()
-	}
-
-	checkunwindbb := llvm.AddBasicBlock(fr.function, "")
-	fr.builder.SetInsertPointAtEnd(checkunwindbb)
-	exc := fr.createLandingPad(true)
-	fr.runDefers()
-
-	frame := fr.builder.CreateLoad(fr.frameptr, "")
-	shouldresume := fr.builder.CreateIsNull(frame, "")
-
-	resumebb := llvm.AddBasicBlock(fr.function, "")
-	fr.builder.CreateCondBr(shouldresume, resumebb, recoverbb)
-
-	fr.builder.SetInsertPointAtEnd(resumebb)
-	fr.builder.CreateResume(exc)
-
-	fr.builder.SetInsertPointAtEnd(fr.unwindBlock)
-	fr.createLandingPad(false)
-	fr.runtime.checkDefer.invoke(fr, checkunwindbb, fr.frameptr)
-	fr.runDefers()
-	fr.builder.CreateBr(recoverbb)
-}
-
-func (fr *frame) translateBlock(b *ssa.BasicBlock, llb llvm.BasicBlock) {
-	fr.builder.SetInsertPointAtEnd(llb)
-	for _, instr := range b.Instrs {
-		fr.instruction(instr)
-	}
-	fr.lastBlocks[b.Index] = fr.builder.GetInsertBlock()
-}
-
-func (fr *frame) block(b *ssa.BasicBlock) llvm.BasicBlock {
-	return fr.blocks[b.Index]
-}
-
-func (fr *frame) lastBlock(b *ssa.BasicBlock) llvm.BasicBlock {
-	return fr.lastBlocks[b.Index]
-}
-
-func (fr *frame) value(v ssa.Value) (result *govalue) {
-	switch v := v.(type) {
-	case nil:
-		return nil
-	case *ssa.Function:
-		return fr.resolveFunctionDescriptor(v)
-	case *ssa.Const:
-		return fr.newValueFromConst(v.Value, v.Type())
-	case *ssa.Global:
-		if g, ok := fr.globals[v]; ok {
-			return newValue(g, v.Type())
-		}
-		// Create an external global. Globals for this package are defined
-		// on entry to translatePackage, and have initialisers.
-		llelemtyp := fr.llvmtypes.ToLLVM(deref(v.Type()))
-		vname := fr.types.mc.mangleGlobalName(v)
-		llglobal := llvm.AddGlobal(fr.module.Module, llelemtyp, vname)
-		llglobal = llvm.ConstBitCast(llglobal, fr.llvmtypes.ToLLVM(v.Type()))
-		fr.globals[v] = llglobal
-		return newValue(llglobal, v.Type())
-	}
-	if value, ok := fr.env[v]; ok {
-		return value
-	}
-
-	panic(fmt.Errorf("Instruction %q not visited yet", v.Name()))
-}
-
-func (fr *frame) llvmvalue(v ssa.Value) llvm.Value {
-	if gv := fr.value(v); gv != nil {
-		return gv.value
-	} else {
-		return llvm.Value{nil}
-	}
-}
-
-func (fr *frame) isNonNull(v ssa.Value) bool {
-	switch v.(type) {
-	case
-		// Globals have a fixed (non-nil) address.
-		*ssa.Global,
-		// The language does not specify what happens if an allocation fails.
-		*ssa.Alloc,
-		// These have already been nil checked.
-		*ssa.FieldAddr, *ssa.IndexAddr:
-		return true
-	default:
-		return false
-	}
-}
-
-func (fr *frame) nilCheck(v ssa.Value, llptr llvm.Value) {
-	if !fr.isNonNull(v) {
-		ptrnull := fr.builder.CreateIsNull(llptr, "")
-		fr.condBrRuntimeError(ptrnull, gccgoRuntimeErrorNIL_DEREFERENCE)
-	}
-}
-
-func (fr *frame) canAvoidElementLoad(ptr ssa.Value) bool {
-	for _, ref := range *ptr.Referrers() {
-		switch ref := ref.(type) {
-		case *ssa.Field:
-		case *ssa.Index:
-			if ref.X != ptr {
-				return false
-			}
-			// ok
-		default:
-			return false
-		}
-	}
-
-	return true
-}
-
-// If this value is sufficiently large, look through referrers to see if we can
-// avoid a load.
-func (fr *frame) canAvoidLoad(instr *ssa.UnOp, op llvm.Value) bool {
-	if fr.types.Sizeof(instr.Type()) < 2*fr.types.Sizeof(types.Typ[types.Int]) {
-		// Don't bother with small values.
-		return false
-	}
-
-	// Keep track of whether our pointer may escape. We conservatively assume
-	// that MakeInterfaces will escape.
-	esc := false
-
-	// We only know how to avoid loads if they are used to create an interface
-	// or read an element of the structure. If we see any other referrer, abort.
-	for _, ref := range *instr.Referrers() {
-		switch ref := ref.(type) {
-		case *ssa.MakeInterface:
-			esc = true
-		case *ssa.Field:
-		case *ssa.Index:
-			if ref.X != instr {
-				// This should never happen, as indices are always of type int
-				// and we don't bother with values smaller than 2*sizeof(int).
-				panic("impossible")
-			}
-			// ok
-		default:
-			return false
-		}
-	}
-
-	var opcopy llvm.Value
-	if esc {
-		opcopy = fr.createTypeMalloc(instr.Type())
-	} else {
-		opcopy = fr.allocaBuilder.CreateAlloca(fr.types.ToLLVM(instr.Type()), "")
-	}
-	fr.memcpy(opcopy, op, llvm.ConstInt(fr.types.inttype, uint64(fr.types.Sizeof(instr.Type())), false))
-
-	fr.ptr[instr] = opcopy
-	return true
-}
-
-// Return true iff we think it might be beneficial to turn this alloc instruction
-// into a statically allocated global.
-// Precondition: we are compiling the init function.
-func (fr *frame) shouldStaticallyAllocate(alloc *ssa.Alloc) bool {
-	// First, see if the allocated type is an array or struct, and if so determine
-	// the number of elements in the type. If the type is anything else, we
-	// statically allocate unconditionally.
-	var numElems int64
-	switch ty := deref(alloc.Type()).Underlying().(type) {
-	case *types.Array:
-		numElems = ty.Len()
-	case *types.Struct:
-		numElems = int64(ty.NumFields())
-	default:
-		return true
-	}
-
-	// We treat the number of referrers to the alloc instruction as a rough
-	// proxy for the number of elements initialized. If the data structure
-	// is densely initialized (> 1/4 elements initialized), enable the
-	// optimization.
-	return int64(len(*alloc.Referrers()))*4 > numElems
-}
-
-// If val is a constant and addr refers to a global variable which is defined in
-// this module or an element thereof, simulate the effect of storing val at addr
-// in the global variable's initializer and return true, otherwise return false.
-// Precondition: we are compiling the init function.
-func (fr *frame) maybeStoreInInitializer(val, addr llvm.Value) bool {
-	if val.IsAConstant().IsNil() {
-		return false
-	}
-
-	if !addr.IsAConstantExpr().IsNil() && addr.OperandsCount() >= 2 &&
-		// TODO(pcc): Explicitly check that this is a constant GEP.
-		// I don't think there are any other kinds of constantexpr which
-		// satisfy the conditions we test for here, so this is probably safe.
-		!addr.Operand(0).IsAGlobalVariable().IsNil() &&
-		addr.Operand(1).IsNull() {
-		gv := addr.Operand(0)
-		globalInit, ok := fr.globalInits[gv]
-		if !ok {
-			return false
-		}
-		indices := make([]uint32, addr.OperandsCount()-2)
-		for i := range indices {
-			op := addr.Operand(i + 2)
-			if op.IsAConstantInt().IsNil() {
-				return false
-			}
-			indices[i] = uint32(op.ZExtValue())
-		}
-		globalInit.update(gv.Type().ElementType(), indices, val)
-		return true
-	} else if !addr.IsAGlobalVariable().IsNil() {
-		if globalInit, ok := fr.globalInits[addr]; ok {
-			globalInit.update(addr.Type().ElementType(), nil, val)
-			return true
-		}
-		return false
-	} else {
-		return false
-	}
-}
-
-func (fr *frame) instruction(instr ssa.Instruction) {
-	fr.logf("[%T] %v @ %s\n", instr, instr, fr.pkg.Prog.Fset.Position(instr.Pos()))
-	if fr.GenerateDebug {
-		fr.debug.SetLocation(fr.builder, instr.Pos())
-	}
-
-	switch instr := instr.(type) {
-	case *ssa.Alloc:
-		typ := deref(instr.Type())
-		llvmtyp := fr.llvmtypes.ToLLVM(typ)
-		var value llvm.Value
-		if !instr.Heap {
-			value = fr.env[instr].value
-			fr.memsetZero(value, llvm.SizeOf(llvmtyp))
-		} else if fr.isInit && fr.shouldStaticallyAllocate(instr) {
-			// If this is the init function and we think it may be beneficial,
-			// allocate memory statically in the object file rather than on the
-			// heap. This allows us to optimize constant stores into such
-			// variables as static initializations.
-			global := llvm.AddGlobal(fr.module.Module, llvmtyp, "")
-			global.SetLinkage(llvm.InternalLinkage)
-			fr.addGlobal(global, typ)
-			ptr := llvm.ConstBitCast(global, llvm.PointerType(llvm.Int8Type(), 0))
-			fr.env[instr] = newValue(ptr, instr.Type())
-		} else {
-			value = fr.createTypeMalloc(typ)
-			value.SetName(instr.Comment)
-			value = fr.builder.CreateBitCast(value, llvm.PointerType(llvm.Int8Type(), 0), "")
-			fr.env[instr] = newValue(value, instr.Type())
-		}
-
-	case *ssa.BinOp:
-		lhs, rhs := fr.value(instr.X), fr.value(instr.Y)
-		fr.env[instr] = fr.binaryOp(lhs, instr.Op, rhs)
-
-	case *ssa.Call:
-		tuple := fr.callInstruction(instr)
-		if len(tuple) == 1 {
-			fr.env[instr] = tuple[0]
-		} else {
-			fr.tuples[instr] = tuple
-		}
-
-	case *ssa.ChangeInterface:
-		x := fr.value(instr.X)
-		// The source type must be a non-empty interface,
-		// as ChangeInterface cannot fail (E2I may fail).
-		if instr.Type().Underlying().(*types.Interface).NumMethods() > 0 {
-			x = fr.changeInterface(x, instr.Type(), false)
-		} else {
-			x = fr.convertI2E(x)
-		}
-		fr.env[instr] = x
-
-	case *ssa.ChangeType:
-		value := fr.llvmvalue(instr.X)
-		if _, ok := instr.Type().Underlying().(*types.Pointer); ok {
-			value = fr.builder.CreateBitCast(value, fr.llvmtypes.ToLLVM(instr.Type()), "")
-		}
-		fr.env[instr] = newValue(value, instr.Type())
-
-	case *ssa.Convert:
-		v := fr.value(instr.X)
-		fr.env[instr] = fr.convert(v, instr.Type())
-
-	case *ssa.Defer:
-		fn, arg := fr.createThunk(instr)
-		fr.runtime.Defer.call(fr, fr.frameptr, fn, arg)
-
-	case *ssa.Extract:
-		var elem llvm.Value
-		if t, ok := fr.tuples[instr.Tuple]; ok {
-			elem = t[instr.Index].value
-		} else {
-			tuple := fr.llvmvalue(instr.Tuple)
-			elem = fr.builder.CreateExtractValue(tuple, instr.Index, instr.Name())
-		}
-		elemtyp := instr.Type()
-		fr.env[instr] = newValue(elem, elemtyp)
-
-	case *ssa.Field:
-		fieldtyp := instr.Type()
-		if p, ok := fr.ptr[instr.X]; ok {
-			field := fr.builder.CreateStructGEP(p, instr.Field, instr.Name())
-			if fr.canAvoidElementLoad(instr) {
-				fr.ptr[instr] = field
-			} else {
-				fr.env[instr] = newValue(fr.builder.CreateLoad(field, ""), fieldtyp)
-			}
-		} else {
-			value := fr.llvmvalue(instr.X)
-			field := fr.builder.CreateExtractValue(value, instr.Field, instr.Name())
-			fr.env[instr] = newValue(field, fieldtyp)
-		}
-
-	case *ssa.FieldAddr:
-		ptr := fr.llvmvalue(instr.X)
-		fr.nilCheck(instr.X, ptr)
-		xtyp := instr.X.Type().Underlying().(*types.Pointer).Elem()
-		ptrtyp := llvm.PointerType(fr.llvmtypes.ToLLVM(xtyp), 0)
-		ptr = fr.builder.CreateBitCast(ptr, ptrtyp, "")
-		fieldptr := fr.builder.CreateStructGEP(ptr, instr.Field, instr.Name())
-		fieldptr = fr.builder.CreateBitCast(fieldptr, llvm.PointerType(llvm.Int8Type(), 0), "")
-		fieldptrtyp := instr.Type()
-		fr.env[instr] = newValue(fieldptr, fieldptrtyp)
-
-	case *ssa.Go:
-		fn, arg := fr.createThunk(instr)
-		fr.runtime.Go.call(fr, fn, arg)
-
-	case *ssa.If:
-		cond := fr.llvmvalue(instr.Cond)
-		block := instr.Block()
-		trueBlock := fr.block(block.Succs[0])
-		falseBlock := fr.block(block.Succs[1])
-		cond = fr.builder.CreateTrunc(cond, llvm.Int1Type(), "")
-		fr.builder.CreateCondBr(cond, trueBlock, falseBlock)
-
-	case *ssa.Index:
-		var arrayptr llvm.Value
-
-		if ptr, ok := fr.ptr[instr.X]; ok {
-			arrayptr = ptr
-		} else {
-			array := fr.llvmvalue(instr.X)
-			arrayptr = fr.allocaBuilder.CreateAlloca(array.Type(), "")
-
-			fr.builder.CreateStore(array, arrayptr)
-		}
-		index := fr.llvmvalue(instr.Index)
-
-		arraytyp := instr.X.Type().Underlying().(*types.Array)
-		arraylen := llvm.ConstInt(fr.llvmtypes.inttype, uint64(arraytyp.Len()), false)
-
-		// The index may not have been promoted to int (for example, if it
-		// came from a composite literal).
-		index = fr.createZExtOrTrunc(index, fr.types.inttype, "")
-
-		// Bounds checking: 0 <= index < len
-		zero := llvm.ConstNull(fr.types.inttype)
-		i0 := fr.builder.CreateICmp(llvm.IntSLT, index, zero, "")
-		li := fr.builder.CreateICmp(llvm.IntSLE, arraylen, index, "")
-
-		cond := fr.builder.CreateOr(i0, li, "")
-
-		fr.condBrRuntimeError(cond, gccgoRuntimeErrorARRAY_INDEX_OUT_OF_BOUNDS)
-
-		addr := fr.builder.CreateGEP(arrayptr, []llvm.Value{zero, index}, "")
-		if fr.canAvoidElementLoad(instr) {
-			fr.ptr[instr] = addr
-		} else {
-			fr.env[instr] = newValue(fr.builder.CreateLoad(addr, ""), instr.Type())
-		}
-
-	case *ssa.IndexAddr:
-		x := fr.llvmvalue(instr.X)
-		index := fr.llvmvalue(instr.Index)
-		var arrayptr, arraylen llvm.Value
-		var elemtyp types.Type
-		var errcode uint64
-		switch typ := instr.X.Type().Underlying().(type) {
-		case *types.Slice:
-			elemtyp = typ.Elem()
-			arrayptr = fr.builder.CreateExtractValue(x, 0, "")
-			arraylen = fr.builder.CreateExtractValue(x, 1, "")
-			errcode = gccgoRuntimeErrorSLICE_INDEX_OUT_OF_BOUNDS
-		case *types.Pointer: // *array
-			arraytyp := typ.Elem().Underlying().(*types.Array)
-			elemtyp = arraytyp.Elem()
-			fr.nilCheck(instr.X, x)
-			arrayptr = x
-			arraylen = llvm.ConstInt(fr.llvmtypes.inttype, uint64(arraytyp.Len()), false)
-			errcode = gccgoRuntimeErrorARRAY_INDEX_OUT_OF_BOUNDS
-		}
-
-		// The index may not have been promoted to int (for example, if it
-		// came from a composite literal).
-		index = fr.createZExtOrTrunc(index, fr.types.inttype, "")
-
-		// Bounds checking: 0 <= index < len
-		zero := llvm.ConstNull(fr.types.inttype)
-		i0 := fr.builder.CreateICmp(llvm.IntSLT, index, zero, "")
-		li := fr.builder.CreateICmp(llvm.IntSLE, arraylen, index, "")
-
-		cond := fr.builder.CreateOr(i0, li, "")
-
-		fr.condBrRuntimeError(cond, errcode)
-
-		ptrtyp := llvm.PointerType(fr.llvmtypes.ToLLVM(elemtyp), 0)
-		arrayptr = fr.builder.CreateBitCast(arrayptr, ptrtyp, "")
-		addr := fr.builder.CreateGEP(arrayptr, []llvm.Value{index}, "")
-		addr = fr.builder.CreateBitCast(addr, llvm.PointerType(llvm.Int8Type(), 0), "")
-		fr.env[instr] = newValue(addr, types.NewPointer(elemtyp))
-
-	case *ssa.Jump:
-		succ := instr.Block().Succs[0]
-		fr.builder.CreateBr(fr.block(succ))
-
-	case *ssa.Lookup:
-		x := fr.value(instr.X)
-		index := fr.value(instr.Index)
-		if isString(x.Type().Underlying()) {
-			fr.env[instr] = fr.stringIndex(x, index)
-		} else {
-			v, ok := fr.mapLookup(x, index)
-			if instr.CommaOk {
-				fr.tuples[instr] = []*govalue{v, ok}
-			} else {
-				fr.env[instr] = v
-			}
-		}
-
-	case *ssa.MakeChan:
-		fr.env[instr] = fr.makeChan(instr.Type(), fr.value(instr.Size))
-
-	case *ssa.MakeClosure:
-		llfn := fr.resolveFunctionGlobal(instr.Fn.(*ssa.Function))
-		llfn = llvm.ConstBitCast(llfn, llvm.PointerType(llvm.Int8Type(), 0))
-		fn := newValue(llfn, instr.Fn.(*ssa.Function).Signature)
-		bindings := make([]*govalue, len(instr.Bindings))
-		for i, binding := range instr.Bindings {
-			bindings[i] = fr.value(binding)
-		}
-		fr.env[instr] = fr.makeClosure(fn, bindings)
-
-	case *ssa.MakeInterface:
-		// fr.ptr[instr.X] will be set if a pointer load was elided by canAvoidLoad
-		if ptr, ok := fr.ptr[instr.X]; ok {
-			fr.env[instr] = fr.makeInterfaceFromPointer(ptr, instr.X.Type(), instr.Type())
-		} else {
-			receiver := fr.llvmvalue(instr.X)
-			fr.env[instr] = fr.makeInterface(receiver, instr.X.Type(), instr.Type())
-		}
-
-	case *ssa.MakeMap:
-		fr.env[instr] = fr.makeMap(instr.Type(), fr.value(instr.Reserve))
-
-	case *ssa.MakeSlice:
-		length := fr.value(instr.Len)
-		capacity := fr.value(instr.Cap)
-		fr.env[instr] = fr.makeSlice(instr.Type(), length, capacity)
-
-	case *ssa.MapUpdate:
-		m := fr.value(instr.Map)
-		k := fr.value(instr.Key)
-		v := fr.value(instr.Value)
-		fr.mapUpdate(m, k, v)
-
-	case *ssa.Next:
-		iter := fr.tuples[instr.Iter]
-		if instr.IsString {
-			fr.tuples[instr] = fr.stringIterNext(iter)
-		} else {
-			fr.tuples[instr] = fr.mapIterNext(iter)
-		}
-
-	case *ssa.Panic:
-		arg := fr.value(instr.X)
-		fr.callPanic(arg, true)
-
-	case *ssa.Phi:
-		typ := instr.Type()
-		phi := fr.builder.CreatePHI(fr.llvmtypes.ToLLVM(typ), instr.Comment)
-		fr.env[instr] = newValue(phi, typ)
-		fr.phis = append(fr.phis, pendingPhi{instr, phi})
-
-	case *ssa.Range:
-		x := fr.value(instr.X)
-		switch x.Type().Underlying().(type) {
-		case *types.Map:
-			fr.tuples[instr] = fr.mapIterInit(x)
-		case *types.Basic: // string
-			fr.tuples[instr] = fr.stringIterInit(x)
-		default:
-			panic(fmt.Sprintf("unhandled range for type %T", x.Type()))
-		}
-
-	case *ssa.Return:
-		vals := make([]llvm.Value, len(instr.Results))
-		for i, res := range instr.Results {
-			vals[i] = fr.llvmvalue(res)
-		}
-		fr.retInf.encode(llvm.GlobalContext(), fr.allocaBuilder, fr.builder, vals)
-
-	case *ssa.RunDefers:
-		fr.runDefers()
-
-	case *ssa.Select:
-		index, recvOk, recvElems := fr.chanSelect(instr)
-		tuple := append([]*govalue{index, recvOk}, recvElems...)
-		fr.tuples[instr] = tuple
-
-	case *ssa.Send:
-		fr.chanSend(fr.value(instr.Chan), fr.value(instr.X))
-
-	case *ssa.Slice:
-		x := fr.llvmvalue(instr.X)
-		low := fr.llvmvalue(instr.Low)
-		high := fr.llvmvalue(instr.High)
-		max := fr.llvmvalue(instr.Max)
-		slice := fr.slice(x, instr.X.Type(), low, high, max)
-		fr.env[instr] = newValue(slice, instr.Type())
-
-	case *ssa.Store:
-		addr := fr.llvmvalue(instr.Addr)
-		value := fr.llvmvalue(instr.Val)
-		addr = fr.builder.CreateBitCast(addr, llvm.PointerType(value.Type(), 0), "")
-		// If this is the init function, see if we can simulate the effect
-		// of the store in a global's initializer, in which case we can avoid
-		// generating code for it.
-		if !fr.isInit || !fr.maybeStoreInInitializer(value, addr) {
-			fr.nilCheck(instr.Addr, addr)
-			fr.builder.CreateStore(value, addr)
-		}
-
-	case *switchInstr:
-		fr.emitSwitch(instr)
-
-	case *ssa.TypeAssert:
-		x := fr.value(instr.X)
-		if instr.CommaOk {
-			v, ok := fr.interfaceTypeCheck(x, instr.AssertedType)
-			fr.tuples[instr] = []*govalue{v, ok}
-		} else {
-			fr.env[instr] = fr.interfaceTypeAssert(x, instr.AssertedType)
-		}
-
-	case *ssa.UnOp:
-		operand := fr.value(instr.X)
-		switch instr.Op {
-		case token.ARROW:
-			x, ok := fr.chanRecv(operand, instr.CommaOk)
-			if instr.CommaOk {
-				fr.tuples[instr] = []*govalue{x, ok}
-			} else {
-				fr.env[instr] = x
-			}
-		case token.MUL:
-			fr.nilCheck(instr.X, operand.value)
-			if !fr.canAvoidLoad(instr, operand.value) {
-				// The bitcast is necessary to handle recursive pointer loads.
-				llptr := fr.builder.CreateBitCast(operand.value, llvm.PointerType(fr.llvmtypes.ToLLVM(instr.Type()), 0), "")
-				fr.env[instr] = newValue(fr.builder.CreateLoad(llptr, ""), instr.Type())
-			}
-		default:
-			fr.env[instr] = fr.unaryOp(operand, instr.Op)
-		}
-
-	default:
-		panic(fmt.Sprintf("unhandled: %v", instr))
-	}
-}
-
-func (fr *frame) callBuiltin(typ types.Type, builtin *ssa.Builtin, args []ssa.Value) []*govalue {
-	switch builtin.Name() {
-	case "print", "println":
-		llargs := make([]*govalue, len(args))
-		for i, arg := range args {
-			llargs[i] = fr.value(arg)
-		}
-		fr.printValues(builtin.Name() == "println", llargs...)
-		return nil
-
-	case "panic":
-		fr.callPanic(fr.value(args[0]), false)
-		return nil
-
-	case "recover":
-		return []*govalue{fr.callRecover(false)}
-
-	case "append":
-		return []*govalue{fr.callAppend(fr.value(args[0]), fr.value(args[1]))}
-
-	case "close":
-		fr.chanClose(fr.value(args[0]))
-		return nil
-
-	case "cap":
-		return []*govalue{fr.callCap(fr.value(args[0]))}
-
-	case "len":
-		return []*govalue{fr.callLen(fr.value(args[0]))}
-
-	case "copy":
-		return []*govalue{fr.callCopy(fr.value(args[0]), fr.value(args[1]))}
-
-	case "delete":
-		fr.mapDelete(fr.value(args[0]), fr.value(args[1]))
-		return nil
-
-	case "real":
-		return []*govalue{fr.extractRealValue(fr.value(args[0]))}
-
-	case "imag":
-		return []*govalue{fr.extractImagValue(fr.value(args[0]))}
-
-	case "complex":
-		r := fr.llvmvalue(args[0])
-		i := fr.llvmvalue(args[1])
-		cmplx := llvm.Undef(fr.llvmtypes.ToLLVM(typ))
-		cmplx = fr.builder.CreateInsertValue(cmplx, r, 0, "")
-		cmplx = fr.builder.CreateInsertValue(cmplx, i, 1, "")
-		return []*govalue{newValue(cmplx, typ)}
-
-	case "ssa:wrapnilchk":
-		ptr := fr.value(args[0])
-		fr.nilCheck(args[0], ptr.value)
-		return []*govalue{ptr}
-
-	default:
-		panic("unimplemented: " + builtin.Name())
-	}
-}
-
-// callInstruction translates function call instructions.
-func (fr *frame) callInstruction(instr ssa.CallInstruction) []*govalue {
-	call := instr.Common()
-	if builtin, ok := call.Value.(*ssa.Builtin); ok {
-		var typ types.Type
-		if v := instr.Value(); v != nil {
-			typ = v.Type()
-		}
-		return fr.callBuiltin(typ, builtin, call.Args)
-	}
-
-	args := make([]*govalue, len(call.Args))
-	for i, arg := range call.Args {
-		args[i] = fr.value(arg)
-	}
-
-	var fn *govalue
-	var chain llvm.Value
-	if call.IsInvoke() {
-		var recv *govalue
-		fn, recv = fr.interfaceMethod(fr.llvmvalue(call.Value), call.Value.Type(), call.Method)
-		args = append([]*govalue{recv}, args...)
-	} else {
-		if ssafn, ok := call.Value.(*ssa.Function); ok {
-			llfn := fr.resolveFunctionGlobal(ssafn)
-			llfn = llvm.ConstBitCast(llfn, llvm.PointerType(llvm.Int8Type(), 0))
-			fn = newValue(llfn, ssafn.Type())
-		} else {
-			// First-class function values are stored as *{*fnptr}, so
-			// we must extract the function pointer. We must also
-			// set the chain, in case the function is a closure.
-			fn = fr.value(call.Value)
-			chain = fn.value
-			fnptr := fr.builder.CreateBitCast(fn.value, llvm.PointerType(fn.value.Type(), 0), "")
-			fnptr = fr.builder.CreateLoad(fnptr, "")
-			fn = newValue(fnptr, fn.Type())
-		}
-		if recv := call.Signature().Recv(); recv != nil {
-			if _, ok := recv.Type().Underlying().(*types.Pointer); !ok {
-				recvalloca := fr.allocaBuilder.CreateAlloca(args[0].value.Type(), "")
-				fr.builder.CreateStore(args[0].value, recvalloca)
-				args[0] = newValue(recvalloca, types.NewPointer(args[0].Type()))
-			}
-		}
-	}
-	return fr.createCall(fn, chain, args)
-}
-
-func hasDefer(f *ssa.Function) bool {
-	for _, b := range f.Blocks {
-		for _, instr := range b.Instrs {
-			if _, ok := instr.(*ssa.Defer); ok {
-				return true
-			}
-		}
-	}
-	return false
-}
-
-func callsRecover(f *ssa.Function) bool {
-	for _, b := range f.Blocks {
-		for _, instr := range b.Instrs {
-			if instr, ok := instr.(ssa.CallInstruction); ok {
-				b, ok := instr.Common().Value.(*ssa.Builtin)
-				if ok && b.Name() == "recover" {
-					return true
-				}
-			}
-		}
-	}
-	return false
-}
diff --git a/irgen/strings.go b/irgen/strings.go
deleted file mode 100644
index 6d8e299..0000000
--- a/irgen/strings.go
+++ /dev/null
@@ -1,113 +0,0 @@
-//===- strings.go - IR generation for string ops --------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements IR generation for string operations.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-func (fr *frame) concatenateStrings(lhs, rhs *govalue) *govalue {
-	result := fr.runtime.stringPlus.call(fr, lhs.value, rhs.value)
-	return newValue(result[0], types.Typ[types.String])
-}
-
-func (fr *frame) compareStringEmpty(v llvm.Value) *govalue {
-	len := fr.builder.CreateExtractValue(v, 1, "")
-	result := fr.builder.CreateIsNull(len, "")
-	result = fr.builder.CreateZExt(result, llvm.Int8Type(), "")
-	return newValue(result, types.Typ[types.Bool])
-}
-
-func (fr *frame) compareStrings(lhs, rhs *govalue, op token.Token) *govalue {
-	if op == token.EQL {
-		if lhs.value.IsNull() {
-			return fr.compareStringEmpty(rhs.value)
-		}
-		if rhs.value.IsNull() {
-			return fr.compareStringEmpty(lhs.value)
-		}
-	}
-
-	result := fr.runtime.strcmp.call(fr, lhs.value, rhs.value)[0]
-	zero := llvm.ConstNull(fr.types.inttype)
-	var pred llvm.IntPredicate
-	switch op {
-	case token.EQL:
-		pred = llvm.IntEQ
-	case token.LSS:
-		pred = llvm.IntSLT
-	case token.GTR:
-		pred = llvm.IntSGT
-	case token.LEQ:
-		pred = llvm.IntSLE
-	case token.GEQ:
-		pred = llvm.IntSGE
-	case token.NEQ:
-		panic("NEQ is handled in govalue.BinaryOp")
-	default:
-		panic("unreachable")
-	}
-	result = fr.builder.CreateICmp(pred, result, zero, "")
-	result = fr.builder.CreateZExt(result, llvm.Int8Type(), "")
-	return newValue(result, types.Typ[types.Bool])
-}
-
-// stringIndex implements v = m[i]
-func (fr *frame) stringIndex(s, i *govalue) *govalue {
-	ptr := fr.builder.CreateExtractValue(s.value, 0, "")
-	ptr = fr.builder.CreateGEP(ptr, []llvm.Value{i.value}, "")
-	return newValue(fr.builder.CreateLoad(ptr, ""), types.Typ[types.Byte])
-}
-
-func (fr *frame) stringIterInit(str *govalue) []*govalue {
-	indexptr := fr.allocaBuilder.CreateAlloca(fr.types.inttype, "")
-	fr.builder.CreateStore(llvm.ConstNull(fr.types.inttype), indexptr)
-	return []*govalue{str, newValue(indexptr, types.Typ[types.Int])}
-}
-
-// stringIterNext advances the iterator, and returns the tuple (ok, k, v).
-func (fr *frame) stringIterNext(iter []*govalue) []*govalue {
-	str, indexptr := iter[0], iter[1]
-	k := fr.builder.CreateLoad(indexptr.value, "")
-
-	result := fr.runtime.stringiter2.call(fr, str.value, k)
-	fr.builder.CreateStore(result[0], indexptr.value)
-	ok := fr.builder.CreateIsNotNull(result[0], "")
-	ok = fr.builder.CreateZExt(ok, llvm.Int8Type(), "")
-	v := result[1]
-
-	return []*govalue{newValue(ok, types.Typ[types.Bool]), newValue(k, types.Typ[types.Int]), newValue(v, types.Typ[types.Rune])}
-}
-
-func (fr *frame) runeToString(v *govalue) *govalue {
-	v = fr.convert(v, types.Typ[types.Int])
-	result := fr.runtime.intToString.call(fr, v.value)
-	return newValue(result[0], types.Typ[types.String])
-}
-
-func (fr *frame) stringToRuneSlice(v *govalue) *govalue {
-	result := fr.runtime.stringToIntArray.call(fr, v.value)
-	runeslice := types.NewSlice(types.Typ[types.Rune])
-	return newValue(result[0], runeslice)
-}
-
-func (fr *frame) runeSliceToString(v *govalue) *govalue {
-	llv := v.value
-	ptr := fr.builder.CreateExtractValue(llv, 0, "")
-	len := fr.builder.CreateExtractValue(llv, 1, "")
-	result := fr.runtime.intArrayToString.call(fr, ptr, len)
-	return newValue(result[0], types.Typ[types.String])
-}
diff --git a/irgen/switches.go b/irgen/switches.go
deleted file mode 100644
index a2b46b7..0000000
--- a/irgen/switches.go
+++ /dev/null
@@ -1,144 +0,0 @@
-//===- switches.go - misc utils -------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements transformations and IR generation for switches.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/ssa/ssautil"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-// switchInstr is an instruction representing a switch on constant
-// integer values.
-type switchInstr struct {
-	ssa.Instruction
-	ssautil.Switch
-}
-
-func (sw *switchInstr) String() string {
-	return sw.Switch.String()
-}
-
-func (sw *switchInstr) Parent() *ssa.Function {
-	return sw.Default.Instrs[0].Parent()
-}
-
-func (sw *switchInstr) Block() *ssa.BasicBlock {
-	return sw.Start
-}
-
-func (sw *switchInstr) Operands(rands []*ssa.Value) []*ssa.Value {
-	return nil
-}
-
-func (sw *switchInstr) Pos() token.Pos {
-	return token.NoPos
-}
-
-// emitSwitch emits an LLVM switch instruction.
-func (fr *frame) emitSwitch(instr *switchInstr) {
-	cases, _ := dedupConstCases(fr, instr.ConstCases)
-	ncases := len(cases)
-	elseblock := fr.block(instr.Default)
-	llswitch := fr.builder.CreateSwitch(fr.llvmvalue(instr.X), elseblock, ncases)
-	for _, c := range cases {
-		llswitch.AddCase(fr.llvmvalue(c.Value), fr.block(c.Body))
-	}
-}
-
-// transformSwitches replaces the final If statement in start blocks
-// with a high-level switch instruction, and erases chained condition
-// blocks.
-func (fr *frame) transformSwitches(f *ssa.Function) {
-	for _, sw := range ssautil.Switches(f) {
-		if sw.ConstCases == nil {
-			// TODO(axw) investigate switch
-			// on hashes in type switches.
-			continue
-		}
-		if !isInteger(sw.X.Type()) && !isBoolean(sw.X.Type()) {
-			// LLVM switches can only operate on integers.
-			continue
-		}
-		instr := &switchInstr{Switch: sw}
-		sw.Start.Instrs[len(sw.Start.Instrs)-1] = instr
-		for _, c := range sw.ConstCases[1:] {
-			fr.blocks[c.Block.Index].EraseFromParent()
-			fr.blocks[c.Block.Index] = llvm.BasicBlock{}
-		}
-
-		// Fix predecessors in successor blocks for fixupPhis.
-		cases, duplicates := dedupConstCases(fr, instr.ConstCases)
-		for _, c := range cases {
-			for _, succ := range c.Block.Succs {
-				for i, pred := range succ.Preds {
-					if pred == c.Block {
-						succ.Preds[i] = sw.Start
-						break
-					}
-				}
-			}
-		}
-
-		// Remove redundant edges corresponding to duplicate cases
-		// that will not feature in the LLVM switch instruction.
-		for _, c := range duplicates {
-			for _, succ := range c.Block.Succs {
-				for i, pred := range succ.Preds {
-					if pred == c.Block {
-						head := succ.Preds[:i]
-						tail := succ.Preds[i+1:]
-						succ.Preds = append(head, tail...)
-						removePhiEdge(succ, i)
-						break
-					}
-				}
-			}
-		}
-	}
-}
-
-// dedupConstCases separates duplicate const cases.
-//
-// TODO(axw) fix this in go/ssa/ssautil.
-func dedupConstCases(fr *frame, in []ssautil.ConstCase) (unique, duplicates []ssautil.ConstCase) {
-	unique = make([]ssautil.ConstCase, 0, len(in))
-dedup:
-	for i, c1 := range in {
-		for _, c2 := range in[i+1:] {
-			if exact.Compare(c1.Value.Value, token.EQL, c2.Value.Value) {
-				duplicates = append(duplicates, c1)
-				continue dedup
-			}
-		}
-		unique = append(unique, c1)
-	}
-	return unique, duplicates
-}
-
-// removePhiEdge removes the i'th edge from each PHI
-// instruction in the specified basic block.
-func removePhiEdge(bb *ssa.BasicBlock, i int) {
-	for _, instr := range bb.Instrs {
-		instr, ok := instr.(*ssa.Phi)
-		if !ok {
-			return
-		}
-		head := instr.Edges[:i]
-		tail := instr.Edges[i+1:]
-		instr.Edges = append(head, tail...)
-	}
-}
diff --git a/irgen/targets.go b/irgen/targets.go
deleted file mode 100644
index 4460cef..0000000
--- a/irgen/targets.go
+++ /dev/null
@@ -1,88 +0,0 @@
-//===- targets.go - target data -------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file contains functions for retrieving target-specific data.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"fmt"
-	"strings"
-
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-// llvmDataLayout returns the data layout string
-// representation for the specified LLVM triple.
-func llvmDataLayout(triple string) (string, error) {
-	// Triples are several fields separated by '-' characters.
-	// The first field is the architecture. The architecture's
-	// canonical form may include a '-' character, which would
-	// have been translated to '_' for inclusion in a triple.
-	arch := parseArch(triple[:strings.IndexRune(triple, '-')])
-	for target := llvm.FirstTarget(); target.C != nil; target = target.NextTarget() {
-		if arch == target.Name() {
-			machine := target.CreateTargetMachine(
-				triple, "", "",
-				llvm.CodeGenLevelDefault,
-				llvm.RelocDefault,
-				llvm.CodeModelDefault,
-			)
-			targetData := machine.CreateTargetData()
-			targetDataLayout := targetData.String()
-			targetData.Dispose()
-			machine.Dispose()
-			return targetDataLayout, nil
-		}
-	}
-	return "", fmt.Errorf("Invalid target triple: %s", triple)
-}
-
-// Based on parseArch from LLVM's lib/Support/Triple.cpp.
-// This is used to match the target machine type.
-func parseArch(arch string) string {
-	switch arch {
-	case "i386", "i486", "i586", "i686", "i786", "i886", "i986":
-		return "x86"
-	case "amd64", "x86_64":
-		return "x86-64"
-	case "powerpc":
-		return "ppc"
-	case "powerpc64", "ppu":
-		return "ppc64"
-	case "mblaze":
-		return "mblaze"
-	case "arm", "xscale":
-		return "arm"
-	case "thumb":
-		return "thumb"
-	case "spu", "cellspu":
-		return "cellspu"
-	case "msp430":
-		return "msp430"
-	case "mips", "mipseb", "mipsallegrex":
-		return "mips"
-	case "mipsel", "mipsallegrexel":
-		return "mipsel"
-	case "mips64", "mips64eb":
-		return "mips64"
-	case "mipsel64":
-		return "mipsel64"
-	case "r600", "hexagon", "sparc", "sparcv9", "tce",
-		"xcore", "nvptx", "nvptx64", "le32", "amdil":
-		return arch
-	}
-	if strings.HasPrefix(arch, "armv") {
-		return "arm"
-	} else if strings.HasPrefix(arch, "thumbv") {
-		return "thumb"
-	}
-	return "unknown"
-}
diff --git a/irgen/typemap.go b/irgen/typemap.go
deleted file mode 100644
index c2a5c7a..0000000
--- a/irgen/typemap.go
+++ /dev/null
@@ -1,2052 +0,0 @@
-//===- typemap.go - type and type descriptor mapping ----------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements the mapping from go/types types to LLVM types and to
-// type descriptors.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"bytes"
-	"fmt"
-	"sort"
-	"strconv"
-	"strings"
-
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/ssa/ssautil"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-type MethodResolver interface {
-	ResolveMethod(*types.Selection) *govalue
-}
-
-// llvmTypeMap is provides a means of mapping from a types.Map
-// to llgo's corresponding LLVM type representation.
-type llvmTypeMap struct {
-	sizes      *types.StdSizes
-	ctx        llvm.Context
-	target     llvm.TargetData
-	inttype    llvm.Type
-	stringType llvm.Type
-
-	types typeutil.Map
-}
-
-type typeDescInfo struct {
-	global        llvm.Value
-	commonTypePtr llvm.Value
-	mapDescPtr    llvm.Value
-	gc, gcPtr     llvm.Value
-
-	interfaceMethodTables typeutil.Map
-}
-
-type TypeMap struct {
-	*llvmTypeMap
-	mc manglerContext
-
-	module         llvm.Module
-	pkgpath        string
-	types, algs    typeutil.Map
-	runtime        *runtimeInterface
-	methodResolver MethodResolver
-	types.MethodSetCache
-
-	commonTypeType, uncommonTypeType, ptrTypeType, funcTypeType, arrayTypeType, sliceTypeType, mapTypeType, chanTypeType, interfaceTypeType, structTypeType llvm.Type
-	mapDescType                                                                                                                                             llvm.Type
-
-	methodType, imethodType, structFieldType llvm.Type
-
-	typeSliceType, methodSliceType, imethodSliceType, structFieldSliceType llvm.Type
-
-	funcValType             llvm.Type
-	hashFnType, equalFnType llvm.Type
-
-	algsEmptyInterface,
-	algsInterface,
-	algsFloat,
-	algsComplex,
-	algsString,
-	algsIdentity,
-	algsError algorithms
-}
-
-type algorithms struct {
-	hash, hashDescriptor, equal, equalDescriptor llvm.Value
-}
-
-func NewLLVMTypeMap(ctx llvm.Context, target llvm.TargetData) *llvmTypeMap {
-	// spec says int is either 32-bit or 64-bit.
-	// ABI currently requires sizeof(int) == sizeof(uint) == sizeof(uintptr).
-	inttype := ctx.IntType(8 * target.PointerSize())
-
-	i8ptr := llvm.PointerType(llvm.Int8Type(), 0)
-	elements := []llvm.Type{i8ptr, inttype}
-	stringType := llvm.StructType(elements, false)
-
-	return &llvmTypeMap{
-		ctx: ctx,
-		sizes: &types.StdSizes{
-			WordSize: int64(target.PointerSize()),
-			MaxAlign: 8,
-		},
-		target:     target,
-		inttype:    inttype,
-		stringType: stringType,
-	}
-}
-
-func NewTypeMap(pkg *ssa.Package, llvmtm *llvmTypeMap, module llvm.Module, r *runtimeInterface, mr MethodResolver) *TypeMap {
-	tm := &TypeMap{
-		llvmTypeMap:    llvmtm,
-		module:         module,
-		pkgpath:        pkg.Object.Path(),
-		runtime:        r,
-		methodResolver: mr,
-	}
-
-	tm.mc.init(pkg.Prog, &tm.MethodSetCache)
-
-	uintptrType := tm.inttype
-	voidPtrType := llvm.PointerType(tm.ctx.Int8Type(), 0)
-	boolType := llvm.Int8Type()
-	stringPtrType := llvm.PointerType(tm.stringType, 0)
-
-	tm.funcValType = tm.ctx.StructCreateNamed("funcVal")
-	tm.funcValType.StructSetBody([]llvm.Type{
-		llvm.PointerType(llvm.FunctionType(llvm.VoidType(), []llvm.Type{}, false), 0),
-	}, false)
-
-	params := []llvm.Type{voidPtrType, uintptrType}
-	tm.hashFnType = llvm.FunctionType(uintptrType, params, false)
-	params = []llvm.Type{voidPtrType, voidPtrType, uintptrType}
-	tm.equalFnType = llvm.FunctionType(boolType, params, false)
-
-	typeAlgorithms := [...]struct {
-		Name string
-		*algorithms
-	}{
-		{"empty_interface", &tm.algsEmptyInterface},
-		{"interface", &tm.algsInterface},
-		{"float", &tm.algsFloat},
-		{"complex", &tm.algsComplex},
-		{"string", &tm.algsString},
-		{"identity", &tm.algsIdentity},
-		{"error", &tm.algsError},
-	}
-	for _, typeAlgs := range typeAlgorithms {
-		hashFnName := "__go_type_hash_" + typeAlgs.Name
-		hashDescriptorName := hashFnName + "_descriptor"
-		equalFnName := "__go_type_equal_" + typeAlgs.Name
-		equalDescriptorName := equalFnName + "_descriptor"
-		typeAlgs.hash = llvm.AddFunction(tm.module, hashFnName, tm.hashFnType)
-		typeAlgs.hashDescriptor = llvm.AddGlobal(tm.module, tm.funcValType, hashDescriptorName)
-		typeAlgs.equal = llvm.AddFunction(tm.module, equalFnName, tm.equalFnType)
-		typeAlgs.equalDescriptor = llvm.AddGlobal(tm.module, tm.funcValType, equalDescriptorName)
-	}
-
-	tm.commonTypeType = tm.ctx.StructCreateNamed("commonType")
-	commonTypeTypePtr := llvm.PointerType(tm.commonTypeType, 0)
-
-	tm.methodType = tm.ctx.StructCreateNamed("method")
-	tm.methodType.StructSetBody([]llvm.Type{
-		stringPtrType,     // name
-		stringPtrType,     // pkgPath
-		commonTypeTypePtr, // mtype (without receiver)
-		commonTypeTypePtr, // type (with receiver)
-		voidPtrType,       // function
-	}, false)
-
-	tm.methodSliceType = tm.makeNamedSliceType("methodSlice", tm.methodType)
-
-	tm.uncommonTypeType = tm.ctx.StructCreateNamed("uncommonType")
-	tm.uncommonTypeType.StructSetBody([]llvm.Type{
-		stringPtrType,      // name
-		stringPtrType,      // pkgPath
-		tm.methodSliceType, // methods
-	}, false)
-
-	tm.commonTypeType.StructSetBody([]llvm.Type{
-		tm.ctx.Int8Type(),                        // Kind
-		tm.ctx.Int8Type(),                        // align
-		tm.ctx.Int8Type(),                        // fieldAlign
-		uintptrType,                              // size
-		tm.ctx.Int32Type(),                       // hash
-		llvm.PointerType(tm.funcValType, 0),      // hashfn
-		llvm.PointerType(tm.funcValType, 0),      // equalfn
-		voidPtrType,                              // gc
-		stringPtrType,                            // string
-		llvm.PointerType(tm.uncommonTypeType, 0), // uncommonType
-		commonTypeTypePtr,                        // ptrToThis
-	}, false)
-
-	tm.typeSliceType = tm.makeNamedSliceType("typeSlice", commonTypeTypePtr)
-
-	tm.ptrTypeType = tm.ctx.StructCreateNamed("ptrType")
-	tm.ptrTypeType.StructSetBody([]llvm.Type{
-		tm.commonTypeType,
-		commonTypeTypePtr,
-	}, false)
-
-	tm.funcTypeType = tm.ctx.StructCreateNamed("funcType")
-	tm.funcTypeType.StructSetBody([]llvm.Type{
-		tm.commonTypeType,
-		tm.ctx.Int8Type(), // dotdotdot
-		tm.typeSliceType,  // in
-		tm.typeSliceType,  // out
-	}, false)
-
-	tm.arrayTypeType = tm.ctx.StructCreateNamed("arrayType")
-	tm.arrayTypeType.StructSetBody([]llvm.Type{
-		tm.commonTypeType,
-		commonTypeTypePtr, // elem
-		commonTypeTypePtr, // slice
-		tm.inttype,        // len
-	}, false)
-
-	tm.sliceTypeType = tm.ctx.StructCreateNamed("sliceType")
-	tm.sliceTypeType.StructSetBody([]llvm.Type{
-		tm.commonTypeType,
-		commonTypeTypePtr, // elem
-	}, false)
-
-	tm.mapTypeType = tm.ctx.StructCreateNamed("mapType")
-	tm.mapTypeType.StructSetBody([]llvm.Type{
-		tm.commonTypeType,
-		commonTypeTypePtr, // key
-		commonTypeTypePtr, // elem
-	}, false)
-
-	tm.chanTypeType = tm.ctx.StructCreateNamed("chanType")
-	tm.chanTypeType.StructSetBody([]llvm.Type{
-		tm.commonTypeType,
-		commonTypeTypePtr, // elem
-		tm.inttype,        // dir
-	}, false)
-
-	tm.imethodType = tm.ctx.StructCreateNamed("imethod")
-	tm.imethodType.StructSetBody([]llvm.Type{
-		stringPtrType,     // name
-		stringPtrType,     // pkgPath
-		commonTypeTypePtr, // typ
-	}, false)
-
-	tm.imethodSliceType = tm.makeNamedSliceType("imethodSlice", tm.imethodType)
-
-	tm.interfaceTypeType = tm.ctx.StructCreateNamed("interfaceType")
-	tm.interfaceTypeType.StructSetBody([]llvm.Type{
-		tm.commonTypeType,
-		tm.imethodSliceType,
-	}, false)
-
-	tm.structFieldType = tm.ctx.StructCreateNamed("structField")
-	tm.structFieldType.StructSetBody([]llvm.Type{
-		stringPtrType,     // name
-		stringPtrType,     // pkgPath
-		commonTypeTypePtr, // typ
-		stringPtrType,     // tag
-		tm.inttype,        // offset
-	}, false)
-
-	tm.structFieldSliceType = tm.makeNamedSliceType("structFieldSlice", tm.structFieldType)
-
-	tm.structTypeType = tm.ctx.StructCreateNamed("structType")
-	tm.structTypeType.StructSetBody([]llvm.Type{
-		tm.commonTypeType,
-		tm.structFieldSliceType, // fields
-	}, false)
-
-	tm.mapDescType = tm.ctx.StructCreateNamed("mapDesc")
-	tm.mapDescType.StructSetBody([]llvm.Type{
-		commonTypeTypePtr, // map_descriptor
-		tm.inttype,        // entry_size
-		tm.inttype,        // key_offset
-		tm.inttype,        // value_offset
-	}, false)
-
-	return tm
-}
-
-func (tm *llvmTypeMap) ToLLVM(t types.Type) llvm.Type {
-	return tm.toLLVM(t, "")
-}
-
-func (tm *llvmTypeMap) toLLVM(t types.Type, name string) llvm.Type {
-	lt, ok := tm.types.At(t).(llvm.Type)
-	if !ok {
-		lt = tm.makeLLVMType(t, name)
-		if lt.IsNil() {
-			panic(fmt.Sprint("Failed to create LLVM type for: ", t))
-		}
-		tm.types.Set(t, lt)
-	}
-	return lt
-}
-
-func (tm *llvmTypeMap) makeLLVMType(t types.Type, name string) llvm.Type {
-	return tm.getBackendType(t).ToLLVM(tm.ctx)
-}
-
-func (tm *llvmTypeMap) Offsetsof(fields []*types.Var) []int64 {
-	offsets := make([]int64, len(fields))
-	var o int64
-	for i, f := range fields {
-		a := tm.Alignof(f.Type())
-		o = align(o, a)
-		offsets[i] = o
-		o += tm.Sizeof(f.Type())
-	}
-	return offsets
-}
-
-var basicSizes = [...]byte{
-	types.Bool:       1,
-	types.Int8:       1,
-	types.Int16:      2,
-	types.Int32:      4,
-	types.Int64:      8,
-	types.Uint8:      1,
-	types.Uint16:     2,
-	types.Uint32:     4,
-	types.Uint64:     8,
-	types.Float32:    4,
-	types.Float64:    8,
-	types.Complex64:  8,
-	types.Complex128: 16,
-}
-
-func (tm *llvmTypeMap) Sizeof(T types.Type) int64 {
-	switch t := T.Underlying().(type) {
-	case *types.Basic:
-		k := t.Kind()
-		if int(k) < len(basicSizes) {
-			if s := basicSizes[k]; s > 0 {
-				return int64(s)
-			}
-		}
-		if k == types.String {
-			return tm.sizes.WordSize * 2
-		}
-	case *types.Array:
-		a := tm.Alignof(t.Elem())
-		z := tm.Sizeof(t.Elem())
-		return align(z, a) * t.Len() // may be 0
-	case *types.Slice:
-		return tm.sizes.WordSize * 3
-	case *types.Struct:
-		n := t.NumFields()
-		if n == 0 {
-			return 0
-		}
-		fields := make([]*types.Var, t.NumFields())
-		for i := 0; i != t.NumFields(); i++ {
-			fields[i] = t.Field(i)
-		}
-		offsets := tm.Offsetsof(fields)
-		return align(offsets[n-1]+tm.Sizeof(t.Field(n-1).Type()), tm.Alignof(t))
-	case *types.Interface:
-		return tm.sizes.WordSize * 2
-	}
-	return tm.sizes.WordSize // catch-all
-}
-
-func (tm *llvmTypeMap) Alignof(t types.Type) int64 {
-	return tm.sizes.Alignof(t)
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-func (tm *TypeMap) ToRuntime(t types.Type) llvm.Value {
-	return llvm.ConstBitCast(tm.getTypeDescriptorPointer(t), llvm.PointerType(llvm.Int8Type(), 0))
-}
-
-type localNamedTypeInfo struct {
-	functionName string
-	scopeNum     int
-}
-
-type namedTypeInfo struct {
-	pkgname, pkgpath string
-	name             string
-	localNamedTypeInfo
-}
-
-type manglerContext struct {
-	ti  map[*types.Named]localNamedTypeInfo
-	msc *types.MethodSetCache
-}
-
-// Assembles the method set into the order that gccgo uses (unexported methods first).
-// TODO(pcc): cache this.
-func orderedMethodSet(ms *types.MethodSet) []*types.Selection {
-	oms := make([]*types.Selection, ms.Len())
-	omsi := 0
-	for i := 0; i != ms.Len(); i++ {
-		if sel := ms.At(i); !sel.Obj().Exported() {
-			oms[omsi] = sel
-			omsi++
-		}
-	}
-	for i := 0; i != ms.Len(); i++ {
-		if sel := ms.At(i); sel.Obj().Exported() {
-			oms[omsi] = sel
-			omsi++
-		}
-	}
-	return oms
-}
-
-func (ctx *manglerContext) init(prog *ssa.Program, msc *types.MethodSetCache) {
-	ctx.msc = msc
-	ctx.ti = make(map[*types.Named]localNamedTypeInfo)
-	for f, _ := range ssautil.AllFunctions(prog) {
-		scopeNum := 0
-		var addNamedTypesToMap func(*types.Scope)
-		addNamedTypesToMap = func(scope *types.Scope) {
-			hasNamedTypes := false
-			for _, n := range scope.Names() {
-				if tn, ok := scope.Lookup(n).(*types.TypeName); ok {
-					hasNamedTypes = true
-					ctx.ti[tn.Type().(*types.Named)] = localNamedTypeInfo{f.Name(), scopeNum}
-				}
-			}
-			if hasNamedTypes {
-				scopeNum++
-			}
-			for i := 0; i != scope.NumChildren(); i++ {
-				addNamedTypesToMap(scope.Child(i))
-			}
-		}
-		if fobj, ok := f.Object().(*types.Func); ok && fobj.Scope() != nil {
-			addNamedTypesToMap(fobj.Scope())
-		}
-	}
-}
-
-func (ctx *manglerContext) getNamedTypeInfo(t types.Type) (nti namedTypeInfo) {
-	switch t := t.(type) {
-	case *types.Basic:
-		switch t.Kind() {
-		case types.Byte:
-			nti.name = "uint8"
-		case types.Rune:
-			nti.name = "int32"
-		case types.UnsafePointer:
-			nti.pkgname = "unsafe"
-			nti.pkgpath = "unsafe"
-			nti.name = "Pointer"
-		default:
-			nti.name = t.Name()
-		}
-
-	case *types.Named:
-		obj := t.Obj()
-		if pkg := obj.Pkg(); pkg != nil {
-			nti.pkgname = obj.Pkg().Name()
-			nti.pkgpath = obj.Pkg().Path()
-		}
-		nti.name = obj.Name()
-		nti.localNamedTypeInfo = ctx.ti[t]
-
-	default:
-		panic("not a named type")
-	}
-
-	return
-}
-
-func (ctx *manglerContext) mangleSignature(s *types.Signature, recv *types.Var, b *bytes.Buffer) {
-	b.WriteRune('F')
-	if recv != nil {
-		b.WriteRune('m')
-		ctx.mangleType(recv.Type(), b)
-	}
-
-	if p := s.Params(); p.Len() != 0 {
-		b.WriteRune('p')
-		for i := 0; i != p.Len(); i++ {
-			ctx.mangleType(p.At(i).Type(), b)
-		}
-		if s.Variadic() {
-			b.WriteRune('V')
-		}
-		b.WriteRune('e')
-	}
-
-	if r := s.Results(); r.Len() != 0 {
-		b.WriteRune('r')
-		for i := 0; i != r.Len(); i++ {
-			ctx.mangleType(r.At(i).Type(), b)
-		}
-		b.WriteRune('e')
-	}
-
-	b.WriteRune('e')
-}
-
-func ManglePackagePath(pkgpath string) string {
-	pkgpath = strings.Replace(pkgpath, "/", "_", -1)
-	pkgpath = strings.Replace(pkgpath, ".", "_", -1)
-	return pkgpath
-}
-
-func (ctx *manglerContext) mangleType(t types.Type, b *bytes.Buffer) {
-	switch t := t.(type) {
-	case *types.Basic, *types.Named:
-		var nb bytes.Buffer
-		ti := ctx.getNamedTypeInfo(t)
-		if ti.pkgpath != "" {
-			nb.WriteString(ManglePackagePath(ti.pkgpath))
-			nb.WriteRune('.')
-		}
-		if ti.functionName != "" {
-			nb.WriteString(ti.functionName)
-			nb.WriteRune('$')
-			if ti.scopeNum != 0 {
-				nb.WriteString(strconv.Itoa(ti.scopeNum))
-				nb.WriteRune('$')
-			}
-		}
-		nb.WriteString(ti.name)
-
-		b.WriteRune('N')
-		b.WriteString(strconv.Itoa(nb.Len()))
-		b.WriteRune('_')
-		b.WriteString(nb.String())
-
-	case *types.Pointer:
-		b.WriteRune('p')
-		ctx.mangleType(t.Elem(), b)
-
-	case *types.Map:
-		b.WriteRune('M')
-		ctx.mangleType(t.Key(), b)
-		b.WriteString("__")
-		ctx.mangleType(t.Elem(), b)
-
-	case *types.Chan:
-		b.WriteRune('C')
-		ctx.mangleType(t.Elem(), b)
-		switch t.Dir() {
-		case types.SendOnly:
-			b.WriteRune('s')
-		case types.RecvOnly:
-			b.WriteRune('r')
-		case types.SendRecv:
-			b.WriteString("sr")
-		}
-		b.WriteRune('e')
-
-	case *types.Signature:
-		ctx.mangleSignature(t, t.Recv(), b)
-
-	case *types.Array:
-		b.WriteRune('A')
-		ctx.mangleType(t.Elem(), b)
-		b.WriteString(strconv.FormatInt(t.Len(), 10))
-		b.WriteRune('e')
-
-	case *types.Slice:
-		b.WriteRune('A')
-		ctx.mangleType(t.Elem(), b)
-		b.WriteRune('e')
-
-	case *types.Struct:
-		b.WriteRune('S')
-		for i := 0; i != t.NumFields(); i++ {
-			f := t.Field(i)
-			if f.Anonymous() {
-				b.WriteString("0_")
-			} else {
-				b.WriteString(strconv.Itoa(len(f.Name())))
-				b.WriteRune('_')
-				b.WriteString(f.Name())
-			}
-			ctx.mangleType(f.Type(), b)
-			// TODO: tags are mangled here
-		}
-		b.WriteRune('e')
-
-	case *types.Interface:
-		b.WriteRune('I')
-		methodset := ctx.msc.MethodSet(t)
-		for _, m := range orderedMethodSet(methodset) {
-			method := m.Obj()
-			var nb bytes.Buffer
-			if !method.Exported() {
-				nb.WriteRune('.')
-				nb.WriteString(method.Pkg().Path())
-				nb.WriteRune('.')
-			}
-			nb.WriteString(method.Name())
-
-			b.WriteString(strconv.Itoa(nb.Len()))
-			b.WriteRune('_')
-			b.WriteString(nb.String())
-
-			ctx.mangleSignature(method.Type().(*types.Signature), nil, b)
-		}
-		b.WriteRune('e')
-
-	default:
-		panic(fmt.Sprintf("unhandled type: %#v", t))
-	}
-}
-
-func (ctx *manglerContext) mangleTypeDescriptorName(t types.Type, b *bytes.Buffer) {
-	switch t := t.(type) {
-	case *types.Basic, *types.Named:
-		b.WriteString("__go_tdn_")
-		ti := ctx.getNamedTypeInfo(t)
-		if ti.pkgpath != "" {
-			b.WriteString(ManglePackagePath(ti.pkgpath))
-			b.WriteRune('.')
-		}
-		if ti.functionName != "" {
-			b.WriteString(ti.functionName)
-			b.WriteRune('.')
-			if ti.scopeNum != 0 {
-				b.WriteString(strconv.Itoa(ti.scopeNum))
-				b.WriteRune('.')
-			}
-		}
-		b.WriteString(ti.name)
-
-	default:
-		b.WriteString("__go_td_")
-		ctx.mangleType(t, b)
-	}
-}
-
-func (ctx *manglerContext) mangleMapDescriptorName(t types.Type, b *bytes.Buffer) {
-	b.WriteString("__go_map_")
-	ctx.mangleType(t, b)
-}
-
-func (ctx *manglerContext) mangleImtName(srctype types.Type, targettype *types.Interface, b *bytes.Buffer) {
-	b.WriteString("__go_imt_")
-	ctx.mangleType(targettype, b)
-	b.WriteString("__")
-	ctx.mangleType(srctype, b)
-}
-
-func (ctx *manglerContext) mangleHashFunctionName(t types.Type) string {
-	var b bytes.Buffer
-	b.WriteString("__go_type_hash_")
-	ctx.mangleType(t, &b)
-	return b.String()
-}
-
-func (ctx *manglerContext) mangleEqualFunctionName(t types.Type) string {
-	var b bytes.Buffer
-	b.WriteString("__go_type_equal_")
-	ctx.mangleType(t, &b)
-	return b.String()
-}
-
-func (ctx *manglerContext) mangleFunctionName(f *ssa.Function) string {
-	var b bytes.Buffer
-
-	if f.Parent() != nil {
-		// Anonymous functions are not guaranteed to
-		// have unique identifiers at the global scope.
-		b.WriteString(ctx.mangleFunctionName(f.Parent()))
-		b.WriteRune(':')
-		b.WriteString(f.String())
-		return b.String()
-	}
-
-	// Synthetic bound and thunk functions are special cases; they can only be
-	// distinguished using private data that is only exposed via String().
-	if strings.HasSuffix(f.Name(), "$bound") || strings.HasSuffix(f.Name(), "$thunk") {
-		b.WriteString(f.String())
-		return b.String()
-	}
-
-	var pkg *types.Package
-	if f.Pkg != nil {
-		pkg = f.Pkg.Object
-	} else if !f.Object().Exported() {
-		pkg = f.Object().Pkg()
-	}
-
-	if pkg != nil {
-		b.WriteString(ManglePackagePath(pkg.Path()))
-		b.WriteRune('.')
-	}
-
-	if f.Signature.Recv() == nil && f.Name() == "init" {
-		b.WriteString(".import")
-	} else {
-		b.WriteString(f.Name())
-	}
-	if f.Signature.Recv() != nil {
-		b.WriteRune('.')
-		ctx.mangleType(f.Signature.Recv().Type(), &b)
-	}
-
-	return b.String()
-}
-
-func (ctx *manglerContext) mangleGlobalName(g *ssa.Global) string {
-	var b bytes.Buffer
-
-	b.WriteString(ManglePackagePath(g.Pkg.Object.Path()))
-	b.WriteRune('.')
-	b.WriteString(g.Name())
-
-	return b.String()
-}
-
-const (
-	// From gofrontend/types.h
-	gccgoTypeClassERROR = iota
-	gccgoTypeClassVOID
-	gccgoTypeClassBOOLEAN
-	gccgoTypeClassINTEGER
-	gccgoTypeClassFLOAT
-	gccgoTypeClassCOMPLEX
-	gccgoTypeClassSTRING
-	gccgoTypeClassSINK
-	gccgoTypeClassFUNCTION
-	gccgoTypeClassPOINTER
-	gccgoTypeClassNIL
-	gccgoTypeClassCALL_MULTIPLE_RESULT
-	gccgoTypeClassSTRUCT
-	gccgoTypeClassARRAY
-	gccgoTypeClassMAP
-	gccgoTypeClassCHANNEL
-	gccgoTypeClassINTERFACE
-	gccgoTypeClassNAMED
-	gccgoTypeClassFORWARD
-)
-
-func getStringHash(s string, h uint32) uint32 {
-	for _, c := range []byte(s) {
-		h ^= uint32(c)
-		h += 16777619
-	}
-	return h
-}
-
-func (tm *TypeMap) getTypeHash(t types.Type) uint32 {
-	switch t := t.(type) {
-	case *types.Basic, *types.Named:
-		nti := tm.mc.getNamedTypeInfo(t)
-		h := getStringHash(nti.functionName+nti.name+nti.pkgpath, 0)
-		h ^= uint32(nti.scopeNum)
-		return gccgoTypeClassNAMED + h
-
-	case *types.Signature:
-		var h uint32
-
-		p := t.Params()
-		for i := 0; i != p.Len(); i++ {
-			h += tm.getTypeHash(p.At(i).Type()) << uint32(i+1)
-		}
-
-		r := t.Results()
-		for i := 0; i != r.Len(); i++ {
-			h += tm.getTypeHash(r.At(i).Type()) << uint32(i+2)
-		}
-
-		if t.Variadic() {
-			h += 1
-		}
-		h <<= 4
-		return gccgoTypeClassFUNCTION + h
-
-	case *types.Pointer:
-		return gccgoTypeClassPOINTER + (tm.getTypeHash(t.Elem()) << 4)
-
-	case *types.Struct:
-		var h uint32
-		for i := 0; i != t.NumFields(); i++ {
-			h = (h << 1) + tm.getTypeHash(t.Field(i).Type())
-		}
-		h <<= 2
-		return gccgoTypeClassSTRUCT + h
-
-	case *types.Array:
-		return gccgoTypeClassARRAY + tm.getTypeHash(t.Elem()) + 1
-
-	case *types.Slice:
-		return gccgoTypeClassARRAY + tm.getTypeHash(t.Elem()) + 1
-
-	case *types.Map:
-		return gccgoTypeClassMAP + tm.getTypeHash(t.Key()) + tm.getTypeHash(t.Elem()) + 2
-
-	case *types.Chan:
-		var h uint32
-
-		switch t.Dir() {
-		case types.SendOnly:
-			h = 1
-		case types.RecvOnly:
-			h = 2
-		case types.SendRecv:
-			h = 3
-		}
-
-		h += tm.getTypeHash(t.Elem()) << 2
-		h <<= 3
-		return gccgoTypeClassCHANNEL + h
-
-	case *types.Interface:
-		var h uint32
-		for _, m := range orderedMethodSet(tm.MethodSet(t)) {
-			h = getStringHash(m.Obj().Name(), h)
-			h <<= 1
-		}
-		return gccgoTypeClassINTERFACE + h
-
-	default:
-		panic(fmt.Sprintf("unhandled type: %#v", t))
-	}
-}
-
-func (tm *TypeMap) writeType(typ types.Type, b *bytes.Buffer) {
-	switch t := typ.(type) {
-	case *types.Basic, *types.Named:
-		ti := tm.mc.getNamedTypeInfo(t)
-		if ti.pkgpath != "" {
-			b.WriteByte('\t')
-			b.WriteString(ManglePackagePath(ti.pkgpath))
-			b.WriteByte('\t')
-			b.WriteString(ti.pkgname)
-			b.WriteByte('.')
-		}
-		if ti.functionName != "" {
-			b.WriteByte('\t')
-			b.WriteString(ti.functionName)
-			b.WriteByte('$')
-			if ti.scopeNum != 0 {
-				b.WriteString(strconv.Itoa(ti.scopeNum))
-				b.WriteByte('$')
-			}
-			b.WriteByte('\t')
-		}
-		b.WriteString(ti.name)
-
-	case *types.Array:
-		fmt.Fprintf(b, "[%d]", t.Len())
-		tm.writeType(t.Elem(), b)
-
-	case *types.Slice:
-		b.WriteString("[]")
-		tm.writeType(t.Elem(), b)
-
-	case *types.Struct:
-		if t.NumFields() == 0 {
-			b.WriteString("struct {}")
-			return
-		}
-		b.WriteString("struct { ")
-		for i := 0; i != t.NumFields(); i++ {
-			f := t.Field(i)
-			if i > 0 {
-				b.WriteString("; ")
-			}
-			if !f.Anonymous() {
-				b.WriteString(f.Name())
-				b.WriteByte(' ')
-			}
-			tm.writeType(f.Type(), b)
-			if tag := t.Tag(i); tag != "" {
-				fmt.Fprintf(b, " %q", tag)
-			}
-		}
-		b.WriteString(" }")
-
-	case *types.Pointer:
-		b.WriteByte('*')
-		tm.writeType(t.Elem(), b)
-
-	case *types.Signature:
-		b.WriteString("func")
-		tm.writeSignature(t, b)
-
-	case *types.Interface:
-		if t.NumMethods() == 0 && t.NumEmbeddeds() == 0 {
-			b.WriteString("interface {}")
-			return
-		}
-		// We write the source-level methods and embedded types rather
-		// than the actual method set since resolved method signatures
-		// may have non-printable cycles if parameters have anonymous
-		// interface types that (directly or indirectly) embed the
-		// current interface. For instance, consider the result type
-		// of m:
-		//
-		//     type T interface{
-		//         m() interface{ T }
-		//     }
-		//
-		b.WriteString("interface { ")
-		// print explicit interface methods and embedded types
-		for i := 0; i != t.NumMethods(); i++ {
-			m := t.Method(i)
-			if i > 0 {
-				b.WriteString("; ")
-			}
-			if !m.Exported() {
-				b.WriteString(m.Pkg().Path())
-				b.WriteByte('.')
-			}
-			b.WriteString(m.Name())
-			tm.writeSignature(m.Type().(*types.Signature), b)
-		}
-		for i := 0; i != t.NumEmbeddeds(); i++ {
-			typ := t.Embedded(i)
-			if i > 0 || t.NumMethods() > 0 {
-				b.WriteString("; ")
-			}
-			tm.writeType(typ, b)
-		}
-		b.WriteString(" }")
-
-	case *types.Map:
-		b.WriteString("map[")
-		tm.writeType(t.Key(), b)
-		b.WriteByte(']')
-		tm.writeType(t.Elem(), b)
-
-	case *types.Chan:
-		var s string
-		var parens bool
-		switch t.Dir() {
-		case types.SendRecv:
-			s = "chan "
-			// chan (<-chan T) requires parentheses
-			if c, _ := t.Elem().(*types.Chan); c != nil && c.Dir() == types.RecvOnly {
-				parens = true
-			}
-		case types.SendOnly:
-			s = "chan<- "
-		case types.RecvOnly:
-			s = "<-chan "
-		default:
-			panic("unreachable")
-		}
-		b.WriteString(s)
-		if parens {
-			b.WriteByte('(')
-		}
-		tm.writeType(t.Elem(), b)
-		if parens {
-			b.WriteByte(')')
-		}
-
-	default:
-		panic(fmt.Sprintf("unhandled type: %#v", t))
-	}
-}
-
-func (tm *TypeMap) writeTuple(tup *types.Tuple, variadic bool, b *bytes.Buffer) {
-	b.WriteByte('(')
-	if tup != nil {
-		for i := 0; i != tup.Len(); i++ {
-			v := tup.At(i)
-			if i > 0 {
-				b.WriteString(", ")
-			}
-			typ := v.Type()
-			if variadic && i == tup.Len()-1 {
-				b.WriteString("...")
-				typ = typ.(*types.Slice).Elem()
-			}
-			tm.writeType(typ, b)
-		}
-	}
-	b.WriteByte(')')
-}
-
-func (tm *TypeMap) writeSignature(sig *types.Signature, b *bytes.Buffer) {
-	tm.writeTuple(sig.Params(), sig.Variadic(), b)
-
-	n := sig.Results().Len()
-	if n == 0 {
-		// no result
-		return
-	}
-
-	b.WriteByte(' ')
-	if n == 1 {
-		tm.writeType(sig.Results().At(0).Type(), b)
-		return
-	}
-
-	// multiple results
-	tm.writeTuple(sig.Results(), false, b)
-}
-
-func (tm *TypeMap) getTypeDescType(t types.Type) llvm.Type {
-	switch t.Underlying().(type) {
-	case *types.Basic:
-		return tm.commonTypeType
-	case *types.Pointer:
-		return tm.ptrTypeType
-	case *types.Signature:
-		return tm.funcTypeType
-	case *types.Array:
-		return tm.arrayTypeType
-	case *types.Slice:
-		return tm.sliceTypeType
-	case *types.Map:
-		return tm.mapTypeType
-	case *types.Chan:
-		return tm.chanTypeType
-	case *types.Struct:
-		return tm.structTypeType
-	case *types.Interface:
-		return tm.interfaceTypeType
-	default:
-		panic(fmt.Sprintf("unhandled type: %#v", t))
-	}
-}
-
-func (tm *TypeMap) getNamedTypeLinkage(nt *types.Named) (linkage llvm.Linkage, emit bool) {
-	if pkg := nt.Obj().Pkg(); pkg != nil {
-		linkage = llvm.ExternalLinkage
-		emit = pkg.Path() == tm.pkgpath
-	} else {
-		linkage = llvm.LinkOnceODRLinkage
-		emit = true
-	}
-
-	return
-}
-
-func (tm *TypeMap) getTypeDescLinkage(t types.Type) (linkage llvm.Linkage, emit bool) {
-	switch t := t.(type) {
-	case *types.Named:
-		linkage, emit = tm.getNamedTypeLinkage(t)
-
-	case *types.Pointer:
-		elem := t.Elem()
-		if nt, ok := elem.(*types.Named); ok {
-			// Thanks to the ptrToThis member, pointers to named types appear
-			// in exactly the same objects as the named types themselves, so
-			// we can give them the same linkage.
-			linkage, emit = tm.getNamedTypeLinkage(nt)
-			return
-		}
-		linkage = llvm.LinkOnceODRLinkage
-		emit = true
-
-	default:
-		linkage = llvm.LinkOnceODRLinkage
-		emit = true
-	}
-
-	return
-}
-
-type typeAndInfo struct {
-	typ        types.Type
-	typeString string
-	tdi        *typeDescInfo
-}
-
-type byTypeName []typeAndInfo
-
-func (ts byTypeName) Len() int { return len(ts) }
-func (ts byTypeName) Swap(i, j int) {
-	ts[i], ts[j] = ts[j], ts[i]
-}
-func (ts byTypeName) Less(i, j int) bool {
-	return ts[i].typeString < ts[j].typeString
-}
-
-func (tm *TypeMap) emitTypeDescInitializers() {
-	var maxSize, maxAlign int64
-	maxAlign = 1
-
-	for changed := true; changed; {
-		changed = false
-
-		var ts []typeAndInfo
-
-		tm.types.Iterate(func(key types.Type, value interface{}) {
-			tdi := value.(*typeDescInfo)
-			if tdi.global.Initializer().C == nil {
-				linkage, emit := tm.getTypeDescLinkage(key)
-				tdi.global.SetLinkage(linkage)
-				tdi.gc.SetLinkage(linkage)
-				if emit {
-					changed = true
-					ts = append(ts, typeAndInfo{key, key.String(), tdi})
-				}
-			}
-		})
-
-		if changed {
-			sort.Sort(byTypeName(ts))
-			for _, t := range ts {
-				tm.emitTypeDescInitializer(t.typ, t.tdi)
-				if size := tm.Sizeof(t.typ); size > maxSize {
-					maxSize = size
-				}
-				if align := tm.Alignof(t.typ); align > maxAlign {
-					maxAlign = align
-				}
-			}
-		}
-	}
-}
-
-const (
-	// From libgo/runtime/mgc0.h
-	gcOpcodeEND = iota
-	gcOpcodePTR
-	gcOpcodeAPTR
-	gcOpcodeARRAY_START
-	gcOpcodeARRAY_NEXT
-	gcOpcodeCALL
-	gcOpcodeCHAN_PTR
-	gcOpcodeSTRING
-	gcOpcodeEFACE
-	gcOpcodeIFACE
-	gcOpcodeSLICE
-	gcOpcodeREGION
-
-	gcStackCapacity = 8
-)
-
-func (tm *TypeMap) makeGcInst(val int64) llvm.Value {
-	c := llvm.ConstInt(tm.inttype, uint64(val), false)
-	return llvm.ConstIntToPtr(c, llvm.PointerType(tm.ctx.Int8Type(), 0))
-}
-
-func (tm *TypeMap) appendGcInsts(insts []llvm.Value, t types.Type, offset, stackSize int64) []llvm.Value {
-	switch u := t.Underlying().(type) {
-	case *types.Basic:
-		switch u.Kind() {
-		case types.String:
-			insts = append(insts, tm.makeGcInst(gcOpcodeSTRING), tm.makeGcInst(offset))
-		case types.UnsafePointer:
-			insts = append(insts, tm.makeGcInst(gcOpcodeAPTR), tm.makeGcInst(offset))
-		}
-	case *types.Pointer:
-		insts = append(insts, tm.makeGcInst(gcOpcodePTR), tm.makeGcInst(offset),
-			tm.getGcPointer(u.Elem()))
-	case *types.Signature, *types.Map:
-		insts = append(insts, tm.makeGcInst(gcOpcodeAPTR), tm.makeGcInst(offset))
-	case *types.Array:
-		if u.Len() == 0 {
-			return insts
-		} else if stackSize >= gcStackCapacity {
-			insts = append(insts, tm.makeGcInst(gcOpcodeREGION), tm.makeGcInst(offset),
-				tm.makeGcInst(tm.Sizeof(t)), tm.getGcPointer(t))
-		} else {
-			insts = append(insts, tm.makeGcInst(gcOpcodeARRAY_START), tm.makeGcInst(offset),
-				tm.makeGcInst(u.Len()), tm.makeGcInst(tm.Sizeof(u.Elem())))
-			insts = tm.appendGcInsts(insts, u.Elem(), 0, stackSize+1)
-			insts = append(insts, tm.makeGcInst(gcOpcodeARRAY_NEXT))
-		}
-	case *types.Slice:
-		if tm.Sizeof(u.Elem()) == 0 {
-			insts = append(insts, tm.makeGcInst(gcOpcodeAPTR), tm.makeGcInst(offset))
-		} else {
-			insts = append(insts, tm.makeGcInst(gcOpcodeSLICE), tm.makeGcInst(offset),
-				tm.getGcPointer(u.Elem()))
-		}
-	case *types.Chan:
-		insts = append(insts, tm.makeGcInst(gcOpcodeCHAN_PTR), tm.makeGcInst(offset),
-			tm.ToRuntime(t))
-	case *types.Struct:
-		fields := make([]*types.Var, u.NumFields())
-		for i := range fields {
-			fields[i] = u.Field(i)
-		}
-		offsets := tm.Offsetsof(fields)
-
-		for i, field := range fields {
-			insts = tm.appendGcInsts(insts, field.Type(), offset+offsets[i], stackSize)
-		}
-	case *types.Interface:
-		if u.NumMethods() == 0 {
-			insts = append(insts, tm.makeGcInst(gcOpcodeEFACE), tm.makeGcInst(offset))
-		} else {
-			insts = append(insts, tm.makeGcInst(gcOpcodeIFACE), tm.makeGcInst(offset))
-		}
-	default:
-		panic(fmt.Sprintf("unhandled type: %#v", t))
-	}
-
-	return insts
-}
-
-func (tm *TypeMap) emitTypeDescInitializer(t types.Type, tdi *typeDescInfo) {
-	// initialize type descriptor
-	tdi.global.SetInitializer(tm.makeTypeDescInitializer(t))
-
-	// initialize GC program
-	insts := []llvm.Value{tm.makeGcInst(tm.Sizeof(t))}
-	insts = tm.appendGcInsts(insts, t, 0, 0)
-	insts = append(insts, tm.makeGcInst(gcOpcodeEND))
-
-	i8ptr := llvm.PointerType(llvm.Int8Type(), 0)
-	instArray := llvm.ConstArray(i8ptr, insts)
-
-	newGc := llvm.AddGlobal(tm.module, instArray.Type(), "")
-	newGc.SetGlobalConstant(true)
-	newGc.SetInitializer(instArray)
-	gcName := tdi.gc.Name()
-	tdi.gc.SetName("")
-	newGc.SetName(gcName)
-	newGc.SetLinkage(tdi.gc.Linkage())
-
-	tdi.gc.ReplaceAllUsesWith(llvm.ConstBitCast(newGc, tdi.gc.Type()))
-	tdi.gc.EraseFromParentAsGlobal()
-	tdi.gc = llvm.Value{nil}
-	tdi.gcPtr = llvm.ConstBitCast(newGc, i8ptr)
-}
-
-func (tm *TypeMap) makeTypeDescInitializer(t types.Type) llvm.Value {
-	switch u := t.Underlying().(type) {
-	case *types.Basic:
-		return tm.makeBasicType(t, u)
-	case *types.Pointer:
-		return tm.makePointerType(t, u)
-	case *types.Signature:
-		return tm.makeFuncType(t, u)
-	case *types.Array:
-		return tm.makeArrayType(t, u)
-	case *types.Slice:
-		return tm.makeSliceType(t, u)
-	case *types.Map:
-		return tm.makeMapType(t, u)
-	case *types.Chan:
-		return tm.makeChanType(t, u)
-	case *types.Struct:
-		return tm.makeStructType(t, u)
-	case *types.Interface:
-		return tm.makeInterfaceType(t, u)
-	default:
-		panic(fmt.Sprintf("unhandled type: %#v", t))
-	}
-}
-
-func (tm *TypeMap) getStructAlgorithms(st *types.Struct) algorithms {
-	if algs, ok := tm.algs.At(st).(algorithms); ok {
-		return algs
-	}
-
-	hashes := make([]llvm.Value, st.NumFields())
-	equals := make([]llvm.Value, st.NumFields())
-
-	for i := range hashes {
-		algs := tm.getAlgorithms(st.Field(i).Type())
-		if algs.hashDescriptor == tm.algsError.hashDescriptor {
-			return algs
-		}
-		hashes[i], equals[i] = algs.hash, algs.equal
-	}
-
-	i8ptr := llvm.PointerType(tm.ctx.Int8Type(), 0)
-	llsptrty := llvm.PointerType(tm.ToLLVM(st), 0)
-
-	builder := tm.ctx.NewBuilder()
-	defer builder.Dispose()
-
-	hashFunctionName := tm.mc.mangleHashFunctionName(st)
-	hash := llvm.AddFunction(tm.module, hashFunctionName, tm.hashFnType)
-	hash.SetLinkage(llvm.LinkOnceODRLinkage)
-	hashDescriptor := tm.createAlgorithmDescriptor(hashFunctionName+"_descriptor", hash)
-
-	builder.SetInsertPointAtEnd(llvm.AddBasicBlock(hash, "entry"))
-	sptr := builder.CreateBitCast(hash.Param(0), llsptrty, "")
-
-	hashval := llvm.ConstNull(tm.inttype)
-	i33 := llvm.ConstInt(tm.inttype, 33, false)
-
-	for i, fhash := range hashes {
-		fptr := builder.CreateStructGEP(sptr, i, "")
-		fptr = builder.CreateBitCast(fptr, i8ptr, "")
-		fsize := llvm.ConstInt(tm.inttype, uint64(tm.sizes.Sizeof(st.Field(i).Type())), false)
-		hashcall := builder.CreateCall(fhash, []llvm.Value{fptr, fsize}, "")
-		hashval = builder.CreateMul(hashval, i33, "")
-		hashval = builder.CreateAdd(hashval, hashcall, "")
-	}
-
-	builder.CreateRet(hashval)
-
-	equalFunctionName := tm.mc.mangleEqualFunctionName(st)
-	equal := llvm.AddFunction(tm.module, equalFunctionName, tm.equalFnType)
-	equal.SetLinkage(llvm.LinkOnceODRLinkage)
-	equalDescriptor := tm.createAlgorithmDescriptor(equalFunctionName+"_descriptor", equal)
-
-	eqentrybb := llvm.AddBasicBlock(equal, "entry")
-	eqretzerobb := llvm.AddBasicBlock(equal, "retzero")
-	builder.SetInsertPointAtEnd(eqentrybb)
-	s1ptr := builder.CreateBitCast(equal.Param(0), llsptrty, "")
-	s2ptr := builder.CreateBitCast(equal.Param(1), llsptrty, "")
-
-	zerobool := llvm.ConstNull(tm.ctx.Int8Type())
-	onebool := llvm.ConstInt(tm.ctx.Int8Type(), 1, false)
-
-	for i, fequal := range equals {
-		f1ptr := builder.CreateStructGEP(s1ptr, i, "")
-		f1ptr = builder.CreateBitCast(f1ptr, i8ptr, "")
-		f2ptr := builder.CreateStructGEP(s2ptr, i, "")
-		f2ptr = builder.CreateBitCast(f2ptr, i8ptr, "")
-		fsize := llvm.ConstInt(tm.inttype, uint64(tm.sizes.Sizeof(st.Field(i).Type())), false)
-		equalcall := builder.CreateCall(fequal, []llvm.Value{f1ptr, f2ptr, fsize}, "")
-		equaleqzero := builder.CreateICmp(llvm.IntEQ, equalcall, zerobool, "")
-		contbb := llvm.AddBasicBlock(equal, "cont")
-		builder.CreateCondBr(equaleqzero, eqretzerobb, contbb)
-		builder.SetInsertPointAtEnd(contbb)
-	}
-
-	builder.CreateRet(onebool)
-
-	builder.SetInsertPointAtEnd(eqretzerobb)
-	builder.CreateRet(zerobool)
-
-	algs := algorithms{
-		hash:            hash,
-		hashDescriptor:  hashDescriptor,
-		equal:           equal,
-		equalDescriptor: equalDescriptor,
-	}
-	tm.algs.Set(st, algs)
-	return algs
-}
-
-func (tm *TypeMap) getArrayAlgorithms(at *types.Array) algorithms {
-	if algs, ok := tm.algs.At(at).(algorithms); ok {
-		return algs
-	}
-
-	elemAlgs := tm.getAlgorithms(at.Elem())
-	if elemAlgs.hashDescriptor == tm.algsError.hashDescriptor {
-		return elemAlgs
-	}
-
-	i8ptr := llvm.PointerType(tm.ctx.Int8Type(), 0)
-	llelemty := llvm.PointerType(tm.ToLLVM(at.Elem()), 0)
-
-	i1 := llvm.ConstInt(tm.inttype, 1, false)
-	alen := llvm.ConstInt(tm.inttype, uint64(at.Len()), false)
-	esize := llvm.ConstInt(tm.inttype, uint64(tm.sizes.Sizeof(at.Elem())), false)
-
-	builder := tm.ctx.NewBuilder()
-	defer builder.Dispose()
-
-	hashFunctionName := tm.mc.mangleHashFunctionName(at)
-	hash := llvm.AddFunction(tm.module, hashFunctionName, tm.hashFnType)
-	hash.SetLinkage(llvm.LinkOnceODRLinkage)
-	hashDescriptor := tm.createAlgorithmDescriptor(hashFunctionName+"_descriptor", hash)
-	equalFunctionName := tm.mc.mangleHashFunctionName(at)
-	equal := llvm.AddFunction(tm.module, equalFunctionName, tm.equalFnType)
-	equal.SetLinkage(llvm.LinkOnceODRLinkage)
-	equalDescriptor := tm.createAlgorithmDescriptor(equalFunctionName+"_descriptor", equal)
-	algs := algorithms{
-		hash:            hash,
-		hashDescriptor:  hashDescriptor,
-		equal:           equal,
-		equalDescriptor: equalDescriptor,
-	}
-	tm.algs.Set(at, algs)
-
-	hashentrybb := llvm.AddBasicBlock(hash, "entry")
-	builder.SetInsertPointAtEnd(hashentrybb)
-	if at.Len() == 0 {
-		builder.CreateRet(llvm.ConstNull(tm.inttype))
-	} else {
-		i33 := llvm.ConstInt(tm.inttype, 33, false)
-
-		aptr := builder.CreateBitCast(hash.Param(0), llelemty, "")
-		loopbb := llvm.AddBasicBlock(hash, "loop")
-		builder.CreateBr(loopbb)
-
-		exitbb := llvm.AddBasicBlock(hash, "exit")
-
-		builder.SetInsertPointAtEnd(loopbb)
-		indexphi := builder.CreatePHI(tm.inttype, "")
-		index := indexphi
-		hashvalphi := builder.CreatePHI(tm.inttype, "")
-		hashval := hashvalphi
-
-		eptr := builder.CreateGEP(aptr, []llvm.Value{index}, "")
-		eptr = builder.CreateBitCast(eptr, i8ptr, "")
-
-		hashcall := builder.CreateCall(elemAlgs.hash, []llvm.Value{eptr, esize}, "")
-		hashval = builder.CreateMul(hashval, i33, "")
-		hashval = builder.CreateAdd(hashval, hashcall, "")
-
-		index = builder.CreateAdd(index, i1, "")
-
-		indexphi.AddIncoming(
-			[]llvm.Value{llvm.ConstNull(tm.inttype), index},
-			[]llvm.BasicBlock{hashentrybb, loopbb},
-		)
-		hashvalphi.AddIncoming(
-			[]llvm.Value{llvm.ConstNull(tm.inttype), hashval},
-			[]llvm.BasicBlock{hashentrybb, loopbb},
-		)
-
-		exit := builder.CreateICmp(llvm.IntEQ, index, alen, "")
-		builder.CreateCondBr(exit, exitbb, loopbb)
-
-		builder.SetInsertPointAtEnd(exitbb)
-		builder.CreateRet(hashval)
-	}
-
-	zerobool := llvm.ConstNull(tm.ctx.Int8Type())
-	onebool := llvm.ConstInt(tm.ctx.Int8Type(), 1, false)
-
-	eqentrybb := llvm.AddBasicBlock(equal, "entry")
-	builder.SetInsertPointAtEnd(eqentrybb)
-	if at.Len() == 0 {
-		builder.CreateRet(onebool)
-	} else {
-		a1ptr := builder.CreateBitCast(equal.Param(0), llelemty, "")
-		a2ptr := builder.CreateBitCast(equal.Param(1), llelemty, "")
-		loopbb := llvm.AddBasicBlock(equal, "loop")
-		builder.CreateBr(loopbb)
-
-		exitbb := llvm.AddBasicBlock(equal, "exit")
-		retzerobb := llvm.AddBasicBlock(equal, "retzero")
-
-		builder.SetInsertPointAtEnd(loopbb)
-		indexphi := builder.CreatePHI(tm.inttype, "")
-		index := indexphi
-
-		e1ptr := builder.CreateGEP(a1ptr, []llvm.Value{index}, "")
-		e1ptr = builder.CreateBitCast(e1ptr, i8ptr, "")
-		e2ptr := builder.CreateGEP(a2ptr, []llvm.Value{index}, "")
-		e2ptr = builder.CreateBitCast(e2ptr, i8ptr, "")
-
-		equalcall := builder.CreateCall(elemAlgs.equal, []llvm.Value{e1ptr, e2ptr, esize}, "")
-		equaleqzero := builder.CreateICmp(llvm.IntEQ, equalcall, zerobool, "")
-
-		contbb := llvm.AddBasicBlock(equal, "cont")
-		builder.CreateCondBr(equaleqzero, retzerobb, contbb)
-
-		builder.SetInsertPointAtEnd(contbb)
-
-		index = builder.CreateAdd(index, i1, "")
-
-		indexphi.AddIncoming(
-			[]llvm.Value{llvm.ConstNull(tm.inttype), index},
-			[]llvm.BasicBlock{eqentrybb, contbb},
-		)
-
-		exit := builder.CreateICmp(llvm.IntEQ, index, alen, "")
-		builder.CreateCondBr(exit, exitbb, loopbb)
-
-		builder.SetInsertPointAtEnd(exitbb)
-		builder.CreateRet(onebool)
-
-		builder.SetInsertPointAtEnd(retzerobb)
-		builder.CreateRet(zerobool)
-	}
-
-	return algs
-}
-
-func (tm *TypeMap) createAlgorithmDescriptor(name string, fn llvm.Value) llvm.Value {
-	d := llvm.AddGlobal(tm.module, tm.funcValType, name)
-	d.SetLinkage(llvm.LinkOnceODRLinkage)
-	d.SetGlobalConstant(true)
-	fn = llvm.ConstBitCast(fn, tm.funcValType.StructElementTypes()[0])
-	init := llvm.ConstNull(tm.funcValType)
-	init = llvm.ConstInsertValue(init, fn, []uint32{0})
-	d.SetInitializer(init)
-	return d
-}
-
-func (tm *TypeMap) getAlgorithms(t types.Type) algorithms {
-	switch t := t.Underlying().(type) {
-	case *types.Interface:
-		if t.NumMethods() == 0 {
-			return tm.algsEmptyInterface
-		}
-		return tm.algsInterface
-	case *types.Basic:
-		switch t.Kind() {
-		case types.Float32, types.Float64:
-			return tm.algsFloat
-		case types.Complex64, types.Complex128:
-			return tm.algsComplex
-		case types.String:
-			return tm.algsString
-		}
-		return tm.algsIdentity
-	case *types.Signature, *types.Map, *types.Slice:
-		return tm.algsError
-	case *types.Struct:
-		return tm.getStructAlgorithms(t)
-	case *types.Array:
-		return tm.getArrayAlgorithms(t)
-	}
-	return tm.algsIdentity
-}
-
-func (tm *TypeMap) getTypeDescInfo(t types.Type) *typeDescInfo {
-	if tdi, ok := tm.types.At(t).(*typeDescInfo); ok {
-		return tdi
-	}
-
-	var b bytes.Buffer
-	tm.mc.mangleTypeDescriptorName(t, &b)
-
-	global := llvm.AddGlobal(tm.module, tm.getTypeDescType(t), b.String())
-	global.SetGlobalConstant(true)
-	ptr := llvm.ConstBitCast(global, llvm.PointerType(tm.commonTypeType, 0))
-
-	gc := llvm.AddGlobal(tm.module, llvm.PointerType(llvm.Int8Type(), 0), b.String()+"$gc")
-	gc.SetGlobalConstant(true)
-	gcPtr := llvm.ConstBitCast(gc, llvm.PointerType(tm.ctx.Int8Type(), 0))
-
-	var mapDescPtr llvm.Value
-	if m, ok := t.Underlying().(*types.Map); ok {
-		var mapb bytes.Buffer
-		tm.mc.mangleMapDescriptorName(t, &mapb)
-
-		mapDescPtr = llvm.AddGlobal(tm.module, tm.mapDescType, mapb.String())
-		mapDescPtr.SetGlobalConstant(true)
-		mapDescPtr.SetLinkage(llvm.LinkOnceODRLinkage)
-		mapDescPtr.SetInitializer(tm.makeMapDesc(ptr, m))
-	}
-
-	tdi := &typeDescInfo{
-		global:        global,
-		commonTypePtr: ptr,
-		mapDescPtr:    mapDescPtr,
-		gc:            gc,
-		gcPtr:         gcPtr,
-	}
-	tm.types.Set(t, tdi)
-	return tdi
-}
-
-func (tm *TypeMap) getTypeDescriptorPointer(t types.Type) llvm.Value {
-	return tm.getTypeDescInfo(t).commonTypePtr
-}
-
-func (tm *TypeMap) getMapDescriptorPointer(t types.Type) llvm.Value {
-	return tm.getTypeDescInfo(t).mapDescPtr
-}
-
-func (tm *TypeMap) getGcPointer(t types.Type) llvm.Value {
-	return tm.getTypeDescInfo(t).gcPtr
-}
-
-func (tm *TypeMap) getItabPointer(srctype types.Type, targettype *types.Interface) llvm.Value {
-	if targettype.NumMethods() == 0 {
-		return tm.ToRuntime(srctype)
-	} else {
-		return tm.getImtPointer(srctype, targettype)
-	}
-}
-
-func (tm *TypeMap) getImtPointer(srctype types.Type, targettype *types.Interface) llvm.Value {
-	tdi := tm.getTypeDescInfo(srctype)
-
-	if ptr, ok := tdi.interfaceMethodTables.At(targettype).(llvm.Value); ok {
-		return ptr
-	}
-
-	srcms := tm.MethodSet(srctype)
-	targetms := tm.MethodSet(targettype)
-
-	i8ptr := llvm.PointerType(llvm.Int8Type(), 0)
-
-	elems := make([]llvm.Value, targetms.Len()+1)
-	elems[0] = tm.ToRuntime(srctype)
-	for i, targetm := range orderedMethodSet(targetms) {
-		srcm := srcms.Lookup(targetm.Obj().Pkg(), targetm.Obj().Name())
-
-		elems[i+1] = tm.methodResolver.ResolveMethod(srcm).value
-	}
-	imtinit := llvm.ConstArray(i8ptr, elems)
-
-	var b bytes.Buffer
-	tm.mc.mangleImtName(srctype, targettype, &b)
-	imt := llvm.AddGlobal(tm.module, imtinit.Type(), b.String())
-	imt.SetGlobalConstant(true)
-	imt.SetInitializer(imtinit)
-	imt.SetLinkage(llvm.LinkOnceODRLinkage)
-
-	imtptr := llvm.ConstBitCast(imt, i8ptr)
-	tdi.interfaceMethodTables.Set(targettype, imtptr)
-	return imtptr
-}
-
-const (
-	// From gofrontend/types.h
-	gccgoRuntimeTypeKindBOOL           = 1
-	gccgoRuntimeTypeKindINT            = 2
-	gccgoRuntimeTypeKindINT8           = 3
-	gccgoRuntimeTypeKindINT16          = 4
-	gccgoRuntimeTypeKindINT32          = 5
-	gccgoRuntimeTypeKindINT64          = 6
-	gccgoRuntimeTypeKindUINT           = 7
-	gccgoRuntimeTypeKindUINT8          = 8
-	gccgoRuntimeTypeKindUINT16         = 9
-	gccgoRuntimeTypeKindUINT32         = 10
-	gccgoRuntimeTypeKindUINT64         = 11
-	gccgoRuntimeTypeKindUINTPTR        = 12
-	gccgoRuntimeTypeKindFLOAT32        = 13
-	gccgoRuntimeTypeKindFLOAT64        = 14
-	gccgoRuntimeTypeKindCOMPLEX64      = 15
-	gccgoRuntimeTypeKindCOMPLEX128     = 16
-	gccgoRuntimeTypeKindARRAY          = 17
-	gccgoRuntimeTypeKindCHAN           = 18
-	gccgoRuntimeTypeKindFUNC           = 19
-	gccgoRuntimeTypeKindINTERFACE      = 20
-	gccgoRuntimeTypeKindMAP            = 21
-	gccgoRuntimeTypeKindPTR            = 22
-	gccgoRuntimeTypeKindSLICE          = 23
-	gccgoRuntimeTypeKindSTRING         = 24
-	gccgoRuntimeTypeKindSTRUCT         = 25
-	gccgoRuntimeTypeKindUNSAFE_POINTER = 26
-	gccgoRuntimeTypeKindDIRECT_IFACE   = (1 << 5)
-	gccgoRuntimeTypeKindNO_POINTERS    = (1 << 7)
-)
-
-func hasPointers(t types.Type) bool {
-	switch t := t.(type) {
-	case *types.Basic:
-		return t.Kind() == types.String || t.Kind() == types.UnsafePointer
-
-	case *types.Signature, *types.Pointer, *types.Slice, *types.Map, *types.Chan, *types.Interface:
-		return true
-
-	case *types.Struct:
-		for i := 0; i != t.NumFields(); i++ {
-			if hasPointers(t.Field(i).Type()) {
-				return true
-			}
-		}
-		return false
-
-	case *types.Named:
-		return hasPointers(t.Underlying())
-
-	case *types.Array:
-		return hasPointers(t.Elem())
-
-	default:
-		panic("unrecognized type")
-	}
-}
-
-func runtimeTypeKind(t types.Type) (k uint8) {
-	switch t := t.(type) {
-	case *types.Basic:
-		switch t.Kind() {
-		case types.Bool:
-			k = gccgoRuntimeTypeKindBOOL
-		case types.Int:
-			k = gccgoRuntimeTypeKindINT
-		case types.Int8:
-			k = gccgoRuntimeTypeKindINT8
-		case types.Int16:
-			k = gccgoRuntimeTypeKindINT16
-		case types.Int32:
-			k = gccgoRuntimeTypeKindINT32
-		case types.Int64:
-			k = gccgoRuntimeTypeKindINT64
-		case types.Uint:
-			k = gccgoRuntimeTypeKindUINT
-		case types.Uint8:
-			k = gccgoRuntimeTypeKindUINT8
-		case types.Uint16:
-			k = gccgoRuntimeTypeKindUINT16
-		case types.Uint32:
-			k = gccgoRuntimeTypeKindUINT32
-		case types.Uint64:
-			k = gccgoRuntimeTypeKindUINT64
-		case types.Uintptr:
-			k = gccgoRuntimeTypeKindUINTPTR
-		case types.Float32:
-			k = gccgoRuntimeTypeKindFLOAT32
-		case types.Float64:
-			k = gccgoRuntimeTypeKindFLOAT64
-		case types.Complex64:
-			k = gccgoRuntimeTypeKindCOMPLEX64
-		case types.Complex128:
-			k = gccgoRuntimeTypeKindCOMPLEX128
-		case types.String:
-			k = gccgoRuntimeTypeKindSTRING
-		case types.UnsafePointer:
-			k = gccgoRuntimeTypeKindUNSAFE_POINTER | gccgoRuntimeTypeKindDIRECT_IFACE
-		default:
-			panic("unrecognized builtin type")
-		}
-	case *types.Array:
-		k = gccgoRuntimeTypeKindARRAY
-	case *types.Slice:
-		k = gccgoRuntimeTypeKindSLICE
-	case *types.Struct:
-		k = gccgoRuntimeTypeKindSTRUCT
-	case *types.Pointer:
-		k = gccgoRuntimeTypeKindPTR | gccgoRuntimeTypeKindDIRECT_IFACE
-	case *types.Signature:
-		k = gccgoRuntimeTypeKindFUNC
-	case *types.Interface:
-		k = gccgoRuntimeTypeKindINTERFACE
-	case *types.Map:
-		k = gccgoRuntimeTypeKindMAP
-	case *types.Chan:
-		k = gccgoRuntimeTypeKindCHAN
-	case *types.Named:
-		return runtimeTypeKind(t.Underlying())
-	default:
-		panic("unrecognized type")
-	}
-
-	if !hasPointers(t) {
-		k |= gccgoRuntimeTypeKindNO_POINTERS
-	}
-
-	return
-}
-
-func (tm *TypeMap) makeCommonType(t types.Type) llvm.Value {
-	var vals [11]llvm.Value
-	vals[0] = llvm.ConstInt(tm.ctx.Int8Type(), uint64(runtimeTypeKind(t)), false)
-	vals[1] = llvm.ConstInt(tm.ctx.Int8Type(), uint64(tm.Alignof(t)), false)
-	vals[2] = vals[1]
-	vals[3] = llvm.ConstInt(tm.inttype, uint64(tm.Sizeof(t)), false)
-	vals[4] = llvm.ConstInt(tm.ctx.Int32Type(), uint64(tm.getTypeHash(t)), false)
-	algs := tm.getAlgorithms(t)
-	vals[5] = algs.hashDescriptor
-	vals[6] = algs.equalDescriptor
-	vals[7] = tm.getGcPointer(t)
-	var b bytes.Buffer
-	tm.writeType(t, &b)
-	vals[8] = tm.globalStringPtr(b.String())
-	vals[9] = tm.makeUncommonTypePtr(t)
-	switch t.(type) {
-	case *types.Named, *types.Struct:
-		vals[10] = tm.getTypeDescriptorPointer(types.NewPointer(t))
-	default:
-		vals[10] = llvm.ConstPointerNull(llvm.PointerType(tm.commonTypeType, 0))
-	}
-	return llvm.ConstNamedStruct(tm.commonTypeType, vals[:])
-}
-
-func (tm *TypeMap) makeBasicType(t types.Type, u *types.Basic) llvm.Value {
-	return tm.makeCommonType(t)
-}
-
-func (tm *TypeMap) makeArrayType(t types.Type, a *types.Array) llvm.Value {
-	var vals [4]llvm.Value
-	vals[0] = tm.makeCommonType(t)
-	vals[1] = tm.getTypeDescriptorPointer(a.Elem())
-	vals[2] = tm.getTypeDescriptorPointer(types.NewSlice(a.Elem()))
-	vals[3] = llvm.ConstInt(tm.inttype, uint64(a.Len()), false)
-
-	return llvm.ConstNamedStruct(tm.arrayTypeType, vals[:])
-}
-
-func (tm *TypeMap) makeSliceType(t types.Type, s *types.Slice) llvm.Value {
-	var vals [2]llvm.Value
-	vals[0] = tm.makeCommonType(t)
-	vals[1] = tm.getTypeDescriptorPointer(s.Elem())
-
-	return llvm.ConstNamedStruct(tm.sliceTypeType, vals[:])
-}
-
-func (tm *TypeMap) makeStructType(t types.Type, s *types.Struct) llvm.Value {
-	var vals [2]llvm.Value
-	vals[0] = tm.makeCommonType(t)
-
-	fieldVars := make([]*types.Var, s.NumFields())
-	for i := range fieldVars {
-		fieldVars[i] = s.Field(i)
-	}
-	offsets := tm.Offsetsof(fieldVars)
-	structFields := make([]llvm.Value, len(fieldVars))
-	for i, field := range fieldVars {
-		var sfvals [5]llvm.Value
-		if !field.Anonymous() {
-			sfvals[0] = tm.globalStringPtr(field.Name())
-		} else {
-			sfvals[0] = llvm.ConstPointerNull(llvm.PointerType(tm.stringType, 0))
-		}
-		if !field.Exported() && field.Pkg() != nil {
-			sfvals[1] = tm.globalStringPtr(field.Pkg().Path())
-		} else {
-			sfvals[1] = llvm.ConstPointerNull(llvm.PointerType(tm.stringType, 0))
-		}
-		sfvals[2] = tm.getTypeDescriptorPointer(field.Type())
-		if tag := s.Tag(i); tag != "" {
-			sfvals[3] = tm.globalStringPtr(tag)
-		} else {
-			sfvals[3] = llvm.ConstPointerNull(llvm.PointerType(tm.stringType, 0))
-		}
-		sfvals[4] = llvm.ConstInt(tm.inttype, uint64(offsets[i]), false)
-
-		structFields[i] = llvm.ConstNamedStruct(tm.structFieldType, sfvals[:])
-	}
-	vals[1] = tm.makeSlice(structFields, tm.structFieldSliceType)
-
-	return llvm.ConstNamedStruct(tm.structTypeType, vals[:])
-}
-
-func (tm *TypeMap) makePointerType(t types.Type, p *types.Pointer) llvm.Value {
-	var vals [2]llvm.Value
-	vals[0] = tm.makeCommonType(t)
-	vals[1] = tm.getTypeDescriptorPointer(p.Elem())
-
-	return llvm.ConstNamedStruct(tm.ptrTypeType, vals[:])
-}
-
-func (tm *TypeMap) rtypeSlice(t *types.Tuple) llvm.Value {
-	rtypes := make([]llvm.Value, t.Len())
-	for i := range rtypes {
-		rtypes[i] = tm.getTypeDescriptorPointer(t.At(i).Type())
-	}
-	return tm.makeSlice(rtypes, tm.typeSliceType)
-}
-
-func (tm *TypeMap) makeFuncType(t types.Type, f *types.Signature) llvm.Value {
-	var vals [4]llvm.Value
-	vals[0] = tm.makeCommonType(t)
-	// dotdotdot
-	variadic := 0
-	if f.Variadic() {
-		variadic = 1
-	}
-	vals[1] = llvm.ConstInt(llvm.Int8Type(), uint64(variadic), false)
-	// in
-	vals[2] = tm.rtypeSlice(f.Params())
-	// out
-	vals[3] = tm.rtypeSlice(f.Results())
-
-	return llvm.ConstNamedStruct(tm.funcTypeType, vals[:])
-}
-
-func (tm *TypeMap) makeInterfaceType(t types.Type, i *types.Interface) llvm.Value {
-	var vals [2]llvm.Value
-	vals[0] = tm.makeCommonType(t)
-
-	methodset := tm.MethodSet(i)
-	imethods := make([]llvm.Value, methodset.Len())
-	for index, ms := range orderedMethodSet(methodset) {
-		method := ms.Obj()
-		var imvals [3]llvm.Value
-		imvals[0] = tm.globalStringPtr(method.Name())
-		if !method.Exported() && method.Pkg() != nil {
-			imvals[1] = tm.globalStringPtr(method.Pkg().Path())
-		} else {
-			imvals[1] = llvm.ConstPointerNull(llvm.PointerType(tm.stringType, 0))
-		}
-		mtyp := method.Type().(*types.Signature)
-		mftyp := types.NewSignature(nil, nil, mtyp.Params(), mtyp.Results(), mtyp.Variadic())
-		imvals[2] = tm.getTypeDescriptorPointer(mftyp)
-
-		imethods[index] = llvm.ConstNamedStruct(tm.imethodType, imvals[:])
-	}
-	vals[1] = tm.makeSlice(imethods, tm.imethodSliceType)
-
-	return llvm.ConstNamedStruct(tm.interfaceTypeType, vals[:])
-}
-
-func (tm *TypeMap) makeMapType(t types.Type, m *types.Map) llvm.Value {
-	var vals [3]llvm.Value
-	vals[0] = tm.makeCommonType(t)
-	vals[1] = tm.getTypeDescriptorPointer(m.Key())
-	vals[2] = tm.getTypeDescriptorPointer(m.Elem())
-
-	return llvm.ConstNamedStruct(tm.mapTypeType, vals[:])
-}
-
-func (tm *TypeMap) makeMapDesc(ptr llvm.Value, m *types.Map) llvm.Value {
-	mapEntryType := structBType{[]backendType{
-		tm.getBackendType(types.Typ[types.UnsafePointer]),
-		tm.getBackendType(m.Key()),
-		tm.getBackendType(m.Elem()),
-	}}.ToLLVM(tm.ctx)
-
-	var vals [4]llvm.Value
-	// map_descriptor
-	vals[0] = ptr
-	// entry_size
-	vals[1] = llvm.ConstInt(tm.inttype, tm.target.TypeAllocSize(mapEntryType), false)
-	// key_offset
-	vals[2] = llvm.ConstInt(tm.inttype, tm.target.ElementOffset(mapEntryType, 1), false)
-	// value_offset
-	vals[3] = llvm.ConstInt(tm.inttype, tm.target.ElementOffset(mapEntryType, 2), false)
-
-	return llvm.ConstNamedStruct(tm.mapDescType, vals[:])
-}
-
-func (tm *TypeMap) makeChanType(t types.Type, c *types.Chan) llvm.Value {
-	var vals [3]llvm.Value
-	vals[0] = tm.makeCommonType(t)
-	vals[1] = tm.getTypeDescriptorPointer(c.Elem())
-
-	// From gofrontend/go/types.cc
-	// These bits must match the ones in libgo/runtime/go-type.h.
-	var dir int
-	switch c.Dir() {
-	case types.RecvOnly:
-		dir = 1
-	case types.SendOnly:
-		dir = 2
-	case types.SendRecv:
-		dir = 3
-	}
-	vals[2] = llvm.ConstInt(tm.inttype, uint64(dir), false)
-
-	return llvm.ConstNamedStruct(tm.chanTypeType, vals[:])
-}
-
-func (tm *TypeMap) makeUncommonTypePtr(t types.Type) llvm.Value {
-	_, isbasic := t.(*types.Basic)
-	_, isnamed := t.(*types.Named)
-
-	var mset types.MethodSet
-	// We store interface methods on the interface type.
-	if _, ok := t.Underlying().(*types.Interface); !ok {
-		mset = *tm.MethodSet(t)
-	}
-
-	if !isbasic && !isnamed && mset.Len() == 0 {
-		return llvm.ConstPointerNull(llvm.PointerType(tm.uncommonTypeType, 0))
-	}
-
-	var vals [3]llvm.Value
-
-	nullStringPtr := llvm.ConstPointerNull(llvm.PointerType(tm.stringType, 0))
-	vals[0] = nullStringPtr
-	vals[1] = nullStringPtr
-
-	if isbasic || isnamed {
-		nti := tm.mc.getNamedTypeInfo(t)
-		vals[0] = tm.globalStringPtr(nti.name)
-		if nti.pkgpath != "" {
-			path := nti.pkgpath
-			if nti.functionName != "" {
-				path += "." + nti.functionName
-				if nti.scopeNum != 0 {
-					path += "$" + strconv.Itoa(nti.scopeNum)
-				}
-			}
-			vals[1] = tm.globalStringPtr(path)
-		}
-	}
-
-	// Store methods. All methods must be stored, not only exported ones;
-	// this is to allow satisfying of interfaces with non-exported methods.
-	methods := make([]llvm.Value, mset.Len())
-	omset := orderedMethodSet(&mset)
-	for i := range methods {
-		var mvals [5]llvm.Value
-
-		sel := omset[i]
-		mname := sel.Obj().Name()
-		mfunc := tm.methodResolver.ResolveMethod(sel)
-		ftyp := mfunc.Type().(*types.Signature)
-
-		// name
-		mvals[0] = tm.globalStringPtr(mname)
-
-		// pkgPath
-		mvals[1] = nullStringPtr
-		if pkg := sel.Obj().Pkg(); pkg != nil && !sel.Obj().Exported() {
-			mvals[1] = tm.globalStringPtr(pkg.Path())
-		}
-
-		// mtyp (method type, no receiver)
-		mftyp := types.NewSignature(nil, nil, ftyp.Params(), ftyp.Results(), ftyp.Variadic())
-		mvals[2] = tm.getTypeDescriptorPointer(mftyp)
-
-		// typ (function type, with receiver)
-		recvparam := types.NewParam(0, nil, "", t)
-		params := ftyp.Params()
-		rfparams := make([]*types.Var, params.Len()+1)
-		rfparams[0] = recvparam
-		for i := 0; i != ftyp.Params().Len(); i++ {
-			rfparams[i+1] = params.At(i)
-		}
-		rftyp := types.NewSignature(nil, nil, types.NewTuple(rfparams...), ftyp.Results(), ftyp.Variadic())
-		mvals[3] = tm.getTypeDescriptorPointer(rftyp)
-
-		// function
-		mvals[4] = mfunc.value
-
-		methods[i] = llvm.ConstNamedStruct(tm.methodType, mvals[:])
-	}
-
-	vals[2] = tm.makeSlice(methods, tm.methodSliceType)
-
-	uncommonType := llvm.ConstNamedStruct(tm.uncommonTypeType, vals[:])
-
-	uncommonTypePtr := llvm.AddGlobal(tm.module, tm.uncommonTypeType, "")
-	uncommonTypePtr.SetGlobalConstant(true)
-	uncommonTypePtr.SetInitializer(uncommonType)
-	uncommonTypePtr.SetLinkage(llvm.InternalLinkage)
-	return uncommonTypePtr
-}
-
-// globalStringPtr returns a *string with the specified value.
-func (tm *TypeMap) globalStringPtr(value string) llvm.Value {
-	strval := llvm.ConstString(value, false)
-	strglobal := llvm.AddGlobal(tm.module, strval.Type(), "")
-	strglobal.SetGlobalConstant(true)
-	strglobal.SetLinkage(llvm.InternalLinkage)
-	strglobal.SetInitializer(strval)
-	strglobal = llvm.ConstBitCast(strglobal, llvm.PointerType(llvm.Int8Type(), 0))
-	strlen := llvm.ConstInt(tm.inttype, uint64(len(value)), false)
-	str := llvm.ConstStruct([]llvm.Value{strglobal, strlen}, false)
-	g := llvm.AddGlobal(tm.module, str.Type(), "")
-	g.SetGlobalConstant(true)
-	g.SetLinkage(llvm.InternalLinkage)
-	g.SetInitializer(str)
-	return g
-}
-
-func (tm *TypeMap) makeNamedSliceType(tname string, elemtyp llvm.Type) llvm.Type {
-	t := tm.ctx.StructCreateNamed(tname)
-	t.StructSetBody([]llvm.Type{
-		llvm.PointerType(elemtyp, 0),
-		tm.inttype,
-		tm.inttype,
-	}, false)
-	return t
-}
-
-func (tm *TypeMap) makeSlice(values []llvm.Value, slicetyp llvm.Type) llvm.Value {
-	ptrtyp := slicetyp.StructElementTypes()[0]
-	var globalptr llvm.Value
-	if len(values) > 0 {
-		array := llvm.ConstArray(ptrtyp.ElementType(), values)
-		globalptr = llvm.AddGlobal(tm.module, array.Type(), "")
-		globalptr.SetGlobalConstant(true)
-		globalptr.SetLinkage(llvm.InternalLinkage)
-		globalptr.SetInitializer(array)
-		globalptr = llvm.ConstBitCast(globalptr, ptrtyp)
-	} else {
-		globalptr = llvm.ConstNull(ptrtyp)
-	}
-	len_ := llvm.ConstInt(tm.inttype, uint64(len(values)), false)
-	slice := llvm.ConstNull(slicetyp)
-	slice = llvm.ConstInsertValue(slice, globalptr, []uint32{0})
-	slice = llvm.ConstInsertValue(slice, len_, []uint32{1})
-	slice = llvm.ConstInsertValue(slice, len_, []uint32{2})
-	return slice
-}
-
-func isGlobalObject(obj types.Object) bool {
-	pkg := obj.Pkg()
-	return pkg == nil || obj.Parent() == pkg.Scope()
-}
diff --git a/irgen/types.go b/irgen/types.go
deleted file mode 100644
index ed1aac2..0000000
--- a/irgen/types.go
+++ /dev/null
@@ -1,21 +0,0 @@
-//===- types.go - convenience functions for types -------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements convenience functions for dealing with types.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-func deref(t types.Type) types.Type {
-	return t.Underlying().(*types.Pointer).Elem()
-}
diff --git a/irgen/utils.go b/irgen/utils.go
deleted file mode 100644
index 2efdc84..0000000
--- a/irgen/utils.go
+++ /dev/null
@@ -1,39 +0,0 @@
-//===- utils.go - misc utils ----------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements misellaneous utilities for IR generation.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-func (fr *frame) loadOrNull(cond, ptr llvm.Value, ty types.Type) *govalue {
-	startbb := fr.builder.GetInsertBlock()
-	loadbb := llvm.AddBasicBlock(fr.function, "")
-	contbb := llvm.AddBasicBlock(fr.function, "")
-	fr.builder.CreateCondBr(cond, loadbb, contbb)
-
-	fr.builder.SetInsertPointAtEnd(loadbb)
-	llty := fr.types.ToLLVM(ty)
-	typedptr := fr.builder.CreateBitCast(ptr, llvm.PointerType(llty, 0), "")
-	loadedval := fr.builder.CreateLoad(typedptr, "")
-	fr.builder.CreateBr(contbb)
-
-	fr.builder.SetInsertPointAtEnd(contbb)
-	llv := fr.builder.CreatePHI(llty, "")
-	llv.AddIncoming(
-		[]llvm.Value{llvm.ConstNull(llty), loadedval},
-		[]llvm.BasicBlock{startbb, loadbb},
-	)
-	return newValue(llv, ty)
-}
diff --git a/irgen/value.go b/irgen/value.go
deleted file mode 100644
index 8b70e01..0000000
--- a/irgen/value.go
+++ /dev/null
@@ -1,637 +0,0 @@
-//===- value.go - govalue and operations ----------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines the govalue type, which combines an LLVM value with its Go
-// type, and implements various basic operations on govalues.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-import (
-	"fmt"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llvm/bindings/go/llvm"
-)
-
-// govalue contains an LLVM value and a Go type,
-// representing the result of a Go expression.
-type govalue struct {
-	value llvm.Value
-	typ   types.Type
-}
-
-func (v *govalue) String() string {
-	return fmt.Sprintf("[llgo.govalue typ:%s value:%v]", v.typ, v.value)
-}
-
-// Create a new dynamic value from a (LLVM Value, Type) pair.
-func newValue(v llvm.Value, t types.Type) *govalue {
-	return &govalue{v, t}
-}
-
-// TODO(axw) remove this, use .typ directly
-func (v *govalue) Type() types.Type {
-	return v.typ
-}
-
-// newValueFromConst converts a constant value to an LLVM value.
-func (fr *frame) newValueFromConst(v exact.Value, typ types.Type) *govalue {
-	switch {
-	case v == nil:
-		llvmtyp := fr.types.ToLLVM(typ)
-		return newValue(llvm.ConstNull(llvmtyp), typ)
-
-	case isString(typ):
-		if isUntyped(typ) {
-			typ = types.Typ[types.String]
-		}
-		llvmtyp := fr.types.ToLLVM(typ)
-		strval := exact.StringVal(v)
-		strlen := len(strval)
-		i8ptr := llvm.PointerType(llvm.Int8Type(), 0)
-		var ptr llvm.Value
-		if strlen > 0 {
-			init := llvm.ConstString(strval, false)
-			ptr = llvm.AddGlobal(fr.module.Module, init.Type(), "")
-			ptr.SetInitializer(init)
-			ptr.SetLinkage(llvm.InternalLinkage)
-			ptr = llvm.ConstBitCast(ptr, i8ptr)
-		} else {
-			ptr = llvm.ConstNull(i8ptr)
-		}
-		len_ := llvm.ConstInt(fr.types.inttype, uint64(strlen), false)
-		llvmvalue := llvm.Undef(llvmtyp)
-		llvmvalue = llvm.ConstInsertValue(llvmvalue, ptr, []uint32{0})
-		llvmvalue = llvm.ConstInsertValue(llvmvalue, len_, []uint32{1})
-		return newValue(llvmvalue, typ)
-
-	case isInteger(typ):
-		if isUntyped(typ) {
-			typ = types.Typ[types.Int]
-		}
-		llvmtyp := fr.types.ToLLVM(typ)
-		var llvmvalue llvm.Value
-		if isUnsigned(typ) {
-			v, _ := exact.Uint64Val(v)
-			llvmvalue = llvm.ConstInt(llvmtyp, v, false)
-		} else {
-			v, _ := exact.Int64Val(v)
-			llvmvalue = llvm.ConstInt(llvmtyp, uint64(v), true)
-		}
-		return newValue(llvmvalue, typ)
-
-	case isBoolean(typ):
-		if isUntyped(typ) {
-			typ = types.Typ[types.Bool]
-		}
-		return newValue(boolLLVMValue(exact.BoolVal(v)), typ)
-
-	case isFloat(typ):
-		if isUntyped(typ) {
-			typ = types.Typ[types.Float64]
-		}
-		llvmtyp := fr.types.ToLLVM(typ)
-		floatval, _ := exact.Float64Val(v)
-		llvmvalue := llvm.ConstFloat(llvmtyp, floatval)
-		return newValue(llvmvalue, typ)
-
-	case typ == types.Typ[types.UnsafePointer]:
-		llvmtyp := fr.types.ToLLVM(typ)
-		v, _ := exact.Uint64Val(v)
-		llvmvalue := llvm.ConstInt(fr.types.inttype, v, false)
-		llvmvalue = llvm.ConstIntToPtr(llvmvalue, llvmtyp)
-		return newValue(llvmvalue, typ)
-
-	case isComplex(typ):
-		if isUntyped(typ) {
-			typ = types.Typ[types.Complex128]
-		}
-		llvmtyp := fr.types.ToLLVM(typ)
-		floattyp := llvmtyp.StructElementTypes()[0]
-		llvmvalue := llvm.ConstNull(llvmtyp)
-		realv := exact.Real(v)
-		imagv := exact.Imag(v)
-		realfloatval, _ := exact.Float64Val(realv)
-		imagfloatval, _ := exact.Float64Val(imagv)
-		llvmre := llvm.ConstFloat(floattyp, realfloatval)
-		llvmim := llvm.ConstFloat(floattyp, imagfloatval)
-		llvmvalue = llvm.ConstInsertValue(llvmvalue, llvmre, []uint32{0})
-		llvmvalue = llvm.ConstInsertValue(llvmvalue, llvmim, []uint32{1})
-		return newValue(llvmvalue, typ)
-	}
-
-	// Special case for string -> [](byte|rune)
-	if u, ok := typ.Underlying().(*types.Slice); ok && isInteger(u.Elem()) {
-		if v.Kind() == exact.String {
-			strval := fr.newValueFromConst(v, types.Typ[types.String])
-			return fr.convert(strval, typ)
-		}
-	}
-
-	panic(fmt.Sprintf("unhandled: t=%s(%T), v=%v(%T)", typ, typ, v, v))
-}
-
-func (fr *frame) binaryOp(lhs *govalue, op token.Token, rhs *govalue) *govalue {
-	if op == token.NEQ {
-		result := fr.binaryOp(lhs, token.EQL, rhs)
-		return fr.unaryOp(result, token.NOT)
-	}
-
-	var result llvm.Value
-	b := fr.builder
-
-	switch typ := lhs.typ.Underlying().(type) {
-	case *types.Struct:
-		// TODO(axw) use runtime equality algorithm (will be suitably inlined).
-		// For now, we use compare all fields unconditionally and bitwise AND
-		// to avoid branching (i.e. so we don't create additional blocks).
-		value := newValue(boolLLVMValue(true), types.Typ[types.Bool])
-		for i := 0; i < typ.NumFields(); i++ {
-			t := typ.Field(i).Type()
-			lhs := newValue(b.CreateExtractValue(lhs.value, i, ""), t)
-			rhs := newValue(b.CreateExtractValue(rhs.value, i, ""), t)
-			value = fr.binaryOp(value, token.AND, fr.binaryOp(lhs, token.EQL, rhs))
-		}
-		return value
-
-	case *types.Array:
-		// TODO(pcc): as above.
-		value := newValue(boolLLVMValue(true), types.Typ[types.Bool])
-		t := typ.Elem()
-		for i := int64(0); i < typ.Len(); i++ {
-			lhs := newValue(b.CreateExtractValue(lhs.value, int(i), ""), t)
-			rhs := newValue(b.CreateExtractValue(rhs.value, int(i), ""), t)
-			value = fr.binaryOp(value, token.AND, fr.binaryOp(lhs, token.EQL, rhs))
-		}
-		return value
-
-	case *types.Slice:
-		// []T == nil or nil == []T
-		lhsptr := b.CreateExtractValue(lhs.value, 0, "")
-		rhsptr := b.CreateExtractValue(rhs.value, 0, "")
-		isnil := b.CreateICmp(llvm.IntEQ, lhsptr, rhsptr, "")
-		isnil = b.CreateZExt(isnil, llvm.Int8Type(), "")
-		return newValue(isnil, types.Typ[types.Bool])
-
-	case *types.Signature:
-		// func == nil or nil == func
-		isnil := b.CreateICmp(llvm.IntEQ, lhs.value, rhs.value, "")
-		isnil = b.CreateZExt(isnil, llvm.Int8Type(), "")
-		return newValue(isnil, types.Typ[types.Bool])
-
-	case *types.Interface:
-		return fr.compareInterfaces(lhs, rhs)
-	}
-
-	// Strings.
-	if isString(lhs.typ) {
-		if isString(rhs.typ) {
-			switch op {
-			case token.ADD:
-				return fr.concatenateStrings(lhs, rhs)
-			case token.EQL, token.LSS, token.GTR, token.LEQ, token.GEQ:
-				return fr.compareStrings(lhs, rhs, op)
-			default:
-				panic(fmt.Sprint("Unimplemented operator: ", op))
-			}
-		}
-		panic("unimplemented")
-	}
-
-	// Complex numbers.
-	if isComplex(lhs.typ) {
-		// XXX Should we represent complex numbers as vectors?
-		lhsval := lhs.value
-		rhsval := rhs.value
-		a_ := b.CreateExtractValue(lhsval, 0, "")
-		b_ := b.CreateExtractValue(lhsval, 1, "")
-		c_ := b.CreateExtractValue(rhsval, 0, "")
-		d_ := b.CreateExtractValue(rhsval, 1, "")
-		switch op {
-		case token.QUO:
-			// (a+bi)/(c+di) = (ac+bd)/(c**2+d**2) + (bc-ad)/(c**2+d**2)i
-			ac := b.CreateFMul(a_, c_, "")
-			bd := b.CreateFMul(b_, d_, "")
-			bc := b.CreateFMul(b_, c_, "")
-			ad := b.CreateFMul(a_, d_, "")
-			cpow2 := b.CreateFMul(c_, c_, "")
-			dpow2 := b.CreateFMul(d_, d_, "")
-			denom := b.CreateFAdd(cpow2, dpow2, "")
-			realnumer := b.CreateFAdd(ac, bd, "")
-			imagnumer := b.CreateFSub(bc, ad, "")
-			real_ := b.CreateFDiv(realnumer, denom, "")
-			imag_ := b.CreateFDiv(imagnumer, denom, "")
-			lhsval = b.CreateInsertValue(lhsval, real_, 0, "")
-			result = b.CreateInsertValue(lhsval, imag_, 1, "")
-		case token.MUL:
-			// (a+bi)(c+di) = (ac-bd)+(bc+ad)i
-			ac := b.CreateFMul(a_, c_, "")
-			bd := b.CreateFMul(b_, d_, "")
-			bc := b.CreateFMul(b_, c_, "")
-			ad := b.CreateFMul(a_, d_, "")
-			real_ := b.CreateFSub(ac, bd, "")
-			imag_ := b.CreateFAdd(bc, ad, "")
-			lhsval = b.CreateInsertValue(lhsval, real_, 0, "")
-			result = b.CreateInsertValue(lhsval, imag_, 1, "")
-		case token.ADD:
-			real_ := b.CreateFAdd(a_, c_, "")
-			imag_ := b.CreateFAdd(b_, d_, "")
-			lhsval = b.CreateInsertValue(lhsval, real_, 0, "")
-			result = b.CreateInsertValue(lhsval, imag_, 1, "")
-		case token.SUB:
-			real_ := b.CreateFSub(a_, c_, "")
-			imag_ := b.CreateFSub(b_, d_, "")
-			lhsval = b.CreateInsertValue(lhsval, real_, 0, "")
-			result = b.CreateInsertValue(lhsval, imag_, 1, "")
-		case token.EQL:
-			realeq := b.CreateFCmp(llvm.FloatOEQ, a_, c_, "")
-			imageq := b.CreateFCmp(llvm.FloatOEQ, b_, d_, "")
-			result = b.CreateAnd(realeq, imageq, "")
-			result = b.CreateZExt(result, llvm.Int8Type(), "")
-			return newValue(result, types.Typ[types.Bool])
-		default:
-			panic(fmt.Errorf("unhandled operator: %v", op))
-		}
-		return newValue(result, lhs.typ)
-	}
-
-	// Floats and integers.
-	// TODO determine the NaN rules.
-
-	switch op {
-	case token.MUL:
-		if isFloat(lhs.typ) {
-			result = b.CreateFMul(lhs.value, rhs.value, "")
-		} else {
-			result = b.CreateMul(lhs.value, rhs.value, "")
-		}
-		return newValue(result, lhs.typ)
-	case token.QUO:
-		switch {
-		case isFloat(lhs.typ):
-			result = b.CreateFDiv(lhs.value, rhs.value, "")
-		case !isUnsigned(lhs.typ):
-			result = b.CreateSDiv(lhs.value, rhs.value, "")
-		default:
-			result = b.CreateUDiv(lhs.value, rhs.value, "")
-		}
-		return newValue(result, lhs.typ)
-	case token.REM:
-		switch {
-		case isFloat(lhs.typ):
-			result = b.CreateFRem(lhs.value, rhs.value, "")
-		case !isUnsigned(lhs.typ):
-			result = b.CreateSRem(lhs.value, rhs.value, "")
-		default:
-			result = b.CreateURem(lhs.value, rhs.value, "")
-		}
-		return newValue(result, lhs.typ)
-	case token.ADD:
-		if isFloat(lhs.typ) {
-			result = b.CreateFAdd(lhs.value, rhs.value, "")
-		} else {
-			result = b.CreateAdd(lhs.value, rhs.value, "")
-		}
-		return newValue(result, lhs.typ)
-	case token.SUB:
-		if isFloat(lhs.typ) {
-			result = b.CreateFSub(lhs.value, rhs.value, "")
-		} else {
-			result = b.CreateSub(lhs.value, rhs.value, "")
-		}
-		return newValue(result, lhs.typ)
-	case token.SHL, token.SHR:
-		return fr.shift(lhs, rhs, op)
-	case token.EQL:
-		if isFloat(lhs.typ) {
-			result = b.CreateFCmp(llvm.FloatOEQ, lhs.value, rhs.value, "")
-		} else {
-			result = b.CreateICmp(llvm.IntEQ, lhs.value, rhs.value, "")
-		}
-		result = b.CreateZExt(result, llvm.Int8Type(), "")
-		return newValue(result, types.Typ[types.Bool])
-	case token.LSS:
-		switch {
-		case isFloat(lhs.typ):
-			result = b.CreateFCmp(llvm.FloatOLT, lhs.value, rhs.value, "")
-		case !isUnsigned(lhs.typ):
-			result = b.CreateICmp(llvm.IntSLT, lhs.value, rhs.value, "")
-		default:
-			result = b.CreateICmp(llvm.IntULT, lhs.value, rhs.value, "")
-		}
-		result = b.CreateZExt(result, llvm.Int8Type(), "")
-		return newValue(result, types.Typ[types.Bool])
-	case token.LEQ:
-		switch {
-		case isFloat(lhs.typ):
-			result = b.CreateFCmp(llvm.FloatOLE, lhs.value, rhs.value, "")
-		case !isUnsigned(lhs.typ):
-			result = b.CreateICmp(llvm.IntSLE, lhs.value, rhs.value, "")
-		default:
-			result = b.CreateICmp(llvm.IntULE, lhs.value, rhs.value, "")
-		}
-		result = b.CreateZExt(result, llvm.Int8Type(), "")
-		return newValue(result, types.Typ[types.Bool])
-	case token.GTR:
-		switch {
-		case isFloat(lhs.typ):
-			result = b.CreateFCmp(llvm.FloatOGT, lhs.value, rhs.value, "")
-		case !isUnsigned(lhs.typ):
-			result = b.CreateICmp(llvm.IntSGT, lhs.value, rhs.value, "")
-		default:
-			result = b.CreateICmp(llvm.IntUGT, lhs.value, rhs.value, "")
-		}
-		result = b.CreateZExt(result, llvm.Int8Type(), "")
-		return newValue(result, types.Typ[types.Bool])
-	case token.GEQ:
-		switch {
-		case isFloat(lhs.typ):
-			result = b.CreateFCmp(llvm.FloatOGE, lhs.value, rhs.value, "")
-		case !isUnsigned(lhs.typ):
-			result = b.CreateICmp(llvm.IntSGE, lhs.value, rhs.value, "")
-		default:
-			result = b.CreateICmp(llvm.IntUGE, lhs.value, rhs.value, "")
-		}
-		result = b.CreateZExt(result, llvm.Int8Type(), "")
-		return newValue(result, types.Typ[types.Bool])
-	case token.AND: // a & b
-		result = b.CreateAnd(lhs.value, rhs.value, "")
-		return newValue(result, lhs.typ)
-	case token.AND_NOT: // a &^ b
-		rhsval := rhs.value
-		rhsval = b.CreateXor(rhsval, llvm.ConstAllOnes(rhsval.Type()), "")
-		result = b.CreateAnd(lhs.value, rhsval, "")
-		return newValue(result, lhs.typ)
-	case token.OR: // a | b
-		result = b.CreateOr(lhs.value, rhs.value, "")
-		return newValue(result, lhs.typ)
-	case token.XOR: // a ^ b
-		result = b.CreateXor(lhs.value, rhs.value, "")
-		return newValue(result, lhs.typ)
-	default:
-		panic(fmt.Sprint("Unimplemented operator: ", op))
-	}
-	panic("unreachable")
-}
-
-func (fr *frame) shift(lhs *govalue, rhs *govalue, op token.Token) *govalue {
-	rhs = fr.convert(rhs, lhs.Type())
-	lhsval := lhs.value
-	bits := rhs.value
-	unsigned := isUnsigned(lhs.Type())
-	// Shifting >= width of lhs yields undefined behaviour, so we must select.
-	max := llvm.ConstInt(bits.Type(), uint64(lhsval.Type().IntTypeWidth()-1), false)
-	var result llvm.Value
-	lessEqualWidth := fr.builder.CreateICmp(llvm.IntULE, bits, max, "")
-	if !unsigned && op == token.SHR {
-		bits := fr.builder.CreateSelect(lessEqualWidth, bits, max, "")
-		result = fr.builder.CreateAShr(lhsval, bits, "")
-	} else {
-		if op == token.SHL {
-			result = fr.builder.CreateShl(lhsval, bits, "")
-		} else {
-			result = fr.builder.CreateLShr(lhsval, bits, "")
-		}
-		zero := llvm.ConstNull(lhsval.Type())
-		result = fr.builder.CreateSelect(lessEqualWidth, result, zero, "")
-	}
-	return newValue(result, lhs.typ)
-}
-
-func (fr *frame) unaryOp(v *govalue, op token.Token) *govalue {
-	switch op {
-	case token.SUB:
-		var value llvm.Value
-		if isComplex(v.typ) {
-			realv := fr.builder.CreateExtractValue(v.value, 0, "")
-			imagv := fr.builder.CreateExtractValue(v.value, 1, "")
-			negzero := llvm.ConstFloatFromString(realv.Type(), "-0")
-			realv = fr.builder.CreateFSub(negzero, realv, "")
-			imagv = fr.builder.CreateFSub(negzero, imagv, "")
-			value = llvm.Undef(v.value.Type())
-			value = fr.builder.CreateInsertValue(value, realv, 0, "")
-			value = fr.builder.CreateInsertValue(value, imagv, 1, "")
-		} else if isFloat(v.typ) {
-			negzero := llvm.ConstFloatFromString(fr.types.ToLLVM(v.Type()), "-0")
-			value = fr.builder.CreateFSub(negzero, v.value, "")
-		} else {
-			value = fr.builder.CreateNeg(v.value, "")
-		}
-		return newValue(value, v.typ)
-	case token.ADD:
-		return v // No-op
-	case token.NOT:
-		value := fr.builder.CreateXor(v.value, boolLLVMValue(true), "")
-		return newValue(value, v.typ)
-	case token.XOR:
-		lhs := v.value
-		rhs := llvm.ConstAllOnes(lhs.Type())
-		value := fr.builder.CreateXor(lhs, rhs, "")
-		return newValue(value, v.typ)
-	default:
-		panic(fmt.Sprintf("Unhandled operator: %s", op))
-	}
-}
-
-func (fr *frame) convert(v *govalue, dsttyp types.Type) *govalue {
-	b := fr.builder
-
-	// If it's a stack allocated value, we'll want to compare the
-	// value type, not the pointer type.
-	srctyp := v.typ
-
-	// Get the underlying type, if any.
-	origdsttyp := dsttyp
-	dsttyp = dsttyp.Underlying()
-	srctyp = srctyp.Underlying()
-
-	// Identical (underlying) types? Just swap in the destination type.
-	if types.Identical(srctyp, dsttyp) {
-		return newValue(v.value, origdsttyp)
-	}
-
-	// Both pointer types with identical underlying types? Same as above.
-	if srctyp, ok := srctyp.(*types.Pointer); ok {
-		if dsttyp, ok := dsttyp.(*types.Pointer); ok {
-			srctyp := srctyp.Elem().Underlying()
-			dsttyp := dsttyp.Elem().Underlying()
-			if types.Identical(srctyp, dsttyp) {
-				return newValue(v.value, origdsttyp)
-			}
-		}
-	}
-
-	// string ->
-	if isString(srctyp) {
-		// (untyped) string -> string
-		// XXX should untyped strings be able to escape go/types?
-		if isString(dsttyp) {
-			return newValue(v.value, origdsttyp)
-		}
-
-		// string -> []byte
-		if isSlice(dsttyp, types.Byte) {
-			sliceValue := fr.runtime.stringToByteArray.callOnly(fr, v.value)[0]
-			return newValue(sliceValue, origdsttyp)
-		}
-
-		// string -> []rune
-		if isSlice(dsttyp, types.Rune) {
-			return fr.stringToRuneSlice(v)
-		}
-	}
-
-	// []byte -> string
-	if isSlice(srctyp, types.Byte) && isString(dsttyp) {
-		data := fr.builder.CreateExtractValue(v.value, 0, "")
-		len := fr.builder.CreateExtractValue(v.value, 1, "")
-		stringValue := fr.runtime.byteArrayToString.callOnly(fr, data, len)[0]
-		return newValue(stringValue, dsttyp)
-	}
-
-	// []rune -> string
-	if isSlice(srctyp, types.Rune) && isString(dsttyp) {
-		return fr.runeSliceToString(v)
-	}
-
-	// rune -> string
-	if isString(dsttyp) && isInteger(srctyp) {
-		return fr.runeToString(v)
-	}
-
-	// Unsafe pointer conversions.
-	llvm_type := fr.types.ToLLVM(dsttyp)
-	if dsttyp == types.Typ[types.UnsafePointer] { // X -> unsafe.Pointer
-		if _, isptr := srctyp.(*types.Pointer); isptr {
-			return newValue(v.value, origdsttyp)
-		} else if srctyp == types.Typ[types.Uintptr] {
-			value := b.CreateIntToPtr(v.value, llvm_type, "")
-			return newValue(value, origdsttyp)
-		}
-	} else if srctyp == types.Typ[types.UnsafePointer] { // unsafe.Pointer -> X
-		if _, isptr := dsttyp.(*types.Pointer); isptr {
-			return newValue(v.value, origdsttyp)
-		} else if dsttyp == types.Typ[types.Uintptr] {
-			value := b.CreatePtrToInt(v.value, llvm_type, "")
-			return newValue(value, origdsttyp)
-		}
-	}
-
-	lv := v.value
-	srcType := lv.Type()
-	switch srcType.TypeKind() {
-	case llvm.IntegerTypeKind:
-		switch llvm_type.TypeKind() {
-		case llvm.IntegerTypeKind:
-			srcBits := srcType.IntTypeWidth()
-			dstBits := llvm_type.IntTypeWidth()
-			delta := srcBits - dstBits
-			switch {
-			case delta < 0:
-				if !isUnsigned(srctyp) {
-					lv = b.CreateSExt(lv, llvm_type, "")
-				} else {
-					lv = b.CreateZExt(lv, llvm_type, "")
-				}
-			case delta > 0:
-				lv = b.CreateTrunc(lv, llvm_type, "")
-			}
-			return newValue(lv, origdsttyp)
-		case llvm.FloatTypeKind, llvm.DoubleTypeKind:
-			if !isUnsigned(v.Type()) {
-				lv = b.CreateSIToFP(lv, llvm_type, "")
-			} else {
-				lv = b.CreateUIToFP(lv, llvm_type, "")
-			}
-			return newValue(lv, origdsttyp)
-		}
-	case llvm.DoubleTypeKind:
-		switch llvm_type.TypeKind() {
-		case llvm.FloatTypeKind:
-			lv = b.CreateFPTrunc(lv, llvm_type, "")
-			return newValue(lv, origdsttyp)
-		case llvm.IntegerTypeKind:
-			if !isUnsigned(dsttyp) {
-				lv = b.CreateFPToSI(lv, llvm_type, "")
-			} else {
-				lv = b.CreateFPToUI(lv, llvm_type, "")
-			}
-			return newValue(lv, origdsttyp)
-		}
-	case llvm.FloatTypeKind:
-		switch llvm_type.TypeKind() {
-		case llvm.DoubleTypeKind:
-			lv = b.CreateFPExt(lv, llvm_type, "")
-			return newValue(lv, origdsttyp)
-		case llvm.IntegerTypeKind:
-			if !isUnsigned(dsttyp) {
-				lv = b.CreateFPToSI(lv, llvm_type, "")
-			} else {
-				lv = b.CreateFPToUI(lv, llvm_type, "")
-			}
-			return newValue(lv, origdsttyp)
-		}
-	}
-
-	// Complex -> complex. Complexes are only convertible to other
-	// complexes, contant conversions aside. So we can just check the
-	// source type here; given that the types are not identical
-	// (checked above), we can assume the destination type is the alternate
-	// complex type.
-	if isComplex(srctyp) {
-		var fpcast func(llvm.Builder, llvm.Value, llvm.Type, string) llvm.Value
-		var fptype llvm.Type
-		if srctyp == types.Typ[types.Complex64] {
-			fpcast = (llvm.Builder).CreateFPExt
-			fptype = llvm.DoubleType()
-		} else {
-			fpcast = (llvm.Builder).CreateFPTrunc
-			fptype = llvm.FloatType()
-		}
-		if fpcast != nil {
-			realv := b.CreateExtractValue(lv, 0, "")
-			imagv := b.CreateExtractValue(lv, 1, "")
-			realv = fpcast(b, realv, fptype, "")
-			imagv = fpcast(b, imagv, fptype, "")
-			lv = llvm.Undef(fr.types.ToLLVM(dsttyp))
-			lv = b.CreateInsertValue(lv, realv, 0, "")
-			lv = b.CreateInsertValue(lv, imagv, 1, "")
-			return newValue(lv, origdsttyp)
-		}
-	}
-	panic(fmt.Sprintf("unimplemented conversion: %s (%s) -> %s", v.typ, lv.Type(), origdsttyp))
-}
-
-// extractRealValue extracts the real component of a complex number.
-func (fr *frame) extractRealValue(v *govalue) *govalue {
-	component := fr.builder.CreateExtractValue(v.value, 0, "")
-	if component.Type().TypeKind() == llvm.FloatTypeKind {
-		return newValue(component, types.Typ[types.Float32])
-	}
-	return newValue(component, types.Typ[types.Float64])
-}
-
-// extractRealValue extracts the imaginary component of a complex number.
-func (fr *frame) extractImagValue(v *govalue) *govalue {
-	component := fr.builder.CreateExtractValue(v.value, 1, "")
-	if component.Type().TypeKind() == llvm.FloatTypeKind {
-		return newValue(component, types.Typ[types.Float32])
-	}
-	return newValue(component, types.Typ[types.Float64])
-}
-
-func boolLLVMValue(v bool) (lv llvm.Value) {
-	if v {
-		return llvm.ConstInt(llvm.Int8Type(), 1, false)
-	}
-	return llvm.ConstNull(llvm.Int8Type())
-}
diff --git a/irgen/version.go b/irgen/version.go
deleted file mode 100644
index a3a1d68..0000000
--- a/irgen/version.go
+++ /dev/null
@@ -1,22 +0,0 @@
-//===- version.go - version info ------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file specifies the Go version supported by the IR generator.
-//
-//===----------------------------------------------------------------------===//
-
-package irgen
-
-const (
-	goVersion = "go1.4.2"
-)
-
-// GoVersion returns the version of Go that we are targeting.
-func GoVersion() string {
-	return goVersion
-}
diff --git a/libgo-check-failures.diff b/libgo-check-failures.diff
deleted file mode 100644
index 519bddf..0000000
--- a/libgo-check-failures.diff
+++ /dev/null
@@ -1,49 +0,0 @@
-diff -r a6e10414311a libgo/Makefile.am
---- a/libgo/Makefile.am	Fri Jan 16 07:57:02 2015 -0800
-+++ b/libgo/Makefile.am	Fri Apr 03 15:07:47 2015 -0700
-@@ -3738,7 +3738,6 @@
- 	os/check \
- 	path/check \
- 	reflect/check \
--	regexp/check \
- 	runtime/check \
- 	sort/check \
- 	strconv/check \
-@@ -3838,7 +3837,6 @@
- 	os/user/check \
- 	path/filepath/check \
- 	regexp/syntax/check \
--	runtime/pprof/check \
- 	sync/atomic/check \
- 	text/scanner/check \
- 	text/tabwriter/check \
-diff -r a6e10414311a libgo/Makefile.in
---- a/libgo/Makefile.in	Fri Jan 16 07:57:02 2015 -0800
-+++ b/libgo/Makefile.in	Fri Apr 03 15:07:47 2015 -0700
-@@ -2212,7 +2212,6 @@
- 	os/check \
- 	path/check \
- 	reflect/check \
--	regexp/check \
- 	runtime/check \
- 	sort/check \
- 	strconv/check \
-@@ -2312,7 +2311,6 @@
- 	os/user/check \
- 	path/filepath/check \
- 	regexp/syntax/check \
--	runtime/pprof/check \
- 	sync/atomic/check \
- 	text/scanner/check \
- 	text/tabwriter/check \
-diff -r a6e10414311a libgo/go/runtime/mfinal_test.go
---- a/libgo/go/runtime/mfinal_test.go	Fri Jan 16 07:57:02 2015 -0800
-+++ b/libgo/go/runtime/mfinal_test.go	Fri Apr 03 15:07:47 2015 -0700
-@@ -62,6 +62,7 @@
- 		}()
- 		<-done
- 		runtime.GC()
-+		runtime.GC()
- 		select {
- 		case <-ch:
- 		case <-time.After(time.Second * 4):
diff --git a/libgo-noext.diff b/libgo-noext.diff
deleted file mode 100644
index 86312bb..0000000
--- a/libgo-noext.diff
+++ /dev/null
@@ -1,1790 +0,0 @@
-diff -r bb70e852004f libgo/runtime/chan.goc
---- a/libgo/runtime/chan.goc	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/chan.goc	Fri Apr 03 17:31:02 2015 -0700
-@@ -111,7 +111,7 @@
- 		mysg.releasetime = -1;
- 	}
- 
--	runtime_lock(c);
-+	runtime_lock(&c->lock);
- 	if(c->closed)
- 		goto closed;
- 
-@@ -120,7 +120,7 @@
- 
- 	sg = dequeue(&c->recvq);
- 	if(sg != nil) {
--		runtime_unlock(c);
-+		runtime_unlock(&c->lock);
- 
- 		gp = sg->g;
- 		gp->param = sg;
-@@ -133,7 +133,7 @@
- 	}
- 
- 	if(!block) {
--		runtime_unlock(c);
-+		runtime_unlock(&c->lock);
- 		return false;
- 	}
- 
-@@ -142,10 +142,10 @@
- 	mysg.selectdone = nil;
- 	g->param = nil;
- 	enqueue(&c->sendq, &mysg);
--	runtime_parkunlock(c, "chan send");
-+	runtime_parkunlock(&c->lock, "chan send");
- 
- 	if(g->param == nil) {
--		runtime_lock(c);
-+		runtime_lock(&c->lock);
- 		if(!c->closed)
- 			runtime_throw("chansend: spurious wakeup");
- 		goto closed;
-@@ -162,16 +162,16 @@
- 
- 	if(c->qcount >= c->dataqsiz) {
- 		if(!block) {
--			runtime_unlock(c);
-+			runtime_unlock(&c->lock);
- 			return false;
- 		}
- 		mysg.g = g;
- 		mysg.elem = nil;
- 		mysg.selectdone = nil;
- 		enqueue(&c->sendq, &mysg);
--		runtime_parkunlock(c, "chan send");
-+		runtime_parkunlock(&c->lock, "chan send");
- 
--		runtime_lock(c);
-+		runtime_lock(&c->lock);
- 		goto asynch;
- 	}
- 
-@@ -183,18 +183,18 @@
- 	sg = dequeue(&c->recvq);
- 	if(sg != nil) {
- 		gp = sg->g;
--		runtime_unlock(c);
-+		runtime_unlock(&c->lock);
- 		if(sg->releasetime)
- 			sg->releasetime = runtime_cputicks();
- 		runtime_ready(gp);
- 	} else
--		runtime_unlock(c);
-+		runtime_unlock(&c->lock);
- 	if(mysg.releasetime > 0)
- 		runtime_blockevent(mysg.releasetime - t0, 2);
- 	return true;
- 
- closed:
--	runtime_unlock(c);
-+	runtime_unlock(&c->lock);
- 	runtime_panicstring("send on closed channel");
- 	return false;  // not reached
- }
-@@ -232,7 +232,7 @@
- 		mysg.releasetime = -1;
- 	}
- 
--	runtime_lock(c);
-+	runtime_lock(&c->lock);
- 	if(c->dataqsiz > 0)
- 		goto asynch;
- 
-@@ -241,7 +241,7 @@
- 
- 	sg = dequeue(&c->sendq);
- 	if(sg != nil) {
--		runtime_unlock(c);
-+		runtime_unlock(&c->lock);
- 
- 		if(ep != nil)
- 			runtime_memmove(ep, sg->elem, c->elemsize);
-@@ -257,7 +257,7 @@
- 	}
- 
- 	if(!block) {
--		runtime_unlock(c);
-+		runtime_unlock(&c->lock);
- 		return false;
- 	}
- 
-@@ -266,10 +266,10 @@
- 	mysg.selectdone = nil;
- 	g->param = nil;
- 	enqueue(&c->recvq, &mysg);
--	runtime_parkunlock(c, "chan receive");
-+	runtime_parkunlock(&c->lock, "chan receive");
- 
- 	if(g->param == nil) {
--		runtime_lock(c);
-+		runtime_lock(&c->lock);
- 		if(!c->closed)
- 			runtime_throw("chanrecv: spurious wakeup");
- 		goto closed;
-@@ -287,7 +287,7 @@
- 			goto closed;
- 
- 		if(!block) {
--			runtime_unlock(c);
-+			runtime_unlock(&c->lock);
- 			if(received != nil)
- 				*received = false;
- 			return false;
-@@ -296,9 +296,9 @@
- 		mysg.elem = nil;
- 		mysg.selectdone = nil;
- 		enqueue(&c->recvq, &mysg);
--		runtime_parkunlock(c, "chan receive");
-+		runtime_parkunlock(&c->lock, "chan receive");
- 
--		runtime_lock(c);
-+		runtime_lock(&c->lock);
- 		goto asynch;
- 	}
- 
-@@ -312,12 +312,12 @@
- 	sg = dequeue(&c->sendq);
- 	if(sg != nil) {
- 		gp = sg->g;
--		runtime_unlock(c);
-+		runtime_unlock(&c->lock);
- 		if(sg->releasetime)
- 			sg->releasetime = runtime_cputicks();
- 		runtime_ready(gp);
- 	} else
--		runtime_unlock(c);
-+		runtime_unlock(&c->lock);
- 
- 	if(received != nil)
- 		*received = true;
-@@ -330,7 +330,7 @@
- 		runtime_memclr(ep, c->elemsize);
- 	if(received != nil)
- 		*received = false;
--	runtime_unlock(c);
-+	runtime_unlock(&c->lock);
- 	if(mysg.releasetime > 0)
- 		runtime_blockevent(mysg.releasetime - t0, 2);
- 	return true;
-@@ -604,7 +604,7 @@
- 		c0 = sel->lockorder[i];
- 		if(c0 && c0 != c) {
- 			c = sel->lockorder[i];
--			runtime_lock(c);
-+			runtime_lock(&c->lock);
- 		}
- 	}
- }
-@@ -632,7 +632,7 @@
- 		c = sel->lockorder[i];
- 		if(i>0 && sel->lockorder[i-1] == c)
- 			continue;  // will unlock it on the next iteration
--		runtime_unlock(c);
-+		runtime_unlock(&c->lock);
- 	}
- }
- 
-@@ -1017,9 +1017,9 @@
- 	if(runtime_gcwaiting())
- 		runtime_gosched();
- 
--	runtime_lock(c);
-+	runtime_lock(&c->lock);
- 	if(c->closed) {
--		runtime_unlock(c);
-+		runtime_unlock(&c->lock);
- 		runtime_panicstring("close of closed channel");
- 	}
- 	c->closed = true;
-@@ -1048,7 +1048,7 @@
- 		runtime_ready(gp);
- 	}
- 
--	runtime_unlock(c);
-+	runtime_unlock(&c->lock);
- }
- 
- void
-diff -r bb70e852004f libgo/runtime/chan.h
---- a/libgo/runtime/chan.h	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/chan.h	Fri Apr 03 17:31:02 2015 -0700
-@@ -39,7 +39,7 @@
- 	uintgo	recvx;			// receive index
- 	WaitQ	recvq;			// list of recv waiters
- 	WaitQ	sendq;			// list of send waiters
--	Lock;
-+	Lock	lock;
- };
- 
- // Buffer follows Hchan immediately in memory.
-diff -r bb70e852004f libgo/runtime/heapdump.c
---- a/libgo/runtime/heapdump.c	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/heapdump.c	Fri Apr 03 17:31:02 2015 -0700
-@@ -387,7 +387,7 @@
- 				if(sp->kind != KindSpecialFinalizer)
- 					continue;
- 				spf = (SpecialFinalizer*)sp;
--				p = (byte*)((s->start << PageShift) + spf->offset);
-+				p = (byte*)((s->start << PageShift) + spf->special.offset);
- 				dumpfinalizer(p, spf->fn, spf->ft, spf->ot);
- 			}
- 		}
-@@ -566,7 +566,7 @@
- 			if(sp->kind != KindSpecialProfile)
- 				continue;
- 			spp = (SpecialProfile*)sp;
--			p = (byte*)((s->start << PageShift) + spp->offset);
-+			p = (byte*)((s->start << PageShift) + spp->special.offset);
- 			dumpint(TagAllocSample);
- 			dumpint((uintptr)p);
- 			dumpint((uintptr)spp->b);
-diff -r bb70e852004f libgo/runtime/malloc.goc
---- a/libgo/runtime/malloc.goc	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/malloc.goc	Fri Apr 03 17:31:02 2015 -0700
-@@ -429,9 +429,9 @@
- 	m->mcache->local_nlookup++;
- 	if (sizeof(void*) == 4 && m->mcache->local_nlookup >= (1<<30)) {
- 		// purge cache stats to prevent overflow
--		runtime_lock(&runtime_mheap);
-+		runtime_lock(&runtime_mheap.lock);
- 		runtime_purgecachedstats(m->mcache);
--		runtime_unlock(&runtime_mheap);
-+		runtime_unlock(&runtime_mheap.lock);
- 	}
- 
- 	s = runtime_MHeap_LookupMaybe(&runtime_mheap, v);
-@@ -728,7 +728,7 @@
- 
- static struct
- {
--	Lock;
-+	Lock	lock;
- 	byte*	pos;
- 	byte*	end;
- } persistent;
-@@ -757,19 +757,19 @@
- 		align = 8;
- 	if(size >= PersistentAllocMaxBlock)
- 		return runtime_SysAlloc(size, stat);
--	runtime_lock(&persistent);
-+	runtime_lock(&persistent.lock);
- 	persistent.pos = (byte*)ROUND((uintptr)persistent.pos, align);
- 	if(persistent.pos + size > persistent.end) {
- 		persistent.pos = runtime_SysAlloc(PersistentAllocChunk, &mstats.other_sys);
- 		if(persistent.pos == nil) {
--			runtime_unlock(&persistent);
-+			runtime_unlock(&persistent.lock);
- 			runtime_throw("runtime: cannot allocate memory");
- 		}
- 		persistent.end = persistent.pos + PersistentAllocChunk;
- 	}
- 	p = persistent.pos;
- 	persistent.pos += size;
--	runtime_unlock(&persistent);
-+	runtime_unlock(&persistent.lock);
- 	if(stat != &mstats.other_sys) {
- 		// reaccount the allocation against provided stat
- 		runtime_xadd64(stat, size);
-diff -r bb70e852004f libgo/runtime/malloc.h
---- a/libgo/runtime/malloc.h	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/malloc.h	Fri Apr 03 17:31:02 2015 -0700
-@@ -390,7 +390,7 @@
- typedef struct SpecialFinalizer SpecialFinalizer;
- struct SpecialFinalizer
- {
--	Special;
-+	Special		special;
- 	FuncVal*	fn;
- 	const FuncType*	ft;
- 	const PtrType*	ot;
-@@ -401,7 +401,7 @@
- typedef struct SpecialProfile SpecialProfile;
- struct SpecialProfile
- {
--	Special;
-+	Special	special;
- 	Bucket*	b;
- };
- 
-@@ -458,7 +458,7 @@
- // Central list of free objects of a given size.
- struct MCentral
- {
--	Lock;
-+	Lock  lock;
- 	int32 sizeclass;
- 	MSpan nonempty;	// list of spans with a free object
- 	MSpan empty;	// list of spans with no free objects (or cached in an MCache)
-@@ -476,7 +476,7 @@
- // but all the other global data is here too.
- struct MHeap
- {
--	Lock;
-+	Lock lock;
- 	MSpan free[MaxMHeapList];	// free lists of given length
- 	MSpan freelarge;		// free lists length >= MaxMHeapList
- 	MSpan busy[MaxMHeapList];	// busy lists of large objects of given length
-@@ -505,7 +505,7 @@
- 	// spaced CacheLineSize bytes apart, so that each MCentral.Lock
- 	// gets its own cache line.
- 	struct {
--		MCentral;
-+		MCentral mcentral;
- 		byte pad[64];
- 	} central[NumSizeClasses];
- 
-diff -r bb70e852004f libgo/runtime/mcache.c
---- a/libgo/runtime/mcache.c	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/mcache.c	Fri Apr 03 17:31:02 2015 -0700
-@@ -23,9 +23,9 @@
- 	MCache *c;
- 	int32 i;
- 
--	runtime_lock(&runtime_mheap);
-+	runtime_lock(&runtime_mheap.lock);
- 	c = runtime_FixAlloc_Alloc(&runtime_mheap.cachealloc);
--	runtime_unlock(&runtime_mheap);
-+	runtime_unlock(&runtime_mheap.lock);
- 	runtime_memclr((byte*)c, sizeof(*c));
- 	for(i = 0; i < NumSizeClasses; i++)
- 		c->alloc[i] = &emptymspan;
-@@ -44,10 +44,10 @@
- runtime_freemcache(MCache *c)
- {
- 	runtime_MCache_ReleaseAll(c);
--	runtime_lock(&runtime_mheap);
-+	runtime_lock(&runtime_mheap.lock);
- 	runtime_purgecachedstats(c);
- 	runtime_FixAlloc_Free(&runtime_mheap.cachealloc, c);
--	runtime_unlock(&runtime_mheap);
-+	runtime_unlock(&runtime_mheap.lock);
- }
- 
- // Gets a span that has a free object in it and assigns it
-@@ -64,19 +64,19 @@
- 	if(s->freelist != nil)
- 		runtime_throw("refill on a nonempty span");
- 	if(s != &emptymspan)
--		runtime_MCentral_UncacheSpan(&runtime_mheap.central[sizeclass], s);
-+		runtime_MCentral_UncacheSpan(&runtime_mheap.central[sizeclass].mcentral, s);
- 
- 	// Push any explicitly freed objects to the central lists.
- 	// Not required, but it seems like a good time to do it.
- 	l = &c->free[sizeclass];
- 	if(l->nlist > 0) {
--		runtime_MCentral_FreeList(&runtime_mheap.central[sizeclass], l->list);
-+		runtime_MCentral_FreeList(&runtime_mheap.central[sizeclass].mcentral, l->list);
- 		l->list = nil;
- 		l->nlist = 0;
- 	}
- 
- 	// Get a new cached span from the central lists.
--	s = runtime_MCentral_CacheSpan(&runtime_mheap.central[sizeclass]);
-+	s = runtime_MCentral_CacheSpan(&runtime_mheap.central[sizeclass].mcentral);
- 	if(s == nil)
- 		runtime_throw("out of memory");
- 	if(s->freelist == nil) {
-@@ -102,7 +102,7 @@
- 	// We transfer a span at a time from MCentral to MCache,
- 	// so we'll do the same in the other direction.
- 	if(l->nlist >= (runtime_class_to_allocnpages[sizeclass]<<PageShift)/size) {
--		runtime_MCentral_FreeList(&runtime_mheap.central[sizeclass], l->list);
-+		runtime_MCentral_FreeList(&runtime_mheap.central[sizeclass].mcentral, l->list);
- 		l->list = nil;
- 		l->nlist = 0;
- 	}
-@@ -118,12 +118,12 @@
- 	for(i=0; i<NumSizeClasses; i++) {
- 		s = c->alloc[i];
- 		if(s != &emptymspan) {
--			runtime_MCentral_UncacheSpan(&runtime_mheap.central[i], s);
-+			runtime_MCentral_UncacheSpan(&runtime_mheap.central[i].mcentral, s);
- 			c->alloc[i] = &emptymspan;
- 		}
- 		l = &c->free[i];
- 		if(l->nlist > 0) {
--			runtime_MCentral_FreeList(&runtime_mheap.central[i], l->list);
-+			runtime_MCentral_FreeList(&runtime_mheap.central[i].mcentral, l->list);
- 			l->list = nil;
- 			l->nlist = 0;
- 		}
-diff -r bb70e852004f libgo/runtime/mcentral.c
---- a/libgo/runtime/mcentral.c	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/mcentral.c	Fri Apr 03 17:31:02 2015 -0700
-@@ -39,14 +39,14 @@
- 	int32 cap, n;
- 	uint32 sg;
- 
--	runtime_lock(c);
-+	runtime_lock(&c->lock);
- 	sg = runtime_mheap.sweepgen;
- retry:
- 	for(s = c->nonempty.next; s != &c->nonempty; s = s->next) {
- 		if(s->sweepgen == sg-2 && runtime_cas(&s->sweepgen, sg-2, sg-1)) {
--			runtime_unlock(c);
-+			runtime_unlock(&c->lock);
- 			runtime_MSpan_Sweep(s);
--			runtime_lock(c);
-+			runtime_lock(&c->lock);
- 			// the span could have been moved to heap, retry
- 			goto retry;
- 		}
-@@ -65,9 +65,9 @@
- 			runtime_MSpanList_Remove(s);
- 			// swept spans are at the end of the list
- 			runtime_MSpanList_InsertBack(&c->empty, s);
--			runtime_unlock(c);
-+			runtime_unlock(&c->lock);
- 			runtime_MSpan_Sweep(s);
--			runtime_lock(c);
-+			runtime_lock(&c->lock);
- 			// the span could be moved to nonempty or heap, retry
- 			goto retry;
- 		}
-@@ -82,7 +82,7 @@
- 
- 	// Replenish central list if empty.
- 	if(!MCentral_Grow(c)) {
--		runtime_unlock(c);
-+		runtime_unlock(&c->lock);
- 		return nil;
- 	}
- 	goto retry;
-@@ -98,7 +98,7 @@
- 	runtime_MSpanList_Remove(s);
- 	runtime_MSpanList_InsertBack(&c->empty, s);
- 	s->incache = true;
--	runtime_unlock(c);
-+	runtime_unlock(&c->lock);
- 	return s;
- }
- 
-@@ -109,7 +109,7 @@
- 	MLink *v;
- 	int32 cap, n;
- 
--	runtime_lock(c);
-+	runtime_lock(&c->lock);
- 
- 	s->incache = false;
- 
-@@ -135,7 +135,7 @@
- 		runtime_MSpanList_Remove(s);
- 		runtime_MSpanList_Insert(&c->nonempty, s);
- 	}
--	runtime_unlock(c);
-+	runtime_unlock(&c->lock);
- }
- 
- // Free the list of objects back into the central free list c.
-@@ -145,12 +145,12 @@
- {
- 	MLink *next;
- 
--	runtime_lock(c);
-+	runtime_lock(&c->lock);
- 	for(; start != nil; start = next) {
- 		next = start->next;
- 		MCentral_Free(c, start);
- 	}
--	runtime_unlock(c);
-+	runtime_unlock(&c->lock);
- }
- 
- // Helper: free one object back into the central free list.
-@@ -193,7 +193,7 @@
- 	// If s is completely freed, return it to the heap.
- 	if(s->ref == 0) {
- 		MCentral_ReturnToHeap(c, s); // unlocks c
--		runtime_lock(c);
-+		runtime_lock(&c->lock);
- 	}
- }
- 
-@@ -206,7 +206,7 @@
- {
- 	if(s->incache)
- 		runtime_throw("freespan into cached span");
--	runtime_lock(c);
-+	runtime_lock(&c->lock);
- 
- 	// Move to nonempty if necessary.
- 	if(s->freelist == nil) {
-@@ -227,7 +227,7 @@
- 	runtime_atomicstore(&s->sweepgen, runtime_mheap.sweepgen);
- 
- 	if(s->ref != 0) {
--		runtime_unlock(c);
-+		runtime_unlock(&c->lock);
- 		return false;
- 	}
- 
-@@ -260,12 +260,12 @@
- 	byte *p;
- 	MSpan *s;
- 
--	runtime_unlock(c);
-+	runtime_unlock(&c->lock);
- 	runtime_MGetSizeClassInfo(c->sizeclass, &size, &npages, &n);
- 	s = runtime_MHeap_Alloc(&runtime_mheap, npages, c->sizeclass, 0, 1);
- 	if(s == nil) {
- 		// TODO(rsc): Log out of memory
--		runtime_lock(c);
-+		runtime_lock(&c->lock);
- 		return false;
- 	}
- 
-@@ -282,7 +282,7 @@
- 	*tailp = nil;
- 	runtime_markspan((byte*)(s->start<<PageShift), size, n, size*n < (s->npages<<PageShift));
- 
--	runtime_lock(c);
-+	runtime_lock(&c->lock);
- 	c->nfree += n;
- 	runtime_MSpanList_Insert(&c->nonempty, s);
- 	return true;
-@@ -301,7 +301,7 @@
- 	if(s->ref != 0)
- 		runtime_throw("ref wrong");
- 	c->nfree -= (s->npages << PageShift) / size;
--	runtime_unlock(c);
-+	runtime_unlock(&c->lock);
- 	runtime_unmarkspan((byte*)(s->start<<PageShift), s->npages<<PageShift);
- 	runtime_MHeap_Free(&runtime_mheap, s, 0);
- }
-diff -r bb70e852004f libgo/runtime/mgc0.c
---- a/libgo/runtime/mgc0.c	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/mgc0.c	Fri Apr 03 17:31:02 2015 -0700
-@@ -225,7 +225,7 @@
- 	Note	alldone;
- 	ParFor	*markfor;
- 
--	Lock;
-+	Lock	lock;
- 	byte	*chunk;
- 	uintptr	nchunk;
- } work __attribute__((aligned(8)));
-@@ -1337,7 +1337,7 @@
- 				// retain everything it points to.
- 				spf = (SpecialFinalizer*)sp;
- 				// A finalizer can be set for an inner byte of an object, find object beginning.
--				p = (void*)((s->start << PageShift) + spf->offset/s->elemsize*s->elemsize);
-+				p = (void*)((s->start << PageShift) + spf->special.offset/s->elemsize*s->elemsize);
- 				enqueue1(&wbuf, (Obj){p, s->elemsize, 0});
- 				enqueue1(&wbuf, (Obj){(void*)&spf->fn, PtrSize, 0});
- 				enqueue1(&wbuf, (Obj){(void*)&spf->ft, PtrSize, 0});
-@@ -1378,7 +1378,7 @@
- 	b = (Workbuf*)runtime_lfstackpop(&work.empty);
- 	if(b == nil) {
- 		// Need to allocate.
--		runtime_lock(&work);
-+		runtime_lock(&work.lock);
- 		if(work.nchunk < sizeof *b) {
- 			work.nchunk = 1<<20;
- 			work.chunk = runtime_SysAlloc(work.nchunk, &mstats.gc_sys);
-@@ -1388,7 +1388,7 @@
- 		b = (Workbuf*)work.chunk;
- 		work.chunk += sizeof *b;
- 		work.nchunk -= sizeof *b;
--		runtime_unlock(&work);
-+		runtime_unlock(&work.lock);
- 	}
- 	b->nobj = 0;
- 	return b;
-@@ -1802,7 +1802,7 @@
- 		c->local_nsmallfree[cl] += nfree;
- 		c->local_cachealloc -= nfree * size;
- 		runtime_xadd64(&mstats.next_gc, -(uint64)(nfree * size * (gcpercent + 100)/100));
--		res = runtime_MCentral_FreeSpan(&runtime_mheap.central[cl], s, nfree, head.next, end);
-+		res = runtime_MCentral_FreeSpan(&runtime_mheap.central[cl].mcentral, s, nfree, head.next, end);
- 		//MCentral_FreeSpan updates sweepgen
- 	}
- 	return res;
-@@ -2147,10 +2147,10 @@
- 		return;
- 
- 	if(gcpercent == GcpercentUnknown) {	// first time through
--		runtime_lock(&runtime_mheap);
-+		runtime_lock(&runtime_mheap.lock);
- 		if(gcpercent == GcpercentUnknown)
- 			gcpercent = readgogc();
--		runtime_unlock(&runtime_mheap);
-+		runtime_unlock(&runtime_mheap.lock);
- 	}
- 	if(gcpercent < 0)
- 		return;
-@@ -2423,7 +2423,7 @@
- 
- 	// Pass back: pauses, last gc (absolute time), number of gc, total pause ns.
- 	p = (uint64*)pauses->array;
--	runtime_lock(&runtime_mheap);
-+	runtime_lock(&runtime_mheap.lock);
- 	n = mstats.numgc;
- 	if(n > nelem(mstats.pause_ns))
- 		n = nelem(mstats.pause_ns);
-@@ -2438,7 +2438,7 @@
- 	p[n] = mstats.last_gc;
- 	p[n+1] = mstats.numgc;
- 	p[n+2] = mstats.pause_total_ns;	
--	runtime_unlock(&runtime_mheap);
-+	runtime_unlock(&runtime_mheap.lock);
- 	pauses->__count = n+3;
- }
- 
-@@ -2446,14 +2446,14 @@
- runtime_setgcpercent(int32 in) {
- 	int32 out;
- 
--	runtime_lock(&runtime_mheap);
-+	runtime_lock(&runtime_mheap.lock);
- 	if(gcpercent == GcpercentUnknown)
- 		gcpercent = readgogc();
- 	out = gcpercent;
- 	if(in < 0)
- 		in = -1;
- 	gcpercent = in;
--	runtime_unlock(&runtime_mheap);
-+	runtime_unlock(&runtime_mheap.lock);
- 	return out;
- }
- 
-diff -r bb70e852004f libgo/runtime/mheap.c
---- a/libgo/runtime/mheap.c	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/mheap.c	Fri Apr 03 17:31:02 2015 -0700
-@@ -70,7 +70,7 @@
- 	runtime_MSpanList_Init(&h->freelarge);
- 	runtime_MSpanList_Init(&h->busylarge);
- 	for(i=0; i<nelem(h->central); i++)
--		runtime_MCentral_Init(&h->central[i], i);
-+		runtime_MCentral_Init(&h->central[i].mcentral, i);
- }
- 
- void
-@@ -109,9 +109,9 @@
- 			runtime_MSpanList_Remove(s);
- 			// swept spans are at the end of the list
- 			runtime_MSpanList_InsertBack(list, s);
--			runtime_unlock(h);
-+			runtime_unlock(&h->lock);
- 			n += runtime_MSpan_Sweep(s);
--			runtime_lock(h);
-+			runtime_lock(&h->lock);
- 			if(n >= npages)
- 				return n;
- 			// the span could have been moved elsewhere
-@@ -156,7 +156,7 @@
- 	}
- 
- 	// Now sweep everything that is not yet swept.
--	runtime_unlock(h);
-+	runtime_unlock(&h->lock);
- 	for(;;) {
- 		n = runtime_sweepone();
- 		if(n == (uintptr)-1)  // all spans are swept
-@@ -165,7 +165,7 @@
- 		if(reclaimed >= npage)
- 			break;
- 	}
--	runtime_lock(h);
-+	runtime_lock(&h->lock);
- }
- 
- // Allocate a new span of npage pages from the heap
-@@ -175,7 +175,7 @@
- {
- 	MSpan *s;
- 
--	runtime_lock(h);
-+	runtime_lock(&h->lock);
- 	mstats.heap_alloc += runtime_m()->mcache->local_cachealloc;
- 	runtime_m()->mcache->local_cachealloc = 0;
- 	s = MHeap_AllocLocked(h, npage, sizeclass);
-@@ -191,7 +191,7 @@
- 				runtime_MSpanList_InsertBack(&h->busylarge, s);
- 		}
- 	}
--	runtime_unlock(h);
-+	runtime_unlock(&h->lock);
- 	if(s != nil) {
- 		if(needzero && s->needzero)
- 			runtime_memclr((byte*)(s->start<<PageShift), s->npages<<PageShift);
-@@ -386,7 +386,7 @@
- void
- runtime_MHeap_Free(MHeap *h, MSpan *s, int32 acct)
- {
--	runtime_lock(h);
-+	runtime_lock(&h->lock);
- 	mstats.heap_alloc += runtime_m()->mcache->local_cachealloc;
- 	runtime_m()->mcache->local_cachealloc = 0;
- 	mstats.heap_inuse -= s->npages<<PageShift;
-@@ -395,7 +395,7 @@
- 		mstats.heap_objects--;
- 	}
- 	MHeap_FreeLocked(h, s);
--	runtime_unlock(h);
-+	runtime_unlock(&h->lock);
- }
- 
- static void
-@@ -548,10 +548,10 @@
- 		runtime_noteclear(&note);
- 		runtime_notetsleepg(&note, tick);
- 
--		runtime_lock(h);
-+		runtime_lock(&h->lock);
- 		unixnow = runtime_unixnanotime();
- 		if(unixnow - mstats.last_gc > forcegc) {
--			runtime_unlock(h);
-+			runtime_unlock(&h->lock);
- 			// The scavenger can not block other goroutines,
- 			// otherwise deadlock detector can fire spuriously.
- 			// GC blocks other goroutines via the runtime_worldsema.
-@@ -561,11 +561,11 @@
- 			runtime_notetsleepg(&note, -1);
- 			if(runtime_debug.gctrace > 0)
- 				runtime_printf("scvg%d: GC forced\n", k);
--			runtime_lock(h);
-+			runtime_lock(&h->lock);
- 		}
- 		now = runtime_nanotime();
- 		scavenge(k, now, limit);
--		runtime_unlock(h);
-+		runtime_unlock(&h->lock);
- 	}
- }
- 
-@@ -575,9 +575,9 @@
- runtime_debug_freeOSMemory(void)
- {
- 	runtime_gc(2);  // force GC and do eager sweep
--	runtime_lock(&runtime_mheap);
-+	runtime_lock(&runtime_mheap.lock);
- 	scavenge(-1, ~(uintptr)0, 0);
--	runtime_unlock(&runtime_mheap);
-+	runtime_unlock(&runtime_mheap.lock);
- }
- 
- // Initialize a new span with the given start and npages.
-@@ -752,11 +752,11 @@
- 	runtime_lock(&runtime_mheap.speciallock);
- 	s = runtime_FixAlloc_Alloc(&runtime_mheap.specialfinalizeralloc);
- 	runtime_unlock(&runtime_mheap.speciallock);
--	s->kind = KindSpecialFinalizer;
-+	s->special.kind = KindSpecialFinalizer;
- 	s->fn = f;
- 	s->ft = ft;
- 	s->ot = ot;
--	if(addspecial(p, s))
-+	if(addspecial(p, &s->special))
- 		return true;
- 
- 	// There was an old finalizer
-@@ -789,9 +789,9 @@
- 	runtime_lock(&runtime_mheap.speciallock);
- 	s = runtime_FixAlloc_Alloc(&runtime_mheap.specialprofilealloc);
- 	runtime_unlock(&runtime_mheap.speciallock);
--	s->kind = KindSpecialProfile;
-+	s->special.kind = KindSpecialProfile;
- 	s->b = b;
--	if(!addspecial(p, s))
-+	if(!addspecial(p, &s->special))
- 		runtime_throw("setprofilebucket: profile already set");
- }
- 
-@@ -879,14 +879,14 @@
- 	// remove the span from whatever list it is in now
- 	if(s->sizeclass > 0) {
- 		// must be in h->central[x].empty
--		c = &h->central[s->sizeclass];
--		runtime_lock(c);
-+		c = &h->central[s->sizeclass].mcentral;
-+		runtime_lock(&c->lock);
- 		runtime_MSpanList_Remove(s);
--		runtime_unlock(c);
--		runtime_lock(h);
-+		runtime_unlock(&c->lock);
-+		runtime_lock(&h->lock);
- 	} else {
- 		// must be in h->busy/busylarge
--		runtime_lock(h);
-+		runtime_lock(&h->lock);
- 		runtime_MSpanList_Remove(s);
- 	}
- 	// heap is locked now
-@@ -933,18 +933,18 @@
- 
- 	// place the span into a new list
- 	if(s->sizeclass > 0) {
--		runtime_unlock(h);
--		c = &h->central[s->sizeclass];
--		runtime_lock(c);
-+		runtime_unlock(&h->lock);
-+		c = &h->central[s->sizeclass].mcentral;
-+		runtime_lock(&c->lock);
- 		// swept spans are at the end of the list
- 		runtime_MSpanList_InsertBack(&c->empty, s);
--		runtime_unlock(c);
-+		runtime_unlock(&c->lock);
- 	} else {
- 		// Swept spans are at the end of lists.
- 		if(s->npages < nelem(h->free))
- 			runtime_MSpanList_InsertBack(&h->busy[s->npages], s);
- 		else
- 			runtime_MSpanList_InsertBack(&h->busylarge, s);
--		runtime_unlock(h);
-+		runtime_unlock(&h->lock);
- 	}
- }
-diff -r bb70e852004f libgo/runtime/netpoll.goc
---- a/libgo/runtime/netpoll.goc	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/netpoll.goc	Fri Apr 03 17:31:02 2015 -0700
-@@ -53,7 +53,7 @@
- 	// pollReset, pollWait, pollWaitCanceled and runtime_netpollready (IO rediness notification)
- 	// proceed w/o taking the lock. So closing, rg, rd, wg and wd are manipulated
- 	// in a lock-free way by all operations.
--	Lock;		// protectes the following fields
-+	Lock	lock;	// protectes the following fields
- 	uintptr	fd;
- 	bool	closing;
- 	uintptr	seq;	// protects from stale timers and ready notifications
-@@ -68,7 +68,7 @@
- 
- static struct
- {
--	Lock;
-+	Lock		lock;
- 	PollDesc*	first;
- 	// PollDesc objects must be type-stable,
- 	// because we can get ready notification from epoll/kqueue
-@@ -100,7 +100,7 @@
- 
- func runtime_pollOpen(fd uintptr) (pd *PollDesc, errno int) {
- 	pd = allocPollDesc();
--	runtime_lock(pd);
-+	runtime_lock(&pd->lock);
- 	if(pd->wg != nil && pd->wg != READY)
- 		runtime_throw("runtime_pollOpen: blocked write on free descriptor");
- 	if(pd->rg != nil && pd->rg != READY)
-@@ -112,7 +112,7 @@
- 	pd->rd = 0;
- 	pd->wg = nil;
- 	pd->wd = 0;
--	runtime_unlock(pd);
-+	runtime_unlock(&pd->lock);
- 
- 	errno = runtime_netpollopen(fd, pd);
- }
-@@ -125,10 +125,10 @@
- 	if(pd->rg != nil && pd->rg != READY)
- 		runtime_throw("runtime_pollClose: blocked read on closing descriptor");
- 	runtime_netpollclose(pd->fd);
--	runtime_lock(&pollcache);
-+	runtime_lock(&pollcache.lock);
- 	pd->link = pollcache.first;
- 	pollcache.first = pd;
--	runtime_unlock(&pollcache);
-+	runtime_unlock(&pollcache.lock);
- }
- 
- func runtime_pollReset(pd *PollDesc, mode int) (err int) {
-@@ -169,9 +169,9 @@
- func runtime_pollSetDeadline(pd *PollDesc, d int64, mode int) {
- 	G *rg, *wg;
- 
--	runtime_lock(pd);
-+	runtime_lock(&pd->lock);
- 	if(pd->closing) {
--		runtime_unlock(pd);
-+		runtime_unlock(&pd->lock);
- 		return;
- 	}
- 	pd->seq++;  // invalidate current timers
-@@ -226,7 +226,7 @@
- 		rg = netpollunblock(pd, 'r', false);
- 	if(pd->wd < 0)
- 		wg = netpollunblock(pd, 'w', false);
--	runtime_unlock(pd);
-+	runtime_unlock(&pd->lock);
- 	if(rg)
- 		runtime_ready(rg);
- 	if(wg)
-@@ -236,7 +236,7 @@
- func runtime_pollUnblock(pd *PollDesc) {
- 	G *rg, *wg;
- 
--	runtime_lock(pd);
-+	runtime_lock(&pd->lock);
- 	if(pd->closing)
- 		runtime_throw("runtime_pollUnblock: already closing");
- 	pd->closing = true;
-@@ -252,7 +252,7 @@
- 		runtime_deltimer(&pd->wt);
- 		pd->wt.fv = nil;
- 	}
--	runtime_unlock(pd);
-+	runtime_unlock(&pd->lock);
- 	if(rg)
- 		runtime_ready(rg);
- 	if(wg)
-@@ -280,13 +280,13 @@
- void
- runtime_netpolllock(PollDesc *pd)
- {
--	runtime_lock(pd);
-+	runtime_lock(&pd->lock);
- }
- 
- void
- runtime_netpollunlock(PollDesc *pd)
- {
--	runtime_unlock(pd);
-+	runtime_unlock(&pd->lock);
- }
- 
- // make pd ready, newly runnable goroutines (if any) are enqueued info gpp list
-@@ -399,12 +399,12 @@
- 
- 	pd = (PollDesc*)arg.data;
- 	rg = wg = nil;
--	runtime_lock(pd);
-+	runtime_lock(&pd->lock);
- 	// Seq arg is seq when the timer was set.
- 	// If it's stale, ignore the timer event.
- 	if(seq != pd->seq) {
- 		// The descriptor was reused or timers were reset.
--		runtime_unlock(pd);
-+		runtime_unlock(&pd->lock);
- 		return;
- 	}
- 	if(read) {
-@@ -421,7 +421,7 @@
- 		runtime_atomicstorep(&pd->wt.fv, nil);  // full memory barrier between store to wd and load of wg in netpollunblock
- 		wg = netpollunblock(pd, 'w', false);
- 	}
--	runtime_unlock(pd);
-+	runtime_unlock(&pd->lock);
- 	if(rg)
- 		runtime_ready(rg);
- 	if(wg)
-@@ -452,7 +452,7 @@
- 	PollDesc *pd;
- 	uint32 i, n;
- 
--	runtime_lock(&pollcache);
-+	runtime_lock(&pollcache.lock);
- 	if(pollcache.first == nil) {
- 		n = PollBlockSize/sizeof(*pd);
- 		if(n == 0)
-@@ -467,6 +467,6 @@
- 	}
- 	pd = pollcache.first;
- 	pollcache.first = pd->link;
--	runtime_unlock(&pollcache);
-+	runtime_unlock(&pollcache.lock);
- 	return pd;
- }
-diff -r bb70e852004f libgo/runtime/proc.c
---- a/libgo/runtime/proc.c	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/proc.c	Fri Apr 03 17:31:02 2015 -0700
-@@ -302,7 +302,7 @@
- 
- typedef struct Sched Sched;
- struct Sched {
--	Lock;
-+	Lock	lock;
- 
- 	uint64	goidgen;
- 	M*	midle;	 // idle m's waiting for work
-@@ -709,7 +709,7 @@
- 
- 	mp->fastrand = 0x49f6428aUL + mp->id + runtime_cputicks();
- 
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	mp->id = runtime_sched.mcount++;
- 	checkmcount();
- 	runtime_mpreinit(mp);
-@@ -720,7 +720,7 @@
- 	// runtime_NumCgoCall() iterates over allm w/o schedlock,
- 	// so we need to publish it safely.
- 	runtime_atomicstorep(&runtime_allm, mp);
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- }
- 
- // Mark gp ready to run.
-@@ -747,7 +747,7 @@
- 
- 	// Figure out how many CPUs to use during GC.
- 	// Limited by gomaxprocs, number of actual CPUs, and MaxGcproc.
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	n = runtime_gomaxprocs;
- 	if(n > runtime_ncpu)
- 		n = runtime_ncpu > 0 ? runtime_ncpu : 1;
-@@ -755,7 +755,7 @@
- 		n = MaxGcproc;
- 	if(n > runtime_sched.nmidle+1) // one M is currently running
- 		n = runtime_sched.nmidle+1;
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 	return n;
- }
- 
-@@ -764,14 +764,14 @@
- {
- 	int32 n;
- 
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	n = runtime_gomaxprocs;
- 	if(n > runtime_ncpu)
- 		n = runtime_ncpu;
- 	if(n > MaxGcproc)
- 		n = MaxGcproc;
- 	n -= runtime_sched.nmidle+1; // one M is currently running
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 	return n > 0;
- }
- 
-@@ -781,7 +781,7 @@
- 	M *mp;
- 	int32 n, pos;
- 
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	pos = 0;
- 	for(n = 1; n < nproc; n++) {  // one M is currently running
- 		if(runtime_allp[pos]->mcache == m->mcache)
-@@ -794,7 +794,7 @@
- 		pos++;
- 		runtime_notewakeup(&mp->park);
- 	}
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- }
- 
- // Similar to stoptheworld but best-effort and can be called several times.
-@@ -833,7 +833,7 @@
- 	P *p;
- 	bool wait;
- 
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	runtime_sched.stopwait = runtime_gomaxprocs;
- 	runtime_atomicstore((uint32*)&runtime_sched.gcwaiting, 1);
- 	preemptall();
-@@ -853,7 +853,7 @@
- 		runtime_sched.stopwait--;
- 	}
- 	wait = runtime_sched.stopwait > 0;
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 
- 	// wait for remaining P's to stop voluntarily
- 	if(wait) {
-@@ -887,7 +887,7 @@
- 	gp = runtime_netpoll(false);  // non-blocking
- 	injectglist(gp);
- 	add = needaddgcproc();
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	if(newprocs) {
- 		procresize(newprocs);
- 		newprocs = 0;
-@@ -911,7 +911,7 @@
- 		runtime_sched.sysmonwait = false;
- 		runtime_notewakeup(&runtime_sched.sysmonnote);
- 	}
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 
- 	while(p1) {
- 		p = p1;
-@@ -1346,9 +1346,9 @@
- 	}
- 
- retry:
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	mput(m);
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 	runtime_notesleep(&m->park);
- 	runtime_noteclear(&m->park);
- 	if(m->helpgc) {
-@@ -1375,18 +1375,18 @@
- 	M *mp;
- 	void (*fn)(void);
- 
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	if(p == nil) {
- 		p = pidleget();
- 		if(p == nil) {
--			runtime_unlock(&runtime_sched);
-+			runtime_unlock(&runtime_sched.lock);
- 			if(spinning)
- 				runtime_xadd(&runtime_sched.nmspinning, -1);
- 			return;
- 		}
- 	}
- 	mp = mget();
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 	if(mp == nil) {
- 		fn = nil;
- 		if(spinning)
-@@ -1419,28 +1419,28 @@
- 		startm(p, true);
- 		return;
- 	}
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	if(runtime_sched.gcwaiting) {
- 		p->status = Pgcstop;
- 		if(--runtime_sched.stopwait == 0)
- 			runtime_notewakeup(&runtime_sched.stopnote);
--		runtime_unlock(&runtime_sched);
-+		runtime_unlock(&runtime_sched.lock);
- 		return;
- 	}
- 	if(runtime_sched.runqsize) {
--		runtime_unlock(&runtime_sched);
-+		runtime_unlock(&runtime_sched.lock);
- 		startm(p, false);
- 		return;
- 	}
- 	// If this is the last running P and nobody is polling network,
- 	// need to wakeup another M to poll network.
- 	if(runtime_sched.npidle == (uint32)runtime_gomaxprocs-1 && runtime_atomicload64(&runtime_sched.lastpoll) != 0) {
--		runtime_unlock(&runtime_sched);
-+		runtime_unlock(&runtime_sched.lock);
- 		startm(p, false);
- 		return;
- 	}
- 	pidleput(p);
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- }
- 
- // Tries to add one more P to execute G's.
-@@ -1512,11 +1512,11 @@
- 		runtime_xadd(&runtime_sched.nmspinning, -1);
- 	}
- 	p = releasep();
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	p->status = Pgcstop;
- 	if(--runtime_sched.stopwait == 0)
- 		runtime_notewakeup(&runtime_sched.stopnote);
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 	stopm();
- }
- 
-@@ -1567,9 +1567,9 @@
- 		return gp;
- 	// global runq
- 	if(runtime_sched.runqsize) {
--		runtime_lock(&runtime_sched);
-+		runtime_lock(&runtime_sched.lock);
- 		gp = globrunqget(m->p, 0);
--		runtime_unlock(&runtime_sched);
-+		runtime_unlock(&runtime_sched.lock);
- 		if(gp)
- 			return gp;
- 	}
-@@ -1603,19 +1603,19 @@
- 	}
- stop:
- 	// return P and block
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	if(runtime_sched.gcwaiting) {
--		runtime_unlock(&runtime_sched);
-+		runtime_unlock(&runtime_sched.lock);
- 		goto top;
- 	}
- 	if(runtime_sched.runqsize) {
- 		gp = globrunqget(m->p, 0);
--		runtime_unlock(&runtime_sched);
-+		runtime_unlock(&runtime_sched.lock);
- 		return gp;
- 	}
- 	p = releasep();
- 	pidleput(p);
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 	if(m->spinning) {
- 		m->spinning = false;
- 		runtime_xadd(&runtime_sched.nmspinning, -1);
-@@ -1624,9 +1624,9 @@
- 	for(i = 0; i < runtime_gomaxprocs; i++) {
- 		p = runtime_allp[i];
- 		if(p && p->runqhead != p->runqtail) {
--			runtime_lock(&runtime_sched);
-+			runtime_lock(&runtime_sched.lock);
- 			p = pidleget();
--			runtime_unlock(&runtime_sched);
-+			runtime_unlock(&runtime_sched.lock);
- 			if(p) {
- 				acquirep(p);
- 				goto top;
-@@ -1643,9 +1643,9 @@
- 		gp = runtime_netpoll(true);  // block until new work is available
- 		runtime_atomicstore64(&runtime_sched.lastpoll, runtime_nanotime());
- 		if(gp) {
--			runtime_lock(&runtime_sched);
-+			runtime_lock(&runtime_sched.lock);
- 			p = pidleget();
--			runtime_unlock(&runtime_sched);
-+			runtime_unlock(&runtime_sched.lock);
- 			if(p) {
- 				acquirep(p);
- 				injectglist(gp->schedlink);
-@@ -1688,14 +1688,14 @@
- 
- 	if(glist == nil)
- 		return;
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	for(n = 0; glist; n++) {
- 		gp = glist;
- 		glist = gp->schedlink;
- 		gp->status = Grunnable;
- 		globrunqput(gp);
- 	}
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 
- 	for(; n && runtime_sched.npidle; n--)
- 		startm(nil, false);
-@@ -1726,9 +1726,9 @@
- 	// This is a fancy way to say tick%61==0,
- 	// it uses 2 MUL instructions instead of a single DIV and so is faster on modern processors.
- 	if(tick - (((uint64)tick*0x4325c53fu)>>36)*61 == 0 && runtime_sched.runqsize > 0) {
--		runtime_lock(&runtime_sched);
-+		runtime_lock(&runtime_sched.lock);
- 		gp = globrunqget(m->p, 1);
--		runtime_unlock(&runtime_sched);
-+		runtime_unlock(&runtime_sched.lock);
- 		if(gp)
- 			resetspinning();
- 	}
-@@ -1822,9 +1822,9 @@
- 	gp->status = Grunnable;
- 	gp->m = nil;
- 	m->curg = nil;
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	globrunqput(gp);
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 	if(m->lockedg) {
- 		stoplockedm();
- 		execute(gp);  // Never returns.
-@@ -1925,24 +1925,24 @@
- 	g->status = Gsyscall;
- 
- 	if(runtime_atomicload(&runtime_sched.sysmonwait)) {  // TODO: fast atomic
--		runtime_lock(&runtime_sched);
-+		runtime_lock(&runtime_sched.lock);
- 		if(runtime_atomicload(&runtime_sched.sysmonwait)) {
- 			runtime_atomicstore(&runtime_sched.sysmonwait, 0);
- 			runtime_notewakeup(&runtime_sched.sysmonnote);
- 		}
--		runtime_unlock(&runtime_sched);
-+		runtime_unlock(&runtime_sched.lock);
- 	}
- 
- 	m->mcache = nil;
- 	m->p->m = nil;
- 	runtime_atomicstore(&m->p->status, Psyscall);
- 	if(runtime_sched.gcwaiting) {
--		runtime_lock(&runtime_sched);
-+		runtime_lock(&runtime_sched.lock);
- 		if (runtime_sched.stopwait > 0 && runtime_cas(&m->p->status, Psyscall, Pgcstop)) {
- 			if(--runtime_sched.stopwait == 0)
- 				runtime_notewakeup(&runtime_sched.stopnote);
- 		}
--		runtime_unlock(&runtime_sched);
-+		runtime_unlock(&runtime_sched.lock);
- 	}
- 
- 	m->locks--;
-@@ -2053,13 +2053,13 @@
- 	// Try to get any other idle P.
- 	m->p = nil;
- 	if(runtime_sched.pidle) {
--		runtime_lock(&runtime_sched);
-+		runtime_lock(&runtime_sched.lock);
- 		p = pidleget();
- 		if(p && runtime_atomicload(&runtime_sched.sysmonwait)) {
- 			runtime_atomicstore(&runtime_sched.sysmonwait, 0);
- 			runtime_notewakeup(&runtime_sched.sysmonnote);
- 		}
--		runtime_unlock(&runtime_sched);
-+		runtime_unlock(&runtime_sched.lock);
- 		if(p) {
- 			acquirep(p);
- 			return true;
-@@ -2078,7 +2078,7 @@
- 	gp->status = Grunnable;
- 	gp->m = nil;
- 	m->curg = nil;
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	p = pidleget();
- 	if(p == nil)
- 		globrunqput(gp);
-@@ -2086,7 +2086,7 @@
- 		runtime_atomicstore(&runtime_sched.sysmonwait, 0);
- 		runtime_notewakeup(&runtime_sched.sysmonnote);
- 	}
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 	if(p) {
- 		acquirep(p);
- 		execute(gp);  // Never returns.
-@@ -2365,13 +2365,13 @@
- 
- 	if(n > MaxGomaxprocs)
- 		n = MaxGomaxprocs;
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	ret = runtime_gomaxprocs;
- 	if(n <= 0 || n == ret) {
--		runtime_unlock(&runtime_sched);
-+		runtime_unlock(&runtime_sched.lock);
- 		return ret;
- 	}
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 
- 	runtime_semacquire(&runtime_worldsema, false);
- 	m->gcing = 1;
-@@ -2476,7 +2476,7 @@
- }
- 
- static struct {
--	Lock;
-+	Lock lock;
- 	void (*fn)(uintptr*, int32);
- 	int32 hz;
- 	uintptr pcbuf[TracebackMaxFrames];
-@@ -2508,9 +2508,9 @@
- 	if(mp->mcache == nil)
- 		traceback = false;
- 
--	runtime_lock(&prof);
-+	runtime_lock(&prof.lock);
- 	if(prof.fn == nil) {
--		runtime_unlock(&prof);
-+		runtime_unlock(&prof.lock);
- 		mp->mallocing--;
- 		return;
- 	}
-@@ -2538,7 +2538,7 @@
- 			prof.pcbuf[1] = (uintptr)System;
- 	}
- 	prof.fn(prof.pcbuf, n);
--	runtime_unlock(&prof);
-+	runtime_unlock(&prof.lock);
- 	mp->mallocing--;
- }
- 
-@@ -2563,13 +2563,13 @@
- 	// it would deadlock.
- 	runtime_resetcpuprofiler(0);
- 
--	runtime_lock(&prof);
-+	runtime_lock(&prof.lock);
- 	prof.fn = fn;
- 	prof.hz = hz;
--	runtime_unlock(&prof);
--	runtime_lock(&runtime_sched);
-+	runtime_unlock(&prof.lock);
-+	runtime_lock(&runtime_sched.lock);
- 	runtime_sched.profilehz = hz;
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 
- 	if(hz != 0)
- 		runtime_resetcpuprofiler(hz);
-@@ -2707,11 +2707,11 @@
- static void
- incidlelocked(int32 v)
- {
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	runtime_sched.nmidlelocked += v;
- 	if(v > 0)
- 		checkdead();
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- }
- 
- // Check for deadlock situation.
-@@ -2780,16 +2780,16 @@
- 		runtime_usleep(delay);
- 		if(runtime_debug.schedtrace <= 0 &&
- 			(runtime_sched.gcwaiting || runtime_atomicload(&runtime_sched.npidle) == (uint32)runtime_gomaxprocs)) {  // TODO: fast atomic
--			runtime_lock(&runtime_sched);
-+			runtime_lock(&runtime_sched.lock);
- 			if(runtime_atomicload(&runtime_sched.gcwaiting) || runtime_atomicload(&runtime_sched.npidle) == (uint32)runtime_gomaxprocs) {
- 				runtime_atomicstore(&runtime_sched.sysmonwait, 1);
--				runtime_unlock(&runtime_sched);
-+				runtime_unlock(&runtime_sched.lock);
- 				runtime_notesleep(&runtime_sched.sysmonnote);
- 				runtime_noteclear(&runtime_sched.sysmonnote);
- 				idle = 0;
- 				delay = 20;
- 			} else
--				runtime_unlock(&runtime_sched);
-+				runtime_unlock(&runtime_sched.lock);
- 		}
- 		// poll network if not polled for more than 10ms
- 		lastpoll = runtime_atomicload64(&runtime_sched.lastpoll);
-@@ -2918,7 +2918,7 @@
- 	if(starttime == 0)
- 		starttime = now;
- 
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	runtime_printf("SCHED %Dms: gomaxprocs=%d idleprocs=%d threads=%d idlethreads=%d runqueue=%d",
- 		(now-starttime)/1000000, runtime_gomaxprocs, runtime_sched.npidle, runtime_sched.mcount,
- 		runtime_sched.nmidle, runtime_sched.runqsize);
-@@ -2954,7 +2954,7 @@
- 		}
- 	}
- 	if(!detailed) {
--		runtime_unlock(&runtime_sched);
-+		runtime_unlock(&runtime_sched.lock);
- 		return;
- 	}
- 	for(mp = runtime_allm; mp; mp = mp->alllink) {
-@@ -2986,7 +2986,7 @@
- 			lockedm ? lockedm->id : -1);
- 	}
- 	runtime_unlock(&allglock);
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- }
- 
- // Put mp on midle list.
-@@ -3142,9 +3142,9 @@
- 	for(i=0; i<n; i++)
- 		batch[i]->schedlink = batch[i+1];
- 	// Now put the batch on global queue.
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	globrunqputbatch(batch[0], batch[n], n+1);
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 	return true;
- }
- 
-@@ -3296,11 +3296,11 @@
- {
- 	int32 out;
- 
--	runtime_lock(&runtime_sched);
-+	runtime_lock(&runtime_sched.lock);
- 	out = runtime_sched.maxmcount;
- 	runtime_sched.maxmcount = in;
- 	checkmcount();
--	runtime_unlock(&runtime_sched);
-+	runtime_unlock(&runtime_sched.lock);
- 	return out;
- }
- 
-diff -r bb70e852004f libgo/runtime/runtime.h
---- a/libgo/runtime/runtime.h	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/runtime.h	Fri Apr 03 17:31:02 2015 -0700
-@@ -285,7 +285,7 @@
- 
- struct P
- {
--	Lock;
-+	Lock	lock;
- 
- 	int32	id;
- 	uint32	status;		// one of Pidle/Prunning/...
-@@ -383,7 +383,7 @@
- 
- struct	Timers
- {
--	Lock;
-+	Lock	lock;
- 	G	*timerproc;
- 	bool		sleeping;
- 	bool		rescheduling;
-diff -r bb70e852004f libgo/runtime/sema.goc
---- a/libgo/runtime/sema.goc	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/sema.goc	Fri Apr 03 17:31:02 2015 -0700
-@@ -35,7 +35,7 @@
- typedef struct SemaRoot SemaRoot;
- struct SemaRoot
- {
--	Lock;
-+	Lock		lock;
- 	SemaWaiter*	head;
- 	SemaWaiter*	tail;
- 	// Number of waiters. Read w/o the lock.
-@@ -47,7 +47,7 @@
- 
- struct semtable
- {
--	SemaRoot;
-+	SemaRoot root;
- 	uint8 pad[CacheLineSize-sizeof(SemaRoot)];
- };
- static struct semtable semtable[SEMTABLESZ];
-@@ -55,7 +55,7 @@
- static SemaRoot*
- semroot(uint32 volatile *addr)
- {
--	return &semtable[((uintptr)addr >> 3) % SEMTABLESZ];
-+	return &semtable[((uintptr)addr >> 3) % SEMTABLESZ].root;
- }
- 
- static void
-@@ -124,19 +124,19 @@
- 	}
- 	for(;;) {
- 
--		runtime_lock(root);
-+		runtime_lock(&root->lock);
- 		// Add ourselves to nwait to disable "easy case" in semrelease.
- 		runtime_xadd(&root->nwait, 1);
- 		// Check cansemacquire to avoid missed wakeup.
- 		if(cansemacquire(addr)) {
- 			runtime_xadd(&root->nwait, -1);
--			runtime_unlock(root);
-+			runtime_unlock(&root->lock);
- 			return;
- 		}
- 		// Any semrelease after the cansemacquire knows we're waiting
- 		// (we set nwait above), so go to sleep.
- 		semqueue(root, addr, &s);
--		runtime_parkunlock(root, "semacquire");
-+		runtime_parkunlock(&root->lock, "semacquire");
- 		if(cansemacquire(addr)) {
- 			if(t0)
- 				runtime_blockevent(s.releasetime - t0, 3);
-@@ -161,11 +161,11 @@
- 		return;
- 
- 	// Harder case: search for a waiter and wake it.
--	runtime_lock(root);
-+	runtime_lock(&root->lock);
- 	if(runtime_atomicload(&root->nwait) == 0) {
- 		// The count is already consumed by another goroutine,
- 		// so no need to wake up another goroutine.
--		runtime_unlock(root);
-+		runtime_unlock(&root->lock);
- 		return;
- 	}
- 	for(s = root->head; s; s = s->next) {
-@@ -175,7 +175,7 @@
- 			break;
- 		}
- 	}
--	runtime_unlock(root);
-+	runtime_unlock(&root->lock);
- 	if(s) {
- 		if(s->releasetime)
- 			s->releasetime = runtime_cputicks();
-@@ -211,7 +211,7 @@
- typedef struct SyncSema SyncSema;
- struct SyncSema
- {
--	Lock;
-+	Lock		lock;
- 	SemaWaiter*	head;
- 	SemaWaiter*	tail;
- };
-@@ -238,7 +238,7 @@
- 		w.releasetime = -1;
- 	}
- 
--	runtime_lock(s);
-+	runtime_lock(&s->lock);
- 	if(s->head && s->head->nrelease > 0) {
- 		// have pending release, consume it
- 		wake = nil;
-@@ -249,7 +249,7 @@
- 			if(s->head == nil)
- 				s->tail = nil;
- 		}
--		runtime_unlock(s);
-+		runtime_unlock(&s->lock);
- 		if(wake)
- 			runtime_ready(wake->g);
- 	} else {
-@@ -259,7 +259,7 @@
- 		else
- 			s->tail->next = &w;
- 		s->tail = &w;
--		runtime_parkunlock(s, "semacquire");
-+		runtime_parkunlock(&s->lock, "semacquire");
- 		if(t0)
- 			runtime_blockevent(w.releasetime - t0, 2);
- 	}
-@@ -274,7 +274,7 @@
- 	w.next = nil;
- 	w.releasetime = 0;
- 
--	runtime_lock(s);
-+	runtime_lock(&s->lock);
- 	while(w.nrelease > 0 && s->head && s->head->nrelease < 0) {
- 		// have pending acquire, satisfy it
- 		wake = s->head;
-@@ -293,7 +293,7 @@
- 		else
- 			s->tail->next = &w;
- 		s->tail = &w;
--		runtime_parkunlock(s, "semarelease");
-+		runtime_parkunlock(&s->lock, "semarelease");
- 	} else
--		runtime_unlock(s);
-+		runtime_unlock(&s->lock);
- }
-diff -r bb70e852004f libgo/runtime/sigqueue.goc
---- a/libgo/runtime/sigqueue.goc	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/sigqueue.goc	Fri Apr 03 17:31:02 2015 -0700
-@@ -32,7 +32,7 @@
- #include "defs.h"
- 
- static struct {
--	Note;
-+	Note note;
- 	uint32 mask[(NSIG+31)/32];
- 	uint32 wanted[(NSIG+31)/32];
- 	uint32 state;
-@@ -70,7 +70,7 @@
- 					new = HASSIGNAL;
- 				if(runtime_cas(&sig.state, old, new)) {
- 					if (old == HASWAITER)
--						runtime_notewakeup(&sig);
-+						runtime_notewakeup(&sig.note);
- 					break;
- 				}
- 			}
-@@ -107,8 +107,8 @@
- 				new = HASWAITER;
- 			if(runtime_cas(&sig.state, old, new)) {
- 				if (new == HASWAITER) {
--					runtime_notetsleepg(&sig, -1);
--					runtime_noteclear(&sig);
-+					runtime_notetsleepg(&sig.note, -1);
-+					runtime_noteclear(&sig.note);
- 				}
- 				break;
- 			}
-@@ -138,7 +138,7 @@
- 		// to use for initialization.  It does not pass
- 		// signal information in m.
- 		sig.inuse = true;	// enable reception of signals; cannot disable
--		runtime_noteclear(&sig);
-+		runtime_noteclear(&sig.note);
- 		return;
- 	}
- 	
-diff -r bb70e852004f libgo/runtime/time.goc
---- a/libgo/runtime/time.goc	Fri Jan 16 13:28:21 2015 -0800
-+++ b/libgo/runtime/time.goc	Fri Apr 03 17:31:02 2015 -0700
-@@ -92,17 +92,17 @@
- 	t.fv = &readyv;
- 	t.arg.__object = g;
- 	t.seq = 0;
--	runtime_lock(&timers);
-+	runtime_lock(&timers.lock);
- 	addtimer(&t);
--	runtime_parkunlock(&timers, reason);
-+	runtime_parkunlock(&timers.lock, reason);
- }
- 
- void
- runtime_addtimer(Timer *t)
- {
--	runtime_lock(&timers);
-+	runtime_lock(&timers.lock);
- 	addtimer(t);
--	runtime_unlock(&timers);
-+	runtime_unlock(&timers.lock);
- }
- 
- // Add a timer to the heap and start or kick the timer proc
-@@ -167,14 +167,14 @@
- 	i = t->i;
- 	gi = i;
- 
--	runtime_lock(&timers);
-+	runtime_lock(&timers.lock);
- 
- 	// t may not be registered anymore and may have
- 	// a bogus i (typically 0, if generated by Go).
- 	// Verify it before proceeding.
- 	i = t->i;
- 	if(i < 0 || i >= timers.len || timers.t[i] != t) {
--		runtime_unlock(&timers);
-+		runtime_unlock(&timers.lock);
- 		return false;
- 	}
- 
-@@ -190,7 +190,7 @@
- 	}
- 	if(debug)
- 		dumptimers("deltimer");
--	runtime_unlock(&timers);
-+	runtime_unlock(&timers.lock);
- 	return true;
- }
- 
-@@ -209,7 +209,7 @@
- 	uintptr seq;
- 
- 	for(;;) {
--		runtime_lock(&timers);
-+		runtime_lock(&timers.lock);
- 		timers.sleeping = false;
- 		now = runtime_nanotime();
- 		for(;;) {
-@@ -236,7 +236,7 @@
- 			f = (void*)t->fv->fn;
- 			arg = t->arg;
- 			seq = t->seq;
--			runtime_unlock(&timers);
-+			runtime_unlock(&timers.lock);
- 			__builtin_call_with_static_chain(f(arg, seq), fv);
- 
- 			// clear f and arg to avoid leak while sleeping for next timer
-@@ -246,20 +246,20 @@
- 			arg.__object = nil;
- 			USED(&arg);
- 
--			runtime_lock(&timers);
-+			runtime_lock(&timers.lock);
- 		}
- 		if(delta < 0) {
- 			// No timers left - put goroutine to sleep.
- 			timers.rescheduling = true;
- 			runtime_g()->isbackground = true;
--			runtime_parkunlock(&timers, "timer goroutine (idle)");
-+			runtime_parkunlock(&timers.lock, "timer goroutine (idle)");
- 			runtime_g()->isbackground = false;
- 			continue;
- 		}
- 		// At least one timer pending.  Sleep until then.
- 		timers.sleeping = true;
- 		runtime_noteclear(&timers.waitnote);
--		runtime_unlock(&timers);
-+		runtime_unlock(&timers.lock);
- 		runtime_notetsleepg(&timers.waitnote, delta);
- 	}
- }
diff --git a/llgo-go.sh b/llgo-go.sh
deleted file mode 100644
index a29be01..0000000
--- a/llgo-go.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/sh -e
-
-scriptpath=$(which "$0")
-scriptpath=$(readlink -f "$scriptpath")
-bindir=$(dirname "$scriptpath")
-prefix=$(dirname "$bindir")
-
-cmd="$1"
-
-case "$cmd" in
-build | get | install | run | test)
-  shift
-  PATH="$prefix/lib/llgo/go-path:$PATH" exec go "$cmd" -compiler gccgo "$@"
-  ;;
-
-*)
-  exec go "$@"
-  ;;
-esac
diff --git a/ssaopt/esc.go b/ssaopt/esc.go
deleted file mode 100644
index 34a86e1..0000000
--- a/ssaopt/esc.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2014 The llgo Authors.
-// Use of this source code is governed by an MIT-style
-// license that can be found in the LICENSE file.
-
-package ssaopt
-
-import (
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-)
-
-func escapes(val ssa.Value, bb *ssa.BasicBlock, pending []ssa.Value) bool {
-	for _, p := range pending {
-		if val == p {
-			return false
-		}
-	}
-
-	for _, ref := range *val.Referrers() {
-		switch ref := ref.(type) {
-		case *ssa.Phi:
-			// We must consider the variable to have escaped if it is
-			// possible for the program to see more than one "version"
-			// of the variable at once, as this requires the program
-			// to use heap allocation for the multiple versions.
-			//
-			// I (pcc) think that this is only possible (without stores)
-			// in the case where a phi node that (directly or indirectly)
-			// refers to the allocation dominates the allocation.
-			if ref.Block().Dominates(bb) {
-				return true
-			}
-			if escapes(ref, bb, append(pending, val)) {
-				return true
-			}
-
-		case *ssa.BinOp, *ssa.ChangeType, *ssa.Convert, *ssa.ChangeInterface, *ssa.MakeInterface, *ssa.Slice, *ssa.FieldAddr, *ssa.IndexAddr, *ssa.TypeAssert, *ssa.Extract:
-			if escapes(ref.(ssa.Value), bb, append(pending, val)) {
-				return true
-			}
-
-		case *ssa.Range, *ssa.DebugRef:
-			continue
-
-		case *ssa.UnOp:
-			if ref.Op == token.MUL || ref.Op == token.ARROW {
-				continue
-			}
-			if escapes(ref, bb, append(pending, val)) {
-				return true
-			}
-
-		case *ssa.Store:
-			if val == ref.Val {
-				return true
-			}
-
-		case *ssa.Call:
-			if builtin, ok := ref.Call.Value.(*ssa.Builtin); ok {
-				switch builtin.Name() {
-				case "cap", "len", "copy", "ssa:wrapnilchk":
-					continue
-				case "append":
-					if ref.Call.Args[0] == val && escapes(ref, bb, append(pending, val)) {
-						return true
-					}
-				default:
-					return true
-				}
-			} else {
-				return true
-			}
-
-		default:
-			return true
-		}
-	}
-
-	return false
-}
-
-func LowerAllocsToStack(f *ssa.Function) {
-	pending := make([]ssa.Value, 0, 10)
-
-	for _, b := range f.Blocks {
-		for _, instr := range b.Instrs {
-			if alloc, ok := instr.(*ssa.Alloc); ok && alloc.Heap && !escapes(alloc, alloc.Block(), pending) {
-				alloc.Heap = false
-				f.Locals = append(f.Locals, alloc)
-			}
-		}
-	}
-}
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
deleted file mode 100644
index c8a346f..0000000
--- a/test/CMakeLists.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-configure_lit_site_cfg(
-  ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in
-  ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
-  )
-
-add_lit_testsuite(check-llgo "Running the llgo regression tests"
-  ${CMAKE_CURRENT_BINARY_DIR}
-  DEPENDS
-    FileCheck
-    count
-    llgo
-    llgoi
-    libgo
-    not
-  )
-set_target_properties(check-llgo PROPERTIES FOLDER "Tests")
diff --git a/test/debuginfo/emptyname.go b/test/debuginfo/emptyname.go
deleted file mode 100644
index 28ad10d..0000000
--- a/test/debuginfo/emptyname.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// RUN: llgo -c -o /dev/null -g %s
-
-package main
-
-//line :1
-func main() {
-}
diff --git a/test/driver/parse-arguments.go b/test/driver/parse-arguments.go
deleted file mode 100644
index 36b3c5c..0000000
--- a/test/driver/parse-arguments.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// RUN: not llgo -B 2>&1 | FileCheck --check-prefix=B %s
-// RUN: not llgo -D 2>&1 | FileCheck --check-prefix=D %s
-// RUN: not llgo -I 2>&1 | FileCheck --check-prefix=I %s
-// RUN: not llgo -isystem 2>&1 | FileCheck --check-prefix=isystem %s
-// RUN: not llgo -L 2>&1 | FileCheck --check-prefix=L %s
-// RUN: not llgo -fload-plugin 2>&1 | FileCheck --check-prefix=fload-plugin %s
-// RUN: not llgo -mllvm 2>&1 | FileCheck --check-prefix=mllvm %s
-// RUN: not llgo -o 2>&1 | FileCheck --check-prefix=o %s
-
-// B: missing argument after '-B'
-// D: missing argument after '-D'
-// I: missing argument after '-I'
-// isystem: missing argument after '-isystem'
-// L: missing argument after '-L'
-// fload-plugin: missing argument after '-fload-plugin'
-// mllvm: missing argument after '-mllvm'
-// o: missing argument after '-o'
diff --git a/test/execution/Inputs/init2.go b/test/execution/Inputs/init2.go
deleted file mode 100644
index 041d764..0000000
--- a/test/execution/Inputs/init2.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package main
-
-func init() {
-	println("do some other stuff before main")
-}
diff --git a/test/execution/arrays/compare.go b/test/execution/arrays/compare.go
deleted file mode 100644
index b99d4fd..0000000
--- a/test/execution/arrays/compare.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: false
-// CHECK-NEXT: true
-// CHECK-NEXT: false
-
-package main
-
-func main() {
-	a := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
-	b := [...]int{10, 1, 2, 3, 4, 5, 6, 7, 8, 9}
-	c := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
-
-	println(a == b)
-	println(a == c)
-	println(b == c)
-}
diff --git a/test/execution/arrays/index.go b/test/execution/arrays/index.go
deleted file mode 100644
index 78c5315..0000000
--- a/test/execution/arrays/index.go
+++ /dev/null
@@ -1,288 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 3
-// CHECK-NEXT: 4
-// CHECK-NEXT: 5
-// CHECK-NEXT: 6
-// CHECK-NEXT: 7
-// CHECK-NEXT: 8
-// CHECK-NEXT: 9
-// CHECK-NEXT: 10
-// CHECK-NEXT: 11
-// CHECK-NEXT: 12
-// CHECK-NEXT: 13
-// CHECK-NEXT: 14
-// CHECK-NEXT: 15
-// CHECK-NEXT: 16
-// CHECK-NEXT: 17
-// CHECK-NEXT: 18
-// CHECK-NEXT: 19
-// CHECK-NEXT: 20
-// CHECK-NEXT: 21
-// CHECK-NEXT: 22
-// CHECK-NEXT: 23
-// CHECK-NEXT: 24
-// CHECK-NEXT: 25
-// CHECK-NEXT: 26
-// CHECK-NEXT: 27
-// CHECK-NEXT: 28
-// CHECK-NEXT: 29
-// CHECK-NEXT: 30
-// CHECK-NEXT: 31
-// CHECK-NEXT: 32
-// CHECK-NEXT: 33
-// CHECK-NEXT: 34
-// CHECK-NEXT: 35
-// CHECK-NEXT: 36
-// CHECK-NEXT: 37
-// CHECK-NEXT: 38
-// CHECK-NEXT: 39
-// CHECK-NEXT: 40
-// CHECK-NEXT: 41
-// CHECK-NEXT: 42
-// CHECK-NEXT: 43
-// CHECK-NEXT: 44
-// CHECK-NEXT: 45
-// CHECK-NEXT: 46
-// CHECK-NEXT: 47
-// CHECK-NEXT: 48
-// CHECK-NEXT: 49
-// CHECK-NEXT: 50
-// CHECK-NEXT: 51
-// CHECK-NEXT: 52
-// CHECK-NEXT: 53
-// CHECK-NEXT: 54
-// CHECK-NEXT: 55
-// CHECK-NEXT: 56
-// CHECK-NEXT: 57
-// CHECK-NEXT: 58
-// CHECK-NEXT: 59
-// CHECK-NEXT: 60
-// CHECK-NEXT: 61
-// CHECK-NEXT: 62
-// CHECK-NEXT: 63
-// CHECK-NEXT: 64
-// CHECK-NEXT: 65
-// CHECK-NEXT: 66
-// CHECK-NEXT: 67
-// CHECK-NEXT: 68
-// CHECK-NEXT: 69
-// CHECK-NEXT: 70
-// CHECK-NEXT: 71
-// CHECK-NEXT: 72
-// CHECK-NEXT: 73
-// CHECK-NEXT: 74
-// CHECK-NEXT: 75
-// CHECK-NEXT: 76
-// CHECK-NEXT: 77
-// CHECK-NEXT: 78
-// CHECK-NEXT: 79
-// CHECK-NEXT: 80
-// CHECK-NEXT: 81
-// CHECK-NEXT: 82
-// CHECK-NEXT: 83
-// CHECK-NEXT: 84
-// CHECK-NEXT: 85
-// CHECK-NEXT: 86
-// CHECK-NEXT: 87
-// CHECK-NEXT: 88
-// CHECK-NEXT: 89
-// CHECK-NEXT: 90
-// CHECK-NEXT: 91
-// CHECK-NEXT: 92
-// CHECK-NEXT: 93
-// CHECK-NEXT: 94
-// CHECK-NEXT: 95
-// CHECK-NEXT: 96
-// CHECK-NEXT: 97
-// CHECK-NEXT: 98
-// CHECK-NEXT: 99
-// CHECK-NEXT: 100
-// CHECK-NEXT: 101
-// CHECK-NEXT: 102
-// CHECK-NEXT: 103
-// CHECK-NEXT: 104
-// CHECK-NEXT: 105
-// CHECK-NEXT: 106
-// CHECK-NEXT: 107
-// CHECK-NEXT: 108
-// CHECK-NEXT: 109
-// CHECK-NEXT: 110
-// CHECK-NEXT: 111
-// CHECK-NEXT: 112
-// CHECK-NEXT: 113
-// CHECK-NEXT: 114
-// CHECK-NEXT: 115
-// CHECK-NEXT: 116
-// CHECK-NEXT: 117
-// CHECK-NEXT: 118
-// CHECK-NEXT: 119
-// CHECK-NEXT: 120
-// CHECK-NEXT: 121
-// CHECK-NEXT: 122
-// CHECK-NEXT: 123
-// CHECK-NEXT: 124
-// CHECK-NEXT: 125
-// CHECK-NEXT: 126
-// CHECK-NEXT: 127
-// CHECK-NEXT: 128
-// CHECK-NEXT: 129
-// CHECK-NEXT: 130
-// CHECK-NEXT: 131
-// CHECK-NEXT: 132
-// CHECK-NEXT: 133
-// CHECK-NEXT: 134
-// CHECK-NEXT: 135
-// CHECK-NEXT: 136
-// CHECK-NEXT: 137
-// CHECK-NEXT: 138
-// CHECK-NEXT: 139
-// CHECK-NEXT: 140
-// CHECK-NEXT: 141
-// CHECK-NEXT: 142
-// CHECK-NEXT: 143
-// CHECK-NEXT: 144
-// CHECK-NEXT: 145
-// CHECK-NEXT: 146
-// CHECK-NEXT: 147
-// CHECK-NEXT: 148
-// CHECK-NEXT: 149
-// CHECK-NEXT: 150
-// CHECK-NEXT: 151
-// CHECK-NEXT: 152
-// CHECK-NEXT: 153
-// CHECK-NEXT: 154
-// CHECK-NEXT: 155
-// CHECK-NEXT: 156
-// CHECK-NEXT: 157
-// CHECK-NEXT: 158
-// CHECK-NEXT: 159
-// CHECK-NEXT: 160
-// CHECK-NEXT: 161
-// CHECK-NEXT: 162
-// CHECK-NEXT: 163
-// CHECK-NEXT: 164
-// CHECK-NEXT: 165
-// CHECK-NEXT: 166
-// CHECK-NEXT: 167
-// CHECK-NEXT: 168
-// CHECK-NEXT: 169
-// CHECK-NEXT: 170
-// CHECK-NEXT: 171
-// CHECK-NEXT: 172
-// CHECK-NEXT: 173
-// CHECK-NEXT: 174
-// CHECK-NEXT: 175
-// CHECK-NEXT: 176
-// CHECK-NEXT: 177
-// CHECK-NEXT: 178
-// CHECK-NEXT: 179
-// CHECK-NEXT: 180
-// CHECK-NEXT: 181
-// CHECK-NEXT: 182
-// CHECK-NEXT: 183
-// CHECK-NEXT: 184
-// CHECK-NEXT: 185
-// CHECK-NEXT: 186
-// CHECK-NEXT: 187
-// CHECK-NEXT: 188
-// CHECK-NEXT: 189
-// CHECK-NEXT: 190
-// CHECK-NEXT: 191
-// CHECK-NEXT: 192
-// CHECK-NEXT: 193
-// CHECK-NEXT: 194
-// CHECK-NEXT: 195
-// CHECK-NEXT: 196
-// CHECK-NEXT: 197
-// CHECK-NEXT: 198
-// CHECK-NEXT: 199
-// CHECK-NEXT: 200
-// CHECK-NEXT: 201
-// CHECK-NEXT: 202
-// CHECK-NEXT: 203
-// CHECK-NEXT: 204
-// CHECK-NEXT: 205
-// CHECK-NEXT: 206
-// CHECK-NEXT: 207
-// CHECK-NEXT: 208
-// CHECK-NEXT: 209
-// CHECK-NEXT: 210
-// CHECK-NEXT: 211
-// CHECK-NEXT: 212
-// CHECK-NEXT: 213
-// CHECK-NEXT: 214
-// CHECK-NEXT: 215
-// CHECK-NEXT: 216
-// CHECK-NEXT: 217
-// CHECK-NEXT: 218
-// CHECK-NEXT: 219
-// CHECK-NEXT: 220
-// CHECK-NEXT: 221
-// CHECK-NEXT: 222
-// CHECK-NEXT: 223
-// CHECK-NEXT: 224
-// CHECK-NEXT: 225
-// CHECK-NEXT: 226
-// CHECK-NEXT: 227
-// CHECK-NEXT: 228
-// CHECK-NEXT: 229
-// CHECK-NEXT: 230
-// CHECK-NEXT: 231
-// CHECK-NEXT: 232
-// CHECK-NEXT: 233
-// CHECK-NEXT: 234
-// CHECK-NEXT: 235
-// CHECK-NEXT: 236
-// CHECK-NEXT: 237
-// CHECK-NEXT: 238
-// CHECK-NEXT: 239
-// CHECK-NEXT: 240
-// CHECK-NEXT: 241
-// CHECK-NEXT: 242
-// CHECK-NEXT: 243
-// CHECK-NEXT: 244
-// CHECK-NEXT: 245
-// CHECK-NEXT: 246
-// CHECK-NEXT: 247
-// CHECK-NEXT: 248
-// CHECK-NEXT: 249
-// CHECK-NEXT: 250
-// CHECK-NEXT: 251
-// CHECK-NEXT: 252
-// CHECK-NEXT: 253
-// CHECK-NEXT: 254
-
-package main
-
-func testBasics() {
-	var i [2]int
-	j := &i
-	i[0] = 123
-	i[1] = 456
-	println(i[0], i[1])
-	println(j[0], j[1])
-	i[0]++
-	i[1]--
-	println(i[0], i[1])
-	println(j[0], j[1])
-}
-
-func testByteIndex() {
-	var a [255]int
-	for i := 0; i < len(a); i++ {
-		a[i] = i
-	}
-	for i := byte(0); i < byte(len(a)); i++ {
-		println(a[i])
-	}
-}
-
-func main() {
-	//testBasics()
-	testByteIndex()
-}
diff --git a/test/execution/arrays/range.go b/test/execution/arrays/range.go
deleted file mode 100644
index 37d22f6..0000000
--- a/test/execution/arrays/range.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0 0 0
-// CHECK-NEXT: 1 1 1
-// CHECK-NEXT: 2 2 2
-// CHECK-NEXT: 3 0 0
-// CHECK-NEXT: 4 4 4
-// CHECK-NEXT: 0 10
-// CHECK-NEXT: 1 20
-// CHECK-NEXT: 2 30
-
-package main
-
-func main() {
-	a := [...]int{1: 1, 2: 2, 4: 4}
-	for i, val := range a {
-		println(i, val, a[i])
-	}
-	for i, val := range [...]int{10, 20, 30} {
-		println(i, val)
-	}
-}
diff --git a/test/execution/arrays/slice.go b/test/execution/arrays/slice.go
deleted file mode 100644
index e288090..0000000
--- a/test/execution/arrays/slice.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 10
-// CHECK-NEXT: 9
-
-package main
-
-func main() {
-	var a [10]int
-	b := a[1:]
-	println(len(a))
-	println(len(b))
-}
diff --git a/test/execution/assignment/arrays.go b/test/execution/assignment/arrays.go
deleted file mode 100644
index 30921a4..0000000
--- a/test/execution/assignment/arrays.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: +1.000000e+000
-// CHECK-NEXT: +2.000000e+000
-// CHECK-NEXT: +3.000000e+000
-
-package main
-
-var a1 = [...]float32{1.0, 2.0, 3.0}
-
-func main() {
-	var a2 [3]float32
-	a2 = a1
-	println(a2[0])
-	println(a2[1])
-	println(a2[2])
-
-	// broken due to lack of promotion of
-	// stack to heap.
-	//println(a2[0], a2[1], a2[2])
-}
diff --git a/test/execution/assignment/binop.go b/test/execution/assignment/binop.go
deleted file mode 100644
index 51793ff..0000000
--- a/test/execution/assignment/binop.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 246
-// CHECK-NEXT: 123
-// CHECK-NEXT: 124
-// CHECK-NEXT: 123
-
-package main
-
-func main() {
-	x := 123
-	x *= 2
-	println(x)
-	x /= 2
-	println(x)
-	x += 1
-	println(x)
-	x -= 1
-	println(x)
-}
diff --git a/test/execution/assignment/dereferencing.go b/test/execution/assignment/dereferencing.go
deleted file mode 100644
index 607e28d..0000000
--- a/test/execution/assignment/dereferencing.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 123
-
-package main
-
-func main() {
-	var x int
-	px := &x
-	*px = 123
-	println(x)
-}
diff --git a/test/execution/assignment/multi.go b/test/execution/assignment/multi.go
deleted file mode 100644
index 60b8805..0000000
--- a/test/execution/assignment/multi.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 123 456
-// CHECK-NEXT: 456 123
-// CHECK-NEXT: 456 123
-// CHECK-NEXT: 123 456
-// CHECK-NEXT: 123 456
-
-package main
-
-func xyz() (int, int) {
-	return 123, 456
-}
-
-func abc() (int, int) {
-	var a, b = xyz()
-	return a, b
-}
-
-type S struct {
-	a int
-	b int
-}
-
-func main() {
-	a, b := xyz()
-	println(a, b)
-	b, a = abc()
-	println(a, b)
-
-	// swap
-	println(a, b)
-	a, b = b, a
-	println(a, b)
-
-	var s S
-	s.a, s.b = a, b
-	println(s.a, s.b)
-}
diff --git a/test/execution/assignment/namedresult.go b/test/execution/assignment/namedresult.go
deleted file mode 100644
index daf9b00..0000000
--- a/test/execution/assignment/namedresult.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 123
-// CHECK-NEXT: 456
-// CHECK-NEXT: 1 2
-// CHECK-NEXT: 666 0
-
-package main
-
-func f1() (x int) {
-	x = 123
-	return
-}
-
-func f2() (x int) {
-	return 456
-}
-
-func f3() (x, y int) {
-	y, x = 2, 1
-	return
-}
-
-func f4() (x, _ int) {
-	x = 666
-	return
-}
-
-func main() {
-	x := f1()
-	println(x)
-	x = f2()
-	println(x)
-
-	var y int
-	x, y = f3()
-	println(x, y)
-
-	x, y = f4()
-	println(x, y)
-}
diff --git a/test/execution/branching/goto.go b/test/execution/branching/goto.go
deleted file mode 100644
index 748c666..0000000
--- a/test/execution/branching/goto.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 3
-// CHECK-NEXT: 4
-// CHECK-NEXT: 5
-// CHECK-NEXT: 6
-// CHECK-NEXT: 7
-// CHECK-NEXT: 8
-// CHECK-NEXT: 9
-// CHECK-NEXT: done
-// CHECK-NEXT: !
-
-package main
-
-func f1() {
-	goto labeled
-labeled:
-	goto done
-	return
-done:
-	println("!")
-}
-
-func main() {
-	i := 0
-start:
-	if i < 10 {
-		println(i)
-		i++
-		goto start
-	} else {
-		goto end
-	}
-	return
-end:
-	println("done")
-	f1()
-	return
-}
diff --git a/test/execution/branching/labeled.go b/test/execution/branching/labeled.go
deleted file mode 100644
index efff5ef..0000000
--- a/test/execution/branching/labeled.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0
-
-package main
-
-func labeledBreak() {
-	var i int
-L:
-	for ; i < 10; i++ {
-		switch {
-		default:
-			break L
-		}
-	}
-	println(i)
-}
-
-func main() {
-	labeledBreak()
-}
diff --git a/test/execution/chan/buffered.go b/test/execution/chan/buffered.go
deleted file mode 100644
index 9247ce3..0000000
--- a/test/execution/chan/buffered.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0 0
-// CHECK-NEXT: 0 1
-// CHECK-NEXT: 10
-// CHECK-NEXT: 20
-// CHECK-NEXT: 30
-// CHECK-NEXT: 40
-// CHECK-NEXT: 50
-// CHECK-NEXT: 60
-// CHECK-NEXT: 70
-// CHECK-NEXT: 80
-// CHECK-NEXT: 90
-// CHECK-NEXT: 100
-// CHECK-NEXT: -1
-
-package main
-
-func main() {
-	c := make(chan int)
-	println(len(c), cap(c))
-	c1 := make(chan int, 1)
-	println(len(c1), cap(c1))
-	f := func() {
-		n, ok := <-c
-		if ok {
-			c1 <- n * 10
-		} else {
-			c1 <- -1
-		}
-	}
-	for i := 0; i < 10; i++ {
-		go f()
-		c <- i + 1
-		println(<-c1)
-	}
-	go f()
-	close(c)
-	println(<-c1)
-}
diff --git a/test/execution/chan/range.go b/test/execution/chan/range.go
deleted file mode 100644
index eeaedb7..0000000
--- a/test/execution/chan/range.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 3
-// CHECK-NEXT: 4
-// CHECK-NEXT: 5
-// CHECK-NEXT: 6
-// CHECK-NEXT: 7
-// CHECK-NEXT: 8
-// CHECK-NEXT: 9
-
-package main
-
-func main() {
-	ch := make(chan int)
-	go func() {
-		for i := 0; i < 10; i++ {
-			ch <- i
-		}
-		close(ch)
-	}()
-	for n := range ch {
-		println(n)
-	}
-}
diff --git a/test/execution/chan/select.go b/test/execution/chan/select.go
deleted file mode 100644
index 80872f5..0000000
--- a/test/execution/chan/select.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: sent a value
-// CHECK-NEXT: received 123
-// CHECK-NEXT: default
-
-package main
-
-func f1() {
-	c := make(chan int, 1)
-	for i := 0; i < 3; i++ {
-		select {
-		case n, _ := <-c:
-			println("received", n)
-			c = nil
-		case c <- 123:
-			println("sent a value")
-		default:
-			println("default")
-		}
-	}
-}
-
-func main() {
-	f1()
-}
diff --git a/test/execution/chan/self.go b/test/execution/chan/self.go
deleted file mode 100644
index d26ee4a..0000000
--- a/test/execution/chan/self.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: true
-
-package main
-
-func main() {
-	ch := make(chan int, uint8(1))
-
-	ch <- 1
-	println(<-ch)
-
-	ch <- 2
-	x, ok := <-ch
-	println(x)
-	println(ok)
-}
diff --git a/test/execution/circulartype.go b/test/execution/circulartype.go
deleted file mode 100644
index 01e9ce4..0000000
--- a/test/execution/circulartype.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | count 0
-
-package main
-
-type A struct {
-	b1, b2 B
-}
-
-type B struct {
-	a1, a2 *A
-}
-
-func main() {
-	var a A
-	_ = a
-}
diff --git a/test/execution/closures/basic.go b/test/execution/closures/basic.go
deleted file mode 100644
index 2a84fc1..0000000
--- a/test/execution/closures/basic.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: abc
-
-package main
-
-func cat(a, b string) func(string) string {
-	return func(c string) string { return a + b + c }
-}
-
-func main() {
-	f := cat("a", "b")
-	println(f("c"))
-}
diff --git a/test/execution/closures/issue176.go b/test/execution/closures/issue176.go
deleted file mode 100644
index 4a505ca..0000000
--- a/test/execution/closures/issue176.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: false
-
-package main
-
-func main() {
-	a := false
-	f := func() {
-		make(chan *bool, 1) <- &a
-	}
-	f()
-	println(a)
-}
diff --git a/test/execution/complex.go b/test/execution/complex.go
deleted file mode 100644
index ad2a87b..0000000
--- a/test/execution/complex.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: (+1.000000e+000+2.000000e+000i)
-// CHECK-NEXT: (-1.000000e+000-2.000000e+000i)
-// CHECK-NEXT: true
-// CHECK-NEXT: (+1.000000e+000+2.000000e+000i)
-// CHECK-NEXT: (-1.000000e+000-2.000000e+000i)
-// CHECK-NEXT: true
-
-package main
-
-func main() {
-	var f32 float32 = 1
-	var f64 float64 = 1
-	c64 := complex(f32, f32+1)
-	println(c64)
-	println(-c64)
-	println(c64 == c64)
-	c128 := complex(f64, f64+1)
-	println(c128)
-	println(-c128)
-	println(c128 == c128)
-}
diff --git a/test/execution/const.go b/test/execution/const.go
deleted file mode 100644
index 45dbb0f..0000000
--- a/test/execution/const.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0
-// CHECK-NEXT: 1
-// CHECK-NEXT: 1 1
-// CHECK-NEXT: 1 1 1 4
-// CHECK-NEXT: 2147483647
-// CHECK-NEXT: -2147483648
-// CHECK-NEXT: 2147483647
-// CHECK-NEXT: -127
-// CHECK-NEXT: false
-// CHECK-NEXT: 10000000000
-// CHECK-NEXT: 1
-// CHECK-NEXT: 3
-
-package main
-
-import "runtime"
-
-const (
-	a = iota * 2
-	A = 1
-	B
-	C
-	D = Z + iota
-)
-
-const (
-	Z    = iota
-	Big  = 1<<31 - 1
-	Big2 = -2147483648
-	Big3 = 2147483647
-)
-
-const (
-	expbits32   uint = 8
-	bias32           = -1<<(expbits32-1) + 1
-	darwinAMD64      = runtime.GOOS == "darwin" && runtime.GOARCH == "amd64"
-)
-
-func f1() float32 {
-	return 0
-}
-
-func constArrayLen() {
-	a := [...]int{1, 2, 3}
-	const x = len(a)
-	println(x)
-}
-
-func main() {
-	println(a)
-	println(B)
-	println(A, A)
-	println(A, B, C, D)
-	println(Big)
-	println(Big2)
-	println(Big3)
-	println(bias32)
-
-	// Currently fails, due to difference in C printf and Go's println
-	// formatting of the exponent.
-	//println(10 * 1e9)
-	println(darwinAMD64)
-
-	// Test conversion.
-	println(int64(10) * 1e9)
-
-	// Ensure consts work just as well when declared inside a function.
-	const (
-		x_ = iota
-		y_
-	)
-	println(y_)
-
-	constArrayLen()
-}
diff --git a/test/execution/conversions/complex.go b/test/execution/conversions/complex.go
deleted file mode 100644
index 91dd366..0000000
--- a/test/execution/conversions/complex.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | count 0
-
-package main
-
-func constIntToComplex() complex128 {
-	return 0
-}
-
-func main() {
-	var c64 complex64
-	var c128 complex128
-	c128 = complex128(c64)
-	c64 = complex64(c128)
-}
diff --git a/test/execution/conversions/float.go b/test/execution/conversions/float.go
deleted file mode 100644
index def11d1..0000000
--- a/test/execution/conversions/float.go
+++ /dev/null
@@ -1,103 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: -123
-// CHECK-NEXT: -123
-// CHECK-NEXT: -123
-// CHECK-NEXT: -123
-// CHECK-NEXT: 133
-// CHECK-NEXT: 65413
-// CHECK-NEXT: 4294967173
-// CHECK-NEXT: 18446744073709551493
-// CHECK-NEXT: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: 123
-// CHECK-NEXT: -123
-// CHECK-NEXT: -123
-// CHECK-NEXT: -123
-// CHECK-NEXT: -123
-// CHECK-NEXT: 133
-// CHECK-NEXT: 65413
-// CHECK-NEXT: 4294967173
-// CHECK-NEXT: 18446744073709551493
-// CHECK-NEXT: +1.230000e+002
-// CHECK-NEXT: +1.230000e+002
-// CHECK-NEXT: +1.230000e+002
-// CHECK-NEXT: +1.230000e+002
-// CHECK-NEXT: +1.234500e+004
-// CHECK-NEXT: +1.234500e+004
-// CHECK-NEXT: +1.234500e+004
-// CHECK-NEXT: +1.234500e+004
-// CHECK-NEXT: +1.234560e+005
-// CHECK-NEXT: +1.234560e+005
-// CHECK-NEXT: +1.234560e+005
-// CHECK-NEXT: +1.234560e+005
-// CHECK-NEXT: +1.234568e+010
-// CHECK-NEXT: +1.234568e+010
-// CHECK-NEXT: +1.234568e+010
-// CHECK-NEXT: +1.234568e+010
-
-package main
-
-func main() {
-	// float to int
-	for _, f32 := range []float32{123.456, -123.456} {
-		println(int8(f32))
-		println(int16(f32))
-		println(int32(f32))
-		println(int64(f32))
-		println(uint8(f32))
-		println(uint16(f32))
-		println(uint32(f32))
-		println(uint64(f32))
-	}
-	for _, f64 := range []float64{123.456, -123.456} {
-		println(int8(f64))
-		println(int16(f64))
-		println(int32(f64))
-		println(int64(f64))
-		println(uint8(f64))
-		println(uint16(f64))
-		println(uint32(f64))
-		println(uint64(f64))
-	}
-
-	// int to float
-	var i8 int8 = 123
-	println(float32(i8))
-	println(float64(i8))
-	var ui8 uint8 = 123
-	println(float32(ui8))
-	println(float64(ui8))
-	var i16 int32 = 12345
-	println(float32(i16))
-	println(float64(i16))
-	var ui16 uint32 = 12345
-	println(float32(ui16))
-	println(float64(ui16))
-	var i32 int32 = 123456
-	println(float32(i32))
-	println(float64(i32))
-	var ui32 uint32 = 123456
-	println(float32(ui32))
-	println(float64(ui32))
-	var i64 int64 = 12345678910
-	println(float32(i64))
-	println(float64(i64))
-	var ui64 uint64 = 12345678910
-	println(float32(ui64))
-	println(float64(ui64))
-}
diff --git a/test/execution/conversions/int.go b/test/execution/conversions/int.go
deleted file mode 100644
index 092003b..0000000
--- a/test/execution/conversions/int.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 2147483647
-// CHECK-NEXT: 2147483647
-// CHECK-NEXT: 2147483647
-// CHECK-NEXT: 2147483648
-// CHECK-NEXT: -2147483648
-// CHECK-NEXT: 18446744071562067968
-// CHECK-NEXT: 0
-// CHECK-NEXT: 0
-// CHECK-NEXT: 0
-// CHECK-NEXT: -1
-// CHECK-NEXT: 4294967295
-// CHECK-NEXT: 4294967295
-// CHECK-NEXT: 0
-// CHECK-NEXT: 0
-// CHECK-NEXT: 0
-// CHECK-NEXT: 1
-// CHECK-NEXT: 1
-// CHECK-NEXT: 1
-
-package main
-
-func signed(i32 int32) {
-	println(uint32(i32))
-	println(int64(i32))
-	println(uint64(i32))
-}
-
-func unsigned(u32 uint32) {
-	println(int32(u32))
-	println(int64(u32))
-	println(uint64(u32))
-}
-
-func main() {
-	signed(1<<31 - 1)
-	signed(-1 << 31)
-	signed(0)
-	unsigned(1<<32 - 1)
-	unsigned(0)
-	unsigned(1)
-}
diff --git a/test/execution/conversions/sameunderlying.go b/test/execution/conversions/sameunderlying.go
deleted file mode 100644
index 8208cfb..0000000
--- a/test/execution/conversions/sameunderlying.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | count 0
-
-package main
-
-type X struct{}
-type Y X
-
-func main() {
-	var x X
-	px := &x
-	py := (*Y)(&x)
-	py = (*Y)(px)
-	_ = py
-}
diff --git a/test/execution/defer.go b/test/execution/defer.go
deleted file mode 100644
index ba1b632..0000000
--- a/test/execution/defer.go
+++ /dev/null
@@ -1,125 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: f2.1
-// CHECK-NEXT: f5
-// CHECK-NEXT: recovered no error
-// CHECK-NEXT: f5
-// CHECK-NEXT: recovered: meep meep
-// CHECK-NEXT: 888
-// CHECK-NEXT: f5
-// CHECK-NEXT: recovered no error
-// CHECK-NEXT: f5
-// CHECK-NEXT: recovered no error
-// CHECK-NEXT: 888
-// CHECK-NEXT: 456
-// CHECK-NEXT: 999
-// CHECK-NEXT: 999
-// CHECK-NEXT: 123
-// CHECK-NEXT: 999
-// CHECK-NEXT: 999
-// CHECK-NEXT: 246
-// CHECK-NEXT: f2.2
-// CHECK-NEXT: f2.3
-// CHECK-NEXT: f1.1
-// CHECK-NEXT: f1.2
-// CHECK-NEXT: recovered: second
-// CHECK-NEXT: ahoy
-
-package main
-
-type T struct {
-	value int
-}
-
-type T1 struct {
-	T
-}
-
-func (t T) abc() {
-	println(t.value)
-}
-
-func (t *T) def() {
-	println(t.value)
-}
-
-func (t *T) ghi(v int) {
-	println(v)
-}
-
-func printerr(err interface{}) {
-	if err != nil {
-		println("recovered:", err.(string))
-	} else {
-		println("recovered no error")
-	}
-}
-
-func f6() {
-	defer func() { printerr(recover()) }()
-	defer func() { panic("second") }()
-	panic("first")
-}
-
-func f5(panic_ bool) {
-	var t1 T1
-	t1.T.value = 888
-	defer t1.abc()
-	var f func(int)
-	f = func(recursion int) {
-		if recursion > 0 {
-			f(recursion - 1)
-			return
-		}
-		println("f5")
-		printerr(recover())
-	}
-	defer f(0) // will recover (after f(1))
-	defer f(1) // won't recover
-	if panic_ {
-		panic("meep meep")
-	}
-}
-
-func f4() {
-	var a T = T{999}
-	var b *T = &a
-	defer a.abc()
-	defer a.def()
-	defer a.ghi(123)
-	defer b.abc()
-	defer b.def()
-	defer b.ghi(456)
-	f5(true)
-	f5(false) // verify the recover in f5 works
-}
-
-func f3() (a int) {
-	defer func() { a *= 2 }()
-	f4()
-	return 123
-}
-
-func f2() {
-	defer func() { println("f2.3") }()
-	defer func(s string) { println(s) }("f2.2")
-	println("f2.1")
-	println(f3())
-}
-
-func f1() {
-	defer func() { println("f1.2") }()
-	defer func() { println("f1.1") }()
-	f2()
-}
-
-func builtins() {
-	defer println("ahoy")
-}
-
-func main() {
-	f1()
-	f6()
-	builtins()
-}
diff --git a/test/execution/errors/recover.go b/test/execution/errors/recover.go
deleted file mode 100644
index 70ee2ac..0000000
--- a/test/execution/errors/recover.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: (0x0,0x0)
-
-package main
-
-func main() {
-	err := recover()
-	println(err)
-}
diff --git a/test/execution/for/branch.go b/test/execution/for/branch.go
deleted file mode 100644
index 5484c89..0000000
--- a/test/execution/for/branch.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 3
-// CHECK-NEXT: 0
-// CHECK-NEXT: 2
-// CHECK-NEXT: 3
-// CHECK-NEXT: 4
-
-package main
-
-func main() {
-	for i := 0; true; i++ {
-		println(i)
-		if i == 2 {
-			println(3)
-			break
-		}
-		println(1)
-		i++
-		continue
-		println("unreachable")
-	}
-
-	nums := [...]int{0, 1, 2, 3, 4, 5}
-	for n := range nums {
-		if n == 1 {
-			continue
-		}
-		println(n)
-		if n == 4 {
-			{
-				break
-			}
-			println("!")
-		}
-	}
-}
diff --git a/test/execution/fun.go b/test/execution/fun.go
deleted file mode 100644
index c70fe69..0000000
--- a/test/execution/fun.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 246
-// CHECK-NEXT: 123 true false
-
-// vim: set ft=go :
-
-package main
-
-func test() func() int {
-	return blah
-}
-
-func blah() int {
-	return 123
-}
-
-func sret() (int, bool, bool) {
-	return 123, true, false
-}
-
-func main() {
-	f := test()
-	println(2 * f())
-	a, b, c := sret()
-	println(a, b, c)
-}
diff --git a/test/execution/functions/compare.go b/test/execution/functions/compare.go
deleted file mode 100644
index 9daa062..0000000
--- a/test/execution/functions/compare.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: true
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-// CHECK-NEXT: false
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-
-package main
-
-func main() {
-	var f func()
-	println(f == nil)
-	println(f != nil)
-	println(nil == f)
-	println(nil != f)
-	f = func() {}
-	println(f == nil)
-	println(f != nil)
-	println(nil == f)
-	println(nil != f)
-}
diff --git a/test/execution/functions/multivalue.go b/test/execution/functions/multivalue.go
deleted file mode 100644
index a3ce79b..0000000
--- a/test/execution/functions/multivalue.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 1
-// CHECK-NEXT: 20
-// CHECK-NEXT: extra: 10
-
-package main
-
-func swap(a, b int) (int, int) {
-	return b, a
-}
-
-func sub(a, b int) int {
-	return a - b
-}
-
-func printint(a int, extra ...int) {
-	println(a)
-	for _, b := range extra {
-		println("extra:", b)
-	}
-}
-
-func main() {
-	println(sub(swap(1, 2)))
-	printint(swap(10, 20))
-}
diff --git a/test/execution/functions/unreachable.go b/test/execution/functions/unreachable.go
deleted file mode 100644
index 436012c..0000000
--- a/test/execution/functions/unreachable.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: f1
-// CHECK-NEXT: f2
-// CHECK-NEXT: f3
-// CHECK-NEXT: f4
-// CHECK-NEXT: 123
-
-package main
-
-func f1() {
-	if true {
-		println("f1")
-		return
-	}
-	for {
-	}
-}
-
-func f2() {
-	defer func() { println("f2") }()
-	if true {
-		return
-	}
-	for {
-	}
-}
-
-func f3() int {
-	if true {
-		println("f3")
-		return 123
-	}
-	for {
-	}
-}
-
-func f4() int {
-	defer func() { println("f4") }()
-	if true {
-		return 123
-	}
-	for {
-	}
-}
-
-func main() {
-	f1()
-	f2()
-	f3()
-	println(f4())
-}
diff --git a/test/execution/go.go b/test/execution/go.go
deleted file mode 100644
index 2bfe775..0000000
--- a/test/execution/go.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: hello from T 1
-// CHECK-NEXT: hello from T 2
-
-package main
-
-type T struct {
-	val int
-}
-
-func (t T) Hello(done chan bool) {
-	println("hello from T", t.val)
-	done <- true
-}
-
-type I interface {
-	Hello(chan bool)
-}
-
-func main() {
-	done := make(chan bool)
-
-	t := T{1}
-	go t.Hello(done)
-	<-done
-
-	var i I = T{2}
-	go i.Hello(done)
-	<-done
-
-	go println("hello builtin")
-}
diff --git a/test/execution/if/lazy.go b/test/execution/if/lazy.go
deleted file mode 100644
index 5171a77..0000000
--- a/test/execution/if/lazy.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: False()
-// CHECK-NEXT: False()
-// CHECK-NEXT: false
-// CHECK-NEXT: False()
-// CHECK-NEXT: True()
-// CHECK-NEXT: true
-// CHECK-NEXT: True()
-// CHECK-NEXT: true
-// CHECK-NEXT: True()
-// CHECK-NEXT: true
-// CHECK-NEXT: False()
-// CHECK-NEXT: false
-// CHECK-NEXT: False()
-// CHECK-NEXT: false
-// CHECK-NEXT: True()
-// CHECK-NEXT: False()
-// CHECK-NEXT: false
-// CHECK-NEXT: True()
-// CHECK-NEXT: True()
-// CHECK-NEXT: true
-
-package main
-
-func False() bool {
-	println("False()")
-	return false
-}
-
-func True() bool {
-	println("True()")
-	return true
-}
-
-func main() {
-	println(False() || False())
-	println(False() || True())
-	println(True() || False())
-	println(True() || True())
-	println(False() && False())
-	println(False() && True())
-	println(True() && False())
-	println(True() && True())
-}
diff --git a/test/execution/init.go b/test/execution/init.go
deleted file mode 100644
index 46c7fa1..0000000
--- a/test/execution/init.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// RUN: llgo -o %t %s %p/Inputs/init2.go
-// RUN: %t 2>&1 | FileCheck %s
-
-package main
-
-// CHECK-DAG: do some other stuff before main
-//func init()
-
-// CHECK-DAG: do some stuff before main
-func init() {
-	println("do some stuff before main")
-}
-
-// CHECK: main has been called
-func main() {
-	println("main has been called")
-}
diff --git a/test/execution/interfaces/assert.go b/test/execution/interfaces/assert.go
deleted file mode 100644
index 4c5db7d..0000000
--- a/test/execution/interfaces/assert.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: x is nil
-// CHECK-NEXT: i2v: 123456
-// CHECK-NEXT: !
-// CHECK-NEXT: (*X).F1: 123456
-
-package main
-
-type X struct{ x int }
-
-func (x *X) F1() { println("(*X).F1:", x.x) }
-func (x *X) F2() { println("(*X).F2") }
-
-type I interface {
-	F1()
-	F2()
-}
-
-func main() {
-	var x interface{}
-
-	// x is nil. Let's make sure an assertion on it
-	// won't cause a panic.
-	if x, ok := x.(int32); ok {
-		println("i2v:", x)
-	}
-	if x == nil {
-		println("x is nil")
-	}
-
-	x = int32(123456)
-
-	// Let's try an interface-to-value assertion.
-	if x, ok := x.(int32); ok {
-		println("i2v:", x)
-	}
-	if x, ok := x.(int64); ok {
-		println("i2v:", x)
-	}
-
-	// This will fail the assertion.
-	if i, ok := x.(I); ok {
-		i.F1()
-		_ = i
-	} else {
-		println("!")
-	}
-
-	// Assign an *X, which should pass the assertion.
-	x_ := new(X)
-	x_.x = 123456
-	x = x_ //&X{x: 123456}
-	if i, ok := x.(I); ok {
-		i.F1()
-		_ = i
-	} else {
-		println("!")
-	}
-}
diff --git a/test/execution/interfaces/basic.go b/test/execution/interfaces/basic.go
deleted file mode 100644
index 6c754da..0000000
--- a/test/execution/interfaces/basic.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: expected: y != z
-
-package main
-
-type any interface{}
-
-type Stringer interface {
-	String() string
-}
-
-type lessThanAWord struct {
-	a byte
-}
-
-func (l lessThanAWord) String() string {
-	return "!"
-}
-
-func makeAStringer() Stringer {
-	return lessThanAWord{}
-}
-
-func main() {
-	var x1, x2 int = 1, 2
-	var y any = x1
-	var z any = x2
-	if y != z {
-		println("expected: y != z")
-	} else {
-		println("unexpected: y == z")
-	}
-	/*
-		if y == x1 {
-			println("expected: y == x1")
-		} else {
-			println("unexpected: y == x1")
-		}
-	*/
-	//println(y.(int))
-}
diff --git a/test/execution/interfaces/comparei2i.go b/test/execution/interfaces/comparei2i.go
deleted file mode 100644
index 5a1f266..0000000
--- a/test/execution/interfaces/comparei2i.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: true
-// CHECK-NEXT: true
-
-package main
-
-import "unsafe"
-
-type I interface {
-	X()
-}
-
-type T int
-
-func (t T) X() {
-}
-
-func main() {
-	var highbit uint32 = 1 << 31
-	var pos0 float32 = 0
-	var neg0 float32 = *(*float32)(unsafe.Pointer(&highbit))
-	var i1 interface{} = pos0
-	var i2 interface{} = neg0
-	println(i1 == i2)
-	var i3 interface{} = T(123)
-	var i4 I = T(123)
-	println(i3 == i4)
-}
diff --git a/test/execution/interfaces/comparei2v.go b/test/execution/interfaces/comparei2v.go
deleted file mode 100644
index 6547360..0000000
--- a/test/execution/interfaces/comparei2v.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: true
-// CHECK-NEXT: false
-
-package main
-
-func main() {
-	var x interface{} = 123
-	println(x == 123)
-	println(x != 123)
-}
diff --git a/test/execution/interfaces/e2i_conversion.go b/test/execution/interfaces/e2i_conversion.go
deleted file mode 100644
index 6596e78..0000000
--- a/test/execution/interfaces/e2i_conversion.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | count 0
-
-package main
-
-import "io"
-
-type rdr struct{}
-
-func (r rdr) Read(b []byte) (int, error) {
-	return 0, nil
-}
-
-func F(i interface{}) {
-	_ = i.(io.Reader)
-}
-
-func main() {
-	var r rdr
-	F(r)
-	F(&r)
-}
diff --git a/test/execution/interfaces/embedded.go b/test/execution/interfaces/embedded.go
deleted file mode 100644
index 053afb1..0000000
--- a/test/execution/interfaces/embedded.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: A
-// CHECK-NEXT: B
-
-package main
-
-type BI interface {
-	B()
-}
-
-type AI interface {
-	A()
-	BI
-}
-
-type S struct{}
-
-func (s S) A() {
-	println("A")
-}
-
-func (s S) B() {
-	println("B")
-}
-
-func main() {
-	var ai AI = S{}
-	ai.A()
-	ai.B()
-}
diff --git a/test/execution/interfaces/error.go b/test/execution/interfaces/error.go
deleted file mode 100644
index 1724436..0000000
--- a/test/execution/interfaces/error.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: !!!! 123
-// CHECK-NEXT: errno 123
-
-package main
-
-var errors = [...]string{}
-
-func itoa(val int) string { // do it here rather than with fmt to avoid dependency
-	if val < 0 {
-		return "-" + itoa(-val)
-	}
-	var buf [32]byte // big enough for int64
-	i := len(buf) - 1
-	for val >= 10 {
-		buf[i] = byte(val%10 + '0')
-		i--
-		val /= 10
-	}
-	buf[i] = byte(val + '0')
-	return string(buf[i:])
-}
-
-type Errno uintptr
-
-func (e Errno) Error() string {
-	println("!!!!", uintptr(e))
-	if 0 <= int(e) && int(e) < len(errors) {
-		s := errors[e]
-		if s != "" {
-			return s
-		}
-	}
-	return "errno " + itoa(int(e))
-}
-
-func main() {
-	e := Errno(123)
-	i := (interface{})(e)
-	println(i.(error).Error())
-}
diff --git a/test/execution/interfaces/i2i_conversion.go b/test/execution/interfaces/i2i_conversion.go
deleted file mode 100644
index b55d840..0000000
--- a/test/execution/interfaces/i2i_conversion.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 666
-// CHECK-NEXT: The Beast
-
-package main
-
-type Numbered interface {
-	Number() int
-}
-
-type Named interface {
-	Name() string
-}
-
-type Beast struct{}
-
-func (b *Beast) Number() int {
-	return 666
-}
-
-func (b *Beast) Name() string {
-	return "The Beast"
-}
-
-func main() {
-	var b Beast
-	var numbered Numbered = &b
-	var named Named = numbered.(Named)
-	println(numbered.Number())
-	println(named.Name())
-}
diff --git a/test/execution/interfaces/import.go b/test/execution/interfaces/import.go
deleted file mode 100644
index 3305ee6..0000000
--- a/test/execution/interfaces/import.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-package main
-
-import "syscall"
-
-type Signal interface {
-	Signal()
-}
-
-func main() {
-	var s Signal = syscall.SIGINT
-	// CHECK: ({{.*}},{{.*}})
-	println(s)
-}
diff --git a/test/execution/interfaces/methods.go b/test/execution/interfaces/methods.go
deleted file mode 100644
index 5fb704c..0000000
--- a/test/execution/interfaces/methods.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: X()
-// CHECK-NEXT: Y()
-// CHECK-NEXT: X()
-// CHECK-NEXT: Y()
-// CHECK-NEXT: X()
-
-package main
-
-type Stringer interface {
-	String() string
-}
-
-type X int
-type Y int
-
-type Z1 struct {
-	X
-}
-
-type Z2 struct {
-	Stringer
-}
-
-func (x X) String() string {
-	return "X()"
-}
-
-func (y *Y) String() string {
-	return "Y()"
-}
-
-func makeX() X {
-	return X(0)
-}
-
-func main() {
-	var z Stringer = X(0)
-	println(z.String())
-
-	z = new(Y)
-	println(z.String())
-
-	z = Z1{}
-	println(z.String())
-
-	z = Z2{new(Y)}
-	println(z.String())
-
-	println(makeX().String())
-}
diff --git a/test/execution/interfaces/static_conversion.go b/test/execution/interfaces/static_conversion.go
deleted file mode 100644
index e63f10d..0000000
--- a/test/execution/interfaces/static_conversion.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 666
-// CHECK-NEXT: 3
-
-package main
-
-type Blah interface{}
-type Numbered interface {
-	Blah
-	Number() int
-}
-
-type Beast struct{}
-
-func (b *Beast) Number() int {
-	return 666
-}
-
-type MagicNumber int
-
-func (m MagicNumber) Number() int {
-	return int(m)
-}
-
-func main() {
-	var b Beast
-	var m MagicNumber = 3
-	var n Numbered = &b
-	println(n.Number())
-
-	n = m
-	println(n.Number())
-}
diff --git a/test/execution/interfaces/wordsize.go b/test/execution/interfaces/wordsize.go
deleted file mode 100644
index e2de5d5..0000000
--- a/test/execution/interfaces/wordsize.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: StringStringer(abc)
-// CHECK-NEXT: abc 1 2 3
-
-package main
-
-type Stringer interface {
-	String() string
-}
-
-type StringStringer string
-
-func (s StringStringer) String() string {
-	return "StringStringer(" + string(s) + ")"
-}
-
-func (s StringStringer) MethodWithArgs(a, b, c int) {
-	println(s, a, b, c)
-}
-
-type I interface {
-	MethodWithArgs(a, b, c int)
-}
-
-func testLargerThanWord() {
-	// string is larger than a word. Make sure it works
-	// well as a method receiver when using interfaces.
-	var s Stringer = StringStringer("abc")
-	println(s.String())
-
-	// Test calling a method which takes parameters
-	// beyond the receiver.
-	s.(I).MethodWithArgs(1, 2, 3)
-}
-
-func main() {
-	testLargerThanWord()
-}
diff --git a/test/execution/literals/array.go b/test/execution/literals/array.go
deleted file mode 100644
index 975ec02..0000000
--- a/test/execution/literals/array.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 9223372036854775808 -63 false
-// CHECK-NEXT: 11529215046068469760 -60 false
-// CHECK-NEXT: 14411518807585587200 -57 false
-// CHECK-NEXT: 18014398509481984000 -54 false
-// CHECK-NEXT: 11258999068426240000 -50 false
-// CHECK-NEXT: 14073748835532800000 -47 false
-// CHECK-NEXT: 17592186044416000000 -44 false
-// CHECK-NEXT: 10995116277760000000 -40 false
-// CHECK-NEXT: 0 0
-// CHECK-NEXT: 1 0
-// CHECK-NEXT: 2 1
-// CHECK-NEXT: 3 0
-// CHECK-NEXT: 4 2
-// CHECK-NEXT: 5 0
-// CHECK-NEXT: 6 3
-// CHECK-NEXT: 7 0
-// CHECK-NEXT: 8 4
-// CHECK-NEXT: 9 0
-// CHECK-NEXT: 0 1
-// CHECK-NEXT: 1 2
-
-package main
-
-// An extFloat represents an extended floating-point number, with more
-// precision than a float64. It does not try to save bits: the
-// number represented by the structure is mant*(2^exp), with a negative
-// sign if neg is true.
-type extFloat struct {
-	mant uint64
-	exp  int
-	neg  bool
-}
-
-var smallPowersOfTen = [...]extFloat{
-	{1 << 63, -63, false},        // 1
-	{0xa << 60, -60, false},      // 1e1
-	{0x64 << 57, -57, false},     // 1e2
-	{0x3e8 << 54, -54, false},    // 1e3
-	{0x2710 << 50, -50, false},   // 1e4
-	{0x186a0 << 47, -47, false},  // 1e5
-	{0xf4240 << 44, -44, false},  // 1e6
-	{0x989680 << 40, -40, false}, // 1e7
-}
-
-var arrayWithHoles = [10]int{
-	2: 1,
-	4: 2,
-	6: 3,
-	8: 4,
-}
-
-type namedInt int32
-
-const N0 namedInt = 0
-const N1 namedInt = 1
-
-var arrayWithNamedIndices = [...]int{
-	N0: 1,
-	N1: 2,
-}
-
-func main() {
-	for i := range smallPowersOfTen {
-		s := smallPowersOfTen[i]
-		println(s.mant, s.exp, s.neg)
-	}
-
-	for i, value := range arrayWithHoles {
-		println(i, value)
-	}
-
-	for i, value := range arrayWithNamedIndices {
-		println(i, value)
-	}
-}
diff --git a/test/execution/literals/func.go b/test/execution/literals/func.go
deleted file mode 100644
index b8dbef3..0000000
--- a/test/execution/literals/func.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: true
-// CHECK-NEXT: false
-
-package main
-
-func main() {
-	f := func(x bool) {
-		println(x)
-	}
-	f(true)
-	f(false)
-}
diff --git a/test/execution/literals/map.go b/test/execution/literals/map.go
deleted file mode 100644
index 32173f5..0000000
--- a/test/execution/literals/map.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: false
-// CHECK-NEXT: 2
-// CHECK-NEXT: 1 0 3
-// CHECK-NEXT: 0.1
-// CHECK-NEXT: 0.2
-// CHECK-NEXT: 0.3
-
-package main
-
-func main() {
-	type IntMap map[int]int
-	m := IntMap{0: 1, 2: 3}
-	println(m == nil)
-	println(len(m))
-	println(m[0], m[1], m[2])
-
-	f32tostr := map[float32]string{0.1: "0.1", 0.2: "0.2", 0.3: "0.3"}
-	println(f32tostr[0.1])
-	println(f32tostr[0.2])
-	println(f32tostr[0.3])
-}
diff --git a/test/execution/literals/slice.go b/test/execution/literals/slice.go
deleted file mode 100644
index dbb02bf..0000000
--- a/test/execution/literals/slice.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: abc
-// CHECK-NEXT: 123
-// CHECK-NEXT: abc
-// CHECK-NEXT: 123
-
-package main
-
-func main() {
-	x := []string{"abc", "123"}
-	println(x[0])
-	println(x[1])
-
-	// Elements are composite literals, so the '&' can be elided.
-	type S struct{ string }
-	y := []*S{{"abc"}, {"123"}}
-	println(y[0].string)
-	println(y[1].string)
-}
diff --git a/test/execution/literals/struct.go b/test/execution/literals/struct.go
deleted file mode 100644
index 4fede95..0000000
--- a/test/execution/literals/struct.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 1 2
-// CHECK-NEXT: 1 2
-// CHECK-NEXT: 0 1 2
-// CHECK-NEXT: 1 2
-// CHECK-NEXT: 3 4
-
-package main
-
-type E struct {
-	e *E
-}
-
-type S struct {
-	*E
-	a, b int
-}
-
-type File struct {
-}
-
-type Reader struct {
-}
-
-type Response struct {
-}
-
-type reader struct {
-	*Reader
-	fd   *File
-	resp *Response
-}
-
-type Range32 struct {
-	Lo     uint32
-	Hi     uint32
-	Stride uint32
-}
-
-func main() {
-	s := &S{nil, 1, 2}
-	println(s.a, s.b)
-	s = &S{a: 1, b: 2}
-	println(s.a, s.b)
-
-	_ = &reader{}
-
-	r := Range32{
-		Lo:     0,
-		Stride: 2,
-		Hi:     1,
-	}
-	println(r.Lo, r.Hi, r.Stride)
-
-	// slice of structs
-	ss := []S{{nil, 1, 2}, {nil, 3, 4}}
-	for _, s := range ss {
-		println(s.a, s.b)
-	}
-}
diff --git a/test/execution/maps/delete.go b/test/execution/maps/delete.go
deleted file mode 100644
index 6879974..0000000
--- a/test/execution/maps/delete.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 1
-// CHECK-NEXT: 1 1
-// CHECK-NEXT: 0 0
-
-package main
-
-func main() {
-	m := make(map[int]int)
-	delete(m, 0) // no-op
-	m[0] = 1
-	println(len(m))
-	delete(m, 1) // no-op
-	println(len(m), m[0])
-	delete(m, 0) // delete element in map
-	println(len(m), m[0])
-}
diff --git a/test/execution/maps/insert.go b/test/execution/maps/insert.go
deleted file mode 100644
index 90b31cc..0000000
--- a/test/execution/maps/insert.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0
-// CHECK-NEXT: 0
-// CHECK-NEXT: 1
-// CHECK-NEXT: 456
-// CHECK-NEXT: 1
-// CHECK-NEXT: 789
-
-package main
-
-func main() {
-	{
-		var m map[int]int
-		println(len(m)) // 0
-		println(m[123]) // 0, despite map being nil
-	}
-
-	{
-		m := make(map[int]int)
-		m[123] = 456
-		println(len(m)) // 1
-		println(m[123])
-		m[123] = 789
-		println(len(m)) // 1
-		println(m[123])
-	}
-}
diff --git a/test/execution/maps/lookup.go b/test/execution/maps/lookup.go
deleted file mode 100644
index 69d2878..0000000
--- a/test/execution/maps/lookup.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0 false
-// CHECK-NEXT: 1 true
-// CHECK-NEXT: 1 true
-// CHECK-NEXT: 1 true
-
-package main
-
-func main() {
-	m := make(map[int]int)
-	v, ok := m[8]
-	println(v, ok)
-	m[8] = 1
-	v, ok = m[8]
-	println(v, ok)
-
-	type S struct{ s1, s2 string }
-	sm := make(map[S]int)
-	sm[S{"ABC", "DEF"}] = 1
-	sv, ok := sm[S{string([]byte{65, 66, 67}), string([]byte{68, 69, 70})}]
-	println(sv, ok)
-
-	type A [2]string
-	am := make(map[A]int)
-	am[A{"ABC", "DEF"}] = 1
-	av, ok := am[A{string([]byte{65, 66, 67}), string([]byte{68, 69, 70})}]
-	println(av, ok)
-}
diff --git a/test/execution/maps/range.go b/test/execution/maps/range.go
deleted file mode 100644
index f3dc03f..0000000
--- a/test/execution/maps/range.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 0
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 3
-// CHECK-NEXT: 4
-// CHECK-NEXT: 5
-// CHECK-NEXT: 0 3
-// CHECK-NEXT: 1 4
-// CHECK-NEXT: 2 5
-// CHECK-NEXT: 1
-// CHECK-NEXT: done
-
-package main
-
-func main() {
-	defer println("done")
-	m := make(map[int]int)
-	m[0] = 3
-	m[1] = 4
-	m[2] = 5
-	for k := range m {
-		println(k)
-	}
-	for k, _ := range m {
-		println(k)
-	}
-	for _, v := range m {
-		println(v)
-	}
-	for k, v := range m {
-		println(k, v)
-	}
-
-	// test deletion.
-	i := 0
-	for k, _ := range m {
-		i++
-		delete(m, (k+1)%3)
-		delete(m, (k+2)%3)
-	}
-	println(i)
-}
diff --git a/test/execution/methods/methodvalues.go b/test/execution/methods/methodvalues.go
deleted file mode 100644
index cf8a980..0000000
--- a/test/execution/methods/methodvalues.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 246
-// CHECK-NEXT: T2.f()
-// CHECK-NEXT: 10
-// CHECK-NEXT: abc
-
-package main
-
-type T1 struct {
-	value int
-}
-
-func (t *T1) f(m int) int {
-	return m * t.value
-}
-
-func f1() {
-	var t T1
-	var f func(int) int = t.f
-	t.value = 2
-	println(f(123))
-}
-
-type T2 struct{}
-
-func (T2) f() {
-	println("T2.f()")
-}
-
-func f2() {
-	var f func() = T2{}.f
-	f()
-}
-
-type T3 complex128
-
-func (t T3) f() int {
-	return int(real(t))
-}
-
-func f3() {
-	var f func() int = T3(10).f
-	println(f())
-}
-
-type T4 string
-
-func (t T4) f() string {
-	return string(t)
-}
-
-func f4() {
-	var f func() string = T4("abc").f
-	println(f())
-}
-
-func main() {
-	f1()
-	f2()
-	f3()
-	f4()
-}
diff --git a/test/execution/methods/nilrecv.go b/test/execution/methods/nilrecv.go
deleted file mode 100644
index defe2f4..0000000
--- a/test/execution/methods/nilrecv.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: true
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-// CHECK-NEXT: false
-
-package main
-
-type T1 int
-
-func (t *T1) t1() { println(t == nil) }
-
-func constNilRecv() {
-	(*T1)(nil).t1()
-}
-
-func nonConstNilRecv() {
-	var v1 T1
-	v1.t1()
-	var v2 *T1
-	v2.t1()
-	v2 = &v1
-	v2.t1()
-}
-
-func main() {
-	constNilRecv()
-	nonConstNilRecv()
-}
diff --git a/test/execution/methods/selectors.go b/test/execution/methods/selectors.go
deleted file mode 100644
index bcd4173..0000000
--- a/test/execution/methods/selectors.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: F1
-// CHECK-NEXT: F2
-// CHECK-NEXT: F1
-// CHECK-NEXT: F2
-
-package main
-
-type S1 struct{}
-type S2 struct {
-	S1
-}
-
-func (s S1) F1() {
-	println("F1")
-}
-
-func (s *S2) F2() {
-	println("F2")
-}
-
-func testUnnamedStructMethods() {
-	// Test method lookup on an unnamed struct type.
-	var x struct {
-		S1
-		S2
-	}
-	x.F1()
-	x.F2()
-}
-
-func main() {
-	var s S2
-
-	// Derive pointer-receiver function.
-	f1 := (*S2).F1
-	f1(&s)
-
-	f2 := (*S2).F2
-	f2(&s)
-
-	testUnnamedStructMethods()
-}
diff --git a/test/execution/new.go b/test/execution/new.go
deleted file mode 100644
index 24773de..0000000
--- a/test/execution/new.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0
-// CHECK-NEXT: 2
-// CHECK-NEXT: 4
-
-package main
-
-func main() {
-	x := new(int)
-	println(*x)
-	*x = 2
-	println(*x)
-	*x = *x * *x
-	println(*x)
-}
diff --git a/test/execution/nil.go b/test/execution/nil.go
deleted file mode 100644
index 0aa94e7..0000000
--- a/test/execution/nil.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0x0
-// CHECK-NEXT: x is nil
-// CHECK-NEXT: y is nil
-// CHECK-NEXT: z is nil
-
-package main
-
-func main() {
-	var x *int = nil
-	println(x)
-
-	if x == nil {
-		println("x is nil")
-	}
-
-	var y interface{}
-	var z interface{} = y
-	if y == nil {
-		println("y is nil")
-	} else {
-		println("y is not nil")
-	}
-
-	if z == nil {
-		println("z is nil")
-	} else {
-		println("z is not nil")
-	}
-}
diff --git a/test/execution/operators/basics.go b/test/execution/operators/basics.go
deleted file mode 100644
index 1942586..0000000
--- a/test/execution/operators/basics.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 4096
-// CHECK-NEXT: 256
-// CHECK-NEXT: 0
-// CHECK-NEXT: 0
-// CHECK-NEXT: 4096
-// CHECK-NEXT: 256
-// CHECK-NEXT: 0
-// CHECK-NEXT: 0
-// CHECK-NEXT: 65280
-// CHECK-NEXT: 0
-// CHECK-NEXT: 0
-// CHECK-NEXT: 0
-// CHECK-NEXT: 61184
-// CHECK-NEXT: 65024
-// CHECK-NEXT: 65296
-// CHECK-NEXT: 65281
-// CHECK-NEXT: 61184
-// CHECK-NEXT: 65024
-// CHECK-NEXT: 65296
-// CHECK-NEXT: 65281
-// CHECK-NEXT: -62
-// CHECK-NEXT: -246
-// CHECK-NEXT: +1.224560e+002
-// CHECK-NEXT: 3
-// CHECK-NEXT: 3
-// CHECK-NEXT: 4
-// CHECK-NEXT: 122
-// CHECK-NEXT: -124
-// CHECK-NEXT: 120
-// CHECK-NEXT: 18446744073709547520
-// CHECK-NEXT: false
-// CHECK-NEXT: 2147483648
-// CHECK-NEXT: 9223372036854775808
-// CHECK-NEXT: 2147483648 2147483648
-// CHECK-NEXT: 9223372036854775808 9223372036854775808
-
-package main
-
-import "unsafe"
-
-var global string
-
-var hi = 0xFF00
-var lo = 0xFF00
-
-// borrowed from math package to avoid dependency on standard library
-func float32bits(f float32) uint32 { return *(*uint32)(unsafe.Pointer(&f)) }
-func float64bits(f float64) uint64 { return *(*uint64)(unsafe.Pointer(&f)) }
-
-func main() {
-	println(hi & 0x1000)
-	println(hi & 0x0100)
-	println(hi & 0x0010)
-	println(hi & 0x0001)
-	println(lo & 0x1000)
-	println(lo & 0x0100)
-	println(lo & 0x0010)
-	println(lo & 0x0001)
-	println(hi | lo)
-	println(hi ^ hi)
-	println(hi ^ lo)
-	println(lo ^ lo)
-	println(hi ^ 0x1000)
-	println(hi ^ 0x0100)
-	println(hi ^ 0x0010)
-	println(hi ^ 0x0001)
-	println(lo ^ 0x1000)
-	println(lo ^ 0x0100)
-	println(lo ^ 0x0010)
-	println(lo ^ 0x0001)
-	println(-123 >> 1)
-	println(-123 << 1)
-
-	var f float64 = 123.456
-	f--
-	println(f)
-
-	// context of '&' op is used to type the untyped lhs
-	// operand of the shift expression.
-	shift := uint(2)
-	println(uint64(0xFFFFFFFF) & (1<<shift - 1))
-	println((1<<shift - 1) & uint64(0xFFFFFFFF))
-
-	// rhs' type is converted lhs'
-	println(uint32(1) << uint64(2))
-	{
-		var _uint64 uint64
-		var _uint uint
-		x := _uint64 >> (63 - _uint)
-		if x == 2<<_uint {
-			println("!")
-		}
-	}
-
-	// There was a bug related to compound expressions involving
-	// multiple binary logical operators.
-	var a, b, c int
-	if a == 0 && (b != 0 || c != 0) {
-		println("!")
-	}
-
-	var si int = -123
-	var ui int = 123
-	println(^si)
-	println(^ui)
-	println(ui &^ 3)
-
-	// test case from math/modf.go
-	var x uint64 = 0xFFFFFFFFFFFFFFFF
-	var e uint = 40
-	x &^= 1<<(64-12-e) - 1
-	println(x)
-
-	// compare global to non-global
-	println(new(string) == &global)
-
-	// negative zero
-	var f32 float32
-	var f64 float64
-	var c64 complex64
-	var c128 complex128
-	f32 = -f32
-	f64 = -f64
-	c64 = -c64
-	c128 = -c128
-	println(float32bits(f32))
-	println(float64bits(f64))
-	println(float32bits(real(c64)), float32bits(imag(c64)))
-	println(float64bits(real(c128)), float64bits(imag(c128)))
-}
diff --git a/test/execution/operators/binary_untyped.go b/test/execution/operators/binary_untyped.go
deleted file mode 100644
index f152985..0000000
--- a/test/execution/operators/binary_untyped.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: true
-
-package main
-
-func f1(b bool) bool {
-	return b
-}
-
-func main() {
-	x := false
-	y := x
-	x = !y
-	println(x || y)
-}
diff --git a/test/execution/operators/shifts.go b/test/execution/operators/shifts.go
deleted file mode 100644
index 728b32b..0000000
--- a/test/execution/operators/shifts.go
+++ /dev/null
@@ -1,290 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 4294967295
-// CHECK-NEXT: 4294967295
-// CHECK-NEXT: 2147483647
-// CHECK-NEXT: 4294967294
-// CHECK-NEXT: 1073741823
-// CHECK-NEXT: 4294967292
-// CHECK-NEXT: 536870911
-// CHECK-NEXT: 4294967288
-// CHECK-NEXT: 268435455
-// CHECK-NEXT: 4294967280
-// CHECK-NEXT: 134217727
-// CHECK-NEXT: 4294967264
-// CHECK-NEXT: 67108863
-// CHECK-NEXT: 4294967232
-// CHECK-NEXT: 33554431
-// CHECK-NEXT: 4294967168
-// CHECK-NEXT: 16777215
-// CHECK-NEXT: 4294967040
-// CHECK-NEXT: 8388607
-// CHECK-NEXT: 4294966784
-// CHECK-NEXT: 4194303
-// CHECK-NEXT: 4294966272
-// CHECK-NEXT: 2097151
-// CHECK-NEXT: 4294965248
-// CHECK-NEXT: 1048575
-// CHECK-NEXT: 4294963200
-// CHECK-NEXT: 524287
-// CHECK-NEXT: 4294959104
-// CHECK-NEXT: 262143
-// CHECK-NEXT: 4294950912
-// CHECK-NEXT: 131071
-// CHECK-NEXT: 4294934528
-// CHECK-NEXT: 65535
-// CHECK-NEXT: 4294901760
-// CHECK-NEXT: 32767
-// CHECK-NEXT: 4294836224
-// CHECK-NEXT: 16383
-// CHECK-NEXT: 4294705152
-// CHECK-NEXT: 8191
-// CHECK-NEXT: 4294443008
-// CHECK-NEXT: 4095
-// CHECK-NEXT: 4293918720
-// CHECK-NEXT: 2047
-// CHECK-NEXT: 4292870144
-// CHECK-NEXT: 1023
-// CHECK-NEXT: 4290772992
-// CHECK-NEXT: 511
-// CHECK-NEXT: 4286578688
-// CHECK-NEXT: 255
-// CHECK-NEXT: 4278190080
-// CHECK-NEXT: 127
-// CHECK-NEXT: 4261412864
-// CHECK-NEXT: 63
-// CHECK-NEXT: 4227858432
-// CHECK-NEXT: 31
-// CHECK-NEXT: 4160749568
-// CHECK-NEXT: 15
-// CHECK-NEXT: 4026531840
-// CHECK-NEXT: 7
-// CHECK-NEXT: 3758096384
-// CHECK-NEXT: 3
-// CHECK-NEXT: 3221225472
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2147483648
-// CHECK-NEXT: 0
-// CHECK-NEXT: 0
-// CHECK-NEXT: 4026531839
-// CHECK-NEXT: 4026531839
-// CHECK-NEXT: 2013265919
-// CHECK-NEXT: 3758096382
-// CHECK-NEXT: 1006632959
-// CHECK-NEXT: 3221225468
-// CHECK-NEXT: 503316479
-// CHECK-NEXT: 2147483640
-// CHECK-NEXT: 251658239
-// CHECK-NEXT: 4294967280
-// CHECK-NEXT: 125829119
-// CHECK-NEXT: 4294967264
-// CHECK-NEXT: 62914559
-// CHECK-NEXT: 4294967232
-// CHECK-NEXT: 31457279
-// CHECK-NEXT: 4294967168
-// CHECK-NEXT: 15728639
-// CHECK-NEXT: 4294967040
-// CHECK-NEXT: 7864319
-// CHECK-NEXT: 4294966784
-// CHECK-NEXT: 3932159
-// CHECK-NEXT: 4294966272
-// CHECK-NEXT: 1966079
-// CHECK-NEXT: 4294965248
-// CHECK-NEXT: 983039
-// CHECK-NEXT: 4294963200
-// CHECK-NEXT: 491519
-// CHECK-NEXT: 4294959104
-// CHECK-NEXT: 245759
-// CHECK-NEXT: 4294950912
-// CHECK-NEXT: 122879
-// CHECK-NEXT: 4294934528
-// CHECK-NEXT: 61439
-// CHECK-NEXT: 4294901760
-// CHECK-NEXT: 30719
-// CHECK-NEXT: 4294836224
-// CHECK-NEXT: 15359
-// CHECK-NEXT: 4294705152
-// CHECK-NEXT: 7679
-// CHECK-NEXT: 4294443008
-// CHECK-NEXT: 3839
-// CHECK-NEXT: 4293918720
-// CHECK-NEXT: 1919
-// CHECK-NEXT: 4292870144
-// CHECK-NEXT: 959
-// CHECK-NEXT: 4290772992
-// CHECK-NEXT: 479
-// CHECK-NEXT: 4286578688
-// CHECK-NEXT: 239
-// CHECK-NEXT: 4278190080
-// CHECK-NEXT: 119
-// CHECK-NEXT: 4261412864
-// CHECK-NEXT: 59
-// CHECK-NEXT: 4227858432
-// CHECK-NEXT: 29
-// CHECK-NEXT: 4160749568
-// CHECK-NEXT: 14
-// CHECK-NEXT: 4026531840
-// CHECK-NEXT: 7
-// CHECK-NEXT: 3758096384
-// CHECK-NEXT: 3
-// CHECK-NEXT: 3221225472
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2147483648
-// CHECK-NEXT: 0
-// CHECK-NEXT: 0
-// CHECK-NEXT: -1
-// CHECK-NEXT: -1
-// CHECK-NEXT: -1
-// CHECK-NEXT: -2
-// CHECK-NEXT: -1
-// CHECK-NEXT: -4
-// CHECK-NEXT: -1
-// CHECK-NEXT: -8
-// CHECK-NEXT: -1
-// CHECK-NEXT: -16
-// CHECK-NEXT: -1
-// CHECK-NEXT: -32
-// CHECK-NEXT: -1
-// CHECK-NEXT: -64
-// CHECK-NEXT: -1
-// CHECK-NEXT: -128
-// CHECK-NEXT: -1
-// CHECK-NEXT: -256
-// CHECK-NEXT: -1
-// CHECK-NEXT: -512
-// CHECK-NEXT: -1
-// CHECK-NEXT: -1024
-// CHECK-NEXT: -1
-// CHECK-NEXT: -2048
-// CHECK-NEXT: -1
-// CHECK-NEXT: -4096
-// CHECK-NEXT: -1
-// CHECK-NEXT: -8192
-// CHECK-NEXT: -1
-// CHECK-NEXT: -16384
-// CHECK-NEXT: -1
-// CHECK-NEXT: -32768
-// CHECK-NEXT: -1
-// CHECK-NEXT: -65536
-// CHECK-NEXT: -1
-// CHECK-NEXT: -131072
-// CHECK-NEXT: -1
-// CHECK-NEXT: -262144
-// CHECK-NEXT: -1
-// CHECK-NEXT: -524288
-// CHECK-NEXT: -1
-// CHECK-NEXT: -1048576
-// CHECK-NEXT: -1
-// CHECK-NEXT: -2097152
-// CHECK-NEXT: -1
-// CHECK-NEXT: -4194304
-// CHECK-NEXT: -1
-// CHECK-NEXT: -8388608
-// CHECK-NEXT: -1
-// CHECK-NEXT: -16777216
-// CHECK-NEXT: -1
-// CHECK-NEXT: -33554432
-// CHECK-NEXT: -1
-// CHECK-NEXT: -67108864
-// CHECK-NEXT: -1
-// CHECK-NEXT: -134217728
-// CHECK-NEXT: -1
-// CHECK-NEXT: -268435456
-// CHECK-NEXT: -1
-// CHECK-NEXT: -536870912
-// CHECK-NEXT: -1
-// CHECK-NEXT: -1073741824
-// CHECK-NEXT: -1
-// CHECK-NEXT: -2147483648
-// CHECK-NEXT: -1
-// CHECK-NEXT: 0
-// CHECK-NEXT: 1
-// CHECK-NEXT: 1
-// CHECK-NEXT: 0
-// CHECK-NEXT: 2
-// CHECK-NEXT: 0
-// CHECK-NEXT: 4
-// CHECK-NEXT: 0
-// CHECK-NEXT: 8
-// CHECK-NEXT: 0
-// CHECK-NEXT: 16
-// CHECK-NEXT: 0
-// CHECK-NEXT: 32
-// CHECK-NEXT: 0
-// CHECK-NEXT: 64
-// CHECK-NEXT: 0
-// CHECK-NEXT: 128
-// CHECK-NEXT: 0
-// CHECK-NEXT: 256
-// CHECK-NEXT: 0
-// CHECK-NEXT: 512
-// CHECK-NEXT: 0
-// CHECK-NEXT: 1024
-// CHECK-NEXT: 0
-// CHECK-NEXT: 2048
-// CHECK-NEXT: 0
-// CHECK-NEXT: 4096
-// CHECK-NEXT: 0
-// CHECK-NEXT: 8192
-// CHECK-NEXT: 0
-// CHECK-NEXT: 16384
-// CHECK-NEXT: 0
-// CHECK-NEXT: 32768
-// CHECK-NEXT: 0
-// CHECK-NEXT: 65536
-// CHECK-NEXT: 0
-// CHECK-NEXT: 131072
-// CHECK-NEXT: 0
-// CHECK-NEXT: 262144
-// CHECK-NEXT: 0
-// CHECK-NEXT: 524288
-// CHECK-NEXT: 0
-// CHECK-NEXT: 1048576
-// CHECK-NEXT: 0
-// CHECK-NEXT: 2097152
-// CHECK-NEXT: 0
-// CHECK-NEXT: 4194304
-// CHECK-NEXT: 0
-// CHECK-NEXT: 8388608
-// CHECK-NEXT: 0
-// CHECK-NEXT: 16777216
-// CHECK-NEXT: 0
-// CHECK-NEXT: 33554432
-// CHECK-NEXT: 0
-// CHECK-NEXT: 67108864
-// CHECK-NEXT: 0
-// CHECK-NEXT: 134217728
-// CHECK-NEXT: 0
-// CHECK-NEXT: 268435456
-// CHECK-NEXT: 0
-// CHECK-NEXT: 536870912
-// CHECK-NEXT: 0
-// CHECK-NEXT: 1073741824
-// CHECK-NEXT: 0
-// CHECK-NEXT: -2147483648
-// CHECK-NEXT: 0
-// CHECK-NEXT: 0
-
-package main
-
-func testShrUint32(v uint32) {
-	for i := uint(0); i <= 32; i++ {
-		println(v >> i)
-		println(v << i)
-	}
-}
-
-func testShrInt32(v int32) {
-	for i := uint(0); i <= 32; i++ {
-		println(v >> i)
-		println(v << i)
-	}
-}
-
-func main() {
-	testShrUint32(0xFFFFFFFF)
-	testShrUint32(0xEFFFFFFF)
-	testShrInt32(-1)
-	testShrInt32(1)
-}
diff --git a/test/execution/slices/append.go b/test/execution/slices/append.go
deleted file mode 100644
index 50db2ac..0000000
--- a/test/execution/slices/append.go
+++ /dev/null
@@ -1,254 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 3
-// CHECK-NEXT: 4
-// CHECK-NEXT: 5
-// CHECK-NEXT: 6
-// CHECK-NEXT: 7
-// CHECK-NEXT: 8
-// CHECK-NEXT: 9
-// CHECK-NEXT: 10
-// CHECK-NEXT: 11
-// CHECK-NEXT: 12
-// CHECK-NEXT: 13
-// CHECK-NEXT: 14
-// CHECK-NEXT: 15
-// CHECK-NEXT: 16
-// CHECK-NEXT: 17
-// CHECK-NEXT: 18
-// CHECK-NEXT: 19
-// CHECK-NEXT: 20
-// CHECK-NEXT: 21
-// CHECK-NEXT: 22
-// CHECK-NEXT: 23
-// CHECK-NEXT: 24
-// CHECK-NEXT: 25
-// CHECK-NEXT: 26
-// CHECK-NEXT: 27
-// CHECK-NEXT: 28
-// CHECK-NEXT: 29
-// CHECK-NEXT: 30
-// CHECK-NEXT: 31
-// CHECK-NEXT: 32
-// CHECK-NEXT: 33
-// CHECK-NEXT: 34
-// CHECK-NEXT: 35
-// CHECK-NEXT: 36
-// CHECK-NEXT: 37
-// CHECK-NEXT: 38
-// CHECK-NEXT: 39
-// CHECK-NEXT: 40
-// CHECK-NEXT: 41
-// CHECK-NEXT: 42
-// CHECK-NEXT: 43
-// CHECK-NEXT: 44
-// CHECK-NEXT: 45
-// CHECK-NEXT: 46
-// CHECK-NEXT: 47
-// CHECK-NEXT: 48
-// CHECK-NEXT: 49
-// CHECK-NEXT: 50
-// CHECK-NEXT: 51
-// CHECK-NEXT: 52
-// CHECK-NEXT: 53
-// CHECK-NEXT: 54
-// CHECK-NEXT: 55
-// CHECK-NEXT: 56
-// CHECK-NEXT: 57
-// CHECK-NEXT: 58
-// CHECK-NEXT: 59
-// CHECK-NEXT: 60
-// CHECK-NEXT: 61
-// CHECK-NEXT: 62
-// CHECK-NEXT: 63
-// CHECK-NEXT: 64
-// CHECK-NEXT: 65
-// CHECK-NEXT: 66
-// CHECK-NEXT: 67
-// CHECK-NEXT: 68
-// CHECK-NEXT: 69
-// CHECK-NEXT: 70
-// CHECK-NEXT: 71
-// CHECK-NEXT: 72
-// CHECK-NEXT: 73
-// CHECK-NEXT: 74
-// CHECK-NEXT: 75
-// CHECK-NEXT: 76
-// CHECK-NEXT: 77
-// CHECK-NEXT: 78
-// CHECK-NEXT: 79
-// CHECK-NEXT: 80
-// CHECK-NEXT: 81
-// CHECK-NEXT: 82
-// CHECK-NEXT: 83
-// CHECK-NEXT: 84
-// CHECK-NEXT: 85
-// CHECK-NEXT: 86
-// CHECK-NEXT: 87
-// CHECK-NEXT: 88
-// CHECK-NEXT: 89
-// CHECK-NEXT: 90
-// CHECK-NEXT: 91
-// CHECK-NEXT: 92
-// CHECK-NEXT: 93
-// CHECK-NEXT: 94
-// CHECK-NEXT: 95
-// CHECK-NEXT: 96
-// CHECK-NEXT: 97
-// CHECK-NEXT: 98
-// CHECK-NEXT: 99
-// CHECK-NEXT: 0
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 3
-// CHECK-NEXT: 4
-// CHECK-NEXT: 5
-// CHECK-NEXT: 6
-// CHECK-NEXT: 7
-// CHECK-NEXT: 8
-// CHECK-NEXT: 9
-// CHECK-NEXT: 10
-// CHECK-NEXT: 11
-// CHECK-NEXT: 12
-// CHECK-NEXT: 13
-// CHECK-NEXT: 14
-// CHECK-NEXT: 15
-// CHECK-NEXT: 16
-// CHECK-NEXT: 17
-// CHECK-NEXT: 18
-// CHECK-NEXT: 19
-// CHECK-NEXT: 20
-// CHECK-NEXT: 21
-// CHECK-NEXT: 22
-// CHECK-NEXT: 23
-// CHECK-NEXT: 24
-// CHECK-NEXT: 25
-// CHECK-NEXT: 26
-// CHECK-NEXT: 27
-// CHECK-NEXT: 28
-// CHECK-NEXT: 29
-// CHECK-NEXT: 30
-// CHECK-NEXT: 31
-// CHECK-NEXT: 32
-// CHECK-NEXT: 33
-// CHECK-NEXT: 34
-// CHECK-NEXT: 35
-// CHECK-NEXT: 36
-// CHECK-NEXT: 37
-// CHECK-NEXT: 38
-// CHECK-NEXT: 39
-// CHECK-NEXT: 40
-// CHECK-NEXT: 41
-// CHECK-NEXT: 42
-// CHECK-NEXT: 43
-// CHECK-NEXT: 44
-// CHECK-NEXT: 45
-// CHECK-NEXT: 46
-// CHECK-NEXT: 47
-// CHECK-NEXT: 48
-// CHECK-NEXT: 49
-// CHECK-NEXT: 50
-// CHECK-NEXT: 51
-// CHECK-NEXT: 52
-// CHECK-NEXT: 53
-// CHECK-NEXT: 54
-// CHECK-NEXT: 55
-// CHECK-NEXT: 56
-// CHECK-NEXT: 57
-// CHECK-NEXT: 58
-// CHECK-NEXT: 59
-// CHECK-NEXT: 60
-// CHECK-NEXT: 61
-// CHECK-NEXT: 62
-// CHECK-NEXT: 63
-// CHECK-NEXT: 64
-// CHECK-NEXT: 65
-// CHECK-NEXT: 66
-// CHECK-NEXT: 67
-// CHECK-NEXT: 68
-// CHECK-NEXT: 69
-// CHECK-NEXT: 70
-// CHECK-NEXT: 71
-// CHECK-NEXT: 72
-// CHECK-NEXT: 73
-// CHECK-NEXT: 74
-// CHECK-NEXT: 75
-// CHECK-NEXT: 76
-// CHECK-NEXT: 77
-// CHECK-NEXT: 78
-// CHECK-NEXT: 79
-// CHECK-NEXT: 80
-// CHECK-NEXT: 81
-// CHECK-NEXT: 82
-// CHECK-NEXT: 83
-// CHECK-NEXT: 84
-// CHECK-NEXT: 85
-// CHECK-NEXT: 86
-// CHECK-NEXT: 87
-// CHECK-NEXT: 88
-// CHECK-NEXT: 89
-// CHECK-NEXT: 90
-// CHECK-NEXT: 91
-// CHECK-NEXT: 92
-// CHECK-NEXT: 93
-// CHECK-NEXT: 94
-// CHECK-NEXT: 95
-// CHECK-NEXT: 96
-// CHECK-NEXT: 97
-// CHECK-NEXT: 98
-// CHECK-NEXT: 99
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 3
-// CHECK-NEXT: abcdef
-// CHECK-NEXT: true
-// CHECK-NEXT: true
-// CHECK-NEXT: false false
-// CHECK-NEXT: true true
-// CHECK-NEXT: false false
-
-package main
-
-func stringtobytes() {
-	var b []byte
-	b = append(b, "abc"...)
-	b = append(b, "def"...)
-	println(string(b))
-}
-
-func appendnothing() {
-	var x []string
-	println(append(x) == nil)
-	x = append(x, "!")
-	println(len(append(x)) == 1)
-}
-
-func appendmulti() {
-	a := append([]bool{}, []bool{false, true, false}...)
-	b := append([]bool{}, false, true, false)
-	for i := range a {
-		println(a[i], b[i])
-	}
-}
-
-func main() {
-	x := []int{}
-	for i := 0; i < 100; i++ {
-		x = append(x, i)
-	}
-	for i := 0; i < len(x); i++ {
-		println(x[i])
-	}
-	y := []int{1, 2, 3}
-	x = append(x, y...)
-	for i := 0; i < len(x); i++ {
-		println(x[i])
-	}
-	stringtobytes()
-	appendnothing()
-	appendmulti()
-}
diff --git a/test/execution/slices/cap.go b/test/execution/slices/cap.go
deleted file mode 100644
index 33a34ff..0000000
--- a/test/execution/slices/cap.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0 0
-// CHECK-NEXT: 0 0
-// CHECK-NEXT: 0 0
-// CHECK-NEXT: 1 1
-// CHECK-NEXT: 1 1
-// CHECK-NEXT: 1 2
-// CHECK-NEXT: 2 9
-// CHECK-NEXT: 3 9
-// CHECK-NEXT: 999
-// CHECK-NEXT: 999
-// CHECK-NEXT: 1 2
-
-package main
-
-func test(l, c int) {
-	var s []int
-	if l != -1 {
-		if c == -1 {
-			s = make([]int, l)
-		} else {
-			s = make([]int, l, c)
-		}
-	}
-	println(len(s), cap(s))
-}
-
-func main() {
-	test(-1, -1)
-	test(0, -1)
-	test(0, 0)
-	test(1, -1)
-	test(1, 1)
-	test(1, 2)
-
-	// make sure capacity is transferred to slice
-	s := make([]int, 5, 10)
-	s1 := s[1:3]
-	println(len(s1), cap(s1))
-
-	s2 := append(s1, 999)
-	println(len(s2), cap(s2))
-	println(s2[2])
-	println(s[3])
-
-	s3 := s1[0:1:2]
-	println(len(s3), cap(s3))
-}
diff --git a/test/execution/slices/compare.go b/test/execution/slices/compare.go
deleted file mode 100644
index 93e3071..0000000
--- a/test/execution/slices/compare.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: true
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-// CHECK-NEXT: false
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-
-package main
-
-func main() {
-	var s []int
-	println(s == nil)
-	println(s != nil)
-	println(nil == s)
-	println(nil != s)
-	s = make([]int, 0)
-	println(s == nil)
-	println(s != nil)
-	println(nil == s)
-	println(nil != s)
-}
diff --git a/test/execution/slices/copy.go b/test/execution/slices/copy.go
deleted file mode 100644
index a6bf6c5..0000000
--- a/test/execution/slices/copy.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 5
-// CHECK-NEXT: 0
-
-package main
-
-func main() {
-	a := make([]int, 10)
-	b := make([]int, 10)
-	for i, _ := range b {
-		b[i] = 1
-	}
-	println(copy(a[:5], b)) // expect 5
-	println(a[5])           // expect 0
-}
diff --git a/test/execution/slices/index.go b/test/execution/slices/index.go
deleted file mode 100644
index 20d213e..0000000
--- a/test/execution/slices/index.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0
-
-package main
-
-func blah() []int {
-	return make([]int, 1)
-}
-
-func main() {
-	println(blah()[0])
-}
diff --git a/test/execution/slices/literal.go b/test/execution/slices/literal.go
deleted file mode 100644
index 42adabf..0000000
--- a/test/execution/slices/literal.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 3
-
-package main
-
-func main() {
-	x := []int{1, 2, 3}
-	for i := 0; i < len(x); i++ {
-		println(x[i])
-	}
-}
diff --git a/test/execution/slices/make.go b/test/execution/slices/make.go
deleted file mode 100644
index 30ecd6c..0000000
--- a/test/execution/slices/make.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0 0
-// CHECK-NEXT: 1 0
-// CHECK-NEXT: 2 0
-// CHECK-NEXT: 3 0
-// CHECK-NEXT: 4 0
-// CHECK-NEXT: 5 666
-// CHECK-NEXT: 6 0
-// CHECK-NEXT: 7 0
-// CHECK-NEXT: 8 0
-// CHECK-NEXT: 9 0
-
-package main
-
-func main() {
-	x := make([]int, 10)
-	x[5] = 666
-	for i, val := range x {
-		println(i, val)
-	}
-}
diff --git a/test/execution/slices/sliceexpr.go b/test/execution/slices/sliceexpr.go
deleted file mode 100644
index 56a7b52..0000000
--- a/test/execution/slices/sliceexpr.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: a
-// CHECK-NEXT: 0 2
-// CHECK-NEXT: 1 3
-// CHECK-NEXT: b
-// CHECK-NEXT: 0 3
-// CHECK-NEXT: 1 4
-// CHECK-NEXT: c
-// CHECK-NEXT: 0 1
-// CHECK-NEXT: 1 2
-// CHECK-NEXT: d
-// CHECK-NEXT: 0 1
-// CHECK-NEXT: 1 2
-// CHECK-NEXT: 2 3
-// CHECK-NEXT: 3 4
-
-package main
-
-func main() {
-	x := []int{1, 2, 3, 4}
-	println("a")
-	for i, val := range x[1:3] {
-		println(i, val)
-	}
-	println("b")
-	for i, val := range x[2:] {
-		println(i, val)
-	}
-	println("c")
-	for i, val := range x[:2] {
-		println(i, val)
-	}
-	println("d")
-	for i, val := range x[:] {
-		println(i, val)
-	}
-}
diff --git a/test/execution/strings/add.go b/test/execution/strings/add.go
deleted file mode 100644
index daf6921..0000000
--- a/test/execution/strings/add.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 3 3 6
-// CHECK-NEXT: abc123
-
-package main
-
-func main() {
-	a := "abc"
-	b := "123"
-	c := a + b
-	println(len(a), len(b), len(c))
-	println(c)
-}
diff --git a/test/execution/strings/bytes.go b/test/execution/strings/bytes.go
deleted file mode 100644
index a2c450a..0000000
--- a/test/execution/strings/bytes.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: testBytesConversion: true
-// CHECK-NEXT: 97
-// CHECK-NEXT: 98
-// CHECK-NEXT: 99
-// CHECK-NEXT: abc
-// CHECK-NEXT: !bc
-// CHECK-NEXT: testBytesCopy: true
-
-package main
-
-type namedByte byte
-
-func testBytesConversion() {
-	s := "abc"
-	b := []byte(s)
-	println("testBytesConversion:", s == string(b))
-	nb := []namedByte(s)
-	for _, v := range nb {
-		println(v)
-	}
-	b[0] = '!'
-	println(s)
-	s = string(b)
-	b[0] = 'a'
-	println(s)
-}
-
-func testBytesCopy() {
-	s := "abc"
-	b := make([]byte, len(s))
-	copy(b, s)
-	println("testBytesCopy:", string(b) == s)
-}
-
-func main() {
-	testBytesConversion()
-	testBytesCopy()
-}
diff --git a/test/execution/strings/compare.go b/test/execution/strings/compare.go
deleted file mode 100644
index c8e4f09..0000000
--- a/test/execution/strings/compare.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: true
-// CHECK-NEXT: false
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-// CHECK-NEXT: false
-// CHECK-NEXT: false
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-// CHECK-NEXT: false
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-// CHECK-NEXT: false
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-// CHECK-NEXT: true
-// CHECK-NEXT: true
-// CHECK-NEXT: true
-// CHECK-NEXT: true
-
-package main
-
-func main() {
-	x := "abc"
-	y := "def"
-	z := "abcd"
-
-	println(x == x) // true
-	println(x == y) // false
-	println(x != x) // false
-	println(x != y) // true
-	println(x < x)  // false
-	println(x < y)  // true
-	println(y < x)  // false
-	println(x > x)  // false
-	println(x > y)  // false
-	println(y > x)  // true
-
-	println(x == z) // false
-	println(z == x) // false
-	println(x < z)  // true
-	println(x > z)  // false
-	println(z < x)  // false
-	println(z > x)  // true
-
-	println(x <= x) // true
-	println(x <= y) // true
-	println(x >= x) // true
-	println(y >= x) // true
-}
diff --git a/test/execution/strings/index.go b/test/execution/strings/index.go
deleted file mode 100644
index dca7ddf..0000000
--- a/test/execution/strings/index.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 97 98 99
-
-package main
-
-func main() {
-	s := "abc"
-	println(s[0], s[1], s[2])
-}
diff --git a/test/execution/strings/range.go b/test/execution/strings/range.go
deleted file mode 100644
index c68b02a..0000000
--- a/test/execution/strings/range.go
+++ /dev/null
@@ -1,86 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0 46 1
-// CHECK-NEXT: 0 46
-// CHECK-NEXT: 0 169 1
-// CHECK-NEXT: 0 169
-// CHECK-NEXT: 0 8364 1
-// CHECK-NEXT: 0 8364
-// CHECK-NEXT: 0 66560 1
-// CHECK-NEXT: 0 66560
-// CHECK-NEXT: 0 83 1
-// CHECK-NEXT: 1 97 2
-// CHECK-NEXT: 2 108 3
-// CHECK-NEXT: 3 101 4
-// CHECK-NEXT: 4 32 5
-// CHECK-NEXT: 5 112 6
-// CHECK-NEXT: 6 114 7
-// CHECK-NEXT: 7 105 8
-// CHECK-NEXT: 8 99 9
-// CHECK-NEXT: 9 101 10
-// CHECK-NEXT: 10 58 11
-// CHECK-NEXT: 11 32 12
-// CHECK-NEXT: 12 8364 13
-// CHECK-NEXT: 15 48 14
-// CHECK-NEXT: 16 46 15
-// CHECK-NEXT: 17 57 16
-// CHECK-NEXT: 18 57 17
-// CHECK-NEXT: 0 83
-// CHECK-NEXT: 1 97
-// CHECK-NEXT: 2 108
-// CHECK-NEXT: 3 101
-// CHECK-NEXT: 4 32
-// CHECK-NEXT: 5 112
-// CHECK-NEXT: 6 114
-// CHECK-NEXT: 7 105
-// CHECK-NEXT: 8 99
-// CHECK-NEXT: 9 101
-// CHECK-NEXT: 10 58
-// CHECK-NEXT: 11 32
-// CHECK-NEXT: 12 8364
-// CHECK-NEXT: 15 48
-// CHECK-NEXT: 16 46
-// CHECK-NEXT: 17 57
-// CHECK-NEXT: 18 57
-
-package main
-
-func printchars(s string) {
-	var x int
-	for i, c := range s {
-		// test loop-carried dependence (x++), introducing a Phi node
-		x++
-		println(i, c, x)
-	}
-
-	// now test with plain old assignment
-	var i int
-	var c rune
-	for i, c = range s {
-		println(i, c)
-		if i == len(s)-1 {
-			// test multiple branches to loop header
-			continue
-		}
-	}
-}
-
-func main() {
-	// 1 bytes
-	printchars(".")
-
-	// 2 bytes
-	printchars("©")
-
-	// 3 bytes
-	printchars("€")
-
-	// 4 bytes
-	printchars("𐐀")
-
-	// mixed
-	printchars("Sale price: €0.99")
-
-	// TODO add test cases for invalid sequences
-}
diff --git a/test/execution/strings/runetostring.go b/test/execution/strings/runetostring.go
deleted file mode 100644
index e6a8c5d..0000000
--- a/test/execution/strings/runetostring.go
+++ /dev/null
@@ -1,74 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: test( 46 )
-// CHECK-NEXT: .
-// CHECK-NEXT: 46
-// CHECK-NEXT: 0 46
-// CHECK-NEXT: test( 169 )
-// CHECK-NEXT: ©
-// CHECK-NEXT: 194
-// CHECK-NEXT: 169
-// CHECK-NEXT: 0 169
-// CHECK-NEXT: test( 8364 )
-// CHECK-NEXT: €
-// CHECK-NEXT: 226
-// CHECK-NEXT: 130
-// CHECK-NEXT: 172
-// CHECK-NEXT: 0 8364
-// CHECK-NEXT: test( 66560 )
-// CHECK-NEXT: 𐐀
-// CHECK-NEXT: 240
-// CHECK-NEXT: 144
-// CHECK-NEXT: 144
-// CHECK-NEXT: 128
-// CHECK-NEXT: 0 66560
-// CHECK-NEXT: .©€𐐀
-// CHECK-NEXT: 4 4 4
-// CHECK-NEXT: true
-// CHECK-NEXT: true
-// CHECK-NEXT: true
-// CHECK-NEXT: true
-// CHECK-NEXT: true
-// CHECK-NEXT: true
-// CHECK-NEXT: true
-// CHECK-NEXT: true
-
-package main
-
-func test(r rune) {
-	println("test(", r, ")")
-	s := string(r)
-	println(s)
-	for i := 0; i < len(s); i++ {
-		println(s[i])
-	}
-	for i, r := range s {
-		println(i, r)
-	}
-}
-
-type namedRune rune
-
-func testslice(r1 []rune) {
-	s := string(r1)
-	println(s)
-	r2 := []rune(s)
-	r3 := []namedRune(s)
-	println(len(r1), len(r2), len(r3))
-	if len(r2) == len(r1) && len(r3) == len(r1) {
-		for i := range r2 {
-			println(r1[i] == r2[i])
-			println(r1[i] == rune(r3[i]))
-		}
-	}
-}
-
-func main() {
-	var runes = []rune{'.', '©', '€', '𐐀'}
-	test(runes[0])
-	test(runes[1])
-	test(runes[2])
-	test(runes[3])
-	testslice(runes)
-}
diff --git a/test/execution/strings/slice.go b/test/execution/strings/slice.go
deleted file mode 100644
index ec1b40c..0000000
--- a/test/execution/strings/slice.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: abcdef
-// CHECK-NEXT: bcdef
-// CHECK-NEXT: abc
-// CHECK-NEXT: bcd
-
-package main
-
-func main() {
-	s := "abcdef"
-	println(s[:])
-	println(s[1:])
-	println(s[:3])
-	println(s[1:4])
-}
diff --git a/test/execution/structs/compare.go b/test/execution/structs/compare.go
deleted file mode 100644
index 20a8ead..0000000
--- a/test/execution/structs/compare.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: true
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-// CHECK-NEXT: false
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-// CHECK-NEXT: true
-// CHECK-NEXT: false
-// CHECK-NEXT: false
-// CHECK-NEXT: true
-
-package main
-
-type S0 struct{}
-
-type S1 struct {
-	a int
-}
-
-type S2 struct {
-	a, b int
-}
-
-func testS0() {
-	println(S0{} == S0{})
-	println(S0{} != S0{})
-}
-
-func testS1() {
-	println(S1{1} == S1{1})
-	println(S1{1} != S1{1})
-	println(S1{1} == S1{2})
-	println(S1{1} != S1{2})
-}
-
-func testS2() {
-	s1 := S2{1, 2}
-	s2 := S2{1, 3}
-	println(s1 == s1)
-	println(s1 == s2)
-	println(s1 != s1)
-	println(s1 != s2)
-}
-
-func main() {
-	testS0()
-	testS1()
-	testS2()
-}
diff --git a/test/execution/structs/embed.go b/test/execution/structs/embed.go
deleted file mode 100644
index d519794..0000000
--- a/test/execution/structs/embed.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: A.test 1
-// CHECK-NEXT: A.testA
-// CHECK-NEXT: A.testA2
-// CHECK-NEXT: B.test 2
-// CHECK-NEXT: A.testA
-// CHECK-NEXT: A.testA2
-// CHECK-NEXT: A.testA
-
-package main
-
-type A struct{ aval int }
-
-func (a *A) test() {
-	println("A.test", a.aval)
-}
-
-func (a *A) testA() {
-	println("A.testA")
-}
-
-func (a A) testA2() {
-	println("A.testA2")
-}
-
-type B struct {
-	A
-	bval int
-}
-
-func (b B) test() {
-	println("B.test", b.bval)
-}
-
-type C struct {
-	*B
-	cval int
-}
-
-func main() {
-	var b B
-	b.aval = 1
-	b.bval = 2
-	b.A.test()
-	b.A.testA()
-	b.A.testA2()
-	b.test()
-	b.testA()
-	b.testA2()
-
-	var c C
-	c.B = &b
-	c.cval = 3
-	c.testA()
-	//c.testA2()
-}
diff --git a/test/execution/switch/branch.go b/test/execution/switch/branch.go
deleted file mode 100644
index a7bca9a..0000000
--- a/test/execution/switch/branch.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: true
-// CHECK-NEXT: false
-
-package main
-
-func main() {
-	switch true {
-	default:
-		break
-		println("default")
-	}
-
-	switch true {
-	case true:
-		println("true")
-		fallthrough
-	case false:
-		println("false")
-	}
-}
diff --git a/test/execution/switch/default.go b/test/execution/switch/default.go
deleted file mode 100644
index 2ae8509..0000000
--- a/test/execution/switch/default.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: default
-// CHECK-NEXT: true
-
-package main
-
-func main() {
-	switch true {
-	default:
-		println("default")
-	}
-
-	switch {
-	default:
-		println("default")
-	case true:
-		println("true")
-	}
-}
diff --git a/test/execution/switch/empty.go b/test/execution/switch/empty.go
deleted file mode 100644
index 4d20679..0000000
--- a/test/execution/switch/empty.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: f was called
-
-package main
-
-func f() int {
-	println("f was called")
-	return 123
-}
-
-func main() {
-	switch f() {
-	}
-}
diff --git a/test/execution/switch/scope.go b/test/execution/switch/scope.go
deleted file mode 100644
index 73bab3c..0000000
--- a/test/execution/switch/scope.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 1
-// CHECK-NEXT: 2
-
-package main
-
-func main() {
-	// case clauses have their own scope.
-	switch {
-	case true, false:
-		x := 1
-		println(x)
-		fallthrough
-	default:
-		x := 2
-		println(x)
-	}
-}
diff --git a/test/execution/switch/strings.go b/test/execution/switch/strings.go
deleted file mode 100644
index 7f0c99d..0000000
--- a/test/execution/switch/strings.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: abc
-// CHECK-NEXT: def, abc
-
-package main
-
-func main() {
-	switch "abc" {
-	case "def":
-		println("def")
-	case "abc":
-		println("abc")
-	}
-
-	switch "abc" {
-	case "def", "abc":
-		println("def, abc")
-	}
-}
diff --git a/test/execution/switch/type.go b/test/execution/switch/type.go
deleted file mode 100644
index b43231c..0000000
--- a/test/execution/switch/type.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: int64 123
-// CHECK-NEXT: default
-// CHECK-NEXT: uint8 or int8
-// CHECK-NEXT: uint8 or int8
-// CHECK-NEXT: N
-
-package main
-
-func test(i interface{}) {
-	switch x := i.(type) {
-	case int64:
-		println("int64", x)
-	// FIXME
-	//case string:
-	//	println("string", x)
-	default:
-		println("default")
-	}
-}
-
-type stringer interface {
-	String() string
-}
-
-func printany(i interface{}) {
-	switch v := i.(type) {
-	case nil:
-		print("nil", v)
-	case stringer:
-		print(v.String())
-	case error:
-		print(v.Error())
-	case int:
-		print(v)
-	case string:
-		print(v)
-	}
-}
-
-func multi(i interface{}) {
-	switch i.(type) {
-	case uint8, int8:
-		println("uint8 or int8")
-	default:
-		println("something else")
-	}
-}
-
-type N int
-
-func (n N) String() string { return "N" }
-
-func named() {
-	var x interface{} = N(123)
-	switch x := x.(type) {
-	case N:
-		// Test for bug: previously, type switch was
-		// assigning underlying type of N (int).
-		println(x.String())
-	}
-}
-
-func main() {
-	test(int64(123))
-	test("abc")
-	multi(uint8(123))
-	multi(int8(123))
-	named()
-}
diff --git a/test/execution/types/named.go b/test/execution/types/named.go
deleted file mode 100644
index 08fd791..0000000
--- a/test/execution/types/named.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 24
-// CHECK-NEXT: 16
-// CHECK-NEXT: 0
-
-package main
-
-import "unsafe"
-
-func f1() {
-	type T struct {
-		a, b, c int
-	}
-	var t T
-	println(unsafe.Sizeof(t))
-}
-
-func f2() {
-	type T interface{}
-	var t T
-	t = 1
-	println(unsafe.Sizeof(t))
-}
-
-func f3() {
-	type T struct{}
-	var t T
-	println(unsafe.Sizeof(t))
-}
-
-func main() {
-	f1()
-	f2()
-	f3()
-}
diff --git a/test/execution/types/recursive.go b/test/execution/types/recursive.go
deleted file mode 100644
index 69ac09b..0000000
--- a/test/execution/types/recursive.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 3
-// CHECK-NEXT: 4
-
-package main
-
-type T1 *T1
-
-func count(t T1) int {
-	if t == nil {
-		return 1
-	}
-	return 1 + count(*t)
-}
-
-func testSelfPointer() {
-	var a T1
-	var b T1
-	var c T1 = &b
-	*c = &a
-	println(count(c))
-	println(count(&c))
-}
-
-func main() {
-	testSelfPointer()
-}
diff --git a/test/execution/unsafe/const_sizeof.go b/test/execution/unsafe/const_sizeof.go
deleted file mode 100644
index ade9d0b..0000000
--- a/test/execution/unsafe/const_sizeof.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 8
-// CHECK-NEXT: 8
-
-package main
-
-import "unsafe"
-
-const ptrSize = unsafe.Sizeof((*byte)(nil))
-
-var x [ptrSize]int
-
-func main() {
-	println(ptrSize)
-	println(len(x))
-}
diff --git a/test/execution/unsafe/offsetof.go b/test/execution/unsafe/offsetof.go
deleted file mode 100644
index 88b313a..0000000
--- a/test/execution/unsafe/offsetof.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 0
-// CHECK-NEXT: 4
-// CHECK-NEXT: 8
-// CHECK-NEXT: 16
-
-package main
-
-import "unsafe"
-
-type S struct {
-	a int16
-	b int32
-	c int8
-	d int64
-}
-
-func main() {
-	var s S
-	println(unsafe.Offsetof(s.a))
-	println(unsafe.Offsetof(s.b))
-	println(unsafe.Offsetof(s.c))
-	println(unsafe.Offsetof(s.d))
-}
diff --git a/test/execution/unsafe/pointer.go b/test/execution/unsafe/pointer.go
deleted file mode 100644
index 20dc64f..0000000
--- a/test/execution/unsafe/pointer.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 123
-// CHECK-NEXT: 456
-
-package main
-
-import "unsafe"
-
-func main() {
-	var i [2]int
-	i[0] = 123
-	i[1] = 456
-	ptr := &i[0]
-	println(*ptr)
-	ptr_i := unsafe.Pointer(ptr)
-	ptr_i = unsafe.Pointer(uintptr(ptr_i) + unsafe.Sizeof(i[0]))
-	ptr = (*int)(ptr_i)
-	println(*ptr)
-}
diff --git a/test/execution/unsafe/sizeof_array.go b/test/execution/unsafe/sizeof_array.go
deleted file mode 100644
index 2928de7..0000000
--- a/test/execution/unsafe/sizeof_array.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 12
-
-package main
-
-import "unsafe"
-
-type uint24 struct {
-	a uint16
-	b uint8
-}
-
-func main() {
-	var a [3]uint24
-	println(unsafe.Sizeof(a))
-}
diff --git a/test/execution/unsafe/sizeof_basic.go b/test/execution/unsafe/sizeof_basic.go
deleted file mode 100644
index a9a467b..0000000
--- a/test/execution/unsafe/sizeof_basic.go
+++ /dev/null
@@ -1,102 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 1
-// CHECK-NEXT: 8
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 4
-// CHECK-NEXT: 8
-// CHECK-NEXT: 8
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 4
-// CHECK-NEXT: 8
-// CHECK-NEXT: 4
-// CHECK-NEXT: 8
-// CHECK-NEXT: 8
-// CHECK-NEXT: 16
-// CHECK-NEXT: 16
-// CHECK-NEXT: 8
-// CHECK-NEXT: 8
-// CHECK-NEXT: 1
-// CHECK-NEXT: 8
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 4
-// CHECK-NEXT: 8
-// CHECK-NEXT: 8
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 4
-// CHECK-NEXT: 8
-// CHECK-NEXT: 4
-// CHECK-NEXT: 8
-// CHECK-NEXT: 8
-// CHECK-NEXT: 8
-// CHECK-NEXT: 8
-// CHECK-NEXT: 8
-// CHECK-NEXT: 8
-
-package main
-
-import "unsafe"
-
-func main() {
-	var b bool
-	var i int
-	var i8 int8
-	var i16 int16
-	var i32 int32
-	var i64 int64
-	var u uint
-	var u8 uint8
-	var u16 uint16
-	var u32 uint32
-	var u64 uint64
-	var f32 float32
-	var f64 float64
-	var c64 complex64
-	var c128 complex128
-	var s string
-	var p unsafe.Pointer
-	var up uintptr
-
-	println(unsafe.Sizeof(b))
-	println(unsafe.Sizeof(i))
-	println(unsafe.Sizeof(i8))
-	println(unsafe.Sizeof(i16))
-	println(unsafe.Sizeof(i32))
-	println(unsafe.Sizeof(i64))
-	println(unsafe.Sizeof(u))
-	println(unsafe.Sizeof(u8))
-	println(unsafe.Sizeof(u16))
-	println(unsafe.Sizeof(u32))
-	println(unsafe.Sizeof(u64))
-	println(unsafe.Sizeof(f32))
-	println(unsafe.Sizeof(f64))
-	println(unsafe.Sizeof(c64))
-	println(unsafe.Sizeof(c128))
-	println(unsafe.Sizeof(s))
-	println(unsafe.Sizeof(p))
-	println(unsafe.Sizeof(up))
-
-	println(unsafe.Alignof(b))
-	println(unsafe.Alignof(i))
-	println(unsafe.Alignof(i8))
-	println(unsafe.Alignof(i16))
-	println(unsafe.Alignof(i32))
-	println(unsafe.Alignof(i64))
-	println(unsafe.Alignof(u))
-	println(unsafe.Alignof(u8))
-	println(unsafe.Alignof(u16))
-	println(unsafe.Alignof(u32))
-	println(unsafe.Alignof(u64))
-	println(unsafe.Alignof(f32))
-	println(unsafe.Alignof(f64))
-	println(unsafe.Alignof(c64))
-	println(unsafe.Alignof(c128))
-	println(unsafe.Alignof(s))
-	println(unsafe.Alignof(p))
-	println(unsafe.Alignof(up))
-}
diff --git a/test/execution/unsafe/sizeof_struct.go b/test/execution/unsafe/sizeof_struct.go
deleted file mode 100644
index e8612d2..0000000
--- a/test/execution/unsafe/sizeof_struct.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 24
-
-package main
-
-import "unsafe"
-
-type a struct {
-	a int16
-	b int32
-	c int8
-	d int64
-}
-
-func main() {
-	println(unsafe.Sizeof(a{}))
-}
diff --git a/test/execution/var.go b/test/execution/var.go
deleted file mode 100644
index 71b025d..0000000
--- a/test/execution/var.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: woobie
-// CHECK-NEXT: 579 456
-// CHECK-NEXT: 12 +3.450000e+000
-// CHECK-NEXT: -1
-
-package main
-
-func Blah() int {
-	println("woobie")
-	return 123
-}
-
-func F1() (int, float64) {
-	return 12, 3.45
-}
-
-var X = Y + Blah() // == 579
-var Y = 123 + Z    // == 456
-
-var X1, Y1 = F1()
-
-const (
-	_ = 333 * iota
-	Z
-)
-
-var I interface{} = -1
-var I1 = I.(int)
-
-func main() {
-	println(X, Y)
-	println(X1, Y1)
-	println(I1)
-}
diff --git a/test/execution/varargs.go b/test/execution/varargs.go
deleted file mode 100644
index ca99416..0000000
--- a/test/execution/varargs.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// RUN: llgo -o %t %s
-// RUN: %t 2>&1 | FileCheck %s
-
-// CHECK: 3
-// CHECK-NEXT: 123
-// CHECK-NEXT: 456
-// CHECK-NEXT: 789
-// CHECK-NEXT: 4
-// CHECK-NEXT: 123
-// CHECK-NEXT: 456
-// CHECK-NEXT: 789
-// CHECK-NEXT: 101112
-// CHECK-NEXT: 3
-// CHECK-NEXT: 1
-// CHECK-NEXT: 2
-// CHECK-NEXT: 3
-
-package main
-
-func p(i ...int) {
-	println(len(i))
-	for j := 0; j < len(i); j++ {
-		println(i[j])
-	}
-}
-
-func main() {
-	p(123, 456, 789)
-	p(123, 456, 789, 101112)
-	p([]int{1, 2, 3}...)
-}
diff --git a/test/gllgo/dead.go b/test/gllgo/dead.go
deleted file mode 100644
index 31d0de8..0000000
--- a/test/gllgo/dead.go
+++ /dev/null
@@ -1,6 +0,0 @@
-// RUN: llgo -O0 -S -o - %s | FileCheck %s
-
-package gotest
-
-// CHECK-NOT: deadfunc
-func deadfunc()
diff --git a/test/irgen/Inputs/mangling-synthetic-p.go b/test/irgen/Inputs/mangling-synthetic-p.go
deleted file mode 100644
index c59588a..0000000
--- a/test/irgen/Inputs/mangling-synthetic-p.go
+++ /dev/null
@@ -1,4 +0,0 @@
-package p
-
-type U struct{}
-func (U) f()
diff --git a/test/irgen/avoidload.go b/test/irgen/avoidload.go
deleted file mode 100644
index 0dec74e..0000000
--- a/test/irgen/avoidload.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// RUN: llgo -S -emit-llvm -o - %s | FileCheck %s
-
-package foo
-
-type X struct {
-	indices [1]int
-}
-
-// CHECK-NOT: load [200 x i64]
-// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}, i64 160000, i32 1, i1 false)
-var _ = [100][200]int{}[0][0]
-
-// CHECK-NOT: load [1024 x i64]
-// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64({{.*}}, i64 8192, i32 1, i1 false)
-var _ = [1024]int{}[X{}.indices[0]]
diff --git a/test/irgen/cabi.go b/test/irgen/cabi.go
deleted file mode 100644
index bff2d7c..0000000
--- a/test/irgen/cabi.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// RUN: llgo -S -emit-llvm -o - %s | FileCheck %s
-
-package foo
-
-// CHECK: define void @foo.Test01_SI8(i8* nest, i8 signext)
-func Test01_SI8(x int8) {}
-// CHECK: define void @foo.Test02_UI8(i8* nest, i8 zeroext)
-func Test02_UI8(x uint8) {}
-
-// CHECK: define void @foo.Test03_SI16(i8* nest, i16 signext)
-func Test03_SI16(x int16) {}
-// CHECK: define void @foo.Test04_UI16(i8* nest, i16 zeroext)
-func Test04_UI16(x uint16) {}
-
-// CHECK: define void @foo.Test05_SI32(i8* nest, i32)
-func Test05_SI32(x int32) {}
-// CHECK: define void @foo.Test06_UI32(i8* nest, i32)
-func Test06_UI32(x uint32) {}
-
-// CHECK: define void @foo.Test07_SI64(i8* nest, i64)
-func Test07_SI64(x int64) {}
-// CHECK: define void @foo.Test08_UI64(i8* nest, i64)
-func Test08_UI64(x uint64) {}
diff --git a/test/irgen/go-panic.go b/test/irgen/go-panic.go
deleted file mode 100644
index 35b0a47..0000000
--- a/test/irgen/go-panic.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// RUN: llgo -S -emit-llvm -o - %s | FileCheck %s
-
-package foo
-
-func F() {
-	// CHECK: call void @__go_panic
-	// CHECK-NEXT: ret void
-	// CHECK-NEXT: }
-	go panic("")
-}
diff --git a/test/irgen/imports.go b/test/irgen/imports.go
deleted file mode 100644
index c0f9f56..0000000
--- a/test/irgen/imports.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// RUN: llgo -S -emit-llvm -o - %s | FileCheck %s
-
-package foo
-
-import _ "fmt"
-
-var X interface{}
-
-// CHECK: @"init$guard" = internal global i1 false
-
-// CHECK: define void @foo..import(i8* nest)
-// CHECK-NEXT: :
-// CHECK-NEXT: %[[N:.*]] = load i1, i1* @"init$guard"
-// CHECK-NEXT: br i1 %[[N]], label %{{.*}}, label %[[L:.*]]
-
-// CHECK: [[L]]:
-// CHECK-NEXT: call void @__go_register_gc_roots
-// CHECK-NEXT: store i1 true, i1* @"init$guard"
-// CHECK-NEXT: call void @fmt..import(i8* undef)
-// CHECK-NEXT: br label
diff --git a/test/irgen/mangling-dot.go b/test/irgen/mangling-dot.go
deleted file mode 100644
index aff73cb..0000000
--- a/test/irgen/mangling-dot.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// RUN: llgo -fgo-pkgpath=llvm.org/llvm -S -emit-llvm -o - %s | FileCheck %s
-
-package llvm
-
-// CHECK: @llvm_org_llvm.F
-func F() {
-}
diff --git a/test/irgen/mangling-synthetic.go b/test/irgen/mangling-synthetic.go
deleted file mode 100644
index ab043a6..0000000
--- a/test/irgen/mangling-synthetic.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// RUN: llgo -fgo-pkgpath=p -c -o %T/p.o %S/Inputs/mangling-synthetic-p.go
-// RUN: llgo -fgo-pkgpath=q -I %T -S -emit-llvm -o - %s | FileCheck %s
-
-package q
-
-import "p"
-
-// CHECK-DAG: define linkonce_odr void @p.f.N3_q.T(i8* nest, i8*)
-// CHECK-DAG: define linkonce_odr void @p.f.pN3_q.T(i8* nest, i8*)
-type T struct { p.U }
-
-// CHECK-DAG: declare void @q.f.N3_q.T(i8* nest, i8*)
-// CHECK-DAG: define linkonce_odr void @q.f.pN3_q.T(i8* nest, i8*)
-func (T) f()
diff --git a/test/irgen/select.go b/test/irgen/select.go
deleted file mode 100644
index 748277a..0000000
--- a/test/irgen/select.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// RUN: llgo -S -emit-llvm -o - %s | FileCheck %s
-
-package foo
-
-// CHECK-NOT: alloca [1024 x i8]
-// CHECK-NOT: alloca [2048 x i8]
-// CHECK: alloca [4096 x i8]
-func F() {
-	ch1 := make(chan [1024]byte)
-	ch2 := make(chan [2048]byte)
-	ch3 := make(chan [4096]byte)
-	select {
-	case <-ch1:
-	case _ = <-ch2:
-	case x := <-ch3:
-		_ = x[0]
-	}
-}
diff --git a/test/irgen/switch.go b/test/irgen/switch.go
deleted file mode 100644
index af05d41..0000000
--- a/test/irgen/switch.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// RUN: llgo -S -emit-llvm -o - %s | FileCheck %s
-
-package foo
-
-// CHECK: switch i32
-// CHECK-NEXT: i32 0, label %[[L0:.*]]
-// CHECK-NEXT: i32 1, label %[[L1:.*]]
-// CHECK-NEXT: i32 2, label %[[L2:.*]]
-// CHECK-NEXT: ]
-// CHECK: [[L0]]:
-// CHECK-NEXT: ret i32 1
-// CHECK: [[L1]]:
-// CHECK-NEXT: ret i32 2
-// CHECK: [[L2]]:
-// CHECK-NEXT: ret i32 0
-func F1(x int32) int32 {
-	switch x {
-	case 0:
-		return 1
-	case 1:
-		return 2
-	case 2:
-		return 0
-	}
-	panic("unreachable")
-}
-
-// CHECK: switch i64
-// CHECK-NEXT: i64 0
-// CHECK-NEXT: ]
-// CHECK: icmp eq i64 {{.*}}, 1
-func F2(x int64) bool {
-	return x == 0 || x == 0 || x == 1
-}
-
-// CHECK: switch i64
-// CHECK-NEXT: i64 0
-// CHECK-NEXT: ]
-func F3(x int64) bool {
-	return x == 0 || x == 0 || x == 0
-}
-
-// CHECK: switch i64
-// CHECK-NEXT: i64 0
-// CHECK-NEXT: i64 1
-// CHECK-NEXT: i64 2
-// CHECK-NEXT: ]
-// CHECK: icmp eq i64 {{.*}}, 3
-func F4(x int64) bool {
-	return x == 0 || x == 1 || x == 2 || x == 3
-}
-
-// CHECK-NOT: switch double
-func F5(x float64) float64 {
-	switch x {
-	case 0:
-		return 1.0
-	case 1.0:
-		return 0
-	}
-	panic("unreachable")
-}
diff --git a/test/lit.cfg b/test/lit.cfg
deleted file mode 100644
index a94e33e..0000000
--- a/test/lit.cfg
+++ /dev/null
@@ -1,16 +0,0 @@
-import lit.formats
-import os
-import sys
-
-config.name = 'llgo'
-config.suffixes = ['.go', '.test']
-config.test_format = lit.formats.ShTest()
-config.test_source_root = config.llvm_src_root + '/tools/llgo/test'
-config.test_exec_root = config.llvm_obj_root + '/tools/llgo/test'
-config.excludes = ['Inputs']
-
-config.substitutions.append((r"\bllgo\b", config.llvm_obj_root + '/bin/llgo -static-libgo'))
-config.substitutions.append((r"\bllgoi\b", config.llvm_obj_root + '/bin/llgoi'))
-config.substitutions.append((r"\bFileCheck\b", config.llvm_obj_root + '/bin/FileCheck'))
-config.substitutions.append((r"\bcount\b", config.llvm_obj_root + '/bin/count'))
-config.substitutions.append((r"\bnot\b", config.llvm_obj_root + '/bin/not'))
diff --git a/test/lit.site.cfg.in b/test/lit.site.cfg.in
deleted file mode 100644
index 2c38386..0000000
--- a/test/lit.site.cfg.in
+++ /dev/null
@@ -1,4 +0,0 @@
-config.llvm_src_root = "@LLVM_SOURCE_DIR@"
-config.llvm_obj_root = "@LLVM_BINARY_DIR@"
-
-lit_config.load_config(config, "@CMAKE_CURRENT_SOURCE_DIR@/lit.cfg")
diff --git a/test/llgoi/Inputs/src/bar/answer.go b/test/llgoi/Inputs/src/bar/answer.go
deleted file mode 100644
index 202b509..0000000
--- a/test/llgoi/Inputs/src/bar/answer.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package bar
-
-import "strconv"
-
-func Answer() int {
-	n, _ := strconv.Atoi("42")
-	return n
-}
diff --git a/test/llgoi/Inputs/src/foo/answer.go b/test/llgoi/Inputs/src/foo/answer.go
deleted file mode 100644
index 1593e36..0000000
--- a/test/llgoi/Inputs/src/foo/answer.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package foo
-
-import "bar"
-
-func Answer() int {
-	return bar.Answer()
-}
diff --git a/test/llgoi/Inputs/src/foo_cgo/answer.go b/test/llgoi/Inputs/src/foo_cgo/answer.go
deleted file mode 100644
index 5fe8a31..0000000
--- a/test/llgoi/Inputs/src/foo_cgo/answer.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package foo_cgo
-
-// #include <stdint.h>
-import "C"
-
-func Answer() C.uint64_t {
-	return 42
-}
diff --git a/test/llgoi/arith.test b/test/llgoi/arith.test
deleted file mode 100644
index b7869a9..0000000
--- a/test/llgoi/arith.test
+++ /dev/null
@@ -1,4 +0,0 @@
-// RUN: llgoi < %s | FileCheck %s
-
-1 + 1
-// CHECK: 2
diff --git a/test/llgoi/import-binary.test b/test/llgoi/import-binary.test
deleted file mode 100644
index 542054e..0000000
--- a/test/llgoi/import-binary.test
+++ /dev/null
@@ -1,5 +0,0 @@
-// RUN: llgoi < %s | FileCheck %s
-
-import "fmt"
-fmt.Println(1, "two", 3)
-// CHECK: 1 two 3
diff --git a/test/llgoi/import-source.test b/test/llgoi/import-source.test
deleted file mode 100644
index 3619fb4..0000000
--- a/test/llgoi/import-source.test
+++ /dev/null
@@ -1,28 +0,0 @@
-// RUN: env GOPATH=%S/Inputs llgoi < %s 2>&1 | FileCheck %s
-
-// make sure user symbols do not conflict with imported source package
-Answer := 1
-
-import "foo"
-
-// Test that importing binary after source works.
-import "strconv"
-
-foo.Answer()
-// CHECK: 42
-
-strconv.FormatBool(true)
-// CHECK: true
-
-var v1 strconv.NumError
-var v2 strconv.NumError
-
-// v1 and v2 should have the same type identity.
-// CHECK-NOT: cannot assign
-v1 = v2
-
-// Method lookup relies on v1 having a consistent type.
-v1.Error
-
-import "foo_cgo"
-// CHECK: foo_cgo: cannot load cgo package
diff --git a/test/llgoi/import-source2.test b/test/llgoi/import-source2.test
deleted file mode 100644
index 0be45ee..0000000
--- a/test/llgoi/import-source2.test
+++ /dev/null
@@ -1,12 +0,0 @@
-// RUN: env GOPATH=%S/Inputs llgoi < %s | FileCheck %s
-
-// Test that importing binary before source works.
-import "strconv"
-
-import "foo"
-
-foo.Answer()
-// CHECK: 42
-
-strconv.FormatBool(true)
-// CHECK: true
diff --git a/test/llgoi/interfaces.test b/test/llgoi/interfaces.test
deleted file mode 100644
index 125e015..0000000
--- a/test/llgoi/interfaces.test
+++ /dev/null
@@ -1,22 +0,0 @@
-// RUN: llgoi < %s | FileCheck %s
-
-import "errors"
-err := errors.New("foo")
-err
-// CHECK: foo
-
-err.(interface{Foo()})
-// CHECK: panic: interface conversion
-
-_, ok := err.(interface{Foo()})
-ok
-// CHECK: false
-
-err.(interface{Error() string})
-// CHECK: foo
-
-iface, ok := err.(interface{Error() string})
-iface
-// CHECK: foo
-ok
-// CHECK: true
diff --git a/test/llgoi/maps.test b/test/llgoi/maps.test
deleted file mode 100644
index ab1ba7e..0000000
--- a/test/llgoi/maps.test
+++ /dev/null
@@ -1,27 +0,0 @@
-// RUN: llgoi < %s | FileCheck %s
-
-m := make(map[int]int)
-m
-// CHECK: map[]
-
-m[0]
-// CHECK: 0
-
-m0, ok := m[0]
-m0
-// CHECK: 0
-ok
-// CHECK: false
-
-func() {
-	m[0] = 1
-}()
-
-m[0]
-// CHECK: 1
-
-m0, ok = m[0]
-m0
-// CHECK: 1
-ok
-// CHECK: true
diff --git a/test/llgoi/panic.test b/test/llgoi/panic.test
deleted file mode 100644
index 65ecd7b..0000000
--- a/test/llgoi/panic.test
+++ /dev/null
@@ -1,16 +0,0 @@
-// RUN: llgoi < %s | FileCheck %s
-
-panic("msg")
-// CHECK: panic: msg
-
-import "fmt"
-func() {
-	defer func() {
-		r := recover()
-		fmt.Println("recovered", r)
-	}()
-	panic("msg")
-}()
-// CHECK-NOT: {{^}}panic:
-// CHECK: recovered msg
-// CHECK-NOT: {{^}}panic:
diff --git a/test/llgoi/vars.test b/test/llgoi/vars.test
deleted file mode 100644
index c28198c..0000000
--- a/test/llgoi/vars.test
+++ /dev/null
@@ -1,30 +0,0 @@
-// RUN: llgoi < %s 2>&1 | FileCheck %s
-
-x := 3
-x
-// CHECK: 3
-
-x + x
-// CHECK: 6
-
-x * x
-// CHECK: 9
-
-x = 4
-x + x
-// CHECK: 8
-
-x := true
-// CHECK: cannot assign {{.*}} to x (variable of type int)
-
-x, y := func() (int, int) {
-	return 1, 2
-}()
-// CHECK: 1
-// CHECK: 2
-
-x, _ = func() (int, int) {
-	return 3, 4
-}()
-x
-// CHECK: 3
diff --git a/third_party/gofrontend/LICENSE b/third_party/gofrontend/LICENSE
deleted file mode 100644
index 6a66aea..0000000
--- a/third_party/gofrontend/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-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.
diff --git a/third_party/gofrontend/config-ml.in b/third_party/gofrontend/config-ml.in
deleted file mode 100644
index 927bad6..0000000
--- a/third_party/gofrontend/config-ml.in
+++ /dev/null
@@ -1,885 +0,0 @@
-# Configure fragment invoked in the post-target section for subdirs
-# wanting multilib support.
-#
-# Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2010, 2011, 2014 Free Software Foundation, Inc.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-#
-# Please report bugs to <gcc-bugs@gnu.org>
-# and send patches to <gcc-patches@gnu.org>.
-
-# It is advisable to support a few --enable/--disable options to let the
-# user select which libraries s/he really wants.
-#
-# Subdirectories wishing to use multilib should put the following lines
-# in the "post-target" section of configure.in.
-#
-# if [ "${srcdir}" = "." ] ; then
-#   if [ "${with_target_subdir}" != "." ] ; then
-#     . ${with_multisrctop}../../config-ml.in
-#   else
-#     . ${with_multisrctop}../config-ml.in
-#   fi
-# else
-#   . ${srcdir}/../config-ml.in
-# fi
-#
-#
-# Things are complicated because 6 separate cases must be handled:
-# 2 (native, cross) x 3 (absolute-path, relative-not-dot, dot) = 6.
-#
-# srcdir=. is special.  It must handle make programs that don't handle VPATH.
-# To implement this, a symlink tree is built for each library and for each
-# multilib subdir.
-#
-# The build tree is layed out as
-#
-# ./
-#   newlib
-#   m68020/
-#          newlib
-#          m68881/
-#                 newlib
-#
-# The nice feature about this arrangement is that inter-library references
-# in the build tree work without having to care where you are.  Note that
-# inter-library references also work in the source tree because symlink trees
-# are built when srcdir=.
-#
-# Unfortunately, trying to access the libraries in the build tree requires
-# the user to manually choose which library to use as GCC won't be able to
-# find the right one.  This is viewed as the lesser of two evils.
-#
-# Configure variables:
-# ${with_target_subdir} = "." for native, or ${target_alias} for cross.
-# Set by top level Makefile.
-# ${with_multisrctop} = how many levels of multilibs there are in the source
-# tree.  It exists to handle the case of configuring in the source tree:
-# ${srcdir} is not constant.
-# ${with_multisubdir} = name of multilib subdirectory (eg: m68020/m68881).
-#
-# Makefile variables:
-# MULTISRCTOP = number of multilib levels in source tree (+1 if cross)
-# (FIXME: note that this is different than ${with_multisrctop}.  Check out.).
-# MULTIBUILDTOP = number of multilib levels in build tree
-# MULTIDIRS = list of multilib subdirs (eg: m68000 m68020 ...)
-# (only defined in each library's main Makefile).
-# MULTISUBDIR = installed subdirectory name with leading '/' (eg: /m68000)
-# (only defined in each multilib subdir).
-
-# FIXME: Multilib is currently disabled by default for everything other than
-# newlib.  It is up to each target to turn on multilib support for the other
-# libraries as desired.
-
-# Autoconf incoming variables:
-# srcdir, host, ac_configure_args
-#
-# We *could* figure srcdir and host out, but we'd have to do work that
-# our caller has already done to figure them out and requiring these two
-# seems reasonable.
-# Note that `host' in this case is GCC's `target'.  Target libraries are
-# configured for a particular host.
-
-Makefile=${ac_file-Makefile}
-ml_config_shell=${CONFIG_SHELL-/bin/sh}
-ml_realsrcdir=${srcdir}
-
-# Scan all the arguments and set all the ones we need.
-
-scan_arguments ()
-{
-  ml_verbose=--verbose
-  for option
-  do
-    # Strip single quotes surrounding individual options, that is, remove one
-    # level of shell quoting for these.
-    case $option in
-      \'*\') eval option=$option ;;
-    esac
-
-    case $option in
-      --*) ;;
-      -*) option=-$option ;;
-    esac
-
-    case $option in
-      --*=*)
-	optarg=`echo $option | sed -e 's/^[^=]*=//'`
-	;;
-    esac
-
-    case $option in
-      --disable-*)
-	enableopt=`echo ${option} | sed 's:^--disable-:enable_:;s:-:_:g'`
-	eval $enableopt=no
-	;;
-      --enable-*)
-	case "$option" in
-	*=*)	;;
-	*)	optarg=yes ;;
-	esac
-	enableopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'`
-	# enable_shared and enable_static are handled by configure.
-	# Don't undo its work.
-	case $enableopt in
-	enable_shared | enable_static) ;;
-	*) eval $enableopt='$optarg' ;;
-	esac
-	;;
-      --norecursion | --no-recursion)
-	ml_norecursion=yes
-	;;
-      --silent | --sil* | --quiet | --q*)
-	ml_verbose=--silent
-	;;
-      --verbose | --v | --verb*)
-	ml_verbose=--verbose
-	;;
-      --with-*)
-	case "$option" in
-	*=*)	;;
-	*)	optarg=yes ;;
-	esac
-	withopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'`
-	eval $withopt='$optarg'
-	;;
-      --without-*)
-	withopt=`echo ${option} | sed 's:^--::;s:out::;s:-:_:g'`
-	eval $withopt=no
-	;;
-    esac
-  done
-}
-# Use eval to properly handle configure arguments such as
-# --enable-foo='--enable-a=1 --enable-b=2 --enable-c=3'.
-eval scan_arguments "${ac_configure_args}"
-unset scan_arguments
-
-# Only do this if --enable-multilib.
-if [ "${enable_multilib}" = yes ]; then
-
-# Compute whether this is the library's top level directory
-# (ie: not a multilib subdirectory, and not a subdirectory like newlib/src).
-# ${with_multisubdir} tells us we're in the right branch, but we could be
-# in a subdir of that.
-# ??? The previous version could void this test by separating the process into
-# two files: one that only the library's toplevel configure.in ran (to
-# configure the multilib subdirs), and another that all configure.in's ran to
-# update the Makefile.  It seemed reasonable to collapse all multilib support
-# into one file, but it does leave us with having to perform this test.
-ml_toplevel_p=no
-if [ -z "${with_multisubdir}" ]; then
-  if [ "${srcdir}" = "." ]; then
-    # Use ${ml_realsrcdir} instead of ${srcdir} here to account for ${subdir}.
-    # ${with_target_subdir} = "." for native, otherwise target alias.
-    if [ "${with_target_subdir}" = "." ]; then
-      if [ -f ${ml_realsrcdir}/../config-ml.in ]; then
-	ml_toplevel_p=yes
-      fi
-    else
-      if [ -f ${ml_realsrcdir}/../../config-ml.in ]; then
-	ml_toplevel_p=yes
-      fi
-    fi
-  else
-    # Use ${ml_realsrcdir} instead of ${srcdir} here to account for ${subdir}.
-    if [ -f ${ml_realsrcdir}/../config-ml.in ]; then
-      ml_toplevel_p=yes
-    fi
-  fi
-fi
-
-# If this is the library's top level directory, set multidirs to the
-# multilib subdirs to support.  This lives at the top because we need
-# `multidirs' set right away.
-
-if [ "${ml_toplevel_p}" = yes ]; then
-
-multidirs=
-for i in `${CC-gcc} --print-multi-lib 2>/dev/null`; do
-  dir=`echo $i | sed -e 's/;.*$//'`
-  if [ "${dir}" = "." ]; then
-    true
-  else
-    if [ -z "${multidirs}" ]; then
-      multidirs="${dir}"
-    else
-      multidirs="${multidirs} ${dir}"
-    fi
-  fi
-done
-
-# Target libraries are configured for the host they run on, so we check
-# $host here, not $target.
-
-case "${host}" in
-arm-*-*)
-	if [ x"$enable_fpu" = xno ]
-	then
-	  old_multidirs=${multidirs}
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "${x}" in
-	      *fpu*) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x"$enable_26bit" = xno ]
-	then
-	  old_multidirs=${multidirs}
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "${x}" in
-	      *26bit*) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x"$enable_underscore" = xno ]
-	then
-	  old_multidirs=${multidirs}
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "${x}" in
-	      *under*) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x"$enable_interwork" = xno ]
-	then
-	  old_multidirs=${multidirs}
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "${x}" in
-	      *interwork*) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x$enable_biendian = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *le* ) : ;;
-	      *be* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x"$enable_nofmult" = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *nofmult* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	;;
-m68*-*-*)
-	if [ x$enable_softfloat = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *soft-float* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x$enable_m68881 = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *m68881* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x$enable_m68000 = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *m68000* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x$enable_m68020 = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *m68020* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	;;
-mips*-*-*)
-	if [ x$enable_single_float = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *single* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x$enable_biendian = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *el* ) : ;;
-	      *eb* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x$enable_softfloat = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *soft-float* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	;;
-powerpc*-*-* | rs6000*-*-*)
-	if [ x$enable_aix64 = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *ppc64* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x$enable_pthread = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *pthread* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x$enable_softfloat = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *soft-float* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x$enable_powercpu = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      power | */power | */power/* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x$enable_powerpccpu = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *powerpc* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x$enable_powerpcos = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *mcall-linux* | *mcall-solaris* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x$enable_biendian = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *mlittle* | *mbig* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	if [ x$enable_sysv = xno ]
-	then
-	  old_multidirs="${multidirs}"
-	  multidirs=""
-	  for x in ${old_multidirs}; do
-	    case "$x" in
-	      *mcall-sysv* ) : ;;
-	      *) multidirs="${multidirs} ${x}" ;;
-	    esac
-	  done
-	fi
-	;;
-esac
-
-# Remove extraneous blanks from multidirs.
-# Tests like `if [ -n "$multidirs" ]' require it.
-multidirs=`echo "$multidirs" | sed -e 's/^[ ][ ]*//' -e 's/[ ][ ]*$//' -e 's/[ ][ ]*/ /g'`
-
-# Add code to library's top level makefile to handle building the multilib
-# subdirs.
-
-cat > Multi.tem <<\EOF
-
-PWD_COMMAND=$${PWDCMD-pwd}
-
-# FIXME: There should be an @-sign in front of the `if'.
-# Leave out until this is tested a bit more.
-multi-do:
-	if [ -z "$(MULTIDIRS)" ]; then \
-	  true; \
-	else \
-	  rootpre=`${PWD_COMMAND}`/; export rootpre; \
-	  srcrootpre=`cd $(srcdir); ${PWD_COMMAND}`/; export srcrootpre; \
-	  lib=`echo "$${rootpre}" | sed -e 's,^.*/\([^/][^/]*\)/$$,\1,'`; \
-	  compiler="$(CC)"; \
-	  for i in `$${compiler} --print-multi-lib 2>/dev/null`; do \
-	    dir=`echo $$i | sed -e 's/;.*$$//'`; \
-	    if [ "$${dir}" = "." ]; then \
-	      true; \
-	    else \
-	      if [ -d ../$${dir}/$${lib} ]; then \
-		flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \
-		if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) \
-				CFLAGS="$(CFLAGS) $${flags}" \
-				CCASFLAGS="$(CCASFLAGS) $${flags}" \
-				FCFLAGS="$(FCFLAGS) $${flags}" \
-				FFLAGS="$(FFLAGS) $${flags}" \
-				ADAFLAGS="$(ADAFLAGS) $${flags}" \
-				prefix="$(prefix)" \
-				exec_prefix="$(exec_prefix)" \
-				GCJFLAGS="$(GCJFLAGS) $${flags}" \
-				GOCFLAGS="$(GOCFLAGS) $${flags}" \
-				CXXFLAGS="$(CXXFLAGS) $${flags}" \
-				LIBCFLAGS="$(LIBCFLAGS) $${flags}" \
-				LIBCXXFLAGS="$(LIBCXXFLAGS) $${flags}" \
-				LDFLAGS="$(LDFLAGS) $${flags}" \
-				MULTIFLAGS="$${flags}" \
-				DESTDIR="$(DESTDIR)" \
-				INSTALL="$(INSTALL)" \
-				INSTALL_DATA="$(INSTALL_DATA)" \
-				INSTALL_PROGRAM="$(INSTALL_PROGRAM)" \
-				INSTALL_SCRIPT="$(INSTALL_SCRIPT)" \
-				$(DO)); then \
-		  true; \
-		else \
-		  exit 1; \
-		fi; \
-	      else true; \
-	      fi; \
-	    fi; \
-	  done; \
-	fi
-
-# FIXME: There should be an @-sign in front of the `if'.
-# Leave out until this is tested a bit more.
-multi-clean:
-	if [ -z "$(MULTIDIRS)" ]; then \
-	  true; \
-	else \
-	  lib=`${PWD_COMMAND} | sed -e 's,^.*/\([^/][^/]*\)$$,\1,'`; \
-	  for dir in : $(MULTIDIRS); do \
-	    test $$dir != : || continue; \
-EOF
-cat >>Multi.tem <<EOF
-	    if [ -f ../\$\${dir}/\$\${lib}/${Makefile} ]; then \\
-EOF
-cat >>Multi.tem <<\EOF
-	      if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) $(DO)); \
-	      then true; \
-	      else exit 1; \
-	      fi; \
-	    else true; \
-	    fi; \
-	  done; \
-	fi
-EOF
-
-cat ${Makefile} Multi.tem > Makefile.tem
-rm -f ${Makefile} Multi.tem
-mv Makefile.tem ${Makefile}
-
-fi # ${ml_toplevel_p} = yes
-
-if [ "${ml_verbose}" = --verbose ]; then
-  echo "Adding multilib support to ${Makefile} in ${ml_realsrcdir}"
-  if [ "${ml_toplevel_p}" = yes ]; then
-    echo "multidirs=${multidirs}"
-  fi
-  echo "with_multisubdir=${with_multisubdir}"
-fi
-
-if [ "${srcdir}" = "." ]; then
-  if [ "${with_target_subdir}" != "." ]; then
-    ml_srcdotdot="../"
-  else
-    ml_srcdotdot=""
-  fi
-else
-  ml_srcdotdot=""
-fi
-
-if [ -z "${with_multisubdir}" ]; then
-  ml_subdir=
-  ml_builddotdot=
-  : # ml_srcdotdot= # already set
-else
-  ml_subdir="/${with_multisubdir}"
-  # The '[^/][^/]*' appears that way to work around a SunOS sed bug.
-  ml_builddotdot=`echo ${with_multisubdir} | sed -e 's:[^/][^/]*:..:g'`/
-  if [ "$srcdir" = "." ]; then
-    ml_srcdotdot=${ml_srcdotdot}${ml_builddotdot}
-  else
-    : # ml_srcdotdot= # already set
-  fi
-fi
-
-if [ "${ml_toplevel_p}" = yes ]; then
-  ml_do='$(MAKE)'
-  ml_clean='$(MAKE)'
-else
-  ml_do=true
-  ml_clean=true
-fi
-
-# TOP is used by newlib and should not be used elsewhere for this purpose.
-# MULTI{SRC,BUILD}TOP are the proper ones to use.  MULTISRCTOP is empty
-# when srcdir != builddir.  MULTIBUILDTOP is always some number of ../'s.
-# FIXME: newlib needs to be updated to use MULTI{SRC,BUILD}TOP so we can
-# delete TOP.  Newlib may wish to continue to use TOP for its own purposes
-# of course.
-# MULTIDIRS is non-empty for the cpu top level Makefile (eg: newlib/Makefile)
-# and lists the subdirectories to recurse into.
-# MULTISUBDIR is non-empty in each cpu subdirectory's Makefile
-# (eg: newlib/h8300h/Makefile) and is the installed subdirectory name with
-# a leading '/'.
-# MULTIDO is used for targets like all, install, and check where
-# $(FLAGS_TO_PASS) augmented with the subdir's compiler option is needed.
-# MULTICLEAN is used for the *clean targets.
-#
-# ??? It is possible to merge MULTIDO and MULTICLEAN into one.  They are
-# currently kept separate because we don't want the *clean targets to require
-# the existence of the compiler (which MULTIDO currently requires) and
-# therefore we'd have to record the directory options as well as names
-# (currently we just record the names and use --print-multi-lib to get the
-# options).
-
-sed -e "s:^TOP[ 	]*=[ 	]*\([./]*\)[ 	]*$:TOP = ${ml_builddotdot}\1:" \
-    -e "s:^MULTISRCTOP[ 	]*=.*$:MULTISRCTOP = ${ml_srcdotdot}:" \
-    -e "s:^MULTIBUILDTOP[ 	]*=.*$:MULTIBUILDTOP = ${ml_builddotdot}:" \
-    -e "s:^MULTIDIRS[ 	]*=.*$:MULTIDIRS = ${multidirs}:" \
-    -e "s:^MULTISUBDIR[ 	]*=.*$:MULTISUBDIR = ${ml_subdir}:" \
-    -e "s:^MULTIDO[ 	]*=.*$:MULTIDO = $ml_do:" \
-    -e "s:^MULTICLEAN[ 	]*=.*$:MULTICLEAN = $ml_clean:" \
-	${Makefile} > Makefile.tem
-rm -f ${Makefile}
-mv Makefile.tem ${Makefile}
-
-# If this is the library's top level, configure each multilib subdir.
-# This is done at the end because this is the loop that runs configure
-# in each multilib subdir and it seemed reasonable to finish updating the
-# Makefile before going on to configure the subdirs.
-
-if [ "${ml_toplevel_p}" = yes ]; then
-
-# We must freshly configure each subdirectory.  This bit of code is
-# actually partially stolen from the main configure script.  FIXME.
-
-if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
-
-  if [ "${ml_verbose}" = --verbose ]; then
-    echo "Running configure in multilib subdirs ${multidirs}"
-    echo "pwd: `${PWDCMD-pwd}`"
-  fi
-
-  ml_origdir=`${PWDCMD-pwd}`
-  ml_libdir=`echo "$ml_origdir" | sed -e 's,^.*/,,'`
-  # cd to top-level-build-dir/${with_target_subdir}
-  cd ..
-
-  for ml_dir in ${multidirs}; do
-
-    if [ "${ml_verbose}" = --verbose ]; then
-      echo "Running configure in multilib subdir ${ml_dir}"
-      echo "pwd: `${PWDCMD-pwd}`"
-    fi
-
-    if [ -d ${ml_dir} ]; then true; else
-      # ``mkdir -p ${ml_dir}'' See also mkinstalldirs.
-      pathcomp=""
-      for d in `echo ":${ml_dir}" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`; do
-        pathcomp="$pathcomp$d"
-        case "$pathcomp" in
-          -* ) pathcomp=./$pathcomp ;;
-        esac
-        if test ! -d "$pathcomp"; then
-           echo "mkdir $pathcomp" 1>&2
-           mkdir "$pathcomp" > /dev/null 2>&1 || lasterr=$?
-        fi
-        if test ! -d "$pathcomp"; then
-	   exit $lasterr
-        fi
-        pathcomp="$pathcomp/"
-      done
-    fi
-    if [ -d ${ml_dir}/${ml_libdir} ]; then true; else mkdir ${ml_dir}/${ml_libdir}; fi
-
-    # Eg: if ${ml_dir} = m68000/m68881, dotdot = ../../
-    dotdot=../`echo ${ml_dir} | sed -e 's|[^/]||g' -e 's|/|../|g'`
-
-    case ${srcdir} in
-    ".")
-      echo "Building symlink tree in `${PWDCMD-pwd}`/${ml_dir}/${ml_libdir}"
-      if [ "${with_target_subdir}" != "." ]; then
-	ml_unsubdir="../"
-      else
-	ml_unsubdir=""
-      fi
-      (cd ${ml_dir}/${ml_libdir};
-       ../${dotdot}${ml_unsubdir}symlink-tree ../${dotdot}${ml_unsubdir}${ml_libdir} "")
-      if [ -f ${ml_dir}/${ml_libdir}/${Makefile} ]; then
-	if [ x"${MAKE}" = x ]; then
-	  (cd ${ml_dir}/${ml_libdir}; make distclean)
-	else
-	  (cd ${ml_dir}/${ml_libdir}; ${MAKE} distclean)
-	fi
-      fi
-      ml_newsrcdir="."
-      ml_srcdiroption=
-      multisrctop=${dotdot}
-      ;;
-    *)
-      case "${srcdir}" in
-      /* | [A-Za-z]:[\\/]* ) # absolute path
-        ml_newsrcdir=${srcdir}
-        ;;
-      *) # otherwise relative
-        ml_newsrcdir=${dotdot}${srcdir}
-        ;;
-      esac
-      ml_srcdiroption="-srcdir=${ml_newsrcdir}"
-      multisrctop=
-      ;;
-    esac
-
-    case "${progname}" in
-    /* | [A-Za-z]:[\\/]* )     ml_recprog=${progname} ;;
-    *)      ml_recprog=${dotdot}${progname} ;;
-    esac
-
-    # FIXME: POPDIR=${PWD=`pwd`} doesn't work here.
-    ML_POPDIR=`${PWDCMD-pwd}`
-    cd ${ml_dir}/${ml_libdir}
-
-    if [ -f ${ml_newsrcdir}/configure ]; then
-      ml_recprog="${ml_newsrcdir}/configure"
-    fi
-
-    # find compiler flag corresponding to ${ml_dir}
-    for i in `${CC-gcc} --print-multi-lib 2>/dev/null`; do
-      dir=`echo $i | sed -e 's/;.*$//'`
-      if [ "${dir}" = "${ml_dir}" ]; then
-        flags=`echo $i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`
-        break
-      fi
-    done
-    ml_config_env='CC="${CC_}$flags" CXX="${CXX_}$flags" F77="${F77_}$flags" GCJ="${GCJ_}$flags" GFORTRAN="${GFORTRAN_}$flags" GOC="${GOC_}$flags"'
-
-    if [ "${with_target_subdir}" = "." ]; then
-	CC_=$CC' '
-	CXX_=$CXX' '
-	F77_=$F77' '
-	GCJ_=$GCJ' '
-	GFORTRAN_=$GFORTRAN' '
-	GOC_=$GOC' '
-    else
-	# Create a regular expression that matches any string as long
-	# as ML_POPDIR.
-	popdir_rx=`echo "${ML_POPDIR}" | sed 's,.,.,g'`
-	CC_=
-	for arg in ${CC}; do
-	  case $arg in
-	  -[BIL]"${ML_POPDIR}"/*)
-	    CC_="${CC_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\1/p"`' ' ;;
-	  "${ML_POPDIR}"/*)
-	    CC_="${CC_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
-	  *)
-	    CC_="${CC_}${arg} " ;;
-	  esac
-	done
-
-	CXX_=
-	for arg in ${CXX}; do
-	  case $arg in
-	  -[BIL]"${ML_POPDIR}"/*)
-	    CXX_="${CXX_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
-	  "${ML_POPDIR}"/*)
-	    CXX_="${CXX_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
-	  *)
-	    CXX_="${CXX_}${arg} " ;;
-	  esac
-	done
-
-	F77_=
-	for arg in ${F77}; do
-	  case $arg in
-	  -[BIL]"${ML_POPDIR}"/*)
-	    F77_="${F77_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
-	  "${ML_POPDIR}"/*)
-	    F77_="${F77_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
-	  *)
-	    F77_="${F77_}${arg} " ;;
-	  esac
-	done
-
-	GCJ_=
-	for arg in ${GCJ}; do
-	  case $arg in
-	  -[BIL]"${ML_POPDIR}"/*)
-	    GCJ_="${GCJ_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
-	  "${ML_POPDIR}"/*)
-	    GCJ_="${GCJ_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
-	  *)
-	    GCJ_="${GCJ_}${arg} " ;;
-	  esac
-	done
-
-	GFORTRAN_=
-	for arg in ${GFORTRAN}; do
-	  case $arg in
-	  -[BIL]"${ML_POPDIR}"/*)
-	    GFORTRAN_="${GFORTRAN_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
-	  "${ML_POPDIR}"/*)
-	    GFORTRAN_="${GFORTRAN_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
-	  *)
-	    GFORTRAN_="${GFORTRAN_}${arg} " ;;
-	  esac
-	done
-
-	GOC_=
-	for arg in ${GOC}; do
-	  case $arg in
-	  -[BIL]"${ML_POPDIR}"/*)
-	    GOC_="${GOC_}"`echo "X${arg}" | sed -n "s/X\\(-[BIL]${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X-[BIL]${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
-	  "${ML_POPDIR}"/*)
-	    GOC_="${GOC_}"`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`' ' ;;
-	  *)
-	    GOC_="${GOC_}${arg} " ;;
-	  esac
-	done
-
-	if test "x${LD_LIBRARY_PATH+set}" = xset; then
-	  LD_LIBRARY_PATH_=
-	  for arg in `echo "$LD_LIBRARY_PATH" | tr ':' ' '`; do
-	    case "$arg" in
-	    "${ML_POPDIR}"/*)
-	      arg=`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`
-	      ;;
-	    esac
-	    if test "x$LD_LIBRARY_PATH_" != x; then
-	      LD_LIBRARY_PATH_=$LD_LIBRARY_PATH_:$arg
-	    else
-	      LD_LIBRARY_PATH_=$arg
-	    fi
-          done
-	  ml_config_env="$ml_config_env LD_LIBRARY_PATH=$LD_LIBRARY_PATH_"
-	fi
-
-	if test "x${SHLIB_PATH+set}" = xset; then
-	  SHLIB_PATH_=
-	  for arg in `echo "$SHLIB_PATH" | tr ':' ' '`; do
-	    case "$arg" in
-	    "${ML_POPDIR}"/*)
-	      arg=`echo "X${arg}" | sed -n "s/X\\(${popdir_rx}\\).*/\\1/p"`/${ml_dir}`echo "X${arg}" | sed -n "s/X${popdir_rx}\\(.*\\)/\\1/p"`
-	      ;;
-	    esac
-	    if test "x$SHLIB_PATH_" != x; then
-	      SHLIB_PATH_=$SHLIB_PATH_:$arg
-	    else
-	      SHLIB_PATH_=$arg
-	    fi
-          done
-	  ml_config_env="$ml_config_env SHLIB_PATH=$SHLIB_PATH_"
-	fi
-    fi
-
-    if eval ${ml_config_env} ${ml_config_shell} ${ml_recprog} \
-	--with-multisubdir=${ml_dir} --with-multisrctop=${multisrctop} \
-	"${ac_configure_args}" ${ml_config_env} ${ml_srcdiroption} ; then
-      true
-    else
-      exit 1
-    fi
-
-    cd "${ML_POPDIR}"
-
-  done
-
-  cd "${ml_origdir}"
-fi
-
-fi # ${ml_toplevel_p} = yes
-fi # ${enable_multilib} = yes
diff --git a/third_party/gofrontend/config.guess b/third_party/gofrontend/config.guess
deleted file mode 100755
index 8bf4226..0000000
--- a/third_party/gofrontend/config.guess
+++ /dev/null
@@ -1,1532 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011 Free Software Foundation, Inc.
-
-timestamp='2011-08-20'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
-Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-	PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-	# switched to ELF, *-*-netbsd* would select the old
-	# object file format.  This provides both forward
-	# compatibility and a consistent mechanism for selecting the
-	# object file format.
-	#
-	# Note: NetBSD doesn't particularly care about the vendor
-	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
-	    armeb) machine=armeb-unknown ;;
-	    arm*) machine=arm-unknown ;;
-	    sh3el) machine=shl-unknown ;;
-	    sh3eb) machine=sh-unknown ;;
-	    sh5el) machine=sh5le-unknown ;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-	esac
-	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep -q __ELF__
-		then
-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-		    # Return netbsd for either.  FIX?
-		    os=netbsd
-		else
-		    os=netbsdelf
-		fi
-		;;
-	    *)
-		os=netbsd
-		;;
-	esac
-	# The OS release
-	# Debian GNU/NetBSD machines have a different userland, and
-	# thus, need a distinct triplet. However, they do not need
-	# kernel version information, so it can be replaced with a
-	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
-	    Debian*)
-		release='-gnu'
-		;;
-	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-		;;
-	esac
-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-	# contains redundant information, the shorter form:
-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
-	exit ;;
-    *:OpenBSD:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
-    *:Bitrig:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
-	exit ;;
-    *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
-    *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-	exit ;;
-    macppc:MirBSD:*:*)
-	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    alpha:OSF1:*:*)
-	case $UNAME_RELEASE in
-	*4.0)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-		;;
-	*5.*)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-		;;
-	esac
-	# According to Compaq, /usr/sbin/psrinfo has been available on
-	# OSF/1 and Tru64 systems produced since 1995.  I hope that
-	# covers most systems running today.  This code pipes the CPU
-	# types through head -n 1, so we only detect the type of CPU 0.
-	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
-	case "$ALPHA_CPU_TYPE" in
-	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
-	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
-	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
-	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
-	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
-	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
-	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
-	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
-	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
-	esac
-	# A Pn.n version is a patched version.
-	# A Vn.n version is a released version.
-	# A Tn.n version is a released field test version.
-	# A Xn.n version is an unreleased experimental baselevel.
-	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
-	exitcode=$?
-	trap '' 0
-	exit $exitcode ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
-    *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
-    *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
-    *:OS400:*:*)
-	echo powerpc-ibm-os400
-	exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
-    NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
-    DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
-    s390x:SunOS:*:*)
-	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
-	echo i386-pc-auroraux${UNAME_RELEASE}
-	exit ;;
-    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-	eval $set_cc_for_build
-	SUN_ARCH="i386"
-	# If there is a compiler, see if it is configured for 64-bit objects.
-	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
-	# This test works for both compilers.
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		grep IS_64BIT_ARCH >/dev/null
-	    then
-		SUN_ARCH="x86_64"
-	    fi
-	fi
-	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:6*:*)
-	# According to config.sub, this is the proper way to canonicalize
-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
-	    Series*|S4*)
-		UNAME_RELEASE=`uname -v`
-		;;
-	esac
-	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
-    sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	exit ;;
-    sun*:*:4.2BSD:*)
-	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
-	case "`/bin/arch`" in
-	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
-		;;
-	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
-		;;
-	esac
-	exit ;;
-    aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-	echo m68k-milan-mint${UNAME_RELEASE}
-	exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-	echo m68k-hades-mint${UNAME_RELEASE}
-	exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-	echo m68k-unknown-mint${UNAME_RELEASE}
-	exit ;;
-    m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
-    powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
-    RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
-    RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-	#if defined (host_mips) && defined (MIPSEB)
-	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-	#endif
-	#endif
-	  exit (-1);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
-	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
-    Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
-    Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
-    m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
-    m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
-    m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
-    AViiON:dgux:*:*)
-	# DG/UX returns AViiON for all architectures
-	UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
-	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
-	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
-	    fi
-	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
-	fi
-	exit ;;
-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
-    M88*:*:R3*:*)
-	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
-    *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
-    ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:2:3)
-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
-		#include <sys/systemcfg.h>
-
-		main()
-			{
-			if (!__power_pc())
-				exit(1);
-			puts("powerpc-ibm-aix3.2.5");
-			exit(0);
-			}
-EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-		then
-			echo "$SYSTEM_NAME"
-		else
-			echo rs6000-ibm-aix3.2.5
-		fi
-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
-	else
-		echo rs6000-ibm-aix3.2
-	fi
-	exit ;;
-    *:AIX:*:[4567])
-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-		IBM_ARCH=rs6000
-	else
-		IBM_ARCH=powerpc
-	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
-    DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
-    9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
-	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
-		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-		    case "${sc_cpu_version}" in
-		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-		      532)                      # CPU_PA_RISC2_0
-			case "${sc_kernel_bits}" in
-			  32) HP_ARCH="hppa2.0n" ;;
-			  64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-			esac ;;
-		    esac
-		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^		//' << EOF >$dummy.c
-
-		#define _HPUX_SOURCE
-		#include <stdlib.h>
-		#include <unistd.h>
-
-		int main ()
-		{
-		#if defined(_SC_KERNEL_BITS)
-		    long bits = sysconf(_SC_KERNEL_BITS);
-		#endif
-		    long cpu  = sysconf (_SC_CPU_VERSION);
-
-		    switch (cpu)
-			{
-			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-			case CPU_PA_RISC2_0:
-		#if defined(_SC_KERNEL_BITS)
-			    switch (bits)
-				{
-				case 64: puts ("hppa2.0w"); break;
-				case 32: puts ("hppa2.0n"); break;
-				default: puts ("hppa2.0"); break;
-				} break;
-		#else  /* !defined(_SC_KERNEL_BITS) */
-			    puts ("hppa2.0"); break;
-		#endif
-			default: puts ("hppa1.0"); break;
-			}
-		    exit (0);
-		}
-EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
-		    test -z "$HP_ARCH" && HP_ARCH=hppa
-		fi ;;
-	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
-	then
-	    eval $set_cc_for_build
-
-	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-	    # generating 64-bit code.  GNU and HP use different nomenclature:
-	    #
-	    # $ CC_FOR_BUILD=cc ./config.guess
-	    # => hppa2.0w-hp-hpux11.23
-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-	    # => hppa64-hp-hpux11.23
-
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep -q __LP64__
-	    then
-		HP_ARCH="hppa2.0w"
-	    else
-		HP_ARCH="hppa64"
-	    fi
-	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
-    3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <unistd.h>
-	int
-	main ()
-	{
-	  long cpu = sysconf (_SC_CPU_VERSION);
-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-	     results, however.  */
-	  if (CPU_IS_PA_RISC (cpu))
-	    {
-	      switch (cpu)
-		{
-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-		  default: puts ("hppa-hitachi-hiuxwe2"); break;
-		}
-	    }
-	  else if (CPU_IS_HP_MC68K (cpu))
-	    puts ("m68k-hitachi-hiuxwe2");
-	  else puts ("unknown-hitachi-hiuxwe2");
-	  exit (0);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
-    9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
-    hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
-    i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
-	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
-	fi
-	exit ;;
-    parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-	exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-	exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-	exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-	exit ;;
-    CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-	      -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    *:UNICOS/mp:*:*)
-	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    5000:UNIX_System_V:4.*:*)
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
-    sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:FreeBSD:*:*)
-	UNAME_PROCESSOR=`/usr/bin/uname -p`
-	case ${UNAME_PROCESSOR} in
-	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	esac
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    *:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    *:MSYS*:*)
-	echo ${UNAME_MACHINE}-pc-msys
-	exit ;;
-    i*:windows32*:*)
-	# uname -m includes "-pc" on this system.
-	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    *:Interix*:*)
-	case ${UNAME_MACHINE} in
-	    x86)
-		echo i586-pc-interix${UNAME_RELEASE}
-		exit ;;
-	    authenticamd | genuineintel | EM64T)
-		echo x86_64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	    IA64)
-		echo ia64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	esac ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    8664:Windows_NT:*)
-	echo x86_64-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
-    i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
-    prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    *:GNU:*:*)
-	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	exit ;;
-    *:GNU/*:*:*)
-	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    aarch64*:Linux:*)
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-	esac
-	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit ;;
-    arm*:Linux:*:*)
-	eval $set_cc_for_build
-	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
-	    | grep -q __ARM_EABI__
-	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
-	else
-	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
-		| grep -q __ARM_PCS_VFP
-	    then
-		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
-	    else
-		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
-	    fi
-	fi
-	exit ;;
-    avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    cris:Linux:*:*)
-	echo cris-axis-linux-gnu
-	exit ;;
-    crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
-	exit ;;
-    frv:Linux:*:*)
-	echo frv-unknown-linux-gnu
-	exit ;;
-    i*86:Linux:*:*)
-	LIBC=gnu
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    mips:Linux:*:* | mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef ${UNAME_MACHINE}
-	#undef ${UNAME_MACHINE}el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=${UNAME_MACHINE}el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=${UNAME_MACHINE}
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
-	exit ;;
-    padre:Linux:*:*)
-	echo sparc-unknown-linux-gnu
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
-	exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-	# Look for CPU level
-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
-	esac
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
-	exit ;;
-    ppc64le:Linux:*:*)
-	echo powerpc64le-unknown-linux-gnu
-	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
-	exit ;;
-    sh64*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    tile*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
-	exit ;;
-    x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
-	exit ;;
-    xtensa*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    i*86:DYNIX/ptx:4*:*)
-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-	# earlier versions are messed up and put the nodename in both
-	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-	# Unixware is an offshoot of SVR4, but it has its own version
-	# number series starting with 2...
-	# I am not positive that other SVR4 systems won't match this,
-	# I just have to hope.  -- rms.
-	# Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
-    i*86:OS/2:*:*)
-	# If we were able to find `uname', then EMX Unix compatibility
-	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
-    i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
-    i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
-    i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-	fi
-	exit ;;
-    i*86:*:5:[678]*)
-	# UnixWare 7.x, OpenUNIX and OpenServer 6.
-	case `/bin/uname -X | grep "^Machine"` in
-	    *486*)	     UNAME_MACHINE=i486 ;;
-	    *Pentium)	     UNAME_MACHINE=i586 ;;
-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
-    i*86:*:3.2:*)
-	if test -f /usr/options/cb.name; then
-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-	elif /bin/uname -X 2>/dev/null >/dev/null ; then
-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-			&& UNAME_MACHINE=i586
-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-	else
-		echo ${UNAME_MACHINE}-pc-sysv32
-	fi
-	exit ;;
-    pc:*:*:*)
-	# Left here for compatibility:
-	# uname -m prints for DJGPP always 'pc', but it prints nothing about
-	# the processor, so we play safe by assuming i586.
-	# Note: whatever this is, it MUST be the same as what config.sub
-	# prints for the "djgpp" host, or else GDB configury will decide that
-	# this is a cross-build.
-	echo i586-pc-msdosdjgpp
-	exit ;;
-    Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
-    paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
-    i860:*:4.*:*) # i860-SVR4
-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-	fi
-	exit ;;
-    mini*:CTIX:SYS*5:*)
-	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
-    M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
-    M68*:*:R3V[5678]*:*)
-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-	OS_REL=''
-	test -r /etc/.relid \
-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4; exit; } ;;
-    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
-	OS_REL='.3'
-	test -r /etc/.relid \
-	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
-    RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    *:SINIX-*:*:*)
-	if uname -p 2>/dev/null >/dev/null ; then
-		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
-	else
-		echo ns32k-sni-sysv
-	fi
-	exit ;;
-    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-			# says <Richard.M.Bartel@ccMail.Census.GOV>
-	echo i586-unisys-sysv4
-	exit ;;
-    *:UNIX_System_V:4*:FTX*)
-	# From Gerald Hewes <hewes@openmarket.com>.
-	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
-    *:*:*:FTX*)
-	# From seanf@swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
-    i*86:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
-    *:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
-    mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
-    news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-		echo mips-nec-sysv${UNAME_RELEASE}
-	else
-		echo mips-unknown-sysv${UNAME_RELEASE}
-	fi
-	exit ;;
-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
-    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
-	echo i586-pc-haiku
-	exit ;;
-    x86_64:Haiku:*:*) # Haiku running on x86_64.
-	echo x86_64-unknown-haiku
-	exit ;;
-    SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-7:SUPER-UX:*:*)
-	echo sx7-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8:SUPER-UX:*:*)
-	echo sx8-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8R:SUPER-UX:*:*)
-	echo sx8r-nec-superux${UNAME_RELEASE}
-	exit ;;
-    Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    i386)
-		eval $set_cc_for_build
-		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		      grep IS_64BIT_ARCH >/dev/null
-		  then
-		      UNAME_PROCESSOR="x86_64"
-		  fi
-		fi ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
-	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
-    *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NEO-?:NONSTOP_KERNEL:*:*)
-	echo neo-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
-    BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
-    DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
-    *:Plan9:*:*)
-	# "uname -m" is not consistent, so use $cputype instead. 386
-	# is converted to i386 for consistency with other x86
-	# operating systems.
-	if test "$cputype" = "386"; then
-	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
-	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
-    *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
-    *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
-    *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
-    *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
-    SEI:*:*:SEIUX)
-	echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
-    *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    *:*VMS:*:*)
-	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
-	esac ;;
-    *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
-    i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
-    i*86:rdos:*:*)
-	echo ${UNAME_MACHINE}-pc-rdos
-	exit ;;
-    i*86:AROS:*:*)
-	echo ${UNAME_MACHINE}-pc-aros
-	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-	"4"
-#else
-	""
-#endif
-	); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/third_party/gofrontend/config.sub b/third_party/gofrontend/config.sub
deleted file mode 100755
index 2583c90..0000000
--- a/third_party/gofrontend/config.sub
+++ /dev/null
@@ -1,1770 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011 Free Software Foundation, Inc.
-
-timestamp='2011-11-02'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
-Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
-  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
-  kopensolaris*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze)
-		os=
-		basic_machine=$1
-		;;
-	-bluegene*)
-		os=-cnk
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
-	-chorusrdb)
-		os=-chorusrdb
-		basic_machine=$1
-		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-   | aarch64 | aarch64_be \
-   | be32 | be64 \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| fido | fr30 | frv \
-	| hexagon \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| le32 | le64 \
-	| lm32 \
-	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep | metag \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64octeon | mips64octeonel \
-	| mips64orion | mips64orionel \
-	| mips64r5900 | mips64r5900el \
-	| mips64vr | mips64vrel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| moxie \
-	| mt \
-	| msp430 \
-	| nds32 | nds32le | nds32be \
-	| nios | nios2 \
-	| ns16k | ns32k \
-	| open8 \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle \
-	| pyramid \
-	| rx \
-	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu \
-	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
-	| ubicom32 \
-	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
-	| we32k \
-	| x86 | xc16x | xstormy16 | xtensa \
-	| z8k | z80)
-		basic_machine=$basic_machine-unknown
-		;;
-	c54x)
-		basic_machine=tic54x-unknown
-		;;
-	c55x)
-		basic_machine=tic55x-unknown
-		;;
-	c6x)
-		basic_machine=tic6x-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
-		# Motorola 68HC11/12.
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	strongarm | thumb | xscale)
-		basic_machine=arm-unknown
-		;;
-
-	xscaleeb)
-		basic_machine=armeb-unknown
-		;;
-
-	xscaleel)
-		basic_machine=armel-unknown
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-   | aarch64-* | aarch64_be-* \
-	| avr-* | avr32-* \
-	| be32-* | be64-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hexagon-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| le32-* | le64-* \
-	| lm32-* \
-	| m32c-* | m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64octeon-* | mips64octeonel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64r5900-* | mips64r5900el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nds32-* | nds32le-* | nds32be-* \
-	| nios-* | nios2-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| open8-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
-	| pyramid-* \
-	| romp-* | rs6000-* | rx-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
-	| tahoe-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tile*-* \
-	| tron-* \
-	| ubicom32-* \
-	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
-	| vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* \
-	| xstormy16-* | xtensa*-* \
-	| ymp-* \
-	| z8k-* | z80-*)
-		;;
-	# Recognize the basic CPU types without company name, with glob match.
-	xtensa*)
-		basic_machine=$basic_machine-unknown
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aros)
-		basic_machine=i386-pc
-		os=-aros
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	blackfin)
-		basic_machine=bfin-unknown
-		os=-linux
-		;;
-	blackfin-*)
-		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	bluegene*)
-		basic_machine=powerpc-ibm
-		os=-cnk
-		;;
-	c54x-*)
-		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c55x-*)
-		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c6x-*)
-		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-	cegcc)
-		basic_machine=arm-unknown
-		os=-cegcc
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16 | cr16-*)
-		basic_machine=cr16-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	dicos)
-		basic_machine=i686-pc
-		os=-dicos
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m68knommu)
-		basic_machine=m68k-unknown
-		os=-linux
-		;;
-	m68knommu-*)
-		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-	microblaze)
-		basic_machine=microblaze-xilinx
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	mingw32ce)
-		basic_machine=arm-unknown
-		os=-mingw32ce
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	nacl)
-		basic_machine=le32-unknown
-		os=-nacl
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	neo-tandem)
-		basic_machine=neo-tandem
-		;;
-	nse-tandem)
-		basic_machine=nse-tandem
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	parisc)
-		basic_machine=hppa-unknown
-		os=-linux
-		;;
-	parisc-*)
-		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
-		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc | ppcbe)	basic_machine=powerpc-unknown
-		;;
-	ppc-* | ppcbe-*)
-		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sde)
-		basic_machine=mipsisa32-sde
-		os=-elf
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh5el)
-		basic_machine=sh5le-unknown
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	strongarm-* | thumb-*)
-		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-	tile*)
-		basic_machine=$basic_machine-unknown
-		os=-linux-gnu
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	xscale-* | xscalee[bl]-*)
-		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	z80-*-coff)
-		basic_machine=z80-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-	# First match some system type aliases
-	# that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-	-auroraux)
-		os=-auroraux
-		;;
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-android* \
-	      | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -bitrig*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-	-os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-	-tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-dicos*)
-		os=-dicos
-		;;
-	-nacl*)
-		;;
-	-ps4)
-		;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-	score-*)
-		os=-elf
-		;;
-	spu-*)
-		os=-elf
-		;;
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-	c4x-* | tic4x-*)
-		os=-coff
-		;;
-	tic54x-*)
-		os=-coff
-		;;
-	tic55x-*)
-		os=-coff
-		;;
-	tic6x-*)
-		os=-coff
-		;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-	mep-*)
-		os=-elf
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-cnk*|-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/third_party/gofrontend/depcomp b/third_party/gofrontend/depcomp
deleted file mode 100644
index 4e70ff0..0000000
--- a/third_party/gofrontend/depcomp
+++ /dev/null
@@ -1,756 +0,0 @@
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2013-05-30.07; # UTC
-
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
-
-case $1 in
-  '')
-    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
-    exit 1;
-    ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
-  depmode     Dependency tracking mode.
-  source      Source file read by 'PROGRAMS ARGS'.
-  object      Object file output by 'PROGRAMS ARGS'.
-  DEPDIR      directory where to store dependencies.
-  depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputting dependencies.
-  libtool     Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "depcomp $scriptversion"
-    exit $?
-    ;;
-esac
-
-# Get the directory component of the given path, and save it in the
-# global variables '$dir'.  Note that this directory component will
-# be either empty or ending with a '/' character.  This is deliberate.
-set_dir_from ()
-{
-  case $1 in
-    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
-      *) dir=;;
-  esac
-}
-
-# Get the suffix-stripped basename of the given path, and save it the
-# global variable '$base'.
-set_base_from ()
-{
-  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
-}
-
-# If no dependency file was actually created by the compiler invocation,
-# we still have to create a dummy depfile, to avoid errors with the
-# Makefile "include basename.Plo" scheme.
-make_dummy_depfile ()
-{
-  echo "#dummy" > "$depfile"
-}
-
-# Factor out some common post-processing of the generated depfile.
-# Requires the auxiliary global variable '$tmpdepfile' to be set.
-aix_post_process_depfile ()
-{
-  # If the compiler actually managed to produce a dependency file,
-  # post-process it.
-  if test -f "$tmpdepfile"; then
-    # Each line is of the form 'foo.o: dependency.h'.
-    # Do two passes, one to just change these to
-    #   $object: dependency.h
-    # and one to simply output
-    #   dependency.h:
-    # which is needed to avoid the deleted-header problem.
-    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
-      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
-    } > "$depfile"
-    rm -f "$tmpdepfile"
-  else
-    make_dummy_depfile
-  fi
-}
-
-# A tabulation character.
-tab='	'
-# A newline character.
-nl='
-'
-# Character ranges might be problematic outside the C locale.
-# These definitions help.
-upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
-lower=abcdefghijklmnopqrstuvwxyz
-digits=0123456789
-alpha=${upper}${lower}
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
-  echo "depcomp: Variables source, object and depmode must be set" 1>&2
-  exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
-  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Avoid interferences from the environment.
-gccflag= dashmflag=
-
-# Some modes work just like other modes, but use different flags.  We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write.  Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
-  # HP compiler uses -M and no extra arg.
-  gccflag=-M
-  depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
-  # This is just like dashmstdout with a different argument.
-  dashmflag=-xM
-  depmode=dashmstdout
-fi
-
-cygpath_u="cygpath -u -f -"
-if test "$depmode" = msvcmsys; then
-  # This is just like msvisualcpp but w/o cygpath translation.
-  # Just convert the backslash-escaped backslashes to single forward
-  # slashes to satisfy depend.m4
-  cygpath_u='sed s,\\\\,/,g'
-  depmode=msvisualcpp
-fi
-
-if test "$depmode" = msvc7msys; then
-  # This is just like msvc7 but w/o cygpath translation.
-  # Just convert the backslash-escaped backslashes to single forward
-  # slashes to satisfy depend.m4
-  cygpath_u='sed s,\\\\,/,g'
-  depmode=msvc7
-fi
-
-if test "$depmode" = xlc; then
-  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
-  gccflag=-qmakedep=gcc,-MF
-  depmode=gcc
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff.  Hmm.
-## Unfortunately, FreeBSD c89 acceptance of flags depends upon
-## the command line argument order; so add the flags where they
-## appear in depend2.am.  Note that the slowdown incurred here
-## affects only configure: in makefiles, %FASTDEP% shortcuts this.
-  for arg
-  do
-    case $arg in
-    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
-    *)  set fnord "$@" "$arg" ;;
-    esac
-    shift # fnord
-    shift # $arg
-  done
-  "$@"
-  stat=$?
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  mv "$tmpdepfile" "$depfile"
-  ;;
-
-gcc)
-## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
-## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
-## (see the conditional assignment to $gccflag above).
-## There are various ways to get dependency output from gcc.  Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-##   up in a subdir.  Having to rename by hand is ugly.
-##   (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).  Also, it might not be
-##   supported by the other compilers which use the 'gcc' depmode.
-## - Using -M directly means running the compiler twice (even worse
-##   than renaming).
-  if test -z "$gccflag"; then
-    gccflag=-MD,
-  fi
-  "$@" -Wp,"$gccflag$tmpdepfile"
-  stat=$?
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  # The second -e expression handles DOS-style file names with drive
-  # letters.
-  sed -e 's/^[^:]*: / /' \
-      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the "deleted header file" problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header).  We avoid this by adding
-## dummy dependencies for each header file.  Too bad gcc doesn't do
-## this for us directly.
-## Some versions of gcc put a space before the ':'.  On the theory
-## that the space means something, we add a space to the output as
-## well.  hp depmode also adds that space, but also prefixes the VPATH
-## to the object.  Take care to not repeat it in the output.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-  tr ' ' "$nl" < "$tmpdepfile" \
-    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
-    | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-xlc)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-aix)
-  # The C for AIX Compiler uses -M and outputs the dependencies
-  # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts '$object:' at the
-  # start of each line; $object doesn't have directory information.
-  # Version 6 uses the directory in both cases.
-  set_dir_from "$object"
-  set_base_from "$object"
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$base.u
-    tmpdepfile3=$dir.libs/$base.u
-    "$@" -Wc,-M
-  else
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$dir$base.u
-    tmpdepfile3=$dir$base.u
-    "$@" -M
-  fi
-  stat=$?
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-    exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  aix_post_process_depfile
-  ;;
-
-tcc)
-  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
-  # FIXME: That version still under development at the moment of writing.
-  #        Make that this statement remains true also for stable, released
-  #        versions.
-  # It will wrap lines (doesn't matter whether long or short) with a
-  # trailing '\', as in:
-  #
-  #   foo.o : \
-  #    foo.c \
-  #    foo.h \
-  #
-  # It will put a trailing '\' even on the last line, and will use leading
-  # spaces rather than leading tabs (at least since its commit 0394caf7
-  # "Emit spaces for -MD").
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
-  # We have to change lines of the first kind to '$object: \'.
-  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
-  # And for each line of the second kind, we have to emit a 'dep.h:'
-  # dummy dependency, to avoid the deleted-header problem.
-  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-## The order of this option in the case statement is important, since the
-## shell code in configure will try each of these formats in the order
-## listed in this file.  A plain '-MD' option would be understood by many
-## compilers, so we must ensure this comes after the gcc and icc options.
-pgcc)
-  # Portland's C compiler understands '-MD'.
-  # Will always output deps to 'file.d' where file is the root name of the
-  # source file under compilation, even if file resides in a subdirectory.
-  # The object file name does not affect the name of the '.d' file.
-  # pgcc 10.2 will output
-  #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using '\' :
-  #    foo.o: sub/foo.c ... \
-  #     sub/foo.h ... \
-  #     ...
-  set_dir_from "$object"
-  # Use the source, not the object, to determine the base name, since
-  # that's sadly what pgcc will do too.
-  set_base_from "$source"
-  tmpdepfile=$base.d
-
-  # For projects that build the same source file twice into different object
-  # files, the pgcc approach of using the *source* file root name can cause
-  # problems in parallel builds.  Use a locking strategy to avoid stomping on
-  # the same $tmpdepfile.
-  lockdir=$base.d-lock
-  trap "
-    echo '$0: caught signal, cleaning up...' >&2
-    rmdir '$lockdir'
-    exit 1
-  " 1 2 13 15
-  numtries=100
-  i=$numtries
-  while test $i -gt 0; do
-    # mkdir is a portable test-and-set.
-    if mkdir "$lockdir" 2>/dev/null; then
-      # This process acquired the lock.
-      "$@" -MD
-      stat=$?
-      # Release the lock.
-      rmdir "$lockdir"
-      break
-    else
-      # If the lock is being held by a different process, wait
-      # until the winning process is done or we timeout.
-      while test -d "$lockdir" && test $i -gt 0; do
-        sleep 1
-        i=`expr $i - 1`
-      done
-    fi
-    i=`expr $i - 1`
-  done
-  trap - 1 2 13 15
-  if test $i -le 0; then
-    echo "$0: failed to acquire lock after $numtries attempts" >&2
-    echo "$0: check lockdir '$lockdir'" >&2
-    exit 1
-  fi
-
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each line is of the form `foo.o: dependent.h',
-  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
-  # Do two passes, one to just change these to
-  # `$object: dependent.h' and one to simply `dependent.h:'.
-  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
-    | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp2)
-  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
-  # compilers, which have integrated preprocessors.  The correct option
-  # to use with these is +Maked; it writes dependencies to a file named
-  # 'foo.d', which lands next to the object file, wherever that
-  # happens to be.
-  # Much of this is similar to the tru64 case; see comments there.
-  set_dir_from  "$object"
-  set_base_from "$object"
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir.libs/$base.d
-    "$@" -Wc,+Maked
-  else
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir$base.d
-    "$@" +Maked
-  fi
-  stat=$?
-  if test $stat -ne 0; then
-     rm -f "$tmpdepfile1" "$tmpdepfile2"
-     exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add 'dependent.h:' lines.
-    sed -ne '2,${
-               s/^ *//
-               s/ \\*$//
-               s/$/:/
-               p
-             }' "$tmpdepfile" >> "$depfile"
-  else
-    make_dummy_depfile
-  fi
-  rm -f "$tmpdepfile" "$tmpdepfile2"
-  ;;
-
-tru64)
-  # The Tru64 compiler uses -MD to generate dependencies as a side
-  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
-  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-  # dependencies in 'foo.d' instead, so we check for that too.
-  # Subdirectories are respected.
-  set_dir_from  "$object"
-  set_base_from "$object"
-
-  if test "$libtool" = yes; then
-    # Libtool generates 2 separate objects for the 2 libraries.  These
-    # two compilations output dependencies in $dir.libs/$base.o.d and
-    # in $dir$base.o.d.  We have to check for both files, because
-    # one of the two compilations can be disabled.  We should prefer
-    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-    # automatically cleaned when .libs/ is deleted, while ignoring
-    # the former would cause a distcleancheck panic.
-    tmpdepfile1=$dir$base.o.d          # libtool 1.5
-    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
-    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
-    "$@" -Wc,-MD
-  else
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir$base.d
-    tmpdepfile3=$dir$base.d
-    "$@" -MD
-  fi
-
-  stat=$?
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-    exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  # Same post-processing that is required for AIX mode.
-  aix_post_process_depfile
-  ;;
-
-msvc7)
-  if test "$libtool" = yes; then
-    showIncludes=-Wc,-showIncludes
-  else
-    showIncludes=-showIncludes
-  fi
-  "$@" $showIncludes > "$tmpdepfile"
-  stat=$?
-  grep -v '^Note: including file: ' "$tmpdepfile"
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  # The first sed program below extracts the file names and escapes
-  # backslashes for cygpath.  The second sed program outputs the file
-  # name when reading, but also accumulates all include files in the
-  # hold buffer in order to output them again at the end.  This only
-  # works with sed implementations that can handle large buffers.
-  sed < "$tmpdepfile" -n '
-/^Note: including file:  *\(.*\)/ {
-  s//\1/
-  s/\\/\\\\/g
-  p
-}' | $cygpath_u | sort -u | sed -n '
-s/ /\\ /g
-s/\(.*\)/'"$tab"'\1 \\/p
-s/.\(.*\) \\/\1:/
-H
-$ {
-  s/.*/'"$tab"'/
-  G
-  p
-}' >> "$depfile"
-  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
-  rm -f "$tmpdepfile"
-  ;;
-
-msvc7msys)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-#nosideeffect)
-  # This comment above is used by automake to tell side-effect
-  # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove '-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for ':'
-  # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
-  "$@" $dashmflag |
-    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this sed invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  tr ' ' "$nl" < "$tmpdepfile" \
-    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
-    | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-dashXmstdout)
-  # This case only exists to satisfy depend.m4.  It is never actually
-  # run, as this mode is specially recognized in the preamble.
-  exit 1
-  ;;
-
-makedepend)
-  "$@" || exit $?
-  # Remove any Libtool call
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-  # X makedepend
-  shift
-  cleared=no eat=no
-  for arg
-  do
-    case $cleared in
-    no)
-      set ""; shift
-      cleared=yes ;;
-    esac
-    if test $eat = yes; then
-      eat=no
-      continue
-    fi
-    case "$arg" in
-    -D*|-I*)
-      set fnord "$@" "$arg"; shift ;;
-    # Strip any option that makedepend may not understand.  Remove
-    # the object too, otherwise makedepend will parse it as a source file.
-    -arch)
-      eat=yes ;;
-    -*|$object)
-      ;;
-    *)
-      set fnord "$@" "$arg"; shift ;;
-    esac
-  done
-  obj_suffix=`echo "$object" | sed 's/^.*\././'`
-  touch "$tmpdepfile"
-  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
-  rm -f "$depfile"
-  # makedepend may prepend the VPATH from the source file name to the object.
-  # No need to regex-escape $object, excess matching of '.' is harmless.
-  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process the last invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed '1,2d' "$tmpdepfile" \
-    | tr ' ' "$nl" \
-    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
-    | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile" "$tmpdepfile".bak
-  ;;
-
-cpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove '-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  "$@" -E \
-    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-    | sed '$ s: \\$::' > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  cat < "$tmpdepfile" >> "$depfile"
-  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvisualcpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  IFS=" "
-  for arg
-  do
-    case "$arg" in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-        set fnord "$@"
-        shift
-        shift
-        ;;
-    *)
-        set fnord "$@" "$arg"
-        shift
-        shift
-        ;;
-    esac
-  done
-  "$@" -E 2>/dev/null |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
-  echo "$tab" >> "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvcmsys)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-none)
-  exec "$@"
-  ;;
-
-*)
-  echo "Unknown depmode $depmode" 1>&2
-  exit 1
-  ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/third_party/gofrontend/include/dwarf2.def b/third_party/gofrontend/include/dwarf2.def
deleted file mode 100644
index e69de29..0000000
--- a/third_party/gofrontend/include/dwarf2.def
+++ /dev/null
diff --git a/third_party/gofrontend/include/dwarf2.h b/third_party/gofrontend/include/dwarf2.h
deleted file mode 100644
index 9824fc0..0000000
--- a/third_party/gofrontend/include/dwarf2.h
+++ /dev/null
@@ -1,93 +0,0 @@
-//===----------------------------- dwarf2.h -------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-// DWARF constants. Derived from:
-//   - libcxxabi/src/Unwind/dwarf2.h
-//   - DWARF 4 specification
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef DWARF2_H
-#define DWARF2_H
-
-enum dwarf_attribute {
-  DW_AT_name = 0x03,
-  DW_AT_stmt_list = 0x10,
-  DW_AT_low_pc = 0x11,
-  DW_AT_high_pc = 0x12,
-  DW_AT_comp_dir = 0x1b,
-  DW_AT_abstract_origin = 0x31,
-  DW_AT_specification = 0x47,
-  DW_AT_ranges = 0x55,
-  DW_AT_call_file = 0x58,
-  DW_AT_call_line = 0x59,
-  DW_AT_linkage_name = 0x6e,
-  DW_AT_MIPS_linkage_name = 0x2007
-};
-
-enum dwarf_form {
-  DW_FORM_addr = 0x01,
-  DW_FORM_block2 = 0x03,
-  DW_FORM_block4 = 0x04,
-  DW_FORM_data2 = 0x05,
-  DW_FORM_data4 = 0x06,
-  DW_FORM_data8 = 0x07,
-  DW_FORM_string = 0x08,
-  DW_FORM_block = 0x09,
-  DW_FORM_block1 = 0x0a,
-  DW_FORM_data1 = 0x0b,
-  DW_FORM_flag = 0x0c,
-  DW_FORM_sdata = 0x0d,
-  DW_FORM_strp = 0x0e,
-  DW_FORM_udata = 0x0f,
-  DW_FORM_ref_addr = 0x10,
-  DW_FORM_ref1 = 0x11,
-  DW_FORM_ref2 = 0x12,
-  DW_FORM_ref4 = 0x13,
-  DW_FORM_ref8 = 0x14,
-  DW_FORM_ref_udata = 0x15,
-  DW_FORM_indirect = 0x16,
-  DW_FORM_sec_offset = 0x17,
-  DW_FORM_exprloc = 0x18,
-  DW_FORM_flag_present = 0x19,
-  DW_FORM_ref_sig8 = 0x20,
-  DW_FORM_GNU_addr_index = 0x1f01,
-  DW_FORM_GNU_str_index = 0x1f02,
-  DW_FORM_GNU_ref_alt = 0x1f20,
-  DW_FORM_GNU_strp_alt = 0x1f21
-};
-
-enum dwarf_tag {
-  DW_TAG_entry_point = 0x03,
-  DW_TAG_compile_unit = 0x11,
-  DW_TAG_inlined_subroutine = 0x1d,
-  DW_TAG_subprogram = 0x2e
-};
-
-enum dwarf_lns {
-  DW_LNS_extended_op = 0x00,
-  DW_LNS_copy = 0x01,
-  DW_LNS_advance_pc = 0x02,
-  DW_LNS_advance_line = 0x03,
-  DW_LNS_set_file = 0x04,
-  DW_LNS_set_column = 0x05,
-  DW_LNS_negate_stmt = 0x06,
-  DW_LNS_set_basic_block = 0x07,
-  DW_LNS_const_add_pc = 0x08,
-  DW_LNS_fixed_advance_pc = 0x09,
-  DW_LNS_set_prologue_end = 0x0a,
-  DW_LNS_set_epilogue_begin = 0x0b,
-  DW_LNS_set_isa = 0x0c
-};
-
-enum dwarf_lne {
-  DW_LNE_end_sequence = 0x01,
-  DW_LNE_set_address = 0x02,
-  DW_LNE_define_file = 0x03,
-  DW_LNE_set_discriminator = 0x04
-};
-
-#endif  // DWARF2_H
diff --git a/third_party/gofrontend/include/filenames.h b/third_party/gofrontend/include/filenames.h
deleted file mode 100644
index 005b302..0000000
--- a/third_party/gofrontend/include/filenames.h
+++ /dev/null
@@ -1,14 +0,0 @@
-//===----------------------------- filenames.h ----------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef FILENAMES_H
-#define FILENAMES_H
-
-#define IS_ABSOLUTE_PATH(path) ((path)[0] == '/')
-
-#endif
diff --git a/third_party/gofrontend/install-sh b/third_party/gofrontend/install-sh
deleted file mode 100644
index 0b0fdcb..0000000
--- a/third_party/gofrontend/install-sh
+++ /dev/null
@@ -1,501 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2013-12-25.23; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# 'make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-tab='	'
-nl='
-'
-IFS=" $tab$nl"
-
-# Set DOITPROG to "echo" to test this script.
-
-doit=${DOITPROG-}
-doit_exec=${doit:-exec}
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-is_target_a_directory=possibly
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
-   or: $0 [OPTION]... SRCFILES... DIRECTORY
-   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
-   or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
-     --help     display this help and exit.
-     --version  display version info and exit.
-
-  -c            (ignored)
-  -C            install only if different (preserve the last data modification time)
-  -d            create directories instead of installing files.
-  -g GROUP      $chgrpprog installed files to GROUP.
-  -m MODE       $chmodprog installed files to MODE.
-  -o USER       $chownprog installed files to USER.
-  -s            $stripprog installed files.
-  -t DIRECTORY  install into DIRECTORY.
-  -T            report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
-  RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
-  case $1 in
-    -c) ;;
-
-    -C) copy_on_change=true;;
-
-    -d) dir_arg=true;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-        shift;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) mode=$2
-        case $mode in
-          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
-            echo "$0: invalid mode: $mode" >&2
-            exit 1;;
-        esac
-        shift;;
-
-    -o) chowncmd="$chownprog $2"
-        shift;;
-
-    -s) stripcmd=$stripprog;;
-
-    -t)
-        is_target_a_directory=always
-        dst_arg=$2
-        # Protect names problematic for 'test' and other utilities.
-        case $dst_arg in
-          -* | [=\(\)!]) dst_arg=./$dst_arg;;
-        esac
-        shift;;
-
-    -T) is_target_a_directory=never;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    --) shift
-        break;;
-
-    -*) echo "$0: invalid option: $1" >&2
-        exit 1;;
-
-    *)  break;;
-  esac
-  shift
-done
-
-# We allow the use of options -d and -T together, by making -d
-# take the precedence; this is for compatibility with GNU install.
-
-if test -n "$dir_arg"; then
-  if test -n "$dst_arg"; then
-    echo "$0: target directory not allowed when installing a directory." >&2
-    exit 1
-  fi
-fi
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
-  # When -d is used, all remaining arguments are directories to create.
-  # When -t is used, the destination is already specified.
-  # Otherwise, the last argument is the destination.  Remove it from $@.
-  for arg
-  do
-    if test -n "$dst_arg"; then
-      # $@ is not empty: it contains at least $arg.
-      set fnord "$@" "$dst_arg"
-      shift # fnord
-    fi
-    shift # arg
-    dst_arg=$arg
-    # Protect names problematic for 'test' and other utilities.
-    case $dst_arg in
-      -* | [=\(\)!]) dst_arg=./$dst_arg;;
-    esac
-  done
-fi
-
-if test $# -eq 0; then
-  if test -z "$dir_arg"; then
-    echo "$0: no input file specified." >&2
-    exit 1
-  fi
-  # It's OK to call 'install-sh -d' without argument.
-  # This can happen when creating conditional directories.
-  exit 0
-fi
-
-if test -z "$dir_arg"; then
-  if test $# -gt 1 || test "$is_target_a_directory" = always; then
-    if test ! -d "$dst_arg"; then
-      echo "$0: $dst_arg: Is not a directory." >&2
-      exit 1
-    fi
-  fi
-fi
-
-if test -z "$dir_arg"; then
-  do_exit='(exit $ret); exit $ret'
-  trap "ret=129; $do_exit" 1
-  trap "ret=130; $do_exit" 2
-  trap "ret=141; $do_exit" 13
-  trap "ret=143; $do_exit" 15
-
-  # Set umask so as not to create temps with too-generous modes.
-  # However, 'strip' requires both read and write access to temps.
-  case $mode in
-    # Optimize common cases.
-    *644) cp_umask=133;;
-    *755) cp_umask=22;;
-
-    *[0-7])
-      if test -z "$stripcmd"; then
-        u_plus_rw=
-      else
-        u_plus_rw='% 200'
-      fi
-      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
-    *)
-      if test -z "$stripcmd"; then
-        u_plus_rw=
-      else
-        u_plus_rw=,u+rw
-      fi
-      cp_umask=$mode$u_plus_rw;;
-  esac
-fi
-
-for src
-do
-  # Protect names problematic for 'test' and other utilities.
-  case $src in
-    -* | [=\(\)!]) src=./$src;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    dstdir=$dst
-    test -d "$dstdir"
-    dstdir_status=$?
-  else
-
-    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
-    # might cause directories to be created, which would be especially bad
-    # if $src (and thus $dsttmp) contains '*'.
-    if test ! -f "$src" && test ! -d "$src"; then
-      echo "$0: $src does not exist." >&2
-      exit 1
-    fi
-
-    if test -z "$dst_arg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-    dst=$dst_arg
-
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
-    if test -d "$dst"; then
-      if test "$is_target_a_directory" = never; then
-        echo "$0: $dst_arg: Is a directory" >&2
-        exit 1
-      fi
-      dstdir=$dst
-      dst=$dstdir/`basename "$src"`
-      dstdir_status=0
-    else
-      dstdir=`dirname "$dst"`
-      test -d "$dstdir"
-      dstdir_status=$?
-    fi
-  fi
-
-  obsolete_mkdir_used=false
-
-  if test $dstdir_status != 0; then
-    case $posix_mkdir in
-      '')
-        # Create intermediate dirs using mode 755 as modified by the umask.
-        # This is like FreeBSD 'install' as of 1997-10-28.
-        umask=`umask`
-        case $stripcmd.$umask in
-          # Optimize common cases.
-          *[2367][2367]) mkdir_umask=$umask;;
-          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-          *[0-7])
-            mkdir_umask=`expr $umask + 22 \
-              - $umask % 100 % 40 + $umask % 20 \
-              - $umask % 10 % 4 + $umask % 2
-            `;;
-          *) mkdir_umask=$umask,go-w;;
-        esac
-
-        # With -d, create the new directory with the user-specified mode.
-        # Otherwise, rely on $mkdir_umask.
-        if test -n "$dir_arg"; then
-          mkdir_mode=-m$mode
-        else
-          mkdir_mode=
-        fi
-
-        posix_mkdir=false
-        case $umask in
-          *[123567][0-7][0-7])
-            # POSIX mkdir -p sets u+wx bits regardless of umask, which
-            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-            ;;
-          *)
-            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-            trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-            if (umask $mkdir_umask &&
-                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-            then
-              if test -z "$dir_arg" || {
-                   # Check for POSIX incompatibilities with -m.
-                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-                   # other-writable bit of parent directory when it shouldn't.
-                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-                   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-                   case $ls_ld_tmpdir in
-                     d????-?r-*) different_mode=700;;
-                     d????-?--*) different_mode=755;;
-                     *) false;;
-                   esac &&
-                   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-                     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-                   }
-                 }
-              then posix_mkdir=:
-              fi
-              rmdir "$tmpdir/d" "$tmpdir"
-            else
-              # Remove any dirs left behind by ancient mkdir implementations.
-              rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-            fi
-            trap '' 0;;
-        esac;;
-    esac
-
-    if
-      $posix_mkdir && (
-        umask $mkdir_umask &&
-        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
-      )
-    then :
-    else
-
-      # The umask is ridiculous, or mkdir does not conform to POSIX,
-      # or it failed possibly due to a race condition.  Create the
-      # directory the slow way, step by step, checking for races as we go.
-
-      case $dstdir in
-        /*) prefix='/';;
-        [-=\(\)!]*) prefix='./';;
-        *)  prefix='';;
-      esac
-
-      oIFS=$IFS
-      IFS=/
-      set -f
-      set fnord $dstdir
-      shift
-      set +f
-      IFS=$oIFS
-
-      prefixes=
-
-      for d
-      do
-        test X"$d" = X && continue
-
-        prefix=$prefix$d
-        if test -d "$prefix"; then
-          prefixes=
-        else
-          if $posix_mkdir; then
-            (umask=$mkdir_umask &&
-             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-            # Don't fail if two instances are running concurrently.
-            test -d "$prefix" || exit 1
-          else
-            case $prefix in
-              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-              *) qprefix=$prefix;;
-            esac
-            prefixes="$prefixes '$qprefix'"
-          fi
-        fi
-        prefix=$prefix/
-      done
-
-      if test -n "$prefixes"; then
-        # Don't fail if two instances are running concurrently.
-        (umask $mkdir_umask &&
-         eval "\$doit_exec \$mkdirprog $prefixes") ||
-          test -d "$dstdir" || exit 1
-        obsolete_mkdir_used=true
-      fi
-    fi
-  fi
-
-  if test -n "$dir_arg"; then
-    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
-    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
-      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
-  else
-
-    # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
-
-    # Trap to clean up those temp files at exit.
-    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
-    # Copy the file name to the temp name.
-    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
-    # and set any options; do chmod last to preserve setuid bits.
-    #
-    # If any of these fail, we abort the whole thing.  If we want to
-    # ignore errors from any of these, just make sure not to ignore
-    # errors from the above "$doit $cpprog $src $dsttmp" command.
-    #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
-    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
-    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
-    # If -C, don't bother to copy if it wouldn't change the file.
-    if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
-       set -f &&
-       set X $old && old=:$2:$4:$5:$6 &&
-       set X $new && new=:$2:$4:$5:$6 &&
-       set +f &&
-       test "$old" = "$new" &&
-       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
-    then
-      rm -f "$dsttmp"
-    else
-      # Rename the file to the real destination.
-      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
-      # The rename failed, perhaps because mv can't rename something else
-      # to itself, or perhaps because mv is so ancient that it does not
-      # support -f.
-      {
-        # Now remove or move aside any old file at destination location.
-        # We try this two ways since rm can't unlink itself on some
-        # systems and the destination file might be busy for other
-        # reasons.  In this case, the final cleanup might fail but the new
-        # file should still install successfully.
-        {
-          test ! -f "$dst" ||
-          $doit $rmcmd -f "$dst" 2>/dev/null ||
-          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-          } ||
-          { echo "$0: cannot unlink or rename $dst" >&2
-            (exit 1); exit 1
-          }
-        } &&
-
-        # Now rename the file to the real destination.
-        $doit $mvcmd "$dsttmp" "$dst"
-      }
-    fi || exit 1
-
-    trap '' 0
-  fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/third_party/gofrontend/libbacktrace/ChangeLog b/third_party/gofrontend/libbacktrace/ChangeLog
deleted file mode 100644
index 1e70595..0000000
--- a/third_party/gofrontend/libbacktrace/ChangeLog
+++ /dev/null
@@ -1,456 +0,0 @@
-2015-01-05  Jakub Jelinek  <jakub@redhat.com>
-
-	Update copyright years.
-
-2014-11-21  H.J. Lu  <hongjiu.lu@intel.com>
-
-	PR bootstrap/63784
-	* configure: Regenerated.
-
-2014-11-11  David Malcolm  <dmalcolm@redhat.com>
-
-	* ChangeLog.jit: New.
-
-2014-11-11  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
-
-	PR target/63610
-	* configure: Regenerate.
-
-2014-10-23  Ian Lance Taylor  <iant@google.com>
-
-	* internal.h (backtrace_atomic_load_pointer) [no atomic or sync]:
-	Fix to return void *.
-
-2014-05-08  Ian Lance Taylor  <iant@google.com>
-
-	* mmap.c (backtrace_free): If freeing a large aligned block of
-	memory, call munmap rather than holding onto it.
-	(backtrace_vector_grow): When growing a vector, double the number
-	of pages requested.  When releasing the old version of a grown
-	vector, pass the correct size to backtrace_free.
-
-2014-03-07  Ian Lance Taylor  <iant@google.com>
-
-	* sort.c (backtrace_qsort): Use middle element as pivot.
-
-2014-03-06  Ian Lance Taylor  <iant@google.com>
-
-	* sort.c: New file.
-	* stest.c: New file.
-	* internal.h (backtrace_qsort): Declare.
-	* dwarf.c (read_abbrevs): Call backtrace_qsort instead of qsort.
-	(read_line_info, read_function_entry): Likewise.
-	(read_function_info, build_dwarf_data): Likewise.
-	* elf.c (elf_initialize_syminfo): Likewise.
-	* Makefile.am (libbacktrace_la_SOURCES): Add sort.c.
-	(stest_SOURCES, stest_LDADD): Define.
-	(check_PROGRAMS): Add stest.
-
-2014-02-07  Misty De Meo  <misty@brew.sh>
-
-	PR target/58710
-	* configure.ac: Use AC_LINK_IFELSE in check for
-	_Unwind_GetIPInfo.
-	* configure: Regenerate.
-
-2014-01-02  Richard Sandiford  <rdsandiford@googlemail.com>
-
-	Update copyright years
-
-2013-12-06  Jakub Jelinek  <jakub@redhat.com>
-
-	* elf.c (ET_DYN): Undefine and define again.
-	(elf_add): Add exe argument, if true and ehdr.e_type is ET_DYN,
-	return early -1 without closing the descriptor.
-	(struct phdr_data): Add exe_descriptor.
-	(phdr_callback): If pd->exe_descriptor is not -1, for very first
-	call if dlpi_name is NULL just call elf_add with the exe_descriptor,
-	otherwise backtrace_close the exe_descriptor if not -1.  Adjust
-	call to elf_add.
-	(backtrace_initialize): Adjust call to elf_add.  If it returns
-	-1, set pd.exe_descriptor to descriptor, otherwise set it to -1.
-
-2013-12-05  Ian Lance Taylor  <iant@google.com>
-
-	* alloc.c (backtrace_vector_finish): Add error_callback and data
-	parameters.  Call backtrace_vector_release.  Return address base.
-	* mmap.c (backtrace_vector_finish): Add error_callback and data
-	parameters.  Return address base.
-	* dwarf.c (read_function_info): Get new address base from
-	backtrace_vector_finish.
-	* internal.h (backtrace_vector_finish): Update declaration.
-
-2013-11-27  Ian Lance Taylor  <iant@google.com>
-
-	* dwarf.c (find_address_ranges): New static function, broken out
-	of build_address_map.
-	(build_address_map): Call it.
-	* btest.c (check): Check for missing filename or function, rather
-	than crashing.
-	(f3): Check that enough frames were returned.
-
-2013-11-19  Jakub Jelinek  <jakub@redhat.com>
-
-	* backtrace.h (backtrace_syminfo_callback): Add symsize argument.
-	* elf.c (elf_syminfo): Pass 0 or sym->size to the callback as
-	last argument.
-	* btest.c (struct symdata): Add size field.
-	(callback_three): Add symsize argument.  Copy it to the data->size
-	field.
-	(f23): Set symdata.size to 0.
-	(test5): Likewise.  If sizeof (int) > 1, lookup address of
-	((uintptr_t) &global) + 1.  Verify symdata.val and symdata.size
-	values.
-
-	* atomic.c: Include sys/types.h.
-
-2013-11-18  Ian Lance Taylor  <iant@google.com>
-
-	* configure.ac: Check for support of __atomic extensions.
-	* internal.h: Declare or #define atomic functions for use in
-	backtrace code.
-	* atomic.c: New file.
-	* dwarf.c (dwarf_lookup_pc): Use atomic functions.
-	(dwarf_fileline, backtrace_dwarf_add): Likewise.
-	* elf.c (elf_add_syminfo_data, elf_syminfo): Likewise.
-	(backtrace_initialize): Likewise.
-	* fileline.c (fileline_initialize): Likewise.
-	* Makefile.am (libbacktrace_la_SOURCES): Add atomic.c.
-	* configure, config.h.in, Makefile.in: Rebuild.
-
-2013-11-18  Jakub Jelinek  <jakub@redhat.com>
-
-	* elf.c (SHN_UNDEF): Define.
-	(elf_initialize_syminfo): Add base_address argument.  Ignore symbols
-	with st_shndx == SHN_UNDEF.  Add base_address to address fields.
-	(elf_add): Adjust caller.
-
-	* elf.c (phdr_callback): Process info->dlpi_addr == 0 normally.
-
-2013-11-16  Ian Lance Taylor  <iant@google.com>
-
-	* backtrace.h (backtrace_create_state): Correct comment about
-	threading.
-
-2013-11-15  Ian Lance Taylor  <iant@google.com>
-
-	* backtrace.h (backtrace_syminfo): Update comment and parameter
-	name to take any address, not just a PC value.
-	* elf.c (STT_OBJECT): Define.
-	(elf_nosyms): Rename parameter pc to addr.
-	(elf_symbol_search): Rename local variable pc to addr.
-	(elf_initialize_syminfo): Add STT_OBJECT symbols to elf_symbols.
-	(elf_syminfo): Rename parameter pc to addr.
-	* btest.c (global): New global variable.
-	(test5): New test.
-	(main): Call test5.
-
-2013-10-17  Ian Lance Taylor  <iant@google.com>
-
-	* elf.c (elf_add): Don't get the wrong offsets if a debug section
-	is missing.
-
-2013-10-15  David Malcolm  <dmalcolm@redhat.com>
-
-	* configure.ac: Add --enable-host-shared, setting up
-	pre-existing PIC_FLAG variable within Makefile.am et al.
-	* configure: Regenerate.
-
-2013-09-20  Alan Modra  <amodra@gmail.com>
-
-	* configure: Regenerate.
-
-2013-07-23  Alexander Monakov  <amonakov@ispras.ru>
-
-	* elf.c (elf_syminfo): Loop over the elf_syminfo_data chain.
-
-2013-07-23  Alexander Monakov  <amonakov@ispras.ru>
-
-	* elf.c (backtrace_initialize): Pass elf_fileline_fn to
-	dl_iterate_phdr callbacks.
-
-2013-03-25  Ian Lance Taylor  <iant@google.com>
-
-	* alloc.c: #include <sys/types.h>.
-	* mmap.c: Likewise.
-
-2013-01-31  Ian Lance Taylor  <iant@google.com>
-
-	* dwarf.c (read_function_info): Permit fvec parameter to be NULL.
-	(dwarf_lookup_pc): Don't use ddata->fvec if threaded.
-
-2013-01-25  Jakub Jelinek  <jakub@redhat.com>
-
-	PR other/56076
-	* dwarf.c (read_line_header): Don't crash if DW_AT_comp_dir
-	attribute was not seen.
-
-2013-01-16  Ian Lance Taylor  <iant@google.com>
-
-	* dwarf.c (struct unit): Add filename and abs_filename fields.
-	(build_address_map): Set new fields when reading unit.
-	(dwarf_lookup_pc): If we don't find an entry in the line table,
-	just return the main file name.
-
-2013-01-14  Richard Sandiford  <rdsandiford@googlemail.com>
-
-	Update copyright years.
-
-2013-01-01  Ian Lance Taylor  <iant@google.com>
-
-	PR bootstrap/54834
-	* Makefile.am (AM_CPPFLAGS): Remove -I ../gcc/include and -I
-	$(MULTIBUILDTOP)/../../gcc/include.
-	* Makefile.in: Rebuild.
-
-2013-01-01  Ian Lance Taylor  <iant@google.com>
-
-	PR other/55536
-	* mmap.c (backtrace_alloc): Don't call sync functions if not
-	threaded.
-	(backtrace_free): Likewise.
-
-2012-12-12  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
-
-	* mmapio.c: Define MAP_FAILED if not defined.
-
-2012-12-11  Jakub Jelinek  <jakub@redhat.com>
-
-	PR bootstrap/54926
-	* Makefile.am (AM_CFLAGS): Remove -frandom-seed=$@.
-	* configure.ac: If --with-target-subdir, add -frandom-seed=$@
-	to EXTRA_FLAGS unconditionally, otherwise check whether the compiler
-	accepts it.
-	* Makefile.in: Regenerated.
-	* configure: Regenerated.
-
-2012-12-07  Jakub Jelinek  <jakub@redhat.com>
-
-	PR bootstrap/54926
-	* Makefile.am (AM_CFLAGS): Add -frandom-seed=$@.
-	* Makefile.in: Regenerated.
-
-2012-11-20  Ian Lance Taylor  <iant@google.com>
-
-	* dwarf.c (read_attribute): Always clear val.
-
-2012-11-13  Ian Lance Taylor  <iant@google.com>
-
-	PR other/55312
-	* configure.ac: Only add -Werror if building a target library.
-	* configure: Rebuild.
-
-2012-11-12  Ian Lance Taylor  <iant@google.com>
-	    Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
-	    Gerald Pfeifer  <gerald@pfeifer.com>
-
-	* configure.ac: Check for getexecname.
-	* fileline.c: #include <errno.h>.  Define getexecname if not
-	available.
-	(fileline_initialize): Try to find the executable in a few
-	different ways.
-	* print.c (error_callback): Only print the filename if it came
-	from the backtrace state.
-	* configure, config.h.in: Rebuild.
-
-2012-10-29  Ian Lance Taylor  <iant@google.com>
-
-	* mmap.c (backtrace_vector_release): Correct last patch: add
-	aligned, not size.
-
-2012-10-29  Ian Lance Taylor  <iant@google.com>
-
-	* mmap.c (backtrace_vector_release): Make sure freed block is
-	aligned on 8-byte boundary.
-
-2012-10-26  Ian Lance Taylor  <iant@google.com>
-
-	PR other/55087
-	* posix.c (backtrace_open): Add does_not_exist parameter.
-	* elf.c (phdr_callback): Do not warn if shared library could not
-	be opened.
-	* fileline.c (fileline_initialize): Update calls to
-	backtrace_open.
-	* internal.h (backtrace_open): Update declaration.
-
-2012-10-26  Jack Howarth  <howarth@bromo.med.uc.edu>
-
-	PR target/55061
-	* configure.ac: Check for _Unwind_GetIPInfo function declaration.
-	* configure: Regenerate.
-
-2012-10-24  Ian Lance Taylor  <iant@google.com>
-
-	PR target/55061
-	* configure.ac: Check whether -funwind-tables option works.
-	* configure: Rebuild.
-
-2012-10-11  Ian Lance Taylor  <iant@google.com>
-
-	* configure.ac: Do not use dl_iterate_phdr on Solaris 10.
-	* configure: Rebuild.
-
-2012-10-10  Ian Lance Taylor  <iant@google.com>
-
-	* elf.c: Rename all Elf typedefs to start with b_elf, and be all
-	lower case.
-
-2012-10-10  Hans-Peter Nilsson  <hp@bitrange.com>
-
-	* elf.c (elf_add_syminfo_data): Add casts to avoid warning.
-
-2012-10-09  Ian Lance Taylor  <iant@google.com>
-
-	* dwarf.c (dwarf_fileline): Add cast to avoid warning.
-	(backtrace_dwarf_add): Likewise.
-
-2012-10-09  Ian Lance Taylor  <iant@google.com>
-
-	Add support for tracing through shared libraries.
-	* configure.ac: Check for link.h and dl_iterate_phdr.
-	* elf.c: #include <link.h> if system has dl_iterate_phdr.  #undef
-	ELF macros before #defining them.
-	(dl_phdr_info, dl_iterate_phdr): Define if system does not have
-	dl_iterate_phdr.
-	(struct elf_syminfo_data): Add next field.
-	(elf_initialize_syminfo): Initialize next field.
-	(elf_add_syminfo_data): New static function.
-	(elf_add): New static function, broken out of
-	backtrace_initialize.  Call backtrace_dwarf_add instead of
-	backtrace_dwarf_initialize.
-	(struct phdr_data): Define.
-	(phdr_callback): New static function.
-	(backtrace_initialize): Call elf_add.
-	* dwarf.c (struct dwarf_data): Add next and base_address fields.
-	(add_unit_addr): Add base_address parameter.  Change all callers.
-	(add_unit_ranges, build_address_map): Likewise.
-	(add_line): Add ddata parameter.  Change all callers.
-	(read_line_program, add_function_range): Likewise.
-	(dwarf_lookup_pc): New static function, broken out of
-	dwarf_fileline.
-	(dwarf_fileline): Call dwarf_lookup_pc.
-	(build_dwarf_data): New static function.
-	(backtrace_dwarf_add): New function.
-	(backtrace_dwarf_initialize): Remove.
-	* internal.h (backtrace_dwarf_initialize): Don't declare.
-	(backtrace_dwarf_add): Declare.
-	* configure, config.h.in: Rebuild.
-
-2012-10-04  Gerald Pfeifer  <gerald@pfeifer.com>
-
-	* btest.c (f23): Avoid uninitialized variable warning.
-
-2012-10-04  Ian Lance Taylor  <iant@google.com>
-
-	* dwarf.c: If the system header files do not declare strnlen,
-	provide our own version.
-
-2012-10-03  Ian Lance Taylor  <iant@google.com>
-
-	* dwarf.c (read_uleb128): Fix overflow test.
-	(read_sleb128): Likewise.
-	(build_address_map): Don't change unit_buf.start.
-
-2012-10-02  Uros Bizjak  <ubizjak@gmail.com>
-
-	PR other/54761
-	* configure.ac (EXTRA_FLAGS): New.
-	* Makefile.am (AM_FLAGS): Add $(EXTRA_FLAGS).
-	* configure, Makefile.in: Regenerate.
-
-2012-09-29  Ian Lance Taylor  <iant@google.com>
-
-	PR other/54749
-	* fileline.c (fileline_initialize): Pass errnum as -1 when
-	reporting that we could not read executable information after a
-	previous failure.
-
-2012-09-27  Ian Lance Taylor  <iant@google.com>
-
-	PR bootstrap/54732
-	* configure.ac: Add no-dependencies to AM_INIT_AUTOMAKE.
-	* Makefile.am: Add dependencies for all objects.
-	* configure, aclocal.m4, Makefile.in: Rebuild.
-
-2012-09-27  Ian Lance Taylor  <iant@google.com>
-
-	PR other/54726
-	* elf.c (backtrace_initialize): Set *fileln_fn, not
-	state->fileln_fn.
-
-2012-09-19  Ian Lance Taylor  <iant@google.com>
-
-	* configure.ac: Only use GCC_CHECK_UNWIND_GETIPINFO when compiled
-	as a target library.
-	* configure: Rebuild.
-
-2012-09-19  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
-	    Ian Lance Taylor  <iant@google.com>
-
-        * configure.ac (GCC_HEADER_STDINT): Invoke.
-        * backtrace.h: If we can't find <stdint.h>, use "gstdint.h".
-        * btest.c: Don't include <stdint.h>.
-        * dwarf.c: Likewise.
-        * configure, aclocal.m4, Makefile.in, config.h.in: Rebuild.
-
-2012-09-18  Ian Lance Taylor  <iant@google.com>
-
-	PR bootstrap/54623
-	* Makefile.am (AM_CPPFLAGS): Define.
-	(AM_CFLAGS): Remove -I options.
-	* Makefile.in: Rebuild.
-
-2012-09-18  Ian Lance Taylor  <iant@google.com>
-
-	* posix.c (O_BINARY): Define if not defined.
-	(backtrace_open): Pass O_BINARY to open.  Only call fcntl if
-	HAVE_FCNTL is defined.
-	* configure.ac: Test for the fcntl function.
-	* configure, config.h.in: Rebuild.
-
-2012-09-18  Ian Lance Taylor  <iant@google.com>
-
-	* btest.c (test1, test2, test3, test4): Add the unused attribute.
-
-2012-09-18  Ian Lance Taylor  <iant@google.com>
-
-	* dwarf.c: Correct test of HAVE_DECL_STRNLEN.
-
-2012-09-18  Ian Lance Taylor  <iant@google.com>
-
-	* configure.ac: Add AC_USE_SYSTEM_EXTENSIONS.
-	* mmapio.c: Don't define _GNU_SOURCE.
-	* configure, config.h.in: Rebuild.
-
-2012-09-18  Ian Lance Taylor  <iant@google.com>
-
-	* configure.ac: Check whether strnlen is declared.
-	* dwarf.c: Declare strnlen if not declared.
-	* configure, config.h.in: Rebuild.
-
-2012-09-18  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
-
-	* fileline.c: Include <stdlib.h>.
-	* mmap.c: Likewise.
-
-2012-09-17  Ian Lance Taylor  <iant@google.com>
-
-	PR bootstrap/54611
-	* nounwind.c (backtrace_full): Rename from backtrace.  Add state
-	parameter.
-
-2012-09-17  Gerald Pfeifer  <gerald@pfeifer.com>
-
-	PR bootstrap/54611
-	* nounwind.c (backtrace_simple): Add state parameter.
-
-2012-09-17  Ian Lance Taylor  <iant@google.com>
-
-	PR bootstrap/54609
-	* unknown.c (unknown_fileline): Add state parameter, remove
-	fileline_data parameter, name error_callback parameter.
-	(backtrace_initialize): Add state parameter.
-
-2012-09-17  Ian Lance Taylor  <iant@google.com>
-
-	* Initial implementation.
diff --git a/third_party/gofrontend/libbacktrace/ChangeLog.jit b/third_party/gofrontend/libbacktrace/ChangeLog.jit
deleted file mode 100644
index 6b60e3b..0000000
--- a/third_party/gofrontend/libbacktrace/ChangeLog.jit
+++ /dev/null
@@ -1,14 +0,0 @@
-2014-09-24  David Malcolm  <dmalcolm@redhat.com>
-
-	* ChangeLog.jit: Add copyright footer.
-
-2013-10-03  David Malcolm  <dmalcolm@redhat.com>
-
-	* configure.ac: Add --enable-host-shared.
-	* configure: Regenerate.
-
-Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-Copying and distribution of this file, with or without modification,
-are permitted in any medium without royalty provided the copyright
-notice and this notice are preserved.
diff --git a/third_party/gofrontend/libbacktrace/Makefile.am b/third_party/gofrontend/libbacktrace/Makefile.am
deleted file mode 100644
index a93b82a..0000000
--- a/third_party/gofrontend/libbacktrace/Makefile.am
+++ /dev/null
@@ -1,132 +0,0 @@
-# Makefile.am -- Backtrace Makefile.
-# Copyright (C) 2012-2015 Free Software Foundation, Inc.
-
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-
-#     (1) Redistributions of source code must retain the above copyright
-#     notice, this list of conditions and the following disclaimer. 
-
-#     (2) 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.  
-
-#     (3) The name of the author may not be used to
-#     endorse or promote products derived from this software without
-#     specific prior written permission.
-
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-ACLOCAL_AMFLAGS = -I .. -I ../config
-
-AM_CPPFLAGS = -I $(top_srcdir)/../include -I $(top_srcdir)/../libgcc \
-	-I ../libgcc
-
-AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG)
-
-noinst_LTLIBRARIES = libbacktrace.la
-
-libbacktrace_la_SOURCES = \
-	backtrace.h \
-	atomic.c \
-	dwarf.c \
-	fileline.c \
-	internal.h \
-	posix.c \
-	print.c \
-	sort.c \
-	state.c
-
-BACKTRACE_FILES = \
-	backtrace.c \
-	simple.c \
-	nounwind.c
-
-FORMAT_FILES = \
-	elf.c \
-	unknown.c
-
-VIEW_FILES = \
-	read.c \
-	mmapio.c
-
-ALLOC_FILES = \
-	alloc.c \
-	mmap.c
-
-EXTRA_libbacktrace_la_SOURCES = \
-	$(BACKTRACE_FILES) \
-	$(FORMAT_FILES) \
-	$(VIEW_FILES) \
-	$(ALLOC_FILES)
-
-libbacktrace_la_LIBADD = \
-	$(BACKTRACE_FILE) \
-	$(FORMAT_FILE) \
-	$(VIEW_FILE) \
-	$(ALLOC_FILE)
-
-libbacktrace_la_DEPENDENCIES = $(libbacktrace_la_LIBADD)
-
-# Testsuite.
-
-check_PROGRAMS =
-
-TESTS = $(check_PROGRAMS)
-
-if NATIVE
-
-btest_SOURCES = btest.c
-btest_CFLAGS = $(AM_CFLAGS) -g -O
-btest_LDADD = libbacktrace.la
-
-check_PROGRAMS += btest
-
-stest_SOURCES = stest.c
-stest_LDADD = libbacktrace.la
-
-check_PROGRAMS += stest
-
-endif NATIVE
-
-# We can't use automake's automatic dependency tracking, because it
-# breaks when using bootstrap-lean.  Automatic dependency tracking
-# with GCC bootstrap will cause some of the objects to depend on
-# header files in prev-gcc/include, e.g., stddef.h and stdarg.h.  When
-# using bootstrap-lean, prev-gcc is removed after each stage.  When
-# running "make install", those header files will be gone, causing the
-# library to be rebuilt at install time.  That may not succeed.
-
-# These manual dependencies do not include dependencies on unwind.h,
-# even though that is part of GCC, because where to find it depends on
-# whether we are being built as a host library or a target library.
-
-INCDIR = $(top_srcdir)/../include
-alloc.lo: config.h backtrace.h internal.h
-backtrace.lo: config.h backtrace.h
-btest.lo: (INCDIR)/filenames.h backtrace.h backtrace-supported.h
-dwarf.lo: config.h $(INCDIR)/dwarf2.h $(INCDIR)/dwarf2.def \
-	$(INCDIR)/filenames.h backtrace.h internal.h
-elf.lo: config.h backtrace.h internal.h
-fileline.lo: config.h backtrace.h internal.h
-mmap.lo: config.h backtrace.h internal.h
-mmapio.lo: config.h backtrace.h internal.h
-nounwind.lo: config.h internal.h
-posix.lo: config.h backtrace.h internal.h
-print.lo: config.h backtrace.h internal.h
-read.lo: config.h backtrace.h internal.h
-simple.lo: config.h backtrace.h internal.h
-state.lo: config.h backtrace.h backtrace-supported.h internal.h
-unknown.lo: config.h backtrace.h internal.h
diff --git a/third_party/gofrontend/libbacktrace/Makefile.in b/third_party/gofrontend/libbacktrace/Makefile.in
deleted file mode 100644
index f2821fc..0000000
--- a/third_party/gofrontend/libbacktrace/Makefile.in
+++ /dev/null
@@ -1,739 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# Makefile.am -- Backtrace Makefile.
-# Copyright (C) 2012-2014 Free Software Foundation, Inc.
-
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-
-#     (1) Redistributions of source code must retain the above copyright
-#     notice, this list of conditions and the following disclaimer. 
-
-#     (2) 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.  
-
-#     (3) The name of the author may not be used to
-#     endorse or promote products derived from this software without
-#     specific prior written permission.
-
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-target_triplet = @target@
-check_PROGRAMS = $(am__EXEEXT_1)
-@NATIVE_TRUE@am__append_1 = btest stest
-subdir = .
-DIST_COMMON = README ChangeLog $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/configure \
-	$(am__configure_deps) $(srcdir)/config.h.in \
-	$(srcdir)/../mkinstalldirs $(srcdir)/backtrace-supported.h.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/lead-dot.m4 \
-	$(top_srcdir)/../config/multi.m4 \
-	$(top_srcdir)/../config/override.m4 \
-	$(top_srcdir)/../config/stdint.m4 \
-	$(top_srcdir)/../config/unwind_ipinfo.m4 \
-	$(top_srcdir)/../config/warnings.m4 \
-	$(top_srcdir)/../libtool.m4 $(top_srcdir)/../ltoptions.m4 \
-	$(top_srcdir)/../ltsugar.m4 $(top_srcdir)/../ltversion.m4 \
-	$(top_srcdir)/../lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES = backtrace-supported.h
-CONFIG_CLEAN_VPATH_FILES =
-LTLIBRARIES = $(noinst_LTLIBRARIES)
-am__DEPENDENCIES_1 =
-am_libbacktrace_la_OBJECTS = atomic.lo dwarf.lo fileline.lo posix.lo \
-	print.lo sort.lo state.lo
-libbacktrace_la_OBJECTS = $(am_libbacktrace_la_OBJECTS)
-@NATIVE_TRUE@am__EXEEXT_1 = btest$(EXEEXT) stest$(EXEEXT)
-@NATIVE_TRUE@am_btest_OBJECTS = btest-btest.$(OBJEXT)
-btest_OBJECTS = $(am_btest_OBJECTS)
-@NATIVE_TRUE@btest_DEPENDENCIES = libbacktrace.la
-btest_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(btest_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-@NATIVE_TRUE@am_stest_OBJECTS = stest.$(OBJEXT)
-stest_OBJECTS = $(am_stest_OBJECTS)
-@NATIVE_TRUE@stest_DEPENDENCIES = libbacktrace.la
-DEFAULT_INCLUDES = -I.@am__isrc@
-depcomp =
-am__depfiles_maybe =
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(libbacktrace_la_SOURCES) $(EXTRA_libbacktrace_la_SOURCES) \
-	$(btest_SOURCES) $(stest_SOURCES)
-MULTISRCTOP = 
-MULTIBUILDTOP = 
-MULTIDIRS = 
-MULTISUBDIR = 
-MULTIDO = true
-MULTICLEAN = true
-ETAGS = etags
-CTAGS = ctags
-am__tty_colors = \
-red=; grn=; lgn=; blu=; std=
-ACLOCAL = @ACLOCAL@
-ALLOC_FILE = @ALLOC_FILE@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BACKTRACE_FILE = @BACKTRACE_FILE@
-BACKTRACE_SUPPORTED = @BACKTRACE_SUPPORTED@
-BACKTRACE_SUPPORTS_THREADS = @BACKTRACE_SUPPORTS_THREADS@
-BACKTRACE_USES_MALLOC = @BACKTRACE_USES_MALLOC@
-CC = @CC@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXTRA_FLAGS = @EXTRA_FLAGS@
-FGREP = @FGREP@
-FORMAT_FILE = @FORMAT_FILE@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PIC_FLAG = @PIC_FLAG@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-VIEW_FILE = @VIEW_FILE@
-WARN_FLAGS = @WARN_FLAGS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-libtool_VERSION = @libtool_VERSION@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-multi_basedir = @multi_basedir@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target = @target@
-target_alias = @target_alias@
-target_cpu = @target_cpu@
-target_os = @target_os@
-target_vendor = @target_vendor@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-ACLOCAL_AMFLAGS = -I .. -I ../config
-AM_CPPFLAGS = -I $(top_srcdir)/../include -I $(top_srcdir)/../libgcc \
-	-I ../libgcc
-
-AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG)
-noinst_LTLIBRARIES = libbacktrace.la
-libbacktrace_la_SOURCES = \
-	backtrace.h \
-	atomic.c \
-	dwarf.c \
-	fileline.c \
-	internal.h \
-	posix.c \
-	print.c \
-	sort.c \
-	state.c
-
-BACKTRACE_FILES = \
-	backtrace.c \
-	simple.c \
-	nounwind.c
-
-FORMAT_FILES = \
-	elf.c \
-	unknown.c
-
-VIEW_FILES = \
-	read.c \
-	mmapio.c
-
-ALLOC_FILES = \
-	alloc.c \
-	mmap.c
-
-EXTRA_libbacktrace_la_SOURCES = \
-	$(BACKTRACE_FILES) \
-	$(FORMAT_FILES) \
-	$(VIEW_FILES) \
-	$(ALLOC_FILES)
-
-libbacktrace_la_LIBADD = \
-	$(BACKTRACE_FILE) \
-	$(FORMAT_FILE) \
-	$(VIEW_FILE) \
-	$(ALLOC_FILE)
-
-libbacktrace_la_DEPENDENCIES = $(libbacktrace_la_LIBADD)
-TESTS = $(check_PROGRAMS)
-@NATIVE_TRUE@btest_SOURCES = btest.c
-@NATIVE_TRUE@btest_CFLAGS = $(AM_CFLAGS) -g -O
-@NATIVE_TRUE@btest_LDADD = libbacktrace.la
-@NATIVE_TRUE@stest_SOURCES = stest.c
-@NATIVE_TRUE@stest_LDADD = libbacktrace.la
-
-# We can't use automake's automatic dependency tracking, because it
-# breaks when using bootstrap-lean.  Automatic dependency tracking
-# with GCC bootstrap will cause some of the objects to depend on
-# header files in prev-gcc/include, e.g., stddef.h and stdarg.h.  When
-# using bootstrap-lean, prev-gcc is removed after each stage.  When
-# running "make install", those header files will be gone, causing the
-# library to be rebuilt at install time.  That may not succeed.
-
-# These manual dependencies do not include dependencies on unwind.h,
-# even though that is part of GCC, because where to find it depends on
-# whether we are being built as a host library or a target library.
-INCDIR = $(top_srcdir)/../include
-all: config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-am--refresh:
-	@:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign --ignore-deps'; \
-	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign --ignore-deps \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign --ignore-deps Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign --ignore-deps Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	$(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-$(am__aclocal_m4_deps):
-
-config.h: stamp-h1
-	@if test ! -f $@; then \
-	  rm -f stamp-h1; \
-	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
-	else :; fi
-
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
-	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
-	rm -f stamp-h1
-	touch $@
-
-distclean-hdr:
-	-rm -f config.h stamp-h1
-backtrace-supported.h: $(top_builddir)/config.status $(srcdir)/backtrace-supported.h.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-
-clean-noinstLTLIBRARIES:
-	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
-	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libbacktrace.la: $(libbacktrace_la_OBJECTS) $(libbacktrace_la_DEPENDENCIES) 
-	$(LINK)  $(libbacktrace_la_OBJECTS) $(libbacktrace_la_LIBADD) $(LIBS)
-
-clean-checkPROGRAMS:
-	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-btest$(EXEEXT): $(btest_OBJECTS) $(btest_DEPENDENCIES) 
-	@rm -f btest$(EXEEXT)
-	$(btest_LINK) $(btest_OBJECTS) $(btest_LDADD) $(LIBS)
-stest$(EXEEXT): $(stest_OBJECTS) $(stest_DEPENDENCIES) 
-	@rm -f stest$(EXEEXT)
-	$(LINK) $(stest_OBJECTS) $(stest_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.c.o:
-	$(COMPILE) -c $<
-
-.c.obj:
-	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-	$(LTCOMPILE) -c -o $@ $<
-
-btest-btest.o: btest.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(btest_CFLAGS) $(CFLAGS) -c -o btest-btest.o `test -f 'btest.c' || echo '$(srcdir)/'`btest.c
-
-btest-btest.obj: btest.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(btest_CFLAGS) $(CFLAGS) -c -o btest-btest.obj `if test -f 'btest.c'; then $(CYGPATH_W) 'btest.c'; else $(CYGPATH_W) '$(srcdir)/btest.c'; fi`
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool config.lt
-
-# GNU Make needs to see an explicit $(MAKE) variable in the command it
-# runs to enable its job server during parallel builds.  Hence the
-# comments below.
-all-multi:
-	$(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do # $(MAKE)
-install-multi:
-	$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do # $(MAKE)
-
-mostlyclean-multi:
-	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=mostlyclean multi-clean # $(MAKE)
-clean-multi:
-	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=clean multi-clean # $(MAKE)
-distclean-multi:
-	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=distclean multi-clean # $(MAKE)
-maintainer-clean-multi:
-	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=maintainer-clean multi-clean # $(MAKE)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-check-TESTS: $(TESTS)
-	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
-	srcdir=$(srcdir); export srcdir; \
-	list=' $(TESTS) '; \
-	$(am__tty_colors); \
-	if test -n "$$list"; then \
-	  for tst in $$list; do \
-	    if test -f ./$$tst; then dir=./; \
-	    elif test -f $$tst; then dir=; \
-	    else dir="$(srcdir)/"; fi; \
-	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *[\ \	]$$tst[\ \	]*) \
-		xpass=`expr $$xpass + 1`; \
-		failed=`expr $$failed + 1`; \
-		col=$$red; res=XPASS; \
-	      ;; \
-	      *) \
-		col=$$grn; res=PASS; \
-	      ;; \
-	      esac; \
-	    elif test $$? -ne 77; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *[\ \	]$$tst[\ \	]*) \
-		xfail=`expr $$xfail + 1`; \
-		col=$$lgn; res=XFAIL; \
-	      ;; \
-	      *) \
-		failed=`expr $$failed + 1`; \
-		col=$$red; res=FAIL; \
-	      ;; \
-	      esac; \
-	    else \
-	      skip=`expr $$skip + 1`; \
-	      col=$$blu; res=SKIP; \
-	    fi; \
-	    echo "$${col}$$res$${std}: $$tst"; \
-	  done; \
-	  if test "$$all" -eq 1; then \
-	    tests="test"; \
-	    All=""; \
-	  else \
-	    tests="tests"; \
-	    All="All "; \
-	  fi; \
-	  if test "$$failed" -eq 0; then \
-	    if test "$$xfail" -eq 0; then \
-	      banner="$$All$$all $$tests passed"; \
-	    else \
-	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
-	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
-	    fi; \
-	  else \
-	    if test "$$xpass" -eq 0; then \
-	      banner="$$failed of $$all $$tests failed"; \
-	    else \
-	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
-	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
-	    fi; \
-	  fi; \
-	  dashes="$$banner"; \
-	  skipped=""; \
-	  if test "$$skip" -ne 0; then \
-	    if test "$$skip" -eq 1; then \
-	      skipped="($$skip test was not run)"; \
-	    else \
-	      skipped="($$skip tests were not run)"; \
-	    fi; \
-	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$skipped"; \
-	  fi; \
-	  report=""; \
-	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
-	    report="Please report to $(PACKAGE_BUGREPORT)"; \
-	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$report"; \
-	  fi; \
-	  dashes=`echo "$$dashes" | sed s/./=/g`; \
-	  if test "$$failed" -eq 0; then \
-	    echo "$$grn$$dashes"; \
-	  else \
-	    echo "$$red$$dashes"; \
-	  fi; \
-	  echo "$$banner"; \
-	  test -z "$$skipped" || echo "$$skipped"; \
-	  test -z "$$report" || echo "$$report"; \
-	  echo "$$dashes$$std"; \
-	  test "$$failed" -eq 0; \
-	else :; fi
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
-	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-am
-all-am: Makefile $(LTLIBRARIES) all-multi config.h
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am clean-multi
-
-clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
-	clean-noinstLTLIBRARIES mostlyclean-am
-
-distclean: distclean-am distclean-multi
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-hdr distclean-libtool distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am: install-multi
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am maintainer-clean-multi
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am mostlyclean-multi
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: all all-multi check-am clean-multi distclean-multi install-am \
-	install-multi install-strip maintainer-clean-multi \
-	mostlyclean-multi
-
-.PHONY: CTAGS GTAGS all all-am all-multi am--refresh check check-TESTS \
-	check-am clean clean-checkPROGRAMS clean-generic clean-libtool \
-	clean-multi clean-noinstLTLIBRARIES ctags distclean \
-	distclean-compile distclean-generic distclean-hdr \
-	distclean-libtool distclean-multi distclean-tags dvi dvi-am \
-	html html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-multi install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic maintainer-clean-multi mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	mostlyclean-multi pdf pdf-am ps ps-am tags uninstall \
-	uninstall-am
-
-alloc.lo: config.h backtrace.h internal.h
-backtrace.lo: config.h backtrace.h
-btest.lo: (INCDIR)/filenames.h backtrace.h backtrace-supported.h
-dwarf.lo: config.h $(INCDIR)/dwarf2.h $(INCDIR)/dwarf2.def \
-	$(INCDIR)/filenames.h backtrace.h internal.h
-elf.lo: config.h backtrace.h internal.h
-fileline.lo: config.h backtrace.h internal.h
-mmap.lo: config.h backtrace.h internal.h
-mmapio.lo: config.h backtrace.h internal.h
-nounwind.lo: config.h internal.h
-posix.lo: config.h backtrace.h internal.h
-print.lo: config.h backtrace.h internal.h
-read.lo: config.h backtrace.h internal.h
-simple.lo: config.h backtrace.h internal.h
-state.lo: config.h backtrace.h backtrace-supported.h internal.h
-unknown.lo: config.h backtrace.h internal.h
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/gofrontend/libbacktrace/README b/third_party/gofrontend/libbacktrace/README
deleted file mode 100644
index e8b2257..0000000
--- a/third_party/gofrontend/libbacktrace/README
+++ /dev/null
@@ -1,23 +0,0 @@
-The libbacktrace library
-Initially written by Ian Lance Taylor <iant@google.com>
-
-The libbacktrace library may be linked into a program or library and
-used to produce symbolic backtraces.  Sample uses would be to print a
-detailed backtrace when an error occurs or to gather detailed
-profiling information.
-
-The libbacktrace library is provided under a BSD license.  See the
-source files for the exact license text.
-
-The public functions are declared and documented in the header file
-backtrace.h, which should be #include'd by a user of the library.
-
-Building libbacktrace will generate a file backtrace-supported.h,
-which a user of the library may use to determine whether backtraces
-will work.  See the source file backtrace-supported.h.in for the
-macros that it defines.
-
-As of September 2012, libbacktrace only supports ELF executables with
-DWARF debugging information.  The library is written to make it
-straightforward to add support for other object file and debugging
-formats.
diff --git a/third_party/gofrontend/libbacktrace/aclocal.m4 b/third_party/gofrontend/libbacktrace/aclocal.m4
deleted file mode 100644
index 42214c2..0000000
--- a/third_party/gofrontend/libbacktrace/aclocal.m4
+++ /dev/null
@@ -1,667 +0,0 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.64],,
-[m4_warning([this file was generated for autoconf 2.64.
-You have another version of autoconf.  It may work, but is not guaranteed to.
-If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.1], [],
-      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too.  Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.1])dnl
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-
-# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory.  The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run.  This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-#    fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-#    fails if $ac_aux_dir is absolute,
-#    fails when called from a subdirectory in a VPATH build with
-#          a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
-#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-#   MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH.  The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL                                            -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-m4_define([_AM_COND_VALUE_$1], [$2])dnl
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
-else
-  $1_TRUE='#'
-  $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Do all the work for Automake.                             -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 16
-
-# This macro actually does too much.  Some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
-dnl Autoconf wants to disallow AM_ names.  We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
-  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-			     [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-		  [_AM_DEPENDENCIES(CC)],
-		  [define([AC_PROG_CC],
-			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-		  [_AM_DEPENDENCIES(CXX)],
-		  [define([AC_PROG_CXX],
-			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-		  [_AM_DEPENDENCIES(OBJC)],
-		  [define([AC_PROG_OBJC],
-			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
-AC_CONFIG_COMMANDS_PRE(dnl
-[m4_provide_if([_AM_COMPILER_EXEEXT],
-  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
-
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
-dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
-dnl mangled by Autoconf and run in a shell conditional statement.
-m4_define([_AC_COMPILER_EXEEXT],
-m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_arg=$1
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-AC_SUBST(install_sh)])
-
-# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
-# From Jim Meyering
-
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_MAINTAINER_MODE([DEFAULT-MODE])
-# ----------------------------------
-# Control maintainer-specific portions of Makefiles.
-# Default is to disable them, unless `enable' is passed literally.
-# For symmetry, `disable' may be passed as well.  Anyway, the user
-# can override the default with the --enable/--disable switch.
-AC_DEFUN([AM_MAINTAINER_MODE],
-[m4_case(m4_default([$1], [disable]),
-       [enable], [m4_define([am_maintainer_other], [disable])],
-       [disable], [m4_define([am_maintainer_other], [enable])],
-       [m4_define([am_maintainer_other], [enable])
-        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
-AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles])
-  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
-  AC_ARG_ENABLE([maintainer-mode],
-[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
-			  (and sometimes confusing) to the casual installer],
-      [USE_MAINTAINER_MODE=$enableval],
-      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
-  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
-  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
-  MAINT=$MAINTAINER_MODE_TRUE
-  AC_SUBST([MAINT])dnl
-]
-)
-
-AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
-
-# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling.                     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# ------------------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[[\\\"\#\$\&\'\`$am_lf]]*)
-    AC_MSG_ERROR([unsafe absolute working directory name]);;
-esac
-case $srcdir in
-  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
-    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Public sister of _AM_SUBST_NOTMAKE.
-AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
-
-# Check how to create a tarball.                            -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-#     tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-#     $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
-m4_if([$1], [v7],
-     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
-m4_include([../config/lead-dot.m4])
-m4_include([../config/multi.m4])
-m4_include([../config/override.m4])
-m4_include([../config/stdint.m4])
-m4_include([../config/unwind_ipinfo.m4])
-m4_include([../config/warnings.m4])
-m4_include([../libtool.m4])
-m4_include([../ltoptions.m4])
-m4_include([../ltsugar.m4])
-m4_include([../ltversion.m4])
-m4_include([../lt~obsolete.m4])
diff --git a/third_party/gofrontend/libbacktrace/alloc.c b/third_party/gofrontend/libbacktrace/alloc.c
deleted file mode 100644
index 143ef68..0000000
--- a/third_party/gofrontend/libbacktrace/alloc.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/* alloc.c -- Memory allocation without mmap.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <errno.h>
-#include <stdlib.h>
-#include <sys/types.h>
-
-#include "backtrace.h"
-#include "internal.h"
-
-/* Allocation routines to use on systems that do not support anonymous
-   mmap.  This implementation just uses malloc, which means that the
-   backtrace functions may not be safely invoked from a signal
-   handler.  */
-
-/* Allocate memory like malloc.  */
-
-void *
-backtrace_alloc (struct backtrace_state *state ATTRIBUTE_UNUSED,
-		 size_t size, backtrace_error_callback error_callback,
-		 void *data)
-{
-  void *ret;
-
-  ret = malloc (size);
-  if (ret == NULL)
-    error_callback (data, "malloc", errno);
-  return ret;
-}
-
-/* Free memory.  */
-
-void
-backtrace_free (struct backtrace_state *state ATTRIBUTE_UNUSED,
-		void *p, size_t size ATTRIBUTE_UNUSED,
-		backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
-		void *data ATTRIBUTE_UNUSED)
-{
-  free (p);
-}
-
-/* Grow VEC by SIZE bytes.  */
-
-void *
-backtrace_vector_grow (struct backtrace_state *state ATTRIBUTE_UNUSED,
-		       size_t size, backtrace_error_callback error_callback,
-		       void *data, struct backtrace_vector *vec)
-{
-  void *ret;
-
-  if (size > vec->alc)
-    {
-      size_t alc;
-      void *base;
-
-      if (vec->size == 0)
-	alc = 32 * size;
-      else if (vec->size >= 4096)
-	alc = vec->size + 4096;
-      else
-	alc = 2 * vec->size;
-
-      if (alc < vec->size + size)
-	alc = vec->size + size;
-
-      base = realloc (vec->base, alc);
-      if (base == NULL)
-	{
-	  error_callback (data, "realloc", errno);
-	  return NULL;
-	}
-
-      vec->base = base;
-      vec->alc = alc - vec->size;
-    }
-
-  ret = (char *) vec->base + vec->size;
-  vec->size += size;
-  vec->alc -= size;
-  return ret;
-}
-
-/* Finish the current allocation on VEC.  */
-
-void *
-backtrace_vector_finish (struct backtrace_state *state,
-			 struct backtrace_vector *vec,
-			 backtrace_error_callback error_callback,
-			 void *data)
-{
-  void *ret;
-
-  /* With this allocator we call realloc in backtrace_vector_grow,
-     which means we can't easily reuse the memory here.  So just
-     release it.  */
-  if (!backtrace_vector_release (state, vec, error_callback, data))
-    return NULL;
-  ret = vec->base;
-  vec->base = NULL;
-  vec->size = 0;
-  vec->alc = 0;
-  return ret;
-}
-
-/* Release any extra space allocated for VEC.  */
-
-int
-backtrace_vector_release (struct backtrace_state *state ATTRIBUTE_UNUSED,
-			  struct backtrace_vector *vec,
-			  backtrace_error_callback error_callback,
-			  void *data)
-{
-  vec->base = realloc (vec->base, vec->size);
-  if (vec->base == NULL)
-    {
-      error_callback (data, "realloc", errno);
-      return 0;
-    }
-  vec->alc = 0;
-  return 1;
-}
diff --git a/third_party/gofrontend/libbacktrace/atomic.c b/third_party/gofrontend/libbacktrace/atomic.c
deleted file mode 100644
index fdd2490..0000000
--- a/third_party/gofrontend/libbacktrace/atomic.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/* atomic.c -- Support for atomic functions if not present.
-   Copyright (C) 2013-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <sys/types.h>
-
-#include "backtrace.h"
-#include "backtrace-supported.h"
-#include "internal.h"
-
-/* This file holds implementations of the atomic functions that are
-   used if the host compiler has the sync functions but not the atomic
-   functions, as is true of versions of GCC before 4.7.  */
-
-#if !defined (HAVE_ATOMIC_FUNCTIONS) && defined (HAVE_SYNC_FUNCTIONS)
-
-/* Do an atomic load of a pointer.  */
-
-void *
-backtrace_atomic_load_pointer (void *arg)
-{
-  void **pp;
-  void *p;
-
-  pp = (void **) arg;
-  p = *pp;
-  while (!__sync_bool_compare_and_swap (pp, p, p))
-    p = *pp;
-  return p;
-}
-
-/* Do an atomic load of an int.  */
-
-int
-backtrace_atomic_load_int (int *p)
-{
-  int i;
-
-  i = *p;
-  while (!__sync_bool_compare_and_swap (p, i, i))
-    i = *p;
-  return i;
-}
-
-/* Do an atomic store of a pointer.  */
-
-void
-backtrace_atomic_store_pointer (void *arg, void *p)
-{
-  void **pp;
-  void *old;
-
-  pp = (void **) arg;
-  old = *pp;
-  while (!__sync_bool_compare_and_swap (pp, old, p))
-    old = *pp;
-}
-
-/* Do an atomic store of a size_t value.  */
-
-void
-backtrace_atomic_store_size_t (size_t *p, size_t v)
-{
-  size_t old;
-
-  old = *p;
-  while (!__sync_bool_compare_and_swap (p, old, v))
-    old = *p;
-}
-
-/* Do an atomic store of a int value.  */
-
-void
-backtrace_atomic_store_int (int *p, int v)
-{
-  size_t old;
-
-  old = *p;
-  while (!__sync_bool_compare_and_swap (p, old, v))
-    old = *p;
-}
-
-#endif
diff --git a/third_party/gofrontend/libbacktrace/backtrace-supported.h.in b/third_party/gofrontend/libbacktrace/backtrace-supported.h.in
deleted file mode 100644
index 5115ce1..0000000
--- a/third_party/gofrontend/libbacktrace/backtrace-supported.h.in
+++ /dev/null
@@ -1,61 +0,0 @@
-/* backtrace-supported.h.in -- Whether stack backtrace is supported.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-/* The file backtrace-supported.h.in is used by configure to generate
-   the file backtrace-supported.h.  The file backtrace-supported.h may
-   be #include'd to see whether the backtrace library will be able to
-   get a backtrace and produce symbolic information.  */
-
-
-/* BACKTRACE_SUPPORTED will be #define'd as 1 if the backtrace library
-   should work, 0 if it will not.  Libraries may #include this to make
-   other arrangements.  */
-
-#define BACKTRACE_SUPPORTED @BACKTRACE_SUPPORTED@
-
-/* BACKTRACE_USES_MALLOC will be #define'd as 1 if the backtrace
-   library will call malloc as it works, 0 if it will call mmap
-   instead.  This may be used to determine whether it is safe to call
-   the backtrace functions from a signal handler.  In general this
-   only applies to calls like backtrace and backtrace_pcinfo.  It does
-   not apply to backtrace_simple, which never calls malloc.  It does
-   not apply to backtrace_print, which always calls fprintf and
-   therefore malloc.  */
-
-#define BACKTRACE_USES_MALLOC @BACKTRACE_USES_MALLOC@
-
-/* BACKTRACE_SUPPORTS_THREADS will be #define'd as 1 if the backtrace
-   library is configured with threading support, 0 if not.  If this is
-   0, the threaded parameter to backtrace_create_state must be passed
-   as 0.  */
-
-#define BACKTRACE_SUPPORTS_THREADS @BACKTRACE_SUPPORTS_THREADS@
diff --git a/third_party/gofrontend/libbacktrace/backtrace.c b/third_party/gofrontend/libbacktrace/backtrace.c
deleted file mode 100644
index d352d27..0000000
--- a/third_party/gofrontend/libbacktrace/backtrace.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/* backtrace.c -- Entry point for stack backtrace library.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include "unwind.h"
-#include "backtrace.h"
-
-/* The main backtrace_full routine.  */
-
-/* Data passed through _Unwind_Backtrace.  */
-
-struct backtrace_data
-{
-  /* Number of frames to skip.  */
-  int skip;
-  /* Library state.  */
-  struct backtrace_state *state;
-  /* Callback routine.  */
-  backtrace_full_callback callback;
-  /* Error callback routine.  */
-  backtrace_error_callback error_callback;
-  /* Data to pass to callback routines.  */
-  void *data;
-  /* Value to return from backtrace_full.  */
-  int ret;
-};
-
-/* Unwind library callback routine.  This is passed to
-   _Unwind_Backtrace.  */
-
-static _Unwind_Reason_Code
-unwind (struct _Unwind_Context *context, void *vdata)
-{
-  struct backtrace_data *bdata = (struct backtrace_data *) vdata;
-  uintptr_t pc;
-  int ip_before_insn = 0;
-
-#ifdef HAVE_GETIPINFO
-  pc = _Unwind_GetIPInfo (context, &ip_before_insn);
-#else
-  pc = _Unwind_GetIP (context);
-#endif
-
-  if (bdata->skip > 0)
-    {
-      --bdata->skip;
-      return _URC_NO_REASON;
-    }
-
-  if (!ip_before_insn)
-    --pc;
-
-  bdata->ret = backtrace_pcinfo (bdata->state, pc, bdata->callback,
-				 bdata->error_callback, bdata->data);
-  if (bdata->ret != 0)
-    return _URC_END_OF_STACK;
-
-  return _URC_NO_REASON;
-}
-
-/* Get a stack backtrace.  */
-
-int
-backtrace_full (struct backtrace_state *state, int skip,
-		backtrace_full_callback callback,
-		backtrace_error_callback error_callback, void *data)
-{
-  struct backtrace_data bdata;
-
-  bdata.skip = skip + 1;
-  bdata.state = state;
-  bdata.callback = callback;
-  bdata.error_callback = error_callback;
-  bdata.data = data;
-  bdata.ret = 0;
-  _Unwind_Backtrace (unwind, &bdata);
-  return bdata.ret;
-}
diff --git a/third_party/gofrontend/libbacktrace/backtrace.h b/third_party/gofrontend/libbacktrace/backtrace.h
deleted file mode 100644
index 50dcd40..0000000
--- a/third_party/gofrontend/libbacktrace/backtrace.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/* backtrace.h -- Public header file for stack backtrace library.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#ifndef BACKTRACE_H
-#define BACKTRACE_H
-
-#include <stddef.h>
-#include <stdio.h>
-
-/* We want to get a definition for uintptr_t, but we still care about
-   systems that don't have <stdint.h>.  */
-#if defined(__GLIBC__) && __GLIBC__ >= 2
-
-#include <stdint.h>
-
-#elif defined(HAVE_STDINT_H)
-
-#include <stdint.h>
-
-#else
-
-/* Systems that don't have <stdint.h> must provide gstdint.h, e.g.,
-   from GCC_HEADER_STDINT in configure.ac.  */
-#include "gstdint.h"
-
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* The backtrace state.  This struct is intentionally not defined in
-   the public interface.  */
-
-struct backtrace_state;
-
-/* The type of the error callback argument to backtrace functions.
-   This function, if not NULL, will be called for certain error cases.
-   The DATA argument is passed to the function that calls this one.
-   The MSG argument is an error message.  The ERRNUM argument, if
-   greater than 0, holds an errno value.  The MSG buffer may become
-   invalid after this function returns.
-
-   As a special case, the ERRNUM argument will be passed as -1 if no
-   debug info can be found for the executable, but the function
-   requires debug info (e.g., backtrace_full, backtrace_pcinfo).  The
-   MSG in this case will be something along the lines of "no debug
-   info".  Similarly, ERRNUM will be passed as -1 if there is no
-   symbol table, but the function requires a symbol table (e.g.,
-   backtrace_syminfo).  This may be used as a signal that some other
-   approach should be tried.  */
-
-typedef void (*backtrace_error_callback) (void *data, const char *msg,
-					  int errnum);
-
-/* Create state information for the backtrace routines.  This must be
-   called before any of the other routines, and its return value must
-   be passed to all of the other routines.  FILENAME is the path name
-   of the executable file; if it is NULL the library will try
-   system-specific path names.  If not NULL, FILENAME must point to a
-   permanent buffer.  If THREADED is non-zero the state may be
-   accessed by multiple threads simultaneously, and the library will
-   use appropriate atomic operations.  If THREADED is zero the state
-   may only be accessed by one thread at a time.  This returns a state
-   pointer on success, NULL on error.  If an error occurs, this will
-   call the ERROR_CALLBACK routine.  */
-
-extern struct backtrace_state *backtrace_create_state (
-    const char *filename, int threaded,
-    backtrace_error_callback error_callback, void *data);
-
-/* The type of the callback argument to the backtrace_full function.
-   DATA is the argument passed to backtrace_full.  PC is the program
-   counter.  FILENAME is the name of the file containing PC, or NULL
-   if not available.  LINENO is the line number in FILENAME containing
-   PC, or 0 if not available.  FUNCTION is the name of the function
-   containing PC, or NULL if not available.  This should return 0 to
-   continuing tracing.  The FILENAME and FUNCTION buffers may become
-   invalid after this function returns.  */
-
-typedef int (*backtrace_full_callback) (void *data, uintptr_t pc,
-					const char *filename, int lineno,
-					const char *function);
-
-/* Get a full stack backtrace.  SKIP is the number of frames to skip;
-   passing 0 will start the trace with the function calling
-   backtrace_full.  DATA is passed to the callback routine.  If any
-   call to CALLBACK returns a non-zero value, the stack backtrace
-   stops, and backtrace returns that value; this may be used to limit
-   the number of stack frames desired.  If all calls to CALLBACK
-   return 0, backtrace returns 0.  The backtrace_full function will
-   make at least one call to either CALLBACK or ERROR_CALLBACK.  This
-   function requires debug info for the executable.  */
-
-extern int backtrace_full (struct backtrace_state *state, int skip,
-			   backtrace_full_callback callback,
-			   backtrace_error_callback error_callback,
-			   void *data);
-
-/* The type of the callback argument to the backtrace_simple function.
-   DATA is the argument passed to simple_backtrace.  PC is the program
-   counter.  This should return 0 to continue tracing.  */
-
-typedef int (*backtrace_simple_callback) (void *data, uintptr_t pc);
-
-/* Get a simple backtrace.  SKIP is the number of frames to skip, as
-   in backtrace.  DATA is passed to the callback routine.  If any call
-   to CALLBACK returns a non-zero value, the stack backtrace stops,
-   and backtrace_simple returns that value.  Otherwise
-   backtrace_simple returns 0.  The backtrace_simple function will
-   make at least one call to either CALLBACK or ERROR_CALLBACK.  This
-   function does not require any debug info for the executable.  */
-
-extern int backtrace_simple (struct backtrace_state *state, int skip,
-			     backtrace_simple_callback callback,
-			     backtrace_error_callback error_callback,
-			     void *data);
-
-/* Print the current backtrace in a user readable format to a FILE.
-   SKIP is the number of frames to skip, as in backtrace_full.  Any
-   error messages are printed to stderr.  This function requires debug
-   info for the executable.  */
-
-extern void backtrace_print (struct backtrace_state *state, int skip, FILE *);
-
-/* Given PC, a program counter in the current program, call the
-   callback function with filename, line number, and function name
-   information.  This will normally call the callback function exactly
-   once.  However, if the PC happens to describe an inlined call, and
-   the debugging information contains the necessary information, then
-   this may call the callback function multiple times.  This will make
-   at least one call to either CALLBACK or ERROR_CALLBACK.  This
-   returns the first non-zero value returned by CALLBACK, or 0.  */
-
-extern int backtrace_pcinfo (struct backtrace_state *state, uintptr_t pc,
-			     backtrace_full_callback callback,
-			     backtrace_error_callback error_callback,
-			     void *data);
-
-/* The type of the callback argument to backtrace_syminfo.  DATA and
-   PC are the arguments passed to backtrace_syminfo.  SYMNAME is the
-   name of the symbol for the corresponding code.  SYMVAL is the
-   value and SYMSIZE is the size of the symbol.  SYMNAME will be NULL
-   if no error occurred but the symbol could not be found.  */
-
-typedef void (*backtrace_syminfo_callback) (void *data, uintptr_t pc,
-					    const char *symname,
-					    uintptr_t symval,
-					    uintptr_t symsize);
-
-/* Given ADDR, an address or program counter in the current program,
-   call the callback information with the symbol name and value
-   describing the function or variable in which ADDR may be found.
-   This will call either CALLBACK or ERROR_CALLBACK exactly once.
-   This returns 1 on success, 0 on failure.  This function requires
-   the symbol table but does not require the debug info.  Note that if
-   the symbol table is present but ADDR could not be found in the
-   table, CALLBACK will be called with a NULL SYMNAME argument.
-   Returns 1 on success, 0 on error.  */
-
-extern int backtrace_syminfo (struct backtrace_state *state, uintptr_t addr,
-			      backtrace_syminfo_callback callback,
-			      backtrace_error_callback error_callback,
-			      void *data);
-
-#ifdef __cplusplus
-} /* End extern "C".  */
-#endif
-
-#endif
diff --git a/third_party/gofrontend/libbacktrace/btest.c b/third_party/gofrontend/libbacktrace/btest.c
deleted file mode 100644
index 9424a92..0000000
--- a/third_party/gofrontend/libbacktrace/btest.c
+++ /dev/null
@@ -1,715 +0,0 @@
-/* btest.c -- Test for libbacktrace library
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-/* This program tests the externally visible interfaces of the
-   libbacktrace library.  */
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "filenames.h"
-
-#include "backtrace.h"
-#include "backtrace-supported.h"
-
-/* Portable attribute syntax.  Actually some of these tests probably
-   won't work if the attributes are not recognized.  */
-
-#ifndef GCC_VERSION
-# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
-#endif
-
-#if (GCC_VERSION < 2007)
-# define __attribute__(x)
-#endif
-
-#ifndef ATTRIBUTE_UNUSED
-# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-#endif
-
-/* Used to collect backtrace info.  */
-
-struct info
-{
-  char *filename;
-  int lineno;
-  char *function;
-};
-
-/* Passed to backtrace callback function.  */
-
-struct bdata
-{
-  struct info *all;
-  size_t index;
-  size_t max;
-  int failed;
-};
-
-/* Passed to backtrace_simple callback function.  */
-
-struct sdata
-{
-  uintptr_t *addrs;
-  size_t index;
-  size_t max;
-  int failed;
-};
-
-/* Passed to backtrace_syminfo callback function.  */
-
-struct symdata
-{
-  const char *name;
-  uintptr_t val, size;
-  int failed;
-};
-
-/* The backtrace state.  */
-
-static void *state;
-
-/* The number of failures.  */
-
-static int failures;
-
-/* Return the base name in a path.  */
-
-static const char *
-base (const char *p)
-{
-  const char *last;
-  const char *s;
-
-  last = NULL;
-  for (s = p; *s != '\0'; ++s)
-    {
-      if (IS_DIR_SEPARATOR (*s))
-	last = s + 1;
-    }
-  return last != NULL ? last : p;
-}
-
-/* Check an entry in a struct info array.  */
-
-static void
-check (const char *name, int index, const struct info *all, int want_lineno,
-       const char *want_function, int *failed)
-{
-  if (*failed)
-    return;
-  if (all[index].filename == NULL || all[index].function == NULL)
-    {
-      fprintf (stderr, "%s: [%d]: missing file name or function name\n",
-	       name, index);
-      *failed = 1;
-      return;
-    }
-  if (strcmp (base (all[index].filename), "btest.c") != 0)
-    {
-      fprintf (stderr, "%s: [%d]: got %s expected test.c\n", name, index,
-	       all[index].filename);
-      *failed = 1;
-    }
-  if (all[index].lineno != want_lineno)
-    {
-      fprintf (stderr, "%s: [%d]: got %d expected %d\n", name, index,
-	       all[index].lineno, want_lineno);
-      *failed = 1;
-    }
-  if (strcmp (all[index].function, want_function) != 0)
-    {
-      fprintf (stderr, "%s: [%d]: got %s expected %s\n", name, index,
-	       all[index].function, want_function);
-      *failed = 1;
-    }
-}
-
-/* The backtrace callback function.  */
-
-static int
-callback_one (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED,
-	      const char *filename, int lineno, const char *function)
-{
-  struct bdata *data = (struct bdata *) vdata;
-  struct info *p;
-
-  if (data->index >= data->max)
-    {
-      fprintf (stderr, "callback_one: callback called too many times\n");
-      data->failed = 1;
-      return 1;
-    }
-
-  p = &data->all[data->index];
-  if (filename == NULL)
-    p->filename = NULL;
-  else
-    {
-      p->filename = strdup (filename);
-      assert (p->filename != NULL);
-    }
-  p->lineno = lineno;
-  if (function == NULL)
-    p->function = NULL;
-  else
-    {
-      p->function = strdup (function);
-      assert (p->function != NULL);
-    }
-  ++data->index;
-
-  return 0;
-}
-
-/* An error callback passed to backtrace.  */
-
-static void
-error_callback_one (void *vdata, const char *msg, int errnum)
-{
-  struct bdata *data = (struct bdata *) vdata;
-
-  fprintf (stderr, "%s", msg);
-  if (errnum > 0)
-    fprintf (stderr, ": %s", strerror (errnum));
-  fprintf (stderr, "\n");
-  data->failed = 1;
-}
-
-/* The backtrace_simple callback function.  */
-
-static int
-callback_two (void *vdata, uintptr_t pc)
-{
-  struct sdata *data = (struct sdata *) vdata;
-
-  if (data->index >= data->max)
-    {
-      fprintf (stderr, "callback_two: callback called too many times\n");
-      data->failed = 1;
-      return 1;
-    }
-
-  data->addrs[data->index] = pc;
-  ++data->index;
-
-  return 0;
-}
-
-/* An error callback passed to backtrace_simple.  */
-
-static void
-error_callback_two (void *vdata, const char *msg, int errnum)
-{
-  struct sdata *data = (struct sdata *) vdata;
-
-  fprintf (stderr, "%s", msg);
-  if (errnum > 0)
-    fprintf (stderr, ": %s", strerror (errnum));
-  fprintf (stderr, "\n");
-  data->failed = 1;
-}
-
-/* The backtrace_syminfo callback function.  */
-
-static void
-callback_three (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED,
-		const char *symname, uintptr_t symval,
-		uintptr_t symsize)
-{
-  struct symdata *data = (struct symdata *) vdata;
-
-  if (symname == NULL)
-    data->name = NULL;
-  else
-    {
-      data->name = strdup (symname);
-      assert (data->name != NULL);
-    }
-  data->val = symval;
-  data->size = symsize;
-}
-
-/* The backtrace_syminfo error callback function.  */
-
-static void
-error_callback_three (void *vdata, const char *msg, int errnum)
-{
-  struct symdata *data = (struct symdata *) vdata;
-
-  fprintf (stderr, "%s", msg);
-  if (errnum > 0)
-    fprintf (stderr, ": %s", strerror (errnum));
-  fprintf (stderr, "\n");
-  data->failed = 1;
-}
-
-/* Test the backtrace function with non-inlined functions.  */
-
-static int test1 (void) __attribute__ ((noinline, unused));
-static int f2 (int) __attribute__ ((noinline));
-static int f3 (int, int) __attribute__ ((noinline));
-
-static int
-test1 (void)
-{
-  /* Returning a value here and elsewhere avoids a tailcall which
-     would mess up the backtrace.  */
-  return f2 (__LINE__) + 1;
-}
-
-static int
-f2 (int f1line)
-{
-  return f3 (f1line, __LINE__) + 2;
-}
-
-static int
-f3 (int f1line, int f2line)
-{
-  struct info all[20];
-  struct bdata data;
-  int f3line;
-  int i;
-
-  data.all = &all[0];
-  data.index = 0;
-  data.max = 20;
-  data.failed = 0;
-
-  f3line = __LINE__ + 1;
-  i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
-
-  if (i != 0)
-    {
-      fprintf (stderr, "test1: unexpected return value %d\n", i);
-      data.failed = 1;
-    }
-
-  if (data.index < 3)
-    {
-      fprintf (stderr,
-	       "test1: not enough frames; got %zu, expected at least 3\n",
-	       data.index);
-      data.failed = 1;
-    }
-
-  check ("test1", 0, all, f3line, "f3", &data.failed);
-  check ("test1", 1, all, f2line, "f2", &data.failed);
-  check ("test1", 2, all, f1line, "test1", &data.failed);
-
-  printf ("%s: backtrace_full noinline\n", data.failed ? "FAIL" : "PASS");
-
-  if (data.failed)
-    ++failures;
-
-  return failures;
-}
-
-/* Test the backtrace function with inlined functions.  */
-
-static inline int test2 (void) __attribute__ ((always_inline, unused));
-static inline int f12 (int) __attribute__ ((always_inline));
-static inline int f13 (int, int) __attribute__ ((always_inline));
-
-static inline int
-test2 (void)
-{
-  return f12 (__LINE__) + 1;
-}
-
-static inline int
-f12 (int f1line)
-{
-  return f13 (f1line, __LINE__) + 2;
-}
-
-static inline int
-f13 (int f1line, int f2line)
-{
-  struct info all[20];
-  struct bdata data;
-  int f3line;
-  int i;
-
-  data.all = &all[0];
-  data.index = 0;
-  data.max = 20;
-  data.failed = 0;
-
-  f3line = __LINE__ + 1;
-  i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
-
-  if (i != 0)
-    {
-      fprintf (stderr, "test2: unexpected return value %d\n", i);
-      data.failed = 1;
-    }
-
-  check ("test2", 0, all, f3line, "f13", &data.failed);
-  check ("test2", 1, all, f2line, "f12", &data.failed);
-  check ("test2", 2, all, f1line, "test2", &data.failed);
-
-  printf ("%s: backtrace_full inline\n", data.failed ? "FAIL" : "PASS");
-
-  if (data.failed)
-    ++failures;
-
-  return failures;
-}
-
-/* Test the backtrace_simple function with non-inlined functions.  */
-
-static int test3 (void) __attribute__ ((noinline, unused));
-static int f22 (int) __attribute__ ((noinline));
-static int f23 (int, int) __attribute__ ((noinline));
-
-static int
-test3 (void)
-{
-  return f22 (__LINE__) + 1;
-}
-
-static int
-f22 (int f1line)
-{
-  return f23 (f1line, __LINE__) + 2;
-}
-
-static int
-f23 (int f1line, int f2line)
-{
-  uintptr_t addrs[20];
-  struct sdata data;
-  int f3line;
-  int i;
-
-  data.addrs = &addrs[0];
-  data.index = 0;
-  data.max = 20;
-  data.failed = 0;
-
-  f3line = __LINE__ + 1;
-  i = backtrace_simple (state, 0, callback_two, error_callback_two, &data);
-
-  if (i != 0)
-    {
-      fprintf (stderr, "test3: unexpected return value %d\n", i);
-      data.failed = 1;
-    }
-
-  if (!data.failed)
-    {
-      struct info all[20];
-      struct bdata bdata;
-      int j;
-
-      bdata.all = &all[0];
-      bdata.index = 0;
-      bdata.max = 20;
-      bdata.failed = 0;
-
-      for (j = 0; j < 3; ++j)
-	{
-	  i = backtrace_pcinfo (state, addrs[j], callback_one,
-				error_callback_one, &bdata);
-	  if (i != 0)
-	    {
-	      fprintf (stderr,
-		       ("test3: unexpected return value "
-			"from backtrace_pcinfo %d\n"),
-		       i);
-	      bdata.failed = 1;
-	    }
-	  if (!bdata.failed && bdata.index != (size_t) (j + 1))
-	    {
-	      fprintf (stderr,
-		       ("wrong number of calls from backtrace_pcinfo "
-			"got %u expected %d\n"),
-		       (unsigned int) bdata.index, j + 1);
-	      bdata.failed = 1;
-	    }
-	}      
-
-      check ("test3", 0, all, f3line, "f23", &bdata.failed);
-      check ("test3", 1, all, f2line, "f22", &bdata.failed);
-      check ("test3", 2, all, f1line, "test3", &bdata.failed);
-
-      if (bdata.failed)
-	data.failed = 1;
-
-      for (j = 0; j < 3; ++j)
-	{
-	  struct symdata symdata;
-
-	  symdata.name = NULL;
-	  symdata.val = 0;
-	  symdata.size = 0;
-	  symdata.failed = 0;
-
-	  i = backtrace_syminfo (state, addrs[j], callback_three,
-				 error_callback_three, &symdata);
-	  if (i == 0)
-	    {
-	      fprintf (stderr,
-		       ("test3: [%d]: unexpected return value "
-			"from backtrace_syminfo %d\n"),
-		       j, i);
-	      symdata.failed = 1;
-	    }
-
-	  if (!symdata.failed)
-	    {
-	      const char *expected;
-
-	      switch (j)
-		{
-		case 0:
-		  expected = "f23";
-		  break;
-		case 1:
-		  expected = "f22";
-		  break;
-		case 2:
-		  expected = "test3";
-		  break;
-		default:
-		  assert (0);
-		}
-
-	      if (symdata.name == NULL)
-		{
-		  fprintf (stderr, "test3: [%d]: NULL syminfo name\n", j);
-		  symdata.failed = 1;
-		}
-	      /* Use strncmp, not strcmp, because GCC might create a
-		 clone.  */
-	      else if (strncmp (symdata.name, expected, strlen (expected))
-		       != 0)
-		{
-		  fprintf (stderr,
-			   ("test3: [%d]: unexpected syminfo name "
-			    "got %s expected %s\n"),
-			   j, symdata.name, expected);
-		  symdata.failed = 1;
-		}
-	    }
-
-	  if (symdata.failed)
-	    data.failed = 1;
-	}
-    }
-
-  printf ("%s: backtrace_simple noinline\n", data.failed ? "FAIL" : "PASS");
-
-  if (data.failed)
-    ++failures;
-
-  return failures;
-}
-
-/* Test the backtrace_simple function with inlined functions.  */
-
-static inline int test4 (void) __attribute__ ((always_inline, unused));
-static inline int f32 (int) __attribute__ ((always_inline));
-static inline int f33 (int, int) __attribute__ ((always_inline));
-
-static inline int
-test4 (void)
-{
-  return f32 (__LINE__) + 1;
-}
-
-static inline int
-f32 (int f1line)
-{
-  return f33 (f1line, __LINE__) + 2;
-}
-
-static inline int
-f33 (int f1line, int f2line)
-{
-  uintptr_t addrs[20];
-  struct sdata data;
-  int f3line;
-  int i;
-
-  data.addrs = &addrs[0];
-  data.index = 0;
-  data.max = 20;
-  data.failed = 0;
-
-  f3line = __LINE__ + 1;
-  i = backtrace_simple (state, 0, callback_two, error_callback_two, &data);
-
-  if (i != 0)
-    {
-      fprintf (stderr, "test3: unexpected return value %d\n", i);
-      data.failed = 1;
-    }
-
-  if (!data.failed)
-    {
-      struct info all[20];
-      struct bdata bdata;
-
-      bdata.all = &all[0];
-      bdata.index = 0;
-      bdata.max = 20;
-      bdata.failed = 0;
-
-      i = backtrace_pcinfo (state, addrs[0], callback_one, error_callback_one,
-			    &bdata);
-      if (i != 0)
-	{
-	  fprintf (stderr,
-		   ("test4: unexpected return value "
-		    "from backtrace_pcinfo %d\n"),
-		   i);
-	  bdata.failed = 1;
-	}
-
-      check ("test4", 0, all, f3line, "f33", &bdata.failed);
-      check ("test4", 1, all, f2line, "f32", &bdata.failed);
-      check ("test4", 2, all, f1line, "test4", &bdata.failed);
-
-      if (bdata.failed)
-	data.failed = 1;
-    }
-
-  printf ("%s: backtrace_simple inline\n", data.failed ? "FAIL" : "PASS");
-
-  if (data.failed)
-    ++failures;
-
-  return failures;
-}
-
-int global = 1;
-
-static int
-test5 (void)
-{
-  struct symdata symdata;
-  int i;
-  uintptr_t addr = (uintptr_t) &global;
-
-  if (sizeof (global) > 1)
-    addr += 1;
-
-  symdata.name = NULL;
-  symdata.val = 0;
-  symdata.size = 0;
-  symdata.failed = 0;
-
-  i = backtrace_syminfo (state, addr, callback_three,
-			 error_callback_three, &symdata);
-  if (i == 0)
-    {
-      fprintf (stderr,
-	       "test5: unexpected return value from backtrace_syminfo %d\n",
-	       i);
-      symdata.failed = 1;
-    }
-
-  if (!symdata.failed)
-    {
-      if (symdata.name == NULL)
-	{
-	  fprintf (stderr, "test5: NULL syminfo name\n");
-	  symdata.failed = 1;
-	}
-      else if (strcmp (symdata.name, "global") != 0)
-	{
-	  fprintf (stderr,
-		   "test5: unexpected syminfo name got %s expected %s\n",
-		   symdata.name, "global");
-	  symdata.failed = 1;
-	}
-      else if (symdata.val != (uintptr_t) &global)
-	{
-	  fprintf (stderr,
-		   "test5: unexpected syminfo value got %lx expected %lx\n",
-		   (unsigned long) symdata.val,
-		   (unsigned long) (uintptr_t) &global);
-	  symdata.failed = 1;
-	}
-      else if (symdata.size != sizeof (global))
-	{
-	  fprintf (stderr,
-		   "test5: unexpected syminfo size got %lx expected %lx\n",
-		   (unsigned long) symdata.size,
-		   (unsigned long) sizeof (global));
-	  symdata.failed = 1;
-	}
-    }
-
-  printf ("%s: backtrace_syminfo variable\n",
-	  symdata.failed ? "FAIL" : "PASS");
-
-  if (symdata.failed)
-    ++failures;
-
-  return failures;
-}
-
-static void
-error_callback_create (void *data ATTRIBUTE_UNUSED, const char *msg,
-		       int errnum)
-{
-  fprintf (stderr, "%s", msg);
-  if (errnum > 0)
-    fprintf (stderr, ": %s", strerror (errnum));
-  fprintf (stderr, "\n");
-  exit (EXIT_FAILURE);
-}
-
-/* Run all the tests.  */
-
-int
-main (int argc ATTRIBUTE_UNUSED, char **argv)
-{
-  state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
-				  error_callback_create, NULL);
-
-#if BACKTRACE_SUPPORTED
-  test1 ();
-  test2 ();
-  test3 ();
-  test4 ();
-  test5 ();
-#endif
-
-  exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
-}
diff --git a/third_party/gofrontend/libbacktrace/config.h.in b/third_party/gofrontend/libbacktrace/config.h.in
deleted file mode 100644
index 87cb805..0000000
--- a/third_party/gofrontend/libbacktrace/config.h.in
+++ /dev/null
@@ -1,134 +0,0 @@
-/* config.h.in.  Generated from configure.ac by autoheader.  */
-
-/* ELF size: 32 or 64 */
-#undef BACKTRACE_ELF_SIZE
-
-/* Define to 1 if you have the __atomic functions */
-#undef HAVE_ATOMIC_FUNCTIONS
-
-/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
-   don't. */
-#undef HAVE_DECL_STRNLEN
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define if dl_iterate_phdr is available. */
-#undef HAVE_DL_ITERATE_PHDR
-
-/* Define to 1 if you have the fcntl function */
-#undef HAVE_FCNTL
-
-/* Define if getexecname is available. */
-#undef HAVE_GETEXECNAME
-
-/* Define if _Unwind_GetIPInfo is available. */
-#undef HAVE_GETIPINFO
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the <link.h> header file. */
-#undef HAVE_LINK_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the __sync functions */
-#undef HAVE_SYNC_FUNCTIONS
-
-/* Define to 1 if you have the <sys/mman.h> header file. */
-#undef HAVE_SYS_MMAN_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#undef LT_OBJDIR
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* The size of `char', as computed by sizeof. */
-#undef SIZEOF_CHAR
-
-/* The size of `int', as computed by sizeof. */
-#undef SIZEOF_INT
-
-/* The size of `long', as computed by sizeof. */
-#undef SIZEOF_LONG
-
-/* The size of `short', as computed by sizeof. */
-#undef SIZEOF_SHORT
-
-/* The size of `void *', as computed by sizeof. */
-#undef SIZEOF_VOID_P
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Enable extensions on AIX 3, Interix.  */
-#ifndef _ALL_SOURCE
-# undef _ALL_SOURCE
-#endif
-/* Enable GNU extensions on systems that have them.  */
-#ifndef _GNU_SOURCE
-# undef _GNU_SOURCE
-#endif
-/* Enable threading extensions on Solaris.  */
-#ifndef _POSIX_PTHREAD_SEMANTICS
-# undef _POSIX_PTHREAD_SEMANTICS
-#endif
-/* Enable extensions on HP NonStop.  */
-#ifndef _TANDEM_SOURCE
-# undef _TANDEM_SOURCE
-#endif
-/* Enable general extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# undef __EXTENSIONS__
-#endif
-
-
-/* Define to 1 if on MINIX. */
-#undef _MINIX
-
-/* Define to 2 if the system does not provide POSIX.1 features except with
-   this defined. */
-#undef _POSIX_1_SOURCE
-
-/* Define to 1 if you need to in order for `stat' and other things to work. */
-#undef _POSIX_SOURCE
diff --git a/third_party/gofrontend/libbacktrace/configure b/third_party/gofrontend/libbacktrace/configure
deleted file mode 100755
index d6abc7d..0000000
--- a/third_party/gofrontend/libbacktrace/configure
+++ /dev/null
@@ -1,15156 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.64 for package-unused version-unused.
-#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software
-# Foundation, Inc.
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test "x$CONFIG_SHELL" = x; then
-  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-"
-  as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
-  exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1"
-  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
-  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
-  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
-  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1
-
-  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
-    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    PATH=/empty FPATH=/empty; export PATH FPATH
-    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
-      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
-  if (eval "$as_required") 2>/dev/null; then :
-  as_have_required=yes
-else
-  as_have_required=no
-fi
-  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  as_found=:
-  case $as_dir in #(
-	 /*)
-	   for as_base in sh bash ksh sh5; do
-	     # Try only shells that exist, to save several forks.
-	     as_shell=$as_dir/$as_base
-	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  CONFIG_SHELL=$as_shell as_have_required=yes
-		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  break 2
-fi
-fi
-	   done;;
-       esac
-  as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
-	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
-  CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
-      if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-	# neutralization value for shells without unset; and this also
-	# works around shells that cannot unset nonexistent variables.
-	BASH_ENV=/dev/null
-	ENV=/dev/null
-	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-	export CONFIG_SHELL
-	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
-fi
-
-    if test x$as_have_required = xno; then :
-  $as_echo "$0: This script requires a shell more modern than all"
-  $as_echo "$0: the shells that I found on your system."
-  if test x${ZSH_VERSION+set} = xset ; then
-    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
-    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
-  else
-    $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
-$0: including any error possibly output before this
-$0: message. Then install a modern shell, or manually run
-$0: the script under such a shell if you do have one."
-  fi
-  exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$?; test $as_status -eq 0 && as_status=1
-  if test "$3"; then
-    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
-  fi
-  $as_echo "$as_me: error: $1" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
-  as_lineno_1=$LINENO as_lineno_1a=$LINENO
-  as_lineno_2=$LINENO as_lineno_2a=$LINENO
-  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
-  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
-  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-
-exec 7<&0 </dev/null 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='package-unused'
-PACKAGE_TARNAME='libbacktrace'
-PACKAGE_VERSION='version-unused'
-PACKAGE_STRING='package-unused version-unused'
-PACKAGE_BUGREPORT=''
-PACKAGE_URL=''
-
-ac_unique_file="backtrace.h"
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='am__EXEEXT_FALSE
-am__EXEEXT_TRUE
-LTLIBOBJS
-LIBOBJS
-NATIVE_FALSE
-NATIVE_TRUE
-BACKTRACE_USES_MALLOC
-ALLOC_FILE
-VIEW_FILE
-BACKTRACE_SUPPORTED
-FORMAT_FILE
-BACKTRACE_SUPPORTS_THREADS
-PIC_FLAG
-WARN_FLAGS
-EXTRA_FLAGS
-BACKTRACE_FILE
-multi_basedir
-OTOOL64
-OTOOL
-LIPO
-NMEDIT
-DSYMUTIL
-AR
-OBJDUMP
-LN_S
-NM
-ac_ct_DUMPBIN
-DUMPBIN
-LD
-FGREP
-SED
-LIBTOOL
-RANLIB
-MAINT
-MAINTAINER_MODE_FALSE
-MAINTAINER_MODE_TRUE
-am__untar
-am__tar
-AMTAR
-am__leading_dot
-SET_MAKE
-AWK
-mkdir_p
-MKDIR_P
-INSTALL_STRIP_PROGRAM
-STRIP
-install_sh
-MAKEINFO
-AUTOHEADER
-AUTOMAKE
-AUTOCONF
-ACLOCAL
-VERSION
-PACKAGE
-CYGPATH_W
-am__isrc
-INSTALL_DATA
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-libtool_VERSION
-EGREP
-GREP
-CPP
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-target_os
-target_vendor
-target_cpu
-target
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-enable_maintainer_mode
-with_target_subdir
-enable_shared
-enable_static
-with_pic
-enable_fast_install
-with_gnu_ld
-enable_libtool_lock
-enable_multilib
-with_system_libunwind
-enable_host_shared
-'
-      ac_precious_vars='build_alias
-host_alias
-target_alias
-CC
-CFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-CPP'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval $ac_prev=\$ac_option
-    ac_prev=
-    continue
-  fi
-
-  case $ac_option in
-  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *)	ac_optarg=yes ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_dashdash$ac_option in
-  --)
-    ac_dashdash=yes ;;
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=*)
-    datadir=$ac_optarg ;;
-
-  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
-  | --dataroo | --dataro | --datar)
-    ac_prev=datarootdir ;;
-  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
-  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
-    datarootdir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=no ;;
-
-  -docdir | --docdir | --docdi | --doc | --do)
-    ac_prev=docdir ;;
-  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
-    docdir=$ac_optarg ;;
-
-  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
-    ac_prev=dvidir ;;
-  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
-    dvidir=$ac_optarg ;;
-
-  -enable-* | --enable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=\$ac_optarg ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
-    ac_prev=htmldir ;;
-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
-  | --ht=*)
-    htmldir=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localedir | --localedir | --localedi | --localed | --locale)
-    ac_prev=localedir ;;
-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
-    localedir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst | --locals)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
-    ac_prev=pdfdir ;;
-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
-    pdfdir=$ac_optarg ;;
-
-  -psdir | --psdir | --psdi | --psd | --ps)
-    ac_prev=psdir ;;
-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
-    psdir=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=\$ac_optarg ;;
-
-  -without-* | --without-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=no ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) as_fn_error "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information."
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    case $ac_envvar in #(
-      '' | [0-9]* | *[!_$as_cr_alnum]* )
-      as_fn_error "invalid variable name: \`$ac_envvar'" ;;
-    esac
-    eval $ac_envvar=\$ac_optarg
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  as_fn_error "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
-  case $enable_option_checking in
-    no) ;;
-    fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
-  esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
-		datadir sysconfdir sharedstatedir localstatedir includedir \
-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
-do
-  eval ac_val=\$$ac_var
-  # Remove trailing slashes.
-  case $ac_val in
-    */ )
-      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
-      eval $ac_var=\$ac_val;;
-  esac
-  # Be sure to have absolute directory names.
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* )  continue;;
-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
-  esac
-  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used." >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  as_fn_error "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  as_fn_error "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_myself" : 'X\(//\)[^/]' \| \
-	 X"$as_myself" : 'X\(//\)$' \| \
-	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r "$srcdir/$ac_unique_file"; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
-  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
-	pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
-  srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
-  eval ac_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_env_${ac_var}_value=\$${ac_var}
-  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
-  # Omit some internal or obsolete options to make the list less imposing.
-  # This message is too long to be a string in the A/UX 3.1 sh.
-  cat <<_ACEOF
-\`configure' configures package-unused version-unused to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR            user executables [EPREFIX/bin]
-  --sbindir=DIR           system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR        program executables [EPREFIX/libexec]
-  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
-  --libdir=DIR            object code libraries [EPREFIX/lib]
-  --includedir=DIR        C header files [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
-  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR           info documentation [DATAROOTDIR/info]
-  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR            man documentation [DATAROOTDIR/man]
-  --docdir=DIR            documentation root [DATAROOTDIR/doc/libbacktrace]
-  --htmldir=DIR           html documentation [DOCDIR]
-  --dvidir=DIR            dvi documentation [DOCDIR]
-  --pdfdir=DIR            pdf documentation [DOCDIR]
-  --psdir=DIR             ps documentation [DOCDIR]
-_ACEOF
-
-  cat <<\_ACEOF
-
-Program names:
-  --program-prefix=PREFIX            prepend PREFIX to installed program names
-  --program-suffix=SUFFIX            append SUFFIX to installed program names
-  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
-  --target=TARGET   configure for building compilers for TARGET [HOST]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of package-unused version-unused:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-option-checking  ignore unrecognized --enable/--with options
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-maintainer-mode  enable make rules and dependencies not useful
-			  (and sometimes confusing) to the casual installer
-  --enable-shared[=PKGS]  build shared libraries [default=no]
-  --enable-static[=PKGS]  build static libraries [default=yes]
-  --enable-fast-install[=PKGS]
-                          optimize for fast installation [default=yes]
-  --disable-libtool-lock  avoid locking (might break parallel builds)
-  --enable-multilib       build many library versions (default)
-  --enable-host-shared    build host code as shared libraries
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-target-subdir=SUBDIR      Configuring in a subdirectory for target
-  --with-pic              try to use only PIC/non-PIC objects [default=use
-                          both]
-  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-system-libunwind use installed libunwind
-
-Some influential environment variables:
-  CC          C compiler command
-  CFLAGS      C compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  LIBS        libraries to pass to the linker, e.g. -l<library>
-  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
-              you have headers in a nonstandard directory <include dir>
-  CPP         C preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to the package provider.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" ||
-      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
-      continue
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-    cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
-    elif test -f "$ac_srcdir/configure"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure" --help=recursive
-    else
-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi || ac_status=$?
-    cd "$ac_pwd" || { ac_status=$?; break; }
-  done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
-  cat <<\_ACEOF
-package-unused configure version-unused
-generated by GNU Autoconf 2.64
-
-Copyright (C) 2009 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit
-fi
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_header_compiler=yes
-else
-  ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  ac_header_preproc=yes
-else
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
-  yes:no: )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_mongrel
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $2 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_func
-
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
-# -------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_c_check_type ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_type
-
-# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
-# --------------------------------------------
-# Tries to find the compile-time value of EXPR in a program that includes
-# INCLUDES, setting VAR accordingly. Returns whether the value could be
-# computed
-ac_fn_c_compute_int ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if test "$cross_compiling" = yes; then
-    # Depending upon the size, compute the lo and hi bounds.
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= 0)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_lo=0 ac_mid=0
-  while :; do
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=$ac_mid; break
-else
-  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
-			if test $ac_lo -le $ac_mid; then
-			  ac_lo= ac_hi=
-			  break
-			fi
-			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) < 0)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=-1 ac_mid=-1
-  while :; do
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_lo=$ac_mid; break
-else
-  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
-			if test $ac_mid -le $ac_hi; then
-			  ac_lo= ac_hi=
-			  break
-			fi
-			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  ac_lo= ac_hi=
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-# Binary search between lo and hi bounds.
-while test "x$ac_lo" != "x$ac_hi"; do
-  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=$ac_mid
-else
-  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-case $ac_lo in #((
-?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
-'') ac_retval=1 ;;
-esac
-  else
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-static long int longval () { return $2; }
-static unsigned long int ulongval () { return $2; }
-#include <stdio.h>
-#include <stdlib.h>
-int
-main ()
-{
-
-  FILE *f = fopen ("conftest.val", "w");
-  if (! f)
-    return 1;
-  if (($2) < 0)
-    {
-      long int i = longval ();
-      if (i != ($2))
-	return 1;
-      fprintf (f, "%ld", i);
-    }
-  else
-    {
-      unsigned long int i = ulongval ();
-      if (i != ($2))
-	return 1;
-      fprintf (f, "%lu", i);
-    }
-  /* Do not output a trailing newline, as this causes \r\n confusion
-     on some platforms.  */
-  return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else
-  ac_retval=1
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-rm -f conftest.val
-
-  fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_compute_int
-
-# ac_fn_c_check_decl LINENO SYMBOL VAR
-# ------------------------------------
-# Tests whether SYMBOL is declared, setting cache variable VAR accordingly.
-ac_fn_c_check_decl ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  as_decl_name=`echo $2|sed 's/ *(.*//'`
-  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
-$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-#ifndef $as_decl_name
-#ifdef __cplusplus
-  (void) $as_decl_use;
-#else
-  (void) $as_decl_name;
-#endif
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_decl
-cat >config.log <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by package-unused $as_me version-unused, which was
-generated by GNU Autoconf 2.64.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    $as_echo "PATH: $as_dir"
-  done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *\'*)
-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
-    2)
-      as_fn_append ac_configure_args1 " '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      as_fn_append ac_configure_args " '$ac_arg'"
-      ;;
-    esac
-  done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    cat <<\_ASBOX
-## ---------------- ##
-## Cache variables. ##
-## ---------------- ##
-_ASBOX
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-(
-  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-  (set) 2>&1 |
-    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      sed -n \
-	"s/'\''/'\''\\\\'\'''\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
-      ;; #(
-    *)
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-)
-    echo
-
-    cat <<\_ASBOX
-## ----------------- ##
-## Output variables. ##
-## ----------------- ##
-_ASBOX
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=\$$ac_var
-      case $ac_val in
-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-      esac
-      $as_echo "$ac_var='\''$ac_val'\''"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      cat <<\_ASBOX
-## ------------------- ##
-## File substitutions. ##
-## ------------------- ##
-_ASBOX
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=\$$ac_var
-	case $ac_val in
-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-	esac
-	$as_echo "$ac_var='\''$ac_val'\''"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      cat <<\_ASBOX
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-_ASBOX
-      echo
-      cat confdefs.h
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      $as_echo "$as_me: caught signal $ac_signal"
-    $as_echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core core.conftest.* &&
-    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
-  ac_site_file1=$CONFIG_SITE
-elif test "x$prefix" != xNONE; then
-  ac_site_file1=$prefix/share/config.site
-  ac_site_file2=$prefix/etc/config.site
-else
-  ac_site_file1=$ac_default_prefix/share/config.site
-  ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
-  test "x$ac_site_file" = xNONE && continue
-  if test -r "$ac_site_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special
-  # files actually), so we avoid doing that.
-  if test -f "$cache_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . "$cache_file";;
-      *)                      . "./$cache_file";;
-    esac
-  fi
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val=\$ac_cv_env_${ac_var}_value
-  eval ac_new_val=\$ac_env_${ac_var}_value
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	# differences in whitespace do not lead to failure.
-	ac_old_val_w=`echo x $ac_old_val`
-	ac_new_val_w=`echo x $ac_new_val`
-	if test "$ac_old_val_w" != "$ac_new_val_w"; then
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	  ac_cache_corrupted=:
-	else
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
-	  eval $ac_var=\$ac_old_val
-	fi
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-
-
-ac_config_headers="$ac_config_headers config.h"
-
-
-ac_aux_dir=
-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
-  for ac_t in install-sh install.sh shtool; do
-    if test -f "$ac_dir/$ac_t"; then
-      ac_aux_dir=$ac_dir
-      ac_install_sh="$ac_aux_dir/$ac_t -c"
-      break 2
-    fi
-  done
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
-$as_echo_n "checking target system type... " >&6; }
-if test "${ac_cv_target+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$target_alias" = x; then
-  ac_cv_target=$ac_cv_host
-else
-  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
-    as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
-$as_echo "$ac_cv_target" >&6; }
-case $ac_cv_target in
-*-*-*) ;;
-*) as_fn_error "invalid value of canonical target" "$LINENO" 5;;
-esac
-target=$ac_cv_target
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_target
-shift
-target_cpu=$1
-target_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-target_os=$*
-IFS=$ac_save_IFS
-case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
-
-
-# The aliases save the names the user supplied, while $host etc.
-# will get canonicalized.
-test -n "$target_alias" &&
-  test "$program_prefix$program_suffix$program_transform_name" = \
-    NONENONEs,x,x, &&
-  program_prefix=${target_alias}-
-
-target_alias=${target_alias-$host_alias}
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "no acceptable C compiler found in \$PATH
-See \`config.log' for more details." "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    rm -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
-  esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link_default") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile.  We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
-	then :; else
-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	fi
-	# We set ac_cv_exeext here because the later test for it is not
-	# safe: cross compilers may not add the suffix if given an `-o'
-	# argument, so we may need to know it at that point already.
-	# Even if this section looks crufty: it has the advantage of
-	# actually working.
-	break;;
-    * )
-	break;;
-  esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
-  ac_file=''
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-if test -z "$ac_file"; then :
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "C compiler cannot create executables
-See \`config.log' for more details." "$LINENO" 5; }; }
-fi
-ac_exeext=$ac_cv_exeext
-
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-# If not cross compiling, check that we can run a simple program.
-if test "$cross_compiling" != yes; then
-  if { ac_try='./$ac_file'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." "$LINENO" 5; }
-    fi
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out
-ac_clean_files=$ac_clean_files_save
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-rm -f conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  for ac_file in conftest.o conftest.obj conftest.*; do
-  test -f "$ac_file" || continue;
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-else
-  CFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$GREP"; then
-  ac_path_GREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in grep ggrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_GREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_GREP"; then
-    as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     if test -z "$EGREP"; then
-  ac_path_EGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in egrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_EGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_EGREP"; then
-    as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_EGREP=$EGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-eval as_val=\$$as_ac_Header
-   if test "x$as_val" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
-  ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default"
-if test "x$ac_cv_header_minix_config_h" = x""yes; then :
-  MINIX=yes
-else
-  MINIX=
-fi
-
-
-  if test "$MINIX" = yes; then
-
-$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h
-
-
-$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h
-
-
-$as_echo "#define _MINIX 1" >>confdefs.h
-
-  fi
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
-$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
-if test "${ac_cv_safe_to_define___extensions__+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#	  define __EXTENSIONS__ 1
-	  $ac_includes_default
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_safe_to_define___extensions__=yes
-else
-  ac_cv_safe_to_define___extensions__=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
-$as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
-  test $ac_cv_safe_to_define___extensions__ = yes &&
-    $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h
-
-  $as_echo "#define _ALL_SOURCE 1" >>confdefs.h
-
-  $as_echo "#define _GNU_SOURCE 1" >>confdefs.h
-
-  $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
-
-  $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h
-
-
-
-libtool_VERSION=1:0:0
-
-
-# 1.11.1: Require that version of automake.
-# foreign: Don't require README, INSTALL, NEWS, etc.
-# no-define: Don't define PACKAGE and VERSION.
-# no-dependencies: Don't generate automatic dependencies.
-#    (because it breaks when using bootstrap-lean, since some of the
-#    headers are gone at "make install" time).
-# -Wall: Issue all automake warnings.
-# -Wno-portability: Don't warn about constructs supported by GNU make.
-#    (because GCC requires GNU make anyhow).
-am__api_version='1.11'
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
-  ./ | .// | /[cC]/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    rm -rf conftest.one conftest.two conftest.dir
-	    echo one > conftest.one
-	    echo two > conftest.two
-	    mkdir conftest.dir
-	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
-	      test -s conftest.one && test -s conftest.two &&
-	      test -s conftest.dir/conftest.one &&
-	      test -s conftest.dir/conftest.two
-	    then
-	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	      break 3
-	    fi
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-
-  done
-IFS=$as_save_IFS
-
-rm -rf conftest.one conftest.two conftest.dir
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    INSTALL=$ac_install_sh
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[\\\"\#\$\&\'\`$am_lf]*)
-    as_fn_error "unsafe absolute working directory name" "$LINENO" 5;;
-esac
-case $srcdir in
-  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
-    as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      as_fn_error "ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" "$LINENO" 5
-   fi
-
-   test "$2" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   as_fn_error "newly created file is older than distributed files!
-Check your system clock" "$LINENO" 5
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-test "$program_prefix" != NONE &&
-  program_transform_name="s&^&$program_prefix&;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.
-# By default was `s,x,x', remove it if useless.
-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
-if test -z "$MKDIR_P"; then
-  if test "${ac_cv_path_mkdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in mkdir gmkdir; do
-	 for ac_exec_ext in '' $ac_executable_extensions; do
-	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
-	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
-	     'mkdir (GNU coreutils) '* | \
-	     'mkdir (coreutils) '* | \
-	     'mkdir (fileutils) '4.1*)
-	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
-	       break 3;;
-	   esac
-	 done
-       done
-  done
-IFS=$as_save_IFS
-
-fi
-
-  if test "${ac_cv_path_mkdir+set}" = set; then
-    MKDIR_P="$ac_cv_path_mkdir -p"
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for MKDIR_P within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    test -d ./--version && rmdir ./--version
-    MKDIR_P="$ac_install_sh -d"
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
-
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
-for ac_prog in gawk mawk nawk awk
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AWK+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$AWK" && break
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  am__isrc=' -I$(srcdir)'
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='libbacktrace'
- VERSION='version-unused'
-
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.
-
-AMTAR=${AMTAR-"${am_missing_run}tar"}
-
-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
-$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
-    # Check whether --enable-maintainer-mode was given.
-if test "${enable_maintainer_mode+set}" = set; then :
-  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
-else
-  USE_MAINTAINER_MODE=no
-fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
-$as_echo "$USE_MAINTAINER_MODE" >&6; }
-   if test $USE_MAINTAINER_MODE = yes; then
-  MAINTAINER_MODE_TRUE=
-  MAINTAINER_MODE_FALSE='#'
-else
-  MAINTAINER_MODE_TRUE='#'
-  MAINTAINER_MODE_FALSE=
-fi
-
-  MAINT=$MAINTAINER_MODE_TRUE
-
-
-
-
-# Check whether --with-target-subdir was given.
-if test "${with_target_subdir+set}" = set; then :
-  withval=$with_target_subdir;
-fi
-
-
-# We must force CC to /not/ be precious variables; otherwise
-# the wrong, non-multilib-adjusted value will be used in multilibs.
-# As a side effect, we have to subst CFLAGS ourselves.
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "no acceptable C compiler found in \$PATH
-See \`config.log' for more details." "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    rm -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-else
-  CFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-
-for ac_prog in gawk mawk nawk awk
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AWK+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$AWK" && break
-done
-
-case "$AWK" in
-"") as_fn_error "can't build without awk" "$LINENO" 5 ;;
-esac
-
-case `pwd` in
-  *\ * | *\	*)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
-esac
-
-
-
-macro_version='2.2.7a'
-macro_revision='1.3134'
-
-
-
-
-
-
-
-
-
-
-
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
-$as_echo_n "checking how to print strings... " >&6; }
-# Test print first, because it will be a builtin if present.
-if test "X`print -r -- -n 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
-else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO ""
-}
-
-case "$ECHO" in
-  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
-$as_echo "printf" >&6; } ;;
-  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
-$as_echo "print -r" >&6; } ;;
-  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
-$as_echo "cat" >&6; } ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if test "${ac_cv_path_SED+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
-     for ac_i in 1 2 3 4 5 6 7; do
-       ac_script="$ac_script$as_nl$ac_script"
-     done
-     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
-     { ac_script=; unset ac_script;}
-     if test -z "$SED"; then
-  ac_path_SED_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
-# Check for GNU ac_path_SED and select it if it is found.
-  # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
-  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo '' >> "conftest.nl"
-    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_SED_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_SED="$ac_path_SED"
-      ac_path_SED_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_SED_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_SED"; then
-    as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5
-  fi
-else
-  ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
-  rm -f conftest.sed
-
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if test "${ac_cv_path_FGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
-   then ac_cv_path_FGREP="$GREP -F"
-   else
-     if test -z "$FGREP"; then
-  ac_path_FGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in fgrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
-# Check for GNU ac_path_FGREP and select it if it is found.
-  # Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'FGREP' >> "conftest.nl"
-    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_FGREP="$ac_path_FGREP"
-      ac_path_FGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_FGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_FGREP"; then
-    as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_FGREP=$FGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
- FGREP="$ac_cv_path_FGREP"
-
-
-test -z "$GREP" && GREP=grep
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if test "${lt_cv_path_LD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if test "${lt_cv_prog_gnu_ld+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if test "${lt_cv_path_NM+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in dumpbin "link -dump"
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DUMPBIN"; then
-  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DUMPBIN=$ac_cv_prog_DUMPBIN
-if test -n "$DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$DUMPBIN" && break
-  done
-fi
-if test -z "$DUMPBIN"; then
-  ac_ct_DUMPBIN=$DUMPBIN
-  for ac_prog in dumpbin "link -dump"
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DUMPBIN"; then
-  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
-if test -n "$ac_ct_DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_DUMPBIN" && break
-done
-
-  if test "x$ac_ct_DUMPBIN" = x; then
-    DUMPBIN=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DUMPBIN=$ac_ct_DUMPBIN
-  fi
-fi
-
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
-
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if test "${lt_cv_nm_interface+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
-  cat conftest.out >&5
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
-
-# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-    i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-
-fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-
-
-
-
-
-: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-
-
-
-
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if test "${lt_cv_ld_reload_flag+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_reload_flag='-r'
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OBJDUMP"; then
-  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
-  ac_ct_OBJDUMP=$OBJDUMP
-  # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OBJDUMP"; then
-  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OBJDUMP="objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OBJDUMP" = x; then
-    OBJDUMP="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OBJDUMP=$ac_ct_OBJDUMP
-  fi
-else
-  OBJDUMP="$ac_cv_prog_OBJDUMP"
-fi
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if test "${lt_cv_deplibs_check_method+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[4-9]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[45]*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[3-9]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AR="${ac_tool_prefix}ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_AR"; then
-  ac_ct_AR=$AR
-  # Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_AR="ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_AR" = x; then
-    AR="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    AR=$ac_ct_AR
-  fi
-else
-  AR="$ac_cv_prog_AR"
-fi
-
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-test -z "$STRIP" && STRIP=:
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-test -z "$RANLIB" && RANLIB=:
-
-
-
-
-
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[BCDEGRST]'
-  ;;
-osf*)
-  symcode='[BCDEGQRST]'
-  ;;
-solaris*)
-  symcode='[BDRT]'
-  ;;
-sco3.2v5*)
-  symcode='[DT]'
-  ;;
-sysv4.2uw2*)
-  symcode='[DT]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[ABDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK '"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
-  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&5
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&5
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-
-fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
-  enableval=$enable_libtool_lock;
-fi
-
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    case `/usr/bin/file conftest.o` in
-	      *x86-64*)
-		LD="${LD-ld} -m elf32_x86_64"
-		;;
-	      *)
-		LD="${LD-ld} -m elf_i386"
-		;;
-	    esac
-	    ;;
-	  powerpc64le-*linux*)
-	    LD="${LD-ld} -m elf32lppclinux"
-	    ;;
-	  powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  powerpcle-*linux*)
-	    LD="${LD-ld} -m elf64lppc"
-	    ;;
-	  powerpc-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if test "${lt_cv_cc_needs_belf+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_cc_needs_belf=yes
-else
-  lt_cv_cc_needs_belf=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-
-
-  case $host_os in
-    rhapsody* | darwin*)
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DSYMUTIL"; then
-  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DSYMUTIL=$ac_cv_prog_DSYMUTIL
-if test -n "$DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DSYMUTIL"; then
-  ac_ct_DSYMUTIL=$DSYMUTIL
-  # Extract the first word of "dsymutil", so it can be a program name with args.
-set dummy dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DSYMUTIL"; then
-  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
-if test -n "$ac_ct_DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DSYMUTIL" = x; then
-    DSYMUTIL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DSYMUTIL=$ac_ct_DSYMUTIL
-  fi
-else
-  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
-set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NMEDIT"; then
-  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-NMEDIT=$ac_cv_prog_NMEDIT
-if test -n "$NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_NMEDIT"; then
-  ac_ct_NMEDIT=$NMEDIT
-  # Extract the first word of "nmedit", so it can be a program name with args.
-set dummy nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_NMEDIT"; then
-  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_NMEDIT="nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
-if test -n "$ac_ct_NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_NMEDIT" = x; then
-    NMEDIT=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    NMEDIT=$ac_ct_NMEDIT
-  fi
-else
-  NMEDIT="$ac_cv_prog_NMEDIT"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$LIPO"; then
-  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-LIPO=$ac_cv_prog_LIPO
-if test -n "$LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_LIPO"; then
-  ac_ct_LIPO=$LIPO
-  # Extract the first word of "lipo", so it can be a program name with args.
-set dummy lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_LIPO"; then
-  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_LIPO="lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
-if test -n "$ac_ct_LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_LIPO" = x; then
-    LIPO=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    LIPO=$ac_ct_LIPO
-  fi
-else
-  LIPO="$ac_cv_prog_LIPO"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL"; then
-  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL=$ac_cv_prog_OTOOL
-if test -n "$OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL"; then
-  ac_ct_OTOOL=$OTOOL
-  # Extract the first word of "otool", so it can be a program name with args.
-set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL"; then
-  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL="otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL" = x; then
-    OTOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL=$ac_ct_OTOOL
-  fi
-else
-  OTOOL="$ac_cv_prog_OTOOL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL64"; then
-  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL64"; then
-  ac_ct_OTOOL64=$OTOOL64
-  # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL64"; then
-  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL64="otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL64" = x; then
-    OTOOL64=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL64=$ac_ct_OTOOL64
-  fi
-else
-  OTOOL64="$ac_cv_prog_OTOOL64"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&5
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_ld_exported_symbols_list=yes
-else
-  lt_cv_ld_exported_symbols_list=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
-$as_echo_n "checking for -force_load linker flag... " >&6; }
-if test "${lt_cv_ld_force_load+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
-      echo "$AR cru libconftest.a conftest.o" >&5
-      $AR cru libconftest.a conftest.o 2>&5
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&5
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
-$as_echo "$lt_cv_ld_force_load" >&6; }
-    case $host_os in
-    rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012][,.]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-
-for ac_header in dlfcn.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-
-
-# Set options
-# Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
-  enableval=$enable_shared; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_shared=no
-fi
-
-
-
-
-
-
-
-
-
-
-        enable_dlopen=no
-
-
-  enable_win32_dll=no
-
-
-
-  # Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
-  enableval=$enable_static; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_static=yes
-fi
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
-  withval=$with_pic; pic_mode="$withval"
-else
-  pic_mode=default
-fi
-
-
-test -z "$pic_mode" && pic_mode=default
-
-
-
-
-
-
-
-  # Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
-  enableval=$enable_fast_install; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_fast_install=yes
-fi
-
-
-
-
-
-
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-test -z "$LN_S" && LN_S="ln -s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if test "${lt_cv_objdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
-objdir=$lt_cv_objdir
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
-
-
-
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  else
-    MAGIC_CMD=:
-  fi
-fi
-
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-
-lt_prog_compiler_no_builtin_flag=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
-  *)
-    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
-  esac
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_rtti_exceptions=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
-else
-    :
-fi
-
-fi
-
-
-
-
-
-
-  lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl='-Wl,'
-    lt_prog_compiler_static='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      lt_prog_compiler_wl='-Xlinker '
-      lt_prog_compiler_pic='-Xcompiler -fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-KPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='--shared'
-	lt_prog_compiler_static='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fpic'
-	lt_prog_compiler_static='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-qpic'
-	lt_prog_compiler_static='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ F* | *Sun*Fortran*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl=''
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Wl,'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    rdos*)
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    solaris*)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	lt_prog_compiler_wl='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      lt_prog_compiler_wl='-Qoption ld '
-      lt_prog_compiler_pic='-PIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic='-Kconform_pic'
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    unicos*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_can_build_shared=no
-      ;;
-
-    uts4*)
-      lt_prog_compiler_pic='-pic'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *)
-      lt_prog_compiler_can_build_shared=no
-      ;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic=
-    ;;
-  *)
-    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
-    ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
-$as_echo "$lt_prog_compiler_pic" >&6; }
-
-
-
-
-
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
-    case $lt_prog_compiler_pic in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
-     esac
-else
-    lt_prog_compiler_pic=
-     lt_prog_compiler_can_build_shared=no
-fi
-
-fi
-
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
-    :
-else
-    lt_prog_compiler_static=
-fi
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  runpath_var=
-  allow_undefined_flag=
-  always_export_symbols=no
-  archive_cmds=
-  archive_expsym_cmds=
-  compiler_needs_object=no
-  enable_shared_with_static_runtimes=no
-  export_dynamic_flag_spec=
-  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  hardcode_automatic=no
-  hardcode_direct=no
-  hardcode_direct_absolute=no
-  hardcode_libdir_flag_spec=
-  hardcode_libdir_flag_spec_ld=
-  hardcode_libdir_separator=
-  hardcode_minus_L=no
-  hardcode_shlibpath_var=unsupported
-  inherit_rpath=no
-  link_all_deplibs=unknown
-  module_cmds=
-  module_expsym_cmds=
-  old_archive_from_new_cmds=
-  old_archive_from_expsyms_cmds=
-  thread_safe_flag_spec=
-  whole_archive_flag_spec=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  ld_shlibs=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
-	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      export_dynamic_flag_spec='${wl}--export-all-symbols'
-      allow_undefined_flag=unsupported
-      always_export_symbols=no
-      enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    haiku*)
-      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      link_all_deplibs=yes
-      ;;
-
-    interix[3-9]*)
-      hardcode_direct=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=' $pic_flag'
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  whole_archive_flag_spec=
-	  tmp_sharedflag='--shared' ;;
-	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec=
-	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
-	  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        ld_shlibs=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    ld_shlibs=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-    esac
-
-    if test "$ld_shlibs" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec=
-      export_dynamic_flag_spec=
-      whole_archive_flag_spec=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag=unsupported
-      always_export_symbols=yes
-      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct=unsupported
-      fi
-      ;;
-
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      archive_cmds=''
-      hardcode_direct=yes
-      hardcode_direct_absolute=yes
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  hardcode_direct=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L=yes
-	  hardcode_libdir_flag_spec='-L$libdir'
-	  hardcode_libdir_separator=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      export_dynamic_flag_spec='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    whole_archive_flag_spec='$convenience'
-	  fi
-	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[45]*)
-      export_dynamic_flag_spec=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec=' '
-      allow_undefined_flag=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_from_new_cmds='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes=yes
-      ;;
-
-    darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc=no
-  hardcode_direct=no
-  hardcode_automatic=yes
-  hardcode_shlibpath_var=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-  else
-    whole_archive_flag_spec=''
-  fi
-  link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
-  else
-  ld_shlibs=no
-  fi
-
-      ;;
-
-    dgux*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2.*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_flag_spec_ld='+b $libdir'
-	hardcode_libdir_separator=:
-	hardcode_direct=yes
-	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
-$as_echo_n "checking if $CC understands -b... " >&6; }
-if test "${lt_cv_prog_compiler__b+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler__b=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS -b"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler__b=yes
-       fi
-     else
-       lt_cv_prog_compiler__b=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
-$as_echo "$lt_cv_prog_compiler__b" >&6; }
-
-if test x"$lt_cv_prog_compiler__b" = xyes; then
-    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-else
-    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-fi
-
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_direct=no
-	  hardcode_shlibpath_var=no
-	  ;;
-	*)
-	  hardcode_direct=yes
-	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int foo(void) {}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-        LDFLAGS="$save_LDFLAGS"
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      inherit_rpath=yes
-      link_all_deplibs=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    newsos6)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_shlibpath_var=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	hardcode_direct=yes
-	hardcode_shlibpath_var=no
-	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_separator=:
-      ;;
-
-    solaris*)
-      no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_shlibpath_var=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      link_all_deplibs=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds='$CC -r -o $output$reload_objs'
-	  hardcode_direct=no
-        ;;
-	motorola)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4.3*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var=no
-      export_dynamic_flag_spec='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      ld_shlibs=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
-
-with_gnu_ld=$with_gnu_ld
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if test "${lt_cv_archive_cmds_need_lc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl
-	  pic_flag=$lt_prog_compiler_pic
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag
-	  allow_undefined_flag=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	  then
-	    lt_cv_archive_cmds_need_lc=no
-	  else
-	    lt_cv_archive_cmds_need_lc=yes
-	  fi
-	  allow_undefined_flag=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
-      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[lt_foo]++; }
-  if (lt_freq[lt_foo] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[23].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/beos/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[3-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
-	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-
-fi
-
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" ||
-   test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
-
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-  if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-
-fi
-
-    ;;
-
-  *)
-    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-int
-main ()
-{
-return shl_load ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_shl_load=yes
-else
-  ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
-  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_svld_dlopen=yes
-else
-  ac_cv_lib_svld_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link ();
-int
-main ()
-{
-return dld_link ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_dld_link=yes
-else
-  ac_cv_lib_dld_dld_link=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line 11092 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-void fnord () __attribute__((visibility("default")));
-#endif
-
-void fnord () { int i=42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self_static+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self_static=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line 11198 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-void fnord () __attribute__((visibility("default")));
-#endif
-
-void fnord () { int i=42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self_static=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-striplib=
-old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    fi
-    ;;
-  *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-  # Report which library types will actually be built
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
-
-
-
-
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-CC="$lt_save_CC"
-
-
-
-
-
-
-
-
-
-
-
-
-
-        ac_config_commands="$ac_config_commands libtool"
-
-
-
-
-# Only expand once:
-
-
-
-
-backtrace_supported=yes
-
-if test -n "${with_target_subdir}"; then
-  # We are compiling a GCC library.  We can assume that the unwind
-  # library exists.
-  # Default to --enable-multilib
-# Check whether --enable-multilib was given.
-if test "${enable_multilib+set}" = set; then :
-  enableval=$enable_multilib; case "$enableval" in
-  yes) multilib=yes ;;
-  no)  multilib=no ;;
-  *)   as_fn_error "bad value $enableval for multilib option" "$LINENO" 5 ;;
- esac
-else
-  multilib=yes
-fi
-
-
-# We may get other options which we leave undocumented:
-# --with-target-subdir, --with-multisrctop, --with-multisubdir
-# See config-ml.in if you want the gory details.
-
-if test "$srcdir" = "."; then
-  if test "$with_target_subdir" != "."; then
-    multi_basedir="$srcdir/$with_multisrctop../.."
-  else
-    multi_basedir="$srcdir/$with_multisrctop.."
-  fi
-else
-  multi_basedir="$srcdir/.."
-fi
-
-
-# Even if the default multilib is not a cross compilation,
-# it may be that some of the other multilibs are.
-if test $cross_compiling = no && test $multilib = yes \
-   && test "x${with_multisubdir}" != x ; then
-   cross_compiling=maybe
-fi
-
-ac_config_commands="$ac_config_commands default-1"
-
-  BACKTRACE_FILE="backtrace.lo simple.lo"
-else
-  ac_fn_c_check_header_mongrel "$LINENO" "unwind.h" "ac_cv_header_unwind_h" "$ac_includes_default"
-if test "x$ac_cv_header_unwind_h" = x""yes; then :
-  ac_fn_c_check_func "$LINENO" "_Unwind_Backtrace" "ac_cv_func__Unwind_Backtrace"
-if test "x$ac_cv_func__Unwind_Backtrace" = x""yes; then :
-  BACKTRACE_FILE="backtrace.lo simple.lo"
-else
-  BACKTRACE_FILE="nounwind.lo"
-                    backtrace_supported=no
-fi
-
-else
-  BACKTRACE_FILE="nounwind.lo"
-     backtrace_supported=no
-fi
-
-
-fi
-
-
-EXTRA_FLAGS=
-if test -n "${with_target_subdir}"; then
-  EXTRA_FLAGS="-funwind-tables -frandom-seed=\$@"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -funwind-tables option" >&5
-$as_echo_n "checking for -funwind-tables option... " >&6; }
-if test "${libbacktrace_cv_c_unwind_tables+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  CFLAGS_hold="$CFLAGS"
-     CFLAGS="$CFLAGS -funwind-tables"
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-static int f() { return 0; }
-int
-main ()
-{
-return f();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  libbacktrace_cv_c_unwind_tables=yes
-else
-  libbacktrace_cv_c_unwind_tables=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-     CFLAGS="$CFLAGS_hold"
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libbacktrace_cv_c_unwind_tables" >&5
-$as_echo "$libbacktrace_cv_c_unwind_tables" >&6; }
-  if test "$libbacktrace_cv_c_unwind_tables" = "yes"; then
-    EXTRA_FLAGS=-funwind-tables
-  fi
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -frandom-seed=string option" >&5
-$as_echo_n "checking for -frandom-seed=string option... " >&6; }
-if test "${libbacktrace_cv_c_random_seed_string+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  CFLAGS_hold="$CFLAGS"
-     CFLAGS="$CFLAGS -frandom-seed=conftest.lo"
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  libbacktrace_cv_c_random_seed_string=yes
-else
-  libbacktrace_cv_c_random_seed_string=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-     CFLAGS="$CFLAGS_hold"
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libbacktrace_cv_c_random_seed_string" >&5
-$as_echo "$libbacktrace_cv_c_random_seed_string" >&6; }
-  if test "$libbacktrace_cv_c_random_seed_string" = "yes"; then
-    EXTRA_FLAGS="$EXTRA_FLAGS -frandom-seed=\$@"
-  fi
-fi
-
-
-WARN_FLAGS=
-save_CFLAGS="$CFLAGS"
-for real_option in -W -Wall -Wwrite-strings -Wstrict-prototypes \
-			  -Wmissing-prototypes -Wold-style-definition \
-			  -Wmissing-format-attribute -Wcast-qual; do
-  # Do the check with the no- prefix removed since gcc silently
-  # accepts any -Wno-* option on purpose
-  case $real_option in
-    -Wno-*) option=-W`expr x$real_option : 'x-Wno-\(.*\)'` ;;
-    *) option=$real_option ;;
-  esac
-  as_acx_Woption=`$as_echo "acx_cv_prog_cc_warning_$option" | $as_tr_sh`
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports $option" >&5
-$as_echo_n "checking whether $CC supports $option... " >&6; }
-if { as_var=$as_acx_Woption; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  CFLAGS="$option"
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$as_acx_Woption=yes"
-else
-  eval "$as_acx_Woption=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-eval ac_res=\$$as_acx_Woption
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  if test `eval 'as_val=${'$as_acx_Woption'};$as_echo "$as_val"'` = yes; then :
-  WARN_FLAGS="$WARN_FLAGS${WARN_FLAGS:+ }$real_option"
-fi
-  done
-CFLAGS="$save_CFLAGS"
-
-
-if test -n "${with_target_subdir}"; then
-  WARN_FLAGS="$WARN_FLAGS -Werror"
-fi
-
-
-
-if test -n "${with_target_subdir}"; then
-
-
-# Check whether --with-system-libunwind was given.
-if test "${with_system_libunwind+set}" = set; then :
-  withval=$with_system_libunwind;
-fi
-
-  # If system-libunwind was not specifically set, pick a default setting.
-  if test x$with_system_libunwind = x; then
-    case ${target} in
-      ia64-*-hpux*) with_system_libunwind=yes ;;
-      *) with_system_libunwind=no ;;
-    esac
-  fi
-  # Based on system-libunwind and target, do we have ipinfo?
-  if  test x$with_system_libunwind = xyes; then
-    case ${target} in
-      ia64-*-*) have_unwind_getipinfo=no ;;
-      *) have_unwind_getipinfo=yes ;;
-    esac
-  else
-    # Darwin before version 9 does not have _Unwind_GetIPInfo.
-
-    case ${target} in
-      *-*-darwin[3-8]|*-*-darwin[3-8].*) have_unwind_getipinfo=no ;;
-      *) have_unwind_getipinfo=yes ;;
-    esac
-
-  fi
-
-  if test x$have_unwind_getipinfo = xyes; then
-
-$as_echo "#define HAVE_GETIPINFO 1" >>confdefs.h
-
-  fi
-
-else
-  ac_save_CFFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _Unwind_GetIPInfo" >&5
-$as_echo_n "checking for _Unwind_GetIPInfo... " >&6; }
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include "unwind.h"
-	struct _Unwind_Context *context;
-	int ip_before_insn = 0;
-int
-main ()
-{
-return _Unwind_GetIPInfo (context, &ip_before_insn);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  have_unwind_getipinfo=yes
-else
-  have_unwind_getipinfo=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  CFLAGS="$ac_save_CFLAGS"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_unwind_getipinfo" >&5
-$as_echo "$have_unwind_getipinfo" >&6; }
-  if test "$have_unwind_getipinfo" = "yes"; then
-
-$as_echo "#define HAVE_GETIPINFO 1" >>confdefs.h
-
-  fi
-fi
-
-# When building as a target library, shared libraries may want to link
-# this in.  We don't want to provide another shared library to
-# complicate dependencies.  Instead, we just compile with -fPIC.
-PIC_FLAG=
-if test -n "${with_target_subdir}"; then
-  PIC_FLAG=-fPIC
-fi
-# Similarly, use -fPIC with --enable-host-shared:
-# Check whether --enable-host-shared was given.
-if test "${enable_host_shared+set}" = set; then :
-  enableval=$enable_host_shared; PIC_FLAG=-fPIC
-fi
-
-
-
-# Test for __sync support.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking __sync extensions" >&5
-$as_echo_n "checking __sync extensions... " >&6; }
-if test "${libbacktrace_cv_sys_sync+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "${with_target_subdir}"; then
-   libbacktrace_cv_sys_sync=yes
- else
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int i;
-int
-main ()
-{
-__sync_bool_compare_and_swap (&i, i, i);
-                       __sync_lock_test_and_set (&i, 1);
-                       __sync_lock_release (&i);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  libbacktrace_cv_sys_sync=yes
-else
-  libbacktrace_cv_sys_sync=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libbacktrace_cv_sys_sync" >&5
-$as_echo "$libbacktrace_cv_sys_sync" >&6; }
-BACKTRACE_SUPPORTS_THREADS=0
-if test "$libbacktrace_cv_sys_sync" = "yes"; then
-  BACKTRACE_SUPPORTS_THREADS=1
-
-$as_echo "#define HAVE_SYNC_FUNCTIONS 1" >>confdefs.h
-
-fi
-
-
-# Test for __atomic support.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking __atomic extensions" >&5
-$as_echo_n "checking __atomic extensions... " >&6; }
-if test "${libbacktrace_cv_sys_atomic+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "${with_target_subdir}"; then
-   libbacktrace_cv_sys_atomic=yes
- else
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int i;
-int
-main ()
-{
-__atomic_load_n (&i, __ATOMIC_ACQUIRE);
-		       __atomic_store_n (&i, 1, __ATOMIC_RELEASE);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  libbacktrace_cv_sys_atomic=yes
-else
-  libbacktrace_cv_sys_atomic=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libbacktrace_cv_sys_atomic" >&5
-$as_echo "$libbacktrace_cv_sys_atomic" >&6; }
-if test "$libbacktrace_cv_sys_atomic" = "yes"; then
-
-$as_echo "#define HAVE_ATOMIC_FUNCTIONS 1" >>confdefs.h
-
-fi
-
-# The library needs to be able to read the executable itself.  Compile
-# a file to determine the executable format.  The awk script
-# filetype.awk prints out the file type.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking output filetype" >&5
-$as_echo_n "checking output filetype... " >&6; }
-if test "${libbacktrace_cv_sys_filetype+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  filetype=
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int i;
-int
-main ()
-{
-int j;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  filetype=`${AWK} -f $srcdir/filetype.awk conftest.$ac_objext`
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "compiler failed
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-libbacktrace_cv_sys_filetype=$filetype
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libbacktrace_cv_sys_filetype" >&5
-$as_echo "$libbacktrace_cv_sys_filetype" >&6; }
-
-# Match the file type to decide what files to compile.
-FORMAT_FILE=
-case "$libbacktrace_cv_sys_filetype" in
-elf*) FORMAT_FILE="elf.lo" ;;
-*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not determine output file type" >&5
-$as_echo "$as_me: WARNING: could not determine output file type" >&2;}
-   FORMAT_FILE="unknown.lo"
-   backtrace_supported=no
-   ;;
-esac
-
-
-# ELF defines.
-elfsize=
-case "$libbacktrace_cv_sys_filetype" in
-elf32) elfsize=32 ;;
-elf64) elfsize=64 ;;
-esac
-
-cat >>confdefs.h <<_ACEOF
-#define BACKTRACE_ELF_SIZE $elfsize
-_ACEOF
-
-
-BACKTRACE_SUPPORTED=0
-if test "$backtrace_supported" = "yes"; then
-  BACKTRACE_SUPPORTED=1
-fi
-
-
-
-
-inttype_headers=`echo inttypes.h sys/inttypes.h  | sed -e 's/,/ /g'`
-
-acx_cv_header_stdint=stddef.h
-acx_cv_header_stdint_kind="(already complete)"
-for i in stdint.h $inttype_headers; do
-  unset ac_cv_type_uintptr_t
-  unset ac_cv_type_uintmax_t
-  unset ac_cv_type_int_least32_t
-  unset ac_cv_type_int_fast32_t
-  unset ac_cv_type_uint64_t
-  $as_echo_n "looking for a compliant stdint.h in $i, " >&6
-  ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" "#include <sys/types.h>
-#include <$i>
-"
-if test "x$ac_cv_type_uintmax_t" = x""yes; then :
-  acx_cv_header_stdint=$i
-else
-  continue
-fi
-
-  ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "#include <sys/types.h>
-#include <$i>
-"
-if test "x$ac_cv_type_uintptr_t" = x""yes; then :
-
-else
-  acx_cv_header_stdint_kind="(mostly complete)"
-fi
-
-  ac_fn_c_check_type "$LINENO" "int_least32_t" "ac_cv_type_int_least32_t" "#include <sys/types.h>
-#include <$i>
-"
-if test "x$ac_cv_type_int_least32_t" = x""yes; then :
-
-else
-  acx_cv_header_stdint_kind="(mostly complete)"
-fi
-
-  ac_fn_c_check_type "$LINENO" "int_fast32_t" "ac_cv_type_int_fast32_t" "#include <sys/types.h>
-#include <$i>
-"
-if test "x$ac_cv_type_int_fast32_t" = x""yes; then :
-
-else
-  acx_cv_header_stdint_kind="(mostly complete)"
-fi
-
-  ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include <sys/types.h>
-#include <$i>
-"
-if test "x$ac_cv_type_uint64_t" = x""yes; then :
-
-else
-  acx_cv_header_stdint_kind="(lacks uint64_t)"
-fi
-
-  break
-done
-if test "$acx_cv_header_stdint" = stddef.h; then
-  acx_cv_header_stdint_kind="(lacks uintmax_t)"
-  for i in stdint.h $inttype_headers; do
-    unset ac_cv_type_uintptr_t
-    unset ac_cv_type_uint32_t
-    unset ac_cv_type_uint64_t
-    $as_echo_n "looking for an incomplete stdint.h in $i, " >&6
-    ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "#include <sys/types.h>
-#include <$i>
-"
-if test "x$ac_cv_type_uint32_t" = x""yes; then :
-  acx_cv_header_stdint=$i
-else
-  continue
-fi
-
-    ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include <sys/types.h>
-#include <$i>
-"
-if test "x$ac_cv_type_uint64_t" = x""yes; then :
-
-fi
-
-    ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "#include <sys/types.h>
-#include <$i>
-"
-if test "x$ac_cv_type_uintptr_t" = x""yes; then :
-
-fi
-
-    break
-  done
-fi
-if test "$acx_cv_header_stdint" = stddef.h; then
-  acx_cv_header_stdint_kind="(u_intXX_t style)"
-  for i in sys/types.h $inttype_headers; do
-    unset ac_cv_type_u_int32_t
-    unset ac_cv_type_u_int64_t
-    $as_echo_n "looking for u_intXX_t types in $i, " >&6
-    ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "#include <sys/types.h>
-#include <$i>
-"
-if test "x$ac_cv_type_u_int32_t" = x""yes; then :
-  acx_cv_header_stdint=$i
-else
-  continue
-fi
-
-    ac_fn_c_check_type "$LINENO" "u_int64_t" "ac_cv_type_u_int64_t" "#include <sys/types.h>
-#include <$i>
-"
-if test "x$ac_cv_type_u_int64_t" = x""yes; then :
-
-fi
-
-    break
-  done
-fi
-if test "$acx_cv_header_stdint" = stddef.h; then
-  acx_cv_header_stdint_kind="(using manual detection)"
-fi
-
-test -z "$ac_cv_type_uintptr_t" && ac_cv_type_uintptr_t=no
-test -z "$ac_cv_type_uint64_t" && ac_cv_type_uint64_t=no
-test -z "$ac_cv_type_u_int64_t" && ac_cv_type_u_int64_t=no
-test -z "$ac_cv_type_int_least32_t" && ac_cv_type_int_least32_t=no
-test -z "$ac_cv_type_int_fast32_t" && ac_cv_type_int_fast32_t=no
-
-# ----------------- Summarize what we found so far
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what to include in gstdint.h" >&5
-$as_echo_n "checking what to include in gstdint.h... " >&6; }
-
-case `$as_basename -- gstdint.h ||
-$as_expr X/gstdint.h : '.*/\([^/][^/]*\)/*$' \| \
-	 Xgstdint.h : 'X\(//\)$' \| \
-	 Xgstdint.h : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/gstdint.h |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'` in
-  stdint.h) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: are you sure you want it there?" >&5
-$as_echo "$as_me: WARNING: are you sure you want it there?" >&2;} ;;
-  inttypes.h) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: are you sure you want it there?" >&5
-$as_echo "$as_me: WARNING: are you sure you want it there?" >&2;} ;;
-  *) ;;
-esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_header_stdint $acx_cv_header_stdint_kind" >&5
-$as_echo "$acx_cv_header_stdint $acx_cv_header_stdint_kind" >&6; }
-
-# ----------------- done included file, check C basic types --------
-
-# Lacking an uintptr_t?  Test size of void *
-case "$acx_cv_header_stdint:$ac_cv_type_uintptr_t" in
-  stddef.h:* | *:no) # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
-$as_echo_n "checking size of void *... " >&6; }
-if test "${ac_cv_sizeof_void_p+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_void_p" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (void *)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_void_p=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
-$as_echo "$ac_cv_sizeof_void_p" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
-_ACEOF
-
- ;;
-esac
-
-# Lacking an uint64_t?  Test size of long
-case "$acx_cv_header_stdint:$ac_cv_type_uint64_t:$ac_cv_type_u_int64_t" in
-  stddef.h:*:* | *:no:no) # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
-$as_echo_n "checking size of long... " >&6; }
-if test "${ac_cv_sizeof_long+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_long" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (long)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_long=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
-$as_echo "$ac_cv_sizeof_long" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG $ac_cv_sizeof_long
-_ACEOF
-
- ;;
-esac
-
-if test $acx_cv_header_stdint = stddef.h; then
-  # Lacking a good header?  Test size of everything and deduce all types.
-  # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
-$as_echo_n "checking size of int... " >&6; }
-if test "${ac_cv_sizeof_int+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_int" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (int)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_int=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
-$as_echo "$ac_cv_sizeof_int" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_INT $ac_cv_sizeof_int
-_ACEOF
-
-
-  # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
-$as_echo_n "checking size of short... " >&6; }
-if test "${ac_cv_sizeof_short+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_short" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (short)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_short=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
-$as_echo "$ac_cv_sizeof_short" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_SHORT $ac_cv_sizeof_short
-_ACEOF
-
-
-  # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5
-$as_echo_n "checking size of char... " >&6; }
-if test "${ac_cv_sizeof_char+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_char" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (char)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_char=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5
-$as_echo "$ac_cv_sizeof_char" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_CHAR $ac_cv_sizeof_char
-_ACEOF
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to int8_t" >&5
-$as_echo_n "checking for type equivalent to int8_t... " >&6; }
-  case "$ac_cv_sizeof_char" in
-    1) acx_cv_type_int8_t=char ;;
-    *) as_fn_error "no 8-bit type, please report a bug" "$LINENO" 5
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_type_int8_t" >&5
-$as_echo "$acx_cv_type_int8_t" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to int16_t" >&5
-$as_echo_n "checking for type equivalent to int16_t... " >&6; }
-  case "$ac_cv_sizeof_int:$ac_cv_sizeof_short" in
-    2:*) acx_cv_type_int16_t=int ;;
-    *:2) acx_cv_type_int16_t=short ;;
-    *) as_fn_error "no 16-bit type, please report a bug" "$LINENO" 5
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_type_int16_t" >&5
-$as_echo "$acx_cv_type_int16_t" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to int32_t" >&5
-$as_echo_n "checking for type equivalent to int32_t... " >&6; }
-  case "$ac_cv_sizeof_int:$ac_cv_sizeof_long" in
-    4:*) acx_cv_type_int32_t=int ;;
-    *:4) acx_cv_type_int32_t=long ;;
-    *) as_fn_error "no 32-bit type, please report a bug" "$LINENO" 5
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_type_int32_t" >&5
-$as_echo "$acx_cv_type_int32_t" >&6; }
-fi
-
-# These tests are here to make the output prettier
-
-if test "$ac_cv_type_uint64_t" != yes && test "$ac_cv_type_u_int64_t" != yes; then
-  case "$ac_cv_sizeof_long" in
-    8) acx_cv_type_int64_t=long ;;
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to int64_t" >&5
-$as_echo_n "checking for type equivalent to int64_t... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${acx_cv_type_int64_t-'using preprocessor symbols'}" >&5
-$as_echo "${acx_cv_type_int64_t-'using preprocessor symbols'}" >&6; }
-fi
-
-# Now we can use the above types
-
-if test "$ac_cv_type_uintptr_t" != yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to intptr_t" >&5
-$as_echo_n "checking for type equivalent to intptr_t... " >&6; }
-  case $ac_cv_sizeof_void_p in
-    2) acx_cv_type_intptr_t=int16_t ;;
-    4) acx_cv_type_intptr_t=int32_t ;;
-    8) acx_cv_type_intptr_t=int64_t ;;
-    *) as_fn_error "no equivalent for intptr_t, please report a bug" "$LINENO" 5
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_type_intptr_t" >&5
-$as_echo "$acx_cv_type_intptr_t" >&6; }
-fi
-
-# ----------------- done all checks, emit header -------------
-ac_config_commands="$ac_config_commands gstdint.h"
-
-
-
-
-for ac_header in sys/mman.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_mman_h" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_SYS_MMAN_H 1
-_ACEOF
-
-fi
-
-done
-
-if test "$ac_cv_header_sys_mman_h" = "no"; then
-  have_mmap=no
-else
-  if test -n "${with_target_subdir}"; then
-    # When built as a GCC target library, we can't do a link test.  We
-    # simply assume that if we have mman.h, we have mmap.
-    have_mmap=yes
-  else
-    ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
-if test "x$ac_cv_func_mmap" = x""yes; then :
-  have_mmap=yes
-else
-  have_mmap=no
-fi
-
-  fi
-fi
-if test "$have_mmap" = "no"; then
-  VIEW_FILE=read.lo
-  ALLOC_FILE=alloc.lo
-else
-  VIEW_FILE=mmapio.lo
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <sys/mman.h>
-#if !defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
-  #error no MAP_ANONYMOUS
-#endif
-
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  ALLOC_FILE=mmap.lo
-else
-  ALLOC_FILE=alloc.lo
-fi
-rm -f conftest.err conftest.$ac_ext
-fi
-
-
-
-BACKTRACE_USES_MALLOC=0
-if test "$ALLOC_FILE" = "alloc.lo"; then
-  BACKTRACE_USES_MALLOC=1
-fi
-
-
-# Check for dl_iterate_phdr.
-for ac_header in link.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "link.h" "ac_cv_header_link_h" "$ac_includes_default"
-if test "x$ac_cv_header_link_h" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LINK_H 1
-_ACEOF
-
-fi
-
-done
-
-if test "$ac_cv_header_link_h" = "no"; then
-  have_dl_iterate_phdr=no
-else
-  if test -n "${with_target_subdir}"; then
-    # When built as a GCC target library, we can't do a link test.
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <link.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "dl_iterate_phdr" >/dev/null 2>&1; then :
-  have_dl_iterate_phdr=yes
-else
-  have_dl_iterate_phdr=no
-fi
-rm -f conftest*
-
-    case "${host}" in
-    *-*-solaris2.10*)
-        # Avoid dl_iterate_phdr on Solaris 10, where it is in the
-    	# header file but is only in -ldl.
-	have_dl_iterate_phdr=no ;;
-    esac
-  else
-    ac_fn_c_check_func "$LINENO" "dl_iterate_phdr" "ac_cv_func_dl_iterate_phdr"
-if test "x$ac_cv_func_dl_iterate_phdr" = x""yes; then :
-  have_dl_iterate_phdr=yes
-else
-  have_dl_iterate_phdr=no
-fi
-
-  fi
-fi
-if test "$have_dl_iterate_phdr" = "yes"; then
-
-$as_echo "#define HAVE_DL_ITERATE_PHDR 1" >>confdefs.h
-
-fi
-
-# Check for the fcntl function.
-if test -n "${with_target_subdir}"; then
-   case "${host}" in
-   *-*-mingw*) have_fcntl=no ;;
-   *) have_fcntl=yes ;;
-   esac
-else
-  ac_fn_c_check_func "$LINENO" "fcntl" "ac_cv_func_fcntl"
-if test "x$ac_cv_func_fcntl" = x""yes; then :
-  have_fcntl=yes
-else
-  have_fcntl=no
-fi
-
-fi
-if test "$have_fcntl" = "yes"; then
-
-$as_echo "#define HAVE_FCNTL 1" >>confdefs.h
-
-fi
-
-ac_fn_c_check_decl "$LINENO" "strnlen" "ac_cv_have_decl_strnlen" "$ac_includes_default"
-if test "x$ac_cv_have_decl_strnlen" = x""yes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRNLEN $ac_have_decl
-_ACEOF
-
-
-# Check for getexecname function.
-if test -n "${with_target_subdir}"; then
-   case "${host}" in
-   *-*-solaris2*) have_getexecname=yes ;;
-   *) have_getexecname=no ;;
-   esac
-else
-  ac_fn_c_check_func "$LINENO" "getexecname" "ac_cv_func_getexecname"
-if test "x$ac_cv_func_getexecname" = x""yes; then :
-  have_getexecname=yes
-else
-  have_getexecname=no
-fi
-
-fi
-if test "$have_getexecname" = "yes"; then
-
-$as_echo "#define HAVE_GETEXECNAME 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tests can run" >&5
-$as_echo_n "checking whether tests can run... " >&6; }
-if test "${libbacktrace_cv_sys_native+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  libbacktrace_cv_sys_native=no
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  libbacktrace_cv_sys_native=yes
-else
-  libbacktrace_cv_sys_native=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libbacktrace_cv_sys_native" >&5
-$as_echo "$libbacktrace_cv_sys_native" >&6; }
- if test "$libbacktrace_cv_sys_native" = "yes"; then
-  NATIVE_TRUE=
-  NATIVE_FALSE='#'
-else
-  NATIVE_TRUE='#'
-  NATIVE_FALSE=
-fi
-
-
-if test "${multilib}" = "yes"; then
-  multilib_arg="--enable-multilib"
-else
-  multilib_arg=
-fi
-
-ac_config_files="$ac_config_files Makefile backtrace-supported.h"
-
-
-# We need multilib support, but only if configuring for the target.
-ac_config_commands="$ac_config_commands default"
-
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-
-  (set) 2>&1 |
-    case $as_nl`(ac_space=' '; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes: double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \.
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;; #(
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-) |
-  sed '
-     /^ac_cv_env_/b end
-     t clear
-     :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
-  if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
-  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
-  #    will be set to the directory where LIBOBJS objects are built.
-  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
-  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
- if test -n "$EXEEXT"; then
-  am__EXEEXT_TRUE=
-  am__EXEEXT_FALSE='#'
-else
-  am__EXEEXT_TRUE='#'
-  am__EXEEXT_FALSE=
-fi
-
-if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
-  as_fn_error "conditional \"MAINTAINER_MODE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${NATIVE_TRUE}" && test -z "${NATIVE_FALSE}"; then
-  as_fn_error "conditional \"NATIVE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-: ${CONFIG_STATUS=./config.status}
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-as_write_fail=0
-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$?; test $as_status -eq 0 && as_status=1
-  if test "$3"; then
-    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
-  fi
-  $as_echo "$as_me: error: $1" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-## ----------------------------------- ##
-## Main body of $CONFIG_STATUS script. ##
-## ----------------------------------- ##
-_ASEOF
-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# Save the log message, to keep $0 and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.
-ac_log="
-This file was extended by package-unused $as_me version-unused, which was
-generated by GNU Autoconf 2.64.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-case $ac_config_headers in *"
-"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
-esac
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_headers="$ac_config_headers"
-config_commands="$ac_config_commands"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
-from templates according to the current configuration.  Unless the files
-and actions are specified as TAGs, all are instantiated by default.
-
-Usage: $0 [OPTION]... [TAG]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number and configuration settings, then exit
-  -q, --quiet, --silent
-                   do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-      --file=FILE[:TEMPLATE]
-                   instantiate the configuration file FILE
-      --header=FILE[:TEMPLATE]
-                   instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration commands:
-$config_commands
-
-Report bugs to the package provider."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_version="\\
-package-unused config.status version-unused
-configured by $0, generated by GNU Autoconf 2.64,
-  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
-
-Copyright (C) 2009 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-MKDIR_P='$MKDIR_P'
-AWK='$AWK'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  *)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    $as_echo "$ac_cs_version"; exit ;;
-  --debug | --debu | --deb | --de | --d | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    as_fn_append CONFIG_FILES " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --he | --h)
-    # Conflict between --help and --header
-    as_fn_error "ambiguous option: \`$1'
-Try \`$0 --help' for more information.";;
-  --help | --hel | -h )
-    $as_echo "$ac_cs_usage"; exit ;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) as_fn_error "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
-
-  *) as_fn_append ac_config_targets " $1"
-     ac_need_defaults=false ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-  shift
-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
-  CONFIG_SHELL='$SHELL'
-  export CONFIG_SHELL
-  exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-  $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-#
-# INIT-COMMANDS
-#
-
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
-enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
-SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
-ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
-host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
-host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
-host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
-build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
-build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
-build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
-SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
-Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
-GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
-EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
-FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
-LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
-NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
-LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
-exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
-AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
-STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
-lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
-CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
-compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
-GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
-objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
-need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
-LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
-libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
-fix_srcfile_path='`$ECHO "$fix_srcfile_path" | $SED "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
-need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
-version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
-install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
-striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
-
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in SHELL \
-ECHO \
-SED \
-GREP \
-EGREP \
-FGREP \
-LD \
-NM \
-LN_S \
-lt_SP2NL \
-lt_NL2SP \
-reload_flag \
-OBJDUMP \
-deplibs_check_method \
-file_magic_cmd \
-AR \
-AR_FLAGS \
-STRIP \
-RANLIB \
-CC \
-CFLAGS \
-compiler \
-lt_cv_sys_global_symbol_pipe \
-lt_cv_sys_global_symbol_to_cdecl \
-lt_cv_sys_global_symbol_to_c_name_address \
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_wl \
-lt_prog_compiler_pic \
-lt_prog_compiler_static \
-lt_cv_prog_compiler_c_o \
-need_locks \
-DSYMUTIL \
-NMEDIT \
-LIPO \
-OTOOL \
-OTOOL64 \
-shrext_cmds \
-export_dynamic_flag_spec \
-whole_archive_flag_spec \
-compiler_needs_object \
-with_gnu_ld \
-allow_undefined_flag \
-no_undefined_flag \
-hardcode_libdir_flag_spec \
-hardcode_libdir_flag_spec_ld \
-hardcode_libdir_separator \
-fix_srcfile_path \
-exclude_expsyms \
-include_expsyms \
-file_list_spec \
-variables_saved_for_relink \
-libname_spec \
-library_names_spec \
-soname_spec \
-install_override_mode \
-finish_eval \
-old_striplib \
-striplib; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in reload_cmds \
-old_postinstall_cmds \
-old_postuninstall_cmds \
-old_archive_cmds \
-extract_expsyms_cmds \
-old_archive_from_new_cmds \
-old_archive_from_expsyms_cmds \
-archive_cmds \
-archive_expsym_cmds \
-module_cmds \
-module_expsym_cmds \
-export_symbols_cmds \
-prelink_cmds \
-postinstall_cmds \
-postuninstall_cmds \
-finish_cmds \
-sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
-
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'
-
-
-
-
-srcdir="$srcdir"
-host="$host"
-target="$target"
-with_multisubdir="$with_multisubdir"
-with_multisrctop="$with_multisrctop"
-with_target_subdir="$with_target_subdir"
-ac_configure_args="${multilib_arg} ${ac_configure_args}"
-multi_basedir="$multi_basedir"
-CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-CC="$CC"
-CXX="$CXX"
-GFORTRAN="$GFORTRAN"
-GCJ="$GCJ"
-
-GCC="$GCC"
-CC="$CC"
-acx_cv_header_stdint="$acx_cv_header_stdint"
-acx_cv_type_int8_t="$acx_cv_type_int8_t"
-acx_cv_type_int16_t="$acx_cv_type_int16_t"
-acx_cv_type_int32_t="$acx_cv_type_int32_t"
-acx_cv_type_int64_t="$acx_cv_type_int64_t"
-acx_cv_type_intptr_t="$acx_cv_type_intptr_t"
-ac_cv_type_uintmax_t="$ac_cv_type_uintmax_t"
-ac_cv_type_uintptr_t="$ac_cv_type_uintptr_t"
-ac_cv_type_uint64_t="$ac_cv_type_uint64_t"
-ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t"
-ac_cv_type_u_int32_t="$ac_cv_type_u_int32_t"
-ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t"
-ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t"
-ac_cv_sizeof_void_p="$ac_cv_sizeof_void_p"
-
-
-# Variables needed in config.status (file generation) which aren't already
-# passed by autoconf.
-SUBDIRS="$SUBDIRS"
-
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
-  case $ac_config_target in
-    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
-    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
-    "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
-    "gstdint.h") CONFIG_COMMANDS="$CONFIG_COMMANDS gstdint.h" ;;
-    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-    "backtrace-supported.h") CONFIG_FILES="$CONFIG_FILES backtrace-supported.h" ;;
-    "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
-
-  *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
-  esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
-  tmp=
-  trap 'exit_status=$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
-' 0
-  trap 'as_fn_exit 1' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./conf$$-$RANDOM
-  (umask 077 && mkdir "$tmp")
-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=`echo X | tr X '\015'`
-# On cygwin, bash can eat \r inside `` if the user requested igncr.
-# But we know of no other shell where ac_cr would be empty at this
-# point, so we can use a bashism as a fallback.
-if test "x$ac_cr" = x; then
-  eval ac_cr=\$\'\\r\'
-fi
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-  ac_cs_awk_cr='\r'
-else
-  ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
-_ACEOF
-
-
-{
-  echo "cat >conf$$subs.awk <<_ACEOF" &&
-  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
-  echo "_ACEOF"
-} >conf$$subs.sh ||
-  as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  . ./conf$$subs.sh ||
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-
-  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
-  if test $ac_delim_n = $ac_delim_num; then
-    break
-  elif $ac_last_try; then
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\).*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\).*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
-  N
-  s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
-  for (key in S) S_is_set[key] = 1
-  FS = ""
-
-}
-{
-  line = $ 0
-  nfields = split(line, field, "@")
-  substed = 0
-  len = length(field[1])
-  for (i = 2; i < nfields; i++) {
-    key = field[i]
-    keylen = length(key)
-    if (S_is_set[key]) {
-      value = S[key]
-      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
-      len += length(value) + length(field[++i])
-      substed = 1
-    } else
-      len += 1 + keylen
-  }
-
-  print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
-  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
-  cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
-  || as_fn_error "could not setup config files machinery" "$LINENO" 5
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/
-s/:*\${srcdir}:*/:/
-s/:*@srcdir@:*/:/
-s/^\([^=]*=[	 ]*\):*/\1/
-s/:*$//
-s/^[^=]*=[	 ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-# Set up the scripts for CONFIG_HEADERS section.
-# No need to generate them if there are no CONFIG_HEADERS.
-# This happens for instance with `./config.status Makefile'.
-if test -n "$CONFIG_HEADERS"; then
-cat >"$tmp/defines.awk" <<\_ACAWK ||
-BEGIN {
-_ACEOF
-
-# Transform confdefs.h into an awk script `defines.awk', embedded as
-# here-document in config.status, that substitutes the proper values into
-# config.h.in to produce config.h.
-
-# Create a delimiter string that does not exist in confdefs.h, to ease
-# handling of long lines.
-ac_delim='%!_!# '
-for ac_last_try in false false :; do
-  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
-  if test -z "$ac_t"; then
-    break
-  elif $ac_last_try; then
-    as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-
-# For the awk script, D is an array of macro values keyed by name,
-# likewise P contains macro parameters if any.  Preserve backslash
-# newline sequences.
-
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-sed -n '
-s/.\{148\}/&'"$ac_delim"'/g
-t rset
-:rset
-s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
-t def
-d
-:def
-s/\\$//
-t bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3"/p
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
-d
-:bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3\\\\\\n"\\/p
-t cont
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
-t cont
-d
-:cont
-n
-s/.\{148\}/&'"$ac_delim"'/g
-t clear
-:clear
-s/\\$//
-t bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/"/p
-d
-:bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
-b cont
-' <confdefs.h | sed '
-s/'"$ac_delim"'/"\\\
-"/g' >>$CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  for (key in D) D_is_set[key] = 1
-  FS = ""
-}
-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
-  line = \$ 0
-  split(line, arg, " ")
-  if (arg[1] == "#") {
-    defundef = arg[2]
-    mac1 = arg[3]
-  } else {
-    defundef = substr(arg[1], 2)
-    mac1 = arg[2]
-  }
-  split(mac1, mac2, "(") #)
-  macro = mac2[1]
-  prefix = substr(line, 1, index(line, defundef) - 1)
-  if (D_is_set[macro]) {
-    # Preserve the white space surrounding the "#".
-    print prefix "define", macro P[macro] D[macro]
-    next
-  } else {
-    # Replace #undef with comments.  This is necessary, for example,
-    # in the case of _POSIX_SOURCE, which is predefined and required
-    # on some systems where configure will not decide to define it.
-    if (defundef == "undef") {
-      print "/*", prefix defundef, macro, "*/"
-      next
-    }
-  }
-}
-{ print }
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-  as_fn_error "could not setup config headers machinery" "$LINENO" 5
-fi # test -n "$CONFIG_HEADERS"
-
-
-eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
-shift
-for ac_tag
-do
-  case $ac_tag in
-  :[FHLC]) ac_mode=$ac_tag; continue;;
-  esac
-  case $ac_mode$ac_tag in
-  :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
-  :[FH]-) ac_tag=-:-;;
-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-  esac
-  ac_save_IFS=$IFS
-  IFS=:
-  set x $ac_tag
-  IFS=$ac_save_IFS
-  shift
-  ac_file=$1
-  shift
-
-  case $ac_mode in
-  :L) ac_source=$1;;
-  :[FH])
-    ac_file_inputs=
-    for ac_f
-    do
-      case $ac_f in
-      -) ac_f="$tmp/stdin";;
-      *) # Look for the file first in the build tree, then in the source tree
-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
-	 # because $ac_f cannot contain `:'.
-	 test -f "$ac_f" ||
-	   case $ac_f in
-	   [\\/$]*) false;;
-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
-	   esac ||
-	   as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
-      esac
-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
-      as_fn_append ac_file_inputs " '$ac_f'"
-    done
-
-    # Let's still pretend it is `configure' which instantiates (i.e., don't
-    # use $as_me), people would be surprised to read:
-    #    /* config.h.  Generated by config.status.  */
-    configure_input='Generated from '`
-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
-	`' by configure.'
-    if test x"$ac_file" != x-; then
-      configure_input="$ac_file.  $configure_input"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
-    fi
-    # Neutralize special characters interpreted by sed in replacement strings.
-    case $configure_input in #(
-    *\&* | *\|* | *\\* )
-       ac_sed_conf_input=`$as_echo "$configure_input" |
-       sed 's/[\\\\&|]/\\\\&/g'`;; #(
-    *) ac_sed_conf_input=$configure_input;;
-    esac
-
-    case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin" \
-      || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
-    esac
-    ;;
-  esac
-
-  ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  as_dir="$ac_dir"; as_fn_mkdir_p
-  ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-  case $ac_mode in
-  :F)
-  #
-  # CONFIG_FILE
-  #
-
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
-  esac
-  ac_MKDIR_P=$MKDIR_P
-  case $MKDIR_P in
-  [\\/$]* | ?:[\\/]* ) ;;
-  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
-  esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-ac_sed_dataroot='
-/datarootdir/ {
-  p
-  q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  ac_datarootdir_hack='
-  s&@datadir@&$datadir&g
-  s&@docdir@&$docdir&g
-  s&@infodir@&$infodir&g
-  s&@localedir@&$localedir&g
-  s&@mandir@&$mandir&g
-  s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-s&@MKDIR_P@&$ac_MKDIR_P&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&2;}
-
-  rm -f "$tmp/stdin"
-  case $ac_file in
-  -) cat "$tmp/out" && rm -f "$tmp/out";;
-  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
-  esac \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
- ;;
-  :H)
-  #
-  # CONFIG_HEADER
-  #
-  if test x"$ac_file" != x-; then
-    {
-      $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
-    } >"$tmp/config.h" \
-      || as_fn_error "could not create $ac_file" "$LINENO" 5
-    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      rm -f "$ac_file"
-      mv "$tmp/config.h" "$ac_file" \
-	|| as_fn_error "could not create $ac_file" "$LINENO" 5
-    fi
-  else
-    $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
-      || as_fn_error "could not create -" "$LINENO" 5
-  fi
-# Compute "$ac_file"'s index in $config_headers.
-_am_arg="$ac_file"
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
-$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$_am_arg" : 'X\(//\)[^/]' \| \
-	 X"$_am_arg" : 'X\(//\)$' \| \
-	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$_am_arg" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`/stamp-h$_am_stamp_count
- ;;
-
-  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
- ;;
-  esac
-
-
-  case $ac_file$ac_mode in
-    "libtool":C)
-
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
-# The names of the tagged configurations supported by this script.
-available_tags=""
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Which release of libtool.m4 was used?
-macro_version=$macro_version
-macro_revision=$macro_revision
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# What type of objects to build.
-pic_mode=$pic_mode
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# An echo program that protects backslashes.
-ECHO=$lt_ECHO
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="\$SED -e 1s/^X//"
-
-# A grep program that handles long lines.
-GREP=$lt_GREP
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# A literal string matcher.
-FGREP=$lt_FGREP
-
-# A BSD- or MS-compatible name lister.
-NM=$lt_NM
-
-# Whether we need soft or hard links.
-LN_S=$lt_LN_S
-
-# What is the maximum length of a command?
-max_cmd_len=$max_cmd_len
-
-# Object file suffix (normally "o").
-objext=$ac_objext
-
-# Executable file suffix (normally "").
-exeext=$exeext
-
-# whether the shell understands "unset".
-lt_unset=$lt_unset
-
-# turn spaces into newlines.
-SP2NL=$lt_lt_SP2NL
-
-# turn newlines into spaces.
-NL2SP=$lt_lt_NL2SP
-
-# An object symbol dumper.
-OBJDUMP=$lt_OBJDUMP
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == "file_magic".
-file_magic_cmd=$lt_file_magic_cmd
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# A symbol stripping program.
-STRIP=$lt_STRIP
-
-# Commands used to install an old-style archive.
-RANLIB=$lt_RANLIB
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Whether to use a lock for old archive extraction.
-lock_old_archive_extraction=$lock_old_archive_extraction
-
-# A C compiler.
-LTCC=$lt_CC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_CFLAGS
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration.
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair.
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# Transform the output of nm in a C name address pair when lib prefix is needed.
-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# Used to examine libraries when file_magic_cmd begins with "file".
-MAGIC_CMD=$MAGIC_CMD
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
-DSYMUTIL=$lt_DSYMUTIL
-
-# Tool to change global to local symbols on Mac OS X.
-NMEDIT=$lt_NMEDIT
-
-# Tool to manipulate fat objects and archives on Mac OS X.
-LIPO=$lt_LIPO
-
-# ldd/readelf like tool for Mach-O binaries on Mac OS X.
-OTOOL=$lt_OTOOL
-
-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
-OTOOL64=$lt_OTOOL64
-
-# Old archive suffix (normally "a").
-libext=$libext
-
-# Shared library suffix (normally ".so").
-shrext_cmds=$lt_shrext_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at link time.
-variables_saved_for_relink=$lt_variables_saved_for_relink
-
-# Do we need the "lib" prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Library versioning type.
-version_type=$version_type
-
-# Shared library runtime path variable.
-runpath_var=$runpath_var
-
-# Shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Permission mode override for installation of shared libraries.
-install_override_mode=$lt_install_override_mode
-
-# Command to use after installation of a shared archive.
-postinstall_cmds=$lt_postinstall_cmds
-
-# Command to use after uninstallation of a shared archive.
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# As "finish_cmds", except a single script fragment to be evaled but
-# not shown.
-finish_eval=$lt_finish_eval
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Compile-time system search path for libraries.
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds
-
-# A language specific compiler.
-CC=$lt_compiler
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $* ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-}
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[^=]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "${1}" | $SED "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "${1}" | $SED "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$@"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1+=\$2"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1=\$$1\$2"
-}
-
-_LT_EOF
-    ;;
-  esac
-
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-
- ;;
-    "default-1":C)
-# Only add multilib support code if we just rebuilt the top-level
-# Makefile.
-case " $CONFIG_FILES " in
- *" Makefile "*)
-   ac_file=Makefile . ${multi_basedir}/config-ml.in
-   ;;
-esac ;;
-    "gstdint.h":C)
-if test "$GCC" = yes; then
-  echo "/* generated for " `$CC --version | sed 1q` "*/" > tmp-stdint.h
-else
-  echo "/* generated for $CC */" > tmp-stdint.h
-fi
-
-sed 's/^ *//' >> tmp-stdint.h <<EOF
-
-  #ifndef GCC_GENERATED_STDINT_H
-  #define GCC_GENERATED_STDINT_H 1
-
-  #include <sys/types.h>
-EOF
-
-if test "$acx_cv_header_stdint" != stdint.h; then
-  echo "#include <stddef.h>" >> tmp-stdint.h
-fi
-if test "$acx_cv_header_stdint" != stddef.h; then
-  echo "#include <$acx_cv_header_stdint>" >> tmp-stdint.h
-fi
-
-sed 's/^ *//' >> tmp-stdint.h <<EOF
-  /* glibc uses these symbols as guards to prevent redefinitions.  */
-  #ifdef __int8_t_defined
-  #define _INT8_T
-  #define _INT16_T
-  #define _INT32_T
-  #endif
-  #ifdef __uint32_t_defined
-  #define _UINT32_T
-  #endif
-
-EOF
-
-# ----------------- done header, emit basic int types -------------
-if test "$acx_cv_header_stdint" = stddef.h; then
-  sed 's/^ *//' >> tmp-stdint.h <<EOF
-
-    #ifndef _UINT8_T
-    #define _UINT8_T
-    #ifndef __uint8_t_defined
-    #define __uint8_t_defined
-    #ifndef uint8_t
-    typedef unsigned $acx_cv_type_int8_t uint8_t;
-    #endif
-    #endif
-    #endif
-
-    #ifndef _UINT16_T
-    #define _UINT16_T
-    #ifndef __uint16_t_defined
-    #define __uint16_t_defined
-    #ifndef uint16_t
-    typedef unsigned $acx_cv_type_int16_t uint16_t;
-    #endif
-    #endif
-    #endif
-
-    #ifndef _UINT32_T
-    #define _UINT32_T
-    #ifndef __uint32_t_defined
-    #define __uint32_t_defined
-    #ifndef uint32_t
-    typedef unsigned $acx_cv_type_int32_t uint32_t;
-    #endif
-    #endif
-    #endif
-
-    #ifndef _INT8_T
-    #define _INT8_T
-    #ifndef __int8_t_defined
-    #define __int8_t_defined
-    #ifndef int8_t
-    typedef $acx_cv_type_int8_t int8_t;
-    #endif
-    #endif
-    #endif
-
-    #ifndef _INT16_T
-    #define _INT16_T
-    #ifndef __int16_t_defined
-    #define __int16_t_defined
-    #ifndef int16_t
-    typedef $acx_cv_type_int16_t int16_t;
-    #endif
-    #endif
-    #endif
-
-    #ifndef _INT32_T
-    #define _INT32_T
-    #ifndef __int32_t_defined
-    #define __int32_t_defined
-    #ifndef int32_t
-    typedef $acx_cv_type_int32_t int32_t;
-    #endif
-    #endif
-    #endif
-EOF
-elif test "$ac_cv_type_u_int32_t" = yes; then
-  sed 's/^ *//' >> tmp-stdint.h <<EOF
-
-    /* int8_t int16_t int32_t defined by inet code, we do the u_intXX types */
-    #ifndef _INT8_T
-    #define _INT8_T
-    #endif
-    #ifndef _INT16_T
-    #define _INT16_T
-    #endif
-    #ifndef _INT32_T
-    #define _INT32_T
-    #endif
-
-    #ifndef _UINT8_T
-    #define _UINT8_T
-    #ifndef __uint8_t_defined
-    #define __uint8_t_defined
-    #ifndef uint8_t
-    typedef u_int8_t uint8_t;
-    #endif
-    #endif
-    #endif
-
-    #ifndef _UINT16_T
-    #define _UINT16_T
-    #ifndef __uint16_t_defined
-    #define __uint16_t_defined
-    #ifndef uint16_t
-    typedef u_int16_t uint16_t;
-    #endif
-    #endif
-    #endif
-
-    #ifndef _UINT32_T
-    #define _UINT32_T
-    #ifndef __uint32_t_defined
-    #define __uint32_t_defined
-    #ifndef uint32_t
-    typedef u_int32_t uint32_t;
-    #endif
-    #endif
-    #endif
-EOF
-else
-  sed 's/^ *//' >> tmp-stdint.h <<EOF
-
-    /* Some systems have guard macros to prevent redefinitions, define them.  */
-    #ifndef _INT8_T
-    #define _INT8_T
-    #endif
-    #ifndef _INT16_T
-    #define _INT16_T
-    #endif
-    #ifndef _INT32_T
-    #define _INT32_T
-    #endif
-    #ifndef _UINT8_T
-    #define _UINT8_T
-    #endif
-    #ifndef _UINT16_T
-    #define _UINT16_T
-    #endif
-    #ifndef _UINT32_T
-    #define _UINT32_T
-    #endif
-EOF
-fi
-
-# ------------- done basic int types, emit int64_t types ------------
-if test "$ac_cv_type_uint64_t" = yes; then
-  sed 's/^ *//' >> tmp-stdint.h <<EOF
-
-    /* system headers have good uint64_t and int64_t */
-    #ifndef _INT64_T
-    #define _INT64_T
-    #endif
-    #ifndef _UINT64_T
-    #define _UINT64_T
-    #endif
-EOF
-elif test "$ac_cv_type_u_int64_t" = yes; then
-  sed 's/^ *//' >> tmp-stdint.h <<EOF
-
-    /* system headers have an u_int64_t (and int64_t) */
-    #ifndef _INT64_T
-    #define _INT64_T
-    #endif
-    #ifndef _UINT64_T
-    #define _UINT64_T
-    #ifndef __uint64_t_defined
-    #define __uint64_t_defined
-    #ifndef uint64_t
-    typedef u_int64_t uint64_t;
-    #endif
-    #endif
-    #endif
-EOF
-elif test -n "$acx_cv_type_int64_t"; then
-  sed 's/^ *//' >> tmp-stdint.h <<EOF
-
-    /* architecture has a 64-bit type, $acx_cv_type_int64_t */
-    #ifndef _INT64_T
-    #define _INT64_T
-    #ifndef int64_t
-    typedef $acx_cv_type_int64_t int64_t;
-    #endif
-    #endif
-    #ifndef _UINT64_T
-    #define _UINT64_T
-    #ifndef __uint64_t_defined
-    #define __uint64_t_defined
-    #ifndef uint64_t
-    typedef unsigned $acx_cv_type_int64_t uint64_t;
-    #endif
-    #endif
-    #endif
-EOF
-else
-  sed 's/^ *//' >> tmp-stdint.h <<EOF
-
-    /* some common heuristics for int64_t, using compiler-specific tests */
-    #if defined __STDC_VERSION__ && (__STDC_VERSION__-0) >= 199901L
-    #ifndef _INT64_T
-    #define _INT64_T
-    #ifndef __int64_t_defined
-    #ifndef int64_t
-    typedef long long int64_t;
-    #endif
-    #endif
-    #endif
-    #ifndef _UINT64_T
-    #define _UINT64_T
-    #ifndef uint64_t
-    typedef unsigned long long uint64_t;
-    #endif
-    #endif
-
-    #elif defined __GNUC__ && defined (__STDC__) && __STDC__-0
-    /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
-       does not implement __extension__.  But that compiler doesn't define
-       __GNUC_MINOR__.  */
-    # if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
-    # define __extension__
-    # endif
-
-    # ifndef _INT64_T
-    # define _INT64_T
-    # ifndef int64_t
-    __extension__ typedef long long int64_t;
-    # endif
-    # endif
-    # ifndef _UINT64_T
-    # define _UINT64_T
-    # ifndef uint64_t
-    __extension__ typedef unsigned long long uint64_t;
-    # endif
-    # endif
-
-    #elif !defined __STRICT_ANSI__
-    # if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__
-
-    #  ifndef _INT64_T
-    #  define _INT64_T
-    #  ifndef int64_t
-    typedef __int64 int64_t;
-    #  endif
-    #  endif
-    #  ifndef _UINT64_T
-    #  define _UINT64_T
-    #  ifndef uint64_t
-    typedef unsigned __int64 uint64_t;
-    #  endif
-    #  endif
-    # endif /* compiler */
-
-    #endif /* ANSI version */
-EOF
-fi
-
-# ------------- done int64_t types, emit intptr types ------------
-if test "$ac_cv_type_uintptr_t" != yes; then
-  sed 's/^ *//' >> tmp-stdint.h <<EOF
-
-    /* Define intptr_t based on sizeof(void*) = $ac_cv_sizeof_void_p */
-    #ifndef __uintptr_t_defined
-    #ifndef uintptr_t
-    typedef u$acx_cv_type_intptr_t uintptr_t;
-    #endif
-    #endif
-    #ifndef __intptr_t_defined
-    #ifndef intptr_t
-    typedef $acx_cv_type_intptr_t  intptr_t;
-    #endif
-    #endif
-EOF
-fi
-
-# ------------- done intptr types, emit int_least types ------------
-if test "$ac_cv_type_int_least32_t" != yes; then
-  sed 's/^ *//' >> tmp-stdint.h <<EOF
-
-    /* Define int_least types */
-    typedef int8_t     int_least8_t;
-    typedef int16_t    int_least16_t;
-    typedef int32_t    int_least32_t;
-    #ifdef _INT64_T
-    typedef int64_t    int_least64_t;
-    #endif
-
-    typedef uint8_t    uint_least8_t;
-    typedef uint16_t   uint_least16_t;
-    typedef uint32_t   uint_least32_t;
-    #ifdef _UINT64_T
-    typedef uint64_t   uint_least64_t;
-    #endif
-EOF
-fi
-
-# ------------- done intptr types, emit int_fast types ------------
-if test "$ac_cv_type_int_fast32_t" != yes; then
-      sed 's/^ *//' >> tmp-stdint.h <<EOF
-
-    /* Define int_fast types.  short is often slow */
-    typedef int8_t       int_fast8_t;
-    typedef int          int_fast16_t;
-    typedef int32_t      int_fast32_t;
-    #ifdef _INT64_T
-    typedef int64_t      int_fast64_t;
-    #endif
-
-    typedef uint8_t      uint_fast8_t;
-    typedef unsigned int uint_fast16_t;
-    typedef uint32_t     uint_fast32_t;
-    #ifdef _UINT64_T
-    typedef uint64_t     uint_fast64_t;
-    #endif
-EOF
-fi
-
-if test "$ac_cv_type_uintmax_t" != yes; then
-  sed 's/^ *//' >> tmp-stdint.h <<EOF
-
-    /* Define intmax based on what we found */
-    #ifndef intmax_t
-    #ifdef _INT64_T
-    typedef int64_t       intmax_t;
-    #else
-    typedef long          intmax_t;
-    #endif
-    #endif
-    #ifndef uintmax_t
-    #ifdef _UINT64_T
-    typedef uint64_t      uintmax_t;
-    #else
-    typedef unsigned long uintmax_t;
-    #endif
-    #endif
-EOF
-fi
-
-sed 's/^ *//' >> tmp-stdint.h <<EOF
-
-  #endif /* GCC_GENERATED_STDINT_H */
-EOF
-
-if test -r gstdint.h && cmp -s tmp-stdint.h gstdint.h; then
-  rm -f tmp-stdint.h
-else
-  mv -f tmp-stdint.h gstdint.h
-fi
-
- ;;
-    "default":C) if test -n "$CONFIG_FILES"; then
-   if test -n "${with_target_subdir}"; then
-     # Multilibs need MULTISUBDIR defined correctly in certain makefiles so
-     # that multilib installs will end up installed in the correct place.
-     # The testsuite needs it for multilib-aware ABI baseline files.
-     # To work around this not being passed down from config-ml.in ->
-     # srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually
-     # append it here.  Only modify Makefiles that have just been created.
-     #
-     # Also, get rid of this simulated-VPATH thing that automake does.
-     cat > vpsed << \_EOF
-  s!`test -f '$<' || echo '$(srcdir)/'`!!
-_EOF
-     for i in $SUBDIRS; do
-      case $CONFIG_FILES in
-       *${i}/Makefile*)
-	 #echo "Adding MULTISUBDIR to $i/Makefile"
-	 sed -f vpsed $i/Makefile > tmp
-	 grep '^MULTISUBDIR =' Makefile >> tmp
-	 mv tmp $i/Makefile
-	 ;;
-      esac
-     done
-     rm vpsed
-   fi
- fi
- ;;
-
-  esac
-done # for ac_tag
-
-
-as_fn_exit 0
-_ACEOF
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
-  as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || as_fn_exit $?
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
diff --git a/third_party/gofrontend/libbacktrace/configure.ac b/third_party/gofrontend/libbacktrace/configure.ac
deleted file mode 100644
index ef88112..0000000
--- a/third_party/gofrontend/libbacktrace/configure.ac
+++ /dev/null
@@ -1,391 +0,0 @@
-# configure.ac -- Backtrace configure script.
-# Copyright (C) 2012-2015 Free Software Foundation, Inc.
-
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-
-#     (1) Redistributions of source code must retain the above copyright
-#     notice, this list of conditions and the following disclaimer. 
-
-#     (2) 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.  
-    
-#     (3) The name of the author may not be used to
-#     endorse or promote products derived from this software without
-#     specific prior written permission.
-
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
-
-AC_PREREQ(2.64)
-AC_INIT(package-unused, version-unused,, libbacktrace)
-AC_CONFIG_SRCDIR(backtrace.h)
-AC_CONFIG_HEADER(config.h)
-
-AC_CANONICAL_SYSTEM
-target_alias=${target_alias-$host_alias}
-
-AC_USE_SYSTEM_EXTENSIONS
-
-libtool_VERSION=1:0:0
-AC_SUBST(libtool_VERSION)
-
-# 1.11.1: Require that version of automake.
-# foreign: Don't require README, INSTALL, NEWS, etc.
-# no-define: Don't define PACKAGE and VERSION.
-# no-dependencies: Don't generate automatic dependencies.
-#    (because it breaks when using bootstrap-lean, since some of the
-#    headers are gone at "make install" time).
-# -Wall: Issue all automake warnings.
-# -Wno-portability: Don't warn about constructs supported by GNU make.
-#    (because GCC requires GNU make anyhow).
-AM_INIT_AUTOMAKE([1.11.1 foreign no-dist no-define no-dependencies -Wall -Wno-portability])
-
-AM_MAINTAINER_MODE
-
-AC_ARG_WITH(target-subdir,
-[  --with-target-subdir=SUBDIR      Configuring in a subdirectory for target])
-
-# We must force CC to /not/ be precious variables; otherwise
-# the wrong, non-multilib-adjusted value will be used in multilibs.
-# As a side effect, we have to subst CFLAGS ourselves.
-m4_rename([_AC_ARG_VAR_PRECIOUS],[backtrace_PRECIOUS])
-m4_define([_AC_ARG_VAR_PRECIOUS],[])
-AC_PROG_CC
-m4_rename_force([backtrace_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
-
-AC_SUBST(CFLAGS)
-
-AC_PROG_RANLIB
-
-AC_PROG_AWK
-case "$AWK" in
-"") AC_MSG_ERROR([can't build without awk]) ;;
-esac
-
-LT_INIT([disable-shared])
-AM_PROG_LIBTOOL
-
-backtrace_supported=yes
-
-if test -n "${with_target_subdir}"; then
-  # We are compiling a GCC library.  We can assume that the unwind
-  # library exists.
-  AM_ENABLE_MULTILIB(, ..)
-  BACKTRACE_FILE="backtrace.lo simple.lo"
-else
-  AC_CHECK_HEADER([unwind.h],
-    [AC_CHECK_FUNC([_Unwind_Backtrace],
-	           [BACKTRACE_FILE="backtrace.lo simple.lo"],
-		   [BACKTRACE_FILE="nounwind.lo"
-                    backtrace_supported=no])],
-    [BACKTRACE_FILE="nounwind.lo"
-     backtrace_supported=no])
-fi
-AC_SUBST(BACKTRACE_FILE)
-
-EXTRA_FLAGS=
-if test -n "${with_target_subdir}"; then
-  EXTRA_FLAGS="-funwind-tables -frandom-seed=\$@"
-else
-  AC_CACHE_CHECK([for -funwind-tables option],
-    [libbacktrace_cv_c_unwind_tables],
-    [CFLAGS_hold="$CFLAGS"
-     CFLAGS="$CFLAGS -funwind-tables"
-     AC_COMPILE_IFELSE(
-       [AC_LANG_PROGRAM([static int f() { return 0; }], [return f();])],
-       [libbacktrace_cv_c_unwind_tables=yes],
-       [libbacktrace_cv_c_unwind_tables=no])
-     CFLAGS="$CFLAGS_hold"])
-  if test "$libbacktrace_cv_c_unwind_tables" = "yes"; then
-    EXTRA_FLAGS=-funwind-tables
-  fi
-  AC_CACHE_CHECK([for -frandom-seed=string option],
-    [libbacktrace_cv_c_random_seed_string],
-    [CFLAGS_hold="$CFLAGS"
-     CFLAGS="$CFLAGS -frandom-seed=conftest.lo"
-     AC_COMPILE_IFELSE(
-       [AC_LANG_PROGRAM([], [return 0;])],
-       [libbacktrace_cv_c_random_seed_string=yes],
-       [libbacktrace_cv_c_random_seed_string=no])
-     CFLAGS="$CFLAGS_hold"])
-  if test "$libbacktrace_cv_c_random_seed_string" = "yes"; then
-    EXTRA_FLAGS="$EXTRA_FLAGS -frandom-seed=\$@"
-  fi
-fi
-AC_SUBST(EXTRA_FLAGS)
-
-ACX_PROG_CC_WARNING_OPTS([-W -Wall -Wwrite-strings -Wstrict-prototypes \
-			  -Wmissing-prototypes -Wold-style-definition \
-			  -Wmissing-format-attribute -Wcast-qual],
-			  [WARN_FLAGS])
-
-if test -n "${with_target_subdir}"; then
-  WARN_FLAGS="$WARN_FLAGS -Werror"
-fi
-
-AC_SUBST(WARN_FLAGS)
-
-if test -n "${with_target_subdir}"; then
-  GCC_CHECK_UNWIND_GETIPINFO
-else
-  ac_save_CFFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -Werror-implicit-function-declaration"
-  AC_MSG_CHECKING([for _Unwind_GetIPInfo])
-  AC_LINK_IFELSE(
-    [AC_LANG_PROGRAM(
-       [#include "unwind.h"
-	struct _Unwind_Context *context;
-	int ip_before_insn = 0;],
-	[return _Unwind_GetIPInfo (context, &ip_before_insn);])],
-	[have_unwind_getipinfo=yes], [have_unwind_getipinfo=no])
-  CFLAGS="$ac_save_CFLAGS"
-  AC_MSG_RESULT([$have_unwind_getipinfo])
-  if test "$have_unwind_getipinfo" = "yes"; then
-    AC_DEFINE(HAVE_GETIPINFO, 1, [Define if _Unwind_GetIPInfo is available.])
-  fi
-fi
-
-# When building as a target library, shared libraries may want to link
-# this in.  We don't want to provide another shared library to
-# complicate dependencies.  Instead, we just compile with -fPIC.
-PIC_FLAG=
-if test -n "${with_target_subdir}"; then
-  PIC_FLAG=-fPIC
-fi
-# Similarly, use -fPIC with --enable-host-shared:
-AC_ARG_ENABLE(host-shared,
-[AS_HELP_STRING([--enable-host-shared],
-		[build host code as shared libraries])],
-[PIC_FLAG=-fPIC], [])
-AC_SUBST(PIC_FLAG)
-
-# Test for __sync support.
-AC_CACHE_CHECK([__sync extensions],
-[libbacktrace_cv_sys_sync],
-[if test -n "${with_target_subdir}"; then
-   libbacktrace_cv_sys_sync=yes
- else
-   AC_LINK_IFELSE(
-     [AC_LANG_PROGRAM([int i;],
-                      [__sync_bool_compare_and_swap (&i, i, i);
-                       __sync_lock_test_and_set (&i, 1);
-                       __sync_lock_release (&i);])],
-     [libbacktrace_cv_sys_sync=yes],
-     [libbacktrace_cv_sys_sync=no])
- fi])
-BACKTRACE_SUPPORTS_THREADS=0
-if test "$libbacktrace_cv_sys_sync" = "yes"; then
-  BACKTRACE_SUPPORTS_THREADS=1
-  AC_DEFINE([HAVE_SYNC_FUNCTIONS], 1,
-	    [Define to 1 if you have the __sync functions])
-fi
-AC_SUBST(BACKTRACE_SUPPORTS_THREADS)
-
-# Test for __atomic support.
-AC_CACHE_CHECK([__atomic extensions],
-[libbacktrace_cv_sys_atomic],
-[if test -n "${with_target_subdir}"; then
-   libbacktrace_cv_sys_atomic=yes
- else
-   AC_LINK_IFELSE(
-     [AC_LANG_PROGRAM([int i;],
-     		      [__atomic_load_n (&i, __ATOMIC_ACQUIRE);
-		       __atomic_store_n (&i, 1, __ATOMIC_RELEASE);])],
-     [libbacktrace_cv_sys_atomic=yes],
-     [libbacktrace_cv_sys_atomic=no])
- fi])
-if test "$libbacktrace_cv_sys_atomic" = "yes"; then
-  AC_DEFINE([HAVE_ATOMIC_FUNCTIONS], 1,
-	    [Define to 1 if you have the __atomic functions])
-fi
-
-# The library needs to be able to read the executable itself.  Compile
-# a file to determine the executable format.  The awk script
-# filetype.awk prints out the file type.
-AC_CACHE_CHECK([output filetype],
-[libbacktrace_cv_sys_filetype],
-[filetype=
-AC_COMPILE_IFELSE(
-  [AC_LANG_PROGRAM([int i;], [int j;])],
-  [filetype=`${AWK} -f $srcdir/filetype.awk conftest.$ac_objext`],
-  [AC_MSG_FAILURE([compiler failed])])
-libbacktrace_cv_sys_filetype=$filetype])
-
-# Match the file type to decide what files to compile.
-FORMAT_FILE=
-case "$libbacktrace_cv_sys_filetype" in
-elf*) FORMAT_FILE="elf.lo" ;;
-*) AC_MSG_WARN([could not determine output file type])
-   FORMAT_FILE="unknown.lo"
-   backtrace_supported=no
-   ;;
-esac
-AC_SUBST(FORMAT_FILE)
-
-# ELF defines.
-elfsize=
-case "$libbacktrace_cv_sys_filetype" in
-elf32) elfsize=32 ;;
-elf64) elfsize=64 ;;
-esac
-AC_DEFINE_UNQUOTED([BACKTRACE_ELF_SIZE], [$elfsize], [ELF size: 32 or 64])
-
-BACKTRACE_SUPPORTED=0
-if test "$backtrace_supported" = "yes"; then
-  BACKTRACE_SUPPORTED=1
-fi
-AC_SUBST(BACKTRACE_SUPPORTED)
-
-GCC_HEADER_STDINT(gstdint.h)
-
-AC_CHECK_HEADERS(sys/mman.h)
-if test "$ac_cv_header_sys_mman_h" = "no"; then
-  have_mmap=no
-else
-  if test -n "${with_target_subdir}"; then
-    # When built as a GCC target library, we can't do a link test.  We
-    # simply assume that if we have mman.h, we have mmap.
-    have_mmap=yes
-  else
-    AC_CHECK_FUNC(mmap, [have_mmap=yes], [have_mmap=no])
-  fi
-fi
-if test "$have_mmap" = "no"; then
-  VIEW_FILE=read.lo
-  ALLOC_FILE=alloc.lo
-else
-  VIEW_FILE=mmapio.lo
-  AC_PREPROC_IFELSE([
-#include <sys/mman.h>
-#if !defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
-  #error no MAP_ANONYMOUS
-#endif
-], [ALLOC_FILE=mmap.lo], [ALLOC_FILE=alloc.lo])
-fi
-AC_SUBST(VIEW_FILE)
-AC_SUBST(ALLOC_FILE)
-
-BACKTRACE_USES_MALLOC=0
-if test "$ALLOC_FILE" = "alloc.lo"; then
-  BACKTRACE_USES_MALLOC=1
-fi
-AC_SUBST(BACKTRACE_USES_MALLOC)
-
-# Check for dl_iterate_phdr.
-AC_CHECK_HEADERS(link.h)
-if test "$ac_cv_header_link_h" = "no"; then
-  have_dl_iterate_phdr=no
-else
-  if test -n "${with_target_subdir}"; then
-    # When built as a GCC target library, we can't do a link test.
-    AC_EGREP_HEADER([dl_iterate_phdr], [link.h], [have_dl_iterate_phdr=yes],
-		    [have_dl_iterate_phdr=no])
-    case "${host}" in
-    *-*-solaris2.10*)
-        # Avoid dl_iterate_phdr on Solaris 10, where it is in the
-    	# header file but is only in -ldl.
-	have_dl_iterate_phdr=no ;;
-    esac
-  else
-    AC_CHECK_FUNC([dl_iterate_phdr], [have_dl_iterate_phdr=yes],
-		  [have_dl_iterate_phdr=no])
-  fi
-fi
-if test "$have_dl_iterate_phdr" = "yes"; then
-  AC_DEFINE(HAVE_DL_ITERATE_PHDR, 1, [Define if dl_iterate_phdr is available.])
-fi
-
-# Check for the fcntl function.
-if test -n "${with_target_subdir}"; then
-   case "${host}" in
-   *-*-mingw*) have_fcntl=no ;;
-   *) have_fcntl=yes ;;
-   esac
-else
-  AC_CHECK_FUNC(fcntl, [have_fcntl=yes], [have_fcntl=no])
-fi
-if test "$have_fcntl" = "yes"; then
-  AC_DEFINE([HAVE_FCNTL], 1,
-	    [Define to 1 if you have the fcntl function])
-fi
-
-AC_CHECK_DECLS(strnlen)
-
-# Check for getexecname function.
-if test -n "${with_target_subdir}"; then
-   case "${host}" in
-   *-*-solaris2*) have_getexecname=yes ;;
-   *) have_getexecname=no ;;
-   esac
-else
-  AC_CHECK_FUNC(getexecname, [have_getexecname=yes], [have_getexecname=no])
-fi
-if test "$have_getexecname" = "yes"; then
-  AC_DEFINE(HAVE_GETEXECNAME, 1, [Define if getexecname is available.])
-fi
-
-AC_CACHE_CHECK([whether tests can run],
-  [libbacktrace_cv_sys_native],
-  [AC_RUN_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
-     [libbacktrace_cv_sys_native=yes],
-     [libbacktrace_cv_sys_native=no],
-     [libbacktrace_cv_sys_native=no])])
-AM_CONDITIONAL(NATIVE, test "$libbacktrace_cv_sys_native" = "yes")
-
-if test "${multilib}" = "yes"; then
-  multilib_arg="--enable-multilib"
-else
-  multilib_arg=
-fi
-
-AC_CONFIG_FILES(Makefile backtrace-supported.h)
-
-# We need multilib support, but only if configuring for the target.
-AC_CONFIG_COMMANDS([default],
-[if test -n "$CONFIG_FILES"; then
-   if test -n "${with_target_subdir}"; then
-     # Multilibs need MULTISUBDIR defined correctly in certain makefiles so
-     # that multilib installs will end up installed in the correct place.
-     # The testsuite needs it for multilib-aware ABI baseline files.
-     # To work around this not being passed down from config-ml.in ->
-     # srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually
-     # append it here.  Only modify Makefiles that have just been created.
-     #
-     # Also, get rid of this simulated-VPATH thing that automake does.
-     cat > vpsed << \_EOF
-  s!`test -f '$<' || echo '$(srcdir)/'`!!
-_EOF
-     for i in $SUBDIRS; do
-      case $CONFIG_FILES in
-       *${i}/Makefile*)
-	 #echo "Adding MULTISUBDIR to $i/Makefile"
-	 sed -f vpsed $i/Makefile > tmp
-	 grep '^MULTISUBDIR =' Makefile >> tmp
-	 mv tmp $i/Makefile
-	 ;;
-      esac
-     done
-     rm vpsed
-   fi
- fi
-],
-[
-# Variables needed in config.status (file generation) which aren't already
-# passed by autoconf.
-SUBDIRS="$SUBDIRS"
-])
-
-AC_OUTPUT
diff --git a/third_party/gofrontend/libbacktrace/dwarf.c b/third_party/gofrontend/libbacktrace/dwarf.c
deleted file mode 100644
index 919b568..0000000
--- a/third_party/gofrontend/libbacktrace/dwarf.c
+++ /dev/null
@@ -1,3022 +0,0 @@
-/* dwarf.c -- Get file/line information from DWARF for backtraces.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "dwarf2.h"
-#include "filenames.h"
-
-#include "backtrace.h"
-#include "internal.h"
-
-#if !defined(HAVE_DECL_STRNLEN) || !HAVE_DECL_STRNLEN
-
-/* If strnlen is not declared, provide our own version.  */
-
-static size_t
-xstrnlen (const char *s, size_t maxlen)
-{
-  size_t i;
-
-  for (i = 0; i < maxlen; ++i)
-    if (s[i] == '\0')
-      break;
-  return i;
-}
-
-#define strnlen xstrnlen
-
-#endif
-
-/* A buffer to read DWARF info.  */
-
-struct dwarf_buf
-{
-  /* Buffer name for error messages.  */
-  const char *name;
-  /* Start of the buffer.  */
-  const unsigned char *start;
-  /* Next byte to read.  */
-  const unsigned char *buf;
-  /* The number of bytes remaining.  */
-  size_t left;
-  /* Whether the data is big-endian.  */
-  int is_bigendian;
-  /* Error callback routine.  */
-  backtrace_error_callback error_callback;
-  /* Data for error_callback.  */
-  void *data;
-  /* Non-zero if we've reported an underflow error.  */
-  int reported_underflow;
-};
-
-/* A single attribute in a DWARF abbreviation.  */
-
-struct attr
-{
-  /* The attribute name.  */
-  enum dwarf_attribute name;
-  /* The attribute form.  */
-  enum dwarf_form form;
-};
-
-/* A single DWARF abbreviation.  */
-
-struct abbrev
-{
-  /* The abbrev code--the number used to refer to the abbrev.  */
-  uint64_t code;
-  /* The entry tag.  */
-  enum dwarf_tag tag;
-  /* Non-zero if this abbrev has child entries.  */
-  int has_children;
-  /* The number of attributes.  */
-  size_t num_attrs;
-  /* The attributes.  */
-  struct attr *attrs;
-};
-
-/* The DWARF abbreviations for a compilation unit.  This structure
-   only exists while reading the compilation unit.  Most DWARF readers
-   seem to a hash table to map abbrev ID's to abbrev entries.
-   However, we primarily care about GCC, and GCC simply issues ID's in
-   numerical order starting at 1.  So we simply keep a sorted vector,
-   and try to just look up the code.  */
-
-struct abbrevs
-{
-  /* The number of abbrevs in the vector.  */
-  size_t num_abbrevs;
-  /* The abbrevs, sorted by the code field.  */
-  struct abbrev *abbrevs;
-};
-
-/* The different kinds of attribute values.  */
-
-enum attr_val_encoding
-{
-  /* An address.  */
-  ATTR_VAL_ADDRESS,
-  /* A unsigned integer.  */
-  ATTR_VAL_UINT,
-  /* A sigd integer.  */
-  ATTR_VAL_SINT,
-  /* A string.  */
-  ATTR_VAL_STRING,
-  /* An offset to other data in the containing unit.  */
-  ATTR_VAL_REF_UNIT,
-  /* An offset to other data within the .dwarf_info section.  */
-  ATTR_VAL_REF_INFO,
-  /* An offset to data in some other section.  */
-  ATTR_VAL_REF_SECTION,
-  /* A type signature.  */
-  ATTR_VAL_REF_TYPE,
-  /* A block of data (not represented).  */
-  ATTR_VAL_BLOCK,
-  /* An expression (not represented).  */
-  ATTR_VAL_EXPR,
-};
-
-/* An attribute value.  */
-
-struct attr_val
-{
-  /* How the value is stored in the field u.  */
-  enum attr_val_encoding encoding;
-  union
-  {
-    /* ATTR_VAL_ADDRESS, ATTR_VAL_UINT, ATTR_VAL_REF*.  */
-    uint64_t uint;
-    /* ATTR_VAL_SINT.  */
-    int64_t sint;
-    /* ATTR_VAL_STRING.  */
-    const char *string;
-    /* ATTR_VAL_BLOCK not stored.  */
-  } u;
-};
-
-/* The line number program header.  */
-
-struct line_header
-{
-  /* The version of the line number information.  */
-  int version;
-  /* The minimum instruction length.  */
-  unsigned int min_insn_len;
-  /* The maximum number of ops per instruction.  */
-  unsigned int max_ops_per_insn;
-  /* The line base for special opcodes.  */
-  int line_base;
-  /* The line range for special opcodes.  */
-  unsigned int line_range;
-  /* The opcode base--the first special opcode.  */
-  unsigned int opcode_base;
-  /* Opcode lengths, indexed by opcode - 1.  */
-  const unsigned char *opcode_lengths;
-  /* The number of directory entries.  */
-  size_t dirs_count;
-  /* The directory entries.  */
-  const char **dirs;
-  /* The number of filenames.  */
-  size_t filenames_count;
-  /* The filenames.  */
-  const char **filenames;
-};
-
-/* Map a single PC value to a file/line.  We will keep a vector of
-   these sorted by PC value.  Each file/line will be correct from the
-   PC up to the PC of the next entry if there is one.  We allocate one
-   extra entry at the end so that we can use bsearch.  */
-
-struct line
-{
-  /* PC.  */
-  uintptr_t pc;
-  /* File name.  Many entries in the array are expected to point to
-     the same file name.  */
-  const char *filename;
-  /* Line number.  */
-  int lineno;
-};
-
-/* A growable vector of line number information.  This is used while
-   reading the line numbers.  */
-
-struct line_vector
-{
-  /* Memory.  This is an array of struct line.  */
-  struct backtrace_vector vec;
-  /* Number of valid mappings.  */
-  size_t count;
-};
-
-/* A function described in the debug info.  */
-
-struct function
-{
-  /* The name of the function.  */
-  const char *name;
-  /* If this is an inlined function, the filename of the call
-     site.  */
-  const char *caller_filename;
-  /* If this is an inlined function, the line number of the call
-     site.  */
-  int caller_lineno;
-  /* Map PC ranges to inlined functions.  */
-  struct function_addrs *function_addrs;
-  size_t function_addrs_count;
-};
-
-/* An address range for a function.  This maps a PC value to a
-   specific function.  */
-
-struct function_addrs
-{
-  /* Range is LOW <= PC < HIGH.  */
-  uint64_t low;
-  uint64_t high;
-  /* Function for this address range.  */
-  struct function *function;
-};
-
-/* A growable vector of function address ranges.  */
-
-struct function_vector
-{
-  /* Memory.  This is an array of struct function_addrs.  */
-  struct backtrace_vector vec;
-  /* Number of address ranges present.  */
-  size_t count;
-};
-
-/* A DWARF compilation unit.  This only holds the information we need
-   to map a PC to a file and line.  */
-
-struct unit
-{
-  /* The first entry for this compilation unit.  */
-  const unsigned char *unit_data;
-  /* The length of the data for this compilation unit.  */
-  size_t unit_data_len;
-  /* The offset of UNIT_DATA from the start of the information for
-     this compilation unit.  */
-  size_t unit_data_offset;
-  /* DWARF version.  */
-  int version;
-  /* Whether unit is DWARF64.  */
-  int is_dwarf64;
-  /* Address size.  */
-  int addrsize;
-  /* Offset into line number information.  */
-  off_t lineoff;
-  /* Primary source file.  */
-  const char *filename;
-  /* Compilation command working directory.  */
-  const char *comp_dir;
-  /* Absolute file name, only set if needed.  */
-  const char *abs_filename;
-  /* The abbreviations for this unit.  */
-  struct abbrevs abbrevs;
-
-  /* The fields above this point are read in during initialization and
-     may be accessed freely.  The fields below this point are read in
-     as needed, and therefore require care, as different threads may
-     try to initialize them simultaneously.  */
-
-  /* PC to line number mapping.  This is NULL if the values have not
-     been read.  This is (struct line *) -1 if there was an error
-     reading the values.  */
-  struct line *lines;
-  /* Number of entries in lines.  */
-  size_t lines_count;
-  /* PC ranges to function.  */
-  struct function_addrs *function_addrs;
-  size_t function_addrs_count;
-};
-
-/* An address range for a compilation unit.  This maps a PC value to a
-   specific compilation unit.  Note that we invert the representation
-   in DWARF: instead of listing the units and attaching a list of
-   ranges, we list the ranges and have each one point to the unit.
-   This lets us do a binary search to find the unit.  */
-
-struct unit_addrs
-{
-  /* Range is LOW <= PC < HIGH.  */
-  uint64_t low;
-  uint64_t high;
-  /* Compilation unit for this address range.  */
-  struct unit *u;
-};
-
-/* A growable vector of compilation unit address ranges.  */
-
-struct unit_addrs_vector
-{
-  /* Memory.  This is an array of struct unit_addrs.  */
-  struct backtrace_vector vec;
-  /* Number of address ranges present.  */
-  size_t count;
-};
-
-/* The information we need to map a PC to a file and line.  */
-
-struct dwarf_data
-{
-  /* The data for the next file we know about.  */
-  struct dwarf_data *next;
-  /* The base address for this file.  */
-  uintptr_t base_address;
-  /* A sorted list of address ranges.  */
-  struct unit_addrs *addrs;
-  /* Number of address ranges in list.  */
-  size_t addrs_count;
-  /* The unparsed .debug_info section.  */
-  const unsigned char *dwarf_info;
-  size_t dwarf_info_size;
-  /* The unparsed .debug_line section.  */
-  const unsigned char *dwarf_line;
-  size_t dwarf_line_size;
-  /* The unparsed .debug_ranges section.  */
-  const unsigned char *dwarf_ranges;
-  size_t dwarf_ranges_size;
-  /* The unparsed .debug_str section.  */
-  const unsigned char *dwarf_str;
-  size_t dwarf_str_size;
-  /* Whether the data is big-endian or not.  */
-  int is_bigendian;
-  /* A vector used for function addresses.  We keep this here so that
-     we can grow the vector as we read more functions.  */
-  struct function_vector fvec;
-};
-
-/* Report an error for a DWARF buffer.  */
-
-static void
-dwarf_buf_error (struct dwarf_buf *buf, const char *msg)
-{
-  char b[200];
-
-  snprintf (b, sizeof b, "%s in %s at %d",
-	    msg, buf->name, (int) (buf->buf - buf->start));
-  buf->error_callback (buf->data, b, 0);
-}
-
-/* Require at least COUNT bytes in BUF.  Return 1 if all is well, 0 on
-   error.  */
-
-static int
-require (struct dwarf_buf *buf, size_t count)
-{
-  if (buf->left >= count)
-    return 1;
-
-  if (!buf->reported_underflow)
-    {
-      dwarf_buf_error (buf, "DWARF underflow");
-      buf->reported_underflow = 1;
-    }
-
-  return 0;
-}
-
-/* Advance COUNT bytes in BUF.  Return 1 if all is well, 0 on
-   error.  */
-
-static int
-advance (struct dwarf_buf *buf, size_t count)
-{
-  if (!require (buf, count))
-    return 0;
-  buf->buf += count;
-  buf->left -= count;
-  return 1;
-}
-
-/* Read one byte from BUF and advance 1 byte.  */
-
-static unsigned char
-read_byte (struct dwarf_buf *buf)
-{
-  const unsigned char *p = buf->buf;
-
-  if (!advance (buf, 1))
-    return 0;
-  return p[0];
-}
-
-/* Read a signed char from BUF and advance 1 byte.  */
-
-static signed char
-read_sbyte (struct dwarf_buf *buf)
-{
-  const unsigned char *p = buf->buf;
-
-  if (!advance (buf, 1))
-    return 0;
-  return (*p ^ 0x80) - 0x80;
-}
-
-/* Read a uint16 from BUF and advance 2 bytes.  */
-
-static uint16_t
-read_uint16 (struct dwarf_buf *buf)
-{
-  const unsigned char *p = buf->buf;
-
-  if (!advance (buf, 2))
-    return 0;
-  if (buf->is_bigendian)
-    return ((uint16_t) p[0] << 8) | (uint16_t) p[1];
-  else
-    return ((uint16_t) p[1] << 8) | (uint16_t) p[0];
-}
-
-/* Read a uint32 from BUF and advance 4 bytes.  */
-
-static uint32_t
-read_uint32 (struct dwarf_buf *buf)
-{
-  const unsigned char *p = buf->buf;
-
-  if (!advance (buf, 4))
-    return 0;
-  if (buf->is_bigendian)
-    return (((uint32_t) p[0] << 24) | ((uint32_t) p[1] << 16)
-	    | ((uint32_t) p[2] << 8) | (uint32_t) p[3]);
-  else
-    return (((uint32_t) p[3] << 24) | ((uint32_t) p[2] << 16)
-	    | ((uint32_t) p[1] << 8) | (uint32_t) p[0]);
-}
-
-/* Read a uint64 from BUF and advance 8 bytes.  */
-
-static uint64_t
-read_uint64 (struct dwarf_buf *buf)
-{
-  const unsigned char *p = buf->buf;
-
-  if (!advance (buf, 8))
-    return 0;
-  if (buf->is_bigendian)
-    return (((uint64_t) p[0] << 56) | ((uint64_t) p[1] << 48)
-	    | ((uint64_t) p[2] << 40) | ((uint64_t) p[3] << 32)
-	    | ((uint64_t) p[4] << 24) | ((uint64_t) p[5] << 16)
-	    | ((uint64_t) p[6] << 8) | (uint64_t) p[7]);
-  else
-    return (((uint64_t) p[7] << 56) | ((uint64_t) p[6] << 48)
-	    | ((uint64_t) p[5] << 40) | ((uint64_t) p[4] << 32)
-	    | ((uint64_t) p[3] << 24) | ((uint64_t) p[2] << 16)
-	    | ((uint64_t) p[1] << 8) | (uint64_t) p[0]);
-}
-
-/* Read an offset from BUF and advance the appropriate number of
-   bytes.  */
-
-static uint64_t
-read_offset (struct dwarf_buf *buf, int is_dwarf64)
-{
-  if (is_dwarf64)
-    return read_uint64 (buf);
-  else
-    return read_uint32 (buf);
-}
-
-/* Read an address from BUF and advance the appropriate number of
-   bytes.  */
-
-static uint64_t
-read_address (struct dwarf_buf *buf, int addrsize)
-{
-  switch (addrsize)
-    {
-    case 1:
-      return read_byte (buf);
-    case 2:
-      return read_uint16 (buf);
-    case 4:
-      return read_uint32 (buf);
-    case 8:
-      return read_uint64 (buf);
-    default:
-      dwarf_buf_error (buf, "unrecognized address size");
-      return 0;
-    }
-}
-
-/* Return whether a value is the highest possible address, given the
-   address size.  */
-
-static int
-is_highest_address (uint64_t address, int addrsize)
-{
-  switch (addrsize)
-    {
-    case 1:
-      return address == (unsigned char) -1;
-    case 2:
-      return address == (uint16_t) -1;
-    case 4:
-      return address == (uint32_t) -1;
-    case 8:
-      return address == (uint64_t) -1;
-    default:
-      return 0;
-    }
-}
-
-/* Read an unsigned LEB128 number.  */
-
-static uint64_t
-read_uleb128 (struct dwarf_buf *buf)
-{
-  uint64_t ret;
-  unsigned int shift;
-  int overflow;
-  unsigned char b;
-
-  ret = 0;
-  shift = 0;
-  overflow = 0;
-  do
-    {
-      const unsigned char *p;
-
-      p = buf->buf;
-      if (!advance (buf, 1))
-	return 0;
-      b = *p;
-      if (shift < 64)
-	ret |= ((uint64_t) (b & 0x7f)) << shift;
-      else if (!overflow)
-	{
-	  dwarf_buf_error (buf, "LEB128 overflows uint64_t");
-	  overflow = 1;
-	}
-      shift += 7;
-    }
-  while ((b & 0x80) != 0);
-
-  return ret;
-}
-
-/* Read a signed LEB128 number.  */
-
-static int64_t
-read_sleb128 (struct dwarf_buf *buf)
-{
-  uint64_t val;
-  unsigned int shift;
-  int overflow;
-  unsigned char b;
-
-  val = 0;
-  shift = 0;
-  overflow = 0;
-  do
-    {
-      const unsigned char *p;
-
-      p = buf->buf;
-      if (!advance (buf, 1))
-	return 0;
-      b = *p;
-      if (shift < 64)
-	val |= ((uint64_t) (b & 0x7f)) << shift;
-      else if (!overflow)
-	{
-	  dwarf_buf_error (buf, "signed LEB128 overflows uint64_t");
-	  overflow = 1;
-	}
-      shift += 7;
-    }
-  while ((b & 0x80) != 0);
-
-  if ((b & 0x40) != 0 && shift < 64)
-    val |= ((uint64_t) -1) << shift;
-
-  return (int64_t) val;
-}
-
-/* Return the length of an LEB128 number.  */
-
-static size_t
-leb128_len (const unsigned char *p)
-{
-  size_t ret;
-
-  ret = 1;
-  while ((*p & 0x80) != 0)
-    {
-      ++p;
-      ++ret;
-    }
-  return ret;
-}
-
-/* Free an abbreviations structure.  */
-
-static void
-free_abbrevs (struct backtrace_state *state, struct abbrevs *abbrevs,
-	      backtrace_error_callback error_callback, void *data)
-{
-  size_t i;
-
-  for (i = 0; i < abbrevs->num_abbrevs; ++i)
-    backtrace_free (state, abbrevs->abbrevs[i].attrs,
-		    abbrevs->abbrevs[i].num_attrs * sizeof (struct attr),
-		    error_callback, data);
-  backtrace_free (state, abbrevs->abbrevs,
-		  abbrevs->num_abbrevs * sizeof (struct abbrev),
-		  error_callback, data);
-  abbrevs->num_abbrevs = 0;
-  abbrevs->abbrevs = NULL;
-}
-
-/* Read an attribute value.  Returns 1 on success, 0 on failure.  If
-   the value can be represented as a uint64_t, sets *VAL and sets
-   *IS_VALID to 1.  We don't try to store the value of other attribute
-   forms, because we don't care about them.  */
-
-static int
-read_attribute (enum dwarf_form form, struct dwarf_buf *buf,
-		int is_dwarf64, int version, int addrsize,
-		const unsigned char *dwarf_str, size_t dwarf_str_size,
-		struct attr_val *val)
-{
-  /* Avoid warnings about val.u.FIELD may be used uninitialized if
-     this function is inlined.  The warnings aren't valid but can
-     occur because the different fields are set and used
-     conditionally.  */
-  memset (val, 0, sizeof *val);
-
-  switch (form)
-    {
-    case DW_FORM_addr:
-      val->encoding = ATTR_VAL_ADDRESS;
-      val->u.uint = read_address (buf, addrsize);
-      return 1;
-    case DW_FORM_block2:
-      val->encoding = ATTR_VAL_BLOCK;
-      return advance (buf, read_uint16 (buf));
-    case DW_FORM_block4:
-      val->encoding = ATTR_VAL_BLOCK;
-      return advance (buf, read_uint32 (buf));
-    case DW_FORM_data2:
-      val->encoding = ATTR_VAL_UINT;
-      val->u.uint = read_uint16 (buf);
-      return 1;
-    case DW_FORM_data4:
-      val->encoding = ATTR_VAL_UINT;
-      val->u.uint = read_uint32 (buf);
-      return 1;
-    case DW_FORM_data8:
-      val->encoding = ATTR_VAL_UINT;
-      val->u.uint = read_uint64 (buf);
-      return 1;
-    case DW_FORM_string:
-      val->encoding = ATTR_VAL_STRING;
-      val->u.string = (const char *) buf->buf;
-      return advance (buf, strnlen ((const char *) buf->buf, buf->left) + 1);
-    case DW_FORM_block:
-      val->encoding = ATTR_VAL_BLOCK;
-      return advance (buf, read_uleb128 (buf));
-    case DW_FORM_block1:
-      val->encoding = ATTR_VAL_BLOCK;
-      return advance (buf, read_byte (buf));
-    case DW_FORM_data1:
-      val->encoding = ATTR_VAL_UINT;
-      val->u.uint = read_byte (buf);
-      return 1;
-    case DW_FORM_flag:
-      val->encoding = ATTR_VAL_UINT;
-      val->u.uint = read_byte (buf);
-      return 1;
-    case DW_FORM_sdata:
-      val->encoding = ATTR_VAL_SINT;
-      val->u.sint = read_sleb128 (buf);
-      return 1;
-    case DW_FORM_strp:
-      {
-	uint64_t offset;
-
-	offset = read_offset (buf, is_dwarf64);
-	if (offset >= dwarf_str_size)
-	  {
-	    dwarf_buf_error (buf, "DW_FORM_strp out of range");
-	    return 0;
-	  }
-	val->encoding = ATTR_VAL_STRING;
-	val->u.string = (const char *) dwarf_str + offset;
-	return 1;
-      }
-    case DW_FORM_udata:
-      val->encoding = ATTR_VAL_UINT;
-      val->u.uint = read_uleb128 (buf);
-      return 1;
-    case DW_FORM_ref_addr:
-      val->encoding = ATTR_VAL_REF_INFO;
-      if (version == 2)
-	val->u.uint = read_address (buf, addrsize);
-      else
-	val->u.uint = read_offset (buf, is_dwarf64);
-      return 1;
-    case DW_FORM_ref1:
-      val->encoding = ATTR_VAL_REF_UNIT;
-      val->u.uint = read_byte (buf);
-      return 1;
-    case DW_FORM_ref2:
-      val->encoding = ATTR_VAL_REF_UNIT;
-      val->u.uint = read_uint16 (buf);
-      return 1;
-    case DW_FORM_ref4:
-      val->encoding = ATTR_VAL_REF_UNIT;
-      val->u.uint = read_uint32 (buf);
-      return 1;
-    case DW_FORM_ref8:
-      val->encoding = ATTR_VAL_REF_UNIT;
-      val->u.uint = read_uint64 (buf);
-      return 1;
-    case DW_FORM_ref_udata:
-      val->encoding = ATTR_VAL_REF_UNIT;
-      val->u.uint = read_uleb128 (buf);
-      return 1;
-    case DW_FORM_indirect:
-      {
-	uint64_t form;
-
-	form = read_uleb128 (buf);
-	return read_attribute ((enum dwarf_form) form, buf, is_dwarf64,
-			       version, addrsize, dwarf_str, dwarf_str_size,
-			       val);
-      }
-    case DW_FORM_sec_offset:
-      val->encoding = ATTR_VAL_REF_SECTION;
-      val->u.uint = read_offset (buf, is_dwarf64);
-      return 1;
-    case DW_FORM_exprloc:
-      val->encoding = ATTR_VAL_EXPR;
-      return advance (buf, read_uleb128 (buf));
-    case DW_FORM_flag_present:
-      val->encoding = ATTR_VAL_UINT;
-      val->u.uint = 1;
-      return 1;
-    case DW_FORM_ref_sig8:
-      val->encoding = ATTR_VAL_REF_TYPE;
-      val->u.uint = read_uint64 (buf);
-      return 1;
-    case DW_FORM_GNU_addr_index:
-      val->encoding = ATTR_VAL_REF_SECTION;
-      val->u.uint = read_uleb128 (buf);
-      return 1;
-    case DW_FORM_GNU_str_index:
-      val->encoding = ATTR_VAL_REF_SECTION;
-      val->u.uint = read_uleb128 (buf);
-      return 1;
-    case DW_FORM_GNU_ref_alt:
-      val->encoding = ATTR_VAL_REF_SECTION;
-      val->u.uint = read_offset (buf, is_dwarf64);
-      return 1;
-    case DW_FORM_GNU_strp_alt:
-      val->encoding = ATTR_VAL_REF_SECTION;
-      val->u.uint = read_offset (buf, is_dwarf64);
-      return 1;
-    default:
-      dwarf_buf_error (buf, "unrecognized DWARF form");
-      return 0;
-    }
-}
-
-/* Compare function_addrs for qsort.  When ranges are nested, make the
-   smallest one sort last.  */
-
-static int
-function_addrs_compare (const void *v1, const void *v2)
-{
-  const struct function_addrs *a1 = (const struct function_addrs *) v1;
-  const struct function_addrs *a2 = (const struct function_addrs *) v2;
-
-  if (a1->low < a2->low)
-    return -1;
-  if (a1->low > a2->low)
-    return 1;
-  if (a1->high < a2->high)
-    return 1;
-  if (a1->high > a2->high)
-    return -1;
-  return strcmp (a1->function->name, a2->function->name);
-}
-
-/* Compare a PC against a function_addrs for bsearch.  Note that if
-   there are multiple ranges containing PC, which one will be returned
-   is unpredictable.  We compensate for that in dwarf_fileline.  */
-
-static int
-function_addrs_search (const void *vkey, const void *ventry)
-{
-  const uintptr_t *key = (const uintptr_t *) vkey;
-  const struct function_addrs *entry = (const struct function_addrs *) ventry;
-  uintptr_t pc;
-
-  pc = *key;
-  if (pc < entry->low)
-    return -1;
-  else if (pc >= entry->high)
-    return 1;
-  else
-    return 0;
-}
-
-/* Add a new compilation unit address range to a vector.  Returns 1 on
-   success, 0 on failure.  */
-
-static int
-add_unit_addr (struct backtrace_state *state, uintptr_t base_address,
-	       struct unit_addrs addrs,
-	       backtrace_error_callback error_callback, void *data,
-	       struct unit_addrs_vector *vec)
-{
-  struct unit_addrs *p;
-
-  /* Add in the base address of the module here, so that we can look
-     up the PC directly.  */
-  addrs.low += base_address;
-  addrs.high += base_address;
-
-  /* Try to merge with the last entry.  */
-  if (vec->count > 0)
-    {
-      p = (struct unit_addrs *) vec->vec.base + (vec->count - 1);
-      if ((addrs.low == p->high || addrs.low == p->high + 1)
-	  && addrs.u == p->u)
-	{
-	  if (addrs.high > p->high)
-	    p->high = addrs.high;
-	  return 1;
-	}
-    }
-
-  p = ((struct unit_addrs *)
-       backtrace_vector_grow (state, sizeof (struct unit_addrs),
-			      error_callback, data, &vec->vec));
-  if (p == NULL)
-    return 0;
-
-  *p = addrs;
-  ++vec->count;
-  return 1;
-}
-
-/* Free a unit address vector.  */
-
-static void
-free_unit_addrs_vector (struct backtrace_state *state,
-			struct unit_addrs_vector *vec,
-			backtrace_error_callback error_callback, void *data)
-{
-  struct unit_addrs *addrs;
-  size_t i;
-
-  addrs = (struct unit_addrs *) vec->vec.base;
-  for (i = 0; i < vec->count; ++i)
-    free_abbrevs (state, &addrs[i].u->abbrevs, error_callback, data);
-}
-
-/* Compare unit_addrs for qsort.  When ranges are nested, make the
-   smallest one sort last.  */
-
-static int
-unit_addrs_compare (const void *v1, const void *v2)
-{
-  const struct unit_addrs *a1 = (const struct unit_addrs *) v1;
-  const struct unit_addrs *a2 = (const struct unit_addrs *) v2;
-
-  if (a1->low < a2->low)
-    return -1;
-  if (a1->low > a2->low)
-    return 1;
-  if (a1->high < a2->high)
-    return 1;
-  if (a1->high > a2->high)
-    return -1;
-  if (a1->u->lineoff < a2->u->lineoff)
-    return -1;
-  if (a1->u->lineoff > a2->u->lineoff)
-    return 1;
-  return 0;
-}
-
-/* Compare a PC against a unit_addrs for bsearch.  Note that if there
-   are multiple ranges containing PC, which one will be returned is
-   unpredictable.  We compensate for that in dwarf_fileline.  */
-
-static int
-unit_addrs_search (const void *vkey, const void *ventry)
-{
-  const uintptr_t *key = (const uintptr_t *) vkey;
-  const struct unit_addrs *entry = (const struct unit_addrs *) ventry;
-  uintptr_t pc;
-
-  pc = *key;
-  if (pc < entry->low)
-    return -1;
-  else if (pc >= entry->high)
-    return 1;
-  else
-    return 0;
-}
-
-/* Sort the line vector by PC.  We want a stable sort here.  We know
-   that the pointers are into the same array, so it is safe to compare
-   them directly.  */
-
-static int
-line_compare (const void *v1, const void *v2)
-{
-  const struct line *ln1 = (const struct line *) v1;
-  const struct line *ln2 = (const struct line *) v2;
-
-  if (ln1->pc < ln2->pc)
-    return -1;
-  else if (ln1->pc > ln2->pc)
-    return 1;
-  else if (ln1 < ln2)
-    return -1;
-  else if (ln1 > ln2)
-    return 1;
-  else
-    return 0;
-}
-
-/* Find a PC in a line vector.  We always allocate an extra entry at
-   the end of the lines vector, so that this routine can safely look
-   at the next entry.  Note that when there are multiple mappings for
-   the same PC value, this will return the last one.  */
-
-static int
-line_search (const void *vkey, const void *ventry)
-{
-  const uintptr_t *key = (const uintptr_t *) vkey;
-  const struct line *entry = (const struct line *) ventry;
-  uintptr_t pc;
-
-  pc = *key;
-  if (pc < entry->pc)
-    return -1;
-  else if (pc >= (entry + 1)->pc)
-    return 1;
-  else
-    return 0;
-}
-
-/* Sort the abbrevs by the abbrev code.  This function is passed to
-   both qsort and bsearch.  */
-
-static int
-abbrev_compare (const void *v1, const void *v2)
-{
-  const struct abbrev *a1 = (const struct abbrev *) v1;
-  const struct abbrev *a2 = (const struct abbrev *) v2;
-
-  if (a1->code < a2->code)
-    return -1;
-  else if (a1->code > a2->code)
-    return 1;
-  else
-    {
-      /* This really shouldn't happen.  It means there are two
-	 different abbrevs with the same code, and that means we don't
-	 know which one lookup_abbrev should return.  */
-      return 0;
-    }
-}
-
-/* Read the abbreviation table for a compilation unit.  Returns 1 on
-   success, 0 on failure.  */
-
-static int
-read_abbrevs (struct backtrace_state *state, uint64_t abbrev_offset,
-	      const unsigned char *dwarf_abbrev, size_t dwarf_abbrev_size,
-	      int is_bigendian, backtrace_error_callback error_callback,
-	      void *data, struct abbrevs *abbrevs)
-{
-  struct dwarf_buf abbrev_buf;
-  struct dwarf_buf count_buf;
-  size_t num_abbrevs;
-
-  abbrevs->num_abbrevs = 0;
-  abbrevs->abbrevs = NULL;
-
-  if (abbrev_offset >= dwarf_abbrev_size)
-    {
-      error_callback (data, "abbrev offset out of range", 0);
-      return 0;
-    }
-
-  abbrev_buf.name = ".debug_abbrev";
-  abbrev_buf.start = dwarf_abbrev;
-  abbrev_buf.buf = dwarf_abbrev + abbrev_offset;
-  abbrev_buf.left = dwarf_abbrev_size - abbrev_offset;
-  abbrev_buf.is_bigendian = is_bigendian;
-  abbrev_buf.error_callback = error_callback;
-  abbrev_buf.data = data;
-  abbrev_buf.reported_underflow = 0;
-
-  /* Count the number of abbrevs in this list.  */
-
-  count_buf = abbrev_buf;
-  num_abbrevs = 0;
-  while (read_uleb128 (&count_buf) != 0)
-    {
-      if (count_buf.reported_underflow)
-	return 0;
-      ++num_abbrevs;
-      // Skip tag.
-      read_uleb128 (&count_buf);
-      // Skip has_children.
-      read_byte (&count_buf);
-      // Skip attributes.
-      while (read_uleb128 (&count_buf) != 0)
-	read_uleb128 (&count_buf);
-      // Skip form of last attribute.
-      read_uleb128 (&count_buf);
-    }
-
-  if (count_buf.reported_underflow)
-    return 0;
-
-  if (num_abbrevs == 0)
-    return 1;
-
-  abbrevs->num_abbrevs = num_abbrevs;
-  abbrevs->abbrevs = ((struct abbrev *)
-		      backtrace_alloc (state,
-				       num_abbrevs * sizeof (struct abbrev),
-				       error_callback, data));
-  if (abbrevs->abbrevs == NULL)
-    return 0;
-  memset (abbrevs->abbrevs, 0, num_abbrevs * sizeof (struct abbrev));
-
-  num_abbrevs = 0;
-  while (1)
-    {
-      uint64_t code;
-      struct abbrev a;
-      size_t num_attrs;
-      struct attr *attrs;
-
-      if (abbrev_buf.reported_underflow)
-	goto fail;
-
-      code = read_uleb128 (&abbrev_buf);
-      if (code == 0)
-	break;
-
-      a.code = code;
-      a.tag = (enum dwarf_tag) read_uleb128 (&abbrev_buf);
-      a.has_children = read_byte (&abbrev_buf);
-
-      count_buf = abbrev_buf;
-      num_attrs = 0;
-      while (read_uleb128 (&count_buf) != 0)
-	{
-	  ++num_attrs;
-	  read_uleb128 (&count_buf);
-	}
-
-      if (num_attrs == 0)
-	{
-	  attrs = NULL;
-	  read_uleb128 (&abbrev_buf);
-	  read_uleb128 (&abbrev_buf);
-	}
-      else
-	{
-	  attrs = ((struct attr *)
-		   backtrace_alloc (state, num_attrs * sizeof *attrs,
-				    error_callback, data));
-	  if (attrs == NULL)
-	    goto fail;
-	  num_attrs = 0;
-	  while (1)
-	    {
-	      uint64_t name;
-	      uint64_t form;
-
-	      name = read_uleb128 (&abbrev_buf);
-	      form = read_uleb128 (&abbrev_buf);
-	      if (name == 0)
-		break;
-	      attrs[num_attrs].name = (enum dwarf_attribute) name;
-	      attrs[num_attrs].form = (enum dwarf_form) form;
-	      ++num_attrs;
-	    }
-	}
-
-      a.num_attrs = num_attrs;
-      a.attrs = attrs;
-
-      abbrevs->abbrevs[num_abbrevs] = a;
-      ++num_abbrevs;
-    }
-
-  backtrace_qsort (abbrevs->abbrevs, abbrevs->num_abbrevs,
-		   sizeof (struct abbrev), abbrev_compare);
-
-  return 1;
-
- fail:
-  free_abbrevs (state, abbrevs, error_callback, data);
-  return 0;
-}
-
-/* Return the abbrev information for an abbrev code.  */
-
-static const struct abbrev *
-lookup_abbrev (struct abbrevs *abbrevs, uint64_t code,
-	       backtrace_error_callback error_callback, void *data)
-{
-  struct abbrev key;
-  void *p;
-
-  /* With GCC, where abbrevs are simply numbered in order, we should
-     be able to just look up the entry.  */
-  if (code - 1 < abbrevs->num_abbrevs
-      && abbrevs->abbrevs[code - 1].code == code)
-    return &abbrevs->abbrevs[code - 1];
-
-  /* Otherwise we have to search.  */
-  memset (&key, 0, sizeof key);
-  key.code = code;
-  p = bsearch (&key, abbrevs->abbrevs, abbrevs->num_abbrevs,
-	       sizeof (struct abbrev), abbrev_compare);
-  if (p == NULL)
-    {
-      error_callback (data, "invalid abbreviation code", 0);
-      return NULL;
-    }
-  return (const struct abbrev *) p;
-}
-
-/* Add non-contiguous address ranges for a compilation unit.  Returns
-   1 on success, 0 on failure.  */
-
-static int
-add_unit_ranges (struct backtrace_state *state, uintptr_t base_address,
-		 struct unit *u, uint64_t ranges, uint64_t base,
-		 int is_bigendian, const unsigned char *dwarf_ranges,
-		 size_t dwarf_ranges_size,
-		 backtrace_error_callback error_callback, void *data,
-		 struct unit_addrs_vector *addrs)
-{
-  struct dwarf_buf ranges_buf;
-
-  if (ranges >= dwarf_ranges_size)
-    {
-      error_callback (data, "ranges offset out of range", 0);
-      return 0;
-    }
-
-  ranges_buf.name = ".debug_ranges";
-  ranges_buf.start = dwarf_ranges;
-  ranges_buf.buf = dwarf_ranges + ranges;
-  ranges_buf.left = dwarf_ranges_size - ranges;
-  ranges_buf.is_bigendian = is_bigendian;
-  ranges_buf.error_callback = error_callback;
-  ranges_buf.data = data;
-  ranges_buf.reported_underflow = 0;
-
-  while (1)
-    {
-      uint64_t low;
-      uint64_t high;
-
-      if (ranges_buf.reported_underflow)
-	return 0;
-
-      low = read_address (&ranges_buf, u->addrsize);
-      high = read_address (&ranges_buf, u->addrsize);
-
-      if (low == 0 && high == 0)
-	break;
-
-      if (is_highest_address (low, u->addrsize))
-	base = high;
-      else
-	{
-	  struct unit_addrs a;
-
-	  a.low = low + base;
-	  a.high = high + base;
-	  a.u = u;
-	  if (!add_unit_addr (state, base_address, a, error_callback, data,
-			      addrs))
-	    return 0;
-	}
-    }
-
-  if (ranges_buf.reported_underflow)
-    return 0;
-
-  return 1;
-}
-
-/* Find the address range covered by a compilation unit, reading from
-   UNIT_BUF and adding values to U.  Returns 1 if all data could be
-   read, 0 if there is some error.  */
-
-static int
-find_address_ranges (struct backtrace_state *state, uintptr_t base_address,
-		     struct dwarf_buf *unit_buf, 
-		     const unsigned char *dwarf_str, size_t dwarf_str_size,
-		     const unsigned char *dwarf_ranges,
-		     size_t dwarf_ranges_size,
-		     int is_bigendian, backtrace_error_callback error_callback,
-		     void *data, struct unit *u,
-		     struct unit_addrs_vector *addrs)
-{
-  while (unit_buf->left > 0)
-    {
-      uint64_t code;
-      const struct abbrev *abbrev;
-      uint64_t lowpc;
-      int have_lowpc;
-      uint64_t highpc;
-      int have_highpc;
-      int highpc_is_relative;
-      uint64_t ranges;
-      int have_ranges;
-      size_t i;
-
-      code = read_uleb128 (unit_buf);
-      if (code == 0)
-	return 1;
-
-      abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
-      if (abbrev == NULL)
-	return 0;
-
-      lowpc = 0;
-      have_lowpc = 0;
-      highpc = 0;
-      have_highpc = 0;
-      highpc_is_relative = 0;
-      ranges = 0;
-      have_ranges = 0;
-      for (i = 0; i < abbrev->num_attrs; ++i)
-	{
-	  struct attr_val val;
-
-	  if (!read_attribute (abbrev->attrs[i].form, unit_buf,
-			       u->is_dwarf64, u->version, u->addrsize,
-			       dwarf_str, dwarf_str_size, &val))
-	    return 0;
-
-	  switch (abbrev->attrs[i].name)
-	    {
-	    case DW_AT_low_pc:
-	      if (val.encoding == ATTR_VAL_ADDRESS)
-		{
-		  lowpc = val.u.uint;
-		  have_lowpc = 1;
-		}
-	      break;
-
-	    case DW_AT_high_pc:
-	      if (val.encoding == ATTR_VAL_ADDRESS)
-		{
-		  highpc = val.u.uint;
-		  have_highpc = 1;
-		}
-	      else if (val.encoding == ATTR_VAL_UINT)
-		{
-		  highpc = val.u.uint;
-		  have_highpc = 1;
-		  highpc_is_relative = 1;
-		}
-	      break;
-
-	    case DW_AT_ranges:
-	      if (val.encoding == ATTR_VAL_UINT
-		  || val.encoding == ATTR_VAL_REF_SECTION)
-		{
-		  ranges = val.u.uint;
-		  have_ranges = 1;
-		}
-	      break;
-
-	    case DW_AT_stmt_list:
-	      if (abbrev->tag == DW_TAG_compile_unit
-		  && (val.encoding == ATTR_VAL_UINT
-		      || val.encoding == ATTR_VAL_REF_SECTION))
-		u->lineoff = val.u.uint;
-	      break;
-
-	    case DW_AT_name:
-	      if (abbrev->tag == DW_TAG_compile_unit
-		  && val.encoding == ATTR_VAL_STRING)
-		u->filename = val.u.string;
-	      break;
-
-	    case DW_AT_comp_dir:
-	      if (abbrev->tag == DW_TAG_compile_unit
-		  && val.encoding == ATTR_VAL_STRING)
-		u->comp_dir = val.u.string;
-	      break;
-
-	    default:
-	      break;
-	    }
-	}
-
-      if (abbrev->tag == DW_TAG_compile_unit
-	  || abbrev->tag == DW_TAG_subprogram)
-	{
-	  if (have_ranges)
-	    {
-	      if (!add_unit_ranges (state, base_address, u, ranges, lowpc,
-				    is_bigendian, dwarf_ranges,
-				    dwarf_ranges_size, error_callback,
-				    data, addrs))
-		return 0;
-	    }
-	  else if (have_lowpc && have_highpc)
-	    {
-	      struct unit_addrs a;
-
-	      if (highpc_is_relative)
-		highpc += lowpc;
-	      a.low = lowpc;
-	      a.high = highpc;
-	      a.u = u;
-
-	      if (!add_unit_addr (state, base_address, a, error_callback, data,
-				  addrs))
-		return 0;
-	    }
-
-	  /* If we found the PC range in the DW_TAG_compile_unit, we
-	     can stop now.  */
-	  if (abbrev->tag == DW_TAG_compile_unit
-	      && (have_ranges || (have_lowpc && have_highpc)))
-	    return 1;
-	}
-
-      if (abbrev->has_children)
-	{
-	  if (!find_address_ranges (state, base_address, unit_buf,
-				    dwarf_str, dwarf_str_size,
-				    dwarf_ranges, dwarf_ranges_size,
-				    is_bigendian, error_callback, data,
-				    u, addrs))
-	    return 0;
-	}
-    }
-
-  return 1;
-}
-
-/* Build a mapping from address ranges to the compilation units where
-   the line number information for that range can be found.  Returns 1
-   on success, 0 on failure.  */
-
-static int
-build_address_map (struct backtrace_state *state, uintptr_t base_address,
-		   const unsigned char *dwarf_info, size_t dwarf_info_size,
-		   const unsigned char *dwarf_abbrev, size_t dwarf_abbrev_size,
-		   const unsigned char *dwarf_ranges, size_t dwarf_ranges_size,
-		   const unsigned char *dwarf_str, size_t dwarf_str_size,
-		   int is_bigendian, backtrace_error_callback error_callback,
-		   void *data, struct unit_addrs_vector *addrs)
-{
-  struct dwarf_buf info;
-  struct abbrevs abbrevs;
-
-  memset (&addrs->vec, 0, sizeof addrs->vec);
-  addrs->count = 0;
-
-  /* Read through the .debug_info section.  FIXME: Should we use the
-     .debug_aranges section?  gdb and addr2line don't use it, but I'm
-     not sure why.  */
-
-  info.name = ".debug_info";
-  info.start = dwarf_info;
-  info.buf = dwarf_info;
-  info.left = dwarf_info_size;
-  info.is_bigendian = is_bigendian;
-  info.error_callback = error_callback;
-  info.data = data;
-  info.reported_underflow = 0;
-
-  memset (&abbrevs, 0, sizeof abbrevs);
-  while (info.left > 0)
-    {
-      const unsigned char *unit_data_start;
-      uint64_t len;
-      int is_dwarf64;
-      struct dwarf_buf unit_buf;
-      int version;
-      uint64_t abbrev_offset;
-      int addrsize;
-      struct unit *u;
-
-      if (info.reported_underflow)
-	goto fail;
-
-      unit_data_start = info.buf;
-
-      is_dwarf64 = 0;
-      len = read_uint32 (&info);
-      if (len == 0xffffffff)
-	{
-	  len = read_uint64 (&info);
-	  is_dwarf64 = 1;
-	}
-
-      unit_buf = info;
-      unit_buf.left = len;
-
-      if (!advance (&info, len))
-	goto fail;
-
-      version = read_uint16 (&unit_buf);
-      if (version < 2 || version > 4)
-	{
-	  dwarf_buf_error (&unit_buf, "unrecognized DWARF version");
-	  goto fail;
-	}
-
-      abbrev_offset = read_offset (&unit_buf, is_dwarf64);
-      if (!read_abbrevs (state, abbrev_offset, dwarf_abbrev, dwarf_abbrev_size,
-			 is_bigendian, error_callback, data, &abbrevs))
-	goto fail;
-
-      addrsize = read_byte (&unit_buf);
-
-      u = ((struct unit *)
-	   backtrace_alloc (state, sizeof *u, error_callback, data));
-      if (u == NULL)
-	goto fail;
-      u->unit_data = unit_buf.buf;
-      u->unit_data_len = unit_buf.left;
-      u->unit_data_offset = unit_buf.buf - unit_data_start;
-      u->version = version;
-      u->is_dwarf64 = is_dwarf64;
-      u->addrsize = addrsize;
-      u->filename = NULL;
-      u->comp_dir = NULL;
-      u->abs_filename = NULL;
-      u->lineoff = 0;
-      u->abbrevs = abbrevs;
-      memset (&abbrevs, 0, sizeof abbrevs);
-
-      /* The actual line number mappings will be read as needed.  */
-      u->lines = NULL;
-      u->lines_count = 0;
-      u->function_addrs = NULL;
-      u->function_addrs_count = 0;
-
-      if (!find_address_ranges (state, base_address, &unit_buf,
-				dwarf_str, dwarf_str_size,
-				dwarf_ranges, dwarf_ranges_size,
-				is_bigendian, error_callback, data,
-				u, addrs))
-	{
-	  free_abbrevs (state, &u->abbrevs, error_callback, data);
-	  backtrace_free (state, u, sizeof *u, error_callback, data);
-	  goto fail;
-	}
-
-      if (unit_buf.reported_underflow)
-	{
-	  free_abbrevs (state, &u->abbrevs, error_callback, data);
-	  backtrace_free (state, u, sizeof *u, error_callback, data);
-	  goto fail;
-	}
-    }
-  if (info.reported_underflow)
-    goto fail;
-
-  return 1;
-
- fail:
-  free_abbrevs (state, &abbrevs, error_callback, data);
-  free_unit_addrs_vector (state, addrs, error_callback, data);
-  return 0;
-}
-
-/* Add a new mapping to the vector of line mappings that we are
-   building.  Returns 1 on success, 0 on failure.  */
-
-static int
-add_line (struct backtrace_state *state, struct dwarf_data *ddata,
-	  uintptr_t pc, const char *filename, int lineno,
-	  backtrace_error_callback error_callback, void *data,
-	  struct line_vector *vec)
-{
-  struct line *ln;
-
-  /* If we are adding the same mapping, ignore it.  This can happen
-     when using discriminators.  */
-  if (vec->count > 0)
-    {
-      ln = (struct line *) vec->vec.base + (vec->count - 1);
-      if (pc == ln->pc && filename == ln->filename && lineno == ln->lineno)
-	return 1;
-    }
-
-  ln = ((struct line *)
-	backtrace_vector_grow (state, sizeof (struct line), error_callback,
-			       data, &vec->vec));
-  if (ln == NULL)
-    return 0;
-
-  /* Add in the base address here, so that we can look up the PC
-     directly.  */
-  ln->pc = pc + ddata->base_address;
-
-  ln->filename = filename;
-  ln->lineno = lineno;
-
-  ++vec->count;
-
-  return 1;
-}
-
-/* Free the line header information.  If FREE_FILENAMES is true we
-   free the file names themselves, otherwise we leave them, as there
-   may be line structures pointing to them.  */
-
-static void
-free_line_header (struct backtrace_state *state, struct line_header *hdr,
-		  backtrace_error_callback error_callback, void *data)
-{
-  backtrace_free (state, hdr->dirs, hdr->dirs_count * sizeof (const char *),
-		  error_callback, data);
-  backtrace_free (state, hdr->filenames,
-		  hdr->filenames_count * sizeof (char *),
-		  error_callback, data);
-}
-
-/* Read the line header.  Return 1 on success, 0 on failure.  */
-
-static int
-read_line_header (struct backtrace_state *state, struct unit *u,
-		  int is_dwarf64, struct dwarf_buf *line_buf,
-		  struct line_header *hdr)
-{
-  uint64_t hdrlen;
-  struct dwarf_buf hdr_buf;
-  const unsigned char *p;
-  const unsigned char *pend;
-  size_t i;
-
-  hdr->version = read_uint16 (line_buf);
-  if (hdr->version < 2 || hdr->version > 4)
-    {
-      dwarf_buf_error (line_buf, "unsupported line number version");
-      return 0;
-    }
-
-  hdrlen = read_offset (line_buf, is_dwarf64);
-
-  hdr_buf = *line_buf;
-  hdr_buf.left = hdrlen;
-
-  if (!advance (line_buf, hdrlen))
-    return 0;
-  
-  hdr->min_insn_len = read_byte (&hdr_buf);
-  if (hdr->version < 4)
-    hdr->max_ops_per_insn = 1;
-  else
-    hdr->max_ops_per_insn = read_byte (&hdr_buf);
-
-  /* We don't care about default_is_stmt.  */
-  read_byte (&hdr_buf);
-  
-  hdr->line_base = read_sbyte (&hdr_buf);
-  hdr->line_range = read_byte (&hdr_buf);
-
-  hdr->opcode_base = read_byte (&hdr_buf);
-  hdr->opcode_lengths = hdr_buf.buf;
-  if (!advance (&hdr_buf, hdr->opcode_base - 1))
-    return 0;
-
-  /* Count the number of directory entries.  */
-  hdr->dirs_count = 0;
-  p = hdr_buf.buf;
-  pend = p + hdr_buf.left;
-  while (p < pend && *p != '\0')
-    {
-      p += strnlen((const char *) p, pend - p) + 1;
-      ++hdr->dirs_count;
-    }
-
-  hdr->dirs = ((const char **)
-	       backtrace_alloc (state,
-				hdr->dirs_count * sizeof (const char *),
-				line_buf->error_callback, line_buf->data));
-  if (hdr->dirs == NULL)
-    return 0;
-
-  i = 0;
-  while (*hdr_buf.buf != '\0')
-    {
-      if (hdr_buf.reported_underflow)
-	return 0;
-
-      hdr->dirs[i] = (const char *) hdr_buf.buf;
-      ++i;
-      if (!advance (&hdr_buf,
-		    strnlen ((const char *) hdr_buf.buf, hdr_buf.left) + 1))
-	return 0;
-    }
-  if (!advance (&hdr_buf, 1))
-    return 0;
-
-  /* Count the number of file entries.  */
-  hdr->filenames_count = 0;
-  p = hdr_buf.buf;
-  pend = p + hdr_buf.left;
-  while (p < pend && *p != '\0')
-    {
-      p += strnlen ((const char *) p, pend - p) + 1;
-      p += leb128_len (p);
-      p += leb128_len (p);
-      p += leb128_len (p);
-      ++hdr->filenames_count;
-    }
-
-  hdr->filenames = ((const char **)
-		    backtrace_alloc (state,
-				     hdr->filenames_count * sizeof (char *),
-				     line_buf->error_callback,
-				     line_buf->data));
-  if (hdr->filenames == NULL)
-    return 0;
-  i = 0;
-  while (*hdr_buf.buf != '\0')
-    {
-      const char *filename;
-      uint64_t dir_index;
-
-      if (hdr_buf.reported_underflow)
-	return 0;
-
-      filename = (const char *) hdr_buf.buf;
-      if (!advance (&hdr_buf,
-		    strnlen ((const char *) hdr_buf.buf, hdr_buf.left) + 1))
-	return 0;
-      dir_index = read_uleb128 (&hdr_buf);
-      if (IS_ABSOLUTE_PATH (filename)
-	  || (dir_index == 0 && u->comp_dir == NULL))
-	hdr->filenames[i] = filename;
-      else
-	{
-	  const char *dir;
-	  size_t dir_len;
-	  size_t filename_len;
-	  char *s;
-
-	  if (dir_index == 0)
-	    dir = u->comp_dir;
-	  else if (dir_index - 1 < hdr->dirs_count)
-	    dir = hdr->dirs[dir_index - 1];
-	  else
-	    {
-	      dwarf_buf_error (line_buf,
-			       ("invalid directory index in "
-				"line number program header"));
-	      return 0;
-	    }
-	  dir_len = strlen (dir);
-	  filename_len = strlen (filename);
-	  s = ((char *)
-	       backtrace_alloc (state, dir_len + filename_len + 2,
-				line_buf->error_callback, line_buf->data));
-	  if (s == NULL)
-	    return 0;
-	  memcpy (s, dir, dir_len);
-	  /* FIXME: If we are on a DOS-based file system, and the
-	     directory or the file name use backslashes, then we
-	     should use a backslash here.  */
-	  s[dir_len] = '/';
-	  memcpy (s + dir_len + 1, filename, filename_len + 1);
-	  hdr->filenames[i] = s;
-	}
-
-      /* Ignore the modification time and size.  */
-      read_uleb128 (&hdr_buf);
-      read_uleb128 (&hdr_buf);
-
-      ++i;
-    }
-
-  if (hdr_buf.reported_underflow)
-    return 0;
-
-  return 1;
-}
-
-/* Read the line program, adding line mappings to VEC.  Return 1 on
-   success, 0 on failure.  */
-
-static int
-read_line_program (struct backtrace_state *state, struct dwarf_data *ddata,
-		   struct unit *u, const struct line_header *hdr,
-		   struct dwarf_buf *line_buf, struct line_vector *vec)
-{
-  uint64_t address;
-  unsigned int op_index;
-  const char *reset_filename;
-  const char *filename;
-  int lineno;
-
-  address = 0;
-  op_index = 0;
-  if (hdr->filenames_count > 0)
-    reset_filename = hdr->filenames[0];
-  else
-    reset_filename = "";
-  filename = reset_filename;
-  lineno = 1;
-  while (line_buf->left > 0)
-    {
-      unsigned int op;
-
-      op = read_byte (line_buf);
-      if (op >= hdr->opcode_base)
-	{
-	  unsigned int advance;
-
-	  /* Special opcode.  */
-	  op -= hdr->opcode_base;
-	  advance = op / hdr->line_range;
-	  address += (hdr->min_insn_len * (op_index + advance)
-		      / hdr->max_ops_per_insn);
-	  op_index = (op_index + advance) % hdr->max_ops_per_insn;
-	  lineno += hdr->line_base + (int) (op % hdr->line_range);
-	  add_line (state, ddata, address, filename, lineno,
-		    line_buf->error_callback, line_buf->data, vec);
-	}
-      else if (op == DW_LNS_extended_op)
-	{
-	  uint64_t len;
-
-	  len = read_uleb128 (line_buf);
-	  op = read_byte (line_buf);
-	  switch (op)
-	    {
-	    case DW_LNE_end_sequence:
-	      /* FIXME: Should we mark the high PC here?  It seems
-		 that we already have that information from the
-		 compilation unit.  */
-	      address = 0;
-	      op_index = 0;
-	      filename = reset_filename;
-	      lineno = 1;
-	      break;
-	    case DW_LNE_set_address:
-	      address = read_address (line_buf, u->addrsize);
-	      break;
-	    case DW_LNE_define_file:
-	      {
-		const char *f;
-		unsigned int dir_index;
-
-		f = (const char *) line_buf->buf;
-		if (!advance (line_buf, strnlen (f, line_buf->left) + 1))
-		  return 0;
-		dir_index = read_uleb128 (line_buf);
-		/* Ignore that time and length.  */
-		read_uleb128 (line_buf);
-		read_uleb128 (line_buf);
-		if (IS_ABSOLUTE_PATH (f))
-		  filename = f;
-		else
-		  {
-		    const char *dir;
-		    size_t dir_len;
-		    size_t f_len;
-		    char *p;
-
-		    if (dir_index == 0)
-		      dir = u->comp_dir;
-		    else if (dir_index - 1 < hdr->dirs_count)
-		      dir = hdr->dirs[dir_index - 1];
-		    else
-		      {
-			dwarf_buf_error (line_buf,
-					 ("invalid directory index "
-					  "in line number program"));
-			return 0;
-		      }
-		    dir_len = strlen (dir);
-		    f_len = strlen (f);
-		    p = ((char *)
-			 backtrace_alloc (state, dir_len + f_len + 2,
-					  line_buf->error_callback,
-					  line_buf->data));
-		    if (p == NULL)
-		      return 0;
-		    memcpy (p, dir, dir_len);
-		    /* FIXME: If we are on a DOS-based file system,
-		       and the directory or the file name use
-		       backslashes, then we should use a backslash
-		       here.  */
-		    p[dir_len] = '/';
-		    memcpy (p + dir_len + 1, f, f_len + 1);
-		    filename = p;
-		  }
-	      }
-	      break;
-	    case DW_LNE_set_discriminator:
-	      /* We don't care about discriminators.  */
-	      read_uleb128 (line_buf);
-	      break;
-	    default:
-	      if (!advance (line_buf, len - 1))
-		return 0;
-	      break;
-	    }
-	}
-      else
-	{
-	  switch (op)
-	    {
-	    case DW_LNS_copy:
-	      add_line (state, ddata, address, filename, lineno,
-			line_buf->error_callback, line_buf->data, vec);
-	      break;
-	    case DW_LNS_advance_pc:
-	      {
-		uint64_t advance;
-
-		advance = read_uleb128 (line_buf);
-		address += (hdr->min_insn_len * (op_index + advance)
-			    / hdr->max_ops_per_insn);
-		op_index = (op_index + advance) % hdr->max_ops_per_insn;
-	      }
-	      break;
-	    case DW_LNS_advance_line:
-	      lineno += (int) read_sleb128 (line_buf);
-	      break;
-	    case DW_LNS_set_file:
-	      {
-		uint64_t fileno;
-
-		fileno = read_uleb128 (line_buf);
-		if (fileno == 0)
-		  filename = "";
-		else
-		  {
-		    if (fileno - 1 >= hdr->filenames_count)
-		      {
-			dwarf_buf_error (line_buf,
-					 ("invalid file number in "
-					  "line number program"));
-			return 0;
-		      }
-		    filename = hdr->filenames[fileno - 1];
-		  }
-	      }
-	      break;
-	    case DW_LNS_set_column:
-	      read_uleb128 (line_buf);
-	      break;
-	    case DW_LNS_negate_stmt:
-	      break;
-	    case DW_LNS_set_basic_block:
-	      break;
-	    case DW_LNS_const_add_pc:
-	      {
-		unsigned int advance;
-
-		op = 255 - hdr->opcode_base;
-		advance = op / hdr->line_range;
-		address += (hdr->min_insn_len * (op_index + advance)
-			    / hdr->max_ops_per_insn);
-		op_index = (op_index + advance) % hdr->max_ops_per_insn;
-	      }
-	      break;
-	    case DW_LNS_fixed_advance_pc:
-	      address += read_uint16 (line_buf);
-	      op_index = 0;
-	      break;
-	    case DW_LNS_set_prologue_end:
-	      break;
-	    case DW_LNS_set_epilogue_begin:
-	      break;
-	    case DW_LNS_set_isa:
-	      read_uleb128 (line_buf);
-	      break;
-	    default:
-	      {
-		unsigned int i;
-
-		for (i = hdr->opcode_lengths[op - 1]; i > 0; --i)
-		  read_uleb128 (line_buf);
-	      }
-	      break;
-	    }
-	}
-    }
-
-  return 1;
-}
-
-/* Read the line number information for a compilation unit.  Returns 1
-   on success, 0 on failure.  */
-
-static int
-read_line_info (struct backtrace_state *state, struct dwarf_data *ddata,
-		backtrace_error_callback error_callback, void *data,
-		struct unit *u, struct line_header *hdr, struct line **lines,
-		size_t *lines_count)
-{
-  struct line_vector vec;
-  struct dwarf_buf line_buf;
-  uint64_t len;
-  int is_dwarf64;
-  struct line *ln;
-
-  memset (&vec.vec, 0, sizeof vec.vec);
-  vec.count = 0;
-
-  memset (hdr, 0, sizeof *hdr);
-
-  if (u->lineoff != (off_t) (size_t) u->lineoff
-      || (size_t) u->lineoff >= ddata->dwarf_line_size)
-    {
-      error_callback (data, "unit line offset out of range", 0);
-      goto fail;
-    }
-
-  line_buf.name = ".debug_line";
-  line_buf.start = ddata->dwarf_line;
-  line_buf.buf = ddata->dwarf_line + u->lineoff;
-  line_buf.left = ddata->dwarf_line_size - u->lineoff;
-  line_buf.is_bigendian = ddata->is_bigendian;
-  line_buf.error_callback = error_callback;
-  line_buf.data = data;
-  line_buf.reported_underflow = 0;
-
-  is_dwarf64 = 0;
-  len = read_uint32 (&line_buf);
-  if (len == 0xffffffff)
-    {
-      len = read_uint64 (&line_buf);
-      is_dwarf64 = 1;
-    }
-  line_buf.left = len;
-
-  if (!read_line_header (state, u, is_dwarf64, &line_buf, hdr))
-    goto fail;
-
-  if (!read_line_program (state, ddata, u, hdr, &line_buf, &vec))
-    goto fail;
-
-  if (line_buf.reported_underflow)
-    goto fail;
-
-  if (vec.count == 0)
-    {
-      /* This is not a failure in the sense of a generating an error,
-	 but it is a failure in that sense that we have no useful
-	 information.  */
-      goto fail;
-    }
-
-  /* Allocate one extra entry at the end.  */
-  ln = ((struct line *)
-	backtrace_vector_grow (state, sizeof (struct line), error_callback,
-			       data, &vec.vec));
-  if (ln == NULL)
-    goto fail;
-  ln->pc = (uintptr_t) -1;
-  ln->filename = NULL;
-  ln->lineno = 0;
-
-  if (!backtrace_vector_release (state, &vec.vec, error_callback, data))
-    goto fail;
-
-  ln = (struct line *) vec.vec.base;
-  backtrace_qsort (ln, vec.count, sizeof (struct line), line_compare);
-
-  *lines = ln;
-  *lines_count = vec.count;
-
-  return 1;
-
- fail:
-  vec.vec.alc += vec.vec.size;
-  vec.vec.size = 0;
-  backtrace_vector_release (state, &vec.vec, error_callback, data);
-  free_line_header (state, hdr, error_callback, data);
-  *lines = (struct line *) (uintptr_t) -1;
-  *lines_count = 0;
-  return 0;
-}
-
-/* Read the name of a function from a DIE referenced by a
-   DW_AT_abstract_origin or DW_AT_specification tag.  OFFSET is within
-   the same compilation unit.  */
-
-static const char *
-read_referenced_name (struct dwarf_data *ddata, struct unit *u,
-		      uint64_t offset, backtrace_error_callback error_callback,
-		      void *data)
-{
-  struct dwarf_buf unit_buf;
-  uint64_t code;
-  const struct abbrev *abbrev;
-  const char *ret;
-  size_t i;
-
-  /* OFFSET is from the start of the data for this compilation unit.
-     U->unit_data is the data, but it starts U->unit_data_offset bytes
-     from the beginning.  */
-
-  if (offset < u->unit_data_offset
-      || offset - u->unit_data_offset >= u->unit_data_len)
-    {
-      error_callback (data,
-		      "abstract origin or specification out of range",
-		      0);
-      return NULL;
-    }
-
-  offset -= u->unit_data_offset;
-
-  unit_buf.name = ".debug_info";
-  unit_buf.start = ddata->dwarf_info;
-  unit_buf.buf = u->unit_data + offset;
-  unit_buf.left = u->unit_data_len - offset;
-  unit_buf.is_bigendian = ddata->is_bigendian;
-  unit_buf.error_callback = error_callback;
-  unit_buf.data = data;
-  unit_buf.reported_underflow = 0;
-
-  code = read_uleb128 (&unit_buf);
-  if (code == 0)
-    {
-      dwarf_buf_error (&unit_buf, "invalid abstract origin or specification");
-      return NULL;
-    }
-
-  abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
-  if (abbrev == NULL)
-    return NULL;
-
-  ret = NULL;
-  for (i = 0; i < abbrev->num_attrs; ++i)
-    {
-      struct attr_val val;
-
-      if (!read_attribute (abbrev->attrs[i].form, &unit_buf,
-			   u->is_dwarf64, u->version, u->addrsize,
-			   ddata->dwarf_str, ddata->dwarf_str_size,
-			   &val))
-	return NULL;
-
-      switch (abbrev->attrs[i].name)
-	{
-	case DW_AT_name:
-	  /* We prefer the linkage name if get one.  */
-	  if (val.encoding == ATTR_VAL_STRING)
-	    ret = val.u.string;
-	  break;
-
-	case DW_AT_linkage_name:
-	case DW_AT_MIPS_linkage_name:
-	  if (val.encoding == ATTR_VAL_STRING)
-	    return val.u.string;
-	  break;
-
-	case DW_AT_specification:
-	  if (abbrev->attrs[i].form == DW_FORM_ref_addr
-	      || abbrev->attrs[i].form == DW_FORM_ref_sig8)
-	    {
-	      /* This refers to a specification defined in some other
-		 compilation unit.  We can handle this case if we
-		 must, but it's harder.  */
-	      break;
-	    }
-	  if (val.encoding == ATTR_VAL_UINT
-	      || val.encoding == ATTR_VAL_REF_UNIT)
-	    {
-	      const char *name;
-
-	      name = read_referenced_name (ddata, u, val.u.uint,
-					   error_callback, data);
-	      if (name != NULL)
-		ret = name;
-	    }
-	  break;
-
-	default:
-	  break;
-	}
-    }
-
-  return ret;
-}
-
-/* Add a single range to U that maps to function.  Returns 1 on
-   success, 0 on error.  */
-
-static int
-add_function_range (struct backtrace_state *state, struct dwarf_data *ddata,
-		    struct function *function, uint64_t lowpc, uint64_t highpc,
-		    backtrace_error_callback error_callback,
-		    void *data, struct function_vector *vec)
-{
-  struct function_addrs *p;
-
-  /* Add in the base address here, so that we can look up the PC
-     directly.  */
-  lowpc += ddata->base_address;
-  highpc += ddata->base_address;
-
-  if (vec->count > 0)
-    {
-      p = (struct function_addrs *) vec->vec.base + vec->count - 1;
-      if ((lowpc == p->high || lowpc == p->high + 1)
-	  && function == p->function)
-	{
-	  if (highpc > p->high)
-	    p->high = highpc;
-	  return 1;
-	}
-    }
-
-  p = ((struct function_addrs *)
-       backtrace_vector_grow (state, sizeof (struct function_addrs),
-			      error_callback, data, &vec->vec));
-  if (p == NULL)
-    return 0;
-
-  p->low = lowpc;
-  p->high = highpc;
-  p->function = function;
-  ++vec->count;
-  return 1;
-}
-
-/* Add PC ranges to U that map to FUNCTION.  Returns 1 on success, 0
-   on error.  */
-
-static int
-add_function_ranges (struct backtrace_state *state, struct dwarf_data *ddata,
-		     struct unit *u, struct function *function,
-		     uint64_t ranges, uint64_t base,
-		     backtrace_error_callback error_callback, void *data,
-		     struct function_vector *vec)
-{
-  struct dwarf_buf ranges_buf;
-
-  if (ranges >= ddata->dwarf_ranges_size)
-    {
-      error_callback (data, "function ranges offset out of range", 0);
-      return 0;
-    }
-
-  ranges_buf.name = ".debug_ranges";
-  ranges_buf.start = ddata->dwarf_ranges;
-  ranges_buf.buf = ddata->dwarf_ranges + ranges;
-  ranges_buf.left = ddata->dwarf_ranges_size - ranges;
-  ranges_buf.is_bigendian = ddata->is_bigendian;
-  ranges_buf.error_callback = error_callback;
-  ranges_buf.data = data;
-  ranges_buf.reported_underflow = 0;
-
-  while (1)
-    {
-      uint64_t low;
-      uint64_t high;
-
-      if (ranges_buf.reported_underflow)
-	return 0;
-
-      low = read_address (&ranges_buf, u->addrsize);
-      high = read_address (&ranges_buf, u->addrsize);
-
-      if (low == 0 && high == 0)
-	break;
-
-      if (is_highest_address (low, u->addrsize))
-	base = high;
-      else
-	{
-	  if (!add_function_range (state, ddata, function, low + base,
-				   high + base, error_callback, data, vec))
-	    return 0;
-	}
-    }
-
-  if (ranges_buf.reported_underflow)
-    return 0;
-
-  return 1;
-}
-
-/* Read one entry plus all its children.  Add function addresses to
-   VEC.  Returns 1 on success, 0 on error.  */
-
-static int
-read_function_entry (struct backtrace_state *state, struct dwarf_data *ddata,
-		     struct unit *u, uint64_t base, struct dwarf_buf *unit_buf,
-		     const struct line_header *lhdr,
-		     backtrace_error_callback error_callback, void *data,
-		     struct function_vector *vec)
-{
-  while (unit_buf->left > 0)
-    {
-      uint64_t code;
-      const struct abbrev *abbrev;
-      int is_function;
-      struct function *function;
-      size_t i;
-      uint64_t lowpc;
-      int have_lowpc;
-      uint64_t highpc;
-      int have_highpc;
-      int highpc_is_relative;
-      uint64_t ranges;
-      int have_ranges;
-
-      code = read_uleb128 (unit_buf);
-      if (code == 0)
-	return 1;
-
-      abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
-      if (abbrev == NULL)
-	return 0;
-
-      is_function = (abbrev->tag == DW_TAG_subprogram
-		     || abbrev->tag == DW_TAG_entry_point
-		     || abbrev->tag == DW_TAG_inlined_subroutine);
-
-      function = NULL;
-      if (is_function)
-	{
-	  function = ((struct function *)
-		      backtrace_alloc (state, sizeof *function,
-				       error_callback, data));
-	  if (function == NULL)
-	    return 0;
-	  memset (function, 0, sizeof *function);
-	}
-
-      lowpc = 0;
-      have_lowpc = 0;
-      highpc = 0;
-      have_highpc = 0;
-      highpc_is_relative = 0;
-      ranges = 0;
-      have_ranges = 0;
-      for (i = 0; i < abbrev->num_attrs; ++i)
-	{
-	  struct attr_val val;
-
-	  if (!read_attribute (abbrev->attrs[i].form, unit_buf,
-			       u->is_dwarf64, u->version, u->addrsize,
-			       ddata->dwarf_str, ddata->dwarf_str_size,
-			       &val))
-	    return 0;
-
-	  /* The compile unit sets the base address for any address
-	     ranges in the function entries.  */
-	  if (abbrev->tag == DW_TAG_compile_unit
-	      && abbrev->attrs[i].name == DW_AT_low_pc
-	      && val.encoding == ATTR_VAL_ADDRESS)
-	    base = val.u.uint;
-
-	  if (is_function)
-	    {
-	      switch (abbrev->attrs[i].name)
-		{
-		case DW_AT_call_file:
-		  if (val.encoding == ATTR_VAL_UINT)
-		    {
-		      if (val.u.uint == 0)
-			function->caller_filename = "";
-		      else
-			{
-			  if (val.u.uint - 1 >= lhdr->filenames_count)
-			    {
-			      dwarf_buf_error (unit_buf,
-					       ("invalid file number in "
-						"DW_AT_call_file attribute"));
-			      return 0;
-			    }
-			  function->caller_filename =
-			    lhdr->filenames[val.u.uint - 1];
-			}
-		    }
-		  break;
-
-		case DW_AT_call_line:
-		  if (val.encoding == ATTR_VAL_UINT)
-		    function->caller_lineno = val.u.uint;
-		  break;
-
-		case DW_AT_abstract_origin:
-		case DW_AT_specification:
-		  if (abbrev->attrs[i].form == DW_FORM_ref_addr
-		      || abbrev->attrs[i].form == DW_FORM_ref_sig8)
-		    {
-		      /* This refers to an abstract origin defined in
-			 some other compilation unit.  We can handle
-			 this case if we must, but it's harder.  */
-		      break;
-		    }
-		  if (val.encoding == ATTR_VAL_UINT
-		      || val.encoding == ATTR_VAL_REF_UNIT)
-		    {
-		      const char *name;
-
-		      name = read_referenced_name (ddata, u, val.u.uint,
-						   error_callback, data);
-		      if (name != NULL)
-			function->name = name;
-		    }
-		  break;
-
-		case DW_AT_name:
-		  if (val.encoding == ATTR_VAL_STRING)
-		    {
-		      /* Don't override a name we found in some other
-			 way, as it will normally be more
-			 useful--e.g., this name is normally not
-			 mangled.  */
-		      if (function->name == NULL)
-			function->name = val.u.string;
-		    }
-		  break;
-
-		case DW_AT_linkage_name:
-		case DW_AT_MIPS_linkage_name:
-		  if (val.encoding == ATTR_VAL_STRING)
-		    function->name = val.u.string;
-		  break;
-
-		case DW_AT_low_pc:
-		  if (val.encoding == ATTR_VAL_ADDRESS)
-		    {
-		      lowpc = val.u.uint;
-		      have_lowpc = 1;
-		    }
-		  break;
-
-		case DW_AT_high_pc:
-		  if (val.encoding == ATTR_VAL_ADDRESS)
-		    {
-		      highpc = val.u.uint;
-		      have_highpc = 1;
-		    }
-		  else if (val.encoding == ATTR_VAL_UINT)
-		    {
-		      highpc = val.u.uint;
-		      have_highpc = 1;
-		      highpc_is_relative = 1;
-		    }
-		  break;
-
-		case DW_AT_ranges:
-		  if (val.encoding == ATTR_VAL_UINT
-		      || val.encoding == ATTR_VAL_REF_SECTION)
-		    {
-		      ranges = val.u.uint;
-		      have_ranges = 1;
-		    }
-		  break;
-
-		default:
-		  break;
-		}
-	    }
-	}
-
-      /* If we couldn't find a name for the function, we have no use
-	 for it.  */
-      if (is_function && function->name == NULL)
-	{
-	  backtrace_free (state, function, sizeof *function,
-			  error_callback, data);
-	  is_function = 0;
-	}
-
-      if (is_function)
-	{
-	  if (have_ranges)
-	    {
-	      if (!add_function_ranges (state, ddata, u, function, ranges,
-					base, error_callback, data, vec))
-		return 0;
-	    }
-	  else if (have_lowpc && have_highpc)
-	    {
-	      if (highpc_is_relative)
-		highpc += lowpc;
-	      if (!add_function_range (state, ddata, function, lowpc, highpc,
-				       error_callback, data, vec))
-		return 0;
-	    }
-	  else
-	    {
-	      backtrace_free (state, function, sizeof *function,
-			      error_callback, data);
-	      is_function = 0;
-	    }
-	}
-
-      if (abbrev->has_children)
-	{
-	  if (!is_function)
-	    {
-	      if (!read_function_entry (state, ddata, u, base, unit_buf, lhdr,
-					error_callback, data, vec))
-		return 0;
-	    }
-	  else
-	    {
-	      struct function_vector fvec;
-
-	      /* Gather any information for inlined functions in
-		 FVEC.  */
-
-	      memset (&fvec, 0, sizeof fvec);
-
-	      if (!read_function_entry (state, ddata, u, base, unit_buf, lhdr,
-					error_callback, data, &fvec))
-		return 0;
-
-	      if (fvec.count > 0)
-		{
-		  struct function_addrs *faddrs;
-
-		  if (!backtrace_vector_release (state, &fvec.vec,
-						 error_callback, data))
-		    return 0;
-
-		  faddrs = (struct function_addrs *) fvec.vec.base;
-		  backtrace_qsort (faddrs, fvec.count,
-				   sizeof (struct function_addrs),
-				   function_addrs_compare);
-
-		  function->function_addrs = faddrs;
-		  function->function_addrs_count = fvec.count;
-		}
-	    }
-	}
-    }
-
-  return 1;
-}
-
-/* Read function name information for a compilation unit.  We look
-   through the whole unit looking for function tags.  */
-
-static void
-read_function_info (struct backtrace_state *state, struct dwarf_data *ddata,
-		    const struct line_header *lhdr,
-		    backtrace_error_callback error_callback, void *data,
-		    struct unit *u, struct function_vector *fvec,
-		    struct function_addrs **ret_addrs,
-		    size_t *ret_addrs_count)
-{
-  struct function_vector lvec;
-  struct function_vector *pfvec;
-  struct dwarf_buf unit_buf;
-  struct function_addrs *addrs;
-  size_t addrs_count;
-
-  /* Use FVEC if it is not NULL.  Otherwise use our own vector.  */
-  if (fvec != NULL)
-    pfvec = fvec;
-  else
-    {
-      memset (&lvec, 0, sizeof lvec);
-      pfvec = &lvec;
-    }
-
-  unit_buf.name = ".debug_info";
-  unit_buf.start = ddata->dwarf_info;
-  unit_buf.buf = u->unit_data;
-  unit_buf.left = u->unit_data_len;
-  unit_buf.is_bigendian = ddata->is_bigendian;
-  unit_buf.error_callback = error_callback;
-  unit_buf.data = data;
-  unit_buf.reported_underflow = 0;
-
-  while (unit_buf.left > 0)
-    {
-      if (!read_function_entry (state, ddata, u, 0, &unit_buf, lhdr,
-				error_callback, data, pfvec))
-	return;
-    }
-
-  if (pfvec->count == 0)
-    return;
-
-  addrs_count = pfvec->count;
-
-  if (fvec == NULL)
-    {
-      if (!backtrace_vector_release (state, &lvec.vec, error_callback, data))
-	return;
-      addrs = (struct function_addrs *) pfvec->vec.base;
-    }
-  else
-    {
-      /* Finish this list of addresses, but leave the remaining space in
-	 the vector available for the next function unit.  */
-      addrs = ((struct function_addrs *)
-	       backtrace_vector_finish (state, &fvec->vec,
-					error_callback, data));
-      if (addrs == NULL)
-	return;
-      fvec->count = 0;
-    }
-
-  backtrace_qsort (addrs, addrs_count, sizeof (struct function_addrs),
-		   function_addrs_compare);
-
-  *ret_addrs = addrs;
-  *ret_addrs_count = addrs_count;
-}
-
-/* See if PC is inlined in FUNCTION.  If it is, print out the inlined
-   information, and update FILENAME and LINENO for the caller.
-   Returns whatever CALLBACK returns, or 0 to keep going.  */
-
-static int
-report_inlined_functions (uintptr_t pc, struct function *function,
-			  backtrace_full_callback callback, void *data,
-			  const char **filename, int *lineno)
-{
-  struct function_addrs *function_addrs;
-  struct function *inlined;
-  int ret;
-
-  if (function->function_addrs_count == 0)
-    return 0;
-
-  function_addrs = ((struct function_addrs *)
-		    bsearch (&pc, function->function_addrs,
-			     function->function_addrs_count,
-			     sizeof (struct function_addrs),
-			     function_addrs_search));
-  if (function_addrs == NULL)
-    return 0;
-
-  while (((size_t) (function_addrs - function->function_addrs) + 1
-	  < function->function_addrs_count)
-	 && pc >= (function_addrs + 1)->low
-	 && pc < (function_addrs + 1)->high)
-    ++function_addrs;
-
-  /* We found an inlined call.  */
-
-  inlined = function_addrs->function;
-
-  /* Report any calls inlined into this one.  */
-  ret = report_inlined_functions (pc, inlined, callback, data,
-				  filename, lineno);
-  if (ret != 0)
-    return ret;
-
-  /* Report this inlined call.  */
-  ret = callback (data, pc, *filename, *lineno, inlined->name);
-  if (ret != 0)
-    return ret;
-
-  /* Our caller will report the caller of the inlined function; tell
-     it the appropriate filename and line number.  */
-  *filename = inlined->caller_filename;
-  *lineno = inlined->caller_lineno;
-
-  return 0;
-}
-
-/* Look for a PC in the DWARF mapping for one module.  On success,
-   call CALLBACK and return whatever it returns.  On error, call
-   ERROR_CALLBACK and return 0.  Sets *FOUND to 1 if the PC is found,
-   0 if not.  */
-
-static int
-dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata,
-		 uintptr_t pc, backtrace_full_callback callback,
-		 backtrace_error_callback error_callback, void *data,
-		 int *found)
-{
-  struct unit_addrs *entry;
-  struct unit *u;
-  int new_data;
-  struct line *lines;
-  struct line *ln;
-  struct function_addrs *function_addrs;
-  struct function *function;
-  const char *filename;
-  int lineno;
-  int ret;
-
-  *found = 1;
-
-  /* Find an address range that includes PC.  */
-  entry = bsearch (&pc, ddata->addrs, ddata->addrs_count,
-		   sizeof (struct unit_addrs), unit_addrs_search);
-
-  if (entry == NULL)
-    {
-      *found = 0;
-      return 0;
-    }
-
-  /* If there are multiple ranges that contain PC, use the last one,
-     in order to produce predictable results.  If we assume that all
-     ranges are properly nested, then the last range will be the
-     smallest one.  */
-  while ((size_t) (entry - ddata->addrs) + 1 < ddata->addrs_count
-	 && pc >= (entry + 1)->low
-	 && pc < (entry + 1)->high)
-    ++entry;
-
-  /* We need the lines, lines_count, function_addrs,
-     function_addrs_count fields of u.  If they are not set, we need
-     to set them.  When running in threaded mode, we need to allow for
-     the possibility that some other thread is setting them
-     simultaneously.  */
-
-  u = entry->u;
-  lines = u->lines;
-
-  /* Skip units with no useful line number information by walking
-     backward.  Useless line number information is marked by setting
-     lines == -1.  */
-  while (entry > ddata->addrs
-	 && pc >= (entry - 1)->low
-	 && pc < (entry - 1)->high)
-    {
-      if (state->threaded)
-	lines = (struct line *) backtrace_atomic_load_pointer (&u->lines);
-
-      if (lines != (struct line *) (uintptr_t) -1)
-	break;
-
-      --entry;
-
-      u = entry->u;
-      lines = u->lines;
-    }
-
-  if (state->threaded)
-    lines = backtrace_atomic_load_pointer (&u->lines);
-
-  new_data = 0;
-  if (lines == NULL)
-    {
-      size_t function_addrs_count;
-      struct line_header lhdr;
-      size_t count;
-
-      /* We have never read the line information for this unit.  Read
-	 it now.  */
-
-      function_addrs = NULL;
-      function_addrs_count = 0;
-      if (read_line_info (state, ddata, error_callback, data, entry->u, &lhdr,
-			  &lines, &count))
-	{
-	  struct function_vector *pfvec;
-
-	  /* If not threaded, reuse DDATA->FVEC for better memory
-	     consumption.  */
-	  if (state->threaded)
-	    pfvec = NULL;
-	  else
-	    pfvec = &ddata->fvec;
-	  read_function_info (state, ddata, &lhdr, error_callback, data,
-			      entry->u, pfvec, &function_addrs,
-			      &function_addrs_count);
-	  free_line_header (state, &lhdr, error_callback, data);
-	  new_data = 1;
-	}
-
-      /* Atomically store the information we just read into the unit.
-	 If another thread is simultaneously writing, it presumably
-	 read the same information, and we don't care which one we
-	 wind up with; we just leak the other one.  We do have to
-	 write the lines field last, so that the acquire-loads above
-	 ensure that the other fields are set.  */
-
-      if (!state->threaded)
-	{
-	  u->lines_count = count;
-	  u->function_addrs = function_addrs;
-	  u->function_addrs_count = function_addrs_count;
-	  u->lines = lines;
-	}
-      else
-	{
-	  backtrace_atomic_store_size_t (&u->lines_count, count);
-	  backtrace_atomic_store_pointer (&u->function_addrs, function_addrs);
-	  backtrace_atomic_store_size_t (&u->function_addrs_count,
-					 function_addrs_count);
-	  backtrace_atomic_store_pointer (&u->lines, lines);
-	}
-    }
-
-  /* Now all fields of U have been initialized.  */
-
-  if (lines == (struct line *) (uintptr_t) -1)
-    {
-      /* If reading the line number information failed in some way,
-	 try again to see if there is a better compilation unit for
-	 this PC.  */
-      if (new_data)
-	return dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
-				data, found);
-      return callback (data, pc, NULL, 0, NULL);
-    }
-
-  /* Search for PC within this unit.  */
-
-  ln = (struct line *) bsearch (&pc, lines, entry->u->lines_count,
-				sizeof (struct line), line_search);
-  if (ln == NULL)
-    {
-      /* The PC is between the low_pc and high_pc attributes of the
-	 compilation unit, but no entry in the line table covers it.
-	 This implies that the start of the compilation unit has no
-	 line number information.  */
-
-      if (entry->u->abs_filename == NULL)
-	{
-	  const char *filename;
-
-	  filename = entry->u->filename;
-	  if (filename != NULL
-	      && !IS_ABSOLUTE_PATH (filename)
-	      && entry->u->comp_dir != NULL)
-	    {
-	      size_t filename_len;
-	      const char *dir;
-	      size_t dir_len;
-	      char *s;
-
-	      filename_len = strlen (filename);
-	      dir = entry->u->comp_dir;
-	      dir_len = strlen (dir);
-	      s = (char *) backtrace_alloc (state, dir_len + filename_len + 2,
-					    error_callback, data);
-	      if (s == NULL)
-		{
-		  *found = 0;
-		  return 0;
-		}
-	      memcpy (s, dir, dir_len);
-	      /* FIXME: Should use backslash if DOS file system.  */
-	      s[dir_len] = '/';
-	      memcpy (s + dir_len + 1, filename, filename_len + 1);
-	      filename = s;
-	    }
-	  entry->u->abs_filename = filename;
-	}
-
-      return callback (data, pc, entry->u->abs_filename, 0, NULL);
-    }
-
-  /* Search for function name within this unit.  */
-
-  if (entry->u->function_addrs_count == 0)
-    return callback (data, pc, ln->filename, ln->lineno, NULL);
-
-  function_addrs = ((struct function_addrs *)
-		    bsearch (&pc, entry->u->function_addrs,
-			     entry->u->function_addrs_count,
-			     sizeof (struct function_addrs),
-			     function_addrs_search));
-  if (function_addrs == NULL)
-    return callback (data, pc, ln->filename, ln->lineno, NULL);
-
-  /* If there are multiple function ranges that contain PC, use the
-     last one, in order to produce predictable results.  */
-
-  while (((size_t) (function_addrs - entry->u->function_addrs + 1)
-	  < entry->u->function_addrs_count)
-	 && pc >= (function_addrs + 1)->low
-	 && pc < (function_addrs + 1)->high)
-    ++function_addrs;
-
-  function = function_addrs->function;
-
-  filename = ln->filename;
-  lineno = ln->lineno;
-
-  ret = report_inlined_functions (pc, function, callback, data,
-				  &filename, &lineno);
-  if (ret != 0)
-    return ret;
-
-  return callback (data, pc, filename, lineno, function->name);
-}
-
-
-/* Return the file/line information for a PC using the DWARF mapping
-   we built earlier.  */
-
-static int
-dwarf_fileline (struct backtrace_state *state, uintptr_t pc,
-		backtrace_full_callback callback,
-		backtrace_error_callback error_callback, void *data)
-{
-  struct dwarf_data *ddata;
-  int found;
-  int ret;
-
-  if (!state->threaded)
-    {
-      for (ddata = (struct dwarf_data *) state->fileline_data;
-	   ddata != NULL;
-	   ddata = ddata->next)
-	{
-	  ret = dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
-				 data, &found);
-	  if (ret != 0 || found)
-	    return ret;
-	}
-    }
-  else
-    {
-      struct dwarf_data **pp;
-
-      pp = (struct dwarf_data **) (void *) &state->fileline_data;
-      while (1)
-	{
-	  ddata = backtrace_atomic_load_pointer (pp);
-	  if (ddata == NULL)
-	    break;
-
-	  ret = dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
-				 data, &found);
-	  if (ret != 0 || found)
-	    return ret;
-
-	  pp = &ddata->next;
-	}
-    }
-
-  /* FIXME: See if any libraries have been dlopen'ed.  */
-
-  return callback (data, pc, NULL, 0, NULL);
-}
-
-/* Initialize our data structures from the DWARF debug info for a
-   file.  Return NULL on failure.  */
-
-static struct dwarf_data *
-build_dwarf_data (struct backtrace_state *state,
-		  uintptr_t base_address,
-		  const unsigned char *dwarf_info,
-		  size_t dwarf_info_size,
-		  const unsigned char *dwarf_line,
-		  size_t dwarf_line_size,
-		  const unsigned char *dwarf_abbrev,
-		  size_t dwarf_abbrev_size,
-		  const unsigned char *dwarf_ranges,
-		  size_t dwarf_ranges_size,
-		  const unsigned char *dwarf_str,
-		  size_t dwarf_str_size,
-		  int is_bigendian,
-		  backtrace_error_callback error_callback,
-		  void *data)
-{
-  struct unit_addrs_vector addrs_vec;
-  struct unit_addrs *addrs;
-  size_t addrs_count;
-  struct dwarf_data *fdata;
-
-  if (!build_address_map (state, base_address, dwarf_info, dwarf_info_size,
-			  dwarf_abbrev, dwarf_abbrev_size, dwarf_ranges,
-			  dwarf_ranges_size, dwarf_str, dwarf_str_size,
-			  is_bigendian, error_callback, data, &addrs_vec))
-    return NULL;
-
-  if (!backtrace_vector_release (state, &addrs_vec.vec, error_callback, data))
-    return NULL;
-  addrs = (struct unit_addrs *) addrs_vec.vec.base;
-  addrs_count = addrs_vec.count;
-  backtrace_qsort (addrs, addrs_count, sizeof (struct unit_addrs),
-		   unit_addrs_compare);
-
-  fdata = ((struct dwarf_data *)
-	   backtrace_alloc (state, sizeof (struct dwarf_data),
-			    error_callback, data));
-  if (fdata == NULL)
-    return NULL;
-
-  fdata->next = NULL;
-  fdata->base_address = base_address;
-  fdata->addrs = addrs;
-  fdata->addrs_count = addrs_count;
-  fdata->dwarf_info = dwarf_info;
-  fdata->dwarf_info_size = dwarf_info_size;
-  fdata->dwarf_line = dwarf_line;
-  fdata->dwarf_line_size = dwarf_line_size;
-  fdata->dwarf_ranges = dwarf_ranges;
-  fdata->dwarf_ranges_size = dwarf_ranges_size;
-  fdata->dwarf_str = dwarf_str;
-  fdata->dwarf_str_size = dwarf_str_size;
-  fdata->is_bigendian = is_bigendian;
-  memset (&fdata->fvec, 0, sizeof fdata->fvec);
-
-  return fdata;
-}
-
-/* Build our data structures from the DWARF sections for a module.
-   Set FILELINE_FN and STATE->FILELINE_DATA.  Return 1 on success, 0
-   on failure.  */
-
-int
-backtrace_dwarf_add (struct backtrace_state *state,
-		     uintptr_t base_address,
-		     const unsigned char *dwarf_info,
-		     size_t dwarf_info_size,
-		     const unsigned char *dwarf_line,
-		     size_t dwarf_line_size,
-		     const unsigned char *dwarf_abbrev,
-		     size_t dwarf_abbrev_size,
-		     const unsigned char *dwarf_ranges,
-		     size_t dwarf_ranges_size,
-		     const unsigned char *dwarf_str,
-		     size_t dwarf_str_size,
-		     int is_bigendian,
-		     backtrace_error_callback error_callback,
-		     void *data, fileline *fileline_fn)
-{
-  struct dwarf_data *fdata;
-
-  fdata = build_dwarf_data (state, base_address, dwarf_info, dwarf_info_size,
-			    dwarf_line, dwarf_line_size, dwarf_abbrev,
-			    dwarf_abbrev_size, dwarf_ranges, dwarf_ranges_size,
-			    dwarf_str, dwarf_str_size, is_bigendian,
-			    error_callback, data);
-  if (fdata == NULL)
-    return 0;
-
-  if (!state->threaded)
-    {
-      struct dwarf_data **pp;
-
-      for (pp = (struct dwarf_data **) (void *) &state->fileline_data;
-	   *pp != NULL;
-	   pp = &(*pp)->next)
-	;
-      *pp = fdata;
-    }
-  else
-    {
-      while (1)
-	{
-	  struct dwarf_data **pp;
-
-	  pp = (struct dwarf_data **) (void *) &state->fileline_data;
-
-	  while (1)
-	    {
-	      struct dwarf_data *p;
-
-	      p = backtrace_atomic_load_pointer (pp);
-
-	      if (p == NULL)
-		break;
-
-	      pp = &p->next;
-	    }
-
-	  if (__sync_bool_compare_and_swap (pp, NULL, fdata))
-	    break;
-	}
-    }
-
-  *fileline_fn = dwarf_fileline;
-
-  return 1;
-}
diff --git a/third_party/gofrontend/libbacktrace/elf.c b/third_party/gofrontend/libbacktrace/elf.c
deleted file mode 100644
index 3f14b11..0000000
--- a/third_party/gofrontend/libbacktrace/elf.c
+++ /dev/null
@@ -1,976 +0,0 @@
-/* elf.c -- Get debug data from an ELF file for backtraces.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-
-#ifdef HAVE_DL_ITERATE_PHDR
-#include <link.h>
-#endif
-
-#include "backtrace.h"
-#include "internal.h"
-
-#ifndef HAVE_DL_ITERATE_PHDR
-
-/* Dummy version of dl_iterate_phdr for systems that don't have it.  */
-
-#define dl_phdr_info x_dl_phdr_info
-#define dl_iterate_phdr x_dl_iterate_phdr
-
-struct dl_phdr_info
-{
-  uintptr_t dlpi_addr;
-  const char *dlpi_name;
-};
-
-static int
-dl_iterate_phdr (int (*callback) (struct dl_phdr_info *,
-				  size_t, void *) ATTRIBUTE_UNUSED,
-		 void *data ATTRIBUTE_UNUSED)
-{
-  return 0;
-}
-
-#endif /* ! defined (HAVE_DL_ITERATE_PHDR) */
-
-/* The configure script must tell us whether we are 32-bit or 64-bit
-   ELF.  We could make this code test and support either possibility,
-   but there is no point.  This code only works for the currently
-   running executable, which means that we know the ELF mode at
-   configure mode.  */
-
-#if BACKTRACE_ELF_SIZE != 32 && BACKTRACE_ELF_SIZE != 64
-#error "Unknown BACKTRACE_ELF_SIZE"
-#endif
-
-/* <link.h> might #include <elf.h> which might define our constants
-   with slightly different values.  Undefine them to be safe.  */
-
-#undef EI_NIDENT
-#undef EI_MAG0
-#undef EI_MAG1
-#undef EI_MAG2
-#undef EI_MAG3
-#undef EI_CLASS
-#undef EI_DATA
-#undef EI_VERSION
-#undef ELF_MAG0
-#undef ELF_MAG1
-#undef ELF_MAG2
-#undef ELF_MAG3
-#undef ELFCLASS32
-#undef ELFCLASS64
-#undef ELFDATA2LSB
-#undef ELFDATA2MSB
-#undef EV_CURRENT
-#undef ET_DYN
-#undef SHN_LORESERVE
-#undef SHN_XINDEX
-#undef SHN_UNDEF
-#undef SHT_SYMTAB
-#undef SHT_STRTAB
-#undef SHT_DYNSYM
-#undef STT_OBJECT
-#undef STT_FUNC
-
-/* Basic types.  */
-
-typedef uint16_t b_elf_half;    /* Elf_Half.  */
-typedef uint32_t b_elf_word;    /* Elf_Word.  */
-typedef int32_t  b_elf_sword;   /* Elf_Sword.  */
-
-#if BACKTRACE_ELF_SIZE == 32
-
-typedef uint32_t b_elf_addr;    /* Elf_Addr.  */
-typedef uint32_t b_elf_off;     /* Elf_Off.  */
-
-typedef uint32_t b_elf_wxword;  /* 32-bit Elf_Word, 64-bit ELF_Xword.  */
-
-#else
-
-typedef uint64_t b_elf_addr;    /* Elf_Addr.  */
-typedef uint64_t b_elf_off;     /* Elf_Off.  */
-typedef uint64_t b_elf_xword;   /* Elf_Xword.  */
-typedef int64_t  b_elf_sxword;  /* Elf_Sxword.  */
-
-typedef uint64_t b_elf_wxword;  /* 32-bit Elf_Word, 64-bit ELF_Xword.  */
-
-#endif
-
-/* Data structures and associated constants.  */
-
-#define EI_NIDENT 16
-
-typedef struct {
-  unsigned char	e_ident[EI_NIDENT];	/* ELF "magic number" */
-  b_elf_half	e_type;			/* Identifies object file type */
-  b_elf_half	e_machine;		/* Specifies required architecture */
-  b_elf_word	e_version;		/* Identifies object file version */
-  b_elf_addr	e_entry;		/* Entry point virtual address */
-  b_elf_off	e_phoff;		/* Program header table file offset */
-  b_elf_off	e_shoff;		/* Section header table file offset */
-  b_elf_word	e_flags;		/* Processor-specific flags */
-  b_elf_half	e_ehsize;		/* ELF header size in bytes */
-  b_elf_half	e_phentsize;		/* Program header table entry size */
-  b_elf_half	e_phnum;		/* Program header table entry count */
-  b_elf_half	e_shentsize;		/* Section header table entry size */
-  b_elf_half	e_shnum;		/* Section header table entry count */
-  b_elf_half	e_shstrndx;		/* Section header string table index */
-} b_elf_ehdr;  /* Elf_Ehdr.  */
-
-#define EI_MAG0 0
-#define EI_MAG1 1
-#define EI_MAG2 2
-#define EI_MAG3 3
-#define EI_CLASS 4
-#define EI_DATA 5
-#define EI_VERSION 6
-
-#define ELFMAG0 0x7f
-#define ELFMAG1 'E'
-#define ELFMAG2 'L'
-#define ELFMAG3 'F'
-
-#define ELFCLASS32 1
-#define ELFCLASS64 2
-
-#define ELFDATA2LSB 1
-#define ELFDATA2MSB 2
-
-#define EV_CURRENT 1
-
-#define ET_DYN 3
-
-typedef struct {
-  b_elf_word	sh_name;		/* Section name, index in string tbl */
-  b_elf_word	sh_type;		/* Type of section */
-  b_elf_wxword	sh_flags;		/* Miscellaneous section attributes */
-  b_elf_addr	sh_addr;		/* Section virtual addr at execution */
-  b_elf_off	sh_offset;		/* Section file offset */
-  b_elf_wxword	sh_size;		/* Size of section in bytes */
-  b_elf_word	sh_link;		/* Index of another section */
-  b_elf_word	sh_info;		/* Additional section information */
-  b_elf_wxword	sh_addralign;		/* Section alignment */
-  b_elf_wxword	sh_entsize;		/* Entry size if section holds table */
-} b_elf_shdr;  /* Elf_Shdr.  */
-
-#define SHN_UNDEF	0x0000		/* Undefined section */
-#define SHN_LORESERVE	0xFF00		/* Begin range of reserved indices */
-#define SHN_XINDEX	0xFFFF		/* Section index is held elsewhere */
-
-#define SHT_SYMTAB 2
-#define SHT_STRTAB 3
-#define SHT_DYNSYM 11
-
-#if BACKTRACE_ELF_SIZE == 32
-
-typedef struct
-{
-  b_elf_word	st_name;		/* Symbol name, index in string tbl */
-  b_elf_addr	st_value;		/* Symbol value */
-  b_elf_word	st_size;		/* Symbol size */
-  unsigned char	st_info;		/* Symbol binding and type */
-  unsigned char	st_other;		/* Visibility and other data */
-  b_elf_half	st_shndx;		/* Symbol section index */
-} b_elf_sym;  /* Elf_Sym.  */
-
-#else /* BACKTRACE_ELF_SIZE != 32 */
-
-typedef struct
-{
-  b_elf_word	st_name;		/* Symbol name, index in string tbl */
-  unsigned char	st_info;		/* Symbol binding and type */
-  unsigned char	st_other;		/* Visibility and other data */
-  b_elf_half	st_shndx;		/* Symbol section index */
-  b_elf_addr	st_value;		/* Symbol value */
-  b_elf_xword	st_size;		/* Symbol size */
-} b_elf_sym;  /* Elf_Sym.  */
-
-#endif /* BACKTRACE_ELF_SIZE != 32 */
-
-#define STT_OBJECT 1
-#define STT_FUNC 2
-
-/* An index of ELF sections we care about.  */
-
-enum debug_section
-{
-  DEBUG_INFO,
-  DEBUG_LINE,
-  DEBUG_ABBREV,
-  DEBUG_RANGES,
-  DEBUG_STR,
-  DEBUG_MAX
-};
-
-/* Names of sections, indexed by enum elf_section.  */
-
-static const char * const debug_section_names[DEBUG_MAX] =
-{
-  ".debug_info",
-  ".debug_line",
-  ".debug_abbrev",
-  ".debug_ranges",
-  ".debug_str"
-};
-
-/* Information we gather for the sections we care about.  */
-
-struct debug_section_info
-{
-  /* Section file offset.  */
-  off_t offset;
-  /* Section size.  */
-  size_t size;
-  /* Section contents, after read from file.  */
-  const unsigned char *data;
-};
-
-/* Information we keep for an ELF symbol.  */
-
-struct elf_symbol
-{
-  /* The name of the symbol.  */
-  const char *name;
-  /* The address of the symbol.  */
-  uintptr_t address;
-  /* The size of the symbol.  */
-  size_t size;
-};
-
-/* Information to pass to elf_syminfo.  */
-
-struct elf_syminfo_data
-{
-  /* Symbols for the next module.  */
-  struct elf_syminfo_data *next;
-  /* The ELF symbols, sorted by address.  */
-  struct elf_symbol *symbols;
-  /* The number of symbols.  */
-  size_t count;
-};
-
-/* A dummy callback function used when we can't find any debug info.  */
-
-static int
-elf_nodebug (struct backtrace_state *state ATTRIBUTE_UNUSED,
-	     uintptr_t pc ATTRIBUTE_UNUSED,
-	     backtrace_full_callback callback ATTRIBUTE_UNUSED,
-	     backtrace_error_callback error_callback, void *data)
-{
-  error_callback (data, "no debug info in ELF executable", -1);
-  return 0;
-}
-
-/* A dummy callback function used when we can't find a symbol
-   table.  */
-
-static void
-elf_nosyms (struct backtrace_state *state ATTRIBUTE_UNUSED,
-	    uintptr_t addr ATTRIBUTE_UNUSED,
-	    backtrace_syminfo_callback callback ATTRIBUTE_UNUSED,
-	    backtrace_error_callback error_callback, void *data)
-{
-  error_callback (data, "no symbol table in ELF executable", -1);
-}
-
-/* Compare struct elf_symbol for qsort.  */
-
-static int
-elf_symbol_compare (const void *v1, const void *v2)
-{
-  const struct elf_symbol *e1 = (const struct elf_symbol *) v1;
-  const struct elf_symbol *e2 = (const struct elf_symbol *) v2;
-
-  if (e1->address < e2->address)
-    return -1;
-  else if (e1->address > e2->address)
-    return 1;
-  else
-    return 0;
-}
-
-/* Compare an ADDR against an elf_symbol for bsearch.  We allocate one
-   extra entry in the array so that this can look safely at the next
-   entry.  */
-
-static int
-elf_symbol_search (const void *vkey, const void *ventry)
-{
-  const uintptr_t *key = (const uintptr_t *) vkey;
-  const struct elf_symbol *entry = (const struct elf_symbol *) ventry;
-  uintptr_t addr;
-
-  addr = *key;
-  if (addr < entry->address)
-    return -1;
-  else if (addr >= entry->address + entry->size)
-    return 1;
-  else
-    return 0;
-}
-
-/* Initialize the symbol table info for elf_syminfo.  */
-
-static int
-elf_initialize_syminfo (struct backtrace_state *state,
-			uintptr_t base_address,
-			const unsigned char *symtab_data, size_t symtab_size,
-			const unsigned char *strtab, size_t strtab_size,
-			backtrace_error_callback error_callback,
-			void *data, struct elf_syminfo_data *sdata)
-{
-  size_t sym_count;
-  const b_elf_sym *sym;
-  size_t elf_symbol_count;
-  size_t elf_symbol_size;
-  struct elf_symbol *elf_symbols;
-  size_t i;
-  unsigned int j;
-
-  sym_count = symtab_size / sizeof (b_elf_sym);
-
-  /* We only care about function symbols.  Count them.  */
-  sym = (const b_elf_sym *) symtab_data;
-  elf_symbol_count = 0;
-  for (i = 0; i < sym_count; ++i, ++sym)
-    {
-      int info;
-
-      info = sym->st_info & 0xf;
-      if ((info == STT_FUNC || info == STT_OBJECT)
-	  && sym->st_shndx != SHN_UNDEF)
-	++elf_symbol_count;
-    }
-
-  elf_symbol_size = elf_symbol_count * sizeof (struct elf_symbol);
-  elf_symbols = ((struct elf_symbol *)
-		 backtrace_alloc (state, elf_symbol_size, error_callback,
-				  data));
-  if (elf_symbols == NULL)
-    return 0;
-
-  sym = (const b_elf_sym *) symtab_data;
-  j = 0;
-  for (i = 0; i < sym_count; ++i, ++sym)
-    {
-      int info;
-
-      info = sym->st_info & 0xf;
-      if (info != STT_FUNC && info != STT_OBJECT)
-	continue;
-      if (sym->st_shndx == SHN_UNDEF)
-	continue;
-      if (sym->st_name >= strtab_size)
-	{
-	  error_callback (data, "symbol string index out of range", 0);
-	  backtrace_free (state, elf_symbols, elf_symbol_size, error_callback,
-			  data);
-	  return 0;
-	}
-      elf_symbols[j].name = (const char *) strtab + sym->st_name;
-      elf_symbols[j].address = sym->st_value + base_address;
-      elf_symbols[j].size = sym->st_size;
-      ++j;
-    }
-
-  backtrace_qsort (elf_symbols, elf_symbol_count, sizeof (struct elf_symbol),
-		   elf_symbol_compare);
-
-  sdata->next = NULL;
-  sdata->symbols = elf_symbols;
-  sdata->count = elf_symbol_count;
-
-  return 1;
-}
-
-/* Add EDATA to the list in STATE.  */
-
-static void
-elf_add_syminfo_data (struct backtrace_state *state,
-		      struct elf_syminfo_data *edata)
-{
-  if (!state->threaded)
-    {
-      struct elf_syminfo_data **pp;
-
-      for (pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
-	   *pp != NULL;
-	   pp = &(*pp)->next)
-	;
-      *pp = edata;
-    }
-  else
-    {
-      while (1)
-	{
-	  struct elf_syminfo_data **pp;
-
-	  pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
-
-	  while (1)
-	    {
-	      struct elf_syminfo_data *p;
-
-	      p = backtrace_atomic_load_pointer (pp);
-
-	      if (p == NULL)
-		break;
-
-	      pp = &p->next;
-	    }
-
-	  if (__sync_bool_compare_and_swap (pp, NULL, edata))
-	    break;
-	}
-    }
-}
-
-/* Return the symbol name and value for an ADDR.  */
-
-static void
-elf_syminfo (struct backtrace_state *state, uintptr_t addr,
-	     backtrace_syminfo_callback callback,
-	     backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
-	     void *data)
-{
-  struct elf_syminfo_data *edata;
-  struct elf_symbol *sym = NULL;
-
-  if (!state->threaded)
-    {
-      for (edata = (struct elf_syminfo_data *) state->syminfo_data;
-	   edata != NULL;
-	   edata = edata->next)
-	{
-	  sym = ((struct elf_symbol *)
-		 bsearch (&addr, edata->symbols, edata->count,
-			  sizeof (struct elf_symbol), elf_symbol_search));
-	  if (sym != NULL)
-	    break;
-	}
-    }
-  else
-    {
-      struct elf_syminfo_data **pp;
-
-      pp = (struct elf_syminfo_data **) (void *) &state->syminfo_data;
-      while (1)
-	{
-	  edata = backtrace_atomic_load_pointer (pp);
-	  if (edata == NULL)
-	    break;
-
-	  sym = ((struct elf_symbol *)
-		 bsearch (&addr, edata->symbols, edata->count,
-			  sizeof (struct elf_symbol), elf_symbol_search));
-	  if (sym != NULL)
-	    break;
-
-	  pp = &edata->next;
-	}
-    }
-
-  if (sym == NULL)
-    callback (data, addr, NULL, 0, 0);
-  else
-    callback (data, addr, sym->name, sym->address, sym->size);
-}
-
-/* Add the backtrace data for one ELF file.  Returns 1 on success,
-   0 on failure (in both cases descriptor is closed) or -1 if exe
-   is non-zero and the ELF file is ET_DYN, which tells the caller that
-   elf_add will need to be called on the descriptor again after
-   base_address is determined.  */
-
-static int
-elf_add (struct backtrace_state *state, int descriptor, uintptr_t base_address,
-	 backtrace_error_callback error_callback, void *data,
-	 fileline *fileline_fn, int *found_sym, int *found_dwarf, int exe)
-{
-  struct backtrace_view ehdr_view;
-  b_elf_ehdr ehdr;
-  off_t shoff;
-  unsigned int shnum;
-  unsigned int shstrndx;
-  struct backtrace_view shdrs_view;
-  int shdrs_view_valid;
-  const b_elf_shdr *shdrs;
-  const b_elf_shdr *shstrhdr;
-  size_t shstr_size;
-  off_t shstr_off;
-  struct backtrace_view names_view;
-  int names_view_valid;
-  const char *names;
-  unsigned int symtab_shndx;
-  unsigned int dynsym_shndx;
-  unsigned int i;
-  struct debug_section_info sections[DEBUG_MAX];
-  struct backtrace_view symtab_view;
-  int symtab_view_valid;
-  struct backtrace_view strtab_view;
-  int strtab_view_valid;
-  off_t min_offset;
-  off_t max_offset;
-  struct backtrace_view debug_view;
-  int debug_view_valid;
-
-  *found_sym = 0;
-  *found_dwarf = 0;
-
-  shdrs_view_valid = 0;
-  names_view_valid = 0;
-  symtab_view_valid = 0;
-  strtab_view_valid = 0;
-  debug_view_valid = 0;
-
-  if (!backtrace_get_view (state, descriptor, 0, sizeof ehdr, error_callback,
-			   data, &ehdr_view))
-    goto fail;
-
-  memcpy (&ehdr, ehdr_view.data, sizeof ehdr);
-
-  backtrace_release_view (state, &ehdr_view, error_callback, data);
-
-  if (ehdr.e_ident[EI_MAG0] != ELFMAG0
-      || ehdr.e_ident[EI_MAG1] != ELFMAG1
-      || ehdr.e_ident[EI_MAG2] != ELFMAG2
-      || ehdr.e_ident[EI_MAG3] != ELFMAG3)
-    {
-      error_callback (data, "executable file is not ELF", 0);
-      goto fail;
-    }
-  if (ehdr.e_ident[EI_VERSION] != EV_CURRENT)
-    {
-      error_callback (data, "executable file is unrecognized ELF version", 0);
-      goto fail;
-    }
-
-#if BACKTRACE_ELF_SIZE == 32
-#define BACKTRACE_ELFCLASS ELFCLASS32
-#else
-#define BACKTRACE_ELFCLASS ELFCLASS64
-#endif
-
-  if (ehdr.e_ident[EI_CLASS] != BACKTRACE_ELFCLASS)
-    {
-      error_callback (data, "executable file is unexpected ELF class", 0);
-      goto fail;
-    }
-
-  if (ehdr.e_ident[EI_DATA] != ELFDATA2LSB
-      && ehdr.e_ident[EI_DATA] != ELFDATA2MSB)
-    {
-      error_callback (data, "executable file has unknown endianness", 0);
-      goto fail;
-    }
-
-  /* If the executable is ET_DYN, it is either a PIE, or we are running
-     directly a shared library with .interp.  We need to wait for
-     dl_iterate_phdr in that case to determine the actual base_address.  */
-  if (exe && ehdr.e_type == ET_DYN)
-    return -1;
-
-  shoff = ehdr.e_shoff;
-  shnum = ehdr.e_shnum;
-  shstrndx = ehdr.e_shstrndx;
-
-  if ((shnum == 0 || shstrndx == SHN_XINDEX)
-      && shoff != 0)
-    {
-      struct backtrace_view shdr_view;
-      const b_elf_shdr *shdr;
-
-      if (!backtrace_get_view (state, descriptor, shoff, sizeof shdr,
-			       error_callback, data, &shdr_view))
-	goto fail;
-
-      shdr = (const b_elf_shdr *) shdr_view.data;
-
-      if (shnum == 0)
-	shnum = shdr->sh_size;
-
-      if (shstrndx == SHN_XINDEX)
-	{
-	  shstrndx = shdr->sh_link;
-
-	  /* Versions of the GNU binutils between 2.12 and 2.18 did
-	     not handle objects with more than SHN_LORESERVE sections
-	     correctly.  All large section indexes were offset by
-	     0x100.  There is more information at
-	     http://sourceware.org/bugzilla/show_bug.cgi?id-5900 .
-	     Fortunately these object files are easy to detect, as the
-	     GNU binutils always put the section header string table
-	     near the end of the list of sections.  Thus if the
-	     section header string table index is larger than the
-	     number of sections, then we know we have to subtract
-	     0x100 to get the real section index.  */
-	  if (shstrndx >= shnum && shstrndx >= SHN_LORESERVE + 0x100)
-	    shstrndx -= 0x100;
-	}
-
-      backtrace_release_view (state, &shdr_view, error_callback, data);
-    }
-
-  /* To translate PC to file/line when using DWARF, we need to find
-     the .debug_info and .debug_line sections.  */
-
-  /* Read the section headers, skipping the first one.  */
-
-  if (!backtrace_get_view (state, descriptor, shoff + sizeof (b_elf_shdr),
-			   (shnum - 1) * sizeof (b_elf_shdr),
-			   error_callback, data, &shdrs_view))
-    goto fail;
-  shdrs_view_valid = 1;
-  shdrs = (const b_elf_shdr *) shdrs_view.data;
-
-  /* Read the section names.  */
-
-  shstrhdr = &shdrs[shstrndx - 1];
-  shstr_size = shstrhdr->sh_size;
-  shstr_off = shstrhdr->sh_offset;
-
-  if (!backtrace_get_view (state, descriptor, shstr_off, shstr_size,
-			   error_callback, data, &names_view))
-    goto fail;
-  names_view_valid = 1;
-  names = (const char *) names_view.data;
-
-  symtab_shndx = 0;
-  dynsym_shndx = 0;
-
-  memset (sections, 0, sizeof sections);
-
-  /* Look for the symbol table.  */
-  for (i = 1; i < shnum; ++i)
-    {
-      const b_elf_shdr *shdr;
-      unsigned int sh_name;
-      const char *name;
-      int j;
-
-      shdr = &shdrs[i - 1];
-
-      if (shdr->sh_type == SHT_SYMTAB)
-	symtab_shndx = i;
-      else if (shdr->sh_type == SHT_DYNSYM)
-	dynsym_shndx = i;
-
-      sh_name = shdr->sh_name;
-      if (sh_name >= shstr_size)
-	{
-	  error_callback (data, "ELF section name out of range", 0);
-	  goto fail;
-	}
-
-      name = names + sh_name;
-
-      for (j = 0; j < (int) DEBUG_MAX; ++j)
-	{
-	  if (strcmp (name, debug_section_names[j]) == 0)
-	    {
-	      sections[j].offset = shdr->sh_offset;
-	      sections[j].size = shdr->sh_size;
-	      break;
-	    }
-	}
-    }
-
-  if (symtab_shndx == 0)
-    symtab_shndx = dynsym_shndx;
-  if (symtab_shndx != 0)
-    {
-      const b_elf_shdr *symtab_shdr;
-      unsigned int strtab_shndx;
-      const b_elf_shdr *strtab_shdr;
-      struct elf_syminfo_data *sdata;
-
-      symtab_shdr = &shdrs[symtab_shndx - 1];
-      strtab_shndx = symtab_shdr->sh_link;
-      if (strtab_shndx >= shnum)
-	{
-	  error_callback (data,
-			  "ELF symbol table strtab link out of range", 0);
-	  goto fail;
-	}
-      strtab_shdr = &shdrs[strtab_shndx - 1];
-
-      if (!backtrace_get_view (state, descriptor, symtab_shdr->sh_offset,
-			       symtab_shdr->sh_size, error_callback, data,
-			       &symtab_view))
-	goto fail;
-      symtab_view_valid = 1;
-
-      if (!backtrace_get_view (state, descriptor, strtab_shdr->sh_offset,
-			       strtab_shdr->sh_size, error_callback, data,
-			       &strtab_view))
-	goto fail;
-      strtab_view_valid = 1;
-
-      sdata = ((struct elf_syminfo_data *)
-	       backtrace_alloc (state, sizeof *sdata, error_callback, data));
-      if (sdata == NULL)
-	goto fail;
-
-      if (!elf_initialize_syminfo (state, base_address,
-				   symtab_view.data, symtab_shdr->sh_size,
-				   strtab_view.data, strtab_shdr->sh_size,
-				   error_callback, data, sdata))
-	{
-	  backtrace_free (state, sdata, sizeof *sdata, error_callback, data);
-	  goto fail;
-	}
-
-      /* We no longer need the symbol table, but we hold on to the
-	 string table permanently.  */
-      backtrace_release_view (state, &symtab_view, error_callback, data);
-
-      *found_sym = 1;
-
-      elf_add_syminfo_data (state, sdata);
-    }
-
-  /* FIXME: Need to handle compressed debug sections.  */
-
-  backtrace_release_view (state, &shdrs_view, error_callback, data);
-  shdrs_view_valid = 0;
-  backtrace_release_view (state, &names_view, error_callback, data);
-  names_view_valid = 0;
-
-  /* Read all the debug sections in a single view, since they are
-     probably adjacent in the file.  We never release this view.  */
-
-  min_offset = 0;
-  max_offset = 0;
-  for (i = 0; i < (int) DEBUG_MAX; ++i)
-    {
-      off_t end;
-
-      if (sections[i].size == 0)
-	continue;
-      if (min_offset == 0 || sections[i].offset < min_offset)
-	min_offset = sections[i].offset;
-      end = sections[i].offset + sections[i].size;
-      if (end > max_offset)
-	max_offset = end;
-    }
-  if (min_offset == 0 || max_offset == 0)
-    {
-      if (!backtrace_close (descriptor, error_callback, data))
-	goto fail;
-      *fileline_fn = elf_nodebug;
-      return 1;
-    }
-
-  if (!backtrace_get_view (state, descriptor, min_offset,
-			   max_offset - min_offset,
-			   error_callback, data, &debug_view))
-    goto fail;
-  debug_view_valid = 1;
-
-  /* We've read all we need from the executable.  */
-  if (!backtrace_close (descriptor, error_callback, data))
-    goto fail;
-  descriptor = -1;
-
-  for (i = 0; i < (int) DEBUG_MAX; ++i)
-    {
-      if (sections[i].size == 0)
-	sections[i].data = NULL;
-      else
-	sections[i].data = ((const unsigned char *) debug_view.data
-			    + (sections[i].offset - min_offset));
-    }
-
-  if (!backtrace_dwarf_add (state, base_address,
-			    sections[DEBUG_INFO].data,
-			    sections[DEBUG_INFO].size,
-			    sections[DEBUG_LINE].data,
-			    sections[DEBUG_LINE].size,
-			    sections[DEBUG_ABBREV].data,
-			    sections[DEBUG_ABBREV].size,
-			    sections[DEBUG_RANGES].data,
-			    sections[DEBUG_RANGES].size,
-			    sections[DEBUG_STR].data,
-			    sections[DEBUG_STR].size,
-			    ehdr.e_ident[EI_DATA] == ELFDATA2MSB,
-			    error_callback, data, fileline_fn))
-    goto fail;
-
-  *found_dwarf = 1;
-
-  return 1;
-
- fail:
-  if (shdrs_view_valid)
-    backtrace_release_view (state, &shdrs_view, error_callback, data);
-  if (names_view_valid)
-    backtrace_release_view (state, &names_view, error_callback, data);
-  if (symtab_view_valid)
-    backtrace_release_view (state, &symtab_view, error_callback, data);
-  if (strtab_view_valid)
-    backtrace_release_view (state, &strtab_view, error_callback, data);
-  if (debug_view_valid)
-    backtrace_release_view (state, &debug_view, error_callback, data);
-  if (descriptor != -1)
-    backtrace_close (descriptor, error_callback, data);
-  return 0;
-}
-
-/* Data passed to phdr_callback.  */
-
-struct phdr_data
-{
-  struct backtrace_state *state;
-  backtrace_error_callback error_callback;
-  void *data;
-  fileline *fileline_fn;
-  int *found_sym;
-  int *found_dwarf;
-  int exe_descriptor;
-};
-
-/* Callback passed to dl_iterate_phdr.  Load debug info from shared
-   libraries.  */
-
-static int
-phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED,
-	       void *pdata)
-{
-  struct phdr_data *pd = (struct phdr_data *) pdata;
-  int descriptor;
-  int does_not_exist;
-  fileline elf_fileline_fn;
-  int found_dwarf;
-
-  /* There is not much we can do if we don't have the module name,
-     unless executable is ET_DYN, where we expect the very first
-     phdr_callback to be for the PIE.  */
-  if (info->dlpi_name == NULL || info->dlpi_name[0] == '\0')
-    {
-      if (pd->exe_descriptor == -1)
-	return 0;
-      descriptor = pd->exe_descriptor;
-      pd->exe_descriptor = -1;
-    }
-  else
-    {
-      if (pd->exe_descriptor != -1)
-	{
-	  backtrace_close (pd->exe_descriptor, pd->error_callback, pd->data);
-	  pd->exe_descriptor = -1;
-	}
-
-      descriptor = backtrace_open (info->dlpi_name, pd->error_callback,
-				   pd->data, &does_not_exist);
-      if (descriptor < 0)
-	return 0;
-    }
-
-  if (elf_add (pd->state, descriptor, info->dlpi_addr, pd->error_callback,
-	       pd->data, &elf_fileline_fn, pd->found_sym, &found_dwarf, 0))
-    {
-      if (found_dwarf)
-	{
-	  *pd->found_dwarf = 1;
-	  *pd->fileline_fn = elf_fileline_fn;
-	}
-    }
-
-  return 0;
-}
-
-/* Initialize the backtrace data we need from an ELF executable.  At
-   the ELF level, all we need to do is find the debug info
-   sections.  */
-
-int
-backtrace_initialize (struct backtrace_state *state, int descriptor,
-		      backtrace_error_callback error_callback,
-		      void *data, fileline *fileline_fn)
-{
-  int ret;
-  int found_sym;
-  int found_dwarf;
-  fileline elf_fileline_fn;
-  struct phdr_data pd;
-
-  ret = elf_add (state, descriptor, 0, error_callback, data, &elf_fileline_fn,
-		 &found_sym, &found_dwarf, 1);
-  if (!ret)
-    return 0;
-
-  pd.state = state;
-  pd.error_callback = error_callback;
-  pd.data = data;
-  pd.fileline_fn = &elf_fileline_fn;
-  pd.found_sym = &found_sym;
-  pd.found_dwarf = &found_dwarf;
-  pd.exe_descriptor = ret < 0 ? descriptor : -1;
-
-  dl_iterate_phdr (phdr_callback, (void *) &pd);
-
-  if (!state->threaded)
-    {
-      if (found_sym)
-	state->syminfo_fn = elf_syminfo;
-      else if (state->syminfo_fn == NULL)
-	state->syminfo_fn = elf_nosyms;
-    }
-  else
-    {
-      if (found_sym)
-	backtrace_atomic_store_pointer (&state->syminfo_fn, elf_syminfo);
-      else
-	__sync_bool_compare_and_swap (&state->syminfo_fn, NULL, elf_nosyms);
-    }
-
-  if (!state->threaded)
-    {
-      if (state->fileline_fn == NULL || state->fileline_fn == elf_nodebug)
-	*fileline_fn = elf_fileline_fn;
-    }
-  else
-    {
-      fileline current_fn;
-
-      current_fn = backtrace_atomic_load_pointer (&state->fileline_fn);
-      if (current_fn == NULL || current_fn == elf_nodebug)
-	*fileline_fn = elf_fileline_fn;
-    }
-
-  return 1;
-}
diff --git a/third_party/gofrontend/libbacktrace/fileline.c b/third_party/gofrontend/libbacktrace/fileline.c
deleted file mode 100644
index 0acad06..0000000
--- a/third_party/gofrontend/libbacktrace/fileline.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/* fileline.c -- Get file and line number information in a backtrace.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-
-#include "backtrace.h"
-#include "internal.h"
-
-#ifndef HAVE_GETEXECNAME
-#define getexecname() NULL
-#endif
-
-/* Initialize the fileline information from the executable.  Returns 1
-   on success, 0 on failure.  */
-
-static int
-fileline_initialize (struct backtrace_state *state,
-		     backtrace_error_callback error_callback, void *data)
-{
-  int failed;
-  fileline fileline_fn;
-  int pass;
-  int called_error_callback;
-  int descriptor;
-
-  if (!state->threaded)
-    failed = state->fileline_initialization_failed;
-  else
-    failed = backtrace_atomic_load_int (&state->fileline_initialization_failed);
-
-  if (failed)
-    {
-      error_callback (data, "failed to read executable information", -1);
-      return 0;
-    }
-
-  if (!state->threaded)
-    fileline_fn = state->fileline_fn;
-  else
-    fileline_fn = backtrace_atomic_load_pointer (&state->fileline_fn);
-  if (fileline_fn != NULL)
-    return 1;
-
-  /* We have not initialized the information.  Do it now.  */
-
-  descriptor = -1;
-  called_error_callback = 0;
-  for (pass = 0; pass < 4; ++pass)
-    {
-      const char *filename;
-      int does_not_exist;
-
-      switch (pass)
-	{
-	case 0:
-	  filename = state->filename;
-	  break;
-	case 1:
-	  filename = getexecname ();
-	  break;
-	case 2:
-	  filename = "/proc/self/exe";
-	  break;
-	case 3:
-	  filename = "/proc/curproc/file";
-	  break;
-	default:
-	  abort ();
-	}
-
-      if (filename == NULL)
-	continue;
-
-      descriptor = backtrace_open (filename, error_callback, data,
-				   &does_not_exist);
-      if (descriptor < 0 && !does_not_exist)
-	{
-	  called_error_callback = 1;
-	  break;
-	}
-      if (descriptor >= 0)
-	break;
-    }
-
-  if (descriptor < 0)
-    {
-      if (!called_error_callback)
-	{
-	  if (state->filename != NULL)
-	    error_callback (data, state->filename, ENOENT);
-	  else
-	    error_callback (data,
-			    "libbacktrace could not find executable to open",
-			    0);
-	}
-      failed = 1;
-    }
-
-  if (!failed)
-    {
-      if (!backtrace_initialize (state, descriptor, error_callback, data,
-				 &fileline_fn))
-	failed = 1;
-    }
-
-  if (failed)
-    {
-      if (!state->threaded)
-	state->fileline_initialization_failed = 1;
-      else
-	backtrace_atomic_store_int (&state->fileline_initialization_failed, 1);
-      return 0;
-    }
-
-  if (!state->threaded)
-    state->fileline_fn = fileline_fn;
-  else
-    {
-      backtrace_atomic_store_pointer (&state->fileline_fn, fileline_fn);
-
-      /* Note that if two threads initialize at once, one of the data
-	 sets may be leaked.  */
-    }
-
-  return 1;
-}
-
-/* Given a PC, find the file name, line number, and function name.  */
-
-int
-backtrace_pcinfo (struct backtrace_state *state, uintptr_t pc,
-		  backtrace_full_callback callback,
-		  backtrace_error_callback error_callback, void *data)
-{
-  if (!fileline_initialize (state, error_callback, data))
-    return 0;
-
-  if (state->fileline_initialization_failed)
-    return 0;
-
-  return state->fileline_fn (state, pc, callback, error_callback, data);
-}
-
-/* Given a PC, find the symbol for it, and its value.  */
-
-int
-backtrace_syminfo (struct backtrace_state *state, uintptr_t pc,
-		   backtrace_syminfo_callback callback,
-		   backtrace_error_callback error_callback, void *data)
-{
-  if (!fileline_initialize (state, error_callback, data))
-    return 0;
-
-  if (state->fileline_initialization_failed)
-    return 0;
-
-  state->syminfo_fn (state, pc, callback, error_callback, data);
-  return 1;
-}
diff --git a/third_party/gofrontend/libbacktrace/filetype.awk b/third_party/gofrontend/libbacktrace/filetype.awk
deleted file mode 100644
index 0a656f7..0000000
--- a/third_party/gofrontend/libbacktrace/filetype.awk
+++ /dev/null
@@ -1,3 +0,0 @@
-# An awk script to determine the type of a file.
-/\177ELF\001/ { if (NR == 1) { print "elf32"; exit } }
-/\177ELF\002/ { if (NR == 1) { print "elf64"; exit } }
diff --git a/third_party/gofrontend/libbacktrace/internal.h b/third_party/gofrontend/libbacktrace/internal.h
deleted file mode 100644
index 30f99ca..0000000
--- a/third_party/gofrontend/libbacktrace/internal.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/* internal.h -- Internal header file for stack backtrace library.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#ifndef BACKTRACE_INTERNAL_H
-#define BACKTRACE_INTERNAL_H
-
-/* We assume that <sys/types.h> and "backtrace.h" have already been
-   included.  */
-
-#ifndef GCC_VERSION
-# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
-#endif
-
-#if (GCC_VERSION < 2007)
-# define __attribute__(x)
-#endif
-
-#ifndef ATTRIBUTE_UNUSED
-# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-#endif
-
-#ifndef ATTRIBUTE_MALLOC
-# if (GCC_VERSION >= 2096)
-#  define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
-# else
-#  define ATTRIBUTE_MALLOC
-# endif
-#endif
-
-#ifndef HAVE_SYNC_FUNCTIONS
-
-/* Define out the sync functions.  These should never be called if
-   they are not available.  */
-
-#define __sync_bool_compare_and_swap(A, B, C) (abort(), 1)
-#define __sync_lock_test_and_set(A, B) (abort(), 0)
-#define __sync_lock_release(A) abort()
-
-#endif /* !defined (HAVE_SYNC_FUNCTIONS) */
-
-#ifdef HAVE_ATOMIC_FUNCTIONS
-
-/* We have the atomic builtin functions.  */
-
-#define backtrace_atomic_load_pointer(p) \
-    __atomic_load_n ((p), __ATOMIC_ACQUIRE)
-#define backtrace_atomic_load_int(p) \
-    __atomic_load_n ((p), __ATOMIC_ACQUIRE)
-#define backtrace_atomic_store_pointer(p, v) \
-    __atomic_store_n ((p), (v), __ATOMIC_RELEASE)
-#define backtrace_atomic_store_size_t(p, v) \
-    __atomic_store_n ((p), (v), __ATOMIC_RELEASE)
-#define backtrace_atomic_store_int(p, v) \
-    __atomic_store_n ((p), (v), __ATOMIC_RELEASE)
-
-#else /* !defined (HAVE_ATOMIC_FUNCTIONS) */
-#ifdef HAVE_SYNC_FUNCTIONS
-
-/* We have the sync functions but not the atomic functions.  Define
-   the atomic ones in terms of the sync ones.  */
-
-extern void *backtrace_atomic_load_pointer (void *);
-extern int backtrace_atomic_load_int (int *);
-extern void backtrace_atomic_store_pointer (void *, void *);
-extern void backtrace_atomic_store_size_t (size_t *, size_t);
-extern void backtrace_atomic_store_int (int *, int);
-
-#else /* !defined (HAVE_SYNC_FUNCTIONS) */
-
-/* We have neither the sync nor the atomic functions.  These will
-   never be called.  */
-
-#define backtrace_atomic_load_pointer(p) (abort(), (void *) NULL)
-#define backtrace_atomic_load_int(p) (abort(), 0)
-#define backtrace_atomic_store_pointer(p, v) abort()
-#define backtrace_atomic_store_size_t(p, v) abort()
-#define backtrace_atomic_store_int(p, v) abort()
-
-#endif /* !defined (HAVE_SYNC_FUNCTIONS) */
-#endif /* !defined (HAVE_ATOMIC_FUNCTIONS) */
-
-/* The type of the function that collects file/line information.  This
-   is like backtrace_pcinfo.  */
-
-typedef int (*fileline) (struct backtrace_state *state, uintptr_t pc,
-			 backtrace_full_callback callback,
-			 backtrace_error_callback error_callback, void *data);
-
-/* The type of the function that collects symbol information.  This is
-   like backtrace_syminfo.  */
-
-typedef void (*syminfo) (struct backtrace_state *state, uintptr_t pc,
-			 backtrace_syminfo_callback callback,
-			 backtrace_error_callback error_callback, void *data);
-
-/* What the backtrace state pointer points to.  */
-
-struct backtrace_state
-{
-  /* The name of the executable.  */
-  const char *filename;
-  /* Non-zero if threaded.  */
-  int threaded;
-  /* The master lock for fileline_fn, fileline_data, syminfo_fn,
-     syminfo_data, fileline_initialization_failed and everything the
-     data pointers point to.  */
-  void *lock;
-  /* The function that returns file/line information.  */
-  fileline fileline_fn;
-  /* The data to pass to FILELINE_FN.  */
-  void *fileline_data;
-  /* The function that returns symbol information.  */
-  syminfo syminfo_fn;
-  /* The data to pass to SYMINFO_FN.  */
-  void *syminfo_data;
-  /* Whether initializing the file/line information failed.  */
-  int fileline_initialization_failed;
-  /* The lock for the freelist.  */
-  int lock_alloc;
-  /* The freelist when using mmap.  */
-  struct backtrace_freelist_struct *freelist;
-};
-
-/* Open a file for reading.  Returns -1 on error.  If DOES_NOT_EXIST
-   is not NULL, *DOES_NOT_EXIST will be set to 0 normally and set to 1
-   if the file does not exist.  If the file does not exist and
-   DOES_NOT_EXIST is not NULL, the function will return -1 and will
-   not call ERROR_CALLBACK.  On other errors, or if DOES_NOT_EXIST is
-   NULL, the function will call ERROR_CALLBACK before returning.  */
-extern int backtrace_open (const char *filename,
-			   backtrace_error_callback error_callback,
-			   void *data,
-			   int *does_not_exist);
-
-/* A view of the contents of a file.  This supports mmap when
-   available.  A view will remain in memory even after backtrace_close
-   is called on the file descriptor from which the view was
-   obtained.  */
-
-struct backtrace_view
-{
-  /* The data that the caller requested.  */
-  const void *data;
-  /* The base of the view.  */
-  void *base;
-  /* The total length of the view.  */
-  size_t len;
-};
-
-/* Create a view of SIZE bytes from DESCRIPTOR at OFFSET.  Store the
-   result in *VIEW.  Returns 1 on success, 0 on error.  */
-extern int backtrace_get_view (struct backtrace_state *state, int descriptor,
-			       off_t offset, size_t size,
-			       backtrace_error_callback error_callback,
-			       void *data, struct backtrace_view *view);
-
-/* Release a view created by backtrace_get_view.  */
-extern void backtrace_release_view (struct backtrace_state *state,
-				    struct backtrace_view *view,
-				    backtrace_error_callback error_callback,
-				    void *data);
-
-/* Close a file opened by backtrace_open.  Returns 1 on success, 0 on
-   error.  */
-
-extern int backtrace_close (int descriptor,
-			    backtrace_error_callback error_callback,
-			    void *data);
-
-/* Sort without using memory.  */
-
-extern void backtrace_qsort (void *base, size_t count, size_t size,
-			     int (*compar) (const void *, const void *));
-
-/* Allocate memory.  This is like malloc.  */
-
-extern void *backtrace_alloc (struct backtrace_state *state, size_t size,
-			      backtrace_error_callback error_callback,
-			      void *data) ATTRIBUTE_MALLOC;
-
-/* Free memory allocated by backtrace_alloc.  */
-
-extern void backtrace_free (struct backtrace_state *state, void *mem,
-			    size_t size,
-			    backtrace_error_callback error_callback,
-			    void *data);
-
-/* A growable vector of some struct.  This is used for more efficient
-   allocation when we don't know the final size of some group of data
-   that we want to represent as an array.  */
-
-struct backtrace_vector
-{
-  /* The base of the vector.  */
-  void *base;
-  /* The number of bytes in the vector.  */
-  size_t size;
-  /* The number of bytes available at the current allocation.  */
-  size_t alc;
-};
-
-/* Grow VEC by SIZE bytes.  Return a pointer to the newly allocated
-   bytes.  Note that this may move the entire vector to a new memory
-   location.  Returns NULL on failure.  */
-
-extern void *backtrace_vector_grow (struct backtrace_state *state, size_t size,
-				    backtrace_error_callback error_callback,
-				    void *data,
-				    struct backtrace_vector *vec);
-
-/* Finish the current allocation on VEC.  Prepare to start a new
-   allocation.  The finished allocation will never be freed.  Returns
-   a pointer to the base of the finished entries, or NULL on
-   failure.  */
-
-extern void* backtrace_vector_finish (struct backtrace_state *state,
-				      struct backtrace_vector *vec,
-				      backtrace_error_callback error_callback,
-				      void *data);
-
-/* Release any extra space allocated for VEC.  This may change
-   VEC->base.  Returns 1 on success, 0 on failure.  */
-
-extern int backtrace_vector_release (struct backtrace_state *state,
-				     struct backtrace_vector *vec,
-				     backtrace_error_callback error_callback,
-				     void *data);
-
-/* Read initial debug data from a descriptor, and set the
-   fileline_data, syminfo_fn, and syminfo_data fields of STATE.
-   Return the fileln_fn field in *FILELN_FN--this is done this way so
-   that the synchronization code is only implemented once.  This is
-   called after the descriptor has first been opened.  It will close
-   the descriptor if it is no longer needed.  Returns 1 on success, 0
-   on error.  There will be multiple implementations of this function,
-   for different file formats.  Each system will compile the
-   appropriate one.  */
-
-extern int backtrace_initialize (struct backtrace_state *state,
-				 int descriptor,
-				 backtrace_error_callback error_callback,
-				 void *data,
-				 fileline *fileline_fn);
-
-/* Add file/line information for a DWARF module.  */
-
-extern int backtrace_dwarf_add (struct backtrace_state *state,
-				uintptr_t base_address,
-				const unsigned char* dwarf_info,
-				size_t dwarf_info_size,
-				const unsigned char *dwarf_line,
-				size_t dwarf_line_size,
-				const unsigned char *dwarf_abbrev,
-				size_t dwarf_abbrev_size,
-				const unsigned char *dwarf_ranges,
-				size_t dwarf_range_size,
-				const unsigned char *dwarf_str,
-				size_t dwarf_str_size,
-				int is_bigendian,
-				backtrace_error_callback error_callback,
-				void *data, fileline *fileline_fn);
-
-#endif
diff --git a/third_party/gofrontend/libbacktrace/mmap.c b/third_party/gofrontend/libbacktrace/mmap.c
deleted file mode 100644
index 1ecf131..0000000
--- a/third_party/gofrontend/libbacktrace/mmap.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/* mmap.c -- Memory allocation with mmap.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/mman.h>
-
-#include "backtrace.h"
-#include "internal.h"
-
-/* Memory allocation on systems that provide anonymous mmap.  This
-   permits the backtrace functions to be invoked from a signal
-   handler, assuming that mmap is async-signal safe.  */
-
-#ifndef MAP_ANONYMOUS
-#define MAP_ANONYMOUS MAP_ANON
-#endif
-
-/* A list of free memory blocks.  */
-
-struct backtrace_freelist_struct
-{
-  /* Next on list.  */
-  struct backtrace_freelist_struct *next;
-  /* Size of this block, including this structure.  */
-  size_t size;
-};
-
-/* Free memory allocated by backtrace_alloc.  */
-
-static void
-backtrace_free_locked (struct backtrace_state *state, void *addr, size_t size)
-{
-  /* Just leak small blocks.  We don't have to be perfect.  */
-  if (size >= sizeof (struct backtrace_freelist_struct))
-    {
-      struct backtrace_freelist_struct *p;
-
-      p = (struct backtrace_freelist_struct *) addr;
-      p->next = state->freelist;
-      p->size = size;
-      state->freelist = p;
-    }
-}
-
-/* Allocate memory like malloc.  */
-
-void *
-backtrace_alloc (struct backtrace_state *state,
-		 size_t size, backtrace_error_callback error_callback,
-		 void *data)
-{
-  void *ret;
-  int locked;
-  struct backtrace_freelist_struct **pp;
-  size_t pagesize;
-  size_t asksize;
-  void *page;
-
-  ret = NULL;
-
-  /* If we can acquire the lock, then see if there is space on the
-     free list.  If we can't acquire the lock, drop straight into
-     using mmap.  __sync_lock_test_and_set returns the old state of
-     the lock, so we have acquired it if it returns 0.  */
-
-  if (!state->threaded)
-    locked = 1;
-  else
-    locked = __sync_lock_test_and_set (&state->lock_alloc, 1) == 0;
-
-  if (locked)
-    {
-      for (pp = &state->freelist; *pp != NULL; pp = &(*pp)->next)
-	{
-	  if ((*pp)->size >= size)
-	    {
-	      struct backtrace_freelist_struct *p;
-
-	      p = *pp;
-	      *pp = p->next;
-
-	      /* Round for alignment; we assume that no type we care about
-		 is more than 8 bytes.  */
-	      size = (size + 7) & ~ (size_t) 7;
-	      if (size < p->size)
-		backtrace_free_locked (state, (char *) p + size,
-				       p->size - size);
-
-	      ret = (void *) p;
-
-	      break;
-	    }
-	}
-
-      if (state->threaded)
-	__sync_lock_release (&state->lock_alloc);
-    }
-
-  if (ret == NULL)
-    {
-      /* Allocate a new page.  */
-
-      pagesize = getpagesize ();
-      asksize = (size + pagesize - 1) & ~ (pagesize - 1);
-      page = mmap (NULL, asksize, PROT_READ | PROT_WRITE,
-		   MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-      if (page == NULL)
-	error_callback (data, "mmap", errno);
-      else
-	{
-	  size = (size + 7) & ~ (size_t) 7;
-	  if (size < asksize)
-	    backtrace_free (state, (char *) page + size, asksize - size,
-			    error_callback, data);
-
-	  ret = page;
-	}
-    }
-
-  return ret;
-}
-
-/* Free memory allocated by backtrace_alloc.  */
-
-void
-backtrace_free (struct backtrace_state *state, void *addr, size_t size,
-		backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
-		void *data ATTRIBUTE_UNUSED)
-{
-  int locked;
-
-  /* If we are freeing a large aligned block, just release it back to
-     the system.  This case arises when growing a vector for a large
-     binary with lots of debug info.  Calling munmap here may cause us
-     to call mmap again if there is also a large shared library; we
-     just live with that.  */
-  if (size >= 16 * 4096)
-    {
-      size_t pagesize;
-
-      pagesize = getpagesize ();
-      if (((uintptr_t) addr & (pagesize - 1)) == 0
-	  && (size & (pagesize - 1)) == 0)
-	{
-	  /* If munmap fails for some reason, just add the block to
-	     the freelist.  */
-	  if (munmap (addr, size) == 0)
-	    return;
-	}
-    }
-
-  /* If we can acquire the lock, add the new space to the free list.
-     If we can't acquire the lock, just leak the memory.
-     __sync_lock_test_and_set returns the old state of the lock, so we
-     have acquired it if it returns 0.  */
-
-  if (!state->threaded)
-    locked = 1;
-  else
-    locked = __sync_lock_test_and_set (&state->lock_alloc, 1) == 0;
-
-  if (locked)
-    {
-      backtrace_free_locked (state, addr, size);
-
-      if (state->threaded)
-	__sync_lock_release (&state->lock_alloc);
-    }
-}
-
-/* Grow VEC by SIZE bytes.  */
-
-void *
-backtrace_vector_grow (struct backtrace_state *state,size_t size,
-		       backtrace_error_callback error_callback,
-		       void *data, struct backtrace_vector *vec)
-{
-  void *ret;
-
-  if (size > vec->alc)
-    {
-      size_t pagesize;
-      size_t alc;
-      void *base;
-
-      pagesize = getpagesize ();
-      alc = vec->size + size;
-      if (vec->size == 0)
-	alc = 16 * size;
-      else if (alc < pagesize)
-	{
-	  alc *= 2;
-	  if (alc > pagesize)
-	    alc = pagesize;
-	}
-      else
-	{
-	  alc *= 2;
-	  alc = (alc + pagesize - 1) & ~ (pagesize - 1);
-	}
-      base = backtrace_alloc (state, alc, error_callback, data);
-      if (base == NULL)
-	return NULL;
-      if (vec->base != NULL)
-	{
-	  memcpy (base, vec->base, vec->size);
-	  backtrace_free (state, vec->base, vec->size + vec->alc,
-			  error_callback, data);
-	}
-      vec->base = base;
-      vec->alc = alc - vec->size;
-    }
-
-  ret = (char *) vec->base + vec->size;
-  vec->size += size;
-  vec->alc -= size;
-  return ret;
-}
-
-/* Finish the current allocation on VEC.  */
-
-void *
-backtrace_vector_finish (
-  struct backtrace_state *state ATTRIBUTE_UNUSED,
-  struct backtrace_vector *vec,
-  backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
-  void *data ATTRIBUTE_UNUSED)
-{
-  void *ret;
-
-  ret = vec->base;
-  vec->base = (char *) vec->base + vec->size;
-  vec->size = 0;
-  return ret;
-}
-
-/* Release any extra space allocated for VEC.  */
-
-int
-backtrace_vector_release (struct backtrace_state *state,
-			  struct backtrace_vector *vec,
-			  backtrace_error_callback error_callback,
-			  void *data)
-{
-  size_t size;
-  size_t alc;
-  size_t aligned;
-
-  /* Make sure that the block that we free is aligned on an 8-byte
-     boundary.  */
-  size = vec->size;
-  alc = vec->alc;
-  aligned = (size + 7) & ~ (size_t) 7;
-  alc -= aligned - size;
-
-  backtrace_free (state, (char *) vec->base + aligned, alc,
-		  error_callback, data);
-  vec->alc = 0;
-  return 1;
-}
diff --git a/third_party/gofrontend/libbacktrace/mmapio.c b/third_party/gofrontend/libbacktrace/mmapio.c
deleted file mode 100644
index b5a787e..0000000
--- a/third_party/gofrontend/libbacktrace/mmapio.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/* mmapio.c -- File views using mmap.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <unistd.h>
-
-#include "backtrace.h"
-#include "internal.h"
-
-#ifndef MAP_FAILED
-#define MAP_FAILED ((void *)-1)
-#endif
-
-/* This file implements file views and memory allocation when mmap is
-   available.  */
-
-/* Create a view of SIZE bytes from DESCRIPTOR at OFFSET.  */
-
-int
-backtrace_get_view (struct backtrace_state *state ATTRIBUTE_UNUSED,
-		    int descriptor, off_t offset, size_t size,
-		    backtrace_error_callback error_callback,
-		    void *data, struct backtrace_view *view)
-{
-  size_t pagesize;
-  unsigned int inpage;
-  off_t pageoff;
-  void *map;
-
-  pagesize = getpagesize ();
-  inpage = offset % pagesize;
-  pageoff = offset - inpage;
-
-  size += inpage;
-  size = (size + (pagesize - 1)) & ~ (pagesize - 1);
-
-  map = mmap (NULL, size, PROT_READ, MAP_PRIVATE, descriptor, pageoff);
-  if (map == MAP_FAILED)
-    {
-      error_callback (data, "mmap", errno);
-      return 0;
-    }
-
-  view->data = (char *) map + inpage;
-  view->base = map;
-  view->len = size;
-
-  return 1;
-}
-
-/* Release a view read by backtrace_get_view.  */
-
-void
-backtrace_release_view (struct backtrace_state *state ATTRIBUTE_UNUSED,
-			struct backtrace_view *view,
-			backtrace_error_callback error_callback,
-			void *data)
-{
-  union {
-    const void *cv;
-    void *v;
-  } const_cast;
-
-  const_cast.cv = view->base;
-  if (munmap (const_cast.v, view->len) < 0)
-    error_callback (data, "munmap", errno);
-}
diff --git a/third_party/gofrontend/libbacktrace/nounwind.c b/third_party/gofrontend/libbacktrace/nounwind.c
deleted file mode 100644
index f53f906..0000000
--- a/third_party/gofrontend/libbacktrace/nounwind.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* backtrace.c -- Entry point for stack backtrace library.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <sys/types.h>
-
-#include "backtrace.h"
-
-#include "internal.h"
-
-/* This source file is compiled if the unwind library is not
-   available.  */
-
-int
-backtrace_full (struct backtrace_state *state ATTRIBUTE_UNUSED,
-		int skip ATTRIBUTE_UNUSED,
-		backtrace_full_callback callback ATTRIBUTE_UNUSED,
-		backtrace_error_callback error_callback, void *data)
-{
-  error_callback (data,
-		  "no stack trace because unwind library not available",
-		  0);
-  return 0;
-}
-
-int
-backtrace_simple (struct backtrace_state *state ATTRIBUTE_UNUSED,
-		  int skip ATTRIBUTE_UNUSED,
-		  backtrace_simple_callback callback ATTRIBUTE_UNUSED,
-		  backtrace_error_callback error_callback, void *data)
-{
-  error_callback (data,
-		  "no stack trace because unwind library not available",
-		  0);
-  return 0;
-}
diff --git a/third_party/gofrontend/libbacktrace/posix.c b/third_party/gofrontend/libbacktrace/posix.c
deleted file mode 100644
index 7fa7cd0..0000000
--- a/third_party/gofrontend/libbacktrace/posix.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/* posix.c -- POSIX file I/O routines for the backtrace library.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-#include "backtrace.h"
-#include "internal.h"
-
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
-
-#ifndef O_CLOEXEC
-#define O_CLOEXEC 0
-#endif
-
-#ifndef FD_CLOEXEC
-#define FD_CLOEXEC 1
-#endif
-
-/* Open a file for reading.  */
-
-int
-backtrace_open (const char *filename, backtrace_error_callback error_callback,
-		void *data, int *does_not_exist)
-{
-  int descriptor;
-
-  if (does_not_exist != NULL)
-    *does_not_exist = 0;
-
-  descriptor = open (filename, O_RDONLY | O_BINARY | O_CLOEXEC);
-  if (descriptor < 0)
-    {
-      if (does_not_exist != NULL && errno == ENOENT)
-	*does_not_exist = 1;
-      else
-	error_callback (data, filename, errno);
-      return -1;
-    }
-
-#ifdef HAVE_FCNTL
-  /* Set FD_CLOEXEC just in case the kernel does not support
-     O_CLOEXEC. It doesn't matter if this fails for some reason.
-     FIXME: At some point it should be safe to only do this if
-     O_CLOEXEC == 0.  */
-  fcntl (descriptor, F_SETFD, FD_CLOEXEC);
-#endif
-
-  return descriptor;
-}
-
-/* Close DESCRIPTOR.  */
-
-int
-backtrace_close (int descriptor, backtrace_error_callback error_callback,
-		 void *data)
-{
-  if (close (descriptor) < 0)
-    {
-      error_callback (data, "close", errno);
-      return 0;
-    }
-  return 1;
-}
diff --git a/third_party/gofrontend/libbacktrace/print.c b/third_party/gofrontend/libbacktrace/print.c
deleted file mode 100644
index 90ecaf8..0000000
--- a/third_party/gofrontend/libbacktrace/print.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* print.c -- Print the current backtrace.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "backtrace.h"
-#include "internal.h"
-
-/* Passed to callbacks.  */
-
-struct print_data
-{
-  struct backtrace_state *state;
-  FILE *f;
-};
-
-/* Print one level of a backtrace.  */
-
-static int
-print_callback (void *data, uintptr_t pc, const char *filename, int lineno,
-		const char *function)
-{
-  struct print_data *pdata = (struct print_data *) data;
-
-  fprintf (pdata->f, "0x%lx %s\n\t%s:%d\n",
-	   (unsigned long) pc,
-	   function == NULL ? "???" : function,
-	   filename == NULL ? "???" : filename,
-	   lineno);
-  return 0;
-}
-
-/* Print errors to stderr.  */
-
-static void
-error_callback (void *data, const char *msg, int errnum)
-{
-  struct print_data *pdata = (struct print_data *) data;
-
-  if (pdata->state->filename != NULL)
-    fprintf (stderr, "%s: ", pdata->state->filename);
-  fprintf (stderr, "libbacktrace: %s", msg);
-  if (errnum > 0)
-    fprintf (stderr, ": %s", strerror (errnum));
-  fputc ('\n', stderr);
-}
-
-/* Print a backtrace.  */
-
-void
-backtrace_print (struct backtrace_state *state, int skip, FILE *f)
-{
-  struct print_data data;
-
-  data.state = state;
-  data.f = f;
-  backtrace_full (state, skip + 1, print_callback, error_callback,
-		  (void *) &data);
-}
diff --git a/third_party/gofrontend/libbacktrace/read.c b/third_party/gofrontend/libbacktrace/read.c
deleted file mode 100644
index 299f77b..0000000
--- a/third_party/gofrontend/libbacktrace/read.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/* read.c -- File views without mmap.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <errno.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "backtrace.h"
-#include "internal.h"
-
-/* This file implements file views when mmap is not available.  */
-
-/* Create a view of SIZE bytes from DESCRIPTOR at OFFSET.  */
-
-int
-backtrace_get_view (struct backtrace_state *state, int descriptor,
-		    off_t offset, size_t size,
-		    backtrace_error_callback error_callback,
-		    void *data, struct backtrace_view *view)
-{
-  ssize_t got;
-
-  if (lseek (descriptor, offset, SEEK_SET) < 0)
-    {
-      error_callback (data, "lseek", errno);
-      return 0;
-    }
-
-  view->base = backtrace_alloc (state, size, error_callback, data);
-  if (view->base == NULL)
-    return 0;
-  view->data = view->base;
-  view->len = size;
-
-  got = read (descriptor, view->base, size);
-  if (got < 0)
-    {
-      error_callback (data, "read", errno);
-      free (view->base);
-      return 0;
-    }
-
-  if ((size_t) got < size)
-    {
-      error_callback (data, "file too short", 0);
-      free (view->base);
-      return 0;
-    }
-
-  return 1;
-}
-
-/* Release a view read by backtrace_get_view.  */
-
-void
-backtrace_release_view (struct backtrace_state *state,
-			struct backtrace_view *view,
-			backtrace_error_callback error_callback,
-			void *data)
-{
-  backtrace_free (state, view->base, view->len, error_callback, data);
-  view->data = NULL;
-  view->base = NULL;
-}
diff --git a/third_party/gofrontend/libbacktrace/simple.c b/third_party/gofrontend/libbacktrace/simple.c
deleted file mode 100644
index 39c2e90..0000000
--- a/third_party/gofrontend/libbacktrace/simple.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/* simple.c -- The backtrace_simple function.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include "unwind.h"
-#include "backtrace.h"
-
-/* The simple_backtrace routine.  */
-
-/* Data passed through _Unwind_Backtrace.  */
-
-struct backtrace_simple_data
-{
-  /* Number of frames to skip.  */
-  int skip;
-  /* Library state.  */
-  struct backtrace_state *state;
-  /* Callback routine.  */
-  backtrace_simple_callback callback;
-  /* Error callback routine.  */
-  backtrace_error_callback error_callback;
-  /* Data to pass to callback routine.  */
-  void *data;
-  /* Value to return from backtrace.  */
-  int ret;
-};
-
-/* Unwind library callback routine.  This is passd to
-   _Unwind_Backtrace.  */
-
-static _Unwind_Reason_Code
-simple_unwind (struct _Unwind_Context *context, void *vdata)
-{
-  struct backtrace_simple_data *bdata = (struct backtrace_simple_data *) vdata;
-  uintptr_t pc;
-  int ip_before_insn = 0;
-
-#ifdef HAVE_GETIPINFO
-  pc = _Unwind_GetIPInfo (context, &ip_before_insn);
-#else
-  pc = _Unwind_GetIP (context);
-#endif
-
-  if (bdata->skip > 0)
-    {
-      --bdata->skip;
-      return _URC_NO_REASON;
-    }
-
-  if (!ip_before_insn)
-    --pc;
-
-  bdata->ret = bdata->callback (bdata->data, pc);
-
-  if (bdata->ret != 0)
-    return _URC_END_OF_STACK;
-
-  return _URC_NO_REASON;
-}
-
-/* Get a simple stack backtrace.  */
-
-int
-backtrace_simple (struct backtrace_state *state, int skip,
-		  backtrace_simple_callback callback,
-		  backtrace_error_callback error_callback, void *data)
-{
-  struct backtrace_simple_data bdata;
-
-  bdata.skip = skip + 1;
-  bdata.state = state;
-  bdata.callback = callback;
-  bdata.error_callback = error_callback;
-  bdata.data = data;
-  bdata.ret = 0;
-  _Unwind_Backtrace (simple_unwind, &bdata);
-  return bdata.ret;
-}
diff --git a/third_party/gofrontend/libbacktrace/sort.c b/third_party/gofrontend/libbacktrace/sort.c
deleted file mode 100644
index bcc765e..0000000
--- a/third_party/gofrontend/libbacktrace/sort.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/* sort.c -- Sort without allocating memory
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <stddef.h>
-#include <sys/types.h>
-
-#include "backtrace.h"
-#include "internal.h"
-
-/* The GNU glibc version of qsort allocates memory, which we must not
-   do if we are invoked by a signal handler.  So provide our own
-   sort.  */
-
-static void
-swap (char *a, char *b, size_t size)
-{
-  size_t i;
-
-  for (i = 0; i < size; i++, a++, b++)
-    {
-      char t;
-
-      t = *a;
-      *a = *b;
-      *b = t;
-    }
-}
-
-void
-backtrace_qsort (void *basearg, size_t count, size_t size,
-		 int (*compar) (const void *, const void *))
-{
-  char *base = (char *) basearg;
-  size_t i;
-  size_t mid;
-
- tail_recurse:
-  if (count < 2)
-    return;
-
-  /* The symbol table and DWARF tables, which is all we use this
-     routine for, tend to be roughly sorted.  Pick the middle element
-     in the array as our pivot point, so that we are more likely to
-     cut the array in half for each recursion step.  */
-  swap (base, base + (count / 2) * size, size);
-
-  mid = 0;
-  for (i = 1; i < count; i++)
-    {
-      if ((*compar) (base, base + i * size) > 0)
-	{
-	  ++mid;
-	  if (i != mid)
-	    swap (base + mid * size, base + i * size, size);
-	}
-    }
-
-  if (mid > 0)
-    swap (base, base + mid * size, size);
-
-  /* Recurse with the smaller array, loop with the larger one.  That
-     ensures that our maximum stack depth is log count.  */
-  if (2 * mid < count)
-    {
-      backtrace_qsort (base, mid, size, compar);
-      base += (mid + 1) * size;
-      count -= mid + 1;
-      goto tail_recurse;
-    }
-  else
-    {
-      backtrace_qsort (base + (mid + 1) * size, count - (mid + 1),
-		       size, compar);
-      count = mid;
-      goto tail_recurse;
-    }
-}
diff --git a/third_party/gofrontend/libbacktrace/state.c b/third_party/gofrontend/libbacktrace/state.c
deleted file mode 100644
index a846378..0000000
--- a/third_party/gofrontend/libbacktrace/state.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/* state.c -- Create the backtrace state.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <string.h>
-#include <sys/types.h>
-
-#include "backtrace.h"
-#include "backtrace-supported.h"
-#include "internal.h"
-
-/* Create the backtrace state.  This will then be passed to all the
-   other routines.  */
-
-struct backtrace_state *
-backtrace_create_state (const char *filename, int threaded,
-			backtrace_error_callback error_callback,
-			void *data)
-{
-  struct backtrace_state init_state;
-  struct backtrace_state *state;
-
-#ifndef HAVE_SYNC_FUNCTIONS
-  if (threaded)
-    {
-      error_callback (data, "backtrace library does not support threads", 0);
-      return NULL;
-    }
-#endif
-
-  memset (&init_state, 0, sizeof init_state);
-  init_state.filename = filename;
-  init_state.threaded = threaded;
-
-  state = ((struct backtrace_state *)
-	   backtrace_alloc (&init_state, sizeof *state, error_callback, data));
-  if (state == NULL)
-    return NULL;
-  *state = init_state;
-
-  return state;
-}
diff --git a/third_party/gofrontend/libbacktrace/stest.c b/third_party/gofrontend/libbacktrace/stest.c
deleted file mode 100644
index ec93e68..0000000
--- a/third_party/gofrontend/libbacktrace/stest.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/* stest.c -- Test for libbacktrace internal sort function
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "backtrace.h"
-#include "internal.h"
-
-/* Test the local qsort implementation.  */
-
-#define MAX 10
-
-struct test
-{
-  size_t count;
-  int input[MAX];
-  int output[MAX];
-};
-
-static struct test tests[] =
-  {
-    {
-      10,
-      { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
-      { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
-    },
-    {
-      9,
-      { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
-      { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
-    },
-    {
-      10,
-      { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 },
-      { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
-    },
-    {
-      9,
-      { 9, 8, 7, 6, 5, 4, 3, 2, 1 },
-      { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
-    },
-    {
-      10,
-      { 2, 4, 6, 8, 10, 1, 3, 5, 7, 9 },
-      { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },
-    },
-    {
-      5,
-      { 4, 5, 3, 1, 2 },
-      { 1, 2, 3, 4, 5 },
-    },
-    {
-      5,
-      { 1, 1, 1, 1, 1 },
-      { 1, 1, 1, 1, 1 },
-    },
-    {
-      5,
-      { 1, 1, 2, 1, 1 },
-      { 1, 1, 1, 1, 2 },
-    },
-    {
-      5,
-      { 2, 1, 1, 1, 1 },
-      { 1, 1, 1, 1, 2 },
-    },
-  };
-
-static int
-compare (const void *a, const void *b)
-{
-  const int *ai = (const int *) a;
-  const int *bi = (const int *) b;
-
-  return *ai - *bi;
-}
-
-int
-main (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
-{
-  int failures;
-  size_t i;
-  int a[MAX];
-
-  failures = 0;
-  for (i = 0; i < sizeof tests / sizeof tests[0]; i++)
-    {
-      memcpy (a, tests[i].input, tests[i].count * sizeof (int));
-      backtrace_qsort (a, tests[i].count, sizeof (int), compare);
-      if (memcmp (a, tests[i].output, tests[i].count * sizeof (int)) != 0)
-	{
-	  size_t j;
-
-	  fprintf (stderr, "test %d failed:", (int) i);
-	  for (j = 0; j < tests[i].count; j++)
-	    fprintf (stderr, " %d", a[j]);
-	  fprintf (stderr, "\n");
-	  ++failures;
-	}
-    }
-
-  exit (failures > 0 ? EXIT_FAILURE : EXIT_SUCCESS);
-}
diff --git a/third_party/gofrontend/libbacktrace/unknown.c b/third_party/gofrontend/libbacktrace/unknown.c
deleted file mode 100644
index e89cba9..0000000
--- a/third_party/gofrontend/libbacktrace/unknown.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* unknown.c -- used when backtrace configury does not know file format.
-   Copyright (C) 2012-2015 Free Software Foundation, Inc.
-   Written by Ian Lance Taylor, Google.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    (1) Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer. 
-
-    (2) 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.  
-    
-    (3) The name of the author may not be used to
-    endorse or promote products derived from this software without
-    specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.  */
-
-#include "config.h"
-
-#include <sys/types.h>
-
-#include "backtrace.h"
-#include "internal.h"
-
-/* A trivial routine that always fails to find fileline data.  */
-
-static int
-unknown_fileline (struct backtrace_state *state ATTRIBUTE_UNUSED,
-		  uintptr_t pc, backtrace_full_callback callback,
-		  backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
-		  void *data)
-
-{
-  return callback (data, pc, NULL, 0, NULL);
-}
-
-/* Initialize the backtrace data when we don't know how to read the
-   debug info.  */
-
-int
-backtrace_initialize (struct backtrace_state *state ATTRIBUTE_UNUSED,
-		      int descriptor ATTRIBUTE_UNUSED,
-		      backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
-		      void *data ATTRIBUTE_UNUSED, fileline *fileline_fn)
-{
-  state->fileline_data = NULL;
-  *fileline_fn = unknown_fileline;
-  return 1;
-}
diff --git a/third_party/gofrontend/libffi/ChangeLog.libffi b/third_party/gofrontend/libffi/ChangeLog.libffi
deleted file mode 100644
index f3ee8b0..0000000
--- a/third_party/gofrontend/libffi/ChangeLog.libffi
+++ /dev/null
@@ -1,584 +0,0 @@
-2011-02-08  Andreas Tobler  <andreast@fgznet.ch>
-
-	* testsuite/lib/libffi.exp: Tweak for stand-alone mode.
-
-2009-12-25  Samuli Suominen  <ssuominen@gentoo.org>
-
-	* configure.ac: Undefine _AC_ARG_VAR_PRECIOUS for autoconf 2.64.
-	* configure: Rebuilt.
-	* fficonfig.h.in: Rebuilt.
-
-2009-06-16  Andrew Haley  <aph@redhat.com>
-
-	* testsuite/libffi.call/cls_align_sint64.c,
-	testsuite/libffi.call/cls_align_uint64.c,
-	testsuite/libffi.call/cls_longdouble_va.c,
-	testsuite/libffi.call/cls_ulonglong.c,
-	testsuite/libffi.call/return_ll1.c,
-	testsuite/libffi.call/stret_medium2.c: Fix printf format
-	specifiers.
-	* testsuite/libffi.call/huge_struct.c: Ad x86 XFAILs.
-	* testsuite/libffi.call/float2.c: Fix dg-excess-errors.
-	* testsuite/libffi.call/ffitest.h,
-	testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define.
-
-2009-06-12  Andrew Haley  <aph@redhat.com>
-
-	* testsuite/libffi.call/cls_align_sint64.c,
-	testsuite/libffi.call/cls_align_uint64.c,
-	testsuite/libffi.call/cls_ulonglong.c,
-	testsuite/libffi.call/return_ll1.c,
-	testsuite/libffi.call/stret_medium2.c: Fix printf format
-	specifiers.
-	testsuite/libffi.special/unwindtest.cc: include stdint.h.
-
-2009-06-11  Timothy Wall  <twall@users.sf.net>
-
-	* Makefile.am,
-        configure.ac,
-        include/ffi.h.in,
-        include/ffi_common.h,
-        src/closures.c,
-        src/dlmalloc.c,
-        src/x86/ffi.c,
-        src/x86/ffitarget.h,
-        src/x86/win64.S (new),
-	README: Added win64 support (mingw or MSVC)
-        * Makefile.in,
-        include/Makefile.in,
-        man/Makefile.in,
-        testsuite/Makefile.in,
-        configure,
-        aclocal.m4: Regenerated
-        * ltcf-c.sh: properly escape cygwin/w32 path
-        * man/ffi_call.3: Clarify size requirements for return value.
-        * src/x86/ffi64.c: Fix filename in comment.
-        * src/x86/win32.S: Remove unused extern.
-
-        * testsuite/libffi.call/closure_fn0.c,
-        testsuite/libffi.call/closure_fn1.c,
-        testsuite/libffi.call/closure_fn2.c,
-        testsuite/libffi.call/closure_fn3.c,
-        testsuite/libffi.call/closure_fn4.c,
-        testsuite/libffi.call/closure_fn5.c,
-        testsuite/libffi.call/closure_fn6.c,
-	testsuite/libffi.call/closure_stdcall.c,
-	testsuite/libffi.call/cls_12byte.c,
-	testsuite/libffi.call/cls_16byte.c,
-	testsuite/libffi.call/cls_18byte.c,
-	testsuite/libffi.call/cls_19byte.c,
-	testsuite/libffi.call/cls_1_1byte.c,
-	testsuite/libffi.call/cls_20byte.c,
-	testsuite/libffi.call/cls_20byte1.c,
-	testsuite/libffi.call/cls_24byte.c,
-	testsuite/libffi.call/cls_2byte.c,
-	testsuite/libffi.call/cls_3_1byte.c,
-	testsuite/libffi.call/cls_3byte1.c,
- 	testsuite/libffi.call/cls_3byte2.c,
- 	testsuite/libffi.call/cls_4_1byte.c,
- 	testsuite/libffi.call/cls_4byte.c,
- 	testsuite/libffi.call/cls_5_1_byte.c,
- 	testsuite/libffi.call/cls_5byte.c,
- 	testsuite/libffi.call/cls_64byte.c,
- 	testsuite/libffi.call/cls_6_1_byte.c,
- 	testsuite/libffi.call/cls_6byte.c,
- 	testsuite/libffi.call/cls_7_1_byte.c,
- 	testsuite/libffi.call/cls_7byte.c,
- 	testsuite/libffi.call/cls_8byte.c,
- 	testsuite/libffi.call/cls_9byte1.c,
- 	testsuite/libffi.call/cls_9byte2.c,
- 	testsuite/libffi.call/cls_align_double.c,
- 	testsuite/libffi.call/cls_align_float.c,
- 	testsuite/libffi.call/cls_align_longdouble.c,
- 	testsuite/libffi.call/cls_align_longdouble_split.c,
- 	testsuite/libffi.call/cls_align_longdouble_split2.c,
- 	testsuite/libffi.call/cls_align_pointer.c,
- 	testsuite/libffi.call/cls_align_sint16.c,
- 	testsuite/libffi.call/cls_align_sint32.c,
- 	testsuite/libffi.call/cls_align_sint64.c,
- 	testsuite/libffi.call/cls_align_uint16.c,
- 	testsuite/libffi.call/cls_align_uint32.c,
- 	testsuite/libffi.call/cls_align_uint64.c,
- 	testsuite/libffi.call/cls_dbls_struct.c,
- 	testsuite/libffi.call/cls_double.c,
- 	testsuite/libffi.call/cls_double_va.c,
- 	testsuite/libffi.call/cls_float.c,
- 	testsuite/libffi.call/cls_longdouble.c,
- 	testsuite/libffi.call/cls_longdouble_va.c,
- 	testsuite/libffi.call/cls_multi_schar.c,
- 	testsuite/libffi.call/cls_multi_sshort.c,
- 	testsuite/libffi.call/cls_multi_sshortchar.c,
- 	testsuite/libffi.call/cls_multi_uchar.c,
- 	testsuite/libffi.call/cls_multi_ushort.c,
- 	testsuite/libffi.call/cls_multi_ushortchar.c,
- 	testsuite/libffi.call/cls_pointer.c,
- 	testsuite/libffi.call/cls_pointer_stack.c,
- 	testsuite/libffi.call/cls_schar.c,
- 	testsuite/libffi.call/cls_sint.c,
- 	testsuite/libffi.call/cls_sshort.c,
- 	testsuite/libffi.call/cls_uchar.c,
- 	testsuite/libffi.call/cls_uint.c,
- 	testsuite/libffi.call/cls_ulonglong.c,
- 	testsuite/libffi.call/cls_ushort.c,
- 	testsuite/libffi.call/err_bad_abi.c,
- 	testsuite/libffi.call/err_bad_typedef.c,
- 	testsuite/libffi.call/float2.c,
- 	testsuite/libffi.call/huge_struct.c,
- 	testsuite/libffi.call/nested_struct.c,
- 	testsuite/libffi.call/nested_struct1.c,
- 	testsuite/libffi.call/nested_struct10.c,
- 	testsuite/libffi.call/nested_struct2.c,
- 	testsuite/libffi.call/nested_struct3.c,
- 	testsuite/libffi.call/nested_struct4.c,
- 	testsuite/libffi.call/nested_struct5.c,
- 	testsuite/libffi.call/nested_struct6.c,
- 	testsuite/libffi.call/nested_struct7.c,
- 	testsuite/libffi.call/nested_struct8.c,
- 	testsuite/libffi.call/nested_struct9.c,
- 	testsuite/libffi.call/problem1.c,
- 	testsuite/libffi.call/return_ldl.c,
- 	testsuite/libffi.call/return_ll1.c,
- 	testsuite/libffi.call/stret_large.c,
- 	testsuite/libffi.call/stret_large2.c,
- 	testsuite/libffi.call/stret_medium.c,
- 	testsuite/libffi.call/stret_medium2.c,
-        testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead
-        of checking for MMAP.  Use intptr_t instead of long casts.
-
-2009-06-04  Andrew Haley  <aph@redhat.com>
-
-	* src/powerpc/ffitarget.h: Fix misapplied merge from gcc.
-
-2009-06-04  Andrew Haley  <aph@redhat.com>
-
-	* src/mips/o32.S,
-	src/mips/n32.S: Fix licence formatting.
-
-2009-06-04  Andrew Haley  <aph@redhat.com>
-
-	* src/x86/darwin.S: Fix licence formatting.
-	src/x86/win32.S: Likewise.
-	src/sh64/sysv.S: Likewise.
-	src/sh/sysv.S: Likewise.
-
-2009-06-04  Andrew Haley  <aph@redhat.com>
-
-	* src/sh64/ffi.c: Remove lint directives.  Was missing from merge
-	of Andreas Tobler's patch from 2006-04-22.
-	
-2009-06-04  Andrew Haley  <aph@redhat.com>
-
-	* src/sh/ffi.c: Apply missing hunk from Alexandre Oliva's patch of
-	2007-03-07.
-
-2008-12-26  Timothy Wall  <twall@users.sf.net>
-
-	* testsuite/libffi.call/cls_longdouble.c,
-        testsuite/libffi.call/cls_longdouble_va.c,
-        testsuite/libffi.call/cls_align_longdouble.c,
-        testsuite/libffi.call/cls_align_longdouble_split.c,
-        testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected
-        failures on x86_64 cygwin/mingw.
-
-2008-12-22  Timothy Wall  <twall@users.sf.net>
-
-	* testsuite/libffi.call/closure_fn0.c,
-        testsuite/libffi.call/closure_fn1.c,    
-        testsuite/libffi.call/closure_fn2.c,    
-        testsuite/libffi.call/closure_fn3.c,    
-        testsuite/libffi.call/closure_fn4.c,    
-        testsuite/libffi.call/closure_fn5.c,    
-        testsuite/libffi.call/closure_fn6.c,    
-        testsuite/libffi.call/closure_loc_fn0.c,    
-        testsuite/libffi.call/closure_stdcall.c,    
-        testsuite/libffi.call/cls_align_pointer.c,    
-        testsuite/libffi.call/cls_pointer.c,    
-        testsuite/libffi.call/cls_pointer_stack.c: use portable cast from
-        pointer to integer (intptr_t).
-        * testsuite/libffi.call/cls_longdouble.c: disable for win64.
-	
-2008-12-19  Anthony Green  <green@redhat.com>
-
-	* configure.ac: Bump version to 3.0.8.
-	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
-	* libtool-version: Increment revision.
-	* README: Update for new release.
-
-2008-11-11  Anthony Green  <green@redhat.com>
-
-	* configure.ac: Bump version to 3.0.7.
-	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
-	* libtool-version: Increment revision.
-	* README: Update for new release.
-
-2008-08-25  Andreas Tobler  <a.tobler@schweiz.org>
-
-	* src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and
-	FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum.
-	Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT.
-	Adjust copyright notice.
-	* src/powerpc/ffi.c: Add two new flags to indicate if we have one
-	register or two register to use for FFI_SYSV structs.
-	(ffi_prep_cif_machdep): Pass the right register flag introduced above.
-	(ffi_closure_helper_SYSV): Fix the return type for
-	FFI_SYSV_TYPE_SMALL_STRUCT. Comment.
-	Adjust copyright notice.
-
-2008-07-24  Anthony Green  <green@redhat.com>
-
-	* testsuite/libffi.call/cls_dbls_struct.c,
-	testsuite/libffi.call/cls_double_va.c,
-	testsuite/libffi.call/cls_longdouble.c,
-	testsuite/libffi.call/cls_longdouble_va.c,
-	testsuite/libffi.call/cls_pointer.c,
-	testsuite/libffi.call/cls_pointer_stack.c,
-	testsuite/libffi.call/err_bad_abi.c: Clean up failures from
-	compiler warnings.
-
-2008-07-17  Anthony Green  <green@redhat.com>
-
-	* configure.ac: Bump version to 3.0.6.
-	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
-	* libtool-version: Increment revision.  Add documentation.
-	* README: Update for new release.
-
-2008-07-16  Kaz Kojima  <kkojima@gcc.gnu.org>
-
-	* src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned
-	int.
-
-2008-07-16  Kaz Kojima  <kkojima@gcc.gnu.org>
-
-	* src/sh/sysv.S: Add .note.GNU-stack on Linux.
-	* src/sh64/sysv.S: Likewise.
-
-2008-04-03  Anthony Green  <green@redhat.com>
-
-	* libffi.pc.in (Libs): Add -L${libdir}.
-	* configure.ac: Bump version to 3.0.5.
-	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
-	* libtool-version: Increment revision.
-	* README: Update for new release.
-
-2008-04-03  Anthony Green  <green@redhat.com>
-	    Xerces Ranby  <xerxes@zafena.se>
-
-	* include/ffi.h.in: Wrap definition of target architecture to
-	protect from double definitions.
-
-2008-03-22  Moriyoshi Koizumi  <moriyoshi@gmail.com>
-
-	* src/x86/ffi.c (ffi_prep_closure_loc): Fix for bug revealed in
-	closure_loc_fn0.c.
-	* testsuite/libffi.call/closure_loc_fn0.c (closure_loc_test_fn0):
-	New test.
-
-2008-03-04  Anthony Green  <green@redhat.com>
-	    Blake Chaffin
-	    hos@tamanegi.org
-
-	* testsuite/libffi.call/cls_align_longdouble_split2.c
-          testsuite/libffi.call/cls_align_longdouble_split.c
-          testsuite/libffi.call/cls_dbls_struct.c
-          testsuite/libffi.call/cls_double_va.c
-          testsuite/libffi.call/cls_longdouble.c
-          testsuite/libffi.call/cls_longdouble_va.c
-          testsuite/libffi.call/cls_pointer.c
-          testsuite/libffi.call/cls_pointer_stack.c
-          testsuite/libffi.call/err_bad_abi.c
-          testsuite/libffi.call/err_bad_typedef.c
-          testsuite/libffi.call/huge_struct.c
-          testsuite/libffi.call/stret_large2.c
-          testsuite/libffi.call/stret_large.c
-          testsuite/libffi.call/stret_medium2.c
-          testsuite/libffi.call/stret_medium.c: New tests from Apple.
-
-2008-02-26  Jakub Jelinek  <jakub@redhat.com>
-            Anthony Green  <green@redhat.com>
-
-	* src/alpha/osf.S: Add .note.GNU-stack on Linux.
-	* src/s390/sysv.S: Likewise.
-	* src/powerpc/linux64.S: Likewise.
-	* src/powerpc/linux64_closure.S: Likewise.
-	* src/powerpc/ppc_closure.S: Likewise.
-	* src/powerpc/sysv.S: Likewise.
-	* src/x86/unix64.S: Likewise.
-	* src/x86/sysv.S: Likewise.
-	* src/sparc/v8.S: Likewise.
-	* src/sparc/v9.S: Likewise.
-	* src/m68k/sysv.S: Likewise.
-	* src/ia64/unix.S: Likewise.
-	* src/arm/sysv.S: Likewise.
-
-2008-02-26  Anthony Green  <green@redhat.com>
-            Thomas Heller  <theller@ctypes.org>
-
-	* src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C
-	comment.
-
-2008-02-26  Anthony Green  <green@redhat.org>
-            Thomas Heller  <theller@ctypes.org>
-
-	* include/ffi.h.in: Change void (*)() to void (*)(void).
-
-2008-02-26  Anthony Green  <green@redhat.org>
-            Thomas Heller  <theller@ctypes.org>
-
-	* src/alpha/ffi.c: Change void (*)() to void (*)(void).
-	src/alpha/osf.S, src/arm/ffi.c, src/frv/ffi.c, src/ia64/ffi.c,
-	src/ia64/unix.S, src/java_raw_api.c, src/m32r/ffi.c,
-	src/mips/ffi.c, src/pa/ffi.c, src/pa/hpux32.S, src/pa/linux.S,
-	src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/raw_api.c,
-	src/s390/ffi.c, src/sh/ffi.c, src/sh64/ffi.c, src/sparc/ffi.c,
-	src/x86/ffi.c, src/x86/unix64.S, src/x86/darwin64.S,
-	src/x86/ffi64.c: Ditto.
-
-2008-02-24  Anthony Green  <green@redhat.org>
-
-	* configure.ac: Accept openbsd*, not just openbsd.
-	Bump version to 3.0.4.
-	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
-	* libtool-version: Increment revision.
-	* README: Update for new release.
-
-2008-02-22  Anthony Green  <green@redhat.com>
-
-	* README: Clean up list of tested platforms.
-
-2008-02-22  Anthony Green  <green@redhat.com>
-
-	* configure.ac: Bump version to 3.0.3.
-	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
-	* libtool-version: Increment revision.
-	* README: Update for new release.  Clean up test docs.
-
-2008-02-22  Bjoern Koenig  <bkoenig@alpha-tierchen.de>
-	    Andreas Tobler  <a.tobler@schweiz.org>
-
-	* configure.ac: Add amd64-*-freebsd* target.
-	* configure: Regenerate.
-
-2008-02-22  Thomas Heller <theller@ctypes.org>
-
-	* configure.ac: Add x86 OpenBSD support.
-	* configure: Rebuilt.
-
-2008-02-21  Thomas Heller <theller@ctypes.org>
-
-	* README: Change "make test" to "make check".
-
-2008-02-21  Anthony Green  <green@redhat.com>
-
-	* configure.ac: Bump version to 3.0.2.
-	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
-	* libtool-version: Increment revision.
-	* README: Update for new release.
-
-2008-02-21  Björn König <bkoenig@alpha-tierchen.de>
-
-	* src/x86/freebsd.S: New file.
-	* configure.ac: Add x86 FreeBSD support.
-	* Makefile.am: Ditto.
-
-2008-02-15  Anthony Green  <green@redhat.com>
-
-	* configure.ac: Bump version to 3.0.1.
-	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
-	* libtool-version: Increment revision.
-	* README: Update for new release.
-
-2008-02-15  David Daney	 <ddaney@avtrex.com>
-
-	* src/mips/ffi.c: Remove extra '>' from include directive.
-	(ffi_prep_closure_loc): Use clear_location instead of tramp.
-
-2008-02-15  Anthony Green  <green@redhat.com>
-
-	* configure.ac: Bump version to 3.0.0.
-	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
-
-2008-02-15  David Daney	 <ddaney@avtrex.com>
-
-	* src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE):
-	Define (conditionally), and use it to include cachectl.h.
-	(ffi_prep_closure_loc): Fix cache flushing.
-	* src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define.
-
-2008-02-15  Anthony Green  <green@redhat.com>
-
-        * man/ffi_call.3, man/ffi_prep_cif.3, man/ffi.3:
-	Update dates and remove all references to ffi_prep_closure.
-	* configure.ac: Bump version to 2.99.9.
-	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
-
-2008-02-15  Anthony Green  <green@redhat.com>
-
-	* man/ffi_prep_closure.3: Delete.
-	* man/Makefile.am (EXTRA_DIST): Remove ffi_prep_closure.3.
-	(man_MANS): Ditto.
-	* man/Makefile.in: Rebuilt.
-	* configure.ac: Bump version to 2.99.8.
-	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
-
-2008-02-14  Anthony Green  <green@redhat.com>
-
-	* configure.ac: Bump version to 2.99.7.
-	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
-	* include/ffi.h.in LICENSE src/debug.c src/closures.c
-          src/ffitest.c src/s390/sysv.S src/s390/ffitarget.h
-          src/types.c src/m68k/ffitarget.h src/raw_api.c src/frv/ffi.c
-          src/frv/ffitarget.h src/sh/ffi.c src/sh/sysv.S
-          src/sh/ffitarget.h src/powerpc/ffitarget.h src/pa/ffi.c
-          src/pa/ffitarget.h src/pa/linux.S src/java_raw_api.c
-          src/cris/ffitarget.h src/x86/ffi.c src/x86/sysv.S
-          src/x86/unix64.S src/x86/win32.S src/x86/ffitarget.h
-          src/x86/ffi64.c src/x86/darwin.S src/ia64/ffi.c
-          src/ia64/ffitarget.h src/ia64/ia64_flags.h src/ia64/unix.S
-          src/sparc/ffi.c src/sparc/v9.S src/sparc/ffitarget.h
-          src/sparc/v8.S src/alpha/ffi.c src/alpha/ffitarget.h
-          src/alpha/osf.S src/sh64/ffi.c src/sh64/sysv.S
-          src/sh64/ffitarget.h src/mips/ffi.c src/mips/ffitarget.h
-          src/mips/n32.S src/mips/o32.S src/arm/ffi.c src/arm/sysv.S
-          src/arm/ffitarget.h src/prep_cif.c: Update license text.
-
-2008-02-14  Anthony Green  <green@redhat.com>
-
-	* README: Update tested platforms.
-	* configure.ac: Bump version to 2.99.6.
-	* configure: Rebuilt.
-
-2008-02-14  Anthony Green  <green@redhat.com>
-
-	* configure.ac: Bump version to 2.99.5.
-	* configure: Rebuilt.
-	* Makefile.am (EXTRA_DIST): Add darwin64.S
-	* Makefile.in: Rebuilt.
-	* testsuite/lib/libffi-dg.exp: Remove libstdc++ bits from GCC tree.
-	* LICENSE: Update WARRANTY.
-
-2008-02-14  Anthony Green  <green@redhat.com>
-
-	* libffi.pc.in (libdir): Fix libdir definition.
-	* configure.ac: Bump version to 2.99.4.
-	* configure: Rebuilt.
-
-2008-02-14  Anthony Green  <green@redhat.com>
-
-	* README: Update.
-	* libffi.info: New file.
-	* doc/stamp-vti: New file.
-	* configure.ac: Bump version to 2.99.3.
-	* configure: Rebuilt.
-
-2008-02-14  Anthony Green  <green@redhat.com>
-
-	* Makefile.am (SUBDIRS): Add man dir.
-	* Makefile.in: Rebuilt.
-	* configure.ac: Create Makefile.
-	* configure: Rebuilt.
-        * man/ffi_call.3 man/ffi_prep_cif.3 man/ffi_prep_closure.3
-          man/Makefile.am man/Makefile.in: New files.
-
-2008-02-14  Tom Tromey  <tromey@redhat.com>
-
-	* aclocal.m4, Makefile.in, configure, fficonfig.h.in: Rebuilt.
-	* mdate-sh, texinfo.tex: New files.
-	* Makefile.am (info_TEXINFOS): New variable.
-	* doc/libffi.texi: New file.
-	* doc/version.texi: Likewise.
-
-2008-02-14  Anthony Green  <green@redhat.com>
-
-	* Makefile.am (AM_CFLAGS): Don't compile with -D$(TARGET).
-	(lib_LTLIBRARIES): Define.
-	(toolexeclib_LIBRARIES): Undefine.
-	* Makefile.in: Rebuilt.
-	* configure.ac: Reset version to 2.99.1.
-	* configure.in: Rebuilt.
-
-2008-02-14  Anthony Green  <green@redhat.com>
-
-	* libffi.pc.in: Use @PACKAGE_NAME@ and @PACKAGE_VERSION@.
-	* configure.ac: Reset version to 2.99.1.
-	* configure.in: Rebuilt.
-	* Makefile.am (EXTRA_DIST): Add ChangeLog.libffi.
-	* Makefile.in: Rebuilt.
-	* LICENSE: Update copyright notice.
-
-2008-02-14  Anthony Green  <green@redhat.com>
-
-	* include/Makefile.am (nodist_includes_HEADERS): Define.  Don't
-	distribute ffitarget.h or ffi.h from the build include dir.
-	* Makefile.in: Rebuilt.
-
-2008-02-14  Anthony Green  <green@redhat.com>
-
-	* include/Makefile.am (includesdir): Install headers under libdir.
-	(pkgconfigdir): Define. Install libffi.pc.
-	* include/Makefile.in: Rebuilt.
-	* libffi.pc.in: Create.
-	* libtool-version: Increment CURRENT
-	* configure.ac: Add libffi.pc.in
-	* configure: Rebuilt.
-
-2008-02-03  Anthony Green  <green@redhat.com>
-
-	* include/Makefile.am (includesdir): Fix header install with
-	DESTDIR.
-	* include/Makefile.in: Rebuilt.
-
-2008-02-03  Timothy Wall  <twall@users.sf.net>
-
-	* src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return
-          offset based on code pointer, not data pointer.
-
-2008-02-01  Anthony Green  <green@redhat.com>
-
-	* include/Makefile.am: Fix header installs.
-	* Makefile.am: Ditto.
-	* include/Makefile.in: Rebuilt.
-	* Makefile.in: Ditto.
-
-2008-02-01  Anthony Green  <green@redhat.com>
-
-	* src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL,
-	FFI_INIT_TRAMPOLINE): Revert my broken changes to twall's last
-	patch.
-
-2008-01-31  Anthony Green  <green@redhat.com>
-
-	* Makefile.am (EXTRA_DIST): Add missing files.
-	* testsuite/Makefile.am: Ditto.
-	* Makefile.in, testsuite/Makefile.in: Rebuilt.
-
-2008-01-31  Timothy Wall <twall@users.sf.net>
-
-	* testsuite/libffi.call/closure_stdcall.c: Add test for stdcall
-	closures.
-	* src/x86/ffitarget.h: Increase size of trampoline for stdcall
-	closures.
-	* src/x86/win32.S: Add assembly for stdcall closure.
-	* src/x86/ffi.c: Initialize stdcall closure trampoline.
-
-2008-01-30  H.J. Lu <hongjiu.lu@intel.com>
-
-	PR libffi/34612
-	* src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when
-	returning struct.
-
-	* testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer"
-	tests.
-
-2008-01-30  Anthony Green  <green@redhat.com>
-
-	* Makefile.am, include/Makefile.am: Move headers to
-	libffi_la_SOURCES for new automake.
-	* Makefile.in, include/Makefile.in: Rebuilt.
-	
-	* testsuite/lib/wrapper.exp: Copied from gcc tree to allow for 
-	execution outside of gcc tree.
-	* testsuite/lib/target-libpath.exp: Ditto.
-
-	* testsuite/lib/libffi-dg.exp: Many changes to allow for execution
-	outside of gcc tree.
-
diff --git a/third_party/gofrontend/libffi/ChangeLog.libgcj b/third_party/gofrontend/libffi/ChangeLog.libgcj
deleted file mode 100644
index ea5d02f..0000000
--- a/third_party/gofrontend/libffi/ChangeLog.libgcj
+++ /dev/null
@@ -1,40 +0,0 @@
-2004-01-14  Kelley Cook  <kcook@gcc.gnu.org>
-
-	* configure.in: Add in AC_PREREQ(2.13)
-
-2003-02-20  Alexandre Oliva  <aoliva@redhat.com>
-
-	* configure.in: Propagate ORIGINAL_LD_FOR_MULTILIBS to
-	config.status.
-	* configure: Rebuilt.
-
-2002-01-27  Alexandre Oliva  <aoliva@redhat.com>
-
-	* configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST.
-	Remove USE_LIBDIR conditional.
-	* Makefile.am (toolexecdir, toolexeclibdir): Don't override.
-	* Makefile.in, configure: Rebuilt.
-
-Mon Aug  9 18:33:38 1999  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
-
-	* include/Makefile.in: Rebuilt.
-	* Makefile.in: Rebuilt
-	* Makefile.am (toolexeclibdir): Add $(MULTISUBDIR) even for native
-	builds.
-	Use USE_LIBDIR.
-
-	* configure: Rebuilt.
-	* configure.in (USE_LIBDIR): Define for native builds.
-	Use lowercase in configure --help explanations.
-
-1999-08-08  Anthony Green  <green@cygnus.com>
-
-	* include/ffi.h.in (FFI_FN): Remove `...'.
-
-1999-08-08  Anthony Green  <green@cygnus.com>
-
-	* Makefile.in: Rebuilt.
-	* Makefile.am (AM_CFLAGS): Compile with -fexceptions.
-
-	* src/x86/sysv.S: Add exception handling metadata.
-
diff --git a/third_party/gofrontend/libffi/ChangeLog.v1 b/third_party/gofrontend/libffi/ChangeLog.v1
deleted file mode 100644
index 369820c..0000000
--- a/third_party/gofrontend/libffi/ChangeLog.v1
+++ /dev/null
@@ -1,764 +0,0 @@
-The libffi version 1 ChangeLog archive.
-
-Version 1 of libffi had per-directory ChangeLogs.  Current and future
-versions have a single ChangeLog file in the root directory.  The
-version 1 ChangeLogs have all been concatonated into this file for
-future reference only.
-
---- libffi ----------------------------------------------------------------
-
-Mon Oct  5 02:17:50 1998  Anthony Green  <green@cygnus.com>
-
-	* configure.in: Boosted rev.
-	* configure, Makefile.in, aclocal.m4: Rebuilt.
-	* README: Boosted rev and updated release notes.
-
-Mon Oct  5 01:03:03 1998  Anthony Green  <green@cygnus.com>
-
-	* configure.in: Boosted rev.
-	* configure, Makefile.in, aclocal.m4: Rebuilt.
-	* README: Boosted rev and updated release notes.
-
-1998-07-25  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
-
-	* m68k/ffi.c (ffi_prep_cif_machdep): Use bitmask for cif->flags.
-	Correctly handle small structures.
-	(ffi_prep_args): Also handle small structures.
-	(ffi_call): Pass size of return type to ffi_call_SYSV.
-	* m68k/sysv.S: Adjust for above changes.  Correctly align small
-	structures in the return value.
-
-	* types.c (uint64, sint64) [M68K]: Change alignment to 4.
-
-Fri Apr 17 17:26:58 1998  Anthony Green  <green@hoser.cygnus.com>
-
-	* configure.in: Boosted rev.
-	* configure,Makefile.in,aclocal.m4: Rebuilt.
-	* README: Boosted rev and added release notes.
-
-Sun Feb 22 00:50:41 1998  Geoff Keating  <geoffk@ozemail.com.au>
-
-	* configure.in: Add PowerPC config bits.
-
-1998-02-14  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
-
-	* configure.in: Add m68k config bits.  Change AC_CANONICAL_SYSTEM
-	to AC_CANONICAL_HOST, this is not a compiler.  Use $host instead
-	of $target.  Remove AC_CHECK_SIZEOF(char), we already know the
-	result.  Fix argument of AC_ARG_ENABLE.
-	* configure, fficonfig.h.in: Rebuilt.
-
-Tue Feb 10 20:53:40 1998  Richard Henderson  <rth@cygnus.com>
-
-	* configure.in: Add Alpha config bits.
-
-Tue May 13 13:39:20 1997  Anthony Green  <green@hoser.cygnus.com>
-
-	* README: Updated dates and reworded Irix comments.
-
-	* configure.in: Removed AC_PROG_RANLIB.
-
-	* Makefile.in, aclocal.m4, config.guess, config.sub, configure,
-	ltmain.sh, */Makefile.in: libtoolized again and	rebuilt with 
-	automake and autoconf.
-	
-Sat May 10 18:44:50 1997  Tom Tromey  <tromey@cygnus.com>
-
-	* configure, aclocal.m4: Rebuilt.
-	* configure.in: Don't compute EXTRADIST; now handled in
-	src/Makefile.in.  Removed macros implied by AM_INIT_AUTOMAKE.
-	Don't run AM_MAINTAINER_MODE.
-
-Thu May  8 14:34:05 1997  Anthony Green  <green@hoser.cygnus.com>
-
-	* missing, ltmain.sh, ltconfig.sh: Created. These are new files
-	required by automake and libtool.
-
-	* README: Boosted rev to 1.14. Added notes.
-
-	* acconfig.h: Moved PACKAGE and VERSION for new automake.
-	
-	* configure.in: Changes for libtool.
-	
-	* Makefile.am (check): make test now make check. Uses libtool now.
-
-	* Makefile.in, configure.in, aclocal.h, fficonfig.h.in: Rebuilt.
-
-Thu May  1 16:27:07 1997  Anthony Green  <green@hoser.cygnus.com>
-
-	* missing: Added file required by new automake.
-
-Tue Nov 26 14:10:42 1996  Anthony Green  <green@csk3.cygnus.com>
-
-	* acconfig.h: Added USING_PURIFY flag. This is defined when
-	--enable-purify-safety was used at configure time.
-
-	* configure.in (allsources): Added --enable-purify-safety switch.
-	(VERSION): Boosted rev to 1.13.
-	* configure: Rebuilt.
-
-Fri Nov 22 06:46:12 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* configure.in (VERSION): Boosted rev to 1.12.
-	Removed special CFLAGS hack for gcc.
-	* configure: Rebuilt.
-
-	* README: Boosted rev to 1.12. Added notes.
-
-	* Many files: Cygnus Support changed to Cygnus Solutions.
-
-Wed Oct 30 11:15:25 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* configure.in (VERSION): Boosted rev to 1.11.
-	* configure: Rebuilt.
-
-	* README: Boosted rev to 1.11. Added notes about GNU make.
-
-Tue Oct 29 12:25:12 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* configure.in: Fixed -Wall trick.
-	(VERSION): Boosted rev.
-	* configure: Rebuilt
-
-	* acconfig.h: Needed for --enable-debug configure switch.
-
-	* README: Boosted rev to 1.09. Added more notes on building
-	libffi, and LCLint.
-
-	* configure.in: Added --enable-debug switch. Boosted rev to
-	1.09.
-	* configure: Rebuilt
-
-Tue Oct 15 13:11:28 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* configure.in (VERSION): Boosted rev to 1.08
-	* configure: Rebuilt.
-
-	* README: Added n32 bug fix notes.
-
-	* Makefile.am: Added "make lint" production. 
-	* Makefile.in: Rebuilt.
-
-Mon Oct 14 10:54:46 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* README: Added web page reference.
-
-	* configure.in, README: Boosted rev to 1.05
-	* configure: Rebuilt.
-
-	* README: Fixed n32 sample code.
-
-Fri Oct 11 17:09:28 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* README: Added sparc notes.
-
-	* configure.in, README: Boosted rev to 1.04.
-	* configure: Rebuilt.
-
-Thu Oct 10 10:31:03 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* configure.in, README: Boosted rev to 1.03.
-	* configure: Rebuilt.
-
-	* README: Added struct notes. 
-
-	* Makefile.am (EXTRA_DIST): Added LICENSE to distribution.
-	* Makefile.in: Rebuilt.
-
-	* README: Removed Linux section. No special notes now
-	because aggregates arg/return types work.
-
-Wed Oct  9 16:16:42 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* README, configure.in (VERSION): Boosted rev to 1.02
-	* configure: Rebuilt.
-
-Tue Oct  8 11:56:33 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* README (NOTE): Added n32 notes.
-
-	* Makefile.am: Added test production.
-	* Makefile: Rebuilt
-
-	* README: spell checked!
-
-	* configure.in (VERSION): Boosted rev to 1.01
-	* configure: Rebuilt.
-
-Mon Oct  7 15:50:22 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* configure.in: Added nasty bit to support SGI tools.
-	* configure: Rebuilt.
-	
-	* README: Added SGI notes. Added note about automake bug.
-
-Mon Oct  7 11:00:28 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* README: Rewrote intro, and fixed examples.
-
-Fri Oct  4 10:19:55 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* configure.in: -D$TARGET is no longer used as a compiler switch.
-	It is now inserted into ffi.h at configure time.
-	* configure: Rebuilt.
-
-	* FFI_ABI and FFI_STATUS are now ffi_abi and ffi_status.
-
-Thu Oct  3 13:47:34 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* README, LICENSE: Created. Wrote some docs.
-
-	* configure.in: Don't barf on i586-unknown-linuxaout.
-	Added EXTRADIST code for "make dist".
-	* configure: Rebuilt.
-
-	* */Makefile.in: Rebuilt with patched automake. 
-
-Tue Oct  1 17:12:25 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* Makefile.am, aclocal.m4, config.guess, config.sub,
-	configure.in, fficonfig.h.in, install-sh, mkinstalldirs, 
-	stamp-h.in: Created
-	* Makefile.in, configure: Generated
-
---- libffi/include --------------------------------------------------------
-
-Tue Feb 24 13:09:36 1998  Anthony Green  <green@gerbil.cygnus.com>
-
-	* ffi_mips.h: Updated FFI_TYPE_STRUCT_* values based on
-	ffi.h.in changes.  This is a work-around for SGI's "simple"
-	assembler.
-
-Sun Feb 22 00:51:55 1998  Geoff Keating  <geoffk@ozemail.com.au>
-
-	* ffi.h.in: PowerPC support.
-
-1998-02-14  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
-
-	* ffi.h.in: Add m68k support.
-	(FFI_TYPE_LONGDOUBLE): Make it a separate value.
-
-Tue Feb 10 20:55:16 1998  Richard Henderson  <rth@cygnus.com>
-
-	* ffi.h.in (SIZEOF_ARG): Use a pointer type by default.
-
-	* ffi.h.in: Alpha support.
-
-Fri Nov 22 06:48:45 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.h.in, ffi_common.h: Cygnus Support -> Cygnus Solutions.
-
-Wed Nov 20 22:31:01 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffi.h.in: Added ffi_type_void definition.
-
-Tue Oct 29 12:22:40 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* Makefile.am (hack_DATA): Always install ffi_mips.h.
-
-	* ffi.h.in: Removed FFI_DEBUG. It's now in the correct
-	place (acconfig.h).
-	Added #include <stddef.h> for size_t definition.
-
-Tue Oct 15 17:23:35 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffi.h.in, ffi_common.h, ffi_mips.h: More clean up.
-	Commented out #define of FFI_DEBUG.
-
-Tue Oct 15 13:01:06 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi_common.h: Added bool definition.
-
-	* ffi.h.in, ffi_common.h: Clean up based on LCLint output.
-	Added funny /*@...@*/ comments to annotate source.
-
-Mon Oct 14 12:29:23 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.h.in: Interface changes based on feedback from Jim
-	Blandy.
-
-Fri Oct 11 16:49:35 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.h.in: Small change for sparc support.
-
-Thu Oct 10 14:53:37 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi_mips.h: Added FFI_TYPE_STRUCT_* definitions for 
-	special structure return types.
-
-Wed Oct  9 13:55:57 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.h.in: Added SIZEOF_ARG definition for X86
-
-Tue Oct  8 11:40:36 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.h.in (FFI_FN): Added macro for eliminating compiler warnings.
-	Use it to case your function pointers to the proper type.
-
-	* ffi_mips.h (SIZEOF_ARG): Added magic to fix type promotion bug.
-
-	* Makefile.am (EXTRA_DIST): Added ffi_mips.h to EXTRA_DIST.
-	* Makefile: Rebuilt.
-
-	* ffi_mips.h: Created. Moved all common mips definitions here.
-
-Mon Oct  7 10:58:12 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffi.h.in: The SGI assember is very picky about parens. Redefined
- 	some macros to avoid problems.
-
-	* ffi.h.in: Added FFI_DEFAULT_ABI definitions. Also added
-	externs for pointer, and 64bit integral ffi_types.
-
-Fri Oct  4 09:51:37 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffi.h.in: Added FFI_ABI member to ffi_cif and changed
-	function prototypes accordingly.
-	Added #define @TARGET@. Now programs including ffi.h don't 
-	have to specify this themselves.
-
-Thu Oct  3 15:36:44 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffi.h.in: Changed ffi_prep_cif's values from void* to void**
-
-	* Makefile.am (EXTRA_DIST): Added EXTRA_DIST for "make dist"
-	to work.
-	* Makefile.in: Regenerated.
-
-Wed Oct  2 10:16:59 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* Makefile.am: Created
-	* Makefile.in: Generated
-
-	* ffi_common.h: Added rcsid comment
-
-Tue Oct  1 17:13:51 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.h.in, ffi_common.h: Created
-
---- libffi/src ------------------------------------------------------------
-
-Mon Oct  5 02:17:50 1998  Anthony Green  <green@cygnus.com>
-
-	* arm/ffi.c, arm/sysv.S: Created.
-
-	* Makefile.am: Added arm files.
-	* Makefile.in: Rebuilt.
-
-Mon Oct  5 01:41:38 1998  Anthony Green  <green@rtl.cygnus.com>
-
-	* Makefile.am (libffi_la_LDFLAGS): Incremented revision.
-
-Sun Oct  4 16:27:17 1998  Anthony Green  <green@cygnus.com>
-
-	* alpha/osf.S (ffi_call_osf): Patch for DU assembler.
-
-	* ffitest.c (main): long long and long double return values work
-	for x86.
-
-Fri Apr 17 11:50:58 1998  Anthony Green  <green@hoser.cygnus.com>
-
-	* Makefile.in: Rebuilt.
-
-	* ffitest.c (main): Floating point tests not executed for systems
- 	with broken lond double (SunOS 4 w/ GCC).
-
-	* types.c: Fixed x86 alignment info for long long types.
-
-Thu Apr 16 07:15:28 1998  Anthony Green  <green@ada.cygnus.com>
-
-	* ffitest.c: Added more notes about GCC bugs under Irix 6.
-
-Wed Apr 15 08:42:22 1998  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffitest.c (struct5): New test function.
-	(main): New test with struct5.
-
-Thu Mar  5 10:48:11 1998  Anthony Green  <green@tootie.to.cygnus.com>
-
-	* prep_cif.c (initialize_aggregate): Fix assertion for
-	nested structures.
-
-Tue Feb 24 16:33:41 1998  Anthony Green  <green@hoser.cygnus.com>
-
-	* prep_cif.c (ffi_prep_cif): Added long double support for sparc.
-
-Sun Feb 22 00:52:18 1998  Geoff Keating  <geoffk@ozemail.com.au>
-
-	* powerpc/asm.h: New file.
-	* powerpc/ffi.c: New file.
-	* powerpc/sysv.S: New file.
-	* Makefile.am: PowerPC port.
-	* ffitest.c (main): Allow all tests to run even in presence of gcc
- 	bug on PowerPC.
-
-1998-02-17  Anthony Green  <green@hoser.cygnus.com>
-
-	* mips/ffi.c: Fixed comment typo.
-
-	* x86/ffi.c (ffi_prep_cif_machdep), x86/sysv.S (retfloat): 
-	Fixed x86 long double return handling.
-
-	* types.c: Fixed x86 long double alignment info.
-
-1998-02-14  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
-
-	* types.c: Add m68k support.
-
-	* ffitest.c (floating): Add long double parameter.
-	(return_ll, ldblit): New functions to test long long and long
-	double return value.
-	(main): Fix type error in assignment of ts[1-4]_type.elements.
-	Add tests for long long and long double arguments and return
-	values.
-
-	* prep_cif.c (ffi_prep_cif) [M68K]: Don't allocate argument for
-	struct value pointer.
-
-	* m68k/ffi.c, m68k/sysv.S: New files.
-	* Makefile.am: Add bits for m68k port.  Add kludge to work around
-	automake deficiency.
-	(test): Don't require "." in $PATH.
-	* Makefile.in: Rebuilt.
-
-Wed Feb 11 07:36:50 1998  Anthony Green  <green@hoser.cygnus.com>
-
-	* Makefile.in: Rebuilt.
-
-Tue Feb 10 20:56:00 1998  Richard Henderson  <rth@cygnus.com>
-
-	* alpha/ffi.c, alpha/osf.S: New files.
-	* Makefile.am: Alpha port.
-
-Tue Nov 18 14:12:07 1997  Anthony Green  <green@hoser.cygnus.com>
-
-	* mips/ffi.c (ffi_prep_cif_machdep): Initialize rstruct_flag
-	for n32.
-
-Tue Jun  3 17:18:20 1997  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffitest.c (main): Added hack to get structure tests working
-	correctly.
-
-Sat May 10 19:06:42 1997  Tom Tromey  <tromey@cygnus.com>
-
-	* Makefile.in: Rebuilt.
-	* Makefile.am (EXTRA_DIST): Explicitly list all distributable
-	files in subdirs.
-	(VERSION, CC): Removed.
-
-Thu May  8 17:19:01 1997  Anthony Green  <green@hoser.cygnus.com>
-
-	* Makefile.am: Many changes for new automake and libtool.
-	* Makefile.in: Rebuilt.
-
-Fri Nov 22 06:57:56 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffitest.c (main): Fixed test case for non mips machines.
-
-Wed Nov 20 22:31:59 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* types.c: Added ffi_type_void declaration.
-
-Tue Oct 29 13:07:19 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffitest.c (main): Fixed character constants.
-	(main): Emit warning for structure test 3 failure on Sun.
-
-	* Makefile.am (VPATH): Fixed VPATH def'n so automake won't
-	strip it out. 
-	Moved distdir hack from libffi to automake. 
-	(ffitest): Added missing -c for $(COMPILE) (change in automake).
-	* Makefile.in: Rebuilt.
-	
-Tue Oct 15 13:08:20 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* Makefile.am: Added "make lint" production. 
-	* Makefile.in: Rebuilt.
-
-	* prep_cif.c (STACK_ARG_SIZE): Improved STACK_ARG_SIZE macro.
-  	Clean up based on LCLint output. Added funny /*@...@*/ comments to
- 	annotate source.
-
-	* ffitest.c, debug.c: Cleaned up code.
-
-Mon Oct 14 12:26:56 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffitest.c: Changes based on interface changes.
-
-	* prep_cif.c (ffi_prep_cif): Cleaned up interface based on
-	feedback from Jim Blandy.
-
-Fri Oct 11 15:53:18 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffitest.c: Reordered tests while porting to sparc.
-	Made changes to handle lame structure passing for sparc.
-	Removed calls to fflush().
-
-	* prep_cif.c (ffi_prep_cif): Added special case for sparc
-	aggregate type arguments.
-
-Thu Oct 10 09:56:51 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffitest.c (main): Added structure passing/returning tests.
-
-	* prep_cif.c (ffi_prep_cif): Perform proper initialization
-	of structure return types if needed.
-	(initialize_aggregate): Bug fix
-
-Wed Oct  9 16:04:20 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* types.c: Added special definitions for x86 (double doesn't
-	need double word alignment).
-
-	* ffitest.c: Added many tests
-
-Tue Oct  8 09:19:22 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* prep_cif.c (ffi_prep_cif): Fixed assertion.
-
-	* debug.c (ffi_assert): Must return a non void now.
-
-	* Makefile.am: Added test production.
-	* Makefile: Rebuilt.
-
-	* ffitest.c (main): Created. 
-
-	* types.c: Created. Stripped common code out of */ffi.c.
-
-	* prep_cif.c: Added missing stdlib.h include.
-
-	* debug.c (ffi_type_test): Used "a" to eliminate compiler
-	warnings in non-debug builds. Included ffi_common.h.
-
-Mon Oct  7 15:36:42 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* Makefile.am: Added a rule for .s -> .o
-	This is required by the SGI compiler.
-	* Makefile: Rebuilt.
-
-Fri Oct  4 09:51:08 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* prep_cif.c (initialize_aggregate): Moved abi specification
-	to ffi_prep_cif().
-
-Thu Oct  3 15:37:37 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* prep_cif.c (ffi_prep_cif): Changed values from void* to void**.
-	(initialize_aggregate): Fixed aggregate type initialization.
-
-	* Makefile.am (EXTRA_DIST): Added support code for "make dist".
-	* Makefile.in: Regenerated.
-
-Wed Oct  2 11:41:57 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* debug.c, prep_cif: Created.
-
-	* Makefile.am: Added debug.o and prep_cif.o to OBJ.
-	* Makefile.in: Regenerated.
-
-	* Makefile.am (INCLUDES): Added missing -I../include
-	* Makefile.in: Regenerated.
-
-Tue Oct  1 17:11:51 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* error.c, Makefile.am: Created.
-	* Makefile.in: Generated.
-
---- libffi/src/x86 --------------------------------------------------------
-
-Sun Oct  4 16:27:17 1998  Anthony Green  <green@cygnus.com>
-
-	* sysv.S (retlongdouble): Fixed long long return value support.
-	* ffi.c (ffi_prep_cif_machdep): Ditto.
-
-Wed May 13 04:30:33 1998  Anthony Green  <green@raft.ppp.tsoft.net>
-
-	* ffi.c (ffi_prep_cif_machdep): Fixed long double return value
-	support.
-
-Wed Apr 15 08:43:20 1998  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffi.c (ffi_prep_args): small struct support was missing.
-
-Thu May  8 16:53:58 1997  Anthony Green  <green@hoser.cygnus.com>
-
-	* objects.mak: Removed.
-
-Mon Dec  2 15:12:58 1996  Tom Tromey  <tromey@cygnus.com>
-
-	* sysv.S: Use .balign, for a.out Linux boxes.
-
-Tue Oct 15 13:06:50 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffi.c: Clean up based on LCLint output.
-	Added funny /*@...@*/ comments to annotate source.
-
-Fri Oct 11 16:43:38 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.c (ffi_call): Added assertion for bad ABIs.
-
-Wed Oct  9 13:57:27 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* sysv.S (retdouble): Fixed double return problems.
-
-	* ffi.c	(ffi_call): Corrected fn arg definition.
-	(ffi_prep_cif_machdep): Fixed double return problems
-
-Tue Oct  8 12:12:49 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.c: Moved ffi_type definitions to types.c.
-	(ffi_prep_args): Fixed type promotion bug.
-
-Mon Oct  7 15:53:06 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.c (FFI_*_TYPEDEF): Removed redundant ';'
-
-Fri Oct  4 09:54:53 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffi.c (ffi_call): Removed FFI_ABI arg, and swapped
-	remaining args.
-
-Wed Oct  2 10:07:05 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffi.c, sysv.S, objects.mak: Created.
-	(ffi_prep_cif): cif->rvalue no longer initialized to NULL.
-	(ffi_prep_cif_machdep): Moved machine independent cif processing
-	to src/prep_cif.c. Introduced ffi_prep_cif_machdep().
-
---- libffi/src/mips -------------------------------------------------------
-
-Tue Feb 17 17:18:07 1998  Anthony Green  <green@hoser.cygnus.com>
-
-	* o32.S: Fixed typo in comment.
-
-	* ffi.c (ffi_prep_cif_machdep): Fixed argument processing.
-
-Thu May  8 16:53:58 1997  Anthony Green  <green@hoser.cygnus.com>
-
-	* o32.s, n32.s: Wrappers for SGI tool support.
-
-	* objects.mak: Removed.
-
-Tue Oct 29 14:37:45 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.c (ffi_prep_args): Changed int z to size_t z.
-
-Tue Oct 15 13:17:25 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* n32.S: Fixed bad stack munging. 
-
-	* ffi.c: Moved prototypes for ffi_call_?32() to here from
-	ffi_mips.h because extended_cif is not defined in ffi_mips.h.
-
-Mon Oct 14 12:42:02 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.c: Interface changes based on feedback from Jim Blandy.
-
-Thu Oct 10 11:22:16 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* n32.S, ffi.c: Lots of changes to support passing and 
-	returning structures with the n32 calling convention.
-
-	* n32.S: Fixed fn pointer bug.
-
-	* ffi.c (ffi_prep_cif_machdep): Fix for o32 structure
-	return values.
-	(ffi_prep_args): Fixed n32 structure passing when structures
-	partially fit in registers.
-
-Wed Oct  9 13:49:25 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* objects.mak: Added n32.o.
-
-	* n32.S: Created.
-
-	* ffi.c (ffi_prep_args): Added magic to support proper
-	n32 processing.
-
-Tue Oct  8 10:37:35 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.c: Moved ffi_type definitions to types.c.
-	(ffi_prep_args): Fixed type promotion bug.
-
-	* o32.S: This code is only built for o32 compiles.
-	A lot of the #define cruft has moved to ffi_mips.h.
-
-	* ffi.c (ffi_prep_cif_machdep): Fixed arg flags. Second arg
-	is only processed if the first is either a float or double.
-
-Mon Oct  7 15:33:59 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* o32.S: Modified to compile under each of o32, n32 and n64.
-
-	* ffi.c (FFI_*_TYPEDEF): Removed redundant ';'
-
-Fri Oct  4 09:53:25 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffi.c (ffi_call): Removed FFI_ABI arg, and swapped
-	remaining args.
-
-Wed Oct  2 17:41:22 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* o32.S: Removed crufty definitions.
-
-Wed Oct  2 12:53:42 1996  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffi.c (ffi_prep_cif): cif->rvalue no longer initialized to NULL.
-	(ffi_prep_cif_machdep): Moved all machine independent cif processing
-	to src/prep_cif.c. Introduced ffi_prep_cif_machdep. Return types
-	of FFI_TYPE_STRUCT are no different than FFI_TYPE_INT.
-
-Tue Oct  1 17:11:02 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.c, o32.S, object.mak: Created
-	
---- libffi/src/sparc ------------------------------------------------------
-
-Tue Feb 24 16:33:18 1998  Anthony Green  <green@hoser.cygnus.com>
-
-	* ffi.c (ffi_prep_args): Added long double support.
-
-Thu May  8 16:53:58 1997  Anthony Green  <green@hoser.cygnus.com>
-
-	* objects.mak: Removed.
-
-Thu May  1 16:07:56 1997  Anthony Green  <green@hoser.cygnus.com>
-
-	* v8.S: Fixed minor portability problem reported by 
-	Russ McManus <mcmanr@eq.gs.com>.
-
-Tue Nov 26 14:12:43 1996  Anthony Green  <green@csk3.cygnus.com>
-
-	* v8.S: Used STACKFRAME define elsewhere. 
-
-	* ffi.c (ffi_prep_args): Zero out space when USING_PURIFY
-	is set.
-	(ffi_prep_cif_machdep): Allocate the correct stack frame 
-	space for functions with < 6 args.
-
-Tue Oct 29 15:08:55 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.c (ffi_prep_args): int z is now size_t z.
-
-Mon Oct 14 13:31:24 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* v8.S (ffi_call_V8): Gordon rewrites this again. It looks
-	great now.
-
-	* ffi.c (ffi_call): The comment about hijacked registers
-	is no longer valid after gordoni hacked v8.S.
-
-        * v8.S (ffi_call_V8): Rewrote with gordoni. Much simpler.
-	
-	* v8.S, ffi.c: ffi_call() had changed to accept more than
-	two args, so v8.S had to change (because it hijacks incoming
-	arg registers).
-
-	* ffi.c: Interface changes based on feedback from Jim Blandy.
-
-Thu Oct 10 17:48:16 1996  Anthony Green  <green@rtl.cygnus.com>
-
-	* ffi.c, v8.S, objects.mak: Created.
-	
-
diff --git a/third_party/gofrontend/libffi/LICENSE b/third_party/gofrontend/libffi/LICENSE
deleted file mode 100644
index a66fab4..0000000
--- a/third_party/gofrontend/libffi/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-libffi - Copyright (c) 1996-2014  Anthony Green, Red Hat, Inc and others.
-See source files for details.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-``Software''), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/third_party/gofrontend/libffi/Makefile.am b/third_party/gofrontend/libffi/Makefile.am
deleted file mode 100644
index 64ff1c1..0000000
--- a/third_party/gofrontend/libffi/Makefile.am
+++ /dev/null
@@ -1,219 +0,0 @@
-## Process this with automake to create Makefile.in
-
-AUTOMAKE_OPTIONS = foreign subdir-objects
-
-ACLOCAL_AMFLAGS = -I .. -I ../config
-
-SUBDIRS = include testsuite man
-
-EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj			\
-	ChangeLog.libffi ChangeLog.libffi-3.1				\
-	m4/libtool.m4 m4/lt~obsolete.m4					\
-	 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4			\
-	 m4/ltversion.m4 src/debug.c msvcc.sh				\
-	generate-darwin-source-and-headers.py				\
-	libffi.xcodeproj/project.pbxproj				\
-	libtool-ldflags
-
-# Automake Documentation:
-# If your package has Texinfo files in many directories, you can use the
-# variable TEXINFO_TEX to tell Automake where to find the canonical
-# `texinfo.tex' for your package. The value of this variable should be
-# the relative path from the current `Makefile.am' to `texinfo.tex'.
-TEXINFO_TEX   = ../gcc/doc/include/texinfo.tex
-
-# Defines info, dvi, pdf and html targets
-MAKEINFOFLAGS = -I $(srcdir)/../gcc/doc/include
-info_TEXINFOS = doc/libffi.texi
-
-# AM_CONDITIONAL on configure option --generated-files-in-srcdir
-if GENINSRC
-STAMP_GENINSRC = stamp-geninsrc
-else
-STAMP_GENINSRC =
-endif
-
-# AM_CONDITIONAL on configure check ACX_CHECK_PROG_VER([MAKEINFO])
-if BUILD_INFO
-STAMP_BUILD_INFO = stamp-build-info
-else
-STAMP_BUILD_INFO =
-endif
-
-all-local: $(STAMP_GENINSRC)
-
-stamp-geninsrc: doc/libffi.info
-	cp -p $(top_builddir)/doc/libffi.info $(srcdir)/doc/libffi.info
-	@touch $@
-
-doc/libffi.info: $(STAMP_BUILD_INFO)
-
-stamp-build-info: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp)
-	$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)/doc -o doc/libffi.info $(srcdir)/doc/libffi.texi
-	@touch $@
-
-CLEANFILES = $(STAMP_GENINSRC) $(STAMP_BUILD_INFO) doc/libffi.info
-MAINTAINERCLEANFILES = $(srcdir)/doc/libffi.info
-
-## ################################################################
-
-##
-## This section is for make and multilib madness.
-##
-
-# Work around what appears to be a GNU make bug handling MAKEFLAGS
-# values defined in terms of make variables, as is the case for CC and
-# friends when we are called from the top level Makefile.
-AM_MAKEFLAGS = \
-	'AR_FLAGS=$(AR_FLAGS)' \
-	'CC_FOR_BUILD=$(CC_FOR_BUILD)' \
-	'CFLAGS=$(CFLAGS)' \
-	'CXXFLAGS=$(CXXFLAGS)' \
-	'CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)' \
-	'CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)' \
-	'INSTALL=$(INSTALL)' \
-	'INSTALL_DATA=$(INSTALL_DATA)' \
-	'INSTALL_PROGRAM=$(INSTALL_PROGRAM)' \
-	'INSTALL_SCRIPT=$(INSTALL_SCRIPT)' \
-	'JC1FLAGS=$(JC1FLAGS)' \
-	'LDFLAGS=$(LDFLAGS)' \
-	'LIBCFLAGS=$(LIBCFLAGS)' \
-	'LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)' \
-	'MAKE=$(MAKE)' \
-	'MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)' \
-	'PICFLAG=$(PICFLAG)' \
-	'PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)' \
-	'RUNTESTFLAGS=$(RUNTESTFLAGS)' \
-	'SHELL=$(SHELL)' \
-	'exec_prefix=$(exec_prefix)' \
-	'infodir=$(infodir)' \
-	'libdir=$(libdir)' \
-	'mandir=$(mandir)' \
-	'prefix=$(prefix)' \
-	'AR=$(AR)' \
-	'AS=$(AS)' \
-	'CC=$(CC)' \
-	'CXX=$(CXX)' \
-	'LD=$(LD)' \
-	'NM=$(NM)' \
-	'RANLIB=$(RANLIB)' \
-	'DESTDIR=$(DESTDIR)'
-
-# Subdir rules rely on $(FLAGS_TO_PASS)
-FLAGS_TO_PASS = $(AM_MAKEFLAGS)
-
-MAKEOVERRIDES=
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = libffi.pc
-
-toolexeclib_LTLIBRARIES = libffi.la
-noinst_LTLIBRARIES = libffi_convenience.la
-
-libffi_la_SOURCES = src/prep_cif.c src/types.c \
-		src/raw_api.c src/java_raw_api.c src/closures.c
-
-if FFI_DEBUG
-libffi_la_SOURCES += src/debug.c
-endif
-
-noinst_HEADERS = \
-	src/aarch64/ffitarget.h src/aarch64/internal.h			\
-	src/alpha/ffitarget.h src/alpha/internal.h			\
-	src/arc/ffitarget.h						\
-	src/arm/ffitarget.h src/arm/internal.h				\
-	src/avr32/ffitarget.h						\
-	src/bfin/ffitarget.h						\
-	src/cris/ffitarget.h						\
-	src/frv/ffitarget.h						\
-	src/ia64/ffitarget.h src/ia64/ia64_flags.h			\
-	src/m32r/ffitarget.h						\
-	src/m68k/ffitarget.h						\
-	src/m88k/ffitarget.h						\
-	src/metag/ffitarget.h						\
-	src/microblaze/ffitarget.h					\
-	src/mips/ffitarget.h						\
-	src/moxie/ffitarget.h						\
-	src/nios2/ffitarget.h						\
-	src/or1k/ffitarget.h						\
-	src/pa/ffitarget.h						\
-	src/powerpc/ffitarget.h src/powerpc/asm.h src/powerpc/ffi_powerpc.h \
-	src/s390/ffitarget.h						\
-	src/sh/ffitarget.h						\
-	src/sh64/ffitarget.h						\
-	src/sparc/ffitarget.h src/sparc/internal.h			\
-	src/tile/ffitarget.h						\
-	src/vax/ffitarget.h						\
-	src/x86/ffitarget.h src/x86/internal.h src/x86/internal64.h	\
-	src/xtensa/ffitarget.h						\
-	src/dlmalloc.c
-
-EXTRA_libffi_la_SOURCES = \
-	src/aarch64/ffi.c src/aarch64/sysv.S				\
-	src/alpha/ffi.c src/alpha/osf.S					\
-	src/arc/ffi.c src/arc/arcompact.S				\
-	src/arm/ffi.c src/arm/sysv.S					\
-	src/avr32/ffi.c src/avr32/sysv.S				\
-	src/bfin/ffi.c src/bfin/sysv.S					\
-	src/cris/ffi.c src/cris/sysv.S					\
-	src/frv/ffi.c src/frv/eabi.S					\
-	src/ia64/ffi.c src/ia64/unix.S					\
-	src/m32r/ffi.c src/m32r/sysv.S					\
-	src/m68k/ffi.c src/m68k/sysv.S					\
-	src/m88k/ffi.c src/m88k/obsd.S					\
-	src/metag/ffi.c src/metag/sysv.S				\
-	src/microblaze/ffi.c src/microblaze/sysv.S			\
-	src/mips/ffi.c src/mips/o32.S src/mips/n32.S			\
-	src/moxie/ffi.c src/moxie/eabi.S				\
-	src/nios2/ffi.c src/nios2/sysv.S				\
-	src/or1k/ffi.c src/or1k/sysv.S					\
-	src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S			\
-	src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c \
-	 src/powerpc/sysv.S src/powerpc/linux64.S			\
-	 src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S	\
-	 src/powerpc/aix.S src/powerpc/darwin.S src/powerpc/aix_closure.S \
-	 src/powerpc/darwin_closure.S src/powerpc/ffi_darwin.c		\
-	src/s390/ffi.c src/s390/sysv.S					\
-	src/sh/ffi.c src/sh/sysv.S					\
-	src/sh64/ffi.c src/sh64/sysv.S					\
-	src/sparc/ffi.c src/sparc/ffi64.c src/sparc/v8.S src/sparc/v9.S	\
-	src/tile/ffi.c src/tile/tile.S					\
-	src/vax/ffi.c src/vax/elfbsd.S					\
-	src/x86/ffi.c src/x86/sysv.S					\
-	 src/x86/ffiw64.c src/x86/win64.S 				\
-	 src/x86/ffi64.c src/x86/unix64.S				\
-	 src/x86/darwin64.S src/x86/darwin.S				\
-	 src/x86/darwin64_c.c src/x86/darwin_c.c			\
-	src/xtensa/ffi.c src/xtensa/sysv.S
-
-TARGET_OBJ = @TARGET_OBJ@
-libffi_la_LIBADD = $(TARGET_OBJ)
-libffi_la_DEPENDENCIES = $(TARGET_OBJ)
-
-libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
-EXTRA_libffi_convenience_la_SOURCES = $(EXTRA_libffi_la_SOURCES)
-libffi_convenience_la_LIBADD = $(libffi_la_LIBADD)
-libffi_convenience_la_DEPENDENCIES = $(libffi_la_DEPENDENCIES)
-nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)
-
-LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
-
-AM_CFLAGS = -Wall -g -fexceptions
-if FFI_DEBUG
-# Build debug. Define FFI_DEBUG on the commandline so that, when building with
-# MSVC, it can link against the debug CRT.
-AM_CFLAGS += -DFFI_DEBUG
-endif
-
-libffi_la_LDFLAGS = -no-undefined -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)
-
-AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
-AM_CCASFLAGS = $(AM_CPPFLAGS)
-
-# Multilib support.  Automake should provide these on its own.
-all-recursive: all-multi
-install-recursive: install-multi
-mostlyclean-recursive: mostlyclean-multi
-clean-recursive: clean-multi
-distclean-recursive: distclean-multi
-maintainer-clean-recursive: maintainer-clean-multi
diff --git a/third_party/gofrontend/libffi/Makefile.in b/third_party/gofrontend/libffi/Makefile.in
deleted file mode 100644
index 80ad274..0000000
--- a/third_party/gofrontend/libffi/Makefile.in
+++ /dev/null
@@ -1,1860 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-target_triplet = @target@
-@FFI_DEBUG_TRUE@am__append_1 = src/debug.c
-# Build debug. Define FFI_DEBUG on the commandline so that, when building with
-# MSVC, it can link against the debug CRT.
-@FFI_DEBUG_TRUE@am__append_2 = -DFFI_DEBUG
-subdir = .
-DIST_COMMON = README ChangeLog $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/configure \
-	$(am__configure_deps) $(srcdir)/fficonfig.h.in \
-	$(srcdir)/../mkinstalldirs $(srcdir)/libffi.pc.in \
-	$(srcdir)/../depcomp mdate-sh $(srcdir)/doc/version.texi \
-	$(srcdir)/doc/stamp-vti $(noinst_HEADERS)
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
-	$(top_srcdir)/../config/asmcfi.m4 \
-	$(top_srcdir)/../config/depstand.m4 \
-	$(top_srcdir)/../config/lead-dot.m4 \
-	$(top_srcdir)/../config/multi.m4 \
-	$(top_srcdir)/../config/override.m4 \
-	$(top_srcdir)/../libtool.m4 $(top_srcdir)/../ltoptions.m4 \
-	$(top_srcdir)/../ltsugar.m4 $(top_srcdir)/../ltversion.m4 \
-	$(top_srcdir)/../lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
-CONFIG_HEADER = fficonfig.h
-CONFIG_CLEAN_FILES = libffi.pc
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__installdirs = "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(infodir)" \
-	"$(DESTDIR)$(pkgconfigdir)"
-LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES)
-am__DEPENDENCIES_1 =
-am__dirstamp = $(am__leading_dot)dirstamp
-@FFI_DEBUG_TRUE@am__objects_1 = src/debug.lo
-am_libffi_la_OBJECTS = src/prep_cif.lo src/types.lo src/raw_api.lo \
-	src/java_raw_api.lo src/closures.lo $(am__objects_1)
-libffi_la_OBJECTS = $(am_libffi_la_OBJECTS)
-libffi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(libffi_la_LDFLAGS) $(LDFLAGS) -o $@
-am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
-am__objects_2 = src/prep_cif.lo src/types.lo src/raw_api.lo \
-	src/java_raw_api.lo src/closures.lo $(am__objects_1)
-am_libffi_convenience_la_OBJECTS = $(am__objects_2)
-nodist_libffi_convenience_la_OBJECTS =
-libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \
-	$(nodist_libffi_convenience_la_OBJECTS)
-DEFAULT_INCLUDES = -I.@am__isrc@
-depcomp = $(SHELL) $(top_srcdir)/../depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS)
-LTCPPASCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS)
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(libffi_la_SOURCES) $(EXTRA_libffi_la_SOURCES) \
-	$(libffi_convenience_la_SOURCES) \
-	$(EXTRA_libffi_convenience_la_SOURCES) \
-	$(nodist_libffi_convenience_la_SOURCES)
-MULTISRCTOP = 
-MULTIBUILDTOP = 
-MULTIDIRS = 
-MULTISUBDIR = 
-MULTIDO = true
-MULTICLEAN = true
-INFO_DEPS = doc/libffi.info
-am__TEXINFO_TEX_DIR = $(srcdir)/../gcc/doc/include
-DVIS = doc/libffi.dvi
-PDFS = doc/libffi.pdf
-PSS = doc/libffi.ps
-HTMLS = doc/libffi.html
-TEXINFOS = doc/libffi.texi
-TEXI2DVI = texi2dvi
-TEXI2PDF = $(TEXI2DVI) --pdf --batch
-MAKEINFOHTML = $(MAKEINFO) --html
-AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
-DVIPS = dvips
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-DATA = $(pkgconfig_DATA)
-HEADERS = $(noinst_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
-AMTAR = @AMTAR@
-AM_LTLDFLAGS = @AM_LTLDFLAGS@
-AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCAS = @CCAS@
-CCASDEPMODE = @CCASDEPMODE@
-CCASFLAGS = @CCASFLAGS@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
-FGREP = @FGREP@
-GREP = @GREP@
-HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
-HAVE_LONG_DOUBLE_VARIANT = @HAVE_LONG_DOUBLE_VARIANT@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TARGET = @TARGET@
-TARGETDIR = @TARGETDIR@
-TARGET_OBJ = @TARGET_OBJ@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-multi_basedir = @multi_basedir@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target = @target@
-target_alias = @target_alias@
-target_cpu = @target_cpu@
-target_os = @target_os@
-target_vendor = @target_vendor@
-toolexecdir = @toolexecdir@
-toolexeclibdir = @toolexeclibdir@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AUTOMAKE_OPTIONS = foreign subdir-objects
-ACLOCAL_AMFLAGS = -I .. -I ../config
-SUBDIRS = include testsuite man
-EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj			\
-	ChangeLog.libffi ChangeLog.libffi-3.1				\
-	m4/libtool.m4 m4/lt~obsolete.m4					\
-	 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4			\
-	 m4/ltversion.m4 src/debug.c msvcc.sh				\
-	generate-darwin-source-and-headers.py				\
-	libffi.xcodeproj/project.pbxproj				\
-	libtool-ldflags
-
-
-# Automake Documentation:
-# If your package has Texinfo files in many directories, you can use the
-# variable TEXINFO_TEX to tell Automake where to find the canonical
-# `texinfo.tex' for your package. The value of this variable should be
-# the relative path from the current `Makefile.am' to `texinfo.tex'.
-TEXINFO_TEX = ../gcc/doc/include/texinfo.tex
-
-# Defines info, dvi, pdf and html targets
-MAKEINFOFLAGS = -I $(srcdir)/../gcc/doc/include
-info_TEXINFOS = doc/libffi.texi
-@GENINSRC_FALSE@STAMP_GENINSRC = 
-
-# AM_CONDITIONAL on configure option --generated-files-in-srcdir
-@GENINSRC_TRUE@STAMP_GENINSRC = stamp-geninsrc
-@BUILD_INFO_FALSE@STAMP_BUILD_INFO = 
-
-# AM_CONDITIONAL on configure check ACX_CHECK_PROG_VER([MAKEINFO])
-@BUILD_INFO_TRUE@STAMP_BUILD_INFO = stamp-build-info
-CLEANFILES = $(STAMP_GENINSRC) $(STAMP_BUILD_INFO) doc/libffi.info
-MAINTAINERCLEANFILES = $(srcdir)/doc/libffi.info
-
-# Work around what appears to be a GNU make bug handling MAKEFLAGS
-# values defined in terms of make variables, as is the case for CC and
-# friends when we are called from the top level Makefile.
-AM_MAKEFLAGS = \
-	'AR_FLAGS=$(AR_FLAGS)' \
-	'CC_FOR_BUILD=$(CC_FOR_BUILD)' \
-	'CFLAGS=$(CFLAGS)' \
-	'CXXFLAGS=$(CXXFLAGS)' \
-	'CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)' \
-	'CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)' \
-	'INSTALL=$(INSTALL)' \
-	'INSTALL_DATA=$(INSTALL_DATA)' \
-	'INSTALL_PROGRAM=$(INSTALL_PROGRAM)' \
-	'INSTALL_SCRIPT=$(INSTALL_SCRIPT)' \
-	'JC1FLAGS=$(JC1FLAGS)' \
-	'LDFLAGS=$(LDFLAGS)' \
-	'LIBCFLAGS=$(LIBCFLAGS)' \
-	'LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)' \
-	'MAKE=$(MAKE)' \
-	'MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)' \
-	'PICFLAG=$(PICFLAG)' \
-	'PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)' \
-	'RUNTESTFLAGS=$(RUNTESTFLAGS)' \
-	'SHELL=$(SHELL)' \
-	'exec_prefix=$(exec_prefix)' \
-	'infodir=$(infodir)' \
-	'libdir=$(libdir)' \
-	'mandir=$(mandir)' \
-	'prefix=$(prefix)' \
-	'AR=$(AR)' \
-	'AS=$(AS)' \
-	'CC=$(CC)' \
-	'CXX=$(CXX)' \
-	'LD=$(LD)' \
-	'NM=$(NM)' \
-	'RANLIB=$(RANLIB)' \
-	'DESTDIR=$(DESTDIR)'
-
-
-# Subdir rules rely on $(FLAGS_TO_PASS)
-FLAGS_TO_PASS = $(AM_MAKEFLAGS)
-MAKEOVERRIDES = 
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = libffi.pc
-toolexeclib_LTLIBRARIES = libffi.la
-noinst_LTLIBRARIES = libffi_convenience.la
-libffi_la_SOURCES = src/prep_cif.c src/types.c src/raw_api.c \
-	src/java_raw_api.c src/closures.c $(am__append_1)
-noinst_HEADERS = \
-	src/aarch64/ffitarget.h src/aarch64/internal.h			\
-	src/alpha/ffitarget.h src/alpha/internal.h			\
-	src/arc/ffitarget.h						\
-	src/arm/ffitarget.h src/arm/internal.h				\
-	src/avr32/ffitarget.h						\
-	src/bfin/ffitarget.h						\
-	src/cris/ffitarget.h						\
-	src/frv/ffitarget.h						\
-	src/ia64/ffitarget.h src/ia64/ia64_flags.h			\
-	src/m32r/ffitarget.h						\
-	src/m68k/ffitarget.h						\
-	src/m88k/ffitarget.h						\
-	src/metag/ffitarget.h						\
-	src/microblaze/ffitarget.h					\
-	src/mips/ffitarget.h						\
-	src/moxie/ffitarget.h						\
-	src/nios2/ffitarget.h						\
-	src/or1k/ffitarget.h						\
-	src/pa/ffitarget.h						\
-	src/powerpc/ffitarget.h src/powerpc/asm.h src/powerpc/ffi_powerpc.h \
-	src/s390/ffitarget.h						\
-	src/sh/ffitarget.h						\
-	src/sh64/ffitarget.h						\
-	src/sparc/ffitarget.h src/sparc/internal.h			\
-	src/tile/ffitarget.h						\
-	src/vax/ffitarget.h						\
-	src/x86/ffitarget.h src/x86/internal.h src/x86/internal64.h	\
-	src/xtensa/ffitarget.h						\
-	src/dlmalloc.c
-
-EXTRA_libffi_la_SOURCES = \
-	src/aarch64/ffi.c src/aarch64/sysv.S				\
-	src/alpha/ffi.c src/alpha/osf.S					\
-	src/arc/ffi.c src/arc/arcompact.S				\
-	src/arm/ffi.c src/arm/sysv.S					\
-	src/avr32/ffi.c src/avr32/sysv.S				\
-	src/bfin/ffi.c src/bfin/sysv.S					\
-	src/cris/ffi.c src/cris/sysv.S					\
-	src/frv/ffi.c src/frv/eabi.S					\
-	src/ia64/ffi.c src/ia64/unix.S					\
-	src/m32r/ffi.c src/m32r/sysv.S					\
-	src/m68k/ffi.c src/m68k/sysv.S					\
-	src/m88k/ffi.c src/m88k/obsd.S					\
-	src/metag/ffi.c src/metag/sysv.S				\
-	src/microblaze/ffi.c src/microblaze/sysv.S			\
-	src/mips/ffi.c src/mips/o32.S src/mips/n32.S			\
-	src/moxie/ffi.c src/moxie/eabi.S				\
-	src/nios2/ffi.c src/nios2/sysv.S				\
-	src/or1k/ffi.c src/or1k/sysv.S					\
-	src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S			\
-	src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c \
-	 src/powerpc/sysv.S src/powerpc/linux64.S			\
-	 src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S	\
-	 src/powerpc/aix.S src/powerpc/darwin.S src/powerpc/aix_closure.S \
-	 src/powerpc/darwin_closure.S src/powerpc/ffi_darwin.c		\
-	src/s390/ffi.c src/s390/sysv.S					\
-	src/sh/ffi.c src/sh/sysv.S					\
-	src/sh64/ffi.c src/sh64/sysv.S					\
-	src/sparc/ffi.c src/sparc/ffi64.c src/sparc/v8.S src/sparc/v9.S	\
-	src/tile/ffi.c src/tile/tile.S					\
-	src/vax/ffi.c src/vax/elfbsd.S					\
-	src/x86/ffi.c src/x86/sysv.S					\
-	 src/x86/ffiw64.c src/x86/win64.S 				\
-	 src/x86/ffi64.c src/x86/unix64.S				\
-	 src/x86/darwin64.S src/x86/darwin.S				\
-	 src/x86/darwin64_c.c src/x86/darwin_c.c			\
-	src/xtensa/ffi.c src/xtensa/sysv.S
-
-libffi_la_LIBADD = $(TARGET_OBJ)
-libffi_la_DEPENDENCIES = $(TARGET_OBJ)
-libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
-EXTRA_libffi_convenience_la_SOURCES = $(EXTRA_libffi_la_SOURCES)
-libffi_convenience_la_LIBADD = $(libffi_la_LIBADD)
-libffi_convenience_la_DEPENDENCIES = $(libffi_la_DEPENDENCIES)
-nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)
-LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
-AM_CFLAGS = -Wall -g -fexceptions $(am__append_2)
-libffi_la_LDFLAGS = -no-undefined -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)
-AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
-AM_CCASFLAGS = $(AM_CPPFLAGS)
-all: fficonfig.h
-	$(MAKE) $(AM_MAKEFLAGS) all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .S .c .dvi .lo .o .obj .ps
-am--refresh:
-	@:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
-	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	$(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-$(am__aclocal_m4_deps):
-
-fficonfig.h: stamp-h1
-	@if test ! -f $@; then \
-	  rm -f stamp-h1; \
-	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
-	else :; fi
-
-stamp-h1: $(srcdir)/fficonfig.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status fficonfig.h
-$(srcdir)/fficonfig.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
-	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
-	rm -f stamp-h1
-	touch $@
-
-distclean-hdr:
-	-rm -f fficonfig.h stamp-h1
-libffi.pc: $(top_builddir)/config.status $(srcdir)/libffi.pc.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-
-clean-noinstLTLIBRARIES:
-	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
-	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(toolexeclibdir)" || $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)"
-	@list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(toolexeclibdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(toolexeclibdir)"; \
-	}
-
-uninstall-toolexeclibLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(toolexeclibdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(toolexeclibdir)/$$f"; \
-	done
-
-clean-toolexeclibLTLIBRARIES:
-	-test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES)
-	@list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-src/$(am__dirstamp):
-	@$(MKDIR_P) src
-	@: > src/$(am__dirstamp)
-src/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/$(DEPDIR)
-	@: > src/$(DEPDIR)/$(am__dirstamp)
-src/prep_cif.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
-src/types.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
-src/raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
-src/java_raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
-src/closures.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
-src/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
-src/aarch64/$(am__dirstamp):
-	@$(MKDIR_P) src/aarch64
-	@: > src/aarch64/$(am__dirstamp)
-src/aarch64/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/aarch64/$(DEPDIR)
-	@: > src/aarch64/$(DEPDIR)/$(am__dirstamp)
-src/aarch64/ffi.lo: src/aarch64/$(am__dirstamp) \
-	src/aarch64/$(DEPDIR)/$(am__dirstamp)
-src/aarch64/sysv.lo: src/aarch64/$(am__dirstamp) \
-	src/aarch64/$(DEPDIR)/$(am__dirstamp)
-src/alpha/$(am__dirstamp):
-	@$(MKDIR_P) src/alpha
-	@: > src/alpha/$(am__dirstamp)
-src/alpha/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/alpha/$(DEPDIR)
-	@: > src/alpha/$(DEPDIR)/$(am__dirstamp)
-src/alpha/ffi.lo: src/alpha/$(am__dirstamp) \
-	src/alpha/$(DEPDIR)/$(am__dirstamp)
-src/alpha/osf.lo: src/alpha/$(am__dirstamp) \
-	src/alpha/$(DEPDIR)/$(am__dirstamp)
-src/arc/$(am__dirstamp):
-	@$(MKDIR_P) src/arc
-	@: > src/arc/$(am__dirstamp)
-src/arc/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/arc/$(DEPDIR)
-	@: > src/arc/$(DEPDIR)/$(am__dirstamp)
-src/arc/ffi.lo: src/arc/$(am__dirstamp) \
-	src/arc/$(DEPDIR)/$(am__dirstamp)
-src/arc/arcompact.lo: src/arc/$(am__dirstamp) \
-	src/arc/$(DEPDIR)/$(am__dirstamp)
-src/arm/$(am__dirstamp):
-	@$(MKDIR_P) src/arm
-	@: > src/arm/$(am__dirstamp)
-src/arm/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/arm/$(DEPDIR)
-	@: > src/arm/$(DEPDIR)/$(am__dirstamp)
-src/arm/ffi.lo: src/arm/$(am__dirstamp) \
-	src/arm/$(DEPDIR)/$(am__dirstamp)
-src/arm/sysv.lo: src/arm/$(am__dirstamp) \
-	src/arm/$(DEPDIR)/$(am__dirstamp)
-src/avr32/$(am__dirstamp):
-	@$(MKDIR_P) src/avr32
-	@: > src/avr32/$(am__dirstamp)
-src/avr32/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/avr32/$(DEPDIR)
-	@: > src/avr32/$(DEPDIR)/$(am__dirstamp)
-src/avr32/ffi.lo: src/avr32/$(am__dirstamp) \
-	src/avr32/$(DEPDIR)/$(am__dirstamp)
-src/avr32/sysv.lo: src/avr32/$(am__dirstamp) \
-	src/avr32/$(DEPDIR)/$(am__dirstamp)
-src/bfin/$(am__dirstamp):
-	@$(MKDIR_P) src/bfin
-	@: > src/bfin/$(am__dirstamp)
-src/bfin/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/bfin/$(DEPDIR)
-	@: > src/bfin/$(DEPDIR)/$(am__dirstamp)
-src/bfin/ffi.lo: src/bfin/$(am__dirstamp) \
-	src/bfin/$(DEPDIR)/$(am__dirstamp)
-src/bfin/sysv.lo: src/bfin/$(am__dirstamp) \
-	src/bfin/$(DEPDIR)/$(am__dirstamp)
-src/cris/$(am__dirstamp):
-	@$(MKDIR_P) src/cris
-	@: > src/cris/$(am__dirstamp)
-src/cris/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/cris/$(DEPDIR)
-	@: > src/cris/$(DEPDIR)/$(am__dirstamp)
-src/cris/ffi.lo: src/cris/$(am__dirstamp) \
-	src/cris/$(DEPDIR)/$(am__dirstamp)
-src/cris/sysv.lo: src/cris/$(am__dirstamp) \
-	src/cris/$(DEPDIR)/$(am__dirstamp)
-src/frv/$(am__dirstamp):
-	@$(MKDIR_P) src/frv
-	@: > src/frv/$(am__dirstamp)
-src/frv/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/frv/$(DEPDIR)
-	@: > src/frv/$(DEPDIR)/$(am__dirstamp)
-src/frv/ffi.lo: src/frv/$(am__dirstamp) \
-	src/frv/$(DEPDIR)/$(am__dirstamp)
-src/frv/eabi.lo: src/frv/$(am__dirstamp) \
-	src/frv/$(DEPDIR)/$(am__dirstamp)
-src/ia64/$(am__dirstamp):
-	@$(MKDIR_P) src/ia64
-	@: > src/ia64/$(am__dirstamp)
-src/ia64/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/ia64/$(DEPDIR)
-	@: > src/ia64/$(DEPDIR)/$(am__dirstamp)
-src/ia64/ffi.lo: src/ia64/$(am__dirstamp) \
-	src/ia64/$(DEPDIR)/$(am__dirstamp)
-src/ia64/unix.lo: src/ia64/$(am__dirstamp) \
-	src/ia64/$(DEPDIR)/$(am__dirstamp)
-src/m32r/$(am__dirstamp):
-	@$(MKDIR_P) src/m32r
-	@: > src/m32r/$(am__dirstamp)
-src/m32r/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/m32r/$(DEPDIR)
-	@: > src/m32r/$(DEPDIR)/$(am__dirstamp)
-src/m32r/ffi.lo: src/m32r/$(am__dirstamp) \
-	src/m32r/$(DEPDIR)/$(am__dirstamp)
-src/m32r/sysv.lo: src/m32r/$(am__dirstamp) \
-	src/m32r/$(DEPDIR)/$(am__dirstamp)
-src/m68k/$(am__dirstamp):
-	@$(MKDIR_P) src/m68k
-	@: > src/m68k/$(am__dirstamp)
-src/m68k/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/m68k/$(DEPDIR)
-	@: > src/m68k/$(DEPDIR)/$(am__dirstamp)
-src/m68k/ffi.lo: src/m68k/$(am__dirstamp) \
-	src/m68k/$(DEPDIR)/$(am__dirstamp)
-src/m68k/sysv.lo: src/m68k/$(am__dirstamp) \
-	src/m68k/$(DEPDIR)/$(am__dirstamp)
-src/m88k/$(am__dirstamp):
-	@$(MKDIR_P) src/m88k
-	@: > src/m88k/$(am__dirstamp)
-src/m88k/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/m88k/$(DEPDIR)
-	@: > src/m88k/$(DEPDIR)/$(am__dirstamp)
-src/m88k/ffi.lo: src/m88k/$(am__dirstamp) \
-	src/m88k/$(DEPDIR)/$(am__dirstamp)
-src/m88k/obsd.lo: src/m88k/$(am__dirstamp) \
-	src/m88k/$(DEPDIR)/$(am__dirstamp)
-src/metag/$(am__dirstamp):
-	@$(MKDIR_P) src/metag
-	@: > src/metag/$(am__dirstamp)
-src/metag/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/metag/$(DEPDIR)
-	@: > src/metag/$(DEPDIR)/$(am__dirstamp)
-src/metag/ffi.lo: src/metag/$(am__dirstamp) \
-	src/metag/$(DEPDIR)/$(am__dirstamp)
-src/metag/sysv.lo: src/metag/$(am__dirstamp) \
-	src/metag/$(DEPDIR)/$(am__dirstamp)
-src/microblaze/$(am__dirstamp):
-	@$(MKDIR_P) src/microblaze
-	@: > src/microblaze/$(am__dirstamp)
-src/microblaze/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/microblaze/$(DEPDIR)
-	@: > src/microblaze/$(DEPDIR)/$(am__dirstamp)
-src/microblaze/ffi.lo: src/microblaze/$(am__dirstamp) \
-	src/microblaze/$(DEPDIR)/$(am__dirstamp)
-src/microblaze/sysv.lo: src/microblaze/$(am__dirstamp) \
-	src/microblaze/$(DEPDIR)/$(am__dirstamp)
-src/mips/$(am__dirstamp):
-	@$(MKDIR_P) src/mips
-	@: > src/mips/$(am__dirstamp)
-src/mips/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/mips/$(DEPDIR)
-	@: > src/mips/$(DEPDIR)/$(am__dirstamp)
-src/mips/ffi.lo: src/mips/$(am__dirstamp) \
-	src/mips/$(DEPDIR)/$(am__dirstamp)
-src/mips/o32.lo: src/mips/$(am__dirstamp) \
-	src/mips/$(DEPDIR)/$(am__dirstamp)
-src/mips/n32.lo: src/mips/$(am__dirstamp) \
-	src/mips/$(DEPDIR)/$(am__dirstamp)
-src/moxie/$(am__dirstamp):
-	@$(MKDIR_P) src/moxie
-	@: > src/moxie/$(am__dirstamp)
-src/moxie/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/moxie/$(DEPDIR)
-	@: > src/moxie/$(DEPDIR)/$(am__dirstamp)
-src/moxie/ffi.lo: src/moxie/$(am__dirstamp) \
-	src/moxie/$(DEPDIR)/$(am__dirstamp)
-src/moxie/eabi.lo: src/moxie/$(am__dirstamp) \
-	src/moxie/$(DEPDIR)/$(am__dirstamp)
-src/nios2/$(am__dirstamp):
-	@$(MKDIR_P) src/nios2
-	@: > src/nios2/$(am__dirstamp)
-src/nios2/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/nios2/$(DEPDIR)
-	@: > src/nios2/$(DEPDIR)/$(am__dirstamp)
-src/nios2/ffi.lo: src/nios2/$(am__dirstamp) \
-	src/nios2/$(DEPDIR)/$(am__dirstamp)
-src/nios2/sysv.lo: src/nios2/$(am__dirstamp) \
-	src/nios2/$(DEPDIR)/$(am__dirstamp)
-src/or1k/$(am__dirstamp):
-	@$(MKDIR_P) src/or1k
-	@: > src/or1k/$(am__dirstamp)
-src/or1k/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/or1k/$(DEPDIR)
-	@: > src/or1k/$(DEPDIR)/$(am__dirstamp)
-src/or1k/ffi.lo: src/or1k/$(am__dirstamp) \
-	src/or1k/$(DEPDIR)/$(am__dirstamp)
-src/or1k/sysv.lo: src/or1k/$(am__dirstamp) \
-	src/or1k/$(DEPDIR)/$(am__dirstamp)
-src/pa/$(am__dirstamp):
-	@$(MKDIR_P) src/pa
-	@: > src/pa/$(am__dirstamp)
-src/pa/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/pa/$(DEPDIR)
-	@: > src/pa/$(DEPDIR)/$(am__dirstamp)
-src/pa/ffi.lo: src/pa/$(am__dirstamp) src/pa/$(DEPDIR)/$(am__dirstamp)
-src/pa/linux.lo: src/pa/$(am__dirstamp) \
-	src/pa/$(DEPDIR)/$(am__dirstamp)
-src/pa/hpux32.lo: src/pa/$(am__dirstamp) \
-	src/pa/$(DEPDIR)/$(am__dirstamp)
-src/powerpc/$(am__dirstamp):
-	@$(MKDIR_P) src/powerpc
-	@: > src/powerpc/$(am__dirstamp)
-src/powerpc/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/powerpc/$(DEPDIR)
-	@: > src/powerpc/$(DEPDIR)/$(am__dirstamp)
-src/powerpc/ffi.lo: src/powerpc/$(am__dirstamp) \
-	src/powerpc/$(DEPDIR)/$(am__dirstamp)
-src/powerpc/ffi_sysv.lo: src/powerpc/$(am__dirstamp) \
-	src/powerpc/$(DEPDIR)/$(am__dirstamp)
-src/powerpc/ffi_linux64.lo: src/powerpc/$(am__dirstamp) \
-	src/powerpc/$(DEPDIR)/$(am__dirstamp)
-src/powerpc/sysv.lo: src/powerpc/$(am__dirstamp) \
-	src/powerpc/$(DEPDIR)/$(am__dirstamp)
-src/powerpc/linux64.lo: src/powerpc/$(am__dirstamp) \
-	src/powerpc/$(DEPDIR)/$(am__dirstamp)
-src/powerpc/linux64_closure.lo: src/powerpc/$(am__dirstamp) \
-	src/powerpc/$(DEPDIR)/$(am__dirstamp)
-src/powerpc/ppc_closure.lo: src/powerpc/$(am__dirstamp) \
-	src/powerpc/$(DEPDIR)/$(am__dirstamp)
-src/powerpc/aix.lo: src/powerpc/$(am__dirstamp) \
-	src/powerpc/$(DEPDIR)/$(am__dirstamp)
-src/powerpc/darwin.lo: src/powerpc/$(am__dirstamp) \
-	src/powerpc/$(DEPDIR)/$(am__dirstamp)
-src/powerpc/aix_closure.lo: src/powerpc/$(am__dirstamp) \
-	src/powerpc/$(DEPDIR)/$(am__dirstamp)
-src/powerpc/darwin_closure.lo: src/powerpc/$(am__dirstamp) \
-	src/powerpc/$(DEPDIR)/$(am__dirstamp)
-src/powerpc/ffi_darwin.lo: src/powerpc/$(am__dirstamp) \
-	src/powerpc/$(DEPDIR)/$(am__dirstamp)
-src/s390/$(am__dirstamp):
-	@$(MKDIR_P) src/s390
-	@: > src/s390/$(am__dirstamp)
-src/s390/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/s390/$(DEPDIR)
-	@: > src/s390/$(DEPDIR)/$(am__dirstamp)
-src/s390/ffi.lo: src/s390/$(am__dirstamp) \
-	src/s390/$(DEPDIR)/$(am__dirstamp)
-src/s390/sysv.lo: src/s390/$(am__dirstamp) \
-	src/s390/$(DEPDIR)/$(am__dirstamp)
-src/sh/$(am__dirstamp):
-	@$(MKDIR_P) src/sh
-	@: > src/sh/$(am__dirstamp)
-src/sh/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/sh/$(DEPDIR)
-	@: > src/sh/$(DEPDIR)/$(am__dirstamp)
-src/sh/ffi.lo: src/sh/$(am__dirstamp) src/sh/$(DEPDIR)/$(am__dirstamp)
-src/sh/sysv.lo: src/sh/$(am__dirstamp) \
-	src/sh/$(DEPDIR)/$(am__dirstamp)
-src/sh64/$(am__dirstamp):
-	@$(MKDIR_P) src/sh64
-	@: > src/sh64/$(am__dirstamp)
-src/sh64/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/sh64/$(DEPDIR)
-	@: > src/sh64/$(DEPDIR)/$(am__dirstamp)
-src/sh64/ffi.lo: src/sh64/$(am__dirstamp) \
-	src/sh64/$(DEPDIR)/$(am__dirstamp)
-src/sh64/sysv.lo: src/sh64/$(am__dirstamp) \
-	src/sh64/$(DEPDIR)/$(am__dirstamp)
-src/sparc/$(am__dirstamp):
-	@$(MKDIR_P) src/sparc
-	@: > src/sparc/$(am__dirstamp)
-src/sparc/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/sparc/$(DEPDIR)
-	@: > src/sparc/$(DEPDIR)/$(am__dirstamp)
-src/sparc/ffi.lo: src/sparc/$(am__dirstamp) \
-	src/sparc/$(DEPDIR)/$(am__dirstamp)
-src/sparc/ffi64.lo: src/sparc/$(am__dirstamp) \
-	src/sparc/$(DEPDIR)/$(am__dirstamp)
-src/sparc/v8.lo: src/sparc/$(am__dirstamp) \
-	src/sparc/$(DEPDIR)/$(am__dirstamp)
-src/sparc/v9.lo: src/sparc/$(am__dirstamp) \
-	src/sparc/$(DEPDIR)/$(am__dirstamp)
-src/tile/$(am__dirstamp):
-	@$(MKDIR_P) src/tile
-	@: > src/tile/$(am__dirstamp)
-src/tile/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/tile/$(DEPDIR)
-	@: > src/tile/$(DEPDIR)/$(am__dirstamp)
-src/tile/ffi.lo: src/tile/$(am__dirstamp) \
-	src/tile/$(DEPDIR)/$(am__dirstamp)
-src/tile/tile.lo: src/tile/$(am__dirstamp) \
-	src/tile/$(DEPDIR)/$(am__dirstamp)
-src/vax/$(am__dirstamp):
-	@$(MKDIR_P) src/vax
-	@: > src/vax/$(am__dirstamp)
-src/vax/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/vax/$(DEPDIR)
-	@: > src/vax/$(DEPDIR)/$(am__dirstamp)
-src/vax/ffi.lo: src/vax/$(am__dirstamp) \
-	src/vax/$(DEPDIR)/$(am__dirstamp)
-src/vax/elfbsd.lo: src/vax/$(am__dirstamp) \
-	src/vax/$(DEPDIR)/$(am__dirstamp)
-src/x86/$(am__dirstamp):
-	@$(MKDIR_P) src/x86
-	@: > src/x86/$(am__dirstamp)
-src/x86/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/x86/$(DEPDIR)
-	@: > src/x86/$(DEPDIR)/$(am__dirstamp)
-src/x86/ffi.lo: src/x86/$(am__dirstamp) \
-	src/x86/$(DEPDIR)/$(am__dirstamp)
-src/x86/sysv.lo: src/x86/$(am__dirstamp) \
-	src/x86/$(DEPDIR)/$(am__dirstamp)
-src/x86/ffiw64.lo: src/x86/$(am__dirstamp) \
-	src/x86/$(DEPDIR)/$(am__dirstamp)
-src/x86/win64.lo: src/x86/$(am__dirstamp) \
-	src/x86/$(DEPDIR)/$(am__dirstamp)
-src/x86/ffi64.lo: src/x86/$(am__dirstamp) \
-	src/x86/$(DEPDIR)/$(am__dirstamp)
-src/x86/unix64.lo: src/x86/$(am__dirstamp) \
-	src/x86/$(DEPDIR)/$(am__dirstamp)
-src/x86/darwin64.lo: src/x86/$(am__dirstamp) \
-	src/x86/$(DEPDIR)/$(am__dirstamp)
-src/x86/darwin.lo: src/x86/$(am__dirstamp) \
-	src/x86/$(DEPDIR)/$(am__dirstamp)
-src/x86/darwin64_c.lo: src/x86/$(am__dirstamp) \
-	src/x86/$(DEPDIR)/$(am__dirstamp)
-src/x86/darwin_c.lo: src/x86/$(am__dirstamp) \
-	src/x86/$(DEPDIR)/$(am__dirstamp)
-src/xtensa/$(am__dirstamp):
-	@$(MKDIR_P) src/xtensa
-	@: > src/xtensa/$(am__dirstamp)
-src/xtensa/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/xtensa/$(DEPDIR)
-	@: > src/xtensa/$(DEPDIR)/$(am__dirstamp)
-src/xtensa/ffi.lo: src/xtensa/$(am__dirstamp) \
-	src/xtensa/$(DEPDIR)/$(am__dirstamp)
-src/xtensa/sysv.lo: src/xtensa/$(am__dirstamp) \
-	src/xtensa/$(DEPDIR)/$(am__dirstamp)
-libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) 
-	$(libffi_la_LINK) -rpath $(toolexeclibdir) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS)
-libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) 
-	$(LINK)  $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-	-rm -f src/aarch64/ffi.$(OBJEXT)
-	-rm -f src/aarch64/ffi.lo
-	-rm -f src/aarch64/sysv.$(OBJEXT)
-	-rm -f src/aarch64/sysv.lo
-	-rm -f src/alpha/ffi.$(OBJEXT)
-	-rm -f src/alpha/ffi.lo
-	-rm -f src/alpha/osf.$(OBJEXT)
-	-rm -f src/alpha/osf.lo
-	-rm -f src/arc/arcompact.$(OBJEXT)
-	-rm -f src/arc/arcompact.lo
-	-rm -f src/arc/ffi.$(OBJEXT)
-	-rm -f src/arc/ffi.lo
-	-rm -f src/arm/ffi.$(OBJEXT)
-	-rm -f src/arm/ffi.lo
-	-rm -f src/arm/sysv.$(OBJEXT)
-	-rm -f src/arm/sysv.lo
-	-rm -f src/avr32/ffi.$(OBJEXT)
-	-rm -f src/avr32/ffi.lo
-	-rm -f src/avr32/sysv.$(OBJEXT)
-	-rm -f src/avr32/sysv.lo
-	-rm -f src/bfin/ffi.$(OBJEXT)
-	-rm -f src/bfin/ffi.lo
-	-rm -f src/bfin/sysv.$(OBJEXT)
-	-rm -f src/bfin/sysv.lo
-	-rm -f src/closures.$(OBJEXT)
-	-rm -f src/closures.lo
-	-rm -f src/cris/ffi.$(OBJEXT)
-	-rm -f src/cris/ffi.lo
-	-rm -f src/cris/sysv.$(OBJEXT)
-	-rm -f src/cris/sysv.lo
-	-rm -f src/debug.$(OBJEXT)
-	-rm -f src/debug.lo
-	-rm -f src/frv/eabi.$(OBJEXT)
-	-rm -f src/frv/eabi.lo
-	-rm -f src/frv/ffi.$(OBJEXT)
-	-rm -f src/frv/ffi.lo
-	-rm -f src/ia64/ffi.$(OBJEXT)
-	-rm -f src/ia64/ffi.lo
-	-rm -f src/ia64/unix.$(OBJEXT)
-	-rm -f src/ia64/unix.lo
-	-rm -f src/java_raw_api.$(OBJEXT)
-	-rm -f src/java_raw_api.lo
-	-rm -f src/m32r/ffi.$(OBJEXT)
-	-rm -f src/m32r/ffi.lo
-	-rm -f src/m32r/sysv.$(OBJEXT)
-	-rm -f src/m32r/sysv.lo
-	-rm -f src/m68k/ffi.$(OBJEXT)
-	-rm -f src/m68k/ffi.lo
-	-rm -f src/m68k/sysv.$(OBJEXT)
-	-rm -f src/m68k/sysv.lo
-	-rm -f src/m88k/ffi.$(OBJEXT)
-	-rm -f src/m88k/ffi.lo
-	-rm -f src/m88k/obsd.$(OBJEXT)
-	-rm -f src/m88k/obsd.lo
-	-rm -f src/metag/ffi.$(OBJEXT)
-	-rm -f src/metag/ffi.lo
-	-rm -f src/metag/sysv.$(OBJEXT)
-	-rm -f src/metag/sysv.lo
-	-rm -f src/microblaze/ffi.$(OBJEXT)
-	-rm -f src/microblaze/ffi.lo
-	-rm -f src/microblaze/sysv.$(OBJEXT)
-	-rm -f src/microblaze/sysv.lo
-	-rm -f src/mips/ffi.$(OBJEXT)
-	-rm -f src/mips/ffi.lo
-	-rm -f src/mips/n32.$(OBJEXT)
-	-rm -f src/mips/n32.lo
-	-rm -f src/mips/o32.$(OBJEXT)
-	-rm -f src/mips/o32.lo
-	-rm -f src/moxie/eabi.$(OBJEXT)
-	-rm -f src/moxie/eabi.lo
-	-rm -f src/moxie/ffi.$(OBJEXT)
-	-rm -f src/moxie/ffi.lo
-	-rm -f src/nios2/ffi.$(OBJEXT)
-	-rm -f src/nios2/ffi.lo
-	-rm -f src/nios2/sysv.$(OBJEXT)
-	-rm -f src/nios2/sysv.lo
-	-rm -f src/or1k/ffi.$(OBJEXT)
-	-rm -f src/or1k/ffi.lo
-	-rm -f src/or1k/sysv.$(OBJEXT)
-	-rm -f src/or1k/sysv.lo
-	-rm -f src/pa/ffi.$(OBJEXT)
-	-rm -f src/pa/ffi.lo
-	-rm -f src/pa/hpux32.$(OBJEXT)
-	-rm -f src/pa/hpux32.lo
-	-rm -f src/pa/linux.$(OBJEXT)
-	-rm -f src/pa/linux.lo
-	-rm -f src/powerpc/aix.$(OBJEXT)
-	-rm -f src/powerpc/aix.lo
-	-rm -f src/powerpc/aix_closure.$(OBJEXT)
-	-rm -f src/powerpc/aix_closure.lo
-	-rm -f src/powerpc/darwin.$(OBJEXT)
-	-rm -f src/powerpc/darwin.lo
-	-rm -f src/powerpc/darwin_closure.$(OBJEXT)
-	-rm -f src/powerpc/darwin_closure.lo
-	-rm -f src/powerpc/ffi.$(OBJEXT)
-	-rm -f src/powerpc/ffi.lo
-	-rm -f src/powerpc/ffi_darwin.$(OBJEXT)
-	-rm -f src/powerpc/ffi_darwin.lo
-	-rm -f src/powerpc/ffi_linux64.$(OBJEXT)
-	-rm -f src/powerpc/ffi_linux64.lo
-	-rm -f src/powerpc/ffi_sysv.$(OBJEXT)
-	-rm -f src/powerpc/ffi_sysv.lo
-	-rm -f src/powerpc/linux64.$(OBJEXT)
-	-rm -f src/powerpc/linux64.lo
-	-rm -f src/powerpc/linux64_closure.$(OBJEXT)
-	-rm -f src/powerpc/linux64_closure.lo
-	-rm -f src/powerpc/ppc_closure.$(OBJEXT)
-	-rm -f src/powerpc/ppc_closure.lo
-	-rm -f src/powerpc/sysv.$(OBJEXT)
-	-rm -f src/powerpc/sysv.lo
-	-rm -f src/prep_cif.$(OBJEXT)
-	-rm -f src/prep_cif.lo
-	-rm -f src/raw_api.$(OBJEXT)
-	-rm -f src/raw_api.lo
-	-rm -f src/s390/ffi.$(OBJEXT)
-	-rm -f src/s390/ffi.lo
-	-rm -f src/s390/sysv.$(OBJEXT)
-	-rm -f src/s390/sysv.lo
-	-rm -f src/sh/ffi.$(OBJEXT)
-	-rm -f src/sh/ffi.lo
-	-rm -f src/sh/sysv.$(OBJEXT)
-	-rm -f src/sh/sysv.lo
-	-rm -f src/sh64/ffi.$(OBJEXT)
-	-rm -f src/sh64/ffi.lo
-	-rm -f src/sh64/sysv.$(OBJEXT)
-	-rm -f src/sh64/sysv.lo
-	-rm -f src/sparc/ffi.$(OBJEXT)
-	-rm -f src/sparc/ffi.lo
-	-rm -f src/sparc/ffi64.$(OBJEXT)
-	-rm -f src/sparc/ffi64.lo
-	-rm -f src/sparc/v8.$(OBJEXT)
-	-rm -f src/sparc/v8.lo
-	-rm -f src/sparc/v9.$(OBJEXT)
-	-rm -f src/sparc/v9.lo
-	-rm -f src/tile/ffi.$(OBJEXT)
-	-rm -f src/tile/ffi.lo
-	-rm -f src/tile/tile.$(OBJEXT)
-	-rm -f src/tile/tile.lo
-	-rm -f src/types.$(OBJEXT)
-	-rm -f src/types.lo
-	-rm -f src/vax/elfbsd.$(OBJEXT)
-	-rm -f src/vax/elfbsd.lo
-	-rm -f src/vax/ffi.$(OBJEXT)
-	-rm -f src/vax/ffi.lo
-	-rm -f src/x86/darwin.$(OBJEXT)
-	-rm -f src/x86/darwin.lo
-	-rm -f src/x86/darwin64.$(OBJEXT)
-	-rm -f src/x86/darwin64.lo
-	-rm -f src/x86/darwin64_c.$(OBJEXT)
-	-rm -f src/x86/darwin64_c.lo
-	-rm -f src/x86/darwin_c.$(OBJEXT)
-	-rm -f src/x86/darwin_c.lo
-	-rm -f src/x86/ffi.$(OBJEXT)
-	-rm -f src/x86/ffi.lo
-	-rm -f src/x86/ffi64.$(OBJEXT)
-	-rm -f src/x86/ffi64.lo
-	-rm -f src/x86/ffiw64.$(OBJEXT)
-	-rm -f src/x86/ffiw64.lo
-	-rm -f src/x86/sysv.$(OBJEXT)
-	-rm -f src/x86/sysv.lo
-	-rm -f src/x86/unix64.$(OBJEXT)
-	-rm -f src/x86/unix64.lo
-	-rm -f src/x86/win64.$(OBJEXT)
-	-rm -f src/x86/win64.lo
-	-rm -f src/xtensa/ffi.$(OBJEXT)
-	-rm -f src/xtensa/ffi.lo
-	-rm -f src/xtensa/sysv.$(OBJEXT)
-	-rm -f src/xtensa/sysv.lo
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/closures.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/debug.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/java_raw_api.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/prep_cif.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/raw_api.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/types.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/aarch64/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/aarch64/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/osf.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/arc/$(DEPDIR)/arcompact.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/arc/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/bfin/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/bfin/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/eabi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/ia64/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/ia64/$(DEPDIR)/unix.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/m32r/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/m32r/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/m68k/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/m68k/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/m88k/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/m88k/$(DEPDIR)/obsd.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/metag/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/metag/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/microblaze/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/microblaze/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/n32.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/o32.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/eabi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/nios2/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/nios2/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/or1k/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/or1k/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/hpux32.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/linux.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix_closure.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/darwin.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/darwin_closure.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi_darwin.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi_linux64.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi_sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/linux64.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/linux64_closure.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ppc_closure.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/s390/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/s390/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/sh/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/sh/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/sh64/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/sh64/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/ffi64.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/v8.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/v9.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/tile/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/tile/$(DEPDIR)/tile.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/vax/$(DEPDIR)/elfbsd.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/vax/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin64.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin64_c.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin_c.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi64.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffiw64.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/sysv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/unix64.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/win64.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/xtensa/$(DEPDIR)/ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/xtensa/$(DEPDIR)/sysv.Plo@am__quote@
-
-.S.o:
-@am__fastdepCCAS_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
-@am__fastdepCCAS_TRUE@	$(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCCAS_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCCAS_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCCAS_FALSE@	DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCCAS_FALSE@	$(CPPASCOMPILE) -c -o $@ $<
-
-.S.obj:
-@am__fastdepCCAS_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
-@am__fastdepCCAS_TRUE@	$(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
-@am__fastdepCCAS_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCCAS_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCCAS_FALSE@	DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCCAS_FALSE@	$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.S.lo:
-@am__fastdepCCAS_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
-@am__fastdepCCAS_TRUE@	$(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCCAS_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
-@AMDEP_TRUE@@am__fastdepCCAS_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCCAS_FALSE@	DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCCAS_FALSE@	$(LTCPPASCOMPILE) -c -o $@ $<
-
-.c.o:
-@am__fastdepCC_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c -o $@ $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
-@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
-@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-	-rm -rf src/.libs src/_libs
-	-rm -rf src/aarch64/.libs src/aarch64/_libs
-	-rm -rf src/alpha/.libs src/alpha/_libs
-	-rm -rf src/arc/.libs src/arc/_libs
-	-rm -rf src/arm/.libs src/arm/_libs
-	-rm -rf src/avr32/.libs src/avr32/_libs
-	-rm -rf src/bfin/.libs src/bfin/_libs
-	-rm -rf src/cris/.libs src/cris/_libs
-	-rm -rf src/frv/.libs src/frv/_libs
-	-rm -rf src/ia64/.libs src/ia64/_libs
-	-rm -rf src/m32r/.libs src/m32r/_libs
-	-rm -rf src/m68k/.libs src/m68k/_libs
-	-rm -rf src/m88k/.libs src/m88k/_libs
-	-rm -rf src/metag/.libs src/metag/_libs
-	-rm -rf src/microblaze/.libs src/microblaze/_libs
-	-rm -rf src/mips/.libs src/mips/_libs
-	-rm -rf src/moxie/.libs src/moxie/_libs
-	-rm -rf src/nios2/.libs src/nios2/_libs
-	-rm -rf src/or1k/.libs src/or1k/_libs
-	-rm -rf src/pa/.libs src/pa/_libs
-	-rm -rf src/powerpc/.libs src/powerpc/_libs
-	-rm -rf src/s390/.libs src/s390/_libs
-	-rm -rf src/sh/.libs src/sh/_libs
-	-rm -rf src/sh64/.libs src/sh64/_libs
-	-rm -rf src/sparc/.libs src/sparc/_libs
-	-rm -rf src/tile/.libs src/tile/_libs
-	-rm -rf src/vax/.libs src/vax/_libs
-	-rm -rf src/x86/.libs src/x86/_libs
-	-rm -rf src/xtensa/.libs src/xtensa/_libs
-
-distclean-libtool:
-	-rm -f libtool config.lt
-
-# GNU Make needs to see an explicit $(MAKE) variable in the command it
-# runs to enable its job server during parallel builds.  Hence the
-# comments below.
-all-multi:
-	$(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do # $(MAKE)
-install-multi:
-	$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do # $(MAKE)
-
-mostlyclean-multi:
-	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=mostlyclean multi-clean # $(MAKE)
-clean-multi:
-	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=clean multi-clean # $(MAKE)
-distclean-multi:
-	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=distclean multi-clean # $(MAKE)
-maintainer-clean-multi:
-	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=maintainer-clean multi-clean # $(MAKE)
-doc/$(am__dirstamp):
-	@$(MKDIR_P) doc
-	@: > doc/$(am__dirstamp)
-
-doc/libffi.dvi: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp)
-	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
-	MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \
-	$(TEXI2DVI) -o $@ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi
-
-doc/libffi.pdf: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp)
-	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
-	MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \
-	$(TEXI2PDF) -o $@ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi
-
-doc/libffi.html: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp)
-	rm -rf $(@:.html=.htp)
-	if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \
-	 -o $(@:.html=.htp) `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi; \
-	then \
-	  rm -rf $@; \
-	  if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
-	    mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
-	else \
-	  if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
-	    rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
-	  exit 1; \
-	fi
-$(srcdir)/doc/version.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/doc/stamp-vti
-$(srcdir)/doc/stamp-vti: doc/libffi.texi $(top_srcdir)/configure
-	test -f doc/$(am__dirstamp) || $(MAKE) $(AM_MAKEFLAGS) doc/$(am__dirstamp)
-	@(dir=.; test -f ./doc/libffi.texi || dir=$(srcdir); \
-	set `$(SHELL) $(srcdir)/mdate-sh $$dir/doc/libffi.texi`; \
-	echo "@set UPDATED $$1 $$2 $$3"; \
-	echo "@set UPDATED-MONTH $$2 $$3"; \
-	echo "@set EDITION $(VERSION)"; \
-	echo "@set VERSION $(VERSION)") > vti.tmp
-	@cmp -s vti.tmp $(srcdir)/doc/version.texi \
-	  || (echo "Updating $(srcdir)/doc/version.texi"; \
-	      cp vti.tmp $(srcdir)/doc/version.texi)
-	-@rm -f vti.tmp
-	@cp $(srcdir)/doc/version.texi $@
-
-mostlyclean-vti:
-	-rm -f vti.tmp
-
-maintainer-clean-vti:
-@MAINTAINER_MODE_TRUE@	-rm -f $(srcdir)/doc/stamp-vti $(srcdir)/doc/version.texi
-.dvi.ps:
-	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
-	$(DVIPS) -o $@ $<
-
-uninstall-dvi-am:
-	@$(NORMAL_UNINSTALL)
-	@list='$(DVIS)'; test -n "$(dvidir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(dvidir)/$$f"; \
-	done
-
-uninstall-html-am:
-	@$(NORMAL_UNINSTALL)
-	@list='$(HTMLS)'; test -n "$(htmldir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \
-	  rm -rf "$(DESTDIR)$(htmldir)/$$f"; \
-	done
-
-uninstall-info-am:
-	@$(PRE_UNINSTALL)
-	@if test -d '$(DESTDIR)$(infodir)' && \
-	    (install-info --version && \
-	     install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
-	  list='$(INFO_DEPS)'; \
-	  for file in $$list; do \
-	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
-	    echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
-	    if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
-	    then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \
-	  done; \
-	else :; fi
-	@$(NORMAL_UNINSTALL)
-	@list='$(INFO_DEPS)'; \
-	for file in $$list; do \
-	  relfile=`echo "$$file" | sed 's|^.*/||'`; \
-	  relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \
-	     echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
-	     rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
-	   else :; fi); \
-	done
-
-uninstall-pdf-am:
-	@$(NORMAL_UNINSTALL)
-	@list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(pdfdir)/$$f"; \
-	done
-
-uninstall-ps-am:
-	@$(NORMAL_UNINSTALL)
-	@list='$(PSS)'; test -n "$(psdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(psdir)/$$f"; \
-	done
-
-dist-info: $(INFO_DEPS)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	list='$(INFO_DEPS)'; \
-	for base in $$list; do \
-	  case $$base in \
-	    $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
-	  esac; \
-	  if test -f $$base; then d=.; else d=$(srcdir); fi; \
-	  base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
-	    if test -f $$file; then \
-	      relfile=`expr "$$file" : "$$d/\(.*\)"`; \
-	      test -f "$(distdir)/$$relfile" || \
-		cp -p $$file "$(distdir)/$$relfile"; \
-	    else :; fi; \
-	  done; \
-	done
-
-mostlyclean-aminfo:
-	-rm -rf libffi.aux libffi.cp libffi.cps libffi.fn libffi.ky libffi.log \
-	  libffi.pg libffi.tmp libffi.toc libffi.tp libffi.vr
-
-clean-aminfo:
-	-test -z "doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html" \
-	|| rm -rf doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html
-
-maintainer-clean-aminfo:
-	@list='$(INFO_DEPS)'; for i in $$list; do \
-	  i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
-	  rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
-	done
-install-pkgconfigDATA: $(pkgconfig_DATA)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
-	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
-	done
-
-uninstall-pkgconfigDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) fficonfig.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS) fficonfig.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) fficonfig.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS) fficonfig.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(INFO_DEPS) $(LTLIBRARIES) all-multi $(DATA) \
-		$(HEADERS) fficonfig.h all-local
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(infodir)" "$(DESTDIR)$(pkgconfigdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-	-rm -f doc/$(am__dirstamp)
-	-rm -f src/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/$(am__dirstamp)
-	-rm -f src/aarch64/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/aarch64/$(am__dirstamp)
-	-rm -f src/alpha/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/alpha/$(am__dirstamp)
-	-rm -f src/arc/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/arc/$(am__dirstamp)
-	-rm -f src/arm/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/arm/$(am__dirstamp)
-	-rm -f src/avr32/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/avr32/$(am__dirstamp)
-	-rm -f src/bfin/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/bfin/$(am__dirstamp)
-	-rm -f src/cris/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/cris/$(am__dirstamp)
-	-rm -f src/frv/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/frv/$(am__dirstamp)
-	-rm -f src/ia64/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/ia64/$(am__dirstamp)
-	-rm -f src/m32r/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/m32r/$(am__dirstamp)
-	-rm -f src/m68k/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/m68k/$(am__dirstamp)
-	-rm -f src/m88k/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/m88k/$(am__dirstamp)
-	-rm -f src/metag/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/metag/$(am__dirstamp)
-	-rm -f src/microblaze/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/microblaze/$(am__dirstamp)
-	-rm -f src/mips/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/mips/$(am__dirstamp)
-	-rm -f src/moxie/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/moxie/$(am__dirstamp)
-	-rm -f src/nios2/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/nios2/$(am__dirstamp)
-	-rm -f src/or1k/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/or1k/$(am__dirstamp)
-	-rm -f src/pa/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/pa/$(am__dirstamp)
-	-rm -f src/powerpc/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/powerpc/$(am__dirstamp)
-	-rm -f src/s390/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/s390/$(am__dirstamp)
-	-rm -f src/sh/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/sh/$(am__dirstamp)
-	-rm -f src/sh64/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/sh64/$(am__dirstamp)
-	-rm -f src/sparc/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/sparc/$(am__dirstamp)
-	-rm -f src/tile/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/tile/$(am__dirstamp)
-	-rm -f src/vax/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/vax/$(am__dirstamp)
-	-rm -f src/x86/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/x86/$(am__dirstamp)
-	-rm -f src/xtensa/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/xtensa/$(am__dirstamp)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-multi clean-recursive
-
-clean-am: clean-aminfo clean-generic clean-libtool \
-	clean-noinstLTLIBRARIES clean-toolexeclibLTLIBRARIES \
-	mostlyclean-am
-
-distclean: distclean-multi distclean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/or1k/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-hdr distclean-libtool distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am: $(DVIS)
-
-html: html-recursive
-
-html-am: $(HTMLS)
-
-info: info-recursive
-
-info-am: $(INFO_DEPS)
-
-install-data-am: install-info-am install-pkgconfigDATA
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am: $(DVIS)
-	@$(NORMAL_INSTALL)
-	test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)"
-	@list='$(DVIS)'; test -n "$(dvidir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \
-	done
-install-exec-am: install-multi install-toolexeclibLTLIBRARIES
-
-install-html: install-html-recursive
-
-install-html-am: $(HTMLS)
-	@$(NORMAL_INSTALL)
-	test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)"
-	@list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  $(am__strip_dir) \
-	  if test -d "$$d$$p"; then \
-	    echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
-	    $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
-	    echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
-	    $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
-	  else \
-	    list2="$$list2 $$d$$p"; \
-	  fi; \
-	done; \
-	test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \
-	done; }
-install-info: install-info-recursive
-
-install-info-am: $(INFO_DEPS)
-	@$(NORMAL_INSTALL)
-	test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)"
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
-	for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	  esac; \
-	  if test -f $$file; then d=.; else d=$(srcdir); fi; \
-	  file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
-	               $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
-	    if test -f $$ifile; then \
-	      echo "$$ifile"; \
-	    else : ; fi; \
-	  done; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done
-	@$(POST_INSTALL)
-	@if (install-info --version && \
-	     install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
-	  list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
-	  for file in $$list; do \
-	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
-	    echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
-	    install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
-	  done; \
-	else : ; fi
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am: $(PDFS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)"
-	@list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done
-install-ps: install-ps-recursive
-
-install-ps-am: $(PSS)
-	@$(NORMAL_INSTALL)
-	test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)"
-	@list='$(PSS)'; test -n "$(psdir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done
-installcheck-am:
-
-maintainer-clean: maintainer-clean-multi maintainer-clean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/or1k/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-aminfo \
-	maintainer-clean-generic maintainer-clean-vti
-
-mostlyclean: mostlyclean-multi mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-aminfo mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool mostlyclean-vti
-
-pdf: pdf-recursive
-
-pdf-am: $(PDFS)
-
-ps: ps-recursive
-
-ps-am: $(PSS)
-
-uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \
-	uninstall-pdf-am uninstall-pkgconfigDATA uninstall-ps-am \
-	uninstall-toolexeclibLTLIBRARIES
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all all-multi \
-	clean-multi ctags-recursive distclean-multi install-am \
-	install-multi install-strip maintainer-clean-multi \
-	mostlyclean-multi tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am all-local all-multi am--refresh check check-am \
-	clean clean-aminfo clean-generic clean-libtool clean-multi \
-	clean-noinstLTLIBRARIES clean-toolexeclibLTLIBRARIES ctags \
-	ctags-recursive dist-info distclean distclean-compile \
-	distclean-generic distclean-hdr distclean-libtool \
-	distclean-multi distclean-tags dvi dvi-am html html-am info \
-	info-am install install-am install-data install-data-am \
-	install-dvi install-dvi-am install-exec install-exec-am \
-	install-html install-html-am install-info install-info-am \
-	install-man install-multi install-pdf install-pdf-am \
-	install-pkgconfigDATA install-ps install-ps-am install-strip \
-	install-toolexeclibLTLIBRARIES installcheck installcheck-am \
-	installdirs installdirs-am maintainer-clean \
-	maintainer-clean-aminfo maintainer-clean-generic \
-	maintainer-clean-multi maintainer-clean-vti mostlyclean \
-	mostlyclean-aminfo mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool mostlyclean-multi mostlyclean-vti pdf \
-	pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
-	uninstall-dvi-am uninstall-html-am uninstall-info-am \
-	uninstall-pdf-am uninstall-pkgconfigDATA uninstall-ps-am \
-	uninstall-toolexeclibLTLIBRARIES
-
-
-all-local: $(STAMP_GENINSRC)
-
-stamp-geninsrc: doc/libffi.info
-	cp -p $(top_builddir)/doc/libffi.info $(srcdir)/doc/libffi.info
-	@touch $@
-
-doc/libffi.info: $(STAMP_BUILD_INFO)
-
-stamp-build-info: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp)
-	$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)/doc -o doc/libffi.info $(srcdir)/doc/libffi.texi
-	@touch $@
-
-# Multilib support.  Automake should provide these on its own.
-all-recursive: all-multi
-install-recursive: install-multi
-mostlyclean-recursive: mostlyclean-multi
-clean-recursive: clean-multi
-distclean-recursive: distclean-multi
-maintainer-clean-recursive: maintainer-clean-multi
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/gofrontend/libffi/README b/third_party/gofrontend/libffi/README
deleted file mode 100644
index c072101..0000000
--- a/third_party/gofrontend/libffi/README
+++ /dev/null
@@ -1,450 +0,0 @@
-Status
-======
-
-libffi-4?? was released on TBD.  Check the libffi web
-page for updates: <URL:http://sourceware.org/libffi/>.
-
-
-What is libffi?
-===============
-
-Compilers for high level languages generate code that follow certain
-conventions. These conventions are necessary, in part, for separate
-compilation to work. One such convention is the "calling
-convention". The "calling convention" is essentially a set of
-assumptions made by the compiler about where function arguments will
-be found on entry to a function. A "calling convention" also specifies
-where the return value for a function is found.
-
-Some programs may not know at the time of compilation what arguments
-are to be passed to a function. For instance, an interpreter may be
-told at run-time about the number and types of arguments used to call
-a given function. Libffi can be used in such programs to provide a
-bridge from the interpreter program to compiled code.
-
-The libffi library provides a portable, high level programming
-interface to various calling conventions. This allows a programmer to
-call any function specified by a call interface description at run
-time.  
-
-FFI stands for Foreign Function Interface.  A foreign function
-interface is the popular name for the interface that allows code
-written in one language to call code written in another language. The
-libffi library really only provides the lowest, machine dependent
-layer of a fully featured foreign function interface. A layer must
-exist above libffi that handles type conversions for values passed
-between the two languages.
-
-
-Supported Platforms
-===================
-
-Libffi has been ported to many different platforms.
-For specific configuration details and testing status, please
-refer to the wiki page here:
-
- http://www.moxielogic.org/wiki/index.php?title=Libffi_3.2
-
-At the time of release, the following basic configurations have been
-tested:
-
-|-----------------+------------------+-------------------------|
-| Architecture    | Operating System | Compiler                |
-|-----------------+------------------+-------------------------|
-| AArch64 (ARM64) | iOS              | Clang                   |
-| AArch64         | Linux            | GCC                     |
-| Alpha           | Linux            | GCC                     |
-| Alpha           | Tru64            | GCC                     |
-| ARC             | Linux            | GCC                     |
-| ARM             | Linux            | GCC                     |
-| ARM             | iOS              | GCC                     |
-| AVR32           | Linux            | GCC                     |
-| Blackfin        | uClinux          | GCC                     |
-| HPPA            | HPUX             | GCC                     |
-| IA-64           | Linux            | GCC                     |
-| M68K            | FreeMiNT         | GCC                     |
-| M68K            | Linux            | GCC                     |
-| M68K            | RTEMS            | GCC                     |
-| M88K            | OpenBSD/mvme88k  | GCC                     |
-| Meta            | Linux            | GCC                     |
-| MicroBlaze      | Linux            | GCC                     |
-| MIPS            | IRIX             | GCC                     |
-| MIPS            | Linux            | GCC                     |
-| MIPS            | RTEMS            | GCC                     |
-| MIPS64          | Linux            | GCC                     |
-| Moxie           | Bare metal       | GCC                     |
-| Nios II         | Linux            | GCC                     |
-| OpenRISC        | Linux            | GCC                     |
-| PowerPC 32-bit  | AIX              | IBM XL C                |
-| PowerPC 64-bit  | AIX              | IBM XL C                |
-| PowerPC         | AMIGA            | GCC                     |
-| PowerPC         | Linux            | GCC                     |
-| PowerPC         | Mac OSX          | GCC                     |
-| PowerPC         | FreeBSD          | GCC                     |
-| PowerPC 64-bit  | FreeBSD          | GCC                     |
-| PowerPC 64-bit  | Linux ELFv1      | GCC                     |
-| PowerPC 64-bit  | Linux ELFv2      | GCC                     |
-| S390            | Linux            | GCC                     |
-| S390X           | Linux            | GCC                     |
-| SPARC           | Linux            | GCC                     |
-| SPARC           | Solaris          | GCC                     |
-| SPARC           | Solaris          | Oracle Solaris Studio C |
-| SPARC64         | Linux            | GCC                     |
-| SPARC64         | FreeBSD          | GCC                     |
-| SPARC64         | Solaris          | Oracle Solaris Studio C |
-| TILE-Gx/TILEPro | Linux            | GCC                     |
-| VAX             | OpenBSD/vax      | GCC                     |
-| X86             | FreeBSD          | GCC                     |
-| X86             | GNU HURD         | GCC                     |
-| X86             | Interix          | GCC                     |
-| X86             | kFreeBSD         | GCC                     |
-| X86             | Linux            | GCC                     |
-| X86             | Mac OSX          | GCC                     |
-| X86             | OpenBSD          | GCC                     |
-| X86             | OS/2             | GCC                     |
-| X86             | Solaris          | GCC                     |
-| X86             | Solaris          | Oracle Solaris Studio C |
-| X86             | Windows/Cygwin   | GCC                     |
-| X86             | Windows/MingW    | GCC                     |
-| X86-64          | FreeBSD          | GCC                     |
-| X86-64          | Linux            | GCC                     |
-| X86-64          | Linux/x32        | GCC                     |
-| X86-64          | OpenBSD          | GCC                     |
-| X86-64          | Solaris          | Oracle Solaris Studio C |
-| X86-64          | Windows/Cygwin   | GCC                     |
-| X86-64          | Windows/MingW    | GCC                     |
-| Xtensa          | Linux            | GCC                     |
-|-----------------+------------------+-------------------------|
-
-Please send additional platform test results to
-libffi-discuss@sourceware.org and feel free to update the wiki page
-above.
-
-Installing libffi
-=================
-
-First you must configure the distribution for your particular
-system. Go to the directory you wish to build libffi in and run the
-"configure" program found in the root directory of the libffi source
-distribution.
-
-If you're building libffi directly from version control, configure won't
-exist yet; run ./autogen.sh first.
-
-You may want to tell configure where to install the libffi library and
-header files. To do that, use the --prefix configure switch.  Libffi
-will install under /usr/local by default. 
-
-If you want to enable extra run-time debugging checks use the the
---enable-debug configure switch. This is useful when your program dies
-mysteriously while using libffi. 
-
-Another useful configure switch is --enable-purify-safety. Using this
-will add some extra code which will suppress certain warnings when you
-are using Purify with libffi. Only use this switch when using 
-Purify, as it will slow down the library.
-
-It's also possible to build libffi on Windows platforms with
-Microsoft's Visual C++ compiler.  In this case, use the msvcc.sh
-wrapper script during configuration like so:
-
-path/to/configure CC=path/to/msvcc.sh CXX=path/to/msvcc.sh LD=link CPP="cl -nologo -EP"
-
-For 64-bit Windows builds, use CC="path/to/msvcc.sh -m64" and
-CXX="path/to/msvcc.sh -m64".  You may also need to specify --build
-appropriately.
-
-It is also possible to build libffi on Windows platforms with the LLVM
-project's clang-cl compiler, like below:
-
-path/to/configure CC="path/to/msvcc.sh -clang-cl" CXX="path/to/msvcc.sh -clang-cl" LD=link CPP="clang-cl -EP"
-
-When building with MSVC under a MingW environment, you may need to
-remove the line in configure that sets 'fix_srcfile_path' to a 'cygpath'
-command.  ('cygpath' is not present in MingW, and is not required when
-using MingW-style paths.)
-
-For iOS builds, the 'libffi.xcodeproj' Xcode project is available.
-
-Configure has many other options. Use "configure --help" to see them all.
-
-Once configure has finished, type "make". Note that you must be using
-GNU make.  You can ftp GNU make from ftp.gnu.org:/pub/gnu/make .
-
-To ensure that libffi is working as advertised, type "make check".
-This will require that you have DejaGNU installed.
-
-To install the library and header files, type "make install".
-
-
-History
-=======
-
-See the git log for details at http://github.com/atgreen/libffi.
-
-4.0 TBD
-        New API in support of GO closures.
-
-3.2.1 Nov-12-14
-        Build fix for non-iOS AArch64 targets.
-
-3.2 Nov-11-14
-        Add C99 Complex Type support (currently only supported on
-          s390).
-	Add support for PASCAL and REGISTER calling conventions on x86
-	  Windows/Linux.
-	Add OpenRISC and Cygwin-64 support.
-        Bug fixes.
-
-3.1 May-19-14
-        Add AArch64 (ARM64) iOS support.
-        Add Nios II support.
-        Add m88k and DEC VAX support.
-	Add support for stdcall, thiscall, and fastcall on non-Windows
-	  32-bit x86 targets such as Linux.
-	Various Android, MIPS N32, x86, FreeBSD and UltraSPARC IIi
-	  fixes.
-	Make the testsuite more robust: eliminate several spurious
-	  failures, and respect the $CC and $CXX environment variables.
-	Archive off the manually maintained ChangeLog in favor of git
-	  log.
-
-3.0.13 Mar-17-13
-	Add Meta support.
-	Add missing Moxie bits.
-	Fix stack alignment bug on 32-bit x86.
-	Build fix for m68000 targets.
-	Build fix for soft-float Power targets.
-	Fix the install dir location for some platforms when building
-	  with GCC (OS X, Solaris).
-	Fix Cygwin regression.
-
-3.0.12 Feb-11-13
-        Add Moxie support.
-	Add AArch64 support.
-	Add Blackfin support.
-	Add TILE-Gx/TILEPro support.
-	Add MicroBlaze support.
-	Add Xtensa support.
-	Add support for PaX enabled kernels with MPROTECT.
-	Add support for native vendor compilers on
-	  Solaris and AIX.
-	Work around LLVM/GCC interoperability issue on x86_64.
-
-3.0.11 Apr-11-12
-        Lots of build fixes.
-	Add support for variadic functions (ffi_prep_cif_var).
-	Add Linux/x32 support.
-	Add thiscall, fastcall and MSVC cdecl support on Windows.
-	Add Amiga and newer MacOS support.
-	Add m68k FreeMiNT support.
-	Integration with iOS' xcode build tools.
-	Fix Octeon and MC68881 support.
-	Fix code pessimizations.
-
-3.0.10 Aug-23-11
-        Add support for Apple's iOS.
-	Add support for ARM VFP ABI.
-        Add RTEMS support for MIPS and M68K.
-	Fix instruction cache clearing problems on
-	  ARM and SPARC.
-	Fix the N64 build on mips-sgi-irix6.5.
-	Enable builds with Microsoft's compiler.
-	Enable x86 builds with Oracle's Solaris compiler.
-	Fix support for calling code compiled with Oracle's Sparc
-	  Solaris compiler.
-	Testsuite fixes for Tru64 Unix.
-	Additional platform support.
-
-3.0.9 Dec-31-09
-        Add AVR32 and win64 ports.  Add ARM softfp support.
-	Many fixes for AIX, Solaris, HP-UX, *BSD.
-	Several PowerPC and x86-64 bug fixes.
-	Build DLL for windows.
-
-3.0.8 Dec-19-08
-        Add *BSD, BeOS, and PA-Linux support.
-
-3.0.7 Nov-11-08
-        Fix for ppc FreeBSD.
-	(thanks to Andreas Tobler)
-
-3.0.6 Jul-17-08
-        Fix for closures on sh.
-	Mark the sh/sh64 stack as non-executable.
-	(both thanks to Kaz Kojima)
-
-3.0.5 Apr-3-08
-        Fix libffi.pc file.
-	Fix #define ARM for IcedTea users.
-	Fix x86 closure bug.
-
-3.0.4 Feb-24-08
-        Fix x86 OpenBSD configury.
-
-3.0.3 Feb-22-08
-        Enable x86 OpenBSD thanks to Thomas Heller, and
-	x86-64 FreeBSD thanks to Björn König and Andreas Tobler.
-	Clean up test instruction in README.
-
-3.0.2 Feb-21-08
-        Improved x86 FreeBSD support.
-	Thanks to Björn König.
-
-3.0.1 Feb-15-08
-        Fix instruction cache flushing bug on MIPS.
-	Thanks to David Daney.
-
-3.0.0 Feb-15-08
-        Many changes, mostly thanks to the GCC project.
-	Cygnus Solutions is now Red Hat.
-
-  [10 years go by...]
-
-1.20 Oct-5-98
-	Raffaele Sena produces ARM port.
-
-1.19 Oct-5-98
-	Fixed x86 long double and long long return support.
-	m68k bug fixes from Andreas Schwab.
-	Patch for DU assembler compatibility for the Alpha from Richard
-	Henderson.
-
-1.18 Apr-17-98
-	Bug fixes and MIPS configuration changes.
-
-1.17 Feb-24-98
-	Bug fixes and m68k port from Andreas Schwab. PowerPC port from
-	Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes.
-
-1.16 Feb-11-98
-	Richard Henderson produces Alpha port.
-
-1.15 Dec-4-97
-	Fixed an n32 ABI bug. New libtool, auto* support.
-
-1.14 May-13-97
-	libtool is now used to generate shared and static libraries.
-	Fixed a minor portability problem reported by Russ McManus
-	<mcmanr@eq.gs.com>.
-
-1.13 Dec-2-96
-	Added --enable-purify-safety to keep Purify from complaining
-	about certain low level code.
-	Sparc fix for calling functions with < 6 args.
-	Linux x86 a.out fix.
-
-1.12 Nov-22-96
-	Added missing ffi_type_void, needed for supporting void return 
-	types. Fixed test case for non MIPS machines. Cygnus Support 
-	is now Cygnus Solutions. 
-
-1.11 Oct-30-96
-	Added notes about GNU make.
-
-1.10 Oct-29-96
-	Added configuration fix for non GNU compilers.
-
-1.09 Oct-29-96
-	Added --enable-debug configure switch. Clean-ups based on LCLint 
-	feedback. ffi_mips.h is always installed. Many configuration 
-	fixes. Fixed ffitest.c for sparc builds.
-
-1.08 Oct-15-96
-	Fixed n32 problem. Many clean-ups.
-
-1.07 Oct-14-96
-	Gordon Irlam rewrites v8.S again. Bug fixes.
-
-1.06 Oct-14-96
-	Gordon Irlam improved the sparc port. 
-
-1.05 Oct-14-96
-	Interface changes based on feedback.
-
-1.04 Oct-11-96
-	Sparc port complete (modulo struct passing bug).
-
-1.03 Oct-10-96
-	Passing struct args, and returning struct values works for
-	all architectures/calling conventions. Expanded tests.
-
-1.02 Oct-9-96
-	Added SGI n32 support. Fixed bugs in both o32 and Linux support.
-	Added "make test".
-
-1.01 Oct-8-96
-	Fixed float passing bug in mips version. Restructured some
-	of the code. Builds cleanly with SGI tools.
-
-1.00 Oct-7-96
-	First release. No public announcement.
-
-
-Authors & Credits
-=================
-
-libffi was originally written by Anthony Green <green@moxielogic.com>.
-
-The developers of the GNU Compiler Collection project have made
-innumerable valuable contributions.  See the ChangeLog file for
-details.
-
-Some of the ideas behind libffi were inspired by Gianni Mariani's free
-gencall library for Silicon Graphics machines.
-
-The closure mechanism was designed and implemented by Kresten Krab
-Thorup.
-
-Major processor architecture ports were contributed by the following
-developers:
-
-aarch64		Marcus Shawcroft, James Greenhalgh
-alpha		Richard Henderson
-arm		Raffaele Sena
-blackfin        Alexandre Keunecke I. de Mendonca
-cris		Simon Posnjak, Hans-Peter Nilsson
-frv		Anthony Green
-ia64		Hans Boehm
-m32r		Kazuhiro Inaoka
-m68k		Andreas Schwab
-m88k		Miod Vallat
-microblaze	Nathan Rossi
-mips		Anthony Green, Casey Marshall
-mips64		David Daney
-moxie		Anthony Green
-nios ii		Sandra Loosemore
-openrisc        Sebastian Macke
-pa		Randolph Chung, Dave Anglin, Andreas Tobler
-powerpc		Geoffrey Keating, Andreas Tobler, 
-			 David Edelsohn, John Hornkvist
-powerpc64	Jakub Jelinek
-s390		Gerhard Tonn, Ulrich Weigand
-sh		Kaz Kojima
-sh64		Kaz Kojima
-sparc		Anthony Green, Gordon Irlam
-tile-gx/tilepro Walter Lee
-vax		Miod Vallat
-x86		Anthony Green, Jon Beniston
-x86-64		Bo Thorsen
-xtensa		Chris Zankel
-
-Jesper Skov and Andrew Haley both did more than their fair share of
-stepping through the code and tracking down bugs.
-
-Thanks also to Tom Tromey for bug fixes, documentation and
-configuration help.
-
-Thanks to Jim Blandy, who provided some useful feedback on the libffi
-interface.
-
-Andreas Tobler has done a tremendous amount of work on the testsuite.
-
-Alex Oliva solved the executable page problem for SElinux.
-
-The list above is almost certainly incomplete and inaccurate.  I'm
-happy to make corrections or additions upon request.
-
-If you have a problem, or have found a bug, please send a note to the
-author at green@moxielogic.com, or the project mailing list at
-libffi-discuss@sourceware.org.
diff --git a/third_party/gofrontend/libffi/acinclude.m4 b/third_party/gofrontend/libffi/acinclude.m4
deleted file mode 100644
index 3e8f8ba..0000000
--- a/third_party/gofrontend/libffi/acinclude.m4
+++ /dev/null
@@ -1,92 +0,0 @@
-# mmap(2) blacklisting.  Some platforms provide the mmap library routine
-# but don't support all of the features we need from it.
-AC_DEFUN([AC_FUNC_MMAP_BLACKLIST],
-[
-AC_CHECK_HEADER([sys/mman.h],
-		[libffi_header_sys_mman_h=yes], [libffi_header_sys_mman_h=no])
-AC_CHECK_FUNC([mmap], [libffi_func_mmap=yes], [libffi_func_mmap=no])
-if test "$libffi_header_sys_mman_h" != yes \
- || test "$libffi_func_mmap" != yes; then
-   ac_cv_func_mmap_file=no
-   ac_cv_func_mmap_dev_zero=no
-   ac_cv_func_mmap_anon=no
-else
-   AC_CACHE_CHECK([whether read-only mmap of a plain file works],
-  ac_cv_func_mmap_file,
-  [# Add a system to this blacklist if
-   # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a
-   # memory area containing the same data that you'd get if you applied
-   # read() to the same fd.  The only system known to have a problem here
-   # is VMS, where text files have record structure.
-   case "$host_os" in
-     vms* | ultrix*)
-	ac_cv_func_mmap_file=no ;;
-     *)
-	ac_cv_func_mmap_file=yes;;
-   esac])
-   AC_CACHE_CHECK([whether mmap from /dev/zero works],
-  ac_cv_func_mmap_dev_zero,
-  [# Add a system to this blacklist if it has mmap() but /dev/zero
-   # does not exist, or if mmapping /dev/zero does not give anonymous
-   # zeroed pages with both the following properties:
-   # 1. If you map N consecutive pages in with one call, and then
-   #    unmap any subset of those pages, the pages that were not
-   #    explicitly unmapped remain accessible.
-   # 2. If you map two adjacent blocks of memory and then unmap them
-   #    both at once, they must both go away.
-   # Systems known to be in this category are Windows (all variants),
-   # VMS, and Darwin.
-   case "$host_os" in
-     vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00)
-	ac_cv_func_mmap_dev_zero=no ;;
-     *)
-	ac_cv_func_mmap_dev_zero=yes;;
-   esac])
-
-   # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for.
-   AC_CACHE_CHECK([for MAP_ANON(YMOUS)], ac_cv_decl_map_anon,
-    [AC_TRY_COMPILE(
-[#include <sys/types.h>
-#include <sys/mman.h>
-#include <unistd.h>
-
-#ifndef MAP_ANONYMOUS
-#define MAP_ANONYMOUS MAP_ANON
-#endif
-],
-[int n = MAP_ANONYMOUS;],
-    ac_cv_decl_map_anon=yes,
-    ac_cv_decl_map_anon=no)])
-
-   if test $ac_cv_decl_map_anon = no; then
-     ac_cv_func_mmap_anon=no
-   else
-     AC_CACHE_CHECK([whether mmap with MAP_ANON(YMOUS) works],
-     ac_cv_func_mmap_anon,
-  [# Add a system to this blacklist if it has mmap() and MAP_ANON or
-   # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
-   # doesn't give anonymous zeroed pages with the same properties listed
-   # above for use of /dev/zero.
-   # Systems known to be in this category are Windows, VMS, and SCO Unix.
-   case "$host_os" in
-     vms* | cygwin* | pe | mingw* | sco* | udk* )
-	ac_cv_func_mmap_anon=no ;;
-     *)
-	ac_cv_func_mmap_anon=yes;;
-   esac])
-   fi
-fi
-
-if test $ac_cv_func_mmap_file = yes; then
-  AC_DEFINE(HAVE_MMAP_FILE, 1,
-	    [Define if read-only mmap of a plain file works.])
-fi
-if test $ac_cv_func_mmap_dev_zero = yes; then
-  AC_DEFINE(HAVE_MMAP_DEV_ZERO, 1,
-	    [Define if mmap of /dev/zero works.])
-fi
-if test $ac_cv_func_mmap_anon = yes; then
-  AC_DEFINE(HAVE_MMAP_ANON, 1,
-	    [Define if mmap with MAP_ANON(YMOUS) works.])
-fi
-])
diff --git a/third_party/gofrontend/libffi/aclocal.m4 b/third_party/gofrontend/libffi/aclocal.m4
deleted file mode 100644
index 93d09b3..0000000
--- a/third_party/gofrontend/libffi/aclocal.m4
+++ /dev/null
@@ -1,1039 +0,0 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.64],,
-[m4_warning([this file was generated for autoconf 2.64.
-You have another version of autoconf.  It may work, but is not guaranteed to.
-If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.1], [],
-      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too.  Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.1])dnl
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-
-# Figure out how to run the assembler.                      -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_PROG_AS
-# ----------
-AC_DEFUN([AM_PROG_AS],
-[# By default we simply use the C compiler to build assembly code.
-AC_REQUIRE([AC_PROG_CC])
-test "${CCAS+set}" = set || CCAS=$CC
-test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
-AC_ARG_VAR([CCAS],      [assembler compiler command (defaults to CC)])
-AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)])
-_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
-])
-
-# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory.  The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run.  This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-#    fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-#    fails if $ac_aux_dir is absolute,
-#    fails when called from a subdirectory in a VPATH build with
-#          a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
-#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-#   MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH.  The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL                                            -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-m4_define([_AM_COND_VALUE_$1], [$2])dnl
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
-else
-  $1_TRUE='#'
-  $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 10
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery.  Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
-               [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_$1_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
-  fi
-  am__universal=false
-  m4_case([$1], [CC],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac],
-    [CXX],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac])
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_$1_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-])
-
-# Generate code to set up dependency tracking.              -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 5
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[{
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`AS_DIRNAME("$mf")`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`AS_DIRNAME(["$file"])`
-      AS_MKDIR_P([$dirpart/$fdir])
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
-     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Do all the work for Automake.                             -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 16
-
-# This macro actually does too much.  Some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
-dnl Autoconf wants to disallow AM_ names.  We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
-  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-			     [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-		  [_AM_DEPENDENCIES(CC)],
-		  [define([AC_PROG_CC],
-			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-		  [_AM_DEPENDENCIES(CXX)],
-		  [define([AC_PROG_CXX],
-			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-		  [_AM_DEPENDENCIES(OBJC)],
-		  [define([AC_PROG_OBJC],
-			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
-AC_CONFIG_COMMANDS_PRE(dnl
-[m4_provide_if([_AM_COMPILER_EXEEXT],
-  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
-
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
-dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
-dnl mangled by Autoconf and run in a shell conditional statement.
-m4_define([_AC_COMPILER_EXEEXT],
-m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_arg=$1
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-AC_SUBST(install_sh)])
-
-# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
-# From Jim Meyering
-
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_MAINTAINER_MODE([DEFAULT-MODE])
-# ----------------------------------
-# Control maintainer-specific portions of Makefiles.
-# Default is to disable them, unless `enable' is passed literally.
-# For symmetry, `disable' may be passed as well.  Anyway, the user
-# can override the default with the --enable/--disable switch.
-AC_DEFUN([AM_MAINTAINER_MODE],
-[m4_case(m4_default([$1], [disable]),
-       [enable], [m4_define([am_maintainer_other], [disable])],
-       [disable], [m4_define([am_maintainer_other], [enable])],
-       [m4_define([am_maintainer_other], [enable])
-        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
-AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles])
-  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
-  AC_ARG_ENABLE([maintainer-mode],
-[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
-			  (and sometimes confusing) to the casual installer],
-      [USE_MAINTAINER_MODE=$enableval],
-      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
-  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
-  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
-  MAINT=$MAINTAINER_MODE_TRUE
-  AC_SUBST([MAINT])dnl
-]
-)
-
-AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
-
-# Check to see how 'make' treats includes.	            -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# AM_MAKE_INCLUDE()
-# -----------------
-# Check to see how make treats includes.
-AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
-
-# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_PROG_CC_C_O
-# --------------
-# Like AC_PROG_CC_C_O, but changed for automake.
-AC_DEFUN([AM_PROG_CC_C_O],
-[AC_REQUIRE([AC_PROG_CC_C_O])dnl
-AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([compile])dnl
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
-eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
-if test "$am_t" != yes; then
-   # Losing compiler, so override with the script.
-   # FIXME: It is wrong to rewrite CC.
-   # But if we don't then we get into trouble of one sort or another.
-   # A longer-term fix would be to have automake use am__CC in this case,
-   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
-   CC="$am_aux_dir/compile $CC"
-fi
-dnl Make sure AC_PROG_CC is never called again, or it will override our
-dnl setting of CC.
-m4_define([AC_PROG_CC],
-          [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
-])
-
-# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling.                     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# ------------------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[[\\\"\#\$\&\'\`$am_lf]]*)
-    AC_MSG_ERROR([unsafe absolute working directory name]);;
-esac
-case $srcdir in
-  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
-    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Public sister of _AM_SUBST_NOTMAKE.
-AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
-
-# Check how to create a tarball.                            -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-#     tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-#     $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
-m4_if([$1], [v7],
-     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
-m4_include([../config/acx.m4])
-m4_include([../config/asmcfi.m4])
-m4_include([../config/depstand.m4])
-m4_include([../config/lead-dot.m4])
-m4_include([../config/multi.m4])
-m4_include([../config/override.m4])
-m4_include([../libtool.m4])
-m4_include([../ltoptions.m4])
-m4_include([../ltsugar.m4])
-m4_include([../ltversion.m4])
-m4_include([../lt~obsolete.m4])
-m4_include([acinclude.m4])
diff --git a/third_party/gofrontend/libffi/configure b/third_party/gofrontend/libffi/configure
deleted file mode 100755
index f580af0..0000000
--- a/third_party/gofrontend/libffi/configure
+++ /dev/null
@@ -1,18792 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.64 for libffi 3.99999.
-#
-# Report bugs to <http://github.com/atgreen/libffi/issues>.
-#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software
-# Foundation, Inc.
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test "x$CONFIG_SHELL" = x; then
-  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-"
-  as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
-  exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1"
-  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
-  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
-  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
-  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-
-  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
-    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    PATH=/empty FPATH=/empty; export PATH FPATH
-    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
-      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1"
-  if (eval "$as_required") 2>/dev/null; then :
-  as_have_required=yes
-else
-  as_have_required=no
-fi
-  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  as_found=:
-  case $as_dir in #(
-	 /*)
-	   for as_base in sh bash ksh sh5; do
-	     # Try only shells that exist, to save several forks.
-	     as_shell=$as_dir/$as_base
-	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  CONFIG_SHELL=$as_shell as_have_required=yes
-		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  break 2
-fi
-fi
-	   done;;
-       esac
-  as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
-	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
-  CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
-      if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-	# neutralization value for shells without unset; and this also
-	# works around shells that cannot unset nonexistent variables.
-	BASH_ENV=/dev/null
-	ENV=/dev/null
-	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-	export CONFIG_SHELL
-	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
-fi
-
-    if test x$as_have_required = xno; then :
-  $as_echo "$0: This script requires a shell more modern than all"
-  $as_echo "$0: the shells that I found on your system."
-  if test x${ZSH_VERSION+set} = xset ; then
-    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
-    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
-  else
-    $as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: http://github.com/atgreen/libffi/issues about your
-$0: system, including any error possibly output before this
-$0: message. Then install a modern shell, or manually run
-$0: the script under such a shell if you do have one."
-  fi
-  exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$?; test $as_status -eq 0 && as_status=1
-  if test "$3"; then
-    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
-  fi
-  $as_echo "$as_me: error: $1" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
-  as_lineno_1=$LINENO as_lineno_1a=$LINENO
-  as_lineno_2=$LINENO as_lineno_2a=$LINENO
-  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
-  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
-  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-
-exec 7<&0 </dev/null 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='libffi'
-PACKAGE_TARNAME='libffi'
-PACKAGE_VERSION='3.99999'
-PACKAGE_STRING='libffi 3.99999'
-PACKAGE_BUGREPORT='http://github.com/atgreen/libffi/issues'
-PACKAGE_URL=''
-
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='am__EXEEXT_FALSE
-am__EXEEXT_TRUE
-LTLIBOBJS
-LIBOBJS
-toolexeclibdir
-toolexecdir
-FFI_DEBUG_FALSE
-FFI_DEBUG_TRUE
-TARGET_OBJ
-TARGETDIR
-TARGET
-FFI_EXEC_TRAMPOLINE_TABLE
-FFI_EXEC_TRAMPOLINE_TABLE_FALSE
-FFI_EXEC_TRAMPOLINE_TABLE_TRUE
-HAVE_LONG_DOUBLE_VARIANT
-HAVE_LONG_DOUBLE
-ALLOCA
-AM_LTLDFLAGS
-AM_RUNTESTFLAGS
-TESTSUBDIR_FALSE
-TESTSUBDIR_TRUE
-MAINT
-MAINTAINER_MODE_FALSE
-MAINTAINER_MODE_TRUE
-CXXCPP
-CPP
-OTOOL64
-OTOOL
-LIPO
-NMEDIT
-DSYMUTIL
-RANLIB
-AR
-OBJDUMP
-LN_S
-NM
-ac_ct_DUMPBIN
-DUMPBIN
-LD
-FGREP
-EGREP
-GREP
-SED
-LIBTOOL
-am__fastdepCCAS_FALSE
-am__fastdepCCAS_TRUE
-CCASDEPMODE
-CCASFLAGS
-CCAS
-am__fastdepCXX_FALSE
-am__fastdepCXX_TRUE
-CXXDEPMODE
-ac_ct_CXX
-CXXFLAGS
-CXX
-am__fastdepCC_FALSE
-am__fastdepCC_TRUE
-CCDEPMODE
-AMDEPBACKSLASH
-AMDEP_FALSE
-AMDEP_TRUE
-am__quote
-am__include
-DEPDIR
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-GENINSRC_FALSE
-GENINSRC_TRUE
-BUILD_INFO_FALSE
-BUILD_INFO_TRUE
-am__untar
-am__tar
-AMTAR
-am__leading_dot
-SET_MAKE
-AWK
-mkdir_p
-MKDIR_P
-INSTALL_STRIP_PROGRAM
-STRIP
-install_sh
-MAKEINFO
-AUTOHEADER
-AUTOMAKE
-AUTOCONF
-ACLOCAL
-VERSION
-PACKAGE
-CYGPATH_W
-am__isrc
-INSTALL_DATA
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-target_os
-target_vendor
-target_cpu
-target
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-multi_basedir
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-enable_multilib
-enable_generated_files_in_srcdir
-enable_dependency_tracking
-enable_shared
-enable_static
-with_pic
-enable_fast_install
-with_gnu_ld
-enable_libtool_lock
-enable_maintainer_mode
-enable_pax_emutramp
-enable_debug
-enable_structs
-enable_raw_api
-enable_purify_safety
-'
-      ac_precious_vars='build_alias
-host_alias
-target_alias
-CCAS
-CCASFLAGS
-CPP
-CPPFLAGS
-CXXCPP'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval $ac_prev=\$ac_option
-    ac_prev=
-    continue
-  fi
-
-  case $ac_option in
-  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *)	ac_optarg=yes ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_dashdash$ac_option in
-  --)
-    ac_dashdash=yes ;;
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=*)
-    datadir=$ac_optarg ;;
-
-  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
-  | --dataroo | --dataro | --datar)
-    ac_prev=datarootdir ;;
-  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
-  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
-    datarootdir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=no ;;
-
-  -docdir | --docdir | --docdi | --doc | --do)
-    ac_prev=docdir ;;
-  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
-    docdir=$ac_optarg ;;
-
-  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
-    ac_prev=dvidir ;;
-  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
-    dvidir=$ac_optarg ;;
-
-  -enable-* | --enable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=\$ac_optarg ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
-    ac_prev=htmldir ;;
-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
-  | --ht=*)
-    htmldir=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localedir | --localedir | --localedi | --localed | --locale)
-    ac_prev=localedir ;;
-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
-    localedir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst | --locals)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
-    ac_prev=pdfdir ;;
-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
-    pdfdir=$ac_optarg ;;
-
-  -psdir | --psdir | --psdi | --psd | --ps)
-    ac_prev=psdir ;;
-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
-    psdir=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=\$ac_optarg ;;
-
-  -without-* | --without-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=no ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) as_fn_error "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information."
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    case $ac_envvar in #(
-      '' | [0-9]* | *[!_$as_cr_alnum]* )
-      as_fn_error "invalid variable name: \`$ac_envvar'" ;;
-    esac
-    eval $ac_envvar=\$ac_optarg
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  as_fn_error "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
-  case $enable_option_checking in
-    no) ;;
-    fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
-  esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
-		datadir sysconfdir sharedstatedir localstatedir includedir \
-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
-do
-  eval ac_val=\$$ac_var
-  # Remove trailing slashes.
-  case $ac_val in
-    */ )
-      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
-      eval $ac_var=\$ac_val;;
-  esac
-  # Be sure to have absolute directory names.
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* )  continue;;
-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
-  esac
-  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used." >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  as_fn_error "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  as_fn_error "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_myself" : 'X\(//\)[^/]' \| \
-	 X"$as_myself" : 'X\(//\)$' \| \
-	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r "$srcdir/$ac_unique_file"; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
-  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
-	pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
-  srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
-  eval ac_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_env_${ac_var}_value=\$${ac_var}
-  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
-  # Omit some internal or obsolete options to make the list less imposing.
-  # This message is too long to be a string in the A/UX 3.1 sh.
-  cat <<_ACEOF
-\`configure' configures libffi 3.99999 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR            user executables [EPREFIX/bin]
-  --sbindir=DIR           system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR        program executables [EPREFIX/libexec]
-  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
-  --libdir=DIR            object code libraries [EPREFIX/lib]
-  --includedir=DIR        C header files [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
-  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR           info documentation [DATAROOTDIR/info]
-  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR            man documentation [DATAROOTDIR/man]
-  --docdir=DIR            documentation root [DATAROOTDIR/doc/libffi]
-  --htmldir=DIR           html documentation [DOCDIR]
-  --dvidir=DIR            dvi documentation [DOCDIR]
-  --pdfdir=DIR            pdf documentation [DOCDIR]
-  --psdir=DIR             ps documentation [DOCDIR]
-_ACEOF
-
-  cat <<\_ACEOF
-
-Program names:
-  --program-prefix=PREFIX            prepend PREFIX to installed program names
-  --program-suffix=SUFFIX            append SUFFIX to installed program names
-  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
-  --target=TARGET   configure for building compilers for TARGET [HOST]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of libffi 3.99999:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-option-checking  ignore unrecognized --enable/--with options
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-multilib       build many library versions (default)
-  --enable-generated-files-in-srcdir
-                          put copies of generated files in source dir intended
-                          for creating source tarballs for users without
-                          texinfo bison or flex
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
-  --enable-shared[=PKGS]  build shared libraries [default=yes]
-  --enable-static[=PKGS]  build static libraries [default=yes]
-  --enable-fast-install[=PKGS]
-                          optimize for fast installation [default=yes]
-  --disable-libtool-lock  avoid locking (might break parallel builds)
-  --enable-maintainer-mode  enable make rules and dependencies not useful
-			  (and sometimes confusing) to the casual installer
-  --enable-pax_emutramp       enable pax emulated trampolines, for we can't use PROT_EXEC
-  --enable-debug          debugging mode
-  --disable-structs       omit code for struct support
-  --disable-raw-api       make the raw api unavailable
-  --enable-purify-safety  purify-safe mode
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-pic              try to use only PIC/non-PIC objects [default=use
-                          both]
-  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-
-Some influential environment variables:
-  CC          C compiler command
-  CFLAGS      C compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  LIBS        libraries to pass to the linker, e.g. -l<library>
-  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
-              you have headers in a nonstandard directory <include dir>
-  CXX         C++ compiler command
-  CXXFLAGS    C++ compiler flags
-  CCAS        assembler compiler command (defaults to CC)
-  CCASFLAGS   assembler compiler flags (defaults to CFLAGS)
-  CPP         C preprocessor
-  CXXCPP      C++ preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <http://github.com/atgreen/libffi/issues>.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" ||
-      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
-      continue
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-    cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
-    elif test -f "$ac_srcdir/configure"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure" --help=recursive
-    else
-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi || ac_status=$?
-    cd "$ac_pwd" || { ac_status=$?; break; }
-  done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
-  cat <<\_ACEOF
-libffi configure 3.99999
-generated by GNU Autoconf 2.64
-
-Copyright (C) 2009 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit
-fi
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_cxx_try_compile LINENO
-# ----------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_cxx_try_compile
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $2 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_func
-
-# ac_fn_cxx_try_cpp LINENO
-# ------------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } >/dev/null && {
-	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_cxx_try_cpp
-
-# ac_fn_cxx_try_link LINENO
-# -------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_cxx_try_link
-
-# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
-# --------------------------------------------
-# Tries to find the compile-time value of EXPR in a program that includes
-# INCLUDES, setting VAR accordingly. Returns whether the value could be
-# computed
-ac_fn_c_compute_int ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if test "$cross_compiling" = yes; then
-    # Depending upon the size, compute the lo and hi bounds.
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= 0)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_lo=0 ac_mid=0
-  while :; do
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=$ac_mid; break
-else
-  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
-			if test $ac_lo -le $ac_mid; then
-			  ac_lo= ac_hi=
-			  break
-			fi
-			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) < 0)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=-1 ac_mid=-1
-  while :; do
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_lo=$ac_mid; break
-else
-  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
-			if test $ac_mid -le $ac_hi; then
-			  ac_lo= ac_hi=
-			  break
-			fi
-			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  ac_lo= ac_hi=
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-# Binary search between lo and hi bounds.
-while test "x$ac_lo" != "x$ac_hi"; do
-  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=$ac_mid
-else
-  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-case $ac_lo in #((
-?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
-'') ac_retval=1 ;;
-esac
-  else
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-static long int longval () { return $2; }
-static unsigned long int ulongval () { return $2; }
-#include <stdio.h>
-#include <stdlib.h>
-int
-main ()
-{
-
-  FILE *f = fopen ("conftest.val", "w");
-  if (! f)
-    return 1;
-  if (($2) < 0)
-    {
-      long int i = longval ();
-      if (i != ($2))
-	return 1;
-      fprintf (f, "%ld", i);
-    }
-  else
-    {
-      unsigned long int i = ulongval ();
-      if (i != ($2))
-	return 1;
-      fprintf (f, "%lu", i);
-    }
-  /* Do not output a trailing newline, as this causes \r\n confusion
-     on some platforms.  */
-  return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else
-  ac_retval=1
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-rm -f conftest.val
-
-  fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_compute_int
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_header_compiler=yes
-else
-  ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  ac_header_preproc=yes
-else
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
-  yes:no: )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( cat <<\_ASBOX
-## ------------------------------------------------------ ##
-## Report this to http://github.com/atgreen/libffi/issues ##
-## ------------------------------------------------------ ##
-_ASBOX
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_mongrel
-cat >config.log <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by libffi $as_me 3.99999, which was
-generated by GNU Autoconf 2.64.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    $as_echo "PATH: $as_dir"
-  done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *\'*)
-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
-    2)
-      as_fn_append ac_configure_args1 " '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      as_fn_append ac_configure_args " '$ac_arg'"
-      ;;
-    esac
-  done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    cat <<\_ASBOX
-## ---------------- ##
-## Cache variables. ##
-## ---------------- ##
-_ASBOX
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-(
-  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-  (set) 2>&1 |
-    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      sed -n \
-	"s/'\''/'\''\\\\'\'''\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
-      ;; #(
-    *)
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-)
-    echo
-
-    cat <<\_ASBOX
-## ----------------- ##
-## Output variables. ##
-## ----------------- ##
-_ASBOX
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=\$$ac_var
-      case $ac_val in
-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-      esac
-      $as_echo "$ac_var='\''$ac_val'\''"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      cat <<\_ASBOX
-## ------------------- ##
-## File substitutions. ##
-## ------------------- ##
-_ASBOX
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=\$$ac_var
-	case $ac_val in
-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-	esac
-	$as_echo "$ac_var='\''$ac_val'\''"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      cat <<\_ASBOX
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-_ASBOX
-      echo
-      cat confdefs.h
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      $as_echo "$as_me: caught signal $ac_signal"
-    $as_echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core core.conftest.* &&
-    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
-  ac_site_file1=$CONFIG_SITE
-elif test "x$prefix" != xNONE; then
-  ac_site_file1=$prefix/share/config.site
-  ac_site_file2=$prefix/etc/config.site
-else
-  ac_site_file1=$ac_default_prefix/share/config.site
-  ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
-  test "x$ac_site_file" = xNONE && continue
-  if test -r "$ac_site_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special
-  # files actually), so we avoid doing that.
-  if test -f "$cache_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . "$cache_file";;
-      *)                      . "./$cache_file";;
-    esac
-  fi
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val=\$ac_cv_env_${ac_var}_value
-  eval ac_new_val=\$ac_env_${ac_var}_value
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	# differences in whitespace do not lead to failure.
-	ac_old_val_w=`echo x $ac_old_val`
-	ac_new_val_w=`echo x $ac_new_val`
-	if test "$ac_old_val_w" != "$ac_new_val_w"; then
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	  ac_cache_corrupted=:
-	else
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
-	  eval $ac_var=\$ac_old_val
-	fi
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-
-ac_config_headers="$ac_config_headers fficonfig.h"
-
-
-# Default to --enable-multilib
-# Check whether --enable-multilib was given.
-if test "${enable_multilib+set}" = set; then :
-  enableval=$enable_multilib; case "$enableval" in
-  yes) multilib=yes ;;
-  no)  multilib=no ;;
-  *)   as_fn_error "bad value $enableval for multilib option" "$LINENO" 5 ;;
- esac
-else
-  multilib=yes
-fi
-
-
-# We may get other options which we leave undocumented:
-# --with-target-subdir, --with-multisrctop, --with-multisubdir
-# See config-ml.in if you want the gory details.
-
-if test "$srcdir" = "."; then
-  if test "$with_target_subdir" != "."; then
-    multi_basedir="$srcdir/$with_multisrctop../.."
-  else
-    multi_basedir="$srcdir/$with_multisrctop.."
-  fi
-else
-  multi_basedir="$srcdir/.."
-fi
-
-
-# Even if the default multilib is not a cross compilation,
-# it may be that some of the other multilibs are.
-if test $cross_compiling = no && test $multilib = yes \
-   && test "x${with_multisubdir}" != x ; then
-   cross_compiling=maybe
-fi
-
-ac_config_commands="$ac_config_commands default-1"
-
-
-ac_aux_dir=
-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
-  for ac_t in install-sh install.sh shtool; do
-    if test -f "$ac_dir/$ac_t"; then
-      ac_aux_dir=$ac_dir
-      ac_install_sh="$ac_aux_dir/$ac_t -c"
-      break 2
-    fi
-  done
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
-$as_echo_n "checking target system type... " >&6; }
-if test "${ac_cv_target+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$target_alias" = x; then
-  ac_cv_target=$ac_cv_host
-else
-  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
-    as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
-$as_echo "$ac_cv_target" >&6; }
-case $ac_cv_target in
-*-*-*) ;;
-*) as_fn_error "invalid value of canonical target" "$LINENO" 5;;
-esac
-target=$ac_cv_target
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_target
-shift
-target_cpu=$1
-target_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-target_os=$*
-IFS=$ac_save_IFS
-case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
-
-
-# The aliases save the names the user supplied, while $host etc.
-# will get canonicalized.
-test -n "$target_alias" &&
-  test "$program_prefix$program_suffix$program_transform_name" = \
-    NONENONEs,x,x, &&
-  program_prefix=${target_alias}-
-
-target_alias=${target_alias-$host_alias}
-
-am__api_version='1.11'
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
-  ./ | .// | /[cC]/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    rm -rf conftest.one conftest.two conftest.dir
-	    echo one > conftest.one
-	    echo two > conftest.two
-	    mkdir conftest.dir
-	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
-	      test -s conftest.one && test -s conftest.two &&
-	      test -s conftest.dir/conftest.one &&
-	      test -s conftest.dir/conftest.two
-	    then
-	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	      break 3
-	    fi
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-
-  done
-IFS=$as_save_IFS
-
-rm -rf conftest.one conftest.two conftest.dir
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    INSTALL=$ac_install_sh
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[\\\"\#\$\&\'\`$am_lf]*)
-    as_fn_error "unsafe absolute working directory name" "$LINENO" 5;;
-esac
-case $srcdir in
-  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
-    as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      as_fn_error "ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" "$LINENO" 5
-   fi
-
-   test "$2" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   as_fn_error "newly created file is older than distributed files!
-Check your system clock" "$LINENO" 5
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-test "$program_prefix" != NONE &&
-  program_transform_name="s&^&$program_prefix&;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.
-# By default was `s,x,x', remove it if useless.
-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
-if test -z "$MKDIR_P"; then
-  if test "${ac_cv_path_mkdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in mkdir gmkdir; do
-	 for ac_exec_ext in '' $ac_executable_extensions; do
-	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
-	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
-	     'mkdir (GNU coreutils) '* | \
-	     'mkdir (coreutils) '* | \
-	     'mkdir (fileutils) '4.1*)
-	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
-	       break 3;;
-	   esac
-	 done
-       done
-  done
-IFS=$as_save_IFS
-
-fi
-
-  if test "${ac_cv_path_mkdir+set}" = set; then
-    MKDIR_P="$ac_cv_path_mkdir -p"
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for MKDIR_P within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    test -d ./--version && rmdir ./--version
-    MKDIR_P="$ac_install_sh -d"
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
-
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
-for ac_prog in gawk mawk nawk awk
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AWK+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$AWK" && break
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  am__isrc=' -I$(srcdir)'
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='libffi'
- VERSION='3.99999'
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.
-
-AMTAR=${AMTAR-"${am_missing_run}tar"}
-
-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
-
-
-
-
-
-
-# See if makeinfo has been installed and is modern enough
-# that we can use it.
-
-  # Extract the first word of "makeinfo", so it can be a program name with args.
-set dummy makeinfo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_MAKEINFO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$MAKEINFO"; then
-  ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_MAKEINFO="makeinfo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-MAKEINFO=$ac_cv_prog_MAKEINFO
-if test -n "$MAKEINFO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5
-$as_echo "$MAKEINFO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  if test -n "$MAKEINFO"; then
-    # Found it, now check the version.
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modern makeinfo" >&5
-$as_echo_n "checking for modern makeinfo... " >&6; }
-if test "${gcc_cv_prog_makeinfo_modern+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_prog_version=`eval $MAKEINFO --version 2>&1 |
-                                     sed -n 's/^.*GNU texinfo.* \([0-9][0-9.]*\).*$/\1/p'`
-
-                    case $ac_prog_version in
-                      '')  gcc_cv_prog_makeinfo_modern=no;;
-                      4.[4-9]*|4.[1-9][0-9]*|[5-9]*|[1-9][0-9]*)  gcc_cv_prog_makeinfo_modern=yes;;
-                      *)   gcc_cv_prog_makeinfo_modern=no;;
-                    esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_prog_makeinfo_modern" >&5
-$as_echo "$gcc_cv_prog_makeinfo_modern" >&6; }
-  else
-    gcc_cv_prog_makeinfo_modern=no
-  fi
-  if test $gcc_cv_prog_makeinfo_modern = no; then
-    MAKEINFO="${CONFIG_SHELL-/bin/sh} $ac_aux_dir/missing makeinfo"
-  fi
-
- if test $gcc_cv_prog_makeinfo_modern = "yes"; then
-  BUILD_INFO_TRUE=
-  BUILD_INFO_FALSE='#'
-else
-  BUILD_INFO_TRUE='#'
-  BUILD_INFO_FALSE=
-fi
-
-
-# We would like our source tree to be readonly. However when releases or
-# pre-releases are generated, the flex/bison generated files as well as the
-# various formats of manuals need to be included along with the rest of the
-# sources.  Therefore we have --enable-generated-files-in-srcdir to do
-# just that.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking generated-files-in-srcdir" >&5
-$as_echo_n "checking generated-files-in-srcdir... " >&6; }
-# Check whether --enable-generated-files-in-srcdir was given.
-if test "${enable_generated_files_in_srcdir+set}" = set; then :
-  enableval=$enable_generated_files_in_srcdir; case "$enableval" in
- yes) enable_generated_files_in_srcdir=yes ;;
- no)  enable_generated_files_in_srcdir=no ;;
- *)   as_fn_error "Unknown argument to enable/disable version-specific libs" "$LINENO" 5;;
- esac
-else
-  enable_generated_files_in_srcdir=no
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_generated_files_in_srcdir" >&5
-$as_echo "$enable_generated_files_in_srcdir" >&6; }
- if test "$enable_generated_files_in_srcdir" = yes; then
-  GENINSRC_TRUE=
-  GENINSRC_FALSE='#'
-else
-  GENINSRC_TRUE='#'
-  GENINSRC_FALSE=
-fi
-
-
-# The same as in boehm-gc and libstdc++. Have to borrow it from there.
-# We must force CC to /not/ be precious variables; otherwise
-# the wrong, non-multilib-adjusted value will be used in multilibs.
-# As a side effect, we have to subst CFLAGS ourselves.
-# Also save and restore CFLAGS, since AC_PROG_CC will come up with
-# defaults of its own if none are provided.
-
-
-
-save_CFLAGS=$CFLAGS
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "no acceptable C compiler found in \$PATH
-See \`config.log' for more details." "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    rm -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
-  esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link_default") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile.  We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
-	then :; else
-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	fi
-	# We set ac_cv_exeext here because the later test for it is not
-	# safe: cross compilers may not add the suffix if given an `-o'
-	# argument, so we may need to know it at that point already.
-	# Even if this section looks crufty: it has the advantage of
-	# actually working.
-	break;;
-    * )
-	break;;
-  esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
-  ac_file=''
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-if test -z "$ac_file"; then :
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "C compiler cannot create executables
-See \`config.log' for more details." "$LINENO" 5; }; }
-fi
-ac_exeext=$ac_cv_exeext
-
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-# If not cross compiling, check that we can run a simple program.
-if test "$cross_compiling" != yes; then
-  if { ac_try='./$ac_file'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." "$LINENO" 5; }
-    fi
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out
-ac_clean_files=$ac_clean_files_save
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-rm -f conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  for ac_file in conftest.o conftest.obj conftest.*; do
-  test -f "$ac_file" || continue;
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-else
-  CFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
-  enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
- if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
-else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
-fi
-
-
-
-depcc="$CC"   am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-fi
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -z "$CXX"; then
-  if test -n "$CCC"; then
-    CXX=$CCC
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CXX"; then
-  ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CXX" && break
-  done
-fi
-if test -z "$CXX"; then
-  ac_ct_CXX=$CXX
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CXX"; then
-  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CXX="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CXX" && break
-done
-
-  if test "x$ac_ct_CXX" = x; then
-    CXX="g++"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CXX=$ac_ct_CXX
-  fi
-fi
-
-  fi
-fi
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    rm -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if test "${ac_cv_cxx_compiler_gnu+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GXX=yes
-else
-  GXX=
-fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
-ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if test "${ac_cv_prog_cxx_g+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
-   ac_cxx_werror_flag=yes
-   ac_cv_prog_cxx_g=no
-   CXXFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-else
-  CXXFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
-  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-	 CXXFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
-  CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
-  if test "$GXX" = yes; then
-    CXXFLAGS="-g -O2"
-  else
-    CXXFLAGS="-g"
-  fi
-else
-  if test "$GXX" = yes; then
-    CXXFLAGS="-O2"
-  else
-    CXXFLAGS=
-  fi
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-depcc="$CXX"  am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CXX_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CXX_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CXX_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
-  am__fastdepCXX_TRUE=
-  am__fastdepCXX_FALSE='#'
-else
-  am__fastdepCXX_TRUE='#'
-  am__fastdepCXX_FALSE=
-fi
-
-
-CFLAGS=$save_CFLAGS
-
-
-
-
-
-# By default we simply use the C compiler to build assembly code.
-
-test "${CCAS+set}" = set || CCAS=$CC
-test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
-
-
-
-depcc="$CCAS"   am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if test "${am_cv_CCAS_dependencies_compiler_type+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CCAS_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CCAS_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CCAS_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CCAS_dependencies_compiler_type" >&6; }
-CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then
-  am__fastdepCCAS_TRUE=
-  am__fastdepCCAS_FALSE='#'
-else
-  am__fastdepCCAS_TRUE='#'
-  am__fastdepCCAS_FALSE=
-fi
-
-
-if test "x$CC" != xcc; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5
-$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5
-$as_echo_n "checking whether cc understands -c and -o together... " >&6; }
-fi
-set dummy $CC; ac_cc=`$as_echo "$2" |
-		      sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-# Make sure it works both with $CC and with simple cc.
-# We do the test twice because some compilers refuse to overwrite an
-# existing .o file with -o, though they will create one.
-ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
-rm -f conftest2.*
-if { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } &&
-   test -f conftest2.$ac_objext && { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; };
-then
-  eval ac_cv_prog_cc_${ac_cc}_c_o=yes
-  if test "x$CC" != xcc; then
-    # Test first that cc exists at all.
-    if { ac_try='cc -c conftest.$ac_ext >&5'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-      ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
-      rm -f conftest2.*
-      if { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } &&
-	 test -f conftest2.$ac_objext && { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; };
-      then
-	# cc works too.
-	:
-      else
-	# cc exists but doesn't like -o.
-	eval ac_cv_prog_cc_${ac_cc}_c_o=no
-      fi
-    fi
-  fi
-else
-  eval ac_cv_prog_cc_${ac_cc}_c_o=no
-fi
-rm -f core conftest*
-
-fi
-if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h
-
-fi
-
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
-if test "$am_t" != yes; then
-   # Losing compiler, so override with the script.
-   # FIXME: It is wrong to rewrite CC.
-   # But if we don't then we get into trouble of one sort or another.
-   # A longer-term fix would be to have automake use am__CC in this case,
-   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
-   CC="$am_aux_dir/compile $CC"
-fi
-
-
-case `pwd` in
-  *\ * | *\	*)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
-esac
-
-
-
-macro_version='2.2.7a'
-macro_revision='1.3134'
-
-
-
-
-
-
-
-
-
-
-
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
-$as_echo_n "checking how to print strings... " >&6; }
-# Test print first, because it will be a builtin if present.
-if test "X`print -r -- -n 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
-else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO ""
-}
-
-case "$ECHO" in
-  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
-$as_echo "printf" >&6; } ;;
-  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
-$as_echo "print -r" >&6; } ;;
-  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
-$as_echo "cat" >&6; } ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if test "${ac_cv_path_SED+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
-     for ac_i in 1 2 3 4 5 6 7; do
-       ac_script="$ac_script$as_nl$ac_script"
-     done
-     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
-     { ac_script=; unset ac_script;}
-     if test -z "$SED"; then
-  ac_path_SED_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
-# Check for GNU ac_path_SED and select it if it is found.
-  # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
-  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo '' >> "conftest.nl"
-    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_SED_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_SED="$ac_path_SED"
-      ac_path_SED_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_SED_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_SED"; then
-    as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5
-  fi
-else
-  ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
-  rm -f conftest.sed
-
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$GREP"; then
-  ac_path_GREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in grep ggrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_GREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_GREP"; then
-    as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     if test -z "$EGREP"; then
-  ac_path_EGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in egrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_EGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_EGREP"; then
-    as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_EGREP=$EGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if test "${ac_cv_path_FGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
-   then ac_cv_path_FGREP="$GREP -F"
-   else
-     if test -z "$FGREP"; then
-  ac_path_FGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in fgrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
-# Check for GNU ac_path_FGREP and select it if it is found.
-  # Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'FGREP' >> "conftest.nl"
-    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_FGREP="$ac_path_FGREP"
-      ac_path_FGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_FGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_FGREP"; then
-    as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_FGREP=$FGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
- FGREP="$ac_cv_path_FGREP"
-
-
-test -z "$GREP" && GREP=grep
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if test "${lt_cv_path_LD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if test "${lt_cv_prog_gnu_ld+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if test "${lt_cv_path_NM+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in dumpbin "link -dump"
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DUMPBIN"; then
-  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DUMPBIN=$ac_cv_prog_DUMPBIN
-if test -n "$DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$DUMPBIN" && break
-  done
-fi
-if test -z "$DUMPBIN"; then
-  ac_ct_DUMPBIN=$DUMPBIN
-  for ac_prog in dumpbin "link -dump"
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DUMPBIN"; then
-  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
-if test -n "$ac_ct_DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_DUMPBIN" && break
-done
-
-  if test "x$ac_ct_DUMPBIN" = x; then
-    DUMPBIN=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DUMPBIN=$ac_ct_DUMPBIN
-  fi
-fi
-
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
-
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if test "${lt_cv_nm_interface+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
-  cat conftest.out >&5
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
-
-# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-    i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-
-fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-
-
-
-
-
-: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-
-
-
-
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if test "${lt_cv_ld_reload_flag+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_reload_flag='-r'
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OBJDUMP"; then
-  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
-  ac_ct_OBJDUMP=$OBJDUMP
-  # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OBJDUMP"; then
-  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OBJDUMP="objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OBJDUMP" = x; then
-    OBJDUMP="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OBJDUMP=$ac_ct_OBJDUMP
-  fi
-else
-  OBJDUMP="$ac_cv_prog_OBJDUMP"
-fi
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if test "${lt_cv_deplibs_check_method+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[4-9]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[45]*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[3-9]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AR="${ac_tool_prefix}ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_AR"; then
-  ac_ct_AR=$AR
-  # Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_AR="ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_AR" = x; then
-    AR="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    AR=$ac_ct_AR
-  fi
-else
-  AR="$ac_cv_prog_AR"
-fi
-
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-test -z "$STRIP" && STRIP=:
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-test -z "$RANLIB" && RANLIB=:
-
-
-
-
-
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[BCDEGRST]'
-  ;;
-osf*)
-  symcode='[BCDEGQRST]'
-  ;;
-solaris*)
-  symcode='[BDRT]'
-  ;;
-sco3.2v5*)
-  symcode='[DT]'
-  ;;
-sysv4.2uw2*)
-  symcode='[DT]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[ABDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK '"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
-  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&5
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&5
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-
-fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
-  enableval=$enable_libtool_lock;
-fi
-
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    case `/usr/bin/file conftest.o` in
-	      *x86-64*)
-		LD="${LD-ld} -m elf32_x86_64"
-		;;
-	      *)
-		LD="${LD-ld} -m elf_i386"
-		;;
-	    esac
-	    ;;
-	  powerpc64le-*linux*)
-	    LD="${LD-ld} -m elf32lppclinux"
-	    ;;
-	  powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  powerpcle-*linux*)
-	    LD="${LD-ld} -m elf64lppc"
-	    ;;
-	  powerpc-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if test "${lt_cv_cc_needs_belf+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_cc_needs_belf=yes
-else
-  lt_cv_cc_needs_belf=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-
-
-  case $host_os in
-    rhapsody* | darwin*)
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DSYMUTIL"; then
-  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DSYMUTIL=$ac_cv_prog_DSYMUTIL
-if test -n "$DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DSYMUTIL"; then
-  ac_ct_DSYMUTIL=$DSYMUTIL
-  # Extract the first word of "dsymutil", so it can be a program name with args.
-set dummy dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DSYMUTIL"; then
-  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
-if test -n "$ac_ct_DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DSYMUTIL" = x; then
-    DSYMUTIL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DSYMUTIL=$ac_ct_DSYMUTIL
-  fi
-else
-  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
-set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NMEDIT"; then
-  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-NMEDIT=$ac_cv_prog_NMEDIT
-if test -n "$NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_NMEDIT"; then
-  ac_ct_NMEDIT=$NMEDIT
-  # Extract the first word of "nmedit", so it can be a program name with args.
-set dummy nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_NMEDIT"; then
-  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_NMEDIT="nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
-if test -n "$ac_ct_NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_NMEDIT" = x; then
-    NMEDIT=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    NMEDIT=$ac_ct_NMEDIT
-  fi
-else
-  NMEDIT="$ac_cv_prog_NMEDIT"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$LIPO"; then
-  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-LIPO=$ac_cv_prog_LIPO
-if test -n "$LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_LIPO"; then
-  ac_ct_LIPO=$LIPO
-  # Extract the first word of "lipo", so it can be a program name with args.
-set dummy lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_LIPO"; then
-  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_LIPO="lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
-if test -n "$ac_ct_LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_LIPO" = x; then
-    LIPO=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    LIPO=$ac_ct_LIPO
-  fi
-else
-  LIPO="$ac_cv_prog_LIPO"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL"; then
-  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL=$ac_cv_prog_OTOOL
-if test -n "$OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL"; then
-  ac_ct_OTOOL=$OTOOL
-  # Extract the first word of "otool", so it can be a program name with args.
-set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL"; then
-  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL="otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL" = x; then
-    OTOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL=$ac_ct_OTOOL
-  fi
-else
-  OTOOL="$ac_cv_prog_OTOOL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL64"; then
-  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL64"; then
-  ac_ct_OTOOL64=$OTOOL64
-  # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL64"; then
-  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL64="otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL64" = x; then
-    OTOOL64=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL64=$ac_ct_OTOOL64
-  fi
-else
-  OTOOL64="$ac_cv_prog_OTOOL64"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&5
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_ld_exported_symbols_list=yes
-else
-  lt_cv_ld_exported_symbols_list=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
-$as_echo_n "checking for -force_load linker flag... " >&6; }
-if test "${lt_cv_ld_force_load+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
-      echo "$AR cru libconftest.a conftest.o" >&5
-      $AR cru libconftest.a conftest.o 2>&5
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&5
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
-$as_echo "$lt_cv_ld_force_load" >&6; }
-    case $host_os in
-    rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012][,.]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-eval as_val=\$$as_ac_Header
-   if test "x$as_val" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in dlfcn.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-
-
-
-# Set options
-
-
-
-        enable_dlopen=no
-
-
-  enable_win32_dll=no
-
-
-            # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
-  enableval=$enable_shared; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_shared=yes
-fi
-
-
-
-
-
-
-
-
-
-  # Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
-  enableval=$enable_static; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_static=yes
-fi
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
-  withval=$with_pic; pic_mode="$withval"
-else
-  pic_mode=default
-fi
-
-
-test -z "$pic_mode" && pic_mode=default
-
-
-
-
-
-
-
-  # Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
-  enableval=$enable_fast_install; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_fast_install=yes
-fi
-
-
-
-
-
-
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-test -z "$LN_S" && LN_S="ln -s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if test "${lt_cv_objdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
-objdir=$lt_cv_objdir
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
-
-
-
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  else
-    MAGIC_CMD=:
-  fi
-fi
-
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-
-lt_prog_compiler_no_builtin_flag=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
-  *)
-    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
-  esac
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_rtti_exceptions=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
-else
-    :
-fi
-
-fi
-
-
-
-
-
-
-  lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl='-Wl,'
-    lt_prog_compiler_static='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      lt_prog_compiler_wl='-Xlinker '
-      lt_prog_compiler_pic='-Xcompiler -fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-KPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='--shared'
-	lt_prog_compiler_static='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fpic'
-	lt_prog_compiler_static='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-qpic'
-	lt_prog_compiler_static='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ F* | *Sun*Fortran*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl=''
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Wl,'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    rdos*)
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    solaris*)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	lt_prog_compiler_wl='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      lt_prog_compiler_wl='-Qoption ld '
-      lt_prog_compiler_pic='-PIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic='-Kconform_pic'
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    unicos*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_can_build_shared=no
-      ;;
-
-    uts4*)
-      lt_prog_compiler_pic='-pic'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *)
-      lt_prog_compiler_can_build_shared=no
-      ;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic=
-    ;;
-  *)
-    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
-    ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
-$as_echo "$lt_prog_compiler_pic" >&6; }
-
-
-
-
-
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
-    case $lt_prog_compiler_pic in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
-     esac
-else
-    lt_prog_compiler_pic=
-     lt_prog_compiler_can_build_shared=no
-fi
-
-fi
-
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
-    :
-else
-    lt_prog_compiler_static=
-fi
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  runpath_var=
-  allow_undefined_flag=
-  always_export_symbols=no
-  archive_cmds=
-  archive_expsym_cmds=
-  compiler_needs_object=no
-  enable_shared_with_static_runtimes=no
-  export_dynamic_flag_spec=
-  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  hardcode_automatic=no
-  hardcode_direct=no
-  hardcode_direct_absolute=no
-  hardcode_libdir_flag_spec=
-  hardcode_libdir_flag_spec_ld=
-  hardcode_libdir_separator=
-  hardcode_minus_L=no
-  hardcode_shlibpath_var=unsupported
-  inherit_rpath=no
-  link_all_deplibs=unknown
-  module_cmds=
-  module_expsym_cmds=
-  old_archive_from_new_cmds=
-  old_archive_from_expsyms_cmds=
-  thread_safe_flag_spec=
-  whole_archive_flag_spec=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  ld_shlibs=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
-	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      export_dynamic_flag_spec='${wl}--export-all-symbols'
-      allow_undefined_flag=unsupported
-      always_export_symbols=no
-      enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    haiku*)
-      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      link_all_deplibs=yes
-      ;;
-
-    interix[3-9]*)
-      hardcode_direct=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=' $pic_flag'
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  whole_archive_flag_spec=
-	  tmp_sharedflag='--shared' ;;
-	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec=
-	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
-	  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        ld_shlibs=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    ld_shlibs=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-    esac
-
-    if test "$ld_shlibs" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec=
-      export_dynamic_flag_spec=
-      whole_archive_flag_spec=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag=unsupported
-      always_export_symbols=yes
-      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct=unsupported
-      fi
-      ;;
-
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      archive_cmds=''
-      hardcode_direct=yes
-      hardcode_direct_absolute=yes
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  hardcode_direct=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L=yes
-	  hardcode_libdir_flag_spec='-L$libdir'
-	  hardcode_libdir_separator=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      export_dynamic_flag_spec='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    whole_archive_flag_spec='$convenience'
-	  fi
-	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[45]*)
-      export_dynamic_flag_spec=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec=' '
-      allow_undefined_flag=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_from_new_cmds='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes=yes
-      ;;
-
-    darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc=no
-  hardcode_direct=no
-  hardcode_automatic=yes
-  hardcode_shlibpath_var=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-  else
-    whole_archive_flag_spec=''
-  fi
-  link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
-  else
-  ld_shlibs=no
-  fi
-
-      ;;
-
-    dgux*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2.*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_flag_spec_ld='+b $libdir'
-	hardcode_libdir_separator=:
-	hardcode_direct=yes
-	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
-$as_echo_n "checking if $CC understands -b... " >&6; }
-if test "${lt_cv_prog_compiler__b+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler__b=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS -b"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler__b=yes
-       fi
-     else
-       lt_cv_prog_compiler__b=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
-$as_echo "$lt_cv_prog_compiler__b" >&6; }
-
-if test x"$lt_cv_prog_compiler__b" = xyes; then
-    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-else
-    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-fi
-
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_direct=no
-	  hardcode_shlibpath_var=no
-	  ;;
-	*)
-	  hardcode_direct=yes
-	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int foo(void) {}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-        LDFLAGS="$save_LDFLAGS"
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      inherit_rpath=yes
-      link_all_deplibs=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    newsos6)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_shlibpath_var=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	hardcode_direct=yes
-	hardcode_shlibpath_var=no
-	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_separator=:
-      ;;
-
-    solaris*)
-      no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_shlibpath_var=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      link_all_deplibs=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds='$CC -r -o $output$reload_objs'
-	  hardcode_direct=no
-        ;;
-	motorola)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4.3*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var=no
-      export_dynamic_flag_spec='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      ld_shlibs=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
-
-with_gnu_ld=$with_gnu_ld
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if test "${lt_cv_archive_cmds_need_lc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl
-	  pic_flag=$lt_prog_compiler_pic
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag
-	  allow_undefined_flag=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	  then
-	    lt_cv_archive_cmds_need_lc=no
-	  else
-	    lt_cv_archive_cmds_need_lc=yes
-	  fi
-	  allow_undefined_flag=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
-      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[lt_foo]++; }
-  if (lt_freq[lt_foo] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[23].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/beos/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[3-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
-	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-
-fi
-
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" ||
-   test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
-
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-  if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-
-fi
-
-    ;;
-
-  *)
-    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-int
-main ()
-{
-return shl_load ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_shl_load=yes
-else
-  ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
-  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_svld_dlopen=yes
-else
-  ac_cv_lib_svld_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link ();
-int
-main ()
-{
-return dld_link ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_dld_link=yes
-else
-  ac_cv_lib_dld_dld_link=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line 11373 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-void fnord () __attribute__((visibility("default")));
-#endif
-
-void fnord () { int i=42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self_static+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self_static=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line 11479 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-void fnord () __attribute__((visibility("default")));
-#endif
-
-void fnord () { int i=42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self_static=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-striplib=
-old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    fi
-    ;;
-  *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-  # Report which library types will actually be built
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
-
-
-
-
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-CC="$lt_save_CC"
-
-      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
-$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
-if test -z "$CXXCPP"; then
-  if test "${ac_cv_prog_CXXCPP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CXXCPP needs to be expanded
-    for CXXCPP in "$CXX -E" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CXXCPP=$CXXCPP
-
-fi
-  CXXCPP=$ac_cv_prog_CXXCPP
-else
-  ac_cv_prog_CXXCPP=$CXXCPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
-$as_echo "$CXXCPP" >&6; }
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-else
-  _lt_caught_CXX_error=yes
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-archive_cmds_need_lc_CXX=no
-allow_undefined_flag_CXX=
-always_export_symbols_CXX=no
-archive_expsym_cmds_CXX=
-compiler_needs_object_CXX=no
-export_dynamic_flag_spec_CXX=
-hardcode_direct_CXX=no
-hardcode_direct_absolute_CXX=no
-hardcode_libdir_flag_spec_CXX=
-hardcode_libdir_flag_spec_ld_CXX=
-hardcode_libdir_separator_CXX=
-hardcode_minus_L_CXX=no
-hardcode_shlibpath_var_CXX=unsupported
-hardcode_automatic_CXX=no
-inherit_rpath_CXX=no
-module_cmds_CXX=
-module_expsym_cmds_CXX=
-link_all_deplibs_CXX=unknown
-old_archive_cmds_CXX=$old_archive_cmds
-reload_flag_CXX=$reload_flag
-reload_cmds_CXX=$reload_cmds
-no_undefined_flag_CXX=
-whole_archive_flag_spec_CXX=
-enable_shared_with_static_runtimes_CXX=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-objext_CXX=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-  # save warnings/boilerplate of simple test code
-  ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-  ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  compiler=$CC
-  compiler_CXX=$CC
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
-    else
-      lt_prog_compiler_no_builtin_flag_CXX=
-    fi
-
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if test "${lt_cv_path_LD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if test "${lt_cv_prog_gnu_ld+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          whole_archive_flag_spec_CXX=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-    ld_shlibs_CXX=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-      aix[4-9]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        archive_cmds_CXX=''
-        hardcode_direct_CXX=yes
-        hardcode_direct_absolute_CXX=yes
-        hardcode_libdir_separator_CXX=':'
-        link_all_deplibs_CXX=yes
-        file_list_spec_CXX='${wl}-f,'
-
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[012]|aix4.[012].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    hardcode_direct_CXX=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    hardcode_minus_L_CXX=yes
-	    hardcode_libdir_flag_spec_CXX='-L$libdir'
-	    hardcode_libdir_separator_CXX=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
-
-        export_dynamic_flag_spec_CXX='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        always_export_symbols_CXX=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          allow_undefined_flag_CXX='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
-	    allow_undefined_flag_CXX="-z nodefs"
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    no_undefined_flag_CXX=' ${wl}-bernotok'
-	    allow_undefined_flag_CXX=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
-	      # We only use this code for GNU lds that support --whole-archive.
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    else
-	      # Exported symbols can be pulled into shared objects from archives
-	      whole_archive_flag_spec_CXX='$convenience'
-	    fi
-	    archive_cmds_need_lc_CXX=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  allow_undefined_flag_CXX=unsupported
-	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  ld_shlibs_CXX=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  ld_shlibs_CXX=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-        # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
-        # as there is no search path for DLLs.
-        hardcode_libdir_flag_spec_CXX='-L$libdir'
-        export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
-        allow_undefined_flag_CXX=unsupported
-        always_export_symbols_CXX=no
-        enable_shared_with_static_runtimes_CXX=yes
-
-        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-          archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-          # If the export-symbols file already is a .def file (1st line
-          # is EXPORTS), use it as is; otherwise, prepend...
-          archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    cp $export_symbols $output_objdir/$soname.def;
-          else
-	    echo EXPORTS > $output_objdir/$soname.def;
-	    cat $export_symbols >> $output_objdir/$soname.def;
-          fi~
-          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-        else
-          ld_shlibs_CXX=no
-        fi
-        ;;
-      darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc_CXX=no
-  hardcode_direct_CXX=no
-  hardcode_automatic_CXX=yes
-  hardcode_shlibpath_var_CXX=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-  else
-    whole_archive_flag_spec_CXX=''
-  fi
-  link_all_deplibs_CXX=yes
-  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-    fi
-
-  else
-  ld_shlibs_CXX=no
-  fi
-
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      freebsd2.*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        ld_shlibs_CXX=no
-        ;;
-
-      freebsd-elf*)
-        archive_cmds_need_lc_CXX=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        ld_shlibs_CXX=yes
-        ;;
-
-      gnu*)
-        ;;
-
-      haiku*)
-        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        link_all_deplibs_CXX=yes
-        ;;
-
-      hpux9*)
-        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
-        hardcode_libdir_separator_CXX=:
-        export_dynamic_flag_spec_CXX='${wl}-E'
-        hardcode_direct_CXX=yes
-        hardcode_minus_L_CXX=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            ld_shlibs_CXX=no
-            ;;
-          aCC*)
-            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-            ;;
-          *)
-            if test "$GXX" = yes; then
-              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              ld_shlibs_CXX=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
-	  hardcode_libdir_separator_CXX=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      export_dynamic_flag_spec_CXX='${wl}-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            hardcode_direct_CXX=no
-            hardcode_shlibpath_var_CXX=no
-            ;;
-          *)
-            hardcode_direct_CXX=yes
-            hardcode_direct_absolute_CXX=yes
-            hardcode_minus_L_CXX=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
-	        case $host_cpu in
-	          hppa*64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      ld_shlibs_CXX=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[3-9]*)
-	hardcode_direct_CXX=no
-	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec_CXX='${wl}-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	      else
-	        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
-	      fi
-	    fi
-	    link_all_deplibs_CXX=yes
-	    ;;
-        esac
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-        hardcode_libdir_separator_CXX=:
-        inherit_rpath_CXX=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    archive_cmds_need_lc_CXX=no
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
-	      prelink_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
-	      old_archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
-		$RANLIB $oldlib'
-	      archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      archive_expsym_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 and above use weak symbols
-	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-	    hardcode_libdir_separator_CXX=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
-	    ;;
-	  xl* | mpixl* | bgxl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
-	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      no_undefined_flag_CXX=' -zdefs'
-	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	      hardcode_libdir_flag_spec_CXX='-R$libdir'
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	      compiler_needs_object_CXX=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='func_echo_all'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  hardcode_libdir_flag_spec_CXX='-R$libdir'
-	  hardcode_direct_CXX=yes
-	  hardcode_shlibpath_var_CXX=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        ld_shlibs_CXX=yes
-	;;
-
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	ld_shlibs_CXX=no
-	;;
-
-      openbsd*)
-	if test -f /usr/libexec/ld.so; then
-	  hardcode_direct_CXX=yes
-	  hardcode_shlibpath_var_CXX=no
-	  hardcode_direct_absolute_CXX=yes
-	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    export_dynamic_flag_spec_CXX='${wl}-E'
-	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=func_echo_all
-	else
-	  ld_shlibs_CXX=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    hardcode_libdir_separator_CXX=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-		;;
-	      *)
-	        allow_undefined_flag_CXX=' -expect_unresolved \*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
-	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-		;;
-	    esac
-
-	    hardcode_libdir_separator_CXX=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	      case $host in
-	        osf3*)
-	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	        *)
-	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	      hardcode_libdir_separator_CXX=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      ld_shlibs_CXX=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            archive_cmds_need_lc_CXX=yes
-	    no_undefined_flag_CXX=' -zdefs'
-	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    hardcode_libdir_flag_spec_CXX='-R$libdir'
-	    hardcode_shlibpath_var_CXX=no
-	    case $host_os in
-	      solaris2.[0-5] | solaris2.[0-5].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    link_all_deplibs_CXX=yes
-
-	    output_verbose_link_cmd='func_echo_all'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	        # platform.
-	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      fi
-
-	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
-	      case $host_os in
-		solaris2.[0-5] | solaris2.[0-5].*) ;;
-		*)
-		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag_CXX='${wl}-z,text'
-      archive_cmds_need_lc_CXX=no
-      hardcode_shlibpath_var_CXX=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	no_undefined_flag_CXX='${wl}-z,text'
-	allow_undefined_flag_CXX='${wl}-z,nodefs'
-	archive_cmds_need_lc_CXX=no
-	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
-	hardcode_libdir_separator_CXX=':'
-	link_all_deplibs_CXX=yes
-	export_dynamic_flag_spec_CXX='${wl}-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
-	      '"$old_archive_cmds_CXX"
-	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
-	      '"$reload_cmds_CXX"
-	    ;;
-	  *)
-	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-    esac
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
-    test "$ld_shlibs_CXX" = no && can_build_shared=no
-
-    GCC_CXX="$GXX"
-    LD_CXX="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    # Dependencies to place before and after the object being linked:
-predep_objects_CXX=
-postdep_objects_CXX=
-predeps_CXX=
-postdeps_CXX=
-compiler_lib_search_path_CXX=
-
-cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-
-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case $p in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
-	 prev=$p
-	 continue
-       else
-	 prev=
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 case $p in
-	 -L* | -R*)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$compiler_lib_search_path_CXX"; then
-	     compiler_lib_search_path_CXX="${prev}${p}"
-	   else
-	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$postdeps_CXX"; then
-	   postdeps_CXX="${prev}${p}"
-	 else
-	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
-	 fi
-       fi
-       ;;
-
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$predep_objects_CXX"; then
-	   predep_objects_CXX="$p"
-	 else
-	   predep_objects_CXX="$predep_objects_CXX $p"
-	 fi
-       else
-	 if test -z "$postdep_objects_CXX"; then
-	   postdep_objects_CXX="$p"
-	 else
-	   postdep_objects_CXX="$postdep_objects_CXX $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling CXX test program"
-fi
-
-$RM -f confest.$objext
-
-# PORTME: override above test on systems where it is broken
-case $host_os in
-interix[3-9]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  predep_objects_CXX=
-  postdep_objects_CXX=
-  postdeps_CXX=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-
-
-case " $postdeps_CXX " in
-*" -lc "*) archive_cmds_need_lc_CXX=no ;;
-esac
- compiler_lib_search_dirs_CXX=
-if test -n "${compiler_lib_search_path_CXX}"; then
- compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    lt_prog_compiler_wl_CXX=
-lt_prog_compiler_pic_CXX=
-lt_prog_compiler_static_CXX=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    lt_prog_compiler_wl_CXX='-Wl,'
-    lt_prog_compiler_static_CXX='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_CXX='-Bstatic'
-      fi
-      lt_prog_compiler_pic_CXX='-fPIC'
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic_CXX='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic_CXX='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      lt_prog_compiler_pic_CXX=
-      ;;
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static_CXX=
-      ;;
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic_CXX=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	lt_prog_compiler_pic_CXX='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic_CXX='-fPIC -shared'
-      ;;
-    *)
-      lt_prog_compiler_pic_CXX='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[4-9]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  lt_prog_compiler_static_CXX='-Bstatic'
-	else
-	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      lt_prog_compiler_pic_CXX='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      lt_prog_compiler_pic_CXX='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    lt_prog_compiler_pic_CXX='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-fPIC'
-	    lt_prog_compiler_static_CXX='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-fpic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
-	    # IBM XL 8.0, 9.0 on PPC and BlueGene
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-qpic'
-	    lt_prog_compiler_static_CXX='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      lt_prog_compiler_pic_CXX='-KPIC'
-	      lt_prog_compiler_static_CXX='-Bstatic'
-	      lt_prog_compiler_wl_CXX='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    lt_prog_compiler_pic_CXX='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        lt_prog_compiler_pic_CXX='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    lt_prog_compiler_wl_CXX='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    lt_prog_compiler_pic_CXX='-pic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	lt_prog_compiler_can_build_shared_CXX=no
-	;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic_CXX=
-    ;;
-  *)
-    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
-    ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX" >&5
-$as_echo "$lt_prog_compiler_pic_CXX" >&6; }
-
-
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
-if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works_CXX=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works_CXX=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
-    case $lt_prog_compiler_pic_CXX in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
-     esac
-else
-    lt_prog_compiler_pic_CXX=
-     lt_prog_compiler_can_build_shared_CXX=no
-fi
-
-fi
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works_CXX=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works_CXX=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works_CXX=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
-    :
-else
-    lt_prog_compiler_static_CXX=
-fi
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o_CXX=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_CXX=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o_CXX=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_CXX=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  case $host_os in
-  aix[4-9]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    else
-      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    export_symbols_cmds_CXX="$ltdll_cmds"
-  ;;
-  cygwin* | mingw* | cegcc*)
-    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  *)
-    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  esac
-  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
-test "$ld_shlibs_CXX" = no && can_build_shared=no
-
-with_gnu_ld_CXX=$with_gnu_ld
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_CXX" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc_CXX=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds_CXX in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if test "${lt_cv_archive_cmds_need_lc_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl_CXX
-	  pic_flag=$lt_prog_compiler_pic_CXX
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
-	  allow_undefined_flag_CXX=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	  then
-	    lt_cv_archive_cmds_need_lc_CXX=no
-	  else
-	    lt_cv_archive_cmds_need_lc_CXX=yes
-	  fi
-	  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
-      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[23].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/beos/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[3-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
-	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-
-fi
-
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action_CXX=
-if test -n "$hardcode_libdir_flag_spec_CXX" ||
-   test -n "$runpath_var_CXX" ||
-   test "X$hardcode_automatic_CXX" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct_CXX" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
-     test "$hardcode_minus_L_CXX" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action_CXX=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action_CXX=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action_CXX=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
-$as_echo "$hardcode_action_CXX" >&6; }
-
-if test "$hardcode_action_CXX" = relink ||
-   test "$inherit_rpath_CXX" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-
-
-
-
-
-
-
-
-
-        ac_config_commands="$ac_config_commands libtool"
-
-
-
-
-# Only expand once:
-
-
-
-# Test for 64-bit build.
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5
-$as_echo_n "checking size of size_t... " >&6; }
-if test "${ac_cv_sizeof_size_t+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_size_t" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (size_t)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_size_t=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5
-$as_echo "$ac_cv_sizeof_size_t" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
-_ACEOF
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
-$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
-    # Check whether --enable-maintainer-mode was given.
-if test "${enable_maintainer_mode+set}" = set; then :
-  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
-else
-  USE_MAINTAINER_MODE=no
-fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
-$as_echo "$USE_MAINTAINER_MODE" >&6; }
-   if test $USE_MAINTAINER_MODE = yes; then
-  MAINTAINER_MODE_TRUE=
-  MAINTAINER_MODE_FALSE='#'
-else
-  MAINTAINER_MODE_TRUE='#'
-  MAINTAINER_MODE_FALSE=
-fi
-
-  MAINT=$MAINTAINER_MODE_TRUE
-
-
-
-for ac_header in sys/mman.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_mman_h" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_SYS_MMAN_H 1
-_ACEOF
-
-fi
-
-done
-
-for ac_func in mmap mkostemp
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-eval as_val=\$$as_ac_var
-   if test "x$as_val" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_mman_h" = x""yes; then :
-  libffi_header_sys_mman_h=yes
-else
-  libffi_header_sys_mman_h=no
-fi
-
-
-ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
-if test "x$ac_cv_func_mmap" = x""yes; then :
-  libffi_func_mmap=yes
-else
-  libffi_func_mmap=no
-fi
-
-if test "$libffi_header_sys_mman_h" != yes \
- || test "$libffi_func_mmap" != yes; then
-   ac_cv_func_mmap_file=no
-   ac_cv_func_mmap_dev_zero=no
-   ac_cv_func_mmap_anon=no
-else
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether read-only mmap of a plain file works" >&5
-$as_echo_n "checking whether read-only mmap of a plain file works... " >&6; }
-if test "${ac_cv_func_mmap_file+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  # Add a system to this blacklist if
-   # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a
-   # memory area containing the same data that you'd get if you applied
-   # read() to the same fd.  The only system known to have a problem here
-   # is VMS, where text files have record structure.
-   case "$host_os" in
-     vms* | ultrix*)
-	ac_cv_func_mmap_file=no ;;
-     *)
-	ac_cv_func_mmap_file=yes;;
-   esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_file" >&5
-$as_echo "$ac_cv_func_mmap_file" >&6; }
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap from /dev/zero works" >&5
-$as_echo_n "checking whether mmap from /dev/zero works... " >&6; }
-if test "${ac_cv_func_mmap_dev_zero+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  # Add a system to this blacklist if it has mmap() but /dev/zero
-   # does not exist, or if mmapping /dev/zero does not give anonymous
-   # zeroed pages with both the following properties:
-   # 1. If you map N consecutive pages in with one call, and then
-   #    unmap any subset of those pages, the pages that were not
-   #    explicitly unmapped remain accessible.
-   # 2. If you map two adjacent blocks of memory and then unmap them
-   #    both at once, they must both go away.
-   # Systems known to be in this category are Windows (all variants),
-   # VMS, and Darwin.
-   case "$host_os" in
-     vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00)
-	ac_cv_func_mmap_dev_zero=no ;;
-     *)
-	ac_cv_func_mmap_dev_zero=yes;;
-   esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_dev_zero" >&5
-$as_echo "$ac_cv_func_mmap_dev_zero" >&6; }
-
-   # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for.
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANON(YMOUS)" >&5
-$as_echo_n "checking for MAP_ANON(YMOUS)... " >&6; }
-if test "${ac_cv_decl_map_anon+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <unistd.h>
-
-#ifndef MAP_ANONYMOUS
-#define MAP_ANONYMOUS MAP_ANON
-#endif
-
-int
-main ()
-{
-int n = MAP_ANONYMOUS;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_decl_map_anon=yes
-else
-  ac_cv_decl_map_anon=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_map_anon" >&5
-$as_echo "$ac_cv_decl_map_anon" >&6; }
-
-   if test $ac_cv_decl_map_anon = no; then
-     ac_cv_func_mmap_anon=no
-   else
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap with MAP_ANON(YMOUS) works" >&5
-$as_echo_n "checking whether mmap with MAP_ANON(YMOUS) works... " >&6; }
-if test "${ac_cv_func_mmap_anon+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  # Add a system to this blacklist if it has mmap() and MAP_ANON or
-   # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
-   # doesn't give anonymous zeroed pages with the same properties listed
-   # above for use of /dev/zero.
-   # Systems known to be in this category are Windows, VMS, and SCO Unix.
-   case "$host_os" in
-     vms* | cygwin* | pe | mingw* | sco* | udk* )
-	ac_cv_func_mmap_anon=no ;;
-     *)
-	ac_cv_func_mmap_anon=yes;;
-   esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_anon" >&5
-$as_echo "$ac_cv_func_mmap_anon" >&6; }
-   fi
-fi
-
-if test $ac_cv_func_mmap_file = yes; then
-
-$as_echo "#define HAVE_MMAP_FILE 1" >>confdefs.h
-
-fi
-if test $ac_cv_func_mmap_dev_zero = yes; then
-
-$as_echo "#define HAVE_MMAP_DEV_ZERO 1" >>confdefs.h
-
-fi
-if test $ac_cv_func_mmap_anon = yes; then
-
-$as_echo "#define HAVE_MMAP_ANON 1" >>confdefs.h
-
-fi
-
-
- if test -d $srcdir/testsuite; then
-  TESTSUBDIR_TRUE=
-  TESTSUBDIR_FALSE='#'
-else
-  TESTSUBDIR_TRUE='#'
-  TESTSUBDIR_FALSE=
-fi
-
-
-TARGETDIR="unknown"
-HAVE_LONG_DOUBLE_VARIANT=0
-
-. ${srcdir}/configure.host
-
-if test -n "${UNSUPPORTED}"; then
-  as_fn_error "\"libffi has not been ported to $host.\"" "$LINENO" 5
-fi
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-for ac_func in memcpy
-do :
-  ac_fn_c_check_func "$LINENO" "memcpy" "ac_cv_func_memcpy"
-if test "x$ac_cv_func_memcpy" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_MEMCPY 1
-_ACEOF
-
-fi
-done
-
-# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
-# for constant arguments.  Useless!
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
-$as_echo_n "checking for working alloca.h... " >&6; }
-if test "${ac_cv_working_alloca_h+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <alloca.h>
-int
-main ()
-{
-char *p = (char *) alloca (2 * sizeof (int));
-			  if (p) return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_working_alloca_h=yes
-else
-  ac_cv_working_alloca_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
-$as_echo "$ac_cv_working_alloca_h" >&6; }
-if test $ac_cv_working_alloca_h = yes; then
-
-$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
-$as_echo_n "checking for alloca... " >&6; }
-if test "${ac_cv_func_alloca_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __GNUC__
-# define alloca __builtin_alloca
-#else
-# ifdef _MSC_VER
-#  include <malloc.h>
-#  define alloca _alloca
-# else
-#  ifdef HAVE_ALLOCA_H
-#   include <alloca.h>
-#  else
-#   ifdef _AIX
- #pragma alloca
-#   else
-#    ifndef alloca /* predefined by HP cc +Olibcalls */
-char *alloca ();
-#    endif
-#   endif
-#  endif
-# endif
-#endif
-
-int
-main ()
-{
-char *p = (char *) alloca (1);
-				    if (p) return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_func_alloca_works=yes
-else
-  ac_cv_func_alloca_works=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
-$as_echo "$ac_cv_func_alloca_works" >&6; }
-
-if test $ac_cv_func_alloca_works = yes; then
-
-$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
-
-else
-  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
-# that cause trouble.  Some versions do not even contain alloca or
-# contain a buggy version.  If you still want to use their alloca,
-# use ar to extract alloca.o from them instead of compiling alloca.c.
-
-ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
-
-$as_echo "#define C_ALLOCA 1" >>confdefs.h
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
-$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
-if test "${ac_cv_os_cray+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#if defined CRAY && ! defined CRAY2
-webecray
-#else
-wenotbecray
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "webecray" >/dev/null 2>&1; then :
-  ac_cv_os_cray=yes
-else
-  ac_cv_os_cray=no
-fi
-rm -f conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
-$as_echo "$ac_cv_os_cray" >&6; }
-if test $ac_cv_os_cray = yes; then
-  for ac_func in _getb67 GETB67 getb67; do
-    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-eval as_val=\$$as_ac_var
-   if test "x$as_val" = x""yes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define CRAY_STACKSEG_END $ac_func
-_ACEOF
-
-    break
-fi
-
-  done
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
-$as_echo_n "checking stack direction for C alloca... " >&6; }
-if test "${ac_cv_c_stack_direction+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ac_cv_c_stack_direction=0
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-find_stack_direction ()
-{
-  static char *addr = 0;
-  auto char dummy;
-  if (addr == 0)
-    {
-      addr = &dummy;
-      return find_stack_direction ();
-    }
-  else
-    return (&dummy > addr) ? 1 : -1;
-}
-
-int
-main ()
-{
-  return find_stack_direction () < 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_c_stack_direction=1
-else
-  ac_cv_c_stack_direction=-1
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
-$as_echo "$ac_cv_c_stack_direction" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define STACK_DIRECTION $ac_cv_c_stack_direction
-_ACEOF
-
-
-fi
-
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5
-$as_echo_n "checking size of double... " >&6; }
-if test "${ac_cv_sizeof_double+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_double" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (double)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_double=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5
-$as_echo "$ac_cv_sizeof_double" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_DOUBLE $ac_cv_sizeof_double
-_ACEOF
-
-
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5
-$as_echo_n "checking size of long double... " >&6; }
-if test "${ac_cv_sizeof_long_double+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_long_double" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (long double)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_long_double=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5
-$as_echo "$ac_cv_sizeof_long_double" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double
-_ACEOF
-
-
-
-# Also AC_SUBST this variable for ffi.h.
-if test -z "$HAVE_LONG_DOUBLE"; then
-  HAVE_LONG_DOUBLE=0
-  if test $ac_cv_sizeof_long_double != 0; then
-    if test $HAVE_LONG_DOUBLE_VARIANT != 0; then
-
-$as_echo "#define HAVE_LONG_DOUBLE_VARIANT 1" >>confdefs.h
-
-      HAVE_LONG_DOUBLE=1
-    else
-      if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then
-        HAVE_LONG_DOUBLE=1
-
-$as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h
-
-      fi
-    fi
-  fi
-fi
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
-$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
-if test "${ac_cv_c_bigendian+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_c_bigendian=unknown
-    # See if we're dealing with a universal compiler.
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __APPLE_CC__
-	       not a universal capable compiler
-	     #endif
-	     typedef int dummy;
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-	# Check for potential -arch flags.  It is not universal unless
-	# there are at least two -arch flags with different values.
-	ac_arch=
-	ac_prev=
-	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
-	 if test -n "$ac_prev"; then
-	   case $ac_word in
-	     i?86 | x86_64 | ppc | ppc64)
-	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
-		 ac_arch=$ac_word
-	       else
-		 ac_cv_c_bigendian=universal
-		 break
-	       fi
-	       ;;
-	   esac
-	   ac_prev=
-	 elif test "x$ac_word" = "x-arch"; then
-	   ac_prev=arch
-	 fi
-       done
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if sys/param.h defines the BYTE_ORDER macro.
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-	     #include <sys/param.h>
-
-int
-main ()
-{
-#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
-		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
-		     && LITTLE_ENDIAN)
-	      bogus endian macros
-	     #endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-		#include <sys/param.h>
-
-int
-main ()
-{
-#if BYTE_ORDER != BIG_ENDIAN
-		 not big endian
-		#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
-else
-  ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-
-int
-main ()
-{
-#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
-	      bogus endian macros
-	     #endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to _BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-
-int
-main ()
-{
-#ifndef _BIG_ENDIAN
-		 not big endian
-		#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
-else
-  ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # Compile a test program.
-      if test "$cross_compiling" = yes; then :
-  # Try to guess by grepping values from an object file.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-short int ascii_mm[] =
-		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
-		short int ascii_ii[] =
-		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
-		int use_ascii (int i) {
-		  return ascii_mm[i] + ascii_ii[i];
-		}
-		short int ebcdic_ii[] =
-		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
-		short int ebcdic_mm[] =
-		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
-		int use_ebcdic (int i) {
-		  return ebcdic_mm[i] + ebcdic_ii[i];
-		}
-		extern int foo;
-
-int
-main ()
-{
-return use_ascii (foo) == use_ebcdic (foo);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
-	      ac_cv_c_bigendian=yes
-	    fi
-	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
-	      if test "$ac_cv_c_bigendian" = unknown; then
-		ac_cv_c_bigendian=no
-	      else
-		# finding both strings is unlikely to happen, but who knows?
-		ac_cv_c_bigendian=unknown
-	      fi
-	    fi
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-
-	     /* Are we little or big endian?  From Harbison&Steele.  */
-	     union
-	     {
-	       long int l;
-	       char c[sizeof (long int)];
-	     } u;
-	     u.l = 1;
-	     return u.c[sizeof (long int) - 1] == 1;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_c_bigendian=no
-else
-  ac_cv_c_bigendian=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-    fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
-$as_echo "$ac_cv_c_bigendian" >&6; }
- case $ac_cv_c_bigendian in #(
-   yes)
-     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
-;; #(
-   no)
-      ;; #(
-   universal)
-
-$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
-
-     ;; #(
-   *)
-     as_fn_error "unknown endianness
- presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
- esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .cfi pseudo-op support" >&5
-$as_echo_n "checking assembler .cfi pseudo-op support... " >&6; }
-if test "${gcc_cv_as_cfi_pseudo_op+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-    gcc_cv_as_cfi_pseudo_op=unknown
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-asm (".cfi_startproc\n\t.cfi_endproc");
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  gcc_cv_as_cfi_pseudo_op=yes
-else
-  gcc_cv_as_cfi_pseudo_op=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_cfi_pseudo_op" >&5
-$as_echo "$gcc_cv_as_cfi_pseudo_op" >&6; }
- if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then
-
-$as_echo "#define HAVE_AS_CFI_PSEUDO_OP 1" >>confdefs.h
-
- fi
-
-
-if test x$TARGET = xSPARC; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler and linker support unaligned pc related relocs" >&5
-$as_echo_n "checking assembler and linker support unaligned pc related relocs... " >&6; }
-if test "${libffi_cv_as_sparc_ua_pcrel+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-	save_CFLAGS="$CFLAGS"
-	save_LDFLAGS="$LDFLAGS"
-	CFLAGS="$CFLAGS -fpic"
-	LDFLAGS="$LDFLAGS -shared"
-	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  libffi_cv_as_sparc_ua_pcrel=yes
-else
-  libffi_cv_as_sparc_ua_pcrel=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	CFLAGS="$save_CFLAGS"
-	LDFLAGS="$save_LDFLAGS"
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_sparc_ua_pcrel" >&5
-$as_echo "$libffi_cv_as_sparc_ua_pcrel" >&6; }
-    if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then
-
-$as_echo "#define HAVE_AS_SPARC_UA_PCREL 1" >>confdefs.h
-
-    fi
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .register pseudo-op support" >&5
-$as_echo_n "checking assembler .register pseudo-op support... " >&6; }
-if test "${libffi_cv_as_register_pseudo_op+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-       libffi_cv_as_register_pseudo_op=unknown
-       # Check if we have .register
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-asm (".register %g2, #scratch");
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  libffi_cv_as_register_pseudo_op=yes
-else
-  libffi_cv_as_register_pseudo_op=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_register_pseudo_op" >&5
-$as_echo "$libffi_cv_as_register_pseudo_op" >&6; }
-    if test "x$libffi_cv_as_register_pseudo_op" = xyes; then
-
-$as_echo "#define HAVE_AS_REGISTER_PSEUDO_OP 1" >>confdefs.h
-
-    fi
-fi
-
-if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports pc related relocs" >&5
-$as_echo_n "checking assembler supports pc related relocs... " >&6; }
-if test "${libffi_cv_as_x86_pcrel+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-	libffi_cv_as_x86_pcrel=no
-	echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
-	if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then
-	    libffi_cv_as_x86_pcrel=yes
-	fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_pcrel" >&5
-$as_echo "$libffi_cv_as_x86_pcrel" >&6; }
-    if test "x$libffi_cv_as_x86_pcrel" = xyes; then
-
-$as_echo "#define HAVE_AS_X86_PCREL 1" >>confdefs.h
-
-    fi
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .ascii pseudo-op support" >&5
-$as_echo_n "checking assembler .ascii pseudo-op support... " >&6; }
-if test "${libffi_cv_as_ascii_pseudo_op+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-       libffi_cv_as_ascii_pseudo_op=unknown
-       # Check if we have .ascii
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-asm (".ascii \\"string\\"");
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  libffi_cv_as_ascii_pseudo_op=yes
-else
-  libffi_cv_as_ascii_pseudo_op=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_ascii_pseudo_op" >&5
-$as_echo "$libffi_cv_as_ascii_pseudo_op" >&6; }
-    if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then
-
-$as_echo "#define HAVE_AS_ASCII_PSEUDO_OP 1" >>confdefs.h
-
-    fi
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .string pseudo-op support" >&5
-$as_echo_n "checking assembler .string pseudo-op support... " >&6; }
-if test "${libffi_cv_as_string_pseudo_op+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-       libffi_cv_as_string_pseudo_op=unknown
-       # Check if we have .string
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-asm (".string \\"string\\"");
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  libffi_cv_as_string_pseudo_op=yes
-else
-  libffi_cv_as_string_pseudo_op=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_string_pseudo_op" >&5
-$as_echo "$libffi_cv_as_string_pseudo_op" >&6; }
-    if test "x$libffi_cv_as_string_pseudo_op" = xyes; then
-
-$as_echo "#define HAVE_AS_STRING_PSEUDO_OP 1" >>confdefs.h
-
-    fi
-fi
-
-if test x$TARGET = xS390; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler uses zarch features" >&5
-$as_echo_n "checking compiler uses zarch features... " >&6; }
-if test "${libffi_cv_as_s390_zarch+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-	libffi_cv_as_s390_zarch=no
-	echo 'void foo(void) { bar(); bar(); }' > conftest.c
-	if $CC $CFLAGS -S conftest.c > /dev/null 2>&1; then
-	    if grep -q brasl conftest.s; then
-	        libffi_cv_as_s390_zarch=yes
-	    fi
-	fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_s390_zarch" >&5
-$as_echo "$libffi_cv_as_s390_zarch" >&6; }
-    if test "x$libffi_cv_as_s390_zarch" = xyes; then
-
-$as_echo "#define HAVE_AS_S390_ZARCH 1" >>confdefs.h
-
-    fi
-fi
-
-# On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC.
-# Check whether --enable-pax_emutramp was given.
-if test "${enable_pax_emutramp+set}" = set; then :
-  enableval=$enable_pax_emutramp; if test "$enable_pax_emutramp" = "yes"; then
-
-$as_echo "#define FFI_MMAP_EXEC_EMUTRAMP_PAX 1" >>confdefs.h
-
-  fi
-fi
-
-
-FFI_EXEC_TRAMPOLINE_TABLE=0
-case "$target" in
-     *arm*-apple-darwin*)
-       FFI_EXEC_TRAMPOLINE_TABLE=1
-
-$as_echo "#define FFI_EXEC_TRAMPOLINE_TABLE 1" >>confdefs.h
-
-     ;;
-     *-apple-darwin1* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris*)
-
-$as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h
-
-     ;;
-esac
- if test x$FFI_EXEC_TRAMPOLINE_TABLE = x1; then
-  FFI_EXEC_TRAMPOLINE_TABLE_TRUE=
-  FFI_EXEC_TRAMPOLINE_TABLE_FALSE='#'
-else
-  FFI_EXEC_TRAMPOLINE_TABLE_TRUE='#'
-  FFI_EXEC_TRAMPOLINE_TABLE_FALSE=
-fi
-
-
-
-if test x$TARGET = xX86_64; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking toolchain supports unwind section type" >&5
-$as_echo_n "checking toolchain supports unwind section type... " >&6; }
-if test "${libffi_cv_as_x86_64_unwind_section_type+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-        cat  > conftest1.s << EOF
-.text
-.globl foo
-foo:
-jmp bar
-.section .eh_frame,"a",@unwind
-bar:
-EOF
-
-        cat > conftest2.c  << EOF
-extern void foo();
-int main(){foo();}
-EOF
-
-	libffi_cv_as_x86_64_unwind_section_type=no
-	# we ensure that we can compile _and_ link an assembly file containing an @unwind section
-	# since the compiler can support it and not the linker (ie old binutils)
-	if $CC -Wa,--fatal-warnings $CFLAGS -c conftest1.s > /dev/null 2>&1 && \
-           $CC conftest2.c conftest1.o > /dev/null 2>&1 ; then
-	    libffi_cv_as_x86_64_unwind_section_type=yes
-	fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_64_unwind_section_type" >&5
-$as_echo "$libffi_cv_as_x86_64_unwind_section_type" >&6; }
-    if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then
-
-$as_echo "#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1" >>confdefs.h
-
-    fi
-fi
-
-if test "x$GCC" = "xyes"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether .eh_frame section should be read-only" >&5
-$as_echo_n "checking whether .eh_frame section should be read-only... " >&6; }
-if test "${libffi_cv_ro_eh_frame+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  	libffi_cv_ro_eh_frame=no
-  	echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
-  	if $CC $CFLAGS -c -fpic -fexceptions -o conftest.o conftest.c > /dev/null 2>&1; then
-	    objdump -h conftest.o > conftest.dump 2>&1
-	    libffi_eh_frame_line=`grep -n eh_frame conftest.dump | cut -d: -f 1`
-	    if test "x$libffi_eh_frame_line" != "x"; then
-	        libffi_test_line=`expr $libffi_eh_frame_line + 1`p
-	        sed -n $libffi_test_line conftest.dump > conftest.line
-	        if grep READONLY conftest.line > /dev/null; then
-	            libffi_cv_ro_eh_frame=yes
-	        fi
-	    fi
-  	fi
-  	rm -f conftest.*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_ro_eh_frame" >&5
-$as_echo "$libffi_cv_ro_eh_frame" >&6; }
-  if test "x$libffi_cv_ro_eh_frame" = xyes; then
-
-$as_echo "#define HAVE_RO_EH_FRAME 1" >>confdefs.h
-
-
-$as_echo "#define EH_FRAME_FLAGS \"a\"" >>confdefs.h
-
-  else
-
-$as_echo "#define EH_FRAME_FLAGS \"aw\"" >>confdefs.h
-
-  fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__((visibility(\"hidden\")))" >&5
-$as_echo_n "checking for __attribute__((visibility(\"hidden\")))... " >&6; }
-if test "${libffi_cv_hidden_visibility_attribute+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-  	echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1  ; }' > conftest.c
-  	libffi_cv_hidden_visibility_attribute=no
-  	if { ac_try='${CC-cc} -Werror -S conftest.c -o conftest.s 1>&5'
-  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-  	    if grep '\.hidden.*foo' conftest.s >/dev/null; then
-  		libffi_cv_hidden_visibility_attribute=yes
-  	    fi
-  	fi
-  	rm -f conftest.*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_hidden_visibility_attribute" >&5
-$as_echo "$libffi_cv_hidden_visibility_attribute" >&6; }
-  if test $libffi_cv_hidden_visibility_attribute = yes; then
-
-$as_echo "#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1" >>confdefs.h
-
-  fi
-fi
-
-
-
-
-
-
-
-TARGET_OBJ=
-for i in $SOURCES; do
-  TARGET_OBJ="${TARGET_OBJ} src/${TARGETDIR}/"`echo $i | sed 's/[cS]$/lo/'`
-done
-
-
-
-
-
-# Check whether --enable-debug was given.
-if test "${enable_debug+set}" = set; then :
-  enableval=$enable_debug; if test "$enable_debug" = "yes"; then
-
-$as_echo "#define FFI_DEBUG 1" >>confdefs.h
-
-  fi
-fi
-
- if test "$enable_debug" = "yes"; then
-  FFI_DEBUG_TRUE=
-  FFI_DEBUG_FALSE='#'
-else
-  FFI_DEBUG_TRUE='#'
-  FFI_DEBUG_FALSE=
-fi
-
-
-# Check whether --enable-structs was given.
-if test "${enable_structs+set}" = set; then :
-  enableval=$enable_structs; if test "$enable_structs" = "no"; then
-
-$as_echo "#define FFI_NO_STRUCTS 1" >>confdefs.h
-
-  fi
-fi
-
- if test "$enable_debug" = "yes"; then
-  FFI_DEBUG_TRUE=
-  FFI_DEBUG_FALSE='#'
-else
-  FFI_DEBUG_TRUE='#'
-  FFI_DEBUG_FALSE=
-fi
-
-
-# Check whether --enable-raw-api was given.
-if test "${enable_raw_api+set}" = set; then :
-  enableval=$enable_raw_api; if test "$enable_raw_api" = "no"; then
-
-$as_echo "#define FFI_NO_RAW_API 1" >>confdefs.h
-
-  fi
-fi
-
-
-# Check whether --enable-purify-safety was given.
-if test "${enable_purify_safety+set}" = set; then :
-  enableval=$enable_purify_safety; if test "$enable_purify_safety" = "yes"; then
-
-$as_echo "#define USING_PURIFY 1" >>confdefs.h
-
-  fi
-fi
-
-
-if test -n "$with_cross_host" &&
-   test x"$with_cross_host" != x"no"; then
-  toolexecdir='$(exec_prefix)/$(target_alias)'
-  toolexeclibdir='$(toolexecdir)/lib'
-else
-  toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
-  toolexeclibdir='$(libdir)'
-fi
-multi_os_directory=`$CC -print-multi-os-directory`
-case $multi_os_directory in
-  .) ;; # Avoid trailing /.
-  *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
-esac
-
-
-
-if test "${multilib}" = "yes"; then
-  multilib_arg="--enable-multilib"
-else
-  multilib_arg=
-fi
-
-ac_config_commands="$ac_config_commands include"
-
-ac_config_commands="$ac_config_commands src"
-
-
-ac_config_links="$ac_config_links include/ffitarget.h:src/$TARGETDIR/ffitarget.h"
-
-
-ac_config_files="$ac_config_files include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc"
-
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-
-  (set) 2>&1 |
-    case $as_nl`(ac_space=' '; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes: double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \.
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;; #(
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-) |
-  sed '
-     /^ac_cv_env_/b end
-     t clear
-     :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
-  if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
-  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
-  #    will be set to the directory where LIBOBJS objects are built.
-  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
-  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
- if test -n "$EXEEXT"; then
-  am__EXEEXT_TRUE=
-  am__EXEEXT_FALSE='#'
-else
-  am__EXEEXT_TRUE='#'
-  am__EXEEXT_FALSE=
-fi
-
-if test -z "${BUILD_INFO_TRUE}" && test -z "${BUILD_INFO_FALSE}"; then
-  as_fn_error "conditional \"BUILD_INFO\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${GENINSRC_TRUE}" && test -z "${GENINSRC_FALSE}"; then
-  as_fn_error "conditional \"GENINSRC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  as_fn_error "conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  as_fn_error "conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
-  as_fn_error "conditional \"am__fastdepCXX\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then
-  as_fn_error "conditional \"am__fastdepCCAS\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
-  as_fn_error "conditional \"MAINTAINER_MODE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${TESTSUBDIR_TRUE}" && test -z "${TESTSUBDIR_FALSE}"; then
-  as_fn_error "conditional \"TESTSUBDIR\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-if test -z "${FFI_EXEC_TRAMPOLINE_TABLE_TRUE}" && test -z "${FFI_EXEC_TRAMPOLINE_TABLE_FALSE}"; then
-  as_fn_error "conditional \"FFI_EXEC_TRAMPOLINE_TABLE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${FFI_DEBUG_TRUE}" && test -z "${FFI_DEBUG_FALSE}"; then
-  as_fn_error "conditional \"FFI_DEBUG\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${FFI_DEBUG_TRUE}" && test -z "${FFI_DEBUG_FALSE}"; then
-  as_fn_error "conditional \"FFI_DEBUG\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-: ${CONFIG_STATUS=./config.status}
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-as_write_fail=0
-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$?; test $as_status -eq 0 && as_status=1
-  if test "$3"; then
-    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
-  fi
-  $as_echo "$as_me: error: $1" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-## ----------------------------------- ##
-## Main body of $CONFIG_STATUS script. ##
-## ----------------------------------- ##
-_ASEOF
-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# Save the log message, to keep $0 and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.
-ac_log="
-This file was extended by libffi $as_me 3.99999, which was
-generated by GNU Autoconf 2.64.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-case $ac_config_headers in *"
-"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
-esac
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_headers="$ac_config_headers"
-config_links="$ac_config_links"
-config_commands="$ac_config_commands"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
-from templates according to the current configuration.  Unless the files
-and actions are specified as TAGs, all are instantiated by default.
-
-Usage: $0 [OPTION]... [TAG]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number and configuration settings, then exit
-  -q, --quiet, --silent
-                   do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-      --file=FILE[:TEMPLATE]
-                   instantiate the configuration file FILE
-      --header=FILE[:TEMPLATE]
-                   instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration links:
-$config_links
-
-Configuration commands:
-$config_commands
-
-Report bugs to <http://github.com/atgreen/libffi/issues>."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_version="\\
-libffi config.status 3.99999
-configured by $0, generated by GNU Autoconf 2.64,
-  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
-
-Copyright (C) 2009 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-MKDIR_P='$MKDIR_P'
-AWK='$AWK'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  *)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    $as_echo "$ac_cs_version"; exit ;;
-  --debug | --debu | --deb | --de | --d | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    as_fn_append CONFIG_FILES " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --he | --h)
-    # Conflict between --help and --header
-    as_fn_error "ambiguous option: \`$1'
-Try \`$0 --help' for more information.";;
-  --help | --hel | -h )
-    $as_echo "$ac_cs_usage"; exit ;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) as_fn_error "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
-
-  *) as_fn_append ac_config_targets " $1"
-     ac_need_defaults=false ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-  shift
-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
-  CONFIG_SHELL='$SHELL'
-  export CONFIG_SHELL
-  exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-  $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-#
-# INIT-COMMANDS
-#
-
-srcdir="$srcdir"
-host="$host"
-target="$target"
-with_multisubdir="$with_multisubdir"
-with_multisrctop="$with_multisrctop"
-with_target_subdir="$with_target_subdir"
-ac_configure_args="${multilib_arg} ${ac_configure_args}"
-multi_basedir="$multi_basedir"
-CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-CC="$CC"
-CXX="$CXX"
-GFORTRAN="$GFORTRAN"
-GCJ="$GCJ"
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
-enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
-SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
-ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
-host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
-host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
-host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
-build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
-build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
-build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
-SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
-Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
-GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
-EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
-FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
-LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
-NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
-LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
-exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
-AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
-STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
-lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
-CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
-compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
-GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
-objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
-need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
-LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
-libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
-fix_srcfile_path='`$ECHO "$fix_srcfile_path" | $SED "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
-need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
-version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
-install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
-striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
-predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
-postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
-predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
-postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
-LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
-reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
-reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
-GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld_CXX='`$ECHO "$hardcode_libdir_flag_spec_ld_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
-inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
-fix_srcfile_path_CXX='`$ECHO "$fix_srcfile_path_CXX" | $SED "$delay_single_quote_subst"`'
-always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
-include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
-prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
-predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
-postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
-predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
-postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
-
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in SHELL \
-ECHO \
-SED \
-GREP \
-EGREP \
-FGREP \
-LD \
-NM \
-LN_S \
-lt_SP2NL \
-lt_NL2SP \
-reload_flag \
-OBJDUMP \
-deplibs_check_method \
-file_magic_cmd \
-AR \
-AR_FLAGS \
-STRIP \
-RANLIB \
-CC \
-CFLAGS \
-compiler \
-lt_cv_sys_global_symbol_pipe \
-lt_cv_sys_global_symbol_to_cdecl \
-lt_cv_sys_global_symbol_to_c_name_address \
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_wl \
-lt_prog_compiler_pic \
-lt_prog_compiler_static \
-lt_cv_prog_compiler_c_o \
-need_locks \
-DSYMUTIL \
-NMEDIT \
-LIPO \
-OTOOL \
-OTOOL64 \
-shrext_cmds \
-export_dynamic_flag_spec \
-whole_archive_flag_spec \
-compiler_needs_object \
-with_gnu_ld \
-allow_undefined_flag \
-no_undefined_flag \
-hardcode_libdir_flag_spec \
-hardcode_libdir_flag_spec_ld \
-hardcode_libdir_separator \
-fix_srcfile_path \
-exclude_expsyms \
-include_expsyms \
-file_list_spec \
-variables_saved_for_relink \
-libname_spec \
-library_names_spec \
-soname_spec \
-install_override_mode \
-finish_eval \
-old_striplib \
-striplib \
-compiler_lib_search_dirs \
-predep_objects \
-postdep_objects \
-predeps \
-postdeps \
-compiler_lib_search_path \
-LD_CXX \
-reload_flag_CXX \
-compiler_CXX \
-lt_prog_compiler_no_builtin_flag_CXX \
-lt_prog_compiler_wl_CXX \
-lt_prog_compiler_pic_CXX \
-lt_prog_compiler_static_CXX \
-lt_cv_prog_compiler_c_o_CXX \
-export_dynamic_flag_spec_CXX \
-whole_archive_flag_spec_CXX \
-compiler_needs_object_CXX \
-with_gnu_ld_CXX \
-allow_undefined_flag_CXX \
-no_undefined_flag_CXX \
-hardcode_libdir_flag_spec_CXX \
-hardcode_libdir_flag_spec_ld_CXX \
-hardcode_libdir_separator_CXX \
-fix_srcfile_path_CXX \
-exclude_expsyms_CXX \
-include_expsyms_CXX \
-file_list_spec_CXX \
-compiler_lib_search_dirs_CXX \
-predep_objects_CXX \
-postdep_objects_CXX \
-predeps_CXX \
-postdeps_CXX \
-compiler_lib_search_path_CXX; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in reload_cmds \
-old_postinstall_cmds \
-old_postuninstall_cmds \
-old_archive_cmds \
-extract_expsyms_cmds \
-old_archive_from_new_cmds \
-old_archive_from_expsyms_cmds \
-archive_cmds \
-archive_expsym_cmds \
-module_cmds \
-module_expsym_cmds \
-export_symbols_cmds \
-prelink_cmds \
-postinstall_cmds \
-postuninstall_cmds \
-finish_cmds \
-sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec \
-reload_cmds_CXX \
-old_archive_cmds_CXX \
-old_archive_from_new_cmds_CXX \
-old_archive_from_expsyms_cmds_CXX \
-archive_cmds_CXX \
-archive_expsym_cmds_CXX \
-module_cmds_CXX \
-module_expsym_cmds_CXX \
-export_symbols_cmds_CXX \
-prelink_cmds_CXX; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
-
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'
-
-
-
-
-
-TARGETDIR="$TARGETDIR"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
-  case $ac_config_target in
-    "fficonfig.h") CONFIG_HEADERS="$CONFIG_HEADERS fficonfig.h" ;;
-    "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
-    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
-    "include") CONFIG_COMMANDS="$CONFIG_COMMANDS include" ;;
-    "src") CONFIG_COMMANDS="$CONFIG_COMMANDS src" ;;
-    "include/ffitarget.h") CONFIG_LINKS="$CONFIG_LINKS include/ffitarget.h:src/$TARGETDIR/ffitarget.h" ;;
-    "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;;
-    "include/ffi.h") CONFIG_FILES="$CONFIG_FILES include/ffi.h" ;;
-    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-    "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;;
-    "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;;
-    "libffi.pc") CONFIG_FILES="$CONFIG_FILES libffi.pc" ;;
-
-  *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
-  esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-  test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
-  tmp=
-  trap 'exit_status=$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
-' 0
-  trap 'as_fn_exit 1' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./conf$$-$RANDOM
-  (umask 077 && mkdir "$tmp")
-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=`echo X | tr X '\015'`
-# On cygwin, bash can eat \r inside `` if the user requested igncr.
-# But we know of no other shell where ac_cr would be empty at this
-# point, so we can use a bashism as a fallback.
-if test "x$ac_cr" = x; then
-  eval ac_cr=\$\'\\r\'
-fi
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-  ac_cs_awk_cr='\r'
-else
-  ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
-_ACEOF
-
-
-{
-  echo "cat >conf$$subs.awk <<_ACEOF" &&
-  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
-  echo "_ACEOF"
-} >conf$$subs.sh ||
-  as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  . ./conf$$subs.sh ||
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-
-  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
-  if test $ac_delim_n = $ac_delim_num; then
-    break
-  elif $ac_last_try; then
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\).*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\).*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
-  N
-  s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
-  for (key in S) S_is_set[key] = 1
-  FS = ""
-
-}
-{
-  line = $ 0
-  nfields = split(line, field, "@")
-  substed = 0
-  len = length(field[1])
-  for (i = 2; i < nfields; i++) {
-    key = field[i]
-    keylen = length(key)
-    if (S_is_set[key]) {
-      value = S[key]
-      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
-      len += length(value) + length(field[++i])
-      substed = 1
-    } else
-      len += 1 + keylen
-  }
-
-  print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
-  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
-  cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
-  || as_fn_error "could not setup config files machinery" "$LINENO" 5
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/
-s/:*\${srcdir}:*/:/
-s/:*@srcdir@:*/:/
-s/^\([^=]*=[	 ]*\):*/\1/
-s/:*$//
-s/^[^=]*=[	 ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-# Set up the scripts for CONFIG_HEADERS section.
-# No need to generate them if there are no CONFIG_HEADERS.
-# This happens for instance with `./config.status Makefile'.
-if test -n "$CONFIG_HEADERS"; then
-cat >"$tmp/defines.awk" <<\_ACAWK ||
-BEGIN {
-_ACEOF
-
-# Transform confdefs.h into an awk script `defines.awk', embedded as
-# here-document in config.status, that substitutes the proper values into
-# config.h.in to produce config.h.
-
-# Create a delimiter string that does not exist in confdefs.h, to ease
-# handling of long lines.
-ac_delim='%!_!# '
-for ac_last_try in false false :; do
-  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
-  if test -z "$ac_t"; then
-    break
-  elif $ac_last_try; then
-    as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-
-# For the awk script, D is an array of macro values keyed by name,
-# likewise P contains macro parameters if any.  Preserve backslash
-# newline sequences.
-
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-sed -n '
-s/.\{148\}/&'"$ac_delim"'/g
-t rset
-:rset
-s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
-t def
-d
-:def
-s/\\$//
-t bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3"/p
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
-d
-:bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3\\\\\\n"\\/p
-t cont
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
-t cont
-d
-:cont
-n
-s/.\{148\}/&'"$ac_delim"'/g
-t clear
-:clear
-s/\\$//
-t bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/"/p
-d
-:bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
-b cont
-' <confdefs.h | sed '
-s/'"$ac_delim"'/"\\\
-"/g' >>$CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  for (key in D) D_is_set[key] = 1
-  FS = ""
-}
-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
-  line = \$ 0
-  split(line, arg, " ")
-  if (arg[1] == "#") {
-    defundef = arg[2]
-    mac1 = arg[3]
-  } else {
-    defundef = substr(arg[1], 2)
-    mac1 = arg[2]
-  }
-  split(mac1, mac2, "(") #)
-  macro = mac2[1]
-  prefix = substr(line, 1, index(line, defundef) - 1)
-  if (D_is_set[macro]) {
-    # Preserve the white space surrounding the "#".
-    print prefix "define", macro P[macro] D[macro]
-    next
-  } else {
-    # Replace #undef with comments.  This is necessary, for example,
-    # in the case of _POSIX_SOURCE, which is predefined and required
-    # on some systems where configure will not decide to define it.
-    if (defundef == "undef") {
-      print "/*", prefix defundef, macro, "*/"
-      next
-    }
-  }
-}
-{ print }
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-  as_fn_error "could not setup config headers machinery" "$LINENO" 5
-fi # test -n "$CONFIG_HEADERS"
-
-
-eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS  :L $CONFIG_LINKS  :C $CONFIG_COMMANDS"
-shift
-for ac_tag
-do
-  case $ac_tag in
-  :[FHLC]) ac_mode=$ac_tag; continue;;
-  esac
-  case $ac_mode$ac_tag in
-  :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
-  :[FH]-) ac_tag=-:-;;
-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-  esac
-  ac_save_IFS=$IFS
-  IFS=:
-  set x $ac_tag
-  IFS=$ac_save_IFS
-  shift
-  ac_file=$1
-  shift
-
-  case $ac_mode in
-  :L) ac_source=$1;;
-  :[FH])
-    ac_file_inputs=
-    for ac_f
-    do
-      case $ac_f in
-      -) ac_f="$tmp/stdin";;
-      *) # Look for the file first in the build tree, then in the source tree
-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
-	 # because $ac_f cannot contain `:'.
-	 test -f "$ac_f" ||
-	   case $ac_f in
-	   [\\/$]*) false;;
-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
-	   esac ||
-	   as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
-      esac
-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
-      as_fn_append ac_file_inputs " '$ac_f'"
-    done
-
-    # Let's still pretend it is `configure' which instantiates (i.e., don't
-    # use $as_me), people would be surprised to read:
-    #    /* config.h.  Generated by config.status.  */
-    configure_input='Generated from '`
-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
-	`' by configure.'
-    if test x"$ac_file" != x-; then
-      configure_input="$ac_file.  $configure_input"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
-    fi
-    # Neutralize special characters interpreted by sed in replacement strings.
-    case $configure_input in #(
-    *\&* | *\|* | *\\* )
-       ac_sed_conf_input=`$as_echo "$configure_input" |
-       sed 's/[\\\\&|]/\\\\&/g'`;; #(
-    *) ac_sed_conf_input=$configure_input;;
-    esac
-
-    case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin" \
-      || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
-    esac
-    ;;
-  esac
-
-  ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  as_dir="$ac_dir"; as_fn_mkdir_p
-  ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-  case $ac_mode in
-  :F)
-  #
-  # CONFIG_FILE
-  #
-
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
-  esac
-  ac_MKDIR_P=$MKDIR_P
-  case $MKDIR_P in
-  [\\/$]* | ?:[\\/]* ) ;;
-  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
-  esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-ac_sed_dataroot='
-/datarootdir/ {
-  p
-  q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  ac_datarootdir_hack='
-  s&@datadir@&$datadir&g
-  s&@docdir@&$docdir&g
-  s&@infodir@&$infodir&g
-  s&@localedir@&$localedir&g
-  s&@mandir@&$mandir&g
-  s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-s&@MKDIR_P@&$ac_MKDIR_P&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&2;}
-
-  rm -f "$tmp/stdin"
-  case $ac_file in
-  -) cat "$tmp/out" && rm -f "$tmp/out";;
-  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
-  esac \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
- ;;
-  :H)
-  #
-  # CONFIG_HEADER
-  #
-  if test x"$ac_file" != x-; then
-    {
-      $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
-    } >"$tmp/config.h" \
-      || as_fn_error "could not create $ac_file" "$LINENO" 5
-    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      rm -f "$ac_file"
-      mv "$tmp/config.h" "$ac_file" \
-	|| as_fn_error "could not create $ac_file" "$LINENO" 5
-    fi
-  else
-    $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
-      || as_fn_error "could not create -" "$LINENO" 5
-  fi
-# Compute "$ac_file"'s index in $config_headers.
-_am_arg="$ac_file"
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
-$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$_am_arg" : 'X\(//\)[^/]' \| \
-	 X"$_am_arg" : 'X\(//\)$' \| \
-	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$_am_arg" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`/stamp-h$_am_stamp_count
- ;;
-  :L)
-  #
-  # CONFIG_LINK
-  #
-
-  if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then
-    :
-  else
-    # Prefer the file from the source tree if names are identical.
-    if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then
-      ac_source=$srcdir/$ac_source
-    fi
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5
-$as_echo "$as_me: linking $ac_source to $ac_file" >&6;}
-
-    if test ! -r "$ac_source"; then
-      as_fn_error "$ac_source: file not found" "$LINENO" 5
-    fi
-    rm -f "$ac_file"
-
-    # Try a relative symlink, then a hard link, then a copy.
-    case $srcdir in
-    [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;;
-	*) ac_rel_source=$ac_top_build_prefix$ac_source ;;
-    esac
-    ln -s "$ac_rel_source" "$ac_file" 2>/dev/null ||
-      ln "$ac_source" "$ac_file" 2>/dev/null ||
-      cp -p "$ac_source" "$ac_file" ||
-      as_fn_error "cannot link or copy $ac_source to $ac_file" "$LINENO" 5
-  fi
- ;;
-  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
- ;;
-  esac
-
-
-  case $ac_file$ac_mode in
-    "default-1":C)
-# Only add multilib support code if we just rebuilt the top-level
-# Makefile.
-case " $CONFIG_FILES " in
- *" Makefile "*)
-   ac_file=Makefile . ${multi_basedir}/config-ml.in
-   ;;
-esac ;;
-    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      as_dir=$dirpart/$fdir; as_fn_mkdir_p
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
- ;;
-    "libtool":C)
-
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
-# The names of the tagged configurations supported by this script.
-available_tags="CXX "
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Which release of libtool.m4 was used?
-macro_version=$macro_version
-macro_revision=$macro_revision
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# What type of objects to build.
-pic_mode=$pic_mode
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# An echo program that protects backslashes.
-ECHO=$lt_ECHO
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="\$SED -e 1s/^X//"
-
-# A grep program that handles long lines.
-GREP=$lt_GREP
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# A literal string matcher.
-FGREP=$lt_FGREP
-
-# A BSD- or MS-compatible name lister.
-NM=$lt_NM
-
-# Whether we need soft or hard links.
-LN_S=$lt_LN_S
-
-# What is the maximum length of a command?
-max_cmd_len=$max_cmd_len
-
-# Object file suffix (normally "o").
-objext=$ac_objext
-
-# Executable file suffix (normally "").
-exeext=$exeext
-
-# whether the shell understands "unset".
-lt_unset=$lt_unset
-
-# turn spaces into newlines.
-SP2NL=$lt_lt_SP2NL
-
-# turn newlines into spaces.
-NL2SP=$lt_lt_NL2SP
-
-# An object symbol dumper.
-OBJDUMP=$lt_OBJDUMP
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == "file_magic".
-file_magic_cmd=$lt_file_magic_cmd
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# A symbol stripping program.
-STRIP=$lt_STRIP
-
-# Commands used to install an old-style archive.
-RANLIB=$lt_RANLIB
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Whether to use a lock for old archive extraction.
-lock_old_archive_extraction=$lock_old_archive_extraction
-
-# A C compiler.
-LTCC=$lt_CC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_CFLAGS
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration.
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair.
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# Transform the output of nm in a C name address pair when lib prefix is needed.
-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# Used to examine libraries when file_magic_cmd begins with "file".
-MAGIC_CMD=$MAGIC_CMD
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
-DSYMUTIL=$lt_DSYMUTIL
-
-# Tool to change global to local symbols on Mac OS X.
-NMEDIT=$lt_NMEDIT
-
-# Tool to manipulate fat objects and archives on Mac OS X.
-LIPO=$lt_LIPO
-
-# ldd/readelf like tool for Mach-O binaries on Mac OS X.
-OTOOL=$lt_OTOOL
-
-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
-OTOOL64=$lt_OTOOL64
-
-# Old archive suffix (normally "a").
-libext=$libext
-
-# Shared library suffix (normally ".so").
-shrext_cmds=$lt_shrext_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at link time.
-variables_saved_for_relink=$lt_variables_saved_for_relink
-
-# Do we need the "lib" prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Library versioning type.
-version_type=$version_type
-
-# Shared library runtime path variable.
-runpath_var=$runpath_var
-
-# Shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Permission mode override for installation of shared libraries.
-install_override_mode=$lt_install_override_mode
-
-# Command to use after installation of a shared archive.
-postinstall_cmds=$lt_postinstall_cmds
-
-# Command to use after uninstallation of a shared archive.
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# As "finish_cmds", except a single script fragment to be evaled but
-# not shown.
-finish_eval=$lt_finish_eval
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Compile-time system search path for libraries.
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds
-
-# A language specific compiler.
-CC=$lt_compiler
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects
-postdep_objects=$lt_postdep_objects
-predeps=$lt_predeps
-postdeps=$lt_postdeps
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path
-
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $* ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-}
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[^=]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "${1}" | $SED "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "${1}" | $SED "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$@"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1+=\$2"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1=\$$1\$2"
-}
-
-_LT_EOF
-    ;;
-  esac
-
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-
-
-    cat <<_LT_EOF >> "$ofile"
-
-# ### BEGIN LIBTOOL TAG CONFIG: CXX
-
-# The linker used to build libraries.
-LD=$lt_LD_CXX
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag_CXX
-reload_cmds=$lt_reload_cmds_CXX
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds_CXX
-
-# A language specific compiler.
-CC=$lt_compiler_CXX
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC_CXX
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_CXX
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_CXX
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_CXX
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_CXX
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object_CXX
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds_CXX
-archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds_CXX
-module_expsym_cmds=$lt_module_expsym_cmds_CXX
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld_CXX
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_CXX
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_CXX
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
-
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct_CXX
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute_CXX
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L_CXX
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic_CXX
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath_CXX
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_CXX
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path_CXX
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols_CXX
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_CXX
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_CXX
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_CXX
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds_CXX
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec_CXX
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_CXX
-
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects_CXX
-postdep_objects=$lt_postdep_objects_CXX
-predeps=$lt_predeps_CXX
-postdeps=$lt_postdeps_CXX
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
-
-# ### END LIBTOOL TAG CONFIG: CXX
-_LT_EOF
-
- ;;
-    "include":C) test -d include || mkdir include ;;
-    "src":C)
-test -d src || mkdir src
-test -d src/$TARGETDIR || mkdir src/$TARGETDIR
- ;;
-
-  esac
-done # for ac_tag
-
-
-as_fn_exit 0
-_ACEOF
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
-  as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || as_fn_exit $?
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
diff --git a/third_party/gofrontend/libffi/configure.ac b/third_party/gofrontend/libffi/configure.ac
deleted file mode 100644
index 07ec10d..0000000
--- a/third_party/gofrontend/libffi/configure.ac
+++ /dev/null
@@ -1,392 +0,0 @@
-dnl Process this with autoconf to create configure
-
-AC_PREREQ(2.64)
-
-AC_INIT([libffi], [3.99999], [http://github.com/atgreen/libffi/issues])
-AC_CONFIG_HEADERS([fficonfig.h])
-
-AM_ENABLE_MULTILIB(, ..)
-
-AC_CANONICAL_SYSTEM
-target_alias=${target_alias-$host_alias}
-
-AM_INIT_AUTOMAKE([no-dist])
-
-# See if makeinfo has been installed and is modern enough
-# that we can use it.
-ACX_CHECK_PROG_VER([MAKEINFO], [makeinfo], [--version],
-                   [GNU texinfo.* \([0-9][0-9.]*\)],
-                   [4.[4-9]*|4.[1-9][0-9]*|[5-9]*|[1-9][0-9]*])
-AM_CONDITIONAL(BUILD_INFO, test $gcc_cv_prog_makeinfo_modern = "yes")
-
-# We would like our source tree to be readonly. However when releases or
-# pre-releases are generated, the flex/bison generated files as well as the
-# various formats of manuals need to be included along with the rest of the
-# sources.  Therefore we have --enable-generated-files-in-srcdir to do
-# just that.
-AC_MSG_CHECKING(generated-files-in-srcdir)
-AC_ARG_ENABLE(generated-files-in-srcdir,
-AS_HELP_STRING([--enable-generated-files-in-srcdir],
- [put copies of generated files in source dir intended for creating source tarballs for users without texinfo bison or flex]),
-[case "$enableval" in
- yes) enable_generated_files_in_srcdir=yes ;;
- no)  enable_generated_files_in_srcdir=no ;;
- *)   AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
- esac],
-[enable_generated_files_in_srcdir=no])
-AC_MSG_RESULT($enable_generated_files_in_srcdir)
-AM_CONDITIONAL(GENINSRC, test "$enable_generated_files_in_srcdir" = yes)
-
-# The same as in boehm-gc and libstdc++. Have to borrow it from there.
-# We must force CC to /not/ be precious variables; otherwise
-# the wrong, non-multilib-adjusted value will be used in multilibs.
-# As a side effect, we have to subst CFLAGS ourselves.
-# Also save and restore CFLAGS, since AC_PROG_CC will come up with
-# defaults of its own if none are provided.
-
-m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS])
-m4_define([_AC_ARG_VAR_PRECIOUS],[])
-save_CFLAGS=$CFLAGS
-AC_PROG_CC
-AC_PROG_CXX
-CFLAGS=$save_CFLAGS
-m4_undefine([_AC_ARG_VAR_PRECIOUS])
-m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
-
-AC_SUBST(CFLAGS)
-
-AM_PROG_AS
-AM_PROG_CC_C_O
-AC_PROG_LIBTOOL
-
-# Test for 64-bit build.
-AC_CHECK_SIZEOF([size_t])
-
-AM_MAINTAINER_MODE
-
-AC_CHECK_HEADERS(sys/mman.h)
-AC_CHECK_FUNCS([mmap mkostemp])
-AC_FUNC_MMAP_BLACKLIST
-
-dnl The -no-testsuite modules omit the test subdir.
-AM_CONDITIONAL(TESTSUBDIR, test -d $srcdir/testsuite)
-
-TARGETDIR="unknown"
-HAVE_LONG_DOUBLE_VARIANT=0
-
-. ${srcdir}/configure.host
-
-if test -n "${UNSUPPORTED}"; then
-  AC_MSG_ERROR(["libffi has not been ported to $host."])
-fi
-
-AC_SUBST(AM_RUNTESTFLAGS)
-AC_SUBST(AM_LTLDFLAGS)
-
-AC_HEADER_STDC
-AC_CHECK_FUNCS(memcpy)
-AC_FUNC_ALLOCA
-
-AC_CHECK_SIZEOF(double)
-AC_CHECK_SIZEOF(long double)
-
-# Also AC_SUBST this variable for ffi.h.
-if test -z "$HAVE_LONG_DOUBLE"; then
-  HAVE_LONG_DOUBLE=0
-  if test $ac_cv_sizeof_long_double != 0; then
-    if test $HAVE_LONG_DOUBLE_VARIANT != 0; then
-      AC_DEFINE(HAVE_LONG_DOUBLE_VARIANT, 1, [Define if you support more than one size of the long double type])
-      HAVE_LONG_DOUBLE=1
-    else
-      if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then
-        HAVE_LONG_DOUBLE=1
-        AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the long double type and it is bigger than a double])
-      fi
-    fi
-  fi
-fi
-AC_SUBST(HAVE_LONG_DOUBLE)
-AC_SUBST(HAVE_LONG_DOUBLE_VARIANT)
-
-AC_C_BIGENDIAN
-
-GCC_AS_CFI_PSEUDO_OP
-
-if test x$TARGET = xSPARC; then
-    AC_CACHE_CHECK([assembler and linker support unaligned pc related relocs],
-	libffi_cv_as_sparc_ua_pcrel, [
-	save_CFLAGS="$CFLAGS"
-	save_LDFLAGS="$LDFLAGS"
-	CFLAGS="$CFLAGS -fpic"
-	LDFLAGS="$LDFLAGS -shared"
-	AC_TRY_LINK([asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");],,
-		    [libffi_cv_as_sparc_ua_pcrel=yes],
-		    [libffi_cv_as_sparc_ua_pcrel=no])
-	CFLAGS="$save_CFLAGS"
-	LDFLAGS="$save_LDFLAGS"])
-    if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then
-	AC_DEFINE(HAVE_AS_SPARC_UA_PCREL, 1,
-		  [Define if your assembler and linker support unaligned PC relative relocs.])
-    fi
-
-    AC_CACHE_CHECK([assembler .register pseudo-op support],
-       libffi_cv_as_register_pseudo_op, [
-       libffi_cv_as_register_pseudo_op=unknown
-       # Check if we have .register
-       AC_TRY_COMPILE(,[asm (".register %g2, #scratch");],
-		       [libffi_cv_as_register_pseudo_op=yes],
-		       [libffi_cv_as_register_pseudo_op=no])
-    ])
-    if test "x$libffi_cv_as_register_pseudo_op" = xyes; then
-       AC_DEFINE(HAVE_AS_REGISTER_PSEUDO_OP, 1,
-	       [Define if your assembler supports .register.])
-    fi
-fi
-
-if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then
-    AC_CACHE_CHECK([assembler supports pc related relocs],
-	libffi_cv_as_x86_pcrel, [
-	libffi_cv_as_x86_pcrel=no
-	echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
-	if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then
-	    libffi_cv_as_x86_pcrel=yes
-	fi
-	])
-    if test "x$libffi_cv_as_x86_pcrel" = xyes; then
-	AC_DEFINE(HAVE_AS_X86_PCREL, 1,
-		  [Define if your assembler supports PC relative relocs.])
-    fi
-
-    AC_CACHE_CHECK([assembler .ascii pseudo-op support],
-       libffi_cv_as_ascii_pseudo_op, [
-       libffi_cv_as_ascii_pseudo_op=unknown
-       # Check if we have .ascii
-       AC_TRY_COMPILE(,[asm (".ascii \\"string\\"");],
-		       [libffi_cv_as_ascii_pseudo_op=yes],
-		       [libffi_cv_as_ascii_pseudo_op=no])
-    ])
-    if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then
-       AC_DEFINE(HAVE_AS_ASCII_PSEUDO_OP, 1,
-	       [Define if your assembler supports .ascii.])
-    fi
-
-    AC_CACHE_CHECK([assembler .string pseudo-op support],
-       libffi_cv_as_string_pseudo_op, [
-       libffi_cv_as_string_pseudo_op=unknown
-       # Check if we have .string
-       AC_TRY_COMPILE(,[asm (".string \\"string\\"");],
-		       [libffi_cv_as_string_pseudo_op=yes],
-		       [libffi_cv_as_string_pseudo_op=no])
-    ])
-    if test "x$libffi_cv_as_string_pseudo_op" = xyes; then
-       AC_DEFINE(HAVE_AS_STRING_PSEUDO_OP, 1,
-	       [Define if your assembler supports .string.])
-    fi
-fi
-
-if test x$TARGET = xS390; then
-    AC_CACHE_CHECK([compiler uses zarch features],
-	libffi_cv_as_s390_zarch, [
-	libffi_cv_as_s390_zarch=no
-	echo 'void foo(void) { bar(); bar(); }' > conftest.c
-	if $CC $CFLAGS -S conftest.c > /dev/null 2>&1; then
-	    if grep -q brasl conftest.s; then
-	        libffi_cv_as_s390_zarch=yes
-	    fi
-	fi
-	])
-    if test "x$libffi_cv_as_s390_zarch" = xyes; then
-	AC_DEFINE(HAVE_AS_S390_ZARCH, 1,
-		  [Define if the compiler uses zarch features.])
-    fi
-fi
-
-# On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC.
-AC_ARG_ENABLE(pax_emutramp,
-  [  --enable-pax_emutramp       enable pax emulated trampolines, for we can't use PROT_EXEC],
-  if test "$enable_pax_emutramp" = "yes"; then
-    AC_DEFINE(FFI_MMAP_EXEC_EMUTRAMP_PAX, 1,
-      [Define this if you want to enable pax emulated trampolines])
-  fi)
-
-FFI_EXEC_TRAMPOLINE_TABLE=0
-case "$target" in
-     *arm*-apple-darwin*)
-       FFI_EXEC_TRAMPOLINE_TABLE=1
-       AC_DEFINE(FFI_EXEC_TRAMPOLINE_TABLE, 1,
-                 [Cannot use PROT_EXEC on this target, so, we revert to
-                   alternative means])
-     ;;
-     *-apple-darwin1* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris*)
-       AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1,
-                 [Cannot use malloc on this target, so, we revert to
-                   alternative means])
-     ;;
-esac
-AM_CONDITIONAL(FFI_EXEC_TRAMPOLINE_TABLE, test x$FFI_EXEC_TRAMPOLINE_TABLE = x1)
-AC_SUBST(FFI_EXEC_TRAMPOLINE_TABLE)
-
-if test x$TARGET = xX86_64; then
-    AC_CACHE_CHECK([toolchain supports unwind section type],
-	libffi_cv_as_x86_64_unwind_section_type, [
-        cat  > conftest1.s << EOF
-.text
-.globl foo
-foo:
-jmp bar
-.section .eh_frame,"a",@unwind
-bar:
-EOF
-
-        cat > conftest2.c  << EOF
-extern void foo();
-int main(){foo();}
-EOF
-
-	libffi_cv_as_x86_64_unwind_section_type=no
-	# we ensure that we can compile _and_ link an assembly file containing an @unwind section
-	# since the compiler can support it and not the linker (ie old binutils)
-	if $CC -Wa,--fatal-warnings $CFLAGS -c conftest1.s > /dev/null 2>&1 && \
-           $CC conftest2.c conftest1.o > /dev/null 2>&1 ; then
-	    libffi_cv_as_x86_64_unwind_section_type=yes
-	fi
-	])
-    if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then
-	AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1,
-		  [Define if your assembler supports unwind section type.])
-    fi
-fi
-
-if test "x$GCC" = "xyes"; then
-  AC_CACHE_CHECK([whether .eh_frame section should be read-only],
-      libffi_cv_ro_eh_frame, [
-  	libffi_cv_ro_eh_frame=no
-  	echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
-  	if $CC $CFLAGS -c -fpic -fexceptions -o conftest.o conftest.c > /dev/null 2>&1; then
-	    objdump -h conftest.o > conftest.dump 2>&1
-	    libffi_eh_frame_line=`grep -n eh_frame conftest.dump | cut -d: -f 1`
-	    if test "x$libffi_eh_frame_line" != "x"; then
-	        libffi_test_line=`expr $libffi_eh_frame_line + 1`p
-	        sed -n $libffi_test_line conftest.dump > conftest.line
-	        if grep READONLY conftest.line > /dev/null; then
-	            libffi_cv_ro_eh_frame=yes
-	        fi
-	    fi
-  	fi
-  	rm -f conftest.*
-      ])
-  if test "x$libffi_cv_ro_eh_frame" = xyes; then
-      AC_DEFINE(HAVE_RO_EH_FRAME, 1,
-  	      [Define if .eh_frame sections should be read-only.])
-      AC_DEFINE(EH_FRAME_FLAGS, "a",
-  	      [Define to the flags needed for the .section .eh_frame directive.  ])
-  else
-      AC_DEFINE(EH_FRAME_FLAGS, "aw",
-  	      [Define to the flags needed for the .section .eh_frame directive.  ])
-  fi
-
-  AC_CACHE_CHECK([for __attribute__((visibility("hidden")))],
-      libffi_cv_hidden_visibility_attribute, [
-  	echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1  ; }' > conftest.c
-  	libffi_cv_hidden_visibility_attribute=no
-  	if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then
-  	    if grep '\.hidden.*foo' conftest.s >/dev/null; then
-  		libffi_cv_hidden_visibility_attribute=yes
-  	    fi
-  	fi
-  	rm -f conftest.*
-      ])
-  if test $libffi_cv_hidden_visibility_attribute = yes; then
-      AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1,
-  	      [Define if __attribute__((visibility("hidden"))) is supported.])
-  fi
-fi
-
-AH_BOTTOM([
-#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
-#ifdef LIBFFI_ASM
-#define FFI_HIDDEN(name) .hidden name
-#else
-#define FFI_HIDDEN __attribute__ ((visibility ("hidden")))
-#endif
-#else
-#ifdef LIBFFI_ASM
-#define FFI_HIDDEN(name)
-#else
-#define FFI_HIDDEN
-#endif
-#endif
-])
-
-AC_SUBST(TARGET)
-AC_SUBST(TARGETDIR)
-
-changequote(<,>)
-TARGET_OBJ=
-for i in $SOURCES; do
-  TARGET_OBJ="${TARGET_OBJ} src/${TARGETDIR}/"`echo $i | sed 's/[cS]$/lo/'`
-done
-changequote([,])
-AC_SUBST(TARGET_OBJ)
-
-AC_SUBST(SHELL)
-
-AC_ARG_ENABLE(debug,
-[  --enable-debug          debugging mode],
-  if test "$enable_debug" = "yes"; then
-    AC_DEFINE(FFI_DEBUG, 1, [Define this if you want extra debugging.])
-  fi)
-AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes")
-
-AC_ARG_ENABLE(structs,
-[  --disable-structs       omit code for struct support],
-  if test "$enable_structs" = "no"; then
-    AC_DEFINE(FFI_NO_STRUCTS, 1, [Define this if you do not want support for aggregate types.])
-  fi)
-AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes")
-
-AC_ARG_ENABLE(raw-api,
-[  --disable-raw-api       make the raw api unavailable],
-  if test "$enable_raw_api" = "no"; then
-    AC_DEFINE(FFI_NO_RAW_API, 1, [Define this if you do not want support for the raw API.])
-  fi)
-
-AC_ARG_ENABLE(purify-safety,
-[  --enable-purify-safety  purify-safe mode],
-  if test "$enable_purify_safety" = "yes"; then
-    AC_DEFINE(USING_PURIFY, 1, [Define this if you are using Purify and want to suppress spurious messages.])
-  fi)
-
-if test -n "$with_cross_host" &&
-   test x"$with_cross_host" != x"no"; then
-  toolexecdir='$(exec_prefix)/$(target_alias)'
-  toolexeclibdir='$(toolexecdir)/lib'
-else
-  toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
-  toolexeclibdir='$(libdir)'
-fi
-multi_os_directory=`$CC -print-multi-os-directory`
-case $multi_os_directory in
-  .) ;; # Avoid trailing /.
-  *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
-esac
-AC_SUBST(toolexecdir)
-AC_SUBST(toolexeclibdir)
-
-if test "${multilib}" = "yes"; then
-  multilib_arg="--enable-multilib"
-else
-  multilib_arg=
-fi
-
-AC_CONFIG_COMMANDS(include, [test -d include || mkdir include])
-AC_CONFIG_COMMANDS(src, [
-test -d src || mkdir src
-test -d src/$TARGETDIR || mkdir src/$TARGETDIR
-], [TARGETDIR="$TARGETDIR"])
-
-AC_CONFIG_LINKS(include/ffitarget.h:src/$TARGETDIR/ffitarget.h)
-
-AC_CONFIG_FILES(include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc)
-
-AC_OUTPUT
diff --git a/third_party/gofrontend/libffi/configure.host b/third_party/gofrontend/libffi/configure.host
deleted file mode 100644
index 90de638..0000000
--- a/third_party/gofrontend/libffi/configure.host
+++ /dev/null
@@ -1,265 +0,0 @@
-# configure.host
-#
-# This shell script handles all host based configuration for libffi.
-#
-
-# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
-# Most of the time we can define all the variables all at once...
-case "${host}" in
-  aarch64*-*-*)
-	TARGET=AARCH64; TARGETDIR=aarch64
-	SOURCES="ffi.c sysv.S"
-	;;
-
-  alpha*-*-*)
-	TARGET=ALPHA; TARGETDIR=alpha;
-	# Support 128-bit long double, changeable via command-line switch.
-	HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)'
-	SOURCES="ffi.c osf.S"
-	;;
-
-  arc*-*-*)
-	TARGET=ARC; TARGETDIR=arc
-	SOURCES="ffi.c arcompact.S"
-	;;
-
-  arm*-*-*)
-	TARGET=ARM; TARGETDIR=arm
-	SOURCES="ffi.c sysv.S"
-	;;
-
-  avr32*-*-*)
-	TARGET=AVR32; TARGETDIR=avr32
-	SOURCES="ffi.c sysv.S"
-	;;
-
-  bfin*)
-	TARGET=BFIN; TARGETDIR=bfin
-	SOURCES="ffi.c sysv.S"
-	;;
-
-  cris-*-*)
-	TARGET=LIBFFI_CRIS; TARGETDIR=cris
-	SOURCES="ffi.c sysv.S"
-	;;
-
-  frv-*-*)
-	TARGET=FRV; TARGETDIR=frv
-	SOURCES="ffi.c eabi.S"
-	;;
-
-  hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*)
-	TARGET=PA_LINUX; TARGETDIR=pa
-	SOURCES="ffi.c linux.S"
-	;;
-  hppa*64-*-hpux*)
-	TARGET=PA64_HPUX; TARGETDIR=pa
-	;;
-  hppa*-*-hpux*)
-	TARGET=PA_HPUX; TARGETDIR=pa
-	SOURCES="ffi.c hpux32.S"
-	;;
-
-  i?86-*-freebsd* | i?86-*-openbsd*)
-	TARGET=X86_FREEBSD; TARGETDIR=x86
-	;;
-
-  i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix* \
-  | x86_64-*-cygwin* | x86_64-*-mingw*)
-	TARGETDIR=x86
-	if test $ac_cv_sizeof_size_t = 4; then
-	  TARGET=X86_WIN32
-	else
-	  TARGET=X86_WIN64
-	fi
-	# All mingw/cygwin/win32 builds require -no-undefined for sharedlib.
-	# We must also check with_cross_host to decide if this is a native
-	# or cross-build and select where to install dlls appropriately.
-	if test -n "$with_cross_host" &&
-	   test x"$with_cross_host" != x"no"; then
-	  AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"';
-	else
-	  AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"';
-	fi
-	;;
-
-  i?86-*-darwin* | x86_64-*-darwin*)
-	TARGETDIR=x86
-	if test $ac_cv_sizeof_size_t = 4; then
-	  TARGET=X86_DARWIN
-	else
-	  TARGET=X86_64_DARWIN
-	fi
-	;;
-
-  i?86-*-* | x86_64-*-* | amd64-*)
-	TARGETDIR=x86
-	if test $ac_cv_sizeof_size_t = 4; then
-	  case "$host" in
-	    *-gnux32)
-	      TARGET=X86_64
-	      ;;
-	    *)
-	      TARGET=X86
-	      ;;
-          esac
-	else
-	  TARGET=X86_64;
-	fi
-	;;
-
-  ia64*-*-*)
-	TARGET=IA64; TARGETDIR=ia64
-	SOURCES="ffi.c unix.S"
-	;;
-
-  m32r*-*-*)
-	TARGET=M32R; TARGETDIR=m32r
-	SOURCES="ffi.c sysv.S"
-	;;
-
-  m68k-*-*)
-	TARGET=M68K; TARGETDIR=m68k
-	SOURCES="ffi.c sysv.S"
-	;;
-
-  m88k-*-*)
-	TARGET=M88K; TARGETDIR=m88k
-	SOURCES="ffi.c obsd.S"
-	;;
-
-  microblaze*-*-*)
-	TARGET=MICROBLAZE; TARGETDIR=microblaze
-	SOURCES="ffi.c sysv.S"
-	;;
-
-  moxie-*-*)
-	TARGET=MOXIE; TARGETDIR=moxie
-	SOURCES="ffi.c eabi.S"
-	;;
-
-  metag-*-*)
-	TARGET=METAG; TARGETDIR=metag
-	SOURCES="ffi.c sysv.S"
-	;;
-
-  mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*)
-	TARGET=MIPS; TARGETDIR=mips
-	;;
-  mips*-*linux* | mips*-*-openbsd*)
-	# Support 128-bit long double for NewABI.
-	HAVE_LONG_DOUBLE='defined(__mips64)'
-	TARGET=MIPS; TARGETDIR=mips
-	;;
-
-  nios2*-linux*)
-	TARGET=NIOS2; TARGETDIR=nios2
-	SOURCES="ffi.c sysv.S"
-	;;
-
-  or1k*-linux*)
-	TARGET=OR1K; TARGETDIR=or1k
-	SOURCES="ffi.c sysv.S"
-	;;
-
-  powerpc*-*-linux* | powerpc-*-sysv*)
-	TARGET=POWERPC; TARGETDIR=powerpc
-	HAVE_LONG_DOUBLE_VARIANT=1
-	;;
-  powerpc-*-amigaos*)
-	TARGET=POWERPC; TARGETDIR=powerpc
-	;;
-  powerpc-*-beos*)
-	TARGET=POWERPC; TARGETDIR=powerpc
-	;;
-  powerpc-*-darwin* | powerpc64-*-darwin*)
-	TARGET=POWERPC_DARWIN; TARGETDIR=powerpc
-	;;
-  powerpc-*-aix* | rs6000-*-aix*)
-	TARGET=POWERPC_AIX; TARGETDIR=powerpc
-	;;
-  powerpc-*-freebsd* | powerpc-*-openbsd*)
-	TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc
-	HAVE_LONG_DOUBLE_VARIANT=1
-	;;
-  powerpc64-*-freebsd*)
-	TARGET=POWERPC; TARGETDIR=powerpc
-	;;
-  powerpc*-*-rtems*)
-	TARGET=POWERPC; TARGETDIR=powerpc
-	;;
-
-  s390-*-* | s390x-*-*)
-	TARGET=S390; TARGETDIR=s390
-	SOURCES="ffi.c sysv.S"
-	;;
-
-  sh-*-* | sh[[34]]*-*-*)
-	TARGET=SH; TARGETDIR=sh
-	SOURCES="ffi.c sysv.S"
-	;;
-  sh64-*-* | sh5*-*-*)
-	TARGET=SH64; TARGETDIR=sh64
-	SOURCES="ffi.c sysv.S"
-	;;
-
-  sparc*-*-*)
-	TARGET=SPARC; TARGETDIR=sparc
-	SOURCES="ffi.c ffi64.c v8.S v9.S"
-	;;
-
-  tile*-*)
-        TARGET=TILE; TARGETDIR=tile
-	SOURCES="ffi.c tile.S"
-        ;;
-
-  vax-*-*)
-	TARGET=VAX; TARGETDIR=vax
-	SOURCES="ffi.c elfbsd.S"
-	;;
-
-  xtensa*-*)
-	TARGET=XTENSA; TARGETDIR=xtensa
-	SOURCES="ffi.c sysv.S"
-	;;
-esac
-
-# ... but some of the cases above share configury.
-case "${TARGET}" in
-  MIPS)
-	SOURCES="ffi.c o32.S n32.S"
-	;;
-  POWERPC)
-	SOURCES="ffi.c ffi_sysv.c ffi_linux64.c sysv.S ppc_closure.S"
-	SOURCES="${SOURCES} linux64.S linux64_closure.S"
-	;;
-  POWERPC_AIX)
-	SOURCES="ffi_darwin.c aix.S aix_closure.S"
-	;;
-  POWERPC_DARWIN)
-	SOURCES="ffi_darwin.c darwin.S darwin_closure.S"
-	;;
-  POWERPC_FREEBSD)
-	SOURCES="ffi.c ffi_sysv.c sysv.S ppc_closure.S"
-	;;
-  X86 | X86_FREEBSD | X86_WIN32)
-	SOURCES="ffi.c sysv.S"
-	;;
-  X86_64)
-	SOURCES="ffi64.c unix64.S"
-	;;
-  X86_WIN64)
-	SOURCES="ffiw64.c win64.S"
-	;;
-  X86_DARWIN)
-	SOURCES="darwin_c.c darwin.S"
-	;;
-  X86_64_DARWIN)
-	SOURCES="darwin64_c.c darwin64.S"
-	;;
-esac
-
-# If we failed to configure SOURCES, we can't do anything.
-if test -z "${SOURCES}"; then
-  UNSUPPORTED=1
-fi
diff --git a/third_party/gofrontend/libffi/doc/libffi.texi b/third_party/gofrontend/libffi/doc/libffi.texi
deleted file mode 100644
index e69de29..0000000
--- a/third_party/gofrontend/libffi/doc/libffi.texi
+++ /dev/null
diff --git a/third_party/gofrontend/libffi/doc/version.texi b/third_party/gofrontend/libffi/doc/version.texi
deleted file mode 100644
index ccef70f..0000000
--- a/third_party/gofrontend/libffi/doc/version.texi
+++ /dev/null
@@ -1,4 +0,0 @@
-@set UPDATED 8 November 2014
-@set UPDATED-MONTH November 2014
-@set EDITION 3.2.1
-@set VERSION 3.2.1
diff --git a/third_party/gofrontend/libffi/fficonfig.h.in b/third_party/gofrontend/libffi/fficonfig.h.in
deleted file mode 100644
index f245ce0..0000000
--- a/third_party/gofrontend/libffi/fficonfig.h.in
+++ /dev/null
@@ -1,211 +0,0 @@
-/* fficonfig.h.in.  Generated from configure.ac by autoheader.  */
-
-/* Define if building universal (internal helper macro) */
-#undef AC_APPLE_UNIVERSAL_BUILD
-
-/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
-   systems. This function is required for `alloca.c' support on those systems.
-   */
-#undef CRAY_STACKSEG_END
-
-/* Define to 1 if using `alloca.c'. */
-#undef C_ALLOCA
-
-/* Define to the flags needed for the .section .eh_frame directive. */
-#undef EH_FRAME_FLAGS
-
-/* Define this if you want extra debugging. */
-#undef FFI_DEBUG
-
-/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */
-#undef FFI_EXEC_TRAMPOLINE_TABLE
-
-/* Define this if you want to enable pax emulated trampolines */
-#undef FFI_MMAP_EXEC_EMUTRAMP_PAX
-
-/* Cannot use malloc on this target, so, we revert to alternative means */
-#undef FFI_MMAP_EXEC_WRIT
-
-/* Define this if you do not want support for the raw API. */
-#undef FFI_NO_RAW_API
-
-/* Define this if you do not want support for aggregate types. */
-#undef FFI_NO_STRUCTS
-
-/* Define to 1 if you have `alloca', as a function or macro. */
-#undef HAVE_ALLOCA
-
-/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
-   */
-#undef HAVE_ALLOCA_H
-
-/* Define if your assembler supports .ascii. */
-#undef HAVE_AS_ASCII_PSEUDO_OP
-
-/* Define if your assembler supports .cfi_* directives. */
-#undef HAVE_AS_CFI_PSEUDO_OP
-
-/* Define if your assembler supports .register. */
-#undef HAVE_AS_REGISTER_PSEUDO_OP
-
-/* Define if the compiler uses zarch features. */
-#undef HAVE_AS_S390_ZARCH
-
-/* Define if your assembler and linker support unaligned PC relative relocs.
-   */
-#undef HAVE_AS_SPARC_UA_PCREL
-
-/* Define if your assembler supports .string. */
-#undef HAVE_AS_STRING_PSEUDO_OP
-
-/* Define if your assembler supports unwind section type. */
-#undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE
-
-/* Define if your assembler supports PC relative relocs. */
-#undef HAVE_AS_X86_PCREL
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define if __attribute__((visibility("hidden"))) is supported. */
-#undef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define if you have the long double type and it is bigger than a double */
-#undef HAVE_LONG_DOUBLE
-
-/* Define if you support more than one size of the long double type */
-#undef HAVE_LONG_DOUBLE_VARIANT
-
-/* Define to 1 if you have the `memcpy' function. */
-#undef HAVE_MEMCPY
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the `mkostemp' function. */
-#undef HAVE_MKOSTEMP
-
-/* Define to 1 if you have the `mmap' function. */
-#undef HAVE_MMAP
-
-/* Define if mmap with MAP_ANON(YMOUS) works. */
-#undef HAVE_MMAP_ANON
-
-/* Define if mmap of /dev/zero works. */
-#undef HAVE_MMAP_DEV_ZERO
-
-/* Define if read-only mmap of a plain file works. */
-#undef HAVE_MMAP_FILE
-
-/* Define if .eh_frame sections should be read-only. */
-#undef HAVE_RO_EH_FRAME
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the <sys/mman.h> header file. */
-#undef HAVE_SYS_MMAN_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#undef LT_OBJDIR
-
-/* Define to 1 if your C compiler doesn't accept -c and -o together. */
-#undef NO_MINUS_C_MINUS_O
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* The size of `double', as computed by sizeof. */
-#undef SIZEOF_DOUBLE
-
-/* The size of `long double', as computed by sizeof. */
-#undef SIZEOF_LONG_DOUBLE
-
-/* The size of `size_t', as computed by sizeof. */
-#undef SIZEOF_SIZE_T
-
-/* If using the C implementation of alloca, define if you know the
-   direction of stack growth for your system; otherwise it will be
-   automatically deduced at runtime.
-	STACK_DIRECTION > 0 => grows toward higher addresses
-	STACK_DIRECTION < 0 => grows toward lower addresses
-	STACK_DIRECTION = 0 => direction of growth unknown */
-#undef STACK_DIRECTION
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define this if you are using Purify and want to suppress spurious messages.
-   */
-#undef USING_PURIFY
-
-/* Version number of package */
-#undef VERSION
-
-/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
-   significant byte first (like Motorola and SPARC, unlike Intel). */
-#if defined AC_APPLE_UNIVERSAL_BUILD
-# if defined __BIG_ENDIAN__
-#  define WORDS_BIGENDIAN 1
-# endif
-#else
-# ifndef WORDS_BIGENDIAN
-#  undef WORDS_BIGENDIAN
-# endif
-#endif
-
-
-#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
-#ifdef LIBFFI_ASM
-#define FFI_HIDDEN(name) .hidden name
-#else
-#define FFI_HIDDEN __attribute__ ((visibility ("hidden")))
-#endif
-#else
-#ifdef LIBFFI_ASM
-#define FFI_HIDDEN(name)
-#else
-#define FFI_HIDDEN
-#endif
-#endif
-
diff --git a/third_party/gofrontend/libffi/generate-darwin-source-and-headers.py b/third_party/gofrontend/libffi/generate-darwin-source-and-headers.py
deleted file mode 100644
index 306136f..0000000
--- a/third_party/gofrontend/libffi/generate-darwin-source-and-headers.py
+++ /dev/null
@@ -1,209 +0,0 @@
-#!/usr/bin/env python
-import subprocess
-import os
-import errno
-import collections
-import glob
-import argparse
-
-class Platform(object):
-    pass
-
-class simulator_platform(Platform):
-    directory = 'darwin_ios'
-    sdk = 'iphonesimulator'
-    arch = 'i386'
-    triple = 'i386-apple-darwin11'
-    version_min = '-miphoneos-version-min=7.0'
-
-    prefix = "#ifdef __i386__\n\n"
-    suffix = "\n\n#endif"
-    src_dir = 'x86'
-    src_files = ['darwin.S', 'win32.S', 'ffi.c']
-
-
-class simulator64_platform(Platform):
-    directory = 'darwin_ios'
-    sdk = 'iphonesimulator'
-    arch = 'x86_64'
-    triple = 'x86_64-apple-darwin13'
-    version_min = '-miphoneos-version-min=7.0'
-
-    prefix = "#ifdef __x86_64__\n\n"
-    suffix = "\n\n#endif"
-    src_dir = 'x86'
-    src_files = ['darwin64.S', 'ffi64.c']
-
-
-class device_platform(Platform):
-    directory = 'darwin_ios'
-    sdk = 'iphoneos'
-    arch = 'armv7'
-    triple = 'arm-apple-darwin11'
-    version_min = '-miphoneos-version-min=7.0'
-
-    prefix = "#ifdef __arm__\n\n"
-    suffix = "\n\n#endif"
-    src_dir = 'arm'
-    src_files = ['sysv.S', 'trampoline.S', 'ffi.c']
-
-
-class device64_platform(Platform):
-    directory = 'darwin_ios'
-    sdk = 'iphoneos'
-    arch = 'arm64'
-    triple = 'aarch64-apple-darwin13'
-    version_min = '-miphoneos-version-min=7.0'
-
-    prefix = "#ifdef __arm64__\n\n"
-    suffix = "\n\n#endif"
-    src_dir = 'aarch64'
-    src_files = ['sysv.S', 'ffi.c']
-
-
-class desktop32_platform(Platform):
-    directory = 'darwin_osx'
-    sdk = 'macosx'
-    arch = 'i386'
-    triple = 'i386-apple-darwin10'
-    version_min = '-mmacosx-version-min=10.6'
-    src_dir = 'x86'
-    src_files = ['darwin.S', 'win32.S', 'ffi.c']
-
-    prefix = "#ifdef __i386__\n\n"
-    suffix = "\n\n#endif"
-
-
-class desktop64_platform(Platform):
-    directory = 'darwin_osx'
-    sdk = 'macosx'
-    arch = 'x86_64'
-    triple = 'x86_64-apple-darwin10'
-    version_min = '-mmacosx-version-min=10.6'
-
-    prefix = "#ifdef __x86_64__\n\n"
-    suffix = "\n\n#endif"
-    src_dir = 'x86'
-    src_files = ['darwin64.S', 'ffi64.c']
-
-
-def mkdir_p(path):
-    try:
-        os.makedirs(path)
-    except OSError as exc:  # Python >2.5
-        if exc.errno == errno.EEXIST:
-            pass
-        else:
-            raise
-
-
-def move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''):
-    mkdir_p(dst_dir)
-    out_filename = filename
-
-    if file_suffix:
-        split_name = os.path.splitext(filename)
-        out_filename = "%s_%s%s" % (split_name[0], file_suffix, split_name[1])
-
-    with open(os.path.join(src_dir, filename)) as in_file:
-        with open(os.path.join(dst_dir, out_filename), 'w') as out_file:
-            if prefix:
-                out_file.write(prefix)
-
-            out_file.write(in_file.read())
-
-            if suffix:
-                out_file.write(suffix)
-
-
-def list_files(src_dir, pattern=None, filelist=None):
-    if pattern: filelist = glob.iglob(os.path.join(src_dir, pattern))
-    for file in filelist:
-        yield os.path.basename(file)
-
-
-def copy_files(src_dir, dst_dir, pattern=None, filelist=None, file_suffix=None, prefix=None, suffix=None):
-    for filename in list_files(src_dir, pattern=pattern, filelist=filelist):
-        move_file(src_dir, dst_dir, filename, file_suffix=file_suffix, prefix=prefix, suffix=suffix)
-
-
-def copy_src_platform_files(platform):
-    src_dir = os.path.join('src', platform.src_dir)
-    dst_dir = os.path.join(platform.directory, 'src', platform.src_dir)
-    copy_files(src_dir, dst_dir, filelist=platform.src_files, file_suffix=platform.arch, prefix=platform.prefix, suffix=platform.suffix)
-
-
-def build_target(platform, platform_headers):
-    def xcrun_cmd(cmd):
-        return 'xcrun -sdk %s %s -arch %s' % (platform.sdk, cmd, platform.arch)
-
-    tag='%s-%s' % (platform.sdk, platform.arch)
-    build_dir = 'build_%s' % tag
-    mkdir_p(build_dir)
-    env = dict(CC=xcrun_cmd('clang'),
-               LD=xcrun_cmd('ld'),
-               CFLAGS='%s' % (platform.version_min))
-    working_dir = os.getcwd()
-    try:
-        os.chdir(build_dir)
-        subprocess.check_call(['../configure', '-host', platform.triple], env=env)
-    finally:
-        os.chdir(working_dir)
-
-    for src_dir in [build_dir, os.path.join(build_dir, 'include')]:
-        copy_files(src_dir,
-                   os.path.join(platform.directory, 'include'),
-                   pattern='*.h',
-                   file_suffix=platform.arch,
-                   prefix=platform.prefix,
-                   suffix=platform.suffix)
-
-        for filename in list_files(src_dir, pattern='*.h'):
-            platform_headers[filename].add((platform.prefix, platform.arch, platform.suffix))
-
-
-def make_tramp():
-    with open('src/arm/trampoline.S', 'w') as tramp_out:
-        p = subprocess.Popen(['bash', 'src/arm/gentramp.sh'], stdout=tramp_out)
-        p.wait()
-
-
-def generate_source_and_headers(generate_osx=True, generate_ios=True):
-    copy_files('src', 'darwin_common/src', pattern='*.c')
-    copy_files('include', 'darwin_common/include', pattern='*.h')
-
-    if generate_ios:
-        make_tramp()
-        copy_src_platform_files(simulator_platform)
-        copy_src_platform_files(simulator64_platform)
-        copy_src_platform_files(device_platform)
-        copy_src_platform_files(device64_platform)
-    if generate_osx:
-        copy_src_platform_files(desktop32_platform)
-        copy_src_platform_files(desktop64_platform)
-
-    platform_headers = collections.defaultdict(set)
-
-    if generate_ios:
-        build_target(simulator_platform, platform_headers)
-        build_target(simulator64_platform, platform_headers)
-        build_target(device_platform, platform_headers)
-        build_target(device64_platform, platform_headers)
-    if generate_osx:
-        build_target(desktop32_platform, platform_headers)
-        build_target(desktop64_platform, platform_headers)
-
-    mkdir_p('darwin_common/include')
-    for header_name, tag_tuples in platform_headers.iteritems():
-        basename, suffix = os.path.splitext(header_name)
-        with open(os.path.join('darwin_common/include', header_name), 'w') as header:
-            for tag_tuple in tag_tuples:
-                header.write('%s#include <%s_%s%s>\n%s\n' % (tag_tuple[0], basename, tag_tuple[1], suffix, tag_tuple[2]))
-
-if __name__ == '__main__':
-    parser = argparse.ArgumentParser()
-    parser.add_argument('--only-ios', action='store_true', default=False)
-    parser.add_argument('--only-osx', action='store_true', default=False)
-    args = parser.parse_args()
-
-    generate_source_and_headers(generate_osx=not args.only_ios, generate_ios=not args.only_osx)
diff --git a/third_party/gofrontend/libffi/include/Makefile.am b/third_party/gofrontend/libffi/include/Makefile.am
deleted file mode 100644
index 79f222c..0000000
--- a/third_party/gofrontend/libffi/include/Makefile.am
+++ /dev/null
@@ -1,13 +0,0 @@
-## Process this with automake to create Makefile.in
-
-AUTOMAKE_OPTIONS=foreign
-
-DISTCLEANFILES=ffitarget.h
-noinst_HEADERS=ffi_common.h ffi_cfi.h
-EXTRA_DIST=ffi.h.in
-
-# Where generated headers like ffitarget.h get installed.
-gcc_version   := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
-toollibffidir := $(libdir)/gcc/$(target_alias)/$(gcc_version)/include
-
-toollibffi_HEADERS = ffi.h ffitarget.h
diff --git a/third_party/gofrontend/libffi/include/Makefile.in b/third_party/gofrontend/libffi/include/Makefile.in
deleted file mode 100644
index d8d17f1..0000000
--- a/third_party/gofrontend/libffi/include/Makefile.in
+++ /dev/null
@@ -1,458 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-target_triplet = @target@
-subdir = include
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
-	$(srcdir)/ffi.h.in $(noinst_HEADERS) $(toollibffi_HEADERS)
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
-	$(top_srcdir)/../config/asmcfi.m4 \
-	$(top_srcdir)/../config/depstand.m4 \
-	$(top_srcdir)/../config/lead-dot.m4 \
-	$(top_srcdir)/../config/multi.m4 \
-	$(top_srcdir)/../config/override.m4 \
-	$(top_srcdir)/../libtool.m4 $(top_srcdir)/../ltoptions.m4 \
-	$(top_srcdir)/../ltsugar.m4 $(top_srcdir)/../ltversion.m4 \
-	$(top_srcdir)/../lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/fficonfig.h
-CONFIG_CLEAN_FILES = ffi.h ffitarget.h
-CONFIG_CLEAN_VPATH_FILES =
-SOURCES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__installdirs = "$(DESTDIR)$(toollibffidir)"
-HEADERS = $(noinst_HEADERS) $(toollibffi_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
-AMTAR = @AMTAR@
-AM_LTLDFLAGS = @AM_LTLDFLAGS@
-AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCAS = @CCAS@
-CCASDEPMODE = @CCASDEPMODE@
-CCASFLAGS = @CCASFLAGS@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
-FGREP = @FGREP@
-GREP = @GREP@
-HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
-HAVE_LONG_DOUBLE_VARIANT = @HAVE_LONG_DOUBLE_VARIANT@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TARGET = @TARGET@
-TARGETDIR = @TARGETDIR@
-TARGET_OBJ = @TARGET_OBJ@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-multi_basedir = @multi_basedir@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target = @target@
-target_alias = @target_alias@
-target_cpu = @target_cpu@
-target_os = @target_os@
-target_vendor = @target_vendor@
-toolexecdir = @toolexecdir@
-toolexeclibdir = @toolexeclibdir@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AUTOMAKE_OPTIONS = foreign
-DISTCLEANFILES = ffitarget.h
-noinst_HEADERS = ffi_common.h ffi_cfi.h
-EXTRA_DIST = ffi.h.in
-
-# Where generated headers like ffitarget.h get installed.
-gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER)
-toollibffidir := $(libdir)/gcc/$(target_alias)/$(gcc_version)/include
-toollibffi_HEADERS = ffi.h ffitarget.h
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign include/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-ffi.h: $(top_builddir)/config.status $(srcdir)/ffi.h.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-toollibffiHEADERS: $(toollibffi_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(toollibffidir)" || $(MKDIR_P) "$(DESTDIR)$(toollibffidir)"
-	@list='$(toollibffi_HEADERS)'; test -n "$(toollibffidir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(toollibffidir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(toollibffidir)" || exit $$?; \
-	done
-
-uninstall-toollibffiHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toollibffi_HEADERS)'; test -n "$(toollibffidir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(toollibffidir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(toollibffidir)" && rm -f $$files
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(toollibffidir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-toollibffiHEADERS
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-toollibffiHEADERS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags dvi dvi-am html html-am info \
-	info-am install install-am install-data install-data-am \
-	install-dvi install-dvi-am install-exec install-exec-am \
-	install-html install-html-am install-info install-info-am \
-	install-man install-pdf install-pdf-am install-ps \
-	install-ps-am install-strip install-toollibffiHEADERS \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
-	uninstall-am uninstall-toollibffiHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/gofrontend/libffi/include/ffi.h.in b/third_party/gofrontend/libffi/include/ffi.h.in
deleted file mode 100644
index c43d52f..0000000
--- a/third_party/gofrontend/libffi/include/ffi.h.in
+++ /dev/null
@@ -1,503 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   libffi @VERSION@ - Copyright (c) 2011, 2014 Anthony Green
-                    - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
-
-   Permission is hereby granted, free of charge, to any person
-   obtaining a copy of this software and associated documentation
-   files (the ``Software''), to deal in the Software without
-   restriction, including without limitation the rights to use, copy,
-   modify, merge, publish, distribute, sublicense, and/or sell copies
-   of the Software, and to permit persons to whom the Software is
-   furnished to do so, subject to the following conditions:
-
-   The above copyright notice and this permission notice shall be
-   included in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-/* -------------------------------------------------------------------
-   The basic API is described in the README file.
-
-   The raw API is designed to bypass some of the argument packing
-   and unpacking on architectures for which it can be avoided.
-
-   The closure API allows interpreted functions to be packaged up
-   inside a C function pointer, so that they can be called as C functions,
-   with no understanding on the client side that they are interpreted.
-   It can also be used in other cases in which it is necessary to package
-   up a user specified parameter and a function pointer as a single
-   function pointer.
-
-   The closure API must be implemented in order to get its functionality,
-   e.g. for use by gij.  Routines are provided to emulate the raw API
-   if the underlying platform doesn't allow faster implementation.
-
-   More details on the raw and cloure API can be found in:
-
-   http://gcc.gnu.org/ml/java/1999-q3/msg00138.html
-
-   and
-
-   http://gcc.gnu.org/ml/java/1999-q3/msg00174.html
-   -------------------------------------------------------------------- */
-
-#ifndef LIBFFI_H
-#define LIBFFI_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Specify which architecture libffi is configured for. */
-#ifndef @TARGET@
-#define @TARGET@
-#endif
-
-/* ---- System configuration information --------------------------------- */
-
-#include <ffitarget.h>
-
-#ifndef LIBFFI_ASM
-
-#if defined(_MSC_VER) && !defined(__clang__)
-#define __attribute__(X)
-#endif
-
-#include <stddef.h>
-#include <limits.h>
-
-/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example).
-   But we can find it either under the correct ANSI name, or under GNU
-   C's internal name.  */
-
-#define FFI_64_BIT_MAX 9223372036854775807
-
-#ifdef LONG_LONG_MAX
-# define FFI_LONG_LONG_MAX LONG_LONG_MAX
-#else
-# ifdef LLONG_MAX
-#  define FFI_LONG_LONG_MAX LLONG_MAX
-#  ifdef _AIX52 /* or newer has C99 LLONG_MAX */
-#   undef FFI_64_BIT_MAX
-#   define FFI_64_BIT_MAX 9223372036854775807LL
-#  endif /* _AIX52 or newer */
-# else
-#  ifdef __GNUC__
-#   define FFI_LONG_LONG_MAX __LONG_LONG_MAX__
-#  endif
-#  ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */
-#   ifndef __PPC64__
-#    if defined (__IBMC__) || defined (__IBMCPP__)
-#     define FFI_LONG_LONG_MAX LONGLONG_MAX
-#    endif
-#   endif /* __PPC64__ */
-#   undef  FFI_64_BIT_MAX
-#   define FFI_64_BIT_MAX 9223372036854775807LL
-#  endif
-# endif
-#endif
-
-/* The closure code assumes that this works on pointers, i.e. a size_t	*/
-/* can hold a pointer.							*/
-
-typedef struct _ffi_type
-{
-  size_t size;
-  unsigned short alignment;
-  unsigned short type;
-  struct _ffi_type **elements;
-} ffi_type;
-
-#ifndef LIBFFI_HIDE_BASIC_TYPES
-#if SCHAR_MAX == 127
-# define ffi_type_uchar                ffi_type_uint8
-# define ffi_type_schar                ffi_type_sint8
-#else
- #error "char size not supported"
-#endif
-
-#if SHRT_MAX == 32767
-# define ffi_type_ushort       ffi_type_uint16
-# define ffi_type_sshort       ffi_type_sint16
-#elif SHRT_MAX == 2147483647
-# define ffi_type_ushort       ffi_type_uint32
-# define ffi_type_sshort       ffi_type_sint32
-#else
- #error "short size not supported"
-#endif
-
-#if INT_MAX == 32767
-# define ffi_type_uint         ffi_type_uint16
-# define ffi_type_sint         ffi_type_sint16
-#elif INT_MAX == 2147483647
-# define ffi_type_uint         ffi_type_uint32
-# define ffi_type_sint         ffi_type_sint32
-#elif INT_MAX == 9223372036854775807
-# define ffi_type_uint         ffi_type_uint64
-# define ffi_type_sint         ffi_type_sint64
-#else
- #error "int size not supported"
-#endif
-
-#if LONG_MAX == 2147483647
-# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX
- #error "no 64-bit data type supported"
-# endif
-#elif LONG_MAX != FFI_64_BIT_MAX
- #error "long size not supported"
-#endif
-
-#if LONG_MAX == 2147483647
-# define ffi_type_ulong        ffi_type_uint32
-# define ffi_type_slong        ffi_type_sint32
-#elif LONG_MAX == FFI_64_BIT_MAX
-# define ffi_type_ulong        ffi_type_uint64
-# define ffi_type_slong        ffi_type_sint64
-#else
- #error "long size not supported"
-#endif
-
-/* Need minimal decorations for DLLs to works on Windows. */
-/* GCC has autoimport and autoexport.  Rely on Libtool to */
-/* help MSVC export from a DLL, but always declare data   */
-/* to be imported for MSVC clients.  This costs an extra  */
-/* indirection for MSVC clients using the static version  */
-/* of the library, but don't worry about that.  Besides,  */
-/* as a workaround, they can define FFI_BUILDING if they  */
-/* *know* they are going to link with the static library. */
-#if defined _MSC_VER && !defined FFI_BUILDING
-#define FFI_EXTERN extern __declspec(dllimport)
-#else
-#define FFI_EXTERN extern
-#endif
-
-/* These are defined in types.c */
-FFI_EXTERN ffi_type ffi_type_void;
-FFI_EXTERN ffi_type ffi_type_uint8;
-FFI_EXTERN ffi_type ffi_type_sint8;
-FFI_EXTERN ffi_type ffi_type_uint16;
-FFI_EXTERN ffi_type ffi_type_sint16;
-FFI_EXTERN ffi_type ffi_type_uint32;
-FFI_EXTERN ffi_type ffi_type_sint32;
-FFI_EXTERN ffi_type ffi_type_uint64;
-FFI_EXTERN ffi_type ffi_type_sint64;
-FFI_EXTERN ffi_type ffi_type_float;
-FFI_EXTERN ffi_type ffi_type_double;
-FFI_EXTERN ffi_type ffi_type_pointer;
-
-#if @HAVE_LONG_DOUBLE@
-FFI_EXTERN ffi_type ffi_type_longdouble;
-#else
-#define ffi_type_longdouble ffi_type_double
-#endif
-
-#ifdef FFI_TARGET_HAS_COMPLEX_TYPE
-FFI_EXTERN ffi_type ffi_type_complex_float;
-FFI_EXTERN ffi_type ffi_type_complex_double;
-#if @HAVE_LONG_DOUBLE@
-FFI_EXTERN ffi_type ffi_type_complex_longdouble;
-#else
-#define ffi_type_complex_longdouble ffi_type_complex_double
-#endif
-#endif
-#endif /* LIBFFI_HIDE_BASIC_TYPES */
-
-typedef enum {
-  FFI_OK = 0,
-  FFI_BAD_TYPEDEF,
-  FFI_BAD_ABI
-} ffi_status;
-
-typedef unsigned FFI_TYPE;
-
-typedef struct {
-  ffi_abi abi;
-  unsigned nargs;
-  ffi_type **arg_types;
-  ffi_type *rtype;
-  unsigned bytes;
-  unsigned flags;
-#ifdef FFI_EXTRA_CIF_FIELDS
-  FFI_EXTRA_CIF_FIELDS;
-#endif
-} ffi_cif;
-
-#if @HAVE_LONG_DOUBLE_VARIANT@
-/* Used to adjust size/alignment of ffi types.  */
-void ffi_prep_types (ffi_abi abi);
-#endif
-
-/* Used internally, but overridden by some architectures */
-ffi_status ffi_prep_cif_core(ffi_cif *cif,
-			     ffi_abi abi,
-			     unsigned int isvariadic,
-			     unsigned int nfixedargs,
-			     unsigned int ntotalargs,
-			     ffi_type *rtype,
-			     ffi_type **atypes);
-
-/* ---- Definitions for the raw API -------------------------------------- */
-
-#ifndef FFI_SIZEOF_ARG
-# if LONG_MAX == 2147483647
-#  define FFI_SIZEOF_ARG        4
-# elif LONG_MAX == FFI_64_BIT_MAX
-#  define FFI_SIZEOF_ARG        8
-# endif
-#endif
-
-#ifndef FFI_SIZEOF_JAVA_RAW
-#  define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG
-#endif
-
-typedef union {
-  ffi_sarg  sint;
-  ffi_arg   uint;
-  float	    flt;
-  char      data[FFI_SIZEOF_ARG];
-  void*     ptr;
-} ffi_raw;
-
-#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8
-/* This is a special case for mips64/n32 ABI (and perhaps others) where
-   sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8.  */
-typedef union {
-  signed int	sint;
-  unsigned int	uint;
-  float		flt;
-  char		data[FFI_SIZEOF_JAVA_RAW];
-  void*		ptr;
-} ffi_java_raw;
-#else
-typedef ffi_raw ffi_java_raw;
-#endif
-
-
-void ffi_raw_call (ffi_cif *cif,
-		   void (*fn)(void),
-		   void *rvalue,
-		   ffi_raw *avalue);
-
-void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw);
-void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args);
-size_t ffi_raw_size (ffi_cif *cif);
-
-/* This is analogous to the raw API, except it uses Java parameter	*/
-/* packing, even on 64-bit machines.  I.e. on 64-bit machines		*/
-/* longs and doubles are followed by an empty 64-bit word.		*/
-
-void ffi_java_raw_call (ffi_cif *cif,
-			void (*fn)(void),
-			void *rvalue,
-			ffi_java_raw *avalue);
-
-void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw);
-void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args);
-size_t ffi_java_raw_size (ffi_cif *cif);
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#if FFI_CLOSURES
-
-#ifdef _MSC_VER
-__declspec(align(8))
-#endif
-typedef struct {
-#if @FFI_EXEC_TRAMPOLINE_TABLE@
-  void *trampoline_table;
-  void *trampoline_table_entry;
-#else
-  char tramp[FFI_TRAMPOLINE_SIZE];
-#endif
-  ffi_cif   *cif;
-  void     (*fun)(ffi_cif*,void*,void**,void*);
-  void      *user_data;
-#ifdef __GNUC__
-} ffi_closure __attribute__((aligned (8)));
-#else
-} ffi_closure;
-# ifdef __sgi
-#  pragma pack 0
-# endif
-#endif
-
-void *ffi_closure_alloc (size_t size, void **code);
-void ffi_closure_free (void *);
-
-ffi_status
-ffi_prep_closure (ffi_closure*,
-		  ffi_cif *,
-		  void (*fun)(ffi_cif*,void*,void**,void*),
-		  void *user_data);
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure*,
-		      ffi_cif *,
-		      void (*fun)(ffi_cif*,void*,void**,void*),
-		      void *user_data,
-		      void*codeloc);
-
-#ifdef __sgi
-# pragma pack 8
-#endif
-typedef struct {
-#if @FFI_EXEC_TRAMPOLINE_TABLE@
-  void *trampoline_table;
-  void *trampoline_table_entry;
-#else
-  char tramp[FFI_TRAMPOLINE_SIZE];
-#endif
-  ffi_cif   *cif;
-
-#if !FFI_NATIVE_RAW_API
-
-  /* if this is enabled, then a raw closure has the same layout 
-     as a regular closure.  We use this to install an intermediate 
-     handler to do the transaltion, void** -> ffi_raw*. */
-
-  void     (*translate_args)(ffi_cif*,void*,void**,void*);
-  void      *this_closure;
-
-#endif
-
-  void     (*fun)(ffi_cif*,void*,ffi_raw*,void*);
-  void      *user_data;
-
-} ffi_raw_closure;
-
-typedef struct {
-#if @FFI_EXEC_TRAMPOLINE_TABLE@
-  void *trampoline_table;
-  void *trampoline_table_entry;
-#else
-  char tramp[FFI_TRAMPOLINE_SIZE];
-#endif
-
-  ffi_cif   *cif;
-
-#if !FFI_NATIVE_RAW_API
-
-  /* if this is enabled, then a raw closure has the same layout 
-     as a regular closure.  We use this to install an intermediate 
-     handler to do the transaltion, void** -> ffi_raw*. */
-
-  void     (*translate_args)(ffi_cif*,void*,void**,void*);
-  void      *this_closure;
-
-#endif
-
-  void     (*fun)(ffi_cif*,void*,ffi_java_raw*,void*);
-  void      *user_data;
-
-} ffi_java_raw_closure;
-
-ffi_status
-ffi_prep_raw_closure (ffi_raw_closure*,
-		      ffi_cif *cif,
-		      void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
-		      void *user_data);
-
-ffi_status
-ffi_prep_raw_closure_loc (ffi_raw_closure*,
-			  ffi_cif *cif,
-			  void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
-			  void *user_data,
-			  void *codeloc);
-
-ffi_status
-ffi_prep_java_raw_closure (ffi_java_raw_closure*,
-		           ffi_cif *cif,
-		           void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
-		           void *user_data);
-
-ffi_status
-ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*,
-			       ffi_cif *cif,
-			       void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
-			       void *user_data,
-			       void *codeloc);
-
-#endif /* FFI_CLOSURES */
-
-#if FFI_GO_CLOSURES
-
-typedef struct {
-  void      *tramp;
-  ffi_cif   *cif;
-  void     (*fun)(ffi_cif*,void*,void**,void*);
-} ffi_go_closure;
-
-ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *,
-				void (*fun)(ffi_cif*,void*,void**,void*));
-
-void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
-		  void **avalue, void *closure);
-
-#endif /* FFI_GO_CLOSURES */
-
-/* ---- Public interface definition -------------------------------------- */
-
-ffi_status ffi_prep_cif(ffi_cif *cif,
-			ffi_abi abi,
-			unsigned int nargs,
-			ffi_type *rtype,
-			ffi_type **atypes);
-
-ffi_status ffi_prep_cif_var(ffi_cif *cif,
-			    ffi_abi abi,
-			    unsigned int nfixedargs,
-			    unsigned int ntotalargs,
-			    ffi_type *rtype,
-			    ffi_type **atypes);
-
-void ffi_call(ffi_cif *cif,
-	      void (*fn)(void),
-	      void *rvalue,
-	      void **avalue);
-
-/* Useful for eliminating compiler warnings */
-#define FFI_FN(f) ((void (*)(void))f)
-
-/* ---- Definitions shared with assembly code ---------------------------- */
-
-#endif
-
-/* If these change, update src/mips/ffitarget.h. */
-#define FFI_TYPE_VOID       0    
-#define FFI_TYPE_INT        1
-#define FFI_TYPE_FLOAT      2    
-#define FFI_TYPE_DOUBLE     3
-#if @HAVE_LONG_DOUBLE@
-#define FFI_TYPE_LONGDOUBLE 4
-#else
-#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE
-#endif
-#define FFI_TYPE_UINT8      5   
-#define FFI_TYPE_SINT8      6
-#define FFI_TYPE_UINT16     7 
-#define FFI_TYPE_SINT16     8
-#define FFI_TYPE_UINT32     9
-#define FFI_TYPE_SINT32     10
-#define FFI_TYPE_UINT64     11
-#define FFI_TYPE_SINT64     12
-#define FFI_TYPE_STRUCT     13
-#define FFI_TYPE_POINTER    14
-#define FFI_TYPE_COMPLEX    15
-
-/* This should always refer to the last type code (for sanity checks) */
-#define FFI_TYPE_LAST       FFI_TYPE_COMPLEX
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/third_party/gofrontend/libffi/include/ffi_cfi.h b/third_party/gofrontend/libffi/include/ffi_cfi.h
deleted file mode 100644
index 244ce57..0000000
--- a/third_party/gofrontend/libffi/include/ffi_cfi.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi_cfi.h - Copyright (c) 2014  Red Hat, Inc.
-
-   Conditionally assemble cfi directives. Only necessary for building libffi.
-   ----------------------------------------------------------------------- */
-
-#ifndef FFI_CFI_H
-#define FFI_CFI_H
-
-#ifdef HAVE_AS_CFI_PSEUDO_OP
-
-# define cfi_startproc			.cfi_startproc
-# define cfi_endproc			.cfi_endproc
-# define cfi_def_cfa(reg, off)		.cfi_def_cfa reg, off
-# define cfi_def_cfa_register(reg)	.cfi_def_cfa_register reg
-# define cfi_def_cfa_offset(off)	.cfi_def_cfa_offset off
-# define cfi_adjust_cfa_offset(off)	.cfi_adjust_cfa_offset off
-# define cfi_offset(reg, off)		.cfi_offset reg, off
-# define cfi_rel_offset(reg, off)	.cfi_rel_offset reg, off
-# define cfi_register(r1, r2)		.cfi_register r1, r2
-# define cfi_return_column(reg)		.cfi_return_column reg
-# define cfi_restore(reg)		.cfi_restore reg
-# define cfi_same_value(reg)		.cfi_same_value reg
-# define cfi_undefined(reg)		.cfi_undefined reg
-# define cfi_remember_state		.cfi_remember_state
-# define cfi_restore_state		.cfi_restore_state
-# define cfi_window_save		.cfi_window_save
-# define cfi_personality(enc, exp)	.cfi_personality enc, exp
-# define cfi_lsda(enc, exp)		.cfi_lsda enc, exp
-# define cfi_escape(...)		.cfi_escape __VA_ARGS__
-
-#else
-
-# define cfi_startproc
-# define cfi_endproc
-# define cfi_def_cfa(reg, off)
-# define cfi_def_cfa_register(reg)
-# define cfi_def_cfa_offset(off)
-# define cfi_adjust_cfa_offset(off)
-# define cfi_offset(reg, off)
-# define cfi_rel_offset(reg, off)
-# define cfi_register(r1, r2)
-# define cfi_return_column(reg)
-# define cfi_restore(reg)
-# define cfi_same_value(reg)
-# define cfi_undefined(reg)
-# define cfi_remember_state
-# define cfi_restore_state
-# define cfi_window_save
-# define cfi_personality(enc, exp)
-# define cfi_lsda(enc, exp)
-# define cfi_escape(...)
-
-#endif /* HAVE_AS_CFI_PSEUDO_OP */
-#endif /* FFI_CFI_H */
diff --git a/third_party/gofrontend/libffi/include/ffi_common.h b/third_party/gofrontend/libffi/include/ffi_common.h
deleted file mode 100644
index 37f5a9e..0000000
--- a/third_party/gofrontend/libffi/include/ffi_common.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi_common.h - Copyright (C) 2011, 2012, 2013  Anthony Green
-                  Copyright (C) 2007  Free Software Foundation, Inc
-                  Copyright (c) 1996  Red Hat, Inc.
-                  
-   Common internal definitions and macros. Only necessary for building
-   libffi.
-   ----------------------------------------------------------------------- */
-
-#ifndef FFI_COMMON_H
-#define FFI_COMMON_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <fficonfig.h>
-
-/* Do not move this. Some versions of AIX are very picky about where
-   this is positioned. */
-#ifdef __GNUC__
-# if HAVE_ALLOCA_H
-#  include <alloca.h>
-# else
-  /* mingw64 defines this already in malloc.h. */
-#  ifndef alloca
-#    define alloca __builtin_alloca
-#  endif
-# endif
-# define MAYBE_UNUSED __attribute__((__unused__))
-#else
-# define MAYBE_UNUSED
-# if HAVE_ALLOCA_H
-#  include <alloca.h>
-# else
-#  ifdef _AIX
-#   pragma alloca
-#  else
-#   ifndef alloca /* predefined by HP cc +Olibcalls */
-#    ifdef _MSC_VER
-#     define alloca _alloca
-#    else
-char *alloca ();
-#   endif
-#  endif
-# endif
-# endif
-#endif
-
-/* Check for the existence of memcpy. */
-#if STDC_HEADERS
-# include <string.h>
-#else
-# ifndef HAVE_MEMCPY
-#  define memcpy(d, s, n) bcopy ((s), (d), (n))
-# endif
-#endif
-
-#if defined(FFI_DEBUG)
-#include <stdio.h>
-#endif
-
-#ifdef FFI_DEBUG
-void ffi_assert(char *expr, char *file, int line);
-void ffi_stop_here(void);
-void ffi_type_test(ffi_type *a, char *file, int line);
-
-#define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__))
-#define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l)))
-#define FFI_ASSERT_VALID_TYPE(x) ffi_type_test (x, __FILE__, __LINE__)
-#else
-#define FFI_ASSERT(x)
-#define FFI_ASSERT_AT(x, f, l)
-#define FFI_ASSERT_VALID_TYPE(x)
-#endif
-
-#define ALIGN(v, a)  (((((size_t) (v))-1) | ((a)-1))+1)
-#define ALIGN_DOWN(v, a) (((size_t) (v)) & -a)
-
-/* Perform machine dependent cif processing */
-ffi_status ffi_prep_cif_machdep(ffi_cif *cif);
-ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif,
-	 unsigned int nfixedargs, unsigned int ntotalargs);
-
-/* Extended cif, used in callback from assembly routine */
-typedef struct
-{
-  ffi_cif *cif;
-  void *rvalue;
-  void **avalue;
-} extended_cif;
-
-/* Terse sized type definitions.  */
-#if defined(_MSC_VER) || defined(__sgi) || defined(__SUNPRO_C)
-typedef unsigned char UINT8;
-typedef signed char   SINT8;
-typedef unsigned short UINT16;
-typedef signed short   SINT16;
-typedef unsigned int UINT32;
-typedef signed int   SINT32;
-# ifdef _MSC_VER
-typedef unsigned __int64 UINT64;
-typedef signed __int64   SINT64;
-# else
-# include <inttypes.h>
-typedef uint64_t UINT64;
-typedef int64_t  SINT64;
-# endif
-#else
-typedef unsigned int UINT8  __attribute__((__mode__(__QI__)));
-typedef signed int   SINT8  __attribute__((__mode__(__QI__)));
-typedef unsigned int UINT16 __attribute__((__mode__(__HI__)));
-typedef signed int   SINT16 __attribute__((__mode__(__HI__)));
-typedef unsigned int UINT32 __attribute__((__mode__(__SI__)));
-typedef signed int   SINT32 __attribute__((__mode__(__SI__)));
-typedef unsigned int UINT64 __attribute__((__mode__(__DI__)));
-typedef signed int   SINT64 __attribute__((__mode__(__DI__)));
-#endif
-
-typedef float FLOAT32;
-
-#ifndef __GNUC__
-#define __builtin_expect(x, expected_value) (x)
-#endif
-#define LIKELY(x)    __builtin_expect(!!(x),1)
-#define UNLIKELY(x)  __builtin_expect((x)!=0,0)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/third_party/gofrontend/libffi/libffi.pc.in b/third_party/gofrontend/libffi/libffi.pc.in
deleted file mode 100644
index edf6fde..0000000
--- a/third_party/gofrontend/libffi/libffi.pc.in
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-toolexeclibdir=@toolexeclibdir@
-includedir=${libdir}/@PACKAGE_NAME@-@PACKAGE_VERSION@/include
-
-Name: @PACKAGE_NAME@
-Description: Library supporting Foreign Function Interfaces
-Version: @PACKAGE_VERSION@
-Libs: -L${toolexeclibdir} -lffi
-Cflags: -I${includedir}
diff --git a/third_party/gofrontend/libffi/libffi.xcodeproj/project.pbxproj b/third_party/gofrontend/libffi/libffi.xcodeproj/project.pbxproj
deleted file mode 100644
index 1cf396f..0000000
--- a/third_party/gofrontend/libffi/libffi.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,637 +0,0 @@
-// !$*UTF8*$!
-{
-	archiveVersion = 1;
-	classes = {
-	};
-	objectVersion = 46;
-	objects = {
-
-/* Begin PBXBuildFile section */
-		DBFA714A187F1D8600A76262 /* ffi.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; };
-		DBFA714B187F1D8600A76262 /* ffi_common.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA713F187F1D8600A76262 /* ffi_common.h */; };
-		DBFA714C187F1D8600A76262 /* fficonfig.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7140187F1D8600A76262 /* fficonfig.h */; };
-		DBFA714D187F1D8600A76262 /* ffitarget.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; };
-		DBFA714E187F1D8600A76262 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; };
-		DBFA714F187F1D8600A76262 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; };
-		DBFA7156187F1D8600A76262 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; };
-		DBFA7157187F1D8600A76262 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; };
-		DBFA7158187F1D8600A76262 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; };
-		DBFA7159187F1D8600A76262 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; };
-		DBFA715A187F1D8600A76262 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; };
-		DBFA715B187F1D8600A76262 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; };
-		DBFA7177187F1D9B00A76262 /* ffi_arm64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716C187F1D9B00A76262 /* ffi_arm64.c */; };
-		DBFA7178187F1D9B00A76262 /* sysv_arm64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716D187F1D9B00A76262 /* sysv_arm64.S */; };
-		DBFA7179187F1D9B00A76262 /* ffi_armv7.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716F187F1D9B00A76262 /* ffi_armv7.c */; };
-		DBFA717A187F1D9B00A76262 /* sysv_armv7.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7170187F1D9B00A76262 /* sysv_armv7.S */; };
-		DBFA717B187F1D9B00A76262 /* trampoline_armv7.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7171187F1D9B00A76262 /* trampoline_armv7.S */; };
-		DBFA717C187F1D9B00A76262 /* darwin64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7173187F1D9B00A76262 /* darwin64_x86_64.S */; };
-		DBFA717D187F1D9B00A76262 /* darwin_i386.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7174187F1D9B00A76262 /* darwin_i386.S */; };
-		DBFA717E187F1D9B00A76262 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */; };
-		DBFA717F187F1D9B00A76262 /* ffi_i386.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7176187F1D9B00A76262 /* ffi_i386.c */; };
-		DBFA718E187F1DA100A76262 /* ffi_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7182187F1DA100A76262 /* ffi_i386.h */; };
-		DBFA718F187F1DA100A76262 /* ffi_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7183187F1DA100A76262 /* ffi_x86_64.h */; };
-		DBFA7190187F1DA100A76262 /* fficonfig_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7184187F1DA100A76262 /* fficonfig_i386.h */; };
-		DBFA7191187F1DA100A76262 /* fficonfig_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */; };
-		DBFA7192187F1DA100A76262 /* ffitarget_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7186187F1DA100A76262 /* ffitarget_i386.h */; };
-		DBFA7193187F1DA100A76262 /* ffitarget_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */; };
-		DBFA7194187F1DA100A76262 /* darwin64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718A187F1DA100A76262 /* darwin64_x86_64.S */; };
-		DBFA7195187F1DA100A76262 /* darwin_i386.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718B187F1DA100A76262 /* darwin_i386.S */; };
-		DBFA7196187F1DA100A76262 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */; };
-		DBFA7197187F1DA100A76262 /* ffi_i386.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718D187F1DA100A76262 /* ffi_i386.c */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXCopyFilesBuildPhase section */
-		DB13B1641849DF1E0010F42D /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 8;
-			dstPath = "include/$(PRODUCT_NAME)";
-			dstSubfolderSpec = 16;
-			files = (
-			);
-			runOnlyForDeploymentPostprocessing = 1;
-		};
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
-		DB13B1661849DF1E0010F42D /* libffi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		DB13B1911849DF510010F42D /* ffi.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = ffi.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
-		DBFA713E187F1D8600A76262 /* ffi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi.h; sourceTree = "<group>"; };
-		DBFA713F187F1D8600A76262 /* ffi_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_common.h; sourceTree = "<group>"; };
-		DBFA7140187F1D8600A76262 /* fficonfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig.h; sourceTree = "<group>"; };
-		DBFA7141187F1D8600A76262 /* ffitarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget.h; sourceTree = "<group>"; };
-		DBFA7143187F1D8600A76262 /* closures.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = closures.c; sourceTree = "<group>"; };
-		DBFA7145187F1D8600A76262 /* dlmalloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dlmalloc.c; sourceTree = "<group>"; };
-		DBFA7147187F1D8600A76262 /* prep_cif.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = prep_cif.c; sourceTree = "<group>"; };
-		DBFA7148187F1D8600A76262 /* raw_api.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = raw_api.c; sourceTree = "<group>"; };
-		DBFA7149187F1D8600A76262 /* types.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = types.c; sourceTree = "<group>"; };
-		DBFA715E187F1D9B00A76262 /* ffi_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_arm64.h; sourceTree = "<group>"; };
-		DBFA715F187F1D9B00A76262 /* ffi_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_armv7.h; sourceTree = "<group>"; };
-		DBFA7160187F1D9B00A76262 /* ffi_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_i386.h; sourceTree = "<group>"; };
-		DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = "<group>"; };
-		DBFA7162187F1D9B00A76262 /* fficonfig_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_arm64.h; sourceTree = "<group>"; };
-		DBFA7163187F1D9B00A76262 /* fficonfig_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_armv7.h; sourceTree = "<group>"; };
-		DBFA7164187F1D9B00A76262 /* fficonfig_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_i386.h; sourceTree = "<group>"; };
-		DBFA7165187F1D9B00A76262 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = "<group>"; };
-		DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_arm64.h; sourceTree = "<group>"; };
-		DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_armv7.h; sourceTree = "<group>"; };
-		DBFA7168187F1D9B00A76262 /* ffitarget_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_i386.h; sourceTree = "<group>"; };
-		DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = "<group>"; };
-		DBFA716C187F1D9B00A76262 /* ffi_arm64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_arm64.c; sourceTree = "<group>"; };
-		DBFA716D187F1D9B00A76262 /* sysv_arm64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_arm64.S; sourceTree = "<group>"; };
-		DBFA716F187F1D9B00A76262 /* ffi_armv7.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_armv7.c; sourceTree = "<group>"; };
-		DBFA7170187F1D9B00A76262 /* sysv_armv7.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_armv7.S; sourceTree = "<group>"; };
-		DBFA7171187F1D9B00A76262 /* trampoline_armv7.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = trampoline_armv7.S; sourceTree = "<group>"; };
-		DBFA7173187F1D9B00A76262 /* darwin64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin64_x86_64.S; sourceTree = "<group>"; };
-		DBFA7174187F1D9B00A76262 /* darwin_i386.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin_i386.S; sourceTree = "<group>"; };
-		DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi64_x86_64.c; sourceTree = "<group>"; };
-		DBFA7176187F1D9B00A76262 /* ffi_i386.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_i386.c; sourceTree = "<group>"; };
-		DBFA7182187F1DA100A76262 /* ffi_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_i386.h; sourceTree = "<group>"; };
-		DBFA7183187F1DA100A76262 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = "<group>"; };
-		DBFA7184187F1DA100A76262 /* fficonfig_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_i386.h; sourceTree = "<group>"; };
-		DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = "<group>"; };
-		DBFA7186187F1DA100A76262 /* ffitarget_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_i386.h; sourceTree = "<group>"; };
-		DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = "<group>"; };
-		DBFA718A187F1DA100A76262 /* darwin64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin64_x86_64.S; sourceTree = "<group>"; };
-		DBFA718B187F1DA100A76262 /* darwin_i386.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin_i386.S; sourceTree = "<group>"; };
-		DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi64_x86_64.c; sourceTree = "<group>"; };
-		DBFA718D187F1DA100A76262 /* ffi_i386.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_i386.c; sourceTree = "<group>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXGroup section */
-		DB13B15B1849DEB70010F42D = {
-			isa = PBXGroup;
-			children = (
-				DBFA713C187F1D8600A76262 /* darwin_common */,
-				DBFA715C187F1D9B00A76262 /* darwin_ios */,
-				DBFA7180187F1DA100A76262 /* darwin_osx */,
-				DB13B1671849DF1E0010F42D /* Products */,
-			);
-			sourceTree = "<group>";
-		};
-		DB13B1671849DF1E0010F42D /* Products */ = {
-			isa = PBXGroup;
-			children = (
-				DB13B1661849DF1E0010F42D /* libffi.a */,
-				DB13B1911849DF510010F42D /* ffi.dylib */,
-			);
-			name = Products;
-			sourceTree = "<group>";
-		};
-		DBFA713C187F1D8600A76262 /* darwin_common */ = {
-			isa = PBXGroup;
-			children = (
-				DBFA713D187F1D8600A76262 /* include */,
-				DBFA7142187F1D8600A76262 /* src */,
-			);
-			path = "darwin_common";
-			sourceTree = "<group>";
-		};
-		DBFA713D187F1D8600A76262 /* include */ = {
-			isa = PBXGroup;
-			children = (
-				DBFA713E187F1D8600A76262 /* ffi.h */,
-				DBFA713F187F1D8600A76262 /* ffi_common.h */,
-				DBFA7140187F1D8600A76262 /* fficonfig.h */,
-				DBFA7141187F1D8600A76262 /* ffitarget.h */,
-			);
-			path = include;
-			sourceTree = "<group>";
-		};
-		DBFA7142187F1D8600A76262 /* src */ = {
-			isa = PBXGroup;
-			children = (
-				DBFA7143187F1D8600A76262 /* closures.c */,
-				DBFA7145187F1D8600A76262 /* dlmalloc.c */,
-				DBFA7147187F1D8600A76262 /* prep_cif.c */,
-				DBFA7148187F1D8600A76262 /* raw_api.c */,
-				DBFA7149187F1D8600A76262 /* types.c */,
-			);
-			path = src;
-			sourceTree = "<group>";
-		};
-		DBFA715C187F1D9B00A76262 /* darwin_ios */ = {
-			isa = PBXGroup;
-			children = (
-				DBFA715D187F1D9B00A76262 /* include */,
-				DBFA716A187F1D9B00A76262 /* src */,
-			);
-			path = "darwin_ios";
-			sourceTree = "<group>";
-		};
-		DBFA715D187F1D9B00A76262 /* include */ = {
-			isa = PBXGroup;
-			children = (
-				DBFA715E187F1D9B00A76262 /* ffi_arm64.h */,
-				DBFA715F187F1D9B00A76262 /* ffi_armv7.h */,
-				DBFA7160187F1D9B00A76262 /* ffi_i386.h */,
-				DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */,
-				DBFA7162187F1D9B00A76262 /* fficonfig_arm64.h */,
-				DBFA7163187F1D9B00A76262 /* fficonfig_armv7.h */,
-				DBFA7164187F1D9B00A76262 /* fficonfig_i386.h */,
-				DBFA7165187F1D9B00A76262 /* fficonfig_x86_64.h */,
-				DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */,
-				DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */,
-				DBFA7168187F1D9B00A76262 /* ffitarget_i386.h */,
-				DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */,
-			);
-			path = include;
-			sourceTree = "<group>";
-		};
-		DBFA716A187F1D9B00A76262 /* src */ = {
-			isa = PBXGroup;
-			children = (
-				DBFA716B187F1D9B00A76262 /* aarch64 */,
-				DBFA716E187F1D9B00A76262 /* arm */,
-				DBFA7172187F1D9B00A76262 /* x86 */,
-			);
-			path = src;
-			sourceTree = "<group>";
-		};
-		DBFA716B187F1D9B00A76262 /* aarch64 */ = {
-			isa = PBXGroup;
-			children = (
-				DBFA716C187F1D9B00A76262 /* ffi_arm64.c */,
-				DBFA716D187F1D9B00A76262 /* sysv_arm64.S */,
-			);
-			path = aarch64;
-			sourceTree = "<group>";
-		};
-		DBFA716E187F1D9B00A76262 /* arm */ = {
-			isa = PBXGroup;
-			children = (
-				DBFA716F187F1D9B00A76262 /* ffi_armv7.c */,
-				DBFA7170187F1D9B00A76262 /* sysv_armv7.S */,
-				DBFA7171187F1D9B00A76262 /* trampoline_armv7.S */,
-			);
-			path = arm;
-			sourceTree = "<group>";
-		};
-		DBFA7172187F1D9B00A76262 /* x86 */ = {
-			isa = PBXGroup;
-			children = (
-				DBFA7173187F1D9B00A76262 /* darwin64_x86_64.S */,
-				DBFA7174187F1D9B00A76262 /* darwin_i386.S */,
-				DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */,
-				DBFA7176187F1D9B00A76262 /* ffi_i386.c */,
-			);
-			path = x86;
-			sourceTree = "<group>";
-		};
-		DBFA7180187F1DA100A76262 /* darwin_osx */ = {
-			isa = PBXGroup;
-			children = (
-				DBFA7181187F1DA100A76262 /* include */,
-				DBFA7188187F1DA100A76262 /* src */,
-			);
-			path = "darwin_osx";
-			sourceTree = "<group>";
-		};
-		DBFA7181187F1DA100A76262 /* include */ = {
-			isa = PBXGroup;
-			children = (
-				DBFA7182187F1DA100A76262 /* ffi_i386.h */,
-				DBFA7183187F1DA100A76262 /* ffi_x86_64.h */,
-				DBFA7184187F1DA100A76262 /* fficonfig_i386.h */,
-				DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */,
-				DBFA7186187F1DA100A76262 /* ffitarget_i386.h */,
-				DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */,
-			);
-			path = include;
-			sourceTree = "<group>";
-		};
-		DBFA7188187F1DA100A76262 /* src */ = {
-			isa = PBXGroup;
-			children = (
-				DBFA7189187F1DA100A76262 /* x86 */,
-			);
-			path = src;
-			sourceTree = "<group>";
-		};
-		DBFA7189187F1DA100A76262 /* x86 */ = {
-			isa = PBXGroup;
-			children = (
-				DBFA718A187F1DA100A76262 /* darwin64_x86_64.S */,
-				DBFA718B187F1DA100A76262 /* darwin_i386.S */,
-				DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */,
-				DBFA718D187F1DA100A76262 /* ffi_i386.c */,
-			);
-			path = x86;
-			sourceTree = "<group>";
-		};
-/* End PBXGroup section */
-
-/* Begin PBXHeadersBuildPhase section */
-		DB13B18F1849DF510010F42D /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				DBFA714C187F1D8600A76262 /* fficonfig.h in Headers */,
-				DBFA714D187F1D8600A76262 /* ffitarget.h in Headers */,
-				DBFA714A187F1D8600A76262 /* ffi.h in Headers */,
-				DBFA718F187F1DA100A76262 /* ffi_x86_64.h in Headers */,
-				DBFA7191187F1DA100A76262 /* fficonfig_x86_64.h in Headers */,
-				DBFA718E187F1DA100A76262 /* ffi_i386.h in Headers */,
-				DBFA7190187F1DA100A76262 /* fficonfig_i386.h in Headers */,
-				DBFA714B187F1D8600A76262 /* ffi_common.h in Headers */,
-				DBFA7193187F1DA100A76262 /* ffitarget_x86_64.h in Headers */,
-				DBFA7192187F1DA100A76262 /* ffitarget_i386.h in Headers */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXHeadersBuildPhase section */
-
-/* Begin PBXNativeTarget section */
-		DB13B1651849DF1E0010F42D /* libffi-iOS */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = DB13B18B1849DF1E0010F42D /* Build configuration list for PBXNativeTarget "libffi-iOS" */;
-			buildPhases = (
-				DB13B3051849E01C0010F42D /* ShellScript */,
-				DB13B1621849DF1E0010F42D /* Sources */,
-				DB13B1641849DF1E0010F42D /* CopyFiles */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = "libffi-iOS";
-			productName = ffi;
-			productReference = DB13B1661849DF1E0010F42D /* libffi.a */;
-			productType = "com.apple.product-type.library.static";
-		};
-		DB13B1901849DF510010F42D /* libffi-Mac */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = DB13B1B01849DF520010F42D /* Build configuration list for PBXNativeTarget "libffi-Mac" */;
-			buildPhases = (
-				DB13B3061849E0490010F42D /* ShellScript */,
-				DB13B18D1849DF510010F42D /* Sources */,
-				DB13B18F1849DF510010F42D /* Headers */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = "libffi-Mac";
-			productName = ffi;
-			productReference = DB13B1911849DF510010F42D /* ffi.dylib */;
-			productType = "com.apple.product-type.library.dynamic";
-		};
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
-		DB13B15C1849DEB70010F42D /* Project object */ = {
-			isa = PBXProject;
-			attributes = {
-				LastUpgradeCheck = 0510;
-			};
-			buildConfigurationList = DB13B15F1849DEB70010F42D /* Build configuration list for PBXProject "libffi" */;
-			compatibilityVersion = "Xcode 3.2";
-			developmentRegion = English;
-			hasScannedForEncodings = 0;
-			knownRegions = (
-				en,
-			);
-			mainGroup = DB13B15B1849DEB70010F42D;
-			productRefGroup = DB13B1671849DF1E0010F42D /* Products */;
-			projectDirPath = "";
-			projectRoot = "";
-			targets = (
-				DB13B1651849DF1E0010F42D /* libffi-iOS */,
-				DB13B1901849DF510010F42D /* libffi-Mac */,
-			);
-		};
-/* End PBXProject section */
-
-/* Begin PBXShellScriptBuildPhase section */
-		DB13B3051849E01C0010F42D /* ShellScript */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "/usr/bin/python generate-darwin-source-and-headers.py --only-ios";
-		};
-		DB13B3061849E0490010F42D /* ShellScript */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "/usr/bin/python generate-darwin-source-and-headers.py --only-osx";
-		};
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
-		DB13B1621849DF1E0010F42D /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				DBFA717E187F1D9B00A76262 /* ffi64_x86_64.c in Sources */,
-				DBFA7179187F1D9B00A76262 /* ffi_armv7.c in Sources */,
-				DBFA717B187F1D9B00A76262 /* trampoline_armv7.S in Sources */,
-				DBFA714E187F1D8600A76262 /* closures.c in Sources */,
-				DBFA717A187F1D9B00A76262 /* sysv_armv7.S in Sources */,
-				DBFA717D187F1D9B00A76262 /* darwin_i386.S in Sources */,
-				DBFA7156187F1D8600A76262 /* prep_cif.c in Sources */,
-				DBFA717F187F1D9B00A76262 /* ffi_i386.c in Sources */,
-				DBFA7158187F1D8600A76262 /* raw_api.c in Sources */,
-				DBFA7178187F1D9B00A76262 /* sysv_arm64.S in Sources */,
-				DBFA717C187F1D9B00A76262 /* darwin64_x86_64.S in Sources */,
-				DBFA715A187F1D8600A76262 /* types.c in Sources */,
-				DBFA7177187F1D9B00A76262 /* ffi_arm64.c in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		DB13B18D1849DF510010F42D /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				DBFA7196187F1DA100A76262 /* ffi64_x86_64.c in Sources */,
-				DBFA7195187F1DA100A76262 /* darwin_i386.S in Sources */,
-				DBFA7157187F1D8600A76262 /* prep_cif.c in Sources */,
-				DBFA7197187F1DA100A76262 /* ffi_i386.c in Sources */,
-				DBFA715B187F1D8600A76262 /* types.c in Sources */,
-				DBFA7159187F1D8600A76262 /* raw_api.c in Sources */,
-				DBFA714F187F1D8600A76262 /* closures.c in Sources */,
-				DBFA7194187F1DA100A76262 /* darwin64_x86_64.S in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXSourcesBuildPhase section */
-
-/* Begin XCBuildConfiguration section */
-		DB13B1601849DEB70010F42D /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				HEADER_SEARCH_PATHS = (
-					"$(inherited)",
-					"darwin_common/include",
-				);
-				ONLY_ACTIVE_ARCH = YES;
-			};
-			name = Debug;
-		};
-		DB13B1611849DEB70010F42D /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				HEADER_SEARCH_PATHS = (
-					"$(inherited)",
-					"darwin_common/include",
-				);
-			};
-			name = Release;
-		};
-		DB13B1871849DF1E0010F42D /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_MODULES = YES;
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				COPY_PHASE_STRIP = NO;
-				DSTROOT = /tmp/ffi.dst;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = (
-					"DEBUG=1",
-					"$(inherited)",
-				);
-				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				HEADER_SEARCH_PATHS = (
-					"$(inherited)",
-					"darwin_ios/include",
-				);
-				IPHONEOS_DEPLOYMENT_TARGET = 5.0;
-				"IPHONEOS_DEPLOYMENT_TARGET[arch=arm64]" = 7.0;
-				OTHER_LDFLAGS = "-ObjC";
-				PRODUCT_NAME = ffi;
-				SDKROOT = iphoneos;
-				SKIP_INSTALL = YES;
-			};
-			name = Debug;
-		};
-		DB13B1881849DF1E0010F42D /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_MODULES = YES;
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				COPY_PHASE_STRIP = YES;
-				DSTROOT = /tmp/ffi.dst;
-				ENABLE_NS_ASSERTIONS = NO;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				HEADER_SEARCH_PATHS = (
-					"$(inherited)",
-					"darwin_ios/include",
-				);
-				IPHONEOS_DEPLOYMENT_TARGET = 5.0;
-				"IPHONEOS_DEPLOYMENT_TARGET[arch=arm64]" = 7.0;
-				OTHER_LDFLAGS = "-ObjC";
-				PRODUCT_NAME = ffi;
-				SDKROOT = iphoneos;
-				SKIP_INSTALL = YES;
-				VALIDATE_PRODUCT = YES;
-			};
-			name = Release;
-		};
-		DB13B1B11849DF520010F42D /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				COPY_PHASE_STRIP = NO;
-				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 1;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = (
-					"DEBUG=1",
-					"$(inherited)",
-				);
-				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				HEADER_SEARCH_PATHS = (
-					"$(inherited)",
-					"darwin_osx/include",
-				);
-				MACOSX_DEPLOYMENT_TARGET = 10.6;
-				ONLY_ACTIVE_ARCH = YES;
-				OTHER_LDFLAGS = "-Wl,-no_compact_unwind";
-				PRODUCT_NAME = ffi;
-				SDKROOT = macosx;
-			};
-			name = Debug;
-		};
-		DB13B1B21849DF520010F42D /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ALWAYS_SEARCH_USER_PATHS = NO;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
-				CLANG_CXX_LIBRARY = "libc++";
-				CLANG_ENABLE_OBJC_ARC = YES;
-				CLANG_WARN_BOOL_CONVERSION = YES;
-				CLANG_WARN_CONSTANT_CONVERSION = YES;
-				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
-				CLANG_WARN_EMPTY_BODY = YES;
-				CLANG_WARN_ENUM_CONVERSION = YES;
-				CLANG_WARN_INT_CONVERSION = YES;
-				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				DYLIB_COMPATIBILITY_VERSION = 1;
-				DYLIB_CURRENT_VERSION = 1;
-				ENABLE_NS_ASSERTIONS = NO;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
-				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
-				GCC_WARN_UNDECLARED_SELECTOR = YES;
-				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
-				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				HEADER_SEARCH_PATHS = (
-					"$(inherited)",
-					"darwin_osx/include",
-				);
-				MACOSX_DEPLOYMENT_TARGET = 10.6;
-				OTHER_LDFLAGS = "-Wl,-no_compact_unwind";
-				PRODUCT_NAME = ffi;
-				SDKROOT = macosx;
-			};
-			name = Release;
-		};
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
-		DB13B15F1849DEB70010F42D /* Build configuration list for PBXProject "libffi" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				DB13B1601849DEB70010F42D /* Debug */,
-				DB13B1611849DEB70010F42D /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		DB13B18B1849DF1E0010F42D /* Build configuration list for PBXNativeTarget "libffi-iOS" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				DB13B1871849DF1E0010F42D /* Debug */,
-				DB13B1881849DF1E0010F42D /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		DB13B1B01849DF520010F42D /* Build configuration list for PBXNativeTarget "libffi-Mac" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				DB13B1B11849DF520010F42D /* Debug */,
-				DB13B1B21849DF520010F42D /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-/* End XCConfigurationList section */
-	};
-	rootObject = DB13B15C1849DEB70010F42D /* Project object */;
-}
diff --git a/third_party/gofrontend/libffi/libtool-version b/third_party/gofrontend/libffi/libtool-version
deleted file mode 100644
index 6753286..0000000
--- a/third_party/gofrontend/libffi/libtool-version
+++ /dev/null
@@ -1,6 +0,0 @@
-# This file is used to maintain libtool version info for libffi.  See
-# the libtool manual to understand the meaning of the fields.  This is
-# a separate file so that version updates don't involve re-running
-# automake.
-# CURRENT:REVISION:AGE
-4:1:0
diff --git a/third_party/gofrontend/libffi/man/Makefile.am b/third_party/gofrontend/libffi/man/Makefile.am
deleted file mode 100644
index afcbfb6..0000000
--- a/third_party/gofrontend/libffi/man/Makefile.am
+++ /dev/null
@@ -1,8 +0,0 @@
-## Process this with automake to create Makefile.in
-
-AUTOMAKE_OPTIONS=foreign
-
-EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3
-
-man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3
-
diff --git a/third_party/gofrontend/libffi/man/Makefile.in b/third_party/gofrontend/libffi/man/Makefile.in
deleted file mode 100644
index 39f6cbf..0000000
--- a/third_party/gofrontend/libffi/man/Makefile.in
+++ /dev/null
@@ -1,420 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-target_triplet = @target@
-subdir = man
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
-	$(top_srcdir)/../config/asmcfi.m4 \
-	$(top_srcdir)/../config/depstand.m4 \
-	$(top_srcdir)/../config/lead-dot.m4 \
-	$(top_srcdir)/../config/multi.m4 \
-	$(top_srcdir)/../config/override.m4 \
-	$(top_srcdir)/../libtool.m4 $(top_srcdir)/../ltoptions.m4 \
-	$(top_srcdir)/../ltsugar.m4 $(top_srcdir)/../ltversion.m4 \
-	$(top_srcdir)/../lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/fficonfig.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-SOURCES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-man3dir = $(mandir)/man3
-am__installdirs = "$(DESTDIR)$(man3dir)"
-NROFF = nroff
-MANS = $(man_MANS)
-ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
-AMTAR = @AMTAR@
-AM_LTLDFLAGS = @AM_LTLDFLAGS@
-AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCAS = @CCAS@
-CCASDEPMODE = @CCASDEPMODE@
-CCASFLAGS = @CCASFLAGS@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
-FGREP = @FGREP@
-GREP = @GREP@
-HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
-HAVE_LONG_DOUBLE_VARIANT = @HAVE_LONG_DOUBLE_VARIANT@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TARGET = @TARGET@
-TARGETDIR = @TARGETDIR@
-TARGET_OBJ = @TARGET_OBJ@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-multi_basedir = @multi_basedir@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target = @target@
-target_alias = @target_alias@
-target_cpu = @target_cpu@
-target_os = @target_os@
-target_vendor = @target_vendor@
-toolexecdir = @toolexecdir@
-toolexeclibdir = @toolexeclibdir@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AUTOMAKE_OPTIONS = foreign
-EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3
-man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign man/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-man3: $(man_MANS)
-	@$(NORMAL_INSTALL)
-	test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)"
-	@list=''; test -n "$(man3dir)" || exit 0; \
-	{ for i in $$list; do echo "$$i"; done; \
-	l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
-	  sed -n '/\.3[a-z]*$$/p'; \
-	} | while read p; do \
-	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; echo "$$p"; \
-	done | \
-	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
-	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
-	sed 'N;N;s,\n, ,g' | { \
-	list=; while read file base inst; do \
-	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
-	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
-	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \
-	  fi; \
-	done; \
-	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
-	while read files; do \
-	  test -z "$$files" || { \
-	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \
-	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \
-	done; }
-
-uninstall-man3:
-	@$(NORMAL_UNINSTALL)
-	@list=''; test -n "$(man3dir)" || exit 0; \
-	files=`{ for i in $$list; do echo "$$i"; done; \
-	l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
-	  sed -n '/\.3[a-z]*$$/p'; \
-	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
-	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
-	test -z "$$files" || { \
-	  echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \
-	  cd "$(DESTDIR)$(man3dir)" && rm -f $$files; }
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-check-am: all-am
-check: check-am
-all-am: Makefile $(MANS)
-installdirs:
-	for dir in "$(DESTDIR)$(man3dir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-man
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man: install-man3
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-man
-
-uninstall-man: uninstall-man3
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	distclean distclean-generic distclean-libtool dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-man3 install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
-	uninstall-man uninstall-man3
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/gofrontend/libffi/man/ffi.3 b/third_party/gofrontend/libffi/man/ffi.3
deleted file mode 100644
index 1f1d303..0000000
--- a/third_party/gofrontend/libffi/man/ffi.3
+++ /dev/null
@@ -1,41 +0,0 @@
-.Dd February 15, 2008
-.Dt FFI 3
-.Sh NAME
-.Nm FFI
-.Nd Foreign Function Interface
-.Sh LIBRARY
-libffi, -lffi
-.Sh SYNOPSIS
-.In ffi.h
-.Ft ffi_status
-.Fo ffi_prep_cif
-.Fa "ffi_cif *cif"
-.Fa "ffi_abi abi"
-.Fa "unsigned int nargs"
-.Fa "ffi_type *rtype"
-.Fa "ffi_type **atypes"
-.Fc
-.Ft void
-.Fo ffi_prep_cif_var
-.Fa "ffi_cif *cif"
-.Fa "ffi_abi abi"
-.Fa "unsigned int nfixedargs"
-.Fa "unsigned int ntotalargs"
-.Fa "ffi_type *rtype"
-.Fa "ffi_type **atypes"
-.Fc
-.Ft void
-.Fo ffi_call
-.Fa "ffi_cif *cif"
-.Fa "void (*fn)(void)"
-.Fa "void *rvalue"
-.Fa "void **avalue"
-.Fc
-.Sh DESCRIPTION
-The foreign function interface provides a mechanism by which a function can
-generate a call to another function at runtime without requiring knowledge of
-the called function's interface at compile time.
-.Sh SEE ALSO
-.Xr ffi_prep_cif 3 ,
-.Xr ffi_prep_cif_var 3 ,
-.Xr ffi_call 3
diff --git a/third_party/gofrontend/libffi/man/ffi_call.3 b/third_party/gofrontend/libffi/man/ffi_call.3
deleted file mode 100644
index 5351513..0000000
--- a/third_party/gofrontend/libffi/man/ffi_call.3
+++ /dev/null
@@ -1,103 +0,0 @@
-.Dd February 15, 2008
-.Dt ffi_call 3
-.Sh NAME
-.Nm ffi_call
-.Nd Invoke a foreign function.
-.Sh SYNOPSIS
-.In ffi.h
-.Ft void
-.Fo ffi_call
-.Fa "ffi_cif *cif"
-.Fa "void (*fn)(void)"
-.Fa "void *rvalue"
-.Fa "void **avalue"
-.Fc
-.Sh DESCRIPTION
-The
-.Nm ffi_call
-function provides a simple mechanism for invoking a function without
-requiring knowledge of the function's interface at compile time.
-.Fa fn
-is called with the values retrieved from the pointers in the
-.Fa avalue
-array. The return value from
-.Fa fn
-is placed in storage pointed to by
-.Fa rvalue .
-.Fa cif
-contains information describing the data types, sizes and alignments of the
-arguments to and return value from
-.Fa fn ,
-and must be initialized with
-.Nm ffi_prep_cif
-before it is used with
-.Nm ffi_call .
-.Pp
-.Fa rvalue
-must point to storage that is sizeof(ffi_arg) or larger for non-floating point
-types. For smaller-sized return value types, the
-.Nm ffi_arg
-or
-.Nm ffi_sarg
-integral type must be used to hold
-the return value.
-.Sh EXAMPLES
-.Bd -literal
-#include <ffi.h>
-#include <stdio.h>
-
-unsigned char
-foo(unsigned int, float);
-
-int
-main(int argc, const char **argv)
-{
-    ffi_cif cif;
-    ffi_type *arg_types[2];
-    void *arg_values[2];
-    ffi_status status;
-
-    // Because the return value from foo() is smaller than sizeof(long), it
-    // must be passed as ffi_arg or ffi_sarg.
-    ffi_arg result;
-
-    // Specify the data type of each argument. Available types are defined
-    // in <ffi/ffi.h>.
-    arg_types[0] = &ffi_type_uint;
-    arg_types[1] = &ffi_type_float;
-
-    // Prepare the ffi_cif structure.
-    if ((status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI,
-        2, &ffi_type_uint8, arg_types)) != FFI_OK)
-    {
-        // Handle the ffi_status error.
-    }
-
-    // Specify the values of each argument.
-    unsigned int arg1 = 42;
-    float arg2 = 5.1;
-
-    arg_values[0] = &arg1;
-    arg_values[1] = &arg2;
-
-    // Invoke the function.
-    ffi_call(&cif, FFI_FN(foo), &result, arg_values);
-
-    // The ffi_arg 'result' now contains the unsigned char returned from foo(),
-    // which can be accessed by a typecast.
-    printf("result is %hhu", (unsigned char)result);
-
-    return 0;
-}
-
-// The target function.
-unsigned char
-foo(unsigned int x, float y)
-{
-    unsigned char result = x - y;
-    return result;
-}
-.Ed
-.Sh SEE ALSO
-.Xr ffi 3 ,
-.Xr ffi_prep_cif 3
diff --git a/third_party/gofrontend/libffi/man/ffi_prep_cif.3 b/third_party/gofrontend/libffi/man/ffi_prep_cif.3
deleted file mode 100644
index ab2be8a..0000000
--- a/third_party/gofrontend/libffi/man/ffi_prep_cif.3
+++ /dev/null
@@ -1,68 +0,0 @@
-.Dd February 15, 2008
-.Dt ffi_prep_cif 3
-.Sh NAME
-.Nm ffi_prep_cif
-.Nd Prepare a
-.Nm ffi_cif
-structure for use with
-.Nm ffi_call 
-.
-.Sh SYNOPSIS
-.In ffi.h
-.Ft ffi_status
-.Fo ffi_prep_cif
-.Fa "ffi_cif *cif"
-.Fa "ffi_abi abi"
-.Fa "unsigned int nargs"
-.Fa "ffi_type *rtype"
-.Fa "ffi_type **atypes"
-.Fc
-.Sh DESCRIPTION
-The
-.Nm ffi_prep_cif
-function prepares a
-.Nm ffi_cif
-structure for use with 
-.Nm ffi_call
-.
-.Fa abi
-specifies a set of calling conventions to use.
-.Fa atypes
-is an array of
-.Fa nargs
-pointers to
-.Nm ffi_type
-structs that describe the data type, size and alignment of each argument.
-.Fa rtype
-points to an
-.Nm ffi_type
-that describes the data type, size and alignment of the
-return value. Note that to call a variadic function
-.Nm ffi_prep_cif_var
-must be used instead.
-.Sh RETURN VALUES
-Upon successful completion,
-.Nm ffi_prep_cif
-returns
-.Nm FFI_OK .
-It will return
-.Nm FFI_BAD_TYPEDEF
-if
-.Fa cif
-is
-.Nm NULL
-or
-.Fa atypes
-or
-.Fa rtype
-is malformed. If
-.Fa abi
-does not refer to a valid ABI,
-.Nm FFI_BAD_ABI
-will be returned. Available ABIs are
-defined in
-.Nm <ffitarget.h> .
-.Sh SEE ALSO
-.Xr ffi 3 ,
-.Xr ffi_call 3 ,
-.Xr ffi_prep_cif_var 3
diff --git a/third_party/gofrontend/libffi/man/ffi_prep_cif_var.3 b/third_party/gofrontend/libffi/man/ffi_prep_cif_var.3
deleted file mode 100644
index 7e19d0b..0000000
--- a/third_party/gofrontend/libffi/man/ffi_prep_cif_var.3
+++ /dev/null
@@ -1,73 +0,0 @@
-.Dd January 25, 2011
-.Dt ffi_prep_cif_var 3
-.Sh NAME
-.Nm ffi_prep_cif_var
-.Nd Prepare a
-.Nm ffi_cif
-structure for use with
-.Nm ffi_call
-for variadic functions.
-.Sh SYNOPSIS
-.In ffi.h
-.Ft ffi_status
-.Fo ffi_prep_cif_var
-.Fa "ffi_cif *cif"
-.Fa "ffi_abi abi"
-.Fa "unsigned int nfixedargs"
-.Fa "unsigned int ntotalargs"
-.Fa "ffi_type *rtype"
-.Fa "ffi_type **atypes"
-.Fc
-.Sh DESCRIPTION
-The
-.Nm ffi_prep_cif_var
-function prepares a
-.Nm ffi_cif
-structure for use with
-.Nm ffi_call
-for variadic functions.
-.Fa abi
-specifies a set of calling conventions to use.
-.Fa atypes
-is an array of
-.Fa ntotalargs
-pointers to
-.Nm ffi_type
-structs that describe the data type, size and alignment of each argument.
-.Fa rtype
-points to an
-.Nm ffi_type
-that describes the data type, size and alignment of the
-return value.
-.Fa nfixedargs
-must contain the number of fixed (non-variadic) arguments.
-Note that to call a non-variadic function
-.Nm ffi_prep_cif
-must be used.
-.Sh RETURN VALUES
-Upon successful completion,
-.Nm ffi_prep_cif_var
-returns
-.Nm FFI_OK .
-It will return
-.Nm FFI_BAD_TYPEDEF
-if
-.Fa cif
-is
-.Nm NULL
-or
-.Fa atypes
-or
-.Fa rtype
-is malformed. If
-.Fa abi
-does not refer to a valid ABI,
-.Nm FFI_BAD_ABI
-will be returned. Available ABIs are
-defined in
-.Nm <ffitarget.h>
-.
-.Sh SEE ALSO
-.Xr ffi 3 ,
-.Xr ffi_call 3 ,
-.Xr ffi_prep_cif 3
diff --git a/third_party/gofrontend/libffi/mdate-sh b/third_party/gofrontend/libffi/mdate-sh
deleted file mode 100644
index e631b22..0000000
--- a/third_party/gofrontend/libffi/mdate-sh
+++ /dev/null
@@ -1,205 +0,0 @@
-#!/bin/sh
-# Get modification time of a file or directory and pretty-print it.
-
-scriptversion=2009-04-28.21; # UTC
-
-# Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005, 2007, 2009 Free
-# Software Foundation, Inc.
-# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-case $1 in
-  '')
-     echo "$0: No file.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: mdate-sh [--help] [--version] FILE
-
-Pretty-print the modification time of FILE.
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "mdate-sh $scriptversion"
-    exit $?
-    ;;
-esac
-
-# Prevent date giving response in another language.
-LANG=C
-export LANG
-LC_ALL=C
-export LC_ALL
-LC_TIME=C
-export LC_TIME
-
-# GNU ls changes its time format in response to the TIME_STYLE
-# variable.  Since we cannot assume `unset' works, revert this
-# variable to its documented default.
-if test "${TIME_STYLE+set}" = set; then
-  TIME_STYLE=posix-long-iso
-  export TIME_STYLE
-fi
-
-save_arg1=$1
-
-# Find out how to get the extended ls output of a file or directory.
-if ls -L /dev/null 1>/dev/null 2>&1; then
-  ls_command='ls -L -l -d'
-else
-  ls_command='ls -l -d'
-fi
-# Avoid user/group names that might have spaces, when possible.
-if ls -n /dev/null 1>/dev/null 2>&1; then
-  ls_command="$ls_command -n"
-fi
-
-# A `ls -l' line looks as follows on OS/2.
-#  drwxrwx---        0 Aug 11  2001 foo
-# This differs from Unix, which adds ownership information.
-#  drwxrwx---   2 root  root      4096 Aug 11  2001 foo
-#
-# To find the date, we split the line on spaces and iterate on words
-# until we find a month.  This cannot work with files whose owner is a
-# user named `Jan', or `Feb', etc.  However, it's unlikely that `/'
-# will be owned by a user whose name is a month.  So we first look at
-# the extended ls output of the root directory to decide how many
-# words should be skipped to get the date.
-
-# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
-set x`$ls_command /`
-
-# Find which argument is the month.
-month=
-command=
-until test $month
-do
-  shift
-  # Add another shift to the command.
-  command="$command shift;"
-  case $1 in
-    Jan) month=January; nummonth=1;;
-    Feb) month=February; nummonth=2;;
-    Mar) month=March; nummonth=3;;
-    Apr) month=April; nummonth=4;;
-    May) month=May; nummonth=5;;
-    Jun) month=June; nummonth=6;;
-    Jul) month=July; nummonth=7;;
-    Aug) month=August; nummonth=8;;
-    Sep) month=September; nummonth=9;;
-    Oct) month=October; nummonth=10;;
-    Nov) month=November; nummonth=11;;
-    Dec) month=December; nummonth=12;;
-  esac
-done
-
-# Get the extended ls output of the file or directory.
-set dummy x`eval "$ls_command \"\$save_arg1\""`
-
-# Remove all preceding arguments
-eval $command
-
-# Because of the dummy argument above, month is in $2.
-#
-# On a POSIX system, we should have
-#
-# $# = 5
-# $1 = file size
-# $2 = month
-# $3 = day
-# $4 = year or time
-# $5 = filename
-#
-# On Darwin 7.7.0 and 7.6.0, we have
-#
-# $# = 4
-# $1 = day
-# $2 = month
-# $3 = year or time
-# $4 = filename
-
-# Get the month.
-case $2 in
-  Jan) month=January; nummonth=1;;
-  Feb) month=February; nummonth=2;;
-  Mar) month=March; nummonth=3;;
-  Apr) month=April; nummonth=4;;
-  May) month=May; nummonth=5;;
-  Jun) month=June; nummonth=6;;
-  Jul) month=July; nummonth=7;;
-  Aug) month=August; nummonth=8;;
-  Sep) month=September; nummonth=9;;
-  Oct) month=October; nummonth=10;;
-  Nov) month=November; nummonth=11;;
-  Dec) month=December; nummonth=12;;
-esac
-
-case $3 in
-  ???*) day=$1;;
-  *) day=$3; shift;;
-esac
-
-# Here we have to deal with the problem that the ls output gives either
-# the time of day or the year.
-case $3 in
-  *:*) set `date`; eval year=\$$#
-       case $2 in
-	 Jan) nummonthtod=1;;
-	 Feb) nummonthtod=2;;
-	 Mar) nummonthtod=3;;
-	 Apr) nummonthtod=4;;
-	 May) nummonthtod=5;;
-	 Jun) nummonthtod=6;;
-	 Jul) nummonthtod=7;;
-	 Aug) nummonthtod=8;;
-	 Sep) nummonthtod=9;;
-	 Oct) nummonthtod=10;;
-	 Nov) nummonthtod=11;;
-	 Dec) nummonthtod=12;;
-       esac
-       # For the first six month of the year the time notation can also
-       # be used for files modified in the last year.
-       if (expr $nummonth \> $nummonthtod) > /dev/null;
-       then
-	 year=`expr $year - 1`
-       fi;;
-  *) year=$3;;
-esac
-
-# The result.
-echo $day $month $year
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/third_party/gofrontend/libffi/src/aarch64/ffi.c b/third_party/gofrontend/libffi/src/aarch64/ffi.c
deleted file mode 100644
index 0cace9d..0000000
--- a/third_party/gofrontend/libffi/src/aarch64/ffi.c
+++ /dev/null
@@ -1,910 +0,0 @@
-/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-``Software''), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <ffi.h>
-#include <ffi_common.h>
-#include "internal.h"
-
-/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE;
-   all further uses in this file will refer to the 128-bit type.  */
-#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
-# if FFI_TYPE_LONGDOUBLE != 4
-#  error FFI_TYPE_LONGDOUBLE out of date
-# endif
-#else
-# undef FFI_TYPE_LONGDOUBLE
-# define FFI_TYPE_LONGDOUBLE 4
-#endif
-
-union _d
-{
-  UINT64 d;
-  UINT32 s[2];
-};
-
-struct _v
-{
-  union _d d[2] __attribute__((aligned(16)));
-};
-
-struct call_context
-{
-  struct _v v[N_V_ARG_REG];
-  UINT64 x[N_X_ARG_REG];
-};
-
-#if defined (__clang__) && defined (__APPLE__)
-extern void sys_icache_invalidate (void *start, size_t len);
-#endif
-
-static inline void
-ffi_clear_cache (void *start, void *end)
-{
-#if defined (__clang__) && defined (__APPLE__)
-  sys_icache_invalidate (start, (char *)end - (char *)start);
-#elif defined (__GNUC__)
-  __builtin___clear_cache (start, end);
-#else
-#error "Missing builtin to flush instruction cache"
-#endif
-}
-
-/* A subroutine of is_vfp_type.  Given a structure type, return the type code
-   of the first non-structure element.  Recurse for structure elements.
-   Return -1 if the structure is in fact empty, i.e. no nested elements.  */
-
-static int
-is_hfa0 (const ffi_type *ty)
-{
-  ffi_type **elements = ty->elements;
-  int i, ret = -1;
-
-  if (elements != NULL)
-    for (i = 0; elements[i]; ++i)
-      {
-        ret = elements[i]->type;
-        if (ret == FFI_TYPE_STRUCT || ret == FFI_TYPE_COMPLEX)
-          {
-            ret = is_hfa0 (elements[i]);
-            if (ret < 0)
-              continue;
-          }
-        break;
-      }
-
-  return ret;
-}
-
-/* A subroutine of is_vfp_type.  Given a structure type, return true if all
-   of the non-structure elements are the same as CANDIDATE.  */
-
-static int
-is_hfa1 (const ffi_type *ty, int candidate)
-{
-  ffi_type **elements = ty->elements;
-  int i;
-
-  if (elements != NULL)
-    for (i = 0; elements[i]; ++i)
-      {
-        int t = elements[i]->type;
-        if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX)
-          {
-            if (!is_hfa1 (elements[i], candidate))
-              return 0;
-          }
-        else if (t != candidate)
-          return 0;
-      }
-
-  return 1;
-}
-
-/* Determine if TY may be allocated to the FP registers.  This is both an
-   fp scalar type as well as an homogenous floating point aggregate (HFA).
-   That is, a structure consisting of 1 to 4 members of all the same type,
-   where that type is an fp scalar.
-
-   Returns non-zero iff TY is an HFA.  The result is the AARCH64_RET_*
-   constant for the type.  */
-
-static int
-is_vfp_type (const ffi_type *ty)
-{
-  ffi_type **elements;
-  int candidate, i;
-  size_t size, ele_count;
-
-  /* Quickest tests first.  */
-  candidate = ty->type;
-  switch (candidate)
-    {
-    default:
-      return 0;
-    case FFI_TYPE_FLOAT:
-    case FFI_TYPE_DOUBLE:
-    case FFI_TYPE_LONGDOUBLE:
-      ele_count = 1;
-      goto done;
-    case FFI_TYPE_COMPLEX:
-      candidate = ty->elements[0]->type;
-      switch (candidate)
-	{
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_DOUBLE:
-	case FFI_TYPE_LONGDOUBLE:
-	  ele_count = 2;
-	  goto done;
-	}
-      return 0;
-    case FFI_TYPE_STRUCT:
-      break;
-    }
-
-  /* No HFA types are smaller than 4 bytes, or larger than 64 bytes.  */
-  size = ty->size;
-  if (size < 4 || size > 64)
-    return 0;
-
-  /* Find the type of the first non-structure member.  */
-  elements = ty->elements;
-  candidate = elements[0]->type;
-  if (candidate == FFI_TYPE_STRUCT || candidate == FFI_TYPE_COMPLEX)
-    {
-      for (i = 0; ; ++i)
-        {
-          candidate = is_hfa0 (elements[i]);
-          if (candidate >= 0)
-            break;
-        }
-    }
-
-  /* If the first member is not a floating point type, it's not an HFA.
-     Also quickly re-check the size of the structure.  */
-  switch (candidate)
-    {
-    case FFI_TYPE_FLOAT:
-      ele_count = size / sizeof(float);
-      if (size != ele_count * sizeof(float))
-        return 0;
-      break;
-    case FFI_TYPE_DOUBLE:
-      ele_count = size / sizeof(double);
-      if (size != ele_count * sizeof(double))
-        return 0;
-      break;
-    case FFI_TYPE_LONGDOUBLE:
-      ele_count = size / sizeof(long double);
-      if (size != ele_count * sizeof(long double))
-        return 0;
-      break;
-    default:
-      return 0;
-    }
-  if (ele_count > 4)
-    return 0;
-
-  /* Finally, make sure that all scalar elements are the same type.  */
-  for (i = 0; elements[i]; ++i)
-    {
-      int t = elements[i]->type;
-      if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX)
-        {
-          if (!is_hfa1 (elements[i], candidate))
-            return 0;
-        }
-      else if (t != candidate)
-        return 0;
-    }
-
-  /* All tests succeeded.  Encode the result.  */
- done:
-  return candidate * 4 + (4 - ele_count);
-}
-
-/* Representation of the procedure call argument marshalling
-   state.
-
-   The terse state variable names match the names used in the AARCH64
-   PCS. */
-
-struct arg_state
-{
-  unsigned ngrn;                /* Next general-purpose register number. */
-  unsigned nsrn;                /* Next vector register number. */
-  size_t nsaa;                  /* Next stack offset. */
-
-#if defined (__APPLE__)
-  unsigned allocating_variadic;
-#endif
-};
-
-/* Initialize a procedure call argument marshalling state.  */
-static void
-arg_init (struct arg_state *state)
-{
-  state->ngrn = 0;
-  state->nsrn = 0;
-  state->nsaa = 0;
-#if defined (__APPLE__)
-  state->allocating_variadic = 0;
-#endif
-}
-
-/* Allocate an aligned slot on the stack and return a pointer to it.  */
-static void *
-allocate_to_stack (struct arg_state *state, void *stack,
-		   size_t alignment, size_t size)
-{
-  size_t nsaa = state->nsaa;
-
-  /* Round up the NSAA to the larger of 8 or the natural
-     alignment of the argument's type.  */
-#if defined (__APPLE__)
-  if (state->allocating_variadic && alignment < 8)
-    alignment = 8;
-#else
-  if (alignment < 8)
-    alignment = 8;
-#endif
-    
-  nsaa = ALIGN (nsaa, alignment);
-  state->nsaa = nsaa + size;
-
-  return (char *)stack + nsaa;
-}
-
-static ffi_arg
-extend_integer_type (void *source, int type)
-{
-  switch (type)
-    {
-    case FFI_TYPE_UINT8:
-      return *(UINT8 *) source;
-    case FFI_TYPE_SINT8:
-      return *(SINT8 *) source;
-    case FFI_TYPE_UINT16:
-      return *(UINT16 *) source;
-    case FFI_TYPE_SINT16:
-      return *(SINT16 *) source;
-    case FFI_TYPE_UINT32:
-      return *(UINT32 *) source;
-    case FFI_TYPE_INT:
-    case FFI_TYPE_SINT32:
-      return *(SINT32 *) source;
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_SINT64:
-      return *(UINT64 *) source;
-      break;
-    case FFI_TYPE_POINTER:
-      return *(uintptr_t *) source;
-    default:
-      abort();
-    }
-}
-
-static void
-extend_hfa_type (void *dest, void *src, int h)
-{
-  int f = h - AARCH64_RET_S4;
-  void *x0;
-
-  asm volatile (
-	"adr	%0, 0f\n"
-"	add	%0, %0, %1\n"
-"	br	%0\n"
-"0:	ldp	s16, s17, [%3]\n"	/* S4 */
-"	ldp	s18, s19, [%3, #8]\n"
-"	b	4f\n"
-"	ldp	s16, s17, [%3]\n"	/* S3 */
-"	ldr	s18, [%3, #8]\n"
-"	b	3f\n"
-"	ldp	s16, s17, [%3]\n"	/* S2 */
-"	b	2f\n"
-"	nop\n"
-"	ldr	s16, [%3]\n"		/* S1 */
-"	b	1f\n"
-"	nop\n"
-"	ldp	d16, d17, [%3]\n"	/* D4 */
-"	ldp	d18, d19, [%3, #16]\n"
-"	b	4f\n"
-"	ldp	d16, d17, [%3]\n"	/* D3 */
-"	ldr	d18, [%3, #16]\n"
-"	b	3f\n"
-"	ldp	d16, d17, [%3]\n"	/* D2 */
-"	b	2f\n"
-"	nop\n"
-"	ldr	d16, [%3]\n"		/* D1 */
-"	b	1f\n"
-"	nop\n"
-"	ldp	q16, q17, [%3]\n"	/* Q4 */
-"	ldp	q18, q19, [%3, #16]\n"
-"	b	4f\n"
-"	ldp	q16, q17, [%3]\n"	/* Q3 */
-"	ldr	q18, [%3, #16]\n"
-"	b	3f\n"
-"	ldp	q16, q17, [%3]\n"	/* Q2 */
-"	b	2f\n"
-"	nop\n"
-"	ldr	q16, [%3]\n"		/* Q1 */
-"	b	1f\n"
-"4:	str	q19, [%2, #48]\n"
-"3:	str	q18, [%2, #32]\n"
-"2:	str	q17, [%2, #16]\n"
-"1:	str	q16, [%2]"
-    : "=&r"(x0)
-    : "r"(f * 12), "r"(dest), "r"(src)
-    : "memory", "v16", "v17", "v18", "v19");
-}
-
-static void *
-compress_hfa_type (void *dest, void *reg, int h)
-{
-  switch (h)
-    {
-    case AARCH64_RET_S1:
-      if (dest == reg)
-	{
-#ifdef __AARCH64EB__
-	  dest += 12;
-#endif
-	}
-      else
-	*(float *)dest = *(float *)reg;
-      break;
-    case AARCH64_RET_S2:
-      asm ("ldp q16, q17, [%1]\n\t"
-	   "st2 { v16.s, v17.s }[0], [%0]"
-	   : : "r"(dest), "r"(reg) : "memory", "v16", "v17");
-      break;
-    case AARCH64_RET_S3:
-      asm ("ldp q16, q17, [%1]\n\t"
-	   "ldr q18, [%1, #32]\n\t"
-	   "st3 { v16.s, v17.s, v18.s }[0], [%0]"
-	   : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18");
-      break;
-    case AARCH64_RET_S4:
-      asm ("ldp q16, q17, [%1]\n\t"
-	   "ldp q18, q19, [%1, #32]\n\t"
-	   "st4 { v16.s, v17.s, v18.s, v19.s }[0], [%0]"
-	   : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18", "v19");
-      break;
-
-    case AARCH64_RET_D1:
-      if (dest == reg)
-	{
-#ifdef __AARCH64EB__
-	  dest += 8;
-#endif
-	}
-      else
-	*(double *)dest = *(double *)reg;
-      break;
-    case AARCH64_RET_D2:
-      asm ("ldp q16, q17, [%1]\n\t"
-	   "st2 { v16.d, v17.d }[0], [%0]"
-	   : : "r"(dest), "r"(reg) : "memory", "v16", "v17");
-      break;
-    case AARCH64_RET_D3:
-      asm ("ldp q16, q17, [%1]\n\t"
-	   "ldr q18, [%1, #32]\n\t"
-	   "st3 { v16.d, v17.d, v18.d }[0], [%0]"
-	   : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18");
-      break;
-    case AARCH64_RET_D4:
-      asm ("ldp q16, q17, [%1]\n\t"
-	   "ldp q18, q19, [%1, #32]\n\t"
-	   "st4 { v16.d, v17.d, v18.d, v19.d }[0], [%0]"
-	   : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18", "v19");
-      break;
-
-    default:
-      if (dest != reg)
-	return memcpy (dest, reg, 16 * (4 - (h & 3)));
-      break;
-    }
-  return dest;
-}
-
-/* Either allocate an appropriate register for the argument type, or if
-   none are available, allocate a stack slot and return a pointer
-   to the allocated space.  */
-
-static void *
-allocate_int_to_reg_or_stack (struct call_context *context,
-			      struct arg_state *state,
-			      void *stack, size_t size)
-{
-  if (state->ngrn < N_X_ARG_REG)
-    return &context->x[state->ngrn++];
-
-  state->ngrn = N_X_ARG_REG;
-  return allocate_to_stack (state, stack, size, size);
-}
-
-ffi_status
-ffi_prep_cif_machdep (ffi_cif *cif)
-{
-  ffi_type *rtype = cif->rtype;
-  size_t bytes = cif->bytes;
-  int flags, i, n;
-
-  switch (rtype->type)
-    {
-    case FFI_TYPE_VOID:
-      flags = AARCH64_RET_VOID;
-      break;
-    case FFI_TYPE_UINT8:
-      flags = AARCH64_RET_UINT8;
-      break;
-    case FFI_TYPE_UINT16:
-      flags = AARCH64_RET_UINT16;
-      break;
-    case FFI_TYPE_UINT32:
-      flags = AARCH64_RET_UINT32;
-      break;
-    case FFI_TYPE_SINT8:
-      flags = AARCH64_RET_SINT8;
-      break;
-    case FFI_TYPE_SINT16:
-      flags = AARCH64_RET_SINT16;
-      break;
-    case FFI_TYPE_INT:
-    case FFI_TYPE_SINT32:
-      flags = AARCH64_RET_SINT32;
-      break;
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-      flags = AARCH64_RET_INT64;
-      break;
-    case FFI_TYPE_POINTER:
-      flags = (sizeof(void *) == 4 ? AARCH64_RET_UINT32 : AARCH64_RET_INT64);
-      break;
-
-    case FFI_TYPE_FLOAT:
-    case FFI_TYPE_DOUBLE:
-    case FFI_TYPE_LONGDOUBLE:
-    case FFI_TYPE_STRUCT:
-    case FFI_TYPE_COMPLEX:
-      flags = is_vfp_type (rtype);
-      if (flags == 0)
-	{
-	  size_t s = rtype->size;
-	  if (s > 16)
-	    {
-	      flags = AARCH64_RET_VOID | AARCH64_RET_IN_MEM;
-	      bytes += 8;
-	    }
-	  else if (s == 16)
-	    flags = AARCH64_RET_INT128;
-	  else if (s == 8)
-	    flags = AARCH64_RET_INT64;
-	  else
-	    flags = AARCH64_RET_INT128 | AARCH64_RET_NEED_COPY;
-	}
-      break;
-
-    default:
-      abort();
-    }
-
-  for (i = 0, n = cif->nargs; i < n; i++)
-    if (is_vfp_type (cif->arg_types[i]))
-      {
-	flags |= AARCH64_FLAG_ARG_V;
-	break;
-      }
-
-  /* Round the stack up to a multiple of the stack alignment requirement. */
-  cif->bytes = ALIGN(bytes, 16);
-  cif->flags = flags;
-#if defined (__APPLE__)
-  cif->aarch64_nfixedargs = 0;
-#endif
-
-  return FFI_OK;
-}
-
-#if defined (__APPLE__)
-/* Perform Apple-specific cif processing for variadic calls */
-ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif,
-				    unsigned int nfixedargs,
-				    unsigned int ntotalargs)
-{
-  ffi_status status = ffi_prep_cif_machdep (cif);
-  cif->aarch64_nfixedargs = nfixedargs;
-  return status;
-}
-#endif /* __APPLE__ */
-
-extern void ffi_call_SYSV (struct call_context *context, void *frame,
-			   void (*fn)(void), void *rvalue, int flags,
-			   void *closure) FFI_HIDDEN;
-
-/* Call a function with the provided arguments and capture the return
-   value.  */
-static void
-ffi_call_int (ffi_cif *cif, void (*fn)(void), void *orig_rvalue,
-	      void **avalue, void *closure)
-{
-  struct call_context *context;
-  void *stack, *frame, *rvalue;
-  struct arg_state state;
-  size_t stack_bytes, rtype_size, rsize;
-  int i, nargs, flags;
-  ffi_type *rtype;
-
-  flags = cif->flags;
-  rtype = cif->rtype;
-  rtype_size = rtype->size;
-  stack_bytes = cif->bytes;
-
-  /* If the target function returns a structure via hidden pointer,
-     then we cannot allow a null rvalue.  Otherwise, mash a null
-     rvalue to void return type.  */
-  rsize = 0;
-  if (flags & AARCH64_RET_IN_MEM)
-    {
-      if (orig_rvalue == NULL)
-	rsize = rtype_size;
-    }
-  else if (orig_rvalue == NULL)
-    flags &= AARCH64_FLAG_ARG_V;
-  else if (flags & AARCH64_RET_NEED_COPY)
-    rsize = 16;
-
-  /* Allocate consectutive stack for everything we'll need.  */
-  context = alloca (sizeof(struct call_context) + stack_bytes + 32 + rsize);
-  stack = context + 1;
-  frame = stack + stack_bytes;
-  rvalue = (rsize ? frame + 32 : orig_rvalue);
-
-  arg_init (&state);
-  for (i = 0, nargs = cif->nargs; i < nargs; i++)
-    {
-      ffi_type *ty = cif->arg_types[i];
-      size_t s = ty->size;
-      void *a = avalue[i];
-      int h, t;
-
-      t = ty->type;
-      switch (t)
-	{
-	case FFI_TYPE_VOID:
-	  FFI_ASSERT (0);
-	  break;
-
-	/* If the argument is a basic type the argument is allocated to an
-	   appropriate register, or if none are available, to the stack.  */
-	case FFI_TYPE_INT:
-	case FFI_TYPE_UINT8:
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT16:
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_POINTER:
-	do_pointer:
-	  {
-	    ffi_arg ext = extend_integer_type (a, t);
-	    if (state.ngrn < N_X_ARG_REG)
-	      context->x[state.ngrn++] = ext;
-	    else
-	      {
-		void *d = allocate_to_stack (&state, stack, ty->alignment, s);
-		state.ngrn = N_X_ARG_REG;
-		/* Note that the default abi extends each argument
-		   to a full 64-bit slot, while the iOS abi allocates
-		   only enough space. */
-#ifdef __APPLE__
-		memcpy(d, a, s);
-#else
-		*(ffi_arg *)d = ext;
-#endif
-	      }
-	  }
-	  break;
-
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_DOUBLE:
-	case FFI_TYPE_LONGDOUBLE:
-	case FFI_TYPE_STRUCT:
-	case FFI_TYPE_COMPLEX:
-	  {
-	    void *dest;
-
-	    h = is_vfp_type (ty);
-	    if (h)
-	      {
-		int elems = 4 - (h & 3);
-	        if (state.nsrn + elems <= N_V_ARG_REG)
-		  {
-		    dest = &context->v[state.nsrn];
-		    state.nsrn += elems;
-		    extend_hfa_type (dest, a, h);
-		    break;
-		  }
-		state.nsrn = N_V_ARG_REG;
-		dest = allocate_to_stack (&state, stack, ty->alignment, s);
-	      }
-	    else if (s > 16)
-	      {
-		/* If the argument is a composite type that is larger than 16
-		   bytes, then the argument has been copied to memory, and
-		   the argument is replaced by a pointer to the copy.  */
-		a = &avalue[i];
-		t = FFI_TYPE_POINTER;
-		goto do_pointer;
-	      }
-	    else
-	      {
-		size_t n = (s + 7) / 8;
-		if (state.ngrn + n <= N_X_ARG_REG)
-		  {
-		    /* If the argument is a composite type and the size in
-		       double-words is not more than the number of available
-		       X registers, then the argument is copied into
-		       consecutive X registers.  */
-		    dest = &context->x[state.ngrn];
-		    state.ngrn += n;
-		  }
-		else
-		  {
-		    /* Otherwise, there are insufficient X registers. Further
-		       X register allocations are prevented, the NSAA is
-		       adjusted and the argument is copied to memory at the
-		       adjusted NSAA.  */
-		    state.ngrn = N_X_ARG_REG;
-		    dest = allocate_to_stack (&state, stack, ty->alignment, s);
-		  }
-		}
-	      memcpy (dest, a, s);
-	    }
-	  break;
-
-	default:
-	  abort();
-	}
-
-#if defined (__APPLE__)
-      if (i + 1 == cif->aarch64_nfixedargs)
-	{
-	  state.ngrn = N_X_ARG_REG;
-	  state.nsrn = N_V_ARG_REG;
-	  state.allocating_variadic = 1;
-	}
-#endif
-    }
-
-  ffi_call_SYSV (context, frame, fn, rvalue, flags, closure);
-
-  if (flags & AARCH64_RET_NEED_COPY)
-    memcpy (orig_rvalue, rvalue, rtype_size);
-}
-
-void
-ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, NULL);
-}
-
-#ifdef FFI_GO_CLOSURES
-void
-ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue,
-	     void **avalue, void *closure)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, closure);
-}
-#endif /* FFI_GO_CLOSURES */
-
-/* Build a trampoline.  */
-
-extern void ffi_closure_SYSV (void) FFI_HIDDEN;
-extern void ffi_closure_SYSV_V (void) FFI_HIDDEN;
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure *closure,
-                      ffi_cif* cif,
-                      void (*fun)(ffi_cif*,void*,void**,void*),
-                      void *user_data,
-                      void *codeloc)
-{
-  static const unsigned char trampoline[16] = {
-    0x90, 0x00, 0x00, 0x58,	/* ldr	x16, tramp+16	*/
-    0xf1, 0xff, 0xff, 0x10,	/* adr	x17, tramp+0	*/
-    0x00, 0x02, 0x1f, 0xd6	/* br	x16		*/
-  };
-  char *tramp = closure->tramp;
-  void (*start)(void);
-
-  if (cif->abi != FFI_SYSV)
-    return FFI_BAD_ABI;
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  memcpy (tramp, trampoline, sizeof(trampoline));
-
-  if (cif->flags & AARCH64_FLAG_ARG_V)
-    start = ffi_closure_SYSV_V;
-  else
-    start = ffi_closure_SYSV;
-  *(UINT64 *)(tramp + 16) = (uintptr_t)start;
-
-  ffi_clear_cache(tramp, tramp + FFI_TRAMPOLINE_SIZE);
-
-  return FFI_OK;
-}
-
-#ifdef FFI_GO_CLOSURES
-extern void ffi_go_closure_SYSV (void) FFI_HIDDEN;
-extern void ffi_go_closure_SYSV_V (void) FFI_HIDDEN;
-
-ffi_status
-ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif* cif,
-                     void (*fun)(ffi_cif*,void*,void**,void*))
-{
-  void (*start)(void);
-
-  if (cif->abi != FFI_SYSV)
-    return FFI_BAD_ABI;
-
-  if (cif->flags & AARCH64_FLAG_ARG_V)
-    start = ffi_go_closure_SYSV_V;
-  else
-    start = ffi_go_closure_SYSV;
-
-  closure->tramp = start;
-  closure->cif = cif;
-  closure->fun = fun;
-
-  return FFI_OK;
-}
-#endif /* FFI_GO_CLOSURES */
-
-/* Primary handler to setup and invoke a function within a closure.
-
-   A closure when invoked enters via the assembler wrapper
-   ffi_closure_SYSV(). The wrapper allocates a call context on the
-   stack, saves the interesting registers (from the perspective of
-   the calling convention) into the context then passes control to
-   ffi_closure_SYSV_inner() passing the saved context and a pointer to
-   the stack at the point ffi_closure_SYSV() was invoked.
-
-   On the return path the assembler wrapper will reload call context
-   registers.
-
-   ffi_closure_SYSV_inner() marshalls the call context into ffi value
-   descriptors, invokes the wrapped function, then marshalls the return
-   value back into the call context.  */
-
-int FFI_HIDDEN
-ffi_closure_SYSV_inner (ffi_cif *cif,
-			void (*fun)(ffi_cif*,void*,void**,void*),
-			void *user_data,
-			struct call_context *context,
-			void *stack, void *rvalue, void *struct_rvalue)
-{
-  void **avalue = (void**) alloca (cif->nargs * sizeof (void*));
-  int i, h, nargs, flags;
-  struct arg_state state;
-
-  arg_init (&state);
-
-  for (i = 0, nargs = cif->nargs; i < nargs; i++)
-    {
-      ffi_type *ty = cif->arg_types[i];
-      int t = ty->type;
-      size_t n, s = ty->size;
-
-      switch (t)
-	{
-	case FFI_TYPE_VOID:
-	  FFI_ASSERT (0);
-	  break;
-
-	case FFI_TYPE_INT:
-	case FFI_TYPE_UINT8:
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT16:
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_POINTER:
-	  avalue[i] = allocate_int_to_reg_or_stack (context, &state, stack, s);
-	  break;
-
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_DOUBLE:
-	case FFI_TYPE_LONGDOUBLE:
-	case FFI_TYPE_STRUCT:
-	case FFI_TYPE_COMPLEX:
-	  h = is_vfp_type (ty);
-	  if (h)
-	    {
-	      n = 4 - (h & 3);
-	      if (state.nsrn + n <= N_V_ARG_REG)
-		{
-		  void *reg = &context->v[state.nsrn];
-		  state.nsrn += n;
-
-		  /* Eeek! We need a pointer to the structure, however the
-		     homogeneous float elements are being passed in individual
-		     registers, therefore for float and double the structure
-		     is not represented as a contiguous sequence of bytes in
-		     our saved register context.  We don't need the original
-		     contents of the register storage, so we reformat the
-		     structure into the same memory.  */
-		  avalue[i] = compress_hfa_type (reg, reg, h);
-		}
-	      else
-		{
-		  state.nsrn = N_V_ARG_REG;
-		  avalue[i] = allocate_to_stack (&state, stack,
-						 ty->alignment, s);
-		}
-	    }
-	  else if (s > 16)
-	    {
-	      /* Replace Composite type of size greater than 16 with a
-		 pointer.  */
-	      avalue[i] = *(void **)
-		allocate_int_to_reg_or_stack (context, &state, stack,
-					      sizeof (void *));
-	    }
-	  else
-	    {
-	      n = (s + 7) / 8;
-	      if (state.ngrn + n <= N_X_ARG_REG)
-		{
-		  avalue[i] = &context->x[state.ngrn];
-		  state.ngrn += n;
-		}
-	      else
-		{
-		  state.ngrn = N_X_ARG_REG;
-		  avalue[i] = allocate_to_stack (&state, stack,
-						 ty->alignment, s);
-		}
-	    }
-	  break;
-
-	default:
-	  abort();
-	}
-    }
-
-  flags = cif->flags;
-  if (flags & AARCH64_RET_IN_MEM)
-    rvalue = struct_rvalue;
-
-  fun (cif, rvalue, avalue, user_data);
-
-  return flags;
-}
diff --git a/third_party/gofrontend/libffi/src/aarch64/ffitarget.h b/third_party/gofrontend/libffi/src/aarch64/ffitarget.h
deleted file mode 100644
index 80d09af..0000000
--- a/third_party/gofrontend/libffi/src/aarch64/ffitarget.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-``Software''), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#ifndef LIBFFI_ASM
-typedef unsigned long ffi_arg;
-typedef signed long ffi_sarg;
-
-typedef enum ffi_abi
-  {
-    FFI_FIRST_ABI = 0,
-    FFI_SYSV,
-    FFI_LAST_ABI,
-    FFI_DEFAULT_ABI = FFI_SYSV
-  } ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_TRAMPOLINE_SIZE 24
-#define FFI_NATIVE_RAW_API 0
-
-/* ---- Internal ---- */
-
-#if defined (__APPLE__)
-#define FFI_TARGET_SPECIFIC_VARIADIC
-#define FFI_EXTRA_CIF_FIELDS unsigned aarch64_nfixedargs
-#else
-/* iOS reserves x18 for the system.  Disable Go closures until
-   a new static chain is chosen.  */
-#define FFI_GO_CLOSURES 1
-#endif
-
-#define FFI_TARGET_HAS_COMPLEX_TYPE
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/aarch64/internal.h b/third_party/gofrontend/libffi/src/aarch64/internal.h
deleted file mode 100644
index 9c3e077..0000000
--- a/third_party/gofrontend/libffi/src/aarch64/internal.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* 
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-``Software''), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#define AARCH64_RET_VOID	0
-#define AARCH64_RET_INT64	1
-#define AARCH64_RET_INT128	2
-
-#define AARCH64_RET_UNUSED3	3
-#define AARCH64_RET_UNUSED4	4
-#define AARCH64_RET_UNUSED5	5
-#define AARCH64_RET_UNUSED6	6
-#define AARCH64_RET_UNUSED7	7
-
-/* Note that FFI_TYPE_FLOAT == 2, _DOUBLE == 3, _LONGDOUBLE == 4,
-   so _S4 through _Q1 are layed out as (TYPE * 4) + (4 - COUNT).  */
-#define AARCH64_RET_S4		8
-#define AARCH64_RET_S3		9
-#define AARCH64_RET_S2		10
-#define AARCH64_RET_S1		11
-
-#define AARCH64_RET_D4		12
-#define AARCH64_RET_D3		13
-#define AARCH64_RET_D2		14
-#define AARCH64_RET_D1		15
-
-#define AARCH64_RET_Q4		16
-#define AARCH64_RET_Q3		17
-#define AARCH64_RET_Q2		18
-#define AARCH64_RET_Q1		19
-
-/* Note that each of the sub-64-bit integers gets two entries.  */
-#define AARCH64_RET_UINT8	20
-#define AARCH64_RET_UINT16	22
-#define AARCH64_RET_UINT32	24
-
-#define AARCH64_RET_SINT8	26
-#define AARCH64_RET_SINT16	28
-#define AARCH64_RET_SINT32	30
-
-#define AARCH64_RET_MASK	31
-
-#define AARCH64_RET_IN_MEM	(1 << 5)
-#define AARCH64_RET_NEED_COPY	(1 << 6)
-
-#define AARCH64_FLAG_ARG_V_BIT	7
-#define AARCH64_FLAG_ARG_V	(1 << AARCH64_FLAG_ARG_V_BIT)
-
-#define N_X_ARG_REG		8
-#define N_V_ARG_REG		8
-#define CALL_CONTEXT_SIZE	(N_V_ARG_REG * 16 + N_X_ARG_REG * 8)
diff --git a/third_party/gofrontend/libffi/src/aarch64/sysv.S b/third_party/gofrontend/libffi/src/aarch64/sysv.S
deleted file mode 100644
index 5c9cdda..0000000
--- a/third_party/gofrontend/libffi/src/aarch64/sysv.S
+++ /dev/null
@@ -1,403 +0,0 @@
-/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-``Software''), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-#include <ffi_cfi.h>
-#include "internal.h"
-
-#ifdef HAVE_MACHINE_ASM_H
-#include <machine/asm.h>
-#else
-#ifdef __USER_LABEL_PREFIX__
-#define CONCAT1(a, b) CONCAT2(a, b)
-#define CONCAT2(a, b) a ## b
-
-/* Use the right prefix for global labels.  */
-#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
-#else
-#define CNAME(x) x
-#endif
-#endif
-
-#ifdef __AARCH64EB__
-# define BE(X)	X
-#else
-# define BE(X)	0
-#endif
-
-	.text
-	.align 4
-
-/* ffi_call_SYSV
-   extern void ffi_call_SYSV (void *stack, void *frame,
-			      void (*fn)(void), void *rvalue,
-			      int flags, void *closure);
-
-   Therefore on entry we have:
-
-   x0 stack
-   x1 frame
-   x2 fn
-   x3 rvalue
-   x4 flags
-   x5 closure
-*/
-
-	cfi_startproc
-CNAME(ffi_call_SYSV):
-	/* Use a stack frame allocated by our caller.  */
-	cfi_def_cfa(x1, 32);
-	stp	x29, x30, [x1]
-	mov	x29, x1
-	mov	sp, x0
-	cfi_def_cfa_register(x29)
-	cfi_rel_offset (x29, 0)
-	cfi_rel_offset (x30, 8)
-
-	mov	x9, x2			/* save fn */
-	mov	x8, x3			/* install structure return */
-#ifdef FFI_GO_CLOSURES
-	mov	x18, x5			/* install static chain */
-#endif
-	stp	x3, x4, [x29, #16]	/* save rvalue and flags */
-
-	/* Load the vector argument passing registers, if necessary.  */
-	tbz	w4, #AARCH64_FLAG_ARG_V_BIT, 1f
-	ldp     q0, q1, [sp, #0]
-	ldp     q2, q3, [sp, #32]
-	ldp     q4, q5, [sp, #64]
-	ldp     q6, q7, [sp, #96]
-1:
-	/* Load the core argument passing registers, including
-	   the structure return pointer.  */
-	ldp     x0, x1, [sp, #16*N_V_ARG_REG + 0]
-	ldp     x2, x3, [sp, #16*N_V_ARG_REG + 16]
-	ldp     x4, x5, [sp, #16*N_V_ARG_REG + 32]
-	ldp     x6, x7, [sp, #16*N_V_ARG_REG + 48]
-
-	/* Deallocate the context, leaving the stacked arguments.  */
-	add	sp, sp, #CALL_CONTEXT_SIZE
-
-	blr     x9			/* call fn */
-
-	ldp	x3, x4, [x29, #16]	/* reload rvalue and flags */
-
-	/* Partially deconstruct the stack frame.  */
-	mov     sp, x29
-	cfi_def_cfa_register (sp)
-	ldp     x29, x30, [x29]
-
-	/* Save the return value as directed.  */
-	adr	x5, 0f
-	and	w4, w4, #AARCH64_RET_MASK
-	add	x5, x5, x4, lsl #3
-	br	x5
-
-	/* Note that each table entry is 2 insns, and thus 8 bytes.
-	   For integer data, note that we're storing into ffi_arg
-	   and therefore we want to extend to 64 bits; these types
-	   have two consecutive entries allocated for them.  */
-	.align	4
-0:	ret				/* VOID */
-	nop
-1:	str	x0, [x3]		/* INT64 */
-	ret
-2:	stp	x0, x1, [x3]		/* INT128 */
-	ret
-3:	brk	#1000			/* UNUSED */
-	ret
-4:	brk	#1000			/* UNUSED */
-	ret
-5:	brk	#1000			/* UNUSED */
-	ret
-6:	brk	#1000			/* UNUSED */
-	ret
-7:	brk	#1000			/* UNUSED */
-	ret
-8:	st4	{ v0.s-v3.s }[0], [x3]	/* S4 */
-	ret
-9:	st3	{ v0.s-v2.s }[0], [x3]	/* S3 */
-	ret
-10:	stp	s0, s1, [x3]		/* S2 */
-	ret
-11:	str	s0, [x3]		/* S1 */
-	ret
-12:	st4	{ v0.d-v3.d }[0], [x3]	/* D4 */
-	ret
-13:	st3	{ v0.d-v2.d }[0], [x3]	/* D3 */
-	ret
-14:	stp	d0, d1, [x3]		/* D2 */
-	ret
-15:	str	d0, [x3]		/* D1 */
-	ret
-16:	str	q3, [x3, #48]		/* Q4 */
-	nop
-17:	str	q2, [x3, #32]		/* Q3 */
-	nop
-18:	stp	q0, q1, [x3]		/* Q2 */
-	ret
-19:	str	q0, [x3]		/* Q1 */
-	ret
-20:	uxtb	w0, w0			/* UINT8 */
-	str	x0, [x3]
-21:	ret				/* reserved */
-	nop
-22:	uxth	w0, w0			/* UINT16 */
-	str	x0, [x3]
-23:	ret				/* reserved */
-	nop
-24:	mov	w0, w0			/* UINT32 */
-	str	x0, [x3]
-25:	ret				/* reserved */
-	nop
-26:	sxtb	x0, w0			/* SINT8 */
-	str	x0, [x3]
-27:	ret				/* reserved */
-	nop
-28:	sxth	x0, w0			/* SINT16 */
-	str	x0, [x3]
-29:	ret				/* reserved */
-	nop
-30:	sxtw	x0, w0			/* SINT32 */
-	str	x0, [x3]
-31:	ret				/* reserved */
-	nop
-
-	cfi_endproc
-
-	.globl	CNAME(ffi_call_SYSV)
-#ifdef __ELF__
-	.type	CNAME(ffi_call_SYSV), #function
-	.hidden	CNAME(ffi_call_SYSV)
-	.size CNAME(ffi_call_SYSV), .-CNAME(ffi_call_SYSV)
-#endif
-
-/* ffi_closure_SYSV
-
-   Closure invocation glue. This is the low level code invoked directly by
-   the closure trampoline to setup and call a closure.
-
-   On entry x17 points to a struct ffi_closure, x16 has been clobbered
-   all other registers are preserved.
-
-   We allocate a call context and save the argument passing registers,
-   then invoked the generic C ffi_closure_SYSV_inner() function to do all
-   the real work, on return we load the result passing registers back from
-   the call context.
-*/
-
-#define ffi_closure_SYSV_FS (8*2 + CALL_CONTEXT_SIZE + 64)
-
-	.align 4
-CNAME(ffi_closure_SYSV_V):
-	cfi_startproc
-	stp     x29, x30, [sp, #-ffi_closure_SYSV_FS]!
-	cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
-	cfi_rel_offset (x29, 0)
-	cfi_rel_offset (x30, 8)
-
-	/* Save the argument passing vector registers.  */
-	stp     q0, q1, [sp, #16 + 0]
-	stp     q2, q3, [sp, #16 + 32]
-	stp     q4, q5, [sp, #16 + 64]
-	stp     q6, q7, [sp, #16 + 96]
-	b	0f
-	cfi_endproc
-
-	.globl	CNAME(ffi_closure_SYSV_V)
-#ifdef __ELF__
-	.type	CNAME(ffi_closure_SYSV_V), #function
-	.hidden	CNAME(ffi_closure_SYSV_V)
-	.size	CNAME(ffi_closure_SYSV_V), . - CNAME(ffi_closure_SYSV_V)
-#endif
-
-	.align	4
-	cfi_startproc
-CNAME(ffi_closure_SYSV):
-	stp     x29, x30, [sp, #-ffi_closure_SYSV_FS]!
-	cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
-	cfi_rel_offset (x29, 0)
-	cfi_rel_offset (x30, 8)
-0:
-	mov     x29, sp
-
-	/* Save the argument passing core registers.  */
-	stp     x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0]
-	stp     x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16]
-	stp     x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32]
-	stp     x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48]
-
-	/* Load ffi_closure_inner arguments.  */
-	ldp	x0, x1, [x17, #FFI_TRAMPOLINE_SIZE]	/* load cif, fn */
-	ldr	x2, [x17, #FFI_TRAMPOLINE_SIZE+16]	/* load user_data */
-.Ldo_closure:
-	add	x3, sp, #16				/* load context */
-	add	x4, sp, #ffi_closure_SYSV_FS		/* load stack */
-	add	x5, sp, #16+CALL_CONTEXT_SIZE		/* load rvalue */
-	mov	x6, x8					/* load struct_rval */
-	bl      CNAME(ffi_closure_SYSV_inner)
-
-	/* Load the return value as directed.  */
-	adr	x1, 0f
-	and	w0, w0, #AARCH64_RET_MASK
-	add	x1, x1, x0, lsl #3
-	add	x3, sp, #16+CALL_CONTEXT_SIZE
-	br	x1
-
-	/* Note that each table entry is 2 insns, and thus 8 bytes.  */
-	.align	4
-0:	b	99f			/* VOID */
-	nop
-1:	ldr	x0, [x3]		/* INT64 */
-	b	99f
-2:	ldp	x0, x1, [x3]		/* INT128 */
-	b	99f
-3:	brk	#1000			/* UNUSED */
-	nop
-4:	brk	#1000			/* UNUSED */
-	nop
-5:	brk	#1000			/* UNUSED */
-	nop
-6:	brk	#1000			/* UNUSED */
-	nop
-7:	brk	#1000			/* UNUSED */
-	nop
-8:	ldr	s3, [x3, #12]		/* S4 */
-	nop
-9:	ldr	s2, [x2, #8]		/* S3 */
-	nop
-10:	ldp	s0, s1, [x3]		/* S2 */
-	b	99f
-11:	ldr	s0, [x3]		/* S1 */
-	b	99f
-12:	ldr	d3, [x3, #24]		/* D4 */
-	nop
-13:	ldr	d2, [x3, #16]		/* D3 */
-	nop
-14:	ldp	d0, d1, [x3]		/* D2 */
-	b	99f
-15:	ldr	d0, [x3]		/* D1 */
-	b	99f
-16:	ldr	q3, [x3, #48]		/* Q4 */
-	nop
-17:	ldr	q2, [x3, #32]		/* Q3 */
-	nop
-18:	ldp	q0, q1, [x3]		/* Q2 */
-	b	99f
-19:	ldr	q0, [x3]		/* Q1 */
-	b	99f
-20:	ldrb	w0, [x3, #BE(7)]	/* UINT8 */
-	b	99f
-21:	brk	#1000			/* reserved */
-	nop
-22:	ldrh	w0, [x3, #BE(6)]	/* UINT16 */
-	b	99f
-23:	brk	#1000			/* reserved */
-	nop
-24:	ldr	w0, [x3, #BE(4)]	/* UINT32 */
-	b	99f
-25:	brk	#1000			/* reserved */
-	nop
-26:	ldrsb	x0, [x3, #BE(7)]	/* SINT8 */
-	b	99f
-27:	brk	#1000			/* reserved */
-	nop
-28:	ldrsh	x0, [x3, #BE(6)]	/* SINT16 */
-	b	99f
-29:	brk	#1000			/* reserved */
-	nop
-30:	ldrsw	x0, [x3, #BE(4)]	/* SINT32 */
-	nop
-31:					/* reserved */
-99:	ldp     x29, x30, [sp], #ffi_closure_SYSV_FS
-	cfi_adjust_cfa_offset (-ffi_closure_SYSV_FS)
-	cfi_restore (x29)
-	cfi_restore (x30)
-	ret
-	cfi_endproc
-
-	.globl	CNAME(ffi_closure_SYSV)
-#ifdef __ELF__
-	.type	CNAME(ffi_closure_SYSV), #function
-	.hidden	CNAME(ffi_closure_SYSV)
-	.size	CNAME(ffi_closure_SYSV), . - CNAME(ffi_closure_SYSV)
-#endif
-
-#ifdef FFI_GO_CLOSURES
-	.align 4
-CNAME(ffi_go_closure_SYSV_V):
-	cfi_startproc
-	stp     x29, x30, [sp, #-ffi_closure_SYSV_FS]!
-	cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
-	cfi_rel_offset (x29, 0)
-	cfi_rel_offset (x30, 8)
-
-	/* Save the argument passing vector registers.  */
-	stp     q0, q1, [sp, #16 + 0]
-	stp     q2, q3, [sp, #16 + 32]
-	stp     q4, q5, [sp, #16 + 64]
-	stp     q6, q7, [sp, #16 + 96]
-	b	0f
-	cfi_endproc
-
-	.globl	CNAME(ffi_go_closure_SYSV_V)
-#ifdef __ELF__
-	.type	CNAME(ffi_go_closure_SYSV_V), #function
-	.hidden	CNAME(ffi_go_closure_SYSV_V)
-	.size	CNAME(ffi_go_closure_SYSV_V), . - CNAME(ffi_go_closure_SYSV_V)
-#endif
-
-	.align	4
-	cfi_startproc
-CNAME(ffi_go_closure_SYSV):
-	stp     x29, x30, [sp, #-ffi_closure_SYSV_FS]!
-	cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
-	cfi_rel_offset (x29, 0)
-	cfi_rel_offset (x30, 8)
-0:
-	mov     x29, sp
-
-	/* Save the argument passing core registers.  */
-	stp     x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0]
-	stp     x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16]
-	stp     x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32]
-	stp     x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48]
-
-	/* Load ffi_closure_inner arguments.  */
-	ldp	x0, x1, [x18, #8]			/* load cif, fn */
-	mov	x2, x18					/* load user_data */
-	b	.Ldo_closure
-	cfi_endproc
-
-	.globl	CNAME(ffi_go_closure_SYSV)
-#ifdef __ELF__
-	.type	CNAME(ffi_go_closure_SYSV), #function
-	.hidden	CNAME(ffi_go_closure_SYSV)
-	.size	CNAME(ffi_go_closure_SYSV), . - CNAME(ffi_go_closure_SYSV)
-#endif
-#endif /* FFI_GO_CLOSURES */
-
-#if defined __ELF__ && defined __linux__
-	.section .note.GNU-stack,"",%progbits
-#endif
-
diff --git a/third_party/gofrontend/libffi/src/alpha/ffi.c b/third_party/gofrontend/libffi/src/alpha/ffi.c
deleted file mode 100644
index efae4cc..0000000
--- a/third_party/gofrontend/libffi/src/alpha/ffi.c
+++ /dev/null
@@ -1,521 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2012  Anthony Green
-	   Copyright (c) 1998, 2001, 2007, 2008  Red Hat, Inc.
-
-   Alpha Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-#include <stdlib.h>
-#include "internal.h"
-
-/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE;
-   all further uses in this file will refer to the 128-bit type.  */
-#if defined(__LONG_DOUBLE_128__)
-# if FFI_TYPE_LONGDOUBLE != 4
-#  error FFI_TYPE_LONGDOUBLE out of date
-# endif
-#else
-# undef FFI_TYPE_LONGDOUBLE
-# define FFI_TYPE_LONGDOUBLE 4
-#endif
-
-extern void ffi_call_osf(void *stack, void *frame, unsigned flags,
-			 void *raddr, void (*fn)(void), void *closure)
-	FFI_HIDDEN;
-extern void ffi_closure_osf(void) FFI_HIDDEN;
-extern void ffi_go_closure_osf(void) FFI_HIDDEN;
-
-/* Promote a float value to its in-register double representation.
-   Unlike actually casting to double, this does not trap on NaN.  */
-static inline UINT64 lds(void *ptr)
-{
-  UINT64 ret;
-  asm("lds %0,%1" : "=f"(ret) : "m"(*(UINT32 *)ptr));
-  return ret;
-}
-
-/* And the reverse.  */
-static inline void sts(void *ptr, UINT64 val)
-{
-  asm("sts %1,%0" : "=m"(*(UINT32 *)ptr) : "f"(val));
-}
-
-ffi_status FFI_HIDDEN
-ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  size_t bytes = 0;
-  int flags, i, avn;
-  ffi_type *rtype, *itype;
-
-  if (cif->abi != FFI_OSF)
-    return FFI_BAD_ABI;
-
-  /* Compute the size of the argument area.  */
-  for (i = 0, avn = cif->nargs; i < avn; i++)
-    {
-      itype = cif->arg_types[i];
-      switch (itype->type)
-	{
-	case FFI_TYPE_INT:
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT8:
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT16:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_POINTER:
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_DOUBLE:
-	case FFI_TYPE_LONGDOUBLE:
-	  /* All take one 8 byte slot.  */
-	  bytes += 8;
-	  break;
-
-	case FFI_TYPE_VOID:
-	case FFI_TYPE_STRUCT:
-	  /* Passed by value in N slots.  */
-	  bytes += ALIGN(itype->size, FFI_SIZEOF_ARG);
-	  break;
-
-	case FFI_TYPE_COMPLEX:
-	  /* _Complex long double passed by reference; others in 2 slots.  */
-	  if (itype->elements[0]->type == FFI_TYPE_LONGDOUBLE)
-	    bytes += 8;
-	  else
-	    bytes += 16;
-	  break;
-
-	default:
-	  abort();
-	}
-    }
-
-  /* Set the return type flag */
-  rtype = cif->rtype;
-  switch (rtype->type)
-    {
-    case FFI_TYPE_VOID:
-      flags = ALPHA_FLAGS(ALPHA_ST_VOID, ALPHA_LD_VOID);
-      break;
-    case FFI_TYPE_INT:
-    case FFI_TYPE_UINT32:
-    case FFI_TYPE_SINT32:
-      flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT32);
-      break;
-    case FFI_TYPE_FLOAT:
-      flags = ALPHA_FLAGS(ALPHA_ST_FLOAT, ALPHA_LD_FLOAT);
-      break;
-    case FFI_TYPE_DOUBLE:
-      flags = ALPHA_FLAGS(ALPHA_ST_DOUBLE, ALPHA_LD_DOUBLE);
-      break;
-    case FFI_TYPE_UINT8:
-      flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_UINT8);
-      break;
-    case FFI_TYPE_SINT8:
-      flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_SINT8);
-      break;
-    case FFI_TYPE_UINT16:
-      flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_UINT16);
-      break;
-    case FFI_TYPE_SINT16:
-      flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_SINT16);
-      break;
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_POINTER:
-      flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT64);
-      break;
-    case FFI_TYPE_LONGDOUBLE:
-    case FFI_TYPE_STRUCT:
-      /* Passed in memory, with a hidden pointer.  */
-      flags = ALPHA_RET_IN_MEM;
-      break;
-    case FFI_TYPE_COMPLEX:
-      itype = rtype->elements[0];
-      switch (itype->type)
-	{
-	case FFI_TYPE_FLOAT:
-	  flags = ALPHA_FLAGS(ALPHA_ST_CPLXF, ALPHA_LD_CPLXF);
-	  break;
-	case FFI_TYPE_DOUBLE:
-	  flags = ALPHA_FLAGS(ALPHA_ST_CPLXD, ALPHA_LD_CPLXD);
-	  break;
-	default:
-	  if (rtype->size <= 8)
-	    flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT64);
-	  else
-	    flags = ALPHA_RET_IN_MEM;
-	  break;
-	}
-      break;
-    default:
-      abort();
-    }
-  cif->flags = flags;
-
-  /* Include the hidden structure pointer in args requirement.  */
-  if (flags == ALPHA_RET_IN_MEM)
-    bytes += 8;
-  /* Minimum size is 6 slots, so that ffi_call_osf can pop them.  */
-  if (bytes < 6*8)
-    bytes = 6*8;
-  cif->bytes = bytes;
-
-  return FFI_OK;
-}
-
-static unsigned long
-extend_basic_type(void *valp, int type, int argn)
-{
-  switch (type)
-    {
-    case FFI_TYPE_SINT8:
-      return *(SINT8 *)valp;
-    case FFI_TYPE_UINT8:
-      return *(UINT8 *)valp;
-    case FFI_TYPE_SINT16:
-      return *(SINT16 *)valp;
-    case FFI_TYPE_UINT16:
-      return *(UINT16 *)valp;
-
-    case FFI_TYPE_FLOAT:
-      if (argn < 6)
-	return lds(valp);
-      /* FALLTHRU */
-
-    case FFI_TYPE_INT:
-    case FFI_TYPE_SINT32:
-    case FFI_TYPE_UINT32:
-      /* Note that unsigned 32-bit quantities are sign extended.  */
-      return *(SINT32 *)valp;
-
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_POINTER:
-    case FFI_TYPE_DOUBLE:
-      return *(UINT64 *)valp;
-
-    default:
-      abort();
-    }
-}
-
-static void
-ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
-	      void **avalue, void *closure)
-{
-  unsigned long *argp;
-  long i, avn, argn, flags = cif->flags;
-  ffi_type **arg_types;
-  void *frame;
-
-  /* If the return value is a struct and we don't have a return
-     value address then we need to make one.  */
-  if (rvalue == NULL && flags == ALPHA_RET_IN_MEM)
-    rvalue = alloca(cif->rtype->size);
-
-  /* Allocate the space for the arguments, plus 4 words of temp
-     space for ffi_call_osf.  */
-  argp = frame = alloca(cif->bytes + 4*FFI_SIZEOF_ARG);
-  frame += cif->bytes;
-
-  argn = 0;
-  if (flags == ALPHA_RET_IN_MEM)
-    argp[argn++] = (unsigned long)rvalue;
-
-  avn = cif->nargs;
-  arg_types = cif->arg_types;
-
-  for (i = 0, avn = cif->nargs; i < avn; i++)
-    {
-      ffi_type *ty = arg_types[i];
-      void *valp = avalue[i];
-      int type = ty->type;
-      size_t size;
-
-      switch (type)
-	{
-	case FFI_TYPE_INT:
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT8:
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT16:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_POINTER:
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_DOUBLE:
-	  argp[argn] = extend_basic_type(valp, type, argn);
-	  argn++;
-	  break;
-
-	case FFI_TYPE_LONGDOUBLE:
-	by_reference:
-	  /* Note that 128-bit long double is passed by reference.  */
-	  argp[argn++] = (unsigned long)valp;
-	  break;
-
-	case FFI_TYPE_VOID:
-	case FFI_TYPE_STRUCT:
-	  size = ty->size;
-	  memcpy(argp + argn, valp, size);
-	  argn += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
-	  break;
-
-	case FFI_TYPE_COMPLEX:
-	  type = ty->elements[0]->type;
-	  if (type == FFI_TYPE_LONGDOUBLE)
-	    goto by_reference;
-
-	  /* Most complex types passed as two separate arguments.  */
-	  size = ty->elements[0]->size;
-	  argp[argn] = extend_basic_type(valp, type, argn);
-	  argp[argn + 1] = extend_basic_type(valp + size, type, argn + 1);
-	  argn += 2;
-	  break;
-
-	default:
-	  abort();
-	}
-    }
-
-  flags = (flags >> ALPHA_ST_SHIFT) & 0xff;
-  ffi_call_osf(argp, frame, flags, rvalue, fn, closure);
-}
-
-void
-ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  ffi_call_int(cif, fn, rvalue, avalue, NULL);
-}
-
-void
-ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
-	     void **avalue, void *closure)
-{
-  ffi_call_int(cif, fn, rvalue, avalue, closure);
-}
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun)(ffi_cif*, void*, void**, void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  unsigned int *tramp;
-
-  if (cif->abi != FFI_OSF)
-    return FFI_BAD_ABI;
-
-  tramp = (unsigned int *) &closure->tramp[0];
-  tramp[0] = 0x47fb0401;	/* mov $27,$1		*/
-  tramp[1] = 0xa77b0010;	/* ldq $27,16($27)	*/
-  tramp[2] = 0x6bfb0000;	/* jmp $31,($27),0	*/
-  tramp[3] = 0x47ff041f;	/* nop			*/
-  *(void **) &tramp[4] = ffi_closure_osf;
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  /* Flush the Icache.
-
-     Tru64 UNIX as doesn't understand the imb mnemonic, so use call_pal
-     instead, since both Compaq as and gas can handle it.
-
-     0x86 is PAL_imb in Tru64 UNIX <alpha/pal.h>.  */
-  asm volatile ("call_pal 0x86" : : : "memory");
-
-  return FFI_OK;
-}
-
-ffi_status
-ffi_prep_go_closure (ffi_go_closure* closure,
-		     ffi_cif* cif,
-		     void (*fun)(ffi_cif*, void*, void**, void*))
-{
-  if (cif->abi != FFI_OSF)
-    return FFI_BAD_ABI;
-
-  closure->tramp = (void *)ffi_go_closure_osf;
-  closure->cif = cif;
-  closure->fun = fun;
-
-  return FFI_OK;
-}
-
-long FFI_HIDDEN
-ffi_closure_osf_inner (ffi_cif *cif,
-		       void (*fun)(ffi_cif*, void*, void**, void*),
-		       void *user_data,
-		       void *rvalue, unsigned long *argp)
-{
-  void **avalue;
-  ffi_type **arg_types;
-  long i, avn, argn, flags;
-
-  avalue = alloca(cif->nargs * sizeof(void *));
-  flags = cif->flags;
-  argn = 0;
-
-  /* Copy the caller's structure return address to that the closure
-     returns the data directly to the caller.  */
-  if (flags == ALPHA_RET_IN_MEM)
-    {
-      rvalue = (void *) argp[0];
-      argn = 1;
-    }
-
-  arg_types = cif->arg_types;
-
-  /* Grab the addresses of the arguments from the stack frame.  */
-  for (i = 0, avn = cif->nargs; i < avn; i++)
-    {
-      ffi_type *ty = arg_types[i];
-      int type = ty->type;
-      void *valp = &argp[argn];
-      size_t size;
-
-      switch (type)
-	{
-	case FFI_TYPE_INT:
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT8:
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT16:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_POINTER:
-	  argn += 1;
-	  break;
-
-	case FFI_TYPE_VOID:
-	case FFI_TYPE_STRUCT:
-	  size = ty->size;
-	  argn += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
-	  break;
-
-	case FFI_TYPE_FLOAT:
-	  /* Floats coming from registers need conversion from double
-	     back to float format.  */
-	  if (argn < 6)
-	    {
-	      valp = &argp[argn - 6];
-	      sts(valp, argp[argn - 6]);
-	    }
-	  argn += 1;
-	  break;
-
-	case FFI_TYPE_DOUBLE:
-	  if (argn < 6)
-	    valp = &argp[argn - 6];
-	  argn += 1;
-	  break;
-
-	case FFI_TYPE_LONGDOUBLE:
-	by_reference:
-	  /* 128-bit long double is passed by reference.  */
-	  valp = (void *)argp[argn];
-	  argn += 1;
-	  break;
-
-	case FFI_TYPE_COMPLEX:
-	  type = ty->elements[0]->type;
-	  switch (type)
-	    {
-	    case FFI_TYPE_SINT64:
-	    case FFI_TYPE_UINT64:
-	      /* Passed as separate arguments, but they wind up sequential.  */
-	      break;
-
-	    case FFI_TYPE_INT:
-	    case FFI_TYPE_SINT8:
-	    case FFI_TYPE_UINT8:
-	    case FFI_TYPE_SINT16:
-	    case FFI_TYPE_UINT16:
-	    case FFI_TYPE_SINT32:
-	    case FFI_TYPE_UINT32:
-	      /* Passed as separate arguments.  Disjoint, but there's room
-		 enough in one slot to hold the pair.  */
-	      size = ty->elements[0]->size;
-	      memcpy(valp + size, valp + 8, size);
-	      break;
-
-	    case FFI_TYPE_FLOAT:
-	      /* Passed as separate arguments.  Disjoint, and each piece
-		 may need conversion back to float.  */
-	      if (argn < 6)
-		{
-		  valp = &argp[argn - 6];
-		  sts(valp, argp[argn - 6]);
-		}
-	      if (argn + 1 < 6)
-		sts(valp + 4, argp[argn + 1 - 6]);
-	      else
-		*(UINT32 *)(valp + 4) = argp[argn + 1];
-	      break;
-
-	    case FFI_TYPE_DOUBLE:
-	      /* Passed as separate arguments.  Only disjoint if one part
-		 is in fp regs and the other is on the stack.  */
-	      if (argn < 5)
-		valp = &argp[argn - 6];
-	      else if (argn == 5)
-		{
-		  valp = alloca(16);
-		  ((UINT64 *)valp)[0] = argp[5 - 6];
-		  ((UINT64 *)valp)[1] = argp[6];
-		}
-	      break;
-
-	    case FFI_TYPE_LONGDOUBLE:
-	      goto by_reference;
-
-	    default:
-	      abort();
-	    }
-	  argn += 2;
-	  break;
-
-	default:
-	  abort ();
-	}
-
-      avalue[i] = valp;
-    }
-
-  /* Invoke the closure.  */
-  fun (cif, rvalue, avalue, user_data);
-
-  /* Tell ffi_closure_osf how to perform return type promotions.  */
-  return (flags >> ALPHA_LD_SHIFT) & 0xff;
-}
diff --git a/third_party/gofrontend/libffi/src/alpha/ffitarget.h b/third_party/gofrontend/libffi/src/alpha/ffitarget.h
deleted file mode 100644
index a02dbd0..0000000
--- a/third_party/gofrontend/libffi/src/alpha/ffitarget.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 1996-2003  Red Hat, Inc.
-   Target configuration macros for Alpha.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_OSF,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_OSF
-} ffi_abi;
-#endif
-
-#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION
-#define FFI_TARGET_HAS_COMPLEX_TYPE
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_GO_CLOSURES 1
-#define FFI_TRAMPOLINE_SIZE 24
-#define FFI_NATIVE_RAW_API 0
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/alpha/internal.h b/third_party/gofrontend/libffi/src/alpha/internal.h
deleted file mode 100644
index 44da192..0000000
--- a/third_party/gofrontend/libffi/src/alpha/internal.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#define ALPHA_ST_VOID	0
-#define ALPHA_ST_INT	1
-#define ALPHA_ST_FLOAT	2
-#define ALPHA_ST_DOUBLE	3
-#define ALPHA_ST_CPLXF	4
-#define ALPHA_ST_CPLXD	5
-
-#define ALPHA_LD_VOID	0
-#define ALPHA_LD_INT64	1
-#define ALPHA_LD_INT32	2
-#define ALPHA_LD_UINT16	3
-#define ALPHA_LD_SINT16	4
-#define ALPHA_LD_UINT8	5
-#define ALPHA_LD_SINT8	6
-#define ALPHA_LD_FLOAT	7
-#define ALPHA_LD_DOUBLE	8
-#define ALPHA_LD_CPLXF	9
-#define ALPHA_LD_CPLXD	10
-
-#define ALPHA_ST_SHIFT		0
-#define ALPHA_LD_SHIFT		8
-#define ALPHA_RET_IN_MEM	0x10000
-#define ALPHA_FLAGS(S, L)	(((L) << ALPHA_LD_SHIFT) | (S))
diff --git a/third_party/gofrontend/libffi/src/alpha/osf.S b/third_party/gofrontend/libffi/src/alpha/osf.S
deleted file mode 100644
index b031828..0000000
--- a/third_party/gofrontend/libffi/src/alpha/osf.S
+++ /dev/null
@@ -1,282 +0,0 @@
-/* -----------------------------------------------------------------------
-   osf.S - Copyright (c) 1998, 2001, 2007, 2008, 2011, 2014 Red Hat
-
-   Alpha/OSF Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-#include <ffi_cfi.h>
-#include "internal.h"
-
-	.arch ev6
-	.text
-
-/* Aid in building a direct addressed jump table, 4 insns per entry.  */
-.macro E index
-	.align	4
-	.org	99b + \index * 16
-.endm
-
-/* ffi_call_osf (void *stack, void *frame, unsigned flags,
-		 void *raddr, void (*fnaddr)(void), void *closure)
-
-   Bit o trickiness here -- FRAME is the base of the stack frame
-   for this function.  This has been allocated by ffi_call.  We also
-   deallocate some of the stack that has been alloca'd.  */
-
-	.align	4
-	.globl	ffi_call_osf
-	.ent	ffi_call_osf
-	FFI_HIDDEN(ffi_call_osf)
-
-ffi_call_osf:
-	cfi_startproc
-	cfi_def_cfa($17, 32)
-	mov	$16, $30
-	stq	$26, 0($17)
-	stq	$15, 8($17)
-	mov	$17, $15
-	.prologue 0
-	cfi_def_cfa_register($15)
-	cfi_rel_offset($26, 0)
-	cfi_rel_offset($15, 8)
-
-	stq	$18, 16($17)		# save flags into frame
-	stq	$19, 24($17)		# save rvalue into frame
-	mov	$20, $27		# fn into place for call
-	mov	$21, $1			# closure into static chain
-
-	# Load up all of the (potential) argument registers.
-	ldq	$16, 0($30)
-	ldt	$f16, 0($30)
-	ldt	$f17, 8($30)
-	ldq	$17, 8($30)
-	ldt	$f18, 16($30)
-	ldq	$18, 16($30)
-	ldt	$f19, 24($30)
-	ldq	$19, 24($30)
-	ldt	$f20, 32($30)
-	ldq	$20, 32($30)
-	ldt	$f21, 40($30)
-	ldq	$21, 40($30)
-
-	# Deallocate the register argument area.
-	lda	$30, 48($30)
-
-	jsr	$26, ($27), 0
-0:
-	ldah	$29, 0($26)		!gpdisp!1
-	ldq	$2, 24($15)		# reload rvalue
-	lda	$29, 0($29)		!gpdisp!1
-	ldq	$3, 16($15)		# reload flags
-	lda	$1, 99f-0b($26)
-	ldq	$26, 0($15)
-	ldq	$15, 8($15)
-	cfi_restore($26)
-	cfi_restore($15)
-	cfi_def_cfa($sp, 0)
-	cmoveq	$2, ALPHA_ST_VOID, $3	# mash null rvalue to void
-	addq	$3, $3, $3
-	s8addq	$3, $1, $1		# 99f + stcode * 16
-	jmp	$31, ($1), $st_int
-
-	.align	4
-99:
-E ALPHA_ST_VOID
-	ret
-E ALPHA_ST_INT
-$st_int:
-	stq	$0, 0($2)
-	ret
-E ALPHA_ST_FLOAT
-	sts	$f0, 0($2)
-	ret
-E ALPHA_ST_DOUBLE
-	stt	$f0, 0($2)
-	ret
-E ALPHA_ST_CPLXF
-	sts	$f0, 0($2)
-	sts	$f1, 4($2)
-	ret
-E ALPHA_ST_CPLXD
-	stt	$f0, 0($2)
-	stt	$f1, 8($2)
-	ret
-
-	cfi_endproc
-	.end	ffi_call_osf
-
-/* ffi_closure_osf(...)
-
-   Receives the closure argument in $1.   */
-
-#define CLOSURE_FS	(16*8)
-
-	.align	4
-	.globl	ffi_go_closure_osf
-	.ent	ffi_go_closure_osf
-	FFI_HIDDEN(ffi_go_closure_osf)
-
-ffi_go_closure_osf:
-	cfi_startproc
-	ldgp	$29, 0($27)
-	subq	$30, CLOSURE_FS, $30
-	cfi_adjust_cfa_offset(CLOSURE_FS)
-	stq	$26, 0($30)
-	.prologue 1
-	cfi_rel_offset($26, 0)
-
-	stq	$16, 10*8($30)
-	stq	$17, 11*8($30)
-	stq	$18, 12*8($30)
-
-	ldq	$16, 8($1)			# load cif
-	ldq	$17, 16($1)			# load fun
-	mov	$1, $18				# closure is user_data
-	br	$do_closure
-
-	cfi_endproc
-	.end	ffi_go_closure_osf
-
-	.align	4
-	.globl	ffi_closure_osf
-	.ent	ffi_closure_osf
-	FFI_HIDDEN(ffi_closure_osf)
-
-ffi_closure_osf:
-	cfi_startproc
-	ldgp	$29, 0($27)
-	subq	$30, CLOSURE_FS, $30
-	cfi_adjust_cfa_offset(CLOSURE_FS)
-	stq	$26, 0($30)
-	.prologue 1
-	cfi_rel_offset($26, 0)
-
-	# Store all of the potential argument registers in va_list format.
-	stq	$16, 10*8($30)
-	stq	$17, 11*8($30)
-	stq	$18, 12*8($30)
-
-	ldq	$16, 24($1)			# load cif
-	ldq	$17, 32($1)			# load fun
-	ldq	$18, 40($1)			# load user_data
-
-$do_closure:
-	stq	$19, 13*8($30)
-	stq	$20, 14*8($30)
-	stq	$21, 15*8($30)
-	stt	$f16, 4*8($30)
-	stt	$f17, 5*8($30)
-	stt	$f18, 6*8($30)
-	stt	$f19, 7*8($30)
-	stt	$f20, 8*8($30)
-	stt	$f21, 9*8($30)
-
-	# Call ffi_closure_osf_inner to do the bulk of the work.
-	lda	$19, 2*8($30)
-	lda	$20, 10*8($30)
-	jsr	$26, ffi_closure_osf_inner
-0:
-	ldah	$29, 0($26)			!gpdisp!2
-	lda	$2, 99f-0b($26)
-	s4addq	$0, 0, $1			# ldcode * 4
-	ldq	$0, 16($30)			# preload return value
-	s4addq	$1, $2, $1			# 99f + ldcode * 16
-	lda	$29, 0($29)			!gpdisp!2
-	ldq	$26, 0($30)
-	cfi_restore($26)
-	jmp	$31, ($1), $load_32
-
-.macro epilogue
-	addq	$30, CLOSURE_FS, $30
-	cfi_adjust_cfa_offset(-CLOSURE_FS)
-	ret
-	.align	4
-	cfi_adjust_cfa_offset(CLOSURE_FS)
-.endm
-
-	.align 4
-99:
-E ALPHA_LD_VOID
-	epilogue
-
-E ALPHA_LD_INT64
-	epilogue
-
-E ALPHA_LD_INT32
-$load_32:
-	sextl	$0, $0
-	epilogue
-
-E ALPHA_LD_UINT16
-	zapnot	$0, 3, $0
-	epilogue
-
-E ALPHA_LD_SINT16
-#ifdef __alpha_bwx__
-	sextw	$0, $0
-#else
-	sll	$0, 48, $0
-	sra	$0, 48, $0
-#endif
-	epilogue
-
-E ALPHA_LD_UINT8
-	and	$0, 0xff, $0
-	epilogue
-
-E ALPHA_LD_SINT8
-#ifdef __alpha_bwx__
-	sextb	$0, $0
-#else
-	sll	$0, 56, $0
-	sra	$0, 56, $0
-#endif
-	epilogue
-
-E ALPHA_LD_FLOAT
-	lds	$f0, 16($sp)
-	epilogue
-
-E ALPHA_LD_DOUBLE
-	ldt	$f0, 16($sp)
-	epilogue
-
-E ALPHA_LD_CPLXF
-	lds	$f0, 16($sp)
-	lds	$f1, 20($sp)
-	epilogue
-
-E ALPHA_LD_CPLXD
-	ldt	$f0, 16($sp)
-	ldt	$f1, 24($sp)
-	epilogue
-
-	cfi_endproc
-	.end	ffi_closure_osf
-
-#if defined __ELF__ && defined __linux__
-	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/third_party/gofrontend/libffi/src/arc/arcompact.S b/third_party/gofrontend/libffi/src/arc/arcompact.S
deleted file mode 100644
index 03715fd..0000000
--- a/third_party/gofrontend/libffi/src/arc/arcompact.S
+++ /dev/null
@@ -1,135 +0,0 @@
-/* -----------------------------------------------------------------------
-   arcompact.S - Copyright (c) 2013 Synposys, Inc. (www.synopsys.com)
-   
-   ARCompact Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-#ifdef HAVE_MACHINE_ASM_H
-#include <machine/asm.h>
-#else
-#define CNAME(x) x
-#define ENTRY(x) .globl CNAME(x)` .type CNAME(x),%function` CNAME(x):
-#endif
-
-.text
-
-        /* R0:   ffi_prep_args */
-        /* R1:   &ecif */
-        /* R2:   cif->bytes */
-        /* R3:   fig->flags */
-        /* R4:   ecif.rvalue */
-        /* R5:   fn */
-ENTRY(ffi_call_ARCompact)
-        /* Save registers.  */
-        st.a       fp, [sp, -4]        /* fp + 20, fp */
-        push_s     blink               /* fp + 16, blink */
-        st.a       r4, [sp, -4]        /* fp + 12, ecif.rvalue */
-        push_s     r3                  /* fp +  8, fig->flags */
-        st.a       r5, [sp, -4]        /* fp +  4, fn */
-        push_s     r2                  /* fp +  0, cif->bytes */
-        mov        fp, sp
-
-        /* Make room for all of the new args.  */
-        sub        sp, sp, r2
-
-        /* Place all of the ffi_prep_args in position.  */
-        /* ffi_prep_args(char *stack, extended_cif *ecif) */
-        /* R1 already set.  */
-
-        /* And call.  */
-        jl_s.d     [r0]
-        mov_s      r0, sp
-
-        ld.ab      r12, [fp, 4]        /* cif->bytes */
-        ld.ab      r11, [fp, 4]        /* fn */
-
-        /* Move first 8 parameters in registers...  */
-        ld_s       r0, [sp]
-        ld_s       r1, [sp, 4]
-        ld_s       r2, [sp, 8]
-        ld_s       r3, [sp, 12]
-        ld         r4, [sp, 16]
-        ld         r5, [sp, 20]
-        ld         r6, [sp, 24]
-        ld         r7, [sp, 28]
-
-        /* ...and adjust the stack.  */
-        min        r12, r12, 32
-
-        /* Call the function.  */
-        jl.d       [r11]
-        add        sp, sp, r12 
-
-        mov        sp, fp        
-        pop_s      r3        /* fig->flags, return type */
-        pop_s      r2        /* ecif.rvalue, pointer for return value */
-
-        /* If the return value pointer is NULL, assume no return value.  */
-        breq.d     r2, 0, epilogue
-        pop_s      blink
-
-        /* Return INT.  */
-        brne       r3, FFI_TYPE_INT, return_double
-        b.d        epilogue
-        st_s       r0, [r2]        
-
-return_double:
-        brne       r3, FFI_TYPE_DOUBLE, epilogue
-        st_s       r0, [r2]        
-        st_s       r1, [r2,4]
-
-epilogue:
-        j_s.d      [blink]
-        ld.ab      fp, [sp, 4]
-
-ENTRY(ffi_closure_ARCompact)
-        st.a       r0, [sp, -32]
-        st_s       r1, [sp, 4]
-        st_s       r2, [sp, 8]
-        st_s       r3, [sp, 12]
-        st         r4, [sp, 16]
-        st         r5, [sp, 20]
-        st         r6, [sp, 24]
-        st         r7, [sp, 28]
-
-        /* pointer to arguments */
-        mov_s      r2, sp
-
-        /* return value goes here */
-        sub        sp, sp, 8
-        mov_s      r1, sp
-
-        push_s     blink
-        
-        bl.d       ffi_closure_inner_ARCompact
-        mov_s      r0, r8                /* codeloc, set by trampoline */
-
-        pop_s      blink
-
-        /* set return value to r1:r0 */
-        pop_s      r0
-        pop_s      r1
-        j_s.d      [blink]
-        add_s      sp, sp, 32
diff --git a/third_party/gofrontend/libffi/src/arc/ffi.c b/third_party/gofrontend/libffi/src/arc/ffi.c
deleted file mode 100644
index 32f82a7..0000000
--- a/third_party/gofrontend/libffi/src/arc/ffi.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2013  Synopsys, Inc. (www.synopsys.com)
-   
-   ARC Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-#include <stdint.h>
-
-#include <sys/cachectl.h>
-
-/* for little endian ARC, the code is in fact stored as mixed endian for
-   performance reasons */
-#if __BIG_ENDIAN__
-#define CODE_ENDIAN(x) (x)
-#else
-#define CODE_ENDIAN(x) ( (((uint32_t) (x)) << 16) | (((uint32_t) (x)) >> 16))
-#endif
-
-/* ffi_prep_args is called by the assembly routine once stack
-   space has been allocated for the function's arguments.  */
-
-void
-ffi_prep_args (char *stack, extended_cif * ecif)
-{
-  unsigned int i;
-  int tmp;
-  void **p_argv;
-  char *argp;
-  ffi_type **p_arg;
-
-  tmp = 0;
-  argp = stack;
-
-  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT)
-    {
-      *(void **) argp = ecif->rvalue;
-      argp += 4;
-    }
-
-  p_argv = ecif->avalue;
-
-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
-       (i != 0); i--, p_arg++)
-    {
-      size_t z;
-      int alignment;
-
-      /* align alignment to 4 */
-      alignment = (((*p_arg)->alignment - 1) | 3) + 1;
-
-      /* Align if necessary.  */
-      if ((alignment - 1) & (unsigned) argp)
-	argp = (char *) ALIGN (argp, alignment);
-
-      z = (*p_arg)->size;
-      if (z < sizeof (int))
-	{
-	  z = sizeof (int);
-
-	  switch ((*p_arg)->type)
-	    {
-	    case FFI_TYPE_SINT8:
-	      *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv);
-	      break;
-
-	    case FFI_TYPE_UINT8:
-	      *(unsigned int *) argp = (unsigned int) *(UINT8 *) (*p_argv);
-	      break;
-
-	    case FFI_TYPE_SINT16:
-	      *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv);
-	      break;
-
-	    case FFI_TYPE_UINT16:
-	      *(unsigned int *) argp = (unsigned int) *(UINT16 *) (*p_argv);
-	      break;
-
-	    case FFI_TYPE_STRUCT:
-	      memcpy (argp, *p_argv, (*p_arg)->size);
-	      break;
-
-	    default:
-	      FFI_ASSERT (0);
-	    }
-	}
-      else if (z == sizeof (int))
-	{
-	  *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv);
-	}
-      else
-	{
-	  if ((*p_arg)->type == FFI_TYPE_STRUCT)
-	    {
-	      memcpy (argp, *p_argv, z);
-	    }
-	  else
-	    {
-	      /* Double or long long 64bit.  */
-	      memcpy (argp, *p_argv, z);
-	    }
-	}
-      p_argv++;
-      argp += z;
-    }
-
-  return;
-}
-
-/* Perform machine dependent cif processing.  */
-ffi_status
-ffi_prep_cif_machdep (ffi_cif * cif)
-{
-  /* Set the return type flag.  */
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_VOID:
-      cif->flags = (unsigned) cif->rtype->type;
-      break;
-
-    case FFI_TYPE_STRUCT:
-      cif->flags = (unsigned) cif->rtype->type;
-      break;
-
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_DOUBLE:
-      cif->flags = FFI_TYPE_DOUBLE;
-      break;
-
-    case FFI_TYPE_FLOAT:
-    default:
-      cif->flags = FFI_TYPE_INT;
-      break;
-    }
-
-  return FFI_OK;
-}
-
-extern void ffi_call_ARCompact (void (*)(char *, extended_cif *),
-				extended_cif *, unsigned, unsigned,
-				unsigned *, void (*fn) (void));
-
-void
-ffi_call (ffi_cif * cif, void (*fn) (void), void *rvalue, void **avalue)
-{
-  extended_cif ecif;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-
-  /* If the return value is a struct and we don't have
-     a return value address then we need to make one.  */
-  if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT))
-    {
-      ecif.rvalue = alloca (cif->rtype->size);
-    }
-  else
-    ecif.rvalue = rvalue;
-
-  switch (cif->abi)
-    {
-    case FFI_ARCOMPACT:
-      ffi_call_ARCompact (ffi_prep_args, &ecif, cif->bytes,
-			  cif->flags, ecif.rvalue, fn);
-      break;
-
-    default:
-      FFI_ASSERT (0);
-      break;
-    }
-}
-
-int
-ffi_closure_inner_ARCompact (ffi_closure * closure, void *rvalue,
-			     ffi_arg * args)
-{
-  void **arg_area, **p_argv;
-  ffi_cif *cif = closure->cif;
-  char *argp = (char *) args;
-  ffi_type **p_argt;
-  int i;
-
-  arg_area = (void **) alloca (cif->nargs * sizeof (void *));
-
-  /* handle hidden argument */
-  if (cif->flags == FFI_TYPE_STRUCT)
-    {
-      rvalue = *(void **) argp;
-      argp += 4;
-    }
-
-  p_argv = arg_area;
-
-  for (i = 0, p_argt = cif->arg_types; i < cif->nargs;
-       i++, p_argt++, p_argv++)
-    {
-      size_t z;
-      int alignment;
-
-      /* align alignment to 4 */
-      alignment = (((*p_argt)->alignment - 1) | 3) + 1;
-
-      /* Align if necessary.  */
-      if ((alignment - 1) & (unsigned) argp)
-	argp = (char *) ALIGN (argp, alignment);
-
-      z = (*p_argt)->size;
-      *p_argv = (void *) argp;
-      argp += z;
-    }
-
-  (closure->fun) (cif, rvalue, arg_area, closure->user_data);
-
-  return cif->flags;
-}
-
-extern void ffi_closure_ARCompact (void);
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure * closure, ffi_cif * cif,
-		      void (*fun) (ffi_cif *, void *, void **, void *),
-		      void *user_data, void *codeloc)
-{
-  uint32_t *tramp = (uint32_t *) & (closure->tramp[0]);
-
-  switch (cif->abi)
-    {
-    case FFI_ARCOMPACT:
-      FFI_ASSERT (tramp == codeloc);
-      tramp[0] = CODE_ENDIAN (0x200a1fc0);	/* mov r8, pcl  */
-      tramp[1] = CODE_ENDIAN (0x20200f80);	/* j [long imm] */
-      tramp[2] = CODE_ENDIAN (ffi_closure_ARCompact);
-      break;
-
-    default:
-      return FFI_BAD_ABI;
-    }
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-  cacheflush (codeloc, FFI_TRAMPOLINE_SIZE, BCACHE);
-
-  return FFI_OK;
-}
diff --git a/third_party/gofrontend/libffi/src/arc/ffitarget.h b/third_party/gofrontend/libffi/src/arc/ffitarget.h
deleted file mode 100644
index bf8311b..0000000
--- a/third_party/gofrontend/libffi/src/arc/ffitarget.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 2013  Synopsys, Inc. (www.synopsys.com)
-   Target configuration macros for ARC.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-/* ---- Generic type definitions ----------------------------------------- */
-
-#ifndef LIBFFI_ASM
-typedef unsigned long ffi_arg;
-typedef signed long ffi_sarg;
-
-typedef enum ffi_abi
-{
-  FFI_FIRST_ABI = 0,
-  FFI_ARCOMPACT,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_ARCOMPACT
-} ffi_abi;
-#endif
-
-#define FFI_CLOSURES 		1
-#define FFI_TRAMPOLINE_SIZE	12
-#define FFI_NATIVE_RAW_API 	0
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/arm/ffi.c b/third_party/gofrontend/libffi/src/arm/ffi.c
deleted file mode 100644
index 9c8732d..0000000
--- a/third_party/gofrontend/libffi/src/arm/ffi.c
+++ /dev/null
@@ -1,1043 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2011 Timothy Wall
-           Copyright (c) 2011 Plausible Labs Cooperative, Inc.
-           Copyright (c) 2011 Anthony Green
-	   Copyright (c) 2011 Free Software Foundation
-           Copyright (c) 1998, 2008, 2011  Red Hat, Inc.
-
-   ARM Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-#include <stdlib.h>
-#include "internal.h"
-
-/* Forward declares. */
-static int vfp_type_p (const ffi_type *);
-static void layout_vfp_args (ffi_cif *);
-
-static void *
-ffi_align (ffi_type *ty, void *p)
-{
-  /* Align if necessary */
-  size_t alignment;
-#ifdef _WIN32_WCE
-  alignment = 4;
-#else
-  alignment = ty->alignment;
-  if (alignment < 4)
-    alignment = 4;
-#endif
-  return (void *) ALIGN (p, alignment);
-}
-
-static size_t
-ffi_put_arg (ffi_type *ty, void *src, void *dst)
-{
-  size_t z = ty->size;
-
-  switch (ty->type)
-    {
-    case FFI_TYPE_SINT8:
-      *(UINT32 *)dst = *(SINT8 *)src;
-      break;
-    case FFI_TYPE_UINT8:
-      *(UINT32 *)dst = *(UINT8 *)src;
-      break;
-    case FFI_TYPE_SINT16:
-      *(UINT32 *)dst = *(SINT16 *)src;
-      break;
-    case FFI_TYPE_UINT16:
-      *(UINT32 *)dst = *(UINT16 *)src;
-      break;
-
-    case FFI_TYPE_INT:
-    case FFI_TYPE_SINT32:
-    case FFI_TYPE_UINT32:
-    case FFI_TYPE_POINTER:
-    case FFI_TYPE_FLOAT:
-      *(UINT32 *)dst = *(UINT32 *)src;
-      break;
-
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_DOUBLE:
-      *(UINT64 *)dst = *(UINT64 *)src;
-      break;
-
-    case FFI_TYPE_STRUCT:
-    case FFI_TYPE_COMPLEX:
-      memcpy (dst, src, z);
-      break;
-
-    default:
-      abort();
-    }
-
-  return ALIGN (z, 4);
-}
-
-/* ffi_prep_args is called once stack space has been allocated
-   for the function's arguments.
-
-   The vfp_space parameter is the load area for VFP regs, the return
-   value is cif->vfp_used (word bitset of VFP regs used for passing
-   arguments). These are only used for the VFP hard-float ABI.
-*/
-static void
-ffi_prep_args_SYSV (ffi_cif *cif, int flags, void *rvalue,
-		    void **avalue, char *argp)
-{
-  ffi_type **arg_types = cif->arg_types;
-  int i, n;
-
-  if (flags == ARM_TYPE_STRUCT)
-    {
-      *(void **) argp = rvalue;
-      argp += 4;
-    }
-
-  for (i = 0, n = cif->nargs; i < n; i++)
-    {
-      ffi_type *ty = arg_types[i];
-      argp = ffi_align (ty, argp);
-      argp += ffi_put_arg (ty, avalue[i], argp);
-    }
-}
-
-static void
-ffi_prep_args_VFP (ffi_cif *cif, int flags, void *rvalue,
-                   void **avalue, char *stack, char *vfp_space)
-{
-  ffi_type **arg_types = cif->arg_types;
-  int i, n, vi = 0;
-  char *argp, *regp, *eo_regp;
-  char stack_used = 0;
-  char done_with_regs = 0;
-
-  /* The first 4 words on the stack are used for values
-     passed in core registers.  */
-  regp = stack;
-  eo_regp = argp = regp + 16;
-
-  /* If the function returns an FFI_TYPE_STRUCT in memory,
-     that address is passed in r0 to the function.  */
-  if (flags == ARM_TYPE_STRUCT)
-    {
-      *(void **) regp = rvalue;
-      regp += 4;
-    }
-
-  for (i = 0, n = cif->nargs; i < n; i++)
-    {
-      ffi_type *ty = arg_types[i];
-      void *a = avalue[i];
-      int is_vfp_type = vfp_type_p (ty);
-
-      /* Allocated in VFP registers. */
-      if (vi < cif->vfp_nargs && is_vfp_type)
-	{
-	  char *vfp_slot = vfp_space + cif->vfp_args[vi++] * 4;
-	  ffi_put_arg (ty, a, vfp_slot);
-	  continue;
-	}
-      /* Try allocating in core registers. */
-      else if (!done_with_regs && !is_vfp_type)
-	{
-	  char *tregp = ffi_align (ty, regp);
-	  size_t size = ty->size;
-	  size = (size < 4) ? 4 : size;	// pad
-	  /* Check if there is space left in the aligned register
-	     area to place the argument.  */
-	  if (tregp + size <= eo_regp)
-	    {
-	      regp = tregp + ffi_put_arg (ty, a, tregp);
-	      done_with_regs = (regp == argp);
-	      // ensure we did not write into the stack area
-	      FFI_ASSERT (regp <= argp);
-	      continue;
-	    }
-	  /* In case there are no arguments in the stack area yet,
-	     the argument is passed in the remaining core registers
-	     and on the stack.  */
-	  else if (!stack_used)
-	    {
-	      stack_used = 1;
-	      done_with_regs = 1;
-	      argp = tregp + ffi_put_arg (ty, a, tregp);
-	      FFI_ASSERT (eo_regp < argp);
-	      continue;
-	    }
-	}
-      /* Base case, arguments are passed on the stack */
-      stack_used = 1;
-      argp = ffi_align (ty, argp);
-      argp += ffi_put_arg (ty, a, argp);
-    }
-}
-
-/* Perform machine dependent cif processing */
-ffi_status
-ffi_prep_cif_machdep (ffi_cif *cif)
-{
-  int flags = 0, cabi = cif->abi;
-  size_t bytes = cif->bytes;
-
-  /* Map out the register placements of VFP register args.  The VFP
-     hard-float calling conventions are slightly more sophisticated
-     than the base calling conventions, so we do it here instead of
-     in ffi_prep_args(). */
-  if (cabi == FFI_VFP)
-    layout_vfp_args (cif);
-
-  /* Set the return type flag */
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_VOID:
-      flags = ARM_TYPE_VOID;
-      break;
-
-    case FFI_TYPE_INT:
-    case FFI_TYPE_UINT8:
-    case FFI_TYPE_SINT8:
-    case FFI_TYPE_UINT16:
-    case FFI_TYPE_SINT16:
-    case FFI_TYPE_UINT32:
-    case FFI_TYPE_SINT32:
-    case FFI_TYPE_POINTER:
-      flags = ARM_TYPE_INT;
-      break;
-
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-      flags = ARM_TYPE_INT64;
-      break;
-
-    case FFI_TYPE_FLOAT:
-      flags = (cabi == FFI_VFP ? ARM_TYPE_VFP_S : ARM_TYPE_INT);
-      break;
-    case FFI_TYPE_DOUBLE:
-      flags = (cabi == FFI_VFP ? ARM_TYPE_VFP_D : ARM_TYPE_INT64);
-      break;
-
-    case FFI_TYPE_STRUCT:
-    case FFI_TYPE_COMPLEX:
-      if (cabi == FFI_VFP)
-	{
-	  int h = vfp_type_p (cif->rtype);
-
-	  flags = ARM_TYPE_VFP_N;
-	  if (h == 0x100 + FFI_TYPE_FLOAT)
-	    flags = ARM_TYPE_VFP_S;
-	  if (h == 0x100 + FFI_TYPE_DOUBLE)
-	    flags = ARM_TYPE_VFP_D;
-	  if (h != 0)
-	      break;
-	}
-
-      /* A Composite Type not larger than 4 bytes is returned in r0.
-	 A Composite Type larger than 4 bytes, or whose size cannot
-	 be determined statically ... is stored in memory at an
-	 address passed [in r0].  */
-      if (cif->rtype->size <= 4)
-	flags = ARM_TYPE_INT;
-      else
-	{
-	  flags = ARM_TYPE_STRUCT;
-	  bytes += 4;
-	}
-      break;
-
-    default:
-      abort();
-    }
-
-  /* Round the stack up to a multiple of 8 bytes.  This isn't needed
-     everywhere, but it is on some platforms, and it doesn't harm anything
-     when it isn't needed.  */
-  bytes = ALIGN (bytes, 8);
-
-  /* Minimum stack space is the 4 register arguments that we pop.  */
-  if (bytes < 4*4)
-    bytes = 4*4;
-
-  cif->bytes = bytes;
-  cif->flags = flags;
-
-  return FFI_OK;
-}
-
-/* Perform machine dependent cif processing for variadic calls */
-ffi_status
-ffi_prep_cif_machdep_var (ffi_cif * cif,
-			  unsigned int nfixedargs, unsigned int ntotalargs)
-{
-  /* VFP variadic calls actually use the SYSV ABI */
-  if (cif->abi == FFI_VFP)
-    cif->abi = FFI_SYSV;
-
-  return ffi_prep_cif_machdep (cif);
-}
-
-/* Prototypes for assembly functions, in sysv.S.  */
-
-struct call_frame
-{
-  void *fp;
-  void *lr;
-  void *rvalue;
-  int flags;
-  void *closure;
-};
-
-extern void ffi_call_SYSV (void *stack, struct call_frame *,
-			   void (*fn) (void)) FFI_HIDDEN;
-extern void ffi_call_VFP (void *vfp_space, struct call_frame *,
-			   void (*fn) (void), unsigned vfp_used) FFI_HIDDEN;
-
-static void
-ffi_call_int (ffi_cif * cif, void (*fn) (void), void *rvalue,
-	      void **avalue, void *closure)
-{
-  int flags = cif->flags;
-  ffi_type *rtype = cif->rtype;
-  size_t bytes, rsize, vfp_size;
-  char *stack, *vfp_space, *new_rvalue;
-  struct call_frame *frame;
-
-  rsize = 0;
-  if (rvalue == NULL)
-    {
-      /* If the return value is a struct and we don't have a return
-	 value address then we need to make one.  Otherwise the return
-	 value is in registers and we can ignore them.  */
-      if (flags == ARM_TYPE_STRUCT)
-	rsize = rtype->size;
-      else
-	flags = ARM_TYPE_VOID;
-    }
-  else if (flags == ARM_TYPE_VFP_N)
-    {
-      /* Largest case is double x 4. */
-      rsize = 32;
-    }
-  else if (flags == ARM_TYPE_INT && rtype->type == FFI_TYPE_STRUCT)
-    rsize = 4;
-
-  /* Largest case.  */
-  vfp_size = (cif->abi == FFI_VFP && cif->vfp_used ? 8*8: 0);
-
-  bytes = cif->bytes;
-  stack = alloca (vfp_size + bytes + sizeof(struct call_frame) + rsize);
-
-  vfp_space = NULL;
-  if (vfp_size)
-    {
-      vfp_space = stack;
-      stack += vfp_size;
-    }
-
-  frame = (struct call_frame *)(stack + bytes);
-
-  new_rvalue = rvalue;
-  if (rsize)
-    new_rvalue = (void *)(frame + 1);
-
-  frame->rvalue = new_rvalue;
-  frame->flags = flags;
-  frame->closure = closure;
-
-  if (vfp_space)
-    {
-      ffi_prep_args_VFP (cif, flags, new_rvalue, avalue, stack, vfp_space);
-      ffi_call_VFP (vfp_space, frame, fn, cif->vfp_used);
-    }
-  else
-    {
-      ffi_prep_args_SYSV (cif, flags, new_rvalue, avalue, stack);
-      ffi_call_SYSV (stack, frame, fn);
-    }
-
-  if (rvalue && rvalue != new_rvalue)
-    memcpy (rvalue, new_rvalue, rtype->size);
-}
-
-void
-ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, NULL);
-}
-
-void
-ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue,
-	     void **avalue, void *closure)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, closure);
-}
-
-static void *
-ffi_prep_incoming_args_SYSV (ffi_cif *cif, void *rvalue,
-			     char *argp, void **avalue)
-{
-  ffi_type **arg_types = cif->arg_types;
-  int i, n;
-
-  if (cif->flags == ARM_TYPE_STRUCT)
-    {
-      rvalue = *(void **) argp;
-      argp += 4;
-    }
-
-  for (i = 0, n = cif->nargs; i < n; i++)
-    {
-      ffi_type *ty = arg_types[i];
-      size_t z = ty->size;
-
-      argp = ffi_align (ty, argp);
-      avalue[i] = (void *) argp;
-      argp += z;
-    }
-
-  return rvalue;
-}
-
-static void *
-ffi_prep_incoming_args_VFP (ffi_cif *cif, void *rvalue, char *stack,
-			    char *vfp_space, void **avalue)
-{
-  ffi_type **arg_types = cif->arg_types;
-  int i, n, vi = 0;
-  char *argp, *regp, *eo_regp;
-  char done_with_regs = 0;
-  char stack_used = 0;
-
-  regp = stack;
-  eo_regp = argp = regp + 16;
-
-  if (cif->flags == ARM_TYPE_STRUCT)
-    {
-      rvalue = *(void **) regp;
-      regp += 4;
-    }
-
-  for (i = 0, n = cif->nargs; i < n; i++)
-    {
-      ffi_type *ty = arg_types[i];
-      int is_vfp_type = vfp_type_p (ty);
-      size_t z = ty->size;
-
-      if (vi < cif->vfp_nargs && is_vfp_type)
-	{
-	  avalue[i] = vfp_space + cif->vfp_args[vi++] * 4;
-	  continue;
-	}
-      else if (!done_with_regs && !is_vfp_type)
-	{
-	  char *tregp = ffi_align (ty, regp);
-
-	  z = (z < 4) ? 4 : z;	// pad
-
-	  /* If the arguments either fits into the registers or uses registers
-	     and stack, while we haven't read other things from the stack */
-	  if (tregp + z <= eo_regp || !stack_used)
-	    {
-	      /* Because we're little endian, this is what it turns into.  */
-	      avalue[i] = (void *) tregp;
-	      regp = tregp + z;
-
-	      /* If we read past the last core register, make sure we
-		 have not read from the stack before and continue
-		 reading after regp.  */
-	      if (regp > eo_regp)
-		{
-		  FFI_ASSERT (!stack_used);
-		  argp = regp;
-		}
-	      if (regp >= eo_regp)
-		{
-		  done_with_regs = 1;
-		  stack_used = 1;
-		}
-	      continue;
-	    }
-	}
-
-      stack_used = 1;
-      argp = ffi_align (ty, argp);
-      avalue[i] = (void *) argp;
-      argp += z;
-    }
-
-  return rvalue;
-}
-
-struct closure_frame
-{
-  char vfp_space[8*8] __attribute__((aligned(8)));
-  char result[8*4];
-  char argp[];
-};
-
-int FFI_HIDDEN
-ffi_closure_inner_SYSV (ffi_cif *cif,
-		        void (*fun) (ffi_cif *, void *, void **, void *),
-		        void *user_data,
-		        struct closure_frame *frame)
-{
-  void **avalue = (void **) alloca (cif->nargs * sizeof (void *));
-  void *rvalue = ffi_prep_incoming_args_SYSV (cif, frame->result,
-					      frame->argp, avalue);
-  fun (cif, rvalue, avalue, user_data);
-  return cif->flags;
-}
-
-int FFI_HIDDEN
-ffi_closure_inner_VFP (ffi_cif *cif,
-		       void (*fun) (ffi_cif *, void *, void **, void *),
-		       void *user_data,
-		       struct closure_frame *frame)
-{
-  void **avalue = (void **) alloca (cif->nargs * sizeof (void *));
-  void *rvalue = ffi_prep_incoming_args_VFP (cif, frame->result, frame->argp,
-					     frame->vfp_space, avalue);
-  fun (cif, rvalue, avalue, user_data);
-  return cif->flags;
-}
-
-void ffi_closure_SYSV (void) FFI_HIDDEN;
-void ffi_closure_VFP (void) FFI_HIDDEN;
-void ffi_go_closure_SYSV (void) FFI_HIDDEN;
-void ffi_go_closure_VFP (void) FFI_HIDDEN;
-
-#if FFI_EXEC_TRAMPOLINE_TABLE
-
-#include <mach/mach.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-extern void *ffi_closure_trampoline_table_page;
-
-typedef struct ffi_trampoline_table ffi_trampoline_table;
-typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry;
-
-struct ffi_trampoline_table
-{
-  /* contiguous writable and executable pages */
-  vm_address_t config_page;
-  vm_address_t trampoline_page;
-
-  /* free list tracking */
-  uint16_t free_count;
-  ffi_trampoline_table_entry *free_list;
-  ffi_trampoline_table_entry *free_list_pool;
-
-  ffi_trampoline_table *prev;
-  ffi_trampoline_table *next;
-};
-
-struct ffi_trampoline_table_entry
-{
-  void *(*trampoline) ();
-  ffi_trampoline_table_entry *next;
-};
-
-/* Override the standard architecture trampoline size */
-// XXX TODO - Fix
-#undef FFI_TRAMPOLINE_SIZE
-#define FFI_TRAMPOLINE_SIZE 12
-
-/* The trampoline configuration is placed at 4080 bytes prior to the trampoline's entry point */
-#define FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc) ((void **) (((uint8_t *) codeloc) - 4080));
-
-/* The first 16 bytes of the config page are unused, as they are unaddressable from the trampoline page. */
-#define FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET 16
-
-/* Total number of trampolines that fit in one trampoline table */
-#define FFI_TRAMPOLINE_COUNT ((PAGE_SIZE - FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) / FFI_TRAMPOLINE_SIZE)
-
-static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER;
-static ffi_trampoline_table *ffi_trampoline_tables = NULL;
-
-static ffi_trampoline_table *
-ffi_trampoline_table_alloc ()
-{
-  ffi_trampoline_table *table = NULL;
-
-  /* Loop until we can allocate two contiguous pages */
-  while (table == NULL)
-    {
-      vm_address_t config_page = 0x0;
-      kern_return_t kt;
-
-      /* Try to allocate two pages */
-      kt =
-	vm_allocate (mach_task_self (), &config_page, PAGE_SIZE * 2,
-		     VM_FLAGS_ANYWHERE);
-      if (kt != KERN_SUCCESS)
-	{
-	  fprintf (stderr, "vm_allocate() failure: %d at %s:%d\n", kt,
-		   __FILE__, __LINE__);
-	  break;
-	}
-
-      /* Now drop the second half of the allocation to make room for the trampoline table */
-      vm_address_t trampoline_page = config_page + PAGE_SIZE;
-      kt = vm_deallocate (mach_task_self (), trampoline_page, PAGE_SIZE);
-      if (kt != KERN_SUCCESS)
-	{
-	  fprintf (stderr, "vm_deallocate() failure: %d at %s:%d\n", kt,
-		   __FILE__, __LINE__);
-	  break;
-	}
-
-      /* Remap the trampoline table to directly follow the config page */
-      vm_prot_t cur_prot;
-      vm_prot_t max_prot;
-
-      kt =
-	vm_remap (mach_task_self (), &trampoline_page, PAGE_SIZE, 0x0, FALSE,
-		  mach_task_self (),
-		  (vm_address_t) & ffi_closure_trampoline_table_page, FALSE,
-		  &cur_prot, &max_prot, VM_INHERIT_SHARE);
-
-      /* If we lost access to the destination trampoline page, drop our config allocation mapping and retry */
-      if (kt != KERN_SUCCESS)
-	{
-	  /* Log unexpected failures */
-	  if (kt != KERN_NO_SPACE)
-	    {
-	      fprintf (stderr, "vm_remap() failure: %d at %s:%d\n", kt,
-		       __FILE__, __LINE__);
-	    }
-
-	  vm_deallocate (mach_task_self (), config_page, PAGE_SIZE);
-	  continue;
-	}
-
-      /* We have valid trampoline and config pages */
-      table = calloc (1, sizeof (ffi_trampoline_table));
-      table->free_count = FFI_TRAMPOLINE_COUNT;
-      table->config_page = config_page;
-      table->trampoline_page = trampoline_page;
-
-      /* Create and initialize the free list */
-      table->free_list_pool =
-	calloc (FFI_TRAMPOLINE_COUNT, sizeof (ffi_trampoline_table_entry));
-
-      uint16_t i;
-      for (i = 0; i < table->free_count; i++)
-	{
-	  ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
-	  entry->trampoline =
-	    (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
-
-	  if (i < table->free_count - 1)
-	    entry->next = &table->free_list_pool[i + 1];
-	}
-
-      table->free_list = table->free_list_pool;
-    }
-
-  return table;
-}
-
-void *
-ffi_closure_alloc (size_t size, void **code)
-{
-  /* Create the closure */
-  ffi_closure *closure = malloc (size);
-  if (closure == NULL)
-    return NULL;
-
-  pthread_mutex_lock (&ffi_trampoline_lock);
-
-  /* Check for an active trampoline table with available entries. */
-  ffi_trampoline_table *table = ffi_trampoline_tables;
-  if (table == NULL || table->free_list == NULL)
-    {
-      table = ffi_trampoline_table_alloc ();
-      if (table == NULL)
-	{
-	  free (closure);
-	  return NULL;
-	}
-
-      /* Insert the new table at the top of the list */
-      table->next = ffi_trampoline_tables;
-      if (table->next != NULL)
-	table->next->prev = table;
-
-      ffi_trampoline_tables = table;
-    }
-
-  /* Claim the free entry */
-  ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list;
-  ffi_trampoline_tables->free_list = entry->next;
-  ffi_trampoline_tables->free_count--;
-  entry->next = NULL;
-
-  pthread_mutex_unlock (&ffi_trampoline_lock);
-
-  /* Initialize the return values */
-  *code = entry->trampoline;
-  closure->trampoline_table = table;
-  closure->trampoline_table_entry = entry;
-
-  return closure;
-}
-
-void
-ffi_closure_free (void *ptr)
-{
-  ffi_closure *closure = ptr;
-
-  pthread_mutex_lock (&ffi_trampoline_lock);
-
-  /* Fetch the table and entry references */
-  ffi_trampoline_table *table = closure->trampoline_table;
-  ffi_trampoline_table_entry *entry = closure->trampoline_table_entry;
-
-  /* Return the entry to the free list */
-  entry->next = table->free_list;
-  table->free_list = entry;
-  table->free_count++;
-
-  /* If all trampolines within this table are free, and at least one other table exists, deallocate
-   * the table */
-  if (table->free_count == FFI_TRAMPOLINE_COUNT
-      && ffi_trampoline_tables != table)
-    {
-      /* Remove from the list */
-      if (table->prev != NULL)
-	table->prev->next = table->next;
-
-      if (table->next != NULL)
-	table->next->prev = table->prev;
-
-      /* Deallocate pages */
-      kern_return_t kt;
-      kt = vm_deallocate (mach_task_self (), table->config_page, PAGE_SIZE);
-      if (kt != KERN_SUCCESS)
-	fprintf (stderr, "vm_deallocate() failure: %d at %s:%d\n", kt,
-		 __FILE__, __LINE__);
-
-      kt =
-	vm_deallocate (mach_task_self (), table->trampoline_page, PAGE_SIZE);
-      if (kt != KERN_SUCCESS)
-	fprintf (stderr, "vm_deallocate() failure: %d at %s:%d\n", kt,
-		 __FILE__, __LINE__);
-
-      /* Deallocate free list */
-      free (table->free_list_pool);
-      free (table);
-    }
-  else if (ffi_trampoline_tables != table)
-    {
-      /* Otherwise, bump this table to the top of the list */
-      table->prev = NULL;
-      table->next = ffi_trampoline_tables;
-      if (ffi_trampoline_tables != NULL)
-	ffi_trampoline_tables->prev = table;
-
-      ffi_trampoline_tables = table;
-    }
-
-  pthread_mutex_unlock (&ffi_trampoline_lock);
-
-  /* Free the closure */
-  free (closure);
-}
-
-#else
-
-extern unsigned int ffi_arm_trampoline[2] FFI_HIDDEN;
-
-#endif
-
-/* the cif must already be prep'ed */
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure * closure,
-		      ffi_cif * cif,
-		      void (*fun) (ffi_cif *, void *, void **, void *),
-		      void *user_data, void *codeloc)
-{
-  void (*closure_func) (void) = ffi_closure_SYSV;
-
-  if (cif->abi == FFI_VFP)
-    {
-      /* We only need take the vfp path if there are vfp arguments.  */
-      if (cif->vfp_used)
-	closure_func = ffi_closure_VFP;
-    }
-  else if (cif->abi != FFI_SYSV)
-    return FFI_BAD_ABI;
-
-#if FFI_EXEC_TRAMPOLINE_TABLE
-  void **config = FFI_TRAMPOLINE_CODELOC_CONFIG (codeloc);
-  config[0] = closure;
-  config[1] = closure_func;
-#else
-  memcpy (closure->tramp, ffi_arm_trampoline, 8);
-  __clear_cache(closure->tramp, closure->tramp + 8);	/* clear data map */
-  __clear_cache(codeloc, codeloc + 8);			/* clear insn map */
-  *(void (**)(void))(closure->tramp + 8) = closure_func;
-#endif
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  return FFI_OK;
-}
-
-ffi_status
-ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif,
-		     void (*fun) (ffi_cif *, void *, void **, void *))
-{
-  void (*closure_func) (void) = ffi_go_closure_SYSV;
-
-  if (cif->abi == FFI_VFP)
-    {
-      /* We only need take the vfp path if there are vfp arguments.  */
-      if (cif->vfp_used)
-	closure_func = ffi_go_closure_VFP;
-    }
-  else if (cif->abi != FFI_SYSV)
-    return FFI_BAD_ABI;
-
-  closure->tramp = closure_func;
-  closure->cif = cif;
-  closure->fun = fun;
-
-  return FFI_OK;
-}
-
-/* Below are routines for VFP hard-float support. */
-
-/* A subroutine of vfp_type_p.  Given a structure type, return the type code
-   of the first non-structure element.  Recurse for structure elements.
-   Return -1 if the structure is in fact empty, i.e. no nested elements.  */
-
-static int
-is_hfa0 (const ffi_type *ty)
-{
-  ffi_type **elements = ty->elements;
-  int i, ret = -1;
-
-  if (elements != NULL)
-    for (i = 0; elements[i]; ++i)
-      {
-        ret = elements[i]->type;
-        if (ret == FFI_TYPE_STRUCT || ret == FFI_TYPE_COMPLEX)
-          {
-            ret = is_hfa0 (elements[i]);
-            if (ret < 0)
-              continue;
-          }
-        break;
-      }
-
-  return ret;
-}
-
-/* A subroutine of vfp_type_p.  Given a structure type, return true if all
-   of the non-structure elements are the same as CANDIDATE.  */
-
-static int
-is_hfa1 (const ffi_type *ty, int candidate)
-{
-  ffi_type **elements = ty->elements;
-  int i;
-
-  if (elements != NULL)
-    for (i = 0; elements[i]; ++i)
-      {
-        int t = elements[i]->type;
-        if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX)
-          {
-            if (!is_hfa1 (elements[i], candidate))
-              return 0;
-          }
-        else if (t != candidate)
-          return 0;
-      }
-
-  return 1;
-}
-
-/* Determine if TY is an homogenous floating point aggregate (HFA).
-   That is, a structure consisting of 1 to 4 members of all the same type,
-   where that type is a floating point scalar.
-
-   Returns non-zero iff TY is an HFA.  The result is an encoded value where
-   bits 0-7 contain the type code, and bits 8-10 contain the element count.  */
-
-static int
-vfp_type_p (const ffi_type *ty)
-{
-  ffi_type **elements;
-  int candidate, i;
-  size_t size, ele_count;
-
-  /* Quickest tests first.  */
-  candidate = ty->type;
-  switch (ty->type)
-    {
-    default:
-      return 0;
-    case FFI_TYPE_FLOAT:
-    case FFI_TYPE_DOUBLE:
-      ele_count = 1;
-      goto done;
-    case FFI_TYPE_COMPLEX:
-      candidate = ty->elements[0]->type;
-      if (candidate != FFI_TYPE_FLOAT && candidate != FFI_TYPE_DOUBLE)
-	return 0;
-      ele_count = 2;
-      goto done;
-    case FFI_TYPE_STRUCT:
-      break;
-    }
-
-  /* No HFA types are smaller than 4 bytes, or larger than 32 bytes.  */
-  size = ty->size;
-  if (size < 4 || size > 32)
-    return 0;
-
-  /* Find the type of the first non-structure member.  */
-  elements = ty->elements;
-  candidate = elements[0]->type;
-  if (candidate == FFI_TYPE_STRUCT || candidate == FFI_TYPE_COMPLEX)
-    {
-      for (i = 0; ; ++i)
-        {
-          candidate = is_hfa0 (elements[i]);
-          if (candidate >= 0)
-            break;
-        }
-    }
-
-  /* If the first member is not a floating point type, it's not an HFA.
-     Also quickly re-check the size of the structure.  */
-  switch (candidate)
-    {
-    case FFI_TYPE_FLOAT:
-      ele_count = size / sizeof(float);
-      if (size != ele_count * sizeof(float))
-        return 0;
-      break;
-    case FFI_TYPE_DOUBLE:
-      ele_count = size / sizeof(double);
-      if (size != ele_count * sizeof(double))
-        return 0;
-      break;
-    default:
-      return 0;
-    }
-  if (ele_count > 4)
-    return 0;
-
-  /* Finally, make sure that all scalar elements are the same type.  */
-  for (i = 0; elements[i]; ++i)
-    {
-      int t = elements[i]->type;
-      if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX)
-        {
-          if (!is_hfa1 (elements[i], candidate))
-            return 0;
-        }
-      else if (t != candidate)
-        return 0;
-    }
-
-  /* All tests succeeded.  Encode the result.  */
- done:
-  return (ele_count << 8) | candidate;
-}
-
-static int
-place_vfp_arg (ffi_cif *cif, int h)
-{
-  unsigned short reg = cif->vfp_reg_free;
-  int align = 1, nregs = h >> 8;
-
-  if ((h & 0xff) == FFI_TYPE_DOUBLE)
-    align = 2, nregs *= 2;
-
-  /* Align register number. */
-  if ((reg & 1) && align == 2)
-    reg++;
-
-  while (reg + nregs <= 16)
-    {
-      int s, new_used = 0;
-      for (s = reg; s < reg + nregs; s++)
-	{
-	  new_used |= (1 << s);
-	  if (cif->vfp_used & (1 << s))
-	    {
-	      reg += align;
-	      goto next_reg;
-	    }
-	}
-      /* Found regs to allocate. */
-      cif->vfp_used |= new_used;
-      cif->vfp_args[cif->vfp_nargs++] = reg;
-
-      /* Update vfp_reg_free. */
-      if (cif->vfp_used & (1 << cif->vfp_reg_free))
-	{
-	  reg += nregs;
-	  while (cif->vfp_used & (1 << reg))
-	    reg += 1;
-	  cif->vfp_reg_free = reg;
-	}
-      return 0;
-    next_reg:;
-    }
-  // done, mark all regs as used
-  cif->vfp_reg_free = 16;
-  cif->vfp_used = 0xFFFF;
-  return 1;
-}
-
-static void
-layout_vfp_args (ffi_cif * cif)
-{
-  int i;
-  /* Init VFP fields */
-  cif->vfp_used = 0;
-  cif->vfp_nargs = 0;
-  cif->vfp_reg_free = 0;
-  memset (cif->vfp_args, -1, 16);	/* Init to -1. */
-
-  for (i = 0; i < cif->nargs; i++)
-    {
-      int h = vfp_type_p (cif->arg_types[i]);
-      if (h && place_vfp_arg (cif, h) == 1)
-	break;
-    }
-}
diff --git a/third_party/gofrontend/libffi/src/arm/ffitarget.h b/third_party/gofrontend/libffi/src/arm/ffitarget.h
deleted file mode 100644
index 4f473f9..0000000
--- a/third_party/gofrontend/libffi/src/arm/ffitarget.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 2010  CodeSourcery
-                 Copyright (c) 1996-2003  Red Hat, Inc.
-
-   Target configuration macros for ARM.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV,
-  FFI_VFP,
-  FFI_LAST_ABI,
-#ifdef __ARM_PCS_VFP
-  FFI_DEFAULT_ABI = FFI_VFP,
-#else
-  FFI_DEFAULT_ABI = FFI_SYSV,
-#endif
-} ffi_abi;
-#endif
-
-#define FFI_EXTRA_CIF_FIELDS			\
-  int vfp_used;					\
-  unsigned short vfp_reg_free, vfp_nargs;	\
-  signed char vfp_args[16]			\
-
-#define FFI_TARGET_SPECIFIC_VARIADIC
-#define FFI_TARGET_HAS_COMPLEX_TYPE
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_GO_CLOSURES 1
-#define FFI_TRAMPOLINE_SIZE 12
-#define FFI_NATIVE_RAW_API 0
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/arm/internal.h b/third_party/gofrontend/libffi/src/arm/internal.h
deleted file mode 100644
index 6cf0b2a..0000000
--- a/third_party/gofrontend/libffi/src/arm/internal.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#define ARM_TYPE_VFP_S	0
-#define ARM_TYPE_VFP_D	1
-#define ARM_TYPE_VFP_N	2
-#define ARM_TYPE_INT64	3
-#define ARM_TYPE_INT	4
-#define ARM_TYPE_VOID	5
-#define ARM_TYPE_STRUCT	6
diff --git a/third_party/gofrontend/libffi/src/arm/sysv.S b/third_party/gofrontend/libffi/src/arm/sysv.S
deleted file mode 100644
index fd16589..0000000
--- a/third_party/gofrontend/libffi/src/arm/sysv.S
+++ /dev/null
@@ -1,335 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc.
-	    Copyright (c) 2011 Plausible Labs Cooperative, Inc.
-
-   ARM Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-#include <ffi_cfi.h>
-#include "internal.h"
-
-/* GCC 4.8 provides __ARM_ARCH; construct it otherwise.  */
-#ifndef __ARM_ARCH
-# if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
-     || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
-     || defined(__ARM_ARCH_7EM__)
-#  define __ARM_ARCH 7
-# elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
-        || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \
-        || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \
-	|| defined(__ARM_ARCH_6M__)
-#  define __ARM_ARCH 6
-# elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \
-	|| defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \
-	|| defined(__ARM_ARCH_5TEJ__)
-#  define __ARM_ARCH 5
-# else
-#  define __ARM_ARCH 4
-# endif
-#endif
-
-/* Conditionally compile unwinder directives.  */
-.macro UNWIND text:vararg
-#ifdef __ARM_EABI__
-	\text
-#endif	
-.endm
-#if defined(HAVE_AS_CFI_PSEUDO_OP) && defined(__ARM_EABI__)
-	.cfi_sections	.debug_frame
-#endif
-
-#define CONCAT(a, b)	CONCAT2(a, b)
-#define CONCAT2(a, b)	a ## b
-
-#ifdef __USER_LABEL_PREFIX__
-# define CNAME(X)	CONCAT (__USER_LABEL_PREFIX__, X)
-#else
-# define CNAME(X)	X
-#endif
-#ifdef __ELF__
-# define SIZE(X)	.size CNAME(X), . - CNAME(X)
-# define TYPE(X, Y)	.type CNAME(X), Y
-#else
-# define SIZE(X)
-# define TYPE(X, Y)
-#endif
-
-#define ARM_FUNC_START(name, gl) \
-	.align	3; \
-	.ifne gl; .globl CNAME(name); FFI_HIDDEN(CNAME(name)); .endif; \
-	TYPE(name, %function); \
-	CNAME(name):
-
-#define ARM_FUNC_END(name) \
-	SIZE(name)
-
-/* Aid in defining a jump table with 8 bytes between entries.  */
-.macro E index
-	.if . - 0b - 8*\index
-	.error "type table out of sync"
-	.endif
-.endm
-
-	.text
-	.syntax unified
-	.arm
-
-	/* We require interworking on LDM, which implies ARMv5T,
-	   which implies the existance of BLX.  */
-	.arch	armv5t
-
-	/* Note that we use STC and LDC to encode VFP instructions,
-	   so that we do not need ".fpu vfp", nor get that added to
-	   the object file attributes.  These will not be executed
-	   unless the FFI_VFP abi is used.  */
-
-	@ r0:   stack
-	@ r1:   frame
-	@ r2:   fn
-	@ r3:	vfp_used
-
-ARM_FUNC_START(ffi_call_VFP, 1)
-	UNWIND	.fnstart
-	cfi_startproc
-
-	cmp	r3, #3			@ load only d0 if possible
-	ldcle	p11, cr0, [r0]		@ vldrle d0, [sp]
-	ldcgt	p11, cr0, [r0], {16}	@ vldmgt sp, {d0-d7}
-	add	r0, r0, #64		@ discard the vfp register args
-	/* FALLTHRU */
-ARM_FUNC_END(ffi_call_VFP)
-
-ARM_FUNC_START(ffi_call_SYSV, 1)
-	stm	r1, {fp, lr}
-	mov	fp, r1
-
-	@ This is a bit of a lie wrt the origin of the unwind info, but
-	@ now we've got the usual frame pointer and two saved registers.
-	UNWIND	.save {fp,lr}
-	UNWIND	.setfp fp, sp
-	cfi_def_cfa(fp, 8)
-	cfi_rel_offset(fp, 0)
-	cfi_rel_offset(lr, 4)
-
-	mov	sp, r0		@ install the stack pointer
-	mov	lr, r2		@ move the fn pointer out of the way
-	ldr	ip, [fp, #16]	@ install the static chain
-	ldmia	sp!, {r0-r3}	@ move first 4 parameters in registers.
-	blx	lr		@ call fn
-
-	@ Load r2 with the pointer to storage for the return value
-	@ Load r3 with the return type code
-	ldr	r2, [fp, #8]
-	ldr	r3, [fp, #12]
-
-	@ Deallocate the stack with the arguments.
-	mov	sp, fp
-	cfi_def_cfa_register(sp)
-
-	@ Store values stored in registers.
-	.align	3
-	add	pc, pc, r3, lsl #3
-	nop
-0:
-E ARM_TYPE_VFP_S
-	stc	p10, cr0, [r2]		@ vstr s0, [r2]
-	pop	{fp,pc}
-E ARM_TYPE_VFP_D
-	stc	p11, cr0, [r2]		@ vstr d0, [r2]
-	pop	{fp,pc}
-E ARM_TYPE_VFP_N
-	stc	p11, cr0, [r2], {8}	@ vstm r2, {d0-d3}
-	pop	{fp,pc}
-E ARM_TYPE_INT64
-	str	r1, [r2, #4]
-	nop
-E ARM_TYPE_INT
-	str	r0, [r2]
-	pop	{fp,pc}
-E ARM_TYPE_VOID
-	pop	{fp,pc}
-	nop
-E ARM_TYPE_STRUCT
-	pop	{fp,pc}
-
-	cfi_endproc
-	UNWIND	.fnend
-ARM_FUNC_END(ffi_call_SYSV)
-
-
-/*
-	int ffi_closure_inner_* (cif, fun, user_data, frame)
-*/
-
-ARM_FUNC_START(ffi_go_closure_SYSV, 1)
-	cfi_startproc
-	stmdb	sp!, {r0-r3}			@ save argument regs
-	cfi_adjust_cfa_offset(16)
-	ldr	r0, [ip, #4]			@ load cif
-	ldr	r1, [ip, #8]			@ load fun
-	mov	r2, ip				@ load user_data
-	b	0f
-	cfi_endproc
-ARM_FUNC_END(ffi_go_closure_SYSV)
-
-ARM_FUNC_START(ffi_closure_SYSV, 1)
-	UNWIND	.fnstart
-	cfi_startproc
-	stmdb	sp!, {r0-r3}			@ save argument regs
-	cfi_adjust_cfa_offset(16)
-	ldr	r0, [ip, #FFI_TRAMPOLINE_SIZE]	  @ load cif
-	ldr	r1, [ip, #FFI_TRAMPOLINE_SIZE+4]  @ load fun
-	ldr	r2, [ip, #FFI_TRAMPOLINE_SIZE+8]  @ load user_data
-0:
-	add	ip, sp, #16			@ compute entry sp
-	sub	sp, sp, #64+32			@ allocate frame
-	cfi_adjust_cfa_offset(64+32)
-	stmdb	sp!, {ip,lr}
-
-	/* Remember that EABI unwind info only applies at call sites.
-	   We need do nothing except note the save of the stack pointer
-	   and the link registers.  */
-	UNWIND	.save {sp,lr}
-	cfi_adjust_cfa_offset(8)
-	cfi_rel_offset(lr, 4)
-
-	add	r3, sp, #8			@ load frame
-	bl	CNAME(ffi_closure_inner_SYSV)
-
-	@ Load values returned in registers.
-	add	r2, sp, #8+64			@ load result
-	adr	r3, CNAME(ffi_closure_ret)
-	add	pc, r3, r0, lsl #3
-	cfi_endproc
-	UNWIND	.fnend
-ARM_FUNC_END(ffi_closure_SYSV)
-
-ARM_FUNC_START(ffi_go_closure_VFP, 1)
-	cfi_startproc
-	stmdb	sp!, {r0-r3}			@ save argument regs
-	cfi_adjust_cfa_offset(16)
-	ldr	r0, [ip, #4]			@ load cif
-	ldr	r1, [ip, #8]			@ load fun
-	mov	r2, ip				@ load user_data
-	b	0f
-	cfi_endproc
-ARM_FUNC_END(ffi_go_closure_VFP)
-
-ARM_FUNC_START(ffi_closure_VFP, 1)
-	UNWIND	.fnstart
-	cfi_startproc
-	stmdb	sp!, {r0-r3}			@ save argument regs
-	cfi_adjust_cfa_offset(16)
-	ldr	r0, [ip, #FFI_TRAMPOLINE_SIZE]	  @ load cif
-	ldr	r1, [ip, #FFI_TRAMPOLINE_SIZE+4]  @ load fun
-	ldr	r2, [ip, #FFI_TRAMPOLINE_SIZE+8]  @ load user_data
-0:
-	add	ip, sp, #16
-	sub	sp, sp, #64+32			@ allocate frame
-	cfi_adjust_cfa_offset(64+32)
-	stc	p11, cr0, [sp], {16}		@ vstm sp, {d0-d7}
-	stmdb	sp!, {ip,lr}
-
-	/* See above.  */
-	UNWIND	.save {sp,lr}
-	cfi_adjust_cfa_offset(8)
-	cfi_rel_offset(lr, 4)
-
-	add	r3, sp, #8			@ load frame
-	bl	CNAME(ffi_closure_inner_VFP)
-
-	@ Load values returned in registers.
-	add	r2, sp, #8+64			@ load result
-	adr	r3, CNAME(ffi_closure_ret)
-	add	pc, r3, r0, lsl #3
-	cfi_endproc
-	UNWIND	.fnend
-ARM_FUNC_END(ffi_closure_VFP)
-
-/* Load values returned in registers for both closure entry points.
-   Note that we use LDM with SP in the register set.  This is deprecated
-   by ARM, but not yet unpredictable.  */
-
-ARM_FUNC_START(ffi_closure_ret, 0)
-	cfi_startproc
-	cfi_rel_offset(sp, 0)
-	cfi_rel_offset(lr, 4)
-0:
-E ARM_TYPE_VFP_S
-	ldc	p10, cr0, [r2]			@ vldr s0, [r2]
-	ldm	sp, {sp,pc}
-E ARM_TYPE_VFP_D
-	ldc	p11, cr0, [r2]			@ vldr d0, [r2]
-	ldm	sp, {sp,pc}
-E ARM_TYPE_VFP_N
-	ldc	p11, cr0, [r2], {8}		@ vldm r2, {d0-d3}
-	ldm	sp, {sp,pc}
-E ARM_TYPE_INT64
-	ldr	r1, [r2, #4]
-	nop
-E ARM_TYPE_INT
-	ldr	r0, [r2]
-	ldm	sp, {sp,pc}
-E ARM_TYPE_VOID
-	ldm	sp, {sp,pc}
-	nop
-E ARM_TYPE_STRUCT
-	ldm	sp, {sp,pc}
-	cfi_endproc
-ARM_FUNC_END(ffi_closure_ret)
-
-#if FFI_EXEC_TRAMPOLINE_TABLE
-
-/* ??? The iOS support should be updated.  The first insn used to
-   be STMFD, but that's been moved into ffi_closure_SYSV.  If the
-   writable page is put after this one we can make use of the
-   pc+8 feature of the architecture.  We can also reduce the size
-   of the thunk to 8 and pack more of these into the page.
-
-   In the meantime, simply replace the STMFD with a NOP so as to
-   keep all the magic numbers the same within ffi.c.  */
-
-	.align	12
-ARM_FUNC_START(ffi_closure_trampoline_table_page)
-.rept	4096 / 12
-	nop
-	ldr	ip, [pc, #-4092]
-	ldr	pc, [pc, #-4092]
-.endr
-
-#else
-
-ARM_FUNC_START(ffi_arm_trampoline, 1)
-0:	adr	ip, 0b
-	ldr	pc, 1f
-1:	.long	0
-ARM_FUNC_END(ffi_arm_trampoline)
-
-#endif /* FFI_EXEC_TRAMPOLINE_TABLE */
-
-#if defined __ELF__ && defined __linux__
-	.section	.note.GNU-stack,"",%progbits
-#endif
diff --git a/third_party/gofrontend/libffi/src/avr32/ffi.c b/third_party/gofrontend/libffi/src/avr32/ffi.c
deleted file mode 100644
index 3d43397..0000000
--- a/third_party/gofrontend/libffi/src/avr32/ffi.c
+++ /dev/null
@@ -1,423 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2011  Anthony Green
-           Copyright (c) 2009  Bradley Smith <brad@brad-smith.co.uk>
-
-   AVR32 Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <asm/unistd.h>
-
-/* #define DEBUG */
-
-extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
-    unsigned int, unsigned int, unsigned int*, unsigned int,
-    void (*fn)(void));
-extern void ffi_closure_SYSV (ffi_closure *);
-
-unsigned int pass_struct_on_stack(ffi_type *type)
-{
-    if(type->type != FFI_TYPE_STRUCT)
-        return 0;
-
-    if(type->alignment < type->size &&
-        !(type->size == 4 || type->size == 8) &&
-        !(type->size == 8 && type->alignment >= 4))
-        return 1;
-
-    if(type->size == 3 || type->size == 5 || type->size == 6 ||
-        type->size == 7)
-        return 1;
-
-    return 0;
-}
-
-/* ffi_prep_args is called by the assembly routine once stack space
- * has been allocated for the function's arguments
- *
- * This is annoyingly complex since we need to keep track of used
- * registers.
- */
-
-void ffi_prep_args(char *stack, extended_cif *ecif)
-{
-    unsigned int i;
-    void **p_argv;
-    ffi_type **p_arg;
-    char *reg_base = stack;
-    char *stack_base = stack + 20;
-    unsigned int stack_offset = 0;
-    unsigned int reg_mask = 0;
-
-    p_argv = ecif->avalue;
-
-    /* If cif->flags is struct then we know it's not passed in registers */
-    if(ecif->cif->flags == FFI_TYPE_STRUCT)
-    {
-        *(void**)reg_base = ecif->rvalue;
-        reg_mask |= 1;
-    }
-
-    for(i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs;
-        i++, p_arg++)
-    {
-        size_t z = (*p_arg)->size;
-        int alignment = (*p_arg)->alignment;
-        int type = (*p_arg)->type;
-        char *addr = 0;
-
-        if(z % 4 != 0)
-            z += (4 - z % 4);
-
-        if(reg_mask != 0x1f)
-        {
-            if(pass_struct_on_stack(*p_arg))
-            {
-                addr = stack_base + stack_offset;
-                stack_offset += z;
-            }
-            else if(z == sizeof(int))
-            {
-                char index = 0;
-
-                while((reg_mask >> index) & 1)
-                    index++;
-
-                addr = reg_base + (index * 4);
-                reg_mask |= (1 << index);
-            }
-            else if(z == 2 * sizeof(int))
-            {
-                if(!((reg_mask >> 1) & 1))
-                {
-                    addr = reg_base + 4;
-                    reg_mask |= (3 << 1);
-                }
-                else if(!((reg_mask >> 3) & 1))
-                {
-                    addr = reg_base + 12;
-                    reg_mask |= (3 << 3);
-                }
-            }
-        }
-
-        if(!addr)
-        {
-            addr = stack_base + stack_offset;
-            stack_offset += z;
-        }
-
-        if(type == FFI_TYPE_STRUCT && (*p_arg)->elements[1] == NULL)
-            type = (*p_arg)->elements[0]->type;
-
-        switch(type)
-        {
-        case FFI_TYPE_UINT8:
-            *(unsigned int *)addr = (unsigned int)*(UINT8 *)(*p_argv);
-            break;
-        case FFI_TYPE_SINT8:
-            *(signed int *)addr = (signed int)*(SINT8 *)(*p_argv);
-            break;
-        case FFI_TYPE_UINT16:
-            *(unsigned int *)addr = (unsigned int)*(UINT16 *)(*p_argv);
-            break;
-        case FFI_TYPE_SINT16:
-            *(signed int *)addr = (signed int)*(SINT16 *)(*p_argv);
-            break;
-        default:
-            memcpy(addr, *p_argv, z);
-        }
-
-        p_argv++;
-    }
-
-#ifdef DEBUG
-    /* Debugging */
-    for(i = 0; i < 5; i++)
-    {
-        if((reg_mask & (1 << i)) == 0)
-            printf("r%d: (unused)\n", 12 - i);
-        else
-            printf("r%d: 0x%08x\n", 12 - i, ((unsigned int*)reg_base)[i]);
-    }
-
-    for(i = 0; i < stack_offset / 4; i++)
-    {
-        printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack_base)[i]);
-    }
-#endif
-}
-
-/* Perform machine dependent cif processing */
-ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
-{
-    /* Round the stack up to a multiple of 8 bytes.  This isn't needed
-     * everywhere, but it is on some platforms, and it doesn't harm
-     * anything when it isn't needed. */
-    cif->bytes = (cif->bytes + 7) & ~7;
-
-    /* Flag to indicate that he return value is in fact a struct */
-    cif->rstruct_flag = 0;
-
-    /* Set the return type flag */
-    switch(cif->rtype->type)
-    {
-    case FFI_TYPE_SINT8:
-    case FFI_TYPE_UINT8:
-        cif->flags = (unsigned)FFI_TYPE_UINT8;
-        break;
-    case FFI_TYPE_SINT16:
-    case FFI_TYPE_UINT16:
-        cif->flags = (unsigned)FFI_TYPE_UINT16;
-        break;
-    case FFI_TYPE_FLOAT:
-    case FFI_TYPE_SINT32:
-    case FFI_TYPE_UINT32:
-    case FFI_TYPE_POINTER:
-        cif->flags = (unsigned)FFI_TYPE_UINT32;
-        break;
-    case FFI_TYPE_DOUBLE:
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-        cif->flags = (unsigned)FFI_TYPE_UINT64;
-        break;
-    case FFI_TYPE_STRUCT:
-        cif->rstruct_flag = 1;
-        if(!pass_struct_on_stack(cif->rtype))
-        {
-            if(cif->rtype->size <= 1)
-                cif->flags = (unsigned)FFI_TYPE_UINT8;
-            else if(cif->rtype->size <= 2)
-                cif->flags = (unsigned)FFI_TYPE_UINT16;
-            else if(cif->rtype->size <= 4)
-                cif->flags = (unsigned)FFI_TYPE_UINT32;
-            else if(cif->rtype->size <= 8)
-                cif->flags = (unsigned)FFI_TYPE_UINT64;
-            else
-                cif->flags = (unsigned)cif->rtype->type;
-        }
-        else
-            cif->flags = (unsigned)cif->rtype->type;
-        break;
-    default:
-        cif->flags = (unsigned)cif->rtype->type;
-        break;
-    }
-
-    return FFI_OK;
-}
-
-void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-    extended_cif ecif;
-
-    unsigned int size = 0, i = 0;
-    ffi_type **p_arg;
-
-    ecif.cif = cif;
-    ecif.avalue = avalue;
-
-    for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++)
-        size += (*p_arg)->size + (4 - (*p_arg)->size % 4);
-
-    /* If the return value is a struct and we don't have a return value
-     * address then we need to make one */
-
-    /* If cif->flags is struct then it's not suitable for registers */
-    if((rvalue == NULL) && (cif->flags == FFI_TYPE_STRUCT))
-        ecif.rvalue = alloca(cif->rtype->size);
-    else
-        ecif.rvalue = rvalue;
-
-    switch(cif->abi)
-    {
-    case FFI_SYSV:
-        ffi_call_SYSV(ffi_prep_args, &ecif, size, cif->flags,
-            ecif.rvalue, cif->rstruct_flag, fn);
-        break;
-    default:
-        FFI_ASSERT(0);
-        break;
-    }
-}
-
-static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
-    void **avalue, ffi_cif *cif)
-{
-    register unsigned int i, reg_mask = 0;
-    register void **p_argv;
-    register ffi_type **p_arg;
-    register char *reg_base = stack;
-    register char *stack_base = stack + 20;
-    register unsigned int stack_offset = 0;
-
-#ifdef DEBUG
-    /* Debugging */
-    for(i = 0; i < cif->nargs + 7; i++)
-    {
-        printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack)[i]);
-    }
-#endif
-
-    /* If cif->flags is struct then we know it's not passed in registers */
-    if(cif->flags == FFI_TYPE_STRUCT)
-    {
-        *rvalue = *(void **)reg_base;
-        reg_mask |= 1;
-    }
-
-    p_argv = avalue;
-
-    for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++)
-    {
-        size_t z = (*p_arg)->size;
-        int alignment = (*p_arg)->alignment;
-
-        *p_argv = 0;
-
-        if(z % 4 != 0)
-            z += (4 - z % 4);
-
-        if(reg_mask != 0x1f)
-        {
-            if(pass_struct_on_stack(*p_arg))
-            {
-                *p_argv = (void*)stack_base + stack_offset;
-                stack_offset += z;
-            }
-            else if(z <= sizeof(int))
-            {
-                char index = 0;
-
-                while((reg_mask >> index) & 1)
-                    index++;
-
-                *p_argv = (void*)reg_base + (index * 4);
-                reg_mask |= (1 << index);
-            }
-            else if(z == 2 * sizeof(int))
-            {
-                if(!((reg_mask >> 1) & 1))
-                {
-                    *p_argv = (void*)reg_base + 4;
-                    reg_mask |= (3 << 1);
-                }
-                else if(!((reg_mask >> 3) & 1))
-                {
-                    *p_argv = (void*)reg_base + 12;
-                    reg_mask |= (3 << 3);
-                }
-            }
-        }
-
-        if(!*p_argv)
-        {
-            *p_argv = (void*)stack_base + stack_offset;
-            stack_offset += z;
-        }
-
-        if((*p_arg)->type != FFI_TYPE_STRUCT ||
-            (*p_arg)->elements[1] == NULL)
-        {
-            if(alignment == 1)
-                **(unsigned int**)p_argv <<= 24;
-            else if(alignment == 2)
-                **(unsigned int**)p_argv <<= 16;
-        }
-
-        p_argv++;
-    }
-
-#ifdef DEBUG
-    /* Debugging */
-    for(i = 0; i < cif->nargs; i++)
-    {
-        printf("sp+%d: 0x%08x\n", i*4, *(((unsigned int**)avalue)[i]));
-    }
-#endif
-}
-
-/* This function is jumped to by the trampoline */
-
-unsigned int ffi_closure_SYSV_inner(ffi_closure *closure, void **respp,
-    void *args)
-{
-    ffi_cif *cif;
-    void **arg_area;
-    unsigned int i, size = 0;
-    ffi_type **p_arg;
-
-    cif = closure->cif;
-
-    for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++)
-        size += (*p_arg)->size + (4 - (*p_arg)->size % 4);
-
-    arg_area = (void **)alloca(size);
-
-    /* this call will initialize ARG_AREA, such that each element in that
-     * array points to the corresponding value on the stack; and if the
-     * function returns a structure, it will re-set RESP to point to the
-     * structure return address. */
-
-    ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif);
-
-    (closure->fun)(cif, *respp, arg_area, closure->user_data);
-
-    return cif->flags;
-}
-
-ffi_status ffi_prep_closure_loc(ffi_closure* closure, ffi_cif* cif,
-    void (*fun)(ffi_cif*, void*, void**, void*), void *user_data,
-    void *codeloc)
-{
-    if (cif->abi != FFI_SYSV)
-      return FFI_BAD_ABI;
-
-    unsigned char *__tramp = (unsigned char*)(&closure->tramp[0]);
-    unsigned int  __fun = (unsigned int)(&ffi_closure_SYSV);
-    unsigned int  __ctx = (unsigned int)(codeloc);
-    unsigned int  __rstruct_flag = (unsigned int)(cif->rstruct_flag);
-    unsigned int  __inner = (unsigned int)(&ffi_closure_SYSV_inner);
-    *(unsigned int*) &__tramp[0] = 0xebcd1f00;    /* pushm  r8-r12 */
-    *(unsigned int*) &__tramp[4] = 0xfefc0010;    /* ld.w   r12, pc[16] */
-    *(unsigned int*) &__tramp[8] = 0xfefb0010;    /* ld.w   r11, pc[16] */
-    *(unsigned int*) &__tramp[12] = 0xfefa0010;   /* ld.w   r10, pc[16] */
-    *(unsigned int*) &__tramp[16] = 0xfeff0010;   /* ld.w   pc, pc[16] */
-    *(unsigned int*) &__tramp[20] = __ctx;
-    *(unsigned int*) &__tramp[24] = __rstruct_flag;
-    *(unsigned int*) &__tramp[28] = __inner;
-    *(unsigned int*) &__tramp[32] = __fun;
-    syscall(__NR_cacheflush, 0, (&__tramp[0]), 36);
-
-    closure->cif = cif;
-    closure->user_data = user_data;
-    closure->fun  = fun;
-
-    return FFI_OK;
-}
-
diff --git a/third_party/gofrontend/libffi/src/avr32/ffitarget.h b/third_party/gofrontend/libffi/src/avr32/ffitarget.h
deleted file mode 100644
index d0c7586..0000000
--- a/third_party/gofrontend/libffi/src/avr32/ffitarget.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 2009  Bradley Smith <brad@brad-smith.co.uk>
-   Target configuration macros for AVR32.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_SYSV
-} ffi_abi;
-#endif
-
-#define FFI_EXTRA_CIF_FIELDS unsigned int rstruct_flag
-
-/* Definitions for closures */
-
-#define FFI_CLOSURES 1
-#define FFI_TRAMPOLINE_SIZE 36
-#define FFI_NATIVE_RAW_API 0
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/avr32/sysv.S b/third_party/gofrontend/libffi/src/avr32/sysv.S
deleted file mode 100644
index a984b3c..0000000
--- a/third_party/gofrontend/libffi/src/avr32/sysv.S
+++ /dev/null
@@ -1,208 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2009  Bradley Smith <brad@brad-smith.co.uk>
-
-   AVR32 Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-   CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-   TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-   SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-   --------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-
-    /* r12:  ffi_prep_args
-     * r11:  &ecif
-     * r10:  size
-     * r9:   cif->flags
-     * r8:   ecif.rvalue
-     * sp+0: cif->rstruct_flag
-     * sp+4: fn */
-
-    .text
-    .align  1
-    .globl  ffi_call_SYSV
-    .type   ffi_call_SYSV, @function
-ffi_call_SYSV:
-    stm     --sp, r0,r1,lr
-    stm     --sp, r8-r12
-    mov     r0, sp
-
-    /* Make room for all of the new args. */
-    sub     sp, r10
-    /* Pad to make way for potential skipped registers */
-    sub     sp, 20
-
-    /* Call ffi_prep_args(stack, &ecif). */
-    /* r11 already set */
-    mov     r1, r12
-    mov     r12, sp
-    icall   r1
-
-    /* Save new argument size */
-    mov     r1, r12
-
-    /* Move first 5 parameters in registers. */
-    ldm     sp++, r8-r12
-
-    /* call (fn) (...). */
-    ld.w    r1, r0[36]
-    icall   r1
-
-    /* Remove the space we pushed for the args. */
-    mov     sp, r0
-
-    /* Load r1 with the rstruct flag. */
-    ld.w    r1, sp[32]
-
-    /* Load r9 with the return type code. */
-    ld.w    r9, sp[12]
-
-    /* Load r8 with the return value pointer. */
-    ld.w    r8, sp[16]
-
-    /* If the return value pointer is NULL, assume no return value. */
-    cp.w    r8, 0
-    breq    .Lend
-
-    /* Check if return type is actually a struct */
-    cp.w    r1, 0
-    breq    1f
-
-    /* Return 8bit */
-    cp.w    r9, FFI_TYPE_UINT8
-    breq    .Lstore8
-
-    /* Return 16bit */
-    cp.w    r9, FFI_TYPE_UINT16
-    breq    .Lstore16
-
-1:
-    /* Return 32bit */
-    cp.w    r9, FFI_TYPE_UINT32
-    breq    .Lstore32
-    cp.w    r9, FFI_TYPE_UINT16
-    breq    .Lstore32
-    cp.w    r9, FFI_TYPE_UINT8
-    breq    .Lstore32
-
-    /* Return 64bit */
-    cp.w    r9, FFI_TYPE_UINT64
-    breq    .Lstore64
-
-    /* Didn't match anything */
-    bral    .Lend
-
-.Lstore64:
-    st.w    r8[0], r11
-    st.w    r8[4], r10
-    bral    .Lend
-
-.Lstore32:
-    st.w    r8[0], r12
-    bral    .Lend
-
-.Lstore16:
-    st.h    r8[0], r12
-    bral    .Lend
-
-.Lstore8:
-    st.b    r8[0], r12
-    bral    .Lend
-
-.Lend:
-    sub     sp, -20
-    ldm     sp++, r0,r1,pc
-
-    .size   ffi_call_SYSV, . - ffi_call_SYSV
-
-
-    /* r12:  __ctx
-     * r11:  __rstruct_flag
-     * r10:  __inner */
-
-    .align  1
-    .globl  ffi_closure_SYSV
-    .type   ffi_closure_SYSV, @function
-ffi_closure_SYSV:
-    stm     --sp, r0,lr
-    mov     r0, r11
-    mov     r8, r10
-    sub     r10, sp, -8
-    sub     sp, 12
-    st.w    sp[8], sp
-    sub     r11, sp, -8
-    icall   r8
-
-    /* Check if return type is actually a struct */
-    cp.w    r0, 0
-    breq    1f
-
-    /* Return 8bit */
-    cp.w    r12, FFI_TYPE_UINT8
-    breq    .Lget8
-
-    /* Return 16bit */
-    cp.w    r12, FFI_TYPE_UINT16
-    breq    .Lget16
-
-1:
-    /* Return 32bit */
-    cp.w    r12, FFI_TYPE_UINT32
-    breq    .Lget32
-    cp.w    r12, FFI_TYPE_UINT16
-    breq    .Lget32
-    cp.w    r12, FFI_TYPE_UINT8
-    breq    .Lget32
-
-    /* Return 64bit */
-    cp.w    r12, FFI_TYPE_UINT64
-    breq    .Lget64
-
-    /* Didn't match anything */
-    bral    .Lclend
-
-.Lget64:
-    ld.w    r11, sp[0]
-    ld.w    r10, sp[4]
-    bral    .Lclend
-
-.Lget32:
-    ld.w    r12, sp[0]
-    bral    .Lclend
-
-.Lget16:
-    ld.uh   r12, sp[0]
-    bral    .Lclend
-
-.Lget8:
-    ld.ub   r12, sp[0]
-    bral    .Lclend
-
-.Lclend:
-    sub     sp, -12
-    ldm     sp++, r0,lr
-    sub     sp, -20
-    mov     pc, lr
-
-    .size   ffi_closure_SYSV, . - ffi_closure_SYSV
-
-#if defined __ELF__ && defined __linux__
-    .section    .note.GNU-stack,"",@progbits
-#endif
diff --git a/third_party/gofrontend/libffi/src/bfin/ffi.c b/third_party/gofrontend/libffi/src/bfin/ffi.c
deleted file mode 100644
index 22a2acd..0000000
--- a/third_party/gofrontend/libffi/src/bfin/ffi.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2012  Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>,
-							   Paulo Pizarro <paulo.pizarro@gmail.com>
-
-   Blackfin Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-
-/* Maximum number of GPRs available for argument passing.  */
-#define MAX_GPRARGS 3
-
-/*
- * Return types
- */
-#define FFIBFIN_RET_VOID 0
-#define FFIBFIN_RET_BYTE 1
-#define FFIBFIN_RET_HALFWORD 2
-#define FFIBFIN_RET_INT64 3
-#define FFIBFIN_RET_INT32 4
-
-/*====================================================================*/
-/*                          PROTOTYPE          *
- /*====================================================================*/
-void ffi_prep_args(unsigned char *, extended_cif *);
-
-/*====================================================================*/
-/*                          Externals                                 */
-/*                          (Assembly)                                */
-/*====================================================================*/
-
-extern void ffi_call_SYSV(unsigned, extended_cif *, void(*)(unsigned char *, extended_cif *), unsigned, void *, void(*fn)(void));
-
-/*====================================================================*/
-/*                          Implementation                            */
-/*                                                            */
-/*====================================================================*/
-
-
-/*
- * This function calculates the return type (size) based on type.
- */
-
-ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
-{
-   /* --------------------------------------*
-    *   Return handling                *
-    * --------------------------------------*/
-   switch (cif->rtype->type) {
-      case FFI_TYPE_VOID:
-         cif->flags = FFIBFIN_RET_VOID;
-         break;
-      case FFI_TYPE_UINT16:
-      case FFI_TYPE_SINT16:
-         cif->flags = FFIBFIN_RET_HALFWORD;
-         break;
-      case FFI_TYPE_UINT8:
-         cif->flags = FFIBFIN_RET_BYTE;
-         break;
-      case FFI_TYPE_INT:
-      case FFI_TYPE_UINT32:
-      case FFI_TYPE_SINT32:
-      case FFI_TYPE_FLOAT:
-      case FFI_TYPE_POINTER:
-      case FFI_TYPE_SINT8:
-         cif->flags = FFIBFIN_RET_INT32;
-         break;
-      case FFI_TYPE_SINT64:
-      case FFI_TYPE_UINT64:
-      case FFI_TYPE_DOUBLE:
-          cif->flags = FFIBFIN_RET_INT64;
-          break;
-      case FFI_TYPE_STRUCT:
-         if (cif->rtype->size <= 4){
-        	 cif->flags = FFIBFIN_RET_INT32;
-         }else if (cif->rtype->size == 8){
-        	 cif->flags = FFIBFIN_RET_INT64;
-         }else{
-        	 //it will return via a hidden pointer in P0
-        	 cif->flags = FFIBFIN_RET_VOID;
-         }
-         break;
-      default:
-         FFI_ASSERT(0);
-         break;
-   }
-   return FFI_OK;
-}
-
-/*
- * This will prepare the arguments and will call the assembly routine
- * cif = the call interface
- * fn = the function to be called
- * rvalue = the return value
- * avalue = the arguments
- */
-void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
-{
-   int ret_type = cif->flags;
-   extended_cif ecif;
-   ecif.cif = cif;
-   ecif.avalue = avalue;
-   ecif.rvalue = rvalue;
-
-   switch (cif->abi) {
-      case FFI_SYSV:
-         ffi_call_SYSV(cif->bytes, &ecif, ffi_prep_args, ret_type, ecif.rvalue, fn);
-         break;
-      default:
-         FFI_ASSERT(0);
-         break;
-   }
-}
-
-
-/*
-* This function prepares the parameters (copies them from the ecif to the stack)
-*  to call the function (ffi_prep_args is called by the assembly routine in file
-*  sysv.S, which also calls the actual function)
-*/
-void ffi_prep_args(unsigned char *stack, extended_cif *ecif)
-{
-   register unsigned int i = 0;
-   void **p_argv;
-   unsigned char *argp;
-   ffi_type **p_arg;
-   argp = stack;
-   p_argv = ecif->avalue;
-   for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
-        (i != 0);
-        i--, p_arg++) {
-      size_t z;
-      z = (*p_arg)->size;
-      if (z < sizeof(int)) {
-         z = sizeof(int);
-         switch ((*p_arg)->type) {
-            case FFI_TYPE_SINT8: {
-                  signed char v = *(SINT8 *)(* p_argv);
-                  signed int t = v;
-                  *(signed int *) argp = t;
-               }
-               break;
-            case FFI_TYPE_UINT8: {
-                  unsigned char v = *(UINT8 *)(* p_argv);
-                  unsigned int t = v;
-                  *(unsigned int *) argp = t;
-               }
-               break;
-            case FFI_TYPE_SINT16:
-               *(signed int *) argp = (signed int) * (SINT16 *)(* p_argv);
-               break;
-            case FFI_TYPE_UINT16:
-               *(unsigned int *) argp = (unsigned int) * (UINT16 *)(* p_argv);
-               break;
-            case FFI_TYPE_STRUCT:
-               memcpy(argp, *p_argv, (*p_arg)->size);
-               break;
-            default:
-               FFI_ASSERT(0);
-               break;
-         }
-      } else if (z == sizeof(int)) {
-         *(unsigned int *) argp = (unsigned int) * (UINT32 *)(* p_argv);
-      } else {
-         memcpy(argp, *p_argv, z);
-      }
-      p_argv++;
-      argp += z;
-   }
-}
-
-
-
diff --git a/third_party/gofrontend/libffi/src/bfin/ffitarget.h b/third_party/gofrontend/libffi/src/bfin/ffitarget.h
deleted file mode 100644
index 2175c01..0000000
--- a/third_party/gofrontend/libffi/src/bfin/ffitarget.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffitarget.h - Copyright (c) 2012  Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>
-
-   Blackfin Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed 	 long          ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_SYSV
-} ffi_abi;
-#endif
-
-#endif
-
diff --git a/third_party/gofrontend/libffi/src/bfin/sysv.S b/third_party/gofrontend/libffi/src/bfin/sysv.S
deleted file mode 100644
index f4278be..0000000
--- a/third_party/gofrontend/libffi/src/bfin/sysv.S
+++ /dev/null
@@ -1,179 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2012  Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>,
-                                Paulo Pizarro <paulo.pizarro@gmail.com>
-
-   Blackfin Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-
-.text
-.align 4
-
-	/*
-	 There is a "feature" in the bfin toolchain that it puts a _ before function names
-	 that's why the function here it's called _ffi_call_SYSV and not ffi_call_SYSV
-	 */
-	.global _ffi_call_SYSV;
-	.type _ffi_call_SYSV, STT_FUNC;
-	.func ffi_call_SYSV
-
-	/*
-         cif->bytes    = R0    (fp+8)
-         &ecif         = R1    (fp+12)
-         ffi_prep_args = R2    (fp+16)
-         ret_type      = stack (fp+20)
-         ecif.rvalue   = stack (fp+24)
-         fn            = stack (fp+28)
-                           got (fp+32)
-
-        There is room for improvement here (we can use temporary registers
-        instead of saving the values in the memory)
-        REGS:
-        P5 => Stack pointer (function arguments)
-        R5 => cif->bytes
-        R4 => ret->type
-
-        FP-20 = P3
-        FP-16 = SP (parameters area)
-        FP-12 = SP (temp)
-        FP-08 = function return part 1 [R0]
-        FP-04 = function return part 2 [R1]
-	*/
-
-_ffi_call_SYSV:
-.prologue:
-	LINK 20;
-	[FP-20] = P3;
-	[FP+8] = R0;
-	[FP+12] = R1;
-	[FP+16] = R2;
-
-.allocate_stack:
-	//alocate cif->bytes into the stack
-	R1 = [FP+8];
-	R0 = SP;
-	R0 = R0 - R1;
-	R1 = 4;
-	R0 = R0 - R1;
-	[FP-12] = SP;
-	SP = R0;
-	[FP-16] = SP;
-
-.call_prep_args:
-	//get the addr of prep_args
-	P0 = [P3 + _ffi_prep_args@FUNCDESC_GOT17M4];
-	P1 = [P0];
-	P3 = [P0+4];
-	R0 = [FP-16];//SP (parameter area)
-	R1 = [FP+12];//ecif
-	call (P1);
-
-.call_user_function:
-	//ajust SP so as to allow the user function access the parameters on the stack
-	SP = [FP-16]; //point to function parameters
-	R0 = [SP];
-	R1 = [SP+4];
-	R2 = [SP+8];
-	//load user function address
-	P0 = FP;
-	P0 +=28;
-	P1 = [P0];
-	P1 = [P1];
-	P3 = [P0+4];
-	/*
-		For functions returning aggregate values (struct) occupying more than 8 bytes,
-		the caller allocates the return value object on the stack and the address
-		of this object is passed to the callee as a hidden argument in register P0.
-	*/
-	P0 = [FP+24];
-
-	call (P1);
-	SP = [FP-12];
-.compute_return:
-	P2 = [FP-20];
-	[FP-8] = R0;
-	[FP-4] = R1;
-
-	R0 = [FP+20];
-	R1 = R0 << 2;
-
-	R0 = [P2+.rettable@GOT17M4];
-	R0 = R1 + R0;
-	P2 = R0;
-	R1 = [P2];
-
-	P2 = [FP+-20];
-	R0 = [P2+.rettable@GOT17M4];
-	R0 = R1 + R0;
-	P2 = R0;
-	R0 = [FP-8];
-	R1 = [FP-4];
-	jump (P2);
-
-/*
-#define FFIBFIN_RET_VOID 0
-#define FFIBFIN_RET_BYTE 1
-#define FFIBFIN_RET_HALFWORD 2
-#define FFIBFIN_RET_INT64 3
-#define FFIBFIN_RET_INT32 4
-*/
-.align 4
-.align 4
-.rettable:
-	.dd .epilogue - .rettable
-	.dd	.rbyte - .rettable;
-	.dd	.rhalfword - .rettable;
-	.dd	.rint64 - .rettable;
-	.dd	.rint32 - .rettable;
-
-.rbyte:
-	P0 = [FP+24];
-	R0 = R0.B (Z);
-	[P0] = R0;
-	JUMP .epilogue
-.rhalfword:
-	P0 = [FP+24];
-	R0 = R0.L;
-	[P0] = R0;
-	JUMP .epilogue
-.rint64:
-	P0 = [FP+24];// &rvalue
-	[P0] = R0;
-	[P0+4] = R1;
-	JUMP .epilogue
-.rint32:
-	P0 = [FP+24];
-	[P0] = R0;
-.epilogue:
-	R0 = [FP+8];
-	R1 = [FP+12];
-	R2 = [FP+16];
-	P3 = [FP-20];
-	UNLINK;
-	RTS;
-
-.size _ffi_call_SYSV,.-_ffi_call_SYSV;
-.endfunc
diff --git a/third_party/gofrontend/libffi/src/closures.c b/third_party/gofrontend/libffi/src/closures.c
deleted file mode 100644
index 721ff00..0000000
--- a/third_party/gofrontend/libffi/src/closures.c
+++ /dev/null
@@ -1,688 +0,0 @@
-/* -----------------------------------------------------------------------
-   closures.c - Copyright (c) 2007, 2009, 2010  Red Hat, Inc.
-                Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc
-                Copyright (c) 2011 Plausible Labs Cooperative, Inc.
-
-   Code to allocate and deallocate memory for closures.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#if defined __linux__ && !defined _GNU_SOURCE
-#define _GNU_SOURCE 1
-#endif
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE
-# if __gnu_linux__ && !defined(__ANDROID__)
-/* This macro indicates it may be forbidden to map anonymous memory
-   with both write and execute permission.  Code compiled when this
-   option is defined will attempt to map such pages once, but if it
-   fails, it falls back to creating a temporary file in a writable and
-   executable filesystem and mapping pages from it into separate
-   locations in the virtual memory space, one location writable and
-   another executable.  */
-#  define FFI_MMAP_EXEC_WRIT 1
-#  define HAVE_MNTENT 1
-# endif
-# if defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)
-/* Windows systems may have Data Execution Protection (DEP) enabled, 
-   which requires the use of VirtualMalloc/VirtualFree to alloc/free
-   executable memory. */
-#  define FFI_MMAP_EXEC_WRIT 1
-# endif
-#endif
-
-#if FFI_MMAP_EXEC_WRIT && !defined FFI_MMAP_EXEC_SELINUX
-# ifdef __linux__
-/* When defined to 1 check for SELinux and if SELinux is active,
-   don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that
-   might cause audit messages.  */
-#  define FFI_MMAP_EXEC_SELINUX 1
-# endif
-#endif
-
-#if FFI_CLOSURES
-
-# if FFI_EXEC_TRAMPOLINE_TABLE
-
-// Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations.
-
-# elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */
-
-#define USE_LOCKS 1
-#define USE_DL_PREFIX 1
-#ifdef __GNUC__
-#ifndef USE_BUILTIN_FFS
-#define USE_BUILTIN_FFS 1
-#endif
-#endif
-
-/* We need to use mmap, not sbrk.  */
-#define HAVE_MORECORE 0
-
-/* We could, in theory, support mremap, but it wouldn't buy us anything.  */
-#define HAVE_MREMAP 0
-
-/* We have no use for this, so save some code and data.  */
-#define NO_MALLINFO 1
-
-/* We need all allocations to be in regular segments, otherwise we
-   lose track of the corresponding code address.  */
-#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T
-
-/* Don't allocate more than a page unless needed.  */
-#define DEFAULT_GRANULARITY ((size_t)malloc_getpagesize)
-
-#if FFI_CLOSURE_TEST
-/* Don't release single pages, to avoid a worst-case scenario of
-   continuously allocating and releasing single pages, but release
-   pairs of pages, which should do just as well given that allocations
-   are likely to be small.  */
-#define DEFAULT_TRIM_THRESHOLD ((size_t)malloc_getpagesize)
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#ifndef _MSC_VER
-#include <unistd.h>
-#endif
-#include <string.h>
-#include <stdio.h>
-#if !defined(X86_WIN32) && !defined(X86_WIN64)
-#ifdef HAVE_MNTENT
-#include <mntent.h>
-#endif /* HAVE_MNTENT */
-#include <sys/param.h>
-#include <pthread.h>
-
-/* We don't want sys/mman.h to be included after we redefine mmap and
-   dlmunmap.  */
-#include <sys/mman.h>
-#define LACKS_SYS_MMAN_H 1
-
-#if FFI_MMAP_EXEC_SELINUX
-#include <sys/statfs.h>
-#include <stdlib.h>
-
-static int selinux_enabled = -1;
-
-static int
-selinux_enabled_check (void)
-{
-  struct statfs sfs;
-  FILE *f;
-  char *buf = NULL;
-  size_t len = 0;
-
-  if (statfs ("/selinux", &sfs) >= 0
-      && (unsigned int) sfs.f_type == 0xf97cff8cU)
-    return 1;
-  f = fopen ("/proc/mounts", "r");
-  if (f == NULL)
-    return 0;
-  while (getline (&buf, &len, f) >= 0)
-    {
-      char *p = strchr (buf, ' ');
-      if (p == NULL)
-        break;
-      p = strchr (p + 1, ' ');
-      if (p == NULL)
-        break;
-      if (strncmp (p + 1, "selinuxfs ", 10) == 0)
-        {
-          free (buf);
-          fclose (f);
-          return 1;
-        }
-    }
-  free (buf);
-  fclose (f);
-  return 0;
-}
-
-#define is_selinux_enabled() (selinux_enabled >= 0 ? selinux_enabled \
-			      : (selinux_enabled = selinux_enabled_check ()))
-
-#else
-
-#define is_selinux_enabled() 0
-
-#endif /* !FFI_MMAP_EXEC_SELINUX */
-
-/* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */
-#ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX
-#include <stdlib.h>
-
-static int emutramp_enabled = -1;
-
-static int
-emutramp_enabled_check (void)
-{
-  char *buf = NULL;
-  size_t len = 0;
-  FILE *f;
-  int ret;
-  f = fopen ("/proc/self/status", "r");
-  if (f == NULL)
-    return 0;
-  ret = 0;
-
-  while (getline (&buf, &len, f) != -1)
-    if (!strncmp (buf, "PaX:", 4))
-      {
-        char emutramp;
-        if (sscanf (buf, "%*s %*c%c", &emutramp) == 1)
-          ret = (emutramp == 'E');
-        break;
-      }
-  free (buf);
-  fclose (f);
-  return ret;
-}
-
-#define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \
-                               : (emutramp_enabled = emutramp_enabled_check ()))
-#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
-
-#elif defined (__CYGWIN__) || defined(__INTERIX)
-
-#include <sys/mman.h>
-
-/* Cygwin is Linux-like, but not quite that Linux-like.  */
-#define is_selinux_enabled() 0
-
-#endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */
-
-#ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX
-#define is_emutramp_enabled() 0
-#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
-
-/* Declare all functions defined in dlmalloc.c as static.  */
-static void *dlmalloc(size_t);
-static void dlfree(void*);
-static void *dlcalloc(size_t, size_t) MAYBE_UNUSED;
-static void *dlrealloc(void *, size_t) MAYBE_UNUSED;
-static void *dlmemalign(size_t, size_t) MAYBE_UNUSED;
-static void *dlvalloc(size_t) MAYBE_UNUSED;
-static int dlmallopt(int, int) MAYBE_UNUSED;
-static size_t dlmalloc_footprint(void) MAYBE_UNUSED;
-static size_t dlmalloc_max_footprint(void) MAYBE_UNUSED;
-static void** dlindependent_calloc(size_t, size_t, void**) MAYBE_UNUSED;
-static void** dlindependent_comalloc(size_t, size_t*, void**) MAYBE_UNUSED;
-static void *dlpvalloc(size_t) MAYBE_UNUSED;
-static int dlmalloc_trim(size_t) MAYBE_UNUSED;
-static size_t dlmalloc_usable_size(void*) MAYBE_UNUSED;
-static void dlmalloc_stats(void) MAYBE_UNUSED;
-
-#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX)
-/* Use these for mmap and munmap within dlmalloc.c.  */
-static void *dlmmap(void *, size_t, int, int, int, off_t);
-static int dlmunmap(void *, size_t);
-#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */
-
-#define mmap dlmmap
-#define munmap dlmunmap
-
-#include "dlmalloc.c"
-
-#undef mmap
-#undef munmap
-
-#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX)
-
-/* A mutex used to synchronize access to *exec* variables in this file.  */
-static pthread_mutex_t open_temp_exec_file_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-/* A file descriptor of a temporary file from which we'll map
-   executable pages.  */
-static int execfd = -1;
-
-/* The amount of space already allocated from the temporary file.  */
-static size_t execsize = 0;
-
-/* Open a temporary file name, and immediately unlink it.  */
-static int
-open_temp_exec_file_name (char *name, int flags)
-{
-  int fd;
-
-#ifdef HAVE_MKOSTEMP
-  fd = mkostemp (name, flags);
-#else
-  fd = mkstemp (name);
-#endif
-
-  if (fd != -1)
-    unlink (name);
-
-  return fd;
-}
-
-/* Open a temporary file in the named directory.  */
-static int
-open_temp_exec_file_dir (const char *dir)
-{
-  static const char suffix[] = "/ffiXXXXXX";
-  int lendir, flags;
-  char *tempname;
-#ifdef O_TMPFILE
-  int fd;
-#endif
-
-#ifdef O_CLOEXEC
-  flags = O_CLOEXEC;
-#else
-  flags = 0;
-#endif
-
-#ifdef O_TMPFILE
-  fd = open (dir, flags | O_RDWR | O_EXCL | O_TMPFILE, 0700);
-  /* If the running system does not support the O_TMPFILE flag then retry without it. */
-  if (fd != -1 || (errno != EINVAL && errno != EISDIR && errno != EOPNOTSUPP)) {
-    return fd;
-  } else {
-    errno = 0;
-  }
-#endif
-
-  lendir = strlen (dir);
-  tempname = __builtin_alloca (lendir + sizeof (suffix));
-
-  if (!tempname)
-    return -1;
-
-  memcpy (tempname, dir, lendir);
-  memcpy (tempname + lendir, suffix, sizeof (suffix));
-
-  return open_temp_exec_file_name (tempname, flags);
-}
-
-/* Open a temporary file in the directory in the named environment
-   variable.  */
-static int
-open_temp_exec_file_env (const char *envvar)
-{
-  const char *value = getenv (envvar);
-
-  if (!value)
-    return -1;
-
-  return open_temp_exec_file_dir (value);
-}
-
-#ifdef HAVE_MNTENT
-/* Open a temporary file in an executable and writable mount point
-   listed in the mounts file.  Subsequent calls with the same mounts
-   keep searching for mount points in the same file.  Providing NULL
-   as the mounts file closes the file.  */
-static int
-open_temp_exec_file_mnt (const char *mounts)
-{
-  static const char *last_mounts;
-  static FILE *last_mntent;
-
-  if (mounts != last_mounts)
-    {
-      if (last_mntent)
-	endmntent (last_mntent);
-
-      last_mounts = mounts;
-
-      if (mounts)
-	last_mntent = setmntent (mounts, "r");
-      else
-	last_mntent = NULL;
-    }
-
-  if (!last_mntent)
-    return -1;
-
-  for (;;)
-    {
-      int fd;
-      struct mntent mnt;
-      char buf[MAXPATHLEN * 3];
-
-      if (getmntent_r (last_mntent, &mnt, buf, sizeof (buf)) == NULL)
-	return -1;
-
-      if (hasmntopt (&mnt, "ro")
-	  || hasmntopt (&mnt, "noexec")
-	  || access (mnt.mnt_dir, W_OK))
-	continue;
-
-      fd = open_temp_exec_file_dir (mnt.mnt_dir);
-
-      if (fd != -1)
-	return fd;
-    }
-}
-#endif /* HAVE_MNTENT */
-
-/* Instructions to look for a location to hold a temporary file that
-   can be mapped in for execution.  */
-static struct
-{
-  int (*func)(const char *);
-  const char *arg;
-  int repeat;
-} open_temp_exec_file_opts[] = {
-  { open_temp_exec_file_env, "TMPDIR", 0 },
-  { open_temp_exec_file_dir, "/tmp", 0 },
-  { open_temp_exec_file_dir, "/var/tmp", 0 },
-  { open_temp_exec_file_dir, "/dev/shm", 0 },
-  { open_temp_exec_file_env, "HOME", 0 },
-#ifdef HAVE_MNTENT
-  { open_temp_exec_file_mnt, "/etc/mtab", 1 },
-  { open_temp_exec_file_mnt, "/proc/mounts", 1 },
-#endif /* HAVE_MNTENT */
-};
-
-/* Current index into open_temp_exec_file_opts.  */
-static int open_temp_exec_file_opts_idx = 0;
-
-/* Reset a current multi-call func, then advances to the next entry.
-   If we're at the last, go back to the first and return nonzero,
-   otherwise return zero.  */
-static int
-open_temp_exec_file_opts_next (void)
-{
-  if (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat)
-    open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func (NULL);
-
-  open_temp_exec_file_opts_idx++;
-  if (open_temp_exec_file_opts_idx
-      == (sizeof (open_temp_exec_file_opts)
-	  / sizeof (*open_temp_exec_file_opts)))
-    {
-      open_temp_exec_file_opts_idx = 0;
-      return 1;
-    }
-
-  return 0;
-}
-
-/* Return a file descriptor of a temporary zero-sized file in a
-   writable and executable filesystem.  */
-static int
-open_temp_exec_file (void)
-{
-  int fd;
-
-  do
-    {
-      fd = open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func
-	(open_temp_exec_file_opts[open_temp_exec_file_opts_idx].arg);
-
-      if (!open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat
-	  || fd == -1)
-	{
-	  if (open_temp_exec_file_opts_next ())
-	    break;
-	}
-    }
-  while (fd == -1);
-
-  return fd;
-}
-
-/* Map in a chunk of memory from the temporary exec file into separate
-   locations in the virtual memory address space, one writable and one
-   executable.  Returns the address of the writable portion, after
-   storing an offset to the corresponding executable portion at the
-   last word of the requested chunk.  */
-static void *
-dlmmap_locked (void *start, size_t length, int prot, int flags, off_t offset)
-{
-  void *ptr;
-
-  if (execfd == -1)
-    {
-      open_temp_exec_file_opts_idx = 0;
-    retry_open:
-      execfd = open_temp_exec_file ();
-      if (execfd == -1)
-	return MFAIL;
-    }
-
-  offset = execsize;
-
-  if (ftruncate (execfd, offset + length))
-    return MFAIL;
-
-  flags &= ~(MAP_PRIVATE | MAP_ANONYMOUS);
-  flags |= MAP_SHARED;
-
-  ptr = mmap (NULL, length, (prot & ~PROT_WRITE) | PROT_EXEC,
-	      flags, execfd, offset);
-  if (ptr == MFAIL)
-    {
-      if (!offset)
-	{
-	  close (execfd);
-	  goto retry_open;
-	}
-      ftruncate (execfd, offset);
-      return MFAIL;
-    }
-  else if (!offset
-	   && open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat)
-    open_temp_exec_file_opts_next ();
-
-  start = mmap (start, length, prot, flags, execfd, offset);
-
-  if (start == MFAIL)
-    {
-      munmap (ptr, length);
-      ftruncate (execfd, offset);
-      return start;
-    }
-
-  mmap_exec_offset ((char *)start, length) = (char*)ptr - (char*)start;
-
-  execsize += length;
-
-  return start;
-}
-
-/* Map in a writable and executable chunk of memory if possible.
-   Failing that, fall back to dlmmap_locked.  */
-static void *
-dlmmap (void *start, size_t length, int prot,
-	int flags, int fd, off_t offset)
-{
-  void *ptr;
-
-  assert (start == NULL && length % malloc_getpagesize == 0
-	  && prot == (PROT_READ | PROT_WRITE)
-	  && flags == (MAP_PRIVATE | MAP_ANONYMOUS)
-	  && fd == -1 && offset == 0);
-
-#if FFI_CLOSURE_TEST
-  printf ("mapping in %zi\n", length);
-#endif
-
-  if (execfd == -1 && is_emutramp_enabled ())
-    {
-      ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset);
-      return ptr;
-    }
-
-  if (execfd == -1 && !is_selinux_enabled ())
-    {
-      ptr = mmap (start, length, prot | PROT_EXEC, flags, fd, offset);
-
-      if (ptr != MFAIL || (errno != EPERM && errno != EACCES))
-	/* Cool, no need to mess with separate segments.  */
-	return ptr;
-
-      /* If MREMAP_DUP is ever introduced and implemented, try mmap
-	 with ((prot & ~PROT_WRITE) | PROT_EXEC) and mremap with
-	 MREMAP_DUP and prot at this point.  */
-    }
-
-  if (execsize == 0 || execfd == -1)
-    {
-      pthread_mutex_lock (&open_temp_exec_file_mutex);
-      ptr = dlmmap_locked (start, length, prot, flags, offset);
-      pthread_mutex_unlock (&open_temp_exec_file_mutex);
-
-      return ptr;
-    }
-
-  return dlmmap_locked (start, length, prot, flags, offset);
-}
-
-/* Release memory at the given address, as well as the corresponding
-   executable page if it's separate.  */
-static int
-dlmunmap (void *start, size_t length)
-{
-  /* We don't bother decreasing execsize or truncating the file, since
-     we can't quite tell whether we're unmapping the end of the file.
-     We don't expect frequent deallocation anyway.  If we did, we
-     could locate pages in the file by writing to the pages being
-     deallocated and checking that the file contents change.
-     Yuck.  */
-  msegmentptr seg = segment_holding (gm, start);
-  void *code;
-
-#if FFI_CLOSURE_TEST
-  printf ("unmapping %zi\n", length);
-#endif
-
-  if (seg && (code = add_segment_exec_offset (start, seg)) != start)
-    {
-      int ret = munmap (code, length);
-      if (ret)
-	return ret;
-    }
-
-  return munmap (start, length);
-}
-
-#if FFI_CLOSURE_FREE_CODE
-/* Return segment holding given code address.  */
-static msegmentptr
-segment_holding_code (mstate m, char* addr)
-{
-  msegmentptr sp = &m->seg;
-  for (;;) {
-    if (addr >= add_segment_exec_offset (sp->base, sp)
-	&& addr < add_segment_exec_offset (sp->base, sp) + sp->size)
-      return sp;
-    if ((sp = sp->next) == 0)
-      return 0;
-  }
-}
-#endif
-
-#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */
-
-/* Allocate a chunk of memory with the given size.  Returns a pointer
-   to the writable address, and sets *CODE to the executable
-   corresponding virtual address.  */
-void *
-ffi_closure_alloc (size_t size, void **code)
-{
-  void *ptr;
-
-  if (!code)
-    return NULL;
-
-  ptr = dlmalloc (size);
-
-  if (ptr)
-    {
-      msegmentptr seg = segment_holding (gm, ptr);
-
-      *code = add_segment_exec_offset (ptr, seg);
-    }
-
-  return ptr;
-}
-
-/* Release a chunk of memory allocated with ffi_closure_alloc.  If
-   FFI_CLOSURE_FREE_CODE is nonzero, the given address can be the
-   writable or the executable address given.  Otherwise, only the
-   writable address can be provided here.  */
-void
-ffi_closure_free (void *ptr)
-{
-#if FFI_CLOSURE_FREE_CODE
-  msegmentptr seg = segment_holding_code (gm, ptr);
-
-  if (seg)
-    ptr = sub_segment_exec_offset (ptr, seg);
-#endif
-
-  dlfree (ptr);
-}
-
-
-#if FFI_CLOSURE_TEST
-/* Do some internal sanity testing to make sure allocation and
-   deallocation of pages are working as intended.  */
-int main ()
-{
-  void *p[3];
-#define GET(idx, len) do { p[idx] = dlmalloc (len); printf ("allocated %zi for p[%i]\n", (len), (idx)); } while (0)
-#define PUT(idx) do { printf ("freeing p[%i]\n", (idx)); dlfree (p[idx]); } while (0)
-  GET (0, malloc_getpagesize / 2);
-  GET (1, 2 * malloc_getpagesize - 64 * sizeof (void*));
-  PUT (1);
-  GET (1, 2 * malloc_getpagesize);
-  GET (2, malloc_getpagesize / 2);
-  PUT (1);
-  PUT (0);
-  PUT (2);
-  return 0;
-}
-#endif /* FFI_CLOSURE_TEST */
-# else /* ! FFI_MMAP_EXEC_WRIT */
-
-/* On many systems, memory returned by malloc is writable and
-   executable, so just use it.  */
-
-#include <stdlib.h>
-
-void *
-ffi_closure_alloc (size_t size, void **code)
-{
-  if (!code)
-    return NULL;
-
-  return *code = malloc (size);
-}
-
-void
-ffi_closure_free (void *ptr)
-{
-  free (ptr);
-}
-
-# endif /* ! FFI_MMAP_EXEC_WRIT */
-#endif /* FFI_CLOSURES */
diff --git a/third_party/gofrontend/libffi/src/cris/ffi.c b/third_party/gofrontend/libffi/src/cris/ffi.c
deleted file mode 100644
index aaca5b1..0000000
--- a/third_party/gofrontend/libffi/src/cris/ffi.c
+++ /dev/null
@@ -1,386 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 1998 Cygnus Solutions
-           Copyright (c) 2004 Simon Posnjak
-	   Copyright (c) 2005 Axis Communications AB
-	   Copyright (C) 2007 Free Software Foundation, Inc.
-
-   CRIS Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG)
-
-static ffi_status
-initialize_aggregate_packed_struct (ffi_type * arg)
-{
-  ffi_type **ptr;
-
-  FFI_ASSERT (arg != NULL);
-
-  FFI_ASSERT (arg->elements != NULL);
-  FFI_ASSERT (arg->size == 0);
-  FFI_ASSERT (arg->alignment == 0);
-
-  ptr = &(arg->elements[0]);
-
-  while ((*ptr) != NULL)
-    {
-      if (((*ptr)->size == 0)
-	  && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK))
-	return FFI_BAD_TYPEDEF;
-
-      FFI_ASSERT (ffi_type_test ((*ptr)));
-
-      arg->size += (*ptr)->size;
-
-      arg->alignment = (arg->alignment > (*ptr)->alignment) ?
-	arg->alignment : (*ptr)->alignment;
-
-      ptr++;
-    }
-
-  if (arg->size == 0)
-    return FFI_BAD_TYPEDEF;
-  else
-    return FFI_OK;
-}
-
-int
-ffi_prep_args (char *stack, extended_cif * ecif)
-{
-  unsigned int i;
-  unsigned int struct_count = 0;
-  void **p_argv;
-  char *argp;
-  ffi_type **p_arg;
-
-  argp = stack;
-
-  p_argv = ecif->avalue;
-
-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
-       (i != 0); i--, p_arg++)
-    {
-      size_t z;
-
-      switch ((*p_arg)->type)
-	{
-	case FFI_TYPE_STRUCT:
-	  {
-	    z = (*p_arg)->size;
-	    if (z <= 4)
-	      {
-		memcpy (argp, *p_argv, z);
-		z = 4;
-	      }
-	    else if (z <= 8)
-	      {
-		memcpy (argp, *p_argv, z);
-		z = 8;
-	      }
-	    else
-	      {
-		unsigned int uiLocOnStack;
-		z = sizeof (void *);
-		uiLocOnStack = 4 * ecif->cif->nargs + struct_count;
-		struct_count = struct_count + (*p_arg)->size;
-		*(unsigned int *) argp =
-		  (unsigned int) (UINT32 *) (stack + uiLocOnStack);
-		memcpy ((stack + uiLocOnStack), *p_argv, (*p_arg)->size);
-	      }
-	    break;
-	  }
-	default:
-	  z = (*p_arg)->size;
-	  if (z < sizeof (int))
-	    {
-	      switch ((*p_arg)->type)
-		{
-		case FFI_TYPE_SINT8:
-		  *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv);
-		  break;
-
-		case FFI_TYPE_UINT8:
-		  *(unsigned int *) argp =
-		    (unsigned int) *(UINT8 *) (*p_argv);
-		  break;
-
-		case FFI_TYPE_SINT16:
-		  *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv);
-		  break;
-
-		case FFI_TYPE_UINT16:
-		  *(unsigned int *) argp =
-		    (unsigned int) *(UINT16 *) (*p_argv);
-		  break;
-
-		default:
-		  FFI_ASSERT (0);
-		}
-	      z = sizeof (int);
-	    }
-	  else if (z == sizeof (int))
-	    *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv);
-	  else
-	    memcpy (argp, *p_argv, z);
-	  break;
-	}
-      p_argv++;
-      argp += z;
-    }
-
-  return (struct_count);
-}
-
-ffi_status FFI_HIDDEN
-ffi_prep_cif_core (ffi_cif * cif,
-	           ffi_abi abi, unsigned int isvariadic,
-		   unsigned int nfixedargs, unsigned int ntotalargs,
-	           ffi_type * rtype, ffi_type ** atypes)
-{
-  unsigned bytes = 0;
-  unsigned int i;
-  ffi_type **ptr;
-
-  FFI_ASSERT (cif != NULL);
-  FFI_ASSERT((!isvariadic) || (nfixedargs >= 1));
-  FFI_ASSERT(nfixedargs <= ntotalargs);
-  FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI);
-
-  cif->abi = abi;
-  cif->arg_types = atypes;
-  cif->nargs = ntotalargs;
-  cif->rtype = rtype;
-
-  cif->flags = 0;
-
-  if ((cif->rtype->size == 0)
-      && (initialize_aggregate_packed_struct (cif->rtype) != FFI_OK))
-    return FFI_BAD_TYPEDEF;
-
-  FFI_ASSERT_VALID_TYPE (cif->rtype);
-
-  for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
-    {
-      if (((*ptr)->size == 0)
-	  && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK))
-	return FFI_BAD_TYPEDEF;
-
-      FFI_ASSERT_VALID_TYPE (*ptr);
-
-      if (((*ptr)->alignment - 1) & bytes)
-	bytes = ALIGN (bytes, (*ptr)->alignment);
-      if ((*ptr)->type == FFI_TYPE_STRUCT)
-	{
-	  if ((*ptr)->size > 8)
-	    {
-	      bytes += (*ptr)->size;
-	      bytes += sizeof (void *);
-	    }
-	  else
-	    {
-	      if ((*ptr)->size > 4)
-		bytes += 8;
-	      else
-		bytes += 4;
-	    }
-	}
-      else
-	bytes += STACK_ARG_SIZE ((*ptr)->size);
-    }
-
-  cif->bytes = bytes;
-
-  return ffi_prep_cif_machdep (cif);
-}
-
-ffi_status
-ffi_prep_cif_machdep (ffi_cif * cif)
-{
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_VOID:
-    case FFI_TYPE_STRUCT:
-    case FFI_TYPE_FLOAT:
-    case FFI_TYPE_DOUBLE:
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-      cif->flags = (unsigned) cif->rtype->type;
-      break;
-
-    default:
-      cif->flags = FFI_TYPE_INT;
-      break;
-    }
-
-  return FFI_OK;
-}
-
-extern void ffi_call_SYSV (int (*)(char *, extended_cif *),
-			   extended_cif *,
-			   unsigned, unsigned, unsigned *, void (*fn) ())
-     __attribute__ ((__visibility__ ("hidden")));
-
-void
-ffi_call (ffi_cif * cif, void (*fn) (), void *rvalue, void **avalue)
-{
-  extended_cif ecif;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-
-  if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT))
-    {
-      ecif.rvalue = alloca (cif->rtype->size);
-    }
-  else
-    ecif.rvalue = rvalue;
-
-  switch (cif->abi)
-    {
-    case FFI_SYSV:
-      ffi_call_SYSV (ffi_prep_args, &ecif, cif->bytes,
-		     cif->flags, ecif.rvalue, fn);
-      break;
-    default:
-      FFI_ASSERT (0);
-      break;
-    }
-}
-
-/* Because the following variables are not exported outside libffi, we
-   mark them hidden.  */
-
-/* Assembly code for the jump stub.  */
-extern const char ffi_cris_trampoline_template[]
- __attribute__ ((__visibility__ ("hidden")));
-
-/* Offset into ffi_cris_trampoline_template of where to put the
-   ffi_prep_closure_inner function.  */
-extern const int ffi_cris_trampoline_fn_offset
- __attribute__ ((__visibility__ ("hidden")));
-
-/* Offset into ffi_cris_trampoline_template of where to put the
-   closure data.  */
-extern const int ffi_cris_trampoline_closure_offset
- __attribute__ ((__visibility__ ("hidden")));
-
-/* This function is sibling-called (jumped to) by the closure
-   trampoline.  We get R10..R13 at PARAMS[0..3] and a copy of [SP] at
-   PARAMS[4] to simplify handling of a straddling parameter.  A copy
-   of R9 is at PARAMS[5] and SP at PARAMS[6].  These parameters are
-   put at the appropriate place in CLOSURE which is then executed and
-   the return value is passed back to the caller.  */
-
-static unsigned long long
-ffi_prep_closure_inner (void **params, ffi_closure* closure)
-{
-  char *register_args = (char *) params;
-  void *struct_ret = params[5];
-  char *stack_args = params[6];
-  char *ptr = register_args;
-  ffi_cif *cif = closure->cif;
-  ffi_type **arg_types = cif->arg_types;
-
-  /* Max room needed is number of arguments as 64-bit values.  */
-  void **avalue = alloca (closure->cif->nargs * sizeof(void *));
-  int i;
-  int doing_regs;
-  long long llret = 0;
-
-  /* Find the address of each argument.  */
-  for (i = 0, doing_regs = 1; i < cif->nargs; i++)
-    {
-      /* Types up to and including 8 bytes go by-value.  */
-      if (arg_types[i]->size <= 4)
-	{
-	  avalue[i] = ptr;
-	  ptr += 4;
-	}
-      else if (arg_types[i]->size <= 8)
-	{
-	  avalue[i] = ptr;
-	  ptr += 8;
-	}
-      else
-	{
-	  FFI_ASSERT (arg_types[i]->type == FFI_TYPE_STRUCT);
-
-	  /* Passed by-reference, so copy the pointer.  */
-	  avalue[i] = *(void **) ptr;
-	  ptr += 4;
-	}
-
-      /* If we've handled more arguments than fit in registers, start
-	 looking at the those passed on the stack.  Step over the
-	 first one if we had a straddling parameter.  */
-      if (doing_regs && ptr >= register_args + 4*4)
-	{
-	  ptr = stack_args + ((ptr > register_args + 4*4) ? 4 : 0);
-	  doing_regs = 0;
-	}
-    }
-
-  /* Invoke the closure.  */
-  (closure->fun) (cif,
-
-		  cif->rtype->type == FFI_TYPE_STRUCT
-		  /* The caller allocated space for the return
-		     structure, and passed a pointer to this space in
-		     R9.  */
-		  ? struct_ret
-
-		  /* We take advantage of being able to ignore that
-		     the high part isn't set if the return value is
-		     not in R10:R11, but in R10 only.  */
-		  : (void *) &llret,
-
-		  avalue, closure->user_data);
-
-  return llret;
-}
-
-/* API function: Prepare the trampoline.  */
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun)(ffi_cif *, void *, void **, void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  void *innerfn = ffi_prep_closure_inner;
-  FFI_ASSERT (cif->abi == FFI_SYSV);
-  closure->cif  = cif;
-  closure->user_data = user_data;
-  closure->fun  = fun;
-  memcpy (closure->tramp, ffi_cris_trampoline_template,
-	  FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE);
-  memcpy (closure->tramp + ffi_cris_trampoline_fn_offset,
-	  &innerfn, sizeof (void *));
-  memcpy (closure->tramp + ffi_cris_trampoline_closure_offset,
-	  &codeloc, sizeof (void *));
-
-  return FFI_OK;
-}
diff --git a/third_party/gofrontend/libffi/src/cris/ffitarget.h b/third_party/gofrontend/libffi/src/cris/ffitarget.h
deleted file mode 100644
index b837e97..0000000
--- a/third_party/gofrontend/libffi/src/cris/ffitarget.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 1996-2003  Red Hat, Inc.
-   Target configuration macros for CRIS.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_SYSV
-} ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE 36
-#define FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE (7*4)
-#define FFI_TRAMPOLINE_SIZE \
- (FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE + FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE)
-#define FFI_NATIVE_RAW_API 0
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/cris/sysv.S b/third_party/gofrontend/libffi/src/cris/sysv.S
deleted file mode 100644
index 79abaee..0000000
--- a/third_party/gofrontend/libffi/src/cris/sysv.S
+++ /dev/null
@@ -1,215 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2004 Simon Posnjak
-	    Copyright (c) 2005 Axis Communications AB
-
-   CRIS Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <ffi.h>
-#define CONCAT(x,y) x ## y
-#define XCONCAT(x,y) CONCAT (x, y)
-#define L(x) XCONCAT (__USER_LABEL_PREFIX__, x)
-
-	.text
-
-	;; OK, when we get called we should have this (according to
-	;; AXIS ETRAX 100LX Programmer's Manual chapter 6.3).
-	;;
-	;; R10:	 ffi_prep_args (func. pointer)
-	;; R11:  &ecif
-	;; R12:  cif->bytes
-	;; R13:  fig->flags
-	;; sp+0: ecif.rvalue
-	;; sp+4: fn (function pointer to the function that we need to call)
-
-	.globl  L(ffi_call_SYSV)
-	.type   L(ffi_call_SYSV),@function
-	.hidden	L(ffi_call_SYSV)
-
-L(ffi_call_SYSV):
-	;; Save the regs to the stack.
-	push $srp
-	;; Used for stack pointer saving.
-	push $r6
-	;; Used for function address pointer.
-	push $r7
-	;; Used for stack pointer saving.
-	push $r8
-	;; We save fig->flags to stack we will need them after we
-	;; call The Function.
-	push $r13
-
-	;; Saving current stack pointer.
-	move.d $sp,$r8
-	move.d $sp,$r6
-
-	;; Move address of ffi_prep_args to r13.
-	move.d $r10,$r13
-
-	;; Make room on the stack for the args of fn.
-	sub.d  $r12,$sp
-
-	;; Function void ffi_prep_args(char *stack, extended_cif *ecif) parameters are:
-	;; 	r10 <-- stack pointer
-	;; 	r11 <-- &ecif (already there)
-	move.d $sp,$r10
-
-	;; Call the function.
-	jsr $r13
-
-	;; Save the size of the structures which are passed on stack.
-	move.d $r10,$r7
-
-	;; Move first four args in to r10..r13.
-	move.d [$sp+0],$r10
-	move.d [$sp+4],$r11
-	move.d [$sp+8],$r12
-	move.d [$sp+12],$r13
-
-	;; Adjust the stack and check if any parameters are given on stack.
-	addq 16,$sp
-	sub.d $r7,$r6
-	cmp.d $sp,$r6
-
-	bpl go_on
-	nop
-
-go_on_no_params_on_stack:
-	move.d $r6,$sp
-
-go_on:
-	;; Discover if we need to put rval address in to r9.
-	move.d [$r8+0],$r7
-	cmpq FFI_TYPE_STRUCT,$r7
-	bne call_now
-	nop
-
-	;; Move rval address to $r9.
-	move.d [$r8+20],$r9
-
-call_now:
-	;; Move address of The Function in to r7.
-	move.d [$r8+24],$r7
-
-	;; Call The Function.
-	jsr $r7
-
-	;; Reset stack.
-	move.d $r8,$sp
-
-	;; Load rval type (fig->flags) in to r13.
-	pop $r13
-
-	;; Detect rval type.
-	cmpq FFI_TYPE_VOID,$r13
-	beq epilogue
-
-	cmpq FFI_TYPE_STRUCT,$r13
-	beq epilogue
-
-	cmpq FFI_TYPE_DOUBLE,$r13
-	beq return_double_or_longlong
-
-	cmpq FFI_TYPE_UINT64,$r13
-	beq return_double_or_longlong
-
-	cmpq FFI_TYPE_SINT64,$r13
-	beq return_double_or_longlong
-	nop
-
-	;; Just return the 32 bit value.
-	ba return
-	nop
-
-return_double_or_longlong:
-	;; Load half of the rval to r10 and the other half to r11.
-	move.d [$sp+16],$r13
-	move.d $r10,[$r13]
-	addq 4,$r13
-	move.d $r11,[$r13]
-	ba epilogue
-	nop
-
-return:
-	;; Load the rval to r10.
-	move.d [$sp+16],$r13
-	move.d $r10,[$r13]
-
-epilogue:
-	pop $r8
-	pop $r7
-	pop $r6
-	Jump [$sp+]
-
-	.size   ffi_call_SYSV,.-ffi_call_SYSV
-
-/* Save R10..R13 into an array, somewhat like varargs.  Copy the next
-   argument too, to simplify handling of any straddling parameter.
-   Save R9 and SP after those.  Jump to function handling the rest.
-   Since this is a template, copied and the main function filled in by
-   the user.  */
-
-	.globl	L(ffi_cris_trampoline_template)
-	.type	L(ffi_cris_trampoline_template),@function
-	.hidden	L(ffi_cris_trampoline_template)
-
-L(ffi_cris_trampoline_template):
-0:
-	/* The value we get for "PC" is right after the prefix instruction,
-	   two bytes from the beginning, i.e. 0b+2. */
-	move.d $r10,[$pc+2f-(0b+2)]
-	move.d $pc,$r10
-1:
-	addq 2f-1b+4,$r10
-	move.d $r11,[$r10+]
-	move.d $r12,[$r10+]
-	move.d $r13,[$r10+]
-	move.d [$sp],$r11
-	move.d $r11,[$r10+]
-	move.d $r9,[$r10+]
-	move.d $sp,[$r10+]
-	subq FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE,$r10
-	move.d 0,$r11
-3:
-        jump 0
-2:
-	.size	ffi_cris_trampoline_template,.-0b
-
-/* This macro create a constant usable as "extern const int \name" in
-   C from within libffi, when \name has no prefix decoration.  */
-
-	.macro const name,value
-	.globl	\name
-	.type	\name,@object
-	.hidden	\name
-\name:
-	.dword  \value
-	.size	\name,4
-	.endm
-
-/* Constants for offsets within the trampoline.  We could do this with
-   just symbols, avoiding memory contents and memory accesses, but the
-   C usage code would look a bit stranger.  */
-
-	const L(ffi_cris_trampoline_fn_offset),2b-4-0b
-	const L(ffi_cris_trampoline_closure_offset),3b-4-0b
diff --git a/third_party/gofrontend/libffi/src/debug.c b/third_party/gofrontend/libffi/src/debug.c
deleted file mode 100644
index f3172b1..0000000
--- a/third_party/gofrontend/libffi/src/debug.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -----------------------------------------------------------------------
-   debug.c - Copyright (c) 1996 Red Hat, Inc.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-/* General debugging routines */
-
-void ffi_stop_here(void)
-{
-  /* This function is only useful for debugging purposes.
-     Place a breakpoint on ffi_stop_here to be notified of
-     significant events. */
-}
-
-/* This function should only be called via the FFI_ASSERT() macro */
-
-void ffi_assert(char *expr, char *file, int line)
-{
-  fprintf(stderr, "ASSERTION FAILURE: %s at %s:%d\n", expr, file, line);
-  ffi_stop_here();
-  abort();
-}
-
-/* Perform a sanity check on an ffi_type structure */
-
-void ffi_type_test(ffi_type *a, char *file, int line)
-{
-  FFI_ASSERT_AT(a != NULL, file, line);
-
-  FFI_ASSERT_AT(a->type <= FFI_TYPE_LAST, file, line);
-  FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->size > 0, file, line);
-  FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->alignment > 0, file, line);
-  FFI_ASSERT_AT((a->type != FFI_TYPE_STRUCT && a->type != FFI_TYPE_COMPLEX)
-		|| a->elements != NULL, file, line);
-  FFI_ASSERT_AT(a->type != FFI_TYPE_COMPLEX
-		|| (a->elements != NULL
-		    && a->elements[0] != NULL && a->elements[1] == NULL),
-		file, line);
-
-}
diff --git a/third_party/gofrontend/libffi/src/dlmalloc.c b/third_party/gofrontend/libffi/src/dlmalloc.c
deleted file mode 100644
index 7e4ea83..0000000
--- a/third_party/gofrontend/libffi/src/dlmalloc.c
+++ /dev/null
@@ -1,5161 +0,0 @@
-/*
-  This is a version (aka dlmalloc) of malloc/free/realloc written by
-  Doug Lea and released to the public domain, as explained at
-  http://creativecommons.org/licenses/publicdomain.  Send questions,
-  comments, complaints, performance data, etc to dl@cs.oswego.edu
-
-* Version 2.8.3 Thu Sep 22 11:16:15 2005  Doug Lea  (dl at gee)
-
-   Note: There may be an updated version of this malloc obtainable at
-           ftp://gee.cs.oswego.edu/pub/misc/malloc.c
-         Check before installing!
-
-* Quickstart
-
-  This library is all in one file to simplify the most common usage:
-  ftp it, compile it (-O3), and link it into another program. All of
-  the compile-time options default to reasonable values for use on
-  most platforms.  You might later want to step through various
-  compile-time and dynamic tuning options.
-
-  For convenience, an include file for code using this malloc is at:
-     ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h
-  You don't really need this .h file unless you call functions not
-  defined in your system include files.  The .h file contains only the
-  excerpts from this file needed for using this malloc on ANSI C/C++
-  systems, so long as you haven't changed compile-time options about
-  naming and tuning parameters.  If you do, then you can create your
-  own malloc.h that does include all settings by cutting at the point
-  indicated below. Note that you may already by default be using a C
-  library containing a malloc that is based on some version of this
-  malloc (for example in linux). You might still want to use the one
-  in this file to customize settings or to avoid overheads associated
-  with library versions.
-
-* Vital statistics:
-
-  Supported pointer/size_t representation:       4 or 8 bytes
-       size_t MUST be an unsigned type of the same width as
-       pointers. (If you are using an ancient system that declares
-       size_t as a signed type, or need it to be a different width
-       than pointers, you can use a previous release of this malloc
-       (e.g. 2.7.2) supporting these.)
-
-  Alignment:                                     8 bytes (default)
-       This suffices for nearly all current machines and C compilers.
-       However, you can define MALLOC_ALIGNMENT to be wider than this
-       if necessary (up to 128bytes), at the expense of using more space.
-
-  Minimum overhead per allocated chunk:   4 or  8 bytes (if 4byte sizes)
-                                          8 or 16 bytes (if 8byte sizes)
-       Each malloced chunk has a hidden word of overhead holding size
-       and status information, and additional cross-check word
-       if FOOTERS is defined.
-
-  Minimum allocated size: 4-byte ptrs:  16 bytes    (including overhead)
-                          8-byte ptrs:  32 bytes    (including overhead)
-
-       Even a request for zero bytes (i.e., malloc(0)) returns a
-       pointer to something of the minimum allocatable size.
-       The maximum overhead wastage (i.e., number of extra bytes
-       allocated than were requested in malloc) is less than or equal
-       to the minimum size, except for requests >= mmap_threshold that
-       are serviced via mmap(), where the worst case wastage is about
-       32 bytes plus the remainder from a system page (the minimal
-       mmap unit); typically 4096 or 8192 bytes.
-
-  Security: static-safe; optionally more or less
-       The "security" of malloc refers to the ability of malicious
-       code to accentuate the effects of errors (for example, freeing
-       space that is not currently malloc'ed or overwriting past the
-       ends of chunks) in code that calls malloc.  This malloc
-       guarantees not to modify any memory locations below the base of
-       heap, i.e., static variables, even in the presence of usage
-       errors.  The routines additionally detect most improper frees
-       and reallocs.  All this holds as long as the static bookkeeping
-       for malloc itself is not corrupted by some other means.  This
-       is only one aspect of security -- these checks do not, and
-       cannot, detect all possible programming errors.
-
-       If FOOTERS is defined nonzero, then each allocated chunk
-       carries an additional check word to verify that it was malloced
-       from its space.  These check words are the same within each
-       execution of a program using malloc, but differ across
-       executions, so externally crafted fake chunks cannot be
-       freed. This improves security by rejecting frees/reallocs that
-       could corrupt heap memory, in addition to the checks preventing
-       writes to statics that are always on.  This may further improve
-       security at the expense of time and space overhead.  (Note that
-       FOOTERS may also be worth using with MSPACES.)
-
-       By default detected errors cause the program to abort (calling
-       "abort()"). You can override this to instead proceed past
-       errors by defining PROCEED_ON_ERROR.  In this case, a bad free
-       has no effect, and a malloc that encounters a bad address
-       caused by user overwrites will ignore the bad address by
-       dropping pointers and indices to all known memory. This may
-       be appropriate for programs that should continue if at all
-       possible in the face of programming errors, although they may
-       run out of memory because dropped memory is never reclaimed.
-
-       If you don't like either of these options, you can define
-       CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything
-       else. And if if you are sure that your program using malloc has
-       no errors or vulnerabilities, you can define INSECURE to 1,
-       which might (or might not) provide a small performance improvement.
-
-  Thread-safety: NOT thread-safe unless USE_LOCKS defined
-       When USE_LOCKS is defined, each public call to malloc, free,
-       etc is surrounded with either a pthread mutex or a win32
-       spinlock (depending on WIN32). This is not especially fast, and
-       can be a major bottleneck.  It is designed only to provide
-       minimal protection in concurrent environments, and to provide a
-       basis for extensions.  If you are using malloc in a concurrent
-       program, consider instead using ptmalloc, which is derived from
-       a version of this malloc. (See http://www.malloc.de).
-
-  System requirements: Any combination of MORECORE and/or MMAP/MUNMAP
-       This malloc can use unix sbrk or any emulation (invoked using
-       the CALL_MORECORE macro) and/or mmap/munmap or any emulation
-       (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system
-       memory.  On most unix systems, it tends to work best if both
-       MORECORE and MMAP are enabled.  On Win32, it uses emulations
-       based on VirtualAlloc. It also uses common C library functions
-       like memset.
-
-  Compliance: I believe it is compliant with the Single Unix Specification
-       (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably
-       others as well.
-
-* Overview of algorithms
-
-  This is not the fastest, most space-conserving, most portable, or
-  most tunable malloc ever written. However it is among the fastest
-  while also being among the most space-conserving, portable and
-  tunable.  Consistent balance across these factors results in a good
-  general-purpose allocator for malloc-intensive programs.
-
-  In most ways, this malloc is a best-fit allocator. Generally, it
-  chooses the best-fitting existing chunk for a request, with ties
-  broken in approximately least-recently-used order. (This strategy
-  normally maintains low fragmentation.) However, for requests less
-  than 256bytes, it deviates from best-fit when there is not an
-  exactly fitting available chunk by preferring to use space adjacent
-  to that used for the previous small request, as well as by breaking
-  ties in approximately most-recently-used order. (These enhance
-  locality of series of small allocations.)  And for very large requests
-  (>= 256Kb by default), it relies on system memory mapping
-  facilities, if supported.  (This helps avoid carrying around and
-  possibly fragmenting memory used only for large chunks.)
-
-  All operations (except malloc_stats and mallinfo) have execution
-  times that are bounded by a constant factor of the number of bits in
-  a size_t, not counting any clearing in calloc or copying in realloc,
-  or actions surrounding MORECORE and MMAP that have times
-  proportional to the number of non-contiguous regions returned by
-  system allocation routines, which is often just 1.
-
-  The implementation is not very modular and seriously overuses
-  macros. Perhaps someday all C compilers will do as good a job
-  inlining modular code as can now be done by brute-force expansion,
-  but now, enough of them seem not to.
-
-  Some compilers issue a lot of warnings about code that is
-  dead/unreachable only on some platforms, and also about intentional
-  uses of negation on unsigned types. All known cases of each can be
-  ignored.
-
-  For a longer but out of date high-level description, see
-     http://gee.cs.oswego.edu/dl/html/malloc.html
-
-* MSPACES
-  If MSPACES is defined, then in addition to malloc, free, etc.,
-  this file also defines mspace_malloc, mspace_free, etc. These
-  are versions of malloc routines that take an "mspace" argument
-  obtained using create_mspace, to control all internal bookkeeping.
-  If ONLY_MSPACES is defined, only these versions are compiled.
-  So if you would like to use this allocator for only some allocations,
-  and your system malloc for others, you can compile with
-  ONLY_MSPACES and then do something like...
-    static mspace mymspace = create_mspace(0,0); // for example
-    #define mymalloc(bytes)  mspace_malloc(mymspace, bytes)
-
-  (Note: If you only need one instance of an mspace, you can instead
-  use "USE_DL_PREFIX" to relabel the global malloc.)
-
-  You can similarly create thread-local allocators by storing
-  mspaces as thread-locals. For example:
-    static __thread mspace tlms = 0;
-    void*  tlmalloc(size_t bytes) {
-      if (tlms == 0) tlms = create_mspace(0, 0);
-      return mspace_malloc(tlms, bytes);
-    }
-    void  tlfree(void* mem) { mspace_free(tlms, mem); }
-
-  Unless FOOTERS is defined, each mspace is completely independent.
-  You cannot allocate from one and free to another (although
-  conformance is only weakly checked, so usage errors are not always
-  caught). If FOOTERS is defined, then each chunk carries around a tag
-  indicating its originating mspace, and frees are directed to their
-  originating spaces.
-
- -------------------------  Compile-time options ---------------------------
-
-Be careful in setting #define values for numerical constants of type
-size_t. On some systems, literal values are not automatically extended
-to size_t precision unless they are explicitly casted.
-
-WIN32                    default: defined if _WIN32 defined
-  Defining WIN32 sets up defaults for MS environment and compilers.
-  Otherwise defaults are for unix.
-
-MALLOC_ALIGNMENT         default: (size_t)8
-  Controls the minimum alignment for malloc'ed chunks.  It must be a
-  power of two and at least 8, even on machines for which smaller
-  alignments would suffice. It may be defined as larger than this
-  though. Note however that code and data structures are optimized for
-  the case of 8-byte alignment.
-
-MSPACES                  default: 0 (false)
-  If true, compile in support for independent allocation spaces.
-  This is only supported if HAVE_MMAP is true.
-
-ONLY_MSPACES             default: 0 (false)
-  If true, only compile in mspace versions, not regular versions.
-
-USE_LOCKS                default: 0 (false)
-  Causes each call to each public routine to be surrounded with
-  pthread or WIN32 mutex lock/unlock. (If set true, this can be
-  overridden on a per-mspace basis for mspace versions.)
-
-FOOTERS                  default: 0
-  If true, provide extra checking and dispatching by placing
-  information in the footers of allocated chunks. This adds
-  space and time overhead.
-
-INSECURE                 default: 0
-  If true, omit checks for usage errors and heap space overwrites.
-
-USE_DL_PREFIX            default: NOT defined
-  Causes compiler to prefix all public routines with the string 'dl'.
-  This can be useful when you only want to use this malloc in one part
-  of a program, using your regular system malloc elsewhere.
-
-ABORT                    default: defined as abort()
-  Defines how to abort on failed checks.  On most systems, a failed
-  check cannot die with an "assert" or even print an informative
-  message, because the underlying print routines in turn call malloc,
-  which will fail again.  Generally, the best policy is to simply call
-  abort(). It's not very useful to do more than this because many
-  errors due to overwriting will show up as address faults (null, odd
-  addresses etc) rather than malloc-triggered checks, so will also
-  abort.  Also, most compilers know that abort() does not return, so
-  can better optimize code conditionally calling it.
-
-PROCEED_ON_ERROR           default: defined as 0 (false)
-  Controls whether detected bad addresses cause them to bypassed
-  rather than aborting. If set, detected bad arguments to free and
-  realloc are ignored. And all bookkeeping information is zeroed out
-  upon a detected overwrite of freed heap space, thus losing the
-  ability to ever return it from malloc again, but enabling the
-  application to proceed. If PROCEED_ON_ERROR is defined, the
-  static variable malloc_corruption_error_count is compiled in
-  and can be examined to see if errors have occurred. This option
-  generates slower code than the default abort policy.
-
-DEBUG                    default: NOT defined
-  The DEBUG setting is mainly intended for people trying to modify
-  this code or diagnose problems when porting to new platforms.
-  However, it may also be able to better isolate user errors than just
-  using runtime checks.  The assertions in the check routines spell
-  out in more detail the assumptions and invariants underlying the
-  algorithms.  The checking is fairly extensive, and will slow down
-  execution noticeably. Calling malloc_stats or mallinfo with DEBUG
-  set will attempt to check every non-mmapped allocated and free chunk
-  in the course of computing the summaries.
-
-ABORT_ON_ASSERT_FAILURE   default: defined as 1 (true)
-  Debugging assertion failures can be nearly impossible if your
-  version of the assert macro causes malloc to be called, which will
-  lead to a cascade of further failures, blowing the runtime stack.
-  ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(),
-  which will usually make debugging easier.
-
-MALLOC_FAILURE_ACTION     default: sets errno to ENOMEM, or no-op on win32
-  The action to take before "return 0" when malloc fails to be able to
-  return memory because there is none available.
-
-HAVE_MORECORE             default: 1 (true) unless win32 or ONLY_MSPACES
-  True if this system supports sbrk or an emulation of it.
-
-MORECORE                  default: sbrk
-  The name of the sbrk-style system routine to call to obtain more
-  memory.  See below for guidance on writing custom MORECORE
-  functions. The type of the argument to sbrk/MORECORE varies across
-  systems.  It cannot be size_t, because it supports negative
-  arguments, so it is normally the signed type of the same width as
-  size_t (sometimes declared as "intptr_t").  It doesn't much matter
-  though. Internally, we only call it with arguments less than half
-  the max value of a size_t, which should work across all reasonable
-  possibilities, although sometimes generating compiler warnings.  See
-  near the end of this file for guidelines for creating a custom
-  version of MORECORE.
-
-MORECORE_CONTIGUOUS       default: 1 (true)
-  If true, take advantage of fact that consecutive calls to MORECORE
-  with positive arguments always return contiguous increasing
-  addresses.  This is true of unix sbrk. It does not hurt too much to
-  set it true anyway, since malloc copes with non-contiguities.
-  Setting it false when definitely non-contiguous saves time
-  and possibly wasted space it would take to discover this though.
-
-MORECORE_CANNOT_TRIM      default: NOT defined
-  True if MORECORE cannot release space back to the system when given
-  negative arguments. This is generally necessary only if you are
-  using a hand-crafted MORECORE function that cannot handle negative
-  arguments.
-
-HAVE_MMAP                 default: 1 (true)
-  True if this system supports mmap or an emulation of it.  If so, and
-  HAVE_MORECORE is not true, MMAP is used for all system
-  allocation. If set and HAVE_MORECORE is true as well, MMAP is
-  primarily used to directly allocate very large blocks. It is also
-  used as a backup strategy in cases where MORECORE fails to provide
-  space from system. Note: A single call to MUNMAP is assumed to be
-  able to unmap memory that may have be allocated using multiple calls
-  to MMAP, so long as they are adjacent.
-
-HAVE_MREMAP               default: 1 on linux, else 0
-  If true realloc() uses mremap() to re-allocate large blocks and
-  extend or shrink allocation spaces.
-
-MMAP_CLEARS               default: 1 on unix
-  True if mmap clears memory so calloc doesn't need to. This is true
-  for standard unix mmap using /dev/zero.
-
-USE_BUILTIN_FFS            default: 0 (i.e., not used)
-  Causes malloc to use the builtin ffs() function to compute indices.
-  Some compilers may recognize and intrinsify ffs to be faster than the
-  supplied C version. Also, the case of x86 using gcc is special-cased
-  to an asm instruction, so is already as fast as it can be, and so
-  this setting has no effect. (On most x86s, the asm version is only
-  slightly faster than the C version.)
-
-malloc_getpagesize         default: derive from system includes, or 4096.
-  The system page size. To the extent possible, this malloc manages
-  memory from the system in page-size units.  This may be (and
-  usually is) a function rather than a constant. This is ignored
-  if WIN32, where page size is determined using getSystemInfo during
-  initialization.
-
-USE_DEV_RANDOM             default: 0 (i.e., not used)
-  Causes malloc to use /dev/random to initialize secure magic seed for
-  stamping footers. Otherwise, the current time is used.
-
-NO_MALLINFO                default: 0
-  If defined, don't compile "mallinfo". This can be a simple way
-  of dealing with mismatches between system declarations and
-  those in this file.
-
-MALLINFO_FIELD_TYPE        default: size_t
-  The type of the fields in the mallinfo struct. This was originally
-  defined as "int" in SVID etc, but is more usefully defined as
-  size_t. The value is used only if  HAVE_USR_INCLUDE_MALLOC_H is not set
-
-REALLOC_ZERO_BYTES_FREES    default: not defined
-  This should be set if a call to realloc with zero bytes should 
-  be the same as a call to free. Some people think it should. Otherwise, 
-  since this malloc returns a unique pointer for malloc(0), so does 
-  realloc(p, 0).
-
-LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H
-LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H,  LACKS_ERRNO_H
-LACKS_STDLIB_H                default: NOT defined unless on WIN32
-  Define these if your system does not have these header files.
-  You might need to manually insert some of the declarations they provide.
-
-DEFAULT_GRANULARITY        default: page size if MORECORE_CONTIGUOUS,
-                                system_info.dwAllocationGranularity in WIN32,
-                                otherwise 64K.
-      Also settable using mallopt(M_GRANULARITY, x)
-  The unit for allocating and deallocating memory from the system.  On
-  most systems with contiguous MORECORE, there is no reason to
-  make this more than a page. However, systems with MMAP tend to
-  either require or encourage larger granularities.  You can increase
-  this value to prevent system allocation functions to be called so
-  often, especially if they are slow.  The value must be at least one
-  page and must be a power of two.  Setting to 0 causes initialization
-  to either page size or win32 region size.  (Note: In previous
-  versions of malloc, the equivalent of this option was called
-  "TOP_PAD")
-
-DEFAULT_TRIM_THRESHOLD    default: 2MB
-      Also settable using mallopt(M_TRIM_THRESHOLD, x)
-  The maximum amount of unused top-most memory to keep before
-  releasing via malloc_trim in free().  Automatic trimming is mainly
-  useful in long-lived programs using contiguous MORECORE.  Because
-  trimming via sbrk can be slow on some systems, and can sometimes be
-  wasteful (in cases where programs immediately afterward allocate
-  more large chunks) the value should be high enough so that your
-  overall system performance would improve by releasing this much
-  memory.  As a rough guide, you might set to a value close to the
-  average size of a process (program) running on your system.
-  Releasing this much memory would allow such a process to run in
-  memory.  Generally, it is worth tuning trim thresholds when a
-  program undergoes phases where several large chunks are allocated
-  and released in ways that can reuse each other's storage, perhaps
-  mixed with phases where there are no such chunks at all. The trim
-  value must be greater than page size to have any useful effect.  To
-  disable trimming completely, you can set to MAX_SIZE_T. Note that the trick
-  some people use of mallocing a huge space and then freeing it at
-  program startup, in an attempt to reserve system memory, doesn't
-  have the intended effect under automatic trimming, since that memory
-  will immediately be returned to the system.
-
-DEFAULT_MMAP_THRESHOLD       default: 256K
-      Also settable using mallopt(M_MMAP_THRESHOLD, x)
-  The request size threshold for using MMAP to directly service a
-  request. Requests of at least this size that cannot be allocated
-  using already-existing space will be serviced via mmap.  (If enough
-  normal freed space already exists it is used instead.)  Using mmap
-  segregates relatively large chunks of memory so that they can be
-  individually obtained and released from the host system. A request
-  serviced through mmap is never reused by any other request (at least
-  not directly; the system may just so happen to remap successive
-  requests to the same locations).  Segregating space in this way has
-  the benefits that: Mmapped space can always be individually released
-  back to the system, which helps keep the system level memory demands
-  of a long-lived program low.  Also, mapped memory doesn't become
-  `locked' between other chunks, as can happen with normally allocated
-  chunks, which means that even trimming via malloc_trim would not
-  release them.  However, it has the disadvantage that the space
-  cannot be reclaimed, consolidated, and then used to service later
-  requests, as happens with normal chunks.  The advantages of mmap
-  nearly always outweigh disadvantages for "large" chunks, but the
-  value of "large" may vary across systems.  The default is an
-  empirically derived value that works well in most systems. You can
-  disable mmap by setting to MAX_SIZE_T.
-
-*/
-
-#ifndef WIN32
-#ifdef _WIN32
-#define WIN32 1
-#endif  /* _WIN32 */
-#endif  /* WIN32 */
-#ifdef WIN32
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#define HAVE_MMAP 1
-#define HAVE_MORECORE 0
-#define LACKS_UNISTD_H
-#define LACKS_SYS_PARAM_H
-#define LACKS_SYS_MMAN_H
-#define LACKS_STRING_H
-#define LACKS_STRINGS_H
-#define LACKS_SYS_TYPES_H
-#define LACKS_ERRNO_H
-#define MALLOC_FAILURE_ACTION
-#define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */
-#endif  /* WIN32 */
-
-#ifdef __OS2__
-#define INCL_DOS
-#include <os2.h>
-#define HAVE_MMAP 1
-#define HAVE_MORECORE 0
-#define LACKS_SYS_MMAN_H
-#endif  /* __OS2__ */
-
-#if defined(DARWIN) || defined(_DARWIN)
-/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */
-#ifndef HAVE_MORECORE
-#define HAVE_MORECORE 0
-#define HAVE_MMAP 1
-#endif  /* HAVE_MORECORE */
-#endif  /* DARWIN */
-
-#ifndef LACKS_SYS_TYPES_H
-#include <sys/types.h>  /* For size_t */
-#endif  /* LACKS_SYS_TYPES_H */
-
-/* The maximum possible size_t value has all bits set */
-#define MAX_SIZE_T           (~(size_t)0)
-
-#ifndef ONLY_MSPACES
-#define ONLY_MSPACES 0
-#endif  /* ONLY_MSPACES */
-#ifndef MSPACES
-#if ONLY_MSPACES
-#define MSPACES 1
-#else   /* ONLY_MSPACES */
-#define MSPACES 0
-#endif  /* ONLY_MSPACES */
-#endif  /* MSPACES */
-#ifndef MALLOC_ALIGNMENT
-#define MALLOC_ALIGNMENT ((size_t)8U)
-#endif  /* MALLOC_ALIGNMENT */
-#ifndef FOOTERS
-#define FOOTERS 0
-#endif  /* FOOTERS */
-#ifndef ABORT
-#define ABORT  abort()
-#endif  /* ABORT */
-#ifndef ABORT_ON_ASSERT_FAILURE
-#define ABORT_ON_ASSERT_FAILURE 1
-#endif  /* ABORT_ON_ASSERT_FAILURE */
-#ifndef PROCEED_ON_ERROR
-#define PROCEED_ON_ERROR 0
-#endif  /* PROCEED_ON_ERROR */
-#ifndef USE_LOCKS
-#define USE_LOCKS 0
-#endif  /* USE_LOCKS */
-#ifndef INSECURE
-#define INSECURE 0
-#endif  /* INSECURE */
-#ifndef HAVE_MMAP
-#define HAVE_MMAP 1
-#endif  /* HAVE_MMAP */
-#ifndef MMAP_CLEARS
-#define MMAP_CLEARS 1
-#endif  /* MMAP_CLEARS */
-#ifndef HAVE_MREMAP
-#ifdef linux
-#define HAVE_MREMAP 1
-#else   /* linux */
-#define HAVE_MREMAP 0
-#endif  /* linux */
-#endif  /* HAVE_MREMAP */
-#ifndef MALLOC_FAILURE_ACTION
-#define MALLOC_FAILURE_ACTION  errno = ENOMEM;
-#endif  /* MALLOC_FAILURE_ACTION */
-#ifndef HAVE_MORECORE
-#if ONLY_MSPACES
-#define HAVE_MORECORE 0
-#else   /* ONLY_MSPACES */
-#define HAVE_MORECORE 1
-#endif  /* ONLY_MSPACES */
-#endif  /* HAVE_MORECORE */
-#if !HAVE_MORECORE
-#define MORECORE_CONTIGUOUS 0
-#else   /* !HAVE_MORECORE */
-#ifndef MORECORE
-#define MORECORE sbrk
-#endif  /* MORECORE */
-#ifndef MORECORE_CONTIGUOUS
-#define MORECORE_CONTIGUOUS 1
-#endif  /* MORECORE_CONTIGUOUS */
-#endif  /* HAVE_MORECORE */
-#ifndef DEFAULT_GRANULARITY
-#if MORECORE_CONTIGUOUS
-#define DEFAULT_GRANULARITY (0)  /* 0 means to compute in init_mparams */
-#else   /* MORECORE_CONTIGUOUS */
-#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U)
-#endif  /* MORECORE_CONTIGUOUS */
-#endif  /* DEFAULT_GRANULARITY */
-#ifndef DEFAULT_TRIM_THRESHOLD
-#ifndef MORECORE_CANNOT_TRIM
-#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U)
-#else   /* MORECORE_CANNOT_TRIM */
-#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T
-#endif  /* MORECORE_CANNOT_TRIM */
-#endif  /* DEFAULT_TRIM_THRESHOLD */
-#ifndef DEFAULT_MMAP_THRESHOLD
-#if HAVE_MMAP
-#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U)
-#else   /* HAVE_MMAP */
-#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T
-#endif  /* HAVE_MMAP */
-#endif  /* DEFAULT_MMAP_THRESHOLD */
-#ifndef USE_BUILTIN_FFS
-#define USE_BUILTIN_FFS 0
-#endif  /* USE_BUILTIN_FFS */
-#ifndef USE_DEV_RANDOM
-#define USE_DEV_RANDOM 0
-#endif  /* USE_DEV_RANDOM */
-#ifndef NO_MALLINFO
-#define NO_MALLINFO 0
-#endif  /* NO_MALLINFO */
-#ifndef MALLINFO_FIELD_TYPE
-#define MALLINFO_FIELD_TYPE size_t
-#endif  /* MALLINFO_FIELD_TYPE */
-
-/*
-  mallopt tuning options.  SVID/XPG defines four standard parameter
-  numbers for mallopt, normally defined in malloc.h.  None of these
-  are used in this malloc, so setting them has no effect. But this
-  malloc does support the following options.
-*/
-
-#define M_TRIM_THRESHOLD     (-1)
-#define M_GRANULARITY        (-2)
-#define M_MMAP_THRESHOLD     (-3)
-
-/* ------------------------ Mallinfo declarations ------------------------ */
-
-#if !NO_MALLINFO
-/*
-  This version of malloc supports the standard SVID/XPG mallinfo
-  routine that returns a struct containing usage properties and
-  statistics. It should work on any system that has a
-  /usr/include/malloc.h defining struct mallinfo.  The main
-  declaration needed is the mallinfo struct that is returned (by-copy)
-  by mallinfo().  The malloinfo struct contains a bunch of fields that
-  are not even meaningful in this version of malloc.  These fields are
-  are instead filled by mallinfo() with other numbers that might be of
-  interest.
-
-  HAVE_USR_INCLUDE_MALLOC_H should be set if you have a
-  /usr/include/malloc.h file that includes a declaration of struct
-  mallinfo.  If so, it is included; else a compliant version is
-  declared below.  These must be precisely the same for mallinfo() to
-  work.  The original SVID version of this struct, defined on most
-  systems with mallinfo, declares all fields as ints. But some others
-  define as unsigned long. If your system defines the fields using a
-  type of different width than listed here, you MUST #include your
-  system version and #define HAVE_USR_INCLUDE_MALLOC_H.
-*/
-
-/* #define HAVE_USR_INCLUDE_MALLOC_H */
-
-#ifdef HAVE_USR_INCLUDE_MALLOC_H
-#include "/usr/include/malloc.h"
-#else /* HAVE_USR_INCLUDE_MALLOC_H */
-
-/* HP-UX's stdlib.h redefines mallinfo unless _STRUCT_MALLINFO is defined */
-#define _STRUCT_MALLINFO
-
-struct mallinfo {
-  MALLINFO_FIELD_TYPE arena;    /* non-mmapped space allocated from system */
-  MALLINFO_FIELD_TYPE ordblks;  /* number of free chunks */
-  MALLINFO_FIELD_TYPE smblks;   /* always 0 */
-  MALLINFO_FIELD_TYPE hblks;    /* always 0 */
-  MALLINFO_FIELD_TYPE hblkhd;   /* space in mmapped regions */
-  MALLINFO_FIELD_TYPE usmblks;  /* maximum total allocated space */
-  MALLINFO_FIELD_TYPE fsmblks;  /* always 0 */
-  MALLINFO_FIELD_TYPE uordblks; /* total allocated space */
-  MALLINFO_FIELD_TYPE fordblks; /* total free space */
-  MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */
-};
-
-#endif /* HAVE_USR_INCLUDE_MALLOC_H */
-#endif /* NO_MALLINFO */
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#if !ONLY_MSPACES
-
-/* ------------------- Declarations of public routines ------------------- */
-
-#ifndef USE_DL_PREFIX
-#define dlcalloc               calloc
-#define dlfree                 free
-#define dlmalloc               malloc
-#define dlmemalign             memalign
-#define dlrealloc              realloc
-#define dlvalloc               valloc
-#define dlpvalloc              pvalloc
-#define dlmallinfo             mallinfo
-#define dlmallopt              mallopt
-#define dlmalloc_trim          malloc_trim
-#define dlmalloc_stats         malloc_stats
-#define dlmalloc_usable_size   malloc_usable_size
-#define dlmalloc_footprint     malloc_footprint
-#define dlmalloc_max_footprint malloc_max_footprint
-#define dlindependent_calloc   independent_calloc
-#define dlindependent_comalloc independent_comalloc
-#endif /* USE_DL_PREFIX */
-
-
-/*
-  malloc(size_t n)
-  Returns a pointer to a newly allocated chunk of at least n bytes, or
-  null if no space is available, in which case errno is set to ENOMEM
-  on ANSI C systems.
-
-  If n is zero, malloc returns a minimum-sized chunk. (The minimum
-  size is 16 bytes on most 32bit systems, and 32 bytes on 64bit
-  systems.)  Note that size_t is an unsigned type, so calls with
-  arguments that would be negative if signed are interpreted as
-  requests for huge amounts of space, which will often fail. The
-  maximum supported value of n differs across systems, but is in all
-  cases less than the maximum representable value of a size_t.
-*/
-void* dlmalloc(size_t);
-
-/*
-  free(void* p)
-  Releases the chunk of memory pointed to by p, that had been previously
-  allocated using malloc or a related routine such as realloc.
-  It has no effect if p is null. If p was not malloced or already
-  freed, free(p) will by default cause the current program to abort.
-*/
-void  dlfree(void*);
-
-/*
-  calloc(size_t n_elements, size_t element_size);
-  Returns a pointer to n_elements * element_size bytes, with all locations
-  set to zero.
-*/
-void* dlcalloc(size_t, size_t);
-
-/*
-  realloc(void* p, size_t n)
-  Returns a pointer to a chunk of size n that contains the same data
-  as does chunk p up to the minimum of (n, p's size) bytes, or null
-  if no space is available.
-
-  The returned pointer may or may not be the same as p. The algorithm
-  prefers extending p in most cases when possible, otherwise it
-  employs the equivalent of a malloc-copy-free sequence.
-
-  If p is null, realloc is equivalent to malloc.
-
-  If space is not available, realloc returns null, errno is set (if on
-  ANSI) and p is NOT freed.
-
-  if n is for fewer bytes than already held by p, the newly unused
-  space is lopped off and freed if possible.  realloc with a size
-  argument of zero (re)allocates a minimum-sized chunk.
-
-  The old unix realloc convention of allowing the last-free'd chunk
-  to be used as an argument to realloc is not supported.
-*/
-
-void* dlrealloc(void*, size_t);
-
-/*
-  memalign(size_t alignment, size_t n);
-  Returns a pointer to a newly allocated chunk of n bytes, aligned
-  in accord with the alignment argument.
-
-  The alignment argument should be a power of two. If the argument is
-  not a power of two, the nearest greater power is used.
-  8-byte alignment is guaranteed by normal malloc calls, so don't
-  bother calling memalign with an argument of 8 or less.
-
-  Overreliance on memalign is a sure way to fragment space.
-*/
-void* dlmemalign(size_t, size_t);
-
-/*
-  valloc(size_t n);
-  Equivalent to memalign(pagesize, n), where pagesize is the page
-  size of the system. If the pagesize is unknown, 4096 is used.
-*/
-void* dlvalloc(size_t);
-
-/*
-  mallopt(int parameter_number, int parameter_value)
-  Sets tunable parameters The format is to provide a
-  (parameter-number, parameter-value) pair.  mallopt then sets the
-  corresponding parameter to the argument value if it can (i.e., so
-  long as the value is meaningful), and returns 1 if successful else
-  0.  SVID/XPG/ANSI defines four standard param numbers for mallopt,
-  normally defined in malloc.h.  None of these are use in this malloc,
-  so setting them has no effect. But this malloc also supports other
-  options in mallopt. See below for details.  Briefly, supported
-  parameters are as follows (listed defaults are for "typical"
-  configurations).
-
-  Symbol            param #  default    allowed param values
-  M_TRIM_THRESHOLD     -1   2*1024*1024   any   (MAX_SIZE_T disables)
-  M_GRANULARITY        -2     page size   any power of 2 >= page size
-  M_MMAP_THRESHOLD     -3      256*1024   any   (or 0 if no MMAP support)
-*/
-int dlmallopt(int, int);
-
-/*
-  malloc_footprint();
-  Returns the number of bytes obtained from the system.  The total
-  number of bytes allocated by malloc, realloc etc., is less than this
-  value. Unlike mallinfo, this function returns only a precomputed
-  result, so can be called frequently to monitor memory consumption.
-  Even if locks are otherwise defined, this function does not use them,
-  so results might not be up to date.
-*/
-size_t dlmalloc_footprint(void);
-
-/*
-  malloc_max_footprint();
-  Returns the maximum number of bytes obtained from the system. This
-  value will be greater than current footprint if deallocated space
-  has been reclaimed by the system. The peak number of bytes allocated
-  by malloc, realloc etc., is less than this value. Unlike mallinfo,
-  this function returns only a precomputed result, so can be called
-  frequently to monitor memory consumption.  Even if locks are
-  otherwise defined, this function does not use them, so results might
-  not be up to date.
-*/
-size_t dlmalloc_max_footprint(void);
-
-#if !NO_MALLINFO
-/*
-  mallinfo()
-  Returns (by copy) a struct containing various summary statistics:
-
-  arena:     current total non-mmapped bytes allocated from system
-  ordblks:   the number of free chunks
-  smblks:    always zero.
-  hblks:     current number of mmapped regions
-  hblkhd:    total bytes held in mmapped regions
-  usmblks:   the maximum total allocated space. This will be greater
-                than current total if trimming has occurred.
-  fsmblks:   always zero
-  uordblks:  current total allocated space (normal or mmapped)
-  fordblks:  total free space
-  keepcost:  the maximum number of bytes that could ideally be released
-               back to system via malloc_trim. ("ideally" means that
-               it ignores page restrictions etc.)
-
-  Because these fields are ints, but internal bookkeeping may
-  be kept as longs, the reported values may wrap around zero and
-  thus be inaccurate.
-*/
-struct mallinfo dlmallinfo(void);
-#endif /* NO_MALLINFO */
-
-/*
-  independent_calloc(size_t n_elements, size_t element_size, void* chunks[]);
-
-  independent_calloc is similar to calloc, but instead of returning a
-  single cleared space, it returns an array of pointers to n_elements
-  independent elements that can hold contents of size elem_size, each
-  of which starts out cleared, and can be independently freed,
-  realloc'ed etc. The elements are guaranteed to be adjacently
-  allocated (this is not guaranteed to occur with multiple callocs or
-  mallocs), which may also improve cache locality in some
-  applications.
-
-  The "chunks" argument is optional (i.e., may be null, which is
-  probably the most typical usage). If it is null, the returned array
-  is itself dynamically allocated and should also be freed when it is
-  no longer needed. Otherwise, the chunks array must be of at least
-  n_elements in length. It is filled in with the pointers to the
-  chunks.
-
-  In either case, independent_calloc returns this pointer array, or
-  null if the allocation failed.  If n_elements is zero and "chunks"
-  is null, it returns a chunk representing an array with zero elements
-  (which should be freed if not wanted).
-
-  Each element must be individually freed when it is no longer
-  needed. If you'd like to instead be able to free all at once, you
-  should instead use regular calloc and assign pointers into this
-  space to represent elements.  (In this case though, you cannot
-  independently free elements.)
-
-  independent_calloc simplifies and speeds up implementations of many
-  kinds of pools.  It may also be useful when constructing large data
-  structures that initially have a fixed number of fixed-sized nodes,
-  but the number is not known at compile time, and some of the nodes
-  may later need to be freed. For example:
-
-  struct Node { int item; struct Node* next; };
-
-  struct Node* build_list() {
-    struct Node** pool;
-    int n = read_number_of_nodes_needed();
-    if (n <= 0) return 0;
-    pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
-    if (pool == 0) die();
-    // organize into a linked list...
-    struct Node* first = pool[0];
-    for (i = 0; i < n-1; ++i)
-      pool[i]->next = pool[i+1];
-    free(pool);     // Can now free the array (or not, if it is needed later)
-    return first;
-  }
-*/
-void** dlindependent_calloc(size_t, size_t, void**);
-
-/*
-  independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]);
-
-  independent_comalloc allocates, all at once, a set of n_elements
-  chunks with sizes indicated in the "sizes" array.    It returns
-  an array of pointers to these elements, each of which can be
-  independently freed, realloc'ed etc. The elements are guaranteed to
-  be adjacently allocated (this is not guaranteed to occur with
-  multiple callocs or mallocs), which may also improve cache locality
-  in some applications.
-
-  The "chunks" argument is optional (i.e., may be null). If it is null
-  the returned array is itself dynamically allocated and should also
-  be freed when it is no longer needed. Otherwise, the chunks array
-  must be of at least n_elements in length. It is filled in with the
-  pointers to the chunks.
-
-  In either case, independent_comalloc returns this pointer array, or
-  null if the allocation failed.  If n_elements is zero and chunks is
-  null, it returns a chunk representing an array with zero elements
-  (which should be freed if not wanted).
-
-  Each element must be individually freed when it is no longer
-  needed. If you'd like to instead be able to free all at once, you
-  should instead use a single regular malloc, and assign pointers at
-  particular offsets in the aggregate space. (In this case though, you
-  cannot independently free elements.)
-
-  independent_comallac differs from independent_calloc in that each
-  element may have a different size, and also that it does not
-  automatically clear elements.
-
-  independent_comalloc can be used to speed up allocation in cases
-  where several structs or objects must always be allocated at the
-  same time.  For example:
-
-  struct Head { ... }
-  struct Foot { ... }
-
-  void send_message(char* msg) {
-    int msglen = strlen(msg);
-    size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
-    void* chunks[3];
-    if (independent_comalloc(3, sizes, chunks) == 0)
-      die();
-    struct Head* head = (struct Head*)(chunks[0]);
-    char*        body = (char*)(chunks[1]);
-    struct Foot* foot = (struct Foot*)(chunks[2]);
-    // ...
-  }
-
-  In general though, independent_comalloc is worth using only for
-  larger values of n_elements. For small values, you probably won't
-  detect enough difference from series of malloc calls to bother.
-
-  Overuse of independent_comalloc can increase overall memory usage,
-  since it cannot reuse existing noncontiguous small chunks that
-  might be available for some of the elements.
-*/
-void** dlindependent_comalloc(size_t, size_t*, void**);
-
-
-/*
-  pvalloc(size_t n);
-  Equivalent to valloc(minimum-page-that-holds(n)), that is,
-  round up n to nearest pagesize.
- */
-void*  dlpvalloc(size_t);
-
-/*
-  malloc_trim(size_t pad);
-
-  If possible, gives memory back to the system (via negative arguments
-  to sbrk) if there is unused memory at the `high' end of the malloc
-  pool or in unused MMAP segments. You can call this after freeing
-  large blocks of memory to potentially reduce the system-level memory
-  requirements of a program. However, it cannot guarantee to reduce
-  memory. Under some allocation patterns, some large free blocks of
-  memory will be locked between two used chunks, so they cannot be
-  given back to the system.
-
-  The `pad' argument to malloc_trim represents the amount of free
-  trailing space to leave untrimmed. If this argument is zero, only
-  the minimum amount of memory to maintain internal data structures
-  will be left. Non-zero arguments can be supplied to maintain enough
-  trailing space to service future expected allocations without having
-  to re-obtain memory from the system.
-
-  Malloc_trim returns 1 if it actually released any memory, else 0.
-*/
-int  dlmalloc_trim(size_t);
-
-/*
-  malloc_usable_size(void* p);
-
-  Returns the number of bytes you can actually use in
-  an allocated chunk, which may be more than you requested (although
-  often not) due to alignment and minimum size constraints.
-  You can use this many bytes without worrying about
-  overwriting other allocated objects. This is not a particularly great
-  programming practice. malloc_usable_size can be more useful in
-  debugging and assertions, for example:
-
-  p = malloc(n);
-  assert(malloc_usable_size(p) >= 256);
-*/
-size_t dlmalloc_usable_size(void*);
-
-/*
-  malloc_stats();
-  Prints on stderr the amount of space obtained from the system (both
-  via sbrk and mmap), the maximum amount (which may be more than
-  current if malloc_trim and/or munmap got called), and the current
-  number of bytes allocated via malloc (or realloc, etc) but not yet
-  freed. Note that this is the number of bytes allocated, not the
-  number requested. It will be larger than the number requested
-  because of alignment and bookkeeping overhead. Because it includes
-  alignment wastage as being in use, this figure may be greater than
-  zero even when no user-level chunks are allocated.
-
-  The reported current and maximum system memory can be inaccurate if
-  a program makes other calls to system memory allocation functions
-  (normally sbrk) outside of malloc.
-
-  malloc_stats prints only the most commonly interesting statistics.
-  More information can be obtained by calling mallinfo.
-*/
-void  dlmalloc_stats(void);
-
-#endif /* ONLY_MSPACES */
-
-#if MSPACES
-
-/*
-  mspace is an opaque type representing an independent
-  region of space that supports mspace_malloc, etc.
-*/
-typedef void* mspace;
-
-/*
-  create_mspace creates and returns a new independent space with the
-  given initial capacity, or, if 0, the default granularity size.  It
-  returns null if there is no system memory available to create the
-  space.  If argument locked is non-zero, the space uses a separate
-  lock to control access. The capacity of the space will grow
-  dynamically as needed to service mspace_malloc requests.  You can
-  control the sizes of incremental increases of this space by
-  compiling with a different DEFAULT_GRANULARITY or dynamically
-  setting with mallopt(M_GRANULARITY, value).
-*/
-mspace create_mspace(size_t capacity, int locked);
-
-/*
-  destroy_mspace destroys the given space, and attempts to return all
-  of its memory back to the system, returning the total number of
-  bytes freed. After destruction, the results of access to all memory
-  used by the space become undefined.
-*/
-size_t destroy_mspace(mspace msp);
-
-/*
-  create_mspace_with_base uses the memory supplied as the initial base
-  of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this
-  space is used for bookkeeping, so the capacity must be at least this
-  large. (Otherwise 0 is returned.) When this initial space is
-  exhausted, additional memory will be obtained from the system.
-  Destroying this space will deallocate all additionally allocated
-  space (if possible) but not the initial base.
-*/
-mspace create_mspace_with_base(void* base, size_t capacity, int locked);
-
-/*
-  mspace_malloc behaves as malloc, but operates within
-  the given space.
-*/
-void* mspace_malloc(mspace msp, size_t bytes);
-
-/*
-  mspace_free behaves as free, but operates within
-  the given space.
-
-  If compiled with FOOTERS==1, mspace_free is not actually needed.
-  free may be called instead of mspace_free because freed chunks from
-  any space are handled by their originating spaces.
-*/
-void mspace_free(mspace msp, void* mem);
-
-/*
-  mspace_realloc behaves as realloc, but operates within
-  the given space.
-
-  If compiled with FOOTERS==1, mspace_realloc is not actually
-  needed.  realloc may be called instead of mspace_realloc because
-  realloced chunks from any space are handled by their originating
-  spaces.
-*/
-void* mspace_realloc(mspace msp, void* mem, size_t newsize);
-
-/*
-  mspace_calloc behaves as calloc, but operates within
-  the given space.
-*/
-void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
-
-/*
-  mspace_memalign behaves as memalign, but operates within
-  the given space.
-*/
-void* mspace_memalign(mspace msp, size_t alignment, size_t bytes);
-
-/*
-  mspace_independent_calloc behaves as independent_calloc, but
-  operates within the given space.
-*/
-void** mspace_independent_calloc(mspace msp, size_t n_elements,
-                                 size_t elem_size, void* chunks[]);
-
-/*
-  mspace_independent_comalloc behaves as independent_comalloc, but
-  operates within the given space.
-*/
-void** mspace_independent_comalloc(mspace msp, size_t n_elements,
-                                   size_t sizes[], void* chunks[]);
-
-/*
-  mspace_footprint() returns the number of bytes obtained from the
-  system for this space.
-*/
-size_t mspace_footprint(mspace msp);
-
-/*
-  mspace_max_footprint() returns the peak number of bytes obtained from the
-  system for this space.
-*/
-size_t mspace_max_footprint(mspace msp);
-
-
-#if !NO_MALLINFO
-/*
-  mspace_mallinfo behaves as mallinfo, but reports properties of
-  the given space.
-*/
-struct mallinfo mspace_mallinfo(mspace msp);
-#endif /* NO_MALLINFO */
-
-/*
-  mspace_malloc_stats behaves as malloc_stats, but reports
-  properties of the given space.
-*/
-void mspace_malloc_stats(mspace msp);
-
-/*
-  mspace_trim behaves as malloc_trim, but
-  operates within the given space.
-*/
-int mspace_trim(mspace msp, size_t pad);
-
-/*
-  An alias for mallopt.
-*/
-int mspace_mallopt(int, int);
-
-#endif /* MSPACES */
-
-#ifdef __cplusplus
-};  /* end of extern "C" */
-#endif /* __cplusplus */
-
-/*
-  ========================================================================
-  To make a fully customizable malloc.h header file, cut everything
-  above this line, put into file malloc.h, edit to suit, and #include it
-  on the next line, as well as in programs that use this malloc.
-  ========================================================================
-*/
-
-/* #include "malloc.h" */
-
-/*------------------------------ internal #includes ---------------------- */
-
-#ifdef _MSC_VER
-#pragma warning( disable : 4146 ) /* no "unsigned" warnings */
-#endif /* _MSC_VER */
-
-#include <stdio.h>       /* for printing in malloc_stats */
-
-#ifndef LACKS_ERRNO_H
-#include <errno.h>       /* for MALLOC_FAILURE_ACTION */
-#endif /* LACKS_ERRNO_H */
-#if FOOTERS
-#include <time.h>        /* for magic initialization */
-#endif /* FOOTERS */
-#ifndef LACKS_STDLIB_H
-#include <stdlib.h>      /* for abort() */
-#endif /* LACKS_STDLIB_H */
-#ifdef DEBUG
-#if ABORT_ON_ASSERT_FAILURE
-#define assert(x) if(!(x)) ABORT
-#else /* ABORT_ON_ASSERT_FAILURE */
-#include <assert.h>
-#endif /* ABORT_ON_ASSERT_FAILURE */
-#else  /* DEBUG */
-#define assert(x)
-#endif /* DEBUG */
-#ifndef LACKS_STRING_H
-#include <string.h>      /* for memset etc */
-#endif  /* LACKS_STRING_H */
-#if USE_BUILTIN_FFS
-#ifndef LACKS_STRINGS_H
-#include <strings.h>     /* for ffs */
-#endif /* LACKS_STRINGS_H */
-#endif /* USE_BUILTIN_FFS */
-#if HAVE_MMAP
-#ifndef LACKS_SYS_MMAN_H
-#include <sys/mman.h>    /* for mmap */
-#endif /* LACKS_SYS_MMAN_H */
-#ifndef LACKS_FCNTL_H
-#include <fcntl.h>
-#endif /* LACKS_FCNTL_H */
-#endif /* HAVE_MMAP */
-#if HAVE_MORECORE
-#ifndef LACKS_UNISTD_H
-#include <unistd.h>     /* for sbrk */
-#else /* LACKS_UNISTD_H */
-#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
-extern void*     sbrk(ptrdiff_t);
-#endif /* FreeBSD etc */
-#endif /* LACKS_UNISTD_H */
-#endif /* HAVE_MMAP */
-
-#ifndef WIN32
-#ifndef malloc_getpagesize
-#  ifdef _SC_PAGESIZE         /* some SVR4 systems omit an underscore */
-#    ifndef _SC_PAGE_SIZE
-#      define _SC_PAGE_SIZE _SC_PAGESIZE
-#    endif
-#  endif
-#  ifdef _SC_PAGE_SIZE
-#    define malloc_getpagesize sysconf(_SC_PAGE_SIZE)
-#  else
-#    if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)
-       extern size_t getpagesize();
-#      define malloc_getpagesize getpagesize()
-#    else
-#      ifdef WIN32 /* use supplied emulation of getpagesize */
-#        define malloc_getpagesize getpagesize()
-#      else
-#        ifndef LACKS_SYS_PARAM_H
-#          include <sys/param.h>
-#        endif
-#        ifdef EXEC_PAGESIZE
-#          define malloc_getpagesize EXEC_PAGESIZE
-#        else
-#          ifdef NBPG
-#            ifndef CLSIZE
-#              define malloc_getpagesize NBPG
-#            else
-#              define malloc_getpagesize (NBPG * CLSIZE)
-#            endif
-#          else
-#            ifdef NBPC
-#              define malloc_getpagesize NBPC
-#            else
-#              ifdef PAGESIZE
-#                define malloc_getpagesize PAGESIZE
-#              else /* just guess */
-#                define malloc_getpagesize ((size_t)4096U)
-#              endif
-#            endif
-#          endif
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-#endif
-
-/* ------------------- size_t and alignment properties -------------------- */
-
-/* The byte and bit size of a size_t */
-#define SIZE_T_SIZE         (sizeof(size_t))
-#define SIZE_T_BITSIZE      (sizeof(size_t) << 3)
-
-/* Some constants coerced to size_t */
-/* Annoying but necessary to avoid errors on some platforms */
-#define SIZE_T_ZERO         ((size_t)0)
-#define SIZE_T_ONE          ((size_t)1)
-#define SIZE_T_TWO          ((size_t)2)
-#define TWO_SIZE_T_SIZES    (SIZE_T_SIZE<<1)
-#define FOUR_SIZE_T_SIZES   (SIZE_T_SIZE<<2)
-#define SIX_SIZE_T_SIZES    (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES)
-#define HALF_MAX_SIZE_T     (MAX_SIZE_T / 2U)
-
-/* The bit mask value corresponding to MALLOC_ALIGNMENT */
-#define CHUNK_ALIGN_MASK    (MALLOC_ALIGNMENT - SIZE_T_ONE)
-
-/* True if address a has acceptable alignment */
-#define is_aligned(A)       (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0)
-
-/* the number of bytes to offset an address to align it */
-#define align_offset(A)\
- ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\
-  ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK))
-
-/* -------------------------- MMAP preliminaries ------------------------- */
-
-/*
-   If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and
-   checks to fail so compiler optimizer can delete code rather than
-   using so many "#if"s.
-*/
-
-
-/* MORECORE and MMAP must return MFAIL on failure */
-#define MFAIL                ((void*)(MAX_SIZE_T))
-#define CMFAIL               ((char*)(MFAIL)) /* defined for convenience */
-
-#if !HAVE_MMAP
-#define IS_MMAPPED_BIT       (SIZE_T_ZERO)
-#define USE_MMAP_BIT         (SIZE_T_ZERO)
-#define CALL_MMAP(s)         MFAIL
-#define CALL_MUNMAP(a, s)    (-1)
-#define DIRECT_MMAP(s)       MFAIL
-
-#else /* HAVE_MMAP */
-#define IS_MMAPPED_BIT       (SIZE_T_ONE)
-#define USE_MMAP_BIT         (SIZE_T_ONE)
-
-#if !defined(WIN32) && !defined (__OS2__)
-#define CALL_MUNMAP(a, s)    munmap((a), (s))
-#define MMAP_PROT            (PROT_READ|PROT_WRITE)
-#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
-#define MAP_ANONYMOUS        MAP_ANON
-#endif /* MAP_ANON */
-#ifdef MAP_ANONYMOUS
-#define MMAP_FLAGS           (MAP_PRIVATE|MAP_ANONYMOUS)
-#define CALL_MMAP(s)         mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0)
-#else /* MAP_ANONYMOUS */
-/*
-   Nearly all versions of mmap support MAP_ANONYMOUS, so the following
-   is unlikely to be needed, but is supplied just in case.
-*/
-#define MMAP_FLAGS           (MAP_PRIVATE)
-static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
-#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \
-           (dev_zero_fd = open("/dev/zero", O_RDWR), \
-            mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \
-            mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0))
-#endif /* MAP_ANONYMOUS */
-
-#define DIRECT_MMAP(s)       CALL_MMAP(s)
-
-#elif defined(__OS2__)
-
-/* OS/2 MMAP via DosAllocMem */
-static void* os2mmap(size_t size) {
-  void* ptr;
-  if (DosAllocMem(&ptr, size, OBJ_ANY|PAG_COMMIT|PAG_READ|PAG_WRITE) &&
-      DosAllocMem(&ptr, size, PAG_COMMIT|PAG_READ|PAG_WRITE))
-    return MFAIL;
-  return ptr;
-}
-
-#define os2direct_mmap(n)     os2mmap(n)
-
-/* This function supports releasing coalesed segments */
-static int os2munmap(void* ptr, size_t size) {
-  while (size) {
-    ULONG ulSize = size;
-    ULONG ulFlags = 0;
-    if (DosQueryMem(ptr, &ulSize, &ulFlags) != 0)
-      return -1;
-    if ((ulFlags & PAG_BASE) == 0 ||(ulFlags & PAG_COMMIT) == 0 ||
-        ulSize > size)
-      return -1;
-    if (DosFreeMem(ptr) != 0)
-      return -1;
-    ptr = ( void * ) ( ( char * ) ptr + ulSize );
-    size -= ulSize;
-  }
-  return 0;
-}
-
-#define CALL_MMAP(s)         os2mmap(s)
-#define CALL_MUNMAP(a, s)    os2munmap((a), (s))
-#define DIRECT_MMAP(s)       os2direct_mmap(s)
-
-#else /* WIN32 */
-
-/* Win32 MMAP via VirtualAlloc */
-static void* win32mmap(size_t size) {
-  void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE);
-  return (ptr != 0)? ptr: MFAIL;
-}
-
-/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
-static void* win32direct_mmap(size_t size) {
-  void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
-                           PAGE_EXECUTE_READWRITE);
-  return (ptr != 0)? ptr: MFAIL;
-}
-
-/* This function supports releasing coalesed segments */
-static int win32munmap(void* ptr, size_t size) {
-  MEMORY_BASIC_INFORMATION minfo;
-  char* cptr = ptr;
-  while (size) {
-    if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0)
-      return -1;
-    if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr ||
-        minfo.State != MEM_COMMIT || minfo.RegionSize > size)
-      return -1;
-    if (VirtualFree(cptr, 0, MEM_RELEASE) == 0)
-      return -1;
-    cptr += minfo.RegionSize;
-    size -= minfo.RegionSize;
-  }
-  return 0;
-}
-
-#define CALL_MMAP(s)         win32mmap(s)
-#define CALL_MUNMAP(a, s)    win32munmap((a), (s))
-#define DIRECT_MMAP(s)       win32direct_mmap(s)
-#endif /* WIN32 */
-#endif /* HAVE_MMAP */
-
-#if HAVE_MMAP && HAVE_MREMAP
-#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv))
-#else  /* HAVE_MMAP && HAVE_MREMAP */
-#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL
-#endif /* HAVE_MMAP && HAVE_MREMAP */
-
-#if HAVE_MORECORE
-#define CALL_MORECORE(S)     MORECORE(S)
-#else  /* HAVE_MORECORE */
-#define CALL_MORECORE(S)     MFAIL
-#endif /* HAVE_MORECORE */
-
-/* mstate bit set if contiguous morecore disabled or failed */
-#define USE_NONCONTIGUOUS_BIT (4U)
-
-/* segment bit set in create_mspace_with_base */
-#define EXTERN_BIT            (8U)
-
-
-/* --------------------------- Lock preliminaries ------------------------ */
-
-#if USE_LOCKS
-
-/*
-  When locks are defined, there are up to two global locks:
-
-  * If HAVE_MORECORE, morecore_mutex protects sequences of calls to
-    MORECORE.  In many cases sys_alloc requires two calls, that should
-    not be interleaved with calls by other threads.  This does not
-    protect against direct calls to MORECORE by other threads not
-    using this lock, so there is still code to cope the best we can on
-    interference.
-
-  * magic_init_mutex ensures that mparams.magic and other
-    unique mparams values are initialized only once.
-*/
-
-#if !defined(WIN32) && !defined(__OS2__)
-/* By default use posix locks */
-#include <pthread.h>
-#define MLOCK_T pthread_mutex_t
-#define INITIAL_LOCK(l)      pthread_mutex_init(l, NULL)
-#define ACQUIRE_LOCK(l)      pthread_mutex_lock(l)
-#define RELEASE_LOCK(l)      pthread_mutex_unlock(l)
-
-#if HAVE_MORECORE
-static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER;
-#endif /* HAVE_MORECORE */
-
-static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-#elif defined(__OS2__)
-#define MLOCK_T HMTX
-#define INITIAL_LOCK(l)      DosCreateMutexSem(0, l, 0, FALSE)
-#define ACQUIRE_LOCK(l)      DosRequestMutexSem(*l, SEM_INDEFINITE_WAIT)
-#define RELEASE_LOCK(l)      DosReleaseMutexSem(*l)
-#if HAVE_MORECORE
-static MLOCK_T morecore_mutex;
-#endif /* HAVE_MORECORE */
-static MLOCK_T magic_init_mutex;
-
-#else /* WIN32 */
-/*
-   Because lock-protected regions have bounded times, and there
-   are no recursive lock calls, we can use simple spinlocks.
-*/
-
-#define MLOCK_T long
-static int win32_acquire_lock (MLOCK_T *sl) {
-  for (;;) {
-#ifdef InterlockedCompareExchangePointer
-    if (!InterlockedCompareExchange(sl, 1, 0))
-      return 0;
-#else  /* Use older void* version */
-    if (!InterlockedCompareExchange((void**)sl, (void*)1, (void*)0))
-      return 0;
-#endif /* InterlockedCompareExchangePointer */
-    Sleep (0);
-  }
-}
-
-static void win32_release_lock (MLOCK_T *sl) {
-  InterlockedExchange (sl, 0);
-}
-
-#define INITIAL_LOCK(l)      *(l)=0
-#define ACQUIRE_LOCK(l)      win32_acquire_lock(l)
-#define RELEASE_LOCK(l)      win32_release_lock(l)
-#if HAVE_MORECORE
-static MLOCK_T morecore_mutex;
-#endif /* HAVE_MORECORE */
-static MLOCK_T magic_init_mutex;
-#endif /* WIN32 */
-
-#define USE_LOCK_BIT               (2U)
-#else  /* USE_LOCKS */
-#define USE_LOCK_BIT               (0U)
-#define INITIAL_LOCK(l)
-#endif /* USE_LOCKS */
-
-#if USE_LOCKS && HAVE_MORECORE
-#define ACQUIRE_MORECORE_LOCK()    ACQUIRE_LOCK(&morecore_mutex);
-#define RELEASE_MORECORE_LOCK()    RELEASE_LOCK(&morecore_mutex);
-#else /* USE_LOCKS && HAVE_MORECORE */
-#define ACQUIRE_MORECORE_LOCK()
-#define RELEASE_MORECORE_LOCK()
-#endif /* USE_LOCKS && HAVE_MORECORE */
-
-#if USE_LOCKS
-#define ACQUIRE_MAGIC_INIT_LOCK()  ACQUIRE_LOCK(&magic_init_mutex);
-#define RELEASE_MAGIC_INIT_LOCK()  RELEASE_LOCK(&magic_init_mutex);
-#else  /* USE_LOCKS */
-#define ACQUIRE_MAGIC_INIT_LOCK()
-#define RELEASE_MAGIC_INIT_LOCK()
-#endif /* USE_LOCKS */
-
-
-/* -----------------------  Chunk representations ------------------------ */
-
-/*
-  (The following includes lightly edited explanations by Colin Plumb.)
-
-  The malloc_chunk declaration below is misleading (but accurate and
-  necessary).  It declares a "view" into memory allowing access to
-  necessary fields at known offsets from a given base.
-
-  Chunks of memory are maintained using a `boundary tag' method as
-  originally described by Knuth.  (See the paper by Paul Wilson
-  ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such
-  techniques.)  Sizes of free chunks are stored both in the front of
-  each chunk and at the end.  This makes consolidating fragmented
-  chunks into bigger chunks fast.  The head fields also hold bits
-  representing whether chunks are free or in use.
-
-  Here are some pictures to make it clearer.  They are "exploded" to
-  show that the state of a chunk can be thought of as extending from
-  the high 31 bits of the head field of its header through the
-  prev_foot and PINUSE_BIT bit of the following chunk header.
-
-  A chunk that's in use looks like:
-
-   chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-           | Size of previous chunk (if P = 1)                             |
-           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
-         | Size of this chunk                                         1| +-+
-   mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-         |                                                               |
-         +-                                                             -+
-         |                                                               |
-         +-                                                             -+
-         |                                                               :
-         +-      size - sizeof(size_t) available payload bytes          -+
-         :                                                               |
- chunk-> +-                                                             -+
-         |                                                               |
-         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1|
-       | Size of next chunk (may or may not be in use)               | +-+
- mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-    And if it's free, it looks like this:
-
-   chunk-> +-                                                             -+
-           | User payload (must be in use, or we would have merged!)       |
-           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
-         | Size of this chunk                                         0| +-+
-   mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-         | Next pointer                                                  |
-         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-         | Prev pointer                                                  |
-         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-         |                                                               :
-         +-      size - sizeof(struct chunk) unused bytes               -+
-         :                                                               |
- chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-         | Size of this chunk                                            |
-         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0|
-       | Size of next chunk (must be in use, or we would have merged)| +-+
- mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-       |                                                               :
-       +- User payload                                                -+
-       :                                                               |
-       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-                                                                     |0|
-                                                                     +-+
-  Note that since we always merge adjacent free chunks, the chunks
-  adjacent to a free chunk must be in use.
-
-  Given a pointer to a chunk (which can be derived trivially from the
-  payload pointer) we can, in O(1) time, find out whether the adjacent
-  chunks are free, and if so, unlink them from the lists that they
-  are on and merge them with the current chunk.
-
-  Chunks always begin on even word boundaries, so the mem portion
-  (which is returned to the user) is also on an even word boundary, and
-  thus at least double-word aligned.
-
-  The P (PINUSE_BIT) bit, stored in the unused low-order bit of the
-  chunk size (which is always a multiple of two words), is an in-use
-  bit for the *previous* chunk.  If that bit is *clear*, then the
-  word before the current chunk size contains the previous chunk
-  size, and can be used to find the front of the previous chunk.
-  The very first chunk allocated always has this bit set, preventing
-  access to non-existent (or non-owned) memory. If pinuse is set for
-  any given chunk, then you CANNOT determine the size of the
-  previous chunk, and might even get a memory addressing fault when
-  trying to do so.
-
-  The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of
-  the chunk size redundantly records whether the current chunk is
-  inuse. This redundancy enables usage checks within free and realloc,
-  and reduces indirection when freeing and consolidating chunks.
-
-  Each freshly allocated chunk must have both cinuse and pinuse set.
-  That is, each allocated chunk borders either a previously allocated
-  and still in-use chunk, or the base of its memory arena. This is
-  ensured by making all allocations from the the `lowest' part of any
-  found chunk.  Further, no free chunk physically borders another one,
-  so each free chunk is known to be preceded and followed by either
-  inuse chunks or the ends of memory.
-
-  Note that the `foot' of the current chunk is actually represented
-  as the prev_foot of the NEXT chunk. This makes it easier to
-  deal with alignments etc but can be very confusing when trying
-  to extend or adapt this code.
-
-  The exceptions to all this are
-
-     1. The special chunk `top' is the top-most available chunk (i.e.,
-        the one bordering the end of available memory). It is treated
-        specially.  Top is never included in any bin, is used only if
-        no other chunk is available, and is released back to the
-        system if it is very large (see M_TRIM_THRESHOLD).  In effect,
-        the top chunk is treated as larger (and thus less well
-        fitting) than any other available chunk.  The top chunk
-        doesn't update its trailing size field since there is no next
-        contiguous chunk that would have to index off it. However,
-        space is still allocated for it (TOP_FOOT_SIZE) to enable
-        separation or merging when space is extended.
-
-     3. Chunks allocated via mmap, which have the lowest-order bit
-        (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set
-        PINUSE_BIT in their head fields.  Because they are allocated
-        one-by-one, each must carry its own prev_foot field, which is
-        also used to hold the offset this chunk has within its mmapped
-        region, which is needed to preserve alignment. Each mmapped
-        chunk is trailed by the first two fields of a fake next-chunk
-        for sake of usage checks.
-
-*/
-
-struct malloc_chunk {
-  size_t               prev_foot;  /* Size of previous chunk (if free).  */
-  size_t               head;       /* Size and inuse bits. */
-  struct malloc_chunk* fd;         /* double links -- used only if free. */
-  struct malloc_chunk* bk;
-};
-
-typedef struct malloc_chunk  mchunk;
-typedef struct malloc_chunk* mchunkptr;
-typedef struct malloc_chunk* sbinptr;  /* The type of bins of chunks */
-typedef size_t bindex_t;               /* Described below */
-typedef unsigned int binmap_t;         /* Described below */
-typedef unsigned int flag_t;           /* The type of various bit flag sets */
-
-/* ------------------- Chunks sizes and alignments ----------------------- */
-
-#define MCHUNK_SIZE         (sizeof(mchunk))
-
-#if FOOTERS
-#define CHUNK_OVERHEAD      (TWO_SIZE_T_SIZES)
-#else /* FOOTERS */
-#define CHUNK_OVERHEAD      (SIZE_T_SIZE)
-#endif /* FOOTERS */
-
-/* MMapped chunks need a second word of overhead ... */
-#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES)
-/* ... and additional padding for fake next-chunk at foot */
-#define MMAP_FOOT_PAD       (FOUR_SIZE_T_SIZES)
-
-/* The smallest size we can malloc is an aligned minimal chunk */
-#define MIN_CHUNK_SIZE\
-  ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
-
-/* conversion from malloc headers to user pointers, and back */
-#define chunk2mem(p)        ((void*)((char*)(p)       + TWO_SIZE_T_SIZES))
-#define mem2chunk(mem)      ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES))
-/* chunk associated with aligned address A */
-#define align_as_chunk(A)   (mchunkptr)((A) + align_offset(chunk2mem(A)))
-
-/* Bounds on request (not chunk) sizes. */
-#define MAX_REQUEST         ((-MIN_CHUNK_SIZE) << 2)
-#define MIN_REQUEST         (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE)
-
-/* pad request bytes into a usable size */
-#define pad_request(req) \
-   (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
-
-/* pad request, checking for minimum (but not maximum) */
-#define request2size(req) \
-  (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req))
-
-
-/* ------------------ Operations on head and foot fields ----------------- */
-
-/*
-  The head field of a chunk is or'ed with PINUSE_BIT when previous
-  adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in
-  use. If the chunk was obtained with mmap, the prev_foot field has
-  IS_MMAPPED_BIT set, otherwise holding the offset of the base of the
-  mmapped region to the base of the chunk.
-*/
-
-#define PINUSE_BIT          (SIZE_T_ONE)
-#define CINUSE_BIT          (SIZE_T_TWO)
-#define INUSE_BITS          (PINUSE_BIT|CINUSE_BIT)
-
-/* Head value for fenceposts */
-#define FENCEPOST_HEAD      (INUSE_BITS|SIZE_T_SIZE)
-
-/* extraction of fields from head words */
-#define cinuse(p)           ((p)->head & CINUSE_BIT)
-#define pinuse(p)           ((p)->head & PINUSE_BIT)
-#define chunksize(p)        ((p)->head & ~(INUSE_BITS))
-
-#define clear_pinuse(p)     ((p)->head &= ~PINUSE_BIT)
-#define clear_cinuse(p)     ((p)->head &= ~CINUSE_BIT)
-
-/* Treat space at ptr +/- offset as a chunk */
-#define chunk_plus_offset(p, s)  ((mchunkptr)(((char*)(p)) + (s)))
-#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s)))
-
-/* Ptr to next or previous physical malloc_chunk. */
-#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS)))
-#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) ))
-
-/* extract next chunk's pinuse bit */
-#define next_pinuse(p)  ((next_chunk(p)->head) & PINUSE_BIT)
-
-/* Get/set size at footer */
-#define get_foot(p, s)  (((mchunkptr)((char*)(p) + (s)))->prev_foot)
-#define set_foot(p, s)  (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s))
-
-/* Set size, pinuse bit, and foot */
-#define set_size_and_pinuse_of_free_chunk(p, s)\
-  ((p)->head = (s|PINUSE_BIT), set_foot(p, s))
-
-/* Set size, pinuse bit, foot, and clear next pinuse */
-#define set_free_with_pinuse(p, s, n)\
-  (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s))
-
-#define is_mmapped(p)\
-  (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT))
-
-/* Get the internal overhead associated with chunk p */
-#define overhead_for(p)\
- (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD)
-
-/* Return true if malloced space is not necessarily cleared */
-#if MMAP_CLEARS
-#define calloc_must_clear(p) (!is_mmapped(p))
-#else /* MMAP_CLEARS */
-#define calloc_must_clear(p) (1)
-#endif /* MMAP_CLEARS */
-
-/* ---------------------- Overlaid data structures ----------------------- */
-
-/*
-  When chunks are not in use, they are treated as nodes of either
-  lists or trees.
-
-  "Small"  chunks are stored in circular doubly-linked lists, and look
-  like this:
-
-    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Size of previous chunk                            |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    `head:' |             Size of chunk, in bytes                         |P|
-      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Forward pointer to next chunk in list             |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Back pointer to previous chunk in list            |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Unused space (may be 0 bytes long)                .
-            .                                                               .
-            .                                                               |
-nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    `foot:' |             Size of chunk, in bytes                           |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-  Larger chunks are kept in a form of bitwise digital trees (aka
-  tries) keyed on chunksizes.  Because malloc_tree_chunks are only for
-  free chunks greater than 256 bytes, their size doesn't impose any
-  constraints on user chunk sizes.  Each node looks like:
-
-    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Size of previous chunk                            |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    `head:' |             Size of chunk, in bytes                         |P|
-      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Forward pointer to next chunk of same size        |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Back pointer to previous chunk of same size       |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Pointer to left child (child[0])                  |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Pointer to right child (child[1])                 |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Pointer to parent                                 |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             bin index of this chunk                           |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-            |             Unused space                                      .
-            .                                                               |
-nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    `foot:' |             Size of chunk, in bytes                           |
-            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-  Each tree holding treenodes is a tree of unique chunk sizes.  Chunks
-  of the same size are arranged in a circularly-linked list, with only
-  the oldest chunk (the next to be used, in our FIFO ordering)
-  actually in the tree.  (Tree members are distinguished by a non-null
-  parent pointer.)  If a chunk with the same size an an existing node
-  is inserted, it is linked off the existing node using pointers that
-  work in the same way as fd/bk pointers of small chunks.
-
-  Each tree contains a power of 2 sized range of chunk sizes (the
-  smallest is 0x100 <= x < 0x180), which is is divided in half at each
-  tree level, with the chunks in the smaller half of the range (0x100
-  <= x < 0x140 for the top nose) in the left subtree and the larger
-  half (0x140 <= x < 0x180) in the right subtree.  This is, of course,
-  done by inspecting individual bits.
-
-  Using these rules, each node's left subtree contains all smaller
-  sizes than its right subtree.  However, the node at the root of each
-  subtree has no particular ordering relationship to either.  (The
-  dividing line between the subtree sizes is based on trie relation.)
-  If we remove the last chunk of a given size from the interior of the
-  tree, we need to replace it with a leaf node.  The tree ordering
-  rules permit a node to be replaced by any leaf below it.
-
-  The smallest chunk in a tree (a common operation in a best-fit
-  allocator) can be found by walking a path to the leftmost leaf in
-  the tree.  Unlike a usual binary tree, where we follow left child
-  pointers until we reach a null, here we follow the right child
-  pointer any time the left one is null, until we reach a leaf with
-  both child pointers null. The smallest chunk in the tree will be
-  somewhere along that path.
-
-  The worst case number of steps to add, find, or remove a node is
-  bounded by the number of bits differentiating chunks within
-  bins. Under current bin calculations, this ranges from 6 up to 21
-  (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case
-  is of course much better.
-*/
-
-struct malloc_tree_chunk {
-  /* The first four fields must be compatible with malloc_chunk */
-  size_t                    prev_foot;
-  size_t                    head;
-  struct malloc_tree_chunk* fd;
-  struct malloc_tree_chunk* bk;
-
-  struct malloc_tree_chunk* child[2];
-  struct malloc_tree_chunk* parent;
-  bindex_t                  index;
-};
-
-typedef struct malloc_tree_chunk  tchunk;
-typedef struct malloc_tree_chunk* tchunkptr;
-typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */
-
-/* A little helper macro for trees */
-#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1])
-
-/* ----------------------------- Segments -------------------------------- */
-
-/*
-  Each malloc space may include non-contiguous segments, held in a
-  list headed by an embedded malloc_segment record representing the
-  top-most space. Segments also include flags holding properties of
-  the space. Large chunks that are directly allocated by mmap are not
-  included in this list. They are instead independently created and
-  destroyed without otherwise keeping track of them.
-
-  Segment management mainly comes into play for spaces allocated by
-  MMAP.  Any call to MMAP might or might not return memory that is
-  adjacent to an existing segment.  MORECORE normally contiguously
-  extends the current space, so this space is almost always adjacent,
-  which is simpler and faster to deal with. (This is why MORECORE is
-  used preferentially to MMAP when both are available -- see
-  sys_alloc.)  When allocating using MMAP, we don't use any of the
-  hinting mechanisms (inconsistently) supported in various
-  implementations of unix mmap, or distinguish reserving from
-  committing memory. Instead, we just ask for space, and exploit
-  contiguity when we get it.  It is probably possible to do
-  better than this on some systems, but no general scheme seems
-  to be significantly better.
-
-  Management entails a simpler variant of the consolidation scheme
-  used for chunks to reduce fragmentation -- new adjacent memory is
-  normally prepended or appended to an existing segment. However,
-  there are limitations compared to chunk consolidation that mostly
-  reflect the fact that segment processing is relatively infrequent
-  (occurring only when getting memory from system) and that we
-  don't expect to have huge numbers of segments:
-
-  * Segments are not indexed, so traversal requires linear scans.  (It
-    would be possible to index these, but is not worth the extra
-    overhead and complexity for most programs on most platforms.)
-  * New segments are only appended to old ones when holding top-most
-    memory; if they cannot be prepended to others, they are held in
-    different segments.
-
-  Except for the top-most segment of an mstate, each segment record
-  is kept at the tail of its segment. Segments are added by pushing
-  segment records onto the list headed by &mstate.seg for the
-  containing mstate.
-
-  Segment flags control allocation/merge/deallocation policies:
-  * If EXTERN_BIT set, then we did not allocate this segment,
-    and so should not try to deallocate or merge with others.
-    (This currently holds only for the initial segment passed
-    into create_mspace_with_base.)
-  * If IS_MMAPPED_BIT set, the segment may be merged with
-    other surrounding mmapped segments and trimmed/de-allocated
-    using munmap.
-  * If neither bit is set, then the segment was obtained using
-    MORECORE so can be merged with surrounding MORECORE'd segments
-    and deallocated/trimmed using MORECORE with negative arguments.
-*/
-
-struct malloc_segment {
-  char*        base;             /* base address */
-  size_t       size;             /* allocated size */
-  struct malloc_segment* next;   /* ptr to next segment */
-#if FFI_MMAP_EXEC_WRIT
-  /* The mmap magic is supposed to store the address of the executable
-     segment at the very end of the requested block.  */
-
-# define mmap_exec_offset(b,s) (*(ptrdiff_t*)((b)+(s)-sizeof(ptrdiff_t)))
-
-  /* We can only merge segments if their corresponding executable
-     segments are at identical offsets.  */
-# define check_segment_merge(S,b,s) \
-  (mmap_exec_offset((b),(s)) == (S)->exec_offset)
-
-# define add_segment_exec_offset(p,S) ((char*)(p) + (S)->exec_offset)
-# define sub_segment_exec_offset(p,S) ((char*)(p) - (S)->exec_offset)
-
-  /* The removal of sflags only works with HAVE_MORECORE == 0.  */
-
-# define get_segment_flags(S)   (IS_MMAPPED_BIT)
-# define set_segment_flags(S,v) \
-  (((v) != IS_MMAPPED_BIT) ? (ABORT, (v)) :				\
-   (((S)->exec_offset =							\
-     mmap_exec_offset((S)->base, (S)->size)),				\
-    (mmap_exec_offset((S)->base + (S)->exec_offset, (S)->size) !=	\
-     (S)->exec_offset) ? (ABORT, (v)) :					\
-   (mmap_exec_offset((S)->base, (S)->size) = 0), (v)))
-
-  /* We use an offset here, instead of a pointer, because then, when
-     base changes, we don't have to modify this.  On architectures
-     with segmented addresses, this might not work.  */
-  ptrdiff_t    exec_offset;
-#else
-
-# define get_segment_flags(S)   ((S)->sflags)
-# define set_segment_flags(S,v) ((S)->sflags = (v))
-# define check_segment_merge(S,b,s) (1)
-
-  flag_t       sflags;           /* mmap and extern flag */
-#endif
-};
-
-#define is_mmapped_segment(S)  (get_segment_flags(S) & IS_MMAPPED_BIT)
-#define is_extern_segment(S)   (get_segment_flags(S) & EXTERN_BIT)
-
-typedef struct malloc_segment  msegment;
-typedef struct malloc_segment* msegmentptr;
-
-/* ---------------------------- malloc_state ----------------------------- */
-
-/*
-   A malloc_state holds all of the bookkeeping for a space.
-   The main fields are:
-
-  Top
-    The topmost chunk of the currently active segment. Its size is
-    cached in topsize.  The actual size of topmost space is
-    topsize+TOP_FOOT_SIZE, which includes space reserved for adding
-    fenceposts and segment records if necessary when getting more
-    space from the system.  The size at which to autotrim top is
-    cached from mparams in trim_check, except that it is disabled if
-    an autotrim fails.
-
-  Designated victim (dv)
-    This is the preferred chunk for servicing small requests that
-    don't have exact fits.  It is normally the chunk split off most
-    recently to service another small request.  Its size is cached in
-    dvsize. The link fields of this chunk are not maintained since it
-    is not kept in a bin.
-
-  SmallBins
-    An array of bin headers for free chunks.  These bins hold chunks
-    with sizes less than MIN_LARGE_SIZE bytes. Each bin contains
-    chunks of all the same size, spaced 8 bytes apart.  To simplify
-    use in double-linked lists, each bin header acts as a malloc_chunk
-    pointing to the real first node, if it exists (else pointing to
-    itself).  This avoids special-casing for headers.  But to avoid
-    waste, we allocate only the fd/bk pointers of bins, and then use
-    repositioning tricks to treat these as the fields of a chunk.
-
-  TreeBins
-    Treebins are pointers to the roots of trees holding a range of
-    sizes. There are 2 equally spaced treebins for each power of two
-    from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything
-    larger.
-
-  Bin maps
-    There is one bit map for small bins ("smallmap") and one for
-    treebins ("treemap).  Each bin sets its bit when non-empty, and
-    clears the bit when empty.  Bit operations are then used to avoid
-    bin-by-bin searching -- nearly all "search" is done without ever
-    looking at bins that won't be selected.  The bit maps
-    conservatively use 32 bits per map word, even if on 64bit system.
-    For a good description of some of the bit-based techniques used
-    here, see Henry S. Warren Jr's book "Hacker's Delight" (and
-    supplement at http://hackersdelight.org/). Many of these are
-    intended to reduce the branchiness of paths through malloc etc, as
-    well as to reduce the number of memory locations read or written.
-
-  Segments
-    A list of segments headed by an embedded malloc_segment record
-    representing the initial space.
-
-  Address check support
-    The least_addr field is the least address ever obtained from
-    MORECORE or MMAP. Attempted frees and reallocs of any address less
-    than this are trapped (unless INSECURE is defined).
-
-  Magic tag
-    A cross-check field that should always hold same value as mparams.magic.
-
-  Flags
-    Bits recording whether to use MMAP, locks, or contiguous MORECORE
-
-  Statistics
-    Each space keeps track of current and maximum system memory
-    obtained via MORECORE or MMAP.
-
-  Locking
-    If USE_LOCKS is defined, the "mutex" lock is acquired and released
-    around every public call using this mspace.
-*/
-
-/* Bin types, widths and sizes */
-#define NSMALLBINS        (32U)
-#define NTREEBINS         (32U)
-#define SMALLBIN_SHIFT    (3U)
-#define SMALLBIN_WIDTH    (SIZE_T_ONE << SMALLBIN_SHIFT)
-#define TREEBIN_SHIFT     (8U)
-#define MIN_LARGE_SIZE    (SIZE_T_ONE << TREEBIN_SHIFT)
-#define MAX_SMALL_SIZE    (MIN_LARGE_SIZE - SIZE_T_ONE)
-#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD)
-
-struct malloc_state {
-  binmap_t   smallmap;
-  binmap_t   treemap;
-  size_t     dvsize;
-  size_t     topsize;
-  char*      least_addr;
-  mchunkptr  dv;
-  mchunkptr  top;
-  size_t     trim_check;
-  size_t     magic;
-  mchunkptr  smallbins[(NSMALLBINS+1)*2];
-  tbinptr    treebins[NTREEBINS];
-  size_t     footprint;
-  size_t     max_footprint;
-  flag_t     mflags;
-#if USE_LOCKS
-  MLOCK_T    mutex;     /* locate lock among fields that rarely change */
-#endif /* USE_LOCKS */
-  msegment   seg;
-};
-
-typedef struct malloc_state*    mstate;
-
-/* ------------- Global malloc_state and malloc_params ------------------- */
-
-/*
-  malloc_params holds global properties, including those that can be
-  dynamically set using mallopt. There is a single instance, mparams,
-  initialized in init_mparams.
-*/
-
-struct malloc_params {
-  size_t magic;
-  size_t page_size;
-  size_t granularity;
-  size_t mmap_threshold;
-  size_t trim_threshold;
-  flag_t default_mflags;
-};
-
-static struct malloc_params mparams;
-
-/* The global malloc_state used for all non-"mspace" calls */
-static struct malloc_state _gm_;
-#define gm                 (&_gm_)
-#define is_global(M)       ((M) == &_gm_)
-#define is_initialized(M)  ((M)->top != 0)
-
-/* -------------------------- system alloc setup ------------------------- */
-
-/* Operations on mflags */
-
-#define use_lock(M)           ((M)->mflags &   USE_LOCK_BIT)
-#define enable_lock(M)        ((M)->mflags |=  USE_LOCK_BIT)
-#define disable_lock(M)       ((M)->mflags &= ~USE_LOCK_BIT)
-
-#define use_mmap(M)           ((M)->mflags &   USE_MMAP_BIT)
-#define enable_mmap(M)        ((M)->mflags |=  USE_MMAP_BIT)
-#define disable_mmap(M)       ((M)->mflags &= ~USE_MMAP_BIT)
-
-#define use_noncontiguous(M)  ((M)->mflags &   USE_NONCONTIGUOUS_BIT)
-#define disable_contiguous(M) ((M)->mflags |=  USE_NONCONTIGUOUS_BIT)
-
-#define set_lock(M,L)\
- ((M)->mflags = (L)?\
-  ((M)->mflags | USE_LOCK_BIT) :\
-  ((M)->mflags & ~USE_LOCK_BIT))
-
-/* page-align a size */
-#define page_align(S)\
- (((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE))
-
-/* granularity-align a size */
-#define granularity_align(S)\
-  (((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE))
-
-#define is_page_aligned(S)\
-   (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0)
-#define is_granularity_aligned(S)\
-   (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0)
-
-/*  True if segment S holds address A */
-#define segment_holds(S, A)\
-  ((char*)(A) >= S->base && (char*)(A) < S->base + S->size)
-
-/* Return segment holding given address */
-static msegmentptr segment_holding(mstate m, char* addr) {
-  msegmentptr sp = &m->seg;
-  for (;;) {
-    if (addr >= sp->base && addr < sp->base + sp->size)
-      return sp;
-    if ((sp = sp->next) == 0)
-      return 0;
-  }
-}
-
-/* Return true if segment contains a segment link */
-static int has_segment_link(mstate m, msegmentptr ss) {
-  msegmentptr sp = &m->seg;
-  for (;;) {
-    if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size)
-      return 1;
-    if ((sp = sp->next) == 0)
-      return 0;
-  }
-}
-
-#ifndef MORECORE_CANNOT_TRIM
-#define should_trim(M,s)  ((s) > (M)->trim_check)
-#else  /* MORECORE_CANNOT_TRIM */
-#define should_trim(M,s)  (0)
-#endif /* MORECORE_CANNOT_TRIM */
-
-/*
-  TOP_FOOT_SIZE is padding at the end of a segment, including space
-  that may be needed to place segment records and fenceposts when new
-  noncontiguous segments are added.
-*/
-#define TOP_FOOT_SIZE\
-  (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE)
-
-
-/* -------------------------------  Hooks -------------------------------- */
-
-/*
-  PREACTION should be defined to return 0 on success, and nonzero on
-  failure. If you are not using locking, you can redefine these to do
-  anything you like.
-*/
-
-#if USE_LOCKS
-
-/* Ensure locks are initialized */
-#define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams())
-
-#define PREACTION(M)  ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0)
-#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); }
-#else /* USE_LOCKS */
-
-#ifndef PREACTION
-#define PREACTION(M) (0)
-#endif  /* PREACTION */
-
-#ifndef POSTACTION
-#define POSTACTION(M)
-#endif  /* POSTACTION */
-
-#endif /* USE_LOCKS */
-
-/*
-  CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses.
-  USAGE_ERROR_ACTION is triggered on detected bad frees and
-  reallocs. The argument p is an address that might have triggered the
-  fault. It is ignored by the two predefined actions, but might be
-  useful in custom actions that try to help diagnose errors.
-*/
-
-#if PROCEED_ON_ERROR
-
-/* A count of the number of corruption errors causing resets */
-int malloc_corruption_error_count;
-
-/* default corruption action */
-static void reset_on_error(mstate m);
-
-#define CORRUPTION_ERROR_ACTION(m)  reset_on_error(m)
-#define USAGE_ERROR_ACTION(m, p)
-
-#else /* PROCEED_ON_ERROR */
-
-#ifndef CORRUPTION_ERROR_ACTION
-#define CORRUPTION_ERROR_ACTION(m) ABORT
-#endif /* CORRUPTION_ERROR_ACTION */
-
-#ifndef USAGE_ERROR_ACTION
-#define USAGE_ERROR_ACTION(m,p) ABORT
-#endif /* USAGE_ERROR_ACTION */
-
-#endif /* PROCEED_ON_ERROR */
-
-/* -------------------------- Debugging setup ---------------------------- */
-
-#if ! DEBUG
-
-#define check_free_chunk(M,P)
-#define check_inuse_chunk(M,P)
-#define check_malloced_chunk(M,P,N)
-#define check_mmapped_chunk(M,P)
-#define check_malloc_state(M)
-#define check_top_chunk(M,P)
-
-#else /* DEBUG */
-#define check_free_chunk(M,P)       do_check_free_chunk(M,P)
-#define check_inuse_chunk(M,P)      do_check_inuse_chunk(M,P)
-#define check_top_chunk(M,P)        do_check_top_chunk(M,P)
-#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N)
-#define check_mmapped_chunk(M,P)    do_check_mmapped_chunk(M,P)
-#define check_malloc_state(M)       do_check_malloc_state(M)
-
-static void   do_check_any_chunk(mstate m, mchunkptr p);
-static void   do_check_top_chunk(mstate m, mchunkptr p);
-static void   do_check_mmapped_chunk(mstate m, mchunkptr p);
-static void   do_check_inuse_chunk(mstate m, mchunkptr p);
-static void   do_check_free_chunk(mstate m, mchunkptr p);
-static void   do_check_malloced_chunk(mstate m, void* mem, size_t s);
-static void   do_check_tree(mstate m, tchunkptr t);
-static void   do_check_treebin(mstate m, bindex_t i);
-static void   do_check_smallbin(mstate m, bindex_t i);
-static void   do_check_malloc_state(mstate m);
-static int    bin_find(mstate m, mchunkptr x);
-static size_t traverse_and_check(mstate m);
-#endif /* DEBUG */
-
-/* ---------------------------- Indexing Bins ---------------------------- */
-
-#define is_small(s)         (((s) >> SMALLBIN_SHIFT) < NSMALLBINS)
-#define small_index(s)      ((s)  >> SMALLBIN_SHIFT)
-#define small_index2size(i) ((i)  << SMALLBIN_SHIFT)
-#define MIN_SMALL_INDEX     (small_index(MIN_CHUNK_SIZE))
-
-/* addressing by index. See above about smallbin repositioning */
-#define smallbin_at(M, i)   ((sbinptr)((char*)&((M)->smallbins[(i)<<1])))
-#define treebin_at(M,i)     (&((M)->treebins[i]))
-
-/* assign tree index for size S to variable I */
-#if defined(__GNUC__) && defined(__i386__)
-#define compute_tree_index(S, I)\
-{\
-  size_t X = S >> TREEBIN_SHIFT;\
-  if (X == 0)\
-    I = 0;\
-  else if (X > 0xFFFF)\
-    I = NTREEBINS-1;\
-  else {\
-    unsigned int K;\
-    __asm__("bsrl %1,%0\n\t" : "=r" (K) : "rm"  (X));\
-    I =  (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
-  }\
-}
-#else /* GNUC */
-#define compute_tree_index(S, I)\
-{\
-  size_t X = S >> TREEBIN_SHIFT;\
-  if (X == 0)\
-    I = 0;\
-  else if (X > 0xFFFF)\
-    I = NTREEBINS-1;\
-  else {\
-    unsigned int Y = (unsigned int)X;\
-    unsigned int N = ((Y - 0x100) >> 16) & 8;\
-    unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\
-    N += K;\
-    N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\
-    K = 14 - N + ((Y <<= K) >> 15);\
-    I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\
-  }\
-}
-#endif /* GNUC */
-
-/* Bit representing maximum resolved size in a treebin at i */
-#define bit_for_tree_index(i) \
-   (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2)
-
-/* Shift placing maximum resolved bit in a treebin at i as sign bit */
-#define leftshift_for_tree_index(i) \
-   ((i == NTREEBINS-1)? 0 : \
-    ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2)))
-
-/* The size of the smallest chunk held in bin with index i */
-#define minsize_for_tree_index(i) \
-   ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) |  \
-   (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1)))
-
-
-/* ------------------------ Operations on bin maps ----------------------- */
-
-/* bit corresponding to given index */
-#define idx2bit(i)              ((binmap_t)(1) << (i))
-
-/* Mark/Clear bits with given index */
-#define mark_smallmap(M,i)      ((M)->smallmap |=  idx2bit(i))
-#define clear_smallmap(M,i)     ((M)->smallmap &= ~idx2bit(i))
-#define smallmap_is_marked(M,i) ((M)->smallmap &   idx2bit(i))
-
-#define mark_treemap(M,i)       ((M)->treemap  |=  idx2bit(i))
-#define clear_treemap(M,i)      ((M)->treemap  &= ~idx2bit(i))
-#define treemap_is_marked(M,i)  ((M)->treemap  &   idx2bit(i))
-
-/* index corresponding to given bit */
-
-#if defined(__GNUC__) && defined(__i386__)
-#define compute_bit2idx(X, I)\
-{\
-  unsigned int J;\
-  __asm__("bsfl %1,%0\n\t" : "=r" (J) : "rm" (X));\
-  I = (bindex_t)J;\
-}
-
-#else /* GNUC */
-#if  USE_BUILTIN_FFS
-#define compute_bit2idx(X, I) I = ffs(X)-1
-
-#else /* USE_BUILTIN_FFS */
-#define compute_bit2idx(X, I)\
-{\
-  unsigned int Y = X - 1;\
-  unsigned int K = Y >> (16-4) & 16;\
-  unsigned int N = K;        Y >>= K;\
-  N += K = Y >> (8-3) &  8;  Y >>= K;\
-  N += K = Y >> (4-2) &  4;  Y >>= K;\
-  N += K = Y >> (2-1) &  2;  Y >>= K;\
-  N += K = Y >> (1-0) &  1;  Y >>= K;\
-  I = (bindex_t)(N + Y);\
-}
-#endif /* USE_BUILTIN_FFS */
-#endif /* GNUC */
-
-/* isolate the least set bit of a bitmap */
-#define least_bit(x)         ((x) & -(x))
-
-/* mask with all bits to left of least bit of x on */
-#define left_bits(x)         ((x<<1) | -(x<<1))
-
-/* mask with all bits to left of or equal to least bit of x on */
-#define same_or_left_bits(x) ((x) | -(x))
-
-
-/* ----------------------- Runtime Check Support ------------------------- */
-
-/*
-  For security, the main invariant is that malloc/free/etc never
-  writes to a static address other than malloc_state, unless static
-  malloc_state itself has been corrupted, which cannot occur via
-  malloc (because of these checks). In essence this means that we
-  believe all pointers, sizes, maps etc held in malloc_state, but
-  check all of those linked or offsetted from other embedded data
-  structures.  These checks are interspersed with main code in a way
-  that tends to minimize their run-time cost.
-
-  When FOOTERS is defined, in addition to range checking, we also
-  verify footer fields of inuse chunks, which can be used guarantee
-  that the mstate controlling malloc/free is intact.  This is a
-  streamlined version of the approach described by William Robertson
-  et al in "Run-time Detection of Heap-based Overflows" LISA'03
-  http://www.usenix.org/events/lisa03/tech/robertson.html The footer
-  of an inuse chunk holds the xor of its mstate and a random seed,
-  that is checked upon calls to free() and realloc().  This is
-  (probablistically) unguessable from outside the program, but can be
-  computed by any code successfully malloc'ing any chunk, so does not
-  itself provide protection against code that has already broken
-  security through some other means.  Unlike Robertson et al, we
-  always dynamically check addresses of all offset chunks (previous,
-  next, etc). This turns out to be cheaper than relying on hashes.
-*/
-
-#if !INSECURE
-/* Check if address a is at least as high as any from MORECORE or MMAP */
-#define ok_address(M, a) ((char*)(a) >= (M)->least_addr)
-/* Check if address of next chunk n is higher than base chunk p */
-#define ok_next(p, n)    ((char*)(p) < (char*)(n))
-/* Check if p has its cinuse bit on */
-#define ok_cinuse(p)     cinuse(p)
-/* Check if p has its pinuse bit on */
-#define ok_pinuse(p)     pinuse(p)
-
-#else /* !INSECURE */
-#define ok_address(M, a) (1)
-#define ok_next(b, n)    (1)
-#define ok_cinuse(p)     (1)
-#define ok_pinuse(p)     (1)
-#endif /* !INSECURE */
-
-#if (FOOTERS && !INSECURE)
-/* Check if (alleged) mstate m has expected magic field */
-#define ok_magic(M)      ((M)->magic == mparams.magic)
-#else  /* (FOOTERS && !INSECURE) */
-#define ok_magic(M)      (1)
-#endif /* (FOOTERS && !INSECURE) */
-
-
-/* In gcc, use __builtin_expect to minimize impact of checks */
-#if !INSECURE
-#if defined(__GNUC__) && __GNUC__ >= 3
-#define RTCHECK(e)  __builtin_expect(e, 1)
-#else /* GNUC */
-#define RTCHECK(e)  (e)
-#endif /* GNUC */
-#else /* !INSECURE */
-#define RTCHECK(e)  (1)
-#endif /* !INSECURE */
-
-/* macros to set up inuse chunks with or without footers */
-
-#if !FOOTERS
-
-#define mark_inuse_foot(M,p,s)
-
-/* Set cinuse bit and pinuse bit of next chunk */
-#define set_inuse(M,p,s)\
-  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
-  ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
-
-/* Set cinuse and pinuse of this chunk and pinuse of next chunk */
-#define set_inuse_and_pinuse(M,p,s)\
-  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
-  ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
-
-/* Set size, cinuse and pinuse bit of this chunk */
-#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
-  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT))
-
-#else /* FOOTERS */
-
-/* Set foot of inuse chunk to be xor of mstate and seed */
-#define mark_inuse_foot(M,p,s)\
-  (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic))
-
-#define get_mstate_for(p)\
-  ((mstate)(((mchunkptr)((char*)(p) +\
-    (chunksize(p))))->prev_foot ^ mparams.magic))
-
-#define set_inuse(M,p,s)\
-  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
-  (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \
-  mark_inuse_foot(M,p,s))
-
-#define set_inuse_and_pinuse(M,p,s)\
-  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
-  (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\
- mark_inuse_foot(M,p,s))
-
-#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
-  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
-  mark_inuse_foot(M, p, s))
-
-#endif /* !FOOTERS */
-
-/* ---------------------------- setting mparams -------------------------- */
-
-/* Initialize mparams */
-static int init_mparams(void) {
-  if (mparams.page_size == 0) {
-    size_t s;
-
-    mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD;
-    mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD;
-#if MORECORE_CONTIGUOUS
-    mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT;
-#else  /* MORECORE_CONTIGUOUS */
-    mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT;
-#endif /* MORECORE_CONTIGUOUS */
-
-#if (FOOTERS && !INSECURE)
-    {
-#if USE_DEV_RANDOM
-      int fd;
-      unsigned char buf[sizeof(size_t)];
-      /* Try to use /dev/urandom, else fall back on using time */
-      if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 &&
-          read(fd, buf, sizeof(buf)) == sizeof(buf)) {
-        s = *((size_t *) buf);
-        close(fd);
-      }
-      else
-#endif /* USE_DEV_RANDOM */
-        s = (size_t)(time(0) ^ (size_t)0x55555555U);
-
-      s |= (size_t)8U;    /* ensure nonzero */
-      s &= ~(size_t)7U;   /* improve chances of fault for bad values */
-
-    }
-#else /* (FOOTERS && !INSECURE) */
-    s = (size_t)0x58585858U;
-#endif /* (FOOTERS && !INSECURE) */
-    ACQUIRE_MAGIC_INIT_LOCK();
-    if (mparams.magic == 0) {
-      mparams.magic = s;
-      /* Set up lock for main malloc area */
-      INITIAL_LOCK(&gm->mutex);
-      gm->mflags = mparams.default_mflags;
-    }
-    RELEASE_MAGIC_INIT_LOCK();
-
-#if !defined(WIN32) && !defined(__OS2__)
-    mparams.page_size = malloc_getpagesize;
-    mparams.granularity = ((DEFAULT_GRANULARITY != 0)?
-                           DEFAULT_GRANULARITY : mparams.page_size);
-#elif defined (__OS2__)
- /* if low-memory is used, os2munmap() would break
-    if it were anything other than 64k */
-    mparams.page_size = 4096u;
-    mparams.granularity = 65536u;
-#else /* WIN32 */
-    {
-      SYSTEM_INFO system_info;
-      GetSystemInfo(&system_info);
-      mparams.page_size = system_info.dwPageSize;
-      mparams.granularity = system_info.dwAllocationGranularity;
-    }
-#endif /* WIN32 */
-
-    /* Sanity-check configuration:
-       size_t must be unsigned and as wide as pointer type.
-       ints must be at least 4 bytes.
-       alignment must be at least 8.
-       Alignment, min chunk size, and page size must all be powers of 2.
-    */
-    if ((sizeof(size_t) != sizeof(char*)) ||
-        (MAX_SIZE_T < MIN_CHUNK_SIZE)  ||
-        (sizeof(int) < 4)  ||
-        (MALLOC_ALIGNMENT < (size_t)8U) ||
-        ((MALLOC_ALIGNMENT    & (MALLOC_ALIGNMENT-SIZE_T_ONE))    != 0) ||
-        ((MCHUNK_SIZE         & (MCHUNK_SIZE-SIZE_T_ONE))         != 0) ||
-        ((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) ||
-        ((mparams.page_size   & (mparams.page_size-SIZE_T_ONE))   != 0))
-      ABORT;
-  }
-  return 0;
-}
-
-/* support for mallopt */
-static int change_mparam(int param_number, int value) {
-  size_t val = (size_t)value;
-  init_mparams();
-  switch(param_number) {
-  case M_TRIM_THRESHOLD:
-    mparams.trim_threshold = val;
-    return 1;
-  case M_GRANULARITY:
-    if (val >= mparams.page_size && ((val & (val-1)) == 0)) {
-      mparams.granularity = val;
-      return 1;
-    }
-    else
-      return 0;
-  case M_MMAP_THRESHOLD:
-    mparams.mmap_threshold = val;
-    return 1;
-  default:
-    return 0;
-  }
-}
-
-#if DEBUG
-/* ------------------------- Debugging Support --------------------------- */
-
-/* Check properties of any chunk, whether free, inuse, mmapped etc  */
-static void do_check_any_chunk(mstate m, mchunkptr p) {
-  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
-  assert(ok_address(m, p));
-}
-
-/* Check properties of top chunk */
-static void do_check_top_chunk(mstate m, mchunkptr p) {
-  msegmentptr sp = segment_holding(m, (char*)p);
-  size_t  sz = chunksize(p);
-  assert(sp != 0);
-  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
-  assert(ok_address(m, p));
-  assert(sz == m->topsize);
-  assert(sz > 0);
-  assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE);
-  assert(pinuse(p));
-  assert(!next_pinuse(p));
-}
-
-/* Check properties of (inuse) mmapped chunks */
-static void do_check_mmapped_chunk(mstate m, mchunkptr p) {
-  size_t  sz = chunksize(p);
-  size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD);
-  assert(is_mmapped(p));
-  assert(use_mmap(m));
-  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
-  assert(ok_address(m, p));
-  assert(!is_small(sz));
-  assert((len & (mparams.page_size-SIZE_T_ONE)) == 0);
-  assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD);
-  assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0);
-}
-
-/* Check properties of inuse chunks */
-static void do_check_inuse_chunk(mstate m, mchunkptr p) {
-  do_check_any_chunk(m, p);
-  assert(cinuse(p));
-  assert(next_pinuse(p));
-  /* If not pinuse and not mmapped, previous chunk has OK offset */
-  assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p);
-  if (is_mmapped(p))
-    do_check_mmapped_chunk(m, p);
-}
-
-/* Check properties of free chunks */
-static void do_check_free_chunk(mstate m, mchunkptr p) {
-  size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT);
-  mchunkptr next = chunk_plus_offset(p, sz);
-  do_check_any_chunk(m, p);
-  assert(!cinuse(p));
-  assert(!next_pinuse(p));
-  assert (!is_mmapped(p));
-  if (p != m->dv && p != m->top) {
-    if (sz >= MIN_CHUNK_SIZE) {
-      assert((sz & CHUNK_ALIGN_MASK) == 0);
-      assert(is_aligned(chunk2mem(p)));
-      assert(next->prev_foot == sz);
-      assert(pinuse(p));
-      assert (next == m->top || cinuse(next));
-      assert(p->fd->bk == p);
-      assert(p->bk->fd == p);
-    }
-    else  /* markers are always of size SIZE_T_SIZE */
-      assert(sz == SIZE_T_SIZE);
-  }
-}
-
-/* Check properties of malloced chunks at the point they are malloced */
-static void do_check_malloced_chunk(mstate m, void* mem, size_t s) {
-  if (mem != 0) {
-    mchunkptr p = mem2chunk(mem);
-    size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT);
-    do_check_inuse_chunk(m, p);
-    assert((sz & CHUNK_ALIGN_MASK) == 0);
-    assert(sz >= MIN_CHUNK_SIZE);
-    assert(sz >= s);
-    /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */
-    assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE));
-  }
-}
-
-/* Check a tree and its subtrees.  */
-static void do_check_tree(mstate m, tchunkptr t) {
-  tchunkptr head = 0;
-  tchunkptr u = t;
-  bindex_t tindex = t->index;
-  size_t tsize = chunksize(t);
-  bindex_t idx;
-  compute_tree_index(tsize, idx);
-  assert(tindex == idx);
-  assert(tsize >= MIN_LARGE_SIZE);
-  assert(tsize >= minsize_for_tree_index(idx));
-  assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1))));
-
-  do { /* traverse through chain of same-sized nodes */
-    do_check_any_chunk(m, ((mchunkptr)u));
-    assert(u->index == tindex);
-    assert(chunksize(u) == tsize);
-    assert(!cinuse(u));
-    assert(!next_pinuse(u));
-    assert(u->fd->bk == u);
-    assert(u->bk->fd == u);
-    if (u->parent == 0) {
-      assert(u->child[0] == 0);
-      assert(u->child[1] == 0);
-    }
-    else {
-      assert(head == 0); /* only one node on chain has parent */
-      head = u;
-      assert(u->parent != u);
-      assert (u->parent->child[0] == u ||
-              u->parent->child[1] == u ||
-              *((tbinptr*)(u->parent)) == u);
-      if (u->child[0] != 0) {
-        assert(u->child[0]->parent == u);
-        assert(u->child[0] != u);
-        do_check_tree(m, u->child[0]);
-      }
-      if (u->child[1] != 0) {
-        assert(u->child[1]->parent == u);
-        assert(u->child[1] != u);
-        do_check_tree(m, u->child[1]);
-      }
-      if (u->child[0] != 0 && u->child[1] != 0) {
-        assert(chunksize(u->child[0]) < chunksize(u->child[1]));
-      }
-    }
-    u = u->fd;
-  } while (u != t);
-  assert(head != 0);
-}
-
-/*  Check all the chunks in a treebin.  */
-static void do_check_treebin(mstate m, bindex_t i) {
-  tbinptr* tb = treebin_at(m, i);
-  tchunkptr t = *tb;
-  int empty = (m->treemap & (1U << i)) == 0;
-  if (t == 0)
-    assert(empty);
-  if (!empty)
-    do_check_tree(m, t);
-}
-
-/*  Check all the chunks in a smallbin.  */
-static void do_check_smallbin(mstate m, bindex_t i) {
-  sbinptr b = smallbin_at(m, i);
-  mchunkptr p = b->bk;
-  unsigned int empty = (m->smallmap & (1U << i)) == 0;
-  if (p == b)
-    assert(empty);
-  if (!empty) {
-    for (; p != b; p = p->bk) {
-      size_t size = chunksize(p);
-      mchunkptr q;
-      /* each chunk claims to be free */
-      do_check_free_chunk(m, p);
-      /* chunk belongs in bin */
-      assert(small_index(size) == i);
-      assert(p->bk == b || chunksize(p->bk) == chunksize(p));
-      /* chunk is followed by an inuse chunk */
-      q = next_chunk(p);
-      if (q->head != FENCEPOST_HEAD)
-        do_check_inuse_chunk(m, q);
-    }
-  }
-}
-
-/* Find x in a bin. Used in other check functions. */
-static int bin_find(mstate m, mchunkptr x) {
-  size_t size = chunksize(x);
-  if (is_small(size)) {
-    bindex_t sidx = small_index(size);
-    sbinptr b = smallbin_at(m, sidx);
-    if (smallmap_is_marked(m, sidx)) {
-      mchunkptr p = b;
-      do {
-        if (p == x)
-          return 1;
-      } while ((p = p->fd) != b);
-    }
-  }
-  else {
-    bindex_t tidx;
-    compute_tree_index(size, tidx);
-    if (treemap_is_marked(m, tidx)) {
-      tchunkptr t = *treebin_at(m, tidx);
-      size_t sizebits = size << leftshift_for_tree_index(tidx);
-      while (t != 0 && chunksize(t) != size) {
-        t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
-        sizebits <<= 1;
-      }
-      if (t != 0) {
-        tchunkptr u = t;
-        do {
-          if (u == (tchunkptr)x)
-            return 1;
-        } while ((u = u->fd) != t);
-      }
-    }
-  }
-  return 0;
-}
-
-/* Traverse each chunk and check it; return total */
-static size_t traverse_and_check(mstate m) {
-  size_t sum = 0;
-  if (is_initialized(m)) {
-    msegmentptr s = &m->seg;
-    sum += m->topsize + TOP_FOOT_SIZE;
-    while (s != 0) {
-      mchunkptr q = align_as_chunk(s->base);
-      mchunkptr lastq = 0;
-      assert(pinuse(q));
-      while (segment_holds(s, q) &&
-             q != m->top && q->head != FENCEPOST_HEAD) {
-        sum += chunksize(q);
-        if (cinuse(q)) {
-          assert(!bin_find(m, q));
-          do_check_inuse_chunk(m, q);
-        }
-        else {
-          assert(q == m->dv || bin_find(m, q));
-          assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */
-          do_check_free_chunk(m, q);
-        }
-        lastq = q;
-        q = next_chunk(q);
-      }
-      s = s->next;
-    }
-  }
-  return sum;
-}
-
-/* Check all properties of malloc_state. */
-static void do_check_malloc_state(mstate m) {
-  bindex_t i;
-  size_t total;
-  /* check bins */
-  for (i = 0; i < NSMALLBINS; ++i)
-    do_check_smallbin(m, i);
-  for (i = 0; i < NTREEBINS; ++i)
-    do_check_treebin(m, i);
-
-  if (m->dvsize != 0) { /* check dv chunk */
-    do_check_any_chunk(m, m->dv);
-    assert(m->dvsize == chunksize(m->dv));
-    assert(m->dvsize >= MIN_CHUNK_SIZE);
-    assert(bin_find(m, m->dv) == 0);
-  }
-
-  if (m->top != 0) {   /* check top chunk */
-    do_check_top_chunk(m, m->top);
-    assert(m->topsize == chunksize(m->top));
-    assert(m->topsize > 0);
-    assert(bin_find(m, m->top) == 0);
-  }
-
-  total = traverse_and_check(m);
-  assert(total <= m->footprint);
-  assert(m->footprint <= m->max_footprint);
-}
-#endif /* DEBUG */
-
-/* ----------------------------- statistics ------------------------------ */
-
-#if !NO_MALLINFO
-static struct mallinfo internal_mallinfo(mstate m) {
-  struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-  if (!PREACTION(m)) {
-    check_malloc_state(m);
-    if (is_initialized(m)) {
-      size_t nfree = SIZE_T_ONE; /* top always free */
-      size_t mfree = m->topsize + TOP_FOOT_SIZE;
-      size_t sum = mfree;
-      msegmentptr s = &m->seg;
-      while (s != 0) {
-        mchunkptr q = align_as_chunk(s->base);
-        while (segment_holds(s, q) &&
-               q != m->top && q->head != FENCEPOST_HEAD) {
-          size_t sz = chunksize(q);
-          sum += sz;
-          if (!cinuse(q)) {
-            mfree += sz;
-            ++nfree;
-          }
-          q = next_chunk(q);
-        }
-        s = s->next;
-      }
-
-      nm.arena    = sum;
-      nm.ordblks  = nfree;
-      nm.hblkhd   = m->footprint - sum;
-      nm.usmblks  = m->max_footprint;
-      nm.uordblks = m->footprint - mfree;
-      nm.fordblks = mfree;
-      nm.keepcost = m->topsize;
-    }
-
-    POSTACTION(m);
-  }
-  return nm;
-}
-#endif /* !NO_MALLINFO */
-
-static void internal_malloc_stats(mstate m) {
-  if (!PREACTION(m)) {
-    size_t maxfp = 0;
-    size_t fp = 0;
-    size_t used = 0;
-    check_malloc_state(m);
-    if (is_initialized(m)) {
-      msegmentptr s = &m->seg;
-      maxfp = m->max_footprint;
-      fp = m->footprint;
-      used = fp - (m->topsize + TOP_FOOT_SIZE);
-
-      while (s != 0) {
-        mchunkptr q = align_as_chunk(s->base);
-        while (segment_holds(s, q) &&
-               q != m->top && q->head != FENCEPOST_HEAD) {
-          if (!cinuse(q))
-            used -= chunksize(q);
-          q = next_chunk(q);
-        }
-        s = s->next;
-      }
-    }
-
-    fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp));
-    fprintf(stderr, "system bytes     = %10lu\n", (unsigned long)(fp));
-    fprintf(stderr, "in use bytes     = %10lu\n", (unsigned long)(used));
-
-    POSTACTION(m);
-  }
-}
-
-/* ----------------------- Operations on smallbins ----------------------- */
-
-/*
-  Various forms of linking and unlinking are defined as macros.  Even
-  the ones for trees, which are very long but have very short typical
-  paths.  This is ugly but reduces reliance on inlining support of
-  compilers.
-*/
-
-/* Link a free chunk into a smallbin  */
-#define insert_small_chunk(M, P, S) {\
-  bindex_t I  = small_index(S);\
-  mchunkptr B = smallbin_at(M, I);\
-  mchunkptr F = B;\
-  assert(S >= MIN_CHUNK_SIZE);\
-  if (!smallmap_is_marked(M, I))\
-    mark_smallmap(M, I);\
-  else if (RTCHECK(ok_address(M, B->fd)))\
-    F = B->fd;\
-  else {\
-    CORRUPTION_ERROR_ACTION(M);\
-  }\
-  B->fd = P;\
-  F->bk = P;\
-  P->fd = F;\
-  P->bk = B;\
-}
-
-/* Unlink a chunk from a smallbin  */
-#define unlink_small_chunk(M, P, S) {\
-  mchunkptr F = P->fd;\
-  mchunkptr B = P->bk;\
-  bindex_t I = small_index(S);\
-  assert(P != B);\
-  assert(P != F);\
-  assert(chunksize(P) == small_index2size(I));\
-  if (F == B)\
-    clear_smallmap(M, I);\
-  else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\
-                   (B == smallbin_at(M,I) || ok_address(M, B)))) {\
-    F->bk = B;\
-    B->fd = F;\
-  }\
-  else {\
-    CORRUPTION_ERROR_ACTION(M);\
-  }\
-}
-
-/* Unlink the first chunk from a smallbin */
-#define unlink_first_small_chunk(M, B, P, I) {\
-  mchunkptr F = P->fd;\
-  assert(P != B);\
-  assert(P != F);\
-  assert(chunksize(P) == small_index2size(I));\
-  if (B == F)\
-    clear_smallmap(M, I);\
-  else if (RTCHECK(ok_address(M, F))) {\
-    B->fd = F;\
-    F->bk = B;\
-  }\
-  else {\
-    CORRUPTION_ERROR_ACTION(M);\
-  }\
-}
-
-/* Replace dv node, binning the old one */
-/* Used only when dvsize known to be small */
-#define replace_dv(M, P, S) {\
-  size_t DVS = M->dvsize;\
-  if (DVS != 0) {\
-    mchunkptr DV = M->dv;\
-    assert(is_small(DVS));\
-    insert_small_chunk(M, DV, DVS);\
-  }\
-  M->dvsize = S;\
-  M->dv = P;\
-}
-
-/* ------------------------- Operations on trees ------------------------- */
-
-/* Insert chunk into tree */
-#define insert_large_chunk(M, X, S) {\
-  tbinptr* H;\
-  bindex_t I;\
-  compute_tree_index(S, I);\
-  H = treebin_at(M, I);\
-  X->index = I;\
-  X->child[0] = X->child[1] = 0;\
-  if (!treemap_is_marked(M, I)) {\
-    mark_treemap(M, I);\
-    *H = X;\
-    X->parent = (tchunkptr)H;\
-    X->fd = X->bk = X;\
-  }\
-  else {\
-    tchunkptr T = *H;\
-    size_t K = S << leftshift_for_tree_index(I);\
-    for (;;) {\
-      if (chunksize(T) != S) {\
-        tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\
-        K <<= 1;\
-        if (*C != 0)\
-          T = *C;\
-        else if (RTCHECK(ok_address(M, C))) {\
-          *C = X;\
-          X->parent = T;\
-          X->fd = X->bk = X;\
-          break;\
-        }\
-        else {\
-          CORRUPTION_ERROR_ACTION(M);\
-          break;\
-        }\
-      }\
-      else {\
-        tchunkptr F = T->fd;\
-        if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\
-          T->fd = F->bk = X;\
-          X->fd = F;\
-          X->bk = T;\
-          X->parent = 0;\
-          break;\
-        }\
-        else {\
-          CORRUPTION_ERROR_ACTION(M);\
-          break;\
-        }\
-      }\
-    }\
-  }\
-}
-
-/*
-  Unlink steps:
-
-  1. If x is a chained node, unlink it from its same-sized fd/bk links
-     and choose its bk node as its replacement.
-  2. If x was the last node of its size, but not a leaf node, it must
-     be replaced with a leaf node (not merely one with an open left or
-     right), to make sure that lefts and rights of descendants
-     correspond properly to bit masks.  We use the rightmost descendant
-     of x.  We could use any other leaf, but this is easy to locate and
-     tends to counteract removal of leftmosts elsewhere, and so keeps
-     paths shorter than minimally guaranteed.  This doesn't loop much
-     because on average a node in a tree is near the bottom.
-  3. If x is the base of a chain (i.e., has parent links) relink
-     x's parent and children to x's replacement (or null if none).
-*/
-
-#define unlink_large_chunk(M, X) {\
-  tchunkptr XP = X->parent;\
-  tchunkptr R;\
-  if (X->bk != X) {\
-    tchunkptr F = X->fd;\
-    R = X->bk;\
-    if (RTCHECK(ok_address(M, F))) {\
-      F->bk = R;\
-      R->fd = F;\
-    }\
-    else {\
-      CORRUPTION_ERROR_ACTION(M);\
-    }\
-  }\
-  else {\
-    tchunkptr* RP;\
-    if (((R = *(RP = &(X->child[1]))) != 0) ||\
-        ((R = *(RP = &(X->child[0]))) != 0)) {\
-      tchunkptr* CP;\
-      while ((*(CP = &(R->child[1])) != 0) ||\
-             (*(CP = &(R->child[0])) != 0)) {\
-        R = *(RP = CP);\
-      }\
-      if (RTCHECK(ok_address(M, RP)))\
-        *RP = 0;\
-      else {\
-        CORRUPTION_ERROR_ACTION(M);\
-      }\
-    }\
-  }\
-  if (XP != 0) {\
-    tbinptr* H = treebin_at(M, X->index);\
-    if (X == *H) {\
-      if ((*H = R) == 0) \
-        clear_treemap(M, X->index);\
-    }\
-    else if (RTCHECK(ok_address(M, XP))) {\
-      if (XP->child[0] == X) \
-        XP->child[0] = R;\
-      else \
-        XP->child[1] = R;\
-    }\
-    else\
-      CORRUPTION_ERROR_ACTION(M);\
-    if (R != 0) {\
-      if (RTCHECK(ok_address(M, R))) {\
-        tchunkptr C0, C1;\
-        R->parent = XP;\
-        if ((C0 = X->child[0]) != 0) {\
-          if (RTCHECK(ok_address(M, C0))) {\
-            R->child[0] = C0;\
-            C0->parent = R;\
-          }\
-          else\
-            CORRUPTION_ERROR_ACTION(M);\
-        }\
-        if ((C1 = X->child[1]) != 0) {\
-          if (RTCHECK(ok_address(M, C1))) {\
-            R->child[1] = C1;\
-            C1->parent = R;\
-          }\
-          else\
-            CORRUPTION_ERROR_ACTION(M);\
-        }\
-      }\
-      else\
-        CORRUPTION_ERROR_ACTION(M);\
-    }\
-  }\
-}
-
-/* Relays to large vs small bin operations */
-
-#define insert_chunk(M, P, S)\
-  if (is_small(S)) insert_small_chunk(M, P, S)\
-  else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); }
-
-#define unlink_chunk(M, P, S)\
-  if (is_small(S)) unlink_small_chunk(M, P, S)\
-  else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); }
-
-
-/* Relays to internal calls to malloc/free from realloc, memalign etc */
-
-#if ONLY_MSPACES
-#define internal_malloc(m, b) mspace_malloc(m, b)
-#define internal_free(m, mem) mspace_free(m,mem);
-#else /* ONLY_MSPACES */
-#if MSPACES
-#define internal_malloc(m, b)\
-   (m == gm)? dlmalloc(b) : mspace_malloc(m, b)
-#define internal_free(m, mem)\
-   if (m == gm) dlfree(mem); else mspace_free(m,mem);
-#else /* MSPACES */
-#define internal_malloc(m, b) dlmalloc(b)
-#define internal_free(m, mem) dlfree(mem)
-#endif /* MSPACES */
-#endif /* ONLY_MSPACES */
-
-/* -----------------------  Direct-mmapping chunks ----------------------- */
-
-/*
-  Directly mmapped chunks are set up with an offset to the start of
-  the mmapped region stored in the prev_foot field of the chunk. This
-  allows reconstruction of the required argument to MUNMAP when freed,
-  and also allows adjustment of the returned chunk to meet alignment
-  requirements (especially in memalign).  There is also enough space
-  allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain
-  the PINUSE bit so frees can be checked.
-*/
-
-/* Malloc using mmap */
-static void* mmap_alloc(mstate m, size_t nb) {
-  size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
-  if (mmsize > nb) {     /* Check for wrap around 0 */
-    char* mm = (char*)(DIRECT_MMAP(mmsize));
-    if (mm != CMFAIL) {
-      size_t offset = align_offset(chunk2mem(mm));
-      size_t psize = mmsize - offset - MMAP_FOOT_PAD;
-      mchunkptr p = (mchunkptr)(mm + offset);
-      p->prev_foot = offset | IS_MMAPPED_BIT;
-      (p)->head = (psize|CINUSE_BIT);
-      mark_inuse_foot(m, p, psize);
-      chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD;
-      chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0;
-
-      if (mm < m->least_addr)
-        m->least_addr = mm;
-      if ((m->footprint += mmsize) > m->max_footprint)
-        m->max_footprint = m->footprint;
-      assert(is_aligned(chunk2mem(p)));
-      check_mmapped_chunk(m, p);
-      return chunk2mem(p);
-    }
-  }
-  return 0;
-}
-
-/* Realloc using mmap */
-static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) {
-  size_t oldsize = chunksize(oldp);
-  if (is_small(nb)) /* Can't shrink mmap regions below small size */
-    return 0;
-  /* Keep old chunk if big enough but not too big */
-  if (oldsize >= nb + SIZE_T_SIZE &&
-      (oldsize - nb) <= (mparams.granularity << 1))
-    return oldp;
-  else {
-    size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT;
-    size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD;
-    size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES +
-                                         CHUNK_ALIGN_MASK);
-    char* cp = (char*)CALL_MREMAP((char*)oldp - offset,
-                                  oldmmsize, newmmsize, 1);
-    if (cp != CMFAIL) {
-      mchunkptr newp = (mchunkptr)(cp + offset);
-      size_t psize = newmmsize - offset - MMAP_FOOT_PAD;
-      newp->head = (psize|CINUSE_BIT);
-      mark_inuse_foot(m, newp, psize);
-      chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD;
-      chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0;
-
-      if (cp < m->least_addr)
-        m->least_addr = cp;
-      if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint)
-        m->max_footprint = m->footprint;
-      check_mmapped_chunk(m, newp);
-      return newp;
-    }
-  }
-  return 0;
-}
-
-/* -------------------------- mspace management -------------------------- */
-
-/* Initialize top chunk and its size */
-static void init_top(mstate m, mchunkptr p, size_t psize) {
-  /* Ensure alignment */
-  size_t offset = align_offset(chunk2mem(p));
-  p = (mchunkptr)((char*)p + offset);
-  psize -= offset;
-
-  m->top = p;
-  m->topsize = psize;
-  p->head = psize | PINUSE_BIT;
-  /* set size of fake trailing chunk holding overhead space only once */
-  chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE;
-  m->trim_check = mparams.trim_threshold; /* reset on each update */
-}
-
-/* Initialize bins for a new mstate that is otherwise zeroed out */
-static void init_bins(mstate m) {
-  /* Establish circular links for smallbins */
-  bindex_t i;
-  for (i = 0; i < NSMALLBINS; ++i) {
-    sbinptr bin = smallbin_at(m,i);
-    bin->fd = bin->bk = bin;
-  }
-}
-
-#if PROCEED_ON_ERROR
-
-/* default corruption action */
-static void reset_on_error(mstate m) {
-  int i;
-  ++malloc_corruption_error_count;
-  /* Reinitialize fields to forget about all memory */
-  m->smallbins = m->treebins = 0;
-  m->dvsize = m->topsize = 0;
-  m->seg.base = 0;
-  m->seg.size = 0;
-  m->seg.next = 0;
-  m->top = m->dv = 0;
-  for (i = 0; i < NTREEBINS; ++i)
-    *treebin_at(m, i) = 0;
-  init_bins(m);
-}
-#endif /* PROCEED_ON_ERROR */
-
-/* Allocate chunk and prepend remainder with chunk in successor base. */
-static void* prepend_alloc(mstate m, char* newbase, char* oldbase,
-                           size_t nb) {
-  mchunkptr p = align_as_chunk(newbase);
-  mchunkptr oldfirst = align_as_chunk(oldbase);
-  size_t psize = (char*)oldfirst - (char*)p;
-  mchunkptr q = chunk_plus_offset(p, nb);
-  size_t qsize = psize - nb;
-  set_size_and_pinuse_of_inuse_chunk(m, p, nb);
-
-  assert((char*)oldfirst > (char*)q);
-  assert(pinuse(oldfirst));
-  assert(qsize >= MIN_CHUNK_SIZE);
-
-  /* consolidate remainder with first chunk of old base */
-  if (oldfirst == m->top) {
-    size_t tsize = m->topsize += qsize;
-    m->top = q;
-    q->head = tsize | PINUSE_BIT;
-    check_top_chunk(m, q);
-  }
-  else if (oldfirst == m->dv) {
-    size_t dsize = m->dvsize += qsize;
-    m->dv = q;
-    set_size_and_pinuse_of_free_chunk(q, dsize);
-  }
-  else {
-    if (!cinuse(oldfirst)) {
-      size_t nsize = chunksize(oldfirst);
-      unlink_chunk(m, oldfirst, nsize);
-      oldfirst = chunk_plus_offset(oldfirst, nsize);
-      qsize += nsize;
-    }
-    set_free_with_pinuse(q, qsize, oldfirst);
-    insert_chunk(m, q, qsize);
-    check_free_chunk(m, q);
-  }
-
-  check_malloced_chunk(m, chunk2mem(p), nb);
-  return chunk2mem(p);
-}
-
-
-/* Add a segment to hold a new noncontiguous region */
-static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) {
-  /* Determine locations and sizes of segment, fenceposts, old top */
-  char* old_top = (char*)m->top;
-  msegmentptr oldsp = segment_holding(m, old_top);
-  char* old_end = oldsp->base + oldsp->size;
-  size_t ssize = pad_request(sizeof(struct malloc_segment));
-  char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
-  size_t offset = align_offset(chunk2mem(rawsp));
-  char* asp = rawsp + offset;
-  char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp;
-  mchunkptr sp = (mchunkptr)csp;
-  msegmentptr ss = (msegmentptr)(chunk2mem(sp));
-  mchunkptr tnext = chunk_plus_offset(sp, ssize);
-  mchunkptr p = tnext;
-  int nfences = 0;
-
-  /* reset top to new space */
-  init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
-
-  /* Set up segment record */
-  assert(is_aligned(ss));
-  set_size_and_pinuse_of_inuse_chunk(m, sp, ssize);
-  *ss = m->seg; /* Push current record */
-  m->seg.base = tbase;
-  m->seg.size = tsize;
-  (void)set_segment_flags(&m->seg, mmapped);
-  m->seg.next = ss;
-
-  /* Insert trailing fenceposts */
-  for (;;) {
-    mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE);
-    p->head = FENCEPOST_HEAD;
-    ++nfences;
-    if ((char*)(&(nextp->head)) < old_end)
-      p = nextp;
-    else
-      break;
-  }
-  assert(nfences >= 2);
-
-  /* Insert the rest of old top into a bin as an ordinary free chunk */
-  if (csp != old_top) {
-    mchunkptr q = (mchunkptr)old_top;
-    size_t psize = csp - old_top;
-    mchunkptr tn = chunk_plus_offset(q, psize);
-    set_free_with_pinuse(q, psize, tn);
-    insert_chunk(m, q, psize);
-  }
-
-  check_top_chunk(m, m->top);
-}
-
-/* -------------------------- System allocation -------------------------- */
-
-/* Get memory from system using MORECORE or MMAP */
-static void* sys_alloc(mstate m, size_t nb) {
-  char* tbase = CMFAIL;
-  size_t tsize = 0;
-  flag_t mmap_flag = 0;
-
-  init_mparams();
-
-  /* Directly map large chunks */
-  if (use_mmap(m) && nb >= mparams.mmap_threshold) {
-    void* mem = mmap_alloc(m, nb);
-    if (mem != 0)
-      return mem;
-  }
-
-  /*
-    Try getting memory in any of three ways (in most-preferred to
-    least-preferred order):
-    1. A call to MORECORE that can normally contiguously extend memory.
-       (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or
-       or main space is mmapped or a previous contiguous call failed)
-    2. A call to MMAP new space (disabled if not HAVE_MMAP).
-       Note that under the default settings, if MORECORE is unable to
-       fulfill a request, and HAVE_MMAP is true, then mmap is
-       used as a noncontiguous system allocator. This is a useful backup
-       strategy for systems with holes in address spaces -- in this case
-       sbrk cannot contiguously expand the heap, but mmap may be able to
-       find space.
-    3. A call to MORECORE that cannot usually contiguously extend memory.
-       (disabled if not HAVE_MORECORE)
-  */
-
-  if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) {
-    char* br = CMFAIL;
-    msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top);
-    size_t asize = 0;
-    ACQUIRE_MORECORE_LOCK();
-
-    if (ss == 0) {  /* First time through or recovery */
-      char* base = (char*)CALL_MORECORE(0);
-      if (base != CMFAIL) {
-        asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE);
-        /* Adjust to end on a page boundary */
-        if (!is_page_aligned(base))
-          asize += (page_align((size_t)base) - (size_t)base);
-        /* Can't call MORECORE if size is negative when treated as signed */
-        if (asize < HALF_MAX_SIZE_T &&
-            (br = (char*)(CALL_MORECORE(asize))) == base) {
-          tbase = base;
-          tsize = asize;
-        }
-      }
-    }
-    else {
-      /* Subtract out existing available top space from MORECORE request. */
-      asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE);
-      /* Use mem here only if it did continuously extend old space */
-      if (asize < HALF_MAX_SIZE_T &&
-          (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) {
-        tbase = br;
-        tsize = asize;
-      }
-    }
-
-    if (tbase == CMFAIL) {    /* Cope with partial failure */
-      if (br != CMFAIL) {    /* Try to use/extend the space we did get */
-        if (asize < HALF_MAX_SIZE_T &&
-            asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) {
-          size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize);
-          if (esize < HALF_MAX_SIZE_T) {
-            char* end = (char*)CALL_MORECORE(esize);
-            if (end != CMFAIL)
-              asize += esize;
-            else {            /* Can't use; try to release */
-              (void)CALL_MORECORE(-asize);
-              br = CMFAIL;
-            }
-          }
-        }
-      }
-      if (br != CMFAIL) {    /* Use the space we did get */
-        tbase = br;
-        tsize = asize;
-      }
-      else
-        disable_contiguous(m); /* Don't try contiguous path in the future */
-    }
-
-    RELEASE_MORECORE_LOCK();
-  }
-
-  if (HAVE_MMAP && tbase == CMFAIL) {  /* Try MMAP */
-    size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE;
-    size_t rsize = granularity_align(req);
-    if (rsize > nb) { /* Fail if wraps around zero */
-      char* mp = (char*)(CALL_MMAP(rsize));
-      if (mp != CMFAIL) {
-        tbase = mp;
-        tsize = rsize;
-        mmap_flag = IS_MMAPPED_BIT;
-      }
-    }
-  }
-
-  if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */
-    size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE);
-    if (asize < HALF_MAX_SIZE_T) {
-      char* br = CMFAIL;
-      char* end = CMFAIL;
-      ACQUIRE_MORECORE_LOCK();
-      br = (char*)(CALL_MORECORE(asize));
-      end = (char*)(CALL_MORECORE(0));
-      RELEASE_MORECORE_LOCK();
-      if (br != CMFAIL && end != CMFAIL && br < end) {
-        size_t ssize = end - br;
-        if (ssize > nb + TOP_FOOT_SIZE) {
-          tbase = br;
-          tsize = ssize;
-        }
-      }
-    }
-  }
-
-  if (tbase != CMFAIL) {
-
-    if ((m->footprint += tsize) > m->max_footprint)
-      m->max_footprint = m->footprint;
-
-    if (!is_initialized(m)) { /* first-time initialization */
-      m->seg.base = m->least_addr = tbase;
-      m->seg.size = tsize;
-      (void)set_segment_flags(&m->seg, mmap_flag);
-      m->magic = mparams.magic;
-      init_bins(m);
-      if (is_global(m)) 
-        init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
-      else {
-        /* Offset top by embedded malloc_state */
-        mchunkptr mn = next_chunk(mem2chunk(m));
-        init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE);
-      }
-    }
-
-    else {
-      /* Try to merge with an existing segment */
-      msegmentptr sp = &m->seg;
-      while (sp != 0 && tbase != sp->base + sp->size)
-        sp = sp->next;
-      if (sp != 0 &&
-          !is_extern_segment(sp) &&
-	  check_segment_merge(sp, tbase, tsize) &&
-          (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag &&
-          segment_holds(sp, m->top)) { /* append */
-        sp->size += tsize;
-        init_top(m, m->top, m->topsize + tsize);
-      }
-      else {
-        if (tbase < m->least_addr)
-          m->least_addr = tbase;
-        sp = &m->seg;
-        while (sp != 0 && sp->base != tbase + tsize)
-          sp = sp->next;
-        if (sp != 0 &&
-            !is_extern_segment(sp) &&
-	    check_segment_merge(sp, tbase, tsize) &&
-            (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag) {
-          char* oldbase = sp->base;
-          sp->base = tbase;
-          sp->size += tsize;
-          return prepend_alloc(m, tbase, oldbase, nb);
-        }
-        else
-          add_segment(m, tbase, tsize, mmap_flag);
-      }
-    }
-
-    if (nb < m->topsize) { /* Allocate from new or extended top space */
-      size_t rsize = m->topsize -= nb;
-      mchunkptr p = m->top;
-      mchunkptr r = m->top = chunk_plus_offset(p, nb);
-      r->head = rsize | PINUSE_BIT;
-      set_size_and_pinuse_of_inuse_chunk(m, p, nb);
-      check_top_chunk(m, m->top);
-      check_malloced_chunk(m, chunk2mem(p), nb);
-      return chunk2mem(p);
-    }
-  }
-
-  MALLOC_FAILURE_ACTION;
-  return 0;
-}
-
-/* -----------------------  system deallocation -------------------------- */
-
-/* Unmap and unlink any mmapped segments that don't contain used chunks */
-static size_t release_unused_segments(mstate m) {
-  size_t released = 0;
-  msegmentptr pred = &m->seg;
-  msegmentptr sp = pred->next;
-  while (sp != 0) {
-    char* base = sp->base;
-    size_t size = sp->size;
-    msegmentptr next = sp->next;
-    if (is_mmapped_segment(sp) && !is_extern_segment(sp)) {
-      mchunkptr p = align_as_chunk(base);
-      size_t psize = chunksize(p);
-      /* Can unmap if first chunk holds entire segment and not pinned */
-      if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) {
-        tchunkptr tp = (tchunkptr)p;
-        assert(segment_holds(sp, (char*)sp));
-        if (p == m->dv) {
-          m->dv = 0;
-          m->dvsize = 0;
-        }
-        else {
-          unlink_large_chunk(m, tp);
-        }
-        if (CALL_MUNMAP(base, size) == 0) {
-          released += size;
-          m->footprint -= size;
-          /* unlink obsoleted record */
-          sp = pred;
-          sp->next = next;
-        }
-        else { /* back out if cannot unmap */
-          insert_large_chunk(m, tp, psize);
-        }
-      }
-    }
-    pred = sp;
-    sp = next;
-  }
-  return released;
-}
-
-static int sys_trim(mstate m, size_t pad) {
-  size_t released = 0;
-  if (pad < MAX_REQUEST && is_initialized(m)) {
-    pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */
-
-    if (m->topsize > pad) {
-      /* Shrink top space in granularity-size units, keeping at least one */
-      size_t unit = mparams.granularity;
-      size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit -
-                      SIZE_T_ONE) * unit;
-      msegmentptr sp = segment_holding(m, (char*)m->top);
-
-      if (!is_extern_segment(sp)) {
-        if (is_mmapped_segment(sp)) {
-          if (HAVE_MMAP &&
-              sp->size >= extra &&
-              !has_segment_link(m, sp)) { /* can't shrink if pinned */
-            size_t newsize = sp->size - extra;
-            /* Prefer mremap, fall back to munmap */
-            if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) ||
-                (CALL_MUNMAP(sp->base + newsize, extra) == 0)) {
-              released = extra;
-            }
-          }
-        }
-        else if (HAVE_MORECORE) {
-          if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */
-            extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit;
-          ACQUIRE_MORECORE_LOCK();
-          {
-            /* Make sure end of memory is where we last set it. */
-            char* old_br = (char*)(CALL_MORECORE(0));
-            if (old_br == sp->base + sp->size) {
-              char* rel_br = (char*)(CALL_MORECORE(-extra));
-              char* new_br = (char*)(CALL_MORECORE(0));
-              if (rel_br != CMFAIL && new_br < old_br)
-                released = old_br - new_br;
-            }
-          }
-          RELEASE_MORECORE_LOCK();
-        }
-      }
-
-      if (released != 0) {
-        sp->size -= released;
-        m->footprint -= released;
-        init_top(m, m->top, m->topsize - released);
-        check_top_chunk(m, m->top);
-      }
-    }
-
-    /* Unmap any unused mmapped segments */
-    if (HAVE_MMAP) 
-      released += release_unused_segments(m);
-
-    /* On failure, disable autotrim to avoid repeated failed future calls */
-    if (released == 0)
-      m->trim_check = MAX_SIZE_T;
-  }
-
-  return (released != 0)? 1 : 0;
-}
-
-/* ---------------------------- malloc support --------------------------- */
-
-/* allocate a large request from the best fitting chunk in a treebin */
-static void* tmalloc_large(mstate m, size_t nb) {
-  tchunkptr v = 0;
-  size_t rsize = -nb; /* Unsigned negation */
-  tchunkptr t;
-  bindex_t idx;
-  compute_tree_index(nb, idx);
-
-  if ((t = *treebin_at(m, idx)) != 0) {
-    /* Traverse tree for this bin looking for node with size == nb */
-    size_t sizebits = nb << leftshift_for_tree_index(idx);
-    tchunkptr rst = 0;  /* The deepest untaken right subtree */
-    for (;;) {
-      tchunkptr rt;
-      size_t trem = chunksize(t) - nb;
-      if (trem < rsize) {
-        v = t;
-        if ((rsize = trem) == 0)
-          break;
-      }
-      rt = t->child[1];
-      t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
-      if (rt != 0 && rt != t)
-        rst = rt;
-      if (t == 0) {
-        t = rst; /* set t to least subtree holding sizes > nb */
-        break;
-      }
-      sizebits <<= 1;
-    }
-  }
-
-  if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */
-    binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap;
-    if (leftbits != 0) {
-      bindex_t i;
-      binmap_t leastbit = least_bit(leftbits);
-      compute_bit2idx(leastbit, i);
-      t = *treebin_at(m, i);
-    }
-  }
-
-  while (t != 0) { /* find smallest of tree or subtree */
-    size_t trem = chunksize(t) - nb;
-    if (trem < rsize) {
-      rsize = trem;
-      v = t;
-    }
-    t = leftmost_child(t);
-  }
-
-  /*  If dv is a better fit, return 0 so malloc will use it */
-  if (v != 0 && rsize < (size_t)(m->dvsize - nb)) {
-    if (RTCHECK(ok_address(m, v))) { /* split */
-      mchunkptr r = chunk_plus_offset(v, nb);
-      assert(chunksize(v) == rsize + nb);
-      if (RTCHECK(ok_next(v, r))) {
-        unlink_large_chunk(m, v);
-        if (rsize < MIN_CHUNK_SIZE)
-          set_inuse_and_pinuse(m, v, (rsize + nb));
-        else {
-          set_size_and_pinuse_of_inuse_chunk(m, v, nb);
-          set_size_and_pinuse_of_free_chunk(r, rsize);
-          insert_chunk(m, r, rsize);
-        }
-        return chunk2mem(v);
-      }
-    }
-    CORRUPTION_ERROR_ACTION(m);
-  }
-  return 0;
-}
-
-/* allocate a small request from the best fitting chunk in a treebin */
-static void* tmalloc_small(mstate m, size_t nb) {
-  tchunkptr t, v;
-  size_t rsize;
-  bindex_t i;
-  binmap_t leastbit = least_bit(m->treemap);
-  compute_bit2idx(leastbit, i);
-
-  v = t = *treebin_at(m, i);
-  rsize = chunksize(t) - nb;
-
-  while ((t = leftmost_child(t)) != 0) {
-    size_t trem = chunksize(t) - nb;
-    if (trem < rsize) {
-      rsize = trem;
-      v = t;
-    }
-  }
-
-  if (RTCHECK(ok_address(m, v))) {
-    mchunkptr r = chunk_plus_offset(v, nb);
-    assert(chunksize(v) == rsize + nb);
-    if (RTCHECK(ok_next(v, r))) {
-      unlink_large_chunk(m, v);
-      if (rsize < MIN_CHUNK_SIZE)
-        set_inuse_and_pinuse(m, v, (rsize + nb));
-      else {
-        set_size_and_pinuse_of_inuse_chunk(m, v, nb);
-        set_size_and_pinuse_of_free_chunk(r, rsize);
-        replace_dv(m, r, rsize);
-      }
-      return chunk2mem(v);
-    }
-  }
-
-  CORRUPTION_ERROR_ACTION(m);
-  return 0;
-}
-
-/* --------------------------- realloc support --------------------------- */
-
-static void* internal_realloc(mstate m, void* oldmem, size_t bytes) {
-  if (bytes >= MAX_REQUEST) {
-    MALLOC_FAILURE_ACTION;
-    return 0;
-  }
-  if (!PREACTION(m)) {
-    mchunkptr oldp = mem2chunk(oldmem);
-    size_t oldsize = chunksize(oldp);
-    mchunkptr next = chunk_plus_offset(oldp, oldsize);
-    mchunkptr newp = 0;
-    void* extra = 0;
-
-    /* Try to either shrink or extend into top. Else malloc-copy-free */
-
-    if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) &&
-                ok_next(oldp, next) && ok_pinuse(next))) {
-      size_t nb = request2size(bytes);
-      if (is_mmapped(oldp))
-        newp = mmap_resize(m, oldp, nb);
-      else if (oldsize >= nb) { /* already big enough */
-        size_t rsize = oldsize - nb;
-        newp = oldp;
-        if (rsize >= MIN_CHUNK_SIZE) {
-          mchunkptr remainder = chunk_plus_offset(newp, nb);
-          set_inuse(m, newp, nb);
-          set_inuse(m, remainder, rsize);
-          extra = chunk2mem(remainder);
-        }
-      }
-      else if (next == m->top && oldsize + m->topsize > nb) {
-        /* Expand into top */
-        size_t newsize = oldsize + m->topsize;
-        size_t newtopsize = newsize - nb;
-        mchunkptr newtop = chunk_plus_offset(oldp, nb);
-        set_inuse(m, oldp, nb);
-        newtop->head = newtopsize |PINUSE_BIT;
-        m->top = newtop;
-        m->topsize = newtopsize;
-        newp = oldp;
-      }
-    }
-    else {
-      USAGE_ERROR_ACTION(m, oldmem);
-      POSTACTION(m);
-      return 0;
-    }
-
-    POSTACTION(m);
-
-    if (newp != 0) {
-      if (extra != 0) {
-        internal_free(m, extra);
-      }
-      check_inuse_chunk(m, newp);
-      return chunk2mem(newp);
-    }
-    else {
-      void* newmem = internal_malloc(m, bytes);
-      if (newmem != 0) {
-        size_t oc = oldsize - overhead_for(oldp);
-        memcpy(newmem, oldmem, (oc < bytes)? oc : bytes);
-        internal_free(m, oldmem);
-      }
-      return newmem;
-    }
-  }
-  return 0;
-}
-
-/* --------------------------- memalign support -------------------------- */
-
-static void* internal_memalign(mstate m, size_t alignment, size_t bytes) {
-  if (alignment <= MALLOC_ALIGNMENT)    /* Can just use malloc */
-    return internal_malloc(m, bytes);
-  if (alignment <  MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */
-    alignment = MIN_CHUNK_SIZE;
-  if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */
-    size_t a = MALLOC_ALIGNMENT << 1;
-    while (a < alignment) a <<= 1;
-    alignment = a;
-  }
-  
-  if (bytes >= MAX_REQUEST - alignment) {
-    if (m != 0)  { /* Test isn't needed but avoids compiler warning */
-      MALLOC_FAILURE_ACTION;
-    }
-  }
-  else {
-    size_t nb = request2size(bytes);
-    size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD;
-    char* mem = (char*)internal_malloc(m, req);
-    if (mem != 0) {
-      void* leader = 0;
-      void* trailer = 0;
-      mchunkptr p = mem2chunk(mem);
-
-      if (PREACTION(m)) return 0;
-      if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */
-        /*
-          Find an aligned spot inside chunk.  Since we need to give
-          back leading space in a chunk of at least MIN_CHUNK_SIZE, if
-          the first calculation places us at a spot with less than
-          MIN_CHUNK_SIZE leader, we can move to the next aligned spot.
-          We've allocated enough total room so that this is always
-          possible.
-        */
-        char* br = (char*)mem2chunk((size_t)(((size_t)(mem +
-                                                       alignment -
-                                                       SIZE_T_ONE)) &
-                                             -alignment));
-        char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)?
-          br : br+alignment;
-        mchunkptr newp = (mchunkptr)pos;
-        size_t leadsize = pos - (char*)(p);
-        size_t newsize = chunksize(p) - leadsize;
-
-        if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */
-          newp->prev_foot = p->prev_foot + leadsize;
-          newp->head = (newsize|CINUSE_BIT);
-        }
-        else { /* Otherwise, give back leader, use the rest */
-          set_inuse(m, newp, newsize);
-          set_inuse(m, p, leadsize);
-          leader = chunk2mem(p);
-        }
-        p = newp;
-      }
-
-      /* Give back spare room at the end */
-      if (!is_mmapped(p)) {
-        size_t size = chunksize(p);
-        if (size > nb + MIN_CHUNK_SIZE) {
-          size_t remainder_size = size - nb;
-          mchunkptr remainder = chunk_plus_offset(p, nb);
-          set_inuse(m, p, nb);
-          set_inuse(m, remainder, remainder_size);
-          trailer = chunk2mem(remainder);
-        }
-      }
-
-      assert (chunksize(p) >= nb);
-      assert((((size_t)(chunk2mem(p))) % alignment) == 0);
-      check_inuse_chunk(m, p);
-      POSTACTION(m);
-      if (leader != 0) {
-        internal_free(m, leader);
-      }
-      if (trailer != 0) {
-        internal_free(m, trailer);
-      }
-      return chunk2mem(p);
-    }
-  }
-  return 0;
-}
-
-/* ------------------------ comalloc/coalloc support --------------------- */
-
-static void** ialloc(mstate m,
-                     size_t n_elements,
-                     size_t* sizes,
-                     int opts,
-                     void* chunks[]) {
-  /*
-    This provides common support for independent_X routines, handling
-    all of the combinations that can result.
-
-    The opts arg has:
-    bit 0 set if all elements are same size (using sizes[0])
-    bit 1 set if elements should be zeroed
-  */
-
-  size_t    element_size;   /* chunksize of each element, if all same */
-  size_t    contents_size;  /* total size of elements */
-  size_t    array_size;     /* request size of pointer array */
-  void*     mem;            /* malloced aggregate space */
-  mchunkptr p;              /* corresponding chunk */
-  size_t    remainder_size; /* remaining bytes while splitting */
-  void**    marray;         /* either "chunks" or malloced ptr array */
-  mchunkptr array_chunk;    /* chunk for malloced ptr array */
-  flag_t    was_enabled;    /* to disable mmap */
-  size_t    size;
-  size_t    i;
-
-  /* compute array length, if needed */
-  if (chunks != 0) {
-    if (n_elements == 0)
-      return chunks; /* nothing to do */
-    marray = chunks;
-    array_size = 0;
-  }
-  else {
-    /* if empty req, must still return chunk representing empty array */
-    if (n_elements == 0)
-      return (void**)internal_malloc(m, 0);
-    marray = 0;
-    array_size = request2size(n_elements * (sizeof(void*)));
-  }
-
-  /* compute total element size */
-  if (opts & 0x1) { /* all-same-size */
-    element_size = request2size(*sizes);
-    contents_size = n_elements * element_size;
-  }
-  else { /* add up all the sizes */
-    element_size = 0;
-    contents_size = 0;
-    for (i = 0; i != n_elements; ++i)
-      contents_size += request2size(sizes[i]);
-  }
-
-  size = contents_size + array_size;
-
-  /*
-     Allocate the aggregate chunk.  First disable direct-mmapping so
-     malloc won't use it, since we would not be able to later
-     free/realloc space internal to a segregated mmap region.
-  */
-  was_enabled = use_mmap(m);
-  disable_mmap(m);
-  mem = internal_malloc(m, size - CHUNK_OVERHEAD);
-  if (was_enabled)
-    enable_mmap(m);
-  if (mem == 0)
-    return 0;
-
-  if (PREACTION(m)) return 0;
-  p = mem2chunk(mem);
-  remainder_size = chunksize(p);
-
-  assert(!is_mmapped(p));
-
-  if (opts & 0x2) {       /* optionally clear the elements */
-    memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size);
-  }
-
-  /* If not provided, allocate the pointer array as final part of chunk */
-  if (marray == 0) {
-    size_t  array_chunk_size;
-    array_chunk = chunk_plus_offset(p, contents_size);
-    array_chunk_size = remainder_size - contents_size;
-    marray = (void**) (chunk2mem(array_chunk));
-    set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size);
-    remainder_size = contents_size;
-  }
-
-  /* split out elements */
-  for (i = 0; ; ++i) {
-    marray[i] = chunk2mem(p);
-    if (i != n_elements-1) {
-      if (element_size != 0)
-        size = element_size;
-      else
-        size = request2size(sizes[i]);
-      remainder_size -= size;
-      set_size_and_pinuse_of_inuse_chunk(m, p, size);
-      p = chunk_plus_offset(p, size);
-    }
-    else { /* the final element absorbs any overallocation slop */
-      set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size);
-      break;
-    }
-  }
-
-#if DEBUG
-  if (marray != chunks) {
-    /* final element must have exactly exhausted chunk */
-    if (element_size != 0) {
-      assert(remainder_size == element_size);
-    }
-    else {
-      assert(remainder_size == request2size(sizes[i]));
-    }
-    check_inuse_chunk(m, mem2chunk(marray));
-  }
-  for (i = 0; i != n_elements; ++i)
-    check_inuse_chunk(m, mem2chunk(marray[i]));
-
-#endif /* DEBUG */
-
-  POSTACTION(m);
-  return marray;
-}
-
-
-/* -------------------------- public routines ---------------------------- */
-
-#if !ONLY_MSPACES
-
-void* dlmalloc(size_t bytes) {
-  /*
-     Basic algorithm:
-     If a small request (< 256 bytes minus per-chunk overhead):
-       1. If one exists, use a remainderless chunk in associated smallbin.
-          (Remainderless means that there are too few excess bytes to
-          represent as a chunk.)
-       2. If it is big enough, use the dv chunk, which is normally the
-          chunk adjacent to the one used for the most recent small request.
-       3. If one exists, split the smallest available chunk in a bin,
-          saving remainder in dv.
-       4. If it is big enough, use the top chunk.
-       5. If available, get memory from system and use it
-     Otherwise, for a large request:
-       1. Find the smallest available binned chunk that fits, and use it
-          if it is better fitting than dv chunk, splitting if necessary.
-       2. If better fitting than any binned chunk, use the dv chunk.
-       3. If it is big enough, use the top chunk.
-       4. If request size >= mmap threshold, try to directly mmap this chunk.
-       5. If available, get memory from system and use it
-
-     The ugly goto's here ensure that postaction occurs along all paths.
-  */
-
-  if (!PREACTION(gm)) {
-    void* mem;
-    size_t nb;
-    if (bytes <= MAX_SMALL_REQUEST) {
-      bindex_t idx;
-      binmap_t smallbits;
-      nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
-      idx = small_index(nb);
-      smallbits = gm->smallmap >> idx;
-
-      if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
-        mchunkptr b, p;
-        idx += ~smallbits & 1;       /* Uses next bin if idx empty */
-        b = smallbin_at(gm, idx);
-        p = b->fd;
-        assert(chunksize(p) == small_index2size(idx));
-        unlink_first_small_chunk(gm, b, p, idx);
-        set_inuse_and_pinuse(gm, p, small_index2size(idx));
-        mem = chunk2mem(p);
-        check_malloced_chunk(gm, mem, nb);
-        goto postaction;
-      }
-
-      else if (nb > gm->dvsize) {
-        if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
-          mchunkptr b, p, r;
-          size_t rsize;
-          bindex_t i;
-          binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
-          binmap_t leastbit = least_bit(leftbits);
-          compute_bit2idx(leastbit, i);
-          b = smallbin_at(gm, i);
-          p = b->fd;
-          assert(chunksize(p) == small_index2size(i));
-          unlink_first_small_chunk(gm, b, p, i);
-          rsize = small_index2size(i) - nb;
-          /* Fit here cannot be remainderless if 4byte sizes */
-          if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
-            set_inuse_and_pinuse(gm, p, small_index2size(i));
-          else {
-            set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
-            r = chunk_plus_offset(p, nb);
-            set_size_and_pinuse_of_free_chunk(r, rsize);
-            replace_dv(gm, r, rsize);
-          }
-          mem = chunk2mem(p);
-          check_malloced_chunk(gm, mem, nb);
-          goto postaction;
-        }
-
-        else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) {
-          check_malloced_chunk(gm, mem, nb);
-          goto postaction;
-        }
-      }
-    }
-    else if (bytes >= MAX_REQUEST)
-      nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
-    else {
-      nb = pad_request(bytes);
-      if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) {
-        check_malloced_chunk(gm, mem, nb);
-        goto postaction;
-      }
-    }
-
-    if (nb <= gm->dvsize) {
-      size_t rsize = gm->dvsize - nb;
-      mchunkptr p = gm->dv;
-      if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
-        mchunkptr r = gm->dv = chunk_plus_offset(p, nb);
-        gm->dvsize = rsize;
-        set_size_and_pinuse_of_free_chunk(r, rsize);
-        set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
-      }
-      else { /* exhaust dv */
-        size_t dvs = gm->dvsize;
-        gm->dvsize = 0;
-        gm->dv = 0;
-        set_inuse_and_pinuse(gm, p, dvs);
-      }
-      mem = chunk2mem(p);
-      check_malloced_chunk(gm, mem, nb);
-      goto postaction;
-    }
-
-    else if (nb < gm->topsize) { /* Split top */
-      size_t rsize = gm->topsize -= nb;
-      mchunkptr p = gm->top;
-      mchunkptr r = gm->top = chunk_plus_offset(p, nb);
-      r->head = rsize | PINUSE_BIT;
-      set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
-      mem = chunk2mem(p);
-      check_top_chunk(gm, gm->top);
-      check_malloced_chunk(gm, mem, nb);
-      goto postaction;
-    }
-
-    mem = sys_alloc(gm, nb);
-
-  postaction:
-    POSTACTION(gm);
-    return mem;
-  }
-
-  return 0;
-}
-
-void dlfree(void* mem) {
-  /*
-     Consolidate freed chunks with preceding or succeeding bordering
-     free chunks, if they exist, and then place in a bin.  Intermixed
-     with special cases for top, dv, mmapped chunks, and usage errors.
-  */
-
-  if (mem != 0) {
-    mchunkptr p  = mem2chunk(mem);
-#if FOOTERS
-    mstate fm = get_mstate_for(p);
-    if (!ok_magic(fm)) {
-      USAGE_ERROR_ACTION(fm, p);
-      return;
-    }
-#else /* FOOTERS */
-#define fm gm
-#endif /* FOOTERS */
-    if (!PREACTION(fm)) {
-      check_inuse_chunk(fm, p);
-      if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) {
-        size_t psize = chunksize(p);
-        mchunkptr next = chunk_plus_offset(p, psize);
-        if (!pinuse(p)) {
-          size_t prevsize = p->prev_foot;
-          if ((prevsize & IS_MMAPPED_BIT) != 0) {
-            prevsize &= ~IS_MMAPPED_BIT;
-            psize += prevsize + MMAP_FOOT_PAD;
-            if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
-              fm->footprint -= psize;
-            goto postaction;
-          }
-          else {
-            mchunkptr prev = chunk_minus_offset(p, prevsize);
-            psize += prevsize;
-            p = prev;
-            if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
-              if (p != fm->dv) {
-                unlink_chunk(fm, p, prevsize);
-              }
-              else if ((next->head & INUSE_BITS) == INUSE_BITS) {
-                fm->dvsize = psize;
-                set_free_with_pinuse(p, psize, next);
-                goto postaction;
-              }
-            }
-            else
-              goto erroraction;
-          }
-        }
-
-        if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
-          if (!cinuse(next)) {  /* consolidate forward */
-            if (next == fm->top) {
-              size_t tsize = fm->topsize += psize;
-              fm->top = p;
-              p->head = tsize | PINUSE_BIT;
-              if (p == fm->dv) {
-                fm->dv = 0;
-                fm->dvsize = 0;
-              }
-              if (should_trim(fm, tsize))
-                sys_trim(fm, 0);
-              goto postaction;
-            }
-            else if (next == fm->dv) {
-              size_t dsize = fm->dvsize += psize;
-              fm->dv = p;
-              set_size_and_pinuse_of_free_chunk(p, dsize);
-              goto postaction;
-            }
-            else {
-              size_t nsize = chunksize(next);
-              psize += nsize;
-              unlink_chunk(fm, next, nsize);
-              set_size_and_pinuse_of_free_chunk(p, psize);
-              if (p == fm->dv) {
-                fm->dvsize = psize;
-                goto postaction;
-              }
-            }
-          }
-          else
-            set_free_with_pinuse(p, psize, next);
-          insert_chunk(fm, p, psize);
-          check_free_chunk(fm, p);
-          goto postaction;
-        }
-      }
-    erroraction:
-      USAGE_ERROR_ACTION(fm, p);
-    postaction:
-      POSTACTION(fm);
-    }
-  }
-#if !FOOTERS
-#undef fm
-#endif /* FOOTERS */
-}
-
-void* dlcalloc(size_t n_elements, size_t elem_size) {
-  void* mem;
-  size_t req = 0;
-  if (n_elements != 0) {
-    req = n_elements * elem_size;
-    if (((n_elements | elem_size) & ~(size_t)0xffff) &&
-        (req / n_elements != elem_size))
-      req = MAX_SIZE_T; /* force downstream failure on overflow */
-  }
-  mem = dlmalloc(req);
-  if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
-    memset(mem, 0, req);
-  return mem;
-}
-
-void* dlrealloc(void* oldmem, size_t bytes) {
-  if (oldmem == 0)
-    return dlmalloc(bytes);
-#ifdef REALLOC_ZERO_BYTES_FREES
-  if (bytes == 0) {
-    dlfree(oldmem);
-    return 0;
-  }
-#endif /* REALLOC_ZERO_BYTES_FREES */
-  else {
-#if ! FOOTERS
-    mstate m = gm;
-#else /* FOOTERS */
-    mstate m = get_mstate_for(mem2chunk(oldmem));
-    if (!ok_magic(m)) {
-      USAGE_ERROR_ACTION(m, oldmem);
-      return 0;
-    }
-#endif /* FOOTERS */
-    return internal_realloc(m, oldmem, bytes);
-  }
-}
-
-void* dlmemalign(size_t alignment, size_t bytes) {
-  return internal_memalign(gm, alignment, bytes);
-}
-
-void** dlindependent_calloc(size_t n_elements, size_t elem_size,
-                                 void* chunks[]) {
-  size_t sz = elem_size; /* serves as 1-element array */
-  return ialloc(gm, n_elements, &sz, 3, chunks);
-}
-
-void** dlindependent_comalloc(size_t n_elements, size_t sizes[],
-                                   void* chunks[]) {
-  return ialloc(gm, n_elements, sizes, 0, chunks);
-}
-
-void* dlvalloc(size_t bytes) {
-  size_t pagesz;
-  init_mparams();
-  pagesz = mparams.page_size;
-  return dlmemalign(pagesz, bytes);
-}
-
-void* dlpvalloc(size_t bytes) {
-  size_t pagesz;
-  init_mparams();
-  pagesz = mparams.page_size;
-  return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE));
-}
-
-int dlmalloc_trim(size_t pad) {
-  int result = 0;
-  if (!PREACTION(gm)) {
-    result = sys_trim(gm, pad);
-    POSTACTION(gm);
-  }
-  return result;
-}
-
-size_t dlmalloc_footprint(void) {
-  return gm->footprint;
-}
-
-size_t dlmalloc_max_footprint(void) {
-  return gm->max_footprint;
-}
-
-#if !NO_MALLINFO
-struct mallinfo dlmallinfo(void) {
-  return internal_mallinfo(gm);
-}
-#endif /* NO_MALLINFO */
-
-void dlmalloc_stats() {
-  internal_malloc_stats(gm);
-}
-
-size_t dlmalloc_usable_size(void* mem) {
-  if (mem != 0) {
-    mchunkptr p = mem2chunk(mem);
-    if (cinuse(p))
-      return chunksize(p) - overhead_for(p);
-  }
-  return 0;
-}
-
-int dlmallopt(int param_number, int value) {
-  return change_mparam(param_number, value);
-}
-
-#endif /* !ONLY_MSPACES */
-
-/* ----------------------------- user mspaces ---------------------------- */
-
-#if MSPACES
-
-static mstate init_user_mstate(char* tbase, size_t tsize) {
-  size_t msize = pad_request(sizeof(struct malloc_state));
-  mchunkptr mn;
-  mchunkptr msp = align_as_chunk(tbase);
-  mstate m = (mstate)(chunk2mem(msp));
-  memset(m, 0, msize);
-  INITIAL_LOCK(&m->mutex);
-  msp->head = (msize|PINUSE_BIT|CINUSE_BIT);
-  m->seg.base = m->least_addr = tbase;
-  m->seg.size = m->footprint = m->max_footprint = tsize;
-  m->magic = mparams.magic;
-  m->mflags = mparams.default_mflags;
-  disable_contiguous(m);
-  init_bins(m);
-  mn = next_chunk(mem2chunk(m));
-  init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE);
-  check_top_chunk(m, m->top);
-  return m;
-}
-
-mspace create_mspace(size_t capacity, int locked) {
-  mstate m = 0;
-  size_t msize = pad_request(sizeof(struct malloc_state));
-  init_mparams(); /* Ensure pagesize etc initialized */
-
-  if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
-    size_t rs = ((capacity == 0)? mparams.granularity :
-                 (capacity + TOP_FOOT_SIZE + msize));
-    size_t tsize = granularity_align(rs);
-    char* tbase = (char*)(CALL_MMAP(tsize));
-    if (tbase != CMFAIL) {
-      m = init_user_mstate(tbase, tsize);
-      set_segment_flags(&m->seg, IS_MMAPPED_BIT);
-      set_lock(m, locked);
-    }
-  }
-  return (mspace)m;
-}
-
-mspace create_mspace_with_base(void* base, size_t capacity, int locked) {
-  mstate m = 0;
-  size_t msize = pad_request(sizeof(struct malloc_state));
-  init_mparams(); /* Ensure pagesize etc initialized */
-
-  if (capacity > msize + TOP_FOOT_SIZE &&
-      capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
-    m = init_user_mstate((char*)base, capacity);
-    set_segment_flags(&m->seg, EXTERN_BIT);
-    set_lock(m, locked);
-  }
-  return (mspace)m;
-}
-
-size_t destroy_mspace(mspace msp) {
-  size_t freed = 0;
-  mstate ms = (mstate)msp;
-  if (ok_magic(ms)) {
-    msegmentptr sp = &ms->seg;
-    while (sp != 0) {
-      char* base = sp->base;
-      size_t size = sp->size;
-      flag_t flag = get_segment_flags(sp);
-      sp = sp->next;
-      if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) &&
-          CALL_MUNMAP(base, size) == 0)
-        freed += size;
-    }
-  }
-  else {
-    USAGE_ERROR_ACTION(ms,ms);
-  }
-  return freed;
-}
-
-/*
-  mspace versions of routines are near-clones of the global
-  versions. This is not so nice but better than the alternatives.
-*/
-
-
-void* mspace_malloc(mspace msp, size_t bytes) {
-  mstate ms = (mstate)msp;
-  if (!ok_magic(ms)) {
-    USAGE_ERROR_ACTION(ms,ms);
-    return 0;
-  }
-  if (!PREACTION(ms)) {
-    void* mem;
-    size_t nb;
-    if (bytes <= MAX_SMALL_REQUEST) {
-      bindex_t idx;
-      binmap_t smallbits;
-      nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
-      idx = small_index(nb);
-      smallbits = ms->smallmap >> idx;
-
-      if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
-        mchunkptr b, p;
-        idx += ~smallbits & 1;       /* Uses next bin if idx empty */
-        b = smallbin_at(ms, idx);
-        p = b->fd;
-        assert(chunksize(p) == small_index2size(idx));
-        unlink_first_small_chunk(ms, b, p, idx);
-        set_inuse_and_pinuse(ms, p, small_index2size(idx));
-        mem = chunk2mem(p);
-        check_malloced_chunk(ms, mem, nb);
-        goto postaction;
-      }
-
-      else if (nb > ms->dvsize) {
-        if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
-          mchunkptr b, p, r;
-          size_t rsize;
-          bindex_t i;
-          binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
-          binmap_t leastbit = least_bit(leftbits);
-          compute_bit2idx(leastbit, i);
-          b = smallbin_at(ms, i);
-          p = b->fd;
-          assert(chunksize(p) == small_index2size(i));
-          unlink_first_small_chunk(ms, b, p, i);
-          rsize = small_index2size(i) - nb;
-          /* Fit here cannot be remainderless if 4byte sizes */
-          if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
-            set_inuse_and_pinuse(ms, p, small_index2size(i));
-          else {
-            set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
-            r = chunk_plus_offset(p, nb);
-            set_size_and_pinuse_of_free_chunk(r, rsize);
-            replace_dv(ms, r, rsize);
-          }
-          mem = chunk2mem(p);
-          check_malloced_chunk(ms, mem, nb);
-          goto postaction;
-        }
-
-        else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) {
-          check_malloced_chunk(ms, mem, nb);
-          goto postaction;
-        }
-      }
-    }
-    else if (bytes >= MAX_REQUEST)
-      nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
-    else {
-      nb = pad_request(bytes);
-      if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) {
-        check_malloced_chunk(ms, mem, nb);
-        goto postaction;
-      }
-    }
-
-    if (nb <= ms->dvsize) {
-      size_t rsize = ms->dvsize - nb;
-      mchunkptr p = ms->dv;
-      if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
-        mchunkptr r = ms->dv = chunk_plus_offset(p, nb);
-        ms->dvsize = rsize;
-        set_size_and_pinuse_of_free_chunk(r, rsize);
-        set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
-      }
-      else { /* exhaust dv */
-        size_t dvs = ms->dvsize;
-        ms->dvsize = 0;
-        ms->dv = 0;
-        set_inuse_and_pinuse(ms, p, dvs);
-      }
-      mem = chunk2mem(p);
-      check_malloced_chunk(ms, mem, nb);
-      goto postaction;
-    }
-
-    else if (nb < ms->topsize) { /* Split top */
-      size_t rsize = ms->topsize -= nb;
-      mchunkptr p = ms->top;
-      mchunkptr r = ms->top = chunk_plus_offset(p, nb);
-      r->head = rsize | PINUSE_BIT;
-      set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
-      mem = chunk2mem(p);
-      check_top_chunk(ms, ms->top);
-      check_malloced_chunk(ms, mem, nb);
-      goto postaction;
-    }
-
-    mem = sys_alloc(ms, nb);
-
-  postaction:
-    POSTACTION(ms);
-    return mem;
-  }
-
-  return 0;
-}
-
-void mspace_free(mspace msp, void* mem) {
-  if (mem != 0) {
-    mchunkptr p  = mem2chunk(mem);
-#if FOOTERS
-    mstate fm = get_mstate_for(p);
-#else /* FOOTERS */
-    mstate fm = (mstate)msp;
-#endif /* FOOTERS */
-    if (!ok_magic(fm)) {
-      USAGE_ERROR_ACTION(fm, p);
-      return;
-    }
-    if (!PREACTION(fm)) {
-      check_inuse_chunk(fm, p);
-      if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) {
-        size_t psize = chunksize(p);
-        mchunkptr next = chunk_plus_offset(p, psize);
-        if (!pinuse(p)) {
-          size_t prevsize = p->prev_foot;
-          if ((prevsize & IS_MMAPPED_BIT) != 0) {
-            prevsize &= ~IS_MMAPPED_BIT;
-            psize += prevsize + MMAP_FOOT_PAD;
-            if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
-              fm->footprint -= psize;
-            goto postaction;
-          }
-          else {
-            mchunkptr prev = chunk_minus_offset(p, prevsize);
-            psize += prevsize;
-            p = prev;
-            if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
-              if (p != fm->dv) {
-                unlink_chunk(fm, p, prevsize);
-              }
-              else if ((next->head & INUSE_BITS) == INUSE_BITS) {
-                fm->dvsize = psize;
-                set_free_with_pinuse(p, psize, next);
-                goto postaction;
-              }
-            }
-            else
-              goto erroraction;
-          }
-        }
-
-        if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
-          if (!cinuse(next)) {  /* consolidate forward */
-            if (next == fm->top) {
-              size_t tsize = fm->topsize += psize;
-              fm->top = p;
-              p->head = tsize | PINUSE_BIT;
-              if (p == fm->dv) {
-                fm->dv = 0;
-                fm->dvsize = 0;
-              }
-              if (should_trim(fm, tsize))
-                sys_trim(fm, 0);
-              goto postaction;
-            }
-            else if (next == fm->dv) {
-              size_t dsize = fm->dvsize += psize;
-              fm->dv = p;
-              set_size_and_pinuse_of_free_chunk(p, dsize);
-              goto postaction;
-            }
-            else {
-              size_t nsize = chunksize(next);
-              psize += nsize;
-              unlink_chunk(fm, next, nsize);
-              set_size_and_pinuse_of_free_chunk(p, psize);
-              if (p == fm->dv) {
-                fm->dvsize = psize;
-                goto postaction;
-              }
-            }
-          }
-          else
-            set_free_with_pinuse(p, psize, next);
-          insert_chunk(fm, p, psize);
-          check_free_chunk(fm, p);
-          goto postaction;
-        }
-      }
-    erroraction:
-      USAGE_ERROR_ACTION(fm, p);
-    postaction:
-      POSTACTION(fm);
-    }
-  }
-}
-
-void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) {
-  void* mem;
-  size_t req = 0;
-  mstate ms = (mstate)msp;
-  if (!ok_magic(ms)) {
-    USAGE_ERROR_ACTION(ms,ms);
-    return 0;
-  }
-  if (n_elements != 0) {
-    req = n_elements * elem_size;
-    if (((n_elements | elem_size) & ~(size_t)0xffff) &&
-        (req / n_elements != elem_size))
-      req = MAX_SIZE_T; /* force downstream failure on overflow */
-  }
-  mem = internal_malloc(ms, req);
-  if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
-    memset(mem, 0, req);
-  return mem;
-}
-
-void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) {
-  if (oldmem == 0)
-    return mspace_malloc(msp, bytes);
-#ifdef REALLOC_ZERO_BYTES_FREES
-  if (bytes == 0) {
-    mspace_free(msp, oldmem);
-    return 0;
-  }
-#endif /* REALLOC_ZERO_BYTES_FREES */
-  else {
-#if FOOTERS
-    mchunkptr p  = mem2chunk(oldmem);
-    mstate ms = get_mstate_for(p);
-#else /* FOOTERS */
-    mstate ms = (mstate)msp;
-#endif /* FOOTERS */
-    if (!ok_magic(ms)) {
-      USAGE_ERROR_ACTION(ms,ms);
-      return 0;
-    }
-    return internal_realloc(ms, oldmem, bytes);
-  }
-}
-
-void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) {
-  mstate ms = (mstate)msp;
-  if (!ok_magic(ms)) {
-    USAGE_ERROR_ACTION(ms,ms);
-    return 0;
-  }
-  return internal_memalign(ms, alignment, bytes);
-}
-
-void** mspace_independent_calloc(mspace msp, size_t n_elements,
-                                 size_t elem_size, void* chunks[]) {
-  size_t sz = elem_size; /* serves as 1-element array */
-  mstate ms = (mstate)msp;
-  if (!ok_magic(ms)) {
-    USAGE_ERROR_ACTION(ms,ms);
-    return 0;
-  }
-  return ialloc(ms, n_elements, &sz, 3, chunks);
-}
-
-void** mspace_independent_comalloc(mspace msp, size_t n_elements,
-                                   size_t sizes[], void* chunks[]) {
-  mstate ms = (mstate)msp;
-  if (!ok_magic(ms)) {
-    USAGE_ERROR_ACTION(ms,ms);
-    return 0;
-  }
-  return ialloc(ms, n_elements, sizes, 0, chunks);
-}
-
-int mspace_trim(mspace msp, size_t pad) {
-  int result = 0;
-  mstate ms = (mstate)msp;
-  if (ok_magic(ms)) {
-    if (!PREACTION(ms)) {
-      result = sys_trim(ms, pad);
-      POSTACTION(ms);
-    }
-  }
-  else {
-    USAGE_ERROR_ACTION(ms,ms);
-  }
-  return result;
-}
-
-void mspace_malloc_stats(mspace msp) {
-  mstate ms = (mstate)msp;
-  if (ok_magic(ms)) {
-    internal_malloc_stats(ms);
-  }
-  else {
-    USAGE_ERROR_ACTION(ms,ms);
-  }
-}
-
-size_t mspace_footprint(mspace msp) {
-  size_t result;
-  mstate ms = (mstate)msp;
-  if (ok_magic(ms)) {
-    result = ms->footprint;
-  }
-  USAGE_ERROR_ACTION(ms,ms);
-  return result;
-}
-
-
-size_t mspace_max_footprint(mspace msp) {
-  size_t result;
-  mstate ms = (mstate)msp;
-  if (ok_magic(ms)) {
-    result = ms->max_footprint;
-  }
-  USAGE_ERROR_ACTION(ms,ms);
-  return result;
-}
-
-
-#if !NO_MALLINFO
-struct mallinfo mspace_mallinfo(mspace msp) {
-  mstate ms = (mstate)msp;
-  if (!ok_magic(ms)) {
-    USAGE_ERROR_ACTION(ms,ms);
-  }
-  return internal_mallinfo(ms);
-}
-#endif /* NO_MALLINFO */
-
-int mspace_mallopt(int param_number, int value) {
-  return change_mparam(param_number, value);
-}
-
-#endif /* MSPACES */
-
-/* -------------------- Alternative MORECORE functions ------------------- */
-
-/*
-  Guidelines for creating a custom version of MORECORE:
-
-  * For best performance, MORECORE should allocate in multiples of pagesize.
-  * MORECORE may allocate more memory than requested. (Or even less,
-      but this will usually result in a malloc failure.)
-  * MORECORE must not allocate memory when given argument zero, but
-      instead return one past the end address of memory from previous
-      nonzero call.
-  * For best performance, consecutive calls to MORECORE with positive
-      arguments should return increasing addresses, indicating that
-      space has been contiguously extended.
-  * Even though consecutive calls to MORECORE need not return contiguous
-      addresses, it must be OK for malloc'ed chunks to span multiple
-      regions in those cases where they do happen to be contiguous.
-  * MORECORE need not handle negative arguments -- it may instead
-      just return MFAIL when given negative arguments.
-      Negative arguments are always multiples of pagesize. MORECORE
-      must not misinterpret negative args as large positive unsigned
-      args. You can suppress all such calls from even occurring by defining
-      MORECORE_CANNOT_TRIM,
-
-  As an example alternative MORECORE, here is a custom allocator
-  kindly contributed for pre-OSX macOS.  It uses virtually but not
-  necessarily physically contiguous non-paged memory (locked in,
-  present and won't get swapped out).  You can use it by uncommenting
-  this section, adding some #includes, and setting up the appropriate
-  defines above:
-
-      #define MORECORE osMoreCore
-
-  There is also a shutdown routine that should somehow be called for
-  cleanup upon program exit.
-
-  #define MAX_POOL_ENTRIES 100
-  #define MINIMUM_MORECORE_SIZE  (64 * 1024U)
-  static int next_os_pool;
-  void *our_os_pools[MAX_POOL_ENTRIES];
-
-  void *osMoreCore(int size)
-  {
-    void *ptr = 0;
-    static void *sbrk_top = 0;
-
-    if (size > 0)
-    {
-      if (size < MINIMUM_MORECORE_SIZE)
-         size = MINIMUM_MORECORE_SIZE;
-      if (CurrentExecutionLevel() == kTaskLevel)
-         ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
-      if (ptr == 0)
-      {
-        return (void *) MFAIL;
-      }
-      // save ptrs so they can be freed during cleanup
-      our_os_pools[next_os_pool] = ptr;
-      next_os_pool++;
-      ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
-      sbrk_top = (char *) ptr + size;
-      return ptr;
-    }
-    else if (size < 0)
-    {
-      // we don't currently support shrink behavior
-      return (void *) MFAIL;
-    }
-    else
-    {
-      return sbrk_top;
-    }
-  }
-
-  // cleanup any allocated memory pools
-  // called as last thing before shutting down driver
-
-  void osCleanupMem(void)
-  {
-    void **ptr;
-
-    for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
-      if (*ptr)
-      {
-         PoolDeallocate(*ptr);
-         *ptr = 0;
-      }
-  }
-
-*/
-
-
-/* -----------------------------------------------------------------------
-History:
-    V2.8.3 Thu Sep 22 11:16:32 2005  Doug Lea  (dl at gee)
-      * Add max_footprint functions
-      * Ensure all appropriate literals are size_t
-      * Fix conditional compilation problem for some #define settings
-      * Avoid concatenating segments with the one provided
-        in create_mspace_with_base
-      * Rename some variables to avoid compiler shadowing warnings
-      * Use explicit lock initialization.
-      * Better handling of sbrk interference.
-      * Simplify and fix segment insertion, trimming and mspace_destroy
-      * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x
-      * Thanks especially to Dennis Flanagan for help on these.
-
-    V2.8.2 Sun Jun 12 16:01:10 2005  Doug Lea  (dl at gee)
-      * Fix memalign brace error.
-
-    V2.8.1 Wed Jun  8 16:11:46 2005  Doug Lea  (dl at gee)
-      * Fix improper #endif nesting in C++
-      * Add explicit casts needed for C++
-
-    V2.8.0 Mon May 30 14:09:02 2005  Doug Lea  (dl at gee)
-      * Use trees for large bins
-      * Support mspaces
-      * Use segments to unify sbrk-based and mmap-based system allocation,
-        removing need for emulation on most platforms without sbrk.
-      * Default safety checks
-      * Optional footer checks. Thanks to William Robertson for the idea.
-      * Internal code refactoring
-      * Incorporate suggestions and platform-specific changes.
-        Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas,
-        Aaron Bachmann,  Emery Berger, and others.
-      * Speed up non-fastbin processing enough to remove fastbins.
-      * Remove useless cfree() to avoid conflicts with other apps.
-      * Remove internal memcpy, memset. Compilers handle builtins better.
-      * Remove some options that no one ever used and rename others.
-
-    V2.7.2 Sat Aug 17 09:07:30 2002  Doug Lea  (dl at gee)
-      * Fix malloc_state bitmap array misdeclaration
-
-    V2.7.1 Thu Jul 25 10:58:03 2002  Doug Lea  (dl at gee)
-      * Allow tuning of FIRST_SORTED_BIN_SIZE
-      * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte.
-      * Better detection and support for non-contiguousness of MORECORE.
-        Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger
-      * Bypass most of malloc if no frees. Thanks To Emery Berger.
-      * Fix freeing of old top non-contiguous chunk im sysmalloc.
-      * Raised default trim and map thresholds to 256K.
-      * Fix mmap-related #defines. Thanks to Lubos Lunak.
-      * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield.
-      * Branch-free bin calculation
-      * Default trim and mmap thresholds now 256K.
-
-    V2.7.0 Sun Mar 11 14:14:06 2001  Doug Lea  (dl at gee)
-      * Introduce independent_comalloc and independent_calloc.
-        Thanks to Michael Pachos for motivation and help.
-      * Make optional .h file available
-      * Allow > 2GB requests on 32bit systems.
-      * new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>.
-        Thanks also to Andreas Mueller <a.mueller at paradatec.de>,
-        and Anonymous.
-      * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for
-        helping test this.)
-      * memalign: check alignment arg
-      * realloc: don't try to shift chunks backwards, since this
-        leads to  more fragmentation in some programs and doesn't
-        seem to help in any others.
-      * Collect all cases in malloc requiring system memory into sysmalloc
-      * Use mmap as backup to sbrk
-      * Place all internal state in malloc_state
-      * Introduce fastbins (although similar to 2.5.1)
-      * Many minor tunings and cosmetic improvements
-      * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK
-      * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS
-        Thanks to Tony E. Bennett <tbennett@nvidia.com> and others.
-      * Include errno.h to support default failure action.
-
-    V2.6.6 Sun Dec  5 07:42:19 1999  Doug Lea  (dl at gee)
-      * return null for negative arguments
-      * Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com>
-         * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
-          (e.g. WIN32 platforms)
-         * Cleanup header file inclusion for WIN32 platforms
-         * Cleanup code to avoid Microsoft Visual C++ compiler complaints
-         * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
-           memory allocation routines
-         * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
-         * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
-           usage of 'assert' in non-WIN32 code
-         * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
-           avoid infinite loop
-      * Always call 'fREe()' rather than 'free()'
-
-    V2.6.5 Wed Jun 17 15:57:31 1998  Doug Lea  (dl at gee)
-      * Fixed ordering problem with boundary-stamping
-
-    V2.6.3 Sun May 19 08:17:58 1996  Doug Lea  (dl at gee)
-      * Added pvalloc, as recommended by H.J. Liu
-      * Added 64bit pointer support mainly from Wolfram Gloger
-      * Added anonymously donated WIN32 sbrk emulation
-      * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen
-      * malloc_extend_top: fix mask error that caused wastage after
-        foreign sbrks
-      * Add linux mremap support code from HJ Liu
-
-    V2.6.2 Tue Dec  5 06:52:55 1995  Doug Lea  (dl at gee)
-      * Integrated most documentation with the code.
-      * Add support for mmap, with help from
-        Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
-      * Use last_remainder in more cases.
-      * Pack bins using idea from  colin@nyx10.cs.du.edu
-      * Use ordered bins instead of best-fit threshold
-      * Eliminate block-local decls to simplify tracing and debugging.
-      * Support another case of realloc via move into top
-      * Fix error occurring when initial sbrk_base not word-aligned.
-      * Rely on page size for units instead of SBRK_UNIT to
-        avoid surprises about sbrk alignment conventions.
-      * Add mallinfo, mallopt. Thanks to Raymond Nijssen
-        (raymond@es.ele.tue.nl) for the suggestion.
-      * Add `pad' argument to malloc_trim and top_pad mallopt parameter.
-      * More precautions for cases where other routines call sbrk,
-        courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
-      * Added macros etc., allowing use in linux libc from
-        H.J. Lu (hjl@gnu.ai.mit.edu)
-      * Inverted this history list
-
-    V2.6.1 Sat Dec  2 14:10:57 1995  Doug Lea  (dl at gee)
-      * Re-tuned and fixed to behave more nicely with V2.6.0 changes.
-      * Removed all preallocation code since under current scheme
-        the work required to undo bad preallocations exceeds
-        the work saved in good cases for most test programs.
-      * No longer use return list or unconsolidated bins since
-        no scheme using them consistently outperforms those that don't
-        given above changes.
-      * Use best fit for very large chunks to prevent some worst-cases.
-      * Added some support for debugging
-
-    V2.6.0 Sat Nov  4 07:05:23 1995  Doug Lea  (dl at gee)
-      * Removed footers when chunks are in use. Thanks to
-        Paul Wilson (wilson@cs.texas.edu) for the suggestion.
-
-    V2.5.4 Wed Nov  1 07:54:51 1995  Doug Lea  (dl at gee)
-      * Added malloc_trim, with help from Wolfram Gloger
-        (wmglo@Dent.MED.Uni-Muenchen.DE).
-
-    V2.5.3 Tue Apr 26 10:16:01 1994  Doug Lea  (dl at g)
-
-    V2.5.2 Tue Apr  5 16:20:40 1994  Doug Lea  (dl at g)
-      * realloc: try to expand in both directions
-      * malloc: swap order of clean-bin strategy;
-      * realloc: only conditionally expand backwards
-      * Try not to scavenge used bins
-      * Use bin counts as a guide to preallocation
-      * Occasionally bin return list chunks in first scan
-      * Add a few optimizations from colin@nyx10.cs.du.edu
-
-    V2.5.1 Sat Aug 14 15:40:43 1993  Doug Lea  (dl at g)
-      * faster bin computation & slightly different binning
-      * merged all consolidations to one part of malloc proper
-         (eliminating old malloc_find_space & malloc_clean_bin)
-      * Scan 2 returns chunks (not just 1)
-      * Propagate failure in realloc if malloc returns 0
-      * Add stuff to allow compilation on non-ANSI compilers
-          from kpv@research.att.com
-
-    V2.5 Sat Aug  7 07:41:59 1993  Doug Lea  (dl at g.oswego.edu)
-      * removed potential for odd address access in prev_chunk
-      * removed dependency on getpagesize.h
-      * misc cosmetics and a bit more internal documentation
-      * anticosmetics: mangled names in macros to evade debugger strangeness
-      * tested on sparc, hp-700, dec-mips, rs6000
-          with gcc & native cc (hp, dec only) allowing
-          Detlefs & Zorn comparison study (in SIGPLAN Notices.)
-
-    Trial version Fri Aug 28 13:14:29 1992  Doug Lea  (dl at g.oswego.edu)
-      * Based loosely on libg++-1.2X malloc. (It retains some of the overall
-         structure of old version,  but most details differ.)
- 
-*/
diff --git a/third_party/gofrontend/libffi/src/frv/eabi.S b/third_party/gofrontend/libffi/src/frv/eabi.S
deleted file mode 100644
index 379ea4b..0000000
--- a/third_party/gofrontend/libffi/src/frv/eabi.S
+++ /dev/null
@@ -1,128 +0,0 @@
-/* -----------------------------------------------------------------------
-   eabi.S - Copyright (c) 2004  Anthony Green
-   
-   FR-V Assembly glue.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-
-	.globl ffi_prep_args_EABI
-
-	.text
-	.p2align 4
-	.globl ffi_call_EABI
-	.type ffi_call_EABI, @function
-
-	# gr8 :   ffi_prep_args
-	# gr9 :   &ecif
-	# gr10:   cif->bytes
-	# gr11:   fig->flags
-	# gr12:   ecif.rvalue
-	# gr13:   fn
-	
-ffi_call_EABI:	
-	addi	sp, #-80, sp
-	sti	fp, @(sp, #24)
-	addi	sp, #24, fp
-	movsg	lr, gr5
-
-	/* Make room for the new arguments.  */
-	/* subi	sp, fp, gr10 */
-	
-	/* Store return address and incoming args on stack.  */
-	sti	gr5, @(fp, #8)
-	sti	gr8, @(fp, #-4)
-	sti	gr9, @(fp, #-8)
-	sti	gr10, @(fp, #-12)
-	sti	gr11, @(fp, #-16)
-	sti	gr12, @(fp, #-20)
-	sti	gr13, @(fp, #-24)
-
-	sub     sp, gr10, sp
-	
-	/* Call ffi_prep_args.  */
-	ldi	@(fp, #-4), gr4
-	addi	sp, #0, gr8
-	ldi	@(fp, #-8), gr9
-#ifdef __FRV_FDPIC__
-	ldd	@(gr4, gr0), gr14
-	calll	@(gr14, gr0)
-#else
-	calll	@(gr4, gr0)
-#endif	
-
-	/* ffi_prep_args returns the new stack pointer.  */
-	mov	gr8, gr4
-		
-	ldi	@(sp, #0), gr8
-	ldi	@(sp, #4), gr9
-	ldi	@(sp, #8), gr10
-	ldi	@(sp, #12), gr11
-	ldi	@(sp, #16), gr12
-	ldi	@(sp, #20), gr13
-
-	/* Always copy the return value pointer into the hidden
-	   parameter register.  This is only strictly necessary
-	   when we're returning an aggregate type, but it doesn't
-	   hurt to do this all the time, and it saves a branch.  */
-	ldi	@(fp, #-20), gr3
-
-	/* Use the ffi_prep_args return value for the new sp.  */
-	mov	gr4, sp
-	
-	/* Call the target function.  */
-	ldi	@(fp, -24), gr4
-#ifdef __FRV_FDPIC__
-	ldd	@(gr4, gr0), gr14
-	calll	@(gr14, gr0)
-#else
-	calll	@(gr4, gr0)
-#endif	
-
-	/* Store the result. */
-	ldi	@(fp, #-16), gr10  /* fig->flags */
-	ldi	@(fp, #-20), gr4   /* ecif.rvalue */
-
-	/* Is the return value stored in two registers?  */
-	cmpi	gr10, #8, icc0
-	bne	icc0, 0, .L2
-	/*   Yes, save them.  */
-	sti	gr8, @(gr4, #0)
-	sti	gr9, @(gr4, #4)
-	bra	.L3
-.L2:
-	/* Is the return value a structure?  */
-	cmpi	gr10, #-1, icc0
-	beq	icc0, 0, .L3
-	/*   No, save a 4 byte return value.  */
-	sti	gr8, @(gr4, #0)
-.L3:	
-
-	/* Restore the stack, and return.  */
-	ldi	@(fp, 8), gr5
-	ld	@(fp, gr0), fp
-	addi	sp,#80,sp
-	jmpl	@(gr5,gr0)
-	.size ffi_call_EABI, .-ffi_call_EABI
-	
diff --git a/third_party/gofrontend/libffi/src/frv/ffi.c b/third_party/gofrontend/libffi/src/frv/ffi.c
deleted file mode 100644
index 5698c89..0000000
--- a/third_party/gofrontend/libffi/src/frv/ffi.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (C) 2004  Anthony Green
-   Copyright (C) 2007  Free Software Foundation, Inc.
-	   Copyright (C) 2008  Red Hat, Inc.
-   
-   FR-V Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-
-/* ffi_prep_args is called by the assembly routine once stack space
-   has been allocated for the function's arguments */
-
-void *ffi_prep_args(char *stack, extended_cif *ecif)
-{
-  register unsigned int i;
-  register void **p_argv;
-  register char *argp;
-  register ffi_type **p_arg;
-  register int count = 0;
-
-  p_argv = ecif->avalue;
-  argp = stack;
-
-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
-       (i != 0);
-       i--, p_arg++)
-    {
-      size_t z;
-      
-      z = (*p_arg)->size;
-
-      if ((*p_arg)->type == FFI_TYPE_STRUCT)
-	{
-	  z = sizeof(void*);
-	  *(void **) argp = *p_argv;
-	} 
-      /*      if ((*p_arg)->type == FFI_TYPE_FLOAT)
-	{
-	  if (count > 24)
-	    {
-	      // This is going on the stack.  Turn it into a double.  
-	      *(double *) argp = (double) *(float*)(* p_argv);
-	      z = sizeof(double);
-	    }
-	  else
-	    *(void **) argp = *(void **)(* p_argv);
-	}  */
-      else if (z < sizeof(int))
-	{
-	  z = sizeof(int);
-	  switch ((*p_arg)->type)
-	    {
-	    case FFI_TYPE_SINT8:
-	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
-	      break;
-	      
-	    case FFI_TYPE_UINT8:
-	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
-	      break;
-	      
-	    case FFI_TYPE_SINT16:
-	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
-	      break;
-		  
-	    case FFI_TYPE_UINT16:
-	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
-	      break;
-		  
-	    default:
-	      FFI_ASSERT(0);
-	    }
-	}
-      else if (z == sizeof(int))
-	{
-	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
-	}
-      else
-	{
-	  memcpy(argp, *p_argv, z);
-	}
-      p_argv++;
-      argp += z;
-      count += z;
-    }
-
-  return (stack + ((count > 24) ? 24 : ALIGN_DOWN(count, 8)));
-}
-
-/* Perform machine dependent cif processing */
-ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  if (cif->rtype->type == FFI_TYPE_STRUCT)
-    cif->flags = -1;
-  else
-    cif->flags = cif->rtype->size;
-
-  cif->bytes = ALIGN (cif->bytes, 8);
-
-  return FFI_OK;
-}
-
-extern void ffi_call_EABI(void *(*)(char *, extended_cif *), 
-			  extended_cif *, 
-			  unsigned, unsigned, 
-			  unsigned *, 
-			  void (*fn)(void));
-
-void ffi_call(ffi_cif *cif, 
-	      void (*fn)(void), 
-	      void *rvalue, 
-	      void **avalue)
-{
-  extended_cif ecif;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-  
-  /* If the return value is a struct and we don't have a return	*/
-  /* value address then we need to make one		        */
-
-  if ((rvalue == NULL) && 
-      (cif->rtype->type == FFI_TYPE_STRUCT))
-    {
-      ecif.rvalue = alloca(cif->rtype->size);
-    }
-  else
-    ecif.rvalue = rvalue;
-    
-  
-  switch (cif->abi) 
-    {
-    case FFI_EABI:
-      ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, 
-		    cif->flags, ecif.rvalue, fn);
-      break;
-    default:
-      FFI_ASSERT(0);
-      break;
-    }
-}
-
-void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3,
-		       unsigned arg4, unsigned arg5, unsigned arg6)
-{
-  /* This function is called by a trampoline.  The trampoline stows a
-     pointer to the ffi_closure object in gr7.  We must save this
-     pointer in a place that will persist while we do our work.  */
-  register ffi_closure *creg __asm__ ("gr7");
-  ffi_closure *closure = creg;
-
-  /* Arguments that don't fit in registers are found on the stack
-     at a fixed offset above the current frame pointer.  */
-  register char *frame_pointer __asm__ ("fp");
-  char *stack_args = frame_pointer + 16;
-
-  /* Lay the register arguments down in a continuous chunk of memory.  */
-  unsigned register_args[6] =
-    { arg1, arg2, arg3, arg4, arg5, arg6 };
-
-  ffi_cif *cif = closure->cif;
-  ffi_type **arg_types = cif->arg_types;
-  void **avalue = alloca (cif->nargs * sizeof(void *));
-  char *ptr = (char *) register_args;
-  int i;
-
-  /* Find the address of each argument.  */
-  for (i = 0; i < cif->nargs; i++)
-    {
-      switch (arg_types[i]->type)
-	{
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT8:
-	  avalue[i] = ptr + 3;
-	  break;
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT16:
-	  avalue[i] = ptr + 2;
-	  break;
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_FLOAT:
-	  avalue[i] = ptr;
-	  break;
-	case FFI_TYPE_STRUCT:
-	  avalue[i] = *(void**)ptr;
-	  break;
-	default:
-	  /* This is an 8-byte value.  */
-	  avalue[i] = ptr;
-	  ptr += 4;
-	  break;
-	}
-      ptr += 4;
-
-      /* If we've handled more arguments than fit in registers,
-	 start looking at the those passed on the stack.  */
-      if (ptr == ((char *)register_args + (6*4)))
-	ptr = stack_args;
-    }
-
-  /* Invoke the closure.  */
-  if (cif->rtype->type == FFI_TYPE_STRUCT)
-    {
-      /* The caller allocates space for the return structure, and
-       passes a pointer to this space in gr3.  Use this value directly
-       as the return value.  */
-      register void *return_struct_ptr __asm__("gr3");
-      (closure->fun) (cif, return_struct_ptr, avalue, closure->user_data);
-    }
-  else
-    {
-      /* Allocate space for the return value and call the function.  */
-      long long rvalue;
-      (closure->fun) (cif, &rvalue, avalue, closure->user_data);
-
-      /* Functions return 4-byte or smaller results in gr8.  8-byte
-	 values also use gr9.  We fill the both, even for small return
-	 values, just to avoid a branch.  */ 
-      asm ("ldi  @(%0, #0), gr8" : : "r" (&rvalue));
-      asm ("ldi  @(%0, #0), gr9" : : "r" (&((int *) &rvalue)[1]));
-    }
-}
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun)(ffi_cif*, void*, void**, void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  unsigned int *tramp = (unsigned int *) &closure->tramp[0];
-  unsigned long fn = (long) ffi_closure_eabi;
-  unsigned long cls = (long) codeloc;
-#ifdef __FRV_FDPIC__
-  register void *got __asm__("gr15");
-#endif
-  int i;
-
-  fn = (unsigned long) ffi_closure_eabi;
-
-#ifdef __FRV_FDPIC__
-  tramp[0] = &((unsigned int *)codeloc)[2];
-  tramp[1] = got;
-  tramp[2] = 0x8cfc0000 + (fn  & 0xffff); /* setlos lo(fn), gr6    */
-  tramp[3] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7   */
-  tramp[4] = 0x8cf80000 + (fn  >> 16);	  /* sethi hi(fn), gr6     */
-  tramp[5] = 0x8ef80000 + (cls >> 16);    /* sethi hi(cls), gr7    */
-  tramp[6] = 0x9cc86000;                  /* ldi @(gr6, #0), gr14  */
-  tramp[7] = 0x8030e000;                  /* jmpl @(gr14, gr0)     */
-#else
-  tramp[0] = 0x8cfc0000 + (fn  & 0xffff); /* setlos lo(fn), gr6    */
-  tramp[1] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7   */
-  tramp[2] = 0x8cf80000 + (fn  >> 16);	  /* sethi hi(fn), gr6     */
-  tramp[3] = 0x8ef80000 + (cls >> 16);    /* sethi hi(cls), gr7    */
-  tramp[4] = 0x80300006;                  /* jmpl @(gr0, gr6)      */
-#endif
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  /* Cache flushing.  */
-  for (i = 0; i < FFI_TRAMPOLINE_SIZE; i++)
-    __asm__ volatile ("dcf @(%0,%1)\n\tici @(%2,%1)" :: "r" (tramp), "r" (i),
-		      "r" (codeloc));
-
-  return FFI_OK;
-}
diff --git a/third_party/gofrontend/libffi/src/frv/ffitarget.h b/third_party/gofrontend/libffi/src/frv/ffitarget.h
deleted file mode 100644
index d42540e..0000000
--- a/third_party/gofrontend/libffi/src/frv/ffitarget.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 1996-2004  Red Hat, Inc.
-   Target configuration macros for FR-V
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-/* ---- System specific configurations ----------------------------------- */
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_EABI,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_EABI
-} ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_NATIVE_RAW_API 0
-
-#ifdef __FRV_FDPIC__
-/* Trampolines are 8 4-byte instructions long.  */
-#define FFI_TRAMPOLINE_SIZE (8*4)
-#else
-/* Trampolines are 5 4-byte instructions long.  */
-#define FFI_TRAMPOLINE_SIZE (5*4)
-#endif
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/ia64/ffi.c b/third_party/gofrontend/libffi/src/ia64/ffi.c
deleted file mode 100644
index b77a836..0000000
--- a/third_party/gofrontend/libffi/src/ia64/ffi.c
+++ /dev/null
@@ -1,586 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 1998, 2007, 2008, 2012 Red Hat, Inc.
-	   Copyright (c) 2000 Hewlett Packard Company
-	   Copyright (c) 2011 Anthony Green
-   
-   IA64 Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-#include <stdbool.h>
-#include <float.h>
-
-#include "ia64_flags.h"
-
-/* A 64-bit pointer value.  In LP64 mode, this is effectively a plain
-   pointer.  In ILP32 mode, it's a pointer that's been extended to 
-   64 bits by "addp4".  */
-typedef void *PTR64 __attribute__((mode(DI)));
-
-/* Memory image of fp register contents.  This is the implementation
-   specific format used by ldf.fill/stf.spill.  All we care about is
-   that it wants a 16 byte aligned slot.  */
-typedef struct
-{
-  UINT64 x[2] __attribute__((aligned(16)));
-} fpreg;
-
-
-/* The stack layout given to ffi_call_unix and ffi_closure_unix_inner.  */
-
-struct ia64_args
-{
-  fpreg fp_regs[8];	/* Contents of 8 fp arg registers.  */
-  UINT64 gp_regs[8];	/* Contents of 8 gp arg registers.  */
-  UINT64 other_args[];	/* Arguments passed on stack, variable size.  */
-};
-
-
-/* Adjust ADDR, a pointer to an 8 byte slot, to point to the low LEN bytes.  */
-
-static inline void *
-endian_adjust (void *addr, size_t len)
-{
-#ifdef __BIG_ENDIAN__
-  return addr + (8 - len);
-#else
-  return addr;
-#endif
-}
-
-/* Store VALUE to ADDR in the current cpu implementation's fp spill format.
-   This is a macro instead of a function, so that it works for all 3 floating
-   point types without type conversions.  Type conversion to long double breaks
-   the denorm support.  */
-
-#define stf_spill(addr, value)	\
-  asm ("stf.spill %0 = %1%P0" : "=m" (*addr) : "f"(value));
-
-/* Load a value from ADDR, which is in the current cpu implementation's
-   fp spill format.  As above, this must also be a macro.  */
-
-#define ldf_fill(result, addr)	\
-  asm ("ldf.fill %0 = %1%P1" : "=f"(result) : "m"(*addr));
-
-/* Return the size of the C type associated with with TYPE.  Which will
-   be one of the FFI_IA64_TYPE_HFA_* values.  */
-
-static size_t
-hfa_type_size (int type)
-{
-  switch (type)
-    {
-    case FFI_IA64_TYPE_HFA_FLOAT:
-      return sizeof(float);
-    case FFI_IA64_TYPE_HFA_DOUBLE:
-      return sizeof(double);
-    case FFI_IA64_TYPE_HFA_LDOUBLE:
-      return sizeof(__float80);
-    default:
-      abort ();
-    }
-}
-
-/* Load from ADDR a value indicated by TYPE.  Which will be one of
-   the FFI_IA64_TYPE_HFA_* values.  */
-
-static void
-hfa_type_load (fpreg *fpaddr, int type, void *addr)
-{
-  switch (type)
-    {
-    case FFI_IA64_TYPE_HFA_FLOAT:
-      stf_spill (fpaddr, *(float *) addr);
-      return;
-    case FFI_IA64_TYPE_HFA_DOUBLE:
-      stf_spill (fpaddr, *(double *) addr);
-      return;
-    case FFI_IA64_TYPE_HFA_LDOUBLE:
-      stf_spill (fpaddr, *(__float80 *) addr);
-      return;
-    default:
-      abort ();
-    }
-}
-
-/* Load VALUE into ADDR as indicated by TYPE.  Which will be one of
-   the FFI_IA64_TYPE_HFA_* values.  */
-
-static void
-hfa_type_store (int type, void *addr, fpreg *fpaddr)
-{
-  switch (type)
-    {
-    case FFI_IA64_TYPE_HFA_FLOAT:
-      {
-	float result;
-	ldf_fill (result, fpaddr);
-	*(float *) addr = result;
-	break;
-      }
-    case FFI_IA64_TYPE_HFA_DOUBLE:
-      {
-	double result;
-	ldf_fill (result, fpaddr);
-	*(double *) addr = result;
-	break;
-      }
-    case FFI_IA64_TYPE_HFA_LDOUBLE:
-      {
-	__float80 result;
-	ldf_fill (result, fpaddr);
-	*(__float80 *) addr = result;
-	break;
-      }
-    default:
-      abort ();
-    }
-}
-
-/* Is TYPE a struct containing floats, doubles, or extended doubles,
-   all of the same fp type?  If so, return the element type.  Return
-   FFI_TYPE_VOID if not.  */
-
-static int
-hfa_element_type (ffi_type *type, int nested)
-{
-  int element = FFI_TYPE_VOID;
-
-  switch (type->type)
-    {
-    case FFI_TYPE_FLOAT:
-      /* We want to return VOID for raw floating-point types, but the
-	 synthetic HFA type if we're nested within an aggregate.  */
-      if (nested)
-	element = FFI_IA64_TYPE_HFA_FLOAT;
-      break;
-
-    case FFI_TYPE_DOUBLE:
-      /* Similarly.  */
-      if (nested)
-	element = FFI_IA64_TYPE_HFA_DOUBLE;
-      break;
-
-    case FFI_TYPE_LONGDOUBLE:
-      /* Similarly, except that that HFA is true for double extended,
-	 but not quad precision.  Both have sizeof == 16, so tell the
-	 difference based on the precision.  */
-      if (LDBL_MANT_DIG == 64 && nested)
-	element = FFI_IA64_TYPE_HFA_LDOUBLE;
-      break;
-
-    case FFI_TYPE_STRUCT:
-      {
-	ffi_type **ptr = &type->elements[0];
-
-	for (ptr = &type->elements[0]; *ptr ; ptr++)
-	  {
-	    int sub_element = hfa_element_type (*ptr, 1);
-	    if (sub_element == FFI_TYPE_VOID)
-	      return FFI_TYPE_VOID;
-
-	    if (element == FFI_TYPE_VOID)
-	      element = sub_element;
-	    else if (element != sub_element)
-	      return FFI_TYPE_VOID;
-	  }
-      }
-      break;
-
-    default:
-      return FFI_TYPE_VOID;
-    }
-
-  return element;
-}
-
-
-/* Perform machine dependent cif processing. */
-
-ffi_status
-ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  int flags;
-
-  /* Adjust cif->bytes to include space for the bits of the ia64_args frame
-     that precedes the integer register portion.  The estimate that the
-     generic bits did for the argument space required is good enough for the
-     integer component.  */
-  cif->bytes += offsetof(struct ia64_args, gp_regs[0]);
-  if (cif->bytes < sizeof(struct ia64_args))
-    cif->bytes = sizeof(struct ia64_args);
-
-  /* Set the return type flag. */
-  flags = cif->rtype->type;
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_LONGDOUBLE:
-      /* Leave FFI_TYPE_LONGDOUBLE as meaning double extended precision,
-	 and encode quad precision as a two-word integer structure.  */
-      if (LDBL_MANT_DIG != 64)
-	flags = FFI_IA64_TYPE_SMALL_STRUCT | (16 << 8);
-      break;
-
-    case FFI_TYPE_STRUCT:
-      {
-        size_t size = cif->rtype->size;
-  	int hfa_type = hfa_element_type (cif->rtype, 0);
-
-	if (hfa_type != FFI_TYPE_VOID)
-	  {
-	    size_t nelts = size / hfa_type_size (hfa_type);
-	    if (nelts <= 8)
-	      flags = hfa_type | (size << 8);
-	  }
-	else
-	  {
-	    if (size <= 32)
-	      flags = FFI_IA64_TYPE_SMALL_STRUCT | (size << 8);
-	  }
-      }
-      break;
-
-    default:
-      break;
-    }
-  cif->flags = flags;
-
-  return FFI_OK;
-}
-
-extern int ffi_call_unix (struct ia64_args *, PTR64, void (*)(void), UINT64);
-
-void
-ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  struct ia64_args *stack;
-  long i, avn, gpcount, fpcount;
-  ffi_type **p_arg;
-
-  FFI_ASSERT (cif->abi == FFI_UNIX);
-
-  /* If we have no spot for a return value, make one.  */
-  if (rvalue == NULL && cif->rtype->type != FFI_TYPE_VOID)
-    rvalue = alloca (cif->rtype->size);
-    
-  /* Allocate the stack frame.  */
-  stack = alloca (cif->bytes);
-
-  gpcount = fpcount = 0;
-  avn = cif->nargs;
-  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
-    {
-      switch ((*p_arg)->type)
-	{
-	case FFI_TYPE_SINT8:
-	  stack->gp_regs[gpcount++] = *(SINT8 *)avalue[i];
-	  break;
-	case FFI_TYPE_UINT8:
-	  stack->gp_regs[gpcount++] = *(UINT8 *)avalue[i];
-	  break;
-	case FFI_TYPE_SINT16:
-	  stack->gp_regs[gpcount++] = *(SINT16 *)avalue[i];
-	  break;
-	case FFI_TYPE_UINT16:
-	  stack->gp_regs[gpcount++] = *(UINT16 *)avalue[i];
-	  break;
-	case FFI_TYPE_SINT32:
-	  stack->gp_regs[gpcount++] = *(SINT32 *)avalue[i];
-	  break;
-	case FFI_TYPE_UINT32:
-	  stack->gp_regs[gpcount++] = *(UINT32 *)avalue[i];
-	  break;
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_UINT64:
-	  stack->gp_regs[gpcount++] = *(UINT64 *)avalue[i];
-	  break;
-
-	case FFI_TYPE_POINTER:
-	  stack->gp_regs[gpcount++] = (UINT64)(PTR64) *(void **)avalue[i];
-	  break;
-
-	case FFI_TYPE_FLOAT:
-	  if (gpcount < 8 && fpcount < 8)
-	    stf_spill (&stack->fp_regs[fpcount++], *(float *)avalue[i]);
-	  {
-	    UINT32 tmp;
-	    memcpy (&tmp, avalue[i], sizeof (UINT32));
-	    stack->gp_regs[gpcount++] = tmp;
-	  }
-	  break;
-
-	case FFI_TYPE_DOUBLE:
-	  if (gpcount < 8 && fpcount < 8)
-	    stf_spill (&stack->fp_regs[fpcount++], *(double *)avalue[i]);
-	  memcpy (&stack->gp_regs[gpcount++], avalue[i], sizeof (UINT64));
-	  break;
-
-	case FFI_TYPE_LONGDOUBLE:
-	  if (gpcount & 1)
-	    gpcount++;
-	  if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8)
-	    stf_spill (&stack->fp_regs[fpcount++], *(__float80 *)avalue[i]);
-	  memcpy (&stack->gp_regs[gpcount], avalue[i], 16);
-	  gpcount += 2;
-	  break;
-
-	case FFI_TYPE_STRUCT:
-	  {
-	    size_t size = (*p_arg)->size;
-	    size_t align = (*p_arg)->alignment;
-	    int hfa_type = hfa_element_type (*p_arg, 0);
-
-	    FFI_ASSERT (align <= 16);
-	    if (align == 16 && (gpcount & 1))
-	      gpcount++;
-
-	    if (hfa_type != FFI_TYPE_VOID)
-	      {
-		size_t hfa_size = hfa_type_size (hfa_type);
-		size_t offset = 0;
-		size_t gp_offset = gpcount * 8;
-
-		while (fpcount < 8
-		       && offset < size
-		       && gp_offset < 8 * 8)
-		  {
-		    hfa_type_load (&stack->fp_regs[fpcount], hfa_type,
-				   avalue[i] + offset);
-		    offset += hfa_size;
-		    gp_offset += hfa_size;
-		    fpcount += 1;
-		  }
-	      }
-
-	    memcpy (&stack->gp_regs[gpcount], avalue[i], size);
-	    gpcount += (size + 7) / 8;
-	  }
-	  break;
-
-	default:
-	  abort ();
-	}
-    }
-
-  ffi_call_unix (stack, rvalue, fn, cif->flags);
-}
-
-/* Closures represent a pair consisting of a function pointer, and
-   some user data.  A closure is invoked by reinterpreting the closure
-   as a function pointer, and branching to it.  Thus we can make an
-   interpreted function callable as a C function: We turn the
-   interpreter itself, together with a pointer specifying the
-   interpreted procedure, into a closure.
-
-   For IA64, function pointer are already pairs consisting of a code
-   pointer, and a gp pointer.  The latter is needed to access global
-   variables.  Here we set up such a pair as the first two words of
-   the closure (in the "trampoline" area), but we replace the gp
-   pointer with a pointer to the closure itself.  We also add the real
-   gp pointer to the closure.  This allows the function entry code to
-   both retrieve the user data, and to restore the correct gp pointer.  */
-
-extern void ffi_closure_unix ();
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun)(ffi_cif*,void*,void**,void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  /* The layout of a function descriptor.  A C function pointer really 
-     points to one of these.  */
-  struct ia64_fd
-  {
-    UINT64 code_pointer;
-    UINT64 gp;
-  };
-
-  struct ffi_ia64_trampoline_struct
-  {
-    UINT64 code_pointer;	/* Pointer to ffi_closure_unix.  */
-    UINT64 fake_gp;		/* Pointer to closure, installed as gp.  */
-    UINT64 real_gp;		/* Real gp value.  */
-  };
-
-  struct ffi_ia64_trampoline_struct *tramp;
-  struct ia64_fd *fd;
-
-  if (cif->abi != FFI_UNIX)
-    return FFI_BAD_ABI;
-
-  tramp = (struct ffi_ia64_trampoline_struct *)closure->tramp;
-  fd = (struct ia64_fd *)(void *)ffi_closure_unix;
-
-  tramp->code_pointer = fd->code_pointer;
-  tramp->real_gp = fd->gp;
-  tramp->fake_gp = (UINT64)(PTR64)codeloc;
-  closure->cif = cif;
-  closure->user_data = user_data;
-  closure->fun = fun;
-
-  return FFI_OK;
-}
-
-
-UINT64
-ffi_closure_unix_inner (ffi_closure *closure, struct ia64_args *stack,
-			void *rvalue, void *r8)
-{
-  ffi_cif *cif;
-  void **avalue;
-  ffi_type **p_arg;
-  long i, avn, gpcount, fpcount;
-
-  cif = closure->cif;
-  avn = cif->nargs;
-  avalue = alloca (avn * sizeof (void *));
-
-  /* If the structure return value is passed in memory get that location
-     from r8 so as to pass the value directly back to the caller.  */
-  if (cif->flags == FFI_TYPE_STRUCT)
-    rvalue = r8;
-
-  gpcount = fpcount = 0;
-  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
-    {
-      switch ((*p_arg)->type)
-	{
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT8:
-	  avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 1);
-	  break;
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT16:
-	  avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 2);
-	  break;
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT32:
-	  avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 4);
-	  break;
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_UINT64:
-	  avalue[i] = &stack->gp_regs[gpcount++];
-	  break;
-	case FFI_TYPE_POINTER:
-	  avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], sizeof(void*));
-	  break;
-
-	case FFI_TYPE_FLOAT:
-	  if (gpcount < 8 && fpcount < 8)
-	    {
-	      fpreg *addr = &stack->fp_regs[fpcount++];
-	      float result;
-	      avalue[i] = addr;
-	      ldf_fill (result, addr);
-	      *(float *)addr = result;
-	    }
-	  else
-	    avalue[i] = endian_adjust(&stack->gp_regs[gpcount], 4);
-	  gpcount++;
-	  break;
-
-	case FFI_TYPE_DOUBLE:
-	  if (gpcount < 8 && fpcount < 8)
-	    {
-	      fpreg *addr = &stack->fp_regs[fpcount++];
-	      double result;
-	      avalue[i] = addr;
-	      ldf_fill (result, addr);
-	      *(double *)addr = result;
-	    }
-	  else
-	    avalue[i] = &stack->gp_regs[gpcount];
-	  gpcount++;
-	  break;
-
-	case FFI_TYPE_LONGDOUBLE:
-	  if (gpcount & 1)
-	    gpcount++;
-	  if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8)
-	    {
-	      fpreg *addr = &stack->fp_regs[fpcount++];
-	      __float80 result;
-	      avalue[i] = addr;
-	      ldf_fill (result, addr);
-	      *(__float80 *)addr = result;
-	    }
-	  else
-	    avalue[i] = &stack->gp_regs[gpcount];
-	  gpcount += 2;
-	  break;
-
-	case FFI_TYPE_STRUCT:
-	  {
-	    size_t size = (*p_arg)->size;
-	    size_t align = (*p_arg)->alignment;
-	    int hfa_type = hfa_element_type (*p_arg, 0);
-
-	    FFI_ASSERT (align <= 16);
-	    if (align == 16 && (gpcount & 1))
-	      gpcount++;
-
-	    if (hfa_type != FFI_TYPE_VOID)
-	      {
-		size_t hfa_size = hfa_type_size (hfa_type);
-		size_t offset = 0;
-		size_t gp_offset = gpcount * 8;
-		void *addr = alloca (size);
-
-		avalue[i] = addr;
-
-		while (fpcount < 8
-		       && offset < size
-		       && gp_offset < 8 * 8)
-		  {
-		    hfa_type_store (hfa_type, addr + offset,
-				    &stack->fp_regs[fpcount]);
-		    offset += hfa_size;
-		    gp_offset += hfa_size;
-		    fpcount += 1;
-		  }
-
-		if (offset < size)
-		  memcpy (addr + offset, (char *)stack->gp_regs + gp_offset,
-			  size - offset);
-	      }
-	    else
-	      avalue[i] = &stack->gp_regs[gpcount];
-
-	    gpcount += (size + 7) / 8;
-	  }
-	  break;
-
-	default:
-	  abort ();
-	}
-    }
-
-  closure->fun (cif, rvalue, avalue, closure->user_data);
-
-  return cif->flags;
-}
diff --git a/third_party/gofrontend/libffi/src/ia64/ffitarget.h b/third_party/gofrontend/libffi/src/ia64/ffitarget.h
deleted file mode 100644
index e68cea6..0000000
--- a/third_party/gofrontend/libffi/src/ia64/ffitarget.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 1996-2003  Red Hat, Inc.
-   Target configuration macros for IA-64.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#ifndef LIBFFI_ASM
-typedef unsigned long long          ffi_arg;
-typedef signed long long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_UNIX,   	/* Linux and all Unix variants use the same conventions	*/
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_UNIX
-} ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_TRAMPOLINE_SIZE 24  /* Really the following struct, which 	*/
-				/* can be interpreted as a C function	*/
-				/* descriptor:				*/
-
-#endif
-
diff --git a/third_party/gofrontend/libffi/src/ia64/ia64_flags.h b/third_party/gofrontend/libffi/src/ia64/ia64_flags.h
deleted file mode 100644
index 9d652ce..0000000
--- a/third_party/gofrontend/libffi/src/ia64/ia64_flags.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -----------------------------------------------------------------------
-   ia64_flags.h - Copyright (c) 2000 Hewlett Packard Company
-   
-   IA64/unix Foreign Function Interface 
-
-   Original author: Hans Boehm, HP Labs
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-/* "Type" codes used between assembly and C.  When used as a part of
-   a cfi->flags value, the low byte will be these extra type codes,
-   and bits 8-31 will be the actual size of the type.  */
-
-/* Small structures containing N words in integer registers.  */
-#define FFI_IA64_TYPE_SMALL_STRUCT	(FFI_TYPE_LAST + 1)
-
-/* Homogeneous Floating Point Aggregates (HFAs) which are returned
-   in FP registers.  */
-#define FFI_IA64_TYPE_HFA_FLOAT		(FFI_TYPE_LAST + 2)
-#define FFI_IA64_TYPE_HFA_DOUBLE	(FFI_TYPE_LAST + 3)
-#define FFI_IA64_TYPE_HFA_LDOUBLE	(FFI_TYPE_LAST + 4)
diff --git a/third_party/gofrontend/libffi/src/ia64/unix.S b/third_party/gofrontend/libffi/src/ia64/unix.S
deleted file mode 100644
index 4d2a86d..0000000
--- a/third_party/gofrontend/libffi/src/ia64/unix.S
+++ /dev/null
@@ -1,560 +0,0 @@
-/* -----------------------------------------------------------------------
-   unix.S - Copyright (c) 1998, 2008 Red Hat, Inc.
-            Copyright (c) 2000 Hewlett Packard Company
-   
-   IA64/unix Foreign Function Interface 
-
-   Primary author: Hans Boehm, HP Labs
-
-   Loosely modeled on Cygnus code for other platforms.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-#include "ia64_flags.h"
-
-	.pred.safe_across_calls p1-p5,p16-p63
-.text
-
-/* int ffi_call_unix (struct ia64_args *stack, PTR64 rvalue,
-		      void (*fn)(void), int flags);
- */
-
-        .align 16
-        .global	ffi_call_unix
-        .proc	ffi_call_unix
-ffi_call_unix:
-	.prologue
-	/* Bit o trickiness.  We actually share a stack frame with ffi_call.
-	   Rely on the fact that ffi_call uses a vframe and don't bother
-	   tracking one here at all.  */
-	.fframe	0
-	.save	ar.pfs, r36 // loc0
-	alloc   loc0 = ar.pfs, 4, 3, 8, 0
-	.save	rp, loc1
-	mov 	loc1 = b0
-	.body
-	add	r16 = 16, in0
-	mov	loc2 = gp
-	mov	r8 = in1
-	;;
-
-	/* Load up all of the argument registers.  */
-	ldf.fill f8 = [in0], 32
-	ldf.fill f9 = [r16], 32
-	;;
-	ldf.fill f10 = [in0], 32
-	ldf.fill f11 = [r16], 32
-	;;
-	ldf.fill f12 = [in0], 32
-	ldf.fill f13 = [r16], 32
-	;;
-	ldf.fill f14 = [in0], 32
-	ldf.fill f15 = [r16], 24
-	;;
-	ld8	out0 = [in0], 16
-	ld8	out1 = [r16], 16
-	;;
-	ld8	out2 = [in0], 16
-	ld8	out3 = [r16], 16
-	;;
-	ld8	out4 = [in0], 16
-	ld8	out5 = [r16], 16
-	;;
-	ld8	out6 = [in0]
-	ld8	out7 = [r16]
-	;;
-
-	/* Deallocate the register save area from the stack frame.  */
-	mov	sp = in0
-
-	/* Call the target function.  */
-	ld8	r16 = [in2], 8
-	;;
-	ld8	gp = [in2]
-	mov	b6 = r16
-	br.call.sptk.many b0 = b6
-	;;
-
-	/* Dispatch to handle return value.  */
-	mov	gp = loc2
-	zxt1	r16 = in3
-	;;
-	mov	ar.pfs = loc0
-	addl	r18 = @ltoffx(.Lst_table), gp
-	;;
-	ld8.mov	r18 = [r18], .Lst_table
-	mov	b0 = loc1
-	;;
-	shladd	r18 = r16, 3, r18
-	;;
-	ld8	r17 = [r18]
-	shr	in3 = in3, 8
-	;;
-	add	r17 = r17, r18
-	;;
-	mov	b6 = r17
-	br	b6
-	;;
-
-.Lst_void:
-	br.ret.sptk.many b0
-	;;
-.Lst_uint8:
-	zxt1	r8 = r8
-	;;
-	st8	[in1] = r8
-	br.ret.sptk.many b0
-	;;
-.Lst_sint8:
-	sxt1	r8 = r8
-	;;
-	st8	[in1] = r8
-	br.ret.sptk.many b0
-	;;
-.Lst_uint16:
-	zxt2	r8 = r8
-	;;
-	st8	[in1] = r8
-	br.ret.sptk.many b0
-	;;
-.Lst_sint16:
-	sxt2	r8 = r8
-	;;
-	st8	[in1] = r8
-	br.ret.sptk.many b0
-	;;
-.Lst_uint32:
-	zxt4	r8 = r8
-	;;
-	st8	[in1] = r8
-	br.ret.sptk.many b0
-	;;
-.Lst_sint32:
-	sxt4	r8 = r8
-	;;
-	st8	[in1] = r8
-	br.ret.sptk.many b0
-	;;
-.Lst_int64:
-	st8	[in1] = r8
-	br.ret.sptk.many b0
-	;;
-.Lst_float:
-	stfs	[in1] = f8
-	br.ret.sptk.many b0
-	;;
-.Lst_double:
-	stfd	[in1] = f8
-	br.ret.sptk.many b0
-	;;
-.Lst_ldouble:
-	stfe	[in1] = f8
-	br.ret.sptk.many b0
-	;;
-
-.Lst_small_struct:
-	add	sp = -16, sp
-	cmp.lt	p6, p0 = 8, in3
-	cmp.lt	p7, p0 = 16, in3
-	cmp.lt	p8, p0 = 24, in3
-	;;
-	add	r16 = 8, sp
-	add	r17 = 16, sp
-	add	r18 = 24, sp
-	;;
-	st8	[sp] = r8
-(p6)	st8	[r16] = r9
-	mov	out0 = in1
-(p7)	st8	[r17] = r10
-(p8)	st8	[r18] = r11
-	mov	out1 = sp
-	mov	out2 = in3
-	br.call.sptk.many b0 = memcpy#
-	;;
-	mov	ar.pfs = loc0
-	mov	b0 = loc1
-	mov	gp = loc2
-	br.ret.sptk.many b0
-
-.Lst_hfa_float:
-	add	r16 = 4, in1
-	cmp.lt	p6, p0 = 4, in3
-	;;
-	stfs	[in1] = f8, 8
-(p6)	stfs	[r16] = f9, 8
-	cmp.lt	p7, p0 = 8, in3
-	cmp.lt	p8, p0 = 12, in3
-	;;
-(p7)	stfs	[in1] = f10, 8
-(p8)	stfs	[r16] = f11, 8
-	cmp.lt	p9, p0 = 16, in3
-	cmp.lt	p10, p0 = 20, in3
-	;;
-(p9)	stfs	[in1] = f12, 8
-(p10)	stfs	[r16] = f13, 8
-	cmp.lt	p6, p0 = 24, in3
-	cmp.lt	p7, p0 = 28, in3
-	;;
-(p6)	stfs	[in1] = f14
-(p7)	stfs	[r16] = f15
-	br.ret.sptk.many b0
-	;;
-
-.Lst_hfa_double:
-	add	r16 = 8, in1
-	cmp.lt	p6, p0 = 8, in3
-	;;
-	stfd	[in1] = f8, 16
-(p6)	stfd	[r16] = f9, 16
-	cmp.lt	p7, p0 = 16, in3
-	cmp.lt	p8, p0 = 24, in3
-	;;
-(p7)	stfd	[in1] = f10, 16
-(p8)	stfd	[r16] = f11, 16
-	cmp.lt	p9, p0 = 32, in3
-	cmp.lt	p10, p0 = 40, in3
-	;;
-(p9)	stfd	[in1] = f12, 16
-(p10)	stfd	[r16] = f13, 16
-	cmp.lt	p6, p0 = 48, in3
-	cmp.lt	p7, p0 = 56, in3
-	;;
-(p6)	stfd	[in1] = f14
-(p7)	stfd	[r16] = f15
-	br.ret.sptk.many b0
-	;;
-
-.Lst_hfa_ldouble:
-	add	r16 = 16, in1
-	cmp.lt	p6, p0 = 16, in3
-	;;
-	stfe	[in1] = f8, 32
-(p6)	stfe	[r16] = f9, 32
-	cmp.lt	p7, p0 = 32, in3
-	cmp.lt	p8, p0 = 48, in3
-	;;
-(p7)	stfe	[in1] = f10, 32
-(p8)	stfe	[r16] = f11, 32
-	cmp.lt	p9, p0 = 64, in3
-	cmp.lt	p10, p0 = 80, in3
-	;;
-(p9)	stfe	[in1] = f12, 32
-(p10)	stfe	[r16] = f13, 32
-	cmp.lt	p6, p0 = 96, in3
-	cmp.lt	p7, p0 = 112, in3
-	;;
-(p6)	stfe	[in1] = f14
-(p7)	stfe	[r16] = f15
-	br.ret.sptk.many b0
-	;;
-
-        .endp ffi_call_unix
-
-        .align 16
-        .global ffi_closure_unix
-        .proc ffi_closure_unix
-
-#define FRAME_SIZE	(8*16 + 8*8 + 8*16)
-
-ffi_closure_unix:
-	.prologue
-	.save	ar.pfs, r40 // loc0
-	alloc   loc0 = ar.pfs, 8, 4, 4, 0
-	.fframe	FRAME_SIZE
-	add	r12 = -FRAME_SIZE, r12
-	.save	rp, loc1
-	mov	loc1 = b0
-	.save	ar.unat, loc2
-	mov	loc2 = ar.unat
-	.body
-
-	/* Retrieve closure pointer and real gp.  */
-#ifdef _ILP32
-	addp4	out0 = 0, gp
-	addp4	gp = 16, gp
-#else
-	mov	out0 = gp
-	add	gp = 16, gp
-#endif
-	;;
-	ld8	gp = [gp]
-
-	/* Spill all of the possible argument registers.  */
-	add	r16 = 16 + 8*16, sp
-	add	r17 = 16 + 8*16 + 16, sp
-	;;
-	stf.spill [r16] = f8, 32
-	stf.spill [r17] = f9, 32
-	mov	loc3 = gp
-	;;
-	stf.spill [r16] = f10, 32
-	stf.spill [r17] = f11, 32
-	;;
-	stf.spill [r16] = f12, 32
-	stf.spill [r17] = f13, 32
-	;;
-	stf.spill [r16] = f14, 32
-	stf.spill [r17] = f15, 24
-	;;
-	.mem.offset 0, 0
-	st8.spill [r16] = in0, 16
-	.mem.offset 8, 0
-	st8.spill [r17] = in1, 16
-	add	out1 = 16 + 8*16, sp
-	;;
-	.mem.offset 0, 0
-	st8.spill [r16] = in2, 16
-	.mem.offset 8, 0
-	st8.spill [r17] = in3, 16
-	add	out2 = 16, sp
-	;;
-	.mem.offset 0, 0
-	st8.spill [r16] = in4, 16
-	.mem.offset 8, 0
-	st8.spill [r17] = in5, 16
-	mov	out3 = r8
-	;;
-	.mem.offset 0, 0
-	st8.spill [r16] = in6
-	.mem.offset 8, 0
-	st8.spill [r17] = in7
-
-	/* Invoke ffi_closure_unix_inner for the hard work.  */
-	br.call.sptk.many b0 = ffi_closure_unix_inner
-	;;
-
-	/* Dispatch to handle return value.  */
-	mov	gp = loc3
-	zxt1	r16 = r8
-	;;
-	addl	r18 = @ltoffx(.Lld_table), gp
-	mov	ar.pfs = loc0
-	;;
-	ld8.mov	r18 = [r18], .Lld_table
-	mov	b0 = loc1
-	;;
-	shladd	r18 = r16, 3, r18
-	mov	ar.unat = loc2
-	;;
-	ld8	r17 = [r18]
-	shr	r8 = r8, 8
-	;;
-	add	r17 = r17, r18
-	add	r16 = 16, sp
-	;;
-	mov	b6 = r17
-	br	b6
-	;;
-	.label_state 1
-
-.Lld_void:
-	.restore sp
-	add	sp = FRAME_SIZE, sp
-	br.ret.sptk.many b0
-	;;
-.Lld_int:
-	.body
-	.copy_state 1
-	ld8	r8 = [r16]
-	.restore sp
-	add	sp = FRAME_SIZE, sp
-	br.ret.sptk.many b0
-	;;
-.Lld_float:
-	.body
-	.copy_state 1
-	ldfs	f8 = [r16]
-	.restore sp
-	add	sp = FRAME_SIZE, sp
-	br.ret.sptk.many b0
-	;;
-.Lld_double:
-	.body
-	.copy_state 1
-	ldfd	f8 = [r16]
-	.restore sp
-	add	sp = FRAME_SIZE, sp
-	br.ret.sptk.many b0
-	;;
-.Lld_ldouble:
-	.body
-	.copy_state 1
-	ldfe	f8 = [r16]
-	.restore sp
-	add	sp = FRAME_SIZE, sp
-	br.ret.sptk.many b0
-	;;
-
-.Lld_small_struct:
-	.body
-	.copy_state 1
-	add	r17 = 8, r16
-	cmp.lt	p6, p0 = 8, r8
-	cmp.lt	p7, p0 = 16, r8
-	cmp.lt	p8, p0 = 24, r8
-	;;
-	ld8	r8 = [r16], 16
-(p6)	ld8	r9 = [r17], 16
-	;;
-(p7)	ld8	r10 = [r16]
-(p8)	ld8	r11 = [r17]
-	.restore sp
-	add	sp = FRAME_SIZE, sp
-	br.ret.sptk.many b0
-	;;
-
-.Lld_hfa_float:
-	.body
-	.copy_state 1
-	add	r17 = 4, r16
-	cmp.lt	p6, p0 = 4, r8
-	;;
-	ldfs	f8 = [r16], 8
-(p6)	ldfs	f9 = [r17], 8
-	cmp.lt	p7, p0 = 8, r8
-	cmp.lt	p8, p0 = 12, r8
-	;;
-(p7)	ldfs	f10 = [r16], 8
-(p8)	ldfs	f11 = [r17], 8
-	cmp.lt	p9, p0 = 16, r8
-	cmp.lt	p10, p0 = 20, r8
-	;;
-(p9)	ldfs	f12 = [r16], 8
-(p10)	ldfs	f13 = [r17], 8
-	cmp.lt	p6, p0 = 24, r8
-	cmp.lt	p7, p0 = 28, r8
-	;;
-(p6)	ldfs	f14 = [r16]
-(p7)	ldfs	f15 = [r17]
-	.restore sp
-	add	sp = FRAME_SIZE, sp
-	br.ret.sptk.many b0
-	;;
-
-.Lld_hfa_double:
-	.body
-	.copy_state 1
-	add	r17 = 8, r16
-	cmp.lt	p6, p0 = 8, r8
-	;;
-	ldfd	f8 = [r16], 16
-(p6)	ldfd	f9 = [r17], 16
-	cmp.lt	p7, p0 = 16, r8
-	cmp.lt	p8, p0 = 24, r8
-	;;
-(p7)	ldfd	f10 = [r16], 16
-(p8)	ldfd	f11 = [r17], 16
-	cmp.lt	p9, p0 = 32, r8
-	cmp.lt	p10, p0 = 40, r8
-	;;
-(p9)	ldfd	f12 = [r16], 16
-(p10)	ldfd	f13 = [r17], 16
-	cmp.lt	p6, p0 = 48, r8
-	cmp.lt	p7, p0 = 56, r8
-	;;
-(p6)	ldfd	f14 = [r16]
-(p7)	ldfd	f15 = [r17]
-	.restore sp
-	add	sp = FRAME_SIZE, sp
-	br.ret.sptk.many b0
-	;;
-
-.Lld_hfa_ldouble:
-	.body
-	.copy_state 1
-	add	r17 = 16, r16
-	cmp.lt	p6, p0 = 16, r8
-	;;
-	ldfe	f8 = [r16], 32
-(p6)	ldfe	f9 = [r17], 32
-	cmp.lt	p7, p0 = 32, r8
-	cmp.lt	p8, p0 = 48, r8
-	;;
-(p7)	ldfe	f10 = [r16], 32
-(p8)	ldfe	f11 = [r17], 32
-	cmp.lt	p9, p0 = 64, r8
-	cmp.lt	p10, p0 = 80, r8
-	;;
-(p9)	ldfe	f12 = [r16], 32
-(p10)	ldfe	f13 = [r17], 32
-	cmp.lt	p6, p0 = 96, r8
-	cmp.lt	p7, p0 = 112, r8
-	;;
-(p6)	ldfe	f14 = [r16]
-(p7)	ldfe	f15 = [r17]
-	.restore sp
-	add	sp = FRAME_SIZE, sp
-	br.ret.sptk.many b0
-	;;
-
-	.endp	ffi_closure_unix
-
-	.section .rodata
-	.align	8
-.Lst_table:
-	data8	@pcrel(.Lst_void)		// FFI_TYPE_VOID
-	data8	@pcrel(.Lst_sint32)		// FFI_TYPE_INT
-	data8	@pcrel(.Lst_float)		// FFI_TYPE_FLOAT
-	data8	@pcrel(.Lst_double)		// FFI_TYPE_DOUBLE
-	data8	@pcrel(.Lst_ldouble)		// FFI_TYPE_LONGDOUBLE
-	data8	@pcrel(.Lst_uint8)		// FFI_TYPE_UINT8
-	data8	@pcrel(.Lst_sint8)		// FFI_TYPE_SINT8
-	data8	@pcrel(.Lst_uint16)		// FFI_TYPE_UINT16
-	data8	@pcrel(.Lst_sint16)		// FFI_TYPE_SINT16
-	data8	@pcrel(.Lst_uint32)		// FFI_TYPE_UINT32
-	data8	@pcrel(.Lst_sint32)		// FFI_TYPE_SINT32
-	data8	@pcrel(.Lst_int64)		// FFI_TYPE_UINT64
-	data8	@pcrel(.Lst_int64)		// FFI_TYPE_SINT64
-	data8	@pcrel(.Lst_void)		// FFI_TYPE_STRUCT
-	data8	@pcrel(.Lst_int64)		// FFI_TYPE_POINTER
-	data8 	@pcrel(.Lst_small_struct)	// FFI_IA64_TYPE_SMALL_STRUCT
-	data8	@pcrel(.Lst_hfa_float)		// FFI_IA64_TYPE_HFA_FLOAT
-	data8	@pcrel(.Lst_hfa_double)		// FFI_IA64_TYPE_HFA_DOUBLE
-	data8	@pcrel(.Lst_hfa_ldouble)	// FFI_IA64_TYPE_HFA_LDOUBLE
-
-.Lld_table:
-	data8	@pcrel(.Lld_void)		// FFI_TYPE_VOID
-	data8	@pcrel(.Lld_int)		// FFI_TYPE_INT
-	data8	@pcrel(.Lld_float)		// FFI_TYPE_FLOAT
-	data8	@pcrel(.Lld_double)		// FFI_TYPE_DOUBLE
-	data8	@pcrel(.Lld_ldouble)		// FFI_TYPE_LONGDOUBLE
-	data8	@pcrel(.Lld_int)		// FFI_TYPE_UINT8
-	data8	@pcrel(.Lld_int)		// FFI_TYPE_SINT8
-	data8	@pcrel(.Lld_int)		// FFI_TYPE_UINT16
-	data8	@pcrel(.Lld_int)		// FFI_TYPE_SINT16
-	data8	@pcrel(.Lld_int)		// FFI_TYPE_UINT32
-	data8	@pcrel(.Lld_int)		// FFI_TYPE_SINT32
-	data8	@pcrel(.Lld_int)		// FFI_TYPE_UINT64
-	data8	@pcrel(.Lld_int)		// FFI_TYPE_SINT64
-	data8	@pcrel(.Lld_void)		// FFI_TYPE_STRUCT
-	data8	@pcrel(.Lld_int)		// FFI_TYPE_POINTER
-	data8 	@pcrel(.Lld_small_struct)	// FFI_IA64_TYPE_SMALL_STRUCT
-	data8	@pcrel(.Lld_hfa_float)		// FFI_IA64_TYPE_HFA_FLOAT
-	data8	@pcrel(.Lld_hfa_double)		// FFI_IA64_TYPE_HFA_DOUBLE
-	data8	@pcrel(.Lld_hfa_ldouble)	// FFI_IA64_TYPE_HFA_LDOUBLE
-
-#if defined __ELF__ && defined __linux__
-	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/third_party/gofrontend/libffi/src/java_raw_api.c b/third_party/gofrontend/libffi/src/java_raw_api.c
deleted file mode 100644
index 127123d..0000000
--- a/third_party/gofrontend/libffi/src/java_raw_api.c
+++ /dev/null
@@ -1,374 +0,0 @@
-/* -----------------------------------------------------------------------
-   java_raw_api.c - Copyright (c) 1999, 2007, 2008  Red Hat, Inc.
-
-   Cloned from raw_api.c
-
-   Raw_api.c author: Kresten Krab Thorup <krab@gnu.org>
-   Java_raw_api.c author: Hans-J. Boehm <hboehm@hpl.hp.com>
-
-   $Id $
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-/* This defines a Java- and 64-bit specific variant of the raw API.	*/
-/* It assumes that "raw" argument blocks look like Java stacks on a	*/
-/* 64-bit machine.  Arguments that can be stored in a single stack	*/
-/* stack slots (longs, doubles) occupy 128 bits, but only the first	*/
-/* 64 bits are actually used.						*/
-
-#include <ffi.h>
-#include <ffi_common.h>
-#include <stdlib.h>
-
-#if !defined(NO_JAVA_RAW_API)
-
-size_t
-ffi_java_raw_size (ffi_cif *cif)
-{
-  size_t result = 0;
-  int i;
-
-  ffi_type **at = cif->arg_types;
-
-  for (i = cif->nargs-1; i >= 0; i--, at++)
-    {
-      switch((*at) -> type) {
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_DOUBLE:
-	  result += 2 * FFI_SIZEOF_JAVA_RAW;
-	  break;
-	case FFI_TYPE_STRUCT:
-	  /* No structure parameters in Java.	*/
-	  abort();
-	case FFI_TYPE_COMPLEX:
-	  /* Not supported yet.  */
-	  abort();
-	default:
-	  result += FFI_SIZEOF_JAVA_RAW;
-      }
-    }
-
-  return result;
-}
-
-
-void
-ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args)
-{
-  unsigned i;
-  ffi_type **tp = cif->arg_types;
-
-#if WORDS_BIGENDIAN
-
-  for (i = 0; i < cif->nargs; i++, tp++, args++)
-    {
-      switch ((*tp)->type)
-	{
-	case FFI_TYPE_UINT8:
-	case FFI_TYPE_SINT8:
-	  *args = (void*) ((char*)(raw++) + 3);
-	  break;
-
-	case FFI_TYPE_UINT16:
-	case FFI_TYPE_SINT16:
-	  *args = (void*) ((char*)(raw++) + 2);
-	  break;
-
-#if FFI_SIZEOF_JAVA_RAW == 8
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_DOUBLE:
-	  *args = (void *)raw;
-	  raw += 2;
-	  break;
-#endif
-
-	case FFI_TYPE_POINTER:
-	  *args = (void*) &(raw++)->ptr;
-	  break;
-
-	case FFI_TYPE_COMPLEX:
-	  /* Not supported yet.  */
-	  abort();
-
-	default:
-	  *args = raw;
-	  raw +=
-	    ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
-	}
-    }
-
-#else /* WORDS_BIGENDIAN */
-
-#if !PDP
-
-  /* then assume little endian */
-  for (i = 0; i < cif->nargs; i++, tp++, args++)
-    {
-#if FFI_SIZEOF_JAVA_RAW == 8
-      switch((*tp)->type) {
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_DOUBLE:
-	  *args = (void*) raw;
-	  raw += 2;
-	  break;
-	case FFI_TYPE_COMPLEX:
-	  /* Not supported yet.  */
-	  abort();
-	default:
-	  *args = (void*) raw++;
-      }
-#else /* FFI_SIZEOF_JAVA_RAW != 8 */
-	*args = (void*) raw;
-	raw +=
-	  ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
-#endif /* FFI_SIZEOF_JAVA_RAW == 8 */
-    }
-
-#else
-#error "pdp endian not supported"
-#endif /* ! PDP */
-
-#endif /* WORDS_BIGENDIAN */
-}
-
-void
-ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw)
-{
-  unsigned i;
-  ffi_type **tp = cif->arg_types;
-
-  for (i = 0; i < cif->nargs; i++, tp++, args++)
-    {
-      switch ((*tp)->type)
-	{
-	case FFI_TYPE_UINT8:
-#if WORDS_BIGENDIAN
-	  *(UINT32*)(raw++) = *(UINT8*) (*args);
-#else
-	  (raw++)->uint = *(UINT8*) (*args);
-#endif
-	  break;
-
-	case FFI_TYPE_SINT8:
-#if WORDS_BIGENDIAN
-	  *(SINT32*)(raw++) = *(SINT8*) (*args);
-#else
-	  (raw++)->sint = *(SINT8*) (*args);
-#endif
-	  break;
-
-	case FFI_TYPE_UINT16:
-#if WORDS_BIGENDIAN
-	  *(UINT32*)(raw++) = *(UINT16*) (*args);
-#else
-	  (raw++)->uint = *(UINT16*) (*args);
-#endif
-	  break;
-
-	case FFI_TYPE_SINT16:
-#if WORDS_BIGENDIAN
-	  *(SINT32*)(raw++) = *(SINT16*) (*args);
-#else
-	  (raw++)->sint = *(SINT16*) (*args);
-#endif
-	  break;
-
-	case FFI_TYPE_UINT32:
-#if WORDS_BIGENDIAN
-	  *(UINT32*)(raw++) = *(UINT32*) (*args);
-#else
-	  (raw++)->uint = *(UINT32*) (*args);
-#endif
-	  break;
-
-	case FFI_TYPE_SINT32:
-#if WORDS_BIGENDIAN
-	  *(SINT32*)(raw++) = *(SINT32*) (*args);
-#else
-	  (raw++)->sint = *(SINT32*) (*args);
-#endif
-	  break;
-
-	case FFI_TYPE_FLOAT:
-	  (raw++)->flt = *(FLOAT32*) (*args);
-	  break;
-
-#if FFI_SIZEOF_JAVA_RAW == 8
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_DOUBLE:
-	  raw->uint = *(UINT64*) (*args);
-	  raw += 2;
-	  break;
-#endif
-
-	case FFI_TYPE_POINTER:
-	  (raw++)->ptr = **(void***) args;
-	  break;
-
-	default:
-#if FFI_SIZEOF_JAVA_RAW == 8
-	  FFI_ASSERT(0);	/* Should have covered all cases */
-#else
-	  memcpy ((void*) raw->data, (void*)*args, (*tp)->size);
-	  raw +=
-	    ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
-#endif
-	}
-    }
-}
-
-#if !FFI_NATIVE_RAW_API
-
-static void
-ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue)
-{
-#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_UINT8:
-    case FFI_TYPE_UINT16:
-    case FFI_TYPE_UINT32:
-      *(UINT64 *)rvalue <<= 32;
-      break;
-
-    case FFI_TYPE_SINT8:
-    case FFI_TYPE_SINT16:
-    case FFI_TYPE_SINT32:
-    case FFI_TYPE_INT:
-#if FFI_SIZEOF_JAVA_RAW == 4
-    case FFI_TYPE_POINTER:
-#endif
-      *(SINT64 *)rvalue <<= 32;
-      break;
-
-    case FFI_TYPE_COMPLEX:
-      /* Not supported yet.  */
-      abort();
-
-    default:
-      break;
-    }
-#endif
-}
-
-static void
-ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue)
-{
-#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_UINT8:
-    case FFI_TYPE_UINT16:
-    case FFI_TYPE_UINT32:
-      *(UINT64 *)rvalue >>= 32;
-      break;
-
-    case FFI_TYPE_SINT8:
-    case FFI_TYPE_SINT16:
-    case FFI_TYPE_SINT32:
-    case FFI_TYPE_INT:
-      *(SINT64 *)rvalue >>= 32;
-      break;
-
-    case FFI_TYPE_COMPLEX:
-      /* Not supported yet.  */
-      abort();
-
-    default:
-      break;
-    }
-#endif
-}
-
-/* This is a generic definition of ffi_raw_call, to be used if the
- * native system does not provide a machine-specific implementation.
- * Having this, allows code to be written for the raw API, without
- * the need for system-specific code to handle input in that format;
- * these following couple of functions will handle the translation forth
- * and back automatically. */
-
-void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue,
-			ffi_java_raw *raw)
-{
-  void **avalue = (void**) alloca (cif->nargs * sizeof (void*));
-  ffi_java_raw_to_ptrarray (cif, raw, avalue);
-  ffi_call (cif, fn, rvalue, avalue);
-  ffi_java_rvalue_to_raw (cif, rvalue);
-}
-
-#if FFI_CLOSURES		/* base system provides closures */
-
-static void
-ffi_java_translate_args (ffi_cif *cif, void *rvalue,
-		    void **avalue, void *user_data)
-{
-  ffi_java_raw *raw = (ffi_java_raw*)alloca (ffi_java_raw_size (cif));
-  ffi_raw_closure *cl = (ffi_raw_closure*)user_data;
-
-  ffi_java_ptrarray_to_raw (cif, avalue, raw);
-  (*cl->fun) (cif, rvalue, (ffi_raw*)raw, cl->user_data);
-  ffi_java_raw_to_rvalue (cif, rvalue);
-}
-
-ffi_status
-ffi_prep_java_raw_closure_loc (ffi_java_raw_closure* cl,
-			       ffi_cif *cif,
-			       void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
-			       void *user_data,
-			       void *codeloc)
-{
-  ffi_status status;
-
-  status = ffi_prep_closure_loc ((ffi_closure*) cl,
-				 cif,
-				 &ffi_java_translate_args,
-				 codeloc,
-				 codeloc);
-  if (status == FFI_OK)
-    {
-      cl->fun       = fun;
-      cl->user_data = user_data;
-    }
-
-  return status;
-}
-
-/* Again, here is the generic version of ffi_prep_raw_closure, which
- * will install an intermediate "hub" for translation of arguments from
- * the pointer-array format, to the raw format */
-
-ffi_status
-ffi_prep_java_raw_closure (ffi_java_raw_closure* cl,
-			   ffi_cif *cif,
-			   void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
-			   void *user_data)
-{
-  return ffi_prep_java_raw_closure_loc (cl, cif, fun, user_data, cl);
-}
-
-#endif /* FFI_CLOSURES */
-#endif /* !FFI_NATIVE_RAW_API */
-#endif /* !NO_JAVA_RAW_API */
diff --git a/third_party/gofrontend/libffi/src/m32r/ffi.c b/third_party/gofrontend/libffi/src/m32r/ffi.c
deleted file mode 100644
index 3000063..0000000
--- a/third_party/gofrontend/libffi/src/m32r/ffi.c
+++ /dev/null
@@ -1,232 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2004  Renesas Technology
-           Copyright (c) 2008  Red Hat, Inc.
-   
-   M32R Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-
-/* ffi_prep_args is called by the assembly routine once stack
-   space has been allocated for the function's arguments.  */
-
-void ffi_prep_args(char *stack, extended_cif *ecif)
-{
-  unsigned int i;
-  int tmp;
-  unsigned int avn;
-  void **p_argv;
-  char *argp;
-  ffi_type **p_arg;
-
-  tmp = 0;
-  argp = stack;
-
-  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 8)
-    {
-      *(void **) argp = ecif->rvalue;
-      argp += 4;
-    }
-
-  avn = ecif->cif->nargs;
-  p_argv = ecif->avalue;
-
-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
-       (i != 0) && (avn != 0);
-       i--, p_arg++)
-    {
-      size_t z;
-
-      /* Align if necessary.  */
-      if (((*p_arg)->alignment - 1) & (unsigned) argp)
-	argp = (char *) ALIGN (argp, (*p_arg)->alignment);
-
-      if (avn != 0) 
-	{
-	  avn--;
-	  z = (*p_arg)->size;
-	  if (z < sizeof (int))
-	    {
-	      z = sizeof (int);
-
-	      switch ((*p_arg)->type)
-		{
-		case FFI_TYPE_SINT8:
-		  *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
-		  break;
-		  
-		case FFI_TYPE_UINT8:
-		  *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
-		  break;
-		  
-		case FFI_TYPE_SINT16:
-		  *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
-		  break;
-		  
-		case FFI_TYPE_UINT16:
-		  *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
-		  break;
-		  
-		case FFI_TYPE_STRUCT:
-	  	  z = (*p_arg)->size;
-	  	  if ((*p_arg)->alignment != 1)
-		    memcpy (argp, *p_argv, z);
-		  else
-		    memcpy (argp + 4 - z, *p_argv, z);
-	  	  z = sizeof (int);
-		  break;
-
-		default:
-		  FFI_ASSERT(0);
-		}
-	    }
-	  else if (z == sizeof (int))
-	    {
-	       *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
-	    }
-	  else
-	    {
-	      if ((*p_arg)->type == FFI_TYPE_STRUCT)
-	        {
-		  if (z > 8)
-		    {
-		      *(unsigned int *) argp = (unsigned int)(void *)(* p_argv);
-		      z = sizeof(void *);
-		    }
-		  else
-		    {
-	              memcpy(argp, *p_argv, z);
-		      z = 8;
-		    }
-	        }
-	      else
-	        {
-		  /* Double or long long 64bit.  */
-	          memcpy (argp, *p_argv, z);
-	        }
-	    }
-	  p_argv++;
-	  argp += z;
-	}
-    }
-  
-  return;
-}
-
-/* Perform machine dependent cif processing.  */
-ffi_status
-ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  /* Set the return type flag.  */
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_VOID:
-      cif->flags = (unsigned) cif->rtype->type;
-      break;
-
-    case FFI_TYPE_STRUCT:
-      if (cif->rtype->size <= 4)
-	cif->flags = FFI_TYPE_INT;
-
-      else if (cif->rtype->size <= 8)
-	cif->flags = FFI_TYPE_DOUBLE;
-
-      else
-	cif->flags = (unsigned) cif->rtype->type;
-      break;
-
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_DOUBLE:
-      cif->flags = FFI_TYPE_DOUBLE;
-      break;
-
-    case FFI_TYPE_FLOAT:
-    default:
-      cif->flags = FFI_TYPE_INT;
-      break;
-    }
-
-  return FFI_OK;
-}
-
-extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
-			  unsigned, unsigned, unsigned *, void (*fn)(void));
-
-void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  extended_cif ecif;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-  
-  /* If the return value is a struct and we don't have
-     a return value address then we need to make one.  */
-  if ((rvalue == NULL) && 
-      (cif->rtype->type == FFI_TYPE_STRUCT))
-    {
-      ecif.rvalue = alloca (cif->rtype->size);
-    }
-  else
-    ecif.rvalue = rvalue;    
-  
-  switch (cif->abi) 
-    {
-    case FFI_SYSV:
-      ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, 
-		    cif->flags, ecif.rvalue, fn);
-      if (cif->rtype->type == FFI_TYPE_STRUCT)
-	{
-	  int size = cif->rtype->size;
-	  int align = cif->rtype->alignment;
-
-	  if (size < 4)
-	    {
-	      if (align == 1)
-	        *(unsigned long *)(ecif.rvalue) <<= (4 - size) * 8;
-	    }
-	  else if (4 < size && size < 8)
-	    {
-	      if (align == 1)
-		{
-		  memcpy (ecif.rvalue, ecif.rvalue + 8-size, size);
-		}
-	      else if (align == 2)
-		{
-		  if (size & 1)
-		    size += 1;
-
-		  if (size != 8)
-		    memcpy (ecif.rvalue, ecif.rvalue + 8-size, size);
-		}
-	    }
-	}
-      break;
-
-    default:
-      FFI_ASSERT(0);
-      break;
-    }
-}
diff --git a/third_party/gofrontend/libffi/src/m32r/ffitarget.h b/third_party/gofrontend/libffi/src/m32r/ffitarget.h
deleted file mode 100644
index 6c34801..0000000
--- a/third_party/gofrontend/libffi/src/m32r/ffitarget.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 2004  Renesas Technology.
-   Target configuration macros for M32R.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-/* ---- Generic type definitions ----------------------------------------- */
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi
-  {
-    FFI_FIRST_ABI = 0,
-    FFI_SYSV,
-    FFI_LAST_ABI,
-    FFI_DEFAULT_ABI = FFI_SYSV
-  } ffi_abi;
-#endif
-
-#define FFI_CLOSURES 		0
-#define FFI_TRAMPOLINE_SIZE	24
-#define FFI_NATIVE_RAW_API 	0
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/m32r/sysv.S b/third_party/gofrontend/libffi/src/m32r/sysv.S
deleted file mode 100644
index 06b75c2..0000000
--- a/third_party/gofrontend/libffi/src/m32r/sysv.S
+++ /dev/null
@@ -1,121 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2004 Renesas Technology
-   
-   M32R Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-#ifdef HAVE_MACHINE_ASM_H
-#include <machine/asm.h>
-#else
-/* XXX these lose for some platforms, I'm sure.  */
-#define CNAME(x) x
-#define ENTRY(x) .globl CNAME(x)! .type CNAME(x),%function! CNAME(x):
-#endif
-
-.text
-
-	/* R0:   ffi_prep_args */
-	/* R1:   &ecif */
-	/* R2:   cif->bytes */
-	/* R3:   fig->flags */
-	/* sp+0: ecif.rvalue */
-	/* sp+4: fn */
-
-	/* This assumes we are using gas.  */
-ENTRY(ffi_call_SYSV)
-	/* Save registers.  */
-	push	fp
-	push	lr
-	push	r3
-	push	r2
-	push	r1
-	push	r0
-	mv	fp, sp
-
-	/* Make room for all of the new args.  */
-	sub	sp, r2
-
-	/* Place all of the ffi_prep_args in position.  */
-	mv	lr, r0	
-	mv	r0, sp
-	/* R1 already set.  */
-
-	/* And call.  */
-	jl	lr
-
-	/* Move first 4 parameters in registers...  */
-	ld	r0, @(0,sp)
-	ld	r1, @(4,sp)
-	ld	r2, @(8,sp)
-        ld	r3, @(12,sp)
-
-	/* ...and adjust the stack.  */
-	ld	lr, @(8,fp)
-        cmpi	lr, #16
-	bc	adjust_stack
-	ldi	lr, #16
-adjust_stack:
-        add	sp, lr
-
-	/* Call the function.  */
-	ld	lr, @(28,fp)
-	jl	lr	
-
-	/* Remove the space we pushed for the args.  */
-	mv	sp, fp	
-
-	/* Load R2 with the pointer to storage for the return value.  */
-	ld	r2, @(24,sp)
-
-	/* Load R3 with the return type code.  */
-	ld	r3, @(12,sp)
-
-	/* If the return value pointer is NULL, assume no return value.  */
-	beqz	r2, epilogue
-
-	/* Return INT.  */
-	ldi	r4, #FFI_TYPE_INT
-	bne	r3, r4, return_double
-	st	r0, @r2	
-	bra	epilogue
-
-return_double:
-	/* Return DOUBLE or LONGDOUBLE.  */
-	ldi	r4, #FFI_TYPE_DOUBLE
-	bne	r3, r4, epilogue
-	st	r0, @r2	
-	st	r1, @(4,r2)
-
-epilogue:
-	pop	r0
-	pop	r1
-	pop	r2
-	pop	r3
-	pop	lr
-	pop	fp
-        jmp lr
-
-.ffi_call_SYSV_end:
-        .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
diff --git a/third_party/gofrontend/libffi/src/m68k/ffi.c b/third_party/gofrontend/libffi/src/m68k/ffi.c
deleted file mode 100644
index 0dee938..0000000
--- a/third_party/gofrontend/libffi/src/m68k/ffi.c
+++ /dev/null
@@ -1,362 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c
-
-   m68k Foreign Function Interface
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-#include <unistd.h>
-#ifdef __rtems__
-void rtems_cache_flush_multiple_data_lines( const void *, size_t );
-#else
-#include <sys/syscall.h>
-#ifdef __MINT__
-#include <mint/mintbind.h>
-#include <mint/ssystem.h>
-#else
-#include <asm/cachectl.h>
-#endif
-#endif
-
-void ffi_call_SYSV (extended_cif *,
-		    unsigned, unsigned,
-		    void *, void (*fn) ());
-void *ffi_prep_args (void *stack, extended_cif *ecif);
-void ffi_closure_SYSV (ffi_closure *);
-void ffi_closure_struct_SYSV (ffi_closure *);
-unsigned int ffi_closure_SYSV_inner (ffi_closure *closure,
-				     void *resp, void *args);
-
-/* ffi_prep_args is called by the assembly routine once stack space has
-   been allocated for the function's arguments.  */
-
-void *
-ffi_prep_args (void *stack, extended_cif *ecif)
-{
-  unsigned int i;
-  void **p_argv;
-  char *argp;
-  ffi_type **p_arg;
-  void *struct_value_ptr;
-
-  argp = stack;
-
-  if (
-#ifdef __MINT__
-      (ecif->cif->rtype->type == FFI_TYPE_LONGDOUBLE) ||
-#endif
-      (((ecif->cif->rtype->type == FFI_TYPE_STRUCT)
-        && !ecif->cif->flags)))
-    struct_value_ptr = ecif->rvalue;
-  else
-    struct_value_ptr = NULL;
-
-  p_argv = ecif->avalue;
-
-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
-       i != 0;
-       i--, p_arg++)
-    {
-      size_t z = (*p_arg)->size;
-      int type = (*p_arg)->type;
-
-      if (z < sizeof (int))
-	{
-	  switch (type)
-	    {
-	    case FFI_TYPE_SINT8:
-	      *(signed int *) argp = (signed int) *(SINT8 *) *p_argv;
-	      break;
-
-	    case FFI_TYPE_UINT8:
-	      *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv;
-	      break;
-
-	    case FFI_TYPE_SINT16:
-	      *(signed int *) argp = (signed int) *(SINT16 *) *p_argv;
-	      break;
-
-	    case FFI_TYPE_UINT16:
-	      *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv;
-	      break;
-
-	    case FFI_TYPE_STRUCT:
-#ifdef __MINT__
-	      if (z == 1 || z == 2)
-		memcpy (argp + 2, *p_argv, z);
-              else
-		memcpy (argp, *p_argv, z);
-#else
-	      memcpy (argp + sizeof (int) - z, *p_argv, z);
-#endif
-	      break;
-
-	    default:
-	      FFI_ASSERT (0);
-	    }
-	  z = sizeof (int);
-	}
-      else
-	{
-	  memcpy (argp, *p_argv, z);
-
-	  /* Align if necessary.  */
-	  if ((sizeof(int) - 1) & z)
-	    z = ALIGN(z, sizeof(int));
-	}
-
-      p_argv++;
-      argp += z;
-    }
-
-  return struct_value_ptr;
-}
-
-#define CIF_FLAGS_INT		1
-#define CIF_FLAGS_DINT		2
-#define CIF_FLAGS_FLOAT		4
-#define CIF_FLAGS_DOUBLE	8
-#define CIF_FLAGS_LDOUBLE	16
-#define CIF_FLAGS_POINTER	32
-#define CIF_FLAGS_STRUCT1	64
-#define CIF_FLAGS_STRUCT2	128
-#define CIF_FLAGS_SINT8		256
-#define CIF_FLAGS_SINT16	512
-
-/* Perform machine dependent cif processing */
-ffi_status
-ffi_prep_cif_machdep (ffi_cif *cif)
-{
-  /* Set the return type flag */
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_VOID:
-      cif->flags = 0;
-      break;
-
-    case FFI_TYPE_STRUCT:
-      if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT &&
-          cif->rtype->elements[1])
-        {
-          cif->flags = 0;
-          break;
-        }
-
-      switch (cif->rtype->size)
-	{
-	case 1:
-#ifdef __MINT__
-	  cif->flags = CIF_FLAGS_STRUCT2;
-#else
-	  cif->flags = CIF_FLAGS_STRUCT1;
-#endif
-	  break;
-	case 2:
-	  cif->flags = CIF_FLAGS_STRUCT2;
-	  break;
-#ifdef __MINT__
-	case 3:
-#endif
-	case 4:
-	  cif->flags = CIF_FLAGS_INT;
-	  break;
-#ifdef __MINT__
-	case 7:
-#endif
-	case 8:
-	  cif->flags = CIF_FLAGS_DINT;
-	  break;
-	default:
-	  cif->flags = 0;
-	  break;
-	}
-      break;
-
-    case FFI_TYPE_FLOAT:
-      cif->flags = CIF_FLAGS_FLOAT;
-      break;
-
-    case FFI_TYPE_DOUBLE:
-      cif->flags = CIF_FLAGS_DOUBLE;
-      break;
-
-#if (FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE)
-    case FFI_TYPE_LONGDOUBLE:
-#ifdef __MINT__
-      cif->flags = 0;
-#else
-      cif->flags = CIF_FLAGS_LDOUBLE;
-#endif
-      break;
-#endif
-
-    case FFI_TYPE_POINTER:
-      cif->flags = CIF_FLAGS_POINTER;
-      break;
-
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-      cif->flags = CIF_FLAGS_DINT;
-      break;
-
-    case FFI_TYPE_SINT16:
-      cif->flags = CIF_FLAGS_SINT16;
-      break;
-
-    case FFI_TYPE_SINT8:
-      cif->flags = CIF_FLAGS_SINT8;
-      break;
-
-    default:
-      cif->flags = CIF_FLAGS_INT;
-      break;
-    }
-
-  return FFI_OK;
-}
-
-void
-ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue)
-{
-  extended_cif ecif;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-
-  /* If the return value is a struct and we don't have a return value
-     address then we need to make one.  */
-
-  if (rvalue == NULL
-      && cif->rtype->type == FFI_TYPE_STRUCT
-      && cif->rtype->size > 8)
-    ecif.rvalue = alloca (cif->rtype->size);
-  else
-    ecif.rvalue = rvalue;
-
-  switch (cif->abi)
-    {
-    case FFI_SYSV:
-      ffi_call_SYSV (&ecif, cif->bytes, cif->flags,
-		     ecif.rvalue, fn);
-      break;
-
-    default:
-      FFI_ASSERT (0);
-      break;
-    }
-}
-
-static void
-ffi_prep_incoming_args_SYSV (char *stack, void **avalue, ffi_cif *cif)
-{
-  unsigned int i;
-  void **p_argv;
-  char *argp;
-  ffi_type **p_arg;
-
-  argp = stack;
-  p_argv = avalue;
-
-  for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
-    {
-      size_t z;
-
-      z = (*p_arg)->size;
-#ifdef __MINT__
-      if (cif->flags &&
-          cif->rtype->type == FFI_TYPE_STRUCT &&
-          (z == 1 || z == 2))
- 	{
-	  *p_argv = (void *) (argp + 2);
-
-	  z = 4;
-	}
-      else
-      if (cif->flags &&
-          cif->rtype->type == FFI_TYPE_STRUCT &&
-          (z == 3 || z == 4))
- 	{
-	  *p_argv = (void *) (argp);
-
-	  z = 4;
-	}
-      else
-#endif
-      if (z <= 4)
-	{
-	  *p_argv = (void *) (argp + 4 - z);
-
-	  z = 4;
-	}
-      else
-	{
-	  *p_argv = (void *) argp;
-
-	  /* Align if necessary */
-	  if ((sizeof(int) - 1) & z)
-	    z = ALIGN(z, sizeof(int));
-	}
-
-      p_argv++;
-      argp += z;
-    }
-}
-
-unsigned int
-ffi_closure_SYSV_inner (ffi_closure *closure, void *resp, void *args)
-{
-  ffi_cif *cif;
-  void **arg_area;
-
-  cif = closure->cif;
-  arg_area = (void**) alloca (cif->nargs * sizeof (void *));
-
-  ffi_prep_incoming_args_SYSV(args, arg_area, cif);
-
-  (closure->fun) (cif, resp, arg_area, closure->user_data);
-
-  return cif->flags;
-}
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun)(ffi_cif*,void*,void**,void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  if (cif->abi != FFI_SYSV)
-    return FFI_BAD_ABI;
-
-  *(unsigned short *)closure->tramp = 0x207c;
-  *(void **)(closure->tramp + 2) = codeloc;
-  *(unsigned short *)(closure->tramp + 6) = 0x4ef9;
-
-  if (
-#ifdef __MINT__
-      (cif->rtype->type == FFI_TYPE_LONGDOUBLE) ||
-#endif
-      (((cif->rtype->type == FFI_TYPE_STRUCT)
-         && !cif->flags)))
-    *(void **)(closure->tramp + 8) = ffi_closure_struct_SYSV;
-  else
-    *(void **)(closure->tramp + 8) = ffi_closure_SYSV;
-
-#ifdef __rtems__
-  rtems_cache_flush_multiple_data_lines( codeloc, FFI_TRAMPOLINE_SIZE );
-#elif defined(__MINT__)
-  Ssystem(S_FLUSHCACHE, codeloc, FFI_TRAMPOLINE_SIZE);
-#else
-  syscall(SYS_cacheflush, codeloc, FLUSH_SCOPE_LINE,
-	  FLUSH_CACHE_BOTH, FFI_TRAMPOLINE_SIZE);
-#endif
-
-  closure->cif  = cif;
-  closure->user_data = user_data;
-  closure->fun  = fun;
-
-  return FFI_OK;
-}
diff --git a/third_party/gofrontend/libffi/src/m68k/ffitarget.h b/third_party/gofrontend/libffi/src/m68k/ffitarget.h
deleted file mode 100644
index e81dde2..0000000
--- a/third_party/gofrontend/libffi/src/m68k/ffitarget.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 1996-2003  Red Hat, Inc.
-   Target configuration macros for Motorola 68K.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_SYSV
-} ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_TRAMPOLINE_SIZE 16
-#define FFI_NATIVE_RAW_API 0
-
-#endif
-
diff --git a/third_party/gofrontend/libffi/src/m68k/sysv.S b/third_party/gofrontend/libffi/src/m68k/sysv.S
deleted file mode 100644
index ec2b14f..0000000
--- a/third_party/gofrontend/libffi/src/m68k/sysv.S
+++ /dev/null
@@ -1,330 +0,0 @@
-/* -----------------------------------------------------------------------
-	
-   sysv.S - Copyright (c) 2012 Alan Hourihane
-	    Copyright (c) 1998, 2012 Andreas Schwab
-	    Copyright (c) 2008 Red Hat, Inc.
-	    Copyright (c) 2012 Thorsten Glaser
-
-   m68k Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-
-#ifdef HAVE_AS_CFI_PSEUDO_OP
-#define CFI_STARTPROC()		.cfi_startproc
-#define CFI_OFFSET(reg,off)	.cfi_offset	reg,off
-#define CFI_DEF_CFA(reg,off)	.cfi_def_cfa	reg,off
-#define CFI_ENDPROC()		.cfi_endproc
-#else
-#define CFI_STARTPROC()
-#define CFI_OFFSET(reg,off)
-#define CFI_DEF_CFA(reg,off)
-#define CFI_ENDPROC()
-#endif
-
-#ifdef __MINT__
-#define CALLFUNC(funcname) _ ## funcname
-#else
-#define CALLFUNC(funcname) funcname
-#endif
-
-	.text
-
-	.globl	CALLFUNC(ffi_call_SYSV)
-	.type	CALLFUNC(ffi_call_SYSV),@function
-	.align	4
-
-CALLFUNC(ffi_call_SYSV):
-	CFI_STARTPROC()
-	link	%fp,#0
-	CFI_OFFSET(14,-8)
-	CFI_DEF_CFA(14,8)
-	move.l	%d2,-(%sp)
-	CFI_OFFSET(2,-12)
-
-	| Make room for all of the new args.
-	sub.l	12(%fp),%sp
-
-	| Call ffi_prep_args
-	move.l	8(%fp),-(%sp)
-	pea	4(%sp)
-#if !defined __PIC__
-	jsr	CALLFUNC(ffi_prep_args)
-#else
-	bsr.l	CALLFUNC(ffi_prep_args@PLTPC)
-#endif
-	addq.l	#8,%sp	
-
-	| Pass pointer to struct value, if any
-#ifdef __MINT__
-	move.l	%d0,%a1
-#else
-	move.l	%a0,%a1
-#endif
-
-	| Call the function
-	move.l	24(%fp),%a0
-	jsr	(%a0)
-
-	| Remove the space we pushed for the args
-	add.l	12(%fp),%sp
-
-	| Load the pointer to storage for the return value
-	move.l	20(%fp),%a1
-
-	| Load the return type code 
-	move.l	16(%fp),%d2
-
-	| If the return value pointer is NULL, assume no return value.
-	| NOTE: On the mc68000, tst on an address register is not supported.
-#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__)
-	cmp.w	#0, %a1
-#else
-	tst.l	%a1
-#endif
-	jbeq	noretval
-
-	btst	#0,%d2
-	jbeq	retlongint
-	move.l	%d0,(%a1)
-	jbra	epilogue
-
-retlongint:
-	btst	#1,%d2
-	jbeq	retfloat
-	move.l	%d0,(%a1)
-	move.l	%d1,4(%a1)
-	jbra	epilogue
-
-retfloat:
-	btst	#2,%d2
-	jbeq	retdouble
-#if defined(__MC68881__) || defined(__HAVE_68881__)
-	fmove.s	%fp0,(%a1)
-#else
-	move.l	%d0,(%a1)
-#endif
-	jbra	epilogue
-
-retdouble:
-	btst	#3,%d2
-	jbeq	retlongdouble
-#if defined(__MC68881__) || defined(__HAVE_68881__)
-	fmove.d	%fp0,(%a1)
-#else
-	move.l	%d0,(%a1)+
-	move.l	%d1,(%a1)
-#endif
-	jbra	epilogue
-
-retlongdouble:
-	btst	#4,%d2
-	jbeq	retpointer
-#if defined(__MC68881__) || defined(__HAVE_68881__)
-	fmove.x	%fp0,(%a1)
-#else
-	move.l	%d0,(%a1)+
-	move.l	%d1,(%a1)+
-	move.l	%d2,(%a1)
-#endif
-	jbra	epilogue
-
-retpointer:
-	btst	#5,%d2
-	jbeq	retstruct1
-#ifdef __MINT__
-	move.l	%d0,(%a1)
-#else
-	move.l	%a0,(%a1)
-#endif
-	jbra	epilogue
-
-retstruct1:
-	btst	#6,%d2
-	jbeq	retstruct2
-	move.b	%d0,(%a1)
-	jbra	epilogue
-
-retstruct2:
-	btst	#7,%d2
-	jbeq	retsint8
-	move.w	%d0,(%a1)
-	jbra	epilogue
-
-retsint8:
-	btst	#8,%d2
-	jbeq	retsint16
-	| NOTE: On the mc68000, extb is not supported. 8->16, then 16->32.
-#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__)
-	ext.w	%d0
-	ext.l	%d0
-#else
-	extb.l	%d0
-#endif
-	move.l	%d0,(%a1)
-	jbra	epilogue
-
-retsint16:
-	btst	#9,%d2
-	jbeq	noretval
-	ext.l	%d0
-	move.l	%d0,(%a1)
-
-noretval:
-epilogue:
-	move.l	(%sp)+,%d2
-	unlk	%fp
-	rts
-	CFI_ENDPROC()
-	.size	CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV)
-
-	.globl	CALLFUNC(ffi_closure_SYSV)
-	.type	CALLFUNC(ffi_closure_SYSV), @function
-	.align	4
-
-CALLFUNC(ffi_closure_SYSV):
-	CFI_STARTPROC()
-	link	%fp,#-12
-	CFI_OFFSET(14,-8)
-	CFI_DEF_CFA(14,8)
-	move.l	%sp,-12(%fp)
-	pea	8(%fp)
-	pea	-12(%fp)
-	move.l	%a0,-(%sp)
-#if !defined __PIC__
-	jsr	CALLFUNC(ffi_closure_SYSV_inner)
-#else
-	bsr.l	CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
-#endif
-
-	lsr.l	#1,%d0
-	jne	1f
-	jcc	.Lcls_epilogue
-	| CIF_FLAGS_INT
-	move.l	-12(%fp),%d0
-.Lcls_epilogue:
-	| no CIF_FLAGS_*
-	unlk	%fp
-	rts
-1:
-	lea	-12(%fp),%a0
-	lsr.l	#2,%d0
-	jne	1f
-	jcs	.Lcls_ret_float
-	| CIF_FLAGS_DINT
-	move.l	(%a0)+,%d0
-	move.l	(%a0),%d1
-	jra	.Lcls_epilogue
-.Lcls_ret_float:
-#if defined(__MC68881__) || defined(__HAVE_68881__)
-	fmove.s	(%a0),%fp0
-#else
-	move.l	(%a0),%d0
-#endif
-	jra	.Lcls_epilogue
-1:
-	lsr.l	#2,%d0
-	jne	1f
-	jcs	.Lcls_ret_ldouble
-	| CIF_FLAGS_DOUBLE
-#if defined(__MC68881__) || defined(__HAVE_68881__)
-	fmove.d	(%a0),%fp0
-#else
-	move.l	(%a0)+,%d0
-	move.l	(%a0),%d1
-#endif
-	jra	.Lcls_epilogue
-.Lcls_ret_ldouble:
-#if defined(__MC68881__) || defined(__HAVE_68881__)
-	fmove.x	(%a0),%fp0
-#else
-	move.l	(%a0)+,%d0
-	move.l	(%a0)+,%d1
-	move.l	(%a0),%d2
-#endif
-	jra	.Lcls_epilogue
-1:
-	lsr.l	#2,%d0
-	jne	1f
-	jcs	.Lcls_ret_struct1
-	| CIF_FLAGS_POINTER
-	move.l	(%a0),%a0
-	move.l	%a0,%d0
-	jra	.Lcls_epilogue
-.Lcls_ret_struct1:
-	move.b	(%a0),%d0
-	jra	.Lcls_epilogue
-1:
-	lsr.l	#2,%d0
-	jne	1f
-	jcs	.Lcls_ret_sint8
-	| CIF_FLAGS_STRUCT2
-	move.w	(%a0),%d0
-	jra	.Lcls_epilogue
-.Lcls_ret_sint8:
-	move.l	(%a0),%d0
-	| NOTE: On the mc68000, extb is not supported. 8->16, then 16->32.
-#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__)
-	ext.w	%d0
-	ext.l	%d0
-#else
-	extb.l	%d0
-#endif
-	jra	.Lcls_epilogue
-1:
-	| CIF_FLAGS_SINT16
-	move.l	(%a0),%d0
-	ext.l	%d0
-	jra	.Lcls_epilogue
-	CFI_ENDPROC()
-
-	.size	CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV)
-
-	.globl	CALLFUNC(ffi_closure_struct_SYSV)
-	.type	CALLFUNC(ffi_closure_struct_SYSV), @function
-	.align	4
-
-CALLFUNC(ffi_closure_struct_SYSV):
-	CFI_STARTPROC()
-	link	%fp,#0
-	CFI_OFFSET(14,-8)
-	CFI_DEF_CFA(14,8)
-	move.l	%sp,-12(%fp)
-	pea	8(%fp)
-	move.l	%a1,-(%sp)
-	move.l	%a0,-(%sp)
-#if !defined __PIC__
-	jsr	CALLFUNC(ffi_closure_SYSV_inner)
-#else
-	bsr.l	CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
-#endif
-	unlk	%fp
-	rts
-	CFI_ENDPROC()
-	.size	CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV)
-
-#if defined __ELF__ && defined __linux__
-	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/third_party/gofrontend/libffi/src/m88k/ffi.c b/third_party/gofrontend/libffi/src/m88k/ffi.c
deleted file mode 100644
index 68df494..0000000
--- a/third_party/gofrontend/libffi/src/m88k/ffi.c
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * Copyright (c) 2013 Miodrag Vallat.  <miod@openbsd.org>
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * ``Software''), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * m88k Foreign Function Interface
- *
- * This file attempts to provide all the FFI entry points which can reliably
- * be implemented in C.
- *
- * Only OpenBSD/m88k is currently supported; other platforms (such as
- * Motorola's SysV/m88k) could be supported with the following tweaks:
- *
- * - non-OpenBSD systems use an `outgoing parameter area' as part of the
- *   88BCS calling convention, which is not supported under OpenBSD from
- *   release 3.6 onwards.  Supporting it should be as easy as taking it
- *   into account when adjusting the stack, in the assembly code.
- *
- * - the logic deciding whether a function argument gets passed through
- *   registers, or on the stack, has changed several times in OpenBSD in
- *   edge cases (especially for structs larger than 32 bytes being passed
- *   by value). The code below attemps to match the logic used by the
- *   system compiler of OpenBSD 5.3, i.e. gcc 3.3.6 with many m88k backend
- *   fixes.
- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-#include <unistd.h>
-
-void ffi_call_OBSD (unsigned int, extended_cif *, unsigned int, void *,
-		    void (*fn) ());
-void *ffi_prep_args (void *, extended_cif *);
-void ffi_closure_OBSD (ffi_closure *);
-void ffi_closure_struct_OBSD (ffi_closure *);
-unsigned int ffi_closure_OBSD_inner (ffi_closure *, void *, unsigned int *,
-				     char *);
-void ffi_cacheflush_OBSD (unsigned int, unsigned int);
-
-#define CIF_FLAGS_INT		(1 << 0)
-#define CIF_FLAGS_DINT		(1 << 1)
-
-/*
- * Foreign Function Interface API
- */
-
-/* ffi_prep_args is called by the assembly routine once stack space has
-   been allocated for the function's arguments.  */
-
-void *
-ffi_prep_args (void *stack, extended_cif *ecif)
-{
-  unsigned int i;
-  void **p_argv;
-  char *argp, *stackp;
-  unsigned int *regp;
-  unsigned int regused;
-  ffi_type **p_arg;
-  void *struct_value_ptr;
-
-  regp = (unsigned int *)stack;
-  stackp = (char *)(regp + 8);
-  regused = 0;
-
-  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
-      && !ecif->cif->flags)
-    struct_value_ptr = ecif->rvalue;
-  else
-    struct_value_ptr = NULL;
-
-  p_argv = ecif->avalue;
-
-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i != 0; i--, p_arg++)
-    {
-      size_t z;
-      unsigned short t, a;
-
-      z = (*p_arg)->size;
-      t = (*p_arg)->type;
-      a = (*p_arg)->alignment;
-
-      /*
-       * Figure out whether the argument can be passed through registers
-       * or on the stack.
-       * The rule is that registers can only receive simple types not larger
-       * than 64 bits, or structs the exact size of a register and aligned to
-       * the size of a register.
-       */
-      if (t == FFI_TYPE_STRUCT)
-	{
-	  if (z == sizeof (int) && a == sizeof (int) && regused < 8)
-	    argp = (char *)regp;
-	  else
-	    argp = stackp;
-	}
-      else
-	{
-	  if (z > sizeof (int) && regused < 8 - 1)
-	    {
-	      /* align to an even register pair */
-	      if (regused & 1)
-		{
-		  regp++;
-		  regused++;
-		}
-	    }
-	  if (regused < 8)
-	    argp = (char *)regp;
-	  else
-	    argp = stackp;
-	}
-
-      /* Enforce proper stack alignment of 64-bit types */
-      if (argp == stackp && a > sizeof (int))
-	{
-	  stackp = (char *) ALIGN(stackp, a);
-	  argp = stackp;
-	}
-
-      switch (t)
-	{
-	case FFI_TYPE_SINT8:
-	  *(signed int *) argp = (signed int) *(SINT8 *) *p_argv;
-	  break;
-
-	case FFI_TYPE_UINT8:
-	  *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv;
-	  break;
-
-	case FFI_TYPE_SINT16:
-	  *(signed int *) argp = (signed int) *(SINT16 *) *p_argv;
-	  break;
-
-	case FFI_TYPE_UINT16:
-	  *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv;
-	  break;
-
-	case FFI_TYPE_INT:
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_POINTER:
-	  *(unsigned int *) argp = *(unsigned int *) *p_argv;
-	  break;
-
-	case FFI_TYPE_DOUBLE:
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_STRUCT:
-	  memcpy (argp, *p_argv, z);
-	  break;
-
-	default:
-	  FFI_ASSERT (0);
-	}
-
-      /* Align if necessary.  */
-      if ((sizeof (int) - 1) & z)
-	z = ALIGN(z, sizeof (int));
-
-      p_argv++;
-
-      /* Be careful, once all registers are filled, and about to continue
-         on stack, regp == stackp.  Therefore the check for regused as well. */
-      if (argp == (char *)regp && regused < 8)
-	{
-	  regp += z / sizeof (int);
-	  regused += z / sizeof (int);
-	}
-      else
-	stackp += z;
-    }
-
-  return struct_value_ptr;
-}
-
-/* Perform machine dependent cif processing */
-ffi_status
-ffi_prep_cif_machdep (ffi_cif *cif)
-{
-  /* Set the return type flag */
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_VOID:
-      cif->flags = 0;
-      break;
-
-    case FFI_TYPE_STRUCT:
-      if (cif->rtype->size == sizeof (int) &&
-	  cif->rtype->alignment == sizeof (int))
-	cif->flags = CIF_FLAGS_INT;
-      else
-	cif->flags = 0;
-      break;
-
-    case FFI_TYPE_DOUBLE:
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-      cif->flags = CIF_FLAGS_DINT;
-      break;
-
-    default:
-      cif->flags = CIF_FLAGS_INT;
-      break;
-    }
-
-  return FFI_OK;
-}
-
-void
-ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue)
-{
-  extended_cif ecif;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-
-  /* If the return value is a struct and we don't have a return value
-     address then we need to make one.  */
-
-  if (rvalue == NULL
-      && cif->rtype->type == FFI_TYPE_STRUCT
-      && (cif->rtype->size != sizeof (int)
-	  || cif->rtype->alignment != sizeof (int)))
-    ecif.rvalue = alloca (cif->rtype->size);
-  else
-    ecif.rvalue = rvalue;
-
-  switch (cif->abi)
-    {
-    case FFI_OBSD:
-      ffi_call_OBSD (cif->bytes, &ecif, cif->flags, ecif.rvalue, fn);
-      break;
-
-    default:
-      FFI_ASSERT (0);
-      break;
-    }
-}
-
-/*
- * Closure API
- */
-
-static void
-ffi_prep_closure_args_OBSD (ffi_cif *cif, void **avalue, unsigned int *regp,
-			    char *stackp)
-{
-  unsigned int i;
-  void **p_argv;
-  char *argp;
-  unsigned int regused;
-  ffi_type **p_arg;
-
-  regused = 0;
-
-  p_argv = avalue;
-
-  for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++)
-    {
-      size_t z;
-      unsigned short t, a;
-
-      z = (*p_arg)->size;
-      t = (*p_arg)->type;
-      a = (*p_arg)->alignment;
-
-      /*
-       * Figure out whether the argument has been passed through registers
-       * or on the stack.
-       * The rule is that registers can only receive simple types not larger
-       * than 64 bits, or structs the exact size of a register and aligned to
-       * the size of a register.
-       */
-      if (t == FFI_TYPE_STRUCT)
-	{
-	  if (z == sizeof (int) && a == sizeof (int) && regused < 8)
-	    argp = (char *)regp;
-	  else
-	    argp = stackp;
-	}
-      else
-	{
-	  if (z > sizeof (int) && regused < 8 - 1)
-	    {
-	      /* align to an even register pair */
-	      if (regused & 1)
-		{
-		  regp++;
-		  regused++;
-		}
-	    }
-	  if (regused < 8)
-	    argp = (char *)regp;
-	  else
-	    argp = stackp;
-	}
-
-      /* Enforce proper stack alignment of 64-bit types */
-      if (argp == stackp && a > sizeof (int))
-	{
-	  stackp = (char *) ALIGN(stackp, a);
-	  argp = stackp;
-	}
-
-      if (z < sizeof (int) && t != FFI_TYPE_STRUCT)
-	*p_argv = (void *) (argp + sizeof (int) - z);
-      else
-	*p_argv = (void *) argp;
-
-      /* Align if necessary */
-      if ((sizeof (int) - 1) & z)
-	z = ALIGN(z, sizeof (int));
-
-      p_argv++;
-
-      /* Be careful, once all registers are exhausted, and about to fetch from
-	 stack, regp == stackp.  Therefore the check for regused as well. */
-      if (argp == (char *)regp && regused < 8)
-	{
-	  regp += z / sizeof (int);
-	  regused += z / sizeof (int);
-	}
-      else
-	stackp += z;
-    }
-}
-
-unsigned int
-ffi_closure_OBSD_inner (ffi_closure *closure, void *resp, unsigned int *regp,
-			char *stackp)
-{
-  ffi_cif *cif;
-  void **arg_area;
-
-  cif = closure->cif;
-  arg_area = (void**) alloca (cif->nargs * sizeof (void *));
-
-  ffi_prep_closure_args_OBSD(cif, arg_area, regp, stackp);
-
-  (closure->fun) (cif, resp, arg_area, closure->user_data);
-
-  return cif->flags;
-}
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif,
-		      void (*fun)(ffi_cif*,void*,void**,void*),
-		      void *user_data, void *codeloc)
-{
-  unsigned int *tramp = (unsigned int *) codeloc;
-  void *fn;
-
-  FFI_ASSERT (cif->abi == FFI_OBSD);
-
-  if (cif->rtype->type == FFI_TYPE_STRUCT && !cif->flags)
-    fn = &ffi_closure_struct_OBSD;
-  else
-    fn = &ffi_closure_OBSD;
-
-  /* or.u %r10, %r0, %hi16(fn) */
-  tramp[0] = 0x5d400000 | (((unsigned int)fn) >> 16);
-  /* or.u %r13, %r0, %hi16(closure) */
-  tramp[1] = 0x5da00000 | ((unsigned int)closure >> 16);
-  /* or %r10, %r10, %lo16(fn) */
-  tramp[2] = 0x594a0000 | (((unsigned int)fn) & 0xffff);
-  /* jmp.n %r10 */
-  tramp[3] = 0xf400c40a;
-  /* or %r13, %r13, %lo16(closure) */
-  tramp[4] = 0x59ad0000 | ((unsigned int)closure & 0xffff);
-
-  ffi_cacheflush_OBSD((unsigned int)codeloc, FFI_TRAMPOLINE_SIZE);
-
-  closure->cif  = cif;
-  closure->user_data = user_data;
-  closure->fun  = fun;
-
-  return FFI_OK;
-}
diff --git a/third_party/gofrontend/libffi/src/m88k/ffitarget.h b/third_party/gofrontend/libffi/src/m88k/ffitarget.h
deleted file mode 100644
index e52bf9f..0000000
--- a/third_party/gofrontend/libffi/src/m88k/ffitarget.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2013 Miodrag Vallat.  <miod@openbsd.org>
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * ``Software''), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * m88k Foreign Function Interface
- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_ASM
-typedef unsigned long ffi_arg;
-typedef signed long ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_OBSD,
-  FFI_DEFAULT_ABI = FFI_OBSD,
-  FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
-} ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_TRAMPOLINE_SIZE 0x14
-#define FFI_NATIVE_RAW_API 0
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/m88k/obsd.S b/third_party/gofrontend/libffi/src/m88k/obsd.S
deleted file mode 100644
index 1944a23..0000000
--- a/third_party/gofrontend/libffi/src/m88k/obsd.S
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (c) 2013 Miodrag Vallat.  <miod@openbsd.org>
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * ``Software''), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * m88k Foreign Function Interface
- */
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-
-	.text
-
-/*
- * ffi_cacheflush_OBSD(unsigned int addr,	%r2
- *		       unsigned int size);	%r3
- */
-	.align	4
-	.globl	ffi_cacheflush_OBSD
-	.type	ffi_cacheflush_OBSD,@function
-ffi_cacheflush_OBSD:
-	tb0	0,   %r0, 451
-	or	%r0, %r0, %r0
-	jmp	%r1
-	.size	ffi_cacheflush_OBSD, . - ffi_cacheflush_OBSD
-
-/*
- * ffi_call_OBSD(unsigned bytes,		%r2
- *		 extended_cif *ecif,		%r3
- *		 unsigned flags,		%r4
- *		 void *rvalue,			%r5
- *		 void (*fn)());			%r6
- */
-	.align	4
-	.globl	ffi_call_OBSD
-	.type	ffi_call_OBSD,@function
-ffi_call_OBSD:
-	subu	%r31, %r31, 32
-	st	%r30, %r31, 4
-	st	%r1,  %r31, 0
-	addu	%r30, %r31, 32
-
-	| Save the few arguments we'll need after ffi_prep_args()
-	st.d	%r4, %r31, 8
-	st	%r6, %r31, 16
-
-	| Allocate room for the image of r2-r9, and the stack space for
-	| the args (rounded to a 16-byte boundary)
-	addu	%r2,  %r2,  (8 * 4) + 15
-	clr	%r2,  %r2,  4<0>
-	subu	%r31, %r31, %r2
-
-	| Fill register and stack image
-	or	%r2, %r31, %r0
-#ifdef PIC
-	bsr	ffi_prep_args#plt
-#else
-	bsr	ffi_prep_args
-#endif
-
-	| Save pointer to return struct address, if any
-	or	%r12, %r2, %r0
-
-	| Get function pointer
-	subu	%r4,  %r30, 32
-	ld	%r1,  %r4,  16
-
-	| Fetch the register arguments
-	ld.d	%r2, %r31, (0 * 4)
-	ld.d	%r4, %r31, (2 * 4)
-	ld.d	%r6, %r31, (4 * 4)
-	ld.d	%r8, %r31, (6 * 4)
-	addu	%r31, %r31, (8 * 4)
-
-	| Invoke the function
-	jsr	%r1
-
-	| Restore stack now that we don't need the args anymore
-	subu	%r31, %r30, 32
-
-	| Figure out what to return as the function's return value
-	ld	%r5, %r31, 12		| rvalue
-	ld	%r4, %r31, 8		| flags
-
-	bcnd	eq0, %r5, 9f
-
-	bb0	0, %r4, 1f		| CIF_FLAGS_INT
-	st	%r2, %r5, 0
-	br	9f
-
-1:
-	bb0	1, %r4, 1f		| CIF_FLAGS_DINT
-	st.d	%r2, %r5, 0
-	br	9f
-
-1:
-9:
-	ld	%r1,  %r31, 0
-	ld	%r30, %r31, 4
-	jmp.n	%r1
-	 addu	%r31, %r31, 32
-	.size	ffi_call_OBSD, . - ffi_call_OBSD
-
-/*
- * ffi_closure_OBSD(ffi_closure *closure);	%r13
- */
-	.align	4
-	.globl	ffi_closure_OBSD
-	.type	ffi_closure_OBSD, @function
-ffi_closure_OBSD:
-	subu	%r31, %r31, 16
-	st	%r30, %r31, 4
-	st	%r1,  %r31, 0
-	addu	%r30, %r31, 16
-
-	| Make room on the stack for saved register arguments and return
-	| value
-	subu	%r31, %r31, (8 * 4) + (2 * 4)
-	st.d	%r2,  %r31, (0 * 4)
-	st.d	%r4,  %r31, (2 * 4)
-	st.d	%r6,  %r31, (4 * 4)
-	st.d	%r8,  %r31, (6 * 4)
-
-	| Invoke the closure function
-	or	%r5,  %r30, 0			| calling stack
-	addu	%r4,  %r31, 0			| saved registers
-	addu	%r3,  %r31, (8 * 4)		| return value
-	or	%r2,  %r13, %r0			| closure
-#ifdef PIC
-	bsr	ffi_closure_OBSD_inner#plt
-#else
-	bsr	ffi_closure_OBSD_inner
-#endif
-
-	| Figure out what to return as the function's return value
-	bb0	0, %r2, 1f		| CIF_FLAGS_INT
-	ld	%r2, %r31, (8 * 4)
-	br	9f
-
-1:
-	bb0	1, %r2, 1f		| CIF_FLAGS_DINT
-	ld.d	%r2, %r31, (8 * 4)
-	br	9f
-
-1:
-9:
-	subu	%r31, %r30, 16
-	ld	%r1,  %r31, 0
-	ld	%r30, %r31, 4
-	jmp.n	%r1
-	 addu	%r31, %r31, 16
-	.size	ffi_closure_OBSD,.-ffi_closure_OBSD
-
-/*
- * ffi_closure_struct_OBSD(ffi_closure *closure);	%r13
- */
-	.align	4
-	.globl	ffi_closure_struct_OBSD
-	.type	ffi_closure_struct_OBSD, @function
-ffi_closure_struct_OBSD:
-	subu	%r31, %r31, 16
-	st	%r30, %r31, 4
-	st	%r1,  %r31, 0
-	addu	%r30, %r31, 16
-
-	| Make room on the stack for saved register arguments
-	subu	%r31, %r31, (8 * 4)
-	st.d	%r2,  %r31, (0 * 4)
-	st.d	%r4,  %r31, (2 * 4)
-	st.d	%r6,  %r31, (4 * 4)
-	st.d	%r8,  %r31, (6 * 4)
-
-	| Invoke the closure function
-	or	%r5,  %r30, 0			| calling stack
-	addu	%r4,  %r31, 0			| saved registers
-	or	%r3,  %r12, 0			| return value
-	or	%r2,  %r13, %r0			| closure
-#ifdef PIC
-	bsr	ffi_closure_OBSD_inner#plt
-#else
-	bsr	ffi_closure_OBSD_inner
-#endif
-
-	subu	%r31, %r30, 16
-	ld	%r1,  %r31, 0
-	ld	%r30, %r31, 4
-	jmp.n	%r1
-	 addu	%r31, %r31, 16
-	.size	ffi_closure_struct_OBSD,.-ffi_closure_struct_OBSD
diff --git a/third_party/gofrontend/libffi/src/metag/ffi.c b/third_party/gofrontend/libffi/src/metag/ffi.c
deleted file mode 100644
index 46b383e..0000000
--- a/third_party/gofrontend/libffi/src/metag/ffi.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/* ----------------------------------------------------------------------
-  ffi.c - Copyright (c) 2013 Imagination Technologies
-
-  Meta Foreign Function Interface
-  Permission is hereby granted, free of charge, to any person obtaining
-  a copy of this software and associated documentation files (the
-  `Software''), to deal in the Software without restriction, including
-  without limitation the rights to use, copy, modify, merge, publish,
-  distribute, sublicense, and/or sell copies of the Software, and to
-  permit persons to whom the Software is furnished to do so, subject to
-  the following conditions:
-
-  The above copyright notice and this permission notice shall be included
-  in all copies or substantial portions of the Software.
-
-  THE SOFTWARE IS PROVIDED `AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-  IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR
-  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-  OTHER DEALINGS IN THE SOFTWARE.
------------------------------------------------------------------------ */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
-
-/*
- * ffi_prep_args is called by the assembly routine once stack space has been
- * allocated for the function's arguments
- */
-
-unsigned int ffi_prep_args(char *stack, extended_cif *ecif)
-{
-	register unsigned int i;
-	register void **p_argv;
-	register char *argp;
-	register ffi_type **p_arg;
-
-	argp = stack;
-
-	/* Store return value */
-	if ( ecif->cif->flags == FFI_TYPE_STRUCT ) {
-		argp -= 4;
-		*(void **) argp = ecif->rvalue;
-	}
-
-	p_argv = ecif->avalue;
-
-	/* point to next location */
-	for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; (i != 0); i--, p_arg++, p_argv++)
-	{
-		size_t z;
-
-		/* Move argp to address of argument */
-		z = (*p_arg)->size;
-		argp -= z;
-
-		/* Align if necessary */
-		argp = (char *) ALIGN_DOWN(ALIGN_DOWN(argp, (*p_arg)->alignment), 4);
-
-		if (z < sizeof(int)) {
-			z = sizeof(int);
-			switch ((*p_arg)->type)
-			{
-			case FFI_TYPE_SINT8:
-				*(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
-				break;
-			case FFI_TYPE_UINT8:
-				*(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
-				break;
-			case FFI_TYPE_SINT16:
-				*(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
-				break;
-			case FFI_TYPE_UINT16:
-				*(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
-			case FFI_TYPE_STRUCT:
-				memcpy(argp, *p_argv, (*p_arg)->size);
-				break;
-			default:
-				FFI_ASSERT(0);
-			}
-		} else if ( z == sizeof(int)) {
-			*(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
-		} else {
-			memcpy(argp, *p_argv, z);
-		}
-	}
-
-	/* return the size of the arguments to be passed in registers,
-	   padded to an 8 byte boundary to preserve stack alignment */
-	return ALIGN(MIN(stack - argp, 6*4), 8);
-}
-
-/* Perform machine dependent cif processing */
-ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
-{
-	ffi_type **ptr;
-	unsigned i, bytes = 0;
-
-	for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) {
-		if ((*ptr)->size == 0)
-			return FFI_BAD_TYPEDEF;
-
-		/* Perform a sanity check on the argument type, do this
-		   check after the initialization.  */
-		FFI_ASSERT_VALID_TYPE(*ptr);
-
-		/* Add any padding if necessary */
-		if (((*ptr)->alignment - 1) & bytes)
-			bytes = ALIGN(bytes, (*ptr)->alignment);
-
-		bytes += ALIGN((*ptr)->size, 4);
-	}
-
-	/* Ensure arg space is aligned to an 8-byte boundary */
-	bytes = ALIGN(bytes, 8);
-
-	/* Make space for the return structure pointer */
-	if (cif->rtype->type == FFI_TYPE_STRUCT) {
-		bytes += sizeof(void*);
-
-		/* Ensure stack is aligned to an 8-byte boundary */
-		bytes = ALIGN(bytes, 8);
-	}
-
-	cif->bytes = bytes;
-
-	/* Set the return type flag */
-	switch (cif->rtype->type) {
-	case FFI_TYPE_VOID:
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_DOUBLE:
-		cif->flags = (unsigned) cif->rtype->type;
-		break;
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_UINT64:
-		cif->flags = (unsigned) FFI_TYPE_SINT64;
-		break;
-	case FFI_TYPE_STRUCT:
-		/* Meta can store return values which are <= 64 bits */
-		if (cif->rtype->size <= 4)
-			/* Returned to D0Re0 as 32-bit value */
-			cif->flags = (unsigned)FFI_TYPE_INT;
-		else if ((cif->rtype->size > 4) && (cif->rtype->size <= 8))
-			/* Returned valued is stored to D1Re0|R0Re0 */
-			cif->flags = (unsigned)FFI_TYPE_DOUBLE;
-		else
-			/* value stored in memory */
-			cif->flags = (unsigned)FFI_TYPE_STRUCT;
-		break;
-	default:
-		cif->flags = (unsigned)FFI_TYPE_INT;
-		break;
-	}
-	return FFI_OK;
-}
-
-extern void ffi_call_SYSV(void (*fn)(void), extended_cif *, unsigned, unsigned, double *);
-
-/*
- * Exported in API. Entry point
- * cif -> ffi_cif object
- * fn -> function pointer
- * rvalue -> pointer to return value
- * avalue -> vector of void * pointers pointing to memory locations holding the
- * arguments
- */
-void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-	extended_cif ecif;
-
-	int small_struct = (((cif->flags == FFI_TYPE_INT) || (cif->flags == FFI_TYPE_DOUBLE)) && (cif->rtype->type == FFI_TYPE_STRUCT));
-	ecif.cif = cif;
-	ecif.avalue = avalue;
-
-	double temp;
-
-	/*
-	 * If the return value is a struct and we don't have a return value address
-	 * then we need to make one
-	 */
-
-	if ((rvalue == NULL ) && (cif->flags == FFI_TYPE_STRUCT))
-		ecif.rvalue = alloca(cif->rtype->size);
-	else if (small_struct)
-		ecif.rvalue = &temp;
-	else
-		ecif.rvalue = rvalue;
-
-	switch (cif->abi) {
-	case FFI_SYSV:
-		ffi_call_SYSV(fn, &ecif, cif->bytes, cif->flags, ecif.rvalue);
-		break;
-	default:
-		FFI_ASSERT(0);
-		break;
-	}
-
-	if (small_struct)
-		memcpy (rvalue, &temp, cif->rtype->size);
-}
-
-/* private members */
-
-static void ffi_prep_incoming_args_SYSV (char *, void **, void **,
-	ffi_cif*, float *);
-
-void ffi_closure_SYSV (ffi_closure *);
-
-/* Do NOT change that without changing the FFI_TRAMPOLINE_SIZE */
-extern unsigned int ffi_metag_trampoline[10]; /* 10 instructions */
-
-/* end of private members */
-
-/*
- * __tramp: trampoline memory location
- * __fun: assembly routine
- * __ctx: memory location for wrapper
- *
- * At this point, tramp[0] == __ctx !
- */
-void ffi_init_trampoline(unsigned char *__tramp, unsigned int __fun, unsigned int __ctx) {
-	memcpy (__tramp, ffi_metag_trampoline, sizeof(ffi_metag_trampoline));
-	*(unsigned int*) &__tramp[40] = __ctx;
-	*(unsigned int*) &__tramp[44] = __fun;
-	/* This will flush the instruction cache */
-	__builtin_meta2_cachewd(&__tramp[0], 1);
-	__builtin_meta2_cachewd(&__tramp[47], 1);
-}
-
-
-
-/* the cif must already be prepared */
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure *closure,
-	ffi_cif* cif,
-	void (*fun)(ffi_cif*,void*,void**,void*),
-	void *user_data,
-	void *codeloc)
-{
-	void (*closure_func)(ffi_closure*) = NULL;
-
-	if (cif->abi == FFI_SYSV)
-		closure_func = &ffi_closure_SYSV;
-	else
-		return FFI_BAD_ABI;
-
-	ffi_init_trampoline(
-		(unsigned char*)&closure->tramp[0],
-		(unsigned int)closure_func,
-		(unsigned int)codeloc);
-
-	closure->cif = cif;
-	closure->user_data = user_data;
-	closure->fun = fun;
-
-	return FFI_OK;
-}
-
-
-/* This function is jumped to by the trampoline */
-unsigned int ffi_closure_SYSV_inner (closure, respp, args, vfp_args)
-	ffi_closure *closure;
-	void **respp;
-	void *args;
-	void *vfp_args;
-{
-	ffi_cif *cif;
-	void **arg_area;
-
-	cif = closure->cif;
-	arg_area = (void**) alloca (cif->nargs * sizeof (void*));
-
-	/*
-	 * This call will initialize ARG_AREA, such that each
-	 * element in that array points to the corresponding
-	 * value on the stack; and if the function returns
-	 * a structure, it will re-set RESP to point to the
-	 * structure return address.
-	 */
-	ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args);
-
-	(closure->fun) ( cif, *respp, arg_area, closure->user_data);
-
-	return cif->flags;
-}
-
-static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
-	void **avalue, ffi_cif *cif,
-	float *vfp_stack)
-{
-	register unsigned int i;
-	register void **p_argv;
-	register char *argp;
-	register ffi_type **p_arg;
-
-	/* stack points to original arguments */
-	argp = stack;
-
-	/* Store return value */
-	if ( cif->flags == FFI_TYPE_STRUCT ) {
-		argp -= 4;
-		*rvalue = *(void **) argp;
-	}
-
-	p_argv = avalue;
-
-	for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) {
-		size_t z;
-		size_t alignment;
-
-		alignment = (*p_arg)->alignment;
-		if (alignment < 4)
-			alignment = 4;
-		if ((alignment - 1) & (unsigned)argp)
-			argp = (char *) ALIGN(argp, alignment);
-
-		z = (*p_arg)->size;
-		*p_argv = (void*) argp;
-		p_argv++;
-		argp -= z;
-	}
-	return;
-}
diff --git a/third_party/gofrontend/libffi/src/metag/ffitarget.h b/third_party/gofrontend/libffi/src/metag/ffitarget.h
deleted file mode 100644
index 7b9dbeb..0000000
--- a/third_party/gofrontend/libffi/src/metag/ffitarget.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2013 Imagination Technologies Ltd.
-   Target configuration macros for Meta
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV,
-  FFI_DEFAULT_ABI = FFI_SYSV,
-  FFI_LAST_ABI = FFI_DEFAULT_ABI + 1,
-} ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_TRAMPOLINE_SIZE 48
-#define FFI_NATIVE_RAW_API 0
-
-#endif
-
diff --git a/third_party/gofrontend/libffi/src/metag/sysv.S b/third_party/gofrontend/libffi/src/metag/sysv.S
deleted file mode 100644
index b4b2a3b..0000000
--- a/third_party/gofrontend/libffi/src/metag/sysv.S
+++ /dev/null
@@ -1,311 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2013 Imagination Technologies Ltd.
-
-   Meta Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-#ifdef HAVE_MACHINE_ASM_H
-#include <machine/asm.h>
-#else
-#ifdef __USER_LABEL_PREFIX__
-#define CONCAT1(a, b) CONCAT2(a, b)
-#define CONCAT2(a, b) a ## b
-
-/* Use the right prefix for global labels. */
-#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
-#else
-#define CNAME(x) x
-#endif
-#define ENTRY(x) .globl CNAME(x); .type CNAME(x), %function; CNAME(x):
-#endif
-
-#ifdef __ELF__
-#define LSYM(x) .x
-#else
-#define LSYM(x) x
-#endif
-
-.macro call_reg x=
-	.text
-	.balign 4
-	mov D1RtP, \x
-	swap D1RtP, PC
-.endm
-
-! Save register arguments
-.macro SAVE_ARGS
-	.text
-	.balign 4
-	setl	[A0StP++], D0Ar6, D1Ar5
-	setl	[A0StP++], D0Ar4, D1Ar3
-	setl	[A0StP++], D0Ar2, D1Ar1
-.endm
-
-! Save retrun, frame pointer and other regs
-.macro SAVE_REGS regs=
-	.text
-	.balign 4
-	setl	[A0StP++], D0FrT, D1RtP
-	! Needs to be a pair of regs
-	.ifnc "\regs",""
-	setl	[A0StP++], \regs
-	.endif
-.endm
-
-! Declare a global function
-.macro METAG_FUNC_START name
-	.text
-	.balign 4
-	ENTRY(\name)
-.endm
-
-! Return registers from the stack. Reverse SAVE_REGS operation
-.macro RET_REGS regs=, cond=
-	.ifnc "\regs", ""
-	getl	\regs, [--A0StP]
-	.endif
-	getl	D0FrT, D1RtP, [--A0StP]
-.endm
-
-! Return arguments
-.macro RET_ARGS
-	getl	D0Ar2, D1Ar1, [--A0StP]
-	getl	D0Ar4, D1Ar3, [--A0StP]
-	getl	D0Ar6, D1Ar5, [--A0StP]
-.endm
-
-
-	! D1Ar1:	fn
-	! D0Ar2:	&ecif
-	! D1Ar3:	cif->bytes
-	! D0Ar4:	fig->flags
-	! D1Ar5:	ecif.rvalue
-
-	! This assumes we are using GNU as
-METAG_FUNC_START ffi_call_SYSV
-	! Save argument registers
-
-	SAVE_ARGS
-
-	! new frame
-	mov	D0FrT, A0FrP
-	add     A0FrP, A0StP, #0
-
-	! Preserve the old frame pointer
-	SAVE_REGS "D1.5, D0.5"
-
-	! Make room for new args. cifs->bytes is the total space for input
-	! and return arguments
-
-	add	A0StP, A0StP, D1Ar3
-
-	! Preserve cifs->bytes & fn
-	mov	D0.5, D1Ar3
-	mov	D1.5, D1Ar1
-
-	! Place all of the ffi_prep_args in position
-	mov	D1Ar1, A0StP
-
-	! Call ffi_prep_args(stack, &ecif)
-#ifdef __PIC__
-	callr  D1RtP, CNAME(ffi_prep_args@PLT)
-#else
-	callr  D1RtP, CNAME(ffi_prep_args)
-#endif
-
-	! Restore fn pointer
-
-	! The foreign stack should look like this
-	! XXXXX XXXXXX <--- stack pointer
-	! FnArgN rvalue
-	! FnArgN+2 FnArgN+1
-	! FnArgN+4 FnArgN+3
-	! ....
-	!
-
-	! A0StP now points to the first (or return) argument + 4
-
-	! Preserve cif->bytes
-	getl	D0Ar2, D1Ar1, [--A0StP]
-	getl	D0Ar4, D1Ar3, [--A0StP]
-	getl	D0Ar6, D1Ar5, [--A0StP]
-
-	! Place A0StP to the first argument again
-	add	A0StP, A0StP, #24 ! That's because we loaded 6 regs x 4 byte each
-
-	! A0FrP points to the initial stack without the reserved space for the
-	! cifs->bytes, whilst A0StP points to the stack after the space allocation
-
-	! fn was the first argument of ffi_call_SYSV.
-	! The stack at this point looks like this:
-	!
-	! A0StP(on entry to _SYSV) ->	Arg6	Arg5     | low
-	!				Arg4	Arg3     |
-	! 				Arg2	Arg1     |
-	! A0FrP ---->			D0FrtP	D1RtP    |
-	!				D1.5	D0.5	 |
-	! A0StP(bf prep_args) ->	FnArgn	FnArgn-1 |
-	!				FnArgn-2FnArgn-3 |
-	!				................ | <= cifs->bytes
-	!				FnArg4  FnArg3	 |
-	! A0StP (prv_A0StP+cifs->bytes) FnArg2  FnArg1   | high
-	!
-	! fn was in Arg1 so it's located in in A0FrP+#-0xC
-	!
-
-	! D0Re0 contains the size of arguments stored in registers
-	sub	A0StP, A0StP, D0Re0
-
-	! Arg1 is the function pointer for the foreign call. This has been
-	! preserved in D1.5
-
-	! Time to call (fn). Arguments should be like this:
-	! Arg1-Arg6 are loaded to regs
-	! The rest of the arguments are stored in stack pointed by A0StP
-
-	call_reg D1.5
-
-	! Reset stack.
-
-	mov	A0StP, A0FrP
-
-	! Load Arg1 with the pointer to storage for the return type
-	! This was stored in Arg5
-
-	getd	D1Ar1, [A0FrP+#-20]
-
-	! Load D0Ar2 with the return type code. This was stored in Arg4 (flags)
-
-	getd	D0Ar2, [A0FrP+#-16]
-
-	! We are ready to start processing the return value
-	! D0Re0 (and D1Re0) hold the return value
-
-	! If the return value is NULL, assume no return value
-	cmp	D1Ar1, #0
-	beq	LSYM(Lepilogue)
-
-	! return INT
-	cmp		D0Ar2, #FFI_TYPE_INT
-	! Sadly, there is no setd{cc} instruction so we need to workaround that
-	bne	.INT64
-	setd	[D1Ar1], D0Re0
-	b	LSYM(Lepilogue)
-
-	! return INT64
-.INT64:
-	cmp	D0Ar2, #FFI_TYPE_SINT64
-	setleq	[D1Ar1], D0Re0, D1Re0
-
-	! return DOUBLE
-	cmp	D0Ar2, #FFI_TYPE_DOUBLE
-	setl	[D1AR1++], D0Re0, D1Re0
-
-LSYM(Lepilogue):
-	! At this point, the stack pointer points right after the argument
-	! saved area. We need to restore 4 regs, therefore we need to move
-	! 16 bytes ahead.
-	add     A0StP, A0StP, #16
-	RET_REGS "D1.5, D0.5"
-	RET_ARGS
-	getd	D0Re0, [A0StP]
-	mov     A0FrP, D0FrT
-	swap	D1RtP, PC
-
-.ffi_call_SYSV_end:
-       .size   CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
-
-
-/*
-	(called by ffi_metag_trampoline)
-	void ffi_closure_SYSV (ffi_closure*)
-
-	(called by ffi_closure_SYSV)
-	unsigned int FFI_HIDDEN
-	ffi_closure_SYSV_inner (closure,respp, args)
-		ffi_closure *closure;
-		void **respp;
-		void *args;
-*/
-
-METAG_FUNC_START ffi_closure_SYSV
-	! We assume that D1Ar1 holds the address of the
-	! ffi_closure struct. We will use that to fetch the
-	! arguments. The stack pointer points to an empty space
-	! and it is ready to store more data.
-
-	! D1Ar1 is ready
-	! Allocate stack space for return value
-	add A0StP, A0StP, #8
-	! Store it to D0Ar2
-	sub D0Ar2, A0StP, #8
-
-	sub D1Ar3, A0FrP, #4
-
-	! D1Ar3 contains the address of the original D1Ar1 argument
-	! We need to subtract #4 later on
-
-	! Preverve D0Ar2
-	mov D0.5, D0Ar2
-
-#ifdef __PIC__
-	callr D1RtP, CNAME(ffi_closure_SYSV_inner@PLT)
-#else
-	callr D1RtP, CNAME(ffi_closure_SYSV_inner)
-#endif
-
-	! Check the return value and store it to D0.5
-	cmp D0Re0, #FFI_TYPE_INT
-	beq .Lretint
-	cmp D0Re0, #FFI_TYPE_DOUBLE
-	beq .Lretdouble
-.Lclosure_epilogue:
-	sub A0StP, A0StP, #8
-	RET_REGS "D1.5, D0.5"
-	RET_ARGS
-	swap	D1RtP, PC
-
-.Lretint:
-	setd [D0.5], D0Re0
-	b .Lclosure_epilogue
-.Lretdouble:
-	setl [D0.5++], D0Re0, D1Re0
-	b .Lclosure_epilogue
-.ffi_closure_SYSV_end:
-.size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
-
-
-ENTRY(ffi_metag_trampoline)
-	SAVE_ARGS
-	! New frame
-	mov A0FrP, A0StP
-	SAVE_REGS "D1.5, D0.5"
-	mov D0.5, PC
-	! Load D1Ar1 the value of ffi_metag_trampoline
-	getd D1Ar1, [D0.5 + #8]
-	! Jump to ffi_closure_SYSV
-	getd PC, [D0.5 + #12]
diff --git a/third_party/gofrontend/libffi/src/microblaze/ffi.c b/third_party/gofrontend/libffi/src/microblaze/ffi.c
deleted file mode 100644
index ea962ea..0000000
--- a/third_party/gofrontend/libffi/src/microblaze/ffi.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2012, 2013 Xilinx, Inc
-
-   MicroBlaze Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-extern void ffi_call_SYSV(void (*)(void*, extended_cif*), extended_cif*,
-		unsigned int, unsigned int, unsigned int*, void (*fn)(void),
-		unsigned int, unsigned int);
-
-extern void ffi_closure_SYSV(void);
-
-#define WORD_SIZE			sizeof(unsigned int)
-#define ARGS_REGISTER_SIZE	(WORD_SIZE * 6)
-#define WORD_ALIGN(x)		ALIGN(x, WORD_SIZE)
-
-/* ffi_prep_args is called by the assembly routine once stack space
-   has been allocated for the function's arguments */
-void ffi_prep_args(void* stack, extended_cif* ecif)
-{
-	unsigned int i;
-	ffi_type** p_arg;
-	void** p_argv;
-	void* stack_args_p = stack;
-
-	p_argv = ecif->avalue;
-
-	if (ecif == NULL || ecif->cif == NULL) {
-		return; /* no description to prepare */
-	}
-
-	if ((ecif->cif->rtype != NULL) &&
-			(ecif->cif->rtype->type == FFI_TYPE_STRUCT))
-	{
-		/* if return type is a struct which is referenced on the stack/reg5,
-		 * by a pointer. Stored the return value pointer in r5.
-		 */
-		char* addr = stack_args_p;
-		memcpy(addr, &(ecif->rvalue), WORD_SIZE);
-		stack_args_p += WORD_SIZE;
-	}
-
-	if (ecif->avalue == NULL) {
-		return; /* no arguments to prepare */
-	}
-
-	for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs;
-			i++, p_arg++)
-	{
-		size_t size = (*p_arg)->size;
-		int type = (*p_arg)->type;
-		void* value = p_argv[i];
-		char* addr = stack_args_p;
-		int aligned_size = WORD_ALIGN(size);
-
-		/* force word alignment on the stack */
-		stack_args_p += aligned_size;
-		
-		switch (type)
-		{
-			case FFI_TYPE_UINT8:
-				*(unsigned int *)addr = (unsigned int)*(UINT8*)(value);
-				break;
-			case FFI_TYPE_SINT8:
-				*(signed int *)addr = (signed int)*(SINT8*)(value);
-				break;
-			case FFI_TYPE_UINT16:
-				*(unsigned int *)addr = (unsigned int)*(UINT16*)(value);
-				break;
-			case FFI_TYPE_SINT16:
-				*(signed int *)addr = (signed int)*(SINT16*)(value);
-				break;
-			case FFI_TYPE_STRUCT:
-#if __BIG_ENDIAN__
-				/*
-				 * MicroBlaze toolchain appears to emit:
-				 * bsrli r5, r5, 8 (caller)
-				 * ...
-				 * <branch to callee>
-				 * ...
-				 * bslli r5, r5, 8 (callee)
-				 * 
-				 * For structs like "struct a { uint8_t a[3]; };", when passed
-				 * by value.
-				 *
-				 * Structs like "struct b { uint16_t a; };" are also expected
-				 * to be packed strangely in registers.
-				 *
-				 * This appears to be because the microblaze toolchain expects
-				 * "struct b == uint16_t", which is only any issue for big
-				 * endian.
-				 *
-				 * The following is a work around for big-endian only, for the
-				 * above mentioned case, it will re-align the contents of a
-				 * <= 3-byte struct value.
-				 */
-				if (size < WORD_SIZE)
-				{
-				  memcpy (addr + (WORD_SIZE - size), value, size);
-				  break;
-				}
-#endif
-			case FFI_TYPE_SINT32:
-			case FFI_TYPE_UINT32:
-			case FFI_TYPE_FLOAT:
-			case FFI_TYPE_SINT64:
-			case FFI_TYPE_UINT64:
-			case FFI_TYPE_DOUBLE:
-			default:
-				memcpy(addr, value, aligned_size);
-		}
-	}
-}
-
-ffi_status ffi_prep_cif_machdep(ffi_cif* cif)
-{
-	/* check ABI */
-	switch (cif->abi)
-	{
-		case FFI_SYSV:
-			break;
-		default:
-			return FFI_BAD_ABI;
-	}
-	return FFI_OK;
-}
-
-void ffi_call(ffi_cif* cif, void (*fn)(void), void* rvalue, void** avalue)
-{
-	extended_cif ecif;
-	ecif.cif = cif;
-	ecif.avalue = avalue;
-
-	/* If the return value is a struct and we don't have a return */
-	/* value address then we need to make one */
-	if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) {
-		ecif.rvalue = alloca(cif->rtype->size);
-	} else {
-		ecif.rvalue = rvalue;
-	}
-
-	switch (cif->abi)
-	{
-	case FFI_SYSV:
-		ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags,
-				ecif.rvalue, fn, cif->rtype->type, cif->rtype->size);
-		break;
-	default:
-		FFI_ASSERT(0);
-		break;
-	}
-}
-
-void ffi_closure_call_SYSV(void* register_args, void* stack_args,
-			ffi_closure* closure, void* rvalue,
-			unsigned int* rtype, unsigned int* rsize)
-{
-	/* prepare arguments for closure call */
-	ffi_cif* cif = closure->cif;
-	ffi_type** arg_types = cif->arg_types;
-
-	/* re-allocate data for the args. This needs to be done in order to keep
-	 * multi-word objects (e.g. structs) in contiguous memory. Callers are not
-	 * required to store the value of args in the lower 6 words in the stack
-	 * (although they are allocated in the stack).
-	 */
-	char* stackclone = alloca(cif->bytes);
-	void** avalue = alloca(cif->nargs * sizeof(void*));
-	void* struct_rvalue = NULL;
-	char* ptr = stackclone;
-	int i;
-
-	/* copy registers into stack clone */
-	int registers_used = cif->bytes;
-	if (registers_used > ARGS_REGISTER_SIZE) {
-		registers_used = ARGS_REGISTER_SIZE;
-	}
-	memcpy(stackclone, register_args, registers_used);
-
-	/* copy stack allocated args into stack clone */
-	if (cif->bytes > ARGS_REGISTER_SIZE) {
-		int stack_used = cif->bytes - ARGS_REGISTER_SIZE;
-		memcpy(stackclone + ARGS_REGISTER_SIZE, stack_args, stack_used);
-	}
-
-	/* preserve struct type return pointer passing */
-	if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) {
-		struct_rvalue = *((void**)ptr);
-		ptr += WORD_SIZE;
-	}
-
-	/* populate arg pointer list */
-	for (i = 0; i < cif->nargs; i++)
-	{
-		switch (arg_types[i]->type)
-		{
-			case FFI_TYPE_SINT8:
-			case FFI_TYPE_UINT8:
-#ifdef __BIG_ENDIAN__
-				avalue[i] = ptr + 3;
-#else
-				avalue[i] = ptr;
-#endif
-				break;
-			case FFI_TYPE_SINT16:
-			case FFI_TYPE_UINT16:
-#ifdef __BIG_ENDIAN__
-				avalue[i] = ptr + 2;
-#else
-				avalue[i] = ptr;
-#endif
-				break;
-			case FFI_TYPE_STRUCT:
-#if __BIG_ENDIAN__
-				/*
-				 * Work around strange ABI behaviour.
-				 * (see info in ffi_prep_args)
-				 */
-				if (arg_types[i]->size < WORD_SIZE)
-				{
-				  memcpy (ptr, ptr + (WORD_SIZE - arg_types[i]->size), arg_types[i]->size);
-				}
-#endif
-				avalue[i] = (void*)ptr;
-				break;
-			case FFI_TYPE_UINT64:
-			case FFI_TYPE_SINT64:
-			case FFI_TYPE_DOUBLE:
-				avalue[i] = ptr;
-				break;
-			case FFI_TYPE_SINT32:
-			case FFI_TYPE_UINT32:
-			case FFI_TYPE_FLOAT:
-			default:
-				/* default 4-byte argument */
-				avalue[i] = ptr;
-				break;
-		}
-		ptr += WORD_ALIGN(arg_types[i]->size);
-	}
-
-	/* set the return type info passed back to the wrapper */
-	*rsize = cif->rtype->size;
-	*rtype = cif->rtype->type;
-	if (struct_rvalue != NULL) {
-		closure->fun(cif, struct_rvalue, avalue, closure->user_data);
-		/* copy struct return pointer value into function return value */
-		*((void**)rvalue) = struct_rvalue;
-	} else {
-		closure->fun(cif, rvalue, avalue, closure->user_data);
-	}
-}
-
-ffi_status ffi_prep_closure_loc(
-		ffi_closure* closure, ffi_cif* cif,
-		void (*fun)(ffi_cif*, void*, void**, void*),
-		void* user_data, void* codeloc)
-{
-	unsigned long* tramp = (unsigned long*)&(closure->tramp[0]);
-	unsigned long cls = (unsigned long)codeloc;
-	unsigned long fn = 0;
-	unsigned long fn_closure_call_sysv = (unsigned long)ffi_closure_call_SYSV;
-
-	closure->cif = cif;
-	closure->fun = fun;
-	closure->user_data = user_data;
-
-	switch (cif->abi)
-	{
-	case FFI_SYSV:
-		fn = (unsigned long)ffi_closure_SYSV;
-
-		/* load r11 (temp) with fn */
-		/* imm fn(upper) */
-		tramp[0] = 0xb0000000 | ((fn >> 16) & 0xffff);
-		/* addik r11, r0, fn(lower) */
-		tramp[1] = 0x31600000 | (fn & 0xffff);
-
-		/* load r12 (temp) with cls */
-		/* imm cls(upper) */
-		tramp[2] = 0xb0000000 | ((cls >> 16) & 0xffff);
-		/* addik r12, r0, cls(lower) */
-		tramp[3] = 0x31800000 | (cls & 0xffff);
-
-		/* load r3 (temp) with ffi_closure_call_SYSV */
-		/* imm fn_closure_call_sysv(upper) */
-		tramp[4] = 0xb0000000 | ((fn_closure_call_sysv >> 16) & 0xffff);
-		/* addik r3, r0, fn_closure_call_sysv(lower) */
-		tramp[5] = 0x30600000 | (fn_closure_call_sysv & 0xffff);
-		/* branch/jump to address stored in r11 (fn) */
-		tramp[6] = 0x98085800; /* bra r11 */
-
-		break;
-	default:
-		return FFI_BAD_ABI;
-	}
-	return FFI_OK;
-}
diff --git a/third_party/gofrontend/libffi/src/microblaze/ffitarget.h b/third_party/gofrontend/libffi/src/microblaze/ffitarget.h
deleted file mode 100644
index c6fa5a4..0000000
--- a/third_party/gofrontend/libffi/src/microblaze/ffitarget.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffitarget.h - Copyright (c) 2012, 2013 Xilinx, Inc
-
-   Target configuration macros for MicroBlaze.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#ifndef LIBFFI_ASM
-typedef unsigned long			ffi_arg;
-typedef signed long			ffi_sarg;
-
-typedef enum ffi_abi {
-	FFI_FIRST_ABI = 0,
-	FFI_SYSV,
-	FFI_LAST_ABI,
-	FFI_DEFAULT_ABI = FFI_SYSV
-} ffi_abi;
-#endif
-
-/* Definitions for closures */
-
-#define FFI_CLOSURES 1
-#define FFI_NATIVE_RAW_API 0
-
-#define FFI_TRAMPOLINE_SIZE (4*8)
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/microblaze/sysv.S b/third_party/gofrontend/libffi/src/microblaze/sysv.S
deleted file mode 100644
index ea43e9d..0000000
--- a/third_party/gofrontend/libffi/src/microblaze/sysv.S
+++ /dev/null
@@ -1,302 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2012, 2013 Xilinx, Inc
-
-   MicroBlaze Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-
-	/*
-	 * arg[0] (r5)  = ffi_prep_args,
-	 * arg[1] (r6)  = &ecif,
-	 * arg[2] (r7)  = cif->bytes,
-	 * arg[3] (r8)  = cif->flags,
-	 * arg[4] (r9)  = ecif.rvalue,
-	 * arg[5] (r10) = fn
-	 * arg[6] (sp[0]) = cif->rtype->type
-	 * arg[7] (sp[4]) = cif->rtype->size
-	 */
-	.text
-	.globl ffi_call_SYSV
-	.type ffi_call_SYSV, @function
-ffi_call_SYSV:
-	/* push callee saves */
-	addik r1, r1, -20
-	swi r19, r1, 0 /* Frame Pointer */
-	swi r20, r1, 4 /* PIC register */
-	swi r21, r1, 8 /* PIC register */
-	swi r22, r1, 12 /* save for locals */
-	swi r23, r1, 16 /* save for locals */
-	
-	/* save the r5-r10 registers in the stack */
-	addik r1, r1, -24 /* increment sp to store 6x 32-bit words */
-	swi r5, r1, 0
-	swi r6, r1, 4
-	swi r7, r1, 8
-	swi r8, r1, 12
-	swi r9, r1, 16
-	swi r10, r1, 20
-
-	/* save function pointer */
-	addik r3, r5, 0 /* copy ffi_prep_args into r3 */
-	addik r22, r1, 0 /* save sp for unallocated args into r22 (callee-saved) */
-	addik r23, r10, 0 /* save function address into r23 (callee-saved) */
-
-	/* prepare stack with allocation for n (bytes = r7) args */
-	rsub r1, r7, r1 /* subtract bytes from sp */
-
-	/* prep args for ffi_prep_args call */
-	addik r5, r1, 0 /* store stack pointer into arg[0] */
-	/* r6 still holds ecif for arg[1] */
-
-	/* Call ffi_prep_args(stack, &ecif). */
-	addik r1, r1, -4
-	swi r15, r1, 0 /* store the link register in the frame */
-	brald r15, r3
-	nop /* branch has delay slot */
-	lwi r15, r1, 0
-	addik r1, r1, 4 /* restore the link register from the frame */
-	/* returns calling stack pointer location */
-
-	/* prepare args for fn call, prep_args populates them onto the stack */
-	lwi r5, r1, 0 /* arg[0] */
-	lwi r6, r1, 4 /* arg[1] */
-	lwi r7, r1, 8 /* arg[2] */
-	lwi r8, r1, 12 /* arg[3] */
-	lwi r9, r1, 16 /* arg[4] */
-	lwi r10, r1, 20 /* arg[5] */
-
-	/* call (fn) (...). */
-	addik r1, r1, -4
-	swi r15, r1, 0 /* store the link register in the frame */
-	brald r15, r23
-	nop /* branch has delay slot */
-	lwi r15, r1, 0
-	addik r1, r1, 4 /* restore the link register from the frame */
-
-	/* Remove the space we pushed for the args. */
-	addik r1, r22, 0 /* restore old SP */
-
-	/* restore this functions parameters */
-	lwi r5, r1, 0 /* arg[0] */
-	lwi r6, r1, 4 /* arg[1] */
-	lwi r7, r1, 8 /* arg[2] */
-	lwi r8, r1, 12 /* arg[3] */
-	lwi r9, r1, 16 /* arg[4] */
-	lwi r10, r1, 20 /* arg[5] */
-	addik r1, r1, 24 /* decrement sp to de-allocate 6x 32-bit words */
-
-	/* If the return value pointer is NULL, assume no return value. */
-	beqi r9, ffi_call_SYSV_end
-
-	lwi r22, r1, 48 /* get return type (20 for locals + 28 for arg[6]) */
-	lwi r23, r1, 52 /* get return size (20 for locals + 32 for arg[7])  */
-	
-	/* Check if return type is actually a struct, do nothing */
-	rsubi r11, r22, FFI_TYPE_STRUCT
-	beqi r11, ffi_call_SYSV_end
-
-	/* Return 8bit */
-	rsubi r11, r23, 1
-	beqi r11, ffi_call_SYSV_store8
-
-	/* Return 16bit */
-	rsubi r11, r23, 2
-	beqi r11, ffi_call_SYSV_store16
-
-	/* Return 32bit */
-	rsubi r11, r23, 4
-	beqi r11, ffi_call_SYSV_store32
-
-	/* Return 64bit */
-	rsubi r11, r23, 8
-	beqi r11, ffi_call_SYSV_store64
-
-	/* Didn't match anything */
-	bri ffi_call_SYSV_end
-
-ffi_call_SYSV_store64:
-	swi r3, r9, 0 /* store word r3 into return value */
-	swi r4, r9, 4 /* store word r4 into return value */
-	bri ffi_call_SYSV_end
-
-ffi_call_SYSV_store32:
-	swi r3, r9, 0 /* store word r3 into return value */
-	bri ffi_call_SYSV_end
-
-ffi_call_SYSV_store16:
-#ifdef __BIG_ENDIAN__
-	shi r3, r9, 2 /* store half-word r3 into return value */
-#else
-	shi r3, r9, 0 /* store half-word r3 into return value */
-#endif
-	bri ffi_call_SYSV_end
-
-ffi_call_SYSV_store8:
-#ifdef __BIG_ENDIAN__
-	sbi r3, r9, 3 /* store byte r3 into return value */
-#else
-	sbi r3, r9, 0 /* store byte r3 into return value */
-#endif
-	bri ffi_call_SYSV_end
-
-ffi_call_SYSV_end:
-	/* callee restores */
-	lwi r19, r1, 0 /* frame pointer */
-	lwi r20, r1, 4 /* PIC register */
-	lwi r21, r1, 8 /* PIC register */
-	lwi r22, r1, 12
-	lwi r23, r1, 16
-	addik r1, r1, 20
-
-	/* return from sub-routine (with delay slot) */
-	rtsd r15, 8
-	nop
-
-	.size ffi_call_SYSV, . - ffi_call_SYSV
-
-/* ------------------------------------------------------------------------- */
-
-	/*
-	 * args passed into this function, are passed down to the callee.
-	 * this function is the target of the closure trampoline, as such r12 is 
-	 * a pointer to the closure object.
-	 */
-	.text
-	.globl ffi_closure_SYSV
-	.type ffi_closure_SYSV, @function
-ffi_closure_SYSV:
-	/* push callee saves */
-	addik r11, r1, 28 /* save stack args start location (excluding regs/link) */
-	addik r1, r1, -12
-	swi r19, r1, 0 /* Frame Pointer */
-	swi r20, r1, 4 /* PIC register */
-	swi r21, r1, 8 /* PIC register */
-
-	/* store register args on stack */
-	addik r1, r1, -24
-	swi r5, r1, 0
-	swi r6, r1, 4
-	swi r7, r1, 8
-	swi r8, r1, 12
-	swi r9, r1, 16
-	swi r10, r1, 20
-
-	/* setup args */
-	addik r5, r1, 0 /* register_args */
-	addik r6, r11, 0 /* stack_args */
-	addik r7, r12, 0 /* closure object */
-	addik r1, r1, -8 /* allocate return value */
-	addik r8, r1, 0 /* void* rvalue */
-	addik r1, r1, -8 /* allocate for return type/size values */
-	addik r9, r1, 0 /* void* rtype */
-	addik r10, r1, 4 /* void* rsize */
-
-	/* call the wrap_call function */
-	addik r1, r1, -28 /* allocate args + link reg */
-	swi r15, r1, 0 /* store the link register in the frame */
-	brald r15, r3
-	nop /* branch has delay slot */
-	lwi r15, r1, 0
-	addik r1, r1, 28 /* restore the link register from the frame */
-
-ffi_closure_SYSV_prepare_return:
-	lwi r9, r1, 0 /* rtype */
-	lwi r10, r1, 4 /* rsize */
-	addik r1, r1, 8 /* de-allocate return info values */
-
-	/* Check if return type is actually a struct, store 4 bytes */
-	rsubi r11, r9, FFI_TYPE_STRUCT
-	beqi r11, ffi_closure_SYSV_store32
-
-	/* Return 8bit */
-	rsubi r11, r10, 1
-	beqi r11, ffi_closure_SYSV_store8
-
-	/* Return 16bit */
-	rsubi r11, r10, 2
-	beqi r11, ffi_closure_SYSV_store16
-
-	/* Return 32bit */
-	rsubi r11, r10, 4
-	beqi r11, ffi_closure_SYSV_store32
-
-	/* Return 64bit */
-	rsubi r11, r10, 8
-	beqi r11, ffi_closure_SYSV_store64
-
-	/* Didn't match anything */
-	bri ffi_closure_SYSV_end
-
-ffi_closure_SYSV_store64:
-	lwi r3, r1, 0 /* store word r3 into return value */
-	lwi r4, r1, 4 /* store word r4 into return value */
-	/* 64 bits == 2 words, no sign extend occurs */
-	bri ffi_closure_SYSV_end
-
-ffi_closure_SYSV_store32:
-	lwi r3, r1, 0 /* store word r3 into return value */
-	/* 32 bits == 1 word, no sign extend occurs */
-	bri ffi_closure_SYSV_end
-
-ffi_closure_SYSV_store16:
-#ifdef __BIG_ENDIAN__
-	lhui r3, r1, 2 /* store half-word r3 into return value */
-#else
-	lhui r3, r1, 0 /* store half-word r3 into return value */
-#endif
-	rsubi r11, r9, FFI_TYPE_SINT16
-	bnei r11, ffi_closure_SYSV_end
-	sext16 r3, r3 /* fix sign extend of sint8 */
-	bri ffi_closure_SYSV_end
-
-ffi_closure_SYSV_store8:
-#ifdef __BIG_ENDIAN__
-	lbui r3, r1, 3 /* store byte r3 into return value */
-#else
-	lbui r3, r1, 0 /* store byte r3 into return value */
-#endif
-	rsubi r11, r9, FFI_TYPE_SINT8
-	bnei r11, ffi_closure_SYSV_end
-	sext8 r3, r3 /* fix sign extend of sint8 */
-	bri ffi_closure_SYSV_end
-
-ffi_closure_SYSV_end:
-	addik r1, r1, 8 /* de-allocate return value */
-
-	/* de-allocate stored args */
-	addik r1, r1, 24
-
-	/* callee restores */
-	lwi r19, r1, 0 /* frame pointer */
-	lwi r20, r1, 4 /* PIC register */
-	lwi r21, r1, 8 /* PIC register */
-	addik r1, r1, 12
-
-	/* return from sub-routine (with delay slot) */
-	rtsd r15, 8
-	nop
-
-	.size ffi_closure_SYSV, . - ffi_closure_SYSV
diff --git a/third_party/gofrontend/libffi/src/mips/ffi.c b/third_party/gofrontend/libffi/src/mips/ffi.c
deleted file mode 100644
index 5d0dd70..0000000
--- a/third_party/gofrontend/libffi/src/mips/ffi.c
+++ /dev/null
@@ -1,1050 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2011  Anthony Green
-           Copyright (c) 2008  David Daney
-           Copyright (c) 1996, 2007, 2008, 2011  Red Hat, Inc.
-   
-   MIPS Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-
-#ifdef __GNUC__
-#  if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))
-#    define USE__BUILTIN___CLEAR_CACHE 1
-#  endif
-#endif
-
-#ifndef USE__BUILTIN___CLEAR_CACHE
-#  if defined(__OpenBSD__)
-#    include <mips64/sysarch.h>
-#  else
-#    include <sys/cachectl.h>
-#  endif
-#endif
-
-#ifdef FFI_DEBUG
-# define FFI_MIPS_STOP_HERE() ffi_stop_here()
-#else
-# define FFI_MIPS_STOP_HERE() do {} while(0)
-#endif
-
-#ifdef FFI_MIPS_N32
-#define FIX_ARGP \
-FFI_ASSERT(argp <= &stack[bytes]); \
-if (argp == &stack[bytes]) \
-{ \
-  argp = stack; \
-  FFI_MIPS_STOP_HERE(); \
-}
-#else
-#define FIX_ARGP 
-#endif
-
-
-/* ffi_prep_args is called by the assembly routine once stack space
-   has been allocated for the function's arguments */
-
-static void ffi_prep_args(char *stack, 
-			  extended_cif *ecif,
-			  int bytes,
-			  int flags)
-{
-  int i;
-  void **p_argv;
-  char *argp;
-  ffi_type **p_arg;
-
-#ifdef FFI_MIPS_N32
-  /* If more than 8 double words are used, the remainder go
-     on the stack. We reorder stuff on the stack here to 
-     support this easily. */
-  if (bytes > 8 * sizeof(ffi_arg))
-    argp = &stack[bytes - (8 * sizeof(ffi_arg))];
-  else
-    argp = stack;
-#else
-  argp = stack;
-#endif
-
-  memset(stack, 0, bytes);
-
-#ifdef FFI_MIPS_N32
-  if ( ecif->cif->rstruct_flag != 0 )
-#else
-  if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT )
-#endif  
-    {
-      *(ffi_arg *) argp = (ffi_arg) ecif->rvalue;
-      argp += sizeof(ffi_arg);
-      FIX_ARGP;
-    }
-
-  p_argv = ecif->avalue;
-
-  for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; i++, p_arg++)
-    {
-      size_t z;
-      unsigned int a;
-
-      /* Align if necessary.  */
-      a = (*p_arg)->alignment;
-      if (a < sizeof(ffi_arg))
-        a = sizeof(ffi_arg);
-      
-      if ((a - 1) & (unsigned long) argp)
-	{
-	  argp = (char *) ALIGN(argp, a);
-	  FIX_ARGP;
-	}
-
-      z = (*p_arg)->size;
-      if (z <= sizeof(ffi_arg))
-	{
-          int type = (*p_arg)->type;
-	  z = sizeof(ffi_arg);
-
-          /* The size of a pointer depends on the ABI */
-          if (type == FFI_TYPE_POINTER)
-            type = (ecif->cif->abi == FFI_N64
-		    || ecif->cif->abi == FFI_N64_SOFT_FLOAT)
-	      ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32;
-
-	if (i < 8 && (ecif->cif->abi == FFI_N32_SOFT_FLOAT
-		      || ecif->cif->abi == FFI_N64_SOFT_FLOAT))
-	  {
-	    switch (type)
-	      {
-	      case FFI_TYPE_FLOAT:
-		type = FFI_TYPE_UINT32;
-		break;
-	      case FFI_TYPE_DOUBLE:
-		type = FFI_TYPE_UINT64;
-		break;
-	      default:
-		break;
-	      }
-	  }
-	  switch (type)
-	    {
-	      case FFI_TYPE_SINT8:
-		*(ffi_arg *)argp = *(SINT8 *)(* p_argv);
-		break;
-
-	      case FFI_TYPE_UINT8:
-		*(ffi_arg *)argp = *(UINT8 *)(* p_argv);
-		break;
-		  
-	      case FFI_TYPE_SINT16:
-		*(ffi_arg *)argp = *(SINT16 *)(* p_argv);
-		break;
-		  
-	      case FFI_TYPE_UINT16:
-		*(ffi_arg *)argp = *(UINT16 *)(* p_argv);
-		break;
-		  
-	      case FFI_TYPE_SINT32:
-		*(ffi_arg *)argp = *(SINT32 *)(* p_argv);
-		break;
-		  
-	      case FFI_TYPE_UINT32:
-#ifdef FFI_MIPS_N32
-		/* The N32 ABI requires that 32-bit integers
-		   be sign-extended to 64-bits, regardless of
-		   whether they are signed or unsigned. */
-		*(ffi_arg *)argp = *(SINT32 *)(* p_argv);
-#else
-		*(ffi_arg *)argp = *(UINT32 *)(* p_argv);
-#endif
-		break;
-
-	      /* This can only happen with 64bit slots.  */
-	      case FFI_TYPE_FLOAT:
-		*(float *) argp = *(float *)(* p_argv);
-		break;
-
-	      /* Handle structures.  */
-	      default:
-		memcpy(argp, *p_argv, (*p_arg)->size);
-		break;
-	    }
-	}
-      else
-	{
-#ifdef FFI_MIPS_O32
-	  memcpy(argp, *p_argv, z);
-#else
-	  {
-	    unsigned long end = (unsigned long) argp + z;
-	    unsigned long cap = (unsigned long) stack + bytes;
-
-	    /* Check if the data will fit within the register space.
-	       Handle it if it doesn't.  */
-
-	    if (end <= cap)
-	      memcpy(argp, *p_argv, z);
-	    else
-	      {
-		unsigned long portion = cap - (unsigned long)argp;
-
-		memcpy(argp, *p_argv, portion);
-		argp = stack;
-                z -= portion;
-		memcpy(argp, (void*)((unsigned long)(*p_argv) + portion),
-                       z);
-	      }
-	  }
-#endif
-      }
-      p_argv++;
-      argp += z;
-      FIX_ARGP;
-    }
-}
-
-#ifdef FFI_MIPS_N32
-
-/* The n32 spec says that if "a chunk consists solely of a double 
-   float field (but not a double, which is part of a union), it
-   is passed in a floating point register. Any other chunk is
-   passed in an integer register". This code traverses structure
-   definitions and generates the appropriate flags. */
-
-static unsigned
-calc_n32_struct_flags(int soft_float, ffi_type *arg,
-		      unsigned *loc, unsigned *arg_reg)
-{
-  unsigned flags = 0;
-  unsigned index = 0;
-
-  ffi_type *e;
-
-  if (soft_float)
-    return 0;
-
-  while ((e = arg->elements[index]))
-    {
-      /* Align this object.  */
-      *loc = ALIGN(*loc, e->alignment);
-      if (e->type == FFI_TYPE_DOUBLE)
-	{
-          /* Already aligned to FFI_SIZEOF_ARG.  */
-          *arg_reg = *loc / FFI_SIZEOF_ARG;
-          if (*arg_reg > 7)
-            break;
-	  flags += (FFI_TYPE_DOUBLE << (*arg_reg * FFI_FLAG_BITS));
-          *loc += e->size;
-	}
-      else
-        *loc += e->size;
-      index++;
-    }
-  /* Next Argument register at alignment of FFI_SIZEOF_ARG.  */
-  *arg_reg = ALIGN(*loc, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
-
-  return flags;
-}
-
-static unsigned
-calc_n32_return_struct_flags(int soft_float, ffi_type *arg)
-{
-  unsigned flags = 0;
-  unsigned small = FFI_TYPE_SMALLSTRUCT;
-  ffi_type *e;
-
-  /* Returning structures under n32 is a tricky thing.
-     A struct with only one or two floating point fields 
-     is returned in $f0 (and $f2 if necessary). Any other
-     struct results at most 128 bits are returned in $2
-     (the first 64 bits) and $3 (remainder, if necessary).
-     Larger structs are handled normally. */
-  
-  if (arg->size > 16)
-    return 0;
-
-  if (arg->size > 8)
-    small = FFI_TYPE_SMALLSTRUCT2;
-
-  e = arg->elements[0];
-
-  if (e->type == FFI_TYPE_DOUBLE)
-    flags = FFI_TYPE_DOUBLE;
-  else if (e->type == FFI_TYPE_FLOAT)
-    flags = FFI_TYPE_FLOAT;
-
-  if (flags && (e = arg->elements[1]))
-    {
-      if (e->type == FFI_TYPE_DOUBLE)
-	flags += FFI_TYPE_DOUBLE << FFI_FLAG_BITS;
-      else if (e->type == FFI_TYPE_FLOAT)
-	flags += FFI_TYPE_FLOAT << FFI_FLAG_BITS;
-      else 
-	return small;
-
-      if (flags && (arg->elements[2]))
-	{
-	  /* There are three arguments and the first two are 
-	     floats! This must be passed the old way. */
-	  return small;
-	}
-      if (soft_float)
-	flags += FFI_TYPE_STRUCT_SOFT;
-    }
-  else
-    if (!flags)
-      return small;
-
-  return flags;
-}
-
-#endif
-
-/* Perform machine dependent cif processing */
-ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  cif->flags = 0;
-
-#ifdef FFI_MIPS_O32
-  /* Set the flags necessary for O32 processing.  FFI_O32_SOFT_FLOAT
-   * does not have special handling for floating point args.
-   */
-
-  if (cif->rtype->type != FFI_TYPE_STRUCT && cif->abi == FFI_O32)
-    {
-      if (cif->nargs > 0)
-	{
-	  switch ((cif->arg_types)[0]->type)
-	    {
-	    case FFI_TYPE_FLOAT:
-	    case FFI_TYPE_DOUBLE:
-	      cif->flags += (cif->arg_types)[0]->type;
-	      break;
-	      
-	    default:
-	      break;
-	    }
-
-	  if (cif->nargs > 1)
-	    {
-	      /* Only handle the second argument if the first
-		 is a float or double. */
-	      if (cif->flags)
-		{
-		  switch ((cif->arg_types)[1]->type)
-		    {
-		    case FFI_TYPE_FLOAT:
-		    case FFI_TYPE_DOUBLE:
-		      cif->flags += (cif->arg_types)[1]->type << FFI_FLAG_BITS;
-		      break;
-		      
-		    default:
-		      break;
-		    }
-		}
-	    }
-	}
-    }
-      
-  /* Set the return type flag */
-
-  if (cif->abi == FFI_O32_SOFT_FLOAT)
-    {
-      switch (cif->rtype->type)
-        {
-        case FFI_TYPE_VOID:
-        case FFI_TYPE_STRUCT:
-          cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2);
-          break;
-
-        case FFI_TYPE_SINT64:
-        case FFI_TYPE_UINT64:
-        case FFI_TYPE_DOUBLE:
-          cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2);
-          break;
-      
-        case FFI_TYPE_FLOAT:
-        default:
-          cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2);
-          break;
-        }
-    }
-  else
-    {
-      /* FFI_O32 */      
-      switch (cif->rtype->type)
-        {
-        case FFI_TYPE_VOID:
-        case FFI_TYPE_STRUCT:
-        case FFI_TYPE_FLOAT:
-        case FFI_TYPE_DOUBLE:
-          cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2);
-          break;
-
-        case FFI_TYPE_SINT64:
-        case FFI_TYPE_UINT64:
-          cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2);
-          break;
-      
-        default:
-          cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2);
-          break;
-        }
-    }
-#endif
-
-#ifdef FFI_MIPS_N32
-  /* Set the flags necessary for N32 processing */
-  {
-    int type;
-    unsigned arg_reg = 0;
-    unsigned loc = 0;
-    unsigned count = (cif->nargs < 8) ? cif->nargs : 8;
-    unsigned index = 0;
-
-    unsigned struct_flags = 0;
-    int soft_float = (cif->abi == FFI_N32_SOFT_FLOAT
-		      || cif->abi == FFI_N64_SOFT_FLOAT);
-
-    if (cif->rtype->type == FFI_TYPE_STRUCT)
-      {
-	struct_flags = calc_n32_return_struct_flags(soft_float, cif->rtype);
-
-	if (struct_flags == 0)
-	  {
-	    /* This means that the structure is being passed as
-	       a hidden argument */
-
-	    arg_reg = 1;
-	    count = (cif->nargs < 7) ? cif->nargs : 7;
-
-	    cif->rstruct_flag = !0;
-	  }
-	else
-	    cif->rstruct_flag = 0;
-      }
-    else
-      cif->rstruct_flag = 0;
-
-    while (count-- > 0 && arg_reg < 8)
-      {
-	type = (cif->arg_types)[index]->type;
-	if (soft_float)
-	  {
-	    switch (type)
-	      {
-	      case FFI_TYPE_FLOAT:
-		type = FFI_TYPE_UINT32;
-		break;
-	      case FFI_TYPE_DOUBLE:
-		type = FFI_TYPE_UINT64;
-		break;
-	      default:
-		break;
-	      }
-	  }
-	switch (type)
-	  {
-	  case FFI_TYPE_FLOAT:
-	  case FFI_TYPE_DOUBLE:
-	    cif->flags +=
-              ((cif->arg_types)[index]->type << (arg_reg * FFI_FLAG_BITS));
-	    arg_reg++;
-	    break;
-          case FFI_TYPE_LONGDOUBLE:
-            /* Align it.  */
-            arg_reg = ALIGN(arg_reg, 2);
-            /* Treat it as two adjacent doubles.  */
-	    if (soft_float) 
-	      {
-		arg_reg += 2;
-	      }
-	    else
-	      {
-		cif->flags +=
-		  (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
-		arg_reg++;
-		cif->flags +=
-		  (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
-		arg_reg++;
-	      }
-            break;
-
-	  case FFI_TYPE_STRUCT:
-            loc = arg_reg * FFI_SIZEOF_ARG;
-	    cif->flags += calc_n32_struct_flags(soft_float,
-						(cif->arg_types)[index],
-						&loc, &arg_reg);
-	    break;
-
-	  default:
-	    arg_reg++;
-            break;
-	  }
-
-	index++;
-      }
-
-  /* Set the return type flag */
-    switch (cif->rtype->type)
-      {
-      case FFI_TYPE_STRUCT:
-	{
-	  if (struct_flags == 0)
-	    {
-	      /* The structure is returned through a hidden
-		 first argument. Do nothing, 'cause FFI_TYPE_VOID 
-		 is 0 */
-	    }
-	  else
-	    {
-	      /* The structure is returned via some tricky
-		 mechanism */
-	      cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8);
-	      cif->flags += struct_flags << (4 + (FFI_FLAG_BITS * 8));
-	    }
-	  break;
-	}
-      
-      case FFI_TYPE_VOID:
-	/* Do nothing, 'cause FFI_TYPE_VOID is 0 */
-	break;
-
-      case FFI_TYPE_POINTER:
-	if (cif->abi == FFI_N32_SOFT_FLOAT || cif->abi == FFI_N32)
-	  cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8);
-	else
-	  cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8);
-	break;
-
-      case FFI_TYPE_FLOAT:
-	if (soft_float)
-	  {
-	    cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8);
-	    break;
-	  }
-	/* else fall through */
-      case FFI_TYPE_DOUBLE:
-	if (soft_float)
-	  cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8);
-	else
-	  cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8);
-	break;
-
-      case FFI_TYPE_LONGDOUBLE:
-	/* Long double is returned as if it were a struct containing
-	   two doubles.  */
-	if (soft_float)
-	  {
-	    cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8);
-	    cif->flags += FFI_TYPE_SMALLSTRUCT2 << (4 + (FFI_FLAG_BITS * 8));
- 	  }
-	else
-	  {
-	    cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8);
-	    cif->flags += (FFI_TYPE_DOUBLE
-			   + (FFI_TYPE_DOUBLE << FFI_FLAG_BITS))
-					      << (4 + (FFI_FLAG_BITS * 8));
-	  }
-	break;
-      default:
-	cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8);
-	break;
-      }
-  }
-#endif
-  
-  return FFI_OK;
-}
-
-/* Low level routine for calling O32 functions */
-extern int ffi_call_O32(void (*)(char *, extended_cif *, int, int), 
-			extended_cif *, unsigned, 
-			unsigned, unsigned *, void (*)(void));
-
-/* Low level routine for calling N32 functions */
-extern int ffi_call_N32(void (*)(char *, extended_cif *, int, int), 
-			extended_cif *, unsigned, 
-			unsigned, void *, void (*)(void));
-
-void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  extended_cif ecif;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-  
-  /* If the return value is a struct and we don't have a return	*/
-  /* value address then we need to make one		        */
-  
-  if ((rvalue == NULL) && 
-      (cif->rtype->type == FFI_TYPE_STRUCT))
-    ecif.rvalue = alloca(cif->rtype->size);
-  else
-    ecif.rvalue = rvalue;
-    
-  switch (cif->abi) 
-    {
-#ifdef FFI_MIPS_O32
-    case FFI_O32:
-    case FFI_O32_SOFT_FLOAT:
-      ffi_call_O32(ffi_prep_args, &ecif, cif->bytes, 
-		   cif->flags, ecif.rvalue, fn);
-      break;
-#endif
-
-#ifdef FFI_MIPS_N32
-    case FFI_N32:
-    case FFI_N32_SOFT_FLOAT:
-    case FFI_N64:
-    case FFI_N64_SOFT_FLOAT:
-      {
-        int copy_rvalue = 0;
-	int copy_offset = 0;
-        char *rvalue_copy = ecif.rvalue;
-        if (cif->rtype->type == FFI_TYPE_STRUCT && cif->rtype->size < 16)
-          {
-            /* For structures smaller than 16 bytes we clobber memory
-               in 8 byte increments.  Make a copy so we don't clobber
-               the callers memory outside of the struct bounds.  */
-            rvalue_copy = alloca(16);
-            copy_rvalue = 1;
-          }
-	else if (cif->rtype->type == FFI_TYPE_FLOAT
-		 && (cif->abi == FFI_N64_SOFT_FLOAT
-		     || cif->abi == FFI_N32_SOFT_FLOAT))
-	  {
-	    rvalue_copy = alloca (8);
-	    copy_rvalue = 1;
-#if defined(__MIPSEB__) || defined(_MIPSEB)
-	    copy_offset = 4;
-#endif
-	  }
-        ffi_call_N32(ffi_prep_args, &ecif, cif->bytes,
-                     cif->flags, rvalue_copy, fn);
-        if (copy_rvalue)
-          memcpy(ecif.rvalue, rvalue_copy + copy_offset, cif->rtype->size);
-      }
-      break;
-#endif
-
-    default:
-      FFI_ASSERT(0);
-      break;
-    }
-}
-
-#if FFI_CLOSURES
-#if defined(FFI_MIPS_O32)
-extern void ffi_closure_O32(void);
-#else
-extern void ffi_closure_N32(void);
-#endif /* FFI_MIPS_O32 */
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure *closure,
-		      ffi_cif *cif,
-		      void (*fun)(ffi_cif*,void*,void**,void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  unsigned int *tramp = (unsigned int *) &closure->tramp[0];
-  void * fn;
-  char *clear_location = (char *) codeloc;
-
-#if defined(FFI_MIPS_O32)
-  if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT)
-    return FFI_BAD_ABI;
-  fn = ffi_closure_O32;
-#else
-#if _MIPS_SIM ==_ABIN32
-  if (cif->abi != FFI_N32
-      && cif->abi != FFI_N32_SOFT_FLOAT)
-    return FFI_BAD_ABI;
-#else
-  if (cif->abi != FFI_N64
-      && cif->abi != FFI_N64_SOFT_FLOAT)
-    return FFI_BAD_ABI;
-#endif
-  fn = ffi_closure_N32;
-#endif /* FFI_MIPS_O32 */
-
-#if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32)
-  /* lui  $25,high(fn) */
-  tramp[0] = 0x3c190000 | ((unsigned)fn >> 16);
-  /* ori  $25,low(fn)  */
-  tramp[1] = 0x37390000 | ((unsigned)fn & 0xffff);
-  /* lui  $12,high(codeloc) */
-  tramp[2] = 0x3c0c0000 | ((unsigned)codeloc >> 16);
-  /* jr   $25          */
-  tramp[3] = 0x03200008;
-  /* ori  $12,low(codeloc)  */
-  tramp[4] = 0x358c0000 | ((unsigned)codeloc & 0xffff);
-#else
-  /* N64 has a somewhat larger trampoline.  */
-  /* lui  $25,high(fn) */
-  tramp[0] = 0x3c190000 | ((unsigned long)fn >> 48);
-  /* lui  $12,high(codeloc) */
-  tramp[1] = 0x3c0c0000 | ((unsigned long)codeloc >> 48);
-  /* ori  $25,mid-high(fn)  */
-  tramp[2] = 0x37390000 | (((unsigned long)fn >> 32 ) & 0xffff);
-  /* ori  $12,mid-high(codeloc)  */
-  tramp[3] = 0x358c0000 | (((unsigned long)codeloc >> 32) & 0xffff);
-  /* dsll $25,$25,16 */
-  tramp[4] = 0x0019cc38;
-  /* dsll $12,$12,16 */
-  tramp[5] = 0x000c6438;
-  /* ori  $25,mid-low(fn)  */
-  tramp[6] = 0x37390000 | (((unsigned long)fn >> 16 ) & 0xffff);
-  /* ori  $12,mid-low(codeloc)  */
-  tramp[7] = 0x358c0000 | (((unsigned long)codeloc >> 16) & 0xffff);
-  /* dsll $25,$25,16 */
-  tramp[8] = 0x0019cc38;
-  /* dsll $12,$12,16 */
-  tramp[9] = 0x000c6438;
-  /* ori  $25,low(fn)  */
-  tramp[10] = 0x37390000 | ((unsigned long)fn  & 0xffff);
-  /* jr   $25          */
-  tramp[11] = 0x03200008;
-  /* ori  $12,low(codeloc)  */
-  tramp[12] = 0x358c0000 | ((unsigned long)codeloc & 0xffff);
-
-#endif
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-#ifdef USE__BUILTIN___CLEAR_CACHE
-  __builtin___clear_cache(clear_location, clear_location + FFI_TRAMPOLINE_SIZE);
-#else
-  cacheflush (clear_location, FFI_TRAMPOLINE_SIZE, ICACHE);
-#endif
-  return FFI_OK;
-}
-
-/*
- * Decodes the arguments to a function, which will be stored on the
- * stack. AR is the pointer to the beginning of the integer arguments
- * (and, depending upon the arguments, some floating-point arguments
- * as well). FPR is a pointer to the area where floating point
- * registers have been saved, if any.
- *
- * RVALUE is the location where the function return value will be
- * stored. CLOSURE is the prepared closure to invoke.
- *
- * This function should only be called from assembly, which is in
- * turn called from a trampoline.
- *
- * Returns the function return type.
- *
- * Based on the similar routine for sparc.
- */
-int
-ffi_closure_mips_inner_O32 (ffi_closure *closure,
-			    void *rvalue, ffi_arg *ar,
-			    double *fpr)
-{
-  ffi_cif *cif;
-  void **avaluep;
-  ffi_arg *avalue;
-  ffi_type **arg_types;
-  int i, avn, argn, seen_int;
-
-  cif = closure->cif;
-  avalue = alloca (cif->nargs * sizeof (ffi_arg));
-  avaluep = alloca (cif->nargs * sizeof (ffi_arg));
-
-  seen_int = (cif->abi == FFI_O32_SOFT_FLOAT);
-  argn = 0;
-
-  if ((cif->flags >> (FFI_FLAG_BITS * 2)) == FFI_TYPE_STRUCT)
-    {
-      rvalue = (void *)(UINT32)ar[0];
-      argn = 1;
-    }
-
-  i = 0;
-  avn = cif->nargs;
-  arg_types = cif->arg_types;
-
-  while (i < avn)
-    {
-      if (i < 2 && !seen_int &&
-	  (arg_types[i]->type == FFI_TYPE_FLOAT ||
-	   arg_types[i]->type == FFI_TYPE_DOUBLE ||
-	   arg_types[i]->type == FFI_TYPE_LONGDOUBLE))
-	{
-#if defined(__MIPSEB__) || defined(_MIPSEB)
-	  if (arg_types[i]->type == FFI_TYPE_FLOAT)
-	    avaluep[i] = ((char *) &fpr[i]) + sizeof (float);
-	  else
-#endif
-	    avaluep[i] = (char *) &fpr[i];
-	}
-      else
-	{
-	  if (arg_types[i]->alignment == 8 && (argn & 0x1))
-	    argn++;
-	  switch (arg_types[i]->type)
-	    {
-	      case FFI_TYPE_SINT8:
-		avaluep[i] = &avalue[i];
-		*(SINT8 *) &avalue[i] = (SINT8) ar[argn];
-		break;
-
-	      case FFI_TYPE_UINT8:
-		avaluep[i] = &avalue[i];
-		*(UINT8 *) &avalue[i] = (UINT8) ar[argn];
-		break;
-		  
-	      case FFI_TYPE_SINT16:
-		avaluep[i] = &avalue[i];
-		*(SINT16 *) &avalue[i] = (SINT16) ar[argn];
-		break;
-		  
-	      case FFI_TYPE_UINT16:
-		avaluep[i] = &avalue[i];
-		*(UINT16 *) &avalue[i] = (UINT16) ar[argn];
-		break;
-
-	      default:
-		avaluep[i] = (char *) &ar[argn];
-		break;
-	    }
-	  seen_int = 1;
-	}
-      argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
-      i++;
-    }
-
-  /* Invoke the closure. */
-  (closure->fun) (cif, rvalue, avaluep, closure->user_data);
-
-  if (cif->abi == FFI_O32_SOFT_FLOAT)
-    {
-      switch (cif->rtype->type)
-        {
-        case FFI_TYPE_FLOAT:
-          return FFI_TYPE_INT;
-        case FFI_TYPE_DOUBLE:
-          return FFI_TYPE_UINT64;
-        default:
-          return cif->rtype->type;
-        }
-    }
-  else
-    {
-      return cif->rtype->type;
-    }
-}
-
-#if defined(FFI_MIPS_N32)
-
-static void
-copy_struct_N32(char *target, unsigned offset, ffi_abi abi, ffi_type *type,
-                int argn, unsigned arg_offset, ffi_arg *ar,
-                ffi_arg *fpr, int soft_float)
-{
-  ffi_type **elt_typep = type->elements;
-  while(*elt_typep)
-    {
-      ffi_type *elt_type = *elt_typep;
-      unsigned o;
-      char *tp;
-      char *argp;
-      char *fpp;
-
-      o = ALIGN(offset, elt_type->alignment);
-      arg_offset += o - offset;
-      offset = o;
-      argn += arg_offset / sizeof(ffi_arg);
-      arg_offset = arg_offset % sizeof(ffi_arg);
-
-      argp = (char *)(ar + argn);
-      fpp = (char *)(argn >= 8 ? ar + argn : fpr + argn);
-
-      tp = target + offset;
-
-      if (elt_type->type == FFI_TYPE_DOUBLE && !soft_float)
-        *(double *)tp = *(double *)fpp;
-      else
-        memcpy(tp, argp + arg_offset, elt_type->size);
-
-      offset += elt_type->size;
-      arg_offset += elt_type->size;
-      elt_typep++;
-      argn += arg_offset / sizeof(ffi_arg);
-      arg_offset = arg_offset % sizeof(ffi_arg);
-    }
-}
-
-/*
- * Decodes the arguments to a function, which will be stored on the
- * stack. AR is the pointer to the beginning of the integer
- * arguments. FPR is a pointer to the area where floating point
- * registers have been saved.
- *
- * RVALUE is the location where the function return value will be
- * stored. CLOSURE is the prepared closure to invoke.
- *
- * This function should only be called from assembly, which is in
- * turn called from a trampoline.
- *
- * Returns the function return flags.
- *
- */
-int
-ffi_closure_mips_inner_N32 (ffi_closure *closure,
-			    void *rvalue, ffi_arg *ar,
-			    ffi_arg *fpr)
-{
-  ffi_cif *cif;
-  void **avaluep;
-  ffi_arg *avalue;
-  ffi_type **arg_types;
-  int i, avn, argn;
-  int soft_float;
-  ffi_arg *argp;
-
-  cif = closure->cif;
-  soft_float = cif->abi == FFI_N64_SOFT_FLOAT
-    || cif->abi == FFI_N32_SOFT_FLOAT;
-  avalue = alloca (cif->nargs * sizeof (ffi_arg));
-  avaluep = alloca (cif->nargs * sizeof (ffi_arg));
-
-  argn = 0;
-
-  if (cif->rstruct_flag)
-    {
-#if _MIPS_SIM==_ABIN32
-      rvalue = (void *)(UINT32)ar[0];
-#else /* N64 */
-      rvalue = (void *)ar[0];
-#endif
-      argn = 1;
-    }
-
-  i = 0;
-  avn = cif->nargs;
-  arg_types = cif->arg_types;
-
-  while (i < avn)
-    {
-      if (arg_types[i]->type == FFI_TYPE_FLOAT
-	  || arg_types[i]->type == FFI_TYPE_DOUBLE
-	  || arg_types[i]->type == FFI_TYPE_LONGDOUBLE)
-        {
-          argp = (argn >= 8 || soft_float) ? ar + argn : fpr + argn;
-          if ((arg_types[i]->type == FFI_TYPE_LONGDOUBLE) && ((unsigned)argp & (arg_types[i]->alignment-1)))
-            {
-              argp=(ffi_arg*)ALIGN(argp,arg_types[i]->alignment);
-              argn++;
-            }
-#if defined(__MIPSEB__) || defined(_MIPSEB)
-          if (arg_types[i]->type == FFI_TYPE_FLOAT && argn < 8)
-            avaluep[i] = ((char *) argp) + sizeof (float);
-          else
-#endif
-            avaluep[i] = (char *) argp;
-        }
-      else
-        {
-          unsigned type = arg_types[i]->type;
-
-          if (arg_types[i]->alignment > sizeof(ffi_arg))
-            argn = ALIGN(argn, arg_types[i]->alignment / sizeof(ffi_arg));
-
-          argp = ar + argn;
-
-          /* The size of a pointer depends on the ABI */
-          if (type == FFI_TYPE_POINTER)
-            type = (cif->abi == FFI_N64 || cif->abi == FFI_N64_SOFT_FLOAT)
-	      ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32;
-
-	  if (soft_float && type ==  FFI_TYPE_FLOAT)
-	    type = FFI_TYPE_UINT32;
-
-          switch (type)
-            {
-            case FFI_TYPE_SINT8:
-              avaluep[i] = &avalue[i];
-              *(SINT8 *) &avalue[i] = (SINT8) *argp;
-              break;
-
-            case FFI_TYPE_UINT8:
-              avaluep[i] = &avalue[i];
-              *(UINT8 *) &avalue[i] = (UINT8) *argp;
-              break;
-
-            case FFI_TYPE_SINT16:
-              avaluep[i] = &avalue[i];
-              *(SINT16 *) &avalue[i] = (SINT16) *argp;
-              break;
-
-            case FFI_TYPE_UINT16:
-              avaluep[i] = &avalue[i];
-              *(UINT16 *) &avalue[i] = (UINT16) *argp;
-              break;
-
-            case FFI_TYPE_SINT32:
-              avaluep[i] = &avalue[i];
-              *(SINT32 *) &avalue[i] = (SINT32) *argp;
-              break;
-
-            case FFI_TYPE_UINT32:
-              avaluep[i] = &avalue[i];
-              *(UINT32 *) &avalue[i] = (UINT32) *argp;
-              break;
-
-            case FFI_TYPE_STRUCT:
-              if (argn < 8)
-                {
-                  /* Allocate space for the struct as at least part of
-                     it was passed in registers.  */
-                  avaluep[i] = alloca(arg_types[i]->size);
-                  copy_struct_N32(avaluep[i], 0, cif->abi, arg_types[i],
-                                  argn, 0, ar, fpr, soft_float);
-
-                  break;
-                }
-              /* Else fall through.  */
-            default:
-              avaluep[i] = (char *) argp;
-              break;
-            }
-        }
-      argn += ALIGN(arg_types[i]->size, sizeof(ffi_arg)) / sizeof(ffi_arg);
-      i++;
-    }
-
-  /* Invoke the closure. */
-  (closure->fun) (cif, rvalue, avaluep, closure->user_data);
-
-  return cif->flags >> (FFI_FLAG_BITS * 8);
-}
-
-#endif /* FFI_MIPS_N32 */
-
-#endif /* FFI_CLOSURES */
diff --git a/third_party/gofrontend/libffi/src/mips/ffitarget.h b/third_party/gofrontend/libffi/src/mips/ffitarget.h
deleted file mode 100644
index 717d659..0000000
--- a/third_party/gofrontend/libffi/src/mips/ffitarget.h
+++ /dev/null
@@ -1,247 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 1996-2003  Red Hat, Inc.
-   Target configuration macros for MIPS.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#ifdef linux
-# include <asm/sgidefs.h>
-#elif defined(__rtems__)
-/*
- * Subprogram calling convention - copied from sgidefs.h
- */
-#define _MIPS_SIM_ABI32		1
-#define _MIPS_SIM_NABI32	2
-#define _MIPS_SIM_ABI64		3
-#elif !defined(__OpenBSD__)
-# include <sgidefs.h>
-#endif
-
-#  ifndef _ABIN32
-#    define _ABIN32 _MIPS_SIM_NABI32
-#  endif
-#  ifndef _ABI64
-#    define _ABI64 _MIPS_SIM_ABI64
-#  endif
-#  ifndef _ABIO32
-#    define _ABIO32 _MIPS_SIM_ABI32
-#  endif
-
-#if !defined(_MIPS_SIM)
-# error -- something is very wrong --
-#else
-#  if (_MIPS_SIM==_ABIN32 && defined(_ABIN32)) || (_MIPS_SIM==_ABI64 && defined(_ABI64))
-#    define FFI_MIPS_N32
-#  else
-#    if (_MIPS_SIM==_ABIO32 && defined(_ABIO32))
-#      define FFI_MIPS_O32
-#    else
-#     error -- this is an unsupported platform --
-#    endif
-#  endif
-#endif
-
-#ifdef FFI_MIPS_O32
-/* O32 stack frames have 32bit integer args */
-#  define FFI_SIZEOF_ARG    4
-#else
-/* N32 and N64 frames have 64bit integer args */
-#  define FFI_SIZEOF_ARG    8
-#  if _MIPS_SIM == _ABIN32
-#    define FFI_SIZEOF_JAVA_RAW  4
-#  endif
-#endif
-
-#define FFI_FLAG_BITS 2
-
-/* SGI's strange assembler requires that we multiply by 4 rather 
-   than shift left by FFI_FLAG_BITS */
-
-#define FFI_ARGS_D   FFI_TYPE_DOUBLE
-#define FFI_ARGS_F   FFI_TYPE_FLOAT
-#define FFI_ARGS_DD  FFI_TYPE_DOUBLE * 4 + FFI_TYPE_DOUBLE
-#define FFI_ARGS_FF  FFI_TYPE_FLOAT * 4 +  FFI_TYPE_FLOAT
-#define FFI_ARGS_FD  FFI_TYPE_DOUBLE * 4 + FFI_TYPE_FLOAT
-#define FFI_ARGS_DF  FFI_TYPE_FLOAT * 4 + FFI_TYPE_DOUBLE
-
-/* Needed for N32 structure returns */
-#define FFI_TYPE_SMALLSTRUCT  FFI_TYPE_UINT8
-#define FFI_TYPE_SMALLSTRUCT2 FFI_TYPE_SINT8
-
-#if 0
-/* The SGI assembler can't handle this.. */
-#define FFI_TYPE_STRUCT_DD (( FFI_ARGS_DD ) << 4) + FFI_TYPE_STRUCT
-/* (and so on) */
-#else
-/* ...so we calculate these by hand! */
-#define FFI_TYPE_STRUCT_D      61
-#define FFI_TYPE_STRUCT_F      45
-#define FFI_TYPE_STRUCT_DD     253
-#define FFI_TYPE_STRUCT_FF     173
-#define FFI_TYPE_STRUCT_FD     237
-#define FFI_TYPE_STRUCT_DF     189
-#define FFI_TYPE_STRUCT_SMALL  93
-#define FFI_TYPE_STRUCT_SMALL2 109
-
-/* and for n32 soft float, add 16 * 2^4 */
-#define FFI_TYPE_STRUCT_D_SOFT      317
-#define FFI_TYPE_STRUCT_F_SOFT      301
-#define FFI_TYPE_STRUCT_DD_SOFT     509
-#define FFI_TYPE_STRUCT_FF_SOFT     429
-#define FFI_TYPE_STRUCT_FD_SOFT     493
-#define FFI_TYPE_STRUCT_DF_SOFT     445
-#define FFI_TYPE_STRUCT_SOFT        16
-#endif
-
-#ifdef LIBFFI_ASM
-#define v0 $2
-#define v1 $3
-#define a0 $4
-#define a1 $5
-#define a2 $6
-#define a3 $7
-#define a4 $8		
-#define a5 $9		
-#define a6 $10		
-#define a7 $11		
-#define t0 $8
-#define t1 $9
-#define t2 $10
-#define t3 $11
-#define t4 $12		
-#define t5 $13
-#define t6 $14	
-#define t7 $15
-#define t8 $24
-#define t9 $25
-#define ra $31		
-
-#ifdef FFI_MIPS_O32
-# define REG_L	lw
-# define REG_S	sw
-# define SUBU	subu
-# define ADDU	addu
-# define SRL	srl
-# define LI	li
-#else /* !FFI_MIPS_O32 */
-# define REG_L	ld
-# define REG_S	sd
-# define SUBU	dsubu
-# define ADDU	daddu
-# define SRL	dsrl
-# define LI 	dli
-# if (_MIPS_SIM==_ABI64)
-#  define LA dla
-#  define EH_FRAME_ALIGN 3
-#  define FDE_ADDR_BYTES .8byte
-# else
-#  define LA la
-#  define EH_FRAME_ALIGN 2
-#  define FDE_ADDR_BYTES .4byte
-# endif /* _MIPS_SIM==_ABI64 */
-#endif /* !FFI_MIPS_O32 */
-#else /* !LIBFFI_ASM */
-# ifdef __GNUC__
-#  ifdef FFI_MIPS_O32
-/* O32 stack frames have 32bit integer args */
-typedef unsigned int     ffi_arg __attribute__((__mode__(__SI__)));
-typedef signed   int     ffi_sarg __attribute__((__mode__(__SI__)));
-#else
-/* N32 and N64 frames have 64bit integer args */
-typedef unsigned int     ffi_arg __attribute__((__mode__(__DI__)));
-typedef signed   int     ffi_sarg __attribute__((__mode__(__DI__)));
-#  endif
-# else
-#  ifdef FFI_MIPS_O32
-/* O32 stack frames have 32bit integer args */
-typedef __uint32_t ffi_arg;
-typedef __int32_t ffi_sarg;
-#  else
-/* N32 and N64 frames have 64bit integer args */
-typedef __uint64_t ffi_arg;
-typedef __int64_t ffi_sarg;
-#  endif
-# endif /* __GNUC__ */
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_O32,
-  FFI_N32,
-  FFI_N64,
-  FFI_O32_SOFT_FLOAT,
-  FFI_N32_SOFT_FLOAT,
-  FFI_N64_SOFT_FLOAT,
-  FFI_LAST_ABI,
-
-#ifdef FFI_MIPS_O32
-#ifdef __mips_soft_float
-  FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT
-#else
-  FFI_DEFAULT_ABI = FFI_O32
-#endif
-#else
-# if _MIPS_SIM==_ABI64
-#  ifdef __mips_soft_float
-  FFI_DEFAULT_ABI = FFI_N64_SOFT_FLOAT
-#  else
-  FFI_DEFAULT_ABI = FFI_N64
-#  endif
-# else
-#  ifdef __mips_soft_float
-  FFI_DEFAULT_ABI = FFI_N32_SOFT_FLOAT
-#  else
-  FFI_DEFAULT_ABI = FFI_N32
-#  endif
-# endif
-#endif
-} ffi_abi;
-
-#define FFI_EXTRA_CIF_FIELDS unsigned rstruct_flag
-#endif /* !LIBFFI_ASM */
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#if defined(FFI_MIPS_O32)
-#define FFI_CLOSURES 1
-#define FFI_TRAMPOLINE_SIZE 20
-#else
-/* N32/N64. */
-# define FFI_CLOSURES 1
-#if _MIPS_SIM==_ABI64
-#define FFI_TRAMPOLINE_SIZE 52
-#else
-#define FFI_TRAMPOLINE_SIZE 20
-#endif
-#endif /* FFI_MIPS_O32 */
-#define FFI_NATIVE_RAW_API 0
-
-#endif
-
diff --git a/third_party/gofrontend/libffi/src/mips/n32.S b/third_party/gofrontend/libffi/src/mips/n32.S
deleted file mode 100644
index c6985d3..0000000
--- a/third_party/gofrontend/libffi/src/mips/n32.S
+++ /dev/null
@@ -1,576 +0,0 @@
-/* -----------------------------------------------------------------------
-   n32.S - Copyright (c) 1996, 1998, 2005, 2007, 2009, 2010  Red Hat, Inc.
-   
-   MIPS Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-
-/* Only build this code if we are compiling for n32 */	
-
-#if defined(FFI_MIPS_N32)
-
-#define callback a0
-#define bytes	 a2
-#define flags	 a3
-#define raddr    a4
-#define fn       a5
-
-#define SIZEOF_FRAME	( 8 * FFI_SIZEOF_ARG )
-
-#ifdef __GNUC__
-	.abicalls
-#endif
-	.set mips4
-	.text
-	.align	2
-	.globl	ffi_call_N32
-	.ent	ffi_call_N32
-ffi_call_N32:	
-.LFB3:
-	.frame	$fp, SIZEOF_FRAME, ra
-	.mask	0xc0000000,-FFI_SIZEOF_ARG
-	.fmask	0x00000000,0
-
-	# Prologue
-	SUBU	$sp, SIZEOF_FRAME			# Frame size
-.LCFI0:
-	REG_S	$fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp)	# Save frame pointer
-	REG_S	ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp)	# Save return address
-.LCFI1:
-	move	$fp, $sp
-.LCFI3:
-	move	t9, callback	# callback function pointer
-	REG_S	bytes, 2*FFI_SIZEOF_ARG($fp) # bytes
-	REG_S	flags, 3*FFI_SIZEOF_ARG($fp) # flags
-	REG_S	raddr, 4*FFI_SIZEOF_ARG($fp) # raddr
-	REG_S	fn,    5*FFI_SIZEOF_ARG($fp) # fn
-
-	# Allocate at least 4 words in the argstack
-	move	v0, bytes
-	bge	bytes, 4 * FFI_SIZEOF_ARG, bigger	
-	LI	v0, 4 * FFI_SIZEOF_ARG
-	b	sixteen
-
-	bigger:	
-	ADDU	t4, v0, 2 * FFI_SIZEOF_ARG -1	# make sure it is aligned 
-	and	v0, t4, -2 * FFI_SIZEOF_ARG		# to a proper boundry.
-
-sixteen:
-	SUBU	$sp, $sp, v0	# move the stack pointer to reflect the
-				# arg space
-
-	move	a0, $sp         # 4 * FFI_SIZEOF_ARG
-	ADDU	a3, $fp, 3 * FFI_SIZEOF_ARG
-
-	# Call ffi_prep_args
-	jal	t9
-	
-	# Copy the stack pointer to t9
-	move	t9, $sp
-	
-	# Fix the stack if there are more than 8 64bit slots worth
-	# of arguments.
-
-	# Load the number of bytes
-	REG_L	t6, 2*FFI_SIZEOF_ARG($fp)
-
-	# Is it bigger than 8 * FFI_SIZEOF_ARG?
-	daddiu	t8, t6, -(8 * FFI_SIZEOF_ARG)
-	bltz	t8, loadregs
-
-	ADDU	t9, t9, t8
-	
-loadregs:	
-
-	REG_L	t6, 3*FFI_SIZEOF_ARG($fp)  # load the flags word into t6.
-
-	and	t4, t6, ((1<<FFI_FLAG_BITS)-1)
-	REG_L	a0, 0*FFI_SIZEOF_ARG(t9)
-	beqz	t4, arg1_next
-	bne	t4, FFI_TYPE_FLOAT, arg1_doublep
-	l.s	$f12, 0*FFI_SIZEOF_ARG(t9)
-	b	arg1_next
-arg1_doublep:	
-	l.d	$f12, 0*FFI_SIZEOF_ARG(t9)
-arg1_next:	
-	
-	SRL	t4, t6, 1*FFI_FLAG_BITS
-	and	t4, ((1<<FFI_FLAG_BITS)-1)
-	REG_L	a1, 1*FFI_SIZEOF_ARG(t9)
-	beqz	t4, arg2_next
-	bne	t4, FFI_TYPE_FLOAT, arg2_doublep
-	l.s	$f13, 1*FFI_SIZEOF_ARG(t9)	
-	b	arg2_next
-arg2_doublep:	
-	l.d	$f13, 1*FFI_SIZEOF_ARG(t9)	
-arg2_next:	
-	
-	SRL	t4, t6, 2*FFI_FLAG_BITS
-	and	t4, ((1<<FFI_FLAG_BITS)-1)
-	REG_L	a2, 2*FFI_SIZEOF_ARG(t9)
-	beqz	t4, arg3_next
-	bne	t4, FFI_TYPE_FLOAT, arg3_doublep
-	l.s	$f14, 2*FFI_SIZEOF_ARG(t9)	
-	b	arg3_next
-arg3_doublep:	
-	l.d	$f14, 2*FFI_SIZEOF_ARG(t9)	
-arg3_next:	
-	
-	SRL	t4, t6, 3*FFI_FLAG_BITS
-	and	t4, ((1<<FFI_FLAG_BITS)-1)
-	REG_L	a3, 3*FFI_SIZEOF_ARG(t9)
-	beqz	t4, arg4_next
-	bne	t4, FFI_TYPE_FLOAT, arg4_doublep
-	l.s	$f15, 3*FFI_SIZEOF_ARG(t9)	
-	b	arg4_next
-arg4_doublep:	
-	l.d	$f15, 3*FFI_SIZEOF_ARG(t9)	
-arg4_next:	
-	
-	SRL	t4, t6, 4*FFI_FLAG_BITS
-	and	t4, ((1<<FFI_FLAG_BITS)-1)
-	REG_L	a4, 4*FFI_SIZEOF_ARG(t9)
-	beqz	t4, arg5_next
-	bne	t4, FFI_TYPE_FLOAT, arg5_doublep
-	l.s	$f16, 4*FFI_SIZEOF_ARG(t9)	
-	b	arg5_next
-arg5_doublep:	
-	l.d	$f16, 4*FFI_SIZEOF_ARG(t9)	
-arg5_next:	
-	
-	SRL	t4, t6, 5*FFI_FLAG_BITS
-	and	t4, ((1<<FFI_FLAG_BITS)-1)
-	REG_L	a5, 5*FFI_SIZEOF_ARG(t9)
-	beqz	t4, arg6_next
-	bne	t4, FFI_TYPE_FLOAT, arg6_doublep
-	l.s	$f17, 5*FFI_SIZEOF_ARG(t9)	
-	b	arg6_next
-arg6_doublep:	
-	l.d	$f17, 5*FFI_SIZEOF_ARG(t9)	
-arg6_next:	
-	
-	SRL	t4, t6, 6*FFI_FLAG_BITS
-	and	t4, ((1<<FFI_FLAG_BITS)-1)
-	REG_L	a6, 6*FFI_SIZEOF_ARG(t9)
-	beqz	t4, arg7_next
-	bne	t4, FFI_TYPE_FLOAT, arg7_doublep
-	l.s	$f18, 6*FFI_SIZEOF_ARG(t9)	
-	b	arg7_next
-arg7_doublep:	
-	l.d	$f18, 6*FFI_SIZEOF_ARG(t9)	
-arg7_next:	
-	
-	SRL	t4, t6, 7*FFI_FLAG_BITS
-	and	t4, ((1<<FFI_FLAG_BITS)-1)
-	REG_L	a7, 7*FFI_SIZEOF_ARG(t9)
-	beqz	t4, arg8_next
-	bne	t4, FFI_TYPE_FLOAT, arg8_doublep
- 	l.s	$f19, 7*FFI_SIZEOF_ARG(t9)	
-	b	arg8_next
-arg8_doublep:	
- 	l.d	$f19, 7*FFI_SIZEOF_ARG(t9)	
-arg8_next:	
-
-callit:		
-	# Load the function pointer
-	REG_L	t9, 5*FFI_SIZEOF_ARG($fp)
-
-	# If the return value pointer is NULL, assume no return value.
-	REG_L	t5, 4*FFI_SIZEOF_ARG($fp)
-	beqz	t5, noretval
-
-	# Shift the return type flag over
-	SRL	t6, 8*FFI_FLAG_BITS
-
-	beq	t6, FFI_TYPE_SINT32, retint	
-	bne     t6, FFI_TYPE_INT, retfloat
-retint:
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	REG_S	v0, 0(t4)
-	b	epilogue
-
-retfloat:
-	bne     t6, FFI_TYPE_FLOAT, retdouble
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	s.s	$f0, 0(t4)
-	b	epilogue
-
-retdouble:	
-	bne	t6, FFI_TYPE_DOUBLE, retstruct_d
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	s.d	$f0, 0(t4)
-	b	epilogue
-
-retstruct_d:	
-	bne	t6, FFI_TYPE_STRUCT_D, retstruct_f
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	s.d	$f0, 0(t4)
-	b	epilogue
-	
-retstruct_f:	
-	bne	t6, FFI_TYPE_STRUCT_F, retstruct_d_d
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	s.s	$f0, 0(t4)
-	b	epilogue
-	
-retstruct_d_d:	
-	bne	t6, FFI_TYPE_STRUCT_DD, retstruct_f_f
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	s.d	$f0, 0(t4)
-	s.d	$f2, 8(t4)
-	b	epilogue
-	
-retstruct_f_f:	
-	bne	t6, FFI_TYPE_STRUCT_FF, retstruct_d_f
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	s.s	$f0, 0(t4)
-	s.s	$f2, 4(t4)
-	b	epilogue
-	
-retstruct_d_f:	
-	bne	t6, FFI_TYPE_STRUCT_DF, retstruct_f_d
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	s.d	$f0, 0(t4)
-	s.s	$f2, 8(t4)
-	b	epilogue
-	
-retstruct_f_d:	
-	bne	t6, FFI_TYPE_STRUCT_FD, retstruct_d_soft
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	s.s	$f0, 0(t4)
-	s.d	$f2, 8(t4)
-	b	epilogue
-
-retstruct_d_soft:
-	bne	t6, FFI_TYPE_STRUCT_D_SOFT, retstruct_f_soft
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	sd	v0, 0(t4)
-	b	epilogue
-	
-retstruct_f_soft:	
-	bne	t6, FFI_TYPE_STRUCT_F_SOFT, retstruct_d_d_soft
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	sw	v0, 0(t4)
-	b	epilogue
-	
-retstruct_d_d_soft:	
-	bne	t6, FFI_TYPE_STRUCT_DD_SOFT, retstruct_f_f_soft
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	sd	v0, 0(t4)
-	sd	v1, 8(t4)
-	b	epilogue
-	
-retstruct_f_f_soft:	
-	bne	t6, FFI_TYPE_STRUCT_FF_SOFT, retstruct_d_f_soft
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	sw	v0, 0(t4)
-	sw	v1, 4(t4)
-	b	epilogue
-	
-retstruct_d_f_soft:	
-	bne	t6, FFI_TYPE_STRUCT_DF_SOFT, retstruct_f_d_soft
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	sd	v0, 0(t4)
-	sw	v1, 8(t4)
-	b	epilogue
-	
-retstruct_f_d_soft:	
-	bne	t6, FFI_TYPE_STRUCT_FD_SOFT, retstruct_small
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	sw	v0, 0(t4)
-	sd	v1, 8(t4)
-	b	epilogue
-	
-retstruct_small:	
-	bne	t6, FFI_TYPE_STRUCT_SMALL, retstruct_small2
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	REG_S	v0, 0(t4)
-	b	epilogue
-	
-retstruct_small2:	
-	bne	t6, FFI_TYPE_STRUCT_SMALL2, retstruct
-	jal	t9
-	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
-	REG_S	v0, 0(t4)
-	REG_S	v1, 8(t4)
-	b	epilogue
-	
-retstruct:	
-noretval:	
-	jal	t9
-	
-	# Epilogue
-epilogue:	
-	move	$sp, $fp	
-	REG_L	$fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Restore frame pointer
-	REG_L	ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp)  # Restore return address
-	ADDU	$sp, SIZEOF_FRAME		      # Fix stack pointer
-	j	ra
-
-.LFE3:
-	.end	ffi_call_N32
-
-/* ffi_closure_N32. Expects address of the passed-in ffi_closure in t0
-   ($12). Stores any arguments passed in registers onto the stack,
-   then calls ffi_closure_mips_inner_N32, which then decodes
-   them.
-	
-	Stack layout:
-
-	20 - Start of parameters, original sp
-	19 - Called function a7 save
-	18 - Called function a6 save
-	17 - Called function a5 save
-	16 - Called function a4 save
-	15 - Called function a3 save
-	14 - Called function a2 save
-	13 - Called function a1 save
-	12 - Called function a0 save
-	11 - Called function f19
-	10 - Called function f18
-	 9 - Called function f17
-	 8 - Called function f16
-	 7 - Called function f15
-         6 - Called function f14
-         5 - Called function f13
-         4 - Called function f12
-	 3 - return value high (v1 or $f2)
-	 2 - return value low (v0 or $f0)
-	 1 - ra save
-	 0 - gp save our sp  points here
-	 */
-
-#define SIZEOF_FRAME2	(20 * FFI_SIZEOF_ARG)
-	
-#define A7_OFF2		(19 * FFI_SIZEOF_ARG)
-#define A6_OFF2		(18 * FFI_SIZEOF_ARG)
-#define A5_OFF2		(17 * FFI_SIZEOF_ARG)
-#define A4_OFF2		(16 * FFI_SIZEOF_ARG)
-#define A3_OFF2		(15 * FFI_SIZEOF_ARG)
-#define A2_OFF2		(14 * FFI_SIZEOF_ARG)
-#define A1_OFF2		(13 * FFI_SIZEOF_ARG)
-#define A0_OFF2		(12 * FFI_SIZEOF_ARG)	
-
-#define F19_OFF2	(11 * FFI_SIZEOF_ARG)
-#define F18_OFF2	(10 * FFI_SIZEOF_ARG)
-#define F17_OFF2	(9  * FFI_SIZEOF_ARG)
-#define F16_OFF2	(8  * FFI_SIZEOF_ARG)
-#define F15_OFF2	(7  * FFI_SIZEOF_ARG)
-#define F14_OFF2	(6  * FFI_SIZEOF_ARG)
-#define F13_OFF2	(5  * FFI_SIZEOF_ARG)
-#define F12_OFF2	(4  * FFI_SIZEOF_ARG)
-
-#define V1_OFF2		(3  * FFI_SIZEOF_ARG)
-#define V0_OFF2		(2  * FFI_SIZEOF_ARG)
-
-#define RA_OFF2		(1  * FFI_SIZEOF_ARG)
-#define GP_OFF2		(0  * FFI_SIZEOF_ARG)
-
-	.align	2
-	.globl	ffi_closure_N32
-	.ent	ffi_closure_N32
-ffi_closure_N32:
-.LFB2:
-	.frame	$sp, SIZEOF_FRAME2, ra
-	.mask	0x90000000,-(SIZEOF_FRAME2 - RA_OFF2)
-	.fmask	0x00000000,0
-	SUBU	$sp, SIZEOF_FRAME2
-.LCFI5:
-	.cpsetup t9, GP_OFF2, ffi_closure_N32
-	REG_S	ra, RA_OFF2($sp)	# Save return address
-.LCFI6:
-	# Store all possible argument registers. If there are more than
-	# fit in registers, then they were stored on the stack.
-	REG_S	a0, A0_OFF2($sp)
-	REG_S	a1, A1_OFF2($sp)
-	REG_S	a2, A2_OFF2($sp)
-	REG_S	a3, A3_OFF2($sp)
-	REG_S	a4, A4_OFF2($sp)
-	REG_S	a5, A5_OFF2($sp)
-	REG_S	a6, A6_OFF2($sp)
-	REG_S	a7, A7_OFF2($sp)
-
-	# Store all possible float/double registers.
-	s.d	$f12, F12_OFF2($sp)
-	s.d	$f13, F13_OFF2($sp)
-	s.d	$f14, F14_OFF2($sp)
-	s.d	$f15, F15_OFF2($sp)
-	s.d	$f16, F16_OFF2($sp)
-	s.d	$f17, F17_OFF2($sp)
-	s.d	$f18, F18_OFF2($sp)
-	s.d	$f19, F19_OFF2($sp)
-
-	# Call ffi_closure_mips_inner_N32 to do the real work.
-	LA	t9, ffi_closure_mips_inner_N32
-	move	a0, $12	 # Pointer to the ffi_closure
-	ADDU	a1, $sp, V0_OFF2
-	ADDU	a2, $sp, A0_OFF2
-	ADDU	a3, $sp, F12_OFF2
-	jalr	t9
-
-	# Return flags are in v0
-	bne     v0, FFI_TYPE_SINT32, cls_retint
-	lw	v0, V0_OFF2($sp)
-	b	cls_epilogue
-
-cls_retint:
-	bne     v0, FFI_TYPE_INT, cls_retfloat
-	REG_L	v0, V0_OFF2($sp)
-	b	cls_epilogue
-
-cls_retfloat:
-	bne     v0, FFI_TYPE_FLOAT, cls_retdouble
-	l.s	$f0, V0_OFF2($sp)
-	b	cls_epilogue
-
-cls_retdouble:	
-	bne	v0, FFI_TYPE_DOUBLE, cls_retstruct_d
-	l.d	$f0, V0_OFF2($sp)
-	b	cls_epilogue
-
-cls_retstruct_d:	
-	bne	v0, FFI_TYPE_STRUCT_D, cls_retstruct_f
-	l.d	$f0, V0_OFF2($sp)
-	b	cls_epilogue
-	
-cls_retstruct_f:	
-	bne	v0, FFI_TYPE_STRUCT_F, cls_retstruct_d_d
-	l.s	$f0, V0_OFF2($sp)
-	b	cls_epilogue
-	
-cls_retstruct_d_d:	
-	bne	v0, FFI_TYPE_STRUCT_DD, cls_retstruct_f_f
-	l.d	$f0, V0_OFF2($sp)
-	l.d	$f2, V1_OFF2($sp)
-	b	cls_epilogue
-	
-cls_retstruct_f_f:	
-	bne	v0, FFI_TYPE_STRUCT_FF, cls_retstruct_d_f
-	l.s	$f0, V0_OFF2($sp)
-	l.s	$f2, V1_OFF2($sp)
-	b	cls_epilogue
-	
-cls_retstruct_d_f:	
-	bne	v0, FFI_TYPE_STRUCT_DF, cls_retstruct_f_d
-	l.d	$f0, V0_OFF2($sp)
-	l.s	$f2, V1_OFF2($sp)
-	b	cls_epilogue
-	
-cls_retstruct_f_d:	
-	bne	v0, FFI_TYPE_STRUCT_FD, cls_retstruct_small2
-	l.s	$f0, V0_OFF2($sp)
-	l.d	$f2, V1_OFF2($sp)
-	b	cls_epilogue
-	
-cls_retstruct_small2:	
-	REG_L	v0, V0_OFF2($sp)
-	REG_L	v1, V1_OFF2($sp)
-	
-	# Epilogue
-cls_epilogue:	
-	REG_L	ra,  RA_OFF2($sp)	 # Restore return address
-	.cpreturn
-	ADDU	$sp, SIZEOF_FRAME2
-	j	ra
-.LFE2:	
-	.end	ffi_closure_N32
-
-#ifdef __GNUC__
-        .section        .eh_frame,"aw",@progbits
-.Lframe1:
-        .4byte  .LECIE1-.LSCIE1		# length
-.LSCIE1:
-        .4byte  0x0			# CIE
-        .byte   0x1			# Version 1
-        .ascii  "\000"			# Augmentation
-        .uleb128 0x1			# Code alignment 1
-        .sleb128 -4			# Data alignment -4
-        .byte   0x1f			# Return Address $31
-        .byte   0xc			# DW_CFA_def_cfa
-        .uleb128 0x1d			# in $sp
-        .uleb128 0x0			# offset 0
-        .align  EH_FRAME_ALIGN
-.LECIE1:
-
-.LSFDE1:
-        .4byte  .LEFDE1-.LASFDE1	# length.
-.LASFDE1:
-        .4byte  .LASFDE1-.Lframe1	# CIE_pointer.
-        FDE_ADDR_BYTES  .LFB3		# initial_location.
-        FDE_ADDR_BYTES  .LFE3-.LFB3	# address_range.
-        .byte   0x4			# DW_CFA_advance_loc4
-        .4byte  .LCFI0-.LFB3		# to .LCFI0
-        .byte   0xe			# DW_CFA_def_cfa_offset
-        .uleb128 SIZEOF_FRAME		# adjust stack.by SIZEOF_FRAME
-        .byte   0x4			# DW_CFA_advance_loc4
-        .4byte  .LCFI1-.LCFI0		# to .LCFI1
-        .byte   0x9e			# DW_CFA_offset of $fp
-        .uleb128 2*FFI_SIZEOF_ARG/4	# 
-        .byte   0x9f			# DW_CFA_offset of ra
-        .uleb128 1*FFI_SIZEOF_ARG/4	# 
-        .byte   0x4			# DW_CFA_advance_loc4
-        .4byte  .LCFI3-.LCFI1		# to .LCFI3
-        .byte   0xd			# DW_CFA_def_cfa_register
-        .uleb128 0x1e			# in $fp
-        .align  EH_FRAME_ALIGN
-.LEFDE1:
-.LSFDE3:
-	.4byte	.LEFDE3-.LASFDE3	# length
-.LASFDE3:
-	.4byte	.LASFDE3-.Lframe1	# CIE_pointer.
-	FDE_ADDR_BYTES	.LFB2		# initial_location.
-	FDE_ADDR_BYTES	.LFE2-.LFB2	# address_range.
-	.byte	0x4			# DW_CFA_advance_loc4
-	.4byte	.LCFI5-.LFB2		# to .LCFI5
-	.byte	0xe			# DW_CFA_def_cfa_offset
-	.uleb128 SIZEOF_FRAME2		# adjust stack.by SIZEOF_FRAME
-	.byte	0x4			# DW_CFA_advance_loc4
-	.4byte	.LCFI6-.LCFI5		# to .LCFI6
-	.byte	0x9c			# DW_CFA_offset of $gp ($28)
-	.uleb128 (SIZEOF_FRAME2 - GP_OFF2)/4
-	.byte	0x9f			# DW_CFA_offset of ra ($31)
-	.uleb128 (SIZEOF_FRAME2 - RA_OFF2)/4
-	.align	EH_FRAME_ALIGN
-.LEFDE3:
-#endif /* __GNUC__ */	
-	
-#endif
diff --git a/third_party/gofrontend/libffi/src/mips/o32.S b/third_party/gofrontend/libffi/src/mips/o32.S
deleted file mode 100644
index eb27981..0000000
--- a/third_party/gofrontend/libffi/src/mips/o32.S
+++ /dev/null
@@ -1,381 +0,0 @@
-/* -----------------------------------------------------------------------
-   o32.S - Copyright (c) 1996, 1998, 2005  Red Hat, Inc.
-   
-   MIPS Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-
-/* Only build this code if we are compiling for o32 */	
-
-#if defined(FFI_MIPS_O32)
-	
-#define callback a0
-#define bytes	 a2
-#define flags	 a3
-		
-#define SIZEOF_FRAME	(4 * FFI_SIZEOF_ARG + 2 * FFI_SIZEOF_ARG)
-#define A3_OFF		(SIZEOF_FRAME + 3 * FFI_SIZEOF_ARG)
-#define FP_OFF		(SIZEOF_FRAME - 2 * FFI_SIZEOF_ARG)
-#define RA_OFF		(SIZEOF_FRAME - 1 * FFI_SIZEOF_ARG)
-
-	.abicalls
-	.text
-	.align	2
-	.globl	ffi_call_O32
-	.ent	ffi_call_O32
-ffi_call_O32:	
-$LFB0:
-	# Prologue
-	SUBU	$sp, SIZEOF_FRAME	# Frame size
-$LCFI0:
-	REG_S	$fp, FP_OFF($sp)	# Save frame pointer
-$LCFI1:
-	REG_S	ra, RA_OFF($sp)		# Save return address
-$LCFI2:
-	move	$fp, $sp
-
-$LCFI3:
-	move	t9, callback		# callback function pointer
-	REG_S	flags, A3_OFF($fp)	# flags
-
-	# Allocate at least 4 words in the argstack
-	LI	v0, 4 * FFI_SIZEOF_ARG
-	blt	bytes, v0, sixteen
-
-	ADDU	v0, bytes, 7	# make sure it is aligned 
-	and	v0, -8		# to an 8 byte boundry
-
-sixteen:
-	SUBU	$sp, v0		# move the stack pointer to reflect the
-				# arg space
-
-	ADDU	a0, $sp, 4 * FFI_SIZEOF_ARG
-
-	jalr	t9
-	
-	REG_L	t0, A3_OFF($fp)		# load the flags word
-	SRL	t2, t0, 4		# shift our arg info
-	and     t0, ((1<<4)-1)          # mask out the return type
-		
-	ADDU	$sp, 4 * FFI_SIZEOF_ARG		# adjust $sp to new args
-
-	bnez	t0, pass_d			# make it quick for int
-	REG_L	a0, 0*FFI_SIZEOF_ARG($sp)	# just go ahead and load the
-	REG_L	a1, 1*FFI_SIZEOF_ARG($sp)	# four regs.
-	REG_L	a2, 2*FFI_SIZEOF_ARG($sp)
-	REG_L	a3, 3*FFI_SIZEOF_ARG($sp)
-	b	call_it
-
-pass_d:
-	bne	t0, FFI_ARGS_D, pass_f
-	l.d	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
-	REG_L	a2,   2*FFI_SIZEOF_ARG($sp)	# passing a double
-	REG_L	a3,   3*FFI_SIZEOF_ARG($sp)
-	b	call_it
-
-pass_f:	
-	bne	t0, FFI_ARGS_F, pass_d_d
-	l.s	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
-	REG_L	a1,   1*FFI_SIZEOF_ARG($sp)	# passing a float
-	REG_L	a2,   2*FFI_SIZEOF_ARG($sp)
-	REG_L	a3,   3*FFI_SIZEOF_ARG($sp)
-	b	call_it		
-
-pass_d_d:		
-	bne	t0, FFI_ARGS_DD, pass_f_f
-	l.d	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
-	l.d	$f14, 2*FFI_SIZEOF_ARG($sp)	# passing two doubles
-	b	call_it
-
-pass_f_f:	
-	bne	t0, FFI_ARGS_FF, pass_d_f
-	l.s	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
-	l.s	$f14, 1*FFI_SIZEOF_ARG($sp)	# passing two floats
-	REG_L	a2,   2*FFI_SIZEOF_ARG($sp)
-	REG_L	a3,   3*FFI_SIZEOF_ARG($sp)
-	b	call_it
-
-pass_d_f:		
-	bne	t0, FFI_ARGS_DF, pass_f_d
-	l.d	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
-	l.s	$f14, 2*FFI_SIZEOF_ARG($sp)	# passing double and float
-	REG_L	a3,   3*FFI_SIZEOF_ARG($sp)
-	b	call_it
-
-pass_f_d:		
- # assume that the only other combination must be float then double
- #	bne	t0, FFI_ARGS_F_D, call_it
-	l.s	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
-	l.d	$f14, 2*FFI_SIZEOF_ARG($sp)	# passing double and float
-
-call_it:	
-	# Load the function pointer
-	REG_L	t9, SIZEOF_FRAME + 5*FFI_SIZEOF_ARG($fp)
-
-	# If the return value pointer is NULL, assume no return value.
-	REG_L	t1, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
-	beqz	t1, noretval
-
-	bne     t2, FFI_TYPE_INT, retlonglong
-	jalr	t9
-	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
-	REG_S	v0, 0(t0)
-	b	epilogue
-
-retlonglong:
-	# Really any 64-bit int, signed or not.
-	bne	t2, FFI_TYPE_UINT64, retfloat
-	jalr	t9
-	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
-	REG_S	v1, 4(t0)
-	REG_S	v0, 0(t0)
-	b	epilogue
-
-retfloat:
-	bne     t2, FFI_TYPE_FLOAT, retdouble
-	jalr	t9
-	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
-	s.s	$f0, 0(t0)
-	b	epilogue
-
-retdouble:	
-	bne	t2, FFI_TYPE_DOUBLE, noretval
-	jalr	t9
-	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
-	s.d	$f0, 0(t0)
-	b	epilogue
-	
-noretval:	
-	jalr	t9
-	
-	# Epilogue
-epilogue:	
-	move	$sp, $fp	
-	REG_L	$fp, FP_OFF($sp)	# Restore frame pointer
-	REG_L	ra, RA_OFF($sp)		# Restore return address
-	ADDU	$sp, SIZEOF_FRAME	# Fix stack pointer
-	j	ra
-
-$LFE0:
-	.end	ffi_call_O32
-
-
-/* ffi_closure_O32. Expects address of the passed-in ffi_closure
-	in t4 ($12). Stores any arguments passed in registers onto the
-	stack, then calls ffi_closure_mips_inner_O32, which
-	then decodes them.
-	
-	Stack layout:
-
-	 3 - a3 save
-	 2 - a2 save
-	 1 - a1 save
-	 0 - a0 save, original sp
-	-1 - ra save
-	-2 - fp save
-	-3 - $16 (s0) save
-	-4 - cprestore
-	-5 - return value high (v1)
-	-6 - return value low (v0)
-	-7 - f14 (le high, be low)
-	-8 - f14 (le low, be high)
-	-9 - f12 (le high, be low)
-       -10 - f12 (le low, be high)
-       -11 - Called function a3 save
-       -12 - Called function a2 save
-       -13 - Called function a1 save
-       -14 - Called function a0 save, our sp and fp point here
-	 */
-	
-#define SIZEOF_FRAME2	(14 * FFI_SIZEOF_ARG)
-#define A3_OFF2		(SIZEOF_FRAME2 + 3 * FFI_SIZEOF_ARG)
-#define A2_OFF2		(SIZEOF_FRAME2 + 2 * FFI_SIZEOF_ARG)
-#define A1_OFF2		(SIZEOF_FRAME2 + 1 * FFI_SIZEOF_ARG)
-#define A0_OFF2		(SIZEOF_FRAME2 + 0 * FFI_SIZEOF_ARG)
-#define RA_OFF2		(SIZEOF_FRAME2 - 1 * FFI_SIZEOF_ARG)
-#define FP_OFF2		(SIZEOF_FRAME2 - 2 * FFI_SIZEOF_ARG)
-#define S0_OFF2		(SIZEOF_FRAME2 - 3 * FFI_SIZEOF_ARG)
-#define GP_OFF2		(SIZEOF_FRAME2 - 4 * FFI_SIZEOF_ARG)
-#define V1_OFF2		(SIZEOF_FRAME2 - 5 * FFI_SIZEOF_ARG)
-#define V0_OFF2		(SIZEOF_FRAME2 - 6 * FFI_SIZEOF_ARG)
-#define FA_1_1_OFF2	(SIZEOF_FRAME2 - 7 * FFI_SIZEOF_ARG)
-#define FA_1_0_OFF2	(SIZEOF_FRAME2 - 8 * FFI_SIZEOF_ARG)
-#define FA_0_1_OFF2	(SIZEOF_FRAME2 - 9 * FFI_SIZEOF_ARG)
-#define FA_0_0_OFF2	(SIZEOF_FRAME2 - 10 * FFI_SIZEOF_ARG)
-
-	.text
-	.align	2
-	.globl	ffi_closure_O32
-	.ent	ffi_closure_O32
-ffi_closure_O32:
-$LFB1:
-	# Prologue
-	.frame	$fp, SIZEOF_FRAME2, ra
-	.set	noreorder
-	.cpload	t9
-	.set	reorder
-	SUBU	$sp, SIZEOF_FRAME2
-	.cprestore GP_OFF2
-$LCFI4:
-	REG_S	$16, S0_OFF2($sp)	 # Save s0
-	REG_S	$fp, FP_OFF2($sp)	 # Save frame pointer
-	REG_S	ra, RA_OFF2($sp)	 # Save return address
-$LCFI6:
-	move	$fp, $sp
-
-$LCFI7:
-	# Store all possible argument registers. If there are more than
-	# four arguments, then they are stored above where we put a3.
-	REG_S	a0, A0_OFF2($fp)
-	REG_S	a1, A1_OFF2($fp)
-	REG_S	a2, A2_OFF2($fp)
-	REG_S	a3, A3_OFF2($fp)
-
-	# Load ABI enum to s0
-	REG_L	$16, 20($12)	# cif pointer follows tramp.
-	REG_L	$16, 0($16)	# abi is first member.
-
-	li	$13, 1		# FFI_O32
-	bne	$16, $13, 1f	# Skip fp save if FFI_O32_SOFT_FLOAT
-	
-	# Store all possible float/double registers.
-	s.d	$f12, FA_0_0_OFF2($fp)
-	s.d	$f14, FA_1_0_OFF2($fp)
-1:	
-	# Call ffi_closure_mips_inner_O32 to do the work.
-	la	t9, ffi_closure_mips_inner_O32
-	move	a0, $12	 # Pointer to the ffi_closure
-	addu	a1, $fp, V0_OFF2
-	addu	a2, $fp, A0_OFF2
-	addu	a3, $fp, FA_0_0_OFF2
-	jalr	t9
-
-	# Load the return value into the appropriate register.
-	move	$8, $2
-	li	$9, FFI_TYPE_VOID
-	beq	$8, $9, closure_done
-
-	li	$13, 1		# FFI_O32
-	bne	$16, $13, 1f	# Skip fp restore if FFI_O32_SOFT_FLOAT
-
-	li	$9, FFI_TYPE_FLOAT
-	l.s	$f0, V0_OFF2($fp)
-	beq	$8, $9, closure_done
-
-	li	$9, FFI_TYPE_DOUBLE
-	l.d	$f0, V0_OFF2($fp)
-	beq	$8, $9, closure_done
-1:	
-	REG_L	$3, V1_OFF2($fp)
-	REG_L	$2, V0_OFF2($fp)
-
-closure_done:
-	# Epilogue
-	move	$sp, $fp
-	REG_L	$16, S0_OFF2($sp)	 # Restore s0
-	REG_L	$fp, FP_OFF2($sp)	 # Restore frame pointer
-	REG_L	ra,  RA_OFF2($sp)	 # Restore return address
-	ADDU	$sp, SIZEOF_FRAME2
-	j	ra
-$LFE1:
-	.end	ffi_closure_O32
-
-/* DWARF-2 unwind info. */
-
-	.section	.eh_frame,"a",@progbits
-$Lframe0:
-	.4byte	$LECIE0-$LSCIE0	 # Length of Common Information Entry
-$LSCIE0:
-	.4byte	0x0	 # CIE Identifier Tag
-	.byte	0x1	 # CIE Version
-	.ascii "zR\0"	 # CIE Augmentation
-	.uleb128 0x1	 # CIE Code Alignment Factor
-	.sleb128 4	 # CIE Data Alignment Factor
-	.byte	0x1f	 # CIE RA Column
-	.uleb128 0x1	 # Augmentation size
-	.byte	0x00	 # FDE Encoding (absptr)
-	.byte	0xc	 # DW_CFA_def_cfa
-	.uleb128 0x1d
-	.uleb128 0x0
-	.align	2
-$LECIE0:
-$LSFDE0:
-	.4byte	$LEFDE0-$LASFDE0	 # FDE Length
-$LASFDE0:
-	.4byte	$LASFDE0-$Lframe0	 # FDE CIE offset
-	.4byte	$LFB0	 # FDE initial location
-	.4byte	$LFE0-$LFB0	 # FDE address range
-	.uleb128 0x0	 # Augmentation size
-	.byte	0x4	 # DW_CFA_advance_loc4
-	.4byte	$LCFI0-$LFB0
-	.byte	0xe	 # DW_CFA_def_cfa_offset
-	.uleb128 0x18
-	.byte	0x4	 # DW_CFA_advance_loc4
-	.4byte	$LCFI2-$LCFI0
-	.byte	0x11	 # DW_CFA_offset_extended_sf
-	.uleb128 0x1e	 # $fp
-	.sleb128 -2	 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp)
-	.byte	0x11	 # DW_CFA_offset_extended_sf
-	.uleb128 0x1f	 # $ra
-	.sleb128 -1	 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp)
-	.byte	0x4	 # DW_CFA_advance_loc4
-	.4byte	$LCFI3-$LCFI2
-	.byte	0xc	 # DW_CFA_def_cfa
-	.uleb128 0x1e
-	.uleb128 0x18
-	.align	2
-$LEFDE0:
-$LSFDE1:
-	.4byte	$LEFDE1-$LASFDE1	 # FDE Length
-$LASFDE1:
-	.4byte	$LASFDE1-$Lframe0	 # FDE CIE offset
-	.4byte	$LFB1	 # FDE initial location
-	.4byte	$LFE1-$LFB1	 # FDE address range
-	.uleb128 0x0	 # Augmentation size
-	.byte	0x4	 # DW_CFA_advance_loc4
-	.4byte	$LCFI4-$LFB1
-	.byte	0xe	 # DW_CFA_def_cfa_offset
-	.uleb128 0x38
-	.byte	0x4	 # DW_CFA_advance_loc4
-	.4byte	$LCFI6-$LCFI4
-	.byte	0x11	 # DW_CFA_offset_extended_sf
-	.uleb128 0x10	 # $16
-	.sleb128 -3	 # SIZEOF_FRAME2 - 3*FFI_SIZEOF_ARG($sp)
-	.byte	0x11	 # DW_CFA_offset_extended_sf
-	.uleb128 0x1e	 # $fp
-	.sleb128 -2	 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp)
-	.byte	0x11	 # DW_CFA_offset_extended_sf
-	.uleb128 0x1f	 # $ra
-	.sleb128 -1	 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp)
-	.byte	0x4	 # DW_CFA_advance_loc4
-	.4byte	$LCFI7-$LCFI6
-	.byte	0xc	 # DW_CFA_def_cfa
-	.uleb128 0x1e
-	.uleb128 0x38
-	.align	2
-$LEFDE1:
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/moxie/eabi.S b/third_party/gofrontend/libffi/src/moxie/eabi.S
deleted file mode 100644
index ac7aceb..0000000
--- a/third_party/gofrontend/libffi/src/moxie/eabi.S
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -----------------------------------------------------------------------
-   eabi.S - Copyright (c) 2012, 2013  Anthony Green
-   
-   Moxie Assembly glue.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-
-	.globl ffi_prep_args_EABI
-
-	.text
-	.p2align 4
-	.globl ffi_call_EABI
-	.type ffi_call_EABI, @function
-
-	# $r0 :   ffi_prep_args
-	# $r1 :   &ecif
-	# $r2 :   cif->bytes
-	# $r3 :   fig->flags
-	# $r4 :   ecif.rvalue
-	# $r5 :   fn
-	
-ffi_call_EABI:
-	push	$sp, $r6
-	push	$sp, $r7
-	push	$sp, $r8
-	dec	$sp, 24
-
-	/* Store incoming args on stack.  */
-	sto.l	0($sp), $r0 /* ffi_prep_args */
-	sto.l	4($sp), $r1 /* ecif */
-	sto.l	8($sp), $r2 /* bytes */
-	sto.l	12($sp), $r3 /* flags */
-	sto.l	16($sp), $r4 /* &rvalue */
-	sto.l	20($sp), $r5 /* fn */
-	
-	/* Call ffi_prep_args.  */
-	mov 	$r6, $r4 /* Save result buffer */
-	mov	$r7, $r5 /* Save the target fn */
-	mov	$r8, $r3 /* Save the flags */
-	sub.l	$sp, $r2 /* Allocate stack space */
-	mov	$r0, $sp /* We can stomp over $r0 */
-	/* $r1 is already set up */
-	jsra 	ffi_prep_args
-
-	/* Load register arguments.  */
-	ldo.l	$r0, 0($sp)
-	ldo.l	$r1, 4($sp)
-	ldo.l	$r2, 8($sp)
-	ldo.l	$r3, 12($sp)
-	ldo.l	$r4, 16($sp)
-	ldo.l	$r5, 20($sp)
-	
-	/* Call the target function.  */
-	jsr	$r7
-
-	ldi.l	$r7, 0xffffffff
-	cmp	$r8, $r7
-	beq	retstruct
-
-	ldi.l	$r7, 4
-	cmp	$r8, $r7
-	bgt	ret2reg
-
-	st.l	($r6), $r0
-	jmpa	retdone
-
-ret2reg:	
-	st.l	($r6), $r0
-	sto.l	4($r6), $r1
-
-retstruct:
-retdone:	
-	/* Return.  */
-	ldo.l	$r6, -4($fp)
-	ldo.l	$r7, -8($fp)
-	ldo.l	$r8, -12($fp)
-	ret
-	.size ffi_call_EABI, .-ffi_call_EABI
-	
diff --git a/third_party/gofrontend/libffi/src/moxie/ffi.c b/third_party/gofrontend/libffi/src/moxie/ffi.c
deleted file mode 100644
index 540a042..0000000
--- a/third_party/gofrontend/libffi/src/moxie/ffi.c
+++ /dev/null
@@ -1,272 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (C) 2012, 2013  Anthony Green
-   
-   Moxie Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-
-/* ffi_prep_args is called by the assembly routine once stack space
-   has been allocated for the function's arguments */
-
-void *ffi_prep_args(char *stack, extended_cif *ecif)
-{
-  register unsigned int i;
-  register void **p_argv;
-  register char *argp;
-  register ffi_type **p_arg;
-  register int count = 0;
-
-  p_argv = ecif->avalue;
-  argp = stack;
-
-  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT)
-    {
-      *(void **) argp = ecif->rvalue;
-      argp += 4;
-    }
-
-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
-       (i != 0);
-       i--, p_arg++)
-    {
-      size_t z;
-      
-      z = (*p_arg)->size;
-
-      if ((*p_arg)->type == FFI_TYPE_STRUCT)
-	{
-	  z = sizeof(void*);
-	  *(void **) argp = *p_argv;
-	} 
-      else if (z < sizeof(int))
-	{
-	  z = sizeof(int);
-	  switch ((*p_arg)->type)
-	    {
-	    case FFI_TYPE_SINT8:
-	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
-	      break;
-	      
-	    case FFI_TYPE_UINT8:
-	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
-	      break;
-	      
-	    case FFI_TYPE_SINT16:
-	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
-	      break;
-		  
-	    case FFI_TYPE_UINT16:
-	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
-	      break;
-		  
-	    default:
-	      FFI_ASSERT(0);
-	    }
-	}
-      else if (z == sizeof(int))
-	{
-	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
-	}
-      else
-	{
-	  memcpy(argp, *p_argv, z);
-	}
-      p_argv++;
-      argp += z;
-      count += z;
-    }
-
-  return (stack + ((count > 24) ? 24 : ALIGN_DOWN(count, 8)));
-}
-
-/* Perform machine dependent cif processing */
-ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  if (cif->rtype->type == FFI_TYPE_STRUCT)
-    cif->flags = -1;
-  else
-    cif->flags = cif->rtype->size;
-
-  cif->bytes = ALIGN (cif->bytes, 8);
-
-  return FFI_OK;
-}
-
-extern void ffi_call_EABI(void *(*)(char *, extended_cif *), 
-			  extended_cif *, 
-			  unsigned, unsigned, 
-			  unsigned *, 
-			  void (*fn)(void));
-
-void ffi_call(ffi_cif *cif, 
-	      void (*fn)(void), 
-	      void *rvalue, 
-	      void **avalue)
-{
-  extended_cif ecif;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-  
-  /* If the return value is a struct and we don't have a return	*/
-  /* value address then we need to make one		        */
-
-  if ((rvalue == NULL) && 
-      (cif->rtype->type == FFI_TYPE_STRUCT))
-    {
-      ecif.rvalue = alloca(cif->rtype->size);
-    }
-  else
-    ecif.rvalue = rvalue;
-
-  switch (cif->abi) 
-    {
-    case FFI_EABI:
-      ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, 
-		    cif->flags, ecif.rvalue, fn);
-      break;
-    default:
-      FFI_ASSERT(0);
-      break;
-    }
-}
-
-void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3,
-		       unsigned arg4, unsigned arg5, unsigned arg6)
-{
-  /* This function is called by a trampoline.  The trampoline stows a
-     pointer to the ffi_closure object in $r7.  We must save this
-     pointer in a place that will persist while we do our work.  */
-  register ffi_closure *creg __asm__ ("$r12");
-  ffi_closure *closure = creg;
-
-  /* Arguments that don't fit in registers are found on the stack
-     at a fixed offset above the current frame pointer.  */
-  register char *frame_pointer __asm__ ("$fp");
-
-  /* Pointer to a struct return value.  */
-  void *struct_rvalue = (void *) arg1;
-
-  /* 6 words reserved for register args + 3 words from jsr */
-  char *stack_args = frame_pointer + 9*4; 
-
-  /* Lay the register arguments down in a continuous chunk of memory.  */
-  unsigned register_args[6] =
-    { arg1, arg2, arg3, arg4, arg5, arg6 };
-  char *register_args_ptr = (char *) register_args;
-
-  ffi_cif *cif = closure->cif;
-  ffi_type **arg_types = cif->arg_types;
-  void **avalue = alloca (cif->nargs * sizeof(void *));
-  char *ptr = (char *) register_args;
-  int i;
-
-  /* preserve struct type return pointer passing */
-  if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) {
-    ptr += 4;
-    register_args_ptr = (char *)&register_args[1];
-  }
-
-  /* Find the address of each argument.  */
-  for (i = 0; i < cif->nargs; i++)
-    {
-      switch (arg_types[i]->type)
-	{
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT8:
-	  avalue[i] = ptr + 3;
-	  break;
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT16:
-	  avalue[i] = ptr + 2;
-	  break;
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_POINTER:
-	  avalue[i] = ptr;
-	  break;
-	case FFI_TYPE_STRUCT:
-	  avalue[i] = *(void**)ptr;
-	  break;
-	default:
-	  /* This is an 8-byte value.  */
-	  avalue[i] = ptr;
-	  ptr += 4;
-	  break;
-	}
-      ptr += 4;
-
-      /* If we've handled more arguments than fit in registers,
-	 start looking at the those passed on the stack.  */
-      if (ptr == &register_args[6])
-	ptr = stack_args;
-    }
-
-  /* Invoke the closure.  */
-  if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT))
-    {
-      (closure->fun) (cif, struct_rvalue, avalue, closure->user_data);
-    }
-  else
-    {
-      /* Allocate space for the return value and call the function.  */
-      long long rvalue;
-      (closure->fun) (cif, &rvalue, avalue, closure->user_data);
-      asm ("mov $r12, %0\n ld.l $r0, ($r12)\n ldo.l $r1, 4($r12)" : : "r" (&rvalue));
-    }
-}
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun)(ffi_cif*, void*, void**, void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  unsigned short *tramp = (unsigned short *) &closure->tramp[0];
-  unsigned long fn = (long) ffi_closure_eabi;
-  unsigned long cls = (long) codeloc;
-
-  if (cif->abi != FFI_EABI)
-    return FFI_BAD_ABI;
-
-  fn = (unsigned long) ffi_closure_eabi;
-
-  tramp[0] = 0x01e0; /* ldi.l $r7, .... */
-  tramp[1] = cls >> 16;
-  tramp[2] = cls & 0xffff;
-  tramp[3] = 0x1a00; /* jmpa .... */
-  tramp[4] = fn >> 16;
-  tramp[5] = fn & 0xffff;
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  return FFI_OK;
-}
diff --git a/third_party/gofrontend/libffi/src/moxie/ffitarget.h b/third_party/gofrontend/libffi/src/moxie/ffitarget.h
deleted file mode 100644
index 623e3ec..0000000
--- a/third_party/gofrontend/libffi/src/moxie/ffitarget.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012, 2013  Anthony Green
-   Target configuration macros for Moxie
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-/* ---- System specific configurations ----------------------------------- */
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_EABI,
-  FFI_DEFAULT_ABI = FFI_EABI,
-  FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
-} ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_NATIVE_RAW_API 0
-
-/* Trampolines are 12-bytes long.  See ffi_prep_closure_loc.  */
-#define FFI_TRAMPOLINE_SIZE (12)
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/nios2/ffi.c b/third_party/gofrontend/libffi/src/nios2/ffi.c
deleted file mode 100644
index 2efa033..0000000
--- a/third_party/gofrontend/libffi/src/nios2/ffi.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/* libffi support for Altera Nios II.
-
-   Copyright (c) 2013 Mentor Graphics.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-   
-   The above copyright notice and this permission notice shall be
-   included in all copies or substantial portions of the Software.
-   
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-   CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-   TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-   SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-
-/* The Nios II Processor Reference Handbook defines the procedure call
-   ABI as follows.
-
-   Arguments are passed as if a structure containing the types of
-   the arguments were constructed.  The first 16 bytes are passed in r4
-   through r7, the remainder on the stack.  The first 16 bytes of a function
-   taking variable arguments are passed in r4-r7 in the same way.
-
-   Return values of types up to 8 bytes are returned in r2 and r3.  For
-   return values greater than 8 bytes, the caller must allocate memory for
-   the result and pass the address as if it were argument 0.  
-
-   While this isn't specified explicitly in the ABI documentation, GCC
-   promotes integral arguments smaller than int size to 32 bits.
-
-   Also of note, the ABI specifies that all structure objects are
-   aligned to 32 bits even if all their fields have a smaller natural
-   alignment.  See FFI_AGGREGATE_ALIGNMENT.  */
-
-
-/* Declare the assembly language hooks.  */
-
-extern UINT64 ffi_call_sysv (void (*) (char *, extended_cif *),
-			     extended_cif *,
-			     unsigned, 
-			     void (*fn) (void));
-extern void ffi_closure_sysv (void);
-
-/* Perform machine-dependent cif processing.  */
-
-ffi_status ffi_prep_cif_machdep (ffi_cif *cif)
-{
-  /* We always want at least 16 bytes in the parameter block since it
-     simplifies the low-level call function.  Also round the parameter
-     block size up to a multiple of 4 bytes to preserve
-     32-bit alignment of the stack pointer.  */
-  if (cif->bytes < 16)
-    cif->bytes = 16;
-  else
-    cif->bytes = (cif->bytes + 3) & ~3;
-
-  return FFI_OK;
-}
-
-
-/* ffi_prep_args is called by the assembly routine to transfer arguments
-   to the stack using the pointers in the ecif array.
-   Note that the stack buffer is big enough to fit all the arguments,
-   but the first 16 bytes will be copied to registers for the actual
-   call.  */
-
-void ffi_prep_args (char *stack, extended_cif *ecif)
-{
-  char *argp = stack;
-  unsigned int i;
-
-  /* The implicit return value pointer is passed as if it were a hidden
-     first argument.  */
-  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
-      && ecif->cif->rtype->size > 8)
-    {
-      (*(void **) argp) = ecif->rvalue;
-      argp += 4;
-    }
-
-  for (i = 0; i < ecif->cif->nargs; i++)
-    {
-      void *avalue = ecif->avalue[i];
-      ffi_type *atype = ecif->cif->arg_types[i];
-      size_t size = atype->size;
-      size_t alignment = atype->alignment;
-
-      /* Align argp as appropriate for the argument type.  */
-      if ((alignment - 1) & (unsigned) argp)
-	argp = (char *) ALIGN (argp, alignment);
-
-      /* Copy the argument, promoting integral types smaller than a
-	 word to word size.  */
-      if (size < sizeof (int))
-	{
-	  size = sizeof (int);
-	  switch (atype->type)
-	    {
-	    case FFI_TYPE_SINT8:
-	      *(signed int *) argp = (signed int) *(SINT8 *) avalue;
-	      break;
-		  
-	    case FFI_TYPE_UINT8:
-	      *(unsigned int *) argp = (unsigned int) *(UINT8 *) avalue;
-	      break;
-		  
-	    case FFI_TYPE_SINT16:
-	      *(signed int *) argp = (signed int) *(SINT16 *) avalue;
-	      break;
-		  
-	    case FFI_TYPE_UINT16:
-	      *(unsigned int *) argp = (unsigned int) *(UINT16 *) avalue;
-	      break;
-
-	    case FFI_TYPE_STRUCT:
-	      memcpy (argp, avalue, atype->size);
-	      break;
-
-	    default:
-	      FFI_ASSERT(0);
-	    }
-	}
-      else if (size == sizeof (int))
-	*(unsigned int *) argp = (unsigned int) *(UINT32 *) avalue;
-      else
-	memcpy (argp, avalue, size);
-      argp += size;
-    }
-}
-
-
-/* Call FN using the prepared CIF.  RVALUE points to space allocated by
-   the caller for the return value, and AVALUE is an array of argument
-   pointers.  */
-
-void ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue)
-{
-
-  extended_cif ecif;
-  UINT64 result;
-
-  /* If bigret is true, this is the case where a return value of larger
-     than 8 bytes is handled by being passed by reference as an implicit
-     argument.  */
-  int bigret = (cif->rtype->type == FFI_TYPE_STRUCT
-		&& cif->rtype->size > 8);
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-
-  /* Allocate space for return value if this is the pass-by-reference case
-     and the caller did not provide a buffer.  */
-  if (rvalue == NULL && bigret)
-    ecif.rvalue = alloca (cif->rtype->size);
-  else
-    ecif.rvalue = rvalue;
-
-  result = ffi_call_sysv (ffi_prep_args, &ecif, cif->bytes, fn);
-
-  /* Now result contains the 64 bit contents returned from fn in
-     r2 and r3.  Copy the value of the appropriate size to the user-provided
-     rvalue buffer.  */
-  if (rvalue && !bigret)
-    switch (cif->rtype->size)
-      {
-      case 1:
-	*(UINT8 *)rvalue = (UINT8) result;
-	break;
-      case 2:
-	*(UINT16 *)rvalue = (UINT16) result;
-	break;
-      case 4:
-	*(UINT32 *)rvalue = (UINT32) result;
-	break;
-      case 8:
-	*(UINT64 *)rvalue = (UINT64) result;
-	break;
-      default:
-	memcpy (rvalue, (void *)&result, cif->rtype->size);
-	break;
-      }
-}
-
-/* This function is invoked from the closure trampoline to invoke
-   CLOSURE with argument block ARGS.  Parse ARGS according to
-   CLOSURE->cfi and invoke CLOSURE->fun.  */
-
-static UINT64
-ffi_closure_helper (unsigned char *args,
-		    ffi_closure *closure)
-{
-  ffi_cif *cif = closure->cif;
-  unsigned char *argp = args;
-  void **parsed_args = alloca (cif->nargs * sizeof (void *));
-  UINT64 result;
-  void *retptr;
-  unsigned int i;
-
-  /* First figure out what to do about the return type.  If this is the
-     big-structure-return case, the first arg is the hidden return buffer
-     allocated by the caller.  */
-  if (cif->rtype->type == FFI_TYPE_STRUCT
-      && cif->rtype->size > 8)
-    {
-      retptr = *((void **) argp);
-      argp += 4;
-    }
-  else
-    retptr = (void *) &result;
-
-  /* Fill in the array of argument pointers.  */
-  for (i = 0; i < cif->nargs; i++)
-    {
-      size_t size = cif->arg_types[i]->size;
-      size_t alignment = cif->arg_types[i]->alignment;
-
-      /* Align argp as appropriate for the argument type.  */
-      if ((alignment - 1) & (unsigned) argp)
-	argp = (char *) ALIGN (argp, alignment);
-
-      /* Arguments smaller than an int are promoted to int.  */
-      if (size < sizeof (int))
-	size = sizeof (int);
-
-      /* Store the pointer.  */
-      parsed_args[i] = argp;
-      argp += size;
-    }
-
-  /* Call the user-supplied function.  */
-  (closure->fun) (cif, retptr, parsed_args, closure->user_data);
-  return result;
-}
-
-
-/* Initialize CLOSURE with a trampoline to call FUN with
-   CIF and USER_DATA.  */
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun) (ffi_cif*, void*, void**, void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  unsigned int *tramp = (unsigned int *) &closure->tramp[0];
-  int i;
-
-  if (cif->abi != FFI_SYSV)
-    return FFI_BAD_ABI;
-
-  /* The trampoline looks like:
-       movhi r8, %hi(ffi_closure_sysv)
-       ori r8, r8, %lo(ffi_closure_sysv)
-       movhi r9, %hi(ffi_closure_helper)
-       ori r0, r9, %lo(ffi_closure_helper)
-       movhi r10, %hi(closure)
-       ori r10, r10, %lo(closure)
-       jmp r8
-     and then ffi_closure_sysv retrieves the closure pointer out of r10
-     in addition to the arguments passed in the normal way for the call,
-     and invokes ffi_closure_helper.  We encode the pointer to
-     ffi_closure_helper in the trampoline because making a PIC call
-     to it in ffi_closure_sysv would be messy (it would have to indirect
-     through the GOT).  */
-
-#define HI(x) ((((unsigned int) (x)) >> 16) & 0xffff)
-#define LO(x) (((unsigned int) (x)) & 0xffff)
-  tramp[0] = (0 << 27) | (8 << 22) | (HI (ffi_closure_sysv) << 6) | 0x34;
-  tramp[1] = (8 << 27) | (8 << 22) | (LO (ffi_closure_sysv) << 6) | 0x14;
-  tramp[2] = (0 << 27) | (9 << 22) | (HI (ffi_closure_helper) << 6) | 0x34;
-  tramp[3] = (9 << 27) | (9 << 22) | (LO (ffi_closure_helper) << 6) | 0x14;
-  tramp[4] = (0 << 27) | (10 << 22) | (HI (closure) << 6) | 0x34;
-  tramp[5] = (10 << 27) | (10 << 22) | (LO (closure) << 6) | 0x14;
-  tramp[6] = (8 << 27) | (0x0d << 11) | 0x3a;
-#undef HI
-#undef LO
-
-  /* Flush the caches.
-     See Example 9-4 in the Nios II Software Developer's Handbook.  */
-  for (i = 0; i < 7; i++)
-    asm volatile ("flushd 0(%0); flushi %0" :: "r"(tramp + i) : "memory");
-  asm volatile ("flushp" ::: "memory");
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  return FFI_OK;
-}
-
diff --git a/third_party/gofrontend/libffi/src/nios2/ffitarget.h b/third_party/gofrontend/libffi/src/nios2/ffitarget.h
deleted file mode 100644
index 134d118..0000000
--- a/third_party/gofrontend/libffi/src/nios2/ffitarget.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* libffi target includes for Altera Nios II.
-
-   Copyright (c) 2013 Mentor Graphics.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-   
-   The above copyright notice and this permission notice shall be
-   included in all copies or substantial portions of the Software.
-   
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-   CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-   TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-   SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_SYSV
-} ffi_abi;
-#endif
-
-/* Structures have a 4-byte alignment even if all the fields have lesser
-   alignment requirements.  */
-#define FFI_AGGREGATE_ALIGNMENT 4
-
-#define FFI_CLOSURES 1
-#define FFI_TRAMPOLINE_SIZE 28   /* 7 instructions */
-#define FFI_NATIVE_RAW_API 0
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/nios2/sysv.S b/third_party/gofrontend/libffi/src/nios2/sysv.S
deleted file mode 100644
index 75f442b..0000000
--- a/third_party/gofrontend/libffi/src/nios2/sysv.S
+++ /dev/null
@@ -1,136 +0,0 @@
-/* Low-level libffi support for Altera Nios II.
-
-   Copyright (c) 2013 Mentor Graphics.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-   
-   The above copyright notice and this permission notice shall be
-   included in all copies or substantial portions of the Software.
-   
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-   CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-   TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-   SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-/* This function is declared on the C side as 
-
-   extern UINT64 ffi_call_sysv (void (*arghook) (char *, extended_cif *),
-	  		        extended_cif *ecif,
-				unsigned nbytes, 
-				void (*fn) (void));
-	
-   On input, the arguments appear as
-	r4 = arghook
-	r5 = ecif
-	r6 = nbytes
-	r7 = fn
-*/
-
-	.section	.text
-	.align	2
-	.global	ffi_call_sysv
-	.type	ffi_call_sysv, @function
-
-ffi_call_sysv:
-	.cfi_startproc
-
-	/* Create the stack frame, saving r16 so we can use it locally.  */
-	addi	sp, sp, -12
-	.cfi_def_cfa_offset 12
-	stw	ra, 8(sp)
-	stw	fp, 4(sp)
-	stw	r16, 0(sp)
-	.cfi_offset 31, -4
-	.cfi_offset 28, -8
-	.cfi_offset 16, -12
-	mov	fp, sp
-	.cfi_def_cfa_register 28
-	mov	r16, r7
-
-	/* Adjust the stack pointer to create the argument buffer
-	   nbytes long.  */
-	sub	sp, sp, r6
-
-	/* Call the arghook function.  */
-	mov	r2, r4		/* fn */
-	mov	r4, sp		/* argbuffer */
-	callr	r2		/* r5 already contains ecif */
-
-	/* Pop off the first 16 bytes of the argument buffer on the stack,
-	   transferring the contents to the argument registers.  */
-	ldw	r4, 0(sp)
-	ldw	r5, 4(sp)
-	ldw	r6, 8(sp)
-	ldw	r7, 12(sp)
-	addi	sp, sp, 16
-
-	/* Call the user function, which leaves its result in r2 and r3.  */
-	callr	r16
-
-	/* Pop off the stack frame.  */
-	mov	sp, fp
-	ldw	ra, 8(sp)
-	ldw	fp, 4(sp)
-	ldw	r16, 0(sp)
-	addi	sp, sp, 12
-	ret
-	.cfi_endproc
-	.size	ffi_call_sysv, .-ffi_call_sysv
-
-
-/* Closure trampolines jump here after putting the C helper address
-   in r9 and the closure pointer in r10.  The user-supplied arguments
-   to the closure are in the normal places, in r4-r7 and on the
-   stack.  Push the register arguments on the stack too and then call the
-   C helper function to deal with them.  */
-   
-	.section	.text
-	.align	2
-	.global	ffi_closure_sysv
-	.type	ffi_closure_sysv, @function
-
-ffi_closure_sysv:
-	.cfi_startproc
-
-	/* Create the stack frame, pushing the register args on the stack
-	   just below the stack args.  This is the same trick illustrated
-	   in Figure 7-3 in the Nios II Processor Reference Handbook, used
-	   for variable arguments and structures passed by value.  */
-	addi	sp, sp, -20
-	.cfi_def_cfa_offset 20
-	stw	ra, 0(sp)
-	.cfi_offset 31, -20
-	stw	r4, 4(sp)
-	.cfi_offset 4, -16
-	stw	r5, 8(sp)
-	.cfi_offset 5, -12
-	stw	r6, 12(sp)
-	.cfi_offset 6, -8
-	stw	r7, 16(sp)
-	.cfi_offset 7, -4
-
-	/* Call the helper.
-	   r4 = pointer to arguments on stack
-	   r5 = closure pointer (loaded in r10 by the trampoline)
-	   r9 = address of helper function (loaded by trampoline) */
-	addi	r4, sp, 4
-	mov	r5, r10
-	callr	r9
-	
-	/* Pop the stack and return.  */
-	ldw	ra, 0(sp)
-	addi	sp, sp, 20
-	.cfi_def_cfa_offset -20
-	ret
-	.cfi_endproc
-	.size	ffi_closure_sysv, .-ffi_closure_sysv
-
diff --git a/third_party/gofrontend/libffi/src/or1k/ffi.c b/third_party/gofrontend/libffi/src/or1k/ffi.c
deleted file mode 100644
index 2bad938..0000000
--- a/third_party/gofrontend/libffi/src/or1k/ffi.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2014 Sebastian Macke <sebastian@macke.de>
-
-   OpenRISC Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include "ffi_common.h"
-
-/* ffi_prep_args is called by the assembly routine once stack space
-   has been allocated for the function's arguments */
-
-void* ffi_prep_args(char *stack, extended_cif *ecif)
-{
-  char *stacktemp = stack;
-  int i, s;
-  ffi_type **arg;
-  int count = 0;
-  int nfixedargs;
-  
-  nfixedargs = ecif->cif->nfixedargs;
-  arg = ecif->cif->arg_types;
-  void **argv = ecif->avalue;
-
-  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT)
-    {
-      *(void **) stack = ecif->rvalue;
-      stack += 4;
-      count = 4;
-    } 
-  for(i=0; i<ecif->cif->nargs; i++)
-  {
-
-    /* variadic args are saved on stack */
-    if ((nfixedargs == 0) && (count < 24))
-      {
-        count = 24;
-        stack = stacktemp + 24;        
-      }
-    nfixedargs--;
-
-    s = 4;
-    switch((*arg)->type) 
-      {
-      case FFI_TYPE_STRUCT:
-        *(void **)stack = *argv;
-        break;
-
-      case FFI_TYPE_SINT8:
-        *(signed int *) stack = (signed int)*(SINT8 *)(* argv);
-        break;
-
-      case FFI_TYPE_UINT8:
-        *(unsigned int *) stack = (unsigned int)*(UINT8 *)(* argv);
-        break;
-
-      case FFI_TYPE_SINT16:
-        *(signed int *) stack = (signed int)*(SINT16 *)(* argv);
-        break;
-
-      case FFI_TYPE_UINT16:
-        *(unsigned int *) stack = (unsigned int)*(UINT16 *)(* argv);
-        break;
-
-      case FFI_TYPE_SINT32:
-      case FFI_TYPE_UINT32:
-      case FFI_TYPE_FLOAT:
-      case FFI_TYPE_POINTER:
-        *(int *)stack = *(int*)(*argv);
-        break;
-
-      default: /* 8 byte types */
-        if (count == 20) /* never split arguments */
-          {
-            stack += 4;
-            count += 4;
-          }  
-        s = (*arg)->size;
-        memcpy(stack, *argv, s);
-        break;
-      }
-
-    stack += s;
-    count += s;
-    argv++;
-    arg++;
-  }
-  return stacktemp + ((count>24)?24:0);
-}
-
-extern void ffi_call_SYSV(unsigned,
-                          extended_cif *,
-                          void *(*)(int *, extended_cif *),
-                          unsigned *,
-                          void (*fn)(void),
-                          unsigned);
-
-
-void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  int i;
-  int size;
-  ffi_type **arg;
-
-  /* Calculate size to allocate on stack */
-
-  for(i = 0, arg = cif->arg_types, size=0; i < cif->nargs; i++, arg++)
-    {
-      if ((*arg)->type == FFI_TYPE_STRUCT)
-        size += 4;
-      else
-      if ((*arg)->size <= 4)
-        size += 4;
-      else
-        size += 8;
-    }
-
-  /* for variadic functions more space is needed on the stack */
-  if (cif->nargs != cif->nfixedargs)
-    size += 24;
-
-  if (cif->rtype->type == FFI_TYPE_STRUCT)
-    size += 4;
-
-
-  extended_cif ecif;
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-  ecif.rvalue = rvalue;
-
-  switch (cif->abi) 
-  {
-    case FFI_SYSV:
-      ffi_call_SYSV(size, &ecif, ffi_prep_args, rvalue, fn, cif->flags);
-      break;
-    default:
-      FFI_ASSERT(0);
-      break;
-  }
-}
-
-
-void ffi_closure_SYSV(unsigned long r3, unsigned long r4, unsigned long r5, 
-                      unsigned long r6, unsigned long r7, unsigned long r8)
-{
-  register int *sp __asm__ ("r17");
-  register int *r13 __asm__ ("r13");
-
-  ffi_closure* closure = (ffi_closure*) r13;
-  char *stack_args = sp;
-
-  /* Lay the register arguments down in a continuous chunk of memory.  */
-  unsigned register_args[6] =
-    { r3, r4, r5, r6, r7, r8 };
-
-  /* Pointer to a struct return value.  */
-  void *struct_rvalue = (void *) r3;
-
-  ffi_cif *cif = closure->cif;
-  ffi_type **arg_types = cif->arg_types;
-  void **avalue = alloca (cif->nargs * sizeof(void *));
-  char *ptr = (char *) register_args;
-  int count = 0;
-  int nfixedargs = cif->nfixedargs;
-  int i;
-
-  /* preserve struct type return pointer passing */
-
-  if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) 
-  {
-    ptr += 4;
-    count = 4;
-  }
-
-  /* Find the address of each argument.  */
-  for (i = 0; i < cif->nargs; i++)
-    {
-
-      /* variadic args are saved on stack */
-      if ((nfixedargs == 0) && (count < 24))
-        {
-          ptr = stack_args;
-          count = 24;
-        }
-      nfixedargs--;
-
-      switch (arg_types[i]->type)
-        {
-        case FFI_TYPE_SINT8:
-        case FFI_TYPE_UINT8:
-          avalue[i] = ptr + 3;
-          break;
-
-        case FFI_TYPE_SINT16:
-        case FFI_TYPE_UINT16:
-          avalue[i] = ptr + 2;
-          break;
-
-        case FFI_TYPE_SINT32:
-        case FFI_TYPE_UINT32:
-        case FFI_TYPE_FLOAT:
-        case FFI_TYPE_POINTER:
-          avalue[i] = ptr;
-          break;
-
-        case FFI_TYPE_STRUCT:
-          avalue[i] = *(void**)ptr;
-          break;
-
-        default:
-          /* 8-byte values  */
-
-          /* arguments are never splitted */
-          if (ptr == &register_args[5])
-            ptr = stack_args;
-          avalue[i] = ptr;
-          ptr += 4;
-          count += 4;
-          break;
-        }
-      ptr += 4;
-      count += 4;
-
-      /* If we've handled more arguments than fit in registers,
-         start looking at the those passed on the stack.  */
-
-      if (count == 24)
-        ptr = stack_args;
-    }
-
-  if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT))
-    {
-      (closure->fun) (cif, struct_rvalue, avalue, closure->user_data);
-    } else
-    {
-      long long rvalue;
-      (closure->fun) (cif, &rvalue, avalue, closure->user_data);
-      if (cif->rtype)
-        asm ("l.ori r12, %0, 0x0\n l.lwz r11, 0(r12)\n l.lwz r12, 4(r12)" : : "r" (&rvalue));      
-    }
-}
-
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-                      ffi_cif* cif,
-                      void (*fun)(ffi_cif*,void*,void**,void*),
-                      void *user_data,
-                      void *codeloc)
-{
-  unsigned short *tramp = (unsigned short *) closure->tramp;
-  unsigned long fn = (unsigned long) ffi_closure_SYSV;
-  unsigned long cls = (unsigned long) codeloc;
-
-  if (cif->abi != FFI_SYSV)
-    return FFI_BAD_ABI;
-
-  closure->cif = cif;
-  closure->user_data = user_data;
-  closure->fun = fun;
-
-  /* write pointers to temporary registers */
-  tramp[0] = (0x6 << 10) | (13 << 5); /* l.movhi r13, ... */
-  tramp[1] = cls >> 16;
-  tramp[2] = (0x2a << 10) | (13 << 5) | 13; /* l.ori r13, r13, ... */
-  tramp[3] = cls & 0xFFFF;
-
-  tramp[4] = (0x6 << 10) | (15 << 5); /* l.movhi r15, ... */
-  tramp[5] = fn >> 16;
-  tramp[6] = (0x2a << 10) | (15 << 5) | 15; /* l.ori r15, r15 ... */
-  tramp[7] = fn & 0xFFFF;
-
-  tramp[8] = (0x11 << 10); /* l.jr r15 */
-  tramp[9] = 15 << 11;
-
-  tramp[10] = (0x2a << 10) | (17 << 5) | 1; /* l.ori r17, r1, ... */
-  tramp[11] = 0x0;
-
-  return FFI_OK;
-}
-
-
-ffi_status ffi_prep_cif_machdep (ffi_cif *cif)
-{
-  cif->flags = 0;
-	
-  /* structures are returned as pointers */
-  if (cif->rtype->type == FFI_TYPE_STRUCT)
-    cif->flags = FFI_TYPE_STRUCT;
-  else 
-  if (cif->rtype->size > 4)
-    cif->flags = FFI_TYPE_UINT64;
-
-  cif->nfixedargs = cif->nargs;
-
-  return FFI_OK;
-}
-
-
-ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif,
-         unsigned int nfixedargs, unsigned int ntotalargs)
-{
-  ffi_status status;
-
-  status = ffi_prep_cif_machdep (cif);
-  cif->nfixedargs = nfixedargs;
-  return status;
-} 
diff --git a/third_party/gofrontend/libffi/src/or1k/ffitarget.h b/third_party/gofrontend/libffi/src/or1k/ffitarget.h
deleted file mode 100644
index e55da28..0000000
--- a/third_party/gofrontend/libffi/src/or1k/ffitarget.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffitarget.h - Copyright (c) 2014 Sebastian Macke <sebastian@macke.de>
-
-   OpenRISC Target configuration macros
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
-#endif
-
-/* ---- System specific configurations ----------------------------------- */
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_SYSV
-} ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_NATIVE_RAW_API 0
-#define FFI_TRAMPOLINE_SIZE (24)
-
-#define FFI_TARGET_SPECIFIC_VARIADIC 1
-#define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs;
-
-#endif
-
diff --git a/third_party/gofrontend/libffi/src/or1k/sysv.S b/third_party/gofrontend/libffi/src/or1k/sysv.S
deleted file mode 100644
index df6570b..0000000
--- a/third_party/gofrontend/libffi/src/or1k/sysv.S
+++ /dev/null
@@ -1,107 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2014 Sebastian Macke <sebastian@macke.de>
-
-   OpenRISC Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-
-.text
-	.globl ffi_call_SYSV
-	.type ffi_call_SYSV, @function
-/*
-  r3: size to allocate on stack
-  r4: extended cif structure
-  r5: function pointer ffi_prep_args
-  r6: ret address
-  r7: function to call
-  r8: flag for return type
-*/
-
-ffi_call_SYSV:
-	/* Store registers used on stack */
-	l.sw -4(r1), r9 /* return address */
-	l.sw -8(r1), r1 /* stack address */
-	l.sw -12(r1), r14 /* callee saved registers */
-	l.sw -16(r1), r16
-	l.sw -20(r1), r18 
-	l.sw -24(r1), r20
-
-	l.ori r14, r1, 0x0 /* save stack pointer */
-	l.addi r1, r1, -24
-
-	l.ori r16, r7, 0x0 /* save function address */
-	l.ori r18, r6, 0x0 /* save ret address */
-	l.ori r20, r8, 0x0 /* save flag */
-
-	l.sub r1, r1, r3 /* reserve space on stack */
-
-	/* Call ffi_prep_args */
-	l.ori r3, r1, 0x0  /* first argument stack address, second already ecif */
-	l.jalr r5
-	l.nop
-
-	/* Load register arguments and call*/
-
-	l.lwz r3, 0(r1)
-	l.lwz r4, 4(r1)
-	l.lwz r5, 8(r1)
-	l.lwz r6, 12(r1)
-	l.lwz r7, 16(r1)
-	l.lwz r8, 20(r1)
-	l.ori r1, r11, 0x0 /* new stack pointer */
-	l.jalr r16
-	l.nop
-	
-	/* handle return values */
-
-	l.sfeqi r20, FFI_TYPE_STRUCT
-	l.bf ret  /* structs don't return an rvalue */
-	l.nop
-
-	/* copy ret address */
-
-	l.sfeqi r20, FFI_TYPE_UINT64
-	l.bnf four_byte_ret  /* 8 byte value is returned */
-	l.nop
-
-	l.sw 4(r18), r12
-
-four_byte_ret:
-	l.sw 0(r18), r11
-
-ret:
-	/* return */
-	l.ori r1, r14, 0x0 /* reset stack pointer */
-	l.lwz r9, -4(r1)
-	l.lwz r1, -8(r1)
-	l.lwz r14, -12(r1)
-	l.lwz r16, -16(r1)
-	l.lwz r18, -20(r1)
-	l.lwz r20, -24(r1)
-	l.jr r9
-	l.nop
-
-.size ffi_call_SYSV, .-ffi_call_SYSV
diff --git a/third_party/gofrontend/libffi/src/pa/ffi.c b/third_party/gofrontend/libffi/src/pa/ffi.c
deleted file mode 100644
index 4ce2bc6..0000000
--- a/third_party/gofrontend/libffi/src/pa/ffi.c
+++ /dev/null
@@ -1,719 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - (c) 2011 Anthony Green
-           (c) 2008 Red Hat, Inc.
-	   (c) 2006 Free Software Foundation, Inc.
-           (c) 2003-2004 Randolph Chung <tausq@debian.org>
-           
-   HPPA Foreign Function Interface
-   HP-UX PA ABI support 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#define ROUND_UP(v, a)  (((size_t)(v) + (a) - 1) & ~((a) - 1))
-
-#define MIN_STACK_SIZE  64
-#define FIRST_ARG_SLOT  9
-#define DEBUG_LEVEL   0
-
-#define fldw(addr, fpreg) \
-  __asm__ volatile ("fldw 0(%0), %%" #fpreg "L" : : "r"(addr) : #fpreg)
-#define fstw(fpreg, addr) \
-  __asm__ volatile ("fstw %%" #fpreg "L, 0(%0)" : : "r"(addr))
-#define fldd(addr, fpreg) \
-  __asm__ volatile ("fldd 0(%0), %%" #fpreg : : "r"(addr) : #fpreg)
-#define fstd(fpreg, addr) \
-  __asm__ volatile ("fstd %%" #fpreg "L, 0(%0)" : : "r"(addr))
-
-#define debug(lvl, x...) do { if (lvl <= DEBUG_LEVEL) { printf(x); } } while (0)
-
-static inline int ffi_struct_type(ffi_type *t)
-{
-  size_t sz = t->size;
-
-  /* Small structure results are passed in registers,
-     larger ones are passed by pointer.  Note that
-     small structures of size 2, 4 and 8 differ from
-     the corresponding integer types in that they have
-     different alignment requirements.  */
-
-  if (sz <= 1)
-    return FFI_TYPE_UINT8;
-  else if (sz == 2)
-    return FFI_TYPE_SMALL_STRUCT2;
-  else if (sz == 3)
-    return FFI_TYPE_SMALL_STRUCT3;
-  else if (sz == 4)
-    return FFI_TYPE_SMALL_STRUCT4;
-  else if (sz == 5)
-    return FFI_TYPE_SMALL_STRUCT5;
-  else if (sz == 6)
-    return FFI_TYPE_SMALL_STRUCT6;
-  else if (sz == 7)
-    return FFI_TYPE_SMALL_STRUCT7;
-  else if (sz <= 8)
-    return FFI_TYPE_SMALL_STRUCT8;
-  else
-    return FFI_TYPE_STRUCT; /* else, we pass it by pointer.  */
-}
-
-/* PA has a downward growing stack, which looks like this:
-
-   Offset
-	[ Variable args ]
-   SP = (4*(n+9))       arg word N
-   ...
-   SP-52                arg word 4
-	[ Fixed args ]
-   SP-48                arg word 3
-   SP-44                arg word 2
-   SP-40                arg word 1
-   SP-36                arg word 0
-	[ Frame marker ]
-   ...
-   SP-20                RP
-   SP-4                 previous SP
-
-   The first four argument words on the stack are reserved for use by
-   the callee.  Instead, the general and floating registers replace
-   the first four argument slots.  Non FP arguments are passed solely
-   in the general registers.  FP arguments are passed in both general
-   and floating registers when using libffi.
-
-   Non-FP 32-bit args are passed in gr26, gr25, gr24 and gr23.
-   Non-FP 64-bit args are passed in register pairs, starting
-   on an odd numbered register (i.e. r25+r26 and r23+r24).
-   FP 32-bit arguments are passed in fr4L, fr5L, fr6L and fr7L.
-   FP 64-bit arguments are passed in fr5 and fr7.
-
-   The registers are allocated in the same manner as stack slots.
-   This allows the callee to save its arguments on the stack if
-   necessary:
-
-   arg word 3 -> gr23 or fr7L
-   arg word 2 -> gr24 or fr6L or fr7R
-   arg word 1 -> gr25 or fr5L
-   arg word 0 -> gr26 or fr4L or fr5R
-
-   Note that fr4R and fr6R are never used for arguments (i.e.,
-   doubles are not passed in fr4 or fr6).
-
-   The rest of the arguments are passed on the stack starting at SP-52,
-   but 64-bit arguments need to be aligned to an 8-byte boundary
-
-   This means we can have holes either in the register allocation,
-   or in the stack.  */
-
-/* ffi_prep_args is called by the assembly routine once stack space
-   has been allocated for the function's arguments
-
-   The following code will put everything into the stack frame
-   (which was allocated by the asm routine), and on return
-   the asm routine will load the arguments that should be
-   passed by register into the appropriate registers
-
-   NOTE: We load floating point args in this function... that means we
-   assume gcc will not mess with fp regs in here.  */
-
-void ffi_prep_args_pa32(UINT32 *stack, extended_cif *ecif, unsigned bytes)
-{
-  register unsigned int i;
-  register ffi_type **p_arg;
-  register void **p_argv;
-  unsigned int slot = FIRST_ARG_SLOT;
-  char *dest_cpy;
-  size_t len;
-
-  debug(1, "%s: stack = %p, ecif = %p, bytes = %u\n", __FUNCTION__, stack,
-	ecif, bytes);
-
-  p_arg = ecif->cif->arg_types;
-  p_argv = ecif->avalue;
-
-  for (i = 0; i < ecif->cif->nargs; i++)
-    {
-      int type = (*p_arg)->type;
-
-      switch (type)
-	{
-	case FFI_TYPE_SINT8:
-	  *(SINT32 *)(stack - slot) = *(SINT8 *)(*p_argv);
-	  break;
-
-	case FFI_TYPE_UINT8:
-	  *(UINT32 *)(stack - slot) = *(UINT8 *)(*p_argv);
-	  break;
-
-	case FFI_TYPE_SINT16:
-	  *(SINT32 *)(stack - slot) = *(SINT16 *)(*p_argv);
-	  break;
-
-	case FFI_TYPE_UINT16:
-	  *(UINT32 *)(stack - slot) = *(UINT16 *)(*p_argv);
-	  break;
-
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_POINTER:
-	  debug(3, "Storing UINT32 %u in slot %u\n", *(UINT32 *)(*p_argv),
-		slot);
-	  *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv);
-	  break;
-
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	  /* Align slot for 64-bit type.  */
-	  slot += (slot & 1) ? 1 : 2;
-	  *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv);
-	  break;
-
-	case FFI_TYPE_FLOAT:
-	  /* First 4 args go in fr4L - fr7L.  */
-	  debug(3, "Storing UINT32(float) in slot %u\n", slot);
-	  *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv);
-	  switch (slot - FIRST_ARG_SLOT)
-	    {
-	    /* First 4 args go in fr4L - fr7L.  */
-	    case 0: fldw(stack - slot, fr4); break;
-	    case 1: fldw(stack - slot, fr5); break;
-	    case 2: fldw(stack - slot, fr6); break;
-	    case 3: fldw(stack - slot, fr7); break;
-	    }
-	  break;
-
-	case FFI_TYPE_DOUBLE:
-	  /* Align slot for 64-bit type.  */
-	  slot += (slot & 1) ? 1 : 2;
-	  debug(3, "Storing UINT64(double) at slot %u\n", slot);
-	  *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv);
-	  switch (slot - FIRST_ARG_SLOT)
-	    {
-	      /* First 2 args go in fr5, fr7.  */
-	      case 1: fldd(stack - slot, fr5); break;
-	      case 3: fldd(stack - slot, fr7); break;
-	    }
-	  break;
-
-#ifdef PA_HPUX
-	case FFI_TYPE_LONGDOUBLE:
-	  /* Long doubles are passed in the same manner as structures
-	     larger than 8 bytes.  */
-	  *(UINT32 *)(stack - slot) = (UINT32)(*p_argv);
-	  break;
-#endif
-
-	case FFI_TYPE_STRUCT:
-
-	  /* Structs smaller or equal than 4 bytes are passed in one
-	     register. Structs smaller or equal 8 bytes are passed in two
-	     registers. Larger structures are passed by pointer.  */
-
-	  len = (*p_arg)->size;
-	  if (len <= 4)
-	    {
-	      dest_cpy = (char *)(stack - slot) + 4 - len;
-	      memcpy(dest_cpy, (char *)*p_argv, len);
-	    }
-	  else if (len <= 8)
-	    {
-	      slot += (slot & 1) ? 1 : 2;
-	      dest_cpy = (char *)(stack - slot) + 8 - len;
-	      memcpy(dest_cpy, (char *)*p_argv, len);
-	    }
-	  else
-	    *(UINT32 *)(stack - slot) = (UINT32)(*p_argv);
-	  break;
-
-	default:
-	  FFI_ASSERT(0);
-	}
-
-      slot++;
-      p_arg++;
-      p_argv++;
-    }
-
-  /* Make sure we didn't mess up and scribble on the stack.  */
-  {
-    unsigned int n;
-
-    debug(5, "Stack setup:\n");
-    for (n = 0; n < (bytes + 3) / 4; n++)
-      {
-	if ((n%4) == 0) { debug(5, "\n%08x: ", (unsigned int)(stack - n)); }
-	debug(5, "%08x ", *(stack - n));
-      }
-    debug(5, "\n");
-  }
-
-  FFI_ASSERT(slot * 4 <= bytes);
-
-  return;
-}
-
-static void ffi_size_stack_pa32(ffi_cif *cif)
-{
-  ffi_type **ptr;
-  int i;
-  int z = 0; /* # stack slots */
-
-  for (ptr = cif->arg_types, i = 0; i < cif->nargs; ptr++, i++)
-    {
-      int type = (*ptr)->type;
-
-      switch (type)
-	{
-	case FFI_TYPE_DOUBLE:
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	  z += 2 + (z & 1); /* must start on even regs, so we may waste one */
-	  break;
-
-#ifdef PA_HPUX
-	case FFI_TYPE_LONGDOUBLE:
-#endif
-	case FFI_TYPE_STRUCT:
-	  z += 1; /* pass by ptr, callee will copy */
-	  break;
-
-	default: /* <= 32-bit values */
-	  z++;
-	}
-    }
-
-  /* We can fit up to 6 args in the default 64-byte stack frame,
-     if we need more, we need more stack.  */
-  if (z <= 6)
-    cif->bytes = MIN_STACK_SIZE; /* min stack size */
-  else
-    cif->bytes = 64 + ROUND_UP((z - 6) * sizeof(UINT32), MIN_STACK_SIZE);
-
-  debug(3, "Calculated stack size is %u bytes\n", cif->bytes);
-}
-
-/* Perform machine dependent cif processing.  */
-ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  /* Set the return type flag */
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_VOID:
-    case FFI_TYPE_FLOAT:
-    case FFI_TYPE_DOUBLE:
-      cif->flags = (unsigned) cif->rtype->type;
-      break;
-
-#ifdef PA_HPUX
-    case FFI_TYPE_LONGDOUBLE:
-      /* Long doubles are treated like a structure.  */
-      cif->flags = FFI_TYPE_STRUCT;
-      break;
-#endif
-
-    case FFI_TYPE_STRUCT:
-      /* For the return type we have to check the size of the structures.
-	 If the size is smaller or equal 4 bytes, the result is given back
-	 in one register. If the size is smaller or equal 8 bytes than we
-	 return the result in two registers. But if the size is bigger than
-	 8 bytes, we work with pointers.  */
-      cif->flags = ffi_struct_type(cif->rtype);
-      break;
-
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_SINT64:
-      cif->flags = FFI_TYPE_UINT64;
-      break;
-
-    default:
-      cif->flags = FFI_TYPE_INT;
-      break;
-    }
-
-  /* Lucky us, because of the unique PA ABI we get to do our
-     own stack sizing.  */
-  switch (cif->abi)
-    {
-    case FFI_PA32:
-      ffi_size_stack_pa32(cif);
-      break;
-
-    default:
-      FFI_ASSERT(0);
-      break;
-    }
-
-  return FFI_OK;
-}
-
-extern void ffi_call_pa32(void (*)(UINT32 *, extended_cif *, unsigned),
-			  extended_cif *, unsigned, unsigned, unsigned *,
-			  void (*fn)(void));
-
-void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  extended_cif ecif;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-
-  /* If the return value is a struct and we don't have a return
-     value address then we need to make one.  */
-
-  if (rvalue == NULL
-#ifdef PA_HPUX
-      && (cif->rtype->type == FFI_TYPE_STRUCT
-	  || cif->rtype->type == FFI_TYPE_LONGDOUBLE))
-#else
-      && cif->rtype->type == FFI_TYPE_STRUCT)
-#endif
-    {
-      ecif.rvalue = alloca(cif->rtype->size);
-    }
-  else
-    ecif.rvalue = rvalue;
-
-
-  switch (cif->abi)
-    {
-    case FFI_PA32:
-      debug(3, "Calling ffi_call_pa32: ecif=%p, bytes=%u, flags=%u, rvalue=%p, fn=%p\n", &ecif, cif->bytes, cif->flags, ecif.rvalue, (void *)fn);
-      ffi_call_pa32(ffi_prep_args_pa32, &ecif, cif->bytes,
-		     cif->flags, ecif.rvalue, fn);
-      break;
-
-    default:
-      FFI_ASSERT(0);
-      break;
-    }
-}
-
-#if FFI_CLOSURES
-/* This is more-or-less an inverse of ffi_call -- we have arguments on
-   the stack, and we need to fill them into a cif structure and invoke
-   the user function. This really ought to be in asm to make sure
-   the compiler doesn't do things we don't expect.  */
-ffi_status ffi_closure_inner_pa32(ffi_closure *closure, UINT32 *stack)
-{
-  ffi_cif *cif;
-  void **avalue;
-  void *rvalue;
-  UINT32 ret[2]; /* function can return up to 64-bits in registers */
-  ffi_type **p_arg;
-  char *tmp;
-  int i, avn;
-  unsigned int slot = FIRST_ARG_SLOT;
-  register UINT32 r28 asm("r28");
-
-  cif = closure->cif;
-
-  /* If returning via structure, callee will write to our pointer.  */
-  if (cif->flags == FFI_TYPE_STRUCT)
-    rvalue = (void *)r28;
-  else
-    rvalue = &ret[0];
-
-  avalue = (void **)alloca(cif->nargs * FFI_SIZEOF_ARG);
-  avn = cif->nargs;
-  p_arg = cif->arg_types;
-
-  for (i = 0; i < avn; i++)
-    {
-      int type = (*p_arg)->type;
-
-      switch (type)
-	{
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT8:
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT16:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_POINTER:
-	  avalue[i] = (char *)(stack - slot) + sizeof(UINT32) - (*p_arg)->size;
-	  break;
-
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_UINT64:
-	  slot += (slot & 1) ? 1 : 2;
-	  avalue[i] = (void *)(stack - slot);
-	  break;
-
-	case FFI_TYPE_FLOAT:
-#ifdef PA_LINUX
-	  /* The closure call is indirect.  In Linux, floating point
-	     arguments in indirect calls with a prototype are passed
-	     in the floating point registers instead of the general
-	     registers.  So, we need to replace what was previously
-	     stored in the current slot with the value in the
-	     corresponding floating point register.  */
-	  switch (slot - FIRST_ARG_SLOT)
-	    {
-	    case 0: fstw(fr4, (void *)(stack - slot)); break;
-	    case 1: fstw(fr5, (void *)(stack - slot)); break;
-	    case 2: fstw(fr6, (void *)(stack - slot)); break;
-	    case 3: fstw(fr7, (void *)(stack - slot)); break;
-	    }
-#endif
-	  avalue[i] = (void *)(stack - slot);
-	  break;
-
-	case FFI_TYPE_DOUBLE:
-	  slot += (slot & 1) ? 1 : 2;
-#ifdef PA_LINUX
-	  /* See previous comment for FFI_TYPE_FLOAT.  */
-	  switch (slot - FIRST_ARG_SLOT)
-	    {
-	    case 1: fstd(fr5, (void *)(stack - slot)); break;
-	    case 3: fstd(fr7, (void *)(stack - slot)); break;
-	    }
-#endif
-	  avalue[i] = (void *)(stack - slot);
-	  break;
-
-#ifdef PA_HPUX
-	case FFI_TYPE_LONGDOUBLE:
-	  /* Long doubles are treated like a big structure.  */
-	  avalue[i] = (void *) *(stack - slot);
-	  break;
-#endif
-
-	case FFI_TYPE_STRUCT:
-	  /* Structs smaller or equal than 4 bytes are passed in one
-	     register. Structs smaller or equal 8 bytes are passed in two
-	     registers. Larger structures are passed by pointer.  */
-	  if((*p_arg)->size <= 4)
-	    {
-	      avalue[i] = (void *)(stack - slot) + sizeof(UINT32) -
-		(*p_arg)->size;
-	    }
-	  else if ((*p_arg)->size <= 8)
-	    {
-	      slot += (slot & 1) ? 1 : 2;
-	      avalue[i] = (void *)(stack - slot) + sizeof(UINT64) -
-		(*p_arg)->size;
-	    }
-	  else
-	    avalue[i] = (void *) *(stack - slot);
-	  break;
-
-	default:
-	  FFI_ASSERT(0);
-	}
-
-      slot++;
-      p_arg++;
-    }
-
-  /* Invoke the closure.  */
-  (closure->fun) (cif, rvalue, avalue, closure->user_data);
-
-  debug(3, "after calling function, ret[0] = %08x, ret[1] = %08x\n", ret[0],
-	ret[1]);
-
-  /* Store the result using the lower 2 bytes of the flags.  */
-  switch (cif->flags)
-    {
-    case FFI_TYPE_UINT8:
-      *(stack - FIRST_ARG_SLOT) = (UINT8)(ret[0] >> 24);
-      break;
-    case FFI_TYPE_SINT8:
-      *(stack - FIRST_ARG_SLOT) = (SINT8)(ret[0] >> 24);
-      break;
-    case FFI_TYPE_UINT16:
-      *(stack - FIRST_ARG_SLOT) = (UINT16)(ret[0] >> 16);
-      break;
-    case FFI_TYPE_SINT16:
-      *(stack - FIRST_ARG_SLOT) = (SINT16)(ret[0] >> 16);
-      break;
-    case FFI_TYPE_INT:
-    case FFI_TYPE_SINT32:
-    case FFI_TYPE_UINT32:
-      *(stack - FIRST_ARG_SLOT) = ret[0];
-      break;
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-      *(stack - FIRST_ARG_SLOT) = ret[0];
-      *(stack - FIRST_ARG_SLOT - 1) = ret[1];
-      break;
-
-    case FFI_TYPE_DOUBLE:
-      fldd(rvalue, fr4);
-      break;
-
-    case FFI_TYPE_FLOAT:
-      fldw(rvalue, fr4);
-      break;
-
-    case FFI_TYPE_STRUCT:
-      /* Don't need a return value, done by caller.  */
-      break;
-
-    case FFI_TYPE_SMALL_STRUCT2:
-    case FFI_TYPE_SMALL_STRUCT3:
-    case FFI_TYPE_SMALL_STRUCT4:
-      tmp = (void*)(stack -  FIRST_ARG_SLOT);
-      tmp += 4 - cif->rtype->size;
-      memcpy((void*)tmp, &ret[0], cif->rtype->size);
-      break;
-
-    case FFI_TYPE_SMALL_STRUCT5:
-    case FFI_TYPE_SMALL_STRUCT6:
-    case FFI_TYPE_SMALL_STRUCT7:
-    case FFI_TYPE_SMALL_STRUCT8:
-      {
-	unsigned int ret2[2];
-	int off;
-
-	/* Right justify ret[0] and ret[1] */
-	switch (cif->flags)
-	  {
-	    case FFI_TYPE_SMALL_STRUCT5: off = 3; break;
-	    case FFI_TYPE_SMALL_STRUCT6: off = 2; break;
-	    case FFI_TYPE_SMALL_STRUCT7: off = 1; break;
-	    default: off = 0; break;
-	  }
-
-	memset (ret2, 0, sizeof (ret2));
-	memcpy ((char *)ret2 + off, ret, 8 - off);
-
-	*(stack - FIRST_ARG_SLOT) = ret2[0];
-	*(stack - FIRST_ARG_SLOT - 1) = ret2[1];
-      }
-      break;
-
-    case FFI_TYPE_POINTER:
-    case FFI_TYPE_VOID:
-      break;
-
-    default:
-      debug(0, "assert with cif->flags: %d\n",cif->flags);
-      FFI_ASSERT(0);
-      break;
-    }
-  return FFI_OK;
-}
-
-/* Fill in a closure to refer to the specified fun and user_data.
-   cif specifies the argument and result types for fun.
-   The cif must already be prep'ed.  */
-
-extern void ffi_closure_pa32(void);
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun)(ffi_cif*,void*,void**,void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  UINT32 *tramp = (UINT32 *)(closure->tramp);
-#ifdef PA_HPUX
-  UINT32 *tmp;
-#endif
-
-  if (cif->abi != FFI_PA32)
-    return FFI_BAD_ABI;
-
-  /* Make a small trampoline that will branch to our
-     handler function. Use PC-relative addressing.  */
-
-#ifdef PA_LINUX
-  tramp[0] = 0xeaa00000; /* b,l .+8,%r21        ; %r21 <- pc+8 */
-  tramp[1] = 0xd6a01c1e; /* depi 0,31,2,%r21    ; mask priv bits */
-  tramp[2] = 0x4aa10028; /* ldw 20(%r21),%r1    ; load plabel */
-  tramp[3] = 0x36b53ff1; /* ldo -8(%r21),%r21   ; get closure addr */
-  tramp[4] = 0x0c201096; /* ldw 0(%r1),%r22     ; address of handler */
-  tramp[5] = 0xeac0c000; /* bv%r0(%r22)         ; branch to handler */
-  tramp[6] = 0x0c281093; /* ldw 4(%r1),%r19     ; GP of handler */
-  tramp[7] = ((UINT32)(ffi_closure_pa32) & ~2);
-
-  /* Flush d/icache -- have to flush up 2 two lines because of
-     alignment.  */
-  __asm__ volatile(
-		   "fdc 0(%0)\n\t"
-		   "fdc %1(%0)\n\t"
-		   "fic 0(%%sr4, %0)\n\t"
-		   "fic %1(%%sr4, %0)\n\t"
-		   "sync\n\t"
-		   "nop\n\t"
-		   "nop\n\t"
-		   "nop\n\t"
-		   "nop\n\t"
-		   "nop\n\t"
-		   "nop\n\t"
-		   "nop\n"
-		   :
-		   : "r"((unsigned long)tramp & ~31),
-		     "r"(32 /* stride */)
-		   : "memory");
-#endif
-
-#ifdef PA_HPUX
-  tramp[0] = 0xeaa00000; /* b,l .+8,%r21        ; %r21 <- pc+8  */
-  tramp[1] = 0xd6a01c1e; /* depi 0,31,2,%r21    ; mask priv bits  */
-  tramp[2] = 0x4aa10038; /* ldw 28(%r21),%r1    ; load plabel  */
-  tramp[3] = 0x36b53ff1; /* ldo -8(%r21),%r21   ; get closure addr  */
-  tramp[4] = 0x0c201096; /* ldw 0(%r1),%r22     ; address of handler  */
-  tramp[5] = 0x02c010b4; /* ldsid (%r22),%r20   ; load space id  */
-  tramp[6] = 0x00141820; /* mtsp %r20,%sr0      ; into %sr0  */
-  tramp[7] = 0xe2c00000; /* be 0(%sr0,%r22)     ; branch to handler  */
-  tramp[8] = 0x0c281093; /* ldw 4(%r1),%r19     ; GP of handler  */
-  tramp[9] = ((UINT32)(ffi_closure_pa32) & ~2);
-
-  /* Flush d/icache -- have to flush three lines because of alignment.  */
-  __asm__ volatile(
-		   "copy %1,%0\n\t"
-		   "fdc,m %2(%0)\n\t"
-		   "fdc,m %2(%0)\n\t"
-		   "fdc,m %2(%0)\n\t"
-		   "ldsid (%1),%0\n\t"
-		   "mtsp %0,%%sr0\n\t"
-		   "copy %1,%0\n\t"
-		   "fic,m %2(%%sr0,%0)\n\t"
-		   "fic,m %2(%%sr0,%0)\n\t"
-		   "fic,m %2(%%sr0,%0)\n\t"
-		   "sync\n\t"
-		   "nop\n\t"
-		   "nop\n\t"
-		   "nop\n\t"
-		   "nop\n\t"
-		   "nop\n\t"
-		   "nop\n\t"
-		   "nop\n"
-		   : "=&r" ((unsigned long)tmp)
-		   : "r" ((unsigned long)tramp & ~31),
-		     "r" (32/* stride */)
-		   : "memory");
-#endif
-
-  closure->cif  = cif;
-  closure->user_data = user_data;
-  closure->fun  = fun;
-
-  return FFI_OK;
-}
-#endif
diff --git a/third_party/gofrontend/libffi/src/pa/ffitarget.h b/third_party/gofrontend/libffi/src/pa/ffitarget.h
deleted file mode 100644
index fff4c6b..0000000
--- a/third_party/gofrontend/libffi/src/pa/ffitarget.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 1996-2003  Red Hat, Inc.
-   Target configuration macros for hppa.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-/* ---- System specific configurations ----------------------------------- */
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-
-#ifdef PA_LINUX
-  FFI_PA32,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_PA32
-#endif
-
-#ifdef PA_HPUX
-  FFI_PA32,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_PA32
-#endif
-
-#ifdef PA64_HPUX
-#error "PA64_HPUX FFI is not yet implemented"
-  FFI_PA64,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_PA64
-#endif
-} ffi_abi;
-#endif
-
-#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_NATIVE_RAW_API 0
-
-#ifdef PA_LINUX
-#define FFI_TRAMPOLINE_SIZE 32
-#else
-#define FFI_TRAMPOLINE_SIZE 40
-#endif
-
-#define FFI_TYPE_SMALL_STRUCT2 -1
-#define FFI_TYPE_SMALL_STRUCT3 -2
-#define FFI_TYPE_SMALL_STRUCT4 -3
-#define FFI_TYPE_SMALL_STRUCT5 -4
-#define FFI_TYPE_SMALL_STRUCT6 -5
-#define FFI_TYPE_SMALL_STRUCT7 -6
-#define FFI_TYPE_SMALL_STRUCT8 -7
-#endif
diff --git a/third_party/gofrontend/libffi/src/pa/hpux32.S b/third_party/gofrontend/libffi/src/pa/hpux32.S
deleted file mode 100644
index 40528ba..0000000
--- a/third_party/gofrontend/libffi/src/pa/hpux32.S
+++ /dev/null
@@ -1,368 +0,0 @@
-/* -----------------------------------------------------------------------
-   hpux32.S - Copyright (c) 2006 Free Software Foundation, Inc.
-	                (c) 2008 Red Hat, Inc.
-   based on src/pa/linux.S
-
-   HP-UX PA Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-
-	.LEVEL 1.1
-	.SPACE	$PRIVATE$
-	.IMPORT	$global$,DATA
-	.IMPORT	$$dyncall,MILLICODE
-	.SUBSPA	$DATA$
-	.align	4
-
-	/* void ffi_call_pa32(void (*)(char *, extended_cif *),
-			       extended_cif *ecif,
-			       unsigned bytes,
-			       unsigned flags,
-			       unsigned *rvalue,
-			       void (*fn)(void));
-	 */
-
-	.export	ffi_call_pa32,ENTRY,PRIV_LEV=3
-	.import	ffi_prep_args_pa32,CODE
-
-	.SPACE	$TEXT$
-	.SUBSPA $CODE$
-	.align	4
-
-L$FB1
-ffi_call_pa32
-	.proc
-	.callinfo	FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4
-	.entry
-	stw	%rp, -20(%sp)
-	copy	%r3, %r1
-L$CFI11
-	copy	%sp, %r3
-L$CFI12
-
-	/* Setup the stack for calling prep_args...
-	   We want the stack to look like this:
-
-	   [ Previous stack                            ] <- %r3
-
-	   [ 64-bytes register save area               ] <- %r4
-
-	   [ Stack space for actual call, passed as    ] <- %arg0
-	   [     arg0 to ffi_prep_args_pa32           ]
-
-	   [ Stack for calling prep_args               ] <- %sp
-	 */
-
-	stwm	%r1, 64(%sp)
-	stw	%r4, 12(%r3)
-L$CFI13
-	copy	%sp, %r4
-
-	addl	%arg2, %r4, %arg0	; arg stack
-	stw	%arg3, -48(%r3)		; save flags we need it later
-
-	/* Call prep_args:
-	   %arg0(stack) -- set up above
-	   %arg1(ecif)  -- same as incoming param
-	   %arg2(bytes) -- same as incoming param */
-	bl	ffi_prep_args_pa32,%r2
-	ldo	64(%arg0), %sp
-	ldo	-64(%sp), %sp
-
-	/* now %sp should point where %arg0 was pointing.  */
-
-	/* Load the arguments that should be passed in registers
-	   The fp args are loaded by the prep_args function.  */
-	ldw	-36(%sp), %arg0
-	ldw	-40(%sp), %arg1
-	ldw	-44(%sp), %arg2
-	ldw	-48(%sp), %arg3
-
-	/* in case the function is going to return a structure
-	   we need to give it a place to put the result.  */
-	ldw	-52(%r3), %ret0		; %ret0 <- rvalue
-	ldw	-56(%r3), %r22		; %r22 <- function to call
-	bl	$$dyncall, %r31		; Call the user function
-	copy	%r31, %rp
-
-	/* Prepare to store the result; we need to recover flags and rvalue.  */
-	ldw	-48(%r3), %r21		; r21 <- flags
-	ldw	-52(%r3), %r20		; r20 <- rvalue
-
-	/* Store the result according to the return type.  The most
-	   likely types should come first.  */
-
-L$checkint
-	comib,<>,n FFI_TYPE_INT, %r21, L$checkint8
-	b	L$done
-	stw	%ret0, 0(%r20)
-
-L$checkint8
-	comib,<>,n FFI_TYPE_UINT8, %r21, L$checkint16
-	b	L$done
-	stb	%ret0, 0(%r20)
-
-L$checkint16
-	comib,<>,n FFI_TYPE_UINT16, %r21, L$checkdbl
-	b	L$done
-	sth	%ret0, 0(%r20)
-
-L$checkdbl
-	comib,<>,n FFI_TYPE_DOUBLE, %r21, L$checkfloat
-	b	L$done
-	fstd	%fr4,0(%r20)
-
-L$checkfloat
-	comib,<>,n FFI_TYPE_FLOAT, %r21, L$checkll
-	b	L$done
-	fstw	%fr4L,0(%r20)
-
-L$checkll
-	comib,<>,n FFI_TYPE_UINT64, %r21, L$checksmst2
-	stw	%ret0, 0(%r20)
-	b	L$done
-	stw	%ret1, 4(%r20)
-
-L$checksmst2
-	comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, L$checksmst3
-	/* 2-byte structs are returned in ret0 as ????xxyy.  */
-	extru	%ret0, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	b	L$done
-	stb	%ret0, 0(%r20)
-
-L$checksmst3
-	comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, L$checksmst4
-	/* 3-byte structs are returned in ret0 as ??xxyyzz.  */
-	extru	%ret0, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret0, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	b	L$done
-	stb	%ret0, 0(%r20)
-
-L$checksmst4
-	comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, L$checksmst5
-	/* 4-byte structs are returned in ret0 as wwxxyyzz.  */
-	extru	%ret0, 7, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret0, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret0, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	b	L$done
-	stb	%ret0, 0(%r20)
-
-L$checksmst5
-	comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, L$checksmst6
-	/* 5 byte values are returned right justified:
-	      ret0     ret1
-	   5: ??????aa bbccddee */
-	stbs,ma	%ret0, 1(%r20)
-	extru	%ret1, 7, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	b	L$done
-	stb	%ret1, 0(%r20)
-
-L$checksmst6
-	comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, L$checksmst7
-	/* 6 byte values are returned right justified:
-	      ret0     ret1
-	   6: ????aabb ccddeeff */
-	extru	%ret0, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	stbs,ma	%ret0, 1(%r20)
-	extru	%ret1, 7, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	b	L$done
-	stb	%ret1, 0(%r20)
-
-L$checksmst7
-	comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, L$checksmst8
-	/* 7 byte values are returned right justified:
-	      ret0     ret1
-	   7: ??aabbcc ddeeffgg */
-	extru	%ret0, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret0, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	stbs,ma	%ret0, 1(%r20)
-	extru	%ret1, 7, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	b	L$done
-	stb	%ret1, 0(%r20)
-
-L$checksmst8
-	comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, L$done
-	/* 8 byte values are returned right justified:
-	      ret0     ret1
-	   8: aabbccdd eeffgghh */
-	extru	%ret0, 7, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret0, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret0, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	stbs,ma	%ret0, 1(%r20)
-	extru	%ret1, 7, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	stb	%ret1, 0(%r20)
-
-L$done
-	/* all done, return */
-	copy	%r4, %sp	; pop arg stack
-	ldw	12(%r3), %r4
-	ldwm	-64(%sp), %r3	; .. and pop stack
-	ldw	-20(%sp), %rp
-	bv	%r0(%rp)
-	nop
-	.exit
-	.procend
-L$FE1
-
-	/* void ffi_closure_pa32(void);
-	   Called with closure argument in %r21 */
-
-	.SPACE $TEXT$
-	.SUBSPA $CODE$
-	.export ffi_closure_pa32,ENTRY,PRIV_LEV=3,RTNVAL=GR
-	.import ffi_closure_inner_pa32,CODE
-	.align 4
-L$FB2
-ffi_closure_pa32
-	.proc
-	.callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3
-	.entry
-
-	stw	%rp, -20(%sp)
-	copy	%r3, %r1
-L$CFI21
-	copy	%sp, %r3
-L$CFI22
-	stwm	%r1, 64(%sp)
-
-	/* Put arguments onto the stack and call ffi_closure_inner.  */
-	stw	%arg0, -36(%r3)
-	stw	%arg1, -40(%r3)
-	stw	%arg2, -44(%r3)
-	stw	%arg3, -48(%r3)
-
-	copy	%r21, %arg0
-	bl	ffi_closure_inner_pa32, %r2
-	copy    %r3, %arg1
-	ldwm	-64(%sp), %r3
-	ldw	-20(%sp), %rp
-	ldw	-36(%sp), %ret0
-	bv	%r0(%rp)
-	ldw	-40(%sp), %ret1
-	.exit
-	.procend
-L$FE2:
-
-	.SPACE $PRIVATE$
-	.SUBSPA $DATA$
-
-	.align 4
-	.EXPORT _GLOBAL__F_ffi_call_pa32,DATA
-_GLOBAL__F_ffi_call_pa32
-L$frame1:
-	.word   L$ECIE1-L$SCIE1 ;# Length of Common Information Entry
-L$SCIE1:
-	.word   0x0     ;# CIE Identifier Tag
-	.byte   0x1     ;# CIE Version
-	.ascii "\0"     ;# CIE Augmentation
-	.uleb128 0x1    ;# CIE Code Alignment Factor
-	.sleb128 4      ;# CIE Data Alignment Factor
-	.byte   0x2     ;# CIE RA Column
-	.byte   0xc     ;# DW_CFA_def_cfa
-	.uleb128 0x1e
-	.uleb128 0x0
-	.align 4
-L$ECIE1:
-L$SFDE1:
-	.word   L$EFDE1-L$ASFDE1        ;# FDE Length
-L$ASFDE1:
-	.word   L$ASFDE1-L$frame1       ;# FDE CIE offset
-	.word   L$FB1   ;# FDE initial location
-	.word   L$FE1-L$FB1     ;# FDE address range
-
-	.byte   0x4     ;# DW_CFA_advance_loc4
-	.word   L$CFI11-L$FB1
-	.byte	0x83	;# DW_CFA_offset, column 0x3
-	.uleb128 0x0
-	.byte   0x11    ;# DW_CFA_offset_extended_sf; save r2 at [r30-20]
-	.uleb128 0x2
-	.sleb128 -5
-
-	.byte   0x4     ;# DW_CFA_advance_loc4
-	.word   L$CFI12-L$CFI11
-	.byte   0xd     ;# DW_CFA_def_cfa_register = r3
-	.uleb128 0x3
-
-	.byte   0x4     ;# DW_CFA_advance_loc4
-	.word   L$CFI13-L$CFI12
-	.byte	0x84	;# DW_CFA_offset, column 0x4
-	.uleb128 0x3
-
-	.align 4
-L$EFDE1:
-
-L$SFDE2:
-	.word   L$EFDE2-L$ASFDE2        ;# FDE Length
-L$ASFDE2:
-	.word   L$ASFDE2-L$frame1       ;# FDE CIE offset
-	.word   L$FB2   ;# FDE initial location
-	.word   L$FE2-L$FB2     ;# FDE address range
-	.byte   0x4     ;# DW_CFA_advance_loc4
-	.word   L$CFI21-L$FB2
-	.byte   0x83    ;# DW_CFA_offset, column 0x3
-	.uleb128 0x0
-	.byte   0x11    ;# DW_CFA_offset_extended_sf
-	.uleb128 0x2
-	.sleb128 -5
-
-	.byte   0x4     ;# DW_CFA_advance_loc4
-	.word   L$CFI22-L$CFI21
-	.byte   0xd     ;# DW_CFA_def_cfa_register = r3
-	.uleb128 0x3
-
-	.align 4
-L$EFDE2:
diff --git a/third_party/gofrontend/libffi/src/pa/linux.S b/third_party/gofrontend/libffi/src/pa/linux.S
deleted file mode 100644
index f11ae76..0000000
--- a/third_party/gofrontend/libffi/src/pa/linux.S
+++ /dev/null
@@ -1,357 +0,0 @@
-/* -----------------------------------------------------------------------
-   linux.S - (c) 2003-2004 Randolph Chung <tausq@debian.org>
-	     (c) 2008 Red Hat, Inc.
-
-   HPPA Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-
-	.text
-	.level 1.1
-	.align 4
-
-	/* void ffi_call_pa32(void (*)(char *, extended_cif *),
-			       extended_cif *ecif,
-			       unsigned bytes,
-			       unsigned flags,
-			       unsigned *rvalue,
-			       void (*fn)(void));
-	 */
-
-	.export ffi_call_pa32,code
-	.import ffi_prep_args_pa32,code
-
-	.type ffi_call_pa32, @function
-.LFB1:
-ffi_call_pa32:
-	.proc
-	.callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4
-	.entry
-	stw %rp, -20(%sp)
-	copy %r3, %r1
-.LCFI11:
-
-	copy %sp, %r3
-.LCFI12:
-
-	/* Setup the stack for calling prep_args...
-	   We want the stack to look like this:
-
-	   [ Previous stack                            ] <- %r3
-
-	   [ 64-bytes register save area               ] <- %r4
-
-	   [ Stack space for actual call, passed as    ] <- %arg0
-	   [     arg0 to ffi_prep_args_pa32           ]
-
-	   [ Stack for calling prep_args               ] <- %sp
-	 */
-
-	stwm %r1, 64(%sp)
-	stw %r4, 12(%r3)
-.LCFI13:
-	copy %sp, %r4
-
-	addl %arg2, %r4, %arg0      /* arg stack */
-	stw %arg3, -48(%r3)         /* save flags; we need it later */
-
-	/* Call prep_args:
-	   %arg0(stack) -- set up above
-	   %arg1(ecif) -- same as incoming param
-	   %arg2(bytes) -- same as incoming param */
-	bl ffi_prep_args_pa32,%r2
-	ldo 64(%arg0), %sp
-	ldo -64(%sp), %sp
-
-	/* now %sp should point where %arg0 was pointing.  */
-
-	/* Load the arguments that should be passed in registers
-	   The fp args were loaded by the prep_args function.  */
-	ldw -36(%sp), %arg0
-	ldw -40(%sp), %arg1
-	ldw -44(%sp), %arg2
-	ldw -48(%sp), %arg3
-
-	/* in case the function is going to return a structure
-	   we need to give it a place to put the result.  */
-	ldw -52(%r3), %ret0                     /* %ret0 <- rvalue */
-	ldw -56(%r3), %r22                      /* %r22 <- function to call */
-	bl $$dyncall, %r31                      /* Call the user function */
-	copy %r31, %rp
-
-	/* Prepare to store the result; we need to recover flags and rvalue.  */
-	ldw -48(%r3), %r21                      /* r21 <- flags */
-	ldw -52(%r3), %r20                      /* r20 <- rvalue */
-
-	/* Store the result according to the return type.  */
-
-.Lcheckint:
-	comib,<>,n FFI_TYPE_INT, %r21, .Lcheckint8
-	b	.Ldone
-	stw	%ret0, 0(%r20)
-
-.Lcheckint8:
-	comib,<>,n FFI_TYPE_UINT8, %r21, .Lcheckint16
-	b	.Ldone
-	stb	%ret0, 0(%r20)
-
-.Lcheckint16:
-	comib,<>,n FFI_TYPE_UINT16, %r21, .Lcheckdbl
-	b	.Ldone
-	sth	%ret0, 0(%r20)
-
-.Lcheckdbl:
-	comib,<>,n FFI_TYPE_DOUBLE, %r21, .Lcheckfloat
-	b	.Ldone
-	fstd	%fr4,0(%r20)
-
-.Lcheckfloat:
-	comib,<>,n FFI_TYPE_FLOAT, %r21, .Lcheckll
-	b	.Ldone
-	fstw	%fr4L,0(%r20)
-
-.Lcheckll:
-	comib,<>,n FFI_TYPE_UINT64, %r21, .Lchecksmst2
-	stw	%ret0, 0(%r20)
-	b	.Ldone
-	stw	%ret1, 4(%r20)
-
-.Lchecksmst2:
-	comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, .Lchecksmst3
-	/* 2-byte structs are returned in ret0 as ????xxyy.  */
-	extru	%ret0, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	b	.Ldone
-	stb	%ret0, 0(%r20)
-
-.Lchecksmst3:
-	comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, .Lchecksmst4
-	/* 3-byte structs are returned in ret0 as ??xxyyzz.  */
-	extru	%ret0, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret0, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	b	.Ldone
-	stb	%ret0, 0(%r20)
-
-.Lchecksmst4:
-	comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, .Lchecksmst5
-	/* 4-byte structs are returned in ret0 as wwxxyyzz.  */
-	extru	%ret0, 7, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret0, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret0, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	b	.Ldone
-	stb	%ret0, 0(%r20)
-
-.Lchecksmst5:
-	comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, .Lchecksmst6
-	/* 5 byte values are returned right justified:
-	      ret0     ret1
-	   5: ??????aa bbccddee */
-	stbs,ma	%ret0, 1(%r20)
-	extru	%ret1, 7, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	b	.Ldone
-	stb	%ret1, 0(%r20)
-
-.Lchecksmst6:
-	comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, .Lchecksmst7
-	/* 6 byte values are returned right justified:
-	      ret0     ret1
-	   6: ????aabb ccddeeff */
-	extru	%ret0, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	stbs,ma	%ret0, 1(%r20)
-	extru	%ret1, 7, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	b	.Ldone
-	stb	%ret1, 0(%r20)
-
-.Lchecksmst7:
-	comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, .Lchecksmst8
-	/* 7 byte values are returned right justified:
-	      ret0     ret1
-	   7: ??aabbcc ddeeffgg */
-	extru	%ret0, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret0, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	stbs,ma	%ret0, 1(%r20)
-	extru	%ret1, 7, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	b	.Ldone
-	stb	%ret1, 0(%r20)
-
-.Lchecksmst8:
-	comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, .Ldone
-	/* 8 byte values are returned right justified:
-	      ret0     ret1
-	   8: aabbccdd eeffgghh */
-	extru	%ret0, 7, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret0, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret0, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	stbs,ma	%ret0, 1(%r20)
-	extru	%ret1, 7, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 15, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	extru	%ret1, 23, 8, %r22
-	stbs,ma	%r22, 1(%r20)
-	stb	%ret1, 0(%r20)
-
-.Ldone:
-	/* all done, return */
-	copy %r4, %sp                           /* pop arg stack */
-	ldw 12(%r3), %r4
-	ldwm -64(%sp), %r3                      /* .. and pop stack */
-	ldw -20(%sp), %rp
-	bv %r0(%rp)
-	nop
-	.exit
-	.procend
-.LFE1:
-
-	/* void ffi_closure_pa32(void);
-	   Called with closure argument in %r21 */
-	.export ffi_closure_pa32,code
-	.import ffi_closure_inner_pa32,code
-
-	.type ffi_closure_pa32, @function
-.LFB2:
-ffi_closure_pa32:
-	.proc
-	.callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3
-	.entry
-
-	stw %rp, -20(%sp)
-.LCFI20:
-	copy %r3, %r1
-.LCFI21:
-	copy %sp, %r3
-.LCFI22:
-	stwm %r1, 64(%sp)
-
-	/* Put arguments onto the stack and call ffi_closure_inner.  */
-	stw %arg0, -36(%r3)
-	stw %arg1, -40(%r3)
-	stw %arg2, -44(%r3)
-	stw %arg3, -48(%r3)
-
-	copy %r21, %arg0
-	bl ffi_closure_inner_pa32, %r2
-	copy %r3, %arg1
-
-	ldwm -64(%sp), %r3
-	ldw -20(%sp), %rp
-	ldw -36(%sp), %ret0
-	bv %r0(%r2)
-	ldw -40(%sp), %ret1
-
-	.exit
-	.procend
-.LFE2:
-
-	.section        ".eh_frame",EH_FRAME_FLAGS,@progbits
-.Lframe1:
-	.word   .LECIE1-.LSCIE1 ;# Length of Common Information Entry
-.LSCIE1:
-	.word   0x0     ;# CIE Identifier Tag
-	.byte   0x1     ;# CIE Version
-	.ascii "\0"     ;# CIE Augmentation
-	.uleb128 0x1    ;# CIE Code Alignment Factor
-	.sleb128 4      ;# CIE Data Alignment Factor
-	.byte   0x2     ;# CIE RA Column
-	.byte   0xc     ;# DW_CFA_def_cfa
-	.uleb128 0x1e
-	.uleb128 0x0
-	.align 4
-.LECIE1:
-.LSFDE1:
-	.word   .LEFDE1-.LASFDE1        ;# FDE Length
-.LASFDE1:
-	.word   .LASFDE1-.Lframe1       ;# FDE CIE offset
-	.word   .LFB1   ;# FDE initial location
-	.word   .LFE1-.LFB1     ;# FDE address range
-
-	.byte   0x4     ;# DW_CFA_advance_loc4
-	.word   .LCFI11-.LFB1
-	.byte	0x83	;# DW_CFA_offset, column 0x3
-	.uleb128 0x0
-	.byte   0x11    ;# DW_CFA_offset_extended_sf; save r2 at [r30-20]
-	.uleb128 0x2
-	.sleb128 -5
-
-	.byte   0x4     ;# DW_CFA_advance_loc4
-	.word   .LCFI12-.LCFI11
-	.byte   0xd     ;# DW_CFA_def_cfa_register = r3
-	.uleb128 0x3
-
-	.byte   0x4     ;# DW_CFA_advance_loc4
-	.word   .LCFI13-.LCFI12
-	.byte	0x84	;# DW_CFA_offset, column 0x4
-	.uleb128 0x3
-
-	.align 4
-.LEFDE1:
-
-.LSFDE2:
-	.word   .LEFDE2-.LASFDE2        ;# FDE Length
-.LASFDE2:
-	.word   .LASFDE2-.Lframe1       ;# FDE CIE offset
-	.word   .LFB2   ;# FDE initial location
-	.word   .LFE2-.LFB2     ;# FDE address range
-	.byte   0x4     ;# DW_CFA_advance_loc4
-	.word   .LCFI21-.LFB2
-	.byte   0x83    ;# DW_CFA_offset, column 0x3
-	.uleb128 0x0
-	.byte   0x11    ;# DW_CFA_offset_extended_sf
-	.uleb128 0x2
-	.sleb128 -5
-
-	.byte   0x4     ;# DW_CFA_advance_loc4
-	.word   .LCFI22-.LCFI21
-	.byte   0xd     ;# DW_CFA_def_cfa_register = r3
-	.uleb128 0x3
-
-	.align 4
-.LEFDE2:
diff --git a/third_party/gofrontend/libffi/src/powerpc/aix.S b/third_party/gofrontend/libffi/src/powerpc/aix.S
deleted file mode 100644
index 349e78c..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/aix.S
+++ /dev/null
@@ -1,328 +0,0 @@
-/* -----------------------------------------------------------------------
-   aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc.
-   based on darwin.S by John Hornkvist
-
-   PowerPC Assembly glue.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-	.set r0,0
-	.set r1,1
-	.set r2,2
-	.set r3,3
-	.set r4,4
-	.set r5,5
-	.set r6,6
-	.set r7,7
-	.set r8,8
-	.set r9,9
-	.set r10,10
-	.set r11,11
-	.set r12,12
-	.set r13,13
-	.set r14,14
-	.set r15,15
-	.set r16,16
-	.set r17,17
-	.set r18,18
-	.set r19,19
-	.set r20,20
-	.set r21,21
-	.set r22,22
-	.set r23,23
-	.set r24,24
-	.set r25,25
-	.set r26,26
-	.set r27,27
-	.set r28,28
-	.set r29,29
-	.set r30,30
-	.set r31,31
-	.set f0,0
-	.set f1,1
-	.set f2,2
-	.set f3,3
-	.set f4,4
-	.set f5,5
-	.set f6,6
-	.set f7,7
-	.set f8,8
-	.set f9,9
-	.set f10,10
-	.set f11,11
-	.set f12,12
-	.set f13,13
-	.set f14,14
-	.set f15,15
-	.set f16,16
-	.set f17,17
-	.set f18,18
-	.set f19,19
-	.set f20,20
-	.set f21,21
-
-	.extern .ffi_prep_args
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-#define JUMPTARGET(name) name
-#define L(x) x
-	.file "aix.S"
-	.toc
-
-	/* void ffi_call_AIX(extended_cif *ecif, unsigned long bytes,
-	 *		     unsigned int flags, unsigned int *rvalue,
-	 *		     void (*fn)(),
-	 *		     void (*prep_args)(extended_cif*, unsigned *const));
-	 * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args
-	 */
-
-.csect .text[PR]
-	.align 2
-	.globl ffi_call_AIX
-	.globl .ffi_call_AIX
-.csect ffi_call_AIX[DS]
-ffi_call_AIX:
-#ifdef __64BIT__
-	.llong .ffi_call_AIX, TOC[tc0], 0
-	.csect .text[PR]
-.ffi_call_AIX:
-	/* Save registers we use.  */
-	mflr	r0
-
-	std	r28,-32(r1)
-	std	r29,-24(r1)
-	std	r30,-16(r1)
-	std	r31, -8(r1)
-
-	std	r0, 16(r1)
-	mr	r28, r1		/* our AP.  */
-	stdux	r1, r1, r4
-
-	/* Save arguments over call...  */
-	mr	r31, r5	/* flags, */
-	mr	r30, r6	/* rvalue, */
-	mr	r29, r7	/* function address.  */
-	std	r2, 40(r1)
-
-	/* Call ffi_prep_args.  */
-	mr	r4, r1
-	bl	.ffi_prep_args
-	nop
-
-	/* Now do the call.  */
-	ld	r0, 0(r29)
-	ld	r2, 8(r29)
-	ld	r11, 16(r29)
-	/* Set up cr1 with bits 4-7 of the flags.  */
-	mtcrf	0x40, r31
-	mtctr	r0
-	/* Load all those argument registers.  */
-	/* We have set up a nice stack frame, just load it into registers. */
-	ld	r3, 40+(1*8)(r1)
-	ld	r4, 40+(2*8)(r1)
-	ld	r5, 40+(3*8)(r1)
-	ld	r6, 40+(4*8)(r1)
-	nop
-	ld	r7, 40+(5*8)(r1)
-	ld	r8, 40+(6*8)(r1)
-	ld	r9, 40+(7*8)(r1)
-	ld	r10,40+(8*8)(r1)
-
-L1:
-	/* Load all the FP registers.  */
-	bf	6,L2 /* 2f + 0x18 */
-	lfd	f1,-32-(13*8)(r28)
-	lfd	f2,-32-(12*8)(r28)
-	lfd	f3,-32-(11*8)(r28)
-	lfd	f4,-32-(10*8)(r28)
-	nop
-	lfd	f5,-32-(9*8)(r28)
-	lfd	f6,-32-(8*8)(r28)
-	lfd	f7,-32-(7*8)(r28)
-	lfd	f8,-32-(6*8)(r28)
-	nop
-	lfd	f9,-32-(5*8)(r28)
-	lfd	f10,-32-(4*8)(r28)
-	lfd	f11,-32-(3*8)(r28)
-	lfd	f12,-32-(2*8)(r28)
-	nop
-	lfd	f13,-32-(1*8)(r28)
-
-L2:
-	/* Make the call.  */
-	bctrl
-	ld	r2, 40(r1)
-
-	/* Now, deal with the return value.  */
-	mtcrf	0x01, r31
-
-	bt	30, L(done_return_value)
-	bt	29, L(fp_return_value)
-	std	r3, 0(r30)
-
-	/* Fall through...  */
-
-L(done_return_value):
-	/* Restore the registers we used and return.  */
-	mr	r1, r28
-	ld	r0, 16(r28)
-	ld	r28, -32(r1)
-	mtlr	r0
-	ld	r29, -24(r1)
-	ld	r30, -16(r1)
-	ld	r31, -8(r1)
-	blr
-
-L(fp_return_value):
-	bf	28, L(float_return_value)
-	stfd	f1, 0(r30)
-	bf	31, L(done_return_value)
-	stfd	f2, 8(r30)
-	b	L(done_return_value)
-L(float_return_value):
-	stfs	f1, 0(r30)
-	b	L(done_return_value)
-
-#else /* ! __64BIT__ */
-	
-	.long .ffi_call_AIX, TOC[tc0], 0
-	.csect .text[PR]
-.ffi_call_AIX:
-	/* Save registers we use.  */
-	mflr	r0
-
-	stw	r28,-16(r1)
-	stw	r29,-12(r1)
-	stw	r30, -8(r1)
-	stw	r31, -4(r1)
-
-	stw	r0, 8(r1)
-	mr	r28, r1		/* out AP.  */
-	stwux	r1, r1, r4
-
-	/* Save arguments over call...  */
-	mr	r31, r5	/* flags, */
-	mr	r30, r6	/* rvalue, */
-	mr	r29, r7	/* function address, */
-	stw	r2, 20(r1)
-
-	/* Call ffi_prep_args.  */
-	mr	r4, r1
-	bl	.ffi_prep_args
-	nop
-
-	/* Now do the call.  */
-	lwz	r0, 0(r29)
-	lwz	r2, 4(r29)
-	lwz	r11, 8(r29)
-	/* Set up cr1 with bits 4-7 of the flags.  */
-	mtcrf	0x40, r31
-	mtctr	r0
-	/* Load all those argument registers.  */
-	/* We have set up a nice stack frame, just load it into registers. */
-	lwz	r3, 20+(1*4)(r1)
-	lwz	r4, 20+(2*4)(r1)
-	lwz	r5, 20+(3*4)(r1)
-	lwz	r6, 20+(4*4)(r1)
-	nop
-	lwz	r7, 20+(5*4)(r1)
-	lwz	r8, 20+(6*4)(r1)
-	lwz	r9, 20+(7*4)(r1)
-	lwz	r10,20+(8*4)(r1)
-
-L1:
-	/* Load all the FP registers.  */
-	bf	6,L2 /* 2f + 0x18 */
-	lfd	f1,-16-(13*8)(r28)
-	lfd	f2,-16-(12*8)(r28)
-	lfd	f3,-16-(11*8)(r28)
-	lfd	f4,-16-(10*8)(r28)
-	nop
-	lfd	f5,-16-(9*8)(r28)
-	lfd	f6,-16-(8*8)(r28)
-	lfd	f7,-16-(7*8)(r28)
-	lfd	f8,-16-(6*8)(r28)
-	nop
-	lfd	f9,-16-(5*8)(r28)
-	lfd	f10,-16-(4*8)(r28)
-	lfd	f11,-16-(3*8)(r28)
-	lfd	f12,-16-(2*8)(r28)
-	nop
-	lfd	f13,-16-(1*8)(r28)
-
-L2:
-	/* Make the call.  */
-	bctrl
-	lwz	r2, 20(r1)
-
-	/* Now, deal with the return value.  */
-	mtcrf	0x01, r31
-
-	bt	30, L(done_return_value)
-	bt	29, L(fp_return_value)
-	stw	r3, 0(r30)
-	bf	28, L(done_return_value)
-	stw	r4, 4(r30)
-
-	/* Fall through...  */
-
-L(done_return_value):
-	/* Restore the registers we used and return.  */
-	mr	r1, r28
-	lwz	r0, 8(r28)
-	lwz	r28,-16(r1)
-	mtlr	r0
-	lwz	r29,-12(r1)
-	lwz	r30, -8(r1)
-	lwz	r31, -4(r1)
-	blr
-
-L(fp_return_value):
-	bf	28, L(float_return_value)
-	stfd	f1, 0(r30)
-	b	L(done_return_value)
-L(float_return_value):
-	stfs	f1, 0(r30)
-	b	L(done_return_value)
-#endif
-	.long 0
-	.byte 0,0,0,1,128,4,0,0
-/* END(ffi_call_AIX) */
-
-.csect .text[PR]
-	.align 2
-	.globl ffi_call_DARWIN
-	.globl .ffi_call_DARWIN
-.csect ffi_call_DARWIN[DS]
-ffi_call_DARWIN:
-#ifdef __64BIT__
-	.llong .ffi_call_DARWIN, TOC[tc0], 0
-#else
-	.long .ffi_call_DARWIN, TOC[tc0], 0
-#endif
-	.csect .text[PR]
-.ffi_call_DARWIN:
-	blr
-	.long 0
-	.byte 0,0,0,0,0,0,0,0
-/* END(ffi_call_DARWIN) */
diff --git a/third_party/gofrontend/libffi/src/powerpc/aix_closure.S b/third_party/gofrontend/libffi/src/powerpc/aix_closure.S
deleted file mode 100644
index aabd3c3..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/aix_closure.S
+++ /dev/null
@@ -1,447 +0,0 @@
-/* -----------------------------------------------------------------------
-   aix_closure.S - Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc.
-   based on darwin_closure.S
-
-   PowerPC Assembly glue.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-	.set r0,0
-	.set r1,1
-	.set r2,2
-	.set r3,3
-	.set r4,4
-	.set r5,5
-	.set r6,6
-	.set r7,7
-	.set r8,8
-	.set r9,9
-	.set r10,10
-	.set r11,11
-	.set r12,12
-	.set r13,13
-	.set r14,14
-	.set r15,15
-	.set r16,16
-	.set r17,17
-	.set r18,18
-	.set r19,19
-	.set r20,20
-	.set r21,21
-	.set r22,22
-	.set r23,23
-	.set r24,24
-	.set r25,25
-	.set r26,26
-	.set r27,27
-	.set r28,28
-	.set r29,29
-	.set r30,30
-	.set r31,31
-	.set f0,0
-	.set f1,1
-	.set f2,2
-	.set f3,3
-	.set f4,4
-	.set f5,5
-	.set f6,6
-	.set f7,7
-	.set f8,8
-	.set f9,9
-	.set f10,10
-	.set f11,11
-	.set f12,12
-	.set f13,13
-	.set f14,14
-	.set f15,15
-	.set f16,16
-	.set f17,17
-	.set f18,18
-	.set f19,19
-	.set f20,20
-	.set f21,21
-
-	.extern .ffi_closure_helper_DARWIN
-
-#define LIBFFI_ASM
-#define JUMPTARGET(name) name
-#define L(x) x
-	.file "aix_closure.S"
-	.toc
-LC..60:
-	.tc L..60[TC],L..60
-	.csect .text[PR]
-	.align 2
-
-.csect .text[PR]
-	.align 2
-	.globl ffi_closure_ASM
-	.globl .ffi_closure_ASM
-.csect ffi_closure_ASM[DS]
-ffi_closure_ASM:
-#ifdef __64BIT__
-	.llong .ffi_closure_ASM, TOC[tc0], 0
-	.csect .text[PR]
-.ffi_closure_ASM:
-/* we want to build up an area for the parameters passed */
-/* in registers (both floating point and integer) */
-
-	/* we store gpr 3 to gpr 10 (aligned to 4)
-	in the parents outgoing area  */
-	std   r3, 48+(0*8)(r1)
-	std   r4, 48+(1*8)(r1)
-	std   r5, 48+(2*8)(r1)
-	std   r6, 48+(3*8)(r1)
-	mflr  r0
-
-	std   r7, 48+(4*8)(r1)
-	std   r8, 48+(5*8)(r1)
-	std   r9, 48+(6*8)(r1)
-	std   r10, 48+(7*8)(r1)
-	std   r0, 16(r1)	/* save the return address */
-
-
-	/* 48  Bytes (Linkage Area) */
-	/* 64  Bytes (params) */
-	/* 16  Bytes (result) */
-	/* 104 Bytes (13*8 from FPR) */
-	/* 8   Bytes (alignment) */
-	/* 240 Bytes */
-
-	stdu  r1, -240(r1)	/* skip over caller save area
-				   keep stack aligned to 16  */
-
-	/* next save fpr 1 to fpr 13 (aligned to 8) */
-	stfd  f1, 128+(0*8)(r1)
-	stfd  f2, 128+(1*8)(r1)
-	stfd  f3, 128+(2*8)(r1)
-	stfd  f4, 128+(3*8)(r1)
-	stfd  f5, 128+(4*8)(r1)
-	stfd  f6, 128+(5*8)(r1)
-	stfd  f7, 128+(6*8)(r1)
-	stfd  f8, 128+(7*8)(r1)
-	stfd  f9, 128+(8*8)(r1)
-	stfd  f10, 128+(9*8)(r1)
-	stfd  f11, 128+(10*8)(r1)
-	stfd  f12, 128+(11*8)(r1)
-	stfd  f13, 128+(12*8)(r1)
-
-	/* set up registers for the routine that actually does the work */
-	/* get the context pointer from the trampoline */
-	mr r3, r11
-
-	/* now load up the pointer to the result storage */
-	addi r4, r1, 112
-
-	/* now load up the pointer to the saved gpr registers */
-	addi r5, r1, 288
-
-	/* now load up the pointer to the saved fpr registers */
-	addi r6, r1, 128
-
-	/* make the call */
-	bl .ffi_closure_helper_DARWIN
-	nop
-
-	/* now r3 contains the return type */
-	/* so use it to look up in a table */
-	/* so we know how to deal with each type */
-
-	/* look up the proper starting point in table  */
-	/* by using return type as offset */
-	lhz	r3, 10(r3)	/* load type from return type */
-	ld	r4, LC..60(2)	/* get address of jump table */
-	sldi	r3, r3, 4	/* now multiply return type by 16 */
-	ld	r0, 240+16(r1)	/* load return address */
-	add	r3, r3, r4	/* add contents of table to table address */
-	mtctr	r3
-	bctr			/* jump to it */
-
-/* Each fragment must be exactly 16 bytes long (4 instructions).
-   Align to 16 byte boundary for cache and dispatch efficiency.  */
-	.align 4
-
-L..60:
-/* case FFI_TYPE_VOID */
-	mtlr r0
-	addi r1, r1, 240
-	blr
-	nop
-
-/* case FFI_TYPE_INT */
-	lwa r3, 112+4(r1)
-	mtlr r0
-	addi r1, r1, 240
-	blr
-
-/* case FFI_TYPE_FLOAT */
-	lfs f1, 112+0(r1)
-	mtlr r0
-	addi r1, r1, 240
-	blr
-
-/* case FFI_TYPE_DOUBLE */
-	lfd f1, 112+0(r1)
-	mtlr r0
-	addi r1, r1, 240
-	blr
-
-/* case FFI_TYPE_LONGDOUBLE */
-	lfd f1, 112+0(r1)
-	mtlr r0
-	lfd f2, 112+8(r1)
-	b L..finish
-
-/* case FFI_TYPE_UINT8 */
-	lbz r3, 112+7(r1)
-	mtlr r0
-	addi r1, r1, 240
-	blr
-
-/* case FFI_TYPE_SINT8 */
-	lbz r3, 112+7(r1)
-	mtlr r0
-	extsb r3, r3
-	b L..finish
-
-/* case FFI_TYPE_UINT16 */
-	lhz r3, 112+6(r1)
-	mtlr r0
-L..finish:
-	addi r1, r1, 240
-	blr
-
-/* case FFI_TYPE_SINT16 */
-	lha r3, 112+6(r1)
-	mtlr r0
-	addi r1, r1, 240
-	blr
-
-/* case FFI_TYPE_UINT32 */
-	lwz r3, 112+4(r1)
-	mtlr r0
-	addi r1, r1, 240
-	blr
-
-/* case FFI_TYPE_SINT32 */
-	lwa r3, 112+4(r1)
-	mtlr r0
-	addi r1, r1, 240
-	blr
-
-/* case FFI_TYPE_UINT64 */
-	ld r3, 112+0(r1)
-	mtlr r0
-	addi r1, r1, 240
-	blr
-
-/* case FFI_TYPE_SINT64 */
-	ld r3, 112+0(r1)
-	mtlr r0
-	addi r1, r1, 240
-	blr
-
-/* case FFI_TYPE_STRUCT */
-	mtlr r0
-	addi r1, r1, 240
-	blr
-	nop
-
-/* case FFI_TYPE_POINTER */
-	ld r3, 112+0(r1)
-	mtlr r0
-	addi r1, r1, 240
-	blr
-
-#else /* ! __64BIT__ */
-	
-	.long .ffi_closure_ASM, TOC[tc0], 0
-	.csect .text[PR]
-.ffi_closure_ASM:
-/* we want to build up an area for the parameters passed */
-/* in registers (both floating point and integer) */
-
-	/* we store gpr 3 to gpr 10 (aligned to 4)
-	in the parents outgoing area  */
-	stw   r3, 24+(0*4)(r1)
-	stw   r4, 24+(1*4)(r1)
-	stw   r5, 24+(2*4)(r1)
-	stw   r6, 24+(3*4)(r1)
-	mflr  r0
-
-	stw   r7, 24+(4*4)(r1)
-	stw   r8, 24+(5*4)(r1)
-	stw   r9, 24+(6*4)(r1)
-	stw   r10, 24+(7*4)(r1)
-	stw   r0, 8(r1)
-
-	/* 24 Bytes (Linkage Area) */
-	/* 32 Bytes (params) */
-	/* 16  Bytes (result) */
-	/* 104 Bytes (13*8 from FPR) */
-	/* 176 Bytes */
-
-	stwu  r1, -176(r1)	/* skip over caller save area
-				   keep stack aligned to 16  */
-
-	/* next save fpr 1 to fpr 13 (aligned to 8) */
-	stfd  f1, 72+(0*8)(r1)
-	stfd  f2, 72+(1*8)(r1)
-	stfd  f3, 72+(2*8)(r1)
-	stfd  f4, 72+(3*8)(r1)
-	stfd  f5, 72+(4*8)(r1)
-	stfd  f6, 72+(5*8)(r1)
-	stfd  f7, 72+(6*8)(r1)
-	stfd  f8, 72+(7*8)(r1)
-	stfd  f9, 72+(8*8)(r1)
-	stfd  f10, 72+(9*8)(r1)
-	stfd  f11, 72+(10*8)(r1)
-	stfd  f12, 72+(11*8)(r1)
-	stfd  f13, 72+(12*8)(r1)
-
-	/* set up registers for the routine that actually does the work */
-	/* get the context pointer from the trampoline */
-	mr r3, r11
-
-	/* now load up the pointer to the result storage */
-	addi r4, r1, 56
-
-	/* now load up the pointer to the saved gpr registers */
-	addi r5, r1, 200
-
-	/* now load up the pointer to the saved fpr registers */
-	addi r6, r1, 72
-
-	/* make the call */
-	bl .ffi_closure_helper_DARWIN
-	nop
-
-	/* now r3 contains the return type */
-	/* so use it to look up in a table */
-	/* so we know how to deal with each type */
-
-	/* look up the proper starting point in table  */
-	/* by using return type as offset */
-	lhz	r3, 6(r3)	/* load type from return type */
-	lwz	r4, LC..60(2)	/* get address of jump table */
-	slwi	r3, r3, 4	/* now multiply return type by 16 */
-	lwz	r0, 176+8(r1)	/* load return address */
-	add	r3, r3, r4	/* add contents of table to table address */
-	mtctr	r3
-	bctr			/* jump to it */
-
-/* Each fragment must be exactly 16 bytes long (4 instructions).
-   Align to 16 byte boundary for cache and dispatch efficiency.  */
-	.align 4
-
-L..60:
-/* case FFI_TYPE_VOID */
-	mtlr r0
-	addi r1, r1, 176
-	blr
-	nop
-
-/* case FFI_TYPE_INT */
-	lwz r3, 56+0(r1)
-	mtlr r0
-	addi r1, r1, 176
-	blr
-
-/* case FFI_TYPE_FLOAT */
-	lfs f1, 56+0(r1)
-	mtlr r0
-	addi r1, r1, 176
-	blr
-
-/* case FFI_TYPE_DOUBLE */
-	lfd f1, 56+0(r1)
-	mtlr r0
-	addi r1, r1, 176
-	blr
-
-/* case FFI_TYPE_LONGDOUBLE */
-	lfd f1, 56+0(r1)
-	mtlr r0
-	lfd f2, 56+8(r1)
-	b L..finish
-
-/* case FFI_TYPE_UINT8 */
-	lbz r3, 56+3(r1)
-	mtlr r0
-	addi r1, r1, 176
-	blr
-
-/* case FFI_TYPE_SINT8 */
-	lbz r3, 56+3(r1)
-	mtlr r0
-	extsb r3, r3
-	b L..finish
-
-/* case FFI_TYPE_UINT16 */
-	lhz r3, 56+2(r1)
-	mtlr r0
-	addi r1, r1, 176
-	blr
-
-/* case FFI_TYPE_SINT16 */
-	lha r3, 56+2(r1)
-	mtlr r0
-	addi r1, r1, 176
-	blr
-
-/* case FFI_TYPE_UINT32 */
-	lwz r3, 56+0(r1)
-	mtlr r0
-	addi r1, r1, 176
-	blr
-
-/* case FFI_TYPE_SINT32 */
-	lwz r3, 56+0(r1)
-	mtlr r0
-	addi r1, r1, 176
-	blr
-
-/* case FFI_TYPE_UINT64 */
-	lwz r3, 56+0(r1)
-	mtlr r0
-	lwz r4, 56+4(r1)
-	b L..finish
-
-/* case FFI_TYPE_SINT64 */
-	lwz r3, 56+0(r1)
-	mtlr r0
-	lwz r4, 56+4(r1)
-	b L..finish
-
-/* case FFI_TYPE_STRUCT */
-	mtlr r0
-	addi r1, r1, 176
-	blr
-	nop
-
-/* case FFI_TYPE_POINTER */
-	lwz r3, 56+0(r1)
-	mtlr r0
-L..finish:
-	addi r1, r1, 176
-	blr
-#endif
-/* END(ffi_closure_ASM) */
diff --git a/third_party/gofrontend/libffi/src/powerpc/asm.h b/third_party/gofrontend/libffi/src/powerpc/asm.h
deleted file mode 100644
index 994f62d..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/asm.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/* -----------------------------------------------------------------------
-   asm.h - Copyright (c) 1998 Geoffrey Keating
-
-   PowerPC Assembly glue.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define ASM_GLOBAL_DIRECTIVE .globl
-
-
-#define C_SYMBOL_NAME(name) name
-/* Macro for a label.  */
-#ifdef	__STDC__
-#define C_LABEL(name)		name##:
-#else
-#define C_LABEL(name)		name/**/:
-#endif
-
-/* This seems to always be the case on PPC.  */
-#define ALIGNARG(log2) log2
-/* For ELF we need the `.type' directive to make shared libs work right.  */
-#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg;
-#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
-
-/* If compiled for profiling, call `_mcount' at the start of each function.  */
-#ifdef	PROF
-/* The mcount code relies on the return address being on the stack
-   to locate our caller and so it can restore it; so store one just
-   for its benefit.  */
-#ifdef PIC
-#define CALL_MCOUNT							      \
-  .pushsection;								      \
-  .section ".data";							      \
-  .align ALIGNARG(2);							      \
-0:.long 0;								      \
-  .previous;								      \
-  mflr  %r0;								      \
-  stw   %r0,4(%r1);							      \
-  bl    _GLOBAL_OFFSET_TABLE_@local-4;					      \
-  mflr  %r11;								      \
-  lwz   %r0,0b@got(%r11);						      \
-  bl    JUMPTARGET(_mcount);
-#else  /* PIC */
-#define CALL_MCOUNT							      \
-  .section ".data";							      \
-  .align ALIGNARG(2);							      \
-0:.long 0;								      \
-  .previous;								      \
-  mflr  %r0;								      \
-  lis   %r11,0b@ha;							      \
-  stw   %r0,4(%r1);							      \
-  addi  %r0,%r11,0b@l;							      \
-  bl    JUMPTARGET(_mcount);
-#endif /* PIC */
-#else  /* PROF */
-#define CALL_MCOUNT		/* Do nothing.  */
-#endif /* PROF */
-
-#define	ENTRY(name)							      \
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
-  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
-  .align ALIGNARG(2);							      \
-  C_LABEL(name)								      \
-  CALL_MCOUNT
-
-#define EALIGN_W_0  /* No words to insert.  */
-#define EALIGN_W_1  nop
-#define EALIGN_W_2  nop;nop
-#define EALIGN_W_3  nop;nop;nop
-#define EALIGN_W_4  EALIGN_W_3;nop
-#define EALIGN_W_5  EALIGN_W_4;nop
-#define EALIGN_W_6  EALIGN_W_5;nop
-#define EALIGN_W_7  EALIGN_W_6;nop
-
-/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes
-   past a 2^align boundary.  */
-#ifdef PROF
-#define EALIGN(name, alignt, words)					      \
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
-  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
-  .align ALIGNARG(2);							      \
-  C_LABEL(name)								      \
-  CALL_MCOUNT								      \
-  b 0f;									      \
-  .align ALIGNARG(alignt);						      \
-  EALIGN_W_##words;							      \
-  0:
-#else /* PROF */
-#define EALIGN(name, alignt, words)					      \
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
-  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
-  .align ALIGNARG(alignt);						      \
-  EALIGN_W_##words;							      \
-  C_LABEL(name)
-#endif
-
-#define END(name)							      \
-  ASM_SIZE_DIRECTIVE(name)
-
-#ifdef PIC
-#define JUMPTARGET(name) name##@plt
-#else
-#define JUMPTARGET(name) name
-#endif
-
-/* Local labels stripped out by the linker.  */
-#define L(x) .L##x
diff --git a/third_party/gofrontend/libffi/src/powerpc/darwin.S b/third_party/gofrontend/libffi/src/powerpc/darwin.S
deleted file mode 100644
index 066eb82..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/darwin.S
+++ /dev/null
@@ -1,378 +0,0 @@
-/* -----------------------------------------------------------------------
-   darwin.S - Copyright (c) 2000 John Hornkvist
-	      Copyright (c) 2004, 2010 Free Software Foundation, Inc.
-
-   PowerPC Assembly glue.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#if defined(__ppc64__)
-#define MODE_CHOICE(x, y) y
-#else
-#define MODE_CHOICE(x, y) x
-#endif
-
-#define machine_choice	MODE_CHOICE(ppc7400,ppc64)
-
-; Define some pseudo-opcodes for size-independent load & store of GPRs ...
-#define lgu		MODE_CHOICE(lwzu, ldu)
-#define lg		MODE_CHOICE(lwz,ld)
-#define sg		MODE_CHOICE(stw,std)
-#define sgu		MODE_CHOICE(stwu,stdu)
-#define sgux		MODE_CHOICE(stwux,stdux)
-
-; ... and the size of GPRs and their storage indicator.
-#define GPR_BYTES	MODE_CHOICE(4,8)
-#define LOG2_GPR_BYTES	MODE_CHOICE(2,3)	/* log2(GPR_BYTES) */
-#define g_long		MODE_CHOICE(long, quad)	/* usage is ".g_long" */
-
-; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04.
-#define LINKAGE_SIZE	MODE_CHOICE(24,48)
-#define PARAM_AREA	MODE_CHOICE(32,64)
-#define SAVED_LR_OFFSET	MODE_CHOICE(8,16)	/* save position for lr */
-
-/* If there is any FP stuff we make space for all of the regs.  */
-#define SAVED_FPR_COUNT 13
-#define FPR_SIZE	8
-#define RESULT_BYTES	16
-
-/* This should be kept in step with the same value in ffi_darwin.c.  */
-#define ASM_NEEDS_REGISTERS 4
-#define SAVE_REGS_SIZE (ASM_NEEDS_REGISTERS * GPR_BYTES)
-
-#include <fficonfig.h>
-#include <ffi.h>
-
-#define JUMPTARGET(name) name
-#define L(x) x
-
-	.text
-	.align 2
-	.globl _ffi_prep_args
-
-	.align 2
-	.globl _ffi_call_DARWIN
-
-	/* We arrive here with:
-	   r3 = ptr to extended cif.
-	   r4 = -bytes.
-	   r5 = cif flags.
-	   r6 = ptr to return value.
-	   r7 = fn pointer (user func).
-	   r8 = fn pointer (ffi_prep_args).
-	   r9 = ffi_type* for the ret val.  */
-
-_ffi_call_DARWIN:
-Lstartcode:
-	mr   	r12,r8	/* We only need r12 until the call,
-			   so it does not have to be saved.  */
-LFB1:
-	/* Save the old stack pointer as AP.  */
-	mr	r8,r1
-LCFI0:
-	
-	/* Save the retval type in parents frame.  */
-	sg	r9,(LINKAGE_SIZE+6*GPR_BYTES)(r8)
-
-	/* Allocate the stack space we need.  */
-	sgux	r1,r1,r4
-
-	/* Save registers we use.  */
-	mflr	r9
-	sg	r9,SAVED_LR_OFFSET(r8)
-
-	sg	r28,-(4 * GPR_BYTES)(r8)	
-	sg	r29,-(3 * GPR_BYTES)(r8)
-	sg	r30,-(2 * GPR_BYTES)(r8)
-	sg	r31,-(    GPR_BYTES)(r8)
-
-#if !defined(POWERPC_DARWIN)
-	/* The TOC slot is reserved in the Darwin ABI and r2 is volatile.  */
-	sg	r2,(5 * GPR_BYTES)(r1)
-#endif
-
-LCFI1:
-
-	/* Save arguments over call.  */
-	mr	r31,r5	/* flags,  */
-	mr	r30,r6	/* rvalue,  */
-	mr	r29,r7	/* function address,  */
-	mr	r28,r8	/* our AP.  */
-LCFI2:
-	/* Call ffi_prep_args. r3 = extended cif, r4 = stack ptr copy.  */
-	mr	r4,r1
-	li	r9,0
-
-	mtctr	r12 /* r12 holds address of _ffi_prep_args.  */
-	bctrl
-
-#if !defined(POWERPC_DARWIN)
-	/* The TOC slot is reserved in the Darwin ABI and r2 is volatile.  */
-	lg     r2,(5 * GPR_BYTES)(r1)
-#endif
-	/* Now do the call.
-	   Set up cr1 with bits 4-7 of the flags.  */
-	mtcrf	0x40,r31
-	/* Get the address to call into CTR.  */
-	mtctr	r29
-	/* Load all those argument registers.
-	   We have set up a nice stack frame, just load it into registers.  */
-	lg     r3, (LINKAGE_SIZE                )(r1)
-	lg     r4, (LINKAGE_SIZE +     GPR_BYTES)(r1)
-	lg     r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r1)
-	lg     r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r1)
-	nop
-	lg     r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r1)
-	lg     r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r1)
-	lg     r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r1)
-	lg     r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r1)
-
-L1:
-	/* ... Load all the FP registers.  */
-	bf	6,L2	/* No floats to load.  */
-	lfd	f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28)
-	lfd	f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28)
-	lfd	f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28)
-	lfd	f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28)
-	nop
-	lfd	f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28)
-	lfd	f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28)
-	lfd	f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28)
-	lfd	f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28)
-	nop
-	lfd     f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28)
-	lfd     f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28)
-	lfd     f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28)
-	lfd     f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28)
-	nop
-	lfd     f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28)
-
-L2:
-	mr	r12,r29	/* Put the target address in r12 as specified.  */
-	mtctr  	r12
-	nop
-	nop
-
-	/* Make the call.  */
-	bctrl
-
-	/* Now, deal with the return value.  */
-
-	/* m64 structure returns can occupy the same set of registers as
-	   would be used to pass such a structure as arg0 - so take care 
-	   not to step on any possibly hot regs.  */
-
-	/* Get the flags.. */
-	mtcrf	0x03,r31 ; we need c6 & cr7 now.
-	; FLAG_RETURNS_NOTHING also covers struct ret-by-ref.
-	bt	30,L(done_return_value)	  ; FLAG_RETURNS_NOTHING
-	bf	27,L(scalar_return_value) ; not FLAG_RETURNS_STRUCT
-	
-	/* OK, so we have a struct.  */
-#if defined(__ppc64__)
-	bt	31,L(maybe_return_128) ; FLAG_RETURNS_128BITS, special case 
-
-	/* OK, we have to map the return back to a mem struct.
-	   We are about to trample the parents param area, so recover the
-	   return type.  r29 is free, since the call is done.  */
-	lg	r29,(LINKAGE_SIZE + 6 * GPR_BYTES)(r28)
-
-	sg	r3, (LINKAGE_SIZE                )(r28)
-	sg	r4, (LINKAGE_SIZE +     GPR_BYTES)(r28)
-	sg	r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r28)
-	sg	r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r28)
-	nop
-	sg	r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r28)
-	sg	r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r28)
-	sg	r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r28)
-	sg	r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28)
-	/* OK, so do the block move - we trust that memcpy will not trample
-	   the fprs...  */
-	mr 	r3,r30 ; dest
-	addi	r4,r28,LINKAGE_SIZE ; source
-	/* The size is a size_t, should be long.  */
-	lg	r5,0(r29)
-	/* Figure out small structs */
-	cmpi	0,r5,4
-	bgt	L3	; 1, 2 and 4 bytes have special rules.
-	cmpi	0,r5,3
-	beq	L3	; not 3
-	addi	r4,r4,8
-	subf	r4,r5,r4
-L3:
-	bl	_memcpy
-	
-	/* ... do we need the FP registers? - recover the flags.. */
-	mtcrf	0x03,r31 ; we need c6 & cr7 now.
-	bf	29,L(done_return_value)	/* No floats in the struct.  */
-	stfd	f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28)
-	stfd	f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28)
-	stfd	f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28)
-	stfd	f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28)
-	nop
-	stfd	f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28)
-	stfd	f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28)
-	stfd	f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28)
-	stfd	f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28)
-	nop
-	stfd	f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28)
-	stfd	f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28)
-	stfd	f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28)
-	stfd	f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28)
-	nop
-	stfd	f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28)
-
-	mr	r3,r29	; ffi_type *
-	mr	r4,r30	; dest
-	addi	r5,r28,-SAVE_REGS_SIZE-(13*FPR_SIZE) ; fprs
-	xor	r6,r6,r6
-	sg	r6,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28)
-	addi	r6,r28,(LINKAGE_SIZE + 7 * GPR_BYTES) ; point to a zeroed counter.
-	bl 	_darwin64_struct_floats_to_mem
-
-	b L(done_return_value)
-#else
-	stw	r3,0(r30) ; m32 the only struct return in reg is 4 bytes.
-#endif
-	b L(done_return_value)
-
-L(fp_return_value):
-	/* Do we have long double to store?  */
-	bf	31,L(fd_return_value) ; FLAG_RETURNS_128BITS
-	stfd	f1,0(r30)
-	stfd	f2,FPR_SIZE(r30)
-	b	L(done_return_value)
-
-L(fd_return_value):
-	/* Do we have double to store?  */
-	bf	28,L(float_return_value)
-	stfd	f1,0(r30)
-	b	L(done_return_value)
-
-L(float_return_value):
-	/* We only have a float to store.  */
-	stfs	f1,0(r30)
-	b	L(done_return_value)
-
-L(scalar_return_value):
-	bt	29,L(fp_return_value)	; FLAG_RETURNS_FP
-	; ffi_arg is defined as unsigned long. 
-	sg	r3,0(r30)		; Save the reg.
-	bf	28,L(done_return_value) ; not FLAG_RETURNS_64BITS 
-
-#if defined(__ppc64__)
-L(maybe_return_128):
-	std	r3,0(r30)
-	bf	31,L(done_return_value) ; not FLAG_RETURNS_128BITS 
-	std	r4,8(r30)
-#else
-	stw	r4,4(r30)
-#endif
-
-	/* Fall through.  */
-	/* We want this at the end to simplify eh epilog computation.  */
-
-L(done_return_value):
-	/* Restore the registers we used and return.  */
-	lg	r29,SAVED_LR_OFFSET(r28)
-	; epilog
-	lg	r31,-(1 * GPR_BYTES)(r28)
-	mtlr	r29
-	lg	r30,-(2 * GPR_BYTES)(r28)
-	lg	r29,-(3 * GPR_BYTES)(r28)
-	lg	r28,-(4 * GPR_BYTES)(r28)
-	lg	r1,0(r1)
-	blr
-LFE1:
-	.align	1
-/* END(_ffi_call_DARWIN)  */
-
-/* Provide a null definition of _ffi_call_AIX.  */
-	.text
-	.globl _ffi_call_AIX
-	.align 2
-_ffi_call_AIX:
-	blr
-/* END(_ffi_call_AIX)  */
-
-/* EH stuff.  */
-
-#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78)
-
-	.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
-EH_frame1:
-	.set	L$set$0,LECIE1-LSCIE1
-	.long	L$set$0	; Length of Common Information Entry
-LSCIE1:
-	.long	0x0	; CIE Identifier Tag
-	.byte	0x1	; CIE Version
-	.ascii	"zR\0"	; CIE Augmentation
-	.byte	0x1	; uleb128 0x1; CIE Code Alignment Factor
-	.byte	EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor
-	.byte	0x41	; CIE RA Column
-	.byte	0x1	; uleb128 0x1; Augmentation size
-	.byte	0x10	; FDE Encoding (pcrel)
-	.byte	0xc	; DW_CFA_def_cfa
-	.byte	0x1	; uleb128 0x1
-	.byte	0x0	; uleb128 0x0
-	.align	LOG2_GPR_BYTES
-LECIE1:
-
-	.globl _ffi_call_DARWIN.eh
-_ffi_call_DARWIN.eh:
-LSFDE1:
-	.set	L$set$1,LEFDE1-LASFDE1
-	.long	L$set$1	; FDE Length
-LASFDE1:
-	.long	LASFDE1-EH_frame1 ; FDE CIE offset
-	.g_long	Lstartcode-.	; FDE initial location
-	.set	L$set$3,LFE1-Lstartcode
-	.g_long	L$set$3	; FDE address range
-	.byte   0x0     ; uleb128 0x0; Augmentation size
-	.byte	0x4	; DW_CFA_advance_loc4
-	.set	L$set$4,LCFI0-Lstartcode
-	.long	L$set$4
-	.byte	0xd	; DW_CFA_def_cfa_register
-	.byte	0x08	; uleb128 0x08
-	.byte	0x4	; DW_CFA_advance_loc4
-	.set	L$set$5,LCFI1-LCFI0
-	.long	L$set$5
-	.byte   0x11    ; DW_CFA_offset_extended_sf
-	.byte	0x41	; uleb128 0x41
-	.byte   0x7e    ; sleb128 -2
-	.byte	0x9f	; DW_CFA_offset, column 0x1f
-	.byte	0x1	; uleb128 0x1
-	.byte	0x9e	; DW_CFA_offset, column 0x1e
-	.byte	0x2	; uleb128 0x2
-	.byte	0x9d	; DW_CFA_offset, column 0x1d
-	.byte	0x3	; uleb128 0x3
-	.byte	0x9c	; DW_CFA_offset, column 0x1c
-	.byte	0x4	; uleb128 0x4
-	.byte	0x4	; DW_CFA_advance_loc4
-	.set	L$set$6,LCFI2-LCFI1
-	.long	L$set$6
-	.byte	0xd	; DW_CFA_def_cfa_register
-	.byte	0x1c	; uleb128 0x1c
-	.align LOG2_GPR_BYTES
-LEFDE1:
-	.align 1
-
diff --git a/third_party/gofrontend/libffi/src/powerpc/darwin_closure.S b/third_party/gofrontend/libffi/src/powerpc/darwin_closure.S
deleted file mode 100644
index c7734d4..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/darwin_closure.S
+++ /dev/null
@@ -1,571 +0,0 @@
-/* -----------------------------------------------------------------------
-   darwin_closure.S - Copyright (c) 2002, 2003, 2004, 2010, 
-   Free Software Foundation, Inc. 
-   based on ppc_closure.S
-
-   PowerPC Assembly glue.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#define L(x) x
-
-#if defined(__ppc64__)
-#define MODE_CHOICE(x, y) y
-#else
-#define MODE_CHOICE(x, y) x
-#endif
-
-#define machine_choice	MODE_CHOICE(ppc7400,ppc64)
-
-; Define some pseudo-opcodes for size-independent load & store of GPRs ...
-#define lgu		MODE_CHOICE(lwzu, ldu)
-#define lg		MODE_CHOICE(lwz,ld)
-#define sg		MODE_CHOICE(stw,std)
-#define sgu		MODE_CHOICE(stwu,stdu)
-
-; ... and the size of GPRs and their storage indicator.
-#define GPR_BYTES	MODE_CHOICE(4,8)
-#define LOG2_GPR_BYTES	MODE_CHOICE(2,3)	/* log2(GPR_BYTES) */
-#define g_long		MODE_CHOICE(long, quad)	/* usage is ".g_long" */
-
-; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04.
-#define LINKAGE_SIZE	MODE_CHOICE(24,48)
-#define PARAM_AREA	MODE_CHOICE(32,64)
-
-#define SAVED_CR_OFFSET	MODE_CHOICE(4,8)	/* save position for CR */
-#define SAVED_LR_OFFSET	MODE_CHOICE(8,16)	/* save position for lr */
-
-/* WARNING: if ffi_type is changed... here be monsters.  
-   Offsets of items within the result type.  */
-#define FFI_TYPE_TYPE	MODE_CHOICE(6,10)
-#define FFI_TYPE_ELEM	MODE_CHOICE(8,16)
-
-#define SAVED_FPR_COUNT 13
-#define FPR_SIZE	8
-/* biggest m64 struct ret is 8GPRS + 13FPRS = 168 bytes - rounded to 16bytes = 176. */
-#define RESULT_BYTES	MODE_CHOICE(16,176)
-
-; The whole stack frame **MUST** be 16byte-aligned.
-#define SAVE_SIZE (((LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)+15) & -16LL)
-#define PAD_SIZE (SAVE_SIZE-(LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES))
-
-#define PARENT_PARM_BASE (SAVE_SIZE+LINKAGE_SIZE)
-#define FP_SAVE_BASE (LINKAGE_SIZE+PARAM_AREA)
-
-#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050
-; We no longer need the pic symbol stub for Darwin >= 9.
-#define BLCLS_HELP _ffi_closure_helper_DARWIN
-#define STRUCT_RETVALUE_P _darwin64_struct_ret_by_value_p
-#define PASS_STR_FLOATS _darwin64_pass_struct_floats
-#undef WANT_STUB
-#else
-#define BLCLS_HELP L_ffi_closure_helper_DARWIN$stub
-#define STRUCT_RETVALUE_P L_darwin64_struct_ret_by_value_p$stub
-#define PASS_STR_FLOATS L_darwin64_pass_struct_floats$stub
-#define WANT_STUB
-#endif
-
-/* m32/m64
-
-   The stack layout looks like this:
-
-   |   Additional params...			| |     Higher address
-   ~						~ ~
-   |   Parameters      (at least 8*4/8=32/64)	| | NUM_GPR_ARG_REGISTERS
-   |--------------------------------------------| |
-   |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
-   |--------------------------------------------| |
-   |   Reserved                       2*4/8	| |
-   |--------------------------------------------| |
-   |   Space for callee`s LR		4/8	| |
-   |--------------------------------------------| |
-   |   Saved CR [low word for m64]      4/8	| |
-   |--------------------------------------------| |
-   |   Current backchain pointer	4/8	|-/ Parent`s frame.
-   |--------------------------------------------| <+ <<< on entry to
-   |   Result Bytes		       16/176	| |
-   |--------------------------------------------| |
-   ~   padding to 16-byte alignment		~ ~
-   |--------------------------------------------| |
-   |   NUM_FPR_ARG_REGISTERS slots		| |
-   |   here fp13 .. fp1		       13*8	| |
-   |--------------------------------------------| |
-   |   R3..R10			  8*4/8=32/64	| | NUM_GPR_ARG_REGISTERS
-   |--------------------------------------------| |
-   |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
-   |--------------------------------------------| |	stack	|
-   |   Reserved [compiler,binder]     2*4/8	| |	grows	|
-   |--------------------------------------------| |	down	V
-   |   Space for callees LR		4/8	| |
-   |--------------------------------------------| |	lower addresses
-   |   Saved CR [low word for m64]      4/8	| |
-   |--------------------------------------------| |     stack pointer here
-   |   Current backchain pointer	4/8	|-/	during
-   |--------------------------------------------|   <<<	call.
-
-*/
-
-	.file	"darwin_closure.S"
-
-	.machine machine_choice
-
-	.text
-	.globl _ffi_closure_ASM
-	.align LOG2_GPR_BYTES
-_ffi_closure_ASM:
-LFB1:
-Lstartcode:
-	mflr	r0			/* extract return address  */
-	sg	r0,SAVED_LR_OFFSET(r1)	/* save the return address  */
-LCFI0:
-	sgu	r1,-SAVE_SIZE(r1)	/* skip over caller save area
-					keep stack aligned to 16.  */
-LCFI1:
-	/* We want to build up an area for the parameters passed
-	   in registers. (both floating point and integer)  */
-
-	/* Put gpr 3 to gpr 10 in the parents outgoing area...
-	   ... the remainder of any params that overflowed the regs will
-	   follow here.  */
-	sg	r3, (PARENT_PARM_BASE                )(r1)
-	sg	r4, (PARENT_PARM_BASE + GPR_BYTES    )(r1)
-	sg	r5, (PARENT_PARM_BASE + GPR_BYTES * 2)(r1)
-	sg	r6, (PARENT_PARM_BASE + GPR_BYTES * 3)(r1)
-	sg	r7, (PARENT_PARM_BASE + GPR_BYTES * 4)(r1)
-	sg	r8, (PARENT_PARM_BASE + GPR_BYTES * 5)(r1)
-	sg	r9, (PARENT_PARM_BASE + GPR_BYTES * 6)(r1)
-	sg	r10,(PARENT_PARM_BASE + GPR_BYTES * 7)(r1)
-
-	/* We save fpr 1 to fpr 14 in our own save frame.  */
-	stfd	f1, (FP_SAVE_BASE                 )(r1)
-	stfd	f2, (FP_SAVE_BASE +  FPR_SIZE     )(r1)
-	stfd	f3, (FP_SAVE_BASE +  FPR_SIZE * 2 )(r1)
-	stfd	f4, (FP_SAVE_BASE +  FPR_SIZE * 3 )(r1)
-	stfd	f5, (FP_SAVE_BASE +  FPR_SIZE * 4 )(r1)
-	stfd	f6, (FP_SAVE_BASE +  FPR_SIZE * 5 )(r1)
-	stfd	f7, (FP_SAVE_BASE +  FPR_SIZE * 6 )(r1)
-	stfd	f8, (FP_SAVE_BASE +  FPR_SIZE * 7 )(r1)
-	stfd	f9, (FP_SAVE_BASE +  FPR_SIZE * 8 )(r1)
-	stfd	f10,(FP_SAVE_BASE +  FPR_SIZE * 9 )(r1)
-	stfd	f11,(FP_SAVE_BASE +  FPR_SIZE * 10)(r1)
-	stfd	f12,(FP_SAVE_BASE +  FPR_SIZE * 11)(r1)
-	stfd	f13,(FP_SAVE_BASE +  FPR_SIZE * 12)(r1)
-
-	/* Set up registers for the routine that actually does the work
-	   get the context pointer from the trampoline.  */
-	mr	r3,r11
-
-	/* Now load up the pointer to the result storage.  */
-	addi	r4,r1,(SAVE_SIZE-RESULT_BYTES)
-
-	/* Now load up the pointer to the saved gpr registers.  */
-	addi	r5,r1,PARENT_PARM_BASE
-
-	/* Now load up the pointer to the saved fpr registers.  */
-	addi	r6,r1,FP_SAVE_BASE
-
-	/* Make the call.  */
-	bl	BLCLS_HELP
-
-	/* r3 contains the rtype pointer... save it since we will need
-	   it later.  */
-	sg	r3,LINKAGE_SIZE(r1)	; ffi_type * result_type
-	lg	r0,0(r3)		; size => r0
-	lhz	r3,FFI_TYPE_TYPE(r3)	; type => r3
-
-	/* The helper will have intercepted structure returns and inserted
-	   the caller`s destination address for structs returned by ref.  */
-
-	/* r3 contains the return type  so use it to look up in a table
-	   so we know how to deal with each type.  */
-
-	addi	r5,r1,(SAVE_SIZE-RESULT_BYTES) /* Otherwise, our return is here.  */
-	bl	Lget_ret_type0_addr	/* Get pointer to Lret_type0 into LR.  */
-	mflr	r4			/* Move to r4.  */
-	slwi	r3,r3,4			/* Now multiply return type by 16.  */
-	add	r3,r3,r4		/* Add contents of table to table address.  */
-	mtctr	r3
-	bctr			 	 /* Jump to it.  */
-LFE1:
-/* Each of the ret_typeX code fragments has to be exactly 16 bytes long
-   (4 instructions). For cache effectiveness we align to a 16 byte boundary
-   first.  */
-
-	.align 4
-
-	nop
-	nop
-	nop
-Lget_ret_type0_addr:
-	blrl
-
-/* case FFI_TYPE_VOID  */
-Lret_type0:
-	b	Lfinish
-	nop
-	nop
-	nop
-
-/* case FFI_TYPE_INT  */
-Lret_type1:
-	lg	r3,0(r5)
-	b	Lfinish
-	nop
-	nop
-
-/* case FFI_TYPE_FLOAT  */
-Lret_type2:
-	lfs	f1,0(r5)
-	b	Lfinish
-	nop
-	nop
-
-/* case FFI_TYPE_DOUBLE  */
-Lret_type3:
-	lfd	f1,0(r5)
-	b	Lfinish
-	nop
-	nop
-
-/* case FFI_TYPE_LONGDOUBLE  */
-Lret_type4:
-	lfd	f1,0(r5)
-	lfd	f2,8(r5)
-	b	Lfinish
-	nop
-
-/* case FFI_TYPE_UINT8  */
-Lret_type5:
-#if defined(__ppc64__)
-	lbz	r3,7(r5)
-#else
-	lbz	r3,3(r5)
-#endif
-	b	Lfinish
-	nop
-	nop
-
-/* case FFI_TYPE_SINT8  */
-Lret_type6:
-#if defined(__ppc64__)
-	lbz	r3,7(r5)
-#else
-	lbz	r3,3(r5)
-#endif
-	extsb	r3,r3
-	b	Lfinish
-	nop
-
-/* case FFI_TYPE_UINT16  */
-Lret_type7:
-#if defined(__ppc64__)
-	lhz	r3,6(r5)
-#else
-	lhz	r3,2(r5)
-#endif
-	b	Lfinish
-	nop
-	nop
-
-/* case FFI_TYPE_SINT16  */
-Lret_type8:
-#if defined(__ppc64__)
-	lha	r3,6(r5)
-#else
-	lha	r3,2(r5)
-#endif
-	b	Lfinish
-	nop
-	nop
-
-/* case FFI_TYPE_UINT32  */
-Lret_type9:
-#if defined(__ppc64__)
-	lwz	r3,4(r5)
-#else
-	lwz	r3,0(r5)
-#endif
-	b	Lfinish
-	nop
-	nop
-
-/* case FFI_TYPE_SINT32  */
-Lret_type10:
-#if defined(__ppc64__)
-	lwz	r3,4(r5)
-#else
-	lwz	r3,0(r5)
-#endif
-	b	Lfinish
-	nop
-	nop
-
-/* case FFI_TYPE_UINT64  */
-Lret_type11:
-#if defined(__ppc64__)
-	lg	r3,0(r5)
-	b	Lfinish
-	nop
-#else
-	lwz	r3,0(r5)
-	lwz	r4,4(r5)
-	b	Lfinish
-#endif
-	nop
-
-/* case FFI_TYPE_SINT64  */
-Lret_type12:
-#if defined(__ppc64__)
-	lg	r3,0(r5)
-	b	Lfinish
-	nop
-#else
-	lwz	r3,0(r5)
-	lwz	r4,4(r5)
-	b	Lfinish
-#endif
-	nop
-
-/* case FFI_TYPE_STRUCT  */
-Lret_type13:
-#if defined(__ppc64__)
-	lg	r3,0(r5)		; we need at least this...
-	cmpi	0,r0,4
-	bgt	Lstructend		; not a special small case
-	b	Lsmallstruct		; see if we need more.
-#else
-	cmpi	0,r0,4
-	bgt	Lfinish		; not by value
-	lg	r3,0(r5)
-	b	Lfinish
-#endif
-/* case FFI_TYPE_POINTER  */
-Lret_type14:
-	lg	r3,0(r5)
-	b	Lfinish
-	nop
-	nop
-
-#if defined(__ppc64__)
-Lsmallstruct:
-	beq	Lfour			; continuation of Lret13.
-	cmpi	0,r0,3
-	beq	Lfinish			; don`t adjust this - can`t be any floats here...
-	srdi	r3,r3,48
-	cmpi	0,r0,2
-	beq	Lfinish			; .. or here ..
-	srdi	r3,r3,8
-	b 	Lfinish			; .. or here.
-
-Lfour:
-	lg	r6,LINKAGE_SIZE(r1)	; get the result type
-	lg	r6,FFI_TYPE_ELEM(r6)	; elements array pointer
-	lg	r6,0(r6)		; first element
-	lhz	r0,FFI_TYPE_TYPE(r6)	; OK go the type
-	cmpi	0,r0,2			; FFI_TYPE_FLOAT
-	bne	Lfourint
-	lfs	f1,0(r5)		; just one float in the struct.
-	b 	Lfinish
-
-Lfourint:
-	srdi	r3,r3,32		; four bytes.
-	b 	Lfinish
-
-Lstructend:
-	lg	r3,LINKAGE_SIZE(r1)	; get the result type
-	bl	STRUCT_RETVALUE_P
-	cmpi	0,r3,0
-	beq	Lfinish			; nope.
-	/* Recover a pointer to the results.  */
-	addi	r11,r1,(SAVE_SIZE-RESULT_BYTES)
-	lg	r3,0(r11)		; we need at least this...
-	lg	r4,8(r11)
-	cmpi	0,r0,16
-	beq	Lfinish		; special case 16 bytes we don't consider floats.
-
-	/* OK, frustratingly, the process of saving the struct to mem might have
-	   messed with the FPRs, so we have to re-load them :(.
-	   We`ll use our FPRs space again - calling: 
-	   void darwin64_pass_struct_floats (ffi_type *s, char *src, 
-					     unsigned *nfpr, double **fprs) 
-	   We`ll temporarily pinch the first two slots of the param area for local
-	   vars used by the routine.  */
-	xor	r6,r6,r6
-	addi	r5,r1,PARENT_PARM_BASE		; some space
-	sg	r6,0(r5)			; *nfpr zeroed.
-	addi	r6,r5,8				; **fprs
-	addi	r3,r1,FP_SAVE_BASE		; pointer to FPRs space
-	sg	r3,0(r6)
-	mr	r4,r11				; the struct is here...
-	lg	r3,LINKAGE_SIZE(r1)		; ffi_type * result_type.
-	bl	PASS_STR_FLOATS			; get struct floats into FPR save space.
-	/* See if we used any floats  */
-	lwz	r0,(SAVE_SIZE-RESULT_BYTES)(r1)	
-	cmpi	0,r0,0
-	beq	Lstructints			; nope.
-	/* OK load `em up... */
-	lfd	f1, (FP_SAVE_BASE                 )(r1)
-	lfd	f2, (FP_SAVE_BASE +  FPR_SIZE     )(r1)
-	lfd	f3, (FP_SAVE_BASE +  FPR_SIZE * 2 )(r1)
-	lfd	f4, (FP_SAVE_BASE +  FPR_SIZE * 3 )(r1)
-	lfd	f5, (FP_SAVE_BASE +  FPR_SIZE * 4 )(r1)
-	lfd	f6, (FP_SAVE_BASE +  FPR_SIZE * 5 )(r1)
-	lfd	f7, (FP_SAVE_BASE +  FPR_SIZE * 6 )(r1)
-	lfd	f8, (FP_SAVE_BASE +  FPR_SIZE * 7 )(r1)
-	lfd	f9, (FP_SAVE_BASE +  FPR_SIZE * 8 )(r1)
-	lfd	f10,(FP_SAVE_BASE +  FPR_SIZE * 9 )(r1)
-	lfd	f11,(FP_SAVE_BASE +  FPR_SIZE * 10)(r1)
-	lfd	f12,(FP_SAVE_BASE +  FPR_SIZE * 11)(r1)
-	lfd	f13,(FP_SAVE_BASE +  FPR_SIZE * 12)(r1)
-
-	/* point back at our saved struct.  */
-Lstructints:
-	addi	r11,r1,(SAVE_SIZE-RESULT_BYTES)
-	lg	r3,0(r11)			; we end up picking the
-	lg	r4,8(r11)			; first two again.
-	lg	r5,16(r11)
-	lg	r6,24(r11)
-	lg	r7,32(r11)
-	lg	r8,40(r11)
-	lg	r9,48(r11)
-	lg	r10,56(r11)
-#endif
-
-/* case done  */
-Lfinish:
-	addi	r1,r1,SAVE_SIZE		/* Restore stack pointer.  */
-	lg	r0,SAVED_LR_OFFSET(r1)	/* Get return address.  */
-	mtlr	r0			/* Reset link register.  */
-	blr
-Lendcode:
-	.align 1
-	
-/* END(ffi_closure_ASM)  */
-
-/* EH frame stuff.  */
-#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78)
-/* 176, 400 */
-#define EH_FRAME_OFFSETA MODE_CHOICE(176,0x90)
-#define EH_FRAME_OFFSETB MODE_CHOICE(1,3)
-
-	.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
-EH_frame1:
-	.set	L$set$0,LECIE1-LSCIE1
-	.long	L$set$0	; Length of Common Information Entry
-LSCIE1:
-	.long	0x0	; CIE Identifier Tag
-	.byte	0x1	; CIE Version
-	.ascii	"zR\0"	; CIE Augmentation
-	.byte	0x1	; uleb128 0x1; CIE Code Alignment Factor
-	.byte	EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor
-	.byte	0x41	; CIE RA Column
-	.byte	0x1	; uleb128 0x1; Augmentation size
-	.byte	0x10	; FDE Encoding (pcrel)
-	.byte	0xc	; DW_CFA_def_cfa
-	.byte	0x1	; uleb128 0x1
-	.byte	0x0	; uleb128 0x0
-	.align	LOG2_GPR_BYTES
-LECIE1:
-	.globl _ffi_closure_ASM.eh
-_ffi_closure_ASM.eh:
-LSFDE1:
-	.set	L$set$1,LEFDE1-LASFDE1
-	.long	L$set$1	; FDE Length
-
-LASFDE1:
-	.long	LASFDE1-EH_frame1	; FDE CIE offset
-	.g_long	Lstartcode-.	; FDE initial location
-	.set	L$set$3,LFE1-Lstartcode
-	.g_long	L$set$3	; FDE address range
-	.byte   0x0     ; uleb128 0x0; Augmentation size
-	.byte	0x4	; DW_CFA_advance_loc4
-	.set	L$set$3,LCFI1-LCFI0
-	.long	L$set$3
-	.byte	0xe	; DW_CFA_def_cfa_offset
-	.byte	EH_FRAME_OFFSETA,EH_FRAME_OFFSETB	; uleb128 176,1/190,3
-	.byte	0x4	; DW_CFA_advance_loc4
-	.set	L$set$4,LCFI0-Lstartcode
-	.long	L$set$4
-	.byte   0x11    ; DW_CFA_offset_extended_sf
-	.byte	0x41	; uleb128 0x41
-	.byte   0x7e    ; sleb128 -2
-	.align	LOG2_GPR_BYTES
-LEFDE1:
-	.align 	1
-
-#ifdef WANT_STUB
-	.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
-	.align 5
-L_ffi_closure_helper_DARWIN$stub:
-	.indirect_symbol _ffi_closure_helper_DARWIN
-	mflr r0
-	bcl 20,31,"L1$spb"
-"L1$spb":
-	mflr r11
-	addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb")
-	mtlr r0
-	lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb")(r11)
-	mtctr r12
-	bctr
-	.lazy_symbol_pointer
-L_ffi_closure_helper_DARWIN$lazy_ptr:
-	.indirect_symbol _ffi_closure_helper_DARWIN
-	.g_long	dyld_stub_binding_helper
-
-#if defined(__ppc64__)
-	.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
-	.align 5
-L_darwin64_struct_ret_by_value_p$stub:
-	.indirect_symbol _darwin64_struct_ret_by_value_p
-	mflr r0
-	bcl 20,31,"L2$spb"
-"L2$spb":
-	mflr r11
-	addis r11,r11,ha16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb")
-	mtlr r0
-	lwzu r12,lo16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb")(r11)
-	mtctr r12
-	bctr
-	.lazy_symbol_pointer
-L_darwin64_struct_ret_by_value_p$lazy_ptr:
-	.indirect_symbol _darwin64_struct_ret_by_value_p
-	.g_long	dyld_stub_binding_helper
-
-	.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
-	.align 5
-L_darwin64_pass_struct_floats$stub:
-	.indirect_symbol _darwin64_pass_struct_floats
-	mflr r0
-	bcl 20,31,"L3$spb"
-"L3$spb":
-	mflr r11
-	addis r11,r11,ha16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb")
-	mtlr r0
-	lwzu r12,lo16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb")(r11)
-	mtctr r12
-	bctr
-	.lazy_symbol_pointer
-L_darwin64_pass_struct_floats$lazy_ptr:
-	.indirect_symbol _darwin64_pass_struct_floats
-	.g_long	dyld_stub_binding_helper
-#  endif
-#endif
diff --git a/third_party/gofrontend/libffi/src/powerpc/ffi.c b/third_party/gofrontend/libffi/src/powerpc/ffi.c
deleted file mode 100644
index 7eb543e..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/ffi.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (C) 2013 IBM
-           Copyright (C) 2011 Anthony Green
-           Copyright (C) 2011 Kyle Moffett
-           Copyright (C) 2008 Red Hat, Inc
-           Copyright (C) 2007, 2008 Free Software Foundation, Inc
-	   Copyright (c) 1998 Geoffrey Keating
-
-   PowerPC Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include "ffi.h"
-#include "ffi_common.h"
-#include "ffi_powerpc.h"
-
-#if HAVE_LONG_DOUBLE_VARIANT
-/* Adjust ffi_type_longdouble.  */
-void FFI_HIDDEN
-ffi_prep_types (ffi_abi abi)
-{
-# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-#  ifdef POWERPC64
-  ffi_prep_types_linux64 (abi);
-#  else
-  ffi_prep_types_sysv (abi);
-#  endif
-# endif
-}
-#endif
-
-/* Perform machine dependent cif processing */
-ffi_status FFI_HIDDEN
-ffi_prep_cif_machdep (ffi_cif *cif)
-{
-#ifdef POWERPC64
-  return ffi_prep_cif_linux64 (cif);
-#else
-  return ffi_prep_cif_sysv (cif);
-#endif
-}
-
-ffi_status FFI_HIDDEN
-ffi_prep_cif_machdep_var (ffi_cif *cif,
-			  unsigned int nfixedargs MAYBE_UNUSED,
-			  unsigned int ntotalargs MAYBE_UNUSED)
-{
-#ifdef POWERPC64
-  return ffi_prep_cif_linux64_var (cif, nfixedargs, ntotalargs);
-#else
-  return ffi_prep_cif_sysv (cif);
-#endif
-}
-
-static void
-ffi_call_int (ffi_cif *cif,
-	      void (*fn) (void),
-	      void *rvalue,
-	      void **avalue,
-	      void *closure)
-{
-  /* The final SYSV ABI says that structures smaller or equal 8 bytes
-     are returned in r3/r4.  A draft ABI used by linux instead returns
-     them in memory.
-
-     We bounce-buffer SYSV small struct return values so that sysv.S
-     can write r3 and r4 to memory without worrying about struct size.
-   
-     For ELFv2 ABI, use a bounce buffer for homogeneous structs too,
-     for similar reasons.  */
-  unsigned long smst_buffer[8];
-  extended_cif ecif;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-
-  ecif.rvalue = rvalue;
-  if ((cif->flags & FLAG_RETURNS_SMST) != 0)
-    ecif.rvalue = smst_buffer;
-  /* Ensure that we have a valid struct return value.
-     FIXME: Isn't this just papering over a user problem?  */
-  else if (!rvalue && cif->rtype->type == FFI_TYPE_STRUCT)
-    ecif.rvalue = alloca (cif->rtype->size);
-
-#ifdef POWERPC64
-  ffi_call_LINUX64 (&ecif, fn, ecif.rvalue, cif->flags, closure,
-		    -(long) cif->bytes);
-#else
-  ffi_call_SYSV (&ecif, fn, ecif.rvalue, cif->flags, closure, -cif->bytes);
-#endif
-
-  /* Check for a bounce-buffered return value */
-  if (rvalue && ecif.rvalue == smst_buffer)
-    {
-      unsigned int rsize = cif->rtype->size;
-#ifndef __LITTLE_ENDIAN__
-      /* The SYSV ABI returns a structure of up to 4 bytes in size
-	 left-padded in r3.  */
-# ifndef POWERPC64
-      if (rsize <= 4)
-	memcpy (rvalue, (char *) smst_buffer + 4 - rsize, rsize);
-      else
-# endif
-	/* The SYSV ABI returns a structure of up to 8 bytes in size
-	   left-padded in r3/r4, and the ELFv2 ABI similarly returns a
-	   structure of up to 8 bytes in size left-padded in r3.  */
-	if (rsize <= 8)
-	  memcpy (rvalue, (char *) smst_buffer + 8 - rsize, rsize);
-	else
-#endif
-	  memcpy (rvalue, smst_buffer, rsize);
-    }
-}
-
-void
-ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, NULL);
-}
-
-void
-ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue,
-	     void *closure)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, closure);
-}
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure *closure,
-		      ffi_cif *cif,
-		      void (*fun) (ffi_cif *, void *, void **, void *),
-		      void *user_data,
-		      void *codeloc)
-{
-#ifdef POWERPC64
-  return ffi_prep_closure_loc_linux64 (closure, cif, fun, user_data, codeloc);
-#else
-  return ffi_prep_closure_loc_sysv (closure, cif, fun, user_data, codeloc);
-#endif
-}
-
-ffi_status
-ffi_prep_go_closure (ffi_go_closure *closure,
-		     ffi_cif *cif,
-		     void (*fun) (ffi_cif *, void *, void **, void *))
-{
-#ifdef POWERPC64
-  closure->tramp = ffi_go_closure_linux64;
-#else
-  closure->tramp = ffi_go_closure_sysv;
-#endif
-  closure->cif = cif;
-  closure->fun = fun;
-  return FFI_OK;
-}
diff --git a/third_party/gofrontend/libffi/src/powerpc/ffi_darwin.c b/third_party/gofrontend/libffi/src/powerpc/ffi_darwin.c
deleted file mode 100644
index cf6fb6d..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/ffi_darwin.c
+++ /dev/null
@@ -1,1359 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi_darwin.c
-
-   Copyright (C) 1998 Geoffrey Keating
-   Copyright (C) 2001 John Hornkvist
-   Copyright (C) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
-
-   FFI support for Darwin and AIX.
-   
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-
-extern void ffi_closure_ASM (void);
-
-enum {
-  /* The assembly depends on these exact flags.  
-     For Darwin64 (when FLAG_RETURNS_STRUCT is set):
-       FLAG_RETURNS_FP indicates that the structure embeds FP data.
-       FLAG_RETURNS_128BITS signals a special struct size that is not
-       expanded for float content.  */
-  FLAG_RETURNS_128BITS	= 1 << (31-31), /* These go in cr7  */
-  FLAG_RETURNS_NOTHING	= 1 << (31-30),
-  FLAG_RETURNS_FP	= 1 << (31-29),
-  FLAG_RETURNS_64BITS	= 1 << (31-28),
-
-  FLAG_RETURNS_STRUCT	= 1 << (31-27), /* This goes in cr6  */
-
-  FLAG_ARG_NEEDS_COPY   = 1 << (31- 7),
-  FLAG_FP_ARGUMENTS     = 1 << (31- 6), /* cr1.eq; specified by ABI  */
-  FLAG_4_GPR_ARGUMENTS  = 1 << (31- 5),
-  FLAG_RETVAL_REFERENCE = 1 << (31- 4)
-};
-
-/* About the DARWIN ABI.  */
-enum {
-  NUM_GPR_ARG_REGISTERS = 8,
-  NUM_FPR_ARG_REGISTERS = 13,
-  LINKAGE_AREA_GPRS = 6
-};
-
-enum { ASM_NEEDS_REGISTERS = 4 }; /* r28-r31 */
-
-/* ffi_prep_args is called by the assembly routine once stack space
-   has been allocated for the function's arguments.
-   
-   m32/m64
-
-   The stack layout we want looks like this:
-
-   |   Return address from ffi_call_DARWIN      |	higher addresses
-   |--------------------------------------------|
-   |   Previous backchain pointer	4/8	|	stack pointer here
-   |--------------------------------------------|<+ <<<	on entry to
-   |   ASM_NEEDS_REGISTERS=r28-r31   4*(4/8)	| |	ffi_call_DARWIN
-   |--------------------------------------------| |
-   |   When we have any FP activity... the	| |
-   |   FPRs occupy NUM_FPR_ARG_REGISTERS slots	| |
-   |   here fp13 .. fp1 from high to low addr.	| |
-   ~						~ ~
-   |   Parameters      (at least 8*4/8=32/64)	| | NUM_GPR_ARG_REGISTERS
-   |--------------------------------------------| |
-   |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
-   |--------------------------------------------| |	stack	|
-   |   Reserved                       2*4/8	| |	grows	|
-   |--------------------------------------------| |	down	V
-   |   Space for callee's LR		4/8	| |
-   |--------------------------------------------| |	lower addresses
-   |   Saved CR [low word for m64]      4/8	| |
-   |--------------------------------------------| |     stack pointer here
-   |   Current backchain pointer	4/8	|-/	during
-   |--------------------------------------------|   <<<	ffi_call_DARWIN
-
-   */
-
-#if defined(POWERPC_DARWIN64)
-static void
-darwin64_pass_struct_by_value 
-  (ffi_type *, char *, unsigned, unsigned *, double **, unsigned long **);
-#endif
-
-/* This depends on GPR_SIZE = sizeof (unsigned long) */
-
-void
-ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
-{
-  const unsigned bytes = ecif->cif->bytes;
-  const unsigned flags = ecif->cif->flags;
-  const unsigned nargs = ecif->cif->nargs;
-#if !defined(POWERPC_DARWIN64) 
-  const ffi_abi abi = ecif->cif->abi;
-#endif
-
-  /* 'stacktop' points at the previous backchain pointer.  */
-  unsigned long *const stacktop = stack + (bytes / sizeof(unsigned long));
-
-  /* 'fpr_base' points at the space for fpr1, and grows upwards as
-     we use FPR registers.  */
-  double *fpr_base = (double *) (stacktop - ASM_NEEDS_REGISTERS) - NUM_FPR_ARG_REGISTERS;
-  int gp_count = 0, fparg_count = 0;
-
-  /* 'next_arg' grows up as we put parameters in it.  */
-  unsigned long *next_arg = stack + LINKAGE_AREA_GPRS; /* 6 reserved positions.  */
-
-  int i;
-  double double_tmp;
-  void **p_argv = ecif->avalue;
-  unsigned long gprvalue;
-  ffi_type** ptr = ecif->cif->arg_types;
-#if !defined(POWERPC_DARWIN64) 
-  char *dest_cpy;
-#endif
-  unsigned size_al = 0;
-
-  /* Check that everything starts aligned properly.  */
-  FFI_ASSERT(((unsigned) (char *) stack & 0xF) == 0);
-  FFI_ASSERT(((unsigned) (char *) stacktop & 0xF) == 0);
-  FFI_ASSERT((bytes & 0xF) == 0);
-
-  /* Deal with return values that are actually pass-by-reference.
-     Rule:
-     Return values are referenced by r3, so r4 is the first parameter.  */
-
-  if (flags & FLAG_RETVAL_REFERENCE)
-    *next_arg++ = (unsigned long) (char *) ecif->rvalue;
-
-  /* Now for the arguments.  */
-  for (i = nargs; i > 0; i--, ptr++, p_argv++)
-    {
-      switch ((*ptr)->type)
-	{
-	/* If a floating-point parameter appears before all of the general-
-	   purpose registers are filled, the corresponding GPRs that match
-	   the size of the floating-point parameter are skipped.  */
-	case FFI_TYPE_FLOAT:
-	  double_tmp = *(float *) *p_argv;
-	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
-	    *fpr_base++ = double_tmp;
-#if defined(POWERPC_DARWIN)
-	  *(float *)next_arg = *(float *) *p_argv;
-#else
-	  *(double *)next_arg = double_tmp;
-#endif
-	  next_arg++;
-	  gp_count++;
-	  fparg_count++;
-	  FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
-	  break;
-
-	case FFI_TYPE_DOUBLE:
-	  double_tmp = *(double *) *p_argv;
-	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
-	    *fpr_base++ = double_tmp;
-	  *(double *)next_arg = double_tmp;
-#ifdef POWERPC64
-	  next_arg++;
-	  gp_count++;
-#else
-	  next_arg += 2;
-	  gp_count += 2;
-#endif
-	  fparg_count++;
-	  FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
-	  break;
-
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-
-	case FFI_TYPE_LONGDOUBLE:
-#  if defined(POWERPC64) && !defined(POWERPC_DARWIN64)
-	  /* ??? This will exceed the regs count when the value starts at fp13
-	     and it will not put the extra bit on the stack.  */
-	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
-	    *(long double *) fpr_base++ = *(long double *) *p_argv;
-	  else
-	    *(long double *) next_arg = *(long double *) *p_argv;
-	  next_arg += 2;
-	  fparg_count += 2;
-#  else
-	  double_tmp = ((double *) *p_argv)[0];
-	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
-	    *fpr_base++ = double_tmp;
-	  *(double *) next_arg = double_tmp;
-#    if defined(POWERPC_DARWIN64)
-	  next_arg++;
-	  gp_count++;
-#    else
-	  next_arg += 2;
-	  gp_count += 2;
-#    endif
-	  fparg_count++;
-	  double_tmp = ((double *) *p_argv)[1];
-	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
-	    *fpr_base++ = double_tmp;
-	  *(double *) next_arg = double_tmp;
-#    if defined(POWERPC_DARWIN64)
-	  next_arg++;
-	  gp_count++;
-#    else
-	  next_arg += 2;
-	  gp_count += 2;
-#    endif
-	  fparg_count++;
-#  endif
-	  FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
-	  break;
-#endif
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-#ifdef POWERPC64
-	  gprvalue = *(long long *) *p_argv;
-	  goto putgpr;
-#else
-	  *(long long *) next_arg = *(long long *) *p_argv;
-	  next_arg += 2;
-	  gp_count += 2;
-#endif
-	  break;
-	case FFI_TYPE_POINTER:
-	  gprvalue = *(unsigned long *) *p_argv;
-	  goto putgpr;
-	case FFI_TYPE_UINT8:
-	  gprvalue = *(unsigned char *) *p_argv;
-	  goto putgpr;
-	case FFI_TYPE_SINT8:
-	  gprvalue = *(signed char *) *p_argv;
-	  goto putgpr;
-	case FFI_TYPE_UINT16:
-	  gprvalue = *(unsigned short *) *p_argv;
-	  goto putgpr;
-	case FFI_TYPE_SINT16:
-	  gprvalue = *(signed short *) *p_argv;
-	  goto putgpr;
-
-	case FFI_TYPE_STRUCT:
-	  size_al = (*ptr)->size;
-#if defined(POWERPC_DARWIN64)
-	  next_arg = (unsigned long *)ALIGN((char *)next_arg, (*ptr)->alignment);
-	  darwin64_pass_struct_by_value (*ptr, (char *) *p_argv, 
-					 (unsigned) size_al,
-					 (unsigned int *) &fparg_count,
-					 &fpr_base, &next_arg);
-#else
-	  dest_cpy = (char *) next_arg;
-
-	  /* If the first member of the struct is a double, then include enough
-	     padding in the struct size to align it to double-word.  */
-	  if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE)
-	    size_al = ALIGN((*ptr)->size, 8);
-
-#  if defined(POWERPC64) 
-	  FFI_ASSERT (abi != FFI_DARWIN);
-	  memcpy ((char *) dest_cpy, (char *) *p_argv, size_al);
-	  next_arg += (size_al + 7) / 8;
-#  else
-	  /* Structures that match the basic modes (QI 1 byte, HI 2 bytes,
-	     SI 4 bytes) are aligned as if they were those modes.
-	     Structures with 3 byte in size are padded upwards.  */
-	  if (size_al < 3 && abi == FFI_DARWIN)
-	    dest_cpy += 4 - size_al;
-
-	  memcpy((char *) dest_cpy, (char *) *p_argv, size_al);
-	  next_arg += (size_al + 3) / 4;
-#  endif
-#endif
-	  break;
-
-	case FFI_TYPE_INT:
-	case FFI_TYPE_SINT32:
-	  gprvalue = *(signed int *) *p_argv;
-	  goto putgpr;
-
-	case FFI_TYPE_UINT32:
-	  gprvalue = *(unsigned int *) *p_argv;
-	putgpr:
-	  *next_arg++ = gprvalue;
-	  gp_count++;
-	  break;
-	default:
-	  break;
-	}
-    }
-
-  /* Check that we didn't overrun the stack...  */
-  /* FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS);
-     FFI_ASSERT((unsigned *)fpr_base
-     	     <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS);
-     FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4);  */
-}
-
-#if defined(POWERPC_DARWIN64)
-
-/* See if we can put some of the struct into fprs.
-   This should not be called for structures of size 16 bytes, since these are not
-   broken out this way.  */
-static void
-darwin64_scan_struct_for_floats (ffi_type *s, unsigned *nfpr)
-{
-  int i;
-
-  FFI_ASSERT (s->type == FFI_TYPE_STRUCT)
-
-  for (i = 0; s->elements[i] != NULL; i++)
-    {
-      ffi_type *p = s->elements[i];
-      switch (p->type)
-	{
-	  case FFI_TYPE_STRUCT:
-	    darwin64_scan_struct_for_floats (p, nfpr);
-	    break;
-	  case FFI_TYPE_LONGDOUBLE:
-	    (*nfpr) += 2;
-	    break;
-	  case FFI_TYPE_DOUBLE:
-	  case FFI_TYPE_FLOAT:
-	    (*nfpr) += 1;
-	    break;
-	  default:
-	    break;    
-	}
-    }
-}
-
-static int
-darwin64_struct_size_exceeds_gprs_p (ffi_type *s, char *src, unsigned *nfpr)
-{
-  unsigned struct_offset=0, i;
-
-  for (i = 0; s->elements[i] != NULL; i++)
-    {
-      char *item_base;
-      ffi_type *p = s->elements[i];
-      /* Find the start of this item (0 for the first one).  */
-      if (i > 0)
-        struct_offset = ALIGN(struct_offset, p->alignment);
-
-      item_base = src + struct_offset;
-
-      switch (p->type)
-	{
-	  case FFI_TYPE_STRUCT:
-	    if (darwin64_struct_size_exceeds_gprs_p (p, item_base, nfpr))
-	      return 1;
-	    break;
-	  case FFI_TYPE_LONGDOUBLE:
-	    if (*nfpr >= NUM_FPR_ARG_REGISTERS)
-	      return 1;
-	    (*nfpr) += 1;
-	    item_base += 8;
-	  /* FALL THROUGH */
-	  case FFI_TYPE_DOUBLE:
-	    if (*nfpr >= NUM_FPR_ARG_REGISTERS)
-	      return 1;
-	    (*nfpr) += 1;
-	    break;
-	  case FFI_TYPE_FLOAT:
-	    if (*nfpr >= NUM_FPR_ARG_REGISTERS)
-	      return 1;
-	    (*nfpr) += 1;
-	    break;
-	  default:
-	    /* If we try and place any item, that is non-float, once we've
-	       exceeded the 8 GPR mark, then we can't fit the struct.  */
-	    if ((unsigned long)item_base >= 8*8) 
-	      return 1;
-	    break;    
-	}
-      /* now count the size of what we just used.  */
-      struct_offset += p->size;
-    }
-  return 0;
-}
-
-/* Can this struct be returned by value?  */
-int 
-darwin64_struct_ret_by_value_p (ffi_type *s)
-{
-  unsigned nfp = 0;
-
-  FFI_ASSERT (s && s->type == FFI_TYPE_STRUCT);
-  
-  /* The largest structure we can return is 8long + 13 doubles.  */
-  if (s->size > 168)
-    return 0;
-  
-  /* We can't pass more than 13 floats.  */
-  darwin64_scan_struct_for_floats (s, &nfp);
-  if (nfp > 13)
-    return 0;
-  
-  /* If there are not too many floats, and the struct is
-     small enough to accommodate in the GPRs, then it must be OK.  */
-  if (s->size <= 64)
-    return 1;
-  
-  /* Well, we have to look harder.  */
-  nfp = 0;
-  if (darwin64_struct_size_exceeds_gprs_p (s, NULL, &nfp))
-    return 0;
-  
-  return 1;
-}
-
-void
-darwin64_pass_struct_floats (ffi_type *s, char *src, 
-			     unsigned *nfpr, double **fprs)
-{
-  int i;
-  double *fpr_base = *fprs;
-  unsigned struct_offset = 0;
-
-  /* We don't assume anything about the alignment of the source.  */
-  for (i = 0; s->elements[i] != NULL; i++)
-    {
-      char *item_base;
-      ffi_type *p = s->elements[i];
-      /* Find the start of this item (0 for the first one).  */
-      if (i > 0)
-        struct_offset = ALIGN(struct_offset, p->alignment);
-      item_base = src + struct_offset;
-
-      switch (p->type)
-	{
-	  case FFI_TYPE_STRUCT:
-	    darwin64_pass_struct_floats (p, item_base, nfpr,
-					   &fpr_base);
-	    break;
-	  case FFI_TYPE_LONGDOUBLE:
-	    if (*nfpr < NUM_FPR_ARG_REGISTERS)
-	      *fpr_base++ = *(double *)item_base;
-	    (*nfpr) += 1;
-	    item_base += 8;
-	  /* FALL THROUGH */
-	  case FFI_TYPE_DOUBLE:
-	    if (*nfpr < NUM_FPR_ARG_REGISTERS)
-	      *fpr_base++ = *(double *)item_base;
-	    (*nfpr) += 1;
-	    break;
-	  case FFI_TYPE_FLOAT:
-	    if (*nfpr < NUM_FPR_ARG_REGISTERS)
-	      *fpr_base++ = (double) *(float *)item_base;
-	    (*nfpr) += 1;
-	    break;
-	  default:
-	    break;    
-	}
-      /* now count the size of what we just used.  */
-      struct_offset += p->size;
-    }
-  /* Update the scores.  */
-  *fprs = fpr_base;
-}
-
-/* Darwin64 special rules.
-   Break out a struct into params and float registers.  */
-static void
-darwin64_pass_struct_by_value (ffi_type *s, char *src, unsigned size,
-			       unsigned *nfpr, double **fprs, unsigned long **arg)
-{
-  unsigned long *next_arg = *arg;
-  char *dest_cpy = (char *)next_arg;
-
-  FFI_ASSERT (s->type == FFI_TYPE_STRUCT)
-
-  if (!size)
-    return;
-
-  /* First... special cases.  */
-  if (size < 3
-      || (size == 4 
-	  && s->elements[0] 
-	  && s->elements[0]->type != FFI_TYPE_FLOAT))
-    {
-      /* Must be at least one GPR, padding is unspecified in value, 
-	 let's make it zero.  */
-      *next_arg = 0UL; 
-      dest_cpy += 8 - size;
-      memcpy ((char *) dest_cpy, src, size);
-      next_arg++;
-    }
-  else if (size == 16)
-    {
-      memcpy ((char *) dest_cpy, src, size);
-      next_arg += 2;
-    }
-  else
-    {
-      /* now the general case, we consider embedded floats.  */
-      memcpy ((char *) dest_cpy, src, size);
-      darwin64_pass_struct_floats (s, src, nfpr, fprs);
-      next_arg += (size+7)/8;
-    }
-    
-  *arg = next_arg;
-}
-
-double *
-darwin64_struct_floats_to_mem (ffi_type *s, char *dest, double *fprs, unsigned *nf)
-{
-  int i;
-  unsigned struct_offset = 0;
-
-  /* We don't assume anything about the alignment of the source.  */
-  for (i = 0; s->elements[i] != NULL; i++)
-    {
-      char *item_base;
-      ffi_type *p = s->elements[i];
-      /* Find the start of this item (0 for the first one).  */
-      if (i > 0)
-        struct_offset = ALIGN(struct_offset, p->alignment);
-      item_base = dest + struct_offset;
-
-      switch (p->type)
-	{
-	  case FFI_TYPE_STRUCT:
-	    fprs = darwin64_struct_floats_to_mem (p, item_base, fprs, nf);
-	    break;
-	  case FFI_TYPE_LONGDOUBLE:
-	    if (*nf < NUM_FPR_ARG_REGISTERS)
-	      {
-		*(double *)item_base = *fprs++ ;
-		(*nf) += 1;
-	      }
-	    item_base += 8;
-	  /* FALL THROUGH */
-	  case FFI_TYPE_DOUBLE:
-	    if (*nf < NUM_FPR_ARG_REGISTERS)
-	      {
-		*(double *)item_base = *fprs++ ;
-		(*nf) += 1;
-	      }
-	    break;
-	  case FFI_TYPE_FLOAT:
-	    if (*nf < NUM_FPR_ARG_REGISTERS)
-	      {
-		*(float *)item_base = (float) *fprs++ ;
-		(*nf) += 1;
-	      }
-	    break;
-	  default:
-	    break;    
-	}
-      /* now count the size of what we just used.  */
-      struct_offset += p->size;
-    }
-  return fprs;
-}
-
-#endif
-
-/* Adjust the size of S to be correct for Darwin.
-   On Darwin m32, the first field of a structure has natural alignment.  
-   On Darwin m64, all fields have natural alignment.  */
-
-static void
-darwin_adjust_aggregate_sizes (ffi_type *s)
-{
-  int i;
-
-  if (s->type != FFI_TYPE_STRUCT)
-    return;
-
-  s->size = 0;
-  for (i = 0; s->elements[i] != NULL; i++)
-    {
-      ffi_type *p;
-      int align;
-      
-      p = s->elements[i];
-      if (p->type == FFI_TYPE_STRUCT)
-	darwin_adjust_aggregate_sizes (p);
-#if defined(POWERPC_DARWIN64)
-      /* Natural alignment for all items.  */
-      align = p->alignment;
-#else
-      /* Natural alignment for the first item... */
-      if (i == 0)
-	align = p->alignment;
-      else if (p->alignment == 16 || p->alignment < 4)
-	/* .. subsequent items with vector or align < 4 have natural align.  */
-	align = p->alignment;
-      else
-	/* .. or align is 4.  */
-	align = 4;
-#endif
-      /* Pad, if necessary, before adding the current item.  */
-      s->size = ALIGN(s->size, align) + p->size;
-    }
-  
-  s->size = ALIGN(s->size, s->alignment);
-  
-  /* This should not be necessary on m64, but harmless.  */
-  if (s->elements[0]->type == FFI_TYPE_UINT64
-      || s->elements[0]->type == FFI_TYPE_SINT64
-      || s->elements[0]->type == FFI_TYPE_DOUBLE
-      || s->elements[0]->alignment == 8)
-    s->alignment = s->alignment > 8 ? s->alignment : 8;
-  /* Do not add additional tail padding.  */
-}
-
-/* Adjust the size of S to be correct for AIX.
-   Word-align double unless it is the first member of a structure.  */
-
-static void
-aix_adjust_aggregate_sizes (ffi_type *s)
-{
-  int i;
-
-  if (s->type != FFI_TYPE_STRUCT)
-    return;
-
-  s->size = 0;
-  for (i = 0; s->elements[i] != NULL; i++)
-    {
-      ffi_type *p;
-      int align;
-      
-      p = s->elements[i];
-      aix_adjust_aggregate_sizes (p);
-      align = p->alignment;
-      if (i != 0 && p->type == FFI_TYPE_DOUBLE)
-	align = 4;
-      s->size = ALIGN(s->size, align) + p->size;
-    }
-  
-  s->size = ALIGN(s->size, s->alignment);
-  
-  if (s->elements[0]->type == FFI_TYPE_UINT64
-      || s->elements[0]->type == FFI_TYPE_SINT64
-      || s->elements[0]->type == FFI_TYPE_DOUBLE
-      || s->elements[0]->alignment == 8)
-    s->alignment = s->alignment > 8 ? s->alignment : 8;
-  /* Do not add additional tail padding.  */
-}
-
-/* Perform machine dependent cif processing.  */
-ffi_status
-ffi_prep_cif_machdep (ffi_cif *cif)
-{
-  /* All this is for the DARWIN ABI.  */
-  unsigned i;
-  ffi_type **ptr;
-  unsigned bytes;
-  unsigned fparg_count = 0, intarg_count = 0;
-  unsigned flags = 0;
-  unsigned size_al = 0;
-
-  /* All the machine-independent calculation of cif->bytes will be wrong.
-     All the calculation of structure sizes will also be wrong.
-     Redo the calculation for DARWIN.  */
-
-  if (cif->abi == FFI_DARWIN)
-    {
-      darwin_adjust_aggregate_sizes (cif->rtype);
-      for (i = 0; i < cif->nargs; i++)
-	darwin_adjust_aggregate_sizes (cif->arg_types[i]);
-    }
-
-  if (cif->abi == FFI_AIX)
-    {
-      aix_adjust_aggregate_sizes (cif->rtype);
-      for (i = 0; i < cif->nargs; i++)
-	aix_adjust_aggregate_sizes (cif->arg_types[i]);
-    }
-
-  /* Space for the frame pointer, callee's LR, CR, etc, and for
-     the asm's temp regs.  */
-
-  bytes = (LINKAGE_AREA_GPRS + ASM_NEEDS_REGISTERS) * sizeof(unsigned long);
-
-  /* Return value handling.  
-    The rules m32 are as follows:
-     - 32-bit (or less) integer values are returned in gpr3;
-     - structures of size <= 4 bytes also returned in gpr3;
-     - 64-bit integer values [??? and structures between 5 and 8 bytes] are
-       returned in gpr3 and gpr4;
-     - Single/double FP values are returned in fpr1;
-     - Long double FP (if not equivalent to double) values are returned in
-       fpr1 and fpr2;
-     m64:
-     - 64-bit or smaller integral values are returned in GPR3
-     - Single/double FP values are returned in fpr1;
-     - Long double FP values are returned in fpr1 and fpr2;
-     m64 Structures:
-     - If the structure could be accommodated in registers were it to be the
-       first argument to a routine, then it is returned in those registers.
-     m32/m64 structures otherwise:
-     - Larger structures values are allocated space and a pointer is passed
-       as the first argument.  */
-  switch (cif->rtype->type)
-    {
-
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-    case FFI_TYPE_LONGDOUBLE:
-      flags |= FLAG_RETURNS_128BITS;
-      flags |= FLAG_RETURNS_FP;
-      break;
-#endif
-
-    case FFI_TYPE_DOUBLE:
-      flags |= FLAG_RETURNS_64BITS;
-      /* Fall through.  */
-    case FFI_TYPE_FLOAT:
-      flags |= FLAG_RETURNS_FP;
-      break;
-
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_SINT64:
-#ifdef POWERPC64
-    case FFI_TYPE_POINTER:
-#endif
-      flags |= FLAG_RETURNS_64BITS;
-      break;
-
-    case FFI_TYPE_STRUCT:
-#if defined(POWERPC_DARWIN64)
-      {
-	/* Can we fit the struct into regs?  */
-	if (darwin64_struct_ret_by_value_p (cif->rtype))
-	  {
-	    unsigned nfpr = 0;
-	    flags |= FLAG_RETURNS_STRUCT;
-	    if (cif->rtype->size != 16)
-	      darwin64_scan_struct_for_floats (cif->rtype, &nfpr) ;
-	    else
-	      flags |= FLAG_RETURNS_128BITS;
-	    /* Will be 0 for 16byte struct.  */
-	    if (nfpr)
-	      flags |= FLAG_RETURNS_FP;
-	  }
-	else /* By ref. */
-	  {
-	    flags |= FLAG_RETVAL_REFERENCE;
-	    flags |= FLAG_RETURNS_NOTHING;
-	    intarg_count++;
-	  }
-      }
-#elif defined(DARWIN_PPC)
-      if (cif->rtype->size <= 4)
-	flags |= FLAG_RETURNS_STRUCT;
-      else /* else by reference.  */
-	{
-	  flags |= FLAG_RETVAL_REFERENCE;
-	  flags |= FLAG_RETURNS_NOTHING;
-	  intarg_count++;
-	}
-#else /* assume we pass by ref.  */
-      flags |= FLAG_RETVAL_REFERENCE;
-      flags |= FLAG_RETURNS_NOTHING;
-      intarg_count++;
-#endif
-      break;
-    case FFI_TYPE_VOID:
-      flags |= FLAG_RETURNS_NOTHING;
-      break;
-
-    default:
-      /* Returns 32-bit integer, or similar.  Nothing to do here.  */
-      break;
-    }
-
-  /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the
-     first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest
-     goes on the stack.  
-     ??? Structures are passed as a pointer to a copy of the structure. 
-     Stuff on the stack needs to keep proper alignment.  
-     For m64 the count is effectively of half-GPRs.  */
-  for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
-    {
-      unsigned align_words;
-      switch ((*ptr)->type)
-	{
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_DOUBLE:
-	  fparg_count++;
-#if !defined(POWERPC_DARWIN64)
-	  /* If this FP arg is going on the stack, it must be
-	     8-byte-aligned.  */
-	  if (fparg_count > NUM_FPR_ARG_REGISTERS
-	      && (intarg_count & 0x01) != 0)
-	    intarg_count++;
-#endif
-	  break;
-
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-	case FFI_TYPE_LONGDOUBLE:
-	  fparg_count += 2;
-	  /* If this FP arg is going on the stack, it must be
-	     16-byte-aligned.  */
-	  if (fparg_count >= NUM_FPR_ARG_REGISTERS)
-#if defined (POWERPC64)
-	    intarg_count = ALIGN(intarg_count, 2);
-#else
-	    intarg_count = ALIGN(intarg_count, 4);
-#endif
-	  break;
-#endif
-
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-#if defined(POWERPC64)
-	  intarg_count++;
-#else
-	  /* 'long long' arguments are passed as two words, but
-	     either both words must fit in registers or both go
-	     on the stack.  If they go on the stack, they must
-	     be 8-byte-aligned.  */
-	  if (intarg_count == NUM_GPR_ARG_REGISTERS-1
-	      || (intarg_count >= NUM_GPR_ARG_REGISTERS 
-	          && (intarg_count & 0x01) != 0))
-	    intarg_count++;
-	  intarg_count += 2;
-#endif
-	  break;
-
-	case FFI_TYPE_STRUCT:
-	  size_al = (*ptr)->size;
-#if defined(POWERPC_DARWIN64)
-	  align_words = (*ptr)->alignment >> 3;
-	  if (align_words)
-	    intarg_count = ALIGN(intarg_count, align_words);
-	  /* Base size of the struct.  */
-	  intarg_count += (size_al + 7) / 8;
-	  /* If 16 bytes then don't worry about floats.  */
-	  if (size_al != 16)
-	    /* Scan through for floats to be placed in regs.  */
-	    darwin64_scan_struct_for_floats (*ptr, &fparg_count) ;
-#else
-	  align_words = (*ptr)->alignment >> 2;
-	  if (align_words)
-	    intarg_count = ALIGN(intarg_count, align_words);
-	  /* If the first member of the struct is a double, then align
-	     the struct to double-word. 
-	  if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE)
-	    size_al = ALIGN((*ptr)->size, 8); */
-#  ifdef POWERPC64
-	  intarg_count += (size_al + 7) / 8;
-#  else
-	  intarg_count += (size_al + 3) / 4;
-#  endif
-#endif
-	  break;
-
-	default:
-	  /* Everything else is passed as a 4-byte word in a GPR, either
-	     the object itself or a pointer to it.  */
-	  intarg_count++;
-	  break;
-	}
-    }
-
-  if (fparg_count != 0)
-    flags |= FLAG_FP_ARGUMENTS;
-
-#if defined(POWERPC_DARWIN64)
-  /* Space to image the FPR registers, if needed - which includes when they might be
-     used in a struct return.  */
-  if (fparg_count != 0 
-      || ((flags & FLAG_RETURNS_STRUCT)
-	   && (flags & FLAG_RETURNS_FP)))
-    bytes += NUM_FPR_ARG_REGISTERS * sizeof(double);
-#else
-  /* Space for the FPR registers, if needed.  */
-  if (fparg_count != 0)
-    bytes += NUM_FPR_ARG_REGISTERS * sizeof(double);
-#endif
-
-  /* Stack space.  */
-#ifdef POWERPC64
-  if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS)
-    bytes += (intarg_count + fparg_count) * sizeof(long);
-#else
-  if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS)
-    bytes += (intarg_count + 2 * fparg_count) * sizeof(long);
-#endif
-  else
-    bytes += NUM_GPR_ARG_REGISTERS * sizeof(long);
-
-  /* The stack space allocated needs to be a multiple of 16 bytes.  */
-  bytes = ALIGN(bytes, 16) ;
-
-  cif->flags = flags;
-  cif->bytes = bytes;
-
-  return FFI_OK;
-}
-
-extern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *,
-			 void (*fn)(void), void (*fn2)(void));
-
-extern void ffi_call_DARWIN(extended_cif *, long, unsigned, unsigned *,
-			    void (*fn)(void), void (*fn2)(void), ffi_type*);
-
-void
-ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  extended_cif ecif;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-
-  /* If the return value is a struct and we don't have a return
-     value address then we need to make one.  */
-
-  if ((rvalue == NULL) &&
-      (cif->rtype->type == FFI_TYPE_STRUCT))
-    {
-      ecif.rvalue = alloca (cif->rtype->size);
-    }
-  else
-    ecif.rvalue = rvalue;
-
-  switch (cif->abi)
-    {
-    case FFI_AIX:
-      ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
-		   FFI_FN(ffi_prep_args));
-      break;
-    case FFI_DARWIN:
-      ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
-		      FFI_FN(ffi_prep_args), cif->rtype);
-      break;
-    default:
-      FFI_ASSERT(0);
-      break;
-    }
-}
-
-static void flush_icache(char *);
-static void flush_range(char *, int);
-
-/* The layout of a function descriptor.  A C function pointer really
-   points to one of these.  */
-
-typedef struct aix_fd_struct {
-  void *code_pointer;
-  void *toc;
-} aix_fd;
-
-/* here I'd like to add the stack frame layout we use in darwin_closure.S
-   and aix_closure.S
-
-   m32/m64
-
-   The stack layout looks like this:
-
-   |   Additional params...			| |     Higher address
-   ~						~ ~
-   |   Parameters      (at least 8*4/8=32/64)	| | NUM_GPR_ARG_REGISTERS
-   |--------------------------------------------| |
-   |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
-   |--------------------------------------------| |
-   |   Reserved                       2*4/8	| |
-   |--------------------------------------------| |
-   |   Space for callee's LR		4/8	| |
-   |--------------------------------------------| |
-   |   Saved CR [low word for m64]      4/8	| |
-   |--------------------------------------------| |
-   |   Current backchain pointer	4/8	|-/ Parent's frame.
-   |--------------------------------------------| <+ <<< on entry to ffi_closure_ASM
-   |   Result Bytes			16	| |
-   |--------------------------------------------| |
-   ~   padding to 16-byte alignment		~ ~
-   |--------------------------------------------| |
-   |   NUM_FPR_ARG_REGISTERS slots		| |
-   |   here fp13 .. fp1		       13*8	| |
-   |--------------------------------------------| |
-   |   R3..R10			  8*4/8=32/64	| | NUM_GPR_ARG_REGISTERS
-   |--------------------------------------------| |
-   |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
-   |--------------------------------------------| |	stack	|
-   |   Reserved [compiler,binder]     2*4/8	| |	grows	|
-   |--------------------------------------------| |	down	V
-   |   Space for callee's LR		4/8	| |
-   |--------------------------------------------| |	lower addresses
-   |   Saved CR [low word for m64]      4/8	| |
-   |--------------------------------------------| |     stack pointer here
-   |   Current backchain pointer	4/8	|-/	during
-   |--------------------------------------------|   <<<	ffi_closure_ASM.
-
-*/
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun)(ffi_cif*, void*, void**, void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  unsigned int *tramp;
-  struct ffi_aix_trampoline_struct *tramp_aix;
-  aix_fd *fd;
-
-  switch (cif->abi)
-    {
-      case FFI_DARWIN:
-
-	FFI_ASSERT (cif->abi == FFI_DARWIN);
-
-	tramp = (unsigned int *) &closure->tramp[0];
-#if defined(POWERPC_DARWIN64)
-	tramp[0] = 0x7c0802a6;  /*   mflr    r0  */
-	tramp[1] = 0x429f0015;  /*   bcl-    20,4*cr7+so,  +0x18 (L1)  */
-	/* We put the addresses here.  */
-	tramp[6] = 0x7d6802a6;  /*L1:   mflr    r11  */
-	tramp[7] = 0xe98b0000;  /*   ld     r12,0(r11) function address  */
-	tramp[8] = 0x7c0803a6;  /*   mtlr    r0   */
-	tramp[9] = 0x7d8903a6;  /*   mtctr   r12  */
-	tramp[10] = 0xe96b0008;  /*   lwz     r11,8(r11) static chain  */
-	tramp[11] = 0x4e800420;  /*   bctr  */
-
-	*((unsigned long *)&tramp[2]) = (unsigned long) ffi_closure_ASM; /* function  */
-	*((unsigned long *)&tramp[4]) = (unsigned long) codeloc; /* context  */
-#else
-	tramp[0] = 0x7c0802a6;  /*   mflr    r0  */
-	tramp[1] = 0x429f000d;  /*   bcl-    20,4*cr7+so,0x10  */
-	tramp[4] = 0x7d6802a6;  /*   mflr    r11  */
-	tramp[5] = 0x818b0000;  /*   lwz     r12,0(r11) function address  */
-	tramp[6] = 0x7c0803a6;  /*   mtlr    r0   */
-	tramp[7] = 0x7d8903a6;  /*   mtctr   r12  */
-	tramp[8] = 0x816b0004;  /*   lwz     r11,4(r11) static chain  */
-	tramp[9] = 0x4e800420;  /*   bctr  */
-	tramp[2] = (unsigned long) ffi_closure_ASM; /* function  */
-	tramp[3] = (unsigned long) codeloc; /* context  */
-#endif
-	closure->cif = cif;
-	closure->fun = fun;
-	closure->user_data = user_data;
-
-	/* Flush the icache. Only necessary on Darwin.  */
-	flush_range(codeloc, FFI_TRAMPOLINE_SIZE);
-
-	break;
-
-    case FFI_AIX:
-
-      tramp_aix = (struct ffi_aix_trampoline_struct *) (closure->tramp);
-      fd = (aix_fd *)(void *)ffi_closure_ASM;
-
-      FFI_ASSERT (cif->abi == FFI_AIX);
-
-      tramp_aix->code_pointer = fd->code_pointer;
-      tramp_aix->toc = fd->toc;
-      tramp_aix->static_chain = codeloc;
-      closure->cif = cif;
-      closure->fun = fun;
-      closure->user_data = user_data;
-      break;
-
-    default:
-      return FFI_BAD_ABI;
-      break;
-    }
-  return FFI_OK;
-}
-
-static void
-flush_icache(char *addr)
-{
-#ifndef _AIX
-  __asm__ volatile (
-		"dcbf 0,%0\n"
-		"\tsync\n"
-		"\ticbi 0,%0\n"
-		"\tsync\n"
-		"\tisync"
-		: : "r"(addr) : "memory");
-#endif
-}
-
-static void
-flush_range(char * addr1, int size)
-{
-#define MIN_LINE_SIZE 32
-  int i;
-  for (i = 0; i < size; i += MIN_LINE_SIZE)
-    flush_icache(addr1+i);
-  flush_icache(addr1+size-1);
-}
-
-typedef union
-{
-  float f;
-  double d;
-} ffi_dblfl;
-
-ffi_type *
-ffi_closure_helper_DARWIN (ffi_closure *, void *,
-			   unsigned long *, ffi_dblfl *);
-
-/* Basically the trampoline invokes ffi_closure_ASM, and on
-   entry, r11 holds the address of the closure.
-   After storing the registers that could possibly contain
-   parameters to be passed into the stack frame and setting
-   up space for a return value, ffi_closure_ASM invokes the
-   following helper function to do most of the work.  */
-
-ffi_type *
-ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
-			   unsigned long *pgr, ffi_dblfl *pfr)
-{
-  /* rvalue is the pointer to space for return value in closure assembly
-     pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM
-     pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM.  */
-
-  typedef double ldbits[2];
-
-  union ldu
-  {
-    ldbits lb;
-    long double ld;
-  };
-
-  void **          avalue;
-  ffi_type **      arg_types;
-  long             i, avn;
-  ffi_cif *        cif;
-  ffi_dblfl *      end_pfr = pfr + NUM_FPR_ARG_REGISTERS;
-  unsigned         size_al;
-#if defined(POWERPC_DARWIN64)
-  unsigned 	   fpsused = 0;
-#endif
-
-  cif = closure->cif;
-  avalue = alloca (cif->nargs * sizeof(void *));
-
-  if (cif->rtype->type == FFI_TYPE_STRUCT)
-    {
-#if defined(POWERPC_DARWIN64)
-      if (!darwin64_struct_ret_by_value_p (cif->rtype))
-	{
-    	  /* Won't fit into the regs - return by ref.  */
-	  rvalue = (void *) *pgr;
-	  pgr++;
-	}
-#elif defined(DARWIN_PPC)
-      if (cif->rtype->size > 4)
-	{
-	  rvalue = (void *) *pgr;
-	  pgr++;
-	}
-#else /* assume we return by ref.  */
-      rvalue = (void *) *pgr;
-      pgr++;
-#endif
-    }
-
-  i = 0;
-  avn = cif->nargs;
-  arg_types = cif->arg_types;
-
-  /* Grab the addresses of the arguments from the stack frame.  */
-  while (i < avn)
-    {
-      switch (arg_types[i]->type)
-	{
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT8:
-#if  defined(POWERPC64)
-	  avalue[i] = (char *) pgr + 7;
-#else
-	  avalue[i] = (char *) pgr + 3;
-#endif
-	  pgr++;
-	  break;
-
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT16:
-#if  defined(POWERPC64)
-	  avalue[i] = (char *) pgr + 6;
-#else
-	  avalue[i] = (char *) pgr + 2;
-#endif
-	  pgr++;
-	  break;
-
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT32:
-#if  defined(POWERPC64)
-	  avalue[i] = (char *) pgr + 4;
-#else
-	case FFI_TYPE_POINTER:
-	  avalue[i] = pgr;
-#endif
-	  pgr++;
-	  break;
-
-	case FFI_TYPE_STRUCT:
-	  size_al = arg_types[i]->size;
-#if defined(POWERPC_DARWIN64)
-	  pgr = (unsigned long *)ALIGN((char *)pgr, arg_types[i]->alignment);
-	  if (size_al < 3 || size_al == 4)
-	    {
-	      avalue[i] = ((char *)pgr)+8-size_al;
-	      if (arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT
-		  && fpsused < NUM_FPR_ARG_REGISTERS)
-		{
-		  *(float *)pgr = (float) *(double *)pfr;
-		  pfr++;
-		  fpsused++;
-		}
-	    }
-	  else 
-	    {
-	      if (size_al != 16)
-		pfr = (ffi_dblfl *) 
-		    darwin64_struct_floats_to_mem (arg_types[i], (char *)pgr,
-						   (double *)pfr, &fpsused);
-	      avalue[i] = pgr;
-	    }
-	  pgr += (size_al + 7) / 8;
-#else
-	  /* If the first member of the struct is a double, then align
-	     the struct to double-word.  */
-	  if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
-	    size_al = ALIGN(arg_types[i]->size, 8);
-#  if defined(POWERPC64)
-	  FFI_ASSERT (cif->abi != FFI_DARWIN);
-	  avalue[i] = pgr;
-	  pgr += (size_al + 7) / 8;
-#  else
-	  /* Structures that match the basic modes (QI 1 byte, HI 2 bytes,
-	     SI 4 bytes) are aligned as if they were those modes.  */
-	  if (size_al < 3 && cif->abi == FFI_DARWIN)
-	    avalue[i] = (char*) pgr + 4 - size_al;
-	  else
-	    avalue[i] = pgr;
-	  pgr += (size_al + 3) / 4;
-#  endif
-#endif
-	  break;
-
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_UINT64:
-#if  defined(POWERPC64)
-	case FFI_TYPE_POINTER:
-	  avalue[i] = pgr;
-	  pgr++;
-	  break;
-#else
-	  /* Long long ints are passed in two gpr's.  */
-	  avalue[i] = pgr;
-	  pgr += 2;
-	  break;
-#endif
-
-	case FFI_TYPE_FLOAT:
-	  /* A float value consumes a GPR.
-	     There are 13 64bit floating point registers.  */
-	  if (pfr < end_pfr)
-	    {
-	      double temp = pfr->d;
-	      pfr->f = (float) temp;
-	      avalue[i] = pfr;
-	      pfr++;
-	    }
-	  else
-	    {
-	      avalue[i] = pgr;
-	    }
-	  pgr++;
-	  break;
-
-	case FFI_TYPE_DOUBLE:
-	  /* A double value consumes two GPRs.
-	     There are 13 64bit floating point registers.  */
-	  if (pfr < end_pfr)
-	    {
-	      avalue[i] = pfr;
-	      pfr++;
-	    }
-	  else
-	    {
-	      avalue[i] = pgr;
-	    }
-#ifdef POWERPC64
-	  pgr++;
-#else
-	  pgr += 2;
-#endif
-	  break;
-
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-
-	case FFI_TYPE_LONGDOUBLE:
-#ifdef POWERPC64
-	  if (pfr + 1 < end_pfr)
-	    {
-	      avalue[i] = pfr;
-	      pfr += 2;
-	    }
-	  else
-	    {
-	      if (pfr < end_pfr)
-		{
-		  *pgr = *(unsigned long *) pfr;
-		  pfr++;
-		}
-	      avalue[i] = pgr;
-	    }
-	  pgr += 2;
-#else  /* POWERPC64 */
-	  /* A long double value consumes four GPRs and two FPRs.
-	     There are 13 64bit floating point registers.  */
-	  if (pfr + 1 < end_pfr)
-	    {
-	      avalue[i] = pfr;
-	      pfr += 2;
-	    }
-	  /* Here we have the situation where one part of the long double
-	     is stored in fpr13 and the other part is already on the stack.
-	     We use a union to pass the long double to avalue[i].  */
-	  else if (pfr + 1 == end_pfr)
-	    {
-	      union ldu temp_ld;
-	      memcpy (&temp_ld.lb[0], pfr, sizeof(ldbits));
-	      memcpy (&temp_ld.lb[1], pgr + 2, sizeof(ldbits));
-	      avalue[i] = &temp_ld.ld;
-	      pfr++;
-	    }
-	  else
-	    {
-	      avalue[i] = pgr;
-	    }
-	  pgr += 4;
-#endif  /* POWERPC64 */
-	  break;
-#endif
-	default:
-	  FFI_ASSERT(0);
-	}
-      i++;
-    }
-
-  (closure->fun) (cif, rvalue, avalue, closure->user_data);
-
-  /* Tell ffi_closure_ASM to perform return type promotions.  */
-  return cif->rtype;
-}
diff --git a/third_party/gofrontend/libffi/src/powerpc/ffi_linux64.c b/third_party/gofrontend/libffi/src/powerpc/ffi_linux64.c
deleted file mode 100644
index b84b91f..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/ffi_linux64.c
+++ /dev/null
@@ -1,945 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi_linux64.c - Copyright (C) 2013 IBM
-                   Copyright (C) 2011 Anthony Green
-                   Copyright (C) 2011 Kyle Moffett
-                   Copyright (C) 2008 Red Hat, Inc
-                   Copyright (C) 2007, 2008 Free Software Foundation, Inc
-                   Copyright (c) 1998 Geoffrey Keating
-
-   PowerPC Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include "ffi.h"
-
-#ifdef POWERPC64
-#include "ffi_common.h"
-#include "ffi_powerpc.h"
-
-
-/* About the LINUX64 ABI.  */
-enum {
-  NUM_GPR_ARG_REGISTERS64 = 8,
-  NUM_FPR_ARG_REGISTERS64 = 13
-};
-enum { ASM_NEEDS_REGISTERS64 = 4 };
-
-
-#if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-/* Adjust size of ffi_type_longdouble.  */
-void FFI_HIDDEN
-ffi_prep_types_linux64 (ffi_abi abi)
-{
-  if ((abi & (FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128)) == FFI_LINUX)
-    {
-      ffi_type_longdouble.size = 8;
-      ffi_type_longdouble.alignment = 8;
-    }
-  else
-    {
-      ffi_type_longdouble.size = 16;
-      ffi_type_longdouble.alignment = 16;
-    }
-}
-#endif
-
-
-#if _CALL_ELF == 2
-static unsigned int
-discover_homogeneous_aggregate (const ffi_type *t, unsigned int *elnum)
-{
-  switch (t->type)
-    {
-    case FFI_TYPE_FLOAT:
-    case FFI_TYPE_DOUBLE:
-      *elnum = 1;
-      return (int) t->type;
-
-    case FFI_TYPE_STRUCT:;
-      {
-	unsigned int base_elt = 0, total_elnum = 0;
-	ffi_type **el = t->elements;
-	while (*el)
-	  {
-	    unsigned int el_elt, el_elnum = 0;
-	    el_elt = discover_homogeneous_aggregate (*el, &el_elnum);
-	    if (el_elt == 0
-		|| (base_elt && base_elt != el_elt))
-	      return 0;
-	    base_elt = el_elt;
-	    total_elnum += el_elnum;
-	    if (total_elnum > 8)
-	      return 0;
-	    el++;
-	  }
-	*elnum = total_elnum;
-	return base_elt;
-      }
-
-    default:
-      return 0;
-    }
-}
-#endif
-
-
-/* Perform machine dependent cif processing */
-static ffi_status
-ffi_prep_cif_linux64_core (ffi_cif *cif)
-{
-  ffi_type **ptr;
-  unsigned bytes;
-  unsigned i, fparg_count = 0, intarg_count = 0;
-  unsigned flags = cif->flags;
-#if _CALL_ELF == 2
-  unsigned int elt, elnum;
-#endif
-
-#if FFI_TYPE_LONGDOUBLE == FFI_TYPE_DOUBLE
-  /* If compiled without long double support..  */
-  if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0)
-    return FFI_BAD_ABI;
-#endif
-
-  /* The machine-independent calculation of cif->bytes doesn't work
-     for us.  Redo the calculation.  */
-#if _CALL_ELF == 2
-  /* Space for backchain, CR, LR, TOC and the asm's temp regs.  */
-  bytes = (4 + ASM_NEEDS_REGISTERS64) * sizeof (long);
-
-  /* Space for the general registers.  */
-  bytes += NUM_GPR_ARG_REGISTERS64 * sizeof (long);
-#else
-  /* Space for backchain, CR, LR, cc/ld doubleword, TOC and the asm's temp
-     regs.  */
-  bytes = (6 + ASM_NEEDS_REGISTERS64) * sizeof (long);
-
-  /* Space for the mandatory parm save area and general registers.  */
-  bytes += 2 * NUM_GPR_ARG_REGISTERS64 * sizeof (long);
-#endif
-
-  /* Return value handling.  */
-  switch (cif->rtype->type)
-    {
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-    case FFI_TYPE_LONGDOUBLE:
-      if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0)
-	flags |= FLAG_RETURNS_128BITS;
-      /* Fall through.  */
-#endif
-    case FFI_TYPE_DOUBLE:
-      flags |= FLAG_RETURNS_64BITS;
-      /* Fall through.  */
-    case FFI_TYPE_FLOAT:
-      flags |= FLAG_RETURNS_FP;
-      break;
-
-    case FFI_TYPE_UINT128:
-      flags |= FLAG_RETURNS_128BITS;
-      /* Fall through.  */
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_SINT64:
-      flags |= FLAG_RETURNS_64BITS;
-      break;
-
-    case FFI_TYPE_STRUCT:
-#if _CALL_ELF == 2
-      elt = discover_homogeneous_aggregate (cif->rtype, &elnum);
-      if (elt)
-	{
-	  if (elt == FFI_TYPE_DOUBLE)
-	    flags |= FLAG_RETURNS_64BITS;
-	  flags |= FLAG_RETURNS_FP | FLAG_RETURNS_SMST;
-	  break;
-	}
-      if (cif->rtype->size <= 16)
-	{
-	  flags |= FLAG_RETURNS_SMST;
-	  break;
-	}
-#endif
-      intarg_count++;
-      flags |= FLAG_RETVAL_REFERENCE;
-      /* Fall through.  */
-    case FFI_TYPE_VOID:
-      flags |= FLAG_RETURNS_NOTHING;
-      break;
-
-    default:
-      /* Returns 32-bit integer, or similar.  Nothing to do here.  */
-      break;
-    }
-
-  for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
-    {
-      unsigned int align;
-
-      switch ((*ptr)->type)
-	{
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-	case FFI_TYPE_LONGDOUBLE:
-	  if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0)
-	    {
-	      fparg_count++;
-	      intarg_count++;
-	    }
-	  /* Fall through.  */
-#endif
-	case FFI_TYPE_DOUBLE:
-	case FFI_TYPE_FLOAT:
-	  fparg_count++;
-	  intarg_count++;
-	  if (fparg_count > NUM_FPR_ARG_REGISTERS64)
-	    flags |= FLAG_ARG_NEEDS_PSAVE;
-	  break;
-
-	case FFI_TYPE_STRUCT:
-	  if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0)
-	    {
-	      align = (*ptr)->alignment;
-	      if (align > 16)
-		align = 16;
-	      align = align / 8;
-	      if (align > 1)
-		intarg_count = ALIGN (intarg_count, align);
-	    }
-	  intarg_count += ((*ptr)->size + 7) / 8;
-#if _CALL_ELF == 2
-	  elt = discover_homogeneous_aggregate (*ptr, &elnum);
-	  if (elt)
-	    {
-	      fparg_count += elnum;
-	      if (fparg_count > NUM_FPR_ARG_REGISTERS64)
-		flags |= FLAG_ARG_NEEDS_PSAVE;
-	    }
-	  else
-#endif
-	    {
-	      if (intarg_count > NUM_GPR_ARG_REGISTERS64)
-		flags |= FLAG_ARG_NEEDS_PSAVE;
-	    }
-	  break;
-
-	case FFI_TYPE_POINTER:
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_INT:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT16:
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT8:
-	case FFI_TYPE_SINT8:
-	  /* Everything else is passed as a 8-byte word in a GPR, either
-	     the object itself or a pointer to it.  */
-	  intarg_count++;
-	  if (intarg_count > NUM_GPR_ARG_REGISTERS64)
-	    flags |= FLAG_ARG_NEEDS_PSAVE;
-	  break;
-	default:
-	  FFI_ASSERT (0);
-	}
-    }
-
-  if (fparg_count != 0)
-    flags |= FLAG_FP_ARGUMENTS;
-  if (intarg_count > 4)
-    flags |= FLAG_4_GPR_ARGUMENTS;
-
-  /* Space for the FPR registers, if needed.  */
-  if (fparg_count != 0)
-    bytes += NUM_FPR_ARG_REGISTERS64 * sizeof (double);
-
-  /* Stack space.  */
-#if _CALL_ELF == 2
-  if ((flags & FLAG_ARG_NEEDS_PSAVE) != 0)
-    bytes += intarg_count * sizeof (long);
-#else
-  if (intarg_count > NUM_GPR_ARG_REGISTERS64)
-    bytes += (intarg_count - NUM_GPR_ARG_REGISTERS64) * sizeof (long);
-#endif
-
-  /* The stack space allocated needs to be a multiple of 16 bytes.  */
-  bytes = (bytes + 15) & ~0xF;
-
-  cif->flags = flags;
-  cif->bytes = bytes;
-
-  return FFI_OK;
-}
-
-ffi_status FFI_HIDDEN
-ffi_prep_cif_linux64 (ffi_cif *cif)
-{
-  if ((cif->abi & FFI_LINUX) != 0)
-    cif->nfixedargs = cif->nargs;
-#if _CALL_ELF != 2
-  else if (cif->abi == FFI_COMPAT_LINUX64)
-    {
-      /* This call is from old code.  Don't touch cif->nfixedargs
-	 since old code will be using a smaller cif.  */
-      cif->flags |= FLAG_COMPAT;
-      /* Translate to new abi value.  */
-      cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128;
-    }
-#endif
-  else
-    return FFI_BAD_ABI;
-  return ffi_prep_cif_linux64_core (cif);
-}
-
-ffi_status FFI_HIDDEN
-ffi_prep_cif_linux64_var (ffi_cif *cif,
-			  unsigned int nfixedargs,
-			  unsigned int ntotalargs MAYBE_UNUSED)
-{
-  if ((cif->abi & FFI_LINUX) != 0)
-    cif->nfixedargs = nfixedargs;
-#if _CALL_ELF != 2
-  else if (cif->abi == FFI_COMPAT_LINUX64)
-    {
-      /* This call is from old code.  Don't touch cif->nfixedargs
-	 since old code will be using a smaller cif.  */
-      cif->flags |= FLAG_COMPAT;
-      /* Translate to new abi value.  */
-      cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128;
-    }
-#endif
-  else
-    return FFI_BAD_ABI;
-#if _CALL_ELF == 2
-  cif->flags |= FLAG_ARG_NEEDS_PSAVE;
-#endif
-  return ffi_prep_cif_linux64_core (cif);
-}
-
-
-/* ffi_prep_args64 is called by the assembly routine once stack space
-   has been allocated for the function's arguments.
-
-   The stack layout we want looks like this:
-
-   |   Ret addr from ffi_call_LINUX64	8bytes	|	higher addresses
-   |--------------------------------------------|
-   |   CR save area			8bytes	|
-   |--------------------------------------------|
-   |   Previous backchain pointer	8	|	stack pointer here
-   |--------------------------------------------|<+ <<<	on entry to
-   |   Saved r28-r31			4*8	| |	ffi_call_LINUX64
-   |--------------------------------------------| |
-   |   GPR registers r3-r10		8*8	| |
-   |--------------------------------------------| |
-   |   FPR registers f1-f13 (optional)	13*8	| |
-   |--------------------------------------------| |
-   |   Parameter save area		        | |
-   |--------------------------------------------| |
-   |   TOC save area			8	| |
-   |--------------------------------------------| |	stack	|
-   |   Linker doubleword		8	| |	grows	|
-   |--------------------------------------------| |	down	V
-   |   Compiler doubleword		8	| |
-   |--------------------------------------------| |	lower addresses
-   |   Space for callee's LR		8	| |
-   |--------------------------------------------| |
-   |   CR save area			8	| |
-   |--------------------------------------------| |	stack pointer here
-   |   Current backchain pointer	8	|-/	during
-   |--------------------------------------------|   <<<	ffi_call_LINUX64
-
-*/
-
-void FFI_HIDDEN
-ffi_prep_args64 (extended_cif *ecif, unsigned long *const stack)
-{
-  const unsigned long bytes = ecif->cif->bytes;
-  const unsigned long flags = ecif->cif->flags;
-
-  typedef union
-  {
-    char *c;
-    unsigned long *ul;
-    float *f;
-    double *d;
-    size_t p;
-  } valp;
-
-  /* 'stacktop' points at the previous backchain pointer.  */
-  valp stacktop;
-
-  /* 'next_arg' points at the space for gpr3, and grows upwards as
-     we use GPR registers, then continues at rest.  */
-  valp gpr_base;
-  valp gpr_end;
-  valp rest;
-  valp next_arg;
-
-  /* 'fpr_base' points at the space for fpr3, and grows upwards as
-     we use FPR registers.  */
-  valp fpr_base;
-  unsigned int fparg_count;
-
-  unsigned int i, words, nargs, nfixedargs;
-  ffi_type **ptr;
-  double double_tmp;
-  union
-  {
-    void **v;
-    char **c;
-    signed char **sc;
-    unsigned char **uc;
-    signed short **ss;
-    unsigned short **us;
-    signed int **si;
-    unsigned int **ui;
-    unsigned long **ul;
-    float **f;
-    double **d;
-  } p_argv;
-  unsigned long gprvalue;
-  unsigned long align;
-
-  stacktop.c = (char *) stack + bytes;
-  gpr_base.ul = stacktop.ul - ASM_NEEDS_REGISTERS64 - NUM_GPR_ARG_REGISTERS64;
-  gpr_end.ul = gpr_base.ul + NUM_GPR_ARG_REGISTERS64;
-#if _CALL_ELF == 2
-  rest.ul = stack + 4 + NUM_GPR_ARG_REGISTERS64;
-#else
-  rest.ul = stack + 6 + NUM_GPR_ARG_REGISTERS64;
-#endif
-  fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS64;
-  fparg_count = 0;
-  next_arg.ul = gpr_base.ul;
-
-  /* Check that everything starts aligned properly.  */
-  FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0);
-  FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0);
-  FFI_ASSERT ((bytes & 0xF) == 0);
-
-  /* Deal with return values that are actually pass-by-reference.  */
-  if (flags & FLAG_RETVAL_REFERENCE)
-    *next_arg.ul++ = (unsigned long) (char *) ecif->rvalue;
-
-  /* Now for the arguments.  */
-  p_argv.v = ecif->avalue;
-  nargs = ecif->cif->nargs;
-#if _CALL_ELF != 2
-  nfixedargs = (unsigned) -1;
-  if ((flags & FLAG_COMPAT) == 0)
-#endif
-    nfixedargs = ecif->cif->nfixedargs;
-  for (ptr = ecif->cif->arg_types, i = 0;
-       i < nargs;
-       i++, ptr++, p_argv.v++)
-    {
-#if _CALL_ELF == 2
-      unsigned int elt, elnum;
-#endif
-
-      switch ((*ptr)->type)
-	{
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-	case FFI_TYPE_LONGDOUBLE:
-	  if ((ecif->cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0)
-	    {
-	      double_tmp = (*p_argv.d)[0];
-	      if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs)
-		{
-		  *fpr_base.d++ = double_tmp;
-# if _CALL_ELF != 2
-		  if ((flags & FLAG_COMPAT) != 0)
-		    *next_arg.d = double_tmp;
-# endif
-		}
-	      else
-		*next_arg.d = double_tmp;
-	      if (++next_arg.ul == gpr_end.ul)
-		next_arg.ul = rest.ul;
-	      fparg_count++;
-	      double_tmp = (*p_argv.d)[1];
-	      if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs)
-		{
-		  *fpr_base.d++ = double_tmp;
-# if _CALL_ELF != 2
-		  if ((flags & FLAG_COMPAT) != 0)
-		    *next_arg.d = double_tmp;
-# endif
-		}
-	      else
-		*next_arg.d = double_tmp;
-	      if (++next_arg.ul == gpr_end.ul)
-		next_arg.ul = rest.ul;
-	      fparg_count++;
-	      FFI_ASSERT (__LDBL_MANT_DIG__ == 106);
-	      FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
-	      break;
-	    }
-	  /* Fall through.  */
-#endif
-	case FFI_TYPE_DOUBLE:
-	  double_tmp = **p_argv.d;
-	  if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs)
-	    {
-	      *fpr_base.d++ = double_tmp;
-#if _CALL_ELF != 2
-	      if ((flags & FLAG_COMPAT) != 0)
-		*next_arg.d = double_tmp;
-#endif
-	    }
-	  else
-	    *next_arg.d = double_tmp;
-	  if (++next_arg.ul == gpr_end.ul)
-	    next_arg.ul = rest.ul;
-	  fparg_count++;
-	  FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
-	  break;
-
-	case FFI_TYPE_FLOAT:
-	  double_tmp = **p_argv.f;
-	  if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs)
-	    {
-	      *fpr_base.d++ = double_tmp;
-#if _CALL_ELF != 2
-	      if ((flags & FLAG_COMPAT) != 0)
-		*next_arg.f = (float) double_tmp;
-#endif
-	    }
-	  else
-	    *next_arg.f = (float) double_tmp;
-	  if (++next_arg.ul == gpr_end.ul)
-	    next_arg.ul = rest.ul;
-	  fparg_count++;
-	  FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
-	  break;
-
-	case FFI_TYPE_STRUCT:
-	  if ((ecif->cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0)
-	    {
-	      align = (*ptr)->alignment;
-	      if (align > 16)
-		align = 16;
-	      if (align > 1)
-		next_arg.p = ALIGN (next_arg.p, align);
-	    }
-#if _CALL_ELF == 2
-	  elt = discover_homogeneous_aggregate (*ptr, &elnum);
-	  if (elt)
-	    {
-	      union {
-		void *v;
-		float *f;
-		double *d;
-	      } arg;
-
-	      arg.v = *p_argv.v;
-	      if (elt == FFI_TYPE_FLOAT)
-		{
-		  do
-		    {
-		      double_tmp = *arg.f++;
-		      if (fparg_count < NUM_FPR_ARG_REGISTERS64
-			  && i < nfixedargs)
-			*fpr_base.d++ = double_tmp;
-		      else
-			*next_arg.f = (float) double_tmp;
-		      if (++next_arg.f == gpr_end.f)
-			next_arg.f = rest.f;
-		      fparg_count++;
-		    }
-		  while (--elnum != 0);
-		  if ((next_arg.p & 3) != 0)
-		    {
-		      if (++next_arg.f == gpr_end.f)
-			next_arg.f = rest.f;
-		    }
-		}
-	      else
-		do
-		  {
-		    double_tmp = *arg.d++;
-		    if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs)
-		      *fpr_base.d++ = double_tmp;
-		    else
-		      *next_arg.d = double_tmp;
-		    if (++next_arg.d == gpr_end.d)
-		      next_arg.d = rest.d;
-		    fparg_count++;
-		  }
-		while (--elnum != 0);
-	    }
-	  else
-#endif
-	    {
-	      words = ((*ptr)->size + 7) / 8;
-	      if (next_arg.ul >= gpr_base.ul && next_arg.ul + words > gpr_end.ul)
-		{
-		  size_t first = gpr_end.c - next_arg.c;
-		  memcpy (next_arg.c, *p_argv.c, first);
-		  memcpy (rest.c, *p_argv.c + first, (*ptr)->size - first);
-		  next_arg.c = rest.c + words * 8 - first;
-		}
-	      else
-		{
-		  char *where = next_arg.c;
-
-#ifndef __LITTLE_ENDIAN__
-		  /* Structures with size less than eight bytes are passed
-		     left-padded.  */
-		  if ((*ptr)->size < 8)
-		    where += 8 - (*ptr)->size;
-#endif
-		  memcpy (where, *p_argv.c, (*ptr)->size);
-		  next_arg.ul += words;
-		  if (next_arg.ul == gpr_end.ul)
-		    next_arg.ul = rest.ul;
-		}
-	    }
-	  break;
-
-	case FFI_TYPE_UINT8:
-	  gprvalue = **p_argv.uc;
-	  goto putgpr;
-	case FFI_TYPE_SINT8:
-	  gprvalue = **p_argv.sc;
-	  goto putgpr;
-	case FFI_TYPE_UINT16:
-	  gprvalue = **p_argv.us;
-	  goto putgpr;
-	case FFI_TYPE_SINT16:
-	  gprvalue = **p_argv.ss;
-	  goto putgpr;
-	case FFI_TYPE_UINT32:
-	  gprvalue = **p_argv.ui;
-	  goto putgpr;
-	case FFI_TYPE_INT:
-	case FFI_TYPE_SINT32:
-	  gprvalue = **p_argv.si;
-	  goto putgpr;
-
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_POINTER:
-	  gprvalue = **p_argv.ul;
-	putgpr:
-	  *next_arg.ul++ = gprvalue;
-	  if (next_arg.ul == gpr_end.ul)
-	    next_arg.ul = rest.ul;
-	  break;
-	}
-    }
-
-  FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS
-	      || (next_arg.ul >= gpr_base.ul
-		  && next_arg.ul <= gpr_base.ul + 4));
-}
-
-
-#if _CALL_ELF == 2
-#define MIN_CACHE_LINE_SIZE 8
-
-static void
-flush_icache (char *wraddr, char *xaddr, int size)
-{
-  int i;
-  for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE)
-    __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;"
-		      : : "r" (xaddr + i), "r" (wraddr + i) : "memory");
-  __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;"
-		    : : "r"(xaddr + size - 1), "r"(wraddr + size - 1)
-		    : "memory");
-}
-#endif
-
-
-ffi_status FFI_HIDDEN
-ffi_prep_closure_loc_linux64 (ffi_closure *closure,
-			      ffi_cif *cif,
-			      void (*fun) (ffi_cif *, void *, void **, void *),
-			      void *user_data,
-			      void *codeloc)
-{
-#if _CALL_ELF == 2
-  unsigned int *tramp = (unsigned int *) &closure->tramp[0];
-
-  if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI)
-    return FFI_BAD_ABI;
-
-  tramp[0] = 0xe96c0018;	/* 0:	ld	11,2f-0b(12)	*/
-  tramp[1] = 0xe98c0010;	/*	ld	12,1f-0b(12)	*/
-  tramp[2] = 0x7d8903a6;	/*	mtctr	12		*/
-  tramp[3] = 0x4e800420;	/*	bctr			*/
-				/* 1:	.quad	function_addr	*/
-				/* 2:	.quad	context		*/
-  *(void **) &tramp[4] = (void *) ffi_closure_LINUX64;
-  *(void **) &tramp[6] = codeloc;
-  flush_icache ((char *) tramp, (char *) codeloc, 4 * 4);
-#else
-  void **tramp = (void **) &closure->tramp[0];
-
-  if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI)
-    return FFI_BAD_ABI;
-
-  /* Copy function address and TOC from ffi_closure_LINUX64 OPD.  */
-  memcpy (&tramp[0], (void **) ffi_closure_LINUX64, sizeof (void *));
-  tramp[1] = codeloc;
-  memcpy (&tramp[2], (void **) ffi_closure_LINUX64 + 1, sizeof (void *));
-#endif
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  return FFI_OK;
-}
-
-
-int FFI_HIDDEN
-ffi_closure_helper_LINUX64 (ffi_cif *cif,
-			    void (*fun) (ffi_cif *, void *, void **, void *),
-			    void *user_data,
-			    void *rvalue,
-			    unsigned long *pst,
-			    ffi_dblfl *pfr)
-{
-  /* rvalue is the pointer to space for return value in closure assembly */
-  /* pst is the pointer to parameter save area
-     (r3-r10 are stored into its first 8 slots by ffi_closure_LINUX64) */
-  /* pfr is the pointer to where f1-f13 are stored in ffi_closure_LINUX64 */
-
-  void **avalue;
-  ffi_type **arg_types;
-  unsigned long i, avn, nfixedargs;
-  ffi_dblfl *end_pfr = pfr + NUM_FPR_ARG_REGISTERS64;
-  unsigned long align;
-
-  avalue = alloca (cif->nargs * sizeof (void *));
-
-  /* Copy the caller's structure return value address so that the
-     closure returns the data directly to the caller.  */
-  if (cif->rtype->type == FFI_TYPE_STRUCT
-      && (cif->flags & FLAG_RETURNS_SMST) == 0)
-    {
-      rvalue = (void *) *pst;
-      pst++;
-    }
-
-  i = 0;
-  avn = cif->nargs;
-#if _CALL_ELF != 2
-  nfixedargs = (unsigned) -1;
-  if ((cif->flags & FLAG_COMPAT) == 0)
-#endif
-    nfixedargs = cif->nfixedargs;
-  arg_types = cif->arg_types;
-
-  /* Grab the addresses of the arguments from the stack frame.  */
-  while (i < avn)
-    {
-      unsigned int elt, elnum;
-
-      switch (arg_types[i]->type)
-	{
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT8:
-#ifndef __LITTLE_ENDIAN__
-	  avalue[i] = (char *) pst + 7;
-	  pst++;
-	  break;
-#endif
-
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT16:
-#ifndef __LITTLE_ENDIAN__
-	  avalue[i] = (char *) pst + 6;
-	  pst++;
-	  break;
-#endif
-
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT32:
-#ifndef __LITTLE_ENDIAN__
-	  avalue[i] = (char *) pst + 4;
-	  pst++;
-	  break;
-#endif
-
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_POINTER:
-	  avalue[i] = pst;
-	  pst++;
-	  break;
-
-	case FFI_TYPE_STRUCT:
-	  if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0)
-	    {
-	      align = arg_types[i]->alignment;
-	      if (align > 16)
-		align = 16;
-	      if (align > 1)
-		pst = (unsigned long *) ALIGN ((size_t) pst, align);
-	    }
-	  elt = 0;
-#if _CALL_ELF == 2
-	  elt = discover_homogeneous_aggregate (arg_types[i], &elnum);
-#endif
-	  if (elt)
-	    {
-	      union {
-		void *v;
-		unsigned long *ul;
-		float *f;
-		double *d;
-		size_t p;
-	      } to, from;
-
-	      /* Repackage the aggregate from its parts.  The
-		 aggregate size is not greater than the space taken by
-		 the registers so store back to the register/parameter
-		 save arrays.  */
-	      if (pfr + elnum <= end_pfr)
-		to.v = pfr;
-	      else
-		to.v = pst;
-
-	      avalue[i] = to.v;
-	      from.ul = pst;
-	      if (elt == FFI_TYPE_FLOAT)
-		{
-		  do
-		    {
-		      if (pfr < end_pfr && i < nfixedargs)
-			{
-			  *to.f = (float) pfr->d;
-			  pfr++;
-			}
-		      else
-			*to.f = *from.f;
-		      to.f++;
-		      from.f++;
-		    }
-		  while (--elnum != 0);
-		}
-	      else
-		{
-		  do
-		    {
-		      if (pfr < end_pfr && i < nfixedargs)
-			{
-			  *to.d = pfr->d;
-			  pfr++;
-			}
-		      else
-			*to.d = *from.d;
-		      to.d++;
-		      from.d++;
-		    }
-		  while (--elnum != 0);
-		}
-	    }
-	  else
-	    {
-#ifndef __LITTLE_ENDIAN__
-	      /* Structures with size less than eight bytes are passed
-		 left-padded.  */
-	      if (arg_types[i]->size < 8)
-		avalue[i] = (char *) pst + 8 - arg_types[i]->size;
-	      else
-#endif
-		avalue[i] = pst;
-	    }
-	  pst += (arg_types[i]->size + 7) / 8;
-	  break;
-
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-	case FFI_TYPE_LONGDOUBLE:
-	  if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0)
-	    {
-	      if (pfr + 1 < end_pfr && i + 1 < nfixedargs)
-		{
-		  avalue[i] = pfr;
-		  pfr += 2;
-		}
-	      else
-		{
-		  if (pfr < end_pfr && i < nfixedargs)
-		    {
-		      /* Passed partly in f13 and partly on the stack.
-			 Move it all to the stack.  */
-		      *pst = *(unsigned long *) pfr;
-		      pfr++;
-		    }
-		  avalue[i] = pst;
-		}
-	      pst += 2;
-	      break;
-	    }
-	  /* Fall through.  */
-#endif
-	case FFI_TYPE_DOUBLE:
-	  /* On the outgoing stack all values are aligned to 8 */
-	  /* there are 13 64bit floating point registers */
-
-	  if (pfr < end_pfr && i < nfixedargs)
-	    {
-	      avalue[i] = pfr;
-	      pfr++;
-	    }
-	  else
-	    avalue[i] = pst;
-	  pst++;
-	  break;
-
-	case FFI_TYPE_FLOAT:
-	  if (pfr < end_pfr && i < nfixedargs)
-	    {
-	      /* Float values are stored as doubles in the
-		 ffi_closure_LINUX64 code.  Fix them here.  */
-	      pfr->f = (float) pfr->d;
-	      avalue[i] = pfr;
-	      pfr++;
-	    }
-	  else
-	    avalue[i] = pst;
-	  pst++;
-	  break;
-
-	default:
-	  FFI_ASSERT (0);
-	}
-
-      i++;
-    }
-
-  (*fun) (cif, rvalue, avalue, user_data);
-
-  /* Tell ffi_closure_LINUX64 how to perform return type promotions.  */
-  if ((cif->flags & FLAG_RETURNS_SMST) != 0)
-    {
-      if ((cif->flags & FLAG_RETURNS_FP) == 0)
-	return FFI_V2_TYPE_SMALL_STRUCT + cif->rtype->size - 1;
-      else if ((cif->flags & FLAG_RETURNS_64BITS) != 0)
-	return FFI_V2_TYPE_DOUBLE_HOMOG;
-      else
-	return FFI_V2_TYPE_FLOAT_HOMOG;
-    }
-  return cif->rtype->type;
-}
-#endif
diff --git a/third_party/gofrontend/libffi/src/powerpc/ffi_powerpc.h b/third_party/gofrontend/libffi/src/powerpc/ffi_powerpc.h
deleted file mode 100644
index 3dcd6b5..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/ffi_powerpc.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi_powerpc.h - Copyright (C) 2013 IBM
-                   Copyright (C) 2011 Anthony Green
-                   Copyright (C) 2011 Kyle Moffett
-                   Copyright (C) 2008 Red Hat, Inc
-                   Copyright (C) 2007, 2008 Free Software Foundation, Inc
-                   Copyright (c) 1998 Geoffrey Keating
-
-   PowerPC Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-enum {
-  /* The assembly depends on these exact flags.  */
-  /* These go in cr7 */
-  FLAG_RETURNS_SMST	= 1 << (31-31), /* Used for FFI_SYSV small structs.  */
-  FLAG_RETURNS_NOTHING  = 1 << (31-30),
-  FLAG_RETURNS_FP       = 1 << (31-29),
-  FLAG_RETURNS_64BITS   = 1 << (31-28),
-
-  /* This goes in cr6 */
-  FLAG_RETURNS_128BITS  = 1 << (31-27),
-
-  FLAG_COMPAT		= 1 << (31- 8), /* Not used by assembly */
-
-  /* These go in cr1 */
-  FLAG_ARG_NEEDS_COPY   = 1 << (31- 7), /* Used by sysv code */
-  FLAG_ARG_NEEDS_PSAVE  = FLAG_ARG_NEEDS_COPY, /* Used by linux64 code */
-  FLAG_FP_ARGUMENTS     = 1 << (31- 6), /* cr1.eq; specified by ABI */
-  FLAG_4_GPR_ARGUMENTS  = 1 << (31- 5),
-  FLAG_RETVAL_REFERENCE = 1 << (31- 4)
-};
-
-typedef union
-{
-  float f;
-  double d;
-} ffi_dblfl;
-
-void FFI_HIDDEN ffi_closure_SYSV (void);
-void FFI_HIDDEN ffi_go_closure_sysv (void);
-void FFI_HIDDEN ffi_call_SYSV(extended_cif *, void (*)(void), void *,
-			      unsigned, void *, int);
-
-void FFI_HIDDEN ffi_prep_types_sysv (ffi_abi);
-ffi_status FFI_HIDDEN ffi_prep_cif_sysv (ffi_cif *);
-ffi_status FFI_HIDDEN ffi_prep_closure_loc_sysv (ffi_closure *,
-						 ffi_cif *,
-						 void (*) (ffi_cif *, void *,
-							   void **, void *),
-						 void *, void *);
-int FFI_HIDDEN ffi_closure_helper_SYSV (ffi_cif *,
-					void (*) (ffi_cif *, void *,
-						  void **, void *),
-					void *, void *, unsigned long *,
-					ffi_dblfl *, unsigned long *);
-
-void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, void (*) (void), void *,
-				 unsigned long, void *, long);
-void FFI_HIDDEN ffi_closure_LINUX64 (void);
-void FFI_HIDDEN ffi_go_closure_linux64 (void);
-
-void FFI_HIDDEN ffi_prep_types_linux64 (ffi_abi);
-ffi_status FFI_HIDDEN ffi_prep_cif_linux64 (ffi_cif *);
-ffi_status FFI_HIDDEN ffi_prep_cif_linux64_var (ffi_cif *, unsigned int,
-						unsigned int);
-void FFI_HIDDEN ffi_prep_args64 (extended_cif *, unsigned long *const);
-ffi_status FFI_HIDDEN ffi_prep_closure_loc_linux64 (ffi_closure *, ffi_cif *,
-						    void (*) (ffi_cif *, void *,
-							      void **, void *),
-						    void *, void *);
-int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_cif *,
-					   void (*) (ffi_cif *, void *,
-						     void **, void *),
-					   void *, void *,
-					   unsigned long *, ffi_dblfl *);
diff --git a/third_party/gofrontend/libffi/src/powerpc/ffi_sysv.c b/third_party/gofrontend/libffi/src/powerpc/ffi_sysv.c
deleted file mode 100644
index 646c340..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/ffi_sysv.c
+++ /dev/null
@@ -1,934 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi_sysv.c - Copyright (C) 2013 IBM
-                Copyright (C) 2011 Anthony Green
-                Copyright (C) 2011 Kyle Moffett
-                Copyright (C) 2008 Red Hat, Inc
-                Copyright (C) 2007, 2008 Free Software Foundation, Inc
-                Copyright (c) 1998 Geoffrey Keating
-
-   PowerPC Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include "ffi.h"
-
-#ifndef POWERPC64
-#include "ffi_common.h"
-#include "ffi_powerpc.h"
-
-
-/* About the SYSV ABI.  */
-#define ASM_NEEDS_REGISTERS 6
-#define NUM_GPR_ARG_REGISTERS 8
-#define NUM_FPR_ARG_REGISTERS 8
-
-
-#if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-/* Adjust size of ffi_type_longdouble.  */
-void FFI_HIDDEN
-ffi_prep_types_sysv (ffi_abi abi)
-{
-  if ((abi & (FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128)) == FFI_SYSV)
-    {
-      ffi_type_longdouble.size = 8;
-      ffi_type_longdouble.alignment = 8;
-    }
-  else
-    {
-      ffi_type_longdouble.size = 16;
-      ffi_type_longdouble.alignment = 16;
-    }
-}
-#endif
-
-/* Transform long double, double and float to other types as per abi.  */
-static int
-translate_float (int abi, int type)
-{
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-  if (type == FFI_TYPE_LONGDOUBLE
-      && (abi & FFI_SYSV_LONG_DOUBLE_128) == 0)
-    type = FFI_TYPE_DOUBLE;
-#endif
-  if ((abi & FFI_SYSV_SOFT_FLOAT) != 0)
-    {
-      if (type == FFI_TYPE_FLOAT)
-	type = FFI_TYPE_UINT32;
-      else if (type == FFI_TYPE_DOUBLE)
-	type = FFI_TYPE_UINT64;
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-      else if (type == FFI_TYPE_LONGDOUBLE)
-	type = FFI_TYPE_UINT128;
-    }
-  else if ((abi & FFI_SYSV_IBM_LONG_DOUBLE) == 0)
-    {
-      if (type == FFI_TYPE_LONGDOUBLE)
-	type = FFI_TYPE_STRUCT;
-#endif
-    }
-  return type;
-}
-
-/* Perform machine dependent cif processing */
-static ffi_status
-ffi_prep_cif_sysv_core (ffi_cif *cif)
-{
-  ffi_type **ptr;
-  unsigned bytes;
-  unsigned i, fparg_count = 0, intarg_count = 0;
-  unsigned flags = cif->flags;
-  unsigned struct_copy_size = 0;
-  unsigned type = cif->rtype->type;
-  unsigned size = cif->rtype->size;
-
-  /* The machine-independent calculation of cif->bytes doesn't work
-     for us.  Redo the calculation.  */
-
-  /* Space for the frame pointer, callee's LR, and the asm's temp regs.  */
-  bytes = (2 + ASM_NEEDS_REGISTERS) * sizeof (int);
-
-  /* Space for the GPR registers.  */
-  bytes += NUM_GPR_ARG_REGISTERS * sizeof (int);
-
-  /* Return value handling.  The rules for SYSV are as follows:
-     - 32-bit (or less) integer values are returned in gpr3;
-     - Structures of size <= 4 bytes also returned in gpr3;
-     - 64-bit integer values and structures between 5 and 8 bytes are returned
-     in gpr3 and gpr4;
-     - Larger structures are allocated space and a pointer is passed as
-     the first argument.
-     - Single/double FP values are returned in fpr1;
-     - long doubles (if not equivalent to double) are returned in
-     fpr1,fpr2 for Linux and as for large structs for SysV.  */
-
-  type = translate_float (cif->abi, type);
-
-  switch (type)
-    {
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-    case FFI_TYPE_LONGDOUBLE:
-      flags |= FLAG_RETURNS_128BITS;
-      /* Fall through.  */
-#endif
-    case FFI_TYPE_DOUBLE:
-      flags |= FLAG_RETURNS_64BITS;
-      /* Fall through.  */
-    case FFI_TYPE_FLOAT:
-      flags |= FLAG_RETURNS_FP;
-#ifdef __NO_FPRS__
-      return FFI_BAD_ABI;
-#endif
-      break;
-
-    case FFI_TYPE_UINT128:
-      flags |= FLAG_RETURNS_128BITS;
-      /* Fall through.  */
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_SINT64:
-      flags |= FLAG_RETURNS_64BITS;
-      break;
-
-    case FFI_TYPE_STRUCT:
-      /* The final SYSV ABI says that structures smaller or equal 8 bytes
-	 are returned in r3/r4.  A draft ABI used by linux instead
-	 returns them in memory.  */
-      if ((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8)
-	{
-	  flags |= FLAG_RETURNS_SMST;
-	  break;
-	}
-      intarg_count++;
-      flags |= FLAG_RETVAL_REFERENCE;
-      /* Fall through.  */
-    case FFI_TYPE_VOID:
-      flags |= FLAG_RETURNS_NOTHING;
-      break;
-
-    default:
-      /* Returns 32-bit integer, or similar.  Nothing to do here.  */
-      break;
-    }
-
-  /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the
-     first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest
-     goes on the stack.  Structures and long doubles (if not equivalent
-     to double) are passed as a pointer to a copy of the structure.
-     Stuff on the stack needs to keep proper alignment.  */
-  for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
-    {
-      unsigned short typenum = (*ptr)->type;
-
-      typenum = translate_float (cif->abi, typenum);
-
-      switch (typenum)
-	{
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-	case FFI_TYPE_LONGDOUBLE:
-	  fparg_count++;
-	  /* Fall thru */
-#endif
-	case FFI_TYPE_DOUBLE:
-	  fparg_count++;
-	  /* If this FP arg is going on the stack, it must be
-	     8-byte-aligned.  */
-	  if (fparg_count > NUM_FPR_ARG_REGISTERS
-	      && intarg_count >= NUM_GPR_ARG_REGISTERS
-	      && intarg_count % 2 != 0)
-	    intarg_count++;
-#ifdef __NO_FPRS__
-	  return FFI_BAD_ABI;
-#endif
-	  break;
-
-	case FFI_TYPE_FLOAT:
-	  fparg_count++;
-#ifdef __NO_FPRS__
-	  return FFI_BAD_ABI;
-#endif
-	  break;
-
-	case FFI_TYPE_UINT128:
-	  /* A long double in FFI_LINUX_SOFT_FLOAT can use only a set
-	     of four consecutive gprs. If we do not have enough, we
-	     have to adjust the intarg_count value.  */
-	  if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3
-	      && intarg_count < NUM_GPR_ARG_REGISTERS)
-	    intarg_count = NUM_GPR_ARG_REGISTERS;
-	  intarg_count += 4;
-	  break;
-
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	  /* 'long long' arguments are passed as two words, but
-	     either both words must fit in registers or both go
-	     on the stack.  If they go on the stack, they must
-	     be 8-byte-aligned.
-
-	     Also, only certain register pairs can be used for
-	     passing long long int -- specifically (r3,r4), (r5,r6),
-	     (r7,r8), (r9,r10).  */
-	  if (intarg_count == NUM_GPR_ARG_REGISTERS-1
-	      || intarg_count % 2 != 0)
-	    intarg_count++;
-	  intarg_count += 2;
-	  break;
-
-	case FFI_TYPE_STRUCT:
-	  /* We must allocate space for a copy of these to enforce
-	     pass-by-value.  Pad the space up to a multiple of 16
-	     bytes (the maximum alignment required for anything under
-	     the SYSV ABI).  */
-	  struct_copy_size += ((*ptr)->size + 15) & ~0xF;
-	  /* Fall through (allocate space for the pointer).  */
-
-	case FFI_TYPE_POINTER:
-	case FFI_TYPE_INT:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT16:
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT8:
-	case FFI_TYPE_SINT8:
-	  /* Everything else is passed as a 4-byte word in a GPR, either
-	     the object itself or a pointer to it.  */
-	  intarg_count++;
-	  break;
-
-	default:
-	  FFI_ASSERT (0);
-	}
-    }
-
-  if (fparg_count != 0)
-    flags |= FLAG_FP_ARGUMENTS;
-  if (intarg_count > 4)
-    flags |= FLAG_4_GPR_ARGUMENTS;
-  if (struct_copy_size != 0)
-    flags |= FLAG_ARG_NEEDS_COPY;
-
-  /* Space for the FPR registers, if needed.  */
-  if (fparg_count != 0)
-    bytes += NUM_FPR_ARG_REGISTERS * sizeof (double);
-
-  /* Stack space.  */
-  if (intarg_count > NUM_GPR_ARG_REGISTERS)
-    bytes += (intarg_count - NUM_GPR_ARG_REGISTERS) * sizeof (int);
-  if (fparg_count > NUM_FPR_ARG_REGISTERS)
-    bytes += (fparg_count - NUM_FPR_ARG_REGISTERS) * sizeof (double);
-
-  /* The stack space allocated needs to be a multiple of 16 bytes.  */
-  bytes = (bytes + 15) & ~0xF;
-
-  /* Add in the space for the copied structures.  */
-  bytes += struct_copy_size;
-
-  cif->flags = flags;
-  cif->bytes = bytes;
-
-  return FFI_OK;
-}
-
-ffi_status FFI_HIDDEN
-ffi_prep_cif_sysv (ffi_cif *cif)
-{
-  if ((cif->abi & FFI_SYSV) == 0)
-    {
-      /* This call is from old code.  Translate to new ABI values.  */
-      cif->flags |= FLAG_COMPAT;
-      switch (cif->abi)
-	{
-	default:
-	  return FFI_BAD_ABI;
-
-	case FFI_COMPAT_SYSV:
-	  cif->abi = FFI_SYSV | FFI_SYSV_STRUCT_RET | FFI_SYSV_LONG_DOUBLE_128;
-	  break;
-
-	case FFI_COMPAT_GCC_SYSV:
-	  cif->abi = FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128;
-	  break;
-
-	case FFI_COMPAT_LINUX:
-	  cif->abi = (FFI_SYSV | FFI_SYSV_IBM_LONG_DOUBLE
-		      | FFI_SYSV_LONG_DOUBLE_128);
-	  break;
-
-	case FFI_COMPAT_LINUX_SOFT_FLOAT:
-	  cif->abi = (FFI_SYSV | FFI_SYSV_SOFT_FLOAT | FFI_SYSV_IBM_LONG_DOUBLE
-		      | FFI_SYSV_LONG_DOUBLE_128);
-	  break;
-	}
-    }
-  return ffi_prep_cif_sysv_core (cif);
-}
-
-/* ffi_prep_args_SYSV is called by the assembly routine once stack space
-   has been allocated for the function's arguments.
-
-   The stack layout we want looks like this:
-
-   |   Return address from ffi_call_SYSV 4bytes	|	higher addresses
-   |--------------------------------------------|
-   |   Previous backchain pointer	4	|       stack pointer here
-   |--------------------------------------------|<+ <<<	on entry to
-   |   Saved r28-r31			4*4	| |	ffi_call_SYSV
-   |--------------------------------------------| |
-   |   GPR registers r3-r10		8*4	| |	ffi_call_SYSV
-   |--------------------------------------------| |
-   |   FPR registers f1-f8 (optional)	8*8	| |
-   |--------------------------------------------| |	stack	|
-   |   Space for copied structures		| |	grows	|
-   |--------------------------------------------| |	down    V
-   |   Parameters that didn't fit in registers  | |
-   |--------------------------------------------| |	lower addresses
-   |   Space for callee's LR		4	| |
-   |--------------------------------------------| |	stack pointer here
-   |   Current backchain pointer	4	|-/	during
-   |--------------------------------------------|   <<<	ffi_call_SYSV
-
-*/
-
-void FFI_HIDDEN
-ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
-{
-  const unsigned bytes = ecif->cif->bytes;
-  const unsigned flags = ecif->cif->flags;
-
-  typedef union
-  {
-    char *c;
-    unsigned *u;
-    long long *ll;
-    float *f;
-    double *d;
-  } valp;
-
-  /* 'stacktop' points at the previous backchain pointer.  */
-  valp stacktop;
-
-  /* 'gpr_base' points at the space for gpr3, and grows upwards as
-     we use GPR registers.  */
-  valp gpr_base;
-  int intarg_count;
-
-#ifndef __NO_FPRS__
-  /* 'fpr_base' points at the space for fpr1, and grows upwards as
-     we use FPR registers.  */
-  valp fpr_base;
-  int fparg_count;
-#endif
-
-  /* 'copy_space' grows down as we put structures in it.  It should
-     stay 16-byte aligned.  */
-  valp copy_space;
-
-  /* 'next_arg' grows up as we put parameters in it.  */
-  valp next_arg;
-
-  int i;
-  ffi_type **ptr;
-#ifndef __NO_FPRS__
-  double double_tmp;
-#endif
-  union
-  {
-    void **v;
-    char **c;
-    signed char **sc;
-    unsigned char **uc;
-    signed short **ss;
-    unsigned short **us;
-    unsigned int **ui;
-    long long **ll;
-    float **f;
-    double **d;
-  } p_argv;
-  size_t struct_copy_size;
-  unsigned gprvalue;
-
-  stacktop.c = (char *) stack + bytes;
-  gpr_base.u = stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS;
-  intarg_count = 0;
-#ifndef __NO_FPRS__
-  fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS;
-  fparg_count = 0;
-  copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c);
-#else
-  copy_space.c = gpr_base.c;
-#endif
-  next_arg.u = stack + 2;
-
-  /* Check that everything starts aligned properly.  */
-  FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0);
-  FFI_ASSERT (((unsigned long) copy_space.c & 0xF) == 0);
-  FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0);
-  FFI_ASSERT ((bytes & 0xF) == 0);
-  FFI_ASSERT (copy_space.c >= next_arg.c);
-
-  /* Deal with return values that are actually pass-by-reference.  */
-  if (flags & FLAG_RETVAL_REFERENCE)
-    {
-      *gpr_base.u++ = (unsigned long) (char *) ecif->rvalue;
-      intarg_count++;
-    }
-
-  /* Now for the arguments.  */
-  p_argv.v = ecif->avalue;
-  for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
-       i > 0;
-       i--, ptr++, p_argv.v++)
-    {
-      unsigned int typenum = (*ptr)->type;
-
-      typenum = translate_float (ecif->cif->abi, typenum);
-
-      /* Now test the translated value */
-      switch (typenum)
-	{
-#ifndef __NO_FPRS__
-# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-	case FFI_TYPE_LONGDOUBLE:
-	  double_tmp = (*p_argv.d)[0];
-
-	  if (fparg_count >= NUM_FPR_ARG_REGISTERS - 1)
-	    {
-	      if (intarg_count >= NUM_GPR_ARG_REGISTERS
-		  && intarg_count % 2 != 0)
-		{
-		  intarg_count++;
-		  next_arg.u++;
-		}
-	      *next_arg.d = double_tmp;
-	      next_arg.u += 2;
-	      double_tmp = (*p_argv.d)[1];
-	      *next_arg.d = double_tmp;
-	      next_arg.u += 2;
-	    }
-	  else
-	    {
-	      *fpr_base.d++ = double_tmp;
-	      double_tmp = (*p_argv.d)[1];
-	      *fpr_base.d++ = double_tmp;
-	    }
-
-	  fparg_count += 2;
-	  FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
-	  break;
-# endif
-	case FFI_TYPE_DOUBLE:
-	  double_tmp = **p_argv.d;
-
-	  if (fparg_count >= NUM_FPR_ARG_REGISTERS)
-	    {
-	      if (intarg_count >= NUM_GPR_ARG_REGISTERS
-		  && intarg_count % 2 != 0)
-		{
-		  intarg_count++;
-		  next_arg.u++;
-		}
-	      *next_arg.d = double_tmp;
-	      next_arg.u += 2;
-	    }
-	  else
-	    *fpr_base.d++ = double_tmp;
-	  fparg_count++;
-	  FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
-	  break;
-
-	case FFI_TYPE_FLOAT:
-	  double_tmp = **p_argv.f;
-	  if (fparg_count >= NUM_FPR_ARG_REGISTERS)
-	    {
-	      *next_arg.f = (float) double_tmp;
-	      next_arg.u += 1;
-	      intarg_count++;
-	    }
-	  else
-	    *fpr_base.d++ = double_tmp;
-	  fparg_count++;
-	  FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
-	  break;
-#endif /* have FPRs */
-
-	case FFI_TYPE_UINT128:
-	  /* The soft float ABI for long doubles works like this, a long double
-	     is passed in four consecutive GPRs if available.  A maximum of 2
-	     long doubles can be passed in gprs.  If we do not have 4 GPRs
-	     left, the long double is passed on the stack, 4-byte aligned.  */
-	  {
-	    unsigned int int_tmp;
-	    unsigned int ii;
-	    if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3)
-	      {
-		if (intarg_count < NUM_GPR_ARG_REGISTERS)
-		  intarg_count = NUM_GPR_ARG_REGISTERS;
-		for (ii = 0; ii < 4; ii++)
-		  {
-		    int_tmp = (*p_argv.ui)[ii];
-		    *next_arg.u++ = int_tmp;
-		  }
-	      }
-	    else
-	      {
-		for (ii = 0; ii < 4; ii++)
-		  {
-		    int_tmp = (*p_argv.ui)[ii];
-		    *gpr_base.u++ = int_tmp;
-		  }
-	      }
-	    intarg_count += 4;
-	    break;
-	  }
-
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	  if (intarg_count == NUM_GPR_ARG_REGISTERS-1)
-	    intarg_count++;
-	  if (intarg_count >= NUM_GPR_ARG_REGISTERS)
-	    {
-	      if (intarg_count % 2 != 0)
-		{
-		  intarg_count++;
-		  next_arg.u++;
-		}
-	      *next_arg.ll = **p_argv.ll;
-	      next_arg.u += 2;
-	    }
-	  else
-	    {
-	      /* The abi states only certain register pairs can be
-		 used for passing long long int specifically (r3,r4),
-		 (r5,r6), (r7,r8), (r9,r10).  If next arg is long long
-		 but not correct starting register of pair then skip
-		 until the proper starting register.  */
-	      if (intarg_count % 2 != 0)
-		{
-		  intarg_count ++;
-		  gpr_base.u++;
-		}
-	      *gpr_base.ll++ = **p_argv.ll;
-	    }
-	  intarg_count += 2;
-	  break;
-
-	case FFI_TYPE_STRUCT:
-	  struct_copy_size = ((*ptr)->size + 15) & ~0xF;
-	  copy_space.c -= struct_copy_size;
-	  memcpy (copy_space.c, *p_argv.c, (*ptr)->size);
-
-	  gprvalue = (unsigned long) copy_space.c;
-
-	  FFI_ASSERT (copy_space.c > next_arg.c);
-	  FFI_ASSERT (flags & FLAG_ARG_NEEDS_COPY);
-	  goto putgpr;
-
-	case FFI_TYPE_UINT8:
-	  gprvalue = **p_argv.uc;
-	  goto putgpr;
-	case FFI_TYPE_SINT8:
-	  gprvalue = **p_argv.sc;
-	  goto putgpr;
-	case FFI_TYPE_UINT16:
-	  gprvalue = **p_argv.us;
-	  goto putgpr;
-	case FFI_TYPE_SINT16:
-	  gprvalue = **p_argv.ss;
-	  goto putgpr;
-
-	case FFI_TYPE_INT:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_POINTER:
-
-	  gprvalue = **p_argv.ui;
-
-	putgpr:
-	  if (intarg_count >= NUM_GPR_ARG_REGISTERS)
-	    *next_arg.u++ = gprvalue;
-	  else
-	    *gpr_base.u++ = gprvalue;
-	  intarg_count++;
-	  break;
-	}
-    }
-
-  /* Check that we didn't overrun the stack...  */
-  FFI_ASSERT (copy_space.c >= next_arg.c);
-  FFI_ASSERT (gpr_base.u <= stacktop.u - ASM_NEEDS_REGISTERS);
-  /* The assert below is testing that the number of integer arguments agrees
-     with the number found in ffi_prep_cif_machdep().  However, intarg_count
-     is incremented whenever we place an FP arg on the stack, so account for
-     that before our assert test.  */
-#ifndef __NO_FPRS__
-  if (fparg_count > NUM_FPR_ARG_REGISTERS)
-    intarg_count -= fparg_count - NUM_FPR_ARG_REGISTERS;
-  FFI_ASSERT (fpr_base.u
-	      <= stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS);
-#endif
-  FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4);
-}
-
-#define MIN_CACHE_LINE_SIZE 8
-
-static void
-flush_icache (char *wraddr, char *xaddr, int size)
-{
-  int i;
-  for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE)
-    __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;"
-		      : : "r" (xaddr + i), "r" (wraddr + i) : "memory");
-  __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;"
-		    : : "r"(xaddr + size - 1), "r"(wraddr + size - 1)
-		    : "memory");
-}
-
-ffi_status FFI_HIDDEN
-ffi_prep_closure_loc_sysv (ffi_closure *closure,
-			   ffi_cif *cif,
-			   void (*fun) (ffi_cif *, void *, void **, void *),
-			   void *user_data,
-			   void *codeloc)
-{
-  unsigned int *tramp;
-
-  if (cif->abi < FFI_SYSV || cif->abi >= FFI_LAST_ABI)
-    return FFI_BAD_ABI;
-
-  tramp = (unsigned int *) &closure->tramp[0];
-  tramp[0] = 0x7c0802a6;  /*   mflr    r0 */
-  tramp[1] = 0x429f0005;  /*   bcl     20,31,.+4 */
-  tramp[2] = 0x7d6802a6;  /*   mflr    r11 */
-  tramp[3] = 0x7c0803a6;  /*   mtlr    r0 */
-  tramp[4] = 0x800b0018;  /*   lwz     r0,24(r11) */
-  tramp[5] = 0x816b001c;  /*   lwz     r11,28(r11) */
-  tramp[6] = 0x7c0903a6;  /*   mtctr   r0 */
-  tramp[7] = 0x4e800420;  /*   bctr */
-  *(void **) &tramp[8] = (void *) ffi_closure_SYSV; /* function */
-  *(void **) &tramp[9] = codeloc;                   /* context */
-
-  /* Flush the icache.  */
-  flush_icache ((char *)tramp, (char *)codeloc, 8 * 4);
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  return FFI_OK;
-}
-
-/* Basically the trampoline invokes ffi_closure_SYSV, and on
-   entry, r11 holds the address of the closure.
-   After storing the registers that could possibly contain
-   parameters to be passed into the stack frame and setting
-   up space for a return value, ffi_closure_SYSV invokes the
-   following helper function to do most of the work.  */
-
-int
-ffi_closure_helper_SYSV (ffi_cif *cif,
-			 void (*fun) (ffi_cif *, void *, void **, void *),
-			 void *user_data,
-			 void *rvalue,
-			 unsigned long *pgr,
-			 ffi_dblfl *pfr,
-			 unsigned long *pst)
-{
-  /* rvalue is the pointer to space for return value in closure assembly */
-  /* pgr is the pointer to where r3-r10 are stored in ffi_closure_SYSV */
-  /* pfr is the pointer to where f1-f8 are stored in ffi_closure_SYSV  */
-  /* pst is the pointer to outgoing parameter stack in original caller */
-
-  void **          avalue;
-  ffi_type **      arg_types;
-  long             i, avn;
-#ifndef __NO_FPRS__
-  long             nf = 0;   /* number of floating registers already used */
-#endif
-  long             ng = 0;   /* number of general registers already used */
-
-  unsigned       size     = cif->rtype->size;
-  unsigned short rtypenum = cif->rtype->type;
-
-  avalue = alloca (cif->nargs * sizeof (void *));
-
-  /* First translate for softfloat/nonlinux */
-  rtypenum = translate_float (cif->abi, rtypenum);
-
-  /* Copy the caller's structure return value address so that the closure
-     returns the data directly to the caller.
-     For FFI_SYSV the result is passed in r3/r4 if the struct size is less
-     or equal 8 bytes.  */
-  if (rtypenum == FFI_TYPE_STRUCT
-      && !((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8))
-    {
-      rvalue = (void *) *pgr;
-      ng++;
-      pgr++;
-    }
-
-  i = 0;
-  avn = cif->nargs;
-  arg_types = cif->arg_types;
-
-  /* Grab the addresses of the arguments from the stack frame.  */
-  while (i < avn) {
-    unsigned short typenum = arg_types[i]->type;
-
-    /* We may need to handle some values depending on ABI.  */
-    typenum = translate_float (cif->abi, typenum);
-
-    switch (typenum)
-      {
-#ifndef __NO_FPRS__
-      case FFI_TYPE_FLOAT:
-	/* Unfortunately float values are stored as doubles
-	   in the ffi_closure_SYSV code (since we don't check
-	   the type in that routine).  */
-	if (nf < NUM_FPR_ARG_REGISTERS)
-	  {
-	    /* FIXME? here we are really changing the values
-	       stored in the original calling routines outgoing
-	       parameter stack.  This is probably a really
-	       naughty thing to do but...  */
-	    double temp = pfr->d;
-	    pfr->f = (float) temp;
-	    avalue[i] = pfr;
-	    nf++;
-	    pfr++;
-	  }
-	else
-	  {
-	    avalue[i] = pst;
-	    pst += 1;
-	  }
-	break;
-
-      case FFI_TYPE_DOUBLE:
-	if (nf < NUM_FPR_ARG_REGISTERS)
-	  {
-	    avalue[i] = pfr;
-	    nf++;
-	    pfr++;
-	  }
-	else
-	  {
-	    if (((long) pst) & 4)
-	      pst++;
-	    avalue[i] = pst;
-	    pst += 2;
-	  }
-	break;
-
-# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-      case FFI_TYPE_LONGDOUBLE:
-	if (nf < NUM_FPR_ARG_REGISTERS - 1)
-	  {
-	    avalue[i] = pfr;
-	    pfr += 2;
-	    nf += 2;
-	  }
-	else
-	  {
-	    if (((long) pst) & 4)
-	      pst++;
-	    avalue[i] = pst;
-	    pst += 4;
-	    nf = 8;
-	  }
-	break;
-# endif
-#endif
-
-      case FFI_TYPE_UINT128:
-	/* Test if for the whole long double, 4 gprs are available.
-	   otherwise the stuff ends up on the stack.  */
-	if (ng < NUM_GPR_ARG_REGISTERS - 3)
-	  {
-	    avalue[i] = pgr;
-	    pgr += 4;
-	    ng += 4;
-	  }
-	else
-	  {
-	    avalue[i] = pst;
-	    pst += 4;
-	    ng = 8+4;
-	  }
-	break;
-
-      case FFI_TYPE_SINT8:
-      case FFI_TYPE_UINT8:
-#ifndef __LITTLE_ENDIAN__
-	if (ng < NUM_GPR_ARG_REGISTERS)
-	  {
-	    avalue[i] = (char *) pgr + 3;
-	    ng++;
-	    pgr++;
-	  }
-	else
-	  {
-	    avalue[i] = (char *) pst + 3;
-	    pst++;
-	  }
-	break;
-#endif
-
-      case FFI_TYPE_SINT16:
-      case FFI_TYPE_UINT16:
-#ifndef __LITTLE_ENDIAN__
-	if (ng < NUM_GPR_ARG_REGISTERS)
-	  {
-	    avalue[i] = (char *) pgr + 2;
-	    ng++;
-	    pgr++;
-	  }
-	else
-	  {
-	    avalue[i] = (char *) pst + 2;
-	    pst++;
-	  }
-	break;
-#endif
-
-      case FFI_TYPE_SINT32:
-      case FFI_TYPE_UINT32:
-      case FFI_TYPE_POINTER:
-	if (ng < NUM_GPR_ARG_REGISTERS)
-	  {
-	    avalue[i] = pgr;
-	    ng++;
-	    pgr++;
-	  }
-	else
-	  {
-	    avalue[i] = pst;
-	    pst++;
-	  }
-	break;
-
-      case FFI_TYPE_STRUCT:
-	/* Structs are passed by reference. The address will appear in a
-	   gpr if it is one of the first 8 arguments.  */
-	if (ng < NUM_GPR_ARG_REGISTERS)
-	  {
-	    avalue[i] = (void *) *pgr;
-	    ng++;
-	    pgr++;
-	  }
-	else
-	  {
-	    avalue[i] = (void *) *pst;
-	    pst++;
-	  }
-	break;
-
-      case FFI_TYPE_SINT64:
-      case FFI_TYPE_UINT64:
-	/* Passing long long ints are complex, they must
-	   be passed in suitable register pairs such as
-	   (r3,r4) or (r5,r6) or (r6,r7), or (r7,r8) or (r9,r10)
-	   and if the entire pair aren't available then the outgoing
-	   parameter stack is used for both but an alignment of 8
-	   must will be kept.  So we must either look in pgr
-	   or pst to find the correct address for this type
-	   of parameter.  */
-	if (ng < NUM_GPR_ARG_REGISTERS - 1)
-	  {
-	    if (ng & 1)
-	      {
-		/* skip r4, r6, r8 as starting points */
-		ng++;
-		pgr++;
-	      }
-	    avalue[i] = pgr;
-	    ng += 2;
-	    pgr += 2;
-	  }
-	else
-	  {
-	    if (((long) pst) & 4)
-	      pst++;
-	    avalue[i] = pst;
-	    pst += 2;
-	    ng = NUM_GPR_ARG_REGISTERS;
-	  }
-	break;
-
-      default:
-	FFI_ASSERT (0);
-      }
-
-    i++;
-  }
-
-  (*fun) (cif, rvalue, avalue, user_data);
-
-  /* Tell ffi_closure_SYSV how to perform return type promotions.
-     Because the FFI_SYSV ABI returns the structures <= 8 bytes in
-     r3/r4 we have to tell ffi_closure_SYSV how to treat them.  We
-     combine the base type FFI_SYSV_TYPE_SMALL_STRUCT with the size of
-     the struct less one.  We never have a struct with size zero.
-     See the comment in ffitarget.h about ordering.  */
-  if (rtypenum == FFI_TYPE_STRUCT
-      && (cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8)
-    return FFI_SYSV_TYPE_SMALL_STRUCT - 1 + size;
-  return rtypenum;
-}
-#endif
diff --git a/third_party/gofrontend/libffi/src/powerpc/ffitarget.h b/third_party/gofrontend/libffi/src/powerpc/ffitarget.h
deleted file mode 100644
index 0f66d31..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/ffitarget.h
+++ /dev/null
@@ -1,195 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc
-                 Copyright (c) 1996-2003  Red Hat, Inc.
-
-   Target configuration macros for PowerPC.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-/* ---- System specific configurations ----------------------------------- */
-
-#if defined (POWERPC) && defined (__powerpc64__)	/* linux64 */
-#ifndef POWERPC64
-#define POWERPC64
-#endif
-#elif defined (POWERPC_DARWIN) && defined (__ppc64__)	/* Darwin64 */
-#ifndef POWERPC64
-#define POWERPC64
-#endif
-#ifndef POWERPC_DARWIN64
-#define POWERPC_DARWIN64
-#endif
-#elif defined (POWERPC_AIX) && defined (__64BIT__)	/* AIX64 */
-#ifndef POWERPC64
-#define POWERPC64
-#endif
-#endif
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-
-#if defined (POWERPC_AIX)
-  FFI_AIX,
-  FFI_DARWIN,
-  FFI_DEFAULT_ABI = FFI_AIX,
-  FFI_LAST_ABI
-
-#elif defined (POWERPC_DARWIN)
-  FFI_AIX,
-  FFI_DARWIN,
-  FFI_DEFAULT_ABI = FFI_DARWIN,
-  FFI_LAST_ABI
-
-#else
-  /* The FFI_COMPAT values are used by old code.  Since libffi may be
-     a shared library we have to support old values for backwards
-     compatibility.  */
-  FFI_COMPAT_SYSV,
-  FFI_COMPAT_GCC_SYSV,
-  FFI_COMPAT_LINUX64,
-  FFI_COMPAT_LINUX,
-  FFI_COMPAT_LINUX_SOFT_FLOAT,
-
-# if defined (POWERPC64)
-  /* This bit, always set in new code, must not be set in any of the
-     old FFI_COMPAT values that might be used for 64-bit linux.  We
-     only need worry about FFI_COMPAT_LINUX64, but to be safe avoid
-     all old values.  */
-  FFI_LINUX = 8,
-  /* This and following bits can reuse FFI_COMPAT values.  */
-  FFI_LINUX_STRUCT_ALIGN = 1,
-  FFI_LINUX_LONG_DOUBLE_128 = 2,
-  FFI_DEFAULT_ABI = (FFI_LINUX
-#  ifdef __STRUCT_PARM_ALIGN__
-		     | FFI_LINUX_STRUCT_ALIGN
-#  endif
-#  ifdef __LONG_DOUBLE_128__
-		     | FFI_LINUX_LONG_DOUBLE_128
-#  endif
-		     ),
-  FFI_LAST_ABI = 12
-
-# else
-  /* This bit, always set in new code, must not be set in any of the
-     old FFI_COMPAT values that might be used for 32-bit linux/sysv/bsd.  */
-  FFI_SYSV = 8,
-  /* This and following bits can reuse FFI_COMPAT values.  */
-  FFI_SYSV_SOFT_FLOAT = 1,
-  FFI_SYSV_STRUCT_RET = 2,
-  FFI_SYSV_IBM_LONG_DOUBLE = 4,
-  FFI_SYSV_LONG_DOUBLE_128 = 16,
-
-  FFI_DEFAULT_ABI = (FFI_SYSV
-#  ifdef __NO_FPRS__
-		     | FFI_SYSV_SOFT_FLOAT
-#  endif
-#  if (defined (__SVR4_STRUCT_RETURN)					\
-       || defined (POWERPC_FREEBSD) && !defined (__AIX_STRUCT_RETURN))
-		     | FFI_SYSV_STRUCT_RET
-#  endif
-#  if __LDBL_MANT_DIG__ == 106
-		     | FFI_SYSV_IBM_LONG_DOUBLE
-#  endif
-#  ifdef __LONG_DOUBLE_128__
-		     | FFI_SYSV_LONG_DOUBLE_128
-#  endif
-		     ),
-  FFI_LAST_ABI = 32
-# endif
-#endif
-
-} ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_NATIVE_RAW_API 0
-#if defined (POWERPC) || defined (POWERPC_FREEBSD)
-# define FFI_GO_CLOSURES 1
-# define FFI_TARGET_SPECIFIC_VARIADIC 1
-# define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs
-#endif
-
-/* ppc_closure.S and linux64_closure.S expect this.  */
-#define FFI_PPC_TYPE_LAST FFI_TYPE_POINTER
-
-/* We define additional types below.  If generic types are added that
-   must be supported by powerpc libffi then it is likely that
-   FFI_PPC_TYPE_LAST needs increasing *and* the jump tables in
-   ppc_closure.S and linux64_closure.S be extended.  */
-
-#if !(FFI_TYPE_LAST == FFI_PPC_TYPE_LAST		\
-      || (FFI_TYPE_LAST == FFI_TYPE_COMPLEX		\
-	  && !defined FFI_TARGET_HAS_COMPLEX_TYPE))
-# error "You likely have a broken powerpc libffi"
-#endif
-
-/* Needed for soft-float long-double-128 support.  */
-#define FFI_TYPE_UINT128 (FFI_PPC_TYPE_LAST + 1)
-
-/* Needed for FFI_SYSV small structure returns.  */
-#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 2)
-
-/* Used by ELFv2 for homogenous structure returns.  */
-#define FFI_V2_TYPE_FLOAT_HOMOG		(FFI_PPC_TYPE_LAST + 1)
-#define FFI_V2_TYPE_DOUBLE_HOMOG	(FFI_PPC_TYPE_LAST + 2)
-#define FFI_V2_TYPE_SMALL_STRUCT	(FFI_PPC_TYPE_LAST + 3)
-
-#if _CALL_ELF == 2
-# define FFI_TRAMPOLINE_SIZE 32
-#else
-# if defined(POWERPC64) || defined(POWERPC_AIX)
-#  if defined(POWERPC_DARWIN64)
-#    define FFI_TRAMPOLINE_SIZE 48
-#  else
-#    define FFI_TRAMPOLINE_SIZE 24
-#  endif
-# else /* POWERPC || POWERPC_AIX */
-#  define FFI_TRAMPOLINE_SIZE 40
-# endif
-#endif
-
-#ifndef LIBFFI_ASM
-#if defined(POWERPC_DARWIN) || defined(POWERPC_AIX)
-struct ffi_aix_trampoline_struct {
-    void * code_pointer;	/* Pointer to ffi_closure_ASM */
-    void * toc;			/* TOC */
-    void * static_chain;	/* Pointer to closure */
-};
-#endif
-#endif
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/powerpc/linux64.S b/third_party/gofrontend/libffi/src/powerpc/linux64.S
deleted file mode 100644
index b2ae60e..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/linux64.S
+++ /dev/null
@@ -1,228 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.h - Copyright (c) 2003 Jakub Jelinek <jakub@redhat.com>
-	    Copyright (c) 2008 Red Hat, Inc.
-
-   PowerPC64 Assembly glue.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-
-#ifdef POWERPC64
-	.hidden	ffi_call_LINUX64
-	.globl	ffi_call_LINUX64
-	.text
-	.cfi_startproc
-# if _CALL_ELF == 2
-ffi_call_LINUX64:
-	addis	%r2, %r12, .TOC.-ffi_call_LINUX64@ha
-	addi	%r2, %r2, .TOC.-ffi_call_LINUX64@l
-	.localentry ffi_call_LINUX64, . - ffi_call_LINUX64
-# else
-	.section	".opd","aw"
-	.align	3
-ffi_call_LINUX64:
-#  ifdef _CALL_LINUX
-	.quad	.L.ffi_call_LINUX64,.TOC.@tocbase,0
-	.type	ffi_call_LINUX64,@function
-	.text
-.L.ffi_call_LINUX64:
-#  else
-	.hidden	.ffi_call_LINUX64
-	.globl	.ffi_call_LINUX64
-	.quad	.ffi_call_LINUX64,.TOC.@tocbase,0
-	.size	ffi_call_LINUX64,24
-	.type	.ffi_call_LINUX64,@function
-	.text
-.ffi_call_LINUX64:
-#  endif
-# endif
-	mflr	%r0
-	std	%r28, -32(%r1)
-	std	%r29, -24(%r1)
-	std	%r30, -16(%r1)
-	std	%r31, -8(%r1)
-	std	%r7, 8(%r1)	/* closure, saved in cr field.  */
-	std	%r0, 16(%r1)
-
-	mr	%r28, %r1	/* our AP.  */
-	.cfi_def_cfa_register 28
-	.cfi_offset 65, 16
-	.cfi_offset 31, -8
-	.cfi_offset 30, -16
-	.cfi_offset 29, -24
-	.cfi_offset 28, -32
-
-	stdux	%r1, %r1, %r8
-	mr	%r31, %r6	/* flags, */
-	mr	%r30, %r5	/* rvalue, */
-	mr	%r29, %r4	/* function address.  */
-/* Save toc pointer, not for the ffi_prep_args64 call, but for the later
-   bctrl function call.  */
-# if _CALL_ELF == 2
-	std	%r2, 24(%r1)
-# else
-	std	%r2, 40(%r1)
-# endif
-
-	/* Call ffi_prep_args64.  */
-	mr	%r4, %r1
-# if defined _CALL_LINUX || _CALL_ELF == 2
-	bl	ffi_prep_args64
-# else
-	bl	.ffi_prep_args64
-# endif
-
-# if _CALL_ELF == 2
-	mr	%r12, %r29
-# else
-	ld	%r12, 0(%r29)
-	ld	%r2, 8(%r29)
-# endif
-	/* Now do the call.  */
-	/* Set up cr1 with bits 4-7 of the flags.  */
-	mtcrf	0x40, %r31
-
-	/* Get the address to call into CTR.  */
-	mtctr	%r12
-	/* Load all those argument registers.  */
-	ld	%r3, -32-(8*8)(%r28)
-	ld	%r4, -32-(7*8)(%r28)
-	ld	%r5, -32-(6*8)(%r28)
-	ld	%r6, -32-(5*8)(%r28)
-	bf-	5, 1f
-	ld	%r7, -32-(4*8)(%r28)
-	ld	%r8, -32-(3*8)(%r28)
-	ld	%r9, -32-(2*8)(%r28)
-	ld	%r10, -32-(1*8)(%r28)
-1:
-
-	/* Load all the FP registers.  */
-	bf-	6, 2f
-	lfd	%f1, -32-(21*8)(%r28)
-	lfd	%f2, -32-(20*8)(%r28)
-	lfd	%f3, -32-(19*8)(%r28)
-	lfd	%f4, -32-(18*8)(%r28)
-	lfd	%f5, -32-(17*8)(%r28)
-	lfd	%f6, -32-(16*8)(%r28)
-	lfd	%f7, -32-(15*8)(%r28)
-	lfd	%f8, -32-(14*8)(%r28)
-	lfd	%f9, -32-(13*8)(%r28)
-	lfd	%f10, -32-(12*8)(%r28)
-	lfd	%f11, -32-(11*8)(%r28)
-	lfd	%f12, -32-(10*8)(%r28)
-	lfd	%f13, -32-(9*8)(%r28)
-2:
-
-	/* Make the call.  */
-	ld	%r11, 8(%r28)
-	bctrl
-
-	/* This must follow the call immediately, the unwinder
-	   uses this to find out if r2 has been saved or not.  */
-# if _CALL_ELF == 2
-	ld	%r2, 24(%r1)
-# else
-	ld	%r2, 40(%r1)
-# endif
-
-	/* Now, deal with the return value.  */
-	mtcrf	0x01, %r31
-	bt	31, .Lstruct_return_value
-	bt	30, .Ldone_return_value
-	bt	29, .Lfp_return_value
-	std	%r3, 0(%r30)
-	/* Fall through...  */
-
-.Ldone_return_value:
-	/* Restore the registers we used and return.  */
-	mr	%r1, %r28
-	.cfi_def_cfa_register 1
-	ld	%r0, 16(%r28)
-	ld	%r28, -32(%r28)
-	mtlr	%r0
-	ld	%r29, -24(%r1)
-	ld	%r30, -16(%r1)
-	ld	%r31, -8(%r1)
-	blr
-
-.Lfp_return_value:
-	.cfi_def_cfa_register 28
-	bf	28, .Lfloat_return_value
-	stfd	%f1, 0(%r30)
-	mtcrf	0x02, %r31 /* cr6  */
-	bf	27, .Ldone_return_value
-	stfd	%f2, 8(%r30)
-	b	.Ldone_return_value
-.Lfloat_return_value:
-	stfs	%f1, 0(%r30)
-	b	.Ldone_return_value
-
-.Lstruct_return_value:
-	bf	29, .Lsmall_struct
-	bf	28, .Lfloat_homog_return_value
-	stfd	%f1, 0(%r30)
-	stfd	%f2, 8(%r30)
-	stfd	%f3, 16(%r30)
-	stfd	%f4, 24(%r30)
-	stfd	%f5, 32(%r30)
-	stfd	%f6, 40(%r30)
-	stfd	%f7, 48(%r30)
-	stfd	%f8, 56(%r30)
-	b	.Ldone_return_value
-
-.Lfloat_homog_return_value:
-	stfs	%f1, 0(%r30)
-	stfs	%f2, 4(%r30)
-	stfs	%f3, 8(%r30)
-	stfs	%f4, 12(%r30)
-	stfs	%f5, 16(%r30)
-	stfs	%f6, 20(%r30)
-	stfs	%f7, 24(%r30)
-	stfs	%f8, 28(%r30)
-	b	.Ldone_return_value
-
-.Lsmall_struct:
-	std	%r3, 0(%r30)
-	std	%r4, 8(%r30)
-	b	.Ldone_return_value
-
-	.cfi_endproc
-# if _CALL_ELF == 2
-	.size	ffi_call_LINUX64,.-ffi_call_LINUX64
-# else
-#  ifdef _CALL_LINUX
-	.size	ffi_call_LINUX64,.-.L.ffi_call_LINUX64
-#  else
-	.long	0
-	.byte	0,12,0,1,128,4,0,0
-	.size	.ffi_call_LINUX64,.-.ffi_call_LINUX64
-#  endif
-# endif
-
-#endif
-
-#if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2
-	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/third_party/gofrontend/libffi/src/powerpc/linux64_closure.S b/third_party/gofrontend/libffi/src/powerpc/linux64_closure.S
deleted file mode 100644
index 6487d2a..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/linux64_closure.S
+++ /dev/null
@@ -1,488 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.h - Copyright (c) 2003 Jakub Jelinek <jakub@redhat.com>
-	    Copyright (c) 2008 Red Hat, Inc.
-
-   PowerPC64 Assembly glue.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-
-	.file	"linux64_closure.S"
-
-#ifdef POWERPC64
-	FFI_HIDDEN (ffi_closure_LINUX64)
-	.globl  ffi_closure_LINUX64
-	.text
-	.cfi_startproc
-# if _CALL_ELF == 2
-ffi_closure_LINUX64:
-	addis	%r2, %r12, .TOC.-ffi_closure_LINUX64@ha
-	addi	%r2, %r2, .TOC.-ffi_closure_LINUX64@l
-	.localentry ffi_closure_LINUX64, . - ffi_closure_LINUX64
-# else
-	.section        ".opd","aw"
-	.align  3
-ffi_closure_LINUX64:
-#  ifdef _CALL_LINUX
-	.quad   .L.ffi_closure_LINUX64,.TOC.@tocbase,0
-	.type   ffi_closure_LINUX64,@function
-	.text
-.L.ffi_closure_LINUX64:
-#  else
-	FFI_HIDDEN (.ffi_closure_LINUX64)
-	.globl  .ffi_closure_LINUX64
-	.quad   .ffi_closure_LINUX64,.TOC.@tocbase,0
-	.size   ffi_closure_LINUX64,24
-	.type   .ffi_closure_LINUX64,@function
-	.text
-.ffi_closure_LINUX64:
-#  endif
-# endif
-
-# if _CALL_ELF == 2
-#  32 byte special reg save area + 64 byte parm save area
-#  + 64 byte retval area + 13*8 fpr save area + round to 16
-#  define STACKFRAME 272
-#  define PARMSAVE 32
-#  define RETVAL PARMSAVE+64
-# else
-#  48 bytes special reg save area + 64 bytes parm save area
-#  + 16 bytes retval area + 13*8 bytes fpr save area + round to 16
-#  define STACKFRAME 240
-#  define PARMSAVE 48
-#  define RETVAL PARMSAVE+64
-# endif
-
-# if _CALL_ELF == 2
-	ld	%r12, FFI_TRAMPOLINE_SIZE(%r11)		# closure->cif
-	mflr	%r0
-	lwz	%r12, 28(%r12)				# cif->flags
-	mtcrf	0x40, %r12
-	addi	%r12, %r1, PARMSAVE
-	bt	7, 0f
-	# Our caller has not allocated a parameter save area.
-	# We need to allocate one here and use it to pass gprs to
-	# ffi_closure_helper_LINUX64.
-	addi	%r12, %r1, -STACKFRAME+PARMSAVE
-0:
-	# Save general regs into parm save area
-	std	%r3, 0(%r12)
-	std	%r4, 8(%r12)
-	std	%r5, 16(%r12)
-	std	%r6, 24(%r12)
-	std	%r7, 32(%r12)
-	std	%r8, 40(%r12)
-	std	%r9, 48(%r12)
-	std	%r10, 56(%r12)
-
-	# load up the pointer to the parm save area
-	mr	%r7, %r12
-# else
-	# copy r2 to r11 and load TOC into r2
-	mr	%r11, %r2
-	ld	%r2, 16(%r2)
-
-	mflr	%r0
-	# Save general regs into parm save area
-	# This is the parameter save area set up by our caller.
-	std	%r3, PARMSAVE+0(%r1)
-	std	%r4, PARMSAVE+8(%r1)
-	std	%r5, PARMSAVE+16(%r1)
-	std	%r6, PARMSAVE+24(%r1)
-	std	%r7, PARMSAVE+32(%r1)
-	std	%r8, PARMSAVE+40(%r1)
-	std	%r9, PARMSAVE+48(%r1)
-	std	%r10, PARMSAVE+56(%r1)
-
-	# load up the pointer to the parm save area
-	addi	%r7, %r1, PARMSAVE
-# endif
-	std	%r0, 16(%r1)
-
-	# closure->cif
-	ld	%r3, FFI_TRAMPOLINE_SIZE(%r11)
-	# closure->fun
-	ld	%r4, FFI_TRAMPOLINE_SIZE+8(%r11)
-	# closure->user_data
-	ld	%r5, FFI_TRAMPOLINE_SIZE+16(%r11)
-
-.Ldoclosure:
-	# next save fpr 1 to fpr 13
-	stfd	%f1, -104+(0*8)(%r1)
-	stfd	%f2, -104+(1*8)(%r1)
-	stfd	%f3, -104+(2*8)(%r1)
-	stfd	%f4, -104+(3*8)(%r1)
-	stfd	%f5, -104+(4*8)(%r1)
-	stfd	%f6, -104+(5*8)(%r1)
-	stfd	%f7, -104+(6*8)(%r1)
-	stfd	%f8, -104+(7*8)(%r1)
-	stfd	%f9, -104+(8*8)(%r1)
-	stfd	%f10, -104+(9*8)(%r1)
-	stfd	%f11, -104+(10*8)(%r1)
-	stfd	%f12, -104+(11*8)(%r1)
-	stfd	%f13, -104+(12*8)(%r1)
-
-	# load up the pointer to the saved fpr registers */
-	addi	%r8, %r1, -104
-
-	# load up the pointer to the result storage
-	addi	%r6, %r1, -STACKFRAME+RETVAL
-
-	stdu	%r1, -STACKFRAME(%r1)
-	.cfi_def_cfa_offset STACKFRAME
-	.cfi_offset 65, 16
-
-	# make the call
-# if defined _CALL_LINUX || _CALL_ELF == 2
-	bl ffi_closure_helper_LINUX64
-# else
-	bl .ffi_closure_helper_LINUX64
-# endif
-.Lret:
-
-	# now r3 contains the return type
-	# so use it to look up in a table
-	# so we know how to deal with each type
-
-	# look up the proper starting point in table
-	# by using return type as offset
-	ld %r0, STACKFRAME+16(%r1)
-	cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT
-	bge .Lsmall
-	mflr %r4		# move address of .Lret to r4
-	sldi %r3, %r3, 4	# now multiply return type by 16
-	addi %r4, %r4, .Lret_type0 - .Lret
-	add %r3, %r3, %r4	# add contents of table to table address
-	mtctr %r3
-	bctr			# jump to it
-
-# Each of the ret_typeX code fragments has to be exactly 16 bytes long
-# (4 instructions). For cache effectiveness we align to a 16 byte boundary
-# first.
-	.align 4
-
-.Lret_type0:
-# case FFI_TYPE_VOID
-	mtlr %r0
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-	nop
-# case FFI_TYPE_INT
-# ifdef __LITTLE_ENDIAN__
-	lwa %r3, RETVAL+0(%r1)
-# else
-	lwa %r3, RETVAL+4(%r1)
-# endif
-	mtlr %r0
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-# case FFI_TYPE_FLOAT
-	lfs %f1, RETVAL+0(%r1)
-	mtlr %r0
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-# case FFI_TYPE_DOUBLE
-	lfd %f1, RETVAL+0(%r1)
-	mtlr %r0
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-# case FFI_TYPE_LONGDOUBLE
-	lfd %f1, RETVAL+0(%r1)
-	mtlr %r0
-	lfd %f2, RETVAL+8(%r1)
-	b .Lfinish
-# case FFI_TYPE_UINT8
-# ifdef __LITTLE_ENDIAN__
-	lbz %r3, RETVAL+0(%r1)
-# else
-	lbz %r3, RETVAL+7(%r1)
-# endif
-	mtlr %r0
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-# case FFI_TYPE_SINT8
-# ifdef __LITTLE_ENDIAN__
-	lbz %r3, RETVAL+0(%r1)
-# else
-	lbz %r3, RETVAL+7(%r1)
-# endif
-	extsb %r3,%r3
-	mtlr %r0
-	b .Lfinish
-# case FFI_TYPE_UINT16
-# ifdef __LITTLE_ENDIAN__
-	lhz %r3, RETVAL+0(%r1)
-# else
-	lhz %r3, RETVAL+6(%r1)
-# endif
-	mtlr %r0
-.Lfinish:
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-# case FFI_TYPE_SINT16
-# ifdef __LITTLE_ENDIAN__
-	lha %r3, RETVAL+0(%r1)
-# else
-	lha %r3, RETVAL+6(%r1)
-# endif
-	mtlr %r0
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-# case FFI_TYPE_UINT32
-# ifdef __LITTLE_ENDIAN__
-	lwz %r3, RETVAL+0(%r1)
-# else
-	lwz %r3, RETVAL+4(%r1)
-# endif
-	mtlr %r0
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-# case FFI_TYPE_SINT32
-# ifdef __LITTLE_ENDIAN__
-	lwa %r3, RETVAL+0(%r1)
-# else
-	lwa %r3, RETVAL+4(%r1)
-# endif
-	mtlr %r0
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-# case FFI_TYPE_UINT64
-	ld %r3, RETVAL+0(%r1)
-	mtlr %r0
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-# case FFI_TYPE_SINT64
-	ld %r3, RETVAL+0(%r1)
-	mtlr %r0
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-# case FFI_TYPE_STRUCT
-	mtlr %r0
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-	nop
-# case FFI_TYPE_POINTER
-	ld %r3, RETVAL+0(%r1)
-	mtlr %r0
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-# case FFI_V2_TYPE_FLOAT_HOMOG
-	lfs %f1, RETVAL+0(%r1)
-	lfs %f2, RETVAL+4(%r1)
-	lfs %f3, RETVAL+8(%r1)
-	b .Lmorefloat
-# case FFI_V2_TYPE_DOUBLE_HOMOG
-	lfd %f1, RETVAL+0(%r1)
-	lfd %f2, RETVAL+8(%r1)
-	lfd %f3, RETVAL+16(%r1)
-	lfd %f4, RETVAL+24(%r1)
-	mtlr %r0
-	lfd %f5, RETVAL+32(%r1)
-	lfd %f6, RETVAL+40(%r1)
-	lfd %f7, RETVAL+48(%r1)
-	lfd %f8, RETVAL+56(%r1)
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-.Lmorefloat:
-	lfs %f4, RETVAL+12(%r1)
-	mtlr %r0
-	lfs %f5, RETVAL+16(%r1)
-	lfs %f6, RETVAL+20(%r1)
-	lfs %f7, RETVAL+24(%r1)
-	lfs %f8, RETVAL+28(%r1)
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-.Lsmall:
-# ifdef __LITTLE_ENDIAN__
-	ld %r3,RETVAL+0(%r1)
-	mtlr %r0
-	ld %r4,RETVAL+8(%r1)
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-# else
-	# A struct smaller than a dword is returned in the low bits of r3
-	# ie. right justified.  Larger structs are passed left justified
-	# in r3 and r4.  The return value area on the stack will have
-	# the structs as they are usually stored in memory.
-	cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT + 7 # size 8 bytes?
-	neg %r5, %r3
-	ld %r3,RETVAL+0(%r1)
-	blt .Lsmalldown
-	mtlr %r0
-	ld %r4,RETVAL+8(%r1)
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset STACKFRAME
-.Lsmalldown:
-	addi %r5, %r5, FFI_V2_TYPE_SMALL_STRUCT + 7
-	mtlr %r0
-	sldi %r5, %r5, 3
-	addi %r1, %r1, STACKFRAME
-	.cfi_def_cfa_offset 0
-	srd %r3, %r3, %r5
-	blr
-# endif
-
-	.cfi_endproc
-# if _CALL_ELF == 2
-	.size	ffi_closure_LINUX64,.-ffi_closure_LINUX64
-# else
-#  ifdef _CALL_LINUX
-	.size	ffi_closure_LINUX64,.-.L.ffi_closure_LINUX64
-#  else
-	.long	0
-	.byte	0,12,0,1,128,0,0,0
-	.size	.ffi_closure_LINUX64,.-.ffi_closure_LINUX64
-#  endif
-# endif
-
-
-	FFI_HIDDEN (ffi_go_closure_linux64)
-	.globl  ffi_go_closure_linux64
-	.text
-	.cfi_startproc
-# if _CALL_ELF == 2
-ffi_go_closure_linux64:
-	addis	%r2, %r12, .TOC.-ffi_go_closure_linux64@ha
-	addi	%r2, %r2, .TOC.-ffi_go_closure_linux64@l
-	.localentry ffi_go_closure_linux64, . - ffi_go_closure_linux64
-# else
-	.section        ".opd","aw"
-	.align  3
-ffi_go_closure_linux64:
-#  ifdef _CALL_LINUX
-	.quad   .L.ffi_go_closure_linux64,.TOC.@tocbase,0
-	.type   ffi_go_closure_linux64,@function
-	.text
-.L.ffi_go_closure_linux64:
-#  else
-	FFI_HIDDEN (.ffi_go_closure_linux64)
-	.globl  .ffi_go_closure_linux64
-	.quad   .ffi_go_closure_linux64,.TOC.@tocbase,0
-	.size   ffi_go_closure_linux64,24
-	.type   .ffi_go_closure_linux64,@function
-	.text
-.ffi_go_closure_linux64:
-#  endif
-# endif
-
-# if _CALL_ELF == 2
-	ld	%r12, 8(%r11)				# closure->cif
-	mflr	%r0
-	lwz	%r12, 28(%r12)				# cif->flags
-	mtcrf	0x40, %r12
-	addi	%r12, %r1, PARMSAVE
-	bt	7, 0f
-	# Our caller has not allocated a parameter save area.
-	# We need to allocate one here and use it to pass gprs to
-	# ffi_closure_helper_LINUX64.
-	addi	%r12, %r1, -STACKFRAME+PARMSAVE
-0:
-	# Save general regs into parm save area
-	std	%r3, 0(%r12)
-	std	%r4, 8(%r12)
-	std	%r5, 16(%r12)
-	std	%r6, 24(%r12)
-	std	%r7, 32(%r12)
-	std	%r8, 40(%r12)
-	std	%r9, 48(%r12)
-	std	%r10, 56(%r12)
-
-	# load up the pointer to the parm save area
-	mr	%r7, %r12
-# else
-	mflr	%r0
-	# Save general regs into parm save area
-	# This is the parameter save area set up by our caller.
-	std	%r3, PARMSAVE+0(%r1)
-	std	%r4, PARMSAVE+8(%r1)
-	std	%r5, PARMSAVE+16(%r1)
-	std	%r6, PARMSAVE+24(%r1)
-	std	%r7, PARMSAVE+32(%r1)
-	std	%r8, PARMSAVE+40(%r1)
-	std	%r9, PARMSAVE+48(%r1)
-	std	%r10, PARMSAVE+56(%r1)
-
-	# load up the pointer to the parm save area
-	addi	%r7, %r1, PARMSAVE
-# endif
-	std	%r0, 16(%r1)
-
-	# closure->cif
-	ld	%r3, 8(%r11)
-	# closure->fun
-	ld	%r4, 16(%r11)
-	# user_data
-	mr	%r5, %r11
-	b	.Ldoclosure
-
-	.cfi_endproc
-# if _CALL_ELF == 2
-	.size	ffi_go_closure_linux64,.-ffi_go_closure_linux64
-# else
-#  ifdef _CALL_LINUX
-	.size	ffi_go_closure_linux64,.-.L.ffi_go_closure_linux64
-#  else
-	.long	0
-	.byte	0,12,0,1,128,0,0,0
-	.size	.ffi_go_closure_linux64,.-.ffi_go_closure_linux64
-#  endif
-# endif
-#endif
-
-#if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2
-	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/third_party/gofrontend/libffi/src/powerpc/ppc_closure.S b/third_party/gofrontend/libffi/src/powerpc/ppc_closure.S
deleted file mode 100644
index b6d209d..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/ppc_closure.S
+++ /dev/null
@@ -1,397 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.h - Copyright (c) 2003 Jakub Jelinek <jakub@redhat.com>
-	    Copyright (c) 2008 Red Hat, Inc.
-
-   PowerPC Assembly glue.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-#include <powerpc/asm.h>
-
-	.file   "ppc_closure.S"
-
-#ifndef POWERPC64
-
-FFI_HIDDEN(ffi_closure_SYSV)
-ENTRY(ffi_closure_SYSV)
-	.cfi_startproc
-	stwu %r1,-144(%r1)
-	.cfi_def_cfa_offset 144
-	mflr %r0
-	stw %r0,148(%r1)
-	.cfi_offset 65, 4
-
-# we want to build up an areas for the parameters passed
-# in registers (both floating point and integer)
-
-	# so first save gpr 3 to gpr 10 (aligned to 4)
-	stw   %r3, 16(%r1)
-	stw   %r4, 20(%r1)
-	stw   %r5, 24(%r1)
-
-	# set up registers for the routine that does the work
-
-	# closure->cif
-	lwz %r3,FFI_TRAMPOLINE_SIZE(%r11)
-	# closure->fun
-	lwz %r4,FFI_TRAMPOLINE_SIZE+4(%r11)
-	# closure->user_data
-	lwz %r5,FFI_TRAMPOLINE_SIZE+8(%r11)
-
-.Ldoclosure:
-	stw   %r6, 28(%r1)
-	stw   %r7, 32(%r1)
-	stw   %r8, 36(%r1)
-	stw   %r9, 40(%r1)
-	stw   %r10,44(%r1)
-
-#ifndef __NO_FPRS__
-	# next save fpr 1 to fpr 8 (aligned to 8)
-	stfd  %f1, 48(%r1)
-	stfd  %f2, 56(%r1)
-	stfd  %f3, 64(%r1)
-	stfd  %f4, 72(%r1)
-	stfd  %f5, 80(%r1)
-	stfd  %f6, 88(%r1)
-	stfd  %f7, 96(%r1)
-	stfd  %f8, 104(%r1)
-#endif
-
-	# pointer to the result storage
-	addi %r6,%r1,112
-
-	# pointer to the saved gpr registers
-	addi %r7,%r1,16
-
-	# pointer to the saved fpr registers
-	addi %r8,%r1,48
-
-	# pointer to the outgoing parameter save area in the previous frame
-	# i.e. the previous frame pointer + 8
-	addi %r9,%r1,152
-
-	# make the call
-	bl ffi_closure_helper_SYSV@local
-.Lret:
-	# now r3 contains the return type
-	# so use it to look up in a table
-	# so we know how to deal with each type
-
-	# look up the proper starting point in table
-	# by using return type as offset
-
-	mflr %r4		# move address of .Lret to r4
-	slwi %r3,%r3,4		# now multiply return type by 16
-	addi %r4, %r4, .Lret_type0 - .Lret
-	lwz %r0,148(%r1)
-	add %r3,%r3,%r4		# add contents of table to table address
-	mtctr %r3
-	bctr			# jump to it
-
-# Each of the ret_typeX code fragments has to be exactly 16 bytes long
-# (4 instructions). For cache effectiveness we align to a 16 byte boundary
-# first.
-	.align 4
-# case FFI_TYPE_VOID
-.Lret_type0:
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-	nop
-
-# case FFI_TYPE_INT
-	lwz %r3,112+0(%r1)
-	mtlr %r0
-.Lfinish:
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-
-# case FFI_TYPE_FLOAT
-#ifndef __NO_FPRS__
-	lfs %f1,112+0(%r1)
-#else
-	nop
-#endif
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-
-# case FFI_TYPE_DOUBLE
-#ifndef __NO_FPRS__
-	lfd %f1,112+0(%r1)
-#else
-	nop
-#endif
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-
-# case FFI_TYPE_LONGDOUBLE
-#ifndef __NO_FPRS__
-	lfd %f1,112+0(%r1)
-	lfd %f2,112+8(%r1)
-	mtlr %r0
-	b .Lfinish
-#else
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-	nop
-#endif
-
-# case FFI_TYPE_UINT8
-#ifdef __LITTLE_ENDIAN__
-	lbz %r3,112+0(%r1)
-#else
-	lbz %r3,112+3(%r1)
-#endif
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-
-# case FFI_TYPE_SINT8
-#ifdef __LITTLE_ENDIAN__
-	lbz %r3,112+0(%r1)
-#else
-	lbz %r3,112+3(%r1)
-#endif
-	extsb %r3,%r3
-	mtlr %r0
-	b .Lfinish
-
-# case FFI_TYPE_UINT16
-#ifdef __LITTLE_ENDIAN__
-	lhz %r3,112+0(%r1)
-#else
-	lhz %r3,112+2(%r1)
-#endif
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-
-# case FFI_TYPE_SINT16
-#ifdef __LITTLE_ENDIAN__
-	lha %r3,112+0(%r1)
-#else
-	lha %r3,112+2(%r1)
-#endif
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-
-# case FFI_TYPE_UINT32
-	lwz %r3,112+0(%r1)
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-
-# case FFI_TYPE_SINT32
-	lwz %r3,112+0(%r1)
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-
-# case FFI_TYPE_UINT64
-	lwz %r3,112+0(%r1)
-	lwz %r4,112+4(%r1)
-	mtlr %r0
-	b .Lfinish
-
-# case FFI_TYPE_SINT64
-	lwz %r3,112+0(%r1)
-	lwz %r4,112+4(%r1)
-	mtlr %r0
-	b .Lfinish
-
-# case FFI_TYPE_STRUCT
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-	nop
-
-# case FFI_TYPE_POINTER
-	lwz %r3,112+0(%r1)
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-
-# case FFI_TYPE_UINT128
-	lwz %r3,112+0(%r1)
-	lwz %r4,112+4(%r1)
-	lwz %r5,112+8(%r1)
-	b .Luint128
-
-# The return types below are only used when the ABI type is FFI_SYSV.
-# case FFI_SYSV_TYPE_SMALL_STRUCT + 1. One byte struct.
-	lbz %r3,112+0(%r1)
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-
-# case FFI_SYSV_TYPE_SMALL_STRUCT + 2. Two byte struct.
-	lhz %r3,112+0(%r1)
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-
-# case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct.
-	lwz %r3,112+0(%r1)
-#ifdef __LITTLE_ENDIAN__
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-#else
-	srwi %r3,%r3,8
-	mtlr %r0
-	b .Lfinish
-#endif
-
-# case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct.
-	lwz %r3,112+0(%r1)
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-
-# case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct.
-	lwz %r3,112+0(%r1)
-	lwz %r4,112+4(%r1)
-#ifdef __LITTLE_ENDIAN__
-	mtlr %r0
-	b .Lfinish
-#else
-	li %r5,24
-	b .Lstruct567
-#endif
-
-# case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct.
-	lwz %r3,112+0(%r1)
-	lwz %r4,112+4(%r1)
-#ifdef __LITTLE_ENDIAN__
-	mtlr %r0
-	b .Lfinish
-#else
-	li %r5,16
-	b .Lstruct567
-#endif
-
-# case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct.
-	lwz %r3,112+0(%r1)
-	lwz %r4,112+4(%r1)
-#ifdef __LITTLE_ENDIAN__
-	mtlr %r0
-	b .Lfinish
-#else
-	li %r5,8
-	b .Lstruct567
-#endif
-
-# case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct.
-	lwz %r3,112+0(%r1)
-	lwz %r4,112+4(%r1)
-	mtlr %r0
-	b .Lfinish
-
-#ifndef __LITTLE_ENDIAN__
-.Lstruct567:
-	subfic %r6,%r5,32
-	srw %r4,%r4,%r5
-	slw %r6,%r3,%r6
-	srw %r3,%r3,%r5
-	or %r4,%r6,%r4
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_def_cfa_offset 144
-#endif
-
-.Luint128:
-	lwz %r6,112+12(%r1)
-	mtlr %r0
-	addi %r1,%r1,144
-	.cfi_def_cfa_offset 0
-	blr
-	.cfi_endproc
-END(ffi_closure_SYSV)
-
-
-FFI_HIDDEN(ffi_go_closure_sysv)
-ENTRY(ffi_go_closure_sysv)
-	.cfi_startproc
-	stwu %r1,-144(%r1)
-	.cfi_def_cfa_offset 144
-	mflr %r0
-	stw %r0,148(%r1)
-	.cfi_offset 65, 4
-
-	stw   %r3, 16(%r1)
-	stw   %r4, 20(%r1)
-	stw   %r5, 24(%r1)
-
-	# closure->cif
-	lwz %r3,4(%r11)
-	# closure->fun
-	lwz %r4,8(%r11)
-	# user_data
-	mr %r5,%r11
-	b .Ldoclosure
-	.cfi_endproc
-END(ffi_go_closure_sysv)
-
-#if defined __ELF__ && defined __linux__
-	.section	.note.GNU-stack,"",@progbits
-#endif
-#endif
diff --git a/third_party/gofrontend/libffi/src/powerpc/sysv.S b/third_party/gofrontend/libffi/src/powerpc/sysv.S
deleted file mode 100644
index 1474ce7..0000000
--- a/third_party/gofrontend/libffi/src/powerpc/sysv.S
+++ /dev/null
@@ -1,175 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 1998 Geoffrey Keating
-   Copyright (C) 2007 Free Software Foundation, Inc
-
-   PowerPC Assembly glue.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-#include <powerpc/asm.h>
-
-#ifndef POWERPC64
-FFI_HIDDEN(ffi_call_SYSV)
-ENTRY(ffi_call_SYSV)
-	.cfi_startproc
-	/* Save the old stack pointer as AP.  */
-	mr	%r10,%r1
-	.cfi_def_cfa_register 10
-
-	/* Allocate the stack space we need.  */
-	stwux	%r1,%r1,%r8
-	/* Save registers we use.  */
-	mflr	%r9
-	stw	%r28,-16(%r10)
-	stw	%r29,-12(%r10)
-	stw	%r30, -8(%r10)
-	stw	%r31, -4(%r10)
-	stw	%r9,   4(%r10)
-	.cfi_offset 65, 4
-	.cfi_offset 31, -4
-	.cfi_offset 30, -8
-	.cfi_offset 29, -12
-	.cfi_offset 28, -16
-
-	/* Save arguments over call...  */
-	stw	%r7,   -20(%r10)	/* closure, */
-	mr	%r31,%r6		/* flags, */
-	mr	%r30,%r5		/* rvalue, */
-	mr	%r29,%r4		/* function address, */
-	mr	%r28,%r10		/* our AP. */
-	.cfi_def_cfa_register 28
-
-	/* Call ffi_prep_args_SYSV.  */
-	mr	%r4,%r1
-	bl	ffi_prep_args_SYSV@local
-
-	/* Now do the call.  */
-	/* Set up cr1 with bits 4-7 of the flags.  */
-	mtcrf	0x40,%r31
-	/* Get the address to call into CTR.  */
-	mtctr	%r29
-	/* Load all those argument registers.  */
-	lwz	%r3,-24-(8*4)(%r28)
-	lwz	%r4,-24-(7*4)(%r28)
-	lwz	%r5,-24-(6*4)(%r28)
-	lwz	%r6,-24-(5*4)(%r28)
-	bf-	5,1f
-	nop
-	lwz	%r7,-24-(4*4)(%r28)
-	lwz	%r8,-24-(3*4)(%r28)
-	lwz	%r9,-24-(2*4)(%r28)
-	lwz	%r10,-24-(1*4)(%r28)
-	nop
-1:
-
-#ifndef __NO_FPRS__
-	/* Load all the FP registers.  */
-	bf-	6,2f
-	lfd	%f1,-24-(8*4)-(8*8)(%r28)
-	lfd	%f2,-24-(8*4)-(7*8)(%r28)
-	lfd	%f3,-24-(8*4)-(6*8)(%r28)
-	lfd	%f4,-24-(8*4)-(5*8)(%r28)
-	nop
-	lfd	%f5,-24-(8*4)-(4*8)(%r28)
-	lfd	%f6,-24-(8*4)-(3*8)(%r28)
-	lfd	%f7,-24-(8*4)-(2*8)(%r28)
-	lfd	%f8,-24-(8*4)-(1*8)(%r28)
-#endif
-2:
-
-	/* Make the call.  */
-	lwz	%r11, -20(%r28)
-	bctrl
-
-	/* Now, deal with the return value.  */
-	mtcrf	0x01,%r31 /* cr7  */
-	bt-	31,L(small_struct_return_value)
-	bt-	30,L(done_return_value)
-#ifndef __NO_FPRS__
-	bt-	29,L(fp_return_value)
-#endif
-	stw	%r3,0(%r30)
-	bf+	28,L(done_return_value)
-	stw	%r4,4(%r30)
-	mtcrf	0x02,%r31 /* cr6  */
-	bf	27,L(done_return_value)
-	stw     %r5,8(%r30)
-	stw	%r6,12(%r30)
-	/* Fall through...  */
-
-L(done_return_value):
-	/* Restore the registers we used and return.  */
-	lwz	%r9,   4(%r28)
-	lwz	%r31, -4(%r28)
-	mtlr	%r9
-	lwz	%r30, -8(%r28)
-	lwz	%r29,-12(%r28)
-	lwz	%r28,-16(%r28)
-	.cfi_remember_state
-	/* At this point we don't have a cfa register.  Say all our
-	   saved regs have been restored.  */
-	.cfi_same_value 65
-	.cfi_same_value 31
-	.cfi_same_value 30
-	.cfi_same_value 29
-	.cfi_same_value 28
-	/* Hopefully this works..  */
-	.cfi_def_cfa_register 1
-	.cfi_offset 1, 0
-	lwz	%r1,0(%r1)
-	.cfi_same_value 1
-	blr
-
-#ifndef __NO_FPRS__
-L(fp_return_value):
-	.cfi_restore_state
-	bf	28,L(float_return_value)
-	stfd	%f1,0(%r30)
-	mtcrf   0x02,%r31 /* cr6  */
-	bf	27,L(done_return_value)
-	stfd	%f2,8(%r30)
-	b	L(done_return_value)
-L(float_return_value):
-	stfs	%f1,0(%r30)
-	b	L(done_return_value)
-#endif
-
-L(small_struct_return_value):
-	/*
-	 * The C code always allocates a properly-aligned 8-byte bounce
-	 * buffer to make this assembly code very simple.  Just write out
-	 * r3 and r4 to the buffer to allow the C code to handle the rest.
-	 */
-	stw %r3, 0(%r30)
-	stw %r4, 4(%r30)
-	b L(done_return_value)
-	.cfi_endproc
-
-END(ffi_call_SYSV)
-
-#if defined __ELF__ && defined __linux__
-	.section	.note.GNU-stack,"",@progbits
-#endif
-#endif
diff --git a/third_party/gofrontend/libffi/src/prep_cif.c b/third_party/gofrontend/libffi/src/prep_cif.c
deleted file mode 100644
index 5881ceb..0000000
--- a/third_party/gofrontend/libffi/src/prep_cif.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/* -----------------------------------------------------------------------
-   prep_cif.c - Copyright (c) 2011, 2012  Anthony Green
-                Copyright (c) 1996, 1998, 2007  Red Hat, Inc.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-#include <stdlib.h>
-
-/* Round up to FFI_SIZEOF_ARG. */
-
-#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG)
-
-/* Perform machine independent initialization of aggregate type
-   specifications. */
-
-static ffi_status initialize_aggregate(ffi_type *arg)
-{
-  ffi_type **ptr;
-
-  if (UNLIKELY(arg == NULL || arg->elements == NULL))
-    return FFI_BAD_TYPEDEF;
-
-  arg->size = 0;
-  arg->alignment = 0;
-
-  ptr = &(arg->elements[0]);
-
-  if (UNLIKELY(ptr == 0))
-    return FFI_BAD_TYPEDEF;
-
-  while ((*ptr) != NULL)
-    {
-      if (UNLIKELY(((*ptr)->size == 0)
-		    && (initialize_aggregate((*ptr)) != FFI_OK)))
-	return FFI_BAD_TYPEDEF;
-
-      /* Perform a sanity check on the argument type */
-      FFI_ASSERT_VALID_TYPE(*ptr);
-
-      arg->size = ALIGN(arg->size, (*ptr)->alignment);
-      arg->size += (*ptr)->size;
-
-      arg->alignment = (arg->alignment > (*ptr)->alignment) ?
-	arg->alignment : (*ptr)->alignment;
-
-      ptr++;
-    }
-
-  /* Structure size includes tail padding.  This is important for
-     structures that fit in one register on ABIs like the PowerPC64
-     Linux ABI that right justify small structs in a register.
-     It's also needed for nested structure layout, for example
-     struct A { long a; char b; }; struct B { struct A x; char y; };
-     should find y at an offset of 2*sizeof(long) and result in a
-     total size of 3*sizeof(long).  */
-  arg->size = ALIGN (arg->size, arg->alignment);
-
-  /* On some targets, the ABI defines that structures have an additional
-     alignment beyond the "natural" one based on their elements.  */
-#ifdef FFI_AGGREGATE_ALIGNMENT
-  if (FFI_AGGREGATE_ALIGNMENT > arg->alignment)
-    arg->alignment = FFI_AGGREGATE_ALIGNMENT;
-#endif
-
-  if (arg->size == 0)
-    return FFI_BAD_TYPEDEF;
-  else
-    return FFI_OK;
-}
-
-#ifndef __CRIS__
-/* The CRIS ABI specifies structure elements to have byte
-   alignment only, so it completely overrides this functions,
-   which assumes "natural" alignment and padding.  */
-
-/* Perform machine independent ffi_cif preparation, then call
-   machine dependent routine. */
-
-/* For non variadic functions isvariadic should be 0 and
-   nfixedargs==ntotalargs.
-
-   For variadic calls, isvariadic should be 1 and nfixedargs
-   and ntotalargs set as appropriate. nfixedargs must always be >=1 */
-
-
-ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi,
-			     unsigned int isvariadic,
-                             unsigned int nfixedargs,
-                             unsigned int ntotalargs,
-			     ffi_type *rtype, ffi_type **atypes)
-{
-  unsigned bytes = 0;
-  unsigned int i;
-  ffi_type **ptr;
-
-  FFI_ASSERT(cif != NULL);
-  FFI_ASSERT((!isvariadic) || (nfixedargs >= 1));
-  FFI_ASSERT(nfixedargs <= ntotalargs);
-
-  if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI))
-    return FFI_BAD_ABI;
-
-  cif->abi = abi;
-  cif->arg_types = atypes;
-  cif->nargs = ntotalargs;
-  cif->rtype = rtype;
-
-  cif->flags = 0;
-
-#if HAVE_LONG_DOUBLE_VARIANT
-  ffi_prep_types (abi);
-#endif
-
-  /* Initialize the return type if necessary */
-  if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK))
-    return FFI_BAD_TYPEDEF;
-
-#ifndef FFI_TARGET_HAS_COMPLEX_TYPE
-  if (rtype->type == FFI_TYPE_COMPLEX)
-    abort();
-#endif
-  /* Perform a sanity check on the return type */
-  FFI_ASSERT_VALID_TYPE(cif->rtype);
-
-  /* x86, x86-64 and s390 stack space allocation is handled in prep_machdep. */
-#if !defined FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION
-  /* Make space for the return structure pointer */
-  if (cif->rtype->type == FFI_TYPE_STRUCT
-#ifdef TILE
-      && (cif->rtype->size > 10 * FFI_SIZEOF_ARG)
-#endif
-#ifdef XTENSA
-      && (cif->rtype->size > 16)
-#endif
-#ifdef NIOS2
-      && (cif->rtype->size > 8)
-#endif
-     )
-    bytes = STACK_ARG_SIZE(sizeof(void*));
-#endif
-
-  for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
-    {
-
-      /* Initialize any uninitialized aggregate type definitions */
-      if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK))
-	return FFI_BAD_TYPEDEF;
-
-#ifndef FFI_TARGET_HAS_COMPLEX_TYPE
-      if ((*ptr)->type == FFI_TYPE_COMPLEX)
-	abort();
-#endif
-      /* Perform a sanity check on the argument type, do this
-	 check after the initialization.  */
-      FFI_ASSERT_VALID_TYPE(*ptr);
-
-#if !defined FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION
-	{
-	  /* Add any padding if necessary */
-	  if (((*ptr)->alignment - 1) & bytes)
-	    bytes = (unsigned)ALIGN(bytes, (*ptr)->alignment);
-
-#ifdef TILE
-	  if (bytes < 10 * FFI_SIZEOF_ARG &&
-	      bytes + STACK_ARG_SIZE((*ptr)->size) > 10 * FFI_SIZEOF_ARG)
-	    {
-	      /* An argument is never split between the 10 parameter
-		 registers and the stack.  */
-	      bytes = 10 * FFI_SIZEOF_ARG;
-	    }
-#endif
-#ifdef XTENSA
-	  if (bytes <= 6*4 && bytes + STACK_ARG_SIZE((*ptr)->size) > 6*4)
-	    bytes = 6*4;
-#endif
-
-	  bytes += STACK_ARG_SIZE((*ptr)->size);
-	}
-#endif
-    }
-
-  cif->bytes = bytes;
-
-  /* Perform machine dependent cif processing */
-#ifdef FFI_TARGET_SPECIFIC_VARIADIC
-  if (isvariadic)
-	return ffi_prep_cif_machdep_var(cif, nfixedargs, ntotalargs);
-#endif
-
-  return ffi_prep_cif_machdep(cif);
-}
-#endif /* not __CRIS__ */
-
-ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
-			     ffi_type *rtype, ffi_type **atypes)
-{
-  return ffi_prep_cif_core(cif, abi, 0, nargs, nargs, rtype, atypes);
-}
-
-ffi_status ffi_prep_cif_var(ffi_cif *cif,
-                            ffi_abi abi,
-                            unsigned int nfixedargs,
-                            unsigned int ntotalargs,
-                            ffi_type *rtype,
-                            ffi_type **atypes)
-{
-  return ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes);
-}
-
-#if FFI_CLOSURES
-
-ffi_status
-ffi_prep_closure (ffi_closure* closure,
-		  ffi_cif* cif,
-		  void (*fun)(ffi_cif*,void*,void**,void*),
-		  void *user_data)
-{
-  return ffi_prep_closure_loc (closure, cif, fun, user_data, closure);
-}
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/raw_api.c b/third_party/gofrontend/libffi/src/raw_api.c
deleted file mode 100644
index 276cb22..0000000
--- a/third_party/gofrontend/libffi/src/raw_api.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/* -----------------------------------------------------------------------
-   raw_api.c - Copyright (c) 1999, 2008  Red Hat, Inc.
-
-   Author: Kresten Krab Thorup <krab@gnu.org>
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-/* This file defines generic functions for use with the raw api. */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#if !FFI_NO_RAW_API
-
-size_t
-ffi_raw_size (ffi_cif *cif)
-{
-  size_t result = 0;
-  int i;
-
-  ffi_type **at = cif->arg_types;
-
-  for (i = cif->nargs-1; i >= 0; i--, at++)
-    {
-#if !FFI_NO_STRUCTS
-      if ((*at)->type == FFI_TYPE_STRUCT)
-	result += ALIGN (sizeof (void*), FFI_SIZEOF_ARG);
-      else
-#endif
-	result += ALIGN ((*at)->size, FFI_SIZEOF_ARG);
-    }
-
-  return result;
-}
-
-
-void
-ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args)
-{
-  unsigned i;
-  ffi_type **tp = cif->arg_types;
-
-#if WORDS_BIGENDIAN
-
-  for (i = 0; i < cif->nargs; i++, tp++, args++)
-    {	  
-      switch ((*tp)->type)
-	{
-	case FFI_TYPE_UINT8:
-	case FFI_TYPE_SINT8:
-	  *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 1);
-	  break;
-	  
-	case FFI_TYPE_UINT16:
-	case FFI_TYPE_SINT16:
-	  *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 2);
-	  break;
-
-#if FFI_SIZEOF_ARG >= 4	  
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT32:
-	  *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 4);
-	  break;
-#endif
-	
-#if !FFI_NO_STRUCTS  
-	case FFI_TYPE_STRUCT:
-	  *args = (raw++)->ptr;
-	  break;
-#endif
-
-	case FFI_TYPE_COMPLEX:
-	  *args = (raw++)->ptr;
-	  break;
-
-	case FFI_TYPE_POINTER:
-	  *args = (void*) &(raw++)->ptr;
-	  break;
-	  
-	default:
-	  *args = raw;
-	  raw += ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
-	}
-    }
-
-#else /* WORDS_BIGENDIAN */
-
-#if !PDP
-
-  /* then assume little endian */
-  for (i = 0; i < cif->nargs; i++, tp++, args++)
-    {	  
-#if !FFI_NO_STRUCTS
-      if ((*tp)->type == FFI_TYPE_STRUCT)
-	{
-	  *args = (raw++)->ptr;
-	}
-      else
-#endif
-      if ((*tp)->type == FFI_TYPE_COMPLEX)
-	{
-	  *args = (raw++)->ptr;
-	}
-      else
-	{
-	  *args = (void*) raw;
-	  raw += ALIGN ((*tp)->size, sizeof (void*)) / sizeof (void*);
-	}
-    }
-
-#else
-#error "pdp endian not supported"
-#endif /* ! PDP */
-
-#endif /* WORDS_BIGENDIAN */
-}
-
-void
-ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw)
-{
-  unsigned i;
-  ffi_type **tp = cif->arg_types;
-
-  for (i = 0; i < cif->nargs; i++, tp++, args++)
-    {	  
-      switch ((*tp)->type)
-	{
-	case FFI_TYPE_UINT8:
-	  (raw++)->uint = *(UINT8*) (*args);
-	  break;
-
-	case FFI_TYPE_SINT8:
-	  (raw++)->sint = *(SINT8*) (*args);
-	  break;
-
-	case FFI_TYPE_UINT16:
-	  (raw++)->uint = *(UINT16*) (*args);
-	  break;
-
-	case FFI_TYPE_SINT16:
-	  (raw++)->sint = *(SINT16*) (*args);
-	  break;
-
-#if FFI_SIZEOF_ARG >= 4
-	case FFI_TYPE_UINT32:
-	  (raw++)->uint = *(UINT32*) (*args);
-	  break;
-
-	case FFI_TYPE_SINT32:
-	  (raw++)->sint = *(SINT32*) (*args);
-	  break;
-#endif
-
-#if !FFI_NO_STRUCTS
-	case FFI_TYPE_STRUCT:
-	  (raw++)->ptr = *args;
-	  break;
-#endif
-
-	case FFI_TYPE_COMPLEX:
-	  (raw++)->ptr = *args;
-	  break;
-
-	case FFI_TYPE_POINTER:
-	  (raw++)->ptr = **(void***) args;
-	  break;
-
-	default:
-	  memcpy ((void*) raw->data, (void*)*args, (*tp)->size);
-	  raw += ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
-	}
-    }
-}
-
-#if !FFI_NATIVE_RAW_API
-
-
-/* This is a generic definition of ffi_raw_call, to be used if the
- * native system does not provide a machine-specific implementation.
- * Having this, allows code to be written for the raw API, without
- * the need for system-specific code to handle input in that format;
- * these following couple of functions will handle the translation forth
- * and back automatically. */
-
-void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *raw)
-{
-  void **avalue = (void**) alloca (cif->nargs * sizeof (void*));
-  ffi_raw_to_ptrarray (cif, raw, avalue);
-  ffi_call (cif, fn, rvalue, avalue);
-}
-
-#if FFI_CLOSURES		/* base system provides closures */
-
-static void
-ffi_translate_args (ffi_cif *cif, void *rvalue,
-		    void **avalue, void *user_data)
-{
-  ffi_raw *raw = (ffi_raw*)alloca (ffi_raw_size (cif));
-  ffi_raw_closure *cl = (ffi_raw_closure*)user_data;
-
-  ffi_ptrarray_to_raw (cif, avalue, raw);
-  (*cl->fun) (cif, rvalue, raw, cl->user_data);
-}
-
-ffi_status
-ffi_prep_raw_closure_loc (ffi_raw_closure* cl,
-			  ffi_cif *cif,
-			  void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
-			  void *user_data,
-			  void *codeloc)
-{
-  ffi_status status;
-
-  status = ffi_prep_closure_loc ((ffi_closure*) cl,
-				 cif,
-				 &ffi_translate_args,
-				 codeloc,
-				 codeloc);
-  if (status == FFI_OK)
-    {
-      cl->fun       = fun;
-      cl->user_data = user_data;
-    }
-
-  return status;
-}
-
-#endif /* FFI_CLOSURES */
-#endif /* !FFI_NATIVE_RAW_API */
-
-#if FFI_CLOSURES
-
-/* Again, here is the generic version of ffi_prep_raw_closure, which
- * will install an intermediate "hub" for translation of arguments from
- * the pointer-array format, to the raw format */
-
-ffi_status
-ffi_prep_raw_closure (ffi_raw_closure* cl,
-		      ffi_cif *cif,
-		      void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
-		      void *user_data)
-{
-  return ffi_prep_raw_closure_loc (cl, cif, fun, user_data, cl);
-}
-
-#endif /* FFI_CLOSURES */
-
-#endif /* !FFI_NO_RAW_API */
diff --git a/third_party/gofrontend/libffi/src/s390/ffi.c b/third_party/gofrontend/libffi/src/s390/ffi.c
deleted file mode 100644
index 4035b6e..0000000
--- a/third_party/gofrontend/libffi/src/s390/ffi.c
+++ /dev/null
@@ -1,756 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2000, 2007 Software AG
-           Copyright (c) 2008 Red Hat, Inc
-
-   S390 Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-/*====================================================================*/
-/*                          Includes                                  */
-/*                          --------                                  */
-/*====================================================================*/
-
-#include <ffi.h>
-#include <ffi_common.h>
-#include <stdint.h>
-#include "internal.h"
-
-/*====================== End of Includes =============================*/
-
-/*====================================================================*/
-/*                           Defines                                  */
-/*                           -------                                  */
-/*====================================================================*/
-
-/* Maximum number of GPRs available for argument passing.  */
-#define MAX_GPRARGS 5
-
-/* Maximum number of FPRs available for argument passing.  */
-#ifdef __s390x__
-#define MAX_FPRARGS 4
-#else
-#define MAX_FPRARGS 2
-#endif
-
-/* Round to multiple of 16.  */
-#define ROUND_SIZE(size) (((size) + 15) & ~15)
-
-/*===================== End of Defines ===============================*/
-
-/*====================================================================*/
-/*                          Externals                                 */
-/*                          ---------                                 */
-/*====================================================================*/
-
-struct call_frame
-{
-  void *back_chain;
-  void *eos;
-  unsigned long gpr_args[5];
-  unsigned long gpr_save[9];
-  unsigned long long fpr_args[4];
-};
-
-extern void FFI_HIDDEN ffi_call_SYSV(struct call_frame *, unsigned, void *,
-			             void (*fn)(void), void *);
-
-extern void ffi_closure_SYSV(void);
-extern void ffi_go_closure_SYSV(void);
-
-/*====================== End of Externals ============================*/
-
-/*====================================================================*/
-/*                                                                    */
-/* Name     - ffi_check_struct_type.                                  */
-/*                                                                    */
-/* Function - Determine if a structure can be passed within a         */
-/*            general purpose or floating point register.             */
-/*                                                                    */
-/*====================================================================*/
-
-static int
-ffi_check_struct_type (ffi_type *arg)
-{
-  size_t size = arg->size;
-
-  /* If the struct has just one element, look at that element
-     to find out whether to consider the struct as floating point.  */
-  while (arg->type == FFI_TYPE_STRUCT
-         && arg->elements[0] && !arg->elements[1])
-    arg = arg->elements[0];
-
-  /* Structs of size 1, 2, 4, and 8 are passed in registers,
-     just like the corresponding int/float types.  */
-  switch (size)
-    {
-      case 1:
-        return FFI_TYPE_UINT8;
-
-      case 2:
-        return FFI_TYPE_UINT16;
-
-      case 4:
-	if (arg->type == FFI_TYPE_FLOAT)
-          return FFI_TYPE_FLOAT;
-	else
-	  return FFI_TYPE_UINT32;
-
-      case 8:
-	if (arg->type == FFI_TYPE_DOUBLE)
-          return FFI_TYPE_DOUBLE;
-	else
-	  return FFI_TYPE_UINT64;
-
-      default:
-	break;
-    }
-
-  /* Other structs are passed via a pointer to the data.  */
-  return FFI_TYPE_POINTER;
-}
-
-/*======================== End of Routine ============================*/
-
-/*====================================================================*/
-/*                                                                    */
-/* Name     - ffi_prep_cif_machdep.                                   */
-/*                                                                    */
-/* Function - Perform machine dependent CIF processing.               */
-/*                                                                    */
-/*====================================================================*/
-
-ffi_status FFI_HIDDEN
-ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  size_t struct_size = 0;
-  int n_gpr = 0;
-  int n_fpr = 0;
-  int n_ov = 0;
-
-  ffi_type **ptr;
-  int i;
-
-  /* Determine return value handling.  */
-
-  switch (cif->rtype->type)
-    {
-      /* Void is easy.  */
-      case FFI_TYPE_VOID:
-	cif->flags = FFI390_RET_VOID;
-	break;
-
-      /* Structures and complex are returned via a hidden pointer.  */
-      case FFI_TYPE_STRUCT:
-      case FFI_TYPE_COMPLEX:
-	cif->flags = FFI390_RET_STRUCT;
-	n_gpr++;  /* We need one GPR to pass the pointer.  */
-	break;
-
-      /* Floating point values are returned in fpr 0.  */
-      case FFI_TYPE_FLOAT:
-	cif->flags = FFI390_RET_FLOAT;
-	break;
-
-      case FFI_TYPE_DOUBLE:
-	cif->flags = FFI390_RET_DOUBLE;
-	break;
-
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-      case FFI_TYPE_LONGDOUBLE:
-	cif->flags = FFI390_RET_STRUCT;
-	n_gpr++;
-	break;
-#endif
-      /* Integer values are returned in gpr 2 (and gpr 3
-	 for 64-bit values on 31-bit machines).  */
-      case FFI_TYPE_UINT64:
-      case FFI_TYPE_SINT64:
-	cif->flags = FFI390_RET_INT64;
-	break;
-
-      case FFI_TYPE_POINTER:
-      case FFI_TYPE_INT:
-      case FFI_TYPE_UINT32:
-      case FFI_TYPE_SINT32:
-      case FFI_TYPE_UINT16:
-      case FFI_TYPE_SINT16:
-      case FFI_TYPE_UINT8:
-      case FFI_TYPE_SINT8:
-	/* These are to be extended to word size.  */
-#ifdef __s390x__
-	cif->flags = FFI390_RET_INT64;
-#else
-	cif->flags = FFI390_RET_INT32;
-#endif
-	break;
-
-      default:
-        FFI_ASSERT (0);
-        break;
-    }
-
-  /* Now for the arguments.  */
-
-  for (ptr = cif->arg_types, i = cif->nargs;
-       i > 0;
-       i--, ptr++)
-    {
-      int type = (*ptr)->type;
-
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-      /* 16-byte long double is passed like a struct.  */
-      if (type == FFI_TYPE_LONGDOUBLE)
-	type = FFI_TYPE_STRUCT;
-#endif
-
-      /* Check how a structure type is passed.  */
-      if (type == FFI_TYPE_STRUCT || type == FFI_TYPE_COMPLEX)
-	{
-	  if (type == FFI_TYPE_COMPLEX)
-	    type = FFI_TYPE_POINTER;
-	  else
-	    type = ffi_check_struct_type (*ptr);
-
-	  /* If we pass the struct via pointer, we must reserve space
-	     to copy its data for proper call-by-value semantics.  */
-	  if (type == FFI_TYPE_POINTER)
-	    struct_size += ROUND_SIZE ((*ptr)->size);
-	}
-
-      /* Now handle all primitive int/float data types.  */
-      switch (type)
-	{
-	  /* The first MAX_FPRARGS floating point arguments
-	     go in FPRs, the rest overflow to the stack.  */
-
-	  case FFI_TYPE_DOUBLE:
-	    if (n_fpr < MAX_FPRARGS)
-	      n_fpr++;
-	    else
-	      n_ov += sizeof (double) / sizeof (long);
-	    break;
-
-	  case FFI_TYPE_FLOAT:
-	    if (n_fpr < MAX_FPRARGS)
-	      n_fpr++;
-	    else
-	      n_ov++;
-	    break;
-
-	  /* On 31-bit machines, 64-bit integers are passed in GPR pairs,
-	     if one is still available, or else on the stack.  If only one
-	     register is free, skip the register (it won't be used for any
-	     subsequent argument either).  */
-
-#ifndef __s390x__
-	  case FFI_TYPE_UINT64:
-	  case FFI_TYPE_SINT64:
-	    if (n_gpr == MAX_GPRARGS-1)
-	      n_gpr = MAX_GPRARGS;
-	    if (n_gpr < MAX_GPRARGS)
-	      n_gpr += 2;
-	    else
-	      n_ov += 2;
-	    break;
-#endif
-
-	  /* Everything else is passed in GPRs (until MAX_GPRARGS
-	     have been used) or overflows to the stack.  */
-
-	  default:
-	    if (n_gpr < MAX_GPRARGS)
-	      n_gpr++;
-	    else
-	      n_ov++;
-	    break;
-        }
-    }
-
-  /* Total stack space as required for overflow arguments
-     and temporary structure copies.  */
-
-  cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size;
-
-  return FFI_OK;
-}
-
-/*======================== End of Routine ============================*/
-
-/*====================================================================*/
-/*                                                                    */
-/* Name     - ffi_call.                                               */
-/*                                                                    */
-/* Function - Call the FFI routine.                                   */
-/*                                                                    */
-/*====================================================================*/
-
-static void
-ffi_call_int(ffi_cif *cif,
-	     void (*fn)(void),
-	     void *rvalue,
-	     void **avalue,
-	     void *closure)
-{
-  int ret_type = cif->flags;
-  size_t rsize = 0, bytes = cif->bytes;
-  unsigned char *stack, *p_struct;
-  struct call_frame *frame;
-  unsigned long *p_ov, *p_gpr;
-  unsigned long long *p_fpr;
-  int n_fpr, n_gpr, n_ov, i, n;
-  ffi_type **arg_types;
-
-  FFI_ASSERT (cif->abi == FFI_SYSV);
-
-  /* If we don't have a return value, we need to fake one.  */
-  if (rvalue == NULL)
-    {
-      if (ret_type & FFI390_RET_IN_MEM)
-	rsize = cif->rtype->size;
-      else
-	ret_type = FFI390_RET_VOID;
-    }
-
-  /* The stack space will be filled with those areas:
-
-	dummy structure return		    (highest addresses)
-	  FPR argument register save area
-	  GPR argument register save area
-	stack frame for ffi_call_SYSV
-	temporary struct copies
-	overflow argument area              (lowest addresses)
-
-     We set up the following pointers:
-
-        p_fpr: bottom of the FPR area (growing upwards)
-	p_gpr: bottom of the GPR area (growing upwards)
-	p_ov: bottom of the overflow area (growing upwards)
-	p_struct: top of the struct copy area (growing downwards)
-
-     All areas are kept aligned to twice the word size.
-
-     Note that we're going to create the stack frame for both
-     ffi_call_SYSV _and_ the target function right here.  This
-     works because we don't make any function calls with more
-     than 5 arguments (indeed only memcpy and ffi_call_SYSV),
-     and thus we don't have any stacked outgoing parameters.  */
-
-  stack = alloca (bytes + sizeof(struct call_frame) + rsize);
-  frame = (struct call_frame *)(stack + bytes);
-  if (rsize)
-    rvalue = frame + 1;
-
-  /* Link the new frame back to the one from this function.  */
-  frame->back_chain = __builtin_frame_address (0);
-
-  /* Fill in all of the argument stuff.  */
-  p_ov = (unsigned long *)stack;
-  p_struct = (unsigned char *)frame;
-  p_gpr = frame->gpr_args;
-  p_fpr = frame->fpr_args;
-  n_fpr = n_gpr = n_ov = 0;
-
-  /* If we returning a structure then we set the first parameter register
-     to the address of where we are returning this structure.  */
-  if (cif->flags & FFI390_RET_IN_MEM)
-    p_gpr[n_gpr++] = (uintptr_t) rvalue;
-
-  /* Now for the arguments.  */
-  arg_types = cif->arg_types;
-  for (i = 0, n = cif->nargs; i < n; ++i)
-    {
-      ffi_type *ty = arg_types[i];
-      void *arg = avalue[i];
-      int type = ty->type;
-      ffi_arg val;
-
-    restart:
-      switch (type)
-	{
-	case FFI_TYPE_SINT8:
-	  val = *(SINT8 *)arg;
-	  goto do_int;
-	case FFI_TYPE_UINT8:
-	  val = *(UINT8 *)arg;
-	  goto do_int;
-	case FFI_TYPE_SINT16:
-	  val = *(SINT16 *)arg;
-	  goto do_int;
-	case FFI_TYPE_UINT16:
-	  val = *(UINT16 *)arg;
-	  goto do_int;
-	case FFI_TYPE_INT:
-	case FFI_TYPE_SINT32:
-	  val = *(SINT32 *)arg;
-	  goto do_int;
-	case FFI_TYPE_UINT32:
-	  val = *(UINT32 *)arg;
-	  goto do_int;
-	case FFI_TYPE_POINTER:
-	  val = *(uintptr_t *)arg;
-	do_int:
-	  *(n_gpr < MAX_GPRARGS ? p_gpr + n_gpr++ : p_ov + n_ov++) = val;
-	  break;
-
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-#ifdef __s390x__
-	  val = *(UINT64 *)arg;
-	  goto do_int;
-#else
-	  if (n_gpr == MAX_GPRARGS-1)
-	    n_gpr = MAX_GPRARGS;
-	  if (n_gpr < MAX_GPRARGS)
-	    p_gpr[n_gpr++] = ((UINT32 *) arg)[0],
-	    p_gpr[n_gpr++] = ((UINT32 *) arg)[1];
-	  else
-	    p_ov[n_ov++] = ((UINT32 *) arg)[0],
-	    p_ov[n_ov++] = ((UINT32 *) arg)[1];
-#endif
-	  break;
-
-	case FFI_TYPE_DOUBLE:
-	  if (n_fpr < MAX_FPRARGS)
-	    p_fpr[n_fpr++] = *(UINT64 *) arg;
-	  else
-	    {
-#ifdef __s390x__
-	      p_ov[n_ov++] = *(UINT64 *) arg;
-#else
-	      p_ov[n_ov++] = ((UINT32 *) arg)[0],
-	      p_ov[n_ov++] = ((UINT32 *) arg)[1];
-#endif
-	    }
-	  break;
-
-	case FFI_TYPE_FLOAT:
-	  val = *(UINT32 *)arg;
-	  if (n_fpr < MAX_FPRARGS)
-	    p_fpr[n_fpr++] = (UINT64)val << 32;
-	  else
-	    p_ov[n_ov++] = val;
-	  break;
-
-	case FFI_TYPE_STRUCT:
-          /* Check how a structure type is passed.  */
-	  type = ffi_check_struct_type (ty);
-	  /* Some structures are passed via a type they contain.  */
-	  if (type != FFI_TYPE_POINTER)
-	    goto restart;
-	  /* ... otherwise, passed by reference.  fallthru.  */
-
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-	case FFI_TYPE_LONGDOUBLE:
-	  /* 16-byte long double is passed via reference.  */
-#endif
-	case FFI_TYPE_COMPLEX:
-	  /* Complex types are passed via reference.  */
-	  p_struct -= ROUND_SIZE (ty->size);
-	  memcpy (p_struct, arg, ty->size);
-	  val = (uintptr_t)p_struct;
-	  goto do_int;
-
-	default:
-	  FFI_ASSERT (0);
-	  break;
-        }
-    }
-
-  ffi_call_SYSV (frame, ret_type & FFI360_RET_MASK, rvalue, fn, closure);
-}
-
-void
-ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  ffi_call_int(cif, fn, rvalue, avalue, NULL);
-}
-
-void
-ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
-	     void **avalue, void *closure)
-{
-  ffi_call_int(cif, fn, rvalue, avalue, closure);
-}
-
-/*======================== End of Routine ============================*/
-
-/*====================================================================*/
-/*                                                                    */
-/* Name     - ffi_closure_helper_SYSV.                                */
-/*                                                                    */
-/* Function - Call a FFI closure target function.                     */
-/*                                                                    */
-/*====================================================================*/
-
-void FFI_HIDDEN
-ffi_closure_helper_SYSV (ffi_cif *cif,
-			 void (*fun)(ffi_cif*,void*,void**,void*),
-			 void *user_data,
-			 unsigned long *p_gpr,
-			 unsigned long long *p_fpr,
-			 unsigned long *p_ov)
-{
-  unsigned long long ret_buffer;
-
-  void *rvalue = &ret_buffer;
-  void **avalue;
-  void **p_arg;
-
-  int n_gpr = 0;
-  int n_fpr = 0;
-  int n_ov = 0;
-
-  ffi_type **ptr;
-  int i;
-
-  /* Allocate buffer for argument list pointers.  */
-  p_arg = avalue = alloca (cif->nargs * sizeof (void *));
-
-  /* If we returning a structure, pass the structure address
-     directly to the target function.  Otherwise, have the target
-     function store the return value to the GPR save area.  */
-  if (cif->flags & FFI390_RET_IN_MEM)
-    rvalue = (void *) p_gpr[n_gpr++];
-
-  /* Now for the arguments.  */
-  for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, p_arg++, ptr++)
-    {
-      int deref_struct_pointer = 0;
-      int type = (*ptr)->type;
-
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-      /* 16-byte long double is passed like a struct.  */
-      if (type == FFI_TYPE_LONGDOUBLE)
-	type = FFI_TYPE_STRUCT;
-#endif
-
-      /* Check how a structure type is passed.  */
-      if (type == FFI_TYPE_STRUCT || type == FFI_TYPE_COMPLEX)
-	{
-	  if (type == FFI_TYPE_COMPLEX)
-	    type = FFI_TYPE_POINTER;
-	  else
-	    type = ffi_check_struct_type (*ptr);
-
-	  /* If we pass the struct via pointer, remember to
-	     retrieve the pointer later.  */
-	  if (type == FFI_TYPE_POINTER)
-	    deref_struct_pointer = 1;
-	}
-
-      /* Pointers are passed like UINTs of the same size.  */
-      if (type == FFI_TYPE_POINTER)
-	{
-#ifdef __s390x__
-	  type = FFI_TYPE_UINT64;
-#else
-	  type = FFI_TYPE_UINT32;
-#endif
-	}
-
-      /* Now handle all primitive int/float data types.  */
-      switch (type)
-	{
-	  case FFI_TYPE_DOUBLE:
-	    if (n_fpr < MAX_FPRARGS)
-	      *p_arg = &p_fpr[n_fpr++];
-	    else
-	      *p_arg = &p_ov[n_ov],
-	      n_ov += sizeof (double) / sizeof (long);
-	    break;
-
-	  case FFI_TYPE_FLOAT:
-	    if (n_fpr < MAX_FPRARGS)
-	      *p_arg = &p_fpr[n_fpr++];
-	    else
-	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
-	    break;
-
-	  case FFI_TYPE_UINT64:
-	  case FFI_TYPE_SINT64:
-#ifdef __s390x__
-	    if (n_gpr < MAX_GPRARGS)
-	      *p_arg = &p_gpr[n_gpr++];
-	    else
-	      *p_arg = &p_ov[n_ov++];
-#else
-	    if (n_gpr == MAX_GPRARGS-1)
-	      n_gpr = MAX_GPRARGS;
-	    if (n_gpr < MAX_GPRARGS)
-	      *p_arg = &p_gpr[n_gpr], n_gpr += 2;
-	    else
-	      *p_arg = &p_ov[n_ov], n_ov += 2;
-#endif
-	    break;
-
-	  case FFI_TYPE_INT:
-	  case FFI_TYPE_UINT32:
-	  case FFI_TYPE_SINT32:
-	    if (n_gpr < MAX_GPRARGS)
-	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4;
-	    else
-	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
-	    break;
-
-	  case FFI_TYPE_UINT16:
-	  case FFI_TYPE_SINT16:
-	    if (n_gpr < MAX_GPRARGS)
-	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2;
-	    else
-	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2;
-	    break;
-
-	  case FFI_TYPE_UINT8:
-	  case FFI_TYPE_SINT8:
-	    if (n_gpr < MAX_GPRARGS)
-	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1;
-	    else
-	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1;
-	    break;
-
-	  default:
-	    FFI_ASSERT (0);
-	    break;
-        }
-
-      /* If this is a struct passed via pointer, we need to
-	 actually retrieve that pointer.  */
-      if (deref_struct_pointer)
-	*p_arg = *(void **)*p_arg;
-    }
-
-
-  /* Call the target function.  */
-  (fun) (cif, rvalue, avalue, user_data);
-
-  /* Convert the return value.  */
-  switch (cif->rtype->type)
-    {
-      /* Void is easy, and so is struct.  */
-      case FFI_TYPE_VOID:
-      case FFI_TYPE_STRUCT:
-      case FFI_TYPE_COMPLEX:
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-      case FFI_TYPE_LONGDOUBLE:
-#endif
-	break;
-
-      /* Floating point values are returned in fpr 0.  */
-      case FFI_TYPE_FLOAT:
-	p_fpr[0] = (long long) *(unsigned int *) rvalue << 32;
-	break;
-
-      case FFI_TYPE_DOUBLE:
-	p_fpr[0] = *(unsigned long long *) rvalue;
-	break;
-
-      /* Integer values are returned in gpr 2 (and gpr 3
-	 for 64-bit values on 31-bit machines).  */
-      case FFI_TYPE_UINT64:
-      case FFI_TYPE_SINT64:
-#ifdef __s390x__
-	p_gpr[0] = *(unsigned long *) rvalue;
-#else
-	p_gpr[0] = ((unsigned long *) rvalue)[0],
-	p_gpr[1] = ((unsigned long *) rvalue)[1];
-#endif
-	break;
-
-      case FFI_TYPE_POINTER:
-      case FFI_TYPE_UINT32:
-      case FFI_TYPE_UINT16:
-      case FFI_TYPE_UINT8:
-	p_gpr[0] = *(unsigned long *) rvalue;
-	break;
-
-      case FFI_TYPE_INT:
-      case FFI_TYPE_SINT32:
-      case FFI_TYPE_SINT16:
-      case FFI_TYPE_SINT8:
-	p_gpr[0] = *(signed long *) rvalue;
-	break;
-
-      default:
-        FFI_ASSERT (0);
-        break;
-    }
-}
-
-/*======================== End of Routine ============================*/
-
-/*====================================================================*/
-/*                                                                    */
-/* Name     - ffi_prep_closure_loc.                                   */
-/*                                                                    */
-/* Function - Prepare a FFI closure.                                  */
-/*                                                                    */
-/*====================================================================*/
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure *closure,
-		      ffi_cif *cif,
-		      void (*fun) (ffi_cif *, void *, void **, void *),
-		      void *user_data,
-		      void *codeloc)
-{
-  static unsigned short const template[] = {
-    0x0d10,			/* basr %r1,0 */
-#ifndef __s390x__
-    0x9801, 0x1006,		/* lm %r0,%r1,6(%r1) */
-#else
-    0xeb01, 0x100e, 0x0004,	/* lmg %r0,%r1,14(%r1) */
-#endif
-    0x07f1			/* br %r1 */
-  };
-
-  unsigned long *tramp = (unsigned long *)&closure->tramp;
-
-  if (cif->abi != FFI_SYSV)
-    return FFI_BAD_ABI;
-
-  memcpy (tramp, template, sizeof(template));
-  tramp[2] = (unsigned long)codeloc;
-  tramp[3] = (unsigned long)&ffi_closure_SYSV;
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  return FFI_OK;
-}
-
-/*======================== End of Routine ============================*/
-
-/* Build a Go language closure.  */
-
-ffi_status
-ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif,
-		     void (*fun)(ffi_cif*,void*,void**,void*))
-{
-  if (cif->abi != FFI_SYSV)
-    return FFI_BAD_ABI;
-
-  closure->tramp = ffi_go_closure_SYSV;
-  closure->cif = cif;
-  closure->fun = fun;
-
-  return FFI_OK;
-}
diff --git a/third_party/gofrontend/libffi/src/s390/ffitarget.h b/third_party/gofrontend/libffi/src/s390/ffitarget.h
deleted file mode 100644
index d8a4ee4..0000000
--- a/third_party/gofrontend/libffi/src/s390/ffitarget.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 1996-2003  Red Hat, Inc.
-   Target configuration macros for S390.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#if defined (__s390x__)
-#ifndef S390X
-#define S390X
-#endif
-#endif
-
-/* ---- System specific configurations ----------------------------------- */
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_SYSV
-} ffi_abi;
-#endif
-
-#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION
-#define FFI_TARGET_HAS_COMPLEX_TYPE
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_GO_CLOSURES 1
-#ifdef S390X
-#define FFI_TRAMPOLINE_SIZE 32
-#else
-#define FFI_TRAMPOLINE_SIZE 16
-#endif
-#define FFI_NATIVE_RAW_API 0
-
-#endif
-
diff --git a/third_party/gofrontend/libffi/src/s390/internal.h b/third_party/gofrontend/libffi/src/s390/internal.h
deleted file mode 100644
index b875578..0000000
--- a/third_party/gofrontend/libffi/src/s390/internal.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* If these values change, sysv.S must be adapted!  */
-#define FFI390_RET_DOUBLE	0
-#define FFI390_RET_FLOAT	1
-#define FFI390_RET_INT64	2
-#define FFI390_RET_INT32	3
-#define FFI390_RET_VOID		4
-
-#define FFI360_RET_MASK		7
-#define FFI390_RET_IN_MEM	8
-
-#define FFI390_RET_STRUCT	(FFI390_RET_VOID | FFI390_RET_IN_MEM)
diff --git a/third_party/gofrontend/libffi/src/s390/sysv.S b/third_party/gofrontend/libffi/src/s390/sysv.S
deleted file mode 100644
index c4b5006..0000000
--- a/third_party/gofrontend/libffi/src/s390/sysv.S
+++ /dev/null
@@ -1,325 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2000 Software AG
-            Copyright (c) 2008 Red Hat, Inc.
-
-   S390 Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-
-	.text
-
-#ifndef __s390x__
-
-	# r2:	frame
-	# r3:	ret_type
-	# r4:	ret_addr
-	# r5:	fun
-	# r6:	closure
-
-	# This assumes we are using gas.
-	.balign	8
-	.globl	ffi_call_SYSV
-	FFI_HIDDEN(ffi_call_SYSV)
-	.type	ffi_call_SYSV,%function
-ffi_call_SYSV:
-	.cfi_startproc
-	st	%r6,44(%r2)			# Save registers
-	stm	%r12,%r14,48(%r2)
-	lr	%r13,%r2			# Install frame pointer
-	.cfi_rel_offset r6, 44
-	.cfi_rel_offset r12, 48
-	.cfi_rel_offset r13, 52
-	.cfi_rel_offset r14, 56
-	.cfi_def_cfa_register r13
-	st	%r2,0(%r15)			# Set up back chain
-	sla	%r3,3				# ret_type *= 8
-	lr	%r12,%r4			# Save ret_addr
-	lr	%r1,%r5				# Save fun
-	lr	%r0,%r6				# Install static chain
-
-	# Set return address, so that there is only one indirect jump.
-#ifdef HAVE_AS_S390_ZARCH
-	larl	%r14,.Ltable
-	ar	%r14,%r3
-#else
-	basr	%r14,0
-0:	la	%r14,.Ltable-0b(%r14,%r3)
-#endif
-
-	lm	%r2,%r6,8(%r13)			# Load arguments
-	ld	%f0,64(%r13)
-	ld	%f2,72(%r13)
-	br	%r1				# ... and call function
-
-	.balign	8
-.Ltable:
-# FFI390_RET_DOUBLE
-	std	%f0,0(%r12)
-	j	.Ldone
-
-	.balign	8
-# FFI390_RET_FLOAT
-	ste	%f0,0(%r12)
-	j	.Ldone
-
-	.balign	8
-# FFI390_RET_INT64
-	st	%r3,4(%r12)
-	nop
-	# fallthru
-
-	.balign	8
-# FFI390_RET_INT32
-	st	%r2,0(%r12)
-	nop
-	# fallthru
-
-	.balign	8
-# FFI390_RET_VOID
-.Ldone:
-	l	%r14,56(%r13)
-	l	%r12,48(%r13)
-	l	%r6,44(%r13)
-	l	%r13,52(%r13)
-	.cfi_restore 14
-	.cfi_restore 13
-	.cfi_restore 12
-	.cfi_restore 6
-	.cfi_def_cfa r15, 96
-	br	%r14
-	.cfi_endproc
-	.size	 ffi_call_SYSV,.-ffi_call_SYSV
-
-
-	.balign	8
-	.globl	ffi_go_closure_SYSV
-	FFI_HIDDEN(ffi_go_closure_SYSV)
-	.type	ffi_go_closure_SYSV,%function
-ffi_go_closure_SYSV:
-	.cfi_startproc
-	stm	%r2,%r6,8(%r15)			# Save arguments
-	lr	%r4,%r0				# Load closure -> user_data
-	l	%r2,4(%r4)			#   ->cif
-	l	%r3,8(%r4)			#   ->fun
-	j	.Ldoclosure
-	.cfi_endproc
-
-	.balign	8
-	.globl	ffi_closure_SYSV
-	FFI_HIDDEN(ffi_closure_SYSV)
-	.type	ffi_closure_SYSV,%function
-ffi_closure_SYSV:
-	.cfi_startproc
-	stm	%r2,%r6,8(%r15)			# Save arguments
-	lr	%r4,%r0				# Closure
-	l	%r2,16(%r4)			#   ->cif
-	l	%r3,20(%r4)			#   ->fun
-	l	%r4,24(%r4)			#   ->user_data
-.Ldoclosure:
-	stm	%r12,%r15,48(%r15)		# Save registers
-	lr	%r12,%r15
-	.cfi_def_cfa_register r12
-	.cfi_rel_offset r6, 24
-	.cfi_rel_offset r12, 48
-	.cfi_rel_offset r13, 52
-	.cfi_rel_offset r14, 56
-	.cfi_rel_offset r15, 60
-#ifndef HAVE_AS_S390_ZARCH
-	basr	%r13,0				# Set up base register
-.Lcbase:
-	l	%r1,.Lchelper-.Lcbase(%r13)	# Get helper function
-#endif
-	ahi	%r15,-96-8			# Set up stack frame
-	st	%r12,0(%r15)			# Set up back chain
-
-	std	%f0,64(%r12)			# Save fp arguments
-	std	%f2,72(%r12)
-
-	la	%r5,96(%r12)			# Overflow
-	st	%r5,96(%r15)
-	la	%r6,64(%r12)			# FPRs
-	la	%r5,8(%r12)			# GPRs
-#ifdef HAVE_AS_S390_ZARCH
-	brasl	%r14,ffi_closure_helper_SYSV
-#else
-	bas	%r14,0(%r1,%r13)		# Call helper
-#endif
-
-	lr	%r15,%r12
-	.cfi_def_cfa_register r15
-	lm	%r12,%r14,48(%r12)		# Restore saved registers
-	l	%r6,24(%r15)
-	ld	%f0,64(%r15)			# Load return registers
-	lm	%r2,%r3,8(%r15)
-	br	%r14
-	.cfi_endproc
-
-#ifndef HAVE_AS_S390_ZARCH
-	.align 4
-.Lchelper:
-	.long	ffi_closure_helper_SYSV-.Lcbase
-#endif
-
-	.size	 ffi_closure_SYSV,.-ffi_closure_SYSV
-
-#else
-
-	# r2:	frame
-	# r3:	ret_type
-	# r4:	ret_addr
-	# r5:	fun
-	# r6:	closure
-
-	# This assumes we are using gas.
-	.balign	8
-	.globl	ffi_call_SYSV
-	FFI_HIDDEN(ffi_call_SYSV)
-	.type	ffi_call_SYSV,%function
-ffi_call_SYSV:
-	.cfi_startproc
-	stg	%r6,88(%r2)			# Save registers
-	stmg	%r12,%r14,96(%r2)
-	lgr	%r13,%r2			# Install frame pointer
-	.cfi_rel_offset r6, 88
-	.cfi_rel_offset r12, 96
-	.cfi_rel_offset r13, 104
-	.cfi_rel_offset r14, 112
-	.cfi_def_cfa_register r13
-	stg	%r2,0(%r15)			# Set up back chain
-	larl	%r14,.Ltable			# Set up return address
-	slag	%r3,%r3,3			# ret_type *= 8
-	lgr	%r12,%r4			# Save ret_addr
-	lgr	%r1,%r5				# Save fun
-	lgr	%r0,%r6				# Install static chain
-	agr	%r14,%r3
-	lmg	%r2,%r6,16(%r13)		# Load arguments
-	ld	%f0,128(%r13)
-	ld	%f2,136(%r13)
-	ld	%f4,144(%r13)
-	ld	%f6,152(%r13)
-	br	%r1				# ... and call function
-
-	.balign	8
-.Ltable:
-# FFI390_RET_DOUBLE
-	std	%f0,0(%r12)
-	j	.Ldone
-
-	.balign	8
-# FFI390_RET_DOUBLE
-	ste	%f0,0(%r12)
-	j	.Ldone
-
-	.balign	8
-# FFI390_RET_INT64
-	stg	%r2,0(%r12)
-
-	.balign	8
-# FFI390_RET_INT32
-	# Never used, as we always store type ffi_arg.
-	# But the stg above is 6 bytes and we cannot
-	# jump around this case, so fall through.
-	nop
-	nop
-
-	.balign	8
-# FFI390_RET_VOID
-.Ldone:
-	lg	%r14,112(%r13)
-	lg	%r12,96(%r13)
-	lg	%r6,88(%r13)
-	lg	%r13,104(%r13)
-	.cfi_restore r14
-	.cfi_restore r13
-	.cfi_restore r12
-	.cfi_restore r6
-	.cfi_def_cfa r15, 160
-	br	%r14
-	.cfi_endproc
-	.size	 ffi_call_SYSV,.-ffi_call_SYSV
-
-
-	.balign	8
-	.globl	ffi_go_closure_SYSV
-	FFI_HIDDEN(ffi_go_closure_SYSV)
-	.type	ffi_go_closure_SYSV,%function
-ffi_go_closure_SYSV:
-	.cfi_startproc
-	stmg	%r2,%r6,16(%r15)		# Save arguments
-	lgr	%r4,%r0				# Load closure -> user_data
-	lg	%r2,8(%r4)			#   ->cif
-	lg	%r3,16(%r4)			#   ->fun
-	j	.Ldoclosure
-	.cfi_endproc
-	.size	 ffi_go_closure_SYSV,.-ffi_go_closure_SYSV
-
-
-	.balign	8
-	.globl	ffi_closure_SYSV
-	FFI_HIDDEN(ffi_closure_SYSV)
-	.type	ffi_closure_SYSV,%function
-ffi_closure_SYSV:
-	.cfi_startproc
-	stmg	%r2,%r6,16(%r15)		# Save arguments
-	lgr	%r4,%r0				# Load closure
-	lg	%r2,32(%r4)			#   ->cif
-	lg	%r3,40(%r4)			#   ->fun
-	lg	%r4,48(%r4)			#   ->user_data
-.Ldoclosure:
-	stmg	%r13,%r15,104(%r15)		# Save registers
-	lgr	%r13,%r15
-	.cfi_def_cfa_register r13
-	.cfi_rel_offset r6, 48
-	.cfi_rel_offset r13, 104
-	.cfi_rel_offset r14, 112
-	.cfi_rel_offset r15, 120
-	aghi	%r15,-160-16			# Set up stack frame
-	stg	%r13,0(%r15)			# Set up back chain
-
-	std	%f0,128(%r13)			# Save fp arguments
-	std	%f2,136(%r13)
-	std	%f4,144(%r13)
-	std	%f6,152(%r13)
-	la	%r5,160(%r13)			# Overflow
-	stg	%r5,160(%r15)
-	la	%r6,128(%r13)			# FPRs
-	la	%r5,16(%r13)			# GPRs
-	brasl	%r14,ffi_closure_helper_SYSV	# Call helper
-
-	lgr	%r15,%r13
-	.cfi_def_cfa_register r15
-	lmg	%r13,%r14,104(%r13)		# Restore saved registers
-	lg	%r6,48(%r15)
-	ld	%f0,128(%r15)			# Load return registers
-	lg	%r2,16(%r15)
-	br	%r14
-	.cfi_endproc
-	.size	 ffi_closure_SYSV,.-ffi_closure_SYSV
-#endif /* !s390x */
-
-#if defined __ELF__ && defined __linux__
-	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/third_party/gofrontend/libffi/src/sh/ffi.c b/third_party/gofrontend/libffi/src/sh/ffi.c
deleted file mode 100644
index 9ec86bf..0000000
--- a/third_party/gofrontend/libffi/src/sh/ffi.c
+++ /dev/null
@@ -1,717 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2002-2008, 2012 Kaz Kojima
-           Copyright (c) 2008 Red Hat, Inc.
-   
-   SuperH Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-
-#define NGREGARG 4
-#if defined(__SH4__)
-#define NFREGARG 8
-#endif
-
-#if defined(__HITACHI__)
-#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
-#else
-#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
-#endif
-
-/* If the structure has essentially an unique element, return its type.  */
-static int
-simple_type (ffi_type *arg)
-{
-  if (arg->type != FFI_TYPE_STRUCT)
-    return arg->type;
-  else if (arg->elements[1])
-    return FFI_TYPE_STRUCT;
-
-  return simple_type (arg->elements[0]);
-}
-
-static int
-return_type (ffi_type *arg)
-{
-  unsigned short type;
-
-  if (arg->type != FFI_TYPE_STRUCT)
-    return arg->type;
-
-  type = simple_type (arg->elements[0]);
-  if (! arg->elements[1])
-    {
-      switch (type)
-	{
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT8:
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT16:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT32:
-	  return FFI_TYPE_INT;
-
-	default:
-	  return type;
-	}
-    }
-
-  /* gcc uses r0/r1 pair for some kind of structures.  */
-  if (arg->size <= 2 * sizeof (int))
-    {
-      int i = 0;
-      ffi_type *e;
-
-      while ((e = arg->elements[i++]))
-	{
-	  type = simple_type (e);
-	  switch (type)
-	    {
-	    case FFI_TYPE_SINT32:
-	    case FFI_TYPE_UINT32:
-	    case FFI_TYPE_INT:
-	    case FFI_TYPE_FLOAT:
-	      return FFI_TYPE_UINT64;
-
-	    default:
-	      break;
-	    }
-	}
-    }
-
-  return FFI_TYPE_STRUCT;
-}
-
-/* ffi_prep_args is called by the assembly routine once stack space
-   has been allocated for the function's arguments */
-
-void ffi_prep_args(char *stack, extended_cif *ecif)
-{
-  register unsigned int i;
-  register int tmp;
-  register unsigned int avn;
-  register void **p_argv;
-  register char *argp;
-  register ffi_type **p_arg;
-  int greg, ireg;
-#if defined(__SH4__)
-  int freg = 0;
-#endif
-
-  tmp = 0;
-  argp = stack;
-
-  if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT)
-    {
-      *(void **) argp = ecif->rvalue;
-      argp += 4;
-      ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0;
-    }
-  else
-    ireg = 0;
-
-  /* Set arguments for registers.  */
-  greg = ireg;
-  avn = ecif->cif->nargs;
-  p_argv = ecif->avalue;
-
-  for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
-    {
-      size_t z;
-
-      z = (*p_arg)->size;
-      if (z < sizeof(int))
-	{
-	  if (greg++ >= NGREGARG)
-	    continue;
-
-	  z = sizeof(int);
-	  switch ((*p_arg)->type)
-	    {
-	    case FFI_TYPE_SINT8:
-	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
-	      break;
-  
-	    case FFI_TYPE_UINT8:
-	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
-	      break;
-  
-	    case FFI_TYPE_SINT16:
-	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
-	      break;
-  
-	    case FFI_TYPE_UINT16:
-	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
-	      break;
-  
-	    case FFI_TYPE_STRUCT:
-	      *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
-	      break;
-
-	    default:
-	      FFI_ASSERT(0);
-	    }
-	  argp += z;
-	}
-      else if (z == sizeof(int))
-	{
-#if defined(__SH4__)
-	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
-	    {
-	      if (freg++ >= NFREGARG)
-		continue;
-	    }
-	  else
-#endif
-	    {
-	      if (greg++ >= NGREGARG)
-		continue;
-	    }
-	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
-	  argp += z;
-	}
-#if defined(__SH4__)
-      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
-	{
-	  if (freg + 1 >= NFREGARG)
-	    continue;
-	  freg = (freg + 1) & ~1;
-	  freg += 2;
-	  memcpy (argp, *p_argv, z);
-	  argp += z;
-	}
-#endif
-      else
-	{
-	  int n = (z + sizeof (int) - 1) / sizeof (int);
-#if defined(__SH4__)
-	  if (greg + n - 1 >= NGREGARG)
-	    continue;
-#else
-	  if (greg >= NGREGARG)
-	    continue;
-#endif
-	  greg += n;
-	  memcpy (argp, *p_argv, z);
-	  argp += n * sizeof (int);
-	}
-    }
-
-  /* Set arguments on stack.  */
-  greg = ireg;
-#if defined(__SH4__)
-  freg = 0;
-#endif
-  p_argv = ecif->avalue;
-
-  for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
-    {
-      size_t z;
-
-      z = (*p_arg)->size;
-      if (z < sizeof(int))
-	{
-	  if (greg++ < NGREGARG)
-	    continue;
-
-	  z = sizeof(int);
-	  switch ((*p_arg)->type)
-	    {
-	    case FFI_TYPE_SINT8:
-	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
-	      break;
-  
-	    case FFI_TYPE_UINT8:
-	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
-	      break;
-  
-	    case FFI_TYPE_SINT16:
-	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
-	      break;
-  
-	    case FFI_TYPE_UINT16:
-	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
-	      break;
-  
-	    case FFI_TYPE_STRUCT:
-	      *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
-	      break;
-
-	    default:
-	      FFI_ASSERT(0);
-	    }
-	  argp += z;
-	}
-      else if (z == sizeof(int))
-	{
-#if defined(__SH4__)
-	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
-	    {
-	      if (freg++ < NFREGARG)
-		continue;
-	    }
-	  else
-#endif
-	    {
-	      if (greg++ < NGREGARG)
-		continue;
-	    }
-	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
-	  argp += z;
-	}
-#if defined(__SH4__)
-      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
-	{
-	  if (freg + 1 < NFREGARG)
-	    {
-	      freg = (freg + 1) & ~1;
-	      freg += 2;
-	      continue;
-	    }
-	  memcpy (argp, *p_argv, z);
-	  argp += z;
-	}
-#endif
-      else
-	{
-	  int n = (z + sizeof (int) - 1) / sizeof (int);
-	  if (greg + n - 1 < NGREGARG)
-	    {
-	      greg += n;
-	      continue;
-	    }
-#if (! defined(__SH4__))
-	  else if (greg < NGREGARG)
-	    {
-	      greg = NGREGARG;
-	      continue;
-	    }
-#endif
-	  memcpy (argp, *p_argv, z);
-	  argp += n * sizeof (int);
-	}
-    }
-
-  return;
-}
-
-/* Perform machine dependent cif processing */
-ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  int i, j;
-  int size, type;
-  int n, m;
-  int greg;
-#if defined(__SH4__)
-  int freg = 0;
-#endif
-
-  cif->flags = 0;
-
-  greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) &&
-	  STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0;
-
-#if defined(__SH4__)
-  for (i = j = 0; i < cif->nargs && j < 12; i++)
-    {
-      type = (cif->arg_types)[i]->type;
-      switch (type)
-	{
-	case FFI_TYPE_FLOAT:
-	  if (freg >= NFREGARG)
-	    continue;
-	  freg++;
-	  cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
-	  j++;
-	  break;
-
-	case FFI_TYPE_DOUBLE:
-	  if ((freg + 1) >= NFREGARG)
-	    continue;
-	  freg = (freg + 1) & ~1;
-	  freg += 2;
-	  cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
-	  j++;
-	  break;
-	      
-	default:
-	  size = (cif->arg_types)[i]->size;
-	  n = (size + sizeof (int) - 1) / sizeof (int);
-	  if (greg + n - 1 >= NGREGARG)
-		continue;
-	  greg += n;
-	  for (m = 0; m < n; m++)
-	    cif->flags += FFI_TYPE_INT << (2 * j++);
-	  break;
-	}
-    }
-#else
-  for (i = j = 0; i < cif->nargs && j < 4; i++)
-    {
-      size = (cif->arg_types)[i]->size;
-      n = (size + sizeof (int) - 1) / sizeof (int);
-      if (greg >= NGREGARG)
-	continue;
-      else if (greg + n - 1 >= NGREGARG)
-	n = NGREGARG - greg;
-      greg += n;
-      for (m = 0; m < n; m++)
-        cif->flags += FFI_TYPE_INT << (2 * j++);
-    }
-#endif
-
-  /* Set the return type flag */
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_STRUCT:
-      cif->flags += (unsigned) (return_type (cif->rtype)) << 24;
-      break;
-
-    case FFI_TYPE_VOID:
-    case FFI_TYPE_FLOAT:
-    case FFI_TYPE_DOUBLE:
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-      cif->flags += (unsigned) cif->rtype->type << 24;
-      break;
-
-    default:
-      cif->flags += FFI_TYPE_INT << 24;
-      break;
-    }
-
-  return FFI_OK;
-}
-
-extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
-			  unsigned, unsigned, unsigned *, void (*fn)(void));
-
-void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  extended_cif ecif;
-  UINT64 trvalue;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-  
-  /* If the return value is a struct and we don't have a return	*/
-  /* value address then we need to make one		        */
-
-  if (cif->rtype->type == FFI_TYPE_STRUCT
-      && return_type (cif->rtype) != FFI_TYPE_STRUCT)
-    ecif.rvalue = &trvalue;
-  else if ((rvalue == NULL) && 
-      (cif->rtype->type == FFI_TYPE_STRUCT))
-    {
-      ecif.rvalue = alloca(cif->rtype->size);
-    }
-  else
-    ecif.rvalue = rvalue;
-
-  switch (cif->abi) 
-    {
-    case FFI_SYSV:
-      ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue,
-		    fn);
-      break;
-    default:
-      FFI_ASSERT(0);
-      break;
-    }
-
-  if (rvalue
-      && cif->rtype->type == FFI_TYPE_STRUCT
-      && return_type (cif->rtype) != FFI_TYPE_STRUCT)
-    memcpy (rvalue, &trvalue, cif->rtype->size);
-}
-
-extern void ffi_closure_SYSV (void);
-#if defined(__SH4__)
-extern void __ic_invalidate (void *line);
-#endif
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun)(ffi_cif*, void*, void**, void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  unsigned int *tramp;
-  unsigned int insn;
-
-  if (cif->abi != FFI_SYSV)
-    return FFI_BAD_ABI;
-
-  tramp = (unsigned int *) &closure->tramp[0];
-  /* Set T bit if the function returns a struct pointed with R2.  */
-  insn = (return_type (cif->rtype) == FFI_TYPE_STRUCT
-	  ? 0x0018 /* sett */
-	  : 0x0008 /* clrt */);
-
-#ifdef __LITTLE_ENDIAN__
-  tramp[0] = 0xd301d102;
-  tramp[1] = 0x0000412b | (insn << 16);
-#else
-  tramp[0] = 0xd102d301;
-  tramp[1] = 0x412b0000 | insn;
-#endif
-  *(void **) &tramp[2] = (void *)codeloc;          /* ctx */
-  *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-#if defined(__SH4__)
-  /* Flush the icache.  */
-  __ic_invalidate(codeloc);
-#endif
-
-  return FFI_OK;
-}
-
-/* Basically the trampoline invokes ffi_closure_SYSV, and on 
- * entry, r3 holds the address of the closure.
- * After storing the registers that could possibly contain
- * parameters to be passed into the stack frame and setting
- * up space for a return value, ffi_closure_SYSV invokes the 
- * following helper function to do most of the work.
- */
-
-#ifdef __LITTLE_ENDIAN__
-#define OFS_INT8	0
-#define OFS_INT16	0
-#else
-#define OFS_INT8	3
-#define OFS_INT16	2
-#endif
-
-int
-ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, 
-			 unsigned long *pgr, unsigned long *pfr, 
-			 unsigned long *pst)
-{
-  void **avalue;
-  ffi_type **p_arg;
-  int i, avn;
-  int ireg, greg = 0;
-#if defined(__SH4__)
-  int freg = 0;
-#endif
-  ffi_cif *cif; 
-
-  cif = closure->cif;
-  avalue = alloca(cif->nargs * sizeof(void *));
-
-  /* Copy the caller's structure return value address so that the closure
-     returns the data directly to the caller.  */
-  if (cif->rtype->type == FFI_TYPE_STRUCT && STRUCT_VALUE_ADDRESS_WITH_ARG)
-    {
-      rvalue = (void *) *pgr++;
-      ireg = 1;
-    }
-  else
-    ireg = 0;
-
-  cif = closure->cif;
-  greg = ireg;
-  avn = cif->nargs;
-
-  /* Grab the addresses of the arguments from the stack frame.  */
-  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
-    {
-      size_t z;
-
-      z = (*p_arg)->size;
-      if (z < sizeof(int))
-	{
-	  if (greg++ >= NGREGARG)
-	    continue;
-
-	  z = sizeof(int);
-	  switch ((*p_arg)->type)
-	    {
-	    case FFI_TYPE_SINT8:
-	    case FFI_TYPE_UINT8:
-	      avalue[i] = (((char *)pgr) + OFS_INT8);
-	      break;
-  
-	    case FFI_TYPE_SINT16:
-	    case FFI_TYPE_UINT16:
-	      avalue[i] = (((char *)pgr) + OFS_INT16);
-	      break;
-  
-	    case FFI_TYPE_STRUCT:
-	      avalue[i] = pgr;
-	      break;
-
-	    default:
-	      FFI_ASSERT(0);
-	    }
-	  pgr++;
-	}
-      else if (z == sizeof(int))
-	{
-#if defined(__SH4__)
-	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
-	    {
-	      if (freg++ >= NFREGARG)
-		continue;
-	      avalue[i] = pfr;
-	      pfr++;
-	    }
-	  else
-#endif
-	    {
-	      if (greg++ >= NGREGARG)
-		continue;
-	      avalue[i] = pgr;
-	      pgr++;
-	    }
-	}
-#if defined(__SH4__)
-      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
-	{
-	  if (freg + 1 >= NFREGARG)
-	    continue;
-	  if (freg & 1)
-	    pfr++;
-	  freg = (freg + 1) & ~1;
-	  freg += 2;
-	  avalue[i] = pfr;
-	  pfr += 2;
-	}
-#endif
-      else
-	{
-	  int n = (z + sizeof (int) - 1) / sizeof (int);
-#if defined(__SH4__)
-	  if (greg + n - 1 >= NGREGARG)
-	    continue;
-#else
-	  if (greg >= NGREGARG)
-	    continue;
-#endif
-	  greg += n;
-	  avalue[i] = pgr;
-	  pgr += n;
-	}
-    }
-
-  greg = ireg;
-#if defined(__SH4__)
-  freg = 0;
-#endif
-
-  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
-    {
-      size_t z;
-
-      z = (*p_arg)->size;
-      if (z < sizeof(int))
-	{
-	  if (greg++ < NGREGARG)
-	    continue;
-
-	  z = sizeof(int);
-	  switch ((*p_arg)->type)
-	    {
-	    case FFI_TYPE_SINT8:
-	    case FFI_TYPE_UINT8:
-	      avalue[i] = (((char *)pst) + OFS_INT8);
-	      break;
-  
-	    case FFI_TYPE_SINT16:
-	    case FFI_TYPE_UINT16:
-	      avalue[i] = (((char *)pst) + OFS_INT16);
-	      break;
-  
-	    case FFI_TYPE_STRUCT:
-	      avalue[i] = pst;
-	      break;
-
-	    default:
-	      FFI_ASSERT(0);
-	    }
-	  pst++;
-	}
-      else if (z == sizeof(int))
-	{
-#if defined(__SH4__)
-	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
-	    {
-	      if (freg++ < NFREGARG)
-		continue;
-	    }
-	  else
-#endif
-	    {
-	      if (greg++ < NGREGARG)
-		continue;
-	    }
-	  avalue[i] = pst;
-	  pst++;
-	}
-#if defined(__SH4__)
-      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
-	{
-	  if (freg + 1 < NFREGARG)
-	    {
-	      freg = (freg + 1) & ~1;
-	      freg += 2;
-	      continue;
-	    }
-	  avalue[i] = pst;
-	  pst += 2;
-	}
-#endif
-      else
-	{
-	  int n = (z + sizeof (int) - 1) / sizeof (int);
-	  if (greg + n - 1 < NGREGARG)
-	    {
-	      greg += n;
-	      continue;
-	    }
-#if (! defined(__SH4__))
-	  else if (greg < NGREGARG)
-	    {
-	      greg += n;
-	      pst += greg - NGREGARG;
-	      continue;
-	    }
-#endif
-	  avalue[i] = pst;
-	  pst += n;
-	}
-    }
-
-  (closure->fun) (cif, rvalue, avalue, closure->user_data);
-
-  /* Tell ffi_closure_SYSV how to perform return type promotions.  */
-  return return_type (cif->rtype);
-}
diff --git a/third_party/gofrontend/libffi/src/sh/ffitarget.h b/third_party/gofrontend/libffi/src/sh/ffitarget.h
deleted file mode 100644
index a36bf42..0000000
--- a/third_party/gofrontend/libffi/src/sh/ffitarget.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012 Anthony Green
-                 Copyright (c) 1996-2003  Red Hat, Inc.
-   Target configuration macros for SuperH.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-/* ---- Generic type definitions ----------------------------------------- */
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_SYSV
-} ffi_abi;
-#endif
-
-#define FFI_CLOSURES 1
-#define FFI_TRAMPOLINE_SIZE 16
-#define FFI_NATIVE_RAW_API 0
-
-#endif
-
diff --git a/third_party/gofrontend/libffi/src/sh/sysv.S b/third_party/gofrontend/libffi/src/sh/sysv.S
deleted file mode 100644
index 5be7516..0000000
--- a/third_party/gofrontend/libffi/src/sh/sysv.S
+++ /dev/null
@@ -1,850 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima
-   
-   SuperH Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-#ifdef HAVE_MACHINE_ASM_H
-#include <machine/asm.h>
-#else
-/* XXX these lose for some platforms, I'm sure. */
-#define CNAME(x) x
-#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
-#endif
-
-#if defined(__HITACHI__)
-#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
-#else
-#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
-#endif
-
-.text
-
-	# r4:	ffi_prep_args
-	# r5:	&ecif
-	# r6:	bytes
-	# r7:	flags
-	# sp+0: rvalue
-	# sp+4: fn
-
-	# This assumes we are using gas.
-ENTRY(ffi_call_SYSV)
-	# Save registers
-.LFB1:
-	mov.l	r8,@-r15
-.LCFI0:
-	mov.l	r9,@-r15
-.LCFI1:
-	mov.l	r10,@-r15
-.LCFI2:
-	mov.l	r12,@-r15
-.LCFI3:
-	mov.l	r14,@-r15
-.LCFI4:
-	sts.l	pr,@-r15
-.LCFI5:
-	mov	r15,r14
-.LCFI6:
-#if defined(__SH4__)
-	mov	r6,r8
-	mov	r7,r9
-
-	sub	r6,r15
-	add	#-16,r15
-	mov	#~7,r0
-	and	r0,r15
-
-	mov	r4,r0
-	jsr	@r0
-	 mov	r15,r4
-
-	mov	r9,r1
-	shlr8	r9
-	shlr8	r9
-	shlr8	r9
-
-	mov	#FFI_TYPE_STRUCT,r2
-	cmp/eq	r2,r9
-	bf	1f
-#if STRUCT_VALUE_ADDRESS_WITH_ARG
- 	mov.l	@r15+,r4
-	bra	2f
-	 mov	#5,r2
-#else
- 	mov.l	@r15+,r10
-#endif
-1:
-	mov	#4,r2
-2:
-	mov	#4,r3
-
-L_pass:
-	cmp/pl	r8
-	bf	L_call_it
-
-	mov	r1,r0
-	and	#3,r0
-
-L_pass_d:
-	cmp/eq	#FFI_TYPE_DOUBLE,r0
-	bf	L_pass_f
-
-	mov	r3,r0
-	and	#1,r0
-	tst	r0,r0
-	bt	1f
-	add	#1,r3
-1:
-	mov	#12,r0
-	cmp/hs	r0,r3
-	bt/s	3f
-	 shlr2	r1
-	bsr	L_pop_d
-	 nop
-3:
-	add	#2,r3
-	bra	L_pass
-	 add	#-8,r8
-
-L_pop_d:
-	mov	r3,r0
-	add	r0,r0
-	add	r3,r0
-	add	#-12,r0
-	braf	r0
-	 nop
-#ifdef __LITTLE_ENDIAN__
-	fmov.s	@r15+,fr5
-	rts
-	 fmov.s	@r15+,fr4
-	fmov.s	@r15+,fr7
-	rts
-	 fmov.s	@r15+,fr6
-	fmov.s	@r15+,fr9
-	rts
-	 fmov.s	@r15+,fr8
-	fmov.s	@r15+,fr11
-	rts
-	 fmov.s	@r15+,fr10
-#else
-	fmov.s	@r15+,fr4
-	rts
-	 fmov.s	@r15+,fr5
-	fmov.s	@r15+,fr6
-	rts
-	 fmov.s	@r15+,fr7
-	fmov.s	@r15+,fr8
-	rts
-	 fmov.s	@r15+,fr9
-	fmov.s	@r15+,fr10
-	rts
-	 fmov.s	@r15+,fr11
-#endif
-
-L_pass_f:
-	cmp/eq	#FFI_TYPE_FLOAT,r0
-	bf	L_pass_i
-
-	mov	#12,r0
-	cmp/hs	r0,r3
-	bt/s	2f
-	 shlr2	r1
-	bsr	L_pop_f
-	 nop
-2:
-	add	#1,r3
-	bra	L_pass
-	 add	#-4,r8
-
-L_pop_f:
-	mov	r3,r0
-	shll2	r0
-	add	#-16,r0
-	braf	r0
-	 nop
-#ifdef __LITTLE_ENDIAN__
-	rts
-	 fmov.s	@r15+,fr5
-	rts
-	 fmov.s	@r15+,fr4
-	rts
-	 fmov.s	@r15+,fr7
-	rts
-	 fmov.s	@r15+,fr6
-	rts
-	 fmov.s	@r15+,fr9
-	rts
-	 fmov.s	@r15+,fr8
-	rts
-	 fmov.s	@r15+,fr11
-	rts
-	 fmov.s	@r15+,fr10
-#else
-	rts
-	 fmov.s	@r15+,fr4
-	rts
-	 fmov.s	@r15+,fr5
-	rts
-	 fmov.s	@r15+,fr6
-	rts
-	 fmov.s	@r15+,fr7
-	rts
-	 fmov.s	@r15+,fr8
-	rts
-	 fmov.s	@r15+,fr9
-	rts
-	 fmov.s	@r15+,fr10
-	rts
-	 fmov.s	@r15+,fr11
-#endif
-
-L_pass_i:
-	cmp/eq	#FFI_TYPE_INT,r0
-	bf	L_call_it
-
-	mov	#8,r0
-	cmp/hs	r0,r2
-	bt/s	2f
-	 shlr2	r1
-	bsr	L_pop_i
-	 nop
-2:
-	add	#1,r2
-	bra	L_pass
-	 add	#-4,r8
-
-L_pop_i:
-	mov	r2,r0
-	shll2	r0
-	add	#-16,r0
-	braf	r0
-	 nop
-	rts
-	 mov.l	@r15+,r4
-	rts
-	 mov.l	@r15+,r5
-	rts
-	 mov.l	@r15+,r6
-	rts
-	 mov.l	@r15+,r7
-
-L_call_it:
-	# call function
-#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
-	mov	r10, r2
-#endif
-	mov.l  @(28,r14),r1
-	jsr    @r1
-	 nop
-
-L_ret_d:
-	mov	#FFI_TYPE_DOUBLE,r2
-	cmp/eq	r2,r9
-	bf	L_ret_ll
-
-	mov.l	@(24,r14),r1
-#ifdef __LITTLE_ENDIAN__
-	fmov.s	fr1,@r1
-	add	#4,r1
-	bra	L_epilogue
-	 fmov.s	fr0,@r1
-#else
-	fmov.s	fr0,@r1
-	add	#4,r1
-	bra	L_epilogue
-	 fmov.s	fr1,@r1
-#endif
-
-L_ret_ll:
-	mov	#FFI_TYPE_SINT64,r2
-	cmp/eq	r2,r9
-	bt/s	1f
-	 mov	#FFI_TYPE_UINT64,r2
-	cmp/eq	r2,r9
-	bf	L_ret_f
-
-1:
-	mov.l	@(24,r14),r2
-	mov.l	r0,@r2
-	bra	L_epilogue
-	 mov.l	r1,@(4,r2)
-
-L_ret_f:
-	mov	#FFI_TYPE_FLOAT,r2
-	cmp/eq	r2,r9
-	bf	L_ret_i
-
-	mov.l	@(24,r14),r1
-	bra	L_epilogue
-	 fmov.s	fr0,@r1
-
-L_ret_i:
-	mov	#FFI_TYPE_INT,r2
-	cmp/eq	r2,r9
-	bf	L_epilogue
-
-	mov.l	@(24,r14),r1
-	bra	L_epilogue
-	 mov.l	r0,@r1
-
-L_epilogue:
-	# Remove the space we pushed for the args
-	mov   r14,r15
-
-	lds.l  @r15+,pr
-	mov.l  @r15+,r14
-	mov.l  @r15+,r12
-	mov.l  @r15+,r10
-	mov.l  @r15+,r9
-	rts
-	 mov.l  @r15+,r8
-#else
-	mov	r6,r8
-	mov	r7,r9
-
-	sub	r6,r15
-	add	#-16,r15
-	mov	#~7,r0
-	and	r0,r15
-
-	mov	r4,r0
-	jsr	@r0
-	 mov	r15,r4
-
-	mov	r9,r3
-	shlr8	r9
-	shlr8	r9
-	shlr8	r9
-
-	mov	#FFI_TYPE_STRUCT,r2
-	cmp/eq	r2,r9
-	bf	1f
-#if STRUCT_VALUE_ADDRESS_WITH_ARG
-	mov.l	@r15+,r4
-	bra	2f
-	 mov	#5,r2
-#else
-	mov.l	@r15+,r10
-#endif
-1:
-	mov	#4,r2
-2:
-
-L_pass:
-	cmp/pl	r8
-	bf	L_call_it
-
-	mov	r3,r0
-	and	#3,r0
-
-L_pass_d:
-	cmp/eq	#FFI_TYPE_DOUBLE,r0
-	bf	L_pass_i
-
-	mov	r15,r0
-	and	#7,r0
-	tst	r0,r0
-	bt	1f
-	add	#4,r15
-1:
-	mov	#8,r0
-	cmp/hs	r0,r2
-	bt/s	2f
-	 shlr2	r3
-	bsr	L_pop_d
-	 nop
-2:
-	add	#2,r2
-	bra	L_pass
-	 add	#-8,r8
-
-L_pop_d:
-	mov	r2,r0
-	add	r0,r0
-	add	r2,r0
-	add	#-12,r0
-	add	r0,r0
-	braf	r0
-	 nop
-	mov.l	@r15+,r4
-	rts
-	 mov.l	@r15+,r5
-	mov.l	@r15+,r5
-	rts
-	 mov.l	@r15+,r6
-	mov.l	@r15+,r6
-	rts
-	 mov.l	@r15+,r7
-	rts
-	 mov.l	@r15+,r7
-
-L_pass_i:
-	cmp/eq	#FFI_TYPE_INT,r0
-	bf	L_call_it
-
-	mov	#8,r0
-	cmp/hs	r0,r2
-	bt/s	2f
-	 shlr2	r3
-	bsr	L_pop_i
-	 nop
-2:
-	add	#1,r2
-	bra	L_pass
-	 add	#-4,r8
-
-L_pop_i:
-	mov	r2,r0
-	shll2	r0
-	add	#-16,r0
-	braf	r0
-	 nop
-	rts
-	 mov.l	@r15+,r4
-	rts
-	 mov.l	@r15+,r5
-	rts
-	 mov.l	@r15+,r6
-	rts
-	 mov.l	@r15+,r7
-
-L_call_it:
-	# call function
-#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
-	mov	r10, r2
-#endif
-	mov.l  @(28,r14),r1
-	jsr    @r1
-	 nop
-
-L_ret_d:
-	mov	#FFI_TYPE_DOUBLE,r2
-	cmp/eq	r2,r9
-	bf	L_ret_ll
-
-	mov.l	@(24,r14),r2
-	mov.l	r0,@r2
-	bra	L_epilogue
-	 mov.l	r1,@(4,r2)
-
-L_ret_ll:
-	mov	#FFI_TYPE_SINT64,r2
-	cmp/eq	r2,r9
-	bt/s	1f
-	 mov	#FFI_TYPE_UINT64,r2
-	cmp/eq	r2,r9
-	bf	L_ret_i
-
-1:
-	mov.l	@(24,r14),r2
-	mov.l	r0,@r2
-	bra	L_epilogue
-	 mov.l	r1,@(4,r2)
-
-L_ret_i:
-	mov	#FFI_TYPE_FLOAT,r2
-	cmp/eq	r2,r9
-	bt	1f
-	mov	#FFI_TYPE_INT,r2
-	cmp/eq	r2,r9
-	bf	L_epilogue
-1:
-	mov.l	@(24,r14),r1
-	bra	L_epilogue
-	 mov.l	r0,@r1
-
-L_epilogue:
-	# Remove the space we pushed for the args
-	mov   r14,r15
-
-	lds.l  @r15+,pr
-	mov.l  @r15+,r14
-	mov.l  @r15+,r12
-	mov.l  @r15+,r10
-	mov.l  @r15+,r9
-	rts
-	 mov.l  @r15+,r8
-#endif
-.LFE1:
-.ffi_call_SYSV_end:
-        .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
-
-.globl	ffi_closure_helper_SYSV
-
-ENTRY(ffi_closure_SYSV)
-.LFB2:
-	mov.l	r7,@-r15
-.LCFI7:
-	mov.l	r6,@-r15
-.LCFI8:
-	mov.l	r5,@-r15
-.LCFI9:
-	mov.l	r4,@-r15
-.LCFIA:
-	mov.l	r14,@-r15
-.LCFIB:
-	sts.l	pr,@-r15
-
-	/* Stack layout:	
-	   xx bytes (on stack parameters)
-	   16 bytes (register parameters)
-	    4 bytes (saved frame pointer)
-	    4 bytes (saved return address)
-	   32 bytes (floating register parameters, SH-4 only)
-	    8 bytes (result)
-	    4 bytes (pad)
-	    4 bytes (5th arg)
-	   <- new stack pointer
-	*/
-.LCFIC:
-#if defined(__SH4__)
-	add	#-48,r15
-#else
-	add	#-16,r15
-#endif
-.LCFID:
-	mov	r15,r14
-.LCFIE:
-
-#if defined(__SH4__)
-	mov	r14,r1
-	add	#48,r1
-#ifdef __LITTLE_ENDIAN__
-	fmov.s	fr10,@-r1
-	fmov.s	fr11,@-r1
-	fmov.s	fr8,@-r1
-	fmov.s	fr9,@-r1
-	fmov.s	fr6,@-r1
-	fmov.s	fr7,@-r1
-	fmov.s	fr4,@-r1
-	fmov.s	fr5,@-r1
-#else
-	fmov.s	fr11,@-r1
-	fmov.s	fr10,@-r1
-	fmov.s	fr9,@-r1
-	fmov.s	fr8,@-r1
-	fmov.s	fr7,@-r1
-	fmov.s	fr6,@-r1
-	fmov.s	fr5,@-r1
-	fmov.s	fr4,@-r1
-#endif
-	mov	r1,r7
-	mov	r14,r6
-	add	#56,r6
-#else
-	mov	r14,r6
-	add	#24,r6
-#endif
-
-	bt/s	10f
-	 mov	r2, r5
-	mov	r14,r1
-	add	#8,r1
-	mov	r1,r5
-10:
-
-	mov	r14,r1
-#if defined(__SH4__)
-	add	#72,r1
-#else
-	add	#40,r1
-#endif
-	mov.l	r1,@r14
-
-#ifdef PIC
-	mov.l	L_got,r1
-	mova	L_got,r0
-	add	r0,r1
-	mov.l	L_helper,r0
-	add	r1,r0
-#else
-	mov.l	L_helper,r0
-#endif
-	jsr	@r0
-	 mov	r3,r4
-
-	shll	r0
-	mov	r0,r1
-	mova	L_table,r0
-	add	r1,r0
-	mov.w	@r0,r0
-	mov	r14,r2
-	braf	r0
-	 add	#8,r2
-0:
-	.align 2
-#ifdef PIC
-L_got:
-	.long	_GLOBAL_OFFSET_TABLE_
-L_helper:
-	.long	ffi_closure_helper_SYSV@GOTOFF
-#else
-L_helper:
-	.long	ffi_closure_helper_SYSV
-#endif
-L_table:
-	.short L_case_v - 0b	/* FFI_TYPE_VOID */
-	.short L_case_i - 0b	/* FFI_TYPE_INT */
-#if defined(__SH4__)
-	.short L_case_f - 0b	/* FFI_TYPE_FLOAT */
-	.short L_case_d - 0b	/* FFI_TYPE_DOUBLE */
-	.short L_case_d - 0b	/* FFI_TYPE_LONGDOUBLE */
-#else
-	.short L_case_i - 0b	/* FFI_TYPE_FLOAT */
-	.short L_case_ll - 0b	/* FFI_TYPE_DOUBLE */
-	.short L_case_ll - 0b	/* FFI_TYPE_LONGDOUBLE */
-#endif
-	.short L_case_uq - 0b	/* FFI_TYPE_UINT8 */
-	.short L_case_q - 0b	/* FFI_TYPE_SINT8 */
-	.short L_case_uh - 0b	/* FFI_TYPE_UINT16 */
-	.short L_case_h - 0b	/* FFI_TYPE_SINT16 */
-	.short L_case_i - 0b	/* FFI_TYPE_UINT32 */
-	.short L_case_i - 0b	/* FFI_TYPE_SINT32 */
-	.short L_case_ll - 0b	/* FFI_TYPE_UINT64 */
-	.short L_case_ll - 0b	/* FFI_TYPE_SINT64 */
-	.short L_case_v - 0b	/* FFI_TYPE_STRUCT */
-	.short L_case_i - 0b	/* FFI_TYPE_POINTER */
-
-#if defined(__SH4__)
-L_case_d:
-#ifdef __LITTLE_ENDIAN__
-	fmov.s	@r2+,fr1
-	bra	L_case_v
-	 fmov.s	@r2,fr0
-#else
-	fmov.s	@r2+,fr0
-	bra	L_case_v
-	 fmov.s	@r2,fr1
-#endif
-
-L_case_f:
-	bra	L_case_v
-	 fmov.s	@r2,fr0
-#endif
-	
-L_case_ll:
-	mov.l	@r2+,r0
-	bra	L_case_v
-	 mov.l	@r2,r1
-	
-L_case_i:
-	bra	L_case_v
-	 mov.l	@r2,r0
-	
-L_case_q:
-#ifdef __LITTLE_ENDIAN__
-#else
-	add	#3,r2
-#endif
-	bra	L_case_v
-	 mov.b	@r2,r0
-
-L_case_uq:
-#ifdef __LITTLE_ENDIAN__
-#else
-	add	#3,r2
-#endif
-	mov.b	@r2,r0
-	bra	L_case_v
-	 extu.b r0,r0
-
-L_case_h:
-#ifdef __LITTLE_ENDIAN__
-#else
-	add	#2,r2
-#endif
-	bra	L_case_v
-	 mov.w	@r2,r0
-
-L_case_uh:
-#ifdef __LITTLE_ENDIAN__
-#else
-	add	#2,r2
-#endif
-	mov.w	@r2,r0
-	extu.w	r0,r0
-	/* fall through */
-
-L_case_v:
-#if defined(__SH4__)
-	add	#48,r15
-#else
-	add	#16,r15
-#endif
-	lds.l	@r15+,pr
-	mov.l	@r15+,r14
-	rts
-	 add	#16,r15
-.LFE2:
-.ffi_closure_SYSV_end:
-        .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
-
-#if defined __ELF__ && defined __linux__
-	.section	.note.GNU-stack,"",@progbits
-#endif
-
-	.section	".eh_frame","aw",@progbits
-__FRAME_BEGIN__:
-	.4byte	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
-.LSCIE1:
-	.4byte	0x0	/* CIE Identifier Tag */
-	.byte	0x1	/* CIE Version */
-#ifdef PIC
-	.ascii "zR\0"	/* CIE Augmentation */
-#else
-	.byte	0x0	/* CIE Augmentation */
-#endif
-	.byte	0x1	/* uleb128 0x1; CIE Code Alignment Factor */
-	.byte	0x7c	/* sleb128 -4; CIE Data Alignment Factor */
-	.byte	0x11	/* CIE RA Column */
-#ifdef PIC
-	.uleb128 0x1	/* Augmentation size */
-	.byte	0x10	/* FDE Encoding (pcrel) */
-#endif
-	.byte	0xc	/* DW_CFA_def_cfa */
-	.byte	0xf	/* uleb128 0xf */
-	.byte	0x0	/* uleb128 0x0 */
-	.align	2
-.LECIE1:
-.LSFDE1:
-	.4byte	.LEFDE1-.LASFDE1	/* FDE Length */
-.LASFDE1:
-	.4byte	.LASFDE1-__FRAME_BEGIN__	/* FDE CIE offset */
-#ifdef PIC
-	.4byte	.LFB1-.	/* FDE initial location */
-#else
-	.4byte	.LFB1	/* FDE initial location */
-#endif
-	.4byte	.LFE1-.LFB1	 /* FDE address range */
-#ifdef PIC
-	.uleb128 0x0	/* Augmentation size */
-#endif
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFI0-.LFB1
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.byte	0x4	/* uleb128 0x4 */
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFI1-.LCFI0
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.byte	0x8	/* uleb128 0x4 */
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFI2-.LCFI1
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.byte	0xc	/* uleb128 0x4 */
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFI3-.LCFI2
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.byte	0x10	/* uleb128 0x4 */
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFI4-.LCFI3
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.byte	0x14	/* uleb128 0x4 */
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFI5-.LCFI4
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.byte	0x18	/* uleb128 0x4 */
-	.byte	0x91	/* DW_CFA_offset, column 0x11 */
-	.byte	0x6	/* uleb128 0x6 */
-	.byte	0x8e	/* DW_CFA_offset, column 0xe */
-	.byte	0x5	/* uleb128 0x5 */
-	.byte	0x8c	/* DW_CFA_offset, column 0xc */
-	.byte	0x4	/* uleb128 0x4 */
-	.byte	0x8a	/* DW_CFA_offset, column 0xa */
-	.byte	0x3	/* uleb128 0x3 */
-	.byte	0x89	/* DW_CFA_offset, column 0x9 */
-	.byte	0x2	/* uleb128 0x2 */
-	.byte	0x88	/* DW_CFA_offset, column 0x8 */
-	.byte	0x1	/* uleb128 0x1 */
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFI6-.LCFI5
-	.byte	0xd	/* DW_CFA_def_cfa_register */
-	.byte	0xe	/* uleb128 0xe */
-	.align	2
-.LEFDE1:
-
-.LSFDE3:
-	.4byte	.LEFDE3-.LASFDE3	/* FDE Length */
-.LASFDE3:
-	.4byte	.LASFDE3-__FRAME_BEGIN__	/* FDE CIE offset */
-#ifdef PIC
-	.4byte	.LFB2-.	/* FDE initial location */
-#else
-	.4byte	.LFB2	/* FDE initial location */
-#endif
-	.4byte	.LFE2-.LFB2	 /* FDE address range */
-#ifdef PIC
-	.uleb128 0x0	/* Augmentation size */
-#endif
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFI7-.LFB2
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.byte	0x4	/* uleb128 0x4 */
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFI8-.LCFI7
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.byte	0x8	/* uleb128 0x4 */
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFI9-.LCFI8
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.byte	0xc	/* uleb128 0x4 */
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFIA-.LCFI9
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.byte	0x10	/* uleb128 0x4 */
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFIB-.LCFIA
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.byte	0x14	/* uleb128 0x4 */
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFIC-.LCFIB
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.byte	0x18	/* uleb128 0x4 */
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFID-.LCFIC
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-#if defined(__SH4__)
-	.byte	24+48	/* uleb128 24+48 */
-#else
-	.byte	24+16	/* uleb128 24+16 */
-#endif
-	.byte	0x91	/* DW_CFA_offset, column 0x11 */
-	.byte	0x6	/* uleb128 0x6 */
-	.byte	0x8e	/* DW_CFA_offset, column 0xe */
-	.byte	0x5	/* uleb128 0x5 */
-	.byte	0x84	/* DW_CFA_offset, column 0x4 */
-	.byte	0x4	/* uleb128 0x4 */
-	.byte	0x85	/* DW_CFA_offset, column 0x5 */
-	.byte	0x3	/* uleb128 0x3 */
-	.byte	0x86	/* DW_CFA_offset, column 0x6 */
-	.byte	0x2	/* uleb128 0x2 */
-	.byte	0x87	/* DW_CFA_offset, column 0x7 */
-	.byte	0x1	/* uleb128 0x1 */
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	.LCFIE-.LCFID
-	.byte	0xd	/* DW_CFA_def_cfa_register */
-	.byte	0xe	/* uleb128 0xe */
-	.align	2
-.LEFDE3:
diff --git a/third_party/gofrontend/libffi/src/sh64/ffi.c b/third_party/gofrontend/libffi/src/sh64/ffi.c
deleted file mode 100644
index 123b87a..0000000
--- a/third_party/gofrontend/libffi/src/sh64/ffi.c
+++ /dev/null
@@ -1,469 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2003, 2004, 2006, 2007, 2012 Kaz Kojima
-           Copyright (c) 2008 Anthony Green
-   
-   SuperH SHmedia Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-
-#define NGREGARG 8
-#define NFREGARG 12
-
-static int
-return_type (ffi_type *arg)
-{
-
-  if (arg->type != FFI_TYPE_STRUCT)
-    return arg->type;
-
-  /* gcc uses r2 if the result can be packed in on register.  */
-  if (arg->size <= sizeof (UINT8))
-    return FFI_TYPE_UINT8;
-  else if (arg->size <= sizeof (UINT16))
-    return FFI_TYPE_UINT16;
-  else if (arg->size <= sizeof (UINT32))
-    return FFI_TYPE_UINT32;
-  else if (arg->size <= sizeof (UINT64))
-    return FFI_TYPE_UINT64;
-
-  return FFI_TYPE_STRUCT;
-}
-
-/* ffi_prep_args is called by the assembly routine once stack space
-   has been allocated for the function's arguments */
-
-void ffi_prep_args(char *stack, extended_cif *ecif)
-{
-  register unsigned int i;
-  register unsigned int avn;
-  register void **p_argv;
-  register char *argp;
-  register ffi_type **p_arg;
-
-  argp = stack;
-
-  if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT)
-    {
-      *(void **) argp = ecif->rvalue;
-      argp += sizeof (UINT64);
-    }
-
-  avn = ecif->cif->nargs;
-  p_argv = ecif->avalue;
-
-  for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
-    {
-      size_t z;
-      int align;
-
-      z = (*p_arg)->size;
-      align = (*p_arg)->alignment;
-      if (z < sizeof (UINT32))
-	{
-	  switch ((*p_arg)->type)
-	    {
-	    case FFI_TYPE_SINT8:
-	      *(SINT64 *) argp = (SINT64) *(SINT8 *)(*p_argv);
-	      break;
-  
-	    case FFI_TYPE_UINT8:
-	      *(UINT64 *) argp = (UINT64) *(UINT8 *)(*p_argv);
-	      break;
-  
-	    case FFI_TYPE_SINT16:
-	      *(SINT64 *) argp = (SINT64) *(SINT16 *)(*p_argv);
-	      break;
-  
-	    case FFI_TYPE_UINT16:
-	      *(UINT64 *) argp = (UINT64) *(UINT16 *)(*p_argv);
-	      break;
-  
-	    case FFI_TYPE_STRUCT:
-	      memcpy (argp, *p_argv, z);
-	      break;
-
-	    default:
-	      FFI_ASSERT(0);
-	    }
-	  argp += sizeof (UINT64);
-	}
-      else if (z == sizeof (UINT32) && align == sizeof (UINT32))
-	{
-	  switch ((*p_arg)->type)
-	    {
-	    case FFI_TYPE_INT:
-	    case FFI_TYPE_SINT32:
-	      *(SINT64 *) argp = (SINT64) *(SINT32 *) (*p_argv);
-	      break;
-
-	    case FFI_TYPE_FLOAT:
-	    case FFI_TYPE_POINTER:
-	    case FFI_TYPE_UINT32:
-	    case FFI_TYPE_STRUCT:
-	      *(UINT64 *) argp = (UINT64) *(UINT32 *) (*p_argv);
-	      break;
-
-	    default:
-	      FFI_ASSERT(0);
-	      break;
-	    }
-	  argp += sizeof (UINT64);
-	}
-      else if (z == sizeof (UINT64)
-	       && align == sizeof (UINT64)
-	       && ((int) *p_argv & (sizeof (UINT64) - 1)) == 0)
-	{
-	  *(UINT64 *) argp = *(UINT64 *) (*p_argv);
-	  argp += sizeof (UINT64);
-	}
-      else
-	{
-	  int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64);
-
-	  memcpy (argp, *p_argv, z);
-	  argp += n * sizeof (UINT64);
-	}
-    }
-
-  return;
-}
-
-/* Perform machine dependent cif processing */
-ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  int i, j;
-  int size, type;
-  int n, m;
-  int greg;
-  int freg;
-  int fpair = -1;
-
-  greg = (return_type (cif->rtype) == FFI_TYPE_STRUCT ? 1 : 0);
-  freg = 0;
-  cif->flags2 = 0;
-
-  for (i = j = 0; i < cif->nargs; i++)
-    {
-      type = (cif->arg_types)[i]->type;
-      switch (type)
-	{
-	case FFI_TYPE_FLOAT:
-	  greg++;
-	  cif->bytes += sizeof (UINT64) - sizeof (float);
-	  if (freg >= NFREGARG - 1)
-	    continue;
-	  if (fpair < 0)
-	    {
-	      fpair = freg;
-	      freg += 2;
-	    }
-	  else
-	    fpair = -1;
-	  cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++);
-	  break;
-
-	case FFI_TYPE_DOUBLE:
-	  if (greg++ >= NGREGARG && (freg + 1) >= NFREGARG)
-	    continue;
-	  if ((freg + 1) < NFREGARG)
-	    {
-	      freg += 2;
-	      cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++);
-	    }
-	  else
-	    cif->flags2 += FFI_TYPE_INT << (2 * j++);
-	  break;
-	      
-	default:
-	  size = (cif->arg_types)[i]->size;
-	  if (size < sizeof (UINT64))
-	    cif->bytes += sizeof (UINT64) - size;
-	  n = (size + sizeof (UINT64) - 1) / sizeof (UINT64);
-	  if (greg >= NGREGARG)
-	    continue;
-	  else if (greg + n - 1 >= NGREGARG)
-	    greg = NGREGARG;
-	  else
-	    greg += n;
-	  for (m = 0; m < n; m++)
-	    cif->flags2 += FFI_TYPE_INT << (2 * j++);
-	  break;
-	}
-    }
-
-  /* Set the return type flag */
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_STRUCT:
-      cif->flags = return_type (cif->rtype);
-      break;
-
-    case FFI_TYPE_VOID:
-    case FFI_TYPE_FLOAT:
-    case FFI_TYPE_DOUBLE:
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-      cif->flags = cif->rtype->type;
-      break;
-
-    default:
-      cif->flags = FFI_TYPE_INT;
-      break;
-    }
-
-  return FFI_OK;
-}
-
-/*@-declundef@*/
-/*@-exportheader@*/
-extern void ffi_call_SYSV(void (*)(char *, extended_cif *), 
-			  /*@out@*/ extended_cif *, 
-			  unsigned, unsigned, long long,
-			  /*@out@*/ unsigned *, 
-			  void (*fn)(void));
-/*@=declundef@*/
-/*@=exportheader@*/
-
-void ffi_call(/*@dependent@*/ ffi_cif *cif, 
-	      void (*fn)(void), 
-	      /*@out@*/ void *rvalue, 
-	      /*@dependent@*/ void **avalue)
-{
-  extended_cif ecif;
-  UINT64 trvalue;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-  
-  /* If the return value is a struct and we don't have a return	*/
-  /* value address then we need to make one		        */
-
-  if (cif->rtype->type == FFI_TYPE_STRUCT
-      && return_type (cif->rtype) != FFI_TYPE_STRUCT)
-    ecif.rvalue = &trvalue;
-  else if ((rvalue == NULL) && 
-      (cif->rtype->type == FFI_TYPE_STRUCT))
-    {
-      ecif.rvalue = alloca(cif->rtype->size);
-    }
-  else
-    ecif.rvalue = rvalue;
-
-  switch (cif->abi) 
-    {
-    case FFI_SYSV:
-      ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, cif->flags2,
-		    ecif.rvalue, fn);
-      break;
-    default:
-      FFI_ASSERT(0);
-      break;
-    }
-
-  if (rvalue
-      && cif->rtype->type == FFI_TYPE_STRUCT
-      && return_type (cif->rtype) != FFI_TYPE_STRUCT)
-    memcpy (rvalue, &trvalue, cif->rtype->size);
-}
-
-extern void ffi_closure_SYSV (void);
-extern void __ic_invalidate (void *line);
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure *closure,
-		      ffi_cif *cif,
-		      void (*fun)(ffi_cif*, void*, void**, void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  unsigned int *tramp;
-
-  if (cif->abi != FFI_SYSV)
-    return FFI_BAD_ABI;
-
-  tramp = (unsigned int *) &closure->tramp[0];
-  /* Since ffi_closure is an aligned object, the ffi trampoline is
-     called as an SHcompact code.  Sigh.
-     SHcompact part:
-     mova @(1,pc),r0; add #1,r0; jmp @r0; nop;
-     SHmedia part:
-     movi fnaddr >> 16,r1; shori fnaddr,r1; ptabs/l r1,tr0
-     movi cxt >> 16,r1; shori cxt,r1; blink tr0,r63  */
-#ifdef __LITTLE_ENDIAN__
-  tramp[0] = 0x7001c701;
-  tramp[1] = 0x0009402b;
-#else
-  tramp[0] = 0xc7017001;
-  tramp[1] = 0x402b0009;
-#endif
-  tramp[2] = 0xcc000010 | (((UINT32) ffi_closure_SYSV) >> 16) << 10;
-  tramp[3] = 0xc8000010 | (((UINT32) ffi_closure_SYSV) & 0xffff) << 10;
-  tramp[4] = 0x6bf10600;
-  tramp[5] = 0xcc000010 | (((UINT32) codeloc) >> 16) << 10;
-  tramp[6] = 0xc8000010 | (((UINT32) codeloc) & 0xffff) << 10;
-  tramp[7] = 0x4401fff0;
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  /* Flush the icache.  */
-  asm volatile ("ocbwb %0,0; synco; icbi %1,0; synci" : : "r" (tramp),
-		"r"(codeloc));
-
-  return FFI_OK;
-}
-
-/* Basically the trampoline invokes ffi_closure_SYSV, and on 
- * entry, r3 holds the address of the closure.
- * After storing the registers that could possibly contain
- * parameters to be passed into the stack frame and setting
- * up space for a return value, ffi_closure_SYSV invokes the 
- * following helper function to do most of the work.
- */
-
-int
-ffi_closure_helper_SYSV (ffi_closure *closure, UINT64 *rvalue, 
-			 UINT64 *pgr, UINT64 *pfr, UINT64 *pst)
-{
-  void **avalue;
-  ffi_type **p_arg;
-  int i, avn;
-  int greg, freg;
-  ffi_cif *cif;
-  int fpair = -1;
-
-  cif = closure->cif;
-  avalue = alloca (cif->nargs * sizeof (void *));
-
-  /* Copy the caller's structure return value address so that the closure
-     returns the data directly to the caller.  */
-  if (return_type (cif->rtype) == FFI_TYPE_STRUCT)
-    {
-      rvalue = (UINT64 *) *pgr;
-      greg = 1;
-    }
-  else
-    greg = 0;
-
-  freg = 0;
-  cif = closure->cif;
-  avn = cif->nargs;
-
-  /* Grab the addresses of the arguments from the stack frame.  */
-  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
-    {
-      size_t z;
-      void *p;
-
-      z = (*p_arg)->size;
-      if (z < sizeof (UINT32))
-	{
-	  p = pgr + greg++;
-
-	  switch ((*p_arg)->type)
-	    {
-	    case FFI_TYPE_SINT8:
-	    case FFI_TYPE_UINT8:
-	    case FFI_TYPE_SINT16:
-	    case FFI_TYPE_UINT16:
-	    case FFI_TYPE_STRUCT:
-#ifdef __LITTLE_ENDIAN__
-	      avalue[i] = p;
-#else
-	      avalue[i] = ((char *) p) + sizeof (UINT32) - z;
-#endif
-	      break;
-
-	    default:
-	      FFI_ASSERT(0);
-	    }
-	}
-      else if (z == sizeof (UINT32))
-	{
-	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
-	    {
-	      if (freg < NFREGARG - 1)
-		{
-		  if (fpair >= 0)
-		    {
-		      avalue[i] = (UINT32 *) pfr + fpair;
-		      fpair = -1;
-		    }
-		  else
-		    {
-#ifdef __LITTLE_ENDIAN__
-		      fpair = freg;
-		      avalue[i] = (UINT32 *) pfr + (1 ^ freg);
-#else
-		      fpair = 1 ^ freg;
-		      avalue[i] = (UINT32 *) pfr + freg;
-#endif
-		      freg += 2;
-		    }
-		}
-	      else
-#ifdef __LITTLE_ENDIAN__
-		avalue[i] = pgr + greg;
-#else
-		avalue[i] = (UINT32 *) (pgr + greg) + 1;
-#endif
-	    }
-	  else
-#ifdef __LITTLE_ENDIAN__
-	    avalue[i] = pgr + greg;
-#else
-	    avalue[i] = (UINT32 *) (pgr + greg) + 1;
-#endif
-	  greg++;
-	}
-      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
-	{
-	  if (freg + 1 >= NFREGARG)
-	    avalue[i] = pgr + greg;
-	  else
-	    {
-	      avalue[i] = pfr + (freg >> 1);
-	      freg += 2;
-	    }
-	  greg++;
-	}
-      else
-	{
-	  int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64);
-
-	  avalue[i] = pgr + greg;
-	  greg += n;
-	}
-    }
-
-  (closure->fun) (cif, rvalue, avalue, closure->user_data);
-
-  /* Tell ffi_closure_SYSV how to perform return type promotions.  */
-  return return_type (cif->rtype);
-}
-
diff --git a/third_party/gofrontend/libffi/src/sh64/ffitarget.h b/third_party/gofrontend/libffi/src/sh64/ffitarget.h
deleted file mode 100644
index 08a6fe9..0000000
--- a/third_party/gofrontend/libffi/src/sh64/ffitarget.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 1996-2003  Red Hat, Inc.
-   Target configuration macros for SuperH - SHmedia.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-/* ---- Generic type definitions ----------------------------------------- */
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_SYSV
-} ffi_abi;
-
-#define FFI_EXTRA_CIF_FIELDS long long flags2
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_TRAMPOLINE_SIZE 32
-#define FFI_NATIVE_RAW_API 0
-
-#endif
-
diff --git a/third_party/gofrontend/libffi/src/sh64/sysv.S b/third_party/gofrontend/libffi/src/sh64/sysv.S
deleted file mode 100644
index c4587d5..0000000
--- a/third_party/gofrontend/libffi/src/sh64/sysv.S
+++ /dev/null
@@ -1,539 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima
-   
-   SuperH SHmedia Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
- 
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-#ifdef HAVE_MACHINE_ASM_H
-#include <machine/asm.h>
-#else
-/* XXX these lose for some platforms, I'm sure. */
-#define CNAME(x) x
-#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
-#endif
-
-#ifdef __LITTLE_ENDIAN__
-#define OFS_FLT	0
-#else
-#define OFS_FLT	4
-#endif
-
-	.section	.text..SHmedia32,"ax"
-
-	# r2:	ffi_prep_args
-	# r3:	&ecif
-	# r4:	bytes
-	# r5:	flags
-	# r6:	flags2
-	# r7:	rvalue
-	# r8:	fn
-
-	# This assumes we are using gas.
-	.align	5
-ENTRY(ffi_call_SYSV)
-	# Save registers
-.LFB1:
-	addi.l	r15, -48, r15
-.LCFI0:
-	st.q	r15, 40, r32
-	st.q	r15, 32, r31
-	st.q	r15, 24, r30
-	st.q	r15, 16, r29
-	st.q	r15, 8, r28
-	st.l	r15, 4, r18
-	st.l	r15, 0, r14
-.LCFI1:
-	add.l	r15, r63, r14
-.LCFI2:
-#	add	r4, r63, r28
-	add	r5, r63, r29
-	add	r6, r63, r30
-	add	r7, r63, r31
-	add	r8, r63, r32
-
-	addi	r4, (64 + 7), r4
-	andi	r4, ~7, r4
-	sub.l	r15, r4, r15
-
-	ptabs/l	r2, tr0
-	add	r15, r63, r2
-	blink	tr0, r18
-
-	addi	r15, 64, r22
-	movi	0, r0
-	movi	0, r1
-	movi	-1, r23
-
-	pt/l	1f, tr1
-	bnei/l	r29, FFI_TYPE_STRUCT, tr1
-	ld.l	r15, 0, r19
-	addi	r15, 8, r15
-	addi	r0, 1, r0
-1:
-
-.L_pass:
-	andi	r30, 3, r20
-	shlri	r30, 2, r30
-
-	pt/l	.L_call_it, tr0
-	pt/l	.L_pass_i, tr1
-	pt/l	.L_pass_f, tr2
-
-	beqi/l	r20, FFI_TYPE_VOID, tr0
-	beqi/l	r20, FFI_TYPE_INT, tr1
-	beqi/l	r20, FFI_TYPE_FLOAT, tr2
-
-.L_pass_d:
-	addi	r0, 1, r0
-	pt/l	3f, tr0
-	movi	12, r20
-	bge/l	r1, r20, tr0
-
-	pt/l	.L_pop_d, tr1
-	pt/l	2f, tr0
-	blink	tr1, r63
-2:
-	addi.l	r15, 8, r15
-3:
-	pt/l	.L_pass, tr0
-	addi	r1, 2, r1
-	blink	tr0, r63
-
-.L_pop_d:
-	pt/l	.L_pop_d_tbl, tr1
-	gettr	tr1, r20
-	shlli	r1, 2, r21
-	add	r20, r21, r20
-	ptabs/l	r20, tr1
-	blink	tr1, r63
-
-.L_pop_d_tbl:
-	fld.d	r15, 0, dr0
-	blink	tr0, r63
-	fld.d	r15, 0, dr2
-	blink	tr0, r63
-	fld.d	r15, 0, dr4
-	blink	tr0, r63
-	fld.d	r15, 0, dr6
-	blink	tr0, r63
-	fld.d	r15, 0, dr8
-	blink	tr0, r63
-	fld.d	r15, 0, dr10
-	blink	tr0, r63
-
-.L_pass_f:
-	addi	r0, 1, r0
-	pt/l	3f, tr0
-	movi	12, r20
-	bge/l	r1, r20, tr0
-
-	pt/l	.L_pop_f, tr1
-	pt/l	2f, tr0
-	blink	tr1, r63
-2:
-	addi.l	r15, 8, r15
-3:
-	pt/l	.L_pass, tr0
-	blink	tr0, r63
-
-.L_pop_f:
-	pt/l	.L_pop_f_tbl, tr1
-	pt/l	5f, tr2
-	gettr	tr1, r20
-	bge/l	r23, r63, tr2
-	add	r1, r63, r23 
-	shlli	r1, 3, r21
-	addi	r1, 2, r1
-	add	r20, r21, r20
-	ptabs/l	r20, tr1
-	blink	tr1, r63
-5:
-	addi	r23, 1, r21
-	movi	-1, r23
-	shlli	r21, 3, r21
-	add	r20, r21, r20
-	ptabs/l	r20, tr1
-	blink	tr1, r63
-
-.L_pop_f_tbl:
-	fld.s	r15, OFS_FLT, fr0
-	blink	tr0, r63
-	fld.s	r15, OFS_FLT, fr1
-	blink	tr0, r63
-	fld.s	r15, OFS_FLT, fr2
-	blink	tr0, r63
-	fld.s	r15, OFS_FLT, fr3
-	blink	tr0, r63
-	fld.s	r15, OFS_FLT, fr4
-	blink	tr0, r63
-	fld.s	r15, OFS_FLT, fr5
-	blink	tr0, r63
-	fld.s	r15, OFS_FLT, fr6
-	blink	tr0, r63
-	fld.s	r15, OFS_FLT, fr7
-	blink	tr0, r63
-	fld.s	r15, OFS_FLT, fr8
-	blink	tr0, r63
-	fld.s	r15, OFS_FLT, fr9
-	blink	tr0, r63
-	fld.s	r15, OFS_FLT, fr10
-	blink	tr0, r63
-	fld.s	r15, OFS_FLT, fr11
-	blink	tr0, r63
-
-.L_pass_i:
-	pt/l	3f, tr0
-	movi	8, r20
-	bge/l	r0, r20, tr0
-
-	pt/l	.L_pop_i, tr1
-	pt/l	2f, tr0
-	blink	tr1, r63
-2:
-	addi.l	r15, 8, r15
-3:
-	pt/l	.L_pass, tr0
-	addi	r0, 1, r0
-	blink	tr0, r63
-
-.L_pop_i:
-	pt/l	.L_pop_i_tbl, tr1
-	gettr	tr1, r20
-	shlli	r0, 3, r21
-	add	r20, r21, r20
-	ptabs/l	r20, tr1
-	blink	tr1, r63
-
-.L_pop_i_tbl:
-	ld.q	r15, 0, r2
-	blink	tr0, r63
-	ld.q	r15, 0, r3
-	blink	tr0, r63
-	ld.q	r15, 0, r4
-	blink	tr0, r63
-	ld.q	r15, 0, r5
-	blink	tr0, r63
-	ld.q	r15, 0, r6
-	blink	tr0, r63
-	ld.q	r15, 0, r7
-	blink	tr0, r63
-	ld.q	r15, 0, r8
-	blink	tr0, r63
-	ld.q	r15, 0, r9
-	blink	tr0, r63
-
-.L_call_it:
-	# call function
-	pt/l	1f, tr1
-	bnei/l	r29, FFI_TYPE_STRUCT, tr1
-	add	r19, r63, r2
-1:
-	add	r22, r63, r15
-	ptabs/l	r32, tr0
-	blink	tr0, r18
-
-	pt/l	.L_ret_i, tr0
-	pt/l	.L_ret_ll, tr1
-	pt/l	.L_ret_d, tr2
-	pt/l	.L_ret_f, tr3
-	pt/l	.L_epilogue, tr4
-
-	beqi/l	r29, FFI_TYPE_INT, tr0
-	beqi/l	r29, FFI_TYPE_UINT32, tr0
-	beqi/l	r29, FFI_TYPE_SINT64, tr1
-	beqi/l	r29, FFI_TYPE_UINT64, tr1
-	beqi/l	r29, FFI_TYPE_DOUBLE, tr2
-	beqi/l	r29, FFI_TYPE_FLOAT, tr3
-
-	pt/l	.L_ret_q, tr0
-	pt/l	.L_ret_h, tr1
-
-	beqi/l	r29, FFI_TYPE_UINT8, tr0
-	beqi/l	r29, FFI_TYPE_UINT16, tr1
-	blink	tr4, r63
-
-.L_ret_d:
-	fst.d	r31, 0, dr0
-	blink	tr4, r63
-
-.L_ret_ll:
-	st.q	r31, 0, r2
-	blink	tr4, r63
-
-.L_ret_f:
-	fst.s	r31, OFS_FLT, fr0
-	blink	tr4, r63
-
-.L_ret_q:
-	st.b	r31, 0, r2
-	blink	tr4, r63
-
-.L_ret_h:
-	st.w	r31, 0, r2
-	blink	tr4, r63
-
-.L_ret_i:
-	st.l	r31, 0, r2
-	# Fall
-
-.L_epilogue:
-	# Remove the space we pushed for the args
-	add	r14, r63, r15
-
-	ld.l	r15, 0, r14
-	ld.l	r15, 4, r18
-	ld.q	r15, 8, r28
-	ld.q	r15, 16, r29
-	ld.q	r15, 24, r30
-	ld.q	r15, 32, r31
-	ld.q	r15, 40, r32
-	addi.l	r15, 48, r15
-	ptabs	r18, tr0
-	blink	tr0, r63
-
-.LFE1:
-.ffi_call_SYSV_end:
-	.size	 CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
-
-	.align	5
-ENTRY(ffi_closure_SYSV)
-.LFB2:
-	addi.l	r15, -136, r15
-.LCFI3:
-	st.l	r15, 12, r18
-	st.l	r15, 8, r14
-	st.l	r15, 4, r12
-.LCFI4:
-	add	r15, r63, r14
-.LCFI5:
-	/* Stack layout:	
-	   ...
-	   64 bytes (register parameters)
-	   48 bytes (floating register parameters)
-	    8 bytes (result)
-	    4 bytes (r18)
-	    4 bytes (r14)
-	    4 bytes (r12)
-	    4 bytes (for align)
-	   <- new stack pointer
-	*/
-	fst.d	r14, 24, dr0
-	fst.d	r14, 32, dr2
-	fst.d	r14, 40, dr4
-	fst.d	r14, 48, dr6
-	fst.d	r14, 56, dr8
-	fst.d	r14, 64, dr10
-	st.q	r14, 72, r2
-	st.q	r14, 80, r3
-	st.q	r14, 88, r4
-	st.q	r14, 96, r5
-	st.q	r14, 104, r6
-	st.q	r14, 112, r7
-	st.q	r14, 120, r8
-	st.q	r14, 128, r9
-
-	add	r1, r63, r2
-	addi	r14, 16, r3
-	addi	r14, 72, r4
-	addi	r14, 24, r5
-	addi	r14, 136, r6
-#ifdef PIC
-	movi	(((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) >> 16) & 65535), r12
-        shori	((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) & 65535), r12
-.LPCS0:	ptrel/u r12, tr0
-	movi	((ffi_closure_helper_SYSV@GOTPLT) & 65535), r1
-	gettr	tr0, r12
-	ldx.l	r1, r12, r1
-	ptabs	r1, tr0
-#else
-	pt/l	ffi_closure_helper_SYSV, tr0
-#endif
-	blink	tr0, r18
-
-	shlli	r2, 1, r1
-        movi    (((datalabel .L_table) >> 16) & 65535), r2
-        shori   ((datalabel .L_table) & 65535), r2
-        ldx.w   r2, r1, r1
-        add     r1, r2, r1
-	pt/l	.L_case_v, tr1
-        ptabs   r1, tr0
-        blink   tr0, r63
-
-        .align 2
-.L_table:
-	.word	.L_case_v - datalabel .L_table	/* FFI_TYPE_VOID */
-	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_INT */
-	.word	.L_case_f - datalabel .L_table	/* FFI_TYPE_FLOAT */
-	.word	.L_case_d - datalabel .L_table	/* FFI_TYPE_DOUBLE */
-	.word	.L_case_d - datalabel .L_table	/* FFI_TYPE_LONGDOUBLE */
-	.word	.L_case_uq - datalabel .L_table	/* FFI_TYPE_UINT8 */
-	.word	.L_case_q - datalabel .L_table	/* FFI_TYPE_SINT8 */
-	.word	.L_case_uh - datalabel .L_table	/* FFI_TYPE_UINT16 */
-	.word	.L_case_h - datalabel .L_table	/* FFI_TYPE_SINT16 */
-	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_UINT32 */
-	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_SINT32 */
-	.word	.L_case_ll - datalabel .L_table	/* FFI_TYPE_UINT64 */
-	.word	.L_case_ll - datalabel .L_table	/* FFI_TYPE_SINT64 */
-	.word	.L_case_v - datalabel .L_table	/* FFI_TYPE_STRUCT */
-	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_POINTER */
-
-        .align 2
-.L_case_d:
-	fld.d	r14, 16, dr0
-	blink	tr1, r63
-.L_case_f:
-	fld.s	r14, 16, fr0
-	blink	tr1, r63
-.L_case_ll:
-	ld.q	r14, 16, r2
-	blink	tr1, r63
-.L_case_i:
-	ld.l	r14, 16, r2
-	blink	tr1, r63
-.L_case_q:
-	ld.b	r14, 16, r2
-	blink	tr1, r63
-.L_case_uq:
-	ld.ub	r14, 16, r2
-	blink	tr1, r63
-.L_case_h:
-	ld.w	r14, 16, r2
-	blink	tr1, r63
-.L_case_uh:
-	ld.uw	r14, 16, r2
-	blink	tr1, r63
-.L_case_v:
-	add.l	r14, r63, r15
-	ld.l	r15, 4, r12
-	ld.l	r15, 8, r14
-	ld.l	r15, 12, r18
-	addi.l	r15, 136, r15
-	ptabs	r18, tr0
-	blink	tr0, r63
-
-.LFE2:
-.ffi_closure_SYSV_end:
-	.size	 CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
-
-#if defined __ELF__ && defined __linux__
-	.section	.note.GNU-stack,"",@progbits
-#endif
-
-	.section	".eh_frame","aw",@progbits
-__FRAME_BEGIN__:
-	.4byte	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
-.LSCIE1:
-	.4byte	0x0	/* CIE Identifier Tag */
-	.byte	0x1	/* CIE Version */
-#ifdef PIC
-	.ascii "zR\0"	/* CIE Augmentation */
-#else
-	.byte	0x0	/* CIE Augmentation */
-#endif
-	.uleb128 0x1	/* CIE Code Alignment Factor */
-	.sleb128 -4	/* CIE Data Alignment Factor */
-	.byte	0x12	/* CIE RA Column */
-#ifdef PIC
-	.uleb128 0x1	/* Augmentation size */
-	.byte	0x10	/* FDE Encoding (pcrel) */
-#endif
-	.byte	0xc	/* DW_CFA_def_cfa */
-	.uleb128 0xf
-	.uleb128 0x0
-	.align	2
-.LECIE1:
-.LSFDE1:
-	.4byte	datalabel .LEFDE1-datalabel .LASFDE1	/* FDE Length */
-.LASFDE1:
-	.4byte	datalabel .LASFDE1-datalabel __FRAME_BEGIN__
-#ifdef PIC
-	.4byte	.LFB1-.	/* FDE initial location */
-#else
-	.4byte	.LFB1	/* FDE initial location */
-#endif
-	.4byte	datalabel .LFE1-datalabel .LFB1	/* FDE address range */
-#ifdef PIC
-	.uleb128 0x0	/* Augmentation size */
-#endif
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	datalabel .LCFI0-datalabel .LFB1
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.uleb128 0x30
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	datalabel .LCFI1-datalabel .LCFI0
-	.byte   0x8e	/* DW_CFA_offset, column 0xe */
-	.uleb128 0xc
-	.byte   0x92	/* DW_CFA_offset, column 0x12 */
-	.uleb128 0xb
-	.byte   0x9c	/* DW_CFA_offset, column 0x1c */
-	.uleb128 0xa
-	.byte   0x9d	/* DW_CFA_offset, column 0x1d */
-	.uleb128 0x8
-	.byte   0x9e	/* DW_CFA_offset, column 0x1e */
-	.uleb128 0x6
-	.byte   0x9f	/* DW_CFA_offset, column 0x1f */
-	.uleb128 0x4
-	.byte   0xa0	/* DW_CFA_offset, column 0x20 */
-	.uleb128 0x2
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	datalabel .LCFI2-datalabel .LCFI1
-	.byte	0xd	/* DW_CFA_def_cfa_register */
-	.uleb128 0xe
-	.align	2
-.LEFDE1:
-
-.LSFDE3:
-	.4byte	datalabel .LEFDE3-datalabel .LASFDE3	/* FDE Length */
-.LASFDE3:
-	.4byte	datalabel .LASFDE3-datalabel __FRAME_BEGIN__
-#ifdef PIC
-	.4byte	.LFB2-.	/* FDE initial location */
-#else
-	.4byte	.LFB2	/* FDE initial location */
-#endif
-	.4byte	datalabel .LFE2-datalabel .LFB2	/* FDE address range */
-#ifdef PIC
-	.uleb128 0x0	/* Augmentation size */
-#endif
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	datalabel .LCFI3-datalabel .LFB2
-	.byte	0xe	/* DW_CFA_def_cfa_offset */
-	.uleb128 0x88
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	datalabel .LCFI4-datalabel .LCFI3
-	.byte   0x8c	/* DW_CFA_offset, column 0xc */
-	.uleb128 0x21
-	.byte   0x8e	/* DW_CFA_offset, column 0xe */
-	.uleb128 0x20
-	.byte   0x92	/* DW_CFA_offset, column 0x12 */
-	.uleb128 0x1f
-	.byte	0x4	/* DW_CFA_advance_loc4 */
-	.4byte	datalabel .LCFI5-datalabel .LCFI4
-	.byte	0xd	/* DW_CFA_def_cfa_register */
-	.uleb128 0xe
-	.align	2
-.LEFDE3:
diff --git a/third_party/gofrontend/libffi/src/sparc/ffi.c b/third_party/gofrontend/libffi/src/sparc/ffi.c
deleted file mode 100644
index d5212d8..0000000
--- a/third_party/gofrontend/libffi/src/sparc/ffi.c
+++ /dev/null
@@ -1,468 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2011, 2013 Anthony Green
-           Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc.
-   
-   SPARC Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-#include <stdlib.h>
-#include "internal.h"
-
-#ifndef SPARC64
-
-/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE;
-   all further uses in this file will refer to the 128-bit type.  */
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-# if FFI_TYPE_LONGDOUBLE != 4
-#  error FFI_TYPE_LONGDOUBLE out of date
-# endif
-#else
-# undef FFI_TYPE_LONGDOUBLE
-# define FFI_TYPE_LONGDOUBLE 4
-#endif
-
-/* Perform machine dependent cif processing */
-ffi_status FFI_HIDDEN
-ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  ffi_type *rtype = cif->rtype;
-  int rtt = rtype->type;
-  size_t bytes;
-  int i, n, flags;
-
-  /* Set the return type flag */
-  switch (rtt)
-    {
-    case FFI_TYPE_VOID:
-      flags = SPARC_RET_VOID;
-      break;
-    case FFI_TYPE_FLOAT:
-      flags = SPARC_RET_F_1;
-      break;
-    case FFI_TYPE_DOUBLE:
-      flags = SPARC_RET_F_2;
-      break;
-    case FFI_TYPE_LONGDOUBLE:
-    case FFI_TYPE_STRUCT:
-      flags = (rtype->size & 0xfff) << SPARC_SIZEMASK_SHIFT;
-      flags |= SPARC_RET_STRUCT;
-      break;
-    case FFI_TYPE_SINT8:
-      flags = SPARC_RET_SINT8;
-      break;
-    case FFI_TYPE_UINT8:
-      flags = SPARC_RET_UINT8;
-      break;
-    case FFI_TYPE_SINT16:
-      flags = SPARC_RET_SINT16;
-      break;
-    case FFI_TYPE_UINT16:
-      flags = SPARC_RET_UINT16;
-      break;
-    case FFI_TYPE_INT:
-    case FFI_TYPE_SINT32:
-    case FFI_TYPE_UINT32:
-    case FFI_TYPE_POINTER:
-      flags = SPARC_RET_UINT32;
-      break;
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-      flags = SPARC_RET_INT64;
-      break;
-    case FFI_TYPE_COMPLEX:
-      rtt = rtype->elements[0]->type;
-      switch (rtt)
-	{
-	case FFI_TYPE_FLOAT:
-	  flags = SPARC_RET_F_2;
-	  break;
-	case FFI_TYPE_DOUBLE:
-	  flags = SPARC_RET_F_4;
-	  break;
-	case FFI_TYPE_LONGDOUBLE:
-	  flags = SPARC_RET_F_8;
-	  break;
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_UINT64:
-	  flags = SPARC_RET_INT128;
-	  break;
-	case FFI_TYPE_INT:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT32:
-	  flags = SPARC_RET_INT64;
-	  break;
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT16:
-	  flags = SP_V8_RET_CPLX16;
-	  break;
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT8:
-	  flags = SP_V8_RET_CPLX8;
-	  break;
-	default:
-	  abort();
-	}
-      break;
-    default:
-      abort();
-    }
-  cif->flags = flags;
-
-  bytes = 0;
-  for (i = 0, n = cif->nargs; i < n; ++i)
-    {
-      ffi_type *ty = cif->arg_types[i];
-      size_t z = ty->size;
-      int tt = ty->type;
-
-      switch (tt)
-	{
-	case FFI_TYPE_STRUCT:
-	case FFI_TYPE_LONGDOUBLE:
-	by_reference:
-	  /* Passed by reference.  */
-	  z = 4;
-	  break;
-
-	case FFI_TYPE_COMPLEX:
-	  tt = ty->elements[0]->type;
-	  if (tt == FFI_TYPE_FLOAT || z > 8)
-	    goto by_reference;
-	  /* FALLTHRU */
-
-	default:
-	  z = ALIGN(z, 4);
-	}
-      bytes += z;
-    }
-
-  /* Sparc call frames require that space is allocated for 6 args,
-     even if they aren't used. Make that space if necessary.  */
-  if (bytes < 6 * 4)
-    bytes = 6 * 4;
-
-  /* The ABI always requires space for the struct return pointer.  */
-  bytes += 4;
-
-  /* The stack must be 2 word aligned, so round bytes up appropriately. */
-  bytes = ALIGN(bytes, 2 * 4);
-
-  /* Include the call frame to prep_args.  */
-  bytes += 4*16 + 4*8;
-  cif->bytes = bytes;
-
-  return FFI_OK;
-}
-
-extern void ffi_call_v8(ffi_cif *cif, void (*fn)(void), void *rvalue,
-			void **avalue, size_t bytes, void *closure) FFI_HIDDEN;
-
-int FFI_HIDDEN
-ffi_prep_args_v8(ffi_cif *cif, unsigned long *argp, void *rvalue, void **avalue)
-{
-  ffi_type **p_arg;
-  int flags = cif->flags;
-  int i, nargs;
-
-  if (rvalue == NULL)
-    {
-      if ((flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT)
-	{
-	  /* Since we pass the pointer to the callee, we need a value.
-	     We allowed for this space in ffi_call, before ffi_call_v8
-	     alloca'd the space.  */
-	  rvalue = (char *)argp + cif->bytes;
-	}
-      else
-	{
-	  /* Otherwise, we can ignore the return value.  */
-	  flags = SPARC_RET_VOID;
-	}
-    }
-
-  /* This could only really be done when we are returning a structure.
-     However, the space is reserved so we can do it unconditionally.  */
-  *argp++ = (unsigned long)rvalue;
-
-#ifdef USING_PURIFY
-  /* Purify will probably complain in our assembly routine,
-     unless we zero out this memory. */
-  memset(argp, 0, 6*4);
-#endif
-
-  p_arg = cif->arg_types;
-  for (i = 0, nargs = cif->nargs; i < nargs; i++)
-    {
-      ffi_type *ty = p_arg[i];
-      void *a = avalue[i];
-      int tt = ty->type;
-      size_t z;
-
-      switch (tt)
-	{
-	case FFI_TYPE_STRUCT:
-	case FFI_TYPE_LONGDOUBLE:
-	by_reference:
-	  *argp++ = (unsigned long)a;
-	  break;
-
-	case FFI_TYPE_DOUBLE:
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	  memcpy(argp, a, 8);
-	  argp += 2;
-	  break;
-
-	case FFI_TYPE_INT:
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_POINTER:
-	  *argp++ = *(unsigned *)a;
-	  break;
-
-	case FFI_TYPE_UINT8:
-	  *argp++ = *(UINT8 *)a;
-	  break;
-	case FFI_TYPE_SINT8:
-	  *argp++ = *(SINT8 *)a;
-	  break;
-	case FFI_TYPE_UINT16:
-	  *argp++ = *(UINT16 *)a;
-	  break;
-	case FFI_TYPE_SINT16:
-	  *argp++ = *(SINT16 *)a;
-	  break;
-
-        case FFI_TYPE_COMPLEX:
-	  tt = ty->elements[0]->type;
-	  z = ty->size;
-	  if (tt == FFI_TYPE_FLOAT || z > 8)
-	    goto by_reference;
-	  if (z < 4)
-	    {
-	      memcpy((char *)argp + 4 - z, a, z);
-	      argp++;
-	    }
-	  else
-	    {
-	      memcpy(argp, a, z);
-	      argp += z / 4;
-	    }
-	  break;
-
-	default:
-	  abort();
-	}
-    }
-
-  return flags;
-}
-
-static void
-ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
-	      void **avalue, void *closure)
-{
-  size_t bytes = cif->bytes;
-
-  FFI_ASSERT (cif->abi == FFI_V8);
-
-  /* If we've not got a return value, we need to create one if we've
-     got to pass the return value to the callee.  Otherwise ignore it.  */
-  if (rvalue == NULL
-      && (cif->flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT)
-    bytes += ALIGN (cif->rtype->size, 8);
-
-  ffi_call_v8(cif, fn, rvalue, avalue, -bytes, closure);
-}
-
-void
-ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, NULL);
-}
-
-void
-ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
-	     void **avalue, void *closure)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, closure);
-}
-
-#ifdef __GNUC__
-static inline void
-ffi_flush_icache (void *p)
-{
-  /* SPARC v8 requires 5 instructions for flush to be visible */
-  asm volatile ("iflush	%0; iflush %0+8; nop; nop; nop; nop; nop"
-		: : "r" (p) : "memory");
-}
-#else
-extern void ffi_flush_icache (void *) FFI_HIDDEN;
-#endif
-
-extern void ffi_closure_v8(void) FFI_HIDDEN;
-extern void ffi_go_closure_v8(void) FFI_HIDDEN;
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure *closure,
-		      ffi_cif *cif,
-		      void (*fun)(ffi_cif*, void*, void**, void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  unsigned int *tramp = (unsigned int *) &closure->tramp[0];
-  unsigned long ctx = (unsigned long) closure;
-  unsigned long fn = (unsigned long) ffi_closure_v8;
-
-  if (cif->abi != FFI_V8)
-    return FFI_BAD_ABI;
-
-  tramp[0] = 0x03000000 | fn >> 10;	/* sethi %hi(fn), %g1	*/
-  tramp[1] = 0x05000000 | ctx >> 10;	/* sethi %hi(ctx), %g2	*/
-  tramp[2] = 0x81c06000 | (fn & 0x3ff);	/* jmp   %g1+%lo(fn)	*/
-  tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or    %g2, %lo(ctx)	*/
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  ffi_flush_icache (closure);
-
-  return FFI_OK;
-}
-
-ffi_status
-ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif,
-		     void (*fun)(ffi_cif*, void*, void**, void*))
-{
-  if (cif->abi != FFI_V8)
-    return FFI_BAD_ABI;
-
-  closure->tramp = ffi_go_closure_v8;
-  closure->cif = cif;
-  closure->fun = fun;
-
-  return FFI_OK;
-}
-
-int FFI_HIDDEN
-ffi_closure_sparc_inner_v8(ffi_cif *cif, 
-			   void (*fun)(ffi_cif*, void*, void**, void*),
-			   void *user_data, void *rvalue,
-			   unsigned long *argp)
-{
-  ffi_type **arg_types;
-  void **avalue;
-  int i, nargs, flags;
-
-  arg_types = cif->arg_types;
-  nargs = cif->nargs;
-  flags = cif->flags;
-  avalue = alloca(nargs * sizeof(void *));
-
-  /* Copy the caller's structure return address so that the closure
-     returns the data directly to the caller.  Also install it so we
-     can return the address in %o0.  */
-  if ((flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT)
-    {
-      void *new_rvalue = (void *)*argp;
-      *(void **)rvalue = new_rvalue;
-      rvalue = new_rvalue;
-    }
-
-  /* Always skip the structure return address.  */
-  argp++;
-
-  /* Grab the addresses of the arguments from the stack frame.  */
-  for (i = 0; i < nargs; i++)
-    {
-      ffi_type *ty = arg_types[i];
-      int tt = ty->type;
-      void *a = argp;
-      size_t z;
-
-      switch (tt)
-	{
-	case FFI_TYPE_STRUCT:
-	case FFI_TYPE_LONGDOUBLE:
-	by_reference:
-	  /* Straight copy of invisible reference.  */
-	  a = (void *)*argp;
-	  break;
-
-	case FFI_TYPE_DOUBLE:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_UINT64:
-	  if ((unsigned long)a & 7)
-	    {
-	      /* Align on a 8-byte boundary.  */
-	      UINT64 *tmp = alloca(8);
-	      *tmp = ((UINT64)argp[0] << 32) | argp[1];
-	      a = tmp;
-	    }
-	  argp++;
-	  break;
-
-	case FFI_TYPE_INT:
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_POINTER:
-	  break;
-        case FFI_TYPE_UINT16:
-        case FFI_TYPE_SINT16:
-	  a += 2;
-	  break;
-        case FFI_TYPE_UINT8:
-        case FFI_TYPE_SINT8:
-	  a += 3;
-	  break;
-
-        case FFI_TYPE_COMPLEX:
-	  tt = ty->elements[0]->type;
-	  z = ty->size;
-	  if (tt == FFI_TYPE_FLOAT || z > 8)
-	    goto by_reference;
-	  if (z < 4)
-	    a += 4 - z;
-	  else if (z > 4)
-	    argp++;
-	  break;
-
-	default:
-	  abort();
-	}
-      argp++;
-      avalue[i] = a;
-    }
-
-  /* Invoke the closure.  */
-  fun (cif, rvalue, avalue, user_data);
-
-  /* Tell ffi_closure_sparc how to perform return type promotions.  */
-  return flags;
-}
-#endif /* !SPARC64 */
diff --git a/third_party/gofrontend/libffi/src/sparc/ffi64.c b/third_party/gofrontend/libffi/src/sparc/ffi64.c
deleted file mode 100644
index 340b198..0000000
--- a/third_party/gofrontend/libffi/src/sparc/ffi64.c
+++ /dev/null
@@ -1,608 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2011, 2013 Anthony Green
-           Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc.
-
-   SPARC Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-#include <stdlib.h>
-#include "internal.h"
-
-/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE;
-   all further uses in this file will refer to the 128-bit type.  */
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-# if FFI_TYPE_LONGDOUBLE != 4
-#  error FFI_TYPE_LONGDOUBLE out of date
-# endif
-#else
-# undef FFI_TYPE_LONGDOUBLE
-# define FFI_TYPE_LONGDOUBLE 4
-#endif
-
-#ifdef SPARC64
-
-/* Flatten the contents of a structure to the parts that are passed in
-   floating point registers.  The return is a bit mask wherein bit N
-   set means bytes [4*n, 4*n+3] are passed in %fN.
-
-   We encode both the (running) size (maximum 32) and mask (maxumum 255)
-   into one integer.  The size is placed in the low byte, so that align
-   and addition work correctly.  The mask is placed in the second byte.  */
-
-static int
-ffi_struct_float_mask (ffi_type *outer_type, int size_mask)
-{
-  ffi_type **elts;
-  ffi_type *t;
-
-  if (outer_type->type == FFI_TYPE_COMPLEX)
-    {
-      int m = 0, tt = outer_type->elements[0]->type;
-      size_t z = outer_type->size;
-
-      if (tt == FFI_TYPE_FLOAT
-	  || tt == FFI_TYPE_DOUBLE
-	  || tt == FFI_TYPE_LONGDOUBLE)
-        m = (1 << (z / 4)) - 1;
-      return (m << 8) | z;
-    }
-  FFI_ASSERT (outer_type->type == FFI_TYPE_STRUCT);
-
-  for (elts = outer_type->elements; (t = *elts) != NULL; elts++)
-    {
-      size_t z = t->size;
-      int o, m, tt;
-
-      size_mask = ALIGN(size_mask, t->alignment);
-      switch (t->type)
-	{
-	case FFI_TYPE_STRUCT:
-	  size_mask = ffi_struct_float_mask (t, size_mask);
-	  continue;
-	case FFI_TYPE_COMPLEX:
-	  tt = t->elements[0]->type;
-	  if (tt != FFI_TYPE_FLOAT
-	      && tt != FFI_TYPE_DOUBLE
-	      && tt != FFI_TYPE_LONGDOUBLE)
-	    break;
-	  /* FALLTHRU */
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_DOUBLE:
-	case FFI_TYPE_LONGDOUBLE:
-	  m = (1 << (z / 4)) - 1;	/* compute mask for type */
-	  o = (size_mask >> 2) & 0x3f;	/* extract word offset */
-	  size_mask |= m << (o + 8);	/* insert mask into place */
-	  break;
-	}
-      size_mask += z;
-    }
-
-  size_mask = ALIGN(size_mask, outer_type->alignment);
-  FFI_ASSERT ((size_mask & 0xff) == outer_type->size);
-
-  return size_mask;
-}
-
-/* Merge floating point data into integer data.  If the structure is
-   entirely floating point, simply return a pointer to the fp data.  */
-
-static void *
-ffi_struct_float_merge (int size_mask, void *vi, void *vf)
-{
-  int size = size_mask & 0xff;
-  int mask = size_mask >> 8;
-  int n = size >> 2;
-
-  if (mask == 0)
-    return vi;
-  else if (mask == (1 << n) - 1)
-    return vf;
-  else
-    {
-      unsigned int *wi = vi, *wf = vf;
-      int i;
-
-      for (i = 0; i < n; ++i)
-	if ((mask >> i) & 1)
-	  wi[i] = wf[i];
-
-      return vi;
-    }
-}
-
-/* Similar, but place the data into VD in the end.  */
-
-void FFI_HIDDEN
-ffi_struct_float_copy (int size_mask, void *vd, void *vi, void *vf)
-{
-  int size = size_mask & 0xff;
-  int mask = size_mask >> 8;
-  int n = size >> 2;
-
-  if (mask == 0)
-    ;
-  else if (mask == (1 << n) - 1)
-    vi = vf;
-  else
-    {
-      unsigned int *wd = vd, *wi = vi, *wf = vf;
-      int i;
-
-      for (i = 0; i < n; ++i)
-	wd[i] = ((mask >> i) & 1 ? wf : wi)[i];
-      return;
-    }
-  memcpy (vd, vi, size);
-}
-
-/* Perform machine dependent cif processing */
-
-static ffi_status
-ffi_prep_cif_machdep_core(ffi_cif *cif)
-{
-  ffi_type *rtype = cif->rtype;
-  int rtt = rtype->type;
-  size_t bytes = 0;
-  int i, n, flags;
-
-  /* Set the return type flag */
-  switch (rtt)
-    {
-    case FFI_TYPE_VOID:
-      flags = SPARC_RET_VOID;
-      break;
-    case FFI_TYPE_FLOAT:
-      flags = SPARC_RET_F_1;
-      break;
-    case FFI_TYPE_DOUBLE:
-      flags = SPARC_RET_F_2;
-      break;
-    case FFI_TYPE_LONGDOUBLE:
-      flags = SPARC_RET_F_4;
-      break;
-
-    case FFI_TYPE_COMPLEX:
-    case FFI_TYPE_STRUCT:
-      if (rtype->size > 32)
-	{
-	  flags = SPARC_RET_VOID | SPARC_FLAG_RET_IN_MEM;
-	  bytes = 8;
-	}
-      else
-	{
-	  int size_mask = ffi_struct_float_mask (rtype, 0);
-	  int word_size = (size_mask >> 2) & 0x3f;
-	  int all_mask = (1 << word_size) - 1;
-	  int fp_mask = size_mask >> 8;
-
-	  flags = (size_mask << SPARC_SIZEMASK_SHIFT) | SPARC_RET_STRUCT;
-
-	  /* For special cases of all-int or all-fp, we can return
-	     the value directly without popping through a struct copy.  */
-	  if (fp_mask == 0)
-	    {
-	      if (rtype->alignment >= 8)
-		{
-		  if (rtype->size == 8)
-		    flags = SPARC_RET_INT64;
-		  else if (rtype->size == 16)
-		    flags = SPARC_RET_INT128;
-		}
-	    }
-	  else if (fp_mask == all_mask)
-	    switch (word_size)
-	      {
-	      case 1: flags = SPARC_RET_F_1; break;
-	      case 2: flags = SPARC_RET_F_2; break;
-	      case 3: flags = SP_V9_RET_F_3; break;
-	      case 4: flags = SPARC_RET_F_4; break;
-	      /* 5 word structures skipped; handled via RET_STRUCT.  */
-	      case 6: flags = SPARC_RET_F_6; break;
-	      /* 7 word structures skipped; handled via RET_STRUCT.  */
-	      case 8: flags = SPARC_RET_F_8; break;
-	      }
-	}
-      break;
-
-    case FFI_TYPE_SINT8:
-      flags = SPARC_RET_SINT8;
-      break;
-    case FFI_TYPE_UINT8:
-      flags = SPARC_RET_UINT8;
-      break;
-    case FFI_TYPE_SINT16:
-      flags = SPARC_RET_SINT16;
-      break;
-    case FFI_TYPE_UINT16:
-      flags = SPARC_RET_UINT16;
-      break;
-    case FFI_TYPE_INT:
-    case FFI_TYPE_SINT32:
-      flags = SP_V9_RET_SINT32;
-      break;
-    case FFI_TYPE_UINT32:
-      flags = SPARC_RET_UINT32;
-      break;
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_POINTER:
-      flags = SPARC_RET_INT64;
-      break;
-
-    default:
-      abort();
-    }
-
-  bytes = 0;
-  for (i = 0, n = cif->nargs; i < n; ++i)
-    {
-      ffi_type *ty = cif->arg_types[i];
-      size_t z = ty->size;
-      size_t a = ty->alignment;
-
-      switch (ty->type)
-	{
-	case FFI_TYPE_COMPLEX:
-	case FFI_TYPE_STRUCT:
-	  /* Large structs passed by reference.  */
-	  if (z > 16)
-	    {
-	      a = z = 8;
-	      break;
-	    }
-	  /* Small structs may be passed in integer or fp regs or both.  */
-	  if (bytes >= 16*8)
-	    break;
-	  if ((ffi_struct_float_mask (ty, 0) & 0xff00) == 0)
-	    break;
-	  /* FALLTHRU */
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_DOUBLE:
-	case FFI_TYPE_LONGDOUBLE:
-	  flags |= SPARC_FLAG_FP_ARGS;
-	  break;
-	}
-      bytes = ALIGN(bytes, a);
-      bytes += ALIGN(z, 8);
-    }
-
-  /* Sparc call frames require that space is allocated for 6 args,
-     even if they aren't used. Make that space if necessary. */
-  if (bytes < 6 * 8)
-    bytes = 6 * 8;
-
-  /* The stack must be 2 word aligned, so round bytes up appropriately. */
-  bytes = ALIGN(bytes, 16);
-
-  /* Include the call frame to prep_args.  */
-  bytes += 8*16 + 8*8;
-
-  cif->bytes = bytes;
-  cif->flags = flags;
-  return FFI_OK;
-}
-
-ffi_status FFI_HIDDEN
-ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  cif->nfixedargs = cif->nargs;
-  return ffi_prep_cif_machdep_core(cif);
-}
-
-ffi_status FFI_HIDDEN
-ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned nfixedargs, unsigned ntotalargs)
-{
-  cif->nfixedargs = nfixedargs;
-  return ffi_prep_cif_machdep_core(cif);
-}
-
-extern void ffi_call_v9(ffi_cif *cif, void (*fn)(void), void *rvalue,
-			void **avalue, size_t bytes, void *closure) FFI_HIDDEN;
-
-/* ffi_prep_args is called by the assembly routine once stack space
-   has been allocated for the function's arguments */
-
-int FFI_HIDDEN
-ffi_prep_args_v9(ffi_cif *cif, unsigned long *argp, void *rvalue, void **avalue)
-{
-  ffi_type **p_arg;
-  int flags = cif->flags;
-  int i, nargs;
-
-  if (rvalue == NULL)
-    {
-      if (flags & SPARC_FLAG_RET_IN_MEM)
-	{
-	  /* Since we pass the pointer to the callee, we need a value.
-	     We allowed for this space in ffi_call, before ffi_call_v8
-	     alloca'd the space.  */
-	  rvalue = (char *)argp + cif->bytes;
-	}
-      else
-	{
-	  /* Otherwise, we can ignore the return value.  */
-	  flags = SPARC_RET_VOID;
-	}
-    }
-
-#ifdef USING_PURIFY
-  /* Purify will probably complain in our assembly routine,
-     unless we zero out this memory. */
-  memset(argp, 0, 6*8);
-#endif
-
-  if (flags & SPARC_FLAG_RET_IN_MEM)
-    *argp++ = (unsigned long)rvalue;
-
-  p_arg = cif->arg_types;
-  for (i = 0, nargs = cif->nargs; i < nargs; i++)
-    {
-      ffi_type *ty = p_arg[i];
-      void *a = avalue[i];
-      size_t z;
-
-      switch (ty->type)
-	{
-	case FFI_TYPE_SINT8:
-	  *argp++ = *(SINT8 *)a;
-	  break;
-	case FFI_TYPE_UINT8:
-	  *argp++ = *(UINT8 *)a;
-	  break;
-	case FFI_TYPE_SINT16:
-	  *argp++ = *(SINT16 *)a;
-	  break;
-	case FFI_TYPE_UINT16:
-	  *argp++ = *(UINT16 *)a;
-	  break;
-	case FFI_TYPE_INT:
-	case FFI_TYPE_SINT32:
-	  *argp++ = *(SINT32 *)a;
-	  break;
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_FLOAT:
-	  *argp++ = *(UINT32 *)a;
-	  break;
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_POINTER:
-	case FFI_TYPE_DOUBLE:
-	  *argp++ = *(UINT64 *)a;
-	  break;
-
-	case FFI_TYPE_LONGDOUBLE:
-	case FFI_TYPE_COMPLEX:
-	case FFI_TYPE_STRUCT:
-	  z = ty->size;
-	  if (z > 16)
-	    {
-	      /* For structures larger than 16 bytes we pass reference.  */
-	      *argp++ = (unsigned long)a;
-	      break;
-	    }
-	  if (((unsigned long)argp & 15) && ty->alignment > 8)
-	    argp++;
-	  memcpy(argp, a, z);
-	  argp += ALIGN(z, 8) / 8;
-	  break;
-
-	default:
-	  abort();
-	}
-    }
-
-  return flags;
-}
-
-static void
-ffi_call_int(ffi_cif *cif, void (*fn)(void), void *rvalue,
-	     void **avalue, void *closure)
-{
-  size_t bytes = cif->bytes;
-
-  FFI_ASSERT (cif->abi == FFI_V9);
-
-  if (rvalue == NULL && (cif->flags & SPARC_FLAG_RET_IN_MEM))
-    bytes += ALIGN (cif->rtype->size, 16);
-
-  ffi_call_v9(cif, fn, rvalue, avalue, -bytes, closure);
-}
-
-void
-ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  ffi_call_int(cif, fn, rvalue, avalue, NULL);
-}
-
-void
-ffi_call_go(ffi_cif *cif, void (*fn)(void), void *rvalue,
-	    void **avalue, void *closure)
-{
-  ffi_call_int(cif, fn, rvalue, avalue, closure);
-}
-
-#ifdef __GNUC__
-static inline void
-ffi_flush_icache (void *p)
-{
-  asm volatile ("flush	%0; flush %0+8" : : "r" (p) : "memory");
-}
-#else
-extern void ffi_flush_icache (void *) FFI_HIDDEN;
-#endif
-
-extern void ffi_closure_v9(void) FFI_HIDDEN;
-extern void ffi_go_closure_v9(void) FFI_HIDDEN;
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun)(ffi_cif*, void*, void**, void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  unsigned int *tramp = (unsigned int *) &closure->tramp[0];
-  unsigned long fn;
-
-  if (cif->abi != FFI_V9)
-    return FFI_BAD_ABI;
-
-  /* Trampoline address is equal to the closure address.  We take advantage
-     of that to reduce the trampoline size by 8 bytes. */
-  fn = (unsigned long) ffi_closure_v9;
-  tramp[0] = 0x83414000;	/* rd	%pc, %g1	*/
-  tramp[1] = 0xca586010;	/* ldx	[%g1+16], %g5	*/
-  tramp[2] = 0x81c14000;	/* jmp	%g5		*/
-  tramp[3] = 0x01000000;	/* nop			*/
-  *((unsigned long *) &tramp[4]) = fn;
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  ffi_flush_icache (closure);
-
-  return FFI_OK;
-}
-
-ffi_status
-ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif,
-		     void (*fun)(ffi_cif*, void*, void**, void*))
-{
-  if (cif->abi != FFI_V9)
-    return FFI_BAD_ABI;
-
-  closure->tramp = ffi_go_closure_v9;
-  closure->cif = cif;
-  closure->fun = fun;
-
-  return FFI_OK;
-}
-
-int FFI_HIDDEN
-ffi_closure_sparc_inner_v9(ffi_cif *cif,
-			   void (*fun)(ffi_cif*, void*, void**, void*),
-			   void *user_data, void *rvalue,
-			   unsigned long *gpr, unsigned long *fpr)
-{
-  ffi_type **arg_types;
-  void **avalue;
-  int i, argn, argx, nargs, flags, nfixedargs;
-
-  arg_types = cif->arg_types;
-  nargs = cif->nargs;
-  flags = cif->flags;
-  nfixedargs = cif->nfixedargs;
-
-  avalue = alloca(nargs * sizeof(void *));
-
-  /* Copy the caller's structure return address so that the closure
-     returns the data directly to the caller.  */
-  if (flags & SPARC_FLAG_RET_IN_MEM)
-    {
-      rvalue = (void *) gpr[0];
-      /* Skip the structure return address.  */
-      argn = 1;
-    }
-  else
-    argn = 0;
-
-  /* Grab the addresses of the arguments from the stack frame.  */
-  for (i = 0; i < nargs; i++, argn = argx)
-    {
-      int named = i < nfixedargs;
-      ffi_type *ty = arg_types[i];
-      void *a = &gpr[argn];
-      size_t z;
-
-      argx = argn + 1;
-      switch (ty->type)
-	{
-	case FFI_TYPE_COMPLEX:
-	case FFI_TYPE_STRUCT:
-	  z = ty->size;
-	  if (z > 16)
-	    a = *(void **)a;
-	  else
-	    {
-	      argx = argn + ALIGN (z, 8) / 8;
-	      if (named && argn < 16)
-		{
-		  int size_mask = ffi_struct_float_mask (ty, 0);
-		  int argn_mask = (0xffff00 >> argn) & 0xff00;
-
-		  /* Eliminate fp registers off the end.  */
-		  size_mask = (size_mask & 0xff) | (size_mask & argn_mask);
-		  a = ffi_struct_float_merge (size_mask, gpr+argn, fpr+argn);
-		}
-	    }
-	  break;
-
-	case FFI_TYPE_LONGDOUBLE:
-	  argn = ALIGN (argn, 2);
-	  a = (named && argn < 16 ? fpr : gpr) + argn;
-	  argx = argn + 2;
-	  break;
-	case FFI_TYPE_DOUBLE:
-	  if (named && argn < 16)
-	    a = fpr + argn;
-	  break;
-	case FFI_TYPE_FLOAT:
-	  if (named && argn < 16)
-	    a = fpr + argn;
-	  a += 4;
-	  break;
-
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_POINTER:
-	  break;
-	case FFI_TYPE_INT:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT32:
-	  a += 4;
-	  break;
-        case FFI_TYPE_UINT16:
-        case FFI_TYPE_SINT16:
-	  a += 6;
-	  break;
-        case FFI_TYPE_UINT8:
-        case FFI_TYPE_SINT8:
-	  a += 7;
-	  break;
-
-	default:
-	  abort();
-	}
-      avalue[i] = a;
-    }
-
-  /* Invoke the closure.  */
-  fun (cif, rvalue, avalue, user_data);
-
-  /* Tell ffi_closure_sparc how to perform return type promotions.  */
-  return flags;
-}
-#endif /* SPARC64 */
diff --git a/third_party/gofrontend/libffi/src/sparc/ffitarget.h b/third_party/gofrontend/libffi/src/sparc/ffitarget.h
deleted file mode 100644
index 2f4cd9a..0000000
--- a/third_party/gofrontend/libffi/src/sparc/ffitarget.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012  Anthony Green
-                 Copyright (c) 1996-2003  Red Hat, Inc.
-   Target configuration macros for SPARC.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-/* ---- System specific configurations ----------------------------------- */
-
-#if defined(__arch64__) || defined(__sparcv9)
-#ifndef SPARC64
-#define SPARC64
-#endif
-#endif
-
-#ifndef LIBFFI_ASM
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-#ifdef SPARC64
-  FFI_V9,
-  FFI_DEFAULT_ABI = FFI_V9,
-#else
-  FFI_V8,
-  FFI_DEFAULT_ABI = FFI_V8,
-#endif
-  FFI_LAST_ABI
-} ffi_abi;
-#endif
-
-#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION 1
-#define FFI_TARGET_HAS_COMPLEX_TYPE 1
-
-#ifdef SPARC64
-# define FFI_TARGET_SPECIFIC_VARIADIC 1
-# define FFI_EXTRA_CIF_FIELDS  unsigned int nfixedargs
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_GO_CLOSURES 1
-#define FFI_NATIVE_RAW_API 0
-
-#ifdef SPARC64
-#define FFI_TRAMPOLINE_SIZE 24
-#else
-#define FFI_TRAMPOLINE_SIZE 16
-#endif
-
-#endif
-
diff --git a/third_party/gofrontend/libffi/src/sparc/internal.h b/third_party/gofrontend/libffi/src/sparc/internal.h
deleted file mode 100644
index 0a66472..0000000
--- a/third_party/gofrontend/libffi/src/sparc/internal.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#define SPARC_RET_VOID		0
-#define SPARC_RET_STRUCT	1
-#define SPARC_RET_UINT8		2
-#define SPARC_RET_SINT8		3
-#define SPARC_RET_UINT16	4
-#define SPARC_RET_SINT16	5
-#define SPARC_RET_UINT32	6
-#define SP_V9_RET_SINT32	7	/* v9 only */
-#define SP_V8_RET_CPLX16	7	/* v8 only */
-#define SPARC_RET_INT64		8
-#define SPARC_RET_INT128	9
-
-/* Note that F_7 is missing, and is handled by SPARC_RET_STRUCT.  */
-#define SPARC_RET_F_8		10
-#define SPARC_RET_F_6		11
-#define SPARC_RET_F_4		12
-#define SPARC_RET_F_2		13
-#define SP_V9_RET_F_3		14	/* v9 only */
-#define SP_V8_RET_CPLX8		14	/* v8 only */
-#define SPARC_RET_F_1		15
-
-#define SPARC_FLAG_RET_MASK	15
-#define SPARC_FLAG_RET_IN_MEM	32
-#define SPARC_FLAG_FP_ARGS	64
-
-#define SPARC_SIZEMASK_SHIFT	8
diff --git a/third_party/gofrontend/libffi/src/sparc/v8.S b/third_party/gofrontend/libffi/src/sparc/v8.S
deleted file mode 100644
index 3a811ef..0000000
--- a/third_party/gofrontend/libffi/src/sparc/v8.S
+++ /dev/null
@@ -1,361 +0,0 @@
-/* -----------------------------------------------------------------------
-   v8.S - Copyright (c) 2013  The Written Word, Inc.
-	  Copyright (c) 1996, 1997, 2003, 2004, 2008  Red Hat, Inc.
-
-   SPARC Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-#include <ffi_cfi.h>
-#include "internal.h"
-
-#ifndef SPARC64
-
-#define C2(X, Y)  X ## Y
-#define C1(X, Y)  C2(X, Y)
-
-#ifdef __USER_LABEL_PREFIX__
-# define C(Y)	C1(__USER_LABEL_PREFIX__, Y)
-#else
-# define C(Y)	Y
-#endif
-#define L(Y)	C1(.L, Y)
-
-	.text
-
-#ifndef __GNUC__
-        .align 8
-	.globl	C(ffi_flush_icache)
-	.type	C(ffi_flush_icache),@function
-	FFI_HIDDEN(C(ffi_flush_icache))
-
-C(ffi_flush_icache):
-	cfi_startproc
-1:	iflush %o0
-	iflush %o+8
-	nop
-	nop
-	nop
-	nop
-	nop
-	retl
-	 nop
-	cfi_endproc
-	.size	C(ffi_flush_icache), . - C(ffi_flush_icache)
-#endif
-
-.macro E index
-	.align	16
-	.org	2b + \index * 16
-.endm
-
-        .align 8
-	.globl	C(ffi_call_v8)
-	.type	C(ffi_call_v8),@function
-	FFI_HIDDEN(C(ffi_call_v8))
-
-C(ffi_call_v8):
-	cfi_startproc
-	! Allocate a stack frame sized by ffi_call.
-	save	%sp, %o4, %sp
-	cfi_def_cfa_register(%fp)
-	cfi_window_save
-
-	mov	%i0, %o0		! copy cif
-	add	%sp, 64+32, %o1		! load args area
-	mov	%i2, %o2		! copy rvalue
-	call	C(ffi_prep_args_v8)
-	 mov	%i3, %o3		! copy avalue
-
-	add	%sp, 32, %sp		! deallocate prep frame
-	and	%o0, SPARC_FLAG_RET_MASK, %l0	! save return type
-	srl	%o0, SPARC_SIZEMASK_SHIFT, %l1	! save return size
-	ld	[%sp+64+4], %o0		! load all argument registers
-	ld	[%sp+64+8], %o1
-	ld	[%sp+64+12], %o2
-	ld	[%sp+64+16], %o3
-	cmp	%l0, SPARC_RET_STRUCT	! struct return needs an unimp 4
-	ld	[%sp+64+20], %o4
-	be	8f
-	 ld	[%sp+64+24], %o5
-
-	! Call foreign function
-	call	%i1
-	 mov	%i5, %g2		! load static chain
-
-0:	call	1f		! load pc in %o7
-	 sll	%l0, 4, %l0
-1:	add	%o7, %l0, %o7	! o7 = 0b + ret_type*16
-	jmp	%o7+(2f-0b)
-	 nop
-
-	! Note that each entry is 4 insns, enforced by the E macro.
-	.align	16
-2:
-E SPARC_RET_VOID
-	ret
-	 restore
-E SPARC_RET_STRUCT
-	unimp
-E SPARC_RET_UINT8
-	and	%o0, 0xff, %o0
-	st	%o0, [%i2]
-	ret
-	 restore
-E SPARC_RET_SINT8
-	sll	%o0, 24, %o0
-	b	7f
-	 sra	%o0, 24, %o0
-E SPARC_RET_UINT16
-	sll	%o0, 16, %o0
-	b	7f
-	 srl	%o0, 16, %o0
-E SPARC_RET_SINT16
-	sll	%o0, 16, %o0
-	b	7f
-	 sra	%o0, 16, %o0
-E SPARC_RET_UINT32
-7:	st	%o0, [%i2]
-	ret
-	 restore
-E SP_V8_RET_CPLX16
-	sth	%o0, [%i2+2]
-	b	9f
-	 srl	%o0, 16, %o0
-E SPARC_RET_INT64
-	st	%o0, [%i2]
-	st	%o1, [%i2+4]
-	ret
-	 restore
-E SPARC_RET_INT128
-	std	%o0, [%i2]
-	std	%o2, [%i2+8]
-	ret
-	 restore
-E SPARC_RET_F_8
-	st	%f7, [%i2+7*4]
-	nop
-	st	%f6, [%i2+6*4]
-	nop
-E SPARC_RET_F_6
-	st	%f5, [%i2+5*4]
-	nop
-	st	%f4, [%i2+4*4]
-	nop
-E SPARC_RET_F_4
-	st	%f3, [%i2+3*4]
-	nop
-	st	%f2, [%i2+2*4]
-	nop
-E SPARC_RET_F_2
-	st	%f1, [%i2+4]
-	st	%f0, [%i2]
-	ret
-	 restore
-E SP_V8_RET_CPLX8
-	stb	%o0, [%i2+1]
-	b	10f
-	 srl	%o0, 8, %o0
-E SPARC_RET_F_1
-	st	%f0, [%i2]
-	ret
-	 restore
-
-	.align	8
-9:	sth	%o0, [%i2]
-	ret
-	 restore
-	.align	8
-10:	stb	%o0, [%i2]
-	ret
-	 restore
-
-	! Struct returning functions expect and skip the unimp here.
-	! To make it worse, conforming callees examine the unimp and
-	! make sure the low 12 bits of the unimp match the size of
-	! the struct being returned.
-	.align	8
-8:	call	1f				! load pc in %o7
-	 sll	%l1, 2, %l0			! size * 4
-1:	sll	%l1, 4, %l1			! size * 16
-	add	%l0, %l1, %l0			! size * 20
-	add	%o7, %l0, %o7			! o7 = 0b + size*20
-	jmp	%o7+(2f-8b)
-	 mov	%i5, %g2			! load static chain
-2:
-.rept	0x1000
-	call	%i1
-	 nop
-	unimp	(. - 2b) / 20
-	ret
-	 restore
-.endr
-
-	cfi_endproc
-	.size	C(ffi_call_v8),. - C(ffi_call_v8)
-
-
-/* 16*4 register window + 1*4 struct return + 6*4 args backing store
-   + 8*4 return storage + 1*4 alignment.  */
-#define	STACKFRAME	(16*4 + 4 + 6*4 + 8*4 + 4)
-
-/* ffi_closure_v8(...)
-
-   Receives the closure argument in %g2.   */
-
-#ifdef HAVE_AS_REGISTER_PSEUDO_OP
-	.register	%g2, #scratch
-#endif
-
-	.align 8
-	.globl	C(ffi_go_closure_v8)
-	.type	C(ffi_go_closure_v8),@function
-	FFI_HIDDEN(C(ffi_go_closure_v8))
-
-C(ffi_go_closure_v8):
-	cfi_startproc
-	save	%sp, -STACKFRAME, %sp
-	cfi_def_cfa_register(%fp)
-	cfi_window_save
-
-	ld	[%g2+4], %o0			! load cif
-	ld	[%g2+8], %o1			! load fun
-	b	0f
-	 mov	%g2, %o2			! load user_data
-	cfi_endproc
-	.size	C(ffi_go_closure_v8), . - C(ffi_go_closure_v8)
-
-	.align 8
-	.globl	C(ffi_closure_v8)
-	.type	C(ffi_closure_v8),@function
-	FFI_HIDDEN(C(ffi_closure_v8))
-
-C(ffi_closure_v8):
-	cfi_startproc
-	save	%sp, -STACKFRAME, %sp
-	cfi_def_cfa_register(%fp)
-	cfi_window_save
-
-	ld	[%g2+FFI_TRAMPOLINE_SIZE], %o0		! load cif
-	ld	[%g2+FFI_TRAMPOLINE_SIZE+4], %o1	! load fun
-	ld	[%g2+FFI_TRAMPOLINE_SIZE+8], %o2	! load user_data
-0:
-	! Store all of the potential argument registers in va_list format.
-	st	%i0, [%fp+68+0]
-	st	%i1, [%fp+68+4]
-	st	%i2, [%fp+68+8]
-	st	%i3, [%fp+68+12]
-	st	%i4, [%fp+68+16]
-	st	%i5, [%fp+68+20]
-
-	! Call ffi_closure_sparc_inner to do the bulk of the work.
-	add	%fp, -8*4, %o3
-	call	ffi_closure_sparc_inner_v8
-	 add	%fp,  64, %o4
-
-0:	call	1f
-	 and	%o0, SPARC_FLAG_RET_MASK, %o0
-1:	sll	%o0, 4, %o0	! o0 = o0 * 16
-	add	%o7, %o0, %o7	! o7 = 0b + o0*16
-	jmp	%o7+(2f-0b)
-	 add	%fp, -8*4, %i2
-	 
-	! Note that each entry is 4 insns, enforced by the E macro.
-	.align	16
-2:
-E SPARC_RET_VOID
-	ret
-	 restore
-E SPARC_RET_STRUCT
-	ld	[%i2], %i0
-	jmp	%i7+12
-	 restore
-E SPARC_RET_UINT8
-	ldub	[%i2+3], %i0
-	ret
-	 restore
-E SPARC_RET_SINT8
-	ldsb	[%i2+3], %i0
-	ret
-	 restore
-E SPARC_RET_UINT16
-	lduh	[%i2+2], %i0
-	ret
-	 restore
-E SPARC_RET_SINT16
-	ldsh	[%i2+2], %i0
-	ret
-	 restore
-E SPARC_RET_UINT32
-	ld	[%i2], %i0
-	ret
-	 restore
-E SP_V8_RET_CPLX16
-	ld	[%i2], %i0
-	ret
-	 restore
-E SPARC_RET_INT64
-	ldd	[%i2], %i0
-	ret
-	 restore
-E SPARC_RET_INT128
-	ldd	[%i2], %i0
-	ldd	[%i2+8], %i2
-	ret
-	 restore
-E SPARC_RET_F_8
-	ld	[%i2+7*4], %f7
-	nop
-	ld	[%i2+6*4], %f6
-	nop
-E SPARC_RET_F_6
-	ld	[%i2+5*4], %f5
-	nop
-	ld	[%i2+4*4], %f4
-	nop
-E SPARC_RET_F_4
-	ld	[%i2+3*4], %f3
-	nop
-	ld	[%i2+2*4], %f2
-	nop
-E SPARC_RET_F_2
-	ldd	[%i2], %f0
-	ret
-	 restore
-E SP_V8_RET_CPLX8
-	lduh	[%i2], %i0
-	ret
-	 restore
-E SPARC_RET_F_1
-	ld	[%i2], %f0
-	ret
-	 restore
-
-	cfi_endproc
-	.size	C(ffi_closure_v8), . - C(ffi_closure_v8)
-#endif /* !SPARC64 */
-#if defined __ELF__ && defined __linux__
-	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/third_party/gofrontend/libffi/src/sparc/v9.S b/third_party/gofrontend/libffi/src/sparc/v9.S
deleted file mode 100644
index 52732d3..0000000
--- a/third_party/gofrontend/libffi/src/sparc/v9.S
+++ /dev/null
@@ -1,377 +0,0 @@
-/* -----------------------------------------------------------------------
-   v9.S - Copyright (c) 2000, 2003, 2004, 2008 Red Hat, Inc.
-   
-   SPARC 64-bit Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-#include <ffi_cfi.h>
-#include "internal.h"
-
-#ifdef SPARC64
-
-#define C2(X, Y)  X ## Y
-#define C1(X, Y)  C2(X, Y)
-
-#ifdef __USER_LABEL_PREFIX__
-# define C(Y)	C1(__USER_LABEL_PREFIX__, Y)
-#else
-# define C(Y)	Y
-#endif
-#define L(Y)	C1(.L, Y)
-
-.macro E index
-	.align	16
-	.org	2b + \index * 16
-.endm
-
-#define STACK_BIAS 2047
-
-	.text
-        .align 8
-	.globl	C(ffi_call_v9)
-	.type	C(ffi_call_v9),@function
-	FFI_HIDDEN(C(ffi_call_v9))
-
-C(ffi_call_v9):
-	cfi_startproc
-	save	%sp, %o4, %sp
-	cfi_def_cfa_register(%fp)
-	cfi_window_save
-	
-	mov	%i0, %o0			! copy cif
-	add	%sp, STACK_BIAS+128+48, %o1	! load args area
-	mov	%i2, %o2			! copy rvalue
-	call	C(ffi_prep_args_v9)
-	 mov	%i3, %o3			! copy avalue
-
-	andcc	%o0, SPARC_FLAG_FP_ARGS, %g0	! need fp regs?
-	add	%sp, 48, %sp			! deallocate prep frame
-	be,pt	%xcc, 1f
-	 mov	%o0, %l0			! save flags
-
-	ldd	[%sp+STACK_BIAS+128], %f0	! load all fp arg regs
-	ldd	[%sp+STACK_BIAS+128+8], %f2
-	ldd	[%sp+STACK_BIAS+128+16], %f4
-	ldd	[%sp+STACK_BIAS+128+24], %f6
-	ldd	[%sp+STACK_BIAS+128+32], %f8
-	ldd	[%sp+STACK_BIAS+128+40], %f10
-	ldd	[%sp+STACK_BIAS+128+48], %f12
-	ldd	[%sp+STACK_BIAS+128+56], %f14
-	ldd	[%sp+STACK_BIAS+128+64], %f16
-	ldd	[%sp+STACK_BIAS+128+72], %f18
-	ldd	[%sp+STACK_BIAS+128+80], %f20
-	ldd	[%sp+STACK_BIAS+128+88], %f22
-	ldd	[%sp+STACK_BIAS+128+96], %f24
-	ldd	[%sp+STACK_BIAS+128+104], %f26
-	ldd	[%sp+STACK_BIAS+128+112], %f28
-	ldd	[%sp+STACK_BIAS+128+120], %f30
-
-1:	ldx	[%sp+STACK_BIAS+128], %o0	! load all int arg regs
-	ldx	[%sp+STACK_BIAS+128+8], %o1
-	ldx	[%sp+STACK_BIAS+128+16], %o2
-	ldx	[%sp+STACK_BIAS+128+24], %o3
-	ldx	[%sp+STACK_BIAS+128+32], %o4
-	ldx	[%sp+STACK_BIAS+128+40], %o5
-	call	%i1
-	 mov	%i5, %g5			! load static chain
-
-0:	call	1f		! load pc in %o7
-	 and	%l0, SPARC_FLAG_RET_MASK, %l1
-1:	sll	%l1, 4, %l1
-	add	%o7, %l1, %o7	! o7 = 0b + ret_type*16
-	jmp	%o7+(2f-0b)
-	 nop
-
-	.align	16
-2:
-E SPARC_RET_VOID
-	return	%i7+8
-	 nop
-E SPARC_RET_STRUCT
-	add	%sp, STACK_BIAS-64+128+48, %l2
-	sub	%sp, 64, %sp
-	b	8f
-	 stx	%o0, [%l2]
-E SPARC_RET_UINT8
-	and	%o0, 0xff, %i0
-	return	%i7+8
-	  stx	%o0, [%o2]
-E SPARC_RET_SINT8
-	sll	%o0, 24, %o0
-	sra	%o0, 24, %i0
-	return	%i7+8
-	 stx	%o0, [%o2]
-E SPARC_RET_UINT16
-	sll	%o0, 16, %o0
-	srl	%o0, 16, %i0
-	return	%i7+8
-	 stx	%o0, [%o2]
-E SPARC_RET_SINT16
-	sll	%o0, 16, %o0
-	sra	%o0, 16, %i0
-	return	%i7+8
-	 stx	%o0, [%o2]
-E SPARC_RET_UINT32
-	srl	%o0, 0, %i0
-	return	%i7+8
-	 stx	%o0, [%o2]
-E SP_V9_RET_SINT32
-	sra	%o0, 0, %i0
-	return	%i7+8
-	 stx	%o0, [%o2]
-E SPARC_RET_INT64
-	stx	%o0, [%i2]
-	return	%i7+8
-	 nop
-E SPARC_RET_INT128
-	stx	%o0, [%i2]
-	stx	%o1, [%i2+8]
-	return	%i7+8
-	 nop
-E SPARC_RET_F_8
-	st	%f7, [%i2+7*4]
-	nop
-	st	%f6, [%i2+6*4]
-	nop
-E SPARC_RET_F_6
-	st	%f5, [%i2+5*4]
-	nop
-	st	%f4, [%i2+4*4]
-	nop
-E SPARC_RET_F_4
-	std	%f2, [%i2+2*4]
-	return	%i7+8
-	 std	%f0, [%o2]
-E SPARC_RET_F_2
-	return	%i7+8
-	 std	%f0, [%o2]
-E SP_V9_RET_F_3
-	st	%f2, [%i2+2*4]
-	nop
-	st	%f1, [%i2+1*4]
-	nop
-E SPARC_RET_F_1
-	return	%i7+8
-	 st	%f0, [%o2]
-
-	! Finish the SPARC_RET_STRUCT sequence.
-	.align	8
-8:	stx	%o1, [%l2+8]
-	stx	%o2, [%l2+16]
-	stx	%o3, [%l2+24]
-	std	%f0, [%l2+32]
-	std	%f2, [%l2+40]
-	std	%f4, [%l2+48]
-	std	%f6, [%l2+56]
-
-	! Copy the structure into place.
-	srl	%l0, SPARC_SIZEMASK_SHIFT, %o0	! load size_mask
-	mov	%i2, %o1			! load dst
-	mov	%l2, %o2			! load src_gp
-	call	C(ffi_struct_float_copy)
-	 add	%l2, 32, %o3			! load src_fp
-
-	return	%i7+8
-	 nop
-
-	cfi_endproc
-	.size	C(ffi_call_v9), . - C(ffi_call_v9)
-
-
-#undef STACKFRAME
-#define	STACKFRAME	 336	/* 16*8 register window +
-				   6*8 args backing store +
-				   20*8 locals */
-#define	FP		%fp+STACK_BIAS
-
-/* ffi_closure_v9(...)
-
-   Receives the closure argument in %g1.   */
-
-	.align 8
-	.globl	C(ffi_go_closure_v9)
-	.type	C(ffi_go_closure_v9),@function
-	FFI_HIDDEN(C(ffi_go_closure_v9))
-
-C(ffi_go_closure_v9):
-	cfi_startproc
-	save	%sp, -STACKFRAME, %sp
-	cfi_def_cfa_register(%fp)
-	cfi_window_save
-
-	ldx	[%g5+8], %o0
-	ldx	[%g5+16], %o1
-	b	0f
-	 mov	%g5, %o2
-
-	cfi_endproc
-	.size	C(ffi_go_closure_v9), . - C(ffi_go_closure_v9)
-
-	.align 8
-	.globl	C(ffi_closure_v9)
-	.type	C(ffi_closure_v9),@function
-	FFI_HIDDEN(C(ffi_closure_v9))
-
-C(ffi_closure_v9):
-	cfi_startproc
-	save	%sp, -STACKFRAME, %sp
-	cfi_def_cfa_register(%fp)
-	cfi_window_save
-
-	ldx	[%g1+FFI_TRAMPOLINE_SIZE], %o0
-	ldx	[%g1+FFI_TRAMPOLINE_SIZE+8], %o1
-	ldx	[%g1+FFI_TRAMPOLINE_SIZE+16], %o2
-0:
-	! Store all of the potential argument registers in va_list format.
-	stx	%i0, [FP+128+0]
-	stx	%i1, [FP+128+8]
-	stx	%i2, [FP+128+16]
-	stx	%i3, [FP+128+24]
-	stx	%i4, [FP+128+32]
-	stx	%i5, [FP+128+40]
-
-	! Store possible floating point argument registers too.
-	std	%f0,  [FP-128]
-	std	%f2,  [FP-120]
-	std	%f4,  [FP-112]
-	std	%f6,  [FP-104]
-	std	%f8,  [FP-96]
-	std	%f10, [FP-88]
-	std     %f12, [FP-80]
-	std     %f14, [FP-72]
-	std     %f16, [FP-64]
-	std     %f18, [FP-56]
-	std     %f20, [FP-48]
-	std     %f22, [FP-40]
-	std     %f24, [FP-32]
-	std     %f26, [FP-24]
-	std     %f28, [FP-16]
-	std     %f30, [FP-8]
-
-	! Call ffi_closure_sparc_inner to do the bulk of the work.
-	add	%fp, STACK_BIAS-160, %o3
-	add	%fp, STACK_BIAS+128, %o4
-	call	C(ffi_closure_sparc_inner_v9)
-	 add	%fp, STACK_BIAS-128, %o5
-
-0:	call	1f		! load pc in %o7
-	 and	%o0, SPARC_FLAG_RET_MASK, %o0
-1:	sll	%o0, 4, %o0	! o2 = i2 * 16
-	add	%o7, %o0, %o7	! o7 = 0b + i2*16
-	jmp	%o7+(2f-0b)
-	 nop
-
-	! Note that we cannot load the data in the delay slot of
-	! the return insn because the data is in the stack frame
-	! that is deallocated by the return.
-	.align	16
-2:
-E SPARC_RET_VOID
-	return	%i7+8
-	 nop
-E SPARC_RET_STRUCT
-	ldx	[FP-160], %i0
-	ldd	[FP-160], %f0
-	b	8f
-	 ldx	[FP-152], %i1
-E SPARC_RET_UINT8
-	ldub	[FP-160+7], %i0
-	return	%i7+8
-	 nop
-E SPARC_RET_SINT8
-	ldsb	[FP-160+7], %i0
-	return	%i7+8
-	 nop
-E SPARC_RET_UINT16
-	lduh	[FP-160+6], %i0
-	return	%i7+8
-	 nop
-E SPARC_RET_SINT16
-	ldsh	[FP-160+6], %i0
-	return	%i7+8
-	 nop
-E SPARC_RET_UINT32
-	lduw	[FP-160+4], %i0
-	return	%i7+8
-	 nop
-E SP_V9_RET_SINT32
-	ldsw	[FP-160+4], %i0
-	return	%i7+8
-	 nop
-E SPARC_RET_INT64
-	ldx	[FP-160], %i0
-	return	%i7+8
-	 nop
-E SPARC_RET_INT128
-	ldx	[FP-160], %i0
-	ldx	[FP-160+8], %i1
-	return	%i7+8
-	 nop
-E SPARC_RET_F_8
-	ld	[FP-160+7*4], %f7
-	nop
-	ld	[FP-160+6*4], %f6
-	nop
-E SPARC_RET_F_6
-	ld	[FP-160+5*4], %f5
-	nop
-	ld	[FP-160+4*4], %f4
-	nop
-E SPARC_RET_F_4
-	ldd	[FP-160], %f0
-	ldd	[FP-160+8], %f2
-	return	%i7+8
-	 nop
-E SPARC_RET_F_2
-	ldd	[FP-160], %f0
-	return	%i7+8
-	 nop
-E SP_V9_RET_F_3
-	ld	[FP-160+2*4], %f2
-	nop
-	ld	[FP-160+1*4], %f1
-	nop
-E SPARC_RET_F_1
-	ld	[FP-160], %f0
-	return	%i7+8
-	 nop
-
-	! Finish the SPARC_RET_STRUCT sequence.
-	.align	8
-8:	ldd	[FP-152], %f2
-	ldx	[FP-144], %i2
-	ldd	[FP-144], %f4
-	ldx	[FP-136], %i3
-	ldd	[FP-136], %f6
-	return	%i7+8
-	 nop
-
-	cfi_endproc
-	.size	C(ffi_closure_v9), . - C(ffi_closure_v9)
-#endif /* SPARC64 */
-#ifdef __linux__
-	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/third_party/gofrontend/libffi/src/tile/ffi.c b/third_party/gofrontend/libffi/src/tile/ffi.c
deleted file mode 100644
index 3a94469..0000000
--- a/third_party/gofrontend/libffi/src/tile/ffi.c
+++ /dev/null
@@ -1,355 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2012 Tilera Corp.
-
-   TILE Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <arch/abi.h>
-#include <arch/icache.h>
-#include <arch/opcode.h>
-
-
-/* The first 10 registers are used to pass arguments and return values. */
-#define NUM_ARG_REGS 10
-
-/* Performs a raw function call with the given NUM_ARG_REGS register arguments
-   and the specified additional stack arguments (if any). */
-extern void ffi_call_tile(ffi_sarg reg_args[NUM_ARG_REGS],
-                          const ffi_sarg *stack_args,
-                          size_t stack_args_bytes,
-                          void (*fnaddr)(void))
-  FFI_HIDDEN;
-
-/* This handles the raw call from the closure stub, cleaning up the
-   parameters and delegating to ffi_closure_tile_inner. */
-extern void ffi_closure_tile(void) FFI_HIDDEN;
-
-
-ffi_status
-ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  /* We always allocate room for all registers. Even if we don't
-     use them as parameters, they get returned in the same array
-     as struct return values so we need to make room. */
-  if (cif->bytes < NUM_ARG_REGS * FFI_SIZEOF_ARG)
-    cif->bytes = NUM_ARG_REGS * FFI_SIZEOF_ARG;
-
-  if (cif->rtype->size > NUM_ARG_REGS * FFI_SIZEOF_ARG)
-    cif->flags = FFI_TYPE_STRUCT;
-  else
-    cif->flags = FFI_TYPE_INT;
-
-  /* Nothing to do. */
-  return FFI_OK;
-}
-
-
-static long
-assign_to_ffi_arg(ffi_sarg *out, void *in, const ffi_type *type,
-                  int write_to_reg)
-{
-  switch (type->type)
-    {
-    case FFI_TYPE_SINT8:
-      *out = *(SINT8 *)in;
-      return 1;
-
-    case FFI_TYPE_UINT8:
-      *out = *(UINT8 *)in;
-      return 1;
-
-    case FFI_TYPE_SINT16:
-      *out = *(SINT16 *)in;
-      return 1;
-
-    case FFI_TYPE_UINT16:
-      *out = *(UINT16 *)in;
-      return 1;
-
-    case FFI_TYPE_SINT32:
-    case FFI_TYPE_UINT32:
-#ifndef __LP64__
-    case FFI_TYPE_POINTER:
-#endif
-      /* Note that even unsigned 32-bit quantities are sign extended
-         on tilegx when stored in a register.  */
-      *out = *(SINT32 *)in;
-      return 1;
-
-    case FFI_TYPE_FLOAT:
-#ifdef __tilegx__
-      if (write_to_reg)
-        {
-          /* Properly sign extend the value.  */
-          union { float f; SINT32 s32; } val;
-          val.f = *(float *)in;
-          *out = val.s32;
-        }
-      else
-#endif
-        {
-          *(float *)out = *(float *)in;
-        }
-      return 1;
-
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_DOUBLE:
-#ifdef __LP64__
-    case FFI_TYPE_POINTER:
-#endif
-      *(UINT64 *)out = *(UINT64 *)in;
-      return sizeof(UINT64) / FFI_SIZEOF_ARG;
-
-    case FFI_TYPE_STRUCT:
-      memcpy(out, in, type->size);
-      return (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG;
-
-    case FFI_TYPE_VOID:
-      /* Must be a return type. Nothing to do. */
-      return 0;
-
-    default:
-      FFI_ASSERT(0);
-      return -1;
-    }
-}
-
-
-void
-ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  ffi_sarg * const arg_mem = alloca(cif->bytes);
-  ffi_sarg * const reg_args = arg_mem;
-  ffi_sarg * const stack_args = &reg_args[NUM_ARG_REGS];
-  ffi_sarg *argp = arg_mem;
-  ffi_type ** const arg_types = cif->arg_types;
-  const long num_args = cif->nargs;
-  long i;
-
-  if (cif->flags == FFI_TYPE_STRUCT)
-    {
-      /* Pass a hidden pointer to the return value. We make sure there
-         is scratch space for the callee to store the return value even if
-         our caller doesn't care about it. */
-      *argp++ = (intptr_t)(rvalue ? rvalue : alloca(cif->rtype->size));
-
-      /* No more work needed to return anything. */
-      rvalue = NULL;
-    }
-
-  for (i = 0; i < num_args; i++)
-    {
-      ffi_type *type = arg_types[i];
-      void * const arg_in = avalue[i];
-      ptrdiff_t arg_word = argp - arg_mem;
-
-#ifndef __tilegx__
-      /* Doubleword-aligned values are always in an even-number register
-         pair, or doubleword-aligned stack slot if out of registers. */
-      long align = arg_word & (type->alignment > FFI_SIZEOF_ARG);
-      argp += align;
-      arg_word += align;
-#endif
-
-      if (type->type == FFI_TYPE_STRUCT)
-        {
-          const size_t arg_size_in_words =
-            (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG;
-
-          if (arg_word < NUM_ARG_REGS &&
-              arg_word + arg_size_in_words > NUM_ARG_REGS)
-            {
-              /* Args are not allowed to span registers and the stack. */
-              argp = stack_args;
-            }
-
-          memcpy(argp, arg_in, type->size);
-          argp += arg_size_in_words;
-        }
-      else
-        {
-          argp += assign_to_ffi_arg(argp, arg_in, arg_types[i], 1);
-        }
-    }
-
-  /* Actually do the call. */
-  ffi_call_tile(reg_args, stack_args,
-                cif->bytes - (NUM_ARG_REGS * FFI_SIZEOF_ARG), fn);
-
-  if (rvalue != NULL)
-    assign_to_ffi_arg(rvalue, reg_args, cif->rtype, 0);
-}
-
-
-/* Template code for closure. */
-extern const UINT64 ffi_template_tramp_tile[] FFI_HIDDEN;
-
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure *closure,
-                      ffi_cif *cif,
-                      void (*fun)(ffi_cif*, void*, void**, void*),
-                      void *user_data,
-                      void *codeloc)
-{
-#ifdef __tilegx__
-  /* TILE-Gx */
-  SINT64 c;
-  SINT64 h;
-  int s;
-  UINT64 *out;
-
-  if (cif->abi != FFI_UNIX)
-    return FFI_BAD_ABI;
-
-  out = (UINT64 *)closure->tramp;
-
-  c = (intptr_t)closure;
-  h = (intptr_t)ffi_closure_tile;
-  s = 0;
-
-  /* Find the smallest shift count that doesn't lose information
-     (i.e. no need to explicitly insert high bits of the address that
-     are just the sign extension of the low bits). */
-  while ((c >> s) != (SINT16)(c >> s) || (h >> s) != (SINT16)(h >> s))
-    s += 16;
-
-#define OPS(a, b, shift) \
-  (create_Imm16_X0((a) >> (shift)) | create_Imm16_X1((b) >> (shift)))
-
-  /* Emit the moveli. */
-  *out++ = ffi_template_tramp_tile[0] | OPS(c, h, s);
-  for (s -= 16; s >= 0; s -= 16)
-    *out++ = ffi_template_tramp_tile[1] | OPS(c, h, s);
-
-#undef OPS
-
-  *out++ = ffi_template_tramp_tile[2];
-
-#else
-  /* TILEPro */
-  UINT64 *out;
-  intptr_t delta;
-
-  if (cif->abi != FFI_UNIX)
-    return FFI_BAD_ABI;
-
-  out = (UINT64 *)closure->tramp;
-  delta = (intptr_t)ffi_closure_tile - (intptr_t)codeloc;
-
-  *out++ = ffi_template_tramp_tile[0] | create_JOffLong_X1(delta >> 3);
-#endif
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  invalidate_icache(closure->tramp, (char *)out - closure->tramp,
-                    getpagesize());
-
-  return FFI_OK;
-}
-
-
-/* This is called by the assembly wrapper for closures. This does
-   all of the work. On entry reg_args[0] holds the values the registers
-   had when the closure was invoked. On return reg_args[1] holds the register
-   values to be returned to the caller (many of which may be garbage). */
-void FFI_HIDDEN
-ffi_closure_tile_inner(ffi_closure *closure,
-                       ffi_sarg reg_args[2][NUM_ARG_REGS],
-                       ffi_sarg *stack_args)
-{
-  ffi_cif * const cif = closure->cif;
-  void ** const avalue = alloca(cif->nargs * sizeof(void *));
-  void *rvalue;
-  ffi_type ** const arg_types = cif->arg_types;
-  ffi_sarg * const reg_args_in = reg_args[0];
-  ffi_sarg * const reg_args_out = reg_args[1];
-  ffi_sarg * argp;
-  long i, arg_word, nargs = cif->nargs;
-  /* Use a union to guarantee proper alignment for double. */
-  union { ffi_sarg arg[NUM_ARG_REGS]; double d; UINT64 u64; } closure_ret;
-
-  /* Start out reading register arguments. */
-  argp = reg_args_in;
-
-  /* Copy the caller's structure return address to that the closure
-     returns the data directly to the caller.  */
-  if (cif->flags == FFI_TYPE_STRUCT)
-    {
-      /* Return by reference via hidden pointer. */
-      rvalue = (void *)(intptr_t)*argp++;
-      arg_word = 1;
-    }
-  else
-    {
-      /* Return the value in registers. */
-      rvalue = &closure_ret;
-      arg_word = 0;
-    }
-
-  /* Grab the addresses of the arguments. */
-  for (i = 0; i < nargs; i++)
-    {
-      ffi_type * const type = arg_types[i];
-      const size_t arg_size_in_words =
-        (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG;
-
-#ifndef __tilegx__
-      /* Doubleword-aligned values are always in an even-number register
-         pair, or doubleword-aligned stack slot if out of registers. */
-      long align = arg_word & (type->alignment > FFI_SIZEOF_ARG);
-      argp += align;
-      arg_word += align;
-#endif
-
-      if (arg_word == NUM_ARG_REGS ||
-          (arg_word < NUM_ARG_REGS &&
-           arg_word + arg_size_in_words > NUM_ARG_REGS))
-        {
-          /* Switch to reading arguments from the stack. */
-          argp = stack_args;
-          arg_word = NUM_ARG_REGS;
-        }
-
-      avalue[i] = argp;
-      argp += arg_size_in_words;
-      arg_word += arg_size_in_words;
-    }
-
-  /* Invoke the closure.  */
-  closure->fun(cif, rvalue, avalue, closure->user_data);
-
-  if (cif->flags != FFI_TYPE_STRUCT)
-    {
-      /* Canonicalize for register representation. */
-      assign_to_ffi_arg(reg_args_out, &closure_ret, cif->rtype, 1);
-    }
-}
diff --git a/third_party/gofrontend/libffi/src/tile/ffitarget.h b/third_party/gofrontend/libffi/src/tile/ffitarget.h
deleted file mode 100644
index 679fb5d..0000000
--- a/third_party/gofrontend/libffi/src/tile/ffitarget.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012 Tilera Corp.
-   Target configuration macros for TILE.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#ifndef LIBFFI_ASM
-
-#include <arch/abi.h>
-
-typedef uint_reg_t ffi_arg;
-typedef int_reg_t  ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_UNIX,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_UNIX
-} ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-#define FFI_CLOSURES 1
-
-#ifdef __tilegx__
-/* We always pass 8-byte values, even in -m32 mode. */
-# define FFI_SIZEOF_ARG 8
-# ifdef __LP64__
-#  define FFI_TRAMPOLINE_SIZE (8 * 5)  /* 5 bundles */
-# else
-#  define FFI_TRAMPOLINE_SIZE (8 * 3)  /* 3 bundles */
-# endif
-#else
-# define FFI_SIZEOF_ARG 4
-# define FFI_TRAMPOLINE_SIZE 8 /* 1 bundle */
-#endif
-#define FFI_NATIVE_RAW_API 0
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/tile/tile.S b/third_party/gofrontend/libffi/src/tile/tile.S
deleted file mode 100644
index d1f82cb..0000000
--- a/third_party/gofrontend/libffi/src/tile/tile.S
+++ /dev/null
@@ -1,360 +0,0 @@
-/* -----------------------------------------------------------------------
-   tile.S - Copyright (c) 2011 Tilera Corp.
-
-   Tilera TILEPro and TILE-Gx Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-
-/* Number of bytes in a register. */
-#define REG_SIZE FFI_SIZEOF_ARG
-
-/* Number of bytes in stack linkage area for backtracing.
-
-   A note about the ABI: on entry to a procedure, sp points to a stack
-   slot where it must spill the return address if it's not a leaf.
-   REG_SIZE bytes beyond that is a slot owned by the caller which
-   contains the sp value that the caller had when it was originally
-   entered (i.e. the caller's frame pointer). */
-#define LINKAGE_SIZE (2 * REG_SIZE)
-
-/* The first 10 registers are used to pass arguments and return values. */
-#define NUM_ARG_REGS 10
-
-#ifdef __tilegx__
-#define SW st
-#define LW ld
-#define BGZT bgtzt
-#else
-#define SW sw
-#define LW lw
-#define BGZT bgzt
-#endif
-
-
-/* void ffi_call_tile (int_reg_t reg_args[NUM_ARG_REGS],
-                       const int_reg_t *stack_args,
-                       unsigned long stack_args_bytes,
-                       void (*fnaddr)(void));
-
-        On entry, REG_ARGS contain the outgoing register values,
-        and STACK_ARGS contains STACK_ARG_BYTES of additional values
-        to be passed on the stack. If STACK_ARG_BYTES is zero, then
-        STACK_ARGS is ignored.
-
-        When the invoked function returns, the values of r0-r9 are
-        blindly stored back into REG_ARGS for the caller to examine. */
-
-        .section .text.ffi_call_tile, "ax", @progbits
-        .align  8
-        .globl  ffi_call_tile
-        FFI_HIDDEN(ffi_call_tile)
-ffi_call_tile:
-
-/* Incoming arguments. */
-#define REG_ARGS                r0
-#define INCOMING_STACK_ARGS     r1
-#define STACK_ARG_BYTES         r2
-#define ORIG_FNADDR             r3
-
-/* Temporary values. */
-#define FRAME_SIZE              r10
-#define TMP                     r11
-#define TMP2                    r12
-#define OUTGOING_STACK_ARGS     r13
-#define REG_ADDR_PTR            r14
-#define RETURN_REG_ADDR         r15
-#define FNADDR                  r16
-
-        .cfi_startproc
-        {
-         /* Save return address. */
-         SW     sp, lr
-         .cfi_offset lr, 0
-         /* Prepare to spill incoming r52. */
-         addi   TMP, sp, -REG_SIZE
-         /* Increase frame size to have room to spill r52 and REG_ARGS.
-            The +7 is to round up mod 8. */
-         addi   FRAME_SIZE, STACK_ARG_BYTES, \
-                REG_SIZE + REG_SIZE + LINKAGE_SIZE + 7
-        }
-        {
-         /* Round stack frame size to a multiple of 8 to satisfy ABI. */
-         andi   FRAME_SIZE, FRAME_SIZE, -8
-         /* Compute where to spill REG_ARGS value. */
-         addi   TMP2, sp, -(REG_SIZE * 2)
-        }
-        {
-         /* Spill incoming r52. */
-         SW     TMP, r52
-         .cfi_offset r52, -REG_SIZE
-         /* Set up our frame pointer. */
-         move   r52, sp
-         .cfi_def_cfa_register r52
-         /* Push stack frame. */
-         sub    sp, sp, FRAME_SIZE
-        }
-        {
-         /* Prepare to set up stack linkage. */
-         addi   TMP, sp, REG_SIZE
-         /* Prepare to memcpy stack args. */
-         addi   OUTGOING_STACK_ARGS, sp, LINKAGE_SIZE
-         /* Save REG_ARGS which we will need after we call the subroutine. */
-         SW     TMP2, REG_ARGS
-        }
-        {
-         /* Set up linkage info to hold incoming stack pointer. */
-         SW     TMP, r52
-        }
-        {
-         /* Skip stack args memcpy if we don't have any stack args (common). */
-         blezt  STACK_ARG_BYTES, .Ldone_stack_args_memcpy
-        }
-
-.Lmemcpy_stack_args:
-        {
-         /* Load incoming argument from stack_args. */
-         LW     TMP, INCOMING_STACK_ARGS
-         addi   INCOMING_STACK_ARGS, INCOMING_STACK_ARGS, REG_SIZE
-        }
-        {
-         /* Store stack argument into outgoing stack argument area. */
-         SW     OUTGOING_STACK_ARGS, TMP
-         addi   OUTGOING_STACK_ARGS, OUTGOING_STACK_ARGS, REG_SIZE
-         addi   STACK_ARG_BYTES, STACK_ARG_BYTES, -REG_SIZE
-        }
-        {
-         BGZT   STACK_ARG_BYTES, .Lmemcpy_stack_args
-        }
-.Ldone_stack_args_memcpy:
-
-        {
-         /* Copy aside ORIG_FNADDR so we can overwrite its register. */
-         move   FNADDR, ORIG_FNADDR
-         /* Prepare to load argument registers. */
-         addi   REG_ADDR_PTR, r0, REG_SIZE
-         /* Load outgoing r0. */
-         LW     r0, r0
-        }
-
-        /* Load up argument registers from the REG_ARGS array. */
-#define LOAD_REG(REG, PTR) \
-        { \
-         LW     REG, PTR ; \
-         addi   PTR, PTR, REG_SIZE \
-        }
-
-        LOAD_REG(r1, REG_ADDR_PTR)
-        LOAD_REG(r2, REG_ADDR_PTR)
-        LOAD_REG(r3, REG_ADDR_PTR)
-        LOAD_REG(r4, REG_ADDR_PTR)
-        LOAD_REG(r5, REG_ADDR_PTR)
-        LOAD_REG(r6, REG_ADDR_PTR)
-        LOAD_REG(r7, REG_ADDR_PTR)
-        LOAD_REG(r8, REG_ADDR_PTR)
-        LOAD_REG(r9, REG_ADDR_PTR)
-
-        {
-         /* Call the subroutine. */
-         jalr   FNADDR
-        }
-
-        {
-         /* Restore original lr. */
-         LW     lr, r52
-         /* Prepare to recover ARGS, which we spilled earlier. */
-         addi   TMP, r52, -(2 * REG_SIZE)
-        }
-        {
-         /* Restore ARGS, so we can fill it in with the return regs r0-r9. */
-         LW     RETURN_REG_ADDR, TMP
-         /* Prepare to restore original r52. */
-         addi   TMP, r52, -REG_SIZE
-        }
-
-        {
-         /* Pop stack frame. */
-         move   sp, r52
-         /* Restore original r52. */
-         LW     r52, TMP
-        }
-
-#define STORE_REG(REG, PTR) \
-        { \
-         SW     PTR, REG ; \
-         addi   PTR, PTR, REG_SIZE \
-        }
-
-        /* Return all register values by reference. */
-        STORE_REG(r0, RETURN_REG_ADDR)
-        STORE_REG(r1, RETURN_REG_ADDR)
-        STORE_REG(r2, RETURN_REG_ADDR)
-        STORE_REG(r3, RETURN_REG_ADDR)
-        STORE_REG(r4, RETURN_REG_ADDR)
-        STORE_REG(r5, RETURN_REG_ADDR)
-        STORE_REG(r6, RETURN_REG_ADDR)
-        STORE_REG(r7, RETURN_REG_ADDR)
-        STORE_REG(r8, RETURN_REG_ADDR)
-        STORE_REG(r9, RETURN_REG_ADDR)
-
-        {
-         jrp    lr
-        }
-
-        .cfi_endproc
-        .size ffi_call_tile, .-ffi_call_tile
-
-/* ffi_closure_tile(...)
-
-   On entry, lr points to the closure plus 8 bytes, and r10
-   contains the actual return address.
-
-   This function simply dumps all register parameters into a stack array
-   and passes the closure, the registers array, and the stack arguments
-   to C code that does all of the actual closure processing. */
-
-        .section .text.ffi_closure_tile, "ax", @progbits
-        .align  8
-        .globl  ffi_closure_tile
-        FFI_HIDDEN(ffi_closure_tile)
-
-        .cfi_startproc
-/* Room to spill all NUM_ARG_REGS incoming registers, plus frame linkage. */
-#define CLOSURE_FRAME_SIZE (((NUM_ARG_REGS * REG_SIZE * 2 + LINKAGE_SIZE) + 7) & -8)
-ffi_closure_tile:
-        {
-#ifdef __tilegx__
-         st     sp, lr
-         .cfi_offset lr, 0
-#else
-         /* Save return address (in r10 due to closure stub wrapper). */
-         SW     sp, r10
-         .cfi_return_column r10
-         .cfi_offset r10, 0
-#endif
-         /* Compute address for stack frame linkage. */
-         addli   r10, sp, -(CLOSURE_FRAME_SIZE - REG_SIZE)
-        }
-        {
-         /* Save incoming stack pointer in linkage area. */
-         SW     r10, sp
-         .cfi_offset sp, -(CLOSURE_FRAME_SIZE - REG_SIZE)
-         /* Push a new stack frame. */
-         addli   sp, sp, -CLOSURE_FRAME_SIZE
-         .cfi_adjust_cfa_offset CLOSURE_FRAME_SIZE
-        }
-
-        {
-         /* Create pointer to where to start spilling registers. */
-         addi   r10, sp, LINKAGE_SIZE
-        }
-
-        /* Spill all the incoming registers. */
-        STORE_REG(r0, r10)
-        STORE_REG(r1, r10)
-        STORE_REG(r2, r10)
-        STORE_REG(r3, r10)
-        STORE_REG(r4, r10)
-        STORE_REG(r5, r10)
-        STORE_REG(r6, r10)
-        STORE_REG(r7, r10)
-        STORE_REG(r8, r10)
-        {
-         /* Save r9. */
-         SW     r10, r9
-#ifdef __tilegx__
-         /* Pointer to closure is passed in r11. */
-         move  r0, r11
-#else
-         /* Compute pointer to the closure object. Because the closure
-            starts with a "jal ffi_closure_tile", we can just take the
-            value of lr (a phony return address pointing into the closure)
-            and subtract 8. */
-         addi   r0, lr, -8
-#endif
-         /* Compute a pointer to the register arguments we just spilled. */
-         addi   r1, sp, LINKAGE_SIZE
-        }
-        {
-         /* Compute a pointer to the extra stack arguments (if any). */
-         addli   r2, sp, CLOSURE_FRAME_SIZE + LINKAGE_SIZE
-         /* Call C code to deal with all of the grotty details. */
-         jal    ffi_closure_tile_inner
-        }
-        {
-         addli   r10, sp, CLOSURE_FRAME_SIZE
-        }
-        {
-         /* Restore the return address. */
-         LW     lr, r10
-         /* Compute pointer to registers array. */
-         addli   r10, sp, LINKAGE_SIZE + (NUM_ARG_REGS * REG_SIZE)
-        }
-        /* Return all the register values, which C code may have set. */
-        LOAD_REG(r0, r10)
-        LOAD_REG(r1, r10)
-        LOAD_REG(r2, r10)
-        LOAD_REG(r3, r10)
-        LOAD_REG(r4, r10)
-        LOAD_REG(r5, r10)
-        LOAD_REG(r6, r10)
-        LOAD_REG(r7, r10)
-        LOAD_REG(r8, r10)
-        LOAD_REG(r9, r10)
-        {
-         /* Pop the frame. */
-         addli   sp, sp, CLOSURE_FRAME_SIZE
-         jrp    lr
-        }
-
-        .cfi_endproc
-        .size   ffi_closure_tile, . - ffi_closure_tile
-
-
-/* What follows are code template instructions that get copied to the
-   closure trampoline by ffi_prep_closure_loc.  The zeroed operands
-   get replaced by their proper values at runtime. */
-
-        .section .text.ffi_template_tramp_tile, "ax", @progbits
-        .align  8
-        .globl  ffi_template_tramp_tile
-        FFI_HIDDEN(ffi_template_tramp_tile)
-ffi_template_tramp_tile:
-#ifdef __tilegx__
-        {
-          moveli r11, 0 /* backpatched to address of containing closure. */
-          moveli r10, 0 /* backpatched to ffi_closure_tile. */
-        }
-        /* Note: the following bundle gets generated multiple times
-           depending on the pointer value (esp. useful for -m32 mode). */
-        { shl16insli r11, r11, 0 ; shl16insli r10, r10, 0 }
-        { info 2+8 /* for backtracer: -> pc in lr, frame size 0 */ ; jr r10 }
-#else
-        /* 'jal .' yields a PC-relative offset of zero so we can OR in the
-           right offset at runtime. */
-        { move r10, lr ; jal . /* ffi_closure_tile */ }
-#endif
-
-        .size   ffi_template_tramp_tile, . - ffi_template_tramp_tile
diff --git a/third_party/gofrontend/libffi/src/types.c b/third_party/gofrontend/libffi/src/types.c
deleted file mode 100644
index 7e80aec..0000000
--- a/third_party/gofrontend/libffi/src/types.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/* -----------------------------------------------------------------------
-   types.c - Copyright (c) 1996, 1998  Red Hat, Inc.
-   
-   Predefined ffi_types needed by libffi.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-/* Hide the basic type definitions from the header file, so that we
-   can redefine them here as "const".  */
-#define LIBFFI_HIDE_BASIC_TYPES
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-/* Type definitions */
-
-#define FFI_TYPEDEF(name, type, id, maybe_const)\
-struct struct_align_##name {			\
-  char c;					\
-  type x;					\
-};						\
-maybe_const ffi_type ffi_type_##name = {	\
-  sizeof(type),					\
-  offsetof(struct struct_align_##name, x),	\
-  id, NULL					\
-}
-
-#define FFI_COMPLEX_TYPEDEF(name, type, maybe_const)	\
-static ffi_type *ffi_elements_complex_##name [2] = {	\
-	(ffi_type *)(&ffi_type_##name), NULL		\
-};							\
-struct struct_align_complex_##name {			\
-  char c;						\
-  _Complex type x;					\
-};							\
-maybe_const ffi_type ffi_type_complex_##name = {	\
-  sizeof(_Complex type),				\
-  offsetof(struct struct_align_complex_##name, x),	\
-  FFI_TYPE_COMPLEX,					\
-  (ffi_type **)ffi_elements_complex_##name		\
-}
-
-/* Size and alignment are fake here. They must not be 0. */
-const ffi_type ffi_type_void = {
-  1, 1, FFI_TYPE_VOID, NULL
-};
-
-FFI_TYPEDEF(uint8, UINT8, FFI_TYPE_UINT8, const);
-FFI_TYPEDEF(sint8, SINT8, FFI_TYPE_SINT8, const);
-FFI_TYPEDEF(uint16, UINT16, FFI_TYPE_UINT16, const);
-FFI_TYPEDEF(sint16, SINT16, FFI_TYPE_SINT16, const);
-FFI_TYPEDEF(uint32, UINT32, FFI_TYPE_UINT32, const);
-FFI_TYPEDEF(sint32, SINT32, FFI_TYPE_SINT32, const);
-FFI_TYPEDEF(uint64, UINT64, FFI_TYPE_UINT64, const);
-FFI_TYPEDEF(sint64, SINT64, FFI_TYPE_SINT64, const);
-
-FFI_TYPEDEF(pointer, void*, FFI_TYPE_POINTER, const);
-
-FFI_TYPEDEF(float, float, FFI_TYPE_FLOAT, const);
-FFI_TYPEDEF(double, double, FFI_TYPE_DOUBLE, const);
-
-#if !defined HAVE_LONG_DOUBLE_VARIANT || defined __alpha__
-#define FFI_LDBL_CONST const
-#else
-#define FFI_LDBL_CONST
-#endif
-
-#ifdef __alpha__
-/* Even if we're not configured to default to 128-bit long double, 
-   maintain binary compatibility, as -mlong-double-128 can be used
-   at any time.  */
-/* Validate the hard-coded number below.  */
-# if defined(__LONG_DOUBLE_128__) && FFI_TYPE_LONGDOUBLE != 4
-#  error FFI_TYPE_LONGDOUBLE out of date
-# endif
-const ffi_type ffi_type_longdouble = { 16, 16, 4, NULL };
-#elif FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE, FFI_LDBL_CONST);
-#endif
-
-#ifdef FFI_TARGET_HAS_COMPLEX_TYPE
-FFI_COMPLEX_TYPEDEF(float, float, const);
-FFI_COMPLEX_TYPEDEF(double, double, const);
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-FFI_COMPLEX_TYPEDEF(longdouble, long double, FFI_LDBL_CONST);
-#endif
-#endif
diff --git a/third_party/gofrontend/libffi/src/vax/elfbsd.S b/third_party/gofrontend/libffi/src/vax/elfbsd.S
deleted file mode 100644
index 01ca313..0000000
--- a/third_party/gofrontend/libffi/src/vax/elfbsd.S
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (c) 2013 Miodrag Vallat.  <miod@openbsd.org>
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * ``Software''), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * vax Foreign Function Interface
- */
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-
-	.text
-
-/*
- * void *					%r0
- * ffi_call_elfbsd(extended_cif *ecif,		4(%ap)
- *		   unsigned bytes,		8(%ap)
- *		   unsigned flags,		12(%ap)
- *		   void *rvalue,		16(%ap)
- *		   void (*fn)());		20(%ap)
- */
-	.globl	ffi_call_elfbsd
-	.type	ffi_call_elfbsd,@function
-	.align	2
-ffi_call_elfbsd:
-	.word	0x00c		# save R2 and R3
-
-	# Allocate stack space for the args
-	subl2	8(%ap), %sp
-
-	# Call ffi_prep_args
-	pushl	%sp
-	pushl	4(%ap)
-	calls	$2, ffi_prep_args
-
-	# Get function pointer
-	movl	20(%ap), %r1
-
-	# Build a CALLS frame
-	ashl	$-2, 8(%ap), %r0
-	pushl	%r0		# argument stack usage
-	movl	%sp, %r0	# future %ap
-	# saved registers
-	bbc	$11, 0(%r1), 1f
-	pushl	%r11
-1:	bbc	$10, 0(%r1), 1f
-	pushl	%r10
-1:	bbc	$9, 0(%r1), 1f
-	pushl	%r9
-1:	bbc	$8, 0(%r1), 1f
-	pushl	%r8
-1:	bbc	$7, 0(%r1), 1f
-	pushl	%r7
-1:	bbc	$6, 0(%r1), 1f
-	pushl	%r6
-1:	bbc	$5, 0(%r1), 1f
-	pushl	%r5
-1:	bbc	$4, 0(%r1), 1f
-	pushl	%r4
-1:	bbc	$3, 0(%r1), 1f
-	pushl	%r3
-1:	bbc	$2, 0(%r1), 1f
-	pushl	%r2
-1:	
-	pushal	9f
-	pushl	%fp
-	pushl	%ap
-	movl	16(%ap), %r3	# struct return address, if needed
-	movl	%r0, %ap
-	movzwl	4(%fp), %r0	# previous PSW, without the saved registers mask
-	bisl2	$0x20000000, %r0 # calls frame
-	movzwl	0(%r1), %r2
-	bicw2	$0xf003, %r2	# only keep R11-R2
-	ashl	$16, %r2, %r2
-	bisl2	%r2, %r0	# saved register mask of the called function
-	pushl	%r0	
-	pushl	$0
-	movl	%sp, %fp
-
-	# Invoke the function
-	pushal	2(%r1)		# skip procedure entry mask
-	movl	%r3, %r1
-	bicpsw	$0x000f
-	rsb
-
-9:
-	# Copy return value if necessary
-	tstl	16(%ap)
-	jeql	9f
-	movl	16(%ap), %r2
-
-	bbc	$0, 12(%ap), 1f	# CIF_FLAGS_CHAR
-	movb	%r0, 0(%r2)
-	brb	9f
-1:
-	bbc	$1, 12(%ap), 1f	# CIF_FLAGS_SHORT
-	movw	%r0, 0(%r2)
-	brb	9f
-1:
-	bbc	$2, 12(%ap), 1f	# CIF_FLAGS_INT
-	movl	%r0, 0(%r2)
-	brb	9f
-1:
-	bbc	$3, 12(%ap), 1f	# CIF_FLAGS_DINT
-	movq	%r0, 0(%r2)
-	brb	9f
-1:
-	movl	%r1, %r0	# might have been a struct
-	#brb	9f
-
-9:
-	ret
-
-/*
- * ffi_closure_elfbsd(void);
- * invoked with	%r0: ffi_closure *closure
- */
-	.globl	ffi_closure_elfbsd
-	.type	ffi_closure_elfbsd, @function
-	.align	2
-ffi_closure_elfbsd:
-	.word	0
-
-	# Allocate room on stack for return value
-	subl2	$8, %sp
-
-	# Invoke the closure function
-	pushal	4(%ap)		# calling stack
-	pushal	4(%sp)		# return value
-	pushl	%r0		# closure
-	calls	$3, ffi_closure_elfbsd_inner
-
-	# Copy return value if necessary
-	bitb	$1, %r0		# CIF_FLAGS_CHAR
-	beql	1f
-	movb	0(%sp), %r0
-	brb	9f
-1:
-	bitb	$2, %r0		# CIF_FLAGS_SHORT
-	beql	1f
-	movw	0(%sp), %r0
-	brb	9f
-1:
-	bitb	$4, %r0		# CIF_FLAGS_INT
-	beql	1f
-	movl	0(%sp), %r0
-	brb	9f
-1:
-	bitb	$8, %r0		# CIF_FLAGS_DINT
-	beql	1f
-	movq	0(%sp), %r0
-	#brb	9f
-1:
-
-9:
-	ret
-
-/*
- * ffi_closure_struct_elfbsd(void);
- * invoked with	%r0: ffi_closure *closure
- *		%r1: struct return address
- */
-	.globl	ffi_closure_struct_elfbsd
-	.type	ffi_closure_struct_elfbsd, @function
-	.align	2
-ffi_closure_struct_elfbsd:
-	.word	0
-
-	# Invoke the closure function
-	pushal	4(%ap)		# calling stack
-	pushl	%r1		# return value
-	pushl	%r0		# closure
-	calls	$3, ffi_closure_elfbsd_inner
-
-	ret
diff --git a/third_party/gofrontend/libffi/src/vax/ffi.c b/third_party/gofrontend/libffi/src/vax/ffi.c
deleted file mode 100644
index f4d6bbb..0000000
--- a/third_party/gofrontend/libffi/src/vax/ffi.c
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (c) 2013 Miodrag Vallat.  <miod@openbsd.org>
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * ``Software''), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * vax Foreign Function Interface
- *
- * This file attempts to provide all the FFI entry points which can reliably
- * be implemented in C.
- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-#include <unistd.h>
-
-#define CIF_FLAGS_CHAR		1	/* for struct only */
-#define CIF_FLAGS_SHORT		2	/* for struct only */
-#define CIF_FLAGS_INT		4
-#define CIF_FLAGS_DINT		8
-
-/*
- * Foreign Function Interface API
- */
-
-void ffi_call_elfbsd (extended_cif *, unsigned, unsigned, void *,
-		       void (*) ());
-void *ffi_prep_args (extended_cif *ecif, void *stack);
-
-void *
-ffi_prep_args (extended_cif *ecif, void *stack)
-{
-  unsigned int i;
-  void **p_argv;
-  char *argp;
-  ffi_type **p_arg;
-  void *struct_value_ptr;
-
-  argp = stack;
-
-  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
-      && !ecif->cif->flags)
-    struct_value_ptr = ecif->rvalue;
-  else
-    struct_value_ptr = NULL;
-
-  p_argv = ecif->avalue;
-
-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
-       i != 0;
-       i--, p_arg++)
-    {
-      size_t z;
-
-      z = (*p_arg)->size;
-      if (z < sizeof (int))
-	{
-	  switch ((*p_arg)->type)
-	    {
-	    case FFI_TYPE_SINT8:
-	      *(signed int *) argp = (signed int) *(SINT8 *) *p_argv;
-	      break;
-
-	    case FFI_TYPE_UINT8:
-	      *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv;
-	      break;
-
-	    case FFI_TYPE_SINT16:
-	      *(signed int *) argp = (signed int) *(SINT16 *) *p_argv;
-	      break;
-
-	    case FFI_TYPE_UINT16:
-	      *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv;
-	      break;
-
-	    case FFI_TYPE_STRUCT:
-	      memcpy (argp, *p_argv, z);
-	      break;
-
-	    default:
-	      FFI_ASSERT (0);
-	    }
-	  z = sizeof (int);
-	}
-      else
-	{
-	  memcpy (argp, *p_argv, z);
-
-	  /* Align if necessary.  */
-	  if ((sizeof(int) - 1) & z)
-	    z = ALIGN(z, sizeof(int));
-	}
-
-      p_argv++;
-      argp += z;
-    }
-
-  return struct_value_ptr;
-}
-
-ffi_status
-ffi_prep_cif_machdep (ffi_cif *cif)
-{
-  /* Set the return type flag */
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_VOID:
-      cif->flags = 0;
-      break;
-
-    case FFI_TYPE_STRUCT:
-      if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT &&
-	  cif->rtype->elements[1])
-	{
-	  cif->flags = 0;
-	  break;
-	}
-
-      if (cif->rtype->size == sizeof (char))
-	cif->flags = CIF_FLAGS_CHAR;
-      else if (cif->rtype->size == sizeof (short))
-	cif->flags = CIF_FLAGS_SHORT;
-      else if (cif->rtype->size == sizeof (int))
-	cif->flags = CIF_FLAGS_INT;
-      else if (cif->rtype->size == 2 * sizeof (int))
-	cif->flags = CIF_FLAGS_DINT;
-      else
-	cif->flags = 0;
-      break;
-
-    default:
-      if (cif->rtype->size <= sizeof (int))
-	cif->flags = CIF_FLAGS_INT;
-      else
-	cif->flags = CIF_FLAGS_DINT;
-      break;
-    }
-
-  return FFI_OK;
-}
-
-void
-ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue)
-{
-  extended_cif ecif;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-
-  /* If the return value is a struct and we don't have a return value
-     address then we need to make one.  */
-
-  if (rvalue == NULL
-      && cif->rtype->type == FFI_TYPE_STRUCT
-      && cif->flags == 0)
-    ecif.rvalue = alloca (cif->rtype->size);
-  else
-    ecif.rvalue = rvalue;
-
-  switch (cif->abi)
-    {
-    case FFI_ELFBSD:
-      ffi_call_elfbsd (&ecif, cif->bytes, cif->flags, ecif.rvalue, fn);
-      break;
-
-    default:
-      FFI_ASSERT (0);
-      break;
-    }
-}
-
-/*
- * Closure API
- */
-
-void ffi_closure_elfbsd (void);
-void ffi_closure_struct_elfbsd (void);
-unsigned int ffi_closure_elfbsd_inner (ffi_closure *, void *, char *);
-
-static void
-ffi_prep_closure_elfbsd (ffi_cif *cif, void **avalue, char *stackp)
-{
-  unsigned int i;
-  void **p_argv;
-  ffi_type **p_arg;
-
-  p_argv = avalue;
-
-  for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++)
-    {
-      size_t z;
-
-      z = (*p_arg)->size;
-      *p_argv = stackp;
-
-      /* Align if necessary */
-      if ((sizeof (int) - 1) & z)
-	z = ALIGN(z, sizeof (int));
-
-      p_argv++;
-      stackp += z;
-    }
-}
-
-unsigned int
-ffi_closure_elfbsd_inner (ffi_closure *closure, void *resp, char *stack)
-{
-  ffi_cif *cif;
-  void **arg_area;
-
-  cif = closure->cif;
-  arg_area = (void **) alloca (cif->nargs * sizeof (void *));
-
-  ffi_prep_closure_elfbsd (cif, arg_area, stack);
-
-  (closure->fun) (cif, resp, arg_area, closure->user_data);
-
-  return cif->flags;
-}
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure *closure, ffi_cif *cif,
-		      void (*fun)(ffi_cif *, void *, void **, void *),
-		      void *user_data, void *codeloc)
-{
-  char *tramp = (char *) codeloc;
-  void *fn;
-
-  FFI_ASSERT (cif->abi == FFI_ELFBSD);
-
-  /* entry mask */
-  *(unsigned short *)(tramp + 0) = 0x0000;
-  /* movl #closure, r0 */
-  tramp[2] = 0xd0;
-  tramp[3] = 0x8f;
-  *(unsigned int *)(tramp + 4) = (unsigned int) closure;
-  tramp[8] = 0x50;
-
-  if (cif->rtype->type == FFI_TYPE_STRUCT
-      && !cif->flags)
-    fn = &ffi_closure_struct_elfbsd;
-  else
-    fn = &ffi_closure_elfbsd;
-
-  /* jmpl #fn */
-  tramp[9] = 0x17;
-  tramp[10] = 0xef;
-  *(unsigned int *)(tramp + 11) = (unsigned int)fn + 2 -
-				  (unsigned int)tramp - 9 - 6;
-
-  closure->cif = cif;
-  closure->user_data = user_data;
-  closure->fun = fun;
-
-  return FFI_OK;
-}
diff --git a/third_party/gofrontend/libffi/src/vax/ffitarget.h b/third_party/gofrontend/libffi/src/vax/ffitarget.h
deleted file mode 100644
index 2fc9488..0000000
--- a/third_party/gofrontend/libffi/src/vax/ffitarget.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2013 Miodrag Vallat.  <miod@openbsd.org>
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * ``Software''), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * vax Foreign Function Interface
- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_ASM
-typedef unsigned long ffi_arg;
-typedef signed long ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_ELFBSD,
-  FFI_DEFAULT_ABI = FFI_ELFBSD,
-  FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
-} ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_TRAMPOLINE_SIZE 15
-#define FFI_NATIVE_RAW_API 0
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/x86/darwin.S b/third_party/gofrontend/libffi/src/x86/darwin.S
deleted file mode 100644
index 8f0f070..0000000
--- a/third_party/gofrontend/libffi/src/x86/darwin.S
+++ /dev/null
@@ -1,444 +0,0 @@
-/* -----------------------------------------------------------------------
-   darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005  Red Hat, Inc.
-	Copyright (C) 2008  Free Software Foundation, Inc.
-
-   X86 Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   -----------------------------------------------------------------------
-   */
-
-#ifndef __x86_64__
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-
-.text
-
-.globl _ffi_prep_args
-
-	.align 4
-.globl _ffi_call_SYSV
-
-_ffi_call_SYSV:
-.LFB1:
-        pushl %ebp
-.LCFI0:
-        movl  %esp,%ebp
-.LCFI1:
-        subl $8,%esp
-	/* Make room for all of the new args.  */
-	movl  16(%ebp),%ecx
-	subl  %ecx,%esp
-
-	movl  %esp,%eax
-
-	/* Place all of the ffi_prep_args in position  */
-	subl  $8,%esp
-	pushl 12(%ebp)
-	pushl %eax
-	call  *8(%ebp)
-
-	/* Return stack to previous state and call the function  */
-	addl  $16,%esp	
-
-	call  *28(%ebp)
-
-	/* Load %ecx with the return type code  */
-	movl  20(%ebp),%ecx	
-
-	/* Protect %esi.  We're going to pop it in the epilogue.  */
-	pushl %esi
-
-	/* If the return value pointer is NULL, assume no return value.  */
-	cmpl  $0,24(%ebp)
-	jne  0f
-
-	/* Even if there is no space for the return value, we are 
-	   obliged to handle floating-point values.  */
-	cmpl  $FFI_TYPE_FLOAT,%ecx
-	jne   noretval
-	fstp  %st(0)
-
-	jmp   epilogue
-0:
-	.align 4
-	call 1f
-.Lstore_table:
-	.long   noretval-.Lstore_table		/* FFI_TYPE_VOID */
-	.long   retint-.Lstore_table		/* FFI_TYPE_INT */
-	.long   retfloat-.Lstore_table		/* FFI_TYPE_FLOAT */
-	.long   retdouble-.Lstore_table		/* FFI_TYPE_DOUBLE */
-	.long   retlongdouble-.Lstore_table     /* FFI_TYPE_LONGDOUBLE */
-	.long   retuint8-.Lstore_table		/* FFI_TYPE_UINT8 */
-	.long   retsint8-.Lstore_table		/* FFI_TYPE_SINT8 */
-	.long   retuint16-.Lstore_table		/* FFI_TYPE_UINT16 */
-	.long   retsint16-.Lstore_table		/* FFI_TYPE_SINT16 */
-	.long   retint-.Lstore_table		/* FFI_TYPE_UINT32 */
-	.long   retint-.Lstore_table		/* FFI_TYPE_SINT32 */
-	.long   retint64-.Lstore_table		/* FFI_TYPE_UINT64 */
-	.long   retint64-.Lstore_table		/* FFI_TYPE_SINT64 */
-	.long   retstruct-.Lstore_table		/* FFI_TYPE_STRUCT */
-	.long   retint-.Lstore_table		/* FFI_TYPE_POINTER */
-	.long   retstruct1b-.Lstore_table	/* FFI_TYPE_SMALL_STRUCT_1B */
-	.long   retstruct2b-.Lstore_table	/* FFI_TYPE_SMALL_STRUCT_2B */
-1:
-	pop  %esi
-	add  (%esi, %ecx, 4), %esi
-	jmp  *%esi
-
-	/* Sign/zero extend as appropriate.  */
-retsint8:
-	movsbl  %al, %eax
-	jmp  retint
-
-retsint16:
-	movswl  %ax, %eax
-	jmp  retint
-
-retuint8:
-	movzbl  %al, %eax
-	jmp  retint
-
-retuint16:
-	movzwl  %ax, %eax
-	jmp  retint
-
-retfloat:
-	/* Load %ecx with the pointer to storage for the return value  */
-	movl  24(%ebp),%ecx
-	fstps (%ecx)
-	jmp   epilogue
-
-retdouble:
-	/* Load %ecx with the pointer to storage for the return value  */
-	movl  24(%ebp),%ecx
-	fstpl (%ecx)
-	jmp   epilogue
-
-retlongdouble:
-	/* Load %ecx with the pointer to storage for the return value  */
-	movl  24(%ebp),%ecx
-	fstpt (%ecx)
-	jmp   epilogue
-
-retint64:
-	/* Load %ecx with the pointer to storage for the return value  */
-	movl  24(%ebp),%ecx
-	movl  %eax,0(%ecx)
-	movl  %edx,4(%ecx)
-	jmp   epilogue
-
-retstruct1b:
-	/* Load %ecx with the pointer to storage for the return value  */
-	movl  24(%ebp),%ecx
-	movb  %al,0(%ecx)
-	jmp   epilogue
-
-retstruct2b:
-	/* Load %ecx with the pointer to storage for the return value  */
-	movl  24(%ebp),%ecx
-	movw  %ax,0(%ecx)
-	jmp   epilogue
-
-retint:
-	/* Load %ecx with the pointer to storage for the return value  */
-	movl  24(%ebp),%ecx
-	movl  %eax,0(%ecx)
-
-retstruct:
-	/* Nothing to do!  */
-
-noretval:
-epilogue:
-	popl %esi
-	movl %ebp,%esp
-	popl %ebp
-	ret
-
-.LFE1:
-.ffi_call_SYSV_end:
-
-	.align	4
-FFI_HIDDEN (ffi_closure_SYSV)
-.globl _ffi_closure_SYSV
-
-_ffi_closure_SYSV:
-.LFB2:
-	pushl	%ebp
-.LCFI2:
-	movl	%esp, %ebp
-.LCFI3:
-	subl	$40, %esp
-	leal	-24(%ebp), %edx
-	movl	%edx, -12(%ebp)	/* resp */
-	leal	8(%ebp), %edx
-	movl	%edx, 4(%esp)	/* args = __builtin_dwarf_cfa () */
-	leal	-12(%ebp), %edx
-	movl	%edx, (%esp)	/* &resp */
-	movl	%ebx, 8(%esp)
-.LCFI7:
-	call	L_ffi_closure_SYSV_inner$stub
-	movl	8(%esp), %ebx
-	movl	-12(%ebp), %ecx
-	cmpl	$FFI_TYPE_INT, %eax
-	je	.Lcls_retint
-
-	/* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
-	   FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
-	cmpl	$FFI_TYPE_UINT64, %eax
-	jge	0f
-	cmpl	$FFI_TYPE_UINT8, %eax
-	jge	.Lcls_retint
-
-0:	cmpl	$FFI_TYPE_FLOAT, %eax
-	je	.Lcls_retfloat
-	cmpl	$FFI_TYPE_DOUBLE, %eax
-	je	.Lcls_retdouble
-	cmpl	$FFI_TYPE_LONGDOUBLE, %eax
-	je	.Lcls_retldouble
-	cmpl	$FFI_TYPE_SINT64, %eax
-	je	.Lcls_retllong
-	cmpl	$FFI_TYPE_SMALL_STRUCT_1B, %eax
-	je	.Lcls_retstruct1b
-	cmpl	$FFI_TYPE_SMALL_STRUCT_2B, %eax
-	je	.Lcls_retstruct2b
-	cmpl	$FFI_TYPE_STRUCT, %eax
-	je	.Lcls_retstruct
-.Lcls_epilogue:
-	movl	%ebp, %esp
-	popl	%ebp
-	ret
-.Lcls_retint:
-	movl	(%ecx), %eax
-	jmp	.Lcls_epilogue
-.Lcls_retfloat:
-	flds	(%ecx)
-	jmp	.Lcls_epilogue
-.Lcls_retdouble:
-	fldl	(%ecx)
-	jmp	.Lcls_epilogue
-.Lcls_retldouble:
-	fldt	(%ecx)
-	jmp	.Lcls_epilogue
-.Lcls_retllong:
-	movl	(%ecx), %eax
-	movl	4(%ecx), %edx
-	jmp	.Lcls_epilogue
-.Lcls_retstruct1b:
-	movsbl	(%ecx), %eax
-	jmp	.Lcls_epilogue
-.Lcls_retstruct2b:
-	movswl	(%ecx), %eax
-	jmp	.Lcls_epilogue
-.Lcls_retstruct:
-	lea -8(%ebp),%esp
-	movl	%ebp, %esp
-	popl	%ebp
-	ret $4
-.LFE2:
-
-#if !FFI_NO_RAW_API
-
-#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
-#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
-#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
-#define CIF_FLAGS_OFFSET 20
-
-	.align	4
-FFI_HIDDEN (ffi_closure_raw_SYSV)
-.globl _ffi_closure_raw_SYSV
-
-_ffi_closure_raw_SYSV:
-.LFB3:
-	pushl	%ebp
-.LCFI4:
-	movl	%esp, %ebp
-.LCFI5:
-	pushl	%esi
-.LCFI6:
-	subl	$36, %esp
-	movl	RAW_CLOSURE_CIF_OFFSET(%eax), %esi	 /* closure->cif */
-	movl	RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
-	movl	%edx, 12(%esp)	/* user_data */
-	leal	8(%ebp), %edx	/* __builtin_dwarf_cfa () */
-	movl	%edx, 8(%esp)	/* raw_args */
-	leal	-24(%ebp), %edx
-	movl	%edx, 4(%esp)	/* &res */
-	movl	%esi, (%esp)	/* cif */
-	call	*RAW_CLOSURE_FUN_OFFSET(%eax)		 /* closure->fun */
-	movl	CIF_FLAGS_OFFSET(%esi), %eax		 /* rtype */
-	cmpl	$FFI_TYPE_INT, %eax
-	je	.Lrcls_retint
-
-	/* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
-	   FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
-	cmpl	$FFI_TYPE_UINT64, %eax
-	jge	0f
-	cmpl	$FFI_TYPE_UINT8, %eax
-	jge	.Lrcls_retint
-0:
-	cmpl	$FFI_TYPE_FLOAT, %eax
-	je	.Lrcls_retfloat
-	cmpl	$FFI_TYPE_DOUBLE, %eax
-	je	.Lrcls_retdouble
-	cmpl	$FFI_TYPE_LONGDOUBLE, %eax
-	je	.Lrcls_retldouble
-	cmpl	$FFI_TYPE_SINT64, %eax
-	je	.Lrcls_retllong
-.Lrcls_epilogue:
-	addl	$36, %esp
-	popl	%esi
-	popl	%ebp
-	ret
-.Lrcls_retint:
-	movl	-24(%ebp), %eax
-	jmp	.Lrcls_epilogue
-.Lrcls_retfloat:
-	flds	-24(%ebp)
-	jmp	.Lrcls_epilogue
-.Lrcls_retdouble:
-	fldl	-24(%ebp)
-	jmp	.Lrcls_epilogue
-.Lrcls_retldouble:
-	fldt	-24(%ebp)
-	jmp	.Lrcls_epilogue
-.Lrcls_retllong:
-	movl	-24(%ebp), %eax
-	movl	-20(%ebp), %edx
-	jmp	.Lrcls_epilogue
-.LFE3:
-#endif
-
-.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5
-L_ffi_closure_SYSV_inner$stub:
-	.indirect_symbol _ffi_closure_SYSV_inner
-	hlt ; hlt ; hlt ; hlt ; hlt
-
-
-.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
-EH_frame1:
-	.set	L$set$0,LECIE1-LSCIE1
-	.long	L$set$0
-LSCIE1:
-	.long	0x0
-	.byte	0x1
-	.ascii "zR\0"
-	.byte	0x1
-	.byte	0x7c
-	.byte	0x8
-	.byte	0x1
-	.byte	0x10
-	.byte	0xc
-	.byte	0x5
-	.byte	0x4
-	.byte	0x88
-	.byte	0x1
-	.align 2
-LECIE1:
-.globl _ffi_call_SYSV.eh
-_ffi_call_SYSV.eh:
-LSFDE1:
-	.set	L$set$1,LEFDE1-LASFDE1
-	.long	L$set$1
-LASFDE1:
-	.long	LASFDE1-EH_frame1
-	.long	.LFB1-.
-	.set L$set$2,.LFE1-.LFB1
-	.long L$set$2
-	.byte	0x0
-	.byte	0x4
-	.set L$set$3,.LCFI0-.LFB1
-	.long L$set$3
-	.byte	0xe
-	.byte	0x8
-	.byte	0x84
-	.byte	0x2
-	.byte	0x4
-	.set L$set$4,.LCFI1-.LCFI0
-	.long L$set$4
-	.byte	0xd
-	.byte	0x4
-	.align 2
-LEFDE1:
-.globl _ffi_closure_SYSV.eh
-_ffi_closure_SYSV.eh:
-LSFDE2:
-	.set	L$set$5,LEFDE2-LASFDE2
-	.long	L$set$5
-LASFDE2:
-	.long	LASFDE2-EH_frame1
-	.long	.LFB2-.
-	.set L$set$6,.LFE2-.LFB2
-	.long L$set$6
-	.byte	0x0
-	.byte	0x4
-	.set L$set$7,.LCFI2-.LFB2
-	.long L$set$7
-	.byte	0xe
-	.byte	0x8
-	.byte	0x84
-	.byte	0x2
-	.byte	0x4
-	.set L$set$8,.LCFI3-.LCFI2
-	.long L$set$8
-	.byte	0xd
-	.byte	0x4
-	.align 2
-LEFDE2:
-
-#if !FFI_NO_RAW_API
-
-.globl _ffi_closure_raw_SYSV.eh
-_ffi_closure_raw_SYSV.eh:
-LSFDE3:
-	.set	L$set$10,LEFDE3-LASFDE3
-	.long	L$set$10
-LASFDE3:
-	.long	LASFDE3-EH_frame1
-	.long	.LFB3-.
-	.set L$set$11,.LFE3-.LFB3
-	.long L$set$11
-	.byte	0x0
-	.byte	0x4
-	.set L$set$12,.LCFI4-.LFB3
-	.long L$set$12
-	.byte	0xe
-	.byte	0x8
-	.byte	0x84
-	.byte	0x2
-	.byte	0x4
-	.set L$set$13,.LCFI5-.LCFI4
-	.long L$set$13
-	.byte	0xd
-	.byte	0x4
-	.byte	0x4
-	.set L$set$14,.LCFI6-.LCFI5
-	.long L$set$14
-	.byte	0x85
-	.byte	0x3
-	.align 2
-LEFDE3:
-
-#endif
-
-#endif /* ifndef __x86_64__ */
diff --git a/third_party/gofrontend/libffi/src/x86/darwin64.S b/third_party/gofrontend/libffi/src/x86/darwin64.S
deleted file mode 100644
index 2f7394e..0000000
--- a/third_party/gofrontend/libffi/src/x86/darwin64.S
+++ /dev/null
@@ -1,416 +0,0 @@
-/* -----------------------------------------------------------------------
-   darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc.
-	        Copyright (c) 2008 Red Hat, Inc.
-   derived from unix64.S
-
-   x86-64 Foreign Function Interface for Darwin.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
-   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
-   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-   OTHER DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#ifdef __x86_64__
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-
-	.file "darwin64.S"
-.text
-
-/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
-		    void *raddr, void (*fnaddr)(void));
-
-   Bit o trickiness here -- ARGS+BYTES is the base of the stack frame
-   for this function.  This has been allocated by ffi_call.  We also
-   deallocate some of the stack that has been alloca'd.  */
-
-	.align	3
-	.globl	_ffi_call_unix64
-
-_ffi_call_unix64:
-LUW0:
-	movq	(%rsp), %r10		/* Load return address.  */
-	leaq	(%rdi, %rsi), %rax	/* Find local stack base.  */
-	movq	%rdx, (%rax)		/* Save flags.  */
-	movq	%rcx, 8(%rax)		/* Save raddr.  */
-	movq	%rbp, 16(%rax)		/* Save old frame pointer.  */
-	movq	%r10, 24(%rax)		/* Relocate return address.  */
-	movq	%rax, %rbp		/* Finalize local stack frame.  */
-LUW1:
-	movq	%rdi, %r10		/* Save a copy of the register area. */
-	movq	%r8, %r11		/* Save a copy of the target fn.  */
-	movl	%r9d, %eax		/* Set number of SSE registers.  */
-
-	/* Load up all argument registers.  */
-	movq	(%r10), %rdi
-	movq	8(%r10), %rsi
-	movq	16(%r10), %rdx
-	movq	24(%r10), %rcx
-	movq	32(%r10), %r8
-	movq	40(%r10), %r9
-	testl	%eax, %eax
-	jnz	Lload_sse
-Lret_from_load_sse:
-
-	/* Deallocate the reg arg area.  */
-	leaq	176(%r10), %rsp
-
-	/* Call the user function.  */
-	call	*%r11
-
-	/* Deallocate stack arg area; local stack frame in redzone.  */
-	leaq	24(%rbp), %rsp
-
-	movq	0(%rbp), %rcx		/* Reload flags.  */
-	movq	8(%rbp), %rdi		/* Reload raddr.  */
-	movq	16(%rbp), %rbp		/* Reload old frame pointer.  */
-LUW2:
-
-	/* The first byte of the flags contains the FFI_TYPE.  */
-	movzbl	%cl, %r10d
-	leaq	Lstore_table(%rip), %r11
-	movslq	(%r11, %r10, 4), %r10
-	addq	%r11, %r10
-	jmp	*%r10
-
-Lstore_table:
-	.long	Lst_void-Lstore_table		/* FFI_TYPE_VOID */
-	.long	Lst_sint32-Lstore_table		/* FFI_TYPE_INT */
-	.long	Lst_float-Lstore_table		/* FFI_TYPE_FLOAT */
-	.long	Lst_double-Lstore_table		/* FFI_TYPE_DOUBLE */
-	.long	Lst_ldouble-Lstore_table	/* FFI_TYPE_LONGDOUBLE */
-	.long	Lst_uint8-Lstore_table		/* FFI_TYPE_UINT8 */
-	.long	Lst_sint8-Lstore_table		/* FFI_TYPE_SINT8 */
-	.long	Lst_uint16-Lstore_table		/* FFI_TYPE_UINT16 */
-	.long	Lst_sint16-Lstore_table		/* FFI_TYPE_SINT16 */
-	.long	Lst_uint32-Lstore_table		/* FFI_TYPE_UINT32 */
-	.long	Lst_sint32-Lstore_table		/* FFI_TYPE_SINT32 */
-	.long	Lst_int64-Lstore_table		/* FFI_TYPE_UINT64 */
-	.long	Lst_int64-Lstore_table		/* FFI_TYPE_SINT64 */
-	.long	Lst_struct-Lstore_table		/* FFI_TYPE_STRUCT */
-	.long	Lst_int64-Lstore_table		/* FFI_TYPE_POINTER */
-
-	.text
-	.align	3
-Lst_void:
-	ret
-	.align	3
-Lst_uint8:
-	movzbq	%al, %rax
-	movq	%rax, (%rdi)
-	ret
-	.align	3
-Lst_sint8:
-	movsbq	%al, %rax
-	movq	%rax, (%rdi)
-	ret
-	.align	3
-Lst_uint16:
-	movzwq	%ax, %rax
-	movq	%rax, (%rdi)
-	.align	3
-Lst_sint16:
-	movswq	%ax, %rax
-	movq	%rax, (%rdi)
-	ret
-	.align	3
-Lst_uint32:
-	movl	%eax, %eax
-	movq	%rax, (%rdi)
-	.align	3
-Lst_sint32:
-	cltq
-	movq	%rax, (%rdi)
-	ret
-	.align	3
-Lst_int64:
-	movq	%rax, (%rdi)
-	ret
-	.align	3
-Lst_float:
-	movss	%xmm0, (%rdi)
-	ret
-	.align	3
-Lst_double:
-	movsd	%xmm0, (%rdi)
-	ret
-Lst_ldouble:
-	fstpt	(%rdi)
-	ret
-	.align	3
-Lst_struct:
-	leaq	-20(%rsp), %rsi		/* Scratch area in redzone.  */
-
-	/* We have to locate the values now, and since we don't want to
-	   write too much data into the user's return value, we spill the
-	   value to a 16 byte scratch area first.  Bits 8, 9, and 10
-	   control where the values are located.  Only one of the three
-	   bits will be set; see ffi_prep_cif_machdep for the pattern.  */
-	movd	%xmm0, %r10
-	movd	%xmm1, %r11
-	testl	$0x100, %ecx
-	cmovnz	%rax, %rdx
-	cmovnz	%r10, %rax
-	testl	$0x200, %ecx
-	cmovnz	%r10, %rdx
-	testl	$0x400, %ecx
-	cmovnz	%r10, %rax
-	cmovnz	%r11, %rdx
-	movq	%rax, (%rsi)
-	movq	%rdx, 8(%rsi)
-
-	/* Bits 12-31 contain the true size of the structure.  Copy from
-	   the scratch area to the true destination.  */
-	shrl	$12, %ecx
-	rep movsb
-	ret
-
-	/* Many times we can avoid loading any SSE registers at all.
-	   It's not worth an indirect jump to load the exact set of
-	   SSE registers needed; zero or all is a good compromise.  */
-	.align	3
-LUW3:
-Lload_sse:
-	movdqa	48(%r10), %xmm0
-	movdqa	64(%r10), %xmm1
-	movdqa	80(%r10), %xmm2
-	movdqa	96(%r10), %xmm3
-	movdqa	112(%r10), %xmm4
-	movdqa	128(%r10), %xmm5
-	movdqa	144(%r10), %xmm6
-	movdqa	160(%r10), %xmm7
-	jmp	Lret_from_load_sse
-
-LUW4:
-	.align	3
-	.globl	_ffi_closure_unix64
-
-_ffi_closure_unix64:
-LUW5:
-	/* The carry flag is set by the trampoline iff SSE registers
-	   are used.  Don't clobber it before the branch instruction.  */
-	leaq    -200(%rsp), %rsp
-LUW6:
-	movq	%rdi, (%rsp)
-	movq    %rsi, 8(%rsp)
-	movq    %rdx, 16(%rsp)
-	movq    %rcx, 24(%rsp)
-	movq    %r8, 32(%rsp)
-	movq    %r9, 40(%rsp)
-	jc      Lsave_sse
-Lret_from_save_sse:
-
-	movq	%r10, %rdi
-	leaq	176(%rsp), %rsi
-	movq	%rsp, %rdx
-	leaq	208(%rsp), %rcx
-	call	_ffi_closure_unix64_inner
-
-	/* Deallocate stack frame early; return value is now in redzone.  */
-	addq	$200, %rsp
-LUW7:
-
-	/* The first byte of the return value contains the FFI_TYPE.  */
-	movzbl	%al, %r10d
-	leaq	Lload_table(%rip), %r11
-	movslq	(%r11, %r10, 4), %r10
-	addq	%r11, %r10
-	jmp	*%r10
-
-Lload_table:
-	.long	Lld_void-Lload_table		/* FFI_TYPE_VOID */
-	.long	Lld_int32-Lload_table		/* FFI_TYPE_INT */
-	.long	Lld_float-Lload_table		/* FFI_TYPE_FLOAT */
-	.long	Lld_double-Lload_table		/* FFI_TYPE_DOUBLE */
-	.long	Lld_ldouble-Lload_table		/* FFI_TYPE_LONGDOUBLE */
-	.long	Lld_int8-Lload_table		/* FFI_TYPE_UINT8 */
-	.long	Lld_int8-Lload_table		/* FFI_TYPE_SINT8 */
-	.long	Lld_int16-Lload_table		/* FFI_TYPE_UINT16 */
-	.long	Lld_int16-Lload_table		/* FFI_TYPE_SINT16 */
-	.long	Lld_int32-Lload_table		/* FFI_TYPE_UINT32 */
-	.long	Lld_int32-Lload_table		/* FFI_TYPE_SINT32 */
-	.long	Lld_int64-Lload_table		/* FFI_TYPE_UINT64 */
-	.long	Lld_int64-Lload_table		/* FFI_TYPE_SINT64 */
-	.long	Lld_struct-Lload_table		/* FFI_TYPE_STRUCT */
-	.long	Lld_int64-Lload_table		/* FFI_TYPE_POINTER */
-
-	.text
-	.align	3
-Lld_void:
-	ret
-	.align	3
-Lld_int8:
-	movzbl	-24(%rsp), %eax
-	ret
-	.align	3
-Lld_int16:
-	movzwl	-24(%rsp), %eax
-	ret
-	.align	3
-Lld_int32:
-	movl	-24(%rsp), %eax
-	ret
-	.align	3
-Lld_int64:
-	movq	-24(%rsp), %rax
-	ret
-	.align	3
-Lld_float:
-	movss	-24(%rsp), %xmm0
-	ret
-	.align	3
-Lld_double:
-	movsd	-24(%rsp), %xmm0
-	ret
-	.align	3
-Lld_ldouble:
-	fldt	-24(%rsp)
-	ret
-	.align	3
-Lld_struct:
-	/* There are four possibilities here, %rax/%rdx, %xmm0/%rax,
-	   %rax/%xmm0, %xmm0/%xmm1.  We collapse two by always loading
-	   both rdx and xmm1 with the second word.  For the remaining,
-	   bit 8 set means xmm0 gets the second word, and bit 9 means
-	   that rax gets the second word.  */
-	movq	-24(%rsp), %rcx
-	movq	-16(%rsp), %rdx
-	movq	-16(%rsp), %xmm1
-	testl	$0x100, %eax
-	cmovnz	%rdx, %rcx
-	movd	%rcx, %xmm0
-	testl	$0x200, %eax
-	movq	-24(%rsp), %rax
-	cmovnz	%rdx, %rax
-	ret
-
-	/* See the comment above Lload_sse; the same logic applies here.  */
-	.align	3
-LUW8:
-Lsave_sse:
-	movdqa	%xmm0, 48(%rsp)
-	movdqa	%xmm1, 64(%rsp)
-	movdqa	%xmm2, 80(%rsp)
-	movdqa	%xmm3, 96(%rsp)
-	movdqa	%xmm4, 112(%rsp)
-	movdqa	%xmm5, 128(%rsp)
-	movdqa	%xmm6, 144(%rsp)
-	movdqa	%xmm7, 160(%rsp)
-	jmp	Lret_from_save_sse
-
-LUW9:
-.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
-EH_frame1:
-	.set	L$set$0,LECIE1-LSCIE1		/* CIE Length */
-	.long	L$set$0
-LSCIE1:
-	.long	0x0		/* CIE Identifier Tag */
-	.byte	0x1		/* CIE Version */
-	.ascii	"zR\0"		/* CIE Augmentation */
-	.byte	0x1		/* uleb128 0x1; CIE Code Alignment Factor */
-	.byte	0x78		/* sleb128 -8; CIE Data Alignment Factor */
-	.byte	0x10		/* CIE RA Column */
-	.byte	0x1		/* uleb128 0x1; Augmentation size */
-	.byte	0x10		/* FDE Encoding (pcrel sdata4) */
-	.byte	0xc		/* DW_CFA_def_cfa, %rsp offset 8 */
-	.byte	0x7		/* uleb128 0x7 */
-	.byte	0x8		/* uleb128 0x8 */
-	.byte	0x90		/* DW_CFA_offset, column 0x10 */
-	.byte	0x1
-	.align	3
-LECIE1:
-	.globl _ffi_call_unix64.eh
-_ffi_call_unix64.eh:
-LSFDE1:
-	.set	L$set$1,LEFDE1-LASFDE1	/* FDE Length */
-	.long	L$set$1
-LASFDE1:
-	.long	LASFDE1-EH_frame1	/* FDE CIE offset */
-	.quad	LUW0-.			/* FDE initial location */
-	.set	L$set$2,LUW4-LUW0	/* FDE address range */
-	.quad	L$set$2
-	.byte	0x0			/* Augmentation size */
-	.byte	0x4			/* DW_CFA_advance_loc4 */
-	.set	L$set$3,LUW1-LUW0
-	.long	L$set$3
-
-	/* New stack frame based off rbp.  This is a itty bit of unwind
-	   trickery in that the CFA *has* changed.  There is no easy way
-	   to describe it correctly on entry to the function.  Fortunately,
-	   it doesn't matter too much since at all points we can correctly
-	   unwind back to ffi_call.  Note that the location to which we
-	   moved the return address is (the new) CFA-8, so from the
-	   perspective of the unwind info, it hasn't moved.  */
-	.byte	0xc			/* DW_CFA_def_cfa, %rbp offset 32 */
-	.byte	0x6
-	.byte	0x20
-	.byte	0x80+6			/* DW_CFA_offset, %rbp offset 2*-8 */
-	.byte	0x2
-	.byte	0xa			/* DW_CFA_remember_state */
-
-	.byte	0x4			/* DW_CFA_advance_loc4 */
-	.set	L$set$4,LUW2-LUW1
-	.long	L$set$4
-	.byte	0xc			/* DW_CFA_def_cfa, %rsp offset 8 */
-	.byte	0x7
-	.byte	0x8
-	.byte	0xc0+6			/* DW_CFA_restore, %rbp */
-
-	.byte	0x4			/* DW_CFA_advance_loc4 */
-	.set	L$set$5,LUW3-LUW2
-	.long	L$set$5
-	.byte	0xb			/* DW_CFA_restore_state */
-
-	.align	3
-LEFDE1:
-	.globl _ffi_closure_unix64.eh
-_ffi_closure_unix64.eh:
-LSFDE3:
-	.set	L$set$6,LEFDE3-LASFDE3	/* FDE Length */
-	.long	L$set$6
-LASFDE3:
-	.long	LASFDE3-EH_frame1	/* FDE CIE offset */
-	.quad	LUW5-.			/* FDE initial location */
-	.set	L$set$7,LUW9-LUW5	/* FDE address range */
-	.quad	L$set$7
-	.byte	0x0			/* Augmentation size */
-
-	.byte	0x4			/* DW_CFA_advance_loc4 */
-	.set	L$set$8,LUW6-LUW5
-	.long	L$set$8
-	.byte	0xe			/* DW_CFA_def_cfa_offset */
-	.byte	208,1			/* uleb128 208 */
-	.byte	0xa			/* DW_CFA_remember_state */
-
-	.byte	0x4			/* DW_CFA_advance_loc4 */
-	.set	L$set$9,LUW7-LUW6
-	.long	L$set$9
-	.byte	0xe			/* DW_CFA_def_cfa_offset */
-	.byte	0x8
-
-	.byte	0x4			/* DW_CFA_advance_loc4 */
-	.set	L$set$10,LUW8-LUW7
-	.long	L$set$10
-	.byte	0xb			/* DW_CFA_restore_state */
-
-	.align	3
-LEFDE3:
-	.subsections_via_symbols
-
-#endif /* __x86_64__ */
diff --git a/third_party/gofrontend/libffi/src/x86/darwin64_c.c b/third_party/gofrontend/libffi/src/x86/darwin64_c.c
deleted file mode 100644
index 1daa1c0..0000000
--- a/third_party/gofrontend/libffi/src/x86/darwin64_c.c
+++ /dev/null
@@ -1,643 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi64.c - Copyright (c) 20011  Anthony Green
-             Copyright (c) 2008, 2010  Red Hat, Inc.
-             Copyright (c) 2002, 2007  Bo Thorsen <bo@suse.de>
-             
-   x86-64 Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-#include <stdarg.h>
-
-#ifdef __x86_64__
-
-#define MAX_GPR_REGS 6
-#define MAX_SSE_REGS 8
-
-#ifdef __INTEL_COMPILER
-#define UINT128 __m128
-#else
-#define UINT128 __int128_t
-#endif
-
-struct register_args
-{
-  /* Registers for argument passing.  */
-  UINT64 gpr[MAX_GPR_REGS];
-  UINT128 sse[MAX_SSE_REGS];
-};
-
-extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
-			     void *raddr, void (*fnaddr)(void), unsigned ssecount);
-
-/* All reference to register classes here is identical to the code in
-   gcc/config/i386/i386.c. Do *not* change one without the other.  */
-
-/* Register class used for passing given 64bit part of the argument.
-   These represent classes as documented by the PS ABI, with the
-   exception of SSESF, SSEDF classes, that are basically SSE class,
-   just gcc will use SF or DFmode move instead of DImode to avoid
-   reformatting penalties.
-
-   Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves
-   whenever possible (upper half does contain padding).  */
-enum x86_64_reg_class
-  {
-    X86_64_NO_CLASS,
-    X86_64_INTEGER_CLASS,
-    X86_64_INTEGERSI_CLASS,
-    X86_64_SSE_CLASS,
-    X86_64_SSESF_CLASS,
-    X86_64_SSEDF_CLASS,
-    X86_64_SSEUP_CLASS,
-    X86_64_X87_CLASS,
-    X86_64_X87UP_CLASS,
-    X86_64_COMPLEX_X87_CLASS,
-    X86_64_MEMORY_CLASS
-  };
-
-#define MAX_CLASSES 4
-
-#define SSE_CLASS_P(X)	((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS)
-
-/* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
-   of this code is to classify each 8bytes of incoming argument by the register
-   class and assign registers accordingly.  */
-
-/* Return the union class of CLASS1 and CLASS2.
-   See the x86-64 PS ABI for details.  */
-
-static enum x86_64_reg_class
-merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
-{
-  /* Rule #1: If both classes are equal, this is the resulting class.  */
-  if (class1 == class2)
-    return class1;
-
-  /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
-     the other class.  */
-  if (class1 == X86_64_NO_CLASS)
-    return class2;
-  if (class2 == X86_64_NO_CLASS)
-    return class1;
-
-  /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
-  if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
-    return X86_64_MEMORY_CLASS;
-
-  /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
-  if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
-      || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
-    return X86_64_INTEGERSI_CLASS;
-  if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
-      || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
-    return X86_64_INTEGER_CLASS;
-
-  /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
-     MEMORY is used.  */
-  if (class1 == X86_64_X87_CLASS
-      || class1 == X86_64_X87UP_CLASS
-      || class1 == X86_64_COMPLEX_X87_CLASS
-      || class2 == X86_64_X87_CLASS
-      || class2 == X86_64_X87UP_CLASS
-      || class2 == X86_64_COMPLEX_X87_CLASS)
-    return X86_64_MEMORY_CLASS;
-
-  /* Rule #6: Otherwise class SSE is used.  */
-  return X86_64_SSE_CLASS;
-}
-
-/* Classify the argument of type TYPE and mode MODE.
-   CLASSES will be filled by the register class used to pass each word
-   of the operand.  The number of words is returned.  In case the parameter
-   should be passed in memory, 0 is returned. As a special case for zero
-   sized containers, classes[0] will be NO_CLASS and 1 is returned.
-
-   See the x86-64 PS ABI for details.
-*/
-static int
-classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
-		   size_t byte_offset)
-{
-  switch (type->type)
-    {
-    case FFI_TYPE_UINT8:
-    case FFI_TYPE_SINT8:
-    case FFI_TYPE_UINT16:
-    case FFI_TYPE_SINT16:
-    case FFI_TYPE_UINT32:
-    case FFI_TYPE_SINT32:
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_POINTER:
-      {
-	int size = byte_offset + type->size;
-
-	if (size <= 4)
-	  {
-	    classes[0] = X86_64_INTEGERSI_CLASS;
-	    return 1;
-	  }
-	else if (size <= 8)
-	  {
-	    classes[0] = X86_64_INTEGER_CLASS;
-	    return 1;
-	  }
-	else if (size <= 12)
-	  {
-	    classes[0] = X86_64_INTEGER_CLASS;
-	    classes[1] = X86_64_INTEGERSI_CLASS;
-	    return 2;
-	  }
-	else if (size <= 16)
-	  {
-	    classes[0] = classes[1] = X86_64_INTEGERSI_CLASS;
-	    return 2;
-	  }
-	else
-	  FFI_ASSERT (0);
-      }
-    case FFI_TYPE_FLOAT:
-      if (!(byte_offset % 8))
-	classes[0] = X86_64_SSESF_CLASS;
-      else
-	classes[0] = X86_64_SSE_CLASS;
-      return 1;
-    case FFI_TYPE_DOUBLE:
-      classes[0] = X86_64_SSEDF_CLASS;
-      return 1;
-    case FFI_TYPE_LONGDOUBLE:
-      classes[0] = X86_64_X87_CLASS;
-      classes[1] = X86_64_X87UP_CLASS;
-      return 2;
-    case FFI_TYPE_STRUCT:
-      {
-	const int UNITS_PER_WORD = 8;
-	int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
-	ffi_type **ptr; 
-	int i;
-	enum x86_64_reg_class subclasses[MAX_CLASSES];
-
-	/* If the struct is larger than 32 bytes, pass it on the stack.  */
-	if (type->size > 32)
-	  return 0;
-
-	for (i = 0; i < words; i++)
-	  classes[i] = X86_64_NO_CLASS;
-
-	/* Zero sized arrays or structures are NO_CLASS.  We return 0 to
-	   signalize memory class, so handle it as special case.  */
-	if (!words)
-	  {
-	    classes[0] = X86_64_NO_CLASS;
-	    return 1;
-	  }
-
-	/* Merge the fields of structure.  */
-	for (ptr = type->elements; *ptr != NULL; ptr++)
-	  {
-	    int num;
-
-	    byte_offset = ALIGN (byte_offset, (*ptr)->alignment);
-
-	    num = classify_argument (*ptr, subclasses, byte_offset % 8);
-	    if (num == 0)
-	      return 0;
-	    for (i = 0; i < num; i++)
-	      {
-		int pos = byte_offset / 8;
-		classes[i + pos] =
-		  merge_classes (subclasses[i], classes[i + pos]);
-	      }
-
-	    byte_offset += (*ptr)->size;
-	  }
-
-	if (words > 2)
-	  {
-	    /* When size > 16 bytes, if the first one isn't
-	       X86_64_SSE_CLASS or any other ones aren't
-	       X86_64_SSEUP_CLASS, everything should be passed in
-	       memory.  */
-	    if (classes[0] != X86_64_SSE_CLASS)
-	      return 0;
-
-	    for (i = 1; i < words; i++)
-	      if (classes[i] != X86_64_SSEUP_CLASS)
-		return 0;
-	  }
-
-	/* Final merger cleanup.  */
-	for (i = 0; i < words; i++)
-	  {
-	    /* If one class is MEMORY, everything should be passed in
-	       memory.  */
-	    if (classes[i] == X86_64_MEMORY_CLASS)
-	      return 0;
-
-	    /* The X86_64_SSEUP_CLASS should be always preceded by
-	       X86_64_SSE_CLASS or X86_64_SSEUP_CLASS.  */
-	    if (classes[i] == X86_64_SSEUP_CLASS
-		&& classes[i - 1] != X86_64_SSE_CLASS
-		&& classes[i - 1] != X86_64_SSEUP_CLASS)
-	      {
-		/* The first one should never be X86_64_SSEUP_CLASS.  */
-		FFI_ASSERT (i != 0);
-		classes[i] = X86_64_SSE_CLASS;
-	      }
-
-	    /*  If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
-		everything should be passed in memory.  */
-	    if (classes[i] == X86_64_X87UP_CLASS
-		&& (classes[i - 1] != X86_64_X87_CLASS))
-	      {
-		/* The first one should never be X86_64_X87UP_CLASS.  */
-		FFI_ASSERT (i != 0);
-		return 0;
-	      }
-	  }
-	return words;
-      }
-
-    default:
-      FFI_ASSERT(0);
-    }
-  return 0; /* Never reached.  */
-}
-
-/* Examine the argument and return set number of register required in each
-   class.  Return zero iff parameter should be passed in memory, otherwise
-   the number of registers.  */
-
-static int
-examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES],
-		  _Bool in_return, int *pngpr, int *pnsse)
-{
-  int i, n, ngpr, nsse;
-
-  n = classify_argument (type, classes, 0);
-  if (n == 0)
-    return 0;
-
-  ngpr = nsse = 0;
-  for (i = 0; i < n; ++i)
-    switch (classes[i])
-      {
-      case X86_64_INTEGER_CLASS:
-      case X86_64_INTEGERSI_CLASS:
-	ngpr++;
-	break;
-      case X86_64_SSE_CLASS:
-      case X86_64_SSESF_CLASS:
-      case X86_64_SSEDF_CLASS:
-	nsse++;
-	break;
-      case X86_64_NO_CLASS:
-      case X86_64_SSEUP_CLASS:
-	break;
-      case X86_64_X87_CLASS:
-      case X86_64_X87UP_CLASS:
-      case X86_64_COMPLEX_X87_CLASS:
-	return in_return != 0;
-      default:
-	abort ();
-      }
-
-  *pngpr = ngpr;
-  *pnsse = nsse;
-
-  return n;
-}
-
-/* Perform machine dependent cif processing.  */
-
-ffi_status
-ffi_prep_cif_machdep (ffi_cif *cif)
-{
-  int gprcount, ssecount, i, avn, n, ngpr, nsse, flags;
-  enum x86_64_reg_class classes[MAX_CLASSES];
-  size_t bytes;
-
-  gprcount = ssecount = 0;
-
-  flags = cif->rtype->type;
-  if (flags != FFI_TYPE_VOID)
-    {
-      n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse);
-      if (n == 0)
-	{
-	  /* The return value is passed in memory.  A pointer to that
-	     memory is the first argument.  Allocate a register for it.  */
-	  gprcount++;
-	  /* We don't have to do anything in asm for the return.  */
-	  flags = FFI_TYPE_VOID;
-	}
-      else if (flags == FFI_TYPE_STRUCT)
-	{
-	  /* Mark which registers the result appears in.  */
-	  _Bool sse0 = SSE_CLASS_P (classes[0]);
-	  _Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]);
-	  if (sse0 && !sse1)
-	    flags |= 1 << 8;
-	  else if (!sse0 && sse1)
-	    flags |= 1 << 9;
-	  else if (sse0 && sse1)
-	    flags |= 1 << 10;
-	  /* Mark the true size of the structure.  */
-	  flags |= cif->rtype->size << 12;
-	}
-    }
-
-  /* Go over all arguments and determine the way they should be passed.
-     If it's in a register and there is space for it, let that be so. If
-     not, add it's size to the stack byte count.  */
-  for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++)
-    {
-      if (examine_argument (cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0
-	  || gprcount + ngpr > MAX_GPR_REGS
-	  || ssecount + nsse > MAX_SSE_REGS)
-	{
-	  long align = cif->arg_types[i]->alignment;
-
-	  if (align < 8)
-	    align = 8;
-
-	  bytes = ALIGN (bytes, align);
-	  bytes += cif->arg_types[i]->size;
-	}
-      else
-	{
-	  gprcount += ngpr;
-	  ssecount += nsse;
-	}
-    }
-  if (ssecount)
-    flags |= 1 << 11;
-  cif->flags = flags;
-  cif->bytes = ALIGN (bytes, 8);
-
-  return FFI_OK;
-}
-
-void
-ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  enum x86_64_reg_class classes[MAX_CLASSES];
-  char *stack, *argp;
-  ffi_type **arg_types;
-  int gprcount, ssecount, ngpr, nsse, i, avn;
-  _Bool ret_in_memory;
-  struct register_args *reg_args;
-
-  /* Can't call 32-bit mode from 64-bit mode.  */
-  FFI_ASSERT (cif->abi == FFI_UNIX64);
-
-  /* If the return value is a struct and we don't have a return value
-     address then we need to make one.  Note the setting of flags to
-     VOID above in ffi_prep_cif_machdep.  */
-  ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT
-		   && (cif->flags & 0xff) == FFI_TYPE_VOID);
-  if (rvalue == NULL && ret_in_memory)
-    rvalue = alloca (cif->rtype->size);
-
-  /* Allocate the space for the arguments, plus 4 words of temp space.  */
-  stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8);
-  reg_args = (struct register_args *) stack;
-  argp = stack + sizeof (struct register_args);
-
-  gprcount = ssecount = 0;
-
-  /* If the return value is passed in memory, add the pointer as the
-     first integer argument.  */
-  if (ret_in_memory)
-    reg_args->gpr[gprcount++] = (unsigned long) rvalue;
-
-  avn = cif->nargs;
-  arg_types = cif->arg_types;
-
-  for (i = 0; i < avn; ++i)
-    {
-      size_t size = arg_types[i]->size;
-      int n;
-
-      n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse);
-      if (n == 0
-	  || gprcount + ngpr > MAX_GPR_REGS
-	  || ssecount + nsse > MAX_SSE_REGS)
-	{
-	  long align = arg_types[i]->alignment;
-
-	  /* Stack arguments are *always* at least 8 byte aligned.  */
-	  if (align < 8)
-	    align = 8;
-
-	  /* Pass this argument in memory.  */
-	  argp = (void *) ALIGN (argp, align);
-	  memcpy (argp, avalue[i], size);
-	  argp += size;
-	}
-      else
-	{
-	  /* The argument is passed entirely in registers.  */
-	  char *a = (char *) avalue[i];
-	  int j;
-
-	  for (j = 0; j < n; j++, a += 8, size -= 8)
-	    {
-	      switch (classes[j])
-		{
-		case X86_64_INTEGER_CLASS:
-		case X86_64_INTEGERSI_CLASS:
-		  reg_args->gpr[gprcount] = 0;
-		  memcpy (&reg_args->gpr[gprcount], a, size < 8 ? size : 8);
-		  gprcount++;
-		  break;
-		case X86_64_SSE_CLASS:
-		case X86_64_SSEDF_CLASS:
-		  reg_args->sse[ssecount++] = *(UINT64 *) a;
-		  break;
-		case X86_64_SSESF_CLASS:
-		  reg_args->sse[ssecount++] = *(UINT32 *) a;
-		  break;
-		default:
-		  abort();
-		}
-	    }
-	}
-    }
-
-  ffi_call_unix64 (stack, cif->bytes + sizeof (struct register_args),
-		   cif->flags, rvalue, fn, ssecount);
-}
-
-
-extern void ffi_closure_unix64(void);
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun)(ffi_cif*, void*, void**, void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  volatile unsigned short *tramp;
-
-  /* Sanity check on the cif ABI.  */
-  {
-    int abi = cif->abi;
-    if (UNLIKELY (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)))
-      return FFI_BAD_ABI;
-  }
-
-  tramp = (volatile unsigned short *) &closure->tramp[0];
-
-  tramp[0] = 0xbb49;		/* mov <code>, %r11	*/
-  *((unsigned long long * volatile) &tramp[1])
-    = (unsigned long) ffi_closure_unix64;
-  tramp[5] = 0xba49;		/* mov <data>, %r10	*/
-  *((unsigned long long * volatile) &tramp[6])
-    = (unsigned long) codeloc;
-
-  /* Set the carry bit iff the function uses any sse registers.
-     This is clc or stc, together with the first byte of the jmp.  */
-  tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8;
-
-  tramp[11] = 0xe3ff;			/* jmp *%r11    */
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  return FFI_OK;
-}
-
-int
-ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
-			 struct register_args *reg_args, char *argp)
-{
-  ffi_cif *cif;
-  void **avalue;
-  ffi_type **arg_types;
-  long i, avn;
-  int gprcount, ssecount, ngpr, nsse;
-  int ret;
-
-  cif = closure->cif;
-  avalue = alloca(cif->nargs * sizeof(void *));
-  gprcount = ssecount = 0;
-
-  ret = cif->rtype->type;
-  if (ret != FFI_TYPE_VOID)
-    {
-      enum x86_64_reg_class classes[MAX_CLASSES];
-      int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse);
-      if (n == 0)
-	{
-	  /* The return value goes in memory.  Arrange for the closure
-	     return value to go directly back to the original caller.  */
-	  rvalue = (void *) (unsigned long) reg_args->gpr[gprcount++];
-	  /* We don't have to do anything in asm for the return.  */
-	  ret = FFI_TYPE_VOID;
-	}
-      else if (ret == FFI_TYPE_STRUCT && n == 2)
-	{
-	  /* Mark which register the second word of the structure goes in.  */
-	  _Bool sse0 = SSE_CLASS_P (classes[0]);
-	  _Bool sse1 = SSE_CLASS_P (classes[1]);
-	  if (!sse0 && sse1)
-	    ret |= 1 << 8;
-	  else if (sse0 && !sse1)
-	    ret |= 1 << 9;
-	}
-    }
-
-  avn = cif->nargs;
-  arg_types = cif->arg_types;
-  
-  for (i = 0; i < avn; ++i)
-    {
-      enum x86_64_reg_class classes[MAX_CLASSES];
-      int n;
-
-      n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse);
-      if (n == 0
-	  || gprcount + ngpr > MAX_GPR_REGS
-	  || ssecount + nsse > MAX_SSE_REGS)
-	{
-	  long align = arg_types[i]->alignment;
-
-	  /* Stack arguments are *always* at least 8 byte aligned.  */
-	  if (align < 8)
-	    align = 8;
-
-	  /* Pass this argument in memory.  */
-	  argp = (void *) ALIGN (argp, align);
-	  avalue[i] = argp;
-	  argp += arg_types[i]->size;
-	}
-      /* If the argument is in a single register, or two consecutive
-	 integer registers, then we can use that address directly.  */
-      else if (n == 1
-	       || (n == 2 && !(SSE_CLASS_P (classes[0])
-			       || SSE_CLASS_P (classes[1]))))
-	{
-	  /* The argument is in a single register.  */
-	  if (SSE_CLASS_P (classes[0]))
-	    {
-	      avalue[i] = &reg_args->sse[ssecount];
-	      ssecount += n;
-	    }
-	  else
-	    {
-	      avalue[i] = &reg_args->gpr[gprcount];
-	      gprcount += n;
-	    }
-	}
-      /* Otherwise, allocate space to make them consecutive.  */
-      else
-	{
-	  char *a = alloca (16);
-	  int j;
-
-	  avalue[i] = a;
-	  for (j = 0; j < n; j++, a += 8)
-	    {
-	      if (SSE_CLASS_P (classes[j]))
-		memcpy (a, &reg_args->sse[ssecount++], 8);
-	      else
-		memcpy (a, &reg_args->gpr[gprcount++], 8);
-	    }
-	}
-    }
-
-  /* Invoke the closure.  */
-  closure->fun (cif, rvalue, avalue, closure->user_data);
-
-  /* Tell assembly how to perform return type promotions.  */
-  return ret;
-}
-
-#endif /* __x86_64__ */
diff --git a/third_party/gofrontend/libffi/src/x86/darwin_c.c b/third_party/gofrontend/libffi/src/x86/darwin_c.c
deleted file mode 100644
index 6338de2..0000000
--- a/third_party/gofrontend/libffi/src/x86/darwin_c.c
+++ /dev/null
@@ -1,843 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008  Red Hat, Inc.
-           Copyright (c) 2002  Ranjit Mathew
-           Copyright (c) 2002  Bo Thorsen
-           Copyright (c) 2002  Roger Sayle
-           Copyright (C) 2008, 2010  Free Software Foundation, Inc.
-
-   x86 Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#if !defined(__x86_64__) || defined(_WIN64) || defined(__CYGWIN__)
-
-#ifdef _WIN64
-#include <windows.h>
-#endif
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-
-/* ffi_prep_args is called by the assembly routine once stack space
-   has been allocated for the function's arguments */
-
-void ffi_prep_args(char *stack, extended_cif *ecif)
-{
-  register unsigned int i;
-  register void **p_argv;
-  register char *argp;
-  register ffi_type **p_arg;
-#ifdef X86_WIN32
-  size_t p_stack_args[2];
-  void *p_stack_data[2];
-  char *argp2 = stack;
-  int stack_args_count = 0;
-  int cabi = ecif->cif->abi;
-#endif
-
-  argp = stack;
-
-  if ((ecif->cif->flags == FFI_TYPE_STRUCT
-       || ecif->cif->flags == FFI_TYPE_MS_STRUCT)
-#ifdef X86_WIN64
-      && (ecif->cif->rtype->size != 1 && ecif->cif->rtype->size != 2
-          && ecif->cif->rtype->size != 4 && ecif->cif->rtype->size != 8)
-#endif
-      )
-    {
-      *(void **) argp = ecif->rvalue;
-#ifdef X86_WIN32
-      /* For fastcall/thiscall this is first register-passed
-         argument.  */
-      if (cabi == FFI_THISCALL || cabi == FFI_FASTCALL)
-	{
-	  p_stack_args[stack_args_count] = sizeof (void*);
-	  p_stack_data[stack_args_count] = argp;
-	  ++stack_args_count;
-	}
-#endif
-      argp += sizeof(void*);
-    }
-
-  p_argv = ecif->avalue;
-
-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
-       i != 0;
-       i--, p_arg++)
-    {
-      size_t z;
-
-      /* Align if necessary */
-      if ((sizeof(void*) - 1) & (size_t) argp)
-        argp = (char *) ALIGN(argp, sizeof(void*));
-
-      z = (*p_arg)->size;
-#ifdef X86_WIN64
-      if (z > sizeof(ffi_arg)
-          || ((*p_arg)->type == FFI_TYPE_STRUCT
-              && (z != 1 && z != 2 && z != 4 && z != 8))
-#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
-          || ((*p_arg)->type == FFI_TYPE_LONGDOUBLE)
-#endif
-          )
-        {
-          z = sizeof(ffi_arg);
-          *(void **)argp = *p_argv;
-        }
-      else if ((*p_arg)->type == FFI_TYPE_FLOAT)
-        {
-          memcpy(argp, *p_argv, z);
-        }
-      else
-#endif
-      if (z < sizeof(ffi_arg))
-        {
-          z = sizeof(ffi_arg);
-          switch ((*p_arg)->type)
-            {
-            case FFI_TYPE_SINT8:
-              *(ffi_sarg *) argp = (ffi_sarg)*(SINT8 *)(* p_argv);
-              break;
-
-            case FFI_TYPE_UINT8:
-              *(ffi_arg *) argp = (ffi_arg)*(UINT8 *)(* p_argv);
-              break;
-
-            case FFI_TYPE_SINT16:
-              *(ffi_sarg *) argp = (ffi_sarg)*(SINT16 *)(* p_argv);
-              break;
-
-            case FFI_TYPE_UINT16:
-              *(ffi_arg *) argp = (ffi_arg)*(UINT16 *)(* p_argv);
-              break;
-
-            case FFI_TYPE_SINT32:
-              *(ffi_sarg *) argp = (ffi_sarg)*(SINT32 *)(* p_argv);
-              break;
-
-            case FFI_TYPE_UINT32:
-              *(ffi_arg *) argp = (ffi_arg)*(UINT32 *)(* p_argv);
-              break;
-
-            case FFI_TYPE_STRUCT:
-              *(ffi_arg *) argp = *(ffi_arg *)(* p_argv);
-              break;
-
-            default:
-              FFI_ASSERT(0);
-            }
-        }
-      else
-        {
-          memcpy(argp, *p_argv, z);
-        }
-
-#ifdef X86_WIN32
-    /* For thiscall/fastcall convention register-passed arguments
-       are the first two none-floating-point arguments with a size
-       smaller or equal to sizeof (void*).  */
-    if ((cabi == FFI_THISCALL && stack_args_count < 1)
-        || (cabi == FFI_FASTCALL && stack_args_count < 2))
-      {
-	if (z <= 4
-	    && ((*p_arg)->type != FFI_TYPE_FLOAT
-	        && (*p_arg)->type != FFI_TYPE_STRUCT))
-	  {
-	    p_stack_args[stack_args_count] = z;
-	    p_stack_data[stack_args_count] = argp;
-	    ++stack_args_count;
-	  }
-      }
-#endif
-      p_argv++;
-#ifdef X86_WIN64
-      argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
-#else
-      argp += z;
-#endif
-    }
-
-#ifdef X86_WIN32
-  /* We need to move the register-passed arguments for thiscall/fastcall
-     on top of stack, so that those can be moved to registers ecx/edx by
-     call-handler.  */
-  if (stack_args_count > 0)
-    {
-      size_t zz = (p_stack_args[0] + 3) & ~3;
-      char *h;
-
-      /* Move first argument to top-stack position.  */
-      if (p_stack_data[0] != argp2)
-	{
-	  h = alloca (zz + 1);
-	  memcpy (h, p_stack_data[0], zz);
-	  memmove (argp2 + zz, argp2,
-	           (size_t) ((char *) p_stack_data[0] - (char*)argp2));
-	  memcpy (argp2, h, zz);
-	}
-
-      argp2 += zz;
-      --stack_args_count;
-      if (zz > 4)
-	stack_args_count = 0;
-
-      /* If we have a second argument, then move it on top
-         after the first one.  */
-      if (stack_args_count > 0 && p_stack_data[1] != argp2)
-	{
-	  zz = p_stack_args[1];
-	  zz = (zz + 3) & ~3;
-	  h = alloca (zz + 1);
-	  h = alloca (zz + 1);
-	  memcpy (h, p_stack_data[1], zz);
-	  memmove (argp2 + zz, argp2, (size_t) ((char*) p_stack_data[1] - (char*)argp2));
-	  memcpy (argp2, h, zz);
-	}
-    }
-#endif
-  return;
-}
-
-/* Perform machine dependent cif processing */
-ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  unsigned int i;
-  ffi_type **ptr;
-
-  /* Set the return type flag */
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_VOID:
-    case FFI_TYPE_UINT8:
-    case FFI_TYPE_UINT16:
-    case FFI_TYPE_SINT8:
-    case FFI_TYPE_SINT16:
-#ifdef X86_WIN64
-    case FFI_TYPE_UINT32:
-    case FFI_TYPE_SINT32:
-#endif
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_FLOAT:
-    case FFI_TYPE_DOUBLE:
-#ifndef X86_WIN64
-#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
-    case FFI_TYPE_LONGDOUBLE:
-#endif
-#endif
-      cif->flags = (unsigned) cif->rtype->type;
-      break;
-
-    case FFI_TYPE_UINT64:
-#ifdef X86_WIN64
-    case FFI_TYPE_POINTER:
-#endif
-      cif->flags = FFI_TYPE_SINT64;
-      break;
-
-    case FFI_TYPE_STRUCT:
-#ifndef X86
-      if (cif->rtype->size == 1)
-        {
-          cif->flags = FFI_TYPE_SMALL_STRUCT_1B; /* same as char size */
-        }
-      else if (cif->rtype->size == 2)
-        {
-          cif->flags = FFI_TYPE_SMALL_STRUCT_2B; /* same as short size */
-        }
-      else if (cif->rtype->size == 4)
-        {
-#ifdef X86_WIN64
-          cif->flags = FFI_TYPE_SMALL_STRUCT_4B;
-#else
-          cif->flags = FFI_TYPE_INT; /* same as int type */
-#endif
-        }
-      else if (cif->rtype->size == 8)
-        {
-          cif->flags = FFI_TYPE_SINT64; /* same as int64 type */
-        }
-      else
-#endif
-        {
-#ifdef X86_WIN32
-          if (cif->abi == FFI_MS_CDECL)
-            cif->flags = FFI_TYPE_MS_STRUCT;
-          else
-#endif
-            cif->flags = FFI_TYPE_STRUCT;
-          /* allocate space for return value pointer */
-          cif->bytes += ALIGN(sizeof(void*), FFI_SIZEOF_ARG);
-        }
-      break;
-
-    default:
-#ifdef X86_WIN64
-      cif->flags = FFI_TYPE_SINT64;
-      break;
-    case FFI_TYPE_INT:
-      cif->flags = FFI_TYPE_SINT32;
-#else
-      cif->flags = FFI_TYPE_INT;
-#endif
-      break;
-    }
-
-  for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
-    {
-      if (((*ptr)->alignment - 1) & cif->bytes)
-        cif->bytes = ALIGN(cif->bytes, (*ptr)->alignment);
-      cif->bytes += ALIGN((*ptr)->size, FFI_SIZEOF_ARG);
-    }
-
-#ifdef X86_WIN64
-  /* ensure space for storing four registers */
-  cif->bytes += 4 * sizeof(ffi_arg);
-#endif
-
-#ifdef X86_DARWIN
-  cif->bytes = (cif->bytes + 15) & ~0xF;
-#endif
-
-  return FFI_OK;
-}
-
-#ifdef X86_WIN64
-extern int
-ffi_call_win64(void (*)(char *, extended_cif *), extended_cif *,
-               unsigned, unsigned, unsigned *, void (*fn)(void));
-#elif defined(X86_WIN32)
-extern void
-ffi_call_win32(void (*)(char *, extended_cif *), extended_cif *,
-               unsigned, unsigned, unsigned, unsigned *, void (*fn)(void));
-#else
-extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
-                          unsigned, unsigned, unsigned *, void (*fn)(void));
-#endif
-
-void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  extended_cif ecif;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-  
-  /* If the return value is a struct and we don't have a return */
-  /* value address then we need to make one                     */
-
-#ifdef X86_WIN64
-  if (rvalue == NULL
-      && cif->flags == FFI_TYPE_STRUCT
-      && cif->rtype->size != 1 && cif->rtype->size != 2
-      && cif->rtype->size != 4 && cif->rtype->size != 8)
-    {
-      ecif.rvalue = alloca((cif->rtype->size + 0xF) & ~0xF);
-    }
-#else
-  if (rvalue == NULL
-      && (cif->flags == FFI_TYPE_STRUCT
-          || cif->flags == FFI_TYPE_MS_STRUCT))
-    {
-      ecif.rvalue = alloca(cif->rtype->size);
-    }
-#endif
-  else
-    ecif.rvalue = rvalue;
-    
-  
-  switch (cif->abi) 
-    {
-#ifdef X86_WIN64
-    case FFI_WIN64:
-      ffi_call_win64(ffi_prep_args, &ecif, cif->bytes,
-                     cif->flags, ecif.rvalue, fn);
-      break;
-#elif defined(X86_WIN32)
-    case FFI_SYSV:
-    case FFI_STDCALL:
-    case FFI_MS_CDECL:
-      ffi_call_win32(ffi_prep_args, &ecif, cif->abi, cif->bytes, cif->flags,
-		     ecif.rvalue, fn);
-      break;
-    case FFI_THISCALL:
-    case FFI_FASTCALL:
-      {
-	unsigned int abi = cif->abi;
-	unsigned int i, passed_regs = 0;
-
-	if (cif->flags == FFI_TYPE_STRUCT)
-	  ++passed_regs;
-
-	for (i=0; i < cif->nargs && passed_regs < 2;i++)
-	  {
-	    size_t sz;
-
-	    if (cif->arg_types[i]->type == FFI_TYPE_FLOAT
-	        || cif->arg_types[i]->type == FFI_TYPE_STRUCT)
-	      continue;
-	    sz = (cif->arg_types[i]->size + 3) & ~3;
-	    if (sz == 0 || sz > 4)
-	      continue;
-	    ++passed_regs;
-	  }
-	if (passed_regs < 2 && abi == FFI_FASTCALL)
-	  abi = FFI_THISCALL;
-	if (passed_regs < 1 && abi == FFI_THISCALL)
-	  abi = FFI_STDCALL;
-        ffi_call_win32(ffi_prep_args, &ecif, abi, cif->bytes, cif->flags,
-                       ecif.rvalue, fn);
-      }
-      break;
-#else
-    case FFI_SYSV:
-      ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue,
-                    fn);
-      break;
-#endif
-    default:
-      FFI_ASSERT(0);
-      break;
-    }
-}
-
-
-/** private members **/
-
-/* The following __attribute__((regparm(1))) decorations will have no effect
-   on MSVC - standard cdecl convention applies. */
-static void ffi_prep_incoming_args_SYSV (char *stack, void **ret,
-                                         void** args, ffi_cif* cif);
-void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *)
-     __attribute__ ((regparm(1)));
-unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *)
-     __attribute__ ((regparm(1)));
-void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *)
-     __attribute__ ((regparm(1)));
-#ifdef X86_WIN32
-void FFI_HIDDEN ffi_closure_raw_THISCALL (ffi_raw_closure *)
-     __attribute__ ((regparm(1)));
-void FFI_HIDDEN ffi_closure_STDCALL (ffi_closure *)
-     __attribute__ ((regparm(1)));
-void FFI_HIDDEN ffi_closure_THISCALL (ffi_closure *)
-     __attribute__ ((regparm(1)));
-#endif
-#ifdef X86_WIN64
-void FFI_HIDDEN ffi_closure_win64 (ffi_closure *);
-#endif
-
-/* This function is jumped to by the trampoline */
-
-#ifdef X86_WIN64
-void * FFI_HIDDEN
-ffi_closure_win64_inner (ffi_closure *closure, void *args) {
-  ffi_cif       *cif;
-  void         **arg_area;
-  void          *result;
-  void          *resp = &result;
-
-  cif         = closure->cif;
-  arg_area    = (void**) alloca (cif->nargs * sizeof (void*));  
-
-  /* this call will initialize ARG_AREA, such that each
-   * element in that array points to the corresponding 
-   * value on the stack; and if the function returns
-   * a structure, it will change RESP to point to the
-   * structure return address.  */
-
-  ffi_prep_incoming_args_SYSV(args, &resp, arg_area, cif);
-  
-  (closure->fun) (cif, resp, arg_area, closure->user_data);
-
-  /* The result is returned in rax.  This does the right thing for
-     result types except for floats; we have to 'mov xmm0, rax' in the
-     caller to correct this.
-     TODO: structure sizes of 3 5 6 7 are returned by reference, too!!!
-  */
-  return cif->rtype->size > sizeof(void *) ? resp : *(void **)resp;
-}
-
-#else
-unsigned int FFI_HIDDEN __attribute__ ((regparm(1)))
-ffi_closure_SYSV_inner (ffi_closure *closure, void **respp, void *args)
-{
-  /* our various things...  */
-  ffi_cif       *cif;
-  void         **arg_area;
-
-  cif         = closure->cif;
-  arg_area    = (void**) alloca (cif->nargs * sizeof (void*));  
-
-  /* this call will initialize ARG_AREA, such that each
-   * element in that array points to the corresponding 
-   * value on the stack; and if the function returns
-   * a structure, it will change RESP to point to the
-   * structure return address.  */
-
-  ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif);
-
-  (closure->fun) (cif, *respp, arg_area, closure->user_data);
-
-  return cif->flags;
-}
-#endif /* !X86_WIN64 */
-
-static void
-ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue,
-                            ffi_cif *cif)
-{
-  register unsigned int i;
-  register void **p_argv;
-  register char *argp;
-  register ffi_type **p_arg;
-
-  argp = stack;
-
-#ifdef X86_WIN64
-  if (cif->rtype->size > sizeof(ffi_arg)
-      || (cif->flags == FFI_TYPE_STRUCT
-          && (cif->rtype->size != 1 && cif->rtype->size != 2
-              && cif->rtype->size != 4 && cif->rtype->size != 8))) {
-    *rvalue = *(void **) argp;
-    argp += sizeof(void *);
-  }
-#else
-  if ( cif->flags == FFI_TYPE_STRUCT
-       || cif->flags == FFI_TYPE_MS_STRUCT ) {
-    *rvalue = *(void **) argp;
-    argp += sizeof(void *);
-  }
-#endif
-
-  p_argv = avalue;
-
-  for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
-    {
-      size_t z;
-
-      /* Align if necessary */
-      if ((sizeof(void*) - 1) & (size_t) argp) {
-        argp = (char *) ALIGN(argp, sizeof(void*));
-      }
-
-#ifdef X86_WIN64
-      if ((*p_arg)->size > sizeof(ffi_arg)
-          || ((*p_arg)->type == FFI_TYPE_STRUCT
-              && ((*p_arg)->size != 1 && (*p_arg)->size != 2
-                  && (*p_arg)->size != 4 && (*p_arg)->size != 8)))
-        {
-          z = sizeof(void *);
-          *p_argv = *(void **)argp;
-        }
-      else
-#endif
-        {
-          z = (*p_arg)->size;
-          
-          /* because we're little endian, this is what it turns into.   */
-          
-          *p_argv = (void*) argp;
-        }
-          
-      p_argv++;
-#ifdef X86_WIN64
-      argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
-#else
-      argp += z;
-#endif
-    }
-  
-  return;
-}
-
-#define FFI_INIT_TRAMPOLINE_WIN64(TRAMP,FUN,CTX,MASK) \
-{ unsigned char *__tramp = (unsigned char*)(TRAMP); \
-   void*  __fun = (void*)(FUN); \
-   void*  __ctx = (void*)(CTX); \
-   *(unsigned char*) &__tramp[0] = 0x41; \
-   *(unsigned char*) &__tramp[1] = 0xbb; \
-   *(unsigned int*) &__tramp[2] = MASK; /* mov $mask, %r11 */ \
-   *(unsigned char*) &__tramp[6] = 0x48; \
-   *(unsigned char*) &__tramp[7] = 0xb8; \
-   *(void**) &__tramp[8] = __ctx; /* mov __ctx, %rax */ \
-   *(unsigned char *)  &__tramp[16] = 0x49; \
-   *(unsigned char *)  &__tramp[17] = 0xba; \
-   *(void**) &__tramp[18] = __fun; /* mov __fun, %r10 */ \
-   *(unsigned char *)  &__tramp[26] = 0x41; \
-   *(unsigned char *)  &__tramp[27] = 0xff; \
-   *(unsigned char *)  &__tramp[28] = 0xe2; /* jmp %r10 */ \
- }
-
-/* How to make a trampoline.  Derived from gcc/config/i386/i386.c. */
-
-#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \
-{ unsigned char *__tramp = (unsigned char*)(TRAMP); \
-   unsigned int  __fun = (unsigned int)(FUN); \
-   unsigned int  __ctx = (unsigned int)(CTX); \
-   unsigned int  __dis = __fun - (__ctx + 10);  \
-   *(unsigned char*) &__tramp[0] = 0xb8; \
-   *(unsigned int*)  &__tramp[1] = __ctx; /* movl __ctx, %eax */ \
-   *(unsigned char *)  &__tramp[5] = 0xe9; \
-   *(unsigned int*)  &__tramp[6] = __dis; /* jmp __fun  */ \
- }
-
-#define FFI_INIT_TRAMPOLINE_THISCALL(TRAMP,FUN,CTX,SIZE) \
-{ unsigned char *__tramp = (unsigned char*)(TRAMP); \
-   unsigned int  __fun = (unsigned int)(FUN); \
-   unsigned int  __ctx = (unsigned int)(CTX); \
-   unsigned int  __dis = __fun - (__ctx + 49);  \
-   unsigned short __size = (unsigned short)(SIZE); \
-   *(unsigned int *) &__tramp[0] = 0x8324048b;	/* mov (%esp), %eax */ \
-   *(unsigned int *) &__tramp[4] = 0x4c890cec;	/* sub $12, %esp */ \
-   *(unsigned int *) &__tramp[8] = 0x04890424;	/* mov %ecx, 4(%esp) */ \
-   *(unsigned char*) &__tramp[12] = 0x24;	/* mov %eax, (%esp) */ \
-   *(unsigned char*) &__tramp[13] = 0xb8; \
-   *(unsigned int *) &__tramp[14] = __size;	/* mov __size, %eax */ \
-   *(unsigned int *) &__tramp[18] = 0x08244c8d;	/* lea 8(%esp), %ecx */ \
-   *(unsigned int *) &__tramp[22] = 0x4802e8c1; /* shr $2, %eax ; dec %eax */ \
-   *(unsigned short*) &__tramp[26] = 0x0b74;	/* jz 1f */ \
-   *(unsigned int *) &__tramp[28] = 0x8908518b;	/* 2b: mov 8(%ecx), %edx */ \
-   *(unsigned int *) &__tramp[32] = 0x04c18311; /* mov %edx, (%ecx) ; add $4, %ecx */ \
-   *(unsigned char*) &__tramp[36] = 0x48;	/* dec %eax */ \
-   *(unsigned short*) &__tramp[37] = 0xf575;	/* jnz 2b ; 1f: */ \
-   *(unsigned char*) &__tramp[39] = 0xb8; \
-   *(unsigned int*)  &__tramp[40] = __ctx; /* movl __ctx, %eax */ \
-   *(unsigned char *)  &__tramp[44] = 0xe8; \
-   *(unsigned int*)  &__tramp[45] = __dis; /* call __fun  */ \
-   *(unsigned char*)  &__tramp[49] = 0xc2; /* ret  */ \
-   *(unsigned short*)  &__tramp[50] = (__size + 8); /* ret (__size + 8)  */ \
- }
-
-#define FFI_INIT_TRAMPOLINE_STDCALL(TRAMP,FUN,CTX,SIZE)  \
-{ unsigned char *__tramp = (unsigned char*)(TRAMP); \
-   unsigned int  __fun = (unsigned int)(FUN); \
-   unsigned int  __ctx = (unsigned int)(CTX); \
-   unsigned int  __dis = __fun - (__ctx + 10); \
-   unsigned short __size = (unsigned short)(SIZE); \
-   *(unsigned char*) &__tramp[0] = 0xb8; \
-   *(unsigned int*)  &__tramp[1] = __ctx; /* movl __ctx, %eax */ \
-   *(unsigned char *)  &__tramp[5] = 0xe8; \
-   *(unsigned int*)  &__tramp[6] = __dis; /* call __fun  */ \
-   *(unsigned char *)  &__tramp[10] = 0xc2; \
-   *(unsigned short*)  &__tramp[11] = __size; /* ret __size  */ \
- }
-
-/* the cif must already be prep'ed */
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-                      ffi_cif* cif,
-                      void (*fun)(ffi_cif*,void*,void**,void*),
-                      void *user_data,
-                      void *codeloc)
-{
-#ifdef X86_WIN64
-#define ISFLOAT(IDX) (cif->arg_types[IDX]->type == FFI_TYPE_FLOAT || cif->arg_types[IDX]->type == FFI_TYPE_DOUBLE)
-#define FLAG(IDX) (cif->nargs>(IDX)&&ISFLOAT(IDX)?(1<<(IDX)):0)
-  if (cif->abi == FFI_WIN64) 
-    {
-      int mask = FLAG(0)|FLAG(1)|FLAG(2)|FLAG(3);
-      FFI_INIT_TRAMPOLINE_WIN64 (&closure->tramp[0],
-                                 &ffi_closure_win64,
-                                 codeloc, mask);
-      /* make sure we can execute here */
-    }
-#else
-  if (cif->abi == FFI_SYSV)
-    {
-      FFI_INIT_TRAMPOLINE (&closure->tramp[0],
-                           &ffi_closure_SYSV,
-                           (void*)codeloc);
-    }
-#ifdef X86_WIN32
-  else if (cif->abi == FFI_THISCALL)
-    {
-      FFI_INIT_TRAMPOLINE_THISCALL (&closure->tramp[0],
-				    &ffi_closure_THISCALL,
-				    (void*)codeloc,
-				    cif->bytes);
-    }
-  else if (cif->abi == FFI_STDCALL)
-    {
-      FFI_INIT_TRAMPOLINE_STDCALL (&closure->tramp[0],
-                                   &ffi_closure_STDCALL,
-                                   (void*)codeloc, cif->bytes);
-    }
-  else if (cif->abi == FFI_MS_CDECL)
-    {
-      FFI_INIT_TRAMPOLINE (&closure->tramp[0],
-                           &ffi_closure_SYSV,
-                           (void*)codeloc);
-    }
-#endif /* X86_WIN32 */
-#endif /* !X86_WIN64 */
-  else
-    {
-      return FFI_BAD_ABI;
-    }
-    
-  closure->cif  = cif;
-  closure->user_data = user_data;
-  closure->fun  = fun;
-
-  return FFI_OK;
-}
-
-/* ------- Native raw API support -------------------------------- */
-
-#if !FFI_NO_RAW_API
-
-ffi_status
-ffi_prep_raw_closure_loc (ffi_raw_closure* closure,
-                          ffi_cif* cif,
-                          void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
-                          void *user_data,
-                          void *codeloc)
-{
-  int i;
-
-  if (cif->abi != FFI_SYSV) {
-#ifdef X86_WIN32
-    if (cif->abi != FFI_THISCALL)
-#endif
-    return FFI_BAD_ABI;
-  }
-
-  /* we currently don't support certain kinds of arguments for raw
-     closures.  This should be implemented by a separate assembly
-     language routine, since it would require argument processing,
-     something we don't do now for performance.  */
-
-  for (i = cif->nargs-1; i >= 0; i--)
-    {
-      FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT);
-      FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE);
-    }
-  
-#ifdef X86_WIN32
-  if (cif->abi == FFI_SYSV)
-    {
-#endif
-  FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV,
-                       codeloc);
-#ifdef X86_WIN32
-    }
-  else if (cif->abi == FFI_THISCALL)
-    {
-      FFI_INIT_TRAMPOLINE_THISCALL (&closure->tramp[0], &ffi_closure_raw_THISCALL,
-				    codeloc, cif->bytes);
-    }
-#endif
-  closure->cif  = cif;
-  closure->user_data = user_data;
-  closure->fun  = fun;
-
-  return FFI_OK;
-}
-
-static void 
-ffi_prep_args_raw(char *stack, extended_cif *ecif)
-{
-  memcpy (stack, ecif->avalue, ecif->cif->bytes);
-}
-
-/* we borrow this routine from libffi (it must be changed, though, to
- * actually call the function passed in the first argument.  as of
- * libffi-1.20, this is not the case.)
- */
-
-void
-ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue)
-{
-  extended_cif ecif;
-  void **avalue = (void **)fake_avalue;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-  
-  /* If the return value is a struct and we don't have a return */
-  /* value address then we need to make one                     */
-
-  if (rvalue == NULL
-      && (cif->flags == FFI_TYPE_STRUCT
-          || cif->flags == FFI_TYPE_MS_STRUCT))
-    {
-      ecif.rvalue = alloca(cif->rtype->size);
-    }
-  else
-    ecif.rvalue = rvalue;
-    
-  
-  switch (cif->abi) 
-    {
-#ifdef X86_WIN32
-    case FFI_SYSV:
-    case FFI_STDCALL:
-    case FFI_MS_CDECL:
-      ffi_call_win32(ffi_prep_args_raw, &ecif, cif->abi, cif->bytes, cif->flags,
-		     ecif.rvalue, fn);
-      break;
-    case FFI_THISCALL:
-    case FFI_FASTCALL:
-      {
-	unsigned int abi = cif->abi;
-	unsigned int i, passed_regs = 0;
-
-	if (cif->flags == FFI_TYPE_STRUCT)
-	  ++passed_regs;
-
-	for (i=0; i < cif->nargs && passed_regs < 2;i++)
-	  {
-	    size_t sz;
-
-	    if (cif->arg_types[i]->type == FFI_TYPE_FLOAT
-	        || cif->arg_types[i]->type == FFI_TYPE_STRUCT)
-	      continue;
-	    sz = (cif->arg_types[i]->size + 3) & ~3;
-	    if (sz == 0 || sz > 4)
-	      continue;
-	    ++passed_regs;
-	  }
-	if (passed_regs < 2 && abi == FFI_FASTCALL)
-	  cif->abi = abi = FFI_THISCALL;
-	if (passed_regs < 1 && abi == FFI_THISCALL)
-	  cif->abi = abi = FFI_STDCALL;
-        ffi_call_win32(ffi_prep_args_raw, &ecif, abi, cif->bytes, cif->flags,
-                       ecif.rvalue, fn);
-      }
-      break;
-#else
-    case FFI_SYSV:
-      ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags,
-                    ecif.rvalue, fn);
-      break;
-#endif
-    default:
-      FFI_ASSERT(0);
-      break;
-    }
-}
-
-#endif
-
-#endif /* !__x86_64__  || X86_WIN64 */
-
diff --git a/third_party/gofrontend/libffi/src/x86/ffi.c b/third_party/gofrontend/libffi/src/x86/ffi.c
deleted file mode 100644
index 3885e39..0000000
--- a/third_party/gofrontend/libffi/src/x86/ffi.c
+++ /dev/null
@@ -1,725 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008  Red Hat, Inc.
-           Copyright (c) 2002  Ranjit Mathew
-           Copyright (c) 2002  Bo Thorsen
-           Copyright (c) 2002  Roger Sayle
-           Copyright (C) 2008, 2010  Free Software Foundation, Inc.
-
-   x86 Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#ifndef __x86_64__
-#include <ffi.h>
-#include <ffi_common.h>
-#include <stdlib.h>
-#include "internal.h"
-
-/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE;
-   all further uses in this file will refer to the 80-bit type.  */
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-# if FFI_TYPE_LONGDOUBLE != 4
-#  error FFI_TYPE_LONGDOUBLE out of date
-# endif
-#else
-# undef FFI_TYPE_LONGDOUBLE
-# define FFI_TYPE_LONGDOUBLE 4
-#endif
-
-#if defined(__GNUC__) && !defined(__declspec)
-# define __declspec(x)  __attribute__((x))
-#endif
-
-/* Perform machine dependent cif processing.  */
-ffi_status FFI_HIDDEN
-ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  size_t bytes = 0;
-  int i, n, flags, cabi = cif->abi;
-
-  switch (cabi)
-    {
-    case FFI_SYSV:
-    case FFI_STDCALL:
-    case FFI_THISCALL:
-    case FFI_FASTCALL:
-    case FFI_MS_CDECL:
-    case FFI_PASCAL:
-    case FFI_REGISTER:
-      break;
-    default:
-      return FFI_BAD_ABI;
-    }
-
-  switch (cif->rtype->type)
-    {
-    case FFI_TYPE_VOID:
-      flags = X86_RET_VOID;
-      break;
-    case FFI_TYPE_FLOAT:
-      flags = X86_RET_FLOAT;
-      break;
-    case FFI_TYPE_DOUBLE:
-      flags = X86_RET_DOUBLE;
-      break;
-    case FFI_TYPE_LONGDOUBLE:
-      flags = X86_RET_LDOUBLE;
-      break;
-    case FFI_TYPE_UINT8:
-      flags = X86_RET_UINT8;
-      break;
-    case FFI_TYPE_UINT16:
-      flags = X86_RET_UINT16;
-      break;
-    case FFI_TYPE_SINT8:
-      flags = X86_RET_SINT8;
-      break;
-    case FFI_TYPE_SINT16:
-      flags = X86_RET_SINT16;
-      break;
-    case FFI_TYPE_INT:
-    case FFI_TYPE_SINT32:
-    case FFI_TYPE_UINT32:
-    case FFI_TYPE_POINTER:
-      flags = X86_RET_INT32;
-      break;
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_UINT64:
-      flags = X86_RET_INT64;
-      break;
-    case FFI_TYPE_STRUCT:
-#ifndef X86
-      /* ??? This should be a different ABI rather than an ifdef.  */
-      if (cif->rtype->size == 1)
-	flags = X86_RET_STRUCT_1B;
-      else if (cif->rtype->size == 2)
-	flags = X86_RET_STRUCT_2B;
-      else if (cif->rtype->size == 4)
-	flags = X86_RET_INT32;
-      else if (cif->rtype->size == 8)
-	flags = X86_RET_INT64;
-      else
-#endif
-	{
-	do_struct:
-	  switch (cabi)
-	    {
-	    case FFI_THISCALL:
-	    case FFI_FASTCALL:
-	    case FFI_STDCALL:
-	    case FFI_MS_CDECL:
-	      flags = X86_RET_STRUCTARG;
-	      break;
-	    default:
-	      flags = X86_RET_STRUCTPOP;
-	      break;
-	    }
-	  /* Allocate space for return value pointer.  */
-	  bytes += ALIGN (sizeof(void*), FFI_SIZEOF_ARG);
-	}
-      break;
-    case FFI_TYPE_COMPLEX:
-      switch (cif->rtype->elements[0]->type)
-	{
-	case FFI_TYPE_DOUBLE:
-	case FFI_TYPE_LONGDOUBLE:
-	case FFI_TYPE_SINT64:
-	case FFI_TYPE_UINT64:
-	  goto do_struct;
-	case FFI_TYPE_FLOAT:
-	case FFI_TYPE_INT:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT32:
-	  flags = X86_RET_INT64;
-	  break;
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_UINT16:
-	  flags = X86_RET_INT32;
-	  break;
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT8:
-	  flags = X86_RET_STRUCT_2B;
-	  break;
-	default:
-	  return FFI_BAD_TYPEDEF;
-	}
-      break;
-    default:
-      return FFI_BAD_TYPEDEF;
-    }
-  cif->flags = flags;
-
-  for (i = 0, n = cif->nargs; i < n; i++)
-    {
-      ffi_type *t = cif->arg_types[i];
-
-      bytes = ALIGN (bytes, t->alignment);
-      bytes += ALIGN (t->size, FFI_SIZEOF_ARG);
-    }
-  cif->bytes = ALIGN (bytes, 16);
-
-  return FFI_OK;
-}
-
-static ffi_arg
-extend_basic_type(void *arg, int type)
-{
-  switch (type)
-    {
-    case FFI_TYPE_SINT8:
-      return *(SINT8 *)arg;
-    case FFI_TYPE_UINT8:
-      return *(UINT8 *)arg;
-    case FFI_TYPE_SINT16:
-      return *(SINT16 *)arg;
-    case FFI_TYPE_UINT16:
-      return *(UINT16 *)arg;
-
-    case FFI_TYPE_SINT32:
-    case FFI_TYPE_UINT32:
-    case FFI_TYPE_POINTER:
-    case FFI_TYPE_FLOAT:
-      return *(UINT32 *)arg;
-
-    default:
-      abort();
-    }
-}
-
-struct call_frame
-{
-  void *ebp;		/* 0 */
-  void *retaddr;	/* 4 */
-  void (*fn)(void);	/* 8 */
-  int flags;		/* 12 */
-  void *rvalue;		/* 16 */
-  unsigned regs[3];	/* 20-28 */
-};
-
-struct abi_params
-{
-  int dir;		/* parameter growth direction */
-  int static_chain;	/* the static chain register used by gcc */
-  int nregs;		/* number of register parameters */
-  int regs[3];
-};
-
-static const struct abi_params abi_params[FFI_LAST_ABI] = {
-  [FFI_SYSV] = { 1, R_ECX, 0 },
-  [FFI_THISCALL] = { 1, R_EAX, 1, { R_ECX } },
-  [FFI_FASTCALL] = { 1, R_EAX, 2, { R_ECX, R_EDX } },
-  [FFI_STDCALL] = { 1, R_ECX, 0 },
-  [FFI_PASCAL] = { -1, R_ECX, 0 },
-  /* ??? No defined static chain; gcc does not support REGISTER.  */
-  [FFI_REGISTER] = { -1, R_ECX, 3, { R_EAX, R_EDX, R_ECX } },
-  [FFI_MS_CDECL] = { 1, R_ECX, 0 }
-};
-
-extern void ffi_call_i386(struct call_frame *, char *)
-#if HAVE_FASTCALL
-	__declspec(fastcall)
-#endif
-	FFI_HIDDEN;
-
-static void
-ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
-	      void **avalue, void *closure)
-{
-  size_t rsize, bytes;
-  struct call_frame *frame;
-  char *stack, *argp;
-  ffi_type **arg_types;
-  int flags, cabi, i, n, dir, narg_reg;
-  const struct abi_params *pabi;
-
-  flags = cif->flags;
-  cabi = cif->abi;
-  pabi = &abi_params[cabi];
-  dir = pabi->dir;
-
-  rsize = 0;
-  if (rvalue == NULL)
-    {
-      switch (flags)
-	{
-	case X86_RET_FLOAT:
-	case X86_RET_DOUBLE:
-	case X86_RET_LDOUBLE:
-	case X86_RET_STRUCTPOP:
-	case X86_RET_STRUCTARG:
-	  /* The float cases need to pop the 387 stack.
-	     The struct cases need to pass a valid pointer to the callee.  */
-	  rsize = cif->rtype->size;
-	  break;
-	default:
-	  /* We can pretend that the callee returns nothing.  */
-	  flags = X86_RET_VOID;
-	  break;
-	}
-    }
-
-  bytes = cif->bytes;
-  stack = alloca(bytes + sizeof(*frame) + rsize);
-  argp = (dir < 0 ? stack + bytes : stack);
-  frame = (struct call_frame *)(stack + bytes);
-  if (rsize)
-    rvalue = frame + 1;
-
-  frame->fn = fn;
-  frame->flags = flags;
-  frame->rvalue = rvalue;
-  frame->regs[pabi->static_chain] = (unsigned)closure;
-
-  narg_reg = 0;
-  switch (flags)
-    {
-    case X86_RET_STRUCTARG:
-      /* The pointer is passed as the first argument.  */
-      if (pabi->nregs > 0)
-	{
-	  frame->regs[pabi->regs[0]] = (unsigned)rvalue;
-	  narg_reg = 1;
-	  break;
-	}
-      /* fallthru */
-    case X86_RET_STRUCTPOP:
-      *(void **)argp = rvalue;
-      argp += sizeof(void *);
-      break;
-    }
-
-  arg_types = cif->arg_types;
-  for (i = 0, n = cif->nargs; i < n; i++)
-    {
-      ffi_type *ty = arg_types[i];
-      void *valp = avalue[i];
-      size_t z = ty->size;
-      int t = ty->type;
-
-      if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT)
-        {
-	  ffi_arg val = extend_basic_type (valp, t);
-
-	  if (t != FFI_TYPE_FLOAT && narg_reg < pabi->nregs)
-	    frame->regs[pabi->regs[narg_reg++]] = val;
-	  else if (dir < 0)
-	    {
-	      argp -= 4;
-	      *(ffi_arg *)argp = val;
-	    }
-	  else
-	    {
-	      *(ffi_arg *)argp = val;
-	      argp += 4;
-	    }
-	}
-      else
-	{
-	  size_t za = ALIGN (z, FFI_SIZEOF_ARG);
-	  size_t align = FFI_SIZEOF_ARG;
-
-	  /* Alignment rules for arguments are quite complex.  Vectors and
-	     structures with 16 byte alignment get it.  Note that long double
-	     on Darwin does have 16 byte alignment, and does not get this
-	     alignment if passed directly; a structure with a long double
-	     inside, however, would get 16 byte alignment.  Since libffi does
-	     not support vectors, we need non concern ourselves with other
-	     cases.  */
-	  if (t == FFI_TYPE_STRUCT && ty->alignment >= 16)
-	    align = 16;
-	    
-	  if (dir < 0)
-	    {
-	      /* ??? These reverse argument ABIs are probably too old
-		 to have cared about alignment.  Someone should check.  */
-	      argp -= za;
-	      memcpy (argp, valp, z);
-	    }
-	  else
-	    {
-	      argp = (char *)ALIGN (argp, align);
-	      memcpy (argp, valp, z);
-	      argp += za;
-	    }
-	}
-    }
-  FFI_ASSERT (dir > 0 || argp == stack);
-
-  ffi_call_i386 (frame, stack);
-}
-
-void
-ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, NULL);
-}
-
-void
-ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
-	     void **avalue, void *closure)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, closure);
-}
-
-/** private members **/
-
-void FFI_HIDDEN ffi_closure_i386(void);
-void FFI_HIDDEN ffi_closure_STDCALL(void);
-void FFI_HIDDEN ffi_closure_REGISTER(void);
-
-struct closure_frame
-{
-  unsigned rettemp[4];				/* 0 */
-  unsigned regs[3];				/* 16-24 */
-  ffi_cif *cif;					/* 28 */
-  void (*fun)(ffi_cif*,void*,void**,void*);	/* 32 */
-  void *user_data;				/* 36 */
-};
-
-int FFI_HIDDEN
-#if HAVE_FASTCALL
-__declspec(fastcall)
-#endif
-ffi_closure_inner (struct closure_frame *frame, char *stack)
-{
-  ffi_cif *cif = frame->cif;
-  int cabi, i, n, flags, dir, narg_reg;
-  const struct abi_params *pabi;
-  ffi_type **arg_types;
-  char *argp;
-  void *rvalue;
-  void **avalue;
-
-  cabi = cif->abi;
-  flags = cif->flags;
-  narg_reg = 0;
-  rvalue = frame->rettemp;
-  pabi = &abi_params[cabi];
-  dir = pabi->dir;
-  argp = (dir < 0 ? stack + cif->bytes : stack);
-
-  switch (flags)
-    {
-    case X86_RET_STRUCTARG:
-      if (pabi->nregs > 0)
-	{
-	  rvalue = (void *)frame->regs[pabi->regs[0]];
-	  narg_reg = 1;
-	  frame->rettemp[0] = (unsigned)rvalue;
-	  break;
-	}
-      /* fallthru */
-    case X86_RET_STRUCTPOP:
-      rvalue = *(void **)argp;
-      argp += sizeof(void *);
-      frame->rettemp[0] = (unsigned)rvalue;
-      break;
-    }
-
-  n = cif->nargs;
-  avalue = alloca(sizeof(void *) * n);
-
-  arg_types = cif->arg_types;
-  for (i = 0; i < n; ++i)
-    {
-      ffi_type *ty = arg_types[i];
-      size_t z = ty->size;
-      int t = ty->type;
-      void *valp;
-
-      if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT)
-	{
-	  if (t != FFI_TYPE_FLOAT && narg_reg < pabi->nregs)
-	    valp = &frame->regs[pabi->regs[narg_reg++]];
-	  else if (dir < 0)
-	    {
-	      argp -= 4;
-	      valp = argp;
-	    }
-	  else
-	    {
-	      valp = argp;
-	      argp += 4;
-	    }
-	}
-      else
-	{
-	  size_t za = ALIGN (z, FFI_SIZEOF_ARG);
-	  size_t align = FFI_SIZEOF_ARG;
-
-	  /* See the comment in ffi_call_int.  */
-	  if (t == FFI_TYPE_STRUCT && ty->alignment >= 16)
-	    align = 16;
-
-	  if (dir < 0)
-	    {
-	      /* ??? These reverse argument ABIs are probably too old
-		 to have cared about alignment.  Someone should check.  */
-	      argp -= za;
-	      valp = argp;
-	    }
-	  else
-	    {
-	      argp = (char *)ALIGN (argp, align);
-	      valp = argp;
-	      argp += za;
-	    }
-	}
-
-      avalue[i] = valp;
-    }
-
-  frame->fun (cif, rvalue, avalue, frame->user_data);
-
-  if (cabi == FFI_STDCALL)
-    return flags + (cif->bytes << X86_RET_POP_SHIFT);
-  else
-    return flags;
-}
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-                      ffi_cif* cif,
-                      void (*fun)(ffi_cif*,void*,void**,void*),
-                      void *user_data,
-                      void *codeloc)
-{
-  char *tramp = closure->tramp;
-  void (*dest)(void);
-  int op = 0xb8;  /* movl imm, %eax */
-
-  switch (cif->abi)
-    {
-    case FFI_SYSV:
-    case FFI_THISCALL:
-    case FFI_FASTCALL:
-    case FFI_MS_CDECL:
-      dest = ffi_closure_i386;
-      break;
-    case FFI_STDCALL:
-    case FFI_PASCAL:
-      dest = ffi_closure_STDCALL;
-      break;
-    case FFI_REGISTER:
-      dest = ffi_closure_REGISTER;
-      op = 0x68;  /* pushl imm */
-    default:
-      return FFI_BAD_ABI;
-    }
-
-  /* movl or pushl immediate.  */
-  tramp[0] = op;
-  *(void **)(tramp + 1) = codeloc;
-
-  /* jmp dest */
-  tramp[5] = 0xe9;
-  *(unsigned *)(tramp + 6) = (unsigned)dest - ((unsigned)codeloc + 10);
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  return FFI_OK;
-}
-
-void FFI_HIDDEN ffi_go_closure_EAX(void);
-void FFI_HIDDEN ffi_go_closure_ECX(void);
-void FFI_HIDDEN ffi_go_closure_STDCALL(void);
-
-ffi_status
-ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif,
-		     void (*fun)(ffi_cif*,void*,void**,void*))
-{
-  void (*dest)(void);
-
-  switch (cif->abi)
-    {
-    case FFI_SYSV:
-    case FFI_MS_CDECL:
-      dest = ffi_go_closure_ECX;
-      break;
-    case FFI_THISCALL:
-    case FFI_FASTCALL:
-      dest = ffi_go_closure_EAX;
-      break;
-    case FFI_STDCALL:
-    case FFI_PASCAL:
-      dest = ffi_go_closure_STDCALL;
-      break;
-    case FFI_REGISTER:
-    default:
-      return FFI_BAD_ABI;
-    }
-
-  closure->tramp = dest;
-  closure->cif = cif;
-  closure->fun = fun;
-
-  return FFI_OK;
-}
-
-/* ------- Native raw API support -------------------------------- */
-
-#if !FFI_NO_RAW_API
-
-void FFI_HIDDEN ffi_closure_raw_SYSV(void);
-void FFI_HIDDEN ffi_closure_raw_THISCALL(void);
-
-ffi_status
-ffi_prep_raw_closure_loc (ffi_raw_closure *closure,
-                          ffi_cif *cif,
-                          void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
-                          void *user_data,
-                          void *codeloc)
-{
-  char *tramp = closure->tramp;
-  void (*dest)(void);
-  int i;
-
-  /* We currently don't support certain kinds of arguments for raw
-     closures.  This should be implemented by a separate assembly
-     language routine, since it would require argument processing,
-     something we don't do now for performance.  */
-  for (i = cif->nargs-1; i >= 0; i--)
-    switch (cif->arg_types[i]->type)
-      {
-      case FFI_TYPE_STRUCT:
-      case FFI_TYPE_LONGDOUBLE:
-	return FFI_BAD_TYPEDEF;
-      }
-
-  switch (cif->abi)
-    {
-    case FFI_THISCALL:
-      dest = ffi_closure_raw_THISCALL;
-      break;
-    case FFI_SYSV:
-      dest = ffi_closure_raw_SYSV;
-      break;
-    default:
-      return FFI_BAD_ABI;
-    }
-
-  /* movl imm, %eax.  */
-  tramp[0] = 0xb8;
-  *(void **)(tramp + 1) = codeloc;
-
-  /* jmp dest */
-  tramp[5] = 0xe9;
-  *(unsigned *)(tramp + 6) = (unsigned)dest - ((unsigned)codeloc + 10);
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  return FFI_OK;
-}
-
-void
-ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue)
-{
-  size_t rsize, bytes;
-  struct call_frame *frame;
-  char *stack, *argp;
-  ffi_type **arg_types;
-  int flags, cabi, i, n, narg_reg;
-  const struct abi_params *pabi;
-
-  flags = cif->flags;
-  cabi = cif->abi;
-  pabi = &abi_params[cabi];
-
-  rsize = 0;
-  if (rvalue == NULL)
-    {
-      switch (flags)
-	{
-	case X86_RET_FLOAT:
-	case X86_RET_DOUBLE:
-	case X86_RET_LDOUBLE:
-	case X86_RET_STRUCTPOP:
-	case X86_RET_STRUCTARG:
-	  /* The float cases need to pop the 387 stack.
-	     The struct cases need to pass a valid pointer to the callee.  */
-	  rsize = cif->rtype->size;
-	  break;
-	default:
-	  /* We can pretend that the callee returns nothing.  */
-	  flags = X86_RET_VOID;
-	  break;
-	}
-    }
-
-  bytes = cif->bytes;
-  argp = stack = alloca(bytes + sizeof(*frame) + rsize);
-  frame = (struct call_frame *)(stack + bytes);
-  if (rsize)
-    rvalue = frame + 1;
-
-  narg_reg = 0;
-  switch (flags)
-    {
-    case X86_RET_STRUCTARG:
-      /* The pointer is passed as the first argument.  */
-      if (pabi->nregs > 0)
-	{
-	  frame->regs[pabi->regs[0]] = (unsigned)rvalue;
-	  narg_reg = 1;
-	  break;
-	}
-      /* fallthru */
-    case X86_RET_STRUCTPOP:
-      *(void **)argp = rvalue;
-      argp += sizeof(void *);
-      bytes -= sizeof(void *);
-      break;
-    }
-
-  arg_types = cif->arg_types;
-  for (i = 0, n = cif->nargs; narg_reg < pabi->nregs && i < n; i++)
-    {
-      ffi_type *ty = arg_types[i];
-      size_t z = ty->size;
-      int t = ty->type;
-
-      if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT && t != FFI_TYPE_FLOAT)
-	{
-	  ffi_arg val = extend_basic_type (avalue, t);
-	  frame->regs[pabi->regs[narg_reg++]] = val;
-	  z = FFI_SIZEOF_ARG;
-	}
-      else
-	{
-	  memcpy (argp, avalue, z);
-	  z = ALIGN (z, FFI_SIZEOF_ARG);
-	  argp += z;
-	}
-      avalue += z;
-      bytes -= z;
-    }
-  if (i < n)
-    memcpy (argp, avalue, bytes);
-
-  ffi_call_i386 (frame, stack);
-}
-#endif /* !FFI_NO_RAW_API */
-#endif /* !__x86_64__ */
diff --git a/third_party/gofrontend/libffi/src/x86/ffi64.c b/third_party/gofrontend/libffi/src/x86/ffi64.c
deleted file mode 100644
index 131b5e3..0000000
--- a/third_party/gofrontend/libffi/src/x86/ffi64.c
+++ /dev/null
@@ -1,824 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi64.c - Copyright (c) 2013  The Written Word, Inc.
-             Copyright (c) 2011  Anthony Green
-             Copyright (c) 2008, 2010  Red Hat, Inc.
-             Copyright (c) 2002, 2007  Bo Thorsen <bo@suse.de>
-
-   x86-64 Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-#include <stdlib.h>
-#include <stdarg.h>
-#include <stdint.h>
-#include "internal64.h"
-
-#ifdef __x86_64__
-
-#define MAX_GPR_REGS 6
-#define MAX_SSE_REGS 8
-
-#if defined(__INTEL_COMPILER)
-#include "xmmintrin.h"
-#define UINT128 __m128
-#else
-#if defined(__SUNPRO_C)
-#include <sunmedia_types.h>
-#define UINT128 __m128i
-#else
-#define UINT128 __int128_t
-#endif
-#endif
-
-union big_int_union
-{
-  UINT32 i32;
-  UINT64 i64;
-  UINT128 i128;
-};
-
-struct register_args
-{
-  /* Registers for argument passing.  */
-  UINT64 gpr[MAX_GPR_REGS];
-  union big_int_union sse[MAX_SSE_REGS];
-  UINT64 rax;	/* ssecount */
-  UINT64 r10;	/* static chain */
-};
-
-extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
-			     void *raddr, void (*fnaddr)(void)) FFI_HIDDEN;
-
-/* All reference to register classes here is identical to the code in
-   gcc/config/i386/i386.c. Do *not* change one without the other.  */
-
-/* Register class used for passing given 64bit part of the argument.
-   These represent classes as documented by the PS ABI, with the
-   exception of SSESF, SSEDF classes, that are basically SSE class,
-   just gcc will use SF or DFmode move instead of DImode to avoid
-   reformatting penalties.
-
-   Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves
-   whenever possible (upper half does contain padding).  */
-enum x86_64_reg_class
-  {
-    X86_64_NO_CLASS,
-    X86_64_INTEGER_CLASS,
-    X86_64_INTEGERSI_CLASS,
-    X86_64_SSE_CLASS,
-    X86_64_SSESF_CLASS,
-    X86_64_SSEDF_CLASS,
-    X86_64_SSEUP_CLASS,
-    X86_64_X87_CLASS,
-    X86_64_X87UP_CLASS,
-    X86_64_COMPLEX_X87_CLASS,
-    X86_64_MEMORY_CLASS
-  };
-
-#define MAX_CLASSES 4
-
-#define SSE_CLASS_P(X)	((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS)
-
-/* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
-   of this code is to classify each 8bytes of incoming argument by the register
-   class and assign registers accordingly.  */
-
-/* Return the union class of CLASS1 and CLASS2.
-   See the x86-64 PS ABI for details.  */
-
-static enum x86_64_reg_class
-merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
-{
-  /* Rule #1: If both classes are equal, this is the resulting class.  */
-  if (class1 == class2)
-    return class1;
-
-  /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
-     the other class.  */
-  if (class1 == X86_64_NO_CLASS)
-    return class2;
-  if (class2 == X86_64_NO_CLASS)
-    return class1;
-
-  /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
-  if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
-    return X86_64_MEMORY_CLASS;
-
-  /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
-  if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
-      || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
-    return X86_64_INTEGERSI_CLASS;
-  if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
-      || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
-    return X86_64_INTEGER_CLASS;
-
-  /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
-     MEMORY is used.  */
-  if (class1 == X86_64_X87_CLASS
-      || class1 == X86_64_X87UP_CLASS
-      || class1 == X86_64_COMPLEX_X87_CLASS
-      || class2 == X86_64_X87_CLASS
-      || class2 == X86_64_X87UP_CLASS
-      || class2 == X86_64_COMPLEX_X87_CLASS)
-    return X86_64_MEMORY_CLASS;
-
-  /* Rule #6: Otherwise class SSE is used.  */
-  return X86_64_SSE_CLASS;
-}
-
-/* Classify the argument of type TYPE and mode MODE.
-   CLASSES will be filled by the register class used to pass each word
-   of the operand.  The number of words is returned.  In case the parameter
-   should be passed in memory, 0 is returned. As a special case for zero
-   sized containers, classes[0] will be NO_CLASS and 1 is returned.
-
-   See the x86-64 PS ABI for details.
-*/
-static size_t
-classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
-		   size_t byte_offset)
-{
-  switch (type->type)
-    {
-    case FFI_TYPE_UINT8:
-    case FFI_TYPE_SINT8:
-    case FFI_TYPE_UINT16:
-    case FFI_TYPE_SINT16:
-    case FFI_TYPE_UINT32:
-    case FFI_TYPE_SINT32:
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_SINT64:
-    case FFI_TYPE_POINTER:
-    do_integer:
-      {
-	size_t size = byte_offset + type->size;
-
-	if (size <= 4)
-	  {
-	    classes[0] = X86_64_INTEGERSI_CLASS;
-	    return 1;
-	  }
-	else if (size <= 8)
-	  {
-	    classes[0] = X86_64_INTEGER_CLASS;
-	    return 1;
-	  }
-	else if (size <= 12)
-	  {
-	    classes[0] = X86_64_INTEGER_CLASS;
-	    classes[1] = X86_64_INTEGERSI_CLASS;
-	    return 2;
-	  }
-	else if (size <= 16)
-	  {
-	    classes[0] = classes[1] = X86_64_INTEGER_CLASS;
-	    return 2;
-	  }
-	else
-	  FFI_ASSERT (0);
-      }
-    case FFI_TYPE_FLOAT:
-      if (!(byte_offset % 8))
-	classes[0] = X86_64_SSESF_CLASS;
-      else
-	classes[0] = X86_64_SSE_CLASS;
-      return 1;
-    case FFI_TYPE_DOUBLE:
-      classes[0] = X86_64_SSEDF_CLASS;
-      return 1;
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-    case FFI_TYPE_LONGDOUBLE:
-      classes[0] = X86_64_X87_CLASS;
-      classes[1] = X86_64_X87UP_CLASS;
-      return 2;
-#endif
-    case FFI_TYPE_STRUCT:
-      {
-	const size_t UNITS_PER_WORD = 8;
-	size_t words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
-	ffi_type **ptr;
-	int i;
-	enum x86_64_reg_class subclasses[MAX_CLASSES];
-
-	/* If the struct is larger than 32 bytes, pass it on the stack.  */
-	if (type->size > 32)
-	  return 0;
-
-	for (i = 0; i < words; i++)
-	  classes[i] = X86_64_NO_CLASS;
-
-	/* Zero sized arrays or structures are NO_CLASS.  We return 0 to
-	   signalize memory class, so handle it as special case.  */
-	if (!words)
-	  {
-    case FFI_TYPE_VOID:
-	    classes[0] = X86_64_NO_CLASS;
-	    return 1;
-	  }
-
-	/* Merge the fields of structure.  */
-	for (ptr = type->elements; *ptr != NULL; ptr++)
-	  {
-	    size_t num;
-
-	    byte_offset = ALIGN (byte_offset, (*ptr)->alignment);
-
-	    num = classify_argument (*ptr, subclasses, byte_offset % 8);
-	    if (num == 0)
-	      return 0;
-	    for (i = 0; i < num; i++)
-	      {
-		size_t pos = byte_offset / 8;
-		classes[i + pos] =
-		  merge_classes (subclasses[i], classes[i + pos]);
-	      }
-
-	    byte_offset += (*ptr)->size;
-	  }
-
-	if (words > 2)
-	  {
-	    /* When size > 16 bytes, if the first one isn't
-	       X86_64_SSE_CLASS or any other ones aren't
-	       X86_64_SSEUP_CLASS, everything should be passed in
-	       memory.  */
-	    if (classes[0] != X86_64_SSE_CLASS)
-	      return 0;
-
-	    for (i = 1; i < words; i++)
-	      if (classes[i] != X86_64_SSEUP_CLASS)
-		return 0;
-	  }
-
-	/* Final merger cleanup.  */
-	for (i = 0; i < words; i++)
-	  {
-	    /* If one class is MEMORY, everything should be passed in
-	       memory.  */
-	    if (classes[i] == X86_64_MEMORY_CLASS)
-	      return 0;
-
-	    /* The X86_64_SSEUP_CLASS should be always preceded by
-	       X86_64_SSE_CLASS or X86_64_SSEUP_CLASS.  */
-	    if (classes[i] == X86_64_SSEUP_CLASS
-		&& classes[i - 1] != X86_64_SSE_CLASS
-		&& classes[i - 1] != X86_64_SSEUP_CLASS)
-	      {
-		/* The first one should never be X86_64_SSEUP_CLASS.  */
-		FFI_ASSERT (i != 0);
-		classes[i] = X86_64_SSE_CLASS;
-	      }
-
-	    /*  If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
-		everything should be passed in memory.  */
-	    if (classes[i] == X86_64_X87UP_CLASS
-		&& (classes[i - 1] != X86_64_X87_CLASS))
-	      {
-		/* The first one should never be X86_64_X87UP_CLASS.  */
-		FFI_ASSERT (i != 0);
-		return 0;
-	      }
-	  }
-	return words;
-      }
-    case FFI_TYPE_COMPLEX:
-      {
-	ffi_type *inner = type->elements[0];
-	switch (inner->type)
-	  {
-	  case FFI_TYPE_INT:
-	  case FFI_TYPE_UINT8:
-	  case FFI_TYPE_SINT8:
-	  case FFI_TYPE_UINT16:
-	  case FFI_TYPE_SINT16:
-	  case FFI_TYPE_UINT32:
-	  case FFI_TYPE_SINT32:
-	  case FFI_TYPE_UINT64:
-	  case FFI_TYPE_SINT64:
-	    goto do_integer;
-
-	  case FFI_TYPE_FLOAT:
-	    classes[0] = X86_64_SSE_CLASS;
-	    if (byte_offset % 8)
-	      {
-		classes[1] = X86_64_SSESF_CLASS;
-		return 2;
-	      }
-	    return 1;
-	  case FFI_TYPE_DOUBLE:
-	    classes[0] = classes[1] = X86_64_SSEDF_CLASS;
-	    return 2;
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-	  case FFI_TYPE_LONGDOUBLE:
-	    classes[0] = X86_64_COMPLEX_X87_CLASS;
-	    return 1;
-#endif
-	  }
-      }
-    }
-  abort();
-}
-
-/* Examine the argument and return set number of register required in each
-   class.  Return zero iff parameter should be passed in memory, otherwise
-   the number of registers.  */
-
-static size_t
-examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES],
-		  _Bool in_return, int *pngpr, int *pnsse)
-{
-  size_t n;
-  int i, ngpr, nsse;
-
-  n = classify_argument (type, classes, 0);
-  if (n == 0)
-    return 0;
-
-  ngpr = nsse = 0;
-  for (i = 0; i < n; ++i)
-    switch (classes[i])
-      {
-      case X86_64_INTEGER_CLASS:
-      case X86_64_INTEGERSI_CLASS:
-	ngpr++;
-	break;
-      case X86_64_SSE_CLASS:
-      case X86_64_SSESF_CLASS:
-      case X86_64_SSEDF_CLASS:
-	nsse++;
-	break;
-      case X86_64_NO_CLASS:
-      case X86_64_SSEUP_CLASS:
-	break;
-      case X86_64_X87_CLASS:
-      case X86_64_X87UP_CLASS:
-      case X86_64_COMPLEX_X87_CLASS:
-	return in_return != 0;
-      default:
-	abort ();
-      }
-
-  *pngpr = ngpr;
-  *pnsse = nsse;
-
-  return n;
-}
-
-/* Perform machine dependent cif processing.  */
-
-ffi_status
-ffi_prep_cif_machdep (ffi_cif *cif)
-{
-  int gprcount, ssecount, i, avn, ngpr, nsse, flags;
-  enum x86_64_reg_class classes[MAX_CLASSES];
-  size_t bytes, n, rtype_size;
-  ffi_type *rtype;
-
-  if (cif->abi != FFI_UNIX64)
-    return FFI_BAD_ABI;
-
-  gprcount = ssecount = 0;
-
-  rtype = cif->rtype;
-  rtype_size = rtype->size;
-  switch (rtype->type)
-    {
-    case FFI_TYPE_VOID:
-      flags = UNIX64_RET_VOID;
-      break;
-    case FFI_TYPE_UINT8:
-      flags = UNIX64_RET_UINT8;
-      break;
-    case FFI_TYPE_SINT8:
-      flags = UNIX64_RET_SINT8;
-      break;
-    case FFI_TYPE_UINT16:
-      flags = UNIX64_RET_UINT16;
-      break;
-    case FFI_TYPE_SINT16:
-      flags = UNIX64_RET_SINT16;
-      break;
-    case FFI_TYPE_UINT32:
-      flags = UNIX64_RET_UINT32;
-      break;
-    case FFI_TYPE_INT:
-    case FFI_TYPE_SINT32:
-      flags = UNIX64_RET_SINT32;
-      break;
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_SINT64:
-      flags = UNIX64_RET_INT64;
-      break;
-    case FFI_TYPE_POINTER:
-      flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64);
-      break;
-    case FFI_TYPE_FLOAT:
-      flags = UNIX64_RET_XMM32;
-      break;
-    case FFI_TYPE_DOUBLE:
-      flags = UNIX64_RET_XMM64;
-      break;
-    case FFI_TYPE_LONGDOUBLE:
-      flags = UNIX64_RET_X87;
-      break;
-    case FFI_TYPE_STRUCT:
-      n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse);
-      if (n == 0)
-	{
-	  /* The return value is passed in memory.  A pointer to that
-	     memory is the first argument.  Allocate a register for it.  */
-	  gprcount++;
-	  /* We don't have to do anything in asm for the return.  */
-	  flags = UNIX64_RET_VOID | UNIX64_FLAG_RET_IN_MEM;
-	}
-      else
-	{
-	  _Bool sse0 = SSE_CLASS_P (classes[0]);
-
-	  if (rtype_size == 4 && sse0)
-	    flags = UNIX64_RET_XMM32;
-	  else if (rtype_size == 8)
-	    flags = sse0 ? UNIX64_RET_XMM64 : UNIX64_RET_INT64;
-	  else
-	    {
-	      _Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]);
-	      if (sse0 && sse1)
-		flags = UNIX64_RET_ST_XMM0_XMM1;
-	      else if (sse0)
-		flags = UNIX64_RET_ST_XMM0_RAX;
-	      else if (sse1)
-		flags = UNIX64_RET_ST_RAX_XMM0;
-	      else
-		flags = UNIX64_RET_ST_RAX_RDX;
-	      flags |= rtype_size << UNIX64_SIZE_SHIFT;
-	    }
-	}
-      break;
-    case FFI_TYPE_COMPLEX:
-      switch (rtype->elements[0]->type)
-	{
-	case FFI_TYPE_UINT8:
-	case FFI_TYPE_SINT8:
-	case FFI_TYPE_UINT16:
-	case FFI_TYPE_SINT16:
-	case FFI_TYPE_INT:
-	case FFI_TYPE_UINT32:
-	case FFI_TYPE_SINT32:
-	case FFI_TYPE_UINT64:
-	case FFI_TYPE_SINT64:
-	  flags = UNIX64_RET_ST_RAX_RDX | (rtype_size << UNIX64_SIZE_SHIFT);
-	  break;
-	case FFI_TYPE_FLOAT:
-	  flags = UNIX64_RET_XMM64;
-	  break;
-	case FFI_TYPE_DOUBLE:
-	  flags = UNIX64_RET_ST_XMM0_XMM1 | (16 << UNIX64_SIZE_SHIFT);
-	  break;
-#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
-	case FFI_TYPE_LONGDOUBLE:
-	  flags = UNIX64_RET_X87_2;
-	  break;
-#endif
-	default:
-	  return FFI_BAD_TYPEDEF;
-	}
-      break;
-    default:
-      return FFI_BAD_TYPEDEF;
-    }
-
-  /* Go over all arguments and determine the way they should be passed.
-     If it's in a register and there is space for it, let that be so. If
-     not, add it's size to the stack byte count.  */
-  for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++)
-    {
-      if (examine_argument (cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0
-	  || gprcount + ngpr > MAX_GPR_REGS
-	  || ssecount + nsse > MAX_SSE_REGS)
-	{
-	  long align = cif->arg_types[i]->alignment;
-
-	  if (align < 8)
-	    align = 8;
-
-	  bytes = ALIGN (bytes, align);
-	  bytes += cif->arg_types[i]->size;
-	}
-      else
-	{
-	  gprcount += ngpr;
-	  ssecount += nsse;
-	}
-    }
-  if (ssecount)
-    flags |= UNIX64_FLAG_XMM_ARGS;
-
-  cif->flags = flags;
-  cif->bytes = ALIGN (bytes, 8);
-
-  return FFI_OK;
-}
-
-static void
-ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
-	      void **avalue, void *closure)
-{
-  enum x86_64_reg_class classes[MAX_CLASSES];
-  char *stack, *argp;
-  ffi_type **arg_types;
-  int gprcount, ssecount, ngpr, nsse, i, avn, flags;
-  struct register_args *reg_args;
-
-  /* Can't call 32-bit mode from 64-bit mode.  */
-  FFI_ASSERT (cif->abi == FFI_UNIX64);
-
-  /* If the return value is a struct and we don't have a return value
-     address then we need to make one.  Otherwise we can ignore it.  */
-  flags = cif->flags;
-  if (rvalue == NULL)
-    {
-      if (flags & UNIX64_FLAG_RET_IN_MEM)
-	rvalue = alloca (cif->rtype->size);
-      else
-	flags = UNIX64_RET_VOID;
-    }
-
-  /* Allocate the space for the arguments, plus 4 words of temp space.  */
-  stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8);
-  reg_args = (struct register_args *) stack;
-  argp = stack + sizeof (struct register_args);
-
-  reg_args->r10 = (uintptr_t) closure;
-
-  gprcount = ssecount = 0;
-
-  /* If the return value is passed in memory, add the pointer as the
-     first integer argument.  */
-  if (flags & UNIX64_FLAG_RET_IN_MEM)
-    reg_args->gpr[gprcount++] = (unsigned long) rvalue;
-
-  avn = cif->nargs;
-  arg_types = cif->arg_types;
-
-  for (i = 0; i < avn; ++i)
-    {
-      size_t n, size = arg_types[i]->size;
-
-      n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse);
-      if (n == 0
-	  || gprcount + ngpr > MAX_GPR_REGS
-	  || ssecount + nsse > MAX_SSE_REGS)
-	{
-	  long align = arg_types[i]->alignment;
-
-	  /* Stack arguments are *always* at least 8 byte aligned.  */
-	  if (align < 8)
-	    align = 8;
-
-	  /* Pass this argument in memory.  */
-	  argp = (void *) ALIGN (argp, align);
-	  memcpy (argp, avalue[i], size);
-	  argp += size;
-	}
-      else
-	{
-	  /* The argument is passed entirely in registers.  */
-	  char *a = (char *) avalue[i];
-	  int j;
-
-	  for (j = 0; j < n; j++, a += 8, size -= 8)
-	    {
-	      switch (classes[j])
-		{
-		case X86_64_NO_CLASS:
-		case X86_64_SSEUP_CLASS:
-		  break;
-		case X86_64_INTEGER_CLASS:
-		case X86_64_INTEGERSI_CLASS:
-		  /* Sign-extend integer arguments passed in general
-		     purpose registers, to cope with the fact that
-		     LLVM incorrectly assumes that this will be done
-		     (the x86-64 PS ABI does not specify this). */
-		  switch (arg_types[i]->type)
-		    {
-		    case FFI_TYPE_SINT8:
-		      reg_args->gpr[gprcount] = (SINT64) *((SINT8 *) a);
-		      break;
-		    case FFI_TYPE_SINT16:
-		      reg_args->gpr[gprcount] = (SINT64) *((SINT16 *) a);
-		      break;
-		    case FFI_TYPE_SINT32:
-		      reg_args->gpr[gprcount] = (SINT64) *((SINT32 *) a);
-		      break;
-		    default:
-		      reg_args->gpr[gprcount] = 0;
-		      memcpy (&reg_args->gpr[gprcount], a, size);
-		    }
-		  gprcount++;
-		  break;
-		case X86_64_SSE_CLASS:
-		case X86_64_SSEDF_CLASS:
-		  reg_args->sse[ssecount++].i64 = *(UINT64 *) a;
-		  break;
-		case X86_64_SSESF_CLASS:
-		  reg_args->sse[ssecount++].i32 = *(UINT32 *) a;
-		  break;
-		default:
-		  abort();
-		}
-	    }
-	}
-    }
-  reg_args->rax = ssecount;
-
-  ffi_call_unix64 (stack, cif->bytes + sizeof (struct register_args),
-		   flags, rvalue, fn);
-}
-
-void
-ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, NULL);
-}
-
-void
-ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
-	     void **avalue, void *closure)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, closure);
-}
-
-extern void ffi_closure_unix64(void) FFI_HIDDEN;
-extern void ffi_closure_unix64_sse(void) FFI_HIDDEN;
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun)(ffi_cif*, void*, void**, void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  static const unsigned char trampoline[16] = {
-    /* leaq  -0x7(%rip),%r10   # 0x0  */
-    0x4c, 0x8d, 0x15, 0xf9, 0xff, 0xff, 0xff,
-    /* jmpq  *0x3(%rip)        # 0x10 */
-    0xff, 0x25, 0x03, 0x00, 0x00, 0x00,
-    /* nopl  (%rax) */
-    0x0f, 0x1f, 0x00
-  };
-  void (*dest)(void);
-  char *tramp = closure->tramp;
-
-  if (cif->abi != FFI_UNIX64)
-    return FFI_BAD_ABI;
-
-  if (cif->flags & UNIX64_FLAG_XMM_ARGS)
-    dest = ffi_closure_unix64_sse;
-  else
-    dest = ffi_closure_unix64;
-
-  memcpy (tramp, trampoline, sizeof(trampoline));
-  *(UINT64 *)(tramp + 16) = (uintptr_t)dest;
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  return FFI_OK;
-}
-
-int FFI_HIDDEN
-ffi_closure_unix64_inner(ffi_cif *cif,
-			 void (*fun)(ffi_cif*, void*, void**, void*),
-			 void *user_data,
-			 void *rvalue,
-			 struct register_args *reg_args,
-			 char *argp)
-{
-  void **avalue;
-  ffi_type **arg_types;
-  long i, avn;
-  int gprcount, ssecount, ngpr, nsse;
-  int flags;
-
-  avn = cif->nargs;
-  flags = cif->flags;
-  avalue = alloca(avn * sizeof(void *));
-  gprcount = ssecount = 0;
-
-  if (flags & UNIX64_FLAG_RET_IN_MEM)
-    {
-      /* On return, %rax will contain the address that was passed
-	 by the caller in %rdi.  */
-      void *r = (void *)(uintptr_t)reg_args->gpr[gprcount++];
-      *(void **)rvalue = r;
-      rvalue = r;
-      flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64);
-    }
-
-  arg_types = cif->arg_types;
-  for (i = 0; i < avn; ++i)
-    {
-      enum x86_64_reg_class classes[MAX_CLASSES];
-      size_t n;
-
-      n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse);
-      if (n == 0
-	  || gprcount + ngpr > MAX_GPR_REGS
-	  || ssecount + nsse > MAX_SSE_REGS)
-	{
-	  long align = arg_types[i]->alignment;
-
-	  /* Stack arguments are *always* at least 8 byte aligned.  */
-	  if (align < 8)
-	    align = 8;
-
-	  /* Pass this argument in memory.  */
-	  argp = (void *) ALIGN (argp, align);
-	  avalue[i] = argp;
-	  argp += arg_types[i]->size;
-	}
-      /* If the argument is in a single register, or two consecutive
-	 integer registers, then we can use that address directly.  */
-      else if (n == 1
-	       || (n == 2 && !(SSE_CLASS_P (classes[0])
-			       || SSE_CLASS_P (classes[1]))))
-	{
-	  /* The argument is in a single register.  */
-	  if (SSE_CLASS_P (classes[0]))
-	    {
-	      avalue[i] = &reg_args->sse[ssecount];
-	      ssecount += n;
-	    }
-	  else
-	    {
-	      avalue[i] = &reg_args->gpr[gprcount];
-	      gprcount += n;
-	    }
-	}
-      /* Otherwise, allocate space to make them consecutive.  */
-      else
-	{
-	  char *a = alloca (16);
-	  int j;
-
-	  avalue[i] = a;
-	  for (j = 0; j < n; j++, a += 8)
-	    {
-	      if (SSE_CLASS_P (classes[j]))
-		memcpy (a, &reg_args->sse[ssecount++], 8);
-	      else
-		memcpy (a, &reg_args->gpr[gprcount++], 8);
-	    }
-	}
-    }
-
-  /* Invoke the closure.  */
-  fun (cif, rvalue, avalue, user_data);
-
-  /* Tell assembly how to perform return type promotions.  */
-  return flags;
-}
-
-extern void ffi_go_closure_unix64(void) FFI_HIDDEN;
-extern void ffi_go_closure_unix64_sse(void) FFI_HIDDEN;
-
-ffi_status
-ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif,
-		     void (*fun)(ffi_cif*, void*, void**, void*))
-{
-  if (cif->abi != FFI_UNIX64)
-    return FFI_BAD_ABI;
-
-  closure->tramp = (cif->flags & UNIX64_FLAG_XMM_ARGS
-		    ? ffi_go_closure_unix64_sse
-		    : ffi_go_closure_unix64);
-  closure->cif = cif;
-  closure->fun = fun;
-
-  return FFI_OK;
-}
-
-#endif /* __x86_64__ */
diff --git a/third_party/gofrontend/libffi/src/x86/ffitarget.h b/third_party/gofrontend/libffi/src/x86/ffitarget.h
deleted file mode 100644
index 8c1dcac..0000000
--- a/third_party/gofrontend/libffi/src/x86/ffitarget.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2012, 2014  Anthony Green
-                 Copyright (c) 1996-2003, 2010  Red Hat, Inc.
-                 Copyright (C) 2008  Free Software Foundation, Inc.
-
-   Target configuration macros for x86 and x86-64.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-/* ---- System specific configurations ----------------------------------- */
-
-/* For code common to all platforms on x86 and x86_64. */
-#define X86_ANY
-
-#if defined (X86_64) && defined (__i386__)
-#undef X86_64
-#define X86
-#endif
-
-#ifdef X86_WIN64
-#define FFI_SIZEOF_ARG 8
-#define USE_BUILTIN_FFS 0 /* not yet implemented in mingw-64 */
-#endif
-
-#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION
-#ifndef _MSC_VER
-#define FFI_TARGET_HAS_COMPLEX_TYPE
-#endif
-
-/* ---- Generic type definitions ----------------------------------------- */
-
-#ifndef LIBFFI_ASM
-#ifdef X86_WIN64
-#ifdef _MSC_VER
-typedef unsigned __int64       ffi_arg;
-typedef __int64                ffi_sarg;
-#else
-typedef unsigned long long     ffi_arg;
-typedef long long              ffi_sarg;
-#endif
-#else
-#if defined __x86_64__ && defined __ILP32__
-#define FFI_SIZEOF_ARG 8
-#define FFI_SIZEOF_JAVA_RAW  4
-typedef unsigned long long     ffi_arg;
-typedef long long              ffi_sarg;
-#else
-typedef unsigned long          ffi_arg;
-typedef signed long            ffi_sarg;
-#endif
-#endif
-
-typedef enum ffi_abi {
-#if defined(X86_WIN64)
-  FFI_FIRST_ABI = 0,
-  FFI_WIN64,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_WIN64
-
-#elif defined(X86_64) || (defined (__x86_64__) && defined (X86_DARWIN))
-  FFI_FIRST_ABI = 1,
-  FFI_UNIX64,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_UNIX64
-
-#elif defined(X86_WIN32)
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV      = 1,
-  FFI_STDCALL   = 2,
-  FFI_THISCALL  = 3,
-  FFI_FASTCALL  = 4,
-  FFI_MS_CDECL  = 5,
-  FFI_PASCAL    = 6,
-  FFI_REGISTER  = 7,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_MS_CDECL
-#else
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV      = 1,
-  FFI_THISCALL  = 3,
-  FFI_FASTCALL  = 4,
-  FFI_STDCALL   = 5,
-  FFI_PASCAL    = 6,
-  FFI_REGISTER  = 7,
-  FFI_MS_CDECL  = 8,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_SYSV
-#endif
-} ffi_abi;
-#endif
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_GO_CLOSURES 1
-
-#define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1)
-#define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2)
-#define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3)
-#define FFI_TYPE_MS_STRUCT       (FFI_TYPE_LAST + 4)
-
-#if defined (X86_64) || defined(X86_WIN64) \
-    || (defined (__x86_64__) && defined (X86_DARWIN))
-# define FFI_TRAMPOLINE_SIZE 24
-# define FFI_NATIVE_RAW_API 0
-#else
-# define FFI_TRAMPOLINE_SIZE 12
-# define FFI_NATIVE_RAW_API 1  /* x86 has native raw api support */
-#endif
-
-#endif
-
diff --git a/third_party/gofrontend/libffi/src/x86/ffiw64.c b/third_party/gofrontend/libffi/src/x86/ffiw64.c
deleted file mode 100644
index 8a33a6c..0000000
--- a/third_party/gofrontend/libffi/src/x86/ffiw64.c
+++ /dev/null
@@ -1,281 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffiw64.c - Copyright (c) 2014 Red Hat, Inc.
-
-   x86 win64 Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-#include <stdlib.h>
-#include <stdint.h>
-
-#ifdef X86_WIN64
-
-struct win64_call_frame
-{
-  UINT64 rbp;		/* 0 */
-  UINT64 retaddr;	/* 8 */
-  UINT64 fn;		/* 16 */
-  UINT64 flags;		/* 24 */
-  UINT64 rvalue;	/* 32 */
-};
-
-extern void ffi_call_win64 (void *stack, struct win64_call_frame *,
-			    void *closure) FFI_HIDDEN;
-
-ffi_status
-ffi_prep_cif_machdep (ffi_cif *cif)
-{
-  int flags, n;
-
-  if (cif->abi != FFI_WIN64)
-    return FFI_BAD_ABI;
-
-  flags = cif->rtype->type;
-  switch (flags)
-    {
-    default:
-      break;
-    case FFI_TYPE_LONGDOUBLE:
-      flags = FFI_TYPE_STRUCT;
-      break;
-    case FFI_TYPE_COMPLEX:
-      flags = FFI_TYPE_STRUCT;
-      /* FALLTHRU */
-    case FFI_TYPE_STRUCT:
-      switch (cif->rtype->size)
-	{
-	case 8:
-	  flags = FFI_TYPE_UINT64;
-	  break;
-	case 4:
-	  flags = FFI_TYPE_SMALL_STRUCT_4B;
-	  break;
-	case 2:
-	  flags = FFI_TYPE_SMALL_STRUCT_2B;
-	  break;
-	case 1:
-	  flags = FFI_TYPE_SMALL_STRUCT_1B;
-	  break;
-	}
-      break;
-    }
-  cif->flags = flags;
-
-  /* Each argument either fits in a register, an 8 byte slot, or is
-     passed by reference with the pointer in the 8 byte slot.  */
-  n = cif->nargs;
-  n += (flags == FFI_TYPE_STRUCT);
-  if (n < 4)
-    n = 4;
-  cif->bytes = n * 8;
-
-  return FFI_OK;
-}
-
-static void
-ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
-	      void **avalue, void *closure)
-{
-  int i, j, n, flags;
-  UINT64 *stack;
-  size_t rsize;
-  struct win64_call_frame *frame;
-
-  FFI_ASSERT(cif->abi == FFI_WIN64);
-
-  flags = cif->flags;
-  rsize = 0;
-
-  /* If we have no return value for a structure, we need to create one.
-     Otherwise we can ignore the return type entirely.  */
-  if (rvalue == NULL)
-    {
-      if (flags == FFI_TYPE_STRUCT)
-	rsize = cif->rtype->size;
-      else
-	flags = FFI_TYPE_VOID;
-    }
-
-  stack = alloca(cif->bytes + sizeof(struct win64_call_frame) + rsize);
-  frame = (struct win64_call_frame *)((char *)stack + cif->bytes);
-  if (rsize)
-    rvalue = frame + 1;
-
-  frame->fn = (uintptr_t)fn;
-  frame->flags = flags;
-  frame->rvalue = (uintptr_t)rvalue;
-
-  j = 0;
-  if (flags == FFI_TYPE_STRUCT)
-    {
-      stack[0] = (uintptr_t)rvalue;
-      j = 1;
-    }
-
-  for (i = 0, n = cif->nargs; i < n; ++i, ++j)
-    {
-      switch (cif->arg_types[i]->size)
-	{
-	case 8:
-	  stack[j] = *(UINT64 *)avalue[i];
-	  break;
-	case 4:
-	  stack[j] = *(UINT32 *)avalue[i];
-	  break;
-	case 2:
-	  stack[j] = *(UINT16 *)avalue[i];
-	  break;
-	case 1:
-	  stack[j] = *(UINT8 *)avalue[i];
-	  break;
-	default:
-	  stack[j] = (uintptr_t)avalue[i];
-	  break;
-	}
-    }
-
-  ffi_call_win64 (stack, frame, closure);
-}
-
-void
-ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, NULL);
-}
-
-void
-ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
-	     void **avalue, void *closure)
-{
-  ffi_call_int (cif, fn, rvalue, avalue, closure);
-}
-
-
-extern void ffi_closure_win64(void) FFI_HIDDEN;
-extern void ffi_go_closure_win64(void) FFI_HIDDEN;
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-		      ffi_cif* cif,
-		      void (*fun)(ffi_cif*, void*, void**, void*),
-		      void *user_data,
-		      void *codeloc)
-{
-  static const unsigned char trampoline[16] = {
-    /* leaq  -0x7(%rip),%r10   # 0x0  */
-    0x4c, 0x8d, 0x15, 0xf9, 0xff, 0xff, 0xff,
-    /* jmpq  *0x3(%rip)        # 0x10 */
-    0xff, 0x25, 0x03, 0x00, 0x00, 0x00,
-    /* nopl  (%rax) */
-    0x0f, 0x1f, 0x00
-  };
-  unsigned char *tramp = closure->tramp;
-
-  if (cif->abi != FFI_WIN64)
-    return FFI_BAD_ABI;
-
-  memcpy (tramp, trampoline, sizeof(trampoline));
-  *(UINT64 *)(tramp + 16) = (uintptr_t)ffi_closure_win64;
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-
-  return FFI_OK;
-}
-
-ffi_status
-ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif,
-		     void (*fun)(ffi_cif*, void*, void**, void*))
-{
-  if (cif->abi != FFI_WIN64)
-    return FFI_BAD_ABI;
-
-  closure->tramp = ffi_go_closure_win64;
-  closure->cif = cif;
-  closure->fun = fun;
-
-  return FFI_OK;
-}
-
-struct win64_closure_frame
-{
-  UINT64 rvalue[2];
-  UINT64 fargs[4];
-  UINT64 retaddr;
-  UINT64 args[];
-};
-
-int FFI_HIDDEN
-ffi_closure_win64_inner(ffi_cif *cif,
-			void (*fun)(ffi_cif*, void*, void**, void*),
-			void *user_data,
-			struct win64_closure_frame *frame)
-{
-  void **avalue;
-  void *rvalue;
-  int i, n, nreg, flags;
-
-  avalue = alloca(cif->nargs * sizeof(void *));
-  rvalue = frame->rvalue;
-  nreg = 0;
-
-  /* When returning a structure, the address is in the first argument.
-     We must also be prepared to return the same address in eax, so
-     install that address in the frame and pretend we return a pointer.  */
-  flags = cif->flags;
-  if (flags == FFI_TYPE_STRUCT)
-    {
-      rvalue = (void *)(uintptr_t)frame->args[0];
-      frame->rvalue[0] = frame->args[0];
-      nreg = 1;
-    }
-
-  for (i = 0, n = cif->nargs; i < n; ++i, ++nreg)
-    {
-      size_t size = cif->arg_types[i]->size;
-      size_t type = cif->arg_types[i]->type;
-      void *a;
-
-      if (type == FFI_TYPE_DOUBLE || type == FFI_TYPE_FLOAT)
-	{
-	  if (nreg < 4)
-	    a = &frame->fargs[nreg];
-	  else
-	    a = &frame->args[nreg];
-	}
-      else if (size == 1 || size == 2 || size == 4 || size == 8)
-	a = &frame->args[nreg];
-      else
-	a = (void *)(uintptr_t)frame->args[nreg];
-
-      avalue[i] = a;
-    }
-
-  /* Invoke the closure.  */
-  fun (cif, rvalue, avalue, user_data);
-  return flags;
-}
-
-#endif /* X86_WIN64 */
diff --git a/third_party/gofrontend/libffi/src/x86/internal.h b/third_party/gofrontend/libffi/src/x86/internal.h
deleted file mode 100644
index 09771ba..0000000
--- a/third_party/gofrontend/libffi/src/x86/internal.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#define X86_RET_FLOAT		0
-#define X86_RET_DOUBLE		1
-#define X86_RET_LDOUBLE		2
-#define X86_RET_SINT8		3
-#define X86_RET_SINT16		4
-#define X86_RET_UINT8		5
-#define X86_RET_UINT16		6
-#define X86_RET_INT64		7
-#define X86_RET_INT32		8
-#define X86_RET_VOID		9
-#define X86_RET_STRUCTPOP	10
-#define X86_RET_STRUCTARG       11
-#define X86_RET_STRUCT_1B	12
-#define X86_RET_STRUCT_2B	13
-#define X86_RET_UNUSED14	14
-#define X86_RET_UNUSED15	15
-
-#define X86_RET_TYPE_MASK	15
-#define X86_RET_POP_SHIFT	4
-
-#define R_EAX	0
-#define R_EDX	1
-#define R_ECX	2
-
-#ifdef __PCC__
-# define HAVE_FASTCALL 0
-#else
-# define HAVE_FASTCALL 1
-#endif
diff --git a/third_party/gofrontend/libffi/src/x86/internal64.h b/third_party/gofrontend/libffi/src/x86/internal64.h
deleted file mode 100644
index 512e955..0000000
--- a/third_party/gofrontend/libffi/src/x86/internal64.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#define UNIX64_RET_VOID		0
-#define UNIX64_RET_UINT8	1
-#define UNIX64_RET_UINT16	2
-#define UNIX64_RET_UINT32	3
-#define UNIX64_RET_SINT8	4
-#define UNIX64_RET_SINT16	5
-#define UNIX64_RET_SINT32	6
-#define UNIX64_RET_INT64	7
-#define UNIX64_RET_XMM32	8
-#define UNIX64_RET_XMM64	9
-#define UNIX64_RET_X87		10
-#define UNIX64_RET_X87_2	11
-#define UNIX64_RET_ST_XMM0_RAX	12
-#define UNIX64_RET_ST_RAX_XMM0	13
-#define UNIX64_RET_ST_XMM0_XMM1	14
-#define UNIX64_RET_ST_RAX_RDX	15
-
-#define UNIX64_RET_LAST		15
-
-#define UNIX64_FLAG_RET_IN_MEM	(1 << 10)
-#define UNIX64_FLAG_XMM_ARGS	(1 << 11)
-#define UNIX64_SIZE_SHIFT	12
diff --git a/third_party/gofrontend/libffi/src/x86/sysv.S b/third_party/gofrontend/libffi/src/x86/sysv.S
deleted file mode 100644
index ebbea5d..0000000
--- a/third_party/gofrontend/libffi/src/x86/sysv.S
+++ /dev/null
@@ -1,1038 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2013  The Written Word, Inc.
-	  - Copyright (c) 1996,1998,2001-2003,2005,2008,2010  Red Hat, Inc.
-   
-   X86 Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#ifndef __x86_64__
-
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-#include "internal.h"
-
-#define C2(X, Y)  X ## Y
-#define C1(X, Y)  C2(X, Y)
-#ifdef __USER_LABEL_PREFIX__
-# define C(X)     C1(__USER_LABEL_PREFIX__, X)
-#else
-# define C(X)     X
-#endif
-
-#ifdef X86_DARWIN
-# define L(X)     C1(L, X)
-#else
-# define L(X)     C1(.L, X)
-#endif
-
-#ifdef __ELF__
-# define ENDF(X)  .type	X,@function; .size X, . - X
-#else
-# define ENDF(X)
-#endif
-
-/* Handle win32 fastcall name mangling.  */
-#ifdef X86_WIN32
-# define ffi_call_i386		@ffi_call_i386@8
-# define ffi_closure_inner	@ffi_closure_inner@8
-#else
-# define ffi_call_i386		C(ffi_call_i386)
-# define ffi_closure_inner	C(ffi_closure_inner)
-#endif
-
-/* This macro allows the safe creation of jump tables without an
-   actual table.  The entry points into the table are all 8 bytes.
-   The use of ORG asserts that we're at the correct location.  */
-/* ??? The clang assembler doesn't handle .org with symbolic expressions.  */
-#if defined(__clang__) || defined(__APPLE__)
-# define E(BASE, X)	.balign 8
-#else
-# define E(BASE, X)	.balign 8; .org BASE + X * 8
-#endif
-
-	.text
-	.balign	16
-	.globl	ffi_call_i386
-	FFI_HIDDEN(ffi_call_i386)
-
-/* This is declared as
-
-   void ffi_call_i386(struct call_frame *frame, char *argp)
-        __attribute__((fastcall));
-
-   Thus the arguments are present in
-
-        ecx: frame
-        edx: argp
-*/
-
-ffi_call_i386:
-L(UW0):
-	# cfi_startproc
-#if !HAVE_FASTCALL
-	movl	4(%esp), %ecx
-	movl	8(%esp), %edx
-#endif
-	movl	(%esp), %eax		/* move the return address */
-	movl	%ebp, (%ecx)		/* store %ebp into local frame */
-	movl	%eax, 4(%ecx)		/* store retaddr into local frame */
-
-	/* New stack frame based off ebp.  This is a itty bit of unwind
-	   trickery in that the CFA *has* changed.  There is no easy way
-	   to describe it correctly on entry to the function.  Fortunately,
-	   it doesn't matter too much since at all points we can correctly
-	   unwind back to ffi_call.  Note that the location to which we
-	   moved the return address is (the new) CFA-4, so from the
-	   perspective of the unwind info, it hasn't moved.  */
-	movl	%ecx, %ebp
-L(UW1):
-	# cfi_def_cfa(%ebp, 8)
-	# cfi_rel_offset(%ebp, 0)
-
-	movl	%edx, %esp		/* set outgoing argument stack */
-	movl	20+R_EAX*4(%ebp), %eax	/* set register arguments */
-	movl	20+R_EDX*4(%ebp), %edx
-	movl	20+R_ECX*4(%ebp), %ecx
-
-	call	*8(%ebp)
-
-	movl	12(%ebp), %ecx		/* load return type code */
-	movl	%ebx, 8(%ebp)		/* preserve %ebx */
-L(UW2):
-	# cfi_rel_offset(%ebx, 8)
-
-	andl	$X86_RET_TYPE_MASK, %ecx
-#ifdef __PIC__
-	call	C(__x86.get_pc_thunk.bx)
-L(pc1):
-	leal	L(store_table)-L(pc1)(%ebx, %ecx, 8), %ebx
-#else
-	leal	L(store_table)(,%ecx, 8), %ebx
-#endif
-	movl	16(%ebp), %ecx		/* load result address */
-	jmp	*%ebx
-
-	.balign	8
-L(store_table):
-E(L(store_table), X86_RET_FLOAT)
-	fstps	(%ecx)
-	jmp	L(e1)
-E(L(store_table), X86_RET_DOUBLE)
-	fstpl	(%ecx)
-	jmp	L(e1)
-E(L(store_table), X86_RET_LDOUBLE)
-	fstpt	(%ecx)
-	jmp	L(e1)
-E(L(store_table), X86_RET_SINT8)
-	movsbl	%al, %eax
-	mov	%eax, (%ecx)
-	jmp	L(e1)
-E(L(store_table), X86_RET_SINT16)
-	movswl	%ax, %eax
-	mov	%eax, (%ecx)
-	jmp	L(e1)
-E(L(store_table), X86_RET_UINT8)
-	movzbl	%al, %eax
-	mov	%eax, (%ecx)
-	jmp	L(e1)
-E(L(store_table), X86_RET_UINT16)
-	movzwl	%ax, %eax
-	mov	%eax, (%ecx)
-	jmp	L(e1)
-E(L(store_table), X86_RET_INT64)
-	movl	%edx, 4(%ecx)
-	/* fallthru */
-E(L(store_table), X86_RET_INT32)
-	movl	%eax, (%ecx)
-	/* fallthru */
-E(L(store_table), X86_RET_VOID)
-L(e1):
-	movl	8(%ebp), %ebx
-	movl	%ebp, %esp
-	popl	%ebp
-L(UW3):
-	# cfi_remember_state
-	# cfi_def_cfa(%esp, 4)
-	# cfi_restore(%ebx)
-	# cfi_restore(%ebp)
-	ret
-L(UW4):
-	# cfi_restore_state
-
-E(L(store_table), X86_RET_STRUCTPOP)
-	jmp	L(e1)
-E(L(store_table), X86_RET_STRUCTARG)
-	jmp	L(e1)
-E(L(store_table), X86_RET_STRUCT_1B)
-	movb	%al, (%ecx)
-	jmp	L(e1)
-E(L(store_table), X86_RET_STRUCT_2B)
-	movw	%ax, (%ecx)
-	jmp	L(e1)
-
-	/* Fill out the table so that bad values are predictable.  */
-E(L(store_table), X86_RET_UNUSED14)
-	ud2
-E(L(store_table), X86_RET_UNUSED15)
-	ud2
-
-L(UW5):
-	# cfi_endproc
-ENDF(ffi_call_i386)
-
-/* The inner helper is declared as
-
-   void ffi_closure_inner(struct closure_frame *frame, char *argp)
-	__attribute_((fastcall))
-
-   Thus the arguments are placed in
-
-	ecx:	frame
-	edx:	argp
-*/
-
-/* Macros to help setting up the closure_data structure.  */
-
-#if HAVE_FASTCALL
-# define closure_FS	(40 + 4)
-# define closure_CF	0
-#else
-# define closure_FS	(8 + 40 + 12)
-# define closure_CF	8
-#endif
-
-#define FFI_CLOSURE_SAVE_REGS		\
-	movl	%eax, closure_CF+16+R_EAX*4(%esp);	\
-	movl	%edx, closure_CF+16+R_EDX*4(%esp);	\
-	movl	%ecx, closure_CF+16+R_ECX*4(%esp)
-
-#define FFI_CLOSURE_COPY_TRAMP_DATA					\
-	movl	FFI_TRAMPOLINE_SIZE(%eax), %edx;	/* copy cif */	\
-	movl	FFI_TRAMPOLINE_SIZE+4(%eax), %ecx;	/* copy fun */	\
-	movl	FFI_TRAMPOLINE_SIZE+8(%eax), %eax;	/* copy user_data */ \
-	movl	%edx, closure_CF+28(%esp);				\
-	movl	%ecx, closure_CF+32(%esp);				\
-	movl	%eax, closure_CF+36(%esp)
-
-#if HAVE_FASTCALL
-# define FFI_CLOSURE_PREP_CALL						\
-	movl	%esp, %ecx;			/* load closure_data */	\
-	leal	closure_FS+4(%esp), %edx;	/* load incoming stack */
-#else
-# define FFI_CLOSURE_PREP_CALL						\
-	leal	closure_CF(%esp), %ecx;		/* load closure_data */	\
-	leal	closure_FS+4(%esp), %edx;	/* load incoming stack */ \
-	movl	%ecx, (%esp);						\
-	movl	%edx, 4(%esp)
-#endif
-
-#define FFI_CLOSURE_CALL_INNER(UWN) \
-	call	ffi_closure_inner
-
-#define FFI_CLOSURE_MASK_AND_JUMP(N, UW)				\
-	andl	$X86_RET_TYPE_MASK, %eax;				\
-	leal	L(C1(load_table,N))(, %eax, 8), %edx;			\
-	movl	closure_CF(%esp), %eax;		/* optimiztic load */	\
-	jmp	*%edx
-
-#ifdef __PIC__
-# if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
-#  undef FFI_CLOSURE_MASK_AND_JUMP
-#  define FFI_CLOSURE_MASK_AND_JUMP(N, UW)				\
-	andl	$X86_RET_TYPE_MASK, %eax;				\
-	call	C(__x86.get_pc_thunk.dx);				\
-L(C1(pc,N)):								\
-	leal	L(C1(load_table,N))-L(C1(pc,N))(%edx, %eax, 8), %edx;	\
-	movl	closure_CF(%esp), %eax;		/* optimiztic load */	\
-	jmp	*%edx
-# else
-#  define FFI_CLOSURE_CALL_INNER_SAVE_EBX
-#  undef FFI_CLOSURE_CALL_INNER
-#  define FFI_CLOSURE_CALL_INNER(UWN)					\
-	movl	%ebx, 40(%esp);			/* save ebx */		\
-L(C1(UW,UWN)):								\
-	# cfi_rel_offset(%ebx, 40);					\
-	call	C(__x86.get_pc_thunk.bx);	/* load got register */	\
-	addl	$C(_GLOBAL_OFFSET_TABLE_), %ebx;			\
-	call	ffi_closure_inner@PLT
-#  undef FFI_CLOSURE_MASK_AND_JUMP
-#  define FFI_CLOSURE_MASK_AND_JUMP(N, UWN)				\
-	andl	$X86_RET_TYPE_MASK, %eax;				\
-	leal	L(C1(load_table,N))@GOTOFF(%ebx, %eax, 8), %edx;	\
-	movl	40(%esp), %ebx;			/* restore ebx */	\
-L(C1(UW,UWN)):								\
-	# cfi_restore(%ebx);						\
-	movl	closure_CF(%esp), %eax;		/* optimiztic load */	\
-	jmp	*%edx
-# endif /* DARWIN || HIDDEN */
-#endif /* __PIC__ */
-
-	.balign	16
-	.globl	C(ffi_go_closure_EAX)
-	FFI_HIDDEN(C(ffi_go_closure_EAX))
-C(ffi_go_closure_EAX):
-L(UW6):
-	# cfi_startproc
-	subl	$closure_FS, %esp
-L(UW7):
-	# cfi_def_cfa_offset(closure_FS + 4)
-	FFI_CLOSURE_SAVE_REGS
-	movl	4(%eax), %edx			/* copy cif */
-	movl	8(%eax), %ecx			/* copy fun */
-	movl	%edx, closure_CF+28(%esp)
-	movl	%ecx, closure_CF+32(%esp)
-	movl	%eax, closure_CF+36(%esp)	/* closure is user_data */
-	jmp	L(do_closure_i386)
-L(UW8):
-	# cfi_endproc
-ENDF(C(ffi_go_closure_EAX))
-
-	.balign	16
-	.globl	C(ffi_go_closure_ECX)
-	FFI_HIDDEN(C(ffi_go_closure_ECX))
-C(ffi_go_closure_ECX):
-L(UW9):
-	# cfi_startproc
-	subl	$closure_FS, %esp
-L(UW10):
-	# cfi_def_cfa_offset(closure_FS + 4)
-	FFI_CLOSURE_SAVE_REGS
-	movl	4(%ecx), %edx			/* copy cif */
-	movl	8(%ecx), %eax			/* copy fun */
-	movl	%edx, closure_CF+28(%esp)
-	movl	%eax, closure_CF+32(%esp)
-	movl	%ecx, closure_CF+36(%esp)	/* closure is user_data */
-	jmp	L(do_closure_i386)
-L(UW11):
-	# cfi_endproc
-ENDF(C(ffi_go_closure_ECX))
-
-/* The closure entry points are reached from the ffi_closure trampoline.
-   On entry, %eax contains the address of the ffi_closure.  */
-
-	.balign	16
-	.globl	C(ffi_closure_i386)
-	FFI_HIDDEN(C(ffi_closure_i386))
-
-C(ffi_closure_i386):
-L(UW12):
-	# cfi_startproc
-	subl	$closure_FS, %esp
-L(UW13):
-	# cfi_def_cfa_offset(closure_FS + 4)
-
-	FFI_CLOSURE_SAVE_REGS
-	FFI_CLOSURE_COPY_TRAMP_DATA
-
-	/* Entry point from preceeding Go closures.  */
-L(do_closure_i386):
-
-	FFI_CLOSURE_PREP_CALL
-	FFI_CLOSURE_CALL_INNER(14)
-	FFI_CLOSURE_MASK_AND_JUMP(2, 15)
-
-	.balign	8
-L(load_table2):
-E(L(load_table2), X86_RET_FLOAT)
-	flds	closure_CF(%esp)
-	jmp	L(e2)
-E(L(load_table2), X86_RET_DOUBLE)
-	fldl	closure_CF(%esp)
-	jmp	L(e2)
-E(L(load_table2), X86_RET_LDOUBLE)
-	fldt	closure_CF(%esp)
-	jmp	L(e2)
-E(L(load_table2), X86_RET_SINT8)
-	movsbl	%al, %eax
-	jmp	L(e2)
-E(L(load_table2), X86_RET_SINT16)
-	movswl	%ax, %eax
-	jmp	L(e2)
-E(L(load_table2), X86_RET_UINT8)
-	movzbl	%al, %eax
-	jmp	L(e2)
-E(L(load_table2), X86_RET_UINT16)
-	movzwl	%ax, %eax
-	jmp	L(e2)
-E(L(load_table2), X86_RET_INT64)
-	movl	closure_CF+4(%esp), %edx
-	jmp	L(e2)
-E(L(load_table2), X86_RET_INT32)
-	nop
-	/* fallthru */
-E(L(load_table2), X86_RET_VOID)
-L(e2):
-	addl	$closure_FS, %esp
-L(UW16):
-	# cfi_adjust_cfa_offset(-closure_FS)
-	ret
-L(UW17):
-	# cfi_adjust_cfa_offset(closure_FS)
-E(L(load_table2), X86_RET_STRUCTPOP)
-	addl	$closure_FS, %esp
-L(UW18):
-	# cfi_adjust_cfa_offset(-closure_FS)
-	ret	$4
-L(UW19):
-	# cfi_adjust_cfa_offset(closure_FS)
-E(L(load_table2), X86_RET_STRUCTARG)
-	jmp	L(e2)
-E(L(load_table2), X86_RET_STRUCT_1B)
-	movzbl	%al, %eax
-	jmp	L(e2)
-E(L(load_table2), X86_RET_STRUCT_2B)
-	movzwl	%ax, %eax
-	jmp	L(e2)
-
-	/* Fill out the table so that bad values are predictable.  */
-E(L(load_table2), X86_RET_UNUSED14)
-	ud2
-E(L(load_table2), X86_RET_UNUSED15)
-	ud2
-
-L(UW20):
-	# cfi_endproc
-ENDF(C(ffi_closure_i386))
-
-	.balign	16
-	.globl	C(ffi_go_closure_STDCALL)
-	FFI_HIDDEN(C(ffi_go_closure_STDCALL))
-C(ffi_go_closure_STDCALL):
-L(UW21):
-	# cfi_startproc
-	subl	$closure_FS, %esp
-L(UW22):
-	# cfi_def_cfa_offset(closure_FS + 4)
-	FFI_CLOSURE_SAVE_REGS
-	movl	4(%ecx), %edx			/* copy cif */
-	movl	8(%ecx), %eax			/* copy fun */
-	movl	%edx, closure_CF+28(%esp)
-	movl	%eax, closure_CF+32(%esp)
-	movl	%ecx, closure_CF+36(%esp)	/* closure is user_data */
-	jmp	L(do_closure_STDCALL)
-L(UW23):
-	# cfi_endproc
-ENDF(C(ffi_go_closure_STDCALL))
-
-/* For REGISTER, we have no available parameter registers, and so we
-   enter here having pushed the closure onto the stack.  */
-
-	.balign	16
-	.globl	C(ffi_closure_REGISTER)
-	FFI_HIDDEN(C(ffi_closure_REGISTER))
-C(ffi_closure_REGISTER):
-L(UW24):
-	# cfi_startproc
-	# cfi_def_cfa(%esp, 8)
-	# cfi_offset(%eip, -8)
-	subl	$closure_FS-4, %esp
-L(UW25):
-	# cfi_def_cfa_offset(closure_FS + 4)
-	FFI_CLOSURE_SAVE_REGS
-	movl	closure_FS-4(%esp), %ecx	/* load retaddr */
-	movl	closure_FS(%esp), %eax		/* load closure */
-	movl	%ecx, closure_FS(%esp)		/* move retaddr */
-	jmp	L(do_closure_REGISTER)
-L(UW26):
-	# cfi_endproc
-ENDF(C(ffi_closure_REGISTER))
-
-/* For STDCALL (and others), we need to pop N bytes of arguments off
-   the stack following the closure.  The amount needing to be popped
-   is returned to us from ffi_closure_inner.  */
-
-	.balign	16
-	.globl	C(ffi_closure_STDCALL)
-	FFI_HIDDEN(C(ffi_closure_STDCALL))
-C(ffi_closure_STDCALL):
-L(UW27):
-	# cfi_startproc
-	subl	$closure_FS, %esp
-L(UW28):
-	# cfi_def_cfa_offset(closure_FS + 4)
-
-	FFI_CLOSURE_SAVE_REGS
-
-	/* Entry point from ffi_closure_REGISTER.  */
-L(do_closure_REGISTER):
-
-	FFI_CLOSURE_COPY_TRAMP_DATA
-
-	/* Entry point from preceeding Go closure.  */
-L(do_closure_STDCALL):
-
-	FFI_CLOSURE_PREP_CALL
-	FFI_CLOSURE_CALL_INNER(29)
-
-	movl	%eax, %ecx
-	shrl	$X86_RET_POP_SHIFT, %ecx	/* isolate pop count */
-	leal	closure_FS(%esp, %ecx), %ecx	/* compute popped esp */
-	movl	closure_FS(%esp), %edx		/* move return address */
-	movl	%edx, (%ecx)
-
-	/* From this point on, the value of %esp upon return is %ecx+4,
-	   and we've copied the return address to %ecx to make return easy.
-	   There's no point in representing this in the unwind info, as
-	   there is always a window between the mov and the ret which
-	   will be wrong from one point of view or another.  */
-
-	FFI_CLOSURE_MASK_AND_JUMP(3, 30)
-
-	.balign	8
-L(load_table3):
-E(L(load_table3), X86_RET_FLOAT)
-	flds    closure_CF(%esp)
-	movl    %ecx, %esp
-	ret
-E(L(load_table3), X86_RET_DOUBLE)
-	fldl    closure_CF(%esp)
-	movl    %ecx, %esp
-	ret
-E(L(load_table3), X86_RET_LDOUBLE)
-	fldt    closure_CF(%esp)
-	movl    %ecx, %esp
-	ret
-E(L(load_table3), X86_RET_SINT8)
-	movsbl  %al, %eax
-	movl    %ecx, %esp
-	ret
-E(L(load_table3), X86_RET_SINT16)
-	movswl  %ax, %eax
-	movl    %ecx, %esp
-	ret
-E(L(load_table3), X86_RET_UINT8)
-	movzbl  %al, %eax
-	movl    %ecx, %esp
-	ret
-E(L(load_table3), X86_RET_UINT16)
-	movzwl  %ax, %eax
-	movl    %ecx, %esp
-	ret
-E(L(load_table3), X86_RET_INT64)
-	movl	closure_CF+4(%esp), %edx
-	movl    %ecx, %esp
-	ret
-E(L(load_table3), X86_RET_INT32)
-	movl    %ecx, %esp
-	ret
-E(L(load_table3), X86_RET_VOID)
-	movl    %ecx, %esp
-	ret
-E(L(load_table3), X86_RET_STRUCTPOP)
-	movl    %ecx, %esp
-	ret
-E(L(load_table3), X86_RET_STRUCTARG)
-	movl	%ecx, %esp
-	ret
-E(L(load_table3), X86_RET_STRUCT_1B)
-	movzbl	%al, %eax
-	movl	%ecx, %esp
-	ret
-E(L(load_table3), X86_RET_STRUCT_2B)
-	movzwl	%ax, %eax
-	movl	%ecx, %esp
-	ret
-
-	/* Fill out the table so that bad values are predictable.  */
-E(L(load_table3), X86_RET_UNUSED14)
-	ud2
-E(L(load_table3), X86_RET_UNUSED15)
-	ud2
-
-L(UW31):
-	# cfi_endproc
-ENDF(C(ffi_closure_STDCALL))
-
-#if !FFI_NO_RAW_API
-
-#define raw_closure_S_FS	(16+16+12)
-
-	.balign	16
-	.globl	C(ffi_closure_raw_SYSV)
-	FFI_HIDDEN(C(ffi_closure_raw_SYSV))
-C(ffi_closure_raw_SYSV):
-L(UW32):
-	# cfi_startproc
-	subl	$raw_closure_S_FS, %esp
-L(UW33):
-	# cfi_def_cfa_offset(raw_closure_S_FS + 4)
-	movl	%ebx, raw_closure_S_FS-4(%esp)
-L(UW34):
-	# cfi_rel_offset(%ebx, raw_closure_S_FS-4)
-
-	movl	FFI_TRAMPOLINE_SIZE+8(%eax), %edx	/* load cl->user_data */
-	movl	%edx, 12(%esp)
-	leal	raw_closure_S_FS+4(%esp), %edx		/* load raw_args */
-	movl	%edx, 8(%esp)
-	leal	16(%esp), %edx				/* load &res */
-	movl	%edx, 4(%esp)
-	movl	FFI_TRAMPOLINE_SIZE(%eax), %ebx		/* load cl->cif */
-	movl	%ebx, (%esp)
-	call	*FFI_TRAMPOLINE_SIZE+4(%eax)		/* call cl->fun */
-
-	movl	20(%ebx), %eax				/* load cif->flags */
-	andl	$X86_RET_TYPE_MASK, %eax
-#ifdef __PIC__
-	call	C(__x86.get_pc_thunk.bx)
-L(pc4):
-	leal	L(load_table4)-L(pc4)(%ebx, %eax, 8), %ecx
-#else
-	leal	L(load_table4)(,%eax, 8), %ecx
-#endif
-	movl	raw_closure_S_FS-4(%esp), %ebx
-L(UW35):
-	# cfi_restore(%ebx)
-	movl	16(%esp), %eax				/* Optimistic load */
-	jmp	*%ecx
-
-	.balign	8
-L(load_table4):
-E(L(load_table4), X86_RET_FLOAT)
-	flds	16(%esp)
-	jmp	L(e4)
-E(L(load_table4), X86_RET_DOUBLE)
-	fldl	16(%esp)
-	jmp	L(e4)
-E(L(load_table4), X86_RET_LDOUBLE)
-	fldt	16(%esp)
-	jmp	L(e4)
-E(L(load_table4), X86_RET_SINT8)
-	movsbl	%al, %eax
-	jmp	L(e4)
-E(L(load_table4), X86_RET_SINT16)
-	movswl	%ax, %eax
-	jmp	L(e4)
-E(L(load_table4), X86_RET_UINT8)
-	movzbl	%al, %eax
-	jmp	L(e4)
-E(L(load_table4), X86_RET_UINT16)
-	movzwl	%ax, %eax
-	jmp	L(e4)
-E(L(load_table4), X86_RET_INT64)
-	movl	16+4(%esp), %edx
-	jmp	L(e4)
-E(L(load_table4), X86_RET_INT32)
-	nop
-	/* fallthru */
-E(L(load_table4), X86_RET_VOID)
-L(e4):
-	addl	$raw_closure_S_FS, %esp
-L(UW36):
-	# cfi_adjust_cfa_offset(-raw_closure_S_FS)
-	ret
-L(UW37):
-	# cfi_adjust_cfa_offset(raw_closure_S_FS)
-E(L(load_table4), X86_RET_STRUCTPOP)
-	addl	$raw_closure_S_FS, %esp
-L(UW38):
-	# cfi_adjust_cfa_offset(-raw_closure_S_FS)
-	ret	$4
-L(UW39):
-	# cfi_adjust_cfa_offset(raw_closure_S_FS)
-E(L(load_table4), X86_RET_STRUCTARG)
-	jmp	L(e4)
-E(L(load_table4), X86_RET_STRUCT_1B)
-	movzbl	%al, %eax
-	jmp	L(e4)
-E(L(load_table4), X86_RET_STRUCT_2B)
-	movzwl	%ax, %eax
-	jmp	L(e4)
-
-	/* Fill out the table so that bad values are predictable.  */
-E(L(load_table4), X86_RET_UNUSED14)
-	ud2
-E(L(load_table4), X86_RET_UNUSED15)
-	ud2
-
-L(UW40):
-	# cfi_endproc
-ENDF(C(ffi_closure_raw_SYSV))
-
-#define raw_closure_T_FS	(16+16+8)
-
-	.balign	16
-	.globl	C(ffi_closure_raw_THISCALL)
-	FFI_HIDDEN(C(ffi_closure_raw_THISCALL))
-C(ffi_closure_raw_THISCALL):
-L(UW41):
-	# cfi_startproc
-	/* Rearrange the stack such that %ecx is the first argument.
-	   This means moving the return address.  */
-	popl	%edx
-L(UW42):
-	# cfi_def_cfa_offset(0)
-	# cfi_register(%eip, %edx)
-	pushl	%ecx
-L(UW43):
-	# cfi_adjust_cfa_offset(4)
-	pushl	%edx
-L(UW44):
-	# cfi_adjust_cfa_offset(4)
-	# cfi_rel_offset(%eip, 0)
-	subl	$raw_closure_T_FS, %esp
-L(UW45):
-	# cfi_adjust_cfa_offset(raw_closure_T_FS)
-	movl	%ebx, raw_closure_T_FS-4(%esp)
-L(UW46):
-	# cfi_rel_offset(%ebx, raw_closure_T_FS-4)
-
-	movl	FFI_TRAMPOLINE_SIZE+8(%eax), %edx	/* load cl->user_data */
-	movl	%edx, 12(%esp)
-	leal	raw_closure_T_FS+4(%esp), %edx		/* load raw_args */
-	movl	%edx, 8(%esp)
-	leal	16(%esp), %edx				/* load &res */
-	movl	%edx, 4(%esp)
-	movl	FFI_TRAMPOLINE_SIZE(%eax), %ebx		/* load cl->cif */
-	movl	%ebx, (%esp)
-	call	*FFI_TRAMPOLINE_SIZE+4(%eax)		/* call cl->fun */
-
-	movl	20(%ebx), %eax				/* load cif->flags */
-	andl	$X86_RET_TYPE_MASK, %eax
-#ifdef __PIC__
-	call	C(__x86.get_pc_thunk.bx)
-L(pc5):
-	leal	L(load_table5)-L(pc5)(%ebx, %eax, 8), %ecx
-#else
-	leal	L(load_table5)(,%eax, 8), %ecx
-#endif
-	movl	raw_closure_T_FS-4(%esp), %ebx
-L(UW47):
-	# cfi_restore(%ebx)
-	movl	16(%esp), %eax				/* Optimistic load */
-	jmp	*%ecx
-
-	.balign	8
-L(load_table5):
-E(L(load_table5), X86_RET_FLOAT)
-	flds	16(%esp)
-	jmp	L(e5)
-E(L(load_table5), X86_RET_DOUBLE)
-	fldl	16(%esp)
-	jmp	L(e5)
-E(L(load_table5), X86_RET_LDOUBLE)
-	fldt	16(%esp)
-	jmp	L(e5)
-E(L(load_table5), X86_RET_SINT8)
-	movsbl	%al, %eax
-	jmp	L(e5)
-E(L(load_table5), X86_RET_SINT16)
-	movswl	%ax, %eax
-	jmp	L(e5)
-E(L(load_table5), X86_RET_UINT8)
-	movzbl	%al, %eax
-	jmp	L(e5)
-E(L(load_table5), X86_RET_UINT16)
-	movzwl	%ax, %eax
-	jmp	L(e5)
-E(L(load_table5), X86_RET_INT64)
-	movl	16+4(%esp), %edx
-	jmp	L(e5)
-E(L(load_table5), X86_RET_INT32)
-	nop
-	/* fallthru */
-E(L(load_table5), X86_RET_VOID)
-L(e5):
-	addl	$raw_closure_T_FS, %esp
-L(UW48):
-	# cfi_adjust_cfa_offset(-raw_closure_T_FS)
-	/* Remove the extra %ecx argument we pushed.  */
-	ret	$4
-L(UW49):
-	# cfi_adjust_cfa_offset(raw_closure_T_FS)
-E(L(load_table5), X86_RET_STRUCTPOP)
-	addl	$raw_closure_T_FS, %esp
-L(UW50):
-	# cfi_adjust_cfa_offset(-raw_closure_T_FS)
-	ret	$8
-L(UW51):
-	# cfi_adjust_cfa_offset(raw_closure_T_FS)
-E(L(load_table5), X86_RET_STRUCTARG)
-	jmp	L(e5)
-E(L(load_table5), X86_RET_STRUCT_1B)
-	movzbl	%al, %eax
-	jmp	L(e5)
-E(L(load_table5), X86_RET_STRUCT_2B)
-	movzwl	%ax, %eax
-	jmp	L(e5)
-
-	/* Fill out the table so that bad values are predictable.  */
-E(L(load_table5), X86_RET_UNUSED14)
-	ud2
-E(L(load_table5), X86_RET_UNUSED15)
-	ud2
-
-L(UW52):
-	# cfi_endproc
-ENDF(C(ffi_closure_raw_THISCALL))
-
-#endif /* !FFI_NO_RAW_API */
-
-#ifdef X86_DARWIN
-# define COMDAT(X)							\
-        .section __TEXT,__textcoal_nt,coalesced,pure_instructions;	\
-        .weak_definition X;						\
-        .private_extern X
-#elif defined __ELF__
-# define COMDAT(X)							\
-	.section .text.X,"axG",@progbits,X,comdat;			\
-	.globl	X;							\
-	FFI_HIDDEN(X)
-#else
-# define COMDAT(X)
-#endif
-
-#if defined(__PIC__)
-	COMDAT(C(__x86.get_pc_thunk.bx))
-C(__x86.get_pc_thunk.bx):
-	movl	(%esp), %ebx
-	ret
-ENDF(C(__x86.get_pc_thunk.bx))
-# if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
-	COMDAT(C(__x86.get_pc_thunk.dx))
-C(__x86.get_pc_thunk.dx):
-	movl	(%esp), %edx
-	ret
-ENDF(C(__x86.get_pc_thunk.dx))
-#endif /* DARWIN || HIDDEN */
-#endif /* __PIC__ */
-
-/* Sadly, OSX cctools-as doesn't understand .cfi directives at all.  */
-
-#ifdef __APPLE__
-.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
-EHFrame0:
-#elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE)
-.section .eh_frame,"a",@unwind
-#else
-.section .eh_frame,"a",@progbits
-#endif
-
-#ifdef HAVE_AS_X86_PCREL
-# define PCREL(X)	X - .
-#else
-# define PCREL(X)	X@rel
-#endif
-
-/* Simplify advancing between labels.  Assume DW_CFA_advance_loc1 fits.  */
-#define ADV(N, P)	.byte 2, L(N)-L(P)
-
-	.balign 4
-L(CIE):
-	.set	L(set0),L(ECIE)-L(SCIE)
-	.long	L(set0)			/* CIE Length */
-L(SCIE):
-	.long	0			/* CIE Identifier Tag */
-	.byte	1			/* CIE Version */
-	.ascii	"zR\0"			/* CIE Augmentation */
-	.byte	1			/* CIE Code Alignment Factor */
-	.byte	0x7c			/* CIE Data Alignment Factor */
-	.byte	0x8			/* CIE RA Column */
-	.byte	1			/* Augmentation size */
-	.byte	0x1b			/* FDE Encoding (pcrel sdata4) */
-	.byte	0xc, 4, 4		/* DW_CFA_def_cfa, %esp offset 4 */
-	.byte	0x80+8, 1		/* DW_CFA_offset, %eip offset 1*-4 */
-	.balign 4
-L(ECIE):
-
-	.set	L(set1),L(EFDE1)-L(SFDE1)
-	.long	L(set1)			/* FDE Length */
-L(SFDE1):
-	.long	L(SFDE1)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW0))		/* Initial location */
-	.long	L(UW5)-L(UW0)		/* Address range */
-	.byte	0			/* Augmentation size */
-	ADV(UW1, UW0)
-	.byte	0xc, 5, 8		/* DW_CFA_def_cfa, %ebp 8 */
-	.byte	0x80+5, 2		/* DW_CFA_offset, %ebp 2*-4 */
-	ADV(UW2, UW1)
-	.byte	0x80+3, 0		/* DW_CFA_offset, %ebx 0*-4 */
-	ADV(UW3, UW2)
-	.byte	0xa			/* DW_CFA_remember_state */
-	.byte	0xc, 4, 4		/* DW_CFA_def_cfa, %esp 4 */
-	.byte	0xc0+3			/* DW_CFA_restore, %ebx */
-	.byte	0xc0+5			/* DW_CFA_restore, %ebp */
-	ADV(UW4, UW3)
-	.byte	0xb			/* DW_CFA_restore_state */
-	.balign	4
-L(EFDE1):
-
-	.set	L(set2),L(EFDE2)-L(SFDE2)
-	.long	L(set2)			/* FDE Length */
-L(SFDE2):
-	.long	L(SFDE2)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW6))		/* Initial location */
-	.long	L(UW8)-L(UW6)		/* Address range */
-	.byte	0			/* Augmentation size */
-	ADV(UW7, UW6)
-	.byte	0xe, closure_FS+4	/* DW_CFA_def_cfa_offset */
-	.balign	4
-L(EFDE2):
-
-	.set	L(set3),L(EFDE3)-L(SFDE3)
-	.long	L(set3)			/* FDE Length */
-L(SFDE3):
-	.long	L(SFDE3)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW9))		/* Initial location */
-	.long	L(UW11)-L(UW9)		/* Address range */
-	.byte	0			/* Augmentation size */
-	ADV(UW10, UW9)
-	.byte	0xe, closure_FS+4	/* DW_CFA_def_cfa_offset */
-	.balign	4
-L(EFDE3):
-
-	.set	L(set4),L(EFDE4)-L(SFDE4)
-	.long	L(set4)			/* FDE Length */
-L(SFDE4):
-	.long	L(SFDE4)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW12))		/* Initial location */
-	.long	L(UW20)-L(UW12)		/* Address range */
-	.byte	0			/* Augmentation size */
-	ADV(UW13, UW12)
-	.byte	0xe, closure_FS+4	/* DW_CFA_def_cfa_offset */
-#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX
-	ADV(UW14, UW13)
-	.byte	0x80+3, (40-(closure_FS+4))/-4  /* DW_CFA_offset %ebx */
-	ADV(UW15, UW14)
-	.byte	0xc0+3			/* DW_CFA_restore %ebx */
-	ADV(UW16, UW15)
-#else
-	ADV(UW16, UW13)
-#endif
-	.byte	0xe, 4			/* DW_CFA_def_cfa_offset */
-	ADV(UW17, UW16)
-	.byte	0xe, closure_FS+4	/* DW_CFA_def_cfa_offset */
-	ADV(UW18, UW17)
-	.byte	0xe, 4			/* DW_CFA_def_cfa_offset */
-	ADV(UW19, UW18)
-	.byte	0xe, closure_FS+4	/* DW_CFA_def_cfa_offset */
-	.balign	4
-L(EFDE4):
-
-	.set	L(set5),L(EFDE5)-L(SFDE5)
-	.long	L(set5)			/* FDE Length */
-L(SFDE5):
-	.long	L(SFDE5)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW21))		/* Initial location */
-	.long	L(UW23)-L(UW21)		/* Address range */
-	.byte	0			/* Augmentation size */
-	ADV(UW22, UW21)
-	.byte	0xe, closure_FS+4	/* DW_CFA_def_cfa_offset */
-	.balign	4
-L(EFDE5):
-
-	.set	L(set6),L(EFDE6)-L(SFDE6)
-	.long	L(set6)			/* FDE Length */
-L(SFDE6):
-	.long	L(SFDE6)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW24))		/* Initial location */
-	.long	L(UW26)-L(UW24)		/* Address range */
-	.byte	0			/* Augmentation size */
-	.byte	0xe, 8			/* DW_CFA_def_cfa_offset */
-	.byte	0x80+8, 2		/* DW_CFA_offset %eip, 2*-4 */
-	ADV(UW25, UW24)
-	.byte	0xe, closure_FS+4	/* DW_CFA_def_cfa_offset */
-	.balign	4
-L(EFDE6):
-
-	.set	L(set7),L(EFDE7)-L(SFDE7)
-	.long	L(set7)			/* FDE Length */
-L(SFDE7):
-	.long	L(SFDE7)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW27))		/* Initial location */
-	.long	L(UW31)-L(UW27)		/* Address range */
-	.byte	0			/* Augmentation size */
-	ADV(UW28, UW27)
-	.byte	0xe, closure_FS+4	/* DW_CFA_def_cfa_offset */
-#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX
-	ADV(UW29, UW28)
-	.byte	0x80+3, (40-(closure_FS+4))/-4  /* DW_CFA_offset %ebx */
-	ADV(UW30, UW29)
-	.byte	0xc0+3			/* DW_CFA_restore %ebx */
-#endif
-	.balign	4
-L(EFDE7):
-
-#if !FFI_NO_RAW_API
-	.set	L(set8),L(EFDE8)-L(SFDE8)
-	.long	L(set8)			/* FDE Length */
-L(SFDE8):
-	.long	L(SFDE8)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW32))		/* Initial location */
-	.long	L(UW40)-L(UW32)		/* Address range */
-	.byte	0			/* Augmentation size */
-	ADV(UW33, UW32)
-	.byte	0xe, raw_closure_S_FS+4	/* DW_CFA_def_cfa_offset */
-	ADV(UW34, UW33)
-	.byte	0x80+3, 2		/* DW_CFA_offset %ebx 2*-4 */
-	ADV(UW35, UW34)
-	.byte	0xc0+3			/* DW_CFA_restore %ebx */
-	ADV(UW36, UW35)
-	.byte	0xe, 4			/* DW_CFA_def_cfa_offset */
-	ADV(UW37, UW36)
-	.byte	0xe, raw_closure_S_FS+4	/* DW_CFA_def_cfa_offset */
-	ADV(UW38, UW37)
-	.byte	0xe, 4			/* DW_CFA_def_cfa_offset */
-	ADV(UW39, UW38)
-	.byte	0xe, raw_closure_S_FS+4	/* DW_CFA_def_cfa_offset */
-	.balign	4
-L(EFDE8):
-
-	.set	L(set9),L(EFDE9)-L(SFDE9)
-	.long	L(set9)			/* FDE Length */
-L(SFDE9):
-	.long	L(SFDE9)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW41))		/* Initial location */
-	.long	L(UW52)-L(UW41)		/* Address range */
-	.byte	0			/* Augmentation size */
-	ADV(UW42, UW41)
-	.byte	0xe, 0			/* DW_CFA_def_cfa_offset */
-	.byte	0x9, 8, 2		/* DW_CFA_register %eip, %edx */
-	ADV(UW43, UW42)
-	.byte	0xe, 4			/* DW_CFA_def_cfa_offset */
-	ADV(UW44, UW43)
-	.byte	0xe, 8			/* DW_CFA_def_cfa_offset */
-	.byte	0x80+8, 2		/* DW_CFA_offset %eip 2*-4 */
-	ADV(UW45, UW44)
-	.byte	0xe, raw_closure_T_FS+8	/* DW_CFA_def_cfa_offset */
-	ADV(UW46, UW45)
-	.byte	0x80+3, 3		/* DW_CFA_offset %ebx 3*-4 */
-	ADV(UW47, UW46)
-	.byte	0xc0+3			/* DW_CFA_restore %ebx */
-	ADV(UW48, UW47)
-	.byte	0xe, 8			/* DW_CFA_def_cfa_offset */
-	ADV(UW49, UW48)
-	.byte	0xe, raw_closure_T_FS+8	/* DW_CFA_def_cfa_offset */
-	ADV(UW50, UW49)
-	.byte	0xe, 8			/* DW_CFA_def_cfa_offset */
-	ADV(UW51, UW50)
-	.byte	0xe, raw_closure_T_FS+8	/* DW_CFA_def_cfa_offset */
-	.balign	4
-L(EFDE9):
-#endif /* !FFI_NO_RAW_API */
-
-#endif /* ifndef __x86_64__ */
-
-#if defined __ELF__ && defined __linux__
-	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/third_party/gofrontend/libffi/src/x86/unix64.S b/third_party/gofrontend/libffi/src/x86/unix64.S
deleted file mode 100644
index f9f9163..0000000
--- a/third_party/gofrontend/libffi/src/x86/unix64.S
+++ /dev/null
@@ -1,546 +0,0 @@
-/* -----------------------------------------------------------------------
-   unix64.S - Copyright (c) 2013  The Written Word, Inc.
-	    - Copyright (c) 2008  Red Hat, Inc
-	    - Copyright (c) 2002  Bo Thorsen <bo@suse.de>
-
-   x86-64 Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#ifdef __x86_64__
-#define LIBFFI_ASM	
-#include <fficonfig.h>
-#include <ffi.h>
-#include "internal64.h"
-
-	.text
-
-#define C2(X, Y)  X ## Y
-#define C1(X, Y)  C2(X, Y)
-#ifdef __USER_LABEL_PREFIX__
-# define C(X)     C1(__USER_LABEL_PREFIX__, X)
-#else
-# define C(X)     X
-#endif
-
-#ifdef __APPLE__
-# define L(X)     C1(L, X)
-#else
-# define L(X)     C1(.L, X)
-#endif
-
-#ifdef __ELF__
-# define PLT(X)	  X@PLT
-# define ENDF(X)  .type	X,@function; .size X, . - X
-#else
-# define PLT(X)	  X
-# define ENDF(X)
-#endif
-
-/* This macro allows the safe creation of jump tables without an
-   actual table.  The entry points into the table are all 8 bytes.
-   The use of ORG asserts that we're at the correct location.  */
-/* ??? The clang assembler doesn't handle .org with symbolic expressions.  */
-#if defined(__clang__) || defined(__APPLE__)
-# define E(BASE, X)	.balign 8
-#else
-# define E(BASE, X)	.balign 8; .org BASE + X * 8
-#endif
-
-/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
-	            void *raddr, void (*fnaddr)(void));
-
-   Bit o trickiness here -- ARGS+BYTES is the base of the stack frame
-   for this function.  This has been allocated by ffi_call.  We also
-   deallocate some of the stack that has been alloca'd.  */
-
-	.balign	8
-	.globl	C(ffi_call_unix64)
-	FFI_HIDDEN(C(ffi_call_unix64))
-
-C(ffi_call_unix64):
-L(UW0):
-	movq	(%rsp), %r10		/* Load return address.  */
-	leaq	(%rdi, %rsi), %rax	/* Find local stack base.  */
-	movq	%rdx, (%rax)		/* Save flags.  */
-	movq	%rcx, 8(%rax)		/* Save raddr.  */
-	movq	%rbp, 16(%rax)		/* Save old frame pointer.  */
-	movq	%r10, 24(%rax)		/* Relocate return address.  */
-	movq	%rax, %rbp		/* Finalize local stack frame.  */
-
-	/* New stack frame based off rbp.  This is a itty bit of unwind
-	   trickery in that the CFA *has* changed.  There is no easy way
-	   to describe it correctly on entry to the function.  Fortunately,
-	   it doesn't matter too much since at all points we can correctly
-	   unwind back to ffi_call.  Note that the location to which we
-	   moved the return address is (the new) CFA-8, so from the
-	   perspective of the unwind info, it hasn't moved.  */
-L(UW1):
-	/* cfi_def_cfa(%rbp, 32) */
-	/* cfi_rel_offset(%rbp, 16) */
-
-	movq	%rdi, %r10		/* Save a copy of the register area. */
-	movq	%r8, %r11		/* Save a copy of the target fn.  */
-	movl	%r9d, %eax		/* Set number of SSE registers.  */
-
-	/* Load up all argument registers.  */
-	movq	(%r10), %rdi
-	movq	0x08(%r10), %rsi
-	movq	0x10(%r10), %rdx
-	movq	0x18(%r10), %rcx
-	movq	0x20(%r10), %r8
-	movq	0x28(%r10), %r9
-	movl	0xb0(%r10), %eax
-	testl	%eax, %eax
-	jnz	L(load_sse)
-L(ret_from_load_sse):
-
-	/* Deallocate the reg arg area, except for r10, then load via pop.  */
-	leaq	0xb8(%r10), %rsp
-	popq	%r10
-
-	/* Call the user function.  */
-	call	*%r11
-
-	/* Deallocate stack arg area; local stack frame in redzone.  */
-	leaq	24(%rbp), %rsp
-
-	movq	0(%rbp), %rcx		/* Reload flags.  */
-	movq	8(%rbp), %rdi		/* Reload raddr.  */
-	movq	16(%rbp), %rbp		/* Reload old frame pointer.  */
-L(UW2):
-	/* cfi_remember_state */
-	/* cfi_def_cfa(%rsp, 8) */
-	/* cfi_restore(%rbp) */
-
-	/* The first byte of the flags contains the FFI_TYPE.  */
-	cmpb	$UNIX64_RET_LAST, %cl
-	movzbl	%cl, %r10d
-	leaq	L(store_table)(%rip), %r11
-	ja	L(sa)
-	leaq	(%r11, %r10, 8), %r10
-
-	/* Prep for the structure cases: scratch area in redzone.  */
-	leaq	-20(%rsp), %rsi
-	jmp	*%r10
-
-	.balign	8
-L(store_table):
-E(L(store_table), UNIX64_RET_VOID)
-	ret
-E(L(store_table), UNIX64_RET_UINT8)
-	movzbl	%al, %eax
-	movq	%rax, (%rdi)
-	ret
-E(L(store_table), UNIX64_RET_UINT16)
-	movzwl	%ax, %eax
-	movq	%rax, (%rdi)
-	ret
-E(L(store_table), UNIX64_RET_UINT32)
-	movl	%eax, %eax
-	movq	%rax, (%rdi)
-	ret
-E(L(store_table), UNIX64_RET_SINT8)
-	movsbq	%al, %rax
-	movq	%rax, (%rdi)
-	ret
-E(L(store_table), UNIX64_RET_SINT16)
-	movswq	%ax, %rax
-	movq	%rax, (%rdi)
-	ret
-E(L(store_table), UNIX64_RET_SINT32)
-	cltq
-	movq	%rax, (%rdi)
-	ret
-E(L(store_table), UNIX64_RET_INT64)
-	movq	%rax, (%rdi)
-	ret
-E(L(store_table), UNIX64_RET_XMM32)
-	movd	%xmm0, (%rdi)
-	ret
-E(L(store_table), UNIX64_RET_XMM64)
-	movq	%xmm0, (%rdi)
-	ret
-E(L(store_table), UNIX64_RET_X87)
-	fstpt	(%rdi)
-	ret
-E(L(store_table), UNIX64_RET_X87_2)
-	fstpt	(%rdi)
-	fstpt	16(%rdi)
-	ret
-E(L(store_table), UNIX64_RET_ST_XMM0_RAX)
-	movq	%rax, 8(%rsi)
-	jmp	L(s3)
-E(L(store_table), UNIX64_RET_ST_RAX_XMM0)
-	movq	%xmm0, 8(%rsi)
-	jmp	L(s2)
-E(L(store_table), UNIX64_RET_ST_XMM0_XMM1)
-	movq	%xmm1, 8(%rsi)
-	jmp	L(s3)
-E(L(store_table), UNIX64_RET_ST_RAX_RDX)
-	movq	%rdx, 8(%rsi)
-L(s2):
-	movq	%rax, (%rsi)
-	shrl	$UNIX64_SIZE_SHIFT, %ecx
-	rep movsb
-	ret
-	.balign 8
-L(s3):
-	movq	%xmm0, (%rsi)
-	shrl	$UNIX64_SIZE_SHIFT, %ecx
-	rep movsb
-	ret
-
-L(sa):	call	PLT(C(abort))
-
-	/* Many times we can avoid loading any SSE registers at all.
-	   It's not worth an indirect jump to load the exact set of
-	   SSE registers needed; zero or all is a good compromise.  */
-	.balign 2
-L(UW3):
-	/* cfi_restore_state */
-L(load_sse):
-	movdqa	0x30(%r10), %xmm0
-	movdqa	0x40(%r10), %xmm1
-	movdqa	0x50(%r10), %xmm2
-	movdqa	0x60(%r10), %xmm3
-	movdqa	0x70(%r10), %xmm4
-	movdqa	0x80(%r10), %xmm5
-	movdqa	0x90(%r10), %xmm6
-	movdqa	0xa0(%r10), %xmm7
-	jmp	L(ret_from_load_sse)
-
-L(UW4):
-ENDF(C(ffi_call_unix64))
-
-/* 6 general registers, 8 vector registers,
-   32 bytes of rvalue, 8 bytes of alignment.  */
-#define ffi_closure_OFS_G	0
-#define ffi_closure_OFS_V	(6*8)
-#define ffi_closure_OFS_RVALUE	(ffi_closure_OFS_V + 8*16)
-#define ffi_closure_FS		(ffi_closure_OFS_RVALUE + 32 + 8)
-
-/* The location of rvalue within the red zone after deallocating the frame.  */
-#define ffi_closure_RED_RVALUE	(ffi_closure_OFS_RVALUE - ffi_closure_FS)
-
-	.balign	2
-	.globl	C(ffi_closure_unix64_sse)
-	FFI_HIDDEN(C(ffi_closure_unix64_sse))
-
-C(ffi_closure_unix64_sse):
-L(UW5):
-	subq	$ffi_closure_FS, %rsp
-L(UW6):
-	/* cfi_adjust_cfa_offset(ffi_closure_FS) */
-
-	movdqa	%xmm0, ffi_closure_OFS_V+0x00(%rsp)
-	movdqa	%xmm1, ffi_closure_OFS_V+0x10(%rsp)
-	movdqa	%xmm2, ffi_closure_OFS_V+0x20(%rsp)
-	movdqa	%xmm3, ffi_closure_OFS_V+0x30(%rsp)
-	movdqa	%xmm4, ffi_closure_OFS_V+0x40(%rsp)
-	movdqa	%xmm5, ffi_closure_OFS_V+0x50(%rsp)
-	movdqa	%xmm6, ffi_closure_OFS_V+0x60(%rsp)
-	movdqa	%xmm7, ffi_closure_OFS_V+0x70(%rsp)
-	jmp	L(sse_entry1)
-
-L(UW7):
-ENDF(C(ffi_closure_unix64_sse))
-
-	.balign	2
-	.globl	C(ffi_closure_unix64)
-	FFI_HIDDEN(C(ffi_closure_unix64))
-
-C(ffi_closure_unix64):
-L(UW8):
-	subq	$ffi_closure_FS, %rsp
-L(UW9):
-	/* cfi_adjust_cfa_offset(ffi_closure_FS) */
-L(sse_entry1):
-	movq	%rdi, ffi_closure_OFS_G+0x00(%rsp)
-	movq    %rsi, ffi_closure_OFS_G+0x08(%rsp)
-	movq    %rdx, ffi_closure_OFS_G+0x10(%rsp)
-	movq    %rcx, ffi_closure_OFS_G+0x18(%rsp)
-	movq    %r8,  ffi_closure_OFS_G+0x20(%rsp)
-	movq    %r9,  ffi_closure_OFS_G+0x28(%rsp)
-
-#ifdef __ILP32__
-	movl	FFI_TRAMPOLINE_SIZE(%r10), %edi		/* Load cif */
-	movl	FFI_TRAMPOLINE_SIZE+4(%r10), %esi	/* Load fun */
-	movl	FFI_TRAMPOLINE_SIZE+8(%r10), %edx	/* Load user_data */
-#else
-	movq	FFI_TRAMPOLINE_SIZE(%r10), %rdi		/* Load cif */
-	movq	FFI_TRAMPOLINE_SIZE+8(%r10), %rsi	/* Load fun */
-	movq	FFI_TRAMPOLINE_SIZE+16(%r10), %rdx	/* Load user_data */
-#endif
-L(do_closure):
-	leaq	ffi_closure_OFS_RVALUE(%rsp), %rcx	/* Load rvalue */
-	movq	%rsp, %r8				/* Load reg_args */
-	leaq	ffi_closure_FS+8(%rsp), %r9		/* Load argp */
-	call	C(ffi_closure_unix64_inner)
-
-	/* Deallocate stack frame early; return value is now in redzone.  */
-	addq	$ffi_closure_FS, %rsp
-L(UW10):
-	/* cfi_adjust_cfa_offset(-ffi_closure_FS) */
-
-	/* The first byte of the return value contains the FFI_TYPE.  */
-	cmpb	$UNIX64_RET_LAST, %al
-	movzbl	%al, %r10d
-	leaq	L(load_table)(%rip), %r11
-	ja	L(la)
-	leaq	(%r11, %r10, 8), %r10
-	leaq	ffi_closure_RED_RVALUE(%rsp), %rsi
-	jmp	*%r10
-
-	.balign	8
-L(load_table):
-E(L(load_table), UNIX64_RET_VOID)
-	ret
-E(L(load_table), UNIX64_RET_UINT8)
-	movzbl	(%rsi), %eax
-	ret
-E(L(load_table), UNIX64_RET_UINT16)
-	movzwl	(%rsi), %eax
-	ret
-E(L(load_table), UNIX64_RET_UINT32)
-	movl	(%rsi), %eax
-	ret
-E(L(load_table), UNIX64_RET_SINT8)
-	movsbl	(%rsi), %eax
-	ret
-E(L(load_table), UNIX64_RET_SINT16)
-	movswl	(%rsi), %eax
-	ret
-E(L(load_table), UNIX64_RET_SINT32)
-	movl	(%rsi), %eax
-	ret
-E(L(load_table), UNIX64_RET_INT64)
-	movq	(%rsi), %rax
-	ret
-E(L(load_table), UNIX64_RET_XMM32)
-	movd	(%rsi), %xmm0
-	ret
-E(L(load_table), UNIX64_RET_XMM64)
-	movq	(%rsi), %xmm0
-	ret
-E(L(load_table), UNIX64_RET_X87)
-	fldt	(%rsi)
-	ret
-E(L(load_table), UNIX64_RET_X87_2)
-	fldt	16(%rsi)
-	fldt	(%rsi)
-	ret
-E(L(load_table), UNIX64_RET_ST_XMM0_RAX)
-	movq	8(%rsi), %rax
-	jmp	L(l3)
-E(L(load_table), UNIX64_RET_ST_RAX_XMM0)
-	movq	8(%rsi), %xmm0
-	jmp	L(l2)
-E(L(load_table), UNIX64_RET_ST_XMM0_XMM1)
-	movq	8(%rsi), %xmm1
-	jmp	L(l3)
-E(L(load_table), UNIX64_RET_ST_RAX_RDX)
-	movq	8(%rsi), %rdx
-L(l2):
-	movq	(%rsi), %rax
-	ret
-	.balign	8
-L(l3):
-	movq	(%rsi), %xmm0
-	ret
-
-L(la):	call	PLT(C(abort))
-
-L(UW11):
-ENDF(C(ffi_closure_unix64))
-
-	.balign	2
-	.globl	C(ffi_go_closure_unix64_sse)
-	FFI_HIDDEN(C(ffi_go_closure_unix64_sse))
-
-C(ffi_go_closure_unix64_sse):
-L(UW12):
-	subq	$ffi_closure_FS, %rsp
-L(UW13):
-	/* cfi_adjust_cfa_offset(ffi_closure_FS) */
-
-	movdqa	%xmm0, ffi_closure_OFS_V+0x00(%rsp)
-	movdqa	%xmm1, ffi_closure_OFS_V+0x10(%rsp)
-	movdqa	%xmm2, ffi_closure_OFS_V+0x20(%rsp)
-	movdqa	%xmm3, ffi_closure_OFS_V+0x30(%rsp)
-	movdqa	%xmm4, ffi_closure_OFS_V+0x40(%rsp)
-	movdqa	%xmm5, ffi_closure_OFS_V+0x50(%rsp)
-	movdqa	%xmm6, ffi_closure_OFS_V+0x60(%rsp)
-	movdqa	%xmm7, ffi_closure_OFS_V+0x70(%rsp)
-	jmp	L(sse_entry2)
-
-L(UW14):
-ENDF(C(ffi_go_closure_unix64_sse))
-
-	.balign	2
-	.globl	C(ffi_go_closure_unix64)
-	FFI_HIDDEN(C(ffi_go_closure_unix64))
-
-C(ffi_go_closure_unix64):
-L(UW15):
-	subq	$ffi_closure_FS, %rsp
-L(UW16):
-	/* cfi_adjust_cfa_offset(ffi_closure_FS) */
-L(sse_entry2):
-	movq	%rdi, ffi_closure_OFS_G+0x00(%rsp)
-	movq    %rsi, ffi_closure_OFS_G+0x08(%rsp)
-	movq    %rdx, ffi_closure_OFS_G+0x10(%rsp)
-	movq    %rcx, ffi_closure_OFS_G+0x18(%rsp)
-	movq    %r8,  ffi_closure_OFS_G+0x20(%rsp)
-	movq    %r9,  ffi_closure_OFS_G+0x28(%rsp)
-
-#ifdef __ILP32__
-	movl	4(%r10), %edi		/* Load cif */
-	movl	8(%r10), %esi		/* Load fun */
-	movl	%r10d, %edx		/* Load closure (user_data) */
-#else
-	movq	8(%r10), %rdi		/* Load cif */
-	movq	16(%r10), %rsi		/* Load fun */
-	movq	%r10, %rdx		/* Load closure (user_data) */
-#endif
-	jmp	L(do_closure)
-
-L(UW17):
-ENDF(C(ffi_go_closure_unix64))
-
-/* Sadly, OSX cctools-as doesn't understand .cfi directives at all.  */
-
-#ifdef __APPLE__
-.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
-EHFrame0:
-#elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE)
-.section .eh_frame,"a",@unwind
-#else
-.section .eh_frame,"a",@progbits
-#endif
-
-#ifdef HAVE_AS_X86_PCREL
-# define PCREL(X)	X - .
-#else
-# define PCREL(X)	X@rel
-#endif
-
-/* Simplify advancing between labels.  Assume DW_CFA_advance_loc1 fits.  */
-#define ADV(N, P)	.byte 2, L(N)-L(P)
-
-	.balign 8
-L(CIE):
-	.set	L(set0),L(ECIE)-L(SCIE)
-	.long	L(set0)			/* CIE Length */
-L(SCIE):
-	.long	0			/* CIE Identifier Tag */
-	.byte	1			/* CIE Version */
-	.ascii	"zR\0"			/* CIE Augmentation */
-	.byte	1			/* CIE Code Alignment Factor */
-	.byte	0x78			/* CIE Data Alignment Factor */
-	.byte	0x10			/* CIE RA Column */
-	.byte	1			/* Augmentation size */
-	.byte	0x1b			/* FDE Encoding (pcrel sdata4) */
-	.byte	0xc, 7, 8		/* DW_CFA_def_cfa, %rsp offset 8 */
-	.byte	0x80+16, 1		/* DW_CFA_offset, %rip offset 1*-8 */
-	.balign 8
-L(ECIE):
-
-	.set	L(set1),L(EFDE1)-L(SFDE1)
-	.long	L(set1)			/* FDE Length */
-L(SFDE1):
-	.long	L(SFDE1)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW0))		/* Initial location */
-	.long	L(UW4)-L(UW0)		/* Address range */
-	.byte	0			/* Augmentation size */
-	ADV(UW1, UW0)
-	.byte	0xc, 6, 32		/* DW_CFA_def_cfa, %rbp 32 */
-	.byte	0x80+6, 2		/* DW_CFA_offset, %rbp 2*-8 */
-	ADV(UW2, UW1)
-	.byte	0xa			/* DW_CFA_remember_state */
-	.byte	0xc, 7, 8		/* DW_CFA_def_cfa, %rsp 8 */
-	.byte	0xc0+6			/* DW_CFA_restore, %rbp */
-	ADV(UW3, UW2)
-	.byte	0xb			/* DW_CFA_restore_state */
-	.balign	8
-L(EFDE1):
-
-	.set	L(set2),L(EFDE2)-L(SFDE2)
-	.long	L(set2)			/* FDE Length */
-L(SFDE2):
-	.long	L(SFDE2)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW5))		/* Initial location */
-	.long	L(UW7)-L(UW5)		/* Address range */
-	.byte	0			/* Augmentation size */
-	ADV(UW6, UW5)
-	.byte	0xe			/* DW_CFA_def_cfa_offset */
-	.byte	ffi_closure_FS + 8, 1	/* uleb128, assuming 128 <= FS < 255 */
-	.balign	8
-L(EFDE2):
-
-	.set	L(set3),L(EFDE3)-L(SFDE3)
-	.long	L(set3)			/* FDE Length */
-L(SFDE3):
-	.long	L(SFDE3)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW8))		/* Initial location */
-	.long	L(UW11)-L(UW8)		/* Address range */
-	.byte	0			/* Augmentation size */
-	ADV(UW9, UW8)
-	.byte	0xe			/* DW_CFA_def_cfa_offset */
-	.byte	ffi_closure_FS + 8, 1	/* uleb128, assuming 128 <= FS < 255 */
-	ADV(UW10, UW9)
-	.byte	0xe, 8			/* DW_CFA_def_cfa_offset 8 */
-L(EFDE3):
-
-	.set	L(set4),L(EFDE4)-L(SFDE4)
-	.long	L(set4)			/* FDE Length */
-L(SFDE4):
-	.long	L(SFDE4)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW12))		/* Initial location */
-	.long	L(UW14)-L(UW12)		/* Address range */
-	.byte	0			/* Augmentation size */
-	ADV(UW13, UW12)
-	.byte	0xe			/* DW_CFA_def_cfa_offset */
-	.byte	ffi_closure_FS + 8, 1	/* uleb128, assuming 128 <= FS < 255 */
-	.balign	8
-L(EFDE4):
-
-	.set	L(set5),L(EFDE5)-L(SFDE5)
-	.long	L(set5)			/* FDE Length */
-L(SFDE5):
-	.long	L(SFDE5)-L(CIE)		/* FDE CIE offset */
-	.long	PCREL(L(UW15))		/* Initial location */
-	.long	L(UW17)-L(UW15)		/* Address range */
-	.byte	0			/* Augmentation size */
-	ADV(UW16, UW15)
-	.byte	0xe			/* DW_CFA_def_cfa_offset */
-	.byte	ffi_closure_FS + 8, 1	/* uleb128, assuming 128 <= FS < 255 */
-	.balign	8
-L(EFDE5):
-#ifdef __APPLE__
-	.subsections_via_symbols
-#endif
-
-#endif /* __x86_64__ */
-#if defined __ELF__ && defined __linux__
-	.section	.note.GNU-stack,"",@progbits
-#endif
diff --git a/third_party/gofrontend/libffi/src/x86/win64.S b/third_party/gofrontend/libffi/src/x86/win64.S
deleted file mode 100644
index a5a20b6..0000000
--- a/third_party/gofrontend/libffi/src/x86/win64.S
+++ /dev/null
@@ -1,219 +0,0 @@
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-#include <ffi_cfi.h>
-
-#if defined(HAVE_AS_CFI_PSEUDO_OP)
-        .cfi_sections   .debug_frame
-#endif
-
-#define arg0	%rcx
-#define arg1	%rdx
-#define arg2	%r8
-#define arg3	%r9
-
-#ifdef SYMBOL_UNDERSCORE
-#define SYMBOL_NAME(name) _##name
-#else
-#define SYMBOL_NAME(name) name
-#endif
-
-.macro E which
-	.align	8
-	.org	0b + \which * 8
-.endm
-
-	.text
-
-/* ffi_call_win64 (void *stack, struct win64_call_frame *frame, void *r10)
-
-   Bit o trickiness here -- FRAME is the base of the stack frame
-   for this function.  This has been allocated by ffi_call.  We also
-   deallocate some of the stack that has been alloca'd.  */
-
-	.align	8
-	.globl	ffi_call_win64
-
-	.seh_proc ffi_call_win64
-ffi_call_win64:
-	cfi_startproc
-	/* Set up the local stack frame and install it in rbp/rsp.  */
-	movq	(%rsp), %rax
-	movq	%rbp, (arg1)
-	movq	%rax, 8(arg1)
-	movq	arg1, %rbp
-	cfi_def_cfa(%rbp, 16)
-	cfi_rel_offset(%rbp, 0)
-	.seh_pushreg %rbp
-	.seh_setframe %rbp, 0
-	.seh_endprologue
-	movq	arg0, %rsp
-
-	movq	arg2, %r10
-
-	/* Load all slots into both general and xmm registers.  */
-	movq	(%rsp), %rcx
-	movsd	(%rsp), %xmm0
-	movq	8(%rsp), %rdx
-	movsd	8(%rsp), %xmm1
-	movq	16(%rsp), %r8
-	movsd	16(%rsp), %xmm2
-	movq	24(%rsp), %r9
-	movsd	24(%rsp), %xmm3
-
-	call	*16(%rbp)
-
-	movl	24(%rbp), %ecx
-	movq	32(%rbp), %r8
-	leaq	0f(%rip), %r10
-	cmpl	$FFI_TYPE_SMALL_STRUCT_4B, %ecx
-	leaq	(%r10, %rcx, 8), %r10
-	ja	99f
-	jmp	*%r10
-
-/* Below, we're space constrained most of the time.  Thus we eschew the
-   modern "mov, pop, ret" sequence (5 bytes) for "leave, ret" (2 bytes).  */
-.macro epilogue
-	leaveq
-	cfi_remember_state
-	cfi_def_cfa(%rsp, 8)
-	cfi_restore(%rbp)
-	ret
-	cfi_restore_state
-.endm
-
-	.align	8
-0:
-E FFI_TYPE_VOID
-	epilogue
-E FFI_TYPE_INT
-	movslq	%eax, %rax
-	movq	%rax, (%r8)
-	epilogue
-E FFI_TYPE_FLOAT
-	movss	%xmm0, (%r8)
-	epilogue
-E FFI_TYPE_DOUBLE
-	movsd	%xmm0, (%r8)
-	epilogue
-E FFI_TYPE_LONGDOUBLE
-	call	abort
-E FFI_TYPE_UINT8
-	movzbl	%al, %eax
-	movq	%rax, (%r8)
-	epilogue
-E FFI_TYPE_SINT8
-	movsbq	%al, %rax
-	jmp	98f
-E FFI_TYPE_UINT16
-	movzwl	%ax, %eax
-	movq	%rax, (%r8)
-	epilogue
-E FFI_TYPE_SINT16
-	movswq	%ax, %rax
-	jmp	98f
-E FFI_TYPE_UINT32
-	movl	%eax, %eax
-	movq	%rax, (%r8)
-	epilogue
-E FFI_TYPE_SINT32
-	movslq	%eax, %rax
-	movq	%rax, (%r8)
-	epilogue
-E FFI_TYPE_UINT64
-98:	movq	%rax, (%r8)
-	epilogue
-E FFI_TYPE_SINT64
-	movq	%rax, (%r8)
-	epilogue
-E FFI_TYPE_STRUCT
-	epilogue
-E FFI_TYPE_POINTER
-	movq	%rax, (%r8)
-	epilogue
-E FFI_TYPE_COMPLEX
-	call	abort
-E FFI_TYPE_SMALL_STRUCT_1B
-	movb	%al, (%r8)
-	epilogue
-E FFI_TYPE_SMALL_STRUCT_2B
-	movw	%ax, (%r8)
-	epilogue
-E FFI_TYPE_SMALL_STRUCT_4B
-	movl	%eax, (%r8)
-	epilogue
-
-	.align	8
-99:	call	abort
-
-.purgem epilogue
-
-	cfi_endproc
-	.seh_endproc
-
-
-/* 32 bytes of outgoing register stack space, 8 bytes of alignment,
-   16 bytes of result, 32 bytes of xmm registers.  */
-#define ffi_clo_FS	(32+8+16+32)
-#define ffi_clo_OFF_R	(32+8)
-#define ffi_clo_OFF_X	(32+8+16)
-
-	.align	8
-	.globl	ffi_go_closure_win64
-
-	.seh_proc ffi_go_closure_win64
-ffi_go_closure_win64:
-	cfi_startproc
-	/* Save all integer arguments into the incoming reg stack space.  */
-	movq	arg0, 8(%rsp)
-	movq	arg1, 16(%rsp)
-	movq	arg2, 24(%rsp)
-	movq	arg3, 32(%rsp)
-
-	movq	8(%r10), arg0			/* load cif */
-	movq	16(%r10), arg1			/* load fun */
-	movq	%r10, arg2			/* closure is user_data */
-	jmp	0f
-	cfi_endproc
-	.seh_endproc
-
-	.align	8
-	.globl	ffi_closure_win64
-
-	.seh_proc ffi_closure_win64
-ffi_closure_win64:
-	cfi_startproc
-	/* Save all integer arguments into the incoming reg stack space.  */
-	movq	arg0, 8(%rsp)
-	movq	arg1, 16(%rsp)
-	movq	arg2, 24(%rsp)
-	movq	arg3, 32(%rsp)
-
-	movq	FFI_TRAMPOLINE_SIZE(%r10), arg0		/* load cif */
-	movq	FFI_TRAMPOLINE_SIZE+8(%r10), arg1	/* load fun */
-	movq	FFI_TRAMPOLINE_SIZE+16(%r10), arg2	/* load user_data */
-0:
-	subq	$ffi_clo_FS, %rsp
-	cfi_adjust_cfa_offset(ffi_clo_FS)
-	.seh_stackalloc ffi_clo_FS
-	.seh_endprologue
-
-	/* Save all sse arguments into the stack frame.  */
-	movsd	%xmm0, ffi_clo_OFF_X(%rsp)
-	movsd	%xmm1, ffi_clo_OFF_X+8(%rsp)
-	movsd	%xmm2, ffi_clo_OFF_X+16(%rsp)
-	movsd	%xmm3, ffi_clo_OFF_X+24(%rsp)
-
-	leaq	ffi_clo_OFF_R(%rsp), arg3
-	call	ffi_closure_win64_inner
-
-	/* Load the result into both possible result registers.  */
-	movq    ffi_clo_OFF_R(%rsp), %rax
-	movsd   ffi_clo_OFF_R(%rsp), %xmm0
-
-	addq	$ffi_clo_FS, %rsp
-	cfi_adjust_cfa_offset(-ffi_clo_FS)
-	ret
-
-	cfi_endproc
-	.seh_endproc
diff --git a/third_party/gofrontend/libffi/src/xtensa/ffi.c b/third_party/gofrontend/libffi/src/xtensa/ffi.c
deleted file mode 100644
index fd94daf..0000000
--- a/third_party/gofrontend/libffi/src/xtensa/ffi.c
+++ /dev/null
@@ -1,298 +0,0 @@
-/* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2013 Tensilica, Inc.
-
-   XTENSA Foreign Function Interface
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#include <ffi.h>
-#include <ffi_common.h>
-
-/*
-                                 |----------------------------------------|
-                                 |                                        |
-    on entry to ffi_call ---->   |----------------------------------------|
-                                 | caller stack frame for registers a0-a3 |
-                                 |----------------------------------------|
-                                 |                                        |
-                                 |         additional arguments           |
-    entry of the function --->   |----------------------------------------|
-                                 |    copy of function arguments a2-a7    |
-                                 | -  -  -  -  -  -  -  -  -  -  -  -  -  |
-                                 |                                        |
-
-    The area below the entry line becomes the new stack frame for the function.
-
-*/
-
-
-#define FFI_TYPE_STRUCT_REGS FFI_TYPE_LAST
-
-
-extern void ffi_call_SYSV(void *rvalue, unsigned rsize, unsigned flags,
-			  void(*fn)(void), unsigned nbytes, extended_cif*);
-extern void ffi_closure_SYSV(void) FFI_HIDDEN;
-
-ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
-{
-  switch(cif->rtype->type) {
-    case FFI_TYPE_SINT8:
-    case FFI_TYPE_UINT8:
-    case FFI_TYPE_SINT16:
-    case FFI_TYPE_UINT16:
-      cif->flags = cif->rtype->type;
-      break;
-    case FFI_TYPE_VOID:
-    case FFI_TYPE_FLOAT:
-      cif->flags = FFI_TYPE_UINT32;
-      break;
-    case FFI_TYPE_DOUBLE:
-    case FFI_TYPE_UINT64:
-    case FFI_TYPE_SINT64:
-      cif->flags = FFI_TYPE_UINT64; // cif->rtype->type;
-      break;
-    case FFI_TYPE_STRUCT:
-      cif->flags = FFI_TYPE_STRUCT; //_REGS;
-      /* Up to 16 bytes are returned in registers */
-      if (cif->rtype->size > 4 * 4) {
-        /* returned structure is referenced by a register; use 8 bytes
-           (including 4 bytes for potential additional alignment) */
-        cif->flags = FFI_TYPE_STRUCT;	
-        cif->bytes += 8;
-      }
-      break;
-
-    default:
-      cif->flags = FFI_TYPE_UINT32;
-      break;
-  }
-
-  /* Round the stack up to a full 4 register frame, just in case
-     (we use this size in movsp). This way, it's also a  multiple of
-     8 bytes for 64-bit arguments.  */
-  cif->bytes = ALIGN(cif->bytes, 16);
-
-  return FFI_OK;
-}
-
-void ffi_prep_args(extended_cif *ecif, unsigned char* stack)
-{
-  unsigned int i;
-  unsigned long *addr;
-  ffi_type **ptr;
-
-  union {
-    void **v;
-    char **c;
-    signed char **sc;
-    unsigned char **uc;
-    signed short **ss;
-    unsigned short **us;
-    unsigned int **i;
-    long long **ll;
-    float **f;
-    double **d;
-  } p_argv;
-
-  /* Verify that everything is aligned up properly */
-  FFI_ASSERT (((unsigned long) stack & 0x7) == 0);
-
-  p_argv.v = ecif->avalue;
-  addr = (unsigned long*)stack;
-
-  /* structures with a size greater than 16 bytes are passed in memory */
-  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 16)
-  {
-    *addr++ = (unsigned long)ecif->rvalue;
-  }
-
-  for (i = ecif->cif->nargs, ptr = ecif->cif->arg_types;
-       i > 0;
-       i--, ptr++, p_argv.v++)
-  {
-    switch ((*ptr)->type)
-    {
-      case FFI_TYPE_SINT8:
-        *addr++ = **p_argv.sc;
-        break;
-      case FFI_TYPE_UINT8:
-        *addr++ = **p_argv.uc;
-        break;
-      case FFI_TYPE_SINT16:
-        *addr++ = **p_argv.ss;
-        break;
-      case FFI_TYPE_UINT16:
-        *addr++ = **p_argv.us;
-        break;
-      case FFI_TYPE_FLOAT:
-      case FFI_TYPE_INT:
-      case FFI_TYPE_UINT32:
-      case FFI_TYPE_SINT32:
-      case FFI_TYPE_POINTER:
-        *addr++ = **p_argv.i;
-        break;
-      case FFI_TYPE_DOUBLE:
-      case FFI_TYPE_UINT64:
-      case FFI_TYPE_SINT64:
-        if (((unsigned long)addr & 4) != 0)
-          addr++;
-        *(unsigned long long*)addr = **p_argv.ll;
-	addr += sizeof(unsigned long long) / sizeof (addr);
-        break;
-
-      case FFI_TYPE_STRUCT:
-      {
-        unsigned long offs;
-        unsigned long size;
-
-        if (((unsigned long)addr & 4) != 0 && (*ptr)->alignment > 4)
-          addr++;
-
-        offs = (unsigned long) addr - (unsigned long) stack;
-        size = (*ptr)->size;
-
-        /* Entire structure must fit the argument registers or referenced */
-        if (offs < FFI_REGISTER_NARGS * 4
-            && offs + size > FFI_REGISTER_NARGS * 4)
-          addr = (unsigned long*) (stack + FFI_REGISTER_NARGS * 4);
-
-        memcpy((char*) addr, *p_argv.c, size);
-        addr += (size + 3) / 4;
-        break;
-      }
-
-      default:
-        FFI_ASSERT(0);
-    }
-  }
-}
-
-
-void ffi_call(ffi_cif* cif, void(*fn)(void), void *rvalue, void **avalue)
-{
-  extended_cif ecif;
-  unsigned long rsize = cif->rtype->size;
-  int flags = cif->flags;
-  void *alloc = NULL;
-
-  ecif.cif = cif;
-  ecif.avalue = avalue;
-
-  /* Note that for structures that are returned in registers (size <= 16 bytes)
-     we allocate a temporary buffer and use memcpy to copy it to the final 
-     destination. The reason is that the target address might be misaligned or
-     the length not a multiple of 4 bytes. Handling all those cases would be
-     very complex.  */
-
-  if (flags == FFI_TYPE_STRUCT && (rsize <= 16 || rvalue == NULL))
-  {
-    alloc = alloca(ALIGN(rsize, 4));
-    ecif.rvalue = alloc;
-  }
-  else
-  {
-    ecif.rvalue = rvalue;
-  }
-
-  if (cif->abi != FFI_SYSV)
-    FFI_ASSERT(0);
-
-  ffi_call_SYSV (ecif.rvalue, rsize, cif->flags, fn, cif->bytes, &ecif);
-
-  if (alloc != NULL && rvalue != NULL)
-    memcpy(rvalue, alloc, rsize);
-}
-
-extern void ffi_trampoline();
-extern void ffi_cacheflush(void* start, void* end);
-
-ffi_status
-ffi_prep_closure_loc (ffi_closure* closure,
-                      ffi_cif* cif,
-                      void (*fun)(ffi_cif*, void*, void**, void*),
-                      void *user_data,
-                      void *codeloc)
-{
-  /* copye trampoline to stack and patch 'ffi_closure_SYSV' pointer */
-  memcpy(closure->tramp, ffi_trampoline, FFI_TRAMPOLINE_SIZE);
-  *(unsigned int*)(&closure->tramp[8]) = (unsigned int)ffi_closure_SYSV;
-
-  // Do we have this function?
-  // __builtin___clear_cache(closer->tramp, closer->tramp + FFI_TRAMPOLINE_SIZE)
-  ffi_cacheflush(closure->tramp, closure->tramp + FFI_TRAMPOLINE_SIZE);
-
-  closure->cif = cif;
-  closure->fun = fun;
-  closure->user_data = user_data;
-  return FFI_OK; 
-}
-
-
-long FFI_HIDDEN
-ffi_closure_SYSV_inner(ffi_closure *closure, void **values, void *rvalue)
-{
-  ffi_cif *cif;
-  ffi_type **arg_types;
-  void **avalue;
-  int i, areg;
-
-  cif = closure->cif;
-  if (cif->abi != FFI_SYSV)
-    return FFI_BAD_ABI;
-
-  areg = 0;
-
-  int rtype = cif->rtype->type;
-  if (rtype == FFI_TYPE_STRUCT && cif->rtype->size > 4 * 4)
-  {
-    rvalue = *values;
-    areg++;
-  }
-
-  cif = closure->cif; 
-  arg_types = cif->arg_types;
-  avalue = alloca(cif->nargs * sizeof(void *));
-
-  for (i = 0; i < cif->nargs; i++)
-  {
-    if (arg_types[i]->alignment == 8 && (areg & 1) != 0)
-      areg++;
-
-    // skip the entry 16,a1 framework, add 16 bytes (4 registers)
-    if (areg == FFI_REGISTER_NARGS)
-      areg += 4;
-
-    if (arg_types[i]->type == FFI_TYPE_STRUCT)
-    {
-      int numregs = ((arg_types[i]->size + 3) & ~3) / 4;
-      if (areg < FFI_REGISTER_NARGS && areg + numregs > FFI_REGISTER_NARGS)
-        areg = FFI_REGISTER_NARGS + 4;
-    }
-
-    avalue[i] = &values[areg];
-    areg += (arg_types[i]->size + 3) / 4;
-  }
-
-  (closure->fun)(cif, rvalue, avalue, closure->user_data);
-
-  return rtype;
-}
diff --git a/third_party/gofrontend/libffi/src/xtensa/ffitarget.h b/third_party/gofrontend/libffi/src/xtensa/ffitarget.h
deleted file mode 100644
index 0ba728b..0000000
--- a/third_party/gofrontend/libffi/src/xtensa/ffitarget.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -----------------------------------------------------------------*-C-*-
-   ffitarget.h - Copyright (c) 2013 Tensilica, Inc.
-   Target configuration macros for XTENSA.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#ifndef LIBFFI_TARGET_H
-#define LIBFFI_TARGET_H
-
-#ifndef LIBFFI_H
-#error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
-#endif
-
-#ifndef LIBFFI_ASM
-typedef unsigned long	ffi_arg;
-typedef signed long	ffi_sarg;
-
-typedef enum ffi_abi {
-  FFI_FIRST_ABI = 0,
-  FFI_SYSV,
-  FFI_LAST_ABI,
-  FFI_DEFAULT_ABI = FFI_SYSV
-} ffi_abi;
-#endif
-
-#define FFI_REGISTER_NARGS	6
-
-/* ---- Definitions for closures ----------------------------------------- */
-
-#define FFI_CLOSURES 1
-#define FFI_NATIVE_RAW_API 0
-#define FFI_TRAMPOLINE_SIZE 24
-
-#endif
diff --git a/third_party/gofrontend/libffi/src/xtensa/sysv.S b/third_party/gofrontend/libffi/src/xtensa/sysv.S
deleted file mode 100644
index 64e6a09..0000000
--- a/third_party/gofrontend/libffi/src/xtensa/sysv.S
+++ /dev/null
@@ -1,253 +0,0 @@
-/* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2013 Tensilica, Inc.
-   
-   XTENSA Foreign Function Interface 
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   ``Software''), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-   DEALINGS IN THE SOFTWARE.
-   ----------------------------------------------------------------------- */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-
-#define ENTRY(name) .text; .globl name; .type  name,@function; .align 4; name:
-#define END(name) .size name , . - name
-
-/* Assert that the table below is in sync with ffi.h.  */
-
-#if	   FFI_TYPE_UINT8 != 5          \
-        || FFI_TYPE_SINT8 != 6          \
-        || FFI_TYPE_UINT16 != 7         \
-        || FFI_TYPE_SINT16 != 8         \
-        || FFI_TYPE_UINT32 != 9         \
-        || FFI_TYPE_SINT32 != 10        \
-        || FFI_TYPE_UINT64 != 11
-#error "xtensa/sysv.S out of sync with ffi.h"
-#endif
-
-
-/* ffi_call_SYSV (rvalue, rbytes, flags, (*fnaddr)(), bytes, ecif)
-      void *rvalue;            a2
-      unsigned long rbytes;    a3
-      unsigned flags;          a4
-      void (*fnaddr)();        a5
-      unsigned long bytes;     a6
-      extended_cif* ecif)      a7
-*/
-
-ENTRY(ffi_call_SYSV)
-
-	entry	a1, 32              # 32 byte frame for using call8 below
-
-	mov	a10, a7             # a10(->arg0): ecif
-	sub	a11, a1, a6         # a11(->arg1): stack pointer
-	mov	a7, a1              # fp
-	movsp	a1, a11             # set new sp = old_sp - bytes
-
-	movi	a8, ffi_prep_args
-	callx8	a8                  # ffi_prep_args(ecif, stack)
-
-	# prepare to move stack pointer back up to 6 arguments
-	# note that 'bytes' is already aligned
-
-	movi	a10, 6*4 
-	sub	a11, a6, a10
-	movgez	a6, a10, a11
-	add	a6, a1, a6
-
-	
-	# we can pass up to 6 arguments in registers
-	# for simplicity, just load 6 arguments
-	# (the stack size is at least 32 bytes, so no risk to cross boundaries)
-
-	l32i	a10, a1, 0
-	l32i	a11, a1, 4
-	l32i	a12, a1, 8
-	l32i	a13, a1, 12
-	l32i	a14, a1, 16
-	l32i	a15, a1, 20
-
-	# move stack pointer
-
-	movsp	a1, a6
-
-	callx8	a5                  # (*fn)(args...)
-
-	# Handle return value(s)
-
-	beqz	a2, .Lexit
-
-	movi	a5, FFI_TYPE_STRUCT
-	bne	a4, a5, .Lstore
-	movi	a5, 16
-	blt	a5, a3, .Lexit
-
-	s32i	a10, a2, 0
-	blti	a3, 5, .Lexit
-	addi	a3, a3, -1
-	s32i	a11, a2, 4
-	blti	a3, 8, .Lexit
-	s32i	a12, a2, 8
-	blti	a3, 12, .Lexit
-	s32i	a13, a2, 12
-
-.Lexit:	retw
-
-.Lstore:
-	addi	a4, a4, -FFI_TYPE_UINT8
-	bgei	a4, 7, .Lexit	# should never happen
-	movi	a6, store_calls
-	add	a4, a4, a4
-	addx4	a6, a4, a6	# store_table + idx * 8
-	jx	a6
-
-	.align	8
-store_calls:
-	# UINT8
-	s8i	a10, a2, 0
-	retw
-
-	# SINT8
-	.align	8
-	s8i	a10, a2, 0
-	retw
-
-	# UINT16
-	.align	8
-	s16i	a10, a2, 0
-	retw
-
-	# SINT16
-	.align	8
-	s16i	a10, a2, 0
-	retw
-
-	# UINT32
-	.align	8
-	s32i	a10, a2, 0
-	retw
-
-	# SINT32
-	.align	8
-	s32i	a10, a2, 0
-	retw
-
-	# UINT64
-	.align	8
-	s32i	a10, a2, 0
-	s32i	a11, a2, 4
-	retw
-
-END(ffi_call_SYSV)
-
-
-/*
- * void ffi_cacheflush (unsigned long start, unsigned long end)
- */
-
-#define EXTRA_ARGS_SIZE	24
-
-ENTRY(ffi_cacheflush)
-
-	entry	a1, 16
-
-1:	dhwbi	a2, 0
-	ihi	a2, 0
-	addi	a2, a2, 4
-	blt	a2, a3, 1b
-
-	retw
-
-END(ffi_cacheflush)
-
-/* ffi_trampoline is copied to the stack */
-
-ENTRY(ffi_trampoline)
-
-	entry	a1, 16 + (FFI_REGISTER_NARGS * 4) + (4 * 4)   # [ 0]
-	j	2f                                # [ 3]
-	.align	4                                 # [ 6]
-1:	.long	0                                 # [ 8]
-2:	l32r	a15, 1b                           # [12]
-	_mov 	a14, a0                           # [15]
-	callx0	a15                               # [18]
-                                                  # [21]
-END(ffi_trampoline)
-
-/*
- * ffi_closure()
- *
- * a0:  closure + 21
- * a14: return address (a0)
- */
-
-ENTRY(ffi_closure_SYSV)
-
-	/* intentionally omitting entry here */
-
-	# restore return address (a0) and move pointer to closure to a10
-	addi	a10, a0, -21
-	mov	a0, a14
-
-	# allow up to 4 arguments as return values
-	addi	a11, a1, 4 * 4
-
-	# save up to 6 arguments to stack (allocated by entry below)
-	s32i	a2, a11,  0
-	s32i	a3, a11,  4
-	s32i	a4, a11,  8
-	s32i	a5, a11, 12
-	s32i	a6, a11, 16
-	s32i	a7, a11, 20
-
-	movi	a8, ffi_closure_SYSV_inner
-	mov	a12, a1
-	callx8	a8			# .._inner(*closure, **avalue, *rvalue)
-
-	# load up to four return arguments
-	l32i	a2, a1,  0
-	l32i	a3, a1,  4
-	l32i	a4, a1,  8
-	l32i	a5, a1, 12
-
-	# (sign-)extend return value
-	movi	a11, FFI_TYPE_UINT8
-	bne	a10, a11, 1f
-	extui	a2, a2, 0, 8
-	retw
-
-1:	movi	a11, FFI_TYPE_SINT8
-	bne	a10, a11, 1f
-	sext	a2, a2, 7
-	retw
-
-1:	movi	a11, FFI_TYPE_UINT16
-	bne	a10, a11, 1f
-	extui	a2, a2, 0, 16
-	retw
-
-1:	movi	a11, FFI_TYPE_SINT16
-	bne	a10, a11, 1f
-	sext	a2, a2, 15
-
-1:	retw
-
-END(ffi_closure_SYSV)
diff --git a/third_party/gofrontend/libffi/stamp-h.in b/third_party/gofrontend/libffi/stamp-h.in
deleted file mode 100644
index 9788f70..0000000
--- a/third_party/gofrontend/libffi/stamp-h.in
+++ /dev/null
@@ -1 +0,0 @@
-timestamp
diff --git a/third_party/gofrontend/libffi/testsuite/Makefile.am b/third_party/gofrontend/libffi/testsuite/Makefile.am
deleted file mode 100644
index 209e897..0000000
--- a/third_party/gofrontend/libffi/testsuite/Makefile.am
+++ /dev/null
@@ -1,94 +0,0 @@
-## Process this file with automake to produce Makefile.in.
-
-AUTOMAKE_OPTIONS = foreign dejagnu
-
-# Setup the testing framework, if you have one
-EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \
-	    echo $(top_builddir)/../expect/expect ; \
-	  else echo expect ; fi`
-
-RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \
-	       echo $(top_srcdir)/../dejagnu/runtest ; \
-	    else echo runtest; fi`
-
-AM_RUNTESTFLAGS =
-
-CLEANFILES = *.exe core* *.log *.sum
-
-EXTRA_DIST = config/default.exp libffi.call/cls_19byte.c		\
-libffi.call/cls_align_longdouble_split.c				\
-libffi.call/closure_loc_fn0.c libffi.call/cls_schar.c			\
-libffi.call/closure_fn1.c \
-libffi.call/return_ul.c libffi.call/cls_align_double.c			\
-libffi.call/return_fl2.c libffi.call/cls_1_1byte.c			\
-libffi.call/cls_64byte.c libffi.call/nested_struct7.c			\
-libffi.call/cls_align_sint32.c libffi.call/nested_struct2.c		\
-libffi.call/ffitest.h libffi.call/nested_struct4.c			\
-libffi.call/cls_multi_ushort.c libffi.call/struct3.c			\
-libffi.call/cls_3byte1.c libffi.call/cls_16byte.c			\
-libffi.call/struct8.c libffi.call/nested_struct8.c			\
-libffi.call/cls_multi_sshort.c libffi.call/cls_3byte2.c			\
-libffi.call/cls_pointer.c			\
-libffi.call/err_bad_typedef.c libffi.call/cls_4_1byte.c			\
-libffi.call/cls_9byte2.c libffi.call/cls_multi_schar.c			\
-libffi.call/stret_medium2.c libffi.call/cls_5_1_byte.c			\
-libffi.call/call.exp libffi.call/cls_double.c				\
-libffi.call/cls_align_sint16.c libffi.call/cls_uint.c			\
-libffi.call/return_ll1.c libffi.call/nested_struct3.c			\
-libffi.call/cls_20byte1.c libffi.call/closure_fn4.c			\
-libffi.call/cls_uchar.c libffi.call/struct2.c libffi.call/cls_7byte.c	\
-libffi.call/strlen.c libffi.call/many.c libffi.call/testclosure.c	\
-libffi.call/return_fl.c libffi.call/struct5.c				\
-libffi.call/cls_12byte.c libffi.call/cls_multi_sshortchar.c		\
-libffi.call/cls_align_longdouble_split2.c libffi.call/return_dbl2.c	\
-libffi.call/return_fl3.c libffi.call/stret_medium.c			\
-libffi.call/nested_struct6.c libffi.call/closure_fn3.c			\
-libffi.call/float3.c libffi.call/many2.c				\
-libffi.call/closure_simple.c libffi.call/cls_align_uint16.c		\
-libffi.call/cls_9byte1.c libffi.call/closure_fn6.c			\
-libffi.call/cls_double_va.c libffi.call/cls_align_pointer.c		\
-libffi.call/cls_align_longdouble.c libffi.call/closure_fn2.c		\
-libffi.call/cls_sshort.c \
-libffi.call/nested_struct.c libffi.call/cls_20byte.c			\
-libffi.call/cls_longdouble.c libffi.call/cls_multi_uchar.c		\
-libffi.call/return_uc.c \
-libffi.call/cls_18byte.c libffi.call/cls_8byte.c			\
-libffi.call/promotion.c \
-libffi.call/return_dbl.c libffi.call/cls_24byte.c			\
-libffi.call/struct4.c libffi.call/cls_6byte.c				\
-libffi.call/cls_align_uint32.c libffi.call/float.c			\
-libffi.call/float1.c libffi.call/float_va.c libffi.call/negint.c	\
-libffi.call/return_dbl1.c libffi.call/cls_3_1byte.c			\
-libffi.call/cls_align_float.c libffi.call/return_fl1.c			\
-libffi.call/nested_struct10.c libffi.call/nested_struct5.c		\
-libffi.call/cls_align_sint64.c		\
-libffi.call/stret_large2.c libffi.call/return_sl.c			\
-libffi.call/closure_fn0.c libffi.call/cls_5byte.c			\
-libffi.call/cls_2byte.c libffi.call/float2.c				\
-libffi.call/cls_dbls_struct.c libffi.call/cls_sint.c			\
-libffi.call/stret_large.c libffi.call/cls_ulonglong.c			\
-libffi.call/cls_ushort.c libffi.call/nested_struct1.c			\
-libffi.call/err_bad_abi.c libffi.call/cls_longdouble_va.c		\
-libffi.call/cls_float.c libffi.call/cls_pointer_stack.c		\
-libffi.call/pyobjc-tc.c libffi.call/cls_multi_ushortchar.c		\
-libffi.call/struct1.c libffi.call/nested_struct9.c			\
-libffi.call/huge_struct.c libffi.call/problem1.c			\
-libffi.call/float4.c \
-libffi.call/return_ldl.c \
-libffi.call/closure_fn5.c \
-libffi.call/struct6.c libffi.call/return_ll.c libffi.call/struct9.c	\
-libffi.call/return_sc.c libffi.call/struct7.c				\
-libffi.call/cls_align_uint64.c libffi.call/cls_4byte.c			\
-libffi.call/cls_6_1_byte.c			\
-libffi.call/cls_7_1_byte.c libffi.call/unwindtest.cc			\
-libffi.call/unwindtest_ffi_call.cc	\
-lib/wrapper.exp lib/target-libpath.exp	\
-lib/libffi.exp libffi.call/cls_struct_va1.c				\
-libffi.call/cls_uchar_va.c libffi.call/cls_uint_va.c			\
-libffi.call/cls_ulong_va.c libffi.call/cls_ushort_va.c			\
-libffi.call/nested_struct11.c libffi.call/uninitialized.c		\
-libffi.call/va_1.c libffi.call/va_struct1.c libffi.call/va_struct2.c	\
-libffi.call/va_struct3.c \
-libffi.call/strlen2.c \
-libffi.call/strlen3.c \
-libffi.call/strlen4.c
diff --git a/third_party/gofrontend/libffi/testsuite/Makefile.in b/third_party/gofrontend/libffi/testsuite/Makefile.in
deleted file mode 100644
index cbfe35b..0000000
--- a/third_party/gofrontend/libffi/testsuite/Makefile.in
+++ /dev/null
@@ -1,481 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-target_triplet = @target@
-subdir = testsuite
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
-	$(top_srcdir)/../config/asmcfi.m4 \
-	$(top_srcdir)/../config/depstand.m4 \
-	$(top_srcdir)/../config/lead-dot.m4 \
-	$(top_srcdir)/../config/multi.m4 \
-	$(top_srcdir)/../config/override.m4 \
-	$(top_srcdir)/../libtool.m4 $(top_srcdir)/../ltoptions.m4 \
-	$(top_srcdir)/../ltsugar.m4 $(top_srcdir)/../ltversion.m4 \
-	$(top_srcdir)/../lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/fficonfig.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-SOURCES =
-DEJATOOL = $(PACKAGE)
-RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir
-ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
-AMTAR = @AMTAR@
-AM_LTLDFLAGS = @AM_LTLDFLAGS@
-AM_RUNTESTFLAGS = 
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCAS = @CCAS@
-CCASDEPMODE = @CCASDEPMODE@
-CCASFLAGS = @CCASFLAGS@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
-FGREP = @FGREP@
-GREP = @GREP@
-HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
-HAVE_LONG_DOUBLE_VARIANT = @HAVE_LONG_DOUBLE_VARIANT@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TARGET = @TARGET@
-TARGETDIR = @TARGETDIR@
-TARGET_OBJ = @TARGET_OBJ@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-multi_basedir = @multi_basedir@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target = @target@
-target_alias = @target_alias@
-target_cpu = @target_cpu@
-target_os = @target_os@
-target_vendor = @target_vendor@
-toolexecdir = @toolexecdir@
-toolexeclibdir = @toolexeclibdir@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AUTOMAKE_OPTIONS = foreign dejagnu
-
-# Setup the testing framework, if you have one
-EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \
-	    echo $(top_builddir)/../expect/expect ; \
-	  else echo expect ; fi`
-
-RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \
-	       echo $(top_srcdir)/../dejagnu/runtest ; \
-	    else echo runtest; fi`
-
-CLEANFILES = *.exe core* *.log *.sum
-EXTRA_DIST = config/default.exp libffi.call/cls_19byte.c		\
-libffi.call/cls_align_longdouble_split.c				\
-libffi.call/closure_loc_fn0.c libffi.call/cls_schar.c			\
-libffi.call/closure_fn1.c \
-libffi.call/return_ul.c libffi.call/cls_align_double.c			\
-libffi.call/return_fl2.c libffi.call/cls_1_1byte.c			\
-libffi.call/cls_64byte.c libffi.call/nested_struct7.c			\
-libffi.call/cls_align_sint32.c libffi.call/nested_struct2.c		\
-libffi.call/ffitest.h libffi.call/nested_struct4.c			\
-libffi.call/cls_multi_ushort.c libffi.call/struct3.c			\
-libffi.call/cls_3byte1.c libffi.call/cls_16byte.c			\
-libffi.call/struct8.c libffi.call/nested_struct8.c			\
-libffi.call/cls_multi_sshort.c libffi.call/cls_3byte2.c			\
-libffi.call/cls_pointer.c			\
-libffi.call/err_bad_typedef.c libffi.call/cls_4_1byte.c			\
-libffi.call/cls_9byte2.c libffi.call/cls_multi_schar.c			\
-libffi.call/stret_medium2.c libffi.call/cls_5_1_byte.c			\
-libffi.call/call.exp libffi.call/cls_double.c				\
-libffi.call/cls_align_sint16.c libffi.call/cls_uint.c			\
-libffi.call/return_ll1.c libffi.call/nested_struct3.c			\
-libffi.call/cls_20byte1.c libffi.call/closure_fn4.c			\
-libffi.call/cls_uchar.c libffi.call/struct2.c libffi.call/cls_7byte.c	\
-libffi.call/strlen.c libffi.call/many.c libffi.call/testclosure.c	\
-libffi.call/return_fl.c libffi.call/struct5.c				\
-libffi.call/cls_12byte.c libffi.call/cls_multi_sshortchar.c		\
-libffi.call/cls_align_longdouble_split2.c libffi.call/return_dbl2.c	\
-libffi.call/return_fl3.c libffi.call/stret_medium.c			\
-libffi.call/nested_struct6.c libffi.call/closure_fn3.c			\
-libffi.call/float3.c libffi.call/many2.c				\
-libffi.call/closure_simple.c libffi.call/cls_align_uint16.c		\
-libffi.call/cls_9byte1.c libffi.call/closure_fn6.c			\
-libffi.call/cls_double_va.c libffi.call/cls_align_pointer.c		\
-libffi.call/cls_align_longdouble.c libffi.call/closure_fn2.c		\
-libffi.call/cls_sshort.c \
-libffi.call/nested_struct.c libffi.call/cls_20byte.c			\
-libffi.call/cls_longdouble.c libffi.call/cls_multi_uchar.c		\
-libffi.call/return_uc.c \
-libffi.call/cls_18byte.c libffi.call/cls_8byte.c			\
-libffi.call/promotion.c \
-libffi.call/return_dbl.c libffi.call/cls_24byte.c			\
-libffi.call/struct4.c libffi.call/cls_6byte.c				\
-libffi.call/cls_align_uint32.c libffi.call/float.c			\
-libffi.call/float1.c libffi.call/float_va.c libffi.call/negint.c	\
-libffi.call/return_dbl1.c libffi.call/cls_3_1byte.c			\
-libffi.call/cls_align_float.c libffi.call/return_fl1.c			\
-libffi.call/nested_struct10.c libffi.call/nested_struct5.c		\
-libffi.call/cls_align_sint64.c		\
-libffi.call/stret_large2.c libffi.call/return_sl.c			\
-libffi.call/closure_fn0.c libffi.call/cls_5byte.c			\
-libffi.call/cls_2byte.c libffi.call/float2.c				\
-libffi.call/cls_dbls_struct.c libffi.call/cls_sint.c			\
-libffi.call/stret_large.c libffi.call/cls_ulonglong.c			\
-libffi.call/cls_ushort.c libffi.call/nested_struct1.c			\
-libffi.call/err_bad_abi.c libffi.call/cls_longdouble_va.c		\
-libffi.call/cls_float.c libffi.call/cls_pointer_stack.c		\
-libffi.call/pyobjc-tc.c libffi.call/cls_multi_ushortchar.c		\
-libffi.call/struct1.c libffi.call/nested_struct9.c			\
-libffi.call/huge_struct.c libffi.call/problem1.c			\
-libffi.call/float4.c \
-libffi.call/return_ldl.c \
-libffi.call/closure_fn5.c \
-libffi.call/struct6.c libffi.call/return_ll.c libffi.call/struct9.c	\
-libffi.call/return_sc.c libffi.call/struct7.c				\
-libffi.call/cls_align_uint64.c libffi.call/cls_4byte.c			\
-libffi.call/cls_6_1_byte.c			\
-libffi.call/cls_7_1_byte.c libffi.call/unwindtest.cc			\
-libffi.call/unwindtest_ffi_call.cc	\
-lib/wrapper.exp lib/target-libpath.exp	\
-lib/libffi.exp libffi.call/cls_struct_va1.c				\
-libffi.call/cls_uchar_va.c libffi.call/cls_uint_va.c			\
-libffi.call/cls_ulong_va.c libffi.call/cls_ushort_va.c			\
-libffi.call/nested_struct11.c libffi.call/uninitialized.c		\
-libffi.call/va_1.c libffi.call/va_struct1.c libffi.call/va_struct2.c	\
-libffi.call/va_struct3.c \
-libffi.call/strlen2.c \
-libffi.call/strlen3.c \
-libffi.call/strlen4.c
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testsuite/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign testsuite/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-check-DEJAGNU: site.exp
-	srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \
-	EXPECT=$(EXPECT); export EXPECT; \
-	runtest=$(RUNTEST); \
-	if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \
-	  exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \
-	    if $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \
-	    then :; else exit_status=1; fi; \
-	  done; \
-	else echo "WARNING: could not find \`runtest'" 1>&2; :;\
-	fi; \
-	exit $$exit_status
-site.exp: Makefile
-	@echo 'Making a new site.exp file...'
-	@echo '## these variables are automatically generated by make ##' >site.tmp
-	@echo '# Do not edit here.  If you wish to override these values' >>site.tmp
-	@echo '# edit the last section' >>site.tmp
-	@echo 'set srcdir $(srcdir)' >>site.tmp
-	@echo "set objdir `pwd`" >>site.tmp
-	@echo 'set build_alias "$(build_alias)"' >>site.tmp
-	@echo 'set build_triplet $(build_triplet)' >>site.tmp
-	@echo 'set host_alias "$(host_alias)"' >>site.tmp
-	@echo 'set host_triplet $(host_triplet)' >>site.tmp
-	@echo 'set target_alias "$(target_alias)"' >>site.tmp
-	@echo 'set target_triplet $(target_triplet)' >>site.tmp
-	@echo '## All variables above are generated by configure. Do Not Edit ##' >>site.tmp
-	@test ! -f site.exp || \
-	  sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp
-	@-rm -f site.bak
-	@test ! -f site.exp || mv site.exp site.bak
-	@mv site.tmp site.exp
-
-distclean-DEJAGNU:
-	-rm -f site.exp site.bak
-	-l='$(DEJATOOL)'; for tool in $$l; do \
-	  rm -f $$tool.sum $$tool.log; \
-	done
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-DEJAGNU distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: check-am install-am install-strip
-
-.PHONY: all all-am check check-DEJAGNU check-am clean clean-generic \
-	clean-libtool distclean distclean-DEJAGNU distclean-generic \
-	distclean-libtool dvi dvi-am html html-am info info-am install \
-	install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn0.c b/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn0.c
deleted file mode 100644
index a579ff6..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn0.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check multiple values passing from different type.
-		Also, exceed the limit of gpr and fpr registers on PowerPC
-		Darwin.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-
-
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void
-closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		 void* userdata)
-{
-  *(ffi_arg*)resp =
-    (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) +
-    (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] +
-    (int)(*(signed short *)args[4]) +
-    (int)(*(unsigned long long *)args[5]) +
-    (int)*(int *)args[6] + (int)(*(int *)args[7]) +
-    (int)(*(double *)args[8]) + (int)*(int *)args[9] +
-    (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
-    (int)*(int *)args[12] + (int)(*(int *)args[13]) +
-    (int)(*(int *)args[14]) +  *(int *)args[15] + (intptr_t)userdata;
-
-  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
-	 (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]),
-	 (int)(*(unsigned long long *)args[2]),
-	 (int)*(int *)args[3], (int)(*(signed short *)args[4]),
-	 (int)(*(unsigned long long *)args[5]),
-	 (int)*(int *)args[6], (int)(*(int *)args[7]),
-	 (int)(*(double *)args[8]), (int)*(int *)args[9],
-	 (int)(*(int *)args[10]), (int)(*(float *)args[11]),
-	 (int)*(int *)args[12], (int)(*(int *)args[13]),
-	 (int)(*(int *)args[14]),*(int *)args[15],
-	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
-
-}
-
-typedef int (*closure_test_type0)(unsigned long long, int, unsigned long long,
-				  int, signed short, unsigned long long, int,
-				  int, double, int, int, float, int, int,
-				  int, int);
-
-int main (void)
-{
-  ffi_cif cif;
-  void * code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[17];
-  int res;
-
-  cl_arg_types[0] = &ffi_type_uint64;
-  cl_arg_types[1] = &ffi_type_sint;
-  cl_arg_types[2] = &ffi_type_uint64;
-  cl_arg_types[3] = &ffi_type_sint;
-  cl_arg_types[4] = &ffi_type_sshort;
-  cl_arg_types[5] = &ffi_type_uint64;
-  cl_arg_types[6] = &ffi_type_sint;
-  cl_arg_types[7] = &ffi_type_sint;
-  cl_arg_types[8] = &ffi_type_double;
-  cl_arg_types[9] = &ffi_type_sint;
-  cl_arg_types[10] = &ffi_type_sint;
-  cl_arg_types[11] = &ffi_type_float;
-  cl_arg_types[12] = &ffi_type_sint;
-  cl_arg_types[13] = &ffi_type_sint;
-  cl_arg_types[14] = &ffi_type_sint;
-  cl_arg_types[15] = &ffi_type_sint;
-  cl_arg_types[16] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
-		     &ffi_type_sint, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0,
-                             (void *) 3 /* userdata */, code) == FFI_OK);
-
-  res = (*((closure_test_type0)code))
-    (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13,
-     19, 21, 1);
-  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 680" } */
-     exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn1.c
deleted file mode 100644
index 9123173..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn1.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Area:	closure_call.
-   Purpose:	Check multiple values passing from different type.
-		Also, exceed the limit of gpr and fpr registers on PowerPC
-		Darwin.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-
-static void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			     void* userdata)
-{
-  *(ffi_arg*)resp =
-    (int)*(float *)args[0] +(int)(*(float *)args[1]) +
-    (int)(*(float *)args[2]) + (int)*(float *)args[3] +
-    (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) +
-    (int)*(float *)args[6] + (int)(*(int *)args[7]) +
-    (int)(*(double*)args[8]) + (int)*(int *)args[9] +
-    (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
-    (int)*(int *)args[12] + (int)(*(int *)args[13]) +
-    (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata;
-
-  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
-	 (int)*(float *)args[0], (int)(*(float *)args[1]),
-	 (int)(*(float *)args[2]), (int)*(float *)args[3],
-	 (int)(*(signed short *)args[4]), (int)(*(float *)args[5]),
-	 (int)*(float *)args[6], (int)(*(int *)args[7]),
-	 (int)(*(double *)args[8]), (int)*(int *)args[9],
-	 (int)(*(int *)args[10]), (int)(*(float *)args[11]),
-	 (int)*(int *)args[12], (int)(*(int *)args[13]),
-	 (int)(*(int *)args[14]), *(int *)args[15],
-	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
-}
-
-typedef int (*closure_test_type1)(float, float, float, float, signed short,
-				  float, float, int, double, int, int, float,
-				  int, int, int, int);
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[17];
-  int res;
-
-  cl_arg_types[0] = &ffi_type_float;
-  cl_arg_types[1] = &ffi_type_float;
-  cl_arg_types[2] = &ffi_type_float;
-  cl_arg_types[3] = &ffi_type_float;
-  cl_arg_types[4] = &ffi_type_sshort;
-  cl_arg_types[5] = &ffi_type_float;
-  cl_arg_types[6] = &ffi_type_float;
-  cl_arg_types[7] = &ffi_type_sint;
-  cl_arg_types[8] = &ffi_type_double;
-  cl_arg_types[9] = &ffi_type_sint;
-  cl_arg_types[10] = &ffi_type_sint;
-  cl_arg_types[11] = &ffi_type_float;
-  cl_arg_types[12] = &ffi_type_sint;
-  cl_arg_types[13] = &ffi_type_sint;
-  cl_arg_types[14] = &ffi_type_sint;
-  cl_arg_types[15] = &ffi_type_sint;
-  cl_arg_types[16] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
-		     &ffi_type_sint, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1,
-                             (void *) 3 /* userdata */, code)  == FFI_OK);
-
-  res = (*((closure_test_type1)code))
-    (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13,
-     19, 21, 1);
-  /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 255" } */
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn2.c
deleted file mode 100644
index 08ff9d9..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn2.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check multiple values passing from different type.
-		Also, exceed the limit of gpr and fpr registers on PowerPC
-		Darwin.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void closure_test_fn2(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			     void* userdata)
-{
-  *(ffi_arg*)resp =
-    (int)*(double *)args[0] +(int)(*(double *)args[1]) +
-    (int)(*(double *)args[2]) + (int)*(double *)args[3] +
-    (int)(*(signed short *)args[4]) + (int)(*(double *)args[5]) +
-    (int)*(double *)args[6] + (int)(*(int *)args[7]) +
-    (int)(*(double *)args[8]) + (int)*(int *)args[9] +
-    (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
-    (int)*(int *)args[12] + (int)(*(float *)args[13]) +
-    (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata;
-
-  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
-	 (int)*(double *)args[0], (int)(*(double *)args[1]),
-	 (int)(*(double *)args[2]), (int)*(double *)args[3],
-	 (int)(*(signed short *)args[4]), (int)(*(double *)args[5]),
-	 (int)*(double *)args[6], (int)(*(int *)args[7]),
-	 (int)(*(double*)args[8]), (int)*(int *)args[9],
-	 (int)(*(int *)args[10]), (int)(*(float *)args[11]),
-	 (int)*(int *)args[12], (int)(*(float *)args[13]),
-	 (int)(*(int *)args[14]), *(int *)args[15], (int)(intptr_t)userdata,
-	 (int)*(ffi_arg *)resp);
-}
-
-typedef int (*closure_test_type2)(double, double, double, double, signed short,
-				  double, double, int, double, int, int, float,
-				  int, float, int, int);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[17];
-  int res;
-
-  cl_arg_types[0] = &ffi_type_double;
-  cl_arg_types[1] = &ffi_type_double;
-  cl_arg_types[2] = &ffi_type_double;
-  cl_arg_types[3] = &ffi_type_double;
-  cl_arg_types[4] = &ffi_type_sshort;
-  cl_arg_types[5] = &ffi_type_double;
-  cl_arg_types[6] = &ffi_type_double;
-  cl_arg_types[7] = &ffi_type_sint;
-  cl_arg_types[8] = &ffi_type_double;
-  cl_arg_types[9] = &ffi_type_sint;
-  cl_arg_types[10] = &ffi_type_sint;
-  cl_arg_types[11] = &ffi_type_float;
-  cl_arg_types[12] = &ffi_type_sint;
-  cl_arg_types[13] = &ffi_type_float;
-  cl_arg_types[14] = &ffi_type_sint;
-  cl_arg_types[15] = &ffi_type_sint;
-  cl_arg_types[16] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
-		     &ffi_type_sint, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn2,
-                             (void *) 3 /* userdata */, code) == FFI_OK);
-
-  res = (*((closure_test_type2)code))
-    (1, 2, 3, 4, 127, 5, 6, 8, 9, 10, 11, 12.0, 13,
-     19.0, 21, 1);
-  /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 255" } */
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn3.c b/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn3.c
deleted file mode 100644
index 9b54d80..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn3.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check multiple values passing from different type.
-		Also, exceed the limit of gpr and fpr registers on PowerPC
-		Darwin.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void closure_test_fn3(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			     void* userdata)
- {
-   *(ffi_arg*)resp =
-     (int)*(float *)args[0] +(int)(*(float *)args[1]) +
-     (int)(*(float *)args[2]) + (int)*(float *)args[3] +
-     (int)(*(float *)args[4]) + (int)(*(float *)args[5]) +
-     (int)*(float *)args[6] + (int)(*(float *)args[7]) +
-     (int)(*(double *)args[8]) + (int)*(int *)args[9] +
-     (int)(*(float *)args[10]) + (int)(*(float *)args[11]) +
-     (int)*(int *)args[12] + (int)(*(float *)args[13]) +
-     (int)(*(float *)args[14]) +  *(int *)args[15] + (intptr_t)userdata;
-
-   printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
-	  (int)*(float *)args[0], (int)(*(float *)args[1]),
-	  (int)(*(float *)args[2]), (int)*(float *)args[3],
-	  (int)(*(float *)args[4]), (int)(*(float *)args[5]),
-	  (int)*(float *)args[6], (int)(*(float *)args[7]),
-	  (int)(*(double *)args[8]), (int)*(int *)args[9],
-	  (int)(*(float *)args[10]), (int)(*(float *)args[11]),
-	  (int)*(int *)args[12], (int)(*(float *)args[13]),
-	  (int)(*(float *)args[14]), *(int *)args[15], (int)(intptr_t)userdata,
-	  (int)*(ffi_arg *)resp);
-
- }
-
-typedef int (*closure_test_type3)(float, float, float, float, float, float,
-				  float, float, double, int, float, float, int,
-				  float, float, int);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[17];
-  int res;
-
-  cl_arg_types[0] = &ffi_type_float;
-  cl_arg_types[1] = &ffi_type_float;
-  cl_arg_types[2] = &ffi_type_float;
-  cl_arg_types[3] = &ffi_type_float;
-  cl_arg_types[4] = &ffi_type_float;
-  cl_arg_types[5] = &ffi_type_float;
-  cl_arg_types[6] = &ffi_type_float;
-  cl_arg_types[7] = &ffi_type_float;
-  cl_arg_types[8] = &ffi_type_double;
-  cl_arg_types[9] = &ffi_type_sint;
-  cl_arg_types[10] = &ffi_type_float;
-  cl_arg_types[11] = &ffi_type_float;
-  cl_arg_types[12] = &ffi_type_sint;
-  cl_arg_types[13] = &ffi_type_float;
-  cl_arg_types[14] = &ffi_type_float;
-  cl_arg_types[15] = &ffi_type_sint;
-  cl_arg_types[16] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
-		     &ffi_type_sint, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn3,
-                             (void *) 3 /* userdata */, code)  == FFI_OK);
-
-  res = (*((closure_test_type3)code))
-    (1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9, 10, 11.11, 12.0, 13,
-     19.19, 21.21, 1);
-  /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 19 21 1 3: 135" } */
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 135" } */
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn4.c b/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn4.c
deleted file mode 100644
index d4a1530..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn4.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check multiple long long values passing.
-		Also, exceed the limit of gpr and fpr registers on PowerPC
-		Darwin.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20031026	 */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-static void
-closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		 void* userdata)
-{
-  *(ffi_arg*)resp =
-    (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] +
-    (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] +
-    (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] +
-    (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] +
-    (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] +
-    (int)*(unsigned long long *)args[10] +
-    (int)*(unsigned long long *)args[11] +
-    (int)*(unsigned long long *)args[12] +
-    (int)*(unsigned long long *)args[13] +
-    (int)*(unsigned long long *)args[14] +
-    *(int *)args[15] + (intptr_t)userdata;
-
-  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
-	 (int)*(unsigned long long *)args[0],
-	 (int)*(unsigned long long *)args[1],
-	 (int)*(unsigned long long *)args[2],
-	 (int)*(unsigned long long *)args[3],
-	 (int)*(unsigned long long *)args[4],
-	 (int)*(unsigned long long *)args[5],
-	 (int)*(unsigned long long *)args[6],
-	 (int)*(unsigned long long *)args[7],
-	 (int)*(unsigned long long *)args[8],
-	 (int)*(unsigned long long *)args[9],
-	 (int)*(unsigned long long *)args[10],
-	 (int)*(unsigned long long *)args[11],
-	 (int)*(unsigned long long *)args[12],
-	 (int)*(unsigned long long *)args[13],
-	 (int)*(unsigned long long *)args[14],
-	 *(int *)args[15],
-	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
-
-}
-
-typedef int (*closure_test_type0)(unsigned long long, unsigned long long,
-				  unsigned long long, unsigned long long,
-				  unsigned long long, unsigned long long,
-				  unsigned long long, unsigned long long,
-				  unsigned long long, unsigned long long,
-				  unsigned long long, unsigned long long,
-				  unsigned long long, unsigned long long,
-				  unsigned long long, int);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[17];
-  int i, res;
-
-  for (i = 0; i < 15; i++) {
-    cl_arg_types[i] = &ffi_type_uint64;
-  }
-  cl_arg_types[15] = &ffi_type_sint;
-  cl_arg_types[16] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
-		     &ffi_type_sint, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0,
-                             (void *) 3 /* userdata */, code) == FFI_OK);
-
-  res = (*((closure_test_type0)code))
-    (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11LL, 12LL,
-     13LL, 19LL, 21LL, 1);
-  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 680" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn5.c b/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn5.c
deleted file mode 100644
index 9907442..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn5.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check multiple long long values passing.
-		Exceed the limit of gpr registers on PowerPC
-		Darwin.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20031026	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void
-closure_test_fn5(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		 void* userdata)
-{
-  *(ffi_arg*)resp =
-    (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] +
-    (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] +
-    (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] +
-    (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] +
-    (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] +
-    (int)*(int *)args[10] +
-    (int)*(unsigned long long *)args[11] +
-    (int)*(unsigned long long *)args[12] +
-    (int)*(unsigned long long *)args[13] +
-    (int)*(unsigned long long *)args[14] +
-    *(int *)args[15] + (intptr_t)userdata;
-
-  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
-	 (int)*(unsigned long long *)args[0],
-	 (int)*(unsigned long long *)args[1],
-	 (int)*(unsigned long long *)args[2],
-	 (int)*(unsigned long long *)args[3],
-	 (int)*(unsigned long long *)args[4],
-	 (int)*(unsigned long long *)args[5],
-	 (int)*(unsigned long long *)args[6],
-	 (int)*(unsigned long long *)args[7],
-	 (int)*(unsigned long long *)args[8],
-	 (int)*(unsigned long long *)args[9],
-	 (int)*(int *)args[10],
-	 (int)*(unsigned long long *)args[11],
-	 (int)*(unsigned long long *)args[12],
-	 (int)*(unsigned long long *)args[13],
-	 (int)*(unsigned long long *)args[14],
-	 *(int *)args[15],
-	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
-
-}
-
-typedef int (*closure_test_type0)(unsigned long long, unsigned long long,
-				  unsigned long long, unsigned long long,
-				  unsigned long long, unsigned long long,
-				  unsigned long long, unsigned long long,
-				  unsigned long long, unsigned long long,
-				  int, unsigned long long,
-				  unsigned long long, unsigned long long,
-				  unsigned long long, int);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[17];
-  int i, res;
-
-  for (i = 0; i < 10; i++) {
-    cl_arg_types[i] = &ffi_type_uint64;
-  }
-  cl_arg_types[10] = &ffi_type_sint;
-  for (i = 11; i < 15; i++) {
-    cl_arg_types[i] = &ffi_type_uint64;
-  }
-  cl_arg_types[15] = &ffi_type_sint;
-  cl_arg_types[16] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
-		     &ffi_type_sint, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn5,
-                             (void *) 3 /* userdata */, code) == FFI_OK);
-
-  res = (*((closure_test_type0)code))
-    (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11, 12LL,
-     13LL, 19LL, 21LL, 1);
-  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 680" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn6.c b/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn6.c
deleted file mode 100644
index 73c54fd..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_fn6.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check multiple values passing from different type.
-		Also, exceed the limit of gpr and fpr registers on PowerPC.
-   Limitations:	none.
-   PR:		PR23404
-   Originator:	<andreast@gcc.gnu.org> 20050830	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void
-closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		 void* userdata)
-{
-  *(ffi_arg*)resp =
-    (int)*(unsigned long long *)args[0] +
-    (int)(*(unsigned long long *)args[1]) +
-    (int)(*(unsigned long long *)args[2]) +
-    (int)*(unsigned long long *)args[3] +
-    (int)(*(int *)args[4]) + (int)(*(double *)args[5]) +
-    (int)*(double *)args[6] + (int)(*(float *)args[7]) +
-    (int)(*(double *)args[8]) + (int)*(double *)args[9] +
-    (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
-    (int)*(int *)args[12] + (int)(*(int *)args[13]) +
-    (int)(*(double *)args[14]) +  (int)*(double *)args[15] +
-    (intptr_t)userdata;
-
-  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
-	 (int)*(unsigned long long  *)args[0],
-	 (int)(*(unsigned long long  *)args[1]),
-	 (int)(*(unsigned long long  *)args[2]),
-	 (int)*(unsigned long long  *)args[3],
-	 (int)(*(int *)args[4]), (int)(*(double *)args[5]),
-	 (int)*(double *)args[6], (int)(*(float *)args[7]),
-	 (int)(*(double *)args[8]), (int)*(double *)args[9],
-	 (int)(*(int *)args[10]), (int)(*(float *)args[11]),
-	 (int)*(int *)args[12], (int)(*(int *)args[13]),
-	 (int)(*(double *)args[14]), (int)(*(double *)args[15]),
-	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
-
-}
-
-typedef int (*closure_test_type0)(unsigned long long,
-				  unsigned long long,
-				  unsigned long long,
-				  unsigned long long,
-				  int, double, double, float, double, double,
-				  int, float, int, int, double, double);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[17];
-  int res;
-
-  cl_arg_types[0] = &ffi_type_uint64;
-  cl_arg_types[1] = &ffi_type_uint64;
-  cl_arg_types[2] = &ffi_type_uint64;
-  cl_arg_types[3] = &ffi_type_uint64;
-  cl_arg_types[4] = &ffi_type_sint;
-  cl_arg_types[5] = &ffi_type_double;
-  cl_arg_types[6] = &ffi_type_double;
-  cl_arg_types[7] = &ffi_type_float;
-  cl_arg_types[8] = &ffi_type_double;
-  cl_arg_types[9] = &ffi_type_double;
-  cl_arg_types[10] = &ffi_type_sint;
-  cl_arg_types[11] = &ffi_type_float;
-  cl_arg_types[12] = &ffi_type_sint;
-  cl_arg_types[13] = &ffi_type_sint;
-  cl_arg_types[14] = &ffi_type_double;
-  cl_arg_types[15] = &ffi_type_double;
-  cl_arg_types[16] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
-		     &ffi_type_sint, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0,
-                             (void *) 3 /* userdata */, code) == FFI_OK);
-
-  res = (*((closure_test_type0)code))
-    (1, 2, 3, 4, 127, 429., 7., 8., 9.5, 10., 11, 12., 13,
-     19, 21., 1.);
-  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 680" } */
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_loc_fn0.c b/third_party/gofrontend/libffi/testsuite/libffi.call/closure_loc_fn0.c
deleted file mode 100644
index b3afa0b..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_loc_fn0.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check multiple values passing from different type.
-		Also, exceed the limit of gpr and fpr registers on PowerPC
-		Darwin.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-
-
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void
-closure_loc_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		 void* userdata)
-{
-  *(ffi_arg*)resp =
-    (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) +
-    (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] +
-    (int)(*(signed short *)args[4]) +
-    (int)(*(unsigned long long *)args[5]) +
-    (int)*(int *)args[6] + (int)(*(int *)args[7]) +
-    (int)(*(double *)args[8]) + (int)*(int *)args[9] +
-    (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
-    (int)*(int *)args[12] + (int)(*(int *)args[13]) +
-    (int)(*(int *)args[14]) +  *(int *)args[15] + (intptr_t)userdata;
-
-  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
-	 (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]),
-	 (int)(*(unsigned long long *)args[2]),
-	 (int)*(int *)args[3], (int)(*(signed short *)args[4]),
-	 (int)(*(unsigned long long *)args[5]),
-	 (int)*(int *)args[6], (int)(*(int *)args[7]),
-	 (int)(*(double *)args[8]), (int)*(int *)args[9],
-	 (int)(*(int *)args[10]), (int)(*(float *)args[11]),
-	 (int)*(int *)args[12], (int)(*(int *)args[13]),
-	 (int)(*(int *)args[14]),*(int *)args[15],
-	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
-
-}
-
-typedef int (*closure_loc_test_type0)(unsigned long long, int, unsigned long long,
-				  int, signed short, unsigned long long, int,
-				  int, double, int, int, float, int, int,
-				  int, int);
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_closure *pcl;
-  ffi_type * cl_arg_types[17];
-  int res;
-  void *codeloc;
-
-  cl_arg_types[0] = &ffi_type_uint64;
-  cl_arg_types[1] = &ffi_type_sint;
-  cl_arg_types[2] = &ffi_type_uint64;
-  cl_arg_types[3] = &ffi_type_sint;
-  cl_arg_types[4] = &ffi_type_sshort;
-  cl_arg_types[5] = &ffi_type_uint64;
-  cl_arg_types[6] = &ffi_type_sint;
-  cl_arg_types[7] = &ffi_type_sint;
-  cl_arg_types[8] = &ffi_type_double;
-  cl_arg_types[9] = &ffi_type_sint;
-  cl_arg_types[10] = &ffi_type_sint;
-  cl_arg_types[11] = &ffi_type_float;
-  cl_arg_types[12] = &ffi_type_sint;
-  cl_arg_types[13] = &ffi_type_sint;
-  cl_arg_types[14] = &ffi_type_sint;
-  cl_arg_types[15] = &ffi_type_sint;
-  cl_arg_types[16] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
-		     &ffi_type_sint, cl_arg_types) == FFI_OK);
-
-  pcl = ffi_closure_alloc(sizeof(ffi_closure), &codeloc);
-  CHECK(pcl != NULL);
-  CHECK(codeloc != NULL);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_loc_test_fn0,
-			 (void *) 3 /* userdata */, codeloc) == FFI_OK);
-  
-  CHECK(memcmp(pcl, codeloc, sizeof(*pcl)) == 0);
-
-  res = (*((closure_loc_test_type0)codeloc))
-    (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13,
-     19, 21, 1);
-  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 680" } */
-     exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_simple.c b/third_party/gofrontend/libffi/testsuite/libffi.call/closure_simple.c
deleted file mode 100644
index 5a4e728..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/closure_simple.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check simple closure handling with all ABIs
-   Limitations:	none.
-   PR:		none.
-   Originator:	<twalljava@dev.java.net> */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void
-closure_test(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata)
-{
-  *(ffi_arg*)resp =
-    (int)*(int *)args[0] + (int)(*(int *)args[1])
-    + (int)(*(int *)args[2])  + (int)(*(int *)args[3])
-    + (int)(intptr_t)userdata;
-
-  printf("%d %d %d %d: %d\n",
-	 (int)*(int *)args[0], (int)(*(int *)args[1]),
-	 (int)(*(int *)args[2]), (int)(*(int *)args[3]),
-         (int)*(ffi_arg *)resp);
-
-}
-
-typedef int (ABI_ATTR *closure_test_type0)(int, int, int, int);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[17];
-  int res;
-
-  cl_arg_types[0] = &ffi_type_uint;
-  cl_arg_types[1] = &ffi_type_uint;
-  cl_arg_types[2] = &ffi_type_uint;
-  cl_arg_types[3] = &ffi_type_uint;
-  cl_arg_types[4] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 4,
-		     &ffi_type_sint, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test,
-                             (void *) 3 /* userdata */, code) == FFI_OK);
-
-  res = (*(closure_test_type0)code)(0, 1, 2, 3);
-  /* { dg-output "0 1 2 3: 9" } */
-
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 9" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_12byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_12byte.c
deleted file mode 100644
index ea0825d..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_12byte.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_12byte {
-  int a;
-  int b;
-  int c;
-} cls_struct_12byte;
-
-cls_struct_12byte cls_struct_12byte_fn(struct cls_struct_12byte b1,
-			    struct cls_struct_12byte b2)
-{
-  struct cls_struct_12byte result;
-
-  result.a = b1.a + b2.a;
-  result.b = b1.b + b2.b;
-  result.c = b1.c + b2.c;
-
-  printf("%d %d %d %d %d %d: %d %d %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c,
-	 result.a, result.b, result.c);
-
-  return result;
-}
-
-static void cls_struct_12byte_gn(ffi_cif* cif __UNUSED__, void* resp,
-				 void** args , void* userdata __UNUSED__)
-{
-  struct cls_struct_12byte b1, b2;
-
-  b1 = *(struct cls_struct_12byte*)(args[0]);
-  b2 = *(struct cls_struct_12byte*)(args[1]);
-
-  *(cls_struct_12byte*)resp = cls_struct_12byte_fn(b1, b2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_12byte h_dbl = { 7, 4, 9 };
-  struct cls_struct_12byte j_dbl = { 1, 5, 3 };
-  struct cls_struct_12byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_sint;
-  cls_struct_fields[1] = &ffi_type_sint;
-  cls_struct_fields[2] = &ffi_type_sint;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &h_dbl;
-  args_dbl[1] = &j_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_12byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "7 4 9 1 5 3: 8 9 12" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 8 9 12" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_12byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl.a = 0;
-  res_dbl.b = 0;
-  res_dbl.c = 0;
-
-  res_dbl = ((cls_struct_12byte(*)(cls_struct_12byte, cls_struct_12byte))(code))(h_dbl, j_dbl);
-  /* { dg-output "\n7 4 9 1 5 3: 8 9 12" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 8 9 12" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_16byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_16byte.c
deleted file mode 100644
index 89a08a2..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_16byte.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_16byte {
-  int a;
-  double b;
-  int c;
-} cls_struct_16byte;
-
-cls_struct_16byte cls_struct_16byte_fn(struct cls_struct_16byte b1,
-			    struct cls_struct_16byte b2)
-{
-  struct cls_struct_16byte result;
-
-  result.a = b1.a + b2.a;
-  result.b = b1.b + b2.b;
-  result.c = b1.c + b2.c;
-
-  printf("%d %g %d %d %g %d: %d %g %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c,
-	 result.a, result.b, result.c);
-
-  return result;
-}
-
-static void cls_struct_16byte_gn(ffi_cif* cif __UNUSED__, void* resp,
-				 void** args, void* userdata __UNUSED__)
-{
-  struct cls_struct_16byte b1, b2;
-
-  b1 = *(struct cls_struct_16byte*)(args[0]);
-  b2 = *(struct cls_struct_16byte*)(args[1]);
-
-  *(cls_struct_16byte*)resp = cls_struct_16byte_fn(b1, b2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_16byte h_dbl = { 7, 8.0, 9 };
-  struct cls_struct_16byte j_dbl = { 1, 9.0, 3 };
-  struct cls_struct_16byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_sint;
-  cls_struct_fields[1] = &ffi_type_double;
-  cls_struct_fields[2] = &ffi_type_sint;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &h_dbl;
-  args_dbl[1] = &j_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_16byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "7 8 9 1 9 3: 8 17 12" } */
-  printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 8 17 12" } */
-
-  res_dbl.a = 0;
-  res_dbl.b = 0.0;
-  res_dbl.c = 0;
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_16byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_16byte(*)(cls_struct_16byte, cls_struct_16byte))(code))(h_dbl, j_dbl);
-  /* { dg-output "\n7 8 9 1 9 3: 8 17 12" } */
-  printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 8 17 12" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_18byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_18byte.c
deleted file mode 100644
index 9f75da8..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_18byte.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Double alignment check on darwin.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030915	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_18byte {
-  double a;
-  unsigned char b;
-  unsigned char c;
-  double d;
-} cls_struct_18byte;
-
-cls_struct_18byte cls_struct_18byte_fn(struct cls_struct_18byte a1,
-			    struct cls_struct_18byte a2)
-{
-  struct cls_struct_18byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-  result.d = a1.d + a2.d;
-
-
-  printf("%g %d %d %g %g %d %d %g: %g %d %d %g\n", a1.a, a1.b, a1.c, a1.d,
-	 a2.a, a2.b, a2.c, a2.d,
-	 result.a, result.b, result.c, result.d);
-  return result;
-}
-
-static void
-cls_struct_18byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		     void* userdata __UNUSED__)
-{
-  struct cls_struct_18byte a1, a2;
-
-  a1 = *(struct cls_struct_18byte*)(args[0]);
-  a2 = *(struct cls_struct_18byte*)(args[1]);
-
-  *(cls_struct_18byte*)resp = cls_struct_18byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[3];
-  ffi_type* cls_struct_fields[5];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[3];
-
-  struct cls_struct_18byte g_dbl = { 1.0, 127, 126, 3.0 };
-  struct cls_struct_18byte f_dbl = { 4.0, 125, 124, 5.0 };
-  struct cls_struct_18byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_double;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = &ffi_type_double;
-  cls_struct_fields[4] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_18byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 127 126 3 4 125 124 5: 5 252 250 8" } */
-  printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
-  /* { dg-output "\nres: 5 252 250 8" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_18byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_18byte(*)(cls_struct_18byte, cls_struct_18byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n1 127 126 3 4 125 124 5: 5 252 250 8" } */
-  printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
-  /* { dg-output "\nres: 5 252 250 8" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_19byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_19byte.c
deleted file mode 100644
index 278794b..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_19byte.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Double alignment check on darwin.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030915	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_19byte {
-  double a;
-  unsigned char b;
-  unsigned char c;
-  double d;
-  unsigned char e;
-} cls_struct_19byte;
-
-cls_struct_19byte cls_struct_19byte_fn(struct cls_struct_19byte a1,
-			    struct cls_struct_19byte a2)
-{
-  struct cls_struct_19byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-  result.d = a1.d + a2.d;
-  result.e = a1.e + a2.e;
-
-
-  printf("%g %d %d %g %d %g %d %d %g %d: %g %d %d %g %d\n",
-	 a1.a, a1.b, a1.c, a1.d, a1.e,
-	 a2.a, a2.b, a2.c, a2.d, a2.e,
-	 result.a, result.b, result.c, result.d, result.e);
-  return result;
-}
-
-static void
-cls_struct_19byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		     void* userdata __UNUSED__)
-{
-  struct cls_struct_19byte a1, a2;
-
-  a1 = *(struct cls_struct_19byte*)(args[0]);
-  a2 = *(struct cls_struct_19byte*)(args[1]);
-
-  *(cls_struct_19byte*)resp = cls_struct_19byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[3];
-  ffi_type* cls_struct_fields[6];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[3];
-
-  struct cls_struct_19byte g_dbl = { 1.0, 127, 126, 3.0, 120 };
-  struct cls_struct_19byte f_dbl = { 4.0, 125, 124, 5.0, 119 };
-  struct cls_struct_19byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_double;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = &ffi_type_double;
-  cls_struct_fields[4] = &ffi_type_uchar;
-  cls_struct_fields[5] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_19byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */
-  printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
-	 res_dbl.d, res_dbl.e);
-  /* { dg-output "\nres: 5 252 250 8 239" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_19byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_19byte(*)(cls_struct_19byte, cls_struct_19byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */
-  printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
-	 res_dbl.d, res_dbl.e);
-  /* { dg-output "\nres: 5 252 250 8 239" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_1_1byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_1_1byte.c
deleted file mode 100644
index 82492c0..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_1_1byte.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Especially with small structures which may fit in one
-		register. Depending on the ABI.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030902	 */
-
-
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_1_1byte {
-  unsigned char a;
-} cls_struct_1_1byte;
-
-cls_struct_1_1byte cls_struct_1_1byte_fn(struct cls_struct_1_1byte a1,
-			    struct cls_struct_1_1byte a2)
-{
-  struct cls_struct_1_1byte result;
-
-  result.a = a1.a + a2.a;
-
-  printf("%d %d: %d\n", a1.a, a2.a, result.a);
-
-  return  result;
-}
-
-static void
-cls_struct_1_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		      void* userdata __UNUSED__)
-{
-
-  struct cls_struct_1_1byte a1, a2;
-
-  a1 = *(struct cls_struct_1_1byte*)(args[0]);
-  a2 = *(struct cls_struct_1_1byte*)(args[1]);
-
-  *(cls_struct_1_1byte*)resp = cls_struct_1_1byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[2];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_1_1byte g_dbl = { 12 };
-  struct cls_struct_1_1byte f_dbl = { 178 };
-  struct cls_struct_1_1byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_1_1byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 178: 190" } */
-  printf("res: %d\n", res_dbl.a);
-  /* { dg-output "\nres: 190" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_1_1byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_1_1byte(*)(cls_struct_1_1byte, cls_struct_1_1byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 178: 190" } */
-  printf("res: %d\n", res_dbl.a);
-  /* { dg-output "\nres: 190" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_20byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_20byte.c
deleted file mode 100644
index 3f8bb28..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_20byte.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_20byte {
-  double a;
-  double b;
-  int c;
-} cls_struct_20byte;
-
-cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1,
-			    struct cls_struct_20byte a2)
-{
-  struct cls_struct_20byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%g %g %d %g %g %d: %g %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c,
-	 result.a, result.b, result.c);
-  return result;
-}
-
-static void
-cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		     void* userdata __UNUSED__)
-{
-  struct cls_struct_20byte a1, a2;
-
-  a1 = *(struct cls_struct_20byte*)(args[0]);
-  a2 = *(struct cls_struct_20byte*)(args[1]);
-
-  *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_20byte g_dbl = { 1.0, 2.0, 3 };
-  struct cls_struct_20byte f_dbl = { 4.0, 5.0, 7 };
-  struct cls_struct_20byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_double;
-  cls_struct_fields[1] = &ffi_type_double;
-  cls_struct_fields[2] = &ffi_type_sint;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 2 3 4 5 7: 5 7 10" } */
-  printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 5 7 10" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */
-  printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 5 7 10" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_20byte1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_20byte1.c
deleted file mode 100644
index 6562727..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_20byte1.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_20byte {
-  int a;
-  double b;
-  double c;
-} cls_struct_20byte;
-
-cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1,
-			    struct cls_struct_20byte a2)
-{
-  struct cls_struct_20byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%d %g %g %d %g %g: %d %g %g\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c,
-	 result.a, result.b, result.c);
-  return result;
-}
-
-static void
-cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		     void* userdata __UNUSED__)
-{
-  struct cls_struct_20byte a1, a2;
-
-  a1 = *(struct cls_struct_20byte*)(args[0]);
-  a2 = *(struct cls_struct_20byte*)(args[1]);
-
-  *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[3];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[3];
-
-  struct cls_struct_20byte g_dbl = { 1, 2.0, 3.0 };
-  struct cls_struct_20byte f_dbl = { 4, 5.0, 7.0 };
-  struct cls_struct_20byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_sint;
-  cls_struct_fields[1] = &ffi_type_double;
-  cls_struct_fields[2] = &ffi_type_double;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 2 3 4 5 7: 5 7 10" } */
-  printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 5 7 10" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */
-  printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 5 7 10" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_24byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_24byte.c
deleted file mode 100644
index 1d82f6e..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_24byte.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_24byte {
-  double a;
-  double b;
-  int c;
-  float d;
-} cls_struct_24byte;
-
-cls_struct_24byte cls_struct_24byte_fn(struct cls_struct_24byte b0,
-			    struct cls_struct_24byte b1,
-			    struct cls_struct_24byte b2,
-			    struct cls_struct_24byte b3)
-{
-  struct cls_struct_24byte result;
-
-  result.a = b0.a + b1.a + b2.a + b3.a;
-  result.b = b0.b + b1.b + b2.b + b3.b;
-  result.c = b0.c + b1.c + b2.c + b3.c;
-  result.d = b0.d + b1.d + b2.d + b3.d;
-
-  printf("%g %g %d %g %g %g %d %g %g %g %d %g %g %g %d %g: %g %g %d %g\n",
-	 b0.a, b0.b, b0.c, b0.d,
-	 b1.a, b1.b, b1.c, b1.d,
-	 b2.a, b2.b, b2.c, b2.d,
-	 b3.a, b3.b, b3.c, b2.d,
-	 result.a, result.b, result.c, result.d);
-
-  return result;
-}
-
-static void
-cls_struct_24byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		     void* userdata __UNUSED__)
-{
-  struct cls_struct_24byte b0, b1, b2, b3;
-
-  b0 = *(struct cls_struct_24byte*)(args[0]);
-  b1 = *(struct cls_struct_24byte*)(args[1]);
-  b2 = *(struct cls_struct_24byte*)(args[2]);
-  b3 = *(struct cls_struct_24byte*)(args[3]);
-
-  *(cls_struct_24byte*)resp = cls_struct_24byte_fn(b0, b1, b2, b3);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[5];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_24byte e_dbl = { 9.0, 2.0, 6, 5.0 };
-  struct cls_struct_24byte f_dbl = { 1.0, 2.0, 3, 7.0 };
-  struct cls_struct_24byte g_dbl = { 4.0, 5.0, 7, 9.0 };
-  struct cls_struct_24byte h_dbl = { 8.0, 6.0, 1, 4.0 };
-  struct cls_struct_24byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_double;
-  cls_struct_fields[1] = &ffi_type_double;
-  cls_struct_fields[2] = &ffi_type_sint;
-  cls_struct_fields[3] = &ffi_type_float;
-  cls_struct_fields[4] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = &cls_struct_type;
-  dbl_arg_types[3] = &cls_struct_type;
-  dbl_arg_types[4] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &e_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = &g_dbl;
-  args_dbl[3] = &h_dbl;
-  args_dbl[4] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_24byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */
-  printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
-  /* { dg-output "\nres: 22 15 17 25" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_24byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_24byte(*)(cls_struct_24byte,
-				   cls_struct_24byte,
-				   cls_struct_24byte,
-				   cls_struct_24byte))
-	     (code))(e_dbl, f_dbl, g_dbl, h_dbl);
-  /* { dg-output "\n9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */
-  printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
-  /* { dg-output "\nres: 22 15 17 25" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_2byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_2byte.c
deleted file mode 100644
index 81bb0a6..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_2byte.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Especially with small structures which may fit in one
-		register. Depending on the ABI.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_2byte {
-  unsigned char a;
-  unsigned char b;
-} cls_struct_2byte;
-
-cls_struct_2byte cls_struct_2byte_fn(struct cls_struct_2byte a1,
-			    struct cls_struct_2byte a2)
-{
-  struct cls_struct_2byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-
-  printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
-
-  return  result;
-}
-
-static void
-cls_struct_2byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_2byte a1, a2;
-
-  a1 = *(struct cls_struct_2byte*)(args[0]);
-  a2 = *(struct cls_struct_2byte*)(args[1]);
-
-  *(cls_struct_2byte*)resp = cls_struct_2byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_2byte g_dbl = { 12, 127 };
-  struct cls_struct_2byte f_dbl = { 1, 13 };
-  struct cls_struct_2byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_2byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 127 1 13: 13 140" } */
-  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 13 140" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_2byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_2byte(*)(cls_struct_2byte, cls_struct_2byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 127 1 13: 13 140" } */
-  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 13 140" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_3_1byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_3_1byte.c
deleted file mode 100644
index b782746..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_3_1byte.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Especially with small structures which may fit in one
-		register. Depending on the ABI.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030902	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_3_1byte {
-  unsigned char a;
-  unsigned char b;
-  unsigned char c;
-} cls_struct_3_1byte;
-
-cls_struct_3_1byte cls_struct_3_1byte_fn(struct cls_struct_3_1byte a1,
-			    struct cls_struct_3_1byte a2)
-{
-  struct cls_struct_3_1byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c,
-	 a2.a, a2.b, a2.c,
-	 result.a, result.b, result.c);
-
-  return  result;
-}
-
-static void
-cls_struct_3_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		      void* userdata __UNUSED__)
-{
-
-  struct cls_struct_3_1byte a1, a2;
-
-  a1 = *(struct cls_struct_3_1byte*)(args[0]);
-  a2 = *(struct cls_struct_3_1byte*)(args[1]);
-
-  *(cls_struct_3_1byte*)resp = cls_struct_3_1byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_3_1byte g_dbl = { 12, 13, 14 };
-  struct cls_struct_3_1byte f_dbl = { 178, 179, 180 };
-  struct cls_struct_3_1byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_3_1byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 13 14 178 179 180: 190 192 194" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 190 192 194" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3_1byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_3_1byte(*)(cls_struct_3_1byte, cls_struct_3_1byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 13 14 178 179 180: 190 192 194" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 190 192 194" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_3byte1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_3byte1.c
deleted file mode 100644
index a02c463..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_3byte1.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Especially with small structures which may fit in one
-		register. Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_3byte {
-  unsigned short a;
-  unsigned char b;
-} cls_struct_3byte;
-
-cls_struct_3byte cls_struct_3byte_fn(struct cls_struct_3byte a1,
-			    struct cls_struct_3byte a2)
-{
-  struct cls_struct_3byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-
-  printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
-
-  return  result;
-}
-
-static void
-cls_struct_3byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_3byte a1, a2;
-
-  a1 = *(struct cls_struct_3byte*)(args[0]);
-  a2 = *(struct cls_struct_3byte*)(args[1]);
-
-  *(cls_struct_3byte*)resp = cls_struct_3byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_3byte g_dbl = { 12, 119 };
-  struct cls_struct_3byte f_dbl = { 1, 15 };
-  struct cls_struct_3byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_ushort;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_3byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 119 1 15: 13 134" } */
-  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 13 134" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_3byte(*)(cls_struct_3byte, cls_struct_3byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 119 1 15: 13 134" } */
-  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 13 134" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_3byte2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_3byte2.c
deleted file mode 100644
index c7251ce..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_3byte2.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Especially with small structures which may fit in one
-		register. Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_3byte_1 {
-  unsigned char a;
-  unsigned short b;
-} cls_struct_3byte_1;
-
-cls_struct_3byte_1 cls_struct_3byte_fn1(struct cls_struct_3byte_1 a1,
-			    struct cls_struct_3byte_1 a2)
-{
-  struct cls_struct_3byte_1 result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-
-  printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
-
-  return  result;
-}
-
-static void
-cls_struct_3byte_gn1(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		     void* userdata __UNUSED__)
-{
-
-  struct cls_struct_3byte_1 a1, a2;
-
-  a1 = *(struct cls_struct_3byte_1*)(args[0]);
-  a2 = *(struct cls_struct_3byte_1*)(args[1]);
-
-  *(cls_struct_3byte_1*)resp = cls_struct_3byte_fn1(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_3byte_1 g_dbl = { 15, 125 };
-  struct cls_struct_3byte_1 f_dbl = { 9, 19 };
-  struct cls_struct_3byte_1 res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_ushort;
-  cls_struct_fields[2] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_3byte_fn1), &res_dbl, args_dbl);
-  /* { dg-output "15 125 9 19: 24 144" } */
-  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 24 144" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn1, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_3byte_1(*)(cls_struct_3byte_1, cls_struct_3byte_1))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n15 125 9 19: 24 144" } */
-  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 24 144" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_4_1byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_4_1byte.c
deleted file mode 100644
index 2d6d8b6..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_4_1byte.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Especially with small structures which may fit in one
-		register. Depending on the ABI.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030902	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_4_1byte {
-  unsigned char a;
-  unsigned char b;
-  unsigned char c;
-  unsigned char d;
-} cls_struct_4_1byte;
-
-cls_struct_4_1byte cls_struct_4_1byte_fn(struct cls_struct_4_1byte a1,
-			    struct cls_struct_4_1byte a2)
-{
-  struct cls_struct_4_1byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-  result.d = a1.d + a2.d;
-
-  printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d,
-	 a2.a, a2.b, a2.c, a2.d,
-	 result.a, result.b, result.c, result.d);
-
-  return  result;
-}
-
-static void
-cls_struct_4_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		      void* userdata __UNUSED__)
-{
-
-  struct cls_struct_4_1byte a1, a2;
-
-  a1 = *(struct cls_struct_4_1byte*)(args[0]);
-  a2 = *(struct cls_struct_4_1byte*)(args[1]);
-
-  *(cls_struct_4_1byte*)resp = cls_struct_4_1byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[5];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_4_1byte g_dbl = { 12, 13, 14, 15 };
-  struct cls_struct_4_1byte f_dbl = { 178, 179, 180, 181 };
-  struct cls_struct_4_1byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = &ffi_type_uchar;
-  cls_struct_fields[4] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_4_1byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 13 14 15 178 179 180 181: 190 192 194 196" } */
-  printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
-  /* { dg-output "\nres: 190 192 194 196" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4_1byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_4_1byte(*)(cls_struct_4_1byte, cls_struct_4_1byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 13 14 15 178 179 180 181: 190 192 194 196" } */
-  printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
-  /* { dg-output "\nres: 190 192 194 196" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_4byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_4byte.c
deleted file mode 100644
index 4ac3787..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_4byte.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-typedef struct cls_struct_4byte {
-  unsigned short a;
-  unsigned short b;
-} cls_struct_4byte;
-
-cls_struct_4byte cls_struct_4byte_fn(struct cls_struct_4byte a1,
-			    struct cls_struct_4byte a2)
-{
-  struct cls_struct_4byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-
-  printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
-
-  return  result;
-}
-
-static void
-cls_struct_4byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_4byte a1, a2;
-
-  a1 = *(struct cls_struct_4byte*)(args[0]);
-  a2 = *(struct cls_struct_4byte*)(args[1]);
-
-  *(cls_struct_4byte*)resp = cls_struct_4byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_4byte g_dbl = { 127, 120 };
-  struct cls_struct_4byte f_dbl = { 12, 128 };
-  struct cls_struct_4byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_ushort;
-  cls_struct_fields[1] = &ffi_type_ushort;
-  cls_struct_fields[2] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_4byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "127 120 12 128: 139 248" } */
-  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 139 248" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_4byte(*)(cls_struct_4byte, cls_struct_4byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n127 120 12 128: 139 248" } */
-  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 139 248" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_5_1_byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_5_1_byte.c
deleted file mode 100644
index ad9d51c..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_5_1_byte.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20050708	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_5byte {
-  unsigned char a;
-  unsigned char b;
-  unsigned char c;
-  unsigned char d;
-  unsigned char e;
-} cls_struct_5byte;
-
-cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1,
-			    struct cls_struct_5byte a2)
-{
-  struct cls_struct_5byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-  result.d = a1.d + a2.d;
-  result.e = a1.e + a2.e;
-
-  printf("%d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d\n",
-	 a1.a, a1.b, a1.c, a1.d, a1.e,
-	 a2.a, a2.b, a2.c, a2.d, a2.e,
-	 result.a, result.b, result.c, result.d, result.e);
-
-  return  result;
-}
-
-static void
-cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_5byte a1, a2;
-
-  a1 = *(struct cls_struct_5byte*)(args[0]);
-  a2 = *(struct cls_struct_5byte*)(args[1]);
-
-  *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[6];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_5byte g_dbl = { 127, 120, 1, 3, 4 };
-  struct cls_struct_5byte f_dbl = { 12, 128, 9, 3, 4 };
-  struct cls_struct_5byte res_dbl = { 0, 0, 0, 0, 0 };
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = &ffi_type_uchar;
-  cls_struct_fields[4] = &ffi_type_uchar;
-  cls_struct_fields[5] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */
-  printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
-	 res_dbl.d, res_dbl.e);
-  /* { dg-output "\nres: 139 248 10 6 8" } */
-
-  res_dbl.a = 0;
-  res_dbl.b = 0;
-  res_dbl.c = 0;
-  res_dbl.d = 0;
-  res_dbl.e = 0;
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */
-  printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
-	 res_dbl.d, res_dbl.e);
-  /* { dg-output "\nres: 139 248 10 6 8" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_5byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_5byte.c
deleted file mode 100644
index 4e0c000..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_5byte.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_5byte {
-  unsigned short a;
-  unsigned short b;
-  unsigned char c;
-} cls_struct_5byte;
-
-cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1,
-			    struct cls_struct_5byte a2)
-{
-  struct cls_struct_5byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c,
-	 a2.a, a2.b, a2.c,
-	 result.a, result.b, result.c);
-
-  return  result;
-}
-
-static void
-cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_5byte a1, a2;
-
-  a1 = *(struct cls_struct_5byte*)(args[0]);
-  a2 = *(struct cls_struct_5byte*)(args[1]);
-
-  *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_5byte g_dbl = { 127, 120, 1 };
-  struct cls_struct_5byte f_dbl = { 12, 128, 9 };
-  struct cls_struct_5byte res_dbl = { 0, 0, 0 };
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_ushort;
-  cls_struct_fields[1] = &ffi_type_ushort;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "127 120 1 12 128 9: 139 248 10" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 139 248 10" } */
-
-  res_dbl.a = 0;
-  res_dbl.b = 0;
-  res_dbl.c = 0;
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n127 120 1 12 128 9: 139 248 10" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 139 248 10" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_64byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_64byte.c
deleted file mode 100644
index a55edc2..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_64byte.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Check bigger struct which overlaps
-		the gp and fp register count on Darwin/AIX/ppc64.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_64byte {
-  double a;
-  double b;
-  double c;
-  double d;
-  double e;
-  double f;
-  double g;
-  double h;
-} cls_struct_64byte;
-
-cls_struct_64byte cls_struct_64byte_fn(struct cls_struct_64byte b0,
-			    struct cls_struct_64byte b1,
-			    struct cls_struct_64byte b2,
-			    struct cls_struct_64byte b3)
-{
-  struct cls_struct_64byte result;
-
-  result.a = b0.a + b1.a + b2.a + b3.a;
-  result.b = b0.b + b1.b + b2.b + b3.b;
-  result.c = b0.c + b1.c + b2.c + b3.c;
-  result.d = b0.d + b1.d + b2.d + b3.d;
-  result.e = b0.e + b1.e + b2.e + b3.e;
-  result.f = b0.f + b1.f + b2.f + b3.f;
-  result.g = b0.g + b1.g + b2.g + b3.g;
-  result.h = b0.h + b1.h + b2.h + b3.h;
-
-  printf("%g %g %g %g %g %g %g %g\n", result.a, result.b, result.c,
-	 result.d, result.e, result.f, result.g, result.h);
-
-  return result;
-}
-
-static void
-cls_struct_64byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		     void* userdata __UNUSED__)
-{
-  struct cls_struct_64byte b0, b1, b2, b3;
-
-  b0 = *(struct cls_struct_64byte*)(args[0]);
-  b1 = *(struct cls_struct_64byte*)(args[1]);
-  b2 = *(struct cls_struct_64byte*)(args[2]);
-  b3 = *(struct cls_struct_64byte*)(args[3]);
-
-  *(cls_struct_64byte*)resp = cls_struct_64byte_fn(b0, b1, b2, b3);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[9];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_64byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0 };
-  struct cls_struct_64byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0 };
-  struct cls_struct_64byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0 };
-  struct cls_struct_64byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0 };
-  struct cls_struct_64byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_double;
-  cls_struct_fields[1] = &ffi_type_double;
-  cls_struct_fields[2] = &ffi_type_double;
-  cls_struct_fields[3] = &ffi_type_double;
-  cls_struct_fields[4] = &ffi_type_double;
-  cls_struct_fields[5] = &ffi_type_double;
-  cls_struct_fields[6] = &ffi_type_double;
-  cls_struct_fields[7] = &ffi_type_double;
-  cls_struct_fields[8] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = &cls_struct_type;
-  dbl_arg_types[3] = &cls_struct_type;
-  dbl_arg_types[4] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &e_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = &g_dbl;
-  args_dbl[3] = &h_dbl;
-  args_dbl[4] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_64byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "22 15 17 25 6 13 19 18" } */
-  printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c,
-	 res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h);
-  /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_64byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_64byte(*)(cls_struct_64byte,
-				   cls_struct_64byte,
-				   cls_struct_64byte,
-				   cls_struct_64byte))
-	     (code))(e_dbl, f_dbl, g_dbl, h_dbl);
-  /* { dg-output "\n22 15 17 25 6 13 19 18" } */
-  printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c,
-	 res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h);
-  /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_6_1_byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_6_1_byte.c
deleted file mode 100644
index b4dcdba..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_6_1_byte.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20050708	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_6byte {
-  unsigned char a;
-  unsigned char b;
-  unsigned char c;
-  unsigned char d;
-  unsigned char e;
-  unsigned char f;
-} cls_struct_6byte;
-
-cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1,
-			    struct cls_struct_6byte a2)
-{
-  struct cls_struct_6byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-  result.d = a1.d + a2.d;
-  result.e = a1.e + a2.e;
-  result.f = a1.f + a2.f;
-
-  printf("%d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d\n",
-	 a1.a, a1.b, a1.c, a1.d, a1.e, a1.f,
-	 a2.a, a2.b, a2.c, a2.d, a2.e, a2.f,
-	 result.a, result.b, result.c, result.d, result.e, result.f);
-
-  return  result;
-}
-
-static void
-cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_6byte a1, a2;
-
-  a1 = *(struct cls_struct_6byte*)(args[0]);
-  a2 = *(struct cls_struct_6byte*)(args[1]);
-
-  *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[7];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_6byte g_dbl = { 127, 120, 1, 3, 4, 5 };
-  struct cls_struct_6byte f_dbl = { 12, 128, 9, 3, 4, 5 };
-  struct cls_struct_6byte res_dbl = { 0, 0, 0, 0, 0, 0 };
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = &ffi_type_uchar;
-  cls_struct_fields[4] = &ffi_type_uchar;
-  cls_struct_fields[5] = &ffi_type_uchar;
-  cls_struct_fields[6] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */
-  printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
-	 res_dbl.d, res_dbl.e, res_dbl.f);
-  /* { dg-output "\nres: 139 248 10 6 8 10" } */
-
-  res_dbl.a = 0;
-  res_dbl.b = 0;
-  res_dbl.c = 0;
-  res_dbl.d = 0;
-  res_dbl.e = 0;
-  res_dbl.f = 0;
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */
-  printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
-	 res_dbl.d, res_dbl.e, res_dbl.f);
-  /* { dg-output "\nres: 139 248 10 6 8 10" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_6byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_6byte.c
deleted file mode 100644
index 7406780..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_6byte.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_6byte {
-  unsigned short a;
-  unsigned short b;
-  unsigned char c;
-  unsigned char d;
-} cls_struct_6byte;
-
-cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1,
-			    struct cls_struct_6byte a2)
-{
-  struct cls_struct_6byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-  result.d = a1.d + a2.d;
-
-  printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d,
-	 a2.a, a2.b, a2.c, a2.d,
-	 result.a, result.b, result.c, result.d);
-
-  return  result;
-}
-
-static void
-cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_6byte a1, a2;
-
-  a1 = *(struct cls_struct_6byte*)(args[0]);
-  a2 = *(struct cls_struct_6byte*)(args[1]);
-
-  *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[5];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_6byte g_dbl = { 127, 120, 1, 128 };
-  struct cls_struct_6byte f_dbl = { 12, 128, 9, 127 };
-  struct cls_struct_6byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_ushort;
-  cls_struct_fields[1] = &ffi_type_ushort;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = &ffi_type_uchar;
-  cls_struct_fields[4] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "127 120 1 128 12 128 9 127: 139 248 10 255" } */
-  printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
-  /* { dg-output "\nres: 139 248 10 255" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n127 120 1 128 12 128 9 127: 139 248 10 255" } */
-  printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
-  /* { dg-output "\nres: 139 248 10 255" } */
-
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_7_1_byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_7_1_byte.c
deleted file mode 100644
index 14a7e96..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_7_1_byte.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20050708	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_7byte {
-  unsigned char a;
-  unsigned char b;
-  unsigned char c;
-  unsigned char d;
-  unsigned char e;
-  unsigned char f;
-  unsigned char g;
-} cls_struct_7byte;
-
-cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1,
-			    struct cls_struct_7byte a2)
-{
-  struct cls_struct_7byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-  result.d = a1.d + a2.d;
-  result.e = a1.e + a2.e;
-  result.f = a1.f + a2.f;
-  result.g = a1.g + a2.g;
-
-  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d %d\n",
-	 a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g,
-	 a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g,
-	 result.a, result.b, result.c, result.d, result.e, result.f, result.g);
-
-  return  result;
-}
-
-static void
-cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_7byte a1, a2;
-
-  a1 = *(struct cls_struct_7byte*)(args[0]);
-  a2 = *(struct cls_struct_7byte*)(args[1]);
-
-  *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[8];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_7byte g_dbl = { 127, 120, 1, 3, 4, 5, 6 };
-  struct cls_struct_7byte f_dbl = { 12, 128, 9, 3, 4, 5, 6 };
-  struct cls_struct_7byte res_dbl = { 0, 0, 0, 0, 0, 0, 0 };
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = &ffi_type_uchar;
-  cls_struct_fields[4] = &ffi_type_uchar;
-  cls_struct_fields[5] = &ffi_type_uchar;
-  cls_struct_fields[6] = &ffi_type_uchar;
-  cls_struct_fields[7] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */
-  printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
-	 res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
-  /* { dg-output "\nres: 139 248 10 6 8 10 12" } */
-
-  res_dbl.a = 0;
-  res_dbl.b = 0;
-  res_dbl.c = 0;
-  res_dbl.d = 0;
-  res_dbl.e = 0;
-  res_dbl.f = 0;
-  res_dbl.g = 0;
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */
-  printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
-	 res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
-  /* { dg-output "\nres: 139 248 10 6 8 10 12" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_7byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_7byte.c
deleted file mode 100644
index 1645cc6..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_7byte.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_7byte {
-  unsigned short a;
-  unsigned short b;
-  unsigned char c;
-  unsigned short d;
-} cls_struct_7byte;
-
-cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1,
-			    struct cls_struct_7byte a2)
-{
-  struct cls_struct_7byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-  result.d = a1.d + a2.d;
-
-  printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d,
-	 a2.a, a2.b, a2.c, a2.d,
-	 result.a, result.b, result.c, result.d);
-
-  return  result;
-}
-
-static void
-cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_7byte a1, a2;
-
-  a1 = *(struct cls_struct_7byte*)(args[0]);
-  a2 = *(struct cls_struct_7byte*)(args[1]);
-
-  *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[5];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_7byte g_dbl = { 127, 120, 1, 254 };
-  struct cls_struct_7byte f_dbl = { 12, 128, 9, 255 };
-  struct cls_struct_7byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_ushort;
-  cls_struct_fields[1] = &ffi_type_ushort;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = &ffi_type_ushort;
-  cls_struct_fields[4] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "127 120 1 254 12 128 9 255: 139 248 10 509" } */
-  printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
-  /* { dg-output "\nres: 139 248 10 509" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n127 120 1 254 12 128 9 255: 139 248 10 509" } */
-  printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
-  /* { dg-output "\nres: 139 248 10 509" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_8byte.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_8byte.c
deleted file mode 100644
index f6c1ea5..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_8byte.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Check overlapping.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_8byte {
-  int a;
-  float b;
-} cls_struct_8byte;
-
-cls_struct_8byte cls_struct_8byte_fn(struct cls_struct_8byte a1,
-			    struct cls_struct_8byte a2)
-{
-  struct cls_struct_8byte result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-
-  printf("%d %g %d %g: %d %g\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
-
-  return  result;
-}
-
-static void
-cls_struct_8byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_8byte a1, a2;
-
-  a1 = *(struct cls_struct_8byte*)(args[0]);
-  a2 = *(struct cls_struct_8byte*)(args[1]);
-
-  *(cls_struct_8byte*)resp = cls_struct_8byte_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_8byte g_dbl = { 1, 2.0 };
-  struct cls_struct_8byte f_dbl = { 4, 5.0 };
-  struct cls_struct_8byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_sint;
-  cls_struct_fields[1] = &ffi_type_float;
-  cls_struct_fields[2] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_8byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 2 4 5: 5 7" } */
-  printf("res: %d %g\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 5 7" } */
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_8byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_8byte(*)(cls_struct_8byte, cls_struct_8byte))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n1 2 4 5: 5 7" } */
-  printf("res: %d %g\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 5 7" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_9byte1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_9byte1.c
deleted file mode 100644
index 0b85722..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_9byte1.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Darwin/AIX do double-word
-		alignment of the struct if the first element is a double.
-		Check that it does not here.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030914	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_9byte {
-  int a;
-  double b;
-} cls_struct_9byte;
-
-cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1,
-			    struct cls_struct_9byte b2)
-{
-  struct cls_struct_9byte result;
-
-  result.a = b1.a + b2.a;
-  result.b = b1.b + b2.b;
-
-  printf("%d %g %d %g: %d %g\n", b1.a, b1.b,  b2.a, b2.b,
-	 result.a, result.b);
-
-  return result;
-}
-
-static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp,
-				void** args, void* userdata __UNUSED__)
-{
-  struct cls_struct_9byte b1, b2;
-
-  b1 = *(struct cls_struct_9byte*)(args[0]);
-  b2 = *(struct cls_struct_9byte*)(args[1]);
-
-  *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[3];
-  ffi_type* cls_struct_fields[3];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[3];
-
-  struct cls_struct_9byte h_dbl = { 7, 8.0};
-  struct cls_struct_9byte j_dbl = { 1, 9.0};
-  struct cls_struct_9byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_sint;
-  cls_struct_fields[1] = &ffi_type_double;
-  cls_struct_fields[2] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &h_dbl;
-  args_dbl[1] = &j_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "7 8 1 9: 8 17" } */
-  printf("res: %d %g\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 8 17" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl);
-  /* { dg-output "\n7 8 1 9: 8 17" } */
-  printf("res: %d %g\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 8 17" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_9byte2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_9byte2.c
deleted file mode 100644
index edf991d..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_9byte2.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Depending on the ABI. Darwin/AIX do double-word
-		alignment of the struct if the first element is a double.
-		Check that it does here.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030914	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_9byte {
-  double a;
-  int b;
-} cls_struct_9byte;
-
-cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1,
-			    struct cls_struct_9byte b2)
-{
-  struct cls_struct_9byte result;
-
-  result.a = b1.a + b2.a;
-  result.b = b1.b + b2.b;
-
-  printf("%g %d %g %d: %g %d\n", b1.a, b1.b,  b2.a, b2.b,
-	 result.a, result.b);
-
-  return result;
-}
-
-static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp,
-				void** args, void* userdata __UNUSED__)
-{
-  struct cls_struct_9byte b1, b2;
-
-  b1 = *(struct cls_struct_9byte*)(args[0]);
-  b2 = *(struct cls_struct_9byte*)(args[1]);
-
-  *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[3];
-  ffi_type* cls_struct_fields[3];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[3];
-
-  struct cls_struct_9byte h_dbl = { 7.0, 8};
-  struct cls_struct_9byte j_dbl = { 1.0, 9};
-  struct cls_struct_9byte res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_double;
-  cls_struct_fields[1] = &ffi_type_sint;
-  cls_struct_fields[2] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &h_dbl;
-  args_dbl[1] = &j_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl);
-  /* { dg-output "7 8 1 9: 8 17" } */
-  printf("res: %g %d\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 8 17" } */
-
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl);
-  /* { dg-output "\n7 8 1 9: 8 17" } */
-  printf("res: %g %d\n", res_dbl.a, res_dbl.b);
-  /* { dg-output "\nres: 8 17" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_double.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_double.c
deleted file mode 100644
index aad5f3c..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_double.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of double.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<hos@tamanegi.org> 20031203	 */
-
-
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_align {
-  unsigned char a;
-  double b;
-  unsigned char c;
-} cls_struct_align;
-
-cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
-			    struct cls_struct_align a2)
-{
-  struct cls_struct_align result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
-
-  return  result;
-}
-
-static void
-cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_align a1, a2;
-
-  a1 = *(struct cls_struct_align*)(args[0]);
-  a2 = *(struct cls_struct_align*)(args[1]);
-
-  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_align g_dbl = { 12, 4951, 127 };
-  struct cls_struct_align f_dbl = { 1, 9320, 13 };
-  struct cls_struct_align res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_double;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_float.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_float.c
deleted file mode 100644
index 37e0855..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_float.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of float.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<hos@tamanegi.org> 20031203	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_align {
-  unsigned char a;
-  float b;
-  unsigned char c;
-} cls_struct_align;
-
-cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
-			    struct cls_struct_align a2)
-{
-  struct cls_struct_align result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c);
-
-  return  result;
-}
-
-static void
-cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_align a1, a2;
-
-  a1 = *(struct cls_struct_align*)(args[0]);
-  a2 = *(struct cls_struct_align*)(args[1]);
-
-  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_align g_dbl = { 12, 4951, 127 };
-  struct cls_struct_align f_dbl = { 1, 9320, 13 };
-  struct cls_struct_align res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_float;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_longdouble.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_longdouble.c
deleted file mode 100644
index b3322d8..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_longdouble.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of long double.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<hos@tamanegi.org> 20031203	 */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-typedef struct cls_struct_align {
-  unsigned char a;
-  long double b;
-  unsigned char c;
-} cls_struct_align;
-
-cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
-			    struct cls_struct_align a2)
-{
-  struct cls_struct_align result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c);
-
-  return  result;
-}
-
-static void
-cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_align a1, a2;
-
-  a1 = *(struct cls_struct_align*)(args[0]);
-  a2 = *(struct cls_struct_align*)(args[1]);
-
-  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_align g_dbl = { 12, 4951, 127 };
-  struct cls_struct_align f_dbl = { 1, 9320, 13 };
-  struct cls_struct_align res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_longdouble;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_longdouble_split.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_longdouble_split.c
deleted file mode 100644
index cc1c43b..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_longdouble_split.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of long double.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<hos@tamanegi.org> 20031203	 */
-
-/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
-/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
-
-#include "ffitest.h"
-
-typedef struct cls_struct_align {
-  long double a;
-  long double b;
-  long double c;
-  long double d;
-  long double e;
-  long double f;
-  long double g;
-} cls_struct_align;
-
-cls_struct_align cls_struct_align_fn(
-	cls_struct_align	a1,
-	cls_struct_align	a2)
-{
-	struct cls_struct_align r;
-
-	r.a = a1.a + a2.a;
-	r.b = a1.b + a2.b;
-	r.c = a1.c + a2.c;
-	r.d = a1.d + a2.d;
-	r.e = a1.e + a2.e;
-	r.f = a1.f + a2.f;
-	r.g = a1.g + a2.g;
-
-	printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: "
-		"%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n",
-		a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g,
-		a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g,
-		r.a, r.b, r.c, r.d, r.e, r.f, r.g);
-
-	return r;
-}
-
-cls_struct_align cls_struct_align_fn2(
-	cls_struct_align	a1)
-{
-	struct cls_struct_align r;
-
-	r.a = a1.a + 1;
-	r.b = a1.b + 1;
-	r.c = a1.c + 1;
-	r.d = a1.d + 1;
-	r.e = a1.e + 1;
-	r.f = a1.f + 1;
-	r.g = a1.g + 1;
-
-	printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg: "
-		"%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n",
-		a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g,
-		r.a, r.b, r.c, r.d, r.e, r.f, r.g);
-
-	return r;
-}
-
-static void
-cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, 
-		    void* userdata __UNUSED__)
-{
-	struct cls_struct_align a1, a2;
-
-	a1 = *(struct cls_struct_align*)(args[0]);
-	a2 = *(struct cls_struct_align*)(args[1]);
-
-	*(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
-}
-
-int main (void)
-{
-	ffi_cif cif;
-        void *code;
-	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-	void* args_dbl[3];
-	ffi_type* cls_struct_fields[8];
-	ffi_type cls_struct_type;
-	ffi_type* dbl_arg_types[3];
-
-	struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 };
-	struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 };
-	struct cls_struct_align res_dbl;
-
-	cls_struct_type.size = 0;
-	cls_struct_type.alignment = 0;
-	cls_struct_type.type = FFI_TYPE_STRUCT;
-	cls_struct_type.elements = cls_struct_fields;
-
-	cls_struct_fields[0] = &ffi_type_longdouble;
-	cls_struct_fields[1] = &ffi_type_longdouble;
-	cls_struct_fields[2] = &ffi_type_longdouble;
-	cls_struct_fields[3] = &ffi_type_longdouble;
-	cls_struct_fields[4] = &ffi_type_longdouble;
-	cls_struct_fields[5] = &ffi_type_longdouble;
-	cls_struct_fields[6] = &ffi_type_longdouble;
-	cls_struct_fields[7] = NULL;
-
-	dbl_arg_types[0] = &cls_struct_type;
-	dbl_arg_types[1] = &cls_struct_type;
-	dbl_arg_types[2] = NULL;
-
-	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		dbl_arg_types) == FFI_OK);
-
-	args_dbl[0] = &g_dbl;
-	args_dbl[1] = &f_dbl;
-	args_dbl[2] = NULL;
-
-	ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
-	/* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */
-	printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b,
-		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
-	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
-
-	res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
-	/* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */
-	printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b,
-		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
-	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c
deleted file mode 100644
index 5d3bec0..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*	Area:			ffi_call, closure_call
-	Purpose:		Check structure alignment of long double.
-	Limitations:	none.
-	PR:				none.
-	Originator:		Blake Chaffin	6/18/2007
-*/
-
-/* { dg-do run { xfail strongarm*-*-* } } */
-/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
-
-#include "ffitest.h"
-
-typedef struct cls_struct_align {
-  long double a;
-  long double b;
-  long double c;
-  long double d;
-  long double e;
-  double f;
-  long double g;
-} cls_struct_align;
-
-cls_struct_align cls_struct_align_fn(
-	cls_struct_align	a1,
-	cls_struct_align	a2)
-{
-	struct cls_struct_align r;
-
-	r.a = a1.a + a2.a;
-	r.b = a1.b + a2.b;
-	r.c = a1.c + a2.c;
-	r.d = a1.d + a2.d;
-	r.e = a1.e + a2.e;
-	r.f = a1.f + a2.f;
-	r.g = a1.g + a2.g;
-
-	printf("%Lg %Lg %Lg %Lg %Lg %g %Lg %Lg %Lg %Lg %Lg %Lg %g %Lg: "
-		"%Lg %Lg %Lg %Lg %Lg %g %Lg\n",
-		a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g,
-		a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g,
-		r.a, r.b, r.c, r.d, r.e, r.f, r.g);
-
-	return r;
-}
-
-static void
-cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, 
-		    void* userdata __UNUSED__)
-{
-	struct cls_struct_align a1, a2;
-
-	a1 = *(struct cls_struct_align*)(args[0]);
-	a2 = *(struct cls_struct_align*)(args[1]);
-
-	*(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
-}
-
-int main (void)
-{
-	ffi_cif cif;
-        void *code;
-	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-	void* args_dbl[3];
-	ffi_type* cls_struct_fields[8];
-	ffi_type cls_struct_type;
-	ffi_type* dbl_arg_types[3];
-
-	struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 };
-	struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 };
-	struct cls_struct_align res_dbl;
-
-	cls_struct_type.size = 0;
-	cls_struct_type.alignment = 0;
-	cls_struct_type.type = FFI_TYPE_STRUCT;
-	cls_struct_type.elements = cls_struct_fields;
-
-	cls_struct_fields[0] = &ffi_type_longdouble;
-	cls_struct_fields[1] = &ffi_type_longdouble;
-	cls_struct_fields[2] = &ffi_type_longdouble;
-	cls_struct_fields[3] = &ffi_type_longdouble;
-	cls_struct_fields[4] = &ffi_type_longdouble;
-	cls_struct_fields[5] = &ffi_type_double;
-	cls_struct_fields[6] = &ffi_type_longdouble;
-	cls_struct_fields[7] = NULL;
-
-	dbl_arg_types[0] = &cls_struct_type;
-	dbl_arg_types[1] = &cls_struct_type;
-	dbl_arg_types[2] = NULL;
-
-	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		dbl_arg_types) == FFI_OK);
-
-	args_dbl[0] = &g_dbl;
-	args_dbl[1] = &f_dbl;
-	args_dbl[2] = NULL;
-
-	ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
-	/* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */
-	printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b,
-		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
-	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
-
-	res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
-	/* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */
-	printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b,
-		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
-	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
-
-  exit(0);
-}
-
-
-
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_pointer.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_pointer.c
deleted file mode 100644
index 8fbf36a..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_pointer.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of pointer.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<hos@tamanegi.org> 20031203	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_align {
-  unsigned char a;
-  void *b;
-  unsigned char c;
-} cls_struct_align;
-
-cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
-			    struct cls_struct_align a2)
-{
-  struct cls_struct_align result;
-
-  result.a = a1.a + a2.a;
-  result.b = (void *)((uintptr_t)a1.b + (uintptr_t)a2.b);
-  result.c = a1.c + a2.c;
-
-  printf("%d %" PRIuPTR " %d %d %" PRIuPTR " %d: %d %" PRIuPTR " %d\n", 
-         a1.a, (uintptr_t)a1.b, a1.c,
-	 a2.a, (uintptr_t)a2.b, a2.c,
-         result.a, (uintptr_t)result.b,
-	 result.c);
-
-  return result;
-}
-
-static void
-cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_align a1, a2;
-
-  a1 = *(struct cls_struct_align*)(args[0]);
-  a2 = *(struct cls_struct_align*)(args[1]);
-
-  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_align g_dbl = { 12, (void *)4951, 127 };
-  struct cls_struct_align f_dbl = { 1, (void *)9320, 13 };
-  struct cls_struct_align res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_pointer;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_sint16.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_sint16.c
deleted file mode 100644
index 039b874..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_sint16.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of sint16.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<hos@tamanegi.org> 20031203	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_align {
-  unsigned char a;
-  signed short b;
-  unsigned char c;
-} cls_struct_align;
-
-cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
-			    struct cls_struct_align a2)
-{
-  struct cls_struct_align result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
-
-  return  result;
-}
-
-static void
-cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_align a1, a2;
-
-  a1 = *(struct cls_struct_align*)(args[0]);
-  a2 = *(struct cls_struct_align*)(args[1]);
-
-  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_align g_dbl = { 12, 4951, 127 };
-  struct cls_struct_align f_dbl = { 1, 9320, 13 };
-  struct cls_struct_align res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_sshort;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_sint32.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_sint32.c
deleted file mode 100644
index c96c6d1..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_sint32.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of sint32.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<hos@tamanegi.org> 20031203	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_align {
-  unsigned char a;
-  signed int b;
-  unsigned char c;
-} cls_struct_align;
-
-cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
-			    struct cls_struct_align a2)
-{
-  struct cls_struct_align result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
-
-  return  result;
-}
-
-static void
-cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_align a1, a2;
-
-  a1 = *(struct cls_struct_align*)(args[0]);
-  a2 = *(struct cls_struct_align*)(args[1]);
-
-  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_align g_dbl = { 12, 4951, 127 };
-  struct cls_struct_align f_dbl = { 1, 9320, 13 };
-  struct cls_struct_align res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_sint;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_sint64.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_sint64.c
deleted file mode 100644
index 9aa7bdd..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_sint64.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of sint64.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<hos@tamanegi.org> 20031203	 */
-
-/* { dg-do run } */
-/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */
-#include "ffitest.h"
-
-typedef struct cls_struct_align {
-  unsigned char a;
-  signed long long b;
-  unsigned char c;
-} cls_struct_align;
-
-cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
-			    struct cls_struct_align a2)
-{
-  struct cls_struct_align result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
-
-  return  result;
-}
-
-static void
-cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_align a1, a2;
-
-  a1 = *(struct cls_struct_align*)(args[0]);
-  a2 = *(struct cls_struct_align*)(args[1]);
-
-  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_align g_dbl = { 12, 4951, 127 };
-  struct cls_struct_align f_dbl = { 1, 9320, 13 };
-  struct cls_struct_align res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_sint64;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_uint16.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_uint16.c
deleted file mode 100644
index 97620b7..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_uint16.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of uint16.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<hos@tamanegi.org> 20031203	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_align {
-  unsigned char a;
-  unsigned short b;
-  unsigned char c;
-} cls_struct_align;
-
-cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
-			    struct cls_struct_align a2)
-{
-  struct cls_struct_align result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
-
-  return  result;
-}
-
-static void
-cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_align a1, a2;
-
-  a1 = *(struct cls_struct_align*)(args[0]);
-  a2 = *(struct cls_struct_align*)(args[1]);
-
-  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_align g_dbl = { 12, 4951, 127 };
-  struct cls_struct_align f_dbl = { 1, 9320, 13 };
-  struct cls_struct_align res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_ushort;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_uint32.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_uint32.c
deleted file mode 100644
index 5766fad..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_uint32.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of uint32.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<hos@tamanegi.org> 20031203	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_align {
-  unsigned char a;
-  unsigned int b;
-  unsigned char c;
-} cls_struct_align;
-
-cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
-			    struct cls_struct_align a2)
-{
-  struct cls_struct_align result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
-
-  return  result;
-}
-
-static void
-cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_align a1, a2;
-
-  a1 = *(struct cls_struct_align*)(args[0]);
-  a2 = *(struct cls_struct_align*)(args[1]);
-
-  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_align g_dbl = { 12, 4951, 127 };
-  struct cls_struct_align f_dbl = { 1, 9320, 13 };
-  struct cls_struct_align res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_uint;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_uint64.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_uint64.c
deleted file mode 100644
index a52cb89..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_align_uint64.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of uint64.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<hos@tamanegi.org> 20031203	 */
-
-
-/* { dg-do run } */
-/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */
-#include "ffitest.h"
-
-typedef struct cls_struct_align {
-  unsigned char a;
-  unsigned long long b;
-  unsigned char c;
-} cls_struct_align;
-
-cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
-			    struct cls_struct_align a2)
-{
-  struct cls_struct_align result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
-
-  return  result;
-}
-
-static void
-cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_align a1, a2;
-
-  a1 = *(struct cls_struct_align*)(args[0]);
-  a2 = *(struct cls_struct_align*)(args[1]);
-
-  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_align g_dbl = { 12, 4951, 127 };
-  struct cls_struct_align f_dbl = { 1, 9320, 13 };
-  struct cls_struct_align res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_uint64;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &g_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
-  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
-  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
-  printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
-  /* { dg-output "\nres: 13 14271 140" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_dbls_struct.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_dbls_struct.c
deleted file mode 100644
index d663791..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_dbls_struct.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Area:		ffi_call, closure_call
-   Purpose:		Check double arguments in structs.
-   Limitations:	none.
-   PR:			none.
-   Originator:	Blake Chaffin 6/23/2007	*/
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-typedef struct Dbls {
-	double x;
-	double y;
-} Dbls;
-
-void
-closure_test_fn(Dbls p)
-{
-	printf("%.1f %.1f\n", p.x, p.y);
-}
-
-void
-closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
-		void** args, void* userdata __UNUSED__)
-{
-	closure_test_fn(*(Dbls*)args[0]);
-}
-
-int main(int argc __UNUSED__, char** argv __UNUSED__)
-{
-	ffi_cif cif;
-
-        void *code;
-	ffi_closure*	pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-	ffi_type*		cl_arg_types[1];
-
-	ffi_type	ts1_type;
-	ffi_type*	ts1_type_elements[4];
-
-	Dbls arg = { 1.0, 2.0 };
-
-	ts1_type.size = 0;
-	ts1_type.alignment = 0;
-	ts1_type.type = FFI_TYPE_STRUCT;
-	ts1_type.elements = ts1_type_elements;
-
-	ts1_type_elements[0] = &ffi_type_double;
-	ts1_type_elements[1] = &ffi_type_double;
-	ts1_type_elements[2] = NULL;
-
-	cl_arg_types[0] = &ts1_type;
-
-	/* Initialize the cif */
-	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-				 &ffi_type_void, cl_arg_types) == FFI_OK);
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK);
-
-	((void*(*)(Dbls))(code))(arg);
-	/* { dg-output "1.0 2.0\n" } */
-
-	closure_test_fn(arg);
-	/* { dg-output "1.0 2.0\n" } */
-
-	return 0;
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_double.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_double.c
deleted file mode 100644
index 84ad4cb..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_double.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check return value double.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			      void* userdata __UNUSED__)
- {
-   *(double *)resp = *(double *)args[0];
-
-   printf("%f: %f\n",*(double *)args[0],
-	  *(double *)resp);
- }
-typedef double (*cls_ret_double)(double);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[2];
-  double res;
-
-  cl_arg_types[0] = &ffi_type_double;
-  cl_arg_types[1] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_double, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_double_fn, NULL, code)  == FFI_OK);
-
-  res = (*((cls_ret_double)code))(21474.789);
-  /* { dg-output "21474.789000: 21474.789000" } */
-  printf("res: %.6f\n", res);
-  /* { dg-output "\nres: 21474.789000" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_double_va.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_double_va.c
deleted file mode 100644
index e077f92..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_double_va.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Area:		ffi_call, closure_call
-   Purpose:		Test doubles passed in variable argument lists.
-   Limitations:	none.
-   PR:			none.
-   Originator:	Blake Chaffin 6/6/2007	 */
-
-/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
-/* { dg-output "" { xfail avr32*-*-* } } */
-/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */
-
-#include "ffitest.h"
-
-static void
-cls_double_va_fn(ffi_cif* cif __UNUSED__, void* resp, 
-		 void** args, void* userdata __UNUSED__)
-{
-	char*	format		= *(char**)args[0];
-	double	doubleValue	= *(double*)args[1];
-
-	*(ffi_arg*)resp = printf(format, doubleValue);
-}
-
-int main (void)
-{
-	ffi_cif cif;
-        void *code;
-	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-	void* args[3];
-	ffi_type* arg_types[3];
-
-	char*	format		= "%.1f\n";
-	double	doubleArg	= 7;
-	ffi_arg	res			= 0;
-
-	arg_types[0] = &ffi_type_pointer;
-	arg_types[1] = &ffi_type_double;
-	arg_types[2] = NULL;
-
-	/* This printf call is variadic */
-	CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint,
-			       arg_types) == FFI_OK);
-
-	args[0] = &format;
-	args[1] = &doubleArg;
-	args[2] = NULL;
-
-	ffi_call(&cif, FFI_FN(printf), &res, args);
-	/* { dg-output "7.0" } */
-	printf("res: %d\n", (int) res);
-	/* { dg-output "\nres: 4" } */
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL,
-				   code) == FFI_OK);
-
-	res = ((int(*)(char*, ...))(code))(format, doubleArg);
-	/* { dg-output "\n7.0" } */
-	printf("res: %d\n", (int) res);
-	/* { dg-output "\nres: 4" } */
-
-	exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_float.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_float.c
deleted file mode 100644
index 0090fed..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_float.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check return value float.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void cls_ret_float_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			     void* userdata __UNUSED__)
- {
-   *(float *)resp = *(float *)args[0];
-
-   printf("%g: %g\n",*(float *)args[0],
-	  *(float *)resp);
- }
-
-typedef float (*cls_ret_float)(float);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[2];
-  float res;
-
-  cl_arg_types[0] = &ffi_type_float;
-  cl_arg_types[1] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_float, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_float_fn, NULL, code)  == FFI_OK);
-  res = ((((cls_ret_float)code)(-2122.12)));
-  /* { dg-output "\\-2122.12: \\-2122.12" } */
-  printf("res: %.6f\n", res);
-  /* { dg-output "\nres: \-2122.120117" } */
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_longdouble.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_longdouble.c
deleted file mode 100644
index d24e72e..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_longdouble.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/* Area:		ffi_call, closure_call
-   Purpose:		Check long double arguments.
-   Limitations:	none.
-   PR:			none.
-   Originator:	Blake Chaffin	*/
-
-/* This test is known to PASS on armv7l-unknown-linux-gnueabihf, so I have
-   remove the xfail for arm*-*-* below, until we know more.  */
-/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
-/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
-
-#include "ffitest.h"
-
-long double cls_ldouble_fn(
-	long double	a1,
-	long double	a2,
-	long double	a3,
-	long double	a4,
-	long double	a5,
-	long double	a6,
-	long double	a7,
-	long double	a8)
-{
-	long double	r = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8;
-
-	printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: %Lg\n",
-		a1, a2, a3, a4, a5, a6, a7, a8, r);
-
-	return r;
-}
-
-static void
-cls_ldouble_gn(ffi_cif* cif __UNUSED__, void* resp, 
-	       void** args, void* userdata __UNUSED__)
-{
-	long double	a1	= *(long double*)args[0];
-	long double	a2	= *(long double*)args[1];
-	long double	a3	= *(long double*)args[2];
-	long double	a4	= *(long double*)args[3];
-	long double	a5	= *(long double*)args[4];
-	long double	a6	= *(long double*)args[5];
-	long double	a7	= *(long double*)args[6];
-	long double	a8	= *(long double*)args[7];
-
-	*(long double*)resp = cls_ldouble_fn(
-		a1, a2, a3, a4, a5, a6, a7, a8);
-}
-
-int main(void)
-{
-	ffi_cif	cif;
-        void* code;
-	ffi_closure*	pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-	void*			args[9];
-	ffi_type*		arg_types[9];
-	long double		res	= 0;
-
-	long double	arg1	= 1;
-	long double	arg2	= 2;
-	long double	arg3	= 3;
-	long double	arg4	= 4;
-	long double	arg5	= 5;
-	long double	arg6	= 6;
-	long double	arg7	= 7;
-	long double	arg8	= 8;
-
-	arg_types[0] = &ffi_type_longdouble;
-	arg_types[1] = &ffi_type_longdouble;
-	arg_types[2] = &ffi_type_longdouble;
-	arg_types[3] = &ffi_type_longdouble;
-	arg_types[4] = &ffi_type_longdouble;
-	arg_types[5] = &ffi_type_longdouble;
-	arg_types[6] = &ffi_type_longdouble;
-	arg_types[7] = &ffi_type_longdouble;
-	arg_types[8] = NULL;
-
-	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 8, &ffi_type_longdouble,
-		arg_types) == FFI_OK);
-
-	args[0] = &arg1;
-	args[1] = &arg2;
-	args[2] = &arg3;
-	args[3] = &arg4;
-	args[4] = &arg5;
-	args[5] = &arg6;
-	args[6] = &arg7;
-	args[7] = &arg8;
-	args[8] = NULL;
-
-	ffi_call(&cif, FFI_FN(cls_ldouble_fn), &res, args);
-	/* { dg-output "1 2 3 4 5 6 7 8: 36" } */
-	printf("res: %Lg\n", res);
-	/* { dg-output "\nres: 36" } */
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ldouble_gn, NULL, code) == FFI_OK);
-
-	res = ((long double(*)(long double, long double, long double, long double,
-		long double, long double, long double, long double))(code))(arg1, arg2,
-		arg3, arg4, arg5, arg6, arg7, arg8);
-	/* { dg-output "\n1 2 3 4 5 6 7 8: 36" } */
-	printf("res: %Lg\n", res);
-	/* { dg-output "\nres: 36" } */
-
-	return 0;
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_longdouble_va.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_longdouble_va.c
deleted file mode 100644
index 39b438b..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_longdouble_va.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Area:		ffi_call, closure_call
-   Purpose:		Test long doubles passed in variable argument lists.
-   Limitations:	none.
-   PR:			none.
-   Originator:	Blake Chaffin 6/6/2007	 */
-
-/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
-/* { dg-output "" { xfail avr32*-*-* x86_64-*-mingw* } } */
-/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */
-
-#include "ffitest.h"
-
-static void
-cls_longdouble_va_fn(ffi_cif* cif __UNUSED__, void* resp, 
-		     void** args, void* userdata __UNUSED__)
-{
-	char*		format	= *(char**)args[0];
-	long double	ldValue	= *(long double*)args[1];
-
-	*(ffi_arg*)resp = printf(format, ldValue);
-}
-
-int main (void)
-{
-	ffi_cif cif;
-        void *code;
-	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-	void* args[3];
-	ffi_type* arg_types[3];
-
-	char*		format	= "%.1Lf\n";
-	long double	ldArg	= 7;
-	ffi_arg		res		= 0;
-
-	arg_types[0] = &ffi_type_pointer;
-	arg_types[1] = &ffi_type_longdouble;
-	arg_types[2] = NULL;
-
-	/* This printf call is variadic */
-	CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint,
-			       arg_types) == FFI_OK);
-
-	args[0] = &format;
-	args[1] = &ldArg;
-	args[2] = NULL;
-
-	ffi_call(&cif, FFI_FN(printf), &res, args);
-	/* { dg-output "7.0" } */
-	printf("res: %d\n", (int) res);
-	/* { dg-output "\nres: 4" } */
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL,
-				   code) == FFI_OK);
-
-	res = ((int(*)(char*, ...))(code))(format, ldArg);
-	/* { dg-output "\n7.0" } */
-	printf("res: %d\n", (int) res);
-	/* { dg-output "\nres: 4" } */
-
-	exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_many_mixed_args.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_many_mixed_args.c
deleted file mode 100644
index 7fd6c82..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_many_mixed_args.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check closures called with many args of mixed types
-   Limitations:	none.
-   PR:		none.
-   Originator:	<david.schneider@picle.org> */
-
-/* { dg-do run } */
-#include "ffitest.h"
-#include <float.h>
-#include <math.h>
-
-#define NARGS 16
-
-static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			      void* userdata __UNUSED__)
-{
-  int i;
-  double r = 0;
-  double t;
-  for(i = 0; i < NARGS; i++)
-    {
-    if(i == 4 || i == 9 || i == 11 || i == 13 || i == 15)
-      {
-      t = *(long int *)args[i];
-      CHECK(t == i+1);
-      }
-    else
-      {
-      t = *(double *)args[i];
-      CHECK(fabs(t - ((i+1) * 0.1)) < FLT_EPSILON);
-      }
-    r += t;
-    }
-  *(double *)resp = r;
-}
-typedef double (*cls_ret_double)(double, double, double, double, long int,
-double, double, double, double, long int, double, long int, double, long int,
-double, long int);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[NARGS];
-  double res;
-  int i;
-  double expected = 64.9;
-
-  for(i = 0; i < NARGS; i++)
-    {
-    if(i == 4 || i == 9 || i == 11 || i == 13 || i == 15)
-      cl_arg_types[i] = &ffi_type_slong;
-    else
-      cl_arg_types[i] = &ffi_type_double;
-    }
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, NARGS,
-		     &ffi_type_double, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_double_fn, NULL, code) == FFI_OK);
-
-  res = (((cls_ret_double)code))(0.1, 0.2, 0.3, 0.4, 5, 0.6, 0.7, 0.8, 0.9, 10,
-                                 1.1, 12, 1.3, 14, 1.5, 16);
-  if (fabs(res - expected) < FLT_EPSILON)
-    exit(0);
-  else
-    abort();
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c
deleted file mode 100644
index 62b0697..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check register allocation for closure calls with many float and double arguments
-   Limitations:	none.
-   PR:		none.
-   Originator:	<david.schneider@picle.org> */
-
-/* { dg-do run } */
-#include "ffitest.h"
-#include <float.h>
-#include <math.h>
-
-#define NARGS 16
-
-static void cls_mixed_float_double_fn(ffi_cif* cif , void* ret, void** args,
-			      void* userdata __UNUSED__)
-{
-    double r = 0;
-    unsigned int i;
-    double t;
-    for(i=0; i < cif->nargs; i++)
-    {
-        if(cif->arg_types[i] == &ffi_type_double) {
-				t = *(((double**)(args))[i]);
-        } else {
-				t = *(((float**)(args))[i]);
-        }
-        r += t;
-    }
-    *((double*)ret) = r;
-}
-typedef double (*cls_mixed)(double, float, double, double, double, double, double, float, float, double, float, float);
-
-int main (void)
-{
-    ffi_cif cif;
-    ffi_closure *closure;
-	void* code;
-    ffi_type *argtypes[12] = {&ffi_type_double, &ffi_type_float, &ffi_type_double,
-                          &ffi_type_double, &ffi_type_double, &ffi_type_double,
-                          &ffi_type_double, &ffi_type_float, &ffi_type_float,
-                          &ffi_type_double, &ffi_type_float, &ffi_type_float};
-
-
-    closure = ffi_closure_alloc(sizeof(ffi_closure), (void**)&code);
-    if(closure ==NULL)
-		abort();
-    CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 12, &ffi_type_double, argtypes) == FFI_OK);
-	CHECK(ffi_prep_closure_loc(closure, &cif, cls_mixed_float_double_fn, NULL,  code) == FFI_OK);
-    double ret = ((cls_mixed)code)(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2);
-    ffi_closure_free(closure);
-	if(fabs(ret - 7.8) < FLT_EPSILON)
-		exit(0);
-	else
-		abort();
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_schar.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_schar.c
deleted file mode 100644
index 71df7b6..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_schar.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check passing of multiple signed char values.
-   Limitations:	none.
-   PR:		PR13221.
-   Originator:	<hos@tamanegi.org> 20031129  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-signed char test_func_fn(signed char a1, signed char a2)
-{
-  signed char result;
-
-  result = a1 + a2;
-
-  printf("%d %d: %d\n", a1, a2, result);
-
-  return result;
-
-}
-
-static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
-			 void *data __UNUSED__)
-{
-  signed char a1, a2;
-
-  a1 = *(signed char *)avals[0];
-  a2 = *(signed char *)avals[1];
-
-  *(ffi_arg *)rval = test_func_fn(a1, a2);
-
-}
-
-typedef signed char (*test_type)(signed char, signed char);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void * args_dbl[3];
-  ffi_type * cl_arg_types[3];
-  ffi_arg res_call;
-  signed char a, b, res_closure;
-
-  a = 2;
-  b = 125;
-
-  args_dbl[0] = &a;
-  args_dbl[1] = &b;
-  args_dbl[2] = NULL;
-
-  cl_arg_types[0] = &ffi_type_schar;
-  cl_arg_types[1] = &ffi_type_schar;
-  cl_arg_types[2] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
-		     &ffi_type_schar, cl_arg_types) == FFI_OK);
-
-  ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl);
-  /* { dg-output "2 125: 127" } */
-  printf("res: %d\n", (signed char)res_call);
-  /* { dg-output "\nres: 127" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
-
-  res_closure = (*((test_type)code))(2, 125);
-  /* { dg-output "\n2 125: 127" } */
-  printf("res: %d\n", res_closure);
-  /* { dg-output "\nres: 127" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_sshort.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_sshort.c
deleted file mode 100644
index 4c39153..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_sshort.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check passing of multiple signed short values.
-   Limitations:	none.
-   PR:		PR13221.
-   Originator:	<andreast@gcc.gnu.org> 20031129  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-signed short test_func_fn(signed short a1, signed short a2)
-{
-  signed short result;
-
-  result = a1 + a2;
-
-  printf("%d %d: %d\n", a1, a2, result);
-
-  return result;
-
-}
-
-static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
-			 void *data __UNUSED__)
-{
-  signed short a1, a2;
-
-  a1 = *(signed short *)avals[0];
-  a2 = *(signed short *)avals[1];
-
-  *(ffi_arg *)rval = test_func_fn(a1, a2);
-
-}
-
-typedef signed short (*test_type)(signed short, signed short);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void * args_dbl[3];
-  ffi_type * cl_arg_types[3];
-  ffi_arg res_call;
-  unsigned short a, b, res_closure;
-
-  a = 2;
-  b = 32765;
-
-  args_dbl[0] = &a;
-  args_dbl[1] = &b;
-  args_dbl[2] = NULL;
-
-  cl_arg_types[0] = &ffi_type_sshort;
-  cl_arg_types[1] = &ffi_type_sshort;
-  cl_arg_types[2] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
-		     &ffi_type_sshort, cl_arg_types) == FFI_OK);
-
-  ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl);
-  /* { dg-output "2 32765: 32767" } */
-  printf("res: %d\n", (unsigned short)res_call);
-  /* { dg-output "\nres: 32767" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
-
-  res_closure = (*((test_type)code))(2, 32765);
-  /* { dg-output "\n2 32765: 32767" } */
-  printf("res: %d\n", res_closure);
-  /* { dg-output "\nres: 32767" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_sshortchar.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_sshortchar.c
deleted file mode 100644
index 1c3aeb5..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_sshortchar.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check passing of multiple signed short/char values.
-   Limitations:	none.
-   PR:		PR13221.
-   Originator:	<andreast@gcc.gnu.org> 20031129  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-signed short test_func_fn(signed char a1, signed short a2,
-			  signed char a3, signed short a4)
-{
-  signed short result;
-
-  result = a1 + a2 + a3 + a4;
-
-  printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result);
-
-  return result;
-
-}
-
-static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
-			 void *data __UNUSED__)
-{
-  signed char a1, a3;
-  signed short a2, a4;
-
-  a1 = *(signed char *)avals[0];
-  a2 = *(signed short *)avals[1];
-  a3 = *(signed char *)avals[2];
-  a4 = *(signed short *)avals[3];
-
-  *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4);
-
-}
-
-typedef signed short (*test_type)(signed char, signed short,
-				  signed char, signed short);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void * args_dbl[5];
-  ffi_type * cl_arg_types[5];
-  ffi_arg res_call;
-  signed char a, c;
-  signed short b, d, res_closure;
-
-  a = 1;
-  b = 32765;
-  c = 127;
-  d = -128;
-
-  args_dbl[0] = &a;
-  args_dbl[1] = &b;
-  args_dbl[2] = &c;
-  args_dbl[3] = &d;
-  args_dbl[4] = NULL;
-
-  cl_arg_types[0] = &ffi_type_schar;
-  cl_arg_types[1] = &ffi_type_sshort;
-  cl_arg_types[2] = &ffi_type_schar;
-  cl_arg_types[3] = &ffi_type_sshort;
-  cl_arg_types[4] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
-		     &ffi_type_sshort, cl_arg_types) == FFI_OK);
-
-  ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl);
-  /* { dg-output "1 32765 127 -128: 32765" } */
-  printf("res: %d\n", (signed short)res_call);
-  /* { dg-output "\nres: 32765" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
-
-  res_closure = (*((test_type)code))(1, 32765, 127, -128);
-  /* { dg-output "\n1 32765 127 -128: 32765" } */
-  printf("res: %d\n", res_closure);
-  /* { dg-output "\nres: 32765" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_uchar.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_uchar.c
deleted file mode 100644
index 009c02c..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_uchar.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check passing of multiple unsigned char values.
-   Limitations:	none.
-   PR:		PR13221.
-   Originator:	<andreast@gcc.gnu.org> 20031129  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-unsigned char test_func_fn(unsigned char a1, unsigned char a2,
-			   unsigned char a3, unsigned char a4)
-{
-  unsigned char result;
-
-  result = a1 + a2 + a3 + a4;
-
-  printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result);
-
-  return result;
-
-}
-
-static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
-			 void *data __UNUSED__)
-{
-  unsigned char a1, a2, a3, a4;
-
-  a1 = *(unsigned char *)avals[0];
-  a2 = *(unsigned char *)avals[1];
-  a3 = *(unsigned char *)avals[2];
-  a4 = *(unsigned char *)avals[3];
-
-  *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4);
-
-}
-
-typedef unsigned char (*test_type)(unsigned char, unsigned char,
-				   unsigned char, unsigned char);
-
-void test_func(ffi_cif *cif __UNUSED__, void *rval __UNUSED__, void **avals,
-	       void *data __UNUSED__)
-{
-  printf("%d %d %d %d\n", *(unsigned char *)avals[0],
-	 *(unsigned char *)avals[1], *(unsigned char *)avals[2],
-	 *(unsigned char *)avals[3]);
-}
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void * args_dbl[5];
-  ffi_type * cl_arg_types[5];
-  ffi_arg res_call;
-  unsigned char a, b, c, d, res_closure;
-
-  a = 1;
-  b = 2;
-  c = 127;
-  d = 125;
-
-  args_dbl[0] = &a;
-  args_dbl[1] = &b;
-  args_dbl[2] = &c;
-  args_dbl[3] = &d;
-  args_dbl[4] = NULL;
-
-  cl_arg_types[0] = &ffi_type_uchar;
-  cl_arg_types[1] = &ffi_type_uchar;
-  cl_arg_types[2] = &ffi_type_uchar;
-  cl_arg_types[3] = &ffi_type_uchar;
-  cl_arg_types[4] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
-		     &ffi_type_uchar, cl_arg_types) == FFI_OK);
-
-  ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl);
-  /* { dg-output "1 2 127 125: 255" } */
-  printf("res: %d\n", (unsigned char)res_call);
-  /* { dg-output "\nres: 255" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
-
-  res_closure = (*((test_type)code))(1, 2, 127, 125);
-  /* { dg-output "\n1 2 127 125: 255" } */
-  printf("res: %d\n", res_closure);
-  /* { dg-output "\nres: 255" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_ushort.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_ushort.c
deleted file mode 100644
index dd10ca7..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_ushort.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check passing of multiple unsigned short values.
-   Limitations:	none.
-   PR:		PR13221.
-   Originator:	<andreast@gcc.gnu.org> 20031129  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-unsigned short test_func_fn(unsigned short a1, unsigned short a2)
-{
-  unsigned short result;
-
-  result = a1 + a2;
-
-  printf("%d %d: %d\n", a1, a2, result);
-
-  return result;
-
-}
-
-static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
-			 void *data __UNUSED__)
-{
-  unsigned short a1, a2;
-
-  a1 = *(unsigned short *)avals[0];
-  a2 = *(unsigned short *)avals[1];
-
-  *(ffi_arg *)rval = test_func_fn(a1, a2);
-
-}
-
-typedef unsigned short (*test_type)(unsigned short, unsigned short);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void * args_dbl[3];
-  ffi_type * cl_arg_types[3];
-  ffi_arg res_call;
-  unsigned short a, b, res_closure;
-
-  a = 2;
-  b = 32765;
-
-  args_dbl[0] = &a;
-  args_dbl[1] = &b;
-  args_dbl[2] = NULL;
-
-  cl_arg_types[0] = &ffi_type_ushort;
-  cl_arg_types[1] = &ffi_type_ushort;
-  cl_arg_types[2] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
-		     &ffi_type_ushort, cl_arg_types) == FFI_OK);
-
-  ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl);
-  /* { dg-output "2 32765: 32767" } */
-  printf("res: %d\n", (unsigned short)res_call);
-  /* { dg-output "\nres: 32767" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
-
-  res_closure = (*((test_type)code))(2, 32765);
-  /* { dg-output "\n2 32765: 32767" } */
-  printf("res: %d\n", res_closure);
-  /* { dg-output "\nres: 32767" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_ushortchar.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_ushortchar.c
deleted file mode 100644
index 2588e97..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_multi_ushortchar.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check passing of multiple unsigned short/char values.
-   Limitations:	none.
-   PR:		PR13221.
-   Originator:	<andreast@gcc.gnu.org> 20031129  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-unsigned short test_func_fn(unsigned char a1, unsigned short a2,
-			    unsigned char a3, unsigned short a4)
-{
-  unsigned short result;
-
-  result = a1 + a2 + a3 + a4;
-
-  printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result);
-
-  return result;
-
-}
-
-static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
-			 void *data __UNUSED__)
-{
-  unsigned char a1, a3;
-  unsigned short a2, a4;
-
-  a1 = *(unsigned char *)avals[0];
-  a2 = *(unsigned short *)avals[1];
-  a3 = *(unsigned char *)avals[2];
-  a4 = *(unsigned short *)avals[3];
-
-  *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4);
-
-}
-
-typedef unsigned short (*test_type)(unsigned char, unsigned short,
-				   unsigned char, unsigned short);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void * args_dbl[5];
-  ffi_type * cl_arg_types[5];
-  ffi_arg res_call;
-  unsigned char a, c;
-  unsigned short b, d, res_closure;
-
-  a = 1;
-  b = 2;
-  c = 127;
-  d = 128;
-
-  args_dbl[0] = &a;
-  args_dbl[1] = &b;
-  args_dbl[2] = &c;
-  args_dbl[3] = &d;
-  args_dbl[4] = NULL;
-
-  cl_arg_types[0] = &ffi_type_uchar;
-  cl_arg_types[1] = &ffi_type_ushort;
-  cl_arg_types[2] = &ffi_type_uchar;
-  cl_arg_types[3] = &ffi_type_ushort;
-  cl_arg_types[4] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
-		     &ffi_type_ushort, cl_arg_types) == FFI_OK);
-
-  ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl);
-  /* { dg-output "1 2 127 128: 258" } */
-  printf("res: %d\n", (unsigned short)res_call);
-  /* { dg-output "\nres: 258" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
-
-  res_closure = (*((test_type)code))(1, 2, 127, 128);
-  /* { dg-output "\n1 2 127 128: 258" } */
-  printf("res: %d\n", res_closure);
-  /* { dg-output "\nres: 258" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_pointer.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_pointer.c
deleted file mode 100644
index d82a87a..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_pointer.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Area:		ffi_call, closure_call
-   Purpose:		Check pointer arguments.
-   Limitations:	none.
-   PR:			none.
-   Originator:	Blake Chaffin 6/6/2007	*/
-
-/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
-#include "ffitest.h"
-
-void* cls_pointer_fn(void* a1, void* a2)
-{
-	void*	result	= (void*)((intptr_t)a1 + (intptr_t)a2);
-
-	printf("0x%08x 0x%08x: 0x%08x\n", 
-	       (unsigned int)(uintptr_t) a1,
-               (unsigned int)(uintptr_t) a2,
-               (unsigned int)(uintptr_t) result);
-
-	return result;
-}
-
-static void
-cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, 
-	       void** args, void* userdata __UNUSED__)
-{
-	void*	a1	= *(void**)(args[0]);
-	void*	a2	= *(void**)(args[1]);
-
-	*(void**)resp = cls_pointer_fn(a1, a2);
-}
-
-int main (void)
-{
-	ffi_cif	cif;
-        void *code;
-	ffi_closure*	pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-	void*			args[3];
-	/*	ffi_type		cls_pointer_type; */
-	ffi_type*		arg_types[3];
-
-/*	cls_pointer_type.size = sizeof(void*);
-	cls_pointer_type.alignment = 0;
-	cls_pointer_type.type = FFI_TYPE_POINTER;
-	cls_pointer_type.elements = NULL;*/
-
-	void*	arg1	= (void*)0x12345678;
-	void*	arg2	= (void*)0x89abcdef;
-	ffi_arg	res		= 0;
-
-	arg_types[0] = &ffi_type_pointer;
-	arg_types[1] = &ffi_type_pointer;
-	arg_types[2] = NULL;
-
-	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer,
-		arg_types) == FFI_OK);
-
-	args[0] = &arg1;
-	args[1] = &arg2;
-	args[2] = NULL;
-
-	ffi_call(&cif, FFI_FN(cls_pointer_fn), &res, args);
-	/* { dg-output "0x12345678 0x89abcdef: 0x9be02467" } */
-	printf("res: 0x%08x\n", (unsigned int) res);
-	/* { dg-output "\nres: 0x9be02467" } */
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK);
-
-	res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2);
-	/* { dg-output "\n0x12345678 0x89abcdef: 0x9be02467" } */
-	printf("res: 0x%08x\n", (unsigned int) res);
-	/* { dg-output "\nres: 0x9be02467" } */
-
-	exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_pointer_stack.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_pointer_stack.c
deleted file mode 100644
index 1f1d915..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_pointer_stack.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* Area:		ffi_call, closure_call
-   Purpose:		Check pointer arguments across multiple hideous stack frames.
-   Limitations:	none.
-   PR:			none.
-   Originator:	Blake Chaffin 6/7/2007	*/
-
-/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
-#include "ffitest.h"
-
-static	long dummyVar;
-
-long dummy_func(
-	long double a1, char b1,
-	long double a2, char b2,
-	long double a3, char b3,
-	long double a4, char b4)
-{
-	return a1 + b1 + a2 + b2 + a3 + b3 + a4 + b4;
-}
-
-void* cls_pointer_fn2(void* a1, void* a2)
-{
-	long double	trample1	= (intptr_t)a1 + (intptr_t)a2;
-	char		trample2	= ((char*)&a1)[0] + ((char*)&a2)[0];
-	long double	trample3	= (intptr_t)trample1 + (intptr_t)a1;
-	char		trample4	= trample2 + ((char*)&a1)[1];
-	long double	trample5	= (intptr_t)trample3 + (intptr_t)a2;
-	char		trample6	= trample4 + ((char*)&a2)[1];
-	long double	trample7	= (intptr_t)trample5 + (intptr_t)trample1;
-	char		trample8	= trample6 + trample2;
-	void*		result;
-
-	dummyVar	= dummy_func(trample1, trample2, trample3, trample4,
-		trample5, trample6, trample7, trample8);
-
-	result	= (void*)((intptr_t)a1 + (intptr_t)a2);
-
-	printf("0x%08x 0x%08x: 0x%08x\n", 
-	       (unsigned int)(uintptr_t) a1,
-               (unsigned int)(uintptr_t) a2,
-               (unsigned int)(uintptr_t) result);
-
-	return result;
-}
-
-void* cls_pointer_fn1(void* a1, void* a2)
-{
-	long double	trample1	= (intptr_t)a1 + (intptr_t)a2;
-	char		trample2	= ((char*)&a1)[0] + ((char*)&a2)[0];
-	long double	trample3	= (intptr_t)trample1 + (intptr_t)a1;
-	char		trample4	= trample2 + ((char*)&a1)[1];
-	long double	trample5	= (intptr_t)trample3 + (intptr_t)a2;
-	char		trample6	= trample4 + ((char*)&a2)[1];
-	long double	trample7	= (intptr_t)trample5 + (intptr_t)trample1;
-	char		trample8	= trample6 + trample2;
-	void*		result;
-
-	dummyVar	= dummy_func(trample1, trample2, trample3, trample4,
-		trample5, trample6, trample7, trample8);
-
-	result	= (void*)((intptr_t)a1 + (intptr_t)a2);
-
-	printf("0x%08x 0x%08x: 0x%08x\n",
-               (unsigned int)(intptr_t) a1,
-               (unsigned int)(intptr_t) a2,
-               (unsigned int)(intptr_t) result);
-
-	result	= cls_pointer_fn2(result, a1);
-
-	return result;
-}
-
-static void
-cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, 
-	       void** args, void* userdata __UNUSED__)
-{
-	void*	a1	= *(void**)(args[0]);
-	void*	a2	= *(void**)(args[1]);
-
-	long double	trample1	= (intptr_t)a1 + (intptr_t)a2;
-	char		trample2	= ((char*)&a1)[0] + ((char*)&a2)[0];
-	long double	trample3	= (intptr_t)trample1 + (intptr_t)a1;
-	char		trample4	= trample2 + ((char*)&a1)[1];
-	long double	trample5	= (intptr_t)trample3 + (intptr_t)a2;
-	char		trample6	= trample4 + ((char*)&a2)[1];
-	long double	trample7	= (intptr_t)trample5 + (intptr_t)trample1;
-	char		trample8	= trample6 + trample2;
-
-	dummyVar	= dummy_func(trample1, trample2, trample3, trample4,
-		trample5, trample6, trample7, trample8);
-
-	*(void**)resp = cls_pointer_fn1(a1, a2);
-}
-
-int main (void)
-{
-	ffi_cif	cif;
-        void *code;
-	ffi_closure*	pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-	void*			args[3];
-	/*	ffi_type		cls_pointer_type; */
-	ffi_type*		arg_types[3];
-
-/*	cls_pointer_type.size = sizeof(void*);
-	cls_pointer_type.alignment = 0;
-	cls_pointer_type.type = FFI_TYPE_POINTER;
-	cls_pointer_type.elements = NULL;*/
-
-	void*	arg1	= (void*)0x01234567;
-	void*	arg2	= (void*)0x89abcdef;
-	ffi_arg	res		= 0;
-
-	arg_types[0] = &ffi_type_pointer;
-	arg_types[1] = &ffi_type_pointer;
-	arg_types[2] = NULL;
-
-	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer,
-		arg_types) == FFI_OK);
-
-	args[0] = &arg1;
-	args[1] = &arg2;
-	args[2] = NULL;
-
-	printf("\n");
-	ffi_call(&cif, FFI_FN(cls_pointer_fn1), &res, args);
-
-	printf("res: 0x%08x\n", (unsigned int) res);
-	/* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */
-	/* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */
-	/* { dg-output "\nres: 0x8bf258bd" } */
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK);
-
-	res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2);
-
-	printf("res: 0x%08x\n", (unsigned int) res);
-	/* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */
-	/* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */
-	/* { dg-output "\nres: 0x8bf258bd" } */
-
-	exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_schar.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_schar.c
deleted file mode 100644
index 82986b1..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_schar.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check return value schar.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20031108	 */
-
-
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void cls_ret_schar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			     void* userdata __UNUSED__)
-{
-  *(ffi_arg*)resp = *(signed char *)args[0];
-  printf("%d: %d\n",*(signed char *)args[0],
-	 (int)*(ffi_arg *)(resp));
-}
-typedef signed char (*cls_ret_schar)(signed char);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[2];
-  signed char res;
-
-  cl_arg_types[0] = &ffi_type_schar;
-  cl_arg_types[1] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_schar, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_schar_fn, NULL, code)  == FFI_OK);
-
-  res = (*((cls_ret_schar)code))(127);
-  /* { dg-output "127: 127" } */
-  printf("res: %d\n", res);
-  /* { dg-output "\nres: 127" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_sint.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_sint.c
deleted file mode 100644
index c7e13b7..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_sint.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check return value sint32.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20031108	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void cls_ret_sint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			    void* userdata __UNUSED__)
-{
-  *(ffi_arg*)resp = *(signed int *)args[0];
-  printf("%d: %d\n",*(signed int *)args[0],
-	 (int)*(ffi_arg *)(resp));
-}
-typedef signed int (*cls_ret_sint)(signed int);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[2];
-  signed int res;
-
-  cl_arg_types[0] = &ffi_type_sint;
-  cl_arg_types[1] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_sint, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sint_fn, NULL, code)  == FFI_OK);
-
-  res = (*((cls_ret_sint)code))(65534);
-  /* { dg-output "65534: 65534" } */
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 65534" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_sshort.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_sshort.c
deleted file mode 100644
index 846d57e..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_sshort.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check return value sshort.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20031108	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void cls_ret_sshort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			      void* userdata __UNUSED__)
-{
-  *(ffi_arg*)resp = *(signed short *)args[0];
-  printf("%d: %d\n",*(signed short *)args[0],
-	 (int)*(ffi_arg *)(resp));
-}
-typedef signed short (*cls_ret_sshort)(signed short);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[2];
-  signed short res;
-
-  cl_arg_types[0] = &ffi_type_sshort;
-  cl_arg_types[1] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_sshort, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sshort_fn, NULL, code)  == FFI_OK);
-
-  res = (*((cls_ret_sshort)code))(255);
-  /* { dg-output "255: 255" } */
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 255" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_struct_va1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_struct_va1.c
deleted file mode 100644
index 6d1fdae..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_struct_va1.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* Area:		ffi_call, closure_call
-   Purpose:		Test doubles passed in variable argument lists.
-   Limitations:	none.
-   PR:			none.
-   Originator:	Blake Chaffin 6/6/2007	 */
-
-/* { dg-do run } */
-/* { dg-output "" { xfail avr32*-*-* } } */
-#include "ffitest.h"
-
-struct small_tag
-{
-  unsigned char a;
-  unsigned char b;
-};
-
-struct large_tag
-{
-  unsigned a;
-  unsigned b;
-  unsigned c;
-  unsigned d;
-  unsigned e;
-};
-
-static void
-test_fn (ffi_cif* cif __UNUSED__, void* resp,
-	 void** args, void* userdata __UNUSED__)
-{
-  int n = *(int*)args[0];
-  struct small_tag s1 = * (struct small_tag *) args[1];
-  struct large_tag l1 = * (struct large_tag *) args[2];
-  struct small_tag s2 = * (struct small_tag *) args[3];
-
-  printf ("%d %d %d %d %d %d %d %d %d %d\n", n, s1.a, s1.b,
-	  l1.a, l1.b, l1.c, l1.d, l1.e,
-	  s2.a, s2.b);
-  * (ffi_arg*) resp = 42;
-}
-
-int
-main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc (sizeof (ffi_closure), &code);
-  ffi_type* arg_types[5];
-
-  ffi_arg res = 0;
-
-  ffi_type s_type;
-  ffi_type *s_type_elements[3];
-
-  ffi_type l_type;
-  ffi_type *l_type_elements[6];
-
-  struct small_tag s1;
-  struct small_tag s2;
-  struct large_tag l1;
-
-  int si;
-
-  s_type.size = 0;
-  s_type.alignment = 0;
-  s_type.type = FFI_TYPE_STRUCT;
-  s_type.elements = s_type_elements;
-
-  s_type_elements[0] = &ffi_type_uchar;
-  s_type_elements[1] = &ffi_type_uchar;
-  s_type_elements[2] = NULL;
-
-  l_type.size = 0;
-  l_type.alignment = 0;
-  l_type.type = FFI_TYPE_STRUCT;
-  l_type.elements = l_type_elements;
-
-  l_type_elements[0] = &ffi_type_uint;
-  l_type_elements[1] = &ffi_type_uint;
-  l_type_elements[2] = &ffi_type_uint;
-  l_type_elements[3] = &ffi_type_uint;
-  l_type_elements[4] = &ffi_type_uint;
-  l_type_elements[5] = NULL;
-
-  arg_types[0] = &ffi_type_sint;
-  arg_types[1] = &s_type;
-  arg_types[2] = &l_type;
-  arg_types[3] = &s_type;
-  arg_types[4] = NULL;
-
-  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint,
-			 arg_types) == FFI_OK);
-
-  si = 4;
-  s1.a = 5;
-  s1.b = 6;
-
-  s2.a = 20;
-  s2.b = 21;
-
-  l1.a = 10;
-  l1.b = 11;
-  l1.c = 12;
-  l1.d = 13;
-  l1.e = 14;
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, test_fn, NULL, code) == FFI_OK);
-
-  res = ((int (*)(int, ...))(code))(si, s1, l1, s2);
-  /* { dg-output "4 5 6 10 11 12 13 14 20 21" } */
-  printf("res: %d\n", (int) res);
-  /* { dg-output "\nres: 42" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_uchar.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_uchar.c
deleted file mode 100644
index c1317e7..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_uchar.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check return value uchar.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void cls_ret_uchar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			     void* userdata __UNUSED__)
-{
-  *(ffi_arg*)resp = *(unsigned char *)args[0];
-  printf("%d: %d\n",*(unsigned char *)args[0],
-	 (int)*(ffi_arg *)(resp));
-}
-typedef unsigned char (*cls_ret_uchar)(unsigned char);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[2];
-  unsigned char res;
-
-  cl_arg_types[0] = &ffi_type_uchar;
-  cl_arg_types[1] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_uchar, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uchar_fn, NULL, code)  == FFI_OK);
-
-  res = (*((cls_ret_uchar)code))(127);
-  /* { dg-output "127: 127" } */
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 127" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_uchar_va.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_uchar_va.c
deleted file mode 100644
index 6491c5b..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_uchar_va.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Test anonymous unsigned char argument.
-   Limitations:	none.
-   PR:		none.
-   Originator:	ARM Ltd. */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef unsigned char T;
-
-static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			 void* userdata __UNUSED__)
- {
-   *(ffi_arg *)resp = *(T *)args[0];
-
-   printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]);
- }
-
-typedef T (*cls_ret_T)(T, ...);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[3];
-  T res;
-
-  cl_arg_types[0] = &ffi_type_uchar;
-  cl_arg_types[1] = &ffi_type_uchar;
-  cl_arg_types[2] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2,
-			 &ffi_type_uchar, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code)  == FFI_OK);
-  res = ((((cls_ret_T)code)(67, 4)));
-  /* { dg-output "67: 67 4" } */
-  printf("res: %d\n", res);
-  /* { dg-output "\nres: 67" } */
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_uint.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_uint.c
deleted file mode 100644
index 885cff5..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_uint.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check return value uint.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void cls_ret_uint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			    void* userdata __UNUSED__)
-{
-  *(ffi_arg *)resp = *(unsigned int *)args[0];
-
-  printf("%d: %d\n",*(unsigned int *)args[0],
-	 (int)*(ffi_arg *)(resp));
-}
-typedef unsigned int (*cls_ret_uint)(unsigned int);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[2];
-  unsigned int res;
-
-  cl_arg_types[0] = &ffi_type_uint;
-  cl_arg_types[1] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_uint, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uint_fn, NULL, code)  == FFI_OK);
-
-  res = (*((cls_ret_uint)code))(2147483647);
-  /* { dg-output "2147483647: 2147483647" } */
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 2147483647" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_uint_va.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_uint_va.c
deleted file mode 100644
index b04cfd1..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_uint_va.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Test anonymous unsigned int argument.
-   Limitations:	none.
-   PR:		none.
-   Originator:	ARM Ltd. */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-typedef unsigned int T;
-
-static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			 void* userdata __UNUSED__)
- {
-   *(ffi_arg *)resp = *(T *)args[0];
-
-   printf("%d: %d %d\n", (int)*(ffi_arg *)resp, *(T *)args[0], *(T *)args[1]);
- }
-
-typedef T (*cls_ret_T)(T, ...);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[3];
-  T res;
-
-  cl_arg_types[0] = &ffi_type_uint;
-  cl_arg_types[1] = &ffi_type_uint;
-  cl_arg_types[2] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2,
-			 &ffi_type_uint, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code)  == FFI_OK);
-  res = ((((cls_ret_T)code)(67, 4)));
-  /* { dg-output "67: 67 4" } */
-  printf("res: %d\n", res);
-  /* { dg-output "\nres: 67" } */
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_ulong_va.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_ulong_va.c
deleted file mode 100644
index 0315082..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_ulong_va.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Test anonymous unsigned long argument.
-   Limitations:	none.
-   PR:		none.
-   Originator:	ARM Ltd. */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-typedef unsigned long T;
-
-static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			 void* userdata __UNUSED__)
- {
-   *(T *)resp = *(T *)args[0];
-
-   printf("%ld: %ld %ld\n", *(T *)resp, *(T *)args[0], *(T *)args[1]);
- }
-
-typedef T (*cls_ret_T)(T, ...);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[3];
-  T res;
-
-  cl_arg_types[0] = &ffi_type_ulong;
-  cl_arg_types[1] = &ffi_type_ulong;
-  cl_arg_types[2] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2,
-			 &ffi_type_ulong, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code)  == FFI_OK);
-  res = ((((cls_ret_T)code)(67, 4)));
-  /* { dg-output "67: 67 4" } */
-  printf("res: %ld\n", res);
-  /* { dg-output "\nres: 67" } */
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_ulonglong.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_ulonglong.c
deleted file mode 100644
index 62f2cae..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_ulonglong.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check return value long long.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */
-#include "ffitest.h"
-
-static void cls_ret_ulonglong_fn(ffi_cif* cif __UNUSED__, void* resp,
-				 void** args, void* userdata __UNUSED__)
-{
-  *(unsigned long long *)resp= 0xfffffffffffffffLL ^ *(unsigned long long *)args[0];
-
-  printf("%" PRIuLL ": %" PRIuLL "\n",*(unsigned long long *)args[0],
-	 *(unsigned long long *)(resp));
-}
-typedef unsigned long long (*cls_ret_ulonglong)(unsigned long long);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[2];
-  unsigned long long res;
-
-  cl_arg_types[0] = &ffi_type_uint64;
-  cl_arg_types[1] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_uint64, cl_arg_types) == FFI_OK);
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ulonglong_fn, NULL, code)  == FFI_OK);
-  res = (*((cls_ret_ulonglong)code))(214LL);
-  /* { dg-output "214: 1152921504606846761" } */
-  printf("res: %" PRIdLL "\n", res);
-  /* { dg-output "\nres: 1152921504606846761" } */
-
-  res = (*((cls_ret_ulonglong)code))(9223372035854775808LL);
-  /* { dg-output "\n9223372035854775808: 8070450533247928831" } */
-  printf("res: %" PRIdLL "\n", res);
-  /* { dg-output "\nres: 8070450533247928831" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_ushort.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_ushort.c
deleted file mode 100644
index a00100e..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_ushort.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check return value ushort.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static void cls_ret_ushort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			      void* userdata __UNUSED__)
-{
-  *(ffi_arg*)resp = *(unsigned short *)args[0];
-
-  printf("%d: %d\n",*(unsigned short *)args[0],
-	 (int)*(ffi_arg *)(resp));
-}
-typedef unsigned short (*cls_ret_ushort)(unsigned short);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[2];
-  unsigned short res;
-
-  cl_arg_types[0] = &ffi_type_ushort;
-  cl_arg_types[1] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_ushort, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ushort_fn, NULL, code)  == FFI_OK);
-
-  res = (*((cls_ret_ushort)code))(65535);
-  /* { dg-output "65535: 65535" } */
-  printf("res: %d\n",res);
-  /* { dg-output "\nres: 65535" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_ushort_va.c b/third_party/gofrontend/libffi/testsuite/libffi.call/cls_ushort_va.c
deleted file mode 100644
index 37aa106..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/cls_ushort_va.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Test anonymous unsigned short argument.
-   Limitations:	none.
-   PR:		none.
-   Originator:	ARM Ltd. */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef unsigned short T;
-
-static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			 void* userdata __UNUSED__)
- {
-   *(ffi_arg *)resp = *(T *)args[0];
-
-   printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]);
- }
-
-typedef T (*cls_ret_T)(T, ...);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[3];
-  T res;
-
-  cl_arg_types[0] = &ffi_type_ushort;
-  cl_arg_types[1] = &ffi_type_ushort;
-  cl_arg_types[2] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2,
-			 &ffi_type_ushort, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code)  == FFI_OK);
-  res = ((((cls_ret_T)code)(67, 4)));
-  /* { dg-output "67: 67 4" } */
-  printf("res: %d\n", res);
-  /* { dg-output "\nres: 67" } */
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/err_bad_abi.c b/third_party/gofrontend/libffi/testsuite/libffi.call/err_bad_abi.c
deleted file mode 100644
index f5a7317..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/err_bad_abi.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Area:		ffi_prep_cif, ffi_prep_closure
-   Purpose:		Test error return for bad ABIs.
-   Limitations:	none.
-   PR:			none.
-   Originator:	Blake Chaffin 6/6/2007	 */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-static void
-dummy_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, 
-	 void** args __UNUSED__, void* userdata __UNUSED__)
-{}
-
-int main (void)
-{
-	ffi_cif cif;
-        void *code;
-	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-	ffi_type* arg_types[1];
-
-	arg_types[0] = NULL;
-
-	CHECK(ffi_prep_cif(&cif, 255, 0, &ffi_type_void,
-		arg_types) == FFI_BAD_ABI);
-
-	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &ffi_type_void,
-		arg_types) == FFI_OK);
-
-	cif.abi= 255;
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, dummy_fn, NULL, code) == FFI_BAD_ABI);
-
-	exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/err_bad_typedef.c b/third_party/gofrontend/libffi/testsuite/libffi.call/err_bad_typedef.c
deleted file mode 100644
index bf60161..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/err_bad_typedef.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Area:		ffi_prep_cif
-   Purpose:		Test error return for bad typedefs.
-   Limitations:	none.
-   PR:			none.
-   Originator:	Blake Chaffin 6/6/2007	 */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-int main (void)
-{
-	ffi_cif cif;
-	ffi_type* arg_types[1];
-
-	ffi_type	badType	= ffi_type_void;
-
-	arg_types[0] = NULL;
-
-	badType.size = 0;
-
-	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &badType,
-		arg_types) == FFI_BAD_TYPEDEF);
-
-	exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/ffitest.h b/third_party/gofrontend/libffi/testsuite/libffi.call/ffitest.h
deleted file mode 100644
index 15d5e44..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/ffitest.h
+++ /dev/null
@@ -1,135 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <fcntl.h>
-#include <ffi.h>
-#include "fficonfig.h"
-
-#if defined HAVE_STDINT_H
-#include <stdint.h>
-#endif
-
-#if defined HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
-#define MAX_ARGS 256
-
-#define CHECK(x) (void)(!(x) ? (abort(), 1) : 0)
-
-/* Define macros so that compilers other than gcc can run the tests.  */
-#undef __UNUSED__
-#if defined(__GNUC__)
-#define __UNUSED__ __attribute__((__unused__))
-#define __STDCALL__ __attribute__((stdcall))
-#define __THISCALL__ __attribute__((thiscall))
-#define __FASTCALL__ __attribute__((fastcall))
-#else
-#define __UNUSED__
-#define __STDCALL__ __stdcall
-#define __THISCALL__ __thiscall
-#define __FASTCALL__ __fastcall
-#endif
-
-#ifndef ABI_NUM
-#define ABI_NUM FFI_DEFAULT_ABI
-#define ABI_ATTR
-#endif
-
-/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
-   file open.  */
-#ifdef HAVE_MMAP_ANON
-# undef HAVE_MMAP_DEV_ZERO
-
-# include <sys/mman.h>
-# ifndef MAP_FAILED
-#  define MAP_FAILED -1
-# endif
-# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
-#  define MAP_ANONYMOUS MAP_ANON
-# endif
-# define USING_MMAP
-
-#endif
-
-#ifdef HAVE_MMAP_DEV_ZERO
-
-# include <sys/mman.h>
-# ifndef MAP_FAILED
-#  define MAP_FAILED -1
-# endif
-# define USING_MMAP
-
-#endif
-
-/* MinGW kludge.  */
-#ifdef _WIN64
-#define PRIdLL "I64d"
-#define PRIuLL "I64u"
-#else
-#define PRIdLL "lld"
-#define PRIuLL "llu"
-#endif
-
-/* Tru64 UNIX kludge.  */
-#if defined(__alpha__) && defined(__osf__)
-/* Tru64 UNIX V4.0 doesn't support %lld/%lld, but long is 64-bit.  */
-#undef PRIdLL
-#define PRIdLL "ld"
-#undef PRIuLL
-#define PRIuLL "lu"
-#define PRId8 "hd"
-#define PRIu8 "hu"
-#define PRId64 "ld"
-#define PRIu64 "lu"
-#define PRIuPTR "lu"
-#endif
-
-/* PA HP-UX kludge.  */
-#if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR)
-#define PRIuPTR "lu"
-#endif
-
-/* IRIX kludge.  */
-#if defined(__sgi)
-/* IRIX 6.5 <inttypes.h> provides all definitions, but only for C99
-   compilations.  */
-#define PRId8 "hhd"
-#define PRIu8 "hhu"
-#if (_MIPS_SZLONG == 32)
-#define PRId64 "lld"
-#define PRIu64 "llu"
-#endif
-/* This doesn't match <inttypes.h>, which always has "lld" here, but the
-   arguments are uint64_t, int64_t, which are unsigned long, long for
-   64-bit in <sgidefs.h>.  */
-#if (_MIPS_SZLONG == 64)
-#define PRId64 "ld"
-#define PRIu64 "lu"
-#endif
-/* This doesn't match <inttypes.h>, which has "u" here, but the arguments
-   are uintptr_t, which is always unsigned long.  */
-#define PRIuPTR "lu"
-#endif
-
-/* Solaris < 10 kludge.  */
-#if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR)
-#if defined(__arch64__) || defined (__x86_64__)
-#define PRIuPTR "lu"
-#else
-#define PRIuPTR "u"
-#endif
-#endif
-
-/* MSVC kludge.  */
-#if defined _MSC_VER
-#define PRIuPTR "lu"
-#define PRIu8 "u"
-#define PRId8 "d"
-#define PRIu64 "I64u"
-#define PRId64 "I64d"
-#endif
-
-#ifndef PRIuPTR
-#define PRIuPTR "u"
-#endif
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/float.c b/third_party/gofrontend/libffi/testsuite/libffi.call/float.c
deleted file mode 100644
index fbc272d..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/float.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value float.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-static int floating(int a, float b, double c, long double d)
-{
-  int i;
-
-  i = (int) ((float)a/b + ((float)c/(float)d));
-
-  return i;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-
-  float f;
-  signed int si1;
-  double d;
-  long double ld;
-
-  args[0] = &ffi_type_sint;
-  values[0] = &si1;
-  args[1] = &ffi_type_float;
-  values[1] = &f;
-  args[2] = &ffi_type_double;
-  values[2] = &d;
-  args[3] = &ffi_type_longdouble;
-  values[3] = &ld;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
-		     &ffi_type_sint, args) == FFI_OK);
-
-  si1 = 6;
-  f = 3.14159;
-  d = (double)1.0/(double)3.0;
-  ld = 2.71828182846L;
-
-  floating (si1, f, d, ld);
-
-  ffi_call(&cif, FFI_FN(floating), &rint, values);
-
-  printf ("%d vs %d\n", (int)rint, floating (si1, f, d, ld));
-
-  CHECK((int)rint == floating(si1, f, d, ld));
-
-  exit (0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/float1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/float1.c
deleted file mode 100644
index c48493c..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/float1.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value double.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-#include "float.h"
-
-#include <math.h>
-
-typedef union
-{
-  double d;
-  unsigned char c[sizeof (double)];
-} value_type;
-
-#define CANARY 0xba
-
-static double dblit(float f)
-{
-  return f/3.0;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  float f;
-  value_type result[2];
-  unsigned int i;
-
-  args[0] = &ffi_type_float;
-  values[0] = &f;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_double, args) == FFI_OK);
-
-  f = 3.14159;
-
-  /* Put a canary in the return array.  This is a regression test for
-     a buffer overrun.  */
-  memset(result[1].c, CANARY, sizeof (double));
-
-  ffi_call(&cif, FFI_FN(dblit), &result[0].d, values);
-
-  /* These are not always the same!! Check for a reasonable delta */
-
-  CHECK(fabs(result[0].d - dblit(f)) < DBL_EPSILON);
-
-  /* Check the canary.  */
-  for (i = 0; i < sizeof (double); ++i)
-    CHECK(result[1].c[i] == CANARY);
-
-  exit(0);
-
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/float2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/float2.c
deleted file mode 100644
index 20a8c40..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/float2.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value long double.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-/* { dg-do run } */
-
-#include "ffitest.h"
-#include "float.h"
-
-#include <math.h>
-
-static long double ldblit(float f)
-{
-  return (long double) (((long double) f)/ (long double) 3.0);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  float f;
-  long double ld;
-
-  args[0] = &ffi_type_float;
-  values[0] = &f;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_longdouble, args) == FFI_OK);
-
-  f = 3.14159;
-
-#if 1
-  /* This is ifdef'd out for now. long double support under SunOS/gcc
-     is pretty much non-existent.  You'll get the odd bus error in library
-     routines like printf().  */
-  printf ("%Lf\n", ldblit(f));
-#endif
-  ld = 666;
-  ffi_call(&cif, FFI_FN(ldblit), &ld, values);
-
-#if 1
-  /* This is ifdef'd out for now. long double support under SunOS/gcc
-     is pretty much non-existent.  You'll get the odd bus error in library
-     routines like printf().  */
-  printf ("%Lf, %Lf, %Lf, %Lf\n", ld, ldblit(f), ld - ldblit(f), LDBL_EPSILON);
-#endif
-
-  /* These are not always the same!! Check for a reasonable delta */
-  if (fabsl(ld - ldblit(f)) < LDBL_EPSILON)
-    puts("long double return value tests ok!");
-  else
-    CHECK(0);
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/float3.c b/third_party/gofrontend/libffi/testsuite/libffi.call/float3.c
deleted file mode 100644
index bab3206..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/float3.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check float arguments with different orders.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-#include "float.h"
-
-#include <math.h>
-
-static double floating_1(float a, double b, long double c)
-{
-  return (double) a + b + (double) c;
-}
-
-static double floating_2(long double a, double b, float c)
-{
-  return (double) a + b + (double) c;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  double rd;
-
-  float f;
-  double d;
-  long double ld;
-
-  args[0] = &ffi_type_float;
-  values[0] = &f;
-  args[1] = &ffi_type_double;
-  values[1] = &d;
-  args[2] = &ffi_type_longdouble;
-  values[2] = &ld;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
-		     &ffi_type_double, args) == FFI_OK);
-
-  f = 3.14159;
-  d = (double)1.0/(double)3.0;
-  ld = 2.71828182846L;
-
-  floating_1 (f, d, ld);
-
-  ffi_call(&cif, FFI_FN(floating_1), &rd, values);
-
-  CHECK(fabs(rd - floating_1(f, d, ld)) < DBL_EPSILON);
-
-  args[0] = &ffi_type_longdouble;
-  values[0] = &ld;
-  args[1] = &ffi_type_double;
-  values[1] = &d;
-  args[2] = &ffi_type_float;
-  values[2] = &f;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
-		     &ffi_type_double, args) == FFI_OK);
-
-  floating_2 (ld, d, f);
-
-  ffi_call(&cif, FFI_FN(floating_2), &rd, values);
-
-  CHECK(fabs(rd - floating_2(ld, d, f)) < DBL_EPSILON);
-
-  exit (0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/float4.c b/third_party/gofrontend/libffi/testsuite/libffi.call/float4.c
deleted file mode 100644
index 0dd6d85..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/float4.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check denorm double value.
-   Limitations:	none.
-   PR:		PR26483.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-/* { dg-options "-mieee" { target alpha*-*-* } } */
-
-#include "ffitest.h"
-#include "float.h"
-
-typedef union
-{
-  double d;
-  unsigned char c[sizeof (double)];
-} value_type;
-
-#define CANARY 0xba
-
-static double dblit(double d)
-{
-  return d;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  double d;
-  value_type result[2];
-  unsigned int i;
-
-  args[0] = &ffi_type_double;
-  values[0] = &d;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_double, args) == FFI_OK);
-  
-  d = DBL_MIN / 2;
-  
-  /* Put a canary in the return array.  This is a regression test for
-     a buffer overrun.  */
-  memset(result[1].c, CANARY, sizeof (double));
-
-  ffi_call(&cif, FFI_FN(dblit), &result[0].d, values);
-  
-  /* The standard delta check doesn't work for denorms.  Since we didn't do
-     any arithmetic, we should get the original result back, and hence an
-     exact check should be OK here.  */
- 
-  CHECK(result[0].d == dblit(d));
-
-  /* Check the canary.  */
-  for (i = 0; i < sizeof (double); ++i)
-    CHECK(result[1].c[i] == CANARY);
-
-  exit(0);
-
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/float_va.c b/third_party/gofrontend/libffi/testsuite/libffi.call/float_va.c
deleted file mode 100644
index 5acff91..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/float_va.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/* Area:        fp and variadics
-   Purpose:     check fp inputs and returns work on variadics, even the fixed params
-   Limitations: None
-   PR:          none
-   Originator:  <david.gilbert@linaro.org> 2011-01-25
-
-   Intended to stress the difference in ABI on ARM vfp
-*/
-
-/* { dg-do run } */
-
-#include <stdarg.h>
-
-#include "ffitest.h"
-
-/* prints out all the parameters, and returns the sum of them all.
- * 'x' is the number of variadic parameters all of which are double in this test
- */
-double float_va_fn(unsigned int x, double y,...)
-{
-  double total=0.0;
-  va_list ap;
-  unsigned int i;
-
-  total+=(double)x;
-  total+=y;
-
-  printf("%u: %.1f :", x, y);
-
-  va_start(ap, y);
-  for(i=0;i<x;i++)
-  {
-    double arg=va_arg(ap, double);
-    total+=arg;
-    printf(" %d:%.1f ", i, arg);
-  }
-  va_end(ap);
-
-  printf(" total: %.1f\n", total);
-
-  return total;
-}
-
-int main (void)
-{
-  ffi_cif    cif;
-
-  ffi_type    *arg_types[5];
-  void        *values[5];
-  double        doubles[5];
-  unsigned int firstarg;
-  double        resfp;
-
-  /* First test, pass float_va_fn(0,2.0) - note there are no actual
-   * variadic parameters, but it's declared variadic so the ABI may be
-   * different. */
-  /* Call it statically and then via ffi */
-  resfp=float_va_fn(0,2.0);
-  /* { dg-output "0: 2.0 : total: 2.0" } */
-  printf("compiled: %.1f\n", resfp);
-  /* { dg-output "\ncompiled: 2.0" } */
-
-  arg_types[0] = &ffi_type_uint;
-  arg_types[1] = &ffi_type_double;
-  arg_types[2] = NULL;
-  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 2, 2,
-        &ffi_type_double, arg_types) == FFI_OK);
-
-  firstarg = 0;
-  doubles[0] = 2.0;
-  values[0] = &firstarg;
-  values[1] = &doubles[0];
-  ffi_call(&cif, FFI_FN(float_va_fn), &resfp, values);
-  /* { dg-output "\n0: 2.0 : total: 2.0" } */
-  printf("ffi: %.1f\n", resfp);
-  /* { dg-output "\nffi: 2.0" } */
-
-  /* Second test, float_va_fn(2,2.0,3.0,4.0), now with variadic params */
-  /* Call it statically and then via ffi */
-  resfp=float_va_fn(2,2.0,3.0,4.0);
-  /* { dg-output "\n2: 2.0 : 0:3.0  1:4.0  total: 11.0" } */
-  printf("compiled: %.1f\n", resfp);
-  /* { dg-output "\ncompiled: 11.0" } */
-
-  arg_types[0] = &ffi_type_uint;
-  arg_types[1] = &ffi_type_double;
-  arg_types[2] = &ffi_type_double;
-  arg_types[3] = &ffi_type_double;
-  arg_types[4] = NULL;
-  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 2, 4,
-        &ffi_type_double, arg_types) == FFI_OK);
-
-  firstarg = 2;
-  doubles[0] = 2.0;
-  doubles[1] = 3.0;
-  doubles[2] = 4.0;
-  values[0] = &firstarg;
-  values[1] = &doubles[0];
-  values[2] = &doubles[1];
-  values[3] = &doubles[2];
-  ffi_call(&cif, FFI_FN(float_va_fn), &resfp, values);
-  /* { dg-output "\n2: 2.0 : 0:3.0  1:4.0  total: 11.0" } */
-  printf("ffi: %.1f\n", resfp);
-  /* { dg-output "\nffi: 11.0" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/huge_struct.c b/third_party/gofrontend/libffi/testsuite/libffi.call/huge_struct.c
deleted file mode 100644
index 187c42c..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/huge_struct.c
+++ /dev/null
@@ -1,341 +0,0 @@
-/*	Area:			ffi_call, closure_call
-	Purpose:		Check large structure returns.
-	Limitations:	none.
-	PR:				none.
-	Originator:		Blake Chaffin	6/18/2007
-*/
-
-/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
-/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
-/* { dg-options -Wformat=0 { target moxie*-*-elf } } */
-
-#include "ffitest.h"
-
-typedef	struct BigStruct{
-	uint8_t		a;
-	int8_t		b;
-	uint16_t	c;
-	int16_t		d;
-	uint32_t	e;
-	int32_t		f;
-	uint64_t	g;
-	int64_t		h;
-	float		i;
-	double		j;
-	long double	k;
-	char*		l;
-	uint8_t		m;
-	int8_t		n;
-	uint16_t	o;
-	int16_t		p;
-	uint32_t	q;
-	int32_t		r;
-	uint64_t	s;
-	int64_t		t;
-	float		u;
-	double		v;
-	long double	w;
-	char*		x;
-	uint8_t		y;
-	int8_t		z;
-	uint16_t	aa;
-	int16_t		bb;
-	uint32_t	cc;
-	int32_t		dd;
-	uint64_t	ee;
-	int64_t		ff;
-	float		gg;
-	double		hh;
-	long double	ii;
-	char*		jj;
-	uint8_t		kk;
-	int8_t		ll;
-	uint16_t	mm;
-	int16_t		nn;
-	uint32_t	oo;
-	int32_t		pp;
-	uint64_t	qq;
-	int64_t		rr;
-	float		ss;
-	double		tt;
-	long double	uu;
-	char*		vv;
-	uint8_t		ww;
-	int8_t		xx;
-} BigStruct;
-
-BigStruct
-test_large_fn(
-	uint8_t		ui8_1,
-	int8_t		si8_1,
-	uint16_t	ui16_1,
-	int16_t		si16_1,
-	uint32_t	ui32_1,
-	int32_t		si32_1,
-	uint64_t	ui64_1,
-	int64_t		si64_1,
-	float		f_1,
-	double		d_1,
-	long double	ld_1,
-	char*		p_1,
-	uint8_t		ui8_2,
-	int8_t		si8_2,
-	uint16_t	ui16_2,
-	int16_t		si16_2,
-	uint32_t	ui32_2,
-	int32_t		si32_2,
-	uint64_t	ui64_2,
-	int64_t		si64_2,
-	float		f_2,
-	double		d_2,
-	long double	ld_2,
-	char*		p_2,
-	uint8_t		ui8_3,
-	int8_t		si8_3,
-	uint16_t	ui16_3,
-	int16_t		si16_3,
-	uint32_t	ui32_3,
-	int32_t		si32_3,
-	uint64_t	ui64_3,
-	int64_t		si64_3,
-	float		f_3,
-	double		d_3,
-	long double	ld_3,
-	char*		p_3,
-	uint8_t		ui8_4,
-	int8_t		si8_4,
-	uint16_t	ui16_4,
-	int16_t		si16_4,
-	uint32_t	ui32_4,
-	int32_t		si32_4,
-	uint64_t	ui64_4,
-	int64_t		si64_4,
-	float		f_4,
-	double		d_4,
-	long double	ld_4,
-	char*		p_4,
-	uint8_t		ui8_5,
-	int8_t		si8_5)
-{
-	BigStruct	retVal	= {
-		ui8_1 + 1, si8_1 + 1, ui16_1 + 1, si16_1 + 1, ui32_1 + 1, si32_1 + 1,
-			ui64_1 + 1, si64_1 + 1, f_1 + 1, d_1 + 1, ld_1 + 1, (char*)((intptr_t)p_1 + 1), 
-		ui8_2 + 2, si8_2 + 2, ui16_2 + 2, si16_2 + 2, ui32_2 + 2, si32_2 + 2,
-			ui64_2 + 2, si64_2 + 2, f_2 + 2, d_2 + 2, ld_2 + 2, (char*)((intptr_t)p_2 + 2), 
-		ui8_3 + 3, si8_3 + 3, ui16_3 + 3, si16_3 + 3, ui32_3 + 3, si32_3 + 3,
-			ui64_3 + 3, si64_3 + 3, f_3 + 3, d_3 + 3, ld_3 + 3, (char*)((intptr_t)p_3 + 3), 
-		ui8_4 + 4, si8_4 + 4, ui16_4 + 4, si16_4 + 4, ui32_4 + 4, si32_4 + 4,
-			ui64_4 + 4, si64_4 + 4, f_4 + 4, d_4 + 4, ld_4 + 4, (char*)((intptr_t)p_4 + 4), 
-		ui8_5 + 5, si8_5 + 5};
-
-	printf("%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
-		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
-		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
-		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 ": "
-		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
-		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
-		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
-		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
-	       ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, (unsigned long)p_1,
-		ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, (unsigned long)p_2,
-		ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, (unsigned long)p_3,
-		ui8_4, si8_4, ui16_4, si16_4, ui32_4, si32_4, ui64_4, si64_4, f_4, d_4, ld_4, (unsigned long)p_4, ui8_5, si8_5,
-		retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
-	       retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
-		retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
-	       retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x,
-		retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
-	       retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj,
-		retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
-	       retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx);
-
-	return	retVal;
-}
-
-static void
-cls_large_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
-{
-	uint8_t		ui8_1	= *(uint8_t*)args[0];
-	int8_t		si8_1	= *(int8_t*)args[1];
-	uint16_t	ui16_1	= *(uint16_t*)args[2];
-	int16_t		si16_1	= *(int16_t*)args[3];
-	uint32_t	ui32_1	= *(uint32_t*)args[4];
-	int32_t		si32_1	= *(int32_t*)args[5];
-	uint64_t	ui64_1	= *(uint64_t*)args[6];
-	int64_t		si64_1	= *(int64_t*)args[7];
-	float		f_1		= *(float*)args[8];
-	double		d_1		= *(double*)args[9];
-	long double	ld_1	= *(long double*)args[10];
-	char*		p_1		= *(char**)args[11];
-	uint8_t		ui8_2	= *(uint8_t*)args[12];
-	int8_t		si8_2	= *(int8_t*)args[13];
-	uint16_t	ui16_2	= *(uint16_t*)args[14];
-	int16_t		si16_2	= *(int16_t*)args[15];
-	uint32_t	ui32_2	= *(uint32_t*)args[16];
-	int32_t		si32_2	= *(int32_t*)args[17];
-	uint64_t	ui64_2	= *(uint64_t*)args[18];
-	int64_t		si64_2	= *(int64_t*)args[19];
-	float		f_2		= *(float*)args[20];
-	double		d_2		= *(double*)args[21];
-	long double	ld_2	= *(long double*)args[22];
-	char*		p_2		= *(char**)args[23];
-	uint8_t		ui8_3	= *(uint8_t*)args[24];
-	int8_t		si8_3	= *(int8_t*)args[25];
-	uint16_t	ui16_3	= *(uint16_t*)args[26];
-	int16_t		si16_3	= *(int16_t*)args[27];
-	uint32_t	ui32_3	= *(uint32_t*)args[28];
-	int32_t		si32_3	= *(int32_t*)args[29];
-	uint64_t	ui64_3	= *(uint64_t*)args[30];
-	int64_t		si64_3	= *(int64_t*)args[31];
-	float		f_3		= *(float*)args[32];
-	double		d_3		= *(double*)args[33];
-	long double	ld_3	= *(long double*)args[34];
-	char*		p_3		= *(char**)args[35];
-	uint8_t		ui8_4	= *(uint8_t*)args[36];
-	int8_t		si8_4	= *(int8_t*)args[37];
-	uint16_t	ui16_4	= *(uint16_t*)args[38];
-	int16_t		si16_4	= *(int16_t*)args[39];
-	uint32_t	ui32_4	= *(uint32_t*)args[40];
-	int32_t		si32_4	= *(int32_t*)args[41];
-	uint64_t	ui64_4	= *(uint64_t*)args[42];
-	int64_t		si64_4	= *(int64_t*)args[43];
-	float		f_4		= *(float*)args[44];
-	double		d_4		= *(double*)args[45];
-	long double	ld_4	= *(long double*)args[46];
-	char*		p_4		= *(char**)args[47];
-	uint8_t		ui8_5	= *(uint8_t*)args[48];
-	int8_t		si8_5	= *(int8_t*)args[49];
-
-	*(BigStruct*)resp = test_large_fn(
-		ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, p_1,
-		ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, p_2,
-		ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, p_3,
-		ui8_4, si8_4, ui16_4, si16_4, ui32_4, si32_4, ui64_4, si64_4, f_4, d_4, ld_4, p_4,
-		ui8_5, si8_5);
-}
-
-int
-main(int argc __UNUSED__, const char** argv __UNUSED__)
-{
-        void *code;
-	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-
-	ffi_cif		cif;
-	ffi_type*	argTypes[51];
-	void*		argValues[51];
-
-	ffi_type	ret_struct_type;
-	ffi_type*	st_fields[51];
-	BigStruct	retVal;
-
-	uint8_t		ui8		= 1;
-	int8_t		si8		= 2;
-	uint16_t	ui16	= 3;
-	int16_t		si16	= 4;
-	uint32_t	ui32	= 5;
-	int32_t		si32	= 6;
-	uint64_t	ui64	= 7;
-	int64_t		si64	= 8;
-	float		f		= 9;
-	double		d		= 10;
-	long double	ld		= 11;
-	char*		p		= (char*)0x12345678;
-
-	memset (&retVal, 0, sizeof(retVal));
-
-	ret_struct_type.size = 0;
-	ret_struct_type.alignment = 0;
-	ret_struct_type.type = FFI_TYPE_STRUCT;
-	ret_struct_type.elements = st_fields;
-
-	st_fields[0]	= st_fields[12]	= st_fields[24]	= st_fields[36]	= st_fields[48]	= &ffi_type_uint8;
-	st_fields[1]	= st_fields[13]	= st_fields[25]	= st_fields[37]	= st_fields[49]	= &ffi_type_sint8;
-	st_fields[2]	= st_fields[14]	= st_fields[26]	= st_fields[38]	= &ffi_type_uint16;
-	st_fields[3]	= st_fields[15]	= st_fields[27]	= st_fields[39]	= &ffi_type_sint16;
-	st_fields[4]	= st_fields[16]	= st_fields[28]	= st_fields[40]	= &ffi_type_uint32;
-	st_fields[5]	= st_fields[17]	= st_fields[29]	= st_fields[41]	= &ffi_type_sint32;
-	st_fields[6]	= st_fields[18]	= st_fields[30]	= st_fields[42]	= &ffi_type_uint64;
-	st_fields[7]	= st_fields[19]	= st_fields[31]	= st_fields[43]	= &ffi_type_sint64;
-	st_fields[8]	= st_fields[20]	= st_fields[32]	= st_fields[44]	= &ffi_type_float;
-	st_fields[9]	= st_fields[21]	= st_fields[33]	= st_fields[45]	= &ffi_type_double;
-	st_fields[10]	= st_fields[22]	= st_fields[34]	= st_fields[46]	= &ffi_type_longdouble;
-	st_fields[11]	= st_fields[23]	= st_fields[35]	= st_fields[47]	= &ffi_type_pointer;
-
-	st_fields[50] = NULL;
-
-	argTypes[0]		= argTypes[12]	= argTypes[24]	= argTypes[36]	= argTypes[48]	= &ffi_type_uint8;
-	argValues[0]	= argValues[12]	= argValues[24]	= argValues[36]	= argValues[48]	= &ui8;
-	argTypes[1]		= argTypes[13]	= argTypes[25]	= argTypes[37]	= argTypes[49]	= &ffi_type_sint8;
-	argValues[1]	= argValues[13]	= argValues[25]	= argValues[37]	= argValues[49]	= &si8;
-	argTypes[2]		= argTypes[14]	= argTypes[26]	= argTypes[38]	= &ffi_type_uint16;
-	argValues[2]	= argValues[14]	= argValues[26]	= argValues[38]	= &ui16;
-	argTypes[3]		= argTypes[15]	= argTypes[27]	= argTypes[39]	= &ffi_type_sint16;
-	argValues[3]	= argValues[15]	= argValues[27]	= argValues[39]	= &si16;
-	argTypes[4]		= argTypes[16]	= argTypes[28]	= argTypes[40]	= &ffi_type_uint32;
-	argValues[4]	= argValues[16]	= argValues[28]	= argValues[40]	= &ui32;
-	argTypes[5]		= argTypes[17]	= argTypes[29]	= argTypes[41]	= &ffi_type_sint32;
-	argValues[5]	= argValues[17]	= argValues[29]	= argValues[41]	= &si32;
-	argTypes[6]		= argTypes[18]	= argTypes[30]	= argTypes[42]	= &ffi_type_uint64;
-	argValues[6]	= argValues[18]	= argValues[30]	= argValues[42]	= &ui64;
-	argTypes[7]		= argTypes[19]	= argTypes[31]	= argTypes[43]	= &ffi_type_sint64;
-	argValues[7]	= argValues[19]	= argValues[31]	= argValues[43]	= &si64;
-	argTypes[8]		= argTypes[20]	= argTypes[32]	= argTypes[44]	= &ffi_type_float;
-	argValues[8]	= argValues[20]	= argValues[32]	= argValues[44]	= &f;
-	argTypes[9]		= argTypes[21]	= argTypes[33]	= argTypes[45]	= &ffi_type_double;
-	argValues[9]	= argValues[21]	= argValues[33]	= argValues[45]	= &d;
-	argTypes[10]	= argTypes[22]	= argTypes[34]	= argTypes[46]	= &ffi_type_longdouble;
-	argValues[10]	= argValues[22]	= argValues[34]	= argValues[46]	= &ld;
-	argTypes[11]	= argTypes[23]	= argTypes[35]	= argTypes[47]	= &ffi_type_pointer;
-	argValues[11]	= argValues[23]	= argValues[35]	= argValues[47]	= &p;
-
-	argTypes[50]	= NULL;
-	argValues[50]	= NULL;
-
-	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 50, &ret_struct_type, argTypes) == FFI_OK);
-
-	ffi_call(&cif, FFI_FN(test_large_fn), &retVal, argValues);
-	/* { dg-output "1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */
-	printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
-		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
-		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
-		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
-		retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
-	       retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
-		retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
-	       retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x,
-		retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
-	       retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj,
-		retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
-	       retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx);
-	/* { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_large_fn, NULL, code) == FFI_OK);
-
-	retVal	= ((BigStruct(*)(
-		uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
-		uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
-		uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
-		uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
-		uint8_t, int8_t))(code))(
-		ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p,
-		ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p,
-		ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p,
-		ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p,
-		ui8, si8);
-	/* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */
-	printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
-		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
-		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
-		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
-		retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
-	       retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
-		retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
-	       retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x,
-		retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
-	       retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj,
-		retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
-	       retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx);
-	/* { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */
-
-    return 0;
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/many.c b/third_party/gofrontend/libffi/testsuite/libffi.call/many.c
deleted file mode 100644
index 336968c..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/many.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value float, with many arguments
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-#include <stdlib.h>
-#include <float.h>
-#include <math.h>
-
-static float ABI_ATTR many(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9, float f10, float f11, float f12, float f13)
-{
-#if 0
-  printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n",
-	 (double) f1, (double) f2, (double) f3, (double) f4, (double) f5, 
-	 (double) f6, (double) f7, (double) f8, (double) f9, (double) f10,
-	 (double) f11, (double) f12, (double) f13);
-#endif
-
-  return f1+f2+f3+f4+f5+f6+f7+f8+f9+f10+f11+f12+f13;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[13];
-  void *values[13];
-  float fa[13];
-  float f, ff;
-  int i;
-
-  for (i = 0; i < 13; i++)
-    {
-      args[i] = &ffi_type_float;
-      values[i] = &fa[i];
-      fa[i] = (float) i;
-    }
-
-    /* Initialize the cif */
-    CHECK(ffi_prep_cif(&cif, ABI_NUM, 13,
-		       &ffi_type_float, args) == FFI_OK);
-
-    ffi_call(&cif, FFI_FN(many), &f, values);
-
-    ff =  many(fa[0], fa[1],
-	       fa[2], fa[3],
-	       fa[4], fa[5],
-	       fa[6], fa[7],
-	       fa[8], fa[9],
-	       fa[10],fa[11],fa[12]);
-
-    if (fabs(f - ff) < FLT_EPSILON)
-      exit(0);
-    else
-      abort();
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/many2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/many2.c
deleted file mode 100644
index 1c85746..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/many2.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Area:        ffi_call
-   Purpose:     Check uint8_t arguments.
-   Limitations: none.
-   PR:          PR45677.
-   Originator:  Dan Witte <dwitte@gmail.com> 20100916  */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-#define NARGS 7
-
-typedef unsigned char u8;
-
-#ifdef __GNUC__
-__attribute__((noinline))
-#endif
-uint8_t
-foo (uint8_t a, uint8_t b, uint8_t c, uint8_t d,
-     uint8_t e, uint8_t f, uint8_t g)
-{
-  return a + b + c + d + e + f + g;
-}
-
-uint8_t ABI_ATTR
-bar (uint8_t a, uint8_t b, uint8_t c, uint8_t d,
-     uint8_t e, uint8_t f, uint8_t g)
-{
-  return foo (a, b, c, d, e, f, g);
-}
-
-int
-main (void)
-{
-  ffi_type *ffitypes[NARGS];
-  int i;
-  ffi_cif cif;
-  ffi_arg result = 0;
-  uint8_t args[NARGS];
-  void *argptrs[NARGS];
-
-  for (i = 0; i < NARGS; ++i)
-    ffitypes[i] = &ffi_type_uint8;
-
-  CHECK (ffi_prep_cif (&cif, ABI_NUM, NARGS,
-		       &ffi_type_uint8, ffitypes) == FFI_OK);
-
-  for (i = 0; i < NARGS; ++i)
-    {
-      args[i] = i;
-      argptrs[i] = &args[i];
-    }
-  ffi_call (&cif, FFI_FN (bar), &result, argptrs);
-
-  CHECK (result == 21);
-  return 0;
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/many_double.c b/third_party/gofrontend/libffi/testsuite/libffi.call/many_double.c
deleted file mode 100644
index 4ef8c8a..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/many_double.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value double, with many arguments
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-#include <stdlib.h>
-#include <float.h>
-#include <math.h>
-
-static double many(double f1,
-		  double f2,
-		  double f3,
-		  double f4,
-		  double f5,
-		  double f6,
-		  double f7,
-		  double f8,
-		  double f9,
-		  double f10,
-		  double f11,
-		  double f12,
-		  double f13)
-{
-#if 0
-  printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n",
-	 (double) f1, (double) f2, (double) f3, (double) f4, (double) f5, 
-	 (double) f6, (double) f7, (double) f8, (double) f9, (double) f10,
-	 (double) f11, (double) f12, (double) f13);
-#endif
-
-  return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[13];
-  void *values[13];
-  double fa[13];
-  double f, ff;
-  int i;
-
-  for (i = 0; i < 13; i++)
-    {
-      args[i] = &ffi_type_double;
-      values[i] = &fa[i];
-      fa[i] = (double) i;
-    }
-
-    /* Initialize the cif */
-    CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, 
-		       &ffi_type_double, args) == FFI_OK);
-
-    ffi_call(&cif, FFI_FN(many), &f, values);
-
-    ff =  many(fa[0], fa[1],
-	       fa[2], fa[3],
-	       fa[4], fa[5],
-	       fa[6], fa[7],
-	       fa[8], fa[9],
-	       fa[10],fa[11],fa[12]);
-    if (fabs(f - ff) < FLT_EPSILON)
-      exit(0);
-    else
-      abort();
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/many_mixed.c b/third_party/gofrontend/libffi/testsuite/libffi.call/many_mixed.c
deleted file mode 100644
index 85ec36e..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/many_mixed.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value double, with many arguments
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-#include <stdlib.h>
-#include <float.h>
-#include <math.h>
-
-static double many(double f1,
-		  double f2,
-		  long int i1,
-		  double f3,
-		  double f4,
-		  long int i2,
-		  double f5,
-		  double f6,
-		  long int i3,
-		  double f7,
-		  double f8,
-		  long int i4,
-		  double f9,
-		  double f10,
-		  long int i5,
-		  double f11,
-		  double f12,
-		  long int i6,
-		  double f13)
-{
-  return ((double) (i1 + i2 + i3 + i4 + i5 + i6) + (f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[19];
-  void *values[19];
-  double fa[19];
-  long int la[19];
-  double f, ff;
-  int i;
-
-  for (i = 0; i < 19; i++)
-    {
-	  if( (i - 2) % 3 == 0) {
-	    args[i] = &ffi_type_slong;
-	    la[i] = (long int) i;
-	    values[i] = &la[i];
-	  }
-	  else {
-	    args[i] = &ffi_type_double;
-	    fa[i] = (double) i;
-	    values[i] = &fa[i];
-	  }
-    }
-
-    /* Initialize the cif */
-    CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 19,
-		       &ffi_type_double, args) == FFI_OK);
-
-    ffi_call(&cif, FFI_FN(many), &f, values);
-
-    ff =  many(fa[0], fa[1], la[2],
-               fa[3], fa[4], la[5],
-               fa[6], fa[7], la[8],
-               fa[9], fa[10], la[11],
-               fa[12], fa[13], la[14],
-               fa[15], fa[16], la[17],
-               fa[18]);
-    if (fabs(f - ff) < FLT_EPSILON)
-      exit(0);
-    else
-      abort();
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/negint.c b/third_party/gofrontend/libffi/testsuite/libffi.call/negint.c
deleted file mode 100644
index 6e2f26f..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/negint.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check that negative integers are passed correctly.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-static int checking(int a, short b, signed char c)
-{
-
-  return (a < 0 && b < 0 && c < 0);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-
-  signed int si;
-  signed short ss;
-  signed char sc;
-
-  args[0] = &ffi_type_sint;
-  values[0] = &si;
-  args[1] = &ffi_type_sshort;
-  values[1] = &ss;
-  args[2] = &ffi_type_schar;
-  values[2] = &sc;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
-		     &ffi_type_sint, args) == FFI_OK);
-
-  si = -6;
-  ss = -12;
-  sc = -1;
-
-  checking (si, ss, sc);
-
-  ffi_call(&cif, FFI_FN(checking), &rint, values);
-
-  printf ("%d vs %d\n", (int)rint, checking (si, ss, sc));
-
-  CHECK(rint != 0);
-
-  exit (0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct.c b/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct.c
deleted file mode 100644
index c15e3a0..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Contains structs as parameter of the struct itself.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_16byte1 {
-  double a;
-  float b;
-  int c;
-} cls_struct_16byte1;
-
-typedef struct cls_struct_16byte2 {
-  int ii;
-  double dd;
-  float ff;
-} cls_struct_16byte2;
-
-typedef struct cls_struct_combined {
-  cls_struct_16byte1 d;
-  cls_struct_16byte2 e;
-} cls_struct_combined;
-
-cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0,
-			    struct cls_struct_16byte2 b1,
-			    struct cls_struct_combined b2)
-{
-  struct cls_struct_combined result;
-
-  result.d.a = b0.a + b1.dd + b2.d.a;
-  result.d.b = b0.b + b1.ff + b2.d.b;
-  result.d.c = b0.c + b1.ii + b2.d.c;
-  result.e.ii = b0.c + b1.ii + b2.e.ii;
-  result.e.dd = b0.a + b1.dd + b2.e.dd;
-  result.e.ff = b0.b + b1.ff + b2.e.ff;
-
-  printf("%g %g %d %d %g %g %g %g %d %d %g %g: %g %g %d %d %g %g\n",
-	 b0.a, b0.b, b0.c,
-	 b1.ii, b1.dd, b1.ff,
-	 b2.d.a, b2.d.b, b2.d.c,
-	 b2.e.ii, b2.e.dd, b2.e.ff,
-	 result.d.a, result.d.b, result.d.c,
-	 result.e.ii, result.e.dd, result.e.ff);
-
-  return result;
-}
-
-static void
-cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		       void* userdata __UNUSED__)
-{
-  struct cls_struct_16byte1 b0;
-  struct cls_struct_16byte2 b1;
-  struct cls_struct_combined b2;
-
-  b0 = *(struct cls_struct_16byte1*)(args[0]);
-  b1 = *(struct cls_struct_16byte2*)(args[1]);
-  b2 = *(struct cls_struct_combined*)(args[2]);
-
-
-  *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[5];
-  ffi_type* cls_struct_fields1[5];
-  ffi_type* cls_struct_fields2[5];
-  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6};
-  struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0};
-  struct cls_struct_combined g_dbl = {{4.0, 5.0, 6},
-				      {3, 1.0, 8.0}};
-  struct cls_struct_combined res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_type1.size = 0;
-  cls_struct_type1.alignment = 0;
-  cls_struct_type1.type = FFI_TYPE_STRUCT;
-  cls_struct_type1.elements = cls_struct_fields1;
-
-  cls_struct_type2.size = 0;
-  cls_struct_type2.alignment = 0;
-  cls_struct_type2.type = FFI_TYPE_STRUCT;
-  cls_struct_type2.elements = cls_struct_fields2;
-
-  cls_struct_fields[0] = &ffi_type_double;
-  cls_struct_fields[1] = &ffi_type_float;
-  cls_struct_fields[2] = &ffi_type_sint;
-  cls_struct_fields[3] = NULL;
-
-  cls_struct_fields1[0] = &ffi_type_sint;
-  cls_struct_fields1[1] = &ffi_type_double;
-  cls_struct_fields1[2] = &ffi_type_float;
-  cls_struct_fields1[3] = NULL;
-
-  cls_struct_fields2[0] = &cls_struct_type;
-  cls_struct_fields2[1] = &cls_struct_type1;
-  cls_struct_fields2[2] = NULL;
-
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type1;
-  dbl_arg_types[2] = &cls_struct_type2;
-  dbl_arg_types[3] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type2,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &e_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = &g_dbl;
-  args_dbl[3] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl);
-  /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */
-  CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
-  CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
-  CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
-  CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
-  CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
-  CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1,
-				     cls_struct_16byte2,
-				     cls_struct_combined))
-	     (code))(e_dbl, f_dbl, g_dbl);
-  /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */
-  CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
-  CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
-  CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
-  CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
-  CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
-  CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct1.c
deleted file mode 100644
index 477a6b9..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct1.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Contains structs as parameter of the struct itself.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_16byte1 {
-  double a;
-  float b;
-  int c;
-} cls_struct_16byte1;
-
-typedef struct cls_struct_16byte2 {
-  int ii;
-  double dd;
-  float ff;
-} cls_struct_16byte2;
-
-typedef struct cls_struct_combined {
-  cls_struct_16byte1 d;
-  cls_struct_16byte2 e;
-} cls_struct_combined;
-
-cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0,
-					   struct cls_struct_16byte2 b1,
-					   struct cls_struct_combined b2,
-					   struct cls_struct_16byte1 b3)
-{
-  struct cls_struct_combined result;
-
-  result.d.a = b0.a + b1.dd + b2.d.a;
-  result.d.b = b0.b + b1.ff + b2.d.b;
-  result.d.c = b0.c + b1.ii + b2.d.c;
-  result.e.ii = b0.c + b1.ii + b2.e.ii;
-  result.e.dd = b0.a + b1.dd + b2.e.dd;
-  result.e.ff = b0.b + b1.ff + b2.e.ff;
-
-  printf("%g %g %d %d %g %g %g %g %d %d %g %g %g %g %d: %g %g %d %d %g %g\n",
-	 b0.a, b0.b, b0.c,
-	 b1.ii, b1.dd, b1.ff,
-	 b2.d.a, b2.d.b, b2.d.c,
-	 b2.e.ii, b2.e.dd, b2.e.ff,
-	 b3.a, b3.b, b3.c,
-	 result.d.a, result.d.b, result.d.c,
-	 result.e.ii, result.e.dd, result.e.ff);
-
-  return result;
-}
-
-static void
-cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		       void* userdata __UNUSED__)
-{
-  struct cls_struct_16byte1 b0;
-  struct cls_struct_16byte2 b1;
-  struct cls_struct_combined b2;
-  struct cls_struct_16byte1 b3;
-
-  b0 = *(struct cls_struct_16byte1*)(args[0]);
-  b1 = *(struct cls_struct_16byte2*)(args[1]);
-  b2 = *(struct cls_struct_combined*)(args[2]);
-  b3 = *(struct cls_struct_16byte1*)(args[3]);
-
-
-  *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2, b3);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[5];
-  ffi_type* cls_struct_fields[5];
-  ffi_type* cls_struct_fields1[5];
-  ffi_type* cls_struct_fields2[5];
-  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6};
-  struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0};
-  struct cls_struct_combined g_dbl = {{4.0, 5.0, 6},
-				      {3, 1.0, 8.0}};
-  struct cls_struct_16byte1 h_dbl = { 3.0, 2.0, 4};
-  struct cls_struct_combined res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_type1.size = 0;
-  cls_struct_type1.alignment = 0;
-  cls_struct_type1.type = FFI_TYPE_STRUCT;
-  cls_struct_type1.elements = cls_struct_fields1;
-
-  cls_struct_type2.size = 0;
-  cls_struct_type2.alignment = 0;
-  cls_struct_type2.type = FFI_TYPE_STRUCT;
-  cls_struct_type2.elements = cls_struct_fields2;
-
-  cls_struct_fields[0] = &ffi_type_double;
-  cls_struct_fields[1] = &ffi_type_float;
-  cls_struct_fields[2] = &ffi_type_sint;
-  cls_struct_fields[3] = NULL;
-
-  cls_struct_fields1[0] = &ffi_type_sint;
-  cls_struct_fields1[1] = &ffi_type_double;
-  cls_struct_fields1[2] = &ffi_type_float;
-  cls_struct_fields1[3] = NULL;
-
-  cls_struct_fields2[0] = &cls_struct_type;
-  cls_struct_fields2[1] = &cls_struct_type1;
-  cls_struct_fields2[2] = NULL;
-
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type1;
-  dbl_arg_types[2] = &cls_struct_type2;
-  dbl_arg_types[3] = &cls_struct_type;
-  dbl_arg_types[4] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type2,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &e_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = &g_dbl;
-  args_dbl[3] = &h_dbl;
-  args_dbl[4] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl);
-  /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */
-  CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
-  CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
-  CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
-  CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
-  CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
-  CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1,
-				     cls_struct_16byte2,
-				     cls_struct_combined,
-				     cls_struct_16byte1))
-	     (code))(e_dbl, f_dbl, g_dbl, h_dbl);
-  /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */
-  CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
-  CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
-  CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
-  CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
-  CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
-  CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
-  /*  CHECK( 1 == 0); */
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct10.c b/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct10.c
deleted file mode 100644
index 34a74e7..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct10.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Contains structs as parameter of the struct itself.
-		Sample taken from Alan Modras patch to src/prep_cif.c.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20051010	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct A {
-  unsigned long long a;
-  unsigned char b;
-} A;
-
-typedef struct B {
-  unsigned char y;
-  struct A x;
-  unsigned int z;
-} B;
-
-typedef struct C {
-  unsigned long long d;
-  unsigned char e;
-} C;
-
-static B B_fn(struct A b2, struct B b3, struct C b4)
-{
-  struct B result;
-
-  result.x.a = b2.a + b3.x.a + b3.z + b4.d;
-  result.x.b = b2.b + b3.x.b + b3.y + b4.e;
-  result.y = b2.b + b3.x.b + b4.e;
-
-  printf("%d %d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b,
-	 (int)b3.x.a, b3.x.b, b3.y, b3.z, (int)b4.d, b4.e,
-	 (int)result.x.a, result.x.b, result.y);
-
-  return result;
-}
-
-static void
-B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-     void* userdata __UNUSED__)
-{
-  struct A b0;
-  struct B b1;
-  struct C b2;
-
-  b0 = *(struct A*)(args[0]);
-  b1 = *(struct B*)(args[1]);
-  b2 = *(struct C*)(args[2]);
-
-  *(B*)resp = B_fn(b0, b1, b2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[4];
-  ffi_type* cls_struct_fields[3];
-  ffi_type* cls_struct_fields1[4];
-  ffi_type* cls_struct_fields2[3];
-  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
-  ffi_type* dbl_arg_types[4];
-
-  struct A e_dbl = { 1LL, 7};
-  struct B f_dbl = { 99, {12LL , 127}, 255};
-  struct C g_dbl = { 2LL, 9};
-
-  struct B res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_type1.size = 0;
-  cls_struct_type1.alignment = 0;
-  cls_struct_type1.type = FFI_TYPE_STRUCT;
-  cls_struct_type1.elements = cls_struct_fields1;
-
-  cls_struct_type2.size = 0;
-  cls_struct_type2.alignment = 0;
-  cls_struct_type2.type = FFI_TYPE_STRUCT;
-  cls_struct_type2.elements = cls_struct_fields2;
-
-  cls_struct_fields[0] = &ffi_type_uint64;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = NULL;
-
-  cls_struct_fields1[0] = &ffi_type_uchar;
-  cls_struct_fields1[1] = &cls_struct_type;
-  cls_struct_fields1[2] = &ffi_type_uint;
-  cls_struct_fields1[3] = NULL;
-
-  cls_struct_fields2[0] = &ffi_type_uint64;
-  cls_struct_fields2[1] = &ffi_type_uchar;
-  cls_struct_fields2[2] = NULL;
-
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type1;
-  dbl_arg_types[2] = &cls_struct_type2;
-  dbl_arg_types[3] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &e_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = &g_dbl;
-  args_dbl[3] = NULL;
-
-  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 7 12 127 99 255 2 9: 270 242 143" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl);
-  /* { dg-output "\n1 7 12 127 99 255 2 9: 270 242 143" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct11.c b/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct11.c
deleted file mode 100644
index 3510493..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct11.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check parameter passing with nested structs
-		of a single type.  This tests the special cases
-		for homogeneous floating-point aggregates in the
-		AArch64 PCS.
-   Limitations:	none.
-   PR:		none.
-   Originator:  ARM Ltd.  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct A {
-  float a_x;
-  float a_y;
-} A;
-
-typedef struct B {
-  float b_x;
-  float b_y;
-} B;
-
-typedef struct C {
-  A a;
-  B b;
-} C;
-
-static C C_fn (int x, int y, int z, C source, int i, int j, int k)
-{
-  C result;
-  result.a.a_x = source.a.a_x;
-  result.a.a_y = source.a.a_y;
-  result.b.b_x = source.b.b_x;
-  result.b.b_y = source.b.b_y;
-
-  printf ("%d, %d, %d, %d, %d, %d\n", x, y, z, i, j, k);
-
-  printf ("%.1f, %.1f, %.1f, %.1f, "
-	  "%.1f, %.1f, %.1f, %.1f\n",
-	  source.a.a_x, source.a.a_y,
-	  source.b.b_x, source.b.b_y,
-	  result.a.a_x, result.a.a_y,
-	  result.b.b_x, result.b.b_y);
-
-  return result;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-
-  ffi_type* struct_fields_source_a[3];
-  ffi_type* struct_fields_source_b[3];
-  ffi_type* struct_fields_source_c[3];
-  ffi_type* arg_types[8];
-
-  ffi_type struct_type_a, struct_type_b, struct_type_c;
-
-  struct A source_fld_a = {1.0, 2.0};
-  struct B source_fld_b = {4.0, 8.0};
-  int k = 1;
-
-  struct C result;
-  struct C source = {source_fld_a, source_fld_b};
-
-  struct_type_a.size = 0;
-  struct_type_a.alignment = 0;
-  struct_type_a.type = FFI_TYPE_STRUCT;
-  struct_type_a.elements = struct_fields_source_a;
-
-  struct_type_b.size = 0;
-  struct_type_b.alignment = 0;
-  struct_type_b.type = FFI_TYPE_STRUCT;
-  struct_type_b.elements = struct_fields_source_b;
-
-  struct_type_c.size = 0;
-  struct_type_c.alignment = 0;
-  struct_type_c.type = FFI_TYPE_STRUCT;
-  struct_type_c.elements = struct_fields_source_c;
-
-  struct_fields_source_a[0] = &ffi_type_float;
-  struct_fields_source_a[1] = &ffi_type_float;
-  struct_fields_source_a[2] = NULL;
-
-  struct_fields_source_b[0] = &ffi_type_float;
-  struct_fields_source_b[1] = &ffi_type_float;
-  struct_fields_source_b[2] = NULL;
-
-  struct_fields_source_c[0] = &struct_type_a;
-  struct_fields_source_c[1] = &struct_type_b;
-  struct_fields_source_c[2] = NULL;
-
-  arg_types[0] = &ffi_type_sint32;
-  arg_types[1] = &ffi_type_sint32;
-  arg_types[2] = &ffi_type_sint32;
-  arg_types[3] = &struct_type_c;
-  arg_types[4] = &ffi_type_sint32;
-  arg_types[5] = &ffi_type_sint32;
-  arg_types[6] = &ffi_type_sint32;
-  arg_types[7] = NULL;
-
-  void *args[7];
-  args[0] = &k;
-  args[1] = &k;
-  args[2] = &k;
-  args[3] = &source;
-  args[4] = &k;
-  args[5] = &k;
-  args[6] = &k;
-  CHECK (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, 7, &struct_type_c,
-		       arg_types) == FFI_OK);
-
-  ffi_call (&cif, FFI_FN (C_fn), &result, args);
-  /* { dg-output "1, 1, 1, 1, 1, 1\n" } */
-  /* { dg-output "1.0, 2.0, 4.0, 8.0, 1.0, 2.0, 4.0, 8.0" } */
-  CHECK (result.a.a_x == source.a.a_x);
-  CHECK (result.a.a_y == source.a.a_y);
-  CHECK (result.b.b_x == source.b.b_x);
-  CHECK (result.b.b_y == source.b.b_y);
-  exit (0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct2.c
deleted file mode 100644
index 69268cd..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct2.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Contains structs as parameter of the struct itself.
-		Sample taken from Alan Modras patch to src/prep_cif.c.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030911	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct A {
-  unsigned long a;
-  unsigned char b;
-} A;
-
-typedef struct B {
-  struct A x;
-  unsigned char y;
-} B;
-
-B B_fn(struct A b0, struct B b1)
-{
-  struct B result;
-
-  result.x.a = b0.a + b1.x.a;
-  result.x.b = b0.b + b1.x.b + b1.y;
-  result.y = b0.b + b1.x.b;
-
-  printf("%lu %d %lu %d %d: %lu %d %d\n", b0.a, b0.b, b1.x.a, b1.x.b, b1.y,
-	 result.x.a, result.x.b, result.y);
-
-  return result;
-}
-
-static void
-B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-     void* userdata __UNUSED__)
-{
-  struct A b0;
-  struct B b1;
-
-  b0 = *(struct A*)(args[0]);
-  b1 = *(struct B*)(args[1]);
-
-  *(B*)resp = B_fn(b0, b1);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[3];
-  ffi_type* cls_struct_fields[3];
-  ffi_type* cls_struct_fields1[3];
-  ffi_type cls_struct_type, cls_struct_type1;
-  ffi_type* dbl_arg_types[3];
-
-  struct A e_dbl = { 1, 7};
-  struct B f_dbl = {{12 , 127}, 99};
-
-  struct B res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_type1.size = 0;
-  cls_struct_type1.alignment = 0;
-  cls_struct_type1.type = FFI_TYPE_STRUCT;
-  cls_struct_type1.elements = cls_struct_fields1;
-
-  cls_struct_fields[0] = &ffi_type_ulong;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = NULL;
-
-  cls_struct_fields1[0] = &cls_struct_type;
-  cls_struct_fields1[1] = &ffi_type_uchar;
-  cls_struct_fields1[2] = NULL;
-
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type1;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &e_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 7 12 127 99: 13 233 134" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl);
-  /* { dg-output "\n1 7 12 127 99: 13 233 134" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct3.c b/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct3.c
deleted file mode 100644
index ab18cad..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct3.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Contains structs as parameter of the struct itself.
-		Sample taken from Alan Modras patch to src/prep_cif.c.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030911	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct A {
-  unsigned long long a;
-  unsigned char b;
-} A;
-
-typedef struct B {
-  struct A x;
-  unsigned char y;
-} B;
-
-B B_fn(struct A b0, struct B b1)
-{
-  struct B result;
-
-  result.x.a = b0.a + b1.x.a;
-  result.x.b = b0.b + b1.x.b + b1.y;
-  result.y = b0.b + b1.x.b;
-
-  printf("%d %d %d %d %d: %d %d %d\n", (int)b0.a, b0.b,
-	 (int)b1.x.a, b1.x.b, b1.y,
-	 (int)result.x.a, result.x.b, result.y);
-
-  return result;
-}
-
-static void
-B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-     void* userdata __UNUSED__)
-{
-  struct A b0;
-  struct B b1;
-
-  b0 = *(struct A*)(args[0]);
-  b1 = *(struct B*)(args[1]);
-
-  *(B*)resp = B_fn(b0, b1);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[3];
-  ffi_type* cls_struct_fields[3];
-  ffi_type* cls_struct_fields1[3];
-  ffi_type cls_struct_type, cls_struct_type1;
-  ffi_type* dbl_arg_types[3];
-
-  struct A e_dbl = { 1LL, 7};
-  struct B f_dbl = {{12LL , 127}, 99};
-
-  struct B res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_type1.size = 0;
-  cls_struct_type1.alignment = 0;
-  cls_struct_type1.type = FFI_TYPE_STRUCT;
-  cls_struct_type1.elements = cls_struct_fields1;
-
-  cls_struct_fields[0] = &ffi_type_uint64;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = NULL;
-
-  cls_struct_fields1[0] = &cls_struct_type;
-  cls_struct_fields1[1] = &ffi_type_uchar;
-  cls_struct_fields1[2] = NULL;
-
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type1;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &e_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 7 12 127 99: 13 233 134" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
-
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl);
-  /* { dg-output "\n1 7 12 127 99: 13 233 134" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct4.c b/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct4.c
deleted file mode 100644
index 2ffb4d6..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct4.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Contains structs as parameter of the struct itself.
-		Sample taken from Alan Modras patch to src/prep_cif.c.
-   Limitations:	none.
-   PR:		PR 25630.
-   Originator:	<andreast@gcc.gnu.org> 20051010	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct A {
-  double a;
-  unsigned char b;
-} A;
-
-typedef struct B {
-  struct A x;
-  unsigned char y;
-} B;
-
-static B B_fn(struct A b2, struct B b3)
-{
-  struct B result;
-
-  result.x.a = b2.a + b3.x.a;
-  result.x.b = b2.b + b3.x.b + b3.y;
-  result.y = b2.b + b3.x.b;
-
-  printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b,
-	 (int)b3.x.a, b3.x.b, b3.y,
-	 (int)result.x.a, result.x.b, result.y);
-
-  return result;
-}
-
-static void
-B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-     void* userdata __UNUSED__)
-{
-  struct A b0;
-  struct B b1;
-
-  b0 = *(struct A*)(args[0]);
-  b1 = *(struct B*)(args[1]);
-
-  *(B*)resp = B_fn(b0, b1);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[3];
-  ffi_type* cls_struct_fields[3];
-  ffi_type* cls_struct_fields1[3];
-  ffi_type cls_struct_type, cls_struct_type1;
-  ffi_type* dbl_arg_types[3];
-
-  struct A e_dbl = { 1.0, 7};
-  struct B f_dbl = {{12.0 , 127}, 99};
-
-  struct B res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_type1.size = 0;
-  cls_struct_type1.alignment = 0;
-  cls_struct_type1.type = FFI_TYPE_STRUCT;
-  cls_struct_type1.elements = cls_struct_fields1;
-
-  cls_struct_fields[0] = &ffi_type_double;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = NULL;
-
-  cls_struct_fields1[0] = &cls_struct_type;
-  cls_struct_fields1[1] = &ffi_type_uchar;
-  cls_struct_fields1[2] = NULL;
-
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type1;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &e_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 7 12 127 99: 13 233 134" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl);
-  /* { dg-output "\n1 7 12 127 99: 13 233 134" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct5.c b/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct5.c
deleted file mode 100644
index 6c79845..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct5.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Contains structs as parameter of the struct itself.
-		Sample taken from Alan Modras patch to src/prep_cif.c.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20051010	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct A {
-  long double a;
-  unsigned char b;
-} A;
-
-typedef struct B {
-  struct A x;
-  unsigned char y;
-} B;
-
-static B B_fn(struct A b2, struct B b3)
-{
-  struct B result;
-
-  result.x.a = b2.a + b3.x.a;
-  result.x.b = b2.b + b3.x.b + b3.y;
-  result.y = b2.b + b3.x.b;
-
-  printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b,
-	 (int)b3.x.a, b3.x.b, b3.y,
-	 (int)result.x.a, result.x.b, result.y);
-
-  return result;
-}
-
-static void
-B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-     void* userdata __UNUSED__)
-{
-  struct A b0;
-  struct B b1;
-
-  b0 = *(struct A*)(args[0]);
-  b1 = *(struct B*)(args[1]);
-
-  *(B*)resp = B_fn(b0, b1);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[3];
-  ffi_type* cls_struct_fields[3];
-  ffi_type* cls_struct_fields1[3];
-  ffi_type cls_struct_type, cls_struct_type1;
-  ffi_type* dbl_arg_types[3];
-
-  struct A e_dbl = { 1.0, 7};
-  struct B f_dbl = {{12.0 , 127}, 99};
-
-  struct B res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_type1.size = 0;
-  cls_struct_type1.alignment = 0;
-  cls_struct_type1.type = FFI_TYPE_STRUCT;
-  cls_struct_type1.elements = cls_struct_fields1;
-
-  cls_struct_fields[0] = &ffi_type_longdouble;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = NULL;
-
-  cls_struct_fields1[0] = &cls_struct_type;
-  cls_struct_fields1[1] = &ffi_type_uchar;
-  cls_struct_fields1[2] = NULL;
-
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type1;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &e_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 7 12 127 99: 13 233 134" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
-
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl);
-  /* { dg-output "\n1 7 12 127 99: 13 233 134" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct6.c b/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct6.c
deleted file mode 100644
index 59d3579..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct6.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Contains structs as parameter of the struct itself.
-		Sample taken from Alan Modras patch to src/prep_cif.c.
-   Limitations:	none.
-   PR:		PR 25630.
-   Originator:	<andreast@gcc.gnu.org> 20051010	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct A {
-  double a;
-  unsigned char b;
-} A;
-
-typedef struct B {
-  struct A x;
-  unsigned char y;
-} B;
-
-typedef struct C {
-  long d;
-  unsigned char e;
-} C;
-
-static B B_fn(struct A b2, struct B b3, struct C b4)
-{
-  struct B result;
-
-  result.x.a = b2.a + b3.x.a + b4.d;
-  result.x.b = b2.b + b3.x.b + b3.y + b4.e;
-  result.y = b2.b + b3.x.b + b4.e;
-
-  printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b,
-	 (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e,
-	 (int)result.x.a, result.x.b, result.y);
-
-  return result;
-}
-
-static void
-B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-     void* userdata __UNUSED__)
-{
-  struct A b0;
-  struct B b1;
-  struct C b2;
-
-  b0 = *(struct A*)(args[0]);
-  b1 = *(struct B*)(args[1]);
-  b2 = *(struct C*)(args[2]);
-
-  *(B*)resp = B_fn(b0, b1, b2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[4];
-  ffi_type* cls_struct_fields[3];
-  ffi_type* cls_struct_fields1[3];
-  ffi_type* cls_struct_fields2[3];
-  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
-  ffi_type* dbl_arg_types[4];
-
-  struct A e_dbl = { 1.0, 7};
-  struct B f_dbl = {{12.0 , 127}, 99};
-  struct C g_dbl = { 2, 9};
-
-  struct B res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_type1.size = 0;
-  cls_struct_type1.alignment = 0;
-  cls_struct_type1.type = FFI_TYPE_STRUCT;
-  cls_struct_type1.elements = cls_struct_fields1;
-
-  cls_struct_type2.size = 0;
-  cls_struct_type2.alignment = 0;
-  cls_struct_type2.type = FFI_TYPE_STRUCT;
-  cls_struct_type2.elements = cls_struct_fields2;
-
-  cls_struct_fields[0] = &ffi_type_double;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = NULL;
-
-  cls_struct_fields1[0] = &cls_struct_type;
-  cls_struct_fields1[1] = &ffi_type_uchar;
-  cls_struct_fields1[2] = NULL;
-
-  cls_struct_fields2[0] = &ffi_type_slong;
-  cls_struct_fields2[1] = &ffi_type_uchar;
-  cls_struct_fields2[2] = NULL;
-
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type1;
-  dbl_arg_types[2] = &cls_struct_type2;
-  dbl_arg_types[3] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &e_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = &g_dbl;
-  args_dbl[3] = NULL;
-
-  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl);
-  /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct7.c b/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct7.c
deleted file mode 100644
index 27595e6..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct7.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Contains structs as parameter of the struct itself.
-		Sample taken from Alan Modras patch to src/prep_cif.c.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20051010	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct A {
-  unsigned long long a;
-  unsigned char b;
-} A;
-
-typedef struct B {
-  struct A x;
-  unsigned char y;
-} B;
-
-static B B_fn(struct A b2, struct B b3)
-{
-  struct B result;
-
-  result.x.a = b2.a + b3.x.a;
-  result.x.b = b2.b + b3.x.b + b3.y;
-  result.y = b2.b + b3.x.b;
-
-  printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b,
-	 (int)b3.x.a, b3.x.b, b3.y,
-	 (int)result.x.a, result.x.b, result.y);
-
-  return result;
-}
-
-static void
-B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-     void* userdata __UNUSED__)
-{
-  struct A b0;
-  struct B b1;
-
-  b0 = *(struct A*)(args[0]);
-  b1 = *(struct B*)(args[1]);
-
-  *(B*)resp = B_fn(b0, b1);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[3];
-  ffi_type* cls_struct_fields[3];
-  ffi_type* cls_struct_fields1[3];
-  ffi_type cls_struct_type, cls_struct_type1;
-  ffi_type* dbl_arg_types[3];
-
-  struct A e_dbl = { 1LL, 7};
-  struct B f_dbl = {{12.0 , 127}, 99};
-
-  struct B res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_type1.size = 0;
-  cls_struct_type1.alignment = 0;
-  cls_struct_type1.type = FFI_TYPE_STRUCT;
-  cls_struct_type1.elements = cls_struct_fields1;
-
-  cls_struct_fields[0] = &ffi_type_uint64;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = NULL;
-
-  cls_struct_fields1[0] = &cls_struct_type;
-  cls_struct_fields1[1] = &ffi_type_uchar;
-  cls_struct_fields1[2] = NULL;
-
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type1;
-  dbl_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &e_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 7 12 127 99: 13 233 134" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl);
-  /* { dg-output "\n1 7 12 127 99: 13 233 134" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct8.c b/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct8.c
deleted file mode 100644
index 0e6c682..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct8.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Contains structs as parameter of the struct itself.
-		Sample taken from Alan Modras patch to src/prep_cif.c.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20051010	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct A {
-  unsigned long long a;
-  unsigned char b;
-} A;
-
-typedef struct B {
-  struct A x;
-  unsigned char y;
-} B;
-
-typedef struct C {
-  unsigned long long d;
-  unsigned char e;
-} C;
-
-static B B_fn(struct A b2, struct B b3, struct C b4)
-{
-  struct B result;
-
-  result.x.a = b2.a + b3.x.a + b4.d;
-  result.x.b = b2.b + b3.x.b + b3.y + b4.e;
-  result.y = b2.b + b3.x.b + b4.e;
-
-  printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b,
-	 (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e,
-	 (int)result.x.a, result.x.b, result.y);
-
-  return result;
-}
-
-static void
-B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-     void* userdata __UNUSED__)
-{
-  struct A b0;
-  struct B b1;
-  struct C b2;
-
-  b0 = *(struct A*)(args[0]);
-  b1 = *(struct B*)(args[1]);
-  b2 = *(struct C*)(args[2]);
-
-  *(B*)resp = B_fn(b0, b1, b2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[4];
-  ffi_type* cls_struct_fields[3];
-  ffi_type* cls_struct_fields1[3];
-  ffi_type* cls_struct_fields2[3];
-  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
-  ffi_type* dbl_arg_types[4];
-
-  struct A e_dbl = { 1LL, 7};
-  struct B f_dbl = {{12LL , 127}, 99};
-  struct C g_dbl = { 2LL, 9};
-
-  struct B res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_type1.size = 0;
-  cls_struct_type1.alignment = 0;
-  cls_struct_type1.type = FFI_TYPE_STRUCT;
-  cls_struct_type1.elements = cls_struct_fields1;
-
-  cls_struct_type2.size = 0;
-  cls_struct_type2.alignment = 0;
-  cls_struct_type2.type = FFI_TYPE_STRUCT;
-  cls_struct_type2.elements = cls_struct_fields2;
-
-  cls_struct_fields[0] = &ffi_type_uint64;
-  cls_struct_fields[1] = &ffi_type_uchar;
-  cls_struct_fields[2] = NULL;
-
-  cls_struct_fields1[0] = &cls_struct_type;
-  cls_struct_fields1[1] = &ffi_type_uchar;
-  cls_struct_fields1[2] = NULL;
-
-  cls_struct_fields2[0] = &ffi_type_uint64;
-  cls_struct_fields2[1] = &ffi_type_uchar;
-  cls_struct_fields2[2] = NULL;
-
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type1;
-  dbl_arg_types[2] = &cls_struct_type2;
-  dbl_arg_types[3] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &e_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = &g_dbl;
-  args_dbl[3] = NULL;
-
-  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl);
-  /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct9.c b/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct9.c
deleted file mode 100644
index 5f7ac67..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/nested_struct9.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-		Contains structs as parameter of the struct itself.
-		Sample taken from Alan Modras patch to src/prep_cif.c.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20051010	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct A {
-  unsigned char a;
-  unsigned long long b;
-} A;
-
-typedef struct B {
-  struct A x;
-  unsigned char y;
-} B;
-
-typedef struct C {
-  unsigned long d;
-  unsigned char e;
-} C;
-
-static B B_fn(struct A b2, struct B b3, struct C b4)
-{
-  struct B result;
-
-  result.x.a = b2.a + b3.x.a + b4.d;
-  result.x.b = b2.b + b3.x.b + b3.y + b4.e;
-  result.y = b2.b + b3.x.b + b4.e;
-
-  printf("%d %d %d %d %d %d %d: %d %d %d\n", b2.a, (int)b2.b,
-	 b3.x.a, (int)b3.x.b, b3.y, (int)b4.d, b4.e,
-	 result.x.a, (int)result.x.b, result.y);
-
-  return result;
-}
-
-static void
-B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-     void* userdata __UNUSED__)
-{
-  struct A b0;
-  struct B b1;
-  struct C b2;
-
-  b0 = *(struct A*)(args[0]);
-  b1 = *(struct B*)(args[1]);
-  b2 = *(struct C*)(args[2]);
-
-  *(B*)resp = B_fn(b0, b1, b2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_dbl[4];
-  ffi_type* cls_struct_fields[3];
-  ffi_type* cls_struct_fields1[3];
-  ffi_type* cls_struct_fields2[3];
-  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
-  ffi_type* dbl_arg_types[4];
-
-  struct A e_dbl = { 1, 7LL};
-  struct B f_dbl = {{12.0 , 127}, 99};
-  struct C g_dbl = { 2, 9};
-
-  struct B res_dbl;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_type1.size = 0;
-  cls_struct_type1.alignment = 0;
-  cls_struct_type1.type = FFI_TYPE_STRUCT;
-  cls_struct_type1.elements = cls_struct_fields1;
-
-  cls_struct_type2.size = 0;
-  cls_struct_type2.alignment = 0;
-  cls_struct_type2.type = FFI_TYPE_STRUCT;
-  cls_struct_type2.elements = cls_struct_fields2;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &ffi_type_uint64;
-  cls_struct_fields[2] = NULL;
-
-  cls_struct_fields1[0] = &cls_struct_type;
-  cls_struct_fields1[1] = &ffi_type_uchar;
-  cls_struct_fields1[2] = NULL;
-
-  cls_struct_fields2[0] = &ffi_type_ulong;
-  cls_struct_fields2[1] = &ffi_type_uchar;
-  cls_struct_fields2[2] = NULL;
-
-
-  dbl_arg_types[0] = &cls_struct_type;
-  dbl_arg_types[1] = &cls_struct_type1;
-  dbl_arg_types[2] = &cls_struct_type2;
-  dbl_arg_types[3] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1,
-		     dbl_arg_types) == FFI_OK);
-
-  args_dbl[0] = &e_dbl;
-  args_dbl[1] = &f_dbl;
-  args_dbl[2] = &g_dbl;
-  args_dbl[3] = NULL;
-
-  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
-  /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
-
-  res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl);
-  /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */
-  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
-  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
-  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/problem1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/problem1.c
deleted file mode 100644
index 6a91555..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/problem1.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure passing with different structure size.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20030828	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct my_ffi_struct {
-  double a;
-  double b;
-  double c;
-} my_ffi_struct;
-
-my_ffi_struct callee(struct my_ffi_struct a1, struct my_ffi_struct a2)
-{
-  struct my_ffi_struct result;
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-
-  printf("%g %g %g %g %g %g: %g %g %g\n", a1.a, a1.b, a1.c,
-	 a2.a, a2.b, a2.c, result.a, result.b, result.c);
-
-  return result;
-}
-
-void stub(ffi_cif* cif __UNUSED__, void* resp, void** args,
-	  void* userdata __UNUSED__)
-{
-  struct my_ffi_struct a1;
-  struct my_ffi_struct a2;
-
-  a1 = *(struct my_ffi_struct*)(args[0]);
-  a2 = *(struct my_ffi_struct*)(args[1]);
-
-  *(my_ffi_struct *)resp = callee(a1, a2);
-}
-
-
-int main(void)
-{
-  ffi_type* my_ffi_struct_fields[4];
-  ffi_type my_ffi_struct_type;
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args[4];
-  ffi_type* arg_types[3];
-
-  struct my_ffi_struct g = { 1.0, 2.0, 3.0 };
-  struct my_ffi_struct f = { 1.0, 2.0, 3.0 };
-  struct my_ffi_struct res;
-
-  my_ffi_struct_type.size = 0;
-  my_ffi_struct_type.alignment = 0;
-  my_ffi_struct_type.type = FFI_TYPE_STRUCT;
-  my_ffi_struct_type.elements = my_ffi_struct_fields;
-
-  my_ffi_struct_fields[0] = &ffi_type_double;
-  my_ffi_struct_fields[1] = &ffi_type_double;
-  my_ffi_struct_fields[2] = &ffi_type_double;
-  my_ffi_struct_fields[3] = NULL;
-
-  arg_types[0] = &my_ffi_struct_type;
-  arg_types[1] = &my_ffi_struct_type;
-  arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &my_ffi_struct_type,
-		     arg_types) == FFI_OK);
-
-  args[0] = &g;
-  args[1] = &f;
-  args[2] = NULL;
-  ffi_call(&cif, FFI_FN(callee), &res, args);
-  /* { dg-output "1 2 3 1 2 3: 2 4 6" } */
-  printf("res: %g %g %g\n", res.a, res.b, res.c);
-  /* { dg-output "\nres: 2 4 6" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, stub, NULL, code) == FFI_OK);
-
-  res = ((my_ffi_struct(*)(struct my_ffi_struct, struct my_ffi_struct))(code))(g, f);
-  /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */
-  printf("res: %g %g %g\n", res.a, res.b, res.c);
-  /* { dg-output "\nres: 2 4 6" } */
-
-  exit(0);;
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/promotion.c b/third_party/gofrontend/libffi/testsuite/libffi.call/promotion.c
deleted file mode 100644
index 4456161..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/promotion.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Promotion test.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-static int promotion(signed char sc, signed short ss,
-		     unsigned char uc, unsigned short us)
-{
-  int r = (int) sc + (int) ss + (int) uc + (int) us;
-
-  return r;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-  signed char sc;
-  unsigned char uc;
-  signed short ss;
-  unsigned short us;
-  unsigned long ul;
-
-  args[0] = &ffi_type_schar;
-  args[1] = &ffi_type_sshort;
-  args[2] = &ffi_type_uchar;
-  args[3] = &ffi_type_ushort;
-  values[0] = &sc;
-  values[1] = &ss;
-  values[2] = &uc;
-  values[3] = &us;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
-		     &ffi_type_sint, args) == FFI_OK);
-
-  us = 0;
-  ul = 0;
-
-  for (sc = (signed char) -127;
-       sc <= (signed char) 120; sc += 1)
-    for (ss = -30000; ss <= 30000; ss += 10000)
-      for (uc = (unsigned char) 0;
-	   uc <= (unsigned char) 200; uc += 20)
-	for (us = 0; us <= 60000; us += 10000)
-	  {
-	    ul++;
-	    ffi_call(&cif, FFI_FN(promotion), &rint, values);
-	    CHECK((int)rint == (signed char) sc + (signed short) ss +
-		  (unsigned char) uc + (unsigned short) us);
-	  }
-  printf("%lu promotion tests run\n", ul);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/pyobjc-tc.c b/third_party/gofrontend/libffi/testsuite/libffi.call/pyobjc-tc.c
deleted file mode 100644
index e29bd6c..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/pyobjc-tc.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check different structures.
-   Limitations:	none.
-   PR:		none.
-   Originator:	Ronald Oussoren <oussoren@cistron.nl> 20030824	*/
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct Point {
-	float x;
-	float y;
-} Point;
-
-typedef struct Size {
-	float h;
-	float w;
-} Size;
-
-typedef struct Rect {
-	Point o;
-	Size  s;
-} Rect;
-
-int doit(int o, char* s, Point p, Rect r, int last)
-{
-	printf("CALLED WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n",
-		o, s, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, last);
-	return 42;
-}
-
-
-int main(void)
-{
-	ffi_type point_type;
-	ffi_type size_type;
-	ffi_type rect_type;
-	ffi_cif cif;
-	ffi_type* arglist[6];
-	void* values[6];
-	int r;
-
-	/*
-	 *  First set up FFI types for the 3 struct types
-	 */
-
-	point_type.size = 0; /*sizeof(Point);*/
-	point_type.alignment = 0; /*__alignof__(Point);*/
-	point_type.type = FFI_TYPE_STRUCT;
-	point_type.elements = malloc(3 * sizeof(ffi_type*));
-	point_type.elements[0] = &ffi_type_float;
-	point_type.elements[1] = &ffi_type_float;
-	point_type.elements[2] = NULL;
-
-	size_type.size = 0;/* sizeof(Size);*/
-	size_type.alignment = 0;/* __alignof__(Size);*/
-	size_type.type = FFI_TYPE_STRUCT;
-	size_type.elements = malloc(3 * sizeof(ffi_type*));
-	size_type.elements[0] = &ffi_type_float;
-	size_type.elements[1] = &ffi_type_float;
-	size_type.elements[2] = NULL;
-
-	rect_type.size = 0;/*sizeof(Rect);*/
-	rect_type.alignment =0;/* __alignof__(Rect);*/
-	rect_type.type = FFI_TYPE_STRUCT;
-	rect_type.elements = malloc(3 * sizeof(ffi_type*));
-	rect_type.elements[0] = &point_type;
-	rect_type.elements[1] = &size_type;
-	rect_type.elements[2] = NULL;
-
-	/*
-	 * Create a CIF
-	 */
-	arglist[0] = &ffi_type_sint;
-	arglist[1] = &ffi_type_pointer;
-	arglist[2] = &point_type;
-	arglist[3] = &rect_type;
-	arglist[4] = &ffi_type_sint;
-	arglist[5] = NULL;
-
-	r = ffi_prep_cif(&cif, FFI_DEFAULT_ABI,
-			5, &ffi_type_sint, arglist);
-	if (r != FFI_OK) {
-		abort();
-	}
-
-
-	/* And call the function through the CIF */
-
-	{
-	Point p = { 1.0, 2.0 };
-	Rect  r = { { 9.0, 10.0}, { -1.0, -2.0 } };
-	int   o = 0;
-	int   l = 42;
-	char* m = "myMethod";
-	ffi_arg result;
-
-	values[0] = &o;
-	values[1] = &m;
-	values[2] = &p;
-	values[3] = &r;
-	values[4] = &l;
-	values[5] = NULL;
-
-	printf("CALLING WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n",
-		o, m, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, l);
-
-	ffi_call(&cif, FFI_FN(doit), &result, values);
-
-	printf ("The result is %d\n", (int)result);
-
-	}
-	exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_dbl.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_dbl.c
deleted file mode 100644
index fd07e50..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_dbl.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value double.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20050212  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static double return_dbl(double dbl)
-{
-  printf ("%f\n", dbl);
-  return 2 * dbl;
-}
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  double dbl, rdbl;
-
-  args[0] = &ffi_type_double;
-  values[0] = &dbl;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_double, args) == FFI_OK);
-
-  for (dbl = -127.3; dbl <  127; dbl++)
-    {
-      ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values);
-      printf ("%f vs %f\n", rdbl, return_dbl(dbl));
-      CHECK(rdbl == 2 * dbl);
-    }
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_dbl1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_dbl1.c
deleted file mode 100644
index 0ea5d50..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_dbl1.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value double.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20050212  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static double return_dbl(double dbl1, float fl2, unsigned int in3, double dbl4)
-{
-  return dbl1 + fl2 + in3 + dbl4;
-}
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  double dbl1, dbl4, rdbl;
-  float fl2;
-  unsigned int in3;
-  args[0] = &ffi_type_double;
-  args[1] = &ffi_type_float;
-  args[2] = &ffi_type_uint;
-  args[3] = &ffi_type_double;
-  values[0] = &dbl1;
-  values[1] = &fl2;
-  values[2] = &in3;
-  values[3] = &dbl4;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
-		     &ffi_type_double, args) == FFI_OK);
-  dbl1 = 127.0;
-  fl2 = 128.0;
-  in3 = 255;
-  dbl4 = 512.7;
-
-  ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values);
-  printf ("%f vs %f\n", rdbl, return_dbl(dbl1, fl2, in3, dbl4));
-  CHECK(rdbl ==  dbl1 + fl2 + in3 + dbl4);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_dbl2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_dbl2.c
deleted file mode 100644
index b3818f8..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_dbl2.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value double.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20050212  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static double return_dbl(double dbl1, double dbl2, unsigned int in3, double dbl4)
-{
-  return dbl1 + dbl2 + in3 + dbl4;
-}
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  double dbl1, dbl2, dbl4, rdbl;
-  unsigned int in3;
-  args[0] = &ffi_type_double;
-  args[1] = &ffi_type_double;
-  args[2] = &ffi_type_uint;
-  args[3] = &ffi_type_double;
-  values[0] = &dbl1;
-  values[1] = &dbl2;
-  values[2] = &in3;
-  values[3] = &dbl4;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
-		     &ffi_type_double, args) == FFI_OK);
-  dbl1 = 127.0;
-  dbl2 = 128.0;
-  in3 = 255;
-  dbl4 = 512.7;
-
-  ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values);
-  printf ("%f vs %f\n", rdbl, return_dbl(dbl1, dbl2, in3, dbl4));
-  CHECK(rdbl ==  dbl1 + dbl2 + in3 + dbl4);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_fl.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_fl.c
deleted file mode 100644
index fb8a09e..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_fl.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value float.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20050212  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static float return_fl(float fl)
-{
-  return 2 * fl;
-}
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  float fl, rfl;
-
-  args[0] = &ffi_type_float;
-  values[0] = &fl;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_float, args) == FFI_OK);
-
-  for (fl = -127.0; fl <  127; fl++)
-    {
-      ffi_call(&cif, FFI_FN(return_fl), &rfl, values);
-      printf ("%f vs %f\n", rfl, return_fl(fl));
-      CHECK(rfl ==  2 * fl);
-    }
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_fl1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_fl1.c
deleted file mode 100644
index c3d92c2..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_fl1.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value float.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20050212  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static float return_fl(float fl1, float fl2)
-{
-  return fl1 + fl2;
-}
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  float fl1, fl2, rfl;
-
-  args[0] = &ffi_type_float;
-  args[1] = &ffi_type_float;
-  values[0] = &fl1;
-  values[1] = &fl2;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
-		     &ffi_type_float, args) == FFI_OK);
-  fl1 = 127.0;
-  fl2 = 128.0;
-
-  ffi_call(&cif, FFI_FN(return_fl), &rfl, values);
-  printf ("%f vs %f\n", rfl, return_fl(fl1, fl2));
-  CHECK(rfl ==  fl1 + fl2);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_fl2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_fl2.c
deleted file mode 100644
index ddb976c..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_fl2.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value float.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20050212  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-/* Use volatile float to avoid false negative on ix86.  See PR target/323.  */
-static float return_fl(float fl1, float fl2, float fl3, float fl4)
-{
-  volatile float sum;
-
-  sum = fl1 + fl2 + fl3 + fl4;
-  return sum;
-}
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  float fl1, fl2, fl3, fl4, rfl;
-  volatile float sum;
-
-  args[0] = &ffi_type_float;
-  args[1] = &ffi_type_float;
-  args[2] = &ffi_type_float;
-  args[3] = &ffi_type_float;
-  values[0] = &fl1;
-  values[1] = &fl2;
-  values[2] = &fl3;
-  values[3] = &fl4;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
-		     &ffi_type_float, args) == FFI_OK);
-  fl1 = 127.0;
-  fl2 = 128.0;
-  fl3 = 255.1;
-  fl4 = 512.7;
-
-  ffi_call(&cif, FFI_FN(return_fl), &rfl, values);
-  printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, fl3, fl4));
-
-  sum = fl1 + fl2 + fl3 + fl4;
-  CHECK(rfl == sum);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_fl3.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_fl3.c
deleted file mode 100644
index c37877b..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_fl3.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value float.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20050212  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static float return_fl(float fl1, float fl2, unsigned int in3, float fl4)
-{
-  return fl1 + fl2 + in3 + fl4;
-}
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  float fl1, fl2, fl4, rfl;
-  unsigned int in3;
-  args[0] = &ffi_type_float;
-  args[1] = &ffi_type_float;
-  args[2] = &ffi_type_uint;
-  args[3] = &ffi_type_float;
-  values[0] = &fl1;
-  values[1] = &fl2;
-  values[2] = &in3;
-  values[3] = &fl4;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
-		     &ffi_type_float, args) == FFI_OK);
-  fl1 = 127.0;
-  fl2 = 128.0;
-  in3 = 255;
-  fl4 = 512.7;
-
-  ffi_call(&cif, FFI_FN(return_fl), &rfl, values);
-  printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, in3, fl4));
-  CHECK(rfl ==  fl1 + fl2 + in3 + fl4);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_ldl.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_ldl.c
deleted file mode 100644
index 52a92fe..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_ldl.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value long double.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<andreast@gcc.gnu.org> 20071113  */
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-static long double return_ldl(long double ldl)
-{
-  return 2*ldl;
-}
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  long double ldl, rldl;
-
-  args[0] = &ffi_type_longdouble;
-  values[0] = &ldl;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_longdouble, args) == FFI_OK);
-
-  for (ldl = -127.0; ldl <  127.0; ldl++)
-    {
-      ffi_call(&cif, FFI_FN(return_ldl), &rldl, values);
-      CHECK(rldl ==  2 * ldl);
-    }
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_ll.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_ll.c
deleted file mode 100644
index ea4a1e4..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_ll.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value long long.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-static long long return_ll(long long ll)
-{
-  return ll;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  long long rlonglong;
-  long long ll;
-
-  args[0] = &ffi_type_sint64;
-  values[0] = &ll;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_sint64, args) == FFI_OK);
-
-  for (ll = 0LL; ll < 100LL; ll++)
-    {
-      ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values);
-      CHECK(rlonglong == ll);
-    }
-
-  for (ll = 55555555555000LL; ll < 55555555555100LL; ll++)
-    {
-      ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values);
-      CHECK(rlonglong == ll);
-    }
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_ll1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_ll1.c
deleted file mode 100644
index 593e8a3..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_ll1.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check if long long are passed in the corresponding regs on ppc.
-   Limitations:	none.
-   PR:		20104.
-   Originator:	<andreast@gcc.gnu.org> 20050222  */
-
-/* { dg-do run } */
-/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */
-#include "ffitest.h"
-static long long return_ll(int ll0, long long ll1, int ll2)
-{
-  return ll0 + ll1 + ll2;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  long long rlonglong;
-  long long ll1;
-  unsigned ll0, ll2;
-
-  args[0] = &ffi_type_sint;
-  args[1] = &ffi_type_sint64;
-  args[2] = &ffi_type_sint;
-  values[0] = &ll0;
-  values[1] = &ll1;
-  values[2] = &ll2;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
-		     &ffi_type_sint64, args) == FFI_OK);
-
-  ll0 = 11111111;
-  ll1 = 11111111111000LL;
-  ll2 = 11111111;
-
-  ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values);
-  printf("res: %" PRIdLL ", %" PRIdLL "\n", rlonglong, ll0 + ll1 + ll2);
-  /* { dg-output "res: 11111133333222, 11111133333222" } */
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_sc.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_sc.c
deleted file mode 100644
index a36cf3e..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_sc.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value signed char.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static signed char return_sc(signed char sc)
-{
-  return sc;
-}
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-  signed char sc;
-
-  args[0] = &ffi_type_schar;
-  values[0] = &sc;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_schar, args) == FFI_OK);
-
-  for (sc = (signed char) -127;
-       sc < (signed char) 127; sc++)
-    {
-      ffi_call(&cif, FFI_FN(return_sc), &rint, values);
-      CHECK((signed char)rint == sc);
-    }
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_sl.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_sl.c
deleted file mode 100644
index f0fd345..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_sl.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check if long as return type is handled correctly.
-   Limitations:	none.
-   PR:		none.
- */
-
-/* { dg-do run } */
-#include "ffitest.h"
-static long return_sl(long l1, long l2)
-{
-  return l1 - l2;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg res;
-  unsigned long l1, l2;
-
-  args[0] = &ffi_type_slong;
-  args[1] = &ffi_type_slong;
-  values[0] = &l1;
-  values[1] = &l2;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
-		     &ffi_type_slong, args) == FFI_OK);
-
-  l1 = 1073741823L;
-  l2 = 1073741824L;
-
-  ffi_call(&cif, FFI_FN(return_sl), &res, values);
-  printf("res: %ld, %ld\n", (long)res, l1 - l2);
-  /* { dg-output "res: -1, -1" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_uc.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_uc.c
deleted file mode 100644
index 6fe5546..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_uc.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value unsigned char.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static unsigned char return_uc(unsigned char uc)
-{
-  return uc;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-
-  unsigned char uc;
-
-  args[0] = &ffi_type_uchar;
-  values[0] = &uc;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_uchar, args) == FFI_OK);
-
-  for (uc = (unsigned char) '\x00';
-       uc < (unsigned char) '\xff'; uc++)
-    {
-      ffi_call(&cif, FFI_FN(return_uc), &rint, values);
-      CHECK((unsigned char)rint == uc);
-    }
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/return_ul.c b/third_party/gofrontend/libffi/testsuite/libffi.call/return_ul.c
deleted file mode 100644
index 12b266f..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/return_ul.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check if unsigned long as return type is handled correctly.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<kaffeetisch at gmx dot de> 20060724  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-static unsigned long return_ul(unsigned long ul1, unsigned long ul2)
-{
-  return ul1 + ul2;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg res;
-  unsigned long ul1, ul2;
-
-  args[0] = &ffi_type_ulong;
-  args[1] = &ffi_type_ulong;
-  values[0] = &ul1;
-  values[1] = &ul2;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
-		     &ffi_type_ulong, args) == FFI_OK);
-
-  ul1 = 1073741823L;
-  ul2 = 1073741824L;
-
-  ffi_call(&cif, FFI_FN(return_ul), &res, values);
-  printf("res: %lu, %lu\n", (unsigned long)res, ul1 + ul2);
-  /* { dg-output "res: 2147483647, 2147483647" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/stret_large.c b/third_party/gofrontend/libffi/testsuite/libffi.call/stret_large.c
deleted file mode 100644
index 71c2469..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/stret_large.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/* Area:		ffi_call, closure_call
-   Purpose:		Check structure returning with different structure size.
-				Depending on the ABI. Check bigger struct which overlaps
-				the gp and fp register count on Darwin/AIX/ppc64.
-   Limitations:	none.
-   PR:			none.
-   Originator:	Blake Chaffin	6/21/2007	*/
-
-/* { dg-do run { xfail strongarm*-*-* xscale*-*-*  } } */
-#include "ffitest.h"
-
-/* 13 FPRs: 104 bytes */
-/* 14 FPRs: 112 bytes */
-
-typedef struct struct_108byte {
-	double a;
-	double b;
-	double c;
-	double d;
-	double e;
-	double f;
-	double g;
-	double h;
-	double i;
-	double j;
-	double k;
-	double l;
-	double m;
-	int n;
-} struct_108byte;
-
-struct_108byte cls_struct_108byte_fn(
-	struct_108byte b0,
-	struct_108byte b1,
-	struct_108byte b2,
-	struct_108byte b3)
-{
-	struct_108byte	result;
-
-	result.a = b0.a + b1.a + b2.a + b3.a;
-	result.b = b0.b + b1.b + b2.b + b3.b;
-	result.c = b0.c + b1.c + b2.c + b3.c;
-	result.d = b0.d + b1.d + b2.d + b3.d;
-	result.e = b0.e + b1.e + b2.e + b3.e;
-	result.f = b0.f + b1.f + b2.f + b3.f;
-	result.g = b0.g + b1.g + b2.g + b3.g;
-	result.h = b0.h + b1.h + b2.h + b3.h;
-	result.i = b0.i + b1.i + b2.i + b3.i;
-	result.j = b0.j + b1.j + b2.j + b3.j;
-	result.k = b0.k + b1.k + b2.k + b3.k;
-	result.l = b0.l + b1.l + b2.l + b3.l;
-	result.m = b0.m + b1.m + b2.m + b3.m;
-	result.n = b0.n + b1.n + b2.n + b3.n;
-
-	printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c,
-		result.d, result.e, result.f, result.g, result.h, result.i,
-		result.j, result.k, result.l, result.m, result.n);
-
-	return result;
-}
-
-static void
-cls_struct_108byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
-{
-	struct_108byte	b0, b1, b2, b3;
-
-	b0 = *(struct_108byte*)(args[0]);
-	b1 = *(struct_108byte*)(args[1]);
-	b2 = *(struct_108byte*)(args[2]);
-	b3 = *(struct_108byte*)(args[3]);
-
-	*(struct_108byte*)resp = cls_struct_108byte_fn(b0, b1, b2, b3);
-}
-
-int main (void)
-{
-	ffi_cif cif;
-        void *code;
-	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-	void* args_dbl[5];
-	ffi_type* cls_struct_fields[15];
-	ffi_type cls_struct_type;
-	ffi_type* dbl_arg_types[5];
-
-	struct_108byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 7 };
-	struct_108byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 4 };
-	struct_108byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 3 };
-	struct_108byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 2 };
-	struct_108byte res_dbl;
-
-	cls_struct_type.size = 0;
-	cls_struct_type.alignment = 0;
-	cls_struct_type.type = FFI_TYPE_STRUCT;
-	cls_struct_type.elements = cls_struct_fields;
-
-	cls_struct_fields[0] = &ffi_type_double;
-	cls_struct_fields[1] = &ffi_type_double;
-	cls_struct_fields[2] = &ffi_type_double;
-	cls_struct_fields[3] = &ffi_type_double;
-	cls_struct_fields[4] = &ffi_type_double;
-	cls_struct_fields[5] = &ffi_type_double;
-	cls_struct_fields[6] = &ffi_type_double;
-	cls_struct_fields[7] = &ffi_type_double;
-	cls_struct_fields[8] = &ffi_type_double;
-	cls_struct_fields[9] = &ffi_type_double;
-	cls_struct_fields[10] = &ffi_type_double;
-	cls_struct_fields[11] = &ffi_type_double;
-	cls_struct_fields[12] = &ffi_type_double;
-	cls_struct_fields[13] = &ffi_type_sint32;
-	cls_struct_fields[14] = NULL;
-
-	dbl_arg_types[0] = &cls_struct_type;
-	dbl_arg_types[1] = &cls_struct_type;
-	dbl_arg_types[2] = &cls_struct_type;
-	dbl_arg_types[3] = &cls_struct_type;
-	dbl_arg_types[4] = NULL;
-
-	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
-		dbl_arg_types) == FFI_OK);
-
-	args_dbl[0] = &e_dbl;
-	args_dbl[1] = &f_dbl;
-	args_dbl[2] = &g_dbl;
-	args_dbl[3] = &h_dbl;
-	args_dbl[4] = NULL;
-
-	ffi_call(&cif, FFI_FN(cls_struct_108byte_fn), &res_dbl, args_dbl);
-	/* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */
-	printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b,
-		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i,
-		res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n);
-	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_108byte_gn, NULL, code) == FFI_OK);
-
-	res_dbl = ((struct_108byte(*)(struct_108byte, struct_108byte,
-		struct_108byte, struct_108byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl);
-	/* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */
-	printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b,
-		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i,
-		res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n);
-	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */
-
-	exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/stret_large2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/stret_large2.c
deleted file mode 100644
index d9c750e..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/stret_large2.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/* Area:		ffi_call, closure_call
-   Purpose:		Check structure returning with different structure size.
-				Depending on the ABI. Check bigger struct which overlaps
-				the gp and fp register count on Darwin/AIX/ppc64.
-   Limitations:	none.
-   PR:			none.
-   Originator:	Blake Chaffin	6/21/2007	*/
-
-/* { dg-do run { xfail strongarm*-*-* xscale*-*-*  } } */
-#include "ffitest.h"
-
-/* 13 FPRs: 104 bytes */
-/* 14 FPRs: 112 bytes */
-
-typedef struct struct_116byte {
-	double a;
-	double b;
-	double c;
-	double d;
-	double e;
-	double f;
-	double g;
-	double h;
-	double i;
-	double j;
-	double k;
-	double l;
-	double m;
-	double n;
-	int o;
-} struct_116byte;
-
-struct_116byte cls_struct_116byte_fn(
-	struct_116byte b0,
-	struct_116byte b1,
-	struct_116byte b2,
-	struct_116byte b3)
-{
-	struct_116byte	result;
-
-	result.a = b0.a + b1.a + b2.a + b3.a;
-	result.b = b0.b + b1.b + b2.b + b3.b;
-	result.c = b0.c + b1.c + b2.c + b3.c;
-	result.d = b0.d + b1.d + b2.d + b3.d;
-	result.e = b0.e + b1.e + b2.e + b3.e;
-	result.f = b0.f + b1.f + b2.f + b3.f;
-	result.g = b0.g + b1.g + b2.g + b3.g;
-	result.h = b0.h + b1.h + b2.h + b3.h;
-	result.i = b0.i + b1.i + b2.i + b3.i;
-	result.j = b0.j + b1.j + b2.j + b3.j;
-	result.k = b0.k + b1.k + b2.k + b3.k;
-	result.l = b0.l + b1.l + b2.l + b3.l;
-	result.m = b0.m + b1.m + b2.m + b3.m;
-	result.n = b0.n + b1.n + b2.n + b3.n;
-	result.o = b0.o + b1.o + b2.o + b3.o;
-
-	printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c,
-		result.d, result.e, result.f, result.g, result.h, result.i,
-		result.j, result.k, result.l, result.m, result.n, result.o);
-
-	return result;
-}
-
-static void
-cls_struct_116byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
-{
-	struct_116byte	b0, b1, b2, b3;
-
-	b0 = *(struct_116byte*)(args[0]);
-	b1 = *(struct_116byte*)(args[1]);
-	b2 = *(struct_116byte*)(args[2]);
-	b3 = *(struct_116byte*)(args[3]);
-
-	*(struct_116byte*)resp = cls_struct_116byte_fn(b0, b1, b2, b3);
-}
-
-int main (void)
-{
-	ffi_cif cif;
-        void *code;
-	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-	void* args_dbl[5];
-	ffi_type* cls_struct_fields[16];
-	ffi_type cls_struct_type;
-	ffi_type* dbl_arg_types[5];
-
-	struct_116byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 7 };
-	struct_116byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 6.0, 4 };
-	struct_116byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 7.0, 3 };
-	struct_116byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 8.0, 2 };
-	struct_116byte res_dbl;
-
-	cls_struct_type.size = 0;
-	cls_struct_type.alignment = 0;
-	cls_struct_type.type = FFI_TYPE_STRUCT;
-	cls_struct_type.elements = cls_struct_fields;
-
-	cls_struct_fields[0] = &ffi_type_double;
-	cls_struct_fields[1] = &ffi_type_double;
-	cls_struct_fields[2] = &ffi_type_double;
-	cls_struct_fields[3] = &ffi_type_double;
-	cls_struct_fields[4] = &ffi_type_double;
-	cls_struct_fields[5] = &ffi_type_double;
-	cls_struct_fields[6] = &ffi_type_double;
-	cls_struct_fields[7] = &ffi_type_double;
-	cls_struct_fields[8] = &ffi_type_double;
-	cls_struct_fields[9] = &ffi_type_double;
-	cls_struct_fields[10] = &ffi_type_double;
-	cls_struct_fields[11] = &ffi_type_double;
-	cls_struct_fields[12] = &ffi_type_double;
-	cls_struct_fields[13] = &ffi_type_double;
-	cls_struct_fields[14] = &ffi_type_sint32;
-	cls_struct_fields[15] = NULL;
-
-	dbl_arg_types[0] = &cls_struct_type;
-	dbl_arg_types[1] = &cls_struct_type;
-	dbl_arg_types[2] = &cls_struct_type;
-	dbl_arg_types[3] = &cls_struct_type;
-	dbl_arg_types[4] = NULL;
-
-	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
-		dbl_arg_types) == FFI_OK);
-
-	args_dbl[0] = &e_dbl;
-	args_dbl[1] = &f_dbl;
-	args_dbl[2] = &g_dbl;
-	args_dbl[3] = &h_dbl;
-	args_dbl[4] = NULL;
-
-	ffi_call(&cif, FFI_FN(cls_struct_116byte_fn), &res_dbl, args_dbl);
-	/* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */
-	printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b,
-		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i,
-		res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o);
-	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_116byte_gn, NULL, code) == FFI_OK);
-
-	res_dbl = ((struct_116byte(*)(struct_116byte, struct_116byte,
-		struct_116byte, struct_116byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl);
-	/* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */
-	printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b,
-		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i,
-		res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o);
-	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */
-
-	exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/stret_medium.c b/third_party/gofrontend/libffi/testsuite/libffi.call/stret_medium.c
deleted file mode 100644
index 973ee02..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/stret_medium.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/* Area:		ffi_call, closure_call
-   Purpose:		Check structure returning with different structure size.
-				Depending on the ABI. Check bigger struct which overlaps
-				the gp and fp register count on Darwin/AIX/ppc64.
-   Limitations:	none.
-   PR:			none.
-   Originator:	Blake Chaffin	6/21/2007	*/
-
-/* { dg-do run { xfail strongarm*-*-* xscale*-*-*  } } */
-#include "ffitest.h"
-
-typedef struct struct_72byte {
-	double a;
-	double b;
-	double c;
-	double d;
-	double e;
-	double f;
-	double g;
-	double h;
-	double i;
-} struct_72byte;
-
-struct_72byte cls_struct_72byte_fn(
-	struct_72byte b0,
-	struct_72byte b1,
-	struct_72byte b2,
-	struct_72byte b3)
-{
-	struct_72byte	result;
-
-	result.a = b0.a + b1.a + b2.a + b3.a;
-	result.b = b0.b + b1.b + b2.b + b3.b;
-	result.c = b0.c + b1.c + b2.c + b3.c;
-	result.d = b0.d + b1.d + b2.d + b3.d;
-	result.e = b0.e + b1.e + b2.e + b3.e;
-	result.f = b0.f + b1.f + b2.f + b3.f;
-	result.g = b0.g + b1.g + b2.g + b3.g;
-	result.h = b0.h + b1.h + b2.h + b3.h;
-	result.i = b0.i + b1.i + b2.i + b3.i;
-
-	printf("%g %g %g %g %g %g %g %g %g\n", result.a, result.b, result.c,
-		result.d, result.e, result.f, result.g, result.h, result.i);
-
-	return result;
-}
-
-static void
-cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
-{
-	struct_72byte	b0, b1, b2, b3;
-
-	b0 = *(struct_72byte*)(args[0]);
-	b1 = *(struct_72byte*)(args[1]);
-	b2 = *(struct_72byte*)(args[2]);
-	b3 = *(struct_72byte*)(args[3]);
-
-	*(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3);
-}
-
-int main (void)
-{
-	ffi_cif cif;
-        void *code;
-	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-	void* args_dbl[5];
-	ffi_type* cls_struct_fields[10];
-	ffi_type cls_struct_type;
-	ffi_type* dbl_arg_types[5];
-
-	struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7.0 };
-	struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0 };
-	struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3.0 };
-	struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2.0 };
-	struct_72byte res_dbl;
-
-	cls_struct_type.size = 0;
-	cls_struct_type.alignment = 0;
-	cls_struct_type.type = FFI_TYPE_STRUCT;
-	cls_struct_type.elements = cls_struct_fields;
-
-	cls_struct_fields[0] = &ffi_type_double;
-	cls_struct_fields[1] = &ffi_type_double;
-	cls_struct_fields[2] = &ffi_type_double;
-	cls_struct_fields[3] = &ffi_type_double;
-	cls_struct_fields[4] = &ffi_type_double;
-	cls_struct_fields[5] = &ffi_type_double;
-	cls_struct_fields[6] = &ffi_type_double;
-	cls_struct_fields[7] = &ffi_type_double;
-	cls_struct_fields[8] = &ffi_type_double;
-	cls_struct_fields[9] = NULL;
-
-	dbl_arg_types[0] = &cls_struct_type;
-	dbl_arg_types[1] = &cls_struct_type;
-	dbl_arg_types[2] = &cls_struct_type;
-	dbl_arg_types[3] = &cls_struct_type;
-	dbl_arg_types[4] = NULL;
-
-	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
-		dbl_arg_types) == FFI_OK);
-
-	args_dbl[0] = &e_dbl;
-	args_dbl[1] = &f_dbl;
-	args_dbl[2] = &g_dbl;
-	args_dbl[3] = &h_dbl;
-	args_dbl[4] = NULL;
-
-	ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl);
-	/* { dg-output "22 15 17 25 6 13 19 18 16" } */
-	printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c,
-		res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i);
-	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK);
-
-	res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte,
-		struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl);
-	/* { dg-output "\n22 15 17 25 6 13 19 18 16" } */
-	printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c,
-		res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i);
-	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */
-
-	exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/stret_medium2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/stret_medium2.c
deleted file mode 100644
index 84323d1..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/stret_medium2.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/* Area:		ffi_call, closure_call
-   Purpose:		Check structure returning with different structure size.
-				Depending on the ABI. Check bigger struct which overlaps
-				the gp and fp register count on Darwin/AIX/ppc64.
-   Limitations:	none.
-   PR:			none.
-   Originator:	Blake Chaffin	6/21/2007	*/
-
-/* { dg-do run { xfail strongarm*-*-* xscale*-*-*  } } */
-/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */
-#include "ffitest.h"
-
-typedef struct struct_72byte {
-	double a;
-	double b;
-	double c;
-	double d;
-	double e;
-	double f;
-	double g;
-	double h;
-	long long i;
-} struct_72byte;
-
-struct_72byte cls_struct_72byte_fn(
-	struct_72byte b0,
-	struct_72byte b1,
-	struct_72byte b2,
-	struct_72byte b3)
-{
-	struct_72byte	result;
-
-	result.a = b0.a + b1.a + b2.a + b3.a;
-	result.b = b0.b + b1.b + b2.b + b3.b;
-	result.c = b0.c + b1.c + b2.c + b3.c;
-	result.d = b0.d + b1.d + b2.d + b3.d;
-	result.e = b0.e + b1.e + b2.e + b3.e;
-	result.f = b0.f + b1.f + b2.f + b3.f;
-	result.g = b0.g + b1.g + b2.g + b3.g;
-	result.h = b0.h + b1.h + b2.h + b3.h;
-	result.i = b0.i + b1.i + b2.i + b3.i;
-
-	printf("%g %g %g %g %g %g %g %g %" PRIdLL "\n", result.a, result.b, result.c,
-		result.d, result.e, result.f, result.g, result.h, result.i);
-
-	return result;
-}
-
-static void
-cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
-{
-	struct_72byte	b0, b1, b2, b3;
-
-	b0 = *(struct_72byte*)(args[0]);
-	b1 = *(struct_72byte*)(args[1]);
-	b2 = *(struct_72byte*)(args[2]);
-	b3 = *(struct_72byte*)(args[3]);
-
-	*(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3);
-}
-
-int main (void)
-{
-	ffi_cif cif;
-        void *code;
-	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-	void* args_dbl[5];
-	ffi_type* cls_struct_fields[10];
-	ffi_type cls_struct_type;
-	ffi_type* dbl_arg_types[5];
-
-	struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7 };
-	struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4 };
-	struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3 };
-	struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2 };
-	struct_72byte res_dbl;
-
-	cls_struct_type.size = 0;
-	cls_struct_type.alignment = 0;
-	cls_struct_type.type = FFI_TYPE_STRUCT;
-	cls_struct_type.elements = cls_struct_fields;
-
-	cls_struct_fields[0] = &ffi_type_double;
-	cls_struct_fields[1] = &ffi_type_double;
-	cls_struct_fields[2] = &ffi_type_double;
-	cls_struct_fields[3] = &ffi_type_double;
-	cls_struct_fields[4] = &ffi_type_double;
-	cls_struct_fields[5] = &ffi_type_double;
-	cls_struct_fields[6] = &ffi_type_double;
-	cls_struct_fields[7] = &ffi_type_double;
-	cls_struct_fields[8] = &ffi_type_sint64;
-	cls_struct_fields[9] = NULL;
-
-	dbl_arg_types[0] = &cls_struct_type;
-	dbl_arg_types[1] = &cls_struct_type;
-	dbl_arg_types[2] = &cls_struct_type;
-	dbl_arg_types[3] = &cls_struct_type;
-	dbl_arg_types[4] = NULL;
-
-	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
-		dbl_arg_types) == FFI_OK);
-
-	args_dbl[0] = &e_dbl;
-	args_dbl[1] = &f_dbl;
-	args_dbl[2] = &g_dbl;
-	args_dbl[3] = &h_dbl;
-	args_dbl[4] = NULL;
-
-	ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl);
-	/* { dg-output "22 15 17 25 6 13 19 18 16" } */
-	printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c,
-		res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i);
-	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */
-
-	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK);
-
-	res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte,
-		struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl);
-	/* { dg-output "\n22 15 17 25 6 13 19 18 16" } */
-	printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c,
-		res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i);
-	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */
-
-	exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/strlen.c b/third_party/gofrontend/libffi/testsuite/libffi.call/strlen.c
deleted file mode 100644
index 35b70ea..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/strlen.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check strlen function call.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-static size_t ABI_ATTR my_strlen(char *s)
-{
-  return (strlen(s));
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-  char *s;
-
-  args[0] = &ffi_type_pointer;
-  values[0] = (void*) &s;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
-		     &ffi_type_sint, args) == FFI_OK);
-  
-  s = "a";
-  ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
-  CHECK(rint == 1);
-  
-  s = "1234567";
-  ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
-  CHECK(rint == 7);
-  
-  s = "1234567890123456789012345";
-  ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
-  CHECK(rint == 25);
-  
-  exit (0);
-}
-  
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/strlen2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/strlen2.c
deleted file mode 100644
index 96282bc..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/strlen2.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check strlen function call with additional arguments.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-static size_t ABI_ATTR my_f(char *s, float a)
-{
-  return (size_t) ((int) strlen(s) + (int) a);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-  char *s;
-  float v2;
-  args[0] = &ffi_type_pointer;
-  args[1] = &ffi_type_float;
-  values[0] = (void*) &s;
-  values[1] = (void*) &v2;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 2,
-		       &ffi_type_sint, args) == FFI_OK);
-  
-  s = "a";
-  v2 = 0.0;
-  ffi_call(&cif, FFI_FN(my_f), &rint, values);
-  CHECK(rint == 1);
-  
-  s = "1234567";
-  v2 = -1.0;
-  ffi_call(&cif, FFI_FN(my_f), &rint, values);
-  CHECK(rint == 6);
-  
-  s = "1234567890123456789012345";
-  v2 = 1.0;
-  ffi_call(&cif, FFI_FN(my_f), &rint, values);
-  CHECK(rint == 26);
-  
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/strlen3.c b/third_party/gofrontend/libffi/testsuite/libffi.call/strlen3.c
deleted file mode 100644
index beba86e..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/strlen3.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check strlen function call with additional arguments.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-static size_t ABI_ATTR my_f(float a, char *s)
-{
-  return (size_t) ((int) strlen(s) + (int) a);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-  char *s;
-  float v2;
-  args[1] = &ffi_type_pointer;
-  args[0] = &ffi_type_float;
-  values[1] = (void*) &s;
-  values[0] = (void*) &v2;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 2,
-		       &ffi_type_sint, args) == FFI_OK);
-  
-  s = "a";
-  v2 = 0.0;
-  ffi_call(&cif, FFI_FN(my_f), &rint, values);
-  CHECK(rint == 1);
-  
-  s = "1234567";
-  v2 = -1.0;
-  ffi_call(&cif, FFI_FN(my_f), &rint, values);
-  CHECK(rint == 6);
-  
-  s = "1234567890123456789012345";
-  v2 = 1.0;
-  ffi_call(&cif, FFI_FN(my_f), &rint, values);
-  CHECK(rint == 26);
-  
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/strlen4.c b/third_party/gofrontend/libffi/testsuite/libffi.call/strlen4.c
deleted file mode 100644
index d5d42b4..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/strlen4.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check strlen function call with additional arguments.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-static size_t ABI_ATTR my_f(float a, char *s, int i)
-{
-  return (size_t) ((int) strlen(s) + (int) a + i);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-  char *s;
-  int v1;
-  float v2;
-  args[2] = &ffi_type_sint;
-  args[1] = &ffi_type_pointer;
-  args[0] = &ffi_type_float;
-  values[2] = (void*) &v1;
-  values[1] = (void*) &s;
-  values[0] = (void*) &v2;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 3,
-		       &ffi_type_sint, args) == FFI_OK);
-  
-  s = "a";
-  v1 = 1;
-  v2 = 0.0;
-  ffi_call(&cif, FFI_FN(my_f), &rint, values);
-  CHECK(rint == 2);
-  
-  s = "1234567";
-  v2 = -1.0;
-  v1 = -2;
-  ffi_call(&cif, FFI_FN(my_f), &rint, values);
-  CHECK(rint == 4);
-  
-  s = "1234567890123456789012345";
-  v2 = 1.0;
-  v1 = 2;
-  ffi_call(&cif, FFI_FN(my_f), &rint, values);
-  CHECK(rint == 28);
-  
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/struct1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/struct1.c
deleted file mode 100644
index c13e23f..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/struct1.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check structures.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct
-{
-  unsigned char uc;
-  double d;
-  unsigned int ui;
-} test_structure_1;
-
-static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
-{
-  ts.uc++;
-  ts.d--;
-  ts.ui++;
-
-  return ts;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_type ts1_type;
-  ffi_type *ts1_type_elements[4];
-
-  test_structure_1 ts1_arg;
-
-  /* This is a hack to get a properly aligned result buffer */
-  test_structure_1 *ts1_result =
-    (test_structure_1 *) malloc (sizeof(test_structure_1));
-
-  ts1_type.size = 0;
-  ts1_type.alignment = 0;
-  ts1_type.type = FFI_TYPE_STRUCT;
-  ts1_type.elements = ts1_type_elements;
-  ts1_type_elements[0] = &ffi_type_uchar;
-  ts1_type_elements[1] = &ffi_type_double;
-  ts1_type_elements[2] = &ffi_type_uint;
-  ts1_type_elements[3] = NULL;
-  
-  args[0] = &ts1_type;
-  values[0] = &ts1_arg;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
-		     &ts1_type, args) == FFI_OK);
-  
-  ts1_arg.uc = '\x01';
-  ts1_arg.d = 3.14159;
-  ts1_arg.ui = 555;
-
-  ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
-  
-  CHECK(ts1_result->ui == 556);
-  CHECK(ts1_result->d == 3.14159 - 1);
- 
-  free (ts1_result);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/struct2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/struct2.c
deleted file mode 100644
index 5077a5e..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/struct2.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check structures.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct
-{
-  double d1;
-  double d2;
-} test_structure_2;
-
-static test_structure_2 ABI_ATTR struct2(test_structure_2 ts)
-{
-  ts.d1--;
-  ts.d2--;
-
-  return ts;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  test_structure_2 ts2_arg;
-  ffi_type ts2_type;
-  ffi_type *ts2_type_elements[3];
-
-  /* This is a hack to get a properly aligned result buffer */
-  test_structure_2 *ts2_result =
-    (test_structure_2 *) malloc (sizeof(test_structure_2));
-
-  ts2_type.size = 0;
-  ts2_type.alignment = 0;
-  ts2_type.type = FFI_TYPE_STRUCT;
-  ts2_type.elements = ts2_type_elements;
-  ts2_type_elements[0] = &ffi_type_double;
-  ts2_type_elements[1] = &ffi_type_double;
-  ts2_type_elements[2] = NULL;
-
-  args[0] = &ts2_type;
-  values[0] = &ts2_arg;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts2_type, args) == FFI_OK);
-  
-  ts2_arg.d1 = 5.55;
-  ts2_arg.d2 = 6.66;
-  
-  printf ("%g\n", ts2_arg.d1);
-  printf ("%g\n", ts2_arg.d2);
-  
-  ffi_call(&cif, FFI_FN(struct2), ts2_result, values);
-  
-  printf ("%g\n", ts2_result->d1);
-  printf ("%g\n", ts2_result->d2);
-  
-  CHECK(ts2_result->d1 == 5.55 - 1);
-  CHECK(ts2_result->d2 == 6.66 - 1);
-  
-  free (ts2_result);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/struct3.c b/third_party/gofrontend/libffi/testsuite/libffi.call/struct3.c
deleted file mode 100644
index 7eba0ea..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/struct3.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check structures.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct
-{
-  int si;
-} test_structure_3;
-
-static test_structure_3 ABI_ATTR struct3(test_structure_3 ts)
-{
-  ts.si = -(ts.si*2);
-
-  return ts;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  int compare_value;
-  ffi_type ts3_type;
-  ffi_type *ts3_type_elements[2];
-
-  test_structure_3 ts3_arg;
-  test_structure_3 *ts3_result =
-    (test_structure_3 *) malloc (sizeof(test_structure_3));
-
-  ts3_type.size = 0;
-  ts3_type.alignment = 0;
-  ts3_type.type = FFI_TYPE_STRUCT;
-  ts3_type.elements = ts3_type_elements;
-  ts3_type_elements[0] = &ffi_type_sint;
-  ts3_type_elements[1] = NULL;
-
-  args[0] = &ts3_type;
-  values[0] = &ts3_arg;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
-		     &ts3_type, args) == FFI_OK);
-  
-  ts3_arg.si = -123;
-  compare_value = ts3_arg.si;
-  
-  ffi_call(&cif, FFI_FN(struct3), ts3_result, values);
-  
-  printf ("%d %d\n", ts3_result->si, -(compare_value*2));
-  
-  CHECK(ts3_result->si == -(compare_value*2));
- 
-  free (ts3_result);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/struct4.c b/third_party/gofrontend/libffi/testsuite/libffi.call/struct4.c
deleted file mode 100644
index 66a9551..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/struct4.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check structures.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct
-{
-  unsigned ui1;
-  unsigned ui2;
-  unsigned ui3;
-} test_structure_4;
-
-static test_structure_4 ABI_ATTR struct4(test_structure_4 ts)
-{
-  ts.ui3 = ts.ui1 * ts.ui2 * ts.ui3;
-
-  return ts;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_type ts4_type;
-  ffi_type *ts4_type_elements[4];  
-
-  test_structure_4 ts4_arg;
-
-  /* This is a hack to get a properly aligned result buffer */
-  test_structure_4 *ts4_result =
-    (test_structure_4 *) malloc (sizeof(test_structure_4));
-
-  ts4_type.size = 0;
-  ts4_type.alignment = 0;
-  ts4_type.type = FFI_TYPE_STRUCT;
-  ts4_type.elements = ts4_type_elements;
-  ts4_type_elements[0] = &ffi_type_uint;
-  ts4_type_elements[1] = &ffi_type_uint;
-  ts4_type_elements[2] = &ffi_type_uint;
-  ts4_type_elements[3] = NULL;
-
-  args[0] = &ts4_type;
-  values[0] = &ts4_arg;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts4_type, args) == FFI_OK);
-  
-  ts4_arg.ui1 = 2;
-  ts4_arg.ui2 = 3;
-  ts4_arg.ui3 = 4;
-  
-  ffi_call (&cif, FFI_FN(struct4), ts4_result, values);
-  
-  CHECK(ts4_result->ui3 == 2U * 3U * 4U);
- 
-  
-  free (ts4_result);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/struct5.c b/third_party/gofrontend/libffi/testsuite/libffi.call/struct5.c
deleted file mode 100644
index 23e2a3f..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/struct5.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check structures.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-typedef struct
-{
-  char c1;
-  char c2;
-} test_structure_5;
-
-static test_structure_5 ABI_ATTR struct5(test_structure_5 ts1, test_structure_5 ts2)
-{
-  ts1.c1 += ts2.c1;
-  ts1.c2 -= ts2.c2;
-  
-  return ts1;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_type ts5_type;
-  ffi_type *ts5_type_elements[3];
-
-  test_structure_5 ts5_arg1, ts5_arg2;
-
-  /* This is a hack to get a properly aligned result buffer */
-  test_structure_5 *ts5_result =
-    (test_structure_5 *) malloc (sizeof(test_structure_5));
-
-  ts5_type.size = 0;
-  ts5_type.alignment = 0;
-  ts5_type.type = FFI_TYPE_STRUCT;
-  ts5_type.elements = ts5_type_elements;
-  ts5_type_elements[0] = &ffi_type_schar;
-  ts5_type_elements[1] = &ffi_type_schar;
-  ts5_type_elements[2] = NULL;
-
-  args[0] = &ts5_type;
-  args[1] = &ts5_type;
-  values[0] = &ts5_arg1;
-  values[1] = &ts5_arg2;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &ts5_type, args) == FFI_OK);
-  
-  ts5_arg1.c1 = 2;
-  ts5_arg1.c2 = 6;
-  ts5_arg2.c1 = 5;
-  ts5_arg2.c2 = 3;
-  
-  ffi_call (&cif, FFI_FN(struct5), ts5_result, values);
-  
-  CHECK(ts5_result->c1 == 7); 
-  CHECK(ts5_result->c2 == 3);
-  
-  
-  free (ts5_result);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/struct6.c b/third_party/gofrontend/libffi/testsuite/libffi.call/struct6.c
deleted file mode 100644
index 173c66e..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/struct6.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check structures.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-typedef struct
-{
-  float f;
-  double d;
-} test_structure_6;
-
-static test_structure_6 ABI_ATTR struct6 (test_structure_6 ts)
-{
-  ts.f += 1;
-  ts.d += 1;
-  
-  return ts;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_type ts6_type;
-  ffi_type *ts6_type_elements[3];
-
-  test_structure_6 ts6_arg;
-
-  /* This is a hack to get a properly aligned result buffer */
-  test_structure_6 *ts6_result =
-    (test_structure_6 *) malloc (sizeof(test_structure_6));
-
-  ts6_type.size = 0;
-  ts6_type.alignment = 0;
-  ts6_type.type = FFI_TYPE_STRUCT;
-  ts6_type.elements = ts6_type_elements;
-  ts6_type_elements[0] = &ffi_type_float;
-  ts6_type_elements[1] = &ffi_type_double;
-  ts6_type_elements[2] = NULL;
-
-  args[0] = &ts6_type;
-  values[0] = &ts6_arg;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts6_type, args) == FFI_OK);
-  
-  ts6_arg.f = 5.55f;
-  ts6_arg.d = 6.66;
-  
-  printf ("%g\n", ts6_arg.f);
-  printf ("%g\n", ts6_arg.d);
-
-  ffi_call(&cif, FFI_FN(struct6), ts6_result, values);
-    
-  CHECK(ts6_result->f == 5.55f + 1);
-  CHECK(ts6_result->d == 6.66 + 1);
-    
-  free (ts6_result);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/struct7.c b/third_party/gofrontend/libffi/testsuite/libffi.call/struct7.c
deleted file mode 100644
index badc7e0..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/struct7.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check structures.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-typedef struct
-{
-  float f1;
-  float f2;
-  double d;
-} test_structure_7;
-
-static test_structure_7 ABI_ATTR struct7 (test_structure_7 ts)
-{
-  ts.f1 += 1;
-  ts.f2 += 1;
-  ts.d += 1;
-
-  return ts;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_type ts7_type;
-  ffi_type *ts7_type_elements[4];
-
-  test_structure_7 ts7_arg;
-
-  /* This is a hack to get a properly aligned result buffer */
-  test_structure_7 *ts7_result =
-    (test_structure_7 *) malloc (sizeof(test_structure_7));
-
-  ts7_type.size = 0;
-  ts7_type.alignment = 0;
-  ts7_type.type = FFI_TYPE_STRUCT;
-  ts7_type.elements = ts7_type_elements;
-  ts7_type_elements[0] = &ffi_type_float;
-  ts7_type_elements[1] = &ffi_type_float;
-  ts7_type_elements[2] = &ffi_type_double;
-  ts7_type_elements[3] = NULL;
-
-  args[0] = &ts7_type;
-  values[0] = &ts7_arg;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts7_type, args) == FFI_OK);
-  
-  ts7_arg.f1 = 5.55f;
-  ts7_arg.f2 = 55.5f;
-  ts7_arg.d = 6.66;
-
-  printf ("%g\n", ts7_arg.f1);
-  printf ("%g\n", ts7_arg.f2);
-  printf ("%g\n", ts7_arg.d);
-  
-  ffi_call(&cif, FFI_FN(struct7), ts7_result, values);
-
-  printf ("%g\n", ts7_result->f1);
-  printf ("%g\n", ts7_result->f2);
-  printf ("%g\n", ts7_result->d);
-  
-  CHECK(ts7_result->f1 == 5.55f + 1);
-  CHECK(ts7_result->f2 == 55.5f + 1);
-  CHECK(ts7_result->d == 6.66 + 1);
-  
-  free (ts7_result);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/struct8.c b/third_party/gofrontend/libffi/testsuite/libffi.call/struct8.c
deleted file mode 100644
index ef204ec..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/struct8.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check structures.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-typedef struct
-{
-  float f1;
-  float f2;
-  float f3;
-  float f4;
-} test_structure_8;
-
-static test_structure_8 ABI_ATTR struct8 (test_structure_8 ts)
-{
-  ts.f1 += 1;
-  ts.f2 += 1;
-  ts.f3 += 1;
-  ts.f4 += 1;
-
-  return ts;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_type ts8_type;
-  ffi_type *ts8_type_elements[5];
-
-  test_structure_8 ts8_arg;
-
-  /* This is a hack to get a properly aligned result buffer */
-  test_structure_8 *ts8_result =
-    (test_structure_8 *) malloc (sizeof(test_structure_8));
-
-  ts8_type.size = 0;
-  ts8_type.alignment = 0;
-  ts8_type.type = FFI_TYPE_STRUCT;
-  ts8_type.elements = ts8_type_elements;
-  ts8_type_elements[0] = &ffi_type_float;
-  ts8_type_elements[1] = &ffi_type_float;
-  ts8_type_elements[2] = &ffi_type_float;
-  ts8_type_elements[3] = &ffi_type_float;
-  ts8_type_elements[4] = NULL;
-
-  args[0] = &ts8_type;
-  values[0] = &ts8_arg;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts8_type, args) == FFI_OK);
-  
-  ts8_arg.f1 = 5.55f;
-  ts8_arg.f2 = 55.5f;
-  ts8_arg.f3 = -5.55f;
-  ts8_arg.f4 = -55.5f;
-
-  printf ("%g\n", ts8_arg.f1);
-  printf ("%g\n", ts8_arg.f2);
-  printf ("%g\n", ts8_arg.f3);
-  printf ("%g\n", ts8_arg.f4);
-  
-  ffi_call(&cif, FFI_FN(struct8), ts8_result, values);
-
-  printf ("%g\n", ts8_result->f1);
-  printf ("%g\n", ts8_result->f2);
-  printf ("%g\n", ts8_result->f3);
-  printf ("%g\n", ts8_result->f4);
-  
-  CHECK(ts8_result->f1 == 5.55f + 1);
-  CHECK(ts8_result->f2 == 55.5f + 1);
-  CHECK(ts8_result->f3 == -5.55f + 1);
-  CHECK(ts8_result->f4 == -55.5f + 1);
-  
-  free (ts8_result);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/struct9.c b/third_party/gofrontend/libffi/testsuite/libffi.call/struct9.c
deleted file mode 100644
index 4a13b81..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/struct9.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check structures.
-   Limitations:	none.
-   PR:		none.
-   Originator:	From the original ffitest.c  */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct
-{
-  float f;
-  int i;
-} test_structure_9;
-
-static test_structure_9 ABI_ATTR struct9 (test_structure_9 ts)
-{
-  ts.f += 1;
-  ts.i += 1;
-
-  return ts;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_type ts9_type;
-  ffi_type *ts9_type_elements[3];
-
-  test_structure_9 ts9_arg;
-
-  /* This is a hack to get a properly aligned result buffer */
-  test_structure_9 *ts9_result =
-    (test_structure_9 *) malloc (sizeof(test_structure_9));
-
-  ts9_type.size = 0;
-  ts9_type.alignment = 0;
-  ts9_type.type = FFI_TYPE_STRUCT;
-  ts9_type.elements = ts9_type_elements;
-  ts9_type_elements[0] = &ffi_type_float;
-  ts9_type_elements[1] = &ffi_type_sint;
-  ts9_type_elements[2] = NULL;
-
-  args[0] = &ts9_type;
-  values[0] = &ts9_arg;
-  
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts9_type, args) == FFI_OK);
-  
-  ts9_arg.f = 5.55f;
-  ts9_arg.i = 5;
-  
-  printf ("%g\n", ts9_arg.f);
-  printf ("%d\n", ts9_arg.i);
-  
-  ffi_call(&cif, FFI_FN(struct9), ts9_result, values);
-
-  printf ("%g\n", ts9_result->f);
-  printf ("%d\n", ts9_result->i);
-  
-  CHECK(ts9_result->f == 5.55f + 1);
-  CHECK(ts9_result->i == 5 + 1);
-
-  free (ts9_result);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/testclosure.c b/third_party/gofrontend/libffi/testsuite/libffi.call/testclosure.c
deleted file mode 100644
index ca31056..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/testclosure.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check return value float.
-   Limitations:	none.
-   PR:		41908.
-   Originator:	<rfm@gnu.org> 20091102	 */
-
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct cls_struct_combined {
-  float a;
-  float b;
-  float c;
-  float d;
-} cls_struct_combined;
-
-void cls_struct_combined_fn(struct cls_struct_combined arg)
-{
-  printf("%g %g %g %g\n",
-	 arg.a, arg.b,
-	 arg.c, arg.d);
-  fflush(stdout);
-}
-
-static void
-cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
-        void** args, void* userdata __UNUSED__)
-{
-  struct cls_struct_combined a0;
-
-  a0 = *(struct cls_struct_combined*)(args[0]);
-
-  cls_struct_combined_fn(a0);
-}
-
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type* cls_struct_fields0[5];
-  ffi_type cls_struct_type0;
-  ffi_type* dbl_arg_types[5];
-
-  struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0};
-
-  cls_struct_type0.size = 0;
-  cls_struct_type0.alignment = 0;
-  cls_struct_type0.type = FFI_TYPE_STRUCT;
-  cls_struct_type0.elements = cls_struct_fields0;
-
-  cls_struct_fields0[0] = &ffi_type_float;
-  cls_struct_fields0[1] = &ffi_type_float;
-  cls_struct_fields0[2] = &ffi_type_float;
-  cls_struct_fields0[3] = &ffi_type_float;
-  cls_struct_fields0[4] = NULL;
-
-  dbl_arg_types[0] = &cls_struct_type0;
-  dbl_arg_types[1] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_void,
-		     dbl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK);
-
-  ((void(*)(cls_struct_combined)) (code))(g_dbl);
-  /* { dg-output "4 5 1 8" } */
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/uninitialized.c b/third_party/gofrontend/libffi/testsuite/libffi.call/uninitialized.c
deleted file mode 100644
index f00d830..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/uninitialized.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* { dg-do run } */
-#include "ffitest.h"
-
-typedef struct
-{
-  unsigned char uc;
-  double d;
-  unsigned int ui;
-} test_structure_1;
-
-static test_structure_1 struct1(test_structure_1 ts)
-{
-  ts.uc++;
-  ts.d--;
-  ts.ui++;
-
-  return ts;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_type ts1_type;
-  ffi_type *ts1_type_elements[4];
-
-  memset(&cif, 1, sizeof(cif));
-  ts1_type.size = 0;
-  ts1_type.alignment = 0;
-  ts1_type.type = FFI_TYPE_STRUCT;
-  ts1_type.elements = ts1_type_elements;
-  ts1_type_elements[0] = &ffi_type_uchar;
-  ts1_type_elements[1] = &ffi_type_double;
-  ts1_type_elements[2] = &ffi_type_uint;
-  ts1_type_elements[3] = NULL;
-
-  test_structure_1 ts1_arg;
-  /* This is a hack to get a properly aligned result buffer */
-  test_structure_1 *ts1_result =
-    (test_structure_1 *) malloc (sizeof(test_structure_1));
-
-  args[0] = &ts1_type;
-  values[0] = &ts1_arg;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ts1_type, args) == FFI_OK);
-
-  ts1_arg.uc = '\x01';
-  ts1_arg.d = 3.14159;
-  ts1_arg.ui = 555;
-
-  ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
-
-  CHECK(ts1_result->ui == 556);
-  CHECK(ts1_result->d == 3.14159 - 1);
-
-  free (ts1_result);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/va_1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/va_1.c
deleted file mode 100644
index 7f96809..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/va_1.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/* Area:		ffi_call
-   Purpose:		Test passing struct in variable argument lists.
-   Limitations:	none.
-   PR:			none.
-   Originator:	        ARM Ltd. */
-
-/* { dg-do run } */
-/* { dg-output "" { xfail avr32*-*-* } } */
-
-#include "ffitest.h"
-#include <stdarg.h>
-
-struct small_tag
-{
-  unsigned char a;
-  unsigned char b;
-};
-
-struct large_tag
-{
-  unsigned a;
-  unsigned b;
-  unsigned c;
-  unsigned d;
-  unsigned e;
-};
-
-static int
-test_fn (int n, ...)
-{
-  va_list ap;
-  struct small_tag s1;
-  struct small_tag s2;
-  struct large_tag l;
-  unsigned char uc;
-  signed char sc;
-  unsigned short us;
-  signed short ss;
-  unsigned int ui;
-  signed int si;
-  unsigned long ul;
-  signed long sl;
-  float f;
-  double d;
-
-  va_start (ap, n);
-  s1 = va_arg (ap, struct small_tag);
-  l = va_arg (ap, struct large_tag);
-  s2 = va_arg (ap, struct small_tag);
-
-  uc = va_arg (ap, unsigned);
-  sc = va_arg (ap, signed);
-
-  us = va_arg (ap, unsigned);
-  ss = va_arg (ap, signed);
-
-  ui = va_arg (ap, unsigned int);
-  si = va_arg (ap, signed int);
-
-  ul = va_arg (ap, unsigned long);
-  sl = va_arg (ap, signed long);
-
-  f = va_arg (ap, double);	/* C standard promotes float->double
-				   when anonymous */
-  d = va_arg (ap, double);
-
-  printf ("%u %u %u %u %u %u %u %u %u uc=%u sc=%d %u %d %u %d %lu %ld %f %f\n",
-	  s1.a, s1.b, l.a, l.b, l.c, l.d, l.e,
-	  s2.a, s2.b,
-	  uc, sc,
-	  us, ss,
-	  ui, si,
-	  ul, sl,
-	  f, d);
-  va_end (ap);
-  return n + 1;
-}
-
-int
-main (void)
-{
-  ffi_cif cif;
-  void* args[15];
-  ffi_type* arg_types[15];
-
-  ffi_type s_type;
-  ffi_type *s_type_elements[3];
-
-  ffi_type l_type;
-  ffi_type *l_type_elements[6];
-
-  struct small_tag s1;
-  struct small_tag s2;
-  struct large_tag l1;
-
-  int n;
-  ffi_arg res;
-
-  unsigned char uc;
-  signed char sc;
-  unsigned short us;
-  signed short ss;
-  unsigned int ui;
-  signed int si;
-  unsigned long ul;
-  signed long sl;
-  double d1;
-  double f1;
-
-  s_type.size = 0;
-  s_type.alignment = 0;
-  s_type.type = FFI_TYPE_STRUCT;
-  s_type.elements = s_type_elements;
-
-  s_type_elements[0] = &ffi_type_uchar;
-  s_type_elements[1] = &ffi_type_uchar;
-  s_type_elements[2] = NULL;
-
-  l_type.size = 0;
-  l_type.alignment = 0;
-  l_type.type = FFI_TYPE_STRUCT;
-  l_type.elements = l_type_elements;
-
-  l_type_elements[0] = &ffi_type_uint;
-  l_type_elements[1] = &ffi_type_uint;
-  l_type_elements[2] = &ffi_type_uint;
-  l_type_elements[3] = &ffi_type_uint;
-  l_type_elements[4] = &ffi_type_uint;
-  l_type_elements[5] = NULL;
-
-  arg_types[0] = &ffi_type_sint;
-  arg_types[1] = &s_type;
-  arg_types[2] = &l_type;
-  arg_types[3] = &s_type;
-  arg_types[4] = &ffi_type_uchar;
-  arg_types[5] = &ffi_type_schar;
-  arg_types[6] = &ffi_type_ushort;
-  arg_types[7] = &ffi_type_sshort;
-  arg_types[8] = &ffi_type_uint;
-  arg_types[9] = &ffi_type_sint;
-  arg_types[10] = &ffi_type_ulong;
-  arg_types[11] = &ffi_type_slong;
-  arg_types[12] = &ffi_type_double;
-  arg_types[13] = &ffi_type_double;
-  arg_types[14] = NULL;
-
-  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 14, &ffi_type_sint, arg_types) == FFI_OK);
-
-  s1.a = 5;
-  s1.b = 6;
-
-  l1.a = 10;
-  l1.b = 11;
-  l1.c = 12;
-  l1.d = 13;
-  l1.e = 14;
-
-  s2.a = 7;
-  s2.b = 8;
-
-  n = 41;
-
-  uc = 9;
-  sc = 10;
-  us = 11;
-  ss = 12;
-  ui = 13;
-  si = 14;
-  ul = 15;
-  sl = 16;
-  f1 = 2.12;
-  d1 = 3.13;
-
-  args[0] = &n;
-  args[1] = &s1;
-  args[2] = &l1;
-  args[3] = &s2;
-  args[4] = &uc;
-  args[5] = &sc;
-  args[6] = &us;
-  args[7] = &ss;
-  args[8] = &ui;
-  args[9] = &si;
-  args[10] = &ul;
-  args[11] = &sl;
-  args[12] = &f1;
-  args[13] = &d1;
-  args[14] = NULL;
-
-  ffi_call(&cif, FFI_FN(test_fn), &res, args);
-  /* { dg-output "5 6 10 11 12 13 14 7 8 uc=9 sc=10 11 12 13 14 15 16 2.120000 3.130000" } */
-  printf("res: %d\n", (int) res);
-  /* { dg-output "\nres: 42" } */
-
-  return 0;
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/va_struct1.c b/third_party/gofrontend/libffi/testsuite/libffi.call/va_struct1.c
deleted file mode 100644
index e645206..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/va_struct1.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/* Area:		ffi_call
-   Purpose:		Test passing struct in variable argument lists.
-   Limitations:	none.
-   PR:			none.
-   Originator: ARM Ltd. */
-
-/* { dg-do run } */
-/* { dg-output "" { xfail avr32*-*-* } } */
-
-#include "ffitest.h"
-#include <stdarg.h>
-
-struct small_tag
-{
-  unsigned char a;
-  unsigned char b;
-};
-
-struct large_tag
-{
-  unsigned a;
-  unsigned b;
-  unsigned c;
-  unsigned d;
-  unsigned e;
-};
-
-static int
-test_fn (int n, ...)
-{
-  va_list ap;
-  struct small_tag s1;
-  struct small_tag s2;
-  struct large_tag l;
-
-  va_start (ap, n);
-  s1 = va_arg (ap, struct small_tag);
-  l = va_arg (ap, struct large_tag);
-  s2 = va_arg (ap, struct small_tag);
-  printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e,
-	  s2.a, s2.b);
-  va_end (ap);
-  return n + 1;
-}
-
-int
-main (void)
-{
-  ffi_cif cif;
-  void* args[5];
-  ffi_type* arg_types[5];
-
-  ffi_type s_type;
-  ffi_type *s_type_elements[3];
-
-  ffi_type l_type;
-  ffi_type *l_type_elements[6];
-
-  struct small_tag s1;
-  struct small_tag s2;
-  struct large_tag l1;
-
-  int n;
-  ffi_arg res;
-
-  s_type.size = 0;
-  s_type.alignment = 0;
-  s_type.type = FFI_TYPE_STRUCT;
-  s_type.elements = s_type_elements;
-
-  s_type_elements[0] = &ffi_type_uchar;
-  s_type_elements[1] = &ffi_type_uchar;
-  s_type_elements[2] = NULL;
-
-  l_type.size = 0;
-  l_type.alignment = 0;
-  l_type.type = FFI_TYPE_STRUCT;
-  l_type.elements = l_type_elements;
-
-  l_type_elements[0] = &ffi_type_uint;
-  l_type_elements[1] = &ffi_type_uint;
-  l_type_elements[2] = &ffi_type_uint;
-  l_type_elements[3] = &ffi_type_uint;
-  l_type_elements[4] = &ffi_type_uint;
-  l_type_elements[5] = NULL;
-
-  arg_types[0] = &ffi_type_sint;
-  arg_types[1] = &s_type;
-  arg_types[2] = &l_type;
-  arg_types[3] = &s_type;
-  arg_types[4] = NULL;
-
-  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint, arg_types) == FFI_OK);
-
-  s1.a = 5;
-  s1.b = 6;
-
-  l1.a = 10;
-  l1.b = 11;
-  l1.c = 12;
-  l1.d = 13;
-  l1.e = 14;
-
-  s2.a = 7;
-  s2.b = 8;
-
-  n = 41;
-
-  args[0] = &n;
-  args[1] = &s1;
-  args[2] = &l1;
-  args[3] = &s2;
-  args[4] = NULL;
-
-  ffi_call(&cif, FFI_FN(test_fn), &res, args);
-  /* { dg-output "5 6 10 11 12 13 14 7 8" } */
-  printf("res: %d\n", (int) res);
-  /* { dg-output "\nres: 42" } */
-
-  return 0;
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/va_struct2.c b/third_party/gofrontend/libffi/testsuite/libffi.call/va_struct2.c
deleted file mode 100644
index 56f5b9c..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/va_struct2.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/* Area:		ffi_call
-   Purpose:		Test passing struct in variable argument lists.
-   Limitations:	none.
-   PR:			none.
-   Originator: ARM Ltd. */
-
-/* { dg-do run } */
-/* { dg-output "" { xfail avr32*-*-* } } */
-
-#include "ffitest.h"
-#include <stdarg.h>
-
-struct small_tag
-{
-  unsigned char a;
-  unsigned char b;
-};
-
-struct large_tag
-{
-  unsigned a;
-  unsigned b;
-  unsigned c;
-  unsigned d;
-  unsigned e;
-};
-
-static struct small_tag
-test_fn (int n, ...)
-{
-  va_list ap;
-  struct small_tag s1;
-  struct small_tag s2;
-  struct large_tag l;
-
-  va_start (ap, n);
-  s1 = va_arg (ap, struct small_tag);
-  l = va_arg (ap, struct large_tag);
-  s2 = va_arg (ap, struct small_tag);
-  printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e,
-	  s2.a, s2.b);
-  va_end (ap);
-  s1.a += s2.a;
-  s1.b += s2.b;
-  return s1;
-}
-
-int
-main (void)
-{
-  ffi_cif cif;
-  void* args[5];
-  ffi_type* arg_types[5];
-
-  ffi_type s_type;
-  ffi_type *s_type_elements[3];
-
-  ffi_type l_type;
-  ffi_type *l_type_elements[6];
-
-  struct small_tag s1;
-  struct small_tag s2;
-  struct large_tag l1;
-
-  int n;
-  struct small_tag res;
-
-  s_type.size = 0;
-  s_type.alignment = 0;
-  s_type.type = FFI_TYPE_STRUCT;
-  s_type.elements = s_type_elements;
-
-  s_type_elements[0] = &ffi_type_uchar;
-  s_type_elements[1] = &ffi_type_uchar;
-  s_type_elements[2] = NULL;
-
-  l_type.size = 0;
-  l_type.alignment = 0;
-  l_type.type = FFI_TYPE_STRUCT;
-  l_type.elements = l_type_elements;
-
-  l_type_elements[0] = &ffi_type_uint;
-  l_type_elements[1] = &ffi_type_uint;
-  l_type_elements[2] = &ffi_type_uint;
-  l_type_elements[3] = &ffi_type_uint;
-  l_type_elements[4] = &ffi_type_uint;
-  l_type_elements[5] = NULL;
-
-  arg_types[0] = &ffi_type_sint;
-  arg_types[1] = &s_type;
-  arg_types[2] = &l_type;
-  arg_types[3] = &s_type;
-  arg_types[4] = NULL;
-
-  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &s_type, arg_types) == FFI_OK);
-
-  s1.a = 5;
-  s1.b = 6;
-
-  l1.a = 10;
-  l1.b = 11;
-  l1.c = 12;
-  l1.d = 13;
-  l1.e = 14;
-
-  s2.a = 7;
-  s2.b = 8;
-
-  n = 41;
-
-  args[0] = &n;
-  args[1] = &s1;
-  args[2] = &l1;
-  args[3] = &s2;
-  args[4] = NULL;
-
-  ffi_call(&cif, FFI_FN(test_fn), &res, args);
-  /* { dg-output "5 6 10 11 12 13 14 7 8" } */
-  printf("res: %d %d\n", res.a, res.b);
-  /* { dg-output "\nres: 12 14" } */
-
-  return 0;
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.call/va_struct3.c b/third_party/gofrontend/libffi/testsuite/libffi.call/va_struct3.c
deleted file mode 100644
index 9a27e7f..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.call/va_struct3.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/* Area:		ffi_call
-   Purpose:		Test passing struct in variable argument lists.
-   Limitations:	none.
-   PR:			none.
-   Originator:	ARM Ltd. */
-
-/* { dg-do run } */
-/* { dg-output "" { xfail avr32*-*-* } } */
-
-#include "ffitest.h"
-#include <stdarg.h>
-
-struct small_tag
-{
-  unsigned char a;
-  unsigned char b;
-};
-
-struct large_tag
-{
-  unsigned a;
-  unsigned b;
-  unsigned c;
-  unsigned d;
-  unsigned e;
-};
-
-static struct large_tag
-test_fn (int n, ...)
-{
-  va_list ap;
-  struct small_tag s1;
-  struct small_tag s2;
-  struct large_tag l;
-
-  va_start (ap, n);
-  s1 = va_arg (ap, struct small_tag);
-  l = va_arg (ap, struct large_tag);
-  s2 = va_arg (ap, struct small_tag);
-  printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e,
-	  s2.a, s2.b);
-  va_end (ap);
-  l.a += s1.a;
-  l.b += s1.b;
-  l.c += s2.a;
-  l.d += s2.b;
-  return l;
-}
-
-int
-main (void)
-{
-  ffi_cif cif;
-  void* args[5];
-  ffi_type* arg_types[5];
-
-  ffi_type s_type;
-  ffi_type *s_type_elements[3];
-
-  ffi_type l_type;
-  ffi_type *l_type_elements[6];
-
-  struct small_tag s1;
-  struct small_tag s2;
-  struct large_tag l1;
-
-  int n;
-  struct large_tag res;
-
-  s_type.size = 0;
-  s_type.alignment = 0;
-  s_type.type = FFI_TYPE_STRUCT;
-  s_type.elements = s_type_elements;
-
-  s_type_elements[0] = &ffi_type_uchar;
-  s_type_elements[1] = &ffi_type_uchar;
-  s_type_elements[2] = NULL;
-
-  l_type.size = 0;
-  l_type.alignment = 0;
-  l_type.type = FFI_TYPE_STRUCT;
-  l_type.elements = l_type_elements;
-
-  l_type_elements[0] = &ffi_type_uint;
-  l_type_elements[1] = &ffi_type_uint;
-  l_type_elements[2] = &ffi_type_uint;
-  l_type_elements[3] = &ffi_type_uint;
-  l_type_elements[4] = &ffi_type_uint;
-  l_type_elements[5] = NULL;
-
-  arg_types[0] = &ffi_type_sint;
-  arg_types[1] = &s_type;
-  arg_types[2] = &l_type;
-  arg_types[3] = &s_type;
-  arg_types[4] = NULL;
-
-  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &l_type, arg_types) == FFI_OK);
-
-  s1.a = 5;
-  s1.b = 6;
-
-  l1.a = 10;
-  l1.b = 11;
-  l1.c = 12;
-  l1.d = 13;
-  l1.e = 14;
-
-  s2.a = 7;
-  s2.b = 8;
-
-  n = 41;
-
-  args[0] = &n;
-  args[1] = &s1;
-  args[2] = &l1;
-  args[3] = &s2;
-  args[4] = NULL;
-
-  ffi_call(&cif, FFI_FN(test_fn), &res, args);
-  /* { dg-output "5 6 10 11 12 13 14 7 8" } */
-  printf("res: %d %d %d %d %d\n", res.a, res.b, res.c, res.d, res.e);
-  /* { dg-output "\nres: 15 17 19 21 14" } */
-
-  return 0;
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_align_complex.inc b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_align_complex.inc
deleted file mode 100644
index 4a812ed..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_align_complex.inc
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*-c-*- */
-#include "ffitest.h"
-#include <complex.h>
-
-typedef struct cls_struct_align {
-  unsigned char a;
-  _Complex T_C_TYPE b;
-  unsigned char c;
-} cls_struct_align;
-
-cls_struct_align cls_struct_align_fn(
-	struct cls_struct_align a1, struct cls_struct_align a2)
-{
-  struct cls_struct_align result;
-
-  result.a = a1.a + a2.a;
-  result.b = a1.b + a2.b;
-  result.c = a1.c + a2.c;
-
-  printf("%d %f,%fi %d %d %f,%fi %d: %d %f,%fi %d\n",
-	 a1.a, T_CONV creal (a1.b), T_CONV cimag (a1.b), a1.c,
-	 a2.a, T_CONV creal (a2.b), T_CONV cimag (a2.b), a2.c,
-	 result.a, T_CONV creal (result.b), T_CONV cimag (result.b), result.c);
-
-  return  result;
-}
-
-static void
-cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-		    void* userdata __UNUSED__)
-{
-
-  struct cls_struct_align a1, a2;
-
-  a1 = *(struct cls_struct_align*)(args[0]);
-  a2 = *(struct cls_struct_align*)(args[1]);
-
-  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args_c[5];
-  ffi_type* cls_struct_fields[4];
-  ffi_type cls_struct_type;
-  ffi_type* c_arg_types[5];
-
-  struct cls_struct_align g_c = { 12, 4951 + 7 * I, 127 };
-  struct cls_struct_align f_c = { 1, 9320 + 1 * I, 13 };
-  struct cls_struct_align res_c;
-
-  cls_struct_type.size = 0;
-  cls_struct_type.alignment = 0;
-  cls_struct_type.type = FFI_TYPE_STRUCT;
-  cls_struct_type.elements = cls_struct_fields;
-
-  cls_struct_fields[0] = &ffi_type_uchar;
-  cls_struct_fields[1] = &T_FFI_TYPE;
-  cls_struct_fields[2] = &ffi_type_uchar;
-  cls_struct_fields[3] = NULL;
-
-  c_arg_types[0] = &cls_struct_type;
-  c_arg_types[1] = &cls_struct_type;
-  c_arg_types[2] = NULL;
-
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
-		     c_arg_types) == FFI_OK);
-
-  args_c[0] = &g_c;
-  args_c[1] = &f_c;
-  args_c[2] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_c, args_c);
-  /* { dg-output "12 4951,7i 127 1 9320,1i 13: 13 14271,8i 140" } */
-  printf("res: %d %f,%fi %d\n",
-	 res_c.a, T_CONV  creal (res_c.b), T_CONV  cimag (res_c.b), res_c.c);
-  /* { dg-output "\nres: 13 14271,8i 140" } */
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
-
-  res_c = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_c, f_c);
-  /* { dg-output "\n12 4951,7i 127 1 9320,1i 13: 13 14271,8i 140" } */
-  printf("res: %d %f,%fi %d\n",
-	 res_c.a, T_CONV  creal (res_c.b), T_CONV  cimag (res_c.b), res_c.c);
-  /* { dg-output "\nres: 13 14271,8i 140" } */
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_align_complex_double.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_align_complex_double.c
deleted file mode 100644
index 0dff23a..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_align_complex_double.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_double.inc"
-#include "cls_align_complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_align_complex_float.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_align_complex_float.c
deleted file mode 100644
index 0affbd0..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_align_complex_float.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_float.inc"
-#include "cls_align_complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c
deleted file mode 100644
index 7889ba8..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check structure alignment of complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_longdouble.inc"
-#include "cls_align_complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex.inc b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex.inc
deleted file mode 100644
index f937404..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex.inc
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*-c-*- */
-#include "ffitest.h"
-#include <complex.h>
-
-static void cls_ret_complex_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
-			      void* userdata __UNUSED__)
- {
-   _Complex T_C_TYPE *pa;
-   _Complex T_C_TYPE *pr;
-   pa = (_Complex T_C_TYPE *)args[0];
-   pr = (_Complex T_C_TYPE *)resp;
-   *pr = *pa;
-
-   printf("%.6f,%.6fi: %.6f,%.6fi\n",
-	  T_CONV creal (*pa), T_CONV cimag (*pa),
-	  T_CONV creal (*pr), T_CONV cimag (*pr));
- }
-typedef _Complex T_C_TYPE (*cls_ret_complex)(_Complex T_C_TYPE);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[2];
-  _Complex T_C_TYPE res;
-
-  cl_arg_types[0] = &T_FFI_TYPE;
-  cl_arg_types[1] = NULL;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &T_FFI_TYPE, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_complex_fn, NULL, code)  == FFI_OK);
-
-  res = (*((cls_ret_complex)code))(0.125 + 128.0 * I);
-  printf("res: %.6f,%.6fi\n", T_CONV creal (res), T_CONV cimag (res));
-  CHECK (res == (0.125 + 128.0 * I));
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_double.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_double.c
deleted file mode 100644
index 05e3534..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_double.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check return value complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_double.inc"
-#include "cls_complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_float.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_float.c
deleted file mode 100644
index 5df7849..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_float.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check return value complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_float.inc"
-#include "cls_complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_longdouble.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_longdouble.c
deleted file mode 100644
index 2b1c320..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_longdouble.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	closure_call
-   Purpose:	Check return value complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_longdouble.inc"
-#include "cls_complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_struct.inc b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_struct.inc
deleted file mode 100644
index df8708d..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_struct.inc
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*-c-*- */
-#include "ffitest.h"
-#include <complex.h>
-
-typedef struct Cs {
-  _Complex T_C_TYPE x;
-  _Complex T_C_TYPE y;
-} Cs;
-
-Cs gc;
-
-void
-closure_test_fn(Cs p)
-{
-  printf("%.1f,%.1fi %.1f,%.1fi\n",
-	 T_CONV creal (p.x), T_CONV cimag (p.x),
-	 T_CONV creal (p.y), T_CONV cimag (p.y));
-  gc = p;
-}
-
-void
-closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
-		void** args, void* userdata __UNUSED__)
-{
-  closure_test_fn(*(Cs*)args[0]);
-}
-
-int main(int argc __UNUSED__, char** argv __UNUSED__)
-{
-  ffi_cif cif;
-
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type *cl_arg_types[1];
-
-  ffi_type ts1_type;
-  ffi_type* ts1_type_elements[4];
-
-  Cs arg = { 1.0 + 11.0 * I, 2.0 + 22.0 * I};
-
-  ts1_type.size = 0;
-  ts1_type.alignment = 0;
-  ts1_type.type = FFI_TYPE_STRUCT;
-  ts1_type.elements = ts1_type_elements;
-
-  ts1_type_elements[0] = &T_FFI_TYPE;
-  ts1_type_elements[1] = &T_FFI_TYPE;
-  ts1_type_elements[2] = NULL;
-
-  cl_arg_types[0] = &ts1_type;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &ffi_type_void, cl_arg_types) == FFI_OK);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK);
-
-  gc.x = 0.0 + 0.0 * I;
-  gc.y = 0.0 + 0.0 * I;
-  ((void*(*)(Cs))(code))(arg);
-  /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */
-  CHECK (gc.x == arg.x && gc.y == arg.y);
-
-  gc.x = 0.0 + 0.0 * I;
-  gc.y = 0.0 + 0.0 * I;
-  closure_test_fn(arg);
-  /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */
-  CHECK (gc.x == arg.x && gc.y == arg.y);
-
-  return 0;
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_struct_double.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_struct_double.c
deleted file mode 100644
index ec71346..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_struct_double.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check complex arguments in structs.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_double.inc"
-#include "cls_complex_struct.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_struct_float.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_struct_float.c
deleted file mode 100644
index 96fdf75..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_struct_float.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check complex arguments in structs.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_float.inc"
-#include "cls_complex_struct.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c
deleted file mode 100644
index 005b467..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Check complex arguments in structs.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_longdouble.inc"
-#include "cls_complex_struct.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_va.inc b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_va.inc
deleted file mode 100644
index 8a3e15f..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_va.inc
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*-c-*- */
-#include "ffitest.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <complex.h>
-
-static _Complex T_C_TYPE gComplexValue1 = 1 + 2 * I;
-static _Complex T_C_TYPE gComplexValue2 = 3 + 4 * I;
-
-static int cls_variadic(const char *format, ...)
-{
-  va_list ap;
-  _Complex T_C_TYPE p1, p2;
-
-  va_start (ap, format);
-  p1 = va_arg (ap, _Complex T_C_TYPE);
-  p2 = va_arg (ap, _Complex T_C_TYPE);
-  va_end (ap);
-
-  return printf(format, T_CONV creal (p1), T_CONV cimag (p1),
-		T_CONV creal (p2), T_CONV cimag (p2));
-}
-
-static void
-cls_complex_va_fn(ffi_cif* cif __UNUSED__, void* resp,
-		  void** args, void* userdata __UNUSED__)
-{
-  char*	format = *(char**)args[0];
-  gComplexValue1 = *(_Complex T_C_TYPE*)args[1];
-  gComplexValue2 = *(_Complex T_C_TYPE*)args[2];
-
-  *(ffi_arg*)resp =
-    printf(format,
-	   T_CONV creal (gComplexValue1), T_CONV cimag (gComplexValue1),
-	   T_CONV creal (gComplexValue2), T_CONV cimag (gComplexValue2));
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
-  void* args[4];
-  ffi_type* arg_types[4];
-  char *format = "%.1f,%.1fi %.1f,%.1fi\n";
-
-  _Complex T_C_TYPE complexArg1 = 1.0 + 22.0 *I;
-  _Complex T_C_TYPE complexArg2 = 333.0 + 4444.0 *I;
-  ffi_arg res = 0;
-
-  arg_types[0] = &ffi_type_pointer;
-  arg_types[1] = &T_FFI_TYPE;
-  arg_types[2] = &T_FFI_TYPE;
-  arg_types[3] = NULL;
-
-  /* This printf call is variadic */
-  CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint,
-			 arg_types) == FFI_OK);
-
-  args[0] = &format;
-  args[1] = &complexArg1;
-  args[2] = &complexArg2;
-  args[3] = NULL;
-
-  ffi_call(&cif, FFI_FN(cls_variadic), &res, args);
-  printf("res: %d\n", (int) res);
-  CHECK (res == 24);
-
-  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_complex_va_fn, NULL, code)
-	== FFI_OK);
-
-  res = ((int(*)(char *, ...))(code))(format, complexArg1, complexArg2);
-  CHECK (gComplexValue1 == complexArg1);
-  CHECK (gComplexValue2 == complexArg2);
-  printf("res: %d\n", (int) res);
-  CHECK (res == 24);
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_va_double.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_va_double.c
deleted file mode 100644
index 879ccf3..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_va_double.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Test complex' passed in variable argument lists.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_double.inc"
-#include "cls_complex_va.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_va_float.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_va_float.c
deleted file mode 100644
index 2b17826..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_va_float.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Test complex' passed in variable argument lists.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-/* Alpha splits _Complex into two arguments.  It's illegal to pass
-   float through varargs, so _Complex float goes badly.  In sort of
-   gets passed as _Complex double, but the compiler doesn't agree
-   with itself on this issue.  */
-/* { dg-do run { xfail alpha*-*-* } } */
-
-#include "complex_defs_float.inc"
-#include "cls_complex_va.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c
deleted file mode 100644
index 6eca965..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call, closure_call
-   Purpose:	Test complex' passed in variable argument lists.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_longdouble.inc"
-#include "cls_complex_va.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex.inc b/third_party/gofrontend/libffi/testsuite/libffi.complex/complex.inc
deleted file mode 100644
index 515ae3e..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex.inc
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*-c-*-*/
-#include "ffitest.h"
-#include <complex.h>
-
-static _Complex T_C_TYPE f_complex(_Complex T_C_TYPE c, int x, int *py)
-{
-  c = -(2 * creal (c)) + (cimag (c) + 1)* I;
-  *py += x;
-
-  return c;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-
-  _Complex T_C_TYPE tc_arg;
-  _Complex T_C_TYPE tc_result;
-  int tc_int_arg_x;
-  int tc_y;
-  int *tc_ptr_arg_y = &tc_y;
-
-  args[0] = &T_FFI_TYPE;
-  args[1] = &ffi_type_sint;
-  args[2] = &ffi_type_pointer;
-  values[0] = &tc_arg;
-  values[1] = &tc_int_arg_x;
-  values[2] = &tc_ptr_arg_y;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
-		     &T_FFI_TYPE, args) == FFI_OK);
-
-  tc_arg = 1 + 7 * I;
-  tc_int_arg_x = 1234;
-  tc_y = 9876;
-  ffi_call(&cif, FFI_FN(f_complex), &tc_result, values);
-
-  printf ("%f,%fi %f,%fi, x %d 1234, y %d 11110\n",
-	  T_CONV creal (tc_result), T_CONV cimag (tc_result),
-	  T_CONV creal (2.0), T_CONV creal (8.0), tc_int_arg_x, tc_y);
-
-  CHECK (creal (tc_result) == -2);
-  CHECK (cimag (tc_result) == 8);
-  CHECK (tc_int_arg_x == 1234);
-  CHECK (*tc_ptr_arg_y == 11110);
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_defs_double.inc b/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_defs_double.inc
deleted file mode 100644
index 3583e16..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_defs_double.inc
+++ /dev/null
@@ -1,7 +0,0 @@
-/* -*-c-*- */
-/* Complex base type.  */
-#define T_FFI_TYPE ffi_type_complex_double
-/* C type corresponding to the base type.  */
-#define T_C_TYPE double
-/* C cast for a value of type T_C_TYPE that is passed to printf.  */
-#define T_CONV
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_defs_float.inc b/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_defs_float.inc
deleted file mode 100644
index bbd9375..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_defs_float.inc
+++ /dev/null
@@ -1,7 +0,0 @@
-/* -*-c-*- */
-/* Complex base type.  */
-#define T_FFI_TYPE ffi_type_complex_float
-/* C type corresponding to the base type.  */
-#define T_C_TYPE float
-/* C cast for a value of type T_C_TYPE that is passed to printf.  */
-#define T_CONV (double)
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc b/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc
deleted file mode 100644
index 14b9f24..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc
+++ /dev/null
@@ -1,7 +0,0 @@
-/* -*-c-*- */
-/* Complex base type.  */
-#define T_FFI_TYPE ffi_type_complex_longdouble
-/* C type corresponding to the base type.  */
-#define T_C_TYPE long double
-/* C cast for a value of type T_C_TYPE that is passed to printf.  */
-#define T_CONV
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_double.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_double.c
deleted file mode 100644
index 8a3297b..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_double.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check complex types.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_double.inc"
-#include "complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_float.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_float.c
deleted file mode 100644
index 5044ebb..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_float.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check complex types.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_float.inc"
-#include "complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_int.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_int.c
deleted file mode 100644
index bac3190..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_int.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check non-standard complex types.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "ffitest.h"
-#include "ffi.h"
-#include <complex.h>
-
-_Complex int f_complex(_Complex int c, int x, int *py)
-{
-  __real__ c = -2 * __real__ c;
-  __imag__ c = __imag__ c + 1;
-  *py += x;
-  return c;
-}
-
-/*
- * This macro can be used to define new complex type descriptors
- * in a platform independent way.
- *
- * name: Name of the new descriptor is ffi_type_complex_<name>.
- * type: The C base type of the complex type.
- */
-#define FFI_COMPLEX_TYPEDEF(name, type, ffitype)	     \
-  static ffi_type *ffi_elements_complex_##name [2] = {	     \
-    (ffi_type *)(&ffitype), NULL			     \
-  };							     \
-  struct struct_align_complex_##name {			     \
-    char c;						     \
-    _Complex type x;					     \
-  };							     \
-  ffi_type ffi_type_complex_##name = {		     \
-    sizeof(_Complex type),				     \
-    offsetof(struct struct_align_complex_##name, x),	     \
-    FFI_TYPE_COMPLEX,					     \
-    (ffi_type **)ffi_elements_complex_##name		     \
-  }
-
-/* Define new complex type descriptors using the macro: */
-/* ffi_type_complex_sint */
-FFI_COMPLEX_TYPEDEF(sint, int, ffi_type_sint);
-/* ffi_type_complex_uchar */
-FFI_COMPLEX_TYPEDEF(uchar, unsigned char, ffi_type_uint8);
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-
-  _Complex int tc_arg;
-  _Complex int tc_result;
-  int tc_int_arg_x;
-  int tc_y;
-  int *tc_ptr_arg_y = &tc_y;
-
-  args[0] = &ffi_type_complex_sint;
-  args[1] = &ffi_type_sint;
-  args[2] = &ffi_type_pointer;
-  values[0] = &tc_arg;
-  values[1] = &tc_int_arg_x;
-  values[2] = &tc_ptr_arg_y;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &ffi_type_complex_sint, args)
-	== FFI_OK);
-
-  tc_arg = 1 + 7 * I;
-  tc_int_arg_x = 1234;
-  tc_y = 9876;
-  ffi_call(&cif, FFI_FN(f_complex), &tc_result, values);
-
-  printf ("%d,%di %d,%di, x %d 1234, y %d 11110\n",
-	  (int)tc_result, (int)(tc_result * -I), 2, 8, tc_int_arg_x, tc_y);
-  /* dg-output "-2,8i 2,8i, x 1234 1234, y 11110 11110" */
-  CHECK (creal (tc_result) == -2);
-  CHECK (cimag (tc_result) == 8);
-  CHECK (tc_int_arg_x == 1234);
-  CHECK (*tc_ptr_arg_y == 11110);
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_longdouble.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_longdouble.c
deleted file mode 100644
index 7e78366..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/complex_longdouble.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check complex types.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_longdouble.inc"
-#include "complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/ffitest.h b/third_party/gofrontend/libffi/testsuite/libffi.complex/ffitest.h
deleted file mode 100644
index d27d362..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/ffitest.h
+++ /dev/null
@@ -1 +0,0 @@
-#include "../libffi.call/ffitest.h"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/many_complex.inc b/third_party/gofrontend/libffi/testsuite/libffi.complex/many_complex.inc
deleted file mode 100644
index e37a774..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/many_complex.inc
+++ /dev/null
@@ -1,78 +0,0 @@
-/* -*-c-*- */
-#include "ffitest.h"
-
-#include <stdlib.h>
-#include <complex.h>
-
-static _Complex T_C_TYPE many(_Complex T_C_TYPE c1,
-			      _Complex T_C_TYPE c2,
-			      _Complex T_C_TYPE c3,
-			      _Complex T_C_TYPE c4,
-			      _Complex T_C_TYPE c5,
-			      _Complex T_C_TYPE c6,
-			      _Complex T_C_TYPE c7,
-			      _Complex T_C_TYPE c8,
-			      _Complex T_C_TYPE c9,
-			      _Complex T_C_TYPE c10,
-			      _Complex T_C_TYPE c11,
-			      _Complex T_C_TYPE c12,
-			      _Complex T_C_TYPE c13)
-{
-  printf("0 :%f,%fi\n"
-	 "1 :%f,%fi\n"
-	 "2 :%f,%fi\n"
-	 "3 :%f,%fi\n"
-	 "4 :%f,%fi\n"
-	 "5 :%f,%fi\n"
-	 "6 :%f,%fi\n"
-	 "7 :%f,%fi\n"
-	 "8 :%f,%fi\n"
-	 "9 :%f,%fi\n"
-	 "10:%f,%fi\n"
-	 "11:%f,%fi\n"
-	 "12:%f,%fi\n",
-	 T_CONV creal (c1), T_CONV cimag (c1),
-	 T_CONV creal (c2), T_CONV cimag (c2),
-	 T_CONV creal (c3), T_CONV cimag (c3),
-	 T_CONV creal (c4), T_CONV cimag (c4),
-	 T_CONV creal (c5), T_CONV cimag (c5),
-	 T_CONV creal (c6), T_CONV cimag (c6),
-	 T_CONV creal (c7), T_CONV cimag (c7),
-	 T_CONV creal (c8), T_CONV cimag (c8),
-	 T_CONV creal (c9), T_CONV cimag (c9),
-	 T_CONV creal (c10), T_CONV cimag (c10),
-	 T_CONV creal (c11), T_CONV cimag (c11),
-	 T_CONV creal (c12), T_CONV cimag (c12),
-	 T_CONV creal (c13), T_CONV cimag (c13));
-
-  return (c1+c2-c3-c4+c5+c6+c7-c8-c9-c10-c11+c12+c13);
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[13];
-  void *values[13];
-  _Complex T_C_TYPE ca[13];
-  _Complex T_C_TYPE c, cc;
-  int i;
-
-  for (i = 0; i < 13; i++)
-    {
-      args[i] = &T_FFI_TYPE;
-      values[i] = &ca[i];
-      ca[i] = i + (-20 - i) * I;
-    }
-
-    /* Initialize the cif */
-    CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, &T_FFI_TYPE, args) == FFI_OK);
-
-    ffi_call(&cif, FFI_FN(many), &c, values);
-
-    cc =  many(ca[0], ca[1], ca[2], ca[3], ca[4], ca[5], ca[6], ca[7], ca[8],
-	       ca[9], ca[10], ca[11], ca[12]);
-    CHECK(creal (cc) == creal (c));
-    CHECK(cimag (cc) == cimag (c));
-
-    exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/many_complex_double.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/many_complex_double.c
deleted file mode 100644
index 3fd53c3..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/many_complex_double.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value complex, with many arguments
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_double.inc"
-#include "many_complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/many_complex_float.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/many_complex_float.c
deleted file mode 100644
index c43d21c..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/many_complex_float.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value complex, with many arguments
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_float.inc"
-#include "many_complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/many_complex_longdouble.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/many_complex_longdouble.c
deleted file mode 100644
index dbab723..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/many_complex_longdouble.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value complex, with many arguments
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_longdouble.inc"
-#include "many_complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex.inc b/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex.inc
deleted file mode 100644
index 8bf0c1f..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex.inc
+++ /dev/null
@@ -1,37 +0,0 @@
-/* -*-c-*- */
-#include "ffitest.h"
-#include <complex.h>
-
-static _Complex T_C_TYPE return_c(_Complex T_C_TYPE c)
-{
-  printf ("%f,%fi\n", T_CONV creal (c), T_CONV cimag (c));
-  return 2 * c;
-}
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  _Complex T_C_TYPE c, rc, rc2;
-  T_C_TYPE cr, ci;
-
-  args[0] = &T_FFI_TYPE;
-  values[0] = &c;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
-		     &T_FFI_TYPE, args) == FFI_OK);
-
-  for (cr = -127.0; cr <  127; cr++)
-    {
-      ci = 1000.0 - cr;
-      c = cr + ci * I;
-      ffi_call(&cif, FFI_FN(return_c), &rc, values);
-      rc2 = return_c(c);
-      printf ("%f,%fi vs %f,%fi\n",
-	      T_CONV creal (rc), T_CONV cimag (rc),
-	      T_CONV creal (rc2), T_CONV cimag (rc2));
-      CHECK(rc == 2 * c);
-    }
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex1.inc b/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex1.inc
deleted file mode 100644
index 7cecc0f..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex1.inc
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*-c-*- */
-#include "ffitest.h"
-#include <complex.h>
-
-static _Complex T_C_TYPE return_c(_Complex T_C_TYPE c1, float fl2, unsigned int in3, _Complex T_C_TYPE c4)
-{
-  return c1 + fl2 + in3 + c4;
-}
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  _Complex T_C_TYPE c1, c4, rc, rc2;
-  float fl2;
-  unsigned int in3;
-  args[0] = &T_FFI_TYPE;
-  args[1] = &ffi_type_float;
-  args[2] = &ffi_type_uint;
-  args[3] = &T_FFI_TYPE;
-  values[0] = &c1;
-  values[1] = &fl2;
-  values[2] = &in3;
-  values[3] = &c4;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
-		     &T_FFI_TYPE, args) == FFI_OK);
-  c1 = 127.0 + 255.0 * I;
-  fl2 = 128.0;
-  in3 = 255;
-  c4 = 512.7 + 1024.1 * I;
-
-  ffi_call(&cif, FFI_FN(return_c), &rc, values);
-  rc2 = return_c(c1, fl2, in3, c4);
-  printf ("%f,%fi vs %f,%fi\n",
-	  T_CONV creal (rc), T_CONV cimag (rc),
-	  T_CONV creal (rc2), T_CONV cimag (rc2));
-  CHECK(rc == rc2);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex1_double.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex1_double.c
deleted file mode 100644
index 727410d..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex1_double.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_double.inc"
-#include "return_complex1.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex1_float.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex1_float.c
deleted file mode 100644
index a2aeada..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex1_float.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_float.inc"
-#include "return_complex1.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex1_longdouble.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex1_longdouble.c
deleted file mode 100644
index 103504b..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex1_longdouble.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_longdouble.inc"
-#include "return_complex1.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex2.inc b/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex2.inc
deleted file mode 100644
index 265170b..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex2.inc
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*-c-*- */
-#include "ffitest.h"
-#include <complex.h>
-
-_Complex T_C_TYPE
-return_c(_Complex T_C_TYPE c1, _Complex T_C_TYPE c2,
-	 unsigned int in3, _Complex T_C_TYPE c4)
-{
-  volatile _Complex T_C_TYPE r = c1 + c2 + in3 + c4;
-  return r;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  _Complex T_C_TYPE c1, c2, c4, rc, rc2;
-  unsigned int in3;
-  args[0] = &T_FFI_TYPE;
-  args[1] = &T_FFI_TYPE;
-  args[2] = &ffi_type_uint;
-  args[3] = &T_FFI_TYPE;
-  values[0] = &c1;
-  values[1] = &c2;
-  values[2] = &in3;
-  values[3] = &c4;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
-		     &T_FFI_TYPE, args) == FFI_OK);
-  c1 = 127.0 + 255.0 * I;
-  c2 = 128.0 + 256.0;
-  in3 = 255;
-  c4 = 512.7 + 1024.1 * I;
-
-  ffi_call(&cif, FFI_FN(return_c), &rc, values);
-  rc2 = return_c(c1, c2, in3, c4);
-  printf ("%f,%fi vs %f,%fi\n",
-	  T_CONV creal (rc), T_CONV cimag (rc),
-	  T_CONV creal (rc2), T_CONV cimag (rc2));
-  CHECK(rc == rc2);
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex2_double.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex2_double.c
deleted file mode 100644
index ab9efac..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex2_double.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_double.inc"
-#include "return_complex2.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex2_float.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex2_float.c
deleted file mode 100644
index d7f22c2..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex2_float.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_float.inc"
-#include "return_complex2.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex2_longdouble.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex2_longdouble.c
deleted file mode 100644
index 3edea62..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex2_longdouble.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_longdouble.inc"
-#include "return_complex2.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex_double.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex_double.c
deleted file mode 100644
index e2497cc..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex_double.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_double.inc"
-#include "return_complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex_float.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex_float.c
deleted file mode 100644
index a35528f..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex_float.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_float.inc"
-#include "return_complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex_longdouble.c b/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex_longdouble.c
deleted file mode 100644
index 142d7be..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.complex/return_complex_longdouble.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Area:	ffi_call
-   Purpose:	Check return value complex.
-   Limitations:	none.
-   PR:		none.
-   Originator:	<vogt@linux.vnet.ibm.com>.  */
-
-/* { dg-do run } */
-
-#include "complex_defs_longdouble.inc"
-#include "return_complex.inc"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.go/aa-direct.c b/third_party/gofrontend/libffi/testsuite/libffi.go/aa-direct.c
deleted file mode 100644
index b00c404..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.go/aa-direct.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* { dg-do run } */
-
-#include "static-chain.h"
-
-#if defined(__GNUC__) && !defined(__clang__) && defined(STATIC_CHAIN_REG)
-
-#include "ffitest.h"
-
-/* Blatent assumption here that the prologue doesn't clobber the
-   static chain for trivial functions.  If this is not true, don't
-   define STATIC_CHAIN_REG, and we'll test what we can via other tests.  */
-void *doit(void)
-{
-  register void *chain __asm__(STATIC_CHAIN_REG);
-  return chain;
-}
-
-int main()
-{
-  ffi_cif cif;
-  void *result;
-
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 0, &ffi_type_pointer, NULL) == FFI_OK);
-
-  ffi_call_go(&cif, FFI_FN(doit), &result, NULL, &result);
-
-  CHECK(result == &result);
-
-  return 0;
-}
-
-#else /* UNSUPPORTED */
-int main() { return 0; }
-#endif
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.go/closure1.c b/third_party/gofrontend/libffi/testsuite/libffi.go/closure1.c
deleted file mode 100644
index 7b34afc..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.go/closure1.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* { dg-do run } */
-
-#include "ffitest.h"
-
-void doit(ffi_cif *cif, void *rvalue, void **avalue, void *closure)
-{
-  (void)cif;
-  (void)avalue;
-  *(void **)rvalue = closure;
-}
-
-typedef void * (*FN)(void);
-
-int main()
-{
-  ffi_cif cif;
-  ffi_go_closure cl;
-  void *result;
-
-  CHECK(ffi_prep_cif(&cif, ABI_NUM, 0, &ffi_type_pointer, NULL) == FFI_OK);
-  CHECK(ffi_prep_go_closure(&cl, &cif, doit) == FFI_OK);
-
-  ffi_call_go(&cif, FFI_FN(*(FN *)&cl), &result, NULL, &cl);
-
-  CHECK(result == &cl);
-
-  exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.go/ffitest.h b/third_party/gofrontend/libffi/testsuite/libffi.go/ffitest.h
deleted file mode 100644
index d27d362..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.go/ffitest.h
+++ /dev/null
@@ -1 +0,0 @@
-#include "../libffi.call/ffitest.h"
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.go/static-chain.h b/third_party/gofrontend/libffi/testsuite/libffi.go/static-chain.h
deleted file mode 100644
index 3675b40..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.go/static-chain.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifdef __aarch64__
-# define STATIC_CHAIN_REG  "x18"
-#elif defined(__alpha__)
-# define STATIC_CHAIN_REG  "$1"
-#elif defined(__arm__)
-# define STATIC_CHAIN_REG  "ip"
-#elif defined(__sparc__)
-# if defined(__arch64__) || defined(__sparcv9)
-#  define STATIC_CHAIN_REG "g5"
-# else
-#  define STATIC_CHAIN_REG "g2"
-# endif
-#elif defined(__x86_64__)
-# define STATIC_CHAIN_REG  "r10"
-#elif defined(__i386__)
-# ifndef ABI_NUM
-#  define STATIC_CHAIN_REG  "ecx"	/* FFI_DEFAULT_ABI only */
-# endif
-#endif
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.special/ffitestcxx.h b/third_party/gofrontend/libffi/testsuite/libffi.special/ffitestcxx.h
deleted file mode 100644
index 83f5442..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.special/ffitestcxx.h
+++ /dev/null
@@ -1,96 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <ffi.h>
-#include "fficonfig.h"
-
-#define MAX_ARGS 256
-
-
-/* Define __UNUSED__ that also other compilers than gcc can run the tests.  */
-#undef __UNUSED__
-#if defined(__GNUC__)
-#define __UNUSED__ __attribute__((__unused__))
-#else
-#define __UNUSED__
-#endif
-
-#define CHECK(x) (!(x) ? abort() : (void)0)
-
-/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
-   file open.  */
-#ifdef HAVE_MMAP_ANON
-# undef HAVE_MMAP_DEV_ZERO
-
-# include <sys/mman.h>
-# ifndef MAP_FAILED
-#  define MAP_FAILED -1
-# endif
-# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
-#  define MAP_ANONYMOUS MAP_ANON
-# endif
-# define USING_MMAP
-
-#endif
-
-#ifdef HAVE_MMAP_DEV_ZERO
-
-# include <sys/mman.h>
-# ifndef MAP_FAILED
-#  define MAP_FAILED -1
-# endif
-# define USING_MMAP
-
-#endif
-
-
-/* MinGW kludge.  */
-#ifdef _WIN64
-#define PRIdLL "I64d"
-#define PRIuLL "I64u"
-#else
-#define PRIdLL "lld"
-#define PRIuLL "llu"
-#endif
-
-#ifdef USING_MMAP
-static inline void *
-allocate_mmap (size_t size)
-{
-  void *page;
-#if defined (HAVE_MMAP_DEV_ZERO)
-  static int dev_zero_fd = -1;
-#endif
-
-#ifdef HAVE_MMAP_DEV_ZERO
-  if (dev_zero_fd == -1)
-    {
-      dev_zero_fd = open ("/dev/zero", O_RDONLY);
-      if (dev_zero_fd == -1)
-	{
-	  perror ("open /dev/zero: %m");
-	  exit (1);
-	}
-    }
-#endif
-
-
-#ifdef HAVE_MMAP_ANON
-  page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
-	       MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-#endif
-#ifdef HAVE_MMAP_DEV_ZERO
-  page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
-	       MAP_PRIVATE, dev_zero_fd, 0);
-#endif
-
-  if (page == (char *) MAP_FAILED)
-    {
-      perror ("virtual memory exhausted");
-      exit (1);
-    }
-
-  return page;
-}
-
-#endif
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.special/unwindtest.cc b/third_party/gofrontend/libffi/testsuite/libffi.special/unwindtest.cc
deleted file mode 100644
index d7ffd4a..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.special/unwindtest.cc
+++ /dev/null
@@ -1,124 +0,0 @@
-/* Area:	ffi_closure, unwind info
-   Purpose:	Check if the unwind information is passed correctly.
-   Limitations:	none.
-   PR:		none.
-   Originator:	Jeff Sturm <jsturm@one-point.com>  */
-
-/* { dg-do run } */
-#include "ffitestcxx.h"
-
-#if defined HAVE_STDINT_H
-#include <stdint.h>
-#endif
-
-#if defined HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
-void
-closure_test_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
-		void** args __UNUSED__, void* userdata __UNUSED__)
-{
-  throw 9;
-}
-
-typedef void (*closure_test_type)();
-
-void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp,
-		      void** args, void* userdata __UNUSED__)
- {
-    *(ffi_arg*)resp =
-      (int)*(float *)args[0] +(int)(*(float *)args[1]) +
-      (int)(*(float *)args[2]) + (int)*(float *)args[3] +
-      (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) +
-      (int)*(float *)args[6] + (int)(*(int *)args[7]) +
-      (int)(*(double*)args[8]) + (int)*(int *)args[9] +
-      (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
-      (int)*(int *)args[12] + (int)(*(int *)args[13]) +
-      (int)(*(int *)args[14]) + *(int *)args[15] + (int)(intptr_t)userdata;
-
-    printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
-	   (int)*(float *)args[0], (int)(*(float *)args[1]),
-	   (int)(*(float *)args[2]), (int)*(float *)args[3],
-	   (int)(*(signed short *)args[4]), (int)(*(float *)args[5]),
-	   (int)*(float *)args[6], (int)(*(int *)args[7]),
-	   (int)(*(double *)args[8]), (int)*(int *)args[9],
-	   (int)(*(int *)args[10]), (int)(*(float *)args[11]),
-	   (int)*(int *)args[12], (int)(*(int *)args[13]),
-	   (int)(*(int *)args[14]), *(int *)args[15],
-	   (int)(intptr_t)userdata, (int)*(ffi_arg*)resp);
-
-    throw (int)*(ffi_arg*)resp;
-}
-
-typedef int (*closure_test_type1)(float, float, float, float, signed short,
-				  float, float, int, double, int, int, float,
-				  int, int, int, int);
-
-int main (void)
-{
-  ffi_cif cif;
-  void *code;
-  ffi_closure *pcl = (ffi_closure *)ffi_closure_alloc(sizeof(ffi_closure), &code);
-  ffi_type * cl_arg_types[17];
-
-  {
-    cl_arg_types[1] = NULL;
-
-    CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0,
-		       &ffi_type_void, cl_arg_types) == FFI_OK);
-    CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn, NULL, code) == FFI_OK);
-
-    try
-      {
-	(*((closure_test_type)(code)))();
-      } catch (int exception_code)
-      {
-	CHECK(exception_code == 9);
-      }
-
-    printf("part one OK\n");
-    /* { dg-output "part one OK" } */
-    }
-
-    {
-
-      cl_arg_types[0] = &ffi_type_float;
-      cl_arg_types[1] = &ffi_type_float;
-      cl_arg_types[2] = &ffi_type_float;
-      cl_arg_types[3] = &ffi_type_float;
-      cl_arg_types[4] = &ffi_type_sshort;
-      cl_arg_types[5] = &ffi_type_float;
-      cl_arg_types[6] = &ffi_type_float;
-      cl_arg_types[7] = &ffi_type_uint;
-      cl_arg_types[8] = &ffi_type_double;
-      cl_arg_types[9] = &ffi_type_uint;
-      cl_arg_types[10] = &ffi_type_uint;
-      cl_arg_types[11] = &ffi_type_float;
-      cl_arg_types[12] = &ffi_type_uint;
-      cl_arg_types[13] = &ffi_type_uint;
-      cl_arg_types[14] = &ffi_type_uint;
-      cl_arg_types[15] = &ffi_type_uint;
-      cl_arg_types[16] = NULL;
-
-      /* Initialize the cif */
-      CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
-			 &ffi_type_sint, cl_arg_types) == FFI_OK);
-
-      CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1,
-                                 (void *) 3 /* userdata */, code)  == FFI_OK);
-      try
-	{
-	  (*((closure_test_type1)code))
-	    (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13,
-	     19, 21, 1);
-	  /* { dg-output "\n1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */
-	} catch (int exception_code)
-	{
-	  CHECK(exception_code == 255);
-	}
-      printf("part two OK\n");
-      /* { dg-output "\npart two OK" } */
-    }
-    exit(0);
-}
diff --git a/third_party/gofrontend/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc b/third_party/gofrontend/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc
deleted file mode 100644
index 29739cd..0000000
--- a/third_party/gofrontend/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Area:	ffi_call, unwind info
-   Purpose:	Check if the unwind information is passed correctly.
-   Limitations:	none.
-   PR:		none.
-   Originator:	Andreas Tobler <andreast@gcc.gnu.org> 20061213  */
-
-/* { dg-do run } */
-#include "ffitestcxx.h"
-
-static int checking(int a __UNUSED__, short b __UNUSED__,
-		    signed char c __UNUSED__)
-{
-  throw 9;
-}
-
-int main (void)
-{
-  ffi_cif cif;
-  ffi_type *args[MAX_ARGS];
-  void *values[MAX_ARGS];
-  ffi_arg rint;
-
-  signed int si;
-  signed short ss;
-  signed char sc;
-
-  args[0] = &ffi_type_sint;
-  values[0] = &si;
-  args[1] = &ffi_type_sshort;
-  values[1] = &ss;
-  args[2] = &ffi_type_schar;
-  values[2] = &sc;
-
-  /* Initialize the cif */
-  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
-		     &ffi_type_sint, args) == FFI_OK);
-
-  si = -6;
-  ss = -12;
-  sc = -1;
-  {
-    try
-      {
-	ffi_call(&cif, FFI_FN(checking), &rint, values);
-      } catch (int exception_code)
-      {
-	CHECK(exception_code == 9);
-      }
-    printf("part one OK\n");
-    /* { dg-output "part one OK" } */
-  }
-  exit(0);
-}
diff --git a/third_party/gofrontend/libgcc/unwind-pe.h b/third_party/gofrontend/libgcc/unwind-pe.h
deleted file mode 100644
index 8655a92..0000000
--- a/third_party/gofrontend/libgcc/unwind-pe.h
+++ /dev/null
@@ -1,200 +0,0 @@
-//===----------------------------- unwind-pe.h ----------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-// Pointer-Encoding decoder. Derived from:
-//   - libcxxabi/src/Unwind/dwarf2.h
-//   - libcxxabi/src/Unwind/AddressSpace.h
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef UNWIND_PE_H
-#define UNWIND_PE_H
-
-#include <assert.h>
-#include <stdint.h>
-#include <string.h>
-
-// FSF exception handling Pointer-Encoding constants
-// Used in CFI augmentation by GCC
-enum {
-  DW_EH_PE_ptr       = 0x00,
-  DW_EH_PE_uleb128   = 0x01,
-  DW_EH_PE_udata2    = 0x02,
-  DW_EH_PE_udata4    = 0x03,
-  DW_EH_PE_udata8    = 0x04,
-  DW_EH_PE_signed    = 0x08,
-  DW_EH_PE_sleb128   = 0x09,
-  DW_EH_PE_sdata2    = 0x0A,
-  DW_EH_PE_sdata4    = 0x0B,
-  DW_EH_PE_sdata8    = 0x0C,
-  DW_EH_PE_absptr    = 0x00,
-  DW_EH_PE_pcrel     = 0x10,
-  DW_EH_PE_textrel   = 0x20,
-  DW_EH_PE_datarel   = 0x30,
-  DW_EH_PE_funcrel   = 0x40,
-  DW_EH_PE_aligned   = 0x50,
-  DW_EH_PE_indirect  = 0x80,
-  DW_EH_PE_omit      = 0xFF
-};
-
-/// Read a ULEB128 into a 64-bit word.
-static uint64_t unw_getULEB128(uintptr_t *addr) {
-  const uint8_t *p = (uint8_t *)*addr;
-  uint64_t result = 0;
-  int bit = 0;
-  do {
-    uint64_t b;
-
-    b = *p & 0x7f;
-
-    if (bit >= 64 || b << bit >> bit != b) {
-      assert(!"malformed uleb128 expression");
-    } else {
-      result |= b << bit;
-      bit += 7;
-    }
-  } while (*p++ >= 0x80);
-  *addr = (uintptr_t) p;
-  return result;
-}
-
-/// Read a SLEB128 into a 64-bit word.
-static int64_t unw_getSLEB128(uintptr_t *addr) {
-  const uint8_t *p = (uint8_t *)addr;
-  int64_t result = 0;
-  int bit = 0;
-  uint8_t byte;
-  do {
-    byte = *p++;
-    result |= ((byte & 0x7f) << bit);
-    bit += 7;
-  } while (byte & 0x80);
-  // sign extend negative numbers
-  if ((byte & 0x40) != 0)
-    result |= (-1LL) << bit;
-  *addr = (uintptr_t) p;
-  return result;
-}
-
-static uint16_t unw_get16(uintptr_t addr) {
-  uint16_t val;
-  memcpy(&val, (void *)addr, sizeof(val));
-  return val;
-}
-
-static uint32_t unw_get32(uintptr_t addr) {
-  uint32_t val;
-  memcpy(&val, (void *)addr, sizeof(val));
-  return val;
-}
-
-static uint64_t unw_get64(uintptr_t addr) {
-  uint64_t val;
-  memcpy(&val, (void *)addr, sizeof(val));
-  return val;
-}
-
-static uintptr_t unw_getP(uintptr_t addr) {
-  if (sizeof(uintptr_t) == 8)
-    return unw_get64(addr);
-  else
-    return unw_get32(addr);
-}
-
-static const unsigned char *read_uleb128(const unsigned char *p,
-                                         _uleb128_t *ret) {
-  uintptr_t addr = (uintptr_t)p;
-  *ret = unw_getULEB128(&addr);
-  return (unsigned char *)addr;
-}
-
-static const unsigned char *read_encoded_value(struct _Unwind_Context *ctx,
-                                               unsigned char encoding,
-                                               const unsigned char *p,
-                                               _Unwind_Ptr *ret) {
-  uintptr_t addr = (uintptr_t)p;
-  uintptr_t startAddr = addr;
-  uintptr_t result;
-
-  (void)ctx;
-
-  // first get value
-  switch (encoding & 0x0F) {
-  case DW_EH_PE_ptr:
-    result = unw_getP(addr);
-    p += sizeof(uintptr_t);
-    break;
-  case DW_EH_PE_uleb128:
-    result = (uintptr_t)unw_getULEB128(&addr);
-    p = (const unsigned char *)addr;
-    break;
-  case DW_EH_PE_udata2:
-    result = unw_get16(addr);
-    p += 2;
-    break;
-  case DW_EH_PE_udata4:
-    result = unw_get32(addr);
-    p += 4;
-    break;
-  case DW_EH_PE_udata8:
-    result = (uintptr_t)unw_get64(addr);
-    p += 8;
-    break;
-  case DW_EH_PE_sleb128:
-    result = (uintptr_t)unw_getSLEB128(&addr);
-    p = (const unsigned char *)addr;
-    break;
-  case DW_EH_PE_sdata2:
-    // Sign extend from signed 16-bit value.
-    result = (uintptr_t)(int16_t)unw_get16(addr);
-    p += 2;
-    break;
-  case DW_EH_PE_sdata4:
-    // Sign extend from signed 32-bit value.
-    result = (uintptr_t)(int32_t)unw_get32(addr);
-    p += 4;
-    break;
-  case DW_EH_PE_sdata8:
-    result = (uintptr_t)unw_get64(addr);
-    p += 8;
-    break;
-  default:
-    assert(!"unknown pointer encoding");
-  }
-
-  // then add relative offset
-  switch (encoding & 0x70) {
-  case DW_EH_PE_absptr:
-    // do nothing
-    break;
-  case DW_EH_PE_pcrel:
-    result += startAddr;
-    break;
-  case DW_EH_PE_textrel:
-    assert(!"DW_EH_PE_textrel pointer encoding not supported");
-    break;
-  case DW_EH_PE_datarel:
-    assert(!"DW_EH_PE_datarel pointer encoding not supported");
-    break;
-  case DW_EH_PE_funcrel:
-    assert(!"DW_EH_PE_funcrel pointer encoding not supported");
-    break;
-  case DW_EH_PE_aligned:
-    assert(!"DW_EH_PE_aligned pointer encoding not supported");
-    break;
-  default:
-    assert(!"unknown pointer encoding");
-    break;
-  }
-
-  if (encoding & DW_EH_PE_indirect)
-    result = unw_getP(result);
-
-  *ret = result;
-  return p;
-}
-
-#endif  // UNWIND_PE_H
diff --git a/third_party/gofrontend/libgo/LICENSE b/third_party/gofrontend/libgo/LICENSE
deleted file mode 100644
index 6a66aea..0000000
--- a/third_party/gofrontend/libgo/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-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.
diff --git a/third_party/gofrontend/libgo/MERGE b/third_party/gofrontend/libgo/MERGE
deleted file mode 100644
index ea32fc1..0000000
--- a/third_party/gofrontend/libgo/MERGE
+++ /dev/null
@@ -1,4 +0,0 @@
-f2e4c8b5fb3660d793b2c545ef207153db0a34b1
-
-The first line of this file holds the git revision number of the
-last merge done from the master library sources.
diff --git a/third_party/gofrontend/libgo/Makefile.am b/third_party/gofrontend/libgo/Makefile.am
deleted file mode 100644
index 9080a29..0000000
--- a/third_party/gofrontend/libgo/Makefile.am
+++ /dev/null
@@ -1,4372 +0,0 @@
-# Makefile.am -- Go library Makefile.
-
-# Copyright 2009 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# Process this file with autoreconf to produce Makefile.in.
-
-# Go support.
-SUFFIXES = .c .go .gox .o .obj .lo .a
-
-if LIBGO_IS_RTEMS
-subdirs = testsuite
-endif
-
-SUBDIRS = ${subdirs}
-
-gcc_version := $(shell $(GOC) -dumpversion)
-
-MAINT_CHARSET = latin1
-
-mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
-PWD_COMMAND = $${PWDCMD-pwd}
-STAMP = echo timestamp >
-
-toolexecdir = $(glibgo_toolexecdir)
-toolexeclibdir = $(glibgo_toolexeclibdir)
-toolexeclibgodir = $(nover_glibgo_toolexeclibdir)/go/$(gcc_version)/$(target_alias)
-libexecsubdir = $(libexecdir)/gcc/$(target_alias)/$(gcc_version)
-
-LIBFFI = @LIBFFI@
-LIBFFIINCS = @LIBFFIINCS@
-
-LIBATOMIC = @LIBATOMIC@
-
-WARN_CFLAGS = $(WARN_FLAGS) $(WERROR)
-
-# -I/-D flags to pass when compiling.
-AM_CPPFLAGS = -I $(srcdir)/runtime $(LIBFFIINCS) $(PTHREAD_CFLAGS)
-
-ACLOCAL_AMFLAGS = -I ./config -I ../config
-
-AM_CFLAGS = -fexceptions -fnon-call-exceptions -fplan9-extensions \
-	$(SPLIT_STACK) $(WARN_CFLAGS) \
-	$(STRINGOPS_FLAG) $(OSCFLAGS) \
-	-I $(srcdir)/../libgcc -I $(srcdir)/../libbacktrace \
-	-I $(MULTIBUILDTOP)../../gcc/include
-
-if USING_SPLIT_STACK
-AM_LDFLAGS = -XCClinker $(SPLIT_STACK)
-endif
-
-# Multilib support.
-MAKEOVERRIDES=
-
-# Work around what appears to be a GNU make  handling MAKEFLAGS
-# values defined in terms of make variables, as is the case for CC and
-# friends when we are called from the top level Makefile.
-AM_MAKEFLAGS = \
-	"AR_FLAGS=$(AR_FLAGS)" \
-	"CC_FOR_BUILD=$(CC_FOR_BUILD)" \
-	"CC_FOR_TARGET=$(CC_FOR_TARGET)" \
-	"CFLAGS=$(CFLAGS)" \
-	"CXXFLAGS=$(CXXFLAGS)" \
-	"CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
-	"CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
-	"GOC_FOR_TARGET=$(GOC_FOR_TARGET)" \
-	"GOC=$(GOC)" \
-	"GOCFLAGS=$(GOCFLAGS)" \
-	"INSTALL=$(INSTALL)" \
-	"INSTALL_DATA=$(INSTALL_DATA)" \
-	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
-	"INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
-	"LDFLAGS=$(LDFLAGS)" \
-	"LIBCFLAGS=$(LIBCFLAGS)" \
-	"LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
-	"MAKE=$(MAKE)" \
-	"MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
-	"PICFLAG=$(PICFLAG)" \
-	"PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
-	"SHELL=$(SHELL)" \
-	"RUNTESTFLAGS=$(RUNTESTFLAGS)" \
-	"exec_prefix=$(exec_prefix)" \
-	"infodir=$(infodir)" \
-	"libdir=$(libdir)" \
-	"includedir=$(includedir)" \
-	"prefix=$(prefix)" \
-	"tooldir=$(tooldir)" \
-	"gxx_include_dir=$(gxx_include_dir)" \
-	"AR=$(AR)" \
-	"AS=$(AS)" \
-	"LD=$(LD)" \
-	"RANLIB=$(RANLIB)" \
-	"NM=$(NM)" \
-	"NM_FOR_BUILD=$(NM_FOR_BUILD)" \
-	"NM_FOR_TARGET=$(NM_FOR_TARGET)" \
-	"DESTDIR=$(DESTDIR)" \
-	"WERROR=$(WERROR)"
-
-# Subdir rules rely on $(FLAGS_TO_PASS)
-FLAGS_TO_PASS = $(AM_MAKEFLAGS)
-
-if GOC_IS_LLGO
-toolexeclib_LTLIBRARIES = libgo-llgo.la
-toolexeclib_LIBRARIES = libgobegin-llgo.a
-else
-toolexeclib_LTLIBRARIES = libgo.la
-toolexeclib_LIBRARIES = libgobegin.a libgolibbegin.a libnetgo.a
-endif
-
-toolexeclibgo_DATA = \
-	bufio.gox \
-	bytes.gox \
-	crypto.gox \
-	encoding.gox \
-	errors.gox \
-	expvar.gox \
-	flag.gox \
-	fmt.gox \
-	hash.gox \
-	html.gox \
-	image.gox \
-	io.gox \
-	log.gox \
-	math.gox \
-	mime.gox \
-	net.gox \
-	os.gox \
-	path.gox \
-	reflect.gox \
-	regexp.gox \
-	runtime.gox \
-	sort.gox \
-	strconv.gox \
-	strings.gox \
-	sync.gox \
-	syscall.gox \
-	testing.gox \
-	time.gox \
-	unicode.gox
-
-toolexeclibgoarchivedir = $(toolexeclibgodir)/archive
-
-toolexeclibgoarchive_DATA = \
-	archive/tar.gox \
-	archive/zip.gox
-
-toolexeclibgocompressdir = $(toolexeclibgodir)/compress
-
-toolexeclibgocompress_DATA = \
-	compress/bzip2.gox \
-	compress/flate.gox \
-	compress/gzip.gox \
-	compress/lzw.gox \
-	compress/zlib.gox
-
-toolexeclibgocontainerdir = $(toolexeclibgodir)/container
-
-toolexeclibgocontainer_DATA = \
-	container/heap.gox \
-	container/list.gox \
-	container/ring.gox
-
-toolexeclibgocryptodir = $(toolexeclibgodir)/crypto
-
-toolexeclibgocrypto_DATA = \
-	crypto/aes.gox \
-	crypto/cipher.gox \
-	crypto/des.gox \
-	crypto/dsa.gox \
-	crypto/ecdsa.gox \
-	crypto/elliptic.gox \
-	crypto/hmac.gox \
-	crypto/md5.gox \
-	crypto/rand.gox \
-	crypto/rc4.gox \
-	crypto/rsa.gox \
-	crypto/sha1.gox \
-	crypto/sha256.gox \
-	crypto/sha512.gox \
-	crypto/subtle.gox \
-	crypto/tls.gox \
-	crypto/x509.gox
-
-toolexeclibgocryptox509dir = $(toolexeclibgocryptodir)/x509
-
-toolexeclibgocryptox509_DATA = \
-	crypto/x509/pkix.gox
-
-toolexeclibgodatabasedir = $(toolexeclibgodir)/database
-
-toolexeclibgodatabase_DATA = \
-	database/sql.gox
-
-toolexeclibgodatabasesqldir = $(toolexeclibgodatabasedir)/sql
-
-toolexeclibgodatabasesql_DATA = \
-	database/sql/driver.gox
-
-toolexeclibgodebugdir = $(toolexeclibgodir)/debug
-
-toolexeclibgodebug_DATA = \
-	debug/dwarf.gox \
-	debug/elf.gox \
-	debug/gosym.gox \
-	debug/macho.gox \
-	debug/pe.gox \
-	debug/plan9obj.gox
-
-toolexeclibgoencodingdir = $(toolexeclibgodir)/encoding
-
-toolexeclibgoencoding_DATA = \
-	encoding/ascii85.gox \
-	encoding/asn1.gox \
-	encoding/base32.gox \
-	encoding/base64.gox \
-	encoding/binary.gox \
-	encoding/csv.gox \
-	encoding/gob.gox \
-	encoding/hex.gox \
-	encoding/json.gox \
-	encoding/pem.gox \
-	encoding/xml.gox
-
-toolexeclibgoexpdir = $(toolexeclibgodir)/exp
-
-toolexeclibgoexp_DATA = \
-	exp/proxy.gox \
-	exp/terminal.gox
-
-toolexeclibgogodir = $(toolexeclibgodir)/go
-
-toolexeclibgogo_DATA = \
-	go/ast.gox \
-	go/build.gox \
-	go/constant.gox \
-	go/doc.gox \
-	go/format.gox \
-	go/importer.gox \
-	go/parser.gox \
-	go/printer.gox \
-	go/scanner.gox \
-	go/token.gox \
-	go/types.gox
-
-toolexeclibgohashdir = $(toolexeclibgodir)/hash
-
-toolexeclibgohash_DATA = \
-	hash/adler32.gox \
-	hash/crc32.gox \
-	hash/crc64.gox \
-	hash/fnv.gox
-
-toolexeclibgohtmldir = $(toolexeclibgodir)/html
-
-toolexeclibgohtml_DATA = \
-	html/template.gox
-
-toolexeclibgoimagedir = $(toolexeclibgodir)/image
-
-toolexeclibgoimage_DATA = \
-	image/color.gox \
-	image/draw.gox \
-	image/gif.gox \
-	image/jpeg.gox \
-	image/png.gox
-
-toolexeclibgoimagecolordir = $(toolexeclibgoimagedir)/color
-
-toolexeclibgoimagecolor_DATA = \
-	image/color/palette.gox
-
-toolexeclibgoindexdir = $(toolexeclibgodir)/index
-
-toolexeclibgoindex_DATA = \
-	index/suffixarray.gox
-
-toolexeclibgoiodir = $(toolexeclibgodir)/io
-
-toolexeclibgoio_DATA = \
-	io/ioutil.gox
-
-toolexeclibgologdir = $(toolexeclibgodir)/log
-
-toolexeclibgolog_DATA = \
-	log/syslog.gox
-
-toolexeclibgomathdir = $(toolexeclibgodir)/math
-
-toolexeclibgomath_DATA = \
-	math/big.gox \
-	math/cmplx.gox \
-	math/rand.gox
-
-toolexeclibgomimedir = $(toolexeclibgodir)/mime
-
-toolexeclibgomime_DATA = \
-	mime/multipart.gox \
-	mime/quotedprintable.gox
-
-toolexeclibgonetdir = $(toolexeclibgodir)/net
-
-toolexeclibgonet_DATA = \
-	net/http.gox \
-	net/mail.gox \
-	net/rpc.gox \
-	net/smtp.gox \
-	net/textproto.gox \
-	net/url.gox
-
-toolexeclibgonethttpdir = $(toolexeclibgonetdir)/http
-
-toolexeclibgonethttp_DATA = \
-	net/http/cgi.gox \
-	net/http/cookiejar.gox \
-	net/http/fcgi.gox \
-	net/http/httptest.gox \
-	net/http/httputil.gox \
-	net/http/pprof.gox
-
-toolexeclibgonetrpcdir = $(toolexeclibgonetdir)/rpc
-
-toolexeclibgonetrpc_DATA = \
-	net/rpc/jsonrpc.gox
-
-toolexeclibgoolddir = $(toolexeclibgodir)/old
-
-toolexeclibgoold_DATA = \
-	old/regexp.gox \
-	old/template.gox
-
-toolexeclibgoosdir = $(toolexeclibgodir)/os
-
-toolexeclibgoos_DATA = \
-	os/exec.gox \
-	os/signal.gox \
-	os/user.gox
-
-toolexeclibgopathdir = $(toolexeclibgodir)/path
-
-toolexeclibgopath_DATA = \
-	path/filepath.gox
-
-toolexeclibgoregexpdir = $(toolexeclibgodir)/regexp
-
-toolexeclibgoregexp_DATA = \
-	regexp/syntax.gox
-
-toolexeclibgoruntimedir = $(toolexeclibgodir)/runtime
-
-toolexeclibgoruntime_DATA = \
-	runtime/debug.gox \
-	runtime/pprof.gox
-
-toolexeclibgosyncdir = $(toolexeclibgodir)/sync
-
-toolexeclibgosync_DATA = \
-	sync/atomic.gox
-
-toolexeclibgotestingdir = $(toolexeclibgodir)/testing
-
-toolexeclibgotesting_DATA = \
-	testing/iotest.gox \
-	testing/quick.gox
-
-toolexeclibgotextdir = $(toolexeclibgodir)/text
-
-toolexeclibgotext_DATA = \
-	text/scanner.gox \
-	text/tabwriter.gox \
-	text/template.gox
-
-toolexeclibgotexttemplatedir = $(toolexeclibgotextdir)/template
-
-toolexeclibgotexttemplate_DATA = \
-	text/template/parse.gox
-
-toolexeclibgounicodedir = $(toolexeclibgodir)/unicode
-
-toolexeclibgounicode_DATA = \
-	unicode/utf16.gox \
-	unicode/utf8.gox
-
-if HAVE_SYS_MMAN_H
-runtime_mem_file = runtime/mem.c
-else
-runtime_mem_file = runtime/mem_posix_memalign.c
-endif
-
-if LIBGO_IS_RTEMS
-rtems_task_variable_add_file = runtime/rtems-task-variable-add.c
-else
-rtems_task_variable_add_file =
-endif
-
-if LIBGO_IS_LINUX
-runtime_lock_files = runtime/lock_futex.c runtime/thread-linux.c
-else
-runtime_lock_files = runtime/lock_sema.c runtime/thread-sema.c
-endif
-
-if LIBGO_IS_LINUX
-runtime_getncpu_file = runtime/getncpu-linux.c
-else
-if LIBGO_IS_DARWIN
-runtime_getncpu_file = runtime/getncpu-bsd.c
-else
-if LIBGO_IS_IRIX
-runtime_getncpu_file = runtime/getncpu-irix.c
-else
-if LIBGO_IS_SOLARIS
-runtime_getncpu_file = runtime/getncpu-solaris.c
-else
-if LIBGO_IS_FREEBSD
-runtime_getncpu_file = runtime/getncpu-bsd.c
-else
-if LIBGO_IS_NETBSD
-runtime_getncpu_file = runtime/getncpu-bsd.c
-else
-runtime_getncpu_file = runtime/getncpu-none.c
-endif
-endif
-endif
-endif
-endif
-endif
-
-if LIBGO_IS_LINUX
-runtime_netpoll_files = runtime/netpoll_epoll.c
-else
-if LIBGO_IS_SOLARIS
-runtime_netpoll_files = runtime/netpoll_select.c
-else
-runtime_netpoll_files = runtime/netpoll_kqueue.c
-endif
-endif
-
-runtime_files = \
-	runtime/go-append.c \
-	runtime/go-assert.c \
-	runtime/go-assert-interface.c \
-	runtime/go-byte-array-to-string.c \
-	runtime/go-breakpoint.c \
-	runtime/go-caller.c \
-	runtime/go-callers.c \
-	runtime/go-can-convert-interface.c \
-	runtime/go-cdiv.c \
-	runtime/go-cgo.c \
-	runtime/go-check-interface.c \
-	runtime/go-construct-map.c \
-	runtime/go-convert-interface.c \
-	runtime/go-copy.c \
-	runtime/go-defer.c \
-	runtime/go-deferred-recover.c \
-	runtime/go-eface-compare.c \
-	runtime/go-eface-val-compare.c \
-	runtime/go-ffi.c \
-	runtime/go-fieldtrack.c \
-	runtime/go-int-array-to-string.c \
-	runtime/go-int-to-string.c \
-	runtime/go-interface-compare.c \
-	runtime/go-interface-eface-compare.c \
-	runtime/go-interface-val-compare.c \
-	runtime/go-make-slice.c \
-	runtime/go-map-delete.c \
-	runtime/go-map-index.c \
-	runtime/go-map-len.c \
-	runtime/go-map-range.c \
-	runtime/go-matherr.c \
-	runtime/go-memcmp.c \
-	runtime/go-nanotime.c \
-	runtime/go-now.c \
-	runtime/go-new-map.c \
-	runtime/go-new.c \
-	runtime/go-nosys.c \
-	runtime/go-panic.c \
-	runtime/go-print.c \
-	runtime/go-recover.c \
-	runtime/go-reflect-call.c \
-	runtime/go-reflect-map.c \
-	runtime/go-rune.c \
-	runtime/go-runtime-error.c \
-	runtime/go-setenv.c \
-	runtime/go-signal.c \
-	runtime/go-strcmp.c \
-	runtime/go-string-to-byte-array.c \
-	runtime/go-string-to-int-array.c \
-	runtime/go-strplus.c \
-	runtime/go-strslice.c \
-	runtime/go-traceback.c \
-	runtime/go-type-complex.c \
-	runtime/go-type-eface.c \
-	runtime/go-type-error.c \
-	runtime/go-type-float.c \
-	runtime/go-type-identity.c \
-	runtime/go-type-interface.c \
-	runtime/go-type-string.c \
-	runtime/go-typedesc-equal.c \
-	runtime/go-unsafe-new.c \
-	runtime/go-unsafe-newarray.c \
-	runtime/go-unsafe-pointer.c \
-	runtime/go-unsetenv.c \
-	runtime/go-unwind.c \
-	runtime/go-varargs.c \
-	runtime/env_posix.c \
-	runtime/heapdump.c \
-	$(runtime_lock_files) \
-	runtime/mcache.c \
-	runtime/mcentral.c \
-	$(runtime_mem_file) \
-	runtime/mfixalloc.c \
-	runtime/mgc0.c \
-	runtime/mheap.c \
-	runtime/msize.c \
-	$(runtime_netpoll_files) \
-	runtime/panic.c \
-	runtime/parfor.c \
-	runtime/print.c \
-	runtime/proc.c \
-	runtime/runtime.c \
-	runtime/signal_unix.c \
-	runtime/thread.c \
-	runtime/yield.c \
-	$(rtems_task_variable_add_file) \
-	chan.c \
-	cpuprof.c \
-	go-iface.c \
-	lfstack.c \
-	malloc.c \
-	map.c \
-	mprof.c \
-	netpoll.c \
-	rdebug.c \
-	reflect.c \
-	runtime1.c \
-	sema.c \
-	sigqueue.c \
-	string.c \
-	time.c \
-	$(runtime_getncpu_file)
-
-goc2c.$(OBJEXT): runtime/goc2c.c
-	$(CC_FOR_BUILD) -c $(CFLAGS_FOR_BUILD) $<
-
-goc2c: goc2c.$(OBJEXT)
-	$(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) $(LDFLAGS_FOR_BUILD) -o $@ $<
-
-malloc.c: $(srcdir)/runtime/malloc.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-mprof.c: $(srcdir)/runtime/mprof.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-netpoll.c: $(srcdir)/runtime/netpoll.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-reflect.c: $(srcdir)/runtime/reflect.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-runtime1.c: $(srcdir)/runtime/runtime1.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-sema.c: $(srcdir)/runtime/sema.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-sigqueue.c: $(srcdir)/runtime/sigqueue.goc goc2c
-	./goc2c --go-pkgpath os_signal $< > $@.tmp
-	mv -f $@.tmp $@
-
-time.c: $(srcdir)/runtime/time.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-%.c: $(srcdir)/runtime/%.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-go_bufio_files = \
-	go/bufio/bufio.go \
-	go/bufio/scan.go
-
-go_bytes_files = \
-	go/bytes/buffer.go \
-	go/bytes/bytes.go \
-	go/bytes/bytes_decl.go \
-	go/bytes/reader.go
-go_bytes_c_files = \
-	go/bytes/indexbyte.c
-
-go_crypto_files = \
-	go/crypto/crypto.go
-
-go_encoding_files = \
-	go/encoding/encoding.go
-
-go_errors_files = \
-	go/errors/errors.go
-
-go_expvar_files = \
-	go/expvar/expvar.go
-
-go_flag_files = \
-	go/flag/flag.go
-
-go_fmt_files = \
-	go/fmt/doc.go \
-	go/fmt/format.go \
-	go/fmt/print.go \
-	go/fmt/scan.go
-
-go_hash_files = \
-	go/hash/hash.go
-
-go_html_files = \
-	go/html/entity.go \
-	go/html/escape.go
-
-go_image_files = \
-	go/image/format.go \
-	go/image/geom.go \
-	go/image/image.go \
-	go/image/names.go \
-	go/image/ycbcr.go
-
-go_io_files = \
-	go/io/multi.go \
-	go/io/io.go \
-	go/io/pipe.go
-
-go_log_files = \
-	go/log/log.go
-
-go_math_files = \
-	go/math/abs.go \
-	go/math/acosh.go \
-	go/math/asin.go \
-	go/math/asinh.go \
-	go/math/atan.go \
-	go/math/atanh.go \
-	go/math/atan2.go \
-	go/math/bits.go \
-	go/math/cbrt.go \
-	go/math/const.go \
-	go/math/copysign.go \
-	go/math/dim.go \
-	go/math/erf.go \
-	go/math/exp.go \
-	go/math/expm1.go \
-	go/math/floor.go \
-	go/math/frexp.go \
-	go/math/gamma.go \
-	go/math/hypot.go \
-	go/math/j0.go \
-	go/math/j1.go \
-	go/math/jn.go \
-	go/math/ldexp.go \
-	go/math/lgamma.go \
-	go/math/log.go \
-	go/math/log1p.go \
-	go/math/log10.go \
-	go/math/logb.go \
-	go/math/mod.go \
-	go/math/modf.go \
-	go/math/nextafter.go \
-	go/math/pow.go \
-	go/math/pow10.go \
-	go/math/remainder.go \
-	go/math/signbit.go \
-	go/math/sin.go \
-	go/math/sincos.go \
-	go/math/sinh.go \
-	go/math/sqrt.go \
-	go/math/tan.go \
-	go/math/tanh.go \
-	go/math/unsafe.go
-
-if LIBGO_IS_OPENBSD
-go_mime_type_file = go/mime/type_openbsd.go
-else
-if LIBGO_IS_FREEBSD
-go_mime_type_file = go/mime/type_freebsd.go
-else
-if LIBGO_IS_DRAGONFLY
-go_mime_type_file = go/mime/type_dragonfly.go
-else
-go_mime_type_file =
-endif
-endif
-endif
-
-go_mime_files = \
-	go/mime/encodedword.go \
-	go/mime/grammar.go \
-	go/mime/mediatype.go \
-	go/mime/type.go \
-	go/mime/type_unix.go \
-	$(go_mime_type_file)
-
-if LIBGO_IS_LINUX
-go_net_cgo_file = go/net/cgo_linux.go
-go_net_sock_file = go/net/sock_linux.go
-go_net_sockopt_file = go/net/sockopt_linux.go
-go_net_sockoptip_file = go/net/sockoptip_linux.go go/net/sockoptip_posix.go
-go_net_cgo_sock_file = go/net/cgo_socknew.go
-go_net_cgo_res_file = go/net/cgo_resnew.go
-else
-if LIBGO_IS_IRIX
-go_net_cgo_file = go/net/cgo_linux.go
-go_net_sock_file = go/net/sock_linux.go
-go_net_sockopt_file = go/net/sockopt_linux.go
-go_net_sockoptip_file = go/net/sockoptip_linux.go go/net/sockoptip_posix.go
-go_net_cgo_sock_file = go/net/cgo_socknew.go
-go_net_cgo_res_file = go/net/cgo_resnew.go
-else
-if LIBGO_IS_SOLARIS
-go_net_cgo_file = go/net/cgo_solaris.go
-go_net_sock_file = go/net/sock_stub.go
-go_net_sockopt_file = go/net/sockopt_solaris.go
-go_net_sockoptip_file = go/net/sockoptip_stub.go
-go_net_cgo_sock_file = go/net/cgo_socknew.go
-go_net_cgo_res_file = go/net/cgo_resnew.go
-else
-if LIBGO_IS_FREEBSD
-go_net_cgo_file = go/net/cgo_bsd.go
-go_net_sock_file = go/net/sock_bsd.go
-go_net_sockopt_file = go/net/sockopt_bsd.go
-go_net_sockoptip_file = go/net/sockoptip_bsd.go go/net/sockoptip_posix.go
-go_net_cgo_sock_file = go/net/cgo_sockold.go
-go_net_cgo_res_file = go/net/cgo_resold.go
-else
-if LIBGO_IS_NETBSD
-go_net_cgo_file = go/net/cgo_netbsd.go
-go_net_sock_file = go/net/sock_bsd.go
-go_net_sockopt_file = go/net/sockopt_bsd.go
-go_net_sockoptip_file = go/net/sockoptip_bsd.go go/net/sockoptip_posix.go
-go_net_cgo_sock_file = go/net/cgo_sockold.go
-go_net_cgo_res_file = go/net/cgo_resnew.go
-else
-go_net_cgo_file = go/net/cgo_bsd.go
-go_net_sock_file = go/net/sock_bsd.go
-go_net_sockopt_file = go/net/sockopt_bsd.go
-go_net_sockoptip_file = go/net/sockoptip_bsd.go go/net/sockoptip_posix.go
-go_net_cgo_sock_file = go/net/cgo_sockold.go
-go_net_cgo_res_file = go/net/cgo_resold.go
-endif
-endif
-endif
-endif
-endif
-
-if LIBGO_IS_LINUX
-go_net_sendfile_file = go/net/sendfile_linux.go
-else
-if LIBGO_IS_FREEBSD
-go_net_sendfile_file = go/net/sendfile_freebsd.go
-else
-if LIBGO_IS_DRAGONFLY
-go_net_sendfile_file = go/net/sendfile_dragonfly.go
-else
-if LIBGO_IS_SOLARIS
-go_net_sendfile_file = go/net/sendfile_solaris.go
-else
-go_net_sendfile_file = go/net/sendfile_stub.go
-endif
-endif
-endif
-endif
-
-if LIBGO_IS_LINUX
-go_net_interface_file = go/net/interface_linux.go
-else
-if LIBGO_IS_NETBSD
-go_net_interface_file = go/net/interface_netbsd.go
-else
-if LIBGO_IS_DRAGONFLY
-go_net_interface_file = go/net/interface_dragonfly.go
-else
-go_net_interface_file = go/net/interface_stub.go
-endif
-endif
-endif
-
-if LIBGO_IS_LINUX
-go_net_cloexec_file = go/net/sock_cloexec.go go/net/hook_cloexec.go
-else
-if LIBGO_IS_FREEBSD
-go_net_cloexec_file = go/net/sock_cloexec.go go/net/hook_cloexec.go
-else
-go_net_cloexec_file = go/net/sys_cloexec.go
-endif
-endif
-
-if LIBGO_IS_OPENBSD
-go_net_tcpsockopt_file = go/net/tcpsockopt_openbsd.go
-else
-if LIBGO_IS_DARWIN
-go_net_tcpsockopt_file = go/net/tcpsockopt_darwin.go
-else
-if LIBGO_IS_SOLARIS
-go_net_tcpsockopt_file = go/net/tcpsockopt_solaris.go
-else
-if LIBGO_IS_DRAGONFLY
-go_net_tcpsockopt_file = go/net/tcpsockopt_dragonfly.go
-else
-go_net_tcpsockopt_file = go/net/tcpsockopt_unix.go
-endif
-endif
-endif
-endif
-
-go_net_common_files = \
-	go/net/addrselect.go \
-	$(go_net_cloexec_file) \
-	go/net/conf.go \
-	go/net/dial.go \
-	go/net/dnsclient.go \
-	go/net/dnsclient_unix.go \
-	go/net/dnsconfig_unix.go \
-	go/net/dnsmsg.go \
-	go/net/fd_mutex.go \
-	go/net/fd_posix.go \
-	go/net/fd_unix.go \
-	go/net/file.go \
-	go/net/file_unix.go \
-	go/net/hook.go \
-	go/net/hook_unix.go \
-	go/net/hosts.go \
-	go/net/interface.go \
-	$(go_net_interface_file) \
-	go/net/ip.go \
-	go/net/iprawsock.go \
-	go/net/iprawsock_posix.go \
-	go/net/ipsock.go \
-	go/net/ipsock_posix.go \
-	go/net/lookup.go \
-	go/net/lookup_unix.go \
-	go/net/mac.go \
-	go/net/net.go \
-	go/net/nss.go \
-	go/net/parse.go \
-	go/net/pipe.go \
-	go/net/fd_poll_runtime.go \
-	go/net/port.go \
-	go/net/port_unix.go \
-	go/net/race0.go \
-	$(go_net_sendfile_file) \
-	go/net/sock_posix.go \
-	$(go_net_sock_file) \
-	go/net/sockopt_posix.go \
-	$(go_net_sockopt_file) \
-	$(go_net_sockoptip_file) \
-	go/net/tcpsock.go \
-	go/net/tcpsock_posix.go \
-	go/net/tcpsockopt_posix.go \
-	$(go_net_tcpsockopt_file) \
-	go/net/udpsock.go \
-	go/net/udpsock_posix.go \
-	go/net/unixsock.go \
-	go/net/unixsock_posix.go
-
-go_net_files = \
-	go/net/cgo_unix.go \
-	$(go_net_cgo_file) \
-	$(go_net_cgo_res_file) \
-	$(go_net_cgo_sock_file) \
-	$(go_net_common_files)
-
-go_netgo_files = \
-	go/net/cgo_stub.go \
-	$(go_net_common_files)
-
-if LIBGO_IS_SOLARIS
-if LIBGO_IS_386
-go_os_dir_file = go/os/dir_largefile.go
-else
-if LIBGO_IS_SPARC
-go_os_dir_file = go/os/dir_largefile.go
-else
-go_os_dir_file = go/os/dir_regfile.go
-endif
-endif
-else
-if LIBGO_IS_LINUX
-go_os_dir_file = go/os/dir_largefile.go
-else
-go_os_dir_file = go/os/dir_regfile.go
-endif
-endif
-
-if LIBGO_IS_DARWIN
-go_os_getwd_file = go/os/getwd_darwin.go
-else
-go_os_getwd_file =
-endif
-
-if LIBGO_IS_LINUX
-go_os_sys_file = go/os/sys_linux.go
-else
-if LIBGO_IS_SOLARIS
-go_os_sys_file = go/os/sys_uname.go
-else
-if LIBGO_IS_IRIX
-go_os_sys_file = go/os/sys_uname.go
-else
-if LIBGO_IS_RTEMS
-go_os_sys_file = go/os/sys_uname.go
-else
-go_os_sys_file = go/os/sys_bsd.go
-endif
-endif
-endif
-endif
-
-if LIBGO_IS_FREEBSD
-go_os_cloexec_file = go/os/sys_freebsd.go
-else
-if LIBGO_IS_DARWIN
-go_os_cloexec_file = go/os/sys_darwin.go
-else
-go_os_cloexec_file = go/os/sys_unix.go
-endif
-endif
-
-if LIBGO_IS_SOLARIS
-if HAVE_STAT_TIMESPEC
-go_os_stat_file = go/os/stat_atim.go
-else
-go_os_stat_file = go/os/stat_solaris.go
-endif
-else
-if LIBGO_IS_LINUX
-go_os_stat_file = go/os/stat_atim.go
-else
-if LIBGO_IS_OPENBSD
-go_os_stat_file = go/os/stat_atim.go
-else
-if LIBGO_IS_DARWIN
-go_os_stat_file = go/os/stat_atimespec.go
-else
-if LIBGO_IS_FREEBSD
-go_os_stat_file = go/os/stat_atimespec.go
-else
-if LIBGO_IS_NETBSD
-go_os_stat_file = go/os/stat_atimespec.go
-else
-if LIBGO_IS_DRAGONFLY
-go_os_stat_file = go/os/stat_dragonfly.go
-else
-go_os_stat_file = go/os/stat.go
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-
-if LIBGO_IS_LINUX
-go_os_pipe_file = go/os/pipe_linux.go
-else
-go_os_pipe_file = go/os/pipe_bsd.go
-endif
-
-if LIBGO_IS_DARWIN
-go_os_sticky_file = go/os/sticky_bsd.go
-else
-if LIBGO_IS_DRAGONFLY
-go_os_sticky_file = go/os/sticky_bsd.go
-else
-if LIBGO_IS_FREEBSD
-go_os_sticky_file = go/os/sticky_bsd.go
-else
-if LIBGO_IS_NETBSD
-go_os_sticky_file = go/os/sticky_bsd.go
-else
-if LIBGO_IS_OPENBSD
-go_os_sticky_file = go/os/sticky_bsd.go
-else
-if LIBGO_IS_SOLARIS
-go_os_sticky_file = go/os/sticky_bsd.go
-else
-go_os_sticky_file = go/os/sticky_notbsd.go
-endif
-endif
-endif
-endif
-endif
-endif
-
-go_os_files = \
-	$(go_os_dir_file) \
-	go/os/dir.go \
-	go/os/doc.go \
-	go/os/env.go \
-	go/os/error.go \
-	go/os/error_unix.go \
-	go/os/exec.go \
-	go/os/exec_posix.go \
-	go/os/exec_unix.go \
-	go/os/file.go \
-	go/os/file_posix.go \
-	go/os/file_unix.go \
-	go/os/getwd.go \
-	$(go_os_getwd_file) \
-	go/os/path.go \
-	go/os/path_unix.go \
-	$(go_os_pipe_file) \
-	go/os/proc.go \
-	$(go_os_stat_file) \
-	$(go_os_sticky_file) \
-	go/os/str.go \
-	$(go_os_sys_file) \
-	$(go_os_cloexec_file) \
-	go/os/types.go \
-	go/os/types_notwin.go
-
-go_path_files = \
-	go/path/match.go \
-	go/path/path.go
-
-go_reflect_files = \
-	go/reflect/deepequal.go \
-	go/reflect/makefunc.go \
-	go/reflect/makefunc_ffi.go \
-	go/reflect/type.go \
-	go/reflect/value.go
-go_reflect_makefunc_c_file = \
-	go/reflect/makefunc_ffi_c.c
-
-go_regexp_files = \
-	go/regexp/backtrack.go \
-	go/regexp/exec.go \
-	go/regexp/onepass.go \
-	go/regexp/regexp.go
-
-go_net_rpc_files = \
-	go/net/rpc/client.go \
-	go/net/rpc/debug.go \
-	go/net/rpc/server.go
-
-go_runtime_files = \
-	go/runtime/compiler.go \
-	go/runtime/debug.go \
-	go/runtime/error.go \
-	go/runtime/extern.go \
-	go/runtime/mem.go \
-	version.go
-
-version.go: s-version; @true
-s-version: Makefile
-	rm -f version.go.tmp
-	echo "package runtime" > version.go.tmp
-	echo 'const defaultGoroot = "$(prefix)"' >> version.go.tmp
-	echo 'const theVersion = "'`cat $(srcdir)/VERSION | sed 1q`' '`$(GOC) --version | sed 1q`'"' >> version.go.tmp
-	echo 'const theGoarch = "'$(GOARCH)'"' >> version.go.tmp
-	echo 'const theGoos = "'$(GOOS)'"' >> version.go.tmp
-	echo 'const theGccgoToolDir = "$(libexecsubdir)"' >> version.go.tmp
-	$(SHELL) $(srcdir)/mvifdiff.sh version.go.tmp version.go
-	$(STAMP) $@
-
-noinst_DATA = zstdpkglist.go
-
-# Generate the list of go std packages that were included in libgo
-zstdpkglist.go: s-zstdpkglist; @true
-s-zstdpkglist: Makefile
-	rm -f zstdpkglist.go.tmp
-	echo 'package main' > zstdpkglist.go.tmp
-	echo "" >> zstdpkglist.go.tmp
-	echo 'var stdpkg = map[string]bool{' >> zstdpkglist.go.tmp
-	echo $(libgo_go_objs) 'unsafe.lo' 'runtime/cgo.lo' | sed 's/\.lo /\": true,\n/g' | sed 's/\.lo/\": true,/' | sed 's/-go//' | grep -v _c | sed 's/^/\t\"/' | sort | uniq >> zstdpkglist.go.tmp
-	echo '}' >> zstdpkglist.go.tmp
-	$(SHELL) $(srcdir)/mvifdiff.sh zstdpkglist.go.tmp zstdpkglist.go
-	$(STAMP) $@
-
-go_sort_files = \
-	go/sort/search.go \
-	go/sort/sort.go
-
-go_strconv_files = \
-	go/strconv/atob.go \
-	go/strconv/atof.go \
-	go/strconv/atoi.go \
-	go/strconv/decimal.go \
-	go/strconv/doc.go \
-	go/strconv/extfloat.go \
-	go/strconv/ftoa.go \
-	go/strconv/isprint.go \
-	go/strconv/itoa.go \
-	go/strconv/quote.go
-
-go_strings_files = \
-	go/strings/compare.go \
-	go/strings/reader.go \
-	go/strings/replace.go \
-	go/strings/search.go \
-	go/strings/strings.go \
-	go/strings/strings_decl.go
-go_strings_c_files = \
-	go/strings/indexbyte.c
-
-go_sync_files = \
-	go/sync/cond.go \
-	go/sync/mutex.go \
-	go/sync/once.go \
-	go/sync/pool.go \
-	go/sync/race0.go \
-	go/sync/runtime.go \
-	go/sync/rwmutex.go \
-	go/sync/waitgroup.go
-
-if LIBGO_IS_SOLARIS
-go_syslog_file = go/log/syslog/syslog_libc.go
-else
-if LIBGO_IS_IRIX
-go_syslog_file = go/log/syslog/syslog_libc.go
-else
-go_syslog_file = go/log/syslog/syslog_unix.go
-endif
-endif
-
-go_log_syslog_files = \
-	go/log/syslog/doc.go \
-	go/log/syslog/syslog.go \
-	$(go_syslog_file)
-go_syslog_c_files = \
-	go/log/syslog/syslog_c.c
-
-go_testing_files = \
-	go/testing/allocs.go \
-	go/testing/benchmark.go \
-	go/testing/cover.go \
-	go/testing/example.go \
-	go/testing/testing.go
-
-go_time_files = \
-	go/time/format.go \
-	go/time/sleep.go \
-	go/time/sys_unix.go \
-	go/time/tick.go \
-	go/time/time.go \
-	go/time/zoneinfo.go \
-	go/time/zoneinfo_read.go \
-	go/time/zoneinfo_unix.go
-
-go_unicode_files = \
-	go/unicode/casetables.go \
-	go/unicode/digit.go \
-	go/unicode/graphic.go \
-	go/unicode/letter.go \
-	go/unicode/tables.go
-
-if LIBGO_IS_LINUX
-archive_tar_atim_file = go/archive/tar/stat_atim.go
-endif
-if LIBGO_IS_OPENBSD
-archive_tar_atim_file = go/archive/tar/stat_atim.go
-endif
-if LIBGO_IS_SOLARIS
-archive_tar_atim_file = go/archive/tar/stat_atim.go
-endif
-if LIBGO_IS_DARWIN
-archive_tar_atim_file = go/archive/tar/stat_atimespec.go
-endif
-if LIBGO_IS_FREEBSD
-archive_tar_atim_file = go/archive/tar/stat_atimespec.go
-endif
-if LIBGO_IS_NETBSD
-archive_tar_atim_file = go/archive/tar/stat_atimespec.go
-endif
-
-go_archive_tar_files = \
-	go/archive/tar/common.go \
-	go/archive/tar/reader.go \
-	go/archive/tar/stat_unix.go \
-	go/archive/tar/writer.go \
-	$(archive_tar_atim_file)
-
-go_archive_zip_files = \
-	go/archive/zip/reader.go \
-	go/archive/zip/register.go \
-	go/archive/zip/struct.go \
-	go/archive/zip/writer.go
-
-go_compress_bzip2_files = \
-	go/compress/bzip2/bit_reader.go \
-	go/compress/bzip2/bzip2.go \
-	go/compress/bzip2/huffman.go \
-	go/compress/bzip2/move_to_front.go
-
-go_compress_flate_files = \
-	go/compress/flate/copy.go \
-	go/compress/flate/deflate.go \
-	go/compress/flate/fixedhuff.go \
-	go/compress/flate/huffman_bit_writer.go \
-	go/compress/flate/huffman_code.go \
-	go/compress/flate/inflate.go \
-	go/compress/flate/reverse_bits.go \
-	go/compress/flate/token.go
-
-go_compress_gzip_files = \
-	go/compress/gzip/gzip.go \
-	go/compress/gzip/gunzip.go
-
-go_compress_lzw_files = \
-	go/compress/lzw/reader.go \
-	go/compress/lzw/writer.go
-
-go_compress_zlib_files = \
-	go/compress/zlib/reader.go \
-	go/compress/zlib/writer.go
-
-go_container_heap_files = \
-	go/container/heap/heap.go
-
-go_container_list_files = \
-	go/container/list/list.go
-
-go_container_ring_files = \
-	go/container/ring/ring.go
-
-go_crypto_aes_files = \
-	go/crypto/aes/block.go \
-	go/crypto/aes/cipher.go \
-	go/crypto/aes/cipher_generic.go \
-	go/crypto/aes/const.go
-go_crypto_cipher_files = \
-	go/crypto/cipher/cbc.go \
-	go/crypto/cipher/cfb.go \
-	go/crypto/cipher/cipher.go \
-	go/crypto/cipher/ctr.go \
-	go/crypto/cipher/gcm.go \
-	go/crypto/cipher/io.go \
-	go/crypto/cipher/ofb.go \
-	go/crypto/cipher/xor.go
-go_crypto_des_files = \
-	go/crypto/des/block.go \
-	go/crypto/des/cipher.go \
-	go/crypto/des/const.go
-go_crypto_dsa_files = \
-	go/crypto/dsa/dsa.go
-go_crypto_ecdsa_files = \
-	go/crypto/ecdsa/ecdsa.go
-go_crypto_elliptic_files = \
-	go/crypto/elliptic/elliptic.go \
-	go/crypto/elliptic/p224.go \
-	go/crypto/elliptic/p256.go
-go_crypto_hmac_files = \
-	go/crypto/hmac/hmac.go
-go_crypto_md5_files = \
-	go/crypto/md5/md5.go \
-	go/crypto/md5/md5block.go \
-	go/crypto/md5/md5block_generic.go
-
-if LIBGO_IS_LINUX
-crypto_rand_file = go/crypto/rand/rand_linux.go
-else
-crypto_rand_file =
-endif
-
-go_crypto_rand_files = \
-	go/crypto/rand/eagain.go \
-	go/crypto/rand/rand.go \
-	go/crypto/rand/rand_unix.go \
-	$(crypto_rand_file) \
-	go/crypto/rand/util.go
-
-go_crypto_rc4_files = \
-	go/crypto/rc4/rc4.go \
-	go/crypto/rc4/rc4_ref.go
-go_crypto_rsa_files = \
-	go/crypto/rsa/pkcs1v15.go \
-	go/crypto/rsa/pss.go \
-	go/crypto/rsa/rsa.go
-go_crypto_sha1_files = \
-	go/crypto/sha1/sha1.go \
-	go/crypto/sha1/sha1block.go \
-	go/crypto/sha1/sha1block_generic.go
-go_crypto_sha256_files = \
-	go/crypto/sha256/sha256.go \
-	go/crypto/sha256/sha256block.go
-go_crypto_sha512_files = \
-	go/crypto/sha512/sha512.go \
-	go/crypto/sha512/sha512block.go
-go_crypto_subtle_files = \
-	go/crypto/subtle/constant_time.go
-go_crypto_tls_files = \
-	go/crypto/tls/alert.go \
-	go/crypto/tls/cipher_suites.go \
-	go/crypto/tls/common.go \
-	go/crypto/tls/conn.go \
-	go/crypto/tls/handshake_client.go \
-	go/crypto/tls/handshake_messages.go \
-	go/crypto/tls/handshake_server.go \
-	go/crypto/tls/key_agreement.go \
-	go/crypto/tls/prf.go \
-	go/crypto/tls/ticket.go \
-	go/crypto/tls/tls.go
-
-if LIBGO_IS_LINUX
-go_crypto_x509_root_file = go/crypto/x509/root_linux.go
-else
-if LIBGO_IS_SOLARIS
-go_crypto_x509_root_file = go/crypto/x509/root_solaris.go
-else
-if LIBGO_IS_DRAGONFLY
-go_crypto_x509_root_file = go/crypto/x509/root_bsd.go
-else
-if LIBGO_IS_FREEBSD
-go_crypto_x509_root_file = go/crypto/x509/root_bsd.go
-else
-if LIBGO_IS_NETBSD
-go_crypto_x509_root_file = go/crypto/x509/root_bsd.go
-else
-if LIBGO_IS_OPENBSD
-go_crypto_x509_root_file = go/crypto/x509/root_bsd.go
-else
-if LIBGO_IS_DARWIN
-go_crypto_x509_root_file = go/crypto/x509/root_darwin.go
-else
-go_crypto_x509_root_file =
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-
-go_crypto_x509_files = \
-	go/crypto/x509/cert_pool.go \
-	go/crypto/x509/pem_decrypt.go \
-	go/crypto/x509/pkcs1.go \
-	go/crypto/x509/pkcs8.go \
-	go/crypto/x509/root.go \
-	go/crypto/x509/root_unix.go \
-	$(go_crypto_x509_root_file) \
-	go/crypto/x509/sec1.go \
-	go/crypto/x509/verify.go \
-	go/crypto/x509/x509.go
-
-go_crypto_x509_pkix_files = \
-	go/crypto/x509/pkix/pkix.go
-
-go_database_sql_files = \
-	go/database/sql/convert.go \
-	go/database/sql/sql.go
-
-go_database_sql_driver_files = \
-	go/database/sql/driver/driver.go \
-	go/database/sql/driver/types.go
-
-go_debug_dwarf_files = \
-	go/debug/dwarf/buf.go \
-	go/debug/dwarf/class_string.go \
-	go/debug/dwarf/const.go \
-	go/debug/dwarf/entry.go \
-	go/debug/dwarf/line.go \
-	go/debug/dwarf/open.go \
-	go/debug/dwarf/type.go \
-	go/debug/dwarf/typeunit.go \
-	go/debug/dwarf/unit.go
-go_debug_elf_files = \
-	go/debug/elf/elf.go \
-	go/debug/elf/file.go
-go_debug_gosym_files = \
-	go/debug/gosym/pclntab.go \
-	go/debug/gosym/symtab.go
-go_debug_macho_files = \
-	go/debug/macho/fat.go \
-	go/debug/macho/file.go \
-	go/debug/macho/macho.go
-go_debug_pe_files = \
-	go/debug/pe/file.go \
-	go/debug/pe/pe.go
-go_debug_plan9obj_files = \
-	go/debug/plan9obj/file.go \
-	go/debug/plan9obj/plan9obj.go
-
-go_encoding_ascii85_files = \
-	go/encoding/ascii85/ascii85.go
-go_encoding_asn1_files = \
-	go/encoding/asn1/asn1.go \
-	go/encoding/asn1/common.go \
-	go/encoding/asn1/marshal.go
-go_encoding_base32_files = \
-	go/encoding/base32/base32.go
-go_encoding_base64_files = \
-	go/encoding/base64/base64.go
-go_encoding_binary_files = \
-	go/encoding/binary/binary.go \
-	go/encoding/binary/varint.go
-go_encoding_csv_files = \
-	go/encoding/csv/reader.go \
-	go/encoding/csv/writer.go
-go_encoding_gob_files = \
-	go/encoding/gob/decode.go \
-	go/encoding/gob/decoder.go \
-	go/encoding/gob/dec_helpers.go \
-	go/encoding/gob/doc.go \
-	go/encoding/gob/encode.go \
-	go/encoding/gob/encoder.go \
-	go/encoding/gob/enc_helpers.go \
-	go/encoding/gob/error.go \
-	go/encoding/gob/type.go
-go_encoding_hex_files = \
-	go/encoding/hex/hex.go
-go_encoding_json_files = \
-	go/encoding/json/decode.go \
-	go/encoding/json/encode.go \
-	go/encoding/json/fold.go \
-	go/encoding/json/indent.go \
-	go/encoding/json/scanner.go \
-	go/encoding/json/stream.go \
-	go/encoding/json/tags.go
-go_encoding_pem_files = \
-	go/encoding/pem/pem.go
-go_encoding_xml_files = \
-	go/encoding/xml/marshal.go \
-	go/encoding/xml/read.go \
-	go/encoding/xml/typeinfo.go \
-	go/encoding/xml/xml.go
-
-go_exp_proxy_files = \
-	go/exp/proxy/direct.go \
-	go/exp/proxy/per_host.go \
-	go/exp/proxy/proxy.go \
-	go/exp/proxy/socks5.go
-go_exp_terminal_files = \
-	go/exp/terminal/terminal.go \
-	go/exp/terminal/util.go
-
-go_go_ast_files = \
-	go/go/ast/ast.go \
-	go/go/ast/commentmap.go \
-	go/go/ast/filter.go \
-	go/go/ast/import.go \
-	go/go/ast/print.go \
-	go/go/ast/resolve.go \
-	go/go/ast/scope.go \
-	go/go/ast/walk.go
-go_go_build_files = \
-	go/go/build/build.go \
-	go/go/build/doc.go \
-	go/go/build/read.go \
-	go/go/build/syslist.go
-go_go_constant_files = \
-	go/go/constant/go14.go \
-	go/go/constant/value.go
-go_go_doc_files = \
-	go/go/doc/comment.go \
-	go/go/doc/doc.go \
-	go/go/doc/example.go \
-	go/go/doc/exports.go \
-	go/go/doc/filter.go \
-	go/go/doc/reader.go \
-	go/go/doc/synopsis.go
-go_go_format_files = \
-	go/go/format/format.go
-go_go_importer_files = \
-	go/go/importer/importer.go
-go_go_parser_files = \
-	go/go/parser/interface.go \
-	go/go/parser/parser.go
-go_go_printer_files = \
-	go/go/printer/nodes.go \
-	go/go/printer/printer.go
-go_go_scanner_files = \
-	go/go/scanner/errors.go \
-	go/go/scanner/scanner.go
-go_go_token_files = \
-	go/go/token/position.go \
-	go/go/token/serialize.go \
-	go/go/token/token.go
-go_go_types_files = \
-	go/go/types/api.go \
-	go/go/types/assignments.go \
-	go/go/types/builtins.go \
-	go/go/types/call.go \
-	go/go/types/check.go \
-	go/go/types/conversions.go \
-	go/go/types/decl.go \
-	go/go/types/errors.go \
-	go/go/types/eval.go \
-	go/go/types/expr.go \
-	go/go/types/exprstring.go \
-	go/go/types/go12.go \
-	go/go/types/initorder.go \
-	go/go/types/labels.go \
-	go/go/types/lookup.go \
-	go/go/types/methodset.go \
-	go/go/types/object.go \
-	go/go/types/objset.go \
-	go/go/types/operand.go \
-	go/go/types/ordering.go \
-	go/go/types/package.go \
-	go/go/types/predicates.go \
-	go/go/types/resolver.go \
-	go/go/types/return.go \
-	go/go/types/scope.go \
-	go/go/types/selection.go \
-	go/go/types/stmt.go \
-	go/go/types/sizes.go \
-	go/go/types/type.go \
-	go/go/types/typestring.go \
-	go/go/types/typexpr.go \
-	go/go/types/universe.go
-
-go_go_internal_gcimporter_files = \
-	go/go/internal/gcimporter/exportdata.go \
-	go/go/internal/gcimporter/gcimporter.go
-go_go_internal_gccgoimporter_files = \
-	go/go/internal/gccgoimporter/gccgoinstallation.go \
-	go/go/internal/gccgoimporter/importer.go \
-	go/go/internal/gccgoimporter/parser.go
-
-go_hash_adler32_files = \
-	go/hash/adler32/adler32.go
-go_hash_crc32_files = \
-	go/hash/crc32/crc32.go \
-	go/hash/crc32/crc32_generic.go
-go_hash_crc64_files = \
-	go/hash/crc64/crc64.go
-go_hash_fnv_files = \
-	go/hash/fnv/fnv.go
-
-go_html_template_files = \
-	go/html/template/attr.go \
-	go/html/template/content.go \
-	go/html/template/context.go \
-	go/html/template/css.go \
-	go/html/template/doc.go \
-	go/html/template/error.go \
-	go/html/template/escape.go \
-	go/html/template/html.go \
-	go/html/template/js.go \
-	go/html/template/template.go \
-	go/html/template/transition.go \
-	go/html/template/url.go
-
-go_image_color_files = \
-	go/image/color/color.go \
-	go/image/color/ycbcr.go
-
-go_image_color_palette_files = \
-	go/image/color/palette/palette.go
-
-go_image_draw_files = \
-	go/image/draw/draw.go
-
-go_image_gif_files = \
-	go/image/gif/reader.go \
-	go/image/gif/writer.go
-
-go_image_internal_imageutil_files = \
-	go/image/internal/imageutil/imageutil.go \
-	go/image/internal/imageutil/impl.go
-
-go_image_jpeg_files = \
-	go/image/jpeg/fdct.go \
-	go/image/jpeg/huffman.go \
-	go/image/jpeg/idct.go \
-	go/image/jpeg/reader.go \
-	go/image/jpeg/scan.go \
-	go/image/jpeg/writer.go
-
-go_image_png_files = \
-	go/image/png/paeth.go \
-	go/image/png/reader.go \
-	go/image/png/writer.go
-
-go_index_suffixarray_files = \
-	go/index/suffixarray/qsufsort.go \
-	go/index/suffixarray/suffixarray.go
-
-go_internal_format_files = \
-	go/internal/format/format.go
-go_internal_singleflight_files = \
-	go/internal/singleflight/singleflight.go
-
-if LIBGO_IS_LINUX
-internal_syscall_unix_getrandom_file = go/internal/syscall/unix/getrandom_linux.go
-else
-internal_syscall_unix_getrandom_file =
-endif
-
-go_internal_syscall_unix_files = \
-	go/internal/syscall/unix/dummy.go \
-	$(internal_syscall_unix_getrandom_file)
-
-go_internal_testenv_files = \
-	go/internal/testenv/testenv.go
-go_internal_trace_files = \
-	go/internal/trace/goroutines.go \
-	go/internal/trace/parser.go
-
-go_io_ioutil_files = \
-	go/io/ioutil/ioutil.go \
-	go/io/ioutil/tempfile.go
-
-go_math_big_files = \
-	go/math/big/accuracy_string.go \
-	go/math/big/arith.go \
-	go/math/big/arith_decl_pure.go \
-	go/math/big/decimal.go \
-	go/math/big/float.go \
-	go/math/big/floatconv.go \
-	go/math/big/ftoa.go \
-	go/math/big/int.go \
-	go/math/big/intconv.go \
-	go/math/big/nat.go \
-	go/math/big/natconv.go \
-	go/math/big/rat.go \
-	go/math/big/ratconv.go \
-	go/math/big/roundingmode_string.go
-go_math_cmplx_files = \
-	go/math/cmplx/abs.go \
-	go/math/cmplx/asin.go \
-	go/math/cmplx/conj.go \
-	go/math/cmplx/exp.go \
-	go/math/cmplx/isinf.go \
-	go/math/cmplx/isnan.go \
-	go/math/cmplx/log.go \
-	go/math/cmplx/phase.go \
-	go/math/cmplx/polar.go \
-	go/math/cmplx/pow.go \
-	go/math/cmplx/rect.go \
-	go/math/cmplx/sin.go \
-	go/math/cmplx/sqrt.go \
-	go/math/cmplx/tan.go
-go_math_rand_files = \
-	go/math/rand/exp.go \
-	go/math/rand/normal.go \
-	go/math/rand/rand.go \
-	go/math/rand/rng.go \
-	go/math/rand/zipf.go
-
-go_mime_multipart_files = \
-	go/mime/multipart/formdata.go \
-	go/mime/multipart/multipart.go \
-	go/mime/multipart/writer.go
-
-go_mime_quotedprintable_files = \
-	go/mime/quotedprintable/reader.go \
-	go/mime/quotedprintable/writer.go
-
-go_net_http_files = \
-	go/net/http/client.go \
-	go/net/http/cookie.go \
-	go/net/http/filetransport.go \
-	go/net/http/fs.go \
-	go/net/http/header.go \
-	go/net/http/jar.go \
-	go/net/http/lex.go \
-	go/net/http/request.go \
-	go/net/http/response.go \
-	go/net/http/server.go \
-	go/net/http/sniff.go \
-	go/net/http/status.go \
-	go/net/http/transfer.go \
-	go/net/http/transport.go
-go_net_mail_files = \
-	go/net/mail/message.go
-go_net_smtp_files = \
-	go/net/smtp/auth.go \
-	go/net/smtp/smtp.go
-go_net_textproto_files = \
-	go/net/textproto/header.go \
-	go/net/textproto/pipeline.go \
-	go/net/textproto/reader.go \
-	go/net/textproto/textproto.go \
-	go/net/textproto/writer.go
-go_net_url_files = \
-	go/net/url/url.go
-
-go_net_http_cgi_files = \
-	go/net/http/cgi/child.go \
-	go/net/http/cgi/host.go
-go_net_http_cookiejar_files = \
-	go/net/http/cookiejar/jar.go \
-	go/net/http/cookiejar/punycode.go
-go_net_http_fcgi_files = \
-	go/net/http/fcgi/child.go \
-	go/net/http/fcgi/fcgi.go
-go_net_http_httptest_files = \
-	go/net/http/httptest/recorder.go \
-	go/net/http/httptest/server.go
-go_net_http_pprof_files = \
-	go/net/http/pprof/pprof.go
-go_net_http_httputil_files = \
-	go/net/http/httputil/dump.go \
-	go/net/http/httputil/httputil.go \
-	go/net/http/httputil/persist.go \
-	go/net/http/httputil/reverseproxy.go
-go_net_http_internal_files = \
-	go/net/http/internal/chunked.go
-
-if LIBGO_IS_LINUX
-go_net_internal_socktest_sys = go/net/internal/socktest/sys_cloexec.go
-else
-if LIBGO_IS_FREEBSD
-go_net_internal_socktest_sys = go/net/internal/socktest/sys_cloexec.go
-else
-go_net_internal_socktest_sys =
-endif
-endif
-
-go_net_internal_socktest_files = \
-	go/net/internal/socktest/switch.go \
-	go/net/internal/socktest/switch_posix.go \
-	go/net/internal/socktest/switch_unix.go \
-	go/net/internal/socktest/sys_unix.go \
-	$(go_net_internal_socktest_sys)
-
-go_old_regexp_files = \
-	go/old/regexp/regexp.go
-go_old_template_files = \
-	go/old/template/doc.go \
-	go/old/template/execute.go \
-	go/old/template/format.go \
-	go/old/template/parse.go
-
-go_os_exec_files = \
-	go/os/exec/exec.go \
-	go/os/exec/exec_posix.go \
-	go/os/exec/lp_unix.go
-
-go_os_signal_files = \
-	go/os/signal/signal.go \
-	go/os/signal/signal_unix.go
-
-if LIBGO_IS_SOLARIS
-os_user_decls_file = go/os/user/decls_solaris.go
-else
-os_user_decls_file = go/os/user/decls_unix.go
-endif
-
-go_os_user_files = \
-	go/os/user/lookup.go \
-	go/os/user/lookup_unix.go \
-	go/os/user/user.go \
-	$(os_user_decls_file)
-
-go_path_filepath_files = \
-	go/path/filepath/match.go \
-	go/path/filepath/path.go \
-	go/path/filepath/path_unix.go \
-	go/path/filepath/symlink.go \
-	go/path/filepath/symlink_unix.go
-
-go_regexp_syntax_files = \
-	go/regexp/syntax/compile.go \
-	go/regexp/syntax/doc.go \
-	go/regexp/syntax/parse.go \
-	go/regexp/syntax/perl_groups.go \
-	go/regexp/syntax/prog.go \
-	go/regexp/syntax/regexp.go \
-	go/regexp/syntax/simplify.go
-
-go_net_rpc_jsonrpc_files = \
-	go/net/rpc/jsonrpc/client.go \
-	go/net/rpc/jsonrpc/server.go
-
-go_runtime_debug_files = \
-	go/runtime/debug/garbage.go \
-	go/runtime/debug/stack.go
-go_runtime_pprof_files = \
-	go/runtime/pprof/pprof.go
-
-go_text_tabwriter_files = \
-	go/text/tabwriter/tabwriter.go
-go_text_template_files = \
-	go/text/template/doc.go \
-	go/text/template/exec.go \
-	go/text/template/funcs.go \
-	go/text/template/helper.go \
-	go/text/template/option.go \
-	go/text/template/template.go
-go_text_template_parse_files = \
-	go/text/template/parse/lex.go \
-	go/text/template/parse/node.go \
-	go/text/template/parse/parse.go
-
-go_sync_atomic_files = \
-	go/sync/atomic/doc.go \
-	go/sync/atomic/value.go
-go_sync_atomic_c_files = \
-	go/sync/atomic/atomic.c
-
-go_testing_iotest_files = \
-	go/testing/iotest/logger.go \
-	go/testing/iotest/reader.go \
-	go/testing/iotest/writer.go
-go_testing_quick_files = \
-	go/testing/quick/quick.go
-
-go_text_scanner_files = \
-	go/text/scanner/scanner.go
-
-go_unicode_utf16_files = \
-	go/unicode/utf16/utf16.go
-go_unicode_utf8_files = \
-	go/unicode/utf8/utf8.go
-
-# Define Syscall and Syscall6.
-if LIBGO_IS_RTEMS
-syscall_syscall_file = go/syscall/syscall_stubs.go
-else
-syscall_syscall_file = go/syscall/syscall_unix.go
-endif
-
-# Define ForkExec and Exec.
-if LIBGO_IS_RTEMS
-syscall_exec_file = go/syscall/exec_stubs.go
-syscall_exec_os_file =
-else
-if LIBGO_IS_LINUX
-syscall_exec_file = go/syscall/exec_unix.go
-syscall_exec_os_file = go/syscall/exec_linux.go
-else
-syscall_exec_file = go/syscall/exec_unix.go
-syscall_exec_os_file = go/syscall/exec_bsd.go
-endif
-endif
-
-# Define Wait4.
-if LIBGO_IS_RTEMS
-syscall_wait_file =
-else
-if HAVE_WAIT4
-syscall_wait_file = go/syscall/libcall_wait4.go
-else
-syscall_wait_file = go/syscall/libcall_waitpid.go
-endif
-endif
-
-# Support for pulling apart wait status.
-if LIBGO_IS_RTEMS
-syscall_wait_c_file =
-else
-syscall_wait_c_file = go/syscall/wait.c
-endif
-
-# Define Sleep.
-if LIBGO_IS_RTEMS
-syscall_sleep_file = go/syscall/sleep_rtems.go
-else
-syscall_sleep_file = go/syscall/sleep_select.go
-endif
-
-# Define Errstr.
-if LIBGO_IS_LINUX
-syscall_errstr_file = go/syscall/errstr_linux.go
-else
-if LIBGO_IS_RTEMS
-syscall_errstr_file = go/syscall/errstr_linux.go
-else
-if HAVE_STRERROR_R
-syscall_errstr_file = go/syscall/errstr.go
-else
-syscall_errstr_file = go/syscall/errstr_nor.go
-endif
-endif
-endif
-
-# Declare libc functions that vary for largefile systems.
-if LIBGO_IS_LINUX
-# Always use lseek64 on GNU/Linux.
-syscall_size_file = go/syscall/libcall_posix_largefile.go
-else # !LIBGO_IS_LINUX
-if LIBGO_IS_SOLARIS
-if LIBGO_IS_386
-# Use lseek64 on 32-bit Solaris/x86.
-syscall_size_file = go/syscall/libcall_posix_largefile.go
-else # !LIBGO_IS_386
-if LIBGO_IS_SPARC
-# Use lseek64 on 32-bit Solaris/SPARC.
-syscall_size_file = go/syscall/libcall_posix_largefile.go
-else # !LIBGO_IS_386 && !LIBGO_IS_SPARC
-# Use lseek on 64-bit Solaris.
-syscall_size_file = go/syscall/libcall_posix_regfile.go
-endif # !LIBGO_IS_386 && !LIBGO_IS_SPARC
-endif # !LIBGO_IS_SOLARIS
-else # !LIBGO_IS_LINUX && !LIBGO_IS_SOLARIS
-# Use lseek by default.
-syscall_size_file = go/syscall/libcall_posix_regfile.go
-endif # !LIBGO_IS_SOLARIS
-endif # !LIBGO_IS_LINUX
-
-# Define socket sizes and types.
-if LIBGO_IS_LINUX
-syscall_socket_file = go/syscall/socket_linux.go epoll.go
-if LIBGO_IS_PPC64LE
-syscall_socket_type_file = go/syscall/socket_linux_ppc64x_type.go
-else
-if LIBGO_IS_PPC64
-syscall_socket_type_file = go/syscall/socket_linux_ppc64x_type.go
-else
-syscall_socket_type_file = go/syscall/socket_linux_type.go
-endif
-endif
-else
-syscall_socket_type_file =
-if LIBGO_IS_SOLARIS
-syscall_socket_file = go/syscall/socket_solaris.go
-else
-if LIBGO_IS_IRIX
-syscall_socket_file = go/syscall/socket_irix.go
-else
-syscall_socket_file = go/syscall/socket_bsd.go
-endif
-endif
-endif
-
-# Define socket functions.
-if LIBGO_IS_SOLARIS
-syscall_socket_os_file = go/syscall/socket_xnet.go
-else
-syscall_socket_os_file = go/syscall/socket_posix.go
-endif
-
-# Support for uname.
-if LIBGO_IS_SOLARIS
-if LIBGO_IS_386
-# 32-bit Solaris 2/x86 needs _nuname, handled in libcall_solaris_386.go.
-syscall_uname_file =
-else # !LIBGO_IS_386 && LIBGO_IS_SOLARIS
-syscall_uname_file = go/syscall/libcall_uname.go
-endif
-else # !LIBGO_IS_SOLARIS
-syscall_uname_file = go/syscall/libcall_uname.go
-endif
-
-# GNU/Linux specific socket control messages.
-if LIBGO_IS_LINUX
-syscall_sockcmsg_file = go/syscall/sockcmsg_linux.go
-else
-syscall_sockcmsg_file =
-endif
-
-# Support for netlink sockets and messages.
-if LIBGO_IS_LINUX
-syscall_netlink_file = go/syscall/netlink_linux.go
-else
-syscall_netlink_file =
-endif
-
-# GNU/Linux specific socket filters.
-if LIBGO_IS_LINUX
-syscall_lsf_file = go/syscall/lsf_linux.go
-else
-syscall_lsf_file =
-endif
-
-# GNU/Linux specific ustat support.
-if LIBGO_IS_LINUX
-if LIBGO_IS_ARM64
-syscall_ustat_file =
-else
-syscall_ustat_file = go/syscall/libcall_linux_ustat.go
-endif
-else
-syscall_ustat_file =
-endif
-
-# GNU/Linux specific utimesnano support.
-if LIBGO_IS_LINUX
-syscall_utimesnano_file = go/syscall/libcall_linux_utimesnano.go
-else
-syscall_utimesnano_file = go/syscall/libcall_posix_utimesnano.go
-endif
-
-# Test files.
-if LIBGO_IS_LINUX
-syscall_creds_test_file = go/syscall/creds_test.go
-else
-syscall_creds_test_file =
-endif
-
-if LIBGO_IS_LINUX
-syscall_exec_test_file = go/syscall/exec_linux_test.go go/syscall/syscall_linux_test.go
-else
-syscall_exec_test_file =
-endif
-
-if LIBGO_IS_LINUX
-syscall_os_file =
-else
-syscall_os_file = go/syscall/libcall_bsd.go
-endif
-
-go_base_syscall_files = \
-	go/syscall/env_unix.go \
-	go/syscall/syscall_errno.go \
-	go/syscall/libcall_support.go \
-	go/syscall/libcall_posix.go \
-	go/syscall/race0.go \
-	go/syscall/socket.go \
-	go/syscall/sockcmsg_unix.go \
-	go/syscall/str.go \
-	go/syscall/syscall.go \
-	$(syscall_sockcmsg_file) \
-	$(syscall_syscall_file) \
-	$(syscall_exec_file) \
-	$(syscall_exec_os_file) \
-	$(syscall_wait_file) \
-	$(syscall_sleep_file) \
-	$(syscall_errstr_file) \
-	$(syscall_size_file) \
-	$(syscall_os_file) \
-	$(syscall_socket_file) \
-	$(syscall_socket_os_file) \
-	$(syscall_socket_type_file) \
-	$(syscall_uname_file) \
-	$(syscall_netlink_file) \
-	$(syscall_lsf_file) \
-	$(syscall_ustat_file) \
-	$(syscall_utimesnano_file) \
-	$(GO_LIBCALL_OS_FILE) \
-	$(GO_LIBCALL_OS_ARCH_FILE) \
-	$(GO_SYSCALL_OS_FILE) \
-	$(GO_SYSCALL_OS_ARCH_FILE)
-
-go_syscall_files = \
-	$(go_base_syscall_files) \
-	libcalls.go \
-	sysinfo.go \
-	syscall_arch.go
-go_syscall_c_files = \
-	go/syscall/errno.c \
-	go/syscall/signame.c \
-	$(syscall_wait_c_file)
-
-go_syscall_test_files = \
-	$(syscall_creds_test_file) \
-	$(syscall_exec_test_file) \
-	go/syscall/exec_unix_test.go \
-	go/syscall/export_test.go \
-	go/syscall/export_unix_test.go \
-	go/syscall/mmap_unix_test.go \
-	go/syscall/syscall_test.go \
-	go/syscall/syscall_unix_test.go
-
-libcalls.go: s-libcalls; @true
-s-libcalls: libcalls-list go/syscall/mksyscall.awk $(go_base_syscall_files)
-	rm -f libcalls.go.tmp
-	files=`echo $^ | sed -e 's/libcalls-list//' -e 's|[^ ]*go/syscall/mksyscall.awk||'`; \
-	$(AWK) -f $(srcdir)/go/syscall/mksyscall.awk $${files} > libcalls.go.tmp
-	$(SHELL) $(srcdir)/mvifdiff.sh libcalls.go.tmp libcalls.go
-	$(STAMP) $@
-
-libcalls-list: s-libcalls-list; @true
-s-libcalls-list: Makefile
-	rm -f libcalls-list.tmp
-	echo $(go_base_syscall_files) > libcalls-list.tmp
-	$(SHELL) $(srcdir)/mvifdiff.sh libcalls-list.tmp libcalls-list
-	$(STAMP) $@
-
-syscall_arch.go: s-syscall_arch; @true
-s-syscall_arch: Makefile
-	rm -f syscall_arch.go.tmp
-	echo "package syscall" > syscall_arch.go.tmp
-	echo 'const ARCH = "'$(GOARCH)'"' >> syscall_arch.go.tmp
-	echo 'const OS = "'$(GOOS)'"' >> syscall_arch.go.tmp
-	$(SHELL) $(srcdir)/mvifdiff.sh syscall_arch.go.tmp syscall_arch.go
-	$(STAMP) $@
-
-sysinfo.go: s-sysinfo; @true
-s-sysinfo: $(srcdir)/mksysinfo.sh config.h
-	CC="$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(OSCFLAGS) -O" $(SHELL) $(srcdir)/mksysinfo.sh
-	$(SHELL) $(srcdir)/mvifdiff.sh tmp-sysinfo.go sysinfo.go
-	$(STAMP) $@
-
-# The epoll struct has an embedded union and is packed on x86_64,
-# which is too complicated for mksysinfo.sh.  We find the offset of
-# the only field we care about in configure.ac, and generate the
-# struct here.
-epoll.go: s-epoll; @true
-s-epoll: Makefile
-	rm -f epoll.go.tmp
-	echo 'package syscall' > epoll.go.tmp
-	echo 'type EpollEvent struct {' >> epoll.go.tmp
-	echo '	Events uint32' >> epoll.go.tmp
-	case "$(SIZEOF_STRUCT_EPOLL_EVENT),$(STRUCT_EPOLL_EVENT_FD_OFFSET)" in \
-	0,0) echo 1>&2 "*** struct epoll_event data.fd offset unknown"; \
-	   exit 1; ;; \
-	8,4) echo '	Fd int32' >> epoll.go.tmp; ;; \
-	12,4) echo '	Fd int32' >> epoll.go.tmp; \
-	   echo '	Pad [4]byte' >> epoll.go.tmp; ;; \
-	12,8) echo '	Pad [4]byte' >> epoll.go.tmp; \
-	   echo '	Fd int32' >> epoll.go.tmp; ;; \
-	16,8) echo '	Pad [4]byte' >> epoll.go.tmp; \
-	   echo '	Fd int32' >> epoll.go.tmp; \
-	   echo '	Pad2 [4]byte' >> epoll.go.tmp; ;; \
-	*) echo 1>&2 "*** struct epoll_event unsupported"; \
-	   exit 1; ;; \
-	esac
-	echo '}' >> epoll.go.tmp
-	$(SHELL) $(srcdir)/mvifdiff.sh epoll.go.tmp epoll.go
-	$(STAMP) $@
-
-if LIBGO_IS_LINUX
-# os_lib_inotify_lo = os/inotify.lo
-os_lib_inotify_lo =
-else
-os_lib_inotify_lo =
-endif
-
-libgo_go_objs = \
-	bufio.lo \
-	bytes.lo \
-	bytes/index.lo \
-	crypto.lo \
-	encoding.lo \
-	errors.lo \
-	expvar.lo \
-	flag.lo \
-	fmt.lo \
-	hash.lo \
-	html.lo \
-	image.lo \
-	io.lo \
-	log.lo \
-	math.lo \
-	mime.lo \
-	net.lo \
-	os.lo \
-	path.lo \
-	reflect-go.lo \
-	reflect/makefunc_ffi_c.lo \
-	regexp.lo \
-	runtime-go.lo \
-	sort.lo \
-	strconv.lo \
-	strings.lo \
-	strings/index.lo \
-	sync.lo \
-	syscall.lo \
-	syscall/errno.lo \
-	syscall/signame.lo \
-	syscall/wait.lo \
-	testing.lo \
-	time-go.lo \
-	unicode.lo \
-	archive/tar.lo \
-	archive/zip.lo \
-	compress/bzip2.lo \
-	compress/flate.lo \
-	compress/gzip.lo \
-	compress/lzw.lo \
-	compress/zlib.lo \
-	container/heap.lo \
-	container/list.lo \
-	container/ring.lo \
-	crypto/aes.lo \
-	crypto/cipher.lo \
-	crypto/des.lo \
-	crypto/dsa.lo \
-	crypto/ecdsa.lo \
-	crypto/elliptic.lo \
-	crypto/hmac.lo \
-	crypto/md5.lo \
-	crypto/rand.lo \
-	crypto/rc4.lo \
-	crypto/rsa.lo \
-	crypto/sha1.lo \
-	crypto/sha256.lo \
-	crypto/sha512.lo \
-	crypto/subtle.lo \
-	crypto/tls.lo \
-	crypto/x509.lo \
-	crypto/x509/pkix.lo \
-	database/sql.lo \
-	database/sql/driver.lo \
-	debug/dwarf.lo \
-	debug/elf.lo \
-	debug/gosym.lo \
-	debug/macho.lo \
-	debug/pe.lo \
-	debug/plan9obj.lo \
-	encoding/ascii85.lo \
-	encoding/asn1.lo \
-	encoding/base32.lo \
-	encoding/base64.lo \
-	encoding/binary.lo \
-	encoding/csv.lo \
-	encoding/gob.lo \
-	encoding/hex.lo \
-	encoding/json.lo \
-	encoding/pem.lo \
-	encoding/xml.lo \
-	exp/proxy.lo \
-	exp/terminal.lo \
-	html/template.lo \
-	go/ast.lo \
-	go/build.lo \
-	go/constant.lo \
-	go/doc.lo \
-	go/format.lo \
-	go/importer.lo \
-	go/internal/gcimporter.lo \
-	go/internal/gccgoimporter.lo \
-	go/parser.lo \
-	go/printer.lo \
-	go/scanner.lo \
-	go/token.lo \
-	go/types.lo \
-	hash/adler32.lo \
-	hash/crc32.lo \
-	hash/crc64.lo \
-	hash/fnv.lo \
-	net/http/cgi.lo \
-	net/http/cookiejar.lo \
-	net/http/fcgi.lo \
-	net/http/httptest.lo \
-	net/http/httputil.lo \
-	net/http/internal.lo \
-	net/http/pprof.lo \
-	image/color.lo \
-	image/color/palette.lo \
-	image/draw.lo \
-	image/gif.lo \
-	image/internal/imageutil.lo \
-	image/jpeg.lo \
-	image/png.lo \
-	index/suffixarray.lo \
-	internal/format.lo \
-	internal/singleflight.lo \
-	internal/syscall/unix.lo \
-	internal/testenv.lo \
-	internal/trace.lo \
-	io/ioutil.lo \
-	log/syslog.lo \
-	log/syslog/syslog_c.lo \
-	math/big.lo \
-	math/cmplx.lo \
-	math/rand.lo \
-	mime/multipart.lo \
-	mime/quotedprintable.lo \
-	net/http.lo \
-	net/internal/socktest.lo \
-	net/mail.lo \
-	net/rpc.lo \
-	net/smtp.lo \
-	net/textproto.lo \
-	net/url.lo \
-	old/regexp.lo \
-	old/template.lo \
-	os/exec.lo \
-	$(os_lib_inotify_lo) \
-	os/signal.lo \
-	os/user.lo \
-	path/filepath.lo \
-	regexp/syntax.lo \
-	net/rpc/jsonrpc.lo \
-	runtime/debug.lo \
-	runtime/pprof.lo \
-	sync/atomic.lo \
-	sync/atomic_c.lo \
-	text/scanner.lo \
-	text/tabwriter.lo \
-	text/template.lo \
-	text/template/parse.lo \
-	testing/iotest.lo \
-	testing/quick.lo \
-	unicode/utf16.lo \
-	unicode/utf8.lo
-
-libgo_ldflags = \
-	-version-info $(libtool_VERSION) $(PTHREAD_CFLAGS) $(AM_LDFLAGS)
-
-libgo_libadd = \
-	$(libgo_go_objs) ../libbacktrace/libbacktrace.la \
-	$(LIBATOMIC) $(LIBFFI) $(PTHREAD_LIBS) $(MATH_LIBS) $(NET_LIBS)
-
-libgo_la_SOURCES = $(runtime_files)
-libgo_la_LDFLAGS = $(libgo_ldflags)
-libgo_la_LIBADD = $(libgo_libadd)
-
-libgo_llgo_la_SOURCES = $(runtime_files)
-libgo_llgo_la_LDFLAGS = $(libgo_ldflags)
-libgo_llgo_la_LIBADD = $(libgo_libadd)
-
-libgobegin_a_SOURCES = \
-	runtime/go-main.c
-
-libgobegin_llgo_a_SOURCES = \
-	runtime/go-main.c
-
-# Use -fPIC for libgobegin so that it can be put in a PIE.
-libgobegin_a_CFLAGS = $(AM_CFLAGS) -fPIC
-libgobegin_llgo_a_CFLAGS = $(AM_CFLAGS) -fPIC
-
-libgolibbegin_a_SOURCES = \
-	runtime/go-libmain.c
-
-libgolibbegin_a_CFLAGS = $(AM_CFLAGS) -fPIC
-
-libnetgo_a_SOURCES = $(go_netgo_files)
-libnetgo_a_LIBADD = netgo.o
-
-LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
-
-GOCFLAGS = $(CFLAGS)
-AM_GOCFLAGS = $(STRINGOPS_FLAG) $(GO_SPLIT_STACK)
-GOCOMPILE = $(GOC) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_GOCFLAGS) $(GOCFLAGS)
-
-LTGOCOMPILE = $(LIBTOOL) --tag GO --mode=compile $(GOC) $(INCLUDES) \
-	$(AM_GOCFLAGS) $(GOCFLAGS)
-
-GOLINK = $(LIBTOOL) --tag GO --mode-link $(GOC) \
-	$(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_GOCFLAGS) $(LTLDFLAGS) -o $@
-
-# Build the dependencies for a Go package.
-BUILDDEPS = \
-	$(MKDIR_P) $(@D); \
-	$(SHELL) $(srcdir)/godeps.sh `echo $@ | sed -e 's/.dep$$//'` $^ > $@.tmp; \
-	mv -f $@.tmp $@
-
-# Build the .go files for a package, generating a .lo file.
-BUILDPACKAGE = \
-	$(MKDIR_P) $(@D); \
-	files=`echo $^ | sed -e 's/[^ ]*\.gox//g'`; \
-	$(LTGOCOMPILE) -I . -c -fgo-pkgpath=`echo $@ | sed -e 's/.lo$$//' -e 's/-go$$//'` -o $@ $$files
-
-# Build netgo.o.
-BUILDNETGO = \
-	$(MKDIR_P) $(@D); \
-	files=`echo $^ | sed -e 's/[^ ]*\.gox//g'`; \
-	$(GOCOMPILE) -I . -c -fPIC -fgo-pkgpath=net -o $@ $$files
-
-GOTESTFLAGS =
-GOBENCH = 
-
-# Check a package.
-CHECK = \
-	GC="$(GOC) $(GOCFLAGS) $($(subst /,_,$@)_GOCFLAGS) -L `${PWD_COMMAND}` -L `${PWD_COMMAND}`/.libs"; \
-	export GC; \
-	GOLIBS="$(MATH_LIBS) $(NET_LIBS) $(LIBS)"; \
-	export GOLIBS; \
-	RUNTESTFLAGS="$(RUNTESTFLAGS)"; \
-	export RUNTESTFLAGS; \
-	MAKE="$(MAKE)"; \
-	export MAKE; \
-	libgccdir=`${GOC} -print-libgcc-file-name | sed -e 's|/[^/]*$$||'`; \
-	LD_LIBRARY_PATH="`${PWD_COMMAND}`/.libs:$${libgccdir}:${LD_LIBRARY_PATH}"; \
-	LD_LIBRARY_PATH=`echo $${LD_LIBRARY_PATH} | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; \
-	export LD_LIBRARY_PATH; \
-	$(MKDIR_P) $(@D); \
-	rm -f $@-testsum $@-testlog; \
-	if test "$(USE_DEJAGNU)" = "yes"; then \
-	  $(SHELL) $(srcdir)/testsuite/gotest --goarch=$(GOARCH) --goos=$(GOOS) --dejagnu=yes --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" --testname="$(@D)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files); \
-	elif test "$(GOBENCH)" != ""; then \
-	  $(SHELL) $(srcdir)/testsuite/gotest --goarch=$(GOARCH) --goos=$(GOOS) --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" --bench="$(GOBENCH)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files); \
-	else \
-	  if $(SHELL) $(srcdir)/testsuite/gotest --goarch=$(GOARCH) --goos=$(GOOS) --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files) >>$@-testlog 2>&1; then \
-	    echo "PASS: $(@D)" >> $@-testlog; \
-	    echo "PASS: $(@D)"; \
-	    echo "PASS: $(@D)" > $@-testsum; \
-	  else \
-	    echo "FAIL: $(@D)" >> $@-testlog; \
-	    cat $@-testlog; \
-	    echo "FAIL: $(@D)" > $@-testsum; \
-	    exit 1; \
-	  fi; \
-	fi
-
-# Build all packages before checking any.
-CHECK_DEPS = \
-	$(toolexeclibgo_DATA) \
-	$(toolexeclibgoarchive_DATA) \
-	$(toolexeclibgocompress_DATA) \
-	$(toolexeclibgocontainer_DATA) \
-	$(toolexeclibgocrypto_DATA) \
-	$(toolexeclibgodebug_DATA) \
-	$(toolexeclibgoencoding_DATA) \
-	$(toolexeclibgoexp_DATA) \
-	$(toolexeclibgogo_DATA) \
-	$(toolexeclibgohash_DATA) \
-	$(toolexeclibgoimage_DATA) \
-	$(toolexeclibgoindex_DATA) \
-	$(toolexeclibgoio_DATA) \
-	$(toolexeclibgolog_DATA) \
-	$(toolexeclibgomath_DATA) \
-	$(toolexeclibgomime_DATA) \
-	$(toolexeclibgonet_DATA) \
-	$(toolexeclibgonethttp_DATA) \
-	$(toolexeclibgoos_DATA) \
-	$(toolexeclibgopath_DATA) \
-	$(toolexeclibgorpc_DATA) \
-	$(toolexeclibgoruntime_DATA) \
-	$(toolexeclibgosync_DATA) \
-	$(toolexeclibgotesting_DATA) \
-	$(toolexeclibgotext_DATA) \
-	$(toolexeclibgotexttemplate_DATA) \
-	$(toolexeclibgounicode_DATA)
-
-if GOC_IS_LLGO
-CHECK_DEPS += libgo-llgo.la libgobegin-llgo.a
-else
-CHECK_DEPS += libgo.la libgobegin.a
-endif
-
-@go_include@ bufio.lo.dep
-bufio.lo.dep: $(go_bufio_files)
-	$(BUILDDEPS)
-bufio.lo: $(go_bufio_files)
-	$(BUILDPACKAGE)
-bufio/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: bufio/check
-
-@go_include@ bytes.lo.dep
-bytes.lo.dep: $(go_bytes_files)
-	$(BUILDDEPS)
-bytes.lo: $(go_bytes_files)
-	$(BUILDPACKAGE)
-bytes/index.lo: $(go_bytes_c_files)
-	@$(MKDIR_P) bytes
-	$(LTCOMPILE) -c -o bytes/index.lo $(srcdir)/go/bytes/indexbyte.c
-bytes/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: bytes/check
-
-@go_include@ crypto.lo.dep
-crypto.lo.dep: $(go_crypto_files)
-	$(BUILDDEPS)
-crypto.lo: $(go_crypto_files)
-	$(BUILDPACKAGE)
-crypto/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/check
-
-@go_include@ encoding.lo.dep
-encoding.lo.dep: $(go_encoding_files)
-	$(BUILDDEPS)
-encoding.lo: $(go_encoding_files)
-	$(BUILDPACKAGE)
-encoding/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/check
-
-@go_include@ errors.lo.dep
-errors.lo.dep: $(go_errors_files)
-	$(BUILDDEPS)
-errors.lo: $(go_errors_files)
-	$(BUILDPACKAGE)
-errors/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: errors/check
-
-@go_include@ expvar.lo.dep
-expvar.lo.dep: $(go_expvar_files)
-	$(BUILDDEPS)
-expvar.lo: $(go_expvar_files)
-	$(BUILDPACKAGE)
-expvar/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: expvar/check
-
-@go_include@ flag.lo.dep
-flag.lo.dep: $(go_flag_files)
-	$(BUILDDEPS)
-flag.lo: $(go_flag_files)
-	$(BUILDPACKAGE)
-flag/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: flag/check
-
-@go_include@ fmt.lo.dep
-fmt.lo.dep: $(go_fmt_files)
-	$(BUILDDEPS)
-fmt.lo: $(go_fmt_files)
-	$(BUILDPACKAGE)
-fmt/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: fmt/check
-
-@go_include@ hash.lo.dep
-hash.lo.dep: $(go_hash_files)
-	$(BUILDDEPS)
-hash.lo: $(go_hash_files)
-	$(BUILDPACKAGE)
-hash/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: hash/check
-
-@go_include@ html.lo.dep
-html.lo.dep: $(go_html_files)
-	$(BUILDDEPS)
-html.lo: $(go_html_files)
-	$(BUILDPACKAGE)
-html/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: html/check
-
-@go_include@ image.lo.dep
-image.lo.dep: $(go_image_files)
-	$(BUILDDEPS)
-image.lo: $(go_image_files)
-	$(BUILDPACKAGE)
-image/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/check
-
-@go_include@ io.lo.dep
-io.lo.dep: $(go_io_files)
-	$(BUILDDEPS)
-io.lo: $(go_io_files)
-	$(BUILDPACKAGE)
-io/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: io/check
-
-@go_include@ log.lo.dep
-log.lo.dep: $(go_log_files)
-	$(BUILDDEPS)
-log.lo: $(go_log_files)
-	$(BUILDPACKAGE)
-log/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: log/check
-
-@go_include@ math.lo.dep
-math.lo.dep: $(go_math_files)
-	$(BUILDDEPS)
-math.lo: $(go_math_files)
-	$(MKDIR_P) $(@D)
-	files=`echo $^ | sed -e 's/[^ ]*\.gox//g'`; \
-	$(LTGOCOMPILE) $(MATH_FLAG) -I . -c -fgo-pkgpath=math -o $@ $$files
-math/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: math/check
-
-@go_include@ mime.lo.dep
-mime.lo.dep: $(go_mime_files)
-	$(BUILDDEPS)
-mime.lo: $(go_mime_files)
-	$(BUILDPACKAGE)
-mime/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: mime/check
-
-@go_include@ net.lo.dep
-net.lo.dep: $(go_net_files)
-	$(BUILDDEPS)
-net.lo: $(go_net_files)
-	$(BUILDPACKAGE)
-net/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/check
-
-@go_include@ netgo.o.dep
-netgo.o.dep: $(go_netgo_files)
-	$(BUILDDEPS)
-netgo.o: $(go_netgo_files)
-	$(BUILDNETGO)
-
-@go_include@ os.lo.dep
-os.lo.dep: $(go_os_files)
-	$(BUILDDEPS)
-os.lo: $(go_os_files)
-	$(BUILDPACKAGE)
-os/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: os/check
-
-@go_include@ path.lo.dep
-path.lo.dep: $(go_path_files)
-	$(BUILDDEPS)
-path.lo: $(go_path_files)
-	$(BUILDPACKAGE)
-path/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: path/check
-
-@go_include@ reflect-go.lo.dep
-reflect-go.lo.dep: $(go_reflect_files)
-	$(BUILDDEPS)
-reflect-go.lo: $(go_reflect_files)
-	$(BUILDPACKAGE)
-reflect/check: $(CHECK_DEPS)
-	@$(CHECK)
-reflect/makefunc_ffi_c.lo: $(go_reflect_makefunc_c_file)
-	@$(MKDIR_P) reflect
-	$(LTCOMPILE) -c -o $@ $<
-.PHONY: reflect/check
-
-@go_include@ regexp.lo.dep
-regexp.lo.dep: $(go_regexp_files)
-	$(BUILDDEPS)
-regexp.lo: $(go_regexp_files)
-	$(BUILDPACKAGE)
-regexp/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: regexp/check
-
-@go_include@ runtime-go.lo.dep
-runtime-go.lo.dep: $(go_runtime_files)
-	$(BUILDDEPS)
-runtime-go.lo: $(go_runtime_files)
-	$(BUILDPACKAGE)
-runtime/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: runtime/check
-
-@go_include@ sort.lo.dep
-sort.lo.dep: $(go_sort_files)
-	$(BUILDDEPS)
-sort.lo: $(go_sort_files)
-	$(BUILDPACKAGE)
-sort/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: sort/check
-
-@go_include@ strconv.lo.dep
-strconv.lo.dep: $(go_strconv_files)
-	$(BUILDDEPS)
-strconv.lo: $(go_strconv_files)
-	$(BUILDPACKAGE)
-strconv/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: strconv/check
-
-@go_include@ strings.lo.dep
-strings.lo.dep: $(go_strings_files)
-	$(BUILDDEPS)
-strings.lo: $(go_strings_files)
-	$(BUILDPACKAGE)
-strings/index.lo: $(go_strings_c_files)
-	@$(MKDIR_P) strings
-	$(LTCOMPILE) -c -o strings/index.lo $(srcdir)/go/strings/indexbyte.c
-strings/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: strings/check
-
-@go_include@ sync.lo.dep
-sync.lo.dep: $(go_sync_files)
-	$(BUILDDEPS)
-sync.lo: $(go_sync_files)
-	$(BUILDPACKAGE)
-sync/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: sync/check
-
-@go_include@ testing.lo.dep
-testing.lo.dep: $(go_testing_files)
-	$(BUILDDEPS)
-testing.lo: $(go_testing_files)
-	$(BUILDPACKAGE)
-testing/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: testing/check
-
-@go_include@ time-go.lo.dep
-time-go.lo.dep: $(go_time_files)
-	$(BUILDDEPS)
-time-go.lo: $(go_time_files)
-	$(BUILDPACKAGE)
-time/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: time/check
-
-@go_include@ unicode.lo.dep
-unicode.lo.dep: $(go_unicode_files)
-	$(BUILDDEPS)
-unicode.lo: $(go_unicode_files)
-	$(BUILDPACKAGE)
-unicode/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: unicode/check
-
-@go_include@ archive/tar.lo.dep
-archive/tar.lo.dep: $(go_archive_tar_files)
-	$(BUILDDEPS)
-archive/tar.lo: $(go_archive_tar_files)
-	$(BUILDPACKAGE)
-archive/tar/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: archive/tar/check
-
-@go_include@ archive/zip.lo.dep
-archive/zip.lo.dep: $(go_archive_zip_files)
-	$(BUILDDEPS)
-archive/zip.lo: $(go_archive_zip_files)
-	$(BUILDPACKAGE)
-archive/zip/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: archive/zip/check
-
-@go_include@ compress/bzip2.lo.dep
-compress/bzip2.lo.dep: $(go_compress_bzip2_files)
-	$(BUILDDEPS)
-compress/bzip2.lo: $(go_compress_bzip2_files)
-	$(BUILDPACKAGE)
-compress/bzip2/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: compress/bzip2/check
-
-@go_include@ compress/flate.lo.dep
-compress/flate.lo.dep: $(go_compress_flate_files)
-	$(BUILDDEPS)
-compress/flate.lo: $(go_compress_flate_files)
-	$(BUILDPACKAGE)
-compress/flate/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: compress/flate/check
-
-@go_include@ compress/gzip.lo.dep
-compress/gzip.lo.dep: $(go_compress_gzip_files)
-	$(BUILDDEPS)
-compress/gzip.lo: $(go_compress_gzip_files)
-	$(BUILDPACKAGE)
-compress/gzip/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: compress/gzip/check
-
-@go_include@ compress/lzw.lo.dep
-compress/lzw.lo.dep: $(go_compress_lzw_files)
-	$(BUILDDEPS)
-compress/lzw.lo: $(go_compress_lzw_files)
-	$(BUILDPACKAGE)
-compress/lzw/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: compress/lzw/check
-
-@go_include@ compress/zlib.lo.dep
-compress/zlib.lo.dep: $(go_compress_zlib_files)
-	$(BUILDDEPS)
-compress/zlib.lo: $(go_compress_zlib_files)
-	$(BUILDPACKAGE)
-compress/zlib/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: compress/zlib/check
-
-@go_include@ container/heap.lo.dep
-container/heap.lo.dep: $(go_container_heap_files)
-	$(BUILDDEPS)
-container/heap.lo: $(go_container_heap_files)
-	$(BUILDPACKAGE)
-container/heap/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: container/heap/check
-
-@go_include@ container/list.lo.dep
-container/list.lo.dep: $(go_container_list_files)
-	$(BUILDDEPS)
-container/list.lo: $(go_container_list_files)
-	$(BUILDPACKAGE)
-container/list/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: container/list/check
-
-@go_include@ container/ring.lo.dep
-container/ring.lo.dep: $(go_container_ring_files)
-	$(BUILDDEPS)
-container/ring.lo: $(go_container_ring_files)
-	$(BUILDPACKAGE)
-container/ring/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: container/ring/check
-
-@go_include@ crypto/aes.lo.dep
-crypto/aes.lo.dep: $(go_crypto_aes_files)
-	$(BUILDDEPS)
-crypto/aes.lo: $(go_crypto_aes_files)
-	$(BUILDPACKAGE)
-crypto/aes/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/aes/check
-
-@go_include@ crypto/cipher.lo.dep
-crypto/cipher.lo.dep: $(go_crypto_cipher_files)
-	$(BUILDDEPS)
-crypto/cipher.lo: $(go_crypto_cipher_files)
-	$(BUILDPACKAGE)
-crypto/cipher/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/cipher/check
-
-@go_include@ crypto/des.lo.dep
-crypto/des.lo.dep: $(go_crypto_des_files)
-	$(BUILDDEPS)
-crypto/des.lo: $(go_crypto_des_files)
-	$(BUILDPACKAGE)
-crypto/des/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/des/check
-
-@go_include@ crypto/dsa.lo.dep
-crypto/dsa.lo.dep: $(go_crypto_dsa_files)
-	$(BUILDDEPS)
-crypto/dsa.lo: $(go_crypto_dsa_files)
-	$(BUILDPACKAGE)
-crypto/dsa/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/dsa/check
-
-@go_include@ crypto/ecdsa.lo.dep
-crypto/ecdsa.lo.dep: $(go_crypto_ecdsa_files)
-	$(BUILDDEPS)
-crypto/ecdsa.lo: $(go_crypto_ecdsa_files)
-	$(BUILDPACKAGE)
-crypto/ecdsa/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/ecdsa/check
-
-@go_include@ crypto/elliptic.lo.dep
-crypto/elliptic.lo.dep: $(go_crypto_elliptic_files)
-	$(BUILDDEPS)
-crypto/elliptic.lo: $(go_crypto_elliptic_files)
-	$(BUILDPACKAGE)
-crypto/elliptic/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/elliptic/check
-
-@go_include@ crypto/hmac.lo.dep
-crypto/hmac.lo.dep: $(go_crypto_hmac_files)
-	$(BUILDDEPS)
-crypto/hmac.lo: $(go_crypto_hmac_files)
-	$(BUILDPACKAGE)
-crypto/hmac/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/hmac/check
-
-@go_include@ crypto/md5.lo.dep
-crypto/md5.lo.dep: $(go_crypto_md5_files)
-	$(BUILDDEPS)
-crypto/md5.lo: $(go_crypto_md5_files)
-	$(BUILDPACKAGE)
-crypto/md5/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/md5/check
-
-@go_include@ crypto/rand.lo.dep
-crypto/rand.lo.dep: $(go_crypto_rand_files)
-	$(BUILDDEPS)
-crypto/rand.lo: $(go_crypto_rand_files)
-	$(BUILDPACKAGE)
-crypto/rand/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/rand/check
-
-@go_include@ crypto/rc4.lo.dep
-crypto/rc4.lo.dep: $(go_crypto_rc4_files)
-	$(BUILDDEPS)
-crypto/rc4.lo: $(go_crypto_rc4_files)
-	$(BUILDPACKAGE)
-crypto/rc4/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/rc4/check
-
-@go_include@ crypto/rsa.lo.dep
-crypto/rsa.lo.dep: $(go_crypto_rsa_files)
-	$(BUILDDEPS)
-crypto/rsa.lo: $(go_crypto_rsa_files)
-	$(BUILDPACKAGE)
-crypto/rsa/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/rsa/check
-
-@go_include@ crypto/sha1.lo.dep
-crypto/sha1.lo.dep: $(go_crypto_sha1_files)
-	$(BUILDDEPS)
-crypto/sha1.lo: $(go_crypto_sha1_files)
-	$(BUILDPACKAGE)
-crypto/sha1/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/sha1/check
-
-@go_include@ crypto/sha256.lo.dep
-crypto/sha256.lo.dep: $(go_crypto_sha256_files)
-	$(BUILDDEPS)
-crypto/sha256.lo: $(go_crypto_sha256_files)
-	$(BUILDPACKAGE)
-crypto/sha256/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/sha256/check
-
-@go_include@ crypto/sha512.lo.dep
-crypto/sha512.lo.dep: $(go_crypto_sha512_files)
-	$(BUILDDEPS)
-crypto/sha512.lo: $(go_crypto_sha512_files)
-	$(BUILDPACKAGE)
-crypto/sha512/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/sha512/check
-
-@go_include@ crypto/subtle.lo.dep
-crypto/subtle.lo.dep: $(go_crypto_subtle_files)
-	$(BUILDDEPS)
-crypto/subtle.lo: $(go_crypto_subtle_files)
-	$(BUILDPACKAGE)
-crypto/subtle/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/subtle/check
-
-@go_include@ crypto/tls.lo.dep
-crypto/tls.lo.dep: $(go_crypto_tls_files)
-	$(BUILDDEPS)
-crypto/tls.lo: $(go_crypto_tls_files)
-	$(BUILDPACKAGE)
-crypto/tls/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/tls/check
-
-@go_include@ crypto/x509.lo.dep
-crypto/x509.lo.dep: $(go_crypto_x509_files)
-	$(BUILDDEPS)
-crypto/x509.lo: $(go_crypto_x509_files)
-	$(BUILDPACKAGE)
-crypto/x509/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/x509/check
-
-@go_include@ crypto/x509/pkix.lo.dep
-crypto/x509/pkix.lo.dep: $(go_crypto_x509_pkix_files)
-	$(BUILDDEPS)
-crypto/x509/pkix.lo: $(go_crypto_x509_pkix_files)
-	$(BUILDPACKAGE)
-crypto/x509/pkix/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/x509/pkix/check
-
-@go_include@ database/sql.lo.dep
-database/sql.lo.dep: $(go_database_sql_files)
-	$(BUILDDEPS)
-database/sql.lo: $(go_database_sql_files)
-	$(BUILDPACKAGE)
-database/sql/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: database/sql/check
-
-@go_include@ database/sql/driver.lo.dep
-database/sql/driver.lo.dep: $(go_database_sql_driver_files)
-	$(BUILDDEPS)
-database/sql/driver.lo: $(go_database_sql_driver_files)
-	$(BUILDPACKAGE)
-database/sql/driver/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: database/sql/driver/check
-
-@go_include@ debug/dwarf.lo.dep
-debug/dwarf.lo.dep: $(go_debug_dwarf_files)
-	$(BUILDDEPS)
-debug/dwarf.lo: $(go_debug_dwarf_files)
-	$(BUILDPACKAGE)
-debug/dwarf/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: debug/dwarf/check
-
-@go_include@ debug/elf.lo.dep
-debug/elf.lo.dep: $(go_debug_elf_files)
-	$(BUILDDEPS)
-debug/elf.lo: $(go_debug_elf_files)
-	$(BUILDPACKAGE)
-debug/elf/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: debug/elf/check
-
-@go_include@ debug/gosym.lo.dep
-debug/gosym.lo.dep: $(go_debug_gosym_files)
-	$(BUILDDEPS)
-debug/gosym.lo: $(go_debug_gosym_files)
-	$(BUILDPACKAGE)
-debug/gosym/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: debug/gosym/check
-
-@go_include@ debug/macho.lo.dep
-debug/macho.lo.dep: $(go_debug_macho_files)
-	$(BUILDDEPS)
-debug/macho.lo: $(go_debug_macho_files)
-	$(BUILDPACKAGE)
-debug/macho/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: debug/macho/check
-
-@go_include@ debug/pe.lo.dep
-debug/pe.lo.dep: $(go_debug_pe_files)
-	$(BUILDDEPS)
-debug/pe.lo: $(go_debug_pe_files)
-	$(BUILDPACKAGE)
-debug/pe/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: debug/pe/check
-
-@go_include@ debug/plan9obj.lo.dep
-debug/plan9obj.lo.dep: $(go_debug_plan9obj_files)
-	$(BUILDDEPS)
-debug/plan9obj.lo: $(go_debug_plan9obj_files)
-	$(BUILDPACKAGE)
-debug/plan9obj/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: debug/plan9obj/check
-
-@go_include@ encoding/asn1.lo.dep
-encoding/asn1.lo.dep: $(go_encoding_asn1_files)
-	$(BUILDDEPS)
-encoding/asn1.lo: $(go_encoding_asn1_files)
-	$(BUILDPACKAGE)
-encoding/asn1/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/asn1/check
-
-@go_include@ encoding/ascii85.lo.dep
-encoding/ascii85.lo.dep: $(go_encoding_ascii85_files)
-	$(BUILDDEPS)
-encoding/ascii85.lo: $(go_encoding_ascii85_files)
-	$(BUILDPACKAGE)
-encoding/ascii85/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/ascii85/check
-
-@go_include@ encoding/base32.lo.dep
-encoding/base32.lo.dep: $(go_encoding_base32_files)
-	$(BUILDDEPS)
-encoding/base32.lo: $(go_encoding_base32_files)
-	$(BUILDPACKAGE)
-encoding/base32/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/base32/check
-
-@go_include@ encoding/base64.lo.dep
-encoding/base64.lo.dep: $(go_encoding_base64_files)
-	$(BUILDDEPS)
-encoding/base64.lo: $(go_encoding_base64_files)
-	$(BUILDPACKAGE)
-encoding/base64/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/base64/check
-
-@go_include@ encoding/binary.lo.dep
-encoding/binary.lo.dep: $(go_encoding_binary_files)
-	$(BUILDDEPS)
-encoding/binary.lo: $(go_encoding_binary_files)
-	$(BUILDPACKAGE)
-encoding/binary/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/binary/check
-
-@go_include@ encoding/csv.lo.dep
-encoding/csv.lo.dep: $(go_encoding_csv_files)
-	$(BUILDDEPS)
-encoding/csv.lo: $(go_encoding_csv_files)
-	$(BUILDPACKAGE)
-encoding/csv/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/csv/check
-
-@go_include@ encoding/gob.lo.dep
-encoding/gob.lo.dep: $(go_encoding_gob_files)
-	$(BUILDDEPS)
-encoding/gob.lo: $(go_encoding_gob_files)
-	$(BUILDPACKAGE)
-encoding/gob/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/gob/check
-
-@go_include@ encoding/hex.lo.dep
-encoding/hex.lo.dep: $(go_encoding_hex_files)
-	$(BUILDDEPS)
-encoding/hex.lo: $(go_encoding_hex_files)
-	$(BUILDPACKAGE)
-encoding/hex/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/hex/check
-
-@go_include@ encoding/json.lo.dep
-encoding/json.lo.dep: $(go_encoding_json_files)
-	$(BUILDDEPS)
-encoding/json.lo: $(go_encoding_json_files)
-	$(BUILDPACKAGE)
-encoding/json/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/json/check
-
-@go_include@ encoding/pem.lo.dep
-encoding/pem.lo.dep: $(go_encoding_pem_files)
-	$(BUILDDEPS)
-encoding/pem.lo: $(go_encoding_pem_files)
-	$(BUILDPACKAGE)
-encoding/pem/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/pem/check
-
-@go_include@ encoding/xml.lo.dep
-encoding/xml.lo.dep: $(go_encoding_xml_files)
-	$(BUILDDEPS)
-encoding/xml.lo: $(go_encoding_xml_files)
-	$(BUILDPACKAGE)
-encoding/xml/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/xml/check
-
-@go_include@ exp/proxy.lo.dep
-exp/proxy.lo.dep: $(go_exp_proxy_files)
-	$(BUILDDEPS)
-exp/proxy.lo: $(go_exp_proxy_files)
-	$(BUILDPACKAGE)
-exp/proxy/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: exp/proxy/check
-
-@go_include@ exp/terminal.lo.dep
-exp/terminal.lo.dep: $(go_exp_terminal_files)
-	$(BUILDDEPS)
-exp/terminal.lo: $(go_exp_terminal_files)
-	$(BUILDPACKAGE)
-exp/terminal/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: exp/terminal/check
-
-@go_include@ html/template.lo.dep
-html/template.lo.dep: $(go_html_template_files)
-	$(BUILDDEPS)
-html/template.lo: $(go_html_template_files)
-	$(BUILDPACKAGE)
-html/template/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: html/template/check
-
-@go_include@ go/ast.lo.dep
-go/ast.lo.dep: $(go_go_ast_files)
-	$(BUILDDEPS)
-go/ast.lo: $(go_go_ast_files)
-	$(BUILDPACKAGE)
-go/ast/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/ast/check
-
-@go_include@ go/build.lo.dep
-go/build.lo.dep: $(go_go_build_files)
-	$(BUILDDEPS)
-go/build.lo: $(go_go_build_files)
-	$(BUILDPACKAGE)
-go/build/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/build/check
-
-@go_include@ go/constant.lo.dep
-go/constant.lo.dep: $(go_go_constant_files)
-	$(BUILDDEPS)
-go/constant.lo: $(go_go_constant_files)
-	$(BUILDPACKAGE)
-go/constant/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/constant/check
-
-@go_include@ go/doc.lo.dep
-go/doc.lo.dep: $(go_go_doc_files)
-	$(BUILDDEPS)
-go/doc.lo: $(go_go_doc_files)
-	$(BUILDPACKAGE)
-go/doc/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/doc/check
-
-@go_include@ go/format.lo.dep
-go/format.lo.dep: $(go_go_format_files)
-	$(BUILDDEPS)
-go/format.lo: $(go_go_format_files)
-	$(BUILDPACKAGE)
-go/format/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/format/check
-
-@go_include@ go/importer.lo.dep
-go/importer.lo.dep: $(go_go_importer_files)
-	$(BUILDDEPS)
-go/importer.lo: $(go_go_importer_files)
-	$(BUILDPACKAGE)
-go/importer/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/importer/check
-
-@go_include@ go/parser.lo.dep
-go/parser.lo.dep: $(go_go_parser_files)
-	$(BUILDDEPS)
-go/parser.lo: $(go_go_parser_files)
-	$(BUILDPACKAGE)
-go/parser/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/parser/check
-
-@go_include@ go/printer.lo.dep
-go/printer.lo.dep: $(go_go_printer_files)
-	$(BUILDDEPS)
-go/printer.lo: $(go_go_printer_files)
-	$(BUILDPACKAGE)
-go/printer/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/printer/check
-
-@go_include@ go/scanner.lo.dep
-go/scanner.lo.dep: $(go_go_scanner_files)
-	$(BUILDDEPS)
-go/scanner.lo: $(go_go_scanner_files)
-	$(BUILDPACKAGE)
-go/scanner/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/scanner/check
-
-@go_include@ go/token.lo.dep
-go/token.lo.dep: $(go_go_token_files)
-	$(BUILDDEPS)
-go/token.lo: $(go_go_token_files)
-	$(BUILDPACKAGE)
-go/token/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/token/check
-
-@go_include@ go/types.lo.dep
-go/types.lo.dep: $(go_go_types_files)
-	$(BUILDDEPS)
-go/types.lo: $(go_go_types_files)
-	$(BUILDPACKAGE)
-go/types/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/types/check
-
-@go_include@ go/internal/gcimporter.lo.dep
-go/internal/gcimporter.lo.dep: $(go_go_internal_gcimporter_files)
-	$(BUILDDEPS)
-go/internal/gcimporter.lo: $(go_go_internal_gcimporter_files)
-	$(BUILDPACKAGE)
-go/internal/gcimporter/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/internal/gcimporter/check
-
-@go_include@ go/internal/gccgoimporter.lo.dep
-go/internal/gccgoimporter.lo.dep: $(go_go_internal_gccgoimporter_files)
-	$(BUILDDEPS)
-go/internal/gccgoimporter.lo: $(go_go_internal_gccgoimporter_files)
-	$(BUILDPACKAGE)
-go/internal/gccgoimporter/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/internal/gccgoimporter/check
-
-@go_include@ hash/adler32.lo.dep
-hash/adler32.lo.dep: $(go_hash_adler32_files)
-	$(BUILDDEPS)
-hash/adler32.lo: $(go_hash_adler32_files)
-	$(BUILDPACKAGE)
-hash/adler32/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: hash/adler32/check
-
-@go_include@ hash/crc32.lo.dep
-hash/crc32.lo.dep: $(go_hash_crc32_files)
-	$(BUILDDEPS)
-hash/crc32.lo: $(go_hash_crc32_files)
-	$(BUILDPACKAGE)
-hash/crc32/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: hash/crc32/check
-
-@go_include@ hash/crc64.lo.dep
-hash/crc64.lo.dep: $(go_hash_crc64_files)
-	$(BUILDDEPS)
-hash/crc64.lo: $(go_hash_crc64_files)
-	$(BUILDPACKAGE)
-hash/crc64/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: hash/crc64/check
-
-@go_include@ hash/fnv.lo.dep
-hash/fnv.lo.dep: $(go_hash_fnv_files)
-	$(BUILDDEPS)
-hash/fnv.lo: $(go_hash_fnv_files)
-	$(BUILDPACKAGE)
-hash/fnv/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: hash/fnv/check
-
-@go_include@ image/color.lo.dep
-image/color.lo.dep: $(go_image_color_files)
-	$(BUILDDEPS)
-image/color.lo: $(go_image_color_files)
-	$(BUILDPACKAGE)
-image/color/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/color/check
-
-@go_include@ image/color/palette.lo.dep
-image/color/palette.lo.dep: $(go_image_color_palette_files)
-	$(BUILDDEPS)
-image/color/palette.lo: $(go_image_color_palette_files)
-	$(BUILDPACKAGE)
-image/color/palette/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/color/palette/check
-
-@go_include@ image/draw.lo.dep
-image/draw.lo.dep: $(go_image_draw_files)
-	$(BUILDDEPS)
-image/draw.lo: $(go_image_draw_files)
-	$(BUILDPACKAGE)
-image/draw/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/draw/check
-
-@go_include@ image/gif.lo.dep
-image/gif.lo.dep: $(go_image_gif_files)
-	$(BUILDDEPS)
-image/gif.lo: $(go_image_gif_files)
-	$(BUILDPACKAGE)
-image/gif/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/gif/check
-
-@go_include@ image/internal/imageutil.lo.dep
-image/internal/imageutil.lo.dep: $(go_image_internal_imageutil_files)
-	$(BUILDDEPS)
-image/internal/imageutil.lo: $(go_image_internal_imageutil_files)
-	$(BUILDPACKAGE)
-image/internal/imageutil/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/internal/imageutil/check
-
-@go_include@ image/jpeg.lo.dep
-image/jpeg.lo.dep: $(go_image_jpeg_files)
-	$(BUILDDEPS)
-image/jpeg.lo: $(go_image_jpeg_files)
-	$(BUILDPACKAGE)
-image/jpeg/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/jpeg/check
-
-@go_include@ image/png.lo.dep
-image/png.lo.dep: $(go_image_png_files)
-	$(BUILDDEPS)
-image/png.lo: $(go_image_png_files)
-	$(BUILDPACKAGE)
-image/png/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/png/check
-
-@go_include@ index/suffixarray.lo.dep
-index/suffixarray.lo.dep: $(go_index_suffixarray_files)
-	$(BUILDDEPS)
-index/suffixarray.lo: $(go_index_suffixarray_files)
-	$(BUILDPACKAGE)
-index/suffixarray/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: index/suffixarray/check
-
-@go_include@ internal/format.lo.dep
-internal/format.lo.dep: $(go_internal_format_files)
-	$(BUILDDEPS)
-internal/format.lo: $(go_internal_format_files)
-	$(BUILDPACKAGE)
-internal/format/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: internal/format/check
-
-@go_include@ internal/singleflight.lo.dep
-internal/singleflight.lo.dep: $(go_internal_singleflight_files)
-	$(BUILDDEPS)
-internal/singleflight.lo: $(go_internal_singleflight_files)
-	$(BUILDPACKAGE)
-internal/singleflight/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: internal/singleflight/check
-
-@go_include@ internal/syscall/unix.lo.dep
-internal/syscall/unix.lo.dep: $(go_internal_syscall_unix_files)
-	$(BUILDDEPS)
-internal/syscall/unix.lo: $(go_internal_syscall_unix_files)
-	$(BUILDPACKAGE)
-internal/syscall/unix/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: internal/syscall/unix/check
-
-@go_include@ internal/testenv.lo.dep
-internal/testenv.lo.dep: $(go_internal_testenv_files)
-	$(BUILDDEPS)
-internal/testenv.lo: $(go_internal_testenv_files)
-	$(BUILDPACKAGE)
-internal/testenv/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: internal/testenv/check
-
-@go_include@ internal/trace.lo.dep
-internal/trace.lo.dep: $(go_internal_trace_files)
-	$(BUILDDEPS)
-internal/trace.lo: $(go_internal_trace_files)
-	$(BUILDPACKAGE)
-internal/trace/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: internal/trace/check
-
-@go_include@ io/ioutil.lo.dep
-io/ioutil.lo.dep: $(go_io_ioutil_files)
-	$(BUILDDEPS)
-io/ioutil.lo: $(go_io_ioutil_files)
-	$(BUILDPACKAGE)
-io/ioutil/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: io/ioutil/check
-
-@go_include@ log/syslog.lo.dep
-log/syslog.lo.dep: $(go_log_syslog_files)
-	$(BUILDDEPS)
-log/syslog.lo: $(go_log_syslog_files)
-	$(BUILDPACKAGE)
-log/syslog/syslog_c.lo: $(go_syslog_c_files) log/syslog.lo
-	@$(MKDIR_P) log/syslog
-	$(LTCOMPILE) -c -o $@ $(srcdir)/go/log/syslog/syslog_c.c
-log/syslog/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: log/syslog/check
-
-@go_include@ math/big.lo.dep
-math/big.lo.dep: $(go_math_big_files)
-	$(BUILDDEPS)
-math/big.lo: $(go_math_big_files)
-	$(BUILDPACKAGE)
-math/big/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: math/big/check
-
-@go_include@ math/cmplx.lo.dep
-math/cmplx.lo.dep: $(go_math_cmplx_files)
-	$(BUILDDEPS)
-math/cmplx.lo: $(go_math_cmplx_files)
-	$(BUILDPACKAGE)
-math/cmplx/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: math/cmplx/check
-
-@go_include@ math/rand.lo.dep
-math/rand.lo.dep: $(go_math_rand_files)
-	$(BUILDDEPS)
-math/rand.lo: $(go_math_rand_files)
-	$(BUILDPACKAGE)
-math/rand/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: math/rand/check
-
-@go_include@ mime/multipart.lo.dep
-mime/multipart.lo.dep: $(go_mime_multipart_files)
-	$(BUILDDEPS)
-mime/multipart.lo: $(go_mime_multipart_files)
-	$(BUILDPACKAGE)
-mime/multipart/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: mime/multipart/check
-
-@go_include@ mime/quotedprintable.lo.dep
-mime/quotedprintable.lo.dep: $(go_mime_quotedprintable_files)
-	$(BUILDDEPS)
-mime/quotedprintable.lo: $(go_mime_quotedprintable_files)
-	$(BUILDPACKAGE)
-mime/quotedprintable/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: mime/quotedprintable/check
-
-@go_include@ net/http.lo.dep
-net/http.lo.dep: $(go_net_http_files)
-	$(BUILDDEPS)
-net/http.lo: $(go_net_http_files)
-	$(BUILDPACKAGE)
-net/http/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/http/check
-
-@go_include@ net/mail.lo.dep
-net/mail.lo.dep: $(go_net_mail_files)
-	$(BUILDDEPS)
-net/mail.lo: $(go_net_mail_files)
-	$(BUILDPACKAGE)
-net/mail/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/mail/check
-
-@go_include@ net/rpc.lo.dep
-net/rpc.lo.dep: $(go_net_rpc_files)
-	$(BUILDDEPS)
-net/rpc.lo: $(go_net_rpc_files)
-	$(BUILDPACKAGE)
-net/rpc/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/rpc/check
-
-@go_include@ net/smtp.lo.dep
-net/smtp.lo.dep: $(go_net_smtp_files)
-	$(BUILDDEPS)
-net/smtp.lo: $(go_net_smtp_files)
-	$(BUILDPACKAGE)
-net/smtp/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/smtp/check
-
-@go_include@ net/url.lo.dep
-net/url.lo.dep: $(go_net_url_files)
-	$(BUILDDEPS)
-net/url.lo: $(go_net_url_files)
-	$(BUILDPACKAGE)
-net/url/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/url/check
-
-@go_include@ net/textproto.lo.dep
-net/textproto.lo.dep: $(go_net_textproto_files)
-	$(BUILDDEPS)
-net/textproto.lo: $(go_net_textproto_files)
-	$(BUILDPACKAGE)
-net/textproto/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/textproto/check
-
-@go_include@ net/http/cgi.lo.dep
-net/http/cgi.lo.dep: $(go_net_http_cgi_files)
-	$(BUILDDEPS)
-net/http/cgi.lo: $(go_net_http_cgi_files)
-	$(BUILDPACKAGE)
-net/http/cgi/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/http/cgi/check
-
-@go_include@ net/http/cookiejar.lo.dep
-net/http/cookiejar.lo.dep: $(go_net_http_cookiejar_files)
-	$(BUILDDEPS)
-net/http/cookiejar.lo: $(go_net_http_cookiejar_files)
-	$(BUILDPACKAGE)
-net/http/cookiejar/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/http/cookiejar/check
-
-@go_include@ net/http/fcgi.lo.dep
-net/http/fcgi.lo.dep: $(go_net_http_fcgi_files)
-	$(BUILDDEPS)
-net/http/fcgi.lo: $(go_net_http_fcgi_files)
-	$(BUILDPACKAGE)
-net/http/fcgi/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/http/fcgi/check
-
-@go_include@ net/http/httptest.lo.dep
-net/http/httptest.lo.dep: $(go_net_http_httptest_files)
-	$(BUILDDEPS)
-net/http/httptest.lo: $(go_net_http_httptest_files)
-	$(BUILDPACKAGE)
-net/http/httptest/check: $(check_deps)
-	@$(CHECK)
-.PHONY: net/http/httptest/check
-
-@go_include@ net/http/httputil.lo.dep
-net/http/httputil.lo.dep: $(go_net_http_httputil_files)
-	$(BUILDDEPS)
-net/http/httputil.lo: $(go_net_http_httputil_files)
-	$(BUILDPACKAGE)
-net/http/httputil/check: $(check_deps)
-	@$(CHECK)
-.PHONY: net/http/httputil/check
-
-@go_include@ net/http/internal.lo.dep
-net/http/internal.lo.dep: $(go_net_http_internal_files)
-	$(BUILDDEPS)
-net/http/internal.lo: $(go_net_http_internal_files)
-	$(BUILDPACKAGE)
-net/http/internal/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/http/internal/check
-
-@go_include@ net/http/pprof.lo.dep
-net/http/pprof.lo.dep: $(go_net_http_pprof_files)
-	$(BUILDDEPS)
-net/http/pprof.lo: $(go_net_http_pprof_files)
-	$(BUILDPACKAGE)
-net/http/pprof/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/http/pprof/check
-
-@go_include@ net/internal/socktest.lo.dep
-net/internal/socktest.lo.dep: $(go_net_internal_socktest_files)
-	$(BUILDDEPS)
-net/internal/socktest.lo: $(go_net_internal_socktest_files)
-	$(BUILDPACKAGE)
-net/internal/socktest/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/internal/socktest/check
-
-@go_include@ net/rpc/jsonrpc.lo.dep
-net/rpc/jsonrpc.lo.dep: $(go_net_rpc_jsonrpc_files)
-	$(BUILDDEPS)
-net/rpc/jsonrpc.lo: $(go_net_rpc_jsonrpc_files)
-	$(BUILDPACKAGE)
-net/rpc/jsonrpc/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/rpc/jsonrpc/check
-
-@go_include@ old/regexp.lo.dep
-old/regexp.lo.dep: $(go_old_regexp_files)
-	$(BUILDDEPS)
-old/regexp.lo: $(go_old_regexp_files)
-	$(BUILDPACKAGE)
-old/regexp/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: old/regexp/check
-
-@go_include@ old/template.lo.dep
-old/template.lo.dep: $(go_old_template_files)
-	$(BUILDDEPS)
-old/template.lo: $(go_old_template_files)
-	$(BUILDPACKAGE)
-old/template/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: old/template/check
-
-@go_include@ os/exec.lo.dep
-os/exec.lo.dep: $(go_os_exec_files)
-	$(BUILDDEPS)
-os/exec.lo: $(go_os_exec_files)
-	$(BUILDPACKAGE)
-os/exec/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: os/exec/check
-
-@go_include@ os/signal.lo.dep
-os/signal.lo.dep: $(go_os_signal_files)
-	$(BUILDDEPS)
-os/signal.lo: $(go_os_signal_files)
-	$(BUILDPACKAGE)
-os/signal/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: os/signal/check
-
-@go_include@ os/user.lo.dep
-os/user.lo.dep: $(go_os_user_files)
-	$(BUILDDEPS)
-os/user.lo: $(go_os_user_files)
-	$(BUILDPACKAGE)
-os/user/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: os/user/check
-
-@go_include@ path/filepath.lo.dep
-path/filepath.lo.dep: $(go_path_filepath_files)
-	$(BUILDDEPS)
-path/filepath.lo: $(go_path_filepath_files)
-	$(BUILDPACKAGE)
-path/filepath/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: path/filepath/check
-
-@go_include@ regexp/syntax.lo.dep
-regexp/syntax.lo.dep: $(go_regexp_syntax_files)
-	$(BUILDDEPS)
-regexp/syntax.lo: $(go_regexp_syntax_files)
-	$(BUILDPACKAGE)
-regexp/syntax/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: regexp/syntax/check
-
-@go_include@ runtime/debug.lo.dep
-runtime/debug.lo.dep: $(go_runtime_debug_files)
-	$(BUILDDEPS)
-runtime/debug.lo: $(go_runtime_debug_files)
-	$(BUILDPACKAGE)
-runtime/debug/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: runtime/debug/check
-
-@go_include@ runtime/pprof.lo.dep
-runtime/pprof.lo.dep: $(go_runtime_pprof_files)
-	$(BUILDDEPS)
-runtime/pprof.lo: $(go_runtime_pprof_files)
-	$(BUILDPACKAGE)
-runtime/pprof/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: runtime/pprof/check
-# At least for now, we need -static-libgo for this test, because
-# otherwise we can't get the line numbers.
-# Also use -fno-inline to get better results from the memory profiler.
-runtime_pprof_check_GOCFLAGS = -static-libgo -fno-inline
-
-@go_include@ sync/atomic.lo.dep
-sync/atomic.lo.dep: $(go_sync_atomic_files)
-	$(BUILDDEPS)
-sync/atomic.lo: $(go_sync_atomic_files)
-	$(BUILDPACKAGE)
-sync/atomic_c.lo: $(go_sync_atomic_c_files) sync/atomic.lo
-	$(LTCOMPILE) -c -o $@ $(srcdir)/go/sync/atomic/atomic.c
-sync/atomic/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: sync/atomic/check
-
-@go_include@ text/scanner.lo.dep
-text/scanner.lo.dep: $(go_text_scanner_files)
-	$(BUILDDEPS)
-text/scanner.lo: $(go_text_scanner_files)
-	$(BUILDPACKAGE)
-text/scanner/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: text/scanner/check
-
-@go_include@ text/tabwriter.lo.dep
-text/tabwriter.lo.dep: $(go_text_tabwriter_files)
-	$(BUILDDEPS)
-text/tabwriter.lo: $(go_text_tabwriter_files)
-	$(BUILDPACKAGE)
-text/tabwriter/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: text/tabwriter/check
-
-@go_include@ text/template.lo.dep
-text/template.lo.dep: $(go_text_template_files)
-	$(BUILDDEPS)
-text/template.lo: $(go_text_template_files)
-	$(BUILDPACKAGE)
-text/template/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: text/template/check
-
-@go_include@ text/template/parse.lo.dep
-text/template/parse.lo.dep: $(go_text_template_parse_files)
-	$(BUILDDEPS)
-text/template/parse.lo: $(go_text_template_parse_files)
-	$(BUILDPACKAGE)
-text/template/parse/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: text/template/parse/check
-
-@go_include@ testing/iotest.lo.dep
-testing/iotest.lo.dep: $(go_testing_iotest_files)
-	$(BUILDDEPS)
-testing/iotest.lo: $(go_testing_iotest_files)
-	$(BUILDPACKAGE)
-testing/iotest/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: testing/iotest/check
-
-@go_include@ testing/quick.lo.dep
-testing/quick.lo.dep: $(go_testing_quick_files)
-	$(BUILDDEPS)
-testing/quick.lo: $(go_testing_quick_files)
-	$(BUILDPACKAGE)
-testing/quick/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: testing/quick/check
-
-@go_include@ unicode/utf16.lo.dep
-unicode/utf16.lo.dep: $(go_unicode_utf16_files)
-	$(BUILDDEPS)
-unicode/utf16.lo: $(go_unicode_utf16_files)
-	$(BUILDPACKAGE)
-unicode/utf16/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: unicode/utf16/check
-
-@go_include@ unicode/utf8.lo.dep
-unicode/utf8.lo.dep: $(go_unicode_utf8_files)
-	$(BUILDDEPS)
-unicode/utf8.lo: $(go_unicode_utf8_files)
-	$(BUILDPACKAGE)
-unicode/utf8/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: unicode/utf8/check
-
-@go_include@ syscall.lo.dep
-syscall.lo.dep: $(go_syscall_files)
-	$(BUILDDEPS)
-syscall.lo: $(go_syscall_files)
-	$(BUILDPACKAGE)
-syscall/errno.lo: go/syscall/errno.c
-	@$(MKDIR_P) syscall
-	$(LTCOMPILE) -c -o $@ $<
-syscall/signame.lo: go/syscall/signame.c
-	@$(MKDIR_P) syscall
-	$(LTCOMPILE) -c -o $@ $<
-syscall/wait.lo: go/syscall/wait.c
-	@$(MKDIR_P) syscall
-	$(LTCOMPILE) -c -o $@ $<
-syscall/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: syscall/check
-
-# How to build a .gox file from a .lo file.
-BUILDGOX = \
-	f=`echo $< | sed -e 's/.lo$$/.o/'`; \
-	$(OBJCOPY) -j .go_export $$f $@.tmp && mv -f $@.tmp $@
-
-bufio.gox: bufio.lo
-	$(BUILDGOX)
-bytes.gox: bytes.lo
-	$(BUILDGOX)
-crypto.gox: crypto.lo
-	$(BUILDGOX)
-encoding.gox: encoding.lo
-	$(BUILDGOX)
-errors.gox: errors.lo
-	$(BUILDGOX)
-expvar.gox: expvar.lo
-	$(BUILDGOX)
-flag.gox: flag.lo
-	$(BUILDGOX)
-fmt.gox: fmt.lo
-	$(BUILDGOX)
-hash.gox: hash.lo
-	$(BUILDGOX)
-html.gox: html.lo
-	$(BUILDGOX)
-image.gox: image.lo
-	$(BUILDGOX)
-io.gox: io.lo
-	$(BUILDGOX)
-log.gox: log.lo
-	$(BUILDGOX)
-math.gox: math.lo
-	$(BUILDGOX)
-mime.gox: mime.lo
-	$(BUILDGOX)
-net.gox: net.lo
-	$(BUILDGOX)
-os.gox: os.lo
-	$(BUILDGOX)
-path.gox: path.lo
-	$(BUILDGOX)
-reflect.gox: reflect-go.lo
-	$(BUILDGOX)
-regexp.gox: regexp.lo
-	$(BUILDGOX)
-runtime.gox: runtime-go.lo
-	$(BUILDGOX)
-sort.gox: sort.lo
-	$(BUILDGOX)
-strconv.gox: strconv.lo
-	$(BUILDGOX)
-strings.gox: strings.lo
-	$(BUILDGOX)
-sync.gox: sync.lo
-	$(BUILDGOX)
-syscall.gox: syscall.lo
-	$(BUILDGOX)
-testing.gox: testing.lo
-	$(BUILDGOX)
-time.gox: time-go.lo
-	$(BUILDGOX)
-unicode.gox: unicode.lo
-	$(BUILDGOX)
-
-archive/tar.gox: archive/tar.lo
-	$(BUILDGOX)
-archive/zip.gox: archive/zip.lo
-	$(BUILDGOX)
-
-compress/bzip2.gox: compress/bzip2.lo
-	$(BUILDGOX)
-compress/flate.gox: compress/flate.lo
-	$(BUILDGOX)
-compress/gzip.gox: compress/gzip.lo
-	$(BUILDGOX)
-compress/lzw.gox: compress/lzw.lo
-	$(BUILDGOX)
-compress/zlib.gox: compress/zlib.lo
-	$(BUILDGOX)
-
-container/heap.gox: container/heap.lo
-	$(BUILDGOX)
-container/list.gox: container/list.lo
-	$(BUILDGOX)
-container/ring.gox: container/ring.lo
-	$(BUILDGOX)
-
-crypto/aes.gox: crypto/aes.lo
-	$(BUILDGOX)
-crypto/cipher.gox: crypto/cipher.lo
-	$(BUILDGOX)
-crypto/des.gox: crypto/des.lo
-	$(BUILDGOX)
-crypto/dsa.gox: crypto/dsa.lo
-	$(BUILDGOX)
-crypto/ecdsa.gox: crypto/ecdsa.lo	
-	$(BUILDGOX)
-crypto/elliptic.gox: crypto/elliptic.lo
-	$(BUILDGOX)
-crypto/hmac.gox: crypto/hmac.lo
-	$(BUILDGOX)
-crypto/md5.gox: crypto/md5.lo
-	$(BUILDGOX)
-crypto/rand.gox: crypto/rand.lo
-	$(BUILDGOX)
-crypto/rc4.gox: crypto/rc4.lo
-	$(BUILDGOX)
-crypto/rsa.gox: crypto/rsa.lo
-	$(BUILDGOX)
-crypto/sha1.gox: crypto/sha1.lo
-	$(BUILDGOX)
-crypto/sha256.gox: crypto/sha256.lo
-	$(BUILDGOX)
-crypto/sha512.gox: crypto/sha512.lo
-	$(BUILDGOX)
-crypto/subtle.gox: crypto/subtle.lo
-	$(BUILDGOX)
-crypto/tls.gox: crypto/tls.lo
-	$(BUILDGOX)
-crypto/x509.gox: crypto/x509.lo
-	$(BUILDGOX)
-
-crypto/x509/pkix.gox: crypto/x509/pkix.lo
-	$(BUILDGOX)
-
-database/sql.gox: database/sql.lo
-	$(BUILDGOX)
-
-database/sql/driver.gox: database/sql/driver.lo
-	$(BUILDGOX)
-
-debug/dwarf.gox: debug/dwarf.lo
-	$(BUILDGOX)
-debug/elf.gox: debug/elf.lo
-	$(BUILDGOX)
-debug/gosym.gox: debug/gosym.lo
-	$(BUILDGOX)
-debug/macho.gox: debug/macho.lo
-	$(BUILDGOX)
-debug/pe.gox: debug/pe.lo
-	$(BUILDGOX)
-debug/plan9obj.gox: debug/plan9obj.lo
-	$(BUILDGOX)
-
-encoding/ascii85.gox: encoding/ascii85.lo
-	$(BUILDGOX)
-encoding/asn1.gox: encoding/asn1.lo
-	$(BUILDGOX)
-encoding/base32.gox: encoding/base32.lo
-	$(BUILDGOX)
-encoding/base64.gox: encoding/base64.lo
-	$(BUILDGOX)
-encoding/binary.gox: encoding/binary.lo
-	$(BUILDGOX)
-encoding/csv.gox: encoding/csv.lo
-	$(BUILDGOX)
-encoding/gob.gox: encoding/gob.lo
-	$(BUILDGOX)
-encoding/hex.gox: encoding/hex.lo
-	$(BUILDGOX)
-encoding/json.gox: encoding/json.lo
-	$(BUILDGOX)
-encoding/pem.gox: encoding/pem.lo
-	$(BUILDGOX)
-encoding/xml.gox: encoding/xml.lo
-	$(BUILDGOX)
-
-exp/proxy.gox: exp/proxy.lo
-	$(BUILDGOX)
-exp/terminal.gox: exp/terminal.lo
-	$(BUILDGOX)
-
-html/template.gox: html/template.lo
-	$(BUILDGOX)
-
-go/ast.gox: go/ast.lo
-	$(BUILDGOX)
-go/build.gox: go/build.lo
-	$(BUILDGOX)
-go/constant.gox: go/constant.lo
-	$(BUILDGOX)
-go/doc.gox: go/doc.lo
-	$(BUILDGOX)
-go/format.gox: go/format.lo
-	$(BUILDGOX)
-go/importer.gox: go/importer.lo
-	$(BUILDGOX)
-go/parser.gox: go/parser.lo
-	$(BUILDGOX)
-go/printer.gox: go/printer.lo
-	$(BUILDGOX)
-go/scanner.gox: go/scanner.lo
-	$(BUILDGOX)
-go/token.gox: go/token.lo
-	$(BUILDGOX)
-go/types.gox: go/types.lo
-	$(BUILDGOX)
-
-go/internal/gcimporter.gox: go/internal/gcimporter.lo
-	$(BUILDGOX)
-go/internal/gccgoimporter.gox: go/internal/gccgoimporter.lo
-	$(BUILDGOX)
-
-hash/adler32.gox: hash/adler32.lo
-	$(BUILDGOX)
-hash/crc32.gox: hash/crc32.lo
-	$(BUILDGOX)
-hash/crc64.gox: hash/crc64.lo
-	$(BUILDGOX)
-hash/fnv.gox: hash/fnv.lo
-	$(BUILDGOX)
-
-image/color.gox: image/color.lo
-	$(BUILDGOX)
-image/draw.gox: image/draw.lo
-	$(BUILDGOX)
-image/gif.gox: image/gif.lo
-	$(BUILDGOX)
-image/internal/imageutil.gox: image/internal/imageutil.lo
-	$(BUILDGOX)
-image/jpeg.gox: image/jpeg.lo
-	$(BUILDGOX)
-image/png.gox: image/png.lo
-	$(BUILDGOX)
-
-image/color/palette.gox: image/color/palette.lo
-	$(BUILDGOX)
-
-index/suffixarray.gox: index/suffixarray.lo
-	$(BUILDGOX)
-
-internal/format.gox: internal/format.lo
-	$(BUILDGOX)
-internal/singleflight.gox: internal/singleflight.lo
-	$(BUILDGOX)
-internal/syscall/unix.gox: internal/syscall/unix.lo
-	$(BUILDGOX)
-internal/testenv.gox: internal/testenv.lo
-	$(BUILDGOX)
-internal/trace.gox: internal/trace.lo
-	$(BUILDGOX)
-
-io/ioutil.gox: io/ioutil.lo
-	$(BUILDGOX)
-
-log/syslog.gox: log/syslog.lo
-	$(BUILDGOX)
-
-math/big.gox: math/big.lo
-	$(BUILDGOX)
-math/cmplx.gox: math/cmplx.lo
-	$(BUILDGOX)
-math/rand.gox: math/rand.lo
-	$(BUILDGOX)
-
-mime/multipart.gox: mime/multipart.lo
-	$(BUILDGOX)
-mime/quotedprintable.gox: mime/quotedprintable.lo
-	$(BUILDGOX)
-
-net/http.gox: net/http.lo
-	$(BUILDGOX)
-net/mail.gox: net/mail.lo
-	$(BUILDGOX)
-net/rpc.gox: net/rpc.lo
-	$(BUILDGOX)
-net/smtp.gox: net/smtp.lo
-	$(BUILDGOX)
-net/textproto.gox: net/textproto.lo
-	$(BUILDGOX)
-net/url.gox: net/url.lo
-	$(BUILDGOX)
-
-net/http/cgi.gox: net/http/cgi.lo
-	$(BUILDGOX)
-net/http/cookiejar.gox: net/http/cookiejar.lo
-	$(BUILDGOX)
-net/http/fcgi.gox: net/http/fcgi.lo
-	$(BUILDGOX)
-net/http/httptest.gox: net/http/httptest.lo
-	$(BUILDGOX)
-net/http/httputil.gox: net/http/httputil.lo
-	$(BUILDGOX)
-net/http/pprof.gox: net/http/pprof.lo
-	$(BUILDGOX)
-
-net/http/internal.gox: net/http/internal.lo
-	$(BUILDGOX)
-
-net/internal/socktest.gox: net/internal/socktest.lo
-	$(BUILDGOX)
-
-net/rpc/jsonrpc.gox: net/rpc/jsonrpc.lo
-	$(BUILDGOX)
-
-old/regexp.gox: old/regexp.lo
-	$(BUILDGOX)
-old/template.gox: old/template.lo
-	$(BUILDGOX)
-
-os/exec.gox: os/exec.lo
-	$(BUILDGOX)
-os/signal.gox: os/signal.lo
-	$(BUILDGOX)
-os/user.gox: os/user.lo
-	$(BUILDGOX)
-
-path/filepath.gox: path/filepath.lo
-	$(BUILDGOX)
-
-regexp/syntax.gox: regexp/syntax.lo
-	$(BUILDGOX)
-
-runtime/debug.gox: runtime/debug.lo
-	$(BUILDGOX)
-runtime/pprof.gox: runtime/pprof.lo
-	$(BUILDGOX)
-
-sync/atomic.gox: sync/atomic.lo
-	$(BUILDGOX)
-
-text/scanner.gox: text/scanner.lo
-	$(BUILDGOX)
-text/tabwriter.gox: text/tabwriter.lo
-	$(BUILDGOX)
-text/template.gox: text/template.lo
-	$(BUILDGOX)
-text/template/parse.gox: text/template/parse.lo
-	$(BUILDGOX)
-
-testing/iotest.gox: testing/iotest.lo
-	$(BUILDGOX)
-testing/quick.gox: testing/quick.lo
-	$(BUILDGOX)
-
-unicode/utf16.gox: unicode/utf16.lo
-	$(BUILDGOX)
-unicode/utf8.gox: unicode/utf8.lo
-	$(BUILDGOX)
-
-TEST_PACKAGES = \
-	bufio/check \
-	bytes/check \
-	errors/check \
-	expvar/check \
-	flag/check \
-	fmt/check \
-	html/check \
-	image/check \
-	io/check \
-	log/check \
-	math/check \
-	mime/check \
-	net/check \
-	os/check \
-	path/check \
-	reflect/check \
-	runtime/check \
-	sort/check \
-	strconv/check \
-	strings/check \
-	sync/check \
-	syscall/check \
-	time/check \
-	unicode/check \
-	archive/tar/check \
-	archive/zip/check \
-	compress/bzip2/check \
-	compress/flate/check \
-	compress/gzip/check \
-	compress/lzw/check \
-	compress/zlib/check \
-	container/heap/check \
-	container/list/check \
-	container/ring/check \
-	crypto/aes/check \
-	crypto/cipher/check \
-	crypto/des/check \
-	crypto/dsa/check \
-	crypto/ecdsa/check \
-	crypto/elliptic/check \
-	crypto/hmac/check \
-	crypto/md5/check \
-	crypto/rand/check \
-	crypto/rc4/check \
-	crypto/rsa/check \
-	crypto/sha1/check \
-	crypto/sha256/check \
-	crypto/sha512/check \
-	crypto/subtle/check \
-	crypto/tls/check \
-	crypto/x509/check \
-	database/sql/check \
-	database/sql/driver/check \
-	debug/dwarf/check \
-	debug/elf/check \
-	debug/macho/check \
-	debug/pe/check \
-	debug/plan9obj/check \
-	encoding/ascii85/check \
-	encoding/asn1/check \
-	encoding/base32/check \
-	encoding/base64/check \
-	encoding/binary/check \
-	encoding/csv/check \
-	encoding/gob/check \
-	encoding/hex/check \
-	encoding/json/check \
-	encoding/pem/check \
-	encoding/xml/check \
-	exp/proxy/check \
-	exp/terminal/check \
-	html/template/check \
-	go/ast/check \
-	go/build/check \
-	go/constant/check \
-	go/doc/check \
-	go/format/check \
-	go/internal/gcimporter/check \
-	go/internal/gccgoimporter/check \
-	go/parser/check \
-	go/printer/check \
-	go/scanner/check \
-	go/token/check \
-	go/types/check \
-	hash/adler32/check \
-	hash/crc32/check \
-	hash/crc64/check \
-	hash/fnv/check \
-	image/color/check \
-	image/draw/check \
-	image/jpeg/check \
-	image/png/check \
-	index/suffixarray/check \
-	internal/singleflight/check \
-	internal/trace/check \
-	io/ioutil/check \
-	log/syslog/check \
-	math/big/check \
-	math/cmplx/check \
-	math/rand/check \
-	mime/multipart/check \
-	mime/quotedprintable/check \
-	net/http/check \
-	net/http/cgi/check \
-	net/http/cookiejar/check \
-	net/http/fcgi/check \
-	net/http/httptest/check \
-	net/http/httputil/check \
-	net/http/internal/check \
-	net/internal/socktest/check \
-	net/mail/check \
-	net/rpc/check \
-	net/smtp/check \
-	net/textproto/check \
-	net/url/check \
-	net/rpc/jsonrpc/check \
-	old/regexp/check \
-	old/template/check \
-	os/exec/check \
-	os/signal/check \
-	os/user/check \
-	path/filepath/check \
-	regexp/syntax/check \
-	sync/atomic/check \
-	text/scanner/check \
-	text/tabwriter/check \
-	text/template/check \
-	text/template/parse/check \
-	testing/quick/check \
-	unicode/utf16/check \
-	unicode/utf8/check
-
-check: check-tail
-check-recursive: check-head
-
-check-head:
-	@echo "Test Run By $${USER} on `date`" > libgo.head
-	@echo "Native configuration is $(host_triplet)" >> libgo.head
-	@echo >> libgo.head
-	@echo "		=== libgo tests ===" >> libgo.head
-	@echo >> libgo.head
-
-check-tail: check-recursive check-multi
-	@if test "$(USE_DEJAGNU)" = "yes"; then \
-	  exit 0; \
-	fi; \
-	lib=`${PWD_COMMAND} | sed -e 's,^.*/\([^/][^/]*\)$$,\1,'`; \
-	for dir in . $(MULTIDIRS); do \
-	  mv ../$${dir}/$${lib}/libgo.sum ../$${dir}/$${lib}/libgo.sum.sep; \
-	  mv ../$${dir}/$${lib}/libgo.log ../$${dir}/$${lib}/libgo.log.sep; \
-	done; \
-	mv libgo.head libgo.sum; \
-	cp libgo.sum libgo.log; \
-	echo "Schedule of variations:" >> libgo.sum; \
-	for dir in . $(MULTIDIRS); do \
-	  multidir=../$${dir}/$${lib}; \
-	  multivar=`cat $${multidir}/libgo.var`; \
-	  echo "    $${multivar}" >> libgo.sum; \
-	done; \
-	echo >> libgo.sum; \
-	pass=0; fail=0; untested=0; \
-	for dir in . $(MULTIDIRS); do \
-	  multidir=../$${dir}/$${lib}; \
-	  multivar=`cat $${multidir}/libgo.var`; \
-	  echo "Running target $${multivar}" >> libgo.sum; \
-	  echo "Running $(srcdir)/libgo.exp ..." >> libgo.sum; \
-	  cat $${multidir}/libgo.sum.sep >> libgo.sum; \
-	  cat $${multidir}/libgo.log.sep >> libgo.log; \
-	  if test -n "${MULTIDIRS}"; then \
-	    echo "		=== libgo Summary for $${multivar} ===" >> libgo.sum; \
-	    echo >> libgo.sum; \
-	  fi; \
-	  p=`grep -c PASS $${multidir}/libgo.sum.sep`; \
-	  pass=`expr $$pass + $$p`; \
-	  if test "$$p" -ne "0" && test -n "${MULTIDIRS}"; then \
-	    echo "# of expected passes		$$p" >> libgo.sum; \
-	  fi; \
-	  p=`grep -c FAIL $${multidir}/libgo.sum.sep`; \
-	  fail=`expr $$fail + $$p`; \
-	  if test "$$p" -ne "0" && test -n "${MULTIDIRS}"; then \
-	    echo "# of unexpected failures	$$p" >> libgo.sum; \
-	  fi; \
-	  p=`grep -c UNTESTED $${multidir}/libgo.sum.sep`; \
-	  untested=`expr $$untested + $$p`; \
-	  if test "$$p" -ne "0" && test -n "${MULTIDIRS}"; then \
-	    echo "# of untested testcases		$$p" >> libgo.sum; \
-	  fi; \
-	done; \
-	echo >> libgo.sum; \
-	echo "		=== libgo Summary ===" >> libgo.sum; \
-	echo >> libgo.sum; \
-	if test "$$pass" -ne "0"; then \
-	  echo "# of expected passes		$$pass" >> libgo.sum; \
-	fi; \
-	if test "$$fail" -ne "0"; then \
-	  echo "# of unexpected failures	$$fail" >> libgo.sum; \
-	fi; \
-	if test "$$untested" -ne "0"; then \
-	  echo "# of untested testcases		$$untested" >> libgo.sum; \
-	fi; \
-	echo `echo $(GOC) | sed -e 's/ .*//'`  `$(GOC) -v 2>&1 | grep " version" | sed -n -e 's/.* \(version.*$$\)/\1/p'` >> libgo.sum; \
-	echo >> libgo.log; \
-	echo "runtest completed at `date`" >> libgo.log; \
-	if test "$$fail" -ne "0"; then \
-	  status=1; \
-	else \
-	  status=0; \
-	fi; \
-	exit $$status
-
-check-am:
-	@rm -f libgo.sum libgo.log libgo.tail
-	@multivar="unix"; \
-	[ -z "$(MULTIFLAGS)" ] || multivar="$${multivar}/$(MULTIFLAGS)"; \
-	echo "$${multivar}" > libgo.var
-	@for f in $(TEST_PACKAGES); do \
-	   rm -f $$f-testsum $$f-testlog; \
-	 done
-	-@$(MAKE) -k $(TEST_PACKAGES)
-	@for f in $(TEST_PACKAGES); do \
-	  if test -f $$f-testsum; then \
-	    cat $$f-testsum >> libgo.sum; \
-	  fi; \
-	  if test -f $$f-testlog; then \
-	    cat $$f-testlog >> libgo.log; \
-	  fi; \
-	done
-
-check-multi:
-	$(MULTIDO) $(AM_MAKEFLAGS) DO=check-am multi-do # $(MAKE)
-
-bench:
-	-@$(MAKE) -k $(TEST_PACKAGES) GOBENCH=.
-
-MOSTLYCLEAN_FILES = libgo.head libgo.sum.sep libgo.log.sep
-
-mostlyclean-local:
-	find . -name '*.lo' -print | xargs $(LIBTOOL) --mode=clean rm -f
-	find . -name '*.$(OBJEXT)' -print | xargs rm -f
-	find . -name '*-testsum' -print | xargs rm -f
-	find . -name '*-testlog' -print | xargs rm -f
-
-CLEANFILES = *.go *.gox goc2c *.c s-version libgo.sum libgo.log
-
-clean-local:
-	find . -name '*.la' -print | xargs $(LIBTOOL) --mode=clean rm -f
-	find . -name '*.a' -print | xargs rm -f
diff --git a/third_party/gofrontend/libgo/Makefile.in b/third_party/gofrontend/libgo/Makefile.in
deleted file mode 100644
index 8a80798..0000000
--- a/third_party/gofrontend/libgo/Makefile.in
+++ /dev/null
@@ -1,6621 +0,0 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# Makefile.am -- Go library Makefile.
-
-# Copyright 2009 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# Process this file with autoreconf to produce Makefile.in.
-
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-target_triplet = @target@
-@GOC_IS_LLGO_TRUE@am__append_1 = libgo-llgo.la libgobegin-llgo.a
-@GOC_IS_LLGO_FALSE@am__append_2 = libgo.la libgobegin.a
-subdir = .
-DIST_COMMON = README $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
-	$(top_srcdir)/configure $(am__configure_deps) \
-	$(srcdir)/config.h.in $(srcdir)/../mkinstalldirs \
-	$(srcdir)/../depcomp
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/depstand.m4 \
-	$(top_srcdir)/../config/lead-dot.m4 \
-	$(top_srcdir)/../config/multi.m4 \
-	$(top_srcdir)/../config/override.m4 \
-	$(top_srcdir)/../config/unwind_ipinfo.m4 \
-	$(top_srcdir)/config/go.m4 $(top_srcdir)/config/libtool.m4 \
-	$(top_srcdir)/config/ltoptions.m4 \
-	$(top_srcdir)/config/ltsugar.m4 \
-	$(top_srcdir)/config/ltversion.m4 \
-	$(top_srcdir)/config/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(toolexeclibdir)" \
-	"$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(toolexeclibgodir)" \
-	"$(DESTDIR)$(toolexeclibgoarchivedir)" \
-	"$(DESTDIR)$(toolexeclibgocompressdir)" \
-	"$(DESTDIR)$(toolexeclibgocontainerdir)" \
-	"$(DESTDIR)$(toolexeclibgocryptodir)" \
-	"$(DESTDIR)$(toolexeclibgocryptox509dir)" \
-	"$(DESTDIR)$(toolexeclibgodatabasedir)" \
-	"$(DESTDIR)$(toolexeclibgodatabasesqldir)" \
-	"$(DESTDIR)$(toolexeclibgodebugdir)" \
-	"$(DESTDIR)$(toolexeclibgoencodingdir)" \
-	"$(DESTDIR)$(toolexeclibgoexpdir)" \
-	"$(DESTDIR)$(toolexeclibgogodir)" \
-	"$(DESTDIR)$(toolexeclibgohashdir)" \
-	"$(DESTDIR)$(toolexeclibgohtmldir)" \
-	"$(DESTDIR)$(toolexeclibgoimagedir)" \
-	"$(DESTDIR)$(toolexeclibgoimagecolordir)" \
-	"$(DESTDIR)$(toolexeclibgoindexdir)" \
-	"$(DESTDIR)$(toolexeclibgoiodir)" \
-	"$(DESTDIR)$(toolexeclibgologdir)" \
-	"$(DESTDIR)$(toolexeclibgomathdir)" \
-	"$(DESTDIR)$(toolexeclibgomimedir)" \
-	"$(DESTDIR)$(toolexeclibgonetdir)" \
-	"$(DESTDIR)$(toolexeclibgonethttpdir)" \
-	"$(DESTDIR)$(toolexeclibgonetrpcdir)" \
-	"$(DESTDIR)$(toolexeclibgoolddir)" \
-	"$(DESTDIR)$(toolexeclibgoosdir)" \
-	"$(DESTDIR)$(toolexeclibgopathdir)" \
-	"$(DESTDIR)$(toolexeclibgoregexpdir)" \
-	"$(DESTDIR)$(toolexeclibgoruntimedir)" \
-	"$(DESTDIR)$(toolexeclibgosyncdir)" \
-	"$(DESTDIR)$(toolexeclibgotestingdir)" \
-	"$(DESTDIR)$(toolexeclibgotextdir)" \
-	"$(DESTDIR)$(toolexeclibgotexttemplatedir)" \
-	"$(DESTDIR)$(toolexeclibgounicodedir)"
-LIBRARIES = $(toolexeclib_LIBRARIES)
-ARFLAGS = cru
-libgobegin_llgo_a_AR = $(AR) $(ARFLAGS)
-libgobegin_llgo_a_LIBADD =
-am_libgobegin_llgo_a_OBJECTS = libgobegin_llgo_a-go-main.$(OBJEXT)
-libgobegin_llgo_a_OBJECTS = $(am_libgobegin_llgo_a_OBJECTS)
-libgobegin_a_AR = $(AR) $(ARFLAGS)
-libgobegin_a_LIBADD =
-am_libgobegin_a_OBJECTS = libgobegin_a-go-main.$(OBJEXT)
-libgobegin_a_OBJECTS = $(am_libgobegin_a_OBJECTS)
-libgolibbegin_a_AR = $(AR) $(ARFLAGS)
-libgolibbegin_a_LIBADD =
-am_libgolibbegin_a_OBJECTS = libgolibbegin_a-go-libmain.$(OBJEXT)
-libgolibbegin_a_OBJECTS = $(am_libgolibbegin_a_OBJECTS)
-libnetgo_a_AR = $(AR) $(ARFLAGS)
-libnetgo_a_DEPENDENCIES = netgo.o
-am__objects_1 =
-am__objects_2 = $(am__objects_1) $(am__objects_1) $(am__objects_1) \
-	$(am__objects_1) $(am__objects_1) $(am__objects_1) \
-	$(am__objects_1)
-am__objects_3 = $(am__objects_2)
-am_libnetgo_a_OBJECTS = $(am__objects_3)
-libnetgo_a_OBJECTS = $(am_libnetgo_a_OBJECTS)
-LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
-am__DEPENDENCIES_1 =
-am__DEPENDENCIES_2 = bufio.lo bytes.lo bytes/index.lo crypto.lo \
-	encoding.lo errors.lo expvar.lo flag.lo fmt.lo hash.lo html.lo \
-	image.lo io.lo log.lo math.lo mime.lo net.lo os.lo path.lo \
-	reflect-go.lo reflect/makefunc_ffi_c.lo regexp.lo \
-	runtime-go.lo sort.lo strconv.lo strings.lo strings/index.lo \
-	sync.lo syscall.lo syscall/errno.lo syscall/signame.lo \
-	syscall/wait.lo testing.lo time-go.lo unicode.lo \
-	archive/tar.lo archive/zip.lo compress/bzip2.lo \
-	compress/flate.lo compress/gzip.lo compress/lzw.lo \
-	compress/zlib.lo container/heap.lo container/list.lo \
-	container/ring.lo crypto/aes.lo crypto/cipher.lo crypto/des.lo \
-	crypto/dsa.lo crypto/ecdsa.lo crypto/elliptic.lo \
-	crypto/hmac.lo crypto/md5.lo crypto/rand.lo crypto/rc4.lo \
-	crypto/rsa.lo crypto/sha1.lo crypto/sha256.lo crypto/sha512.lo \
-	crypto/subtle.lo crypto/tls.lo crypto/x509.lo \
-	crypto/x509/pkix.lo database/sql.lo database/sql/driver.lo \
-	debug/dwarf.lo debug/elf.lo debug/gosym.lo debug/macho.lo \
-	debug/pe.lo debug/plan9obj.lo encoding/ascii85.lo \
-	encoding/asn1.lo encoding/base32.lo encoding/base64.lo \
-	encoding/binary.lo encoding/csv.lo encoding/gob.lo \
-	encoding/hex.lo encoding/json.lo encoding/pem.lo \
-	encoding/xml.lo exp/proxy.lo exp/terminal.lo html/template.lo \
-	go/ast.lo go/build.lo go/constant.lo go/doc.lo go/format.lo \
-	go/importer.lo go/internal/gcimporter.lo \
-	go/internal/gccgoimporter.lo go/parser.lo go/printer.lo \
-	go/scanner.lo go/token.lo go/types.lo hash/adler32.lo \
-	hash/crc32.lo hash/crc64.lo hash/fnv.lo net/http/cgi.lo \
-	net/http/cookiejar.lo net/http/fcgi.lo net/http/httptest.lo \
-	net/http/httputil.lo net/http/internal.lo net/http/pprof.lo \
-	image/color.lo image/color/palette.lo image/draw.lo \
-	image/gif.lo image/internal/imageutil.lo image/jpeg.lo \
-	image/png.lo index/suffixarray.lo internal/format.lo \
-	internal/singleflight.lo internal/syscall/unix.lo \
-	internal/testenv.lo internal/trace.lo io/ioutil.lo \
-	log/syslog.lo log/syslog/syslog_c.lo math/big.lo math/cmplx.lo \
-	math/rand.lo mime/multipart.lo mime/quotedprintable.lo \
-	net/http.lo net/internal/socktest.lo net/mail.lo net/rpc.lo \
-	net/smtp.lo net/textproto.lo net/url.lo old/regexp.lo \
-	old/template.lo os/exec.lo $(am__DEPENDENCIES_1) os/signal.lo \
-	os/user.lo path/filepath.lo regexp/syntax.lo \
-	net/rpc/jsonrpc.lo runtime/debug.lo runtime/pprof.lo \
-	sync/atomic.lo sync/atomic_c.lo text/scanner.lo \
-	text/tabwriter.lo text/template.lo text/template/parse.lo \
-	testing/iotest.lo testing/quick.lo unicode/utf16.lo \
-	unicode/utf8.lo
-am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) \
-	../libbacktrace/libbacktrace.la $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-libgo_llgo_la_DEPENDENCIES = $(am__DEPENDENCIES_3)
-@LIBGO_IS_LINUX_FALSE@am__objects_4 = lock_sema.lo thread-sema.lo
-@LIBGO_IS_LINUX_TRUE@am__objects_4 = lock_futex.lo thread-linux.lo
-@HAVE_SYS_MMAN_H_FALSE@am__objects_5 = mem_posix_memalign.lo
-@HAVE_SYS_MMAN_H_TRUE@am__objects_5 = mem.lo
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@am__objects_6 = netpoll_kqueue.lo
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@am__objects_6 = netpoll_select.lo
-@LIBGO_IS_LINUX_TRUE@am__objects_6 = netpoll_epoll.lo
-@LIBGO_IS_RTEMS_TRUE@am__objects_7 = rtems-task-variable-add.lo
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@am__objects_8 = getncpu-none.lo
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_TRUE@@LIBGO_IS_SOLARIS_FALSE@am__objects_8 = getncpu-bsd.lo
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@am__objects_8 = getncpu-bsd.lo
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@am__objects_8 = getncpu-solaris.lo
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_IRIX_TRUE@@LIBGO_IS_LINUX_FALSE@am__objects_8 = getncpu-irix.lo
-@LIBGO_IS_DARWIN_TRUE@@LIBGO_IS_LINUX_FALSE@am__objects_8 =  \
-@LIBGO_IS_DARWIN_TRUE@@LIBGO_IS_LINUX_FALSE@	getncpu-bsd.lo
-@LIBGO_IS_LINUX_TRUE@am__objects_8 = getncpu-linux.lo
-am__objects_9 = go-append.lo go-assert.lo go-assert-interface.lo \
-	go-byte-array-to-string.lo go-breakpoint.lo go-caller.lo \
-	go-callers.lo go-can-convert-interface.lo go-cdiv.lo go-cgo.lo \
-	go-check-interface.lo go-construct-map.lo \
-	go-convert-interface.lo go-copy.lo go-defer.lo \
-	go-deferred-recover.lo go-eface-compare.lo \
-	go-eface-val-compare.lo go-ffi.lo go-fieldtrack.lo \
-	go-int-array-to-string.lo go-int-to-string.lo \
-	go-interface-compare.lo go-interface-eface-compare.lo \
-	go-interface-val-compare.lo go-make-slice.lo go-map-delete.lo \
-	go-map-index.lo go-map-len.lo go-map-range.lo go-matherr.lo \
-	go-memcmp.lo go-nanotime.lo go-now.lo go-new-map.lo go-new.lo \
-	go-nosys.lo go-panic.lo go-print.lo go-recover.lo \
-	go-reflect-call.lo go-reflect-map.lo go-rune.lo \
-	go-runtime-error.lo go-setenv.lo go-signal.lo go-strcmp.lo \
-	go-string-to-byte-array.lo go-string-to-int-array.lo \
-	go-strplus.lo go-strslice.lo go-traceback.lo \
-	go-type-complex.lo go-type-eface.lo go-type-error.lo \
-	go-type-float.lo go-type-identity.lo go-type-interface.lo \
-	go-type-string.lo go-typedesc-equal.lo go-unsafe-new.lo \
-	go-unsafe-newarray.lo go-unsafe-pointer.lo go-unsetenv.lo \
-	go-unwind.lo go-varargs.lo env_posix.lo heapdump.lo \
-	$(am__objects_4) mcache.lo mcentral.lo $(am__objects_5) \
-	mfixalloc.lo mgc0.lo mheap.lo msize.lo $(am__objects_6) \
-	panic.lo parfor.lo print.lo proc.lo runtime.lo signal_unix.lo \
-	thread.lo yield.lo $(am__objects_7) chan.lo cpuprof.lo \
-	go-iface.lo lfstack.lo malloc.lo map.lo mprof.lo netpoll.lo \
-	rdebug.lo reflect.lo runtime1.lo sema.lo sigqueue.lo string.lo \
-	time.lo $(am__objects_8)
-am_libgo_llgo_la_OBJECTS = $(am__objects_9)
-libgo_llgo_la_OBJECTS = $(am_libgo_llgo_la_OBJECTS)
-libgo_llgo_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(libgo_llgo_la_LDFLAGS) $(LDFLAGS) -o $@
-@GOC_IS_LLGO_TRUE@am_libgo_llgo_la_rpath = -rpath $(toolexeclibdir)
-libgo_la_DEPENDENCIES = $(am__DEPENDENCIES_3)
-am_libgo_la_OBJECTS = $(am__objects_9)
-libgo_la_OBJECTS = $(am_libgo_la_OBJECTS)
-libgo_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(libgo_la_LDFLAGS) \
-	$(LDFLAGS) -o $@
-@GOC_IS_LLGO_FALSE@am_libgo_la_rpath = -rpath $(toolexeclibdir)
-DEFAULT_INCLUDES = -I.@am__isrc@
-depcomp = $(SHELL) $(top_srcdir)/../depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(libgobegin_llgo_a_SOURCES) $(libgobegin_a_SOURCES) \
-	$(libgolibbegin_a_SOURCES) $(libnetgo_a_SOURCES) \
-	$(libgo_llgo_la_SOURCES) $(libgo_la_SOURCES)
-MULTISRCTOP = 
-MULTIBUILDTOP = 
-MULTIDIRS = 
-MULTISUBDIR = 
-MULTIDO = true
-MULTICLEAN = true
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-DATA = $(noinst_DATA) $(toolexeclibgo_DATA) \
-	$(toolexeclibgoarchive_DATA) $(toolexeclibgocompress_DATA) \
-	$(toolexeclibgocontainer_DATA) $(toolexeclibgocrypto_DATA) \
-	$(toolexeclibgocryptox509_DATA) $(toolexeclibgodatabase_DATA) \
-	$(toolexeclibgodatabasesql_DATA) $(toolexeclibgodebug_DATA) \
-	$(toolexeclibgoencoding_DATA) $(toolexeclibgoexp_DATA) \
-	$(toolexeclibgogo_DATA) $(toolexeclibgohash_DATA) \
-	$(toolexeclibgohtml_DATA) $(toolexeclibgoimage_DATA) \
-	$(toolexeclibgoimagecolor_DATA) $(toolexeclibgoindex_DATA) \
-	$(toolexeclibgoio_DATA) $(toolexeclibgolog_DATA) \
-	$(toolexeclibgomath_DATA) $(toolexeclibgomime_DATA) \
-	$(toolexeclibgonet_DATA) $(toolexeclibgonethttp_DATA) \
-	$(toolexeclibgonetrpc_DATA) $(toolexeclibgoold_DATA) \
-	$(toolexeclibgoos_DATA) $(toolexeclibgopath_DATA) \
-	$(toolexeclibgoregexp_DATA) $(toolexeclibgoruntime_DATA) \
-	$(toolexeclibgosync_DATA) $(toolexeclibgotesting_DATA) \
-	$(toolexeclibgotext_DATA) $(toolexeclibgotexttemplate_DATA) \
-	$(toolexeclibgounicode_DATA)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = testsuite
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_FOR_BUILD = @CC_FOR_BUILD@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GOARCH = @GOARCH@
-GOC = @GOC@
-GOCFLAGS = $(CFLAGS)
-GOOS = @GOOS@
-GO_LIBCALL_OS_ARCH_FILE = @GO_LIBCALL_OS_ARCH_FILE@
-GO_LIBCALL_OS_FILE = @GO_LIBCALL_OS_FILE@
-GO_SPLIT_STACK = @GO_SPLIT_STACK@
-GO_SYSCALL_OS_ARCH_FILE = @GO_SYSCALL_OS_ARCH_FILE@
-GO_SYSCALL_OS_FILE = @GO_SYSCALL_OS_FILE@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBATOMIC = @LIBATOMIC@
-LIBFFI = @LIBFFI@
-LIBFFIINCS = @LIBFFIINCS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MATH_FLAG = @MATH_FLAG@
-MATH_LIBS = @MATH_LIBS@
-MKDIR_P = @MKDIR_P@
-NET_LIBS = @NET_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJCOPY = @OBJCOPY@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OSCFLAGS = @OSCFLAGS@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
-PTHREAD_LIBS = @PTHREAD_LIBS@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SIZEOF_STRUCT_EPOLL_EVENT = @SIZEOF_STRUCT_EPOLL_EVENT@
-SPLIT_STACK = @SPLIT_STACK@
-STRINGOPS_FLAG = @STRINGOPS_FLAG@
-STRIP = @STRIP@
-STRUCT_EPOLL_EVENT_FD_OFFSET = @STRUCT_EPOLL_EVENT_FD_OFFSET@
-USE_DEJAGNU = @USE_DEJAGNU@
-VERSION = @VERSION@
-WARN_FLAGS = @WARN_FLAGS@
-WERROR = @WERROR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-enable_shared = @enable_shared@
-enable_static = @enable_static@
-exec_prefix = @exec_prefix@
-glibgo_toolexecdir = @glibgo_toolexecdir@
-glibgo_toolexeclibdir = @glibgo_toolexeclibdir@
-go_include = @go_include@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-libtool_VERSION = @libtool_VERSION@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-multi_basedir = @multi_basedir@
-nover_glibgo_toolexeclibdir = @nover_glibgo_toolexeclibdir@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target = @target@
-target_alias = @target_alias@
-target_cpu = @target_cpu@
-target_os = @target_os@
-target_vendor = @target_vendor@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-
-# Go support.
-SUFFIXES = .c .go .gox .o .obj .lo .a
-@LIBGO_IS_RTEMS_TRUE@subdirs = testsuite
-SUBDIRS = ${subdirs}
-gcc_version := $(shell $(GOC) -dumpversion)
-MAINT_CHARSET = latin1
-mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
-PWD_COMMAND = $${PWDCMD-pwd}
-STAMP = echo timestamp >
-toolexecdir = $(glibgo_toolexecdir)
-toolexeclibdir = $(glibgo_toolexeclibdir)
-toolexeclibgodir = $(nover_glibgo_toolexeclibdir)/go/$(gcc_version)/$(target_alias)
-libexecsubdir = $(libexecdir)/gcc/$(target_alias)/$(gcc_version)
-WARN_CFLAGS = $(WARN_FLAGS) $(WERROR)
-
-# -I/-D flags to pass when compiling.
-AM_CPPFLAGS = -I $(srcdir)/runtime $(LIBFFIINCS) $(PTHREAD_CFLAGS)
-ACLOCAL_AMFLAGS = -I ./config -I ../config
-AM_CFLAGS = -fexceptions -fnon-call-exceptions -fplan9-extensions \
-	$(SPLIT_STACK) $(WARN_CFLAGS) \
-	$(STRINGOPS_FLAG) $(OSCFLAGS) \
-	-I $(srcdir)/../libgcc -I $(srcdir)/../libbacktrace \
-	-I $(MULTIBUILDTOP)../../gcc/include
-
-@USING_SPLIT_STACK_TRUE@AM_LDFLAGS = -XCClinker $(SPLIT_STACK)
-
-# Multilib support.
-MAKEOVERRIDES = 
-
-# Work around what appears to be a GNU make  handling MAKEFLAGS
-# values defined in terms of make variables, as is the case for CC and
-# friends when we are called from the top level Makefile.
-AM_MAKEFLAGS = \
-	"AR_FLAGS=$(AR_FLAGS)" \
-	"CC_FOR_BUILD=$(CC_FOR_BUILD)" \
-	"CC_FOR_TARGET=$(CC_FOR_TARGET)" \
-	"CFLAGS=$(CFLAGS)" \
-	"CXXFLAGS=$(CXXFLAGS)" \
-	"CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
-	"CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
-	"GOC_FOR_TARGET=$(GOC_FOR_TARGET)" \
-	"GOC=$(GOC)" \
-	"GOCFLAGS=$(GOCFLAGS)" \
-	"INSTALL=$(INSTALL)" \
-	"INSTALL_DATA=$(INSTALL_DATA)" \
-	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
-	"INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
-	"LDFLAGS=$(LDFLAGS)" \
-	"LIBCFLAGS=$(LIBCFLAGS)" \
-	"LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
-	"MAKE=$(MAKE)" \
-	"MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
-	"PICFLAG=$(PICFLAG)" \
-	"PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
-	"SHELL=$(SHELL)" \
-	"RUNTESTFLAGS=$(RUNTESTFLAGS)" \
-	"exec_prefix=$(exec_prefix)" \
-	"infodir=$(infodir)" \
-	"libdir=$(libdir)" \
-	"includedir=$(includedir)" \
-	"prefix=$(prefix)" \
-	"tooldir=$(tooldir)" \
-	"gxx_include_dir=$(gxx_include_dir)" \
-	"AR=$(AR)" \
-	"AS=$(AS)" \
-	"LD=$(LD)" \
-	"RANLIB=$(RANLIB)" \
-	"NM=$(NM)" \
-	"NM_FOR_BUILD=$(NM_FOR_BUILD)" \
-	"NM_FOR_TARGET=$(NM_FOR_TARGET)" \
-	"DESTDIR=$(DESTDIR)" \
-	"WERROR=$(WERROR)"
-
-
-# Subdir rules rely on $(FLAGS_TO_PASS)
-FLAGS_TO_PASS = $(AM_MAKEFLAGS)
-@GOC_IS_LLGO_FALSE@toolexeclib_LTLIBRARIES = libgo.la
-@GOC_IS_LLGO_TRUE@toolexeclib_LTLIBRARIES = libgo-llgo.la
-@GOC_IS_LLGO_FALSE@toolexeclib_LIBRARIES = libgobegin.a libgolibbegin.a libnetgo.a
-@GOC_IS_LLGO_TRUE@toolexeclib_LIBRARIES = libgobegin-llgo.a
-toolexeclibgo_DATA = \
-	bufio.gox \
-	bytes.gox \
-	crypto.gox \
-	encoding.gox \
-	errors.gox \
-	expvar.gox \
-	flag.gox \
-	fmt.gox \
-	hash.gox \
-	html.gox \
-	image.gox \
-	io.gox \
-	log.gox \
-	math.gox \
-	mime.gox \
-	net.gox \
-	os.gox \
-	path.gox \
-	reflect.gox \
-	regexp.gox \
-	runtime.gox \
-	sort.gox \
-	strconv.gox \
-	strings.gox \
-	sync.gox \
-	syscall.gox \
-	testing.gox \
-	time.gox \
-	unicode.gox
-
-toolexeclibgoarchivedir = $(toolexeclibgodir)/archive
-toolexeclibgoarchive_DATA = \
-	archive/tar.gox \
-	archive/zip.gox
-
-toolexeclibgocompressdir = $(toolexeclibgodir)/compress
-toolexeclibgocompress_DATA = \
-	compress/bzip2.gox \
-	compress/flate.gox \
-	compress/gzip.gox \
-	compress/lzw.gox \
-	compress/zlib.gox
-
-toolexeclibgocontainerdir = $(toolexeclibgodir)/container
-toolexeclibgocontainer_DATA = \
-	container/heap.gox \
-	container/list.gox \
-	container/ring.gox
-
-toolexeclibgocryptodir = $(toolexeclibgodir)/crypto
-toolexeclibgocrypto_DATA = \
-	crypto/aes.gox \
-	crypto/cipher.gox \
-	crypto/des.gox \
-	crypto/dsa.gox \
-	crypto/ecdsa.gox \
-	crypto/elliptic.gox \
-	crypto/hmac.gox \
-	crypto/md5.gox \
-	crypto/rand.gox \
-	crypto/rc4.gox \
-	crypto/rsa.gox \
-	crypto/sha1.gox \
-	crypto/sha256.gox \
-	crypto/sha512.gox \
-	crypto/subtle.gox \
-	crypto/tls.gox \
-	crypto/x509.gox
-
-toolexeclibgocryptox509dir = $(toolexeclibgocryptodir)/x509
-toolexeclibgocryptox509_DATA = \
-	crypto/x509/pkix.gox
-
-toolexeclibgodatabasedir = $(toolexeclibgodir)/database
-toolexeclibgodatabase_DATA = \
-	database/sql.gox
-
-toolexeclibgodatabasesqldir = $(toolexeclibgodatabasedir)/sql
-toolexeclibgodatabasesql_DATA = \
-	database/sql/driver.gox
-
-toolexeclibgodebugdir = $(toolexeclibgodir)/debug
-toolexeclibgodebug_DATA = \
-	debug/dwarf.gox \
-	debug/elf.gox \
-	debug/gosym.gox \
-	debug/macho.gox \
-	debug/pe.gox \
-	debug/plan9obj.gox
-
-toolexeclibgoencodingdir = $(toolexeclibgodir)/encoding
-toolexeclibgoencoding_DATA = \
-	encoding/ascii85.gox \
-	encoding/asn1.gox \
-	encoding/base32.gox \
-	encoding/base64.gox \
-	encoding/binary.gox \
-	encoding/csv.gox \
-	encoding/gob.gox \
-	encoding/hex.gox \
-	encoding/json.gox \
-	encoding/pem.gox \
-	encoding/xml.gox
-
-toolexeclibgoexpdir = $(toolexeclibgodir)/exp
-toolexeclibgoexp_DATA = \
-	exp/proxy.gox \
-	exp/terminal.gox
-
-toolexeclibgogodir = $(toolexeclibgodir)/go
-toolexeclibgogo_DATA = \
-	go/ast.gox \
-	go/build.gox \
-	go/constant.gox \
-	go/doc.gox \
-	go/format.gox \
-	go/importer.gox \
-	go/parser.gox \
-	go/printer.gox \
-	go/scanner.gox \
-	go/token.gox \
-	go/types.gox
-
-toolexeclibgohashdir = $(toolexeclibgodir)/hash
-toolexeclibgohash_DATA = \
-	hash/adler32.gox \
-	hash/crc32.gox \
-	hash/crc64.gox \
-	hash/fnv.gox
-
-toolexeclibgohtmldir = $(toolexeclibgodir)/html
-toolexeclibgohtml_DATA = \
-	html/template.gox
-
-toolexeclibgoimagedir = $(toolexeclibgodir)/image
-toolexeclibgoimage_DATA = \
-	image/color.gox \
-	image/draw.gox \
-	image/gif.gox \
-	image/jpeg.gox \
-	image/png.gox
-
-toolexeclibgoimagecolordir = $(toolexeclibgoimagedir)/color
-toolexeclibgoimagecolor_DATA = \
-	image/color/palette.gox
-
-toolexeclibgoindexdir = $(toolexeclibgodir)/index
-toolexeclibgoindex_DATA = \
-	index/suffixarray.gox
-
-toolexeclibgoiodir = $(toolexeclibgodir)/io
-toolexeclibgoio_DATA = \
-	io/ioutil.gox
-
-toolexeclibgologdir = $(toolexeclibgodir)/log
-toolexeclibgolog_DATA = \
-	log/syslog.gox
-
-toolexeclibgomathdir = $(toolexeclibgodir)/math
-toolexeclibgomath_DATA = \
-	math/big.gox \
-	math/cmplx.gox \
-	math/rand.gox
-
-toolexeclibgomimedir = $(toolexeclibgodir)/mime
-toolexeclibgomime_DATA = \
-	mime/multipart.gox \
-	mime/quotedprintable.gox
-
-toolexeclibgonetdir = $(toolexeclibgodir)/net
-toolexeclibgonet_DATA = \
-	net/http.gox \
-	net/mail.gox \
-	net/rpc.gox \
-	net/smtp.gox \
-	net/textproto.gox \
-	net/url.gox
-
-toolexeclibgonethttpdir = $(toolexeclibgonetdir)/http
-toolexeclibgonethttp_DATA = \
-	net/http/cgi.gox \
-	net/http/cookiejar.gox \
-	net/http/fcgi.gox \
-	net/http/httptest.gox \
-	net/http/httputil.gox \
-	net/http/pprof.gox
-
-toolexeclibgonetrpcdir = $(toolexeclibgonetdir)/rpc
-toolexeclibgonetrpc_DATA = \
-	net/rpc/jsonrpc.gox
-
-toolexeclibgoolddir = $(toolexeclibgodir)/old
-toolexeclibgoold_DATA = \
-	old/regexp.gox \
-	old/template.gox
-
-toolexeclibgoosdir = $(toolexeclibgodir)/os
-toolexeclibgoos_DATA = \
-	os/exec.gox \
-	os/signal.gox \
-	os/user.gox
-
-toolexeclibgopathdir = $(toolexeclibgodir)/path
-toolexeclibgopath_DATA = \
-	path/filepath.gox
-
-toolexeclibgoregexpdir = $(toolexeclibgodir)/regexp
-toolexeclibgoregexp_DATA = \
-	regexp/syntax.gox
-
-toolexeclibgoruntimedir = $(toolexeclibgodir)/runtime
-toolexeclibgoruntime_DATA = \
-	runtime/debug.gox \
-	runtime/pprof.gox
-
-toolexeclibgosyncdir = $(toolexeclibgodir)/sync
-toolexeclibgosync_DATA = \
-	sync/atomic.gox
-
-toolexeclibgotestingdir = $(toolexeclibgodir)/testing
-toolexeclibgotesting_DATA = \
-	testing/iotest.gox \
-	testing/quick.gox
-
-toolexeclibgotextdir = $(toolexeclibgodir)/text
-toolexeclibgotext_DATA = \
-	text/scanner.gox \
-	text/tabwriter.gox \
-	text/template.gox
-
-toolexeclibgotexttemplatedir = $(toolexeclibgotextdir)/template
-toolexeclibgotexttemplate_DATA = \
-	text/template/parse.gox
-
-toolexeclibgounicodedir = $(toolexeclibgodir)/unicode
-toolexeclibgounicode_DATA = \
-	unicode/utf16.gox \
-	unicode/utf8.gox
-
-@HAVE_SYS_MMAN_H_FALSE@runtime_mem_file = runtime/mem_posix_memalign.c
-@HAVE_SYS_MMAN_H_TRUE@runtime_mem_file = runtime/mem.c
-@LIBGO_IS_RTEMS_FALSE@rtems_task_variable_add_file = 
-@LIBGO_IS_RTEMS_TRUE@rtems_task_variable_add_file = runtime/rtems-task-variable-add.c
-@LIBGO_IS_LINUX_FALSE@runtime_lock_files = runtime/lock_sema.c runtime/thread-sema.c
-@LIBGO_IS_LINUX_TRUE@runtime_lock_files = runtime/lock_futex.c runtime/thread-linux.c
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@runtime_getncpu_file = runtime/getncpu-none.c
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_TRUE@@LIBGO_IS_SOLARIS_FALSE@runtime_getncpu_file = runtime/getncpu-bsd.c
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@runtime_getncpu_file = runtime/getncpu-bsd.c
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@runtime_getncpu_file = runtime/getncpu-solaris.c
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_IRIX_TRUE@@LIBGO_IS_LINUX_FALSE@runtime_getncpu_file = runtime/getncpu-irix.c
-@LIBGO_IS_DARWIN_TRUE@@LIBGO_IS_LINUX_FALSE@runtime_getncpu_file = runtime/getncpu-bsd.c
-@LIBGO_IS_LINUX_TRUE@runtime_getncpu_file = runtime/getncpu-linux.c
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@runtime_netpoll_files = runtime/netpoll_kqueue.c
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@runtime_netpoll_files = runtime/netpoll_select.c
-@LIBGO_IS_LINUX_TRUE@runtime_netpoll_files = runtime/netpoll_epoll.c
-runtime_files = \
-	runtime/go-append.c \
-	runtime/go-assert.c \
-	runtime/go-assert-interface.c \
-	runtime/go-byte-array-to-string.c \
-	runtime/go-breakpoint.c \
-	runtime/go-caller.c \
-	runtime/go-callers.c \
-	runtime/go-can-convert-interface.c \
-	runtime/go-cdiv.c \
-	runtime/go-cgo.c \
-	runtime/go-check-interface.c \
-	runtime/go-construct-map.c \
-	runtime/go-convert-interface.c \
-	runtime/go-copy.c \
-	runtime/go-defer.c \
-	runtime/go-deferred-recover.c \
-	runtime/go-eface-compare.c \
-	runtime/go-eface-val-compare.c \
-	runtime/go-ffi.c \
-	runtime/go-fieldtrack.c \
-	runtime/go-int-array-to-string.c \
-	runtime/go-int-to-string.c \
-	runtime/go-interface-compare.c \
-	runtime/go-interface-eface-compare.c \
-	runtime/go-interface-val-compare.c \
-	runtime/go-make-slice.c \
-	runtime/go-map-delete.c \
-	runtime/go-map-index.c \
-	runtime/go-map-len.c \
-	runtime/go-map-range.c \
-	runtime/go-matherr.c \
-	runtime/go-memcmp.c \
-	runtime/go-nanotime.c \
-	runtime/go-now.c \
-	runtime/go-new-map.c \
-	runtime/go-new.c \
-	runtime/go-nosys.c \
-	runtime/go-panic.c \
-	runtime/go-print.c \
-	runtime/go-recover.c \
-	runtime/go-reflect-call.c \
-	runtime/go-reflect-map.c \
-	runtime/go-rune.c \
-	runtime/go-runtime-error.c \
-	runtime/go-setenv.c \
-	runtime/go-signal.c \
-	runtime/go-strcmp.c \
-	runtime/go-string-to-byte-array.c \
-	runtime/go-string-to-int-array.c \
-	runtime/go-strplus.c \
-	runtime/go-strslice.c \
-	runtime/go-traceback.c \
-	runtime/go-type-complex.c \
-	runtime/go-type-eface.c \
-	runtime/go-type-error.c \
-	runtime/go-type-float.c \
-	runtime/go-type-identity.c \
-	runtime/go-type-interface.c \
-	runtime/go-type-string.c \
-	runtime/go-typedesc-equal.c \
-	runtime/go-unsafe-new.c \
-	runtime/go-unsafe-newarray.c \
-	runtime/go-unsafe-pointer.c \
-	runtime/go-unsetenv.c \
-	runtime/go-unwind.c \
-	runtime/go-varargs.c \
-	runtime/env_posix.c \
-	runtime/heapdump.c \
-	$(runtime_lock_files) \
-	runtime/mcache.c \
-	runtime/mcentral.c \
-	$(runtime_mem_file) \
-	runtime/mfixalloc.c \
-	runtime/mgc0.c \
-	runtime/mheap.c \
-	runtime/msize.c \
-	$(runtime_netpoll_files) \
-	runtime/panic.c \
-	runtime/parfor.c \
-	runtime/print.c \
-	runtime/proc.c \
-	runtime/runtime.c \
-	runtime/signal_unix.c \
-	runtime/thread.c \
-	runtime/yield.c \
-	$(rtems_task_variable_add_file) \
-	chan.c \
-	cpuprof.c \
-	go-iface.c \
-	lfstack.c \
-	malloc.c \
-	map.c \
-	mprof.c \
-	netpoll.c \
-	rdebug.c \
-	reflect.c \
-	runtime1.c \
-	sema.c \
-	sigqueue.c \
-	string.c \
-	time.c \
-	$(runtime_getncpu_file)
-
-go_bufio_files = \
-	go/bufio/bufio.go \
-	go/bufio/scan.go
-
-go_bytes_files = \
-	go/bytes/buffer.go \
-	go/bytes/bytes.go \
-	go/bytes/bytes_decl.go \
-	go/bytes/reader.go
-
-go_bytes_c_files = \
-	go/bytes/indexbyte.c
-
-go_crypto_files = \
-	go/crypto/crypto.go
-
-go_encoding_files = \
-	go/encoding/encoding.go
-
-go_errors_files = \
-	go/errors/errors.go
-
-go_expvar_files = \
-	go/expvar/expvar.go
-
-go_flag_files = \
-	go/flag/flag.go
-
-go_fmt_files = \
-	go/fmt/doc.go \
-	go/fmt/format.go \
-	go/fmt/print.go \
-	go/fmt/scan.go
-
-go_hash_files = \
-	go/hash/hash.go
-
-go_html_files = \
-	go/html/entity.go \
-	go/html/escape.go
-
-go_image_files = \
-	go/image/format.go \
-	go/image/geom.go \
-	go/image/image.go \
-	go/image/names.go \
-	go/image/ycbcr.go
-
-go_io_files = \
-	go/io/multi.go \
-	go/io/io.go \
-	go/io/pipe.go
-
-go_log_files = \
-	go/log/log.go
-
-go_math_files = \
-	go/math/abs.go \
-	go/math/acosh.go \
-	go/math/asin.go \
-	go/math/asinh.go \
-	go/math/atan.go \
-	go/math/atanh.go \
-	go/math/atan2.go \
-	go/math/bits.go \
-	go/math/cbrt.go \
-	go/math/const.go \
-	go/math/copysign.go \
-	go/math/dim.go \
-	go/math/erf.go \
-	go/math/exp.go \
-	go/math/expm1.go \
-	go/math/floor.go \
-	go/math/frexp.go \
-	go/math/gamma.go \
-	go/math/hypot.go \
-	go/math/j0.go \
-	go/math/j1.go \
-	go/math/jn.go \
-	go/math/ldexp.go \
-	go/math/lgamma.go \
-	go/math/log.go \
-	go/math/log1p.go \
-	go/math/log10.go \
-	go/math/logb.go \
-	go/math/mod.go \
-	go/math/modf.go \
-	go/math/nextafter.go \
-	go/math/pow.go \
-	go/math/pow10.go \
-	go/math/remainder.go \
-	go/math/signbit.go \
-	go/math/sin.go \
-	go/math/sincos.go \
-	go/math/sinh.go \
-	go/math/sqrt.go \
-	go/math/tan.go \
-	go/math/tanh.go \
-	go/math/unsafe.go
-
-@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_OPENBSD_FALSE@go_mime_type_file = 
-@LIBGO_IS_DRAGONFLY_TRUE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_OPENBSD_FALSE@go_mime_type_file = go/mime/type_dragonfly.go
-@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_OPENBSD_FALSE@go_mime_type_file = go/mime/type_freebsd.go
-@LIBGO_IS_OPENBSD_TRUE@go_mime_type_file = go/mime/type_openbsd.go
-go_mime_files = \
-	go/mime/encodedword.go \
-	go/mime/grammar.go \
-	go/mime/mediatype.go \
-	go/mime/type.go \
-	go/mime/type_unix.go \
-	$(go_mime_type_file)
-
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_cgo_file = go/net/cgo_bsd.go
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_TRUE@@LIBGO_IS_SOLARIS_FALSE@go_net_cgo_file = go/net/cgo_netbsd.go
-@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_cgo_file = go/net/cgo_bsd.go
-@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@go_net_cgo_file = go/net/cgo_solaris.go
-@LIBGO_IS_IRIX_TRUE@@LIBGO_IS_LINUX_FALSE@go_net_cgo_file = go/net/cgo_linux.go
-@LIBGO_IS_LINUX_TRUE@go_net_cgo_file = go/net/cgo_linux.go
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_sock_file = go/net/sock_bsd.go
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_TRUE@@LIBGO_IS_SOLARIS_FALSE@go_net_sock_file = go/net/sock_bsd.go
-@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_sock_file = go/net/sock_bsd.go
-@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@go_net_sock_file = go/net/sock_stub.go
-@LIBGO_IS_IRIX_TRUE@@LIBGO_IS_LINUX_FALSE@go_net_sock_file = go/net/sock_linux.go
-@LIBGO_IS_LINUX_TRUE@go_net_sock_file = go/net/sock_linux.go
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_sockopt_file = go/net/sockopt_bsd.go
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_TRUE@@LIBGO_IS_SOLARIS_FALSE@go_net_sockopt_file = go/net/sockopt_bsd.go
-@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_sockopt_file = go/net/sockopt_bsd.go
-@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@go_net_sockopt_file = go/net/sockopt_solaris.go
-@LIBGO_IS_IRIX_TRUE@@LIBGO_IS_LINUX_FALSE@go_net_sockopt_file = go/net/sockopt_linux.go
-@LIBGO_IS_LINUX_TRUE@go_net_sockopt_file = go/net/sockopt_linux.go
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_sockoptip_file = go/net/sockoptip_bsd.go go/net/sockoptip_posix.go
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_TRUE@@LIBGO_IS_SOLARIS_FALSE@go_net_sockoptip_file = go/net/sockoptip_bsd.go go/net/sockoptip_posix.go
-@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_sockoptip_file = go/net/sockoptip_bsd.go go/net/sockoptip_posix.go
-@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@go_net_sockoptip_file = go/net/sockoptip_stub.go
-@LIBGO_IS_IRIX_TRUE@@LIBGO_IS_LINUX_FALSE@go_net_sockoptip_file = go/net/sockoptip_linux.go go/net/sockoptip_posix.go
-@LIBGO_IS_LINUX_TRUE@go_net_sockoptip_file = go/net/sockoptip_linux.go go/net/sockoptip_posix.go
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_cgo_sock_file = go/net/cgo_sockold.go
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_TRUE@@LIBGO_IS_SOLARIS_FALSE@go_net_cgo_sock_file = go/net/cgo_sockold.go
-@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_cgo_sock_file = go/net/cgo_sockold.go
-@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@go_net_cgo_sock_file = go/net/cgo_socknew.go
-@LIBGO_IS_IRIX_TRUE@@LIBGO_IS_LINUX_FALSE@go_net_cgo_sock_file = go/net/cgo_socknew.go
-@LIBGO_IS_LINUX_TRUE@go_net_cgo_sock_file = go/net/cgo_socknew.go
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_cgo_res_file = go/net/cgo_resold.go
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_TRUE@@LIBGO_IS_SOLARIS_FALSE@go_net_cgo_res_file = go/net/cgo_resnew.go
-@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_cgo_res_file = go/net/cgo_resold.go
-@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@go_net_cgo_res_file = go/net/cgo_resnew.go
-@LIBGO_IS_IRIX_TRUE@@LIBGO_IS_LINUX_FALSE@go_net_cgo_res_file = go/net/cgo_resnew.go
-@LIBGO_IS_LINUX_TRUE@go_net_cgo_res_file = go/net/cgo_resnew.go
-@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_sendfile_file = go/net/sendfile_stub.go
-@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@go_net_sendfile_file = go/net/sendfile_solaris.go
-@LIBGO_IS_DRAGONFLY_TRUE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_LINUX_FALSE@go_net_sendfile_file = go/net/sendfile_dragonfly.go
-@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_LINUX_FALSE@go_net_sendfile_file = go/net/sendfile_freebsd.go
-@LIBGO_IS_LINUX_TRUE@go_net_sendfile_file = go/net/sendfile_linux.go
-@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@go_net_interface_file = go/net/interface_stub.go
-@LIBGO_IS_DRAGONFLY_TRUE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@go_net_interface_file = go/net/interface_dragonfly.go
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_TRUE@go_net_interface_file = go/net/interface_netbsd.go
-@LIBGO_IS_LINUX_TRUE@go_net_interface_file = go/net/interface_linux.go
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_LINUX_FALSE@go_net_cloexec_file = go/net/sys_cloexec.go
-@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_LINUX_FALSE@go_net_cloexec_file = go/net/sock_cloexec.go go/net/hook_cloexec.go
-@LIBGO_IS_LINUX_TRUE@go_net_cloexec_file = go/net/sock_cloexec.go go/net/hook_cloexec.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_tcpsockopt_file = go/net/tcpsockopt_unix.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_DRAGONFLY_TRUE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_net_tcpsockopt_file = go/net/tcpsockopt_dragonfly.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_TRUE@go_net_tcpsockopt_file = go/net/tcpsockopt_solaris.go
-@LIBGO_IS_DARWIN_TRUE@@LIBGO_IS_OPENBSD_FALSE@go_net_tcpsockopt_file = go/net/tcpsockopt_darwin.go
-@LIBGO_IS_OPENBSD_TRUE@go_net_tcpsockopt_file = go/net/tcpsockopt_openbsd.go
-go_net_common_files = \
-	go/net/addrselect.go \
-	$(go_net_cloexec_file) \
-	go/net/conf.go \
-	go/net/dial.go \
-	go/net/dnsclient.go \
-	go/net/dnsclient_unix.go \
-	go/net/dnsconfig_unix.go \
-	go/net/dnsmsg.go \
-	go/net/fd_mutex.go \
-	go/net/fd_posix.go \
-	go/net/fd_unix.go \
-	go/net/file.go \
-	go/net/file_unix.go \
-	go/net/hook.go \
-	go/net/hook_unix.go \
-	go/net/hosts.go \
-	go/net/interface.go \
-	$(go_net_interface_file) \
-	go/net/ip.go \
-	go/net/iprawsock.go \
-	go/net/iprawsock_posix.go \
-	go/net/ipsock.go \
-	go/net/ipsock_posix.go \
-	go/net/lookup.go \
-	go/net/lookup_unix.go \
-	go/net/mac.go \
-	go/net/net.go \
-	go/net/nss.go \
-	go/net/parse.go \
-	go/net/pipe.go \
-	go/net/fd_poll_runtime.go \
-	go/net/port.go \
-	go/net/port_unix.go \
-	go/net/race0.go \
-	$(go_net_sendfile_file) \
-	go/net/sock_posix.go \
-	$(go_net_sock_file) \
-	go/net/sockopt_posix.go \
-	$(go_net_sockopt_file) \
-	$(go_net_sockoptip_file) \
-	go/net/tcpsock.go \
-	go/net/tcpsock_posix.go \
-	go/net/tcpsockopt_posix.go \
-	$(go_net_tcpsockopt_file) \
-	go/net/udpsock.go \
-	go/net/udpsock_posix.go \
-	go/net/unixsock.go \
-	go/net/unixsock_posix.go
-
-go_net_files = \
-	go/net/cgo_unix.go \
-	$(go_net_cgo_file) \
-	$(go_net_cgo_res_file) \
-	$(go_net_cgo_sock_file) \
-	$(go_net_common_files)
-
-go_netgo_files = \
-	go/net/cgo_stub.go \
-	$(go_net_common_files)
-
-@LIBGO_IS_386_FALSE@@LIBGO_IS_SOLARIS_TRUE@@LIBGO_IS_SPARC_FALSE@go_os_dir_file = go/os/dir_regfile.go
-@LIBGO_IS_386_FALSE@@LIBGO_IS_SOLARIS_TRUE@@LIBGO_IS_SPARC_TRUE@go_os_dir_file = go/os/dir_largefile.go
-@LIBGO_IS_386_TRUE@@LIBGO_IS_SOLARIS_TRUE@go_os_dir_file = go/os/dir_largefile.go
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_os_dir_file = go/os/dir_regfile.go
-@LIBGO_IS_LINUX_TRUE@@LIBGO_IS_SOLARIS_FALSE@go_os_dir_file = go/os/dir_largefile.go
-@LIBGO_IS_DARWIN_FALSE@go_os_getwd_file = 
-@LIBGO_IS_DARWIN_TRUE@go_os_getwd_file = go/os/getwd_darwin.go
-@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_RTEMS_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_os_sys_file = go/os/sys_bsd.go
-@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_RTEMS_TRUE@@LIBGO_IS_SOLARIS_FALSE@go_os_sys_file = go/os/sys_uname.go
-@LIBGO_IS_IRIX_TRUE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_os_sys_file = go/os/sys_uname.go
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@go_os_sys_file = go/os/sys_uname.go
-@LIBGO_IS_LINUX_TRUE@go_os_sys_file = go/os/sys_linux.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_FREEBSD_FALSE@go_os_cloexec_file = go/os/sys_unix.go
-@LIBGO_IS_DARWIN_TRUE@@LIBGO_IS_FREEBSD_FALSE@go_os_cloexec_file = go/os/sys_darwin.go
-@LIBGO_IS_FREEBSD_TRUE@go_os_cloexec_file = go/os/sys_freebsd.go
-@HAVE_STAT_TIMESPEC_FALSE@@LIBGO_IS_SOLARIS_TRUE@go_os_stat_file = go/os/stat_solaris.go
-@HAVE_STAT_TIMESPEC_TRUE@@LIBGO_IS_SOLARIS_TRUE@go_os_stat_file = go/os/stat_atim.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_os_stat_file = go/os/stat.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_DRAGONFLY_TRUE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_os_stat_file = go/os/stat_dragonfly.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_TRUE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_os_stat_file = go/os/stat_atimespec.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_os_stat_file = go/os/stat_atimespec.go
-@LIBGO_IS_DARWIN_TRUE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_os_stat_file = go/os/stat_atimespec.go
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_OPENBSD_TRUE@@LIBGO_IS_SOLARIS_FALSE@go_os_stat_file = go/os/stat_atim.go
-@LIBGO_IS_LINUX_TRUE@@LIBGO_IS_SOLARIS_FALSE@go_os_stat_file = go/os/stat_atim.go
-@LIBGO_IS_LINUX_FALSE@go_os_pipe_file = go/os/pipe_bsd.go
-@LIBGO_IS_LINUX_TRUE@go_os_pipe_file = go/os/pipe_linux.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_os_sticky_file = go/os/sticky_notbsd.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_TRUE@go_os_sticky_file = go/os/sticky_bsd.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_OPENBSD_TRUE@go_os_sticky_file = go/os/sticky_bsd.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_NETBSD_TRUE@go_os_sticky_file = go/os/sticky_bsd.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_TRUE@go_os_sticky_file = go/os/sticky_bsd.go
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_DRAGONFLY_TRUE@go_os_sticky_file = go/os/sticky_bsd.go
-@LIBGO_IS_DARWIN_TRUE@go_os_sticky_file = go/os/sticky_bsd.go
-go_os_files = \
-	$(go_os_dir_file) \
-	go/os/dir.go \
-	go/os/doc.go \
-	go/os/env.go \
-	go/os/error.go \
-	go/os/error_unix.go \
-	go/os/exec.go \
-	go/os/exec_posix.go \
-	go/os/exec_unix.go \
-	go/os/file.go \
-	go/os/file_posix.go \
-	go/os/file_unix.go \
-	go/os/getwd.go \
-	$(go_os_getwd_file) \
-	go/os/path.go \
-	go/os/path_unix.go \
-	$(go_os_pipe_file) \
-	go/os/proc.go \
-	$(go_os_stat_file) \
-	$(go_os_sticky_file) \
-	go/os/str.go \
-	$(go_os_sys_file) \
-	$(go_os_cloexec_file) \
-	go/os/types.go \
-	go/os/types_notwin.go
-
-go_path_files = \
-	go/path/match.go \
-	go/path/path.go
-
-go_reflect_files = \
-	go/reflect/deepequal.go \
-	go/reflect/makefunc.go \
-	go/reflect/makefunc_ffi.go \
-	go/reflect/type.go \
-	go/reflect/value.go
-
-go_reflect_makefunc_c_file = \
-	go/reflect/makefunc_ffi_c.c
-
-go_regexp_files = \
-	go/regexp/backtrack.go \
-	go/regexp/exec.go \
-	go/regexp/onepass.go \
-	go/regexp/regexp.go
-
-go_net_rpc_files = \
-	go/net/rpc/client.go \
-	go/net/rpc/debug.go \
-	go/net/rpc/server.go
-
-go_runtime_files = \
-	go/runtime/compiler.go \
-	go/runtime/debug.go \
-	go/runtime/error.go \
-	go/runtime/extern.go \
-	go/runtime/mem.go \
-	version.go
-
-noinst_DATA = zstdpkglist.go
-go_sort_files = \
-	go/sort/search.go \
-	go/sort/sort.go
-
-go_strconv_files = \
-	go/strconv/atob.go \
-	go/strconv/atof.go \
-	go/strconv/atoi.go \
-	go/strconv/decimal.go \
-	go/strconv/doc.go \
-	go/strconv/extfloat.go \
-	go/strconv/ftoa.go \
-	go/strconv/isprint.go \
-	go/strconv/itoa.go \
-	go/strconv/quote.go
-
-go_strings_files = \
-	go/strings/compare.go \
-	go/strings/reader.go \
-	go/strings/replace.go \
-	go/strings/search.go \
-	go/strings/strings.go \
-	go/strings/strings_decl.go
-
-go_strings_c_files = \
-	go/strings/indexbyte.c
-
-go_sync_files = \
-	go/sync/cond.go \
-	go/sync/mutex.go \
-	go/sync/once.go \
-	go/sync/pool.go \
-	go/sync/race0.go \
-	go/sync/runtime.go \
-	go/sync/rwmutex.go \
-	go/sync/waitgroup.go
-
-@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_syslog_file = go/log/syslog/syslog_unix.go
-@LIBGO_IS_IRIX_TRUE@@LIBGO_IS_SOLARIS_FALSE@go_syslog_file = go/log/syslog/syslog_libc.go
-@LIBGO_IS_SOLARIS_TRUE@go_syslog_file = go/log/syslog/syslog_libc.go
-go_log_syslog_files = \
-	go/log/syslog/doc.go \
-	go/log/syslog/syslog.go \
-	$(go_syslog_file)
-
-go_syslog_c_files = \
-	go/log/syslog/syslog_c.c
-
-go_testing_files = \
-	go/testing/allocs.go \
-	go/testing/benchmark.go \
-	go/testing/cover.go \
-	go/testing/example.go \
-	go/testing/testing.go
-
-go_time_files = \
-	go/time/format.go \
-	go/time/sleep.go \
-	go/time/sys_unix.go \
-	go/time/tick.go \
-	go/time/time.go \
-	go/time/zoneinfo.go \
-	go/time/zoneinfo_read.go \
-	go/time/zoneinfo_unix.go
-
-go_unicode_files = \
-	go/unicode/casetables.go \
-	go/unicode/digit.go \
-	go/unicode/graphic.go \
-	go/unicode/letter.go \
-	go/unicode/tables.go
-
-@LIBGO_IS_DARWIN_TRUE@archive_tar_atim_file = go/archive/tar/stat_atimespec.go
-@LIBGO_IS_FREEBSD_TRUE@archive_tar_atim_file = go/archive/tar/stat_atimespec.go
-@LIBGO_IS_LINUX_TRUE@archive_tar_atim_file = go/archive/tar/stat_atim.go
-@LIBGO_IS_NETBSD_TRUE@archive_tar_atim_file = go/archive/tar/stat_atimespec.go
-@LIBGO_IS_OPENBSD_TRUE@archive_tar_atim_file = go/archive/tar/stat_atim.go
-@LIBGO_IS_SOLARIS_TRUE@archive_tar_atim_file = go/archive/tar/stat_atim.go
-go_archive_tar_files = \
-	go/archive/tar/common.go \
-	go/archive/tar/reader.go \
-	go/archive/tar/stat_unix.go \
-	go/archive/tar/writer.go \
-	$(archive_tar_atim_file)
-
-go_archive_zip_files = \
-	go/archive/zip/reader.go \
-	go/archive/zip/register.go \
-	go/archive/zip/struct.go \
-	go/archive/zip/writer.go
-
-go_compress_bzip2_files = \
-	go/compress/bzip2/bit_reader.go \
-	go/compress/bzip2/bzip2.go \
-	go/compress/bzip2/huffman.go \
-	go/compress/bzip2/move_to_front.go
-
-go_compress_flate_files = \
-	go/compress/flate/copy.go \
-	go/compress/flate/deflate.go \
-	go/compress/flate/fixedhuff.go \
-	go/compress/flate/huffman_bit_writer.go \
-	go/compress/flate/huffman_code.go \
-	go/compress/flate/inflate.go \
-	go/compress/flate/reverse_bits.go \
-	go/compress/flate/token.go
-
-go_compress_gzip_files = \
-	go/compress/gzip/gzip.go \
-	go/compress/gzip/gunzip.go
-
-go_compress_lzw_files = \
-	go/compress/lzw/reader.go \
-	go/compress/lzw/writer.go
-
-go_compress_zlib_files = \
-	go/compress/zlib/reader.go \
-	go/compress/zlib/writer.go
-
-go_container_heap_files = \
-	go/container/heap/heap.go
-
-go_container_list_files = \
-	go/container/list/list.go
-
-go_container_ring_files = \
-	go/container/ring/ring.go
-
-go_crypto_aes_files = \
-	go/crypto/aes/block.go \
-	go/crypto/aes/cipher.go \
-	go/crypto/aes/cipher_generic.go \
-	go/crypto/aes/const.go
-
-go_crypto_cipher_files = \
-	go/crypto/cipher/cbc.go \
-	go/crypto/cipher/cfb.go \
-	go/crypto/cipher/cipher.go \
-	go/crypto/cipher/ctr.go \
-	go/crypto/cipher/gcm.go \
-	go/crypto/cipher/io.go \
-	go/crypto/cipher/ofb.go \
-	go/crypto/cipher/xor.go
-
-go_crypto_des_files = \
-	go/crypto/des/block.go \
-	go/crypto/des/cipher.go \
-	go/crypto/des/const.go
-
-go_crypto_dsa_files = \
-	go/crypto/dsa/dsa.go
-
-go_crypto_ecdsa_files = \
-	go/crypto/ecdsa/ecdsa.go
-
-go_crypto_elliptic_files = \
-	go/crypto/elliptic/elliptic.go \
-	go/crypto/elliptic/p224.go \
-	go/crypto/elliptic/p256.go
-
-go_crypto_hmac_files = \
-	go/crypto/hmac/hmac.go
-
-go_crypto_md5_files = \
-	go/crypto/md5/md5.go \
-	go/crypto/md5/md5block.go \
-	go/crypto/md5/md5block_generic.go
-
-@LIBGO_IS_LINUX_FALSE@crypto_rand_file = 
-@LIBGO_IS_LINUX_TRUE@crypto_rand_file = go/crypto/rand/rand_linux.go
-go_crypto_rand_files = \
-	go/crypto/rand/eagain.go \
-	go/crypto/rand/rand.go \
-	go/crypto/rand/rand_unix.go \
-	$(crypto_rand_file) \
-	go/crypto/rand/util.go
-
-go_crypto_rc4_files = \
-	go/crypto/rc4/rc4.go \
-	go/crypto/rc4/rc4_ref.go
-
-go_crypto_rsa_files = \
-	go/crypto/rsa/pkcs1v15.go \
-	go/crypto/rsa/pss.go \
-	go/crypto/rsa/rsa.go
-
-go_crypto_sha1_files = \
-	go/crypto/sha1/sha1.go \
-	go/crypto/sha1/sha1block.go \
-	go/crypto/sha1/sha1block_generic.go
-
-go_crypto_sha256_files = \
-	go/crypto/sha256/sha256.go \
-	go/crypto/sha256/sha256block.go
-
-go_crypto_sha512_files = \
-	go/crypto/sha512/sha512.go \
-	go/crypto/sha512/sha512block.go
-
-go_crypto_subtle_files = \
-	go/crypto/subtle/constant_time.go
-
-go_crypto_tls_files = \
-	go/crypto/tls/alert.go \
-	go/crypto/tls/cipher_suites.go \
-	go/crypto/tls/common.go \
-	go/crypto/tls/conn.go \
-	go/crypto/tls/handshake_client.go \
-	go/crypto/tls/handshake_messages.go \
-	go/crypto/tls/handshake_server.go \
-	go/crypto/tls/key_agreement.go \
-	go/crypto/tls/prf.go \
-	go/crypto/tls/ticket.go \
-	go/crypto/tls/tls.go
-
-@LIBGO_IS_DARWIN_FALSE@@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_crypto_x509_root_file = 
-@LIBGO_IS_DARWIN_TRUE@@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_OPENBSD_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_crypto_x509_root_file = go/crypto/x509/root_darwin.go
-@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_FALSE@@LIBGO_IS_OPENBSD_TRUE@@LIBGO_IS_SOLARIS_FALSE@go_crypto_x509_root_file = go/crypto/x509/root_bsd.go
-@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_NETBSD_TRUE@@LIBGO_IS_SOLARIS_FALSE@go_crypto_x509_root_file = go/crypto/x509/root_bsd.go
-@LIBGO_IS_DRAGONFLY_FALSE@@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_crypto_x509_root_file = go/crypto/x509/root_bsd.go
-@LIBGO_IS_DRAGONFLY_TRUE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@go_crypto_x509_root_file = go/crypto/x509/root_bsd.go
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@go_crypto_x509_root_file = go/crypto/x509/root_solaris.go
-@LIBGO_IS_LINUX_TRUE@go_crypto_x509_root_file = go/crypto/x509/root_linux.go
-go_crypto_x509_files = \
-	go/crypto/x509/cert_pool.go \
-	go/crypto/x509/pem_decrypt.go \
-	go/crypto/x509/pkcs1.go \
-	go/crypto/x509/pkcs8.go \
-	go/crypto/x509/root.go \
-	go/crypto/x509/root_unix.go \
-	$(go_crypto_x509_root_file) \
-	go/crypto/x509/sec1.go \
-	go/crypto/x509/verify.go \
-	go/crypto/x509/x509.go
-
-go_crypto_x509_pkix_files = \
-	go/crypto/x509/pkix/pkix.go
-
-go_database_sql_files = \
-	go/database/sql/convert.go \
-	go/database/sql/sql.go
-
-go_database_sql_driver_files = \
-	go/database/sql/driver/driver.go \
-	go/database/sql/driver/types.go
-
-go_debug_dwarf_files = \
-	go/debug/dwarf/buf.go \
-	go/debug/dwarf/class_string.go \
-	go/debug/dwarf/const.go \
-	go/debug/dwarf/entry.go \
-	go/debug/dwarf/line.go \
-	go/debug/dwarf/open.go \
-	go/debug/dwarf/type.go \
-	go/debug/dwarf/typeunit.go \
-	go/debug/dwarf/unit.go
-
-go_debug_elf_files = \
-	go/debug/elf/elf.go \
-	go/debug/elf/file.go
-
-go_debug_gosym_files = \
-	go/debug/gosym/pclntab.go \
-	go/debug/gosym/symtab.go
-
-go_debug_macho_files = \
-	go/debug/macho/fat.go \
-	go/debug/macho/file.go \
-	go/debug/macho/macho.go
-
-go_debug_pe_files = \
-	go/debug/pe/file.go \
-	go/debug/pe/pe.go
-
-go_debug_plan9obj_files = \
-	go/debug/plan9obj/file.go \
-	go/debug/plan9obj/plan9obj.go
-
-go_encoding_ascii85_files = \
-	go/encoding/ascii85/ascii85.go
-
-go_encoding_asn1_files = \
-	go/encoding/asn1/asn1.go \
-	go/encoding/asn1/common.go \
-	go/encoding/asn1/marshal.go
-
-go_encoding_base32_files = \
-	go/encoding/base32/base32.go
-
-go_encoding_base64_files = \
-	go/encoding/base64/base64.go
-
-go_encoding_binary_files = \
-	go/encoding/binary/binary.go \
-	go/encoding/binary/varint.go
-
-go_encoding_csv_files = \
-	go/encoding/csv/reader.go \
-	go/encoding/csv/writer.go
-
-go_encoding_gob_files = \
-	go/encoding/gob/decode.go \
-	go/encoding/gob/decoder.go \
-	go/encoding/gob/dec_helpers.go \
-	go/encoding/gob/doc.go \
-	go/encoding/gob/encode.go \
-	go/encoding/gob/encoder.go \
-	go/encoding/gob/enc_helpers.go \
-	go/encoding/gob/error.go \
-	go/encoding/gob/type.go
-
-go_encoding_hex_files = \
-	go/encoding/hex/hex.go
-
-go_encoding_json_files = \
-	go/encoding/json/decode.go \
-	go/encoding/json/encode.go \
-	go/encoding/json/fold.go \
-	go/encoding/json/indent.go \
-	go/encoding/json/scanner.go \
-	go/encoding/json/stream.go \
-	go/encoding/json/tags.go
-
-go_encoding_pem_files = \
-	go/encoding/pem/pem.go
-
-go_encoding_xml_files = \
-	go/encoding/xml/marshal.go \
-	go/encoding/xml/read.go \
-	go/encoding/xml/typeinfo.go \
-	go/encoding/xml/xml.go
-
-go_exp_proxy_files = \
-	go/exp/proxy/direct.go \
-	go/exp/proxy/per_host.go \
-	go/exp/proxy/proxy.go \
-	go/exp/proxy/socks5.go
-
-go_exp_terminal_files = \
-	go/exp/terminal/terminal.go \
-	go/exp/terminal/util.go
-
-go_go_ast_files = \
-	go/go/ast/ast.go \
-	go/go/ast/commentmap.go \
-	go/go/ast/filter.go \
-	go/go/ast/import.go \
-	go/go/ast/print.go \
-	go/go/ast/resolve.go \
-	go/go/ast/scope.go \
-	go/go/ast/walk.go
-
-go_go_build_files = \
-	go/go/build/build.go \
-	go/go/build/doc.go \
-	go/go/build/read.go \
-	go/go/build/syslist.go
-
-go_go_constant_files = \
-	go/go/constant/go14.go \
-	go/go/constant/value.go
-
-go_go_doc_files = \
-	go/go/doc/comment.go \
-	go/go/doc/doc.go \
-	go/go/doc/example.go \
-	go/go/doc/exports.go \
-	go/go/doc/filter.go \
-	go/go/doc/reader.go \
-	go/go/doc/synopsis.go
-
-go_go_format_files = \
-	go/go/format/format.go
-
-go_go_importer_files = \
-	go/go/importer/importer.go
-
-go_go_parser_files = \
-	go/go/parser/interface.go \
-	go/go/parser/parser.go
-
-go_go_printer_files = \
-	go/go/printer/nodes.go \
-	go/go/printer/printer.go
-
-go_go_scanner_files = \
-	go/go/scanner/errors.go \
-	go/go/scanner/scanner.go
-
-go_go_token_files = \
-	go/go/token/position.go \
-	go/go/token/serialize.go \
-	go/go/token/token.go
-
-go_go_types_files = \
-	go/go/types/api.go \
-	go/go/types/assignments.go \
-	go/go/types/builtins.go \
-	go/go/types/call.go \
-	go/go/types/check.go \
-	go/go/types/conversions.go \
-	go/go/types/decl.go \
-	go/go/types/errors.go \
-	go/go/types/eval.go \
-	go/go/types/expr.go \
-	go/go/types/exprstring.go \
-	go/go/types/go12.go \
-	go/go/types/initorder.go \
-	go/go/types/labels.go \
-	go/go/types/lookup.go \
-	go/go/types/methodset.go \
-	go/go/types/object.go \
-	go/go/types/objset.go \
-	go/go/types/operand.go \
-	go/go/types/ordering.go \
-	go/go/types/package.go \
-	go/go/types/predicates.go \
-	go/go/types/resolver.go \
-	go/go/types/return.go \
-	go/go/types/scope.go \
-	go/go/types/selection.go \
-	go/go/types/stmt.go \
-	go/go/types/sizes.go \
-	go/go/types/type.go \
-	go/go/types/typestring.go \
-	go/go/types/typexpr.go \
-	go/go/types/universe.go
-
-go_go_internal_gcimporter_files = \
-	go/go/internal/gcimporter/exportdata.go \
-	go/go/internal/gcimporter/gcimporter.go
-
-go_go_internal_gccgoimporter_files = \
-	go/go/internal/gccgoimporter/gccgoinstallation.go \
-	go/go/internal/gccgoimporter/importer.go \
-	go/go/internal/gccgoimporter/parser.go
-
-go_hash_adler32_files = \
-	go/hash/adler32/adler32.go
-
-go_hash_crc32_files = \
-	go/hash/crc32/crc32.go \
-	go/hash/crc32/crc32_generic.go
-
-go_hash_crc64_files = \
-	go/hash/crc64/crc64.go
-
-go_hash_fnv_files = \
-	go/hash/fnv/fnv.go
-
-go_html_template_files = \
-	go/html/template/attr.go \
-	go/html/template/content.go \
-	go/html/template/context.go \
-	go/html/template/css.go \
-	go/html/template/doc.go \
-	go/html/template/error.go \
-	go/html/template/escape.go \
-	go/html/template/html.go \
-	go/html/template/js.go \
-	go/html/template/template.go \
-	go/html/template/transition.go \
-	go/html/template/url.go
-
-go_image_color_files = \
-	go/image/color/color.go \
-	go/image/color/ycbcr.go
-
-go_image_color_palette_files = \
-	go/image/color/palette/palette.go
-
-go_image_draw_files = \
-	go/image/draw/draw.go
-
-go_image_gif_files = \
-	go/image/gif/reader.go \
-	go/image/gif/writer.go
-
-go_image_internal_imageutil_files = \
-	go/image/internal/imageutil/imageutil.go \
-	go/image/internal/imageutil/impl.go
-
-go_image_jpeg_files = \
-	go/image/jpeg/fdct.go \
-	go/image/jpeg/huffman.go \
-	go/image/jpeg/idct.go \
-	go/image/jpeg/reader.go \
-	go/image/jpeg/scan.go \
-	go/image/jpeg/writer.go
-
-go_image_png_files = \
-	go/image/png/paeth.go \
-	go/image/png/reader.go \
-	go/image/png/writer.go
-
-go_index_suffixarray_files = \
-	go/index/suffixarray/qsufsort.go \
-	go/index/suffixarray/suffixarray.go
-
-go_internal_format_files = \
-	go/internal/format/format.go
-
-go_internal_singleflight_files = \
-	go/internal/singleflight/singleflight.go
-
-@LIBGO_IS_LINUX_FALSE@internal_syscall_unix_getrandom_file = 
-@LIBGO_IS_LINUX_TRUE@internal_syscall_unix_getrandom_file = go/internal/syscall/unix/getrandom_linux.go
-go_internal_syscall_unix_files = \
-	go/internal/syscall/unix/dummy.go \
-	$(internal_syscall_unix_getrandom_file)
-
-go_internal_testenv_files = \
-	go/internal/testenv/testenv.go
-
-go_internal_trace_files = \
-	go/internal/trace/goroutines.go \
-	go/internal/trace/parser.go
-
-go_io_ioutil_files = \
-	go/io/ioutil/ioutil.go \
-	go/io/ioutil/tempfile.go
-
-go_math_big_files = \
-	go/math/big/accuracy_string.go \
-	go/math/big/arith.go \
-	go/math/big/arith_decl_pure.go \
-	go/math/big/decimal.go \
-	go/math/big/float.go \
-	go/math/big/floatconv.go \
-	go/math/big/ftoa.go \
-	go/math/big/int.go \
-	go/math/big/intconv.go \
-	go/math/big/nat.go \
-	go/math/big/natconv.go \
-	go/math/big/rat.go \
-	go/math/big/ratconv.go \
-	go/math/big/roundingmode_string.go
-
-go_math_cmplx_files = \
-	go/math/cmplx/abs.go \
-	go/math/cmplx/asin.go \
-	go/math/cmplx/conj.go \
-	go/math/cmplx/exp.go \
-	go/math/cmplx/isinf.go \
-	go/math/cmplx/isnan.go \
-	go/math/cmplx/log.go \
-	go/math/cmplx/phase.go \
-	go/math/cmplx/polar.go \
-	go/math/cmplx/pow.go \
-	go/math/cmplx/rect.go \
-	go/math/cmplx/sin.go \
-	go/math/cmplx/sqrt.go \
-	go/math/cmplx/tan.go
-
-go_math_rand_files = \
-	go/math/rand/exp.go \
-	go/math/rand/normal.go \
-	go/math/rand/rand.go \
-	go/math/rand/rng.go \
-	go/math/rand/zipf.go
-
-go_mime_multipart_files = \
-	go/mime/multipart/formdata.go \
-	go/mime/multipart/multipart.go \
-	go/mime/multipart/writer.go
-
-go_mime_quotedprintable_files = \
-	go/mime/quotedprintable/reader.go \
-	go/mime/quotedprintable/writer.go
-
-go_net_http_files = \
-	go/net/http/client.go \
-	go/net/http/cookie.go \
-	go/net/http/filetransport.go \
-	go/net/http/fs.go \
-	go/net/http/header.go \
-	go/net/http/jar.go \
-	go/net/http/lex.go \
-	go/net/http/request.go \
-	go/net/http/response.go \
-	go/net/http/server.go \
-	go/net/http/sniff.go \
-	go/net/http/status.go \
-	go/net/http/transfer.go \
-	go/net/http/transport.go
-
-go_net_mail_files = \
-	go/net/mail/message.go
-
-go_net_smtp_files = \
-	go/net/smtp/auth.go \
-	go/net/smtp/smtp.go
-
-go_net_textproto_files = \
-	go/net/textproto/header.go \
-	go/net/textproto/pipeline.go \
-	go/net/textproto/reader.go \
-	go/net/textproto/textproto.go \
-	go/net/textproto/writer.go
-
-go_net_url_files = \
-	go/net/url/url.go
-
-go_net_http_cgi_files = \
-	go/net/http/cgi/child.go \
-	go/net/http/cgi/host.go
-
-go_net_http_cookiejar_files = \
-	go/net/http/cookiejar/jar.go \
-	go/net/http/cookiejar/punycode.go
-
-go_net_http_fcgi_files = \
-	go/net/http/fcgi/child.go \
-	go/net/http/fcgi/fcgi.go
-
-go_net_http_httptest_files = \
-	go/net/http/httptest/recorder.go \
-	go/net/http/httptest/server.go
-
-go_net_http_pprof_files = \
-	go/net/http/pprof/pprof.go
-
-go_net_http_httputil_files = \
-	go/net/http/httputil/dump.go \
-	go/net/http/httputil/httputil.go \
-	go/net/http/httputil/persist.go \
-	go/net/http/httputil/reverseproxy.go
-
-go_net_http_internal_files = \
-	go/net/http/internal/chunked.go
-
-@LIBGO_IS_FREEBSD_FALSE@@LIBGO_IS_LINUX_FALSE@go_net_internal_socktest_sys = 
-@LIBGO_IS_FREEBSD_TRUE@@LIBGO_IS_LINUX_FALSE@go_net_internal_socktest_sys = go/net/internal/socktest/sys_cloexec.go
-@LIBGO_IS_LINUX_TRUE@go_net_internal_socktest_sys = go/net/internal/socktest/sys_cloexec.go
-go_net_internal_socktest_files = \
-	go/net/internal/socktest/switch.go \
-	go/net/internal/socktest/switch_posix.go \
-	go/net/internal/socktest/switch_unix.go \
-	go/net/internal/socktest/sys_unix.go \
-	$(go_net_internal_socktest_sys)
-
-go_old_regexp_files = \
-	go/old/regexp/regexp.go
-
-go_old_template_files = \
-	go/old/template/doc.go \
-	go/old/template/execute.go \
-	go/old/template/format.go \
-	go/old/template/parse.go
-
-go_os_exec_files = \
-	go/os/exec/exec.go \
-	go/os/exec/exec_posix.go \
-	go/os/exec/lp_unix.go
-
-go_os_signal_files = \
-	go/os/signal/signal.go \
-	go/os/signal/signal_unix.go
-
-@LIBGO_IS_SOLARIS_FALSE@os_user_decls_file = go/os/user/decls_unix.go
-@LIBGO_IS_SOLARIS_TRUE@os_user_decls_file = go/os/user/decls_solaris.go
-go_os_user_files = \
-	go/os/user/lookup.go \
-	go/os/user/lookup_unix.go \
-	go/os/user/user.go \
-	$(os_user_decls_file)
-
-go_path_filepath_files = \
-	go/path/filepath/match.go \
-	go/path/filepath/path.go \
-	go/path/filepath/path_unix.go \
-	go/path/filepath/symlink.go \
-	go/path/filepath/symlink_unix.go
-
-go_regexp_syntax_files = \
-	go/regexp/syntax/compile.go \
-	go/regexp/syntax/doc.go \
-	go/regexp/syntax/parse.go \
-	go/regexp/syntax/perl_groups.go \
-	go/regexp/syntax/prog.go \
-	go/regexp/syntax/regexp.go \
-	go/regexp/syntax/simplify.go
-
-go_net_rpc_jsonrpc_files = \
-	go/net/rpc/jsonrpc/client.go \
-	go/net/rpc/jsonrpc/server.go
-
-go_runtime_debug_files = \
-	go/runtime/debug/garbage.go \
-	go/runtime/debug/stack.go
-
-go_runtime_pprof_files = \
-	go/runtime/pprof/pprof.go
-
-go_text_tabwriter_files = \
-	go/text/tabwriter/tabwriter.go
-
-go_text_template_files = \
-	go/text/template/doc.go \
-	go/text/template/exec.go \
-	go/text/template/funcs.go \
-	go/text/template/helper.go \
-	go/text/template/option.go \
-	go/text/template/template.go
-
-go_text_template_parse_files = \
-	go/text/template/parse/lex.go \
-	go/text/template/parse/node.go \
-	go/text/template/parse/parse.go
-
-go_sync_atomic_files = \
-	go/sync/atomic/doc.go \
-	go/sync/atomic/value.go
-
-go_sync_atomic_c_files = \
-	go/sync/atomic/atomic.c
-
-go_testing_iotest_files = \
-	go/testing/iotest/logger.go \
-	go/testing/iotest/reader.go \
-	go/testing/iotest/writer.go
-
-go_testing_quick_files = \
-	go/testing/quick/quick.go
-
-go_text_scanner_files = \
-	go/text/scanner/scanner.go
-
-go_unicode_utf16_files = \
-	go/unicode/utf16/utf16.go
-
-go_unicode_utf8_files = \
-	go/unicode/utf8/utf8.go
-
-@LIBGO_IS_RTEMS_FALSE@syscall_syscall_file = go/syscall/syscall_unix.go
-
-# Define Syscall and Syscall6.
-@LIBGO_IS_RTEMS_TRUE@syscall_syscall_file = go/syscall/syscall_stubs.go
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_RTEMS_FALSE@syscall_exec_file = go/syscall/exec_unix.go
-@LIBGO_IS_LINUX_TRUE@@LIBGO_IS_RTEMS_FALSE@syscall_exec_file = go/syscall/exec_unix.go
-
-# Define ForkExec and Exec.
-@LIBGO_IS_RTEMS_TRUE@syscall_exec_file = go/syscall/exec_stubs.go
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_RTEMS_FALSE@syscall_exec_os_file = go/syscall/exec_bsd.go
-@LIBGO_IS_LINUX_TRUE@@LIBGO_IS_RTEMS_FALSE@syscall_exec_os_file = go/syscall/exec_linux.go
-@LIBGO_IS_RTEMS_TRUE@syscall_exec_os_file = 
-@HAVE_WAIT4_FALSE@@LIBGO_IS_RTEMS_FALSE@syscall_wait_file = go/syscall/libcall_waitpid.go
-@HAVE_WAIT4_TRUE@@LIBGO_IS_RTEMS_FALSE@syscall_wait_file = go/syscall/libcall_wait4.go
-
-# Define Wait4.
-@LIBGO_IS_RTEMS_TRUE@syscall_wait_file = 
-@LIBGO_IS_RTEMS_FALSE@syscall_wait_c_file = go/syscall/wait.c
-
-# Support for pulling apart wait status.
-@LIBGO_IS_RTEMS_TRUE@syscall_wait_c_file = 
-@LIBGO_IS_RTEMS_FALSE@syscall_sleep_file = go/syscall/sleep_select.go
-
-# Define Sleep.
-@LIBGO_IS_RTEMS_TRUE@syscall_sleep_file = go/syscall/sleep_rtems.go
-@HAVE_STRERROR_R_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_RTEMS_FALSE@syscall_errstr_file = go/syscall/errstr_nor.go
-@HAVE_STRERROR_R_TRUE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_RTEMS_FALSE@syscall_errstr_file = go/syscall/errstr.go
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_RTEMS_TRUE@syscall_errstr_file = go/syscall/errstr_linux.go
-
-# Define Errstr.
-@LIBGO_IS_LINUX_TRUE@syscall_errstr_file = go/syscall/errstr_linux.go
-# Use lseek on 64-bit Solaris.
-@LIBGO_IS_386_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@@LIBGO_IS_SPARC_FALSE@syscall_size_file = go/syscall/libcall_posix_regfile.go
-# Use lseek64 on 32-bit Solaris/SPARC.
-@LIBGO_IS_386_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@@LIBGO_IS_SPARC_TRUE@syscall_size_file = go/syscall/libcall_posix_largefile.go
-# Use lseek64 on 32-bit Solaris/x86.
-@LIBGO_IS_386_TRUE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@syscall_size_file = go/syscall/libcall_posix_largefile.go
-# Use lseek by default.
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@syscall_size_file = go/syscall/libcall_posix_regfile.go
-
-# Declare libc functions that vary for largefile systems.
-# Always use lseek64 on GNU/Linux.
-@LIBGO_IS_LINUX_TRUE@syscall_size_file = go/syscall/libcall_posix_largefile.go
-@LIBGO_IS_IRIX_FALSE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@syscall_socket_file = go/syscall/socket_bsd.go
-@LIBGO_IS_IRIX_TRUE@@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_FALSE@syscall_socket_file = go/syscall/socket_irix.go
-@LIBGO_IS_LINUX_FALSE@@LIBGO_IS_SOLARIS_TRUE@syscall_socket_file = go/syscall/socket_solaris.go
-
-# Define socket sizes and types.
-@LIBGO_IS_LINUX_TRUE@syscall_socket_file = go/syscall/socket_linux.go epoll.go
-@LIBGO_IS_LINUX_FALSE@syscall_socket_type_file = 
-@LIBGO_IS_LINUX_TRUE@@LIBGO_IS_PPC64LE_FALSE@@LIBGO_IS_PPC64_FALSE@syscall_socket_type_file = go/syscall/socket_linux_type.go
-@LIBGO_IS_LINUX_TRUE@@LIBGO_IS_PPC64LE_FALSE@@LIBGO_IS_PPC64_TRUE@syscall_socket_type_file = go/syscall/socket_linux_ppc64x_type.go
-@LIBGO_IS_LINUX_TRUE@@LIBGO_IS_PPC64LE_TRUE@syscall_socket_type_file = go/syscall/socket_linux_ppc64x_type.go
-@LIBGO_IS_SOLARIS_FALSE@syscall_socket_os_file = go/syscall/socket_posix.go
-
-# Define socket functions.
-@LIBGO_IS_SOLARIS_TRUE@syscall_socket_os_file = go/syscall/socket_xnet.go
-@LIBGO_IS_386_FALSE@@LIBGO_IS_SOLARIS_TRUE@syscall_uname_file = go/syscall/libcall_uname.go
-
-# Support for uname.
-# 32-bit Solaris 2/x86 needs _nuname, handled in libcall_solaris_386.go.
-@LIBGO_IS_386_TRUE@@LIBGO_IS_SOLARIS_TRUE@syscall_uname_file = 
-@LIBGO_IS_SOLARIS_FALSE@syscall_uname_file = go/syscall/libcall_uname.go
-@LIBGO_IS_LINUX_FALSE@syscall_sockcmsg_file = 
-
-# GNU/Linux specific socket control messages.
-@LIBGO_IS_LINUX_TRUE@syscall_sockcmsg_file = go/syscall/sockcmsg_linux.go
-@LIBGO_IS_LINUX_FALSE@syscall_netlink_file = 
-
-# Support for netlink sockets and messages.
-@LIBGO_IS_LINUX_TRUE@syscall_netlink_file = go/syscall/netlink_linux.go
-@LIBGO_IS_LINUX_FALSE@syscall_lsf_file = 
-
-# GNU/Linux specific socket filters.
-@LIBGO_IS_LINUX_TRUE@syscall_lsf_file = go/syscall/lsf_linux.go
-@LIBGO_IS_ARM64_FALSE@@LIBGO_IS_LINUX_TRUE@syscall_ustat_file = go/syscall/libcall_linux_ustat.go
-
-# GNU/Linux specific ustat support.
-@LIBGO_IS_ARM64_TRUE@@LIBGO_IS_LINUX_TRUE@syscall_ustat_file = 
-@LIBGO_IS_LINUX_FALSE@syscall_ustat_file = 
-@LIBGO_IS_LINUX_FALSE@syscall_utimesnano_file = go/syscall/libcall_posix_utimesnano.go
-
-# GNU/Linux specific utimesnano support.
-@LIBGO_IS_LINUX_TRUE@syscall_utimesnano_file = go/syscall/libcall_linux_utimesnano.go
-@LIBGO_IS_LINUX_FALSE@syscall_creds_test_file = 
-
-# Test files.
-@LIBGO_IS_LINUX_TRUE@syscall_creds_test_file = go/syscall/creds_test.go
-@LIBGO_IS_LINUX_FALSE@syscall_exec_test_file = 
-@LIBGO_IS_LINUX_TRUE@syscall_exec_test_file = go/syscall/exec_linux_test.go go/syscall/syscall_linux_test.go
-@LIBGO_IS_LINUX_FALSE@syscall_os_file = go/syscall/libcall_bsd.go
-@LIBGO_IS_LINUX_TRUE@syscall_os_file = 
-go_base_syscall_files = \
-	go/syscall/env_unix.go \
-	go/syscall/syscall_errno.go \
-	go/syscall/libcall_support.go \
-	go/syscall/libcall_posix.go \
-	go/syscall/race0.go \
-	go/syscall/socket.go \
-	go/syscall/sockcmsg_unix.go \
-	go/syscall/str.go \
-	go/syscall/syscall.go \
-	$(syscall_sockcmsg_file) \
-	$(syscall_syscall_file) \
-	$(syscall_exec_file) \
-	$(syscall_exec_os_file) \
-	$(syscall_wait_file) \
-	$(syscall_sleep_file) \
-	$(syscall_errstr_file) \
-	$(syscall_size_file) \
-	$(syscall_os_file) \
-	$(syscall_socket_file) \
-	$(syscall_socket_os_file) \
-	$(syscall_socket_type_file) \
-	$(syscall_uname_file) \
-	$(syscall_netlink_file) \
-	$(syscall_lsf_file) \
-	$(syscall_ustat_file) \
-	$(syscall_utimesnano_file) \
-	$(GO_LIBCALL_OS_FILE) \
-	$(GO_LIBCALL_OS_ARCH_FILE) \
-	$(GO_SYSCALL_OS_FILE) \
-	$(GO_SYSCALL_OS_ARCH_FILE)
-
-go_syscall_files = \
-	$(go_base_syscall_files) \
-	libcalls.go \
-	sysinfo.go \
-	syscall_arch.go
-
-go_syscall_c_files = \
-	go/syscall/errno.c \
-	go/syscall/signame.c \
-	$(syscall_wait_c_file)
-
-go_syscall_test_files = \
-	$(syscall_creds_test_file) \
-	$(syscall_exec_test_file) \
-	go/syscall/exec_unix_test.go \
-	go/syscall/export_test.go \
-	go/syscall/export_unix_test.go \
-	go/syscall/mmap_unix_test.go \
-	go/syscall/syscall_test.go \
-	go/syscall/syscall_unix_test.go
-
-@LIBGO_IS_LINUX_FALSE@os_lib_inotify_lo = 
-
-# os_lib_inotify_lo = os/inotify.lo
-@LIBGO_IS_LINUX_TRUE@os_lib_inotify_lo = 
-libgo_go_objs = \
-	bufio.lo \
-	bytes.lo \
-	bytes/index.lo \
-	crypto.lo \
-	encoding.lo \
-	errors.lo \
-	expvar.lo \
-	flag.lo \
-	fmt.lo \
-	hash.lo \
-	html.lo \
-	image.lo \
-	io.lo \
-	log.lo \
-	math.lo \
-	mime.lo \
-	net.lo \
-	os.lo \
-	path.lo \
-	reflect-go.lo \
-	reflect/makefunc_ffi_c.lo \
-	regexp.lo \
-	runtime-go.lo \
-	sort.lo \
-	strconv.lo \
-	strings.lo \
-	strings/index.lo \
-	sync.lo \
-	syscall.lo \
-	syscall/errno.lo \
-	syscall/signame.lo \
-	syscall/wait.lo \
-	testing.lo \
-	time-go.lo \
-	unicode.lo \
-	archive/tar.lo \
-	archive/zip.lo \
-	compress/bzip2.lo \
-	compress/flate.lo \
-	compress/gzip.lo \
-	compress/lzw.lo \
-	compress/zlib.lo \
-	container/heap.lo \
-	container/list.lo \
-	container/ring.lo \
-	crypto/aes.lo \
-	crypto/cipher.lo \
-	crypto/des.lo \
-	crypto/dsa.lo \
-	crypto/ecdsa.lo \
-	crypto/elliptic.lo \
-	crypto/hmac.lo \
-	crypto/md5.lo \
-	crypto/rand.lo \
-	crypto/rc4.lo \
-	crypto/rsa.lo \
-	crypto/sha1.lo \
-	crypto/sha256.lo \
-	crypto/sha512.lo \
-	crypto/subtle.lo \
-	crypto/tls.lo \
-	crypto/x509.lo \
-	crypto/x509/pkix.lo \
-	database/sql.lo \
-	database/sql/driver.lo \
-	debug/dwarf.lo \
-	debug/elf.lo \
-	debug/gosym.lo \
-	debug/macho.lo \
-	debug/pe.lo \
-	debug/plan9obj.lo \
-	encoding/ascii85.lo \
-	encoding/asn1.lo \
-	encoding/base32.lo \
-	encoding/base64.lo \
-	encoding/binary.lo \
-	encoding/csv.lo \
-	encoding/gob.lo \
-	encoding/hex.lo \
-	encoding/json.lo \
-	encoding/pem.lo \
-	encoding/xml.lo \
-	exp/proxy.lo \
-	exp/terminal.lo \
-	html/template.lo \
-	go/ast.lo \
-	go/build.lo \
-	go/constant.lo \
-	go/doc.lo \
-	go/format.lo \
-	go/importer.lo \
-	go/internal/gcimporter.lo \
-	go/internal/gccgoimporter.lo \
-	go/parser.lo \
-	go/printer.lo \
-	go/scanner.lo \
-	go/token.lo \
-	go/types.lo \
-	hash/adler32.lo \
-	hash/crc32.lo \
-	hash/crc64.lo \
-	hash/fnv.lo \
-	net/http/cgi.lo \
-	net/http/cookiejar.lo \
-	net/http/fcgi.lo \
-	net/http/httptest.lo \
-	net/http/httputil.lo \
-	net/http/internal.lo \
-	net/http/pprof.lo \
-	image/color.lo \
-	image/color/palette.lo \
-	image/draw.lo \
-	image/gif.lo \
-	image/internal/imageutil.lo \
-	image/jpeg.lo \
-	image/png.lo \
-	index/suffixarray.lo \
-	internal/format.lo \
-	internal/singleflight.lo \
-	internal/syscall/unix.lo \
-	internal/testenv.lo \
-	internal/trace.lo \
-	io/ioutil.lo \
-	log/syslog.lo \
-	log/syslog/syslog_c.lo \
-	math/big.lo \
-	math/cmplx.lo \
-	math/rand.lo \
-	mime/multipart.lo \
-	mime/quotedprintable.lo \
-	net/http.lo \
-	net/internal/socktest.lo \
-	net/mail.lo \
-	net/rpc.lo \
-	net/smtp.lo \
-	net/textproto.lo \
-	net/url.lo \
-	old/regexp.lo \
-	old/template.lo \
-	os/exec.lo \
-	$(os_lib_inotify_lo) \
-	os/signal.lo \
-	os/user.lo \
-	path/filepath.lo \
-	regexp/syntax.lo \
-	net/rpc/jsonrpc.lo \
-	runtime/debug.lo \
-	runtime/pprof.lo \
-	sync/atomic.lo \
-	sync/atomic_c.lo \
-	text/scanner.lo \
-	text/tabwriter.lo \
-	text/template.lo \
-	text/template/parse.lo \
-	testing/iotest.lo \
-	testing/quick.lo \
-	unicode/utf16.lo \
-	unicode/utf8.lo
-
-libgo_ldflags = \
-	-version-info $(libtool_VERSION) $(PTHREAD_CFLAGS) $(AM_LDFLAGS)
-
-libgo_libadd = \
-	$(libgo_go_objs) ../libbacktrace/libbacktrace.la \
-	$(LIBATOMIC) $(LIBFFI) $(PTHREAD_LIBS) $(MATH_LIBS) $(NET_LIBS)
-
-libgo_la_SOURCES = $(runtime_files)
-libgo_la_LDFLAGS = $(libgo_ldflags)
-libgo_la_LIBADD = $(libgo_libadd)
-libgo_llgo_la_SOURCES = $(runtime_files)
-libgo_llgo_la_LDFLAGS = $(libgo_ldflags)
-libgo_llgo_la_LIBADD = $(libgo_libadd)
-libgobegin_a_SOURCES = \
-	runtime/go-main.c
-
-libgobegin_llgo_a_SOURCES = \
-	runtime/go-main.c
-
-
-# Use -fPIC for libgobegin so that it can be put in a PIE.
-libgobegin_a_CFLAGS = $(AM_CFLAGS) -fPIC
-libgobegin_llgo_a_CFLAGS = $(AM_CFLAGS) -fPIC
-libgolibbegin_a_SOURCES = \
-	runtime/go-libmain.c
-
-libgolibbegin_a_CFLAGS = $(AM_CFLAGS) -fPIC
-libnetgo_a_SOURCES = $(go_netgo_files)
-libnetgo_a_LIBADD = netgo.o
-LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
-AM_GOCFLAGS = $(STRINGOPS_FLAG) $(GO_SPLIT_STACK)
-GOCOMPILE = $(GOC) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_GOCFLAGS) $(GOCFLAGS)
-LTGOCOMPILE = $(LIBTOOL) --tag GO --mode=compile $(GOC) $(INCLUDES) \
-	$(AM_GOCFLAGS) $(GOCFLAGS)
-
-GOLINK = $(LIBTOOL) --tag GO --mode-link $(GOC) \
-	$(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_GOCFLAGS) $(LTLDFLAGS) -o $@
-
-
-# Build the dependencies for a Go package.
-BUILDDEPS = \
-	$(MKDIR_P) $(@D); \
-	$(SHELL) $(srcdir)/godeps.sh `echo $@ | sed -e 's/.dep$$//'` $^ > $@.tmp; \
-	mv -f $@.tmp $@
-
-
-# Build the .go files for a package, generating a .lo file.
-BUILDPACKAGE = \
-	$(MKDIR_P) $(@D); \
-	files=`echo $^ | sed -e 's/[^ ]*\.gox//g'`; \
-	$(LTGOCOMPILE) -I . -c -fgo-pkgpath=`echo $@ | sed -e 's/.lo$$//' -e 's/-go$$//'` -o $@ $$files
-
-
-# Build netgo.o.
-BUILDNETGO = \
-	$(MKDIR_P) $(@D); \
-	files=`echo $^ | sed -e 's/[^ ]*\.gox//g'`; \
-	$(GOCOMPILE) -I . -c -fPIC -fgo-pkgpath=net -o $@ $$files
-
-GOTESTFLAGS = 
-GOBENCH = 
-
-# Check a package.
-CHECK = \
-	GC="$(GOC) $(GOCFLAGS) $($(subst /,_,$@)_GOCFLAGS) -L `${PWD_COMMAND}` -L `${PWD_COMMAND}`/.libs"; \
-	export GC; \
-	GOLIBS="$(MATH_LIBS) $(NET_LIBS) $(LIBS)"; \
-	export GOLIBS; \
-	RUNTESTFLAGS="$(RUNTESTFLAGS)"; \
-	export RUNTESTFLAGS; \
-	MAKE="$(MAKE)"; \
-	export MAKE; \
-	libgccdir=`${GOC} -print-libgcc-file-name | sed -e 's|/[^/]*$$||'`; \
-	LD_LIBRARY_PATH="`${PWD_COMMAND}`/.libs:$${libgccdir}:${LD_LIBRARY_PATH}"; \
-	LD_LIBRARY_PATH=`echo $${LD_LIBRARY_PATH} | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; \
-	export LD_LIBRARY_PATH; \
-	$(MKDIR_P) $(@D); \
-	rm -f $@-testsum $@-testlog; \
-	if test "$(USE_DEJAGNU)" = "yes"; then \
-	  $(SHELL) $(srcdir)/testsuite/gotest --goarch=$(GOARCH) --goos=$(GOOS) --dejagnu=yes --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" --testname="$(@D)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files); \
-	elif test "$(GOBENCH)" != ""; then \
-	  $(SHELL) $(srcdir)/testsuite/gotest --goarch=$(GOARCH) --goos=$(GOOS) --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" --bench="$(GOBENCH)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files); \
-	else \
-	  if $(SHELL) $(srcdir)/testsuite/gotest --goarch=$(GOARCH) --goos=$(GOOS) --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$(go_$(subst /,_,$(@D))_files)" $(GOTESTFLAGS) $(go_$(subst /,_,$(@D))_test_files) >>$@-testlog 2>&1; then \
-	    echo "PASS: $(@D)" >> $@-testlog; \
-	    echo "PASS: $(@D)"; \
-	    echo "PASS: $(@D)" > $@-testsum; \
-	  else \
-	    echo "FAIL: $(@D)" >> $@-testlog; \
-	    cat $@-testlog; \
-	    echo "FAIL: $(@D)" > $@-testsum; \
-	    exit 1; \
-	  fi; \
-	fi
-
-
-# Build all packages before checking any.
-CHECK_DEPS = $(toolexeclibgo_DATA) $(toolexeclibgoarchive_DATA) \
-	$(toolexeclibgocompress_DATA) $(toolexeclibgocontainer_DATA) \
-	$(toolexeclibgocrypto_DATA) $(toolexeclibgodebug_DATA) \
-	$(toolexeclibgoencoding_DATA) $(toolexeclibgoexp_DATA) \
-	$(toolexeclibgogo_DATA) $(toolexeclibgohash_DATA) \
-	$(toolexeclibgoimage_DATA) $(toolexeclibgoindex_DATA) \
-	$(toolexeclibgoio_DATA) $(toolexeclibgolog_DATA) \
-	$(toolexeclibgomath_DATA) $(toolexeclibgomime_DATA) \
-	$(toolexeclibgonet_DATA) $(toolexeclibgonethttp_DATA) \
-	$(toolexeclibgoos_DATA) $(toolexeclibgopath_DATA) \
-	$(toolexeclibgorpc_DATA) $(toolexeclibgoruntime_DATA) \
-	$(toolexeclibgosync_DATA) $(toolexeclibgotesting_DATA) \
-	$(toolexeclibgotext_DATA) $(toolexeclibgotexttemplate_DATA) \
-	$(toolexeclibgounicode_DATA) $(am__append_1) $(am__append_2)
-# At least for now, we need -static-libgo for this test, because
-# otherwise we can't get the line numbers.
-# Also use -fno-inline to get better results from the memory profiler.
-runtime_pprof_check_GOCFLAGS = -static-libgo -fno-inline
-
-# How to build a .gox file from a .lo file.
-BUILDGOX = \
-	f=`echo $< | sed -e 's/.lo$$/.o/'`; \
-	$(OBJCOPY) -j .go_export $$f $@.tmp && mv -f $@.tmp $@
-
-TEST_PACKAGES = \
-	bufio/check \
-	bytes/check \
-	errors/check \
-	expvar/check \
-	flag/check \
-	fmt/check \
-	html/check \
-	image/check \
-	io/check \
-	log/check \
-	math/check \
-	mime/check \
-	net/check \
-	os/check \
-	path/check \
-	reflect/check \
-	runtime/check \
-	sort/check \
-	strconv/check \
-	strings/check \
-	sync/check \
-	syscall/check \
-	time/check \
-	unicode/check \
-	archive/tar/check \
-	archive/zip/check \
-	compress/bzip2/check \
-	compress/flate/check \
-	compress/gzip/check \
-	compress/lzw/check \
-	compress/zlib/check \
-	container/heap/check \
-	container/list/check \
-	container/ring/check \
-	crypto/aes/check \
-	crypto/cipher/check \
-	crypto/des/check \
-	crypto/dsa/check \
-	crypto/ecdsa/check \
-	crypto/elliptic/check \
-	crypto/hmac/check \
-	crypto/md5/check \
-	crypto/rand/check \
-	crypto/rc4/check \
-	crypto/rsa/check \
-	crypto/sha1/check \
-	crypto/sha256/check \
-	crypto/sha512/check \
-	crypto/subtle/check \
-	crypto/tls/check \
-	crypto/x509/check \
-	database/sql/check \
-	database/sql/driver/check \
-	debug/dwarf/check \
-	debug/elf/check \
-	debug/macho/check \
-	debug/pe/check \
-	debug/plan9obj/check \
-	encoding/ascii85/check \
-	encoding/asn1/check \
-	encoding/base32/check \
-	encoding/base64/check \
-	encoding/binary/check \
-	encoding/csv/check \
-	encoding/gob/check \
-	encoding/hex/check \
-	encoding/json/check \
-	encoding/pem/check \
-	encoding/xml/check \
-	exp/proxy/check \
-	exp/terminal/check \
-	html/template/check \
-	go/ast/check \
-	go/build/check \
-	go/constant/check \
-	go/doc/check \
-	go/format/check \
-	go/internal/gcimporter/check \
-	go/internal/gccgoimporter/check \
-	go/parser/check \
-	go/printer/check \
-	go/scanner/check \
-	go/token/check \
-	go/types/check \
-	hash/adler32/check \
-	hash/crc32/check \
-	hash/crc64/check \
-	hash/fnv/check \
-	image/color/check \
-	image/draw/check \
-	image/jpeg/check \
-	image/png/check \
-	index/suffixarray/check \
-	internal/singleflight/check \
-	internal/trace/check \
-	io/ioutil/check \
-	log/syslog/check \
-	math/big/check \
-	math/cmplx/check \
-	math/rand/check \
-	mime/multipart/check \
-	mime/quotedprintable/check \
-	net/http/check \
-	net/http/cgi/check \
-	net/http/cookiejar/check \
-	net/http/fcgi/check \
-	net/http/httptest/check \
-	net/http/httputil/check \
-	net/http/internal/check \
-	net/internal/socktest/check \
-	net/mail/check \
-	net/rpc/check \
-	net/smtp/check \
-	net/textproto/check \
-	net/url/check \
-	net/rpc/jsonrpc/check \
-	old/regexp/check \
-	old/template/check \
-	os/exec/check \
-	os/signal/check \
-	os/user/check \
-	path/filepath/check \
-	regexp/syntax/check \
-	sync/atomic/check \
-	text/scanner/check \
-	text/tabwriter/check \
-	text/template/check \
-	text/template/parse/check \
-	testing/quick/check \
-	unicode/utf16/check \
-	unicode/utf8/check
-
-MOSTLYCLEAN_FILES = libgo.head libgo.sum.sep libgo.log.sep
-CLEANFILES = *.go *.gox goc2c *.c s-version libgo.sum libgo.log
-all: config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .c .go .gox .o .obj .lo .a
-am--refresh: Makefile
-	@:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
-	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	$(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-$(am__aclocal_m4_deps):
-
-config.h: stamp-h1
-	@if test ! -f $@; then rm -f stamp-h1; else :; fi
-	@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
-
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
-	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
-	rm -f stamp-h1
-	touch $@
-
-distclean-hdr:
-	-rm -f config.h stamp-h1
-install-toolexeclibLIBRARIES: $(toolexeclib_LIBRARIES)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclib_LIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
-	  echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(toolexeclibdir)'"; \
-	  $(INSTALL_DATA) $$list2 "$(DESTDIR)$(toolexeclibdir)" || exit $$?; }
-	@$(POST_INSTALL)
-	@list='$(toolexeclib_LIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \
-	for p in $$list; do \
-	  if test -f $$p; then \
-	    $(am__strip_dir) \
-	    echo " ( cd '$(DESTDIR)$(toolexeclibdir)' && $(RANLIB) $$f )"; \
-	    ( cd "$(DESTDIR)$(toolexeclibdir)" && $(RANLIB) $$f ) || exit $$?; \
-	  else :; fi; \
-	done
-
-uninstall-toolexeclibLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclib_LIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibdir)'; $(am__uninstall_files_from_dir)
-
-clean-toolexeclibLIBRARIES:
-	-test -z "$(toolexeclib_LIBRARIES)" || rm -f $(toolexeclib_LIBRARIES)
-libgobegin-llgo.a: $(libgobegin_llgo_a_OBJECTS) $(libgobegin_llgo_a_DEPENDENCIES) $(EXTRA_libgobegin_llgo_a_DEPENDENCIES) 
-	-rm -f libgobegin-llgo.a
-	$(libgobegin_llgo_a_AR) libgobegin-llgo.a $(libgobegin_llgo_a_OBJECTS) $(libgobegin_llgo_a_LIBADD)
-	$(RANLIB) libgobegin-llgo.a
-libgobegin.a: $(libgobegin_a_OBJECTS) $(libgobegin_a_DEPENDENCIES) $(EXTRA_libgobegin_a_DEPENDENCIES) 
-	-rm -f libgobegin.a
-	$(libgobegin_a_AR) libgobegin.a $(libgobegin_a_OBJECTS) $(libgobegin_a_LIBADD)
-	$(RANLIB) libgobegin.a
-libgolibbegin.a: $(libgolibbegin_a_OBJECTS) $(libgolibbegin_a_DEPENDENCIES) $(EXTRA_libgolibbegin_a_DEPENDENCIES) 
-	-rm -f libgolibbegin.a
-	$(libgolibbegin_a_AR) libgolibbegin.a $(libgolibbegin_a_OBJECTS) $(libgolibbegin_a_LIBADD)
-	$(RANLIB) libgolibbegin.a
-libnetgo.a: $(libnetgo_a_OBJECTS) $(libnetgo_a_DEPENDENCIES) $(EXTRA_libnetgo_a_DEPENDENCIES) 
-	-rm -f libnetgo.a
-	$(libnetgo_a_AR) libnetgo.a $(libnetgo_a_OBJECTS) $(libnetgo_a_LIBADD)
-	$(RANLIB) libnetgo.a
-install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(toolexeclibdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(toolexeclibdir)"; \
-	}
-
-uninstall-toolexeclibLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(toolexeclibdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(toolexeclibdir)/$$f"; \
-	done
-
-clean-toolexeclibLTLIBRARIES:
-	-test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES)
-	@list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libgo-llgo.la: $(libgo_llgo_la_OBJECTS) $(libgo_llgo_la_DEPENDENCIES) $(EXTRA_libgo_llgo_la_DEPENDENCIES) 
-	$(libgo_llgo_la_LINK) $(am_libgo_llgo_la_rpath) $(libgo_llgo_la_OBJECTS) $(libgo_llgo_la_LIBADD) $(LIBS)
-libgo.la: $(libgo_la_OBJECTS) $(libgo_la_DEPENDENCIES) $(EXTRA_libgo_la_DEPENDENCIES) 
-	$(libgo_la_LINK) $(am_libgo_la_rpath) $(libgo_la_OBJECTS) $(libgo_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chan.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpuprof.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/env_posix.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getncpu-bsd.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getncpu-irix.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getncpu-linux.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getncpu-none.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getncpu-solaris.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-append.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-assert-interface.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-assert.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-breakpoint.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-byte-array-to-string.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-caller.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-callers.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-can-convert-interface.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-cdiv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-cgo.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-check-interface.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-construct-map.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-convert-interface.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-copy.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-defer.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-deferred-recover.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-eface-compare.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-eface-val-compare.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-ffi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-fieldtrack.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-iface.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-int-array-to-string.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-int-to-string.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-interface-compare.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-interface-eface-compare.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-interface-val-compare.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-make-slice.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-map-delete.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-map-index.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-map-len.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-map-range.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-matherr.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-memcmp.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-nanotime.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-new-map.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-new.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-nosys.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-now.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-panic.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-print.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-recover.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-reflect-call.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-reflect-map.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-rune.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-runtime-error.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-setenv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-signal.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-strcmp.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-string-to-byte-array.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-string-to-int-array.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-strplus.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-strslice.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-traceback.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-type-complex.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-type-eface.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-type-error.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-type-float.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-type-identity.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-type-interface.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-type-string.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-typedesc-equal.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-unsafe-new.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-unsafe-newarray.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-unsafe-pointer.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-unsetenv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-unwind.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/go-varargs.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heapdump.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lfstack.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgobegin_a-go-main.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgobegin_llgo_a-go-main.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgolibbegin_a-go-libmain.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lock_futex.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lock_sema.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mcache.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mcentral.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem_posix_memalign.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mfixalloc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mgc0.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mheap.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mprof.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msize.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netpoll.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netpoll_epoll.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netpoll_kqueue.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netpoll_select.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panic.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parfor.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdebug.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reflect.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtems-task-variable-add.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/runtime.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/runtime1.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sema.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signal_unix.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sigqueue.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread-linux.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread-sema.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yield.Plo@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-libgobegin_llgo_a-go-main.o: runtime/go-main.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgobegin_llgo_a_CFLAGS) $(CFLAGS) -MT libgobegin_llgo_a-go-main.o -MD -MP -MF $(DEPDIR)/libgobegin_llgo_a-go-main.Tpo -c -o libgobegin_llgo_a-go-main.o `test -f 'runtime/go-main.c' || echo '$(srcdir)/'`runtime/go-main.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libgobegin_llgo_a-go-main.Tpo $(DEPDIR)/libgobegin_llgo_a-go-main.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-main.c' object='libgobegin_llgo_a-go-main.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgobegin_llgo_a_CFLAGS) $(CFLAGS) -c -o libgobegin_llgo_a-go-main.o `test -f 'runtime/go-main.c' || echo '$(srcdir)/'`runtime/go-main.c
-
-libgobegin_llgo_a-go-main.obj: runtime/go-main.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgobegin_llgo_a_CFLAGS) $(CFLAGS) -MT libgobegin_llgo_a-go-main.obj -MD -MP -MF $(DEPDIR)/libgobegin_llgo_a-go-main.Tpo -c -o libgobegin_llgo_a-go-main.obj `if test -f 'runtime/go-main.c'; then $(CYGPATH_W) 'runtime/go-main.c'; else $(CYGPATH_W) '$(srcdir)/runtime/go-main.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libgobegin_llgo_a-go-main.Tpo $(DEPDIR)/libgobegin_llgo_a-go-main.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-main.c' object='libgobegin_llgo_a-go-main.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgobegin_llgo_a_CFLAGS) $(CFLAGS) -c -o libgobegin_llgo_a-go-main.obj `if test -f 'runtime/go-main.c'; then $(CYGPATH_W) 'runtime/go-main.c'; else $(CYGPATH_W) '$(srcdir)/runtime/go-main.c'; fi`
-
-libgobegin_a-go-main.o: runtime/go-main.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgobegin_a_CFLAGS) $(CFLAGS) -MT libgobegin_a-go-main.o -MD -MP -MF $(DEPDIR)/libgobegin_a-go-main.Tpo -c -o libgobegin_a-go-main.o `test -f 'runtime/go-main.c' || echo '$(srcdir)/'`runtime/go-main.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libgobegin_a-go-main.Tpo $(DEPDIR)/libgobegin_a-go-main.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-main.c' object='libgobegin_a-go-main.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgobegin_a_CFLAGS) $(CFLAGS) -c -o libgobegin_a-go-main.o `test -f 'runtime/go-main.c' || echo '$(srcdir)/'`runtime/go-main.c
-
-libgobegin_a-go-main.obj: runtime/go-main.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgobegin_a_CFLAGS) $(CFLAGS) -MT libgobegin_a-go-main.obj -MD -MP -MF $(DEPDIR)/libgobegin_a-go-main.Tpo -c -o libgobegin_a-go-main.obj `if test -f 'runtime/go-main.c'; then $(CYGPATH_W) 'runtime/go-main.c'; else $(CYGPATH_W) '$(srcdir)/runtime/go-main.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libgobegin_a-go-main.Tpo $(DEPDIR)/libgobegin_a-go-main.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-main.c' object='libgobegin_a-go-main.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgobegin_a_CFLAGS) $(CFLAGS) -c -o libgobegin_a-go-main.obj `if test -f 'runtime/go-main.c'; then $(CYGPATH_W) 'runtime/go-main.c'; else $(CYGPATH_W) '$(srcdir)/runtime/go-main.c'; fi`
-
-libgolibbegin_a-go-libmain.o: runtime/go-libmain.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgolibbegin_a_CFLAGS) $(CFLAGS) -MT libgolibbegin_a-go-libmain.o -MD -MP -MF $(DEPDIR)/libgolibbegin_a-go-libmain.Tpo -c -o libgolibbegin_a-go-libmain.o `test -f 'runtime/go-libmain.c' || echo '$(srcdir)/'`runtime/go-libmain.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libgolibbegin_a-go-libmain.Tpo $(DEPDIR)/libgolibbegin_a-go-libmain.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-libmain.c' object='libgolibbegin_a-go-libmain.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgolibbegin_a_CFLAGS) $(CFLAGS) -c -o libgolibbegin_a-go-libmain.o `test -f 'runtime/go-libmain.c' || echo '$(srcdir)/'`runtime/go-libmain.c
-
-libgolibbegin_a-go-libmain.obj: runtime/go-libmain.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgolibbegin_a_CFLAGS) $(CFLAGS) -MT libgolibbegin_a-go-libmain.obj -MD -MP -MF $(DEPDIR)/libgolibbegin_a-go-libmain.Tpo -c -o libgolibbegin_a-go-libmain.obj `if test -f 'runtime/go-libmain.c'; then $(CYGPATH_W) 'runtime/go-libmain.c'; else $(CYGPATH_W) '$(srcdir)/runtime/go-libmain.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libgolibbegin_a-go-libmain.Tpo $(DEPDIR)/libgolibbegin_a-go-libmain.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-libmain.c' object='libgolibbegin_a-go-libmain.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgolibbegin_a_CFLAGS) $(CFLAGS) -c -o libgolibbegin_a-go-libmain.obj `if test -f 'runtime/go-libmain.c'; then $(CYGPATH_W) 'runtime/go-libmain.c'; else $(CYGPATH_W) '$(srcdir)/runtime/go-libmain.c'; fi`
-
-go-append.lo: runtime/go-append.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-append.lo -MD -MP -MF $(DEPDIR)/go-append.Tpo -c -o go-append.lo `test -f 'runtime/go-append.c' || echo '$(srcdir)/'`runtime/go-append.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-append.Tpo $(DEPDIR)/go-append.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-append.c' object='go-append.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-append.lo `test -f 'runtime/go-append.c' || echo '$(srcdir)/'`runtime/go-append.c
-
-go-assert.lo: runtime/go-assert.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-assert.lo -MD -MP -MF $(DEPDIR)/go-assert.Tpo -c -o go-assert.lo `test -f 'runtime/go-assert.c' || echo '$(srcdir)/'`runtime/go-assert.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-assert.Tpo $(DEPDIR)/go-assert.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-assert.c' object='go-assert.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-assert.lo `test -f 'runtime/go-assert.c' || echo '$(srcdir)/'`runtime/go-assert.c
-
-go-assert-interface.lo: runtime/go-assert-interface.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-assert-interface.lo -MD -MP -MF $(DEPDIR)/go-assert-interface.Tpo -c -o go-assert-interface.lo `test -f 'runtime/go-assert-interface.c' || echo '$(srcdir)/'`runtime/go-assert-interface.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-assert-interface.Tpo $(DEPDIR)/go-assert-interface.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-assert-interface.c' object='go-assert-interface.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-assert-interface.lo `test -f 'runtime/go-assert-interface.c' || echo '$(srcdir)/'`runtime/go-assert-interface.c
-
-go-byte-array-to-string.lo: runtime/go-byte-array-to-string.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-byte-array-to-string.lo -MD -MP -MF $(DEPDIR)/go-byte-array-to-string.Tpo -c -o go-byte-array-to-string.lo `test -f 'runtime/go-byte-array-to-string.c' || echo '$(srcdir)/'`runtime/go-byte-array-to-string.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-byte-array-to-string.Tpo $(DEPDIR)/go-byte-array-to-string.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-byte-array-to-string.c' object='go-byte-array-to-string.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-byte-array-to-string.lo `test -f 'runtime/go-byte-array-to-string.c' || echo '$(srcdir)/'`runtime/go-byte-array-to-string.c
-
-go-breakpoint.lo: runtime/go-breakpoint.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-breakpoint.lo -MD -MP -MF $(DEPDIR)/go-breakpoint.Tpo -c -o go-breakpoint.lo `test -f 'runtime/go-breakpoint.c' || echo '$(srcdir)/'`runtime/go-breakpoint.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-breakpoint.Tpo $(DEPDIR)/go-breakpoint.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-breakpoint.c' object='go-breakpoint.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-breakpoint.lo `test -f 'runtime/go-breakpoint.c' || echo '$(srcdir)/'`runtime/go-breakpoint.c
-
-go-caller.lo: runtime/go-caller.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-caller.lo -MD -MP -MF $(DEPDIR)/go-caller.Tpo -c -o go-caller.lo `test -f 'runtime/go-caller.c' || echo '$(srcdir)/'`runtime/go-caller.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-caller.Tpo $(DEPDIR)/go-caller.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-caller.c' object='go-caller.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-caller.lo `test -f 'runtime/go-caller.c' || echo '$(srcdir)/'`runtime/go-caller.c
-
-go-callers.lo: runtime/go-callers.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-callers.lo -MD -MP -MF $(DEPDIR)/go-callers.Tpo -c -o go-callers.lo `test -f 'runtime/go-callers.c' || echo '$(srcdir)/'`runtime/go-callers.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-callers.Tpo $(DEPDIR)/go-callers.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-callers.c' object='go-callers.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-callers.lo `test -f 'runtime/go-callers.c' || echo '$(srcdir)/'`runtime/go-callers.c
-
-go-can-convert-interface.lo: runtime/go-can-convert-interface.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-can-convert-interface.lo -MD -MP -MF $(DEPDIR)/go-can-convert-interface.Tpo -c -o go-can-convert-interface.lo `test -f 'runtime/go-can-convert-interface.c' || echo '$(srcdir)/'`runtime/go-can-convert-interface.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-can-convert-interface.Tpo $(DEPDIR)/go-can-convert-interface.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-can-convert-interface.c' object='go-can-convert-interface.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-can-convert-interface.lo `test -f 'runtime/go-can-convert-interface.c' || echo '$(srcdir)/'`runtime/go-can-convert-interface.c
-
-go-cdiv.lo: runtime/go-cdiv.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-cdiv.lo -MD -MP -MF $(DEPDIR)/go-cdiv.Tpo -c -o go-cdiv.lo `test -f 'runtime/go-cdiv.c' || echo '$(srcdir)/'`runtime/go-cdiv.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-cdiv.Tpo $(DEPDIR)/go-cdiv.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-cdiv.c' object='go-cdiv.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-cdiv.lo `test -f 'runtime/go-cdiv.c' || echo '$(srcdir)/'`runtime/go-cdiv.c
-
-go-cgo.lo: runtime/go-cgo.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-cgo.lo -MD -MP -MF $(DEPDIR)/go-cgo.Tpo -c -o go-cgo.lo `test -f 'runtime/go-cgo.c' || echo '$(srcdir)/'`runtime/go-cgo.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-cgo.Tpo $(DEPDIR)/go-cgo.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-cgo.c' object='go-cgo.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-cgo.lo `test -f 'runtime/go-cgo.c' || echo '$(srcdir)/'`runtime/go-cgo.c
-
-go-check-interface.lo: runtime/go-check-interface.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-check-interface.lo -MD -MP -MF $(DEPDIR)/go-check-interface.Tpo -c -o go-check-interface.lo `test -f 'runtime/go-check-interface.c' || echo '$(srcdir)/'`runtime/go-check-interface.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-check-interface.Tpo $(DEPDIR)/go-check-interface.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-check-interface.c' object='go-check-interface.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-check-interface.lo `test -f 'runtime/go-check-interface.c' || echo '$(srcdir)/'`runtime/go-check-interface.c
-
-go-construct-map.lo: runtime/go-construct-map.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-construct-map.lo -MD -MP -MF $(DEPDIR)/go-construct-map.Tpo -c -o go-construct-map.lo `test -f 'runtime/go-construct-map.c' || echo '$(srcdir)/'`runtime/go-construct-map.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-construct-map.Tpo $(DEPDIR)/go-construct-map.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-construct-map.c' object='go-construct-map.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-construct-map.lo `test -f 'runtime/go-construct-map.c' || echo '$(srcdir)/'`runtime/go-construct-map.c
-
-go-convert-interface.lo: runtime/go-convert-interface.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-convert-interface.lo -MD -MP -MF $(DEPDIR)/go-convert-interface.Tpo -c -o go-convert-interface.lo `test -f 'runtime/go-convert-interface.c' || echo '$(srcdir)/'`runtime/go-convert-interface.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-convert-interface.Tpo $(DEPDIR)/go-convert-interface.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-convert-interface.c' object='go-convert-interface.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-convert-interface.lo `test -f 'runtime/go-convert-interface.c' || echo '$(srcdir)/'`runtime/go-convert-interface.c
-
-go-copy.lo: runtime/go-copy.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-copy.lo -MD -MP -MF $(DEPDIR)/go-copy.Tpo -c -o go-copy.lo `test -f 'runtime/go-copy.c' || echo '$(srcdir)/'`runtime/go-copy.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-copy.Tpo $(DEPDIR)/go-copy.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-copy.c' object='go-copy.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-copy.lo `test -f 'runtime/go-copy.c' || echo '$(srcdir)/'`runtime/go-copy.c
-
-go-defer.lo: runtime/go-defer.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-defer.lo -MD -MP -MF $(DEPDIR)/go-defer.Tpo -c -o go-defer.lo `test -f 'runtime/go-defer.c' || echo '$(srcdir)/'`runtime/go-defer.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-defer.Tpo $(DEPDIR)/go-defer.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-defer.c' object='go-defer.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-defer.lo `test -f 'runtime/go-defer.c' || echo '$(srcdir)/'`runtime/go-defer.c
-
-go-deferred-recover.lo: runtime/go-deferred-recover.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-deferred-recover.lo -MD -MP -MF $(DEPDIR)/go-deferred-recover.Tpo -c -o go-deferred-recover.lo `test -f 'runtime/go-deferred-recover.c' || echo '$(srcdir)/'`runtime/go-deferred-recover.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-deferred-recover.Tpo $(DEPDIR)/go-deferred-recover.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-deferred-recover.c' object='go-deferred-recover.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-deferred-recover.lo `test -f 'runtime/go-deferred-recover.c' || echo '$(srcdir)/'`runtime/go-deferred-recover.c
-
-go-eface-compare.lo: runtime/go-eface-compare.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-eface-compare.lo -MD -MP -MF $(DEPDIR)/go-eface-compare.Tpo -c -o go-eface-compare.lo `test -f 'runtime/go-eface-compare.c' || echo '$(srcdir)/'`runtime/go-eface-compare.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-eface-compare.Tpo $(DEPDIR)/go-eface-compare.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-eface-compare.c' object='go-eface-compare.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-eface-compare.lo `test -f 'runtime/go-eface-compare.c' || echo '$(srcdir)/'`runtime/go-eface-compare.c
-
-go-eface-val-compare.lo: runtime/go-eface-val-compare.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-eface-val-compare.lo -MD -MP -MF $(DEPDIR)/go-eface-val-compare.Tpo -c -o go-eface-val-compare.lo `test -f 'runtime/go-eface-val-compare.c' || echo '$(srcdir)/'`runtime/go-eface-val-compare.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-eface-val-compare.Tpo $(DEPDIR)/go-eface-val-compare.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-eface-val-compare.c' object='go-eface-val-compare.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-eface-val-compare.lo `test -f 'runtime/go-eface-val-compare.c' || echo '$(srcdir)/'`runtime/go-eface-val-compare.c
-
-go-ffi.lo: runtime/go-ffi.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-ffi.lo -MD -MP -MF $(DEPDIR)/go-ffi.Tpo -c -o go-ffi.lo `test -f 'runtime/go-ffi.c' || echo '$(srcdir)/'`runtime/go-ffi.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-ffi.Tpo $(DEPDIR)/go-ffi.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-ffi.c' object='go-ffi.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-ffi.lo `test -f 'runtime/go-ffi.c' || echo '$(srcdir)/'`runtime/go-ffi.c
-
-go-fieldtrack.lo: runtime/go-fieldtrack.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-fieldtrack.lo -MD -MP -MF $(DEPDIR)/go-fieldtrack.Tpo -c -o go-fieldtrack.lo `test -f 'runtime/go-fieldtrack.c' || echo '$(srcdir)/'`runtime/go-fieldtrack.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-fieldtrack.Tpo $(DEPDIR)/go-fieldtrack.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-fieldtrack.c' object='go-fieldtrack.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-fieldtrack.lo `test -f 'runtime/go-fieldtrack.c' || echo '$(srcdir)/'`runtime/go-fieldtrack.c
-
-go-int-array-to-string.lo: runtime/go-int-array-to-string.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-int-array-to-string.lo -MD -MP -MF $(DEPDIR)/go-int-array-to-string.Tpo -c -o go-int-array-to-string.lo `test -f 'runtime/go-int-array-to-string.c' || echo '$(srcdir)/'`runtime/go-int-array-to-string.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-int-array-to-string.Tpo $(DEPDIR)/go-int-array-to-string.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-int-array-to-string.c' object='go-int-array-to-string.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-int-array-to-string.lo `test -f 'runtime/go-int-array-to-string.c' || echo '$(srcdir)/'`runtime/go-int-array-to-string.c
-
-go-int-to-string.lo: runtime/go-int-to-string.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-int-to-string.lo -MD -MP -MF $(DEPDIR)/go-int-to-string.Tpo -c -o go-int-to-string.lo `test -f 'runtime/go-int-to-string.c' || echo '$(srcdir)/'`runtime/go-int-to-string.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-int-to-string.Tpo $(DEPDIR)/go-int-to-string.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-int-to-string.c' object='go-int-to-string.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-int-to-string.lo `test -f 'runtime/go-int-to-string.c' || echo '$(srcdir)/'`runtime/go-int-to-string.c
-
-go-interface-compare.lo: runtime/go-interface-compare.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-interface-compare.lo -MD -MP -MF $(DEPDIR)/go-interface-compare.Tpo -c -o go-interface-compare.lo `test -f 'runtime/go-interface-compare.c' || echo '$(srcdir)/'`runtime/go-interface-compare.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-interface-compare.Tpo $(DEPDIR)/go-interface-compare.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-interface-compare.c' object='go-interface-compare.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-interface-compare.lo `test -f 'runtime/go-interface-compare.c' || echo '$(srcdir)/'`runtime/go-interface-compare.c
-
-go-interface-eface-compare.lo: runtime/go-interface-eface-compare.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-interface-eface-compare.lo -MD -MP -MF $(DEPDIR)/go-interface-eface-compare.Tpo -c -o go-interface-eface-compare.lo `test -f 'runtime/go-interface-eface-compare.c' || echo '$(srcdir)/'`runtime/go-interface-eface-compare.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-interface-eface-compare.Tpo $(DEPDIR)/go-interface-eface-compare.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-interface-eface-compare.c' object='go-interface-eface-compare.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-interface-eface-compare.lo `test -f 'runtime/go-interface-eface-compare.c' || echo '$(srcdir)/'`runtime/go-interface-eface-compare.c
-
-go-interface-val-compare.lo: runtime/go-interface-val-compare.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-interface-val-compare.lo -MD -MP -MF $(DEPDIR)/go-interface-val-compare.Tpo -c -o go-interface-val-compare.lo `test -f 'runtime/go-interface-val-compare.c' || echo '$(srcdir)/'`runtime/go-interface-val-compare.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-interface-val-compare.Tpo $(DEPDIR)/go-interface-val-compare.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-interface-val-compare.c' object='go-interface-val-compare.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-interface-val-compare.lo `test -f 'runtime/go-interface-val-compare.c' || echo '$(srcdir)/'`runtime/go-interface-val-compare.c
-
-go-make-slice.lo: runtime/go-make-slice.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-make-slice.lo -MD -MP -MF $(DEPDIR)/go-make-slice.Tpo -c -o go-make-slice.lo `test -f 'runtime/go-make-slice.c' || echo '$(srcdir)/'`runtime/go-make-slice.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-make-slice.Tpo $(DEPDIR)/go-make-slice.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-make-slice.c' object='go-make-slice.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-make-slice.lo `test -f 'runtime/go-make-slice.c' || echo '$(srcdir)/'`runtime/go-make-slice.c
-
-go-map-delete.lo: runtime/go-map-delete.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-map-delete.lo -MD -MP -MF $(DEPDIR)/go-map-delete.Tpo -c -o go-map-delete.lo `test -f 'runtime/go-map-delete.c' || echo '$(srcdir)/'`runtime/go-map-delete.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-map-delete.Tpo $(DEPDIR)/go-map-delete.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-map-delete.c' object='go-map-delete.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-map-delete.lo `test -f 'runtime/go-map-delete.c' || echo '$(srcdir)/'`runtime/go-map-delete.c
-
-go-map-index.lo: runtime/go-map-index.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-map-index.lo -MD -MP -MF $(DEPDIR)/go-map-index.Tpo -c -o go-map-index.lo `test -f 'runtime/go-map-index.c' || echo '$(srcdir)/'`runtime/go-map-index.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-map-index.Tpo $(DEPDIR)/go-map-index.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-map-index.c' object='go-map-index.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-map-index.lo `test -f 'runtime/go-map-index.c' || echo '$(srcdir)/'`runtime/go-map-index.c
-
-go-map-len.lo: runtime/go-map-len.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-map-len.lo -MD -MP -MF $(DEPDIR)/go-map-len.Tpo -c -o go-map-len.lo `test -f 'runtime/go-map-len.c' || echo '$(srcdir)/'`runtime/go-map-len.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-map-len.Tpo $(DEPDIR)/go-map-len.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-map-len.c' object='go-map-len.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-map-len.lo `test -f 'runtime/go-map-len.c' || echo '$(srcdir)/'`runtime/go-map-len.c
-
-go-map-range.lo: runtime/go-map-range.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-map-range.lo -MD -MP -MF $(DEPDIR)/go-map-range.Tpo -c -o go-map-range.lo `test -f 'runtime/go-map-range.c' || echo '$(srcdir)/'`runtime/go-map-range.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-map-range.Tpo $(DEPDIR)/go-map-range.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-map-range.c' object='go-map-range.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-map-range.lo `test -f 'runtime/go-map-range.c' || echo '$(srcdir)/'`runtime/go-map-range.c
-
-go-matherr.lo: runtime/go-matherr.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-matherr.lo -MD -MP -MF $(DEPDIR)/go-matherr.Tpo -c -o go-matherr.lo `test -f 'runtime/go-matherr.c' || echo '$(srcdir)/'`runtime/go-matherr.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-matherr.Tpo $(DEPDIR)/go-matherr.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-matherr.c' object='go-matherr.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-matherr.lo `test -f 'runtime/go-matherr.c' || echo '$(srcdir)/'`runtime/go-matherr.c
-
-go-memcmp.lo: runtime/go-memcmp.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-memcmp.lo -MD -MP -MF $(DEPDIR)/go-memcmp.Tpo -c -o go-memcmp.lo `test -f 'runtime/go-memcmp.c' || echo '$(srcdir)/'`runtime/go-memcmp.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-memcmp.Tpo $(DEPDIR)/go-memcmp.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-memcmp.c' object='go-memcmp.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-memcmp.lo `test -f 'runtime/go-memcmp.c' || echo '$(srcdir)/'`runtime/go-memcmp.c
-
-go-nanotime.lo: runtime/go-nanotime.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-nanotime.lo -MD -MP -MF $(DEPDIR)/go-nanotime.Tpo -c -o go-nanotime.lo `test -f 'runtime/go-nanotime.c' || echo '$(srcdir)/'`runtime/go-nanotime.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-nanotime.Tpo $(DEPDIR)/go-nanotime.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-nanotime.c' object='go-nanotime.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-nanotime.lo `test -f 'runtime/go-nanotime.c' || echo '$(srcdir)/'`runtime/go-nanotime.c
-
-go-now.lo: runtime/go-now.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-now.lo -MD -MP -MF $(DEPDIR)/go-now.Tpo -c -o go-now.lo `test -f 'runtime/go-now.c' || echo '$(srcdir)/'`runtime/go-now.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-now.Tpo $(DEPDIR)/go-now.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-now.c' object='go-now.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-now.lo `test -f 'runtime/go-now.c' || echo '$(srcdir)/'`runtime/go-now.c
-
-go-new-map.lo: runtime/go-new-map.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-new-map.lo -MD -MP -MF $(DEPDIR)/go-new-map.Tpo -c -o go-new-map.lo `test -f 'runtime/go-new-map.c' || echo '$(srcdir)/'`runtime/go-new-map.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-new-map.Tpo $(DEPDIR)/go-new-map.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-new-map.c' object='go-new-map.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-new-map.lo `test -f 'runtime/go-new-map.c' || echo '$(srcdir)/'`runtime/go-new-map.c
-
-go-new.lo: runtime/go-new.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-new.lo -MD -MP -MF $(DEPDIR)/go-new.Tpo -c -o go-new.lo `test -f 'runtime/go-new.c' || echo '$(srcdir)/'`runtime/go-new.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-new.Tpo $(DEPDIR)/go-new.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-new.c' object='go-new.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-new.lo `test -f 'runtime/go-new.c' || echo '$(srcdir)/'`runtime/go-new.c
-
-go-nosys.lo: runtime/go-nosys.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-nosys.lo -MD -MP -MF $(DEPDIR)/go-nosys.Tpo -c -o go-nosys.lo `test -f 'runtime/go-nosys.c' || echo '$(srcdir)/'`runtime/go-nosys.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-nosys.Tpo $(DEPDIR)/go-nosys.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-nosys.c' object='go-nosys.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-nosys.lo `test -f 'runtime/go-nosys.c' || echo '$(srcdir)/'`runtime/go-nosys.c
-
-go-panic.lo: runtime/go-panic.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-panic.lo -MD -MP -MF $(DEPDIR)/go-panic.Tpo -c -o go-panic.lo `test -f 'runtime/go-panic.c' || echo '$(srcdir)/'`runtime/go-panic.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-panic.Tpo $(DEPDIR)/go-panic.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-panic.c' object='go-panic.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-panic.lo `test -f 'runtime/go-panic.c' || echo '$(srcdir)/'`runtime/go-panic.c
-
-go-print.lo: runtime/go-print.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-print.lo -MD -MP -MF $(DEPDIR)/go-print.Tpo -c -o go-print.lo `test -f 'runtime/go-print.c' || echo '$(srcdir)/'`runtime/go-print.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-print.Tpo $(DEPDIR)/go-print.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-print.c' object='go-print.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-print.lo `test -f 'runtime/go-print.c' || echo '$(srcdir)/'`runtime/go-print.c
-
-go-recover.lo: runtime/go-recover.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-recover.lo -MD -MP -MF $(DEPDIR)/go-recover.Tpo -c -o go-recover.lo `test -f 'runtime/go-recover.c' || echo '$(srcdir)/'`runtime/go-recover.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-recover.Tpo $(DEPDIR)/go-recover.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-recover.c' object='go-recover.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-recover.lo `test -f 'runtime/go-recover.c' || echo '$(srcdir)/'`runtime/go-recover.c
-
-go-reflect-call.lo: runtime/go-reflect-call.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-reflect-call.lo -MD -MP -MF $(DEPDIR)/go-reflect-call.Tpo -c -o go-reflect-call.lo `test -f 'runtime/go-reflect-call.c' || echo '$(srcdir)/'`runtime/go-reflect-call.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-reflect-call.Tpo $(DEPDIR)/go-reflect-call.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-reflect-call.c' object='go-reflect-call.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-reflect-call.lo `test -f 'runtime/go-reflect-call.c' || echo '$(srcdir)/'`runtime/go-reflect-call.c
-
-go-reflect-map.lo: runtime/go-reflect-map.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-reflect-map.lo -MD -MP -MF $(DEPDIR)/go-reflect-map.Tpo -c -o go-reflect-map.lo `test -f 'runtime/go-reflect-map.c' || echo '$(srcdir)/'`runtime/go-reflect-map.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-reflect-map.Tpo $(DEPDIR)/go-reflect-map.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-reflect-map.c' object='go-reflect-map.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-reflect-map.lo `test -f 'runtime/go-reflect-map.c' || echo '$(srcdir)/'`runtime/go-reflect-map.c
-
-go-rune.lo: runtime/go-rune.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-rune.lo -MD -MP -MF $(DEPDIR)/go-rune.Tpo -c -o go-rune.lo `test -f 'runtime/go-rune.c' || echo '$(srcdir)/'`runtime/go-rune.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-rune.Tpo $(DEPDIR)/go-rune.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-rune.c' object='go-rune.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-rune.lo `test -f 'runtime/go-rune.c' || echo '$(srcdir)/'`runtime/go-rune.c
-
-go-runtime-error.lo: runtime/go-runtime-error.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-runtime-error.lo -MD -MP -MF $(DEPDIR)/go-runtime-error.Tpo -c -o go-runtime-error.lo `test -f 'runtime/go-runtime-error.c' || echo '$(srcdir)/'`runtime/go-runtime-error.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-runtime-error.Tpo $(DEPDIR)/go-runtime-error.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-runtime-error.c' object='go-runtime-error.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-runtime-error.lo `test -f 'runtime/go-runtime-error.c' || echo '$(srcdir)/'`runtime/go-runtime-error.c
-
-go-setenv.lo: runtime/go-setenv.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-setenv.lo -MD -MP -MF $(DEPDIR)/go-setenv.Tpo -c -o go-setenv.lo `test -f 'runtime/go-setenv.c' || echo '$(srcdir)/'`runtime/go-setenv.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-setenv.Tpo $(DEPDIR)/go-setenv.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-setenv.c' object='go-setenv.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-setenv.lo `test -f 'runtime/go-setenv.c' || echo '$(srcdir)/'`runtime/go-setenv.c
-
-go-signal.lo: runtime/go-signal.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-signal.lo -MD -MP -MF $(DEPDIR)/go-signal.Tpo -c -o go-signal.lo `test -f 'runtime/go-signal.c' || echo '$(srcdir)/'`runtime/go-signal.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-signal.Tpo $(DEPDIR)/go-signal.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-signal.c' object='go-signal.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-signal.lo `test -f 'runtime/go-signal.c' || echo '$(srcdir)/'`runtime/go-signal.c
-
-go-strcmp.lo: runtime/go-strcmp.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-strcmp.lo -MD -MP -MF $(DEPDIR)/go-strcmp.Tpo -c -o go-strcmp.lo `test -f 'runtime/go-strcmp.c' || echo '$(srcdir)/'`runtime/go-strcmp.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-strcmp.Tpo $(DEPDIR)/go-strcmp.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-strcmp.c' object='go-strcmp.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-strcmp.lo `test -f 'runtime/go-strcmp.c' || echo '$(srcdir)/'`runtime/go-strcmp.c
-
-go-string-to-byte-array.lo: runtime/go-string-to-byte-array.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-string-to-byte-array.lo -MD -MP -MF $(DEPDIR)/go-string-to-byte-array.Tpo -c -o go-string-to-byte-array.lo `test -f 'runtime/go-string-to-byte-array.c' || echo '$(srcdir)/'`runtime/go-string-to-byte-array.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-string-to-byte-array.Tpo $(DEPDIR)/go-string-to-byte-array.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-string-to-byte-array.c' object='go-string-to-byte-array.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-string-to-byte-array.lo `test -f 'runtime/go-string-to-byte-array.c' || echo '$(srcdir)/'`runtime/go-string-to-byte-array.c
-
-go-string-to-int-array.lo: runtime/go-string-to-int-array.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-string-to-int-array.lo -MD -MP -MF $(DEPDIR)/go-string-to-int-array.Tpo -c -o go-string-to-int-array.lo `test -f 'runtime/go-string-to-int-array.c' || echo '$(srcdir)/'`runtime/go-string-to-int-array.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-string-to-int-array.Tpo $(DEPDIR)/go-string-to-int-array.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-string-to-int-array.c' object='go-string-to-int-array.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-string-to-int-array.lo `test -f 'runtime/go-string-to-int-array.c' || echo '$(srcdir)/'`runtime/go-string-to-int-array.c
-
-go-strplus.lo: runtime/go-strplus.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-strplus.lo -MD -MP -MF $(DEPDIR)/go-strplus.Tpo -c -o go-strplus.lo `test -f 'runtime/go-strplus.c' || echo '$(srcdir)/'`runtime/go-strplus.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-strplus.Tpo $(DEPDIR)/go-strplus.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-strplus.c' object='go-strplus.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-strplus.lo `test -f 'runtime/go-strplus.c' || echo '$(srcdir)/'`runtime/go-strplus.c
-
-go-strslice.lo: runtime/go-strslice.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-strslice.lo -MD -MP -MF $(DEPDIR)/go-strslice.Tpo -c -o go-strslice.lo `test -f 'runtime/go-strslice.c' || echo '$(srcdir)/'`runtime/go-strslice.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-strslice.Tpo $(DEPDIR)/go-strslice.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-strslice.c' object='go-strslice.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-strslice.lo `test -f 'runtime/go-strslice.c' || echo '$(srcdir)/'`runtime/go-strslice.c
-
-go-traceback.lo: runtime/go-traceback.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-traceback.lo -MD -MP -MF $(DEPDIR)/go-traceback.Tpo -c -o go-traceback.lo `test -f 'runtime/go-traceback.c' || echo '$(srcdir)/'`runtime/go-traceback.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-traceback.Tpo $(DEPDIR)/go-traceback.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-traceback.c' object='go-traceback.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-traceback.lo `test -f 'runtime/go-traceback.c' || echo '$(srcdir)/'`runtime/go-traceback.c
-
-go-type-complex.lo: runtime/go-type-complex.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-type-complex.lo -MD -MP -MF $(DEPDIR)/go-type-complex.Tpo -c -o go-type-complex.lo `test -f 'runtime/go-type-complex.c' || echo '$(srcdir)/'`runtime/go-type-complex.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-type-complex.Tpo $(DEPDIR)/go-type-complex.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-type-complex.c' object='go-type-complex.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-type-complex.lo `test -f 'runtime/go-type-complex.c' || echo '$(srcdir)/'`runtime/go-type-complex.c
-
-go-type-eface.lo: runtime/go-type-eface.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-type-eface.lo -MD -MP -MF $(DEPDIR)/go-type-eface.Tpo -c -o go-type-eface.lo `test -f 'runtime/go-type-eface.c' || echo '$(srcdir)/'`runtime/go-type-eface.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-type-eface.Tpo $(DEPDIR)/go-type-eface.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-type-eface.c' object='go-type-eface.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-type-eface.lo `test -f 'runtime/go-type-eface.c' || echo '$(srcdir)/'`runtime/go-type-eface.c
-
-go-type-error.lo: runtime/go-type-error.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-type-error.lo -MD -MP -MF $(DEPDIR)/go-type-error.Tpo -c -o go-type-error.lo `test -f 'runtime/go-type-error.c' || echo '$(srcdir)/'`runtime/go-type-error.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-type-error.Tpo $(DEPDIR)/go-type-error.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-type-error.c' object='go-type-error.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-type-error.lo `test -f 'runtime/go-type-error.c' || echo '$(srcdir)/'`runtime/go-type-error.c
-
-go-type-float.lo: runtime/go-type-float.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-type-float.lo -MD -MP -MF $(DEPDIR)/go-type-float.Tpo -c -o go-type-float.lo `test -f 'runtime/go-type-float.c' || echo '$(srcdir)/'`runtime/go-type-float.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-type-float.Tpo $(DEPDIR)/go-type-float.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-type-float.c' object='go-type-float.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-type-float.lo `test -f 'runtime/go-type-float.c' || echo '$(srcdir)/'`runtime/go-type-float.c
-
-go-type-identity.lo: runtime/go-type-identity.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-type-identity.lo -MD -MP -MF $(DEPDIR)/go-type-identity.Tpo -c -o go-type-identity.lo `test -f 'runtime/go-type-identity.c' || echo '$(srcdir)/'`runtime/go-type-identity.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-type-identity.Tpo $(DEPDIR)/go-type-identity.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-type-identity.c' object='go-type-identity.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-type-identity.lo `test -f 'runtime/go-type-identity.c' || echo '$(srcdir)/'`runtime/go-type-identity.c
-
-go-type-interface.lo: runtime/go-type-interface.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-type-interface.lo -MD -MP -MF $(DEPDIR)/go-type-interface.Tpo -c -o go-type-interface.lo `test -f 'runtime/go-type-interface.c' || echo '$(srcdir)/'`runtime/go-type-interface.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-type-interface.Tpo $(DEPDIR)/go-type-interface.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-type-interface.c' object='go-type-interface.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-type-interface.lo `test -f 'runtime/go-type-interface.c' || echo '$(srcdir)/'`runtime/go-type-interface.c
-
-go-type-string.lo: runtime/go-type-string.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-type-string.lo -MD -MP -MF $(DEPDIR)/go-type-string.Tpo -c -o go-type-string.lo `test -f 'runtime/go-type-string.c' || echo '$(srcdir)/'`runtime/go-type-string.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-type-string.Tpo $(DEPDIR)/go-type-string.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-type-string.c' object='go-type-string.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-type-string.lo `test -f 'runtime/go-type-string.c' || echo '$(srcdir)/'`runtime/go-type-string.c
-
-go-typedesc-equal.lo: runtime/go-typedesc-equal.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-typedesc-equal.lo -MD -MP -MF $(DEPDIR)/go-typedesc-equal.Tpo -c -o go-typedesc-equal.lo `test -f 'runtime/go-typedesc-equal.c' || echo '$(srcdir)/'`runtime/go-typedesc-equal.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-typedesc-equal.Tpo $(DEPDIR)/go-typedesc-equal.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-typedesc-equal.c' object='go-typedesc-equal.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-typedesc-equal.lo `test -f 'runtime/go-typedesc-equal.c' || echo '$(srcdir)/'`runtime/go-typedesc-equal.c
-
-go-unsafe-new.lo: runtime/go-unsafe-new.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-unsafe-new.lo -MD -MP -MF $(DEPDIR)/go-unsafe-new.Tpo -c -o go-unsafe-new.lo `test -f 'runtime/go-unsafe-new.c' || echo '$(srcdir)/'`runtime/go-unsafe-new.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-unsafe-new.Tpo $(DEPDIR)/go-unsafe-new.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-unsafe-new.c' object='go-unsafe-new.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-unsafe-new.lo `test -f 'runtime/go-unsafe-new.c' || echo '$(srcdir)/'`runtime/go-unsafe-new.c
-
-go-unsafe-newarray.lo: runtime/go-unsafe-newarray.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-unsafe-newarray.lo -MD -MP -MF $(DEPDIR)/go-unsafe-newarray.Tpo -c -o go-unsafe-newarray.lo `test -f 'runtime/go-unsafe-newarray.c' || echo '$(srcdir)/'`runtime/go-unsafe-newarray.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-unsafe-newarray.Tpo $(DEPDIR)/go-unsafe-newarray.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-unsafe-newarray.c' object='go-unsafe-newarray.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-unsafe-newarray.lo `test -f 'runtime/go-unsafe-newarray.c' || echo '$(srcdir)/'`runtime/go-unsafe-newarray.c
-
-go-unsafe-pointer.lo: runtime/go-unsafe-pointer.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-unsafe-pointer.lo -MD -MP -MF $(DEPDIR)/go-unsafe-pointer.Tpo -c -o go-unsafe-pointer.lo `test -f 'runtime/go-unsafe-pointer.c' || echo '$(srcdir)/'`runtime/go-unsafe-pointer.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-unsafe-pointer.Tpo $(DEPDIR)/go-unsafe-pointer.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-unsafe-pointer.c' object='go-unsafe-pointer.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-unsafe-pointer.lo `test -f 'runtime/go-unsafe-pointer.c' || echo '$(srcdir)/'`runtime/go-unsafe-pointer.c
-
-go-unsetenv.lo: runtime/go-unsetenv.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-unsetenv.lo -MD -MP -MF $(DEPDIR)/go-unsetenv.Tpo -c -o go-unsetenv.lo `test -f 'runtime/go-unsetenv.c' || echo '$(srcdir)/'`runtime/go-unsetenv.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-unsetenv.Tpo $(DEPDIR)/go-unsetenv.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-unsetenv.c' object='go-unsetenv.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-unsetenv.lo `test -f 'runtime/go-unsetenv.c' || echo '$(srcdir)/'`runtime/go-unsetenv.c
-
-go-unwind.lo: runtime/go-unwind.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-unwind.lo -MD -MP -MF $(DEPDIR)/go-unwind.Tpo -c -o go-unwind.lo `test -f 'runtime/go-unwind.c' || echo '$(srcdir)/'`runtime/go-unwind.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-unwind.Tpo $(DEPDIR)/go-unwind.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-unwind.c' object='go-unwind.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-unwind.lo `test -f 'runtime/go-unwind.c' || echo '$(srcdir)/'`runtime/go-unwind.c
-
-go-varargs.lo: runtime/go-varargs.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT go-varargs.lo -MD -MP -MF $(DEPDIR)/go-varargs.Tpo -c -o go-varargs.lo `test -f 'runtime/go-varargs.c' || echo '$(srcdir)/'`runtime/go-varargs.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/go-varargs.Tpo $(DEPDIR)/go-varargs.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/go-varargs.c' object='go-varargs.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o go-varargs.lo `test -f 'runtime/go-varargs.c' || echo '$(srcdir)/'`runtime/go-varargs.c
-
-env_posix.lo: runtime/env_posix.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT env_posix.lo -MD -MP -MF $(DEPDIR)/env_posix.Tpo -c -o env_posix.lo `test -f 'runtime/env_posix.c' || echo '$(srcdir)/'`runtime/env_posix.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/env_posix.Tpo $(DEPDIR)/env_posix.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/env_posix.c' object='env_posix.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o env_posix.lo `test -f 'runtime/env_posix.c' || echo '$(srcdir)/'`runtime/env_posix.c
-
-heapdump.lo: runtime/heapdump.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT heapdump.lo -MD -MP -MF $(DEPDIR)/heapdump.Tpo -c -o heapdump.lo `test -f 'runtime/heapdump.c' || echo '$(srcdir)/'`runtime/heapdump.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/heapdump.Tpo $(DEPDIR)/heapdump.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/heapdump.c' object='heapdump.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o heapdump.lo `test -f 'runtime/heapdump.c' || echo '$(srcdir)/'`runtime/heapdump.c
-
-lock_sema.lo: runtime/lock_sema.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lock_sema.lo -MD -MP -MF $(DEPDIR)/lock_sema.Tpo -c -o lock_sema.lo `test -f 'runtime/lock_sema.c' || echo '$(srcdir)/'`runtime/lock_sema.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/lock_sema.Tpo $(DEPDIR)/lock_sema.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/lock_sema.c' object='lock_sema.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lock_sema.lo `test -f 'runtime/lock_sema.c' || echo '$(srcdir)/'`runtime/lock_sema.c
-
-thread-sema.lo: runtime/thread-sema.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT thread-sema.lo -MD -MP -MF $(DEPDIR)/thread-sema.Tpo -c -o thread-sema.lo `test -f 'runtime/thread-sema.c' || echo '$(srcdir)/'`runtime/thread-sema.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/thread-sema.Tpo $(DEPDIR)/thread-sema.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/thread-sema.c' object='thread-sema.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o thread-sema.lo `test -f 'runtime/thread-sema.c' || echo '$(srcdir)/'`runtime/thread-sema.c
-
-lock_futex.lo: runtime/lock_futex.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lock_futex.lo -MD -MP -MF $(DEPDIR)/lock_futex.Tpo -c -o lock_futex.lo `test -f 'runtime/lock_futex.c' || echo '$(srcdir)/'`runtime/lock_futex.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/lock_futex.Tpo $(DEPDIR)/lock_futex.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/lock_futex.c' object='lock_futex.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lock_futex.lo `test -f 'runtime/lock_futex.c' || echo '$(srcdir)/'`runtime/lock_futex.c
-
-thread-linux.lo: runtime/thread-linux.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT thread-linux.lo -MD -MP -MF $(DEPDIR)/thread-linux.Tpo -c -o thread-linux.lo `test -f 'runtime/thread-linux.c' || echo '$(srcdir)/'`runtime/thread-linux.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/thread-linux.Tpo $(DEPDIR)/thread-linux.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/thread-linux.c' object='thread-linux.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o thread-linux.lo `test -f 'runtime/thread-linux.c' || echo '$(srcdir)/'`runtime/thread-linux.c
-
-mcache.lo: runtime/mcache.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mcache.lo -MD -MP -MF $(DEPDIR)/mcache.Tpo -c -o mcache.lo `test -f 'runtime/mcache.c' || echo '$(srcdir)/'`runtime/mcache.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/mcache.Tpo $(DEPDIR)/mcache.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/mcache.c' object='mcache.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mcache.lo `test -f 'runtime/mcache.c' || echo '$(srcdir)/'`runtime/mcache.c
-
-mcentral.lo: runtime/mcentral.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mcentral.lo -MD -MP -MF $(DEPDIR)/mcentral.Tpo -c -o mcentral.lo `test -f 'runtime/mcentral.c' || echo '$(srcdir)/'`runtime/mcentral.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/mcentral.Tpo $(DEPDIR)/mcentral.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/mcentral.c' object='mcentral.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mcentral.lo `test -f 'runtime/mcentral.c' || echo '$(srcdir)/'`runtime/mcentral.c
-
-mem_posix_memalign.lo: runtime/mem_posix_memalign.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mem_posix_memalign.lo -MD -MP -MF $(DEPDIR)/mem_posix_memalign.Tpo -c -o mem_posix_memalign.lo `test -f 'runtime/mem_posix_memalign.c' || echo '$(srcdir)/'`runtime/mem_posix_memalign.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/mem_posix_memalign.Tpo $(DEPDIR)/mem_posix_memalign.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/mem_posix_memalign.c' object='mem_posix_memalign.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mem_posix_memalign.lo `test -f 'runtime/mem_posix_memalign.c' || echo '$(srcdir)/'`runtime/mem_posix_memalign.c
-
-mem.lo: runtime/mem.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mem.lo -MD -MP -MF $(DEPDIR)/mem.Tpo -c -o mem.lo `test -f 'runtime/mem.c' || echo '$(srcdir)/'`runtime/mem.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/mem.Tpo $(DEPDIR)/mem.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/mem.c' object='mem.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mem.lo `test -f 'runtime/mem.c' || echo '$(srcdir)/'`runtime/mem.c
-
-mfixalloc.lo: runtime/mfixalloc.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mfixalloc.lo -MD -MP -MF $(DEPDIR)/mfixalloc.Tpo -c -o mfixalloc.lo `test -f 'runtime/mfixalloc.c' || echo '$(srcdir)/'`runtime/mfixalloc.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/mfixalloc.Tpo $(DEPDIR)/mfixalloc.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/mfixalloc.c' object='mfixalloc.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mfixalloc.lo `test -f 'runtime/mfixalloc.c' || echo '$(srcdir)/'`runtime/mfixalloc.c
-
-mgc0.lo: runtime/mgc0.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mgc0.lo -MD -MP -MF $(DEPDIR)/mgc0.Tpo -c -o mgc0.lo `test -f 'runtime/mgc0.c' || echo '$(srcdir)/'`runtime/mgc0.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/mgc0.Tpo $(DEPDIR)/mgc0.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/mgc0.c' object='mgc0.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mgc0.lo `test -f 'runtime/mgc0.c' || echo '$(srcdir)/'`runtime/mgc0.c
-
-mheap.lo: runtime/mheap.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mheap.lo -MD -MP -MF $(DEPDIR)/mheap.Tpo -c -o mheap.lo `test -f 'runtime/mheap.c' || echo '$(srcdir)/'`runtime/mheap.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/mheap.Tpo $(DEPDIR)/mheap.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/mheap.c' object='mheap.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mheap.lo `test -f 'runtime/mheap.c' || echo '$(srcdir)/'`runtime/mheap.c
-
-msize.lo: runtime/msize.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT msize.lo -MD -MP -MF $(DEPDIR)/msize.Tpo -c -o msize.lo `test -f 'runtime/msize.c' || echo '$(srcdir)/'`runtime/msize.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/msize.Tpo $(DEPDIR)/msize.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/msize.c' object='msize.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o msize.lo `test -f 'runtime/msize.c' || echo '$(srcdir)/'`runtime/msize.c
-
-netpoll_kqueue.lo: runtime/netpoll_kqueue.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netpoll_kqueue.lo -MD -MP -MF $(DEPDIR)/netpoll_kqueue.Tpo -c -o netpoll_kqueue.lo `test -f 'runtime/netpoll_kqueue.c' || echo '$(srcdir)/'`runtime/netpoll_kqueue.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/netpoll_kqueue.Tpo $(DEPDIR)/netpoll_kqueue.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/netpoll_kqueue.c' object='netpoll_kqueue.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o netpoll_kqueue.lo `test -f 'runtime/netpoll_kqueue.c' || echo '$(srcdir)/'`runtime/netpoll_kqueue.c
-
-netpoll_select.lo: runtime/netpoll_select.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netpoll_select.lo -MD -MP -MF $(DEPDIR)/netpoll_select.Tpo -c -o netpoll_select.lo `test -f 'runtime/netpoll_select.c' || echo '$(srcdir)/'`runtime/netpoll_select.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/netpoll_select.Tpo $(DEPDIR)/netpoll_select.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/netpoll_select.c' object='netpoll_select.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o netpoll_select.lo `test -f 'runtime/netpoll_select.c' || echo '$(srcdir)/'`runtime/netpoll_select.c
-
-netpoll_epoll.lo: runtime/netpoll_epoll.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netpoll_epoll.lo -MD -MP -MF $(DEPDIR)/netpoll_epoll.Tpo -c -o netpoll_epoll.lo `test -f 'runtime/netpoll_epoll.c' || echo '$(srcdir)/'`runtime/netpoll_epoll.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/netpoll_epoll.Tpo $(DEPDIR)/netpoll_epoll.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/netpoll_epoll.c' object='netpoll_epoll.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o netpoll_epoll.lo `test -f 'runtime/netpoll_epoll.c' || echo '$(srcdir)/'`runtime/netpoll_epoll.c
-
-panic.lo: runtime/panic.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panic.lo -MD -MP -MF $(DEPDIR)/panic.Tpo -c -o panic.lo `test -f 'runtime/panic.c' || echo '$(srcdir)/'`runtime/panic.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/panic.Tpo $(DEPDIR)/panic.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/panic.c' object='panic.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panic.lo `test -f 'runtime/panic.c' || echo '$(srcdir)/'`runtime/panic.c
-
-parfor.lo: runtime/parfor.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parfor.lo -MD -MP -MF $(DEPDIR)/parfor.Tpo -c -o parfor.lo `test -f 'runtime/parfor.c' || echo '$(srcdir)/'`runtime/parfor.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/parfor.Tpo $(DEPDIR)/parfor.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/parfor.c' object='parfor.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parfor.lo `test -f 'runtime/parfor.c' || echo '$(srcdir)/'`runtime/parfor.c
-
-print.lo: runtime/print.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT print.lo -MD -MP -MF $(DEPDIR)/print.Tpo -c -o print.lo `test -f 'runtime/print.c' || echo '$(srcdir)/'`runtime/print.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/print.Tpo $(DEPDIR)/print.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/print.c' object='print.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o print.lo `test -f 'runtime/print.c' || echo '$(srcdir)/'`runtime/print.c
-
-proc.lo: runtime/proc.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT proc.lo -MD -MP -MF $(DEPDIR)/proc.Tpo -c -o proc.lo `test -f 'runtime/proc.c' || echo '$(srcdir)/'`runtime/proc.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/proc.Tpo $(DEPDIR)/proc.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/proc.c' object='proc.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o proc.lo `test -f 'runtime/proc.c' || echo '$(srcdir)/'`runtime/proc.c
-
-runtime.lo: runtime/runtime.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT runtime.lo -MD -MP -MF $(DEPDIR)/runtime.Tpo -c -o runtime.lo `test -f 'runtime/runtime.c' || echo '$(srcdir)/'`runtime/runtime.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/runtime.Tpo $(DEPDIR)/runtime.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/runtime.c' object='runtime.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o runtime.lo `test -f 'runtime/runtime.c' || echo '$(srcdir)/'`runtime/runtime.c
-
-signal_unix.lo: runtime/signal_unix.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT signal_unix.lo -MD -MP -MF $(DEPDIR)/signal_unix.Tpo -c -o signal_unix.lo `test -f 'runtime/signal_unix.c' || echo '$(srcdir)/'`runtime/signal_unix.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/signal_unix.Tpo $(DEPDIR)/signal_unix.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/signal_unix.c' object='signal_unix.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o signal_unix.lo `test -f 'runtime/signal_unix.c' || echo '$(srcdir)/'`runtime/signal_unix.c
-
-thread.lo: runtime/thread.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT thread.lo -MD -MP -MF $(DEPDIR)/thread.Tpo -c -o thread.lo `test -f 'runtime/thread.c' || echo '$(srcdir)/'`runtime/thread.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/thread.Tpo $(DEPDIR)/thread.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/thread.c' object='thread.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o thread.lo `test -f 'runtime/thread.c' || echo '$(srcdir)/'`runtime/thread.c
-
-yield.lo: runtime/yield.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT yield.lo -MD -MP -MF $(DEPDIR)/yield.Tpo -c -o yield.lo `test -f 'runtime/yield.c' || echo '$(srcdir)/'`runtime/yield.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/yield.Tpo $(DEPDIR)/yield.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/yield.c' object='yield.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o yield.lo `test -f 'runtime/yield.c' || echo '$(srcdir)/'`runtime/yield.c
-
-rtems-task-variable-add.lo: runtime/rtems-task-variable-add.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rtems-task-variable-add.lo -MD -MP -MF $(DEPDIR)/rtems-task-variable-add.Tpo -c -o rtems-task-variable-add.lo `test -f 'runtime/rtems-task-variable-add.c' || echo '$(srcdir)/'`runtime/rtems-task-variable-add.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/rtems-task-variable-add.Tpo $(DEPDIR)/rtems-task-variable-add.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/rtems-task-variable-add.c' object='rtems-task-variable-add.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rtems-task-variable-add.lo `test -f 'runtime/rtems-task-variable-add.c' || echo '$(srcdir)/'`runtime/rtems-task-variable-add.c
-
-getncpu-none.lo: runtime/getncpu-none.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT getncpu-none.lo -MD -MP -MF $(DEPDIR)/getncpu-none.Tpo -c -o getncpu-none.lo `test -f 'runtime/getncpu-none.c' || echo '$(srcdir)/'`runtime/getncpu-none.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/getncpu-none.Tpo $(DEPDIR)/getncpu-none.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/getncpu-none.c' object='getncpu-none.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o getncpu-none.lo `test -f 'runtime/getncpu-none.c' || echo '$(srcdir)/'`runtime/getncpu-none.c
-
-getncpu-bsd.lo: runtime/getncpu-bsd.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT getncpu-bsd.lo -MD -MP -MF $(DEPDIR)/getncpu-bsd.Tpo -c -o getncpu-bsd.lo `test -f 'runtime/getncpu-bsd.c' || echo '$(srcdir)/'`runtime/getncpu-bsd.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/getncpu-bsd.Tpo $(DEPDIR)/getncpu-bsd.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/getncpu-bsd.c' object='getncpu-bsd.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o getncpu-bsd.lo `test -f 'runtime/getncpu-bsd.c' || echo '$(srcdir)/'`runtime/getncpu-bsd.c
-
-getncpu-solaris.lo: runtime/getncpu-solaris.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT getncpu-solaris.lo -MD -MP -MF $(DEPDIR)/getncpu-solaris.Tpo -c -o getncpu-solaris.lo `test -f 'runtime/getncpu-solaris.c' || echo '$(srcdir)/'`runtime/getncpu-solaris.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/getncpu-solaris.Tpo $(DEPDIR)/getncpu-solaris.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/getncpu-solaris.c' object='getncpu-solaris.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o getncpu-solaris.lo `test -f 'runtime/getncpu-solaris.c' || echo '$(srcdir)/'`runtime/getncpu-solaris.c
-
-getncpu-irix.lo: runtime/getncpu-irix.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT getncpu-irix.lo -MD -MP -MF $(DEPDIR)/getncpu-irix.Tpo -c -o getncpu-irix.lo `test -f 'runtime/getncpu-irix.c' || echo '$(srcdir)/'`runtime/getncpu-irix.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/getncpu-irix.Tpo $(DEPDIR)/getncpu-irix.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/getncpu-irix.c' object='getncpu-irix.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o getncpu-irix.lo `test -f 'runtime/getncpu-irix.c' || echo '$(srcdir)/'`runtime/getncpu-irix.c
-
-getncpu-linux.lo: runtime/getncpu-linux.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT getncpu-linux.lo -MD -MP -MF $(DEPDIR)/getncpu-linux.Tpo -c -o getncpu-linux.lo `test -f 'runtime/getncpu-linux.c' || echo '$(srcdir)/'`runtime/getncpu-linux.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/getncpu-linux.Tpo $(DEPDIR)/getncpu-linux.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='runtime/getncpu-linux.c' object='getncpu-linux.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o getncpu-linux.lo `test -f 'runtime/getncpu-linux.c' || echo '$(srcdir)/'`runtime/getncpu-linux.c
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool config.lt
-
-# GNU Make needs to see an explicit $(MAKE) variable in the command it
-# runs to enable its job server during parallel builds.  Hence the
-# comments below.
-all-multi:
-	$(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do # $(MAKE)
-install-multi:
-	$(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do # $(MAKE)
-
-mostlyclean-multi:
-	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=mostlyclean multi-clean # $(MAKE)
-clean-multi:
-	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=clean multi-clean # $(MAKE)
-distclean-multi:
-	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=distclean multi-clean # $(MAKE)
-maintainer-clean-multi:
-	$(MULTICLEAN) $(AM_MAKEFLAGS) DO=maintainer-clean multi-clean # $(MAKE)
-install-toolexeclibgoDATA: $(toolexeclibgo_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgo_DATA)'; test -n "$(toolexeclibgodir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgodir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgodir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgodir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgodir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgoDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgo_DATA)'; test -n "$(toolexeclibgodir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgodir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgoarchiveDATA: $(toolexeclibgoarchive_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgoarchive_DATA)'; test -n "$(toolexeclibgoarchivedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgoarchivedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgoarchivedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgoarchivedir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgoarchivedir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgoarchiveDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgoarchive_DATA)'; test -n "$(toolexeclibgoarchivedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgoarchivedir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgocompressDATA: $(toolexeclibgocompress_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgocompress_DATA)'; test -n "$(toolexeclibgocompressdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgocompressdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgocompressdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgocompressdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgocompressdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgocompressDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgocompress_DATA)'; test -n "$(toolexeclibgocompressdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgocompressdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgocontainerDATA: $(toolexeclibgocontainer_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgocontainer_DATA)'; test -n "$(toolexeclibgocontainerdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgocontainerdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgocontainerdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgocontainerdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgocontainerdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgocontainerDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgocontainer_DATA)'; test -n "$(toolexeclibgocontainerdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgocontainerdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgocryptoDATA: $(toolexeclibgocrypto_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgocrypto_DATA)'; test -n "$(toolexeclibgocryptodir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgocryptodir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgocryptodir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgocryptodir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgocryptodir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgocryptoDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgocrypto_DATA)'; test -n "$(toolexeclibgocryptodir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgocryptodir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgocryptox509DATA: $(toolexeclibgocryptox509_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgocryptox509_DATA)'; test -n "$(toolexeclibgocryptox509dir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgocryptox509dir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgocryptox509dir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgocryptox509dir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgocryptox509dir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgocryptox509DATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgocryptox509_DATA)'; test -n "$(toolexeclibgocryptox509dir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgocryptox509dir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgodatabaseDATA: $(toolexeclibgodatabase_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgodatabase_DATA)'; test -n "$(toolexeclibgodatabasedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgodatabasedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgodatabasedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgodatabasedir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgodatabasedir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgodatabaseDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgodatabase_DATA)'; test -n "$(toolexeclibgodatabasedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgodatabasedir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgodatabasesqlDATA: $(toolexeclibgodatabasesql_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgodatabasesql_DATA)'; test -n "$(toolexeclibgodatabasesqldir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgodatabasesqldir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgodatabasesqldir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgodatabasesqldir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgodatabasesqldir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgodatabasesqlDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgodatabasesql_DATA)'; test -n "$(toolexeclibgodatabasesqldir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgodatabasesqldir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgodebugDATA: $(toolexeclibgodebug_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgodebug_DATA)'; test -n "$(toolexeclibgodebugdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgodebugdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgodebugdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgodebugdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgodebugdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgodebugDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgodebug_DATA)'; test -n "$(toolexeclibgodebugdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgodebugdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgoencodingDATA: $(toolexeclibgoencoding_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgoencoding_DATA)'; test -n "$(toolexeclibgoencodingdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgoencodingdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgoencodingdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgoencodingdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgoencodingdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgoencodingDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgoencoding_DATA)'; test -n "$(toolexeclibgoencodingdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgoencodingdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgoexpDATA: $(toolexeclibgoexp_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgoexp_DATA)'; test -n "$(toolexeclibgoexpdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgoexpdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgoexpdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgoexpdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgoexpdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgoexpDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgoexp_DATA)'; test -n "$(toolexeclibgoexpdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgoexpdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgogoDATA: $(toolexeclibgogo_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgogo_DATA)'; test -n "$(toolexeclibgogodir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgogodir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgogodir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgogodir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgogodir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgogoDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgogo_DATA)'; test -n "$(toolexeclibgogodir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgogodir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgohashDATA: $(toolexeclibgohash_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgohash_DATA)'; test -n "$(toolexeclibgohashdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgohashdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgohashdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgohashdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgohashdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgohashDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgohash_DATA)'; test -n "$(toolexeclibgohashdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgohashdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgohtmlDATA: $(toolexeclibgohtml_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgohtml_DATA)'; test -n "$(toolexeclibgohtmldir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgohtmldir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgohtmldir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgohtmldir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgohtmldir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgohtmlDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgohtml_DATA)'; test -n "$(toolexeclibgohtmldir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgohtmldir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgoimageDATA: $(toolexeclibgoimage_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgoimage_DATA)'; test -n "$(toolexeclibgoimagedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgoimagedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgoimagedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgoimagedir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgoimagedir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgoimageDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgoimage_DATA)'; test -n "$(toolexeclibgoimagedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgoimagedir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgoimagecolorDATA: $(toolexeclibgoimagecolor_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgoimagecolor_DATA)'; test -n "$(toolexeclibgoimagecolordir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgoimagecolordir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgoimagecolordir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgoimagecolordir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgoimagecolordir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgoimagecolorDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgoimagecolor_DATA)'; test -n "$(toolexeclibgoimagecolordir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgoimagecolordir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgoindexDATA: $(toolexeclibgoindex_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgoindex_DATA)'; test -n "$(toolexeclibgoindexdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgoindexdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgoindexdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgoindexdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgoindexdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgoindexDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgoindex_DATA)'; test -n "$(toolexeclibgoindexdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgoindexdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgoioDATA: $(toolexeclibgoio_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgoio_DATA)'; test -n "$(toolexeclibgoiodir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgoiodir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgoiodir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgoiodir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgoiodir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgoioDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgoio_DATA)'; test -n "$(toolexeclibgoiodir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgoiodir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgologDATA: $(toolexeclibgolog_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgolog_DATA)'; test -n "$(toolexeclibgologdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgologdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgologdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgologdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgologdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgologDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgolog_DATA)'; test -n "$(toolexeclibgologdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgologdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgomathDATA: $(toolexeclibgomath_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgomath_DATA)'; test -n "$(toolexeclibgomathdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgomathdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgomathdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgomathdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgomathdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgomathDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgomath_DATA)'; test -n "$(toolexeclibgomathdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgomathdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgomimeDATA: $(toolexeclibgomime_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgomime_DATA)'; test -n "$(toolexeclibgomimedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgomimedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgomimedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgomimedir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgomimedir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgomimeDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgomime_DATA)'; test -n "$(toolexeclibgomimedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgomimedir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgonetDATA: $(toolexeclibgonet_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgonet_DATA)'; test -n "$(toolexeclibgonetdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgonetdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgonetdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgonetdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgonetdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgonetDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgonet_DATA)'; test -n "$(toolexeclibgonetdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgonetdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgonethttpDATA: $(toolexeclibgonethttp_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgonethttp_DATA)'; test -n "$(toolexeclibgonethttpdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgonethttpdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgonethttpdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgonethttpdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgonethttpdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgonethttpDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgonethttp_DATA)'; test -n "$(toolexeclibgonethttpdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgonethttpdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgonetrpcDATA: $(toolexeclibgonetrpc_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgonetrpc_DATA)'; test -n "$(toolexeclibgonetrpcdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgonetrpcdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgonetrpcdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgonetrpcdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgonetrpcdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgonetrpcDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgonetrpc_DATA)'; test -n "$(toolexeclibgonetrpcdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgonetrpcdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgooldDATA: $(toolexeclibgoold_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgoold_DATA)'; test -n "$(toolexeclibgoolddir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgoolddir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgoolddir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgoolddir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgoolddir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgooldDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgoold_DATA)'; test -n "$(toolexeclibgoolddir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgoolddir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgoosDATA: $(toolexeclibgoos_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgoos_DATA)'; test -n "$(toolexeclibgoosdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgoosdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgoosdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgoosdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgoosdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgoosDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgoos_DATA)'; test -n "$(toolexeclibgoosdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgoosdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgopathDATA: $(toolexeclibgopath_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgopath_DATA)'; test -n "$(toolexeclibgopathdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgopathdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgopathdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgopathdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgopathdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgopathDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgopath_DATA)'; test -n "$(toolexeclibgopathdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgopathdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgoregexpDATA: $(toolexeclibgoregexp_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgoregexp_DATA)'; test -n "$(toolexeclibgoregexpdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgoregexpdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgoregexpdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgoregexpdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgoregexpdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgoregexpDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgoregexp_DATA)'; test -n "$(toolexeclibgoregexpdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgoregexpdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgoruntimeDATA: $(toolexeclibgoruntime_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgoruntime_DATA)'; test -n "$(toolexeclibgoruntimedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgoruntimedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgoruntimedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgoruntimedir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgoruntimedir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgoruntimeDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgoruntime_DATA)'; test -n "$(toolexeclibgoruntimedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgoruntimedir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgosyncDATA: $(toolexeclibgosync_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgosync_DATA)'; test -n "$(toolexeclibgosyncdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgosyncdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgosyncdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgosyncdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgosyncdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgosyncDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgosync_DATA)'; test -n "$(toolexeclibgosyncdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgosyncdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgotestingDATA: $(toolexeclibgotesting_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgotesting_DATA)'; test -n "$(toolexeclibgotestingdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgotestingdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgotestingdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgotestingdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgotestingdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgotestingDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgotesting_DATA)'; test -n "$(toolexeclibgotestingdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgotestingdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgotextDATA: $(toolexeclibgotext_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgotext_DATA)'; test -n "$(toolexeclibgotextdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgotextdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgotextdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgotextdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgotextdir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgotextDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgotext_DATA)'; test -n "$(toolexeclibgotextdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgotextdir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgotexttemplateDATA: $(toolexeclibgotexttemplate_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgotexttemplate_DATA)'; test -n "$(toolexeclibgotexttemplatedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgotexttemplatedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgotexttemplatedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgotexttemplatedir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgotexttemplatedir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgotexttemplateDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgotexttemplate_DATA)'; test -n "$(toolexeclibgotexttemplatedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgotexttemplatedir)'; $(am__uninstall_files_from_dir)
-install-toolexeclibgounicodeDATA: $(toolexeclibgounicode_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(toolexeclibgounicode_DATA)'; test -n "$(toolexeclibgounicodedir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibgounicodedir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibgounicodedir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibgounicodedir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibgounicodedir)" || exit $$?; \
-	done
-
-uninstall-toolexeclibgounicodeDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(toolexeclibgounicode_DATA)'; test -n "$(toolexeclibgounicodedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(toolexeclibgounicodedir)'; $(am__uninstall_files_from_dir)
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) all-multi $(DATA) \
-		config.h
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(toolexeclibgodir)" "$(DESTDIR)$(toolexeclibgoarchivedir)" "$(DESTDIR)$(toolexeclibgocompressdir)" "$(DESTDIR)$(toolexeclibgocontainerdir)" "$(DESTDIR)$(toolexeclibgocryptodir)" "$(DESTDIR)$(toolexeclibgocryptox509dir)" "$(DESTDIR)$(toolexeclibgodatabasedir)" "$(DESTDIR)$(toolexeclibgodatabasesqldir)" "$(DESTDIR)$(toolexeclibgodebugdir)" "$(DESTDIR)$(toolexeclibgoencodingdir)" "$(DESTDIR)$(toolexeclibgoexpdir)" "$(DESTDIR)$(toolexeclibgogodir)" "$(DESTDIR)$(toolexeclibgohashdir)" "$(DESTDIR)$(toolexeclibgohtmldir)" "$(DESTDIR)$(toolexeclibgoimagedir)" "$(DESTDIR)$(toolexeclibgoimagecolordir)" "$(DESTDIR)$(toolexeclibgoindexdir)" "$(DESTDIR)$(toolexeclibgoiodir)" "$(DESTDIR)$(toolexeclibgologdir)" "$(DESTDIR)$(toolexeclibgomathdir)" "$(DESTDIR)$(toolexeclibgomimedir)" "$(DESTDIR)$(toolexeclibgonetdir)" "$(DESTDIR)$(toolexeclibgonethttpdir)" "$(DESTDIR)$(toolexeclibgonetrpcdir)" "$(DESTDIR)$(toolexeclibgoolddir)" "$(DESTDIR)$(toolexeclibgoosdir)" "$(DESTDIR)$(toolexeclibgopathdir)" "$(DESTDIR)$(toolexeclibgoregexpdir)" "$(DESTDIR)$(toolexeclibgoruntimedir)" "$(DESTDIR)$(toolexeclibgosyncdir)" "$(DESTDIR)$(toolexeclibgotestingdir)" "$(DESTDIR)$(toolexeclibgotextdir)" "$(DESTDIR)$(toolexeclibgotexttemplatedir)" "$(DESTDIR)$(toolexeclibgounicodedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-multi clean-recursive
-
-clean-am: clean-generic clean-libtool clean-local \
-	clean-toolexeclibLIBRARIES clean-toolexeclibLTLIBRARIES \
-	mostlyclean-am
-
-distclean: distclean-multi distclean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-hdr distclean-libtool distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am: install-multi install-toolexeclibLIBRARIES \
-	install-toolexeclibLTLIBRARIES install-toolexeclibgoDATA \
-	install-toolexeclibgoarchiveDATA \
-	install-toolexeclibgocompressDATA \
-	install-toolexeclibgocontainerDATA \
-	install-toolexeclibgocryptoDATA \
-	install-toolexeclibgocryptox509DATA \
-	install-toolexeclibgodatabaseDATA \
-	install-toolexeclibgodatabasesqlDATA \
-	install-toolexeclibgodebugDATA \
-	install-toolexeclibgoencodingDATA install-toolexeclibgoexpDATA \
-	install-toolexeclibgogoDATA install-toolexeclibgohashDATA \
-	install-toolexeclibgohtmlDATA install-toolexeclibgoimageDATA \
-	install-toolexeclibgoimagecolorDATA \
-	install-toolexeclibgoindexDATA install-toolexeclibgoioDATA \
-	install-toolexeclibgologDATA install-toolexeclibgomathDATA \
-	install-toolexeclibgomimeDATA install-toolexeclibgonetDATA \
-	install-toolexeclibgonethttpDATA \
-	install-toolexeclibgonetrpcDATA install-toolexeclibgooldDATA \
-	install-toolexeclibgoosDATA install-toolexeclibgopathDATA \
-	install-toolexeclibgoregexpDATA \
-	install-toolexeclibgoruntimeDATA install-toolexeclibgosyncDATA \
-	install-toolexeclibgotestingDATA install-toolexeclibgotextDATA \
-	install-toolexeclibgotexttemplateDATA \
-	install-toolexeclibgounicodeDATA
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-multi maintainer-clean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-multi mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool mostlyclean-local
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-toolexeclibLIBRARIES \
-	uninstall-toolexeclibLTLIBRARIES uninstall-toolexeclibgoDATA \
-	uninstall-toolexeclibgoarchiveDATA \
-	uninstall-toolexeclibgocompressDATA \
-	uninstall-toolexeclibgocontainerDATA \
-	uninstall-toolexeclibgocryptoDATA \
-	uninstall-toolexeclibgocryptox509DATA \
-	uninstall-toolexeclibgodatabaseDATA \
-	uninstall-toolexeclibgodatabasesqlDATA \
-	uninstall-toolexeclibgodebugDATA \
-	uninstall-toolexeclibgoencodingDATA \
-	uninstall-toolexeclibgoexpDATA uninstall-toolexeclibgogoDATA \
-	uninstall-toolexeclibgohashDATA \
-	uninstall-toolexeclibgohtmlDATA \
-	uninstall-toolexeclibgoimageDATA \
-	uninstall-toolexeclibgoimagecolorDATA \
-	uninstall-toolexeclibgoindexDATA uninstall-toolexeclibgoioDATA \
-	uninstall-toolexeclibgologDATA uninstall-toolexeclibgomathDATA \
-	uninstall-toolexeclibgomimeDATA uninstall-toolexeclibgonetDATA \
-	uninstall-toolexeclibgonethttpDATA \
-	uninstall-toolexeclibgonetrpcDATA \
-	uninstall-toolexeclibgooldDATA uninstall-toolexeclibgoosDATA \
-	uninstall-toolexeclibgopathDATA \
-	uninstall-toolexeclibgoregexpDATA \
-	uninstall-toolexeclibgoruntimeDATA \
-	uninstall-toolexeclibgosyncDATA \
-	uninstall-toolexeclibgotestingDATA \
-	uninstall-toolexeclibgotextDATA \
-	uninstall-toolexeclibgotexttemplateDATA \
-	uninstall-toolexeclibgounicodeDATA
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all all-multi \
-	clean-multi ctags-recursive distclean-multi install-am \
-	install-multi install-strip maintainer-clean-multi \
-	mostlyclean-multi tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am all-multi am--refresh check check-am clean \
-	clean-generic clean-libtool clean-local clean-multi \
-	clean-toolexeclibLIBRARIES clean-toolexeclibLTLIBRARIES ctags \
-	ctags-recursive distclean distclean-compile distclean-generic \
-	distclean-hdr distclean-libtool distclean-multi distclean-tags \
-	dvi dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-multi \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip install-toolexeclibLIBRARIES \
-	install-toolexeclibLTLIBRARIES install-toolexeclibgoDATA \
-	install-toolexeclibgoarchiveDATA \
-	install-toolexeclibgocompressDATA \
-	install-toolexeclibgocontainerDATA \
-	install-toolexeclibgocryptoDATA \
-	install-toolexeclibgocryptox509DATA \
-	install-toolexeclibgodatabaseDATA \
-	install-toolexeclibgodatabasesqlDATA \
-	install-toolexeclibgodebugDATA \
-	install-toolexeclibgoencodingDATA install-toolexeclibgoexpDATA \
-	install-toolexeclibgogoDATA install-toolexeclibgohashDATA \
-	install-toolexeclibgohtmlDATA install-toolexeclibgoimageDATA \
-	install-toolexeclibgoimagecolorDATA \
-	install-toolexeclibgoindexDATA install-toolexeclibgoioDATA \
-	install-toolexeclibgologDATA install-toolexeclibgomathDATA \
-	install-toolexeclibgomimeDATA install-toolexeclibgonetDATA \
-	install-toolexeclibgonethttpDATA \
-	install-toolexeclibgonetrpcDATA install-toolexeclibgooldDATA \
-	install-toolexeclibgoosDATA install-toolexeclibgopathDATA \
-	install-toolexeclibgoregexpDATA \
-	install-toolexeclibgoruntimeDATA install-toolexeclibgosyncDATA \
-	install-toolexeclibgotestingDATA install-toolexeclibgotextDATA \
-	install-toolexeclibgotexttemplateDATA \
-	install-toolexeclibgounicodeDATA installcheck installcheck-am \
-	installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic maintainer-clean-multi mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	mostlyclean-local mostlyclean-multi pdf pdf-am ps ps-am tags \
-	tags-recursive uninstall uninstall-am \
-	uninstall-toolexeclibLIBRARIES \
-	uninstall-toolexeclibLTLIBRARIES uninstall-toolexeclibgoDATA \
-	uninstall-toolexeclibgoarchiveDATA \
-	uninstall-toolexeclibgocompressDATA \
-	uninstall-toolexeclibgocontainerDATA \
-	uninstall-toolexeclibgocryptoDATA \
-	uninstall-toolexeclibgocryptox509DATA \
-	uninstall-toolexeclibgodatabaseDATA \
-	uninstall-toolexeclibgodatabasesqlDATA \
-	uninstall-toolexeclibgodebugDATA \
-	uninstall-toolexeclibgoencodingDATA \
-	uninstall-toolexeclibgoexpDATA uninstall-toolexeclibgogoDATA \
-	uninstall-toolexeclibgohashDATA \
-	uninstall-toolexeclibgohtmlDATA \
-	uninstall-toolexeclibgoimageDATA \
-	uninstall-toolexeclibgoimagecolorDATA \
-	uninstall-toolexeclibgoindexDATA uninstall-toolexeclibgoioDATA \
-	uninstall-toolexeclibgologDATA uninstall-toolexeclibgomathDATA \
-	uninstall-toolexeclibgomimeDATA uninstall-toolexeclibgonetDATA \
-	uninstall-toolexeclibgonethttpDATA \
-	uninstall-toolexeclibgonetrpcDATA \
-	uninstall-toolexeclibgooldDATA uninstall-toolexeclibgoosDATA \
-	uninstall-toolexeclibgopathDATA \
-	uninstall-toolexeclibgoregexpDATA \
-	uninstall-toolexeclibgoruntimeDATA \
-	uninstall-toolexeclibgosyncDATA \
-	uninstall-toolexeclibgotestingDATA \
-	uninstall-toolexeclibgotextDATA \
-	uninstall-toolexeclibgotexttemplateDATA \
-	uninstall-toolexeclibgounicodeDATA
-
-
-goc2c.$(OBJEXT): runtime/goc2c.c
-	$(CC_FOR_BUILD) -c $(CFLAGS_FOR_BUILD) $<
-
-goc2c: goc2c.$(OBJEXT)
-	$(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) $(LDFLAGS_FOR_BUILD) -o $@ $<
-
-malloc.c: $(srcdir)/runtime/malloc.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-mprof.c: $(srcdir)/runtime/mprof.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-netpoll.c: $(srcdir)/runtime/netpoll.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-reflect.c: $(srcdir)/runtime/reflect.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-runtime1.c: $(srcdir)/runtime/runtime1.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-sema.c: $(srcdir)/runtime/sema.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-sigqueue.c: $(srcdir)/runtime/sigqueue.goc goc2c
-	./goc2c --go-pkgpath os_signal $< > $@.tmp
-	mv -f $@.tmp $@
-
-time.c: $(srcdir)/runtime/time.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-%.c: $(srcdir)/runtime/%.goc goc2c
-	./goc2c $< > $@.tmp
-	mv -f $@.tmp $@
-
-version.go: s-version; @true
-s-version: Makefile
-	rm -f version.go.tmp
-	echo "package runtime" > version.go.tmp
-	echo 'const defaultGoroot = "$(prefix)"' >> version.go.tmp
-	echo 'const theVersion = "'`cat $(srcdir)/VERSION | sed 1q`' '`$(GOC) --version | sed 1q`'"' >> version.go.tmp
-	echo 'const theGoarch = "'$(GOARCH)'"' >> version.go.tmp
-	echo 'const theGoos = "'$(GOOS)'"' >> version.go.tmp
-	echo 'const theGccgoToolDir = "$(libexecsubdir)"' >> version.go.tmp
-	$(SHELL) $(srcdir)/mvifdiff.sh version.go.tmp version.go
-	$(STAMP) $@
-
-# Generate the list of go std packages that were included in libgo
-zstdpkglist.go: s-zstdpkglist; @true
-s-zstdpkglist: Makefile
-	rm -f zstdpkglist.go.tmp
-	echo 'package main' > zstdpkglist.go.tmp
-	echo "" >> zstdpkglist.go.tmp
-	echo 'var stdpkg = map[string]bool{' >> zstdpkglist.go.tmp
-	echo $(libgo_go_objs) 'unsafe.lo' 'runtime/cgo.lo' | sed 's/\.lo /\": true,\n/g' | sed 's/\.lo/\": true,/' | sed 's/-go//' | grep -v _c | sed 's/^/\t\"/' | sort | uniq >> zstdpkglist.go.tmp
-	echo '}' >> zstdpkglist.go.tmp
-	$(SHELL) $(srcdir)/mvifdiff.sh zstdpkglist.go.tmp zstdpkglist.go
-	$(STAMP) $@
-
-libcalls.go: s-libcalls; @true
-s-libcalls: libcalls-list go/syscall/mksyscall.awk $(go_base_syscall_files)
-	rm -f libcalls.go.tmp
-	files=`echo $^ | sed -e 's/libcalls-list//' -e 's|[^ ]*go/syscall/mksyscall.awk||'`; \
-	$(AWK) -f $(srcdir)/go/syscall/mksyscall.awk $${files} > libcalls.go.tmp
-	$(SHELL) $(srcdir)/mvifdiff.sh libcalls.go.tmp libcalls.go
-	$(STAMP) $@
-
-libcalls-list: s-libcalls-list; @true
-s-libcalls-list: Makefile
-	rm -f libcalls-list.tmp
-	echo $(go_base_syscall_files) > libcalls-list.tmp
-	$(SHELL) $(srcdir)/mvifdiff.sh libcalls-list.tmp libcalls-list
-	$(STAMP) $@
-
-syscall_arch.go: s-syscall_arch; @true
-s-syscall_arch: Makefile
-	rm -f syscall_arch.go.tmp
-	echo "package syscall" > syscall_arch.go.tmp
-	echo 'const ARCH = "'$(GOARCH)'"' >> syscall_arch.go.tmp
-	echo 'const OS = "'$(GOOS)'"' >> syscall_arch.go.tmp
-	$(SHELL) $(srcdir)/mvifdiff.sh syscall_arch.go.tmp syscall_arch.go
-	$(STAMP) $@
-
-sysinfo.go: s-sysinfo; @true
-s-sysinfo: $(srcdir)/mksysinfo.sh config.h
-	CC="$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(OSCFLAGS) -O" $(SHELL) $(srcdir)/mksysinfo.sh
-	$(SHELL) $(srcdir)/mvifdiff.sh tmp-sysinfo.go sysinfo.go
-	$(STAMP) $@
-
-# The epoll struct has an embedded union and is packed on x86_64,
-# which is too complicated for mksysinfo.sh.  We find the offset of
-# the only field we care about in configure.ac, and generate the
-# struct here.
-epoll.go: s-epoll; @true
-s-epoll: Makefile
-	rm -f epoll.go.tmp
-	echo 'package syscall' > epoll.go.tmp
-	echo 'type EpollEvent struct {' >> epoll.go.tmp
-	echo '	Events uint32' >> epoll.go.tmp
-	case "$(SIZEOF_STRUCT_EPOLL_EVENT),$(STRUCT_EPOLL_EVENT_FD_OFFSET)" in \
-	0,0) echo 1>&2 "*** struct epoll_event data.fd offset unknown"; \
-	   exit 1; ;; \
-	8,4) echo '	Fd int32' >> epoll.go.tmp; ;; \
-	12,4) echo '	Fd int32' >> epoll.go.tmp; \
-	   echo '	Pad [4]byte' >> epoll.go.tmp; ;; \
-	12,8) echo '	Pad [4]byte' >> epoll.go.tmp; \
-	   echo '	Fd int32' >> epoll.go.tmp; ;; \
-	16,8) echo '	Pad [4]byte' >> epoll.go.tmp; \
-	   echo '	Fd int32' >> epoll.go.tmp; \
-	   echo '	Pad2 [4]byte' >> epoll.go.tmp; ;; \
-	*) echo 1>&2 "*** struct epoll_event unsupported"; \
-	   exit 1; ;; \
-	esac
-	echo '}' >> epoll.go.tmp
-	$(SHELL) $(srcdir)/mvifdiff.sh epoll.go.tmp epoll.go
-	$(STAMP) $@
-
-@go_include@ bufio.lo.dep
-bufio.lo.dep: $(go_bufio_files)
-	$(BUILDDEPS)
-bufio.lo: $(go_bufio_files)
-	$(BUILDPACKAGE)
-bufio/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: bufio/check
-
-@go_include@ bytes.lo.dep
-bytes.lo.dep: $(go_bytes_files)
-	$(BUILDDEPS)
-bytes.lo: $(go_bytes_files)
-	$(BUILDPACKAGE)
-bytes/index.lo: $(go_bytes_c_files)
-	@$(MKDIR_P) bytes
-	$(LTCOMPILE) -c -o bytes/index.lo $(srcdir)/go/bytes/indexbyte.c
-bytes/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: bytes/check
-
-@go_include@ crypto.lo.dep
-crypto.lo.dep: $(go_crypto_files)
-	$(BUILDDEPS)
-crypto.lo: $(go_crypto_files)
-	$(BUILDPACKAGE)
-crypto/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/check
-
-@go_include@ encoding.lo.dep
-encoding.lo.dep: $(go_encoding_files)
-	$(BUILDDEPS)
-encoding.lo: $(go_encoding_files)
-	$(BUILDPACKAGE)
-encoding/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/check
-
-@go_include@ errors.lo.dep
-errors.lo.dep: $(go_errors_files)
-	$(BUILDDEPS)
-errors.lo: $(go_errors_files)
-	$(BUILDPACKAGE)
-errors/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: errors/check
-
-@go_include@ expvar.lo.dep
-expvar.lo.dep: $(go_expvar_files)
-	$(BUILDDEPS)
-expvar.lo: $(go_expvar_files)
-	$(BUILDPACKAGE)
-expvar/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: expvar/check
-
-@go_include@ flag.lo.dep
-flag.lo.dep: $(go_flag_files)
-	$(BUILDDEPS)
-flag.lo: $(go_flag_files)
-	$(BUILDPACKAGE)
-flag/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: flag/check
-
-@go_include@ fmt.lo.dep
-fmt.lo.dep: $(go_fmt_files)
-	$(BUILDDEPS)
-fmt.lo: $(go_fmt_files)
-	$(BUILDPACKAGE)
-fmt/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: fmt/check
-
-@go_include@ hash.lo.dep
-hash.lo.dep: $(go_hash_files)
-	$(BUILDDEPS)
-hash.lo: $(go_hash_files)
-	$(BUILDPACKAGE)
-hash/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: hash/check
-
-@go_include@ html.lo.dep
-html.lo.dep: $(go_html_files)
-	$(BUILDDEPS)
-html.lo: $(go_html_files)
-	$(BUILDPACKAGE)
-html/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: html/check
-
-@go_include@ image.lo.dep
-image.lo.dep: $(go_image_files)
-	$(BUILDDEPS)
-image.lo: $(go_image_files)
-	$(BUILDPACKAGE)
-image/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/check
-
-@go_include@ io.lo.dep
-io.lo.dep: $(go_io_files)
-	$(BUILDDEPS)
-io.lo: $(go_io_files)
-	$(BUILDPACKAGE)
-io/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: io/check
-
-@go_include@ log.lo.dep
-log.lo.dep: $(go_log_files)
-	$(BUILDDEPS)
-log.lo: $(go_log_files)
-	$(BUILDPACKAGE)
-log/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: log/check
-
-@go_include@ math.lo.dep
-math.lo.dep: $(go_math_files)
-	$(BUILDDEPS)
-math.lo: $(go_math_files)
-	$(MKDIR_P) $(@D)
-	files=`echo $^ | sed -e 's/[^ ]*\.gox//g'`; \
-	$(LTGOCOMPILE) $(MATH_FLAG) -I . -c -fgo-pkgpath=math -o $@ $$files
-math/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: math/check
-
-@go_include@ mime.lo.dep
-mime.lo.dep: $(go_mime_files)
-	$(BUILDDEPS)
-mime.lo: $(go_mime_files)
-	$(BUILDPACKAGE)
-mime/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: mime/check
-
-@go_include@ net.lo.dep
-net.lo.dep: $(go_net_files)
-	$(BUILDDEPS)
-net.lo: $(go_net_files)
-	$(BUILDPACKAGE)
-net/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/check
-
-@go_include@ netgo.o.dep
-netgo.o.dep: $(go_netgo_files)
-	$(BUILDDEPS)
-netgo.o: $(go_netgo_files)
-	$(BUILDNETGO)
-
-@go_include@ os.lo.dep
-os.lo.dep: $(go_os_files)
-	$(BUILDDEPS)
-os.lo: $(go_os_files)
-	$(BUILDPACKAGE)
-os/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: os/check
-
-@go_include@ path.lo.dep
-path.lo.dep: $(go_path_files)
-	$(BUILDDEPS)
-path.lo: $(go_path_files)
-	$(BUILDPACKAGE)
-path/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: path/check
-
-@go_include@ reflect-go.lo.dep
-reflect-go.lo.dep: $(go_reflect_files)
-	$(BUILDDEPS)
-reflect-go.lo: $(go_reflect_files)
-	$(BUILDPACKAGE)
-reflect/check: $(CHECK_DEPS)
-	@$(CHECK)
-reflect/makefunc_ffi_c.lo: $(go_reflect_makefunc_c_file)
-	@$(MKDIR_P) reflect
-	$(LTCOMPILE) -c -o $@ $<
-.PHONY: reflect/check
-
-@go_include@ regexp.lo.dep
-regexp.lo.dep: $(go_regexp_files)
-	$(BUILDDEPS)
-regexp.lo: $(go_regexp_files)
-	$(BUILDPACKAGE)
-regexp/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: regexp/check
-
-@go_include@ runtime-go.lo.dep
-runtime-go.lo.dep: $(go_runtime_files)
-	$(BUILDDEPS)
-runtime-go.lo: $(go_runtime_files)
-	$(BUILDPACKAGE)
-runtime/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: runtime/check
-
-@go_include@ sort.lo.dep
-sort.lo.dep: $(go_sort_files)
-	$(BUILDDEPS)
-sort.lo: $(go_sort_files)
-	$(BUILDPACKAGE)
-sort/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: sort/check
-
-@go_include@ strconv.lo.dep
-strconv.lo.dep: $(go_strconv_files)
-	$(BUILDDEPS)
-strconv.lo: $(go_strconv_files)
-	$(BUILDPACKAGE)
-strconv/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: strconv/check
-
-@go_include@ strings.lo.dep
-strings.lo.dep: $(go_strings_files)
-	$(BUILDDEPS)
-strings.lo: $(go_strings_files)
-	$(BUILDPACKAGE)
-strings/index.lo: $(go_strings_c_files)
-	@$(MKDIR_P) strings
-	$(LTCOMPILE) -c -o strings/index.lo $(srcdir)/go/strings/indexbyte.c
-strings/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: strings/check
-
-@go_include@ sync.lo.dep
-sync.lo.dep: $(go_sync_files)
-	$(BUILDDEPS)
-sync.lo: $(go_sync_files)
-	$(BUILDPACKAGE)
-sync/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: sync/check
-
-@go_include@ testing.lo.dep
-testing.lo.dep: $(go_testing_files)
-	$(BUILDDEPS)
-testing.lo: $(go_testing_files)
-	$(BUILDPACKAGE)
-testing/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: testing/check
-
-@go_include@ time-go.lo.dep
-time-go.lo.dep: $(go_time_files)
-	$(BUILDDEPS)
-time-go.lo: $(go_time_files)
-	$(BUILDPACKAGE)
-time/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: time/check
-
-@go_include@ unicode.lo.dep
-unicode.lo.dep: $(go_unicode_files)
-	$(BUILDDEPS)
-unicode.lo: $(go_unicode_files)
-	$(BUILDPACKAGE)
-unicode/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: unicode/check
-
-@go_include@ archive/tar.lo.dep
-archive/tar.lo.dep: $(go_archive_tar_files)
-	$(BUILDDEPS)
-archive/tar.lo: $(go_archive_tar_files)
-	$(BUILDPACKAGE)
-archive/tar/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: archive/tar/check
-
-@go_include@ archive/zip.lo.dep
-archive/zip.lo.dep: $(go_archive_zip_files)
-	$(BUILDDEPS)
-archive/zip.lo: $(go_archive_zip_files)
-	$(BUILDPACKAGE)
-archive/zip/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: archive/zip/check
-
-@go_include@ compress/bzip2.lo.dep
-compress/bzip2.lo.dep: $(go_compress_bzip2_files)
-	$(BUILDDEPS)
-compress/bzip2.lo: $(go_compress_bzip2_files)
-	$(BUILDPACKAGE)
-compress/bzip2/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: compress/bzip2/check
-
-@go_include@ compress/flate.lo.dep
-compress/flate.lo.dep: $(go_compress_flate_files)
-	$(BUILDDEPS)
-compress/flate.lo: $(go_compress_flate_files)
-	$(BUILDPACKAGE)
-compress/flate/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: compress/flate/check
-
-@go_include@ compress/gzip.lo.dep
-compress/gzip.lo.dep: $(go_compress_gzip_files)
-	$(BUILDDEPS)
-compress/gzip.lo: $(go_compress_gzip_files)
-	$(BUILDPACKAGE)
-compress/gzip/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: compress/gzip/check
-
-@go_include@ compress/lzw.lo.dep
-compress/lzw.lo.dep: $(go_compress_lzw_files)
-	$(BUILDDEPS)
-compress/lzw.lo: $(go_compress_lzw_files)
-	$(BUILDPACKAGE)
-compress/lzw/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: compress/lzw/check
-
-@go_include@ compress/zlib.lo.dep
-compress/zlib.lo.dep: $(go_compress_zlib_files)
-	$(BUILDDEPS)
-compress/zlib.lo: $(go_compress_zlib_files)
-	$(BUILDPACKAGE)
-compress/zlib/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: compress/zlib/check
-
-@go_include@ container/heap.lo.dep
-container/heap.lo.dep: $(go_container_heap_files)
-	$(BUILDDEPS)
-container/heap.lo: $(go_container_heap_files)
-	$(BUILDPACKAGE)
-container/heap/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: container/heap/check
-
-@go_include@ container/list.lo.dep
-container/list.lo.dep: $(go_container_list_files)
-	$(BUILDDEPS)
-container/list.lo: $(go_container_list_files)
-	$(BUILDPACKAGE)
-container/list/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: container/list/check
-
-@go_include@ container/ring.lo.dep
-container/ring.lo.dep: $(go_container_ring_files)
-	$(BUILDDEPS)
-container/ring.lo: $(go_container_ring_files)
-	$(BUILDPACKAGE)
-container/ring/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: container/ring/check
-
-@go_include@ crypto/aes.lo.dep
-crypto/aes.lo.dep: $(go_crypto_aes_files)
-	$(BUILDDEPS)
-crypto/aes.lo: $(go_crypto_aes_files)
-	$(BUILDPACKAGE)
-crypto/aes/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/aes/check
-
-@go_include@ crypto/cipher.lo.dep
-crypto/cipher.lo.dep: $(go_crypto_cipher_files)
-	$(BUILDDEPS)
-crypto/cipher.lo: $(go_crypto_cipher_files)
-	$(BUILDPACKAGE)
-crypto/cipher/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/cipher/check
-
-@go_include@ crypto/des.lo.dep
-crypto/des.lo.dep: $(go_crypto_des_files)
-	$(BUILDDEPS)
-crypto/des.lo: $(go_crypto_des_files)
-	$(BUILDPACKAGE)
-crypto/des/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/des/check
-
-@go_include@ crypto/dsa.lo.dep
-crypto/dsa.lo.dep: $(go_crypto_dsa_files)
-	$(BUILDDEPS)
-crypto/dsa.lo: $(go_crypto_dsa_files)
-	$(BUILDPACKAGE)
-crypto/dsa/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/dsa/check
-
-@go_include@ crypto/ecdsa.lo.dep
-crypto/ecdsa.lo.dep: $(go_crypto_ecdsa_files)
-	$(BUILDDEPS)
-crypto/ecdsa.lo: $(go_crypto_ecdsa_files)
-	$(BUILDPACKAGE)
-crypto/ecdsa/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/ecdsa/check
-
-@go_include@ crypto/elliptic.lo.dep
-crypto/elliptic.lo.dep: $(go_crypto_elliptic_files)
-	$(BUILDDEPS)
-crypto/elliptic.lo: $(go_crypto_elliptic_files)
-	$(BUILDPACKAGE)
-crypto/elliptic/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/elliptic/check
-
-@go_include@ crypto/hmac.lo.dep
-crypto/hmac.lo.dep: $(go_crypto_hmac_files)
-	$(BUILDDEPS)
-crypto/hmac.lo: $(go_crypto_hmac_files)
-	$(BUILDPACKAGE)
-crypto/hmac/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/hmac/check
-
-@go_include@ crypto/md5.lo.dep
-crypto/md5.lo.dep: $(go_crypto_md5_files)
-	$(BUILDDEPS)
-crypto/md5.lo: $(go_crypto_md5_files)
-	$(BUILDPACKAGE)
-crypto/md5/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/md5/check
-
-@go_include@ crypto/rand.lo.dep
-crypto/rand.lo.dep: $(go_crypto_rand_files)
-	$(BUILDDEPS)
-crypto/rand.lo: $(go_crypto_rand_files)
-	$(BUILDPACKAGE)
-crypto/rand/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/rand/check
-
-@go_include@ crypto/rc4.lo.dep
-crypto/rc4.lo.dep: $(go_crypto_rc4_files)
-	$(BUILDDEPS)
-crypto/rc4.lo: $(go_crypto_rc4_files)
-	$(BUILDPACKAGE)
-crypto/rc4/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/rc4/check
-
-@go_include@ crypto/rsa.lo.dep
-crypto/rsa.lo.dep: $(go_crypto_rsa_files)
-	$(BUILDDEPS)
-crypto/rsa.lo: $(go_crypto_rsa_files)
-	$(BUILDPACKAGE)
-crypto/rsa/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/rsa/check
-
-@go_include@ crypto/sha1.lo.dep
-crypto/sha1.lo.dep: $(go_crypto_sha1_files)
-	$(BUILDDEPS)
-crypto/sha1.lo: $(go_crypto_sha1_files)
-	$(BUILDPACKAGE)
-crypto/sha1/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/sha1/check
-
-@go_include@ crypto/sha256.lo.dep
-crypto/sha256.lo.dep: $(go_crypto_sha256_files)
-	$(BUILDDEPS)
-crypto/sha256.lo: $(go_crypto_sha256_files)
-	$(BUILDPACKAGE)
-crypto/sha256/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/sha256/check
-
-@go_include@ crypto/sha512.lo.dep
-crypto/sha512.lo.dep: $(go_crypto_sha512_files)
-	$(BUILDDEPS)
-crypto/sha512.lo: $(go_crypto_sha512_files)
-	$(BUILDPACKAGE)
-crypto/sha512/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/sha512/check
-
-@go_include@ crypto/subtle.lo.dep
-crypto/subtle.lo.dep: $(go_crypto_subtle_files)
-	$(BUILDDEPS)
-crypto/subtle.lo: $(go_crypto_subtle_files)
-	$(BUILDPACKAGE)
-crypto/subtle/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/subtle/check
-
-@go_include@ crypto/tls.lo.dep
-crypto/tls.lo.dep: $(go_crypto_tls_files)
-	$(BUILDDEPS)
-crypto/tls.lo: $(go_crypto_tls_files)
-	$(BUILDPACKAGE)
-crypto/tls/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/tls/check
-
-@go_include@ crypto/x509.lo.dep
-crypto/x509.lo.dep: $(go_crypto_x509_files)
-	$(BUILDDEPS)
-crypto/x509.lo: $(go_crypto_x509_files)
-	$(BUILDPACKAGE)
-crypto/x509/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/x509/check
-
-@go_include@ crypto/x509/pkix.lo.dep
-crypto/x509/pkix.lo.dep: $(go_crypto_x509_pkix_files)
-	$(BUILDDEPS)
-crypto/x509/pkix.lo: $(go_crypto_x509_pkix_files)
-	$(BUILDPACKAGE)
-crypto/x509/pkix/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: crypto/x509/pkix/check
-
-@go_include@ database/sql.lo.dep
-database/sql.lo.dep: $(go_database_sql_files)
-	$(BUILDDEPS)
-database/sql.lo: $(go_database_sql_files)
-	$(BUILDPACKAGE)
-database/sql/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: database/sql/check
-
-@go_include@ database/sql/driver.lo.dep
-database/sql/driver.lo.dep: $(go_database_sql_driver_files)
-	$(BUILDDEPS)
-database/sql/driver.lo: $(go_database_sql_driver_files)
-	$(BUILDPACKAGE)
-database/sql/driver/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: database/sql/driver/check
-
-@go_include@ debug/dwarf.lo.dep
-debug/dwarf.lo.dep: $(go_debug_dwarf_files)
-	$(BUILDDEPS)
-debug/dwarf.lo: $(go_debug_dwarf_files)
-	$(BUILDPACKAGE)
-debug/dwarf/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: debug/dwarf/check
-
-@go_include@ debug/elf.lo.dep
-debug/elf.lo.dep: $(go_debug_elf_files)
-	$(BUILDDEPS)
-debug/elf.lo: $(go_debug_elf_files)
-	$(BUILDPACKAGE)
-debug/elf/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: debug/elf/check
-
-@go_include@ debug/gosym.lo.dep
-debug/gosym.lo.dep: $(go_debug_gosym_files)
-	$(BUILDDEPS)
-debug/gosym.lo: $(go_debug_gosym_files)
-	$(BUILDPACKAGE)
-debug/gosym/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: debug/gosym/check
-
-@go_include@ debug/macho.lo.dep
-debug/macho.lo.dep: $(go_debug_macho_files)
-	$(BUILDDEPS)
-debug/macho.lo: $(go_debug_macho_files)
-	$(BUILDPACKAGE)
-debug/macho/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: debug/macho/check
-
-@go_include@ debug/pe.lo.dep
-debug/pe.lo.dep: $(go_debug_pe_files)
-	$(BUILDDEPS)
-debug/pe.lo: $(go_debug_pe_files)
-	$(BUILDPACKAGE)
-debug/pe/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: debug/pe/check
-
-@go_include@ debug/plan9obj.lo.dep
-debug/plan9obj.lo.dep: $(go_debug_plan9obj_files)
-	$(BUILDDEPS)
-debug/plan9obj.lo: $(go_debug_plan9obj_files)
-	$(BUILDPACKAGE)
-debug/plan9obj/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: debug/plan9obj/check
-
-@go_include@ encoding/asn1.lo.dep
-encoding/asn1.lo.dep: $(go_encoding_asn1_files)
-	$(BUILDDEPS)
-encoding/asn1.lo: $(go_encoding_asn1_files)
-	$(BUILDPACKAGE)
-encoding/asn1/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/asn1/check
-
-@go_include@ encoding/ascii85.lo.dep
-encoding/ascii85.lo.dep: $(go_encoding_ascii85_files)
-	$(BUILDDEPS)
-encoding/ascii85.lo: $(go_encoding_ascii85_files)
-	$(BUILDPACKAGE)
-encoding/ascii85/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/ascii85/check
-
-@go_include@ encoding/base32.lo.dep
-encoding/base32.lo.dep: $(go_encoding_base32_files)
-	$(BUILDDEPS)
-encoding/base32.lo: $(go_encoding_base32_files)
-	$(BUILDPACKAGE)
-encoding/base32/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/base32/check
-
-@go_include@ encoding/base64.lo.dep
-encoding/base64.lo.dep: $(go_encoding_base64_files)
-	$(BUILDDEPS)
-encoding/base64.lo: $(go_encoding_base64_files)
-	$(BUILDPACKAGE)
-encoding/base64/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/base64/check
-
-@go_include@ encoding/binary.lo.dep
-encoding/binary.lo.dep: $(go_encoding_binary_files)
-	$(BUILDDEPS)
-encoding/binary.lo: $(go_encoding_binary_files)
-	$(BUILDPACKAGE)
-encoding/binary/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/binary/check
-
-@go_include@ encoding/csv.lo.dep
-encoding/csv.lo.dep: $(go_encoding_csv_files)
-	$(BUILDDEPS)
-encoding/csv.lo: $(go_encoding_csv_files)
-	$(BUILDPACKAGE)
-encoding/csv/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/csv/check
-
-@go_include@ encoding/gob.lo.dep
-encoding/gob.lo.dep: $(go_encoding_gob_files)
-	$(BUILDDEPS)
-encoding/gob.lo: $(go_encoding_gob_files)
-	$(BUILDPACKAGE)
-encoding/gob/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/gob/check
-
-@go_include@ encoding/hex.lo.dep
-encoding/hex.lo.dep: $(go_encoding_hex_files)
-	$(BUILDDEPS)
-encoding/hex.lo: $(go_encoding_hex_files)
-	$(BUILDPACKAGE)
-encoding/hex/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/hex/check
-
-@go_include@ encoding/json.lo.dep
-encoding/json.lo.dep: $(go_encoding_json_files)
-	$(BUILDDEPS)
-encoding/json.lo: $(go_encoding_json_files)
-	$(BUILDPACKAGE)
-encoding/json/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/json/check
-
-@go_include@ encoding/pem.lo.dep
-encoding/pem.lo.dep: $(go_encoding_pem_files)
-	$(BUILDDEPS)
-encoding/pem.lo: $(go_encoding_pem_files)
-	$(BUILDPACKAGE)
-encoding/pem/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/pem/check
-
-@go_include@ encoding/xml.lo.dep
-encoding/xml.lo.dep: $(go_encoding_xml_files)
-	$(BUILDDEPS)
-encoding/xml.lo: $(go_encoding_xml_files)
-	$(BUILDPACKAGE)
-encoding/xml/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: encoding/xml/check
-
-@go_include@ exp/proxy.lo.dep
-exp/proxy.lo.dep: $(go_exp_proxy_files)
-	$(BUILDDEPS)
-exp/proxy.lo: $(go_exp_proxy_files)
-	$(BUILDPACKAGE)
-exp/proxy/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: exp/proxy/check
-
-@go_include@ exp/terminal.lo.dep
-exp/terminal.lo.dep: $(go_exp_terminal_files)
-	$(BUILDDEPS)
-exp/terminal.lo: $(go_exp_terminal_files)
-	$(BUILDPACKAGE)
-exp/terminal/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: exp/terminal/check
-
-@go_include@ html/template.lo.dep
-html/template.lo.dep: $(go_html_template_files)
-	$(BUILDDEPS)
-html/template.lo: $(go_html_template_files)
-	$(BUILDPACKAGE)
-html/template/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: html/template/check
-
-@go_include@ go/ast.lo.dep
-go/ast.lo.dep: $(go_go_ast_files)
-	$(BUILDDEPS)
-go/ast.lo: $(go_go_ast_files)
-	$(BUILDPACKAGE)
-go/ast/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/ast/check
-
-@go_include@ go/build.lo.dep
-go/build.lo.dep: $(go_go_build_files)
-	$(BUILDDEPS)
-go/build.lo: $(go_go_build_files)
-	$(BUILDPACKAGE)
-go/build/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/build/check
-
-@go_include@ go/constant.lo.dep
-go/constant.lo.dep: $(go_go_constant_files)
-	$(BUILDDEPS)
-go/constant.lo: $(go_go_constant_files)
-	$(BUILDPACKAGE)
-go/constant/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/constant/check
-
-@go_include@ go/doc.lo.dep
-go/doc.lo.dep: $(go_go_doc_files)
-	$(BUILDDEPS)
-go/doc.lo: $(go_go_doc_files)
-	$(BUILDPACKAGE)
-go/doc/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/doc/check
-
-@go_include@ go/format.lo.dep
-go/format.lo.dep: $(go_go_format_files)
-	$(BUILDDEPS)
-go/format.lo: $(go_go_format_files)
-	$(BUILDPACKAGE)
-go/format/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/format/check
-
-@go_include@ go/importer.lo.dep
-go/importer.lo.dep: $(go_go_importer_files)
-	$(BUILDDEPS)
-go/importer.lo: $(go_go_importer_files)
-	$(BUILDPACKAGE)
-go/importer/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/importer/check
-
-@go_include@ go/parser.lo.dep
-go/parser.lo.dep: $(go_go_parser_files)
-	$(BUILDDEPS)
-go/parser.lo: $(go_go_parser_files)
-	$(BUILDPACKAGE)
-go/parser/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/parser/check
-
-@go_include@ go/printer.lo.dep
-go/printer.lo.dep: $(go_go_printer_files)
-	$(BUILDDEPS)
-go/printer.lo: $(go_go_printer_files)
-	$(BUILDPACKAGE)
-go/printer/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/printer/check
-
-@go_include@ go/scanner.lo.dep
-go/scanner.lo.dep: $(go_go_scanner_files)
-	$(BUILDDEPS)
-go/scanner.lo: $(go_go_scanner_files)
-	$(BUILDPACKAGE)
-go/scanner/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/scanner/check
-
-@go_include@ go/token.lo.dep
-go/token.lo.dep: $(go_go_token_files)
-	$(BUILDDEPS)
-go/token.lo: $(go_go_token_files)
-	$(BUILDPACKAGE)
-go/token/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/token/check
-
-@go_include@ go/types.lo.dep
-go/types.lo.dep: $(go_go_types_files)
-	$(BUILDDEPS)
-go/types.lo: $(go_go_types_files)
-	$(BUILDPACKAGE)
-go/types/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/types/check
-
-@go_include@ go/internal/gcimporter.lo.dep
-go/internal/gcimporter.lo.dep: $(go_go_internal_gcimporter_files)
-	$(BUILDDEPS)
-go/internal/gcimporter.lo: $(go_go_internal_gcimporter_files)
-	$(BUILDPACKAGE)
-go/internal/gcimporter/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/internal/gcimporter/check
-
-@go_include@ go/internal/gccgoimporter.lo.dep
-go/internal/gccgoimporter.lo.dep: $(go_go_internal_gccgoimporter_files)
-	$(BUILDDEPS)
-go/internal/gccgoimporter.lo: $(go_go_internal_gccgoimporter_files)
-	$(BUILDPACKAGE)
-go/internal/gccgoimporter/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: go/internal/gccgoimporter/check
-
-@go_include@ hash/adler32.lo.dep
-hash/adler32.lo.dep: $(go_hash_adler32_files)
-	$(BUILDDEPS)
-hash/adler32.lo: $(go_hash_adler32_files)
-	$(BUILDPACKAGE)
-hash/adler32/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: hash/adler32/check
-
-@go_include@ hash/crc32.lo.dep
-hash/crc32.lo.dep: $(go_hash_crc32_files)
-	$(BUILDDEPS)
-hash/crc32.lo: $(go_hash_crc32_files)
-	$(BUILDPACKAGE)
-hash/crc32/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: hash/crc32/check
-
-@go_include@ hash/crc64.lo.dep
-hash/crc64.lo.dep: $(go_hash_crc64_files)
-	$(BUILDDEPS)
-hash/crc64.lo: $(go_hash_crc64_files)
-	$(BUILDPACKAGE)
-hash/crc64/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: hash/crc64/check
-
-@go_include@ hash/fnv.lo.dep
-hash/fnv.lo.dep: $(go_hash_fnv_files)
-	$(BUILDDEPS)
-hash/fnv.lo: $(go_hash_fnv_files)
-	$(BUILDPACKAGE)
-hash/fnv/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: hash/fnv/check
-
-@go_include@ image/color.lo.dep
-image/color.lo.dep: $(go_image_color_files)
-	$(BUILDDEPS)
-image/color.lo: $(go_image_color_files)
-	$(BUILDPACKAGE)
-image/color/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/color/check
-
-@go_include@ image/color/palette.lo.dep
-image/color/palette.lo.dep: $(go_image_color_palette_files)
-	$(BUILDDEPS)
-image/color/palette.lo: $(go_image_color_palette_files)
-	$(BUILDPACKAGE)
-image/color/palette/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/color/palette/check
-
-@go_include@ image/draw.lo.dep
-image/draw.lo.dep: $(go_image_draw_files)
-	$(BUILDDEPS)
-image/draw.lo: $(go_image_draw_files)
-	$(BUILDPACKAGE)
-image/draw/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/draw/check
-
-@go_include@ image/gif.lo.dep
-image/gif.lo.dep: $(go_image_gif_files)
-	$(BUILDDEPS)
-image/gif.lo: $(go_image_gif_files)
-	$(BUILDPACKAGE)
-image/gif/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/gif/check
-
-@go_include@ image/internal/imageutil.lo.dep
-image/internal/imageutil.lo.dep: $(go_image_internal_imageutil_files)
-	$(BUILDDEPS)
-image/internal/imageutil.lo: $(go_image_internal_imageutil_files)
-	$(BUILDPACKAGE)
-image/internal/imageutil/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/internal/imageutil/check
-
-@go_include@ image/jpeg.lo.dep
-image/jpeg.lo.dep: $(go_image_jpeg_files)
-	$(BUILDDEPS)
-image/jpeg.lo: $(go_image_jpeg_files)
-	$(BUILDPACKAGE)
-image/jpeg/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/jpeg/check
-
-@go_include@ image/png.lo.dep
-image/png.lo.dep: $(go_image_png_files)
-	$(BUILDDEPS)
-image/png.lo: $(go_image_png_files)
-	$(BUILDPACKAGE)
-image/png/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: image/png/check
-
-@go_include@ index/suffixarray.lo.dep
-index/suffixarray.lo.dep: $(go_index_suffixarray_files)
-	$(BUILDDEPS)
-index/suffixarray.lo: $(go_index_suffixarray_files)
-	$(BUILDPACKAGE)
-index/suffixarray/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: index/suffixarray/check
-
-@go_include@ internal/format.lo.dep
-internal/format.lo.dep: $(go_internal_format_files)
-	$(BUILDDEPS)
-internal/format.lo: $(go_internal_format_files)
-	$(BUILDPACKAGE)
-internal/format/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: internal/format/check
-
-@go_include@ internal/singleflight.lo.dep
-internal/singleflight.lo.dep: $(go_internal_singleflight_files)
-	$(BUILDDEPS)
-internal/singleflight.lo: $(go_internal_singleflight_files)
-	$(BUILDPACKAGE)
-internal/singleflight/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: internal/singleflight/check
-
-@go_include@ internal/syscall/unix.lo.dep
-internal/syscall/unix.lo.dep: $(go_internal_syscall_unix_files)
-	$(BUILDDEPS)
-internal/syscall/unix.lo: $(go_internal_syscall_unix_files)
-	$(BUILDPACKAGE)
-internal/syscall/unix/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: internal/syscall/unix/check
-
-@go_include@ internal/testenv.lo.dep
-internal/testenv.lo.dep: $(go_internal_testenv_files)
-	$(BUILDDEPS)
-internal/testenv.lo: $(go_internal_testenv_files)
-	$(BUILDPACKAGE)
-internal/testenv/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: internal/testenv/check
-
-@go_include@ internal/trace.lo.dep
-internal/trace.lo.dep: $(go_internal_trace_files)
-	$(BUILDDEPS)
-internal/trace.lo: $(go_internal_trace_files)
-	$(BUILDPACKAGE)
-internal/trace/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: internal/trace/check
-
-@go_include@ io/ioutil.lo.dep
-io/ioutil.lo.dep: $(go_io_ioutil_files)
-	$(BUILDDEPS)
-io/ioutil.lo: $(go_io_ioutil_files)
-	$(BUILDPACKAGE)
-io/ioutil/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: io/ioutil/check
-
-@go_include@ log/syslog.lo.dep
-log/syslog.lo.dep: $(go_log_syslog_files)
-	$(BUILDDEPS)
-log/syslog.lo: $(go_log_syslog_files)
-	$(BUILDPACKAGE)
-log/syslog/syslog_c.lo: $(go_syslog_c_files) log/syslog.lo
-	@$(MKDIR_P) log/syslog
-	$(LTCOMPILE) -c -o $@ $(srcdir)/go/log/syslog/syslog_c.c
-log/syslog/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: log/syslog/check
-
-@go_include@ math/big.lo.dep
-math/big.lo.dep: $(go_math_big_files)
-	$(BUILDDEPS)
-math/big.lo: $(go_math_big_files)
-	$(BUILDPACKAGE)
-math/big/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: math/big/check
-
-@go_include@ math/cmplx.lo.dep
-math/cmplx.lo.dep: $(go_math_cmplx_files)
-	$(BUILDDEPS)
-math/cmplx.lo: $(go_math_cmplx_files)
-	$(BUILDPACKAGE)
-math/cmplx/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: math/cmplx/check
-
-@go_include@ math/rand.lo.dep
-math/rand.lo.dep: $(go_math_rand_files)
-	$(BUILDDEPS)
-math/rand.lo: $(go_math_rand_files)
-	$(BUILDPACKAGE)
-math/rand/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: math/rand/check
-
-@go_include@ mime/multipart.lo.dep
-mime/multipart.lo.dep: $(go_mime_multipart_files)
-	$(BUILDDEPS)
-mime/multipart.lo: $(go_mime_multipart_files)
-	$(BUILDPACKAGE)
-mime/multipart/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: mime/multipart/check
-
-@go_include@ mime/quotedprintable.lo.dep
-mime/quotedprintable.lo.dep: $(go_mime_quotedprintable_files)
-	$(BUILDDEPS)
-mime/quotedprintable.lo: $(go_mime_quotedprintable_files)
-	$(BUILDPACKAGE)
-mime/quotedprintable/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: mime/quotedprintable/check
-
-@go_include@ net/http.lo.dep
-net/http.lo.dep: $(go_net_http_files)
-	$(BUILDDEPS)
-net/http.lo: $(go_net_http_files)
-	$(BUILDPACKAGE)
-net/http/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/http/check
-
-@go_include@ net/mail.lo.dep
-net/mail.lo.dep: $(go_net_mail_files)
-	$(BUILDDEPS)
-net/mail.lo: $(go_net_mail_files)
-	$(BUILDPACKAGE)
-net/mail/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/mail/check
-
-@go_include@ net/rpc.lo.dep
-net/rpc.lo.dep: $(go_net_rpc_files)
-	$(BUILDDEPS)
-net/rpc.lo: $(go_net_rpc_files)
-	$(BUILDPACKAGE)
-net/rpc/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/rpc/check
-
-@go_include@ net/smtp.lo.dep
-net/smtp.lo.dep: $(go_net_smtp_files)
-	$(BUILDDEPS)
-net/smtp.lo: $(go_net_smtp_files)
-	$(BUILDPACKAGE)
-net/smtp/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/smtp/check
-
-@go_include@ net/url.lo.dep
-net/url.lo.dep: $(go_net_url_files)
-	$(BUILDDEPS)
-net/url.lo: $(go_net_url_files)
-	$(BUILDPACKAGE)
-net/url/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/url/check
-
-@go_include@ net/textproto.lo.dep
-net/textproto.lo.dep: $(go_net_textproto_files)
-	$(BUILDDEPS)
-net/textproto.lo: $(go_net_textproto_files)
-	$(BUILDPACKAGE)
-net/textproto/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/textproto/check
-
-@go_include@ net/http/cgi.lo.dep
-net/http/cgi.lo.dep: $(go_net_http_cgi_files)
-	$(BUILDDEPS)
-net/http/cgi.lo: $(go_net_http_cgi_files)
-	$(BUILDPACKAGE)
-net/http/cgi/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/http/cgi/check
-
-@go_include@ net/http/cookiejar.lo.dep
-net/http/cookiejar.lo.dep: $(go_net_http_cookiejar_files)
-	$(BUILDDEPS)
-net/http/cookiejar.lo: $(go_net_http_cookiejar_files)
-	$(BUILDPACKAGE)
-net/http/cookiejar/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/http/cookiejar/check
-
-@go_include@ net/http/fcgi.lo.dep
-net/http/fcgi.lo.dep: $(go_net_http_fcgi_files)
-	$(BUILDDEPS)
-net/http/fcgi.lo: $(go_net_http_fcgi_files)
-	$(BUILDPACKAGE)
-net/http/fcgi/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/http/fcgi/check
-
-@go_include@ net/http/httptest.lo.dep
-net/http/httptest.lo.dep: $(go_net_http_httptest_files)
-	$(BUILDDEPS)
-net/http/httptest.lo: $(go_net_http_httptest_files)
-	$(BUILDPACKAGE)
-net/http/httptest/check: $(check_deps)
-	@$(CHECK)
-.PHONY: net/http/httptest/check
-
-@go_include@ net/http/httputil.lo.dep
-net/http/httputil.lo.dep: $(go_net_http_httputil_files)
-	$(BUILDDEPS)
-net/http/httputil.lo: $(go_net_http_httputil_files)
-	$(BUILDPACKAGE)
-net/http/httputil/check: $(check_deps)
-	@$(CHECK)
-.PHONY: net/http/httputil/check
-
-@go_include@ net/http/internal.lo.dep
-net/http/internal.lo.dep: $(go_net_http_internal_files)
-	$(BUILDDEPS)
-net/http/internal.lo: $(go_net_http_internal_files)
-	$(BUILDPACKAGE)
-net/http/internal/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/http/internal/check
-
-@go_include@ net/http/pprof.lo.dep
-net/http/pprof.lo.dep: $(go_net_http_pprof_files)
-	$(BUILDDEPS)
-net/http/pprof.lo: $(go_net_http_pprof_files)
-	$(BUILDPACKAGE)
-net/http/pprof/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/http/pprof/check
-
-@go_include@ net/internal/socktest.lo.dep
-net/internal/socktest.lo.dep: $(go_net_internal_socktest_files)
-	$(BUILDDEPS)
-net/internal/socktest.lo: $(go_net_internal_socktest_files)
-	$(BUILDPACKAGE)
-net/internal/socktest/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/internal/socktest/check
-
-@go_include@ net/rpc/jsonrpc.lo.dep
-net/rpc/jsonrpc.lo.dep: $(go_net_rpc_jsonrpc_files)
-	$(BUILDDEPS)
-net/rpc/jsonrpc.lo: $(go_net_rpc_jsonrpc_files)
-	$(BUILDPACKAGE)
-net/rpc/jsonrpc/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: net/rpc/jsonrpc/check
-
-@go_include@ old/regexp.lo.dep
-old/regexp.lo.dep: $(go_old_regexp_files)
-	$(BUILDDEPS)
-old/regexp.lo: $(go_old_regexp_files)
-	$(BUILDPACKAGE)
-old/regexp/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: old/regexp/check
-
-@go_include@ old/template.lo.dep
-old/template.lo.dep: $(go_old_template_files)
-	$(BUILDDEPS)
-old/template.lo: $(go_old_template_files)
-	$(BUILDPACKAGE)
-old/template/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: old/template/check
-
-@go_include@ os/exec.lo.dep
-os/exec.lo.dep: $(go_os_exec_files)
-	$(BUILDDEPS)
-os/exec.lo: $(go_os_exec_files)
-	$(BUILDPACKAGE)
-os/exec/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: os/exec/check
-
-@go_include@ os/signal.lo.dep
-os/signal.lo.dep: $(go_os_signal_files)
-	$(BUILDDEPS)
-os/signal.lo: $(go_os_signal_files)
-	$(BUILDPACKAGE)
-os/signal/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: os/signal/check
-
-@go_include@ os/user.lo.dep
-os/user.lo.dep: $(go_os_user_files)
-	$(BUILDDEPS)
-os/user.lo: $(go_os_user_files)
-	$(BUILDPACKAGE)
-os/user/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: os/user/check
-
-@go_include@ path/filepath.lo.dep
-path/filepath.lo.dep: $(go_path_filepath_files)
-	$(BUILDDEPS)
-path/filepath.lo: $(go_path_filepath_files)
-	$(BUILDPACKAGE)
-path/filepath/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: path/filepath/check
-
-@go_include@ regexp/syntax.lo.dep
-regexp/syntax.lo.dep: $(go_regexp_syntax_files)
-	$(BUILDDEPS)
-regexp/syntax.lo: $(go_regexp_syntax_files)
-	$(BUILDPACKAGE)
-regexp/syntax/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: regexp/syntax/check
-
-@go_include@ runtime/debug.lo.dep
-runtime/debug.lo.dep: $(go_runtime_debug_files)
-	$(BUILDDEPS)
-runtime/debug.lo: $(go_runtime_debug_files)
-	$(BUILDPACKAGE)
-runtime/debug/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: runtime/debug/check
-
-@go_include@ runtime/pprof.lo.dep
-runtime/pprof.lo.dep: $(go_runtime_pprof_files)
-	$(BUILDDEPS)
-runtime/pprof.lo: $(go_runtime_pprof_files)
-	$(BUILDPACKAGE)
-runtime/pprof/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: runtime/pprof/check
-
-@go_include@ sync/atomic.lo.dep
-sync/atomic.lo.dep: $(go_sync_atomic_files)
-	$(BUILDDEPS)
-sync/atomic.lo: $(go_sync_atomic_files)
-	$(BUILDPACKAGE)
-sync/atomic_c.lo: $(go_sync_atomic_c_files) sync/atomic.lo
-	$(LTCOMPILE) -c -o $@ $(srcdir)/go/sync/atomic/atomic.c
-sync/atomic/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: sync/atomic/check
-
-@go_include@ text/scanner.lo.dep
-text/scanner.lo.dep: $(go_text_scanner_files)
-	$(BUILDDEPS)
-text/scanner.lo: $(go_text_scanner_files)
-	$(BUILDPACKAGE)
-text/scanner/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: text/scanner/check
-
-@go_include@ text/tabwriter.lo.dep
-text/tabwriter.lo.dep: $(go_text_tabwriter_files)
-	$(BUILDDEPS)
-text/tabwriter.lo: $(go_text_tabwriter_files)
-	$(BUILDPACKAGE)
-text/tabwriter/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: text/tabwriter/check
-
-@go_include@ text/template.lo.dep
-text/template.lo.dep: $(go_text_template_files)
-	$(BUILDDEPS)
-text/template.lo: $(go_text_template_files)
-	$(BUILDPACKAGE)
-text/template/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: text/template/check
-
-@go_include@ text/template/parse.lo.dep
-text/template/parse.lo.dep: $(go_text_template_parse_files)
-	$(BUILDDEPS)
-text/template/parse.lo: $(go_text_template_parse_files)
-	$(BUILDPACKAGE)
-text/template/parse/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: text/template/parse/check
-
-@go_include@ testing/iotest.lo.dep
-testing/iotest.lo.dep: $(go_testing_iotest_files)
-	$(BUILDDEPS)
-testing/iotest.lo: $(go_testing_iotest_files)
-	$(BUILDPACKAGE)
-testing/iotest/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: testing/iotest/check
-
-@go_include@ testing/quick.lo.dep
-testing/quick.lo.dep: $(go_testing_quick_files)
-	$(BUILDDEPS)
-testing/quick.lo: $(go_testing_quick_files)
-	$(BUILDPACKAGE)
-testing/quick/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: testing/quick/check
-
-@go_include@ unicode/utf16.lo.dep
-unicode/utf16.lo.dep: $(go_unicode_utf16_files)
-	$(BUILDDEPS)
-unicode/utf16.lo: $(go_unicode_utf16_files)
-	$(BUILDPACKAGE)
-unicode/utf16/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: unicode/utf16/check
-
-@go_include@ unicode/utf8.lo.dep
-unicode/utf8.lo.dep: $(go_unicode_utf8_files)
-	$(BUILDDEPS)
-unicode/utf8.lo: $(go_unicode_utf8_files)
-	$(BUILDPACKAGE)
-unicode/utf8/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: unicode/utf8/check
-
-@go_include@ syscall.lo.dep
-syscall.lo.dep: $(go_syscall_files)
-	$(BUILDDEPS)
-syscall.lo: $(go_syscall_files)
-	$(BUILDPACKAGE)
-syscall/errno.lo: go/syscall/errno.c
-	@$(MKDIR_P) syscall
-	$(LTCOMPILE) -c -o $@ $<
-syscall/signame.lo: go/syscall/signame.c
-	@$(MKDIR_P) syscall
-	$(LTCOMPILE) -c -o $@ $<
-syscall/wait.lo: go/syscall/wait.c
-	@$(MKDIR_P) syscall
-	$(LTCOMPILE) -c -o $@ $<
-syscall/check: $(CHECK_DEPS)
-	@$(CHECK)
-.PHONY: syscall/check
-
-bufio.gox: bufio.lo
-	$(BUILDGOX)
-bytes.gox: bytes.lo
-	$(BUILDGOX)
-crypto.gox: crypto.lo
-	$(BUILDGOX)
-encoding.gox: encoding.lo
-	$(BUILDGOX)
-errors.gox: errors.lo
-	$(BUILDGOX)
-expvar.gox: expvar.lo
-	$(BUILDGOX)
-flag.gox: flag.lo
-	$(BUILDGOX)
-fmt.gox: fmt.lo
-	$(BUILDGOX)
-hash.gox: hash.lo
-	$(BUILDGOX)
-html.gox: html.lo
-	$(BUILDGOX)
-image.gox: image.lo
-	$(BUILDGOX)
-io.gox: io.lo
-	$(BUILDGOX)
-log.gox: log.lo
-	$(BUILDGOX)
-math.gox: math.lo
-	$(BUILDGOX)
-mime.gox: mime.lo
-	$(BUILDGOX)
-net.gox: net.lo
-	$(BUILDGOX)
-os.gox: os.lo
-	$(BUILDGOX)
-path.gox: path.lo
-	$(BUILDGOX)
-reflect.gox: reflect-go.lo
-	$(BUILDGOX)
-regexp.gox: regexp.lo
-	$(BUILDGOX)
-runtime.gox: runtime-go.lo
-	$(BUILDGOX)
-sort.gox: sort.lo
-	$(BUILDGOX)
-strconv.gox: strconv.lo
-	$(BUILDGOX)
-strings.gox: strings.lo
-	$(BUILDGOX)
-sync.gox: sync.lo
-	$(BUILDGOX)
-syscall.gox: syscall.lo
-	$(BUILDGOX)
-testing.gox: testing.lo
-	$(BUILDGOX)
-time.gox: time-go.lo
-	$(BUILDGOX)
-unicode.gox: unicode.lo
-	$(BUILDGOX)
-
-archive/tar.gox: archive/tar.lo
-	$(BUILDGOX)
-archive/zip.gox: archive/zip.lo
-	$(BUILDGOX)
-
-compress/bzip2.gox: compress/bzip2.lo
-	$(BUILDGOX)
-compress/flate.gox: compress/flate.lo
-	$(BUILDGOX)
-compress/gzip.gox: compress/gzip.lo
-	$(BUILDGOX)
-compress/lzw.gox: compress/lzw.lo
-	$(BUILDGOX)
-compress/zlib.gox: compress/zlib.lo
-	$(BUILDGOX)
-
-container/heap.gox: container/heap.lo
-	$(BUILDGOX)
-container/list.gox: container/list.lo
-	$(BUILDGOX)
-container/ring.gox: container/ring.lo
-	$(BUILDGOX)
-
-crypto/aes.gox: crypto/aes.lo
-	$(BUILDGOX)
-crypto/cipher.gox: crypto/cipher.lo
-	$(BUILDGOX)
-crypto/des.gox: crypto/des.lo
-	$(BUILDGOX)
-crypto/dsa.gox: crypto/dsa.lo
-	$(BUILDGOX)
-crypto/ecdsa.gox: crypto/ecdsa.lo	
-	$(BUILDGOX)
-crypto/elliptic.gox: crypto/elliptic.lo
-	$(BUILDGOX)
-crypto/hmac.gox: crypto/hmac.lo
-	$(BUILDGOX)
-crypto/md5.gox: crypto/md5.lo
-	$(BUILDGOX)
-crypto/rand.gox: crypto/rand.lo
-	$(BUILDGOX)
-crypto/rc4.gox: crypto/rc4.lo
-	$(BUILDGOX)
-crypto/rsa.gox: crypto/rsa.lo
-	$(BUILDGOX)
-crypto/sha1.gox: crypto/sha1.lo
-	$(BUILDGOX)
-crypto/sha256.gox: crypto/sha256.lo
-	$(BUILDGOX)
-crypto/sha512.gox: crypto/sha512.lo
-	$(BUILDGOX)
-crypto/subtle.gox: crypto/subtle.lo
-	$(BUILDGOX)
-crypto/tls.gox: crypto/tls.lo
-	$(BUILDGOX)
-crypto/x509.gox: crypto/x509.lo
-	$(BUILDGOX)
-
-crypto/x509/pkix.gox: crypto/x509/pkix.lo
-	$(BUILDGOX)
-
-database/sql.gox: database/sql.lo
-	$(BUILDGOX)
-
-database/sql/driver.gox: database/sql/driver.lo
-	$(BUILDGOX)
-
-debug/dwarf.gox: debug/dwarf.lo
-	$(BUILDGOX)
-debug/elf.gox: debug/elf.lo
-	$(BUILDGOX)
-debug/gosym.gox: debug/gosym.lo
-	$(BUILDGOX)
-debug/macho.gox: debug/macho.lo
-	$(BUILDGOX)
-debug/pe.gox: debug/pe.lo
-	$(BUILDGOX)
-debug/plan9obj.gox: debug/plan9obj.lo
-	$(BUILDGOX)
-
-encoding/ascii85.gox: encoding/ascii85.lo
-	$(BUILDGOX)
-encoding/asn1.gox: encoding/asn1.lo
-	$(BUILDGOX)
-encoding/base32.gox: encoding/base32.lo
-	$(BUILDGOX)
-encoding/base64.gox: encoding/base64.lo
-	$(BUILDGOX)
-encoding/binary.gox: encoding/binary.lo
-	$(BUILDGOX)
-encoding/csv.gox: encoding/csv.lo
-	$(BUILDGOX)
-encoding/gob.gox: encoding/gob.lo
-	$(BUILDGOX)
-encoding/hex.gox: encoding/hex.lo
-	$(BUILDGOX)
-encoding/json.gox: encoding/json.lo
-	$(BUILDGOX)
-encoding/pem.gox: encoding/pem.lo
-	$(BUILDGOX)
-encoding/xml.gox: encoding/xml.lo
-	$(BUILDGOX)
-
-exp/proxy.gox: exp/proxy.lo
-	$(BUILDGOX)
-exp/terminal.gox: exp/terminal.lo
-	$(BUILDGOX)
-
-html/template.gox: html/template.lo
-	$(BUILDGOX)
-
-go/ast.gox: go/ast.lo
-	$(BUILDGOX)
-go/build.gox: go/build.lo
-	$(BUILDGOX)
-go/constant.gox: go/constant.lo
-	$(BUILDGOX)
-go/doc.gox: go/doc.lo
-	$(BUILDGOX)
-go/format.gox: go/format.lo
-	$(BUILDGOX)
-go/importer.gox: go/importer.lo
-	$(BUILDGOX)
-go/parser.gox: go/parser.lo
-	$(BUILDGOX)
-go/printer.gox: go/printer.lo
-	$(BUILDGOX)
-go/scanner.gox: go/scanner.lo
-	$(BUILDGOX)
-go/token.gox: go/token.lo
-	$(BUILDGOX)
-go/types.gox: go/types.lo
-	$(BUILDGOX)
-
-go/internal/gcimporter.gox: go/internal/gcimporter.lo
-	$(BUILDGOX)
-go/internal/gccgoimporter.gox: go/internal/gccgoimporter.lo
-	$(BUILDGOX)
-
-hash/adler32.gox: hash/adler32.lo
-	$(BUILDGOX)
-hash/crc32.gox: hash/crc32.lo
-	$(BUILDGOX)
-hash/crc64.gox: hash/crc64.lo
-	$(BUILDGOX)
-hash/fnv.gox: hash/fnv.lo
-	$(BUILDGOX)
-
-image/color.gox: image/color.lo
-	$(BUILDGOX)
-image/draw.gox: image/draw.lo
-	$(BUILDGOX)
-image/gif.gox: image/gif.lo
-	$(BUILDGOX)
-image/internal/imageutil.gox: image/internal/imageutil.lo
-	$(BUILDGOX)
-image/jpeg.gox: image/jpeg.lo
-	$(BUILDGOX)
-image/png.gox: image/png.lo
-	$(BUILDGOX)
-
-image/color/palette.gox: image/color/palette.lo
-	$(BUILDGOX)
-
-index/suffixarray.gox: index/suffixarray.lo
-	$(BUILDGOX)
-
-internal/format.gox: internal/format.lo
-	$(BUILDGOX)
-internal/singleflight.gox: internal/singleflight.lo
-	$(BUILDGOX)
-internal/syscall/unix.gox: internal/syscall/unix.lo
-	$(BUILDGOX)
-internal/testenv.gox: internal/testenv.lo
-	$(BUILDGOX)
-internal/trace.gox: internal/trace.lo
-	$(BUILDGOX)
-
-io/ioutil.gox: io/ioutil.lo
-	$(BUILDGOX)
-
-log/syslog.gox: log/syslog.lo
-	$(BUILDGOX)
-
-math/big.gox: math/big.lo
-	$(BUILDGOX)
-math/cmplx.gox: math/cmplx.lo
-	$(BUILDGOX)
-math/rand.gox: math/rand.lo
-	$(BUILDGOX)
-
-mime/multipart.gox: mime/multipart.lo
-	$(BUILDGOX)
-mime/quotedprintable.gox: mime/quotedprintable.lo
-	$(BUILDGOX)
-
-net/http.gox: net/http.lo
-	$(BUILDGOX)
-net/mail.gox: net/mail.lo
-	$(BUILDGOX)
-net/rpc.gox: net/rpc.lo
-	$(BUILDGOX)
-net/smtp.gox: net/smtp.lo
-	$(BUILDGOX)
-net/textproto.gox: net/textproto.lo
-	$(BUILDGOX)
-net/url.gox: net/url.lo
-	$(BUILDGOX)
-
-net/http/cgi.gox: net/http/cgi.lo
-	$(BUILDGOX)
-net/http/cookiejar.gox: net/http/cookiejar.lo
-	$(BUILDGOX)
-net/http/fcgi.gox: net/http/fcgi.lo
-	$(BUILDGOX)
-net/http/httptest.gox: net/http/httptest.lo
-	$(BUILDGOX)
-net/http/httputil.gox: net/http/httputil.lo
-	$(BUILDGOX)
-net/http/pprof.gox: net/http/pprof.lo
-	$(BUILDGOX)
-
-net/http/internal.gox: net/http/internal.lo
-	$(BUILDGOX)
-
-net/internal/socktest.gox: net/internal/socktest.lo
-	$(BUILDGOX)
-
-net/rpc/jsonrpc.gox: net/rpc/jsonrpc.lo
-	$(BUILDGOX)
-
-old/regexp.gox: old/regexp.lo
-	$(BUILDGOX)
-old/template.gox: old/template.lo
-	$(BUILDGOX)
-
-os/exec.gox: os/exec.lo
-	$(BUILDGOX)
-os/signal.gox: os/signal.lo
-	$(BUILDGOX)
-os/user.gox: os/user.lo
-	$(BUILDGOX)
-
-path/filepath.gox: path/filepath.lo
-	$(BUILDGOX)
-
-regexp/syntax.gox: regexp/syntax.lo
-	$(BUILDGOX)
-
-runtime/debug.gox: runtime/debug.lo
-	$(BUILDGOX)
-runtime/pprof.gox: runtime/pprof.lo
-	$(BUILDGOX)
-
-sync/atomic.gox: sync/atomic.lo
-	$(BUILDGOX)
-
-text/scanner.gox: text/scanner.lo
-	$(BUILDGOX)
-text/tabwriter.gox: text/tabwriter.lo
-	$(BUILDGOX)
-text/template.gox: text/template.lo
-	$(BUILDGOX)
-text/template/parse.gox: text/template/parse.lo
-	$(BUILDGOX)
-
-testing/iotest.gox: testing/iotest.lo
-	$(BUILDGOX)
-testing/quick.gox: testing/quick.lo
-	$(BUILDGOX)
-
-unicode/utf16.gox: unicode/utf16.lo
-	$(BUILDGOX)
-unicode/utf8.gox: unicode/utf8.lo
-	$(BUILDGOX)
-
-check: check-tail
-check-recursive: check-head
-
-check-head:
-	@echo "Test Run By $${USER} on `date`" > libgo.head
-	@echo "Native configuration is $(host_triplet)" >> libgo.head
-	@echo >> libgo.head
-	@echo "		=== libgo tests ===" >> libgo.head
-	@echo >> libgo.head
-
-check-tail: check-recursive check-multi
-	@if test "$(USE_DEJAGNU)" = "yes"; then \
-	  exit 0; \
-	fi; \
-	lib=`${PWD_COMMAND} | sed -e 's,^.*/\([^/][^/]*\)$$,\1,'`; \
-	for dir in . $(MULTIDIRS); do \
-	  mv ../$${dir}/$${lib}/libgo.sum ../$${dir}/$${lib}/libgo.sum.sep; \
-	  mv ../$${dir}/$${lib}/libgo.log ../$${dir}/$${lib}/libgo.log.sep; \
-	done; \
-	mv libgo.head libgo.sum; \
-	cp libgo.sum libgo.log; \
-	echo "Schedule of variations:" >> libgo.sum; \
-	for dir in . $(MULTIDIRS); do \
-	  multidir=../$${dir}/$${lib}; \
-	  multivar=`cat $${multidir}/libgo.var`; \
-	  echo "    $${multivar}" >> libgo.sum; \
-	done; \
-	echo >> libgo.sum; \
-	pass=0; fail=0; untested=0; \
-	for dir in . $(MULTIDIRS); do \
-	  multidir=../$${dir}/$${lib}; \
-	  multivar=`cat $${multidir}/libgo.var`; \
-	  echo "Running target $${multivar}" >> libgo.sum; \
-	  echo "Running $(srcdir)/libgo.exp ..." >> libgo.sum; \
-	  cat $${multidir}/libgo.sum.sep >> libgo.sum; \
-	  cat $${multidir}/libgo.log.sep >> libgo.log; \
-	  if test -n "${MULTIDIRS}"; then \
-	    echo "		=== libgo Summary for $${multivar} ===" >> libgo.sum; \
-	    echo >> libgo.sum; \
-	  fi; \
-	  p=`grep -c PASS $${multidir}/libgo.sum.sep`; \
-	  pass=`expr $$pass + $$p`; \
-	  if test "$$p" -ne "0" && test -n "${MULTIDIRS}"; then \
-	    echo "# of expected passes		$$p" >> libgo.sum; \
-	  fi; \
-	  p=`grep -c FAIL $${multidir}/libgo.sum.sep`; \
-	  fail=`expr $$fail + $$p`; \
-	  if test "$$p" -ne "0" && test -n "${MULTIDIRS}"; then \
-	    echo "# of unexpected failures	$$p" >> libgo.sum; \
-	  fi; \
-	  p=`grep -c UNTESTED $${multidir}/libgo.sum.sep`; \
-	  untested=`expr $$untested + $$p`; \
-	  if test "$$p" -ne "0" && test -n "${MULTIDIRS}"; then \
-	    echo "# of untested testcases		$$p" >> libgo.sum; \
-	  fi; \
-	done; \
-	echo >> libgo.sum; \
-	echo "		=== libgo Summary ===" >> libgo.sum; \
-	echo >> libgo.sum; \
-	if test "$$pass" -ne "0"; then \
-	  echo "# of expected passes		$$pass" >> libgo.sum; \
-	fi; \
-	if test "$$fail" -ne "0"; then \
-	  echo "# of unexpected failures	$$fail" >> libgo.sum; \
-	fi; \
-	if test "$$untested" -ne "0"; then \
-	  echo "# of untested testcases		$$untested" >> libgo.sum; \
-	fi; \
-	echo `echo $(GOC) | sed -e 's/ .*//'`  `$(GOC) -v 2>&1 | grep " version" | sed -n -e 's/.* \(version.*$$\)/\1/p'` >> libgo.sum; \
-	echo >> libgo.log; \
-	echo "runtest completed at `date`" >> libgo.log; \
-	if test "$$fail" -ne "0"; then \
-	  status=1; \
-	else \
-	  status=0; \
-	fi; \
-	exit $$status
-
-check-am:
-	@rm -f libgo.sum libgo.log libgo.tail
-	@multivar="unix"; \
-	[ -z "$(MULTIFLAGS)" ] || multivar="$${multivar}/$(MULTIFLAGS)"; \
-	echo "$${multivar}" > libgo.var
-	@for f in $(TEST_PACKAGES); do \
-	   rm -f $$f-testsum $$f-testlog; \
-	 done
-	-@$(MAKE) -k $(TEST_PACKAGES)
-	@for f in $(TEST_PACKAGES); do \
-	  if test -f $$f-testsum; then \
-	    cat $$f-testsum >> libgo.sum; \
-	  fi; \
-	  if test -f $$f-testlog; then \
-	    cat $$f-testlog >> libgo.log; \
-	  fi; \
-	done
-
-check-multi:
-	$(MULTIDO) $(AM_MAKEFLAGS) DO=check-am multi-do # $(MAKE)
-
-bench:
-	-@$(MAKE) -k $(TEST_PACKAGES) GOBENCH=.
-
-mostlyclean-local:
-	find . -name '*.lo' -print | xargs $(LIBTOOL) --mode=clean rm -f
-	find . -name '*.$(OBJEXT)' -print | xargs rm -f
-	find . -name '*-testsum' -print | xargs rm -f
-	find . -name '*-testlog' -print | xargs rm -f
-
-clean-local:
-	find . -name '*.la' -print | xargs $(LIBTOOL) --mode=clean rm -f
-	find . -name '*.a' -print | xargs rm -f
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/gofrontend/libgo/PATENTS b/third_party/gofrontend/libgo/PATENTS
deleted file mode 100644
index 7330990..0000000
--- a/third_party/gofrontend/libgo/PATENTS
+++ /dev/null
@@ -1,22 +0,0 @@
-Additional IP Rights Grant (Patents)
-
-"This implementation" means the copyrightable works distributed by
-Google as part of the Go project.
-
-Google hereby grants to You a perpetual, worldwide, non-exclusive,
-no-charge, royalty-free, irrevocable (except as stated in this section)
-patent license to make, have made, use, offer to sell, sell, import,
-transfer and otherwise run, modify and propagate the contents of this
-implementation of Go, where such license applies only to those patent
-claims, both currently owned or controlled by Google and acquired in
-the future, licensable by Google that are necessarily infringed by this
-implementation of Go.  This grant does not include claims that would be
-infringed only as a consequence of further modification of this
-implementation.  If you or your agent or exclusive licensee institute or
-order or agree to the institution of patent litigation against any
-entity (including a cross-claim or counterclaim in a lawsuit) alleging
-that this implementation of Go or any code incorporated within this
-implementation of Go constitutes direct or contributory patent
-infringement, or inducement of patent infringement, then any patent
-rights granted to you under this License for this implementation of Go
-shall terminate as of the date such litigation is filed.
diff --git a/third_party/gofrontend/libgo/README b/third_party/gofrontend/libgo/README
deleted file mode 100644
index d5af7e2..0000000
--- a/third_party/gofrontend/libgo/README
+++ /dev/null
@@ -1,44 +0,0 @@
-See ../README.
-
-This is the runtime support library for the Go programming language.
-This library is intended for use with the Go frontend.
-
-This library should not be stripped when it is installed.  Go code
-relies on being able to look up file/line information, which comes
-from the debugging info using the libbacktrace library.
-
-The library has only been tested on GNU/Linux using glibc, and on
-Solaris.  It should not be difficult to port to other operating
-systems.
-
-Directories:
-
-go
-  A copy of the Go library from http://golang.org/, with several
-  changes for gccgo.
-
-runtime
-  Runtime functions, written in C, which are called directly by the
-  compiler or by the library.
-
-Contributing
-============
-
-To contribute patches to the files in this directory, please see
-http://golang.org/doc/gccgo_contribute.html .
-
-The master copy of these files is hosted at
-http://code.google.com/p/gofrontend .  Changes to these files require
-signing a Google contributor license agreement.  If you are the
-copyright holder, you will need to agree to the individual contributor
-license agreement at
-http://code.google.com/legal/individual-cla-v1.0.html.  This agreement
-can be completed online.
-
-If your organization is the copyright holder, the organization will
-need to agree to the corporate contributor license agreement at
-http://code.google.com/legal/corporate-cla-v1.0.html.
-
-If the copyright holder for your code has already completed the
-agreement in connection with another Google open source project, it
-does not need to be completed again.
diff --git a/third_party/gofrontend/libgo/README.gcc b/third_party/gofrontend/libgo/README.gcc
deleted file mode 100644
index d5aabb0..0000000
--- a/third_party/gofrontend/libgo/README.gcc
+++ /dev/null
@@ -1,7 +0,0 @@
-The files in this directory are mirrored from the gofrontend project
-hosted at http://code.google.com/p/gofrontend.  These files are the
-ones in the libgo subdirectory of that project.
-
-By default, the networking tests are not run.  In order to run all the
-libgo tests, you need to define the environment variable
-GCCGO_RUN_ALL_TESTS to a non-empty string.
diff --git a/third_party/gofrontend/libgo/VERSION b/third_party/gofrontend/libgo/VERSION
deleted file mode 100644
index 77af434..0000000
--- a/third_party/gofrontend/libgo/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-go1.5.1
\ No newline at end of file
diff --git a/third_party/gofrontend/libgo/aclocal.m4 b/third_party/gofrontend/libgo/aclocal.m4
deleted file mode 100644
index aefbad2..0000000
--- a/third_party/gofrontend/libgo/aclocal.m4
+++ /dev/null
@@ -1,1001 +0,0 @@
-# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
-# Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.64],,
-[m4_warning([this file was generated for autoconf 2.64.
-You have another version of autoconf.  It may work, but is not guaranteed to.
-If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
-# Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.6], [],
-      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too.  Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.6])dnl
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-
-# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory.  The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run.  This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-#    fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-#    fails if $ac_aux_dir is absolute,
-#    fails when called from a subdirectory in a VPATH build with
-#          a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
-#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-#   MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH.  The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL                                            -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-m4_define([_AM_COND_VALUE_$1], [$2])dnl
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
-else
-  $1_TRUE='#'
-  $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
-# 2010, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 12
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery.  Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
-               [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_$1_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
-  fi
-  am__universal=false
-  m4_case([$1], [CC],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac],
-    [CXX],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac])
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_$1_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-  am__nodep='_no'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-AC_SUBST([am__nodep])dnl
-_AM_SUBST_NOTMAKE([am__nodep])dnl
-])
-
-# Generate code to set up dependency tracking.              -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 5
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[{
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`AS_DIRNAME("$mf")`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`AS_DIRNAME(["$file"])`
-      AS_MKDIR_P([$dirpart/$fdir])
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
-     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Do all the work for Automake.                             -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 16
-
-# This macro actually does too much.  Some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
-dnl Autoconf wants to disallow AM_ names.  We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
-  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-			     [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-		  [_AM_DEPENDENCIES(CC)],
-		  [define([AC_PROG_CC],
-			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-		  [_AM_DEPENDENCIES(CXX)],
-		  [define([AC_PROG_CXX],
-			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-		  [_AM_DEPENDENCIES(OBJC)],
-		  [define([AC_PROG_OBJC],
-			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
-AC_CONFIG_COMMANDS_PRE(dnl
-[m4_provide_if([_AM_COMPILER_EXEEXT],
-  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
-
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
-dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
-dnl mangled by Autoconf and run in a shell conditional statement.
-m4_define([_AC_COMPILER_EXEEXT],
-m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_arg=$1
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
-# Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-AC_SUBST(install_sh)])
-
-# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
-# From Jim Meyering
-
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
-# 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_MAINTAINER_MODE([DEFAULT-MODE])
-# ----------------------------------
-# Control maintainer-specific portions of Makefiles.
-# Default is to disable them, unless `enable' is passed literally.
-# For symmetry, `disable' may be passed as well.  Anyway, the user
-# can override the default with the --enable/--disable switch.
-AC_DEFUN([AM_MAINTAINER_MODE],
-[m4_case(m4_default([$1], [disable]),
-       [enable], [m4_define([am_maintainer_other], [disable])],
-       [disable], [m4_define([am_maintainer_other], [enable])],
-       [m4_define([am_maintainer_other], [enable])
-        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
-AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
-  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
-  AC_ARG_ENABLE([maintainer-mode],
-[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
-			  (and sometimes confusing) to the casual installer],
-      [USE_MAINTAINER_MODE=$enableval],
-      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
-  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
-  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
-  MAINT=$MAINTAINER_MODE_TRUE
-  AC_SUBST([MAINT])dnl
-]
-)
-
-AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
-
-# Check to see how 'make' treats includes.	            -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# AM_MAKE_INCLUDE()
-# -----------------
-# Check to see how make treats includes.
-AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
-
-# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
-# Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling.                     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
-# Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# --------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[[\\\"\#\$\&\'\`$am_lf]]*)
-    AC_MSG_ERROR([unsafe absolute working directory name]);;
-esac
-case $srcdir in
-  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
-    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 3
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# AM_SUBST_NOTMAKE(VARIABLE)
-# --------------------------
-# Public sister of _AM_SUBST_NOTMAKE.
-AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
-
-# Check how to create a tarball.                            -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-#     tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-#     $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.  Yes, it's still used
-# in the wild :-(  We should find a proper way to deprecate it ...
-AC_SUBST([AMTAR], ['$${TAR-tar}'])
-m4_if([$1], [v7],
-     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
-m4_include([../config/depstand.m4])
-m4_include([../config/lead-dot.m4])
-m4_include([../config/multi.m4])
-m4_include([../config/override.m4])
-m4_include([../config/unwind_ipinfo.m4])
-m4_include([config/go.m4])
-m4_include([config/libtool.m4])
-m4_include([config/ltoptions.m4])
-m4_include([config/ltsugar.m4])
-m4_include([config/ltversion.m4])
-m4_include([config/lt~obsolete.m4])
diff --git a/third_party/gofrontend/libgo/config.h.in b/third_party/gofrontend/libgo/config.h.in
deleted file mode 100644
index 298b8d6..0000000
--- a/third_party/gofrontend/libgo/config.h.in
+++ /dev/null
@@ -1,399 +0,0 @@
-/* config.h.in.  Generated from configure.ac by autoheader.  */
-
-/* Define if building universal (internal helper macro) */
-#undef AC_APPLE_UNIVERSAL_BUILD
-
-/* Define to the flags needed for the .section .eh_frame directive. */
-#undef EH_FRAME_FLAGS
-
-/* Define to 1 if you have the `accept4' function. */
-#undef HAVE_ACCEPT4
-
-/* Define to 1 if you have the `acosl' function. */
-#undef HAVE_ACOSL
-
-/* Define to 1 if you have the `asinl' function. */
-#undef HAVE_ASINL
-
-/* Define if your assembler supports GNU comdat group syntax. */
-#undef HAVE_AS_COMDAT_GAS
-
-/* Define if your assembler supports unwind section type. */
-#undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE
-
-/* Define if your assembler supports PC relative relocs. */
-#undef HAVE_AS_X86_PCREL
-
-/* Define to 1 if you have the `atan2l' function. */
-#undef HAVE_ATAN2L
-
-/* Define to 1 if you have the `atanl' function. */
-#undef HAVE_ATANL
-
-/* Define to 1 if you have the `cosl' function. */
-#undef HAVE_COSL
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you have the `dl_iterate_phdr' function. */
-#undef HAVE_DL_ITERATE_PHDR
-
-/* Define to 1 if you have the `dup3' function. */
-#undef HAVE_DUP3
-
-/* Define to 1 if you have the `epoll_create1' function. */
-#undef HAVE_EPOLL_CREATE1
-
-/* Define to 1 if you have the `expl' function. */
-#undef HAVE_EXPL
-
-/* Define to 1 if you have the `expm1l' function. */
-#undef HAVE_EXPM1L
-
-/* Define to 1 if you have the `faccessat' function. */
-#undef HAVE_FACCESSAT
-
-/* Define to 1 if you have the `fallocate' function. */
-#undef HAVE_FALLOCATE
-
-/* Define to 1 if you have the `fchmodat' function. */
-#undef HAVE_FCHMODAT
-
-/* Define to 1 if you have the `fchownat' function. */
-#undef HAVE_FCHOWNAT
-
-/* Define to 1 if you have the `futimesat' function. */
-#undef HAVE_FUTIMESAT
-
-/* Define if _Unwind_GetIPInfo is available. */
-#undef HAVE_GETIPINFO
-
-/* Define to 1 if you have the `getxattr' function. */
-#undef HAVE_GETXATTR
-
-/* Define to 1 if you have the `inotify_add_watch' function. */
-#undef HAVE_INOTIFY_ADD_WATCH
-
-/* Define to 1 if you have the `inotify_init' function. */
-#undef HAVE_INOTIFY_INIT
-
-/* Define to 1 if you have the `inotify_init1' function. */
-#undef HAVE_INOTIFY_INIT1
-
-/* Define to 1 if you have the `inotify_rm_watch' function. */
-#undef HAVE_INOTIFY_RM_WATCH
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the `ldexpl' function. */
-#undef HAVE_LDEXPL
-
-/* Define to 1 if you have the <linux/ether.h> header file. */
-#undef HAVE_LINUX_ETHER_H
-
-/* Define to 1 if you have the <linux/filter.h> header file. */
-#undef HAVE_LINUX_FILTER_H
-
-/* Define to 1 if you have the <linux/fs.h> header file. */
-#undef HAVE_LINUX_FS_H
-
-/* Define to 1 if you have the <linux/if_addr.h> header file. */
-#undef HAVE_LINUX_IF_ADDR_H
-
-/* Define to 1 if you have the <linux/if_ether.h> header file. */
-#undef HAVE_LINUX_IF_ETHER_H
-
-/* Define to 1 if you have the <linux/if_tun.h> header file. */
-#undef HAVE_LINUX_IF_TUN_H
-
-/* Define to 1 if you have the <linux/netlink.h> header file. */
-#undef HAVE_LINUX_NETLINK_H
-
-/* Define to 1 if you have the <linux/reboot.h> header file. */
-#undef HAVE_LINUX_REBOOT_H
-
-/* Define to 1 if you have the <linux/rtnetlink.h> header file. */
-#undef HAVE_LINUX_RTNETLINK_H
-
-/* Define to 1 if you have the `listxattr' function. */
-#undef HAVE_LISTXATTR
-
-/* Define to 1 if the system has the type `loff_t'. */
-#undef HAVE_LOFF_T
-
-/* Define to 1 if you have the `log10l' function. */
-#undef HAVE_LOG10L
-
-/* Define to 1 if you have the `log1pl' function. */
-#undef HAVE_LOG1PL
-
-/* Define to 1 if you have the `logl' function. */
-#undef HAVE_LOGL
-
-/* Define to 1 if you have the `matherr' function. */
-#undef HAVE_MATHERR
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the `mincore' function. */
-#undef HAVE_MINCORE
-
-/* Define to 1 if you have the `mkdirat' function. */
-#undef HAVE_MKDIRAT
-
-/* Define to 1 if you have the `mknodat' function. */
-#undef HAVE_MKNODAT
-
-/* Define to 1 if you have the <netinet/icmp6.h> header file. */
-#undef HAVE_NETINET_ICMP6_H
-
-/* Define to 1 if you have the <netinet/if_ether.h> header file. */
-#undef HAVE_NETINET_IF_ETHER_H
-
-/* Define to 1 if you have the <netinet/in_syst.h> header file. */
-#undef HAVE_NETINET_IN_SYST_H
-
-/* Define to 1 if you have the <netinet/ip.h> header file. */
-#undef HAVE_NETINET_IP_H
-
-/* Define to 1 if you have the <netinet/ip_mroute.h> header file. */
-#undef HAVE_NETINET_IP_MROUTE_H
-
-/* Define to 1 if you have the <netpacket/packet.h> header file. */
-#undef HAVE_NETPACKET_PACKET_H
-
-/* Define to 1 if you have the <net/if_arp.h> header file. */
-#undef HAVE_NET_IF_ARP_H
-
-/* Define to 1 if you have the <net/if.h> header file. */
-#undef HAVE_NET_IF_H
-
-/* Define to 1 if you have the <net/route.h> header file. */
-#undef HAVE_NET_ROUTE_H
-
-/* Define to 1 if the system has the type `off64_t'. */
-#undef HAVE_OFF64_T
-
-/* Define to 1 if you have the `open64' function. */
-#undef HAVE_OPEN64
-
-/* Define to 1 if you have the `openat' function. */
-#undef HAVE_OPENAT
-
-/* Define to 1 if you have the `pipe2' function. */
-#undef HAVE_PIPE2
-
-/* Define to 1 if you have the `removexattr' function. */
-#undef HAVE_REMOVEXATTR
-
-/* Define to 1 if you have the `renameat' function. */
-#undef HAVE_RENAMEAT
-
-/* Define to 1 if you have the <sched.h> header file. */
-#undef HAVE_SCHED_H
-
-/* Define to 1 if you have the `sem_timedwait' function. */
-#undef HAVE_SEM_TIMEDWAIT
-
-/* Define to 1 if you have the `setenv' function. */
-#undef HAVE_SETENV
-
-/* Define to 1 if you have the `setxattr' function. */
-#undef HAVE_SETXATTR
-
-/* Define to 1 if you have the `sinl' function. */
-#undef HAVE_SINL
-
-/* Define to 1 if you have the `splice' function. */
-#undef HAVE_SPLICE
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the `strerror_r' function. */
-#undef HAVE_STRERROR_R
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the `strsignal' function. */
-#undef HAVE_STRSIGNAL
-
-/* Define to 1 if <math.h> defines struct exception */
-#undef HAVE_STRUCT_EXCEPTION
-
-/* Define to 1 if the compiler provides the __sync_add_and_fetch function for
-   uint64 */
-#undef HAVE_SYNC_ADD_AND_FETCH_8
-
-/* Define to 1 if the compiler provides the __sync_bool_compare_and_swap
-   function for uint32 */
-#undef HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4
-
-/* Define to 1 if the compiler provides the __sync_bool_compare_and_swap
-   function for uint64 */
-#undef HAVE_SYNC_BOOL_COMPARE_AND_SWAP_8
-
-/* Define to 1 if the compiler provides the __sync_fetch_and_add function for
-   uint32 */
-#undef HAVE_SYNC_FETCH_AND_ADD_4
-
-/* Define to 1 if you have the `sync_file_range' function. */
-#undef HAVE_SYNC_FILE_RANGE
-
-/* Define to 1 if you have the <syscall.h> header file. */
-#undef HAVE_SYSCALL_H
-
-/* Define to 1 if you have the <sys/epoll.h> header file. */
-#undef HAVE_SYS_EPOLL_H
-
-/* Define to 1 if you have the <sys/file.h> header file. */
-#undef HAVE_SYS_FILE_H
-
-/* Define to 1 if you have the <sys/inotify.h> header file. */
-#undef HAVE_SYS_INOTIFY_H
-
-/* Define to 1 if you have the <sys/mman.h> header file. */
-#undef HAVE_SYS_MMAN_H
-
-/* Define to 1 if you have the <sys/mount.h> header file. */
-#undef HAVE_SYS_MOUNT_H
-
-/* Define to 1 if you have the <sys/prctl.h> header file. */
-#undef HAVE_SYS_PRCTL_H
-
-/* Define to 1 if you have the <sys/ptrace.h> header file. */
-#undef HAVE_SYS_PTRACE_H
-
-/* Define to 1 if you have the <sys/select.h> header file. */
-#undef HAVE_SYS_SELECT_H
-
-/* Define to 1 if you have the <sys/socket.h> header file. */
-#undef HAVE_SYS_SOCKET_H
-
-/* Define to 1 if you have the <sys/statfs.h> header file. */
-#undef HAVE_SYS_STATFS_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/syscall.h> header file. */
-#undef HAVE_SYS_SYSCALL_H
-
-/* Define to 1 if you have the <sys/sysinfo.h> header file. */
-#undef HAVE_SYS_SYSINFO_H
-
-/* Define to 1 if you have the <sys/timex.h> header file. */
-#undef HAVE_SYS_TIMEX_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <sys/user.h> header file. */
-#undef HAVE_SYS_USER_H
-
-/* Define to 1 if you have the <sys/utsname.h> header file. */
-#undef HAVE_SYS_UTSNAME_H
-
-/* Define to 1 if you have the <sys/vfs.h> header file. */
-#undef HAVE_SYS_VFS_H
-
-/* Define to 1 if you have the `tanl' function. */
-#undef HAVE_TANL
-
-/* Define to 1 if you have the `tee' function. */
-#undef HAVE_TEE
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to 1 if you have the `unlinkat' function. */
-#undef HAVE_UNLINKAT
-
-/* Define to 1 if you have the `unsetenv' function. */
-#undef HAVE_UNSETENV
-
-/* Define to 1 if you have the `unshare' function. */
-#undef HAVE_UNSHARE
-
-/* Define to 1 if you have the <ustat.h> header file and it works. */
-#undef HAVE_USTAT_H
-
-/* Define to 1 if you have the `utimensat' function. */
-#undef HAVE_UTIMENSAT
-
-/* Define to 1 if you have the <utime.h> header file. */
-#undef HAVE_UTIME_H
-
-/* Define to 1 if you have the `wait4' function. */
-#undef HAVE_WAIT4
-
-/* Define if the linker support split stack adjustments */
-#undef LINKER_SUPPORTS_SPLIT_STACK
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#undef LT_OBJDIR
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* Define if setcontext clobbers TLS variables */
-#undef SETCONTEXT_CLOBBERS_TLS
-
-/* The size of `void *', as computed by sizeof. */
-#undef SIZEOF_VOID_P
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define if we're to use libffi. */
-#undef USE_LIBFFI
-
-/* Define if the compiler supports -fsplit-stack */
-#undef USING_SPLIT_STACK
-
-/* Version number of package */
-#undef VERSION
-
-/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
-   significant byte first (like Motorola and SPARC, unlike Intel). */
-#if defined AC_APPLE_UNIVERSAL_BUILD
-# if defined __BIG_ENDIAN__
-#  define WORDS_BIGENDIAN 1
-# endif
-#else
-# ifndef WORDS_BIGENDIAN
-#  undef WORDS_BIGENDIAN
-# endif
-#endif
-
-/* Define to `long int' if <sys/types.h> does not define. */
-#undef off_t
diff --git a/third_party/gofrontend/libgo/config/README b/third_party/gofrontend/libgo/config/README
deleted file mode 100644
index 06e8bf5..0000000
--- a/third_party/gofrontend/libgo/config/README
+++ /dev/null
@@ -1,2 +0,0 @@
-This directory holds files needed temporarily until Go support is
-added to autoconf and libtool.
diff --git a/third_party/gofrontend/libgo/config/go.m4 b/third_party/gofrontend/libgo/config/go.m4
deleted file mode 100644
index 65a27cb..0000000
--- a/third_party/gofrontend/libgo/config/go.m4
+++ /dev/null
@@ -1,92 +0,0 @@
-dnl acinclude.m4 -- configure macros
-
-dnl Copyright 2009 The Go Authors. All rights reserved.
-dnl Use of this source code is governed by a BSD-style
-dnl license that can be found in the LICENSE file.
-
-dnl Go support--this could be in autoconf.
-dnl This version is probably autoconf 2.64 specific.
-
-AC_LANG_DEFINE([Go], [go], [GO], [],
-[ac_ext=go
-ac_compile='$GOC -c $GOCFLAGS conftest.$ac_ext >&AS_MESSAGE_LOG_FD'
-ac_link='$GOC -o conftest$ac_exeext $GOCFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&AS_MESSAGE_LOG_FD'
-ac_compile_gnu=yes
-])
-
-AU_DEFUN([AC_LANG_GO], [AC_LANG(Go)])
-
-m4_define([AC_LANG_PROGRAM(Go)],
-[package main
-$1
-func main() {
-$2
-}])
-
-m4_define([AC_LANG_IO_PROGRAM(Go)],
-[AC_LANG_PROGRAM([import "os"],
-[if f, err := os.Open("conftest.out", os.O_WRONLY), err != nil {
-	os.Exit(1);
- }
- if err := f.Close(); err != nil {
-	os.Exit(1);
- }
- os.Exit(0);
-])])
-
-m4_define([AC_LANG_CALL(Go)],
-[AC_LANG_PROGRAM([$1
-m4_if([$2], [main], ,
-[func $2();])],[$2();])])
-
-m4_define([AC_LANG_FUNC_LINK_TRY(Go)],
-[AC_LANG_PROGRAM(
-[func $1() int;
-var f := $1;
-], [return f();])])
-
-m4_define([AC_LANG_BOOL_COMPILE_TRY(Go)],
-[AC_LANG_PROGRAM([$1], [var test_array @<:@1 - 2 * !($2)@:>@;
-test_array @<:@0@:>@ = 0
-])])
-
-m4_define([AC_LANG_INT_SAVE(Go)],
-[AC_LANG_PROGRAM([$1
-import os
-func longval() long { return $2 }
-func ulongval() ulong { return $2 }],
-[panic("unimplemented")])])
-
-AC_DEFUN([AC_LANG_COMPILER(Go)],
-[AC_REQUIRE([AC_PROG_GO])])
-
-AN_MAKEVAR([GOC], [AC_PROG_GO])
-AN_PROGRAM([gccgo], [AC_PROG_GO])
-AC_DEFUN([AC_PROG_GO],
-[AC_LANG_PUSH(Go)dnl
-AC_ARG_VAR([GOC],   [Go compiler command])dnl
-AC_ARG_VAR([GOCFLAGS], [Go compiler flags])dnl
-_AC_ARG_VAR_LDFLAGS()dnl
-m4_ifval([$1],
-      [AC_CHECK_TOOLS(GOC, [$1])],
-[AC_CHECK_TOOL(GOC, gccgo)
-if test -z "$GOC"; then
-  if test -n "$ac_tool_prefix"; then
-    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [$ac_tool_prefix}gccgo])
-  fi
-fi
-if test -z "$GOC"; then
-  AC_CHECK_PROG(GOC, gccgo, gccgo, , , gccgo)
-fi
-])
-
-# Provide some information about the compiler.
-_AS_ECHO_LOG([checking for _AC_LANG compiler version])
-set X $ac_compile
-ac_compiler=$[2]
-_AC_DO_LIMIT([$ac_compiler --version >&AS_MESSAGE_LOG_FD])
-m4_expand_once([_AC_COMPILER_EXEEXT])[]dnl
-m4_expand_once([_AC_COMPILER_OBJEXT])[]dnl
-GOCFLAGS="-g -O2"
-AC_LANG_POP(Go)dnl
-])# AC_PROG_GO
diff --git a/third_party/gofrontend/libgo/config/libtool.m4 b/third_party/gofrontend/libgo/config/libtool.m4
deleted file mode 100644
index f700594..0000000
--- a/third_party/gofrontend/libgo/config/libtool.m4
+++ /dev/null
@@ -1,7518 +0,0 @@
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-])
-
-# serial 56 LT_INIT
-
-
-# LT_PREREQ(VERSION)
-# ------------------
-# Complain and exit if this libtool version is less that VERSION.
-m4_defun([LT_PREREQ],
-[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
-       [m4_default([$3],
-		   [m4_fatal([Libtool version $1 or higher is required],
-		             63)])],
-       [$2])])
-
-
-# _LT_CHECK_BUILDDIR
-# ------------------
-# Complain if the absolute build directory name contains unusual characters
-m4_defun([_LT_CHECK_BUILDDIR],
-[case `pwd` in
-  *\ * | *\	*)
-    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
-esac
-])
-
-
-# LT_INIT([OPTIONS])
-# ------------------
-AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
-AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
-AC_BEFORE([$0], [LT_LANG])dnl
-AC_BEFORE([$0], [LT_OUTPUT])dnl
-AC_BEFORE([$0], [LTDL_INIT])dnl
-m4_require([_LT_CHECK_BUILDDIR])dnl
-
-dnl Autoconf doesn't catch unexpanded LT_ macros by default:
-m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
-m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
-dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
-dnl unless we require an AC_DEFUNed macro:
-AC_REQUIRE([LTOPTIONS_VERSION])dnl
-AC_REQUIRE([LTSUGAR_VERSION])dnl
-AC_REQUIRE([LTVERSION_VERSION])dnl
-AC_REQUIRE([LTOBSOLETE_VERSION])dnl
-m4_require([_LT_PROG_LTMAIN])dnl
-
-_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
-
-dnl Parse OPTIONS
-_LT_SET_OPTIONS([$0], [$1])
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-_LT_SETUP
-
-# Only expand once:
-m4_define([LT_INIT])
-])# LT_INIT
-
-# Old names:
-AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
-AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
-dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
-m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-])
-
-
-# _LT_FILEUTILS_DEFAULTS
-# ----------------------
-# It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
-m4_defun([_LT_FILEUTILS_DEFAULTS],
-[: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-])# _LT_FILEUTILS_DEFAULTS
-
-
-# _LT_SETUP
-# ---------
-m4_defun([_LT_SETUP],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
-AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
-
-_LT_DECL([], [host_alias], [0], [The host system])dnl
-_LT_DECL([], [host], [0])dnl
-_LT_DECL([], [host_os], [0])dnl
-dnl
-_LT_DECL([], [build_alias], [0], [The build system])dnl
-_LT_DECL([], [build], [0])dnl
-_LT_DECL([], [build_os], [0])dnl
-dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-dnl
-AC_REQUIRE([AC_PROG_LN_S])dnl
-test -z "$LN_S" && LN_S="ln -s"
-_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
-dnl
-AC_REQUIRE([LT_CMD_MAX_LEN])dnl
-_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
-_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
-dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-m4_require([_LT_CMD_RELOAD])dnl
-m4_require([_LT_CHECK_MAGIC_METHOD])dnl
-m4_require([_LT_CMD_OLD_ARCHIVE])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-
-_LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-])
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-_LT_CHECK_OBJDIR
-
-m4_require([_LT_TAG_COMPILER])dnl
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    _LT_PATH_MAGIC
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-LT_SUPPORTED_TAG([CC])
-_LT_LANG_C_CONFIG
-_LT_LANG_DEFAULT_CONFIG
-_LT_CONFIG_COMMANDS
-])# _LT_SETUP
-
-
-# _LT_PREPARE_SED_QUOTE_VARS
-# --------------------------
-# Define a few sed substitution that help us do robust quoting.
-m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
-[# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-])
-
-# _LT_PROG_LTMAIN
-# ---------------
-# Note that this code is called both from `configure', and `config.status'
-# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
-# so we pass a copy along to make sure it has a sensible value anyway.
-m4_defun([_LT_PROG_LTMAIN],
-[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
-_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
-])# _LT_PROG_LTMAIN
-
-
-## ------------------------------------- ##
-## Accumulate code for creating libtool. ##
-## ------------------------------------- ##
-
-# So that we can recreate a full libtool script including additional
-# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
-# label.
-
-
-# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
-# ----------------------------------------
-# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL_INIT],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_INIT])
-
-
-# _LT_CONFIG_LIBTOOL([COMMANDS])
-# ------------------------------
-# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
-
-
-# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
-# -----------------------------------------------------
-m4_defun([_LT_CONFIG_SAVE_COMMANDS],
-[_LT_CONFIG_LIBTOOL([$1])
-_LT_CONFIG_LIBTOOL_INIT([$2])
-])
-
-
-# _LT_FORMAT_COMMENT([COMMENT])
-# -----------------------------
-# Add leading comment marks to the start of each line, and a trailing
-# full-stop to the whole comment if one is not present already.
-m4_define([_LT_FORMAT_COMMENT],
-[m4_ifval([$1], [
-m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
-              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
-)])
-
-
-
-## ------------------------ ##
-## FIXME: Eliminate VARNAME ##
-## ------------------------ ##
-
-
-# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
-# -------------------------------------------------------------------
-# CONFIGNAME is the name given to the value in the libtool script.
-# VARNAME is the (base) name used in the configure script.
-# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
-# VARNAME.  Any other value will be used directly.
-m4_define([_LT_DECL],
-[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
-    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
-	[m4_ifval([$1], [$1], [$2])])
-    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
-    m4_ifval([$4],
-	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
-    lt_dict_add_subkey([lt_decl_dict], [$2],
-	[tagged?], [m4_ifval([$5], [yes], [no])])])
-])
-
-
-# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
-# --------------------------------------------------------
-m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
-
-
-# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_tag_varnames],
-[_lt_decl_filter([tagged?], [yes], $@)])
-
-
-# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
-# ---------------------------------------------------------
-m4_define([_lt_decl_filter],
-[m4_case([$#],
-  [0], [m4_fatal([$0: too few arguments: $#])],
-  [1], [m4_fatal([$0: too few arguments: $#: $1])],
-  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
-  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
-  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
-])
-
-
-# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
-# --------------------------------------------------
-m4_define([lt_decl_quote_varnames],
-[_lt_decl_filter([value], [1], $@)])
-
-
-# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_dquote_varnames],
-[_lt_decl_filter([value], [2], $@)])
-
-
-# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_varnames_tagged],
-[m4_assert([$# <= 2])dnl
-_$0(m4_quote(m4_default([$1], [[, ]])),
-    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
-    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
-m4_define([_lt_decl_varnames_tagged],
-[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
-
-
-# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_all_varnames],
-[_$0(m4_quote(m4_default([$1], [[, ]])),
-     m4_if([$2], [],
-	   m4_quote(lt_decl_varnames),
-	m4_quote(m4_shift($@))))[]dnl
-])
-m4_define([_lt_decl_all_varnames],
-[lt_join($@, lt_decl_varnames_tagged([$1],
-			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
-])
-
-
-# _LT_CONFIG_STATUS_DECLARE([VARNAME])
-# ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
-# must have a single quote delimited value for this to work.
-m4_define([_LT_CONFIG_STATUS_DECLARE],
-[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
-
-
-# _LT_CONFIG_STATUS_DECLARATIONS
-# ------------------------------
-# We delimit libtool config variables with single quotes, so when
-# we write them to config.status, we have to be sure to quote all
-# embedded single quotes properly.  In configure, this macro expands
-# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
-#
-#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
-m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
-    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAGS
-# ----------------
-# Output comment and list of tags supported by the script
-m4_defun([_LT_LIBTOOL_TAGS],
-[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
-])
-
-
-# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
-# -----------------------------------
-# Extract the dictionary values for VARNAME (optionally with TAG) and
-# expand to a commented shell variable setting:
-#
-#    # Some comment about what VAR is for.
-#    visible_name=$lt_internal_name
-m4_define([_LT_LIBTOOL_DECLARE],
-[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
-					   [description])))[]dnl
-m4_pushdef([_libtool_name],
-    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
-m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
-    [0], [_libtool_name=[$]$1],
-    [1], [_libtool_name=$lt_[]$1],
-    [2], [_libtool_name=$lt_[]$1],
-    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
-m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
-])
-
-
-# _LT_LIBTOOL_CONFIG_VARS
-# -----------------------
-# Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
-# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
-# section) are produced by _LT_LIBTOOL_TAG_VARS.
-m4_defun([_LT_LIBTOOL_CONFIG_VARS],
-[m4_foreach([_lt_var],
-    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAG_VARS(TAG)
-# -------------------------
-m4_define([_LT_LIBTOOL_TAG_VARS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
-
-
-# _LT_TAGVAR(VARNAME, [TAGNAME])
-# ------------------------------
-m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
-
-
-# _LT_CONFIG_COMMANDS
-# -------------------
-# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
-# variables for single and double quote escaping we saved from calls
-# to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
-# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
-m4_defun([_LT_CONFIG_COMMANDS],
-[AC_PROVIDE_IFELSE([LT_OUTPUT],
-	dnl If the libtool generation code has been placed in $CONFIG_LT,
-	dnl instead of duplicating it all over again into config.status,
-	dnl then we will have config.status run $CONFIG_LT later, so it
-	dnl needs to know what name is stored there:
-        [AC_CONFIG_COMMANDS([libtool],
-            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
-    dnl If the libtool generation code is destined for config.status,
-    dnl expand the accumulated commands and init code now:
-    [AC_CONFIG_COMMANDS([libtool],
-        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
-])#_LT_CONFIG_COMMANDS
-
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
-[
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-_LT_CONFIG_STATUS_DECLARATIONS
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$[]1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_quote_varnames); do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_dquote_varnames); do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-_LT_OUTPUT_LIBTOOL_INIT
-])
-
-# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
-# ------------------------------------
-# Generate a child script FILE with all initialization necessary to
-# reuse the environment learned by the parent script, and make the
-# file executable.  If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins.  After this
-# macro, additional text can be appended to FILE to form the body of
-# the child script.  The macro ends with non-zero status if the
-# file could not be fully written (such as if the disk is full).
-m4_ifdef([AS_INIT_GENERATED],
-[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
-[m4_defun([_LT_GENERATED_FILE_INIT],
-[m4_require([AS_PREPARE])]dnl
-[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
-[lt_write_fail=0
-cat >$1 <<_ASEOF || lt_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-$2
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$1 <<\_ASEOF || lt_write_fail=1
-AS_SHELL_SANITIZE
-_AS_PREPARE
-exec AS_MESSAGE_FD>&1
-_ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
-m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
-
-# LT_OUTPUT
-# ---------
-# This macro allows early generation of the libtool script (before
-# AC_OUTPUT is called), incase it is used in configure for compilation
-# tests.
-AC_DEFUN([LT_OUTPUT],
-[: ${CONFIG_LT=./config.lt}
-AC_MSG_NOTICE([creating $CONFIG_LT])
-_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
-[# Run this file to recreate a libtool stub with the current configuration.])
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-lt_cl_silent=false
-exec AS_MESSAGE_LOG_FD>>config.log
-{
-  echo
-  AS_BOX([Running $as_me.])
-} >&AS_MESSAGE_LOG_FD
-
-lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
-for use in further configure time tests before the real libtool is
-generated.
-
-Usage: $[0] [[OPTIONS]]
-
-  -h, --help      print this help, then exit
-  -V, --version   print version number, then exit
-  -q, --quiet     do not print progress messages
-  -d, --debug     don't remove temporary files
-
-Report bugs to <bug-libtool@gnu.org>."
-
-lt_cl_version="\
-m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
-m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
-configured by $[0], generated by m4_PACKAGE_STRING.
-
-Copyright (C) 2009 Free Software Foundation, Inc.
-This config.lt script is free software; the Free Software Foundation
-gives unlimited permision to copy, distribute and modify it."
-
-while test $[#] != 0
-do
-  case $[1] in
-    --version | --v* | -V )
-      echo "$lt_cl_version"; exit 0 ;;
-    --help | --h* | -h )
-      echo "$lt_cl_help"; exit 0 ;;
-    --debug | --d* | -d )
-      debug=: ;;
-    --quiet | --q* | --silent | --s* | -q )
-      lt_cl_silent=: ;;
-
-    -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
-
-    *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
-  esac
-  shift
-done
-
-if $lt_cl_silent; then
-  exec AS_MESSAGE_FD>/dev/null
-fi
-_LTEOF
-
-cat >>"$CONFIG_LT" <<_LTEOF
-_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AC_MSG_NOTICE([creating $ofile])
-_LT_OUTPUT_LIBTOOL_COMMANDS
-AS_EXIT(0)
-_LTEOF
-chmod +x "$CONFIG_LT"
-
-# configure is writing to config.log, but config.lt does its own redirection,
-# appending to config.log, which fails on DOS, as config.log is still kept
-# open by configure.  Here we exec the FD to /dev/null, effectively closing
-# config.log, so it can be properly (re)opened and appended to by config.lt.
-lt_cl_success=:
-test "$silent" = yes &&
-  lt_config_lt_args="$lt_config_lt_args --quiet"
-exec AS_MESSAGE_LOG_FD>/dev/null
-$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
-exec AS_MESSAGE_LOG_FD>>config.log
-$lt_cl_success || AS_EXIT(1)
-])# LT_OUTPUT
-
-
-# _LT_CONFIG(TAG)
-# ---------------
-# If TAG is the built-in tag, create an initial libtool script with a
-# default configuration from the untagged config vars.  Otherwise add code
-# to config.status for appending the configuration named by TAG from the
-# matching tagged config vars.
-m4_defun([_LT_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_CONFIG_SAVE_COMMANDS([
-  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
-  m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-_LT_COPYING
-_LT_LIBTOOL_TAGS
-
-# ### BEGIN LIBTOOL CONFIG
-_LT_LIBTOOL_CONFIG_VARS
-_LT_LIBTOOL_TAG_VARS
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-  _LT_PROG_LTMAIN
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  _LT_PROG_XSI_SHELLFNS
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-],
-[cat <<_LT_EOF >> "$ofile"
-
-dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
-dnl in a comment (ie after a #).
-# ### BEGIN LIBTOOL TAG CONFIG: $1
-_LT_LIBTOOL_TAG_VARS(_LT_TAG)
-# ### END LIBTOOL TAG CONFIG: $1
-_LT_EOF
-])dnl /m4_if
-],
-[m4_if([$1], [], [
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'], [])
-])dnl /_LT_CONFIG_SAVE_COMMANDS
-])# _LT_CONFIG
-
-
-# LT_SUPPORTED_TAG(TAG)
-# ---------------------
-# Trace this macro to discover what tags are supported by the libtool
-# --tag option, using:
-#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
-AC_DEFUN([LT_SUPPORTED_TAG], [])
-
-
-# C support is built-in for now
-m4_define([_LT_LANG_C_enabled], [])
-m4_define([_LT_TAGS], [])
-
-
-# LT_LANG(LANG)
-# -------------
-# Enable libtool support for the given language if not already enabled.
-AC_DEFUN([LT_LANG],
-[AC_BEFORE([$0], [LT_OUTPUT])dnl
-m4_case([$1],
-  [C],			[_LT_LANG(C)],
-  [C++],		[_LT_LANG(CXX)],
-  [Go],			[_LT_LANG(GO)],
-  [Java],		[_LT_LANG(GCJ)],
-  [Fortran 77],		[_LT_LANG(F77)],
-  [Fortran],		[_LT_LANG(FC)],
-  [Windows Resource],	[_LT_LANG(RC)],
-  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
-    [_LT_LANG($1)],
-    [m4_fatal([$0: unsupported language: "$1"])])])dnl
-])# LT_LANG
-
-
-# _LT_LANG(LANGNAME)
-# ------------------
-m4_defun([_LT_LANG],
-[m4_ifdef([_LT_LANG_]$1[_enabled], [],
-  [LT_SUPPORTED_TAG([$1])dnl
-  m4_append([_LT_TAGS], [$1 ])dnl
-  m4_define([_LT_LANG_]$1[_enabled], [])dnl
-  _LT_LANG_$1_CONFIG($1)])dnl
-])# _LT_LANG
-
-
-# _LT_LANG_DEFAULT_CONFIG
-# -----------------------
-m4_defun([_LT_LANG_DEFAULT_CONFIG],
-[AC_PROVIDE_IFELSE([AC_PROG_CXX],
-  [LT_LANG(CXX)],
-  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_F77],
-  [LT_LANG(F77)],
-  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_FC],
-  [LT_LANG(FC)],
-  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
-
-dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
-dnl pulling things in needlessly.
-AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-  [LT_LANG(GCJ)],
-  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-    [LT_LANG(GCJ)],
-    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
-      [LT_LANG(GCJ)],
-      [m4_ifdef([AC_PROG_GCJ],
-	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([A][M_PROG_GCJ],
-	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([LT_PROG_GCJ],
-	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
-
-AC_PROVIDE_IFELSE([AC_PROG_GO],
-  [LT_LANG(GO)],
-  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
-
-AC_PROVIDE_IFELSE([LT_PROG_RC],
-  [LT_LANG(RC)],
-  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
-])# _LT_LANG_DEFAULT_CONFIG
-
-# Obsolete macros:
-AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
-AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
-AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
-AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
-AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
-dnl AC_DEFUN([AC_LIBTOOL_F77], [])
-dnl AC_DEFUN([AC_LIBTOOL_FC], [])
-dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
-dnl AC_DEFUN([AC_LIBTOOL_RC], [])
-
-
-# _LT_TAG_COMPILER
-# ----------------
-m4_defun([_LT_TAG_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
-_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
-_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
-_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_TAG_COMPILER
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-m4_defun([_LT_COMPILER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-m4_defun([_LT_LINKER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-])# _LT_LINKER_BOILERPLATE
-
-# _LT_REQUIRED_DARWIN_CHECKS
-# -------------------------
-m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
-  case $host_os in
-    rhapsody* | darwin*)
-    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
-    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
-    AC_CHECK_TOOL([LIPO], [lipo], [:])
-    AC_CHECK_TOOL([OTOOL], [otool], [:])
-    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
-    _LT_DECL([], [DSYMUTIL], [1],
-      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
-    _LT_DECL([], [NMEDIT], [1],
-      [Tool to change global to local symbols on Mac OS X])
-    _LT_DECL([], [LIPO], [1],
-      [Tool to manipulate fat objects and archives on Mac OS X])
-    _LT_DECL([], [OTOOL], [1],
-      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
-    _LT_DECL([], [OTOOL64], [1],
-      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
-
-    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
-      [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&AS_MESSAGE_LOG_FD
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi])
-    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
-      [lt_cv_ld_exported_symbols_list],
-      [lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-	[lt_cv_ld_exported_symbols_list=yes],
-	[lt_cv_ld_exported_symbols_list=no])
-	LDFLAGS="$save_LDFLAGS"
-    ])
-    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
-      [lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
-      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
-      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&AS_MESSAGE_LOG_FD
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-    ])
-    case $host_os in
-    rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[[012]][[,.]]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-])
-
-
-# _LT_DARWIN_LINKER_FEATURES
-# --------------------------
-# Checks for linker and compiler features on darwin
-m4_defun([_LT_DARWIN_LINKER_FEATURES],
-[
-  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_automatic, $1)=yes
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-  else
-    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
-  fi
-  _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-    m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-    fi
-],[])
-  else
-  _LT_TAGVAR(ld_shlibs, $1)=no
-  fi
-])
-
-# _LT_SYS_MODULE_PATH_AIX
-# -----------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-m4_defun([_LT_SYS_MODULE_PATH_AIX],
-[m4_require([_LT_DECL_SED])dnl
-AC_LINK_IFELSE(AC_LANG_PROGRAM,[
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi],[])
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-])# _LT_SYS_MODULE_PATH_AIX
-
-
-# _LT_SHELL_INIT(ARG)
-# -------------------
-m4_define([_LT_SHELL_INIT],
-[m4_divert_text([M4SH-INIT], [$1
-])])# _LT_SHELL_INIT
-
-
-
-# _LT_PROG_ECHO_BACKSLASH
-# -----------------------
-# Find how we can fake an echo command that does not interpret backslash.
-# In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
-m4_defun([_LT_PROG_ECHO_BACKSLASH],
-[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-AC_MSG_CHECKING([how to print strings])
-# Test print first, because it will be a builtin if present.
-if test "X`print -r -- -n 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
-else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$[]1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*" 
-}
-
-case "$ECHO" in
-  printf*) AC_MSG_RESULT([printf]) ;;
-  print*) AC_MSG_RESULT([print -r]) ;;
-  *) AC_MSG_RESULT([cat]) ;;
-esac
-
-m4_ifdef([_AS_DETECT_SUGGESTED],
-[_AS_DETECT_SUGGESTED([
-  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
-    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-    PATH=/empty FPATH=/empty; export PATH FPATH
-    test "X`printf %s $ECHO`" = "X$ECHO" \
-      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
-
-_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
-])# _LT_PROG_ECHO_BACKSLASH
-
-
-# _LT_ENABLE_LOCK
-# ---------------
-m4_defun([_LT_ENABLE_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
-  [AS_HELP_STRING([--disable-libtool-lock],
-    [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    case `/usr/bin/file conftest.o` in
-	      *x86-64*)
-		LD="${LD-ld} -m elf32_x86_64"
-		;;
-	      *)
-		LD="${LD-ld} -m elf_i386"
-		;;
-	    esac
-	    ;;
-	  powerpc64le-*linux*)
-	    LD="${LD-ld} -m elf32lppclinux"
-	    ;;
-	  powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  powerpcle-*linux*)
-	    LD="${LD-ld} -m elf64lppc"
-	    ;;
-	  powerpc-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-    [AC_LANG_PUSH(C)
-     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-     AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-])# _LT_ENABLE_LOCK
-
-
-# _LT_CMD_OLD_ARCHIVE
-# -------------------
-m4_defun([_LT_CMD_OLD_ARCHIVE],
-[AC_CHECK_TOOL(AR, ar, false)
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1])
-
-AC_CHECK_TOOL(STRIP, strip, :)
-test -z "$STRIP" && STRIP=:
-_LT_DECL([], [STRIP], [1], [A symbol stripping program])
-
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-test -z "$RANLIB" && RANLIB=:
-_LT_DECL([], [RANLIB], [1],
-    [Commands used to install an old-style archive])
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
-_LT_DECL([], [old_postinstall_cmds], [2])
-_LT_DECL([], [old_postuninstall_cmds], [2])
-_LT_TAGDECL([], [old_archive_cmds], [2],
-    [Commands used to build an old-style archive])
-_LT_DECL([], [lock_old_archive_extraction], [0],
-    [Whether to use a lock for old archive extraction])
-])# _LT_CMD_OLD_ARCHIVE
-
-
-# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([_LT_COMPILER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       $2=yes
-     fi
-   fi
-   $RM conftest*
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$5], , :, [$5])
-else
-    m4_if([$6], , :, [$6])
-fi
-])# _LT_COMPILER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
-
-
-# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#                  [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------
-# Check whether the given linker option works
-AC_DEFUN([_LT_LINKER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $3"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&AS_MESSAGE_LOG_FD
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         $2=yes
-       fi
-     else
-       $2=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$4], , :, [$4])
-else
-    m4_if([$5], , :, [$5])
-fi
-])# _LT_LINKER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
-
-
-# LT_CMD_MAX_LEN
-#---------------
-AC_DEFUN([LT_CMD_MAX_LEN],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
-  i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
-  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
-  AC_MSG_RESULT(none)
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-_LT_DECL([], [max_cmd_len], [0],
-    [What is the maximum length of a command?])
-])# LT_CMD_MAX_LEN
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
-
-
-# _LT_HEADER_DLFCN
-# ----------------
-m4_defun([_LT_HEADER_DLFCN],
-[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
-])# _LT_HEADER_DLFCN
-
-
-# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ----------------------------------------------------------------
-m4_defun([_LT_TRY_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
-  [$4]
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-[#line __oline__ "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-void fnord () __attribute__((visibility("default")));
-#endif
-
-void fnord () { int i=42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}]
-_LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) $1 ;;
-      x$lt_dlneed_uscore) $2 ;;
-      x$lt_dlunknown|x*) $3 ;;
-    esac
-  else :
-    # compilation failed
-    $3
-  fi
-fi
-rm -fr conftest*
-])# _LT_TRY_DLOPEN_SELF
-
-
-# LT_SYS_DLOPEN_SELF
-# ------------------
-AC_DEFUN([LT_SYS_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ])
-    ;;
-
-  *)
-    AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
-      [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
-	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
-	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
-	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
-	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
-	      ])
-	    ])
-	  ])
-	])
-      ])
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    AC_CACHE_CHECK([whether a program can dlopen itself],
-	  lt_cv_dlopen_self, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
-	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
-    ])
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
-	  lt_cv_dlopen_self_static, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
-	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
-      ])
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-_LT_DECL([dlopen_support], [enable_dlopen], [0],
-	 [Whether dlopen is supported])
-_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
-	 [Whether dlopen of programs is supported])
-_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
-	 [Whether dlopen of statically linked programs is supported])
-])# LT_SYS_DLOPEN_SELF
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
-
-
-# _LT_COMPILER_C_O([TAGNAME])
-# ---------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler.
-# This macro does not hard code the compiler like AC_PROG_CC_C_O.
-m4_defun([_LT_COMPILER_C_O],
-[m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-     fi
-   fi
-   chmod u+w . 2>&AS_MESSAGE_LOG_FD
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-])
-_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
-	[Does compiler simultaneously support -c and -o options?])
-])# _LT_COMPILER_C_O
-
-
-# _LT_COMPILER_FILE_LOCKS([TAGNAME])
-# ----------------------------------
-# Check to see if we can do hard links to lock some files if needed
-m4_defun([_LT_COMPILER_FILE_LOCKS],
-[m4_require([_LT_ENABLE_LOCK])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_COMPILER_C_O([$1])
-
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  AC_MSG_CHECKING([if we can lock with hard links])
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
-])# _LT_COMPILER_FILE_LOCKS
-
-
-# _LT_CHECK_OBJDIR
-# ----------------
-m4_defun([_LT_CHECK_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-_LT_DECL([], [objdir], [0],
-         [The name of the directory that contains temporary libtool files])dnl
-m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
-])# _LT_CHECK_OBJDIR
-
-
-# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
-# --------------------------------------
-# Check hardcoding attributes.
-m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
-   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
-    # Linking always hardcodes the temporary library directory.
-    _LT_TAGVAR(hardcode_action, $1)=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    _LT_TAGVAR(hardcode_action, $1)=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  _LT_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-_LT_TAGDECL([], [hardcode_action], [0],
-    [How to hardcode a shared library path into an executable])
-])# _LT_LINKER_HARDCODE_LIBPATH
-
-
-# _LT_CMD_STRIPLIB
-# ----------------
-m4_defun([_LT_CMD_STRIPLIB],
-[m4_require([_LT_DECL_EGREP])
-striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      AC_MSG_RESULT([yes])
-    else
-      AC_MSG_RESULT([no])
-    fi
-    ;;
-  *)
-    AC_MSG_RESULT([no])
-    ;;
-  esac
-fi
-_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
-_LT_DECL([], [striplib], [1])
-])# _LT_CMD_STRIPLIB
-
-
-# _LT_SYS_DYNAMIC_LINKER([TAG])
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-m4_defun([_LT_SYS_DYNAMIC_LINKER],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_OBJDUMP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-AC_MSG_CHECKING([dynamic linker characteristics])
-m4_if([$1],
-	[], [
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
-  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[[4-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[[01]] | aix4.[[01]].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[[45]]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-m4_if([$1], [],[
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-m4_if([$1], [],[
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[[23]].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
-  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/beos/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[[3-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
-    [lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
-	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
-    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
-	 [lt_cv_shlibpath_overrides_runpath=yes])])
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-    ])
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-_LT_DECL([], [variables_saved_for_relink], [1],
-    [Variables whose values should be saved in libtool wrapper scripts and
-    restored at link time])
-_LT_DECL([], [need_lib_prefix], [0],
-    [Do we need the "lib" prefix for modules?])
-_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
-_LT_DECL([], [version_type], [0], [Library versioning type])
-_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
-_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
-_LT_DECL([], [shlibpath_overrides_runpath], [0],
-    [Is shlibpath searched before the hard-coded library search path?])
-_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
-_LT_DECL([], [library_names_spec], [1],
-    [[List of archive names.  First name is the real one, the rest are links.
-    The last name is the one that the linker finds with -lNAME]])
-_LT_DECL([], [soname_spec], [1],
-    [[The coded name of the library, if different from the real name]])
-_LT_DECL([], [install_override_mode], [1],
-    [Permission mode override for installation of shared libraries])
-_LT_DECL([], [postinstall_cmds], [2],
-    [Command to use after installation of a shared archive])
-_LT_DECL([], [postuninstall_cmds], [2],
-    [Command to use after uninstallation of a shared archive])
-_LT_DECL([], [finish_cmds], [2],
-    [Commands used to finish a libtool library installation in a directory])
-_LT_DECL([], [finish_eval], [1],
-    [[As "finish_cmds", except a single script fragment to be evaled but
-    not shown]])
-_LT_DECL([], [hardcode_into_libs], [0],
-    [Whether we should hardcode library paths into libraries])
-_LT_DECL([], [sys_lib_search_path_spec], [2],
-    [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
-])# _LT_SYS_DYNAMIC_LINKER
-
-
-# _LT_PATH_TOOL_PREFIX(TOOL)
-# --------------------------
-# find a file program which can recognize shared library
-AC_DEFUN([_LT_PATH_TOOL_PREFIX],
-[m4_require([_LT_DECL_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word.  This closes a longstanding sh security hole.
-  ac_dummy="m4_if([$2], , $PATH, [$2])"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  AC_MSG_RESULT($MAGIC_CMD)
-else
-  AC_MSG_RESULT(no)
-fi
-_LT_DECL([], [MAGIC_CMD], [0],
-	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
-])# _LT_PATH_TOOL_PREFIX
-
-# Old name:
-AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
-
-
-# _LT_PATH_MAGIC
-# --------------
-# find a file program which can recognize a shared library
-m4_defun([_LT_PATH_MAGIC],
-[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
-  else
-    MAGIC_CMD=:
-  fi
-fi
-])# _LT_PATH_MAGIC
-
-
-# LT_PATH_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([LT_PATH_LD],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
-
-AC_ARG_WITH([gnu-ld],
-    [AS_HELP_STRING([--with-gnu-ld],
-	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
-    [with_gnu_ld=no])dnl
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by $CC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]]* | ?:[[\\/]]*)
-      re_direlt='/[[^/]][[^/]]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-_LT_PATH_LD_GNU
-AC_SUBST([LD])
-
-_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
-])# LT_PATH_LD
-
-# Old names:
-AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
-AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_LD], [])
-dnl AC_DEFUN([AC_PROG_LD], [])
-
-
-# _LT_PATH_LD_GNU
-#- --------------
-m4_defun([_LT_PATH_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# _LT_PATH_LD_GNU
-
-
-# _LT_CMD_RELOAD
-# --------------
-# find reload flag for linker
-#   -- PORTME Some linkers may need a different reload flag.
-m4_defun([_LT_CMD_RELOAD],
-[AC_CACHE_CHECK([for $LD option to reload object files],
-  lt_cv_ld_reload_flag,
-  [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
-_LT_TAGDECL([], [reload_cmds], [2])dnl
-])# _LT_CMD_RELOAD
-
-
-# _LT_CHECK_MAGIC_METHOD
-# ----------------------
-# how to check for library dependencies
-#  -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_MAGIC_METHOD],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-AC_CACHE_CHECK([how to recognize dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[[4-9]]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[[45]]*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[[3-9]]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-])
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-_LT_DECL([], [deplibs_check_method], [1],
-    [Method to check whether dependent libraries are shared objects])
-_LT_DECL([], [file_magic_cmd], [1],
-    [Command to use when deplibs_check_method == "file_magic"])
-])# _LT_CHECK_MAGIC_METHOD
-
-
-# LT_PATH_NM
-# ----------
-# find the pathname to a BSD- or MS-compatible name lister
-AC_DEFUN([LT_PATH_NM],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
-[if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
-  AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-AC_SUBST([NM])
-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
-
-AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
-  [lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
-  cat conftest.out >&AS_MESSAGE_LOG_FD
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*])
-])# LT_PATH_NM
-
-# Old names:
-AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
-AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_NM], [])
-dnl AC_DEFUN([AC_PROG_NM], [])
-
-
-# LT_LIB_M
-# --------
-# check for math library
-AC_DEFUN([LT_LIB_M],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
-  # These system don't have libm, or don't need it
-  ;;
-*-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
-  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
-  ;;
-*)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
-  ;;
-esac
-AC_SUBST([LIBM])
-])# LT_LIB_M
-
-# Old name:
-AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_CHECK_LIBM], [])
-
-
-# _LT_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------
-m4_defun([_LT_COMPILER_NO_RTTI],
-[m4_require([_LT_TAG_COMPILER])dnl
-
-_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
-  esac
-
-  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
-    lt_cv_prog_compiler_rtti_exceptions,
-    [-fno-rtti -fno-exceptions], [],
-    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
-	[Compiler flag to turn off builtin functions])
-])# _LT_COMPILER_NO_RTTI
-
-
-# _LT_CMD_GLOBAL_SYMBOLS
-# ----------------------
-m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[[BCDT]]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[[ABCDGISTW]]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDEGRST]]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[[BCDEGRST]]'
-  ;;
-osf*)
-  symcode='[[BCDEGQRST]]'
-  ;;
-solaris*)
-  symcode='[[BDRT]]'
-  ;;
-sco3.2v5*)
-  symcode='[[DT]]'
-  ;;
-sysv4.2uw2*)
-  symcode='[[DT]]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[[ABDT]]'
-  ;;
-sysv4)
-  symcode='[[DFNSTU]]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK ['"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx]"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if AC_TRY_EVAL(ac_compile); then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[[]] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
-    fi
-  else
-    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  AC_MSG_RESULT(failed)
-else
-  AC_MSG_RESULT(ok)
-fi
-
-_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
-    [Take the output of nm and produce a listing of raw symbols and C names])
-_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
-    [Transform the output of nm in a proper C declaration])
-_LT_DECL([global_symbol_to_c_name_address],
-    [lt_cv_sys_global_symbol_to_c_name_address], [1],
-    [Transform the output of nm in a C name address pair])
-_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
-    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
-    [Transform the output of nm in a C name address pair when lib prefix is needed])
-]) # _LT_CMD_GLOBAL_SYMBOLS
-
-
-# _LT_COMPILER_PIC([TAGNAME])
-# ---------------------------
-m4_defun([_LT_COMPILER_PIC],
-[m4_require([_LT_TAG_COMPILER])dnl
-_LT_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_TAGVAR(lt_prog_compiler_static, $1)=
-
-AC_MSG_CHECKING([for $compiler option to produce PIC])
-m4_if([$1], [CXX], [
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-      ;;
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)=
-      ;;
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[[4-9]]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	else
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
-	    # IBM XL 8.0, 9.0 on PPC and BlueGene
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-	;;
-    esac
-  fi
-],
-[
-  if test "$GCC" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      else
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC (with -KPIC) is the default.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-        ;;
-      ccc*)
-        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-        # All Alpha code is PIC.
-        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ F* | *Sun*Fortran*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # All OSF/1 code is PIC.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    rdos*)
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    unicos*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-    esac
-  fi
-])
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-    ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
-    ;;
-esac
-AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
-	[How to pass a linker flag through the compiler])
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
-  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
-    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
-    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
-    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
-     "" | " "*) ;;
-     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
-     esac],
-    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
-	[Additional compiler flags for building library objects])
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
-_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
-  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
-  $lt_tmp_static_flag,
-  [],
-  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
-_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
-	[Compiler flag to prevent dynamic linking])
-])# _LT_COMPILER_PIC
-
-
-# _LT_LINKER_SHLIBS([TAGNAME])
-# ----------------------------
-# See if the linker supports building shared libraries.
-m4_defun([_LT_LINKER_SHLIBS],
-[AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-m4_if([$1], [CXX], [
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  case $host_os in
-  aix[[4-9]]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
-  ;;
-  cygwin* | mingw* | cegcc*)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  *)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  esac
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-], [
-  runpath_var=
-  _LT_TAGVAR(allow_undefined_flag, $1)=
-  _LT_TAGVAR(always_export_symbols, $1)=no
-  _LT_TAGVAR(archive_cmds, $1)=
-  _LT_TAGVAR(archive_expsym_cmds, $1)=
-  _LT_TAGVAR(compiler_needs_object, $1)=no
-  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  _LT_TAGVAR(hardcode_automatic, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
-  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-  _LT_TAGVAR(hardcode_minus_L, $1)=no
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_TAGVAR(inherit_rpath, $1)=no
-  _LT_TAGVAR(link_all_deplibs, $1)=unknown
-  _LT_TAGVAR(module_cmds, $1)=
-  _LT_TAGVAR(module_expsym_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
-  _LT_TAGVAR(thread_safe_flag_spec, $1)=
-  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  _LT_TAGVAR(include_expsyms, $1)=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-dnl Note also adjust exclude_expsyms for C++ above.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  _LT_TAGVAR(ld_shlibs, $1)=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
-	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[[3-9]]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-      # as there is no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=no
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    haiku*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    interix[[3-9]]*)
-      _LT_TAGVAR(hardcode_direct, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-	  tmp_sharedflag='--shared' ;;
-	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        _LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
-      runpath_var=
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	_LT_TAGVAR(hardcode_direct, $1)=unsupported
-      fi
-      ;;
-
-    aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      _LT_TAGVAR(archive_cmds, $1)=''
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[[012]]|aix4.[[012]].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        _LT_SYS_MODULE_PATH_AIX
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 _LT_SYS_MODULE_PATH_AIX
-	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	  fi
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[[45]]*)
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-      # FIXME: Should let the user specify the lib program.
-      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      ;;
-
-    darwin* | rhapsody*)
-      _LT_DARWIN_LINKER_FEATURES($1)
-      ;;
-
-    dgux*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2.*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	_LT_TAGVAR(hardcode_minus_L, $1)=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	m4_if($1, [], [
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  _LT_LINKER_OPTION([if $CC understands -b],
-	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
-	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
-	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
-	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  ;;
-	*)
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        AC_LINK_IFELSE(int foo(void) {},
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-        )
-        LDFLAGS="$save_LDFLAGS"
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(inherit_rpath, $1)=yes
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    os2*)
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      case $host_os in
-      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-        ;;
-	motorola)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4.3*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	_LT_TAGVAR(ld_shlibs, $1)=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-])
-AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
-
-_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
-_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
-_LT_DECL([], [extract_expsyms_cmds], [2],
-    [The commands to extract the exported symbol list from a shared archive])
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
-  # Assume -lc should be added
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $_LT_TAGVAR(archive_cmds, $1) in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
-	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
-	[$RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
-	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
-	  _LT_TAGVAR(allow_undefined_flag, $1)=
-	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
-	  then
-	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	  else
-	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  fi
-	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-	])
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
-    [Whether or not to add -lc for building shared libraries])
-_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
-    [enable_shared_with_static_runtimes], [0],
-    [Whether or not to disallow shared libs when runtime libs are static])
-_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
-    [Compiler flag to allow reflexive dlopens])
-_LT_TAGDECL([], [whole_archive_flag_spec], [1],
-    [Compiler flag to generate shared objects directly from archives])
-_LT_TAGDECL([], [compiler_needs_object], [1],
-    [Whether the compiler copes with passing no objects directly])
-_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
-    [Create an old-style archive from a shared archive])
-_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
-    [Create a temporary old-style archive to link instead of a shared archive])
-_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
-_LT_TAGDECL([], [archive_expsym_cmds], [2])
-_LT_TAGDECL([], [module_cmds], [2],
-    [Commands used to build a loadable module if different from building
-    a shared archive.])
-_LT_TAGDECL([], [module_expsym_cmds], [2])
-_LT_TAGDECL([], [with_gnu_ld], [1],
-    [Whether we are building with GNU ld or not])
-_LT_TAGDECL([], [allow_undefined_flag], [1],
-    [Flag that allows shared libraries with undefined symbols to be built])
-_LT_TAGDECL([], [no_undefined_flag], [1],
-    [Flag that enforces no undefined symbols])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
-    [Flag to hardcode $libdir into a binary during linking.
-    This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
-    [[If ld is used when linking, flag to hardcode $libdir into a binary
-    during linking.  This must work even if $libdir does not exist]])
-_LT_TAGDECL([], [hardcode_libdir_separator], [1],
-    [Whether we need a single "-rpath" flag with a separated argument])
-_LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary])
-_LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
-    library is relocated])
-_LT_TAGDECL([], [hardcode_minus_L], [0],
-    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
-    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_automatic], [0],
-    [Set to "yes" if building a shared library automatically hardcodes DIR
-    into the library and all subsequent libraries and executables linked
-    against it])
-_LT_TAGDECL([], [inherit_rpath], [0],
-    [Set to yes if linker adds runtime paths of dependent libraries
-    to runtime path list])
-_LT_TAGDECL([], [link_all_deplibs], [0],
-    [Whether libtool must link a program against all its dependency libraries])
-_LT_TAGDECL([], [fix_srcfile_path], [1],
-    [Fix the shell variable $srcfile for the compiler])
-_LT_TAGDECL([], [always_export_symbols], [0],
-    [Set to "yes" if exported symbols are required])
-_LT_TAGDECL([], [export_symbols_cmds], [2],
-    [The commands to list exported symbols])
-_LT_TAGDECL([], [exclude_expsyms], [1],
-    [Symbols that should not be listed in the preloaded symbols])
-_LT_TAGDECL([], [include_expsyms], [1],
-    [Symbols that must always be exported])
-_LT_TAGDECL([], [prelink_cmds], [2],
-    [Commands necessary for linking programs (against libraries) with templates])
-_LT_TAGDECL([], [file_list_spec], [1],
-    [Specify filename containing input files])
-dnl FIXME: Not yet implemented
-dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
-dnl    [Compiler flag to generate thread safe objects])
-])# _LT_LINKER_SHLIBS
-
-
-# _LT_LANG_C_CONFIG([TAG])
-# ------------------------
-# Ensure that the configuration variables for a C compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_C_CONFIG],
-[m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-_LT_TAG_COMPILER
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_SYS_DYNAMIC_LINKER($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-  LT_SYS_DLOPEN_SELF
-  _LT_CMD_STRIPLIB
-
-  # Report which library types will actually be built
-  AC_MSG_CHECKING([if libtool supports shared libraries])
-  AC_MSG_RESULT([$can_build_shared])
-
-  AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  AC_MSG_RESULT([$enable_shared])
-
-  AC_MSG_CHECKING([whether to build static libraries])
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  AC_MSG_RESULT([$enable_static])
-
-  _LT_CONFIG($1)
-fi
-AC_LANG_POP
-CC="$lt_save_CC"
-])# _LT_LANG_C_CONFIG
-
-
-# _LT_LANG_CXX_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a C++ compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_CXX_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  AC_PROG_CXXCPP
-else
-  _lt_caught_CXX_error=yes
-fi
-
-AC_LANG_PUSH(C++)
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(compiler_needs_object, $1)=no
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-    else
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-    fi
-
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
-
-      LT_PATH_LD
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          _LT_TAGVAR(whole_archive_flag_spec, $1)=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-    _LT_TAGVAR(ld_shlibs, $1)=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-      aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        _LT_TAGVAR(archive_cmds, $1)=''
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[[012]]|aix4.[[012]].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
-
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          _LT_SYS_MODULE_PATH_AIX
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    _LT_SYS_MODULE_PATH_AIX
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
-	      # We only use this code for GNU lds that support --whole-archive.
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    else
-	      # Exported symbols can be pulled into shared objects from archives
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	    fi
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-        # as there is no search path for DLLs.
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
-        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-        _LT_TAGVAR(always_export_symbols, $1)=no
-        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
-        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-          # If the export-symbols file already is a .def file (1st line
-          # is EXPORTS), use it as is; otherwise, prepend...
-          _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    cp $export_symbols $output_objdir/$soname.def;
-          else
-	    echo EXPORTS > $output_objdir/$soname.def;
-	    cat $export_symbols >> $output_objdir/$soname.def;
-          fi~
-          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-        else
-          _LT_TAGVAR(ld_shlibs, $1)=no
-        fi
-        ;;
-      darwin* | rhapsody*)
-        _LT_DARWIN_LINKER_FEATURES($1)
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      freebsd2.*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      freebsd-elf*)
-        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-        ;;
-
-      gnu*)
-        ;;
-
-      haiku*)
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        ;;
-
-      hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            _LT_TAGVAR(ld_shlibs, $1)=no
-            ;;
-          aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-            ;;
-          *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              _LT_TAGVAR(ld_shlibs, $1)=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            _LT_TAGVAR(hardcode_direct, $1)=no
-            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-            ;;
-          *)
-            _LT_TAGVAR(hardcode_direct, $1)=yes
-            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
-	        case $host_cpu in
-	          hppa*64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[[3-9]]*)
-	_LT_TAGVAR(hardcode_direct, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	      else
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
-	      fi
-	    fi
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-	    ;;
-        esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(inherit_rpath, $1)=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
-	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
-	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
-		$RANLIB $oldlib'
-	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 and above use weak symbols
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
-	    ;;
-	  xl* | mpixl* | bgxl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	      _LT_TAGVAR(compiler_needs_object, $1)=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='func_echo_all'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-	;;
-
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      openbsd*)
-	if test -f /usr/libexec/ld.so; then
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=func_echo_all
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-		;;
-	      *)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-		;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	      case $host in
-	        osf3*)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	        *)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
-	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	    case $host_os in
-	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-
-	    output_verbose_link_cmd='func_echo_all'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	        # platform.
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      fi
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
-	      case $host_os in
-		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-		*)
-		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-	_LT_TAGVAR(link_all_deplibs, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
-	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
-	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
-	      '"$_LT_TAGVAR(reload_cmds, $1)"
-	    ;;
-	  *)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-    esac
-
-    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-AC_LANG_POP
-])# _LT_LANG_CXX_CONFIG
-
-
-# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
-# ---------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-# Dependencies to place before and after the object being linked:
-_LT_TAGVAR(predep_objects, $1)=
-_LT_TAGVAR(postdep_objects, $1)=
-_LT_TAGVAR(predeps, $1)=
-_LT_TAGVAR(postdeps, $1)=
-_LT_TAGVAR(compiler_lib_search_path, $1)=
-
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library.  It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
-int a;
-void foo (void) { a = 0; }
-_LT_EOF
-], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer*4 a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
-public class foo {
-  private int a;
-  public void bar (void) {
-    a = 0;
-  }
-};
-_LT_EOF
-], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
-package foo
-func foo() { }
-_LT_EOF
-])
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case $p in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
-	 prev=$p
-	 continue
-       else
-	 prev=
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 case $p in
-	 -L* | -R*)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
-	   else
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
-	 else
-	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
-	 fi
-       fi
-       ;;
-
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-	   _LT_TAGVAR(predep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
-	 fi
-       else
-	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-	   _LT_TAGVAR(postdep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$RM -f confest.$objext
-
-# PORTME: override above test on systems where it is broken
-m4_if([$1], [CXX],
-[case $host_os in
-interix[[3-9]]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  _LT_TAGVAR(predep_objects,$1)=
-  _LT_TAGVAR(postdep_objects,$1)=
-  _LT_TAGVAR(postdeps,$1)=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-])
-
-case " $_LT_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=
-if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
-    [The directories searched by this compiler when creating a shared library])
-_LT_TAGDECL([], [predep_objects], [1],
-    [Dependencies to place before and after the objects being linked to
-    create a shared library])
-_LT_TAGDECL([], [postdep_objects], [1])
-_LT_TAGDECL([], [predeps], [1])
-_LT_TAGDECL([], [postdeps], [1])
-_LT_TAGDECL([], [compiler_lib_search_path], [1],
-    [The library search path used internally by the compiler when linking
-    a shared library])
-])# _LT_SYS_HIDDEN_LIBDEPS
-
-
-# _LT_LANG_F77_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a Fortran 77 compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_F77_CONFIG],
-[AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
-  _lt_disable_F77=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the F77 compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  CC=${F77-"f77"}
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-  GCC=$G77
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-fi # test "$_lt_disable_F77" != yes
-
-AC_LANG_POP
-])# _LT_LANG_F77_CONFIG
-
-
-# _LT_LANG_FC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for a Fortran compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_FC_CONFIG],
-[AC_LANG_PUSH(Fortran)
-
-if test -z "$FC" || test "X$FC" = "Xno"; then
-  _lt_disable_FC=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for fc test sources.
-ac_ext=${ac_fc_srcext-f}
-
-# Object file extension for compiled fc test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the FC compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  CC=${FC-"f95"}
-  compiler=$CC
-  GCC=$ac_cv_fc_compiler_gnu
-
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-fi # test "$_lt_disable_FC" != yes
-
-AC_LANG_POP
-])# _LT_LANG_FC_CONFIG
-
-
-# _LT_LANG_GCJ_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Java Compiler compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GCJ_CONFIG],
-[AC_REQUIRE([LT_PROG_GCJ])dnl
-AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GCJ-"gcj"}
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-
-  _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC="$lt_save_CC"
-])# _LT_LANG_GCJ_CONFIG
-
-# _LT_LANG_GO_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Go compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GO_CONFIG],
-[AC_REQUIRE([LT_PROG_GO])dnl
-AC_LANG_SAVE
-
-# Source file extension for Go test sources.
-ac_ext=go
-
-# Object file extension for compiled Go test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="package main; func main() { }"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='package main; func main() { }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC="$GCC"
-GCC=yes
-CC=${GOC-"gccgo"}
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# Go did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-
-  _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC="$lt_save_CC"
-])# _LT_LANG_GO_CONFIG
-
-
-# _LT_LANG_RC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for the Windows resource compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_RC_CONFIG],
-[AC_REQUIRE([LT_PROG_RC])dnl
-AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC=$GCC
-GCC=
-CC=${RC-"windres"}
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-if test -n "$compiler"; then
-  :
-  _LT_CONFIG($1)
-fi
-
-GCC=$lt_save_GCC
-AC_LANG_RESTORE
-CC="$lt_save_CC"
-])# _LT_LANG_RC_CONFIG
-
-
-# LT_PROG_GCJ
-# -----------
-AC_DEFUN([LT_PROG_GCJ],
-[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
-  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
-    [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
-      AC_SUBST(GCJFLAGS)])])[]dnl
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
-
-# LT_PROG_GO
-# -----------
-AC_DEFUN([LT_PROG_GO],
-[AC_CHECK_TOOL(GOC, gccgo,)
-])
-
-# LT_PROG_RC
-# ----------
-AC_DEFUN([LT_PROG_RC],
-[AC_CHECK_TOOL(RC, windres,)
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_RC], [])
-
-
-# _LT_DECL_EGREP
-# --------------
-# If we don't have a new enough Autoconf to choose the best grep
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_EGREP],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_REQUIRE([AC_PROG_FGREP])dnl
-test -z "$GREP" && GREP=grep
-_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
-_LT_DECL([], [EGREP], [1], [An ERE matcher])
-_LT_DECL([], [FGREP], [1], [A literal string matcher])
-dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
-AC_SUBST([GREP])
-])
-
-
-# _LT_DECL_OBJDUMP
-# --------------
-# If we don't have a new enough Autoconf to choose the best objdump
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_OBJDUMP],
-[AC_CHECK_TOOL(OBJDUMP, objdump, false)
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
-AC_SUBST([OBJDUMP])
-])
-
-
-# _LT_DECL_SED
-# ------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible.  Prefer GNU sed if found.
-m4_defun([_LT_DECL_SED],
-[AC_PROG_SED
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
-_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
-    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
-])# _LT_DECL_SED
-
-m4_ifndef([AC_PROG_SED], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-############################################################
-
-m4_defun([AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
-])
-SED=$lt_cv_path_SED
-AC_SUBST([SED])
-AC_MSG_RESULT([$SED])
-])#AC_PROG_SED
-])#m4_ifndef
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_SED], [])
-
-
-# _LT_CHECK_SHELL_FEATURES
-# ------------------------
-# Find out whether the shell is Bourne or XSI compatible,
-# or has some other useful features.
-m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
-_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
-])# _LT_CHECK_SHELL_FEATURES
-
-
-# _LT_PROG_XSI_SHELLFNS
-# ---------------------
-# Bourne and XSI compatible variants of some useful shell functions.
-m4_defun([_LT_PROG_XSI_SHELLFNS],
-[case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $[*] ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-}
-
-dnl func_dirname_and_basename
-dnl A portable version of this function is already defined in general.m4sh
-dnl so there is no need for it here.
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[[^=]]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "${1}" | $SED "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "${1}" | $SED "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "${1}" | $SED 's/\.[[^.]]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$[@]"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]+=\$[2]"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]=\$$[1]\$[2]"
-}
-
-_LT_EOF
-    ;;
-  esac
-])
diff --git a/third_party/gofrontend/libgo/config/ltmain.sh b/third_party/gofrontend/libgo/config/ltmain.sh
deleted file mode 100644
index ce66b44..0000000
--- a/third_party/gofrontend/libgo/config/ltmain.sh
+++ /dev/null
@@ -1,8636 +0,0 @@
-# Generated from ltmain.m4sh.
-
-# libtool (GNU libtool 1.3134 2009-11-29) 2.2.7a
-# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009 Free Software Foundation, Inc.
-# This is free software; see the source for copying conditions.  There is NO
-# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-# GNU Libtool is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#       --config             show all configuration variables
-#       --debug              enable verbose shell tracing
-#   -n, --dry-run            display commands without modifying any files
-#       --features           display basic configuration information and exit
-#       --mode=MODE          use operation mode MODE
-#       --no-finish          let install mode avoid finish commands
-#       --preserve-dup-deps  don't remove duplicate dependency libraries
-#       --quiet, --silent    don't print informational messages
-#       --no-quiet, --no-silent
-#                            print informational messages (default)
-#       --tag=TAG            use configuration variables from tag TAG
-#   -v, --verbose            print more informational messages than default
-#       --no-verbose         don't print the extra informational messages
-#       --version            print version information
-#   -h, --help, --help-all   print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-#         clean              remove files from the build directory
-#         compile            compile a source file into a libtool object
-#         execute            automatically set library path, then run a program
-#         finish             complete the installation of libtool libraries
-#         install            install libraries or executables
-#         link               create a library or an executable
-#         uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.  When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#         host-triplet:	$host
-#         shell:		$SHELL
-#         compiler:		$LTCC
-#         compiler flags:		$LTCFLAGS
-#         linker:		$LD (gnu? $with_gnu_ld)
-#         $progname:	(GNU libtool 1.3134 2009-11-29) 2.2.7a
-#         automake:	$automake_version
-#         autoconf:	$autoconf_version
-#
-# Report bugs to <bug-libtool@gnu.org>.
-
-PROGRAM=libtool
-PACKAGE=libtool
-VERSION=2.2.7a
-TIMESTAMP=" 1.3134 2009-11-29"
-package_revision=1.3134
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
-
-# NLS nuisances: We save the old values to restore during execute mode.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-	  export $lt_var
-	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
-	fi"
-done
-
-$lt_unset CDPATH
-
-
-
-
-
-
-
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
-
-
-
-: ${CP="cp -f"}
-: ${ECHO=$as_echo}
-: ${EGREP="/bin/grep -E"}
-: ${FGREP="/bin/grep -F"}
-: ${GREP="/bin/grep"}
-: ${LN_S="ln -s"}
-: ${MAKE="make"}
-: ${MKDIR="mkdir"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-: ${SED="/mount/endor/wildenhu/local-x86_64/bin/sed"}
-: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
-
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-  func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-}
-
-# Generated shell functions inserted here.
-
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
-		s@/\./@/@g
-		t dotsl
-		s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
-
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-#             value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
-  # Start from root dir and reassemble the path.
-  func_normal_abspath_result=
-  func_normal_abspath_tpath=$1
-  func_normal_abspath_altnamespace=
-  case $func_normal_abspath_tpath in
-    "")
-      # Empty path, that just means $cwd.
-      func_stripname '' '/' "`pwd`"
-      func_normal_abspath_result=$func_stripname_result
-      return
-    ;;
-    # The next three entries are used to spot a run of precisely
-    # two leading slashes without using negated character classes;
-    # we take advantage of case's first-match behaviour.
-    ///*)
-      # Unusual form of absolute path, do nothing.
-    ;;
-    //*)
-      # Not necessarily an ordinary path; POSIX reserves leading '//'
-      # and for example Cygwin uses it to access remote file shares
-      # over CIFS/SMB, so we conserve a leading double slash if found.
-      func_normal_abspath_altnamespace=/
-    ;;
-    /*)
-      # Absolute path, do nothing.
-    ;;
-    *)
-      # Relative path, prepend $cwd.
-      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
-    ;;
-  esac
-  # Cancel out all the simple stuff to save iterations.  We also want
-  # the path to end with a slash for ease of parsing, so make sure
-  # there is one (and only one) here.
-  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
-  while :; do
-    # Processed it all yet?
-    if test "$func_normal_abspath_tpath" = / ; then
-      # If we ascended to the root using ".." the result may be empty now.
-      if test -z "$func_normal_abspath_result" ; then
-        func_normal_abspath_result=/
-      fi
-      break
-    fi
-    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcar"`
-    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcdr"`
-    # Figure out what to do with it
-    case $func_normal_abspath_tcomponent in
-      "")
-        # Trailing empty path component, ignore it.
-      ;;
-      ..)
-        # Parent dir; strip last assembled component from result.
-        func_dirname "$func_normal_abspath_result"
-        func_normal_abspath_result=$func_dirname_result
-      ;;
-      *)
-        # Actual path component, append it.
-        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
-      ;;
-    esac
-  done
-  # Restore leading double-slash if one was found on entry.
-  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
-
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-#             value returned in "$func_relative_path_result"
-func_relative_path ()
-{
-  func_relative_path_result=
-  func_normal_abspath "$1"
-  func_relative_path_tlibdir=$func_normal_abspath_result
-  func_normal_abspath "$2"
-  func_relative_path_tbindir=$func_normal_abspath_result
-
-  # Ascend the tree starting from libdir
-  while :; do
-    # check if we have found a prefix of bindir
-    case $func_relative_path_tbindir in
-      $func_relative_path_tlibdir)
-        # found an exact match
-        func_relative_path_tcancelled=
-        break
-        ;;
-      $func_relative_path_tlibdir*)
-        # found a matching prefix
-        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
-        func_relative_path_tcancelled=$func_stripname_result
-        if test -z "$func_relative_path_result"; then
-          func_relative_path_result=.
-        fi
-        break
-        ;;
-      *)
-        func_dirname $func_relative_path_tlibdir
-        func_relative_path_tlibdir=${func_dirname_result}
-        if test "x$func_relative_path_tlibdir" = x ; then
-          # Have to descend all the way to the root!
-          func_relative_path_result=../$func_relative_path_result
-          func_relative_path_tcancelled=$func_relative_path_tbindir
-          break
-        fi
-        func_relative_path_result=../$func_relative_path_result
-        ;;
-    esac
-  done
-
-  # Now calculate path; take care to avoid doubling-up slashes.
-  func_stripname '' '/' "$func_relative_path_result"
-  func_relative_path_result=$func_stripname_result
-  func_stripname '/' '/' "$func_relative_path_tcancelled"
-  if test "x$func_stripname_result" != x ; then
-    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
-  fi
-
-  # Normalisation. If bindir is libdir, return empty string,
-  # else relative path ending with a slash; either way, target
-  # file name can be directly appended.
-  if test ! -z "$func_relative_path_result"; then
-    func_stripname './' '' "$func_relative_path_result/"
-    func_relative_path_result=$func_stripname_result
-  fi
-}
-
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
-
-# Make sure we have an absolute path for reexecution:
-case $progpath in
-  [\\/]*|[A-Za-z]:\\*) ;;
-  *[\\/]*)
-     progdir=$func_dirname_result
-     progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
-     ;;
-  *)
-     save_IFS="$IFS"
-     IFS=:
-     for progdir in $PATH; do
-       IFS="$save_IFS"
-       test -x "$progdir/$progname" && break
-     done
-     IFS="$save_IFS"
-     test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
-     ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
-
-# Standard options:
-opt_dry_run=false
-opt_help=false
-opt_quiet=false
-opt_verbose=false
-opt_warning=:
-
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname${mode+: }$mode: $*"
-}
-
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
-
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*"
-}
-
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
-}
-
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
-
-    # bash bug again:
-    :
-}
-
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
-{
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
-
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
-}
-help="Try \`$progname --help' for more information."  ## default
-
-
-# func_grep expression filename
-# Check whether EXPRESSION matches any line of FILENAME, without output.
-func_grep ()
-{
-    $GREP "$1" "$2" >/dev/null 2>&1
-}
-
-
-# func_mkdir_p directory-path
-# Make sure the entire path to DIRECTORY-PATH is available.
-func_mkdir_p ()
-{
-    my_directory_path="$1"
-    my_dir_list=
-
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
-
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
-      esac
-
-      # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
-        # ...make a list in topmost first order.  Use a colon delimited
-	# list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
-
-        # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
-
-        # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
-      done
-      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
-
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-	IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
-        # try to create one of the directories concurrently.  Don't
-        # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
-      done
-      IFS="$save_mkdir_p_IFS"
-
-      # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
-    fi
-}
-
-
-# func_mktempdir [string]
-# Make a temporary directory that won't clash with other running
-# libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
-func_mktempdir ()
-{
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
-
-    if test "$opt_dry_run" = ":"; then
-      # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
-    else
-
-      # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
-
-      if test ! -d "$my_tmpdir"; then
-        # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
-
-        save_mktempdir_umask=`umask`
-        umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
-      fi
-
-      # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
-    fi
-
-    $ECHO "$my_tmpdir"
-}
-
-
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
-{
-    case $1 in
-      *[\\\`\"\$]*)
-	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
-
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and and variable
-      # expansion for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
-        ;;
-      *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
-    esac
-}
-
-
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
-{
-    case $1 in
-      *[\\\`\"]*)
-	my_arg=`$ECHO "$1" | $SED \
-	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        my_arg="$1" ;;
-    esac
-
-    case $my_arg in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting and command substitution for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        my_arg="\"$my_arg\""
-        ;;
-    esac
-
-    func_quote_for_expand_result="$my_arg"
-}
-
-
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-	    $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-
-
-
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
-    $SED -n '/(C)/!b go
-	:more
-	/\./!{
-	  N
-	  s/\n# //
-	  b more
-	}
-	:go
-	/^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-	s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
-}
-
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
-{
-    $SED -n '/^# Usage:/,/^#  *-h/ {
-        s/^# //
-	s/^# *$//
-	s/\$progname/'$progname'/
-	p
-    }' < "$progpath"
-    echo
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
-}
-
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
-func_help ()
-{
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-        s/^# //
-	s/^# *$//
-	s*\$progname*'$progname'*
-	s*\$host*'"$host"'*
-	s*\$SHELL*'"$SHELL"'*
-	s*\$LTCC*'"$LTCC"'*
-	s*\$LTCFLAGS*'"$LTCFLAGS"'*
-	s*\$LD*'"$LD"'*
-	s/\$with_gnu_ld/'"$with_gnu_ld"'/
-	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
-	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
-	p
-     }' < "$progpath"
-    ret=$?
-    if test -z "$1"; then
-      exit $ret
-    fi
-}
-
-# func_missing_arg argname
-# Echo program name prefixed message to standard error and set global
-# exit_cmd.
-func_missing_arg ()
-{
-    func_error "missing argument for $1"
-    exit_cmd=exit
-}
-
-exit_cmd=:
-
-
-
-
-
-
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
-
-# Global variables.
-# $mode is unset
-nonopt=
-execute_dlfiles=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
-
-opt_dry_run=false
-opt_finish=:
-opt_duplicate_deps=false
-opt_silent=false
-opt_debug=:
-
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-
-# func_fatal_configuration arg...
-# Echo program name prefixed message to standard error, followed by
-# a configuration failure hint, and exit.
-func_fatal_configuration ()
-{
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
-}
-
-
-# func_config
-# Display the configuration for all the tags in this script.
-func_config ()
-{
-    re_begincf='^# ### BEGIN LIBTOOL'
-    re_endcf='^# ### END LIBTOOL'
-
-    # Default configuration.
-    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
-
-    # Now print the configurations for the tags.
-    for tagname in $taglist; do
-      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
-    done
-
-    exit $?
-}
-
-# func_features
-# Display the features supported by this script.
-func_features ()
-{
-    echo "host: $host"
-    if test "$build_libtool_libs" = yes; then
-      echo "enable shared libraries"
-    else
-      echo "disable shared libraries"
-    fi
-    if test "$build_old_libs" = yes; then
-      echo "enable static libraries"
-    else
-      echo "disable static libraries"
-    fi
-
-    exit $?
-}
-
-# func_enable_tag tagname
-# Verify that TAGNAME is valid, and either flag an error and exit, or
-# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
-# variable here.
-func_enable_tag ()
-{
-  # Global variable:
-  tagname="$1"
-
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
-
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
-
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
-    *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-	taglist="$taglist $tagname"
-
-	# Evaluate the configuration.  Be careful to quote the path
-	# and the sed script, to avoid splitting on whitespace, but
-	# also don't use non-portable quotes within backquotes within
-	# quotes we have to do it in 2 steps:
-	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-	eval "$extractedcf"
-      else
-	func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
-}
-
-# Parse options once, thoroughly.  This comes as soon as possible in
-# the script to make things like `libtool --version' happen quickly.
-{
-
-  # Shorthand for --mode=foo, only valid as the first argument
-  case $1 in
-  clean|clea|cle|cl)
-    shift; set dummy --mode clean ${1+"$@"}; shift
-    ;;
-  compile|compil|compi|comp|com|co|c)
-    shift; set dummy --mode compile ${1+"$@"}; shift
-    ;;
-  execute|execut|execu|exec|exe|ex|e)
-    shift; set dummy --mode execute ${1+"$@"}; shift
-    ;;
-  finish|finis|fini|fin|fi|f)
-    shift; set dummy --mode finish ${1+"$@"}; shift
-    ;;
-  install|instal|insta|inst|ins|in|i)
-    shift; set dummy --mode install ${1+"$@"}; shift
-    ;;
-  link|lin|li|l)
-    shift; set dummy --mode link ${1+"$@"}; shift
-    ;;
-  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-    shift; set dummy --mode uninstall ${1+"$@"}; shift
-    ;;
-  esac
-
-  # Parse non-mode specific arguments:
-  while test "$#" -gt 0; do
-    opt="$1"
-    shift
-
-    case $opt in
-      --config)		func_config					;;
-
-      --debug)		preserve_args="$preserve_args $opt"
-			func_echo "enabling shell trace mode"
-			opt_debug='set -x'
-			$opt_debug
-			;;
-
-      -dlopen)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			execute_dlfiles="$execute_dlfiles $1"
-			shift
-			;;
-
-      --dry-run | -n)	opt_dry_run=:					;;
-      --features)       func_features					;;
-      --finish)		mode="finish"					;;
-      --no-finish)	opt_finish=false				;;
-
-      --mode)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			case $1 in
-			  # Valid mode arguments:
-			  clean)	;;
-			  compile)	;;
-			  execute)	;;
-			  finish)	;;
-			  install)	;;
-			  link)		;;
-			  relink)	;;
-			  uninstall)	;;
-
-			  # Catch anything else as an error
-			  *) func_error "invalid argument for $opt"
-			     exit_cmd=exit
-			     break
-			     ;;
-		        esac
-
-			mode="$1"
-			shift
-			;;
-
-      --preserve-dup-deps)
-			opt_duplicate_deps=:				;;
-
-      --quiet|--silent)	preserve_args="$preserve_args $opt"
-			opt_silent=:
-			opt_verbose=false
-			;;
-
-      --no-quiet|--no-silent)
-			preserve_args="$preserve_args $opt"
-			opt_silent=false
-			;;
-
-      --verbose| -v)	preserve_args="$preserve_args $opt"
-			opt_silent=false
-			opt_verbose=:
-			;;
-
-      --no-verbose)	preserve_args="$preserve_args $opt"
-			opt_verbose=false
-			;;
-
-      --tag)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			preserve_args="$preserve_args $opt $1"
-			func_enable_tag "$1"	# tagname is set here
-			shift
-			;;
-
-      # Separate optargs to long options:
-      -dlopen=*|--mode=*|--tag=*)
-			func_opt_split "$opt"
-			set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
-			shift
-			;;
-
-      -\?|-h)		func_usage					;;
-      --help)		opt_help=:					;;
-      --help-all)	opt_help=': help-all'				;;
-      --version)	func_version					;;
-
-      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
-
-      *)		nonopt="$opt"
-			break
-			;;
-    esac
-  done
-
-
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* )
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
-      ;;
-  esac
-
-  # Having warned about all mis-specified options, bail out if
-  # anything was wrong.
-  $exit_cmd $EXIT_FAILURE
-}
-
-# func_check_version_match
-# Ensure that we are using m4 macros, and libtool script from the same
-# release of libtool.
-func_check_version_match ()
-{
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from an older release.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      else
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
-$progname: but the definition of this LT_INIT comes from revision $macro_revision.
-$progname: You should recreate aclocal.m4 with macros from revision $package_revision
-$progname: of $PACKAGE $VERSION and run autoconf again.
-_LT_EOF
-    fi
-
-    exit $EXIT_MISMATCH
-  fi
-}
-
-
-## ----------- ##
-##    Main.    ##
-## ----------- ##
-
-$opt_help || {
-  # Sanity checks first:
-  func_check_version_match
-
-  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-    func_fatal_configuration "not configured to build any kind of library"
-  fi
-
-  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
-
-
-  # Darwin sucks
-  eval "std_shrext=\"$shrext_cmds\""
-
-
-  # Only execute mode is allowed to have -dlopen flags.
-  if test -n "$execute_dlfiles" && test "$mode" != execute; then
-    func_error "unrecognized option \`-dlopen'"
-    $ECHO "$help" 1>&2
-    exit $EXIT_FAILURE
-  fi
-
-  # Change the help message to a mode-specific one.
-  generic_help="$help"
-  help="Try \`$progname --help --mode=$mode' for more information."
-}
-
-
-# func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_lalib_p ()
-{
-    test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
-}
-
-# func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function implements the same check as func_lalib_p without
-# resorting to external programs.  To this end, it redirects stdin and
-# closes it afterwards, without saving the original file descriptor.
-# As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
-func_lalib_unsafe_p ()
-{
-    lalib_p=no
-    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
-	for lalib_p_l in 1 2 3 4
-	do
-	    read lalib_p_line
-	    case "$lalib_p_line" in
-		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
-	    esac
-	done
-	exec 0<&5 5<&-
-    fi
-    test "$lalib_p" = yes
-}
-
-# func_ltwrapper_script_p file
-# True iff FILE is a libtool wrapper script
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_script_p ()
-{
-    func_lalib_p "$1"
-}
-
-# func_ltwrapper_executable_p file
-# True iff FILE is a libtool wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_executable_p ()
-{
-    func_ltwrapper_exec_suffix=
-    case $1 in
-    *.exe) ;;
-    *) func_ltwrapper_exec_suffix=.exe ;;
-    esac
-    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
-}
-
-# func_ltwrapper_scriptname file
-# Assumes file is an ltwrapper_executable
-# uses $file to determine the appropriate filename for a
-# temporary ltwrapper_script.
-func_ltwrapper_scriptname ()
-{
-    func_ltwrapper_scriptname_result=""
-    if func_ltwrapper_executable_p "$1"; then
-	func_dirname_and_basename "$1" "" "."
-	func_stripname '' '.exe' "$func_basename_result"
-	func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
-    fi
-}
-
-# func_ltwrapper_p file
-# True iff FILE is a libtool wrapper script or wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_p ()
-{
-    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
-}
-
-
-# func_execute_cmds commands fail_cmd
-# Execute tilde-delimited COMMANDS.
-# If FAIL_CMD is given, eval that upon failure.
-# FAIL_CMD may read-access the current command in variable CMD!
-func_execute_cmds ()
-{
-    $opt_debug
-    save_ifs=$IFS; IFS='~'
-    for cmd in $1; do
-      IFS=$save_ifs
-      eval "cmd=\"$cmd\""
-      func_show_eval "$cmd" "${2-:}"
-    done
-    IFS=$save_ifs
-}
-
-
-# func_source file
-# Source FILE, adding directory component if necessary.
-# Note that it is not necessary on cygwin/mingw to append a dot to
-# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
-# behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
-func_source ()
-{
-    $opt_debug
-    case $1 in
-    */* | *\\*)	. "$1" ;;
-    *)		. "./$1" ;;
-    esac
-}
-
-
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
-{
-    $opt_debug
-    if test -n "$available_tags" && test -z "$tagname"; then
-      CC_quoted=
-      for arg in $CC; do
-        func_quote_for_eval "$arg"
-	CC_quoted="$CC_quoted $func_quote_for_eval_result"
-      done
-      CC_expanded=`func_echo_all $CC`
-      CC_quoted_expanded=`func_echo_all $CC_quoted`
-      case $@ in
-      # Blanks in the command may have been stripped by the calling shell,
-      # but not from the CC environment variable when configure was run.
-      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
-      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
-      # Blanks at the start of $base_compile will cause this to fail
-      # if we don't check for them as well.
-      *)
-	for z in $available_tags; do
-	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
-	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
-	    CC_quoted=
-	    for arg in $CC; do
-	      # Double-quote args containing other shell metacharacters.
-	      func_quote_for_eval "$arg"
-	      CC_quoted="$CC_quoted $func_quote_for_eval_result"
-	    done
-	    CC_expanded=`func_echo_all $CC`
-	    CC_quoted_expanded=`func_echo_all $CC_quoted`
-	    case "$@ " in
-	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
-	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
-	      # The compiler in the base compile command matches
-	      # the one in the tagged configuration.
-	      # Assume this is the tagged configuration we want.
-	      tagname=$z
-	      break
-	      ;;
-	    esac
-	  fi
-	done
-	# If $tagname still isn't set, then no tagged configuration
-	# was found and let the user know that the "--tag" command
-	# line option must be used.
-	if test -z "$tagname"; then
-	  func_echo "unable to infer tagged configuration"
-	  func_fatal_error "specify a tag with \`--tag'"
-#	else
-#	  func_verbose "using $tagname tagged configuration"
-	fi
-	;;
-      esac
-    fi
-}
-
-
-
-# func_write_libtool_object output_name pic_name nonpic_name
-# Create a libtool object file (analogous to a ".la" file),
-# but don't create it if we're doing a dry run.
-func_write_libtool_object ()
-{
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
-    else
-      write_lobj=none
-    fi
-
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
-    else
-      write_oldobj=none
-    fi
-
-    $opt_dry_run || {
-      cat >${write_libobj}T <<EOF
-# $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-pic_object=$write_lobj
-
-# Name of the non-PIC object
-non_pic_object=$write_oldobj
-
-EOF
-      $MV "${write_libobj}T" "${write_libobj}"
-    }
-}
-
-# func_mode_compile arg...
-func_mode_compile ()
-{
-    $opt_debug
-    # Get the compilation command and the source file.
-    base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
-    suppress_opt=yes
-    suppress_output=
-    arg_mode=normal
-    libobj=
-    later=
-    pie_flag=
-
-    for arg
-    do
-      case $arg_mode in
-      arg  )
-	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
-	arg_mode=normal
-	;;
-
-      target )
-	libobj="$arg"
-	arg_mode=normal
-	continue
-	;;
-
-      normal )
-	# Accept any command-line options.
-	case $arg in
-	-o)
-	  test -n "$libobj" && \
-	    func_fatal_error "you cannot specify \`-o' more than once"
-	  arg_mode=target
-	  continue
-	  ;;
-
-	-pie | -fpie | -fPIE)
-          pie_flag="$pie_flag $arg"
-	  continue
-	  ;;
-
-	-shared | -static | -prefer-pic | -prefer-non-pic)
-	  later="$later $arg"
-	  continue
-	  ;;
-
-	-no-suppress)
-	  suppress_opt=no
-	  continue
-	  ;;
-
-	-Xcompiler)
-	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
-	  continue      #  The current "srcfile" will either be retained or
-	  ;;            #  replaced later.  I would guess that would be a bug.
-
-	-Wc,*)
-	  func_stripname '-Wc,' '' "$arg"
-	  args=$func_stripname_result
-	  lastarg=
-	  save_ifs="$IFS"; IFS=','
-	  for arg in $args; do
-	    IFS="$save_ifs"
-	    func_quote_for_eval "$arg"
-	    lastarg="$lastarg $func_quote_for_eval_result"
-	  done
-	  IFS="$save_ifs"
-	  func_stripname ' ' '' "$lastarg"
-	  lastarg=$func_stripname_result
-
-	  # Add the arguments to base_compile.
-	  base_compile="$base_compile $lastarg"
-	  continue
-	  ;;
-
-	*)
-	  # Accept the current argument as the source file.
-	  # The previous "srcfile" becomes the current argument.
-	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
-	  ;;
-	esac  #  case $arg
-	;;
-      esac    #  case $arg_mode
-
-      # Aesthetically quote the previous argument.
-      func_quote_for_eval "$lastarg"
-      base_compile="$base_compile $func_quote_for_eval_result"
-    done # for arg
-
-    case $arg_mode in
-    arg)
-      func_fatal_error "you must specify an argument for -Xcompile"
-      ;;
-    target)
-      func_fatal_error "you must specify a target with \`-o'"
-      ;;
-    *)
-      # Get the name of the library object.
-      test -z "$libobj" && {
-	func_basename "$srcfile"
-	libobj="$func_basename_result"
-      }
-      ;;
-    esac
-
-    # Recognize several different file suffixes.
-    # If the user specifies -o file.o, it is replaced with file.lo
-    case $libobj in
-    *.[cCFSifmso] | \
-    *.ada | *.adb | *.ads | *.asm | \
-    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
-    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
-      func_xform "$libobj"
-      libobj=$func_xform_result
-      ;;
-    esac
-
-    case $libobj in
-    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
-    *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
-      ;;
-    esac
-
-    func_infer_tag $base_compile
-
-    for arg in $later; do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	continue
-	;;
-
-      -static)
-	build_libtool_libs=no
-	build_old_libs=yes
-	continue
-	;;
-
-      -prefer-pic)
-	pic_mode=yes
-	continue
-	;;
-
-      -prefer-non-pic)
-	pic_mode=no
-	continue
-	;;
-      esac
-    done
-
-    func_quote_for_eval "$libobj"
-    test "X$libobj" != "X$func_quote_for_eval_result" \
-      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
-    func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
-
-    test -z "$base_compile" && \
-      func_fatal_help "you must specify a compilation command"
-
-    # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
-      removelist="$obj $lobj $libobj ${libobj}T"
-    else
-      removelist="$lobj $libobj ${libobj}T"
-    fi
-
-    # On Cygwin there's no "real" PIC flag so we must build both object types
-    case $host_os in
-    cygwin* | mingw* | pw32* | os2* | cegcc*)
-      pic_mode=default
-      ;;
-    esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
-      # non-PIC code in shared libraries is not supported
-      pic_mode=default
-    fi
-
-    # Calculate the filename of the output object if compiler does
-    # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
-    else
-      output_obj=
-      need_locks=no
-      lockfile=
-    fi
-
-    # Lock this critical section if it is needed
-    # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    elif test "$need_locks" = warn; then
-      if test -f "$lockfile"; then
-	$ECHO "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-      removelist="$removelist $output_obj"
-      $ECHO "$srcfile" > "$lockfile"
-    fi
-
-    $opt_dry_run || $RM $removelist
-    removelist="$removelist $lockfile"
-    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
-
-    if test -n "$fix_srcfile_path"; then
-      eval "srcfile=\"$fix_srcfile_path\""
-    fi
-    func_quote_for_eval "$srcfile"
-    qsrcfile=$func_quote_for_eval_result
-
-    # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
-      # Without this assignment, base_compile gets emptied.
-      fbsd_hideous_sh_bug=$base_compile
-
-      if test "$pic_mode" != no; then
-	command="$base_compile $qsrcfile $pic_flag"
-      else
-	# Don't build PIC code
-	command="$base_compile $qsrcfile"
-      fi
-
-      func_mkdir_p "$xdir$objdir"
-
-      if test -z "$output_obj"; then
-	# Place PIC objects in $objdir
-	command="$command -o $lobj"
-      fi
-
-      func_show_eval_locale "$command"	\
-          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed, then go on to compile the next one
-      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
-	func_show_eval '$MV "$output_obj" "$lobj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-
-      # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
-	suppress_output=' >/dev/null 2>&1'
-      fi
-    fi
-
-    # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
-	# Don't build PIC code
-	command="$base_compile $qsrcfile$pie_flag"
-      else
-	command="$base_compile $qsrcfile $pic_flag"
-      fi
-      if test "$compiler_c_o" = yes; then
-	command="$command -o $obj"
-      fi
-
-      # Suppress compiler output if we already did a PIC compilation.
-      command="$command$suppress_output"
-      func_show_eval_locale "$command" \
-        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed
-      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
-	func_show_eval '$MV "$output_obj" "$obj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-    fi
-
-    $opt_dry_run || {
-      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
-
-      # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
-	removelist=$lockfile
-        $RM "$lockfile"
-      fi
-    }
-
-    exit $EXIT_SUCCESS
-}
-
-$opt_help || {
-  test "$mode" = compile && func_mode_compile ${1+"$@"}
-}
-
-func_mode_help ()
-{
-    # We need to display help for each of the modes.
-    case $mode in
-      "")
-        # Generic help is extracted from the usage comments
-        # at the start of this file.
-        func_help
-        ;;
-
-      clean)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      compile)
-      $ECHO \
-"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
-  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
-  -no-suppress      do not suppress compiler output for multiple passes
-  -prefer-pic       try to building PIC objects only
-  -prefer-non-pic   try to building non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
-  -Wc,FLAG          pass FLAG directly to the compiler
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
-        ;;
-
-      execute)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
-  -dlopen FILE      add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
-        ;;
-
-      finish)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
-        ;;
-
-      install)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
-
-The following components of INSTALL-COMMAND are treated specially:
-
-  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
-        ;;
-
-      link)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
-  -all-static       do not do any dynamic linking at all
-  -avoid-version    do not add a version suffix if possible
-  -bindir BINDIR    specify path to binaries directory (for systems where
-                    libraries must be found in the PATH setting at runtime)
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
-  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
-  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-  -export-symbols SYMFILE
-                    try to export only the symbols listed in SYMFILE
-  -export-symbols-regex REGEX
-                    try to export only the symbols matching REGEX
-  -LLIBDIR          search LIBDIR for required installed libraries
-  -lNAME            OUTPUT-FILE requires the installed library libNAME
-  -module           build a library that can dlopened
-  -no-fast-install  disable the fast-install mode
-  -no-install       link a not-installable executable
-  -no-undefined     declare that a library does not refer to external symbols
-  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
-  -precious-files-regex REGEX
-                    don't remove output files matching REGEX
-  -release RELEASE  specify package release information
-  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
-  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
-  -shared           only do dynamic linking of libtool libraries
-  -shrext SUFFIX    override the standard shared library file extension
-  -static           do not do any dynamic linking of uninstalled libtool libraries
-  -static-libtool-libs
-                    do not do any dynamic linking of libtool libraries
-  -version-info CURRENT[:REVISION[:AGE]]
-                    specify library version info [each variable defaults to 0]
-  -weak LIBNAME     declare that the target provides the LIBNAME interface
-  -Wc,FLAG
-  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
-  -Wl,FLAG
-  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
-  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename.  Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
-        ;;
-
-      uninstall)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      *)
-        func_fatal_help "invalid operation mode \`$mode'"
-        ;;
-    esac
-
-    echo
-    $ECHO "Try \`$progname --help' for more information about other modes."
-}
-
-# Now that we've collected a possible --mode arg, show help if necessary
-if $opt_help; then
-  if test "$opt_help" = :; then
-    func_mode_help
-  else
-    {
-      func_help noexit
-      for mode in compile link execute install finish uninstall clean; do
-	func_mode_help
-      done
-    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
-    {
-      func_help noexit
-      for mode in compile link execute install finish uninstall clean; do
-	echo
-	func_mode_help
-      done
-    } |
-    sed '1d
-      /^When reporting/,/^Report/{
-	H
-	d
-      }
-      $x
-      /information about other modes/d
-      /more detailed .*MODE/d
-      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
-  fi
-  exit $?
-fi
-
-
-# func_mode_execute arg...
-func_mode_execute ()
-{
-    $opt_debug
-    # The first argument is the command name.
-    cmd="$nonopt"
-    test -z "$cmd" && \
-      func_fatal_help "you must specify a COMMAND"
-
-    # Handle -dlopen flags immediately.
-    for file in $execute_dlfiles; do
-      test -f "$file" \
-	|| func_fatal_help "\`$file' is not a file"
-
-      dir=
-      case $file in
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$lib' is not a valid libtool archive"
-
-	# Read the libtool library.
-	dlname=
-	library_names=
-	func_source "$file"
-
-	# Skip this library if it cannot be dlopened.
-	if test -z "$dlname"; then
-	  # Warn if it was a shared library.
-	  test -n "$library_names" && \
-	    func_warning "\`$file' was not linked with \`-export-dynamic'"
-	  continue
-	fi
-
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-
-	if test -f "$dir/$objdir/$dlname"; then
-	  dir="$dir/$objdir"
-	else
-	  if test ! -f "$dir/$dlname"; then
-	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
-	  fi
-	fi
-	;;
-
-      *.lo)
-	# Just add the directory containing the .lo file.
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-	;;
-
-      *)
-	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
-	continue
-	;;
-      esac
-
-      # Get the absolute pathname.
-      absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
-
-      # Now add the directory to shlibpath_var.
-      if eval test -z \"\$$shlibpath_var\"; then
-	eval $shlibpath_var=\$dir
-      else
-	eval $shlibpath_var=\$dir:\$$shlibpath_var
-      fi
-    done
-
-    # This variable tells wrapper scripts just to set shlibpath_var
-    # rather than running their programs.
-    libtool_execute_magic="$magic"
-
-    # Check if any of the arguments is a wrapper script.
-    args=
-    for file
-    do
-      case $file in
-      -* | *.la | *.lo ) ;;
-      *)
-	# Do a test to see if this is really a libtool program.
-	if func_ltwrapper_script_p "$file"; then
-	  func_source "$file"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	elif func_ltwrapper_executable_p "$file"; then
-	  func_ltwrapper_scriptname "$file"
-	  func_source "$func_ltwrapper_scriptname_result"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	fi
-	;;
-      esac
-      # Quote arguments (to preserve shell metacharacters).
-      func_quote_for_eval "$file"
-      args="$args $func_quote_for_eval_result"
-    done
-
-    if test "X$opt_dry_run" = Xfalse; then
-      if test -n "$shlibpath_var"; then
-	# Export the shlibpath_var.
-	eval "export $shlibpath_var"
-      fi
-
-      # Restore saved environment variables
-      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-      do
-	eval "if test \"\${save_$lt_var+set}\" = set; then
-                $lt_var=\$save_$lt_var; export $lt_var
-	      else
-		$lt_unset $lt_var
-	      fi"
-      done
-
-      # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-	echo "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = execute && func_mode_execute ${1+"$@"}
-
-
-# func_mode_finish arg...
-func_mode_finish ()
-{
-    $opt_debug
-    libdirs="$nonopt"
-    admincmds=
-
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for dir
-      do
-	libdirs="$libdirs $dir"
-      done
-
-      for libdir in $libdirs; do
-	if test -n "$finish_cmds"; then
-	  # Do each command in the finish commands.
-	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
-'"$cmd"'"'
-	fi
-	if test -n "$finish_eval"; then
-	  # Do the single finish_eval.
-	  eval cmds=\"$finish_eval\"
-	  $opt_dry_run || eval "$cmds" || admincmds="$admincmds
-       $cmds"
-	fi
-      done
-    fi
-
-    # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
-
-    echo "----------------------------------------------------------------------"
-    echo "Libraries have been installed in:"
-    for libdir in $libdirs; do
-      $ECHO "   $libdir"
-    done
-    echo
-    echo "If you ever happen to want to link against installed libraries"
-    echo "in a given directory, LIBDIR, you must either use libtool, and"
-    echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
-    echo "flag during linking and do at least one of the following:"
-    if test -n "$shlibpath_var"; then
-      echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-      echo "     during execution"
-    fi
-    if test -n "$runpath_var"; then
-      echo "   - add LIBDIR to the \`$runpath_var' environment variable"
-      echo "     during linking"
-    fi
-    if test -n "$hardcode_libdir_flag_spec"; then
-      libdir=LIBDIR
-      eval "flag=\"$hardcode_libdir_flag_spec\""
-
-      $ECHO "   - use the \`$flag' linker flag"
-    fi
-    if test -n "$admincmds"; then
-      $ECHO "   - have your system administrator run these commands:$admincmds"
-    fi
-    if test -f /etc/ld.so.conf; then
-      echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-    fi
-    echo
-
-    echo "See any operating system documentation about shared libraries for"
-    case $host in
-      solaris2.[6789]|solaris2.1[0-9])
-        echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
-	echo "pages."
-	;;
-      *)
-        echo "more information, such as the ld(1) and ld.so(8) manual pages."
-        ;;
-    esac
-    echo "----------------------------------------------------------------------"
-    exit $EXIT_SUCCESS
-}
-
-test "$mode" = finish && func_mode_finish ${1+"$@"}
-
-
-# func_mode_install arg...
-func_mode_install ()
-{
-    $opt_debug
-    # There may be an optional sh(1) argument at the beginning of
-    # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
-       # Allow the use of GNU shtool's install command.
-       case $nonopt in *shtool*) :;; *) false;; esac; then
-      # Aesthetically quote it.
-      func_quote_for_eval "$nonopt"
-      install_prog="$func_quote_for_eval_result "
-      arg=$1
-      shift
-    else
-      install_prog=
-      arg=$nonopt
-    fi
-
-    # The real first argument should be the name of the installation program.
-    # Aesthetically quote it.
-    func_quote_for_eval "$arg"
-    install_prog="$install_prog$func_quote_for_eval_result"
-    install_shared_prog=$install_prog
-    case " $install_prog " in
-      *[\\\ /]cp\ *) install_cp=: ;;
-      *) install_cp=false ;;
-    esac
-
-    # We need to accept at least all the BSD install flags.
-    dest=
-    files=
-    opts=
-    prev=
-    install_type=
-    isdir=no
-    stripme=
-    no_mode=:
-    for arg
-    do
-      arg2=
-      if test -n "$dest"; then
-	files="$files $dest"
-	dest=$arg
-	continue
-      fi
-
-      case $arg in
-      -d) isdir=yes ;;
-      -f)
-	if $install_cp; then :; else
-	  prev=$arg
-	fi
-	;;
-      -g | -m | -o)
-	prev=$arg
-	;;
-      -s)
-	stripme=" -s"
-	continue
-	;;
-      -*)
-	;;
-      *)
-	# If the previous option needed an argument, then skip it.
-	if test -n "$prev"; then
-	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
-	    arg2=$install_override_mode
-	    no_mode=false
-	  fi
-	  prev=
-	else
-	  dest=$arg
-	  continue
-	fi
-	;;
-      esac
-
-      # Aesthetically quote the argument.
-      func_quote_for_eval "$arg"
-      install_prog="$install_prog $func_quote_for_eval_result"
-      if test -n "$arg2"; then
-	func_quote_for_eval "$arg2"
-      fi
-      install_shared_prog="$install_shared_prog $func_quote_for_eval_result"
-    done
-
-    test -z "$install_prog" && \
-      func_fatal_help "you must specify an install program"
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
-
-    if test -n "$install_override_mode" && $no_mode; then
-      if $install_cp; then :; else
-	func_quote_for_eval "$install_override_mode"
-	install_shared_prog="$install_shared_prog -m $func_quote_for_eval_result"
-      fi
-    fi
-
-    if test -z "$files"; then
-      if test -z "$dest"; then
-	func_fatal_help "no file or destination specified"
-      else
-	func_fatal_help "you must specify a destination"
-      fi
-    fi
-
-    # Strip any trailing slash from the destination.
-    func_stripname '' '/' "$dest"
-    dest=$func_stripname_result
-
-    # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
-      destname=
-    else
-      func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
-
-      # Not a directory, so check to see that there is only one file specified.
-      set dummy $files; shift
-      test "$#" -gt 1 && \
-	func_fatal_help "\`$dest' is not a directory"
-    fi
-    case $destdir in
-    [\\/]* | [A-Za-z]:[\\/]*) ;;
-    *)
-      for file in $files; do
-	case $file in
-	*.lo) ;;
-	*)
-	  func_fatal_help "\`$destdir' must be an absolute directory name"
-	  ;;
-	esac
-      done
-      ;;
-    esac
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    staticlibs=
-    future_libdirs=
-    current_libdirs=
-    for file in $files; do
-
-      # Do each installation.
-      case $file in
-      *.$libext)
-	# Do the static libraries later.
-	staticlibs="$staticlibs $file"
-	;;
-
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$file' is not a valid libtool archive"
-
-	library_names=
-	old_library=
-	relink_command=
-	func_source "$file"
-
-	# Add the libdir to current_libdirs if it is the destination.
-	if test "X$destdir" = "X$libdir"; then
-	  case "$current_libdirs " in
-	  *" $libdir "*) ;;
-	  *) current_libdirs="$current_libdirs $libdir" ;;
-	  esac
-	else
-	  # Note the libdir as a future libdir.
-	  case "$future_libdirs " in
-	  *" $libdir "*) ;;
-	  *) future_libdirs="$future_libdirs $libdir" ;;
-	  esac
-	fi
-
-	func_dirname "$file" "/" ""
-	dir="$func_dirname_result"
-	dir="$dir$objdir"
-
-	if test -n "$relink_command"; then
-	  # Determine the prefix the user has applied to our future dir.
-	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
-
-	  # Don't allow the user to place us outside of our expected
-	  # location b/c this prevents finding dependent libraries that
-	  # are installed to the same prefix.
-	  # At present, this check doesn't affect windows .dll's that
-	  # are installed into $libdir/../bin (currently, that works fine)
-	  # but it's something to keep an eye on.
-	  test "$inst_prefix_dir" = "$destdir" && \
-	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
-
-	  if test -n "$inst_prefix_dir"; then
-	    # Stick the inst_prefix_dir data into the link command.
-	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
-	  else
-	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
-	  fi
-
-	  func_warning "relinking \`$file'"
-	  func_show_eval "$relink_command" \
-	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
-	fi
-
-	# See the names of the shared library.
-	set dummy $library_names; shift
-	if test -n "$1"; then
-	  realname="$1"
-	  shift
-
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
-
-	  # Install the shared library and build the symlinks.
-	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
-	      'exit $?'
-	  tstripme="$stripme"
-	  case $host_os in
-	  cygwin* | mingw* | pw32* | cegcc*)
-	    case $realname in
-	    *.dll.a)
-	      tstripme=""
-	      ;;
-	    esac
-	    ;;
-	  esac
-	  if test -n "$tstripme" && test -n "$striplib"; then
-	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
-	  fi
-
-	  if test "$#" -gt 0; then
-	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
-	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
-	    # so we also need to try rm && ln -s.
-	    for linkname
-	    do
-	      test "$linkname" != "$realname" \
-		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
-	    done
-	  fi
-
-	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
-	  func_execute_cmds "$postinstall_cmds" 'exit $?'
-	fi
-
-	# Install the pseudo-library for information purposes.
-	func_basename "$file"
-	name="$func_basename_result"
-	instname="$dir/$name"i
-	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
-
-	# Maybe install the static library, too.
-	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
-	;;
-
-      *.lo)
-	# Install (i.e. copy) a libtool object.
-
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# Deduce the name of the destination old-style object file.
-	case $destfile in
-	*.lo)
-	  func_lo2o "$destfile"
-	  staticdest=$func_lo2o_result
-	  ;;
-	*.$objext)
-	  staticdest="$destfile"
-	  destfile=
-	  ;;
-	*)
-	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
-	  ;;
-	esac
-
-	# Install the libtool object if requested.
-	test -n "$destfile" && \
-	  func_show_eval "$install_prog $file $destfile" 'exit $?'
-
-	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
-	  # Deduce the name of the old-style object file.
-	  func_lo2o "$file"
-	  staticobj=$func_lo2o_result
-	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
-	fi
-	exit $EXIT_SUCCESS
-	;;
-
-      *)
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# If the file is missing, and there is a .exe on the end, strip it
-	# because it is most likely a libtool script we actually want to
-	# install
-	stripped_ext=""
-	case $file in
-	  *.exe)
-	    if test ! -f "$file"; then
-	      func_stripname '' '.exe' "$file"
-	      file=$func_stripname_result
-	      stripped_ext=".exe"
-	    fi
-	    ;;
-	esac
-
-	# Do a test to see if this is really a libtool program.
-	case $host in
-	*cygwin* | *mingw*)
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      wrapper=$func_ltwrapper_scriptname_result
-	    else
-	      func_stripname '' '.exe' "$file"
-	      wrapper=$func_stripname_result
-	    fi
-	    ;;
-	*)
-	    wrapper=$file
-	    ;;
-	esac
-	if func_ltwrapper_script_p "$wrapper"; then
-	  notinst_deplibs=
-	  relink_command=
-
-	  func_source "$wrapper"
-
-	  # Check the variables that should have been set.
-	  test -z "$generated_by_libtool_version" && \
-	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
-
-	  finalize=yes
-	  for lib in $notinst_deplibs; do
-	    # Check to see that each library is installed.
-	    libdir=
-	    if test -f "$lib"; then
-	      func_source "$lib"
-	    fi
-	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
-	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      func_warning "\`$lib' has not been installed in \`$libdir'"
-	      finalize=no
-	    fi
-	  done
-
-	  relink_command=
-	  func_source "$wrapper"
-
-	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
-	    $opt_dry_run || {
-	      if test "$finalize" = yes; then
-	        tmpdir=`func_mktempdir`
-		func_basename "$file$stripped_ext"
-		file="$func_basename_result"
-	        outputname="$tmpdir/$file"
-	        # Replace the output file specification.
-	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
-
-	        $opt_silent || {
-	          func_quote_for_expand "$relink_command"
-		  eval "func_echo $func_quote_for_expand_result"
-	        }
-	        if eval "$relink_command"; then :
-	          else
-		  func_error "error: relink \`$file' with the above command before installing it"
-		  $opt_dry_run || ${RM}r "$tmpdir"
-		  continue
-	        fi
-	        file="$outputname"
-	      else
-	        func_warning "cannot relink \`$file'"
-	      fi
-	    }
-	  else
-	    # Install the binary that we compiled earlier.
-	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
-	  fi
-	fi
-
-	# remove .exe since cygwin /usr/bin/install will append another
-	# one anyway
-	case $install_prog,$host in
-	*/usr/bin/install*,*cygwin*)
-	  case $file:$destfile in
-	  *.exe:*.exe)
-	    # this is ok
-	    ;;
-	  *.exe:*)
-	    destfile=$destfile.exe
-	    ;;
-	  *:*.exe)
-	    func_stripname '' '.exe' "$destfile"
-	    destfile=$func_stripname_result
-	    ;;
-	  esac
-	  ;;
-	esac
-	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
-	$opt_dry_run || if test -n "$outputname"; then
-	  ${RM}r "$tmpdir"
-	fi
-	;;
-      esac
-    done
-
-    for file in $staticlibs; do
-      func_basename "$file"
-      name="$func_basename_result"
-
-      # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
-
-      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
-
-      if test -n "$stripme" && test -n "$old_striplib"; then
-	func_show_eval "$old_striplib $oldlib" 'exit $?'
-      fi
-
-      # Do each command in the postinstall commands.
-      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
-    done
-
-    test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
-
-    if test -n "$current_libdirs" && $opt_finish; then
-      # Maybe just do a dry run.
-      $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
-    else
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = install && func_mode_install ${1+"$@"}
-
-
-# func_generate_dlsyms outputname originator pic_p
-# Extract symbols from dlprefiles and create ${outputname}S.o with
-# a dlpreopen symbol table.
-func_generate_dlsyms ()
-{
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
-    my_dlsyms=
-
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-      if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	my_dlsyms="${my_outputname}S.c"
-      else
-	func_error "not configured to extract global symbols from dlpreopened files"
-      fi
-    fi
-
-    if test -n "$my_dlsyms"; then
-      case $my_dlsyms in
-      "") ;;
-      *.c)
-	# Discover the nlist of each of the dlfiles.
-	nlist="$output_objdir/${my_outputname}.nm"
-
-	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
-
-	# Parse the name list into a source file.
-	func_verbose "creating $output_objdir/$my_dlsyms"
-
-	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
-#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
-#endif
-
-/* External symbol declarations for the compiler. */\
-"
-
-	if test "$dlself" = yes; then
-	  func_verbose "generating symbol list for \`$output'"
-
-	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
-
-	  # Add our own program objects to the symbol list.
-	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	  for progfile in $progfiles; do
-	    func_verbose "extracting global C symbols from \`$progfile'"
-	    $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
-	  done
-
-	  if test -n "$exclude_expsyms"; then
-	    $opt_dry_run || {
-	      $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	      $MV "$nlist"T "$nlist"
-	    }
-	  fi
-
-	  if test -n "$export_symbols_regex"; then
-	    $opt_dry_run || {
-	      $EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T
-	      $MV "$nlist"T "$nlist"
-	    }
-	  fi
-
-	  # Prepare the list of exported symbols
-	  if test -z "$export_symbols"; then
-	    export_symbols="$output_objdir/$outputname.exp"
-	    $opt_dry_run || {
-	      $RM $export_symbols
-	      ${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' < "$nlist" > "$export_symbols"
-	      case $host in
-	      *cygwin* | *mingw* | *cegcc* )
-                echo EXPORTS > "$output_objdir/$outputname.def"
-                cat "$export_symbols" >> "$output_objdir/$outputname.def"
-	        ;;
-	      esac
-	    }
-	  else
-	    $opt_dry_run || {
-	      ${SED} -e 's/\([].[*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/' < "$export_symbols" > "$output_objdir/$outputname.exp"
-	      $GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T
-	      $MV "$nlist"T "$nlist"
-	      case $host in
-	        *cygwin* | *mingw* | *cegcc* )
-	          echo EXPORTS > "$output_objdir/$outputname.def"
-	          cat "$nlist" >> "$output_objdir/$outputname.def"
-	          ;;
-	      esac
-	    }
-	  fi
-	fi
-
-	for dlprefile in $dlprefiles; do
-	  func_verbose "extracting global C symbols from \`$dlprefile'"
-	  func_basename "$dlprefile"
-	  name="$func_basename_result"
-	  $opt_dry_run || {
-	    $ECHO ": $name " >> "$nlist"
-	    eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
-	  }
-	done
-
-	$opt_dry_run || {
-	  # Make sure we have at least an empty file.
-	  test -f "$nlist" || : > "$nlist"
-
-	  if test -n "$exclude_expsyms"; then
-	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	    $MV "$nlist"T "$nlist"
-	  fi
-
-	  # Try sorting and uniquifying the output.
-	  if $GREP -v "^: " < "$nlist" |
-	      if sort -k 3 </dev/null >/dev/null 2>&1; then
-		sort -k 3
-	      else
-		sort +2
-	      fi |
-	      uniq > "$nlist"S; then
-	    :
-	  else
-	    $GREP -v "^: " < "$nlist" > "$nlist"S
-	  fi
-
-	  if test -f "$nlist"S; then
-	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
-	  else
-	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
-	  fi
-
-	  echo >> "$output_objdir/$my_dlsyms" "\
-
-/* The mapping between symbol names and symbols.  */
-typedef struct {
-  const char *name;
-  void *address;
-} lt_dlsymlist;
-"
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc* )
-	    echo >> "$output_objdir/$my_dlsyms" "\
-/* DATA imports from DLLs on WIN32 con't be const, because
-   runtime relocations are performed -- see ld's documentation
-   on pseudo-relocs.  */"
-	    lt_dlsym_const= ;;
-	  *osf5*)
-	    echo >> "$output_objdir/$my_dlsyms" "\
-/* This system does not cope well with relocations in const data */"
-	    lt_dlsym_const= ;;
-	  *)
-	    lt_dlsym_const=const ;;
-	  esac
-
-	  echo >> "$output_objdir/$my_dlsyms" "\
-extern $lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
-$lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
-
-	  case $need_lib_prefix in
-	  no)
-	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  *)
-	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  esac
-	  echo >> "$output_objdir/$my_dlsyms" "\
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt_${my_prefix}_LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
-	} # !$opt_dry_run
-
-	pic_flag_for_symtable=
-	case "$compile_command " in
-	*" -static "*) ;;
-	*)
-	  case $host in
-	  # compiling the symbol table file with pic_flag works around
-	  # a FreeBSD bug that causes programs to crash when -lm is
-	  # linked before any other PIC object.  But we must not use
-	  # pic_flag when linking with -static.  The problem exists in
-	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
-	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
-	  *-*-hpux*)
-	    pic_flag_for_symtable=" $pic_flag"  ;;
-	  *)
-	    if test "X$my_pic_p" != Xno; then
-	      pic_flag_for_symtable=" $pic_flag"
-	    fi
-	    ;;
-	  esac
-	  ;;
-	esac
-	symtab_cflags=
-	for arg in $LTCFLAGS; do
-	  case $arg in
-	  -pie | -fpie | -fPIE) ;;
-	  *) symtab_cflags="$symtab_cflags $arg" ;;
-	  esac
-	done
-
-	# Now compile the dynamic symbol file.
-	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
-
-	# Clean up the generated files.
-	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
-
-	# Transform the symbol file into the correct name.
-	symfileobj="$output_objdir/${my_outputname}S.$objext"
-	case $host in
-	*cygwin* | *mingw* | *cegcc* )
-	  if test -f "$output_objdir/$my_outputname.def"; then
-	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	  else
-	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  fi
-	  ;;
-	*)
-	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  ;;
-	esac
-	;;
-      *)
-	func_fatal_error "unknown suffix for \`$my_dlsyms'"
-	;;
-      esac
-    else
-      # We keep going just in case the user didn't refer to
-      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
-      # really was required.
-
-      # Nullify the symbol file.
-      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
-      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
-    fi
-}
-
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-# Despite the name, also deal with 64 bit binaries.
-func_win32_libid ()
-{
-  $opt_debug
-  win32_libid_type="unknown"
-  win32_fileres=`file -L $1 2>/dev/null`
-  case $win32_fileres in
-  *ar\ archive\ import\ library*) # definitely import
-    win32_libid_type="x86 archive import"
-    ;;
-  *ar\ archive*) # could be an import, or static
-    if $OBJDUMP -f "$1" | $SED -e '10q' 2>/dev/null |
-       $EGREP 'file format (pe-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
-      win32_nmres=`$NM -f posix -A "$1" |
-	$SED -n -e '
-	    1,100{
-		/ I /{
-		    s,.*,import,
-		    p
-		    q
-		}
-	    }'`
-      case $win32_nmres in
-      import*)  win32_libid_type="x86 archive import";;
-      *)        win32_libid_type="x86 archive static";;
-      esac
-    fi
-    ;;
-  *DLL*)
-    win32_libid_type="x86 DLL"
-    ;;
-  *executable*) # but shell scripts are "executable" too...
-    case $win32_fileres in
-    *MS\ Windows\ PE\ Intel*)
-      win32_libid_type="x86 DLL"
-      ;;
-    esac
-    ;;
-  esac
-  $ECHO "$win32_libid_type"
-}
-
-
-
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
-{
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    if test "$lock_old_archive_extraction" = yes; then
-      lockfile=$f_ex_an_ar_oldlib.lock
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    fi
-    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
-		   'stat=$?; rm -f "$lockfile"; exit $stat'
-    if test "$lock_old_archive_extraction" = yes; then
-      $opt_dry_run || rm -f "$lockfile"
-    fi
-    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
-     :
-    else
-      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
-    fi
-}
-
-
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
-{
-    $opt_debug
-    my_gentop="$1"; shift
-    my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
-
-    for my_xlib in $my_oldlibs; do
-      # Extract the objects.
-      case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
-	*) my_xabs=`pwd`"/$my_xlib" ;;
-      esac
-      func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
-      my_xlib_u=$my_xlib
-      while :; do
-        case " $extracted_archives " in
-	*" $my_xlib_u "*)
-	  func_arith $extracted_serial + 1
-	  extracted_serial=$func_arith_result
-	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
-	*) break ;;
-	esac
-      done
-      extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
-
-      func_mkdir_p "$my_xdir"
-
-      case $host in
-      *-darwin*)
-	func_verbose "Extracting $my_xabs"
-	# Do not bother doing anything if just a dry run
-	$opt_dry_run || {
-	  darwin_orig_dir=`pwd`
-	  cd $my_xdir || exit $?
-	  darwin_archive=$my_xabs
-	  darwin_curdir=`pwd`
-	  darwin_base_archive=`basename "$darwin_archive"`
-	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
-	  if test -n "$darwin_arches"; then
-	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
-	    darwin_arch=
-	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
-	      cd "$darwin_curdir"
-	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
-	    done # $darwin_arches
-            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
-	    darwin_file=
-	    darwin_files=
-	    for darwin_file in $darwin_filelist; do
-	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
-	      $LIPO -create -output "$darwin_file" $darwin_files
-	    done # $darwin_filelist
-	    $RM -rf unfat-$$
-	    cd "$darwin_orig_dir"
-	  else
-	    cd $darwin_orig_dir
-	    func_extract_an_archive "$my_xdir" "$my_xabs"
-	  fi # $darwin_arches
-	} # !$opt_dry_run
-	;;
-      *)
-        func_extract_an_archive "$my_xdir" "$my_xabs"
-	;;
-      esac
-      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
-    done
-
-    func_extract_archives_result="$my_oldobjs"
-}
-
-
-# func_emit_wrapper [arg=no]
-#
-# Emit a libtool wrapper script on stdout.
-# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable.  Must ONLY be called from within
-# func_mode_link because it depends on a number of variables
-# set therein.
-#
-# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the $objdir directory.  This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
-{
-	func_emit_wrapper_arg1=${1-no}
-
-	$ECHO "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='$sed_quote_subst'
-
-# Be Bourne compatible
-if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
-  # install mode needs the following variables:
-  generated_by_libtool_version='$macro_version'
-  notinst_deplibs='$notinst_deplibs'
-else
-  # When we are sourced in execute mode, \$file and \$ECHO are already set.
-  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    file=\"\$0\""
-
-    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
-    $ECHO "\
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-    ECHO=\"$qECHO\"
-  fi\
-
-  # Find the directory that this script lives in.
-  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
-  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
-  # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
-  while test -n \"\$file\"; do
-    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
-
-    # If there was a directory component, then change thisdir.
-    if test \"x\$destdir\" != \"x\$file\"; then
-      case \"\$destdir\" in
-      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
-      *) thisdir=\"\$thisdir/\$destdir\" ;;
-      esac
-    fi
-
-    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
-  done
-
-  # Usually 'no', except on cygwin/mingw when embedded into
-  # the cwrapper.
-  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
-  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
-    # special case for '.'
-    if test \"\$thisdir\" = \".\"; then
-      thisdir=\`pwd\`
-    fi
-    # remove .libs from thisdir
-    case \"\$thisdir\" in
-    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
-    $objdir )   thisdir=. ;;
-    esac
-  fi
-
-  # Try to get the absolute directory name.
-  absdir=\`cd \"\$thisdir\" && pwd\`
-  test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
-	if test "$fast_install" = yes; then
-	  $ECHO "\
-  program=lt-'$outputname'$exeext
-  progdir=\"\$thisdir/$objdir\"
-
-  if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
-       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
-    file=\"\$\$-\$program\"
-
-    if test ! -d \"\$progdir\"; then
-      $MKDIR \"\$progdir\"
-    else
-      $RM \"\$progdir/\$file\"
-    fi"
-
-	  $ECHO "\
-
-    # relink executable if necessary
-    if test -n \"\$relink_command\"; then
-      if relink_command_output=\`eval \"\$relink_command\" 2>&1\`; then :
-      else
-	$ECHO \"\$relink_command_output\" >&2
-	$RM \"\$progdir/\$file\"
-	exit 1
-      fi
-    fi
-
-    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
-    { $RM \"\$progdir/\$program\";
-      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
-    $RM \"\$progdir/\$file\"
-  fi"
-	else
-	  $ECHO "\
-  program='$outputname'
-  progdir=\"\$thisdir/$objdir\"
-"
-	fi
-
-	$ECHO "\
-
-  if test -f \"\$progdir/\$program\"; then"
-
-	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-	  $ECHO "\
-    # Add our own library path to $shlibpath_var
-    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
-    # Some systems cannot cope with colon-terminated $shlibpath_var
-    # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
-
-    export $shlibpath_var
-"
-	fi
-
-	# fixup the dll searchpath if we need to.
-	if test -n "$dllsearchpath"; then
-	  $ECHO "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
-	fi
-
-	$ECHO "\
-    if test \"\$libtool_execute_magic\" != \"$magic\"; then
-      # Run the actual program with our arguments.
-"
-	case $host in
-	# Backslashes separate directories on plain windows
-	*-*-mingw | *-*-os2* | *-cegcc*)
-	  $ECHO "\
-      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
-	  ;;
-
-	*)
-	  $ECHO "\
-      exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
-	  ;;
-	esac
-	$ECHO "\
-      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
-      exit 1
-    fi
-  else
-    # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
-    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
-    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
-    exit 1
-  fi
-fi\
-"
-}
-
-
-# func_to_host_path arg
-#
-# Convert paths to host format when used with build tools.
-# Intended for use with "native" mingw (where libtool itself
-# is running under the msys shell), or in the following cross-
-# build environments:
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-# where wine is equipped with the `winepath' executable.
-# In the native mingw case, the (msys) shell automatically
-# converts paths for any non-msys applications it launches,
-# but that facility isn't available from inside the cwrapper.
-# Similar accommodations are necessary for $host mingw and
-# $build cygwin.  Calling this function does no harm for other
-# $host/$build combinations not listed above.
-#
-# ARG is the path (on $build) that should be converted to
-# the proper representation for $host. The result is stored
-# in $func_to_host_path_result.
-func_to_host_path ()
-{
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        case $build in
-          *mingw* ) # actually, msys
-            # awkward: cmd appends spaces to result
-            func_to_host_path_result=`( cmd //c echo "$1" ) 2>/dev/null |
-              $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_path_result=`cygpath -w "$1" |
-	      $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # Unfortunately, winepath does not exit with a non-zero
-            # error code, so we are forced to check the contents of
-            # stdout. On the other hand, if the command is not
-            # found, the shell will set an exit code of 127 and print
-            # *an error message* to stdout. So we must check for both
-            # error code of zero AND non-empty stdout, which explains
-            # the odd construction:
-            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
-            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
-              func_to_host_path_result=`$ECHO "$func_to_host_path_tmp1" |
-                $SED -e "$lt_sed_naive_backslashify"`
-            else
-              # Allow warning below.
-              func_to_host_path_result=
-            fi
-            ;;
-        esac
-        if test -z "$func_to_host_path_result" ; then
-          func_error "Could not determine host path corresponding to"
-          func_error "  \`$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback:
-          func_to_host_path_result="$1"
-        fi
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_path
-
-# func_to_host_pathlist arg
-#
-# Convert pathlists to host format when used with build tools.
-# See func_to_host_path(), above. This function supports the
-# following $build/$host combinations (but does no harm for
-# combinations not listed here):
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-#
-# Path separators are also converted from $build format to
-# $host format. If ARG begins or ends with a path separator
-# character, it is preserved (but converted to $host format)
-# on output.
-#
-# ARG is a pathlist (on $build) that should be converted to
-# the proper representation on $host. The result is stored
-# in $func_to_host_pathlist_result.
-func_to_host_pathlist ()
-{
-  func_to_host_pathlist_result="$1"
-  if test -n "$1"; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        # Remove leading and trailing path separator characters from
-        # ARG. msys behavior is inconsistent here, cygpath turns them
-        # into '.;' and ';.', and winepath ignores them completely.
-	func_stripname : : "$1"
-        func_to_host_pathlist_tmp1=$func_stripname_result
-        case $build in
-          *mingw* ) # Actually, msys.
-            # Awkward: cmd appends spaces to result.
-            func_to_host_pathlist_result=`
-	      ( cmd //c echo "$func_to_host_pathlist_tmp1" ) 2>/dev/null |
-	      $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_pathlist_result=`cygpath -w -p "$func_to_host_pathlist_tmp1" |
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # unfortunately, winepath doesn't convert pathlists
-            func_to_host_pathlist_result=""
-            func_to_host_pathlist_oldIFS=$IFS
-            IFS=:
-            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
-              IFS=$func_to_host_pathlist_oldIFS
-              if test -n "$func_to_host_pathlist_f" ; then
-                func_to_host_path "$func_to_host_pathlist_f"
-                if test -n "$func_to_host_path_result" ; then
-                  if test -z "$func_to_host_pathlist_result" ; then
-                    func_to_host_pathlist_result="$func_to_host_path_result"
-                  else
-                    func_append func_to_host_pathlist_result ";$func_to_host_path_result"
-                  fi
-                fi
-              fi
-            done
-            IFS=$func_to_host_pathlist_oldIFS
-            ;;
-        esac
-        if test -z "$func_to_host_pathlist_result"; then
-          func_error "Could not determine the host path(s) corresponding to"
-          func_error "  \`$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback. This may break if $1 contains DOS-style drive
-          # specifications. The fix is not to complicate the expression
-          # below, but for the user to provide a working wine installation
-          # with winepath so that path translation in the cross-to-mingw
-          # case works properly.
-          lt_replace_pathsep_nix_to_dos="s|:|;|g"
-          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
-            $SED -e "$lt_replace_pathsep_nix_to_dos"`
-        fi
-        # Now, add the leading and trailing path separators back
-        case "$1" in
-          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
-            ;;
-        esac
-        case "$1" in
-          *: ) func_append func_to_host_pathlist_result ";"
-            ;;
-        esac
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_pathlist
-
-# func_emit_cwrapperexe_src
-# emit the source code for a wrapper executable on stdout
-# Must ONLY be called from within func_mode_link because
-# it depends on a number of variable set therein.
-func_emit_cwrapperexe_src ()
-{
-	cat <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-
-   The $output program cannot be directly executed until all the libtool
-   libraries that it depends on are installed.
-
-   This wrapper executable should never be moved out of the build directory.
-   If it is, it will not operate correctly.
-
-   Currently, it simply execs the wrapper *script* "$SHELL $output",
-   but could eventually absorb all of the scripts functionality and
-   exec $objdir/$outputname directly.
-*/
-EOF
-	    cat <<"EOF"
-#ifdef _MSC_VER
-# define _CRT_SECURE_NO_DEPRECATE 1
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef _MSC_VER
-# include <direct.h>
-# include <process.h>
-# include <io.h>
-#else
-# include <unistd.h>
-# include <stdint.h>
-# ifdef __CYGWIN__
-#  include <io.h>
-# endif
-#endif
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-/* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
-# ifdef __STRICT_ANSI__
-int _putenv (const char *);
-# endif
-#elif defined(__CYGWIN__)
-# ifdef __STRICT_ANSI__
-char *realpath (const char *, char *);
-int putenv (char *);
-int setenv (const char *, const char *, int);
-# endif
-/* #elif defined (other platforms) ... */
-#endif
-
-/* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
-# define setmode _setmode
-# define stat    _stat
-# define chmod   _chmod
-# define getcwd  _getcwd
-# define putenv  _putenv
-# define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-#  define _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#elif defined(__MINGW32__)
-# define setmode _setmode
-# define stat    _stat
-# define chmod   _chmod
-# define getcwd  _getcwd
-# define putenv  _putenv
-#elif defined(__CYGWIN__)
-# define HAVE_SETENV
-# define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
-#endif
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
-
-#ifndef S_IXOTH
-# define S_IXOTH 0
-#endif
-#ifndef S_IXGRP
-# define S_IXGRP 0
-#endif
-
-/* path handling portability macros */
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
-
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# define FOPEN_WB "wb"
-# ifndef DIR_SEPARATOR_2
-#  define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-#  define PATH_SEPARATOR_2 ';'
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
-	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
-
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
-
-#ifndef FOPEN_WB
-# define FOPEN_WB "w"
-#endif
-#ifndef _O_BINARY
-# define _O_BINARY 0
-#endif
-
-#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
-
-#undef LTWRAPPER_DEBUGPRINTF
-#if defined LT_DEBUGWRAPPER
-# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
-static void
-ltwrapper_debugprintf (const char *fmt, ...)
-{
-    va_list args;
-    va_start (args, fmt);
-    (void) vfprintf (stderr, fmt, args);
-    va_end (args);
-}
-#else
-# define LTWRAPPER_DEBUGPRINTF(args)
-#endif
-
-const char *program_name = NULL;
-
-void *xmalloc (size_t num);
-char *xstrdup (const char *string);
-const char *base_name (const char *name);
-char *find_executable (const char *wrapper);
-char *chase_symlinks (const char *pathspec);
-int make_executable (const char *path);
-int check_executable (const char *path);
-char *strendzap (char *str, const char *pat);
-void lt_fatal (const char *message, ...);
-void lt_setenv (const char *name, const char *value);
-char *lt_extend_str (const char *orig_value, const char *add, int to_end);
-void lt_update_exe_path (const char *name, const char *value);
-void lt_update_lib_path (const char *name, const char *value);
-char **prepare_spawn (char **argv);
-void lt_dump_script (FILE *f);
-EOF
-
-	    cat <<EOF
-const char * MAGIC_EXE = "$magic_exe";
-const char * LIB_PATH_VARNAME = "$shlibpath_var";
-EOF
-
-	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-              func_to_host_pathlist "$temp_rpath"
-	      cat <<EOF
-const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * LIB_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test -n "$dllsearchpath"; then
-              func_to_host_pathlist "$dllsearchpath:"
-	      cat <<EOF
-const char * EXE_PATH_VARNAME = "PATH";
-const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * EXE_PATH_VARNAME = "";
-const char * EXE_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test "$fast_install" = yes; then
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
-EOF
-	    else
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
-EOF
-	    fi
-
-
-	    cat <<"EOF"
-
-#define LTWRAPPER_OPTION_PREFIX         "--lt-"
-#define LTWRAPPER_OPTION_PREFIX_LENGTH  5
-
-static const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;
-static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
-
-static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
-
-int
-main (int argc, char *argv[])
-{
-  char **newargz;
-  int  newargc;
-  char *tmp_pathspec;
-  char *actual_cwrapper_path;
-  char *actual_cwrapper_name;
-  char *target_name;
-  char *lt_argv_zero;
-  intptr_t rval = 127;
-
-  int i;
-
-  program_name = (char *) xstrdup (base_name (argv[0]));
-  LTWRAPPER_DEBUGPRINTF (("(main) argv[0]      : %s\n", argv[0]));
-  LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
-
-  /* very simple arg parsing; don't want to rely on getopt */
-  for (i = 1; i < argc; i++)
-    {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
-	{
-EOF
-	    case "$host" in
-	      *mingw* | *cygwin* )
-		# make stdout use "unix" line endings
-		echo "          setmode(1,_O_BINARY);"
-		;;
-	      esac
-
-	    cat <<"EOF"
-	  lt_dump_script (stdout);
-	  return 0;
-	}
-    }
-
-  newargz = XMALLOC (char *, argc + 1);
-  tmp_pathspec = find_executable (argv[0]);
-  if (tmp_pathspec == NULL)
-    lt_fatal ("Couldn't find %s", argv[0]);
-  LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
-			  tmp_pathspec));
-
-  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
-  LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
-			  actual_cwrapper_path));
-  XFREE (tmp_pathspec);
-
-  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
-  strendzap (actual_cwrapper_path, actual_cwrapper_name);
-
-  /* wrapper name transforms */
-  strendzap (actual_cwrapper_name, ".exe");
-  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
-  XFREE (actual_cwrapper_name);
-  actual_cwrapper_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  /* target_name transforms -- use actual target program name; might have lt- prefix */
-  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
-  strendzap (target_name, ".exe");
-  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
-  XFREE (target_name);
-  target_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
-			  target_name));
-EOF
-
-	    cat <<EOF
-  newargz[0] =
-    XMALLOC (char, (strlen (actual_cwrapper_path) +
-		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
-  strcpy (newargz[0], actual_cwrapper_path);
-  strcat (newargz[0], "$objdir");
-  strcat (newargz[0], "/");
-EOF
-
-	    cat <<"EOF"
-  /* stop here, and copy so we don't have to do this twice */
-  tmp_pathspec = xstrdup (newargz[0]);
-
-  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
-  strcat (newargz[0], actual_cwrapper_name);
-
-  /* DO want the lt- prefix here if it exists, so use target_name */
-  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
-  XFREE (tmp_pathspec);
-  tmp_pathspec = NULL;
-EOF
-
-	    case $host_os in
-	      mingw*)
-	    cat <<"EOF"
-  {
-    char* p;
-    while ((p = strchr (newargz[0], '\\')) != NULL)
-      {
-	*p = '/';
-      }
-    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
-      {
-	*p = '/';
-      }
-  }
-EOF
-	    ;;
-	    esac
-
-	    cat <<"EOF"
-  XFREE (target_name);
-  XFREE (actual_cwrapper_path);
-  XFREE (actual_cwrapper_name);
-
-  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
-  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
-  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
-  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
-
-  newargc=0;
-  for (i = 1; i < argc; i++)
-    {
-      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
-        {
-          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
-             namespace, but it is not one of the ones we know about and
-             have already dealt with, above (inluding dump-script), then
-             report an error. Otherwise, targets might begin to believe
-             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
-             namespace. The first time any user complains about this, we'll
-             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
-             or a configure.ac-settable value.
-           */
-          lt_fatal ("Unrecognized option in %s namespace: '%s'",
-                    ltwrapper_option_prefix, argv[i]);
-        }
-      /* otherwise ... */
-      newargz[++newargc] = xstrdup (argv[i]);
-    }
-  newargz[++newargc] = NULL;
-
-  LTWRAPPER_DEBUGPRINTF     (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
-  for (i = 0; i < newargc; i++)
-    {
-      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
-    }
-
-EOF
-
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-  /* execv doesn't actually work on mingw as expected on unix */
-  newargz = prepare_spawn (newargz);
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
-  if (rval == -1)
-    {
-      /* failed to start process */
-      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
-      return 127;
-    }
-  return rval;
-EOF
-		;;
-	      *)
-		cat <<"EOF"
-  execv (lt_argv_zero, newargz);
-  return rval; /* =127, but avoids unused variable warning */
-EOF
-		;;
-	    esac
-
-	    cat <<"EOF"
-}
-
-void *
-xmalloc (size_t num)
-{
-  void *p = (void *) malloc (num);
-  if (!p)
-    lt_fatal ("Memory exhausted");
-
-  return p;
-}
-
-char *
-xstrdup (const char *string)
-{
-  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
-			  string) : NULL;
-}
-
-const char *
-base_name (const char *name)
-{
-  const char *base;
-
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  /* Skip over the disk name in MSDOS pathnames. */
-  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
-    name += 2;
-#endif
-
-  for (base = name; *name; name++)
-    if (IS_DIR_SEPARATOR (*name))
-      base = name + 1;
-  return base;
-}
-
-int
-check_executable (const char *path)
-{
-  struct stat st;
-
-  LTWRAPPER_DEBUGPRINTF (("(check_executable)  : %s\n",
-			  path ? (*path ? path : "EMPTY!") : "NULL!"));
-  if ((!path) || (!*path))
-    return 0;
-
-  if ((stat (path, &st) >= 0)
-      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
-    return 1;
-  else
-    return 0;
-}
-
-int
-make_executable (const char *path)
-{
-  int rval = 0;
-  struct stat st;
-
-  LTWRAPPER_DEBUGPRINTF (("(make_executable)   : %s\n",
-			  path ? (*path ? path : "EMPTY!") : "NULL!"));
-  if ((!path) || (!*path))
-    return 0;
-
-  if (stat (path, &st) >= 0)
-    {
-      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
-    }
-  return rval;
-}
-
-/* Searches for the full path of the wrapper.  Returns
-   newly allocated full path name if found, NULL otherwise
-   Does not chase symlinks, even on platforms that support them.
-*/
-char *
-find_executable (const char *wrapper)
-{
-  int has_slash = 0;
-  const char *p;
-  const char *p_next;
-  /* static buffer for getcwd */
-  char tmp[LT_PATHMAX + 1];
-  int tmp_len;
-  char *concat_name;
-
-  LTWRAPPER_DEBUGPRINTF (("(find_executable)   : %s\n",
-			  wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
-
-  if ((wrapper == NULL) || (*wrapper == '\0'))
-    return NULL;
-
-  /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
-    {
-      concat_name = xstrdup (wrapper);
-      if (check_executable (concat_name))
-	return concat_name;
-      XFREE (concat_name);
-    }
-  else
-    {
-#endif
-      if (IS_DIR_SEPARATOR (wrapper[0]))
-	{
-	  concat_name = xstrdup (wrapper);
-	  if (check_executable (concat_name))
-	    return concat_name;
-	  XFREE (concat_name);
-	}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-    }
-#endif
-
-  for (p = wrapper; *p; p++)
-    if (*p == '/')
-      {
-	has_slash = 1;
-	break;
-      }
-  if (!has_slash)
-    {
-      /* no slashes; search PATH */
-      const char *path = getenv ("PATH");
-      if (path != NULL)
-	{
-	  for (p = path; *p; p = p_next)
-	    {
-	      const char *q;
-	      size_t p_len;
-	      for (q = p; *q; q++)
-		if (IS_PATH_SEPARATOR (*q))
-		  break;
-	      p_len = q - p;
-	      p_next = (*q == '\0' ? q : q + 1);
-	      if (p_len == 0)
-		{
-		  /* empty path: current directory */
-		  if (getcwd (tmp, LT_PATHMAX) == NULL)
-		    lt_fatal ("getcwd failed");
-		  tmp_len = strlen (tmp);
-		  concat_name =
-		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, tmp, tmp_len);
-		  concat_name[tmp_len] = '/';
-		  strcpy (concat_name + tmp_len + 1, wrapper);
-		}
-	      else
-		{
-		  concat_name =
-		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, p, p_len);
-		  concat_name[p_len] = '/';
-		  strcpy (concat_name + p_len + 1, wrapper);
-		}
-	      if (check_executable (concat_name))
-		return concat_name;
-	      XFREE (concat_name);
-	    }
-	}
-      /* not found in PATH; assume curdir */
-    }
-  /* Relative path | not found in path: prepend cwd */
-  if (getcwd (tmp, LT_PATHMAX) == NULL)
-    lt_fatal ("getcwd failed");
-  tmp_len = strlen (tmp);
-  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-  memcpy (concat_name, tmp, tmp_len);
-  concat_name[tmp_len] = '/';
-  strcpy (concat_name + tmp_len + 1, wrapper);
-
-  if (check_executable (concat_name))
-    return concat_name;
-  XFREE (concat_name);
-  return NULL;
-}
-
-char *
-chase_symlinks (const char *pathspec)
-{
-#ifndef S_ISLNK
-  return xstrdup (pathspec);
-#else
-  char buf[LT_PATHMAX];
-  struct stat s;
-  char *tmp_pathspec = xstrdup (pathspec);
-  char *p;
-  int has_symlinks = 0;
-  while (strlen (tmp_pathspec) && !has_symlinks)
-    {
-      LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
-			      tmp_pathspec));
-      if (lstat (tmp_pathspec, &s) == 0)
-	{
-	  if (S_ISLNK (s.st_mode) != 0)
-	    {
-	      has_symlinks = 1;
-	      break;
-	    }
-
-	  /* search backwards for last DIR_SEPARATOR */
-	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
-	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    p--;
-	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    {
-	      /* no more DIR_SEPARATORS left */
-	      break;
-	    }
-	  *p = '\0';
-	}
-      else
-	{
-	  char *errstr = strerror (errno);
-	  lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
-	}
-    }
-  XFREE (tmp_pathspec);
-
-  if (!has_symlinks)
-    {
-      return xstrdup (pathspec);
-    }
-
-  tmp_pathspec = realpath (pathspec, buf);
-  if (tmp_pathspec == 0)
-    {
-      lt_fatal ("Could not follow symlinks for %s", pathspec);
-    }
-  return xstrdup (tmp_pathspec);
-#endif
-}
-
-char *
-strendzap (char *str, const char *pat)
-{
-  size_t len, patlen;
-
-  assert (str != NULL);
-  assert (pat != NULL);
-
-  len = strlen (str);
-  patlen = strlen (pat);
-
-  if (patlen <= len)
-    {
-      str += len - patlen;
-      if (strcmp (str, pat) == 0)
-	*str = '\0';
-    }
-  return str;
-}
-
-static void
-lt_error_core (int exit_status, const char *mode,
-	       const char *message, va_list ap)
-{
-  fprintf (stderr, "%s: %s: ", program_name, mode);
-  vfprintf (stderr, message, ap);
-  fprintf (stderr, ".\n");
-
-  if (exit_status >= 0)
-    exit (exit_status);
-}
-
-void
-lt_fatal (const char *message, ...)
-{
-  va_list ap;
-  va_start (ap, message);
-  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
-  va_end (ap);
-}
-
-void
-lt_setenv (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-  {
-#ifdef HAVE_SETENV
-    /* always make a copy, for consistency with !HAVE_SETENV */
-    char *str = xstrdup (value);
-    setenv (name, str, 1);
-#else
-    int len = strlen (name) + 1 + strlen (value) + 1;
-    char *str = XMALLOC (char, len);
-    sprintf (str, "%s=%s", name, value);
-    if (putenv (str) != EXIT_SUCCESS)
-      {
-        XFREE (str);
-      }
-#endif
-  }
-}
-
-char *
-lt_extend_str (const char *orig_value, const char *add, int to_end)
-{
-  char *new_value;
-  if (orig_value && *orig_value)
-    {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
-      new_value = XMALLOC (char, add_len + orig_value_len + 1);
-      if (to_end)
-        {
-          strcpy (new_value, orig_value);
-          strcpy (new_value + orig_value_len, add);
-        }
-      else
-        {
-          strcpy (new_value, add);
-          strcpy (new_value + add_len, orig_value);
-        }
-    }
-  else
-    {
-      new_value = xstrdup (add);
-    }
-  return new_value;
-}
-
-void
-lt_update_exe_path (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
-        {
-          new_value[len-1] = '\0';
-        }
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-void
-lt_update_lib_path (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-EOF
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-
-/* Prepares an argument vector before calling spawn().
-   Note that spawn() does not by itself call the command interpreter
-     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
-      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-         GetVersionEx(&v);
-         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
-      }) ? "cmd.exe" : "command.com").
-   Instead it simply concatenates the arguments, separated by ' ', and calls
-   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
-   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
-   special way:
-   - Space and tab are interpreted as delimiters. They are not treated as
-     delimiters if they are surrounded by double quotes: "...".
-   - Unescaped double quotes are removed from the input. Their only effect is
-     that within double quotes, space and tab are treated like normal
-     characters.
-   - Backslashes not followed by double quotes are not special.
-   - But 2*n+1 backslashes followed by a double quote become
-     n backslashes followed by a double quote (n >= 0):
-       \" -> "
-       \\\" -> \"
-       \\\\\" -> \\"
- */
-#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-char **
-prepare_spawn (char **argv)
-{
-  size_t argc;
-  char **new_argv;
-  size_t i;
-
-  /* Count number of arguments.  */
-  for (argc = 0; argv[argc] != NULL; argc++)
-    ;
-
-  /* Allocate new argument vector.  */
-  new_argv = XMALLOC (char *, argc + 1);
-
-  /* Put quoted arguments into the new argument vector.  */
-  for (i = 0; i < argc; i++)
-    {
-      const char *string = argv[i];
-
-      if (string[0] == '\0')
-	new_argv[i] = xstrdup ("\"\"");
-      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
-	{
-	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
-	  size_t length;
-	  unsigned int backslashes;
-	  const char *s;
-	  char *quoted_string;
-	  char *p;
-
-	  length = 0;
-	  backslashes = 0;
-	  if (quote_around)
-	    length++;
-	  for (s = string; *s != '\0'; s++)
-	    {
-	      char c = *s;
-	      if (c == '"')
-		length += backslashes + 1;
-	      length++;
-	      if (c == '\\')
-		backslashes++;
-	      else
-		backslashes = 0;
-	    }
-	  if (quote_around)
-	    length += backslashes + 1;
-
-	  quoted_string = XMALLOC (char, length + 1);
-
-	  p = quoted_string;
-	  backslashes = 0;
-	  if (quote_around)
-	    *p++ = '"';
-	  for (s = string; *s != '\0'; s++)
-	    {
-	      char c = *s;
-	      if (c == '"')
-		{
-		  unsigned int j;
-		  for (j = backslashes + 1; j > 0; j--)
-		    *p++ = '\\';
-		}
-	      *p++ = c;
-	      if (c == '\\')
-		backslashes++;
-	      else
-		backslashes = 0;
-	    }
-	  if (quote_around)
-	    {
-	      unsigned int j;
-	      for (j = backslashes; j > 0; j--)
-		*p++ = '\\';
-	      *p++ = '"';
-	    }
-	  *p = '\0';
-
-	  new_argv[i] = quoted_string;
-	}
-      else
-	new_argv[i] = (char *) string;
-    }
-  new_argv[argc] = NULL;
-
-  return new_argv;
-}
-EOF
-		;;
-	    esac
-
-            cat <<"EOF"
-void lt_dump_script (FILE* f)
-{
-EOF
-	    func_emit_wrapper yes |
-              $SED -e 's/\([\\"]\)/\\\1/g' \
-	           -e 's/^/  fputs ("/' -e 's/$/\\n", f);/'
-
-            cat <<"EOF"
-}
-EOF
-}
-# end: func_emit_cwrapperexe_src
-
-# func_win32_import_lib_p ARG
-# True if ARG is an import lib, as indicated by $file_magic_cmd
-func_win32_import_lib_p ()
-{
-    $opt_debug
-    case `eval "$file_magic_cmd \"\$1\" 2>/dev/null" | $SED -e 10q` in
-    *import*) : ;;
-    *) false ;;
-    esac
-}
-
-# func_mode_link arg...
-func_mode_link ()
-{
-    $opt_debug
-    case $host in
-    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-      # It is impossible to link a dll without this setting, and
-      # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
-      # flag for every libtool invocation.
-      # allow_undefined=no
-
-      # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
-      # even a static library is built.  For now, we need to specify
-      # -no-undefined on the libtool link line when we can be certain
-      # that all symbols are satisfied, otherwise we get a static library.
-      allow_undefined=yes
-      ;;
-    *)
-      allow_undefined=yes
-      ;;
-    esac
-    libtool_args=$nonopt
-    base_compile="$nonopt $@"
-    compile_command=$nonopt
-    finalize_command=$nonopt
-
-    compile_rpath=
-    finalize_rpath=
-    compile_shlibpath=
-    finalize_shlibpath=
-    convenience=
-    old_convenience=
-    deplibs=
-    old_deplibs=
-    compiler_flags=
-    linker_flags=
-    dllsearchpath=
-    lib_search_path=`pwd`
-    inst_prefix_dir=
-    new_inherited_linker_flags=
-
-    avoid_version=no
-    bindir=
-    dlfiles=
-    dlprefiles=
-    dlself=no
-    export_dynamic=no
-    export_symbols=
-    export_symbols_regex=
-    generated=
-    libobjs=
-    ltlibs=
-    module=no
-    no_install=no
-    objs=
-    non_pic_objects=
-    precious_files_regex=
-    prefer_static_libs=no
-    preload=no
-    prev=
-    prevarg=
-    release=
-    rpath=
-    xrpath=
-    perm_rpath=
-    temp_rpath=
-    thread_safe=no
-    vinfo=
-    vinfo_number=no
-    weak_libs=
-    single_module="${wl}-single_module"
-    func_infer_tag $base_compile
-
-    # We need to know -static, to get the right output filenames.
-    for arg
-    do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	break
-	;;
-      -all-static | -static | -static-libtool-libs)
-	case $arg in
-	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
-	    func_warning "complete static linking is impossible in this configuration"
-	  fi
-	  if test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	-static)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=built
-	  ;;
-	-static-libtool-libs)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	esac
-	build_libtool_libs=no
-	build_old_libs=yes
-	break
-	;;
-      esac
-    done
-
-    # See if our shared archives depend on static archives.
-    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
-    # Go through the arguments, transforming them on the way.
-    while test "$#" -gt 0; do
-      arg="$1"
-      shift
-      func_quote_for_eval "$arg"
-      qarg=$func_quote_for_eval_unquoted_result
-      func_append libtool_args " $func_quote_for_eval_result"
-
-      # If the previous option needs an argument, assign it.
-      if test -n "$prev"; then
-	case $prev in
-	output)
-	  func_append compile_command " @OUTPUT@"
-	  func_append finalize_command " @OUTPUT@"
-	  ;;
-	esac
-
-	case $prev in
-	bindir)
-	  bindir="$arg"
-	  prev=
-	  continue
-	  ;;
-	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
-	    # Add the symbol object into the linking commands.
-	    func_append compile_command " @SYMFILE@"
-	    func_append finalize_command " @SYMFILE@"
-	    preload=yes
-	  fi
-	  case $arg in
-	  *.la | *.lo) ;;  # We handle these cases below.
-	  force)
-	    if test "$dlself" = no; then
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  self)
-	    if test "$prev" = dlprefiles; then
-	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
-	      dlself=yes
-	    else
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  *)
-	    if test "$prev" = dlfiles; then
-	      dlfiles="$dlfiles $arg"
-	    else
-	      dlprefiles="$dlprefiles $arg"
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  esac
-	  ;;
-	expsyms)
-	  export_symbols="$arg"
-	  test -f "$arg" \
-	    || func_fatal_error "symbol file \`$arg' does not exist"
-	  prev=
-	  continue
-	  ;;
-	expsyms_regex)
-	  export_symbols_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	framework)
-	  case $host in
-	    *-*-darwin*)
-	      case "$deplibs " in
-		*" $qarg.ltframework "*) ;;
-		*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
-		   ;;
-	      esac
-	      ;;
-	  esac
-	  prev=
-	  continue
-	  ;;
-	inst_prefix)
-	  inst_prefix_dir="$arg"
-	  prev=
-	  continue
-	  ;;
-	objectlist)
-	  if test -f "$arg"; then
-	    save_arg=$arg
-	    moreargs=
-	    for fil in `cat "$save_arg"`
-	    do
-#	      moreargs="$moreargs $fil"
-	      arg=$fil
-	      # A libtool-controlled object.
-
-	      # Check to see that this really is a libtool object.
-	      if func_lalib_unsafe_p "$arg"; then
-		pic_object=
-		non_pic_object=
-
-		# Read the .lo file
-		func_source "$arg"
-
-		if test -z "$pic_object" ||
-		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none &&
-		   test "$non_pic_object" = none; then
-		  func_fatal_error "cannot find name of object for \`$arg'"
-		fi
-
-		# Extract subdirectory from the argument.
-		func_dirname "$arg" "/" ""
-		xdir="$func_dirname_result"
-
-		if test "$pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
-
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		      dlfiles="$dlfiles $pic_object"
-		      prev=
-		      continue
-		    else
-		      # If libtool objects are unsupported, then we need to preload.
-		      prev=dlprefiles
-		    fi
-		  fi
-
-		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
-		    # Preload the old-style object.
-		    dlprefiles="$dlprefiles $pic_object"
-		    prev=
-		  fi
-
-		  # A PIC object.
-		  func_append libobjs " $pic_object"
-		  arg="$pic_object"
-		fi
-
-		# Non-PIC object.
-		if test "$non_pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
-
-		  # A standard non-PIC object
-		  func_append non_pic_objects " $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
-		  fi
-		else
-		  # If the PIC object exists, use it instead.
-		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-		fi
-	      else
-		# Only an error if not doing a dry-run.
-		if $opt_dry_run; then
-		  # Extract subdirectory from the argument.
-		  func_dirname "$arg" "/" ""
-		  xdir="$func_dirname_result"
-
-		  func_lo2o "$arg"
-		  pic_object=$xdir$objdir/$func_lo2o_result
-		  non_pic_object=$xdir$func_lo2o_result
-		  func_append libobjs " $pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-	        else
-		  func_fatal_error "\`$arg' is not a valid libtool object"
-		fi
-	      fi
-	    done
-	  else
-	    func_fatal_error "link input file \`$arg' does not exist"
-	  fi
-	  arg=$save_arg
-	  prev=
-	  continue
-	  ;;
-	precious_regex)
-	  precious_files_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	release)
-	  release="-$arg"
-	  prev=
-	  continue
-	  ;;
-	rpath | xrpath)
-	  # We need an absolute path.
-	  case $arg in
-	  [\\/]* | [A-Za-z]:[\\/]*) ;;
-	  *)
-	    func_fatal_error "only absolute run-paths are allowed"
-	    ;;
-	  esac
-	  if test "$prev" = rpath; then
-	    case "$rpath " in
-	    *" $arg "*) ;;
-	    *) rpath="$rpath $arg" ;;
-	    esac
-	  else
-	    case "$xrpath " in
-	    *" $arg "*) ;;
-	    *) xrpath="$xrpath $arg" ;;
-	    esac
-	  fi
-	  prev=
-	  continue
-	  ;;
-	shrext)
-	  shrext_cmds="$arg"
-	  prev=
-	  continue
-	  ;;
-	weak)
-	  weak_libs="$weak_libs $arg"
-	  prev=
-	  continue
-	  ;;
-	xcclinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xcompiler)
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xlinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $wl$qarg"
-	  prev=
-	  func_append compile_command " $wl$qarg"
-	  func_append finalize_command " $wl$qarg"
-	  continue
-	  ;;
-	*)
-	  eval "$prev=\"\$arg\""
-	  prev=
-	  continue
-	  ;;
-	esac
-      fi # test -n "$prev"
-
-      prevarg="$arg"
-
-      case $arg in
-      -all-static)
-	if test -n "$link_static_flag"; then
-	  # See comment for -static flag below, for more details.
-	  func_append compile_command " $link_static_flag"
-	  func_append finalize_command " $link_static_flag"
-	fi
-	continue
-	;;
-
-      -allow-undefined)
-	# FIXME: remove this flag sometime in the future.
-	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
-	;;
-
-      -avoid-version)
-	avoid_version=yes
-	continue
-	;;
-
-      -bindir)
-	prev=bindir
-	continue
-	;;
-
-      -dlopen)
-	prev=dlfiles
-	continue
-	;;
-
-      -dlpreopen)
-	prev=dlprefiles
-	continue
-	;;
-
-      -export-dynamic)
-	export_dynamic=yes
-	continue
-	;;
-
-      -export-symbols | -export-symbols-regex)
-	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	  func_fatal_error "more than one -exported-symbols argument is not allowed"
-	fi
-	if test "X$arg" = "X-export-symbols"; then
-	  prev=expsyms
-	else
-	  prev=expsyms_regex
-	fi
-	continue
-	;;
-
-      -framework)
-	prev=framework
-	continue
-	;;
-
-      -inst-prefix-dir)
-	prev=inst_prefix
-	continue
-	;;
-
-      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
-      # so, if we see these flags be careful not to treat them like -L
-      -L[A-Z][A-Z]*:*)
-	case $with_gcc/$host in
-	no/*-*-irix* | /*-*-irix*)
-	  func_append compile_command " $arg"
-	  func_append finalize_command " $arg"
-	  ;;
-	esac
-	continue
-	;;
-
-      -L*)
-	func_stripname '-L' '' "$arg"
-	dir=$func_stripname_result
-	if test -z "$dir"; then
-	  if test "$#" -gt 0; then
-	    func_fatal_error "require no space between \`-L' and \`$1'"
-	  else
-	    func_fatal_error "need path for \`-L' option"
-	  fi
-	fi
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  absdir=`cd "$dir" && pwd`
-	  test -z "$absdir" && \
-	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
-	  dir="$absdir"
-	  ;;
-	esac
-	case "$deplibs " in
-	*" -L$dir "*) ;;
-	*)
-	  deplibs="$deplibs -L$dir"
-	  lib_search_path="$lib_search_path $dir"
-	  ;;
-	esac
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$dir:"*) ;;
-	  ::) dllsearchpath=$dir;;
-	  *) dllsearchpath="$dllsearchpath:$dir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-	continue
-	;;
-
-      -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
-	    # These systems don't actually have a C or math library (as such)
-	    continue
-	    ;;
-	  *-*-os2*)
-	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C and math libraries are in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    continue
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-linux*)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  esac
-	elif test "X$arg" = "X-lc_r"; then
-	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	   # Do not include libc_r directly, use -pthread flag.
-	   continue
-	   ;;
-	 esac
-	fi
-	deplibs="$deplibs $arg"
-	continue
-	;;
-
-      -module)
-	module=yes
-	continue
-	;;
-
-      # Tru64 UNIX uses -model [arg] to determine the layout of C++
-      # classes, name mangling, and exception handling.
-      # Darwin uses the -arch flag to determine output architecture.
-      -model|-arch|-isysroot)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	prev=xcompiler
-	continue
-	;;
-
-      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	case "$new_inherited_linker_flags " in
-	    *" $arg "*) ;;
-	    * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
-	esac
-	continue
-	;;
-
-      -multi_module)
-	single_module="${wl}-multi_module"
-	continue
-	;;
-
-      -no-fast-install)
-	fast_install=no
-	continue
-	;;
-
-      -no-install)
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
-	  # The PATH hackery in wrapper scripts is required on Windows
-	  # and Darwin in order for the loader to find any dlls it needs.
-	  func_warning "\`-no-install' is ignored for $host"
-	  func_warning "assuming \`-no-fast-install' instead"
-	  fast_install=no
-	  ;;
-	*) no_install=yes ;;
-	esac
-	continue
-	;;
-
-      -no-undefined)
-	allow_undefined=no
-	continue
-	;;
-
-      -objectlist)
-	prev=objectlist
-	continue
-	;;
-
-      -o) prev=output ;;
-
-      -precious-files-regex)
-	prev=precious_regex
-	continue
-	;;
-
-      -release)
-	prev=release
-	continue
-	;;
-
-      -rpath)
-	prev=rpath
-	continue
-	;;
-
-      -R)
-	prev=xrpath
-	continue
-	;;
-
-      -R*)
-	func_stripname '-R' '' "$arg"
-	dir=$func_stripname_result
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  func_fatal_error "only absolute run-paths are allowed"
-	  ;;
-	esac
-	case "$xrpath " in
-	*" $dir "*) ;;
-	*) xrpath="$xrpath $dir" ;;
-	esac
-	continue
-	;;
-
-      -shared)
-	# The effects of -shared are defined in a previous loop.
-	continue
-	;;
-
-      -shrext)
-	prev=shrext
-	continue
-	;;
-
-      -static | -static-libtool-libs)
-	# The effects of -static are defined in a previous loop.
-	# We used to do the same as -all-static on platforms that
-	# didn't have a PIC flag, but the assumption that the effects
-	# would be equivalent was wrong.  It would break on at least
-	# Digital Unix and AIX.
-	continue
-	;;
-
-      -thread-safe)
-	thread_safe=yes
-	continue
-	;;
-
-      -version-info)
-	prev=vinfo
-	continue
-	;;
-
-      -version-number)
-	prev=vinfo
-	vinfo_number=yes
-	continue
-	;;
-
-      -weak)
-        prev=weak
-	continue
-	;;
-
-      -Wc,*)
-	func_stripname '-Wc,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Wl,*)
-	func_stripname '-Wl,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $wl$func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
-	  linker_flags="$linker_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Xcompiler)
-	prev=xcompiler
-	continue
-	;;
-
-      -Xlinker)
-	prev=xlinker
-	continue
-	;;
-
-      -XCClinker)
-	prev=xcclinker
-	continue
-	;;
-
-      # -msg_* for osf cc
-      -msg_*)
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
-      # -r[0-9][0-9]* specifies the processor on the SGI compiler
-      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
-      # +DA*, +DD* enable 64-bit mode on the HP compiler
-      # -q* pass through compiler args for the IBM compiler
-      # -m*, -t[45]*, -txscale* pass through architecture-specific
-      # compiler args for GCC
-      # -F/path gives path to uninstalled frameworks, gcc on darwin
-      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
-      # @file GCC response files
-      # -tp=* Portland pgcc target processor selection
-      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-        func_append compile_command " $arg"
-        func_append finalize_command " $arg"
-        compiler_flags="$compiler_flags $arg"
-        continue
-        ;;
-
-      # Some other compiler flag.
-      -* | +*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      *.$objext)
-	# A standard object.
-	objs="$objs $arg"
-	;;
-
-      *.lo)
-	# A libtool-controlled object.
-
-	# Check to see that this really is a libtool object.
-	if func_lalib_unsafe_p "$arg"; then
-	  pic_object=
-	  non_pic_object=
-
-	  # Read the .lo file
-	  func_source "$arg"
-
-	  if test -z "$pic_object" ||
-	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none &&
-	     test "$non_pic_object" = none; then
-	    func_fatal_error "cannot find name of object for \`$arg'"
-	  fi
-
-	  # Extract subdirectory from the argument.
-	  func_dirname "$arg" "/" ""
-	  xdir="$func_dirname_result"
-
-	  if test "$pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
-
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		dlfiles="$dlfiles $pic_object"
-		prev=
-		continue
-	      else
-		# If libtool objects are unsupported, then we need to preload.
-		prev=dlprefiles
-	      fi
-	    fi
-
-	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
-	      # Preload the old-style object.
-	      dlprefiles="$dlprefiles $pic_object"
-	      prev=
-	    fi
-
-	    # A PIC object.
-	    func_append libobjs " $pic_object"
-	    arg="$pic_object"
-	  fi
-
-	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
-
-	    # A standard non-PIC object
-	    func_append non_pic_objects " $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
-	    fi
-	  else
-	    # If the PIC object exists, use it instead.
-	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  fi
-	else
-	  # Only an error if not doing a dry-run.
-	  if $opt_dry_run; then
-	    # Extract subdirectory from the argument.
-	    func_dirname "$arg" "/" ""
-	    xdir="$func_dirname_result"
-
-	    func_lo2o "$arg"
-	    pic_object=$xdir$objdir/$func_lo2o_result
-	    non_pic_object=$xdir$func_lo2o_result
-	    func_append libobjs " $pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  else
-	    func_fatal_error "\`$arg' is not a valid libtool object"
-	  fi
-	fi
-	;;
-
-      *.$libext)
-	# An archive.
-	deplibs="$deplibs $arg"
-	old_deplibs="$old_deplibs $arg"
-	continue
-	;;
-
-      *.la)
-	# A libtool-controlled library.
-
-	if test "$prev" = dlfiles; then
-	  # This library was specified with -dlopen.
-	  dlfiles="$dlfiles $arg"
-	  prev=
-	elif test "$prev" = dlprefiles; then
-	  # The library was specified with -dlpreopen.
-	  dlprefiles="$dlprefiles $arg"
-	  prev=
-	else
-	  deplibs="$deplibs $arg"
-	fi
-	continue
-	;;
-
-      # Some other compiler argument.
-      *)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-      esac # arg
-
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-      fi
-    done # argument parsing loop
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
-
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval "arg=\"$export_dynamic_flag_spec\""
-      func_append compile_command " $arg"
-      func_append finalize_command " $arg"
-    fi
-
-    oldlibs=
-    # calculate the name of the file, without its directory
-    func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
-
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
-    else
-      shlib_search_path=
-    fi
-    eval "sys_lib_search_path=\"$sys_lib_search_path_spec\""
-    eval "sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\""
-
-    func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
-    # Create the object directory.
-    func_mkdir_p "$output_objdir"
-
-    # Determine the type of output
-    case $output in
-    "")
-      func_fatal_help "you must specify an output file"
-      ;;
-    *.$libext) linkmode=oldlib ;;
-    *.lo | *.$objext) linkmode=obj ;;
-    *.la) linkmode=lib ;;
-    *) linkmode=prog ;; # Anything else should be a program.
-    esac
-
-    specialdeplibs=
-
-    libs=
-    # Find all interdependent deplibs by searching for libraries
-    # that are linked more than once (e.g. -la -lb -la)
-    for deplib in $deplibs; do
-      if $opt_duplicate_deps ; then
-	case "$libs " in
-	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	esac
-      fi
-      libs="$libs $deplib"
-    done
-
-    if test "$linkmode" = lib; then
-      libs="$predeps $libs $compiler_lib_search_path $postdeps"
-
-      # Compute libraries that are listed more than once in $predeps
-      # $postdeps and mark them as special (i.e., whose duplicates are
-      # not to be eliminated).
-      pre_post_deps=
-      if $opt_duplicate_compiler_generated_deps; then
-	for pre_post_dep in $predeps $postdeps; do
-	  case "$pre_post_deps " in
-	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
-	  esac
-	  pre_post_deps="$pre_post_deps $pre_post_dep"
-	done
-      fi
-      pre_post_deps=
-    fi
-
-    deplibs=
-    newdependency_libs=
-    newlib_search_path=
-    need_relink=no # whether we're linking any uninstalled libtool libraries
-    notinst_deplibs= # not-installed libtool libraries
-    notinst_path= # paths that contain not-installed libtool libraries
-
-    case $linkmode in
-    lib)
-	passes="conv dlpreopen link"
-	for file in $dlfiles $dlprefiles; do
-	  case $file in
-	  *.la) ;;
-	  *)
-	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
-	    ;;
-	  esac
-	done
-	;;
-    prog)
-	compile_deplibs=
-	finalize_deplibs=
-	alldeplibs=no
-	newdlfiles=
-	newdlprefiles=
-	passes="conv scan dlopen dlpreopen link"
-	;;
-    *)  passes="conv"
-	;;
-    esac
-
-    for pass in $passes; do
-      # The preopen pass in lib mode reverses $deplibs; put it back here
-      # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
-	## FIXME: Find the place where the list is rebuilt in the wrong
-	##        order, and fix it there properly
-        tmp_deplibs=
-	for deplib in $deplibs; do
-	  tmp_deplibs="$deplib $tmp_deplibs"
-	done
-	deplibs="$tmp_deplibs"
-      fi
-
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
-	deplibs=
-      fi
-      if test "$linkmode" = prog; then
-	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
-	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
-	esac
-      fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
-	# Collect and forward deplibs of preopened libtool libs
-	for lib in $dlprefiles; do
-	  # Ignore non-libtool-libs
-	  dependency_libs=
-	  case $lib in
-	  *.la)	func_source "$lib" ;;
-	  esac
-
-	  # Collect preopened libtool deplibs, except any this library
-	  # has declared as weak libs
-	  for deplib in $dependency_libs; do
-	    func_basename "$deplib"
-            deplib_base=$func_basename_result
-	    case " $weak_libs " in
-	    *" $deplib_base "*) ;;
-	    *) deplibs="$deplibs $deplib" ;;
-	    esac
-	  done
-	done
-	libs="$dlprefiles"
-      fi
-      if test "$pass" = dlopen; then
-	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
-	deplibs=
-      fi
-
-      for deplib in $libs; do
-	lib=
-	found=no
-	case $deplib in
-	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    compiler_flags="$compiler_flags $deplib"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    func_warning "\`-l' is ignored for archives/objects"
-	    continue
-	  fi
-	  func_stripname '-l' '' "$deplib"
-	  name=$func_stripname_result
-	  if test "$linkmode" = lib; then
-	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
-	  else
-	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
-	  fi
-	  for searchdir in $searchdirs; do
-	    for search_ext in .la $std_shrext .so .a; do
-	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
-	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
-		else
-		  found=no
-		fi
-		break 2
-	      fi
-	    done
-	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
-	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
-	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	      case " $predeps $postdeps " in
-	      *" $deplib "*)
-		if func_lalib_p "$lib"; then
-		  library_names=
-		  old_library=
-		  func_source "$lib"
-		  for l in $old_library $library_names; do
-		    ll="$l"
-		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
-		    func_dirname "$lib" "" "."
-		    ladir="$func_dirname_result"
-		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
-		      compile_deplibs="$deplib $compile_deplibs"
-		      finalize_deplibs="$deplib $finalize_deplibs"
-		    else
-		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-		    fi
-		    continue
-		  fi
-		fi
-		;;
-	      *) ;;
-	      esac
-	    fi
-	  fi
-	  ;; # -l
-	*.ltframework)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    deplibs="$deplib $deplibs"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-L*)
-	  case $linkmode in
-	  lib)
-	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
-	    newdependency_libs="$deplib $newdependency_libs"
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  prog)
-	    if test "$pass" = conv; then
-	      deplibs="$deplib $deplibs"
-	      continue
-	    fi
-	    if test "$pass" = scan; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  *)
-	    func_warning "\`-L' is ignored for archives/objects"
-	    ;;
-	  esac # linkmode
-	  continue
-	  ;; # -L
-	-R*)
-	  if test "$pass" = link; then
-	    func_stripname '-R' '' "$deplib"
-	    dir=$func_stripname_result
-	    # Make sure the xrpath contains only unique directories.
-	    case "$xrpath " in
-	    *" $dir "*) ;;
-	    *) xrpath="$xrpath $dir" ;;
-	    esac
-	  fi
-	  deplibs="$deplib $deplibs"
-	  continue
-	  ;;
-	*.la) lib="$deplib" ;;
-	*.$libext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	    continue
-	  fi
-	  case $linkmode in
-	  lib)
-	    # Linking convenience modules into shared libraries is allowed,
-	    # but linking other static libraries is non-portable.
-	    case " $dlpreconveniencelibs " in
-	    *" $deplib "*) ;;
-	    *)
-	      valid_a_lib=no
-	      case $deplibs_check_method in
-		match_pattern*)
-		  set dummy $deplibs_check_method; shift
-		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
-		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		    valid_a_lib=yes
-		  fi
-		;;
-		pass_all)
-		  valid_a_lib=yes
-		;;
-	      esac
-	      if test "$valid_a_lib" != yes; then
-		echo
-		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because the file extensions .$libext of this argument makes me believe"
-		echo "*** that it is just a static archive that I should not use here."
-	      else
-		echo
-		$ECHO "*** Warning: Linking the shared library $output against the"
-		$ECHO "*** static library $deplib is not portable!"
-		deplibs="$deplib $deplibs"
-	      fi
-	      ;;
-	    esac
-	    continue
-	    ;;
-	  prog)
-	    if test "$pass" != link; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    continue
-	    ;;
-	  esac # linkmode
-	  ;; # *.$libext
-	*.lo | *.$objext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
-	      # If there is no dlopen support or we're linking statically,
-	      # we need to preload.
-	      newdlprefiles="$newdlprefiles $deplib"
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      newdlfiles="$newdlfiles $deplib"
-	    fi
-	  fi
-	  continue
-	  ;;
-	%DEPLIBS%)
-	  alldeplibs=yes
-	  continue
-	  ;;
-	esac # case $deplib
-
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-	fi
-
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$lib" \
-	  || func_fatal_error "\`$lib' is not a valid libtool archive"
-
-	func_dirname "$lib" "" "."
-	ladir="$func_dirname_result"
-
-	dlname=
-	dlopen=
-	dlpreopen=
-	libdir=
-	library_names=
-	old_library=
-	inherited_linker_flags=
-	# If the library was installed with an old release of libtool,
-	# it will not redefine variables installed, or shouldnotlink
-	installed=yes
-	shouldnotlink=no
-	avoidtemprpath=
-
-
-	# Read the .la file
-	func_source "$lib"
-
-	# Convert "-framework foo" to "foo.ltframework"
-	if test -n "$inherited_linker_flags"; then
-	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
-	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
-	    case " $new_inherited_linker_flags " in
-	      *" $tmp_inherited_linker_flag "*) ;;
-	      *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
-	    esac
-	  done
-	fi
-	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
-	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
-	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
-	fi
-
-	if test "$pass" = conv; then
-	  # Only check for convenience libraries
-	  deplibs="$lib $deplibs"
-	  if test -z "$libdir"; then
-	    if test -z "$old_library"; then
-	      func_fatal_error "cannot find name of link library for \`$lib'"
-	    fi
-	    # It is a libtool convenience library, so add in its objects.
-	    convenience="$convenience $ladir/$objdir/$old_library"
-	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
-	  fi
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    deplibs="$deplib $deplibs"
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
-	  continue
-	fi # $pass = conv
-
-
-	# Get the name of the library we link against.
-	linklib=
-	for l in $old_library $library_names; do
-	  linklib="$l"
-	done
-	if test -z "$linklib"; then
-	  func_fatal_error "cannot find name of link library for \`$lib'"
-	fi
-
-	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-	  fi
-	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
-	    # If there is no dlname, no dlopen support or we're linking
-	    # statically, we need to preload.  We also need to preload any
-	    # dependent libraries so libltdl's deplib preloader doesn't
-	    # bomb out in the load deplibs phase.
-	    dlprefiles="$dlprefiles $lib $dependency_libs"
-	  else
-	    newdlfiles="$newdlfiles $lib"
-	  fi
-	  continue
-	fi # $pass = dlopen
-
-	# We need an absolute path.
-	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
-	*)
-	  abs_ladir=`cd "$ladir" && pwd`
-	  if test -z "$abs_ladir"; then
-	    func_warning "cannot determine absolute directory name of \`$ladir'"
-	    func_warning "passing it literally to the linker, although it might fail"
-	    abs_ladir="$ladir"
-	  fi
-	  ;;
-	esac
-	func_basename "$lib"
-	laname="$func_basename_result"
-
-	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
-	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    func_warning "library \`$lib' was moved."
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
-	  else
-	    dir="$libdir"
-	    absdir="$libdir"
-	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
-	else
-	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  fi
-	fi # $installed = yes
-	func_stripname 'lib' '.la' "$laname"
-	name=$func_stripname_result
-
-	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir" && test "$linkmode" = prog; then
-	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
-	  fi
-	  # Prefer using a static library (so that no silly _DYNAMIC symbols
-	  # are required to link).
-	  if test -n "$old_library"; then
-	    newdlprefiles="$newdlprefiles $dir/$old_library"
-	    # Keep a list of preopened convenience libraries to check
-	    # that they are being used correctly in the link pass.
-	    test -z "$libdir" && \
-		dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
-	  # Otherwise, use the dlname, so that lt_dlopen finds it.
-	  elif test -n "$dlname"; then
-	    newdlprefiles="$newdlprefiles $dir/$dlname"
-	  else
-	    newdlprefiles="$newdlprefiles $dir/$linklib"
-	  fi
-	fi # $pass = dlpreopen
-
-	if test -z "$libdir"; then
-	  # Link the convenience library
-	  if test "$linkmode" = lib; then
-	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$dir/$old_library $compile_deplibs"
-	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
-	  else
-	    deplibs="$lib $deplibs" # used for prog,scan pass
-	  fi
-	  continue
-	fi
-
-
-	if test "$linkmode" = prog && test "$pass" != link; then
-	  newlib_search_path="$newlib_search_path $ladir"
-	  deplibs="$lib $deplibs"
-
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
-	  fi
-
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    case $deplib in
-	    -L*) func_stripname '-L' '' "$deplib"
-	         newlib_search_path="$newlib_search_path $func_stripname_result"
-		 ;;
-	    esac
-	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      # Need to hardcode shared library paths
-	      # or/and link against static libraries
-	      newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done # for deplib
-	  continue
-	fi # $linkmode = prog...
-
-	if test "$linkmode,$pass" = "prog,link"; then
-	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
-	       test -z "$old_library"; }; then
-	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
-	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath:" in
-	      *"$absdir:"*) ;;
-	      *) temp_rpath="$temp_rpath$absdir:" ;;
-	      esac
-	    fi
-
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi # $linkmode,$pass = prog,link...
-
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
-		 test -n "$library_names"; }; }; then
-	    # We only need to search for static libraries
-	    continue
-	  fi
-	fi
-
-	link_static=no # Whether the deplib will be linked statically
-	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes; then
-	  use_static_libs=no
-	fi
-	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc*)
-	      # No point in relinking DLLs because paths are not encoded
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=no
-	    ;;
-	  *)
-	    if test "$installed" = no; then
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=yes
-	    fi
-	    ;;
-	  esac
-	  # This is a shared library
-
-	  # Warn about portability, can't link against -module's on some
-	  # systems (darwin).  Don't bleat about dlopened modules though!
-	  dlopenmodule=""
-	  for dlpremoduletest in $dlprefiles; do
-	    if test "X$dlpremoduletest" = "X$lib"; then
-	      dlopenmodule="$dlpremoduletest"
-	      break
-	    fi
-	  done
-	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
-	    echo
-	    if test "$linkmode" = prog; then
-	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
-	    else
-	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
-	    fi
-	    $ECHO "*** $linklib is not portable!"
-	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi
-
-	  if test -n "$old_archive_from_expsyms_cmds"; then
-	    # figure out the soname
-	    set dummy $library_names
-	    shift
-	    realname="$1"
-	    shift
-	    eval "libname=\"$libname_spec\""
-	    # use dlname if we got it. it's perfectly good, no?
-	    if test -n "$dlname"; then
-	      soname="$dlname"
-	    elif test -n "$soname_spec"; then
-	      # bleh windows
-	      case $host in
-	      *cygwin* | mingw* | *cegcc*)
-	        func_arith $current - $age
-		major=$func_arith_result
-		versuffix="-$major"
-		;;
-	      esac
-	      eval "soname=\"$soname_spec\""
-	    else
-	      soname="$realname"
-	    fi
-
-	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
-	    func_basename "$soroot"
-	    soname="$func_basename_result"
-	    func_stripname 'lib' '.dll' "$soname"
-	    newlib=libimp-$func_stripname_result.a
-
-	    # If the library has no export list, then create one now
-	    if test -f "$output_objdir/$soname-def"; then :
-	    else
-	      func_verbose "extracting exported symbol list from \`$soname'"
-	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
-	    fi
-
-	    # Create $newlib
-	    if test -f "$output_objdir/$newlib"; then :; else
-	      func_verbose "generating import library for \`$soname'"
-	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
-	    fi
-	    # make sure the library variables are pointing to the new library
-	    dir=$output_objdir
-	    linklib=$newlib
-	  fi # test -n "$old_archive_from_expsyms_cmds"
-
-	  if test "$linkmode" = prog || test "$mode" != relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    lib_linked=yes
-	    case $hardcode_action in
-	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
-		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
-		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
-		  *-*-darwin* )
-		    # if the lib is a (non-dlopened) module then we can not
-		    # link against it, someone is ignoring the earlier warnings
-		    if /usr/bin/file -L $add 2> /dev/null |
-			 $GREP ": [^:]* bundle" >/dev/null ; then
-		      if test "X$dlopenmodule" != "X$lib"; then
-			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
-			if test -z "$old_library" ; then
-			  echo
-			  echo "*** And there doesn't seem to be a static archive available"
-			  echo "*** The link will probably fail, sorry"
-			else
-			  add="$dir/$old_library"
-			fi
-		      elif test -n "$old_library"; then
-			add="$dir/$old_library"
-		      fi
-		    fi
-		esac
-	      elif test "$hardcode_minus_L" = no; then
-		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
-		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    relink)
-	      if test "$hardcode_direct" = yes &&
-	         test "$hardcode_direct_absolute" = no; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$absdir"
-		# Try looking first in the location we're being installed to.
-		if test -n "$inst_prefix_dir"; then
-		  case $libdir in
-		    [\\/]*)
-		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		      ;;
-		  esac
-		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    *) lib_linked=no ;;
-	    esac
-
-	    if test "$lib_linked" != yes; then
-	      func_fatal_configuration "unsupported hardcode properties"
-	    fi
-
-	    if test -n "$add_shlibpath"; then
-	      case :$compile_shlibpath: in
-	      *":$add_shlibpath:"*) ;;
-	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
-	      esac
-	    fi
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
-	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes &&
-		 test "$hardcode_minus_L" != yes &&
-		 test "$hardcode_shlibpath_var" = yes; then
-		case :$finalize_shlibpath: in
-		*":$libdir:"*) ;;
-		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-		esac
-	      fi
-	    fi
-	  fi
-
-	  if test "$linkmode" = prog || test "$mode" = relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes &&
-	       test "$hardcode_direct_absolute" = no; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
-	      case :$finalize_shlibpath: in
-	      *":$libdir:"*) ;;
-	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
-	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-		add="$inst_prefix_dir$libdir/$linklib"
-	      else
-		add="$libdir/$linklib"
-	      fi
-	    else
-	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
-	      # Try looking first in the location we're being installed to.
-	      if test -n "$inst_prefix_dir"; then
-		case $libdir in
-		  [\\/]*)
-		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		    ;;
-		esac
-	      fi
-	      add="-l$name"
-	    fi
-
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
-	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	    fi
-	  fi
-	elif test "$linkmode" = prog; then
-	  # Here we assume that one of hardcode_direct or hardcode_minus_L
-	  # is not unsupported.  This is valid on all known static and
-	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
-	    compile_deplibs="$dir/$linklib $compile_deplibs"
-	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
-	  else
-	    compile_deplibs="-l$name -L$dir $compile_deplibs"
-	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
-	  fi
-	elif test "$build_libtool_libs" = yes; then
-	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
-	    # We're trying link a shared library against a static one
-	    # but the system doesn't support it.
-
-	    # Just print a warning and add the library to dependency_libs so
-	    # that the program can be linked against the static library.
-	    echo
-	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
-	    echo "*** I have the capability to make that library automatically link in when"
-	    echo "*** you link to this library.  But I can only do this if you have a"
-	    echo "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
-	      echo "*** But as you try to build a module library, libtool will still create "
-	      echo "*** a static module, that should work as long as the dlopening application"
-	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
-	      if test -z "$global_symbol_pipe"; then
-		echo
-		echo "*** However, this would only work if libtool was able to extract symbol"
-		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-		echo "*** not find such a program.  So, this module is probably useless."
-		echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	      fi
-	      if test "$build_old_libs" = no; then
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  else
-	    deplibs="$dir/$old_library $deplibs"
-	    link_static=yes
-	  fi
-	fi # link shared/static library?
-
-	if test "$linkmode" = lib; then
-	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
-	    # Extract -R from dependency_libs
-	    temp_deplibs=
-	    for libdir in $dependency_libs; do
-	      case $libdir in
-	      -R*) func_stripname '-R' '' "$libdir"
-	           temp_xrpath=$func_stripname_result
-		   case " $xrpath " in
-		   *" $temp_xrpath "*) ;;
-		   *) xrpath="$xrpath $temp_xrpath";;
-		   esac;;
-	      *) temp_deplibs="$temp_deplibs $libdir";;
-	      esac
-	    done
-	    dependency_libs="$temp_deplibs"
-	  fi
-
-	  newlib_search_path="$newlib_search_path $absdir"
-	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
-	  # ... and its dependency_libs
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    newdependency_libs="$deplib $newdependency_libs"
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
-
-	  if test "$link_all_deplibs" != no; then
-	    # Add the search paths of all dependency libraries
-	    for deplib in $dependency_libs; do
-	      path=
-	      case $deplib in
-	      -L*) path="$deplib" ;;
-	      *.la)
-	        func_dirname "$deplib" "" "."
-		dir="$func_dirname_result"
-		# We need an absolute path.
-		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-		*)
-		  absdir=`cd "$dir" && pwd`
-		  if test -z "$absdir"; then
-		    func_warning "cannot determine absolute directory name of \`$dir'"
-		    absdir="$dir"
-		  fi
-		  ;;
-		esac
-		if $GREP "^installed=no" $deplib > /dev/null; then
-		case $host in
-		*-*-darwin*)
-		  depdepl=
-		  deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
-		      depdepl=$tmp
-		    done
-		    if test -f "$absdir/$objdir/$depdepl" ; then
-		      depdepl="$absdir/$objdir/$depdepl"
-		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
-                      if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
-                      fi
-		      compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-		      linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
-		      path=
-		    fi
-		  fi
-		  ;;
-		*)
-		  path="-L$absdir/$objdir"
-		  ;;
-		esac
-		else
-		  libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		  test -z "$libdir" && \
-		    func_fatal_error "\`$deplib' is not a valid libtool archive"
-		  test "$absdir" != "$libdir" && \
-		    func_warning "\`$deplib' seems to be moved"
-
-		  path="-L$absdir"
-		fi
-		;;
-	      esac
-	      case " $deplibs " in
-	      *" $path "*) ;;
-	      *) deplibs="$path $deplibs" ;;
-	      esac
-	    done
-	  fi # link_all_deplibs != no
-	fi # linkmode = lib
-      done # for deplib in $libs
-      if test "$pass" = link; then
-	if test "$linkmode" = "prog"; then
-	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
-	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
-	else
-	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	fi
-      fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
-	# Link the dlpreopened libraries before other libraries
-	for deplib in $save_deplibs; do
-	  deplibs="$deplib $deplibs"
-	done
-      fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
-	  # Make sure lib_search_path contains only unique directories.
-	  lib_search_path=
-	  for dir in $newlib_search_path; do
-	    case "$lib_search_path " in
-	    *" $dir "*) ;;
-	    *) lib_search_path="$lib_search_path $dir" ;;
-	    esac
-	  done
-	  newlib_search_path=
-	fi
-
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
-	  vars="compile_deplibs finalize_deplibs"
-	fi
-	for var in $vars dependency_libs; do
-	  # Add libraries to $var in reverse order
-	  eval tmp_libs=\$$var
-	  new_libs=
-	  for deplib in $tmp_libs; do
-	    # FIXME: Pedantically, this is the right thing to do, so
-	    #        that some nasty dependency loop isn't accidentally
-	    #        broken:
-	    #new_libs="$deplib $new_libs"
-	    # Pragmatically, this seems to cause very few problems in
-	    # practice:
-	    case $deplib in
-	    -L*) new_libs="$deplib $new_libs" ;;
-	    -R*) ;;
-	    *)
-	      # And here is the reason: when a library appears more
-	      # than once as an explicit dependence of a library, or
-	      # is implicitly linked in more than once by the
-	      # compiler, it is considered special, and multiple
-	      # occurrences thereof are not removed.  Compare this
-	      # with having the same library being listed as a
-	      # dependency of multiple other libraries: in this case,
-	      # we know (pedantically, we assume) the library does not
-	      # need to be listed more than once, so we keep only the
-	      # last copy.  This is not always right, but it is rare
-	      # enough that we require users that really mean to play
-	      # such unportable linking tricks to link the library
-	      # using -Wl,-lname, so that libtool does not consider it
-	      # for duplicate removal.
-	      case " $specialdeplibs " in
-	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
-	      *)
-		case " $new_libs " in
-		*" $deplib "*) ;;
-		*) new_libs="$deplib $new_libs" ;;
-		esac
-		;;
-	      esac
-	      ;;
-	    esac
-	  done
-	  tmp_libs=
-	  for deplib in $new_libs; do
-	    case $deplib in
-	    -L*)
-	      case " $tmp_libs " in
-	      *" $deplib "*) ;;
-	      *) tmp_libs="$tmp_libs $deplib" ;;
-	      esac
-	      ;;
-	    *) tmp_libs="$tmp_libs $deplib" ;;
-	    esac
-	  done
-	  eval $var=\$tmp_libs
-	done # for var
-      fi
-      # Last step: remove runtime libs from dependency_libs
-      # (they stay in deplibs)
-      tmp_libs=
-      for i in $dependency_libs ; do
-	case " $predeps $postdeps $compiler_lib_search_path " in
-	*" $i "*)
-	  i=""
-	  ;;
-	esac
-	if test -n "$i" ; then
-	  tmp_libs="$tmp_libs $i"
-	fi
-      done
-      dependency_libs=$tmp_libs
-    done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
-    fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
-    fi
-
-    case $linkmode in
-    oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for archives"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for archives" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for archives"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for archives"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info/-version-number' is ignored for archives"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for archives"
-
-      test -n "$export_symbols$export_symbols_regex" && \
-	func_warning "\`-export-symbols' is ignored for archives"
-
-      # Now set the variables for building old libraries.
-      build_libtool_libs=no
-      oldlibs="$output"
-      objs="$objs$old_deplibs"
-      ;;
-
-    lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
-      case $outputname in
-      lib*)
-	func_stripname 'lib' '.la' "$outputname"
-	name=$func_stripname_result
-	eval "shared_ext=\"$shrext_cmds\""
-	eval "libname=\"$libname_spec\""
-	;;
-      *)
-	test "$module" = no && \
-	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
-
-	if test "$need_lib_prefix" != no; then
-	  # Add the "lib" prefix for modules if required
-	  func_stripname '' '.la' "$outputname"
-	  name=$func_stripname_result
-	  eval "shared_ext=\"$shrext_cmds\""
-	  eval "libname=\"$libname_spec\""
-	else
-	  func_stripname '' '.la' "$outputname"
-	  libname=$func_stripname_result
-	fi
-	;;
-      esac
-
-      if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
-	else
-	  echo
-	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
-	  $ECHO "*** objects $objs is not portable!"
-	  libobjs="$libobjs $objs"
-	fi
-      fi
-
-      test "$dlself" != no && \
-	func_warning "\`-dlopen self' is ignored for libtool libraries"
-
-      set dummy $rpath
-      shift
-      test "$#" -gt 1 && \
-	func_warning "ignoring multiple \`-rpath's for a libtool library"
-
-      install_libdir="$1"
-
-      oldlibs=
-      if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
-	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
-	  # convenience libraries should have the same extension an
-	  # archive normally would.
-	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
-	  build_libtool_libs=convenience
-	  build_old_libs=yes
-	fi
-
-	test -n "$vinfo" && \
-	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
-
-	test -n "$release" && \
-	  func_warning "\`-release' is ignored for convenience libraries"
-      else
-
-	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
-	set dummy $vinfo 0 0 0
-	shift
-	IFS="$save_ifs"
-
-	test -n "$7" && \
-	  func_fatal_help "too many parameters to \`-version-info'"
-
-	# convert absolute version numbers to libtool ages
-	# this retains compatibility with .la files and attempts
-	# to make the code below a bit more comprehensible
-
-	case $vinfo_number in
-	yes)
-	  number_major="$1"
-	  number_minor="$2"
-	  number_revision="$3"
-	  #
-	  # There are really only two kinds -- those that
-	  # use the current revision as the major version
-	  # and those that subtract age and use age as
-	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
-	  #
-	  case $version_type in
-	  darwin|linux|osf|windows|none)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_revision"
-	    ;;
-	  freebsd-aout|freebsd-elf|qnx|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
-	    ;;
-	  irix|nonstopux)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_minor"
-	    lt_irix_increment=no
-	    ;;
-	  esac
-	  ;;
-	no)
-	  current="$1"
-	  revision="$2"
-	  age="$3"
-	  ;;
-	esac
-
-	# Check that each of the things are valid numbers.
-	case $current in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "CURRENT \`$current' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $revision in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "REVISION \`$revision' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $age in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "AGE \`$age' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	if test "$age" -gt "$current"; then
-	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	fi
-
-	# Calculate the version variables.
-	major=
-	versuffix=
-	verstring=
-	case $version_type in
-	none) ;;
-
-	darwin)
-	  # Like Linux, but with the current version available in
-	  # verstring for coding it into the library header
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  # Darwin ld doesn't like 0 for these options...
-	  func_arith $current + 1
-	  minor_current=$func_arith_result
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
-	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
-	  ;;
-
-	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
-	  ;;
-
-	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
-	    func_arith $current - $age
-	  else
-	    func_arith $current - $age + 1
-	  fi
-	  major=$func_arith_result
-
-	  case $version_type in
-	    nonstopux) verstring_prefix=nonstopux ;;
-	    *)         verstring_prefix=sgi ;;
-	  esac
-	  verstring="$verstring_prefix$major.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$revision
-	  while test "$loop" -ne 0; do
-	    func_arith $revision - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring_prefix$major.$iface:$verstring"
-	  done
-
-	  # Before this point, $major must not contain `.'.
-	  major=.$major
-	  versuffix="$major.$revision"
-	  ;;
-
-	linux)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  ;;
-
-	osf)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$age
-	  while test "$loop" -ne 0; do
-	    func_arith $current - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring:${iface}.0"
-	  done
-
-	  # Make executables depend on our current version.
-	  verstring="$verstring:${current}.0"
-	  ;;
-
-	qnx)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
-	  ;;
-
-	windows)
-	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
-	  func_arith $current - $age
-	  major=$func_arith_result
-	  versuffix="-$major"
-	  ;;
-
-	*)
-	  func_fatal_configuration "unknown library version type \`$version_type'"
-	  ;;
-	esac
-
-	# Clear the version info if we defaulted, and they specified a release.
-	if test -z "$vinfo" && test -n "$release"; then
-	  major=
-	  case $version_type in
-	  darwin)
-	    # we can't check for "0.0" in archive_cmds due to quoting
-	    # problems, so we reset it completely
-	    verstring=
-	    ;;
-	  *)
-	    verstring="0.0"
-	    ;;
-	  esac
-	  if test "$need_version" = no; then
-	    versuffix=
-	  else
-	    versuffix=".0.0"
-	  fi
-	fi
-
-	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
-	  major=
-	  versuffix=
-	  verstring=""
-	fi
-
-	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    func_warning "undefined symbols not allowed in $host shared libraries"
-	    build_libtool_libs=no
-	    build_old_libs=yes
-	  fi
-	else
-	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
-	fi
-
-      fi
-
-      func_generate_dlsyms "$libname" "$libname" "yes"
-      libobjs="$libobjs $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
-
-      if test "$mode" != relink; then
-	# Remove our outputs, but don't remove object files since they
-	# may have been created when compiling PIC objects.
-	removelist=
-	tempremovelist=`$ECHO "$output_objdir/*"`
-	for p in $tempremovelist; do
-	  case $p in
-	    *.$objext | *.gcno)
-	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
-		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
-		 then
-		   continue
-		 fi
-	       fi
-	       removelist="$removelist $p"
-	       ;;
-	    *) ;;
-	  esac
-	done
-	test -n "$removelist" && \
-	  func_show_eval "${RM}r \$removelist"
-      fi
-
-      # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-	oldlibs="$oldlibs $output_objdir/$libname.$libext"
-
-	# Transform .lo files to .o files.
-	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
-      fi
-
-      # Eliminate all temporary directories.
-      #for path in $notinst_path; do
-      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
-      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
-      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
-      #done
-
-      if test -n "$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	temp_xrpath=
-	for libdir in $xrpath; do
-	  temp_xrpath="$temp_xrpath -R$libdir"
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
-	  dependency_libs="$temp_xrpath $dependency_libs"
-	fi
-      fi
-
-      # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
-      dlfiles=
-      for lib in $old_dlfiles; do
-	case " $dlprefiles $dlfiles " in
-	*" $lib "*) ;;
-	*) dlfiles="$dlfiles $lib" ;;
-	esac
-      done
-
-      # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
-      dlprefiles=
-      for lib in $old_dlprefiles; do
-	case "$dlprefiles " in
-	*" $lib "*) ;;
-	*) dlprefiles="$dlprefiles $lib" ;;
-	esac
-      done
-
-      if test "$build_libtool_libs" = yes; then
-	if test -n "$rpath"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
-	    # these systems don't actually have a c library (as such)!
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C library is in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    ;;
-	  *-*-netbsd*)
-	    # Don't link with libc until the a.out ld.so is fixed.
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    ;;
-	  *)
-	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
-	      deplibs="$deplibs -lc"
-	    fi
-	    ;;
-	  esac
-	fi
-
-	# Transform deplibs into only deplibs that can be linked in shared.
-	name_save=$name
-	libname_save=$libname
-	release_save=$release
-	versuffix_save=$versuffix
-	major_save=$major
-	# I'm not sure if I'm treating the release correctly.  I think
-	# release should show up in the -l (ie -lgmp5) so we don't want to
-	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
-	newdeplibs=
-	droppeddeps=no
-	case $deplibs_check_method in
-	pass_all)
-	  # Don't check for shared/static.  Everything works.
-	  # This might be a little naive.  We might want to check
-	  # whether the library exists or not.  But this is on
-	  # osf3 & osf4 and I'm not really sure... Just
-	  # implementing what was already the behavior.
-	  newdeplibs=$deplibs
-	  ;;
-	test_compile)
-	  # This code stresses the "libraries are programs" paradigm to its
-	  # limits. Maybe even breaks it.  We compile a program, linking it
-	  # against the deplibs as a proxy for the library.  Then we can check
-	  # whether they linked in statically or dynamically with ldd.
-	  $opt_dry_run || $RM conftest.c
-	  cat > conftest.c <<EOF
-	  int main() { return 0; }
-EOF
-	  $opt_dry_run || $RM conftest
-	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
-	    ldd_output=`ldd conftest`
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		  case " $predeps $postdeps " in
-		  *" $i "*)
-		    newdeplibs="$newdeplibs $i"
-		    i=""
-		    ;;
-		  esac
-		fi
-		if test -n "$i" ; then
-		  eval "libname=\"$libname_spec\""
-		  eval "deplib_matches=\"$library_names_spec\""
-		  set dummy $deplib_matches; shift
-		  deplib_match=$1
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		    newdeplibs="$newdeplibs $i"
-		  else
-		    droppeddeps=yes
-		    echo
-		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		    echo "*** I have the capability to make that library automatically link in when"
-		    echo "*** you link to this library.  But I can only do this if you have a"
-		    echo "*** shared version of the library, which I believe you do not have"
-		    echo "*** because a test_compile did reveal that the linker did not use it for"
-		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
-		  fi
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  else
-	    # Error occurred in the first compile.  Let's try to salvage
-	    # the situation: Compile a separate program for each library.
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		$opt_dry_run || $RM conftest
-		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
-		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		    case " $predeps $postdeps " in
-		    *" $i "*)
-		      newdeplibs="$newdeplibs $i"
-		      i=""
-		      ;;
-		    esac
-		  fi
-		  if test -n "$i" ; then
-		    eval "libname=\"$libname_spec\""
-		    eval "deplib_matches=\"$library_names_spec\""
-		    set dummy $deplib_matches; shift
-		    deplib_match=$1
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		      newdeplibs="$newdeplibs $i"
-		    else
-		      droppeddeps=yes
-		      echo
-		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		      echo "*** I have the capability to make that library automatically link in when"
-		      echo "*** you link to this library.  But I can only do this if you have a"
-		      echo "*** shared version of the library, which you do not appear to have"
-		      echo "*** because a test_compile did reveal that the linker did not use this one"
-		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
-		    fi
-		  fi
-		else
-		  droppeddeps=yes
-		  echo
-		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
-		  echo "*** make it link in!  You will probably need to install it or some"
-		  echo "*** library that it depends on before this library will be fully"
-		  echo "*** functional.  Installing it before continuing would be even better."
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  fi
-	  ;;
-	file_magic*)
-	  set dummy $deplibs_check_method; shift
-	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		eval "libname=\"$libname_spec\""
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		      # Follow soft links.
-		      if ls -lLd "$potent_lib" 2>/dev/null |
-			 $GREP " -> " >/dev/null; then
-			continue
-		      fi
-		      # The statement above tries to avoid entering an
-		      # endless loop below, in case of cyclic links.
-		      # We might still enter an endless loop, since a link
-		      # loop can be closed while we follow links,
-		      # but so what?
-		      potlib="$potent_lib"
-		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
-			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
-			esac
-		      done
-		      if eval "$file_magic_cmd \"\$potlib\"" 2>/dev/null |
-			 $SED -e 10q |
-			 $EGREP "$file_magic_regex" > /dev/null; then
-			newdeplibs="$newdeplibs $a_deplib"
-			a_deplib=""
-			break 2
-		      fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		echo
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a file magic. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	match_pattern*)
-	  set dummy $deplibs_check_method; shift
-	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		eval "libname=\"$libname_spec\""
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
-		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
-		       $EGREP "$match_pattern_regex" > /dev/null; then
-		      newdeplibs="$newdeplibs $a_deplib"
-		      a_deplib=""
-		      break 2
-		    fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		echo
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	none | unknown | *)
-	  newdeplibs=""
-	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
-	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
-	    done
-	  fi
-	  case $tmp_deplibs in
-	  *[!\	\ ]*)
-	    echo
-	    if test "X$deplibs_check_method" = "Xnone"; then
-	      echo "*** Warning: inter-library dependencies are not supported in this platform."
-	    else
-	      echo "*** Warning: inter-library dependencies are not known to be supported."
-	    fi
-	    echo "*** All declared inter-library dependencies are being dropped."
-	    droppeddeps=yes
-	    ;;
-	  esac
-	  ;;
-	esac
-	versuffix=$versuffix_save
-	major=$major_save
-	release=$release_save
-	libname=$libname_save
-	name=$name_save
-
-	case $host in
-	*-*-rhapsody* | *-*-darwin1.[012])
-	  # On Rhapsody replace the C library with the System framework
-	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
-	  ;;
-	esac
-
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
-	    echo
-	    echo "*** Warning: libtool could not satisfy all declared inter-library"
-	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
-	    echo "*** a static module, that should work as long as the dlopening"
-	    echo "*** application is linked with the -dlopen flag."
-	    if test -z "$global_symbol_pipe"; then
-	      echo
-	      echo "*** However, this would only work if libtool was able to extract symbol"
-	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-	      echo "*** not find such a program.  So, this module is probably useless."
-	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
-	      build_libtool_libs=module
-	      build_old_libs=yes
-	    else
-	      build_libtool_libs=no
-	    fi
-	  else
-	    echo "*** The inter-library dependencies that have been dropped here will be"
-	    echo "*** automatically added whenever a program is linked with this library"
-	    echo "*** or is declared to -dlopen it."
-
-	    if test "$allow_undefined" = no; then
-	      echo
-	      echo "*** Since this library must not contain undefined symbols,"
-	      echo "*** because either the platform does not support them or"
-	      echo "*** it was explicitly requested with -no-undefined,"
-	      echo "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  fi
-	fi
-	# Done checking deplibs!
-	deplibs=$newdeplibs
-      fi
-      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
-      case $host in
-	*-*-darwin*)
-	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  ;;
-      esac
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      deplibs="$new_libs"
-
-      # All the library-specific variables (install_libdir is set above).
-      library_names=
-      old_library=
-      dlname=
-
-      # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	if test "$hardcode_into_libs" = yes; then
-	  # Hardcode the library paths
-	  hardcode_libdirs=
-	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$mode" != relink && rpath="$compile_rpath$rpath"
-	  for libdir in $rpath; do
-	    if test -n "$hardcode_libdir_flag_spec"; then
-	      if test -n "$hardcode_libdir_separator"; then
-		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
-		else
-		  # Just accumulate the unique libdirs.
-		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		    ;;
-		  *)
-		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		    ;;
-		  esac
-		fi
-	      else
-		eval "flag=\"$hardcode_libdir_flag_spec\""
-		dep_rpath="$dep_rpath $flag"
-	      fi
-	    elif test -n "$runpath_var"; then
-	      case "$perm_rpath " in
-	      *" $libdir "*) ;;
-	      *) perm_rpath="$perm_rpath $libdir" ;;
-	      esac
-	    fi
-	  done
-	  # Substitute the hardcoded libdirs into the rpath.
-	  if test -n "$hardcode_libdir_separator" &&
-	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
-	    if test -n "$hardcode_libdir_flag_spec_ld"; then
-	      eval "dep_rpath=\"$hardcode_libdir_flag_spec_ld\""
-	    else
-	      eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
-	    fi
-	  fi
-	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
-	    # We should set the runpath_var.
-	    rpath=
-	    for dir in $perm_rpath; do
-	      rpath="$rpath$dir:"
-	    done
-	    eval $runpath_var=\$rpath\$$runpath_var
-	    export $runpath_var
-	  fi
-	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
-	fi
-
-	shlibpath="$finalize_shlibpath"
-	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
-	if test -n "$shlibpath"; then
-	  eval $shlibpath_var=\$shlibpath\$$shlibpath_var
-	  export $shlibpath_var
-	fi
-
-	# Get the real and link names of the library.
-	eval "shared_ext=\"$shrext_cmds\""
-	eval "library_names=\"$library_names_spec\""
-	set dummy $library_names
-	shift
-	realname="$1"
-	shift
-
-	if test -n "$soname_spec"; then
-	  eval "soname=\"$soname_spec\""
-	else
-	  soname="$realname"
-	fi
-	if test -z "$dlname"; then
-	  dlname=$soname
-	fi
-
-	lib="$output_objdir/$realname"
-	linknames=
-	for link
-	do
-	  linknames="$linknames $link"
-	done
-
-	# Use standard objects if they are pic
-	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	test "X$libobjs" = "X " && libobjs=
-
-	delfiles=
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-	  export_symbols="$output_objdir/$libname.uexp"
-	  delfiles="$delfiles $export_symbols"
-	fi
-
-	orig_export_symbols=
-	case $host_os in
-	cygwin* | mingw* | cegcc*)
-	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
-	    # exporting using user supplied symfile
-	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
-	      # and it's NOT already a .def file. Must figure out
-	      # which of the given symbols are data symbols and tag
-	      # them as such. So, trigger use of export_symbols_cmds.
-	      # export_symbols gets reassigned inside the "prepare
-	      # the list of exported symbols" if statement, so the
-	      # include_expsyms logic still works.
-	      orig_export_symbols="$export_symbols"
-	      export_symbols=
-	      always_export_symbols=yes
-	    fi
-	  fi
-	  ;;
-	esac
-
-	# Prepare the list of exported symbols
-	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    func_verbose "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $opt_dry_run || $RM $export_symbols
-	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $cmds; do
-	      IFS="$save_ifs"
-	      eval "cmd=\"$cmd\""
-	      func_len " $cmd"
-	      len=$func_len_result
-	      if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-		func_show_eval "$cmd" 'exit $?'
-		skipped_export=false
-	      else
-		# The command line is too long to execute in one step.
-		func_verbose "using reloadable object file for export list..."
-		skipped_export=:
-		# Break out early, otherwise skipped_export may be
-		# set to false by a later but shorter cmd.
-		break
-	      fi
-	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-	fi
-
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  tmp_export_symbols="$export_symbols"
-	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	  $opt_dry_run || $ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"
-	fi
-
-	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
-	  # The given exports_symbols file has to be filtered, so filter it.
-	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	  # 's' commands which not all seds can handle. GNU sed should be fine
-	  # though. Also, the filter scales superlinearly with the number of
-	  # global variables. join(1) would be nice here, but unfortunately
-	  # isn't a blessed tool.
-	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	  delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	  export_symbols=$output_objdir/$libname.def
-	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	fi
-
-	tmp_deplibs=
-	for test_deplib in $deplibs; do
-	  case " $convenience " in
-	  *" $test_deplib "*) ;;
-	  *)
-	    tmp_deplibs="$tmp_deplibs $test_deplib"
-	    ;;
-	  esac
-	done
-	deplibs="$tmp_deplibs"
-
-	if test -n "$convenience"; then
-	  if test -n "$whole_archive_flag_spec" &&
-	    test "$compiler_needs_object" = yes &&
-	    test -z "$libobjs"; then
-	    # extract the archives, so we have objects to list.
-	    # TODO: could optimize this to just extract one archive.
-	    whole_archive_flag_spec=
-	  fi
-	  if test -n "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	    eval "libobjs=\"\$libobjs $whole_archive_flag_spec\""
-	    test "X$libobjs" = "X " && libobjs=
-	  else
-	    gentop="$output_objdir/${outputname}x"
-	    generated="$generated $gentop"
-
-	    func_extract_archives $gentop $convenience
-	    libobjs="$libobjs $func_extract_archives_result"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	fi
-
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
-	  eval "flag=\"$thread_safe_flag_spec\""
-	  linker_flags="$linker_flags $flag"
-	fi
-
-	# Make a backup of the uninstalled library when relinking
-	if test "$mode" = relink; then
-	  $opt_dry_run || (cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U) || exit $?
-	fi
-
-	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
-	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	    eval "test_cmds=\"$module_expsym_cmds\""
-	    cmds=$module_expsym_cmds
-	  else
-	    eval "test_cmds=\"$module_cmds\""
-	    cmds=$module_cmds
-	  fi
-	else
-	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	    eval "test_cmds=\"$archive_expsym_cmds\""
-	    cmds=$archive_expsym_cmds
-	  else
-	    eval "test_cmds=\"$archive_cmds\""
-	    cmds=$archive_cmds
-	  fi
-	fi
-
-	if test "X$skipped_export" != "X:" &&
-	   func_len " $test_cmds" &&
-	   len=$func_len_result &&
-	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  :
-	else
-	  # The command line is too long to link in one step, link piecewise
-	  # or, if using GNU ld and skipped_export is not :, use a linker
-	  # script.
-
-	  # Save the value of $output and $libobjs because we want to
-	  # use them later.  If we have whole_archive_flag_spec, we
-	  # want to use save_libobjs as it was before
-	  # whole_archive_flag_spec was expanded, because we can't
-	  # assume the linker understands whole_archive_flag_spec.
-	  # This may have to be revisited, in case too many
-	  # convenience libraries get linked in and end up exceeding
-	  # the spec.
-	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	  fi
-	  save_output=$output
-	  func_basename "$output"
-	  output_la=$func_basename_result
-
-	  # Clear the reloadable object creation command queue and
-	  # initialize k to one.
-	  test_cmds=
-	  concat_cmds=
-	  objlist=
-	  last_robj=
-	  k=1
-
-	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-	    output=${output_objdir}/${output_la}.lnkscript
-	    func_verbose "creating GNU ld script: $output"
-	    echo 'INPUT (' > $output
-	    for obj in $save_libobjs
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    echo ')' >> $output
-	    delfiles="$delfiles $output"
-	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-	    output=${output_objdir}/${output_la}.lnk
-	    func_verbose "creating linker input file list: $output"
-	    : > $output
-	    set x $save_libobjs
-	    shift
-	    firstobj=
-	    if test "$compiler_needs_object" = yes; then
-	      firstobj="$1 "
-	      shift
-	    fi
-	    for obj
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    delfiles="$delfiles $output"
-	    output=$firstobj\"$file_list_spec$output\"
-	  else
-	    if test -n "$save_libobjs"; then
-	      func_verbose "creating reloadable object files..."
-	      output=$output_objdir/$output_la-${k}.$objext
-	      eval "test_cmds=\"$reload_cmds\""
-	      func_len " $test_cmds"
-	      len0=$func_len_result
-	      len=$len0
-
-	      # Loop over the list of objects to be linked.
-	      for obj in $save_libobjs
-	      do
-		func_len " $obj"
-		func_arith $len + $func_len_result
-		len=$func_arith_result
-		if test "X$objlist" = X ||
-		   test "$len" -lt "$max_cmd_len"; then
-		  func_append objlist " $obj"
-		else
-		  # The command $test_cmds is almost too long, add a
-		  # command to the queue.
-		  if test "$k" -eq 1 ; then
-		    # The first file doesn't have a previous command to add.
-		    reload_objs=$objlist
-		    eval "concat_cmds=\"$reload_cmds\""
-		  else
-		    # All subsequent reloadable object files will link in
-		    # the last one created.
-		    reload_objs="$objlist $last_robj"
-		    eval "concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\""
-		  fi
-		  last_robj=$output_objdir/$output_la-${k}.$objext
-		  func_arith $k + 1
-		  k=$func_arith_result
-		  output=$output_objdir/$output_la-${k}.$objext
-		  objlist=" $obj"
-		  func_len " $last_robj"
-		  func_arith $len0 + $func_len_result
-		  len=$func_arith_result
-		fi
-	      done
-	      # Handle the remaining objects by creating one last
-	      # reloadable object file.  All subsequent reloadable object
-	      # files will link in the last one created.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      reload_objs="$objlist $last_robj"
-	      eval "concat_cmds=\"\${concat_cmds}$reload_cmds\""
-	      if test -n "$last_robj"; then
-	        eval "concat_cmds=\"\${concat_cmds}~\$RM $last_robj\""
-	      fi
-	      delfiles="$delfiles $output"
-
-	    else
-	      output=
-	    fi
-
-	    if ${skipped_export-false}; then
-	      func_verbose "generating symbol list for \`$libname.la'"
-	      export_symbols="$output_objdir/$libname.exp"
-	      $opt_dry_run || $RM $export_symbols
-	      libobjs=$output
-	      # Append the command to create the export file.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval "concat_cmds=\"\$concat_cmds$export_symbols_cmds\""
-	      if test -n "$last_robj"; then
-		eval "concat_cmds=\"\$concat_cmds~\$RM $last_robj\""
-	      fi
-	    fi
-
-	    test -n "$save_libobjs" &&
-	      func_verbose "creating a temporary reloadable object file: $output"
-
-	    # Loop through the commands generated above and execute them.
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $concat_cmds; do
-	      IFS="$save_ifs"
-	      $opt_silent || {
-		  func_quote_for_expand "$cmd"
-		  eval "func_echo $func_quote_for_expand_result"
-	      }
-	      $opt_dry_run || eval "$cmd" || {
-		lt_exit=$?
-
-		# Restore the uninstalled library and exit
-		if test "$mode" = relink; then
-		  ( cd "$output_objdir" && \
-		    $RM "${realname}T" && \
-		    $MV "${realname}U" "$realname" )
-		fi
-
-		exit $lt_exit
-	      }
-	    done
-	    IFS="$save_ifs"
-
-	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-
-          if ${skipped_export-false}; then
-	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	      tmp_export_symbols="$export_symbols"
-	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	      $opt_dry_run || $ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"
-	    fi
-
-	    if test -n "$orig_export_symbols"; then
-	      # The given exports_symbols file has to be filtered, so filter it.
-	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	      # 's' commands which not all seds can handle. GNU sed should be fine
-	      # though. Also, the filter scales superlinearly with the number of
-	      # global variables. join(1) would be nice here, but unfortunately
-	      # isn't a blessed tool.
-	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	      delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	      export_symbols=$output_objdir/$libname.def
-	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	    fi
-	  fi
-
-	  libobjs=$output
-	  # Restore the value of output.
-	  output=$save_output
-
-	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
-	    eval "libobjs=\"\$libobjs $whole_archive_flag_spec\""
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	  # Expand the library linking commands again to reset the
-	  # value of $libobjs for piecewise linking.
-
-	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
-	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	      cmds=$module_expsym_cmds
-	    else
-	      cmds=$module_cmds
-	    fi
-	  else
-	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	      cmds=$archive_expsym_cmds
-	    else
-	      cmds=$archive_cmds
-	    fi
-	  fi
-	fi
-
-	if test -n "$delfiles"; then
-	  # Append the command to remove temporary files to $cmds.
-	  eval "cmds=\"\$cmds~\$RM $delfiles\""
-	fi
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  libobjs="$libobjs $func_extract_archives_result"
-	  test "X$libobjs" = "X " && libobjs=
-	fi
-
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval "cmd=\"$cmd\""
-	  $opt_silent || {
-	    func_quote_for_expand "$cmd"
-	    eval "func_echo $func_quote_for_expand_result"
-	  }
-	  $opt_dry_run || eval "$cmd" || {
-	    lt_exit=$?
-
-	    # Restore the uninstalled library and exit
-	    if test "$mode" = relink; then
-	      ( cd "$output_objdir" && \
-	        $RM "${realname}T" && \
-		$MV "${realname}U" "$realname" )
-	    fi
-
-	    exit $lt_exit
-	  }
-	done
-	IFS="$save_ifs"
-
-	# Restore the uninstalled library and exit
-	if test "$mode" = relink; then
-	  $opt_dry_run || (cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname) || exit $?
-
-	  if test -n "$convenience"; then
-	    if test -z "$whole_archive_flag_spec"; then
-	      func_show_eval '${RM}r "$gentop"'
-	    fi
-	  fi
-
-	  exit $EXIT_SUCCESS
-	fi
-
-	# Create links to the real library.
-	for linkname in $linknames; do
-	  if test "$realname" != "$linkname"; then
-	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
-	  fi
-	done
-
-	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
-	  # On all known operating systems, these are identical.
-	  dlname="$soname"
-	fi
-      fi
-      ;;
-
-    obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for objects"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for objects" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for objects"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for objects"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for objects"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for objects"
-
-      case $output in
-      *.lo)
-	test -n "$objs$old_deplibs" && \
-	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
-
-	libobj=$output
-	func_lo2o "$libobj"
-	obj=$func_lo2o_result
-	;;
-      *)
-	libobj=
-	obj="$output"
-	;;
-      esac
-
-      # Delete the old objects.
-      $opt_dry_run || $RM $obj $libobj
-
-      # Objects from convenience libraries.  This assumes
-      # single-version convenience libraries.  Whenever we create
-      # different ones for PIC/non-PIC, this we'll have to duplicate
-      # the extraction.
-      reload_conv_objs=
-      gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
-      if test -n "$convenience"; then
-	if test -n "$whole_archive_flag_spec"; then
-	  eval "tmp_whole_archive_flags=\"$whole_archive_flag_spec\""
-	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
-	else
-	  gentop="$output_objdir/${obj}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $convenience
-	  reload_conv_objs="$reload_objs $func_extract_archives_result"
-	fi
-      fi
-
-      # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
-
-      output="$obj"
-      func_execute_cmds "$reload_cmds" 'exit $?'
-
-      # Exit if we aren't doing a library object file.
-      if test -z "$libobj"; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$build_libtool_libs" != yes; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	# Create an invalid libtool object if no PIC, so that we don't
-	# accidentally link it into a program.
-	# $show "echo timestamp > $libobj"
-	# $opt_dry_run || echo timestamp > $libobj || exit $?
-	exit $EXIT_SUCCESS
-      fi
-
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
-	# Only do commands if we really have different PIC objects.
-	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
-	func_execute_cmds "$reload_cmds" 'exit $?'
-      fi
-
-      if test -n "$gentop"; then
-	func_show_eval '${RM}r "$gentop"'
-      fi
-
-      exit $EXIT_SUCCESS
-      ;;
-
-    prog)
-      case $host in
-	*cygwin*) func_stripname '' '.exe' "$output"
-	          output=$func_stripname_result.exe;;
-      esac
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for programs"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for programs"
-
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-	&& test "$dlopen_self" = unknown \
-	&& test "$dlopen_self_static" = unknown && \
-	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
-
-      case $host in
-      *-*-rhapsody* | *-*-darwin1.[012])
-	# On Rhapsody replace the C library is the System framework
-	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
-	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
-	;;
-      esac
-
-      case $host in
-      *-*-darwin*)
-	# Don't allow lazy linking, it breaks C++ global constructors
-	# But is supposedly fixed on 10.4 or later (yay!).
-	if test "$tagname" = CXX ; then
-	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
-	    10.[0123])
-	      compile_command="$compile_command ${wl}-bind_at_load"
-	      finalize_command="$finalize_command ${wl}-bind_at_load"
-	    ;;
-	  esac
-	fi
-	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
-	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	;;
-      esac
-
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $compile_deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $compile_deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      compile_deplibs="$new_libs"
-
-
-      compile_command="$compile_command $compile_deplibs"
-      finalize_command="$finalize_command $finalize_deplibs"
-
-      if test -n "$rpath$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	for libdir in $rpath $xrpath; do
-	  # This is the magic to use -rpath.
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-      fi
-
-      # Now hardcode the library paths
-      rpath=
-      hardcode_libdirs=
-      for libdir in $compile_rpath $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval "flag=\"$hardcode_libdir_flag_spec\""
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) perm_rpath="$perm_rpath $libdir" ;;
-	  esac
-	fi
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$libdir:"*) ;;
-	  ::) dllsearchpath=$libdir;;
-	  *) dllsearchpath="$dllsearchpath:$libdir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval "rpath=\" $hardcode_libdir_flag_spec\""
-      fi
-      compile_rpath="$rpath"
-
-      rpath=
-      hardcode_libdirs=
-      for libdir in $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval "flag=\"$hardcode_libdir_flag_spec\""
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$finalize_perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
-	  esac
-	fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval "rpath=\" $hardcode_libdir_flag_spec\""
-      fi
-      finalize_rpath="$rpath"
-
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
-	# Transform all the library objects into standard objects.
-	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
-      fi
-
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
-
-      # template prelinking step
-      if test -n "$prelink_cmds"; then
-	func_execute_cmds "$prelink_cmds" 'exit $?'
-      fi
-
-      wrappers_required=yes
-      case $host in
-      *cegcc* | *mingw32ce*)
-        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
-        wrappers_required=no
-        ;;
-      *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      esac
-      if test "$wrappers_required" = no; then
-	# Replace the output file specification.
-	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
-
-	# We have no uninstalled library dependencies, so finalize right now.
-	exit_status=0
-	func_show_eval "$link_command" 'exit_status=$?'
-
-	# Delete the generated files.
-	if test -f "$output_objdir/${outputname}S.${objext}"; then
-	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
-	fi
-
-	exit $exit_status
-      fi
-
-      if test -n "$compile_shlibpath$finalize_shlibpath"; then
-	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
-      fi
-      if test -n "$finalize_shlibpath"; then
-	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
-      fi
-
-      compile_var=
-      finalize_var=
-      if test -n "$runpath_var"; then
-	if test -n "$perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-	if test -n "$finalize_perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $finalize_perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-      fi
-
-      if test "$no_install" = yes; then
-	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
-	# Replace the output file specification.
-	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	# Delete the old output file.
-	$opt_dry_run || $RM $output
-	# Link the executable and exit
-	func_show_eval "$link_command" 'exit $?'
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
-
-	func_warning "this platform does not like uninstalled shared libraries"
-	func_warning "\`$output' will be relinked during installation"
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
-
-      # Replace the output file specification.
-      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
-      # Delete the old output files.
-      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
-      func_show_eval "$link_command" 'exit $?'
-
-      # Now create the wrapper script.
-      func_verbose "creating $output"
-
-      # Quote the relink command for shipping.
-      if test -n "$relink_command"; then
-	# Preserve any variables that may affect compiler behavior
-	for var in $variables_saved_for_relink; do
-	  if eval test -z \"\${$var+set}\"; then
-	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	  elif eval var_value=\$$var; test -z "$var_value"; then
-	    relink_command="$var=; export $var; $relink_command"
-	  else
-	    func_quote_for_eval "$var_value"
-	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	  fi
-	done
-	relink_command="(cd `pwd`; $relink_command)"
-	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      fi
-
-      # Only actually do things if not in dry run mode.
-      $opt_dry_run || {
-	# win32 will think the script is a binary if it has
-	# a .exe suffix, so we strip it off here.
-	case $output in
-	  *.exe) func_stripname '' '.exe' "$output"
-	         output=$func_stripname_result ;;
-	esac
-	# test for cygwin because mv fails w/o .exe extensions
-	case $host in
-	  *cygwin*)
-	    exeext=.exe
-	    func_stripname '' '.exe' "$outputname"
-	    outputname=$func_stripname_result ;;
-	  *) exeext= ;;
-	esac
-	case $host in
-	  *cygwin* | *mingw* )
-	    func_dirname_and_basename "$output" "" "."
-	    output_name=$func_basename_result
-	    output_path=$func_dirname_result
-	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
-	    cwrapper="$output_path/$output_name.exe"
-	    $RM $cwrappersource $cwrapper
-	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_cwrapperexe_src > $cwrappersource
-
-	    # The wrapper executable is built using the $host compiler,
-	    # because it contains $host paths and files. If cross-
-	    # compiling, it, like the target executable, must be
-	    # executed on the $host or under an emulation environment.
-	    $opt_dry_run || {
-	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
-	      $STRIP $cwrapper
-	    }
-
-	    # Now, create the wrapper script for func_source use:
-	    func_ltwrapper_scriptname $cwrapper
-	    $RM $func_ltwrapper_scriptname_result
-	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
-	    $opt_dry_run || {
-	      # note: this script will not be executed, so do not chmod.
-	      if test "x$build" = "x$host" ; then
-		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
-	      else
-		func_emit_wrapper no > $func_ltwrapper_scriptname_result
-	      fi
-	    }
-	  ;;
-	  * )
-	    $RM $output
-	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_wrapper no > $output
-	    chmod +x $output
-	  ;;
-	esac
-      }
-      exit $EXIT_SUCCESS
-      ;;
-    esac
-
-    # See if we need to build an old-fashioned archive.
-    for oldlib in $oldlibs; do
-
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save $symfileobj"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
-	  build_libtool_libs=no
-	else
-	  oldobjs="$old_deplibs $non_pic_objects"
-	  if test "$preload" = yes && test -f "$symfileobj"; then
-	    oldobjs="$oldobjs $symfileobj"
-	  fi
-	fi
-	addlibs="$old_convenience"
-      fi
-
-      if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
-	generated="$generated $gentop"
-
-	func_extract_archives $gentop $addlibs
-	oldobjs="$oldobjs $func_extract_archives_result"
-      fi
-
-      # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-	cmds=$old_archive_from_new_cmds
-      else
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  oldobjs="$oldobjs $func_extract_archives_result"
-	fi
-
-	# POSIX demands no paths to be encoded in archives.  We have
-	# to avoid creating archives with duplicate basenames if we
-	# might have to extract them afterwards, e.g., when creating a
-	# static archive out of a convenience library, or when linking
-	# the entirety of a libtool archive into another (currently
-	# not supported by libtool).
-	if (for obj in $oldobjs
-	    do
-	      func_basename "$obj"
-	      $ECHO "$func_basename_result"
-	    done | sort | sort -uc >/dev/null 2>&1); then
-	  :
-	else
-	  echo "copying selected object files to avoid basename conflicts..."
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-	  func_mkdir_p "$gentop"
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  counter=1
-	  for obj in $save_oldobjs
-	  do
-	    func_basename "$obj"
-	    objbase="$func_basename_result"
-	    case " $oldobjs " in
-	    " ") oldobjs=$obj ;;
-	    *[\ /]"$objbase "*)
-	      while :; do
-		# Make sure we don't pick an alternate name that also
-		# overlaps.
-		newobj=lt$counter-$objbase
-		func_arith $counter + 1
-		counter=$func_arith_result
-		case " $oldobjs " in
-		*[\ /]"$newobj "*) ;;
-		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
-		esac
-	      done
-	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
-	      oldobjs="$oldobjs $gentop/$newobj"
-	      ;;
-	    *) oldobjs="$oldobjs $obj" ;;
-	    esac
-	  done
-	fi
-	eval "cmds=\"$old_archive_cmds\""
-
-	func_len " $cmds"
-	len=$func_len_result
-	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  cmds=$old_archive_cmds
-	else
-	  # the command line is too long to link in one step, link in parts
-	  func_verbose "using piecewise archive linking..."
-	  save_RANLIB=$RANLIB
-	  RANLIB=:
-	  objlist=
-	  concat_cmds=
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  # Is there a better way of finding the last object in the list?
-	  for obj in $save_oldobjs
-	  do
-	    last_oldobj=$obj
-	  done
-	  eval "test_cmds=\"$old_archive_cmds\""
-	  func_len " $test_cmds"
-	  len0=$func_len_result
-	  len=$len0
-	  for obj in $save_oldobjs
-	  do
-	    func_len " $obj"
-	    func_arith $len + $func_len_result
-	    len=$func_arith_result
-	    func_append objlist " $obj"
-	    if test "$len" -lt "$max_cmd_len"; then
-	      :
-	    else
-	      # the above command should be used before it gets too long
-	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
-		RANLIB=$save_RANLIB
-	      fi
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval "concat_cmds=\"\${concat_cmds}$old_archive_cmds\""
-	      objlist=
-	      len=$len0
-	    fi
-	  done
-	  RANLIB=$save_RANLIB
-	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
-	    eval "cmds=\"\$concat_cmds\""
-	  else
-	    eval "cmds=\"\$concat_cmds~\$old_archive_cmds\""
-	  fi
-	fi
-      fi
-      func_execute_cmds "$cmds" 'exit $?'
-    done
-
-    test -n "$generated" && \
-      func_show_eval "${RM}r$generated"
-
-    # Now create the libtool archive.
-    case $output in
-    *.la)
-      old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
-      func_verbose "creating $output"
-
-      # Preserve any variables that may affect compiler behavior
-      for var in $variables_saved_for_relink; do
-	if eval test -z \"\${$var+set}\"; then
-	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	elif eval var_value=\$$var; test -z "$var_value"; then
-	  relink_command="$var=; export $var; $relink_command"
-	else
-	  func_quote_for_eval "$var_value"
-	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	fi
-      done
-      # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
-	relink_command=
-      fi
-
-      # Only create the output if not a dry run.
-      $opt_dry_run || {
-	for installed in no yes; do
-	  if test "$installed" = yes; then
-	    if test -z "$install_libdir"; then
-	      break
-	    fi
-	    output="$output_objdir/$outputname"i
-	    # Replace all uninstalled libtool libraries with the installed ones
-	    newdependency_libs=
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      *.la)
-		func_basename "$deplib"
-		name="$func_basename_result"
-		libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$deplib' is not a valid libtool archive"
-		newdependency_libs="$newdependency_libs $libdir/$name"
-		;;
-	      *) newdependency_libs="$newdependency_libs $deplib" ;;
-	      esac
-	    done
-	    dependency_libs="$newdependency_libs"
-	    newdlfiles=
-
-	    for lib in $dlfiles; do
-	      case $lib in
-	      *.la)
-	        func_basename "$lib"
-		name="$func_basename_result"
-		libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlfiles="$newdlfiles $libdir/$name"
-		;;
-	      *) newdlfiles="$newdlfiles $lib" ;;
-	      esac
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-	      *.la)
-		# Only pass preopened files to the pseudo-archive (for
-		# eventual linking with the app. that links it) if we
-		# didn't already link the preopened objects directly into
-		# the library:
-		func_basename "$lib"
-		name="$func_basename_result"
-		libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlprefiles="$newdlprefiles $libdir/$name"
-		;;
-	      esac
-	    done
-	    dlprefiles="$newdlprefiles"
-	  else
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlfiles="$newdlfiles $abs"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlprefiles="$newdlprefiles $abs"
-	    done
-	    dlprefiles="$newdlprefiles"
-	  fi
-	  $RM $output
-	  # place dlname in correct position for cygwin
-	  # In fact, it would be nice if we could use this code for all target
-	  # systems that can't hard-code library paths into their executables
-	  # and that have no shared library path variable independent of PATH,
-	  # but it turns out we can't easily determine that from inspecting
-	  # libtool variables, so we have to hard-code the OSs to which it
-	  # applies here; at the moment, that means platforms that use the PE
-	  # object format with DLL files.  See the long comment at the top of
-	  # tests/bindir.at for full details.
-	  tdlname=$dlname
-	  case $host,$output,$installed,$module,$dlname in
-	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
-	      # If a -bindir argument was supplied, place the dll there.
-	      if test "x$bindir" != x ;
-	      then
-		func_relative_path "$install_libdir" "$bindir"
-		tdlname=$func_relative_path_result$dlname
-	      else
-		# Otherwise fall back on heuristic.
-		tdlname=../bin/$dlname
-	      fi
-	      ;;
-	  esac
-	  $ECHO > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$tdlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags='$new_inherited_linker_flags'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Names of additional weak libraries provided by this library
-weak_library_names='$weak_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
-
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
-	    $ECHO >> $output "\
-relink_command=\"$relink_command\""
-	  fi
-	done
-      }
-
-      # Do a symbolic link so that the libtool archive can be found in
-      # LD_LIBRARY_PATH before the program is installed.
-      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
-      ;;
-    esac
-    exit $EXIT_SUCCESS
-}
-
-{ test "$mode" = link || test "$mode" = relink; } &&
-    func_mode_link ${1+"$@"}
-
-
-# func_mode_uninstall arg...
-func_mode_uninstall ()
-{
-    $opt_debug
-    RM="$nonopt"
-    files=
-    rmforce=
-    exit_status=0
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    for arg
-    do
-      case $arg in
-      -f) RM="$RM $arg"; rmforce=yes ;;
-      -*) RM="$RM $arg" ;;
-      *) files="$files $arg" ;;
-      esac
-    done
-
-    test -z "$RM" && \
-      func_fatal_help "you must specify an RM program"
-
-    rmdirs=
-
-    origobjdir="$objdir"
-    for file in $files; do
-      func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-	objdir="$origobjdir"
-      else
-	objdir="$dir/$origobjdir"
-      fi
-      func_basename "$file"
-      name="$func_basename_result"
-      test "$mode" = uninstall && objdir="$dir"
-
-      # Remember objdir for removal later, being careful to avoid duplicates
-      if test "$mode" = clean; then
-	case " $rmdirs " in
-	  *" $objdir "*) ;;
-	  *) rmdirs="$rmdirs $objdir" ;;
-	esac
-      fi
-
-      # Don't error if the file doesn't exist and rm -f was used.
-      if { test -L "$file"; } >/dev/null 2>&1 ||
-	 { test -h "$file"; } >/dev/null 2>&1 ||
-	 test -f "$file"; then
-	:
-      elif test -d "$file"; then
-	exit_status=1
-	continue
-      elif test "$rmforce" = yes; then
-	continue
-      fi
-
-      rmfiles="$file"
-
-      case $name in
-      *.la)
-	# Possibly a libtool archive, so verify it.
-	if func_lalib_p "$file"; then
-	  func_source $dir/$name
-
-	  # Delete the libtool libraries and symlinks.
-	  for n in $library_names; do
-	    rmfiles="$rmfiles $objdir/$n"
-	  done
-	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
-
-	  case "$mode" in
-	  clean)
-	    case "  $library_names " in
-	    # "  " in the beginning catches empty $dlname
-	    *" $dlname "*) ;;
-	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
-	    esac
-	    test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
-	    ;;
-	  uninstall)
-	    if test -n "$library_names"; then
-	      # Do each command in the postuninstall commands.
-	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-
-	    if test -n "$old_library"; then
-	      # Do each command in the old_postuninstall commands.
-	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-	    # FIXME: should reinstall the best remaining shared library.
-	    ;;
-	  esac
-	fi
-	;;
-
-      *.lo)
-	# Possibly a libtool object, so verify it.
-	if func_lalib_p "$file"; then
-
-	  # Read the .lo file
-	  func_source $dir/$name
-
-	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" &&
-	     test "$pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$pic_object"
-	  fi
-
-	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" &&
-	     test "$non_pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$non_pic_object"
-	  fi
-	fi
-	;;
-
-      *)
-	if test "$mode" = clean ; then
-	  noexename=$name
-	  case $file in
-	  *.exe)
-	    func_stripname '' '.exe' "$file"
-	    file=$func_stripname_result
-	    func_stripname '' '.exe' "$name"
-	    noexename=$func_stripname_result
-	    # $file with .exe has already been added to rmfiles,
-	    # add $file without .exe
-	    rmfiles="$rmfiles $file"
-	    ;;
-	  esac
-	  # Do a test to see if this is a libtool program.
-	  if func_ltwrapper_p "$file"; then
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      relink_command=
-	      func_source $func_ltwrapper_scriptname_result
-	      rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
-	    else
-	      relink_command=
-	      func_source $dir/$noexename
-	    fi
-
-	    # note $name still contains .exe if it was in $file originally
-	    # as does the version of $file that was added into $rmfiles
-	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
-	      rmfiles="$rmfiles $objdir/lt-$name"
-	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
-	    fi
-	  fi
-	fi
-	;;
-      esac
-      func_show_eval "$RM $rmfiles" 'exit_status=1'
-    done
-    objdir="$origobjdir"
-
-    # Try to remove the ${objdir}s in the directories where we deleted files
-    for dir in $rmdirs; do
-      if test -d "$dir"; then
-	func_show_eval "rmdir $dir >/dev/null 2>&1"
-      fi
-    done
-
-    exit $exit_status
-}
-
-{ test "$mode" = uninstall || test "$mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
-
-test -z "$mode" && {
-  help="$generic_help"
-  func_fatal_help "you must specify a MODE"
-}
-
-test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$mode'"
-
-if test -n "$exec_cmd"; then
-  eval exec "$exec_cmd"
-  exit $EXIT_FAILURE
-fi
-
-exit $exit_status
-
-
-# The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
-# choices, we go for a static library, that is the most portable,
-# since we can't tell whether shared libraries were disabled because
-# the user asked for that or because the platform doesn't support
-# them.  This is particularly important on AIX, because we don't
-# support having both static and shared libraries enabled at the same
-# time on that platform, so we default to a shared-only configuration.
-# If a disable-shared tag is given, we'll fallback to a static-only
-# configuration.  But we'll never go from static-only to shared-only.
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-build_libtool_libs=no
-build_old_libs=yes
-# ### END LIBTOOL TAG CONFIG: disable-shared
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-static
-build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-# ### END LIBTOOL TAG CONFIG: disable-static
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
-# vi:sw=2
-
diff --git a/third_party/gofrontend/libgo/config/ltoptions.m4 b/third_party/gofrontend/libgo/config/ltoptions.m4
deleted file mode 100644
index 5ef12ce..0000000
--- a/third_party/gofrontend/libgo/config/ltoptions.m4
+++ /dev/null
@@ -1,369 +0,0 @@
-# Helper functions for option handling.                    -*- Autoconf -*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-#   Inc.
-#   Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltoptions.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
-
-
-# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
-# ------------------------------------------
-m4_define([_LT_MANGLE_OPTION],
-[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
-
-
-# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
-# ---------------------------------------
-# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
-# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
-# saved as a flag.
-m4_define([_LT_SET_OPTION],
-[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
-m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
-        _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
-])
-
-
-# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
-# ------------------------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-m4_define([_LT_IF_OPTION],
-[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
-
-
-# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
-# -------------------------------------------------------
-# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
-# are set.
-m4_define([_LT_UNLESS_OPTIONS],
-[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
-		      [m4_define([$0_found])])])[]dnl
-m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
-])[]dnl
-])
-
-
-# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
-# ----------------------------------------
-# OPTION-LIST is a space-separated list of Libtool options associated
-# with MACRO-NAME.  If any OPTION has a matching handler declared with
-# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
-# the unknown option and exit.
-m4_defun([_LT_SET_OPTIONS],
-[# Set options
-m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-    [_LT_SET_OPTION([$1], _LT_Option)])
-
-m4_if([$1],[LT_INIT],[
-  dnl
-  dnl Simply set some default values (i.e off) if boolean options were not
-  dnl specified:
-  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
-  ])
-  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
-  ])
-  dnl
-  dnl If no reference was made to various pairs of opposing options, then
-  dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
-  dnl archives by default:
-  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
-  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-  		   [_LT_ENABLE_FAST_INSTALL])
-  ])
-])# _LT_SET_OPTIONS
-
-
-## --------------------------------- ##
-## Macros to handle LT_INIT options. ##
-## --------------------------------- ##
-
-# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
-# -----------------------------------------
-m4_define([_LT_MANGLE_DEFUN],
-[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
-
-
-# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
-# -----------------------------------------------
-m4_define([LT_OPTION_DEFINE],
-[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
-])# LT_OPTION_DEFINE
-
-
-# dlopen
-# ------
-LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
-])
-
-AU_DEFUN([AC_LIBTOOL_DLOPEN],
-[_LT_SET_OPTION([LT_INIT], [dlopen])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
-
-
-# win32-dll
-# ---------
-# Declare package support for building win32 dll's.
-LT_OPTION_DEFINE([LT_INIT], [win32-dll],
-[enable_win32_dll=yes
-
-case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
-  AC_CHECK_TOOL(AS, as, false)
-  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-  AC_CHECK_TOOL(OBJDUMP, objdump, false)
-  ;;
-esac
-
-test -z "$AS" && AS=as
-_LT_DECL([], [AS],      [1], [Assembler program])dnl
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
-])# win32-dll
-
-AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-_LT_SET_OPTION([LT_INIT], [win32-dll])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
-
-
-# _LT_ENABLE_SHARED([DEFAULT])
-# ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_SHARED],
-[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([shared],
-    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
-	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
-
-    _LT_DECL([build_libtool_libs], [enable_shared], [0],
-	[Whether or not to build shared libraries])
-])# _LT_ENABLE_SHARED
-
-LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
-])
-
-AC_DEFUN([AC_DISABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], [disable-shared])
-])
-
-AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
-AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_SHARED], [])
-dnl AC_DEFUN([AM_DISABLE_SHARED], [])
-
-
-
-# _LT_ENABLE_STATIC([DEFAULT])
-# ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_STATIC],
-[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([static],
-    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
-	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
-
-    _LT_DECL([build_old_libs], [enable_static], [0],
-	[Whether or not to build static libraries])
-])# _LT_ENABLE_STATIC
-
-LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
-])
-
-AC_DEFUN([AC_DISABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], [disable-static])
-])
-
-AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
-AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_STATIC], [])
-dnl AC_DEFUN([AM_DISABLE_STATIC], [])
-
-
-
-# _LT_ENABLE_FAST_INSTALL([DEFAULT])
-# ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_FAST_INSTALL],
-[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([fast-install],
-    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
-    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
-
-_LT_DECL([fast_install], [enable_fast_install], [0],
-	 [Whether or not to optimize for fast installation])dnl
-])# _LT_ENABLE_FAST_INSTALL
-
-LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
-
-# Old names:
-AU_DEFUN([AC_ENABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
-])
-
-AU_DEFUN([AC_DISABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
-dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
-
-
-# _LT_WITH_PIC([MODE])
-# --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
-# LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
-m4_define([_LT_WITH_PIC],
-[AC_ARG_WITH([pic],
-    [AS_HELP_STRING([--with-pic],
-	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [pic_mode="$withval"],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
-
-_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
-])# _LT_WITH_PIC
-
-LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
-
-# Old name:
-AU_DEFUN([AC_LIBTOOL_PICMODE],
-[_LT_SET_OPTION([LT_INIT], [pic-only])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
-
-## ----------------- ##
-## LTDL_INIT Options ##
-## ----------------- ##
-
-m4_define([_LTDL_MODE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
-		 [m4_define([_LTDL_MODE], [nonrecursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [recursive],
-		 [m4_define([_LTDL_MODE], [recursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [subproject],
-		 [m4_define([_LTDL_MODE], [subproject])])
-
-m4_define([_LTDL_TYPE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [installable],
-		 [m4_define([_LTDL_TYPE], [installable])])
-LT_OPTION_DEFINE([LTDL_INIT], [convenience],
-		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/third_party/gofrontend/libgo/config/ltsugar.m4 b/third_party/gofrontend/libgo/config/ltsugar.m4
deleted file mode 100644
index 9000a05..0000000
--- a/third_party/gofrontend/libgo/config/ltsugar.m4
+++ /dev/null
@@ -1,123 +0,0 @@
-# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
-#
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-# Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltsugar.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
-
-
-# lt_join(SEP, ARG1, [ARG2...])
-# -----------------------------
-# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
-# associated separator.
-# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
-# versions in m4sugar had bugs.
-m4_define([lt_join],
-[m4_if([$#], [1], [],
-       [$#], [2], [[$2]],
-       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
-m4_define([_lt_join],
-[m4_if([$#$2], [2], [],
-       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
-
-
-# lt_car(LIST)
-# lt_cdr(LIST)
-# ------------
-# Manipulate m4 lists.
-# These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
-m4_define([lt_car], [[$1]])
-m4_define([lt_cdr],
-[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
-       [$#], 1, [],
-       [m4_dquote(m4_shift($@))])])
-m4_define([lt_unquote], $1)
-
-
-# lt_append(MACRO-NAME, STRING, [SEPARATOR])
-# ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
-# Note that neither SEPARATOR nor STRING are expanded; they are appended
-# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
-# No SEPARATOR is output if MACRO-NAME was previously undefined (different
-# than defined and empty).
-#
-# This macro is needed until we can rely on Autoconf 2.62, since earlier
-# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
-m4_define([lt_append],
-[m4_define([$1],
-	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
-
-
-
-# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
-# ----------------------------------------------------------
-# Produce a SEP delimited list of all paired combinations of elements of
-# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
-# has the form PREFIXmINFIXSUFFIXn.
-# Needed until we can rely on m4_combine added in Autoconf 2.62.
-m4_define([lt_combine],
-[m4_if(m4_eval([$# > 3]), [1],
-       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
-[[m4_foreach([_Lt_prefix], [$2],
-	     [m4_foreach([_Lt_suffix],
-		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
-	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
-
-
-# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
-# -----------------------------------------------------------------------
-# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
-# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
-m4_define([lt_if_append_uniq],
-[m4_ifdef([$1],
-	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
-		 [lt_append([$1], [$2], [$3])$4],
-		 [$5])],
-	  [lt_append([$1], [$2], [$3])$4])])
-
-
-# lt_dict_add(DICT, KEY, VALUE)
-# -----------------------------
-m4_define([lt_dict_add],
-[m4_define([$1($2)], [$3])])
-
-
-# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
-# --------------------------------------------
-m4_define([lt_dict_add_subkey],
-[m4_define([$1($2:$3)], [$4])])
-
-
-# lt_dict_fetch(DICT, KEY, [SUBKEY])
-# ----------------------------------
-m4_define([lt_dict_fetch],
-[m4_ifval([$3],
-	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
-    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
-
-
-# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
-# -----------------------------------------------------------------
-m4_define([lt_if_dict_fetch],
-[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
-	[$5],
-    [$6])])
-
-
-# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
-# --------------------------------------------------------------
-m4_define([lt_dict_filter],
-[m4_if([$5], [], [],
-  [lt_join(m4_quote(m4_default([$4], [[, ]])),
-           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
-		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
-])
diff --git a/third_party/gofrontend/libgo/config/ltversion.m4 b/third_party/gofrontend/libgo/config/ltversion.m4
deleted file mode 100644
index bf87f77..0000000
--- a/third_party/gofrontend/libgo/config/ltversion.m4
+++ /dev/null
@@ -1,23 +0,0 @@
-# ltversion.m4 -- version numbers			-*- Autoconf -*-
-#
-#   Copyright (C) 2004 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# Generated from ltversion.in.
-
-# serial 3134 ltversion.m4
-# This file is part of GNU Libtool
-
-m4_define([LT_PACKAGE_VERSION], [2.2.7a])
-m4_define([LT_PACKAGE_REVISION], [1.3134])
-
-AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.2.7a'
-macro_revision='1.3134'
-_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
-_LT_DECL(, macro_revision, 0)
-])
diff --git a/third_party/gofrontend/libgo/config/lt~obsolete.m4 b/third_party/gofrontend/libgo/config/lt~obsolete.m4
deleted file mode 100644
index bf92b5e..0000000
--- a/third_party/gofrontend/libgo/config/lt~obsolete.m4
+++ /dev/null
@@ -1,98 +0,0 @@
-# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004.
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 4 lt~obsolete.m4
-
-# These exist entirely to fool aclocal when bootstrapping libtool.
-#
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
-# which have later been changed to m4_define as they aren't part of the
-# exported API, or moved to Autoconf or Automake where they belong.
-#
-# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
-# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
-# using a macro with the same name in our local m4/libtool.m4 it'll
-# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
-# and doesn't know about Autoconf macros at all.)
-#
-# So we provide this file, which has a silly filename so it's always
-# included after everything else.  This provides aclocal with the
-# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
-# because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
-#
-# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
-# Yes, that means every name once taken will need to remain here until
-# we give up compatibility with versions before 1.7, at which point
-# we need to keep only those names which we still refer to.
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
-
-m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
-m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
-m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
-m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
-m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
-m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
-m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
-m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
-m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
-m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
-m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
-m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
-m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
-m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
-m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
-m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
-m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
-m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
-m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
-m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
-m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
-m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
-m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
-m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
-m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
-m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
-m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
-m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
-m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
-m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
-m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
-m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
-m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
-m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
-m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
-m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
-m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
-m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
-m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
-m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
-m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
-m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
-m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
-m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
-m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
-m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
-m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
-m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
-m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
-m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/third_party/gofrontend/libgo/configure b/third_party/gofrontend/libgo/configure
deleted file mode 100755
index e024b2f..0000000
--- a/third_party/gofrontend/libgo/configure
+++ /dev/null
@@ -1,18345 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.64 for package-unused version-unused.
-#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software
-# Foundation, Inc.
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test "x$CONFIG_SHELL" = x; then
-  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-"
-  as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
-  exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1"
-  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
-  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
-  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
-  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1
-
-  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
-    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    PATH=/empty FPATH=/empty; export PATH FPATH
-    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
-      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
-  if (eval "$as_required") 2>/dev/null; then :
-  as_have_required=yes
-else
-  as_have_required=no
-fi
-  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  as_found=:
-  case $as_dir in #(
-	 /*)
-	   for as_base in sh bash ksh sh5; do
-	     # Try only shells that exist, to save several forks.
-	     as_shell=$as_dir/$as_base
-	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  CONFIG_SHELL=$as_shell as_have_required=yes
-		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  break 2
-fi
-fi
-	   done;;
-       esac
-  as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
-	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
-  CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
-      if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-	# neutralization value for shells without unset; and this also
-	# works around shells that cannot unset nonexistent variables.
-	BASH_ENV=/dev/null
-	ENV=/dev/null
-	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-	export CONFIG_SHELL
-	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
-fi
-
-    if test x$as_have_required = xno; then :
-  $as_echo "$0: This script requires a shell more modern than all"
-  $as_echo "$0: the shells that I found on your system."
-  if test x${ZSH_VERSION+set} = xset ; then
-    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
-    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
-  else
-    $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
-$0: including any error possibly output before this
-$0: message. Then install a modern shell, or manually run
-$0: the script under such a shell if you do have one."
-  fi
-  exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$?; test $as_status -eq 0 && as_status=1
-  if test "$3"; then
-    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
-  fi
-  $as_echo "$as_me: error: $1" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
-  as_lineno_1=$LINENO as_lineno_1a=$LINENO
-  as_lineno_2=$LINENO as_lineno_2a=$LINENO
-  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
-  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
-  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-
-exec 7<&0 </dev/null 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='package-unused'
-PACKAGE_TARNAME='libgo'
-PACKAGE_VERSION='version-unused'
-PACKAGE_STRING='package-unused version-unused'
-PACKAGE_BUGREPORT=''
-PACKAGE_URL=''
-
-ac_unique_file="Makefile.am"
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='am__EXEEXT_FALSE
-am__EXEEXT_TRUE
-LTLIBOBJS
-LIBOBJS
-HAVE_STAT_TIMESPEC_FALSE
-HAVE_STAT_TIMESPEC_TRUE
-STRUCT_EPOLL_EVENT_FD_OFFSET
-SIZEOF_STRUCT_EPOLL_EVENT
-MATH_FLAG
-STRINGOPS_FLAG
-HAVE_WAIT4_FALSE
-HAVE_WAIT4_TRUE
-HAVE_STRERROR_R_FALSE
-HAVE_STRERROR_R_TRUE
-HAVE_SYS_MMAN_H_FALSE
-HAVE_SYS_MMAN_H_TRUE
-PTHREAD_LIBS
-PTHREAD_CFLAGS
-NET_LIBS
-MATH_LIBS
-GOC_IS_LLGO_FALSE
-GOC_IS_LLGO_TRUE
-GO_SPLIT_STACK
-USING_SPLIT_STACK_FALSE
-USING_SPLIT_STACK_TRUE
-SPLIT_STACK
-OSCFLAGS
-GO_SYSCALL_OS_ARCH_FILE
-GO_SYSCALL_OS_FILE
-GO_LIBCALL_OS_ARCH_FILE
-GO_LIBCALL_OS_FILE
-GOARCH
-LIBGO_IS_X86_64_FALSE
-LIBGO_IS_X86_64_TRUE
-LIBGO_IS_SPARC64_FALSE
-LIBGO_IS_SPARC64_TRUE
-LIBGO_IS_SPARC_FALSE
-LIBGO_IS_SPARC_TRUE
-LIBGO_IS_S390X_FALSE
-LIBGO_IS_S390X_TRUE
-LIBGO_IS_S390_FALSE
-LIBGO_IS_S390_TRUE
-LIBGO_IS_PPC64LE_FALSE
-LIBGO_IS_PPC64LE_TRUE
-LIBGO_IS_PPC64_FALSE
-LIBGO_IS_PPC64_TRUE
-LIBGO_IS_PPC_FALSE
-LIBGO_IS_PPC_TRUE
-LIBGO_IS_MIPSO64_FALSE
-LIBGO_IS_MIPSO64_TRUE
-LIBGO_IS_MIPSN64_FALSE
-LIBGO_IS_MIPSN64_TRUE
-LIBGO_IS_MIPSN32_FALSE
-LIBGO_IS_MIPSN32_TRUE
-LIBGO_IS_MIPSO32_FALSE
-LIBGO_IS_MIPSO32_TRUE
-LIBGO_IS_MIPS_FALSE
-LIBGO_IS_MIPS_TRUE
-LIBGO_IS_M68K_FALSE
-LIBGO_IS_M68K_TRUE
-LIBGO_IS_ARM64_FALSE
-LIBGO_IS_ARM64_TRUE
-LIBGO_IS_ARM_FALSE
-LIBGO_IS_ARM_TRUE
-LIBGO_IS_ALPHA_FALSE
-LIBGO_IS_ALPHA_TRUE
-LIBGO_IS_386_FALSE
-LIBGO_IS_386_TRUE
-USE_DEJAGNU
-GOOS
-LIBGO_IS_SOLARIS_FALSE
-LIBGO_IS_SOLARIS_TRUE
-LIBGO_IS_RTEMS_FALSE
-LIBGO_IS_RTEMS_TRUE
-LIBGO_IS_DRAGONFLY_FALSE
-LIBGO_IS_DRAGONFLY_TRUE
-LIBGO_IS_OPENBSD_FALSE
-LIBGO_IS_OPENBSD_TRUE
-LIBGO_IS_NETBSD_FALSE
-LIBGO_IS_NETBSD_TRUE
-LIBGO_IS_LINUX_FALSE
-LIBGO_IS_LINUX_TRUE
-LIBGO_IS_IRIX_FALSE
-LIBGO_IS_IRIX_TRUE
-LIBGO_IS_FREEBSD_FALSE
-LIBGO_IS_FREEBSD_TRUE
-LIBGO_IS_DARWIN_FALSE
-LIBGO_IS_DARWIN_TRUE
-go_include
-LIBATOMIC
-LIBFFIINCS
-LIBFFI
-nover_glibgo_toolexeclibdir
-glibgo_toolexeclibdir
-glibgo_toolexecdir
-WERROR
-WARN_FLAGS
-CC_FOR_BUILD
-enable_static
-enable_shared
-CPP
-OTOOL64
-OTOOL
-LIPO
-NMEDIT
-DSYMUTIL
-AR
-OBJDUMP
-LN_S
-NM
-ac_ct_DUMPBIN
-DUMPBIN
-LIBTOOL
-OBJCOPY
-RANLIB
-LD
-FGREP
-EGREP
-GREP
-SED
-MAINT
-MAINTAINER_MODE_FALSE
-MAINTAINER_MODE_TRUE
-GOCFLAGS
-GOC
-am__fastdepCC_FALSE
-am__fastdepCC_TRUE
-CCDEPMODE
-am__nodep
-AMDEPBACKSLASH
-AMDEP_FALSE
-AMDEP_TRUE
-am__quote
-am__include
-DEPDIR
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-am__untar
-am__tar
-AMTAR
-am__leading_dot
-SET_MAKE
-AWK
-mkdir_p
-MKDIR_P
-INSTALL_STRIP_PROGRAM
-STRIP
-install_sh
-MAKEINFO
-AUTOHEADER
-AUTOMAKE
-AUTOCONF
-ACLOCAL
-VERSION
-PACKAGE
-CYGPATH_W
-am__isrc
-INSTALL_DATA
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-target_os
-target_vendor
-target_cpu
-target
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-multi_basedir
-libtool_VERSION
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-enable_multilib
-enable_dependency_tracking
-enable_maintainer_mode
-with_gnu_ld
-enable_shared
-enable_static
-with_pic
-enable_fast_install
-enable_libtool_lock
-enable_werror
-enable_version_specific_runtime_libs
-with_libffi
-with_libatomic
-with_system_libunwind
-'
-      ac_precious_vars='build_alias
-host_alias
-target_alias
-CPP
-CPPFLAGS'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval $ac_prev=\$ac_option
-    ac_prev=
-    continue
-  fi
-
-  case $ac_option in
-  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *)	ac_optarg=yes ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_dashdash$ac_option in
-  --)
-    ac_dashdash=yes ;;
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=*)
-    datadir=$ac_optarg ;;
-
-  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
-  | --dataroo | --dataro | --datar)
-    ac_prev=datarootdir ;;
-  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
-  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
-    datarootdir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=no ;;
-
-  -docdir | --docdir | --docdi | --doc | --do)
-    ac_prev=docdir ;;
-  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
-    docdir=$ac_optarg ;;
-
-  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
-    ac_prev=dvidir ;;
-  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
-    dvidir=$ac_optarg ;;
-
-  -enable-* | --enable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=\$ac_optarg ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
-    ac_prev=htmldir ;;
-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
-  | --ht=*)
-    htmldir=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localedir | --localedir | --localedi | --localed | --locale)
-    ac_prev=localedir ;;
-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
-    localedir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst | --locals)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
-    ac_prev=pdfdir ;;
-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
-    pdfdir=$ac_optarg ;;
-
-  -psdir | --psdir | --psdi | --psd | --ps)
-    ac_prev=psdir ;;
-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
-    psdir=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=\$ac_optarg ;;
-
-  -without-* | --without-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=no ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) as_fn_error "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information."
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    case $ac_envvar in #(
-      '' | [0-9]* | *[!_$as_cr_alnum]* )
-      as_fn_error "invalid variable name: \`$ac_envvar'" ;;
-    esac
-    eval $ac_envvar=\$ac_optarg
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  as_fn_error "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
-  case $enable_option_checking in
-    no) ;;
-    fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
-  esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
-		datadir sysconfdir sharedstatedir localstatedir includedir \
-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
-do
-  eval ac_val=\$$ac_var
-  # Remove trailing slashes.
-  case $ac_val in
-    */ )
-      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
-      eval $ac_var=\$ac_val;;
-  esac
-  # Be sure to have absolute directory names.
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* )  continue;;
-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
-  esac
-  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used." >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  as_fn_error "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  as_fn_error "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_myself" : 'X\(//\)[^/]' \| \
-	 X"$as_myself" : 'X\(//\)$' \| \
-	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r "$srcdir/$ac_unique_file"; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
-  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
-	pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
-  srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
-  eval ac_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_env_${ac_var}_value=\$${ac_var}
-  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
-  # Omit some internal or obsolete options to make the list less imposing.
-  # This message is too long to be a string in the A/UX 3.1 sh.
-  cat <<_ACEOF
-\`configure' configures package-unused version-unused to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR            user executables [EPREFIX/bin]
-  --sbindir=DIR           system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR        program executables [EPREFIX/libexec]
-  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
-  --libdir=DIR            object code libraries [EPREFIX/lib]
-  --includedir=DIR        C header files [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
-  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR           info documentation [DATAROOTDIR/info]
-  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR            man documentation [DATAROOTDIR/man]
-  --docdir=DIR            documentation root [DATAROOTDIR/doc/libgo]
-  --htmldir=DIR           html documentation [DOCDIR]
-  --dvidir=DIR            dvi documentation [DOCDIR]
-  --pdfdir=DIR            pdf documentation [DOCDIR]
-  --psdir=DIR             ps documentation [DOCDIR]
-_ACEOF
-
-  cat <<\_ACEOF
-
-Program names:
-  --program-prefix=PREFIX            prepend PREFIX to installed program names
-  --program-suffix=SUFFIX            append SUFFIX to installed program names
-  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
-  --target=TARGET   configure for building compilers for TARGET [HOST]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of package-unused version-unused:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-option-checking  ignore unrecognized --enable/--with options
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-multilib       build many library versions (default)
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
-  --enable-maintainer-mode  enable make rules and dependencies not useful
-			  (and sometimes confusing) to the casual installer
-  --enable-shared[=PKGS]  build shared libraries [default=yes]
-  --enable-static[=PKGS]  build static libraries [default=yes]
-  --enable-fast-install[=PKGS]
-                          optimize for fast installation [default=yes]
-  --disable-libtool-lock  avoid locking (might break parallel builds)
-  --enable-werror         turns on -Werror [default=yes]
-  --enable-version-specific-runtime-libs
-                          Specify that runtime libraries should be installed
-                          in a compiler-specific directory
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-pic              try to use only PIC/non-PIC objects [default=use
-                          both]
-  --without-libffi        don't use libffi
-  --without-libatomic     don't use libatomic
-  --with-system-libunwind use installed libunwind
-
-Some influential environment variables:
-  CC          C compiler command
-  CFLAGS      C compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  LIBS        libraries to pass to the linker, e.g. -l<library>
-  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
-              you have headers in a nonstandard directory <include dir>
-  GOC         Go compiler command
-  GOCFLAGS    Go compiler flags
-  CPP         C preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to the package provider.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" ||
-      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
-      continue
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-    cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
-    elif test -f "$ac_srcdir/configure"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure" --help=recursive
-    else
-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi || ac_status=$?
-    cd "$ac_pwd" || { ac_status=$?; break; }
-  done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
-  cat <<\_ACEOF
-package-unused configure version-unused
-generated by GNU Autoconf 2.64
-
-Copyright (C) 2009 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit
-fi
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $2 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_func
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_header_compiler=yes
-else
-  ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  ac_header_preproc=yes
-else
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
-  yes:no: )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_mongrel
-
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
-# -------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_c_check_type ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_type
-
-# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
-# --------------------------------------------
-# Tries to find the compile-time value of EXPR in a program that includes
-# INCLUDES, setting VAR accordingly. Returns whether the value could be
-# computed
-ac_fn_c_compute_int ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if test "$cross_compiling" = yes; then
-    # Depending upon the size, compute the lo and hi bounds.
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= 0)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_lo=0 ac_mid=0
-  while :; do
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=$ac_mid; break
-else
-  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
-			if test $ac_lo -le $ac_mid; then
-			  ac_lo= ac_hi=
-			  break
-			fi
-			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) < 0)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=-1 ac_mid=-1
-  while :; do
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_lo=$ac_mid; break
-else
-  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
-			if test $ac_mid -le $ac_hi; then
-			  ac_lo= ac_hi=
-			  break
-			fi
-			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  ac_lo= ac_hi=
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-# Binary search between lo and hi bounds.
-while test "x$ac_lo" != "x$ac_hi"; do
-  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=$ac_mid
-else
-  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-case $ac_lo in #((
-?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
-'') ac_retval=1 ;;
-esac
-  else
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-static long int longval () { return $2; }
-static unsigned long int ulongval () { return $2; }
-#include <stdio.h>
-#include <stdlib.h>
-int
-main ()
-{
-
-  FILE *f = fopen ("conftest.val", "w");
-  if (! f)
-    return 1;
-  if (($2) < 0)
-    {
-      long int i = longval ();
-      if (i != ($2))
-	return 1;
-      fprintf (f, "%ld", i);
-    }
-  else
-    {
-      unsigned long int i = ulongval ();
-      if (i != ($2))
-	return 1;
-      fprintf (f, "%lu", i);
-    }
-  /* Do not output a trailing newline, as this causes \r\n confusion
-     on some platforms.  */
-  return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else
-  ac_retval=1
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-rm -f conftest.val
-
-  fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  return $ac_retval
-
-} # ac_fn_c_compute_int
-cat >config.log <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by package-unused $as_me version-unused, which was
-generated by GNU Autoconf 2.64.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    $as_echo "PATH: $as_dir"
-  done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *\'*)
-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
-    2)
-      as_fn_append ac_configure_args1 " '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      as_fn_append ac_configure_args " '$ac_arg'"
-      ;;
-    esac
-  done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    cat <<\_ASBOX
-## ---------------- ##
-## Cache variables. ##
-## ---------------- ##
-_ASBOX
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-(
-  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-  (set) 2>&1 |
-    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      sed -n \
-	"s/'\''/'\''\\\\'\'''\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
-      ;; #(
-    *)
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-)
-    echo
-
-    cat <<\_ASBOX
-## ----------------- ##
-## Output variables. ##
-## ----------------- ##
-_ASBOX
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=\$$ac_var
-      case $ac_val in
-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-      esac
-      $as_echo "$ac_var='\''$ac_val'\''"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      cat <<\_ASBOX
-## ------------------- ##
-## File substitutions. ##
-## ------------------- ##
-_ASBOX
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=\$$ac_var
-	case $ac_val in
-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-	esac
-	$as_echo "$ac_var='\''$ac_val'\''"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      cat <<\_ASBOX
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-_ASBOX
-      echo
-      cat confdefs.h
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      $as_echo "$as_me: caught signal $ac_signal"
-    $as_echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core core.conftest.* &&
-    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
-  ac_site_file1=$CONFIG_SITE
-elif test "x$prefix" != xNONE; then
-  ac_site_file1=$prefix/share/config.site
-  ac_site_file2=$prefix/etc/config.site
-else
-  ac_site_file1=$ac_default_prefix/share/config.site
-  ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
-  test "x$ac_site_file" = xNONE && continue
-  if test -r "$ac_site_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special
-  # files actually), so we avoid doing that.
-  if test -f "$cache_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . "$cache_file";;
-      *)                      . "./$cache_file";;
-    esac
-  fi
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val=\$ac_cv_env_${ac_var}_value
-  eval ac_new_val=\$ac_env_${ac_var}_value
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	# differences in whitespace do not lead to failure.
-	ac_old_val_w=`echo x $ac_old_val`
-	ac_new_val_w=`echo x $ac_new_val`
-	if test "$ac_old_val_w" != "$ac_new_val_w"; then
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	  ac_cache_corrupted=:
-	else
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
-	  eval $ac_var=\$ac_old_val
-	fi
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-
-
-ac_config_headers="$ac_config_headers config.h"
-
-
-libtool_VERSION=8:0:0
-
-
-# Default to --enable-multilib
-# Check whether --enable-multilib was given.
-if test "${enable_multilib+set}" = set; then :
-  enableval=$enable_multilib; case "$enableval" in
-  yes) multilib=yes ;;
-  no)  multilib=no ;;
-  *)   as_fn_error "bad value $enableval for multilib option" "$LINENO" 5 ;;
- esac
-else
-  multilib=yes
-fi
-
-
-# We may get other options which we leave undocumented:
-# --with-target-subdir, --with-multisrctop, --with-multisubdir
-# See config-ml.in if you want the gory details.
-
-if test "$srcdir" = "."; then
-  if test "$with_target_subdir" != "."; then
-    multi_basedir="$srcdir/$with_multisrctop../.."
-  else
-    multi_basedir="$srcdir/$with_multisrctop.."
-  fi
-else
-  multi_basedir="$srcdir/.."
-fi
-
-
-# Even if the default multilib is not a cross compilation,
-# it may be that some of the other multilibs are.
-if test $cross_compiling = no && test $multilib = yes \
-   && test "x${with_multisubdir}" != x ; then
-   cross_compiling=maybe
-fi
-
-ac_config_commands="$ac_config_commands default-1"
-
-
-ac_aux_dir=
-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
-  for ac_t in install-sh install.sh shtool; do
-    if test -f "$ac_dir/$ac_t"; then
-      ac_aux_dir=$ac_dir
-      ac_install_sh="$ac_aux_dir/$ac_t -c"
-      break 2
-    fi
-  done
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
-$as_echo_n "checking target system type... " >&6; }
-if test "${ac_cv_target+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$target_alias" = x; then
-  ac_cv_target=$ac_cv_host
-else
-  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
-    as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
-$as_echo "$ac_cv_target" >&6; }
-case $ac_cv_target in
-*-*-*) ;;
-*) as_fn_error "invalid value of canonical target" "$LINENO" 5;;
-esac
-target=$ac_cv_target
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_target
-shift
-target_cpu=$1
-target_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-target_os=$*
-IFS=$ac_save_IFS
-case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
-
-
-# The aliases save the names the user supplied, while $host etc.
-# will get canonicalized.
-test -n "$target_alias" &&
-  test "$program_prefix$program_suffix$program_transform_name" = \
-    NONENONEs,x,x, &&
-  program_prefix=${target_alias}-
-
-target_alias=${target_alias-$host_alias}
-
-am__api_version='1.11'
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
-  ./ | .// | /[cC]/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    rm -rf conftest.one conftest.two conftest.dir
-	    echo one > conftest.one
-	    echo two > conftest.two
-	    mkdir conftest.dir
-	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
-	      test -s conftest.one && test -s conftest.two &&
-	      test -s conftest.dir/conftest.one &&
-	      test -s conftest.dir/conftest.two
-	    then
-	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	      break 3
-	    fi
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-
-  done
-IFS=$as_save_IFS
-
-rm -rf conftest.one conftest.two conftest.dir
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    INSTALL=$ac_install_sh
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[\\\"\#\$\&\'\`$am_lf]*)
-    as_fn_error "unsafe absolute working directory name" "$LINENO" 5;;
-esac
-case $srcdir in
-  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
-    as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      as_fn_error "ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" "$LINENO" 5
-   fi
-
-   test "$2" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   as_fn_error "newly created file is older than distributed files!
-Check your system clock" "$LINENO" 5
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-test "$program_prefix" != NONE &&
-  program_transform_name="s&^&$program_prefix&;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.
-# By default was `s,x,x', remove it if useless.
-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
-if test -z "$MKDIR_P"; then
-  if test "${ac_cv_path_mkdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in mkdir gmkdir; do
-	 for ac_exec_ext in '' $ac_executable_extensions; do
-	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
-	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
-	     'mkdir (GNU coreutils) '* | \
-	     'mkdir (coreutils) '* | \
-	     'mkdir (fileutils) '4.1*)
-	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
-	       break 3;;
-	   esac
-	 done
-       done
-  done
-IFS=$as_save_IFS
-
-fi
-
-  if test "${ac_cv_path_mkdir+set}" = set; then
-    MKDIR_P="$ac_cv_path_mkdir -p"
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for MKDIR_P within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    test -d ./--version && rmdir ./--version
-    MKDIR_P="$ac_install_sh -d"
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
-
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
-for ac_prog in gawk mawk nawk awk
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AWK+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$AWK" && break
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  am__isrc=' -I$(srcdir)'
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='libgo'
- VERSION='version-unused'
-
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.  Yes, it's still used
-# in the wild :-(  We should find a proper way to deprecate it ...
-AMTAR='$${TAR-tar}'
-
-am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
-
-
-
-
-
-
-
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "no acceptable C compiler found in \$PATH
-See \`config.log' for more details." "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    rm -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
-  esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link_default") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile.  We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
-	then :; else
-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	fi
-	# We set ac_cv_exeext here because the later test for it is not
-	# safe: cross compilers may not add the suffix if given an `-o'
-	# argument, so we may need to know it at that point already.
-	# Even if this section looks crufty: it has the advantage of
-	# actually working.
-	break;;
-    * )
-	break;;
-  esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
-  ac_file=''
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-if test -z "$ac_file"; then :
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "C compiler cannot create executables
-See \`config.log' for more details." "$LINENO" 5; }; }
-fi
-ac_exeext=$ac_cv_exeext
-
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-# If not cross compiling, check that we can run a simple program.
-if test "$cross_compiling" != yes; then
-  if { ac_try='./$ac_file'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." "$LINENO" 5; }
-    fi
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out
-ac_clean_files=$ac_clean_files_save
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-rm -f conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  for ac_file in conftest.o conftest.obj conftest.*; do
-  test -f "$ac_file" || continue;
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-else
-  CFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
-  enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-  am__nodep='_no'
-fi
- if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
-else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
-fi
-
-
-
-depcc="$CC"   am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-fi
-
-
-ac_ext=go
-ac_compile='$GOC -c $GOCFLAGS conftest.$ac_ext >&5'
-ac_link='$GOC -o conftest$ac_exeext $GOCFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compile_gnu=yes
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gccgo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gccgo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_GOC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$GOC"; then
-  ac_cv_prog_GOC="$GOC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_GOC="${ac_tool_prefix}gccgo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-GOC=$ac_cv_prog_GOC
-if test -n "$GOC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GOC" >&5
-$as_echo "$GOC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_GOC"; then
-  ac_ct_GOC=$GOC
-  # Extract the first word of "gccgo", so it can be a program name with args.
-set dummy gccgo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_GOC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_GOC"; then
-  ac_cv_prog_ac_ct_GOC="$ac_ct_GOC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_GOC="gccgo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_GOC=$ac_cv_prog_ac_ct_GOC
-if test -n "$ac_ct_GOC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GOC" >&5
-$as_echo "$ac_ct_GOC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_GOC" = x; then
-    GOC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    GOC=$ac_ct_GOC
-  fi
-else
-  GOC="$ac_cv_prog_GOC"
-fi
-
-if test -z "$GOC"; then
-  if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}gccgo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gccgo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_GOC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$GOC"; then
-  ac_cv_prog_GOC="$GOC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_GOC="$ac_tool_prefix}gccgo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-GOC=$ac_cv_prog_GOC
-if test -n "$GOC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GOC" >&5
-$as_echo "$GOC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$GOC"; then
-  # Extract the first word of "gccgo", so it can be a program name with args.
-set dummy gccgo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_GOC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$GOC"; then
-  ac_cv_prog_GOC="$GOC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "gccgo"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_GOC="gccgo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_GOC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set GOC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_GOC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-GOC=$ac_cv_prog_GOC
-if test -n "$GOC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GOC" >&5
-$as_echo "$GOC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for Go compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-{ { ac_try="$ac_compiler --version >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler --version >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    rm -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-GOCFLAGS="-g -O2"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
-$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
-    # Check whether --enable-maintainer-mode was given.
-if test "${enable_maintainer_mode+set}" = set; then :
-  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
-else
-  USE_MAINTAINER_MODE=no
-fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
-$as_echo "$USE_MAINTAINER_MODE" >&6; }
-   if test $USE_MAINTAINER_MODE = yes; then
-  MAINTAINER_MODE_TRUE=
-  MAINTAINER_MODE_FALSE='#'
-else
-  MAINTAINER_MODE_TRUE='#'
-  MAINTAINER_MODE_FALSE=
-fi
-
-  MAINT=$MAINTAINER_MODE_TRUE
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if test "${ac_cv_path_SED+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
-     for ac_i in 1 2 3 4 5 6 7; do
-       ac_script="$ac_script$as_nl$ac_script"
-     done
-     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
-     { ac_script=; unset ac_script;}
-     if test -z "$SED"; then
-  ac_path_SED_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
-# Check for GNU ac_path_SED and select it if it is found.
-  # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
-  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo '' >> "conftest.nl"
-    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_SED_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_SED="$ac_path_SED"
-      ac_path_SED_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_SED_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_SED"; then
-    as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5
-  fi
-else
-  ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
-  rm -f conftest.sed
-
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$GREP"; then
-  ac_path_GREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in grep ggrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_GREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_GREP"; then
-    as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     if test -z "$EGREP"; then
-  ac_path_EGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in egrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_EGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_EGREP"; then
-    as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_EGREP=$EGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if test "${ac_cv_path_FGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
-   then ac_cv_path_FGREP="$GREP -F"
-   else
-     if test -z "$FGREP"; then
-  ac_path_FGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in fgrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
-# Check for GNU ac_path_FGREP and select it if it is found.
-  # Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'FGREP' >> "conftest.nl"
-    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_FGREP="$ac_path_FGREP"
-      ac_path_FGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_FGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_FGREP"; then
-    as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_FGREP=$FGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
- FGREP="$ac_cv_path_FGREP"
-
-
-test -z "$GREP" && GREP=grep
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
-$as_echo_n "checking how to print strings... " >&6; }
-# Test print first, because it will be a builtin if present.
-if test "X`print -r -- -n 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
-else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO ""
-}
-
-case "$ECHO" in
-  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
-$as_echo "printf" >&6; } ;;
-  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
-$as_echo "print -r" >&6; } ;;
-  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
-$as_echo "cat" >&6; } ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if test "${lt_cv_path_LD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if test "${lt_cv_prog_gnu_ld+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objcopy", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objcopy; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OBJCOPY+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OBJCOPY"; then
-  ac_cv_prog_OBJCOPY="$OBJCOPY" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OBJCOPY="${ac_tool_prefix}objcopy"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OBJCOPY=$ac_cv_prog_OBJCOPY
-if test -n "$OBJCOPY"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJCOPY" >&5
-$as_echo "$OBJCOPY" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OBJCOPY"; then
-  ac_ct_OBJCOPY=$OBJCOPY
-  # Extract the first word of "objcopy", so it can be a program name with args.
-set dummy objcopy; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OBJCOPY+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OBJCOPY"; then
-  ac_cv_prog_ac_ct_OBJCOPY="$ac_ct_OBJCOPY" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OBJCOPY="objcopy"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OBJCOPY=$ac_cv_prog_ac_ct_OBJCOPY
-if test -n "$ac_ct_OBJCOPY"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJCOPY" >&5
-$as_echo "$ac_ct_OBJCOPY" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OBJCOPY" = x; then
-    OBJCOPY="missing-objcopy"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OBJCOPY=$ac_ct_OBJCOPY
-  fi
-else
-  OBJCOPY="$ac_cv_prog_OBJCOPY"
-fi
-
-
-enable_dlopen=yes
-
-
-
-case `pwd` in
-  *\ * | *\	*)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
-esac
-
-
-
-macro_version='2.2.7a'
-macro_revision='1.3134'
-
-
-
-
-
-
-
-
-
-
-
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if test "${lt_cv_path_NM+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in dumpbin "link -dump"
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DUMPBIN"; then
-  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DUMPBIN=$ac_cv_prog_DUMPBIN
-if test -n "$DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$DUMPBIN" && break
-  done
-fi
-if test -z "$DUMPBIN"; then
-  ac_ct_DUMPBIN=$DUMPBIN
-  for ac_prog in dumpbin "link -dump"
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DUMPBIN"; then
-  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
-if test -n "$ac_ct_DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_DUMPBIN" && break
-done
-
-  if test "x$ac_ct_DUMPBIN" = x; then
-    DUMPBIN=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DUMPBIN=$ac_ct_DUMPBIN
-  fi
-fi
-
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
-
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if test "${lt_cv_nm_interface+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
-  cat conftest.out >&5
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
-
-# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-    i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-
-fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-
-
-
-
-
-: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-
-
-
-
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if test "${lt_cv_ld_reload_flag+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_reload_flag='-r'
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OBJDUMP"; then
-  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
-  ac_ct_OBJDUMP=$OBJDUMP
-  # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OBJDUMP"; then
-  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OBJDUMP="objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OBJDUMP" = x; then
-    OBJDUMP="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OBJDUMP=$ac_ct_OBJDUMP
-  fi
-else
-  OBJDUMP="$ac_cv_prog_OBJDUMP"
-fi
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if test "${lt_cv_deplibs_check_method+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[4-9]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[45]*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[3-9]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AR="${ac_tool_prefix}ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_AR"; then
-  ac_ct_AR=$AR
-  # Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_AR="ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_AR" = x; then
-    AR="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    AR=$ac_ct_AR
-  fi
-else
-  AR="$ac_cv_prog_AR"
-fi
-
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-test -z "$STRIP" && STRIP=:
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-test -z "$RANLIB" && RANLIB=:
-
-
-
-
-
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[BCDEGRST]'
-  ;;
-osf*)
-  symcode='[BCDEGQRST]'
-  ;;
-solaris*)
-  symcode='[BDRT]'
-  ;;
-sco3.2v5*)
-  symcode='[DT]'
-  ;;
-sysv4.2uw2*)
-  symcode='[DT]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[ABDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK '"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
-  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&5
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&5
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-
-fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
-  enableval=$enable_libtool_lock;
-fi
-
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    case `/usr/bin/file conftest.o` in
-	      *x86-64*)
-		LD="${LD-ld} -m elf32_x86_64"
-		;;
-	      *)
-		LD="${LD-ld} -m elf_i386"
-		;;
-	    esac
-	    ;;
-	  powerpc64le-*linux*)
-	    LD="${LD-ld} -m elf32lppclinux"
-	    ;;
-	  powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  powerpcle-*linux*)
-	    LD="${LD-ld} -m elf64lppc"
-	    ;;
-	  powerpc-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if test "${lt_cv_cc_needs_belf+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_cc_needs_belf=yes
-else
-  lt_cv_cc_needs_belf=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-
-
-  case $host_os in
-    rhapsody* | darwin*)
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DSYMUTIL"; then
-  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DSYMUTIL=$ac_cv_prog_DSYMUTIL
-if test -n "$DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DSYMUTIL"; then
-  ac_ct_DSYMUTIL=$DSYMUTIL
-  # Extract the first word of "dsymutil", so it can be a program name with args.
-set dummy dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DSYMUTIL"; then
-  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
-if test -n "$ac_ct_DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DSYMUTIL" = x; then
-    DSYMUTIL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DSYMUTIL=$ac_ct_DSYMUTIL
-  fi
-else
-  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
-set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NMEDIT"; then
-  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-NMEDIT=$ac_cv_prog_NMEDIT
-if test -n "$NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_NMEDIT"; then
-  ac_ct_NMEDIT=$NMEDIT
-  # Extract the first word of "nmedit", so it can be a program name with args.
-set dummy nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_NMEDIT"; then
-  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_NMEDIT="nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
-if test -n "$ac_ct_NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_NMEDIT" = x; then
-    NMEDIT=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    NMEDIT=$ac_ct_NMEDIT
-  fi
-else
-  NMEDIT="$ac_cv_prog_NMEDIT"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$LIPO"; then
-  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-LIPO=$ac_cv_prog_LIPO
-if test -n "$LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_LIPO"; then
-  ac_ct_LIPO=$LIPO
-  # Extract the first word of "lipo", so it can be a program name with args.
-set dummy lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_LIPO"; then
-  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_LIPO="lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
-if test -n "$ac_ct_LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_LIPO" = x; then
-    LIPO=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    LIPO=$ac_ct_LIPO
-  fi
-else
-  LIPO="$ac_cv_prog_LIPO"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL"; then
-  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL=$ac_cv_prog_OTOOL
-if test -n "$OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL"; then
-  ac_ct_OTOOL=$OTOOL
-  # Extract the first word of "otool", so it can be a program name with args.
-set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL"; then
-  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL="otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL" = x; then
-    OTOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL=$ac_ct_OTOOL
-  fi
-else
-  OTOOL="$ac_cv_prog_OTOOL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL64"; then
-  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL64"; then
-  ac_ct_OTOOL64=$OTOOL64
-  # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL64"; then
-  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL64="otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL64" = x; then
-    OTOOL64=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL64=$ac_ct_OTOOL64
-  fi
-else
-  OTOOL64="$ac_cv_prog_OTOOL64"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&5
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_ld_exported_symbols_list=yes
-else
-  lt_cv_ld_exported_symbols_list=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
-$as_echo_n "checking for -force_load linker flag... " >&6; }
-if test "${lt_cv_ld_force_load+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
-      echo "$AR cru libconftest.a conftest.o" >&5
-      $AR cru libconftest.a conftest.o 2>&5
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&5
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
-$as_echo "$lt_cv_ld_force_load" >&6; }
-    case $host_os in
-    rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012][,.]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-eval as_val=\$$as_ac_Header
-   if test "x$as_val" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in dlfcn.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
-
-fi
-
-done
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gccgo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gccgo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_GOC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$GOC"; then
-  ac_cv_prog_GOC="$GOC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_GOC="${ac_tool_prefix}gccgo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-GOC=$ac_cv_prog_GOC
-if test -n "$GOC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GOC" >&5
-$as_echo "$GOC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_GOC"; then
-  ac_ct_GOC=$GOC
-  # Extract the first word of "gccgo", so it can be a program name with args.
-set dummy gccgo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_GOC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_GOC"; then
-  ac_cv_prog_ac_ct_GOC="$ac_ct_GOC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_GOC="gccgo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_GOC=$ac_cv_prog_ac_ct_GOC
-if test -n "$ac_ct_GOC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GOC" >&5
-$as_echo "$ac_ct_GOC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_GOC" = x; then
-    GOC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    GOC=$ac_ct_GOC
-  fi
-else
-  GOC="$ac_cv_prog_GOC"
-fi
-
-
-
-
-
-
-# Set options
-
-
-
-
-  enable_win32_dll=no
-
-
-            # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
-  enableval=$enable_shared; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_shared=yes
-fi
-
-
-
-
-
-
-
-
-
-  # Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
-  enableval=$enable_static; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_static=yes
-fi
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
-  withval=$with_pic; pic_mode="$withval"
-else
-  pic_mode=default
-fi
-
-
-test -z "$pic_mode" && pic_mode=default
-
-
-
-
-
-
-
-  # Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
-  enableval=$enable_fast_install; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_fast_install=yes
-fi
-
-
-
-
-
-
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-test -z "$LN_S" && LN_S="ln -s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if test "${lt_cv_objdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
-objdir=$lt_cv_objdir
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
-
-
-
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  else
-    MAGIC_CMD=:
-  fi
-fi
-
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-
-lt_prog_compiler_no_builtin_flag=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
-  *)
-    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
-  esac
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_rtti_exceptions=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
-else
-    :
-fi
-
-fi
-
-
-
-
-
-
-  lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl='-Wl,'
-    lt_prog_compiler_static='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      lt_prog_compiler_wl='-Xlinker '
-      lt_prog_compiler_pic='-Xcompiler -fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-KPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='--shared'
-	lt_prog_compiler_static='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fpic'
-	lt_prog_compiler_static='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-qpic'
-	lt_prog_compiler_static='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ F* | *Sun*Fortran*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl=''
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Wl,'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    rdos*)
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    solaris*)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	lt_prog_compiler_wl='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      lt_prog_compiler_wl='-Qoption ld '
-      lt_prog_compiler_pic='-PIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic='-Kconform_pic'
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    unicos*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_can_build_shared=no
-      ;;
-
-    uts4*)
-      lt_prog_compiler_pic='-pic'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *)
-      lt_prog_compiler_can_build_shared=no
-      ;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic=
-    ;;
-  *)
-    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
-    ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
-$as_echo "$lt_prog_compiler_pic" >&6; }
-
-
-
-
-
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
-    case $lt_prog_compiler_pic in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
-     esac
-else
-    lt_prog_compiler_pic=
-     lt_prog_compiler_can_build_shared=no
-fi
-
-fi
-
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
-    :
-else
-    lt_prog_compiler_static=
-fi
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  runpath_var=
-  allow_undefined_flag=
-  always_export_symbols=no
-  archive_cmds=
-  archive_expsym_cmds=
-  compiler_needs_object=no
-  enable_shared_with_static_runtimes=no
-  export_dynamic_flag_spec=
-  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  hardcode_automatic=no
-  hardcode_direct=no
-  hardcode_direct_absolute=no
-  hardcode_libdir_flag_spec=
-  hardcode_libdir_flag_spec_ld=
-  hardcode_libdir_separator=
-  hardcode_minus_L=no
-  hardcode_shlibpath_var=unsupported
-  inherit_rpath=no
-  link_all_deplibs=unknown
-  module_cmds=
-  module_expsym_cmds=
-  old_archive_from_new_cmds=
-  old_archive_from_expsyms_cmds=
-  thread_safe_flag_spec=
-  whole_archive_flag_spec=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  ld_shlibs=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
-	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      export_dynamic_flag_spec='${wl}--export-all-symbols'
-      allow_undefined_flag=unsupported
-      always_export_symbols=no
-      enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    haiku*)
-      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      link_all_deplibs=yes
-      ;;
-
-    interix[3-9]*)
-      hardcode_direct=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  whole_archive_flag_spec=
-	  tmp_sharedflag='--shared' ;;
-	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec=
-	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
-	  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        ld_shlibs=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    ld_shlibs=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-    esac
-
-    if test "$ld_shlibs" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec=
-      export_dynamic_flag_spec=
-      whole_archive_flag_spec=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag=unsupported
-      always_export_symbols=yes
-      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct=unsupported
-      fi
-      ;;
-
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      archive_cmds=''
-      hardcode_direct=yes
-      hardcode_direct_absolute=yes
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  hardcode_direct=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L=yes
-	  hardcode_libdir_flag_spec='-L$libdir'
-	  hardcode_libdir_separator=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      export_dynamic_flag_spec='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    whole_archive_flag_spec='$convenience'
-	  fi
-	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[45]*)
-      export_dynamic_flag_spec=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec=' '
-      allow_undefined_flag=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_from_new_cmds='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes=yes
-      ;;
-
-    darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc=no
-  hardcode_direct=no
-  hardcode_automatic=yes
-  hardcode_shlibpath_var=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-  else
-    whole_archive_flag_spec=''
-  fi
-  link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
-  else
-  ld_shlibs=no
-  fi
-
-      ;;
-
-    dgux*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2.*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_flag_spec_ld='+b $libdir'
-	hardcode_libdir_separator=:
-	hardcode_direct=yes
-	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
-$as_echo_n "checking if $CC understands -b... " >&6; }
-if test "${lt_cv_prog_compiler__b+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler__b=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS -b"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler__b=yes
-       fi
-     else
-       lt_cv_prog_compiler__b=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
-$as_echo "$lt_cv_prog_compiler__b" >&6; }
-
-if test x"$lt_cv_prog_compiler__b" = xyes; then
-    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-else
-    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-fi
-
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_direct=no
-	  hardcode_shlibpath_var=no
-	  ;;
-	*)
-	  hardcode_direct=yes
-	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int foo(void) {}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-        LDFLAGS="$save_LDFLAGS"
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      inherit_rpath=yes
-      link_all_deplibs=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    newsos6)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_shlibpath_var=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	hardcode_direct=yes
-	hardcode_shlibpath_var=no
-	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_separator=:
-      ;;
-
-    solaris*)
-      no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_shlibpath_var=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      link_all_deplibs=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds='$CC -r -o $output$reload_objs'
-	  hardcode_direct=no
-        ;;
-	motorola)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4.3*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var=no
-      export_dynamic_flag_spec='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      ld_shlibs=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
-
-with_gnu_ld=$with_gnu_ld
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if test "${lt_cv_archive_cmds_need_lc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl
-	  pic_flag=$lt_prog_compiler_pic
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag
-	  allow_undefined_flag=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	  then
-	    lt_cv_archive_cmds_need_lc=no
-	  else
-	    lt_cv_archive_cmds_need_lc=yes
-	  fi
-	  allow_undefined_flag=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
-      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[lt_foo]++; }
-  if (lt_freq[lt_foo] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[23].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/beos/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[3-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
-	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-
-fi
-
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" ||
-   test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
-
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-  if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-
-fi
-
-    ;;
-
-  *)
-    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-int
-main ()
-{
-return shl_load ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_shl_load=yes
-else
-  ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
-  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_svld_dlopen=yes
-else
-  ac_cv_lib_svld_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link ();
-int
-main ()
-{
-return dld_link ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_dld_link=yes
-else
-  ac_cv_lib_dld_dld_link=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line 11127 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-void fnord () __attribute__((visibility("default")));
-#endif
-
-void fnord () { int i=42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self_static+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self_static=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line 11233 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-void fnord () __attribute__((visibility("default")));
-#endif
-
-void fnord () { int i=42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self_static=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-striplib=
-old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    fi
-    ;;
-  *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-  # Report which library types will actually be built
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
-
-
-
-
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-CC="$lt_save_CC"
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Source file extension for Go test sources.
-ac_ext=go
-
-# Object file extension for compiled Go test sources.
-objext=o
-objext_GO=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="package main; func main() { }"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='package main; func main() { }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC="$GCC"
-GCC=yes
-CC=${GOC-"gccgo"}
-compiler=$CC
-compiler_GO=$CC
-LD_GO="$LD"
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
-# Go did not exist at the time GCC didn't implicitly link libc in.
-archive_cmds_need_lc_GO=no
-
-old_archive_cmds_GO=$old_archive_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-
-lt_prog_compiler_no_builtin_flag_GO=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    lt_prog_compiler_no_builtin_flag_GO=' -Xcompiler -fno-builtin' ;;
-  *)
-    lt_prog_compiler_no_builtin_flag_GO=' -fno-builtin' ;;
-  esac
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_rtti_exceptions=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag_GO="$lt_prog_compiler_no_builtin_flag_GO -fno-rtti -fno-exceptions"
-else
-    :
-fi
-
-fi
-
-
-
-  lt_prog_compiler_wl_GO=
-lt_prog_compiler_pic_GO=
-lt_prog_compiler_static_GO=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl_GO='-Wl,'
-    lt_prog_compiler_static_GO='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_GO='-Bstatic'
-      fi
-      lt_prog_compiler_pic_GO='-fPIC'
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic_GO='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic_GO='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic_GO='-DDLL_EXPORT'
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic_GO='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static_GO=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic_GO='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared_GO=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic_GO='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic_GO=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      lt_prog_compiler_pic_GO='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      lt_prog_compiler_wl_GO='-Xlinker '
-      lt_prog_compiler_pic_GO='-Xcompiler -fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl_GO='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_GO='-Bstatic'
-      else
-	lt_prog_compiler_static_GO='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic_GO='-DDLL_EXPORT'
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl_GO='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic_GO='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static_GO='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl_GO='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static_GO='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	lt_prog_compiler_wl_GO='-Wl,'
-	lt_prog_compiler_pic_GO='-KPIC'
-	lt_prog_compiler_static_GO='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	lt_prog_compiler_wl_GO='-Wl,'
-	lt_prog_compiler_pic_GO='-fPIC'
-	lt_prog_compiler_static_GO='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	lt_prog_compiler_wl_GO='-Wl,'
-	lt_prog_compiler_pic_GO='--shared'
-	lt_prog_compiler_static_GO='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl_GO='-Wl,'
-	lt_prog_compiler_pic_GO='-fpic'
-	lt_prog_compiler_static_GO='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl_GO='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static_GO='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	lt_prog_compiler_wl_GO='-Wl,'
-	lt_prog_compiler_pic_GO='-qpic'
-	lt_prog_compiler_static_GO='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ F* | *Sun*Fortran*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  lt_prog_compiler_pic_GO='-KPIC'
-	  lt_prog_compiler_static_GO='-Bstatic'
-	  lt_prog_compiler_wl_GO=''
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  lt_prog_compiler_pic_GO='-KPIC'
-	  lt_prog_compiler_static_GO='-Bstatic'
-	  lt_prog_compiler_wl_GO='-Wl,'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      lt_prog_compiler_pic_GO='-KPIC'
-      lt_prog_compiler_static_GO='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic_GO='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl_GO='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static_GO='-non_shared'
-      ;;
-
-    rdos*)
-      lt_prog_compiler_static_GO='-non_shared'
-      ;;
-
-    solaris*)
-      lt_prog_compiler_pic_GO='-KPIC'
-      lt_prog_compiler_static_GO='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	lt_prog_compiler_wl_GO='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl_GO='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      lt_prog_compiler_wl_GO='-Qoption ld '
-      lt_prog_compiler_pic_GO='-PIC'
-      lt_prog_compiler_static_GO='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl_GO='-Wl,'
-      lt_prog_compiler_pic_GO='-KPIC'
-      lt_prog_compiler_static_GO='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic_GO='-Kconform_pic'
-	lt_prog_compiler_static_GO='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl_GO='-Wl,'
-      lt_prog_compiler_pic_GO='-KPIC'
-      lt_prog_compiler_static_GO='-Bstatic'
-      ;;
-
-    unicos*)
-      lt_prog_compiler_wl_GO='-Wl,'
-      lt_prog_compiler_can_build_shared_GO=no
-      ;;
-
-    uts4*)
-      lt_prog_compiler_pic_GO='-pic'
-      lt_prog_compiler_static_GO='-Bstatic'
-      ;;
-
-    *)
-      lt_prog_compiler_can_build_shared_GO=no
-      ;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic_GO=
-    ;;
-  *)
-    lt_prog_compiler_pic_GO="$lt_prog_compiler_pic_GO"
-    ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_GO" >&5
-$as_echo "$lt_prog_compiler_pic_GO" >&6; }
-
-
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_GO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_GO works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_GO works... " >&6; }
-if test "${lt_cv_prog_compiler_pic_works_GO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works_GO=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_GO"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works_GO=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_GO" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works_GO" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works_GO" = xyes; then
-    case $lt_prog_compiler_pic_GO in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic_GO=" $lt_prog_compiler_pic_GO" ;;
-     esac
-else
-    lt_prog_compiler_pic_GO=
-     lt_prog_compiler_can_build_shared_GO=no
-fi
-
-fi
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_GO eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GO\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if test "${lt_cv_prog_compiler_static_works_GO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works_GO=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works_GO=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works_GO=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_GO" >&5
-$as_echo "$lt_cv_prog_compiler_static_works_GO" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works_GO" = xyes; then
-    :
-else
-    lt_prog_compiler_static_GO=
-fi
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o_GO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o_GO=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_GO=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_GO" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_GO" >&6; }
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o_GO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o_GO=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_GO=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_GO" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_GO" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_GO" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  runpath_var=
-  allow_undefined_flag_GO=
-  always_export_symbols_GO=no
-  archive_cmds_GO=
-  archive_expsym_cmds_GO=
-  compiler_needs_object_GO=no
-  enable_shared_with_static_runtimes_GO=no
-  export_dynamic_flag_spec_GO=
-  export_symbols_cmds_GO='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  hardcode_automatic_GO=no
-  hardcode_direct_GO=no
-  hardcode_direct_absolute_GO=no
-  hardcode_libdir_flag_spec_GO=
-  hardcode_libdir_flag_spec_ld_GO=
-  hardcode_libdir_separator_GO=
-  hardcode_minus_L_GO=no
-  hardcode_shlibpath_var_GO=unsupported
-  inherit_rpath_GO=no
-  link_all_deplibs_GO=unknown
-  module_cmds_GO=
-  module_expsym_cmds_GO=
-  old_archive_from_new_cmds_GO=
-  old_archive_from_expsyms_cmds_GO=
-  thread_safe_flag_spec_GO=
-  whole_archive_flag_spec_GO=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms_GO=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms_GO='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  ld_shlibs_GO=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
-	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec_GO='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec_GO='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec_GO="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec_GO=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs_GO=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds_GO=''
-        ;;
-      m68k)
-            archive_cmds_GO='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec_GO='-L$libdir'
-            hardcode_minus_L_GO=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag_GO=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds_GO='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs_GO=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, GO) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec_GO='-L$libdir'
-      export_dynamic_flag_spec_GO='${wl}--export-all-symbols'
-      allow_undefined_flag_GO=unsupported
-      always_export_symbols_GO=no
-      enable_shared_with_static_runtimes_GO=yes
-      export_symbols_cmds_GO='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds_GO='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs_GO=no
-      fi
-      ;;
-
-    haiku*)
-      archive_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      link_all_deplibs_GO=yes
-      ;;
-
-    interix[3-9]*)
-      hardcode_direct_GO=no
-      hardcode_shlibpath_var_GO=no
-      hardcode_libdir_flag_spec_GO='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec_GO='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds_GO='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds_GO='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec_GO='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec_GO='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  whole_archive_flag_spec_GO=
-	  tmp_sharedflag='--shared' ;;
-	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec_GO='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object_GO=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec_GO='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object_GO=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	archive_cmds_GO='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          archive_expsym_cmds_GO='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  whole_archive_flag_spec_GO='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec_GO=
-	  hardcode_libdir_flag_spec_ld_GO='-rpath $libdir'
-	  archive_cmds_GO='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    archive_expsym_cmds_GO='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        ld_shlibs_GO=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds_GO='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	ld_shlibs_GO=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs_GO=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs_GO=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec_GO='${wl}-rpath ${wl}$libdir'
-	    archive_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    ld_shlibs_GO=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      archive_cmds_GO='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct_GO=yes
-      hardcode_shlibpath_var_GO=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs_GO=no
-      fi
-      ;;
-    esac
-
-    if test "$ld_shlibs_GO" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec_GO=
-      export_dynamic_flag_spec_GO=
-      whole_archive_flag_spec_GO=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag_GO=unsupported
-      always_export_symbols_GO=yes
-      archive_expsym_cmds_GO='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L_GO=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct_GO=unsupported
-      fi
-      ;;
-
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds_GO='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds_GO='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      archive_cmds_GO=''
-      hardcode_direct_GO=yes
-      hardcode_direct_absolute_GO=yes
-      hardcode_libdir_separator_GO=':'
-      link_all_deplibs_GO=yes
-      file_list_spec_GO='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  hardcode_direct_GO=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L_GO=yes
-	  hardcode_libdir_flag_spec_GO='-L$libdir'
-	  hardcode_libdir_separator_GO=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      export_dynamic_flag_spec_GO='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols_GO=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag_GO='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-        hardcode_libdir_flag_spec_GO='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds_GO='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec_GO='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag_GO="-z nodefs"
-	  archive_expsym_cmds_GO="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	 hardcode_libdir_flag_spec_GO='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag_GO=' ${wl}-bernotok'
-	  allow_undefined_flag_GO=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec_GO='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    whole_archive_flag_spec_GO='$convenience'
-	  fi
-	  archive_cmds_need_lc_GO=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds_GO="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds_GO=''
-        ;;
-      m68k)
-            archive_cmds_GO='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec_GO='-L$libdir'
-            hardcode_minus_L_GO=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[45]*)
-      export_dynamic_flag_spec_GO=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec_GO=' '
-      allow_undefined_flag_GO=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds_GO='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_from_new_cmds_GO='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds_GO='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path_GO='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes_GO=yes
-      ;;
-
-    darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc_GO=no
-  hardcode_direct_GO=no
-  hardcode_automatic_GO=yes
-  hardcode_shlibpath_var_GO=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec_GO='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-  else
-    whole_archive_flag_spec_GO=''
-  fi
-  link_all_deplibs_GO=yes
-  allow_undefined_flag_GO="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds_GO="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds_GO="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds_GO="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds_GO="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
-  else
-  ld_shlibs_GO=no
-  fi
-
-      ;;
-
-    dgux*)
-      archive_cmds_GO='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec_GO='-L$libdir'
-      hardcode_shlibpath_var_GO=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds_GO='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec_GO='-R$libdir'
-      hardcode_direct_GO=yes
-      hardcode_shlibpath_var_GO=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2.*)
-      archive_cmds_GO='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct_GO=yes
-      hardcode_minus_L_GO=yes
-      hardcode_shlibpath_var_GO=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      archive_cmds_GO='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec_GO='-R$libdir'
-      hardcode_direct_GO=yes
-      hardcode_shlibpath_var_GO=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds_GO='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds_GO='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec_GO='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator_GO=:
-      hardcode_direct_GO=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L_GO=yes
-      export_dynamic_flag_spec_GO='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds_GO='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_GO='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec_GO='${wl}+b ${wl}$libdir'
-	hardcode_libdir_flag_spec_ld_GO='+b $libdir'
-	hardcode_libdir_separator_GO=:
-	hardcode_direct_GO=yes
-	hardcode_direct_absolute_GO=yes
-	export_dynamic_flag_spec_GO='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L_GO=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_GO='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_GO='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_GO='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_GO='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_GO='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	archive_cmds_GO='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec_GO='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator_GO=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_direct_GO=no
-	  hardcode_shlibpath_var_GO=no
-	  ;;
-	*)
-	  hardcode_direct_GO=yes
-	  hardcode_direct_absolute_GO=yes
-	  export_dynamic_flag_spec_GO='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L_GO=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int foo(void) {}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  archive_expsym_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-        LDFLAGS="$save_LDFLAGS"
-      else
-	archive_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds_GO='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      archive_cmds_need_lc_GO='no'
-      hardcode_libdir_flag_spec_GO='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_GO=:
-      inherit_rpath_GO=yes
-      link_all_deplibs_GO=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds_GO='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds_GO='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec_GO='-R$libdir'
-      hardcode_direct_GO=yes
-      hardcode_shlibpath_var_GO=no
-      ;;
-
-    newsos6)
-      archive_cmds_GO='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct_GO=yes
-      hardcode_libdir_flag_spec_GO='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_GO=:
-      hardcode_shlibpath_var_GO=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	hardcode_direct_GO=yes
-	hardcode_shlibpath_var_GO=no
-	hardcode_direct_absolute_GO=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  archive_cmds_GO='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_GO='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec_GO='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec_GO='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds_GO='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec_GO='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds_GO='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec_GO='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	ld_shlibs_GO=no
-      fi
-      ;;
-
-    os2*)
-      hardcode_libdir_flag_spec_GO='-L$libdir'
-      hardcode_minus_L_GO=yes
-      allow_undefined_flag_GO=unsupported
-      archive_cmds_GO='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds_GO='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag_GO=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_GO='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag_GO=' -expect_unresolved \*'
-	archive_cmds_GO='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      archive_cmds_need_lc_GO='no'
-      hardcode_libdir_flag_spec_GO='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_GO=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag_GO=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_GO='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec_GO='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag_GO=' -expect_unresolved \*'
-	archive_cmds_GO='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds_GO='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec_GO='-rpath $libdir'
-      fi
-      archive_cmds_need_lc_GO='no'
-      hardcode_libdir_separator_GO=:
-      ;;
-
-    solaris*)
-      no_undefined_flag_GO=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds_GO='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GO='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  archive_cmds_GO='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  archive_expsym_cmds_GO='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  archive_cmds_GO='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_GO='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      hardcode_libdir_flag_spec_GO='-R$libdir'
-      hardcode_shlibpath_var_GO=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec_GO='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  whole_archive_flag_spec_GO='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      link_all_deplibs_GO=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds_GO='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_GO='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec_GO='-L$libdir'
-      hardcode_direct_GO=yes
-      hardcode_minus_L_GO=yes
-      hardcode_shlibpath_var_GO=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds_GO='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct_GO=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds_GO='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds_GO='$CC -r -o $output$reload_objs'
-	  hardcode_direct_GO=no
-        ;;
-	motorola)
-	  archive_cmds_GO='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct_GO=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var_GO=no
-      ;;
-
-    sysv4.3*)
-      archive_cmds_GO='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var_GO=no
-      export_dynamic_flag_spec_GO='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds_GO='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var_GO=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs_GO=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag_GO='${wl}-z,text'
-      archive_cmds_need_lc_GO=no
-      hardcode_shlibpath_var_GO=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds_GO='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GO='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_GO='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GO='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag_GO='${wl}-z,text'
-      allow_undefined_flag_GO='${wl}-z,nodefs'
-      archive_cmds_need_lc_GO=no
-      hardcode_shlibpath_var_GO=no
-      hardcode_libdir_flag_spec_GO='${wl}-R,$libdir'
-      hardcode_libdir_separator_GO=':'
-      link_all_deplibs_GO=yes
-      export_dynamic_flag_spec_GO='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds_GO='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GO='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_GO='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_GO='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      archive_cmds_GO='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec_GO='-L$libdir'
-      hardcode_shlibpath_var_GO=no
-      ;;
-
-    *)
-      ld_shlibs_GO=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec_GO='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_GO" >&5
-$as_echo "$ld_shlibs_GO" >&6; }
-test "$ld_shlibs_GO" = no && can_build_shared=no
-
-with_gnu_ld_GO=$with_gnu_ld
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_GO" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc_GO=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds_GO in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if test "${lt_cv_archive_cmds_need_lc_GO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl_GO
-	  pic_flag=$lt_prog_compiler_pic_GO
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag_GO
-	  allow_undefined_flag_GO=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_GO 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds_GO 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	  then
-	    lt_cv_archive_cmds_need_lc_GO=no
-	  else
-	    lt_cv_archive_cmds_need_lc_GO=yes
-	  fi
-	  allow_undefined_flag_GO=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_GO" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc_GO" >&6; }
-      archive_cmds_need_lc_GO=$lt_cv_archive_cmds_need_lc_GO
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action_GO=
-if test -n "$hardcode_libdir_flag_spec_GO" ||
-   test -n "$runpath_var_GO" ||
-   test "X$hardcode_automatic_GO" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct_GO" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, GO)" != no &&
-     test "$hardcode_minus_L_GO" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action_GO=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action_GO=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action_GO=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_GO" >&5
-$as_echo "$hardcode_action_GO" >&6; }
-
-if test "$hardcode_action_GO" = relink ||
-   test "$inherit_rpath_GO" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-GCC=$lt_save_GCC
-CC="$lt_save_CC"
-
-
-
-
-        ac_config_commands="$ac_config_commands libtool"
-
-
-
-
-# Only expand once:
-
-
-
-
-
-CC_FOR_BUILD=${CC_FOR_BUILD:-gcc}
-
-
-for ac_prog in gawk mawk nawk awk
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AWK+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$AWK" && break
-done
-
-
-WARN_FLAGS='-Wall -Wextra -Wwrite-strings -Wcast-qual'
-
-
-# Check whether --enable-werror was given.
-if test "${enable_werror+set}" = set; then :
-  enableval=$enable_werror;
-fi
-
-if test "x$enable_werror" != "xno"; then
-  WERROR="-Werror"
-fi
-
-
-glibgo_toolexecdir=no
-glibgo_toolexeclibdir=no
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --enable-version-specific-runtime-libs" >&5
-$as_echo_n "checking for --enable-version-specific-runtime-libs... " >&6; }
-# Check whether --enable-version-specific-runtime-libs was given.
-if test "${enable_version_specific_runtime_libs+set}" = set; then :
-  enableval=$enable_version_specific_runtime_libs; case "$enableval" in
-    yes) version_specific_libs=yes ;;
-    no)  version_specific_libs=no ;;
-    *)   as_fn_error "Unknown argument to enable/disable version-specific libs" "$LINENO" 5;;
-   esac
-else
-  version_specific_libs=no
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $version_specific_libs" >&5
-$as_echo "$version_specific_libs" >&6; }
-
-# Version-specific runtime libs processing.
-if test $version_specific_libs = yes; then
-  glibgo_toolexecdir='${libdir}/gcc/${host_alias}'
-  glibgo_toolexeclibdir='${toolexecdir}/${gcc_version}$(MULTISUBDIR)'
-fi
-
-# Calculate glibgo_toolexecdir, glibgo_toolexeclibdir
-# Install a library built with a cross compiler in tooldir, not libdir.
-if test -n "$with_cross_host" &&
-   test x"$with_cross_host" != x"no"; then
-  nover_glibgo_toolexecdir='${exec_prefix}/${host_alias}'
-  nover_glibgo_toolexeclibdir='${toolexecdir}/lib'
-else
-  nover_glibgo_toolexecdir='${libdir}/gcc/${host_alias}'
-  nover_glibgo_toolexeclibdir='${libdir}'
-fi
-multi_os_directory=`$GOC -print-multi-os-directory`
-case $multi_os_directory in
-  .) ;; # Avoid trailing /.
-  *) nover_glibgo_toolexeclibdir=${nover_glibgo_toolexeclibdir}/${multi_os_directory} ;;
-esac
-
-if test x"$glibgo_toolexecdir" = x"no"; then
-  glibgo_toolexecdir="${nover_glibgo_toolexecdir}"
-  glibgo_toolexeclibdir="${nover_glibgo_toolexeclibdir}"
-fi
-
-
-
-
-
-# See if the user wants to configure without libffi.  Some
-# architectures don't support it.  FIXME: We should set a default
-# based on the host.
-
-# Check whether --with-libffi was given.
-if test "${with_libffi+set}" = set; then :
-  withval=$with_libffi; :
-else
-  with_libffi=${with_libffi_default-yes}
-fi
-
-
-LIBFFI=
-LIBFFIINCS=
-if test "$with_libffi" != no; then
-
-$as_echo "#define USE_LIBFFI 1" >>confdefs.h
-
-   LIBFFI=../libffi/libffi_convenience.la
-   LIBFFIINCS='-I$(top_srcdir)/../libffi/include -I../libffi/include'
-fi
-
-
-
-# See if the user wants to configure without libatomic. This is useful if we are
-# on an architecture for which libgo does not need an atomic support library and
-# libatomic does not support our C compiler.
-
-# Check whether --with-libatomic was given.
-if test "${with_libatomic+set}" = set; then :
-  withval=$with_libatomic; :
-else
-  with_libatomic=${with_libatomic_default-yes}
-fi
-
-
-LIBATOMIC=
-if test "$with_libatomic" != no; then
-   LIBATOMIC=../libatomic/libatomic_convenience.la
-fi
-
-
-# Used to tell GNU make to include a file without telling automake to
-# include it.
-go_include="-include"
-
-
-is_darwin=no
-is_freebsd=no
-is_irix=no
-is_linux=no
-is_netbsd=no
-is_openbsd=no
-is_dragonfly=no
-is_rtems=no
-is_solaris=no
-GOOS=unknown
-case ${host} in
-  *-*-darwin*)   is_darwin=yes;  GOOS=darwin ;;
-  *-*-freebsd*)  is_freebsd=yes; GOOS=freebsd ;;
-  *-*-irix6*)    is_irix=yes;    GOOS=irix ;;
-  *-*-linux*)    is_linux=yes;   GOOS=linux ;;
-  *-*-netbsd*)	 is_netbsd=yes;  GOOS=netbsd ;;
-  *-*-openbsd*)  is_openbsd=yes; GOOS=openbsd ;;
-  *-*-dragonfly*) is_dragonfly=yes; GOOS=dragonfly ;;
-  *-*-rtems*)    is_rtems=yes;   GOOS=rtems ;;
-  *-*-solaris2*) is_solaris=yes; GOOS=solaris ;;
-esac
- if test $is_darwin = yes; then
-  LIBGO_IS_DARWIN_TRUE=
-  LIBGO_IS_DARWIN_FALSE='#'
-else
-  LIBGO_IS_DARWIN_TRUE='#'
-  LIBGO_IS_DARWIN_FALSE=
-fi
-
- if test $is_freebsd = yes; then
-  LIBGO_IS_FREEBSD_TRUE=
-  LIBGO_IS_FREEBSD_FALSE='#'
-else
-  LIBGO_IS_FREEBSD_TRUE='#'
-  LIBGO_IS_FREEBSD_FALSE=
-fi
-
- if test $is_irix = yes; then
-  LIBGO_IS_IRIX_TRUE=
-  LIBGO_IS_IRIX_FALSE='#'
-else
-  LIBGO_IS_IRIX_TRUE='#'
-  LIBGO_IS_IRIX_FALSE=
-fi
-
- if test $is_linux = yes; then
-  LIBGO_IS_LINUX_TRUE=
-  LIBGO_IS_LINUX_FALSE='#'
-else
-  LIBGO_IS_LINUX_TRUE='#'
-  LIBGO_IS_LINUX_FALSE=
-fi
-
- if test $is_netbsd = yes; then
-  LIBGO_IS_NETBSD_TRUE=
-  LIBGO_IS_NETBSD_FALSE='#'
-else
-  LIBGO_IS_NETBSD_TRUE='#'
-  LIBGO_IS_NETBSD_FALSE=
-fi
-
- if test $is_openbsd = yes; then
-  LIBGO_IS_OPENBSD_TRUE=
-  LIBGO_IS_OPENBSD_FALSE='#'
-else
-  LIBGO_IS_OPENBSD_TRUE='#'
-  LIBGO_IS_OPENBSD_FALSE=
-fi
-
- if test $is_dragonfly = yes; then
-  LIBGO_IS_DRAGONFLY_TRUE=
-  LIBGO_IS_DRAGONFLY_FALSE='#'
-else
-  LIBGO_IS_DRAGONFLY_TRUE='#'
-  LIBGO_IS_DRAGONFLY_FALSE=
-fi
-
- if test $is_rtems = yes; then
-  LIBGO_IS_RTEMS_TRUE=
-  LIBGO_IS_RTEMS_FALSE='#'
-else
-  LIBGO_IS_RTEMS_TRUE='#'
-  LIBGO_IS_RTEMS_FALSE=
-fi
-
- if test $is_solaris = yes; then
-  LIBGO_IS_SOLARIS_TRUE=
-  LIBGO_IS_SOLARIS_FALSE='#'
-else
-  LIBGO_IS_SOLARIS_TRUE='#'
-  LIBGO_IS_SOLARIS_FALSE=
-fi
-
-
-
-USE_DEJAGNU=no
-case ${host} in
-  *-*-rtems*) USE_DEJAGNU=yes ;;
-  ${build}) ;;
-  *) USE_DEJAGNU=yes ;;
-esac
-
-
-is_386=no
-is_alpha=no
-is_arm=no
-is_arm64=no
-is_m68k=no
-mips_abi=unknown
-is_ppc=no
-is_ppc64=no
-is_ppc64le=no
-is_s390=no
-is_s390x=no
-is_sparc=no
-is_sparc64=no
-is_x86_64=no
-GOARCH=unknown
-case ${host} in
-  alpha*-*-*)
-    is_alpha=yes
-    GOARCH=alpha
-    ;;
-  aarch64-*-*)
-    is_arm64=yes
-    GOARCH=arm64
-    ;;
-  arm*-*-* | strongarm*-*-* | ep9312*-*-* | xscale-*-*)
-    is_arm=yes
-    GOARCH=arm
-    ;;
-  i[34567]86-*-* | x86_64-*-*)
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef __x86_64__
-#error 64-bit
-#endif
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  is_386=yes
-else
-  is_x86_64=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    if test "$is_386" = "yes"; then
-      GOARCH=386
-    else
-      GOARCH=amd64
-    fi
-    ;;
-  m68k*-*-*)
-    is_m68k=yes
-    GOARCH=m68k
-    ;;
-  mips*-*-*)
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#if _MIPS_SIM != _ABIO32
-#error not o32
-#endif
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  mips_abi="o32"
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#if _MIPS_SIM != _ABIN32
-#error not n32
-#endif
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  mips_abi="n32"
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#if _MIPS_SIM != _ABI64
-#error not n64
-#endif
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  mips_abi="n64"
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#if _MIPS_SIM != _ABIO64
-#error not o64
-#endif
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  mips_abi="o64"
-else
-  as_fn_error "unknown MIPS ABI" "$LINENO" 5
-mips_abi="n32"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    case "$mips_abi" in
-    "o32") GOARCH=mipso32 ;;
-    "n32") GOARCH=mipsn32 ;;
-    "n64") GOARCH=mipsn64 ;;
-    "o64") GOARCH=mipso64 ;;
-    esac
-    ;;
-  rs6000*-*-* | powerpc*-*-*)
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef _ARCH_PPC64
-#error 64-bit
-#endif
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  is_ppc=yes
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#if defined(_BIG_ENDIAN) || defined(__BIG_ENDIAN__)
-#error 64be
-#endif
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  is_ppc64le=yes
-else
-  is_ppc64=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    if test "$is_ppc" = "yes"; then
-      GOARCH=ppc
-    elif test "$is_ppc64" = "yes"; then
-      GOARCH=ppc64
-    else
-      GOARCH=ppc64le
-    fi
-    ;;
-  s390*-*-*)
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#if defined(__s390x__)
-#error 64-bit
-#endif
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  is_s390=yes
-else
-  is_s390x=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    if test "$is_s390" = "yes"; then
-      GOARCH=s390
-    else
-      GOARCH=s390x
-    fi
-    ;;
-  sparc*-*-*)
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#if defined(__sparcv9) || defined(__arch64__)
-#error 64-bit
-#endif
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  is_sparc=yes
-else
-  is_sparc64=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    if test "$is_sparc" = "yes"; then
-      GOARCH=sparc
-    else
-      GOARCH=sparc64
-    fi
-    ;;
-esac
- if test $is_386 = yes; then
-  LIBGO_IS_386_TRUE=
-  LIBGO_IS_386_FALSE='#'
-else
-  LIBGO_IS_386_TRUE='#'
-  LIBGO_IS_386_FALSE=
-fi
-
- if test $is_alpha = yes; then
-  LIBGO_IS_ALPHA_TRUE=
-  LIBGO_IS_ALPHA_FALSE='#'
-else
-  LIBGO_IS_ALPHA_TRUE='#'
-  LIBGO_IS_ALPHA_FALSE=
-fi
-
- if test $is_arm = yes; then
-  LIBGO_IS_ARM_TRUE=
-  LIBGO_IS_ARM_FALSE='#'
-else
-  LIBGO_IS_ARM_TRUE='#'
-  LIBGO_IS_ARM_FALSE=
-fi
-
- if test $is_arm64 = yes; then
-  LIBGO_IS_ARM64_TRUE=
-  LIBGO_IS_ARM64_FALSE='#'
-else
-  LIBGO_IS_ARM64_TRUE='#'
-  LIBGO_IS_ARM64_FALSE=
-fi
-
- if test $is_m68k = yes; then
-  LIBGO_IS_M68K_TRUE=
-  LIBGO_IS_M68K_FALSE='#'
-else
-  LIBGO_IS_M68K_TRUE='#'
-  LIBGO_IS_M68K_FALSE=
-fi
-
- if test $mips_abi != unknown; then
-  LIBGO_IS_MIPS_TRUE=
-  LIBGO_IS_MIPS_FALSE='#'
-else
-  LIBGO_IS_MIPS_TRUE='#'
-  LIBGO_IS_MIPS_FALSE=
-fi
-
- if test $mips_abi = o32; then
-  LIBGO_IS_MIPSO32_TRUE=
-  LIBGO_IS_MIPSO32_FALSE='#'
-else
-  LIBGO_IS_MIPSO32_TRUE='#'
-  LIBGO_IS_MIPSO32_FALSE=
-fi
-
- if test $mips_abi = n32; then
-  LIBGO_IS_MIPSN32_TRUE=
-  LIBGO_IS_MIPSN32_FALSE='#'
-else
-  LIBGO_IS_MIPSN32_TRUE='#'
-  LIBGO_IS_MIPSN32_FALSE=
-fi
-
- if test $mips_abi = n64; then
-  LIBGO_IS_MIPSN64_TRUE=
-  LIBGO_IS_MIPSN64_FALSE='#'
-else
-  LIBGO_IS_MIPSN64_TRUE='#'
-  LIBGO_IS_MIPSN64_FALSE=
-fi
-
- if test $mips_abi = o64; then
-  LIBGO_IS_MIPSO64_TRUE=
-  LIBGO_IS_MIPSO64_FALSE='#'
-else
-  LIBGO_IS_MIPSO64_TRUE='#'
-  LIBGO_IS_MIPSO64_FALSE=
-fi
-
- if test $is_ppc = yes; then
-  LIBGO_IS_PPC_TRUE=
-  LIBGO_IS_PPC_FALSE='#'
-else
-  LIBGO_IS_PPC_TRUE='#'
-  LIBGO_IS_PPC_FALSE=
-fi
-
- if test $is_ppc64 = yes; then
-  LIBGO_IS_PPC64_TRUE=
-  LIBGO_IS_PPC64_FALSE='#'
-else
-  LIBGO_IS_PPC64_TRUE='#'
-  LIBGO_IS_PPC64_FALSE=
-fi
-
- if test $is_ppc64le = yes; then
-  LIBGO_IS_PPC64LE_TRUE=
-  LIBGO_IS_PPC64LE_FALSE='#'
-else
-  LIBGO_IS_PPC64LE_TRUE='#'
-  LIBGO_IS_PPC64LE_FALSE=
-fi
-
- if test $is_s390 = yes; then
-  LIBGO_IS_S390_TRUE=
-  LIBGO_IS_S390_FALSE='#'
-else
-  LIBGO_IS_S390_TRUE='#'
-  LIBGO_IS_S390_FALSE=
-fi
-
- if test $is_s390x = yes; then
-  LIBGO_IS_S390X_TRUE=
-  LIBGO_IS_S390X_FALSE='#'
-else
-  LIBGO_IS_S390X_TRUE='#'
-  LIBGO_IS_S390X_FALSE=
-fi
-
- if test $is_sparc = yes; then
-  LIBGO_IS_SPARC_TRUE=
-  LIBGO_IS_SPARC_FALSE='#'
-else
-  LIBGO_IS_SPARC_TRUE='#'
-  LIBGO_IS_SPARC_FALSE=
-fi
-
- if test $is_sparc64 = yes; then
-  LIBGO_IS_SPARC64_TRUE=
-  LIBGO_IS_SPARC64_FALSE='#'
-else
-  LIBGO_IS_SPARC64_TRUE='#'
-  LIBGO_IS_SPARC64_FALSE=
-fi
-
- if test $is_x86_64 = yes; then
-  LIBGO_IS_X86_64_TRUE=
-  LIBGO_IS_X86_64_FALSE='#'
-else
-  LIBGO_IS_X86_64_TRUE='#'
-  LIBGO_IS_X86_64_FALSE=
-fi
-
-
-
-GO_LIBCALL_OS_FILE=
-GO_LIBCALL_OS_ARCH_FILE=
-GO_SYSCALL_OS_FILE=
-GO_SYSCALL_OS_ARCH_FILE=
-if test -f "${srcdir}/go/syscall/libcall_${GOOS}.go"; then
-  GO_LIBCALL_OS_FILE="go/syscall/libcall_${GOOS}.go"
-fi
-if test -f "${srcdir}/go/syscall/libcall_${GOOS}_${GOARCH}.go"; then
-  GO_LIBCALL_OS_ARCH_FILE="go/syscall/libcall_${GOOS}_${GOARCH}.go"
-fi
-if test -f "${srcdir}/go/syscall/syscall_${GOOS}.go"; then
-  GO_SYSCALL_OS_FILE="go/syscall/syscall_${GOOS}.go"
-fi
-if test -f "${srcdir}/go/syscall/syscall_${GOOS}_${GOARCH}.go"; then
-  GO_SYSCALL_OS_ARCH_FILE="go/syscall/syscall_${GOOS}_${GOARCH}.go"
-fi
-
-
-
-
-
-OSCFLAGS="-D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
-case "$target" in
-    mips-sgi-irix6.5*)
-	# IRIX 6 needs _XOPEN_SOURCE=500 for the XPG5 version of struct
-	# msghdr in <sys/socket.h>.
-	OSCFLAGS="$OSCFLAGS -D_XOPEN_SOURCE=500"
-	;;
-    *-*-solaris2.1[01])
-	# Solaris 10+ needs this so struct msghdr gets the msg_control
-	# etc. fields in <sys/socket.h> (_XPG4_2).  _XOPEN_SOURCE=600 as
-	# above doesn't work with C99.
-	OSCFLAGS="$OSCFLAGS -std=gnu99 -D_XOPEN_SOURCE=600 -D__EXTENSIONS__"
-	;;
-esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -fsplit-stack is supported" >&5
-$as_echo_n "checking whether -fsplit-stack is supported... " >&6; }
-if test "${libgo_cv_c_split_stack_supported+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -fsplit-stack"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int i;
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  libgo_cv_c_split_stack_supported=yes
-else
-  libgo_cv_c_split_stack_supported=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS=$CFLAGS_hold
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_c_split_stack_supported" >&5
-$as_echo "$libgo_cv_c_split_stack_supported" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether linker supports split/non-split linked together" >&5
-$as_echo_n "checking whether linker supports split/non-split linked together... " >&6; }
-if test "${libgo_cv_c_linker_split_non_split+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat > conftest1.c << EOF
-extern void f();
-int main() { f(); return 0; }
-EOF
-cat > conftest2.c << EOF
-void f() {}
-EOF
-$CC -c -fsplit-stack $CFLAGS $CPPFLAGS conftest1.c
-$CC -c $CFLAGS $CPPFLAGS conftest2.c
-if $CC -o conftest conftest1.$ac_objext conftest2.$ac_objext; then
-  libgo_cv_c_linker_split_non_split=yes
-else
-  libgo_cv_c_linker_split_non_split=no
-fi
-rm -f conftest1.* conftest2.* conftest
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_c_linker_split_non_split" >&5
-$as_echo "$libgo_cv_c_linker_split_non_split" >&6; }
-
-if test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = yes; then
-  SPLIT_STACK=-fsplit-stack
-
-$as_echo "#define USING_SPLIT_STACK 1" >>confdefs.h
-
-else
-  SPLIT_STACK=
-fi
-
- if test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = yes; then
-  USING_SPLIT_STACK_TRUE=
-  USING_SPLIT_STACK_FALSE='#'
-else
-  USING_SPLIT_STACK_TRUE='#'
-  USING_SPLIT_STACK_FALSE=
-fi
-
-
-if test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = no; then
-  GO_SPLIT_STACK=-fno-split-stack
-else
-  GO_SPLIT_STACK=
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether linker supports split stack" >&5
-$as_echo_n "checking whether linker supports split stack... " >&6; }
-if test "${libgo_cv_c_linker_supports_split_stack+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  libgo_cv_c_linker_supports_split_stack=no
-if $GOC -Wl,--help 2>/dev/null | grep split-stack-adjust-size >/dev/null 2>&1; then
-  libgo_cv_c_linker_supports_split_stack=yes
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_c_linker_supports_split_stack" >&5
-$as_echo "$libgo_cv_c_linker_supports_split_stack" >&6; }
-if test "$libgo_cv_c_linker_supports_split_stack" = yes; then
-
-$as_echo "#define LINKER_SUPPORTS_SPLIT_STACK 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler is llgo" >&5
-$as_echo_n "checking whether compiler is llgo... " >&6; }
-if test "${libgo_cv_c_goc_is_llgo+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  libgo_cv_c_goc_is_llgo=no
-if $GOC -dumpversion 2>/dev/null | grep llgo >/dev/null 2>&1; then
-  libgo_cv_c_goc_is_llgo=yes
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_c_goc_is_llgo" >&5
-$as_echo "$libgo_cv_c_goc_is_llgo" >&6; }
- if test "$libgo_cv_c_goc_is_llgo" = yes; then
-  GOC_IS_LLGO_TRUE=
-  GOC_IS_LLGO_FALSE='#'
-else
-  GOC_IS_LLGO_TRUE='#'
-  GOC_IS_LLGO_FALSE=
-fi
-
-
-MATH_LIBS=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrt in -lm" >&5
-$as_echo_n "checking for sqrt in -lm... " >&6; }
-if test "${ac_cv_lib_m_sqrt+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lm  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char sqrt ();
-int
-main ()
-{
-return sqrt ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_m_sqrt=yes
-else
-  ac_cv_lib_m_sqrt=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sqrt" >&5
-$as_echo "$ac_cv_lib_m_sqrt" >&6; }
-if test "x$ac_cv_lib_m_sqrt" = x""yes; then :
-  MATH_LIBS=-lm
-fi
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket libraries" >&5
-$as_echo_n "checking for socket libraries... " >&6; }
-if test "${libgo_cv_lib_sockets+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  libgo_cv_lib_sockets=
-   libgo_check_both=no
-   ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect"
-if test "x$ac_cv_func_connect" = x""yes; then :
-  libgo_check_socket=no
-else
-  libgo_check_socket=yes
-fi
-
-   if test "$libgo_check_socket" = "yes"; then
-     unset ac_cv_func_connect
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lsocket" >&5
-$as_echo_n "checking for main in -lsocket... " >&6; }
-if test "${ac_cv_lib_socket_main+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsocket  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-int
-main ()
-{
-return main ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_socket_main=yes
-else
-  ac_cv_lib_socket_main=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_main" >&5
-$as_echo "$ac_cv_lib_socket_main" >&6; }
-if test "x$ac_cv_lib_socket_main" = x""yes; then :
-  libgo_cv_lib_sockets="-lsocket"
-else
-  libgo_check_both=yes
-fi
-
-   fi
-   if test "$libgo_check_both" = "yes"; then
-     libgo_old_libs=$LIBS
-     LIBS="$LIBS -lsocket -lnsl"
-     unset ac_cv_func_accept
-     ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept"
-if test "x$ac_cv_func_accept" = x""yes; then :
-  libgo_check_nsl=no
-		    libgo_cv_lib_sockets="-lsocket -lnsl"
-fi
-
-     unset ac_cv_func_accept
-     LIBS=$libgo_old_libs
-   fi
-   unset ac_cv_func_gethostbyname
-   libgo_old_libs="$LIBS"
-   ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
-if test "x$ac_cv_func_gethostbyname" = x""yes; then :
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lnsl" >&5
-$as_echo_n "checking for main in -lnsl... " >&6; }
-if test "${ac_cv_lib_nsl_main+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lnsl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-int
-main ()
-{
-return main ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_nsl_main=yes
-else
-  ac_cv_lib_nsl_main=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_main" >&5
-$as_echo "$ac_cv_lib_nsl_main" >&6; }
-if test "x$ac_cv_lib_nsl_main" = x""yes; then :
-  libgo_cv_lib_sockets="$libgo_cv_lib_sockets -lnsl"
-fi
-
-fi
-
-   unset ac_cv_func_gethostbyname
-   ac_fn_c_check_func "$LINENO" "sendfile" "ac_cv_func_sendfile"
-if test "x$ac_cv_func_sendfile" = x""yes; then :
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lsendfile" >&5
-$as_echo_n "checking for main in -lsendfile... " >&6; }
-if test "${ac_cv_lib_sendfile_main+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsendfile  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-
-int
-main ()
-{
-return main ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_sendfile_main=yes
-else
-  ac_cv_lib_sendfile_main=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sendfile_main" >&5
-$as_echo "$ac_cv_lib_sendfile_main" >&6; }
-if test "x$ac_cv_lib_sendfile_main" = x""yes; then :
-  libgo_cv_lib_sockets="$libgo_cv_lib_sockets -lsendfile"
-fi
-
-fi
-
-   LIBS=$libgo_old_libs
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_lib_sockets" >&5
-$as_echo "$libgo_cv_lib_sockets" >&6; }
-NET_LIBS="$libgo_cv_lib_sockets"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -pthread is supported" >&5
-$as_echo_n "checking whether -pthread is supported... " >&6; }
-if test "${libgo_cv_lib_pthread+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -pthread"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int i;
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  libgo_cv_lib_pthread=yes
-else
-  libgo_cv_lib_pthread=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS=$CFLAGS_hold
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_lib_pthread" >&5
-$as_echo "$libgo_cv_lib_pthread" >&6; }
-PTHREAD_CFLAGS=
-if test "$libgo_cv_lib_pthread" = yes; then
-  PTHREAD_CFLAGS=-pthread
-fi
-
-
-PTHREAD_LIBS=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
-$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
-if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpthread  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pthread_create ();
-int
-main ()
-{
-return pthread_create ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_pthread_pthread_create=yes
-else
-  ac_cv_lib_pthread_pthread_create=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
-$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
-if test "x$ac_cv_lib_pthread_pthread_create" = x""yes; then :
-  PTHREAD_LIBS=-lpthread
-fi
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sched_yield" >&5
-$as_echo_n "checking for library containing sched_yield... " >&6; }
-if test "${ac_cv_search_sched_yield+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char sched_yield ();
-int
-main ()
-{
-return sched_yield ();
-  ;
-  return 0;
-}
-_ACEOF
-for ac_lib in '' rt; do
-  if test -z "$ac_lib"; then
-    ac_res="none required"
-  else
-    ac_res=-l$ac_lib
-    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-  fi
-  if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_search_sched_yield=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext
-  if test "${ac_cv_search_sched_yield+set}" = set; then :
-  break
-fi
-done
-if test "${ac_cv_search_sched_yield+set}" = set; then :
-
-else
-  ac_cv_search_sched_yield=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sched_yield" >&5
-$as_echo "$ac_cv_search_sched_yield" >&6; }
-ac_res=$ac_cv_search_sched_yield
-if test "$ac_res" != no; then :
-  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing nanosleep" >&5
-$as_echo_n "checking for library containing nanosleep... " >&6; }
-if test "${ac_cv_search_nanosleep+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char nanosleep ();
-int
-main ()
-{
-return nanosleep ();
-  ;
-  return 0;
-}
-_ACEOF
-for ac_lib in '' rt; do
-  if test -z "$ac_lib"; then
-    ac_res="none required"
-  else
-    ac_res=-l$ac_lib
-    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-  fi
-  if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_search_nanosleep=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext
-  if test "${ac_cv_search_nanosleep+set}" = set; then :
-  break
-fi
-done
-if test "${ac_cv_search_nanosleep+set}" = set; then :
-
-else
-  ac_cv_search_nanosleep=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_nanosleep" >&5
-$as_echo "$ac_cv_search_nanosleep" >&6; }
-ac_res=$ac_cv_search_nanosleep
-if test "$ac_res" != no; then :
-  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
-$as_echo_n "checking for library containing clock_gettime... " >&6; }
-if test "${ac_cv_search_clock_gettime+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char clock_gettime ();
-int
-main ()
-{
-return clock_gettime ();
-  ;
-  return 0;
-}
-_ACEOF
-for ac_lib in '' rt; do
-  if test -z "$ac_lib"; then
-    ac_res="none required"
-  else
-    ac_res=-l$ac_lib
-    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-  fi
-  if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_search_clock_gettime=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext
-  if test "${ac_cv_search_clock_gettime+set}" = set; then :
-  break
-fi
-done
-if test "${ac_cv_search_clock_gettime+set}" = set; then :
-
-else
-  ac_cv_search_clock_gettime=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
-$as_echo "$ac_cv_search_clock_gettime" >&6; }
-ac_res=$ac_cv_search_clock_gettime
-if test "$ac_res" != no; then :
-  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-
-fi
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
-$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
-if test "${ac_cv_c_bigendian+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_c_bigendian=unknown
-    # See if we're dealing with a universal compiler.
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __APPLE_CC__
-	       not a universal capable compiler
-	     #endif
-	     typedef int dummy;
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-	# Check for potential -arch flags.  It is not universal unless
-	# there are at least two -arch flags with different values.
-	ac_arch=
-	ac_prev=
-	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
-	 if test -n "$ac_prev"; then
-	   case $ac_word in
-	     i?86 | x86_64 | ppc | ppc64)
-	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
-		 ac_arch=$ac_word
-	       else
-		 ac_cv_c_bigendian=universal
-		 break
-	       fi
-	       ;;
-	   esac
-	   ac_prev=
-	 elif test "x$ac_word" = "x-arch"; then
-	   ac_prev=arch
-	 fi
-       done
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if sys/param.h defines the BYTE_ORDER macro.
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-	     #include <sys/param.h>
-
-int
-main ()
-{
-#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
-		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
-		     && LITTLE_ENDIAN)
-	      bogus endian macros
-	     #endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-		#include <sys/param.h>
-
-int
-main ()
-{
-#if BYTE_ORDER != BIG_ENDIAN
-		 not big endian
-		#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
-else
-  ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-
-int
-main ()
-{
-#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
-	      bogus endian macros
-	     #endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to _BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <limits.h>
-
-int
-main ()
-{
-#ifndef _BIG_ENDIAN
-		 not big endian
-		#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
-else
-  ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # Compile a test program.
-      if test "$cross_compiling" = yes; then :
-  # Try to guess by grepping values from an object file.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-short int ascii_mm[] =
-		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
-		short int ascii_ii[] =
-		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
-		int use_ascii (int i) {
-		  return ascii_mm[i] + ascii_ii[i];
-		}
-		short int ebcdic_ii[] =
-		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
-		short int ebcdic_mm[] =
-		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
-		int use_ebcdic (int i) {
-		  return ebcdic_mm[i] + ebcdic_ii[i];
-		}
-		extern int foo;
-
-int
-main ()
-{
-return use_ascii (foo) == use_ebcdic (foo);
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
-	      ac_cv_c_bigendian=yes
-	    fi
-	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
-	      if test "$ac_cv_c_bigendian" = unknown; then
-		ac_cv_c_bigendian=no
-	      else
-		# finding both strings is unlikely to happen, but who knows?
-		ac_cv_c_bigendian=unknown
-	      fi
-	    fi
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-
-	     /* Are we little or big endian?  From Harbison&Steele.  */
-	     union
-	     {
-	       long int l;
-	       char c[sizeof (long int)];
-	     } u;
-	     u.l = 1;
-	     return u.c[sizeof (long int) - 1] == 1;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_c_bigendian=no
-else
-  ac_cv_c_bigendian=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-    fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
-$as_echo "$ac_cv_c_bigendian" >&6; }
- case $ac_cv_c_bigendian in #(
-   yes)
-     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
-;; #(
-   no)
-      ;; #(
-   universal)
-
-$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
-
-     ;; #(
-   *)
-     as_fn_error "unknown endianness
- presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
- esac
-
-
-
-
-# Check whether --with-system-libunwind was given.
-if test "${with_system_libunwind+set}" = set; then :
-  withval=$with_system_libunwind;
-fi
-
-  # If system-libunwind was not specifically set, pick a default setting.
-  if test x$with_system_libunwind = x; then
-    case ${target} in
-      ia64-*-hpux*) with_system_libunwind=yes ;;
-      *) with_system_libunwind=no ;;
-    esac
-  fi
-  # Based on system-libunwind and target, do we have ipinfo?
-  if  test x$with_system_libunwind = xyes; then
-    case ${target} in
-      ia64-*-*) have_unwind_getipinfo=no ;;
-      *) have_unwind_getipinfo=yes ;;
-    esac
-  else
-    # Darwin before version 9 does not have _Unwind_GetIPInfo.
-
-    case ${target} in
-      *-*-darwin[3-8]|*-*-darwin[3-8].*) have_unwind_getipinfo=no ;;
-      *) have_unwind_getipinfo=yes ;;
-    esac
-
-  fi
-
-  if test x$have_unwind_getipinfo = xyes; then
-
-$as_echo "#define HAVE_GETIPINFO 1" >>confdefs.h
-
-  fi
-
-
-for ac_header in sched.h sys/file.h sys/mman.h syscall.h sys/epoll.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-eval as_val=\$$as_ac_Header
-   if test "x$as_val" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in linux/filter.h linux/if_addr.h linux/if_ether.h linux/if_tun.h linux/netlink.h linux/rtnetlink.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#ifdef HAVE_SYS_SOCKET_H
-#include <sys/socket.h>
-#endif
-
-"
-eval as_val=\$$as_ac_Header
-   if test "x$as_val" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <ustat.h> can be used" >&5
-$as_echo_n "checking whether <ustat.h> can be used... " >&6; }
-if test "${libgo_cv_c_ustat_h+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE $OSCFLAGS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <sys/types.h>
-#ifdef HAVE_LINUX_FILTER_H
-#include <linux/filter.h>
-#endif
-#include <ustat.h>
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  libgo_cv_c_ustat_h=yes
-else
-  libgo_cv_c_ustat_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS=$CFLAGS_hold
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_c_ustat_h" >&5
-$as_echo "$libgo_cv_c_ustat_h" >&6; }
-if test $libgo_cv_c_ustat_h = yes; then
-
-$as_echo "#define HAVE_USTAT_H 1" >>confdefs.h
-
-fi
-
- if test "$ac_cv_header_sys_mman_h" = yes; then
-  HAVE_SYS_MMAN_H_TRUE=
-  HAVE_SYS_MMAN_H_FALSE='#'
-else
-  HAVE_SYS_MMAN_H_TRUE='#'
-  HAVE_SYS_MMAN_H_FALSE=
-fi
-
-
-for ac_func in strerror_r strsignal wait4 mincore setenv unsetenv dl_iterate_phdr
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-eval as_val=\$$as_ac_var
-   if test "x$as_val" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
- if test "$ac_cv_func_strerror_r" = yes; then
-  HAVE_STRERROR_R_TRUE=
-  HAVE_STRERROR_R_FALSE='#'
-else
-  HAVE_STRERROR_R_TRUE='#'
-  HAVE_STRERROR_R_FALSE=
-fi
-
- if test "$ac_cv_func_wait4" = yes; then
-  HAVE_WAIT4_TRUE=
-  HAVE_WAIT4_FALSE='#'
-else
-  HAVE_WAIT4_TRUE='#'
-  HAVE_WAIT4_FALSE=
-fi
-
-
-for ac_func in accept4 dup3 epoll_create1 faccessat fallocate fchmodat fchownat futimesat getxattr inotify_add_watch inotify_init inotify_init1 inotify_rm_watch listxattr mkdirat mknodat open64 openat pipe2 removexattr renameat setxattr sync_file_range splice tee unlinkat unshare utimensat
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-eval as_val=\$$as_ac_var
-   if test "x$as_val" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
-if test "x$ac_cv_type_off_t" = x""yes; then :
-
-else
-
-cat >>confdefs.h <<_ACEOF
-#define off_t long int
-_ACEOF
-
-fi
-
-ac_fn_c_check_type "$LINENO" "loff_t" "ac_cv_type_loff_t" "$ac_includes_default"
-if test "x$ac_cv_type_loff_t" = x""yes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_LOFF_T 1
-_ACEOF
-
-
-fi
-
-
-LIBS_hold="$LIBS"
-LIBS="$LIBS -lm"
-for ac_func in cosl expl logl sinl tanl acosl asinl atanl atan2l expm1l ldexpl log10l log1pl
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-eval as_val=\$$as_ac_var
-   if test "x$as_val" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-LIBS="$LIBS_hold"
-
-CFLAGS_hold="$CFLAGS"
-CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-LIBS_hold="$LIBS"
-LIBS="$LIBS $PTHREAD_LIBS"
-for ac_func in sem_timedwait
-do :
-  ac_fn_c_check_func "$LINENO" "sem_timedwait" "ac_cv_func_sem_timedwait"
-if test "x$ac_cv_func_sem_timedwait" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_SEM_TIMEDWAIT 1
-_ACEOF
-
-fi
-done
-
-CFLAGS="$CFLAGS_hold"
-LIBS="$LIBS_hold"
-
-LIBS_hold="$LIBS"
-LIBS="$LIBS $MATH_LIBS"
-for ac_func in matherr
-do :
-  ac_fn_c_check_func "$LINENO" "matherr" "ac_cv_func_matherr"
-if test "x$ac_cv_func_matherr" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_MATHERR 1
-_ACEOF
-
-fi
-done
-
-LIBS="$LIBS_hold"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __sync_bool_compare_and_swap_4" >&5
-$as_echo_n "checking for __sync_bool_compare_and_swap_4... " >&6; }
-if test "${libgo_cv_func___sync_bool_compare_and_swap_4+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-typedef unsigned int uint32  __attribute__ ((mode (SI)));
-uint32 i;
-int main() { return __sync_bool_compare_and_swap (&i, 0, 1); }
-
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  libgo_cv_func___sync_bool_compare_and_swap_4=yes
-else
-  libgo_cv_func___sync_bool_compare_and_swap_4=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_func___sync_bool_compare_and_swap_4" >&5
-$as_echo "$libgo_cv_func___sync_bool_compare_and_swap_4" >&6; }
-if test "$libgo_cv_func___sync_bool_compare_and_swap_4" = "yes"; then
-
-$as_echo "#define HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __sync_bool_compare_and_swap_8" >&5
-$as_echo_n "checking for __sync_bool_compare_and_swap_8... " >&6; }
-if test "${libgo_cv_func___sync_bool_compare_and_swap_8+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-typedef unsigned int uint64  __attribute__ ((mode (DI)));
-uint64 i;
-int main() { return __sync_bool_compare_and_swap (&i, 0, 1); }
-
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  libgo_cv_func___sync_bool_compare_and_swap_8=yes
-else
-  libgo_cv_func___sync_bool_compare_and_swap_8=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_func___sync_bool_compare_and_swap_8" >&5
-$as_echo "$libgo_cv_func___sync_bool_compare_and_swap_8" >&6; }
-if test "$libgo_cv_func___sync_bool_compare_and_swap_8" = "yes"; then
-
-$as_echo "#define HAVE_SYNC_BOOL_COMPARE_AND_SWAP_8 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __sync_fetch_and_add_4" >&5
-$as_echo_n "checking for __sync_fetch_and_add_4... " >&6; }
-if test "${libgo_cv_func___sync_fetch_and_add_4+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-typedef unsigned int uint32  __attribute__ ((mode (SI)));
-uint32 i;
-int main() { return __sync_fetch_and_add (&i, 1); }
-
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  libgo_cv_func___sync_fetch_and_add_4=yes
-else
-  libgo_cv_func___sync_fetch_and_add_4=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_func___sync_fetch_and_add_4" >&5
-$as_echo "$libgo_cv_func___sync_fetch_and_add_4" >&6; }
-if test "$libgo_cv_func___sync_fetch_and_add_4" = "yes"; then
-
-$as_echo "#define HAVE_SYNC_FETCH_AND_ADD_4 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __sync_add_and_fetch_8" >&5
-$as_echo_n "checking for __sync_add_and_fetch_8... " >&6; }
-if test "${libgo_cv_func___sync_add_and_fetch_8+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-typedef unsigned int uint64  __attribute__ ((mode (DI)));
-uint64 i;
-int main() { return __sync_add_and_fetch (&i, 1); }
-
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  libgo_cv_func___sync_add_and_fetch_8=yes
-else
-  libgo_cv_func___sync_add_and_fetch_8=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_func___sync_add_and_fetch_8" >&5
-$as_echo "$libgo_cv_func___sync_add_and_fetch_8" >&6; }
-if test "$libgo_cv_func___sync_add_and_fetch_8" = "yes"; then
-
-$as_echo "#define HAVE_SYNC_ADD_AND_FETCH_8 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -minline-all-stringops" >&5
-$as_echo_n "checking whether compiler supports -minline-all-stringops... " >&6; }
-if test "${libgo_cv_c_stringops+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -minline-all-stringops"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int i;
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  libgo_cv_c_stringops=yes
-else
-  libgo_cv_c_stringops=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS=$CFLAGS_hold
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_c_stringops" >&5
-$as_echo "$libgo_cv_c_stringops" >&6; }
-STRINGOPS_FLAG=
-if test "$libgo_cv_c_stringops" = yes; then
-  STRINGOPS_FLAG=-minline-all-stringops
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -mfancy-math-387" >&5
-$as_echo_n "checking whether compiler supports -mfancy-math-387... " >&6; }
-if test "${libgo_cv_c_fancymath+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -mfancy-math-387"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int i;
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  libgo_cv_c_fancymath=yes
-else
-  libgo_cv_c_fancymath=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS=$CFLAGS_hold
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_c_fancymath" >&5
-$as_echo "$libgo_cv_c_fancymath" >&6; }
-MATH_FLAG=
-if test "$libgo_cv_c_fancymath" = yes; then
-  MATH_FLAG="-mfancy-math-387 -funsafe-math-optimizations"
-else
-  MATH_FLAG="-ffp-contract=off"
-fi
-
-
-CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE"
-ac_fn_c_check_type "$LINENO" "off64_t" "ac_cv_type_off64_t" "$ac_includes_default"
-if test "x$ac_cv_type_off64_t" = x""yes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_OFF64_T 1
-_ACEOF
-
-
-fi
-
-CFLAGS=$CFLAGS_hold
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking epoll_event size" >&5
-$as_echo_n "checking epoll_event size... " >&6; }
-if test "${libgo_cv_c_epoll_event_size+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "sizeof (struct epoll_event)" "libgo_cv_c_epoll_event_size"        "#include <sys/epoll.h>"; then :
-
-else
-  libgo_cv_c_epoll_event_size=0
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_c_epoll_event_size" >&5
-$as_echo "$libgo_cv_c_epoll_event_size" >&6; }
-SIZEOF_STRUCT_EPOLL_EVENT=${libgo_cv_c_epoll_event_size}
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking epoll_event data.fd offset" >&5
-$as_echo_n "checking epoll_event data.fd offset... " >&6; }
-if test "${libgo_cv_c_epoll_event_fd_offset+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "offsetof (struct epoll_event, data.fd)" "libgo_cv_c_epoll_event_fd_offset"        "#include <stddef.h>
-#include <sys/epoll.h>"; then :
-
-else
-  libgo_cv_c_epoll_event_fd_offset=0
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_c_epoll_event_fd_offset" >&5
-$as_echo "$libgo_cv_c_epoll_event_fd_offset" >&6; }
-STRUCT_EPOLL_EVENT_FD_OFFSET=${libgo_cv_c_epoll_event_fd_offset}
-
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/stat.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "timespec_t.*st_atim" >/dev/null 2>&1; then :
-  have_stat_timespec=yes
-else
-  have_stat_timespec=no
-fi
-rm -f conftest*
-
- if test $have_stat_timespec = yes; then
-  HAVE_STAT_TIMESPEC_TRUE=
-  HAVE_STAT_TIMESPEC_FALSE='#'
-else
-  HAVE_STAT_TIMESPEC_TRUE='#'
-  HAVE_STAT_TIMESPEC_FALSE=
-fi
-
-
-ac_fn_c_check_type "$LINENO" "struct exception" "ac_cv_type_struct_exception" "#include <math.h>
-"
-if test "x$ac_cv_type_struct_exception" = x""yes; then :
-  libgo_has_struct_exception=yes
-else
-  libgo_has_struct_exception=no
-fi
-
-if test "$libgo_has_struct_exception" = "yes"; then
-
-$as_echo "#define HAVE_STRUCT_EXCEPTION 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setcontext clobbers TLS variables" >&5
-$as_echo_n "checking whether setcontext clobbers TLS variables... " >&6; }
-if test "${libgo_cv_lib_setcontext_clobbers_tls+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  CFLAGS_hold="$CFLAGS"
-CFLAGS="$PTHREAD_CFLAGS"
-LIBS_hold="$LIBS"
-LIBS="$LIBS $PTHREAD_LIBS"
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
-$as_echo_n "checking size of void *... " >&6; }
-if test "${ac_cv_sizeof_void_p+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_void_p" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (void *)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_void_p=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
-$as_echo "$ac_cv_sizeof_void_p" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
-_ACEOF
-
-
-as_fn_arith $ac_cv_sizeof_void_p \* 8 && ptr_type_size=$as_val
-if test "$cross_compiling" = yes; then :
-  case "$target:$ptr_type_size" in
-  i?86-*-solaris2.1[01]:64 | x86_64*-*-solaris2.1[01]:64)
-    libgo_cv_lib_setcontext_clobbers_tls=yes ;;
-  *)
-    libgo_cv_lib_setcontext_clobbers_tls=no ;;
- esac
-
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <pthread.h>
-#include <stdlib.h>
-#include <ucontext.h>
-#include <unistd.h>
-
-__thread int tls;
-
-static char stack[10 * 1024 * 1024];
-static ucontext_t c;
-
-/* Called via makecontext/setcontext.  */
-
-static void
-cfn (void)
-{
-  exit (tls);
-}
-
-/* Called via pthread_create.  */
-
-static void *
-tfn (void *dummy)
-{
-  /* The thread should still see this value after calling
-     setcontext.  */
-  tls = 0;
-
-  setcontext (&c);
-
-  /* The call to setcontext should not return.  */
-  abort ();
-}
-
-int
-main ()
-{
-  pthread_t tid;
-
-  /* The thread should not see this value.  */
-  tls = 1;
-
-  if (getcontext (&c) < 0)
-    abort ();
-
-  c.uc_stack.ss_sp = stack;
-#ifdef MAKECONTEXT_STACK_TOP
-  c.uc_stack.ss_sp += sizeof stack;
-#endif
-  c.uc_stack.ss_flags = 0;
-  c.uc_stack.ss_size = sizeof stack;
-  c.uc_link = NULL;
-  makecontext (&c, cfn, 0);
-
-  if (pthread_create (&tid, NULL, tfn, NULL) != 0)
-    abort ();
-
-  if (pthread_join (tid, NULL) != 0)
-    abort ();
-
-  /* The thread should have called exit.  */
-  abort ();
-}
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  libgo_cv_lib_setcontext_clobbers_tls=no
-else
-  libgo_cv_lib_setcontext_clobbers_tls=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-CFLAGS="$CFLAGS_hold"
-LIBS="$LIBS_hold"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_lib_setcontext_clobbers_tls" >&5
-$as_echo "$libgo_cv_lib_setcontext_clobbers_tls" >&6; }
-if test "$libgo_cv_lib_setcontext_clobbers_tls" = "yes"; then
-
-$as_echo "#define SETCONTEXT_CLOBBERS_TLS 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether .eh_frame section should be read-only" >&5
-$as_echo_n "checking whether .eh_frame section should be read-only... " >&6; }
-if test "${libgo_cv_ro_eh_frame+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-libgo_cv_ro_eh_frame=no
-echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
-if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then
-  if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then
-    libgo_cv_ro_eh_frame=yes
-  elif grep '.section.*eh_frame.*#alloc' conftest.c \
-       | grep -v '#write' > /dev/null; then
-    libgo_cv_ro_eh_frame=yes
-  fi
-fi
-rm -f conftest.*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_ro_eh_frame" >&5
-$as_echo "$libgo_cv_ro_eh_frame" >&6; }
-if test "x$libgo_cv_ro_eh_frame" = xyes; then
-
-$as_echo "#define EH_FRAME_FLAGS \"a\"" >>confdefs.h
-
-else
-
-$as_echo "#define EH_FRAME_FLAGS \"aw\"" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports -Qunused-arguments" >&5
-$as_echo_n "checking if compiler supports -Qunused-arguments... " >&6; }
-if test "${libgo_cv_c_unused_arguments+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -Qunused-arguments"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int i;
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  libgo_cv_c_unused_arguments=yes
-else
-  libgo_cv_c_unused_arguments=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS=$CFLAGS_hold
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_c_unused_arguments" >&5
-$as_echo "$libgo_cv_c_unused_arguments" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if assembler supports GNU comdat group syntax" >&5
-$as_echo_n "checking if assembler supports GNU comdat group syntax... " >&6; }
-if test "${libgo_cv_as_comdat_gnu+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-echo '.section .text,"axG",@progbits,.foo,comdat' > conftest.s
-CFLAGS_hold=$CFLAGS
-if test "$libgo_cv_c_unused_arguments" = yes; then
-  CFLAGS="$CFLAGS -Qunused-arguments"
-fi
-if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then
-  libgo_cv_as_comdat_gnu=yes
-else
-  libgo_cv_as_comdat_gnu=no
-fi
-CFLAGS=$CFLAGS_hold
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_as_comdat_gnu" >&5
-$as_echo "$libgo_cv_as_comdat_gnu" >&6; }
-if test "x$libgo_cv_as_comdat_gnu" = xyes; then
-
-$as_echo "#define HAVE_AS_COMDAT_GAS 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports pc related relocs" >&5
-$as_echo_n "checking assembler supports pc related relocs... " >&6; }
-if test "${libgo_cv_as_x86_pcrel+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-libgo_cv_as_x86_pcrel=yes
-echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
-CFLAGS_hold=$CFLAGS
-if test "$libgo_cv_c_unused_arguments" = yes; then
-  CFLAGS="$CFLAGS -Qunused-arguments"
-fi
-if $CC $CFLAGS -c conftest.s 2>&1 | $EGREP -i 'illegal|warning' > /dev/null; then
-    libgo_cv_as_x86_pcrel=no
-fi
-CFLAGS=$CFLAGS_hold
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_as_x86_pcrel" >&5
-$as_echo "$libgo_cv_as_x86_pcrel" >&6; }
-if test "x$libgo_cv_as_x86_pcrel" = xyes; then
-
-$as_echo "#define HAVE_AS_X86_PCREL 1" >>confdefs.h
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports unwind section type" >&5
-$as_echo_n "checking assembler supports unwind section type... " >&6; }
-if test "${libgo_cv_as_x86_64_unwind_section_type+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-libgo_cv_as_x86_64_unwind_section_type=yes
-echo '.section .eh_frame,"a",@unwind' > conftest.s
-CFLAGS_hold=$CFLAGS
-if test "$libgo_cv_c_unused_arguments" = yes; then
-  CFLAGS="$CFLAGS -Qunused-arguments"
-fi
-if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
-    libgo_cv_as_x86_64_unwind_section_type=no
-fi
-CFLAGS=$CFLAGS_hold
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_as_x86_64_unwind_section_type" >&5
-$as_echo "$libgo_cv_as_x86_64_unwind_section_type" >&6; }
-if test "x$libgo_cv_as_x86_64_unwind_section_type" = xyes; then
-
-$as_echo "#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1" >>confdefs.h
-
-fi
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-
-  (set) 2>&1 |
-    case $as_nl`(ac_space=' '; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes: double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \.
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;; #(
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-) |
-  sed '
-     /^ac_cv_env_/b end
-     t clear
-     :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
-  if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-  fi
-fi
-rm -f confcache
-
-if test ${multilib} = yes; then
-  multilib_arg="--enable-multilib"
-else
-  multilib_arg=
-fi
-
-ac_config_files="$ac_config_files Makefile testsuite/Makefile"
-
-
-ac_config_commands="$ac_config_commands default"
-
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-
-  (set) 2>&1 |
-    case $as_nl`(ac_space=' '; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes: double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \.
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;; #(
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-) |
-  sed '
-     /^ac_cv_env_/b end
-     t clear
-     :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
-  if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
-  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
-  #    will be set to the directory where LIBOBJS objects are built.
-  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
-  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
- if test -n "$EXEEXT"; then
-  am__EXEEXT_TRUE=
-  am__EXEEXT_FALSE='#'
-else
-  am__EXEEXT_TRUE='#'
-  am__EXEEXT_FALSE=
-fi
-
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  as_fn_error "conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  as_fn_error "conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
-  as_fn_error "conditional \"MAINTAINER_MODE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_DARWIN_TRUE}" && test -z "${LIBGO_IS_DARWIN_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_DARWIN\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_FREEBSD_TRUE}" && test -z "${LIBGO_IS_FREEBSD_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_FREEBSD\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_IRIX_TRUE}" && test -z "${LIBGO_IS_IRIX_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_IRIX\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_LINUX_TRUE}" && test -z "${LIBGO_IS_LINUX_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_LINUX\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_NETBSD_TRUE}" && test -z "${LIBGO_IS_NETBSD_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_NETBSD\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_OPENBSD_TRUE}" && test -z "${LIBGO_IS_OPENBSD_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_OPENBSD\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_DRAGONFLY_TRUE}" && test -z "${LIBGO_IS_DRAGONFLY_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_DRAGONFLY\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_RTEMS_TRUE}" && test -z "${LIBGO_IS_RTEMS_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_RTEMS\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_SOLARIS_TRUE}" && test -z "${LIBGO_IS_SOLARIS_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_SOLARIS\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_386_TRUE}" && test -z "${LIBGO_IS_386_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_386\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_ALPHA_TRUE}" && test -z "${LIBGO_IS_ALPHA_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_ALPHA\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_ARM_TRUE}" && test -z "${LIBGO_IS_ARM_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_ARM\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_ARM64_TRUE}" && test -z "${LIBGO_IS_ARM64_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_ARM64\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_M68K_TRUE}" && test -z "${LIBGO_IS_M68K_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_M68K\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_MIPS_TRUE}" && test -z "${LIBGO_IS_MIPS_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_MIPS\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_MIPSO32_TRUE}" && test -z "${LIBGO_IS_MIPSO32_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_MIPSO32\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_MIPSN32_TRUE}" && test -z "${LIBGO_IS_MIPSN32_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_MIPSN32\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_MIPSN64_TRUE}" && test -z "${LIBGO_IS_MIPSN64_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_MIPSN64\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_MIPSO64_TRUE}" && test -z "${LIBGO_IS_MIPSO64_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_MIPSO64\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_PPC_TRUE}" && test -z "${LIBGO_IS_PPC_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_PPC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_PPC64_TRUE}" && test -z "${LIBGO_IS_PPC64_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_PPC64\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_PPC64LE_TRUE}" && test -z "${LIBGO_IS_PPC64LE_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_PPC64LE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_S390_TRUE}" && test -z "${LIBGO_IS_S390_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_S390\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_S390X_TRUE}" && test -z "${LIBGO_IS_S390X_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_S390X\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_SPARC_TRUE}" && test -z "${LIBGO_IS_SPARC_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_SPARC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_SPARC64_TRUE}" && test -z "${LIBGO_IS_SPARC64_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_SPARC64\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${LIBGO_IS_X86_64_TRUE}" && test -z "${LIBGO_IS_X86_64_FALSE}"; then
-  as_fn_error "conditional \"LIBGO_IS_X86_64\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${USING_SPLIT_STACK_TRUE}" && test -z "${USING_SPLIT_STACK_FALSE}"; then
-  as_fn_error "conditional \"USING_SPLIT_STACK\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${GOC_IS_LLGO_TRUE}" && test -z "${GOC_IS_LLGO_FALSE}"; then
-  as_fn_error "conditional \"GOC_IS_LLGO\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-if test -z "${HAVE_SYS_MMAN_H_TRUE}" && test -z "${HAVE_SYS_MMAN_H_FALSE}"; then
-  as_fn_error "conditional \"HAVE_SYS_MMAN_H\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${HAVE_STRERROR_R_TRUE}" && test -z "${HAVE_STRERROR_R_FALSE}"; then
-  as_fn_error "conditional \"HAVE_STRERROR_R\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${HAVE_WAIT4_TRUE}" && test -z "${HAVE_WAIT4_FALSE}"; then
-  as_fn_error "conditional \"HAVE_WAIT4\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${HAVE_STAT_TIMESPEC_TRUE}" && test -z "${HAVE_STAT_TIMESPEC_FALSE}"; then
-  as_fn_error "conditional \"HAVE_STAT_TIMESPEC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-: ${CONFIG_STATUS=./config.status}
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-as_write_fail=0
-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$?; test $as_status -eq 0 && as_status=1
-  if test "$3"; then
-    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
-  fi
-  $as_echo "$as_me: error: $1" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-## ----------------------------------- ##
-## Main body of $CONFIG_STATUS script. ##
-## ----------------------------------- ##
-_ASEOF
-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# Save the log message, to keep $0 and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.
-ac_log="
-This file was extended by package-unused $as_me version-unused, which was
-generated by GNU Autoconf 2.64.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-case $ac_config_headers in *"
-"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
-esac
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_headers="$ac_config_headers"
-config_commands="$ac_config_commands"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
-from templates according to the current configuration.  Unless the files
-and actions are specified as TAGs, all are instantiated by default.
-
-Usage: $0 [OPTION]... [TAG]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number and configuration settings, then exit
-  -q, --quiet, --silent
-                   do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-      --file=FILE[:TEMPLATE]
-                   instantiate the configuration file FILE
-      --header=FILE[:TEMPLATE]
-                   instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration commands:
-$config_commands
-
-Report bugs to the package provider."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_version="\\
-package-unused config.status version-unused
-configured by $0, generated by GNU Autoconf 2.64,
-  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
-
-Copyright (C) 2009 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-MKDIR_P='$MKDIR_P'
-AWK='$AWK'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  *)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    $as_echo "$ac_cs_version"; exit ;;
-  --debug | --debu | --deb | --de | --d | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    as_fn_append CONFIG_FILES " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --he | --h)
-    # Conflict between --help and --header
-    as_fn_error "ambiguous option: \`$1'
-Try \`$0 --help' for more information.";;
-  --help | --hel | -h )
-    $as_echo "$ac_cs_usage"; exit ;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) as_fn_error "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
-
-  *) as_fn_append ac_config_targets " $1"
-     ac_need_defaults=false ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-  shift
-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
-  CONFIG_SHELL='$SHELL'
-  export CONFIG_SHELL
-  exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-  $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-#
-# INIT-COMMANDS
-#
-
-srcdir="$srcdir"
-host="$host"
-target="$target"
-with_multisubdir="$with_multisubdir"
-with_multisrctop="$with_multisrctop"
-with_target_subdir="$with_target_subdir"
-ac_configure_args="${multilib_arg} ${ac_configure_args}"
-multi_basedir="$multi_basedir"
-CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-CC="$CC"
-CXX="$CXX"
-GFORTRAN="$GFORTRAN"
-GCJ="$GCJ"
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
-Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
-GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
-EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
-FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
-SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
-ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
-LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
-macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
-enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
-host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
-host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
-host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
-build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
-build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
-build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
-NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
-LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
-exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
-AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
-STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
-lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
-CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
-compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
-GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
-objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
-need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
-LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
-libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
-fix_srcfile_path='`$ECHO "$fix_srcfile_path" | $SED "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
-need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
-version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
-install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
-striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
-LD_GO='`$ECHO "$LD_GO" | $SED "$delay_single_quote_subst"`'
-reload_flag_GO='`$ECHO "$reload_flag_GO" | $SED "$delay_single_quote_subst"`'
-reload_cmds_GO='`$ECHO "$reload_cmds_GO" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds_GO='`$ECHO "$old_archive_cmds_GO" | $SED "$delay_single_quote_subst"`'
-compiler_GO='`$ECHO "$compiler_GO" | $SED "$delay_single_quote_subst"`'
-GCC_GO='`$ECHO "$GCC_GO" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag_GO='`$ECHO "$lt_prog_compiler_no_builtin_flag_GO" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl_GO='`$ECHO "$lt_prog_compiler_wl_GO" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic_GO='`$ECHO "$lt_prog_compiler_pic_GO" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static_GO='`$ECHO "$lt_prog_compiler_static_GO" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o_GO='`$ECHO "$lt_cv_prog_compiler_c_o_GO" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc_GO='`$ECHO "$archive_cmds_need_lc_GO" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes_GO='`$ECHO "$enable_shared_with_static_runtimes_GO" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec_GO='`$ECHO "$export_dynamic_flag_spec_GO" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec_GO='`$ECHO "$whole_archive_flag_spec_GO" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object_GO='`$ECHO "$compiler_needs_object_GO" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds_GO='`$ECHO "$old_archive_from_new_cmds_GO" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds_GO='`$ECHO "$old_archive_from_expsyms_cmds_GO" | $SED "$delay_single_quote_subst"`'
-archive_cmds_GO='`$ECHO "$archive_cmds_GO" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds_GO='`$ECHO "$archive_expsym_cmds_GO" | $SED "$delay_single_quote_subst"`'
-module_cmds_GO='`$ECHO "$module_cmds_GO" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds_GO='`$ECHO "$module_expsym_cmds_GO" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld_GO='`$ECHO "$with_gnu_ld_GO" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag_GO='`$ECHO "$allow_undefined_flag_GO" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag_GO='`$ECHO "$no_undefined_flag_GO" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_GO='`$ECHO "$hardcode_libdir_flag_spec_GO" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld_GO='`$ECHO "$hardcode_libdir_flag_spec_ld_GO" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator_GO='`$ECHO "$hardcode_libdir_separator_GO" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_GO='`$ECHO "$hardcode_direct_GO" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute_GO='`$ECHO "$hardcode_direct_absolute_GO" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L_GO='`$ECHO "$hardcode_minus_L_GO" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var_GO='`$ECHO "$hardcode_shlibpath_var_GO" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic_GO='`$ECHO "$hardcode_automatic_GO" | $SED "$delay_single_quote_subst"`'
-inherit_rpath_GO='`$ECHO "$inherit_rpath_GO" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs_GO='`$ECHO "$link_all_deplibs_GO" | $SED "$delay_single_quote_subst"`'
-fix_srcfile_path_GO='`$ECHO "$fix_srcfile_path_GO" | $SED "$delay_single_quote_subst"`'
-always_export_symbols_GO='`$ECHO "$always_export_symbols_GO" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds_GO='`$ECHO "$export_symbols_cmds_GO" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms_GO='`$ECHO "$exclude_expsyms_GO" | $SED "$delay_single_quote_subst"`'
-include_expsyms_GO='`$ECHO "$include_expsyms_GO" | $SED "$delay_single_quote_subst"`'
-prelink_cmds_GO='`$ECHO "$prelink_cmds_GO" | $SED "$delay_single_quote_subst"`'
-file_list_spec_GO='`$ECHO "$file_list_spec_GO" | $SED "$delay_single_quote_subst"`'
-hardcode_action_GO='`$ECHO "$hardcode_action_GO" | $SED "$delay_single_quote_subst"`'
-
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in SED \
-GREP \
-EGREP \
-FGREP \
-SHELL \
-ECHO \
-LD \
-NM \
-LN_S \
-lt_SP2NL \
-lt_NL2SP \
-reload_flag \
-OBJDUMP \
-deplibs_check_method \
-file_magic_cmd \
-AR \
-AR_FLAGS \
-STRIP \
-RANLIB \
-CC \
-CFLAGS \
-compiler \
-lt_cv_sys_global_symbol_pipe \
-lt_cv_sys_global_symbol_to_cdecl \
-lt_cv_sys_global_symbol_to_c_name_address \
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_wl \
-lt_prog_compiler_pic \
-lt_prog_compiler_static \
-lt_cv_prog_compiler_c_o \
-need_locks \
-DSYMUTIL \
-NMEDIT \
-LIPO \
-OTOOL \
-OTOOL64 \
-shrext_cmds \
-export_dynamic_flag_spec \
-whole_archive_flag_spec \
-compiler_needs_object \
-with_gnu_ld \
-allow_undefined_flag \
-no_undefined_flag \
-hardcode_libdir_flag_spec \
-hardcode_libdir_flag_spec_ld \
-hardcode_libdir_separator \
-fix_srcfile_path \
-exclude_expsyms \
-include_expsyms \
-file_list_spec \
-variables_saved_for_relink \
-libname_spec \
-library_names_spec \
-soname_spec \
-install_override_mode \
-finish_eval \
-old_striplib \
-striplib \
-LD_GO \
-reload_flag_GO \
-compiler_GO \
-lt_prog_compiler_no_builtin_flag_GO \
-lt_prog_compiler_wl_GO \
-lt_prog_compiler_pic_GO \
-lt_prog_compiler_static_GO \
-lt_cv_prog_compiler_c_o_GO \
-export_dynamic_flag_spec_GO \
-whole_archive_flag_spec_GO \
-compiler_needs_object_GO \
-with_gnu_ld_GO \
-allow_undefined_flag_GO \
-no_undefined_flag_GO \
-hardcode_libdir_flag_spec_GO \
-hardcode_libdir_flag_spec_ld_GO \
-hardcode_libdir_separator_GO \
-fix_srcfile_path_GO \
-exclude_expsyms_GO \
-include_expsyms_GO \
-file_list_spec_GO; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in reload_cmds \
-old_postinstall_cmds \
-old_postuninstall_cmds \
-old_archive_cmds \
-extract_expsyms_cmds \
-old_archive_from_new_cmds \
-old_archive_from_expsyms_cmds \
-archive_cmds \
-archive_expsym_cmds \
-module_cmds \
-module_expsym_cmds \
-export_symbols_cmds \
-prelink_cmds \
-postinstall_cmds \
-postuninstall_cmds \
-finish_cmds \
-sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec \
-reload_cmds_GO \
-old_archive_cmds_GO \
-old_archive_from_new_cmds_GO \
-old_archive_from_expsyms_cmds_GO \
-archive_cmds_GO \
-archive_expsym_cmds_GO \
-module_cmds_GO \
-module_expsym_cmds_GO \
-export_symbols_cmds_GO \
-prelink_cmds_GO; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
-
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'
-
-
-
-
-
-
-# Variables needed in config.status (file generation) which aren't already
-# passed by autoconf.
-SUBDIRS="$SUBDIRS"
-
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
-  case $ac_config_target in
-    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
-    "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
-    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
-    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-    "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;;
-    "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
-
-  *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
-  esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
-  tmp=
-  trap 'exit_status=$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
-' 0
-  trap 'as_fn_exit 1' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./conf$$-$RANDOM
-  (umask 077 && mkdir "$tmp")
-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=`echo X | tr X '\015'`
-# On cygwin, bash can eat \r inside `` if the user requested igncr.
-# But we know of no other shell where ac_cr would be empty at this
-# point, so we can use a bashism as a fallback.
-if test "x$ac_cr" = x; then
-  eval ac_cr=\$\'\\r\'
-fi
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-  ac_cs_awk_cr='\r'
-else
-  ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
-_ACEOF
-
-
-{
-  echo "cat >conf$$subs.awk <<_ACEOF" &&
-  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
-  echo "_ACEOF"
-} >conf$$subs.sh ||
-  as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  . ./conf$$subs.sh ||
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-
-  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
-  if test $ac_delim_n = $ac_delim_num; then
-    break
-  elif $ac_last_try; then
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\).*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\).*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
-  N
-  s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
-  for (key in S) S_is_set[key] = 1
-  FS = ""
-
-}
-{
-  line = $ 0
-  nfields = split(line, field, "@")
-  substed = 0
-  len = length(field[1])
-  for (i = 2; i < nfields; i++) {
-    key = field[i]
-    keylen = length(key)
-    if (S_is_set[key]) {
-      value = S[key]
-      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
-      len += length(value) + length(field[++i])
-      substed = 1
-    } else
-      len += 1 + keylen
-  }
-
-  print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
-  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
-  cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
-  || as_fn_error "could not setup config files machinery" "$LINENO" 5
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/
-s/:*\${srcdir}:*/:/
-s/:*@srcdir@:*/:/
-s/^\([^=]*=[	 ]*\):*/\1/
-s/:*$//
-s/^[^=]*=[	 ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-# Set up the scripts for CONFIG_HEADERS section.
-# No need to generate them if there are no CONFIG_HEADERS.
-# This happens for instance with `./config.status Makefile'.
-if test -n "$CONFIG_HEADERS"; then
-cat >"$tmp/defines.awk" <<\_ACAWK ||
-BEGIN {
-_ACEOF
-
-# Transform confdefs.h into an awk script `defines.awk', embedded as
-# here-document in config.status, that substitutes the proper values into
-# config.h.in to produce config.h.
-
-# Create a delimiter string that does not exist in confdefs.h, to ease
-# handling of long lines.
-ac_delim='%!_!# '
-for ac_last_try in false false :; do
-  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
-  if test -z "$ac_t"; then
-    break
-  elif $ac_last_try; then
-    as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-
-# For the awk script, D is an array of macro values keyed by name,
-# likewise P contains macro parameters if any.  Preserve backslash
-# newline sequences.
-
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-sed -n '
-s/.\{148\}/&'"$ac_delim"'/g
-t rset
-:rset
-s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
-t def
-d
-:def
-s/\\$//
-t bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3"/p
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
-d
-:bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3\\\\\\n"\\/p
-t cont
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
-t cont
-d
-:cont
-n
-s/.\{148\}/&'"$ac_delim"'/g
-t clear
-:clear
-s/\\$//
-t bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/"/p
-d
-:bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
-b cont
-' <confdefs.h | sed '
-s/'"$ac_delim"'/"\\\
-"/g' >>$CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  for (key in D) D_is_set[key] = 1
-  FS = ""
-}
-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
-  line = \$ 0
-  split(line, arg, " ")
-  if (arg[1] == "#") {
-    defundef = arg[2]
-    mac1 = arg[3]
-  } else {
-    defundef = substr(arg[1], 2)
-    mac1 = arg[2]
-  }
-  split(mac1, mac2, "(") #)
-  macro = mac2[1]
-  prefix = substr(line, 1, index(line, defundef) - 1)
-  if (D_is_set[macro]) {
-    # Preserve the white space surrounding the "#".
-    print prefix "define", macro P[macro] D[macro]
-    next
-  } else {
-    # Replace #undef with comments.  This is necessary, for example,
-    # in the case of _POSIX_SOURCE, which is predefined and required
-    # on some systems where configure will not decide to define it.
-    if (defundef == "undef") {
-      print "/*", prefix defundef, macro, "*/"
-      next
-    }
-  }
-}
-{ print }
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-  as_fn_error "could not setup config headers machinery" "$LINENO" 5
-fi # test -n "$CONFIG_HEADERS"
-
-
-eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
-shift
-for ac_tag
-do
-  case $ac_tag in
-  :[FHLC]) ac_mode=$ac_tag; continue;;
-  esac
-  case $ac_mode$ac_tag in
-  :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
-  :[FH]-) ac_tag=-:-;;
-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-  esac
-  ac_save_IFS=$IFS
-  IFS=:
-  set x $ac_tag
-  IFS=$ac_save_IFS
-  shift
-  ac_file=$1
-  shift
-
-  case $ac_mode in
-  :L) ac_source=$1;;
-  :[FH])
-    ac_file_inputs=
-    for ac_f
-    do
-      case $ac_f in
-      -) ac_f="$tmp/stdin";;
-      *) # Look for the file first in the build tree, then in the source tree
-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
-	 # because $ac_f cannot contain `:'.
-	 test -f "$ac_f" ||
-	   case $ac_f in
-	   [\\/$]*) false;;
-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
-	   esac ||
-	   as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
-      esac
-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
-      as_fn_append ac_file_inputs " '$ac_f'"
-    done
-
-    # Let's still pretend it is `configure' which instantiates (i.e., don't
-    # use $as_me), people would be surprised to read:
-    #    /* config.h.  Generated by config.status.  */
-    configure_input='Generated from '`
-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
-	`' by configure.'
-    if test x"$ac_file" != x-; then
-      configure_input="$ac_file.  $configure_input"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
-    fi
-    # Neutralize special characters interpreted by sed in replacement strings.
-    case $configure_input in #(
-    *\&* | *\|* | *\\* )
-       ac_sed_conf_input=`$as_echo "$configure_input" |
-       sed 's/[\\\\&|]/\\\\&/g'`;; #(
-    *) ac_sed_conf_input=$configure_input;;
-    esac
-
-    case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin" \
-      || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
-    esac
-    ;;
-  esac
-
-  ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  as_dir="$ac_dir"; as_fn_mkdir_p
-  ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-  case $ac_mode in
-  :F)
-  #
-  # CONFIG_FILE
-  #
-
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
-  esac
-  ac_MKDIR_P=$MKDIR_P
-  case $MKDIR_P in
-  [\\/$]* | ?:[\\/]* ) ;;
-  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
-  esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-ac_sed_dataroot='
-/datarootdir/ {
-  p
-  q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  ac_datarootdir_hack='
-  s&@datadir@&$datadir&g
-  s&@docdir@&$docdir&g
-  s&@infodir@&$infodir&g
-  s&@localedir@&$localedir&g
-  s&@mandir@&$mandir&g
-  s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-s&@MKDIR_P@&$ac_MKDIR_P&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&2;}
-
-  rm -f "$tmp/stdin"
-  case $ac_file in
-  -) cat "$tmp/out" && rm -f "$tmp/out";;
-  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
-  esac \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
- ;;
-  :H)
-  #
-  # CONFIG_HEADER
-  #
-  if test x"$ac_file" != x-; then
-    {
-      $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
-    } >"$tmp/config.h" \
-      || as_fn_error "could not create $ac_file" "$LINENO" 5
-    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      rm -f "$ac_file"
-      mv "$tmp/config.h" "$ac_file" \
-	|| as_fn_error "could not create $ac_file" "$LINENO" 5
-    fi
-  else
-    $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
-      || as_fn_error "could not create -" "$LINENO" 5
-  fi
-# Compute "$ac_file"'s index in $config_headers.
-_am_arg="$ac_file"
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
-$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$_am_arg" : 'X\(//\)[^/]' \| \
-	 X"$_am_arg" : 'X\(//\)$' \| \
-	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$_am_arg" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`/stamp-h$_am_stamp_count
- ;;
-
-  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
- ;;
-  esac
-
-
-  case $ac_file$ac_mode in
-    "default-1":C)
-# Only add multilib support code if we just rebuilt the top-level
-# Makefile.
-case " $CONFIG_FILES " in
- *" Makefile "*)
-   ac_file=Makefile . ${multi_basedir}/config-ml.in
-   ;;
-esac ;;
-    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      as_dir=$dirpart/$fdir; as_fn_mkdir_p
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
- ;;
-    "libtool":C)
-
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
-# The names of the tagged configurations supported by this script.
-available_tags="GO "
-
-# ### BEGIN LIBTOOL CONFIG
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="\$SED -e 1s/^X//"
-
-# A grep program that handles long lines.
-GREP=$lt_GREP
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# A literal string matcher.
-FGREP=$lt_FGREP
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# An echo program that protects backslashes.
-ECHO=$lt_ECHO
-
-# Which release of libtool.m4 was used?
-macro_version=$macro_version
-macro_revision=$macro_revision
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# What type of objects to build.
-pic_mode=$pic_mode
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# A BSD- or MS-compatible name lister.
-NM=$lt_NM
-
-# Whether we need soft or hard links.
-LN_S=$lt_LN_S
-
-# What is the maximum length of a command?
-max_cmd_len=$max_cmd_len
-
-# Object file suffix (normally "o").
-objext=$ac_objext
-
-# Executable file suffix (normally "").
-exeext=$exeext
-
-# whether the shell understands "unset".
-lt_unset=$lt_unset
-
-# turn spaces into newlines.
-SP2NL=$lt_lt_SP2NL
-
-# turn newlines into spaces.
-NL2SP=$lt_lt_NL2SP
-
-# An object symbol dumper.
-OBJDUMP=$lt_OBJDUMP
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == "file_magic".
-file_magic_cmd=$lt_file_magic_cmd
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# A symbol stripping program.
-STRIP=$lt_STRIP
-
-# Commands used to install an old-style archive.
-RANLIB=$lt_RANLIB
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Whether to use a lock for old archive extraction.
-lock_old_archive_extraction=$lock_old_archive_extraction
-
-# A C compiler.
-LTCC=$lt_CC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_CFLAGS
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration.
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair.
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# Transform the output of nm in a C name address pair when lib prefix is needed.
-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# Used to examine libraries when file_magic_cmd begins with "file".
-MAGIC_CMD=$MAGIC_CMD
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
-DSYMUTIL=$lt_DSYMUTIL
-
-# Tool to change global to local symbols on Mac OS X.
-NMEDIT=$lt_NMEDIT
-
-# Tool to manipulate fat objects and archives on Mac OS X.
-LIPO=$lt_LIPO
-
-# ldd/readelf like tool for Mach-O binaries on Mac OS X.
-OTOOL=$lt_OTOOL
-
-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
-OTOOL64=$lt_OTOOL64
-
-# Old archive suffix (normally "a").
-libext=$libext
-
-# Shared library suffix (normally ".so").
-shrext_cmds=$lt_shrext_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at link time.
-variables_saved_for_relink=$lt_variables_saved_for_relink
-
-# Do we need the "lib" prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Library versioning type.
-version_type=$version_type
-
-# Shared library runtime path variable.
-runpath_var=$runpath_var
-
-# Shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Permission mode override for installation of shared libraries.
-install_override_mode=$lt_install_override_mode
-
-# Command to use after installation of a shared archive.
-postinstall_cmds=$lt_postinstall_cmds
-
-# Command to use after uninstallation of a shared archive.
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# As "finish_cmds", except a single script fragment to be evaled but
-# not shown.
-finish_eval=$lt_finish_eval
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Compile-time system search path for libraries.
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds
-
-# A language specific compiler.
-CC=$lt_compiler
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $* ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-}
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[^=]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "${1}" | $SED "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "${1}" | $SED "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$@"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1+=\$2"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1=\$$1\$2"
-}
-
-_LT_EOF
-    ;;
-  esac
-
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-
-
-    cat <<_LT_EOF >> "$ofile"
-
-# ### BEGIN LIBTOOL TAG CONFIG: GO
-
-# The linker used to build libraries.
-LD=$lt_LD_GO
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag_GO
-reload_cmds=$lt_reload_cmds_GO
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds_GO
-
-# A language specific compiler.
-CC=$lt_compiler_GO
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC_GO
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GO
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_GO
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_GO
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_GO
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GO
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_GO
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GO
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GO
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_GO
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object_GO
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GO
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GO
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds_GO
-archive_expsym_cmds=$lt_archive_expsym_cmds_GO
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds_GO
-module_expsym_cmds=$lt_module_expsym_cmds_GO
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld_GO
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_GO
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_GO
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GO
-
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GO
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_GO
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct_GO
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute_GO
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L_GO
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_GO
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic_GO
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath_GO
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_GO
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path_GO
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols_GO
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_GO
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_GO
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_GO
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds_GO
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec_GO
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_GO
-
-# ### END LIBTOOL TAG CONFIG: GO
-_LT_EOF
-
- ;;
-    "default":C) if test -n "$CONFIG_FILES"; then
-   # Multilibs need MULTISUBDIR defined correctly in certain makefiles so
-   # that multilib installs will end up installed in the correct place.
-   # The testsuite needs it for multilib-aware ABI baseline files.
-   # To work around this not being passed down from config-ml.in ->
-   # srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually
-   # append it here.  Only modify Makefiles that have just been created.
-   #
-   # Also, get rid of this simulated-VPATH thing that automake does.
-   cat > vpsed << \_EOF
-s!`test -f '$<' || echo '$(srcdir)/'`!!
-_EOF
-   for i in $SUBDIRS; do
-    case $CONFIG_FILES in
-     *${i}/Makefile*)
-       #echo "Adding MULTISUBDIR to $i/Makefile"
-       sed -f vpsed $i/Makefile > tmp
-       grep '^MULTISUBDIR =' Makefile >> tmp
-       mv tmp $i/Makefile
-       ;;
-    esac
-   done
-   rm vpsed
- fi
- ;;
-
-  esac
-done # for ac_tag
-
-
-as_fn_exit 0
-_ACEOF
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
-  as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || as_fn_exit $?
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
diff --git a/third_party/gofrontend/libgo/configure.ac b/third_party/gofrontend/libgo/configure.ac
deleted file mode 100644
index 6eddb86..0000000
--- a/third_party/gofrontend/libgo/configure.ac
+++ /dev/null
@@ -1,920 +0,0 @@
-# configure.ac -- Go library configure script.
-
-# Copyright 2009 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# Process this file with autoreconf to produce configure.
-
-AC_PREREQ(2.64)
-AC_INIT(package-unused, version-unused,, libgo)
-AC_CONFIG_SRCDIR(Makefile.am)
-AC_CONFIG_HEADER(config.h)
-
-libtool_VERSION=8:0:0
-AC_SUBST(libtool_VERSION)
-
-AM_ENABLE_MULTILIB(, ..)
-
-AC_CANONICAL_SYSTEM
-target_alias=${target_alias-$host_alias}
-
-AM_INIT_AUTOMAKE([1.9.3 no-define foreign no-dist -Wall -Wno-portability])
-AH_TEMPLATE(PACKAGE, [Name of package])
-AH_TEMPLATE(VERSION, [Version number of package])
-
-m4_rename([_AC_ARG_VAR_PRECIOUS],[glibgo_PRECIOUS])
-m4_define([_AC_ARG_VAR_PRECIOUS],[])
-AC_PROG_CC
-AC_PROG_GO
-m4_rename_force([glibgo_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
-
-AC_SUBST(CFLAGS)
-
-AM_MAINTAINER_MODE
-
-AC_PROG_LD
-AC_PROG_RANLIB
-AC_CHECK_TOOL(OBJCOPY, objcopy, missing-objcopy)
-
-AC_LIBTOOL_DLOPEN
-AM_PROG_LIBTOOL
-AC_SUBST(enable_shared)
-AC_SUBST(enable_static)
-
-CC_FOR_BUILD=${CC_FOR_BUILD:-gcc}
-AC_SUBST(CC_FOR_BUILD)
-
-AC_PROG_AWK
-
-WARN_FLAGS='-Wall -Wextra -Wwrite-strings -Wcast-qual'
-AC_SUBST(WARN_FLAGS)
-
-AC_ARG_ENABLE(werror, [AS_HELP_STRING([--enable-werror],
-                                      [turns on -Werror @<:@default=yes@:>@])])
-if test "x$enable_werror" != "xno"; then
-  WERROR="-Werror"
-fi
-AC_SUBST(WERROR)
-
-glibgo_toolexecdir=no
-glibgo_toolexeclibdir=no
-
-AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
-AC_ARG_ENABLE([version-specific-runtime-libs],
-  AC_HELP_STRING([--enable-version-specific-runtime-libs],
-                 [Specify that runtime libraries should be installed in a compiler-specific directory]),
-  [case "$enableval" in
-    yes) version_specific_libs=yes ;;
-    no)  version_specific_libs=no ;;
-    *)   AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
-   esac],
-  [version_specific_libs=no])
-AC_MSG_RESULT($version_specific_libs)
-
-# Version-specific runtime libs processing.
-if test $version_specific_libs = yes; then
-  glibgo_toolexecdir='${libdir}/gcc/${host_alias}'
-  glibgo_toolexeclibdir='${toolexecdir}/${gcc_version}$(MULTISUBDIR)'
-fi
-
-# Calculate glibgo_toolexecdir, glibgo_toolexeclibdir
-# Install a library built with a cross compiler in tooldir, not libdir.
-if test -n "$with_cross_host" &&
-   test x"$with_cross_host" != x"no"; then
-  nover_glibgo_toolexecdir='${exec_prefix}/${host_alias}'
-  nover_glibgo_toolexeclibdir='${toolexecdir}/lib'
-else
-  nover_glibgo_toolexecdir='${libdir}/gcc/${host_alias}'
-  nover_glibgo_toolexeclibdir='${libdir}'
-fi
-multi_os_directory=`$GOC -print-multi-os-directory`
-case $multi_os_directory in
-  .) ;; # Avoid trailing /.
-  *) nover_glibgo_toolexeclibdir=${nover_glibgo_toolexeclibdir}/${multi_os_directory} ;;
-esac
-
-if test x"$glibgo_toolexecdir" = x"no"; then
-  glibgo_toolexecdir="${nover_glibgo_toolexecdir}"
-  glibgo_toolexeclibdir="${nover_glibgo_toolexeclibdir}"
-fi
-
-AC_SUBST(glibgo_toolexecdir)
-AC_SUBST(glibgo_toolexeclibdir)
-AC_SUBST(nover_glibgo_toolexeclibdir)
-
-# See if the user wants to configure without libffi.  Some
-# architectures don't support it.  FIXME: We should set a default
-# based on the host.
-AC_ARG_WITH(libffi,
-  AS_HELP_STRING([--without-libffi],
-                 [don't use libffi]),
-  [:],
-  [with_libffi=${with_libffi_default-yes}])
-
-LIBFFI=
-LIBFFIINCS=
-if test "$with_libffi" != no; then
-   AC_DEFINE(USE_LIBFFI, 1, [Define if we're to use libffi.])
-   LIBFFI=../libffi/libffi_convenience.la
-   LIBFFIINCS='-I$(top_srcdir)/../libffi/include -I../libffi/include'
-fi
-AC_SUBST(LIBFFI)
-AC_SUBST(LIBFFIINCS)
-
-# See if the user wants to configure without libatomic. This is useful if we are
-# on an architecture for which libgo does not need an atomic support library and
-# libatomic does not support our C compiler.
-AC_ARG_WITH(libatomic,
-  AS_HELP_STRING([--without-libatomic],
-                 [don't use libatomic]),
-  [:],
-  [with_libatomic=${with_libatomic_default-yes}])
-
-LIBATOMIC=
-if test "$with_libatomic" != no; then
-   LIBATOMIC=../libatomic/libatomic_convenience.la
-fi
-AC_SUBST(LIBATOMIC)
-
-# Used to tell GNU make to include a file without telling automake to
-# include it.
-go_include="-include"
-AC_SUBST(go_include)
-
-is_darwin=no
-is_freebsd=no
-is_irix=no
-is_linux=no
-is_netbsd=no
-is_openbsd=no
-is_dragonfly=no
-is_rtems=no
-is_solaris=no
-GOOS=unknown
-case ${host} in
-  *-*-darwin*)   is_darwin=yes;  GOOS=darwin ;;
-  *-*-freebsd*)  is_freebsd=yes; GOOS=freebsd ;;
-  *-*-irix6*)    is_irix=yes;    GOOS=irix ;;
-  *-*-linux*)    is_linux=yes;   GOOS=linux ;;
-  *-*-netbsd*)	 is_netbsd=yes;  GOOS=netbsd ;;
-  *-*-openbsd*)  is_openbsd=yes; GOOS=openbsd ;;
-  *-*-dragonfly*) is_dragonfly=yes; GOOS=dragonfly ;;
-  *-*-rtems*)    is_rtems=yes;   GOOS=rtems ;;
-  *-*-solaris2*) is_solaris=yes; GOOS=solaris ;;
-esac
-AM_CONDITIONAL(LIBGO_IS_DARWIN, test $is_darwin = yes)
-AM_CONDITIONAL(LIBGO_IS_FREEBSD, test $is_freebsd = yes)
-AM_CONDITIONAL(LIBGO_IS_IRIX, test $is_irix = yes)
-AM_CONDITIONAL(LIBGO_IS_LINUX, test $is_linux = yes)
-AM_CONDITIONAL(LIBGO_IS_NETBSD, test $is_netbsd = yes)
-AM_CONDITIONAL(LIBGO_IS_OPENBSD, test $is_openbsd = yes)
-AM_CONDITIONAL(LIBGO_IS_DRAGONFLY, test $is_dragonfly = yes)
-AM_CONDITIONAL(LIBGO_IS_RTEMS, test $is_rtems = yes)
-AM_CONDITIONAL(LIBGO_IS_SOLARIS, test $is_solaris = yes)
-AC_SUBST(GOOS)
-
-dnl Test whether we need to use DejaGNU or whether we can use the
-dnl simpler gotest approach.  We can only use gotest for a native
-dnl build.
-USE_DEJAGNU=no
-case ${host} in
-  *-*-rtems*) USE_DEJAGNU=yes ;;
-  ${build}) ;;
-  *) USE_DEJAGNU=yes ;;
-esac
-AC_SUBST(USE_DEJAGNU)
-
-dnl N.B. Keep in sync with gcc/testsuite/go.test/go-test.exp (go-set-goarch).
-is_386=no
-is_alpha=no
-is_arm=no
-is_arm64=no
-is_m68k=no
-mips_abi=unknown
-is_ppc=no
-is_ppc64=no
-is_ppc64le=no
-is_s390=no
-is_s390x=no
-is_sparc=no
-is_sparc64=no
-is_x86_64=no
-GOARCH=unknown
-case ${host} in
-  alpha*-*-*)
-    is_alpha=yes
-    GOARCH=alpha
-    ;;
-  aarch64-*-*)
-    is_arm64=yes
-    GOARCH=arm64
-    ;;
-  arm*-*-* | strongarm*-*-* | ep9312*-*-* | xscale-*-*)
-    is_arm=yes
-    GOARCH=arm
-    ;;
-changequote(,)dnl
-  i[34567]86-*-* | x86_64-*-*)
-changequote([,])dnl
-    AC_COMPILE_IFELSE([
-#ifdef __x86_64__
-#error 64-bit
-#endif],
-[is_386=yes], [is_x86_64=yes])
-    if test "$is_386" = "yes"; then
-      GOARCH=386
-    else
-      GOARCH=amd64
-    fi
-    ;;
-  m68k*-*-*)
-    is_m68k=yes
-    GOARCH=m68k
-    ;;
-  mips*-*-*)
-    AC_COMPILE_IFELSE([
-#if _MIPS_SIM != _ABIO32
-#error not o32
-#endif],
-[mips_abi="o32"],
-	[AC_COMPILE_IFELSE([
-#if _MIPS_SIM != _ABIN32
-#error not n32
-#endif],
-[mips_abi="n32"],
-	[AC_COMPILE_IFELSE([
-#if _MIPS_SIM != _ABI64
-#error not n64
-#endif],
-[mips_abi="n64"],
-	[AC_COMPILE_IFELSE([
-#if _MIPS_SIM != _ABIO64
-#error not o64
-#endif],
-[mips_abi="o64"],
-	[AC_MSG_ERROR([unknown MIPS ABI])
-[mips_abi="n32"]])])])])
-    case "$mips_abi" in
-    "o32") GOARCH=mipso32 ;;
-    "n32") GOARCH=mipsn32 ;;
-    "n64") GOARCH=mipsn64 ;;
-    "o64") GOARCH=mipso64 ;;
-    esac
-    ;;
-  rs6000*-*-* | powerpc*-*-*)
-    AC_COMPILE_IFELSE([
-#ifdef _ARCH_PPC64
-#error 64-bit
-#endif],
-[is_ppc=yes],
-    [AC_COMPILE_IFELSE([
-#if defined(_BIG_ENDIAN) || defined(__BIG_ENDIAN__)
-#error 64be
-#endif],
-[is_ppc64le=yes],[is_ppc64=yes])])
-    if test "$is_ppc" = "yes"; then
-      GOARCH=ppc
-    elif test "$is_ppc64" = "yes"; then
-      GOARCH=ppc64
-    else
-      GOARCH=ppc64le
-    fi
-    ;;
-  s390*-*-*)
-    AC_COMPILE_IFELSE([
-#if defined(__s390x__)
-#error 64-bit
-#endif],
-[is_s390=yes], [is_s390x=yes])
-    if test "$is_s390" = "yes"; then
-      GOARCH=s390
-    else
-      GOARCH=s390x
-    fi
-    ;;
-  sparc*-*-*)
-    AC_COMPILE_IFELSE([
-#if defined(__sparcv9) || defined(__arch64__)
-#error 64-bit
-#endif],
-[is_sparc=yes], [is_sparc64=yes])
-    if test "$is_sparc" = "yes"; then
-      GOARCH=sparc
-    else
-      GOARCH=sparc64
-    fi
-    ;;
-esac
-AM_CONDITIONAL(LIBGO_IS_386, test $is_386 = yes)
-AM_CONDITIONAL(LIBGO_IS_ALPHA, test $is_alpha = yes)
-AM_CONDITIONAL(LIBGO_IS_ARM, test $is_arm = yes)
-AM_CONDITIONAL(LIBGO_IS_ARM64, test $is_arm64 = yes)
-AM_CONDITIONAL(LIBGO_IS_M68K, test $is_m68k = yes)
-AM_CONDITIONAL(LIBGO_IS_MIPS, test $mips_abi != unknown)
-AM_CONDITIONAL(LIBGO_IS_MIPSO32, test $mips_abi = o32)
-AM_CONDITIONAL(LIBGO_IS_MIPSN32, test $mips_abi = n32)
-AM_CONDITIONAL(LIBGO_IS_MIPSN64, test $mips_abi = n64)
-AM_CONDITIONAL(LIBGO_IS_MIPSO64, test $mips_abi = o64)
-AM_CONDITIONAL(LIBGO_IS_PPC, test $is_ppc = yes)
-AM_CONDITIONAL(LIBGO_IS_PPC64, test $is_ppc64 = yes)
-AM_CONDITIONAL(LIBGO_IS_PPC64LE, test $is_ppc64le = yes)
-AM_CONDITIONAL(LIBGO_IS_S390, test $is_s390 = yes)
-AM_CONDITIONAL(LIBGO_IS_S390X, test $is_s390x = yes)
-AM_CONDITIONAL(LIBGO_IS_SPARC, test $is_sparc = yes)
-AM_CONDITIONAL(LIBGO_IS_SPARC64, test $is_sparc64 = yes)
-AM_CONDITIONAL(LIBGO_IS_X86_64, test $is_x86_64 = yes)
-AC_SUBST(GOARCH)
-
-dnl Some files are only present when needed for specific architectures.
-GO_LIBCALL_OS_FILE=
-GO_LIBCALL_OS_ARCH_FILE=
-GO_SYSCALL_OS_FILE=
-GO_SYSCALL_OS_ARCH_FILE=
-if test -f "${srcdir}/go/syscall/libcall_${GOOS}.go"; then
-  GO_LIBCALL_OS_FILE="go/syscall/libcall_${GOOS}.go"
-fi
-if test -f "${srcdir}/go/syscall/libcall_${GOOS}_${GOARCH}.go"; then
-  GO_LIBCALL_OS_ARCH_FILE="go/syscall/libcall_${GOOS}_${GOARCH}.go"
-fi
-if test -f "${srcdir}/go/syscall/syscall_${GOOS}.go"; then
-  GO_SYSCALL_OS_FILE="go/syscall/syscall_${GOOS}.go"
-fi
-if test -f "${srcdir}/go/syscall/syscall_${GOOS}_${GOARCH}.go"; then
-  GO_SYSCALL_OS_ARCH_FILE="go/syscall/syscall_${GOOS}_${GOARCH}.go"
-fi
-AC_SUBST(GO_LIBCALL_OS_FILE)
-AC_SUBST(GO_LIBCALL_OS_ARCH_FILE)
-AC_SUBST(GO_SYSCALL_OS_FILE)
-AC_SUBST(GO_SYSCALL_OS_ARCH_FILE)
-
-dnl Special flags used to generate sysinfo.go.
-OSCFLAGS="-D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
-case "$target" in
-    mips-sgi-irix6.5*)
-	# IRIX 6 needs _XOPEN_SOURCE=500 for the XPG5 version of struct
-	# msghdr in <sys/socket.h>.
-	OSCFLAGS="$OSCFLAGS -D_XOPEN_SOURCE=500"
-	;;
-    *-*-solaris2.1[[01]])
-	# Solaris 10+ needs this so struct msghdr gets the msg_control
-	# etc. fields in <sys/socket.h> (_XPG4_2).  _XOPEN_SOURCE=600 as
-	# above doesn't work with C99.
-	OSCFLAGS="$OSCFLAGS -std=gnu99 -D_XOPEN_SOURCE=600 -D__EXTENSIONS__"
-	;;
-esac
-AC_SUBST(OSCFLAGS)
-
-dnl Use -fsplit-stack when compiling C code if available.
-AC_CACHE_CHECK([whether -fsplit-stack is supported],
-[libgo_cv_c_split_stack_supported],
-[CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -fsplit-stack"
-AC_COMPILE_IFELSE([[int i;]],
-[libgo_cv_c_split_stack_supported=yes],
-[libgo_cv_c_split_stack_supported=no])
-CFLAGS=$CFLAGS_hold])
-
-dnl Make sure the linker permits -fsplit-stack.  Old versions of gold will
-dnl reject split-stack code calling non-split-stack code on targets
-dnl they don't support.
-AC_CACHE_CHECK([whether linker supports split/non-split linked together],
-[libgo_cv_c_linker_split_non_split],
-[cat > conftest1.c << EOF
-extern void f();
-int main() { f(); return 0; }
-EOF
-cat > conftest2.c << EOF
-void f() {}
-EOF
-$CC -c -fsplit-stack $CFLAGS $CPPFLAGS conftest1.c
-$CC -c $CFLAGS $CPPFLAGS conftest2.c
-if $CC -o conftest conftest1.$ac_objext conftest2.$ac_objext; then
-  libgo_cv_c_linker_split_non_split=yes
-else
-  libgo_cv_c_linker_split_non_split=no
-fi
-rm -f conftest1.* conftest2.* conftest])
-
-if test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = yes; then
-  SPLIT_STACK=-fsplit-stack
-  AC_DEFINE(USING_SPLIT_STACK, 1,
-		[Define if the compiler supports -fsplit-stack])
-else
-  SPLIT_STACK=
-fi
-AC_SUBST(SPLIT_STACK)
-AM_CONDITIONAL(USING_SPLIT_STACK,
-	test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = yes)
-
-dnl If the compiler supports split-stack but the linker does not, then
-dnl we need to explicitly disable split-stack for Go.
-if test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = no; then
-  GO_SPLIT_STACK=-fno-split-stack
-else
-  GO_SPLIT_STACK=
-fi
-AC_SUBST(GO_SPLIT_STACK)
-
-dnl Check whether the linker does stack munging when calling from
-dnl split-stack into non-split-stack code.  We check this by looking
-dnl at the --help output.  FIXME: This is only half right: it's
-dnl possible for the linker to support this for some targets but not
-dnl others.
-dnl This is slightly different from the above check, which is whether
-dnl the linker permits the call at all.
-AC_CACHE_CHECK([whether linker supports split stack],
-[libgo_cv_c_linker_supports_split_stack],
-[libgo_cv_c_linker_supports_split_stack=no
-if $GOC -Wl,--help 2>/dev/null | grep split-stack-adjust-size >/dev/null 2>&1; then
-  libgo_cv_c_linker_supports_split_stack=yes
-fi])
-if test "$libgo_cv_c_linker_supports_split_stack" = yes; then
-  AC_DEFINE(LINKER_SUPPORTS_SPLIT_STACK, 1,
-	    [Define if the linker support split stack adjustments])
-fi
-
-AC_CACHE_CHECK([whether compiler is llgo],
-[libgo_cv_c_goc_is_llgo],
-[libgo_cv_c_goc_is_llgo=no
-if $GOC -dumpversion 2>/dev/null | grep llgo >/dev/null 2>&1; then
-  libgo_cv_c_goc_is_llgo=yes
-fi])
-AM_CONDITIONAL(GOC_IS_LLGO, test "$libgo_cv_c_goc_is_llgo" = yes)
-
-dnl Test for the -lm library.
-MATH_LIBS=
-AC_CHECK_LIB([m], [sqrt], MATH_LIBS=-lm)
-AC_SUBST(MATH_LIBS)
-
-dnl Test for -lsocket and -lnsl.  Copied from libjava/configure.ac.
-AC_CACHE_CHECK([for socket libraries], libgo_cv_lib_sockets,
-  [libgo_cv_lib_sockets=
-   libgo_check_both=no
-   AC_CHECK_FUNC(connect, libgo_check_socket=no, libgo_check_socket=yes)
-   if test "$libgo_check_socket" = "yes"; then
-     unset ac_cv_func_connect
-     AC_CHECK_LIB(socket, main, libgo_cv_lib_sockets="-lsocket",
-     		  libgo_check_both=yes)
-   fi
-   if test "$libgo_check_both" = "yes"; then
-     libgo_old_libs=$LIBS
-     LIBS="$LIBS -lsocket -lnsl"
-     unset ac_cv_func_accept
-     AC_CHECK_FUNC(accept,
-		   [libgo_check_nsl=no
-		    libgo_cv_lib_sockets="-lsocket -lnsl"])
-     unset ac_cv_func_accept
-     LIBS=$libgo_old_libs
-   fi
-   unset ac_cv_func_gethostbyname
-   libgo_old_libs="$LIBS"
-   AC_CHECK_FUNC(gethostbyname, ,
-		 [AC_CHECK_LIB(nsl, main,
-		 	[libgo_cv_lib_sockets="$libgo_cv_lib_sockets -lnsl"])])
-   unset ac_cv_func_gethostbyname
-   AC_CHECK_FUNC(sendfile, ,
-		 [AC_CHECK_LIB(sendfile, main,
-		 	[libgo_cv_lib_sockets="$libgo_cv_lib_sockets -lsendfile"])])
-   LIBS=$libgo_old_libs
-])
-NET_LIBS="$libgo_cv_lib_sockets"
-AC_SUBST(NET_LIBS)
-
-dnl Test whether the compiler supports the -pthread option.
-AC_CACHE_CHECK([whether -pthread is supported],
-[libgo_cv_lib_pthread],
-[CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -pthread"
-AC_COMPILE_IFELSE([[int i;]],
-[libgo_cv_lib_pthread=yes],
-[libgo_cv_lib_pthread=no])
-CFLAGS=$CFLAGS_hold])
-PTHREAD_CFLAGS=
-if test "$libgo_cv_lib_pthread" = yes; then
-  PTHREAD_CFLAGS=-pthread
-fi
-AC_SUBST(PTHREAD_CFLAGS)
-
-dnl Test for the -lpthread library.
-PTHREAD_LIBS=
-AC_CHECK_LIB([pthread], [pthread_create], PTHREAD_LIBS=-lpthread)
-AC_SUBST(PTHREAD_LIBS)
-
-dnl Test if -lrt is required for sched_yield or nanosleep or clock_gettime.
-AC_SEARCH_LIBS([sched_yield], [rt])
-AC_SEARCH_LIBS([nanosleep], [rt])
-AC_SEARCH_LIBS([clock_gettime], [rt])
-
-AC_C_BIGENDIAN
-
-GCC_CHECK_UNWIND_GETIPINFO
-
-AC_CHECK_HEADERS(sched.h sys/file.h sys/mman.h syscall.h sys/epoll.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h)
-
-AC_CHECK_HEADERS([linux/filter.h linux/if_addr.h linux/if_ether.h linux/if_tun.h linux/netlink.h linux/rtnetlink.h], [], [],
-[#ifdef HAVE_SYS_SOCKET_H
-#include <sys/socket.h>
-#endif
-])
-
-AC_CACHE_CHECK([whether <ustat.h> can be used],
-[libgo_cv_c_ustat_h],
-[CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE $OSCFLAGS"
-AC_COMPILE_IFELSE(
-[AC_LANG_SOURCE([
-#include <sys/types.h>
-#ifdef HAVE_LINUX_FILTER_H
-#include <linux/filter.h>
-#endif
-#include <ustat.h>
-])], [libgo_cv_c_ustat_h=yes], [libgo_cv_c_ustat_h=no])
-CFLAGS=$CFLAGS_hold])
-if test $libgo_cv_c_ustat_h = yes; then
-  AC_DEFINE(HAVE_USTAT_H, 1,
-    [Define to 1 if you have the <ustat.h> header file and it works.])
-fi
-
-AM_CONDITIONAL(HAVE_SYS_MMAN_H, test "$ac_cv_header_sys_mman_h" = yes)
-
-AC_CHECK_FUNCS(strerror_r strsignal wait4 mincore setenv unsetenv dl_iterate_phdr)
-AM_CONDITIONAL(HAVE_STRERROR_R, test "$ac_cv_func_strerror_r" = yes)
-AM_CONDITIONAL(HAVE_WAIT4, test "$ac_cv_func_wait4" = yes)
-
-AC_CHECK_FUNCS(accept4 dup3 epoll_create1 faccessat fallocate fchmodat fchownat futimesat getxattr inotify_add_watch inotify_init inotify_init1 inotify_rm_watch listxattr mkdirat mknodat open64 openat pipe2 removexattr renameat setxattr sync_file_range splice tee unlinkat unshare utimensat)
-AC_TYPE_OFF_T
-AC_CHECK_TYPES([loff_t])
-
-LIBS_hold="$LIBS"
-LIBS="$LIBS -lm"
-AC_CHECK_FUNCS(cosl expl logl sinl tanl acosl asinl atanl atan2l expm1l ldexpl log10l log1pl)
-LIBS="$LIBS_hold"
-
-CFLAGS_hold="$CFLAGS"
-CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-LIBS_hold="$LIBS"
-LIBS="$LIBS $PTHREAD_LIBS"
-AC_CHECK_FUNCS(sem_timedwait)
-CFLAGS="$CFLAGS_hold"
-LIBS="$LIBS_hold"
-
-LIBS_hold="$LIBS"
-LIBS="$LIBS $MATH_LIBS"
-AC_CHECK_FUNCS(matherr)
-LIBS="$LIBS_hold"
-
-AC_CACHE_CHECK([for __sync_bool_compare_and_swap_4],
-[libgo_cv_func___sync_bool_compare_and_swap_4],
-[AC_LINK_IFELSE([
-typedef unsigned int uint32  __attribute__ ((mode (SI)));
-uint32 i;
-int main() { return __sync_bool_compare_and_swap (&i, 0, 1); }
-],
-[libgo_cv_func___sync_bool_compare_and_swap_4=yes],
-[libgo_cv_func___sync_bool_compare_and_swap_4=no])])
-if test "$libgo_cv_func___sync_bool_compare_and_swap_4" = "yes"; then
-  AC_DEFINE(HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4, 1,
-    [Define to 1 if the compiler provides the __sync_bool_compare_and_swap function for uint32])
-fi
-
-AC_CACHE_CHECK([for __sync_bool_compare_and_swap_8],
-[libgo_cv_func___sync_bool_compare_and_swap_8],
-[AC_LINK_IFELSE([
-typedef unsigned int uint64  __attribute__ ((mode (DI)));
-uint64 i;
-int main() { return __sync_bool_compare_and_swap (&i, 0, 1); }
-],
-[libgo_cv_func___sync_bool_compare_and_swap_8=yes],
-[libgo_cv_func___sync_bool_compare_and_swap_8=no])])
-if test "$libgo_cv_func___sync_bool_compare_and_swap_8" = "yes"; then
-  AC_DEFINE(HAVE_SYNC_BOOL_COMPARE_AND_SWAP_8, 1,
-    [Define to 1 if the compiler provides the __sync_bool_compare_and_swap function for uint64])
-fi
-
-AC_CACHE_CHECK([for __sync_fetch_and_add_4],
-[libgo_cv_func___sync_fetch_and_add_4],
-[AC_LINK_IFELSE([
-typedef unsigned int uint32  __attribute__ ((mode (SI)));
-uint32 i;
-int main() { return __sync_fetch_and_add (&i, 1); }
-],
-[libgo_cv_func___sync_fetch_and_add_4=yes],
-[libgo_cv_func___sync_fetch_and_add_4=no])])
-if test "$libgo_cv_func___sync_fetch_and_add_4" = "yes"; then
-  AC_DEFINE(HAVE_SYNC_FETCH_AND_ADD_4, 1,
-    [Define to 1 if the compiler provides the __sync_fetch_and_add function for uint32])
-fi
-
-AC_CACHE_CHECK([for __sync_add_and_fetch_8],
-[libgo_cv_func___sync_add_and_fetch_8],
-[AC_LINK_IFELSE([
-typedef unsigned int uint64  __attribute__ ((mode (DI)));
-uint64 i;
-int main() { return __sync_add_and_fetch (&i, 1); }
-],
-[libgo_cv_func___sync_add_and_fetch_8=yes],
-[libgo_cv_func___sync_add_and_fetch_8=no])])
-if test "$libgo_cv_func___sync_add_and_fetch_8" = "yes"; then
-  AC_DEFINE(HAVE_SYNC_ADD_AND_FETCH_8, 1,
-    [Define to 1 if the compiler provides the __sync_add_and_fetch function for uint64])
-fi
-
-dnl For x86 we want to use the -minline-all-stringops option to avoid
-dnl forcing a stack split when calling memcpy and friends.
-AC_CACHE_CHECK([whether compiler supports -minline-all-stringops],
-[libgo_cv_c_stringops],
-[CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -minline-all-stringops"
-AC_COMPILE_IFELSE([int i;],
-[libgo_cv_c_stringops=yes],
-[libgo_cv_c_stringops=no])
-CFLAGS=$CFLAGS_hold])
-STRINGOPS_FLAG=
-if test "$libgo_cv_c_stringops" = yes; then
-  STRINGOPS_FLAG=-minline-all-stringops
-fi
-AC_SUBST(STRINGOPS_FLAG)
-
-dnl For x86 we want to compile the math library with -mfancy-math-387
-dnl -funsafe-math-optimizations so that we can use the builtin
-dnl instructions directly.
-AC_CACHE_CHECK([whether compiler supports -mfancy-math-387],
-[libgo_cv_c_fancymath],
-[CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -mfancy-math-387"
-AC_COMPILE_IFELSE([int i;],
-[libgo_cv_c_fancymath=yes],
-[libgo_cv_c_fancymath=no])
-CFLAGS=$CFLAGS_hold])
-MATH_FLAG=
-if test "$libgo_cv_c_fancymath" = yes; then
-  MATH_FLAG="-mfancy-math-387 -funsafe-math-optimizations"
-else
-  MATH_FLAG="-ffp-contract=off"
-fi
-AC_SUBST(MATH_FLAG)
-
-CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE"
-AC_CHECK_TYPES([off64_t])
-CFLAGS=$CFLAGS_hold
-
-dnl Work out the size of the epoll_events struct on GNU/Linux.
-AC_CACHE_CHECK([epoll_event size],
-[libgo_cv_c_epoll_event_size],
-[AC_COMPUTE_INT(libgo_cv_c_epoll_event_size,
-[sizeof (struct epoll_event)],
-[#include <sys/epoll.h>],
-[libgo_cv_c_epoll_event_size=0])])
-SIZEOF_STRUCT_EPOLL_EVENT=${libgo_cv_c_epoll_event_size}
-AC_SUBST(SIZEOF_STRUCT_EPOLL_EVENT)
-
-dnl Work out the offset of the fd field in the epoll_events struct on
-dnl GNU/Linux.
-AC_CACHE_CHECK([epoll_event data.fd offset],
-[libgo_cv_c_epoll_event_fd_offset],
-[AC_COMPUTE_INT(libgo_cv_c_epoll_event_fd_offset,
-[offsetof (struct epoll_event, data.fd)],
-[#include <stddef.h>
-#include <sys/epoll.h>],
-[libgo_cv_c_epoll_event_fd_offset=0])])
-STRUCT_EPOLL_EVENT_FD_OFFSET=${libgo_cv_c_epoll_event_fd_offset}
-AC_SUBST(STRUCT_EPOLL_EVENT_FD_OFFSET)
-
-dnl Check if <sys/stat.h> uses timespec_t for st_?tim members.  Introduced
-dnl in Solaris 12 for XPG7 compatibility.
-AC_EGREP_HEADER([timespec_t.*st_atim], [sys/stat.h],
-		[have_stat_timespec=yes], [have_stat_timespec=no])
-AM_CONDITIONAL(HAVE_STAT_TIMESPEC, test $have_stat_timespec = yes)
-
-dnl See if struct exception is defined in <math.h>.
-AC_CHECK_TYPE([struct exception],
-[libgo_has_struct_exception=yes],
-[libgo_has_struct_exception=no],
-[#include <math.h>])
-if test "$libgo_has_struct_exception" = "yes"; then
-  AC_DEFINE(HAVE_STRUCT_EXCEPTION, 1,
-            [Define to 1 if <math.h> defines struct exception])
-fi
-
-dnl See whether setcontext changes the value of TLS variables.
-AC_CACHE_CHECK([whether setcontext clobbers TLS variables],
-[libgo_cv_lib_setcontext_clobbers_tls],
-[CFLAGS_hold="$CFLAGS"
-CFLAGS="$PTHREAD_CFLAGS"
-LIBS_hold="$LIBS"
-LIBS="$LIBS $PTHREAD_LIBS"
-AC_CHECK_SIZEOF([void *])
-AS_VAR_ARITH([ptr_type_size], [$ac_cv_sizeof_void_p \* 8])
-AC_RUN_IFELSE(
-  [AC_LANG_SOURCE([
-#include <pthread.h>
-#include <stdlib.h>
-#include <ucontext.h>
-#include <unistd.h>
-
-__thread int tls;
-
-static char stack[[10 * 1024 * 1024]];
-static ucontext_t c;
-
-/* Called via makecontext/setcontext.  */
-
-static void
-cfn (void)
-{
-  exit (tls);
-}
-
-/* Called via pthread_create.  */
-
-static void *
-tfn (void *dummy)
-{
-  /* The thread should still see this value after calling
-     setcontext.  */
-  tls = 0;
-
-  setcontext (&c);
-
-  /* The call to setcontext should not return.  */
-  abort ();
-}
-
-int
-main ()
-{
-  pthread_t tid;
-
-  /* The thread should not see this value.  */
-  tls = 1;
-
-  if (getcontext (&c) < 0)
-    abort ();
-
-  c.uc_stack.ss_sp = stack;
-#ifdef MAKECONTEXT_STACK_TOP
-  c.uc_stack.ss_sp += sizeof stack;
-#endif
-  c.uc_stack.ss_flags = 0;
-  c.uc_stack.ss_size = sizeof stack;
-  c.uc_link = NULL;
-  makecontext (&c, cfn, 0);
-
-  if (pthread_create (&tid, NULL, tfn, NULL) != 0)
-    abort ();
-
-  if (pthread_join (tid, NULL) != 0)
-    abort ();
-
-  /* The thread should have called exit.  */
-  abort ();
-}
-])],
-[libgo_cv_lib_setcontext_clobbers_tls=no],
-[libgo_cv_lib_setcontext_clobbers_tls=yes],
-[case "$target:$ptr_type_size" in
-  i?86-*-solaris2.1[[01]]:64 | x86_64*-*-solaris2.1[[01]]:64)
-    libgo_cv_lib_setcontext_clobbers_tls=yes ;;
-  *)
-    libgo_cv_lib_setcontext_clobbers_tls=no ;;
- esac
-])
-CFLAGS="$CFLAGS_hold"
-LIBS="$LIBS_hold"
-])
-if test "$libgo_cv_lib_setcontext_clobbers_tls" = "yes"; then
-  AC_DEFINE(SETCONTEXT_CLOBBERS_TLS, 1,
-	    [Define if setcontext clobbers TLS variables])
-fi
-
-AC_CACHE_CHECK([whether .eh_frame section should be read-only],
-libgo_cv_ro_eh_frame, [
-libgo_cv_ro_eh_frame=no
-echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
-if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then
-  if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then
-    libgo_cv_ro_eh_frame=yes
-  elif grep '.section.*eh_frame.*#alloc' conftest.c \
-       | grep -v '#write' > /dev/null; then
-    libgo_cv_ro_eh_frame=yes
-  fi
-fi
-rm -f conftest.*
-])
-if test "x$libgo_cv_ro_eh_frame" = xyes; then
-  AC_DEFINE(EH_FRAME_FLAGS, "a",
-	    [Define to the flags needed for the .section .eh_frame directive.])
-else
-  AC_DEFINE(EH_FRAME_FLAGS, "aw",
-	    [Define to the flags needed for the .section .eh_frame directive.])
-fi
-
-AC_CACHE_CHECK([if compiler supports -Qunused-arguments],
-[libgo_cv_c_unused_arguments],
-[CFLAGS_hold=$CFLAGS
-CFLAGS="$CFLAGS -Qunused-arguments"
-AC_COMPILE_IFELSE([[int i;]],
-[libgo_cv_c_unused_arguments=yes],
-[libgo_cv_c_unused_arguments=no])
-CFLAGS=$CFLAGS_hold])
-
-AC_CACHE_CHECK([if assembler supports GNU comdat group syntax],
-libgo_cv_as_comdat_gnu, [
-echo '.section .text,"axG",@progbits,.foo,comdat' > conftest.s
-CFLAGS_hold=$CFLAGS
-if test "$libgo_cv_c_unused_arguments" = yes; then
-  CFLAGS="$CFLAGS -Qunused-arguments"
-fi
-if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then
-  libgo_cv_as_comdat_gnu=yes
-else
-  libgo_cv_as_comdat_gnu=no
-fi
-CFLAGS=$CFLAGS_hold
-])
-if test "x$libgo_cv_as_comdat_gnu" = xyes; then
-  AC_DEFINE(HAVE_AS_COMDAT_GAS, 1,
-	    [Define if your assembler supports GNU comdat group syntax.])
-fi
-
-AC_CACHE_CHECK([assembler supports pc related relocs],
-libgo_cv_as_x86_pcrel, [
-libgo_cv_as_x86_pcrel=yes
-echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
-CFLAGS_hold=$CFLAGS
-if test "$libgo_cv_c_unused_arguments" = yes; then
-  CFLAGS="$CFLAGS -Qunused-arguments"
-fi
-if $CC $CFLAGS -c conftest.s 2>&1 | $EGREP -i 'illegal|warning' > /dev/null; then
-    libgo_cv_as_x86_pcrel=no
-fi
-CFLAGS=$CFLAGS_hold
-])
-if test "x$libgo_cv_as_x86_pcrel" = xyes; then
-  AC_DEFINE(HAVE_AS_X86_PCREL, 1,
-	    [Define if your assembler supports PC relative relocs.])
-fi
-
-AC_CACHE_CHECK([assembler supports unwind section type],
-libgo_cv_as_x86_64_unwind_section_type, [
-libgo_cv_as_x86_64_unwind_section_type=yes
-echo '.section .eh_frame,"a",@unwind' > conftest.s
-CFLAGS_hold=$CFLAGS
-if test "$libgo_cv_c_unused_arguments" = yes; then
-  CFLAGS="$CFLAGS -Qunused-arguments"
-fi
-if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
-    libgo_cv_as_x86_64_unwind_section_type=no
-fi
-CFLAGS=$CFLAGS_hold
-])
-if test "x$libgo_cv_as_x86_64_unwind_section_type" = xyes; then
-  AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1,
-	    [Define if your assembler supports unwind section type.])
-fi
-
-AC_CACHE_SAVE
-
-if test ${multilib} = yes; then
-  multilib_arg="--enable-multilib"
-else
-  multilib_arg=
-fi
-
-AC_CONFIG_FILES(Makefile testsuite/Makefile)
-
-AC_CONFIG_COMMANDS([default],
-[if test -n "$CONFIG_FILES"; then
-   # Multilibs need MULTISUBDIR defined correctly in certain makefiles so
-   # that multilib installs will end up installed in the correct place.
-   # The testsuite needs it for multilib-aware ABI baseline files.
-   # To work around this not being passed down from config-ml.in ->
-   # srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually
-   # append it here.  Only modify Makefiles that have just been created.
-   #
-   # Also, get rid of this simulated-VPATH thing that automake does.
-   cat > vpsed << \_EOF
-s!`test -f '$<' || echo '$(srcdir)/'`!!
-_EOF
-   for i in $SUBDIRS; do
-    case $CONFIG_FILES in
-     *${i}/Makefile*)
-       #echo "Adding MULTISUBDIR to $i/Makefile"
-       sed -f vpsed $i/Makefile > tmp
-       grep '^MULTISUBDIR =' Makefile >> tmp
-       mv tmp $i/Makefile
-       ;;
-    esac
-   done
-   rm vpsed
- fi
-],
-[
-# Variables needed in config.status (file generation) which aren't already
-# passed by autoconf.
-SUBDIRS="$SUBDIRS"
-])
-
-AC_OUTPUT
diff --git a/third_party/gofrontend/libgo/go/archive/tar/common.go b/third_party/gofrontend/libgo/go/archive/tar/common.go
deleted file mode 100644
index c31df06..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/common.go
+++ /dev/null
@@ -1,329 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package tar implements access to tar archives.
-// It aims to cover most of the variations, including those produced
-// by GNU and BSD tars.
-//
-// References:
-//   http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5
-//   http://www.gnu.org/software/tar/manual/html_node/Standard.html
-//   http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html
-package tar
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"os"
-	"path"
-	"time"
-)
-
-const (
-	blockSize = 512
-
-	// Types
-	TypeReg           = '0'    // regular file
-	TypeRegA          = '\x00' // regular file
-	TypeLink          = '1'    // hard link
-	TypeSymlink       = '2'    // symbolic link
-	TypeChar          = '3'    // character device node
-	TypeBlock         = '4'    // block device node
-	TypeDir           = '5'    // directory
-	TypeFifo          = '6'    // fifo node
-	TypeCont          = '7'    // reserved
-	TypeXHeader       = 'x'    // extended header
-	TypeXGlobalHeader = 'g'    // global extended header
-	TypeGNULongName   = 'L'    // Next file has a long name
-	TypeGNULongLink   = 'K'    // Next file symlinks to a file w/ a long name
-	TypeGNUSparse     = 'S'    // sparse file
-)
-
-// A Header represents a single header in a tar archive.
-// Some fields may not be populated.
-type Header struct {
-	Name       string    // name of header file entry
-	Mode       int64     // permission and mode bits
-	Uid        int       // user id of owner
-	Gid        int       // group id of owner
-	Size       int64     // length in bytes
-	ModTime    time.Time // modified time
-	Typeflag   byte      // type of header entry
-	Linkname   string    // target name of link
-	Uname      string    // user name of owner
-	Gname      string    // group name of owner
-	Devmajor   int64     // major number of character or block device
-	Devminor   int64     // minor number of character or block device
-	AccessTime time.Time // access time
-	ChangeTime time.Time // status change time
-	Xattrs     map[string]string
-}
-
-// File name constants from the tar spec.
-const (
-	fileNameSize       = 100 // Maximum number of bytes in a standard tar name.
-	fileNamePrefixSize = 155 // Maximum number of ustar extension bytes.
-)
-
-// FileInfo returns an os.FileInfo for the Header.
-func (h *Header) FileInfo() os.FileInfo {
-	return headerFileInfo{h}
-}
-
-// headerFileInfo implements os.FileInfo.
-type headerFileInfo struct {
-	h *Header
-}
-
-func (fi headerFileInfo) Size() int64        { return fi.h.Size }
-func (fi headerFileInfo) IsDir() bool        { return fi.Mode().IsDir() }
-func (fi headerFileInfo) ModTime() time.Time { return fi.h.ModTime }
-func (fi headerFileInfo) Sys() interface{}   { return fi.h }
-
-// Name returns the base name of the file.
-func (fi headerFileInfo) Name() string {
-	if fi.IsDir() {
-		return path.Base(path.Clean(fi.h.Name))
-	}
-	return path.Base(fi.h.Name)
-}
-
-// Mode returns the permission and mode bits for the headerFileInfo.
-func (fi headerFileInfo) Mode() (mode os.FileMode) {
-	// Set file permission bits.
-	mode = os.FileMode(fi.h.Mode).Perm()
-
-	// Set setuid, setgid and sticky bits.
-	if fi.h.Mode&c_ISUID != 0 {
-		// setuid
-		mode |= os.ModeSetuid
-	}
-	if fi.h.Mode&c_ISGID != 0 {
-		// setgid
-		mode |= os.ModeSetgid
-	}
-	if fi.h.Mode&c_ISVTX != 0 {
-		// sticky
-		mode |= os.ModeSticky
-	}
-
-	// Set file mode bits.
-	// clear perm, setuid, setgid and sticky bits.
-	m := os.FileMode(fi.h.Mode) &^ 07777
-	if m == c_ISDIR {
-		// directory
-		mode |= os.ModeDir
-	}
-	if m == c_ISFIFO {
-		// named pipe (FIFO)
-		mode |= os.ModeNamedPipe
-	}
-	if m == c_ISLNK {
-		// symbolic link
-		mode |= os.ModeSymlink
-	}
-	if m == c_ISBLK {
-		// device file
-		mode |= os.ModeDevice
-	}
-	if m == c_ISCHR {
-		// Unix character device
-		mode |= os.ModeDevice
-		mode |= os.ModeCharDevice
-	}
-	if m == c_ISSOCK {
-		// Unix domain socket
-		mode |= os.ModeSocket
-	}
-
-	switch fi.h.Typeflag {
-	case TypeSymlink:
-		// symbolic link
-		mode |= os.ModeSymlink
-	case TypeChar:
-		// character device node
-		mode |= os.ModeDevice
-		mode |= os.ModeCharDevice
-	case TypeBlock:
-		// block device node
-		mode |= os.ModeDevice
-	case TypeDir:
-		// directory
-		mode |= os.ModeDir
-	case TypeFifo:
-		// fifo node
-		mode |= os.ModeNamedPipe
-	}
-
-	return mode
-}
-
-// sysStat, if non-nil, populates h from system-dependent fields of fi.
-var sysStat func(fi os.FileInfo, h *Header) error
-
-// Mode constants from the tar spec.
-const (
-	c_ISUID  = 04000   // Set uid
-	c_ISGID  = 02000   // Set gid
-	c_ISVTX  = 01000   // Save text (sticky bit)
-	c_ISDIR  = 040000  // Directory
-	c_ISFIFO = 010000  // FIFO
-	c_ISREG  = 0100000 // Regular file
-	c_ISLNK  = 0120000 // Symbolic link
-	c_ISBLK  = 060000  // Block special file
-	c_ISCHR  = 020000  // Character special file
-	c_ISSOCK = 0140000 // Socket
-)
-
-// Keywords for the PAX Extended Header
-const (
-	paxAtime    = "atime"
-	paxCharset  = "charset"
-	paxComment  = "comment"
-	paxCtime    = "ctime" // please note that ctime is not a valid pax header.
-	paxGid      = "gid"
-	paxGname    = "gname"
-	paxLinkpath = "linkpath"
-	paxMtime    = "mtime"
-	paxPath     = "path"
-	paxSize     = "size"
-	paxUid      = "uid"
-	paxUname    = "uname"
-	paxXattr    = "SCHILY.xattr."
-	paxNone     = ""
-)
-
-// FileInfoHeader creates a partially-populated Header from fi.
-// If fi describes a symlink, FileInfoHeader records link as the link target.
-// If fi describes a directory, a slash is appended to the name.
-// Because os.FileInfo's Name method returns only the base name of
-// the file it describes, it may be necessary to modify the Name field
-// of the returned header to provide the full path name of the file.
-func FileInfoHeader(fi os.FileInfo, link string) (*Header, error) {
-	if fi == nil {
-		return nil, errors.New("tar: FileInfo is nil")
-	}
-	fm := fi.Mode()
-	h := &Header{
-		Name:    fi.Name(),
-		ModTime: fi.ModTime(),
-		Mode:    int64(fm.Perm()), // or'd with c_IS* constants later
-	}
-	switch {
-	case fm.IsRegular():
-		h.Mode |= c_ISREG
-		h.Typeflag = TypeReg
-		h.Size = fi.Size()
-	case fi.IsDir():
-		h.Typeflag = TypeDir
-		h.Mode |= c_ISDIR
-		h.Name += "/"
-	case fm&os.ModeSymlink != 0:
-		h.Typeflag = TypeSymlink
-		h.Mode |= c_ISLNK
-		h.Linkname = link
-	case fm&os.ModeDevice != 0:
-		if fm&os.ModeCharDevice != 0 {
-			h.Mode |= c_ISCHR
-			h.Typeflag = TypeChar
-		} else {
-			h.Mode |= c_ISBLK
-			h.Typeflag = TypeBlock
-		}
-	case fm&os.ModeNamedPipe != 0:
-		h.Typeflag = TypeFifo
-		h.Mode |= c_ISFIFO
-	case fm&os.ModeSocket != 0:
-		h.Mode |= c_ISSOCK
-	default:
-		return nil, fmt.Errorf("archive/tar: unknown file mode %v", fm)
-	}
-	if fm&os.ModeSetuid != 0 {
-		h.Mode |= c_ISUID
-	}
-	if fm&os.ModeSetgid != 0 {
-		h.Mode |= c_ISGID
-	}
-	if fm&os.ModeSticky != 0 {
-		h.Mode |= c_ISVTX
-	}
-	// If possible, populate additional fields from OS-specific
-	// FileInfo fields.
-	if sys, ok := fi.Sys().(*Header); ok {
-		// This FileInfo came from a Header (not the OS). Use the
-		// original Header to populate all remaining fields.
-		h.Uid = sys.Uid
-		h.Gid = sys.Gid
-		h.Uname = sys.Uname
-		h.Gname = sys.Gname
-		h.AccessTime = sys.AccessTime
-		h.ChangeTime = sys.ChangeTime
-		if sys.Xattrs != nil {
-			h.Xattrs = make(map[string]string)
-			for k, v := range sys.Xattrs {
-				h.Xattrs[k] = v
-			}
-		}
-		if sys.Typeflag == TypeLink {
-			// hard link
-			h.Typeflag = TypeLink
-			h.Size = 0
-			h.Linkname = sys.Linkname
-		}
-	}
-	if sysStat != nil {
-		return h, sysStat(fi, h)
-	}
-	return h, nil
-}
-
-var zeroBlock = make([]byte, blockSize)
-
-// POSIX specifies a sum of the unsigned byte values, but the Sun tar uses signed byte values.
-// We compute and return both.
-func checksum(header []byte) (unsigned int64, signed int64) {
-	for i := 0; i < len(header); i++ {
-		if i == 148 {
-			// The chksum field (header[148:156]) is special: it should be treated as space bytes.
-			unsigned += ' ' * 8
-			signed += ' ' * 8
-			i += 7
-			continue
-		}
-		unsigned += int64(header[i])
-		signed += int64(int8(header[i]))
-	}
-	return
-}
-
-type slicer []byte
-
-func (sp *slicer) next(n int) (b []byte) {
-	s := *sp
-	b, *sp = s[0:n], s[n:]
-	return
-}
-
-func isASCII(s string) bool {
-	for _, c := range s {
-		if c >= 0x80 {
-			return false
-		}
-	}
-	return true
-}
-
-func toASCII(s string) string {
-	if isASCII(s) {
-		return s
-	}
-	var buf bytes.Buffer
-	for _, c := range s {
-		if c < 0x80 {
-			buf.WriteByte(byte(c))
-		}
-	}
-	return buf.String()
-}
diff --git a/third_party/gofrontend/libgo/go/archive/tar/reader.go b/third_party/gofrontend/libgo/go/archive/tar/reader.go
deleted file mode 100644
index 67daca2..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/reader.go
+++ /dev/null
@@ -1,835 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tar
-
-// TODO(dsymonds):
-//   - pax extensions
-
-import (
-	"bytes"
-	"errors"
-	"io"
-	"io/ioutil"
-	"os"
-	"strconv"
-	"strings"
-	"time"
-)
-
-var (
-	ErrHeader = errors.New("archive/tar: invalid tar header")
-)
-
-const maxNanoSecondIntSize = 9
-
-// A Reader provides sequential access to the contents of a tar archive.
-// A tar archive consists of a sequence of files.
-// The Next method advances to the next file in the archive (including the first),
-// and then it can be treated as an io.Reader to access the file's data.
-type Reader struct {
-	r       io.Reader
-	err     error
-	pad     int64           // amount of padding (ignored) after current file entry
-	curr    numBytesReader  // reader for current file entry
-	hdrBuff [blockSize]byte // buffer to use in readHeader
-}
-
-// A numBytesReader is an io.Reader with a numBytes method, returning the number
-// of bytes remaining in the underlying encoded data.
-type numBytesReader interface {
-	io.Reader
-	numBytes() int64
-}
-
-// A regFileReader is a numBytesReader for reading file data from a tar archive.
-type regFileReader struct {
-	r  io.Reader // underlying reader
-	nb int64     // number of unread bytes for current file entry
-}
-
-// A sparseFileReader is a numBytesReader for reading sparse file data from a tar archive.
-type sparseFileReader struct {
-	rfr *regFileReader // reads the sparse-encoded file data
-	sp  []sparseEntry  // the sparse map for the file
-	pos int64          // keeps track of file position
-	tot int64          // total size of the file
-}
-
-// Keywords for GNU sparse files in a PAX extended header
-const (
-	paxGNUSparseNumBlocks = "GNU.sparse.numblocks"
-	paxGNUSparseOffset    = "GNU.sparse.offset"
-	paxGNUSparseNumBytes  = "GNU.sparse.numbytes"
-	paxGNUSparseMap       = "GNU.sparse.map"
-	paxGNUSparseName      = "GNU.sparse.name"
-	paxGNUSparseMajor     = "GNU.sparse.major"
-	paxGNUSparseMinor     = "GNU.sparse.minor"
-	paxGNUSparseSize      = "GNU.sparse.size"
-	paxGNUSparseRealSize  = "GNU.sparse.realsize"
-)
-
-// Keywords for old GNU sparse headers
-const (
-	oldGNUSparseMainHeaderOffset               = 386
-	oldGNUSparseMainHeaderIsExtendedOffset     = 482
-	oldGNUSparseMainHeaderNumEntries           = 4
-	oldGNUSparseExtendedHeaderIsExtendedOffset = 504
-	oldGNUSparseExtendedHeaderNumEntries       = 21
-	oldGNUSparseOffsetSize                     = 12
-	oldGNUSparseNumBytesSize                   = 12
-)
-
-// NewReader creates a new Reader reading from r.
-func NewReader(r io.Reader) *Reader { return &Reader{r: r} }
-
-// Next advances to the next entry in the tar archive.
-//
-// io.EOF is returned at the end of the input.
-func (tr *Reader) Next() (*Header, error) {
-	var hdr *Header
-	if tr.err == nil {
-		tr.skipUnread()
-	}
-	if tr.err != nil {
-		return hdr, tr.err
-	}
-	hdr = tr.readHeader()
-	if hdr == nil {
-		return hdr, tr.err
-	}
-	// Check for PAX/GNU header.
-	switch hdr.Typeflag {
-	case TypeXHeader:
-		//  PAX extended header
-		headers, err := parsePAX(tr)
-		if err != nil {
-			return nil, err
-		}
-		// We actually read the whole file,
-		// but this skips alignment padding
-		tr.skipUnread()
-		if tr.err != nil {
-			return nil, tr.err
-		}
-		hdr = tr.readHeader()
-		if hdr == nil {
-			return nil, tr.err
-		}
-		mergePAX(hdr, headers)
-
-		// Check for a PAX format sparse file
-		sp, err := tr.checkForGNUSparsePAXHeaders(hdr, headers)
-		if err != nil {
-			tr.err = err
-			return nil, err
-		}
-		if sp != nil {
-			// Current file is a PAX format GNU sparse file.
-			// Set the current file reader to a sparse file reader.
-			tr.curr = &sparseFileReader{rfr: tr.curr.(*regFileReader), sp: sp, tot: hdr.Size}
-		}
-		return hdr, nil
-	case TypeGNULongName:
-		// We have a GNU long name header. Its contents are the real file name.
-		realname, err := ioutil.ReadAll(tr)
-		if err != nil {
-			return nil, err
-		}
-		hdr, err := tr.Next()
-		hdr.Name = cString(realname)
-		return hdr, err
-	case TypeGNULongLink:
-		// We have a GNU long link header.
-		realname, err := ioutil.ReadAll(tr)
-		if err != nil {
-			return nil, err
-		}
-		hdr, err := tr.Next()
-		hdr.Linkname = cString(realname)
-		return hdr, err
-	}
-	return hdr, tr.err
-}
-
-// checkForGNUSparsePAXHeaders checks the PAX headers for GNU sparse headers. If they are found, then
-// this function reads the sparse map and returns it. Unknown sparse formats are ignored, causing the file to
-// be treated as a regular file.
-func (tr *Reader) checkForGNUSparsePAXHeaders(hdr *Header, headers map[string]string) ([]sparseEntry, error) {
-	var sparseFormat string
-
-	// Check for sparse format indicators
-	major, majorOk := headers[paxGNUSparseMajor]
-	minor, minorOk := headers[paxGNUSparseMinor]
-	sparseName, sparseNameOk := headers[paxGNUSparseName]
-	_, sparseMapOk := headers[paxGNUSparseMap]
-	sparseSize, sparseSizeOk := headers[paxGNUSparseSize]
-	sparseRealSize, sparseRealSizeOk := headers[paxGNUSparseRealSize]
-
-	// Identify which, if any, sparse format applies from which PAX headers are set
-	if majorOk && minorOk {
-		sparseFormat = major + "." + minor
-	} else if sparseNameOk && sparseMapOk {
-		sparseFormat = "0.1"
-	} else if sparseSizeOk {
-		sparseFormat = "0.0"
-	} else {
-		// Not a PAX format GNU sparse file.
-		return nil, nil
-	}
-
-	// Check for unknown sparse format
-	if sparseFormat != "0.0" && sparseFormat != "0.1" && sparseFormat != "1.0" {
-		return nil, nil
-	}
-
-	// Update hdr from GNU sparse PAX headers
-	if sparseNameOk {
-		hdr.Name = sparseName
-	}
-	if sparseSizeOk {
-		realSize, err := strconv.ParseInt(sparseSize, 10, 0)
-		if err != nil {
-			return nil, ErrHeader
-		}
-		hdr.Size = realSize
-	} else if sparseRealSizeOk {
-		realSize, err := strconv.ParseInt(sparseRealSize, 10, 0)
-		if err != nil {
-			return nil, ErrHeader
-		}
-		hdr.Size = realSize
-	}
-
-	// Set up the sparse map, according to the particular sparse format in use
-	var sp []sparseEntry
-	var err error
-	switch sparseFormat {
-	case "0.0", "0.1":
-		sp, err = readGNUSparseMap0x1(headers)
-	case "1.0":
-		sp, err = readGNUSparseMap1x0(tr.curr)
-	}
-	return sp, err
-}
-
-// mergePAX merges well known headers according to PAX standard.
-// In general headers with the same name as those found
-// in the header struct overwrite those found in the header
-// struct with higher precision or longer values. Esp. useful
-// for name and linkname fields.
-func mergePAX(hdr *Header, headers map[string]string) error {
-	for k, v := range headers {
-		switch k {
-		case paxPath:
-			hdr.Name = v
-		case paxLinkpath:
-			hdr.Linkname = v
-		case paxGname:
-			hdr.Gname = v
-		case paxUname:
-			hdr.Uname = v
-		case paxUid:
-			uid, err := strconv.ParseInt(v, 10, 0)
-			if err != nil {
-				return err
-			}
-			hdr.Uid = int(uid)
-		case paxGid:
-			gid, err := strconv.ParseInt(v, 10, 0)
-			if err != nil {
-				return err
-			}
-			hdr.Gid = int(gid)
-		case paxAtime:
-			t, err := parsePAXTime(v)
-			if err != nil {
-				return err
-			}
-			hdr.AccessTime = t
-		case paxMtime:
-			t, err := parsePAXTime(v)
-			if err != nil {
-				return err
-			}
-			hdr.ModTime = t
-		case paxCtime:
-			t, err := parsePAXTime(v)
-			if err != nil {
-				return err
-			}
-			hdr.ChangeTime = t
-		case paxSize:
-			size, err := strconv.ParseInt(v, 10, 0)
-			if err != nil {
-				return err
-			}
-			hdr.Size = int64(size)
-		default:
-			if strings.HasPrefix(k, paxXattr) {
-				if hdr.Xattrs == nil {
-					hdr.Xattrs = make(map[string]string)
-				}
-				hdr.Xattrs[k[len(paxXattr):]] = v
-			}
-		}
-	}
-	return nil
-}
-
-// parsePAXTime takes a string of the form %d.%d as described in
-// the PAX specification.
-func parsePAXTime(t string) (time.Time, error) {
-	buf := []byte(t)
-	pos := bytes.IndexByte(buf, '.')
-	var seconds, nanoseconds int64
-	var err error
-	if pos == -1 {
-		seconds, err = strconv.ParseInt(t, 10, 0)
-		if err != nil {
-			return time.Time{}, err
-		}
-	} else {
-		seconds, err = strconv.ParseInt(string(buf[:pos]), 10, 0)
-		if err != nil {
-			return time.Time{}, err
-		}
-		nano_buf := string(buf[pos+1:])
-		// Pad as needed before converting to a decimal.
-		// For example .030 -> .030000000 -> 30000000 nanoseconds
-		if len(nano_buf) < maxNanoSecondIntSize {
-			// Right pad
-			nano_buf += strings.Repeat("0", maxNanoSecondIntSize-len(nano_buf))
-		} else if len(nano_buf) > maxNanoSecondIntSize {
-			// Right truncate
-			nano_buf = nano_buf[:maxNanoSecondIntSize]
-		}
-		nanoseconds, err = strconv.ParseInt(string(nano_buf), 10, 0)
-		if err != nil {
-			return time.Time{}, err
-		}
-	}
-	ts := time.Unix(seconds, nanoseconds)
-	return ts, nil
-}
-
-// parsePAX parses PAX headers.
-// If an extended header (type 'x') is invalid, ErrHeader is returned
-func parsePAX(r io.Reader) (map[string]string, error) {
-	buf, err := ioutil.ReadAll(r)
-	if err != nil {
-		return nil, err
-	}
-
-	// For GNU PAX sparse format 0.0 support.
-	// This function transforms the sparse format 0.0 headers into sparse format 0.1 headers.
-	var sparseMap bytes.Buffer
-
-	headers := make(map[string]string)
-	// Each record is constructed as
-	//     "%d %s=%s\n", length, keyword, value
-	for len(buf) > 0 {
-		// or the header was empty to start with.
-		var sp int
-		// The size field ends at the first space.
-		sp = bytes.IndexByte(buf, ' ')
-		if sp == -1 {
-			return nil, ErrHeader
-		}
-		// Parse the first token as a decimal integer.
-		n, err := strconv.ParseInt(string(buf[:sp]), 10, 0)
-		if err != nil || n < 5 || int64(len(buf)) < n {
-			return nil, ErrHeader
-		}
-		// Extract everything between the decimal and the n -1 on the
-		// beginning to eat the ' ', -1 on the end to skip the newline.
-		var record []byte
-		record, buf = buf[sp+1:n-1], buf[n:]
-		// The first equals is guaranteed to mark the end of the key.
-		// Everything else is value.
-		eq := bytes.IndexByte(record, '=')
-		if eq == -1 {
-			return nil, ErrHeader
-		}
-		key, value := record[:eq], record[eq+1:]
-
-		keyStr := string(key)
-		if keyStr == paxGNUSparseOffset || keyStr == paxGNUSparseNumBytes {
-			// GNU sparse format 0.0 special key. Write to sparseMap instead of using the headers map.
-			sparseMap.Write(value)
-			sparseMap.Write([]byte{','})
-		} else {
-			// Normal key. Set the value in the headers map.
-			headers[keyStr] = string(value)
-		}
-	}
-	if sparseMap.Len() != 0 {
-		// Add sparse info to headers, chopping off the extra comma
-		sparseMap.Truncate(sparseMap.Len() - 1)
-		headers[paxGNUSparseMap] = sparseMap.String()
-	}
-	return headers, nil
-}
-
-// cString parses bytes as a NUL-terminated C-style string.
-// If a NUL byte is not found then the whole slice is returned as a string.
-func cString(b []byte) string {
-	n := 0
-	for n < len(b) && b[n] != 0 {
-		n++
-	}
-	return string(b[0:n])
-}
-
-func (tr *Reader) octal(b []byte) int64 {
-	// Check for binary format first.
-	if len(b) > 0 && b[0]&0x80 != 0 {
-		var x int64
-		for i, c := range b {
-			if i == 0 {
-				c &= 0x7f // ignore signal bit in first byte
-			}
-			x = x<<8 | int64(c)
-		}
-		return x
-	}
-
-	// Because unused fields are filled with NULs, we need
-	// to skip leading NULs. Fields may also be padded with
-	// spaces or NULs.
-	// So we remove leading and trailing NULs and spaces to
-	// be sure.
-	b = bytes.Trim(b, " \x00")
-
-	if len(b) == 0 {
-		return 0
-	}
-	x, err := strconv.ParseUint(cString(b), 8, 64)
-	if err != nil {
-		tr.err = err
-	}
-	return int64(x)
-}
-
-// skipUnread skips any unread bytes in the existing file entry, as well as any alignment padding.
-func (tr *Reader) skipUnread() {
-	nr := tr.numBytes() + tr.pad // number of bytes to skip
-	tr.curr, tr.pad = nil, 0
-	if sr, ok := tr.r.(io.Seeker); ok {
-		if _, err := sr.Seek(nr, os.SEEK_CUR); err == nil {
-			return
-		}
-	}
-	_, tr.err = io.CopyN(ioutil.Discard, tr.r, nr)
-}
-
-func (tr *Reader) verifyChecksum(header []byte) bool {
-	if tr.err != nil {
-		return false
-	}
-
-	given := tr.octal(header[148:156])
-	unsigned, signed := checksum(header)
-	return given == unsigned || given == signed
-}
-
-func (tr *Reader) readHeader() *Header {
-	header := tr.hdrBuff[:]
-	copy(header, zeroBlock)
-
-	if _, tr.err = io.ReadFull(tr.r, header); tr.err != nil {
-		return nil
-	}
-
-	// Two blocks of zero bytes marks the end of the archive.
-	if bytes.Equal(header, zeroBlock[0:blockSize]) {
-		if _, tr.err = io.ReadFull(tr.r, header); tr.err != nil {
-			return nil
-		}
-		if bytes.Equal(header, zeroBlock[0:blockSize]) {
-			tr.err = io.EOF
-		} else {
-			tr.err = ErrHeader // zero block and then non-zero block
-		}
-		return nil
-	}
-
-	if !tr.verifyChecksum(header) {
-		tr.err = ErrHeader
-		return nil
-	}
-
-	// Unpack
-	hdr := new(Header)
-	s := slicer(header)
-
-	hdr.Name = cString(s.next(100))
-	hdr.Mode = tr.octal(s.next(8))
-	hdr.Uid = int(tr.octal(s.next(8)))
-	hdr.Gid = int(tr.octal(s.next(8)))
-	hdr.Size = tr.octal(s.next(12))
-	if hdr.Size < 0 {
-		tr.err = ErrHeader
-		return nil
-	}
-	hdr.ModTime = time.Unix(tr.octal(s.next(12)), 0)
-	s.next(8) // chksum
-	hdr.Typeflag = s.next(1)[0]
-	hdr.Linkname = cString(s.next(100))
-
-	// The remainder of the header depends on the value of magic.
-	// The original (v7) version of tar had no explicit magic field,
-	// so its magic bytes, like the rest of the block, are NULs.
-	magic := string(s.next(8)) // contains version field as well.
-	var format string
-	switch {
-	case magic[:6] == "ustar\x00": // POSIX tar (1003.1-1988)
-		if string(header[508:512]) == "tar\x00" {
-			format = "star"
-		} else {
-			format = "posix"
-		}
-	case magic == "ustar  \x00": // old GNU tar
-		format = "gnu"
-	}
-
-	switch format {
-	case "posix", "gnu", "star":
-		hdr.Uname = cString(s.next(32))
-		hdr.Gname = cString(s.next(32))
-		devmajor := s.next(8)
-		devminor := s.next(8)
-		if hdr.Typeflag == TypeChar || hdr.Typeflag == TypeBlock {
-			hdr.Devmajor = tr.octal(devmajor)
-			hdr.Devminor = tr.octal(devminor)
-		}
-		var prefix string
-		switch format {
-		case "posix", "gnu":
-			prefix = cString(s.next(155))
-		case "star":
-			prefix = cString(s.next(131))
-			hdr.AccessTime = time.Unix(tr.octal(s.next(12)), 0)
-			hdr.ChangeTime = time.Unix(tr.octal(s.next(12)), 0)
-		}
-		if len(prefix) > 0 {
-			hdr.Name = prefix + "/" + hdr.Name
-		}
-	}
-
-	if tr.err != nil {
-		tr.err = ErrHeader
-		return nil
-	}
-
-	// Maximum value of hdr.Size is 64 GB (12 octal digits),
-	// so there's no risk of int64 overflowing.
-	nb := int64(hdr.Size)
-	tr.pad = -nb & (blockSize - 1) // blockSize is a power of two
-
-	// Set the current file reader.
-	tr.curr = &regFileReader{r: tr.r, nb: nb}
-
-	// Check for old GNU sparse format entry.
-	if hdr.Typeflag == TypeGNUSparse {
-		// Get the real size of the file.
-		hdr.Size = tr.octal(header[483:495])
-
-		// Read the sparse map.
-		sp := tr.readOldGNUSparseMap(header)
-		if tr.err != nil {
-			return nil
-		}
-		// Current file is a GNU sparse file. Update the current file reader.
-		tr.curr = &sparseFileReader{rfr: tr.curr.(*regFileReader), sp: sp, tot: hdr.Size}
-	}
-
-	return hdr
-}
-
-// A sparseEntry holds a single entry in a sparse file's sparse map.
-// A sparse entry indicates the offset and size in a sparse file of a
-// block of data.
-type sparseEntry struct {
-	offset   int64
-	numBytes int64
-}
-
-// readOldGNUSparseMap reads the sparse map as stored in the old GNU sparse format.
-// The sparse map is stored in the tar header if it's small enough. If it's larger than four entries,
-// then one or more extension headers are used to store the rest of the sparse map.
-func (tr *Reader) readOldGNUSparseMap(header []byte) []sparseEntry {
-	isExtended := header[oldGNUSparseMainHeaderIsExtendedOffset] != 0
-	spCap := oldGNUSparseMainHeaderNumEntries
-	if isExtended {
-		spCap += oldGNUSparseExtendedHeaderNumEntries
-	}
-	sp := make([]sparseEntry, 0, spCap)
-	s := slicer(header[oldGNUSparseMainHeaderOffset:])
-
-	// Read the four entries from the main tar header
-	for i := 0; i < oldGNUSparseMainHeaderNumEntries; i++ {
-		offset := tr.octal(s.next(oldGNUSparseOffsetSize))
-		numBytes := tr.octal(s.next(oldGNUSparseNumBytesSize))
-		if tr.err != nil {
-			tr.err = ErrHeader
-			return nil
-		}
-		if offset == 0 && numBytes == 0 {
-			break
-		}
-		sp = append(sp, sparseEntry{offset: offset, numBytes: numBytes})
-	}
-
-	for isExtended {
-		// There are more entries. Read an extension header and parse its entries.
-		sparseHeader := make([]byte, blockSize)
-		if _, tr.err = io.ReadFull(tr.r, sparseHeader); tr.err != nil {
-			return nil
-		}
-		isExtended = sparseHeader[oldGNUSparseExtendedHeaderIsExtendedOffset] != 0
-		s = slicer(sparseHeader)
-		for i := 0; i < oldGNUSparseExtendedHeaderNumEntries; i++ {
-			offset := tr.octal(s.next(oldGNUSparseOffsetSize))
-			numBytes := tr.octal(s.next(oldGNUSparseNumBytesSize))
-			if tr.err != nil {
-				tr.err = ErrHeader
-				return nil
-			}
-			if offset == 0 && numBytes == 0 {
-				break
-			}
-			sp = append(sp, sparseEntry{offset: offset, numBytes: numBytes})
-		}
-	}
-	return sp
-}
-
-// readGNUSparseMap1x0 reads the sparse map as stored in GNU's PAX sparse format version 1.0.
-// The sparse map is stored just before the file data and padded out to the nearest block boundary.
-func readGNUSparseMap1x0(r io.Reader) ([]sparseEntry, error) {
-	buf := make([]byte, 2*blockSize)
-	sparseHeader := buf[:blockSize]
-
-	// readDecimal is a helper function to read a decimal integer from the sparse map
-	// while making sure to read from the file in blocks of size blockSize
-	readDecimal := func() (int64, error) {
-		// Look for newline
-		nl := bytes.IndexByte(sparseHeader, '\n')
-		if nl == -1 {
-			if len(sparseHeader) >= blockSize {
-				// This is an error
-				return 0, ErrHeader
-			}
-			oldLen := len(sparseHeader)
-			newLen := oldLen + blockSize
-			if cap(sparseHeader) < newLen {
-				// There's more header, but we need to make room for the next block
-				copy(buf, sparseHeader)
-				sparseHeader = buf[:newLen]
-			} else {
-				// There's more header, and we can just reslice
-				sparseHeader = sparseHeader[:newLen]
-			}
-
-			// Now that sparseHeader is large enough, read next block
-			if _, err := io.ReadFull(r, sparseHeader[oldLen:newLen]); err != nil {
-				return 0, err
-			}
-
-			// Look for a newline in the new data
-			nl = bytes.IndexByte(sparseHeader[oldLen:newLen], '\n')
-			if nl == -1 {
-				// This is an error
-				return 0, ErrHeader
-			}
-			nl += oldLen // We want the position from the beginning
-		}
-		// Now that we've found a newline, read a number
-		n, err := strconv.ParseInt(string(sparseHeader[:nl]), 10, 0)
-		if err != nil {
-			return 0, ErrHeader
-		}
-
-		// Update sparseHeader to consume this number
-		sparseHeader = sparseHeader[nl+1:]
-		return n, nil
-	}
-
-	// Read the first block
-	if _, err := io.ReadFull(r, sparseHeader); err != nil {
-		return nil, err
-	}
-
-	// The first line contains the number of entries
-	numEntries, err := readDecimal()
-	if err != nil {
-		return nil, err
-	}
-
-	// Read all the entries
-	sp := make([]sparseEntry, 0, numEntries)
-	for i := int64(0); i < numEntries; i++ {
-		// Read the offset
-		offset, err := readDecimal()
-		if err != nil {
-			return nil, err
-		}
-		// Read numBytes
-		numBytes, err := readDecimal()
-		if err != nil {
-			return nil, err
-		}
-
-		sp = append(sp, sparseEntry{offset: offset, numBytes: numBytes})
-	}
-
-	return sp, nil
-}
-
-// readGNUSparseMap0x1 reads the sparse map as stored in GNU's PAX sparse format version 0.1.
-// The sparse map is stored in the PAX headers.
-func readGNUSparseMap0x1(headers map[string]string) ([]sparseEntry, error) {
-	// Get number of entries
-	numEntriesStr, ok := headers[paxGNUSparseNumBlocks]
-	if !ok {
-		return nil, ErrHeader
-	}
-	numEntries, err := strconv.ParseInt(numEntriesStr, 10, 0)
-	if err != nil {
-		return nil, ErrHeader
-	}
-
-	sparseMap := strings.Split(headers[paxGNUSparseMap], ",")
-
-	// There should be two numbers in sparseMap for each entry
-	if int64(len(sparseMap)) != 2*numEntries {
-		return nil, ErrHeader
-	}
-
-	// Loop through the entries in the sparse map
-	sp := make([]sparseEntry, 0, numEntries)
-	for i := int64(0); i < numEntries; i++ {
-		offset, err := strconv.ParseInt(sparseMap[2*i], 10, 0)
-		if err != nil {
-			return nil, ErrHeader
-		}
-		numBytes, err := strconv.ParseInt(sparseMap[2*i+1], 10, 0)
-		if err != nil {
-			return nil, ErrHeader
-		}
-		sp = append(sp, sparseEntry{offset: offset, numBytes: numBytes})
-	}
-
-	return sp, nil
-}
-
-// numBytes returns the number of bytes left to read in the current file's entry
-// in the tar archive, or 0 if there is no current file.
-func (tr *Reader) numBytes() int64 {
-	if tr.curr == nil {
-		// No current file, so no bytes
-		return 0
-	}
-	return tr.curr.numBytes()
-}
-
-// Read reads from the current entry in the tar archive.
-// It returns 0, io.EOF when it reaches the end of that entry,
-// until Next is called to advance to the next entry.
-func (tr *Reader) Read(b []byte) (n int, err error) {
-	if tr.curr == nil {
-		return 0, io.EOF
-	}
-	n, err = tr.curr.Read(b)
-	if err != nil && err != io.EOF {
-		tr.err = err
-	}
-	return
-}
-
-func (rfr *regFileReader) Read(b []byte) (n int, err error) {
-	if rfr.nb == 0 {
-		// file consumed
-		return 0, io.EOF
-	}
-	if int64(len(b)) > rfr.nb {
-		b = b[0:rfr.nb]
-	}
-	n, err = rfr.r.Read(b)
-	rfr.nb -= int64(n)
-
-	if err == io.EOF && rfr.nb > 0 {
-		err = io.ErrUnexpectedEOF
-	}
-	return
-}
-
-// numBytes returns the number of bytes left to read in the file's data in the tar archive.
-func (rfr *regFileReader) numBytes() int64 {
-	return rfr.nb
-}
-
-// readHole reads a sparse file hole ending at offset toOffset
-func (sfr *sparseFileReader) readHole(b []byte, toOffset int64) int {
-	n64 := toOffset - sfr.pos
-	if n64 > int64(len(b)) {
-		n64 = int64(len(b))
-	}
-	n := int(n64)
-	for i := 0; i < n; i++ {
-		b[i] = 0
-	}
-	sfr.pos += n64
-	return n
-}
-
-// Read reads the sparse file data in expanded form.
-func (sfr *sparseFileReader) Read(b []byte) (n int, err error) {
-	if len(sfr.sp) == 0 {
-		// No more data fragments to read from.
-		if sfr.pos < sfr.tot {
-			// We're in the last hole
-			n = sfr.readHole(b, sfr.tot)
-			return
-		}
-		// Otherwise, we're at the end of the file
-		return 0, io.EOF
-	}
-	if sfr.tot < sfr.sp[0].offset {
-		return 0, io.ErrUnexpectedEOF
-	}
-	if sfr.pos < sfr.sp[0].offset {
-		// We're in a hole
-		n = sfr.readHole(b, sfr.sp[0].offset)
-		return
-	}
-
-	// We're not in a hole, so we'll read from the next data fragment
-	posInFragment := sfr.pos - sfr.sp[0].offset
-	bytesLeft := sfr.sp[0].numBytes - posInFragment
-	if int64(len(b)) > bytesLeft {
-		b = b[0:bytesLeft]
-	}
-
-	n, err = sfr.rfr.Read(b)
-	sfr.pos += int64(n)
-
-	if int64(n) == bytesLeft {
-		// We're done with this fragment
-		sfr.sp = sfr.sp[1:]
-	}
-
-	if err == io.EOF && sfr.pos < sfr.tot {
-		// We reached the end of the last fragment's data, but there's a final hole
-		err = nil
-	}
-	return
-}
-
-// numBytes returns the number of bytes left to read in the sparse file's
-// sparse-encoded data in the tar archive.
-func (sfr *sparseFileReader) numBytes() int64 {
-	return sfr.rfr.nb
-}
diff --git a/third_party/gofrontend/libgo/go/archive/tar/reader_test.go b/third_party/gofrontend/libgo/go/archive/tar/reader_test.go
deleted file mode 100644
index da01f26..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/reader_test.go
+++ /dev/null
@@ -1,798 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tar
-
-import (
-	"bytes"
-	"crypto/md5"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"os"
-	"reflect"
-	"strings"
-	"testing"
-	"time"
-)
-
-type untarTest struct {
-	file    string
-	headers []*Header
-	cksums  []string
-}
-
-var gnuTarTest = &untarTest{
-	file: "testdata/gnu.tar",
-	headers: []*Header{
-		{
-			Name:     "small.txt",
-			Mode:     0640,
-			Uid:      73025,
-			Gid:      5000,
-			Size:     5,
-			ModTime:  time.Unix(1244428340, 0),
-			Typeflag: '0',
-			Uname:    "dsymonds",
-			Gname:    "eng",
-		},
-		{
-			Name:     "small2.txt",
-			Mode:     0640,
-			Uid:      73025,
-			Gid:      5000,
-			Size:     11,
-			ModTime:  time.Unix(1244436044, 0),
-			Typeflag: '0',
-			Uname:    "dsymonds",
-			Gname:    "eng",
-		},
-	},
-	cksums: []string{
-		"e38b27eaccb4391bdec553a7f3ae6b2f",
-		"c65bd2e50a56a2138bf1716f2fd56fe9",
-	},
-}
-
-var sparseTarTest = &untarTest{
-	file: "testdata/sparse-formats.tar",
-	headers: []*Header{
-		{
-			Name:     "sparse-gnu",
-			Mode:     420,
-			Uid:      1000,
-			Gid:      1000,
-			Size:     200,
-			ModTime:  time.Unix(1392395740, 0),
-			Typeflag: 0x53,
-			Linkname: "",
-			Uname:    "david",
-			Gname:    "david",
-			Devmajor: 0,
-			Devminor: 0,
-		},
-		{
-			Name:     "sparse-posix-0.0",
-			Mode:     420,
-			Uid:      1000,
-			Gid:      1000,
-			Size:     200,
-			ModTime:  time.Unix(1392342187, 0),
-			Typeflag: 0x30,
-			Linkname: "",
-			Uname:    "david",
-			Gname:    "david",
-			Devmajor: 0,
-			Devminor: 0,
-		},
-		{
-			Name:     "sparse-posix-0.1",
-			Mode:     420,
-			Uid:      1000,
-			Gid:      1000,
-			Size:     200,
-			ModTime:  time.Unix(1392340456, 0),
-			Typeflag: 0x30,
-			Linkname: "",
-			Uname:    "david",
-			Gname:    "david",
-			Devmajor: 0,
-			Devminor: 0,
-		},
-		{
-			Name:     "sparse-posix-1.0",
-			Mode:     420,
-			Uid:      1000,
-			Gid:      1000,
-			Size:     200,
-			ModTime:  time.Unix(1392337404, 0),
-			Typeflag: 0x30,
-			Linkname: "",
-			Uname:    "david",
-			Gname:    "david",
-			Devmajor: 0,
-			Devminor: 0,
-		},
-		{
-			Name:     "end",
-			Mode:     420,
-			Uid:      1000,
-			Gid:      1000,
-			Size:     4,
-			ModTime:  time.Unix(1392398319, 0),
-			Typeflag: 0x30,
-			Linkname: "",
-			Uname:    "david",
-			Gname:    "david",
-			Devmajor: 0,
-			Devminor: 0,
-		},
-	},
-	cksums: []string{
-		"6f53234398c2449fe67c1812d993012f",
-		"6f53234398c2449fe67c1812d993012f",
-		"6f53234398c2449fe67c1812d993012f",
-		"6f53234398c2449fe67c1812d993012f",
-		"b0061974914468de549a2af8ced10316",
-	},
-}
-
-var untarTests = []*untarTest{
-	gnuTarTest,
-	sparseTarTest,
-	{
-		file: "testdata/star.tar",
-		headers: []*Header{
-			{
-				Name:       "small.txt",
-				Mode:       0640,
-				Uid:        73025,
-				Gid:        5000,
-				Size:       5,
-				ModTime:    time.Unix(1244592783, 0),
-				Typeflag:   '0',
-				Uname:      "dsymonds",
-				Gname:      "eng",
-				AccessTime: time.Unix(1244592783, 0),
-				ChangeTime: time.Unix(1244592783, 0),
-			},
-			{
-				Name:       "small2.txt",
-				Mode:       0640,
-				Uid:        73025,
-				Gid:        5000,
-				Size:       11,
-				ModTime:    time.Unix(1244592783, 0),
-				Typeflag:   '0',
-				Uname:      "dsymonds",
-				Gname:      "eng",
-				AccessTime: time.Unix(1244592783, 0),
-				ChangeTime: time.Unix(1244592783, 0),
-			},
-		},
-	},
-	{
-		file: "testdata/v7.tar",
-		headers: []*Header{
-			{
-				Name:     "small.txt",
-				Mode:     0444,
-				Uid:      73025,
-				Gid:      5000,
-				Size:     5,
-				ModTime:  time.Unix(1244593104, 0),
-				Typeflag: '\x00',
-			},
-			{
-				Name:     "small2.txt",
-				Mode:     0444,
-				Uid:      73025,
-				Gid:      5000,
-				Size:     11,
-				ModTime:  time.Unix(1244593104, 0),
-				Typeflag: '\x00',
-			},
-		},
-	},
-	{
-		file: "testdata/pax.tar",
-		headers: []*Header{
-			{
-				Name:       "a/123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",
-				Mode:       0664,
-				Uid:        1000,
-				Gid:        1000,
-				Uname:      "shane",
-				Gname:      "shane",
-				Size:       7,
-				ModTime:    time.Unix(1350244992, 23960108),
-				ChangeTime: time.Unix(1350244992, 23960108),
-				AccessTime: time.Unix(1350244992, 23960108),
-				Typeflag:   TypeReg,
-			},
-			{
-				Name:       "a/b",
-				Mode:       0777,
-				Uid:        1000,
-				Gid:        1000,
-				Uname:      "shane",
-				Gname:      "shane",
-				Size:       0,
-				ModTime:    time.Unix(1350266320, 910238425),
-				ChangeTime: time.Unix(1350266320, 910238425),
-				AccessTime: time.Unix(1350266320, 910238425),
-				Typeflag:   TypeSymlink,
-				Linkname:   "123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100",
-			},
-		},
-	},
-	{
-		file: "testdata/nil-uid.tar", // golang.org/issue/5290
-		headers: []*Header{
-			{
-				Name:     "P1050238.JPG.log",
-				Mode:     0664,
-				Uid:      0,
-				Gid:      0,
-				Size:     14,
-				ModTime:  time.Unix(1365454838, 0),
-				Typeflag: TypeReg,
-				Linkname: "",
-				Uname:    "eyefi",
-				Gname:    "eyefi",
-				Devmajor: 0,
-				Devminor: 0,
-			},
-		},
-	},
-	{
-		file: "testdata/xattrs.tar",
-		headers: []*Header{
-			{
-				Name:       "small.txt",
-				Mode:       0644,
-				Uid:        1000,
-				Gid:        10,
-				Size:       5,
-				ModTime:    time.Unix(1386065770, 448252320),
-				Typeflag:   '0',
-				Uname:      "alex",
-				Gname:      "wheel",
-				AccessTime: time.Unix(1389782991, 419875220),
-				ChangeTime: time.Unix(1389782956, 794414986),
-				Xattrs: map[string]string{
-					"user.key":  "value",
-					"user.key2": "value2",
-					// Interestingly, selinux encodes the terminating null inside the xattr
-					"security.selinux": "unconfined_u:object_r:default_t:s0\x00",
-				},
-			},
-			{
-				Name:       "small2.txt",
-				Mode:       0644,
-				Uid:        1000,
-				Gid:        10,
-				Size:       11,
-				ModTime:    time.Unix(1386065770, 449252304),
-				Typeflag:   '0',
-				Uname:      "alex",
-				Gname:      "wheel",
-				AccessTime: time.Unix(1389782991, 419875220),
-				ChangeTime: time.Unix(1386065770, 449252304),
-				Xattrs: map[string]string{
-					"security.selinux": "unconfined_u:object_r:default_t:s0\x00",
-				},
-			},
-		},
-	},
-}
-
-func TestReader(t *testing.T) {
-testLoop:
-	for i, test := range untarTests {
-		f, err := os.Open(test.file)
-		if err != nil {
-			t.Errorf("test %d: Unexpected error: %v", i, err)
-			continue
-		}
-		defer f.Close()
-		tr := NewReader(f)
-		for j, header := range test.headers {
-			hdr, err := tr.Next()
-			if err != nil || hdr == nil {
-				t.Errorf("test %d, entry %d: Didn't get entry: %v", i, j, err)
-				f.Close()
-				continue testLoop
-			}
-			if !reflect.DeepEqual(*hdr, *header) {
-				t.Errorf("test %d, entry %d: Incorrect header:\nhave %+v\nwant %+v",
-					i, j, *hdr, *header)
-			}
-		}
-		hdr, err := tr.Next()
-		if err == io.EOF {
-			continue testLoop
-		}
-		if hdr != nil || err != nil {
-			t.Errorf("test %d: Unexpected entry or error: hdr=%v err=%v", i, hdr, err)
-		}
-	}
-}
-
-func TestPartialRead(t *testing.T) {
-	f, err := os.Open("testdata/gnu.tar")
-	if err != nil {
-		t.Fatalf("Unexpected error: %v", err)
-	}
-	defer f.Close()
-
-	tr := NewReader(f)
-
-	// Read the first four bytes; Next() should skip the last byte.
-	hdr, err := tr.Next()
-	if err != nil || hdr == nil {
-		t.Fatalf("Didn't get first file: %v", err)
-	}
-	buf := make([]byte, 4)
-	if _, err := io.ReadFull(tr, buf); err != nil {
-		t.Fatalf("Unexpected error: %v", err)
-	}
-	if expected := []byte("Kilt"); !bytes.Equal(buf, expected) {
-		t.Errorf("Contents = %v, want %v", buf, expected)
-	}
-
-	// Second file
-	hdr, err = tr.Next()
-	if err != nil || hdr == nil {
-		t.Fatalf("Didn't get second file: %v", err)
-	}
-	buf = make([]byte, 6)
-	if _, err := io.ReadFull(tr, buf); err != nil {
-		t.Fatalf("Unexpected error: %v", err)
-	}
-	if expected := []byte("Google"); !bytes.Equal(buf, expected) {
-		t.Errorf("Contents = %v, want %v", buf, expected)
-	}
-}
-
-func TestIncrementalRead(t *testing.T) {
-	test := gnuTarTest
-	f, err := os.Open(test.file)
-	if err != nil {
-		t.Fatalf("Unexpected error: %v", err)
-	}
-	defer f.Close()
-
-	tr := NewReader(f)
-
-	headers := test.headers
-	cksums := test.cksums
-	nread := 0
-
-	// loop over all files
-	for ; ; nread++ {
-		hdr, err := tr.Next()
-		if hdr == nil || err == io.EOF {
-			break
-		}
-
-		// check the header
-		if !reflect.DeepEqual(*hdr, *headers[nread]) {
-			t.Errorf("Incorrect header:\nhave %+v\nwant %+v",
-				*hdr, headers[nread])
-		}
-
-		// read file contents in little chunks EOF,
-		// checksumming all the way
-		h := md5.New()
-		rdbuf := make([]uint8, 8)
-		for {
-			nr, err := tr.Read(rdbuf)
-			if err == io.EOF {
-				break
-			}
-			if err != nil {
-				t.Errorf("Read: unexpected error %v\n", err)
-				break
-			}
-			h.Write(rdbuf[0:nr])
-		}
-		// verify checksum
-		have := fmt.Sprintf("%x", h.Sum(nil))
-		want := cksums[nread]
-		if want != have {
-			t.Errorf("Bad checksum on file %s:\nhave %+v\nwant %+v", hdr.Name, have, want)
-		}
-	}
-	if nread != len(headers) {
-		t.Errorf("Didn't process all files\nexpected: %d\nprocessed %d\n", len(headers), nread)
-	}
-}
-
-func TestNonSeekable(t *testing.T) {
-	test := gnuTarTest
-	f, err := os.Open(test.file)
-	if err != nil {
-		t.Fatalf("Unexpected error: %v", err)
-	}
-	defer f.Close()
-
-	type readerOnly struct {
-		io.Reader
-	}
-	tr := NewReader(readerOnly{f})
-	nread := 0
-
-	for ; ; nread++ {
-		_, err := tr.Next()
-		if err == io.EOF {
-			break
-		}
-		if err != nil {
-			t.Fatalf("Unexpected error: %v", err)
-		}
-	}
-
-	if nread != len(test.headers) {
-		t.Errorf("Didn't process all files\nexpected: %d\nprocessed %d\n", len(test.headers), nread)
-	}
-}
-
-func TestParsePAXHeader(t *testing.T) {
-	paxTests := [][3]string{
-		{"a", "a=name", "10 a=name\n"}, // Test case involving multiple acceptable lengths
-		{"a", "a=name", "9 a=name\n"},  // Test case involving multiple acceptable length
-		{"mtime", "mtime=1350244992.023960108", "30 mtime=1350244992.023960108\n"}}
-	for _, test := range paxTests {
-		key, expected, raw := test[0], test[1], test[2]
-		reader := bytes.NewReader([]byte(raw))
-		headers, err := parsePAX(reader)
-		if err != nil {
-			t.Errorf("Couldn't parse correctly formatted headers: %v", err)
-			continue
-		}
-		if strings.EqualFold(headers[key], expected) {
-			t.Errorf("mtime header incorrectly parsed: got %s, wanted %s", headers[key], expected)
-			continue
-		}
-		trailer := make([]byte, 100)
-		n, err := reader.Read(trailer)
-		if err != io.EOF || n != 0 {
-			t.Error("Buffer wasn't consumed")
-		}
-	}
-	badHeaderTests := [][]byte{
-		[]byte("3 somelongkey=\n"),
-		[]byte("50 tooshort=\n"),
-	}
-	for _, test := range badHeaderTests {
-		if _, err := parsePAX(bytes.NewReader(test)); err != ErrHeader {
-			t.Fatal("Unexpected success when parsing bad header")
-		}
-	}
-}
-
-func TestParsePAXTime(t *testing.T) {
-	// Some valid PAX time values
-	timestamps := map[string]time.Time{
-		"1350244992.023960108":  time.Unix(1350244992, 23960108), // The common case
-		"1350244992.02396010":   time.Unix(1350244992, 23960100), // Lower precision value
-		"1350244992.0239601089": time.Unix(1350244992, 23960108), // Higher precision value
-		"1350244992":            time.Unix(1350244992, 0),        // Low precision value
-	}
-	for input, expected := range timestamps {
-		ts, err := parsePAXTime(input)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if !ts.Equal(expected) {
-			t.Fatalf("Time parsing failure %s %s", ts, expected)
-		}
-	}
-}
-
-func TestMergePAX(t *testing.T) {
-	hdr := new(Header)
-	// Test a string, integer, and time based value.
-	headers := map[string]string{
-		"path":  "a/b/c",
-		"uid":   "1000",
-		"mtime": "1350244992.023960108",
-	}
-	err := mergePAX(hdr, headers)
-	if err != nil {
-		t.Fatal(err)
-	}
-	want := &Header{
-		Name:    "a/b/c",
-		Uid:     1000,
-		ModTime: time.Unix(1350244992, 23960108),
-	}
-	if !reflect.DeepEqual(hdr, want) {
-		t.Errorf("incorrect merge: got %+v, want %+v", hdr, want)
-	}
-}
-
-func TestSparseEndToEnd(t *testing.T) {
-	test := sparseTarTest
-	f, err := os.Open(test.file)
-	if err != nil {
-		t.Fatalf("Unexpected error: %v", err)
-	}
-	defer f.Close()
-
-	tr := NewReader(f)
-
-	headers := test.headers
-	cksums := test.cksums
-	nread := 0
-
-	// loop over all files
-	for ; ; nread++ {
-		hdr, err := tr.Next()
-		if hdr == nil || err == io.EOF {
-			break
-		}
-
-		// check the header
-		if !reflect.DeepEqual(*hdr, *headers[nread]) {
-			t.Errorf("Incorrect header:\nhave %+v\nwant %+v",
-				*hdr, headers[nread])
-		}
-
-		// read and checksum the file data
-		h := md5.New()
-		_, err = io.Copy(h, tr)
-		if err != nil {
-			t.Fatalf("Unexpected error: %v", err)
-		}
-
-		// verify checksum
-		have := fmt.Sprintf("%x", h.Sum(nil))
-		want := cksums[nread]
-		if want != have {
-			t.Errorf("Bad checksum on file %s:\nhave %+v\nwant %+v", hdr.Name, have, want)
-		}
-	}
-	if nread != len(headers) {
-		t.Errorf("Didn't process all files\nexpected: %d\nprocessed %d\n", len(headers), nread)
-	}
-}
-
-type sparseFileReadTest struct {
-	sparseData []byte
-	sparseMap  []sparseEntry
-	realSize   int64
-	expected   []byte
-}
-
-var sparseFileReadTests = []sparseFileReadTest{
-	{
-		sparseData: []byte("abcde"),
-		sparseMap: []sparseEntry{
-			{offset: 0, numBytes: 2},
-			{offset: 5, numBytes: 3},
-		},
-		realSize: 8,
-		expected: []byte("ab\x00\x00\x00cde"),
-	},
-	{
-		sparseData: []byte("abcde"),
-		sparseMap: []sparseEntry{
-			{offset: 0, numBytes: 2},
-			{offset: 5, numBytes: 3},
-		},
-		realSize: 10,
-		expected: []byte("ab\x00\x00\x00cde\x00\x00"),
-	},
-	{
-		sparseData: []byte("abcde"),
-		sparseMap: []sparseEntry{
-			{offset: 1, numBytes: 3},
-			{offset: 6, numBytes: 2},
-		},
-		realSize: 8,
-		expected: []byte("\x00abc\x00\x00de"),
-	},
-	{
-		sparseData: []byte("abcde"),
-		sparseMap: []sparseEntry{
-			{offset: 1, numBytes: 3},
-			{offset: 6, numBytes: 2},
-		},
-		realSize: 10,
-		expected: []byte("\x00abc\x00\x00de\x00\x00"),
-	},
-	{
-		sparseData: []byte(""),
-		sparseMap:  nil,
-		realSize:   2,
-		expected:   []byte("\x00\x00"),
-	},
-}
-
-func TestSparseFileReader(t *testing.T) {
-	for i, test := range sparseFileReadTests {
-		r := bytes.NewReader(test.sparseData)
-		nb := int64(r.Len())
-		sfr := &sparseFileReader{
-			rfr: &regFileReader{r: r, nb: nb},
-			sp:  test.sparseMap,
-			pos: 0,
-			tot: test.realSize,
-		}
-		if sfr.numBytes() != nb {
-			t.Errorf("test %d: Before reading, sfr.numBytes() = %d, want %d", i, sfr.numBytes(), nb)
-		}
-		buf, err := ioutil.ReadAll(sfr)
-		if err != nil {
-			t.Errorf("test %d: Unexpected error: %v", i, err)
-		}
-		if e := test.expected; !bytes.Equal(buf, e) {
-			t.Errorf("test %d: Contents = %v, want %v", i, buf, e)
-		}
-		if sfr.numBytes() != 0 {
-			t.Errorf("test %d: After draining the reader, numBytes() was nonzero", i)
-		}
-	}
-}
-
-func TestSparseIncrementalRead(t *testing.T) {
-	sparseMap := []sparseEntry{{10, 2}}
-	sparseData := []byte("Go")
-	expected := "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Go\x00\x00\x00\x00\x00\x00\x00\x00"
-
-	r := bytes.NewReader(sparseData)
-	nb := int64(r.Len())
-	sfr := &sparseFileReader{
-		rfr: &regFileReader{r: r, nb: nb},
-		sp:  sparseMap,
-		pos: 0,
-		tot: int64(len(expected)),
-	}
-
-	// We'll read the data 6 bytes at a time, with a hole of size 10 at
-	// the beginning and one of size 8 at the end.
-	var outputBuf bytes.Buffer
-	buf := make([]byte, 6)
-	for {
-		n, err := sfr.Read(buf)
-		if err == io.EOF {
-			break
-		}
-		if err != nil {
-			t.Errorf("Read: unexpected error %v\n", err)
-		}
-		if n > 0 {
-			_, err := outputBuf.Write(buf[:n])
-			if err != nil {
-				t.Errorf("Write: unexpected error %v\n", err)
-			}
-		}
-	}
-	got := outputBuf.String()
-	if got != expected {
-		t.Errorf("Contents = %v, want %v", got, expected)
-	}
-}
-
-func TestReadGNUSparseMap0x1(t *testing.T) {
-	headers := map[string]string{
-		paxGNUSparseNumBlocks: "4",
-		paxGNUSparseMap:       "0,5,10,5,20,5,30,5",
-	}
-	expected := []sparseEntry{
-		{offset: 0, numBytes: 5},
-		{offset: 10, numBytes: 5},
-		{offset: 20, numBytes: 5},
-		{offset: 30, numBytes: 5},
-	}
-
-	sp, err := readGNUSparseMap0x1(headers)
-	if err != nil {
-		t.Errorf("Unexpected error: %v", err)
-	}
-	if !reflect.DeepEqual(sp, expected) {
-		t.Errorf("Incorrect sparse map: got %v, wanted %v", sp, expected)
-	}
-}
-
-func TestReadGNUSparseMap1x0(t *testing.T) {
-	// This test uses lots of holes so the sparse header takes up more than two blocks
-	numEntries := 100
-	expected := make([]sparseEntry, 0, numEntries)
-	sparseMap := new(bytes.Buffer)
-
-	fmt.Fprintf(sparseMap, "%d\n", numEntries)
-	for i := 0; i < numEntries; i++ {
-		offset := int64(2048 * i)
-		numBytes := int64(1024)
-		expected = append(expected, sparseEntry{offset: offset, numBytes: numBytes})
-		fmt.Fprintf(sparseMap, "%d\n%d\n", offset, numBytes)
-	}
-
-	// Make the header the smallest multiple of blockSize that fits the sparseMap
-	headerBlocks := (sparseMap.Len() + blockSize - 1) / blockSize
-	bufLen := blockSize * headerBlocks
-	buf := make([]byte, bufLen)
-	copy(buf, sparseMap.Bytes())
-
-	// Get an reader to read the sparse map
-	r := bytes.NewReader(buf)
-
-	// Read the sparse map
-	sp, err := readGNUSparseMap1x0(r)
-	if err != nil {
-		t.Errorf("Unexpected error: %v", err)
-	}
-	if !reflect.DeepEqual(sp, expected) {
-		t.Errorf("Incorrect sparse map: got %v, wanted %v", sp, expected)
-	}
-}
-
-func TestUninitializedRead(t *testing.T) {
-	test := gnuTarTest
-	f, err := os.Open(test.file)
-	if err != nil {
-		t.Fatalf("Unexpected error: %v", err)
-	}
-	defer f.Close()
-
-	tr := NewReader(f)
-	_, err = tr.Read([]byte{})
-	if err == nil || err != io.EOF {
-		t.Errorf("Unexpected error: %v, wanted %v", err, io.EOF)
-	}
-
-}
-
-// Negative header size should not cause panic.
-// Issues 10959 and 10960.
-func TestNegativeHdrSize(t *testing.T) {
-	f, err := os.Open("testdata/neg-size.tar")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer f.Close()
-	r := NewReader(f)
-	_, err = r.Next()
-	if err != ErrHeader {
-		t.Error("want ErrHeader, got", err)
-	}
-	io.Copy(ioutil.Discard, r)
-}
-
-// This used to hang in (*sparseFileReader).readHole due to missing
-// verification of sparse offsets against file size.
-func TestIssue10968(t *testing.T) {
-	f, err := os.Open("testdata/issue10968.tar")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer f.Close()
-	r := NewReader(f)
-	_, err = r.Next()
-	if err != nil {
-		t.Fatal(err)
-	}
-	_, err = io.Copy(ioutil.Discard, r)
-	if err != io.ErrUnexpectedEOF {
-		t.Fatalf("expected %q, got %q", io.ErrUnexpectedEOF, err)
-	}
-}
-
-// Do not panic if there are errors in header blocks after the pax header.
-// Issue 11169
-func TestIssue11169(t *testing.T) {
-	f, err := os.Open("testdata/issue11169.tar")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer f.Close()
-	r := NewReader(f)
-	_, err = r.Next()
-	if err == nil {
-		t.Fatal("Unexpected success")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/archive/tar/stat_atim.go b/third_party/gofrontend/libgo/go/archive/tar/stat_atim.go
deleted file mode 100644
index cf9cc79..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/stat_atim.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build linux dragonfly openbsd solaris
-
-package tar
-
-import (
-	"syscall"
-	"time"
-)
-
-func statAtime(st *syscall.Stat_t) time.Time {
-	return time.Unix(st.Atim.Unix())
-}
-
-func statCtime(st *syscall.Stat_t) time.Time {
-	return time.Unix(st.Ctim.Unix())
-}
diff --git a/third_party/gofrontend/libgo/go/archive/tar/stat_atimespec.go b/third_party/gofrontend/libgo/go/archive/tar/stat_atimespec.go
deleted file mode 100644
index 6f17dbe..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/stat_atimespec.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin freebsd netbsd
-
-package tar
-
-import (
-	"syscall"
-	"time"
-)
-
-func statAtime(st *syscall.Stat_t) time.Time {
-	return time.Unix(st.Atimespec.Unix())
-}
-
-func statCtime(st *syscall.Stat_t) time.Time {
-	return time.Unix(st.Ctimespec.Unix())
-}
diff --git a/third_party/gofrontend/libgo/go/archive/tar/stat_unix.go b/third_party/gofrontend/libgo/go/archive/tar/stat_unix.go
deleted file mode 100644
index cb843db..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/stat_unix.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build linux darwin dragonfly freebsd openbsd netbsd solaris
-
-package tar
-
-import (
-	"os"
-	"syscall"
-)
-
-func init() {
-	sysStat = statUnix
-}
-
-func statUnix(fi os.FileInfo, h *Header) error {
-	sys, ok := fi.Sys().(*syscall.Stat_t)
-	if !ok {
-		return nil
-	}
-	h.Uid = int(sys.Uid)
-	h.Gid = int(sys.Gid)
-	// TODO(bradfitz): populate username & group.  os/user
-	// doesn't cache LookupId lookups, and lacks group
-	// lookup functions.
-	h.AccessTime = statAtime(sys)
-	h.ChangeTime = statCtime(sys)
-	// TODO(bradfitz): major/minor device numbers?
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/archive/tar/tar_test.go b/third_party/gofrontend/libgo/go/archive/tar/tar_test.go
deleted file mode 100644
index d63c072..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/tar_test.go
+++ /dev/null
@@ -1,325 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tar
-
-import (
-	"bytes"
-	"io/ioutil"
-	"os"
-	"path"
-	"reflect"
-	"strings"
-	"testing"
-	"time"
-)
-
-func TestFileInfoHeader(t *testing.T) {
-	fi, err := os.Stat("testdata/small.txt")
-	if err != nil {
-		t.Fatal(err)
-	}
-	h, err := FileInfoHeader(fi, "")
-	if err != nil {
-		t.Fatalf("FileInfoHeader: %v", err)
-	}
-	if g, e := h.Name, "small.txt"; g != e {
-		t.Errorf("Name = %q; want %q", g, e)
-	}
-	if g, e := h.Mode, int64(fi.Mode().Perm())|c_ISREG; g != e {
-		t.Errorf("Mode = %#o; want %#o", g, e)
-	}
-	if g, e := h.Size, int64(5); g != e {
-		t.Errorf("Size = %v; want %v", g, e)
-	}
-	if g, e := h.ModTime, fi.ModTime(); !g.Equal(e) {
-		t.Errorf("ModTime = %v; want %v", g, e)
-	}
-	// FileInfoHeader should error when passing nil FileInfo
-	if _, err := FileInfoHeader(nil, ""); err == nil {
-		t.Fatalf("Expected error when passing nil to FileInfoHeader")
-	}
-}
-
-func TestFileInfoHeaderDir(t *testing.T) {
-	fi, err := os.Stat("testdata")
-	if err != nil {
-		t.Fatal(err)
-	}
-	h, err := FileInfoHeader(fi, "")
-	if err != nil {
-		t.Fatalf("FileInfoHeader: %v", err)
-	}
-	if g, e := h.Name, "testdata/"; g != e {
-		t.Errorf("Name = %q; want %q", g, e)
-	}
-	// Ignoring c_ISGID for golang.org/issue/4867
-	if g, e := h.Mode&^c_ISGID, int64(fi.Mode().Perm())|c_ISDIR; g != e {
-		t.Errorf("Mode = %#o; want %#o", g, e)
-	}
-	if g, e := h.Size, int64(0); g != e {
-		t.Errorf("Size = %v; want %v", g, e)
-	}
-	if g, e := h.ModTime, fi.ModTime(); !g.Equal(e) {
-		t.Errorf("ModTime = %v; want %v", g, e)
-	}
-}
-
-func TestFileInfoHeaderSymlink(t *testing.T) {
-	h, err := FileInfoHeader(symlink{}, "some-target")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if g, e := h.Name, "some-symlink"; g != e {
-		t.Errorf("Name = %q; want %q", g, e)
-	}
-	if g, e := h.Linkname, "some-target"; g != e {
-		t.Errorf("Linkname = %q; want %q", g, e)
-	}
-}
-
-type symlink struct{}
-
-func (symlink) Name() string       { return "some-symlink" }
-func (symlink) Size() int64        { return 0 }
-func (symlink) Mode() os.FileMode  { return os.ModeSymlink }
-func (symlink) ModTime() time.Time { return time.Time{} }
-func (symlink) IsDir() bool        { return false }
-func (symlink) Sys() interface{}   { return nil }
-
-func TestRoundTrip(t *testing.T) {
-	data := []byte("some file contents")
-
-	var b bytes.Buffer
-	tw := NewWriter(&b)
-	hdr := &Header{
-		Name:    "file.txt",
-		Uid:     1 << 21, // too big for 8 octal digits
-		Size:    int64(len(data)),
-		ModTime: time.Now(),
-	}
-	// tar only supports second precision.
-	hdr.ModTime = hdr.ModTime.Add(-time.Duration(hdr.ModTime.Nanosecond()) * time.Nanosecond)
-	if err := tw.WriteHeader(hdr); err != nil {
-		t.Fatalf("tw.WriteHeader: %v", err)
-	}
-	if _, err := tw.Write(data); err != nil {
-		t.Fatalf("tw.Write: %v", err)
-	}
-	if err := tw.Close(); err != nil {
-		t.Fatalf("tw.Close: %v", err)
-	}
-
-	// Read it back.
-	tr := NewReader(&b)
-	rHdr, err := tr.Next()
-	if err != nil {
-		t.Fatalf("tr.Next: %v", err)
-	}
-	if !reflect.DeepEqual(rHdr, hdr) {
-		t.Errorf("Header mismatch.\n got %+v\nwant %+v", rHdr, hdr)
-	}
-	rData, err := ioutil.ReadAll(tr)
-	if err != nil {
-		t.Fatalf("Read: %v", err)
-	}
-	if !bytes.Equal(rData, data) {
-		t.Errorf("Data mismatch.\n got %q\nwant %q", rData, data)
-	}
-}
-
-type headerRoundTripTest struct {
-	h  *Header
-	fm os.FileMode
-}
-
-func TestHeaderRoundTrip(t *testing.T) {
-	golden := []headerRoundTripTest{
-		// regular file.
-		{
-			h: &Header{
-				Name:     "test.txt",
-				Mode:     0644 | c_ISREG,
-				Size:     12,
-				ModTime:  time.Unix(1360600916, 0),
-				Typeflag: TypeReg,
-			},
-			fm: 0644,
-		},
-		// symbolic link.
-		{
-			h: &Header{
-				Name:     "link.txt",
-				Mode:     0777 | c_ISLNK,
-				Size:     0,
-				ModTime:  time.Unix(1360600852, 0),
-				Typeflag: TypeSymlink,
-			},
-			fm: 0777 | os.ModeSymlink,
-		},
-		// character device node.
-		{
-			h: &Header{
-				Name:     "dev/null",
-				Mode:     0666 | c_ISCHR,
-				Size:     0,
-				ModTime:  time.Unix(1360578951, 0),
-				Typeflag: TypeChar,
-			},
-			fm: 0666 | os.ModeDevice | os.ModeCharDevice,
-		},
-		// block device node.
-		{
-			h: &Header{
-				Name:     "dev/sda",
-				Mode:     0660 | c_ISBLK,
-				Size:     0,
-				ModTime:  time.Unix(1360578954, 0),
-				Typeflag: TypeBlock,
-			},
-			fm: 0660 | os.ModeDevice,
-		},
-		// directory.
-		{
-			h: &Header{
-				Name:     "dir/",
-				Mode:     0755 | c_ISDIR,
-				Size:     0,
-				ModTime:  time.Unix(1360601116, 0),
-				Typeflag: TypeDir,
-			},
-			fm: 0755 | os.ModeDir,
-		},
-		// fifo node.
-		{
-			h: &Header{
-				Name:     "dev/initctl",
-				Mode:     0600 | c_ISFIFO,
-				Size:     0,
-				ModTime:  time.Unix(1360578949, 0),
-				Typeflag: TypeFifo,
-			},
-			fm: 0600 | os.ModeNamedPipe,
-		},
-		// setuid.
-		{
-			h: &Header{
-				Name:     "bin/su",
-				Mode:     0755 | c_ISREG | c_ISUID,
-				Size:     23232,
-				ModTime:  time.Unix(1355405093, 0),
-				Typeflag: TypeReg,
-			},
-			fm: 0755 | os.ModeSetuid,
-		},
-		// setguid.
-		{
-			h: &Header{
-				Name:     "group.txt",
-				Mode:     0750 | c_ISREG | c_ISGID,
-				Size:     0,
-				ModTime:  time.Unix(1360602346, 0),
-				Typeflag: TypeReg,
-			},
-			fm: 0750 | os.ModeSetgid,
-		},
-		// sticky.
-		{
-			h: &Header{
-				Name:     "sticky.txt",
-				Mode:     0600 | c_ISREG | c_ISVTX,
-				Size:     7,
-				ModTime:  time.Unix(1360602540, 0),
-				Typeflag: TypeReg,
-			},
-			fm: 0600 | os.ModeSticky,
-		},
-		// hard link.
-		{
-			h: &Header{
-				Name:     "hard.txt",
-				Mode:     0644 | c_ISREG,
-				Size:     0,
-				Linkname: "file.txt",
-				ModTime:  time.Unix(1360600916, 0),
-				Typeflag: TypeLink,
-			},
-			fm: 0644,
-		},
-		// More information.
-		{
-			h: &Header{
-				Name:     "info.txt",
-				Mode:     0600 | c_ISREG,
-				Size:     0,
-				Uid:      1000,
-				Gid:      1000,
-				ModTime:  time.Unix(1360602540, 0),
-				Uname:    "slartibartfast",
-				Gname:    "users",
-				Typeflag: TypeReg,
-			},
-			fm: 0600,
-		},
-	}
-
-	for i, g := range golden {
-		fi := g.h.FileInfo()
-		h2, err := FileInfoHeader(fi, "")
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-		if strings.Contains(fi.Name(), "/") {
-			t.Errorf("FileInfo of %q contains slash: %q", g.h.Name, fi.Name())
-		}
-		name := path.Base(g.h.Name)
-		if fi.IsDir() {
-			name += "/"
-		}
-		if got, want := h2.Name, name; got != want {
-			t.Errorf("i=%d: Name: got %v, want %v", i, got, want)
-		}
-		if got, want := h2.Size, g.h.Size; got != want {
-			t.Errorf("i=%d: Size: got %v, want %v", i, got, want)
-		}
-		if got, want := h2.Uid, g.h.Uid; got != want {
-			t.Errorf("i=%d: Uid: got %d, want %d", i, got, want)
-		}
-		if got, want := h2.Gid, g.h.Gid; got != want {
-			t.Errorf("i=%d: Gid: got %d, want %d", i, got, want)
-		}
-		if got, want := h2.Uname, g.h.Uname; got != want {
-			t.Errorf("i=%d: Uname: got %q, want %q", i, got, want)
-		}
-		if got, want := h2.Gname, g.h.Gname; got != want {
-			t.Errorf("i=%d: Gname: got %q, want %q", i, got, want)
-		}
-		if got, want := h2.Linkname, g.h.Linkname; got != want {
-			t.Errorf("i=%d: Linkname: got %v, want %v", i, got, want)
-		}
-		if got, want := h2.Typeflag, g.h.Typeflag; got != want {
-			t.Logf("%#v %#v", g.h, fi.Sys())
-			t.Errorf("i=%d: Typeflag: got %q, want %q", i, got, want)
-		}
-		if got, want := h2.Mode, g.h.Mode; got != want {
-			t.Errorf("i=%d: Mode: got %o, want %o", i, got, want)
-		}
-		if got, want := fi.Mode(), g.fm; got != want {
-			t.Errorf("i=%d: fi.Mode: got %o, want %o", i, got, want)
-		}
-		if got, want := h2.AccessTime, g.h.AccessTime; got != want {
-			t.Errorf("i=%d: AccessTime: got %v, want %v", i, got, want)
-		}
-		if got, want := h2.ChangeTime, g.h.ChangeTime; got != want {
-			t.Errorf("i=%d: ChangeTime: got %v, want %v", i, got, want)
-		}
-		if got, want := h2.ModTime, g.h.ModTime; got != want {
-			t.Errorf("i=%d: ModTime: got %v, want %v", i, got, want)
-		}
-		if sysh, ok := fi.Sys().(*Header); !ok || sysh != g.h {
-			t.Errorf("i=%d: Sys didn't return original *Header", i)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/gnu.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/gnu.tar
deleted file mode 100644
index fc899dc..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/gnu.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/hardlink.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/hardlink.tar
deleted file mode 100644
index 9cd1a26..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/hardlink.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/issue10968.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/issue10968.tar
deleted file mode 100644
index 1cc837b..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/issue10968.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/issue11169.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/issue11169.tar
deleted file mode 100644
index 4d71fa1..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/issue11169.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/neg-size.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/neg-size.tar
deleted file mode 100644
index 5deea3d..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/neg-size.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/nil-uid.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/nil-uid.tar
deleted file mode 100644
index cc9cfaa..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/nil-uid.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/pax.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/pax.tar
deleted file mode 100644
index 9bc24b6..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/pax.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/small.txt b/third_party/gofrontend/libgo/go/archive/tar/testdata/small.txt
deleted file mode 100644
index b249bfc..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/small.txt
+++ /dev/null
@@ -1 +0,0 @@
-Kilts
\ No newline at end of file
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/small2.txt b/third_party/gofrontend/libgo/go/archive/tar/testdata/small2.txt
deleted file mode 100644
index 394ee3e..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/small2.txt
+++ /dev/null
@@ -1 +0,0 @@
-Google.com
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/sparse-formats.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/sparse-formats.tar
deleted file mode 100644
index 8bd4e74..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/sparse-formats.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/star.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/star.tar
deleted file mode 100644
index 59e2d4e..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/star.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/ustar.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/ustar.tar
deleted file mode 100644
index 29679d9..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/ustar.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/v7.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/v7.tar
deleted file mode 100644
index eb65fc9..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/v7.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/writer-big-long.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/writer-big-long.tar
deleted file mode 100644
index 5960ee8..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/writer-big-long.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/writer-big.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/writer-big.tar
deleted file mode 100644
index 753e883..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/writer-big.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/writer.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/writer.tar
deleted file mode 100644
index e6d816a..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/writer.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/testdata/xattrs.tar b/third_party/gofrontend/libgo/go/archive/tar/testdata/xattrs.tar
deleted file mode 100644
index 9701950..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/testdata/xattrs.tar
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/tar/writer.go b/third_party/gofrontend/libgo/go/archive/tar/writer.go
deleted file mode 100644
index 9dbc01a..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/writer.go
+++ /dev/null
@@ -1,396 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tar
-
-// TODO(dsymonds):
-// - catch more errors (no first header, etc.)
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"os"
-	"path"
-	"strconv"
-	"strings"
-	"time"
-)
-
-var (
-	ErrWriteTooLong    = errors.New("archive/tar: write too long")
-	ErrFieldTooLong    = errors.New("archive/tar: header field too long")
-	ErrWriteAfterClose = errors.New("archive/tar: write after close")
-	errNameTooLong     = errors.New("archive/tar: name too long")
-	errInvalidHeader   = errors.New("archive/tar: header field too long or contains invalid values")
-)
-
-// A Writer provides sequential writing of a tar archive in POSIX.1 format.
-// A tar archive consists of a sequence of files.
-// Call WriteHeader to begin a new file, and then call Write to supply that file's data,
-// writing at most hdr.Size bytes in total.
-type Writer struct {
-	w          io.Writer
-	err        error
-	nb         int64 // number of unwritten bytes for current file entry
-	pad        int64 // amount of padding to write after current file entry
-	closed     bool
-	usedBinary bool            // whether the binary numeric field extension was used
-	preferPax  bool            // use pax header instead of binary numeric header
-	hdrBuff    [blockSize]byte // buffer to use in writeHeader when writing a regular header
-	paxHdrBuff [blockSize]byte // buffer to use in writeHeader when writing a pax header
-}
-
-// NewWriter creates a new Writer writing to w.
-func NewWriter(w io.Writer) *Writer { return &Writer{w: w} }
-
-// Flush finishes writing the current file (optional).
-func (tw *Writer) Flush() error {
-	if tw.nb > 0 {
-		tw.err = fmt.Errorf("archive/tar: missed writing %d bytes", tw.nb)
-		return tw.err
-	}
-
-	n := tw.nb + tw.pad
-	for n > 0 && tw.err == nil {
-		nr := n
-		if nr > blockSize {
-			nr = blockSize
-		}
-		var nw int
-		nw, tw.err = tw.w.Write(zeroBlock[0:nr])
-		n -= int64(nw)
-	}
-	tw.nb = 0
-	tw.pad = 0
-	return tw.err
-}
-
-// Write s into b, terminating it with a NUL if there is room.
-// If the value is too long for the field and allowPax is true add a paxheader record instead
-func (tw *Writer) cString(b []byte, s string, allowPax bool, paxKeyword string, paxHeaders map[string]string) {
-	needsPaxHeader := allowPax && len(s) > len(b) || !isASCII(s)
-	if needsPaxHeader {
-		paxHeaders[paxKeyword] = s
-		return
-	}
-	if len(s) > len(b) {
-		if tw.err == nil {
-			tw.err = ErrFieldTooLong
-		}
-		return
-	}
-	ascii := toASCII(s)
-	copy(b, ascii)
-	if len(ascii) < len(b) {
-		b[len(ascii)] = 0
-	}
-}
-
-// Encode x as an octal ASCII string and write it into b with leading zeros.
-func (tw *Writer) octal(b []byte, x int64) {
-	s := strconv.FormatInt(x, 8)
-	// leading zeros, but leave room for a NUL.
-	for len(s)+1 < len(b) {
-		s = "0" + s
-	}
-	tw.cString(b, s, false, paxNone, nil)
-}
-
-// Write x into b, either as octal or as binary (GNUtar/star extension).
-// If the value is too long for the field and writingPax is enabled both for the field and the add a paxheader record instead
-func (tw *Writer) numeric(b []byte, x int64, allowPax bool, paxKeyword string, paxHeaders map[string]string) {
-	// Try octal first.
-	s := strconv.FormatInt(x, 8)
-	if len(s) < len(b) {
-		tw.octal(b, x)
-		return
-	}
-
-	// If it is too long for octal, and pax is preferred, use a pax header
-	if allowPax && tw.preferPax {
-		tw.octal(b, 0)
-		s := strconv.FormatInt(x, 10)
-		paxHeaders[paxKeyword] = s
-		return
-	}
-
-	// Too big: use binary (big-endian).
-	tw.usedBinary = true
-	for i := len(b) - 1; x > 0 && i >= 0; i-- {
-		b[i] = byte(x)
-		x >>= 8
-	}
-	b[0] |= 0x80 // highest bit indicates binary format
-}
-
-var (
-	minTime = time.Unix(0, 0)
-	// There is room for 11 octal digits (33 bits) of mtime.
-	maxTime = minTime.Add((1<<33 - 1) * time.Second)
-)
-
-// WriteHeader writes hdr and prepares to accept the file's contents.
-// WriteHeader calls Flush if it is not the first header.
-// Calling after a Close will return ErrWriteAfterClose.
-func (tw *Writer) WriteHeader(hdr *Header) error {
-	return tw.writeHeader(hdr, true)
-}
-
-// WriteHeader writes hdr and prepares to accept the file's contents.
-// WriteHeader calls Flush if it is not the first header.
-// Calling after a Close will return ErrWriteAfterClose.
-// As this method is called internally by writePax header to allow it to
-// suppress writing the pax header.
-func (tw *Writer) writeHeader(hdr *Header, allowPax bool) error {
-	if tw.closed {
-		return ErrWriteAfterClose
-	}
-	if tw.err == nil {
-		tw.Flush()
-	}
-	if tw.err != nil {
-		return tw.err
-	}
-
-	// a map to hold pax header records, if any are needed
-	paxHeaders := make(map[string]string)
-
-	// TODO(shanemhansen): we might want to use PAX headers for
-	// subsecond time resolution, but for now let's just capture
-	// too long fields or non ascii characters
-
-	var header []byte
-
-	// We need to select which scratch buffer to use carefully,
-	// since this method is called recursively to write PAX headers.
-	// If allowPax is true, this is the non-recursive call, and we will use hdrBuff.
-	// If allowPax is false, we are being called by writePAXHeader, and hdrBuff is
-	// already being used by the non-recursive call, so we must use paxHdrBuff.
-	header = tw.hdrBuff[:]
-	if !allowPax {
-		header = tw.paxHdrBuff[:]
-	}
-	copy(header, zeroBlock)
-	s := slicer(header)
-
-	// keep a reference to the filename to allow to overwrite it later if we detect that we can use ustar longnames instead of pax
-	pathHeaderBytes := s.next(fileNameSize)
-
-	tw.cString(pathHeaderBytes, hdr.Name, true, paxPath, paxHeaders)
-
-	// Handle out of range ModTime carefully.
-	var modTime int64
-	if !hdr.ModTime.Before(minTime) && !hdr.ModTime.After(maxTime) {
-		modTime = hdr.ModTime.Unix()
-	}
-
-	tw.octal(s.next(8), hdr.Mode)                                   // 100:108
-	tw.numeric(s.next(8), int64(hdr.Uid), true, paxUid, paxHeaders) // 108:116
-	tw.numeric(s.next(8), int64(hdr.Gid), true, paxGid, paxHeaders) // 116:124
-	tw.numeric(s.next(12), hdr.Size, true, paxSize, paxHeaders)     // 124:136
-	tw.numeric(s.next(12), modTime, false, paxNone, nil)            // 136:148 --- consider using pax for finer granularity
-	s.next(8)                                                       // chksum (148:156)
-	s.next(1)[0] = hdr.Typeflag                                     // 156:157
-
-	tw.cString(s.next(100), hdr.Linkname, true, paxLinkpath, paxHeaders)
-
-	copy(s.next(8), []byte("ustar\x0000"))                        // 257:265
-	tw.cString(s.next(32), hdr.Uname, true, paxUname, paxHeaders) // 265:297
-	tw.cString(s.next(32), hdr.Gname, true, paxGname, paxHeaders) // 297:329
-	tw.numeric(s.next(8), hdr.Devmajor, false, paxNone, nil)      // 329:337
-	tw.numeric(s.next(8), hdr.Devminor, false, paxNone, nil)      // 337:345
-
-	// keep a reference to the prefix to allow to overwrite it later if we detect that we can use ustar longnames instead of pax
-	prefixHeaderBytes := s.next(155)
-	tw.cString(prefixHeaderBytes, "", false, paxNone, nil) // 345:500  prefix
-
-	// Use the GNU magic instead of POSIX magic if we used any GNU extensions.
-	if tw.usedBinary {
-		copy(header[257:265], []byte("ustar  \x00"))
-	}
-
-	_, paxPathUsed := paxHeaders[paxPath]
-	// try to use a ustar header when only the name is too long
-	if !tw.preferPax && len(paxHeaders) == 1 && paxPathUsed {
-		suffix := hdr.Name
-		prefix := ""
-		if len(hdr.Name) > fileNameSize && isASCII(hdr.Name) {
-			var err error
-			prefix, suffix, err = tw.splitUSTARLongName(hdr.Name)
-			if err == nil {
-				// ok we can use a ustar long name instead of pax, now correct the fields
-
-				// remove the path field from the pax header. this will suppress the pax header
-				delete(paxHeaders, paxPath)
-
-				// update the path fields
-				tw.cString(pathHeaderBytes, suffix, false, paxNone, nil)
-				tw.cString(prefixHeaderBytes, prefix, false, paxNone, nil)
-
-				// Use the ustar magic if we used ustar long names.
-				if len(prefix) > 0 && !tw.usedBinary {
-					copy(header[257:265], []byte("ustar\x00"))
-				}
-			}
-		}
-	}
-
-	// The chksum field is terminated by a NUL and a space.
-	// This is different from the other octal fields.
-	chksum, _ := checksum(header)
-	tw.octal(header[148:155], chksum)
-	header[155] = ' '
-
-	if tw.err != nil {
-		// problem with header; probably integer too big for a field.
-		return tw.err
-	}
-
-	if allowPax {
-		for k, v := range hdr.Xattrs {
-			paxHeaders[paxXattr+k] = v
-		}
-	}
-
-	if len(paxHeaders) > 0 {
-		if !allowPax {
-			return errInvalidHeader
-		}
-		if err := tw.writePAXHeader(hdr, paxHeaders); err != nil {
-			return err
-		}
-	}
-	tw.nb = int64(hdr.Size)
-	tw.pad = (blockSize - (tw.nb % blockSize)) % blockSize
-
-	_, tw.err = tw.w.Write(header)
-	return tw.err
-}
-
-// writeUSTARLongName splits a USTAR long name hdr.Name.
-// name must be < 256 characters. errNameTooLong is returned
-// if hdr.Name can't be split. The splitting heuristic
-// is compatible with gnu tar.
-func (tw *Writer) splitUSTARLongName(name string) (prefix, suffix string, err error) {
-	length := len(name)
-	if length > fileNamePrefixSize+1 {
-		length = fileNamePrefixSize + 1
-	} else if name[length-1] == '/' {
-		length--
-	}
-	i := strings.LastIndex(name[:length], "/")
-	// nlen contains the resulting length in the name field.
-	// plen contains the resulting length in the prefix field.
-	nlen := len(name) - i - 1
-	plen := i
-	if i <= 0 || nlen > fileNameSize || nlen == 0 || plen > fileNamePrefixSize {
-		err = errNameTooLong
-		return
-	}
-	prefix, suffix = name[:i], name[i+1:]
-	return
-}
-
-// writePaxHeader writes an extended pax header to the
-// archive.
-func (tw *Writer) writePAXHeader(hdr *Header, paxHeaders map[string]string) error {
-	// Prepare extended header
-	ext := new(Header)
-	ext.Typeflag = TypeXHeader
-	// Setting ModTime is required for reader parsing to
-	// succeed, and seems harmless enough.
-	ext.ModTime = hdr.ModTime
-	// The spec asks that we namespace our pseudo files
-	// with the current pid.
-	pid := os.Getpid()
-	dir, file := path.Split(hdr.Name)
-	fullName := path.Join(dir,
-		fmt.Sprintf("PaxHeaders.%d", pid), file)
-
-	ascii := toASCII(fullName)
-	if len(ascii) > 100 {
-		ascii = ascii[:100]
-	}
-	ext.Name = ascii
-	// Construct the body
-	var buf bytes.Buffer
-
-	for k, v := range paxHeaders {
-		fmt.Fprint(&buf, paxHeader(k+"="+v))
-	}
-
-	ext.Size = int64(len(buf.Bytes()))
-	if err := tw.writeHeader(ext, false); err != nil {
-		return err
-	}
-	if _, err := tw.Write(buf.Bytes()); err != nil {
-		return err
-	}
-	if err := tw.Flush(); err != nil {
-		return err
-	}
-	return nil
-}
-
-// paxHeader formats a single pax record, prefixing it with the appropriate length
-func paxHeader(msg string) string {
-	const padding = 2 // Extra padding for space and newline
-	size := len(msg) + padding
-	size += len(strconv.Itoa(size))
-	record := fmt.Sprintf("%d %s\n", size, msg)
-	if len(record) != size {
-		// Final adjustment if adding size increased
-		// the number of digits in size
-		size = len(record)
-		record = fmt.Sprintf("%d %s\n", size, msg)
-	}
-	return record
-}
-
-// Write writes to the current entry in the tar archive.
-// Write returns the error ErrWriteTooLong if more than
-// hdr.Size bytes are written after WriteHeader.
-func (tw *Writer) Write(b []byte) (n int, err error) {
-	if tw.closed {
-		err = ErrWriteAfterClose
-		return
-	}
-	overwrite := false
-	if int64(len(b)) > tw.nb {
-		b = b[0:tw.nb]
-		overwrite = true
-	}
-	n, err = tw.w.Write(b)
-	tw.nb -= int64(n)
-	if err == nil && overwrite {
-		err = ErrWriteTooLong
-		return
-	}
-	tw.err = err
-	return
-}
-
-// Close closes the tar archive, flushing any unwritten
-// data to the underlying writer.
-func (tw *Writer) Close() error {
-	if tw.err != nil || tw.closed {
-		return tw.err
-	}
-	tw.Flush()
-	tw.closed = true
-	if tw.err != nil {
-		return tw.err
-	}
-
-	// trailer: two zero blocks
-	for i := 0; i < 2; i++ {
-		_, tw.err = tw.w.Write(zeroBlock)
-		if tw.err != nil {
-			break
-		}
-	}
-	return tw.err
-}
diff --git a/third_party/gofrontend/libgo/go/archive/tar/writer_test.go b/third_party/gofrontend/libgo/go/archive/tar/writer_test.go
deleted file mode 100644
index fe46a67..0000000
--- a/third_party/gofrontend/libgo/go/archive/tar/writer_test.go
+++ /dev/null
@@ -1,546 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tar
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"os"
-	"reflect"
-	"strings"
-	"testing"
-	"testing/iotest"
-	"time"
-)
-
-type writerTestEntry struct {
-	header   *Header
-	contents string
-}
-
-type writerTest struct {
-	file    string // filename of expected output
-	entries []*writerTestEntry
-}
-
-var writerTests = []*writerTest{
-	// The writer test file was produced with this command:
-	// tar (GNU tar) 1.26
-	//   ln -s small.txt link.txt
-	//   tar -b 1 --format=ustar -c -f writer.tar small.txt small2.txt link.txt
-	{
-		file: "testdata/writer.tar",
-		entries: []*writerTestEntry{
-			{
-				header: &Header{
-					Name:     "small.txt",
-					Mode:     0640,
-					Uid:      73025,
-					Gid:      5000,
-					Size:     5,
-					ModTime:  time.Unix(1246508266, 0),
-					Typeflag: '0',
-					Uname:    "dsymonds",
-					Gname:    "eng",
-				},
-				contents: "Kilts",
-			},
-			{
-				header: &Header{
-					Name:     "small2.txt",
-					Mode:     0640,
-					Uid:      73025,
-					Gid:      5000,
-					Size:     11,
-					ModTime:  time.Unix(1245217492, 0),
-					Typeflag: '0',
-					Uname:    "dsymonds",
-					Gname:    "eng",
-				},
-				contents: "Google.com\n",
-			},
-			{
-				header: &Header{
-					Name:     "link.txt",
-					Mode:     0777,
-					Uid:      1000,
-					Gid:      1000,
-					Size:     0,
-					ModTime:  time.Unix(1314603082, 0),
-					Typeflag: '2',
-					Linkname: "small.txt",
-					Uname:    "strings",
-					Gname:    "strings",
-				},
-				// no contents
-			},
-		},
-	},
-	// The truncated test file was produced using these commands:
-	//   dd if=/dev/zero bs=1048576 count=16384 > /tmp/16gig.txt
-	//   tar -b 1 -c -f- /tmp/16gig.txt | dd bs=512 count=8 > writer-big.tar
-	{
-		file: "testdata/writer-big.tar",
-		entries: []*writerTestEntry{
-			{
-				header: &Header{
-					Name:     "tmp/16gig.txt",
-					Mode:     0640,
-					Uid:      73025,
-					Gid:      5000,
-					Size:     16 << 30,
-					ModTime:  time.Unix(1254699560, 0),
-					Typeflag: '0',
-					Uname:    "dsymonds",
-					Gname:    "eng",
-				},
-				// fake contents
-				contents: strings.Repeat("\x00", 4<<10),
-			},
-		},
-	},
-	// The truncated test file was produced using these commands:
-	//   dd if=/dev/zero bs=1048576 count=16384 > (longname/)*15 /16gig.txt
-	//   tar -b 1 -c -f- (longname/)*15 /16gig.txt | dd bs=512 count=8 > writer-big-long.tar
-	{
-		file: "testdata/writer-big-long.tar",
-		entries: []*writerTestEntry{
-			{
-				header: &Header{
-					Name:     strings.Repeat("longname/", 15) + "16gig.txt",
-					Mode:     0644,
-					Uid:      1000,
-					Gid:      1000,
-					Size:     16 << 30,
-					ModTime:  time.Unix(1399583047, 0),
-					Typeflag: '0',
-					Uname:    "guillaume",
-					Gname:    "guillaume",
-				},
-				// fake contents
-				contents: strings.Repeat("\x00", 4<<10),
-			},
-		},
-	},
-	// This file was produced using gnu tar 1.17
-	// gnutar  -b 4 --format=ustar (longname/)*15 + file.txt
-	{
-		file: "testdata/ustar.tar",
-		entries: []*writerTestEntry{
-			{
-				header: &Header{
-					Name:     strings.Repeat("longname/", 15) + "file.txt",
-					Mode:     0644,
-					Uid:      0765,
-					Gid:      024,
-					Size:     06,
-					ModTime:  time.Unix(1360135598, 0),
-					Typeflag: '0',
-					Uname:    "shane",
-					Gname:    "staff",
-				},
-				contents: "hello\n",
-			},
-		},
-	},
-	// This file was produced using gnu tar 1.26
-	// echo "Slartibartfast" > file.txt
-	// ln file.txt hard.txt
-	// tar -b 1 --format=ustar -c -f hardlink.tar file.txt hard.txt
-	{
-		file: "testdata/hardlink.tar",
-		entries: []*writerTestEntry{
-			{
-				header: &Header{
-					Name:     "file.txt",
-					Mode:     0644,
-					Uid:      1000,
-					Gid:      100,
-					Size:     15,
-					ModTime:  time.Unix(1425484303, 0),
-					Typeflag: '0',
-					Uname:    "vbatts",
-					Gname:    "users",
-				},
-				contents: "Slartibartfast\n",
-			},
-			{
-				header: &Header{
-					Name:     "hard.txt",
-					Mode:     0644,
-					Uid:      1000,
-					Gid:      100,
-					Size:     0,
-					ModTime:  time.Unix(1425484303, 0),
-					Typeflag: '1',
-					Linkname: "file.txt",
-					Uname:    "vbatts",
-					Gname:    "users",
-				},
-				// no contents
-			},
-		},
-	},
-}
-
-// Render byte array in a two-character hexadecimal string, spaced for easy visual inspection.
-func bytestr(offset int, b []byte) string {
-	const rowLen = 32
-	s := fmt.Sprintf("%04x ", offset)
-	for _, ch := range b {
-		switch {
-		case '0' <= ch && ch <= '9', 'A' <= ch && ch <= 'Z', 'a' <= ch && ch <= 'z':
-			s += fmt.Sprintf("  %c", ch)
-		default:
-			s += fmt.Sprintf(" %02x", ch)
-		}
-	}
-	return s
-}
-
-// Render a pseudo-diff between two blocks of bytes.
-func bytediff(a []byte, b []byte) string {
-	const rowLen = 32
-	s := fmt.Sprintf("(%d bytes vs. %d bytes)\n", len(a), len(b))
-	for offset := 0; len(a)+len(b) > 0; offset += rowLen {
-		na, nb := rowLen, rowLen
-		if na > len(a) {
-			na = len(a)
-		}
-		if nb > len(b) {
-			nb = len(b)
-		}
-		sa := bytestr(offset, a[0:na])
-		sb := bytestr(offset, b[0:nb])
-		if sa != sb {
-			s += fmt.Sprintf("-%v\n+%v\n", sa, sb)
-		}
-		a = a[na:]
-		b = b[nb:]
-	}
-	return s
-}
-
-func TestWriter(t *testing.T) {
-testLoop:
-	for i, test := range writerTests {
-		expected, err := ioutil.ReadFile(test.file)
-		if err != nil {
-			t.Errorf("test %d: Unexpected error: %v", i, err)
-			continue
-		}
-
-		buf := new(bytes.Buffer)
-		tw := NewWriter(iotest.TruncateWriter(buf, 4<<10)) // only catch the first 4 KB
-		big := false
-		for j, entry := range test.entries {
-			big = big || entry.header.Size > 1<<10
-			if err := tw.WriteHeader(entry.header); err != nil {
-				t.Errorf("test %d, entry %d: Failed writing header: %v", i, j, err)
-				continue testLoop
-			}
-			if _, err := io.WriteString(tw, entry.contents); err != nil {
-				t.Errorf("test %d, entry %d: Failed writing contents: %v", i, j, err)
-				continue testLoop
-			}
-		}
-		// Only interested in Close failures for the small tests.
-		if err := tw.Close(); err != nil && !big {
-			t.Errorf("test %d: Failed closing archive: %v", i, err)
-			continue testLoop
-		}
-
-		actual := buf.Bytes()
-		if !bytes.Equal(expected, actual) {
-			t.Errorf("test %d: Incorrect result: (-=expected, +=actual)\n%v",
-				i, bytediff(expected, actual))
-		}
-		if testing.Short() { // The second test is expensive.
-			break
-		}
-	}
-}
-
-func TestPax(t *testing.T) {
-	// Create an archive with a large name
-	fileinfo, err := os.Stat("testdata/small.txt")
-	if err != nil {
-		t.Fatal(err)
-	}
-	hdr, err := FileInfoHeader(fileinfo, "")
-	if err != nil {
-		t.Fatalf("os.Stat: %v", err)
-	}
-	// Force a PAX long name to be written
-	longName := strings.Repeat("ab", 100)
-	contents := strings.Repeat(" ", int(hdr.Size))
-	hdr.Name = longName
-	var buf bytes.Buffer
-	writer := NewWriter(&buf)
-	if err := writer.WriteHeader(hdr); err != nil {
-		t.Fatal(err)
-	}
-	if _, err = writer.Write([]byte(contents)); err != nil {
-		t.Fatal(err)
-	}
-	if err := writer.Close(); err != nil {
-		t.Fatal(err)
-	}
-	// Simple test to make sure PAX extensions are in effect
-	if !bytes.Contains(buf.Bytes(), []byte("PaxHeaders.")) {
-		t.Fatal("Expected at least one PAX header to be written.")
-	}
-	// Test that we can get a long name back out of the archive.
-	reader := NewReader(&buf)
-	hdr, err = reader.Next()
-	if err != nil {
-		t.Fatal(err)
-	}
-	if hdr.Name != longName {
-		t.Fatal("Couldn't recover long file name")
-	}
-}
-
-func TestPaxSymlink(t *testing.T) {
-	// Create an archive with a large linkname
-	fileinfo, err := os.Stat("testdata/small.txt")
-	if err != nil {
-		t.Fatal(err)
-	}
-	hdr, err := FileInfoHeader(fileinfo, "")
-	hdr.Typeflag = TypeSymlink
-	if err != nil {
-		t.Fatalf("os.Stat:1 %v", err)
-	}
-	// Force a PAX long linkname to be written
-	longLinkname := strings.Repeat("1234567890/1234567890", 10)
-	hdr.Linkname = longLinkname
-
-	hdr.Size = 0
-	var buf bytes.Buffer
-	writer := NewWriter(&buf)
-	if err := writer.WriteHeader(hdr); err != nil {
-		t.Fatal(err)
-	}
-	if err := writer.Close(); err != nil {
-		t.Fatal(err)
-	}
-	// Simple test to make sure PAX extensions are in effect
-	if !bytes.Contains(buf.Bytes(), []byte("PaxHeaders.")) {
-		t.Fatal("Expected at least one PAX header to be written.")
-	}
-	// Test that we can get a long name back out of the archive.
-	reader := NewReader(&buf)
-	hdr, err = reader.Next()
-	if err != nil {
-		t.Fatal(err)
-	}
-	if hdr.Linkname != longLinkname {
-		t.Fatal("Couldn't recover long link name")
-	}
-}
-
-func TestPaxNonAscii(t *testing.T) {
-	// Create an archive with non ascii. These should trigger a pax header
-	// because pax headers have a defined utf-8 encoding.
-	fileinfo, err := os.Stat("testdata/small.txt")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	hdr, err := FileInfoHeader(fileinfo, "")
-	if err != nil {
-		t.Fatalf("os.Stat:1 %v", err)
-	}
-
-	// some sample data
-	chineseFilename := "文件名"
-	chineseGroupname := "組"
-	chineseUsername := "用戶名"
-
-	hdr.Name = chineseFilename
-	hdr.Gname = chineseGroupname
-	hdr.Uname = chineseUsername
-
-	contents := strings.Repeat(" ", int(hdr.Size))
-
-	var buf bytes.Buffer
-	writer := NewWriter(&buf)
-	if err := writer.WriteHeader(hdr); err != nil {
-		t.Fatal(err)
-	}
-	if _, err = writer.Write([]byte(contents)); err != nil {
-		t.Fatal(err)
-	}
-	if err := writer.Close(); err != nil {
-		t.Fatal(err)
-	}
-	// Simple test to make sure PAX extensions are in effect
-	if !bytes.Contains(buf.Bytes(), []byte("PaxHeaders.")) {
-		t.Fatal("Expected at least one PAX header to be written.")
-	}
-	// Test that we can get a long name back out of the archive.
-	reader := NewReader(&buf)
-	hdr, err = reader.Next()
-	if err != nil {
-		t.Fatal(err)
-	}
-	if hdr.Name != chineseFilename {
-		t.Fatal("Couldn't recover unicode name")
-	}
-	if hdr.Gname != chineseGroupname {
-		t.Fatal("Couldn't recover unicode group")
-	}
-	if hdr.Uname != chineseUsername {
-		t.Fatal("Couldn't recover unicode user")
-	}
-}
-
-func TestPaxXattrs(t *testing.T) {
-	xattrs := map[string]string{
-		"user.key": "value",
-	}
-
-	// Create an archive with an xattr
-	fileinfo, err := os.Stat("testdata/small.txt")
-	if err != nil {
-		t.Fatal(err)
-	}
-	hdr, err := FileInfoHeader(fileinfo, "")
-	if err != nil {
-		t.Fatalf("os.Stat: %v", err)
-	}
-	contents := "Kilts"
-	hdr.Xattrs = xattrs
-	var buf bytes.Buffer
-	writer := NewWriter(&buf)
-	if err := writer.WriteHeader(hdr); err != nil {
-		t.Fatal(err)
-	}
-	if _, err = writer.Write([]byte(contents)); err != nil {
-		t.Fatal(err)
-	}
-	if err := writer.Close(); err != nil {
-		t.Fatal(err)
-	}
-	// Test that we can get the xattrs back out of the archive.
-	reader := NewReader(&buf)
-	hdr, err = reader.Next()
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !reflect.DeepEqual(hdr.Xattrs, xattrs) {
-		t.Fatalf("xattrs did not survive round trip: got %+v, want %+v",
-			hdr.Xattrs, xattrs)
-	}
-}
-
-func TestPAXHeader(t *testing.T) {
-	medName := strings.Repeat("CD", 50)
-	longName := strings.Repeat("AB", 100)
-	paxTests := [][2]string{
-		{paxPath + "=/etc/hosts", "19 path=/etc/hosts\n"},
-		{"a=b", "6 a=b\n"},          // Single digit length
-		{"a=names", "11 a=names\n"}, // Test case involving carries
-		{paxPath + "=" + longName, fmt.Sprintf("210 path=%s\n", longName)},
-		{paxPath + "=" + medName, fmt.Sprintf("110 path=%s\n", medName)}}
-
-	for _, test := range paxTests {
-		key, expected := test[0], test[1]
-		if result := paxHeader(key); result != expected {
-			t.Fatalf("paxHeader: got %s, expected %s", result, expected)
-		}
-	}
-}
-
-func TestUSTARLongName(t *testing.T) {
-	// Create an archive with a path that failed to split with USTAR extension in previous versions.
-	fileinfo, err := os.Stat("testdata/small.txt")
-	if err != nil {
-		t.Fatal(err)
-	}
-	hdr, err := FileInfoHeader(fileinfo, "")
-	hdr.Typeflag = TypeDir
-	if err != nil {
-		t.Fatalf("os.Stat:1 %v", err)
-	}
-	// Force a PAX long name to be written. The name was taken from a practical example
-	// that fails and replaced ever char through numbers to anonymize the sample.
-	longName := "/0000_0000000/00000-000000000/0000_0000000/00000-0000000000000/0000_0000000/00000-0000000-00000000/0000_0000000/00000000/0000_0000000/000/0000_0000000/00000000v00/0000_0000000/000000/0000_0000000/0000000/0000_0000000/00000y-00/0000/0000/00000000/0x000000/"
-	hdr.Name = longName
-
-	hdr.Size = 0
-	var buf bytes.Buffer
-	writer := NewWriter(&buf)
-	if err := writer.WriteHeader(hdr); err != nil {
-		t.Fatal(err)
-	}
-	if err := writer.Close(); err != nil {
-		t.Fatal(err)
-	}
-	// Test that we can get a long name back out of the archive.
-	reader := NewReader(&buf)
-	hdr, err = reader.Next()
-	if err != nil {
-		t.Fatal(err)
-	}
-	if hdr.Name != longName {
-		t.Fatal("Couldn't recover long name")
-	}
-}
-
-func TestValidTypeflagWithPAXHeader(t *testing.T) {
-	var buffer bytes.Buffer
-	tw := NewWriter(&buffer)
-
-	fileName := strings.Repeat("ab", 100)
-
-	hdr := &Header{
-		Name:     fileName,
-		Size:     4,
-		Typeflag: 0,
-	}
-	if err := tw.WriteHeader(hdr); err != nil {
-		t.Fatalf("Failed to write header: %s", err)
-	}
-	if _, err := tw.Write([]byte("fooo")); err != nil {
-		t.Fatalf("Failed to write the file's data: %s", err)
-	}
-	tw.Close()
-
-	tr := NewReader(&buffer)
-
-	for {
-		header, err := tr.Next()
-		if err == io.EOF {
-			break
-		}
-		if err != nil {
-			t.Fatalf("Failed to read header: %s", err)
-		}
-		if header.Typeflag != 0 {
-			t.Fatalf("Typeflag should've been 0, found %d", header.Typeflag)
-		}
-	}
-}
-
-func TestWriteAfterClose(t *testing.T) {
-	var buffer bytes.Buffer
-	tw := NewWriter(&buffer)
-
-	hdr := &Header{
-		Name: "small.txt",
-		Size: 5,
-	}
-	if err := tw.WriteHeader(hdr); err != nil {
-		t.Fatalf("Failed to write header: %s", err)
-	}
-	tw.Close()
-	if _, err := tw.Write([]byte("Kilts")); err != ErrWriteAfterClose {
-		t.Fatalf("Write: got %v; want ErrWriteAfterClose", err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/archive/zip/reader.go b/third_party/gofrontend/libgo/go/archive/zip/reader.go
deleted file mode 100644
index 519748b..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/reader.go
+++ /dev/null
@@ -1,471 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package zip
-
-import (
-	"bufio"
-	"encoding/binary"
-	"errors"
-	"fmt"
-	"hash"
-	"hash/crc32"
-	"io"
-	"os"
-)
-
-var (
-	ErrFormat    = errors.New("zip: not a valid zip file")
-	ErrAlgorithm = errors.New("zip: unsupported compression algorithm")
-	ErrChecksum  = errors.New("zip: checksum error")
-)
-
-type Reader struct {
-	r       io.ReaderAt
-	File    []*File
-	Comment string
-}
-
-type ReadCloser struct {
-	f *os.File
-	Reader
-}
-
-type File struct {
-	FileHeader
-	zipr         io.ReaderAt
-	zipsize      int64
-	headerOffset int64
-}
-
-func (f *File) hasDataDescriptor() bool {
-	return f.Flags&0x8 != 0
-}
-
-// OpenReader will open the Zip file specified by name and return a ReadCloser.
-func OpenReader(name string) (*ReadCloser, error) {
-	f, err := os.Open(name)
-	if err != nil {
-		return nil, err
-	}
-	fi, err := f.Stat()
-	if err != nil {
-		f.Close()
-		return nil, err
-	}
-	r := new(ReadCloser)
-	if err := r.init(f, fi.Size()); err != nil {
-		f.Close()
-		return nil, err
-	}
-	r.f = f
-	return r, nil
-}
-
-// NewReader returns a new Reader reading from r, which is assumed to
-// have the given size in bytes.
-func NewReader(r io.ReaderAt, size int64) (*Reader, error) {
-	zr := new(Reader)
-	if err := zr.init(r, size); err != nil {
-		return nil, err
-	}
-	return zr, nil
-}
-
-func (z *Reader) init(r io.ReaderAt, size int64) error {
-	end, err := readDirectoryEnd(r, size)
-	if err != nil {
-		return err
-	}
-	if end.directoryRecords > uint64(size)/fileHeaderLen {
-		return fmt.Errorf("archive/zip: TOC declares impossible %d files in %d byte zip", end.directoryRecords, size)
-	}
-	z.r = r
-	z.File = make([]*File, 0, end.directoryRecords)
-	z.Comment = end.comment
-	rs := io.NewSectionReader(r, 0, size)
-	if _, err = rs.Seek(int64(end.directoryOffset), os.SEEK_SET); err != nil {
-		return err
-	}
-	buf := bufio.NewReader(rs)
-
-	// The count of files inside a zip is truncated to fit in a uint16.
-	// Gloss over this by reading headers until we encounter
-	// a bad one, and then only report a ErrFormat or UnexpectedEOF if
-	// the file count modulo 65536 is incorrect.
-	for {
-		f := &File{zipr: r, zipsize: size}
-		err = readDirectoryHeader(f, buf)
-		if err == ErrFormat || err == io.ErrUnexpectedEOF {
-			break
-		}
-		if err != nil {
-			return err
-		}
-		z.File = append(z.File, f)
-	}
-	if uint16(len(z.File)) != uint16(end.directoryRecords) { // only compare 16 bits here
-		// Return the readDirectoryHeader error if we read
-		// the wrong number of directory entries.
-		return err
-	}
-	return nil
-}
-
-// Close closes the Zip file, rendering it unusable for I/O.
-func (rc *ReadCloser) Close() error {
-	return rc.f.Close()
-}
-
-// DataOffset returns the offset of the file's possibly-compressed
-// data, relative to the beginning of the zip file.
-//
-// Most callers should instead use Open, which transparently
-// decompresses data and verifies checksums.
-func (f *File) DataOffset() (offset int64, err error) {
-	bodyOffset, err := f.findBodyOffset()
-	if err != nil {
-		return
-	}
-	return f.headerOffset + bodyOffset, nil
-}
-
-// Open returns a ReadCloser that provides access to the File's contents.
-// Multiple files may be read concurrently.
-func (f *File) Open() (rc io.ReadCloser, err error) {
-	bodyOffset, err := f.findBodyOffset()
-	if err != nil {
-		return
-	}
-	size := int64(f.CompressedSize64)
-	r := io.NewSectionReader(f.zipr, f.headerOffset+bodyOffset, size)
-	dcomp := decompressor(f.Method)
-	if dcomp == nil {
-		err = ErrAlgorithm
-		return
-	}
-	rc = dcomp(r)
-	var desr io.Reader
-	if f.hasDataDescriptor() {
-		desr = io.NewSectionReader(f.zipr, f.headerOffset+bodyOffset+size, dataDescriptorLen)
-	}
-	rc = &checksumReader{
-		rc:   rc,
-		hash: crc32.NewIEEE(),
-		f:    f,
-		desr: desr,
-	}
-	return
-}
-
-type checksumReader struct {
-	rc    io.ReadCloser
-	hash  hash.Hash32
-	nread uint64 // number of bytes read so far
-	f     *File
-	desr  io.Reader // if non-nil, where to read the data descriptor
-	err   error     // sticky error
-}
-
-func (r *checksumReader) Read(b []byte) (n int, err error) {
-	if r.err != nil {
-		return 0, r.err
-	}
-	n, err = r.rc.Read(b)
-	r.hash.Write(b[:n])
-	r.nread += uint64(n)
-	if err == nil {
-		return
-	}
-	if err == io.EOF {
-		if r.nread != r.f.UncompressedSize64 {
-			return 0, io.ErrUnexpectedEOF
-		}
-		if r.desr != nil {
-			if err1 := readDataDescriptor(r.desr, r.f); err1 != nil {
-				if err1 == io.EOF {
-					err = io.ErrUnexpectedEOF
-				} else {
-					err = err1
-				}
-			} else if r.hash.Sum32() != r.f.CRC32 {
-				err = ErrChecksum
-			}
-		} else {
-			// If there's not a data descriptor, we still compare
-			// the CRC32 of what we've read against the file header
-			// or TOC's CRC32, if it seems like it was set.
-			if r.f.CRC32 != 0 && r.hash.Sum32() != r.f.CRC32 {
-				err = ErrChecksum
-			}
-		}
-	}
-	r.err = err
-	return
-}
-
-func (r *checksumReader) Close() error { return r.rc.Close() }
-
-// findBodyOffset does the minimum work to verify the file has a header
-// and returns the file body offset.
-func (f *File) findBodyOffset() (int64, error) {
-	var buf [fileHeaderLen]byte
-	if _, err := f.zipr.ReadAt(buf[:], f.headerOffset); err != nil {
-		return 0, err
-	}
-	b := readBuf(buf[:])
-	if sig := b.uint32(); sig != fileHeaderSignature {
-		return 0, ErrFormat
-	}
-	b = b[22:] // skip over most of the header
-	filenameLen := int(b.uint16())
-	extraLen := int(b.uint16())
-	return int64(fileHeaderLen + filenameLen + extraLen), nil
-}
-
-// readDirectoryHeader attempts to read a directory header from r.
-// It returns io.ErrUnexpectedEOF if it cannot read a complete header,
-// and ErrFormat if it doesn't find a valid header signature.
-func readDirectoryHeader(f *File, r io.Reader) error {
-	var buf [directoryHeaderLen]byte
-	if _, err := io.ReadFull(r, buf[:]); err != nil {
-		return err
-	}
-	b := readBuf(buf[:])
-	if sig := b.uint32(); sig != directoryHeaderSignature {
-		return ErrFormat
-	}
-	f.CreatorVersion = b.uint16()
-	f.ReaderVersion = b.uint16()
-	f.Flags = b.uint16()
-	f.Method = b.uint16()
-	f.ModifiedTime = b.uint16()
-	f.ModifiedDate = b.uint16()
-	f.CRC32 = b.uint32()
-	f.CompressedSize = b.uint32()
-	f.UncompressedSize = b.uint32()
-	f.CompressedSize64 = uint64(f.CompressedSize)
-	f.UncompressedSize64 = uint64(f.UncompressedSize)
-	filenameLen := int(b.uint16())
-	extraLen := int(b.uint16())
-	commentLen := int(b.uint16())
-	b = b[4:] // skipped start disk number and internal attributes (2x uint16)
-	f.ExternalAttrs = b.uint32()
-	f.headerOffset = int64(b.uint32())
-	d := make([]byte, filenameLen+extraLen+commentLen)
-	if _, err := io.ReadFull(r, d); err != nil {
-		return err
-	}
-	f.Name = string(d[:filenameLen])
-	f.Extra = d[filenameLen : filenameLen+extraLen]
-	f.Comment = string(d[filenameLen+extraLen:])
-
-	if len(f.Extra) > 0 {
-		b := readBuf(f.Extra)
-		for len(b) >= 4 { // need at least tag and size
-			tag := b.uint16()
-			size := b.uint16()
-			if int(size) > len(b) {
-				return ErrFormat
-			}
-			if tag == zip64ExtraId {
-				// update directory values from the zip64 extra block
-				eb := readBuf(b[:size])
-				if len(eb) >= 8 {
-					f.UncompressedSize64 = eb.uint64()
-				}
-				if len(eb) >= 8 {
-					f.CompressedSize64 = eb.uint64()
-				}
-				if len(eb) >= 8 {
-					f.headerOffset = int64(eb.uint64())
-				}
-			}
-			b = b[size:]
-		}
-		// Should have consumed the whole header.
-		// But popular zip & JAR creation tools are broken and
-		// may pad extra zeros at the end, so accept those
-		// too. See golang.org/issue/8186.
-		for _, v := range b {
-			if v != 0 {
-				return ErrFormat
-			}
-		}
-	}
-	return nil
-}
-
-func readDataDescriptor(r io.Reader, f *File) error {
-	var buf [dataDescriptorLen]byte
-
-	// The spec says: "Although not originally assigned a
-	// signature, the value 0x08074b50 has commonly been adopted
-	// as a signature value for the data descriptor record.
-	// Implementers should be aware that ZIP files may be
-	// encountered with or without this signature marking data
-	// descriptors and should account for either case when reading
-	// ZIP files to ensure compatibility."
-	//
-	// dataDescriptorLen includes the size of the signature but
-	// first read just those 4 bytes to see if it exists.
-	if _, err := io.ReadFull(r, buf[:4]); err != nil {
-		return err
-	}
-	off := 0
-	maybeSig := readBuf(buf[:4])
-	if maybeSig.uint32() != dataDescriptorSignature {
-		// No data descriptor signature. Keep these four
-		// bytes.
-		off += 4
-	}
-	if _, err := io.ReadFull(r, buf[off:12]); err != nil {
-		return err
-	}
-	b := readBuf(buf[:12])
-	if b.uint32() != f.CRC32 {
-		return ErrChecksum
-	}
-
-	// The two sizes that follow here can be either 32 bits or 64 bits
-	// but the spec is not very clear on this and different
-	// interpretations has been made causing incompatibilities. We
-	// already have the sizes from the central directory so we can
-	// just ignore these.
-
-	return nil
-}
-
-func readDirectoryEnd(r io.ReaderAt, size int64) (dir *directoryEnd, err error) {
-	// look for directoryEndSignature in the last 1k, then in the last 65k
-	var buf []byte
-	var directoryEndOffset int64
-	for i, bLen := range []int64{1024, 65 * 1024} {
-		if bLen > size {
-			bLen = size
-		}
-		buf = make([]byte, int(bLen))
-		if _, err := r.ReadAt(buf, size-bLen); err != nil && err != io.EOF {
-			return nil, err
-		}
-		if p := findSignatureInBlock(buf); p >= 0 {
-			buf = buf[p:]
-			directoryEndOffset = size - bLen + int64(p)
-			break
-		}
-		if i == 1 || bLen == size {
-			return nil, ErrFormat
-		}
-	}
-
-	// read header into struct
-	b := readBuf(buf[4:]) // skip signature
-	d := &directoryEnd{
-		diskNbr:            uint32(b.uint16()),
-		dirDiskNbr:         uint32(b.uint16()),
-		dirRecordsThisDisk: uint64(b.uint16()),
-		directoryRecords:   uint64(b.uint16()),
-		directorySize:      uint64(b.uint32()),
-		directoryOffset:    uint64(b.uint32()),
-		commentLen:         b.uint16(),
-	}
-	l := int(d.commentLen)
-	if l > len(b) {
-		return nil, errors.New("zip: invalid comment length")
-	}
-	d.comment = string(b[:l])
-
-	p, err := findDirectory64End(r, directoryEndOffset)
-	if err == nil && p >= 0 {
-		err = readDirectory64End(r, p, d)
-	}
-	if err != nil {
-		return nil, err
-	}
-
-	// Make sure directoryOffset points to somewhere in our file.
-	if o := int64(d.directoryOffset); o < 0 || o >= size {
-		return nil, ErrFormat
-	}
-	return d, nil
-}
-
-// findDirectory64End tries to read the zip64 locator just before the
-// directory end and returns the offset of the zip64 directory end if
-// found.
-func findDirectory64End(r io.ReaderAt, directoryEndOffset int64) (int64, error) {
-	locOffset := directoryEndOffset - directory64LocLen
-	if locOffset < 0 {
-		return -1, nil // no need to look for a header outside the file
-	}
-	buf := make([]byte, directory64LocLen)
-	if _, err := r.ReadAt(buf, locOffset); err != nil {
-		return -1, err
-	}
-	b := readBuf(buf)
-	if sig := b.uint32(); sig != directory64LocSignature {
-		return -1, nil
-	}
-	b = b[4:]       // skip number of the disk with the start of the zip64 end of central directory
-	p := b.uint64() // relative offset of the zip64 end of central directory record
-	return int64(p), nil
-}
-
-// readDirectory64End reads the zip64 directory end and updates the
-// directory end with the zip64 directory end values.
-func readDirectory64End(r io.ReaderAt, offset int64, d *directoryEnd) (err error) {
-	buf := make([]byte, directory64EndLen)
-	if _, err := r.ReadAt(buf, offset); err != nil {
-		return err
-	}
-
-	b := readBuf(buf)
-	if sig := b.uint32(); sig != directory64EndSignature {
-		return ErrFormat
-	}
-
-	b = b[12:]                        // skip dir size, version and version needed (uint64 + 2x uint16)
-	d.diskNbr = b.uint32()            // number of this disk
-	d.dirDiskNbr = b.uint32()         // number of the disk with the start of the central directory
-	d.dirRecordsThisDisk = b.uint64() // total number of entries in the central directory on this disk
-	d.directoryRecords = b.uint64()   // total number of entries in the central directory
-	d.directorySize = b.uint64()      // size of the central directory
-	d.directoryOffset = b.uint64()    // offset of start of central directory with respect to the starting disk number
-
-	return nil
-}
-
-func findSignatureInBlock(b []byte) int {
-	for i := len(b) - directoryEndLen; i >= 0; i-- {
-		// defined from directoryEndSignature in struct.go
-		if b[i] == 'P' && b[i+1] == 'K' && b[i+2] == 0x05 && b[i+3] == 0x06 {
-			// n is length of comment
-			n := int(b[i+directoryEndLen-2]) | int(b[i+directoryEndLen-1])<<8
-			if n+directoryEndLen+i <= len(b) {
-				return i
-			}
-		}
-	}
-	return -1
-}
-
-type readBuf []byte
-
-func (b *readBuf) uint16() uint16 {
-	v := binary.LittleEndian.Uint16(*b)
-	*b = (*b)[2:]
-	return v
-}
-
-func (b *readBuf) uint32() uint32 {
-	v := binary.LittleEndian.Uint32(*b)
-	*b = (*b)[4:]
-	return v
-}
-
-func (b *readBuf) uint64() uint64 {
-	v := binary.LittleEndian.Uint64(*b)
-	*b = (*b)[8:]
-	return v
-}
diff --git a/third_party/gofrontend/libgo/go/archive/zip/reader_test.go b/third_party/gofrontend/libgo/go/archive/zip/reader_test.go
deleted file mode 100644
index 547dd39..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/reader_test.go
+++ /dev/null
@@ -1,607 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package zip
-
-import (
-	"bytes"
-	"encoding/binary"
-	"encoding/hex"
-	"io"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"regexp"
-	"strings"
-	"testing"
-	"time"
-)
-
-type ZipTest struct {
-	Name    string
-	Source  func() (r io.ReaderAt, size int64) // if non-nil, used instead of testdata/<Name> file
-	Comment string
-	File    []ZipTestFile
-	Error   error // the error that Opening this file should return
-}
-
-type ZipTestFile struct {
-	Name       string
-	Content    []byte // if blank, will attempt to compare against File
-	ContentErr error
-	File       string // name of file to compare to (relative to testdata/)
-	Mtime      string // modified time in format "mm-dd-yy hh:mm:ss"
-	Mode       os.FileMode
-}
-
-// Caution: The Mtime values found for the test files should correspond to
-//          the values listed with unzip -l <zipfile>. However, the values
-//          listed by unzip appear to be off by some hours. When creating
-//          fresh test files and testing them, this issue is not present.
-//          The test files were created in Sydney, so there might be a time
-//          zone issue. The time zone information does have to be encoded
-//          somewhere, because otherwise unzip -l could not provide a different
-//          time from what the archive/zip package provides, but there appears
-//          to be no documentation about this.
-
-var tests = []ZipTest{
-	{
-		Name:    "test.zip",
-		Comment: "This is a zipfile comment.",
-		File: []ZipTestFile{
-			{
-				Name:    "test.txt",
-				Content: []byte("This is a test text file.\n"),
-				Mtime:   "09-05-10 12:12:02",
-				Mode:    0644,
-			},
-			{
-				Name:  "gophercolor16x16.png",
-				File:  "gophercolor16x16.png",
-				Mtime: "09-05-10 15:52:58",
-				Mode:  0644,
-			},
-		},
-	},
-	{
-		Name:    "test-trailing-junk.zip",
-		Comment: "This is a zipfile comment.",
-		File: []ZipTestFile{
-			{
-				Name:    "test.txt",
-				Content: []byte("This is a test text file.\n"),
-				Mtime:   "09-05-10 12:12:02",
-				Mode:    0644,
-			},
-			{
-				Name:  "gophercolor16x16.png",
-				File:  "gophercolor16x16.png",
-				Mtime: "09-05-10 15:52:58",
-				Mode:  0644,
-			},
-		},
-	},
-	{
-		Name:   "r.zip",
-		Source: returnRecursiveZip,
-		File: []ZipTestFile{
-			{
-				Name:    "r/r.zip",
-				Content: rZipBytes(),
-				Mtime:   "03-04-10 00:24:16",
-				Mode:    0666,
-			},
-		},
-	},
-	{
-		Name: "symlink.zip",
-		File: []ZipTestFile{
-			{
-				Name:    "symlink",
-				Content: []byte("../target"),
-				Mode:    0777 | os.ModeSymlink,
-			},
-		},
-	},
-	{
-		Name: "readme.zip",
-	},
-	{
-		Name:  "readme.notzip",
-		Error: ErrFormat,
-	},
-	{
-		Name: "dd.zip",
-		File: []ZipTestFile{
-			{
-				Name:    "filename",
-				Content: []byte("This is a test textfile.\n"),
-				Mtime:   "02-02-11 13:06:20",
-				Mode:    0666,
-			},
-		},
-	},
-	{
-		// created in windows XP file manager.
-		Name: "winxp.zip",
-		File: crossPlatform,
-	},
-	{
-		// created by Zip 3.0 under Linux
-		Name: "unix.zip",
-		File: crossPlatform,
-	},
-	{
-		// created by Go, before we wrote the "optional" data
-		// descriptor signatures (which are required by OS X)
-		Name: "go-no-datadesc-sig.zip",
-		File: []ZipTestFile{
-			{
-				Name:    "foo.txt",
-				Content: []byte("foo\n"),
-				Mtime:   "03-08-12 16:59:10",
-				Mode:    0644,
-			},
-			{
-				Name:    "bar.txt",
-				Content: []byte("bar\n"),
-				Mtime:   "03-08-12 16:59:12",
-				Mode:    0644,
-			},
-		},
-	},
-	{
-		// created by Go, after we wrote the "optional" data
-		// descriptor signatures (which are required by OS X)
-		Name: "go-with-datadesc-sig.zip",
-		File: []ZipTestFile{
-			{
-				Name:    "foo.txt",
-				Content: []byte("foo\n"),
-				Mode:    0666,
-			},
-			{
-				Name:    "bar.txt",
-				Content: []byte("bar\n"),
-				Mode:    0666,
-			},
-		},
-	},
-	{
-		Name:   "Bad-CRC32-in-data-descriptor",
-		Source: returnCorruptCRC32Zip,
-		File: []ZipTestFile{
-			{
-				Name:       "foo.txt",
-				Content:    []byte("foo\n"),
-				Mode:       0666,
-				ContentErr: ErrChecksum,
-			},
-			{
-				Name:    "bar.txt",
-				Content: []byte("bar\n"),
-				Mode:    0666,
-			},
-		},
-	},
-	// Tests that we verify (and accept valid) crc32s on files
-	// with crc32s in their file header (not in data descriptors)
-	{
-		Name: "crc32-not-streamed.zip",
-		File: []ZipTestFile{
-			{
-				Name:    "foo.txt",
-				Content: []byte("foo\n"),
-				Mtime:   "03-08-12 16:59:10",
-				Mode:    0644,
-			},
-			{
-				Name:    "bar.txt",
-				Content: []byte("bar\n"),
-				Mtime:   "03-08-12 16:59:12",
-				Mode:    0644,
-			},
-		},
-	},
-	// Tests that we verify (and reject invalid) crc32s on files
-	// with crc32s in their file header (not in data descriptors)
-	{
-		Name:   "crc32-not-streamed.zip",
-		Source: returnCorruptNotStreamedZip,
-		File: []ZipTestFile{
-			{
-				Name:       "foo.txt",
-				Content:    []byte("foo\n"),
-				Mtime:      "03-08-12 16:59:10",
-				Mode:       0644,
-				ContentErr: ErrChecksum,
-			},
-			{
-				Name:    "bar.txt",
-				Content: []byte("bar\n"),
-				Mtime:   "03-08-12 16:59:12",
-				Mode:    0644,
-			},
-		},
-	},
-	{
-		Name: "zip64.zip",
-		File: []ZipTestFile{
-			{
-				Name:    "README",
-				Content: []byte("This small file is in ZIP64 format.\n"),
-				Mtime:   "08-10-12 14:33:32",
-				Mode:    0644,
-			},
-		},
-	},
-	// Another zip64 file with different Extras fields. (golang.org/issue/7069)
-	{
-		Name: "zip64-2.zip",
-		File: []ZipTestFile{
-			{
-				Name:    "README",
-				Content: []byte("This small file is in ZIP64 format.\n"),
-				Mtime:   "08-10-12 14:33:32",
-				Mode:    0644,
-			},
-		},
-	},
-}
-
-var crossPlatform = []ZipTestFile{
-	{
-		Name:    "hello",
-		Content: []byte("world \r\n"),
-		Mode:    0666,
-	},
-	{
-		Name:    "dir/bar",
-		Content: []byte("foo \r\n"),
-		Mode:    0666,
-	},
-	{
-		Name:    "dir/empty/",
-		Content: []byte{},
-		Mode:    os.ModeDir | 0777,
-	},
-	{
-		Name:    "readonly",
-		Content: []byte("important \r\n"),
-		Mode:    0444,
-	},
-}
-
-func TestReader(t *testing.T) {
-	for _, zt := range tests {
-		readTestZip(t, zt)
-	}
-}
-
-func readTestZip(t *testing.T, zt ZipTest) {
-	var z *Reader
-	var err error
-	if zt.Source != nil {
-		rat, size := zt.Source()
-		z, err = NewReader(rat, size)
-	} else {
-		var rc *ReadCloser
-		rc, err = OpenReader(filepath.Join("testdata", zt.Name))
-		if err == nil {
-			defer rc.Close()
-			z = &rc.Reader
-		}
-	}
-	if err != zt.Error {
-		t.Errorf("%s: error=%v, want %v", zt.Name, err, zt.Error)
-		return
-	}
-
-	// bail if file is not zip
-	if err == ErrFormat {
-		return
-	}
-
-	// bail here if no Files expected to be tested
-	// (there may actually be files in the zip, but we don't care)
-	if zt.File == nil {
-		return
-	}
-
-	if z.Comment != zt.Comment {
-		t.Errorf("%s: comment=%q, want %q", zt.Name, z.Comment, zt.Comment)
-	}
-	if len(z.File) != len(zt.File) {
-		t.Fatalf("%s: file count=%d, want %d", zt.Name, len(z.File), len(zt.File))
-	}
-
-	// test read of each file
-	for i, ft := range zt.File {
-		readTestFile(t, zt, ft, z.File[i])
-	}
-
-	// test simultaneous reads
-	n := 0
-	done := make(chan bool)
-	for i := 0; i < 5; i++ {
-		for j, ft := range zt.File {
-			go func(j int, ft ZipTestFile) {
-				readTestFile(t, zt, ft, z.File[j])
-				done <- true
-			}(j, ft)
-			n++
-		}
-	}
-	for ; n > 0; n-- {
-		<-done
-	}
-}
-
-func readTestFile(t *testing.T, zt ZipTest, ft ZipTestFile, f *File) {
-	if f.Name != ft.Name {
-		t.Errorf("%s: name=%q, want %q", zt.Name, f.Name, ft.Name)
-	}
-
-	if ft.Mtime != "" {
-		mtime, err := time.Parse("01-02-06 15:04:05", ft.Mtime)
-		if err != nil {
-			t.Error(err)
-			return
-		}
-		if ft := f.ModTime(); !ft.Equal(mtime) {
-			t.Errorf("%s: %s: mtime=%s, want %s", zt.Name, f.Name, ft, mtime)
-		}
-	}
-
-	testFileMode(t, zt.Name, f, ft.Mode)
-
-	var b bytes.Buffer
-	r, err := f.Open()
-	if err != nil {
-		t.Errorf("%s: %v", zt.Name, err)
-		return
-	}
-
-	_, err = io.Copy(&b, r)
-	if err != ft.ContentErr {
-		t.Errorf("%s: copying contents: %v (want %v)", zt.Name, err, ft.ContentErr)
-	}
-	if err != nil {
-		return
-	}
-	r.Close()
-
-	size := uint64(f.UncompressedSize)
-	if size == uint32max {
-		size = f.UncompressedSize64
-	}
-	if g := uint64(b.Len()); g != size {
-		t.Errorf("%v: read %v bytes but f.UncompressedSize == %v", f.Name, g, size)
-	}
-
-	var c []byte
-	if ft.Content != nil {
-		c = ft.Content
-	} else if c, err = ioutil.ReadFile("testdata/" + ft.File); err != nil {
-		t.Error(err)
-		return
-	}
-
-	if b.Len() != len(c) {
-		t.Errorf("%s: len=%d, want %d", f.Name, b.Len(), len(c))
-		return
-	}
-
-	for i, b := range b.Bytes() {
-		if b != c[i] {
-			t.Errorf("%s: content[%d]=%q want %q", f.Name, i, b, c[i])
-			return
-		}
-	}
-}
-
-func testFileMode(t *testing.T, zipName string, f *File, want os.FileMode) {
-	mode := f.Mode()
-	if want == 0 {
-		t.Errorf("%s: %s mode: got %v, want none", zipName, f.Name, mode)
-	} else if mode != want {
-		t.Errorf("%s: %s mode: want %v, got %v", zipName, f.Name, want, mode)
-	}
-}
-
-func TestInvalidFiles(t *testing.T) {
-	const size = 1024 * 70 // 70kb
-	b := make([]byte, size)
-
-	// zeroes
-	_, err := NewReader(bytes.NewReader(b), size)
-	if err != ErrFormat {
-		t.Errorf("zeroes: error=%v, want %v", err, ErrFormat)
-	}
-
-	// repeated directoryEndSignatures
-	sig := make([]byte, 4)
-	binary.LittleEndian.PutUint32(sig, directoryEndSignature)
-	for i := 0; i < size-4; i += 4 {
-		copy(b[i:i+4], sig)
-	}
-	_, err = NewReader(bytes.NewReader(b), size)
-	if err != ErrFormat {
-		t.Errorf("sigs: error=%v, want %v", err, ErrFormat)
-	}
-}
-
-func messWith(fileName string, corrupter func(b []byte)) (r io.ReaderAt, size int64) {
-	data, err := ioutil.ReadFile(filepath.Join("testdata", fileName))
-	if err != nil {
-		panic("Error reading " + fileName + ": " + err.Error())
-	}
-	corrupter(data)
-	return bytes.NewReader(data), int64(len(data))
-}
-
-func returnCorruptCRC32Zip() (r io.ReaderAt, size int64) {
-	return messWith("go-with-datadesc-sig.zip", func(b []byte) {
-		// Corrupt one of the CRC32s in the data descriptor:
-		b[0x2d]++
-	})
-}
-
-func returnCorruptNotStreamedZip() (r io.ReaderAt, size int64) {
-	return messWith("crc32-not-streamed.zip", func(b []byte) {
-		// Corrupt foo.txt's final crc32 byte, in both
-		// the file header and TOC. (0x7e -> 0x7f)
-		b[0x11]++
-		b[0x9d]++
-
-		// TODO(bradfitz): add a new test that only corrupts
-		// one of these values, and verify that that's also an
-		// error. Currently, the reader code doesn't verify the
-		// fileheader and TOC's crc32 match if they're both
-		// non-zero and only the second line above, the TOC,
-		// is what matters.
-	})
-}
-
-// rZipBytes returns the bytes of a recursive zip file, without
-// putting it on disk and triggering certain virus scanners.
-func rZipBytes() []byte {
-	s := `
-0000000 50 4b 03 04 14 00 00 00 08 00 08 03 64 3c f9 f4
-0000010 89 64 48 01 00 00 b8 01 00 00 07 00 00 00 72 2f
-0000020 72 2e 7a 69 70 00 25 00 da ff 50 4b 03 04 14 00
-0000030 00 00 08 00 08 03 64 3c f9 f4 89 64 48 01 00 00
-0000040 b8 01 00 00 07 00 00 00 72 2f 72 2e 7a 69 70 00
-0000050 2f 00 d0 ff 00 25 00 da ff 50 4b 03 04 14 00 00
-0000060 00 08 00 08 03 64 3c f9 f4 89 64 48 01 00 00 b8
-0000070 01 00 00 07 00 00 00 72 2f 72 2e 7a 69 70 00 2f
-0000080 00 d0 ff c2 54 8e 57 39 00 05 00 fa ff c2 54 8e
-0000090 57 39 00 05 00 fa ff 00 05 00 fa ff 00 14 00 eb
-00000a0 ff c2 54 8e 57 39 00 05 00 fa ff 00 05 00 fa ff
-00000b0 00 14 00 eb ff 42 88 21 c4 00 00 14 00 eb ff 42
-00000c0 88 21 c4 00 00 14 00 eb ff 42 88 21 c4 00 00 14
-00000d0 00 eb ff 42 88 21 c4 00 00 14 00 eb ff 42 88 21
-00000e0 c4 00 00 00 00 ff ff 00 00 00 ff ff 00 34 00 cb
-00000f0 ff 42 88 21 c4 00 00 00 00 ff ff 00 00 00 ff ff
-0000100 00 34 00 cb ff 42 e8 21 5e 0f 00 00 00 ff ff 0a
-0000110 f0 66 64 12 61 c0 15 dc e8 a0 48 bf 48 af 2a b3
-0000120 20 c0 9b 95 0d c4 67 04 42 53 06 06 06 40 00 06
-0000130 00 f9 ff 6d 01 00 00 00 00 42 e8 21 5e 0f 00 00
-0000140 00 ff ff 0a f0 66 64 12 61 c0 15 dc e8 a0 48 bf
-0000150 48 af 2a b3 20 c0 9b 95 0d c4 67 04 42 53 06 06
-0000160 06 40 00 06 00 f9 ff 6d 01 00 00 00 00 50 4b 01
-0000170 02 14 00 14 00 00 00 08 00 08 03 64 3c f9 f4 89
-0000180 64 48 01 00 00 b8 01 00 00 07 00 00 00 00 00 00
-0000190 00 00 00 00 00 00 00 00 00 00 00 72 2f 72 2e 7a
-00001a0 69 70 50 4b 05 06 00 00 00 00 01 00 01 00 35 00
-00001b0 00 00 6d 01 00 00 00 00`
-	s = regexp.MustCompile(`[0-9a-f]{7}`).ReplaceAllString(s, "")
-	s = regexp.MustCompile(`\s+`).ReplaceAllString(s, "")
-	b, err := hex.DecodeString(s)
-	if err != nil {
-		panic(err)
-	}
-	return b
-}
-
-func returnRecursiveZip() (r io.ReaderAt, size int64) {
-	b := rZipBytes()
-	return bytes.NewReader(b), int64(len(b))
-}
-
-func TestIssue8186(t *testing.T) {
-	// Directory headers & data found in the TOC of a JAR file.
-	dirEnts := []string{
-		"PK\x01\x02\n\x00\n\x00\x00\b\x00\x004\x9d3?\xaa\x1b\x06\xf0\x81\x02\x00\x00\x81\x02\x00\x00-\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00res/drawable-xhdpi-v4/ic_actionbar_accept.png\xfe\xca\x00\x00\x00",
-		"PK\x01\x02\n\x00\n\x00\x00\b\x00\x004\x9d3?\x90K\x89\xc7t\n\x00\x00t\n\x00\x00\x0e\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x02\x00\x00resources.arsc\x00\x00\x00",
-		"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?\xff$\x18\xed3\x03\x00\x00\xb4\b\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t\r\x00\x00AndroidManifest.xml",
-		"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?\x14\xc5K\xab\x192\x02\x00\xc8\xcd\x04\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x10\x00\x00classes.dex",
-		"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?E\x96\nD\xac\x01\x00\x00P\x03\x00\x00&\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:C\x02\x00res/layout/actionbar_set_wallpaper.xml",
-		"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?Ļ\x14\xe3\xd8\x01\x00\x00\xd8\x03\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:E\x02\x00res/layout/wallpaper_cropper.xml",
-		"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?}\xc1\x15\x9eZ\x01\x00\x00!\x02\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`G\x02\x00META-INF/MANIFEST.MF",
-		"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?\xe6\x98Ьo\x01\x00\x00\x84\x02\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfcH\x02\x00META-INF/CERT.SF",
-		"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?\xbfP\x96b\x86\x04\x00\x00\xb2\x06\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9J\x02\x00META-INF/CERT.RSA",
-	}
-	for i, s := range dirEnts {
-		var f File
-		err := readDirectoryHeader(&f, strings.NewReader(s))
-		if err != nil {
-			t.Errorf("error reading #%d: %v", i, err)
-		}
-	}
-}
-
-// Verify we return ErrUnexpectedEOF when length is short.
-func TestIssue10957(t *testing.T) {
-	data := []byte("PK\x03\x040000000PK\x01\x0200000" +
-		"0000000000000000000\x00" +
-		"\x00\x00\x00\x00\x00000000000000PK\x01" +
-		"\x020000000000000000000" +
-		"00000\v\x00\x00\x00\x00\x00000000000" +
-		"00000000000000PK\x01\x0200" +
-		"00000000000000000000" +
-		"00\v\x00\x00\x00\x00\x00000000000000" +
-		"00000000000PK\x01\x020000<" +
-		"0\x00\x0000000000000000\v\x00\v" +
-		"\x00\x00\x00\x00\x0000000000\x00\x00\x00\x00000" +
-		"00000000PK\x01\x0200000000" +
-		"0000000000000000\v\x00\x00\x00" +
-		"\x00\x0000PK\x05\x06000000\x05\x000000" +
-		"\v\x00\x00\x00\x00\x00")
-	z, err := NewReader(bytes.NewReader(data), int64(len(data)))
-	if err != nil {
-		t.Fatal(err)
-	}
-	for i, f := range z.File {
-		r, err := f.Open()
-		if err != nil {
-			continue
-		}
-		if f.UncompressedSize64 < 1e6 {
-			n, err := io.Copy(ioutil.Discard, r)
-			if i == 3 && err != io.ErrUnexpectedEOF {
-				t.Errorf("File[3] error = %v; want io.ErrUnexpectedEOF", err)
-			}
-			if err == nil && uint64(n) != f.UncompressedSize64 {
-				t.Errorf("file %d: bad size: copied=%d; want=%d", i, n, f.UncompressedSize64)
-			}
-		}
-		r.Close()
-	}
-}
-
-// Verify the number of files is sane.
-func TestIssue10956(t *testing.T) {
-	data := []byte("PK\x06\x06PK\x06\a0000\x00\x00\x00\x00\x00\x00\x00\x00" +
-		"0000PK\x05\x06000000000000" +
-		"0000\v\x00000\x00\x00\x00\x00\x00\x00\x000")
-	_, err := NewReader(bytes.NewReader(data), int64(len(data)))
-	const want = "TOC declares impossible 3472328296227680304 files in 57 byte"
-	if err == nil && !strings.Contains(err.Error(), want) {
-		t.Errorf("error = %v; want %q", err, want)
-	}
-}
-
-// Verify we return ErrUnexpectedEOF when reading truncated data descriptor.
-func TestIssue11146(t *testing.T) {
-	data := []byte("PK\x03\x040000000000000000" +
-		"000000\x01\x00\x00\x000\x01\x00\x00\xff\xff0000" +
-		"0000000000000000PK\x01\x02" +
-		"0000\b0\b\x00000000000000" +
-		"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000000PK\x05\x06\x00\x00" +
-		"\x00\x0000\x01\x0000008\x00\x00\x00\x00\x00")
-	z, err := NewReader(bytes.NewReader(data), int64(len(data)))
-	if err != nil {
-		t.Fatal(err)
-	}
-	r, err := z.File[0].Open()
-	if err != nil {
-		t.Fatal(err)
-	}
-	_, err = ioutil.ReadAll(r)
-	if err != io.ErrUnexpectedEOF {
-		t.Errorf("File[0] error = %v; want io.ErrUnexpectedEOF", err)
-	}
-	r.Close()
-}
diff --git a/third_party/gofrontend/libgo/go/archive/zip/register.go b/third_party/gofrontend/libgo/go/archive/zip/register.go
deleted file mode 100644
index 4211ec7..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/register.go
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package zip
-
-import (
-	"compress/flate"
-	"errors"
-	"io"
-	"io/ioutil"
-	"sync"
-)
-
-// A Compressor returns a compressing writer, writing to the
-// provided writer. On Close, any pending data should be flushed.
-type Compressor func(io.Writer) (io.WriteCloser, error)
-
-// Decompressor is a function that wraps a Reader with a decompressing Reader.
-// The decompressed ReadCloser is returned to callers who open files from
-// within the archive.  These callers are responsible for closing this reader
-// when they're finished reading.
-type Decompressor func(io.Reader) io.ReadCloser
-
-var flateWriterPool sync.Pool
-
-func newFlateWriter(w io.Writer) io.WriteCloser {
-	fw, ok := flateWriterPool.Get().(*flate.Writer)
-	if ok {
-		fw.Reset(w)
-	} else {
-		fw, _ = flate.NewWriter(w, 5)
-	}
-	return &pooledFlateWriter{fw: fw}
-}
-
-type pooledFlateWriter struct {
-	mu sync.Mutex // guards Close and Write
-	fw *flate.Writer
-}
-
-func (w *pooledFlateWriter) Write(p []byte) (n int, err error) {
-	w.mu.Lock()
-	defer w.mu.Unlock()
-	if w.fw == nil {
-		return 0, errors.New("Write after Close")
-	}
-	return w.fw.Write(p)
-}
-
-func (w *pooledFlateWriter) Close() error {
-	w.mu.Lock()
-	defer w.mu.Unlock()
-	var err error
-	if w.fw != nil {
-		err = w.fw.Close()
-		flateWriterPool.Put(w.fw)
-		w.fw = nil
-	}
-	return err
-}
-
-var (
-	mu sync.RWMutex // guards compressor and decompressor maps
-
-	compressors = map[uint16]Compressor{
-		Store:   func(w io.Writer) (io.WriteCloser, error) { return &nopCloser{w}, nil },
-		Deflate: func(w io.Writer) (io.WriteCloser, error) { return newFlateWriter(w), nil },
-	}
-
-	decompressors = map[uint16]Decompressor{
-		Store:   ioutil.NopCloser,
-		Deflate: flate.NewReader,
-	}
-)
-
-// RegisterDecompressor allows custom decompressors for a specified method ID.
-func RegisterDecompressor(method uint16, d Decompressor) {
-	mu.Lock()
-	defer mu.Unlock()
-
-	if _, ok := decompressors[method]; ok {
-		panic("decompressor already registered")
-	}
-	decompressors[method] = d
-}
-
-// RegisterCompressor registers custom compressors for a specified method ID.
-// The common methods Store and Deflate are built in.
-func RegisterCompressor(method uint16, comp Compressor) {
-	mu.Lock()
-	defer mu.Unlock()
-
-	if _, ok := compressors[method]; ok {
-		panic("compressor already registered")
-	}
-	compressors[method] = comp
-}
-
-func compressor(method uint16) Compressor {
-	mu.RLock()
-	defer mu.RUnlock()
-	return compressors[method]
-}
-
-func decompressor(method uint16) Decompressor {
-	mu.RLock()
-	defer mu.RUnlock()
-	return decompressors[method]
-}
diff --git a/third_party/gofrontend/libgo/go/archive/zip/struct.go b/third_party/gofrontend/libgo/go/archive/zip/struct.go
deleted file mode 100644
index 137d049..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/struct.go
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package zip provides support for reading and writing ZIP archives.
-
-See: http://www.pkware.com/documents/casestudies/APPNOTE.TXT
-
-This package does not support disk spanning.
-
-A note about ZIP64:
-
-To be backwards compatible the FileHeader has both 32 and 64 bit Size
-fields. The 64 bit fields will always contain the correct value and
-for normal archives both fields will be the same. For files requiring
-the ZIP64 format the 32 bit fields will be 0xffffffff and the 64 bit
-fields must be used instead.
-*/
-package zip
-
-import (
-	"os"
-	"path"
-	"time"
-)
-
-// Compression methods.
-const (
-	Store   uint16 = 0
-	Deflate uint16 = 8
-)
-
-const (
-	fileHeaderSignature      = 0x04034b50
-	directoryHeaderSignature = 0x02014b50
-	directoryEndSignature    = 0x06054b50
-	directory64LocSignature  = 0x07064b50
-	directory64EndSignature  = 0x06064b50
-	dataDescriptorSignature  = 0x08074b50 // de-facto standard; required by OS X Finder
-	fileHeaderLen            = 30         // + filename + extra
-	directoryHeaderLen       = 46         // + filename + extra + comment
-	directoryEndLen          = 22         // + comment
-	dataDescriptorLen        = 16         // four uint32: descriptor signature, crc32, compressed size, size
-	dataDescriptor64Len      = 24         // descriptor with 8 byte sizes
-	directory64LocLen        = 20         //
-	directory64EndLen        = 56         // + extra
-
-	// Constants for the first byte in CreatorVersion
-	creatorFAT    = 0
-	creatorUnix   = 3
-	creatorNTFS   = 11
-	creatorVFAT   = 14
-	creatorMacOSX = 19
-
-	// version numbers
-	zipVersion20 = 20 // 2.0
-	zipVersion45 = 45 // 4.5 (reads and writes zip64 archives)
-
-	// limits for non zip64 files
-	uint16max = (1 << 16) - 1
-	uint32max = (1 << 32) - 1
-
-	// extra header id's
-	zip64ExtraId = 0x0001 // zip64 Extended Information Extra Field
-)
-
-// FileHeader describes a file within a zip file.
-// See the zip spec for details.
-type FileHeader struct {
-	// Name is the name of the file.
-	// It must be a relative path: it must not start with a drive
-	// letter (e.g. C:) or leading slash, and only forward slashes
-	// are allowed.
-	Name string
-
-	CreatorVersion     uint16
-	ReaderVersion      uint16
-	Flags              uint16
-	Method             uint16
-	ModifiedTime       uint16 // MS-DOS time
-	ModifiedDate       uint16 // MS-DOS date
-	CRC32              uint32
-	CompressedSize     uint32 // Deprecated: Use CompressedSize64 instead.
-	UncompressedSize   uint32 // Deprecated: Use UncompressedSize64 instead.
-	CompressedSize64   uint64
-	UncompressedSize64 uint64
-	Extra              []byte
-	ExternalAttrs      uint32 // Meaning depends on CreatorVersion
-	Comment            string
-}
-
-// FileInfo returns an os.FileInfo for the FileHeader.
-func (h *FileHeader) FileInfo() os.FileInfo {
-	return headerFileInfo{h}
-}
-
-// headerFileInfo implements os.FileInfo.
-type headerFileInfo struct {
-	fh *FileHeader
-}
-
-func (fi headerFileInfo) Name() string { return path.Base(fi.fh.Name) }
-func (fi headerFileInfo) Size() int64 {
-	if fi.fh.UncompressedSize64 > 0 {
-		return int64(fi.fh.UncompressedSize64)
-	}
-	return int64(fi.fh.UncompressedSize)
-}
-func (fi headerFileInfo) IsDir() bool        { return fi.Mode().IsDir() }
-func (fi headerFileInfo) ModTime() time.Time { return fi.fh.ModTime() }
-func (fi headerFileInfo) Mode() os.FileMode  { return fi.fh.Mode() }
-func (fi headerFileInfo) Sys() interface{}   { return fi.fh }
-
-// FileInfoHeader creates a partially-populated FileHeader from an
-// os.FileInfo.
-// Because os.FileInfo's Name method returns only the base name of
-// the file it describes, it may be necessary to modify the Name field
-// of the returned header to provide the full path name of the file.
-func FileInfoHeader(fi os.FileInfo) (*FileHeader, error) {
-	size := fi.Size()
-	fh := &FileHeader{
-		Name:               fi.Name(),
-		UncompressedSize64: uint64(size),
-	}
-	fh.SetModTime(fi.ModTime())
-	fh.SetMode(fi.Mode())
-	if fh.UncompressedSize64 > uint32max {
-		fh.UncompressedSize = uint32max
-	} else {
-		fh.UncompressedSize = uint32(fh.UncompressedSize64)
-	}
-	return fh, nil
-}
-
-type directoryEnd struct {
-	diskNbr            uint32 // unused
-	dirDiskNbr         uint32 // unused
-	dirRecordsThisDisk uint64 // unused
-	directoryRecords   uint64
-	directorySize      uint64
-	directoryOffset    uint64 // relative to file
-	commentLen         uint16
-	comment            string
-}
-
-// msDosTimeToTime converts an MS-DOS date and time into a time.Time.
-// The resolution is 2s.
-// See: http://msdn.microsoft.com/en-us/library/ms724247(v=VS.85).aspx
-func msDosTimeToTime(dosDate, dosTime uint16) time.Time {
-	return time.Date(
-		// date bits 0-4: day of month; 5-8: month; 9-15: years since 1980
-		int(dosDate>>9+1980),
-		time.Month(dosDate>>5&0xf),
-		int(dosDate&0x1f),
-
-		// time bits 0-4: second/2; 5-10: minute; 11-15: hour
-		int(dosTime>>11),
-		int(dosTime>>5&0x3f),
-		int(dosTime&0x1f*2),
-		0, // nanoseconds
-
-		time.UTC,
-	)
-}
-
-// timeToMsDosTime converts a time.Time to an MS-DOS date and time.
-// The resolution is 2s.
-// See: http://msdn.microsoft.com/en-us/library/ms724274(v=VS.85).aspx
-func timeToMsDosTime(t time.Time) (fDate uint16, fTime uint16) {
-	t = t.In(time.UTC)
-	fDate = uint16(t.Day() + int(t.Month())<<5 + (t.Year()-1980)<<9)
-	fTime = uint16(t.Second()/2 + t.Minute()<<5 + t.Hour()<<11)
-	return
-}
-
-// ModTime returns the modification time in UTC.
-// The resolution is 2s.
-func (h *FileHeader) ModTime() time.Time {
-	return msDosTimeToTime(h.ModifiedDate, h.ModifiedTime)
-}
-
-// SetModTime sets the ModifiedTime and ModifiedDate fields to the given time in UTC.
-// The resolution is 2s.
-func (h *FileHeader) SetModTime(t time.Time) {
-	h.ModifiedDate, h.ModifiedTime = timeToMsDosTime(t)
-}
-
-const (
-	// Unix constants. The specification doesn't mention them,
-	// but these seem to be the values agreed on by tools.
-	s_IFMT   = 0xf000
-	s_IFSOCK = 0xc000
-	s_IFLNK  = 0xa000
-	s_IFREG  = 0x8000
-	s_IFBLK  = 0x6000
-	s_IFDIR  = 0x4000
-	s_IFCHR  = 0x2000
-	s_IFIFO  = 0x1000
-	s_ISUID  = 0x800
-	s_ISGID  = 0x400
-	s_ISVTX  = 0x200
-
-	msdosDir      = 0x10
-	msdosReadOnly = 0x01
-)
-
-// Mode returns the permission and mode bits for the FileHeader.
-func (h *FileHeader) Mode() (mode os.FileMode) {
-	switch h.CreatorVersion >> 8 {
-	case creatorUnix, creatorMacOSX:
-		mode = unixModeToFileMode(h.ExternalAttrs >> 16)
-	case creatorNTFS, creatorVFAT, creatorFAT:
-		mode = msdosModeToFileMode(h.ExternalAttrs)
-	}
-	if len(h.Name) > 0 && h.Name[len(h.Name)-1] == '/' {
-		mode |= os.ModeDir
-	}
-	return mode
-}
-
-// SetMode changes the permission and mode bits for the FileHeader.
-func (h *FileHeader) SetMode(mode os.FileMode) {
-	h.CreatorVersion = h.CreatorVersion&0xff | creatorUnix<<8
-	h.ExternalAttrs = fileModeToUnixMode(mode) << 16
-
-	// set MSDOS attributes too, as the original zip does.
-	if mode&os.ModeDir != 0 {
-		h.ExternalAttrs |= msdosDir
-	}
-	if mode&0200 == 0 {
-		h.ExternalAttrs |= msdosReadOnly
-	}
-}
-
-// isZip64 reports whether the file size exceeds the 32 bit limit
-func (fh *FileHeader) isZip64() bool {
-	return fh.CompressedSize64 > uint32max || fh.UncompressedSize64 > uint32max
-}
-
-func msdosModeToFileMode(m uint32) (mode os.FileMode) {
-	if m&msdosDir != 0 {
-		mode = os.ModeDir | 0777
-	} else {
-		mode = 0666
-	}
-	if m&msdosReadOnly != 0 {
-		mode &^= 0222
-	}
-	return mode
-}
-
-func fileModeToUnixMode(mode os.FileMode) uint32 {
-	var m uint32
-	switch mode & os.ModeType {
-	default:
-		m = s_IFREG
-	case os.ModeDir:
-		m = s_IFDIR
-	case os.ModeSymlink:
-		m = s_IFLNK
-	case os.ModeNamedPipe:
-		m = s_IFIFO
-	case os.ModeSocket:
-		m = s_IFSOCK
-	case os.ModeDevice:
-		if mode&os.ModeCharDevice != 0 {
-			m = s_IFCHR
-		} else {
-			m = s_IFBLK
-		}
-	}
-	if mode&os.ModeSetuid != 0 {
-		m |= s_ISUID
-	}
-	if mode&os.ModeSetgid != 0 {
-		m |= s_ISGID
-	}
-	if mode&os.ModeSticky != 0 {
-		m |= s_ISVTX
-	}
-	return m | uint32(mode&0777)
-}
-
-func unixModeToFileMode(m uint32) os.FileMode {
-	mode := os.FileMode(m & 0777)
-	switch m & s_IFMT {
-	case s_IFBLK:
-		mode |= os.ModeDevice
-	case s_IFCHR:
-		mode |= os.ModeDevice | os.ModeCharDevice
-	case s_IFDIR:
-		mode |= os.ModeDir
-	case s_IFIFO:
-		mode |= os.ModeNamedPipe
-	case s_IFLNK:
-		mode |= os.ModeSymlink
-	case s_IFREG:
-		// nothing to do
-	case s_IFSOCK:
-		mode |= os.ModeSocket
-	}
-	if m&s_ISGID != 0 {
-		mode |= os.ModeSetgid
-	}
-	if m&s_ISUID != 0 {
-		mode |= os.ModeSetuid
-	}
-	if m&s_ISVTX != 0 {
-		mode |= os.ModeSticky
-	}
-	return mode
-}
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/crc32-not-streamed.zip b/third_party/gofrontend/libgo/go/archive/zip/testdata/crc32-not-streamed.zip
deleted file mode 100644
index f268d88..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/crc32-not-streamed.zip
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/dd.zip b/third_party/gofrontend/libgo/go/archive/zip/testdata/dd.zip
deleted file mode 100644
index e53378b..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/dd.zip
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/go-no-datadesc-sig.zip b/third_party/gofrontend/libgo/go/archive/zip/testdata/go-no-datadesc-sig.zip
deleted file mode 100644
index c3d593f..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/go-no-datadesc-sig.zip
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/go-with-datadesc-sig.zip b/third_party/gofrontend/libgo/go/archive/zip/testdata/go-with-datadesc-sig.zip
deleted file mode 100644
index bcfe121..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/go-with-datadesc-sig.zip
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/gophercolor16x16.png b/third_party/gofrontend/libgo/go/archive/zip/testdata/gophercolor16x16.png
deleted file mode 100644
index 48854ff..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/gophercolor16x16.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/readme.notzip b/third_party/gofrontend/libgo/go/archive/zip/testdata/readme.notzip
deleted file mode 100644
index 8173727..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/readme.notzip
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/readme.zip b/third_party/gofrontend/libgo/go/archive/zip/testdata/readme.zip
deleted file mode 100644
index 5642a67..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/readme.zip
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/symlink.zip b/third_party/gofrontend/libgo/go/archive/zip/testdata/symlink.zip
deleted file mode 100644
index af84693..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/symlink.zip
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/test-trailing-junk.zip b/third_party/gofrontend/libgo/go/archive/zip/testdata/test-trailing-junk.zip
deleted file mode 100644
index 42281b4..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/test-trailing-junk.zip
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/test.zip b/third_party/gofrontend/libgo/go/archive/zip/testdata/test.zip
deleted file mode 100644
index 03890c0..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/test.zip
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/unix.zip b/third_party/gofrontend/libgo/go/archive/zip/testdata/unix.zip
deleted file mode 100644
index ce1a981..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/unix.zip
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/winxp.zip b/third_party/gofrontend/libgo/go/archive/zip/testdata/winxp.zip
deleted file mode 100644
index 3919322..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/winxp.zip
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/zip64-2.zip b/third_party/gofrontend/libgo/go/archive/zip/testdata/zip64-2.zip
deleted file mode 100644
index f844e35..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/zip64-2.zip
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/testdata/zip64.zip b/third_party/gofrontend/libgo/go/archive/zip/testdata/zip64.zip
deleted file mode 100644
index a2ee1fa..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/testdata/zip64.zip
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/archive/zip/writer.go b/third_party/gofrontend/libgo/go/archive/zip/writer.go
deleted file mode 100644
index 3be2b5f..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/writer.go
+++ /dev/null
@@ -1,374 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package zip
-
-import (
-	"bufio"
-	"encoding/binary"
-	"errors"
-	"hash"
-	"hash/crc32"
-	"io"
-)
-
-// TODO(adg): support zip file comments
-// TODO(adg): support specifying deflate level
-
-// Writer implements a zip file writer.
-type Writer struct {
-	cw     *countWriter
-	dir    []*header
-	last   *fileWriter
-	closed bool
-}
-
-type header struct {
-	*FileHeader
-	offset uint64
-}
-
-// NewWriter returns a new Writer writing a zip file to w.
-func NewWriter(w io.Writer) *Writer {
-	return &Writer{cw: &countWriter{w: bufio.NewWriter(w)}}
-}
-
-// SetOffset sets the offset of the beginning of the zip data within the
-// underlying writer. It should be used when the zip data is appended to an
-// existing file, such as a binary executable.
-// It must be called before any data is written.
-func (w *Writer) SetOffset(n int64) {
-	if w.cw.count != 0 {
-		panic("zip: SetOffset called after data was written")
-	}
-	w.cw.count = n
-}
-
-// Flush flushes any buffered data to the underlying writer.
-// Calling Flush is not normally necessary; calling Close is sufficient.
-func (w *Writer) Flush() error {
-	return w.cw.w.(*bufio.Writer).Flush()
-}
-
-// Close finishes writing the zip file by writing the central directory.
-// It does not (and can not) close the underlying writer.
-func (w *Writer) Close() error {
-	if w.last != nil && !w.last.closed {
-		if err := w.last.close(); err != nil {
-			return err
-		}
-		w.last = nil
-	}
-	if w.closed {
-		return errors.New("zip: writer closed twice")
-	}
-	w.closed = true
-
-	// write central directory
-	start := w.cw.count
-	for _, h := range w.dir {
-		var buf [directoryHeaderLen]byte
-		b := writeBuf(buf[:])
-		b.uint32(uint32(directoryHeaderSignature))
-		b.uint16(h.CreatorVersion)
-		b.uint16(h.ReaderVersion)
-		b.uint16(h.Flags)
-		b.uint16(h.Method)
-		b.uint16(h.ModifiedTime)
-		b.uint16(h.ModifiedDate)
-		b.uint32(h.CRC32)
-		if h.isZip64() || h.offset > uint32max {
-			// the file needs a zip64 header. store maxint in both
-			// 32 bit size fields (and offset later) to signal that the
-			// zip64 extra header should be used.
-			b.uint32(uint32max) // compressed size
-			b.uint32(uint32max) // uncompressed size
-
-			// append a zip64 extra block to Extra
-			var buf [28]byte // 2x uint16 + 3x uint64
-			eb := writeBuf(buf[:])
-			eb.uint16(zip64ExtraId)
-			eb.uint16(24) // size = 3x uint64
-			eb.uint64(h.UncompressedSize64)
-			eb.uint64(h.CompressedSize64)
-			eb.uint64(h.offset)
-			h.Extra = append(h.Extra, buf[:]...)
-		} else {
-			b.uint32(h.CompressedSize)
-			b.uint32(h.UncompressedSize)
-		}
-		b.uint16(uint16(len(h.Name)))
-		b.uint16(uint16(len(h.Extra)))
-		b.uint16(uint16(len(h.Comment)))
-		b = b[4:] // skip disk number start and internal file attr (2x uint16)
-		b.uint32(h.ExternalAttrs)
-		if h.offset > uint32max {
-			b.uint32(uint32max)
-		} else {
-			b.uint32(uint32(h.offset))
-		}
-		if _, err := w.cw.Write(buf[:]); err != nil {
-			return err
-		}
-		if _, err := io.WriteString(w.cw, h.Name); err != nil {
-			return err
-		}
-		if _, err := w.cw.Write(h.Extra); err != nil {
-			return err
-		}
-		if _, err := io.WriteString(w.cw, h.Comment); err != nil {
-			return err
-		}
-	}
-	end := w.cw.count
-
-	records := uint64(len(w.dir))
-	size := uint64(end - start)
-	offset := uint64(start)
-
-	if records > uint16max || size > uint32max || offset > uint32max {
-		var buf [directory64EndLen + directory64LocLen]byte
-		b := writeBuf(buf[:])
-
-		// zip64 end of central directory record
-		b.uint32(directory64EndSignature)
-		b.uint64(directory64EndLen - 12) // length minus signature (uint32) and length fields (uint64)
-		b.uint16(zipVersion45)           // version made by
-		b.uint16(zipVersion45)           // version needed to extract
-		b.uint32(0)                      // number of this disk
-		b.uint32(0)                      // number of the disk with the start of the central directory
-		b.uint64(records)                // total number of entries in the central directory on this disk
-		b.uint64(records)                // total number of entries in the central directory
-		b.uint64(size)                   // size of the central directory
-		b.uint64(offset)                 // offset of start of central directory with respect to the starting disk number
-
-		// zip64 end of central directory locator
-		b.uint32(directory64LocSignature)
-		b.uint32(0)           // number of the disk with the start of the zip64 end of central directory
-		b.uint64(uint64(end)) // relative offset of the zip64 end of central directory record
-		b.uint32(1)           // total number of disks
-
-		if _, err := w.cw.Write(buf[:]); err != nil {
-			return err
-		}
-
-		// store max values in the regular end record to signal that
-		// that the zip64 values should be used instead
-		records = uint16max
-		size = uint32max
-		offset = uint32max
-	}
-
-	// write end record
-	var buf [directoryEndLen]byte
-	b := writeBuf(buf[:])
-	b.uint32(uint32(directoryEndSignature))
-	b = b[4:]                 // skip over disk number and first disk number (2x uint16)
-	b.uint16(uint16(records)) // number of entries this disk
-	b.uint16(uint16(records)) // number of entries total
-	b.uint32(uint32(size))    // size of directory
-	b.uint32(uint32(offset))  // start of directory
-	// skipped size of comment (always zero)
-	if _, err := w.cw.Write(buf[:]); err != nil {
-		return err
-	}
-
-	return w.cw.w.(*bufio.Writer).Flush()
-}
-
-// Create adds a file to the zip file using the provided name.
-// It returns a Writer to which the file contents should be written.
-// The name must be a relative path: it must not start with a drive
-// letter (e.g. C:) or leading slash, and only forward slashes are
-// allowed.
-// The file's contents must be written to the io.Writer before the next
-// call to Create, CreateHeader, or Close.
-func (w *Writer) Create(name string) (io.Writer, error) {
-	header := &FileHeader{
-		Name:   name,
-		Method: Deflate,
-	}
-	return w.CreateHeader(header)
-}
-
-// CreateHeader adds a file to the zip file using the provided FileHeader
-// for the file metadata.
-// It returns a Writer to which the file contents should be written.
-//
-// The file's contents must be written to the io.Writer before the next
-// call to Create, CreateHeader, or Close. The provided FileHeader fh
-// must not be modified after a call to CreateHeader.
-func (w *Writer) CreateHeader(fh *FileHeader) (io.Writer, error) {
-	if w.last != nil && !w.last.closed {
-		if err := w.last.close(); err != nil {
-			return nil, err
-		}
-	}
-	if len(w.dir) > 0 && w.dir[len(w.dir)-1].FileHeader == fh {
-		// See https://golang.org/issue/11144 confusion.
-		return nil, errors.New("archive/zip: invalid duplicate FileHeader")
-	}
-
-	fh.Flags |= 0x8 // we will write a data descriptor
-
-	fh.CreatorVersion = fh.CreatorVersion&0xff00 | zipVersion20 // preserve compatibility byte
-	fh.ReaderVersion = zipVersion20
-
-	fw := &fileWriter{
-		zipw:      w.cw,
-		compCount: &countWriter{w: w.cw},
-		crc32:     crc32.NewIEEE(),
-	}
-	comp := compressor(fh.Method)
-	if comp == nil {
-		return nil, ErrAlgorithm
-	}
-	var err error
-	fw.comp, err = comp(fw.compCount)
-	if err != nil {
-		return nil, err
-	}
-	fw.rawCount = &countWriter{w: fw.comp}
-
-	h := &header{
-		FileHeader: fh,
-		offset:     uint64(w.cw.count),
-	}
-	w.dir = append(w.dir, h)
-	fw.header = h
-
-	if err := writeHeader(w.cw, fh); err != nil {
-		return nil, err
-	}
-
-	w.last = fw
-	return fw, nil
-}
-
-func writeHeader(w io.Writer, h *FileHeader) error {
-	var buf [fileHeaderLen]byte
-	b := writeBuf(buf[:])
-	b.uint32(uint32(fileHeaderSignature))
-	b.uint16(h.ReaderVersion)
-	b.uint16(h.Flags)
-	b.uint16(h.Method)
-	b.uint16(h.ModifiedTime)
-	b.uint16(h.ModifiedDate)
-	b.uint32(0) // since we are writing a data descriptor crc32,
-	b.uint32(0) // compressed size,
-	b.uint32(0) // and uncompressed size should be zero
-	b.uint16(uint16(len(h.Name)))
-	b.uint16(uint16(len(h.Extra)))
-	if _, err := w.Write(buf[:]); err != nil {
-		return err
-	}
-	if _, err := io.WriteString(w, h.Name); err != nil {
-		return err
-	}
-	_, err := w.Write(h.Extra)
-	return err
-}
-
-type fileWriter struct {
-	*header
-	zipw      io.Writer
-	rawCount  *countWriter
-	comp      io.WriteCloser
-	compCount *countWriter
-	crc32     hash.Hash32
-	closed    bool
-}
-
-func (w *fileWriter) Write(p []byte) (int, error) {
-	if w.closed {
-		return 0, errors.New("zip: write to closed file")
-	}
-	w.crc32.Write(p)
-	return w.rawCount.Write(p)
-}
-
-func (w *fileWriter) close() error {
-	if w.closed {
-		return errors.New("zip: file closed twice")
-	}
-	w.closed = true
-	if err := w.comp.Close(); err != nil {
-		return err
-	}
-
-	// update FileHeader
-	fh := w.header.FileHeader
-	fh.CRC32 = w.crc32.Sum32()
-	fh.CompressedSize64 = uint64(w.compCount.count)
-	fh.UncompressedSize64 = uint64(w.rawCount.count)
-
-	if fh.isZip64() {
-		fh.CompressedSize = uint32max
-		fh.UncompressedSize = uint32max
-		fh.ReaderVersion = zipVersion45 // requires 4.5 - File uses ZIP64 format extensions
-	} else {
-		fh.CompressedSize = uint32(fh.CompressedSize64)
-		fh.UncompressedSize = uint32(fh.UncompressedSize64)
-	}
-
-	// Write data descriptor. This is more complicated than one would
-	// think, see e.g. comments in zipfile.c:putextended() and
-	// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7073588.
-	// The approach here is to write 8 byte sizes if needed without
-	// adding a zip64 extra in the local header (too late anyway).
-	var buf []byte
-	if fh.isZip64() {
-		buf = make([]byte, dataDescriptor64Len)
-	} else {
-		buf = make([]byte, dataDescriptorLen)
-	}
-	b := writeBuf(buf)
-	b.uint32(dataDescriptorSignature) // de-facto standard, required by OS X
-	b.uint32(fh.CRC32)
-	if fh.isZip64() {
-		b.uint64(fh.CompressedSize64)
-		b.uint64(fh.UncompressedSize64)
-	} else {
-		b.uint32(fh.CompressedSize)
-		b.uint32(fh.UncompressedSize)
-	}
-	_, err := w.zipw.Write(buf)
-	return err
-}
-
-type countWriter struct {
-	w     io.Writer
-	count int64
-}
-
-func (w *countWriter) Write(p []byte) (int, error) {
-	n, err := w.w.Write(p)
-	w.count += int64(n)
-	return n, err
-}
-
-type nopCloser struct {
-	io.Writer
-}
-
-func (w nopCloser) Close() error {
-	return nil
-}
-
-type writeBuf []byte
-
-func (b *writeBuf) uint16(v uint16) {
-	binary.LittleEndian.PutUint16(*b, v)
-	*b = (*b)[2:]
-}
-
-func (b *writeBuf) uint32(v uint32) {
-	binary.LittleEndian.PutUint32(*b, v)
-	*b = (*b)[4:]
-}
-
-func (b *writeBuf) uint64(v uint64) {
-	binary.LittleEndian.PutUint64(*b, v)
-	*b = (*b)[8:]
-}
diff --git a/third_party/gofrontend/libgo/go/archive/zip/writer_test.go b/third_party/gofrontend/libgo/go/archive/zip/writer_test.go
deleted file mode 100644
index 01b63f2..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/writer_test.go
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package zip
-
-import (
-	"bytes"
-	"io"
-	"io/ioutil"
-	"math/rand"
-	"os"
-	"testing"
-)
-
-// TODO(adg): a more sophisticated test suite
-
-type WriteTest struct {
-	Name   string
-	Data   []byte
-	Method uint16
-	Mode   os.FileMode
-}
-
-var writeTests = []WriteTest{
-	{
-		Name:   "foo",
-		Data:   []byte("Rabbits, guinea pigs, gophers, marsupial rats, and quolls."),
-		Method: Store,
-		Mode:   0666,
-	},
-	{
-		Name:   "bar",
-		Data:   nil, // large data set in the test
-		Method: Deflate,
-		Mode:   0644,
-	},
-	{
-		Name:   "setuid",
-		Data:   []byte("setuid file"),
-		Method: Deflate,
-		Mode:   0755 | os.ModeSetuid,
-	},
-	{
-		Name:   "setgid",
-		Data:   []byte("setgid file"),
-		Method: Deflate,
-		Mode:   0755 | os.ModeSetgid,
-	},
-	{
-		Name:   "symlink",
-		Data:   []byte("../link/target"),
-		Method: Deflate,
-		Mode:   0755 | os.ModeSymlink,
-	},
-}
-
-func TestWriter(t *testing.T) {
-	largeData := make([]byte, 1<<17)
-	for i := range largeData {
-		largeData[i] = byte(rand.Int())
-	}
-	writeTests[1].Data = largeData
-	defer func() {
-		writeTests[1].Data = nil
-	}()
-
-	// write a zip file
-	buf := new(bytes.Buffer)
-	w := NewWriter(buf)
-
-	for _, wt := range writeTests {
-		testCreate(t, w, &wt)
-	}
-
-	if err := w.Close(); err != nil {
-		t.Fatal(err)
-	}
-
-	// read it back
-	r, err := NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()))
-	if err != nil {
-		t.Fatal(err)
-	}
-	for i, wt := range writeTests {
-		testReadFile(t, r.File[i], &wt)
-	}
-}
-
-func TestWriterOffset(t *testing.T) {
-	largeData := make([]byte, 1<<17)
-	for i := range largeData {
-		largeData[i] = byte(rand.Int())
-	}
-	writeTests[1].Data = largeData
-	defer func() {
-		writeTests[1].Data = nil
-	}()
-
-	// write a zip file
-	buf := new(bytes.Buffer)
-	existingData := []byte{1, 2, 3, 1, 2, 3, 1, 2, 3}
-	n, _ := buf.Write(existingData)
-	w := NewWriter(buf)
-	w.SetOffset(int64(n))
-
-	for _, wt := range writeTests {
-		testCreate(t, w, &wt)
-	}
-
-	if err := w.Close(); err != nil {
-		t.Fatal(err)
-	}
-
-	// read it back
-	r, err := NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()))
-	if err != nil {
-		t.Fatal(err)
-	}
-	for i, wt := range writeTests {
-		testReadFile(t, r.File[i], &wt)
-	}
-}
-
-func TestWriterFlush(t *testing.T) {
-	var buf bytes.Buffer
-	w := NewWriter(struct{ io.Writer }{&buf})
-	_, err := w.Create("foo")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if buf.Len() > 0 {
-		t.Fatalf("Unexpected %d bytes already in buffer", buf.Len())
-	}
-	if err := w.Flush(); err != nil {
-		t.Fatal(err)
-	}
-	if buf.Len() == 0 {
-		t.Fatal("No bytes written after Flush")
-	}
-}
-
-func testCreate(t *testing.T, w *Writer, wt *WriteTest) {
-	header := &FileHeader{
-		Name:   wt.Name,
-		Method: wt.Method,
-	}
-	if wt.Mode != 0 {
-		header.SetMode(wt.Mode)
-	}
-	f, err := w.CreateHeader(header)
-	if err != nil {
-		t.Fatal(err)
-	}
-	_, err = f.Write(wt.Data)
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func testReadFile(t *testing.T, f *File, wt *WriteTest) {
-	if f.Name != wt.Name {
-		t.Fatalf("File name: got %q, want %q", f.Name, wt.Name)
-	}
-	testFileMode(t, wt.Name, f, wt.Mode)
-	rc, err := f.Open()
-	if err != nil {
-		t.Fatal("opening:", err)
-	}
-	b, err := ioutil.ReadAll(rc)
-	if err != nil {
-		t.Fatal("reading:", err)
-	}
-	err = rc.Close()
-	if err != nil {
-		t.Fatal("closing:", err)
-	}
-	if !bytes.Equal(b, wt.Data) {
-		t.Errorf("File contents %q, want %q", b, wt.Data)
-	}
-}
-
-func BenchmarkCompressedZipGarbage(b *testing.B) {
-	b.ReportAllocs()
-	var buf bytes.Buffer
-	bigBuf := bytes.Repeat([]byte("a"), 1<<20)
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		zw := NewWriter(&buf)
-		for j := 0; j < 3; j++ {
-			w, _ := zw.CreateHeader(&FileHeader{
-				Name:   "foo",
-				Method: Deflate,
-			})
-			w.Write(bigBuf)
-		}
-		zw.Close()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/archive/zip/zip_test.go b/third_party/gofrontend/libgo/go/archive/zip/zip_test.go
deleted file mode 100644
index f00ff47..0000000
--- a/third_party/gofrontend/libgo/go/archive/zip/zip_test.go
+++ /dev/null
@@ -1,427 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Tests that involve both reading and writing.
-
-package zip
-
-import (
-	"bytes"
-	"fmt"
-	"hash"
-	"io"
-	"io/ioutil"
-	"sort"
-	"strings"
-	"testing"
-	"time"
-)
-
-func TestOver65kFiles(t *testing.T) {
-	buf := new(bytes.Buffer)
-	w := NewWriter(buf)
-	const nFiles = (1 << 16) + 42
-	for i := 0; i < nFiles; i++ {
-		_, err := w.CreateHeader(&FileHeader{
-			Name:   fmt.Sprintf("%d.dat", i),
-			Method: Store, // avoid Issue 6136 and Issue 6138
-		})
-		if err != nil {
-			t.Fatalf("creating file %d: %v", i, err)
-		}
-	}
-	if err := w.Close(); err != nil {
-		t.Fatalf("Writer.Close: %v", err)
-	}
-	s := buf.String()
-	zr, err := NewReader(strings.NewReader(s), int64(len(s)))
-	if err != nil {
-		t.Fatalf("NewReader: %v", err)
-	}
-	if got := len(zr.File); got != nFiles {
-		t.Fatalf("File contains %d files, want %d", got, nFiles)
-	}
-	for i := 0; i < nFiles; i++ {
-		want := fmt.Sprintf("%d.dat", i)
-		if zr.File[i].Name != want {
-			t.Fatalf("File(%d) = %q, want %q", i, zr.File[i].Name, want)
-		}
-	}
-}
-
-func TestModTime(t *testing.T) {
-	var testTime = time.Date(2009, time.November, 10, 23, 45, 58, 0, time.UTC)
-	fh := new(FileHeader)
-	fh.SetModTime(testTime)
-	outTime := fh.ModTime()
-	if !outTime.Equal(testTime) {
-		t.Errorf("times don't match: got %s, want %s", outTime, testTime)
-	}
-}
-
-func testHeaderRoundTrip(fh *FileHeader, wantUncompressedSize uint32, wantUncompressedSize64 uint64, t *testing.T) {
-	fi := fh.FileInfo()
-	fh2, err := FileInfoHeader(fi)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if got, want := fh2.Name, fh.Name; got != want {
-		t.Errorf("Name: got %s, want %s\n", got, want)
-	}
-	if got, want := fh2.UncompressedSize, wantUncompressedSize; got != want {
-		t.Errorf("UncompressedSize: got %d, want %d\n", got, want)
-	}
-	if got, want := fh2.UncompressedSize64, wantUncompressedSize64; got != want {
-		t.Errorf("UncompressedSize64: got %d, want %d\n", got, want)
-	}
-	if got, want := fh2.ModifiedTime, fh.ModifiedTime; got != want {
-		t.Errorf("ModifiedTime: got %d, want %d\n", got, want)
-	}
-	if got, want := fh2.ModifiedDate, fh.ModifiedDate; got != want {
-		t.Errorf("ModifiedDate: got %d, want %d\n", got, want)
-	}
-
-	if sysfh, ok := fi.Sys().(*FileHeader); !ok && sysfh != fh {
-		t.Errorf("Sys didn't return original *FileHeader")
-	}
-}
-
-func TestFileHeaderRoundTrip(t *testing.T) {
-	fh := &FileHeader{
-		Name:             "foo.txt",
-		UncompressedSize: 987654321,
-		ModifiedTime:     1234,
-		ModifiedDate:     5678,
-	}
-	testHeaderRoundTrip(fh, fh.UncompressedSize, uint64(fh.UncompressedSize), t)
-}
-
-func TestFileHeaderRoundTrip64(t *testing.T) {
-	fh := &FileHeader{
-		Name:               "foo.txt",
-		UncompressedSize64: 9876543210,
-		ModifiedTime:       1234,
-		ModifiedDate:       5678,
-	}
-	testHeaderRoundTrip(fh, uint32max, fh.UncompressedSize64, t)
-}
-
-type repeatedByte struct {
-	off int64
-	b   byte
-	n   int64
-}
-
-// rleBuffer is a run-length-encoded byte buffer.
-// It's an io.Writer (like a bytes.Buffer) and also an io.ReaderAt,
-// allowing random-access reads.
-type rleBuffer struct {
-	buf []repeatedByte
-}
-
-func (r *rleBuffer) Size() int64 {
-	if len(r.buf) == 0 {
-		return 0
-	}
-	last := &r.buf[len(r.buf)-1]
-	return last.off + last.n
-}
-
-func (r *rleBuffer) Write(p []byte) (n int, err error) {
-	var rp *repeatedByte
-	if len(r.buf) > 0 {
-		rp = &r.buf[len(r.buf)-1]
-		// Fast path, if p is entirely the same byte repeated.
-		if lastByte := rp.b; len(p) > 0 && p[0] == lastByte {
-			all := true
-			for _, b := range p {
-				if b != lastByte {
-					all = false
-					break
-				}
-			}
-			if all {
-				rp.n += int64(len(p))
-				return len(p), nil
-			}
-		}
-	}
-
-	for _, b := range p {
-		if rp == nil || rp.b != b {
-			r.buf = append(r.buf, repeatedByte{r.Size(), b, 1})
-			rp = &r.buf[len(r.buf)-1]
-		} else {
-			rp.n++
-		}
-	}
-	return len(p), nil
-}
-
-func (r *rleBuffer) ReadAt(p []byte, off int64) (n int, err error) {
-	if len(p) == 0 {
-		return
-	}
-	skipParts := sort.Search(len(r.buf), func(i int) bool {
-		part := &r.buf[i]
-		return part.off+part.n > off
-	})
-	parts := r.buf[skipParts:]
-	if len(parts) > 0 {
-		skipBytes := off - parts[0].off
-		for len(parts) > 0 {
-			part := parts[0]
-			for i := skipBytes; i < part.n; i++ {
-				if n == len(p) {
-					return
-				}
-				p[n] = part.b
-				n++
-			}
-			parts = parts[1:]
-			skipBytes = 0
-		}
-	}
-	if n != len(p) {
-		err = io.ErrUnexpectedEOF
-	}
-	return
-}
-
-// Just testing the rleBuffer used in the Zip64 test above. Not used by the zip code.
-func TestRLEBuffer(t *testing.T) {
-	b := new(rleBuffer)
-	var all []byte
-	writes := []string{"abcdeee", "eeeeeee", "eeeefghaaiii"}
-	for _, w := range writes {
-		b.Write([]byte(w))
-		all = append(all, w...)
-	}
-	if len(b.buf) != 10 {
-		t.Fatalf("len(b.buf) = %d; want 10", len(b.buf))
-	}
-
-	for i := 0; i < len(all); i++ {
-		for j := 0; j < len(all)-i; j++ {
-			buf := make([]byte, j)
-			n, err := b.ReadAt(buf, int64(i))
-			if err != nil || n != len(buf) {
-				t.Errorf("ReadAt(%d, %d) = %d, %v; want %d, nil", i, j, n, err, len(buf))
-			}
-			if !bytes.Equal(buf, all[i:i+j]) {
-				t.Errorf("ReadAt(%d, %d) = %q; want %q", i, j, buf, all[i:i+j])
-			}
-		}
-	}
-}
-
-// fakeHash32 is a dummy Hash32 that always returns 0.
-type fakeHash32 struct {
-	hash.Hash32
-}
-
-func (fakeHash32) Write(p []byte) (int, error) { return len(p), nil }
-func (fakeHash32) Sum32() uint32               { return 0 }
-
-func TestZip64(t *testing.T) {
-	if testing.Short() {
-		t.Skip("slow test; skipping")
-	}
-	const size = 1 << 32 // before the "END\n" part
-	buf := testZip64(t, size)
-	testZip64DirectoryRecordLength(buf, t)
-}
-
-func testZip64(t testing.TB, size int64) *rleBuffer {
-	const chunkSize = 1024
-	chunks := int(size / chunkSize)
-	// write 2^32 bytes plus "END\n" to a zip file
-	buf := new(rleBuffer)
-	w := NewWriter(buf)
-	f, err := w.CreateHeader(&FileHeader{
-		Name:   "huge.txt",
-		Method: Store,
-	})
-	if err != nil {
-		t.Fatal(err)
-	}
-	f.(*fileWriter).crc32 = fakeHash32{}
-	chunk := make([]byte, chunkSize)
-	for i := range chunk {
-		chunk[i] = '.'
-	}
-	for i := 0; i < chunks; i++ {
-		_, err := f.Write(chunk)
-		if err != nil {
-			t.Fatal("write chunk:", err)
-		}
-	}
-	end := []byte("END\n")
-	_, err = f.Write(end)
-	if err != nil {
-		t.Fatal("write end:", err)
-	}
-	if err := w.Close(); err != nil {
-		t.Fatal(err)
-	}
-
-	// read back zip file and check that we get to the end of it
-	r, err := NewReader(buf, int64(buf.Size()))
-	if err != nil {
-		t.Fatal("reader:", err)
-	}
-	f0 := r.File[0]
-	rc, err := f0.Open()
-	if err != nil {
-		t.Fatal("opening:", err)
-	}
-	rc.(*checksumReader).hash = fakeHash32{}
-	for i := 0; i < chunks; i++ {
-		_, err := io.ReadFull(rc, chunk)
-		if err != nil {
-			t.Fatal("read:", err)
-		}
-	}
-	gotEnd, err := ioutil.ReadAll(rc)
-	if err != nil {
-		t.Fatal("read end:", err)
-	}
-	if !bytes.Equal(gotEnd, end) {
-		t.Errorf("End of zip64 archive %q, want %q", gotEnd, end)
-	}
-	err = rc.Close()
-	if err != nil {
-		t.Fatal("closing:", err)
-	}
-	if size == 1<<32 {
-		if got, want := f0.UncompressedSize, uint32(uint32max); got != want {
-			t.Errorf("UncompressedSize %d, want %d", got, want)
-		}
-	}
-
-	if got, want := f0.UncompressedSize64, uint64(size)+uint64(len(end)); got != want {
-		t.Errorf("UncompressedSize64 %d, want %d", got, want)
-	}
-
-	return buf
-}
-
-// Issue 9857
-func testZip64DirectoryRecordLength(buf *rleBuffer, t *testing.T) {
-	d := make([]byte, 1024)
-	if _, err := buf.ReadAt(d, buf.Size()-int64(len(d))); err != nil {
-		t.Fatal("read:", err)
-	}
-
-	sigOff := findSignatureInBlock(d)
-	dirOff, err := findDirectory64End(buf, buf.Size()-int64(len(d))+int64(sigOff))
-	if err != nil {
-		t.Fatal("findDirectory64End:", err)
-	}
-
-	d = make([]byte, directory64EndLen)
-	if _, err := buf.ReadAt(d, dirOff); err != nil {
-		t.Fatal("read:", err)
-	}
-
-	b := readBuf(d)
-	if sig := b.uint32(); sig != directory64EndSignature {
-		t.Fatalf("Expected directory64EndSignature (%d), got %d", directory64EndSignature, sig)
-	}
-
-	size := b.uint64()
-	if size != directory64EndLen-12 {
-		t.Fatalf("Expected length of %d, got %d", directory64EndLen-12, size)
-	}
-}
-
-func testInvalidHeader(h *FileHeader, t *testing.T) {
-	var buf bytes.Buffer
-	z := NewWriter(&buf)
-
-	f, err := z.CreateHeader(h)
-	if err != nil {
-		t.Fatalf("error creating header: %v", err)
-	}
-	if _, err := f.Write([]byte("hi")); err != nil {
-		t.Fatalf("error writing content: %v", err)
-	}
-	if err := z.Close(); err != nil {
-		t.Fatalf("error closing zip writer: %v", err)
-	}
-
-	b := buf.Bytes()
-	if _, err = NewReader(bytes.NewReader(b), int64(len(b))); err != ErrFormat {
-		t.Fatalf("got %v, expected ErrFormat", err)
-	}
-}
-
-func testValidHeader(h *FileHeader, t *testing.T) {
-	var buf bytes.Buffer
-	z := NewWriter(&buf)
-
-	f, err := z.CreateHeader(h)
-	if err != nil {
-		t.Fatalf("error creating header: %v", err)
-	}
-	if _, err := f.Write([]byte("hi")); err != nil {
-		t.Fatalf("error writing content: %v", err)
-	}
-	if err := z.Close(); err != nil {
-		t.Fatalf("error closing zip writer: %v", err)
-	}
-
-	b := buf.Bytes()
-	if _, err = NewReader(bytes.NewReader(b), int64(len(b))); err != nil {
-		t.Fatalf("got %v, expected nil", err)
-	}
-}
-
-// Issue 4302.
-func TestHeaderInvalidTagAndSize(t *testing.T) {
-	const timeFormat = "20060102T150405.000.txt"
-
-	ts := time.Now()
-	filename := ts.Format(timeFormat)
-
-	h := FileHeader{
-		Name:   filename,
-		Method: Deflate,
-		Extra:  []byte(ts.Format(time.RFC3339Nano)), // missing tag and len
-	}
-	h.SetModTime(ts)
-
-	testInvalidHeader(&h, t)
-}
-
-func TestHeaderTooShort(t *testing.T) {
-	h := FileHeader{
-		Name:   "foo.txt",
-		Method: Deflate,
-		Extra:  []byte{zip64ExtraId}, // missing size
-	}
-	testInvalidHeader(&h, t)
-}
-
-// Issue 4393. It is valid to have an extra data header
-// which contains no body.
-func TestZeroLengthHeader(t *testing.T) {
-	h := FileHeader{
-		Name:   "extadata.txt",
-		Method: Deflate,
-		Extra: []byte{
-			85, 84, 5, 0, 3, 154, 144, 195, 77, // tag 21589 size 5
-			85, 120, 0, 0, // tag 30805 size 0
-		},
-	}
-	testValidHeader(&h, t)
-}
-
-// Just benchmarking how fast the Zip64 test above is. Not related to
-// our zip performance, since the test above disabled CRC32 and flate.
-func BenchmarkZip64Test(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		testZip64(b, 1<<26)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/bufio/bufio.go b/third_party/gofrontend/libgo/go/bufio/bufio.go
deleted file mode 100644
index 3bbb933..0000000
--- a/third_party/gofrontend/libgo/go/bufio/bufio.go
+++ /dev/null
@@ -1,730 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package bufio implements buffered I/O.  It wraps an io.Reader or io.Writer
-// object, creating another object (Reader or Writer) that also implements
-// the interface but provides buffering and some help for textual I/O.
-package bufio
-
-import (
-	"bytes"
-	"errors"
-	"io"
-	"unicode/utf8"
-)
-
-const (
-	defaultBufSize = 4096
-)
-
-var (
-	ErrInvalidUnreadByte = errors.New("bufio: invalid use of UnreadByte")
-	ErrInvalidUnreadRune = errors.New("bufio: invalid use of UnreadRune")
-	ErrBufferFull        = errors.New("bufio: buffer full")
-	ErrNegativeCount     = errors.New("bufio: negative count")
-)
-
-// Buffered input.
-
-// Reader implements buffering for an io.Reader object.
-type Reader struct {
-	buf          []byte
-	rd           io.Reader // reader provided by the client
-	r, w         int       // buf read and write positions
-	err          error
-	lastByte     int
-	lastRuneSize int
-}
-
-const minReadBufferSize = 16
-const maxConsecutiveEmptyReads = 100
-
-// NewReaderSize returns a new Reader whose buffer has at least the specified
-// size. If the argument io.Reader is already a Reader with large enough
-// size, it returns the underlying Reader.
-func NewReaderSize(rd io.Reader, size int) *Reader {
-	// Is it already a Reader?
-	b, ok := rd.(*Reader)
-	if ok && len(b.buf) >= size {
-		return b
-	}
-	if size < minReadBufferSize {
-		size = minReadBufferSize
-	}
-	r := new(Reader)
-	r.reset(make([]byte, size), rd)
-	return r
-}
-
-// NewReader returns a new Reader whose buffer has the default size.
-func NewReader(rd io.Reader) *Reader {
-	return NewReaderSize(rd, defaultBufSize)
-}
-
-// Reset discards any buffered data, resets all state, and switches
-// the buffered reader to read from r.
-func (b *Reader) Reset(r io.Reader) {
-	b.reset(b.buf, r)
-}
-
-func (b *Reader) reset(buf []byte, r io.Reader) {
-	*b = Reader{
-		buf:          buf,
-		rd:           r,
-		lastByte:     -1,
-		lastRuneSize: -1,
-	}
-}
-
-var errNegativeRead = errors.New("bufio: reader returned negative count from Read")
-
-// fill reads a new chunk into the buffer.
-func (b *Reader) fill() {
-	// Slide existing data to beginning.
-	if b.r > 0 {
-		copy(b.buf, b.buf[b.r:b.w])
-		b.w -= b.r
-		b.r = 0
-	}
-
-	if b.w >= len(b.buf) {
-		panic("bufio: tried to fill full buffer")
-	}
-
-	// Read new data: try a limited number of times.
-	for i := maxConsecutiveEmptyReads; i > 0; i-- {
-		n, err := b.rd.Read(b.buf[b.w:])
-		if n < 0 {
-			panic(errNegativeRead)
-		}
-		b.w += n
-		if err != nil {
-			b.err = err
-			return
-		}
-		if n > 0 {
-			return
-		}
-	}
-	b.err = io.ErrNoProgress
-}
-
-func (b *Reader) readErr() error {
-	err := b.err
-	b.err = nil
-	return err
-}
-
-// Peek returns the next n bytes without advancing the reader. The bytes stop
-// being valid at the next read call. If Peek returns fewer than n bytes, it
-// also returns an error explaining why the read is short. The error is
-// ErrBufferFull if n is larger than b's buffer size.
-func (b *Reader) Peek(n int) ([]byte, error) {
-	if n < 0 {
-		return nil, ErrNegativeCount
-	}
-	if n > len(b.buf) {
-		return nil, ErrBufferFull
-	}
-	// 0 <= n <= len(b.buf)
-	for b.w-b.r < n && b.err == nil {
-		b.fill() // b.w-b.r < len(b.buf) => buffer is not full
-	}
-
-	var err error
-	if avail := b.w - b.r; avail < n {
-		// not enough data in buffer
-		n = avail
-		err = b.readErr()
-		if err == nil {
-			err = ErrBufferFull
-		}
-	}
-	return b.buf[b.r : b.r+n], err
-}
-
-// Discard skips the next n bytes, returning the number of bytes discarded.
-//
-// If Discard skips fewer than n bytes, it also returns an error.
-// If 0 <= n <= b.Buffered(), Discard is guaranteed to succeed without
-// reading from the underlying io.Reader.
-func (b *Reader) Discard(n int) (discarded int, err error) {
-	if n < 0 {
-		return 0, ErrNegativeCount
-	}
-	if n == 0 {
-		return
-	}
-	remain := n
-	for {
-		skip := b.Buffered()
-		if skip == 0 {
-			b.fill()
-			skip = b.Buffered()
-		}
-		if skip > remain {
-			skip = remain
-		}
-		b.r += skip
-		remain -= skip
-		if remain == 0 {
-			return n, nil
-		}
-		if b.err != nil {
-			return n - remain, b.readErr()
-		}
-	}
-}
-
-// Read reads data into p.
-// It returns the number of bytes read into p.
-// It calls Read at most once on the underlying Reader,
-// hence n may be less than len(p).
-// At EOF, the count will be zero and err will be io.EOF.
-func (b *Reader) Read(p []byte) (n int, err error) {
-	n = len(p)
-	if n == 0 {
-		return 0, b.readErr()
-	}
-	if b.r == b.w {
-		if b.err != nil {
-			return 0, b.readErr()
-		}
-		if len(p) >= len(b.buf) {
-			// Large read, empty buffer.
-			// Read directly into p to avoid copy.
-			n, b.err = b.rd.Read(p)
-			if n < 0 {
-				panic(errNegativeRead)
-			}
-			if n > 0 {
-				b.lastByte = int(p[n-1])
-				b.lastRuneSize = -1
-			}
-			return n, b.readErr()
-		}
-		b.fill() // buffer is empty
-		if b.r == b.w {
-			return 0, b.readErr()
-		}
-	}
-
-	// copy as much as we can
-	n = copy(p, b.buf[b.r:b.w])
-	b.r += n
-	b.lastByte = int(b.buf[b.r-1])
-	b.lastRuneSize = -1
-	return n, nil
-}
-
-// ReadByte reads and returns a single byte.
-// If no byte is available, returns an error.
-func (b *Reader) ReadByte() (c byte, err error) {
-	b.lastRuneSize = -1
-	for b.r == b.w {
-		if b.err != nil {
-			return 0, b.readErr()
-		}
-		b.fill() // buffer is empty
-	}
-	c = b.buf[b.r]
-	b.r++
-	b.lastByte = int(c)
-	return c, nil
-}
-
-// UnreadByte unreads the last byte.  Only the most recently read byte can be unread.
-func (b *Reader) UnreadByte() error {
-	if b.lastByte < 0 || b.r == 0 && b.w > 0 {
-		return ErrInvalidUnreadByte
-	}
-	// b.r > 0 || b.w == 0
-	if b.r > 0 {
-		b.r--
-	} else {
-		// b.r == 0 && b.w == 0
-		b.w = 1
-	}
-	b.buf[b.r] = byte(b.lastByte)
-	b.lastByte = -1
-	b.lastRuneSize = -1
-	return nil
-}
-
-// ReadRune reads a single UTF-8 encoded Unicode character and returns the
-// rune and its size in bytes. If the encoded rune is invalid, it consumes one byte
-// and returns unicode.ReplacementChar (U+FFFD) with a size of 1.
-func (b *Reader) ReadRune() (r rune, size int, err error) {
-	for b.r+utf8.UTFMax > b.w && !utf8.FullRune(b.buf[b.r:b.w]) && b.err == nil && b.w-b.r < len(b.buf) {
-		b.fill() // b.w-b.r < len(buf) => buffer is not full
-	}
-	b.lastRuneSize = -1
-	if b.r == b.w {
-		return 0, 0, b.readErr()
-	}
-	r, size = rune(b.buf[b.r]), 1
-	if r >= 0x80 {
-		r, size = utf8.DecodeRune(b.buf[b.r:b.w])
-	}
-	b.r += size
-	b.lastByte = int(b.buf[b.r-1])
-	b.lastRuneSize = size
-	return r, size, nil
-}
-
-// UnreadRune unreads the last rune.  If the most recent read operation on
-// the buffer was not a ReadRune, UnreadRune returns an error.  (In this
-// regard it is stricter than UnreadByte, which will unread the last byte
-// from any read operation.)
-func (b *Reader) UnreadRune() error {
-	if b.lastRuneSize < 0 || b.r < b.lastRuneSize {
-		return ErrInvalidUnreadRune
-	}
-	b.r -= b.lastRuneSize
-	b.lastByte = -1
-	b.lastRuneSize = -1
-	return nil
-}
-
-// Buffered returns the number of bytes that can be read from the current buffer.
-func (b *Reader) Buffered() int { return b.w - b.r }
-
-// ReadSlice reads until the first occurrence of delim in the input,
-// returning a slice pointing at the bytes in the buffer.
-// The bytes stop being valid at the next read.
-// If ReadSlice encounters an error before finding a delimiter,
-// it returns all the data in the buffer and the error itself (often io.EOF).
-// ReadSlice fails with error ErrBufferFull if the buffer fills without a delim.
-// Because the data returned from ReadSlice will be overwritten
-// by the next I/O operation, most clients should use
-// ReadBytes or ReadString instead.
-// ReadSlice returns err != nil if and only if line does not end in delim.
-func (b *Reader) ReadSlice(delim byte) (line []byte, err error) {
-	for {
-		// Search buffer.
-		if i := bytes.IndexByte(b.buf[b.r:b.w], delim); i >= 0 {
-			line = b.buf[b.r : b.r+i+1]
-			b.r += i + 1
-			break
-		}
-
-		// Pending error?
-		if b.err != nil {
-			line = b.buf[b.r:b.w]
-			b.r = b.w
-			err = b.readErr()
-			break
-		}
-
-		// Buffer full?
-		if b.Buffered() >= len(b.buf) {
-			b.r = b.w
-			line = b.buf
-			err = ErrBufferFull
-			break
-		}
-
-		b.fill() // buffer is not full
-	}
-
-	// Handle last byte, if any.
-	if i := len(line) - 1; i >= 0 {
-		b.lastByte = int(line[i])
-		b.lastRuneSize = -1
-	}
-
-	return
-}
-
-// ReadLine is a low-level line-reading primitive. Most callers should use
-// ReadBytes('\n') or ReadString('\n') instead or use a Scanner.
-//
-// ReadLine tries to return a single line, not including the end-of-line bytes.
-// If the line was too long for the buffer then isPrefix is set and the
-// beginning of the line is returned. The rest of the line will be returned
-// from future calls. isPrefix will be false when returning the last fragment
-// of the line. The returned buffer is only valid until the next call to
-// ReadLine. ReadLine either returns a non-nil line or it returns an error,
-// never both.
-//
-// The text returned from ReadLine does not include the line end ("\r\n" or "\n").
-// No indication or error is given if the input ends without a final line end.
-// Calling UnreadByte after ReadLine will always unread the last byte read
-// (possibly a character belonging to the line end) even if that byte is not
-// part of the line returned by ReadLine.
-func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) {
-	line, err = b.ReadSlice('\n')
-	if err == ErrBufferFull {
-		// Handle the case where "\r\n" straddles the buffer.
-		if len(line) > 0 && line[len(line)-1] == '\r' {
-			// Put the '\r' back on buf and drop it from line.
-			// Let the next call to ReadLine check for "\r\n".
-			if b.r == 0 {
-				// should be unreachable
-				panic("bufio: tried to rewind past start of buffer")
-			}
-			b.r--
-			line = line[:len(line)-1]
-		}
-		return line, true, nil
-	}
-
-	if len(line) == 0 {
-		if err != nil {
-			line = nil
-		}
-		return
-	}
-	err = nil
-
-	if line[len(line)-1] == '\n' {
-		drop := 1
-		if len(line) > 1 && line[len(line)-2] == '\r' {
-			drop = 2
-		}
-		line = line[:len(line)-drop]
-	}
-	return
-}
-
-// ReadBytes reads until the first occurrence of delim in the input,
-// returning a slice containing the data up to and including the delimiter.
-// If ReadBytes encounters an error before finding a delimiter,
-// it returns the data read before the error and the error itself (often io.EOF).
-// ReadBytes returns err != nil if and only if the returned data does not end in
-// delim.
-// For simple uses, a Scanner may be more convenient.
-func (b *Reader) ReadBytes(delim byte) (line []byte, err error) {
-	// Use ReadSlice to look for array,
-	// accumulating full buffers.
-	var frag []byte
-	var full [][]byte
-
-	for {
-		var e error
-		frag, e = b.ReadSlice(delim)
-		if e == nil { // got final fragment
-			break
-		}
-		if e != ErrBufferFull { // unexpected error
-			err = e
-			break
-		}
-
-		// Make a copy of the buffer.
-		buf := make([]byte, len(frag))
-		copy(buf, frag)
-		full = append(full, buf)
-	}
-
-	// Allocate new buffer to hold the full pieces and the fragment.
-	n := 0
-	for i := range full {
-		n += len(full[i])
-	}
-	n += len(frag)
-
-	// Copy full pieces and fragment in.
-	buf := make([]byte, n)
-	n = 0
-	for i := range full {
-		n += copy(buf[n:], full[i])
-	}
-	copy(buf[n:], frag)
-	return buf, err
-}
-
-// ReadString reads until the first occurrence of delim in the input,
-// returning a string containing the data up to and including the delimiter.
-// If ReadString encounters an error before finding a delimiter,
-// it returns the data read before the error and the error itself (often io.EOF).
-// ReadString returns err != nil if and only if the returned data does not end in
-// delim.
-// For simple uses, a Scanner may be more convenient.
-func (b *Reader) ReadString(delim byte) (line string, err error) {
-	bytes, err := b.ReadBytes(delim)
-	line = string(bytes)
-	return line, err
-}
-
-// WriteTo implements io.WriterTo.
-func (b *Reader) WriteTo(w io.Writer) (n int64, err error) {
-	n, err = b.writeBuf(w)
-	if err != nil {
-		return
-	}
-
-	if r, ok := b.rd.(io.WriterTo); ok {
-		m, err := r.WriteTo(w)
-		n += m
-		return n, err
-	}
-
-	if w, ok := w.(io.ReaderFrom); ok {
-		m, err := w.ReadFrom(b.rd)
-		n += m
-		return n, err
-	}
-
-	if b.w-b.r < len(b.buf) {
-		b.fill() // buffer not full
-	}
-
-	for b.r < b.w {
-		// b.r < b.w => buffer is not empty
-		m, err := b.writeBuf(w)
-		n += m
-		if err != nil {
-			return n, err
-		}
-		b.fill() // buffer is empty
-	}
-
-	if b.err == io.EOF {
-		b.err = nil
-	}
-
-	return n, b.readErr()
-}
-
-var errNegativeWrite = errors.New("bufio: writer returned negative count from Write")
-
-// writeBuf writes the Reader's buffer to the writer.
-func (b *Reader) writeBuf(w io.Writer) (int64, error) {
-	n, err := w.Write(b.buf[b.r:b.w])
-	if n < 0 {
-		panic(errNegativeWrite)
-	}
-	b.r += n
-	return int64(n), err
-}
-
-// buffered output
-
-// Writer implements buffering for an io.Writer object.
-// If an error occurs writing to a Writer, no more data will be
-// accepted and all subsequent writes will return the error.
-// After all data has been written, the client should call the
-// Flush method to guarantee all data has been forwarded to
-// the underlying io.Writer.
-type Writer struct {
-	err error
-	buf []byte
-	n   int
-	wr  io.Writer
-}
-
-// NewWriterSize returns a new Writer whose buffer has at least the specified
-// size. If the argument io.Writer is already a Writer with large enough
-// size, it returns the underlying Writer.
-func NewWriterSize(w io.Writer, size int) *Writer {
-	// Is it already a Writer?
-	b, ok := w.(*Writer)
-	if ok && len(b.buf) >= size {
-		return b
-	}
-	if size <= 0 {
-		size = defaultBufSize
-	}
-	return &Writer{
-		buf: make([]byte, size),
-		wr:  w,
-	}
-}
-
-// NewWriter returns a new Writer whose buffer has the default size.
-func NewWriter(w io.Writer) *Writer {
-	return NewWriterSize(w, defaultBufSize)
-}
-
-// Reset discards any unflushed buffered data, clears any error, and
-// resets b to write its output to w.
-func (b *Writer) Reset(w io.Writer) {
-	b.err = nil
-	b.n = 0
-	b.wr = w
-}
-
-// Flush writes any buffered data to the underlying io.Writer.
-func (b *Writer) Flush() error {
-	err := b.flush()
-	return err
-}
-
-func (b *Writer) flush() error {
-	if b.err != nil {
-		return b.err
-	}
-	if b.n == 0 {
-		return nil
-	}
-	n, err := b.wr.Write(b.buf[0:b.n])
-	if n < b.n && err == nil {
-		err = io.ErrShortWrite
-	}
-	if err != nil {
-		if n > 0 && n < b.n {
-			copy(b.buf[0:b.n-n], b.buf[n:b.n])
-		}
-		b.n -= n
-		b.err = err
-		return err
-	}
-	b.n = 0
-	return nil
-}
-
-// Available returns how many bytes are unused in the buffer.
-func (b *Writer) Available() int { return len(b.buf) - b.n }
-
-// Buffered returns the number of bytes that have been written into the current buffer.
-func (b *Writer) Buffered() int { return b.n }
-
-// Write writes the contents of p into the buffer.
-// It returns the number of bytes written.
-// If nn < len(p), it also returns an error explaining
-// why the write is short.
-func (b *Writer) Write(p []byte) (nn int, err error) {
-	for len(p) > b.Available() && b.err == nil {
-		var n int
-		if b.Buffered() == 0 {
-			// Large write, empty buffer.
-			// Write directly from p to avoid copy.
-			n, b.err = b.wr.Write(p)
-		} else {
-			n = copy(b.buf[b.n:], p)
-			b.n += n
-			b.flush()
-		}
-		nn += n
-		p = p[n:]
-	}
-	if b.err != nil {
-		return nn, b.err
-	}
-	n := copy(b.buf[b.n:], p)
-	b.n += n
-	nn += n
-	return nn, nil
-}
-
-// WriteByte writes a single byte.
-func (b *Writer) WriteByte(c byte) error {
-	if b.err != nil {
-		return b.err
-	}
-	if b.Available() <= 0 && b.flush() != nil {
-		return b.err
-	}
-	b.buf[b.n] = c
-	b.n++
-	return nil
-}
-
-// WriteRune writes a single Unicode code point, returning
-// the number of bytes written and any error.
-func (b *Writer) WriteRune(r rune) (size int, err error) {
-	if r < utf8.RuneSelf {
-		err = b.WriteByte(byte(r))
-		if err != nil {
-			return 0, err
-		}
-		return 1, nil
-	}
-	if b.err != nil {
-		return 0, b.err
-	}
-	n := b.Available()
-	if n < utf8.UTFMax {
-		if b.flush(); b.err != nil {
-			return 0, b.err
-		}
-		n = b.Available()
-		if n < utf8.UTFMax {
-			// Can only happen if buffer is silly small.
-			return b.WriteString(string(r))
-		}
-	}
-	size = utf8.EncodeRune(b.buf[b.n:], r)
-	b.n += size
-	return size, nil
-}
-
-// WriteString writes a string.
-// It returns the number of bytes written.
-// If the count is less than len(s), it also returns an error explaining
-// why the write is short.
-func (b *Writer) WriteString(s string) (int, error) {
-	nn := 0
-	for len(s) > b.Available() && b.err == nil {
-		n := copy(b.buf[b.n:], s)
-		b.n += n
-		nn += n
-		s = s[n:]
-		b.flush()
-	}
-	if b.err != nil {
-		return nn, b.err
-	}
-	n := copy(b.buf[b.n:], s)
-	b.n += n
-	nn += n
-	return nn, nil
-}
-
-// ReadFrom implements io.ReaderFrom.
-func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) {
-	if b.Buffered() == 0 {
-		if w, ok := b.wr.(io.ReaderFrom); ok {
-			return w.ReadFrom(r)
-		}
-	}
-	var m int
-	for {
-		if b.Available() == 0 {
-			if err1 := b.flush(); err1 != nil {
-				return n, err1
-			}
-		}
-		nr := 0
-		for nr < maxConsecutiveEmptyReads {
-			m, err = r.Read(b.buf[b.n:])
-			if m != 0 || err != nil {
-				break
-			}
-			nr++
-		}
-		if nr == maxConsecutiveEmptyReads {
-			return n, io.ErrNoProgress
-		}
-		b.n += m
-		n += int64(m)
-		if err != nil {
-			break
-		}
-	}
-	if err == io.EOF {
-		// If we filled the buffer exactly, flush pre-emptively.
-		if b.Available() == 0 {
-			err = b.flush()
-		} else {
-			err = nil
-		}
-	}
-	return n, err
-}
-
-// buffered input and output
-
-// ReadWriter stores pointers to a Reader and a Writer.
-// It implements io.ReadWriter.
-type ReadWriter struct {
-	*Reader
-	*Writer
-}
-
-// NewReadWriter allocates a new ReadWriter that dispatches to r and w.
-func NewReadWriter(r *Reader, w *Writer) *ReadWriter {
-	return &ReadWriter{r, w}
-}
diff --git a/third_party/gofrontend/libgo/go/bufio/bufio_test.go b/third_party/gofrontend/libgo/go/bufio/bufio_test.go
deleted file mode 100644
index 666c44e..0000000
--- a/third_party/gofrontend/libgo/go/bufio/bufio_test.go
+++ /dev/null
@@ -1,1572 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bufio_test
-
-import (
-	. "bufio"
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"strings"
-	"testing"
-	"testing/iotest"
-	"time"
-	"unicode/utf8"
-)
-
-// Reads from a reader and rot13s the result.
-type rot13Reader struct {
-	r io.Reader
-}
-
-func newRot13Reader(r io.Reader) *rot13Reader {
-	r13 := new(rot13Reader)
-	r13.r = r
-	return r13
-}
-
-func (r13 *rot13Reader) Read(p []byte) (int, error) {
-	n, err := r13.r.Read(p)
-	for i := 0; i < n; i++ {
-		c := p[i] | 0x20 // lowercase byte
-		if 'a' <= c && c <= 'm' {
-			p[i] += 13
-		} else if 'n' <= c && c <= 'z' {
-			p[i] -= 13
-		}
-	}
-	return n, err
-}
-
-// Call ReadByte to accumulate the text of a file
-func readBytes(buf *Reader) string {
-	var b [1000]byte
-	nb := 0
-	for {
-		c, err := buf.ReadByte()
-		if err == io.EOF {
-			break
-		}
-		if err == nil {
-			b[nb] = c
-			nb++
-		} else if err != iotest.ErrTimeout {
-			panic("Data: " + err.Error())
-		}
-	}
-	return string(b[0:nb])
-}
-
-func TestReaderSimple(t *testing.T) {
-	data := "hello world"
-	b := NewReader(strings.NewReader(data))
-	if s := readBytes(b); s != "hello world" {
-		t.Errorf("simple hello world test failed: got %q", s)
-	}
-
-	b = NewReader(newRot13Reader(strings.NewReader(data)))
-	if s := readBytes(b); s != "uryyb jbeyq" {
-		t.Errorf("rot13 hello world test failed: got %q", s)
-	}
-}
-
-type readMaker struct {
-	name string
-	fn   func(io.Reader) io.Reader
-}
-
-var readMakers = []readMaker{
-	{"full", func(r io.Reader) io.Reader { return r }},
-	{"byte", iotest.OneByteReader},
-	{"half", iotest.HalfReader},
-	{"data+err", iotest.DataErrReader},
-	{"timeout", iotest.TimeoutReader},
-}
-
-// Call ReadString (which ends up calling everything else)
-// to accumulate the text of a file.
-func readLines(b *Reader) string {
-	s := ""
-	for {
-		s1, err := b.ReadString('\n')
-		if err == io.EOF {
-			break
-		}
-		if err != nil && err != iotest.ErrTimeout {
-			panic("GetLines: " + err.Error())
-		}
-		s += s1
-	}
-	return s
-}
-
-// Call Read to accumulate the text of a file
-func reads(buf *Reader, m int) string {
-	var b [1000]byte
-	nb := 0
-	for {
-		n, err := buf.Read(b[nb : nb+m])
-		nb += n
-		if err == io.EOF {
-			break
-		}
-	}
-	return string(b[0:nb])
-}
-
-type bufReader struct {
-	name string
-	fn   func(*Reader) string
-}
-
-var bufreaders = []bufReader{
-	{"1", func(b *Reader) string { return reads(b, 1) }},
-	{"2", func(b *Reader) string { return reads(b, 2) }},
-	{"3", func(b *Reader) string { return reads(b, 3) }},
-	{"4", func(b *Reader) string { return reads(b, 4) }},
-	{"5", func(b *Reader) string { return reads(b, 5) }},
-	{"7", func(b *Reader) string { return reads(b, 7) }},
-	{"bytes", readBytes},
-	{"lines", readLines},
-}
-
-const minReadBufferSize = 16
-
-var bufsizes = []int{
-	0, minReadBufferSize, 23, 32, 46, 64, 93, 128, 1024, 4096,
-}
-
-func TestReader(t *testing.T) {
-	var texts [31]string
-	str := ""
-	all := ""
-	for i := 0; i < len(texts)-1; i++ {
-		texts[i] = str + "\n"
-		all += texts[i]
-		str += string(i%26 + 'a')
-	}
-	texts[len(texts)-1] = all
-
-	for h := 0; h < len(texts); h++ {
-		text := texts[h]
-		for i := 0; i < len(readMakers); i++ {
-			for j := 0; j < len(bufreaders); j++ {
-				for k := 0; k < len(bufsizes); k++ {
-					readmaker := readMakers[i]
-					bufreader := bufreaders[j]
-					bufsize := bufsizes[k]
-					read := readmaker.fn(strings.NewReader(text))
-					buf := NewReaderSize(read, bufsize)
-					s := bufreader.fn(buf)
-					if s != text {
-						t.Errorf("reader=%s fn=%s bufsize=%d want=%q got=%q",
-							readmaker.name, bufreader.name, bufsize, text, s)
-					}
-				}
-			}
-		}
-	}
-}
-
-type zeroReader struct{}
-
-func (zeroReader) Read(p []byte) (int, error) {
-	return 0, nil
-}
-
-func TestZeroReader(t *testing.T) {
-	var z zeroReader
-	r := NewReader(z)
-
-	c := make(chan error)
-	go func() {
-		_, err := r.ReadByte()
-		c <- err
-	}()
-
-	select {
-	case err := <-c:
-		if err == nil {
-			t.Error("error expected")
-		} else if err != io.ErrNoProgress {
-			t.Error("unexpected error:", err)
-		}
-	case <-time.After(time.Second):
-		t.Error("test timed out (endless loop in ReadByte?)")
-	}
-}
-
-// A StringReader delivers its data one string segment at a time via Read.
-type StringReader struct {
-	data []string
-	step int
-}
-
-func (r *StringReader) Read(p []byte) (n int, err error) {
-	if r.step < len(r.data) {
-		s := r.data[r.step]
-		n = copy(p, s)
-		r.step++
-	} else {
-		err = io.EOF
-	}
-	return
-}
-
-func readRuneSegments(t *testing.T, segments []string) {
-	got := ""
-	want := strings.Join(segments, "")
-	r := NewReader(&StringReader{data: segments})
-	for {
-		r, _, err := r.ReadRune()
-		if err != nil {
-			if err != io.EOF {
-				return
-			}
-			break
-		}
-		got += string(r)
-	}
-	if got != want {
-		t.Errorf("segments=%v got=%s want=%s", segments, got, want)
-	}
-}
-
-var segmentList = [][]string{
-	{},
-	{""},
-	{"日", "本語"},
-	{"\u65e5", "\u672c", "\u8a9e"},
-	{"\U000065e5", "\U0000672c", "\U00008a9e"},
-	{"\xe6", "\x97\xa5\xe6", "\x9c\xac\xe8\xaa\x9e"},
-	{"Hello", ", ", "World", "!"},
-	{"Hello", ", ", "", "World", "!"},
-}
-
-func TestReadRune(t *testing.T) {
-	for _, s := range segmentList {
-		readRuneSegments(t, s)
-	}
-}
-
-func TestUnreadRune(t *testing.T) {
-	segments := []string{"Hello, world:", "日本語"}
-	r := NewReader(&StringReader{data: segments})
-	got := ""
-	want := strings.Join(segments, "")
-	// Normal execution.
-	for {
-		r1, _, err := r.ReadRune()
-		if err != nil {
-			if err != io.EOF {
-				t.Error("unexpected error on ReadRune:", err)
-			}
-			break
-		}
-		got += string(r1)
-		// Put it back and read it again.
-		if err = r.UnreadRune(); err != nil {
-			t.Fatal("unexpected error on UnreadRune:", err)
-		}
-		r2, _, err := r.ReadRune()
-		if err != nil {
-			t.Fatal("unexpected error reading after unreading:", err)
-		}
-		if r1 != r2 {
-			t.Fatalf("incorrect rune after unread: got %c, want %c", r1, r2)
-		}
-	}
-	if got != want {
-		t.Errorf("got %q, want %q", got, want)
-	}
-}
-
-func TestUnreadByte(t *testing.T) {
-	segments := []string{"Hello, ", "world"}
-	r := NewReader(&StringReader{data: segments})
-	got := ""
-	want := strings.Join(segments, "")
-	// Normal execution.
-	for {
-		b1, err := r.ReadByte()
-		if err != nil {
-			if err != io.EOF {
-				t.Error("unexpected error on ReadByte:", err)
-			}
-			break
-		}
-		got += string(b1)
-		// Put it back and read it again.
-		if err = r.UnreadByte(); err != nil {
-			t.Fatal("unexpected error on UnreadByte:", err)
-		}
-		b2, err := r.ReadByte()
-		if err != nil {
-			t.Fatal("unexpected error reading after unreading:", err)
-		}
-		if b1 != b2 {
-			t.Fatalf("incorrect byte after unread: got %q, want %q", b1, b2)
-		}
-	}
-	if got != want {
-		t.Errorf("got %q, want %q", got, want)
-	}
-}
-
-func TestUnreadByteMultiple(t *testing.T) {
-	segments := []string{"Hello, ", "world"}
-	data := strings.Join(segments, "")
-	for n := 0; n <= len(data); n++ {
-		r := NewReader(&StringReader{data: segments})
-		// Read n bytes.
-		for i := 0; i < n; i++ {
-			b, err := r.ReadByte()
-			if err != nil {
-				t.Fatalf("n = %d: unexpected error on ReadByte: %v", n, err)
-			}
-			if b != data[i] {
-				t.Fatalf("n = %d: incorrect byte returned from ReadByte: got %q, want %q", n, b, data[i])
-			}
-		}
-		// Unread one byte if there is one.
-		if n > 0 {
-			if err := r.UnreadByte(); err != nil {
-				t.Errorf("n = %d: unexpected error on UnreadByte: %v", n, err)
-			}
-		}
-		// Test that we cannot unread any further.
-		if err := r.UnreadByte(); err == nil {
-			t.Errorf("n = %d: expected error on UnreadByte", n)
-		}
-	}
-}
-
-func TestUnreadByteOthers(t *testing.T) {
-	// A list of readers to use in conjunction with UnreadByte.
-	var readers = []func(*Reader, byte) ([]byte, error){
-		(*Reader).ReadBytes,
-		(*Reader).ReadSlice,
-		func(r *Reader, delim byte) ([]byte, error) {
-			data, err := r.ReadString(delim)
-			return []byte(data), err
-		},
-		// ReadLine doesn't fit the data/pattern easily
-		// so we leave it out. It should be covered via
-		// the ReadSlice test since ReadLine simply calls
-		// ReadSlice, and it's that function that handles
-		// the last byte.
-	}
-
-	// Try all readers with UnreadByte.
-	for rno, read := range readers {
-		// Some input data that is longer than the minimum reader buffer size.
-		const n = 10
-		var buf bytes.Buffer
-		for i := 0; i < n; i++ {
-			buf.WriteString("abcdefg")
-		}
-
-		r := NewReaderSize(&buf, minReadBufferSize)
-		readTo := func(delim byte, want string) {
-			data, err := read(r, delim)
-			if err != nil {
-				t.Fatalf("#%d: unexpected error reading to %c: %v", rno, delim, err)
-			}
-			if got := string(data); got != want {
-				t.Fatalf("#%d: got %q, want %q", rno, got, want)
-			}
-		}
-
-		// Read the data with occasional UnreadByte calls.
-		for i := 0; i < n; i++ {
-			readTo('d', "abcd")
-			for j := 0; j < 3; j++ {
-				if err := r.UnreadByte(); err != nil {
-					t.Fatalf("#%d: unexpected error on UnreadByte: %v", rno, err)
-				}
-				readTo('d', "d")
-			}
-			readTo('g', "efg")
-		}
-
-		// All data should have been read.
-		_, err := r.ReadByte()
-		if err != io.EOF {
-			t.Errorf("#%d: got error %v; want EOF", rno, err)
-		}
-	}
-}
-
-// Test that UnreadRune fails if the preceding operation was not a ReadRune.
-func TestUnreadRuneError(t *testing.T) {
-	buf := make([]byte, 3) // All runes in this test are 3 bytes long
-	r := NewReader(&StringReader{data: []string{"日本語日本語日本語"}})
-	if r.UnreadRune() == nil {
-		t.Error("expected error on UnreadRune from fresh buffer")
-	}
-	_, _, err := r.ReadRune()
-	if err != nil {
-		t.Error("unexpected error on ReadRune (1):", err)
-	}
-	if err = r.UnreadRune(); err != nil {
-		t.Error("unexpected error on UnreadRune (1):", err)
-	}
-	if r.UnreadRune() == nil {
-		t.Error("expected error after UnreadRune (1)")
-	}
-	// Test error after Read.
-	_, _, err = r.ReadRune() // reset state
-	if err != nil {
-		t.Error("unexpected error on ReadRune (2):", err)
-	}
-	_, err = r.Read(buf)
-	if err != nil {
-		t.Error("unexpected error on Read (2):", err)
-	}
-	if r.UnreadRune() == nil {
-		t.Error("expected error after Read (2)")
-	}
-	// Test error after ReadByte.
-	_, _, err = r.ReadRune() // reset state
-	if err != nil {
-		t.Error("unexpected error on ReadRune (2):", err)
-	}
-	for range buf {
-		_, err = r.ReadByte()
-		if err != nil {
-			t.Error("unexpected error on ReadByte (2):", err)
-		}
-	}
-	if r.UnreadRune() == nil {
-		t.Error("expected error after ReadByte")
-	}
-	// Test error after UnreadByte.
-	_, _, err = r.ReadRune() // reset state
-	if err != nil {
-		t.Error("unexpected error on ReadRune (3):", err)
-	}
-	_, err = r.ReadByte()
-	if err != nil {
-		t.Error("unexpected error on ReadByte (3):", err)
-	}
-	err = r.UnreadByte()
-	if err != nil {
-		t.Error("unexpected error on UnreadByte (3):", err)
-	}
-	if r.UnreadRune() == nil {
-		t.Error("expected error after UnreadByte (3)")
-	}
-	// Test error after ReadSlice.
-	_, _, err = r.ReadRune() // reset state
-	if err != nil {
-		t.Error("unexpected error on ReadRune (4):", err)
-	}
-	_, err = r.ReadSlice(0)
-	if err != io.EOF {
-		t.Error("unexpected error on ReadSlice (4):", err)
-	}
-	if r.UnreadRune() == nil {
-		t.Error("expected error after ReadSlice (4)")
-	}
-}
-
-func TestUnreadRuneAtEOF(t *testing.T) {
-	// UnreadRune/ReadRune should error at EOF (was a bug; used to panic)
-	r := NewReader(strings.NewReader("x"))
-	r.ReadRune()
-	r.ReadRune()
-	r.UnreadRune()
-	_, _, err := r.ReadRune()
-	if err == nil {
-		t.Error("expected error at EOF")
-	} else if err != io.EOF {
-		t.Error("expected EOF; got", err)
-	}
-}
-
-func TestReadWriteRune(t *testing.T) {
-	const NRune = 1000
-	byteBuf := new(bytes.Buffer)
-	w := NewWriter(byteBuf)
-	// Write the runes out using WriteRune
-	buf := make([]byte, utf8.UTFMax)
-	for r := rune(0); r < NRune; r++ {
-		size := utf8.EncodeRune(buf, r)
-		nbytes, err := w.WriteRune(r)
-		if err != nil {
-			t.Fatalf("WriteRune(0x%x) error: %s", r, err)
-		}
-		if nbytes != size {
-			t.Fatalf("WriteRune(0x%x) expected %d, got %d", r, size, nbytes)
-		}
-	}
-	w.Flush()
-
-	r := NewReader(byteBuf)
-	// Read them back with ReadRune
-	for r1 := rune(0); r1 < NRune; r1++ {
-		size := utf8.EncodeRune(buf, r1)
-		nr, nbytes, err := r.ReadRune()
-		if nr != r1 || nbytes != size || err != nil {
-			t.Fatalf("ReadRune(0x%x) got 0x%x,%d not 0x%x,%d (err=%s)", r1, nr, nbytes, r1, size, err)
-		}
-	}
-}
-
-func TestWriter(t *testing.T) {
-	var data [8192]byte
-
-	for i := 0; i < len(data); i++ {
-		data[i] = byte(' ' + i%('~'-' '))
-	}
-	w := new(bytes.Buffer)
-	for i := 0; i < len(bufsizes); i++ {
-		for j := 0; j < len(bufsizes); j++ {
-			nwrite := bufsizes[i]
-			bs := bufsizes[j]
-
-			// Write nwrite bytes using buffer size bs.
-			// Check that the right amount makes it out
-			// and that the data is correct.
-
-			w.Reset()
-			buf := NewWriterSize(w, bs)
-			context := fmt.Sprintf("nwrite=%d bufsize=%d", nwrite, bs)
-			n, e1 := buf.Write(data[0:nwrite])
-			if e1 != nil || n != nwrite {
-				t.Errorf("%s: buf.Write %d = %d, %v", context, nwrite, n, e1)
-				continue
-			}
-			if e := buf.Flush(); e != nil {
-				t.Errorf("%s: buf.Flush = %v", context, e)
-			}
-
-			written := w.Bytes()
-			if len(written) != nwrite {
-				t.Errorf("%s: %d bytes written", context, len(written))
-			}
-			for l := 0; l < len(written); l++ {
-				if written[i] != data[i] {
-					t.Errorf("wrong bytes written")
-					t.Errorf("want=%q", data[0:len(written)])
-					t.Errorf("have=%q", written)
-				}
-			}
-		}
-	}
-}
-
-// Check that write errors are returned properly.
-
-type errorWriterTest struct {
-	n, m   int
-	err    error
-	expect error
-}
-
-func (w errorWriterTest) Write(p []byte) (int, error) {
-	return len(p) * w.n / w.m, w.err
-}
-
-var errorWriterTests = []errorWriterTest{
-	{0, 1, nil, io.ErrShortWrite},
-	{1, 2, nil, io.ErrShortWrite},
-	{1, 1, nil, nil},
-	{0, 1, io.ErrClosedPipe, io.ErrClosedPipe},
-	{1, 2, io.ErrClosedPipe, io.ErrClosedPipe},
-	{1, 1, io.ErrClosedPipe, io.ErrClosedPipe},
-}
-
-func TestWriteErrors(t *testing.T) {
-	for _, w := range errorWriterTests {
-		buf := NewWriter(w)
-		_, e := buf.Write([]byte("hello world"))
-		if e != nil {
-			t.Errorf("Write hello to %v: %v", w, e)
-			continue
-		}
-		// Two flushes, to verify the error is sticky.
-		for i := 0; i < 2; i++ {
-			e = buf.Flush()
-			if e != w.expect {
-				t.Errorf("Flush %d/2 %v: got %v, wanted %v", i+1, w, e, w.expect)
-			}
-		}
-	}
-}
-
-func TestNewReaderSizeIdempotent(t *testing.T) {
-	const BufSize = 1000
-	b := NewReaderSize(strings.NewReader("hello world"), BufSize)
-	// Does it recognize itself?
-	b1 := NewReaderSize(b, BufSize)
-	if b1 != b {
-		t.Error("NewReaderSize did not detect underlying Reader")
-	}
-	// Does it wrap if existing buffer is too small?
-	b2 := NewReaderSize(b, 2*BufSize)
-	if b2 == b {
-		t.Error("NewReaderSize did not enlarge buffer")
-	}
-}
-
-func TestNewWriterSizeIdempotent(t *testing.T) {
-	const BufSize = 1000
-	b := NewWriterSize(new(bytes.Buffer), BufSize)
-	// Does it recognize itself?
-	b1 := NewWriterSize(b, BufSize)
-	if b1 != b {
-		t.Error("NewWriterSize did not detect underlying Writer")
-	}
-	// Does it wrap if existing buffer is too small?
-	b2 := NewWriterSize(b, 2*BufSize)
-	if b2 == b {
-		t.Error("NewWriterSize did not enlarge buffer")
-	}
-}
-
-func TestWriteString(t *testing.T) {
-	const BufSize = 8
-	buf := new(bytes.Buffer)
-	b := NewWriterSize(buf, BufSize)
-	b.WriteString("0")                         // easy
-	b.WriteString("123456")                    // still easy
-	b.WriteString("7890")                      // easy after flush
-	b.WriteString("abcdefghijklmnopqrstuvwxy") // hard
-	b.WriteString("z")
-	if err := b.Flush(); err != nil {
-		t.Error("WriteString", err)
-	}
-	s := "01234567890abcdefghijklmnopqrstuvwxyz"
-	if string(buf.Bytes()) != s {
-		t.Errorf("WriteString wants %q gets %q", s, string(buf.Bytes()))
-	}
-}
-
-func TestBufferFull(t *testing.T) {
-	const longString = "And now, hello, world! It is the time for all good men to come to the aid of their party"
-	buf := NewReaderSize(strings.NewReader(longString), minReadBufferSize)
-	line, err := buf.ReadSlice('!')
-	if string(line) != "And now, hello, " || err != ErrBufferFull {
-		t.Errorf("first ReadSlice(,) = %q, %v", line, err)
-	}
-	line, err = buf.ReadSlice('!')
-	if string(line) != "world!" || err != nil {
-		t.Errorf("second ReadSlice(,) = %q, %v", line, err)
-	}
-}
-
-func TestPeek(t *testing.T) {
-	p := make([]byte, 10)
-	// string is 16 (minReadBufferSize) long.
-	buf := NewReaderSize(strings.NewReader("abcdefghijklmnop"), minReadBufferSize)
-	if s, err := buf.Peek(1); string(s) != "a" || err != nil {
-		t.Fatalf("want %q got %q, err=%v", "a", string(s), err)
-	}
-	if s, err := buf.Peek(4); string(s) != "abcd" || err != nil {
-		t.Fatalf("want %q got %q, err=%v", "abcd", string(s), err)
-	}
-	if _, err := buf.Peek(-1); err != ErrNegativeCount {
-		t.Fatalf("want ErrNegativeCount got %v", err)
-	}
-	if _, err := buf.Peek(32); err != ErrBufferFull {
-		t.Fatalf("want ErrBufFull got %v", err)
-	}
-	if _, err := buf.Read(p[0:3]); string(p[0:3]) != "abc" || err != nil {
-		t.Fatalf("want %q got %q, err=%v", "abc", string(p[0:3]), err)
-	}
-	if s, err := buf.Peek(1); string(s) != "d" || err != nil {
-		t.Fatalf("want %q got %q, err=%v", "d", string(s), err)
-	}
-	if s, err := buf.Peek(2); string(s) != "de" || err != nil {
-		t.Fatalf("want %q got %q, err=%v", "de", string(s), err)
-	}
-	if _, err := buf.Read(p[0:3]); string(p[0:3]) != "def" || err != nil {
-		t.Fatalf("want %q got %q, err=%v", "def", string(p[0:3]), err)
-	}
-	if s, err := buf.Peek(4); string(s) != "ghij" || err != nil {
-		t.Fatalf("want %q got %q, err=%v", "ghij", string(s), err)
-	}
-	if _, err := buf.Read(p[0:]); string(p[0:]) != "ghijklmnop" || err != nil {
-		t.Fatalf("want %q got %q, err=%v", "ghijklmnop", string(p[0:minReadBufferSize]), err)
-	}
-	if s, err := buf.Peek(0); string(s) != "" || err != nil {
-		t.Fatalf("want %q got %q, err=%v", "", string(s), err)
-	}
-	if _, err := buf.Peek(1); err != io.EOF {
-		t.Fatalf("want EOF got %v", err)
-	}
-
-	// Test for issue 3022, not exposing a reader's error on a successful Peek.
-	buf = NewReaderSize(dataAndEOFReader("abcd"), 32)
-	if s, err := buf.Peek(2); string(s) != "ab" || err != nil {
-		t.Errorf(`Peek(2) on "abcd", EOF = %q, %v; want "ab", nil`, string(s), err)
-	}
-	if s, err := buf.Peek(4); string(s) != "abcd" || err != nil {
-		t.Errorf(`Peek(4) on "abcd", EOF = %q, %v; want "abcd", nil`, string(s), err)
-	}
-	if n, err := buf.Read(p[0:5]); string(p[0:n]) != "abcd" || err != nil {
-		t.Fatalf("Read after peek = %q, %v; want abcd, EOF", p[0:n], err)
-	}
-	if n, err := buf.Read(p[0:1]); string(p[0:n]) != "" || err != io.EOF {
-		t.Fatalf(`second Read after peek = %q, %v; want "", EOF`, p[0:n], err)
-	}
-}
-
-type dataAndEOFReader string
-
-func (r dataAndEOFReader) Read(p []byte) (int, error) {
-	return copy(p, r), io.EOF
-}
-
-func TestPeekThenUnreadRune(t *testing.T) {
-	// This sequence used to cause a crash.
-	r := NewReader(strings.NewReader("x"))
-	r.ReadRune()
-	r.Peek(1)
-	r.UnreadRune()
-	r.ReadRune() // Used to panic here
-}
-
-var testOutput = []byte("0123456789abcdefghijklmnopqrstuvwxy")
-var testInput = []byte("012\n345\n678\n9ab\ncde\nfgh\nijk\nlmn\nopq\nrst\nuvw\nxy")
-var testInputrn = []byte("012\r\n345\r\n678\r\n9ab\r\ncde\r\nfgh\r\nijk\r\nlmn\r\nopq\r\nrst\r\nuvw\r\nxy\r\n\n\r\n")
-
-// TestReader wraps a []byte and returns reads of a specific length.
-type testReader struct {
-	data   []byte
-	stride int
-}
-
-func (t *testReader) Read(buf []byte) (n int, err error) {
-	n = t.stride
-	if n > len(t.data) {
-		n = len(t.data)
-	}
-	if n > len(buf) {
-		n = len(buf)
-	}
-	copy(buf, t.data)
-	t.data = t.data[n:]
-	if len(t.data) == 0 {
-		err = io.EOF
-	}
-	return
-}
-
-func testReadLine(t *testing.T, input []byte) {
-	//for stride := 1; stride < len(input); stride++ {
-	for stride := 1; stride < 2; stride++ {
-		done := 0
-		reader := testReader{input, stride}
-		l := NewReaderSize(&reader, len(input)+1)
-		for {
-			line, isPrefix, err := l.ReadLine()
-			if len(line) > 0 && err != nil {
-				t.Errorf("ReadLine returned both data and error: %s", err)
-			}
-			if isPrefix {
-				t.Errorf("ReadLine returned prefix")
-			}
-			if err != nil {
-				if err != io.EOF {
-					t.Fatalf("Got unknown error: %s", err)
-				}
-				break
-			}
-			if want := testOutput[done : done+len(line)]; !bytes.Equal(want, line) {
-				t.Errorf("Bad line at stride %d: want: %x got: %x", stride, want, line)
-			}
-			done += len(line)
-		}
-		if done != len(testOutput) {
-			t.Errorf("ReadLine didn't return everything: got: %d, want: %d (stride: %d)", done, len(testOutput), stride)
-		}
-	}
-}
-
-func TestReadLine(t *testing.T) {
-	testReadLine(t, testInput)
-	testReadLine(t, testInputrn)
-}
-
-func TestLineTooLong(t *testing.T) {
-	data := make([]byte, 0)
-	for i := 0; i < minReadBufferSize*5/2; i++ {
-		data = append(data, '0'+byte(i%10))
-	}
-	buf := bytes.NewReader(data)
-	l := NewReaderSize(buf, minReadBufferSize)
-	line, isPrefix, err := l.ReadLine()
-	if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil {
-		t.Errorf("bad result for first line: got %q want %q %v", line, data[:minReadBufferSize], err)
-	}
-	data = data[len(line):]
-	line, isPrefix, err = l.ReadLine()
-	if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil {
-		t.Errorf("bad result for second line: got %q want %q %v", line, data[:minReadBufferSize], err)
-	}
-	data = data[len(line):]
-	line, isPrefix, err = l.ReadLine()
-	if isPrefix || !bytes.Equal(line, data[:minReadBufferSize/2]) || err != nil {
-		t.Errorf("bad result for third line: got %q want %q %v", line, data[:minReadBufferSize/2], err)
-	}
-	line, isPrefix, err = l.ReadLine()
-	if isPrefix || err == nil {
-		t.Errorf("expected no more lines: %x %s", line, err)
-	}
-}
-
-func TestReadAfterLines(t *testing.T) {
-	line1 := "this is line1"
-	restData := "this is line2\nthis is line 3\n"
-	inbuf := bytes.NewReader([]byte(line1 + "\n" + restData))
-	outbuf := new(bytes.Buffer)
-	maxLineLength := len(line1) + len(restData)/2
-	l := NewReaderSize(inbuf, maxLineLength)
-	line, isPrefix, err := l.ReadLine()
-	if isPrefix || err != nil || string(line) != line1 {
-		t.Errorf("bad result for first line: isPrefix=%v err=%v line=%q", isPrefix, err, string(line))
-	}
-	n, err := io.Copy(outbuf, l)
-	if int(n) != len(restData) || err != nil {
-		t.Errorf("bad result for Read: n=%d err=%v", n, err)
-	}
-	if outbuf.String() != restData {
-		t.Errorf("bad result for Read: got %q; expected %q", outbuf.String(), restData)
-	}
-}
-
-func TestReadEmptyBuffer(t *testing.T) {
-	l := NewReaderSize(new(bytes.Buffer), minReadBufferSize)
-	line, isPrefix, err := l.ReadLine()
-	if err != io.EOF {
-		t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err)
-	}
-}
-
-func TestLinesAfterRead(t *testing.T) {
-	l := NewReaderSize(bytes.NewReader([]byte("foo")), minReadBufferSize)
-	_, err := ioutil.ReadAll(l)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	line, isPrefix, err := l.ReadLine()
-	if err != io.EOF {
-		t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err)
-	}
-}
-
-func TestReadLineNonNilLineOrError(t *testing.T) {
-	r := NewReader(strings.NewReader("line 1\n"))
-	for i := 0; i < 2; i++ {
-		l, _, err := r.ReadLine()
-		if l != nil && err != nil {
-			t.Fatalf("on line %d/2; ReadLine=%#v, %v; want non-nil line or Error, but not both",
-				i+1, l, err)
-		}
-	}
-}
-
-type readLineResult struct {
-	line     []byte
-	isPrefix bool
-	err      error
-}
-
-var readLineNewlinesTests = []struct {
-	input  string
-	expect []readLineResult
-}{
-	{"012345678901234\r\n012345678901234\r\n", []readLineResult{
-		{[]byte("012345678901234"), true, nil},
-		{nil, false, nil},
-		{[]byte("012345678901234"), true, nil},
-		{nil, false, nil},
-		{nil, false, io.EOF},
-	}},
-	{"0123456789012345\r012345678901234\r", []readLineResult{
-		{[]byte("0123456789012345"), true, nil},
-		{[]byte("\r012345678901234"), true, nil},
-		{[]byte("\r"), false, nil},
-		{nil, false, io.EOF},
-	}},
-}
-
-func TestReadLineNewlines(t *testing.T) {
-	for _, e := range readLineNewlinesTests {
-		testReadLineNewlines(t, e.input, e.expect)
-	}
-}
-
-func testReadLineNewlines(t *testing.T, input string, expect []readLineResult) {
-	b := NewReaderSize(strings.NewReader(input), minReadBufferSize)
-	for i, e := range expect {
-		line, isPrefix, err := b.ReadLine()
-		if !bytes.Equal(line, e.line) {
-			t.Errorf("%q call %d, line == %q, want %q", input, i, line, e.line)
-			return
-		}
-		if isPrefix != e.isPrefix {
-			t.Errorf("%q call %d, isPrefix == %v, want %v", input, i, isPrefix, e.isPrefix)
-			return
-		}
-		if err != e.err {
-			t.Errorf("%q call %d, err == %v, want %v", input, i, err, e.err)
-			return
-		}
-	}
-}
-
-func createTestInput(n int) []byte {
-	input := make([]byte, n)
-	for i := range input {
-		// 101 and 251 are arbitrary prime numbers.
-		// The idea is to create an input sequence
-		// which doesn't repeat too frequently.
-		input[i] = byte(i % 251)
-		if i%101 == 0 {
-			input[i] ^= byte(i / 101)
-		}
-	}
-	return input
-}
-
-func TestReaderWriteTo(t *testing.T) {
-	input := createTestInput(8192)
-	r := NewReader(onlyReader{bytes.NewReader(input)})
-	w := new(bytes.Buffer)
-	if n, err := r.WriteTo(w); err != nil || n != int64(len(input)) {
-		t.Fatalf("r.WriteTo(w) = %d, %v, want %d, nil", n, err, len(input))
-	}
-
-	for i, val := range w.Bytes() {
-		if val != input[i] {
-			t.Errorf("after write: out[%d] = %#x, want %#x", i, val, input[i])
-		}
-	}
-}
-
-type errorWriterToTest struct {
-	rn, wn     int
-	rerr, werr error
-	expected   error
-}
-
-func (r errorWriterToTest) Read(p []byte) (int, error) {
-	return len(p) * r.rn, r.rerr
-}
-
-func (w errorWriterToTest) Write(p []byte) (int, error) {
-	return len(p) * w.wn, w.werr
-}
-
-var errorWriterToTests = []errorWriterToTest{
-	{1, 0, nil, io.ErrClosedPipe, io.ErrClosedPipe},
-	{0, 1, io.ErrClosedPipe, nil, io.ErrClosedPipe},
-	{0, 0, io.ErrUnexpectedEOF, io.ErrClosedPipe, io.ErrClosedPipe},
-	{0, 1, io.EOF, nil, nil},
-}
-
-func TestReaderWriteToErrors(t *testing.T) {
-	for i, rw := range errorWriterToTests {
-		r := NewReader(rw)
-		if _, err := r.WriteTo(rw); err != rw.expected {
-			t.Errorf("r.WriteTo(errorWriterToTests[%d]) = _, %v, want _,%v", i, err, rw.expected)
-		}
-	}
-}
-
-func TestWriterReadFrom(t *testing.T) {
-	ws := []func(io.Writer) io.Writer{
-		func(w io.Writer) io.Writer { return onlyWriter{w} },
-		func(w io.Writer) io.Writer { return w },
-	}
-
-	rs := []func(io.Reader) io.Reader{
-		iotest.DataErrReader,
-		func(r io.Reader) io.Reader { return r },
-	}
-
-	for ri, rfunc := range rs {
-		for wi, wfunc := range ws {
-			input := createTestInput(8192)
-			b := new(bytes.Buffer)
-			w := NewWriter(wfunc(b))
-			r := rfunc(bytes.NewReader(input))
-			if n, err := w.ReadFrom(r); err != nil || n != int64(len(input)) {
-				t.Errorf("ws[%d],rs[%d]: w.ReadFrom(r) = %d, %v, want %d, nil", wi, ri, n, err, len(input))
-				continue
-			}
-			if err := w.Flush(); err != nil {
-				t.Errorf("Flush returned %v", err)
-				continue
-			}
-			if got, want := b.String(), string(input); got != want {
-				t.Errorf("ws[%d], rs[%d]:\ngot  %q\nwant %q\n", wi, ri, got, want)
-			}
-		}
-	}
-}
-
-type errorReaderFromTest struct {
-	rn, wn     int
-	rerr, werr error
-	expected   error
-}
-
-func (r errorReaderFromTest) Read(p []byte) (int, error) {
-	return len(p) * r.rn, r.rerr
-}
-
-func (w errorReaderFromTest) Write(p []byte) (int, error) {
-	return len(p) * w.wn, w.werr
-}
-
-var errorReaderFromTests = []errorReaderFromTest{
-	{0, 1, io.EOF, nil, nil},
-	{1, 1, io.EOF, nil, nil},
-	{0, 1, io.ErrClosedPipe, nil, io.ErrClosedPipe},
-	{0, 0, io.ErrClosedPipe, io.ErrShortWrite, io.ErrClosedPipe},
-	{1, 0, nil, io.ErrShortWrite, io.ErrShortWrite},
-}
-
-func TestWriterReadFromErrors(t *testing.T) {
-	for i, rw := range errorReaderFromTests {
-		w := NewWriter(rw)
-		if _, err := w.ReadFrom(rw); err != rw.expected {
-			t.Errorf("w.ReadFrom(errorReaderFromTests[%d]) = _, %v, want _,%v", i, err, rw.expected)
-		}
-	}
-}
-
-// TestWriterReadFromCounts tests that using io.Copy to copy into a
-// bufio.Writer does not prematurely flush the buffer. For example, when
-// buffering writes to a network socket, excessive network writes should be
-// avoided.
-func TestWriterReadFromCounts(t *testing.T) {
-	var w0 writeCountingDiscard
-	b0 := NewWriterSize(&w0, 1234)
-	b0.WriteString(strings.Repeat("x", 1000))
-	if w0 != 0 {
-		t.Fatalf("write 1000 'x's: got %d writes, want 0", w0)
-	}
-	b0.WriteString(strings.Repeat("x", 200))
-	if w0 != 0 {
-		t.Fatalf("write 1200 'x's: got %d writes, want 0", w0)
-	}
-	io.Copy(b0, onlyReader{strings.NewReader(strings.Repeat("x", 30))})
-	if w0 != 0 {
-		t.Fatalf("write 1230 'x's: got %d writes, want 0", w0)
-	}
-	io.Copy(b0, onlyReader{strings.NewReader(strings.Repeat("x", 9))})
-	if w0 != 1 {
-		t.Fatalf("write 1239 'x's: got %d writes, want 1", w0)
-	}
-
-	var w1 writeCountingDiscard
-	b1 := NewWriterSize(&w1, 1234)
-	b1.WriteString(strings.Repeat("x", 1200))
-	b1.Flush()
-	if w1 != 1 {
-		t.Fatalf("flush 1200 'x's: got %d writes, want 1", w1)
-	}
-	b1.WriteString(strings.Repeat("x", 89))
-	if w1 != 1 {
-		t.Fatalf("write 1200 + 89 'x's: got %d writes, want 1", w1)
-	}
-	io.Copy(b1, onlyReader{strings.NewReader(strings.Repeat("x", 700))})
-	if w1 != 1 {
-		t.Fatalf("write 1200 + 789 'x's: got %d writes, want 1", w1)
-	}
-	io.Copy(b1, onlyReader{strings.NewReader(strings.Repeat("x", 600))})
-	if w1 != 2 {
-		t.Fatalf("write 1200 + 1389 'x's: got %d writes, want 2", w1)
-	}
-	b1.Flush()
-	if w1 != 3 {
-		t.Fatalf("flush 1200 + 1389 'x's: got %d writes, want 3", w1)
-	}
-}
-
-// A writeCountingDiscard is like ioutil.Discard and counts the number of times
-// Write is called on it.
-type writeCountingDiscard int
-
-func (w *writeCountingDiscard) Write(p []byte) (int, error) {
-	*w++
-	return len(p), nil
-}
-
-type negativeReader int
-
-func (r *negativeReader) Read([]byte) (int, error) { return -1, nil }
-
-func TestNegativeRead(t *testing.T) {
-	// should panic with a description pointing at the reader, not at itself.
-	// (should NOT panic with slice index error, for example.)
-	b := NewReader(new(negativeReader))
-	defer func() {
-		switch err := recover().(type) {
-		case nil:
-			t.Fatal("read did not panic")
-		case error:
-			if !strings.Contains(err.Error(), "reader returned negative count from Read") {
-				t.Fatalf("wrong panic: %v", err)
-			}
-		default:
-			t.Fatalf("unexpected panic value: %T(%v)", err, err)
-		}
-	}()
-	b.Read(make([]byte, 100))
-}
-
-var errFake = errors.New("fake error")
-
-type errorThenGoodReader struct {
-	didErr bool
-	nread  int
-}
-
-func (r *errorThenGoodReader) Read(p []byte) (int, error) {
-	r.nread++
-	if !r.didErr {
-		r.didErr = true
-		return 0, errFake
-	}
-	return len(p), nil
-}
-
-func TestReaderClearError(t *testing.T) {
-	r := &errorThenGoodReader{}
-	b := NewReader(r)
-	buf := make([]byte, 1)
-	if _, err := b.Read(nil); err != nil {
-		t.Fatalf("1st nil Read = %v; want nil", err)
-	}
-	if _, err := b.Read(buf); err != errFake {
-		t.Fatalf("1st Read = %v; want errFake", err)
-	}
-	if _, err := b.Read(nil); err != nil {
-		t.Fatalf("2nd nil Read = %v; want nil", err)
-	}
-	if _, err := b.Read(buf); err != nil {
-		t.Fatalf("3rd Read with buffer = %v; want nil", err)
-	}
-	if r.nread != 2 {
-		t.Errorf("num reads = %d; want 2", r.nread)
-	}
-}
-
-// Test for golang.org/issue/5947
-func TestWriterReadFromWhileFull(t *testing.T) {
-	buf := new(bytes.Buffer)
-	w := NewWriterSize(buf, 10)
-
-	// Fill buffer exactly.
-	n, err := w.Write([]byte("0123456789"))
-	if n != 10 || err != nil {
-		t.Fatalf("Write returned (%v, %v), want (10, nil)", n, err)
-	}
-
-	// Use ReadFrom to read in some data.
-	n2, err := w.ReadFrom(strings.NewReader("abcdef"))
-	if n2 != 6 || err != nil {
-		t.Fatalf("ReadFrom returned (%v, %v), want (6, nil)", n2, err)
-	}
-}
-
-type emptyThenNonEmptyReader struct {
-	r io.Reader
-	n int
-}
-
-func (r *emptyThenNonEmptyReader) Read(p []byte) (int, error) {
-	if r.n <= 0 {
-		return r.r.Read(p)
-	}
-	r.n--
-	return 0, nil
-}
-
-// Test for golang.org/issue/7611
-func TestWriterReadFromUntilEOF(t *testing.T) {
-	buf := new(bytes.Buffer)
-	w := NewWriterSize(buf, 5)
-
-	// Partially fill buffer
-	n, err := w.Write([]byte("0123"))
-	if n != 4 || err != nil {
-		t.Fatalf("Write returned (%v, %v), want (4, nil)", n, err)
-	}
-
-	// Use ReadFrom to read in some data.
-	r := &emptyThenNonEmptyReader{r: strings.NewReader("abcd"), n: 3}
-	n2, err := w.ReadFrom(r)
-	if n2 != 4 || err != nil {
-		t.Fatalf("ReadFrom returned (%v, %v), want (4, nil)", n2, err)
-	}
-	w.Flush()
-	if got, want := string(buf.Bytes()), "0123abcd"; got != want {
-		t.Fatalf("buf.Bytes() returned %q, want %q", got, want)
-	}
-}
-
-func TestWriterReadFromErrNoProgress(t *testing.T) {
-	buf := new(bytes.Buffer)
-	w := NewWriterSize(buf, 5)
-
-	// Partially fill buffer
-	n, err := w.Write([]byte("0123"))
-	if n != 4 || err != nil {
-		t.Fatalf("Write returned (%v, %v), want (4, nil)", n, err)
-	}
-
-	// Use ReadFrom to read in some data.
-	r := &emptyThenNonEmptyReader{r: strings.NewReader("abcd"), n: 100}
-	n2, err := w.ReadFrom(r)
-	if n2 != 0 || err != io.ErrNoProgress {
-		t.Fatalf("buf.Bytes() returned (%v, %v), want (0, io.ErrNoProgress)", n2, err)
-	}
-}
-
-func TestReaderReset(t *testing.T) {
-	r := NewReader(strings.NewReader("foo foo"))
-	buf := make([]byte, 3)
-	r.Read(buf)
-	if string(buf) != "foo" {
-		t.Errorf("buf = %q; want foo", buf)
-	}
-	r.Reset(strings.NewReader("bar bar"))
-	all, err := ioutil.ReadAll(r)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if string(all) != "bar bar" {
-		t.Errorf("ReadAll = %q; want bar bar", all)
-	}
-}
-
-func TestWriterReset(t *testing.T) {
-	var buf1, buf2 bytes.Buffer
-	w := NewWriter(&buf1)
-	w.WriteString("foo")
-	w.Reset(&buf2) // and not flushed
-	w.WriteString("bar")
-	w.Flush()
-	if buf1.String() != "" {
-		t.Errorf("buf1 = %q; want empty", buf1.String())
-	}
-	if buf2.String() != "bar" {
-		t.Errorf("buf2 = %q; want bar", buf2.String())
-	}
-}
-
-func TestReaderDiscard(t *testing.T) {
-	tests := []struct {
-		name     string
-		r        io.Reader
-		bufSize  int // 0 means 16
-		peekSize int
-
-		n int // input to Discard
-
-		want    int   // from Discard
-		wantErr error // from Discard
-
-		wantBuffered int
-	}{
-		{
-			name:         "normal case",
-			r:            strings.NewReader("abcdefghijklmnopqrstuvwxyz"),
-			peekSize:     16,
-			n:            6,
-			want:         6,
-			wantBuffered: 10,
-		},
-		{
-			name:         "discard causing read",
-			r:            strings.NewReader("abcdefghijklmnopqrstuvwxyz"),
-			n:            6,
-			want:         6,
-			wantBuffered: 10,
-		},
-		{
-			name:         "discard all without peek",
-			r:            strings.NewReader("abcdefghijklmnopqrstuvwxyz"),
-			n:            26,
-			want:         26,
-			wantBuffered: 0,
-		},
-		{
-			name:         "discard more than end",
-			r:            strings.NewReader("abcdefghijklmnopqrstuvwxyz"),
-			n:            27,
-			want:         26,
-			wantErr:      io.EOF,
-			wantBuffered: 0,
-		},
-		// Any error from filling shouldn't show up until we
-		// get past the valid bytes. Here we return we return 5 valid bytes at the same time
-		// as an error, but test that we don't see the error from Discard.
-		{
-			name: "fill error, discard less",
-			r: newScriptedReader(func(p []byte) (n int, err error) {
-				if len(p) < 5 {
-					panic("unexpected small read")
-				}
-				return 5, errors.New("5-then-error")
-			}),
-			n:            4,
-			want:         4,
-			wantErr:      nil,
-			wantBuffered: 1,
-		},
-		{
-			name: "fill error, discard equal",
-			r: newScriptedReader(func(p []byte) (n int, err error) {
-				if len(p) < 5 {
-					panic("unexpected small read")
-				}
-				return 5, errors.New("5-then-error")
-			}),
-			n:            5,
-			want:         5,
-			wantErr:      nil,
-			wantBuffered: 0,
-		},
-		{
-			name: "fill error, discard more",
-			r: newScriptedReader(func(p []byte) (n int, err error) {
-				if len(p) < 5 {
-					panic("unexpected small read")
-				}
-				return 5, errors.New("5-then-error")
-			}),
-			n:            6,
-			want:         5,
-			wantErr:      errors.New("5-then-error"),
-			wantBuffered: 0,
-		},
-		// Discard of 0 shouldn't cause a read:
-		{
-			name:         "discard zero",
-			r:            newScriptedReader(), // will panic on Read
-			n:            0,
-			want:         0,
-			wantErr:      nil,
-			wantBuffered: 0,
-		},
-		{
-			name:         "discard negative",
-			r:            newScriptedReader(), // will panic on Read
-			n:            -1,
-			want:         0,
-			wantErr:      ErrNegativeCount,
-			wantBuffered: 0,
-		},
-	}
-	for _, tt := range tests {
-		br := NewReaderSize(tt.r, tt.bufSize)
-		if tt.peekSize > 0 {
-			peekBuf, err := br.Peek(tt.peekSize)
-			if err != nil {
-				t.Errorf("%s: Peek(%d): %v", tt.name, tt.peekSize, err)
-				continue
-			}
-			if len(peekBuf) != tt.peekSize {
-				t.Errorf("%s: len(Peek(%d)) = %v; want %v", tt.name, tt.peekSize, len(peekBuf), tt.peekSize)
-				continue
-			}
-		}
-		discarded, err := br.Discard(tt.n)
-		if ge, we := fmt.Sprint(err), fmt.Sprint(tt.wantErr); discarded != tt.want || ge != we {
-			t.Errorf("%s: Discard(%d) = (%v, %v); want (%v, %v)", tt.name, tt.n, discarded, ge, tt.want, we)
-			continue
-		}
-		if bn := br.Buffered(); bn != tt.wantBuffered {
-			t.Errorf("%s: after Discard, Buffered = %d; want %d", tt.name, bn, tt.wantBuffered)
-		}
-	}
-
-}
-
-// An onlyReader only implements io.Reader, no matter what other methods the underlying implementation may have.
-type onlyReader struct {
-	io.Reader
-}
-
-// An onlyWriter only implements io.Writer, no matter what other methods the underlying implementation may have.
-type onlyWriter struct {
-	io.Writer
-}
-
-// A scriptedReader is an io.Reader that executes its steps sequentially.
-type scriptedReader []func(p []byte) (n int, err error)
-
-func (sr *scriptedReader) Read(p []byte) (n int, err error) {
-	if len(*sr) == 0 {
-		panic("too many Read calls on scripted Reader. No steps remain.")
-	}
-	step := (*sr)[0]
-	*sr = (*sr)[1:]
-	return step(p)
-}
-
-func newScriptedReader(steps ...func(p []byte) (n int, err error)) io.Reader {
-	sr := scriptedReader(steps)
-	return &sr
-}
-
-func BenchmarkReaderCopyOptimal(b *testing.B) {
-	// Optimal case is where the underlying reader implements io.WriterTo
-	srcBuf := bytes.NewBuffer(make([]byte, 8192))
-	src := NewReader(srcBuf)
-	dstBuf := new(bytes.Buffer)
-	dst := onlyWriter{dstBuf}
-	for i := 0; i < b.N; i++ {
-		srcBuf.Reset()
-		src.Reset(srcBuf)
-		dstBuf.Reset()
-		io.Copy(dst, src)
-	}
-}
-
-func BenchmarkReaderCopyUnoptimal(b *testing.B) {
-	// Unoptimal case is where the underlying reader doesn't implement io.WriterTo
-	srcBuf := bytes.NewBuffer(make([]byte, 8192))
-	src := NewReader(onlyReader{srcBuf})
-	dstBuf := new(bytes.Buffer)
-	dst := onlyWriter{dstBuf}
-	for i := 0; i < b.N; i++ {
-		srcBuf.Reset()
-		src.Reset(onlyReader{srcBuf})
-		dstBuf.Reset()
-		io.Copy(dst, src)
-	}
-}
-
-func BenchmarkReaderCopyNoWriteTo(b *testing.B) {
-	srcBuf := bytes.NewBuffer(make([]byte, 8192))
-	srcReader := NewReader(srcBuf)
-	src := onlyReader{srcReader}
-	dstBuf := new(bytes.Buffer)
-	dst := onlyWriter{dstBuf}
-	for i := 0; i < b.N; i++ {
-		srcBuf.Reset()
-		srcReader.Reset(srcBuf)
-		dstBuf.Reset()
-		io.Copy(dst, src)
-	}
-}
-
-func BenchmarkReaderWriteToOptimal(b *testing.B) {
-	const bufSize = 16 << 10
-	buf := make([]byte, bufSize)
-	r := bytes.NewReader(buf)
-	srcReader := NewReaderSize(onlyReader{r}, 1<<10)
-	if _, ok := ioutil.Discard.(io.ReaderFrom); !ok {
-		b.Fatal("ioutil.Discard doesn't support ReaderFrom")
-	}
-	for i := 0; i < b.N; i++ {
-		r.Seek(0, 0)
-		srcReader.Reset(onlyReader{r})
-		n, err := srcReader.WriteTo(ioutil.Discard)
-		if err != nil {
-			b.Fatal(err)
-		}
-		if n != bufSize {
-			b.Fatalf("n = %d; want %d", n, bufSize)
-		}
-	}
-}
-
-func BenchmarkWriterCopyOptimal(b *testing.B) {
-	// Optimal case is where the underlying writer implements io.ReaderFrom
-	srcBuf := bytes.NewBuffer(make([]byte, 8192))
-	src := onlyReader{srcBuf}
-	dstBuf := new(bytes.Buffer)
-	dst := NewWriter(dstBuf)
-	for i := 0; i < b.N; i++ {
-		srcBuf.Reset()
-		dstBuf.Reset()
-		dst.Reset(dstBuf)
-		io.Copy(dst, src)
-	}
-}
-
-func BenchmarkWriterCopyUnoptimal(b *testing.B) {
-	srcBuf := bytes.NewBuffer(make([]byte, 8192))
-	src := onlyReader{srcBuf}
-	dstBuf := new(bytes.Buffer)
-	dst := NewWriter(onlyWriter{dstBuf})
-	for i := 0; i < b.N; i++ {
-		srcBuf.Reset()
-		dstBuf.Reset()
-		dst.Reset(onlyWriter{dstBuf})
-		io.Copy(dst, src)
-	}
-}
-
-func BenchmarkWriterCopyNoReadFrom(b *testing.B) {
-	srcBuf := bytes.NewBuffer(make([]byte, 8192))
-	src := onlyReader{srcBuf}
-	dstBuf := new(bytes.Buffer)
-	dstWriter := NewWriter(dstBuf)
-	dst := onlyWriter{dstWriter}
-	for i := 0; i < b.N; i++ {
-		srcBuf.Reset()
-		dstBuf.Reset()
-		dstWriter.Reset(dstBuf)
-		io.Copy(dst, src)
-	}
-}
-
-func BenchmarkReaderEmpty(b *testing.B) {
-	b.ReportAllocs()
-	str := strings.Repeat("x", 16<<10)
-	for i := 0; i < b.N; i++ {
-		br := NewReader(strings.NewReader(str))
-		n, err := io.Copy(ioutil.Discard, br)
-		if err != nil {
-			b.Fatal(err)
-		}
-		if n != int64(len(str)) {
-			b.Fatal("wrong length")
-		}
-	}
-}
-
-func BenchmarkWriterEmpty(b *testing.B) {
-	b.ReportAllocs()
-	str := strings.Repeat("x", 1<<10)
-	bs := []byte(str)
-	for i := 0; i < b.N; i++ {
-		bw := NewWriter(ioutil.Discard)
-		bw.Flush()
-		bw.WriteByte('a')
-		bw.Flush()
-		bw.WriteRune('B')
-		bw.Flush()
-		bw.Write(bs)
-		bw.Flush()
-		bw.WriteString(str)
-		bw.Flush()
-	}
-}
-
-func BenchmarkWriterFlush(b *testing.B) {
-	b.ReportAllocs()
-	bw := NewWriter(ioutil.Discard)
-	str := strings.Repeat("x", 50)
-	for i := 0; i < b.N; i++ {
-		bw.WriteString(str)
-		bw.Flush()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/bufio/example_test.go b/third_party/gofrontend/libgo/go/bufio/example_test.go
deleted file mode 100644
index 3da9141..0000000
--- a/third_party/gofrontend/libgo/go/bufio/example_test.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bufio_test
-
-import (
-	"bufio"
-	"fmt"
-	"os"
-	"strconv"
-	"strings"
-)
-
-func ExampleWriter() {
-	w := bufio.NewWriter(os.Stdout)
-	fmt.Fprint(w, "Hello, ")
-	fmt.Fprint(w, "world!")
-	w.Flush() // Don't forget to flush!
-	// Output: Hello, world!
-}
-
-// The simplest use of a Scanner, to read standard input as a set of lines.
-func ExampleScanner_lines() {
-	scanner := bufio.NewScanner(os.Stdin)
-	for scanner.Scan() {
-		fmt.Println(scanner.Text()) // Println will add back the final '\n'
-	}
-	if err := scanner.Err(); err != nil {
-		fmt.Fprintln(os.Stderr, "reading standard input:", err)
-	}
-}
-
-// Use a Scanner to implement a simple word-count utility by scanning the
-// input as a sequence of space-delimited tokens.
-func ExampleScanner_words() {
-	// An artificial input source.
-	const input = "Now is the winter of our discontent,\nMade glorious summer by this sun of York.\n"
-	scanner := bufio.NewScanner(strings.NewReader(input))
-	// Set the split function for the scanning operation.
-	scanner.Split(bufio.ScanWords)
-	// Count the words.
-	count := 0
-	for scanner.Scan() {
-		count++
-	}
-	if err := scanner.Err(); err != nil {
-		fmt.Fprintln(os.Stderr, "reading input:", err)
-	}
-	fmt.Printf("%d\n", count)
-	// Output: 15
-}
-
-// Use a Scanner with a custom split function (built by wrapping ScanWords) to validate
-// 32-bit decimal input.
-func ExampleScanner_custom() {
-	// An artificial input source.
-	const input = "1234 5678 1234567901234567890"
-	scanner := bufio.NewScanner(strings.NewReader(input))
-	// Create a custom split function by wrapping the existing ScanWords function.
-	split := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
-		advance, token, err = bufio.ScanWords(data, atEOF)
-		if err == nil && token != nil {
-			_, err = strconv.ParseInt(string(token), 10, 32)
-		}
-		return
-	}
-	// Set the split function for the scanning operation.
-	scanner.Split(split)
-	// Validate the input
-	for scanner.Scan() {
-		fmt.Printf("%s\n", scanner.Text())
-	}
-
-	if err := scanner.Err(); err != nil {
-		fmt.Printf("Invalid input: %s", err)
-	}
-	// Output:
-	// 1234
-	// 5678
-	// Invalid input: strconv.ParseInt: parsing "1234567901234567890": value out of range
-}
diff --git a/third_party/gofrontend/libgo/go/bufio/export_test.go b/third_party/gofrontend/libgo/go/bufio/export_test.go
deleted file mode 100644
index 3d3bb27..0000000
--- a/third_party/gofrontend/libgo/go/bufio/export_test.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bufio
-
-// Exported for testing only.
-import (
-	"unicode/utf8"
-)
-
-var IsSpace = isSpace
-
-func (s *Scanner) MaxTokenSize(n int) {
-	if n < utf8.UTFMax || n > 1e9 {
-		panic("bad max token size")
-	}
-	if n < len(s.buf) {
-		s.buf = make([]byte, n)
-	}
-	s.maxTokenSize = n
-}
-
-// ErrOrEOF is like Err, but returns EOF. Used to test a corner case.
-func (s *Scanner) ErrOrEOF() error {
-	return s.err
-}
diff --git a/third_party/gofrontend/libgo/go/bufio/scan.go b/third_party/gofrontend/libgo/go/bufio/scan.go
deleted file mode 100644
index 7a349fa..0000000
--- a/third_party/gofrontend/libgo/go/bufio/scan.go
+++ /dev/null
@@ -1,359 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bufio
-
-import (
-	"bytes"
-	"errors"
-	"io"
-	"unicode/utf8"
-)
-
-// Scanner provides a convenient interface for reading data such as
-// a file of newline-delimited lines of text. Successive calls to
-// the Scan method will step through the 'tokens' of a file, skipping
-// the bytes between the tokens. The specification of a token is
-// defined by a split function of type SplitFunc; the default split
-// function breaks the input into lines with line termination stripped. Split
-// functions are defined in this package for scanning a file into
-// lines, bytes, UTF-8-encoded runes, and space-delimited words. The
-// client may instead provide a custom split function.
-//
-// Scanning stops unrecoverably at EOF, the first I/O error, or a token too
-// large to fit in the buffer. When a scan stops, the reader may have
-// advanced arbitrarily far past the last token. Programs that need more
-// control over error handling or large tokens, or must run sequential scans
-// on a reader, should use bufio.Reader instead.
-//
-type Scanner struct {
-	r            io.Reader // The reader provided by the client.
-	split        SplitFunc // The function to split the tokens.
-	maxTokenSize int       // Maximum size of a token; modified by tests.
-	token        []byte    // Last token returned by split.
-	buf          []byte    // Buffer used as argument to split.
-	start        int       // First non-processed byte in buf.
-	end          int       // End of data in buf.
-	err          error     // Sticky error.
-	empties      int       // Count of successive empty tokens.
-}
-
-// SplitFunc is the signature of the split function used to tokenize the
-// input. The arguments are an initial substring of the remaining unprocessed
-// data and a flag, atEOF, that reports whether the Reader has no more data
-// to give. The return values are the number of bytes to advance the input
-// and the next token to return to the user, plus an error, if any. If the
-// data does not yet hold a complete token, for instance if it has no newline
-// while scanning lines, SplitFunc can return (0, nil, nil) to signal the
-// Scanner to read more data into the slice and try again with a longer slice
-// starting at the same point in the input.
-//
-// If the returned error is non-nil, scanning stops and the error
-// is returned to the client.
-//
-// The function is never called with an empty data slice unless atEOF
-// is true. If atEOF is true, however, data may be non-empty and,
-// as always, holds unprocessed text.
-type SplitFunc func(data []byte, atEOF bool) (advance int, token []byte, err error)
-
-// Errors returned by Scanner.
-var (
-	ErrTooLong         = errors.New("bufio.Scanner: token too long")
-	ErrNegativeAdvance = errors.New("bufio.Scanner: SplitFunc returns negative advance count")
-	ErrAdvanceTooFar   = errors.New("bufio.Scanner: SplitFunc returns advance count beyond input")
-)
-
-const (
-	// MaxScanTokenSize is the maximum size used to buffer a token.
-	// The actual maximum token size may be smaller as the buffer
-	// may need to include, for instance, a newline.
-	MaxScanTokenSize = 64 * 1024
-)
-
-// NewScanner returns a new Scanner to read from r.
-// The split function defaults to ScanLines.
-func NewScanner(r io.Reader) *Scanner {
-	return &Scanner{
-		r:            r,
-		split:        ScanLines,
-		maxTokenSize: MaxScanTokenSize,
-		buf:          make([]byte, 4096), // Plausible starting size; needn't be large.
-	}
-}
-
-// Err returns the first non-EOF error that was encountered by the Scanner.
-func (s *Scanner) Err() error {
-	if s.err == io.EOF {
-		return nil
-	}
-	return s.err
-}
-
-// Bytes returns the most recent token generated by a call to Scan.
-// The underlying array may point to data that will be overwritten
-// by a subsequent call to Scan. It does no allocation.
-func (s *Scanner) Bytes() []byte {
-	return s.token
-}
-
-// Text returns the most recent token generated by a call to Scan
-// as a newly allocated string holding its bytes.
-func (s *Scanner) Text() string {
-	return string(s.token)
-}
-
-// Scan advances the Scanner to the next token, which will then be
-// available through the Bytes or Text method. It returns false when the
-// scan stops, either by reaching the end of the input or an error.
-// After Scan returns false, the Err method will return any error that
-// occurred during scanning, except that if it was io.EOF, Err
-// will return nil.
-// Scan panics if the split function returns 100 empty tokens without
-// advancing the input. This is a common error mode for scanners.
-func (s *Scanner) Scan() bool {
-	// Loop until we have a token.
-	for {
-		// See if we can get a token with what we already have.
-		// If we've run out of data but have an error, give the split function
-		// a chance to recover any remaining, possibly empty token.
-		if s.end > s.start || s.err != nil {
-			advance, token, err := s.split(s.buf[s.start:s.end], s.err != nil)
-			if err != nil {
-				s.setErr(err)
-				return false
-			}
-			if !s.advance(advance) {
-				return false
-			}
-			s.token = token
-			if token != nil {
-				if s.err == nil || advance > 0 {
-					s.empties = 0
-				} else {
-					// Returning tokens not advancing input at EOF.
-					s.empties++
-					if s.empties > 100 {
-						panic("bufio.Scan: 100 empty tokens without progressing")
-					}
-				}
-				return true
-			}
-		}
-		// We cannot generate a token with what we are holding.
-		// If we've already hit EOF or an I/O error, we are done.
-		if s.err != nil {
-			// Shut it down.
-			s.start = 0
-			s.end = 0
-			return false
-		}
-		// Must read more data.
-		// First, shift data to beginning of buffer if there's lots of empty space
-		// or space is needed.
-		if s.start > 0 && (s.end == len(s.buf) || s.start > len(s.buf)/2) {
-			copy(s.buf, s.buf[s.start:s.end])
-			s.end -= s.start
-			s.start = 0
-		}
-		// Is the buffer full? If so, resize.
-		if s.end == len(s.buf) {
-			if len(s.buf) >= s.maxTokenSize {
-				s.setErr(ErrTooLong)
-				return false
-			}
-			newSize := len(s.buf) * 2
-			if newSize > s.maxTokenSize {
-				newSize = s.maxTokenSize
-			}
-			newBuf := make([]byte, newSize)
-			copy(newBuf, s.buf[s.start:s.end])
-			s.buf = newBuf
-			s.end -= s.start
-			s.start = 0
-			continue
-		}
-		// Finally we can read some input. Make sure we don't get stuck with
-		// a misbehaving Reader. Officially we don't need to do this, but let's
-		// be extra careful: Scanner is for safe, simple jobs.
-		for loop := 0; ; {
-			n, err := s.r.Read(s.buf[s.end:len(s.buf)])
-			s.end += n
-			if err != nil {
-				s.setErr(err)
-				break
-			}
-			if n > 0 {
-				s.empties = 0
-				break
-			}
-			loop++
-			if loop > maxConsecutiveEmptyReads {
-				s.setErr(io.ErrNoProgress)
-				break
-			}
-		}
-	}
-}
-
-// advance consumes n bytes of the buffer. It reports whether the advance was legal.
-func (s *Scanner) advance(n int) bool {
-	if n < 0 {
-		s.setErr(ErrNegativeAdvance)
-		return false
-	}
-	if n > s.end-s.start {
-		s.setErr(ErrAdvanceTooFar)
-		return false
-	}
-	s.start += n
-	return true
-}
-
-// setErr records the first error encountered.
-func (s *Scanner) setErr(err error) {
-	if s.err == nil || s.err == io.EOF {
-		s.err = err
-	}
-}
-
-// Split sets the split function for the Scanner. If called, it must be
-// called before Scan. The default split function is ScanLines.
-func (s *Scanner) Split(split SplitFunc) {
-	s.split = split
-}
-
-// Split functions
-
-// ScanBytes is a split function for a Scanner that returns each byte as a token.
-func ScanBytes(data []byte, atEOF bool) (advance int, token []byte, err error) {
-	if atEOF && len(data) == 0 {
-		return 0, nil, nil
-	}
-	return 1, data[0:1], nil
-}
-
-var errorRune = []byte(string(utf8.RuneError))
-
-// ScanRunes is a split function for a Scanner that returns each
-// UTF-8-encoded rune as a token. The sequence of runes returned is
-// equivalent to that from a range loop over the input as a string, which
-// means that erroneous UTF-8 encodings translate to U+FFFD = "\xef\xbf\xbd".
-// Because of the Scan interface, this makes it impossible for the client to
-// distinguish correctly encoded replacement runes from encoding errors.
-func ScanRunes(data []byte, atEOF bool) (advance int, token []byte, err error) {
-	if atEOF && len(data) == 0 {
-		return 0, nil, nil
-	}
-
-	// Fast path 1: ASCII.
-	if data[0] < utf8.RuneSelf {
-		return 1, data[0:1], nil
-	}
-
-	// Fast path 2: Correct UTF-8 decode without error.
-	_, width := utf8.DecodeRune(data)
-	if width > 1 {
-		// It's a valid encoding. Width cannot be one for a correctly encoded
-		// non-ASCII rune.
-		return width, data[0:width], nil
-	}
-
-	// We know it's an error: we have width==1 and implicitly r==utf8.RuneError.
-	// Is the error because there wasn't a full rune to be decoded?
-	// FullRune distinguishes correctly between erroneous and incomplete encodings.
-	if !atEOF && !utf8.FullRune(data) {
-		// Incomplete; get more bytes.
-		return 0, nil, nil
-	}
-
-	// We have a real UTF-8 encoding error. Return a properly encoded error rune
-	// but advance only one byte. This matches the behavior of a range loop over
-	// an incorrectly encoded string.
-	return 1, errorRune, nil
-}
-
-// dropCR drops a terminal \r from the data.
-func dropCR(data []byte) []byte {
-	if len(data) > 0 && data[len(data)-1] == '\r' {
-		return data[0 : len(data)-1]
-	}
-	return data
-}
-
-// ScanLines is a split function for a Scanner that returns each line of
-// text, stripped of any trailing end-of-line marker. The returned line may
-// be empty. The end-of-line marker is one optional carriage return followed
-// by one mandatory newline. In regular expression notation, it is `\r?\n`.
-// The last non-empty line of input will be returned even if it has no
-// newline.
-func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error) {
-	if atEOF && len(data) == 0 {
-		return 0, nil, nil
-	}
-	if i := bytes.IndexByte(data, '\n'); i >= 0 {
-		// We have a full newline-terminated line.
-		return i + 1, dropCR(data[0:i]), nil
-	}
-	// If we're at EOF, we have a final, non-terminated line. Return it.
-	if atEOF {
-		return len(data), dropCR(data), nil
-	}
-	// Request more data.
-	return 0, nil, nil
-}
-
-// isSpace reports whether the character is a Unicode white space character.
-// We avoid dependency on the unicode package, but check validity of the implementation
-// in the tests.
-func isSpace(r rune) bool {
-	if r <= '\u00FF' {
-		// Obvious ASCII ones: \t through \r plus space. Plus two Latin-1 oddballs.
-		switch r {
-		case ' ', '\t', '\n', '\v', '\f', '\r':
-			return true
-		case '\u0085', '\u00A0':
-			return true
-		}
-		return false
-	}
-	// High-valued ones.
-	if '\u2000' <= r && r <= '\u200a' {
-		return true
-	}
-	switch r {
-	case '\u1680', '\u2028', '\u2029', '\u202f', '\u205f', '\u3000':
-		return true
-	}
-	return false
-}
-
-// ScanWords is a split function for a Scanner that returns each
-// space-separated word of text, with surrounding spaces deleted. It will
-// never return an empty string. The definition of space is set by
-// unicode.IsSpace.
-func ScanWords(data []byte, atEOF bool) (advance int, token []byte, err error) {
-	// Skip leading spaces.
-	start := 0
-	for width := 0; start < len(data); start += width {
-		var r rune
-		r, width = utf8.DecodeRune(data[start:])
-		if !isSpace(r) {
-			break
-		}
-	}
-	// Scan until space, marking end of word.
-	for width, i := 0, start; i < len(data); i += width {
-		var r rune
-		r, width = utf8.DecodeRune(data[i:])
-		if isSpace(r) {
-			return i + width, data[start:i], nil
-		}
-	}
-	// If we're at EOF, we have a final, non-empty, non-terminated word. Return it.
-	if atEOF && len(data) > start {
-		return len(data), data[start:], nil
-	}
-	// Request more data.
-	return start, nil, nil
-}
diff --git a/third_party/gofrontend/libgo/go/bufio/scan_test.go b/third_party/gofrontend/libgo/go/bufio/scan_test.go
deleted file mode 100644
index eea87cb..0000000
--- a/third_party/gofrontend/libgo/go/bufio/scan_test.go
+++ /dev/null
@@ -1,524 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bufio_test
-
-import (
-	. "bufio"
-	"bytes"
-	"errors"
-	"io"
-	"strings"
-	"testing"
-	"unicode"
-	"unicode/utf8"
-)
-
-const smallMaxTokenSize = 256 // Much smaller for more efficient testing.
-
-// Test white space table matches the Unicode definition.
-func TestSpace(t *testing.T) {
-	for r := rune(0); r <= utf8.MaxRune; r++ {
-		if IsSpace(r) != unicode.IsSpace(r) {
-			t.Fatalf("white space property disagrees: %#U should be %t", r, unicode.IsSpace(r))
-		}
-	}
-}
-
-var scanTests = []string{
-	"",
-	"a",
-	"¼",
-	"☹",
-	"\x81",   // UTF-8 error
-	"\uFFFD", // correctly encoded RuneError
-	"abcdefgh",
-	"abc def\n\t\tgh    ",
-	"abc¼☹\x81\uFFFD日本語\x82abc",
-}
-
-func TestScanByte(t *testing.T) {
-	for n, test := range scanTests {
-		buf := strings.NewReader(test)
-		s := NewScanner(buf)
-		s.Split(ScanBytes)
-		var i int
-		for i = 0; s.Scan(); i++ {
-			if b := s.Bytes(); len(b) != 1 || b[0] != test[i] {
-				t.Errorf("#%d: %d: expected %q got %q", n, i, test, b)
-			}
-		}
-		if i != len(test) {
-			t.Errorf("#%d: termination expected at %d; got %d", n, len(test), i)
-		}
-		err := s.Err()
-		if err != nil {
-			t.Errorf("#%d: %v", n, err)
-		}
-	}
-}
-
-// Test that the rune splitter returns same sequence of runes (not bytes) as for range string.
-func TestScanRune(t *testing.T) {
-	for n, test := range scanTests {
-		buf := strings.NewReader(test)
-		s := NewScanner(buf)
-		s.Split(ScanRunes)
-		var i, runeCount int
-		var expect rune
-		// Use a string range loop to validate the sequence of runes.
-		for i, expect = range string(test) {
-			if !s.Scan() {
-				break
-			}
-			runeCount++
-			got, _ := utf8.DecodeRune(s.Bytes())
-			if got != expect {
-				t.Errorf("#%d: %d: expected %q got %q", n, i, expect, got)
-			}
-		}
-		if s.Scan() {
-			t.Errorf("#%d: scan ran too long, got %q", n, s.Text())
-		}
-		testRuneCount := utf8.RuneCountInString(test)
-		if runeCount != testRuneCount {
-			t.Errorf("#%d: termination expected at %d; got %d", n, testRuneCount, runeCount)
-		}
-		err := s.Err()
-		if err != nil {
-			t.Errorf("#%d: %v", n, err)
-		}
-	}
-}
-
-var wordScanTests = []string{
-	"",
-	" ",
-	"\n",
-	"a",
-	" a ",
-	"abc def",
-	" abc def ",
-	" abc\tdef\nghi\rjkl\fmno\vpqr\u0085stu\u00a0\n",
-}
-
-// Test that the word splitter returns the same data as strings.Fields.
-func TestScanWords(t *testing.T) {
-	for n, test := range wordScanTests {
-		buf := strings.NewReader(test)
-		s := NewScanner(buf)
-		s.Split(ScanWords)
-		words := strings.Fields(test)
-		var wordCount int
-		for wordCount = 0; wordCount < len(words); wordCount++ {
-			if !s.Scan() {
-				break
-			}
-			got := s.Text()
-			if got != words[wordCount] {
-				t.Errorf("#%d: %d: expected %q got %q", n, wordCount, words[wordCount], got)
-			}
-		}
-		if s.Scan() {
-			t.Errorf("#%d: scan ran too long, got %q", n, s.Text())
-		}
-		if wordCount != len(words) {
-			t.Errorf("#%d: termination expected at %d; got %d", n, len(words), wordCount)
-		}
-		err := s.Err()
-		if err != nil {
-			t.Errorf("#%d: %v", n, err)
-		}
-	}
-}
-
-// slowReader is a reader that returns only a few bytes at a time, to test the incremental
-// reads in Scanner.Scan.
-type slowReader struct {
-	max int
-	buf io.Reader
-}
-
-func (sr *slowReader) Read(p []byte) (n int, err error) {
-	if len(p) > sr.max {
-		p = p[0:sr.max]
-	}
-	return sr.buf.Read(p)
-}
-
-// genLine writes to buf a predictable but non-trivial line of text of length
-// n, including the terminal newline and an occasional carriage return.
-// If addNewline is false, the \r and \n are not emitted.
-func genLine(buf *bytes.Buffer, lineNum, n int, addNewline bool) {
-	buf.Reset()
-	doCR := lineNum%5 == 0
-	if doCR {
-		n--
-	}
-	for i := 0; i < n-1; i++ { // Stop early for \n.
-		c := 'a' + byte(lineNum+i)
-		if c == '\n' || c == '\r' { // Don't confuse us.
-			c = 'N'
-		}
-		buf.WriteByte(c)
-	}
-	if addNewline {
-		if doCR {
-			buf.WriteByte('\r')
-		}
-		buf.WriteByte('\n')
-	}
-	return
-}
-
-// Test the line splitter, including some carriage returns but no long lines.
-func TestScanLongLines(t *testing.T) {
-	// Build a buffer of lots of line lengths up to but not exceeding smallMaxTokenSize.
-	tmp := new(bytes.Buffer)
-	buf := new(bytes.Buffer)
-	lineNum := 0
-	j := 0
-	for i := 0; i < 2*smallMaxTokenSize; i++ {
-		genLine(tmp, lineNum, j, true)
-		if j < smallMaxTokenSize {
-			j++
-		} else {
-			j--
-		}
-		buf.Write(tmp.Bytes())
-		lineNum++
-	}
-	s := NewScanner(&slowReader{1, buf})
-	s.Split(ScanLines)
-	s.MaxTokenSize(smallMaxTokenSize)
-	j = 0
-	for lineNum := 0; s.Scan(); lineNum++ {
-		genLine(tmp, lineNum, j, false)
-		if j < smallMaxTokenSize {
-			j++
-		} else {
-			j--
-		}
-		line := tmp.String() // We use the string-valued token here, for variety.
-		if s.Text() != line {
-			t.Errorf("%d: bad line: %d %d\n%.100q\n%.100q\n", lineNum, len(s.Bytes()), len(line), s.Text(), line)
-		}
-	}
-	err := s.Err()
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-// Test that the line splitter errors out on a long line.
-func TestScanLineTooLong(t *testing.T) {
-	const smallMaxTokenSize = 256 // Much smaller for more efficient testing.
-	// Build a buffer of lots of line lengths up to but not exceeding smallMaxTokenSize.
-	tmp := new(bytes.Buffer)
-	buf := new(bytes.Buffer)
-	lineNum := 0
-	j := 0
-	for i := 0; i < 2*smallMaxTokenSize; i++ {
-		genLine(tmp, lineNum, j, true)
-		j++
-		buf.Write(tmp.Bytes())
-		lineNum++
-	}
-	s := NewScanner(&slowReader{3, buf})
-	s.Split(ScanLines)
-	s.MaxTokenSize(smallMaxTokenSize)
-	j = 0
-	for lineNum := 0; s.Scan(); lineNum++ {
-		genLine(tmp, lineNum, j, false)
-		if j < smallMaxTokenSize {
-			j++
-		} else {
-			j--
-		}
-		line := tmp.Bytes()
-		if !bytes.Equal(s.Bytes(), line) {
-			t.Errorf("%d: bad line: %d %d\n%.100q\n%.100q\n", lineNum, len(s.Bytes()), len(line), s.Bytes(), line)
-		}
-	}
-	err := s.Err()
-	if err != ErrTooLong {
-		t.Fatalf("expected ErrTooLong; got %s", err)
-	}
-}
-
-// Test that the line splitter handles a final line without a newline.
-func testNoNewline(text string, lines []string, t *testing.T) {
-	buf := strings.NewReader(text)
-	s := NewScanner(&slowReader{7, buf})
-	s.Split(ScanLines)
-	for lineNum := 0; s.Scan(); lineNum++ {
-		line := lines[lineNum]
-		if s.Text() != line {
-			t.Errorf("%d: bad line: %d %d\n%.100q\n%.100q\n", lineNum, len(s.Bytes()), len(line), s.Bytes(), line)
-		}
-	}
-	err := s.Err()
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-var noNewlineLines = []string{
-	"abcdefghijklmn\nopqrstuvwxyz",
-}
-
-// Test that the line splitter handles a final line without a newline.
-func TestScanLineNoNewline(t *testing.T) {
-	const text = "abcdefghijklmn\nopqrstuvwxyz"
-	lines := []string{
-		"abcdefghijklmn",
-		"opqrstuvwxyz",
-	}
-	testNoNewline(text, lines, t)
-}
-
-// Test that the line splitter handles a final line with a carriage return but no newline.
-func TestScanLineReturnButNoNewline(t *testing.T) {
-	const text = "abcdefghijklmn\nopqrstuvwxyz\r"
-	lines := []string{
-		"abcdefghijklmn",
-		"opqrstuvwxyz",
-	}
-	testNoNewline(text, lines, t)
-}
-
-// Test that the line splitter handles a final empty line.
-func TestScanLineEmptyFinalLine(t *testing.T) {
-	const text = "abcdefghijklmn\nopqrstuvwxyz\n\n"
-	lines := []string{
-		"abcdefghijklmn",
-		"opqrstuvwxyz",
-		"",
-	}
-	testNoNewline(text, lines, t)
-}
-
-// Test that the line splitter handles a final empty line with a carriage return but no newline.
-func TestScanLineEmptyFinalLineWithCR(t *testing.T) {
-	const text = "abcdefghijklmn\nopqrstuvwxyz\n\r"
-	lines := []string{
-		"abcdefghijklmn",
-		"opqrstuvwxyz",
-		"",
-	}
-	testNoNewline(text, lines, t)
-}
-
-var testError = errors.New("testError")
-
-// Test the correct error is returned when the split function errors out.
-func TestSplitError(t *testing.T) {
-	// Create a split function that delivers a little data, then a predictable error.
-	numSplits := 0
-	const okCount = 7
-	errorSplit := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
-		if atEOF {
-			panic("didn't get enough data")
-		}
-		if numSplits >= okCount {
-			return 0, nil, testError
-		}
-		numSplits++
-		return 1, data[0:1], nil
-	}
-	// Read the data.
-	const text = "abcdefghijklmnopqrstuvwxyz"
-	buf := strings.NewReader(text)
-	s := NewScanner(&slowReader{1, buf})
-	s.Split(errorSplit)
-	var i int
-	for i = 0; s.Scan(); i++ {
-		if len(s.Bytes()) != 1 || text[i] != s.Bytes()[0] {
-			t.Errorf("#%d: expected %q got %q", i, text[i], s.Bytes()[0])
-		}
-	}
-	// Check correct termination location and error.
-	if i != okCount {
-		t.Errorf("unexpected termination; expected %d tokens got %d", okCount, i)
-	}
-	err := s.Err()
-	if err != testError {
-		t.Fatalf("expected %q got %v", testError, err)
-	}
-}
-
-// Test that an EOF is overridden by a user-generated scan error.
-func TestErrAtEOF(t *testing.T) {
-	s := NewScanner(strings.NewReader("1 2 33"))
-	// This spitter will fail on last entry, after s.err==EOF.
-	split := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
-		advance, token, err = ScanWords(data, atEOF)
-		if len(token) > 1 {
-			if s.ErrOrEOF() != io.EOF {
-				t.Fatal("not testing EOF")
-			}
-			err = testError
-		}
-		return
-	}
-	s.Split(split)
-	for s.Scan() {
-	}
-	if s.Err() != testError {
-		t.Fatal("wrong error:", s.Err())
-	}
-}
-
-// Test for issue 5268.
-type alwaysError struct{}
-
-func (alwaysError) Read(p []byte) (int, error) {
-	return 0, io.ErrUnexpectedEOF
-}
-
-func TestNonEOFWithEmptyRead(t *testing.T) {
-	scanner := NewScanner(alwaysError{})
-	for scanner.Scan() {
-		t.Fatal("read should fail")
-	}
-	err := scanner.Err()
-	if err != io.ErrUnexpectedEOF {
-		t.Errorf("unexpected error: %v", err)
-	}
-}
-
-// Test that Scan finishes if we have endless empty reads.
-type endlessZeros struct{}
-
-func (endlessZeros) Read(p []byte) (int, error) {
-	return 0, nil
-}
-
-func TestBadReader(t *testing.T) {
-	scanner := NewScanner(endlessZeros{})
-	for scanner.Scan() {
-		t.Fatal("read should fail")
-	}
-	err := scanner.Err()
-	if err != io.ErrNoProgress {
-		t.Errorf("unexpected error: %v", err)
-	}
-}
-
-func TestScanWordsExcessiveWhiteSpace(t *testing.T) {
-	const word = "ipsum"
-	s := strings.Repeat(" ", 4*smallMaxTokenSize) + word
-	scanner := NewScanner(strings.NewReader(s))
-	scanner.MaxTokenSize(smallMaxTokenSize)
-	scanner.Split(ScanWords)
-	if !scanner.Scan() {
-		t.Fatalf("scan failed: %v", scanner.Err())
-	}
-	if token := scanner.Text(); token != word {
-		t.Fatalf("unexpected token: %v", token)
-	}
-}
-
-// Test that empty tokens, including at end of line or end of file, are found by the scanner.
-// Issue 8672: Could miss final empty token.
-
-func commaSplit(data []byte, atEOF bool) (advance int, token []byte, err error) {
-	for i := 0; i < len(data); i++ {
-		if data[i] == ',' {
-			return i + 1, data[:i], nil
-		}
-	}
-	if !atEOF {
-		return 0, nil, nil
-	}
-	return 0, data, nil
-}
-
-func TestEmptyTokens(t *testing.T) {
-	s := NewScanner(strings.NewReader("1,2,3,"))
-	values := []string{"1", "2", "3", ""}
-	s.Split(commaSplit)
-	var i int
-	for i = 0; i < len(values); i++ {
-		if !s.Scan() {
-			break
-		}
-		if s.Text() != values[i] {
-			t.Errorf("%d: expected %q got %q", i, values[i], s.Text())
-		}
-	}
-	if i != len(values) {
-		t.Errorf("got %d fields, expected %d", i, len(values))
-	}
-	if err := s.Err(); err != nil {
-		t.Fatal(err)
-	}
-}
-
-func loopAtEOFSplit(data []byte, atEOF bool) (advance int, token []byte, err error) {
-	if len(data) > 0 {
-		return 1, data[:1], nil
-	}
-	return 0, data, nil
-}
-
-func TestDontLoopForever(t *testing.T) {
-	s := NewScanner(strings.NewReader("abc"))
-	s.Split(loopAtEOFSplit)
-	// Expect a panic
-	defer func() {
-		err := recover()
-		if err == nil {
-			t.Fatal("should have panicked")
-		}
-		if msg, ok := err.(string); !ok || !strings.Contains(msg, "empty tokens") {
-			panic(err)
-		}
-	}()
-	for count := 0; s.Scan(); count++ {
-		if count > 1000 {
-			t.Fatal("looping")
-		}
-	}
-	if s.Err() != nil {
-		t.Fatal("after scan:", s.Err())
-	}
-}
-
-func TestBlankLines(t *testing.T) {
-	s := NewScanner(strings.NewReader(strings.Repeat("\n", 1000)))
-	for count := 0; s.Scan(); count++ {
-		if count > 2000 {
-			t.Fatal("looping")
-		}
-	}
-	if s.Err() != nil {
-		t.Fatal("after scan:", s.Err())
-	}
-}
-
-type countdown int
-
-func (c *countdown) split(data []byte, atEOF bool) (advance int, token []byte, err error) {
-	if *c > 0 {
-		*c--
-		return 1, data[:1], nil
-	}
-	return 0, nil, nil
-}
-
-// Check that the looping-at-EOF check doesn't trigger for merely empty tokens.
-func TestEmptyLinesOK(t *testing.T) {
-	c := countdown(10000)
-	s := NewScanner(strings.NewReader(strings.Repeat("\n", 10000)))
-	s.Split(c.split)
-	for s.Scan() {
-	}
-	if s.Err() != nil {
-		t.Fatal("after scan:", s.Err())
-	}
-	if c != 0 {
-		t.Fatalf("stopped with %d left to process", c)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/builtin/builtin.go b/third_party/gofrontend/libgo/go/builtin/builtin.go
deleted file mode 100644
index d63ad22..0000000
--- a/third_party/gofrontend/libgo/go/builtin/builtin.go
+++ /dev/null
@@ -1,256 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-	Package builtin provides documentation for Go's predeclared identifiers.
-	The items documented here are not actually in package builtin
-	but their descriptions here allow godoc to present documentation
-	for the language's special identifiers.
-*/
-package builtin
-
-// bool is the set of boolean values, true and false.
-type bool bool
-
-// true and false are the two untyped boolean values.
-const (
-	true  = 0 == 0 // Untyped bool.
-	false = 0 != 0 // Untyped bool.
-)
-
-// uint8 is the set of all unsigned 8-bit integers.
-// Range: 0 through 255.
-type uint8 uint8
-
-// uint16 is the set of all unsigned 16-bit integers.
-// Range: 0 through 65535.
-type uint16 uint16
-
-// uint32 is the set of all unsigned 32-bit integers.
-// Range: 0 through 4294967295.
-type uint32 uint32
-
-// uint64 is the set of all unsigned 64-bit integers.
-// Range: 0 through 18446744073709551615.
-type uint64 uint64
-
-// int8 is the set of all signed 8-bit integers.
-// Range: -128 through 127.
-type int8 int8
-
-// int16 is the set of all signed 16-bit integers.
-// Range: -32768 through 32767.
-type int16 int16
-
-// int32 is the set of all signed 32-bit integers.
-// Range: -2147483648 through 2147483647.
-type int32 int32
-
-// int64 is the set of all signed 64-bit integers.
-// Range: -9223372036854775808 through 9223372036854775807.
-type int64 int64
-
-// float32 is the set of all IEEE-754 32-bit floating-point numbers.
-type float32 float32
-
-// float64 is the set of all IEEE-754 64-bit floating-point numbers.
-type float64 float64
-
-// complex64 is the set of all complex numbers with float32 real and
-// imaginary parts.
-type complex64 complex64
-
-// complex128 is the set of all complex numbers with float64 real and
-// imaginary parts.
-type complex128 complex128
-
-// string is the set of all strings of 8-bit bytes, conventionally but not
-// necessarily representing UTF-8-encoded text. A string may be empty, but
-// not nil. Values of string type are immutable.
-type string string
-
-// int is a signed integer type that is at least 32 bits in size. It is a
-// distinct type, however, and not an alias for, say, int32.
-type int int
-
-// uint is an unsigned integer type that is at least 32 bits in size. It is a
-// distinct type, however, and not an alias for, say, uint32.
-type uint uint
-
-// uintptr is an integer type that is large enough to hold the bit pattern of
-// any pointer.
-type uintptr uintptr
-
-// byte is an alias for uint8 and is equivalent to uint8 in all ways. It is
-// used, by convention, to distinguish byte values from 8-bit unsigned
-// integer values.
-type byte byte
-
-// rune is an alias for int32 and is equivalent to int32 in all ways. It is
-// used, by convention, to distinguish character values from integer values.
-type rune rune
-
-// iota is a predeclared identifier representing the untyped integer ordinal
-// number of the current const specification in a (usually parenthesized)
-// const declaration. It is zero-indexed.
-const iota = 0 // Untyped int.
-
-// nil is a predeclared identifier representing the zero value for a
-// pointer, channel, func, interface, map, or slice type.
-var nil Type // Type must be a pointer, channel, func, interface, map, or slice type
-
-// Type is here for the purposes of documentation only. It is a stand-in
-// for any Go type, but represents the same type for any given function
-// invocation.
-type Type int
-
-// Type1 is here for the purposes of documentation only. It is a stand-in
-// for any Go type, but represents the same type for any given function
-// invocation.
-type Type1 int
-
-// IntegerType is here for the purposes of documentation only. It is a stand-in
-// for any integer type: int, uint, int8 etc.
-type IntegerType int
-
-// FloatType is here for the purposes of documentation only. It is a stand-in
-// for either float type: float32 or float64.
-type FloatType float32
-
-// ComplexType is here for the purposes of documentation only. It is a
-// stand-in for either complex type: complex64 or complex128.
-type ComplexType complex64
-
-// The append built-in function appends elements to the end of a slice. If
-// it has sufficient capacity, the destination is resliced to accommodate the
-// new elements. If it does not, a new underlying array will be allocated.
-// Append returns the updated slice. It is therefore necessary to store the
-// result of append, often in the variable holding the slice itself:
-//	slice = append(slice, elem1, elem2)
-//	slice = append(slice, anotherSlice...)
-// As a special case, it is legal to append a string to a byte slice, like this:
-//	slice = append([]byte("hello "), "world"...)
-func append(slice []Type, elems ...Type) []Type
-
-// The copy built-in function copies elements from a source slice into a
-// destination slice. (As a special case, it also will copy bytes from a
-// string to a slice of bytes.) The source and destination may overlap. Copy
-// returns the number of elements copied, which will be the minimum of
-// len(src) and len(dst).
-func copy(dst, src []Type) int
-
-// The delete built-in function deletes the element with the specified key
-// (m[key]) from the map. If m is nil or there is no such element, delete
-// is a no-op.
-func delete(m map[Type]Type1, key Type)
-
-// The len built-in function returns the length of v, according to its type:
-//	Array: the number of elements in v.
-//	Pointer to array: the number of elements in *v (even if v is nil).
-//	Slice, or map: the number of elements in v; if v is nil, len(v) is zero.
-//	String: the number of bytes in v.
-//	Channel: the number of elements queued (unread) in the channel buffer;
-//	if v is nil, len(v) is zero.
-func len(v Type) int
-
-// The cap built-in function returns the capacity of v, according to its type:
-//	Array: the number of elements in v (same as len(v)).
-//	Pointer to array: the number of elements in *v (same as len(v)).
-//	Slice: the maximum length the slice can reach when resliced;
-//	if v is nil, cap(v) is zero.
-//	Channel: the channel buffer capacity, in units of elements;
-//	if v is nil, cap(v) is zero.
-func cap(v Type) int
-
-// The make built-in function allocates and initializes an object of type
-// slice, map, or chan (only). Like new, the first argument is a type, not a
-// value. Unlike new, make's return type is the same as the type of its
-// argument, not a pointer to it. The specification of the result depends on
-// the type:
-//	Slice: The size specifies the length. The capacity of the slice is
-//	equal to its length. A second integer argument may be provided to
-//	specify a different capacity; it must be no smaller than the
-//	length, so make([]int, 0, 10) allocates a slice of length 0 and
-//	capacity 10.
-//	Map: An initial allocation is made according to the size but the
-//	resulting map has length 0. The size may be omitted, in which case
-//	a small starting size is allocated.
-//	Channel: The channel's buffer is initialized with the specified
-//	buffer capacity. If zero, or the size is omitted, the channel is
-//	unbuffered.
-func make(Type, size IntegerType) Type
-
-// The new built-in function allocates memory. The first argument is a type,
-// not a value, and the value returned is a pointer to a newly
-// allocated zero value of that type.
-func new(Type) *Type
-
-// The complex built-in function constructs a complex value from two
-// floating-point values. The real and imaginary parts must be of the same
-// size, either float32 or float64 (or assignable to them), and the return
-// value will be the corresponding complex type (complex64 for float32,
-// complex128 for float64).
-func complex(r, i FloatType) ComplexType
-
-// The real built-in function returns the real part of the complex number c.
-// The return value will be floating point type corresponding to the type of c.
-func real(c ComplexType) FloatType
-
-// The imag built-in function returns the imaginary part of the complex
-// number c. The return value will be floating point type corresponding to
-// the type of c.
-func imag(c ComplexType) FloatType
-
-// The close built-in function closes a channel, which must be either
-// bidirectional or send-only. It should be executed only by the sender,
-// never the receiver, and has the effect of shutting down the channel after
-// the last sent value is received. After the last value has been received
-// from a closed channel c, any receive from c will succeed without
-// blocking, returning the zero value for the channel element. The form
-//	x, ok := <-c
-// will also set ok to false for a closed channel.
-func close(c chan<- Type)
-
-// The panic built-in function stops normal execution of the current
-// goroutine. When a function F calls panic, normal execution of F stops
-// immediately. Any functions whose execution was deferred by F are run in
-// the usual way, and then F returns to its caller. To the caller G, the
-// invocation of F then behaves like a call to panic, terminating G's
-// execution and running any deferred functions. This continues until all
-// functions in the executing goroutine have stopped, in reverse order. At
-// that point, the program is terminated and the error condition is reported,
-// including the value of the argument to panic. This termination sequence
-// is called panicking and can be controlled by the built-in function
-// recover.
-func panic(v interface{})
-
-// The recover built-in function allows a program to manage behavior of a
-// panicking goroutine. Executing a call to recover inside a deferred
-// function (but not any function called by it) stops the panicking sequence
-// by restoring normal execution and retrieves the error value passed to the
-// call of panic. If recover is called outside the deferred function it will
-// not stop a panicking sequence. In this case, or when the goroutine is not
-// panicking, or if the argument supplied to panic was nil, recover returns
-// nil. Thus the return value from recover reports whether the goroutine is
-// panicking.
-func recover() interface{}
-
-// The print built-in function formats its arguments in an
-// implementation-specific way and writes the result to standard error.
-// Print is useful for bootstrapping and debugging; it is not guaranteed
-// to stay in the language.
-func print(args ...Type)
-
-// The println built-in function formats its arguments in an
-// implementation-specific way and writes the result to standard error.
-// Spaces are always added between arguments and a newline is appended.
-// Println is useful for bootstrapping and debugging; it is not guaranteed
-// to stay in the language.
-func println(args ...Type)
-
-// The error built-in interface type is the conventional interface for
-// representing an error condition, with the nil value representing no error.
-type error interface {
-	Error() string
-}
diff --git a/third_party/gofrontend/libgo/go/bytes/buffer.go b/third_party/gofrontend/libgo/go/bytes/buffer.go
deleted file mode 100644
index 4db9386..0000000
--- a/third_party/gofrontend/libgo/go/bytes/buffer.go
+++ /dev/null
@@ -1,416 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bytes
-
-// Simple byte buffer for marshaling data.
-
-import (
-	"errors"
-	"io"
-	"unicode/utf8"
-)
-
-// A Buffer is a variable-sized buffer of bytes with Read and Write methods.
-// The zero value for Buffer is an empty buffer ready to use.
-type Buffer struct {
-	buf       []byte            // contents are the bytes buf[off : len(buf)]
-	off       int               // read at &buf[off], write at &buf[len(buf)]
-	runeBytes [utf8.UTFMax]byte // avoid allocation of slice on each WriteByte or Rune
-	bootstrap [64]byte          // memory to hold first slice; helps small buffers (Printf) avoid allocation.
-	lastRead  readOp            // last read operation, so that Unread* can work correctly.
-}
-
-// The readOp constants describe the last action performed on
-// the buffer, so that UnreadRune and UnreadByte can
-// check for invalid usage.
-type readOp int
-
-const (
-	opInvalid  readOp = iota // Non-read operation.
-	opReadRune               // Read rune.
-	opRead                   // Any other read operation.
-)
-
-// ErrTooLarge is passed to panic if memory cannot be allocated to store data in a buffer.
-var ErrTooLarge = errors.New("bytes.Buffer: too large")
-
-// Bytes returns a slice of the contents of the unread portion of the buffer;
-// len(b.Bytes()) == b.Len().  If the caller changes the contents of the
-// returned slice, the contents of the buffer will change provided there
-// are no intervening method calls on the Buffer.
-func (b *Buffer) Bytes() []byte { return b.buf[b.off:] }
-
-// String returns the contents of the unread portion of the buffer
-// as a string.  If the Buffer is a nil pointer, it returns "<nil>".
-func (b *Buffer) String() string {
-	if b == nil {
-		// Special case, useful in debugging.
-		return "<nil>"
-	}
-	return string(b.buf[b.off:])
-}
-
-// Len returns the number of bytes of the unread portion of the buffer;
-// b.Len() == len(b.Bytes()).
-func (b *Buffer) Len() int { return len(b.buf) - b.off }
-
-// Cap returns the capacity of the buffer's underlying byte slice, that is, the
-// total space allocated for the buffer's data.
-func (b *Buffer) Cap() int { return cap(b.buf) }
-
-// Truncate discards all but the first n unread bytes from the buffer.
-// It panics if n is negative or greater than the length of the buffer.
-func (b *Buffer) Truncate(n int) {
-	b.lastRead = opInvalid
-	switch {
-	case n < 0 || n > b.Len():
-		panic("bytes.Buffer: truncation out of range")
-	case n == 0:
-		// Reuse buffer space.
-		b.off = 0
-	}
-	b.buf = b.buf[0 : b.off+n]
-}
-
-// Reset resets the buffer so it has no content.
-// b.Reset() is the same as b.Truncate(0).
-func (b *Buffer) Reset() { b.Truncate(0) }
-
-// grow grows the buffer to guarantee space for n more bytes.
-// It returns the index where bytes should be written.
-// If the buffer can't grow it will panic with ErrTooLarge.
-func (b *Buffer) grow(n int) int {
-	m := b.Len()
-	// If buffer is empty, reset to recover space.
-	if m == 0 && b.off != 0 {
-		b.Truncate(0)
-	}
-	if len(b.buf)+n > cap(b.buf) {
-		var buf []byte
-		if b.buf == nil && n <= len(b.bootstrap) {
-			buf = b.bootstrap[0:]
-		} else if m+n <= cap(b.buf)/2 {
-			// We can slide things down instead of allocating a new
-			// slice. We only need m+n <= cap(b.buf) to slide, but
-			// we instead let capacity get twice as large so we
-			// don't spend all our time copying.
-			copy(b.buf[:], b.buf[b.off:])
-			buf = b.buf[:m]
-		} else {
-			// not enough space anywhere
-			buf = makeSlice(2*cap(b.buf) + n)
-			copy(buf, b.buf[b.off:])
-		}
-		b.buf = buf
-		b.off = 0
-	}
-	b.buf = b.buf[0 : b.off+m+n]
-	return b.off + m
-}
-
-// Grow grows the buffer's capacity, if necessary, to guarantee space for
-// another n bytes. After Grow(n), at least n bytes can be written to the
-// buffer without another allocation.
-// If n is negative, Grow will panic.
-// If the buffer can't grow it will panic with ErrTooLarge.
-func (b *Buffer) Grow(n int) {
-	if n < 0 {
-		panic("bytes.Buffer.Grow: negative count")
-	}
-	m := b.grow(n)
-	b.buf = b.buf[0:m]
-}
-
-// Write appends the contents of p to the buffer, growing the buffer as
-// needed. The return value n is the length of p; err is always nil. If the
-// buffer becomes too large, Write will panic with ErrTooLarge.
-func (b *Buffer) Write(p []byte) (n int, err error) {
-	b.lastRead = opInvalid
-	m := b.grow(len(p))
-	return copy(b.buf[m:], p), nil
-}
-
-// WriteString appends the contents of s to the buffer, growing the buffer as
-// needed. The return value n is the length of s; err is always nil. If the
-// buffer becomes too large, WriteString will panic with ErrTooLarge.
-func (b *Buffer) WriteString(s string) (n int, err error) {
-	b.lastRead = opInvalid
-	m := b.grow(len(s))
-	return copy(b.buf[m:], s), nil
-}
-
-// MinRead is the minimum slice size passed to a Read call by
-// Buffer.ReadFrom.  As long as the Buffer has at least MinRead bytes beyond
-// what is required to hold the contents of r, ReadFrom will not grow the
-// underlying buffer.
-const MinRead = 512
-
-// ReadFrom reads data from r until EOF and appends it to the buffer, growing
-// the buffer as needed. The return value n is the number of bytes read. Any
-// error except io.EOF encountered during the read is also returned. If the
-// buffer becomes too large, ReadFrom will panic with ErrTooLarge.
-func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) {
-	b.lastRead = opInvalid
-	// If buffer is empty, reset to recover space.
-	if b.off >= len(b.buf) {
-		b.Truncate(0)
-	}
-	for {
-		if free := cap(b.buf) - len(b.buf); free < MinRead {
-			// not enough space at end
-			newBuf := b.buf
-			if b.off+free < MinRead {
-				// not enough space using beginning of buffer;
-				// double buffer capacity
-				newBuf = makeSlice(2*cap(b.buf) + MinRead)
-			}
-			copy(newBuf, b.buf[b.off:])
-			b.buf = newBuf[:len(b.buf)-b.off]
-			b.off = 0
-		}
-		m, e := r.Read(b.buf[len(b.buf):cap(b.buf)])
-		b.buf = b.buf[0 : len(b.buf)+m]
-		n += int64(m)
-		if e == io.EOF {
-			break
-		}
-		if e != nil {
-			return n, e
-		}
-	}
-	return n, nil // err is EOF, so return nil explicitly
-}
-
-// makeSlice allocates a slice of size n. If the allocation fails, it panics
-// with ErrTooLarge.
-func makeSlice(n int) []byte {
-	// If the make fails, give a known error.
-	defer func() {
-		if recover() != nil {
-			panic(ErrTooLarge)
-		}
-	}()
-	return make([]byte, n)
-}
-
-// WriteTo writes data to w until the buffer is drained or an error occurs.
-// The return value n is the number of bytes written; it always fits into an
-// int, but it is int64 to match the io.WriterTo interface. Any error
-// encountered during the write is also returned.
-func (b *Buffer) WriteTo(w io.Writer) (n int64, err error) {
-	b.lastRead = opInvalid
-	if b.off < len(b.buf) {
-		nBytes := b.Len()
-		m, e := w.Write(b.buf[b.off:])
-		if m > nBytes {
-			panic("bytes.Buffer.WriteTo: invalid Write count")
-		}
-		b.off += m
-		n = int64(m)
-		if e != nil {
-			return n, e
-		}
-		// all bytes should have been written, by definition of
-		// Write method in io.Writer
-		if m != nBytes {
-			return n, io.ErrShortWrite
-		}
-	}
-	// Buffer is now empty; reset.
-	b.Truncate(0)
-	return
-}
-
-// WriteByte appends the byte c to the buffer, growing the buffer as needed.
-// The returned error is always nil, but is included to match bufio.Writer's
-// WriteByte. If the buffer becomes too large, WriteByte will panic with
-// ErrTooLarge.
-func (b *Buffer) WriteByte(c byte) error {
-	b.lastRead = opInvalid
-	m := b.grow(1)
-	b.buf[m] = c
-	return nil
-}
-
-// WriteRune appends the UTF-8 encoding of Unicode code point r to the
-// buffer, returning its length and an error, which is always nil but is
-// included to match bufio.Writer's WriteRune. The buffer is grown as needed;
-// if it becomes too large, WriteRune will panic with ErrTooLarge.
-func (b *Buffer) WriteRune(r rune) (n int, err error) {
-	if r < utf8.RuneSelf {
-		b.WriteByte(byte(r))
-		return 1, nil
-	}
-	n = utf8.EncodeRune(b.runeBytes[0:], r)
-	b.Write(b.runeBytes[0:n])
-	return n, nil
-}
-
-// Read reads the next len(p) bytes from the buffer or until the buffer
-// is drained.  The return value n is the number of bytes read.  If the
-// buffer has no data to return, err is io.EOF (unless len(p) is zero);
-// otherwise it is nil.
-func (b *Buffer) Read(p []byte) (n int, err error) {
-	b.lastRead = opInvalid
-	if b.off >= len(b.buf) {
-		// Buffer is empty, reset to recover space.
-		b.Truncate(0)
-		if len(p) == 0 {
-			return
-		}
-		return 0, io.EOF
-	}
-	n = copy(p, b.buf[b.off:])
-	b.off += n
-	if n > 0 {
-		b.lastRead = opRead
-	}
-	return
-}
-
-// Next returns a slice containing the next n bytes from the buffer,
-// advancing the buffer as if the bytes had been returned by Read.
-// If there are fewer than n bytes in the buffer, Next returns the entire buffer.
-// The slice is only valid until the next call to a read or write method.
-func (b *Buffer) Next(n int) []byte {
-	b.lastRead = opInvalid
-	m := b.Len()
-	if n > m {
-		n = m
-	}
-	data := b.buf[b.off : b.off+n]
-	b.off += n
-	if n > 0 {
-		b.lastRead = opRead
-	}
-	return data
-}
-
-// ReadByte reads and returns the next byte from the buffer.
-// If no byte is available, it returns error io.EOF.
-func (b *Buffer) ReadByte() (c byte, err error) {
-	b.lastRead = opInvalid
-	if b.off >= len(b.buf) {
-		// Buffer is empty, reset to recover space.
-		b.Truncate(0)
-		return 0, io.EOF
-	}
-	c = b.buf[b.off]
-	b.off++
-	b.lastRead = opRead
-	return c, nil
-}
-
-// ReadRune reads and returns the next UTF-8-encoded
-// Unicode code point from the buffer.
-// If no bytes are available, the error returned is io.EOF.
-// If the bytes are an erroneous UTF-8 encoding, it
-// consumes one byte and returns U+FFFD, 1.
-func (b *Buffer) ReadRune() (r rune, size int, err error) {
-	b.lastRead = opInvalid
-	if b.off >= len(b.buf) {
-		// Buffer is empty, reset to recover space.
-		b.Truncate(0)
-		return 0, 0, io.EOF
-	}
-	b.lastRead = opReadRune
-	c := b.buf[b.off]
-	if c < utf8.RuneSelf {
-		b.off++
-		return rune(c), 1, nil
-	}
-	r, n := utf8.DecodeRune(b.buf[b.off:])
-	b.off += n
-	return r, n, nil
-}
-
-// UnreadRune unreads the last rune returned by ReadRune.
-// If the most recent read or write operation on the buffer was
-// not a ReadRune, UnreadRune returns an error.  (In this regard
-// it is stricter than UnreadByte, which will unread the last byte
-// from any read operation.)
-func (b *Buffer) UnreadRune() error {
-	if b.lastRead != opReadRune {
-		return errors.New("bytes.Buffer: UnreadRune: previous operation was not ReadRune")
-	}
-	b.lastRead = opInvalid
-	if b.off > 0 {
-		_, n := utf8.DecodeLastRune(b.buf[0:b.off])
-		b.off -= n
-	}
-	return nil
-}
-
-// UnreadByte unreads the last byte returned by the most recent
-// read operation.  If write has happened since the last read, UnreadByte
-// returns an error.
-func (b *Buffer) UnreadByte() error {
-	if b.lastRead != opReadRune && b.lastRead != opRead {
-		return errors.New("bytes.Buffer: UnreadByte: previous operation was not a read")
-	}
-	b.lastRead = opInvalid
-	if b.off > 0 {
-		b.off--
-	}
-	return nil
-}
-
-// ReadBytes reads until the first occurrence of delim in the input,
-// returning a slice containing the data up to and including the delimiter.
-// If ReadBytes encounters an error before finding a delimiter,
-// it returns the data read before the error and the error itself (often io.EOF).
-// ReadBytes returns err != nil if and only if the returned data does not end in
-// delim.
-func (b *Buffer) ReadBytes(delim byte) (line []byte, err error) {
-	slice, err := b.readSlice(delim)
-	// return a copy of slice. The buffer's backing array may
-	// be overwritten by later calls.
-	line = append(line, slice...)
-	return
-}
-
-// readSlice is like ReadBytes but returns a reference to internal buffer data.
-func (b *Buffer) readSlice(delim byte) (line []byte, err error) {
-	i := IndexByte(b.buf[b.off:], delim)
-	end := b.off + i + 1
-	if i < 0 {
-		end = len(b.buf)
-		err = io.EOF
-	}
-	line = b.buf[b.off:end]
-	b.off = end
-	b.lastRead = opRead
-	return line, err
-}
-
-// ReadString reads until the first occurrence of delim in the input,
-// returning a string containing the data up to and including the delimiter.
-// If ReadString encounters an error before finding a delimiter,
-// it returns the data read before the error and the error itself (often io.EOF).
-// ReadString returns err != nil if and only if the returned data does not end
-// in delim.
-func (b *Buffer) ReadString(delim byte) (line string, err error) {
-	slice, err := b.readSlice(delim)
-	return string(slice), err
-}
-
-// NewBuffer creates and initializes a new Buffer using buf as its initial
-// contents.  It is intended to prepare a Buffer to read existing data.  It
-// can also be used to size the internal buffer for writing. To do that,
-// buf should have the desired capacity but a length of zero.
-//
-// In most cases, new(Buffer) (or just declaring a Buffer variable) is
-// sufficient to initialize a Buffer.
-func NewBuffer(buf []byte) *Buffer { return &Buffer{buf: buf} }
-
-// NewBufferString creates and initializes a new Buffer using string s as its
-// initial contents. It is intended to prepare a buffer to read an existing
-// string.
-//
-// In most cases, new(Buffer) (or just declaring a Buffer variable) is
-// sufficient to initialize a Buffer.
-func NewBufferString(s string) *Buffer {
-	return &Buffer{buf: []byte(s)}
-}
diff --git a/third_party/gofrontend/libgo/go/bytes/buffer_test.go b/third_party/gofrontend/libgo/go/bytes/buffer_test.go
deleted file mode 100644
index 7de17ae..0000000
--- a/third_party/gofrontend/libgo/go/bytes/buffer_test.go
+++ /dev/null
@@ -1,544 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bytes_test
-
-import (
-	. "bytes"
-	"io"
-	"math/rand"
-	"runtime"
-	"testing"
-	"unicode/utf8"
-)
-
-const N = 10000      // make this bigger for a larger (and slower) test
-var data string      // test data for write tests
-var testBytes []byte // test data; same as data but as a slice.
-
-func init() {
-	testBytes = make([]byte, N)
-	for i := 0; i < N; i++ {
-		testBytes[i] = 'a' + byte(i%26)
-	}
-	data = string(testBytes)
-}
-
-// Verify that contents of buf match the string s.
-func check(t *testing.T, testname string, buf *Buffer, s string) {
-	bytes := buf.Bytes()
-	str := buf.String()
-	if buf.Len() != len(bytes) {
-		t.Errorf("%s: buf.Len() == %d, len(buf.Bytes()) == %d", testname, buf.Len(), len(bytes))
-	}
-
-	if buf.Len() != len(str) {
-		t.Errorf("%s: buf.Len() == %d, len(buf.String()) == %d", testname, buf.Len(), len(str))
-	}
-
-	if buf.Len() != len(s) {
-		t.Errorf("%s: buf.Len() == %d, len(s) == %d", testname, buf.Len(), len(s))
-	}
-
-	if string(bytes) != s {
-		t.Errorf("%s: string(buf.Bytes()) == %q, s == %q", testname, string(bytes), s)
-	}
-}
-
-// Fill buf through n writes of string fus.
-// The initial contents of buf corresponds to the string s;
-// the result is the final contents of buf returned as a string.
-func fillString(t *testing.T, testname string, buf *Buffer, s string, n int, fus string) string {
-	check(t, testname+" (fill 1)", buf, s)
-	for ; n > 0; n-- {
-		m, err := buf.WriteString(fus)
-		if m != len(fus) {
-			t.Errorf(testname+" (fill 2): m == %d, expected %d", m, len(fus))
-		}
-		if err != nil {
-			t.Errorf(testname+" (fill 3): err should always be nil, found err == %s", err)
-		}
-		s += fus
-		check(t, testname+" (fill 4)", buf, s)
-	}
-	return s
-}
-
-// Fill buf through n writes of byte slice fub.
-// The initial contents of buf corresponds to the string s;
-// the result is the final contents of buf returned as a string.
-func fillBytes(t *testing.T, testname string, buf *Buffer, s string, n int, fub []byte) string {
-	check(t, testname+" (fill 1)", buf, s)
-	for ; n > 0; n-- {
-		m, err := buf.Write(fub)
-		if m != len(fub) {
-			t.Errorf(testname+" (fill 2): m == %d, expected %d", m, len(fub))
-		}
-		if err != nil {
-			t.Errorf(testname+" (fill 3): err should always be nil, found err == %s", err)
-		}
-		s += string(fub)
-		check(t, testname+" (fill 4)", buf, s)
-	}
-	return s
-}
-
-func TestNewBuffer(t *testing.T) {
-	buf := NewBuffer(testBytes)
-	check(t, "NewBuffer", buf, data)
-}
-
-func TestNewBufferString(t *testing.T) {
-	buf := NewBufferString(data)
-	check(t, "NewBufferString", buf, data)
-}
-
-// Empty buf through repeated reads into fub.
-// The initial contents of buf corresponds to the string s.
-func empty(t *testing.T, testname string, buf *Buffer, s string, fub []byte) {
-	check(t, testname+" (empty 1)", buf, s)
-
-	for {
-		n, err := buf.Read(fub)
-		if n == 0 {
-			break
-		}
-		if err != nil {
-			t.Errorf(testname+" (empty 2): err should always be nil, found err == %s", err)
-		}
-		s = s[n:]
-		check(t, testname+" (empty 3)", buf, s)
-	}
-
-	check(t, testname+" (empty 4)", buf, "")
-}
-
-func TestBasicOperations(t *testing.T) {
-	var buf Buffer
-
-	for i := 0; i < 5; i++ {
-		check(t, "TestBasicOperations (1)", &buf, "")
-
-		buf.Reset()
-		check(t, "TestBasicOperations (2)", &buf, "")
-
-		buf.Truncate(0)
-		check(t, "TestBasicOperations (3)", &buf, "")
-
-		n, err := buf.Write([]byte(data[0:1]))
-		if n != 1 {
-			t.Errorf("wrote 1 byte, but n == %d", n)
-		}
-		if err != nil {
-			t.Errorf("err should always be nil, but err == %s", err)
-		}
-		check(t, "TestBasicOperations (4)", &buf, "a")
-
-		buf.WriteByte(data[1])
-		check(t, "TestBasicOperations (5)", &buf, "ab")
-
-		n, err = buf.Write([]byte(data[2:26]))
-		if n != 24 {
-			t.Errorf("wrote 25 bytes, but n == %d", n)
-		}
-		check(t, "TestBasicOperations (6)", &buf, string(data[0:26]))
-
-		buf.Truncate(26)
-		check(t, "TestBasicOperations (7)", &buf, string(data[0:26]))
-
-		buf.Truncate(20)
-		check(t, "TestBasicOperations (8)", &buf, string(data[0:20]))
-
-		empty(t, "TestBasicOperations (9)", &buf, string(data[0:20]), make([]byte, 5))
-		empty(t, "TestBasicOperations (10)", &buf, "", make([]byte, 100))
-
-		buf.WriteByte(data[1])
-		c, err := buf.ReadByte()
-		if err != nil {
-			t.Error("ReadByte unexpected eof")
-		}
-		if c != data[1] {
-			t.Errorf("ReadByte wrong value c=%v", c)
-		}
-		c, err = buf.ReadByte()
-		if err == nil {
-			t.Error("ReadByte unexpected not eof")
-		}
-	}
-}
-
-func TestLargeStringWrites(t *testing.T) {
-	var buf Buffer
-	limit := 30
-	if testing.Short() {
-		limit = 9
-	}
-	for i := 3; i < limit; i += 3 {
-		s := fillString(t, "TestLargeWrites (1)", &buf, "", 5, data)
-		empty(t, "TestLargeStringWrites (2)", &buf, s, make([]byte, len(data)/i))
-	}
-	check(t, "TestLargeStringWrites (3)", &buf, "")
-}
-
-func TestLargeByteWrites(t *testing.T) {
-	var buf Buffer
-	limit := 30
-	if testing.Short() {
-		limit = 9
-	}
-	for i := 3; i < limit; i += 3 {
-		s := fillBytes(t, "TestLargeWrites (1)", &buf, "", 5, testBytes)
-		empty(t, "TestLargeByteWrites (2)", &buf, s, make([]byte, len(data)/i))
-	}
-	check(t, "TestLargeByteWrites (3)", &buf, "")
-}
-
-func TestLargeStringReads(t *testing.T) {
-	var buf Buffer
-	for i := 3; i < 30; i += 3 {
-		s := fillString(t, "TestLargeReads (1)", &buf, "", 5, data[0:len(data)/i])
-		empty(t, "TestLargeReads (2)", &buf, s, make([]byte, len(data)))
-	}
-	check(t, "TestLargeStringReads (3)", &buf, "")
-}
-
-func TestLargeByteReads(t *testing.T) {
-	var buf Buffer
-	for i := 3; i < 30; i += 3 {
-		s := fillBytes(t, "TestLargeReads (1)", &buf, "", 5, testBytes[0:len(testBytes)/i])
-		empty(t, "TestLargeReads (2)", &buf, s, make([]byte, len(data)))
-	}
-	check(t, "TestLargeByteReads (3)", &buf, "")
-}
-
-func TestMixedReadsAndWrites(t *testing.T) {
-	var buf Buffer
-	s := ""
-	for i := 0; i < 50; i++ {
-		wlen := rand.Intn(len(data))
-		if i%2 == 0 {
-			s = fillString(t, "TestMixedReadsAndWrites (1)", &buf, s, 1, data[0:wlen])
-		} else {
-			s = fillBytes(t, "TestMixedReadsAndWrites (1)", &buf, s, 1, testBytes[0:wlen])
-		}
-
-		rlen := rand.Intn(len(data))
-		fub := make([]byte, rlen)
-		n, _ := buf.Read(fub)
-		s = s[n:]
-	}
-	empty(t, "TestMixedReadsAndWrites (2)", &buf, s, make([]byte, buf.Len()))
-}
-
-func TestCapWithPreallocatedSlice(t *testing.T) {
-	buf := NewBuffer(make([]byte, 10))
-	n := buf.Cap()
-	if n != 10 {
-		t.Errorf("expected 10, got %d", n)
-	}
-}
-
-func TestCapWithSliceAndWrittenData(t *testing.T) {
-	buf := NewBuffer(make([]byte, 0, 10))
-	buf.Write([]byte("test"))
-	n := buf.Cap()
-	if n != 10 {
-		t.Errorf("expected 10, got %d", n)
-	}
-}
-
-func TestNil(t *testing.T) {
-	var b *Buffer
-	if b.String() != "<nil>" {
-		t.Errorf("expected <nil>; got %q", b.String())
-	}
-}
-
-func TestReadFrom(t *testing.T) {
-	var buf Buffer
-	for i := 3; i < 30; i += 3 {
-		s := fillBytes(t, "TestReadFrom (1)", &buf, "", 5, testBytes[0:len(testBytes)/i])
-		var b Buffer
-		b.ReadFrom(&buf)
-		empty(t, "TestReadFrom (2)", &b, s, make([]byte, len(data)))
-	}
-}
-
-func TestWriteTo(t *testing.T) {
-	var buf Buffer
-	for i := 3; i < 30; i += 3 {
-		s := fillBytes(t, "TestWriteTo (1)", &buf, "", 5, testBytes[0:len(testBytes)/i])
-		var b Buffer
-		buf.WriteTo(&b)
-		empty(t, "TestWriteTo (2)", &b, s, make([]byte, len(data)))
-	}
-}
-
-func TestRuneIO(t *testing.T) {
-	const NRune = 1000
-	// Built a test slice while we write the data
-	b := make([]byte, utf8.UTFMax*NRune)
-	var buf Buffer
-	n := 0
-	for r := rune(0); r < NRune; r++ {
-		size := utf8.EncodeRune(b[n:], r)
-		nbytes, err := buf.WriteRune(r)
-		if err != nil {
-			t.Fatalf("WriteRune(%U) error: %s", r, err)
-		}
-		if nbytes != size {
-			t.Fatalf("WriteRune(%U) expected %d, got %d", r, size, nbytes)
-		}
-		n += size
-	}
-	b = b[0:n]
-
-	// Check the resulting bytes
-	if !Equal(buf.Bytes(), b) {
-		t.Fatalf("incorrect result from WriteRune: %q not %q", buf.Bytes(), b)
-	}
-
-	p := make([]byte, utf8.UTFMax)
-	// Read it back with ReadRune
-	for r := rune(0); r < NRune; r++ {
-		size := utf8.EncodeRune(p, r)
-		nr, nbytes, err := buf.ReadRune()
-		if nr != r || nbytes != size || err != nil {
-			t.Fatalf("ReadRune(%U) got %U,%d not %U,%d (err=%s)", r, nr, nbytes, r, size, err)
-		}
-	}
-
-	// Check that UnreadRune works
-	buf.Reset()
-	buf.Write(b)
-	for r := rune(0); r < NRune; r++ {
-		r1, size, _ := buf.ReadRune()
-		if err := buf.UnreadRune(); err != nil {
-			t.Fatalf("UnreadRune(%U) got error %q", r, err)
-		}
-		r2, nbytes, err := buf.ReadRune()
-		if r1 != r2 || r1 != r || nbytes != size || err != nil {
-			t.Fatalf("ReadRune(%U) after UnreadRune got %U,%d not %U,%d (err=%s)", r, r2, nbytes, r, size, err)
-		}
-	}
-}
-
-func TestNext(t *testing.T) {
-	b := []byte{0, 1, 2, 3, 4}
-	tmp := make([]byte, 5)
-	for i := 0; i <= 5; i++ {
-		for j := i; j <= 5; j++ {
-			for k := 0; k <= 6; k++ {
-				// 0 <= i <= j <= 5; 0 <= k <= 6
-				// Check that if we start with a buffer
-				// of length j at offset i and ask for
-				// Next(k), we get the right bytes.
-				buf := NewBuffer(b[0:j])
-				n, _ := buf.Read(tmp[0:i])
-				if n != i {
-					t.Fatalf("Read %d returned %d", i, n)
-				}
-				bb := buf.Next(k)
-				want := k
-				if want > j-i {
-					want = j - i
-				}
-				if len(bb) != want {
-					t.Fatalf("in %d,%d: len(Next(%d)) == %d", i, j, k, len(bb))
-				}
-				for l, v := range bb {
-					if v != byte(l+i) {
-						t.Fatalf("in %d,%d: Next(%d)[%d] = %d, want %d", i, j, k, l, v, l+i)
-					}
-				}
-			}
-		}
-	}
-}
-
-var readBytesTests = []struct {
-	buffer   string
-	delim    byte
-	expected []string
-	err      error
-}{
-	{"", 0, []string{""}, io.EOF},
-	{"a\x00", 0, []string{"a\x00"}, nil},
-	{"abbbaaaba", 'b', []string{"ab", "b", "b", "aaab"}, nil},
-	{"hello\x01world", 1, []string{"hello\x01"}, nil},
-	{"foo\nbar", 0, []string{"foo\nbar"}, io.EOF},
-	{"alpha\nbeta\ngamma\n", '\n', []string{"alpha\n", "beta\n", "gamma\n"}, nil},
-	{"alpha\nbeta\ngamma", '\n', []string{"alpha\n", "beta\n", "gamma"}, io.EOF},
-}
-
-func TestReadBytes(t *testing.T) {
-	for _, test := range readBytesTests {
-		buf := NewBufferString(test.buffer)
-		var err error
-		for _, expected := range test.expected {
-			var bytes []byte
-			bytes, err = buf.ReadBytes(test.delim)
-			if string(bytes) != expected {
-				t.Errorf("expected %q, got %q", expected, bytes)
-			}
-			if err != nil {
-				break
-			}
-		}
-		if err != test.err {
-			t.Errorf("expected error %v, got %v", test.err, err)
-		}
-	}
-}
-
-func TestReadString(t *testing.T) {
-	for _, test := range readBytesTests {
-		buf := NewBufferString(test.buffer)
-		var err error
-		for _, expected := range test.expected {
-			var s string
-			s, err = buf.ReadString(test.delim)
-			if s != expected {
-				t.Errorf("expected %q, got %q", expected, s)
-			}
-			if err != nil {
-				break
-			}
-		}
-		if err != test.err {
-			t.Errorf("expected error %v, got %v", test.err, err)
-		}
-	}
-}
-
-func BenchmarkReadString(b *testing.B) {
-	const n = 32 << 10
-
-	data := make([]byte, n)
-	data[n-1] = 'x'
-	b.SetBytes(int64(n))
-	for i := 0; i < b.N; i++ {
-		buf := NewBuffer(data)
-		_, err := buf.ReadString('x')
-		if err != nil {
-			b.Fatal(err)
-		}
-	}
-}
-
-func TestGrow(t *testing.T) {
-	x := []byte{'x'}
-	y := []byte{'y'}
-	tmp := make([]byte, 72)
-	for _, startLen := range []int{0, 100, 1000, 10000, 100000} {
-		xBytes := Repeat(x, startLen)
-		for _, growLen := range []int{0, 100, 1000, 10000, 100000} {
-			buf := NewBuffer(xBytes)
-			// If we read, this affects buf.off, which is good to test.
-			readBytes, _ := buf.Read(tmp)
-			buf.Grow(growLen)
-			yBytes := Repeat(y, growLen)
-			// Check no allocation occurs in write, as long as we're single-threaded.
-			var m1, m2 runtime.MemStats
-			runtime.ReadMemStats(&m1)
-			buf.Write(yBytes)
-			runtime.ReadMemStats(&m2)
-			if runtime.GOMAXPROCS(-1) == 1 && m1.Mallocs != m2.Mallocs {
-				t.Errorf("allocation occurred during write")
-			}
-			// Check that buffer has correct data.
-			if !Equal(buf.Bytes()[0:startLen-readBytes], xBytes[readBytes:]) {
-				t.Errorf("bad initial data at %d %d", startLen, growLen)
-			}
-			if !Equal(buf.Bytes()[startLen-readBytes:startLen-readBytes+growLen], yBytes) {
-				t.Errorf("bad written data at %d %d", startLen, growLen)
-			}
-		}
-	}
-}
-
-// Was a bug: used to give EOF reading empty slice at EOF.
-func TestReadEmptyAtEOF(t *testing.T) {
-	b := new(Buffer)
-	slice := make([]byte, 0)
-	n, err := b.Read(slice)
-	if err != nil {
-		t.Errorf("read error: %v", err)
-	}
-	if n != 0 {
-		t.Errorf("wrong count; got %d want 0", n)
-	}
-}
-
-func TestUnreadByte(t *testing.T) {
-	b := new(Buffer)
-	b.WriteString("abcdefghijklmnopqrstuvwxyz")
-
-	_, err := b.ReadBytes('m')
-	if err != nil {
-		t.Fatalf("ReadBytes: %v", err)
-	}
-
-	err = b.UnreadByte()
-	if err != nil {
-		t.Fatalf("UnreadByte: %v", err)
-	}
-	c, err := b.ReadByte()
-	if err != nil {
-		t.Fatalf("ReadByte: %v", err)
-	}
-	if c != 'm' {
-		t.Errorf("ReadByte = %q; want %q", c, 'm')
-	}
-}
-
-// Tests that we occasionally compact. Issue 5154.
-func TestBufferGrowth(t *testing.T) {
-	var b Buffer
-	buf := make([]byte, 1024)
-	b.Write(buf[0:1])
-	var cap0 int
-	for i := 0; i < 5<<10; i++ {
-		b.Write(buf)
-		b.Read(buf)
-		if i == 0 {
-			cap0 = b.Cap()
-		}
-	}
-	cap1 := b.Cap()
-	// (*Buffer).grow allows for 2x capacity slop before sliding,
-	// so set our error threshold at 3x.
-	if cap1 > cap0*3 {
-		t.Errorf("buffer cap = %d; too big (grew from %d)", cap1, cap0)
-	}
-}
-
-// From Issue 5154.
-func BenchmarkBufferNotEmptyWriteRead(b *testing.B) {
-	buf := make([]byte, 1024)
-	for i := 0; i < b.N; i++ {
-		var b Buffer
-		b.Write(buf[0:1])
-		for i := 0; i < 5<<10; i++ {
-			b.Write(buf)
-			b.Read(buf)
-		}
-	}
-}
-
-// Check that we don't compact too often. From Issue 5154.
-func BenchmarkBufferFullSmallReads(b *testing.B) {
-	buf := make([]byte, 1024)
-	for i := 0; i < b.N; i++ {
-		var b Buffer
-		b.Write(buf)
-		for b.Len()+20 < b.Cap() {
-			b.Write(buf[:10])
-		}
-		for i := 0; i < 5<<10; i++ {
-			b.Read(buf[:1])
-			b.Write(buf[:1])
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/bytes/bytes.go b/third_party/gofrontend/libgo/go/bytes/bytes.go
deleted file mode 100644
index b868240..0000000
--- a/third_party/gofrontend/libgo/go/bytes/bytes.go
+++ /dev/null
@@ -1,714 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package bytes implements functions for the manipulation of byte slices.
-// It is analogous to the facilities of the strings package.
-package bytes
-
-import (
-	"unicode"
-	"unicode/utf8"
-)
-
-func equalPortable(a, b []byte) bool {
-	if len(a) != len(b) {
-		return false
-	}
-	for i, c := range a {
-		if c != b[i] {
-			return false
-		}
-	}
-	return true
-}
-
-// explode splits s into a slice of UTF-8 sequences, one per Unicode code point (still slices of bytes),
-// up to a maximum of n byte slices. Invalid UTF-8 sequences are chopped into individual bytes.
-func explode(s []byte, n int) [][]byte {
-	if n <= 0 {
-		n = len(s)
-	}
-	a := make([][]byte, n)
-	var size int
-	na := 0
-	for len(s) > 0 {
-		if na+1 >= n {
-			a[na] = s
-			na++
-			break
-		}
-		_, size = utf8.DecodeRune(s)
-		a[na] = s[0:size]
-		s = s[size:]
-		na++
-	}
-	return a[0:na]
-}
-
-// Count counts the number of non-overlapping instances of sep in s.
-// If sep is an empty slice, Count returns 1 + the number of Unicode code points in s.
-func Count(s, sep []byte) int {
-	n := len(sep)
-	if n == 0 {
-		return utf8.RuneCount(s) + 1
-	}
-	if n > len(s) {
-		return 0
-	}
-	count := 0
-	c := sep[0]
-	i := 0
-	t := s[:len(s)-n+1]
-	for i < len(t) {
-		if t[i] != c {
-			o := IndexByte(t[i:], c)
-			if o < 0 {
-				break
-			}
-			i += o
-		}
-		if n == 1 || Equal(s[i:i+n], sep) {
-			count++
-			i += n
-			continue
-		}
-		i++
-	}
-	return count
-}
-
-// Contains reports whether subslice is within b.
-func Contains(b, subslice []byte) bool {
-	return Index(b, subslice) != -1
-}
-
-// Index returns the index of the first instance of sep in s, or -1 if sep is not present in s.
-func Index(s, sep []byte) int {
-	n := len(sep)
-	if n == 0 {
-		return 0
-	}
-	if n > len(s) {
-		return -1
-	}
-	c := sep[0]
-	if n == 1 {
-		return IndexByte(s, c)
-	}
-	i := 0
-	t := s[:len(s)-n+1]
-	for i < len(t) {
-		if t[i] != c {
-			o := IndexByte(t[i:], c)
-			if o < 0 {
-				break
-			}
-			i += o
-		}
-		if Equal(s[i:i+n], sep) {
-			return i
-		}
-		i++
-	}
-	return -1
-}
-
-func indexBytePortable(s []byte, c byte) int {
-	for i, b := range s {
-		if b == c {
-			return i
-		}
-	}
-	return -1
-}
-
-// LastIndex returns the index of the last instance of sep in s, or -1 if sep is not present in s.
-func LastIndex(s, sep []byte) int {
-	n := len(sep)
-	if n == 0 {
-		return len(s)
-	}
-	c := sep[0]
-	for i := len(s) - n; i >= 0; i-- {
-		if s[i] == c && (n == 1 || Equal(s[i:i+n], sep)) {
-			return i
-		}
-	}
-	return -1
-}
-
-// LastIndexByte returns the index of the last instance of c in s, or -1 if c is not present in s.
-func LastIndexByte(s []byte, c byte) int {
-	for i := len(s) - 1; i >= 0; i-- {
-		if s[i] == c {
-			return i
-		}
-	}
-	return -1
-}
-
-// IndexRune interprets s as a sequence of UTF-8-encoded Unicode code points.
-// It returns the byte index of the first occurrence in s of the given rune.
-// It returns -1 if rune is not present in s.
-func IndexRune(s []byte, r rune) int {
-	for i := 0; i < len(s); {
-		r1, size := utf8.DecodeRune(s[i:])
-		if r == r1 {
-			return i
-		}
-		i += size
-	}
-	return -1
-}
-
-// IndexAny interprets s as a sequence of UTF-8-encoded Unicode code points.
-// It returns the byte index of the first occurrence in s of any of the Unicode
-// code points in chars.  It returns -1 if chars is empty or if there is no code
-// point in common.
-func IndexAny(s []byte, chars string) int {
-	if len(chars) > 0 {
-		var r rune
-		var width int
-		for i := 0; i < len(s); i += width {
-			r = rune(s[i])
-			if r < utf8.RuneSelf {
-				width = 1
-			} else {
-				r, width = utf8.DecodeRune(s[i:])
-			}
-			for _, ch := range chars {
-				if r == ch {
-					return i
-				}
-			}
-		}
-	}
-	return -1
-}
-
-// LastIndexAny interprets s as a sequence of UTF-8-encoded Unicode code
-// points.  It returns the byte index of the last occurrence in s of any of
-// the Unicode code points in chars.  It returns -1 if chars is empty or if
-// there is no code point in common.
-func LastIndexAny(s []byte, chars string) int {
-	if len(chars) > 0 {
-		for i := len(s); i > 0; {
-			r, size := utf8.DecodeLastRune(s[0:i])
-			i -= size
-			for _, ch := range chars {
-				if r == ch {
-					return i
-				}
-			}
-		}
-	}
-	return -1
-}
-
-// Generic split: splits after each instance of sep,
-// including sepSave bytes of sep in the subslices.
-func genSplit(s, sep []byte, sepSave, n int) [][]byte {
-	if n == 0 {
-		return nil
-	}
-	if len(sep) == 0 {
-		return explode(s, n)
-	}
-	if n < 0 {
-		n = Count(s, sep) + 1
-	}
-	c := sep[0]
-	start := 0
-	a := make([][]byte, n)
-	na := 0
-	for i := 0; i+len(sep) <= len(s) && na+1 < n; i++ {
-		if s[i] == c && (len(sep) == 1 || Equal(s[i:i+len(sep)], sep)) {
-			a[na] = s[start : i+sepSave]
-			na++
-			start = i + len(sep)
-			i += len(sep) - 1
-		}
-	}
-	a[na] = s[start:]
-	return a[0 : na+1]
-}
-
-// SplitN slices s into subslices separated by sep and returns a slice of
-// the subslices between those separators.
-// If sep is empty, SplitN splits after each UTF-8 sequence.
-// The count determines the number of subslices to return:
-//   n > 0: at most n subslices; the last subslice will be the unsplit remainder.
-//   n == 0: the result is nil (zero subslices)
-//   n < 0: all subslices
-func SplitN(s, sep []byte, n int) [][]byte { return genSplit(s, sep, 0, n) }
-
-// SplitAfterN slices s into subslices after each instance of sep and
-// returns a slice of those subslices.
-// If sep is empty, SplitAfterN splits after each UTF-8 sequence.
-// The count determines the number of subslices to return:
-//   n > 0: at most n subslices; the last subslice will be the unsplit remainder.
-//   n == 0: the result is nil (zero subslices)
-//   n < 0: all subslices
-func SplitAfterN(s, sep []byte, n int) [][]byte {
-	return genSplit(s, sep, len(sep), n)
-}
-
-// Split slices s into all subslices separated by sep and returns a slice of
-// the subslices between those separators.
-// If sep is empty, Split splits after each UTF-8 sequence.
-// It is equivalent to SplitN with a count of -1.
-func Split(s, sep []byte) [][]byte { return genSplit(s, sep, 0, -1) }
-
-// SplitAfter slices s into all subslices after each instance of sep and
-// returns a slice of those subslices.
-// If sep is empty, SplitAfter splits after each UTF-8 sequence.
-// It is equivalent to SplitAfterN with a count of -1.
-func SplitAfter(s, sep []byte) [][]byte {
-	return genSplit(s, sep, len(sep), -1)
-}
-
-// Fields splits the slice s around each instance of one or more consecutive white space
-// characters, returning a slice of subslices of s or an empty list if s contains only white space.
-func Fields(s []byte) [][]byte {
-	return FieldsFunc(s, unicode.IsSpace)
-}
-
-// FieldsFunc interprets s as a sequence of UTF-8-encoded Unicode code points.
-// It splits the slice s at each run of code points c satisfying f(c) and
-// returns a slice of subslices of s.  If all code points in s satisfy f(c), or
-// len(s) == 0, an empty slice is returned.
-// FieldsFunc makes no guarantees about the order in which it calls f(c).
-// If f does not return consistent results for a given c, FieldsFunc may crash.
-func FieldsFunc(s []byte, f func(rune) bool) [][]byte {
-	n := 0
-	inField := false
-	for i := 0; i < len(s); {
-		r, size := utf8.DecodeRune(s[i:])
-		wasInField := inField
-		inField = !f(r)
-		if inField && !wasInField {
-			n++
-		}
-		i += size
-	}
-
-	a := make([][]byte, n)
-	na := 0
-	fieldStart := -1
-	for i := 0; i <= len(s) && na < n; {
-		r, size := utf8.DecodeRune(s[i:])
-		if fieldStart < 0 && size > 0 && !f(r) {
-			fieldStart = i
-			i += size
-			continue
-		}
-		if fieldStart >= 0 && (size == 0 || f(r)) {
-			a[na] = s[fieldStart:i]
-			na++
-			fieldStart = -1
-		}
-		if size == 0 {
-			break
-		}
-		i += size
-	}
-	return a[0:na]
-}
-
-// Join concatenates the elements of s to create a new byte slice. The separator
-// sep is placed between elements in the resulting slice.
-func Join(s [][]byte, sep []byte) []byte {
-	if len(s) == 0 {
-		return []byte{}
-	}
-	if len(s) == 1 {
-		// Just return a copy.
-		return append([]byte(nil), s[0]...)
-	}
-	n := len(sep) * (len(s) - 1)
-	for _, v := range s {
-		n += len(v)
-	}
-
-	b := make([]byte, n)
-	bp := copy(b, s[0])
-	for _, v := range s[1:] {
-		bp += copy(b[bp:], sep)
-		bp += copy(b[bp:], v)
-	}
-	return b
-}
-
-// HasPrefix tests whether the byte slice s begins with prefix.
-func HasPrefix(s, prefix []byte) bool {
-	return len(s) >= len(prefix) && Equal(s[0:len(prefix)], prefix)
-}
-
-// HasSuffix tests whether the byte slice s ends with suffix.
-func HasSuffix(s, suffix []byte) bool {
-	return len(s) >= len(suffix) && Equal(s[len(s)-len(suffix):], suffix)
-}
-
-// Map returns a copy of the byte slice s with all its characters modified
-// according to the mapping function. If mapping returns a negative value, the character is
-// dropped from the string with no replacement.  The characters in s and the
-// output are interpreted as UTF-8-encoded Unicode code points.
-func Map(mapping func(r rune) rune, s []byte) []byte {
-	// In the worst case, the slice can grow when mapped, making
-	// things unpleasant.  But it's so rare we barge in assuming it's
-	// fine.  It could also shrink but that falls out naturally.
-	maxbytes := len(s) // length of b
-	nbytes := 0        // number of bytes encoded in b
-	b := make([]byte, maxbytes)
-	for i := 0; i < len(s); {
-		wid := 1
-		r := rune(s[i])
-		if r >= utf8.RuneSelf {
-			r, wid = utf8.DecodeRune(s[i:])
-		}
-		r = mapping(r)
-		if r >= 0 {
-			rl := utf8.RuneLen(r)
-			if rl < 0 {
-				rl = len(string(utf8.RuneError))
-			}
-			if nbytes+rl > maxbytes {
-				// Grow the buffer.
-				maxbytes = maxbytes*2 + utf8.UTFMax
-				nb := make([]byte, maxbytes)
-				copy(nb, b[0:nbytes])
-				b = nb
-			}
-			nbytes += utf8.EncodeRune(b[nbytes:maxbytes], r)
-		}
-		i += wid
-	}
-	return b[0:nbytes]
-}
-
-// Repeat returns a new byte slice consisting of count copies of b.
-func Repeat(b []byte, count int) []byte {
-	nb := make([]byte, len(b)*count)
-	bp := copy(nb, b)
-	for bp < len(nb) {
-		copy(nb[bp:], nb[:bp])
-		bp *= 2
-	}
-	return nb
-}
-
-// ToUpper returns a copy of the byte slice s with all Unicode letters mapped to their upper case.
-func ToUpper(s []byte) []byte { return Map(unicode.ToUpper, s) }
-
-// ToLower returns a copy of the byte slice s with all Unicode letters mapped to their lower case.
-func ToLower(s []byte) []byte { return Map(unicode.ToLower, s) }
-
-// ToTitle returns a copy of the byte slice s with all Unicode letters mapped to their title case.
-func ToTitle(s []byte) []byte { return Map(unicode.ToTitle, s) }
-
-// ToUpperSpecial returns a copy of the byte slice s with all Unicode letters mapped to their
-// upper case, giving priority to the special casing rules.
-func ToUpperSpecial(_case unicode.SpecialCase, s []byte) []byte {
-	return Map(func(r rune) rune { return _case.ToUpper(r) }, s)
-}
-
-// ToLowerSpecial returns a copy of the byte slice s with all Unicode letters mapped to their
-// lower case, giving priority to the special casing rules.
-func ToLowerSpecial(_case unicode.SpecialCase, s []byte) []byte {
-	return Map(func(r rune) rune { return _case.ToLower(r) }, s)
-}
-
-// ToTitleSpecial returns a copy of the byte slice s with all Unicode letters mapped to their
-// title case, giving priority to the special casing rules.
-func ToTitleSpecial(_case unicode.SpecialCase, s []byte) []byte {
-	return Map(func(r rune) rune { return _case.ToTitle(r) }, s)
-}
-
-// isSeparator reports whether the rune could mark a word boundary.
-// TODO: update when package unicode captures more of the properties.
-func isSeparator(r rune) bool {
-	// ASCII alphanumerics and underscore are not separators
-	if r <= 0x7F {
-		switch {
-		case '0' <= r && r <= '9':
-			return false
-		case 'a' <= r && r <= 'z':
-			return false
-		case 'A' <= r && r <= 'Z':
-			return false
-		case r == '_':
-			return false
-		}
-		return true
-	}
-	// Letters and digits are not separators
-	if unicode.IsLetter(r) || unicode.IsDigit(r) {
-		return false
-	}
-	// Otherwise, all we can do for now is treat spaces as separators.
-	return unicode.IsSpace(r)
-}
-
-// Title returns a copy of s with all Unicode letters that begin words
-// mapped to their title case.
-//
-// BUG(rsc): The rule Title uses for word boundaries does not handle Unicode punctuation properly.
-func Title(s []byte) []byte {
-	// Use a closure here to remember state.
-	// Hackish but effective. Depends on Map scanning in order and calling
-	// the closure once per rune.
-	prev := ' '
-	return Map(
-		func(r rune) rune {
-			if isSeparator(prev) {
-				prev = r
-				return unicode.ToTitle(r)
-			}
-			prev = r
-			return r
-		},
-		s)
-}
-
-// TrimLeftFunc returns a subslice of s by slicing off all leading UTF-8-encoded
-// Unicode code points c that satisfy f(c).
-func TrimLeftFunc(s []byte, f func(r rune) bool) []byte {
-	i := indexFunc(s, f, false)
-	if i == -1 {
-		return nil
-	}
-	return s[i:]
-}
-
-// TrimRightFunc returns a subslice of s by slicing off all trailing UTF-8
-// encoded Unicode code points c that satisfy f(c).
-func TrimRightFunc(s []byte, f func(r rune) bool) []byte {
-	i := lastIndexFunc(s, f, false)
-	if i >= 0 && s[i] >= utf8.RuneSelf {
-		_, wid := utf8.DecodeRune(s[i:])
-		i += wid
-	} else {
-		i++
-	}
-	return s[0:i]
-}
-
-// TrimFunc returns a subslice of s by slicing off all leading and trailing
-// UTF-8-encoded Unicode code points c that satisfy f(c).
-func TrimFunc(s []byte, f func(r rune) bool) []byte {
-	return TrimRightFunc(TrimLeftFunc(s, f), f)
-}
-
-// TrimPrefix returns s without the provided leading prefix string.
-// If s doesn't start with prefix, s is returned unchanged.
-func TrimPrefix(s, prefix []byte) []byte {
-	if HasPrefix(s, prefix) {
-		return s[len(prefix):]
-	}
-	return s
-}
-
-// TrimSuffix returns s without the provided trailing suffix string.
-// If s doesn't end with suffix, s is returned unchanged.
-func TrimSuffix(s, suffix []byte) []byte {
-	if HasSuffix(s, suffix) {
-		return s[:len(s)-len(suffix)]
-	}
-	return s
-}
-
-// IndexFunc interprets s as a sequence of UTF-8-encoded Unicode code points.
-// It returns the byte index in s of the first Unicode
-// code point satisfying f(c), or -1 if none do.
-func IndexFunc(s []byte, f func(r rune) bool) int {
-	return indexFunc(s, f, true)
-}
-
-// LastIndexFunc interprets s as a sequence of UTF-8-encoded Unicode code points.
-// It returns the byte index in s of the last Unicode
-// code point satisfying f(c), or -1 if none do.
-func LastIndexFunc(s []byte, f func(r rune) bool) int {
-	return lastIndexFunc(s, f, true)
-}
-
-// indexFunc is the same as IndexFunc except that if
-// truth==false, the sense of the predicate function is
-// inverted.
-func indexFunc(s []byte, f func(r rune) bool, truth bool) int {
-	start := 0
-	for start < len(s) {
-		wid := 1
-		r := rune(s[start])
-		if r >= utf8.RuneSelf {
-			r, wid = utf8.DecodeRune(s[start:])
-		}
-		if f(r) == truth {
-			return start
-		}
-		start += wid
-	}
-	return -1
-}
-
-// lastIndexFunc is the same as LastIndexFunc except that if
-// truth==false, the sense of the predicate function is
-// inverted.
-func lastIndexFunc(s []byte, f func(r rune) bool, truth bool) int {
-	for i := len(s); i > 0; {
-		r, size := rune(s[i-1]), 1
-		if r >= utf8.RuneSelf {
-			r, size = utf8.DecodeLastRune(s[0:i])
-		}
-		i -= size
-		if f(r) == truth {
-			return i
-		}
-	}
-	return -1
-}
-
-func makeCutsetFunc(cutset string) func(r rune) bool {
-	return func(r rune) bool {
-		for _, c := range cutset {
-			if c == r {
-				return true
-			}
-		}
-		return false
-	}
-}
-
-// Trim returns a subslice of s by slicing off all leading and
-// trailing UTF-8-encoded Unicode code points contained in cutset.
-func Trim(s []byte, cutset string) []byte {
-	return TrimFunc(s, makeCutsetFunc(cutset))
-}
-
-// TrimLeft returns a subslice of s by slicing off all leading
-// UTF-8-encoded Unicode code points contained in cutset.
-func TrimLeft(s []byte, cutset string) []byte {
-	return TrimLeftFunc(s, makeCutsetFunc(cutset))
-}
-
-// TrimRight returns a subslice of s by slicing off all trailing
-// UTF-8-encoded Unicode code points that are contained in cutset.
-func TrimRight(s []byte, cutset string) []byte {
-	return TrimRightFunc(s, makeCutsetFunc(cutset))
-}
-
-// TrimSpace returns a subslice of s by slicing off all leading and
-// trailing white space, as defined by Unicode.
-func TrimSpace(s []byte) []byte {
-	return TrimFunc(s, unicode.IsSpace)
-}
-
-// Runes returns a slice of runes (Unicode code points) equivalent to s.
-func Runes(s []byte) []rune {
-	t := make([]rune, utf8.RuneCount(s))
-	i := 0
-	for len(s) > 0 {
-		r, l := utf8.DecodeRune(s)
-		t[i] = r
-		i++
-		s = s[l:]
-	}
-	return t
-}
-
-// Replace returns a copy of the slice s with the first n
-// non-overlapping instances of old replaced by new.
-// If old is empty, it matches at the beginning of the slice
-// and after each UTF-8 sequence, yielding up to k+1 replacements
-// for a k-rune slice.
-// If n < 0, there is no limit on the number of replacements.
-func Replace(s, old, new []byte, n int) []byte {
-	m := 0
-	if n != 0 {
-		// Compute number of replacements.
-		m = Count(s, old)
-	}
-	if m == 0 {
-		// Just return a copy.
-		return append([]byte(nil), s...)
-	}
-	if n < 0 || m < n {
-		n = m
-	}
-
-	// Apply replacements to buffer.
-	t := make([]byte, len(s)+n*(len(new)-len(old)))
-	w := 0
-	start := 0
-	for i := 0; i < n; i++ {
-		j := start
-		if len(old) == 0 {
-			if i > 0 {
-				_, wid := utf8.DecodeRune(s[start:])
-				j += wid
-			}
-		} else {
-			j += Index(s[start:], old)
-		}
-		w += copy(t[w:], s[start:j])
-		w += copy(t[w:], new)
-		start = j + len(old)
-	}
-	w += copy(t[w:], s[start:])
-	return t[0:w]
-}
-
-// EqualFold reports whether s and t, interpreted as UTF-8 strings,
-// are equal under Unicode case-folding.
-func EqualFold(s, t []byte) bool {
-	for len(s) != 0 && len(t) != 0 {
-		// Extract first rune from each.
-		var sr, tr rune
-		if s[0] < utf8.RuneSelf {
-			sr, s = rune(s[0]), s[1:]
-		} else {
-			r, size := utf8.DecodeRune(s)
-			sr, s = r, s[size:]
-		}
-		if t[0] < utf8.RuneSelf {
-			tr, t = rune(t[0]), t[1:]
-		} else {
-			r, size := utf8.DecodeRune(t)
-			tr, t = r, t[size:]
-		}
-
-		// If they match, keep going; if not, return false.
-
-		// Easy case.
-		if tr == sr {
-			continue
-		}
-
-		// Make sr < tr to simplify what follows.
-		if tr < sr {
-			tr, sr = sr, tr
-		}
-		// Fast check for ASCII.
-		if tr < utf8.RuneSelf && 'A' <= sr && sr <= 'Z' {
-			// ASCII, and sr is upper case.  tr must be lower case.
-			if tr == sr+'a'-'A' {
-				continue
-			}
-			return false
-		}
-
-		// General case.  SimpleFold(x) returns the next equivalent rune > x
-		// or wraps around to smaller values.
-		r := unicode.SimpleFold(sr)
-		for r != sr && r < tr {
-			r = unicode.SimpleFold(r)
-		}
-		if r == tr {
-			continue
-		}
-		return false
-	}
-
-	// One string is empty.  Are both?
-	return len(s) == len(t)
-}
diff --git a/third_party/gofrontend/libgo/go/bytes/bytes_decl.go b/third_party/gofrontend/libgo/go/bytes/bytes_decl.go
deleted file mode 100644
index b453f21..0000000
--- a/third_party/gofrontend/libgo/go/bytes/bytes_decl.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bytes
-
-//go:noescape
-
-// IndexByte returns the index of the first instance of c in s, or -1 if c is not present in s.
-func IndexByte(s []byte, c byte) int // ../runtime/asm_$GOARCH.s
-
-//go:noescape
-
-// Equal returns a boolean reporting whether a and b
-// are the same length and contain the same bytes.
-// A nil argument is equivalent to an empty slice.
-func Equal(a, b []byte) bool // ../runtime/asm_$GOARCH.s
-
-//go:noescape
-
-// Compare returns an integer comparing two byte slices lexicographically.
-// The result will be 0 if a==b, -1 if a < b, and +1 if a > b.
-// A nil argument is equivalent to an empty slice.
-func Compare(a, b []byte) int // ../runtime/noasm.go or ../runtime/asm_{386,amd64}.s
diff --git a/third_party/gofrontend/libgo/go/bytes/bytes_test.go b/third_party/gofrontend/libgo/go/bytes/bytes_test.go
deleted file mode 100644
index 6245e48..0000000
--- a/third_party/gofrontend/libgo/go/bytes/bytes_test.go
+++ /dev/null
@@ -1,1257 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bytes_test
-
-import (
-	. "bytes"
-	"math/rand"
-	"reflect"
-	"testing"
-	"unicode"
-	"unicode/utf8"
-)
-
-func eq(a, b []string) bool {
-	if len(a) != len(b) {
-		return false
-	}
-	for i := 0; i < len(a); i++ {
-		if a[i] != b[i] {
-			return false
-		}
-	}
-	return true
-}
-
-func sliceOfString(s [][]byte) []string {
-	result := make([]string, len(s))
-	for i, v := range s {
-		result[i] = string(v)
-	}
-	return result
-}
-
-// For ease of reading, the test cases use strings that are converted to byte
-// slices before invoking the functions.
-
-var abcd = "abcd"
-var faces = "☺☻☹"
-var commas = "1,2,3,4"
-var dots = "1....2....3....4"
-
-type BinOpTest struct {
-	a string
-	b string
-	i int
-}
-
-var equalTests = []struct {
-	a, b []byte
-	i    int
-}{
-	{[]byte(""), []byte(""), 0},
-	{[]byte("a"), []byte(""), 1},
-	{[]byte(""), []byte("a"), -1},
-	{[]byte("abc"), []byte("abc"), 0},
-	{[]byte("ab"), []byte("abc"), -1},
-	{[]byte("abc"), []byte("ab"), 1},
-	{[]byte("x"), []byte("ab"), 1},
-	{[]byte("ab"), []byte("x"), -1},
-	{[]byte("x"), []byte("a"), 1},
-	{[]byte("b"), []byte("x"), -1},
-	// test runtime·memeq's chunked implementation
-	{[]byte("abcdefgh"), []byte("abcdefgh"), 0},
-	{[]byte("abcdefghi"), []byte("abcdefghi"), 0},
-	{[]byte("abcdefghi"), []byte("abcdefghj"), -1},
-	// nil tests
-	{nil, nil, 0},
-	{[]byte(""), nil, 0},
-	{nil, []byte(""), 0},
-	{[]byte("a"), nil, 1},
-	{nil, []byte("a"), -1},
-}
-
-func TestEqual(t *testing.T) {
-	for _, tt := range compareTests {
-		eql := Equal(tt.a, tt.b)
-		if eql != (tt.i == 0) {
-			t.Errorf(`Equal(%q, %q) = %v`, tt.a, tt.b, eql)
-		}
-		eql = EqualPortable(tt.a, tt.b)
-		if eql != (tt.i == 0) {
-			t.Errorf(`EqualPortable(%q, %q) = %v`, tt.a, tt.b, eql)
-		}
-	}
-}
-
-func TestEqualExhaustive(t *testing.T) {
-	var size = 128
-	if testing.Short() {
-		size = 32
-	}
-	a := make([]byte, size)
-	b := make([]byte, size)
-	b_init := make([]byte, size)
-	// randomish but deterministic data
-	for i := 0; i < size; i++ {
-		a[i] = byte(17 * i)
-		b_init[i] = byte(23*i + 100)
-	}
-
-	for len := 0; len <= size; len++ {
-		for x := 0; x <= size-len; x++ {
-			for y := 0; y <= size-len; y++ {
-				copy(b, b_init)
-				copy(b[y:y+len], a[x:x+len])
-				if !Equal(a[x:x+len], b[y:y+len]) || !Equal(b[y:y+len], a[x:x+len]) {
-					t.Errorf("Equal(%d, %d, %d) = false", len, x, y)
-				}
-			}
-		}
-	}
-}
-
-// make sure Equal returns false for minimally different strings.  The data
-// is all zeros except for a single one in one location.
-func TestNotEqual(t *testing.T) {
-	var size = 128
-	if testing.Short() {
-		size = 32
-	}
-	a := make([]byte, size)
-	b := make([]byte, size)
-
-	for len := 0; len <= size; len++ {
-		for x := 0; x <= size-len; x++ {
-			for y := 0; y <= size-len; y++ {
-				for diffpos := x; diffpos < x+len; diffpos++ {
-					a[diffpos] = 1
-					if Equal(a[x:x+len], b[y:y+len]) || Equal(b[y:y+len], a[x:x+len]) {
-						t.Errorf("NotEqual(%d, %d, %d, %d) = true", len, x, y, diffpos)
-					}
-					a[diffpos] = 0
-				}
-			}
-		}
-	}
-}
-
-var indexTests = []BinOpTest{
-	{"", "", 0},
-	{"", "a", -1},
-	{"", "foo", -1},
-	{"fo", "foo", -1},
-	{"foo", "baz", -1},
-	{"foo", "foo", 0},
-	{"oofofoofooo", "f", 2},
-	{"oofofoofooo", "foo", 4},
-	{"barfoobarfoo", "foo", 3},
-	{"foo", "", 0},
-	{"foo", "o", 1},
-	{"abcABCabc", "A", 3},
-	// cases with one byte strings - test IndexByte and special case in Index()
-	{"", "a", -1},
-	{"x", "a", -1},
-	{"x", "x", 0},
-	{"abc", "a", 0},
-	{"abc", "b", 1},
-	{"abc", "c", 2},
-	{"abc", "x", -1},
-	{"barfoobarfooyyyzzzyyyzzzyyyzzzyyyxxxzzzyyy", "x", 33},
-	{"foofyfoobarfoobar", "y", 4},
-	{"oooooooooooooooooooooo", "r", -1},
-}
-
-var lastIndexTests = []BinOpTest{
-	{"", "", 0},
-	{"", "a", -1},
-	{"", "foo", -1},
-	{"fo", "foo", -1},
-	{"foo", "foo", 0},
-	{"foo", "f", 0},
-	{"oofofoofooo", "f", 7},
-	{"oofofoofooo", "foo", 7},
-	{"barfoobarfoo", "foo", 9},
-	{"foo", "", 3},
-	{"foo", "o", 2},
-	{"abcABCabc", "A", 3},
-	{"abcABCabc", "a", 6},
-}
-
-var indexAnyTests = []BinOpTest{
-	{"", "", -1},
-	{"", "a", -1},
-	{"", "abc", -1},
-	{"a", "", -1},
-	{"a", "a", 0},
-	{"aaa", "a", 0},
-	{"abc", "xyz", -1},
-	{"abc", "xcz", 2},
-	{"ab☺c", "x☺yz", 2},
-	{"aRegExp*", ".(|)*+?^$[]", 7},
-	{dots + dots + dots, " ", -1},
-}
-
-var lastIndexAnyTests = []BinOpTest{
-	{"", "", -1},
-	{"", "a", -1},
-	{"", "abc", -1},
-	{"a", "", -1},
-	{"a", "a", 0},
-	{"aaa", "a", 2},
-	{"abc", "xyz", -1},
-	{"abc", "ab", 1},
-	{"a☺b☻c☹d", "uvw☻xyz", 2 + len("☺")},
-	{"a.RegExp*", ".(|)*+?^$[]", 8},
-	{dots + dots + dots, " ", -1},
-}
-
-var indexRuneTests = []BinOpTest{
-	{"", "a", -1},
-	{"", "☺", -1},
-	{"foo", "☹", -1},
-	{"foo", "o", 1},
-	{"foo☺bar", "☺", 3},
-	{"foo☺☻☹bar", "☹", 9},
-}
-
-// Execute f on each test case.  funcName should be the name of f; it's used
-// in failure reports.
-func runIndexTests(t *testing.T, f func(s, sep []byte) int, funcName string, testCases []BinOpTest) {
-	for _, test := range testCases {
-		a := []byte(test.a)
-		b := []byte(test.b)
-		actual := f(a, b)
-		if actual != test.i {
-			t.Errorf("%s(%q,%q) = %v; want %v", funcName, a, b, actual, test.i)
-		}
-	}
-}
-
-func runIndexAnyTests(t *testing.T, f func(s []byte, chars string) int, funcName string, testCases []BinOpTest) {
-	for _, test := range testCases {
-		a := []byte(test.a)
-		actual := f(a, test.b)
-		if actual != test.i {
-			t.Errorf("%s(%q,%q) = %v; want %v", funcName, a, test.b, actual, test.i)
-		}
-	}
-}
-
-func TestIndex(t *testing.T)     { runIndexTests(t, Index, "Index", indexTests) }
-func TestLastIndex(t *testing.T) { runIndexTests(t, LastIndex, "LastIndex", lastIndexTests) }
-func TestIndexAny(t *testing.T)  { runIndexAnyTests(t, IndexAny, "IndexAny", indexAnyTests) }
-func TestLastIndexAny(t *testing.T) {
-	runIndexAnyTests(t, LastIndexAny, "LastIndexAny", lastIndexAnyTests)
-}
-
-func TestIndexByte(t *testing.T) {
-	for _, tt := range indexTests {
-		if len(tt.b) != 1 {
-			continue
-		}
-		a := []byte(tt.a)
-		b := tt.b[0]
-		pos := IndexByte(a, b)
-		if pos != tt.i {
-			t.Errorf(`IndexByte(%q, '%c') = %v`, tt.a, b, pos)
-		}
-		posp := IndexBytePortable(a, b)
-		if posp != tt.i {
-			t.Errorf(`indexBytePortable(%q, '%c') = %v`, tt.a, b, posp)
-		}
-	}
-}
-
-func TestLastIndexByte(t *testing.T) {
-	testCases := []BinOpTest{
-		{"", "q", -1},
-		{"abcdef", "q", -1},
-		{"abcdefabcdef", "a", len("abcdef")},      // something in the middle
-		{"abcdefabcdef", "f", len("abcdefabcde")}, // last byte
-		{"zabcdefabcdef", "z", 0},                 // first byte
-		{"a☺b☻c☹d", "b", len("a☺")},               // non-ascii
-	}
-	for _, test := range testCases {
-		actual := LastIndexByte([]byte(test.a), test.b[0])
-		if actual != test.i {
-			t.Errorf("LastIndexByte(%q,%c) = %v; want %v", test.a, test.b[0], actual, test.i)
-		}
-	}
-}
-
-// test a larger buffer with different sizes and alignments
-func TestIndexByteBig(t *testing.T) {
-	var n = 1024
-	if testing.Short() {
-		n = 128
-	}
-	b := make([]byte, n)
-	for i := 0; i < n; i++ {
-		// different start alignments
-		b1 := b[i:]
-		for j := 0; j < len(b1); j++ {
-			b1[j] = 'x'
-			pos := IndexByte(b1, 'x')
-			if pos != j {
-				t.Errorf("IndexByte(%q, 'x') = %v", b1, pos)
-			}
-			b1[j] = 0
-			pos = IndexByte(b1, 'x')
-			if pos != -1 {
-				t.Errorf("IndexByte(%q, 'x') = %v", b1, pos)
-			}
-		}
-		// different end alignments
-		b1 = b[:i]
-		for j := 0; j < len(b1); j++ {
-			b1[j] = 'x'
-			pos := IndexByte(b1, 'x')
-			if pos != j {
-				t.Errorf("IndexByte(%q, 'x') = %v", b1, pos)
-			}
-			b1[j] = 0
-			pos = IndexByte(b1, 'x')
-			if pos != -1 {
-				t.Errorf("IndexByte(%q, 'x') = %v", b1, pos)
-			}
-		}
-		// different start and end alignments
-		b1 = b[i/2 : n-(i+1)/2]
-		for j := 0; j < len(b1); j++ {
-			b1[j] = 'x'
-			pos := IndexByte(b1, 'x')
-			if pos != j {
-				t.Errorf("IndexByte(%q, 'x') = %v", b1, pos)
-			}
-			b1[j] = 0
-			pos = IndexByte(b1, 'x')
-			if pos != -1 {
-				t.Errorf("IndexByte(%q, 'x') = %v", b1, pos)
-			}
-		}
-	}
-}
-
-func TestIndexRune(t *testing.T) {
-	for _, tt := range indexRuneTests {
-		a := []byte(tt.a)
-		r, _ := utf8.DecodeRuneInString(tt.b)
-		pos := IndexRune(a, r)
-		if pos != tt.i {
-			t.Errorf(`IndexRune(%q, '%c') = %v`, tt.a, r, pos)
-		}
-	}
-}
-
-var bmbuf []byte
-
-func BenchmarkIndexByte32(b *testing.B)          { bmIndexByte(b, IndexByte, 32) }
-func BenchmarkIndexByte4K(b *testing.B)          { bmIndexByte(b, IndexByte, 4<<10) }
-func BenchmarkIndexByte4M(b *testing.B)          { bmIndexByte(b, IndexByte, 4<<20) }
-func BenchmarkIndexByte64M(b *testing.B)         { bmIndexByte(b, IndexByte, 64<<20) }
-func BenchmarkIndexBytePortable32(b *testing.B)  { bmIndexByte(b, IndexBytePortable, 32) }
-func BenchmarkIndexBytePortable4K(b *testing.B)  { bmIndexByte(b, IndexBytePortable, 4<<10) }
-func BenchmarkIndexBytePortable4M(b *testing.B)  { bmIndexByte(b, IndexBytePortable, 4<<20) }
-func BenchmarkIndexBytePortable64M(b *testing.B) { bmIndexByte(b, IndexBytePortable, 64<<20) }
-
-func bmIndexByte(b *testing.B, index func([]byte, byte) int, n int) {
-	if len(bmbuf) < n {
-		bmbuf = make([]byte, n)
-	}
-	b.SetBytes(int64(n))
-	buf := bmbuf[0:n]
-	buf[n-1] = 'x'
-	for i := 0; i < b.N; i++ {
-		j := index(buf, 'x')
-		if j != n-1 {
-			b.Fatal("bad index", j)
-		}
-	}
-	buf[n-1] = '\x00'
-}
-
-func BenchmarkEqual0(b *testing.B) {
-	var buf [4]byte
-	buf1 := buf[0:0]
-	buf2 := buf[1:1]
-	for i := 0; i < b.N; i++ {
-		eq := Equal(buf1, buf2)
-		if !eq {
-			b.Fatal("bad equal")
-		}
-	}
-}
-
-func BenchmarkEqual1(b *testing.B)           { bmEqual(b, Equal, 1) }
-func BenchmarkEqual6(b *testing.B)           { bmEqual(b, Equal, 6) }
-func BenchmarkEqual9(b *testing.B)           { bmEqual(b, Equal, 9) }
-func BenchmarkEqual15(b *testing.B)          { bmEqual(b, Equal, 15) }
-func BenchmarkEqual16(b *testing.B)          { bmEqual(b, Equal, 16) }
-func BenchmarkEqual20(b *testing.B)          { bmEqual(b, Equal, 20) }
-func BenchmarkEqual32(b *testing.B)          { bmEqual(b, Equal, 32) }
-func BenchmarkEqual4K(b *testing.B)          { bmEqual(b, Equal, 4<<10) }
-func BenchmarkEqual4M(b *testing.B)          { bmEqual(b, Equal, 4<<20) }
-func BenchmarkEqual64M(b *testing.B)         { bmEqual(b, Equal, 64<<20) }
-func BenchmarkEqualPort1(b *testing.B)       { bmEqual(b, EqualPortable, 1) }
-func BenchmarkEqualPort6(b *testing.B)       { bmEqual(b, EqualPortable, 6) }
-func BenchmarkEqualPort32(b *testing.B)      { bmEqual(b, EqualPortable, 32) }
-func BenchmarkEqualPort4K(b *testing.B)      { bmEqual(b, EqualPortable, 4<<10) }
-func BenchmarkEqualPortable4M(b *testing.B)  { bmEqual(b, EqualPortable, 4<<20) }
-func BenchmarkEqualPortable64M(b *testing.B) { bmEqual(b, EqualPortable, 64<<20) }
-
-func bmEqual(b *testing.B, equal func([]byte, []byte) bool, n int) {
-	if len(bmbuf) < 2*n {
-		bmbuf = make([]byte, 2*n)
-	}
-	b.SetBytes(int64(n))
-	buf1 := bmbuf[0:n]
-	buf2 := bmbuf[n : 2*n]
-	buf1[n-1] = 'x'
-	buf2[n-1] = 'x'
-	for i := 0; i < b.N; i++ {
-		eq := equal(buf1, buf2)
-		if !eq {
-			b.Fatal("bad equal")
-		}
-	}
-	buf1[n-1] = '\x00'
-	buf2[n-1] = '\x00'
-}
-
-func BenchmarkIndex32(b *testing.B)  { bmIndex(b, Index, 32) }
-func BenchmarkIndex4K(b *testing.B)  { bmIndex(b, Index, 4<<10) }
-func BenchmarkIndex4M(b *testing.B)  { bmIndex(b, Index, 4<<20) }
-func BenchmarkIndex64M(b *testing.B) { bmIndex(b, Index, 64<<20) }
-
-func bmIndex(b *testing.B, index func([]byte, []byte) int, n int) {
-	if len(bmbuf) < n {
-		bmbuf = make([]byte, n)
-	}
-	b.SetBytes(int64(n))
-	buf := bmbuf[0:n]
-	buf[n-1] = 'x'
-	for i := 0; i < b.N; i++ {
-		j := index(buf, buf[n-7:])
-		if j != n-7 {
-			b.Fatal("bad index", j)
-		}
-	}
-	buf[n-1] = '\x00'
-}
-
-func BenchmarkIndexEasy32(b *testing.B)  { bmIndexEasy(b, Index, 32) }
-func BenchmarkIndexEasy4K(b *testing.B)  { bmIndexEasy(b, Index, 4<<10) }
-func BenchmarkIndexEasy4M(b *testing.B)  { bmIndexEasy(b, Index, 4<<20) }
-func BenchmarkIndexEasy64M(b *testing.B) { bmIndexEasy(b, Index, 64<<20) }
-
-func bmIndexEasy(b *testing.B, index func([]byte, []byte) int, n int) {
-	if len(bmbuf) < n {
-		bmbuf = make([]byte, n)
-	}
-	b.SetBytes(int64(n))
-	buf := bmbuf[0:n]
-	buf[n-1] = 'x'
-	buf[n-7] = 'x'
-	for i := 0; i < b.N; i++ {
-		j := index(buf, buf[n-7:])
-		if j != n-7 {
-			b.Fatal("bad index", j)
-		}
-	}
-	buf[n-1] = '\x00'
-	buf[n-7] = '\x00'
-}
-
-func BenchmarkCount32(b *testing.B)  { bmCount(b, Count, 32) }
-func BenchmarkCount4K(b *testing.B)  { bmCount(b, Count, 4<<10) }
-func BenchmarkCount4M(b *testing.B)  { bmCount(b, Count, 4<<20) }
-func BenchmarkCount64M(b *testing.B) { bmCount(b, Count, 64<<20) }
-
-func bmCount(b *testing.B, count func([]byte, []byte) int, n int) {
-	if len(bmbuf) < n {
-		bmbuf = make([]byte, n)
-	}
-	b.SetBytes(int64(n))
-	buf := bmbuf[0:n]
-	buf[n-1] = 'x'
-	for i := 0; i < b.N; i++ {
-		j := count(buf, buf[n-7:])
-		if j != 1 {
-			b.Fatal("bad count", j)
-		}
-	}
-	buf[n-1] = '\x00'
-}
-
-func BenchmarkCountEasy32(b *testing.B)  { bmCountEasy(b, Count, 32) }
-func BenchmarkCountEasy4K(b *testing.B)  { bmCountEasy(b, Count, 4<<10) }
-func BenchmarkCountEasy4M(b *testing.B)  { bmCountEasy(b, Count, 4<<20) }
-func BenchmarkCountEasy64M(b *testing.B) { bmCountEasy(b, Count, 64<<20) }
-
-func bmCountEasy(b *testing.B, count func([]byte, []byte) int, n int) {
-	if len(bmbuf) < n {
-		bmbuf = make([]byte, n)
-	}
-	b.SetBytes(int64(n))
-	buf := bmbuf[0:n]
-	buf[n-1] = 'x'
-	buf[n-7] = 'x'
-	for i := 0; i < b.N; i++ {
-		j := count(buf, buf[n-7:])
-		if j != 1 {
-			b.Fatal("bad count", j)
-		}
-	}
-	buf[n-1] = '\x00'
-	buf[n-7] = '\x00'
-}
-
-type ExplodeTest struct {
-	s string
-	n int
-	a []string
-}
-
-var explodetests = []ExplodeTest{
-	{"", -1, []string{}},
-	{abcd, -1, []string{"a", "b", "c", "d"}},
-	{faces, -1, []string{"☺", "☻", "☹"}},
-	{abcd, 2, []string{"a", "bcd"}},
-}
-
-func TestExplode(t *testing.T) {
-	for _, tt := range explodetests {
-		a := SplitN([]byte(tt.s), nil, tt.n)
-		result := sliceOfString(a)
-		if !eq(result, tt.a) {
-			t.Errorf(`Explode("%s", %d) = %v; want %v`, tt.s, tt.n, result, tt.a)
-			continue
-		}
-		s := Join(a, []byte{})
-		if string(s) != tt.s {
-			t.Errorf(`Join(Explode("%s", %d), "") = "%s"`, tt.s, tt.n, s)
-		}
-	}
-}
-
-type SplitTest struct {
-	s   string
-	sep string
-	n   int
-	a   []string
-}
-
-var splittests = []SplitTest{
-	{abcd, "a", 0, nil},
-	{abcd, "a", -1, []string{"", "bcd"}},
-	{abcd, "z", -1, []string{"abcd"}},
-	{abcd, "", -1, []string{"a", "b", "c", "d"}},
-	{commas, ",", -1, []string{"1", "2", "3", "4"}},
-	{dots, "...", -1, []string{"1", ".2", ".3", ".4"}},
-	{faces, "☹", -1, []string{"☺☻", ""}},
-	{faces, "~", -1, []string{faces}},
-	{faces, "", -1, []string{"☺", "☻", "☹"}},
-	{"1 2 3 4", " ", 3, []string{"1", "2", "3 4"}},
-	{"1 2", " ", 3, []string{"1", "2"}},
-	{"123", "", 2, []string{"1", "23"}},
-	{"123", "", 17, []string{"1", "2", "3"}},
-}
-
-func TestSplit(t *testing.T) {
-	for _, tt := range splittests {
-		a := SplitN([]byte(tt.s), []byte(tt.sep), tt.n)
-		result := sliceOfString(a)
-		if !eq(result, tt.a) {
-			t.Errorf(`Split(%q, %q, %d) = %v; want %v`, tt.s, tt.sep, tt.n, result, tt.a)
-			continue
-		}
-		if tt.n == 0 {
-			continue
-		}
-		s := Join(a, []byte(tt.sep))
-		if string(s) != tt.s {
-			t.Errorf(`Join(Split(%q, %q, %d), %q) = %q`, tt.s, tt.sep, tt.n, tt.sep, s)
-		}
-		if tt.n < 0 {
-			b := Split([]byte(tt.s), []byte(tt.sep))
-			if !reflect.DeepEqual(a, b) {
-				t.Errorf("Split disagrees withSplitN(%q, %q, %d) = %v; want %v", tt.s, tt.sep, tt.n, b, a)
-			}
-		}
-		if len(a) > 0 {
-			in, out := a[0], s
-			if cap(in) == cap(out) && &in[:1][0] == &out[:1][0] {
-				t.Errorf("Join(%#v, %q) didn't copy", a, tt.sep)
-			}
-		}
-	}
-}
-
-var splitaftertests = []SplitTest{
-	{abcd, "a", -1, []string{"a", "bcd"}},
-	{abcd, "z", -1, []string{"abcd"}},
-	{abcd, "", -1, []string{"a", "b", "c", "d"}},
-	{commas, ",", -1, []string{"1,", "2,", "3,", "4"}},
-	{dots, "...", -1, []string{"1...", ".2...", ".3...", ".4"}},
-	{faces, "☹", -1, []string{"☺☻☹", ""}},
-	{faces, "~", -1, []string{faces}},
-	{faces, "", -1, []string{"☺", "☻", "☹"}},
-	{"1 2 3 4", " ", 3, []string{"1 ", "2 ", "3 4"}},
-	{"1 2 3", " ", 3, []string{"1 ", "2 ", "3"}},
-	{"1 2", " ", 3, []string{"1 ", "2"}},
-	{"123", "", 2, []string{"1", "23"}},
-	{"123", "", 17, []string{"1", "2", "3"}},
-}
-
-func TestSplitAfter(t *testing.T) {
-	for _, tt := range splitaftertests {
-		a := SplitAfterN([]byte(tt.s), []byte(tt.sep), tt.n)
-		result := sliceOfString(a)
-		if !eq(result, tt.a) {
-			t.Errorf(`Split(%q, %q, %d) = %v; want %v`, tt.s, tt.sep, tt.n, result, tt.a)
-			continue
-		}
-		s := Join(a, nil)
-		if string(s) != tt.s {
-			t.Errorf(`Join(Split(%q, %q, %d), %q) = %q`, tt.s, tt.sep, tt.n, tt.sep, s)
-		}
-		if tt.n < 0 {
-			b := SplitAfter([]byte(tt.s), []byte(tt.sep))
-			if !reflect.DeepEqual(a, b) {
-				t.Errorf("SplitAfter disagrees withSplitAfterN(%q, %q, %d) = %v; want %v", tt.s, tt.sep, tt.n, b, a)
-			}
-		}
-	}
-}
-
-type FieldsTest struct {
-	s string
-	a []string
-}
-
-var fieldstests = []FieldsTest{
-	{"", []string{}},
-	{" ", []string{}},
-	{" \t ", []string{}},
-	{"  abc  ", []string{"abc"}},
-	{"1 2 3 4", []string{"1", "2", "3", "4"}},
-	{"1  2  3  4", []string{"1", "2", "3", "4"}},
-	{"1\t\t2\t\t3\t4", []string{"1", "2", "3", "4"}},
-	{"1\u20002\u20013\u20024", []string{"1", "2", "3", "4"}},
-	{"\u2000\u2001\u2002", []string{}},
-	{"\n™\t™\n", []string{"™", "™"}},
-	{faces, []string{faces}},
-}
-
-func TestFields(t *testing.T) {
-	for _, tt := range fieldstests {
-		a := Fields([]byte(tt.s))
-		result := sliceOfString(a)
-		if !eq(result, tt.a) {
-			t.Errorf("Fields(%q) = %v; want %v", tt.s, a, tt.a)
-			continue
-		}
-	}
-}
-
-func TestFieldsFunc(t *testing.T) {
-	for _, tt := range fieldstests {
-		a := FieldsFunc([]byte(tt.s), unicode.IsSpace)
-		result := sliceOfString(a)
-		if !eq(result, tt.a) {
-			t.Errorf("FieldsFunc(%q, unicode.IsSpace) = %v; want %v", tt.s, a, tt.a)
-			continue
-		}
-	}
-	pred := func(c rune) bool { return c == 'X' }
-	var fieldsFuncTests = []FieldsTest{
-		{"", []string{}},
-		{"XX", []string{}},
-		{"XXhiXXX", []string{"hi"}},
-		{"aXXbXXXcX", []string{"a", "b", "c"}},
-	}
-	for _, tt := range fieldsFuncTests {
-		a := FieldsFunc([]byte(tt.s), pred)
-		result := sliceOfString(a)
-		if !eq(result, tt.a) {
-			t.Errorf("FieldsFunc(%q) = %v, want %v", tt.s, a, tt.a)
-		}
-	}
-}
-
-// Test case for any function which accepts and returns a byte slice.
-// For ease of creation, we write the byte slices as strings.
-type StringTest struct {
-	in, out string
-}
-
-var upperTests = []StringTest{
-	{"", ""},
-	{"abc", "ABC"},
-	{"AbC123", "ABC123"},
-	{"azAZ09_", "AZAZ09_"},
-	{"\u0250\u0250\u0250\u0250\u0250", "\u2C6F\u2C6F\u2C6F\u2C6F\u2C6F"}, // grows one byte per char
-}
-
-var lowerTests = []StringTest{
-	{"", ""},
-	{"abc", "abc"},
-	{"AbC123", "abc123"},
-	{"azAZ09_", "azaz09_"},
-	{"\u2C6D\u2C6D\u2C6D\u2C6D\u2C6D", "\u0251\u0251\u0251\u0251\u0251"}, // shrinks one byte per char
-}
-
-const space = "\t\v\r\f\n\u0085\u00a0\u2000\u3000"
-
-var trimSpaceTests = []StringTest{
-	{"", ""},
-	{"abc", "abc"},
-	{space + "abc" + space, "abc"},
-	{" ", ""},
-	{" \t\r\n \t\t\r\r\n\n ", ""},
-	{" \t\r\n x\t\t\r\r\n\n ", "x"},
-	{" \u2000\t\r\n x\t\t\r\r\ny\n \u3000", "x\t\t\r\r\ny"},
-	{"1 \t\r\n2", "1 \t\r\n2"},
-	{" x\x80", "x\x80"},
-	{" x\xc0", "x\xc0"},
-	{"x \xc0\xc0 ", "x \xc0\xc0"},
-	{"x \xc0", "x \xc0"},
-	{"x \xc0 ", "x \xc0"},
-	{"x \xc0\xc0 ", "x \xc0\xc0"},
-	{"x ☺\xc0\xc0 ", "x ☺\xc0\xc0"},
-	{"x ☺ ", "x ☺"},
-}
-
-// Execute f on each test case.  funcName should be the name of f; it's used
-// in failure reports.
-func runStringTests(t *testing.T, f func([]byte) []byte, funcName string, testCases []StringTest) {
-	for _, tc := range testCases {
-		actual := string(f([]byte(tc.in)))
-		if actual != tc.out {
-			t.Errorf("%s(%q) = %q; want %q", funcName, tc.in, actual, tc.out)
-		}
-	}
-}
-
-func tenRunes(r rune) string {
-	runes := make([]rune, 10)
-	for i := range runes {
-		runes[i] = r
-	}
-	return string(runes)
-}
-
-// User-defined self-inverse mapping function
-func rot13(r rune) rune {
-	const step = 13
-	if r >= 'a' && r <= 'z' {
-		return ((r - 'a' + step) % 26) + 'a'
-	}
-	if r >= 'A' && r <= 'Z' {
-		return ((r - 'A' + step) % 26) + 'A'
-	}
-	return r
-}
-
-func TestMap(t *testing.T) {
-	// Run a couple of awful growth/shrinkage tests
-	a := tenRunes('a')
-
-	// 1.  Grow.  This triggers two reallocations in Map.
-	maxRune := func(r rune) rune { return unicode.MaxRune }
-	m := Map(maxRune, []byte(a))
-	expect := tenRunes(unicode.MaxRune)
-	if string(m) != expect {
-		t.Errorf("growing: expected %q got %q", expect, m)
-	}
-
-	// 2. Shrink
-	minRune := func(r rune) rune { return 'a' }
-	m = Map(minRune, []byte(tenRunes(unicode.MaxRune)))
-	expect = a
-	if string(m) != expect {
-		t.Errorf("shrinking: expected %q got %q", expect, m)
-	}
-
-	// 3. Rot13
-	m = Map(rot13, []byte("a to zed"))
-	expect = "n gb mrq"
-	if string(m) != expect {
-		t.Errorf("rot13: expected %q got %q", expect, m)
-	}
-
-	// 4. Rot13^2
-	m = Map(rot13, Map(rot13, []byte("a to zed")))
-	expect = "a to zed"
-	if string(m) != expect {
-		t.Errorf("rot13: expected %q got %q", expect, m)
-	}
-
-	// 5. Drop
-	dropNotLatin := func(r rune) rune {
-		if unicode.Is(unicode.Latin, r) {
-			return r
-		}
-		return -1
-	}
-	m = Map(dropNotLatin, []byte("Hello, 세계"))
-	expect = "Hello"
-	if string(m) != expect {
-		t.Errorf("drop: expected %q got %q", expect, m)
-	}
-
-	// 6. Invalid rune
-	invalidRune := func(r rune) rune {
-		return utf8.MaxRune + 1
-	}
-	m = Map(invalidRune, []byte("x"))
-	expect = "\uFFFD"
-	if string(m) != expect {
-		t.Errorf("invalidRune: expected %q got %q", expect, m)
-	}
-}
-
-func TestToUpper(t *testing.T) { runStringTests(t, ToUpper, "ToUpper", upperTests) }
-
-func TestToLower(t *testing.T) { runStringTests(t, ToLower, "ToLower", lowerTests) }
-
-func TestTrimSpace(t *testing.T) { runStringTests(t, TrimSpace, "TrimSpace", trimSpaceTests) }
-
-type RepeatTest struct {
-	in, out string
-	count   int
-}
-
-var RepeatTests = []RepeatTest{
-	{"", "", 0},
-	{"", "", 1},
-	{"", "", 2},
-	{"-", "", 0},
-	{"-", "-", 1},
-	{"-", "----------", 10},
-	{"abc ", "abc abc abc ", 3},
-}
-
-func TestRepeat(t *testing.T) {
-	for _, tt := range RepeatTests {
-		tin := []byte(tt.in)
-		tout := []byte(tt.out)
-		a := Repeat(tin, tt.count)
-		if !Equal(a, tout) {
-			t.Errorf("Repeat(%q, %d) = %q; want %q", tin, tt.count, a, tout)
-			continue
-		}
-	}
-}
-
-func runesEqual(a, b []rune) bool {
-	if len(a) != len(b) {
-		return false
-	}
-	for i, r := range a {
-		if r != b[i] {
-			return false
-		}
-	}
-	return true
-}
-
-type RunesTest struct {
-	in    string
-	out   []rune
-	lossy bool
-}
-
-var RunesTests = []RunesTest{
-	{"", []rune{}, false},
-	{" ", []rune{32}, false},
-	{"ABC", []rune{65, 66, 67}, false},
-	{"abc", []rune{97, 98, 99}, false},
-	{"\u65e5\u672c\u8a9e", []rune{26085, 26412, 35486}, false},
-	{"ab\x80c", []rune{97, 98, 0xFFFD, 99}, true},
-	{"ab\xc0c", []rune{97, 98, 0xFFFD, 99}, true},
-}
-
-func TestRunes(t *testing.T) {
-	for _, tt := range RunesTests {
-		tin := []byte(tt.in)
-		a := Runes(tin)
-		if !runesEqual(a, tt.out) {
-			t.Errorf("Runes(%q) = %v; want %v", tin, a, tt.out)
-			continue
-		}
-		if !tt.lossy {
-			// can only test reassembly if we didn't lose information
-			s := string(a)
-			if s != tt.in {
-				t.Errorf("string(Runes(%q)) = %x; want %x", tin, s, tin)
-			}
-		}
-	}
-}
-
-type TrimTest struct {
-	f            string
-	in, arg, out string
-}
-
-var trimTests = []TrimTest{
-	{"Trim", "abba", "a", "bb"},
-	{"Trim", "abba", "ab", ""},
-	{"TrimLeft", "abba", "ab", ""},
-	{"TrimRight", "abba", "ab", ""},
-	{"TrimLeft", "abba", "a", "bba"},
-	{"TrimRight", "abba", "a", "abb"},
-	{"Trim", "<tag>", "<>", "tag"},
-	{"Trim", "* listitem", " *", "listitem"},
-	{"Trim", `"quote"`, `"`, "quote"},
-	{"Trim", "\u2C6F\u2C6F\u0250\u0250\u2C6F\u2C6F", "\u2C6F", "\u0250\u0250"},
-	//empty string tests
-	{"Trim", "abba", "", "abba"},
-	{"Trim", "", "123", ""},
-	{"Trim", "", "", ""},
-	{"TrimLeft", "abba", "", "abba"},
-	{"TrimLeft", "", "123", ""},
-	{"TrimLeft", "", "", ""},
-	{"TrimRight", "abba", "", "abba"},
-	{"TrimRight", "", "123", ""},
-	{"TrimRight", "", "", ""},
-	{"TrimRight", "☺\xc0", "☺", "☺\xc0"},
-	{"TrimPrefix", "aabb", "a", "abb"},
-	{"TrimPrefix", "aabb", "b", "aabb"},
-	{"TrimSuffix", "aabb", "a", "aabb"},
-	{"TrimSuffix", "aabb", "b", "aab"},
-}
-
-func TestTrim(t *testing.T) {
-	for _, tc := range trimTests {
-		name := tc.f
-		var f func([]byte, string) []byte
-		var fb func([]byte, []byte) []byte
-		switch name {
-		case "Trim":
-			f = Trim
-		case "TrimLeft":
-			f = TrimLeft
-		case "TrimRight":
-			f = TrimRight
-		case "TrimPrefix":
-			fb = TrimPrefix
-		case "TrimSuffix":
-			fb = TrimSuffix
-		default:
-			t.Errorf("Undefined trim function %s", name)
-		}
-		var actual string
-		if f != nil {
-			actual = string(f([]byte(tc.in), tc.arg))
-		} else {
-			actual = string(fb([]byte(tc.in), []byte(tc.arg)))
-		}
-		if actual != tc.out {
-			t.Errorf("%s(%q, %q) = %q; want %q", name, tc.in, tc.arg, actual, tc.out)
-		}
-	}
-}
-
-type predicate struct {
-	f    func(r rune) bool
-	name string
-}
-
-var isSpace = predicate{unicode.IsSpace, "IsSpace"}
-var isDigit = predicate{unicode.IsDigit, "IsDigit"}
-var isUpper = predicate{unicode.IsUpper, "IsUpper"}
-var isValidRune = predicate{
-	func(r rune) bool {
-		return r != utf8.RuneError
-	},
-	"IsValidRune",
-}
-
-type TrimFuncTest struct {
-	f       predicate
-	in, out string
-}
-
-func not(p predicate) predicate {
-	return predicate{
-		func(r rune) bool {
-			return !p.f(r)
-		},
-		"not " + p.name,
-	}
-}
-
-var trimFuncTests = []TrimFuncTest{
-	{isSpace, space + " hello " + space, "hello"},
-	{isDigit, "\u0e50\u0e5212hello34\u0e50\u0e51", "hello"},
-	{isUpper, "\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F", "hello"},
-	{not(isSpace), "hello" + space + "hello", space},
-	{not(isDigit), "hello\u0e50\u0e521234\u0e50\u0e51helo", "\u0e50\u0e521234\u0e50\u0e51"},
-	{isValidRune, "ab\xc0a\xc0cd", "\xc0a\xc0"},
-	{not(isValidRune), "\xc0a\xc0", "a"},
-}
-
-func TestTrimFunc(t *testing.T) {
-	for _, tc := range trimFuncTests {
-		actual := string(TrimFunc([]byte(tc.in), tc.f.f))
-		if actual != tc.out {
-			t.Errorf("TrimFunc(%q, %q) = %q; want %q", tc.in, tc.f.name, actual, tc.out)
-		}
-	}
-}
-
-type IndexFuncTest struct {
-	in          string
-	f           predicate
-	first, last int
-}
-
-var indexFuncTests = []IndexFuncTest{
-	{"", isValidRune, -1, -1},
-	{"abc", isDigit, -1, -1},
-	{"0123", isDigit, 0, 3},
-	{"a1b", isDigit, 1, 1},
-	{space, isSpace, 0, len(space) - 3}, // last rune in space is 3 bytes
-	{"\u0e50\u0e5212hello34\u0e50\u0e51", isDigit, 0, 18},
-	{"\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F", isUpper, 0, 34},
-	{"12\u0e50\u0e52hello34\u0e50\u0e51", not(isDigit), 8, 12},
-
-	// tests of invalid UTF-8
-	{"\x801", isDigit, 1, 1},
-	{"\x80abc", isDigit, -1, -1},
-	{"\xc0a\xc0", isValidRune, 1, 1},
-	{"\xc0a\xc0", not(isValidRune), 0, 2},
-	{"\xc0☺\xc0", not(isValidRune), 0, 4},
-	{"\xc0☺\xc0\xc0", not(isValidRune), 0, 5},
-	{"ab\xc0a\xc0cd", not(isValidRune), 2, 4},
-	{"a\xe0\x80cd", not(isValidRune), 1, 2},
-}
-
-func TestIndexFunc(t *testing.T) {
-	for _, tc := range indexFuncTests {
-		first := IndexFunc([]byte(tc.in), tc.f.f)
-		if first != tc.first {
-			t.Errorf("IndexFunc(%q, %s) = %d; want %d", tc.in, tc.f.name, first, tc.first)
-		}
-		last := LastIndexFunc([]byte(tc.in), tc.f.f)
-		if last != tc.last {
-			t.Errorf("LastIndexFunc(%q, %s) = %d; want %d", tc.in, tc.f.name, last, tc.last)
-		}
-	}
-}
-
-type ReplaceTest struct {
-	in       string
-	old, new string
-	n        int
-	out      string
-}
-
-var ReplaceTests = []ReplaceTest{
-	{"hello", "l", "L", 0, "hello"},
-	{"hello", "l", "L", -1, "heLLo"},
-	{"hello", "x", "X", -1, "hello"},
-	{"", "x", "X", -1, ""},
-	{"radar", "r", "<r>", -1, "<r>ada<r>"},
-	{"", "", "<>", -1, "<>"},
-	{"banana", "a", "<>", -1, "b<>n<>n<>"},
-	{"banana", "a", "<>", 1, "b<>nana"},
-	{"banana", "a", "<>", 1000, "b<>n<>n<>"},
-	{"banana", "an", "<>", -1, "b<><>a"},
-	{"banana", "ana", "<>", -1, "b<>na"},
-	{"banana", "", "<>", -1, "<>b<>a<>n<>a<>n<>a<>"},
-	{"banana", "", "<>", 10, "<>b<>a<>n<>a<>n<>a<>"},
-	{"banana", "", "<>", 6, "<>b<>a<>n<>a<>n<>a"},
-	{"banana", "", "<>", 5, "<>b<>a<>n<>a<>na"},
-	{"banana", "", "<>", 1, "<>banana"},
-	{"banana", "a", "a", -1, "banana"},
-	{"banana", "a", "a", 1, "banana"},
-	{"☺☻☹", "", "<>", -1, "<>☺<>☻<>☹<>"},
-}
-
-func TestReplace(t *testing.T) {
-	for _, tt := range ReplaceTests {
-		in := append([]byte(tt.in), "<spare>"...)
-		in = in[:len(tt.in)]
-		out := Replace(in, []byte(tt.old), []byte(tt.new), tt.n)
-		if s := string(out); s != tt.out {
-			t.Errorf("Replace(%q, %q, %q, %d) = %q, want %q", tt.in, tt.old, tt.new, tt.n, s, tt.out)
-		}
-		if cap(in) == cap(out) && &in[:1][0] == &out[:1][0] {
-			t.Errorf("Replace(%q, %q, %q, %d) didn't copy", tt.in, tt.old, tt.new, tt.n)
-		}
-	}
-}
-
-type TitleTest struct {
-	in, out string
-}
-
-var TitleTests = []TitleTest{
-	{"", ""},
-	{"a", "A"},
-	{" aaa aaa aaa ", " Aaa Aaa Aaa "},
-	{" Aaa Aaa Aaa ", " Aaa Aaa Aaa "},
-	{"123a456", "123a456"},
-	{"double-blind", "Double-Blind"},
-	{"ÿøû", "Ÿøû"},
-	{"with_underscore", "With_underscore"},
-	{"unicode \xe2\x80\xa8 line separator", "Unicode \xe2\x80\xa8 Line Separator"},
-}
-
-func TestTitle(t *testing.T) {
-	for _, tt := range TitleTests {
-		if s := string(Title([]byte(tt.in))); s != tt.out {
-			t.Errorf("Title(%q) = %q, want %q", tt.in, s, tt.out)
-		}
-	}
-}
-
-var ToTitleTests = []TitleTest{
-	{"", ""},
-	{"a", "A"},
-	{" aaa aaa aaa ", " AAA AAA AAA "},
-	{" Aaa Aaa Aaa ", " AAA AAA AAA "},
-	{"123a456", "123A456"},
-	{"double-blind", "DOUBLE-BLIND"},
-	{"ÿøû", "ŸØÛ"},
-}
-
-func TestToTitle(t *testing.T) {
-	for _, tt := range ToTitleTests {
-		if s := string(ToTitle([]byte(tt.in))); s != tt.out {
-			t.Errorf("ToTitle(%q) = %q, want %q", tt.in, s, tt.out)
-		}
-	}
-}
-
-var EqualFoldTests = []struct {
-	s, t string
-	out  bool
-}{
-	{"abc", "abc", true},
-	{"ABcd", "ABcd", true},
-	{"123abc", "123ABC", true},
-	{"αβδ", "ΑΒΔ", true},
-	{"abc", "xyz", false},
-	{"abc", "XYZ", false},
-	{"abcdefghijk", "abcdefghijX", false},
-	{"abcdefghijk", "abcdefghij\u212A", true},
-	{"abcdefghijK", "abcdefghij\u212A", true},
-	{"abcdefghijkz", "abcdefghij\u212Ay", false},
-	{"abcdefghijKz", "abcdefghij\u212Ay", false},
-}
-
-func TestEqualFold(t *testing.T) {
-	for _, tt := range EqualFoldTests {
-		if out := EqualFold([]byte(tt.s), []byte(tt.t)); out != tt.out {
-			t.Errorf("EqualFold(%#q, %#q) = %v, want %v", tt.s, tt.t, out, tt.out)
-		}
-		if out := EqualFold([]byte(tt.t), []byte(tt.s)); out != tt.out {
-			t.Errorf("EqualFold(%#q, %#q) = %v, want %v", tt.t, tt.s, out, tt.out)
-		}
-	}
-}
-
-func TestBufferGrowNegative(t *testing.T) {
-	defer func() {
-		if err := recover(); err == nil {
-			t.Fatal("Grow(-1) should have panicked")
-		}
-	}()
-	var b Buffer
-	b.Grow(-1)
-}
-
-func TestBufferTruncateNegative(t *testing.T) {
-	defer func() {
-		if err := recover(); err == nil {
-			t.Fatal("Truncate(-1) should have panicked")
-		}
-	}()
-	var b Buffer
-	b.Truncate(-1)
-}
-
-func TestBufferTruncateOutOfRange(t *testing.T) {
-	defer func() {
-		if err := recover(); err == nil {
-			t.Fatal("Truncate(20) should have panicked")
-		}
-	}()
-	var b Buffer
-	b.Write(make([]byte, 10))
-	b.Truncate(20)
-}
-
-var containsTests = []struct {
-	b, subslice []byte
-	want        bool
-}{
-	{[]byte("hello"), []byte("hel"), true},
-	{[]byte("日本語"), []byte("日本"), true},
-	{[]byte("hello"), []byte("Hello, world"), false},
-	{[]byte("東京"), []byte("京東"), false},
-}
-
-func TestContains(t *testing.T) {
-	for _, tt := range containsTests {
-		if got := Contains(tt.b, tt.subslice); got != tt.want {
-			t.Errorf("Contains(%q, %q) = %v, want %v", tt.b, tt.subslice, got, tt.want)
-		}
-	}
-}
-
-var makeFieldsInput = func() []byte {
-	x := make([]byte, 1<<20)
-	// Input is ~10% space, ~10% 2-byte UTF-8, rest ASCII non-space.
-	for i := range x {
-		switch rand.Intn(10) {
-		case 0:
-			x[i] = ' '
-		case 1:
-			if i > 0 && x[i-1] == 'x' {
-				copy(x[i-1:], "χ")
-				break
-			}
-			fallthrough
-		default:
-			x[i] = 'x'
-		}
-	}
-	return x
-}
-
-var fieldsInput = makeFieldsInput()
-
-func BenchmarkFields(b *testing.B) {
-	b.SetBytes(int64(len(fieldsInput)))
-	for i := 0; i < b.N; i++ {
-		Fields(fieldsInput)
-	}
-}
-
-func BenchmarkFieldsFunc(b *testing.B) {
-	b.SetBytes(int64(len(fieldsInput)))
-	for i := 0; i < b.N; i++ {
-		FieldsFunc(fieldsInput, unicode.IsSpace)
-	}
-}
-
-func BenchmarkTrimSpace(b *testing.B) {
-	s := []byte("  Some text.  \n")
-	for i := 0; i < b.N; i++ {
-		TrimSpace(s)
-	}
-}
-
-func BenchmarkRepeat(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Repeat([]byte("-"), 80)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/bytes/compare_test.go b/third_party/gofrontend/libgo/go/bytes/compare_test.go
deleted file mode 100644
index f2d81d5..0000000
--- a/third_party/gofrontend/libgo/go/bytes/compare_test.go
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bytes_test
-
-import (
-	. "bytes"
-	"testing"
-)
-
-var compareTests = []struct {
-	a, b []byte
-	i    int
-}{
-	{[]byte(""), []byte(""), 0},
-	{[]byte("a"), []byte(""), 1},
-	{[]byte(""), []byte("a"), -1},
-	{[]byte("abc"), []byte("abc"), 0},
-	{[]byte("abd"), []byte("abc"), 1},
-	{[]byte("abc"), []byte("abd"), -1},
-	{[]byte("ab"), []byte("abc"), -1},
-	{[]byte("abc"), []byte("ab"), 1},
-	{[]byte("x"), []byte("ab"), 1},
-	{[]byte("ab"), []byte("x"), -1},
-	{[]byte("x"), []byte("a"), 1},
-	{[]byte("b"), []byte("x"), -1},
-	// test runtime·memeq's chunked implementation
-	{[]byte("abcdefgh"), []byte("abcdefgh"), 0},
-	{[]byte("abcdefghi"), []byte("abcdefghi"), 0},
-	{[]byte("abcdefghi"), []byte("abcdefghj"), -1},
-	{[]byte("abcdefghj"), []byte("abcdefghi"), 1},
-	// nil tests
-	{nil, nil, 0},
-	{[]byte(""), nil, 0},
-	{nil, []byte(""), 0},
-	{[]byte("a"), nil, 1},
-	{nil, []byte("a"), -1},
-}
-
-func TestCompare(t *testing.T) {
-	for _, tt := range compareTests {
-		cmp := Compare(tt.a, tt.b)
-		if cmp != tt.i {
-			t.Errorf(`Compare(%q, %q) = %v`, tt.a, tt.b, cmp)
-		}
-	}
-}
-
-func TestCompareIdenticalSlice(t *testing.T) {
-	var b = []byte("Hello Gophers!")
-	if Compare(b, b) != 0 {
-		t.Error("b != b")
-	}
-	if Compare(b, b[:1]) != 1 {
-		t.Error("b > b[:1] failed")
-	}
-}
-
-func TestCompareBytes(t *testing.T) {
-	n := 128
-	a := make([]byte, n+1)
-	b := make([]byte, n+1)
-	for len := 0; len < 128; len++ {
-		// randomish but deterministic data.  No 0 or 255.
-		for i := 0; i < len; i++ {
-			a[i] = byte(1 + 31*i%254)
-			b[i] = byte(1 + 31*i%254)
-		}
-		// data past the end is different
-		for i := len; i <= n; i++ {
-			a[i] = 8
-			b[i] = 9
-		}
-		cmp := Compare(a[:len], b[:len])
-		if cmp != 0 {
-			t.Errorf(`CompareIdentical(%d) = %d`, len, cmp)
-		}
-		if len > 0 {
-			cmp = Compare(a[:len-1], b[:len])
-			if cmp != -1 {
-				t.Errorf(`CompareAshorter(%d) = %d`, len, cmp)
-			}
-			cmp = Compare(a[:len], b[:len-1])
-			if cmp != 1 {
-				t.Errorf(`CompareBshorter(%d) = %d`, len, cmp)
-			}
-		}
-		for k := 0; k < len; k++ {
-			b[k] = a[k] - 1
-			cmp = Compare(a[:len], b[:len])
-			if cmp != 1 {
-				t.Errorf(`CompareAbigger(%d,%d) = %d`, len, k, cmp)
-			}
-			b[k] = a[k] + 1
-			cmp = Compare(a[:len], b[:len])
-			if cmp != -1 {
-				t.Errorf(`CompareBbigger(%d,%d) = %d`, len, k, cmp)
-			}
-			b[k] = a[k]
-		}
-	}
-}
-
-func BenchmarkCompareBytesEqual(b *testing.B) {
-	b1 := []byte("Hello Gophers!")
-	b2 := []byte("Hello Gophers!")
-	for i := 0; i < b.N; i++ {
-		if Compare(b1, b2) != 0 {
-			b.Fatal("b1 != b2")
-		}
-	}
-}
-
-func BenchmarkCompareBytesToNil(b *testing.B) {
-	b1 := []byte("Hello Gophers!")
-	var b2 []byte
-	for i := 0; i < b.N; i++ {
-		if Compare(b1, b2) != 1 {
-			b.Fatal("b1 > b2 failed")
-		}
-	}
-}
-
-func BenchmarkCompareBytesEmpty(b *testing.B) {
-	b1 := []byte("")
-	b2 := b1
-	for i := 0; i < b.N; i++ {
-		if Compare(b1, b2) != 0 {
-			b.Fatal("b1 != b2")
-		}
-	}
-}
-
-func BenchmarkCompareBytesIdentical(b *testing.B) {
-	b1 := []byte("Hello Gophers!")
-	b2 := b1
-	for i := 0; i < b.N; i++ {
-		if Compare(b1, b2) != 0 {
-			b.Fatal("b1 != b2")
-		}
-	}
-}
-
-func BenchmarkCompareBytesSameLength(b *testing.B) {
-	b1 := []byte("Hello Gophers!")
-	b2 := []byte("Hello, Gophers")
-	for i := 0; i < b.N; i++ {
-		if Compare(b1, b2) != -1 {
-			b.Fatal("b1 < b2 failed")
-		}
-	}
-}
-
-func BenchmarkCompareBytesDifferentLength(b *testing.B) {
-	b1 := []byte("Hello Gophers!")
-	b2 := []byte("Hello, Gophers!")
-	for i := 0; i < b.N; i++ {
-		if Compare(b1, b2) != -1 {
-			b.Fatal("b1 < b2 failed")
-		}
-	}
-}
-
-func BenchmarkCompareBytesBigUnaligned(b *testing.B) {
-	b.StopTimer()
-	b1 := make([]byte, 0, 1<<20)
-	for len(b1) < 1<<20 {
-		b1 = append(b1, "Hello Gophers!"...)
-	}
-	b2 := append([]byte("hello"), b1...)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		if Compare(b1, b2[len("hello"):]) != 0 {
-			b.Fatal("b1 != b2")
-		}
-	}
-	b.SetBytes(int64(len(b1)))
-}
-
-func BenchmarkCompareBytesBig(b *testing.B) {
-	b.StopTimer()
-	b1 := make([]byte, 0, 1<<20)
-	for len(b1) < 1<<20 {
-		b1 = append(b1, "Hello Gophers!"...)
-	}
-	b2 := append([]byte{}, b1...)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		if Compare(b1, b2) != 0 {
-			b.Fatal("b1 != b2")
-		}
-	}
-	b.SetBytes(int64(len(b1)))
-}
-
-func BenchmarkCompareBytesBigIdentical(b *testing.B) {
-	b.StopTimer()
-	b1 := make([]byte, 0, 1<<20)
-	for len(b1) < 1<<20 {
-		b1 = append(b1, "Hello Gophers!"...)
-	}
-	b2 := b1
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		if Compare(b1, b2) != 0 {
-			b.Fatal("b1 != b2")
-		}
-	}
-	b.SetBytes(int64(len(b1)))
-}
diff --git a/third_party/gofrontend/libgo/go/bytes/equal_test.go b/third_party/gofrontend/libgo/go/bytes/equal_test.go
deleted file mode 100644
index 1bf19a7..0000000
--- a/third_party/gofrontend/libgo/go/bytes/equal_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-//
-// +build linux
-
-package bytes_test
-
-import (
-	. "bytes"
-	"syscall"
-	"testing"
-	"unsafe"
-)
-
-// This file tests the situation where memeq is checking
-// data very near to a page boundary.  We want to make sure
-// equal does not read across the boundary and cause a page
-// fault where it shouldn't.
-
-// This test runs only on linux.  The code being tested is
-// not OS-specific, so it does not need to be tested on all
-// operating systems.
-
-func TestEqualNearPageBoundary(t *testing.T) {
-	pagesize := syscall.Getpagesize()
-	b := make([]byte, 4*pagesize)
-	i := pagesize
-	for ; uintptr(unsafe.Pointer(&b[i]))%uintptr(pagesize) != 0; i++ {
-	}
-	syscall.Mprotect(b[i-pagesize:i], 0)
-	syscall.Mprotect(b[i+pagesize:i+2*pagesize], 0)
-	defer syscall.Mprotect(b[i-pagesize:i], syscall.PROT_READ|syscall.PROT_WRITE)
-	defer syscall.Mprotect(b[i+pagesize:i+2*pagesize], syscall.PROT_READ|syscall.PROT_WRITE)
-
-	// both of these should fault
-	//pagesize += int(b[i-1])
-	//pagesize += int(b[i+pagesize])
-
-	for j := 0; j < pagesize; j++ {
-		b[i+j] = 'A'
-	}
-	for j := 0; j <= pagesize; j++ {
-		Equal(b[i:i+j], b[i+pagesize-j:i+pagesize])
-		Equal(b[i+pagesize-j:i+pagesize], b[i:i+j])
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/bytes/example_test.go b/third_party/gofrontend/libgo/go/bytes/example_test.go
deleted file mode 100644
index ad2dbc6..0000000
--- a/third_party/gofrontend/libgo/go/bytes/example_test.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bytes_test
-
-import (
-	"bytes"
-	"encoding/base64"
-	"fmt"
-	"io"
-	"os"
-	"sort"
-)
-
-func ExampleBuffer() {
-	var b bytes.Buffer // A Buffer needs no initialization.
-	b.Write([]byte("Hello "))
-	fmt.Fprintf(&b, "world!")
-	b.WriteTo(os.Stdout)
-	// Output: Hello world!
-}
-
-func ExampleBuffer_reader() {
-	// A Buffer can turn a string or a []byte into an io.Reader.
-	buf := bytes.NewBufferString("R29waGVycyBydWxlIQ==")
-	dec := base64.NewDecoder(base64.StdEncoding, buf)
-	io.Copy(os.Stdout, dec)
-	// Output: Gophers rule!
-}
-
-func ExampleCompare() {
-	// Interpret Compare's result by comparing it to zero.
-	var a, b []byte
-	if bytes.Compare(a, b) < 0 {
-		// a less b
-	}
-	if bytes.Compare(a, b) <= 0 {
-		// a less or equal b
-	}
-	if bytes.Compare(a, b) > 0 {
-		// a greater b
-	}
-	if bytes.Compare(a, b) >= 0 {
-		// a greater or equal b
-	}
-
-	// Prefer Equal to Compare for equality comparisons.
-	if bytes.Equal(a, b) {
-		// a equal b
-	}
-	if !bytes.Equal(a, b) {
-		// a not equal b
-	}
-}
-
-func ExampleCompare_search() {
-	// Binary search to find a matching byte slice.
-	var needle []byte
-	var haystack [][]byte // Assume sorted
-	i := sort.Search(len(haystack), func(i int) bool {
-		// Return haystack[i] >= needle.
-		return bytes.Compare(haystack[i], needle) >= 0
-	})
-	if i < len(haystack) && bytes.Equal(haystack[i], needle) {
-		// Found it!
-	}
-}
-
-func ExampleTrimSuffix() {
-	var b = []byte("Hello, goodbye, etc!")
-	b = bytes.TrimSuffix(b, []byte("goodbye, etc!"))
-	b = bytes.TrimSuffix(b, []byte("gopher"))
-	b = append(b, bytes.TrimSuffix([]byte("world!"), []byte("x!"))...)
-	os.Stdout.Write(b)
-	// Output: Hello, world!
-}
-
-func ExampleTrimPrefix() {
-	var b = []byte("Goodbye,, world!")
-	b = bytes.TrimPrefix(b, []byte("Goodbye,"))
-	b = bytes.TrimPrefix(b, []byte("See ya,"))
-	fmt.Printf("Hello%s", b)
-	// Output: Hello, world!
-}
diff --git a/third_party/gofrontend/libgo/go/bytes/export_test.go b/third_party/gofrontend/libgo/go/bytes/export_test.go
deleted file mode 100644
index f61523e..0000000
--- a/third_party/gofrontend/libgo/go/bytes/export_test.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bytes
-
-// Export func for testing
-var IndexBytePortable = indexBytePortable
-var EqualPortable = equalPortable
diff --git a/third_party/gofrontend/libgo/go/bytes/indexbyte.c b/third_party/gofrontend/libgo/go/bytes/indexbyte.c
deleted file mode 100644
index b248108..0000000
--- a/third_party/gofrontend/libgo/go/bytes/indexbyte.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/* indexbyte.c -- implement bytes.IndexByte for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-
-#include "runtime.h"
-#include "array.h"
-
-/* This is in C so that the compiler can optimize it appropriately.
-   We deliberately don't split the stack in case it does call the
-   library function, which shouldn't need much stack space.  */
-
-intgo IndexByte (struct __go_open_array, char)
-  __asm__ (GOSYM_PREFIX "bytes.IndexByte")
-  __attribute__ ((no_split_stack));
-
-intgo
-IndexByte (struct __go_open_array s, char b)
-{
-  char *p;
-
-  p = __builtin_memchr (s.__values, b, s.__count);
-  if (p == NULL)
-    return -1;
-  return p - (char *) s.__values;
-}
-
-/* Comparison.  */
-
-_Bool Equal (struct __go_open_array a, struct __go_open_array b)
-  __asm__ (GOSYM_PREFIX "bytes.Equal")
-  __attribute__ ((no_split_stack));
-
-_Bool
-Equal (struct __go_open_array a, struct __go_open_array b)
-{
-  if (a.__count != b.__count)
-    return 0;
-  return __builtin_memcmp (a.__values, b.__values, a.__count) == 0;
-}
-
-intgo Compare (struct __go_open_array a, struct __go_open_array b)
-  __asm__ (GOSYM_PREFIX "bytes.Compare")
-  __attribute__ ((no_split_stack));
-
-intgo
-Compare (struct __go_open_array a, struct __go_open_array b)
-{
-  intgo len;
-
-  len = a.__count;
-  if (len > b.__count)
-    len = b.__count;
-  if (len > 0)
-    {
-      intgo ret;
-
-      ret = __builtin_memcmp (a.__values, b.__values, len);
-      if (ret < 0)
-	return -1;
-      else if (ret > 0)
-	return 1;
-    }
-  if (a.__count < b.__count)
-    return -1;
-  else if (a.__count > b.__count)
-    return 1;
-  else
-    return 0;
-}
diff --git a/third_party/gofrontend/libgo/go/bytes/reader.go b/third_party/gofrontend/libgo/go/bytes/reader.go
deleted file mode 100644
index b89d154..0000000
--- a/third_party/gofrontend/libgo/go/bytes/reader.go
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bytes
-
-import (
-	"errors"
-	"io"
-	"unicode/utf8"
-)
-
-// A Reader implements the io.Reader, io.ReaderAt, io.WriterTo, io.Seeker,
-// io.ByteScanner, and io.RuneScanner interfaces by reading from
-// a byte slice.
-// Unlike a Buffer, a Reader is read-only and supports seeking.
-type Reader struct {
-	s        []byte
-	i        int64 // current reading index
-	prevRune int   // index of previous rune; or < 0
-}
-
-// Len returns the number of bytes of the unread portion of the
-// slice.
-func (r *Reader) Len() int {
-	if r.i >= int64(len(r.s)) {
-		return 0
-	}
-	return int(int64(len(r.s)) - r.i)
-}
-
-// Size returns the original length of the underlying byte slice.
-// Size is the number of bytes available for reading via ReadAt.
-// The returned value is always the same and is not affected by calls
-// to any other method.
-func (r *Reader) Size() int64 { return int64(len(r.s)) }
-
-func (r *Reader) Read(b []byte) (n int, err error) {
-	if len(b) == 0 {
-		return 0, nil
-	}
-	if r.i >= int64(len(r.s)) {
-		return 0, io.EOF
-	}
-	r.prevRune = -1
-	n = copy(b, r.s[r.i:])
-	r.i += int64(n)
-	return
-}
-
-func (r *Reader) ReadAt(b []byte, off int64) (n int, err error) {
-	// cannot modify state - see io.ReaderAt
-	if off < 0 {
-		return 0, errors.New("bytes.Reader.ReadAt: negative offset")
-	}
-	if off >= int64(len(r.s)) {
-		return 0, io.EOF
-	}
-	n = copy(b, r.s[off:])
-	if n < len(b) {
-		err = io.EOF
-	}
-	return
-}
-
-func (r *Reader) ReadByte() (b byte, err error) {
-	r.prevRune = -1
-	if r.i >= int64(len(r.s)) {
-		return 0, io.EOF
-	}
-	b = r.s[r.i]
-	r.i++
-	return
-}
-
-func (r *Reader) UnreadByte() error {
-	r.prevRune = -1
-	if r.i <= 0 {
-		return errors.New("bytes.Reader.UnreadByte: at beginning of slice")
-	}
-	r.i--
-	return nil
-}
-
-func (r *Reader) ReadRune() (ch rune, size int, err error) {
-	if r.i >= int64(len(r.s)) {
-		r.prevRune = -1
-		return 0, 0, io.EOF
-	}
-	r.prevRune = int(r.i)
-	if c := r.s[r.i]; c < utf8.RuneSelf {
-		r.i++
-		return rune(c), 1, nil
-	}
-	ch, size = utf8.DecodeRune(r.s[r.i:])
-	r.i += int64(size)
-	return
-}
-
-func (r *Reader) UnreadRune() error {
-	if r.prevRune < 0 {
-		return errors.New("bytes.Reader.UnreadRune: previous operation was not ReadRune")
-	}
-	r.i = int64(r.prevRune)
-	r.prevRune = -1
-	return nil
-}
-
-// Seek implements the io.Seeker interface.
-func (r *Reader) Seek(offset int64, whence int) (int64, error) {
-	r.prevRune = -1
-	var abs int64
-	switch whence {
-	case 0:
-		abs = offset
-	case 1:
-		abs = int64(r.i) + offset
-	case 2:
-		abs = int64(len(r.s)) + offset
-	default:
-		return 0, errors.New("bytes.Reader.Seek: invalid whence")
-	}
-	if abs < 0 {
-		return 0, errors.New("bytes.Reader.Seek: negative position")
-	}
-	r.i = abs
-	return abs, nil
-}
-
-// WriteTo implements the io.WriterTo interface.
-func (r *Reader) WriteTo(w io.Writer) (n int64, err error) {
-	r.prevRune = -1
-	if r.i >= int64(len(r.s)) {
-		return 0, nil
-	}
-	b := r.s[r.i:]
-	m, err := w.Write(b)
-	if m > len(b) {
-		panic("bytes.Reader.WriteTo: invalid Write count")
-	}
-	r.i += int64(m)
-	n = int64(m)
-	if m != len(b) && err == nil {
-		err = io.ErrShortWrite
-	}
-	return
-}
-
-// NewReader returns a new Reader reading from b.
-func NewReader(b []byte) *Reader { return &Reader{b, 0, -1} }
diff --git a/third_party/gofrontend/libgo/go/bytes/reader_test.go b/third_party/gofrontend/libgo/go/bytes/reader_test.go
deleted file mode 100644
index b929a28..0000000
--- a/third_party/gofrontend/libgo/go/bytes/reader_test.go
+++ /dev/null
@@ -1,258 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bytes_test
-
-import (
-	. "bytes"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"os"
-	"sync"
-	"testing"
-)
-
-func TestReader(t *testing.T) {
-	r := NewReader([]byte("0123456789"))
-	tests := []struct {
-		off     int64
-		seek    int
-		n       int
-		want    string
-		wantpos int64
-		seekerr string
-	}{
-		{seek: os.SEEK_SET, off: 0, n: 20, want: "0123456789"},
-		{seek: os.SEEK_SET, off: 1, n: 1, want: "1"},
-		{seek: os.SEEK_CUR, off: 1, wantpos: 3, n: 2, want: "34"},
-		{seek: os.SEEK_SET, off: -1, seekerr: "bytes.Reader.Seek: negative position"},
-		{seek: os.SEEK_SET, off: 1 << 33, wantpos: 1 << 33},
-		{seek: os.SEEK_CUR, off: 1, wantpos: 1<<33 + 1},
-		{seek: os.SEEK_SET, n: 5, want: "01234"},
-		{seek: os.SEEK_CUR, n: 5, want: "56789"},
-		{seek: os.SEEK_END, off: -1, n: 1, wantpos: 9, want: "9"},
-	}
-
-	for i, tt := range tests {
-		pos, err := r.Seek(tt.off, tt.seek)
-		if err == nil && tt.seekerr != "" {
-			t.Errorf("%d. want seek error %q", i, tt.seekerr)
-			continue
-		}
-		if err != nil && err.Error() != tt.seekerr {
-			t.Errorf("%d. seek error = %q; want %q", i, err.Error(), tt.seekerr)
-			continue
-		}
-		if tt.wantpos != 0 && tt.wantpos != pos {
-			t.Errorf("%d. pos = %d, want %d", i, pos, tt.wantpos)
-		}
-		buf := make([]byte, tt.n)
-		n, err := r.Read(buf)
-		if err != nil {
-			t.Errorf("%d. read = %v", i, err)
-			continue
-		}
-		got := string(buf[:n])
-		if got != tt.want {
-			t.Errorf("%d. got %q; want %q", i, got, tt.want)
-		}
-	}
-}
-
-func TestReadAfterBigSeek(t *testing.T) {
-	r := NewReader([]byte("0123456789"))
-	if _, err := r.Seek(1<<31+5, os.SEEK_SET); err != nil {
-		t.Fatal(err)
-	}
-	if n, err := r.Read(make([]byte, 10)); n != 0 || err != io.EOF {
-		t.Errorf("Read = %d, %v; want 0, EOF", n, err)
-	}
-}
-
-func TestReaderAt(t *testing.T) {
-	r := NewReader([]byte("0123456789"))
-	tests := []struct {
-		off     int64
-		n       int
-		want    string
-		wanterr interface{}
-	}{
-		{0, 10, "0123456789", nil},
-		{1, 10, "123456789", io.EOF},
-		{1, 9, "123456789", nil},
-		{11, 10, "", io.EOF},
-		{0, 0, "", nil},
-		{-1, 0, "", "bytes.Reader.ReadAt: negative offset"},
-	}
-	for i, tt := range tests {
-		b := make([]byte, tt.n)
-		rn, err := r.ReadAt(b, tt.off)
-		got := string(b[:rn])
-		if got != tt.want {
-			t.Errorf("%d. got %q; want %q", i, got, tt.want)
-		}
-		if fmt.Sprintf("%v", err) != fmt.Sprintf("%v", tt.wanterr) {
-			t.Errorf("%d. got error = %v; want %v", i, err, tt.wanterr)
-		}
-	}
-}
-
-func TestReaderAtConcurrent(t *testing.T) {
-	// Test for the race detector, to verify ReadAt doesn't mutate
-	// any state.
-	r := NewReader([]byte("0123456789"))
-	var wg sync.WaitGroup
-	for i := 0; i < 5; i++ {
-		wg.Add(1)
-		go func(i int) {
-			defer wg.Done()
-			var buf [1]byte
-			r.ReadAt(buf[:], int64(i))
-		}(i)
-	}
-	wg.Wait()
-}
-
-func TestEmptyReaderConcurrent(t *testing.T) {
-	// Test for the race detector, to verify a Read that doesn't yield any bytes
-	// is okay to use from multiple goroutines. This was our historic behavior.
-	// See golang.org/issue/7856
-	r := NewReader([]byte{})
-	var wg sync.WaitGroup
-	for i := 0; i < 5; i++ {
-		wg.Add(2)
-		go func() {
-			defer wg.Done()
-			var buf [1]byte
-			r.Read(buf[:])
-		}()
-		go func() {
-			defer wg.Done()
-			r.Read(nil)
-		}()
-	}
-	wg.Wait()
-}
-
-func TestReaderWriteTo(t *testing.T) {
-	for i := 0; i < 30; i += 3 {
-		var l int
-		if i > 0 {
-			l = len(data) / i
-		}
-		s := data[:l]
-		r := NewReader(testBytes[:l])
-		var b Buffer
-		n, err := r.WriteTo(&b)
-		if expect := int64(len(s)); n != expect {
-			t.Errorf("got %v; want %v", n, expect)
-		}
-		if err != nil {
-			t.Errorf("for length %d: got error = %v; want nil", l, err)
-		}
-		if b.String() != s {
-			t.Errorf("got string %q; want %q", b.String(), s)
-		}
-		if r.Len() != 0 {
-			t.Errorf("reader contains %v bytes; want 0", r.Len())
-		}
-	}
-}
-
-func TestReaderLen(t *testing.T) {
-	const data = "hello world"
-	r := NewReader([]byte(data))
-	if got, want := r.Len(), 11; got != want {
-		t.Errorf("r.Len(): got %d, want %d", got, want)
-	}
-	if n, err := r.Read(make([]byte, 10)); err != nil || n != 10 {
-		t.Errorf("Read failed: read %d %v", n, err)
-	}
-	if got, want := r.Len(), 1; got != want {
-		t.Errorf("r.Len(): got %d, want %d", got, want)
-	}
-	if n, err := r.Read(make([]byte, 1)); err != nil || n != 1 {
-		t.Errorf("Read failed: read %d %v", n, err)
-	}
-	if got, want := r.Len(), 0; got != want {
-		t.Errorf("r.Len(): got %d, want %d", got, want)
-	}
-}
-
-var UnreadRuneErrorTests = []struct {
-	name string
-	f    func(*Reader)
-}{
-	{"Read", func(r *Reader) { r.Read([]byte{0}) }},
-	{"ReadByte", func(r *Reader) { r.ReadByte() }},
-	{"UnreadRune", func(r *Reader) { r.UnreadRune() }},
-	{"Seek", func(r *Reader) { r.Seek(0, 1) }},
-	{"WriteTo", func(r *Reader) { r.WriteTo(&Buffer{}) }},
-}
-
-func TestUnreadRuneError(t *testing.T) {
-	for _, tt := range UnreadRuneErrorTests {
-		reader := NewReader([]byte("0123456789"))
-		if _, _, err := reader.ReadRune(); err != nil {
-			// should not happen
-			t.Fatal(err)
-		}
-		tt.f(reader)
-		err := reader.UnreadRune()
-		if err == nil {
-			t.Errorf("Unreading after %s: expected error", tt.name)
-		}
-	}
-}
-
-func TestReaderDoubleUnreadRune(t *testing.T) {
-	buf := NewBuffer([]byte("groucho"))
-	if _, _, err := buf.ReadRune(); err != nil {
-		// should not happen
-		t.Fatal(err)
-	}
-	if err := buf.UnreadByte(); err != nil {
-		// should not happen
-		t.Fatal(err)
-	}
-	if err := buf.UnreadByte(); err == nil {
-		t.Fatal("UnreadByte: expected error, got nil")
-	}
-}
-
-// verify that copying from an empty reader always has the same results,
-// regardless of the presence of a WriteTo method.
-func TestReaderCopyNothing(t *testing.T) {
-	type nErr struct {
-		n   int64
-		err error
-	}
-	type justReader struct {
-		io.Reader
-	}
-	type justWriter struct {
-		io.Writer
-	}
-	discard := justWriter{ioutil.Discard} // hide ReadFrom
-
-	var with, withOut nErr
-	with.n, with.err = io.Copy(discard, NewReader(nil))
-	withOut.n, withOut.err = io.Copy(discard, justReader{NewReader(nil)})
-	if with != withOut {
-		t.Errorf("behavior differs: with = %#v; without: %#v", with, withOut)
-	}
-}
-
-// tests that Len is affected by reads, but Size is not.
-func TestReaderLenSize(t *testing.T) {
-	r := NewReader([]byte("abc"))
-	io.CopyN(ioutil.Discard, r, 1)
-	if r.Len() != 2 {
-		t.Errorf("Len = %d; want 2", r.Len())
-	}
-	if r.Size() != 3 {
-		t.Errorf("Size = %d; want 3", r.Size())
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/cgo/ast.go b/third_party/gofrontend/libgo/go/cmd/cgo/ast.go
deleted file mode 100644
index 8bbd1cc..0000000
--- a/third_party/gofrontend/libgo/go/cmd/cgo/ast.go
+++ /dev/null
@@ -1,471 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Parse input AST and prepare Prog structure.
-
-package main
-
-import (
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/scanner"
-	"go/token"
-	"os"
-	"path/filepath"
-	"strings"
-)
-
-func parse(name string, flags parser.Mode) *ast.File {
-	ast1, err := parser.ParseFile(fset, name, nil, flags)
-	if err != nil {
-		if list, ok := err.(scanner.ErrorList); ok {
-			// If err is a scanner.ErrorList, its String will print just
-			// the first error and then (+n more errors).
-			// Instead, turn it into a new Error that will return
-			// details for all the errors.
-			for _, e := range list {
-				fmt.Fprintln(os.Stderr, e)
-			}
-			os.Exit(2)
-		}
-		fatalf("parsing %s: %s", name, err)
-	}
-	return ast1
-}
-
-func sourceLine(n ast.Node) int {
-	return fset.Position(n.Pos()).Line
-}
-
-// ReadGo populates f with information learned from reading the
-// Go source file with the given file name.  It gathers the C preamble
-// attached to the import "C" comment, a list of references to C.xxx,
-// a list of exported functions, and the actual AST, to be rewritten and
-// printed.
-func (f *File) ReadGo(name string) {
-	// Create absolute path for file, so that it will be used in error
-	// messages and recorded in debug line number information.
-	// This matches the rest of the toolchain. See golang.org/issue/5122.
-	if aname, err := filepath.Abs(name); err == nil {
-		name = aname
-	}
-
-	// Two different parses: once with comments, once without.
-	// The printer is not good enough at printing comments in the
-	// right place when we start editing the AST behind its back,
-	// so we use ast1 to look for the doc comments on import "C"
-	// and on exported functions, and we use ast2 for translating
-	// and reprinting.
-	ast1 := parse(name, parser.ParseComments)
-	ast2 := parse(name, 0)
-
-	f.Package = ast1.Name.Name
-	f.Name = make(map[string]*Name)
-
-	// In ast1, find the import "C" line and get any extra C preamble.
-	sawC := false
-	for _, decl := range ast1.Decls {
-		d, ok := decl.(*ast.GenDecl)
-		if !ok {
-			continue
-		}
-		for _, spec := range d.Specs {
-			s, ok := spec.(*ast.ImportSpec)
-			if !ok || string(s.Path.Value) != `"C"` {
-				continue
-			}
-			sawC = true
-			if s.Name != nil {
-				error_(s.Path.Pos(), `cannot rename import "C"`)
-			}
-			cg := s.Doc
-			if cg == nil && len(d.Specs) == 1 {
-				cg = d.Doc
-			}
-			if cg != nil {
-				f.Preamble += fmt.Sprintf("#line %d %q\n", sourceLine(cg), name)
-				f.Preamble += commentText(cg) + "\n"
-			}
-		}
-	}
-	if !sawC {
-		error_(token.NoPos, `cannot find import "C"`)
-	}
-
-	// In ast2, strip the import "C" line.
-	w := 0
-	for _, decl := range ast2.Decls {
-		d, ok := decl.(*ast.GenDecl)
-		if !ok {
-			ast2.Decls[w] = decl
-			w++
-			continue
-		}
-		ws := 0
-		for _, spec := range d.Specs {
-			s, ok := spec.(*ast.ImportSpec)
-			if !ok || string(s.Path.Value) != `"C"` {
-				d.Specs[ws] = spec
-				ws++
-			}
-		}
-		if ws == 0 {
-			continue
-		}
-		d.Specs = d.Specs[0:ws]
-		ast2.Decls[w] = d
-		w++
-	}
-	ast2.Decls = ast2.Decls[0:w]
-
-	// Accumulate pointers to uses of C.x.
-	if f.Ref == nil {
-		f.Ref = make([]*Ref, 0, 8)
-	}
-	f.walk(ast2, "prog", (*File).saveRef)
-
-	// Accumulate exported functions.
-	// The comments are only on ast1 but we need to
-	// save the function bodies from ast2.
-	// The first walk fills in ExpFunc, and the
-	// second walk changes the entries to
-	// refer to ast2 instead.
-	f.walk(ast1, "prog", (*File).saveExport)
-	f.walk(ast2, "prog", (*File).saveExport2)
-
-	f.Comments = ast1.Comments
-	f.AST = ast2
-}
-
-// Like ast.CommentGroup's Text method but preserves
-// leading blank lines, so that line numbers line up.
-func commentText(g *ast.CommentGroup) string {
-	if g == nil {
-		return ""
-	}
-	var pieces []string
-	for _, com := range g.List {
-		c := string(com.Text)
-		// Remove comment markers.
-		// The parser has given us exactly the comment text.
-		switch c[1] {
-		case '/':
-			//-style comment (no newline at the end)
-			c = c[2:] + "\n"
-		case '*':
-			/*-style comment */
-			c = c[2 : len(c)-2]
-		}
-		pieces = append(pieces, c)
-	}
-	return strings.Join(pieces, "")
-}
-
-// Save references to C.xxx for later processing.
-func (f *File) saveRef(x interface{}, context string) {
-	n, ok := x.(*ast.Expr)
-	if !ok {
-		return
-	}
-	if sel, ok := (*n).(*ast.SelectorExpr); ok {
-		// For now, assume that the only instance of capital C is
-		// when used as the imported package identifier.
-		// The parser should take care of scoping in the future,
-		// so that we will be able to distinguish a "top-level C"
-		// from a local C.
-		if l, ok := sel.X.(*ast.Ident); ok && l.Name == "C" {
-			if context == "as2" {
-				context = "expr"
-			}
-			if context == "embed-type" {
-				error_(sel.Pos(), "cannot embed C type")
-			}
-			goname := sel.Sel.Name
-			if goname == "errno" {
-				error_(sel.Pos(), "cannot refer to errno directly; see documentation")
-				return
-			}
-			if goname == "_CMalloc" {
-				error_(sel.Pos(), "cannot refer to C._CMalloc; use C.malloc")
-				return
-			}
-			if goname == "malloc" {
-				goname = "_CMalloc"
-			}
-			name := f.Name[goname]
-			if name == nil {
-				name = &Name{
-					Go: goname,
-				}
-				f.Name[goname] = name
-			}
-			f.Ref = append(f.Ref, &Ref{
-				Name:    name,
-				Expr:    n,
-				Context: context,
-			})
-			return
-		}
-	}
-}
-
-// If a function should be exported add it to ExpFunc.
-func (f *File) saveExport(x interface{}, context string) {
-	n, ok := x.(*ast.FuncDecl)
-	if !ok {
-		return
-	}
-
-	if n.Doc == nil {
-		return
-	}
-	for _, c := range n.Doc.List {
-		if !strings.HasPrefix(string(c.Text), "//export ") {
-			continue
-		}
-
-		name := strings.TrimSpace(string(c.Text[9:]))
-		if name == "" {
-			error_(c.Pos(), "export missing name")
-		}
-
-		if name != n.Name.Name {
-			error_(c.Pos(), "export comment has wrong name %q, want %q", name, n.Name.Name)
-		}
-
-		doc := ""
-		for _, c1 := range n.Doc.List {
-			if c1 != c {
-				doc += c1.Text + "\n"
-			}
-		}
-
-		f.ExpFunc = append(f.ExpFunc, &ExpFunc{
-			Func:    n,
-			ExpName: name,
-			Doc:     doc,
-		})
-		break
-	}
-}
-
-// Make f.ExpFunc[i] point at the Func from this AST instead of the other one.
-func (f *File) saveExport2(x interface{}, context string) {
-	n, ok := x.(*ast.FuncDecl)
-	if !ok {
-		return
-	}
-
-	for _, exp := range f.ExpFunc {
-		if exp.Func.Name.Name == n.Name.Name {
-			exp.Func = n
-			break
-		}
-	}
-}
-
-// walk walks the AST x, calling visit(f, x, context) for each node.
-func (f *File) walk(x interface{}, context string, visit func(*File, interface{}, string)) {
-	visit(f, x, context)
-	switch n := x.(type) {
-	case *ast.Expr:
-		f.walk(*n, context, visit)
-
-	// everything else just recurs
-	default:
-		error_(token.NoPos, "unexpected type %T in walk", x, visit)
-		panic("unexpected type")
-
-	case nil:
-
-	// These are ordered and grouped to match ../../go/ast/ast.go
-	case *ast.Field:
-		if len(n.Names) == 0 && context == "field" {
-			f.walk(&n.Type, "embed-type", visit)
-		} else {
-			f.walk(&n.Type, "type", visit)
-		}
-	case *ast.FieldList:
-		for _, field := range n.List {
-			f.walk(field, context, visit)
-		}
-	case *ast.BadExpr:
-	case *ast.Ident:
-	case *ast.Ellipsis:
-	case *ast.BasicLit:
-	case *ast.FuncLit:
-		f.walk(n.Type, "type", visit)
-		f.walk(n.Body, "stmt", visit)
-	case *ast.CompositeLit:
-		f.walk(&n.Type, "type", visit)
-		f.walk(n.Elts, "expr", visit)
-	case *ast.ParenExpr:
-		f.walk(&n.X, context, visit)
-	case *ast.SelectorExpr:
-		f.walk(&n.X, "selector", visit)
-	case *ast.IndexExpr:
-		f.walk(&n.X, "expr", visit)
-		f.walk(&n.Index, "expr", visit)
-	case *ast.SliceExpr:
-		f.walk(&n.X, "expr", visit)
-		if n.Low != nil {
-			f.walk(&n.Low, "expr", visit)
-		}
-		if n.High != nil {
-			f.walk(&n.High, "expr", visit)
-		}
-		if n.Max != nil {
-			f.walk(&n.Max, "expr", visit)
-		}
-	case *ast.TypeAssertExpr:
-		f.walk(&n.X, "expr", visit)
-		f.walk(&n.Type, "type", visit)
-	case *ast.CallExpr:
-		if context == "as2" {
-			f.walk(&n.Fun, "call2", visit)
-		} else {
-			f.walk(&n.Fun, "call", visit)
-		}
-		f.walk(n.Args, "expr", visit)
-	case *ast.StarExpr:
-		f.walk(&n.X, context, visit)
-	case *ast.UnaryExpr:
-		f.walk(&n.X, "expr", visit)
-	case *ast.BinaryExpr:
-		f.walk(&n.X, "expr", visit)
-		f.walk(&n.Y, "expr", visit)
-	case *ast.KeyValueExpr:
-		f.walk(&n.Key, "expr", visit)
-		f.walk(&n.Value, "expr", visit)
-
-	case *ast.ArrayType:
-		f.walk(&n.Len, "expr", visit)
-		f.walk(&n.Elt, "type", visit)
-	case *ast.StructType:
-		f.walk(n.Fields, "field", visit)
-	case *ast.FuncType:
-		f.walk(n.Params, "param", visit)
-		if n.Results != nil {
-			f.walk(n.Results, "param", visit)
-		}
-	case *ast.InterfaceType:
-		f.walk(n.Methods, "field", visit)
-	case *ast.MapType:
-		f.walk(&n.Key, "type", visit)
-		f.walk(&n.Value, "type", visit)
-	case *ast.ChanType:
-		f.walk(&n.Value, "type", visit)
-
-	case *ast.BadStmt:
-	case *ast.DeclStmt:
-		f.walk(n.Decl, "decl", visit)
-	case *ast.EmptyStmt:
-	case *ast.LabeledStmt:
-		f.walk(n.Stmt, "stmt", visit)
-	case *ast.ExprStmt:
-		f.walk(&n.X, "expr", visit)
-	case *ast.SendStmt:
-		f.walk(&n.Chan, "expr", visit)
-		f.walk(&n.Value, "expr", visit)
-	case *ast.IncDecStmt:
-		f.walk(&n.X, "expr", visit)
-	case *ast.AssignStmt:
-		f.walk(n.Lhs, "expr", visit)
-		if len(n.Lhs) == 2 && len(n.Rhs) == 1 {
-			f.walk(n.Rhs, "as2", visit)
-		} else {
-			f.walk(n.Rhs, "expr", visit)
-		}
-	case *ast.GoStmt:
-		f.walk(n.Call, "expr", visit)
-	case *ast.DeferStmt:
-		f.walk(n.Call, "expr", visit)
-	case *ast.ReturnStmt:
-		f.walk(n.Results, "expr", visit)
-	case *ast.BranchStmt:
-	case *ast.BlockStmt:
-		f.walk(n.List, context, visit)
-	case *ast.IfStmt:
-		f.walk(n.Init, "stmt", visit)
-		f.walk(&n.Cond, "expr", visit)
-		f.walk(n.Body, "stmt", visit)
-		f.walk(n.Else, "stmt", visit)
-	case *ast.CaseClause:
-		if context == "typeswitch" {
-			context = "type"
-		} else {
-			context = "expr"
-		}
-		f.walk(n.List, context, visit)
-		f.walk(n.Body, "stmt", visit)
-	case *ast.SwitchStmt:
-		f.walk(n.Init, "stmt", visit)
-		f.walk(&n.Tag, "expr", visit)
-		f.walk(n.Body, "switch", visit)
-	case *ast.TypeSwitchStmt:
-		f.walk(n.Init, "stmt", visit)
-		f.walk(n.Assign, "stmt", visit)
-		f.walk(n.Body, "typeswitch", visit)
-	case *ast.CommClause:
-		f.walk(n.Comm, "stmt", visit)
-		f.walk(n.Body, "stmt", visit)
-	case *ast.SelectStmt:
-		f.walk(n.Body, "stmt", visit)
-	case *ast.ForStmt:
-		f.walk(n.Init, "stmt", visit)
-		f.walk(&n.Cond, "expr", visit)
-		f.walk(n.Post, "stmt", visit)
-		f.walk(n.Body, "stmt", visit)
-	case *ast.RangeStmt:
-		f.walk(&n.Key, "expr", visit)
-		f.walk(&n.Value, "expr", visit)
-		f.walk(&n.X, "expr", visit)
-		f.walk(n.Body, "stmt", visit)
-
-	case *ast.ImportSpec:
-	case *ast.ValueSpec:
-		f.walk(&n.Type, "type", visit)
-		f.walk(n.Values, "expr", visit)
-	case *ast.TypeSpec:
-		f.walk(&n.Type, "type", visit)
-
-	case *ast.BadDecl:
-	case *ast.GenDecl:
-		f.walk(n.Specs, "spec", visit)
-	case *ast.FuncDecl:
-		if n.Recv != nil {
-			f.walk(n.Recv, "param", visit)
-		}
-		f.walk(n.Type, "type", visit)
-		if n.Body != nil {
-			f.walk(n.Body, "stmt", visit)
-		}
-
-	case *ast.File:
-		f.walk(n.Decls, "decl", visit)
-
-	case *ast.Package:
-		for _, file := range n.Files {
-			f.walk(file, "file", visit)
-		}
-
-	case []ast.Decl:
-		for _, d := range n {
-			f.walk(d, context, visit)
-		}
-	case []ast.Expr:
-		for i := range n {
-			f.walk(&n[i], context, visit)
-		}
-	case []ast.Stmt:
-		for _, s := range n {
-			f.walk(s, context, visit)
-		}
-	case []ast.Spec:
-		for _, s := range n {
-			f.walk(s, context, visit)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/cgo/doc.go b/third_party/gofrontend/libgo/go/cmd/cgo/doc.go
deleted file mode 100644
index b2a5428..0000000
--- a/third_party/gofrontend/libgo/go/cmd/cgo/doc.go
+++ /dev/null
@@ -1,771 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-
-Cgo enables the creation of Go packages that call C code.
-
-Using cgo with the go command
-
-To use cgo write normal Go code that imports a pseudo-package "C".
-The Go code can then refer to types such as C.size_t, variables such
-as C.stdout, or functions such as C.putchar.
-
-If the import of "C" is immediately preceded by a comment, that
-comment, called the preamble, is used as a header when compiling
-the C parts of the package.  For example:
-
-	// #include <stdio.h>
-	// #include <errno.h>
-	import "C"
-
-The preamble may contain any C code, including function and variable
-declarations and definitions.  These may then be referred to from Go
-code as though they were defined in the package "C".  All names
-declared in the preamble may be used, even if they start with a
-lower-case letter.  Exception: static variables in the preamble may
-not be referenced from Go code; static functions are permitted.
-
-See $GOROOT/misc/cgo/stdio and $GOROOT/misc/cgo/gmp for examples.  See
-"C? Go? Cgo!" for an introduction to using cgo:
-https://golang.org/doc/articles/c_go_cgo.html.
-
-CFLAGS, CPPFLAGS, CXXFLAGS and LDFLAGS may be defined with pseudo #cgo
-directives within these comments to tweak the behavior of the C or C++
-compiler.  Values defined in multiple directives are concatenated
-together.  The directive can include a list of build constraints limiting its
-effect to systems satisfying one of the constraints
-(see https://golang.org/pkg/go/build/#hdr-Build_Constraints for details about the constraint syntax).
-For example:
-
-	// #cgo CFLAGS: -DPNG_DEBUG=1
-	// #cgo amd64 386 CFLAGS: -DX86=1
-	// #cgo LDFLAGS: -lpng
-	// #include <png.h>
-	import "C"
-
-Alternatively, CPPFLAGS and LDFLAGS may be obtained via the pkg-config
-tool using a '#cgo pkg-config:' directive followed by the package names.
-For example:
-
-	// #cgo pkg-config: png cairo
-	// #include <png.h>
-	import "C"
-
-When building, the CGO_CFLAGS, CGO_CPPFLAGS, CGO_CXXFLAGS and
-CGO_LDFLAGS environment variables are added to the flags derived from
-these directives.  Package-specific flags should be set using the
-directives, not the environment variables, so that builds work in
-unmodified environments.
-
-All the cgo CPPFLAGS and CFLAGS directives in a package are concatenated and
-used to compile C files in that package.  All the CPPFLAGS and CXXFLAGS
-directives in a package are concatenated and used to compile C++ files in that
-package.  All the LDFLAGS directives in any package in the program are
-concatenated and used at link time.  All the pkg-config directives are
-concatenated and sent to pkg-config simultaneously to add to each appropriate
-set of command-line flags.
-
-When the cgo directives are parsed, any occurrence of the string ${SRCDIR}
-will be replaced by the absolute path to the directory containing the source
-file. This allows pre-compiled static libraries to be included in the package
-directory and linked properly.
-For example if package foo is in the directory /go/src/foo:
-
-       // #cgo LDFLAGS: -L${SRCDIR}/libs -lfoo
-
-Will be expanded to:
-
-       // #cgo LDFLAGS: -L/go/src/foo/libs -lfoo
-
-When the Go tool sees that one or more Go files use the special import
-"C", it will look for other non-Go files in the directory and compile
-them as part of the Go package.  Any .c, .s, or .S files will be
-compiled with the C compiler.  Any .cc, .cpp, or .cxx files will be
-compiled with the C++ compiler.  Any .h, .hh, .hpp, or .hxx files will
-not be compiled separately, but, if these header files are changed,
-the C and C++ files will be recompiled.  The default C and C++
-compilers may be changed by the CC and CXX environment variables,
-respectively; those environment variables may include command line
-options.
-
-The cgo tool is enabled by default for native builds on systems where
-it is expected to work.  It is disabled by default when
-cross-compiling.  You can control this by setting the CGO_ENABLED
-environment variable when running the go tool: set it to 1 to enable
-the use of cgo, and to 0 to disable it.  The go tool will set the
-build constraint "cgo" if cgo is enabled.
-
-When cross-compiling, you must specify a C cross-compiler for cgo to
-use.  You can do this by setting the CC_FOR_TARGET environment
-variable when building the toolchain using make.bash, or by setting
-the CC environment variable any time you run the go tool.  The
-CXX_FOR_TARGET and CXX environment variables work in a similar way for
-C++ code.
-
-Go references to C
-
-Within the Go file, C's struct field names that are keywords in Go
-can be accessed by prefixing them with an underscore: if x points at a C
-struct with a field named "type", x._type accesses the field.
-C struct fields that cannot be expressed in Go, such as bit fields
-or misaligned data, are omitted in the Go struct, replaced by
-appropriate padding to reach the next field or the end of the struct.
-
-The standard C numeric types are available under the names
-C.char, C.schar (signed char), C.uchar (unsigned char),
-C.short, C.ushort (unsigned short), C.int, C.uint (unsigned int),
-C.long, C.ulong (unsigned long), C.longlong (long long),
-C.ulonglong (unsigned long long), C.float, C.double.
-The C type void* is represented by Go's unsafe.Pointer.
-
-To access a struct, union, or enum type directly, prefix it with
-struct_, union_, or enum_, as in C.struct_stat.
-
-As Go doesn't have support for C's union type in the general case,
-C's union types are represented as a Go byte array with the same length.
-
-Go structs cannot embed fields with C types.
-
-Cgo translates C types into equivalent unexported Go types.
-Because the translations are unexported, a Go package should not
-expose C types in its exported API: a C type used in one Go package
-is different from the same C type used in another.
-
-Any C function (even void functions) may be called in a multiple
-assignment context to retrieve both the return value (if any) and the
-C errno variable as an error (use _ to skip the result value if the
-function returns void).  For example:
-
-	n, err := C.sqrt(-1)
-	_, err := C.voidFunc()
-
-Calling C function pointers is currently not supported, however you can
-declare Go variables which hold C function pointers and pass them
-back and forth between Go and C. C code may call function pointers
-received from Go. For example:
-
-	package main
-
-	// typedef int (*intFunc) ();
-	//
-	// int
-	// bridge_int_func(intFunc f)
-	// {
-	//		return f();
-	// }
-	//
-	// int fortytwo()
-	// {
-	//	    return 42;
-	// }
-	import "C"
-	import "fmt"
-
-	func main() {
-		f := C.intFunc(C.fortytwo)
-		fmt.Println(int(C.bridge_int_func(f)))
-		// Output: 42
-	}
-
-In C, a function argument written as a fixed size array
-actually requires a pointer to the first element of the array.
-C compilers are aware of this calling convention and adjust
-the call accordingly, but Go cannot.  In Go, you must pass
-the pointer to the first element explicitly: C.f(&C.x[0]).
-
-A few special functions convert between Go and C types
-by making copies of the data.  In pseudo-Go definitions:
-
-	// Go string to C string
-	// The C string is allocated in the C heap using malloc.
-	// It is the caller's responsibility to arrange for it to be
-	// freed, such as by calling C.free (be sure to include stdlib.h
-	// if C.free is needed).
-	func C.CString(string) *C.char
-
-	// C string to Go string
-	func C.GoString(*C.char) string
-
-	// C string, length to Go string
-	func C.GoStringN(*C.char, C.int) string
-
-	// C pointer, length to Go []byte
-	func C.GoBytes(unsafe.Pointer, C.int) []byte
-
-C references to Go
-
-Go functions can be exported for use by C code in the following way:
-
-	//export MyFunction
-	func MyFunction(arg1, arg2 int, arg3 string) int64 {...}
-
-	//export MyFunction2
-	func MyFunction2(arg1, arg2 int, arg3 string) (int64, *C.char) {...}
-
-They will be available in the C code as:
-
-	extern int64 MyFunction(int arg1, int arg2, GoString arg3);
-	extern struct MyFunction2_return MyFunction2(int arg1, int arg2, GoString arg3);
-
-found in the _cgo_export.h generated header, after any preambles
-copied from the cgo input files. Functions with multiple
-return values are mapped to functions returning a struct.
-Not all Go types can be mapped to C types in a useful way.
-
-Using //export in a file places a restriction on the preamble:
-since it is copied into two different C output files, it must not
-contain any definitions, only declarations. If a file contains both
-definitions and declarations, then the two output files will produce
-duplicate symbols and the linker will fail. To avoid this, definitions
-must be placed in preambles in other files, or in C source files.
-
-Using cgo directly
-
-Usage:
-	go tool cgo [cgo options] [-- compiler options] gofiles...
-
-Cgo transforms the specified input Go source files into several output
-Go and C source files.
-
-The compiler options are passed through uninterpreted when
-invoking the C compiler to compile the C parts of the package.
-
-The following options are available when running cgo directly:
-
-	-dynimport file
-		Write list of symbols imported by file. Write to
-		-dynout argument or to standard output. Used by go
-		build when building a cgo package.
-	-dynout file
-		Write -dynimport output to file.
-	-dynpackage package
-		Set Go package for -dynimport output.
-	-dynlinker
-		Write dynamic linker as part of -dynimport output.
-	-godefs
-		Write out input file in Go syntax replacing C package
-		names with real values. Used to generate files in the
-		syscall package when bootstrapping a new target.
-	-objdir directory
-		Put all generated files in directory.
-	-importpath string
-		The import path for the Go package. Optional; used for
-		nicer comments in the generated files.
-	-exportheader file
-		If there are any exported functions, write the
-		generated export declarations to file.
-		C code can #include this to see the declarations.
-	-gccgo
-		Generate output for the gccgo compiler rather than the
-		gc compiler.
-	-gccgoprefix prefix
-		The -fgo-prefix option to be used with gccgo.
-	-gccgopkgpath path
-		The -fgo-pkgpath option to be used with gccgo.
-	-import_runtime_cgo
-		If set (which it is by default) import runtime/cgo in
-		generated output.
-	-import_syscall
-		If set (which it is by default) import syscall in
-		generated output.
-	-debug-define
-		Debugging option. Print #defines.
-	-debug-gcc
-		Debugging option. Trace C compiler execution and output.
-*/
-package main
-
-/*
-Implementation details.
-
-Cgo provides a way for Go programs to call C code linked into the same
-address space. This comment explains the operation of cgo.
-
-Cgo reads a set of Go source files and looks for statements saying
-import "C". If the import has a doc comment, that comment is
-taken as literal C code to be used as a preamble to any C code
-generated by cgo. A typical preamble #includes necessary definitions:
-
-	// #include <stdio.h>
-	import "C"
-
-For more details about the usage of cgo, see the documentation
-comment at the top of this file.
-
-Understanding C
-
-Cgo scans the Go source files that import "C" for uses of that
-package, such as C.puts. It collects all such identifiers. The next
-step is to determine each kind of name. In C.xxx the xxx might refer
-to a type, a function, a constant, or a global variable. Cgo must
-decide which.
-
-The obvious thing for cgo to do is to process the preamble, expanding
-#includes and processing the corresponding C code. That would require
-a full C parser and type checker that was also aware of any extensions
-known to the system compiler (for example, all the GNU C extensions) as
-well as the system-specific header locations and system-specific
-pre-#defined macros. This is certainly possible to do, but it is an
-enormous amount of work.
-
-Cgo takes a different approach. It determines the meaning of C
-identifiers not by parsing C code but by feeding carefully constructed
-programs into the system C compiler and interpreting the generated
-error messages, debug information, and object files. In practice,
-parsing these is significantly less work and more robust than parsing
-C source.
-
-Cgo first invokes gcc -E -dM on the preamble, in order to find out
-about simple #defines for constants and the like. These are recorded
-for later use.
-
-Next, cgo needs to identify the kinds for each identifier. For the
-identifiers C.foo and C.bar, cgo generates this C program:
-
-	<preamble>
-	#line 1 "not-declared"
-	void __cgo_f_xxx_1(void) { __typeof__(foo) *__cgo_undefined__; }
-	#line 1 "not-type"
-	void __cgo_f_xxx_2(void) { foo *__cgo_undefined__; }
-	#line 1 "not-const"
-	void __cgo_f_xxx_3(void) { enum { __cgo_undefined__ = (foo)*1 }; }
-	#line 2 "not-declared"
-	void __cgo_f_xxx_1(void) { __typeof__(bar) *__cgo_undefined__; }
-	#line 2 "not-type"
-	void __cgo_f_xxx_2(void) { bar *__cgo_undefined__; }
-	#line 2 "not-const"
-	void __cgo_f_xxx_3(void) { enum { __cgo_undefined__ = (bar)*1 }; }
-
-This program will not compile, but cgo can use the presence or absence
-of an error message on a given line to deduce the information it
-needs. The program is syntactically valid regardless of whether each
-name is a type or an ordinary identifier, so there will be no syntax
-errors that might stop parsing early.
-
-An error on not-declared:1 indicates that foo is undeclared.
-An error on not-type:1 indicates that foo is not a type (if declared at all, it is an identifier).
-An error on not-const:1 indicates that foo is not an integer constant.
-
-The line number specifies the name involved. In the example, 1 is foo and 2 is bar.
-
-Next, cgo must learn the details of each type, variable, function, or
-constant. It can do this by reading object files. If cgo has decided
-that t1 is a type, v2 and v3 are variables or functions, and c4, c5,
-and c6 are constants, it generates:
-
-	<preamble>
-	__typeof__(t1) *__cgo__1;
-	__typeof__(v2) *__cgo__2;
-	__typeof__(v3) *__cgo__3;
-	__typeof__(c4) *__cgo__4;
-	enum { __cgo_enum__4 = c4 };
-	__typeof__(c5) *__cgo__5;
-	enum { __cgo_enum__5 = c5 };
-	__typeof__(c6) *__cgo__6;
-	enum { __cgo_enum__6 = c6 };
-
-	long long __cgo_debug_data[] = {
-		0, // t1
-		0, // v2
-		0, // v3
-		c4,
-		c5,
-		c6,
-		1
-	};
-
-and again invokes the system C compiler, to produce an object file
-containing debug information. Cgo parses the DWARF debug information
-for __cgo__N to learn the type of each identifier. (The types also
-distinguish functions from global variables.) If using a standard gcc,
-cgo can parse the DWARF debug information for the __cgo_enum__N to
-learn the identifier's value. The LLVM-based gcc on OS X emits
-incomplete DWARF information for enums; in that case cgo reads the
-constant values from the __cgo_debug_data from the object file's data
-segment.
-
-At this point cgo knows the meaning of each C.xxx well enough to start
-the translation process.
-
-Translating Go
-
-[The rest of this comment refers to 6g, the Go compiler that is part
-of the amd64 port of the gc Go toolchain. Everything here applies to
-another architecture's compilers as well.]
-
-Given the input Go files x.go and y.go, cgo generates these source
-files:
-
-	x.cgo1.go       # for 6g
-	y.cgo1.go       # for 6g
-	_cgo_gotypes.go # for 6g
-	_cgo_import.go  # for 6g (if -dynout _cgo_import.go)
-	x.cgo2.c        # for gcc
-	y.cgo2.c        # for gcc
-	_cgo_defun.c    # for gcc (if -gccgo)
-	_cgo_export.c   # for gcc
-	_cgo_export.h   # for gcc
-	_cgo_main.c     # for gcc
-	_cgo_flags      # for alternative build tools
-
-The file x.cgo1.go is a copy of x.go with the import "C" removed and
-references to C.xxx replaced with names like _Cfunc_xxx or _Ctype_xxx.
-The definitions of those identifiers, written as Go functions, types,
-or variables, are provided in _cgo_gotypes.go.
-
-Here is a _cgo_gotypes.go containing definitions for needed C types:
-
-	type _Ctype_char int8
-	type _Ctype_int int32
-	type _Ctype_void [0]byte
-
-The _cgo_gotypes.go file also contains the definitions of the
-functions.  They all have similar bodies that invoke runtime·cgocall
-to make a switch from the Go runtime world to the system C (GCC-based)
-world.
-
-For example, here is the definition of _Cfunc_puts:
-
-	//go:cgo_import_static _cgo_be59f0f25121_Cfunc_puts
-	//go:linkname __cgofn__cgo_be59f0f25121_Cfunc_puts _cgo_be59f0f25121_Cfunc_puts
-	var __cgofn__cgo_be59f0f25121_Cfunc_puts byte
-	var _cgo_be59f0f25121_Cfunc_puts = unsafe.Pointer(&__cgofn__cgo_be59f0f25121_Cfunc_puts)
-
-	func _Cfunc_puts(p0 *_Ctype_char) (r1 _Ctype_int) {
-		_cgo_runtime_cgocall(_cgo_be59f0f25121_Cfunc_puts, uintptr(unsafe.Pointer(&p0)))
-		return
-	}
-
-The hexadecimal number is a hash of cgo's input, chosen to be
-deterministic yet unlikely to collide with other uses. The actual
-function _cgo_be59f0f25121_Cfunc_puts is implemented in a C source
-file compiled by gcc, the file x.cgo2.c:
-
-	void
-	_cgo_be59f0f25121_Cfunc_puts(void *v)
-	{
-		_cgo_wait_runtime_init_done();
-		struct {
-			char* p0;
-			int r;
-			char __pad12[4];
-		} __attribute__((__packed__, __gcc_struct__)) *a = v;
-		a->r = puts((void*)a->p0);
-	}
-
-It waits for Go runtime to be initialized (required for shared libraries),
-extracts the arguments from the pointer to _Cfunc_puts's argument
-frame, invokes the system C function (in this case, puts), stores the
-result in the frame, and returns.
-
-Linking
-
-Once the _cgo_export.c and *.cgo2.c files have been compiled with gcc,
-they need to be linked into the final binary, along with the libraries
-they might depend on (in the case of puts, stdio). 6l has been
-extended to understand basic ELF files, but it does not understand ELF
-in the full complexity that modern C libraries embrace, so it cannot
-in general generate direct references to the system libraries.
-
-Instead, the build process generates an object file using dynamic
-linkage to the desired libraries. The main function is provided by
-_cgo_main.c:
-
-	int main() { return 0; }
-	void crosscall2(void(*fn)(void*, int), void *a, int c) { }
-	void _cgo_wait_runtime_init_done() { }
-	void _cgo_allocate(void *a, int c) { }
-	void _cgo_panic(void *a, int c) { }
-
-The extra functions here are stubs to satisfy the references in the C
-code generated for gcc. The build process links this stub, along with
-_cgo_export.c and *.cgo2.c, into a dynamic executable and then lets
-cgo examine the executable. Cgo records the list of shared library
-references and resolved names and writes them into a new file
-_cgo_import.go, which looks like:
-
-	//go:cgo_dynamic_linker "/lib64/ld-linux-x86-64.so.2"
-	//go:cgo_import_dynamic puts puts#GLIBC_2.2.5 "libc.so.6"
-	//go:cgo_import_dynamic __libc_start_main __libc_start_main#GLIBC_2.2.5 "libc.so.6"
-	//go:cgo_import_dynamic stdout stdout#GLIBC_2.2.5 "libc.so.6"
-	//go:cgo_import_dynamic fflush fflush#GLIBC_2.2.5 "libc.so.6"
-	//go:cgo_import_dynamic _ _ "libpthread.so.0"
-	//go:cgo_import_dynamic _ _ "libc.so.6"
-
-In the end, the compiled Go package, which will eventually be
-presented to 6l as part of a larger program, contains:
-
-	_go_.6        # 6g-compiled object for _cgo_gotypes.go, _cgo_import.go, *.cgo1.go
-	_all.o        # gcc-compiled object for _cgo_export.c, *.cgo2.c
-
-The final program will be a dynamic executable, so that 6l can avoid
-needing to process arbitrary .o files. It only needs to process the .o
-files generated from C files that cgo writes, and those are much more
-limited in the ELF or other features that they use.
-
-In essence, the _cgo_import.6 file includes the extra linking
-directives that 6l is not sophisticated enough to derive from _all.o
-on its own. Similarly, the _all.o uses dynamic references to real
-system object code because 6l is not sophisticated enough to process
-the real code.
-
-The main benefits of this system are that 6l remains relatively simple
-(it does not need to implement a complete ELF and Mach-O linker) and
-that gcc is not needed after the package is compiled. For example,
-package net uses cgo for access to name resolution functions provided
-by libc. Although gcc is needed to compile package net, gcc is not
-needed to link programs that import package net.
-
-Runtime
-
-When using cgo, Go must not assume that it owns all details of the
-process. In particular it needs to coordinate with C in the use of
-threads and thread-local storage. The runtime package declares a few
-variables:
-
-	var (
-		iscgo             bool
-		_cgo_init         unsafe.Pointer
-		_cgo_thread_start unsafe.Pointer
-	)
-
-Any package using cgo imports "runtime/cgo", which provides
-initializations for these variables. It sets iscgo to true, _cgo_init
-to a gcc-compiled function that can be called early during program
-startup, and _cgo_thread_start to a gcc-compiled function that can be
-used to create a new thread, in place of the runtime's usual direct
-system calls.
-
-Internal and External Linking
-
-The text above describes "internal" linking, in which 6l parses and
-links host object files (ELF, Mach-O, PE, and so on) into the final
-executable itself. Keeping 6l simple means we cannot possibly
-implement the full semantics of the host linker, so the kinds of
-objects that can be linked directly into the binary is limited (other
-code can only be used as a dynamic library). On the other hand, when
-using internal linking, 6l can generate Go binaries by itself.
-
-In order to allow linking arbitrary object files without requiring
-dynamic libraries, cgo supports an "external" linking mode too. In
-external linking mode, 6l does not process any host object files.
-Instead, it collects all the Go code and writes a single go.o object
-file containing it. Then it invokes the host linker (usually gcc) to
-combine the go.o object file and any supporting non-Go code into a
-final executable. External linking avoids the dynamic library
-requirement but introduces a requirement that the host linker be
-present to create such a binary.
-
-Most builds both compile source code and invoke the linker to create a
-binary. When cgo is involved, the compile step already requires gcc, so
-it is not problematic for the link step to require gcc too.
-
-An important exception is builds using a pre-compiled copy of the
-standard library. In particular, package net uses cgo on most systems,
-and we want to preserve the ability to compile pure Go code that
-imports net without requiring gcc to be present at link time. (In this
-case, the dynamic library requirement is less significant, because the
-only library involved is libc.so, which can usually be assumed
-present.)
-
-This conflict between functionality and the gcc requirement means we
-must support both internal and external linking, depending on the
-circumstances: if net is the only cgo-using package, then internal
-linking is probably fine, but if other packages are involved, so that there
-are dependencies on libraries beyond libc, external linking is likely
-to work better. The compilation of a package records the relevant
-information to support both linking modes, leaving the decision
-to be made when linking the final binary.
-
-Linking Directives
-
-In either linking mode, package-specific directives must be passed
-through to 6l. These are communicated by writing //go: directives in a
-Go source file compiled by 6g. The directives are copied into the .6
-object file and then processed by the linker.
-
-The directives are:
-
-//go:cgo_import_dynamic <local> [<remote> ["<library>"]]
-
-	In internal linking mode, allow an unresolved reference to
-	<local>, assuming it will be resolved by a dynamic library
-	symbol. The optional <remote> specifies the symbol's name and
-	possibly version in the dynamic library, and the optional "<library>"
-	names the specific library where the symbol should be found.
-
-	In the <remote>, # or @ can be used to introduce a symbol version.
-
-	Examples:
-	//go:cgo_import_dynamic puts
-	//go:cgo_import_dynamic puts puts#GLIBC_2.2.5
-	//go:cgo_import_dynamic puts puts#GLIBC_2.2.5 "libc.so.6"
-
-	A side effect of the cgo_import_dynamic directive with a
-	library is to make the final binary depend on that dynamic
-	library. To get the dependency without importing any specific
-	symbols, use _ for local and remote.
-
-	Example:
-	//go:cgo_import_dynamic _ _ "libc.so.6"
-
-	For compatibility with current versions of SWIG,
-	#pragma dynimport is an alias for //go:cgo_import_dynamic.
-
-//go:cgo_dynamic_linker "<path>"
-
-	In internal linking mode, use "<path>" as the dynamic linker
-	in the final binary. This directive is only needed from one
-	package when constructing a binary; by convention it is
-	supplied by runtime/cgo.
-
-	Example:
-	//go:cgo_dynamic_linker "/lib/ld-linux.so.2"
-
-//go:cgo_export_dynamic <local> <remote>
-
-	In internal linking mode, put the Go symbol
-	named <local> into the program's exported symbol table as
-	<remote>, so that C code can refer to it by that name. This
-	mechanism makes it possible for C code to call back into Go or
-	to share Go's data.
-
-	For compatibility with current versions of SWIG,
-	#pragma dynexport is an alias for //go:cgo_export_dynamic.
-
-//go:cgo_import_static <local>
-
-	In external linking mode, allow unresolved references to
-	<local> in the go.o object file prepared for the host linker,
-	under the assumption that <local> will be supplied by the
-	other object files that will be linked with go.o.
-
-	Example:
-	//go:cgo_import_static puts_wrapper
-
-//go:cgo_export_static <local> <remote>
-
-	In external linking mode, put the Go symbol
-	named <local> into the program's exported symbol table as
-	<remote>, so that C code can refer to it by that name. This
-	mechanism makes it possible for C code to call back into Go or
-	to share Go's data.
-
-//go:cgo_ldflag "<arg>"
-
-	In external linking mode, invoke the host linker (usually gcc)
-	with "<arg>" as a command-line argument following the .o files.
-	Note that the arguments are for "gcc", not "ld".
-
-	Example:
-	//go:cgo_ldflag "-lpthread"
-	//go:cgo_ldflag "-L/usr/local/sqlite3/lib"
-
-A package compiled with cgo will include directives for both
-internal and external linking; the linker will select the appropriate
-subset for the chosen linking mode.
-
-Example
-
-As a simple example, consider a package that uses cgo to call C.sin.
-The following code will be generated by cgo:
-
-	// compiled by 6g
-
-	//go:cgo_ldflag "-lm"
-
-	type _Ctype_double float64
-
-	//go:cgo_import_static _cgo_gcc_Cfunc_sin
-	//go:linkname __cgo_gcc_Cfunc_sin _cgo_gcc_Cfunc_sin
-	var __cgo_gcc_Cfunc_sin byte
-	var _cgo_gcc_Cfunc_sin = unsafe.Pointer(&__cgo_gcc_Cfunc_sin)
-
-	func _Cfunc_sin(p0 _Ctype_double) (r1 _Ctype_double) {
-		_cgo_runtime_cgocall(_cgo_gcc_Cfunc_sin, uintptr(unsafe.Pointer(&p0)))
-		return
-	}
-
-	// compiled by gcc, into foo.cgo2.o
-
-	void
-	_cgo_gcc_Cfunc_sin(void *v)
-	{
-		struct {
-			double p0;
-			double r;
-		} __attribute__((__packed__)) *a = v;
-		a->r = sin(a->p0);
-	}
-
-What happens at link time depends on whether the final binary is linked
-using the internal or external mode. If other packages are compiled in
-"external only" mode, then the final link will be an external one.
-Otherwise the link will be an internal one.
-
-The linking directives are used according to the kind of final link
-used.
-
-In internal mode, 6l itself processes all the host object files, in
-particular foo.cgo2.o. To do so, it uses the cgo_import_dynamic and
-cgo_dynamic_linker directives to learn that the otherwise undefined
-reference to sin in foo.cgo2.o should be rewritten to refer to the
-symbol sin with version GLIBC_2.2.5 from the dynamic library
-"libm.so.6", and the binary should request "/lib/ld-linux.so.2" as its
-runtime dynamic linker.
-
-In external mode, 6l does not process any host object files, in
-particular foo.cgo2.o. It links together the 6g-generated object
-files, along with any other Go code, into a go.o file. While doing
-that, 6l will discover that there is no definition for
-_cgo_gcc_Cfunc_sin, referred to by the 6g-compiled source file. This
-is okay, because 6l also processes the cgo_import_static directive and
-knows that _cgo_gcc_Cfunc_sin is expected to be supplied by a host
-object file, so 6l does not treat the missing symbol as an error when
-creating go.o. Indeed, the definition for _cgo_gcc_Cfunc_sin will be
-provided to the host linker by foo2.cgo.o, which in turn will need the
-symbol 'sin'. 6l also processes the cgo_ldflag directives, so that it
-knows that the eventual host link command must include the -lm
-argument, so that the host linker will be able to find 'sin' in the
-math library.
-
-6l Command Line Interface
-
-The go command and any other Go-aware build systems invoke 6l
-to link a collection of packages into a single binary. By default, 6l will
-present the same interface it does today:
-
-	6l main.a
-
-produces a file named 6.out, even if 6l does so by invoking the host
-linker in external linking mode.
-
-By default, 6l will decide the linking mode as follows: if the only
-packages using cgo are those on a whitelist of standard library
-packages (net, os/user, runtime/cgo), 6l will use internal linking
-mode. Otherwise, there are non-standard cgo packages involved, and 6l
-will use external linking mode. The first rule means that a build of
-the godoc binary, which uses net but no other cgo, can run without
-needing gcc available. The second rule means that a build of a
-cgo-wrapped library like sqlite3 can generate a standalone executable
-instead of needing to refer to a dynamic library. The specific choice
-can be overridden using a command line flag: 6l -linkmode=internal or
-6l -linkmode=external.
-
-In an external link, 6l will create a temporary directory, write any
-host object files found in package archives to that directory (renamed
-to avoid conflicts), write the go.o file to that directory, and invoke
-the host linker. The default value for the host linker is $CC, split
-into fields, or else "gcc". The specific host linker command line can
-be overridden using command line flags: 6l -extld=clang
--extldflags='-ggdb -O3'.  If any package in a build includes a .cc or
-other file compiled by the C++ compiler, the go tool will use the
--extld option to set the host linker to the C++ compiler.
-
-These defaults mean that Go-aware build systems can ignore the linking
-changes and keep running plain '6l' and get reasonable results, but
-they can also control the linking details if desired.
-
-*/
diff --git a/third_party/gofrontend/libgo/go/cmd/cgo/gcc.go b/third_party/gofrontend/libgo/go/cmd/cgo/gcc.go
deleted file mode 100644
index e0b89ec..0000000
--- a/third_party/gofrontend/libgo/go/cmd/cgo/gcc.go
+++ /dev/null
@@ -1,1770 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Annotate Ref in Prog with C types by parsing gcc debug output.
-// Conversion of debug output to Go types.
-
-package main
-
-import (
-	"bytes"
-	"debug/dwarf"
-	"debug/elf"
-	"debug/macho"
-	"debug/pe"
-	"encoding/binary"
-	"errors"
-	"flag"
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"os"
-	"strconv"
-	"strings"
-	"unicode"
-	"unicode/utf8"
-)
-
-var debugDefine = flag.Bool("debug-define", false, "print relevant #defines")
-var debugGcc = flag.Bool("debug-gcc", false, "print gcc invocations")
-
-var nameToC = map[string]string{
-	"schar":         "signed char",
-	"uchar":         "unsigned char",
-	"ushort":        "unsigned short",
-	"uint":          "unsigned int",
-	"ulong":         "unsigned long",
-	"longlong":      "long long",
-	"ulonglong":     "unsigned long long",
-	"complexfloat":  "float complex",
-	"complexdouble": "double complex",
-}
-
-// cname returns the C name to use for C.s.
-// The expansions are listed in nameToC and also
-// struct_foo becomes "struct foo", and similarly for
-// union and enum.
-func cname(s string) string {
-	if t, ok := nameToC[s]; ok {
-		return t
-	}
-
-	if strings.HasPrefix(s, "struct_") {
-		return "struct " + s[len("struct_"):]
-	}
-	if strings.HasPrefix(s, "union_") {
-		return "union " + s[len("union_"):]
-	}
-	if strings.HasPrefix(s, "enum_") {
-		return "enum " + s[len("enum_"):]
-	}
-	if strings.HasPrefix(s, "sizeof_") {
-		return "sizeof(" + cname(s[len("sizeof_"):]) + ")"
-	}
-	return s
-}
-
-// DiscardCgoDirectives processes the import C preamble, and discards
-// all #cgo CFLAGS and LDFLAGS directives, so they don't make their
-// way into _cgo_export.h.
-func (f *File) DiscardCgoDirectives() {
-	linesIn := strings.Split(f.Preamble, "\n")
-	linesOut := make([]string, 0, len(linesIn))
-	for _, line := range linesIn {
-		l := strings.TrimSpace(line)
-		if len(l) < 5 || l[:4] != "#cgo" || !unicode.IsSpace(rune(l[4])) {
-			linesOut = append(linesOut, line)
-		} else {
-			linesOut = append(linesOut, "")
-		}
-	}
-	f.Preamble = strings.Join(linesOut, "\n")
-}
-
-// addToFlag appends args to flag.  All flags are later written out onto the
-// _cgo_flags file for the build system to use.
-func (p *Package) addToFlag(flag string, args []string) {
-	p.CgoFlags[flag] = append(p.CgoFlags[flag], args...)
-	if flag == "CFLAGS" {
-		// We'll also need these when preprocessing for dwarf information.
-		p.GccOptions = append(p.GccOptions, args...)
-	}
-}
-
-// splitQuoted splits the string s around each instance of one or more consecutive
-// white space characters while taking into account quotes and escaping, and
-// returns an array of substrings of s or an empty list if s contains only white space.
-// Single quotes and double quotes are recognized to prevent splitting within the
-// quoted region, and are removed from the resulting substrings. If a quote in s
-// isn't closed err will be set and r will have the unclosed argument as the
-// last element.  The backslash is used for escaping.
-//
-// For example, the following string:
-//
-//     `a b:"c d" 'e''f'  "g\""`
-//
-// Would be parsed as:
-//
-//     []string{"a", "b:c d", "ef", `g"`}
-//
-func splitQuoted(s string) (r []string, err error) {
-	var args []string
-	arg := make([]rune, len(s))
-	escaped := false
-	quoted := false
-	quote := '\x00'
-	i := 0
-	for _, r := range s {
-		switch {
-		case escaped:
-			escaped = false
-		case r == '\\':
-			escaped = true
-			continue
-		case quote != 0:
-			if r == quote {
-				quote = 0
-				continue
-			}
-		case r == '"' || r == '\'':
-			quoted = true
-			quote = r
-			continue
-		case unicode.IsSpace(r):
-			if quoted || i > 0 {
-				quoted = false
-				args = append(args, string(arg[:i]))
-				i = 0
-			}
-			continue
-		}
-		arg[i] = r
-		i++
-	}
-	if quoted || i > 0 {
-		args = append(args, string(arg[:i]))
-	}
-	if quote != 0 {
-		err = errors.New("unclosed quote")
-	} else if escaped {
-		err = errors.New("unfinished escaping")
-	}
-	return args, err
-}
-
-// Translate rewrites f.AST, the original Go input, to remove
-// references to the imported package C, replacing them with
-// references to the equivalent Go types, functions, and variables.
-func (p *Package) Translate(f *File) {
-	for _, cref := range f.Ref {
-		// Convert C.ulong to C.unsigned long, etc.
-		cref.Name.C = cname(cref.Name.Go)
-	}
-	p.loadDefines(f)
-	needType := p.guessKinds(f)
-	if len(needType) > 0 {
-		p.loadDWARF(f, needType)
-	}
-	p.rewriteRef(f)
-}
-
-// loadDefines coerces gcc into spitting out the #defines in use
-// in the file f and saves relevant renamings in f.Name[name].Define.
-func (p *Package) loadDefines(f *File) {
-	var b bytes.Buffer
-	b.WriteString(f.Preamble)
-	b.WriteString(builtinProlog)
-	stdout := p.gccDefines(b.Bytes())
-
-	for _, line := range strings.Split(stdout, "\n") {
-		if len(line) < 9 || line[0:7] != "#define" {
-			continue
-		}
-
-		line = strings.TrimSpace(line[8:])
-
-		var key, val string
-		spaceIndex := strings.Index(line, " ")
-		tabIndex := strings.Index(line, "\t")
-
-		if spaceIndex == -1 && tabIndex == -1 {
-			continue
-		} else if tabIndex == -1 || (spaceIndex != -1 && spaceIndex < tabIndex) {
-			key = line[0:spaceIndex]
-			val = strings.TrimSpace(line[spaceIndex:])
-		} else {
-			key = line[0:tabIndex]
-			val = strings.TrimSpace(line[tabIndex:])
-		}
-
-		if key == "__clang__" {
-			p.GccIsClang = true
-		}
-
-		if n := f.Name[key]; n != nil {
-			if *debugDefine {
-				fmt.Fprintf(os.Stderr, "#define %s %s\n", key, val)
-			}
-			n.Define = val
-		}
-	}
-}
-
-// guessKinds tricks gcc into revealing the kind of each
-// name xxx for the references C.xxx in the Go input.
-// The kind is either a constant, type, or variable.
-func (p *Package) guessKinds(f *File) []*Name {
-	// Determine kinds for names we already know about,
-	// like #defines or 'struct foo', before bothering with gcc.
-	var names, needType []*Name
-	for _, key := range nameKeys(f.Name) {
-		n := f.Name[key]
-		// If we've already found this name as a #define
-		// and we can translate it as a constant value, do so.
-		if n.Define != "" {
-			isConst := false
-			if _, err := strconv.Atoi(n.Define); err == nil {
-				isConst = true
-			} else if n.Define[0] == '"' || n.Define[0] == '\'' {
-				if _, err := parser.ParseExpr(n.Define); err == nil {
-					isConst = true
-				}
-			}
-			if isConst {
-				n.Kind = "const"
-				// Turn decimal into hex, just for consistency
-				// with enum-derived constants.  Otherwise
-				// in the cgo -godefs output half the constants
-				// are in hex and half are in whatever the #define used.
-				i, err := strconv.ParseInt(n.Define, 0, 64)
-				if err == nil {
-					n.Const = fmt.Sprintf("%#x", i)
-				} else {
-					n.Const = n.Define
-				}
-				continue
-			}
-
-			if isName(n.Define) {
-				n.C = n.Define
-			}
-		}
-
-		needType = append(needType, n)
-
-		// If this is a struct, union, or enum type name, no need to guess the kind.
-		if strings.HasPrefix(n.C, "struct ") || strings.HasPrefix(n.C, "union ") || strings.HasPrefix(n.C, "enum ") {
-			n.Kind = "type"
-			continue
-		}
-
-		// Otherwise, we'll need to find out from gcc.
-		names = append(names, n)
-	}
-
-	// Bypass gcc if there's nothing left to find out.
-	if len(names) == 0 {
-		return needType
-	}
-
-	// Coerce gcc into telling us whether each name is a type, a value, or undeclared.
-	// For names, find out whether they are integer constants.
-	// We used to look at specific warning or error messages here, but that tied the
-	// behavior too closely to specific versions of the compilers.
-	// Instead, arrange that we can infer what we need from only the presence or absence
-	// of an error on a specific line.
-	//
-	// For each name, we generate these lines, where xxx is the index in toSniff plus one.
-	//
-	//	#line xxx "not-declared"
-	//	void __cgo_f_xxx_1(void) { __typeof__(name) *__cgo_undefined__; }
-	//	#line xxx "not-type"
-	//	void __cgo_f_xxx_2(void) { name *__cgo_undefined__; }
-	//	#line xxx "not-const"
-	//	void __cgo_f_xxx_3(void) { enum { __cgo_undefined__ = (name)*1 }; }
-	//
-	// If we see an error at not-declared:xxx, the corresponding name is not declared.
-	// If we see an error at not-type:xxx, the corresponding name is a type.
-	// If we see an error at not-const:xxx, the corresponding name is not an integer constant.
-	// If we see no errors, we assume the name is an expression but not a constant
-	// (so a variable or a function).
-	//
-	// The specific input forms are chosen so that they are valid C syntax regardless of
-	// whether name denotes a type or an expression.
-
-	var b bytes.Buffer
-	b.WriteString(f.Preamble)
-	b.WriteString(builtinProlog)
-
-	for i, n := range names {
-		fmt.Fprintf(&b, "#line %d \"not-declared\"\n"+
-			"void __cgo_f_%d_1(void) { __typeof__(%s) *__cgo_undefined__; }\n"+
-			"#line %d \"not-type\"\n"+
-			"void __cgo_f_%d_2(void) { %s *__cgo_undefined__; }\n"+
-			"#line %d \"not-const\"\n"+
-			"void __cgo_f_%d_3(void) { enum { __cgo__undefined__ = (%s)*1 }; }\n",
-			i+1, i+1, n.C,
-			i+1, i+1, n.C,
-			i+1, i+1, n.C)
-	}
-	fmt.Fprintf(&b, "#line 1 \"completed\"\n"+
-		"int __cgo__1 = __cgo__2;\n")
-
-	stderr := p.gccErrors(b.Bytes())
-	if stderr == "" {
-		fatalf("%s produced no output\non input:\n%s", p.gccBaseCmd()[0], b.Bytes())
-	}
-
-	completed := false
-	sniff := make([]int, len(names))
-	const (
-		notType = 1 << iota
-		notConst
-		notDeclared
-	)
-	for _, line := range strings.Split(stderr, "\n") {
-		if !strings.Contains(line, ": error:") {
-			// we only care about errors.
-			// we tried to turn off warnings on the command line, but one never knows.
-			continue
-		}
-
-		c1 := strings.Index(line, ":")
-		if c1 < 0 {
-			continue
-		}
-		c2 := strings.Index(line[c1+1:], ":")
-		if c2 < 0 {
-			continue
-		}
-		c2 += c1 + 1
-
-		filename := line[:c1]
-		i, _ := strconv.Atoi(line[c1+1 : c2])
-		i--
-		if i < 0 || i >= len(names) {
-			continue
-		}
-
-		switch filename {
-		case "completed":
-			// Strictly speaking, there is no guarantee that seeing the error at completed:1
-			// (at the end of the file) means we've seen all the errors from earlier in the file,
-			// but usually it does. Certainly if we don't see the completed:1 error, we did
-			// not get all the errors we expected.
-			completed = true
-
-		case "not-declared":
-			sniff[i] |= notDeclared
-		case "not-type":
-			sniff[i] |= notType
-		case "not-const":
-			sniff[i] |= notConst
-		}
-	}
-
-	if !completed {
-		fatalf("%s did not produce error at completed:1\non input:\n%s\nfull error output:\n%s", p.gccBaseCmd()[0], b.Bytes(), stderr)
-	}
-
-	for i, n := range names {
-		switch sniff[i] {
-		default:
-			error_(token.NoPos, "could not determine kind of name for C.%s", fixGo(n.Go))
-		case notType:
-			n.Kind = "const"
-		case notConst:
-			n.Kind = "type"
-		case notConst | notType:
-			n.Kind = "not-type"
-		}
-	}
-	if nerrors > 0 {
-		// Check if compiling the preamble by itself causes any errors,
-		// because the messages we've printed out so far aren't helpful
-		// to users debugging preamble mistakes.  See issue 8442.
-		preambleErrors := p.gccErrors([]byte(f.Preamble))
-		if len(preambleErrors) > 0 {
-			error_(token.NoPos, "\n%s errors for preamble:\n%s", p.gccBaseCmd()[0], preambleErrors)
-		}
-
-		fatalf("unresolved names")
-	}
-
-	needType = append(needType, names...)
-	return needType
-}
-
-// loadDWARF parses the DWARF debug information generated
-// by gcc to learn the details of the constants, variables, and types
-// being referred to as C.xxx.
-func (p *Package) loadDWARF(f *File, names []*Name) {
-	// Extract the types from the DWARF section of an object
-	// from a well-formed C program.  Gcc only generates DWARF info
-	// for symbols in the object file, so it is not enough to print the
-	// preamble and hope the symbols we care about will be there.
-	// Instead, emit
-	//	__typeof__(names[i]) *__cgo__i;
-	// for each entry in names and then dereference the type we
-	// learn for __cgo__i.
-	var b bytes.Buffer
-	b.WriteString(f.Preamble)
-	b.WriteString(builtinProlog)
-	for i, n := range names {
-		fmt.Fprintf(&b, "__typeof__(%s) *__cgo__%d;\n", n.C, i)
-		if n.Kind == "const" {
-			fmt.Fprintf(&b, "enum { __cgo_enum__%d = %s };\n", i, n.C)
-		}
-	}
-
-	// Apple's LLVM-based gcc does not include the enumeration
-	// names and values in its DWARF debug output.  In case we're
-	// using such a gcc, create a data block initialized with the values.
-	// We can read them out of the object file.
-	fmt.Fprintf(&b, "long long __cgodebug_data[] = {\n")
-	for _, n := range names {
-		if n.Kind == "const" {
-			fmt.Fprintf(&b, "\t%s,\n", n.C)
-		} else {
-			fmt.Fprintf(&b, "\t0,\n")
-		}
-	}
-	// for the last entry, we can not use 0, otherwise
-	// in case all __cgodebug_data is zero initialized,
-	// LLVM-based gcc will place the it in the __DATA.__common
-	// zero-filled section (our debug/macho doesn't support
-	// this)
-	fmt.Fprintf(&b, "\t1\n")
-	fmt.Fprintf(&b, "};\n")
-
-	d, bo, debugData := p.gccDebug(b.Bytes())
-	enumVal := make([]int64, len(debugData)/8)
-	for i := range enumVal {
-		enumVal[i] = int64(bo.Uint64(debugData[i*8:]))
-	}
-
-	// Scan DWARF info for top-level TagVariable entries with AttrName __cgo__i.
-	types := make([]dwarf.Type, len(names))
-	enums := make([]dwarf.Offset, len(names))
-	nameToIndex := make(map[*Name]int)
-	for i, n := range names {
-		nameToIndex[n] = i
-	}
-	nameToRef := make(map[*Name]*Ref)
-	for _, ref := range f.Ref {
-		nameToRef[ref.Name] = ref
-	}
-	r := d.Reader()
-	for {
-		e, err := r.Next()
-		if err != nil {
-			fatalf("reading DWARF entry: %s", err)
-		}
-		if e == nil {
-			break
-		}
-		switch e.Tag {
-		case dwarf.TagEnumerationType:
-			offset := e.Offset
-			for {
-				e, err := r.Next()
-				if err != nil {
-					fatalf("reading DWARF entry: %s", err)
-				}
-				if e.Tag == 0 {
-					break
-				}
-				if e.Tag == dwarf.TagEnumerator {
-					entryName := e.Val(dwarf.AttrName).(string)
-					if strings.HasPrefix(entryName, "__cgo_enum__") {
-						n, _ := strconv.Atoi(entryName[len("__cgo_enum__"):])
-						if 0 <= n && n < len(names) {
-							enums[n] = offset
-						}
-					}
-				}
-			}
-		case dwarf.TagVariable:
-			name, _ := e.Val(dwarf.AttrName).(string)
-			typOff, _ := e.Val(dwarf.AttrType).(dwarf.Offset)
-			if name == "" || typOff == 0 {
-				if e.Val(dwarf.AttrSpecification) != nil {
-					// Since we are reading all the DWARF,
-					// assume we will see the variable elsewhere.
-					break
-				}
-				fatalf("malformed DWARF TagVariable entry")
-			}
-			if !strings.HasPrefix(name, "__cgo__") {
-				break
-			}
-			typ, err := d.Type(typOff)
-			if err != nil {
-				fatalf("loading DWARF type: %s", err)
-			}
-			t, ok := typ.(*dwarf.PtrType)
-			if !ok || t == nil {
-				fatalf("internal error: %s has non-pointer type", name)
-			}
-			i, err := strconv.Atoi(name[7:])
-			if err != nil {
-				fatalf("malformed __cgo__ name: %s", name)
-			}
-			if enums[i] != 0 {
-				t, err := d.Type(enums[i])
-				if err != nil {
-					fatalf("loading DWARF type: %s", err)
-				}
-				types[i] = t
-			} else {
-				types[i] = t.Type
-			}
-		}
-		if e.Tag != dwarf.TagCompileUnit {
-			r.SkipChildren()
-		}
-	}
-
-	// Record types and typedef information.
-	var conv typeConv
-	conv.Init(p.PtrSize, p.IntSize)
-	for i, n := range names {
-		if types[i] == nil {
-			continue
-		}
-		pos := token.NoPos
-		if ref, ok := nameToRef[n]; ok {
-			pos = ref.Pos()
-		}
-		f, fok := types[i].(*dwarf.FuncType)
-		if n.Kind != "type" && fok {
-			n.Kind = "func"
-			n.FuncType = conv.FuncType(f, pos)
-		} else {
-			n.Type = conv.Type(types[i], pos)
-			if enums[i] != 0 && n.Type.EnumValues != nil {
-				k := fmt.Sprintf("__cgo_enum__%d", i)
-				n.Kind = "const"
-				n.Const = fmt.Sprintf("%#x", n.Type.EnumValues[k])
-				// Remove injected enum to ensure the value will deep-compare
-				// equally in future loads of the same constant.
-				delete(n.Type.EnumValues, k)
-			}
-			// Prefer debug data over DWARF debug output, if we have it.
-			if n.Kind == "const" && i < len(enumVal) {
-				n.Const = fmt.Sprintf("%#x", enumVal[i])
-			}
-		}
-		conv.FinishType(pos)
-	}
-}
-
-// mangleName does name mangling to translate names
-// from the original Go source files to the names
-// used in the final Go files generated by cgo.
-func (p *Package) mangleName(n *Name) {
-	// When using gccgo variables have to be
-	// exported so that they become global symbols
-	// that the C code can refer to.
-	prefix := "_C"
-	if *gccgo && n.IsVar() {
-		prefix = "C"
-	}
-	n.Mangle = prefix + n.Kind + "_" + n.Go
-}
-
-// rewriteRef rewrites all the C.xxx references in f.AST to refer to the
-// Go equivalents, now that we have figured out the meaning of all
-// the xxx.  In *godefs mode, rewriteRef replaces the names
-// with full definitions instead of mangled names.
-func (p *Package) rewriteRef(f *File) {
-	// Keep a list of all the functions, to remove the ones
-	// only used as expressions and avoid generating bridge
-	// code for them.
-	functions := make(map[string]bool)
-
-	// Assign mangled names.
-	for _, n := range f.Name {
-		if n.Kind == "not-type" {
-			n.Kind = "var"
-		}
-		if n.Mangle == "" {
-			p.mangleName(n)
-		}
-		if n.Kind == "func" {
-			functions[n.Go] = false
-		}
-	}
-
-	// Now that we have all the name types filled in,
-	// scan through the Refs to identify the ones that
-	// are trying to do a ,err call.  Also check that
-	// functions are only used in calls.
-	for _, r := range f.Ref {
-		if r.Name.Kind == "const" && r.Name.Const == "" {
-			error_(r.Pos(), "unable to find value of constant C.%s", fixGo(r.Name.Go))
-		}
-		var expr ast.Expr = ast.NewIdent(r.Name.Mangle) // default
-		switch r.Context {
-		case "call", "call2":
-			if r.Name.Kind != "func" {
-				if r.Name.Kind == "type" {
-					r.Context = "type"
-					expr = r.Name.Type.Go
-					break
-				}
-				error_(r.Pos(), "call of non-function C.%s", fixGo(r.Name.Go))
-				break
-			}
-			functions[r.Name.Go] = true
-			if r.Context == "call2" {
-				if r.Name.Go == "_CMalloc" {
-					error_(r.Pos(), "no two-result form for C.malloc")
-					break
-				}
-				// Invent new Name for the two-result function.
-				n := f.Name["2"+r.Name.Go]
-				if n == nil {
-					n = new(Name)
-					*n = *r.Name
-					n.AddError = true
-					n.Mangle = "_C2func_" + n.Go
-					f.Name["2"+r.Name.Go] = n
-				}
-				expr = ast.NewIdent(n.Mangle)
-				r.Name = n
-				break
-			}
-		case "expr":
-			if r.Name.Kind == "func" {
-				// Function is being used in an expression, to e.g. pass around a C function pointer.
-				// Create a new Name for this Ref which causes the variable to be declared in Go land.
-				fpName := "fp_" + r.Name.Go
-				name := f.Name[fpName]
-				if name == nil {
-					name = &Name{
-						Go:   fpName,
-						C:    r.Name.C,
-						Kind: "fpvar",
-						Type: &Type{Size: p.PtrSize, Align: p.PtrSize, C: c("void*"), Go: ast.NewIdent("unsafe.Pointer")},
-					}
-					p.mangleName(name)
-					f.Name[fpName] = name
-				}
-				r.Name = name
-				// Rewrite into call to _Cgo_ptr to prevent assignments.  The _Cgo_ptr
-				// function is defined in out.go and simply returns its argument. See
-				// issue 7757.
-				expr = &ast.CallExpr{
-					Fun:  &ast.Ident{NamePos: (*r.Expr).Pos(), Name: "_Cgo_ptr"},
-					Args: []ast.Expr{ast.NewIdent(name.Mangle)},
-				}
-			} else if r.Name.Kind == "type" {
-				// Okay - might be new(T)
-				expr = r.Name.Type.Go
-			} else if r.Name.Kind == "var" {
-				expr = &ast.StarExpr{Star: (*r.Expr).Pos(), X: expr}
-			}
-
-		case "selector":
-			if r.Name.Kind == "var" {
-				expr = &ast.StarExpr{Star: (*r.Expr).Pos(), X: expr}
-			} else {
-				error_(r.Pos(), "only C variables allowed in selector expression", fixGo(r.Name.Go))
-			}
-
-		case "type":
-			if r.Name.Kind != "type" {
-				error_(r.Pos(), "expression C.%s used as type", fixGo(r.Name.Go))
-			} else if r.Name.Type == nil {
-				// Use of C.enum_x, C.struct_x or C.union_x without C definition.
-				// GCC won't raise an error when using pointers to such unknown types.
-				error_(r.Pos(), "type C.%s: undefined C type '%s'", fixGo(r.Name.Go), r.Name.C)
-			} else {
-				expr = r.Name.Type.Go
-			}
-		default:
-			if r.Name.Kind == "func" {
-				error_(r.Pos(), "must call C.%s", fixGo(r.Name.Go))
-			}
-		}
-		if *godefs {
-			// Substitute definition for mangled type name.
-			if id, ok := expr.(*ast.Ident); ok {
-				if t := typedef[id.Name]; t != nil {
-					expr = t.Go
-				}
-				if id.Name == r.Name.Mangle && r.Name.Const != "" {
-					expr = ast.NewIdent(r.Name.Const)
-				}
-			}
-		}
-
-		// Copy position information from old expr into new expr,
-		// in case expression being replaced is first on line.
-		// See golang.org/issue/6563.
-		pos := (*r.Expr).Pos()
-		switch x := expr.(type) {
-		case *ast.Ident:
-			expr = &ast.Ident{NamePos: pos, Name: x.Name}
-		}
-
-		*r.Expr = expr
-	}
-
-	// Remove functions only used as expressions, so their respective
-	// bridge functions are not generated.
-	for name, used := range functions {
-		if !used {
-			delete(f.Name, name)
-		}
-	}
-}
-
-// gccBaseCmd returns the start of the compiler command line.
-// It uses $CC if set, or else $GCC, or else the compiler recorded
-// during the initial build as defaultCC.
-// defaultCC is defined in zdefaultcc.go, written by cmd/dist.
-func (p *Package) gccBaseCmd() []string {
-	// Use $CC if set, since that's what the build uses.
-	if ret := strings.Fields(os.Getenv("CC")); len(ret) > 0 {
-		return ret
-	}
-	// Try $GCC if set, since that's what we used to use.
-	if ret := strings.Fields(os.Getenv("GCC")); len(ret) > 0 {
-		return ret
-	}
-	return strings.Fields(defaultCC)
-}
-
-// gccMachine returns the gcc -m flag to use, either "-m32", "-m64" or "-marm".
-func (p *Package) gccMachine() []string {
-	switch goarch {
-	case "amd64":
-		return []string{"-m64"}
-	case "386":
-		return []string{"-m32"}
-	case "arm":
-		return []string{"-marm"} // not thumb
-	case "s390":
-		return []string{"-m31"}
-	case "s390x":
-		return []string{"-m64"}
-	}
-	return nil
-}
-
-func gccTmp() string {
-	return *objDir + "_cgo_.o"
-}
-
-// gccCmd returns the gcc command line to use for compiling
-// the input.
-func (p *Package) gccCmd() []string {
-	c := append(p.gccBaseCmd(),
-		"-w",          // no warnings
-		"-Wno-error",  // warnings are not errors
-		"-o"+gccTmp(), // write object to tmp
-		"-gdwarf-2",   // generate DWARF v2 debugging symbols
-		"-c",          // do not link
-		"-xc",         // input language is C
-	)
-	if p.GccIsClang {
-		c = append(c,
-			"-ferror-limit=0",
-			// Apple clang version 1.7 (tags/Apple/clang-77) (based on LLVM 2.9svn)
-			// doesn't have -Wno-unneeded-internal-declaration, so we need yet another
-			// flag to disable the warning. Yes, really good diagnostics, clang.
-			"-Wno-unknown-warning-option",
-			"-Wno-unneeded-internal-declaration",
-			"-Wno-unused-function",
-			"-Qunused-arguments",
-			// Clang embeds prototypes for some builtin functions,
-			// like malloc and calloc, but all size_t parameters are
-			// incorrectly typed unsigned long. We work around that
-			// by disabling the builtin functions (this is safe as
-			// it won't affect the actual compilation of the C code).
-			// See: https://golang.org/issue/6506.
-			"-fno-builtin",
-		)
-	}
-
-	c = append(c, p.GccOptions...)
-	c = append(c, p.gccMachine()...)
-	c = append(c, "-") //read input from standard input
-	return c
-}
-
-// gccDebug runs gcc -gdwarf-2 over the C program stdin and
-// returns the corresponding DWARF data and, if present, debug data block.
-func (p *Package) gccDebug(stdin []byte) (*dwarf.Data, binary.ByteOrder, []byte) {
-	runGcc(stdin, p.gccCmd())
-
-	isDebugData := func(s string) bool {
-		// Some systems use leading _ to denote non-assembly symbols.
-		return s == "__cgodebug_data" || s == "___cgodebug_data"
-	}
-
-	if f, err := macho.Open(gccTmp()); err == nil {
-		defer f.Close()
-		d, err := f.DWARF()
-		if err != nil {
-			fatalf("cannot load DWARF output from %s: %v", gccTmp(), err)
-		}
-		var data []byte
-		if f.Symtab != nil {
-			for i := range f.Symtab.Syms {
-				s := &f.Symtab.Syms[i]
-				if isDebugData(s.Name) {
-					// Found it.  Now find data section.
-					if i := int(s.Sect) - 1; 0 <= i && i < len(f.Sections) {
-						sect := f.Sections[i]
-						if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
-							if sdat, err := sect.Data(); err == nil {
-								data = sdat[s.Value-sect.Addr:]
-							}
-						}
-					}
-				}
-			}
-		}
-		return d, f.ByteOrder, data
-	}
-
-	if f, err := elf.Open(gccTmp()); err == nil {
-		defer f.Close()
-		d, err := f.DWARF()
-		if err != nil {
-			fatalf("cannot load DWARF output from %s: %v", gccTmp(), err)
-		}
-		var data []byte
-		symtab, err := f.Symbols()
-		if err == nil {
-			for i := range symtab {
-				s := &symtab[i]
-				if isDebugData(s.Name) {
-					// Found it.  Now find data section.
-					if i := int(s.Section); 0 <= i && i < len(f.Sections) {
-						sect := f.Sections[i]
-						if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
-							if sdat, err := sect.Data(); err == nil {
-								data = sdat[s.Value-sect.Addr:]
-							}
-						}
-					}
-				}
-			}
-		}
-		return d, f.ByteOrder, data
-	}
-
-	if f, err := pe.Open(gccTmp()); err == nil {
-		defer f.Close()
-		d, err := f.DWARF()
-		if err != nil {
-			fatalf("cannot load DWARF output from %s: %v", gccTmp(), err)
-		}
-		var data []byte
-		for _, s := range f.Symbols {
-			if isDebugData(s.Name) {
-				if i := int(s.SectionNumber) - 1; 0 <= i && i < len(f.Sections) {
-					sect := f.Sections[i]
-					if s.Value < sect.Size {
-						if sdat, err := sect.Data(); err == nil {
-							data = sdat[s.Value:]
-						}
-					}
-				}
-			}
-		}
-		return d, binary.LittleEndian, data
-	}
-
-	fatalf("cannot parse gcc output %s as ELF, Mach-O, PE object", gccTmp())
-	panic("not reached")
-}
-
-// gccDefines runs gcc -E -dM -xc - over the C program stdin
-// and returns the corresponding standard output, which is the
-// #defines that gcc encountered while processing the input
-// and its included files.
-func (p *Package) gccDefines(stdin []byte) string {
-	base := append(p.gccBaseCmd(), "-E", "-dM", "-xc")
-	base = append(base, p.gccMachine()...)
-	stdout, _ := runGcc(stdin, append(append(base, p.GccOptions...), "-"))
-	return stdout
-}
-
-// gccErrors runs gcc over the C program stdin and returns
-// the errors that gcc prints.  That is, this function expects
-// gcc to fail.
-func (p *Package) gccErrors(stdin []byte) string {
-	// TODO(rsc): require failure
-	args := p.gccCmd()
-
-	if *debugGcc {
-		fmt.Fprintf(os.Stderr, "$ %s <<EOF\n", strings.Join(args, " "))
-		os.Stderr.Write(stdin)
-		fmt.Fprint(os.Stderr, "EOF\n")
-	}
-	stdout, stderr, _ := run(stdin, args)
-	if *debugGcc {
-		os.Stderr.Write(stdout)
-		os.Stderr.Write(stderr)
-	}
-	return string(stderr)
-}
-
-// runGcc runs the gcc command line args with stdin on standard input.
-// If the command exits with a non-zero exit status, runGcc prints
-// details about what was run and exits.
-// Otherwise runGcc returns the data written to standard output and standard error.
-// Note that for some of the uses we expect useful data back
-// on standard error, but for those uses gcc must still exit 0.
-func runGcc(stdin []byte, args []string) (string, string) {
-	if *debugGcc {
-		fmt.Fprintf(os.Stderr, "$ %s <<EOF\n", strings.Join(args, " "))
-		os.Stderr.Write(stdin)
-		fmt.Fprint(os.Stderr, "EOF\n")
-	}
-	stdout, stderr, ok := run(stdin, args)
-	if *debugGcc {
-		os.Stderr.Write(stdout)
-		os.Stderr.Write(stderr)
-	}
-	if !ok {
-		os.Stderr.Write(stderr)
-		os.Exit(2)
-	}
-	return string(stdout), string(stderr)
-}
-
-// A typeConv is a translator from dwarf types to Go types
-// with equivalent memory layout.
-type typeConv struct {
-	// Cache of already-translated or in-progress types.
-	m       map[dwarf.Type]*Type
-	typedef map[string]ast.Expr
-
-	// Map from types to incomplete pointers to those types.
-	ptrs map[dwarf.Type][]*Type
-	// Keys of ptrs in insertion order (deterministic worklist)
-	ptrKeys []dwarf.Type
-
-	// Predeclared types.
-	bool                                   ast.Expr
-	byte                                   ast.Expr // denotes padding
-	int8, int16, int32, int64              ast.Expr
-	uint8, uint16, uint32, uint64, uintptr ast.Expr
-	float32, float64                       ast.Expr
-	complex64, complex128                  ast.Expr
-	void                                   ast.Expr
-	string                                 ast.Expr
-	goVoid                                 ast.Expr // _Ctype_void, denotes C's void
-	goVoidPtr                              ast.Expr // unsafe.Pointer or *byte
-
-	ptrSize int64
-	intSize int64
-}
-
-var tagGen int
-var typedef = make(map[string]*Type)
-var goIdent = make(map[string]*ast.Ident)
-
-func (c *typeConv) Init(ptrSize, intSize int64) {
-	c.ptrSize = ptrSize
-	c.intSize = intSize
-	c.m = make(map[dwarf.Type]*Type)
-	c.ptrs = make(map[dwarf.Type][]*Type)
-	c.bool = c.Ident("bool")
-	c.byte = c.Ident("byte")
-	c.int8 = c.Ident("int8")
-	c.int16 = c.Ident("int16")
-	c.int32 = c.Ident("int32")
-	c.int64 = c.Ident("int64")
-	c.uint8 = c.Ident("uint8")
-	c.uint16 = c.Ident("uint16")
-	c.uint32 = c.Ident("uint32")
-	c.uint64 = c.Ident("uint64")
-	c.uintptr = c.Ident("uintptr")
-	c.float32 = c.Ident("float32")
-	c.float64 = c.Ident("float64")
-	c.complex64 = c.Ident("complex64")
-	c.complex128 = c.Ident("complex128")
-	c.void = c.Ident("void")
-	c.string = c.Ident("string")
-	c.goVoid = c.Ident("_Ctype_void")
-
-	// Normally cgo translates void* to unsafe.Pointer,
-	// but for historical reasons -godefs uses *byte instead.
-	if *godefs {
-		c.goVoidPtr = &ast.StarExpr{X: c.byte}
-	} else {
-		c.goVoidPtr = c.Ident("unsafe.Pointer")
-	}
-}
-
-// base strips away qualifiers and typedefs to get the underlying type
-func base(dt dwarf.Type) dwarf.Type {
-	for {
-		if d, ok := dt.(*dwarf.QualType); ok {
-			dt = d.Type
-			continue
-		}
-		if d, ok := dt.(*dwarf.TypedefType); ok {
-			dt = d.Type
-			continue
-		}
-		break
-	}
-	return dt
-}
-
-// Map from dwarf text names to aliases we use in package "C".
-var dwarfToName = map[string]string{
-	"long int":               "long",
-	"long unsigned int":      "ulong",
-	"unsigned int":           "uint",
-	"short unsigned int":     "ushort",
-	"short int":              "short",
-	"long long int":          "longlong",
-	"long long unsigned int": "ulonglong",
-	"signed char":            "schar",
-	"float complex":          "complexfloat",
-	"double complex":         "complexdouble",
-}
-
-const signedDelta = 64
-
-// String returns the current type representation.  Format arguments
-// are assembled within this method so that any changes in mutable
-// values are taken into account.
-func (tr *TypeRepr) String() string {
-	if len(tr.Repr) == 0 {
-		return ""
-	}
-	if len(tr.FormatArgs) == 0 {
-		return tr.Repr
-	}
-	return fmt.Sprintf(tr.Repr, tr.FormatArgs...)
-}
-
-// Empty reports whether the result of String would be "".
-func (tr *TypeRepr) Empty() bool {
-	return len(tr.Repr) == 0
-}
-
-// Set modifies the type representation.
-// If fargs are provided, repr is used as a format for fmt.Sprintf.
-// Otherwise, repr is used unprocessed as the type representation.
-func (tr *TypeRepr) Set(repr string, fargs ...interface{}) {
-	tr.Repr = repr
-	tr.FormatArgs = fargs
-}
-
-// FinishType completes any outstanding type mapping work.
-// In particular, it resolves incomplete pointer types.
-func (c *typeConv) FinishType(pos token.Pos) {
-	// Completing one pointer type might produce more to complete.
-	// Keep looping until they're all done.
-	for len(c.ptrKeys) > 0 {
-		dtype := c.ptrKeys[0]
-		c.ptrKeys = c.ptrKeys[1:]
-
-		// Note Type might invalidate c.ptrs[dtype].
-		t := c.Type(dtype, pos)
-		for _, ptr := range c.ptrs[dtype] {
-			ptr.Go.(*ast.StarExpr).X = t.Go
-			ptr.C.Set("%s*", t.C)
-		}
-		c.ptrs[dtype] = nil // retain the map key
-	}
-}
-
-// Type returns a *Type with the same memory layout as
-// dtype when used as the type of a variable or a struct field.
-func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type {
-	if t, ok := c.m[dtype]; ok {
-		if t.Go == nil {
-			fatalf("%s: type conversion loop at %s", lineno(pos), dtype)
-		}
-		return t
-	}
-
-	t := new(Type)
-	t.Size = dtype.Size() // note: wrong for array of pointers, corrected below
-	t.Align = -1
-	t.C = &TypeRepr{Repr: dtype.Common().Name}
-	c.m[dtype] = t
-
-	switch dt := dtype.(type) {
-	default:
-		fatalf("%s: unexpected type: %s", lineno(pos), dtype)
-
-	case *dwarf.AddrType:
-		if t.Size != c.ptrSize {
-			fatalf("%s: unexpected: %d-byte address type - %s", lineno(pos), t.Size, dtype)
-		}
-		t.Go = c.uintptr
-		t.Align = t.Size
-
-	case *dwarf.ArrayType:
-		if dt.StrideBitSize > 0 {
-			// Cannot represent bit-sized elements in Go.
-			t.Go = c.Opaque(t.Size)
-			break
-		}
-		count := dt.Count
-		if count == -1 {
-			// Indicates flexible array member, which Go doesn't support.
-			// Translate to zero-length array instead.
-			count = 0
-		}
-		sub := c.Type(dt.Type, pos)
-		t.Align = sub.Align
-		t.Go = &ast.ArrayType{
-			Len: c.intExpr(count),
-			Elt: sub.Go,
-		}
-		// Recalculate t.Size now that we know sub.Size.
-		t.Size = count * sub.Size
-		t.C.Set("__typeof__(%s[%d])", sub.C, dt.Count)
-
-	case *dwarf.BoolType:
-		t.Go = c.bool
-		t.Align = 1
-
-	case *dwarf.CharType:
-		if t.Size != 1 {
-			fatalf("%s: unexpected: %d-byte char type - %s", lineno(pos), t.Size, dtype)
-		}
-		t.Go = c.int8
-		t.Align = 1
-
-	case *dwarf.EnumType:
-		if t.Align = t.Size; t.Align >= c.ptrSize {
-			t.Align = c.ptrSize
-		}
-		t.C.Set("enum " + dt.EnumName)
-		signed := 0
-		t.EnumValues = make(map[string]int64)
-		for _, ev := range dt.Val {
-			t.EnumValues[ev.Name] = ev.Val
-			if ev.Val < 0 {
-				signed = signedDelta
-			}
-		}
-		switch t.Size + int64(signed) {
-		default:
-			fatalf("%s: unexpected: %d-byte enum type - %s", lineno(pos), t.Size, dtype)
-		case 1:
-			t.Go = c.uint8
-		case 2:
-			t.Go = c.uint16
-		case 4:
-			t.Go = c.uint32
-		case 8:
-			t.Go = c.uint64
-		case 1 + signedDelta:
-			t.Go = c.int8
-		case 2 + signedDelta:
-			t.Go = c.int16
-		case 4 + signedDelta:
-			t.Go = c.int32
-		case 8 + signedDelta:
-			t.Go = c.int64
-		}
-
-	case *dwarf.FloatType:
-		switch t.Size {
-		default:
-			fatalf("%s: unexpected: %d-byte float type - %s", lineno(pos), t.Size, dtype)
-		case 4:
-			t.Go = c.float32
-		case 8:
-			t.Go = c.float64
-		}
-		if t.Align = t.Size; t.Align >= c.ptrSize {
-			t.Align = c.ptrSize
-		}
-
-	case *dwarf.ComplexType:
-		switch t.Size {
-		default:
-			fatalf("%s: unexpected: %d-byte complex type - %s", lineno(pos), t.Size, dtype)
-		case 8:
-			t.Go = c.complex64
-		case 16:
-			t.Go = c.complex128
-		}
-		if t.Align = t.Size; t.Align >= c.ptrSize {
-			t.Align = c.ptrSize
-		}
-
-	case *dwarf.FuncType:
-		// No attempt at translation: would enable calls
-		// directly between worlds, but we need to moderate those.
-		t.Go = c.uintptr
-		t.Align = c.ptrSize
-
-	case *dwarf.IntType:
-		if dt.BitSize > 0 {
-			fatalf("%s: unexpected: %d-bit int type - %s", lineno(pos), dt.BitSize, dtype)
-		}
-		switch t.Size {
-		default:
-			fatalf("%s: unexpected: %d-byte int type - %s", lineno(pos), t.Size, dtype)
-		case 1:
-			t.Go = c.int8
-		case 2:
-			t.Go = c.int16
-		case 4:
-			t.Go = c.int32
-		case 8:
-			t.Go = c.int64
-		}
-		if t.Align = t.Size; t.Align >= c.ptrSize {
-			t.Align = c.ptrSize
-		}
-
-	case *dwarf.PtrType:
-		// Clang doesn't emit DW_AT_byte_size for pointer types.
-		if t.Size != c.ptrSize && t.Size != -1 {
-			fatalf("%s: unexpected: %d-byte pointer type - %s", lineno(pos), t.Size, dtype)
-		}
-		t.Size = c.ptrSize
-		t.Align = c.ptrSize
-
-		if _, ok := base(dt.Type).(*dwarf.VoidType); ok {
-			t.Go = c.goVoidPtr
-			t.C.Set("void*")
-			break
-		}
-
-		// Placeholder initialization; completed in FinishType.
-		t.Go = &ast.StarExpr{}
-		t.C.Set("<incomplete>*")
-		if _, ok := c.ptrs[dt.Type]; !ok {
-			c.ptrKeys = append(c.ptrKeys, dt.Type)
-		}
-		c.ptrs[dt.Type] = append(c.ptrs[dt.Type], t)
-
-	case *dwarf.QualType:
-		// Ignore qualifier.
-		t = c.Type(dt.Type, pos)
-		c.m[dtype] = t
-		return t
-
-	case *dwarf.StructType:
-		// Convert to Go struct, being careful about alignment.
-		// Have to give it a name to simulate C "struct foo" references.
-		tag := dt.StructName
-		if dt.ByteSize < 0 && tag == "" { // opaque unnamed struct - should not be possible
-			break
-		}
-		if tag == "" {
-			tag = "__" + strconv.Itoa(tagGen)
-			tagGen++
-		} else if t.C.Empty() {
-			t.C.Set(dt.Kind + " " + tag)
-		}
-		name := c.Ident("_Ctype_" + dt.Kind + "_" + tag)
-		t.Go = name // publish before recursive calls
-		goIdent[name.Name] = name
-		if dt.ByteSize < 0 {
-			// Size calculation in c.Struct/c.Opaque will die with size=-1 (unknown),
-			// so execute the basic things that the struct case would do
-			// other than try to determine a Go representation.
-			tt := *t
-			tt.C = &TypeRepr{"%s %s", []interface{}{dt.Kind, tag}}
-			tt.Go = c.Ident("struct{}")
-			typedef[name.Name] = &tt
-			break
-		}
-		switch dt.Kind {
-		case "class", "union":
-			t.Go = c.Opaque(t.Size)
-			if t.C.Empty() {
-				t.C.Set("__typeof__(unsigned char[%d])", t.Size)
-			}
-			t.Align = 1 // TODO: should probably base this on field alignment.
-			typedef[name.Name] = t
-		case "struct":
-			g, csyntax, align := c.Struct(dt, pos)
-			if t.C.Empty() {
-				t.C.Set(csyntax)
-			}
-			t.Align = align
-			tt := *t
-			if tag != "" {
-				tt.C = &TypeRepr{"struct %s", []interface{}{tag}}
-			}
-			tt.Go = g
-			typedef[name.Name] = &tt
-		}
-
-	case *dwarf.TypedefType:
-		// Record typedef for printing.
-		if dt.Name == "_GoString_" {
-			// Special C name for Go string type.
-			// Knows string layout used by compilers: pointer plus length,
-			// which rounds up to 2 pointers after alignment.
-			t.Go = c.string
-			t.Size = c.ptrSize * 2
-			t.Align = c.ptrSize
-			break
-		}
-		if dt.Name == "_GoBytes_" {
-			// Special C name for Go []byte type.
-			// Knows slice layout used by compilers: pointer, length, cap.
-			t.Go = c.Ident("[]byte")
-			t.Size = c.ptrSize + 4 + 4
-			t.Align = c.ptrSize
-			break
-		}
-		name := c.Ident("_Ctype_" + dt.Name)
-		goIdent[name.Name] = name
-		sub := c.Type(dt.Type, pos)
-		t.Go = name
-		t.Size = sub.Size
-		t.Align = sub.Align
-		oldType := typedef[name.Name]
-		if oldType == nil {
-			tt := *t
-			tt.Go = sub.Go
-			typedef[name.Name] = &tt
-		}
-
-		// If sub.Go.Name is "_Ctype_struct_foo" or "_Ctype_union_foo" or "_Ctype_class_foo",
-		// use that as the Go form for this typedef too, so that the typedef will be interchangeable
-		// with the base type.
-		// In -godefs mode, do this for all typedefs.
-		if isStructUnionClass(sub.Go) || *godefs {
-			t.Go = sub.Go
-
-			if isStructUnionClass(sub.Go) {
-				// Use the typedef name for C code.
-				typedef[sub.Go.(*ast.Ident).Name].C = t.C
-			}
-
-			// If we've seen this typedef before, and it
-			// was an anonymous struct/union/class before
-			// too, use the old definition.
-			// TODO: it would be safer to only do this if
-			// we verify that the types are the same.
-			if oldType != nil && isStructUnionClass(oldType.Go) {
-				t.Go = oldType.Go
-			}
-		}
-
-	case *dwarf.UcharType:
-		if t.Size != 1 {
-			fatalf("%s: unexpected: %d-byte uchar type - %s", lineno(pos), t.Size, dtype)
-		}
-		t.Go = c.uint8
-		t.Align = 1
-
-	case *dwarf.UintType:
-		if dt.BitSize > 0 {
-			fatalf("%s: unexpected: %d-bit uint type - %s", lineno(pos), dt.BitSize, dtype)
-		}
-		switch t.Size {
-		default:
-			fatalf("%s: unexpected: %d-byte uint type - %s", lineno(pos), t.Size, dtype)
-		case 1:
-			t.Go = c.uint8
-		case 2:
-			t.Go = c.uint16
-		case 4:
-			t.Go = c.uint32
-		case 8:
-			t.Go = c.uint64
-		}
-		if t.Align = t.Size; t.Align >= c.ptrSize {
-			t.Align = c.ptrSize
-		}
-
-	case *dwarf.VoidType:
-		t.Go = c.goVoid
-		t.C.Set("void")
-		t.Align = 1
-	}
-
-	switch dtype.(type) {
-	case *dwarf.AddrType, *dwarf.BoolType, *dwarf.CharType, *dwarf.IntType, *dwarf.FloatType, *dwarf.UcharType, *dwarf.UintType:
-		s := dtype.Common().Name
-		if s != "" {
-			if ss, ok := dwarfToName[s]; ok {
-				s = ss
-			}
-			s = strings.Join(strings.Split(s, " "), "") // strip spaces
-			name := c.Ident("_Ctype_" + s)
-			tt := *t
-			typedef[name.Name] = &tt
-			if !*godefs {
-				t.Go = name
-			}
-		}
-	}
-
-	if t.Size < 0 {
-		// Unsized types are [0]byte, unless they're typedefs of other types
-		// or structs with tags.
-		// if so, use the name we've already defined.
-		t.Size = 0
-		switch dt := dtype.(type) {
-		case *dwarf.TypedefType:
-			// ok
-		case *dwarf.StructType:
-			if dt.StructName != "" {
-				break
-			}
-			t.Go = c.Opaque(0)
-		default:
-			t.Go = c.Opaque(0)
-		}
-		if t.C.Empty() {
-			t.C.Set("void")
-		}
-	}
-
-	if t.C.Empty() {
-		fatalf("%s: internal error: did not create C name for %s", lineno(pos), dtype)
-	}
-
-	return t
-}
-
-// isStructUnionClass reports whether the type described by the Go syntax x
-// is a struct, union, or class with a tag.
-func isStructUnionClass(x ast.Expr) bool {
-	id, ok := x.(*ast.Ident)
-	if !ok {
-		return false
-	}
-	name := id.Name
-	return strings.HasPrefix(name, "_Ctype_struct_") ||
-		strings.HasPrefix(name, "_Ctype_union_") ||
-		strings.HasPrefix(name, "_Ctype_class_")
-}
-
-// FuncArg returns a Go type with the same memory layout as
-// dtype when used as the type of a C function argument.
-func (c *typeConv) FuncArg(dtype dwarf.Type, pos token.Pos) *Type {
-	t := c.Type(dtype, pos)
-	switch dt := dtype.(type) {
-	case *dwarf.ArrayType:
-		// Arrays are passed implicitly as pointers in C.
-		// In Go, we must be explicit.
-		tr := &TypeRepr{}
-		tr.Set("%s*", t.C)
-		return &Type{
-			Size:  c.ptrSize,
-			Align: c.ptrSize,
-			Go:    &ast.StarExpr{X: t.Go},
-			C:     tr,
-		}
-	case *dwarf.TypedefType:
-		// C has much more relaxed rules than Go for
-		// implicit type conversions.  When the parameter
-		// is type T defined as *X, simulate a little of the
-		// laxness of C by making the argument *X instead of T.
-		if ptr, ok := base(dt.Type).(*dwarf.PtrType); ok {
-			// Unless the typedef happens to point to void* since
-			// Go has special rules around using unsafe.Pointer.
-			if _, void := base(ptr.Type).(*dwarf.VoidType); void {
-				break
-			}
-
-			t = c.Type(ptr, pos)
-			if t == nil {
-				return nil
-			}
-
-			// Remember the C spelling, in case the struct
-			// has __attribute__((unavailable)) on it.  See issue 2888.
-			t.Typedef = dt.Name
-		}
-	}
-	return t
-}
-
-// FuncType returns the Go type analogous to dtype.
-// There is no guarantee about matching memory layout.
-func (c *typeConv) FuncType(dtype *dwarf.FuncType, pos token.Pos) *FuncType {
-	p := make([]*Type, len(dtype.ParamType))
-	gp := make([]*ast.Field, len(dtype.ParamType))
-	for i, f := range dtype.ParamType {
-		// gcc's DWARF generator outputs a single DotDotDotType parameter for
-		// function pointers that specify no parameters (e.g. void
-		// (*__cgo_0)()).  Treat this special case as void.  This case is
-		// invalid according to ISO C anyway (i.e. void (*__cgo_1)(...) is not
-		// legal).
-		if _, ok := f.(*dwarf.DotDotDotType); ok && i == 0 {
-			p, gp = nil, nil
-			break
-		}
-		p[i] = c.FuncArg(f, pos)
-		gp[i] = &ast.Field{Type: p[i].Go}
-	}
-	var r *Type
-	var gr []*ast.Field
-	if _, ok := dtype.ReturnType.(*dwarf.VoidType); ok {
-		gr = []*ast.Field{{Type: c.goVoid}}
-	} else if dtype.ReturnType != nil {
-		r = c.Type(dtype.ReturnType, pos)
-		gr = []*ast.Field{{Type: r.Go}}
-	}
-	return &FuncType{
-		Params: p,
-		Result: r,
-		Go: &ast.FuncType{
-			Params:  &ast.FieldList{List: gp},
-			Results: &ast.FieldList{List: gr},
-		},
-	}
-}
-
-// Identifier
-func (c *typeConv) Ident(s string) *ast.Ident {
-	return ast.NewIdent(s)
-}
-
-// Opaque type of n bytes.
-func (c *typeConv) Opaque(n int64) ast.Expr {
-	return &ast.ArrayType{
-		Len: c.intExpr(n),
-		Elt: c.byte,
-	}
-}
-
-// Expr for integer n.
-func (c *typeConv) intExpr(n int64) ast.Expr {
-	return &ast.BasicLit{
-		Kind:  token.INT,
-		Value: strconv.FormatInt(n, 10),
-	}
-}
-
-// Add padding of given size to fld.
-func (c *typeConv) pad(fld []*ast.Field, sizes []int64, size int64) ([]*ast.Field, []int64) {
-	n := len(fld)
-	fld = fld[0 : n+1]
-	fld[n] = &ast.Field{Names: []*ast.Ident{c.Ident("_")}, Type: c.Opaque(size)}
-	sizes = sizes[0 : n+1]
-	sizes[n] = size
-	return fld, sizes
-}
-
-// Struct conversion: return Go and (gc) C syntax for type.
-func (c *typeConv) Struct(dt *dwarf.StructType, pos token.Pos) (expr *ast.StructType, csyntax string, align int64) {
-	// Minimum alignment for a struct is 1 byte.
-	align = 1
-
-	var buf bytes.Buffer
-	buf.WriteString("struct {")
-	fld := make([]*ast.Field, 0, 2*len(dt.Field)+1) // enough for padding around every field
-	sizes := make([]int64, 0, 2*len(dt.Field)+1)
-	off := int64(0)
-
-	// Rename struct fields that happen to be named Go keywords into
-	// _{keyword}.  Create a map from C ident -> Go ident.  The Go ident will
-	// be mangled.  Any existing identifier that already has the same name on
-	// the C-side will cause the Go-mangled version to be prefixed with _.
-	// (e.g. in a struct with fields '_type' and 'type', the latter would be
-	// rendered as '__type' in Go).
-	ident := make(map[string]string)
-	used := make(map[string]bool)
-	for _, f := range dt.Field {
-		ident[f.Name] = f.Name
-		used[f.Name] = true
-	}
-
-	if !*godefs {
-		for cid, goid := range ident {
-			if token.Lookup(goid).IsKeyword() {
-				// Avoid keyword
-				goid = "_" + goid
-
-				// Also avoid existing fields
-				for _, exist := used[goid]; exist; _, exist = used[goid] {
-					goid = "_" + goid
-				}
-
-				used[goid] = true
-				ident[cid] = goid
-			}
-		}
-	}
-
-	anon := 0
-	for _, f := range dt.Field {
-		if f.ByteOffset > off {
-			fld, sizes = c.pad(fld, sizes, f.ByteOffset-off)
-			off = f.ByteOffset
-		}
-
-		name := f.Name
-		ft := f.Type
-
-		// In godefs mode, if this field is a C11
-		// anonymous union then treat the first field in the
-		// union as the field in the struct.  This handles
-		// cases like the glibc <sys/resource.h> file; see
-		// issue 6677.
-		if *godefs {
-			if st, ok := f.Type.(*dwarf.StructType); ok && name == "" && st.Kind == "union" && len(st.Field) > 0 && !used[st.Field[0].Name] {
-				name = st.Field[0].Name
-				ident[name] = name
-				ft = st.Field[0].Type
-			}
-		}
-
-		// TODO: Handle fields that are anonymous structs by
-		// promoting the fields of the inner struct.
-
-		t := c.Type(ft, pos)
-		tgo := t.Go
-		size := t.Size
-		talign := t.Align
-		if f.BitSize > 0 {
-			if f.BitSize%8 != 0 {
-				continue
-			}
-			size = f.BitSize / 8
-			name := tgo.(*ast.Ident).String()
-			if strings.HasPrefix(name, "int") {
-				name = "int"
-			} else {
-				name = "uint"
-			}
-			tgo = ast.NewIdent(name + fmt.Sprint(f.BitSize))
-			talign = size
-		}
-
-		if talign > 0 && f.ByteOffset%talign != 0 {
-			// Drop misaligned fields, the same way we drop integer bit fields.
-			// The goal is to make available what can be made available.
-			// Otherwise one bad and unneeded field in an otherwise okay struct
-			// makes the whole program not compile. Much of the time these
-			// structs are in system headers that cannot be corrected.
-			continue
-		}
-		n := len(fld)
-		fld = fld[0 : n+1]
-		if name == "" {
-			name = fmt.Sprintf("anon%d", anon)
-			anon++
-			ident[name] = name
-		}
-		fld[n] = &ast.Field{Names: []*ast.Ident{c.Ident(ident[name])}, Type: tgo}
-		sizes = sizes[0 : n+1]
-		sizes[n] = size
-		off += size
-		buf.WriteString(t.C.String())
-		buf.WriteString(" ")
-		buf.WriteString(name)
-		buf.WriteString("; ")
-		if talign > align {
-			align = talign
-		}
-	}
-	if off < dt.ByteSize {
-		fld, sizes = c.pad(fld, sizes, dt.ByteSize-off)
-		off = dt.ByteSize
-	}
-
-	// If the last field in a non-zero-sized struct is zero-sized
-	// the compiler is going to pad it by one (see issue 9401).
-	// We can't permit that, because then the size of the Go
-	// struct will not be the same as the size of the C struct.
-	// Our only option in such a case is to remove the field,
-	// which means that it can not be referenced from Go.
-	for off > 0 && sizes[len(sizes)-1] == 0 {
-		n := len(sizes)
-		fld = fld[0 : n-1]
-		sizes = sizes[0 : n-1]
-	}
-
-	if off != dt.ByteSize {
-		fatalf("%s: struct size calculation error off=%d bytesize=%d", lineno(pos), off, dt.ByteSize)
-	}
-	buf.WriteString("}")
-	csyntax = buf.String()
-
-	if *godefs {
-		godefsFields(fld)
-	}
-	expr = &ast.StructType{Fields: &ast.FieldList{List: fld}}
-	return
-}
-
-func upper(s string) string {
-	if s == "" {
-		return ""
-	}
-	r, size := utf8.DecodeRuneInString(s)
-	if r == '_' {
-		return "X" + s
-	}
-	return string(unicode.ToUpper(r)) + s[size:]
-}
-
-// godefsFields rewrites field names for use in Go or C definitions.
-// It strips leading common prefixes (like tv_ in tv_sec, tv_usec)
-// converts names to upper case, and rewrites _ into Pad_godefs_n,
-// so that all fields are exported.
-func godefsFields(fld []*ast.Field) {
-	prefix := fieldPrefix(fld)
-	npad := 0
-	for _, f := range fld {
-		for _, n := range f.Names {
-			if n.Name != prefix {
-				n.Name = strings.TrimPrefix(n.Name, prefix)
-			}
-			if n.Name == "_" {
-				// Use exported name instead.
-				n.Name = "Pad_cgo_" + strconv.Itoa(npad)
-				npad++
-			}
-			n.Name = upper(n.Name)
-		}
-	}
-}
-
-// fieldPrefix returns the prefix that should be removed from all the
-// field names when generating the C or Go code.  For generated
-// C, we leave the names as is (tv_sec, tv_usec), since that's what
-// people are used to seeing in C.  For generated Go code, such as
-// package syscall's data structures, we drop a common prefix
-// (so sec, usec, which will get turned into Sec, Usec for exporting).
-func fieldPrefix(fld []*ast.Field) string {
-	prefix := ""
-	for _, f := range fld {
-		for _, n := range f.Names {
-			// Ignore field names that don't have the prefix we're
-			// looking for.  It is common in C headers to have fields
-			// named, say, _pad in an otherwise prefixed header.
-			// If the struct has 3 fields tv_sec, tv_usec, _pad1, then we
-			// still want to remove the tv_ prefix.
-			// The check for "orig_" here handles orig_eax in the
-			// x86 ptrace register sets, which otherwise have all fields
-			// with reg_ prefixes.
-			if strings.HasPrefix(n.Name, "orig_") || strings.HasPrefix(n.Name, "_") {
-				continue
-			}
-			i := strings.Index(n.Name, "_")
-			if i < 0 {
-				continue
-			}
-			if prefix == "" {
-				prefix = n.Name[:i+1]
-			} else if prefix != n.Name[:i+1] {
-				return ""
-			}
-		}
-	}
-	return prefix
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/cgo/godefs.go b/third_party/gofrontend/libgo/go/cmd/cgo/godefs.go
deleted file mode 100644
index 1b0ece2..0000000
--- a/third_party/gofrontend/libgo/go/cmd/cgo/godefs.go
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/printer"
-	"go/token"
-	"os"
-	"strings"
-)
-
-// godefs returns the output for -godefs mode.
-func (p *Package) godefs(f *File, srcfile string) string {
-	var buf bytes.Buffer
-
-	fmt.Fprintf(&buf, "// Created by cgo -godefs - DO NOT EDIT\n")
-	fmt.Fprintf(&buf, "// %s\n", strings.Join(os.Args, " "))
-	fmt.Fprintf(&buf, "\n")
-
-	override := make(map[string]string)
-
-	// Allow source file to specify override mappings.
-	// For example, the socket data structures refer
-	// to in_addr and in_addr6 structs but we want to be
-	// able to treat them as byte arrays, so the godefs
-	// inputs in package syscall say
-	//
-	//	// +godefs map struct_in_addr [4]byte
-	//	// +godefs map struct_in_addr6 [16]byte
-	//
-	for _, g := range f.Comments {
-		for _, c := range g.List {
-			i := strings.Index(c.Text, "+godefs map")
-			if i < 0 {
-				continue
-			}
-			s := strings.TrimSpace(c.Text[i+len("+godefs map"):])
-			i = strings.Index(s, " ")
-			if i < 0 {
-				fmt.Fprintf(os.Stderr, "invalid +godefs map comment: %s\n", c.Text)
-				continue
-			}
-			override["_Ctype_"+strings.TrimSpace(s[:i])] = strings.TrimSpace(s[i:])
-		}
-	}
-	for _, n := range f.Name {
-		if s := override[n.Go]; s != "" {
-			override[n.Mangle] = s
-		}
-	}
-
-	// Otherwise, if the source file says type T C.whatever,
-	// use "T" as the mangling of C.whatever,
-	// except in the definition (handled at end of function).
-	refName := make(map[*ast.Expr]*Name)
-	for _, r := range f.Ref {
-		refName[r.Expr] = r.Name
-	}
-	for _, d := range f.AST.Decls {
-		d, ok := d.(*ast.GenDecl)
-		if !ok || d.Tok != token.TYPE {
-			continue
-		}
-		for _, s := range d.Specs {
-			s := s.(*ast.TypeSpec)
-			n := refName[&s.Type]
-			if n != nil && n.Mangle != "" {
-				override[n.Mangle] = s.Name.Name
-			}
-		}
-	}
-
-	// Extend overrides using typedefs:
-	// If we know that C.xxx should format as T
-	// and xxx is a typedef for yyy, make C.yyy format as T.
-	for typ, def := range typedef {
-		if new := override[typ]; new != "" {
-			if id, ok := def.Go.(*ast.Ident); ok {
-				override[id.Name] = new
-			}
-		}
-	}
-
-	// Apply overrides.
-	for old, new := range override {
-		if id := goIdent[old]; id != nil {
-			id.Name = new
-		}
-	}
-
-	// Any names still using the _C syntax are not going to compile,
-	// although in general we don't know whether they all made it
-	// into the file, so we can't warn here.
-	//
-	// The most common case is union types, which begin with
-	// _Ctype_union and for which typedef[name] is a Go byte
-	// array of the appropriate size (such as [4]byte).
-	// Substitute those union types with byte arrays.
-	for name, id := range goIdent {
-		if id.Name == name && strings.Contains(name, "_Ctype_union") {
-			if def := typedef[name]; def != nil {
-				id.Name = gofmt(def)
-			}
-		}
-	}
-
-	conf.Fprint(&buf, fset, f.AST)
-
-	return buf.String()
-}
-
-var gofmtBuf bytes.Buffer
-
-// gofmt returns the gofmt-formatted string for an AST node.
-func gofmt(n interface{}) string {
-	gofmtBuf.Reset()
-	err := printer.Fprint(&gofmtBuf, fset, n)
-	if err != nil {
-		return "<" + err.Error() + ">"
-	}
-	return gofmtBuf.String()
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/cgo/main.go b/third_party/gofrontend/libgo/go/cmd/cgo/main.go
deleted file mode 100644
index c8cd161..0000000
--- a/third_party/gofrontend/libgo/go/cmd/cgo/main.go
+++ /dev/null
@@ -1,380 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Cgo; see gmp.go for an overview.
-
-// TODO(rsc):
-//	Emit correct line number annotations.
-//	Make gc understand the annotations.
-
-package main
-
-import (
-	"crypto/md5"
-	"flag"
-	"fmt"
-	"go/ast"
-	"go/printer"
-	"go/token"
-	"io"
-	"os"
-	"path/filepath"
-	"reflect"
-	"runtime"
-	"sort"
-	"strings"
-)
-
-// A Package collects information about the package we're going to write.
-type Package struct {
-	PackageName string // name of package
-	PackagePath string
-	PtrSize     int64
-	IntSize     int64
-	GccOptions  []string
-	GccIsClang  bool
-	CgoFlags    map[string][]string // #cgo flags (CFLAGS, LDFLAGS)
-	Written     map[string]bool
-	Name        map[string]*Name // accumulated Name from Files
-	ExpFunc     []*ExpFunc       // accumulated ExpFunc from Files
-	Decl        []ast.Decl
-	GoFiles     []string // list of Go files
-	GccFiles    []string // list of gcc output files
-	Preamble    string   // collected preamble for _cgo_export.h
-}
-
-// A File collects information about a single Go input file.
-type File struct {
-	AST      *ast.File           // parsed AST
-	Comments []*ast.CommentGroup // comments from file
-	Package  string              // Package name
-	Preamble string              // C preamble (doc comment on import "C")
-	Ref      []*Ref              // all references to C.xxx in AST
-	ExpFunc  []*ExpFunc          // exported functions for this file
-	Name     map[string]*Name    // map from Go name to Name
-}
-
-func nameKeys(m map[string]*Name) []string {
-	var ks []string
-	for k := range m {
-		ks = append(ks, k)
-	}
-	sort.Strings(ks)
-	return ks
-}
-
-// A Ref refers to an expression of the form C.xxx in the AST.
-type Ref struct {
-	Name    *Name
-	Expr    *ast.Expr
-	Context string // "type", "expr", "call", or "call2"
-}
-
-func (r *Ref) Pos() token.Pos {
-	return (*r.Expr).Pos()
-}
-
-// A Name collects information about C.xxx.
-type Name struct {
-	Go       string // name used in Go referring to package C
-	Mangle   string // name used in generated Go
-	C        string // name used in C
-	Define   string // #define expansion
-	Kind     string // "const", "type", "var", "fpvar", "func", "not-type"
-	Type     *Type  // the type of xxx
-	FuncType *FuncType
-	AddError bool
-	Const    string // constant definition
-}
-
-// IsVar reports whether Kind is either "var" or "fpvar"
-func (n *Name) IsVar() bool {
-	return n.Kind == "var" || n.Kind == "fpvar"
-}
-
-// A ExpFunc is an exported function, callable from C.
-// Such functions are identified in the Go input file
-// by doc comments containing the line //export ExpName
-type ExpFunc struct {
-	Func    *ast.FuncDecl
-	ExpName string // name to use from C
-	Doc     string
-}
-
-// A TypeRepr contains the string representation of a type.
-type TypeRepr struct {
-	Repr       string
-	FormatArgs []interface{}
-}
-
-// A Type collects information about a type in both the C and Go worlds.
-type Type struct {
-	Size       int64
-	Align      int64
-	C          *TypeRepr
-	Go         ast.Expr
-	EnumValues map[string]int64
-	Typedef    string
-}
-
-// A FuncType collects information about a function type in both the C and Go worlds.
-type FuncType struct {
-	Params []*Type
-	Result *Type
-	Go     *ast.FuncType
-}
-
-func usage() {
-	fmt.Fprint(os.Stderr, "usage: cgo -- [compiler options] file.go ...\n")
-	flag.PrintDefaults()
-	os.Exit(2)
-}
-
-var ptrSizeMap = map[string]int64{
-	"386":     4,
-	"alpha":   8,
-	"amd64":   8,
-	"arm":     4,
-	"arm64":   8,
-	"m68k":    4,
-	"mipso32": 4,
-	"mipsn32": 4,
-	"mipso64": 8,
-	"mipsn64": 8,
-	"ppc":     4,
-	"ppc64":   8,
-	"ppc64le": 8,
-	"s390":    4,
-	"s390x":   8,
-	"sparc":   4,
-	"sparc64": 8,
-}
-
-var intSizeMap = map[string]int64{
-	"386":     4,
-	"alpha":   8,
-	"amd64":   8,
-	"arm":     4,
-	"arm64":   8,
-	"m68k":    4,
-	"mipso32": 4,
-	"mipsn32": 4,
-	"mipso64": 8,
-	"mipsn64": 8,
-	"ppc":     4,
-	"ppc64":   8,
-	"ppc64le": 8,
-	"s390":    4,
-	"s390x":   8,
-	"sparc":   4,
-	"sparc64": 8,
-}
-
-var cPrefix string
-
-var fset = token.NewFileSet()
-
-var dynobj = flag.String("dynimport", "", "if non-empty, print dynamic import data for that file")
-var dynout = flag.String("dynout", "", "write -dynimport output to this file")
-var dynpackage = flag.String("dynpackage", "main", "set Go package for -dynimport output")
-var dynlinker = flag.Bool("dynlinker", false, "record dynamic linker information in -dynimport mode")
-
-// This flag is for bootstrapping a new Go implementation,
-// to generate Go types that match the data layout and
-// constant values used in the host's C libraries and system calls.
-var godefs = flag.Bool("godefs", false, "for bootstrap: write Go definitions for C file to standard output")
-
-var objDir = flag.String("objdir", "", "object directory")
-var importPath = flag.String("importpath", "", "import path of package being built (for comments in generated files)")
-var exportHeader = flag.String("exportheader", "", "where to write export header if any exported functions")
-
-var gccgo = flag.Bool("gccgo", false, "generate files for use with gccgo")
-var gccgoprefix = flag.String("gccgoprefix", "", "-fgo-prefix option used with gccgo")
-var gccgopkgpath = flag.String("gccgopkgpath", "", "-fgo-pkgpath option used with gccgo")
-var importRuntimeCgo = flag.Bool("import_runtime_cgo", true, "import runtime/cgo in generated code")
-var importSyscall = flag.Bool("import_syscall", true, "import syscall in generated code")
-var goarch, goos string
-
-func main() {
-	flag.Usage = usage
-	flag.Parse()
-
-	if *dynobj != "" {
-		// cgo -dynimport is essentially a separate helper command
-		// built into the cgo binary.  It scans a gcc-produced executable
-		// and dumps information about the imported symbols and the
-		// imported libraries.  The 'go build' rules for cgo prepare an
-		// appropriate executable and then use its import information
-		// instead of needing to make the linkers duplicate all the
-		// specialized knowledge gcc has about where to look for imported
-		// symbols and which ones to use.
-		dynimport(*dynobj)
-		return
-	}
-
-	if *godefs {
-		// Generating definitions pulled from header files,
-		// to be checked into Go repositories.
-		// Line numbers are just noise.
-		conf.Mode &^= printer.SourcePos
-	}
-
-	args := flag.Args()
-	if len(args) < 1 {
-		usage()
-	}
-
-	// Find first arg that looks like a go file and assume everything before
-	// that are options to pass to gcc.
-	var i int
-	for i = len(args); i > 0; i-- {
-		if !strings.HasSuffix(args[i-1], ".go") {
-			break
-		}
-	}
-	if i == len(args) {
-		usage()
-	}
-
-	goFiles := args[i:]
-
-	p := newPackage(args[:i])
-
-	// Record CGO_LDFLAGS from the environment for external linking.
-	if ldflags := os.Getenv("CGO_LDFLAGS"); ldflags != "" {
-		args, err := splitQuoted(ldflags)
-		if err != nil {
-			fatalf("bad CGO_LDFLAGS: %q (%s)", ldflags, err)
-		}
-		p.addToFlag("LDFLAGS", args)
-	}
-
-	// Need a unique prefix for the global C symbols that
-	// we use to coordinate between gcc and ourselves.
-	// We already put _cgo_ at the beginning, so the main
-	// concern is other cgo wrappers for the same functions.
-	// Use the beginning of the md5 of the input to disambiguate.
-	h := md5.New()
-	for _, input := range goFiles {
-		f, err := os.Open(input)
-		if err != nil {
-			fatalf("%s", err)
-		}
-		io.Copy(h, f)
-		f.Close()
-	}
-	cPrefix = fmt.Sprintf("_%x", h.Sum(nil)[0:6])
-
-	fs := make([]*File, len(goFiles))
-	for i, input := range goFiles {
-		f := new(File)
-		f.ReadGo(input)
-		f.DiscardCgoDirectives()
-		fs[i] = f
-	}
-
-	if *objDir == "" {
-		// make sure that _obj directory exists, so that we can write
-		// all the output files there.
-		os.Mkdir("_obj", 0777)
-		*objDir = "_obj"
-	}
-	*objDir += string(filepath.Separator)
-
-	for i, input := range goFiles {
-		f := fs[i]
-		p.Translate(f)
-		for _, cref := range f.Ref {
-			switch cref.Context {
-			case "call", "call2":
-				if cref.Name.Kind != "type" {
-					break
-				}
-				*cref.Expr = cref.Name.Type.Go
-			}
-		}
-		if nerrors > 0 {
-			os.Exit(2)
-		}
-		pkg := f.Package
-		if dir := os.Getenv("CGOPKGPATH"); dir != "" {
-			pkg = filepath.Join(dir, pkg)
-		}
-		p.PackagePath = pkg
-		p.Record(f)
-		if *godefs {
-			os.Stdout.WriteString(p.godefs(f, input))
-		} else {
-			p.writeOutput(f, input)
-		}
-	}
-
-	if !*godefs {
-		p.writeDefs()
-	}
-	if nerrors > 0 {
-		os.Exit(2)
-	}
-}
-
-// newPackage returns a new Package that will invoke
-// gcc with the additional arguments specified in args.
-func newPackage(args []string) *Package {
-	goarch = runtime.GOARCH
-	if s := os.Getenv("GOARCH"); s != "" {
-		goarch = s
-	}
-	goos = runtime.GOOS
-	if s := os.Getenv("GOOS"); s != "" {
-		goos = s
-	}
-	ptrSize := ptrSizeMap[goarch]
-	if ptrSize == 0 {
-		fatalf("unknown ptrSize for $GOARCH %q", goarch)
-	}
-	intSize := intSizeMap[goarch]
-	if intSize == 0 {
-		fatalf("unknown intSize for $GOARCH %q", goarch)
-	}
-
-	// Reset locale variables so gcc emits English errors [sic].
-	os.Setenv("LANG", "en_US.UTF-8")
-	os.Setenv("LC_ALL", "C")
-
-	p := &Package{
-		PtrSize:  ptrSize,
-		IntSize:  intSize,
-		CgoFlags: make(map[string][]string),
-		Written:  make(map[string]bool),
-	}
-	p.addToFlag("CFLAGS", args)
-	return p
-}
-
-// Record what needs to be recorded about f.
-func (p *Package) Record(f *File) {
-	if p.PackageName == "" {
-		p.PackageName = f.Package
-	} else if p.PackageName != f.Package {
-		error_(token.NoPos, "inconsistent package names: %s, %s", p.PackageName, f.Package)
-	}
-
-	if p.Name == nil {
-		p.Name = f.Name
-	} else {
-		for k, v := range f.Name {
-			if p.Name[k] == nil {
-				p.Name[k] = v
-			} else if !reflect.DeepEqual(p.Name[k], v) {
-				error_(token.NoPos, "inconsistent definitions for C.%s", fixGo(k))
-			}
-		}
-	}
-
-	if f.ExpFunc != nil {
-		p.ExpFunc = append(p.ExpFunc, f.ExpFunc...)
-		p.Preamble += "\n" + f.Preamble
-	}
-	p.Decl = append(p.Decl, f.AST.Decls...)
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/cgo/out.go b/third_party/gofrontend/libgo/go/cmd/cgo/out.go
deleted file mode 100644
index 90a7441..0000000
--- a/third_party/gofrontend/libgo/go/cmd/cgo/out.go
+++ /dev/null
@@ -1,1419 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bytes"
-	"debug/elf"
-	"debug/macho"
-	"debug/pe"
-	"fmt"
-	"go/ast"
-	"go/printer"
-	"go/token"
-	"io"
-	"os"
-	"sort"
-	"strings"
-)
-
-var conf = printer.Config{Mode: printer.SourcePos, Tabwidth: 8}
-
-// writeDefs creates output files to be compiled by gc and gcc.
-func (p *Package) writeDefs() {
-	var fgo2, fc io.Writer
-	f := creat(*objDir + "_cgo_gotypes.go")
-	defer f.Close()
-	fgo2 = f
-	if *gccgo {
-		f := creat(*objDir + "_cgo_defun.c")
-		defer f.Close()
-		fc = f
-	}
-	fm := creat(*objDir + "_cgo_main.c")
-
-	var gccgoInit bytes.Buffer
-
-	fflg := creat(*objDir + "_cgo_flags")
-	for k, v := range p.CgoFlags {
-		fmt.Fprintf(fflg, "_CGO_%s=%s\n", k, strings.Join(v, " "))
-		if k == "LDFLAGS" && !*gccgo {
-			for _, arg := range v {
-				fmt.Fprintf(fgo2, "//go:cgo_ldflag %q\n", arg)
-			}
-		}
-	}
-	fflg.Close()
-
-	// Write C main file for using gcc to resolve imports.
-	fmt.Fprintf(fm, "int main() { return 0; }\n")
-	if *importRuntimeCgo {
-		fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*, int), void *a, int c) { }\n")
-		fmt.Fprintf(fm, "void _cgo_wait_runtime_init_done() { }\n")
-		fmt.Fprintf(fm, "char* _cgo_topofstack(void) { return (char*)0; }\n")
-	} else {
-		// If we're not importing runtime/cgo, we *are* runtime/cgo,
-		// which provides these functions.  We just need a prototype.
-		fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*, int), void *a, int c);\n")
-		fmt.Fprintf(fm, "void _cgo_wait_runtime_init_done();\n")
-	}
-	fmt.Fprintf(fm, "void _cgo_allocate(void *a, int c) { }\n")
-	fmt.Fprintf(fm, "void _cgo_panic(void *a, int c) { }\n")
-	fmt.Fprintf(fm, "void _cgo_reginit(void) { }\n")
-
-	// Write second Go output: definitions of _C_xxx.
-	// In a separate file so that the import of "unsafe" does not
-	// pollute the original file.
-	fmt.Fprintf(fgo2, "// Created by cgo - DO NOT EDIT\n\n")
-	fmt.Fprintf(fgo2, "package %s\n\n", p.PackageName)
-	fmt.Fprintf(fgo2, "import \"unsafe\"\n\n")
-	if !*gccgo && *importRuntimeCgo {
-		fmt.Fprintf(fgo2, "import _ \"runtime/cgo\"\n\n")
-	}
-	if *importSyscall {
-		fmt.Fprintf(fgo2, "import \"syscall\"\n\n")
-		fmt.Fprintf(fgo2, "var _ syscall.Errno\n")
-	}
-	fmt.Fprintf(fgo2, "func _Cgo_ptr(ptr unsafe.Pointer) unsafe.Pointer { return ptr }\n\n")
-
-	if !*gccgo {
-		fmt.Fprintf(fgo2, "//go:linkname _Cgo_always_false runtime.cgoAlwaysFalse\n")
-		fmt.Fprintf(fgo2, "var _Cgo_always_false bool\n")
-		fmt.Fprintf(fgo2, "//go:linkname _Cgo_use runtime.cgoUse\n")
-		fmt.Fprintf(fgo2, "func _Cgo_use(interface{})\n")
-	}
-
-	typedefNames := make([]string, 0, len(typedef))
-	for name := range typedef {
-		typedefNames = append(typedefNames, name)
-	}
-	sort.Strings(typedefNames)
-	for _, name := range typedefNames {
-		def := typedef[name]
-		fmt.Fprintf(fgo2, "type %s ", name)
-		conf.Fprint(fgo2, fset, def.Go)
-		fmt.Fprintf(fgo2, "\n\n")
-	}
-	if *gccgo {
-		fmt.Fprintf(fgo2, "type _Ctype_void byte\n")
-	} else {
-		fmt.Fprintf(fgo2, "type _Ctype_void [0]byte\n")
-	}
-
-	if *gccgo {
-		fmt.Fprint(fc, p.cPrologGccgo())
-	} else {
-		fmt.Fprint(fgo2, goProlog)
-	}
-
-	gccgoSymbolPrefix := p.gccgoSymbolPrefix()
-
-	cVars := make(map[string]bool)
-	for _, key := range nameKeys(p.Name) {
-		n := p.Name[key]
-		if !n.IsVar() {
-			continue
-		}
-
-		if !cVars[n.C] {
-			if *gccgo {
-				fmt.Fprintf(fc, "extern byte *%s;\n", n.C)
-			} else {
-				fmt.Fprintf(fm, "extern char %s[];\n", n.C)
-				fmt.Fprintf(fm, "void *_cgohack_%s = %s;\n\n", n.C, n.C)
-				fmt.Fprintf(fgo2, "//go:linkname __cgo_%s %s\n", n.C, n.C)
-				fmt.Fprintf(fgo2, "//go:cgo_import_static %s\n", n.C)
-				fmt.Fprintf(fgo2, "var __cgo_%s byte\n", n.C)
-			}
-			cVars[n.C] = true
-		}
-
-		var node ast.Node
-		if n.Kind == "var" {
-			node = &ast.StarExpr{X: n.Type.Go}
-		} else if n.Kind == "fpvar" {
-			node = n.Type.Go
-		} else {
-			panic(fmt.Errorf("invalid var kind %q", n.Kind))
-		}
-		if *gccgo {
-			fmt.Fprintf(fc, `extern void *%s __asm__("%s.%s");`, n.Mangle, gccgoSymbolPrefix, n.Mangle)
-			fmt.Fprintf(&gccgoInit, "\t%s = &%s;\n", n.Mangle, n.C)
-			fmt.Fprintf(fc, "\n")
-		}
-
-		fmt.Fprintf(fgo2, "var %s ", n.Mangle)
-		conf.Fprint(fgo2, fset, node)
-		if !*gccgo {
-			fmt.Fprintf(fgo2, " = (")
-			conf.Fprint(fgo2, fset, node)
-			fmt.Fprintf(fgo2, ")(unsafe.Pointer(&__cgo_%s))", n.C)
-		}
-		fmt.Fprintf(fgo2, "\n")
-	}
-	if *gccgo {
-		fmt.Fprintf(fc, "\n")
-	}
-
-	for _, key := range nameKeys(p.Name) {
-		n := p.Name[key]
-		if n.Const != "" {
-			fmt.Fprintf(fgo2, "const _Cconst_%s = %s\n", n.Go, n.Const)
-		}
-	}
-	fmt.Fprintf(fgo2, "\n")
-
-	for _, key := range nameKeys(p.Name) {
-		n := p.Name[key]
-		if n.FuncType != nil {
-			p.writeDefsFunc(fgo2, n)
-		}
-	}
-
-	fgcc := creat(*objDir + "_cgo_export.c")
-	fgcch := creat(*objDir + "_cgo_export.h")
-	if *gccgo {
-		p.writeGccgoExports(fgo2, fm, fgcc, fgcch)
-	} else {
-		p.writeExports(fgo2, fm, fgcc, fgcch)
-	}
-	if err := fgcc.Close(); err != nil {
-		fatalf("%s", err)
-	}
-	if err := fgcch.Close(); err != nil {
-		fatalf("%s", err)
-	}
-
-	if *exportHeader != "" && len(p.ExpFunc) > 0 {
-		fexp := creat(*exportHeader)
-		fgcch, err := os.Open(*objDir + "_cgo_export.h")
-		if err != nil {
-			fatalf("%s", err)
-		}
-		_, err = io.Copy(fexp, fgcch)
-		if err != nil {
-			fatalf("%s", err)
-		}
-		if err = fexp.Close(); err != nil {
-			fatalf("%s", err)
-		}
-	}
-
-	init := gccgoInit.String()
-	if init != "" {
-		fmt.Fprintln(fc, "static void init(void) __attribute__ ((constructor));")
-		fmt.Fprintln(fc, "static void init(void) {")
-		fmt.Fprint(fc, init)
-		fmt.Fprintln(fc, "}")
-	}
-}
-
-func dynimport(obj string) {
-	stdout := os.Stdout
-	if *dynout != "" {
-		f, err := os.Create(*dynout)
-		if err != nil {
-			fatalf("%s", err)
-		}
-		stdout = f
-	}
-
-	fmt.Fprintf(stdout, "package %s\n", *dynpackage)
-
-	if f, err := elf.Open(obj); err == nil {
-		if *dynlinker {
-			// Emit the cgo_dynamic_linker line.
-			if sec := f.Section(".interp"); sec != nil {
-				if data, err := sec.Data(); err == nil && len(data) > 1 {
-					// skip trailing \0 in data
-					fmt.Fprintf(stdout, "//go:cgo_dynamic_linker %q\n", string(data[:len(data)-1]))
-				}
-			}
-		}
-		sym, err := f.ImportedSymbols()
-		if err != nil {
-			fatalf("cannot load imported symbols from ELF file %s: %v", obj, err)
-		}
-		for _, s := range sym {
-			targ := s.Name
-			if s.Version != "" {
-				targ += "#" + s.Version
-			}
-			fmt.Fprintf(stdout, "//go:cgo_import_dynamic %s %s %q\n", s.Name, targ, s.Library)
-		}
-		lib, err := f.ImportedLibraries()
-		if err != nil {
-			fatalf("cannot load imported libraries from ELF file %s: %v", obj, err)
-		}
-		for _, l := range lib {
-			fmt.Fprintf(stdout, "//go:cgo_import_dynamic _ _ %q\n", l)
-		}
-		return
-	}
-
-	if f, err := macho.Open(obj); err == nil {
-		sym, err := f.ImportedSymbols()
-		if err != nil {
-			fatalf("cannot load imported symbols from Mach-O file %s: %v", obj, err)
-		}
-		for _, s := range sym {
-			if len(s) > 0 && s[0] == '_' {
-				s = s[1:]
-			}
-			fmt.Fprintf(stdout, "//go:cgo_import_dynamic %s %s %q\n", s, s, "")
-		}
-		lib, err := f.ImportedLibraries()
-		if err != nil {
-			fatalf("cannot load imported libraries from Mach-O file %s: %v", obj, err)
-		}
-		for _, l := range lib {
-			fmt.Fprintf(stdout, "//go:cgo_import_dynamic _ _ %q\n", l)
-		}
-		return
-	}
-
-	if f, err := pe.Open(obj); err == nil {
-		sym, err := f.ImportedSymbols()
-		if err != nil {
-			fatalf("cannot load imported symbols from PE file %s: %v", obj, err)
-		}
-		for _, s := range sym {
-			ss := strings.Split(s, ":")
-			name := strings.Split(ss[0], "@")[0]
-			fmt.Fprintf(stdout, "//go:cgo_import_dynamic %s %s %q\n", name, ss[0], strings.ToLower(ss[1]))
-		}
-		return
-	}
-
-	fatalf("cannot parse %s as ELF, Mach-O or PE", obj)
-}
-
-// Construct a gcc struct matching the gc argument frame.
-// Assumes that in gcc, char is 1 byte, short 2 bytes, int 4 bytes, long long 8 bytes.
-// These assumptions are checked by the gccProlog.
-// Also assumes that gc convention is to word-align the
-// input and output parameters.
-func (p *Package) structType(n *Name) (string, int64) {
-	var buf bytes.Buffer
-	fmt.Fprint(&buf, "struct {\n")
-	off := int64(0)
-	for i, t := range n.FuncType.Params {
-		if off%t.Align != 0 {
-			pad := t.Align - off%t.Align
-			fmt.Fprintf(&buf, "\t\tchar __pad%d[%d];\n", off, pad)
-			off += pad
-		}
-		c := t.Typedef
-		if c == "" {
-			c = t.C.String()
-		}
-		fmt.Fprintf(&buf, "\t\t%s p%d;\n", c, i)
-		off += t.Size
-	}
-	if off%p.PtrSize != 0 {
-		pad := p.PtrSize - off%p.PtrSize
-		fmt.Fprintf(&buf, "\t\tchar __pad%d[%d];\n", off, pad)
-		off += pad
-	}
-	if t := n.FuncType.Result; t != nil {
-		if off%t.Align != 0 {
-			pad := t.Align - off%t.Align
-			fmt.Fprintf(&buf, "\t\tchar __pad%d[%d];\n", off, pad)
-			off += pad
-		}
-		qual := ""
-		if c := t.C.String(); c[len(c)-1] == '*' {
-			qual = "const "
-		}
-		fmt.Fprintf(&buf, "\t\t%s%s r;\n", qual, t.C)
-		off += t.Size
-	}
-	if off%p.PtrSize != 0 {
-		pad := p.PtrSize - off%p.PtrSize
-		fmt.Fprintf(&buf, "\t\tchar __pad%d[%d];\n", off, pad)
-		off += pad
-	}
-	if off == 0 {
-		fmt.Fprintf(&buf, "\t\tchar unused;\n") // avoid empty struct
-	}
-	fmt.Fprintf(&buf, "\t}")
-	return buf.String(), off
-}
-
-func (p *Package) writeDefsFunc(fgo2 io.Writer, n *Name) {
-	name := n.Go
-	gtype := n.FuncType.Go
-	void := gtype.Results == nil || len(gtype.Results.List) == 0
-	if n.AddError {
-		// Add "error" to return type list.
-		// Type list is known to be 0 or 1 element - it's a C function.
-		err := &ast.Field{Type: ast.NewIdent("error")}
-		l := gtype.Results.List
-		if len(l) == 0 {
-			l = []*ast.Field{err}
-		} else {
-			l = []*ast.Field{l[0], err}
-		}
-		t := new(ast.FuncType)
-		*t = *gtype
-		t.Results = &ast.FieldList{List: l}
-		gtype = t
-	}
-
-	// Go func declaration.
-	d := &ast.FuncDecl{
-		Name: ast.NewIdent(n.Mangle),
-		Type: gtype,
-	}
-
-	// Builtins defined in the C prolog.
-	inProlog := builtinDefs[name] != ""
-	cname := fmt.Sprintf("_cgo%s%s", cPrefix, n.Mangle)
-	paramnames := []string(nil)
-	for i, param := range d.Type.Params.List {
-		paramName := fmt.Sprintf("p%d", i)
-		param.Names = []*ast.Ident{ast.NewIdent(paramName)}
-		paramnames = append(paramnames, paramName)
-	}
-
-	if *gccgo {
-		// Gccgo style hooks.
-		fmt.Fprint(fgo2, "\n")
-		conf.Fprint(fgo2, fset, d)
-		fmt.Fprint(fgo2, " {\n")
-		if !inProlog {
-			fmt.Fprint(fgo2, "\tdefer syscall.CgocallDone()\n")
-			fmt.Fprint(fgo2, "\tsyscall.Cgocall()\n")
-		}
-		if n.AddError {
-			fmt.Fprint(fgo2, "\tsyscall.SetErrno(0)\n")
-		}
-		fmt.Fprint(fgo2, "\t")
-		if !void {
-			fmt.Fprint(fgo2, "r := ")
-		}
-		fmt.Fprintf(fgo2, "%s(%s)\n", cname, strings.Join(paramnames, ", "))
-
-		if n.AddError {
-			fmt.Fprint(fgo2, "\te := syscall.GetErrno()\n")
-			fmt.Fprint(fgo2, "\tif e != 0 {\n")
-			fmt.Fprint(fgo2, "\t\treturn ")
-			if !void {
-				fmt.Fprint(fgo2, "r, ")
-			}
-			fmt.Fprint(fgo2, "e\n")
-			fmt.Fprint(fgo2, "\t}\n")
-			fmt.Fprint(fgo2, "\treturn ")
-			if !void {
-				fmt.Fprint(fgo2, "r, ")
-			}
-			fmt.Fprint(fgo2, "nil\n")
-		} else if !void {
-			fmt.Fprint(fgo2, "\treturn r\n")
-		}
-
-		fmt.Fprint(fgo2, "}\n")
-
-		// declare the C function.
-		fmt.Fprintf(fgo2, "//extern %s\n", cname)
-		d.Name = ast.NewIdent(cname)
-		if n.AddError {
-			l := d.Type.Results.List
-			d.Type.Results.List = l[:len(l)-1]
-		}
-		conf.Fprint(fgo2, fset, d)
-		fmt.Fprint(fgo2, "\n")
-
-		return
-	}
-
-	if inProlog {
-		fmt.Fprint(fgo2, builtinDefs[name])
-		return
-	}
-
-	// Wrapper calls into gcc, passing a pointer to the argument frame.
-	fmt.Fprintf(fgo2, "//go:cgo_import_static %s\n", cname)
-	fmt.Fprintf(fgo2, "//go:linkname __cgofn_%s %s\n", cname, cname)
-	fmt.Fprintf(fgo2, "var __cgofn_%s byte\n", cname)
-	fmt.Fprintf(fgo2, "var %s = unsafe.Pointer(&__cgofn_%s)\n", cname, cname)
-
-	nret := 0
-	if !void {
-		d.Type.Results.List[0].Names = []*ast.Ident{ast.NewIdent("r1")}
-		nret = 1
-	}
-	if n.AddError {
-		d.Type.Results.List[nret].Names = []*ast.Ident{ast.NewIdent("r2")}
-	}
-
-	fmt.Fprint(fgo2, "\n")
-	conf.Fprint(fgo2, fset, d)
-	fmt.Fprint(fgo2, " {\n")
-
-	// NOTE: Using uintptr to hide from escape analysis.
-	arg := "0"
-	if len(paramnames) > 0 {
-		arg = "uintptr(unsafe.Pointer(&p0))"
-	} else if !void {
-		arg = "uintptr(unsafe.Pointer(&r1))"
-	}
-
-	prefix := ""
-	if n.AddError {
-		prefix = "errno := "
-	}
-	fmt.Fprintf(fgo2, "\t%s_cgo_runtime_cgocall(%s, %s)\n", prefix, cname, arg)
-	if n.AddError {
-		fmt.Fprintf(fgo2, "\tif errno != 0 { r2 = syscall.Errno(errno) }\n")
-	}
-	fmt.Fprintf(fgo2, "\tif _Cgo_always_false {\n")
-	for i := range d.Type.Params.List {
-		fmt.Fprintf(fgo2, "\t\t_Cgo_use(p%d)\n", i)
-	}
-	fmt.Fprintf(fgo2, "\t}\n")
-	fmt.Fprintf(fgo2, "\treturn\n")
-	fmt.Fprintf(fgo2, "}\n")
-}
-
-// writeOutput creates stubs for a specific source file to be compiled by gc
-func (p *Package) writeOutput(f *File, srcfile string) {
-	base := srcfile
-	if strings.HasSuffix(base, ".go") {
-		base = base[0 : len(base)-3]
-	}
-	base = strings.Map(slashToUnderscore, base)
-	fgo1 := creat(*objDir + base + ".cgo1.go")
-	fgcc := creat(*objDir + base + ".cgo2.c")
-
-	p.GoFiles = append(p.GoFiles, base+".cgo1.go")
-	p.GccFiles = append(p.GccFiles, base+".cgo2.c")
-
-	// Write Go output: Go input with rewrites of C.xxx to _C_xxx.
-	fmt.Fprintf(fgo1, "// Created by cgo - DO NOT EDIT\n\n")
-	conf.Fprint(fgo1, fset, f.AST)
-
-	// While we process the vars and funcs, also write gcc output.
-	// Gcc output starts with the preamble.
-	fmt.Fprintf(fgcc, "%s\n", f.Preamble)
-	fmt.Fprintf(fgcc, "%s\n", gccProlog)
-
-	for _, key := range nameKeys(f.Name) {
-		n := f.Name[key]
-		if n.FuncType != nil {
-			p.writeOutputFunc(fgcc, n)
-		}
-	}
-
-	fgo1.Close()
-	fgcc.Close()
-}
-
-// fixGo converts the internal Name.Go field into the name we should show
-// to users in error messages. There's only one for now: on input we rewrite
-// C.malloc into C._CMalloc, so change it back here.
-func fixGo(name string) string {
-	if name == "_CMalloc" {
-		return "malloc"
-	}
-	return name
-}
-
-var isBuiltin = map[string]bool{
-	"_Cfunc_CString":   true,
-	"_Cfunc_GoString":  true,
-	"_Cfunc_GoStringN": true,
-	"_Cfunc_GoBytes":   true,
-	"_Cfunc__CMalloc":  true,
-}
-
-func (p *Package) writeOutputFunc(fgcc *os.File, n *Name) {
-	name := n.Mangle
-	if isBuiltin[name] || p.Written[name] {
-		// The builtins are already defined in the C prolog, and we don't
-		// want to duplicate function definitions we've already done.
-		return
-	}
-	p.Written[name] = true
-
-	if *gccgo {
-		p.writeGccgoOutputFunc(fgcc, n)
-		return
-	}
-
-	ctype, _ := p.structType(n)
-
-	// Gcc wrapper unpacks the C argument struct
-	// and calls the actual C function.
-	if n.AddError {
-		fmt.Fprintf(fgcc, "int\n")
-	} else {
-		fmt.Fprintf(fgcc, "void\n")
-	}
-	fmt.Fprintf(fgcc, "_cgo%s%s(void *v)\n", cPrefix, n.Mangle)
-	fmt.Fprintf(fgcc, "{\n")
-	if n.AddError {
-		fmt.Fprintf(fgcc, "\terrno = 0;\n")
-	}
-	// We're trying to write a gcc struct that matches gc's layout.
-	// Use packed attribute to force no padding in this struct in case
-	// gcc has different packing requirements.
-	fmt.Fprintf(fgcc, "\t%s %v *a = v;\n", ctype, p.packedAttribute())
-	if n.FuncType.Result != nil {
-		// Save the stack top for use below.
-		fmt.Fprintf(fgcc, "\tchar *stktop = _cgo_topofstack();\n")
-	}
-	fmt.Fprintf(fgcc, "\t")
-	if t := n.FuncType.Result; t != nil {
-		fmt.Fprintf(fgcc, "__typeof__(a->r) r = ")
-		if c := t.C.String(); c[len(c)-1] == '*' {
-			fmt.Fprint(fgcc, "(__typeof__(a->r)) ")
-		}
-	}
-	fmt.Fprintf(fgcc, "%s(", n.C)
-	for i, t := range n.FuncType.Params {
-		if i > 0 {
-			fmt.Fprintf(fgcc, ", ")
-		}
-		// We know the type params are correct, because
-		// the Go equivalents had good type params.
-		// However, our version of the type omits the magic
-		// words const and volatile, which can provoke
-		// C compiler warnings.  Silence them by casting
-		// all pointers to void*.  (Eventually that will produce
-		// other warnings.)
-		if c := t.C.String(); c[len(c)-1] == '*' {
-			fmt.Fprintf(fgcc, "(void*)")
-		}
-		fmt.Fprintf(fgcc, "a->p%d", i)
-	}
-	fmt.Fprintf(fgcc, ");\n")
-	if n.FuncType.Result != nil {
-		// The cgo call may have caused a stack copy (via a callback).
-		// Adjust the return value pointer appropriately.
-		fmt.Fprintf(fgcc, "\ta = (void*)((char*)a + (_cgo_topofstack() - stktop));\n")
-		// Save the return value.
-		fmt.Fprintf(fgcc, "\ta->r = r;\n")
-	}
-	if n.AddError {
-		fmt.Fprintf(fgcc, "\treturn errno;\n")
-	}
-	fmt.Fprintf(fgcc, "}\n")
-	fmt.Fprintf(fgcc, "\n")
-}
-
-// Write out a wrapper for a function when using gccgo.  This is a
-// simple wrapper that just calls the real function.  We only need a
-// wrapper to support static functions in the prologue--without a
-// wrapper, we can't refer to the function, since the reference is in
-// a different file.
-func (p *Package) writeGccgoOutputFunc(fgcc *os.File, n *Name) {
-	if t := n.FuncType.Result; t != nil {
-		fmt.Fprintf(fgcc, "%s\n", t.C.String())
-	} else {
-		fmt.Fprintf(fgcc, "void\n")
-	}
-	fmt.Fprintf(fgcc, "_cgo%s%s(", cPrefix, n.Mangle)
-	for i, t := range n.FuncType.Params {
-		if i > 0 {
-			fmt.Fprintf(fgcc, ", ")
-		}
-		c := t.Typedef
-		if c == "" {
-			c = t.C.String()
-		}
-		fmt.Fprintf(fgcc, "%s p%d", c, i)
-	}
-	fmt.Fprintf(fgcc, ")\n")
-	fmt.Fprintf(fgcc, "{\n")
-	fmt.Fprintf(fgcc, "\t")
-	if t := n.FuncType.Result; t != nil {
-		fmt.Fprintf(fgcc, "return ")
-		// Cast to void* to avoid warnings due to omitted qualifiers.
-		if c := t.C.String(); c[len(c)-1] == '*' {
-			fmt.Fprintf(fgcc, "(void*)")
-		}
-	}
-	fmt.Fprintf(fgcc, "%s(", n.C)
-	for i, t := range n.FuncType.Params {
-		if i > 0 {
-			fmt.Fprintf(fgcc, ", ")
-		}
-		// Cast to void* to avoid warnings due to omitted qualifiers.
-		if c := t.C.String(); c[len(c)-1] == '*' {
-			fmt.Fprintf(fgcc, "(void*)")
-		}
-		fmt.Fprintf(fgcc, "p%d", i)
-	}
-	fmt.Fprintf(fgcc, ");\n")
-	fmt.Fprintf(fgcc, "}\n")
-	fmt.Fprintf(fgcc, "\n")
-}
-
-// packedAttribute returns host compiler struct attribute that will be
-// used to match gc's struct layout. For example, on 386 Windows,
-// gcc wants to 8-align int64s, but gc does not.
-// Use __gcc_struct__ to work around http://gcc.gnu.org/PR52991 on x86,
-// and https://golang.org/issue/5603.
-func (p *Package) packedAttribute() string {
-	s := "__attribute__((__packed__"
-	if !p.GccIsClang && (goarch == "amd64" || goarch == "386") {
-		s += ", __gcc_struct__"
-	}
-	return s + "))"
-}
-
-// Write out the various stubs we need to support functions exported
-// from Go so that they are callable from C.
-func (p *Package) writeExports(fgo2, fm, fgcc, fgcch io.Writer) {
-	p.writeExportHeader(fgcch)
-
-	fmt.Fprintf(fgcc, "/* Created by cgo - DO NOT EDIT. */\n")
-	fmt.Fprintf(fgcc, "#include \"_cgo_export.h\"\n\n")
-
-	fmt.Fprintf(fgcc, "extern void crosscall2(void (*fn)(void *, int), void *, int);\n")
-	fmt.Fprintf(fgcc, "extern void _cgo_wait_runtime_init_done();\n\n")
-
-	for _, exp := range p.ExpFunc {
-		fn := exp.Func
-
-		// Construct a gcc struct matching the gc argument and
-		// result frame.  The gcc struct will be compiled with
-		// __attribute__((packed)) so all padding must be accounted
-		// for explicitly.
-		ctype := "struct {\n"
-		off := int64(0)
-		npad := 0
-		if fn.Recv != nil {
-			t := p.cgoType(fn.Recv.List[0].Type)
-			ctype += fmt.Sprintf("\t\t%s recv;\n", t.C)
-			off += t.Size
-		}
-		fntype := fn.Type
-		forFieldList(fntype.Params,
-			func(i int, atype ast.Expr) {
-				t := p.cgoType(atype)
-				if off%t.Align != 0 {
-					pad := t.Align - off%t.Align
-					ctype += fmt.Sprintf("\t\tchar __pad%d[%d];\n", npad, pad)
-					off += pad
-					npad++
-				}
-				ctype += fmt.Sprintf("\t\t%s p%d;\n", t.C, i)
-				off += t.Size
-			})
-		if off%p.PtrSize != 0 {
-			pad := p.PtrSize - off%p.PtrSize
-			ctype += fmt.Sprintf("\t\tchar __pad%d[%d];\n", npad, pad)
-			off += pad
-			npad++
-		}
-		forFieldList(fntype.Results,
-			func(i int, atype ast.Expr) {
-				t := p.cgoType(atype)
-				if off%t.Align != 0 {
-					pad := t.Align - off%t.Align
-					ctype += fmt.Sprintf("\t\tchar __pad%d[%d];\n", npad, pad)
-					off += pad
-					npad++
-				}
-				ctype += fmt.Sprintf("\t\t%s r%d;\n", t.C, i)
-				off += t.Size
-			})
-		if off%p.PtrSize != 0 {
-			pad := p.PtrSize - off%p.PtrSize
-			ctype += fmt.Sprintf("\t\tchar __pad%d[%d];\n", npad, pad)
-			off += pad
-			npad++
-		}
-		if ctype == "struct {\n" {
-			ctype += "\t\tchar unused;\n" // avoid empty struct
-		}
-		ctype += "\t}"
-
-		// Get the return type of the wrapper function
-		// compiled by gcc.
-		gccResult := ""
-		if fntype.Results == nil || len(fntype.Results.List) == 0 {
-			gccResult = "void"
-		} else if len(fntype.Results.List) == 1 && len(fntype.Results.List[0].Names) <= 1 {
-			gccResult = p.cgoType(fntype.Results.List[0].Type).C.String()
-		} else {
-			fmt.Fprintf(fgcch, "\n/* Return type for %s */\n", exp.ExpName)
-			fmt.Fprintf(fgcch, "struct %s_return {\n", exp.ExpName)
-			forFieldList(fntype.Results,
-				func(i int, atype ast.Expr) {
-					fmt.Fprintf(fgcch, "\t%s r%d;\n", p.cgoType(atype).C, i)
-				})
-			fmt.Fprintf(fgcch, "};\n")
-			gccResult = "struct " + exp.ExpName + "_return"
-		}
-
-		// Build the wrapper function compiled by gcc.
-		s := fmt.Sprintf("%s %s(", gccResult, exp.ExpName)
-		if fn.Recv != nil {
-			s += p.cgoType(fn.Recv.List[0].Type).C.String()
-			s += " recv"
-		}
-		forFieldList(fntype.Params,
-			func(i int, atype ast.Expr) {
-				if i > 0 || fn.Recv != nil {
-					s += ", "
-				}
-				s += fmt.Sprintf("%s p%d", p.cgoType(atype).C, i)
-			})
-		s += ")"
-
-		if len(exp.Doc) > 0 {
-			fmt.Fprintf(fgcch, "\n%s", exp.Doc)
-		}
-		fmt.Fprintf(fgcch, "\nextern %s;\n", s)
-
-		fmt.Fprintf(fgcc, "extern void _cgoexp%s_%s(void *, int);\n", cPrefix, exp.ExpName)
-		fmt.Fprintf(fgcc, "\n%s\n", s)
-		fmt.Fprintf(fgcc, "{\n")
-		fmt.Fprintf(fgcc, "\t_cgo_wait_runtime_init_done();\n")
-		fmt.Fprintf(fgcc, "\t%s %v a;\n", ctype, p.packedAttribute())
-		if gccResult != "void" && (len(fntype.Results.List) > 1 || len(fntype.Results.List[0].Names) > 1) {
-			fmt.Fprintf(fgcc, "\t%s r;\n", gccResult)
-		}
-		if fn.Recv != nil {
-			fmt.Fprintf(fgcc, "\ta.recv = recv;\n")
-		}
-		forFieldList(fntype.Params,
-			func(i int, atype ast.Expr) {
-				fmt.Fprintf(fgcc, "\ta.p%d = p%d;\n", i, i)
-			})
-		fmt.Fprintf(fgcc, "\tcrosscall2(_cgoexp%s_%s, &a, %d);\n", cPrefix, exp.ExpName, off)
-		if gccResult != "void" {
-			if len(fntype.Results.List) == 1 && len(fntype.Results.List[0].Names) <= 1 {
-				fmt.Fprintf(fgcc, "\treturn a.r0;\n")
-			} else {
-				forFieldList(fntype.Results,
-					func(i int, atype ast.Expr) {
-						fmt.Fprintf(fgcc, "\tr.r%d = a.r%d;\n", i, i)
-					})
-				fmt.Fprintf(fgcc, "\treturn r;\n")
-			}
-		}
-		fmt.Fprintf(fgcc, "}\n")
-
-		// Build the wrapper function compiled by gc.
-		goname := exp.Func.Name.Name
-		if fn.Recv != nil {
-			goname = "_cgoexpwrap" + cPrefix + "_" + fn.Recv.List[0].Names[0].Name + "_" + goname
-		}
-		fmt.Fprintf(fgo2, "//go:cgo_export_dynamic %s\n", goname)
-		fmt.Fprintf(fgo2, "//go:linkname _cgoexp%s_%s _cgoexp%s_%s\n", cPrefix, exp.ExpName, cPrefix, exp.ExpName)
-		fmt.Fprintf(fgo2, "//go:cgo_export_static _cgoexp%s_%s\n", cPrefix, exp.ExpName)
-		fmt.Fprintf(fgo2, "//go:nosplit\n") // no split stack, so no use of m or g
-		fmt.Fprintf(fgo2, "//go:norace\n")  // must not have race detector calls inserted
-		fmt.Fprintf(fgo2, "func _cgoexp%s_%s(a unsafe.Pointer, n int32) {", cPrefix, exp.ExpName)
-		fmt.Fprintf(fgo2, "\tfn := %s\n", goname)
-		// The indirect here is converting from a Go function pointer to a C function pointer.
-		fmt.Fprintf(fgo2, "\t_cgo_runtime_cgocallback(**(**unsafe.Pointer)(unsafe.Pointer(&fn)), a, uintptr(n));\n")
-		fmt.Fprintf(fgo2, "}\n")
-
-		fmt.Fprintf(fm, "int _cgoexp%s_%s;\n", cPrefix, exp.ExpName)
-
-		// Calling a function with a receiver from C requires
-		// a Go wrapper function.
-		if fn.Recv != nil {
-			fmt.Fprintf(fgo2, "func %s(recv ", goname)
-			conf.Fprint(fgo2, fset, fn.Recv.List[0].Type)
-			forFieldList(fntype.Params,
-				func(i int, atype ast.Expr) {
-					fmt.Fprintf(fgo2, ", p%d ", i)
-					conf.Fprint(fgo2, fset, atype)
-				})
-			fmt.Fprintf(fgo2, ")")
-			if gccResult != "void" {
-				fmt.Fprint(fgo2, " (")
-				forFieldList(fntype.Results,
-					func(i int, atype ast.Expr) {
-						if i > 0 {
-							fmt.Fprint(fgo2, ", ")
-						}
-						conf.Fprint(fgo2, fset, atype)
-					})
-				fmt.Fprint(fgo2, ")")
-			}
-			fmt.Fprint(fgo2, " {\n")
-			fmt.Fprint(fgo2, "\t")
-			if gccResult != "void" {
-				fmt.Fprint(fgo2, "return ")
-			}
-			fmt.Fprintf(fgo2, "recv.%s(", exp.Func.Name)
-			forFieldList(fntype.Params,
-				func(i int, atype ast.Expr) {
-					if i > 0 {
-						fmt.Fprint(fgo2, ", ")
-					}
-					fmt.Fprintf(fgo2, "p%d", i)
-				})
-			fmt.Fprint(fgo2, ")\n")
-			fmt.Fprint(fgo2, "}\n")
-		}
-	}
-
-	fmt.Fprintf(fgcch, "%s", gccExportHeaderEpilog)
-}
-
-// Write out the C header allowing C code to call exported gccgo functions.
-func (p *Package) writeGccgoExports(fgo2, fm, fgcc, fgcch io.Writer) {
-	gccgoSymbolPrefix := p.gccgoSymbolPrefix()
-
-	p.writeExportHeader(fgcch)
-
-	fmt.Fprintf(fgcc, "/* Created by cgo - DO NOT EDIT. */\n")
-	fmt.Fprintf(fgcc, "#include \"_cgo_export.h\"\n")
-
-	fmt.Fprintf(fgcc, "%s\n", gccgoExportFileProlog)
-
-	for _, exp := range p.ExpFunc {
-		fn := exp.Func
-		fntype := fn.Type
-
-		cdeclBuf := new(bytes.Buffer)
-		resultCount := 0
-		forFieldList(fntype.Results,
-			func(i int, atype ast.Expr) { resultCount++ })
-		switch resultCount {
-		case 0:
-			fmt.Fprintf(cdeclBuf, "void")
-		case 1:
-			forFieldList(fntype.Results,
-				func(i int, atype ast.Expr) {
-					t := p.cgoType(atype)
-					fmt.Fprintf(cdeclBuf, "%s", t.C)
-				})
-		default:
-			// Declare a result struct.
-			fmt.Fprintf(fgcch, "\n/* Return type for %s */\n", exp.ExpName)
-			fmt.Fprintf(fgcch, "struct %s_result {\n", exp.ExpName)
-			forFieldList(fntype.Results,
-				func(i int, atype ast.Expr) {
-					t := p.cgoType(atype)
-					fmt.Fprintf(fgcch, "\t%s r%d;\n", t.C, i)
-				})
-			fmt.Fprintf(fgcch, "};\n")
-			fmt.Fprintf(cdeclBuf, "struct %s_result", exp.ExpName)
-		}
-
-		cRet := cdeclBuf.String()
-
-		cdeclBuf = new(bytes.Buffer)
-		fmt.Fprintf(cdeclBuf, "(")
-		if fn.Recv != nil {
-			fmt.Fprintf(cdeclBuf, "%s recv", p.cgoType(fn.Recv.List[0].Type).C.String())
-		}
-		// Function parameters.
-		forFieldList(fntype.Params,
-			func(i int, atype ast.Expr) {
-				if i > 0 || fn.Recv != nil {
-					fmt.Fprintf(cdeclBuf, ", ")
-				}
-				t := p.cgoType(atype)
-				fmt.Fprintf(cdeclBuf, "%s p%d", t.C, i)
-			})
-		fmt.Fprintf(cdeclBuf, ")")
-		cParams := cdeclBuf.String()
-
-		if len(exp.Doc) > 0 {
-			fmt.Fprintf(fgcch, "\n%s", exp.Doc)
-		}
-
-		// We need to use a name that will be exported by the
-		// Go code; otherwise gccgo will make it static and we
-		// will not be able to link against it from the C
-		// code.
-		goName := "Cgoexp_" + exp.ExpName
-		fmt.Fprintf(fgcch, `extern %s %s %s __asm__("%s.%s");`, cRet, goName, cParams, gccgoSymbolPrefix, goName)
-		fmt.Fprint(fgcch, "\n")
-
-		// Use a #define so that the C code that includes
-		// cgo_export.h will be able to refer to the Go
-		// function using the expected name.
-		fmt.Fprintf(fgcch, "#define %s %s\n", exp.ExpName, goName)
-
-		// Use a #undef in _cgo_export.c so that we ignore the
-		// #define from cgo_export.h, since here we are
-		// defining the real function.
-		fmt.Fprintf(fgcc, "#undef %s\n", exp.ExpName)
-
-		fmt.Fprint(fgcc, "\n")
-		fmt.Fprintf(fgcc, "%s %s %s {\n", cRet, exp.ExpName, cParams)
-		fmt.Fprintf(fgcc, "\tif(_cgo_wait_runtime_init_done)\n")
-		fmt.Fprintf(fgcc, "\t\t_cgo_wait_runtime_init_done();\n")
-		fmt.Fprint(fgcc, "\t")
-		if resultCount > 0 {
-			fmt.Fprint(fgcc, "return ")
-		}
-		fmt.Fprintf(fgcc, "%s(", goName)
-		if fn.Recv != nil {
-			fmt.Fprint(fgcc, "recv")
-		}
-		forFieldList(fntype.Params,
-			func(i int, atype ast.Expr) {
-				if i > 0 || fn.Recv != nil {
-					fmt.Fprintf(fgcc, ", ")
-				}
-				fmt.Fprintf(fgcc, "p%d", i)
-			})
-		fmt.Fprint(fgcc, ");\n")
-		fmt.Fprint(fgcc, "}\n")
-
-		// Dummy declaration for _cgo_main.c
-		fmt.Fprintf(fm, `char %s[1] __asm__("%s.%s");`, goName, gccgoSymbolPrefix, goName)
-		fmt.Fprint(fm, "\n")
-
-		// For gccgo we use a wrapper function in Go, in order
-		// to call CgocallBack and CgocallBackDone.
-
-		// This code uses printer.Fprint, not conf.Fprint,
-		// because we don't want //line comments in the middle
-		// of the function types.
-		fmt.Fprint(fgo2, "\n")
-		fmt.Fprintf(fgo2, "func %s(", goName)
-		if fn.Recv != nil {
-			fmt.Fprint(fgo2, "recv ")
-			printer.Fprint(fgo2, fset, fn.Recv.List[0].Type)
-		}
-		forFieldList(fntype.Params,
-			func(i int, atype ast.Expr) {
-				if i > 0 || fn.Recv != nil {
-					fmt.Fprintf(fgo2, ", ")
-				}
-				fmt.Fprintf(fgo2, "p%d ", i)
-				printer.Fprint(fgo2, fset, atype)
-			})
-		fmt.Fprintf(fgo2, ")")
-		if resultCount > 0 {
-			fmt.Fprintf(fgo2, " (")
-			forFieldList(fntype.Results,
-				func(i int, atype ast.Expr) {
-					if i > 0 {
-						fmt.Fprint(fgo2, ", ")
-					}
-					printer.Fprint(fgo2, fset, atype)
-				})
-			fmt.Fprint(fgo2, ")")
-		}
-		fmt.Fprint(fgo2, " {\n")
-		fmt.Fprint(fgo2, "\tsyscall.CgocallBack()\n")
-		fmt.Fprint(fgo2, "\tdefer syscall.CgocallBackDone()\n")
-		fmt.Fprint(fgo2, "\t")
-		if resultCount > 0 {
-			fmt.Fprint(fgo2, "return ")
-		}
-		if fn.Recv != nil {
-			fmt.Fprint(fgo2, "recv.")
-		}
-		fmt.Fprintf(fgo2, "%s(", exp.Func.Name)
-		forFieldList(fntype.Params,
-			func(i int, atype ast.Expr) {
-				if i > 0 {
-					fmt.Fprint(fgo2, ", ")
-				}
-				fmt.Fprintf(fgo2, "p%d", i)
-			})
-		fmt.Fprint(fgo2, ")\n")
-		fmt.Fprint(fgo2, "}\n")
-	}
-
-	fmt.Fprintf(fgcch, "%s", gccExportHeaderEpilog)
-}
-
-// writeExportHeader writes out the start of the _cgo_export.h file.
-func (p *Package) writeExportHeader(fgcch io.Writer) {
-	fmt.Fprintf(fgcch, "/* Created by \"go tool cgo\" - DO NOT EDIT. */\n\n")
-	pkg := *importPath
-	if pkg == "" {
-		pkg = p.PackagePath
-	}
-	fmt.Fprintf(fgcch, "/* package %s */\n\n", pkg)
-
-	fmt.Fprintf(fgcch, "/* Start of preamble from import \"C\" comments.  */\n\n")
-	fmt.Fprintf(fgcch, "%s\n", p.Preamble)
-	fmt.Fprintf(fgcch, "\n/* End of preamble from import \"C\" comments.  */\n\n")
-
-	fmt.Fprintf(fgcch, "%s\n", p.gccExportHeaderProlog())
-}
-
-// Return the package prefix when using gccgo.
-func (p *Package) gccgoSymbolPrefix() string {
-	if !*gccgo {
-		return ""
-	}
-
-	clean := func(r rune) rune {
-		switch {
-		case 'A' <= r && r <= 'Z', 'a' <= r && r <= 'z',
-			'0' <= r && r <= '9':
-			return r
-		}
-		return '_'
-	}
-
-	if *gccgopkgpath != "" {
-		return strings.Map(clean, *gccgopkgpath)
-	}
-	if *gccgoprefix == "" && p.PackageName == "main" {
-		return "main"
-	}
-	prefix := strings.Map(clean, *gccgoprefix)
-	if prefix == "" {
-		prefix = "go"
-	}
-	return prefix + "." + p.PackageName
-}
-
-// Call a function for each entry in an ast.FieldList, passing the
-// index into the list and the type.
-func forFieldList(fl *ast.FieldList, fn func(int, ast.Expr)) {
-	if fl == nil {
-		return
-	}
-	i := 0
-	for _, r := range fl.List {
-		if r.Names == nil {
-			fn(i, r.Type)
-			i++
-		} else {
-			for range r.Names {
-				fn(i, r.Type)
-				i++
-			}
-		}
-	}
-}
-
-func c(repr string, args ...interface{}) *TypeRepr {
-	return &TypeRepr{repr, args}
-}
-
-// Map predeclared Go types to Type.
-var goTypes = map[string]*Type{
-	"bool":       {Size: 1, Align: 1, C: c("GoUint8")},
-	"byte":       {Size: 1, Align: 1, C: c("GoUint8")},
-	"int":        {Size: 0, Align: 0, C: c("GoInt")},
-	"uint":       {Size: 0, Align: 0, C: c("GoUint")},
-	"rune":       {Size: 4, Align: 4, C: c("GoInt32")},
-	"int8":       {Size: 1, Align: 1, C: c("GoInt8")},
-	"uint8":      {Size: 1, Align: 1, C: c("GoUint8")},
-	"int16":      {Size: 2, Align: 2, C: c("GoInt16")},
-	"uint16":     {Size: 2, Align: 2, C: c("GoUint16")},
-	"int32":      {Size: 4, Align: 4, C: c("GoInt32")},
-	"uint32":     {Size: 4, Align: 4, C: c("GoUint32")},
-	"int64":      {Size: 8, Align: 8, C: c("GoInt64")},
-	"uint64":     {Size: 8, Align: 8, C: c("GoUint64")},
-	"float32":    {Size: 4, Align: 4, C: c("GoFloat32")},
-	"float64":    {Size: 8, Align: 8, C: c("GoFloat64")},
-	"complex64":  {Size: 8, Align: 8, C: c("GoComplex64")},
-	"complex128": {Size: 16, Align: 16, C: c("GoComplex128")},
-}
-
-// Map an ast type to a Type.
-func (p *Package) cgoType(e ast.Expr) *Type {
-	switch t := e.(type) {
-	case *ast.StarExpr:
-		x := p.cgoType(t.X)
-		return &Type{Size: p.PtrSize, Align: p.PtrSize, C: c("%s*", x.C)}
-	case *ast.ArrayType:
-		if t.Len == nil {
-			// Slice: pointer, len, cap.
-			return &Type{Size: p.PtrSize * 3, Align: p.PtrSize, C: c("GoSlice")}
-		}
-	case *ast.StructType:
-		// TODO
-	case *ast.FuncType:
-		return &Type{Size: p.PtrSize, Align: p.PtrSize, C: c("void*")}
-	case *ast.InterfaceType:
-		return &Type{Size: 2 * p.PtrSize, Align: p.PtrSize, C: c("GoInterface")}
-	case *ast.MapType:
-		return &Type{Size: p.PtrSize, Align: p.PtrSize, C: c("GoMap")}
-	case *ast.ChanType:
-		return &Type{Size: p.PtrSize, Align: p.PtrSize, C: c("GoChan")}
-	case *ast.Ident:
-		// Look up the type in the top level declarations.
-		// TODO: Handle types defined within a function.
-		for _, d := range p.Decl {
-			gd, ok := d.(*ast.GenDecl)
-			if !ok || gd.Tok != token.TYPE {
-				continue
-			}
-			for _, spec := range gd.Specs {
-				ts, ok := spec.(*ast.TypeSpec)
-				if !ok {
-					continue
-				}
-				if ts.Name.Name == t.Name {
-					return p.cgoType(ts.Type)
-				}
-			}
-		}
-		if def := typedef[t.Name]; def != nil {
-			return def
-		}
-		if t.Name == "uintptr" {
-			return &Type{Size: p.PtrSize, Align: p.PtrSize, C: c("GoUintptr")}
-		}
-		if t.Name == "string" {
-			// The string data is 1 pointer + 1 (pointer-sized) int.
-			return &Type{Size: 2 * p.PtrSize, Align: p.PtrSize, C: c("GoString")}
-		}
-		if t.Name == "error" {
-			return &Type{Size: 2 * p.PtrSize, Align: p.PtrSize, C: c("GoInterface")}
-		}
-		if r, ok := goTypes[t.Name]; ok {
-			if r.Size == 0 { // int or uint
-				rr := new(Type)
-				*rr = *r
-				rr.Size = p.IntSize
-				rr.Align = p.IntSize
-				r = rr
-			}
-			if r.Align > p.PtrSize {
-				r.Align = p.PtrSize
-			}
-			return r
-		}
-		error_(e.Pos(), "unrecognized Go type %s", t.Name)
-		return &Type{Size: 4, Align: 4, C: c("int")}
-	case *ast.SelectorExpr:
-		id, ok := t.X.(*ast.Ident)
-		if ok && id.Name == "unsafe" && t.Sel.Name == "Pointer" {
-			return &Type{Size: p.PtrSize, Align: p.PtrSize, C: c("void*")}
-		}
-	}
-	error_(e.Pos(), "Go type not supported in export: %s", gofmt(e))
-	return &Type{Size: 4, Align: 4, C: c("int")}
-}
-
-const gccProlog = `
-// Usual nonsense: if x and y are not equal, the type will be invalid
-// (have a negative array count) and an inscrutable error will come
-// out of the compiler and hopefully mention "name".
-#define __cgo_compile_assert_eq(x, y, name) typedef char name[(x-y)*(x-y)*-2+1];
-
-// Check at compile time that the sizes we use match our expectations.
-#define __cgo_size_assert(t, n) __cgo_compile_assert_eq(sizeof(t), n, _cgo_sizeof_##t##_is_not_##n)
-
-__cgo_size_assert(char, 1)
-__cgo_size_assert(short, 2)
-__cgo_size_assert(int, 4)
-typedef long long __cgo_long_long;
-__cgo_size_assert(__cgo_long_long, 8)
-__cgo_size_assert(float, 4)
-__cgo_size_assert(double, 8)
-
-extern char* _cgo_topofstack(void);
-
-#include <errno.h>
-#include <string.h>
-`
-
-const builtinProlog = `
-#include <stddef.h> /* for ptrdiff_t and size_t below */
-
-/* Define intgo when compiling with GCC.  */
-typedef ptrdiff_t intgo;
-
-typedef struct { char *p; intgo n; } _GoString_;
-typedef struct { char *p; intgo n; intgo c; } _GoBytes_;
-_GoString_ GoString(char *p);
-_GoString_ GoStringN(char *p, int l);
-_GoBytes_ GoBytes(void *p, int n);
-char *CString(_GoString_);
-void *_CMalloc(size_t);
-`
-
-const goProlog = `
-//go:linkname _cgo_runtime_cgocall runtime.cgocall
-func _cgo_runtime_cgocall(unsafe.Pointer, uintptr) int32
-
-//go:linkname _cgo_runtime_cmalloc runtime.cmalloc
-func _cgo_runtime_cmalloc(uintptr) unsafe.Pointer
-
-//go:linkname _cgo_runtime_cgocallback runtime.cgocallback
-func _cgo_runtime_cgocallback(unsafe.Pointer, unsafe.Pointer, uintptr)
-`
-
-const goStringDef = `
-//go:linkname _cgo_runtime_gostring runtime.gostring
-func _cgo_runtime_gostring(*_Ctype_char) string
-
-func _Cfunc_GoString(p *_Ctype_char) string {
-	return _cgo_runtime_gostring(p)
-}
-`
-
-const goStringNDef = `
-//go:linkname _cgo_runtime_gostringn runtime.gostringn
-func _cgo_runtime_gostringn(*_Ctype_char, int) string
-
-func _Cfunc_GoStringN(p *_Ctype_char, l _Ctype_int) string {
-	return _cgo_runtime_gostringn(p, int(l))
-}
-`
-
-const goBytesDef = `
-//go:linkname _cgo_runtime_gobytes runtime.gobytes
-func _cgo_runtime_gobytes(unsafe.Pointer, int) []byte
-
-func _Cfunc_GoBytes(p unsafe.Pointer, l _Ctype_int) []byte {
-	return _cgo_runtime_gobytes(p, int(l))
-}
-`
-
-const cStringDef = `
-func _Cfunc_CString(s string) *_Ctype_char {
-	p := _cgo_runtime_cmalloc(uintptr(len(s)+1))
-	pp := (*[1<<30]byte)(p)
-	copy(pp[:], s)
-	pp[len(s)] = 0
-	return (*_Ctype_char)(p)
-}
-`
-
-const cMallocDef = `
-func _Cfunc__CMalloc(n _Ctype_size_t) unsafe.Pointer {
-	return _cgo_runtime_cmalloc(uintptr(n))
-}
-`
-
-var builtinDefs = map[string]string{
-	"GoString":  goStringDef,
-	"GoStringN": goStringNDef,
-	"GoBytes":   goBytesDef,
-	"CString":   cStringDef,
-	"_CMalloc":  cMallocDef,
-}
-
-func (p *Package) cPrologGccgo() string {
-	return strings.Replace(cPrologGccgo, "PREFIX", cPrefix, -1)
-}
-
-const cPrologGccgo = `
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-
-typedef unsigned char byte;
-typedef intptr_t intgo;
-
-struct __go_string {
-	const unsigned char *__data;
-	intgo __length;
-};
-
-typedef struct __go_open_array {
-	void* __values;
-	intgo __count;
-	intgo __capacity;
-} Slice;
-
-struct __go_string __go_byte_array_to_string(const void* p, intgo len);
-struct __go_open_array __go_string_to_byte_array (struct __go_string str);
-
-const char *_cgoPREFIX_Cfunc_CString(struct __go_string s) {
-	char *p = malloc(s.__length+1);
-	memmove(p, s.__data, s.__length);
-	p[s.__length] = 0;
-	return p;
-}
-
-struct __go_string _cgoPREFIX_Cfunc_GoString(char *p) {
-	intgo len = (p != NULL) ? strlen(p) : 0;
-	return __go_byte_array_to_string(p, len);
-}
-
-struct __go_string _cgoPREFIX_Cfunc_GoStringN(char *p, int32_t n) {
-	return __go_byte_array_to_string(p, n);
-}
-
-Slice _cgoPREFIX_Cfunc_GoBytes(char *p, int32_t n) {
-	struct __go_string s = { (const unsigned char *)p, n };
-	return __go_string_to_byte_array(s);
-}
-
-extern void runtime_throw(const char *);
-void *_cgoPREFIX_Cfunc__CMalloc(size_t n) {
-        void *p = malloc(n);
-        if(p == NULL && n == 0)
-                p = malloc(1);
-        if(p == NULL)
-                runtime_throw("runtime: C malloc failed");
-        return p;
-}
-`
-
-func (p *Package) gccExportHeaderProlog() string {
-	return strings.Replace(gccExportHeaderProlog, "GOINTBITS", fmt.Sprint(8*p.IntSize), -1)
-}
-
-const gccExportHeaderProlog = `
-/* Start of boilerplate cgo prologue.  */
-
-#ifndef GO_CGO_PROLOGUE_H
-#define GO_CGO_PROLOGUE_H
-
-typedef signed char GoInt8;
-typedef unsigned char GoUint8;
-typedef short GoInt16;
-typedef unsigned short GoUint16;
-typedef int GoInt32;
-typedef unsigned int GoUint32;
-typedef long long GoInt64;
-typedef unsigned long long GoUint64;
-typedef GoIntGOINTBITS GoInt;
-typedef GoUintGOINTBITS GoUint;
-typedef __SIZE_TYPE__ GoUintptr;
-typedef float GoFloat32;
-typedef double GoFloat64;
-typedef __complex float GoComplex64;
-typedef __complex double GoComplex128;
-
-// static assertion to make sure the file is being used on architecture
-// at least with matching size of GoInt.
-typedef char _check_for_GOINTBITS_bit_pointer_matching_GoInt[sizeof(void*)==GOINTBITS/8 ? 1:-1];
-
-typedef struct { char *p; GoInt n; } GoString;
-typedef void *GoMap;
-typedef void *GoChan;
-typedef struct { void *t; void *v; } GoInterface;
-typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
-
-#endif
-
-/* End of boilerplate cgo prologue.  */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-`
-
-// gccExportHeaderEpilog goes at the end of the generated header file.
-const gccExportHeaderEpilog = `
-#ifdef __cplusplus
-}
-#endif
-`
-
-// gccgoExportFileProlog is written to the _cgo_export.c file when
-// using gccgo.
-// We use weak declarations, and test the addresses, so that this code
-// works with older versions of gccgo.
-const gccgoExportFileProlog = `
-extern _Bool runtime_iscgo __attribute__ ((weak));
-
-static void GoInit(void) __attribute__ ((constructor));
-static void GoInit(void) {
-	if(&runtime_iscgo)
-		runtime_iscgo = 1;
-}
-
-extern void _cgo_wait_runtime_init_done() __attribute__ ((weak));
-`
diff --git a/third_party/gofrontend/libgo/go/cmd/cgo/util.go b/third_party/gofrontend/libgo/go/cmd/cgo/util.go
deleted file mode 100644
index 3adb8e8..0000000
--- a/third_party/gofrontend/libgo/go/cmd/cgo/util.go
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bytes"
-	"fmt"
-	"go/token"
-	"os"
-	"os/exec"
-)
-
-// run runs the command argv, feeding in stdin on standard input.
-// It returns the output to standard output and standard error.
-// ok indicates whether the command exited successfully.
-func run(stdin []byte, argv []string) (stdout, stderr []byte, ok bool) {
-	p := exec.Command(argv[0], argv[1:]...)
-	p.Stdin = bytes.NewReader(stdin)
-	var bout, berr bytes.Buffer
-	p.Stdout = &bout
-	p.Stderr = &berr
-	err := p.Run()
-	if _, ok := err.(*exec.ExitError); err != nil && !ok {
-		fatalf("%s", err)
-	}
-	ok = p.ProcessState.Success()
-	stdout, stderr = bout.Bytes(), berr.Bytes()
-	return
-}
-
-func lineno(pos token.Pos) string {
-	return fset.Position(pos).String()
-}
-
-// Die with an error message.
-func fatalf(msg string, args ...interface{}) {
-	// If we've already printed other errors, they might have
-	// caused the fatal condition.  Assume they're enough.
-	if nerrors == 0 {
-		fmt.Fprintf(os.Stderr, msg+"\n", args...)
-	}
-	os.Exit(2)
-}
-
-var nerrors int
-
-func error_(pos token.Pos, msg string, args ...interface{}) {
-	nerrors++
-	if pos.IsValid() {
-		fmt.Fprintf(os.Stderr, "%s: ", fset.Position(pos).String())
-	}
-	fmt.Fprintf(os.Stderr, msg, args...)
-	fmt.Fprintf(os.Stderr, "\n")
-}
-
-// isName reports whether s is a valid C identifier
-func isName(s string) bool {
-	for i, v := range s {
-		if v != '_' && (v < 'A' || v > 'Z') && (v < 'a' || v > 'z') && (v < '0' || v > '9') {
-			return false
-		}
-		if i == 0 && '0' <= v && v <= '9' {
-			return false
-		}
-	}
-	return s != ""
-}
-
-func creat(name string) *os.File {
-	f, err := os.Create(name)
-	if err != nil {
-		fatalf("%s", err)
-	}
-	return f
-}
-
-func slashToUnderscore(c rune) rune {
-	if c == '/' || c == '\\' || c == ':' {
-		c = '_'
-	}
-	return c
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/alldocs.go b/third_party/gofrontend/libgo/go/cmd/go/alldocs.go
deleted file mode 100644
index 1134997..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/alldocs.go
+++ /dev/null
@@ -1,1481 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// DO NOT EDIT THIS FILE. GENERATED BY mkalldocs.sh.
-// Edit the documentation in other files and rerun mkalldocs.sh to generate this one.
-
-/*
-Go is a tool for managing Go source code.
-
-Usage:
-
-	go command [arguments]
-
-The commands are:
-
-	build       compile packages and dependencies
-	clean       remove object files
-	doc         show documentation for package or symbol
-	env         print Go environment information
-	fix         run go tool fix on packages
-	fmt         run gofmt on package sources
-	generate    generate Go files by processing source
-	get         download and install packages and dependencies
-	install     compile and install packages and dependencies
-	list        list packages
-	run         compile and run Go program
-	test        test packages
-	tool        run specified go tool
-	version     print Go version
-	vet         run go tool vet on packages
-
-Use "go help [command]" for more information about a command.
-
-Additional help topics:
-
-	c           calling between Go and C
-	buildmode   description of build modes
-	filetype    file types
-	gopath      GOPATH environment variable
-	environment environment variables
-	importpath  import path syntax
-	packages    description of package lists
-	testflag    description of testing flags
-	testfunc    description of testing functions
-
-Use "go help [topic]" for more information about that topic.
-
-
-Compile packages and dependencies
-
-Usage:
-
-	go build [-o output] [-i] [build flags] [packages]
-
-Build compiles the packages named by the import paths,
-along with their dependencies, but it does not install the results.
-
-If the arguments to build are a list of .go files, build treats
-them as a list of source files specifying a single package.
-
-When compiling a single main package, build writes
-the resulting executable to an output file named after
-the first source file ('go build ed.go rx.go' writes 'ed' or 'ed.exe')
-or the source code directory ('go build unix/sam' writes 'sam' or 'sam.exe').
-The '.exe' suffix is added when writing a Windows executable.
-
-When compiling multiple packages or a single non-main package,
-build compiles the packages but discards the resulting object,
-serving only as a check that the packages can be built.
-
-The -o flag, only allowed when compiling a single package,
-forces build to write the resulting executable or object
-to the named output file, instead of the default behavior described
-in the last two paragraphs.
-
-The -i flag installs the packages that are dependencies of the target.
-
-The build flags are shared by the build, clean, get, install, list, run,
-and test commands:
-
-	-a
-		force rebuilding of packages that are already up-to-date.
-	-n
-		print the commands but do not run them.
-	-p n
-		the number of builds that can be run in parallel.
-		The default is the number of CPUs available, except
-		on darwin/arm which defaults to 1.
-	-race
-		enable data race detection.
-		Supported only on linux/amd64, freebsd/amd64, darwin/amd64 and windows/amd64.
-	-v
-		print the names of packages as they are compiled.
-	-work
-		print the name of the temporary work directory and
-		do not delete it when exiting.
-	-x
-		print the commands.
-
-	-asmflags 'flag list'
-		arguments to pass on each go tool asm invocation.
-	-buildmode mode
-		build mode to use. See 'go help buildmode' for more.
-	-compiler name
-		name of compiler to use, as in runtime.Compiler (gccgo or gc).
-	-gccgoflags 'arg list'
-		arguments to pass on each gccgo compiler/linker invocation.
-	-gcflags 'arg list'
-		arguments to pass on each go tool compile invocation.
-	-installsuffix suffix
-		a suffix to use in the name of the package installation directory,
-		in order to keep output separate from default builds.
-		If using the -race flag, the install suffix is automatically set to race
-		or, if set explicitly, has _race appended to it.  Using a -buildmode
-		option that requires non-default compile flags has a similar effect.
-	-ldflags 'flag list'
-		arguments to pass on each go tool link invocation.
-	-linkshared
-		link against shared libraries previously created with
-		-buildmode=shared
-	-pkgdir dir
-		install and load all packages from dir instead of the usual locations.
-		For example, when building with a non-standard configuration,
-		use -pkgdir to keep generated packages in a separate location.
-	-tags 'tag list'
-		a list of build tags to consider satisfied during the build.
-		For more information about build tags, see the description of
-		build constraints in the documentation for the go/build package.
-	-toolexec 'cmd args'
-		a program to use to invoke toolchain programs like vet and asm.
-		For example, instead of running asm, the go command will run
-		'cmd args /path/to/asm <arguments for asm>'.
-
-The list flags accept a space-separated list of strings. To embed spaces
-in an element in the list, surround it with either single or double quotes.
-
-For more about specifying packages, see 'go help packages'.
-For more about where packages and binaries are installed,
-run 'go help gopath'.
-For more about calling between Go and C/C++, run 'go help c'.
-
-Note: Build adheres to certain conventions such as those described
-by 'go help gopath'. Not all projects can follow these conventions,
-however. Installations that have their own conventions or that use
-a separate software build system may choose to use lower-level
-invocations such as 'go tool compile' and 'go tool link' to avoid
-some of the overheads and design decisions of the build tool.
-
-See also: go install, go get, go clean.
-
-
-Remove object files
-
-Usage:
-
-	go clean [-i] [-r] [-n] [-x] [build flags] [packages]
-
-Clean removes object files from package source directories.
-The go command builds most objects in a temporary directory,
-so go clean is mainly concerned with object files left by other
-tools or by manual invocations of go build.
-
-Specifically, clean removes the following files from each of the
-source directories corresponding to the import paths:
-
-	_obj/            old object directory, left from Makefiles
-	_test/           old test directory, left from Makefiles
-	_testmain.go     old gotest file, left from Makefiles
-	test.out         old test log, left from Makefiles
-	build.out        old test log, left from Makefiles
-	*.[568ao]        object files, left from Makefiles
-
-	DIR(.exe)        from go build
-	DIR.test(.exe)   from go test -c
-	MAINFILE(.exe)   from go build MAINFILE.go
-	*.so             from SWIG
-
-In the list, DIR represents the final path element of the
-directory, and MAINFILE is the base name of any Go source
-file in the directory that is not included when building
-the package.
-
-The -i flag causes clean to remove the corresponding installed
-archive or binary (what 'go install' would create).
-
-The -n flag causes clean to print the remove commands it would execute,
-but not run them.
-
-The -r flag causes clean to be applied recursively to all the
-dependencies of the packages named by the import paths.
-
-The -x flag causes clean to print remove commands as it executes them.
-
-For more about build flags, see 'go help build'.
-
-For more about specifying packages, see 'go help packages'.
-
-
-Show documentation for package or symbol
-
-Usage:
-
-	go doc [-u] [-c] [package|[package.]symbol[.method]]
-
-Doc prints the documentation comments associated with the item identified by its
-arguments (a package, const, func, type, var, or method) followed by a one-line
-summary of each of the first-level items "under" that item (package-level
-declarations for a package, methods for a type, etc.).
-
-Doc accepts zero, one, or two arguments.
-
-Given no arguments, that is, when run as
-
-	go doc
-
-it prints the package documentation for the package in the current directory.
-If the package is a command (package main), the exported symbols of the package
-are elided from the presentation unless the -cmd flag is provided.
-
-When run with one argument, the argument is treated as a Go-syntax-like
-representation of the item to be documented. What the argument selects depends
-on what is installed in GOROOT and GOPATH, as well as the form of the argument,
-which is schematically one of these:
-
-	go doc <pkg>
-	go doc <sym>[.<method>]
-	go doc [<pkg>].<sym>[.<method>]
-
-The first item in this list matched by the argument is the one whose
-documentation is printed. (See the examples below.) For packages, the order of
-scanning is determined lexically, but the GOROOT tree is always scanned before
-GOPATH.
-
-If there is no package specified or matched, the package in the current
-directory is selected, so "go doc Foo" shows the documentation for symbol Foo in
-the current package.
-
-The package path must be either a qualified path or a proper suffix of a
-path. The go tool's usual package mechanism does not apply: package path
-elements like . and ... are not implemented by go doc.
-
-When run with two arguments, the first must be a full package path (not just a
-suffix), and the second is a symbol or symbol and method; this is similar to the
-syntax accepted by godoc:
-
-	go doc <pkg> <sym>[.<method>]
-
-In all forms, when matching symbols, lower-case letters in the argument match
-either case but upper-case letters match exactly. This means that there may be
-multiple matches of a lower-case argument in a package if different symbols have
-different cases. If this occurs, documentation for all matches is printed.
-
-Examples:
-	go doc
-		Show documentation for current package.
-	go doc Foo
-		Show documentation for Foo in the current package.
-		(Foo starts with a capital letter so it cannot match
-		a package path.)
-	go doc encoding/json
-		Show documentation for the encoding/json package.
-	go doc json
-		Shorthand for encoding/json.
-	go doc json.Number (or go doc json.number)
-		Show documentation and method summary for json.Number.
-	go doc json.Number.Int64 (or go doc json.number.int64)
-		Show documentation for json.Number's Int64 method.
-	go doc cmd/doc
-		Show package docs for the doc command.
-	go doc -cmd cmd/doc
-		Show package docs and exported symbols within the doc command.
-	go doc template.new
-		Show documentation for html/template's New function.
-		(html/template is lexically before text/template)
-	go doc text/template.new # One argument
-		Show documentation for text/template's New function.
-	go doc text/template new # Two arguments
-		Show documentation for text/template's New function.
-
-Flags:
-	-c
-		Respect case when matching symbols.
-	-cmd
-		Treat a command (package main) like a regular package.
-		Otherwise package main's exported symbols are hidden
-		when showing the package's top-level documentation.
-	-u
-		Show documentation for unexported as well as exported
-		symbols and methods.
-
-
-Print Go environment information
-
-Usage:
-
-	go env [var ...]
-
-Env prints Go environment information.
-
-By default env prints information as a shell script
-(on Windows, a batch file).  If one or more variable
-names is given as arguments,  env prints the value of
-each named variable on its own line.
-
-
-Run go tool fix on packages
-
-Usage:
-
-	go fix [packages]
-
-Fix runs the Go fix command on the packages named by the import paths.
-
-For more about fix, see 'go doc cmd/fix'.
-For more about specifying packages, see 'go help packages'.
-
-To run fix with specific options, run 'go tool fix'.
-
-See also: go fmt, go vet.
-
-
-Run gofmt on package sources
-
-Usage:
-
-	go fmt [-n] [-x] [packages]
-
-Fmt runs the command 'gofmt -l -w' on the packages named
-by the import paths.  It prints the names of the files that are modified.
-
-For more about gofmt, see 'go doc cmd/gofmt'.
-For more about specifying packages, see 'go help packages'.
-
-The -n flag prints commands that would be executed.
-The -x flag prints commands as they are executed.
-
-To run gofmt with specific options, run gofmt itself.
-
-See also: go fix, go vet.
-
-
-Generate Go files by processing source
-
-Usage:
-
-	go generate [-run regexp] [file.go... | packages]
-
-Generate runs commands described by directives within existing
-files. Those commands can run any process but the intent is to
-create or update Go source files, for instance by running yacc.
-
-Go generate is never run automatically by go build, go get, go test,
-and so on. It must be run explicitly.
-
-Go generate scans the file for directives, which are lines of
-the form,
-
-	//go:generate command argument...
-
-(note: no leading spaces and no space in "//go") where command
-is the generator to be run, corresponding to an executable file
-that can be run locally. It must either be in the shell path
-(gofmt), a fully qualified path (/usr/you/bin/mytool), or a
-command alias, described below.
-
-Note that go generate does not parse the file, so lines that look
-like directives in comments or multiline strings will be treated
-as directives.
-
-The arguments to the directive are space-separated tokens or
-double-quoted strings passed to the generator as individual
-arguments when it is run.
-
-Quoted strings use Go syntax and are evaluated before execution; a
-quoted string appears as a single argument to the generator.
-
-Go generate sets several variables when it runs the generator:
-
-	$GOARCH
-		The execution architecture (arm, amd64, etc.)
-	$GOOS
-		The execution operating system (linux, windows, etc.)
-	$GOFILE
-		The base name of the file.
-	$GOLINE
-		The line number of the directive in the source file.
-	$GOPACKAGE
-		The name of the package of the file containing the directive.
-	$DOLLAR
-		A dollar sign.
-
-Other than variable substitution and quoted-string evaluation, no
-special processing such as "globbing" is performed on the command
-line.
-
-As a last step before running the command, any invocations of any
-environment variables with alphanumeric names, such as $GOFILE or
-$HOME, are expanded throughout the command line. The syntax for
-variable expansion is $NAME on all operating systems.  Due to the
-order of evaluation, variables are expanded even inside quoted
-strings. If the variable NAME is not set, $NAME expands to the
-empty string.
-
-A directive of the form,
-
-	//go:generate -command xxx args...
-
-specifies, for the remainder of this source file only, that the
-string xxx represents the command identified by the arguments. This
-can be used to create aliases or to handle multiword generators.
-For example,
-
-	//go:generate -command yacc go tool yacc
-
-specifies that the command "yacc" represents the generator
-"go tool yacc".
-
-Generate processes packages in the order given on the command line,
-one at a time. If the command line lists .go files, they are treated
-as a single package. Within a package, generate processes the
-source files in a package in file name order, one at a time. Within
-a source file, generate runs generators in the order they appear
-in the file, one at a time.
-
-If any generator returns an error exit status, "go generate" skips
-all further processing for that package.
-
-The generator is run in the package's source directory.
-
-Go generate accepts one specific flag:
-
-	-run=""
-		if non-empty, specifies a regular expression to select
-		directives whose full original source text (excluding
-		any trailing spaces and final newline) matches the
-		expression.
-
-It also accepts the standard build flags -v, -n, and -x.
-The -v flag prints the names of packages and files as they are
-processed.
-The -n flag prints commands that would be executed.
-The -x flag prints commands as they are executed.
-
-For more about specifying packages, see 'go help packages'.
-
-
-Download and install packages and dependencies
-
-Usage:
-
-	go get [-d] [-f] [-fix] [-insecure] [-t] [-u] [build flags] [packages]
-
-Get downloads and installs the packages named by the import paths,
-along with their dependencies.
-
-The -d flag instructs get to stop after downloading the packages; that is,
-it instructs get not to install the packages.
-
-The -f flag, valid only when -u is set, forces get -u not to verify that
-each package has been checked out from the source control repository
-implied by its import path. This can be useful if the source is a local fork
-of the original.
-
-The -fix flag instructs get to run the fix tool on the downloaded packages
-before resolving dependencies or building the code.
-
-The -insecure flag permits fetching from repositories and resolving
-custom domains using insecure schemes such as HTTP. Use with caution.
-
-The -t flag instructs get to also download the packages required to build
-the tests for the specified packages.
-
-The -u flag instructs get to use the network to update the named packages
-and their dependencies.  By default, get uses the network to check out
-missing packages but does not use it to look for updates to existing packages.
-
-Get also accepts build flags to control the installation. See 'go help build'.
-
-When checking out or updating a package, get looks for a branch or tag
-that matches the locally installed version of Go. The most important
-rule is that if the local installation is running version "go1", get
-searches for a branch or tag named "go1". If no such version exists it
-retrieves the most recent version of the package.
-
-If the vendoring experiment is enabled (see 'go help gopath'),
-then when go get checks out or updates a Git repository,
-it also updates any git submodules referenced by the repository.
-
-For more about specifying packages, see 'go help packages'.
-
-For more about how 'go get' finds source code to
-download, see 'go help importpath'.
-
-See also: go build, go install, go clean.
-
-
-Compile and install packages and dependencies
-
-Usage:
-
-	go install [build flags] [packages]
-
-Install compiles and installs the packages named by the import paths,
-along with their dependencies.
-
-For more about the build flags, see 'go help build'.
-For more about specifying packages, see 'go help packages'.
-
-See also: go build, go get, go clean.
-
-
-List packages
-
-Usage:
-
-	go list [-e] [-f format] [-json] [build flags] [packages]
-
-List lists the packages named by the import paths, one per line.
-
-The default output shows the package import path:
-
-    bytes
-    encoding/json
-    github.com/gorilla/mux
-    golang.org/x/net/html
-
-The -f flag specifies an alternate format for the list, using the
-syntax of package template.  The default output is equivalent to -f
-'{{.ImportPath}}'. The struct being passed to the template is:
-
-    type Package struct {
-        Dir           string // directory containing package sources
-        ImportPath    string // import path of package in dir
-        ImportComment string // path in import comment on package statement
-        Name          string // package name
-        Doc           string // package documentation string
-        Target        string // install path
-        Shlib         string // the shared library that contains this package (only set when -linkshared)
-        Goroot        bool   // is this package in the Go root?
-        Standard      bool   // is this package part of the standard Go library?
-        Stale         bool   // would 'go install' do anything for this package?
-        Root          string // Go root or Go path dir containing this package
-
-        // Source files
-        GoFiles        []string // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
-        CgoFiles       []string // .go sources files that import "C"
-        IgnoredGoFiles []string // .go sources ignored due to build constraints
-        CFiles         []string // .c source files
-        CXXFiles       []string // .cc, .cxx and .cpp source files
-        MFiles         []string // .m source files
-        HFiles         []string // .h, .hh, .hpp and .hxx source files
-        SFiles         []string // .s source files
-        SwigFiles      []string // .swig files
-        SwigCXXFiles   []string // .swigcxx files
-        SysoFiles      []string // .syso object files to add to archive
-
-        // Cgo directives
-        CgoCFLAGS    []string // cgo: flags for C compiler
-        CgoCPPFLAGS  []string // cgo: flags for C preprocessor
-        CgoCXXFLAGS  []string // cgo: flags for C++ compiler
-        CgoLDFLAGS   []string // cgo: flags for linker
-        CgoPkgConfig []string // cgo: pkg-config names
-
-        // Dependency information
-        Imports []string // import paths used by this package
-        Deps    []string // all (recursively) imported dependencies
-
-        // Error information
-        Incomplete bool            // this package or a dependency has an error
-        Error      *PackageError   // error loading package
-        DepsErrors []*PackageError // errors loading dependencies
-
-        TestGoFiles  []string // _test.go files in package
-        TestImports  []string // imports from TestGoFiles
-        XTestGoFiles []string // _test.go files outside package
-        XTestImports []string // imports from XTestGoFiles
-    }
-
-The template function "join" calls strings.Join.
-
-The template function "context" returns the build context, defined as:
-
-	type Context struct {
-		GOARCH        string   // target architecture
-		GOOS          string   // target operating system
-		GOROOT        string   // Go root
-		GOPATH        string   // Go path
-		CgoEnabled    bool     // whether cgo can be used
-		UseAllFiles   bool     // use files regardless of +build lines, file names
-		Compiler      string   // compiler to assume when computing target paths
-		BuildTags     []string // build constraints to match in +build lines
-		ReleaseTags   []string // releases the current release is compatible with
-		InstallSuffix string   // suffix to use in the name of the install dir
-	}
-
-For more information about the meaning of these fields see the documentation
-for the go/build package's Context type.
-
-The -json flag causes the package data to be printed in JSON format
-instead of using the template format.
-
-The -e flag changes the handling of erroneous packages, those that
-cannot be found or are malformed.  By default, the list command
-prints an error to standard error for each erroneous package and
-omits the packages from consideration during the usual printing.
-With the -e flag, the list command never prints errors to standard
-error and instead processes the erroneous packages with the usual
-printing.  Erroneous packages will have a non-empty ImportPath and
-a non-nil Error field; other information may or may not be missing
-(zeroed).
-
-For more about build flags, see 'go help build'.
-
-For more about specifying packages, see 'go help packages'.
-
-
-Compile and run Go program
-
-Usage:
-
-	go run [build flags] [-exec xprog] gofiles... [arguments...]
-
-Run compiles and runs the main package comprising the named Go source files.
-A Go source file is defined to be a file ending in a literal ".go" suffix.
-
-By default, 'go run' runs the compiled binary directly: 'a.out arguments...'.
-If the -exec flag is given, 'go run' invokes the binary using xprog:
-	'xprog a.out arguments...'.
-If the -exec flag is not given, GOOS or GOARCH is different from the system
-default, and a program named go_$GOOS_$GOARCH_exec can be found
-on the current search path, 'go run' invokes the binary using that program,
-for example 'go_nacl_386_exec a.out arguments...'. This allows execution of
-cross-compiled programs when a simulator or other execution method is
-available.
-
-For more about build flags, see 'go help build'.
-
-See also: go build.
-
-
-Test packages
-
-Usage:
-
-	go test [-c] [-i] [build and test flags] [packages] [flags for test binary]
-
-'Go test' automates testing the packages named by the import paths.
-It prints a summary of the test results in the format:
-
-	ok   archive/tar   0.011s
-	FAIL archive/zip   0.022s
-	ok   compress/gzip 0.033s
-	...
-
-followed by detailed output for each failed package.
-
-'Go test' recompiles each package along with any files with names matching
-the file pattern "*_test.go".
-Files whose names begin with "_" (including "_test.go") or "." are ignored.
-These additional files can contain test functions, benchmark functions, and
-example functions.  See 'go help testfunc' for more.
-Each listed package causes the execution of a separate test binary.
-
-Test files that declare a package with the suffix "_test" will be compiled as a
-separate package, and then linked and run with the main test binary.
-
-By default, go test needs no arguments.  It compiles and tests the package
-with source in the current directory, including tests, and runs the tests.
-
-The package is built in a temporary directory so it does not interfere with the
-non-test installation.
-
-In addition to the build flags, the flags handled by 'go test' itself are:
-
-	-c
-		Compile the test binary to pkg.test but do not run it
-		(where pkg is the last element of the package's import path).
-		The file name can be changed with the -o flag.
-
-	-exec xprog
-	    Run the test binary using xprog. The behavior is the same as
-	    in 'go run'. See 'go help run' for details.
-
-	-i
-	    Install packages that are dependencies of the test.
-	    Do not run the test.
-
-	-o file
-		Compile the test binary to the named file.
-		The test still runs (unless -c or -i is specified).
-
-The test binary also accepts flags that control execution of the test; these
-flags are also accessible by 'go test'. See 'go help testflag' for details.
-
-If the test binary needs any other flags, they should be presented after the
-package names. The go tool treats as a flag the first argument that begins with
-a minus sign that it does not recognize itself; that argument and all subsequent
-arguments are passed as arguments to the test binary.
-
-For more about build flags, see 'go help build'.
-For more about specifying packages, see 'go help packages'.
-
-See also: go build, go vet.
-
-
-Run specified go tool
-
-Usage:
-
-	go tool [-n] command [args...]
-
-Tool runs the go tool command identified by the arguments.
-With no arguments it prints the list of known tools.
-
-The -n flag causes tool to print the command that would be
-executed but not execute it.
-
-For more about each tool command, see 'go tool command -h'.
-
-
-Print Go version
-
-Usage:
-
-	go version
-
-Version prints the Go version, as reported by runtime.Version.
-
-
-Run go tool vet on packages
-
-Usage:
-
-	go vet [-n] [-x] [build flags] [packages]
-
-Vet runs the Go vet command on the packages named by the import paths.
-
-For more about vet, see 'go doc cmd/vet'.
-For more about specifying packages, see 'go help packages'.
-
-To run the vet tool with specific options, run 'go tool vet'.
-
-The -n flag prints commands that would be executed.
-The -x flag prints commands as they are executed.
-
-For more about build flags, see 'go help build'.
-
-See also: go fmt, go fix.
-
-
-Calling between Go and C
-
-There are two different ways to call between Go and C/C++ code.
-
-The first is the cgo tool, which is part of the Go distribution.  For
-information on how to use it see the cgo documentation (go doc cmd/cgo).
-
-The second is the SWIG program, which is a general tool for
-interfacing between languages.  For information on SWIG see
-http://swig.org/.  When running go build, any file with a .swig
-extension will be passed to SWIG.  Any file with a .swigcxx extension
-will be passed to SWIG with the -c++ option.
-
-When either cgo or SWIG is used, go build will pass any .c, .m, .s,
-or .S files to the C compiler, and any .cc, .cpp, .cxx files to the C++
-compiler.  The CC or CXX environment variables may be set to determine
-the C or C++ compiler, respectively, to use.
-
-
-Description of build modes
-
-The 'go build' and 'go install' commands take a -buildmode argument which
-indicates which kind of object file is to be built. Currently supported values
-are:
-
-	-buildmode=archive
-		Build the listed non-main packages into .a files. Packages named
-		main are ignored.
-
-	-buildmode=c-archive
-		Build the listed main package, plus all packages it imports,
-		into a C archive file. The only callable symbols will be those
-		functions exported using a cgo //export comment. Requires
-		exactly one main package to be listed.
-
-	-buildmode=c-shared
-		Build the listed main packages, plus all packages that they
-		import, into C shared libraries. The only callable symbols will
-		be those functions exported using a cgo //export comment.
-		Non-main packages are ignored.
-
-	-buildmode=default
-		Listed main packages are built into executables and listed
-		non-main packages are built into .a files (the default
-		behavior).
-
-	-buildmode=shared
-		Combine all the listed non-main packages into a single shared
-		library that will be used when building with the -linkshared
-		option. Packages named main are ignored.
-
-	-buildmode=exe
-		Build the listed main packages and everything they import into
-		executables. Packages not named main are ignored.
-
-
-File types
-
-The go command examines the contents of a restricted set of files
-in each directory. It identifies which files to examine based on
-the extension of the file name. These extensions are:
-
-	.go
-		Go source files.
-	.c, .h
-		C source files.
-		If the package uses cgo or SWIG, these will be compiled with the
-		OS-native compiler (typically gcc); otherwise they will
-		trigger an error.
-	.cc, .cpp, .cxx, .hh, .hpp, .hxx
-		C++ source files. Only useful with cgo or SWIG, and always
-		compiled with the OS-native compiler.
-	.m
-		Objective-C source files. Only useful with cgo, and always
-		compiled with the OS-native compiler.
-	.s, .S
-		Assembler source files.
-		If the package uses cgo or SWIG, these will be assembled with the
-		OS-native assembler (typically gcc (sic)); otherwise they
-		will be assembled with the Go assembler.
-	.swig, .swigcxx
-		SWIG definition files.
-	.syso
-		System object files.
-
-Files of each of these types except .syso may contain build
-constraints, but the go command stops scanning for build constraints
-at the first item in the file that is not a blank line or //-style
-line comment.
-
-
-GOPATH environment variable
-
-The Go path is used to resolve import statements.
-It is implemented by and documented in the go/build package.
-
-The GOPATH environment variable lists places to look for Go code.
-On Unix, the value is a colon-separated string.
-On Windows, the value is a semicolon-separated string.
-On Plan 9, the value is a list.
-
-GOPATH must be set to get, build and install packages outside the
-standard Go tree.
-
-Each directory listed in GOPATH must have a prescribed structure:
-
-The src directory holds source code.  The path below src
-determines the import path or executable name.
-
-The pkg directory holds installed package objects.
-As in the Go tree, each target operating system and
-architecture pair has its own subdirectory of pkg
-(pkg/GOOS_GOARCH).
-
-If DIR is a directory listed in the GOPATH, a package with
-source in DIR/src/foo/bar can be imported as "foo/bar" and
-has its compiled form installed to "DIR/pkg/GOOS_GOARCH/foo/bar.a".
-
-The bin directory holds compiled commands.
-Each command is named for its source directory, but only
-the final element, not the entire path.  That is, the
-command with source in DIR/src/foo/quux is installed into
-DIR/bin/quux, not DIR/bin/foo/quux.  The "foo/" prefix is stripped
-so that you can add DIR/bin to your PATH to get at the
-installed commands.  If the GOBIN environment variable is
-set, commands are installed to the directory it names instead
-of DIR/bin.
-
-Here's an example directory layout:
-
-    GOPATH=/home/user/gocode
-
-    /home/user/gocode/
-        src/
-            foo/
-                bar/               (go code in package bar)
-                    x.go
-                quux/              (go code in package main)
-                    y.go
-        bin/
-            quux                   (installed command)
-        pkg/
-            linux_amd64/
-                foo/
-                    bar.a          (installed package object)
-
-Go searches each directory listed in GOPATH to find source code,
-but new packages are always downloaded into the first directory
-in the list.
-
-See https://golang.org/doc/code.html for an example.
-
-Internal Directories
-
-Code in or below a directory named "internal" is importable only
-by code in the directory tree rooted at the parent of "internal".
-Here's an extended version of the directory layout above:
-
-    /home/user/gocode/
-        src/
-            crash/
-                bang/              (go code in package bang)
-                    b.go
-            foo/                   (go code in package foo)
-                f.go
-                bar/               (go code in package bar)
-                    x.go
-                internal/
-                    baz/           (go code in package baz)
-                        z.go
-                quux/              (go code in package main)
-                    y.go
-
-
-The code in z.go is imported as "foo/internal/baz", but that
-import statement can only appear in source files in the subtree
-rooted at foo. The source files foo/f.go, foo/bar/x.go, and
-foo/quux/y.go can all import "foo/internal/baz", but the source file
-crash/bang/b.go cannot.
-
-See https://golang.org/s/go14internal for details.
-
-Vendor Directories
-
-Go 1.5 includes experimental support for using local copies
-of external dependencies to satisfy imports of those dependencies,
-often referred to as vendoring. Setting the environment variable
-GO15VENDOREXPERIMENT=1 enables that experimental support.
-
-When the vendor experiment is enabled,
-code below a directory named "vendor" is importable only
-by code in the directory tree rooted at the parent of "vendor",
-and only using an import path that omits the prefix up to and
-including the vendor element.
-
-Here's the example from the previous section,
-but with the "internal" directory renamed to "vendor"
-and a new foo/vendor/crash/bang directory added:
-
-    /home/user/gocode/
-        src/
-            crash/
-                bang/              (go code in package bang)
-                    b.go
-            foo/                   (go code in package foo)
-                f.go
-                bar/               (go code in package bar)
-                    x.go
-                vendor/
-                    crash/
-                        bang/      (go code in package bang)
-                            b.go
-                    baz/           (go code in package baz)
-                        z.go
-                quux/              (go code in package main)
-                    y.go
-
-The same visibility rules apply as for internal, but the code
-in z.go is imported as "baz", not as "foo/vendor/baz".
-
-Code in vendor directories deeper in the source tree shadows
-code in higher directories. Within the subtree rooted at foo, an import
-of "crash/bang" resolves to "foo/vendor/crash/bang", not the
-top-level "crash/bang".
-
-Code in vendor directories is not subject to import path
-checking (see 'go help importpath').
-
-When the vendor experiment is enabled, 'go get' checks out
-submodules when checking out or updating a git repository
-(see 'go help get').
-
-The vendoring semantics are an experiment, and they may change
-in future releases. Once settled, they will be on by default.
-
-See https://golang.org/s/go15vendor for details.
-
-
-Environment variables
-
-The go command, and the tools it invokes, examine a few different
-environment variables. For many of these, you can see the default
-value of on your system by running 'go env NAME', where NAME is the
-name of the variable.
-
-General-purpose environment variables:
-
-	GCCGO
-		The gccgo command to run for 'go build -compiler=gccgo'.
-	GOARCH
-		The architecture, or processor, for which to compile code.
-		Examples are amd64, 386, arm, ppc64.
-	GOBIN
-		The directory where 'go install' will install a command.
-	GOOS
-		The operating system for which to compile code.
-		Examples are linux, darwin, windows, netbsd.
-	GOPATH
-		See 'go help gopath'.
-	GORACE
-		Options for the race detector.
-		See https://golang.org/doc/articles/race_detector.html.
-	GOROOT
-		The root of the go tree.
-
-Environment variables for use with cgo:
-
-	CC
-		The command to use to compile C code.
-	CGO_ENABLED
-		Whether the cgo command is supported.  Either 0 or 1.
-	CGO_CFLAGS
-		Flags that cgo will pass to the compiler when compiling
-		C code.
-	CGO_CPPFLAGS
-		Flags that cgo will pass to the compiler when compiling
-		C or C++ code.
-	CGO_CXXFLAGS
-		Flags that cgo will pass to the compiler when compiling
-		C++ code.
-	CGO_LDFLAGS
-		Flags that cgo will pass to the compiler when linking.
-	CXX
-		The command to use to compile C++ code.
-
-Architecture-specific environment variables:
-
-	GOARM
-		For GOARCH=arm, the ARM architecture for which to compile.
-		Valid values are 5, 6, 7.
-	GO386
-		For GOARCH=386, the floating point instruction set.
-		Valid values are 387, sse2.
-
-Special-purpose environment variables:
-
-	GOROOT_FINAL
-		The root of the installed Go tree, when it is
-		installed in a location other than where it is built.
-		File names in stack traces are rewritten from GOROOT to
-		GOROOT_FINAL.
-	GO15VENDOREXPERIMENT
-		Set to 1 to enable the Go 1.5 vendoring experiment.
-	GO_EXTLINK_ENABLED
-		Whether the linker should use external linking mode
-		when using -linkmode=auto with code that uses cgo.
-		Set to 0 to disable external linking mode, 1 to enable it.
-
-
-Import path syntax
-
-An import path (see 'go help packages') denotes a package
-stored in the local file system.  In general, an import path denotes
-either a standard package (such as "unicode/utf8") or a package
-found in one of the work spaces (see 'go help gopath').
-
-Relative import paths
-
-An import path beginning with ./ or ../ is called a relative path.
-The toolchain supports relative import paths as a shortcut in two ways.
-
-First, a relative path can be used as a shorthand on the command line.
-If you are working in the directory containing the code imported as
-"unicode" and want to run the tests for "unicode/utf8", you can type
-"go test ./utf8" instead of needing to specify the full path.
-Similarly, in the reverse situation, "go test .." will test "unicode" from
-the "unicode/utf8" directory. Relative patterns are also allowed, like
-"go test ./..." to test all subdirectories. See 'go help packages' for details
-on the pattern syntax.
-
-Second, if you are compiling a Go program not in a work space,
-you can use a relative path in an import statement in that program
-to refer to nearby code also not in a work space.
-This makes it easy to experiment with small multipackage programs
-outside of the usual work spaces, but such programs cannot be
-installed with "go install" (there is no work space in which to install them),
-so they are rebuilt from scratch each time they are built.
-To avoid ambiguity, Go programs cannot use relative import paths
-within a work space.
-
-Remote import paths
-
-Certain import paths also
-describe how to obtain the source code for the package using
-a revision control system.
-
-A few common code hosting sites have special syntax:
-
-	Bitbucket (Git, Mercurial)
-
-		import "bitbucket.org/user/project"
-		import "bitbucket.org/user/project/sub/directory"
-
-	GitHub (Git)
-
-		import "github.com/user/project"
-		import "github.com/user/project/sub/directory"
-
-	Google Code Project Hosting (Git, Mercurial, Subversion)
-
-		import "code.google.com/p/project"
-		import "code.google.com/p/project/sub/directory"
-
-		import "code.google.com/p/project.subrepository"
-		import "code.google.com/p/project.subrepository/sub/directory"
-
-	Launchpad (Bazaar)
-
-		import "launchpad.net/project"
-		import "launchpad.net/project/series"
-		import "launchpad.net/project/series/sub/directory"
-
-		import "launchpad.net/~user/project/branch"
-		import "launchpad.net/~user/project/branch/sub/directory"
-
-	IBM DevOps Services (Git)
-
-		import "hub.jazz.net/git/user/project"
-		import "hub.jazz.net/git/user/project/sub/directory"
-
-For code hosted on other servers, import paths may either be qualified
-with the version control type, or the go tool can dynamically fetch
-the import path over https/http and discover where the code resides
-from a <meta> tag in the HTML.
-
-To declare the code location, an import path of the form
-
-	repository.vcs/path
-
-specifies the given repository, with or without the .vcs suffix,
-using the named version control system, and then the path inside
-that repository.  The supported version control systems are:
-
-	Bazaar      .bzr
-	Git         .git
-	Mercurial   .hg
-	Subversion  .svn
-
-For example,
-
-	import "example.org/user/foo.hg"
-
-denotes the root directory of the Mercurial repository at
-example.org/user/foo or foo.hg, and
-
-	import "example.org/repo.git/foo/bar"
-
-denotes the foo/bar directory of the Git repository at
-example.org/repo or repo.git.
-
-When a version control system supports multiple protocols,
-each is tried in turn when downloading.  For example, a Git
-download tries https://, then git+ssh://.
-
-If the import path is not a known code hosting site and also lacks a
-version control qualifier, the go tool attempts to fetch the import
-over https/http and looks for a <meta> tag in the document's HTML
-<head>.
-
-The meta tag has the form:
-
-	<meta name="go-import" content="import-prefix vcs repo-root">
-
-The import-prefix is the import path corresponding to the repository
-root. It must be a prefix or an exact match of the package being
-fetched with "go get". If it's not an exact match, another http
-request is made at the prefix to verify the <meta> tags match.
-
-The meta tag should appear as early in the file as possible.
-In particular, it should appear before any raw JavaScript or CSS,
-to avoid confusing the go command's restricted parser.
-
-The vcs is one of "git", "hg", "svn", etc,
-
-The repo-root is the root of the version control system
-containing a scheme and not containing a .vcs qualifier.
-
-For example,
-
-	import "example.org/pkg/foo"
-
-will result in the following requests:
-
-	https://example.org/pkg/foo?go-get=1 (preferred)
-	http://example.org/pkg/foo?go-get=1  (fallback, only with -insecure)
-
-If that page contains the meta tag
-
-	<meta name="go-import" content="example.org git https://code.org/r/p/exproj">
-
-the go tool will verify that https://example.org/?go-get=1 contains the
-same meta tag and then git clone https://code.org/r/p/exproj into
-GOPATH/src/example.org.
-
-New downloaded packages are written to the first directory
-listed in the GOPATH environment variable (see 'go help gopath').
-
-The go command attempts to download the version of the
-package appropriate for the Go release being used.
-Run 'go help get' for more.
-
-Import path checking
-
-When the custom import path feature described above redirects to a
-known code hosting site, each of the resulting packages has two possible
-import paths, using the custom domain or the known hosting site.
-
-A package statement is said to have an "import comment" if it is immediately
-followed (before the next newline) by a comment of one of these two forms:
-
-	package math // import "path"
-	package math /* import "path" * /
-
-The go command will refuse to install a package with an import comment
-unless it is being referred to by that import path. In this way, import comments
-let package authors make sure the custom import path is used and not a
-direct path to the underlying code hosting site.
-
-If the vendoring experiment is enabled (see 'go help gopath'),
-then import path checking is disabled for code found within vendor trees.
-This makes it possible to copy code into alternate locations in vendor trees
-without needing to update import comments.
-
-See https://golang.org/s/go14customimport for details.
-
-
-Description of package lists
-
-Many commands apply to a set of packages:
-
-	go action [packages]
-
-Usually, [packages] is a list of import paths.
-
-An import path that is a rooted path or that begins with
-a . or .. element is interpreted as a file system path and
-denotes the package in that directory.
-
-Otherwise, the import path P denotes the package found in
-the directory DIR/src/P for some DIR listed in the GOPATH
-environment variable (see 'go help gopath').
-
-If no import paths are given, the action applies to the
-package in the current directory.
-
-There are four reserved names for paths that should not be used
-for packages to be built with the go tool:
-
-- "main" denotes the top-level package in a stand-alone executable.
-
-- "all" expands to all package directories found in all the GOPATH
-trees. For example, 'go list all' lists all the packages on the local
-system.
-
-- "std" is like all but expands to just the packages in the standard
-Go library.
-
-- "cmd" expands to the Go repository's commands and their
-internal libraries.
-
-An import path is a pattern if it includes one or more "..." wildcards,
-each of which can match any string, including the empty string and
-strings containing slashes.  Such a pattern expands to all package
-directories found in the GOPATH trees with names matching the
-patterns.  As a special case, x/... matches x as well as x's subdirectories.
-For example, net/... expands to net and packages in its subdirectories.
-
-An import path can also name a package to be downloaded from
-a remote repository.  Run 'go help importpath' for details.
-
-Every package in a program must have a unique import path.
-By convention, this is arranged by starting each path with a
-unique prefix that belongs to you.  For example, paths used
-internally at Google all begin with 'google', and paths
-denoting remote repositories begin with the path to the code,
-such as 'github.com/user/repo'.
-
-As a special case, if the package list is a list of .go files from a
-single directory, the command is applied to a single synthesized
-package made up of exactly those files, ignoring any build constraints
-in those files and ignoring any other files in the directory.
-
-Directory and file names that begin with "." or "_" are ignored
-by the go tool, as are directories named "testdata".
-
-
-Description of testing flags
-
-The 'go test' command takes both flags that apply to 'go test' itself
-and flags that apply to the resulting test binary.
-
-Several of the flags control profiling and write an execution profile
-suitable for "go tool pprof"; run "go tool pprof -h" for more
-information.  The --alloc_space, --alloc_objects, and --show_bytes
-options of pprof control how the information is presented.
-
-The following flags are recognized by the 'go test' command and
-control the execution of any test:
-
-	-bench regexp
-	    Run benchmarks matching the regular expression.
-	    By default, no benchmarks run. To run all benchmarks,
-	    use '-bench .' or '-bench=.'.
-
-	-benchmem
-	    Print memory allocation statistics for benchmarks.
-
-	-benchtime t
-	    Run enough iterations of each benchmark to take t, specified
-	    as a time.Duration (for example, -benchtime 1h30s).
-	    The default is 1 second (1s).
-
-	-blockprofile block.out
-	    Write a goroutine blocking profile to the specified file
-	    when all tests are complete.
-	    Writes test binary as -c would.
-
-	-blockprofilerate n
-	    Control the detail provided in goroutine blocking profiles by
-	    calling runtime.SetBlockProfileRate with n.
-	    See 'go doc runtime.SetBlockProfileRate'.
-	    The profiler aims to sample, on average, one blocking event every
-	    n nanoseconds the program spends blocked.  By default,
-	    if -test.blockprofile is set without this flag, all blocking events
-	    are recorded, equivalent to -test.blockprofilerate=1.
-
-	-count n
-	    Run each test and benchmark n times (default 1).
-	    If -cpu is set, run n times for each GOMAXPROCS value.
-	    Examples are always run once.
-
-	-cover
-	    Enable coverage analysis.
-
-	-covermode set,count,atomic
-	    Set the mode for coverage analysis for the package[s]
-	    being tested. The default is "set" unless -race is enabled,
-	    in which case it is "atomic".
-	    The values:
-		set: bool: does this statement run?
-		count: int: how many times does this statement run?
-		atomic: int: count, but correct in multithreaded tests;
-			significantly more expensive.
-	    Sets -cover.
-
-	-coverpkg pkg1,pkg2,pkg3
-	    Apply coverage analysis in each test to the given list of packages.
-	    The default is for each test to analyze only the package being tested.
-	    Packages are specified as import paths.
-	    Sets -cover.
-
-	-coverprofile cover.out
-	    Write a coverage profile to the file after all tests have passed.
-	    Sets -cover.
-
-	-cpu 1,2,4
-	    Specify a list of GOMAXPROCS values for which the tests or
-	    benchmarks should be executed.  The default is the current value
-	    of GOMAXPROCS.
-
-	-cpuprofile cpu.out
-	    Write a CPU profile to the specified file before exiting.
-	    Writes test binary as -c would.
-
-	-memprofile mem.out
-	    Write a memory profile to the file after all tests have passed.
-	    Writes test binary as -c would.
-
-	-memprofilerate n
-	    Enable more precise (and expensive) memory profiles by setting
-	    runtime.MemProfileRate.  See 'go doc runtime.MemProfileRate'.
-	    To profile all memory allocations, use -test.memprofilerate=1
-	    and pass --alloc_space flag to the pprof tool.
-
-	-outputdir directory
-	    Place output files from profiling in the specified directory,
-	    by default the directory in which "go test" is running.
-
-	-parallel n
-	    Allow parallel execution of test functions that call t.Parallel.
-	    The value of this flag is the maximum number of tests to run
-	    simultaneously; by default, it is set to the value of GOMAXPROCS.
-
-	-run regexp
-	    Run only those tests and examples matching the regular
-	    expression.
-
-	-short
-	    Tell long-running tests to shorten their run time.
-	    It is off by default but set during all.bash so that installing
-	    the Go tree can run a sanity check but not spend time running
-	    exhaustive tests.
-
-	-timeout t
-	    If a test runs longer than t, panic.
-	    The default is 10 minutes (10m).
-
-	-trace trace.out
-	    Write an execution trace to the specified file before exiting.
-	    Writes test binary as -c would.
-
-	-v
-	    Verbose output: log all tests as they are run. Also print all
-	    text from Log and Logf calls even if the test succeeds.
-
-The test binary, called pkg.test where pkg is the name of the
-directory containing the package sources, can be invoked directly
-after building it with 'go test -c'. When invoking the test binary
-directly, each of the standard flag names must be prefixed with 'test.',
-as in -test.run=TestMyFunc or -test.v.
-
-When running 'go test', flags not listed above are passed through
-unaltered. For instance, the command
-
-	go test -x -v -cpuprofile=prof.out -dir=testdata -update
-
-will compile the test binary and then run it as
-
-	pkg.test -test.v -test.cpuprofile=prof.out -dir=testdata -update
-
-The test flags that generate profiles (other than for coverage) also
-leave the test binary in pkg.test for use when analyzing the profiles.
-
-Flags not recognized by 'go test' must be placed after any specified packages.
-
-
-Description of testing functions
-
-The 'go test' command expects to find test, benchmark, and example functions
-in the "*_test.go" files corresponding to the package under test.
-
-A test function is one named TestXXX (where XXX is any alphanumeric string
-not starting with a lower case letter) and should have the signature,
-
-	func TestXXX(t *testing.T) { ... }
-
-A benchmark function is one named BenchmarkXXX and should have the signature,
-
-	func BenchmarkXXX(b *testing.B) { ... }
-
-An example function is similar to a test function but, instead of using
-*testing.T to report success or failure, prints output to os.Stdout.
-That output is compared against the function's "Output:" comment, which
-must be the last comment in the function body (see example below). An
-example with no such comment, or with no text after "Output:" is compiled
-but not executed.
-
-Godoc displays the body of ExampleXXX to demonstrate the use
-of the function, constant, or variable XXX.  An example of a method M with
-receiver type T or *T is named ExampleT_M.  There may be multiple examples
-for a given function, constant, or variable, distinguished by a trailing _xxx,
-where xxx is a suffix not beginning with an upper case letter.
-
-Here is an example of an example:
-
-	func ExamplePrintln() {
-		Println("The output of\nthis example.")
-		// Output: The output of
-		// this example.
-	}
-
-The entire test file is presented as the example when it contains a single
-example function, at least one other function, type, variable, or constant
-declaration, and no test or benchmark functions.
-
-See the documentation of the testing package for more information.
-
-
-*/
-package main
diff --git a/third_party/gofrontend/libgo/go/cmd/go/bootstrap.go b/third_party/gofrontend/libgo/go/cmd/go/bootstrap.go
deleted file mode 100644
index 1686df7..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/bootstrap.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cmd_go_bootstrap
-
-// This code is compiled only into the bootstrap 'go' binary.
-// These stubs avoid importing packages with large dependency
-// trees, like the use of "net/http" in vcs.go.
-
-package main
-
-import (
-	"errors"
-	"io"
-)
-
-var errHTTP = errors.New("no http in bootstrap go command")
-
-type httpError struct {
-	statusCode int
-}
-
-func (e *httpError) Error() string {
-	panic("unreachable")
-}
-
-func httpGET(url string) ([]byte, error) {
-	return nil, errHTTP
-}
-
-func httpsOrHTTP(importPath string, security securityMode) (string, io.ReadCloser, error) {
-	return "", nil, errHTTP
-}
-
-func parseMetaGoImports(r io.Reader) ([]metaImport, error) {
-	panic("unreachable")
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/build.go b/third_party/gofrontend/libgo/go/cmd/go/build.go
deleted file mode 100644
index 865871c..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/build.go
+++ /dev/null
@@ -1,3370 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bufio"
-	"bytes"
-	"container/heap"
-	"debug/elf"
-	"errors"
-	"flag"
-	"fmt"
-	"go/build"
-	"io"
-	"io/ioutil"
-	"log"
-	"os"
-	"os/exec"
-	"path"
-	"path/filepath"
-	"regexp"
-	"runtime"
-	"strconv"
-	"strings"
-	"sync"
-	"time"
-)
-
-var cmdBuild = &Command{
-	UsageLine: "build [-o output] [-i] [build flags] [packages]",
-	Short:     "compile packages and dependencies",
-	Long: `
-Build compiles the packages named by the import paths,
-along with their dependencies, but it does not install the results.
-
-If the arguments to build are a list of .go files, build treats
-them as a list of source files specifying a single package.
-
-When compiling a single main package, build writes
-the resulting executable to an output file named after
-the first source file ('go build ed.go rx.go' writes 'ed' or 'ed.exe')
-or the source code directory ('go build unix/sam' writes 'sam' or 'sam.exe').
-The '.exe' suffix is added when writing a Windows executable.
-
-When compiling multiple packages or a single non-main package,
-build compiles the packages but discards the resulting object,
-serving only as a check that the packages can be built.
-
-The -o flag, only allowed when compiling a single package,
-forces build to write the resulting executable or object
-to the named output file, instead of the default behavior described
-in the last two paragraphs.
-
-The -i flag installs the packages that are dependencies of the target.
-
-The build flags are shared by the build, clean, get, install, list, run,
-and test commands:
-
-	-a
-		force rebuilding of packages that are already up-to-date.
-	-n
-		print the commands but do not run them.
-	-p n
-		the number of builds that can be run in parallel.
-		The default is the number of CPUs available, except
-		on darwin/arm which defaults to 1.
-	-race
-		enable data race detection.
-		Supported only on linux/amd64, freebsd/amd64, darwin/amd64 and windows/amd64.
-	-v
-		print the names of packages as they are compiled.
-	-work
-		print the name of the temporary work directory and
-		do not delete it when exiting.
-	-x
-		print the commands.
-
-	-asmflags 'flag list'
-		arguments to pass on each go tool asm invocation.
-	-buildmode mode
-		build mode to use. See 'go help buildmode' for more.
-	-compiler name
-		name of compiler to use, as in runtime.Compiler (gccgo or gc).
-	-gccgoflags 'arg list'
-		arguments to pass on each gccgo compiler/linker invocation.
-	-gcflags 'arg list'
-		arguments to pass on each go tool compile invocation.
-	-installsuffix suffix
-		a suffix to use in the name of the package installation directory,
-		in order to keep output separate from default builds.
-		If using the -race flag, the install suffix is automatically set to race
-		or, if set explicitly, has _race appended to it.  Using a -buildmode
-		option that requires non-default compile flags has a similar effect.
-	-ldflags 'flag list'
-		arguments to pass on each go tool link invocation.
-	-linkshared
-		link against shared libraries previously created with
-		-buildmode=shared
-	-pkgdir dir
-		install and load all packages from dir instead of the usual locations.
-		For example, when building with a non-standard configuration,
-		use -pkgdir to keep generated packages in a separate location.
-	-tags 'tag list'
-		a list of build tags to consider satisfied during the build.
-		For more information about build tags, see the description of
-		build constraints in the documentation for the go/build package.
-	-toolexec 'cmd args'
-		a program to use to invoke toolchain programs like vet and asm.
-		For example, instead of running asm, the go command will run
-		'cmd args /path/to/asm <arguments for asm>'.
-
-The list flags accept a space-separated list of strings. To embed spaces
-in an element in the list, surround it with either single or double quotes.
-
-For more about specifying packages, see 'go help packages'.
-For more about where packages and binaries are installed,
-run 'go help gopath'.
-For more about calling between Go and C/C++, run 'go help c'.
-
-Note: Build adheres to certain conventions such as those described
-by 'go help gopath'. Not all projects can follow these conventions,
-however. Installations that have their own conventions or that use
-a separate software build system may choose to use lower-level
-invocations such as 'go tool compile' and 'go tool link' to avoid
-some of the overheads and design decisions of the build tool.
-
-See also: go install, go get, go clean.
-	`,
-}
-
-func init() {
-	// break init cycle
-	cmdBuild.Run = runBuild
-	cmdInstall.Run = runInstall
-
-	cmdBuild.Flag.BoolVar(&buildI, "i", false, "")
-
-	addBuildFlags(cmdBuild)
-	addBuildFlags(cmdInstall)
-
-	if buildContext.GOOS == "darwin" {
-		switch buildContext.GOARCH {
-		case "arm", "arm64":
-			// darwin/arm cannot run multiple tests simultaneously.
-			// Parallelism is limited in go_darwin_arm_exec, but
-			// also needs to be limited here so go test std does not
-			// timeout tests that waiting to run.
-			buildP = 1
-		}
-	}
-}
-
-// Flags set by multiple commands.
-var buildA bool               // -a flag
-var buildN bool               // -n flag
-var buildP = runtime.NumCPU() // -p flag
-var buildV bool               // -v flag
-var buildX bool               // -x flag
-var buildI bool               // -i flag
-var buildO = cmdBuild.Flag.String("o", "", "output file")
-var buildWork bool           // -work flag
-var buildAsmflags []string   // -asmflags flag
-var buildGcflags []string    // -gcflags flag
-var buildLdflags []string    // -ldflags flag
-var buildGccgoflags []string // -gccgoflags flag
-var buildRace bool           // -race flag
-var buildToolExec []string   // -toolexec flag
-var buildBuildmode string    // -buildmode flag
-var buildLinkshared bool     // -linkshared flag
-var buildPkgdir string       // -pkgdir flag
-
-// Require the source for go std packages
-var reqStdPkgSrc bool
-var buildContext = build.Default
-var buildToolchain toolchain = noToolchain{}
-var ldBuildmode string
-
-// buildCompiler implements flag.Var.
-// It implements Set by updating both
-// buildToolchain and buildContext.Compiler.
-type buildCompiler struct{}
-
-func (c buildCompiler) Set(value string) error {
-	switch value {
-	case "gc":
-		buildToolchain = gcToolchain{}
-	case "gccgo":
-		buildToolchain = gccgoToolchain{}
-	default:
-		return fmt.Errorf("unknown compiler %q", value)
-	}
-	buildContext.Compiler = value
-	return nil
-}
-
-func (c buildCompiler) String() string {
-	return buildContext.Compiler
-}
-
-func init() {
-	switch build.Default.Compiler {
-	case "gc":
-		buildToolchain = gcToolchain{}
-	case "gccgo":
-		buildToolchain = gccgoToolchain{}
-	}
-}
-
-// addBuildFlags adds the flags common to the build, clean, get,
-// install, list, run, and test commands.
-func addBuildFlags(cmd *Command) {
-	cmd.Flag.BoolVar(&buildA, "a", false, "")
-	cmd.Flag.BoolVar(&buildN, "n", false, "")
-	cmd.Flag.IntVar(&buildP, "p", buildP, "")
-	cmd.Flag.BoolVar(&buildV, "v", false, "")
-	cmd.Flag.BoolVar(&buildX, "x", false, "")
-
-	cmd.Flag.Var((*stringsFlag)(&buildAsmflags), "asmflags", "")
-	cmd.Flag.Var(buildCompiler{}, "compiler", "")
-	cmd.Flag.StringVar(&buildBuildmode, "buildmode", "default", "")
-	cmd.Flag.Var((*stringsFlag)(&buildGcflags), "gcflags", "")
-	cmd.Flag.Var((*stringsFlag)(&buildGccgoflags), "gccgoflags", "")
-	cmd.Flag.StringVar(&buildContext.InstallSuffix, "installsuffix", "", "")
-	cmd.Flag.Var((*stringsFlag)(&buildLdflags), "ldflags", "")
-	cmd.Flag.BoolVar(&buildLinkshared, "linkshared", false, "")
-	cmd.Flag.StringVar(&buildPkgdir, "pkgdir", "", "")
-	cmd.Flag.BoolVar(&buildRace, "race", false, "")
-	cmd.Flag.Var((*stringsFlag)(&buildContext.BuildTags), "tags", "")
-	cmd.Flag.Var((*stringsFlag)(&buildToolExec), "toolexec", "")
-	cmd.Flag.BoolVar(&buildWork, "work", false, "")
-	switch build.Default.Compiler {
-	case "gc":
-		reqStdPkgSrc = true
-	case "gccgo":
-		reqStdPkgSrc = false
-	}
-}
-
-func addBuildFlagsNX(cmd *Command) {
-	cmd.Flag.BoolVar(&buildN, "n", false, "")
-	cmd.Flag.BoolVar(&buildX, "x", false, "")
-}
-
-func isSpaceByte(c byte) bool {
-	return c == ' ' || c == '\t' || c == '\n' || c == '\r'
-}
-
-// fileExtSplit expects a filename and returns the name
-// and ext (without the dot). If the file has no
-// extension, ext will be empty.
-func fileExtSplit(file string) (name, ext string) {
-	dotExt := filepath.Ext(file)
-	name = file[:len(file)-len(dotExt)]
-	if dotExt != "" {
-		ext = dotExt[1:]
-	}
-	return
-}
-
-type stringsFlag []string
-
-func (v *stringsFlag) Set(s string) error {
-	var err error
-	*v, err = splitQuotedFields(s)
-	if *v == nil {
-		*v = []string{}
-	}
-	return err
-}
-
-func splitQuotedFields(s string) ([]string, error) {
-	// Split fields allowing '' or "" around elements.
-	// Quotes further inside the string do not count.
-	var f []string
-	for len(s) > 0 {
-		for len(s) > 0 && isSpaceByte(s[0]) {
-			s = s[1:]
-		}
-		if len(s) == 0 {
-			break
-		}
-		// Accepted quoted string. No unescaping inside.
-		if s[0] == '"' || s[0] == '\'' {
-			quote := s[0]
-			s = s[1:]
-			i := 0
-			for i < len(s) && s[i] != quote {
-				i++
-			}
-			if i >= len(s) {
-				return nil, fmt.Errorf("unterminated %c string", quote)
-			}
-			f = append(f, s[:i])
-			s = s[i+1:]
-			continue
-		}
-		i := 0
-		for i < len(s) && !isSpaceByte(s[i]) {
-			i++
-		}
-		f = append(f, s[:i])
-		s = s[i:]
-	}
-	return f, nil
-}
-
-func (v *stringsFlag) String() string {
-	return "<stringsFlag>"
-}
-
-func pkgsMain(pkgs []*Package) (res []*Package) {
-	for _, p := range pkgs {
-		if p.Name == "main" {
-			res = append(res, p)
-		}
-	}
-	return res
-}
-
-func pkgsNotMain(pkgs []*Package) (res []*Package) {
-	for _, p := range pkgs {
-		if p.Name != "main" {
-			res = append(res, p)
-		}
-	}
-	return res
-}
-
-var pkgsFilter = func(pkgs []*Package) []*Package { return pkgs }
-
-func buildModeInit() {
-	_, gccgo := buildToolchain.(gccgoToolchain)
-	var codegenArg string
-	platform := goos + "/" + goarch
-	switch buildBuildmode {
-	case "archive":
-		pkgsFilter = pkgsNotMain
-	case "c-archive":
-		pkgsFilter = func(p []*Package) []*Package {
-			if len(p) != 1 || p[0].Name != "main" {
-				fatalf("-buildmode=c-archive requires exactly one main package")
-			}
-			return p
-		}
-		exeSuffix = ".a"
-		ldBuildmode = "c-archive"
-	case "c-shared":
-		pkgsFilter = pkgsMain
-		if gccgo {
-			codegenArg = "-fPIC"
-		} else {
-			switch platform {
-			case "linux/amd64":
-				codegenArg = "-shared"
-			case "linux/arm":
-				buildAsmflags = append(buildAsmflags, "-shared")
-			case "darwin/amd64":
-			case "android/arm":
-			default:
-				fatalf("-buildmode=c-shared not supported on %s\n", platform)
-			}
-		}
-		ldBuildmode = "c-shared"
-	case "default":
-		ldBuildmode = "exe"
-	case "exe":
-		pkgsFilter = pkgsMain
-		ldBuildmode = "exe"
-	case "shared":
-		pkgsFilter = pkgsNotMain
-		if gccgo {
-			codegenArg = "-fPIC"
-		} else {
-			switch platform {
-			case "linux/amd64":
-			default:
-				fatalf("-buildmode=shared not supported on %s\n", platform)
-			}
-			codegenArg = "-dynlink"
-		}
-		if *buildO != "" {
-			fatalf("-buildmode=shared and -o not supported together")
-		}
-		ldBuildmode = "shared"
-	default:
-		fatalf("buildmode=%s not supported", buildBuildmode)
-	}
-	if buildLinkshared {
-		if gccgo {
-			codegenArg = "-fPIC"
-		} else {
-			if platform != "linux/amd64" {
-				fmt.Fprintf(os.Stderr, "go %s: -linkshared is only supported on linux/amd64\n", flag.Args()[0])
-				os.Exit(2)
-			}
-			codegenArg = "-dynlink"
-			// TODO(mwhudson): remove -w when that gets fixed in linker.
-			buildLdflags = append(buildLdflags, "-linkshared", "-w")
-		}
-	}
-	if codegenArg != "" {
-		if gccgo {
-			buildGccgoflags = append(buildGccgoflags, codegenArg)
-		} else {
-			buildAsmflags = append(buildAsmflags, codegenArg)
-			buildGcflags = append(buildGcflags, codegenArg)
-		}
-		if buildContext.InstallSuffix != "" {
-			buildContext.InstallSuffix += "_"
-		}
-		buildContext.InstallSuffix += codegenArg[1:]
-	}
-}
-
-func runBuild(cmd *Command, args []string) {
-	raceInit()
-	buildModeInit()
-	var b builder
-	b.init()
-
-	pkgs := packagesForBuild(args)
-
-	if len(pkgs) == 1 && pkgs[0].Name == "main" && *buildO == "" {
-		_, *buildO = path.Split(pkgs[0].ImportPath)
-		*buildO += exeSuffix
-	}
-
-	// sanity check some often mis-used options
-	switch buildContext.Compiler {
-	case "gccgo":
-		if len(buildGcflags) != 0 {
-			fmt.Println("go build: when using gccgo toolchain, please pass compiler flags using -gccgoflags, not -gcflags")
-		}
-		if len(buildLdflags) != 0 {
-			fmt.Println("go build: when using gccgo toolchain, please pass linker flags using -gccgoflags, not -ldflags")
-		}
-	case "gc":
-		if len(buildGccgoflags) != 0 {
-			fmt.Println("go build: when using gc toolchain, please pass compile flags using -gcflags, and linker flags using -ldflags")
-		}
-	}
-
-	depMode := modeBuild
-	if buildI {
-		depMode = modeInstall
-	}
-
-	if *buildO != "" {
-		if len(pkgs) > 1 {
-			fatalf("go build: cannot use -o with multiple packages")
-		} else if len(pkgs) == 0 {
-			fatalf("no packages to build")
-		}
-		p := pkgs[0]
-		p.target = *buildO
-		p.Stale = true // must build - not up to date
-		a := b.action(modeInstall, depMode, p)
-		b.do(a)
-		return
-	}
-
-	var a *action
-	if buildBuildmode == "shared" {
-		a = b.libaction(libname(args), pkgsFilter(packages(args)), modeBuild, depMode)
-	} else {
-		a = &action{}
-		for _, p := range pkgsFilter(packages(args)) {
-			a.deps = append(a.deps, b.action(modeBuild, depMode, p))
-		}
-	}
-	b.do(a)
-}
-
-var cmdInstall = &Command{
-	UsageLine: "install [build flags] [packages]",
-	Short:     "compile and install packages and dependencies",
-	Long: `
-Install compiles and installs the packages named by the import paths,
-along with their dependencies.
-
-For more about the build flags, see 'go help build'.
-For more about specifying packages, see 'go help packages'.
-
-See also: go build, go get, go clean.
-	`,
-}
-
-// libname returns the filename to use for the shared library when using
-// -buildmode=shared.  The rules we use are:
-//  1) Drop any trailing "/..."s if present
-//  2) Change / to -
-//  3) Join arguments with ,
-// So std -> libstd.so
-//    a b/... -> liba,b.so
-//    gopkg.in/tomb.v2 -> libgopkg.in-tomb.v2.so
-func libname(args []string) string {
-	var libname string
-	for _, arg := range args {
-		arg = strings.TrimSuffix(arg, "/...")
-		arg = strings.Replace(arg, "/", "-", -1)
-		if libname == "" {
-			libname = arg
-		} else {
-			libname += "," + arg
-		}
-	}
-	// TODO(mwhudson): Needs to change for platforms that use different naming
-	// conventions...
-	return "lib" + libname + ".so"
-}
-
-func runInstall(cmd *Command, args []string) {
-	raceInit()
-	buildModeInit()
-	pkgs := pkgsFilter(packagesForBuild(args))
-
-	for _, p := range pkgs {
-		if p.Target == "" && (!p.Standard || p.ImportPath != "unsafe") {
-			switch {
-			case p.gobinSubdir:
-				errorf("go install: cannot install cross-compiled binaries when GOBIN is set")
-			case p.cmdline:
-				errorf("go install: no install location for .go files listed on command line (GOBIN not set)")
-			case p.ConflictDir != "":
-				errorf("go install: no install location for %s: hidden by %s", p.Dir, p.ConflictDir)
-			default:
-				errorf("go install: no install location for directory %s outside GOPATH\n"+
-					"\tFor more details see: go help gopath", p.Dir)
-			}
-		}
-	}
-	exitIfErrors()
-
-	var b builder
-	b.init()
-	var a *action
-	if buildBuildmode == "shared" {
-		a = b.libaction(libname(args), pkgs, modeInstall, modeInstall)
-	} else {
-		a = &action{}
-		var tools []*action
-		for _, p := range pkgs {
-			// If p is a tool, delay the installation until the end of the build.
-			// This avoids installing assemblers/compilers that are being executed
-			// by other steps in the build.
-			// cmd/cgo is handled specially in b.action, so that we can
-			// both build and use it in the same 'go install'.
-			action := b.action(modeInstall, modeInstall, p)
-			if goTools[p.ImportPath] == toTool && p.ImportPath != "cmd/cgo" {
-				a.deps = append(a.deps, action.deps...)
-				action.deps = append(action.deps, a)
-				tools = append(tools, action)
-				continue
-			}
-			a.deps = append(a.deps, action)
-		}
-		if len(tools) > 0 {
-			a = &action{
-				deps: tools,
-			}
-		}
-	}
-	b.do(a)
-	exitIfErrors()
-
-	// Success. If this command is 'go install' with no arguments
-	// and the current directory (the implicit argument) is a command,
-	// remove any leftover command binary from a previous 'go build'.
-	// The binary is installed; it's not needed here anymore.
-	// And worse it might be a stale copy, which you don't want to find
-	// instead of the installed one if $PATH contains dot.
-	// One way to view this behavior is that it is as if 'go install' first
-	// runs 'go build' and the moves the generated file to the install dir.
-	// See issue 9645.
-	if len(args) == 0 && len(pkgs) == 1 && pkgs[0].Name == "main" {
-		// Compute file 'go build' would have created.
-		// If it exists and is an executable file, remove it.
-		_, targ := filepath.Split(pkgs[0].ImportPath)
-		targ += exeSuffix
-		if filepath.Join(pkgs[0].Dir, targ) != pkgs[0].Target { // maybe $GOBIN is the current directory
-			fi, err := os.Stat(targ)
-			if err == nil {
-				m := fi.Mode()
-				if m.IsRegular() {
-					if m&0111 != 0 || goos == "windows" { // windows never sets executable bit
-						os.Remove(targ)
-					}
-				}
-			}
-		}
-	}
-}
-
-// Global build parameters (used during package load)
-var (
-	goarch    string
-	goos      string
-	exeSuffix string
-)
-
-func init() {
-	goarch = buildContext.GOARCH
-	goos = buildContext.GOOS
-	if goos == "windows" {
-		exeSuffix = ".exe"
-	}
-}
-
-// A builder holds global state about a build.
-// It does not hold per-package state, because we
-// build packages in parallel, and the builder is shared.
-type builder struct {
-	work        string               // the temporary work directory (ends in filepath.Separator)
-	actionCache map[cacheKey]*action // a cache of already-constructed actions
-	mkdirCache  map[string]bool      // a cache of created directories
-	print       func(args ...interface{}) (int, error)
-
-	output    sync.Mutex
-	scriptDir string // current directory in printed script
-
-	exec      sync.Mutex
-	readySema chan bool
-	ready     actionQueue
-}
-
-// An action represents a single action in the action graph.
-type action struct {
-	p          *Package      // the package this action works on
-	deps       []*action     // actions that must happen before this one
-	triggers   []*action     // inverse of deps
-	cgo        *action       // action for cgo binary if needed
-	args       []string      // additional args for runProgram
-	testOutput *bytes.Buffer // test output buffer
-
-	f          func(*builder, *action) error // the action itself (nil = no-op)
-	ignoreFail bool                          // whether to run f even if dependencies fail
-
-	// Generated files, directories.
-	link   bool   // target is executable, not just package
-	pkgdir string // the -I or -L argument to use when importing this package
-	objdir string // directory for intermediate objects
-	objpkg string // the intermediate package .a file created during the action
-	target string // goal of the action: the created package or executable
-
-	// Execution state.
-	pending  int  // number of deps yet to complete
-	priority int  // relative execution priority
-	failed   bool // whether the action failed
-}
-
-// cacheKey is the key for the action cache.
-type cacheKey struct {
-	mode  buildMode
-	p     *Package
-	shlib string
-}
-
-// buildMode specifies the build mode:
-// are we just building things or also installing the results?
-type buildMode int
-
-const (
-	modeBuild buildMode = iota
-	modeInstall
-)
-
-var (
-	goroot    = filepath.Clean(runtime.GOROOT())
-	gobin     = os.Getenv("GOBIN")
-	gorootBin = filepath.Join(goroot, "bin")
-	gorootPkg = filepath.Join(goroot, "pkg")
-	gorootSrc = filepath.Join(goroot, "src")
-)
-
-func (b *builder) init() {
-	var err error
-	b.print = func(a ...interface{}) (int, error) {
-		return fmt.Fprint(os.Stderr, a...)
-	}
-	b.actionCache = make(map[cacheKey]*action)
-	b.mkdirCache = make(map[string]bool)
-
-	if buildN {
-		b.work = "$WORK"
-	} else {
-		b.work, err = ioutil.TempDir("", "go-build")
-		if err != nil {
-			fatalf("%s", err)
-		}
-		if buildX || buildWork {
-			fmt.Fprintf(os.Stderr, "WORK=%s\n", b.work)
-		}
-		if !buildWork {
-			workdir := b.work
-			atexit(func() { os.RemoveAll(workdir) })
-		}
-	}
-}
-
-// goFilesPackage creates a package for building a collection of Go files
-// (typically named on the command line).  The target is named p.a for
-// package p or named after the first Go file for package main.
-func goFilesPackage(gofiles []string) *Package {
-	// TODO: Remove this restriction.
-	for _, f := range gofiles {
-		if !strings.HasSuffix(f, ".go") {
-			fatalf("named files must be .go files")
-		}
-	}
-
-	var stk importStack
-	ctxt := buildContext
-	ctxt.UseAllFiles = true
-
-	// Synthesize fake "directory" that only shows the named files,
-	// to make it look like this is a standard package or
-	// command directory.  So that local imports resolve
-	// consistently, the files must all be in the same directory.
-	var dirent []os.FileInfo
-	var dir string
-	for _, file := range gofiles {
-		fi, err := os.Stat(file)
-		if err != nil {
-			fatalf("%s", err)
-		}
-		if fi.IsDir() {
-			fatalf("%s is a directory, should be a Go file", file)
-		}
-		dir1, _ := filepath.Split(file)
-		if dir1 == "" {
-			dir1 = "./"
-		}
-		if dir == "" {
-			dir = dir1
-		} else if dir != dir1 {
-			fatalf("named files must all be in one directory; have %s and %s", dir, dir1)
-		}
-		dirent = append(dirent, fi)
-	}
-	ctxt.ReadDir = func(string) ([]os.FileInfo, error) { return dirent, nil }
-
-	var err error
-	if dir == "" {
-		dir = cwd
-	}
-	dir, err = filepath.Abs(dir)
-	if err != nil {
-		fatalf("%s", err)
-	}
-
-	bp, err := ctxt.ImportDir(dir, 0)
-	pkg := new(Package)
-	pkg.local = true
-	pkg.cmdline = true
-	pkg.load(&stk, bp, err)
-	pkg.localPrefix = dirToImportPath(dir)
-	pkg.ImportPath = "command-line-arguments"
-	pkg.target = ""
-
-	if pkg.Name == "main" {
-		_, elem := filepath.Split(gofiles[0])
-		exe := elem[:len(elem)-len(".go")] + exeSuffix
-		if *buildO == "" {
-			*buildO = exe
-		}
-		if gobin != "" {
-			pkg.target = filepath.Join(gobin, exe)
-		}
-	}
-
-	pkg.Target = pkg.target
-	pkg.Stale = true
-
-	computeStale(pkg)
-	return pkg
-}
-
-// readpkglist returns the list of packages that were built into the shared library
-// at shlibpath. For the native toolchain this list is stored, newline separated, in
-// an ELF note with name "Go\x00\x00" and type 1. For GCCGO it is extracted from the
-// .go_export section.
-func readpkglist(shlibpath string) (pkgs []*Package) {
-	var stk importStack
-	if _, gccgo := buildToolchain.(gccgoToolchain); gccgo {
-		f, _ := elf.Open(shlibpath)
-		sect := f.Section(".go_export")
-		data, _ := sect.Data()
-		scanner := bufio.NewScanner(bytes.NewBuffer(data))
-		for scanner.Scan() {
-			t := scanner.Text()
-			if strings.HasPrefix(t, "pkgpath ") {
-				t = strings.TrimPrefix(t, "pkgpath ")
-				t = strings.TrimSuffix(t, ";")
-				pkgs = append(pkgs, loadPackage(t, &stk))
-			}
-		}
-	} else {
-		pkglistbytes, err := readELFNote(shlibpath, "Go\x00\x00", 1)
-		if err != nil {
-			fatalf("readELFNote failed: %v", err)
-		}
-		scanner := bufio.NewScanner(bytes.NewBuffer(pkglistbytes))
-		for scanner.Scan() {
-			t := scanner.Text()
-			pkgs = append(pkgs, loadPackage(t, &stk))
-		}
-	}
-	return
-}
-
-// action returns the action for applying the given operation (mode) to the package.
-// depMode is the action to use when building dependencies.
-// action never looks for p in a shared library.
-func (b *builder) action(mode buildMode, depMode buildMode, p *Package) *action {
-	return b.action1(mode, depMode, p, false)
-}
-
-// action1 returns the action for applying the given operation (mode) to the package.
-// depMode is the action to use when building dependencies.
-// action1 will look for p in a shared library if lookshared is true.
-func (b *builder) action1(mode buildMode, depMode buildMode, p *Package, lookshared bool) *action {
-	shlib := ""
-	if lookshared {
-		shlib = p.Shlib
-	}
-	key := cacheKey{mode, p, shlib}
-
-	a := b.actionCache[key]
-	if a != nil {
-		return a
-	}
-	if shlib != "" {
-		key2 := cacheKey{modeInstall, nil, shlib}
-		a = b.actionCache[key2]
-		if a != nil {
-			b.actionCache[key] = a
-			return a
-		}
-		pkgs := readpkglist(shlib)
-		a = b.libaction(filepath.Base(shlib), pkgs, modeInstall, depMode)
-		b.actionCache[key2] = a
-		b.actionCache[key] = a
-		return a
-	}
-
-	a = &action{p: p, pkgdir: p.build.PkgRoot}
-	if p.pkgdir != "" { // overrides p.t
-		a.pkgdir = p.pkgdir
-	}
-	b.actionCache[key] = a
-
-	for _, p1 := range p.imports {
-		ls := buildLinkshared
-		// If p1 is part of the same shared library as p, we need the action
-		// that builds p here, not the shared libary or we get action loops.
-		if p1.Shlib == p.Shlib {
-			ls = false
-		}
-		a.deps = append(a.deps, b.action1(depMode, depMode, p1, ls))
-	}
-
-	// If we are not doing a cross-build, then record the binary we'll
-	// generate for cgo as a dependency of the build of any package
-	// using cgo, to make sure we do not overwrite the binary while
-	// a package is using it.  If this is a cross-build, then the cgo we
-	// are writing is not the cgo we need to use.
-	if goos == runtime.GOOS && goarch == runtime.GOARCH && !buildRace && reqStdPkgSrc {
-		if (len(p.CgoFiles) > 0 || p.Standard && p.ImportPath == "runtime/cgo") && !buildLinkshared && buildBuildmode != "shared" {
-			var stk importStack
-			p1 := loadPackage("cmd/cgo", &stk)
-			if p1.Error != nil {
-				fatalf("load cmd/cgo: %v", p1.Error)
-			}
-			a.cgo = b.action(depMode, depMode, p1)
-			a.deps = append(a.deps, a.cgo)
-		}
-	}
-
-	if p.Standard {
-		switch p.ImportPath {
-		case "builtin", "unsafe":
-			// Fake packages - nothing to build.
-			return a
-		}
-		// gccgo standard library is "fake" too.
-		if _, ok := buildToolchain.(gccgoToolchain); ok {
-			// the target name is needed for cgo.
-			a.target = p.target
-			return a
-		}
-	}
-
-	if !p.Stale && p.target != "" {
-		// p.Stale==false implies that p.target is up-to-date.
-		// Record target name for use by actions depending on this one.
-		a.target = p.target
-		return a
-	}
-
-	if p.local && p.target == "" {
-		// Imported via local path.  No permanent target.
-		mode = modeBuild
-	}
-	work := p.pkgdir
-	if work == "" {
-		work = b.work
-	}
-	a.objdir = filepath.Join(work, a.p.ImportPath, "_obj") + string(filepath.Separator)
-	a.objpkg = buildToolchain.pkgpath(work, a.p)
-	a.link = p.Name == "main"
-
-	switch mode {
-	case modeInstall:
-		a.f = (*builder).install
-		a.deps = []*action{b.action1(modeBuild, depMode, p, lookshared)}
-		a.target = a.p.target
-
-		// Install header for cgo in c-archive and c-shared modes.
-		if p.usesCgo() && (buildBuildmode == "c-archive" || buildBuildmode == "c-shared") {
-			ah := &action{
-				p:      a.p,
-				deps:   []*action{a.deps[0]},
-				f:      (*builder).installHeader,
-				pkgdir: a.pkgdir,
-				objdir: a.objdir,
-				target: a.target[:len(a.target)-len(filepath.Ext(a.target))] + ".h",
-			}
-			a.deps = append(a.deps, ah)
-		}
-
-	case modeBuild:
-		a.f = (*builder).build
-		a.target = a.objpkg
-		if a.link {
-			// An executable file. (This is the name of a temporary file.)
-			// Because we run the temporary file in 'go run' and 'go test',
-			// the name will show up in ps listings. If the caller has specified
-			// a name, use that instead of a.out. The binary is generated
-			// in an otherwise empty subdirectory named exe to avoid
-			// naming conflicts.  The only possible conflict is if we were
-			// to create a top-level package named exe.
-			name := "a.out"
-			if p.exeName != "" {
-				name = p.exeName
-			} else if goos == "darwin" && buildBuildmode == "c-shared" && p.target != "" {
-				// On OS X, the linker output name gets recorded in the
-				// shared library's LC_ID_DYLIB load command.
-				// The code invoking the linker knows to pass only the final
-				// path element. Arrange that the path element matches what
-				// we'll install it as; otherwise the library is only loadable as "a.out".
-				_, name = filepath.Split(p.target)
-			}
-			a.target = a.objdir + filepath.Join("exe", name) + exeSuffix
-		}
-	}
-
-	return a
-}
-
-func (b *builder) libaction(libname string, pkgs []*Package, mode, depMode buildMode) *action {
-	a := &action{}
-	if mode == modeBuild {
-		a.f = (*builder).linkShared
-		a.target = filepath.Join(b.work, libname)
-		for _, p := range pkgs {
-			if p.target == "" {
-				continue
-			}
-			a.deps = append(a.deps, b.action(depMode, depMode, p))
-		}
-	} else if mode == modeInstall {
-		// Currently build mode shared forces external linking mode, and
-		// external linking mode forces an import of runtime/cgo. So if it
-		// was not passed on the command line and it is not present in
-		// another shared library, add it here.
-		seencgo := false
-		_, gccgo := buildToolchain.(gccgoToolchain)
-		if !gccgo {
-			for _, p := range pkgs {
-				seencgo = seencgo || (p.Standard && p.ImportPath == "runtime/cgo")
-			}
-			if !seencgo {
-				var stk importStack
-				p := loadPackage("runtime/cgo", &stk)
-				if p.Error != nil {
-					fatalf("load runtime/cgo: %v", p.Error)
-				}
-				computeStale(p)
-				// If runtime/cgo is in another shared library, then that's
-				// also the shared library that contains runtime, so
-				// something will depend on it and so runtime/cgo's staleness
-				// will be checked when processing that library.
-				if p.Shlib == "" || p.Shlib == libname {
-					pkgs = append([]*Package{}, pkgs...)
-					pkgs = append(pkgs, p)
-				}
-			}
-		}
-
-		// Figure out where the library will go.
-		var libdir string
-		for _, p := range pkgs {
-			plibdir := p.build.PkgTargetRoot
-			if gccgo {
-				plibdir = filepath.Join(plibdir, "shlibs")
-			}
-			if libdir == "" {
-				libdir = plibdir
-			} else if libdir != plibdir {
-				fatalf("multiple roots %s & %s", libdir, plibdir)
-			}
-		}
-		a.target = filepath.Join(libdir, libname)
-
-		// Now we can check whether we need to rebuild it.
-		stale := false
-		var built time.Time
-		if fi, err := os.Stat(a.target); err == nil {
-			built = fi.ModTime()
-		}
-		for _, p := range pkgs {
-			if p.target == "" {
-				continue
-			}
-			stale = stale || p.Stale
-			lstat, err := os.Stat(p.target)
-			if err != nil || lstat.ModTime().After(built) {
-				stale = true
-			}
-			a.deps = append(a.deps, b.action(depMode, depMode, p))
-		}
-
-		if stale {
-			a.f = (*builder).install
-			buildAction := b.libaction(libname, pkgs, modeBuild, depMode)
-			a.deps = []*action{buildAction}
-			for _, p := range pkgs {
-				if p.target == "" {
-					continue
-				}
-				shlibnameaction := &action{}
-				shlibnameaction.f = (*builder).installShlibname
-				shlibnameaction.target = p.target[:len(p.target)-2] + ".shlibname"
-				a.deps = append(a.deps, shlibnameaction)
-				shlibnameaction.deps = append(shlibnameaction.deps, buildAction)
-			}
-		}
-	} else {
-		fatalf("unregonized mode %v", mode)
-	}
-	return a
-}
-
-// actionList returns the list of actions in the dag rooted at root
-// as visited in a depth-first post-order traversal.
-func actionList(root *action) []*action {
-	seen := map[*action]bool{}
-	all := []*action{}
-	var walk func(*action)
-	walk = func(a *action) {
-		if seen[a] {
-			return
-		}
-		seen[a] = true
-		for _, a1 := range a.deps {
-			walk(a1)
-		}
-		all = append(all, a)
-	}
-	walk(root)
-	return all
-}
-
-// allArchiveActions returns a list of the archive dependencies of root.
-// This is needed because if package p depends on package q that is in libr.so, the
-// action graph looks like p->libr.so->q and so just scanning through p's
-// dependencies does not find the import dir for q.
-func allArchiveActions(root *action) []*action {
-	seen := map[*action]bool{}
-	r := []*action{}
-	var walk func(*action)
-	walk = func(a *action) {
-		if seen[a] {
-			return
-		}
-		seen[a] = true
-		if strings.HasSuffix(a.target, ".so") || a == root {
-			for _, a1 := range a.deps {
-				walk(a1)
-			}
-		} else if strings.HasSuffix(a.target, ".a") {
-			r = append(r, a)
-		}
-	}
-	walk(root)
-	return r
-}
-
-// do runs the action graph rooted at root.
-func (b *builder) do(root *action) {
-	// Build list of all actions, assigning depth-first post-order priority.
-	// The original implementation here was a true queue
-	// (using a channel) but it had the effect of getting
-	// distracted by low-level leaf actions to the detriment
-	// of completing higher-level actions.  The order of
-	// work does not matter much to overall execution time,
-	// but when running "go test std" it is nice to see each test
-	// results as soon as possible.  The priorities assigned
-	// ensure that, all else being equal, the execution prefers
-	// to do what it would have done first in a simple depth-first
-	// dependency order traversal.
-	all := actionList(root)
-	for i, a := range all {
-		a.priority = i
-	}
-
-	b.readySema = make(chan bool, len(all))
-
-	// Initialize per-action execution state.
-	for _, a := range all {
-		for _, a1 := range a.deps {
-			a1.triggers = append(a1.triggers, a)
-		}
-		a.pending = len(a.deps)
-		if a.pending == 0 {
-			b.ready.push(a)
-			b.readySema <- true
-		}
-	}
-
-	// Handle runs a single action and takes care of triggering
-	// any actions that are runnable as a result.
-	handle := func(a *action) {
-		var err error
-		if a.f != nil && (!a.failed || a.ignoreFail) {
-			err = a.f(b, a)
-		}
-
-		// The actions run in parallel but all the updates to the
-		// shared work state are serialized through b.exec.
-		b.exec.Lock()
-		defer b.exec.Unlock()
-
-		if err != nil {
-			if err == errPrintedOutput {
-				setExitStatus(2)
-			} else {
-				errorf("%s", err)
-			}
-			a.failed = true
-		}
-
-		for _, a0 := range a.triggers {
-			if a.failed {
-				a0.failed = true
-			}
-			if a0.pending--; a0.pending == 0 {
-				b.ready.push(a0)
-				b.readySema <- true
-			}
-		}
-
-		if a == root {
-			close(b.readySema)
-		}
-	}
-
-	var wg sync.WaitGroup
-
-	// Kick off goroutines according to parallelism.
-	// If we are using the -n flag (just printing commands)
-	// drop the parallelism to 1, both to make the output
-	// deterministic and because there is no real work anyway.
-	par := buildP
-	if buildN {
-		par = 1
-	}
-	for i := 0; i < par; i++ {
-		wg.Add(1)
-		go func() {
-			defer wg.Done()
-			for {
-				select {
-				case _, ok := <-b.readySema:
-					if !ok {
-						return
-					}
-					// Receiving a value from b.readySema entitles
-					// us to take from the ready queue.
-					b.exec.Lock()
-					a := b.ready.pop()
-					b.exec.Unlock()
-					handle(a)
-				case <-interrupted:
-					setExitStatus(1)
-					return
-				}
-			}
-		}()
-	}
-
-	wg.Wait()
-}
-
-// hasString reports whether s appears in the list of strings.
-func hasString(strings []string, s string) bool {
-	for _, t := range strings {
-		if s == t {
-			return true
-		}
-	}
-	return false
-}
-
-// build is the action for building a single package or command.
-func (b *builder) build(a *action) (err error) {
-	// Return an error if the package has CXX files but it's not using
-	// cgo nor SWIG, since the CXX files can only be processed by cgo
-	// and SWIG.
-	if len(a.p.CXXFiles) > 0 && !a.p.usesCgo() && !a.p.usesSwig() {
-		return fmt.Errorf("can't build package %s because it contains C++ files (%s) but it's not using cgo nor SWIG",
-			a.p.ImportPath, strings.Join(a.p.CXXFiles, ","))
-	}
-	// Same as above for Objective-C files
-	if len(a.p.MFiles) > 0 && !a.p.usesCgo() && !a.p.usesSwig() {
-		return fmt.Errorf("can't build package %s because it contains Objective-C files (%s) but it's not using cgo nor SWIG",
-			a.p.ImportPath, strings.Join(a.p.MFiles, ","))
-	}
-	defer func() {
-		if err != nil && err != errPrintedOutput {
-			err = fmt.Errorf("go build %s: %v", a.p.ImportPath, err)
-		}
-	}()
-	if buildN {
-		// In -n mode, print a banner between packages.
-		// The banner is five lines so that when changes to
-		// different sections of the bootstrap script have to
-		// be merged, the banners give patch something
-		// to use to find its context.
-		fmt.Printf("\n#\n# %s\n#\n\n", a.p.ImportPath)
-	}
-
-	if buildV {
-		fmt.Fprintf(os.Stderr, "%s\n", a.p.ImportPath)
-	}
-
-	if a.p.Standard && a.p.ImportPath == "runtime" && buildContext.Compiler == "gc" &&
-		(!hasString(a.p.GoFiles, "zgoos_"+buildContext.GOOS+".go") ||
-			!hasString(a.p.GoFiles, "zgoarch_"+buildContext.GOARCH+".go")) {
-		return fmt.Errorf("%s/%s must be bootstrapped using make%v", buildContext.GOOS, buildContext.GOARCH, defaultSuffix())
-	}
-
-	// Make build directory.
-	obj := a.objdir
-	if err := b.mkdir(obj); err != nil {
-		return err
-	}
-
-	// make target directory
-	dir, _ := filepath.Split(a.target)
-	if dir != "" {
-		if err := b.mkdir(dir); err != nil {
-			return err
-		}
-	}
-
-	var gofiles, cgofiles, cfiles, sfiles, cxxfiles, objects, cgoObjects, pcCFLAGS, pcLDFLAGS []string
-
-	gofiles = append(gofiles, a.p.GoFiles...)
-	cgofiles = append(cgofiles, a.p.CgoFiles...)
-	cfiles = append(cfiles, a.p.CFiles...)
-	sfiles = append(sfiles, a.p.SFiles...)
-	cxxfiles = append(cxxfiles, a.p.CXXFiles...)
-
-	if a.p.usesCgo() || a.p.usesSwig() {
-		if pcCFLAGS, pcLDFLAGS, err = b.getPkgConfigFlags(a.p); err != nil {
-			return
-		}
-	}
-
-	// Run SWIG on each .swig and .swigcxx file.
-	// Each run will generate two files, a .go file and a .c or .cxx file.
-	// The .go file will use import "C" and is to be processed by cgo.
-	if a.p.usesSwig() {
-		outGo, outC, outCXX, err := b.swig(a.p, obj, pcCFLAGS)
-		if err != nil {
-			return err
-		}
-		cgofiles = append(cgofiles, outGo...)
-		cfiles = append(cfiles, outC...)
-		cxxfiles = append(cxxfiles, outCXX...)
-	}
-
-	// Run cgo.
-	if a.p.usesCgo() || a.p.usesSwig() {
-		// In a package using cgo, cgo compiles the C, C++ and assembly files with gcc.
-		// There is one exception: runtime/cgo's job is to bridge the
-		// cgo and non-cgo worlds, so it necessarily has files in both.
-		// In that case gcc only gets the gcc_* files.
-		var gccfiles []string
-		if a.p.Standard && a.p.ImportPath == "runtime/cgo" {
-			filter := func(files, nongcc, gcc []string) ([]string, []string) {
-				for _, f := range files {
-					if strings.HasPrefix(f, "gcc_") {
-						gcc = append(gcc, f)
-					} else {
-						nongcc = append(nongcc, f)
-					}
-				}
-				return nongcc, gcc
-			}
-			cfiles, gccfiles = filter(cfiles, cfiles[:0], gccfiles)
-			sfiles, gccfiles = filter(sfiles, sfiles[:0], gccfiles)
-		} else {
-			gccfiles = append(cfiles, sfiles...)
-			cfiles = nil
-			sfiles = nil
-		}
-
-		cgoExe := tool("cgo")
-		if a.cgo != nil && a.cgo.target != "" {
-			cgoExe = a.cgo.target
-		}
-		outGo, outObj, err := b.cgo(a.p, cgoExe, obj, pcCFLAGS, pcLDFLAGS, cgofiles, gccfiles, cxxfiles, a.p.MFiles)
-		if err != nil {
-			return err
-		}
-		cgoObjects = append(cgoObjects, outObj...)
-		gofiles = append(gofiles, outGo...)
-	}
-
-	if len(gofiles) == 0 {
-		return &build.NoGoError{Dir: a.p.Dir}
-	}
-
-	// If we're doing coverage, preprocess the .go files and put them in the work directory
-	if a.p.coverMode != "" {
-		for i, file := range gofiles {
-			var sourceFile string
-			var coverFile string
-			var key string
-			if strings.HasSuffix(file, ".cgo1.go") {
-				// cgo files have absolute paths
-				base := filepath.Base(file)
-				sourceFile = file
-				coverFile = filepath.Join(obj, base)
-				key = strings.TrimSuffix(base, ".cgo1.go") + ".go"
-			} else {
-				sourceFile = filepath.Join(a.p.Dir, file)
-				coverFile = filepath.Join(obj, file)
-				key = file
-			}
-			cover := a.p.coverVars[key]
-			if cover == nil || isTestFile(file) {
-				// Not covering this file.
-				continue
-			}
-			if err := b.cover(a, coverFile, sourceFile, 0666, cover.Var); err != nil {
-				return err
-			}
-			gofiles[i] = coverFile
-		}
-	}
-
-	// Prepare Go import path list.
-	inc := b.includeArgs("-I", allArchiveActions(a))
-
-	// Compile Go.
-	ofile, out, err := buildToolchain.gc(b, a.p, a.objpkg, obj, len(sfiles) > 0, inc, gofiles)
-	if len(out) > 0 {
-		b.showOutput(a.p.Dir, a.p.ImportPath, b.processOutput(out))
-		if err != nil {
-			return errPrintedOutput
-		}
-	}
-	if err != nil {
-		return err
-	}
-	if ofile != a.objpkg {
-		objects = append(objects, ofile)
-	}
-
-	// Copy .h files named for goos or goarch or goos_goarch
-	// to names using GOOS and GOARCH.
-	// For example, defs_linux_amd64.h becomes defs_GOOS_GOARCH.h.
-	_goos_goarch := "_" + goos + "_" + goarch
-	_goos := "_" + goos
-	_goarch := "_" + goarch
-	for _, file := range a.p.HFiles {
-		name, ext := fileExtSplit(file)
-		switch {
-		case strings.HasSuffix(name, _goos_goarch):
-			targ := file[:len(name)-len(_goos_goarch)] + "_GOOS_GOARCH." + ext
-			if err := b.copyFile(a, obj+targ, filepath.Join(a.p.Dir, file), 0644, true); err != nil {
-				return err
-			}
-		case strings.HasSuffix(name, _goarch):
-			targ := file[:len(name)-len(_goarch)] + "_GOARCH." + ext
-			if err := b.copyFile(a, obj+targ, filepath.Join(a.p.Dir, file), 0644, true); err != nil {
-				return err
-			}
-		case strings.HasSuffix(name, _goos):
-			targ := file[:len(name)-len(_goos)] + "_GOOS." + ext
-			if err := b.copyFile(a, obj+targ, filepath.Join(a.p.Dir, file), 0644, true); err != nil {
-				return err
-			}
-		}
-	}
-
-	for _, file := range cfiles {
-		out := file[:len(file)-len(".c")] + ".o"
-		if err := buildToolchain.cc(b, a.p, obj, obj+out, file); err != nil {
-			return err
-		}
-		objects = append(objects, out)
-	}
-
-	// Assemble .s files.
-	for _, file := range sfiles {
-		out := file[:len(file)-len(".s")] + ".o"
-		if err := buildToolchain.asm(b, a.p, obj, obj+out, file); err != nil {
-			return err
-		}
-		objects = append(objects, out)
-	}
-
-	// NOTE(rsc): On Windows, it is critically important that the
-	// gcc-compiled objects (cgoObjects) be listed after the ordinary
-	// objects in the archive.  I do not know why this is.
-	// https://golang.org/issue/2601
-	objects = append(objects, cgoObjects...)
-
-	// Add system object files.
-	for _, syso := range a.p.SysoFiles {
-		objects = append(objects, filepath.Join(a.p.Dir, syso))
-	}
-
-	// Pack into archive in obj directory.
-	// If the Go compiler wrote an archive, we only need to add the
-	// object files for non-Go sources to the archive.
-	// If the Go compiler wrote an archive and the package is entirely
-	// Go sources, there is no pack to execute at all.
-	if len(objects) > 0 {
-		if err := buildToolchain.pack(b, a.p, obj, a.objpkg, objects); err != nil {
-			return err
-		}
-	}
-
-	// Link if needed.
-	if a.link {
-		// The compiler only cares about direct imports, but the
-		// linker needs the whole dependency tree.
-		all := actionList(a)
-		all = all[:len(all)-1] // drop a
-		if err := buildToolchain.ld(b, a, a.target, all, a.objpkg, objects); err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
-
-// Calls pkg-config if needed and returns the cflags/ldflags needed to build the package.
-func (b *builder) getPkgConfigFlags(p *Package) (cflags, ldflags []string, err error) {
-	if pkgs := p.CgoPkgConfig; len(pkgs) > 0 {
-		var out []byte
-		out, err = b.runOut(p.Dir, p.ImportPath, nil, "pkg-config", "--cflags", pkgs)
-		if err != nil {
-			b.showOutput(p.Dir, "pkg-config --cflags "+strings.Join(pkgs, " "), string(out))
-			b.print(err.Error() + "\n")
-			err = errPrintedOutput
-			return
-		}
-		if len(out) > 0 {
-			cflags = strings.Fields(string(out))
-		}
-		out, err = b.runOut(p.Dir, p.ImportPath, nil, "pkg-config", "--libs", pkgs)
-		if err != nil {
-			b.showOutput(p.Dir, "pkg-config --libs "+strings.Join(pkgs, " "), string(out))
-			b.print(err.Error() + "\n")
-			err = errPrintedOutput
-			return
-		}
-		if len(out) > 0 {
-			ldflags = strings.Fields(string(out))
-		}
-	}
-	return
-}
-
-func (b *builder) installShlibname(a *action) error {
-	a1 := a.deps[0]
-	err := ioutil.WriteFile(a.target, []byte(filepath.Base(a1.target)+"\n"), 0644)
-	if err != nil {
-		return err
-	}
-	if buildX {
-		b.showcmd("", "echo '%s' > %s # internal", filepath.Base(a1.target), a.target)
-	}
-	return nil
-}
-
-func (b *builder) linkShared(a *action) (err error) {
-	allactions := actionList(a)
-	allactions = allactions[:len(allactions)-1]
-	return buildToolchain.ldShared(b, a.deps, a.target, allactions)
-}
-
-// install is the action for installing a single package or executable.
-func (b *builder) install(a *action) (err error) {
-	defer func() {
-		if err != nil && err != errPrintedOutput {
-			err = fmt.Errorf("go install %s: %v", a.p.ImportPath, err)
-		}
-	}()
-	a1 := a.deps[0]
-	perm := os.FileMode(0644)
-	if a1.link {
-		switch buildBuildmode {
-		case "c-archive", "c-shared":
-		default:
-			perm = 0755
-		}
-	}
-
-	// make target directory
-	dir, _ := filepath.Split(a.target)
-	if dir != "" {
-		if err := b.mkdir(dir); err != nil {
-			return err
-		}
-	}
-
-	// remove object dir to keep the amount of
-	// garbage down in a large build.  On an operating system
-	// with aggressive buffering, cleaning incrementally like
-	// this keeps the intermediate objects from hitting the disk.
-	if !buildWork {
-		defer os.RemoveAll(a1.objdir)
-		defer os.Remove(a1.target)
-	}
-
-	return b.moveOrCopyFile(a, a.target, a1.target, perm, false)
-}
-
-// includeArgs returns the -I or -L directory list for access
-// to the results of the list of actions.
-func (b *builder) includeArgs(flag string, all []*action) []string {
-	inc := []string{}
-	incMap := map[string]bool{
-		b.work:    true, // handled later
-		gorootPkg: true,
-		"":        true, // ignore empty strings
-	}
-
-	// Look in the temporary space for results of test-specific actions.
-	// This is the $WORK/my/package/_test directory for the
-	// package being built, so there are few of these.
-	for _, a1 := range all {
-		if a1.p == nil {
-			continue
-		}
-		if dir := a1.pkgdir; dir != a1.p.build.PkgRoot && !incMap[dir] {
-			incMap[dir] = true
-			inc = append(inc, flag, dir)
-		}
-	}
-
-	// Also look in $WORK for any non-test packages that have
-	// been built but not installed.
-	inc = append(inc, flag, b.work)
-
-	// Finally, look in the installed package directories for each action.
-	for _, a1 := range all {
-		if a1.p == nil {
-			continue
-		}
-		if dir := a1.pkgdir; dir == a1.p.build.PkgRoot && !incMap[dir] {
-			incMap[dir] = true
-			inc = append(inc, flag, a1.p.build.PkgTargetRoot)
-		}
-	}
-
-	return inc
-}
-
-// moveOrCopyFile is like 'mv src dst' or 'cp src dst'.
-func (b *builder) moveOrCopyFile(a *action, dst, src string, perm os.FileMode, force bool) error {
-	if buildN {
-		b.showcmd("", "mv %s %s", src, dst)
-		return nil
-	}
-
-	// If we can update the mode and rename to the dst, do it.
-	// Otherwise fall back to standard copy.
-	if err := os.Chmod(src, perm); err == nil {
-		if err := os.Rename(src, dst); err == nil {
-			if buildX {
-				b.showcmd("", "mv %s %s", src, dst)
-			}
-			return nil
-		}
-	}
-
-	return b.copyFile(a, dst, src, perm, force)
-}
-
-// copyFile is like 'cp src dst'.
-func (b *builder) copyFile(a *action, dst, src string, perm os.FileMode, force bool) error {
-	if buildN || buildX {
-		b.showcmd("", "cp %s %s", src, dst)
-		if buildN {
-			return nil
-		}
-	}
-
-	sf, err := os.Open(src)
-	if err != nil {
-		return err
-	}
-	defer sf.Close()
-
-	// Be careful about removing/overwriting dst.
-	// Do not remove/overwrite if dst exists and is a directory
-	// or a non-object file.
-	if fi, err := os.Stat(dst); err == nil {
-		if fi.IsDir() {
-			return fmt.Errorf("build output %q already exists and is a directory", dst)
-		}
-		if !force && !isObject(dst) {
-			return fmt.Errorf("build output %q already exists and is not an object file", dst)
-		}
-	}
-
-	// On Windows, remove lingering ~ file from last attempt.
-	if toolIsWindows {
-		if _, err := os.Stat(dst + "~"); err == nil {
-			os.Remove(dst + "~")
-		}
-	}
-
-	os.Remove(dst)
-	df, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
-	if err != nil && toolIsWindows {
-		// Windows does not allow deletion of a binary file
-		// while it is executing.  Try to move it out of the way.
-		// If the move fails, which is likely, we'll try again the
-		// next time we do an install of this binary.
-		if err := os.Rename(dst, dst+"~"); err == nil {
-			os.Remove(dst + "~")
-		}
-		df, err = os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
-	}
-	if err != nil {
-		return err
-	}
-
-	_, err = io.Copy(df, sf)
-	df.Close()
-	if err != nil {
-		os.Remove(dst)
-		return fmt.Errorf("copying %s to %s: %v", src, dst, err)
-	}
-	return nil
-}
-
-// Install the cgo export header file, if there is one.
-func (b *builder) installHeader(a *action) error {
-	src := a.objdir + "_cgo_install.h"
-	if _, err := os.Stat(src); os.IsNotExist(err) {
-		// If the file does not exist, there are no exported
-		// functions, and we do not install anything.
-		return nil
-	}
-
-	dir, _ := filepath.Split(a.target)
-	if dir != "" {
-		if err := b.mkdir(dir); err != nil {
-			return err
-		}
-	}
-
-	return b.moveOrCopyFile(a, a.target, src, 0644, true)
-}
-
-// cover runs, in effect,
-//	go tool cover -mode=b.coverMode -var="varName" -o dst.go src.go
-func (b *builder) cover(a *action, dst, src string, perm os.FileMode, varName string) error {
-	return b.run(a.objdir, "cover "+a.p.ImportPath, nil,
-		buildToolExec,
-		tool("cover"),
-		"-mode", a.p.coverMode,
-		"-var", varName,
-		"-o", dst,
-		src)
-}
-
-var objectMagic = [][]byte{
-	{'!', '<', 'a', 'r', 'c', 'h', '>', '\n'}, // Package archive
-	{'\x7F', 'E', 'L', 'F'},                   // ELF
-	{0xFE, 0xED, 0xFA, 0xCE},                  // Mach-O big-endian 32-bit
-	{0xFE, 0xED, 0xFA, 0xCF},                  // Mach-O big-endian 64-bit
-	{0xCE, 0xFA, 0xED, 0xFE},                  // Mach-O little-endian 32-bit
-	{0xCF, 0xFA, 0xED, 0xFE},                  // Mach-O little-endian 64-bit
-	{0x4d, 0x5a, 0x90, 0x00, 0x03, 0x00},      // PE (Windows) as generated by 6l/8l and gcc
-	{0x00, 0x00, 0x01, 0xEB},                  // Plan 9 i386
-	{0x00, 0x00, 0x8a, 0x97},                  // Plan 9 amd64
-}
-
-func isObject(s string) bool {
-	f, err := os.Open(s)
-	if err != nil {
-		return false
-	}
-	defer f.Close()
-	buf := make([]byte, 64)
-	io.ReadFull(f, buf)
-	for _, magic := range objectMagic {
-		if bytes.HasPrefix(buf, magic) {
-			return true
-		}
-	}
-	return false
-}
-
-// fmtcmd formats a command in the manner of fmt.Sprintf but also:
-//
-//	If dir is non-empty and the script is not in dir right now,
-//	fmtcmd inserts "cd dir\n" before the command.
-//
-//	fmtcmd replaces the value of b.work with $WORK.
-//	fmtcmd replaces the value of goroot with $GOROOT.
-//	fmtcmd replaces the value of b.gobin with $GOBIN.
-//
-//	fmtcmd replaces the name of the current directory with dot (.)
-//	but only when it is at the beginning of a space-separated token.
-//
-func (b *builder) fmtcmd(dir string, format string, args ...interface{}) string {
-	cmd := fmt.Sprintf(format, args...)
-	if dir != "" && dir != "/" {
-		cmd = strings.Replace(" "+cmd, " "+dir, " .", -1)[1:]
-		if b.scriptDir != dir {
-			b.scriptDir = dir
-			cmd = "cd " + dir + "\n" + cmd
-		}
-	}
-	if b.work != "" {
-		cmd = strings.Replace(cmd, b.work, "$WORK", -1)
-	}
-	return cmd
-}
-
-// showcmd prints the given command to standard output
-// for the implementation of -n or -x.
-func (b *builder) showcmd(dir string, format string, args ...interface{}) {
-	b.output.Lock()
-	defer b.output.Unlock()
-	b.print(b.fmtcmd(dir, format, args...) + "\n")
-}
-
-// showOutput prints "# desc" followed by the given output.
-// The output is expected to contain references to 'dir', usually
-// the source directory for the package that has failed to build.
-// showOutput rewrites mentions of dir with a relative path to dir
-// when the relative path is shorter.  This is usually more pleasant.
-// For example, if fmt doesn't compile and we are in src/html,
-// the output is
-//
-//	$ go build
-//	# fmt
-//	../fmt/print.go:1090: undefined: asdf
-//	$
-//
-// instead of
-//
-//	$ go build
-//	# fmt
-//	/usr/gopher/go/src/fmt/print.go:1090: undefined: asdf
-//	$
-//
-// showOutput also replaces references to the work directory with $WORK.
-//
-func (b *builder) showOutput(dir, desc, out string) {
-	prefix := "# " + desc
-	suffix := "\n" + out
-	if reldir := shortPath(dir); reldir != dir {
-		suffix = strings.Replace(suffix, " "+dir, " "+reldir, -1)
-		suffix = strings.Replace(suffix, "\n"+dir, "\n"+reldir, -1)
-	}
-	suffix = strings.Replace(suffix, " "+b.work, " $WORK", -1)
-
-	b.output.Lock()
-	defer b.output.Unlock()
-	b.print(prefix, suffix)
-}
-
-// shortPath returns an absolute or relative name for path, whatever is shorter.
-func shortPath(path string) string {
-	if rel, err := filepath.Rel(cwd, path); err == nil && len(rel) < len(path) {
-		return rel
-	}
-	return path
-}
-
-// relPaths returns a copy of paths with absolute paths
-// made relative to the current directory if they would be shorter.
-func relPaths(paths []string) []string {
-	var out []string
-	pwd, _ := os.Getwd()
-	for _, p := range paths {
-		rel, err := filepath.Rel(pwd, p)
-		if err == nil && len(rel) < len(p) {
-			p = rel
-		}
-		out = append(out, p)
-	}
-	return out
-}
-
-// errPrintedOutput is a special error indicating that a command failed
-// but that it generated output as well, and that output has already
-// been printed, so there's no point showing 'exit status 1' or whatever
-// the wait status was.  The main executor, builder.do, knows not to
-// print this error.
-var errPrintedOutput = errors.New("already printed output - no need to show error")
-
-var cgoLine = regexp.MustCompile(`\[[^\[\]]+\.cgo1\.go:[0-9]+\]`)
-var cgoTypeSigRe = regexp.MustCompile(`\b_Ctype_\B`)
-
-// run runs the command given by cmdline in the directory dir.
-// If the command fails, run prints information about the failure
-// and returns a non-nil error.
-func (b *builder) run(dir string, desc string, env []string, cmdargs ...interface{}) error {
-	out, err := b.runOut(dir, desc, env, cmdargs...)
-	if len(out) > 0 {
-		if desc == "" {
-			desc = b.fmtcmd(dir, "%s", strings.Join(stringList(cmdargs...), " "))
-		}
-		b.showOutput(dir, desc, b.processOutput(out))
-		if err != nil {
-			err = errPrintedOutput
-		}
-	}
-	return err
-}
-
-// processOutput prepares the output of runOut to be output to the console.
-func (b *builder) processOutput(out []byte) string {
-	if out[len(out)-1] != '\n' {
-		out = append(out, '\n')
-	}
-	messages := string(out)
-	// Fix up output referring to cgo-generated code to be more readable.
-	// Replace x.go:19[/tmp/.../x.cgo1.go:18] with x.go:19.
-	// Replace *[100]_Ctype_foo with *[100]C.foo.
-	// If we're using -x, assume we're debugging and want the full dump, so disable the rewrite.
-	if !buildX && cgoLine.MatchString(messages) {
-		messages = cgoLine.ReplaceAllString(messages, "")
-		messages = cgoTypeSigRe.ReplaceAllString(messages, "C.")
-	}
-	return messages
-}
-
-// runOut runs the command given by cmdline in the directory dir.
-// It returns the command output and any errors that occurred.
-func (b *builder) runOut(dir string, desc string, env []string, cmdargs ...interface{}) ([]byte, error) {
-	cmdline := stringList(cmdargs...)
-	if buildN || buildX {
-		var envcmdline string
-		for i := range env {
-			envcmdline += env[i]
-			envcmdline += " "
-		}
-		envcmdline += joinUnambiguously(cmdline)
-		b.showcmd(dir, "%s", envcmdline)
-		if buildN {
-			return nil, nil
-		}
-	}
-
-	nbusy := 0
-	for {
-		var buf bytes.Buffer
-		cmd := exec.Command(cmdline[0], cmdline[1:]...)
-		cmd.Stdout = &buf
-		cmd.Stderr = &buf
-		cmd.Dir = dir
-		cmd.Env = mergeEnvLists(env, envForDir(cmd.Dir, os.Environ()))
-		err := cmd.Run()
-
-		// cmd.Run will fail on Unix if some other process has the binary
-		// we want to run open for writing.  This can happen here because
-		// we build and install the cgo command and then run it.
-		// If another command was kicked off while we were writing the
-		// cgo binary, the child process for that command may be holding
-		// a reference to the fd, keeping us from running exec.
-		//
-		// But, you might reasonably wonder, how can this happen?
-		// The cgo fd, like all our fds, is close-on-exec, so that we need
-		// not worry about other processes inheriting the fd accidentally.
-		// The answer is that running a command is fork and exec.
-		// A child forked while the cgo fd is open inherits that fd.
-		// Until the child has called exec, it holds the fd open and the
-		// kernel will not let us run cgo.  Even if the child were to close
-		// the fd explicitly, it would still be open from the time of the fork
-		// until the time of the explicit close, and the race would remain.
-		//
-		// On Unix systems, this results in ETXTBSY, which formats
-		// as "text file busy".  Rather than hard-code specific error cases,
-		// we just look for that string.  If this happens, sleep a little
-		// and try again.  We let this happen three times, with increasing
-		// sleep lengths: 100+200+400 ms = 0.7 seconds.
-		//
-		// An alternate solution might be to split the cmd.Run into
-		// separate cmd.Start and cmd.Wait, and then use an RWLock
-		// to make sure that copyFile only executes when no cmd.Start
-		// call is in progress.  However, cmd.Start (really syscall.forkExec)
-		// only guarantees that when it returns, the exec is committed to
-		// happen and succeed.  It uses a close-on-exec file descriptor
-		// itself to determine this, so we know that when cmd.Start returns,
-		// at least one close-on-exec file descriptor has been closed.
-		// However, we cannot be sure that all of them have been closed,
-		// so the program might still encounter ETXTBSY even with such
-		// an RWLock.  The race window would be smaller, perhaps, but not
-		// guaranteed to be gone.
-		//
-		// Sleeping when we observe the race seems to be the most reliable
-		// option we have.
-		//
-		// https://golang.org/issue/3001
-		//
-		if err != nil && nbusy < 3 && strings.Contains(err.Error(), "text file busy") {
-			time.Sleep(100 * time.Millisecond << uint(nbusy))
-			nbusy++
-			continue
-		}
-
-		// err can be something like 'exit status 1'.
-		// Add information about what program was running.
-		// Note that if buf.Bytes() is non-empty, the caller usually
-		// shows buf.Bytes() and does not print err at all, so the
-		// prefix here does not make most output any more verbose.
-		if err != nil {
-			err = errors.New(cmdline[0] + ": " + err.Error())
-		}
-		return buf.Bytes(), err
-	}
-}
-
-// joinUnambiguously prints the slice, quoting where necessary to make the
-// output unambiguous.
-// TODO: See issue 5279. The printing of commands needs a complete redo.
-func joinUnambiguously(a []string) string {
-	var buf bytes.Buffer
-	for i, s := range a {
-		if i > 0 {
-			buf.WriteByte(' ')
-		}
-		q := strconv.Quote(s)
-		if s == "" || strings.Contains(s, " ") || len(q) > len(s)+2 {
-			buf.WriteString(q)
-		} else {
-			buf.WriteString(s)
-		}
-	}
-	return buf.String()
-}
-
-// mkdir makes the named directory.
-func (b *builder) mkdir(dir string) error {
-	b.exec.Lock()
-	defer b.exec.Unlock()
-	// We can be a little aggressive about being
-	// sure directories exist.  Skip repeated calls.
-	if b.mkdirCache[dir] {
-		return nil
-	}
-	b.mkdirCache[dir] = true
-
-	if buildN || buildX {
-		b.showcmd("", "mkdir -p %s", dir)
-		if buildN {
-			return nil
-		}
-	}
-
-	if err := os.MkdirAll(dir, 0777); err != nil {
-		return err
-	}
-	return nil
-}
-
-// mkAbs returns an absolute path corresponding to
-// evaluating f in the directory dir.
-// We always pass absolute paths of source files so that
-// the error messages will include the full path to a file
-// in need of attention.
-func mkAbs(dir, f string) string {
-	// Leave absolute paths alone.
-	// Also, during -n mode we use the pseudo-directory $WORK
-	// instead of creating an actual work directory that won't be used.
-	// Leave paths beginning with $WORK alone too.
-	if filepath.IsAbs(f) || strings.HasPrefix(f, "$WORK") {
-		return f
-	}
-	return filepath.Join(dir, f)
-}
-
-type toolchain interface {
-	// gc runs the compiler in a specific directory on a set of files
-	// and returns the name of the generated output file.
-	// The compiler runs in the directory dir.
-	gc(b *builder, p *Package, archive, obj string, asmhdr bool, importArgs []string, gofiles []string) (ofile string, out []byte, err error)
-	// cc runs the toolchain's C compiler in a directory on a C file
-	// to produce an output file.
-	cc(b *builder, p *Package, objdir, ofile, cfile string) error
-	// asm runs the assembler in a specific directory on a specific file
-	// to generate the named output file.
-	asm(b *builder, p *Package, obj, ofile, sfile string) error
-	// pkgpath builds an appropriate path for a temporary package file.
-	pkgpath(basedir string, p *Package) string
-	// pack runs the archive packer in a specific directory to create
-	// an archive from a set of object files.
-	// typically it is run in the object directory.
-	pack(b *builder, p *Package, objDir, afile string, ofiles []string) error
-	// ld runs the linker to create an executable starting at mainpkg.
-	ld(b *builder, root *action, out string, allactions []*action, mainpkg string, ofiles []string) error
-	// ldShared runs the linker to create a shared library containing the pkgs built by toplevelactions
-	ldShared(b *builder, toplevelactions []*action, out string, allactions []*action) error
-
-	compiler() string
-	linker() string
-}
-
-type noToolchain struct{}
-
-func noCompiler() error {
-	log.Fatalf("unknown compiler %q", buildContext.Compiler)
-	return nil
-}
-
-func (noToolchain) compiler() string {
-	noCompiler()
-	return ""
-}
-
-func (noToolchain) linker() string {
-	noCompiler()
-	return ""
-}
-
-func (noToolchain) gc(b *builder, p *Package, archive, obj string, asmhdr bool, importArgs []string, gofiles []string) (ofile string, out []byte, err error) {
-	return "", nil, noCompiler()
-}
-
-func (noToolchain) asm(b *builder, p *Package, obj, ofile, sfile string) error {
-	return noCompiler()
-}
-
-func (noToolchain) pkgpath(basedir string, p *Package) string {
-	noCompiler()
-	return ""
-}
-
-func (noToolchain) pack(b *builder, p *Package, objDir, afile string, ofiles []string) error {
-	return noCompiler()
-}
-
-func (noToolchain) ld(b *builder, root *action, out string, allactions []*action, mainpkg string, ofiles []string) error {
-	return noCompiler()
-}
-
-func (noToolchain) ldShared(b *builder, toplevelactions []*action, out string, allactions []*action) error {
-	return noCompiler()
-}
-
-func (noToolchain) cc(b *builder, p *Package, objdir, ofile, cfile string) error {
-	return noCompiler()
-}
-
-// The Go toolchain.
-type gcToolchain struct{}
-
-func (gcToolchain) compiler() string {
-	return tool("compile")
-}
-
-func (gcToolchain) linker() string {
-	return tool("link")
-}
-
-func (gcToolchain) gc(b *builder, p *Package, archive, obj string, asmhdr bool, importArgs []string, gofiles []string) (ofile string, output []byte, err error) {
-	if archive != "" {
-		ofile = archive
-	} else {
-		out := "_go_.o"
-		ofile = obj + out
-	}
-
-	gcargs := []string{"-p", p.ImportPath}
-	if p.Name == "main" {
-		gcargs[1] = "main"
-	}
-	if p.Standard && p.ImportPath == "runtime" {
-		// runtime compiles with a special gc flag to emit
-		// additional reflect type data.
-		gcargs = append(gcargs, "-+")
-	}
-
-	// If we're giving the compiler the entire package (no C etc files), tell it that,
-	// so that it can give good error messages about forward declarations.
-	// Exceptions: a few standard packages have forward declarations for
-	// pieces supplied behind-the-scenes by package runtime.
-	extFiles := len(p.CgoFiles) + len(p.CFiles) + len(p.CXXFiles) + len(p.MFiles) + len(p.SFiles) + len(p.SysoFiles) + len(p.SwigFiles) + len(p.SwigCXXFiles)
-	if p.Standard {
-		switch p.ImportPath {
-		case "bytes", "net", "os", "runtime/pprof", "sync", "time":
-			extFiles++
-		}
-	}
-	if extFiles == 0 {
-		gcargs = append(gcargs, "-complete")
-	}
-	if buildContext.InstallSuffix != "" {
-		gcargs = append(gcargs, "-installsuffix", buildContext.InstallSuffix)
-	}
-	if p.buildID != "" {
-		gcargs = append(gcargs, "-buildid", p.buildID)
-	}
-
-	for _, path := range p.Imports {
-		if i := strings.LastIndex(path, "/vendor/"); i >= 0 {
-			gcargs = append(gcargs, "-importmap", path[i+len("/vendor/"):]+"="+path)
-		} else if strings.HasPrefix(path, "vendor/") {
-			gcargs = append(gcargs, "-importmap", path[len("vendor/"):]+"="+path)
-		}
-	}
-
-	for _, path := range p.Imports {
-		if i := strings.LastIndex(path, "/vendor/"); i >= 0 {
-			gcargs = append(gcargs, "-importmap", path[i+len("/vendor/"):]+"="+path)
-		} else if strings.HasPrefix(path, "vendor/") {
-			gcargs = append(gcargs, "-importmap", path[len("vendor/"):]+"="+path)
-		}
-	}
-
-	args := []interface{}{buildToolExec, tool("compile"), "-o", ofile, "-trimpath", b.work, buildGcflags, gcargs, "-D", p.localPrefix, importArgs}
-	if ofile == archive {
-		args = append(args, "-pack")
-	}
-	if asmhdr {
-		args = append(args, "-asmhdr", obj+"go_asm.h")
-	}
-	for _, f := range gofiles {
-		args = append(args, mkAbs(p.Dir, f))
-	}
-
-	output, err = b.runOut(p.Dir, p.ImportPath, nil, args...)
-	return ofile, output, err
-}
-
-func (gcToolchain) asm(b *builder, p *Package, obj, ofile, sfile string) error {
-	// Add -I pkg/GOOS_GOARCH so #include "textflag.h" works in .s files.
-	inc := filepath.Join(goroot, "pkg", "include")
-	sfile = mkAbs(p.Dir, sfile)
-	args := []interface{}{buildToolExec, tool("asm"), "-o", ofile, "-trimpath", b.work, "-I", obj, "-I", inc, "-D", "GOOS_" + goos, "-D", "GOARCH_" + goarch, buildAsmflags, sfile}
-	if err := b.run(p.Dir, p.ImportPath, nil, args...); err != nil {
-		return err
-	}
-	return nil
-}
-
-// toolVerify checks that the command line args writes the same output file
-// if run using newTool instead.
-// Unused now but kept around for future use.
-func toolVerify(b *builder, p *Package, newTool string, ofile string, args []interface{}) error {
-	newArgs := make([]interface{}, len(args))
-	copy(newArgs, args)
-	newArgs[1] = tool(newTool)
-	newArgs[3] = ofile + ".new" // x.6 becomes x.6.new
-	if err := b.run(p.Dir, p.ImportPath, nil, newArgs...); err != nil {
-		return err
-	}
-	data1, err := ioutil.ReadFile(ofile)
-	if err != nil {
-		return err
-	}
-	data2, err := ioutil.ReadFile(ofile + ".new")
-	if err != nil {
-		return err
-	}
-	if !bytes.Equal(data1, data2) {
-		return fmt.Errorf("%s and %s produced different output files:\n%s\n%s", filepath.Base(args[1].(string)), newTool, strings.Join(stringList(args...), " "), strings.Join(stringList(newArgs...), " "))
-	}
-	os.Remove(ofile + ".new")
-	return nil
-}
-
-func (gcToolchain) pkgpath(basedir string, p *Package) string {
-	end := filepath.FromSlash(p.ImportPath + ".a")
-	return filepath.Join(basedir, end)
-}
-
-func (gcToolchain) pack(b *builder, p *Package, objDir, afile string, ofiles []string) error {
-	var absOfiles []string
-	for _, f := range ofiles {
-		absOfiles = append(absOfiles, mkAbs(objDir, f))
-	}
-	cmd := "c"
-	absAfile := mkAbs(objDir, afile)
-	appending := false
-	if _, err := os.Stat(absAfile); err == nil {
-		appending = true
-		cmd = "r"
-	}
-
-	cmdline := stringList("pack", cmd, absAfile, absOfiles)
-
-	if appending {
-		if buildN || buildX {
-			b.showcmd(p.Dir, "%s # internal", joinUnambiguously(cmdline))
-		}
-		if buildN {
-			return nil
-		}
-		if err := packInternal(b, absAfile, absOfiles); err != nil {
-			b.showOutput(p.Dir, p.ImportPath, err.Error()+"\n")
-			return errPrintedOutput
-		}
-		return nil
-	}
-
-	// Need actual pack.
-	cmdline[0] = tool("pack")
-	return b.run(p.Dir, p.ImportPath, nil, buildToolExec, cmdline)
-}
-
-func packInternal(b *builder, afile string, ofiles []string) error {
-	dst, err := os.OpenFile(afile, os.O_WRONLY|os.O_APPEND, 0)
-	if err != nil {
-		return err
-	}
-	defer dst.Close() // only for error returns or panics
-	w := bufio.NewWriter(dst)
-
-	for _, ofile := range ofiles {
-		src, err := os.Open(ofile)
-		if err != nil {
-			return err
-		}
-		fi, err := src.Stat()
-		if err != nil {
-			src.Close()
-			return err
-		}
-		// Note: Not using %-16.16s format because we care
-		// about bytes, not runes.
-		name := fi.Name()
-		if len(name) > 16 {
-			name = name[:16]
-		} else {
-			name += strings.Repeat(" ", 16-len(name))
-		}
-		size := fi.Size()
-		fmt.Fprintf(w, "%s%-12d%-6d%-6d%-8o%-10d`\n",
-			name, 0, 0, 0, 0644, size)
-		n, err := io.Copy(w, src)
-		src.Close()
-		if err == nil && n < size {
-			err = io.ErrUnexpectedEOF
-		} else if err == nil && n > size {
-			err = fmt.Errorf("file larger than size reported by stat")
-		}
-		if err != nil {
-			return fmt.Errorf("copying %s to %s: %v", ofile, afile, err)
-		}
-		if size&1 != 0 {
-			w.WriteByte(0)
-		}
-	}
-
-	if err := w.Flush(); err != nil {
-		return err
-	}
-	return dst.Close()
-}
-
-// setextld sets the appropriate linker flags for the specified compiler.
-func setextld(ldflags []string, compiler []string) []string {
-	for _, f := range ldflags {
-		if f == "-extld" || strings.HasPrefix(f, "-extld=") {
-			// don't override -extld if supplied
-			return ldflags
-		}
-	}
-	ldflags = append(ldflags, "-extld="+compiler[0])
-	if len(compiler) > 1 {
-		extldflags := false
-		add := strings.Join(compiler[1:], " ")
-		for i, f := range ldflags {
-			if f == "-extldflags" && i+1 < len(ldflags) {
-				ldflags[i+1] = add + " " + ldflags[i+1]
-				extldflags = true
-				break
-			} else if strings.HasPrefix(f, "-extldflags=") {
-				ldflags[i] = "-extldflags=" + add + " " + ldflags[i][len("-extldflags="):]
-				extldflags = true
-				break
-			}
-		}
-		if !extldflags {
-			ldflags = append(ldflags, "-extldflags="+add)
-		}
-	}
-	return ldflags
-}
-
-func (gcToolchain) ld(b *builder, root *action, out string, allactions []*action, mainpkg string, ofiles []string) error {
-	importArgs := b.includeArgs("-L", allactions)
-	cxx := len(root.p.CXXFiles) > 0 || len(root.p.SwigCXXFiles) > 0
-	for _, a := range allactions {
-		if a.p != nil && (len(a.p.CXXFiles) > 0 || len(a.p.SwigCXXFiles) > 0) {
-			cxx = true
-		}
-	}
-	var ldflags []string
-	if buildContext.InstallSuffix != "" {
-		ldflags = append(ldflags, "-installsuffix", buildContext.InstallSuffix)
-	}
-	if root.p.omitDWARF {
-		ldflags = append(ldflags, "-w")
-	}
-
-	// If the user has not specified the -extld option, then specify the
-	// appropriate linker. In case of C++ code, use the compiler named
-	// by the CXX environment variable or defaultCXX if CXX is not set.
-	// Else, use the CC environment variable and defaultCC as fallback.
-	var compiler []string
-	if cxx {
-		compiler = envList("CXX", defaultCXX)
-	} else {
-		compiler = envList("CC", defaultCC)
-	}
-	ldflags = setextld(ldflags, compiler)
-	ldflags = append(ldflags, "-buildmode="+ldBuildmode)
-	if root.p.buildID != "" {
-		ldflags = append(ldflags, "-buildid="+root.p.buildID)
-	}
-	ldflags = append(ldflags, buildLdflags...)
-
-	// On OS X when using external linking to build a shared library,
-	// the argument passed here to -o ends up recorded in the final
-	// shared library in the LC_ID_DYLIB load command.
-	// To avoid putting the temporary output directory name there
-	// (and making the resulting shared library useless),
-	// run the link in the output directory so that -o can name
-	// just the final path element.
-	dir := "."
-	if goos == "darwin" && buildBuildmode == "c-shared" {
-		dir, out = filepath.Split(out)
-	}
-
-	return b.run(dir, root.p.ImportPath, nil, buildToolExec, tool("link"), "-o", out, importArgs, ldflags, mainpkg)
-}
-
-func (gcToolchain) ldShared(b *builder, toplevelactions []*action, out string, allactions []*action) error {
-	importArgs := b.includeArgs("-L", allactions)
-	ldflags := []string{"-installsuffix", buildContext.InstallSuffix}
-	ldflags = append(ldflags, "-buildmode=shared")
-	ldflags = append(ldflags, buildLdflags...)
-	cxx := false
-	for _, a := range allactions {
-		if a.p != nil && (len(a.p.CXXFiles) > 0 || len(a.p.SwigCXXFiles) > 0) {
-			cxx = true
-		}
-	}
-	// If the user has not specified the -extld option, then specify the
-	// appropriate linker. In case of C++ code, use the compiler named
-	// by the CXX environment variable or defaultCXX if CXX is not set.
-	// Else, use the CC environment variable and defaultCC as fallback.
-	var compiler []string
-	if cxx {
-		compiler = envList("CXX", defaultCXX)
-	} else {
-		compiler = envList("CC", defaultCC)
-	}
-	ldflags = setextld(ldflags, compiler)
-	for _, d := range toplevelactions {
-		if !strings.HasSuffix(d.target, ".a") { // omit unsafe etc and actions for other shared libraries
-			continue
-		}
-		ldflags = append(ldflags, d.p.ImportPath+"="+d.target)
-	}
-	return b.run(".", out, nil, buildToolExec, tool("link"), "-o", out, importArgs, ldflags)
-}
-
-func (gcToolchain) cc(b *builder, p *Package, objdir, ofile, cfile string) error {
-	return fmt.Errorf("%s: C source files not supported without cgo", mkAbs(p.Dir, cfile))
-}
-
-// The Gccgo toolchain.
-type gccgoToolchain struct{}
-
-var gccgoName, gccgoBin string
-
-func init() {
-	gccgoName = os.Getenv("GCCGO")
-	if gccgoName == "" {
-		gccgoName = defaultGCCGO
-	}
-	gccgoBin, _ = exec.LookPath(gccgoName)
-}
-
-func (gccgoToolchain) compiler() string {
-	return gccgoBin
-}
-
-func (gccgoToolchain) linker() string {
-	return gccgoBin
-}
-
-func (tools gccgoToolchain) gc(b *builder, p *Package, archive, obj string, asmhdr bool, importArgs []string, gofiles []string) (ofile string, output []byte, err error) {
-	out := "_go_.o"
-	ofile = obj + out
-	gcargs := []string{"-g"}
-	gcargs = append(gcargs, b.gccArchArgs()...)
-	if pkgpath := gccgoPkgpath(p); pkgpath != "" {
-		gcargs = append(gcargs, "-fgo-pkgpath="+pkgpath)
-	}
-	if p.localPrefix != "" {
-		gcargs = append(gcargs, "-fgo-relative-import-path="+p.localPrefix)
-	}
-	args := stringList(tools.compiler(), importArgs, "-c", gcargs, "-o", ofile, buildGccgoflags)
-	for _, f := range gofiles {
-		args = append(args, mkAbs(p.Dir, f))
-	}
-
-	output, err = b.runOut(p.Dir, p.ImportPath, nil, args)
-	return ofile, output, err
-}
-
-func (tools gccgoToolchain) asm(b *builder, p *Package, obj, ofile, sfile string) error {
-	sfile = mkAbs(p.Dir, sfile)
-	defs := []string{"-D", "GOOS_" + goos, "-D", "GOARCH_" + goarch}
-	if pkgpath := gccgoCleanPkgpath(p); pkgpath != "" {
-		defs = append(defs, `-D`, `GOPKGPATH="`+pkgpath+`"`)
-	}
-	defs = tools.maybePIC(defs)
-	defs = append(defs, b.gccArchArgs()...)
-	return b.run(p.Dir, p.ImportPath, nil, tools.compiler(), "-c", "-I", obj, "-o", ofile, defs, sfile)
-}
-
-func (gccgoToolchain) pkgpath(basedir string, p *Package) string {
-	end := filepath.FromSlash(p.ImportPath + ".a")
-	afile := filepath.Join(basedir, end)
-	// add "lib" to the final element
-	return filepath.Join(filepath.Dir(afile), "lib"+filepath.Base(afile))
-}
-
-func (gccgoToolchain) pack(b *builder, p *Package, objDir, afile string, ofiles []string) error {
-	var absOfiles []string
-	for _, f := range ofiles {
-		absOfiles = append(absOfiles, mkAbs(objDir, f))
-	}
-	return b.run(p.Dir, p.ImportPath, nil, "ar", "cru", mkAbs(objDir, afile), absOfiles)
-}
-
-func (tools gccgoToolchain) ld(b *builder, root *action, out string, allactions []*action, mainpkg string, ofiles []string) error {
-	// gccgo needs explicit linking with all package dependencies,
-	// and all LDFLAGS from cgo dependencies.
-	apackagesSeen := make(map[*Package]bool)
-	afiles := []string{}
-	shlibs := []string{}
-	xfiles := []string{}
-	ldflags := b.gccArchArgs()
-	cgoldflags := []string{}
-	usesCgo := false
-	cxx := len(root.p.CXXFiles) > 0 || len(root.p.SwigCXXFiles) > 0
-	objc := len(root.p.MFiles) > 0
-
-	actionsSeen := make(map[*action]bool)
-	// Make a pre-order depth-first traversal of the action graph, taking note of
-	// whether a shared library action has been seen on the way to an action (the
-	// construction of the graph means that if any path to a node passes through
-	// a shared library action, they all do).
-	var walk func(a *action, seenShlib bool)
-	walk = func(a *action, seenShlib bool) {
-		if actionsSeen[a] {
-			return
-		}
-		actionsSeen[a] = true
-		if a.p != nil && !seenShlib {
-			if a.p.Standard {
-				return
-			}
-			// We record the target of the first time we see a .a file
-			// for a package to make sure that we prefer the 'install'
-			// rather than the 'build' location (which may not exist any
-			// more). We still need to traverse the dependencies of the
-			// build action though so saying
-			// if apackagesSeen[a.p] { return }
-			// doesn't work.
-			if !apackagesSeen[a.p] {
-				apackagesSeen[a.p] = true
-				if a.p.fake && a.p.external {
-					// external _tests, if present must come before
-					// internal _tests. Store these on a separate list
-					// and place them at the head after this loop.
-					xfiles = append(xfiles, a.target)
-				} else if a.p.fake {
-					// move _test files to the top of the link order
-					afiles = append([]string{a.target}, afiles...)
-				} else {
-					afiles = append(afiles, a.target)
-				}
-			}
-		}
-		if strings.HasSuffix(a.target, ".so") {
-			shlibs = append(shlibs, a.target)
-			seenShlib = true
-		}
-		for _, a1 := range a.deps {
-			walk(a1, seenShlib)
-		}
-	}
-	for _, a1 := range root.deps {
-		walk(a1, false)
-	}
-	afiles = append(xfiles, afiles...)
-
-	for _, a := range allactions {
-		// Gather CgoLDFLAGS, but not from standard packages.
-		// The go tool can dig up runtime/cgo from GOROOT and
-		// think that it should use its CgoLDFLAGS, but gccgo
-		// doesn't use runtime/cgo.
-		if a.p == nil {
-			continue
-		}
-		if !a.p.Standard {
-			cgoldflags = append(cgoldflags, a.p.CgoLDFLAGS...)
-		}
-		if len(a.p.CgoFiles) > 0 {
-			usesCgo = true
-		}
-		if a.p.usesSwig() {
-			usesCgo = true
-		}
-		if len(a.p.CXXFiles) > 0 || len(a.p.SwigCXXFiles) > 0 {
-			cxx = true
-		}
-		if len(a.p.MFiles) > 0 {
-			objc = true
-		}
-	}
-
-	ldflags = append(ldflags, "-Wl,--whole-archive")
-	ldflags = append(ldflags, afiles...)
-	ldflags = append(ldflags, "-Wl,--no-whole-archive")
-
-	ldflags = append(ldflags, cgoldflags...)
-	ldflags = append(ldflags, envList("CGO_LDFLAGS", "")...)
-	ldflags = append(ldflags, root.p.CgoLDFLAGS...)
-
-	ldflags = stringList("-Wl,-(", ldflags, "-Wl,-)")
-
-	for _, shlib := range shlibs {
-		ldflags = append(
-			ldflags,
-			"-L"+filepath.Dir(shlib),
-			"-Wl,-rpath="+filepath.Dir(shlib),
-			"-l"+strings.TrimSuffix(
-				strings.TrimPrefix(filepath.Base(shlib), "lib"),
-				".so"))
-	}
-
-	var realOut string
-	switch ldBuildmode {
-	case "exe":
-		if usesCgo && goos == "linux" {
-			ldflags = append(ldflags, "-Wl,-E")
-		}
-
-	case "c-archive":
-		// Link the Go files into a single .o, and also link
-		// in -lgolibbegin.
-		//
-		// We need to use --whole-archive with -lgolibbegin
-		// because it doesn't define any symbols that will
-		// cause the contents to be pulled in; it's just
-		// initialization code.
-		//
-		// The user remains responsible for linking against
-		// -lgo -lpthread -lm in the final link.  We can't use
-		// -r to pick them up because we can't combine
-		// split-stack and non-split-stack code in a single -r
-		// link, and libgo picks up non-split-stack code from
-		// libffi.
-		ldflags = append(ldflags, "-Wl,-r", "-nostdlib", "-Wl,--whole-archive", "-lgolibbegin", "-Wl,--no-whole-archive")
-
-		// We are creating an object file, so we don't want a build ID.
-		ldflags = b.disableBuildID(ldflags)
-
-		realOut = out
-		out = out + ".o"
-
-	case "c-shared":
-		ldflags = append(ldflags, "-shared", "-nostdlib", "-Wl,--whole-archive", "-lgolibbegin", "-Wl,--no-whole-archive", "-lgo", "-lgcc_s", "-lgcc")
-
-	default:
-		fatalf("-buildmode=%s not supported for gccgo", ldBuildmode)
-	}
-
-	switch ldBuildmode {
-	case "exe", "c-shared":
-		if cxx {
-			ldflags = append(ldflags, "-lstdc++")
-		}
-		if objc {
-			ldflags = append(ldflags, "-lobjc")
-		}
-	}
-
-	if err := b.run(".", root.p.ImportPath, nil, tools.linker(), "-o", out, ofiles, ldflags, buildGccgoflags); err != nil {
-		return err
-	}
-
-	switch ldBuildmode {
-	case "c-archive":
-		if err := b.run(".", root.p.ImportPath, nil, "ar", "rc", realOut, out); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func (tools gccgoToolchain) ldShared(b *builder, toplevelactions []*action, out string, allactions []*action) error {
-	args := []string{"-o", out, "-shared", "-nostdlib", "-zdefs", "-Wl,--whole-archive"}
-	for _, a := range toplevelactions {
-		args = append(args, a.target)
-	}
-	args = append(args, "-Wl,--no-whole-archive", "-shared", "-nostdlib", "-lgo", "-lgcc_s", "-lgcc", "-lc")
-	shlibs := []string{}
-	for _, a := range allactions {
-		if strings.HasSuffix(a.target, ".so") {
-			shlibs = append(shlibs, a.target)
-		}
-	}
-	for _, shlib := range shlibs {
-		args = append(
-			args,
-			"-L"+filepath.Dir(shlib),
-			"-Wl,-rpath="+filepath.Dir(shlib),
-			"-l"+strings.TrimSuffix(
-				strings.TrimPrefix(filepath.Base(shlib), "lib"),
-				".so"))
-	}
-	return b.run(".", out, nil, tools.linker(), args, buildGccgoflags)
-}
-
-func (tools gccgoToolchain) cc(b *builder, p *Package, objdir, ofile, cfile string) error {
-	inc := filepath.Join(goroot, "pkg", "include")
-	cfile = mkAbs(p.Dir, cfile)
-	defs := []string{"-D", "GOOS_" + goos, "-D", "GOARCH_" + goarch}
-	defs = append(defs, b.gccArchArgs()...)
-	if pkgpath := gccgoCleanPkgpath(p); pkgpath != "" {
-		defs = append(defs, `-D`, `GOPKGPATH="`+pkgpath+`"`)
-	}
-	switch goarch {
-	case "386", "amd64":
-		defs = append(defs, "-fsplit-stack")
-	}
-	defs = tools.maybePIC(defs)
-	return b.run(p.Dir, p.ImportPath, nil, envList("CC", defaultCC), "-Wall", "-g",
-		"-I", objdir, "-I", inc, "-o", ofile, defs, "-c", cfile)
-}
-
-// maybePIC adds -fPIC to the list of arguments if needed.
-func (tools gccgoToolchain) maybePIC(args []string) []string {
-	switch buildBuildmode {
-	case "c-shared", "shared":
-		args = append(args, "-fPIC")
-	}
-	return args
-}
-
-func gccgoPkgpath(p *Package) string {
-	if p.build.IsCommand() && !p.forceLibrary {
-		return ""
-	}
-	return p.ImportPath
-}
-
-func gccgoCleanPkgpath(p *Package) string {
-	clean := func(r rune) rune {
-		switch {
-		case 'A' <= r && r <= 'Z', 'a' <= r && r <= 'z',
-			'0' <= r && r <= '9':
-			return r
-		}
-		return '_'
-	}
-	return strings.Map(clean, gccgoPkgpath(p))
-}
-
-// libgcc returns the filename for libgcc, as determined by invoking gcc with
-// the -print-libgcc-file-name option.
-func (b *builder) libgcc(p *Package) (string, error) {
-	var buf bytes.Buffer
-
-	gccCmd := b.gccCmd(p.Dir)
-
-	prev := b.print
-	if buildN {
-		// In -n mode we temporarily swap out the builder's
-		// print function to capture the command-line. This
-		// let's us assign it to $LIBGCC and produce a valid
-		// buildscript for cgo packages.
-		b.print = func(a ...interface{}) (int, error) {
-			return fmt.Fprint(&buf, a...)
-		}
-	}
-	f, err := b.runOut(p.Dir, p.ImportPath, nil, gccCmd, "-print-libgcc-file-name")
-	if err != nil {
-		return "", fmt.Errorf("gcc -print-libgcc-file-name: %v (%s)", err, f)
-	}
-	if buildN {
-		s := fmt.Sprintf("LIBGCC=$(%s)\n", buf.Next(buf.Len()-1))
-		b.print = prev
-		b.print(s)
-		return "$LIBGCC", nil
-	}
-
-	// The compiler might not be able to find libgcc, and in that case,
-	// it will simply return "libgcc.a", which is of no use to us.
-	if !filepath.IsAbs(string(f)) {
-		return "", nil
-	}
-
-	return strings.Trim(string(f), "\r\n"), nil
-}
-
-// gcc runs the gcc C compiler to create an object from a single C file.
-func (b *builder) gcc(p *Package, out string, flags []string, cfile string) error {
-	return b.ccompile(p, out, flags, cfile, b.gccCmd(p.Dir))
-}
-
-// gxx runs the g++ C++ compiler to create an object from a single C++ file.
-func (b *builder) gxx(p *Package, out string, flags []string, cxxfile string) error {
-	return b.ccompile(p, out, flags, cxxfile, b.gxxCmd(p.Dir))
-}
-
-// ccompile runs the given C or C++ compiler and creates an object from a single source file.
-func (b *builder) ccompile(p *Package, out string, flags []string, file string, compiler []string) error {
-	file = mkAbs(p.Dir, file)
-	return b.run(p.Dir, p.ImportPath, nil, compiler, flags, "-o", out, "-c", file)
-}
-
-// gccld runs the gcc linker to create an executable from a set of object files.
-func (b *builder) gccld(p *Package, out string, flags []string, obj []string) error {
-	var cmd []string
-	if len(p.CXXFiles) > 0 || len(p.SwigCXXFiles) > 0 {
-		cmd = b.gxxCmd(p.Dir)
-	} else {
-		cmd = b.gccCmd(p.Dir)
-	}
-	return b.run(p.Dir, p.ImportPath, nil, cmd, "-o", out, obj, flags)
-}
-
-// gccCmd returns a gcc command line prefix
-// defaultCC is defined in zdefaultcc.go, written by cmd/dist.
-func (b *builder) gccCmd(objdir string) []string {
-	return b.ccompilerCmd("CC", defaultCC, objdir)
-}
-
-// gxxCmd returns a g++ command line prefix
-// defaultCXX is defined in zdefaultcc.go, written by cmd/dist.
-func (b *builder) gxxCmd(objdir string) []string {
-	return b.ccompilerCmd("CXX", defaultCXX, objdir)
-}
-
-// ccompilerCmd returns a command line prefix for the given environment
-// variable and using the default command when the variable is empty.
-func (b *builder) ccompilerCmd(envvar, defcmd, objdir string) []string {
-	// NOTE: env.go's mkEnv knows that the first three
-	// strings returned are "gcc", "-I", objdir (and cuts them off).
-
-	compiler := envList(envvar, defcmd)
-	a := []string{compiler[0], "-I", objdir}
-	a = append(a, compiler[1:]...)
-
-	// Definitely want -fPIC but on Windows gcc complains
-	// "-fPIC ignored for target (all code is position independent)"
-	if goos != "windows" {
-		a = append(a, "-fPIC")
-	}
-	a = append(a, b.gccArchArgs()...)
-	// gcc-4.5 and beyond require explicit "-pthread" flag
-	// for multithreading with pthread library.
-	if buildContext.CgoEnabled {
-		switch goos {
-		case "windows":
-			a = append(a, "-mthreads")
-		default:
-			a = append(a, "-pthread")
-		}
-	}
-
-	if strings.Contains(a[0], "clang") {
-		// disable ASCII art in clang errors, if possible
-		a = append(a, "-fno-caret-diagnostics")
-		// clang is too smart about command-line arguments
-		a = append(a, "-Qunused-arguments")
-	}
-
-	// disable word wrapping in error messages
-	a = append(a, "-fmessage-length=0")
-
-	// On OS X, some of the compilers behave as if -fno-common
-	// is always set, and the Mach-O linker in 6l/8l assumes this.
-	// See https://golang.org/issue/3253.
-	if goos == "darwin" {
-		a = append(a, "-fno-common")
-	}
-
-	return a
-}
-
-// gccArchArgs returns arguments to pass to gcc based on the architecture.
-func (b *builder) gccArchArgs() []string {
-	switch goarch {
-	case "386":
-		return []string{"-m32"}
-	case "amd64", "amd64p32":
-		return []string{"-m64"}
-	case "arm":
-		return []string{"-marm"} // not thumb
-	}
-	return nil
-}
-
-// envList returns the value of the given environment variable broken
-// into fields, using the default value when the variable is empty.
-func envList(key, def string) []string {
-	v := os.Getenv(key)
-	if v == "" {
-		v = def
-	}
-	return strings.Fields(v)
-}
-
-// Return the flags to use when invoking the C or C++ compilers, or cgo.
-func (b *builder) cflags(p *Package, def bool) (cppflags, cflags, cxxflags, ldflags []string) {
-	var defaults string
-	if def {
-		defaults = "-g -O2"
-	}
-
-	cppflags = stringList(envList("CGO_CPPFLAGS", ""), p.CgoCPPFLAGS)
-	cflags = stringList(envList("CGO_CFLAGS", defaults), p.CgoCFLAGS)
-	cxxflags = stringList(envList("CGO_CXXFLAGS", defaults), p.CgoCXXFLAGS)
-	ldflags = stringList(envList("CGO_LDFLAGS", defaults), p.CgoLDFLAGS)
-	return
-}
-
-var cgoRe = regexp.MustCompile(`[/\\:]`)
-
-var (
-	cgoLibGccFile     string
-	cgoLibGccErr      error
-	cgoLibGccFileOnce sync.Once
-)
-
-func (b *builder) cgo(p *Package, cgoExe, obj string, pcCFLAGS, pcLDFLAGS, cgofiles, gccfiles, gxxfiles, mfiles []string) (outGo, outObj []string, err error) {
-	cgoCPPFLAGS, cgoCFLAGS, cgoCXXFLAGS, cgoLDFLAGS := b.cflags(p, true)
-	_, cgoexeCFLAGS, _, _ := b.cflags(p, false)
-	cgoCPPFLAGS = append(cgoCPPFLAGS, pcCFLAGS...)
-	cgoLDFLAGS = append(cgoLDFLAGS, pcLDFLAGS...)
-	// If we are compiling Objective-C code, then we need to link against libobjc
-	if len(mfiles) > 0 {
-		cgoLDFLAGS = append(cgoLDFLAGS, "-lobjc")
-	}
-
-	// Allows including _cgo_export.h from .[ch] files in the package.
-	cgoCPPFLAGS = append(cgoCPPFLAGS, "-I", obj)
-
-	// cgo
-	// TODO: CGOPKGPATH, CGO_FLAGS?
-	gofiles := []string{obj + "_cgo_gotypes.go"}
-	cfiles := []string{"_cgo_main.c", "_cgo_export.c"}
-	for _, fn := range cgofiles {
-		f := cgoRe.ReplaceAllString(fn[:len(fn)-2], "_")
-		gofiles = append(gofiles, obj+f+"cgo1.go")
-		cfiles = append(cfiles, f+"cgo2.c")
-	}
-	defunC := obj + "_cgo_defun.c"
-
-	cgoflags := []string{}
-	// TODO: make cgo not depend on $GOARCH?
-
-	if p.Standard && p.ImportPath == "runtime/cgo" {
-		cgoflags = append(cgoflags, "-import_runtime_cgo=false")
-	}
-	if p.Standard && (p.ImportPath == "runtime/race" || p.ImportPath == "runtime/cgo") {
-		cgoflags = append(cgoflags, "-import_syscall=false")
-	}
-
-	// Update $CGO_LDFLAGS with p.CgoLDFLAGS.
-	var cgoenv []string
-	if len(cgoLDFLAGS) > 0 {
-		flags := make([]string, len(cgoLDFLAGS))
-		for i, f := range cgoLDFLAGS {
-			flags[i] = strconv.Quote(f)
-		}
-		cgoenv = []string{"CGO_LDFLAGS=" + strings.Join(flags, " ")}
-	}
-
-	if _, ok := buildToolchain.(gccgoToolchain); ok {
-		switch goarch {
-		case "386", "amd64":
-			cgoCFLAGS = append(cgoCFLAGS, "-fsplit-stack")
-		}
-		cgoflags = append(cgoflags, "-gccgo")
-		if pkgpath := gccgoPkgpath(p); pkgpath != "" {
-			cgoflags = append(cgoflags, "-gccgopkgpath="+pkgpath)
-		}
-	}
-
-	switch buildBuildmode {
-	case "c-archive", "c-shared":
-		// Tell cgo that if there are any exported functions
-		// it should generate a header file that C code can
-		// #include.
-		cgoflags = append(cgoflags, "-exportheader="+obj+"_cgo_install.h")
-	}
-
-	if err := b.run(p.Dir, p.ImportPath, cgoenv, buildToolExec, cgoExe, "-objdir", obj, "-importpath", p.ImportPath, cgoflags, "--", cgoCPPFLAGS, cgoexeCFLAGS, cgofiles); err != nil {
-		return nil, nil, err
-	}
-	outGo = append(outGo, gofiles...)
-
-	// cc _cgo_defun.c
-	_, gccgo := buildToolchain.(gccgoToolchain)
-	if gccgo {
-		defunObj := obj + "_cgo_defun.o"
-		if err := buildToolchain.cc(b, p, obj, defunObj, defunC); err != nil {
-			return nil, nil, err
-		}
-		outObj = append(outObj, defunObj)
-	}
-
-	// gcc
-	var linkobj []string
-
-	var bareLDFLAGS []string
-	// filter out -lsomelib, -l somelib, *.{so,dll,dylib}, and (on Darwin) -framework X
-	for i := 0; i < len(cgoLDFLAGS); i++ {
-		f := cgoLDFLAGS[i]
-		switch {
-		// skip "-lc" or "-l somelib"
-		case strings.HasPrefix(f, "-l"):
-			if f == "-l" {
-				i++
-			}
-		// skip "-framework X" on Darwin
-		case goos == "darwin" && f == "-framework":
-			i++
-		// skip "*.{dylib,so,dll}"
-		case strings.HasSuffix(f, ".dylib"),
-			strings.HasSuffix(f, ".so"),
-			strings.HasSuffix(f, ".dll"):
-			continue
-		// Remove any -fsanitize=foo flags.
-		// Otherwise the compiler driver thinks that we are doing final link
-		// and links sanitizer runtime into the object file. But we are not doing
-		// the final link, we will link the resulting object file again. And
-		// so the program ends up with two copies of sanitizer runtime.
-		// See issue 8788 for details.
-		case strings.HasPrefix(f, "-fsanitize="):
-			continue
-		default:
-			bareLDFLAGS = append(bareLDFLAGS, f)
-		}
-	}
-
-	cgoLibGccFileOnce.Do(func() {
-		cgoLibGccFile, cgoLibGccErr = b.libgcc(p)
-	})
-	if cgoLibGccFile == "" && cgoLibGccErr != nil {
-		return nil, nil, err
-	}
-
-	var staticLibs []string
-	if goos == "windows" {
-		// libmingw32 and libmingwex might also use libgcc, so libgcc must come last,
-		// and they also have some inter-dependencies, so must use linker groups.
-		staticLibs = []string{"-Wl,--start-group", "-lmingwex", "-lmingw32", "-Wl,--end-group"}
-	}
-	if cgoLibGccFile != "" {
-		staticLibs = append(staticLibs, cgoLibGccFile)
-	}
-
-	cflags := stringList(cgoCPPFLAGS, cgoCFLAGS)
-	for _, cfile := range cfiles {
-		ofile := obj + cfile[:len(cfile)-1] + "o"
-		if err := b.gcc(p, ofile, cflags, obj+cfile); err != nil {
-			return nil, nil, err
-		}
-		linkobj = append(linkobj, ofile)
-		if !strings.HasSuffix(ofile, "_cgo_main.o") {
-			outObj = append(outObj, ofile)
-		}
-	}
-
-	for _, file := range gccfiles {
-		ofile := obj + cgoRe.ReplaceAllString(file[:len(file)-1], "_") + "o"
-		if err := b.gcc(p, ofile, cflags, file); err != nil {
-			return nil, nil, err
-		}
-		linkobj = append(linkobj, ofile)
-		outObj = append(outObj, ofile)
-	}
-
-	cxxflags := stringList(cgoCPPFLAGS, cgoCXXFLAGS)
-	for _, file := range gxxfiles {
-		// Append .o to the file, just in case the pkg has file.c and file.cpp
-		ofile := obj + cgoRe.ReplaceAllString(file, "_") + ".o"
-		if err := b.gxx(p, ofile, cxxflags, file); err != nil {
-			return nil, nil, err
-		}
-		linkobj = append(linkobj, ofile)
-		outObj = append(outObj, ofile)
-	}
-
-	for _, file := range mfiles {
-		// Append .o to the file, just in case the pkg has file.c and file.m
-		ofile := obj + cgoRe.ReplaceAllString(file, "_") + ".o"
-		if err := b.gcc(p, ofile, cflags, file); err != nil {
-			return nil, nil, err
-		}
-		linkobj = append(linkobj, ofile)
-		outObj = append(outObj, ofile)
-	}
-
-	linkobj = append(linkobj, p.SysoFiles...)
-	dynobj := obj + "_cgo_.o"
-	pie := goarch == "arm" && (goos == "linux" || goos == "android")
-	if pie { // we need to use -pie for Linux/ARM to get accurate imported sym
-		cgoLDFLAGS = append(cgoLDFLAGS, "-pie")
-	}
-	if err := b.gccld(p, dynobj, cgoLDFLAGS, linkobj); err != nil {
-		return nil, nil, err
-	}
-	if pie { // but we don't need -pie for normal cgo programs
-		cgoLDFLAGS = cgoLDFLAGS[0 : len(cgoLDFLAGS)-1]
-	}
-
-	if _, ok := buildToolchain.(gccgoToolchain); ok {
-		// we don't use dynimport when using gccgo.
-		return outGo, outObj, nil
-	}
-
-	// cgo -dynimport
-	importGo := obj + "_cgo_import.go"
-	cgoflags = []string{}
-	if p.Standard && p.ImportPath == "runtime/cgo" {
-		cgoflags = append(cgoflags, "-dynlinker") // record path to dynamic linker
-	}
-	if err := b.run(p.Dir, p.ImportPath, nil, buildToolExec, cgoExe, "-objdir", obj, "-dynpackage", p.Name, "-dynimport", dynobj, "-dynout", importGo, cgoflags); err != nil {
-		return nil, nil, err
-	}
-	outGo = append(outGo, importGo)
-
-	ofile := obj + "_all.o"
-	var gccObjs, nonGccObjs []string
-	for _, f := range outObj {
-		if strings.HasSuffix(f, ".o") {
-			gccObjs = append(gccObjs, f)
-		} else {
-			nonGccObjs = append(nonGccObjs, f)
-		}
-	}
-	ldflags := stringList(bareLDFLAGS, "-Wl,-r", "-nostdlib", staticLibs)
-
-	// We are creating an object file, so we don't want a build ID.
-	ldflags = b.disableBuildID(ldflags)
-
-	if err := b.gccld(p, ofile, ldflags, gccObjs); err != nil {
-		return nil, nil, err
-	}
-
-	// NOTE(rsc): The importObj is a 5c/6c/8c object and on Windows
-	// must be processed before the gcc-generated objects.
-	// Put it first.  https://golang.org/issue/2601
-	outObj = stringList(nonGccObjs, ofile)
-
-	return outGo, outObj, nil
-}
-
-// Run SWIG on all SWIG input files.
-// TODO: Don't build a shared library, once SWIG emits the necessary
-// pragmas for external linking.
-func (b *builder) swig(p *Package, obj string, pcCFLAGS []string) (outGo, outC, outCXX []string, err error) {
-	if err := b.swigVersionCheck(); err != nil {
-		return nil, nil, nil, err
-	}
-
-	intgosize, err := b.swigIntSize(obj)
-	if err != nil {
-		return nil, nil, nil, err
-	}
-
-	for _, f := range p.SwigFiles {
-		goFile, cFile, err := b.swigOne(p, f, obj, pcCFLAGS, false, intgosize)
-		if err != nil {
-			return nil, nil, nil, err
-		}
-		if goFile != "" {
-			outGo = append(outGo, goFile)
-		}
-		if cFile != "" {
-			outC = append(outC, cFile)
-		}
-	}
-	for _, f := range p.SwigCXXFiles {
-		goFile, cxxFile, err := b.swigOne(p, f, obj, pcCFLAGS, true, intgosize)
-		if err != nil {
-			return nil, nil, nil, err
-		}
-		if goFile != "" {
-			outGo = append(outGo, goFile)
-		}
-		if cxxFile != "" {
-			outCXX = append(outCXX, cxxFile)
-		}
-	}
-	return outGo, outC, outCXX, nil
-}
-
-// Make sure SWIG is new enough.
-var (
-	swigCheckOnce sync.Once
-	swigCheck     error
-)
-
-func (b *builder) swigDoVersionCheck() error {
-	out, err := b.runOut("", "", nil, "swig", "-version")
-	if err != nil {
-		return err
-	}
-	re := regexp.MustCompile(`[vV]ersion +([\d]+)([.][\d]+)?([.][\d]+)?`)
-	matches := re.FindSubmatch(out)
-	if matches == nil {
-		// Can't find version number; hope for the best.
-		return nil
-	}
-
-	major, err := strconv.Atoi(string(matches[1]))
-	if err != nil {
-		// Can't find version number; hope for the best.
-		return nil
-	}
-	const errmsg = "must have SWIG version >= 3.0.6"
-	if major < 3 {
-		return errors.New(errmsg)
-	}
-	if major > 3 {
-		// 4.0 or later
-		return nil
-	}
-
-	// We have SWIG version 3.x.
-	if len(matches[2]) > 0 {
-		minor, err := strconv.Atoi(string(matches[2][1:]))
-		if err != nil {
-			return nil
-		}
-		if minor > 0 {
-			// 3.1 or later
-			return nil
-		}
-	}
-
-	// We have SWIG version 3.0.x.
-	if len(matches[3]) > 0 {
-		patch, err := strconv.Atoi(string(matches[3][1:]))
-		if err != nil {
-			return nil
-		}
-		if patch < 6 {
-			// Before 3.0.6.
-			return errors.New(errmsg)
-		}
-	}
-
-	return nil
-}
-
-func (b *builder) swigVersionCheck() error {
-	swigCheckOnce.Do(func() {
-		swigCheck = b.swigDoVersionCheck()
-	})
-	return swigCheck
-}
-
-// This code fails to build if sizeof(int) <= 32
-const swigIntSizeCode = `
-package main
-const i int = 1 << 32
-`
-
-// Determine the size of int on the target system for the -intgosize option
-// of swig >= 2.0.9
-func (b *builder) swigIntSize(obj string) (intsize string, err error) {
-	if buildN {
-		return "$INTBITS", nil
-	}
-	src := filepath.Join(b.work, "swig_intsize.go")
-	if err = ioutil.WriteFile(src, []byte(swigIntSizeCode), 0644); err != nil {
-		return
-	}
-	srcs := []string{src}
-
-	p := goFilesPackage(srcs)
-
-	if _, _, e := buildToolchain.gc(b, p, "", obj, false, nil, srcs); e != nil {
-		return "32", nil
-	}
-	return "64", nil
-}
-
-// Run SWIG on one SWIG input file.
-func (b *builder) swigOne(p *Package, file, obj string, pcCFLAGS []string, cxx bool, intgosize string) (outGo, outC string, err error) {
-	cgoCPPFLAGS, cgoCFLAGS, cgoCXXFLAGS, _ := b.cflags(p, true)
-	var cflags []string
-	if cxx {
-		cflags = stringList(cgoCPPFLAGS, pcCFLAGS, cgoCXXFLAGS)
-	} else {
-		cflags = stringList(cgoCPPFLAGS, pcCFLAGS, cgoCFLAGS)
-	}
-
-	n := 5 // length of ".swig"
-	if cxx {
-		n = 8 // length of ".swigcxx"
-	}
-	base := file[:len(file)-n]
-	goFile := base + ".go"
-	gccBase := base + "_wrap."
-	gccExt := "c"
-	if cxx {
-		gccExt = "cxx"
-	}
-
-	_, gccgo := buildToolchain.(gccgoToolchain)
-
-	// swig
-	args := []string{
-		"-go",
-		"-cgo",
-		"-intgosize", intgosize,
-		"-module", base,
-		"-o", obj + gccBase + gccExt,
-		"-outdir", obj,
-	}
-
-	for _, f := range cflags {
-		if len(f) > 3 && f[:2] == "-I" {
-			args = append(args, f)
-		}
-	}
-
-	if gccgo {
-		args = append(args, "-gccgo")
-		if pkgpath := gccgoPkgpath(p); pkgpath != "" {
-			args = append(args, "-go-pkgpath", pkgpath)
-		}
-	}
-	if cxx {
-		args = append(args, "-c++")
-	}
-
-	out, err := b.runOut(p.Dir, p.ImportPath, nil, "swig", args, file)
-	if err != nil {
-		if len(out) > 0 {
-			if bytes.Contains(out, []byte("-intgosize")) || bytes.Contains(out, []byte("-cgo")) {
-				return "", "", errors.New("must have SWIG version >= 3.0.6")
-			}
-			b.showOutput(p.Dir, p.ImportPath, b.processOutput(out)) // swig error
-			return "", "", errPrintedOutput
-		}
-		return "", "", err
-	}
-	if len(out) > 0 {
-		b.showOutput(p.Dir, p.ImportPath, b.processOutput(out)) // swig warning
-	}
-
-	return obj + goFile, obj + gccBase + gccExt, nil
-}
-
-// disableBuildID adjusts a linker command line to avoid creating a
-// build ID when creating an object file rather than an executable or
-// shared library.  Some systems, such as Ubuntu, always add
-// --build-id to every link, but we don't want a build ID when we are
-// producing an object file.  On some of those system a plain -r (not
-// -Wl,-r) will turn off --build-id, but clang 3.0 doesn't support a
-// plain -r.  I don't know how to turn off --build-id when using clang
-// other than passing a trailing --build-id=none.  So that is what we
-// do, but only on systems likely to support it, which is to say,
-// systems that normally use gold or the GNU linker.
-func (b *builder) disableBuildID(ldflags []string) []string {
-	switch goos {
-	case "android", "dragonfly", "linux", "netbsd":
-		ldflags = append(ldflags, "-Wl,--build-id=none")
-	}
-	return ldflags
-}
-
-// An actionQueue is a priority queue of actions.
-type actionQueue []*action
-
-// Implement heap.Interface
-func (q *actionQueue) Len() int           { return len(*q) }
-func (q *actionQueue) Swap(i, j int)      { (*q)[i], (*q)[j] = (*q)[j], (*q)[i] }
-func (q *actionQueue) Less(i, j int) bool { return (*q)[i].priority < (*q)[j].priority }
-func (q *actionQueue) Push(x interface{}) { *q = append(*q, x.(*action)) }
-func (q *actionQueue) Pop() interface{} {
-	n := len(*q) - 1
-	x := (*q)[n]
-	*q = (*q)[:n]
-	return x
-}
-
-func (q *actionQueue) push(a *action) {
-	heap.Push(q, a)
-}
-
-func (q *actionQueue) pop() *action {
-	return heap.Pop(q).(*action)
-}
-
-func raceInit() {
-	if !buildRace {
-		return
-	}
-	if goarch != "amd64" || goos != "linux" && goos != "freebsd" && goos != "darwin" && goos != "windows" {
-		fmt.Fprintf(os.Stderr, "go %s: -race is only supported on linux/amd64, freebsd/amd64, darwin/amd64 and windows/amd64\n", flag.Args()[0])
-		os.Exit(2)
-	}
-	buildGcflags = append(buildGcflags, "-race")
-	buildLdflags = append(buildLdflags, "-race")
-	if buildContext.InstallSuffix != "" {
-		buildContext.InstallSuffix += "_"
-	}
-	buildContext.InstallSuffix += "race"
-	buildContext.BuildTags = append(buildContext.BuildTags, "race")
-}
-
-// defaultSuffix returns file extension used for command files in
-// current os environment.
-func defaultSuffix() string {
-	switch runtime.GOOS {
-	case "windows":
-		return ".bat"
-	case "plan9":
-		return ".rc"
-	default:
-		return ".bash"
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/clean.go b/third_party/gofrontend/libgo/go/cmd/go/clean.go
deleted file mode 100644
index 16054a5..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/clean.go
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"fmt"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"strings"
-)
-
-var cmdClean = &Command{
-	UsageLine: "clean [-i] [-r] [-n] [-x] [build flags] [packages]",
-	Short:     "remove object files",
-	Long: `
-Clean removes object files from package source directories.
-The go command builds most objects in a temporary directory,
-so go clean is mainly concerned with object files left by other
-tools or by manual invocations of go build.
-
-Specifically, clean removes the following files from each of the
-source directories corresponding to the import paths:
-
-	_obj/            old object directory, left from Makefiles
-	_test/           old test directory, left from Makefiles
-	_testmain.go     old gotest file, left from Makefiles
-	test.out         old test log, left from Makefiles
-	build.out        old test log, left from Makefiles
-	*.[568ao]        object files, left from Makefiles
-
-	DIR(.exe)        from go build
-	DIR.test(.exe)   from go test -c
-	MAINFILE(.exe)   from go build MAINFILE.go
-	*.so             from SWIG
-
-In the list, DIR represents the final path element of the
-directory, and MAINFILE is the base name of any Go source
-file in the directory that is not included when building
-the package.
-
-The -i flag causes clean to remove the corresponding installed
-archive or binary (what 'go install' would create).
-
-The -n flag causes clean to print the remove commands it would execute,
-but not run them.
-
-The -r flag causes clean to be applied recursively to all the
-dependencies of the packages named by the import paths.
-
-The -x flag causes clean to print remove commands as it executes them.
-
-For more about build flags, see 'go help build'.
-
-For more about specifying packages, see 'go help packages'.
-	`,
-}
-
-var cleanI bool // clean -i flag
-var cleanR bool // clean -r flag
-
-func init() {
-	// break init cycle
-	cmdClean.Run = runClean
-
-	cmdClean.Flag.BoolVar(&cleanI, "i", false, "")
-	cmdClean.Flag.BoolVar(&cleanR, "r", false, "")
-	// -n and -x are important enough to be
-	// mentioned explicitly in the docs but they
-	// are part of the build flags.
-
-	addBuildFlags(cmdClean)
-}
-
-func runClean(cmd *Command, args []string) {
-	for _, pkg := range packagesAndErrors(args) {
-		clean(pkg)
-	}
-}
-
-var cleaned = map[*Package]bool{}
-
-// TODO: These are dregs left by Makefile-based builds.
-// Eventually, can stop deleting these.
-var cleanDir = map[string]bool{
-	"_test": true,
-	"_obj":  true,
-}
-
-var cleanFile = map[string]bool{
-	"_testmain.go": true,
-	"test.out":     true,
-	"build.out":    true,
-	"a.out":        true,
-}
-
-var cleanExt = map[string]bool{
-	".5":  true,
-	".6":  true,
-	".8":  true,
-	".a":  true,
-	".o":  true,
-	".so": true,
-}
-
-func clean(p *Package) {
-	if cleaned[p] {
-		return
-	}
-	cleaned[p] = true
-
-	if p.Dir == "" {
-		errorf("can't load package: %v", p.Error)
-		return
-	}
-	dirs, err := ioutil.ReadDir(p.Dir)
-	if err != nil {
-		errorf("go clean %s: %v", p.Dir, err)
-		return
-	}
-
-	var b builder
-	b.print = fmt.Print
-
-	packageFile := map[string]bool{}
-	if p.Name != "main" {
-		// Record which files are not in package main.
-		// The others are.
-		keep := func(list []string) {
-			for _, f := range list {
-				packageFile[f] = true
-			}
-		}
-		keep(p.GoFiles)
-		keep(p.CgoFiles)
-		keep(p.TestGoFiles)
-		keep(p.XTestGoFiles)
-	}
-
-	_, elem := filepath.Split(p.Dir)
-	var allRemove []string
-
-	// Remove dir-named executable only if this is package main.
-	if p.Name == "main" {
-		allRemove = append(allRemove,
-			elem,
-			elem+".exe",
-		)
-	}
-
-	// Remove package test executables.
-	allRemove = append(allRemove,
-		elem+".test",
-		elem+".test.exe",
-	)
-
-	// Remove a potential executable for each .go file in the directory that
-	// is not part of the directory's package.
-	for _, dir := range dirs {
-		name := dir.Name()
-		if packageFile[name] {
-			continue
-		}
-		if !dir.IsDir() && strings.HasSuffix(name, ".go") {
-			// TODO(adg,rsc): check that this .go file is actually
-			// in "package main", and therefore capable of building
-			// to an executable file.
-			base := name[:len(name)-len(".go")]
-			allRemove = append(allRemove, base, base+".exe")
-		}
-	}
-
-	if buildN || buildX {
-		b.showcmd(p.Dir, "rm -f %s", strings.Join(allRemove, " "))
-	}
-
-	toRemove := map[string]bool{}
-	for _, name := range allRemove {
-		toRemove[name] = true
-	}
-	for _, dir := range dirs {
-		name := dir.Name()
-		if dir.IsDir() {
-			// TODO: Remove once Makefiles are forgotten.
-			if cleanDir[name] {
-				if buildN || buildX {
-					b.showcmd(p.Dir, "rm -r %s", name)
-					if buildN {
-						continue
-					}
-				}
-				if err := os.RemoveAll(filepath.Join(p.Dir, name)); err != nil {
-					errorf("go clean: %v", err)
-				}
-			}
-			continue
-		}
-
-		if buildN {
-			continue
-		}
-
-		if cleanFile[name] || cleanExt[filepath.Ext(name)] || toRemove[name] {
-			removeFile(filepath.Join(p.Dir, name))
-		}
-	}
-
-	if cleanI && p.target != "" {
-		if buildN || buildX {
-			b.showcmd("", "rm -f %s", p.target)
-		}
-		if !buildN {
-			removeFile(p.target)
-		}
-	}
-
-	if cleanR {
-		for _, p1 := range p.imports {
-			clean(p1)
-		}
-	}
-}
-
-// removeFile tries to remove file f, if error other than file doesn't exist
-// occurs, it will report the error.
-func removeFile(f string) {
-	err := os.Remove(f)
-	if err == nil || os.IsNotExist(err) {
-		return
-	}
-	// Windows does not allow deletion of a binary file while it is executing.
-	if toolIsWindows {
-		// Remove lingering ~ file from last attempt.
-		if _, err2 := os.Stat(f + "~"); err2 == nil {
-			os.Remove(f + "~")
-		}
-		// Try to move it out of the way. If the move fails,
-		// which is likely, we'll try again the
-		// next time we do an install of this binary.
-		if err2 := os.Rename(f, f+"~"); err2 == nil {
-			os.Remove(f + "~")
-			return
-		}
-	}
-	errorf("go clean: %v", err)
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/context.go b/third_party/gofrontend/libgo/go/cmd/go/context.go
deleted file mode 100644
index 68e5182..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/context.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"go/build"
-)
-
-type Context struct {
-	GOARCH        string   `json:",omitempty"` // target architecture
-	GOOS          string   `json:",omitempty"` // target operating system
-	GOROOT        string   `json:",omitempty"` // Go root
-	GOPATH        string   `json:",omitempty"` // Go path
-	CgoEnabled    bool     `json:",omitempty"` // whether cgo can be used
-	UseAllFiles   bool     `json:",omitempty"` // use files regardless of +build lines, file names
-	Compiler      string   `json:",omitempty"` // compiler to assume when computing target paths
-	BuildTags     []string `json:",omitempty"` // build constraints to match in +build lines
-	ReleaseTags   []string `json:",omitempty"` // releases the current release is compatible with
-	InstallSuffix string   `json:",omitempty"` // suffix to use in the name of the install dir
-}
-
-func newContext(c *build.Context) *Context {
-	return &Context{
-		GOARCH:        c.GOARCH,
-		GOOS:          c.GOOS,
-		GOROOT:        c.GOROOT,
-		CgoEnabled:    c.CgoEnabled,
-		UseAllFiles:   c.UseAllFiles,
-		Compiler:      c.Compiler,
-		BuildTags:     c.BuildTags,
-		ReleaseTags:   c.ReleaseTags,
-		InstallSuffix: c.InstallSuffix,
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/discovery.go b/third_party/gofrontend/libgo/go/cmd/go/discovery.go
deleted file mode 100644
index b9f4279..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/discovery.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !cmd_go_bootstrap
-
-// This code is compiled into the real 'go' binary, but it is not
-// compiled into the binary that is built during all.bash, so as
-// to avoid needing to build net (and thus use cgo) during the
-// bootstrap process.
-
-package main
-
-import (
-	"encoding/xml"
-	"fmt"
-	"io"
-	"strings"
-)
-
-// charsetReader returns a reader for the given charset. Currently
-// it only supports UTF-8 and ASCII. Otherwise, it returns a meaningful
-// error which is printed by go get, so the user can find why the package
-// wasn't downloaded if the encoding is not supported. Note that, in
-// order to reduce potential errors, ASCII is treated as UTF-8 (i.e. characters
-// greater than 0x7f are not rejected).
-func charsetReader(charset string, input io.Reader) (io.Reader, error) {
-	switch strings.ToLower(charset) {
-	case "ascii":
-		return input, nil
-	default:
-		return nil, fmt.Errorf("can't decode XML document using charset %q", charset)
-	}
-}
-
-// parseMetaGoImports returns meta imports from the HTML in r.
-// Parsing ends at the end of the <head> section or the beginning of the <body>.
-func parseMetaGoImports(r io.Reader) (imports []metaImport, err error) {
-	d := xml.NewDecoder(r)
-	d.CharsetReader = charsetReader
-	d.Strict = false
-	var t xml.Token
-	for {
-		t, err = d.Token()
-		if err != nil {
-			if err == io.EOF {
-				err = nil
-			}
-			return
-		}
-		if e, ok := t.(xml.StartElement); ok && strings.EqualFold(e.Name.Local, "body") {
-			return
-		}
-		if e, ok := t.(xml.EndElement); ok && strings.EqualFold(e.Name.Local, "head") {
-			return
-		}
-		e, ok := t.(xml.StartElement)
-		if !ok || !strings.EqualFold(e.Name.Local, "meta") {
-			continue
-		}
-		if attrValue(e.Attr, "name") != "go-import" {
-			continue
-		}
-		if f := strings.Fields(attrValue(e.Attr, "content")); len(f) == 3 {
-			imports = append(imports, metaImport{
-				Prefix:   f[0],
-				VCS:      f[1],
-				RepoRoot: f[2],
-			})
-		}
-	}
-}
-
-// attrValue returns the attribute value for the case-insensitive key
-// `name', or the empty string if nothing is found.
-func attrValue(attrs []xml.Attr, name string) string {
-	for _, a := range attrs {
-		if strings.EqualFold(a.Name.Local, name) {
-			return a.Value
-		}
-	}
-	return ""
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/doc.go b/third_party/gofrontend/libgo/go/cmd/go/doc.go
deleted file mode 100644
index 4a07dfe..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/doc.go
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-var cmdDoc = &Command{
-	Run:         runDoc,
-	UsageLine:   "doc [-u] [-c] [package|[package.]symbol[.method]]",
-	CustomFlags: true,
-	Short:       "show documentation for package or symbol",
-	Long: `
-Doc prints the documentation comments associated with the item identified by its
-arguments (a package, const, func, type, var, or method) followed by a one-line
-summary of each of the first-level items "under" that item (package-level
-declarations for a package, methods for a type, etc.).
-
-Doc accepts zero, one, or two arguments.
-
-Given no arguments, that is, when run as
-
-	go doc
-
-it prints the package documentation for the package in the current directory.
-If the package is a command (package main), the exported symbols of the package
-are elided from the presentation unless the -cmd flag is provided.
-
-When run with one argument, the argument is treated as a Go-syntax-like
-representation of the item to be documented. What the argument selects depends
-on what is installed in GOROOT and GOPATH, as well as the form of the argument,
-which is schematically one of these:
-
-	go doc <pkg>
-	go doc <sym>[.<method>]
-	go doc [<pkg>].<sym>[.<method>]
-
-The first item in this list matched by the argument is the one whose
-documentation is printed. (See the examples below.) For packages, the order of
-scanning is determined lexically, but the GOROOT tree is always scanned before
-GOPATH.
-
-If there is no package specified or matched, the package in the current
-directory is selected, so "go doc Foo" shows the documentation for symbol Foo in
-the current package.
-
-The package path must be either a qualified path or a proper suffix of a
-path. The go tool's usual package mechanism does not apply: package path
-elements like . and ... are not implemented by go doc.
-
-When run with two arguments, the first must be a full package path (not just a
-suffix), and the second is a symbol or symbol and method; this is similar to the
-syntax accepted by godoc:
-
-	go doc <pkg> <sym>[.<method>]
-
-In all forms, when matching symbols, lower-case letters in the argument match
-either case but upper-case letters match exactly. This means that there may be
-multiple matches of a lower-case argument in a package if different symbols have
-different cases. If this occurs, documentation for all matches is printed.
-
-Examples:
-	go doc
-		Show documentation for current package.
-	go doc Foo
-		Show documentation for Foo in the current package.
-		(Foo starts with a capital letter so it cannot match
-		a package path.)
-	go doc encoding/json
-		Show documentation for the encoding/json package.
-	go doc json
-		Shorthand for encoding/json.
-	go doc json.Number (or go doc json.number)
-		Show documentation and method summary for json.Number.
-	go doc json.Number.Int64 (or go doc json.number.int64)
-		Show documentation for json.Number's Int64 method.
-	go doc cmd/doc
-		Show package docs for the doc command.
-	go doc -cmd cmd/doc
-		Show package docs and exported symbols within the doc command.
-	go doc template.new
-		Show documentation for html/template's New function.
-		(html/template is lexically before text/template)
-	go doc text/template.new # One argument
-		Show documentation for text/template's New function.
-	go doc text/template new # Two arguments
-		Show documentation for text/template's New function.
-
-Flags:
-	-c
-		Respect case when matching symbols.
-	-cmd
-		Treat a command (package main) like a regular package.
-		Otherwise package main's exported symbols are hidden
-		when showing the package's top-level documentation.
-	-u
-		Show documentation for unexported as well as exported
-		symbols and methods.
-`,
-}
-
-func runDoc(cmd *Command, args []string) {
-	run(buildToolExec, tool("doc"), args)
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/env.go b/third_party/gofrontend/libgo/go/cmd/go/env.go
deleted file mode 100644
index 600acca..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/env.go
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"fmt"
-	"os"
-	"runtime"
-	"strings"
-)
-
-var cmdEnv = &Command{
-	Run:       runEnv,
-	UsageLine: "env [var ...]",
-	Short:     "print Go environment information",
-	Long: `
-Env prints Go environment information.
-
-By default env prints information as a shell script
-(on Windows, a batch file).  If one or more variable
-names is given as arguments,  env prints the value of
-each named variable on its own line.
-	`,
-}
-
-type envVar struct {
-	name, value string
-}
-
-func mkEnv() []envVar {
-	var b builder
-	b.init()
-
-	env := []envVar{
-		{"GOARCH", goarch},
-		{"GOBIN", gobin},
-		{"GOEXE", exeSuffix},
-		{"GOHOSTARCH", runtime.GOARCH},
-		{"GOHOSTOS", runtime.GOOS},
-		{"GOOS", goos},
-		{"GOPATH", os.Getenv("GOPATH")},
-		{"GORACE", os.Getenv("GORACE")},
-		{"GOROOT", goroot},
-		{"GOTOOLDIR", toolDir},
-		{"GO15VENDOREXPERIMENT", os.Getenv("GO15VENDOREXPERIMENT")},
-
-		// disable escape codes in clang errors
-		{"TERM", "dumb"},
-	}
-
-	if goos != "plan9" {
-		cmd := b.gccCmd(".")
-		env = append(env, envVar{"CC", cmd[0]})
-		env = append(env, envVar{"GOGCCFLAGS", strings.Join(cmd[3:], " ")})
-		cmd = b.gxxCmd(".")
-		env = append(env, envVar{"CXX", cmd[0]})
-	}
-
-	if buildContext.CgoEnabled {
-		env = append(env, envVar{"CGO_ENABLED", "1"})
-	} else {
-		env = append(env, envVar{"CGO_ENABLED", "0"})
-	}
-
-	return env
-}
-
-func findEnv(env []envVar, name string) string {
-	for _, e := range env {
-		if e.name == name {
-			return e.value
-		}
-	}
-	return ""
-}
-
-func runEnv(cmd *Command, args []string) {
-	env := mkEnv()
-	if len(args) > 0 {
-		for _, name := range args {
-			fmt.Printf("%s\n", findEnv(env, name))
-		}
-		return
-	}
-
-	for _, e := range env {
-		if e.name != "TERM" {
-			switch runtime.GOOS {
-			default:
-				fmt.Printf("%s=\"%s\"\n", e.name, e.value)
-			case "plan9":
-				if strings.IndexByte(e.value, '\x00') < 0 {
-					fmt.Printf("%s='%s'\n", e.name, strings.Replace(e.value, "'", "''", -1))
-				} else {
-					v := strings.Split(e.value, "\x00")
-					fmt.Printf("%s=(", e.name)
-					for x, s := range v {
-						if x > 0 {
-							fmt.Printf(" ")
-						}
-						fmt.Printf("%s", s)
-					}
-					fmt.Printf(")\n")
-				}
-			case "windows":
-				fmt.Printf("set %s=%s\n", e.name, e.value)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/fix.go b/third_party/gofrontend/libgo/go/cmd/go/fix.go
deleted file mode 100644
index 94fd22e..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/fix.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-var cmdFix = &Command{
-	Run:       runFix,
-	UsageLine: "fix [packages]",
-	Short:     "run go tool fix on packages",
-	Long: `
-Fix runs the Go fix command on the packages named by the import paths.
-
-For more about fix, see 'go doc cmd/fix'.
-For more about specifying packages, see 'go help packages'.
-
-To run fix with specific options, run 'go tool fix'.
-
-See also: go fmt, go vet.
-	`,
-}
-
-func runFix(cmd *Command, args []string) {
-	for _, pkg := range packages(args) {
-		// Use pkg.gofiles instead of pkg.Dir so that
-		// the command only applies to this package,
-		// not to packages in subdirectories.
-		run(stringList(buildToolExec, tool("fix"), relPaths(pkg.allgofiles)))
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/fmt.go b/third_party/gofrontend/libgo/go/cmd/go/fmt.go
deleted file mode 100644
index 57c02ad..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/fmt.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"os"
-	"path/filepath"
-)
-
-func init() {
-	addBuildFlagsNX(cmdFmt)
-}
-
-var cmdFmt = &Command{
-	Run:       runFmt,
-	UsageLine: "fmt [-n] [-x] [packages]",
-	Short:     "run gofmt on package sources",
-	Long: `
-Fmt runs the command 'gofmt -l -w' on the packages named
-by the import paths.  It prints the names of the files that are modified.
-
-For more about gofmt, see 'go doc cmd/gofmt'.
-For more about specifying packages, see 'go help packages'.
-
-The -n flag prints commands that would be executed.
-The -x flag prints commands as they are executed.
-
-To run gofmt with specific options, run gofmt itself.
-
-See also: go fix, go vet.
-	`,
-}
-
-func runFmt(cmd *Command, args []string) {
-	gofmt := gofmtPath()
-	for _, pkg := range packages(args) {
-		// Use pkg.gofiles instead of pkg.Dir so that
-		// the command only applies to this package,
-		// not to packages in subdirectories.
-		run(stringList(gofmt, "-l", "-w", relPaths(pkg.allgofiles)))
-	}
-}
-
-func gofmtPath() string {
-	gofmt := "gofmt"
-	if toolIsWindows {
-		gofmt += toolWindowsExtension
-	}
-
-	gofmtPath := filepath.Join(gobin, gofmt)
-	if _, err := os.Stat(gofmtPath); err == nil {
-		return gofmtPath
-	}
-
-	gofmtPath = filepath.Join(goroot, "bin", gofmt)
-	if _, err := os.Stat(gofmtPath); err == nil {
-		return gofmtPath
-	}
-
-	// fallback to looking for gofmt in $PATH
-	return "gofmt"
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/generate.go b/third_party/gofrontend/libgo/go/cmd/go/generate.go
deleted file mode 100644
index efdc229..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/generate.go
+++ /dev/null
@@ -1,410 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bufio"
-	"bytes"
-	"fmt"
-	"io"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"regexp"
-	"runtime"
-	"strconv"
-	"strings"
-	"unicode"
-)
-
-var cmdGenerate = &Command{
-	Run:       runGenerate,
-	UsageLine: "generate [-run regexp] [file.go... | packages]",
-	Short:     "generate Go files by processing source",
-	Long: `
-Generate runs commands described by directives within existing
-files. Those commands can run any process but the intent is to
-create or update Go source files, for instance by running yacc.
-
-Go generate is never run automatically by go build, go get, go test,
-and so on. It must be run explicitly.
-
-Go generate scans the file for directives, which are lines of
-the form,
-
-	//go:generate command argument...
-
-(note: no leading spaces and no space in "//go") where command
-is the generator to be run, corresponding to an executable file
-that can be run locally. It must either be in the shell path
-(gofmt), a fully qualified path (/usr/you/bin/mytool), or a
-command alias, described below.
-
-Note that go generate does not parse the file, so lines that look
-like directives in comments or multiline strings will be treated
-as directives.
-
-The arguments to the directive are space-separated tokens or
-double-quoted strings passed to the generator as individual
-arguments when it is run.
-
-Quoted strings use Go syntax and are evaluated before execution; a
-quoted string appears as a single argument to the generator.
-
-Go generate sets several variables when it runs the generator:
-
-	$GOARCH
-		The execution architecture (arm, amd64, etc.)
-	$GOOS
-		The execution operating system (linux, windows, etc.)
-	$GOFILE
-		The base name of the file.
-	$GOLINE
-		The line number of the directive in the source file.
-	$GOPACKAGE
-		The name of the package of the file containing the directive.
-	$DOLLAR
-		A dollar sign.
-
-Other than variable substitution and quoted-string evaluation, no
-special processing such as "globbing" is performed on the command
-line.
-
-As a last step before running the command, any invocations of any
-environment variables with alphanumeric names, such as $GOFILE or
-$HOME, are expanded throughout the command line. The syntax for
-variable expansion is $NAME on all operating systems.  Due to the
-order of evaluation, variables are expanded even inside quoted
-strings. If the variable NAME is not set, $NAME expands to the
-empty string.
-
-A directive of the form,
-
-	//go:generate -command xxx args...
-
-specifies, for the remainder of this source file only, that the
-string xxx represents the command identified by the arguments. This
-can be used to create aliases or to handle multiword generators.
-For example,
-
-	//go:generate -command yacc go tool yacc
-
-specifies that the command "yacc" represents the generator
-"go tool yacc".
-
-Generate processes packages in the order given on the command line,
-one at a time. If the command line lists .go files, they are treated
-as a single package. Within a package, generate processes the
-source files in a package in file name order, one at a time. Within
-a source file, generate runs generators in the order they appear
-in the file, one at a time.
-
-If any generator returns an error exit status, "go generate" skips
-all further processing for that package.
-
-The generator is run in the package's source directory.
-
-Go generate accepts one specific flag:
-
-	-run=""
-		if non-empty, specifies a regular expression to select
-		directives whose full original source text (excluding
-		any trailing spaces and final newline) matches the
-		expression.
-
-It also accepts the standard build flags -v, -n, and -x.
-The -v flag prints the names of packages and files as they are
-processed.
-The -n flag prints commands that would be executed.
-The -x flag prints commands as they are executed.
-
-For more about specifying packages, see 'go help packages'.
-	`,
-}
-
-var (
-	generateRunFlag string         // generate -run flag
-	generateRunRE   *regexp.Regexp // compiled expression for -run
-)
-
-func init() {
-	addBuildFlags(cmdGenerate)
-	cmdGenerate.Flag.StringVar(&generateRunFlag, "run", "", "")
-}
-
-func runGenerate(cmd *Command, args []string) {
-	if generateRunFlag != "" {
-		var err error
-		generateRunRE, err = regexp.Compile(generateRunFlag)
-		if err != nil {
-			log.Fatalf("generate: %s", err)
-		}
-	}
-	// Even if the arguments are .go files, this loop suffices.
-	for _, pkg := range packages(args) {
-		for _, file := range pkg.gofiles {
-			if !generate(pkg.Name, file) {
-				break
-			}
-		}
-	}
-}
-
-// generate runs the generation directives for a single file.
-func generate(pkg, absFile string) bool {
-	fd, err := os.Open(absFile)
-	if err != nil {
-		log.Fatalf("generate: %s", err)
-	}
-	defer fd.Close()
-	g := &Generator{
-		r:        fd,
-		path:     absFile,
-		pkg:      pkg,
-		commands: make(map[string][]string),
-	}
-	return g.run()
-}
-
-// A Generator represents the state of a single Go source file
-// being scanned for generator commands.
-type Generator struct {
-	r        io.Reader
-	path     string // full rooted path name.
-	dir      string // full rooted directory of file.
-	file     string // base name of file.
-	pkg      string
-	commands map[string][]string
-	lineNum  int // current line number.
-}
-
-// run runs the generators in the current file.
-func (g *Generator) run() (ok bool) {
-	// Processing below here calls g.errorf on failure, which does panic(stop).
-	// If we encounter an error, we abort the package.
-	defer func() {
-		e := recover()
-		if e != nil {
-			ok = false
-			if e != stop {
-				panic(e)
-			}
-			setExitStatus(1)
-		}
-	}()
-	g.dir, g.file = filepath.Split(g.path)
-	g.dir = filepath.Clean(g.dir) // No final separator please.
-	if buildV {
-		fmt.Fprintf(os.Stderr, "%s\n", shortPath(g.path))
-	}
-
-	// Scan for lines that start "//go:generate".
-	// Can't use bufio.Scanner because it can't handle long lines,
-	// which are likely to appear when using generate.
-	input := bufio.NewReader(g.r)
-	var err error
-	// One line per loop.
-	for {
-		g.lineNum++ // 1-indexed.
-		var buf []byte
-		buf, err = input.ReadSlice('\n')
-		if err == bufio.ErrBufferFull {
-			// Line too long - consume and ignore.
-			if isGoGenerate(buf) {
-				g.errorf("directive too long")
-			}
-			for err == bufio.ErrBufferFull {
-				_, err = input.ReadSlice('\n')
-			}
-			if err != nil {
-				break
-			}
-			continue
-		}
-
-		if err != nil {
-			// Check for marker at EOF without final \n.
-			if err == io.EOF && isGoGenerate(buf) {
-				err = io.ErrUnexpectedEOF
-			}
-			break
-		}
-
-		if !isGoGenerate(buf) {
-			continue
-		}
-		if generateRunFlag != "" {
-			if !generateRunRE.Match(bytes.TrimSpace(buf)) {
-				continue
-			}
-		}
-
-		words := g.split(string(buf))
-		if len(words) == 0 {
-			g.errorf("no arguments to directive")
-		}
-		if words[0] == "-command" {
-			g.setShorthand(words)
-			continue
-		}
-		// Run the command line.
-		if buildN || buildX {
-			fmt.Fprintf(os.Stderr, "%s\n", strings.Join(words, " "))
-		}
-		if buildN {
-			continue
-		}
-		g.exec(words)
-	}
-	if err != nil && err != io.EOF {
-		g.errorf("error reading %s: %s", shortPath(g.path), err)
-	}
-	return true
-}
-
-func isGoGenerate(buf []byte) bool {
-	return bytes.HasPrefix(buf, []byte("//go:generate ")) || bytes.HasPrefix(buf, []byte("//go:generate\t"))
-}
-
-// split breaks the line into words, evaluating quoted
-// strings and evaluating environment variables.
-// The initial //go:generate element is present in line.
-func (g *Generator) split(line string) []string {
-	// Parse line, obeying quoted strings.
-	var words []string
-	line = line[len("//go:generate ") : len(line)-1] // Drop preamble and final newline.
-	// There may still be a carriage return.
-	if len(line) > 0 && line[len(line)-1] == '\r' {
-		line = line[:len(line)-1]
-	}
-	// One (possibly quoted) word per iteration.
-Words:
-	for {
-		line = strings.TrimLeft(line, " \t")
-		if len(line) == 0 {
-			break
-		}
-		if line[0] == '"' {
-			for i := 1; i < len(line); i++ {
-				c := line[i] // Only looking for ASCII so this is OK.
-				switch c {
-				case '\\':
-					if i+1 == len(line) {
-						g.errorf("bad backslash")
-					}
-					i++ // Absorb next byte (If it's a multibyte we'll get an error in Unquote).
-				case '"':
-					word, err := strconv.Unquote(line[0 : i+1])
-					if err != nil {
-						g.errorf("bad quoted string")
-					}
-					words = append(words, word)
-					line = line[i+1:]
-					// Check the next character is space or end of line.
-					if len(line) > 0 && line[0] != ' ' && line[0] != '\t' {
-						g.errorf("expect space after quoted argument")
-					}
-					continue Words
-				}
-			}
-			g.errorf("mismatched quoted string")
-		}
-		i := strings.IndexAny(line, " \t")
-		if i < 0 {
-			i = len(line)
-		}
-		words = append(words, line[0:i])
-		line = line[i:]
-	}
-	// Substitute command if required.
-	if len(words) > 0 && g.commands[words[0]] != nil {
-		// Replace 0th word by command substitution.
-		words = append(g.commands[words[0]], words[1:]...)
-	}
-	// Substitute environment variables.
-	for i, word := range words {
-		words[i] = os.Expand(word, g.expandVar)
-	}
-	return words
-}
-
-var stop = fmt.Errorf("error in generation")
-
-// errorf logs an error message prefixed with the file and line number.
-// It then exits the program (with exit status 1) because generation stops
-// at the first error.
-func (g *Generator) errorf(format string, args ...interface{}) {
-	fmt.Fprintf(os.Stderr, "%s:%d: %s\n", shortPath(g.path), g.lineNum,
-		fmt.Sprintf(format, args...))
-	panic(stop)
-}
-
-// expandVar expands the $XXX invocation in word. It is called
-// by os.Expand.
-func (g *Generator) expandVar(word string) string {
-	switch word {
-	case "GOARCH":
-		return buildContext.GOARCH
-	case "GOOS":
-		return buildContext.GOOS
-	case "GOFILE":
-		return g.file
-	case "GOLINE":
-		return fmt.Sprint(g.lineNum)
-	case "GOPACKAGE":
-		return g.pkg
-	case "DOLLAR":
-		return "$"
-	default:
-		return os.Getenv(word)
-	}
-}
-
-// identLength returns the length of the identifier beginning the string.
-func (g *Generator) identLength(word string) int {
-	for i, r := range word {
-		if r == '_' || unicode.IsLetter(r) || unicode.IsDigit(r) {
-			continue
-		}
-		return i
-	}
-	return len(word)
-}
-
-// setShorthand installs a new shorthand as defined by a -command directive.
-func (g *Generator) setShorthand(words []string) {
-	// Create command shorthand.
-	if len(words) == 1 {
-		g.errorf("no command specified for -command")
-	}
-	command := words[1]
-	if g.commands[command] != nil {
-		g.errorf("command %q defined multiply defined", command)
-	}
-	g.commands[command] = words[2:len(words):len(words)] // force later append to make copy
-}
-
-// exec runs the command specified by the argument. The first word is
-// the command name itself.
-func (g *Generator) exec(words []string) {
-	cmd := exec.Command(words[0], words[1:]...)
-	// Standard in and out of generator should be the usual.
-	cmd.Stdout = os.Stdout
-	cmd.Stderr = os.Stderr
-	// Run the command in the package directory.
-	cmd.Dir = g.dir
-	env := []string{
-		"GOARCH=" + runtime.GOARCH,
-		"GOOS=" + runtime.GOOS,
-		"GOFILE=" + g.file,
-		"GOPACKAGE=" + g.pkg,
-	}
-	cmd.Env = mergeEnvLists(env, origEnv)
-	err := cmd.Run()
-	if err != nil {
-		g.errorf("running %q: %s", words[0], err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/generate_test.go b/third_party/gofrontend/libgo/go/cmd/go/generate_test.go
deleted file mode 100644
index 169d71c..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/generate_test.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"reflect"
-	"runtime"
-	"testing"
-)
-
-type splitTest struct {
-	in  string
-	out []string
-}
-
-var splitTests = []splitTest{
-	{"", nil},
-	{"x", []string{"x"}},
-	{" a b\tc ", []string{"a", "b", "c"}},
-	{` " a " `, []string{" a "}},
-	{"$GOARCH", []string{runtime.GOARCH}},
-	{"$GOOS", []string{runtime.GOOS}},
-	{"$GOFILE", []string{"proc.go"}},
-	{"$GOPACKAGE", []string{"sys"}},
-	{"a $XXNOTDEFINEDXX b", []string{"a", "", "b"}},
-	{"/$XXNOTDEFINED/", []string{"//"}},
-	{"/$DOLLAR/", []string{"/$/"}},
-	{"yacc -o $GOARCH/yacc_$GOFILE", []string{"go", "tool", "yacc", "-o", runtime.GOARCH + "/yacc_proc.go"}},
-}
-
-func TestGenerateCommandParse(t *testing.T) {
-	g := &Generator{
-		r:        nil, // Unused here.
-		path:     "/usr/ken/sys/proc.go",
-		dir:      "/usr/ken/sys",
-		file:     "proc.go",
-		pkg:      "sys",
-		commands: make(map[string][]string),
-	}
-	g.setShorthand([]string{"-command", "yacc", "go", "tool", "yacc"})
-	for _, test := range splitTests {
-		// First with newlines.
-		got := g.split("//go:generate " + test.in + "\n")
-		if !reflect.DeepEqual(got, test.out) {
-			t.Errorf("split(%q): got %q expected %q", test.in, got, test.out)
-		}
-		// Then with CRLFs, thank you Windows.
-		got = g.split("//go:generate " + test.in + "\r\n")
-		if !reflect.DeepEqual(got, test.out) {
-			t.Errorf("split(%q): got %q expected %q", test.in, got, test.out)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/get.go b/third_party/gofrontend/libgo/go/cmd/go/get.go
deleted file mode 100644
index e95201a..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/get.go
+++ /dev/null
@@ -1,535 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"fmt"
-	"go/build"
-	"os"
-	"path/filepath"
-	"regexp"
-	"runtime"
-	"strconv"
-	"strings"
-)
-
-var cmdGet = &Command{
-	UsageLine: "get [-d] [-f] [-fix] [-insecure] [-t] [-u] [build flags] [packages]",
-	Short:     "download and install packages and dependencies",
-	Long: `
-Get downloads and installs the packages named by the import paths,
-along with their dependencies.
-
-The -d flag instructs get to stop after downloading the packages; that is,
-it instructs get not to install the packages.
-
-The -f flag, valid only when -u is set, forces get -u not to verify that
-each package has been checked out from the source control repository
-implied by its import path. This can be useful if the source is a local fork
-of the original.
-
-The -fix flag instructs get to run the fix tool on the downloaded packages
-before resolving dependencies or building the code.
-
-The -insecure flag permits fetching from repositories and resolving
-custom domains using insecure schemes such as HTTP. Use with caution.
-
-The -t flag instructs get to also download the packages required to build
-the tests for the specified packages.
-
-The -u flag instructs get to use the network to update the named packages
-and their dependencies.  By default, get uses the network to check out
-missing packages but does not use it to look for updates to existing packages.
-
-Get also accepts build flags to control the installation. See 'go help build'.
-
-When checking out or updating a package, get looks for a branch or tag
-that matches the locally installed version of Go. The most important
-rule is that if the local installation is running version "go1", get
-searches for a branch or tag named "go1". If no such version exists it
-retrieves the most recent version of the package.
-
-If the vendoring experiment is enabled (see 'go help gopath'),
-then when go get checks out or updates a Git repository,
-it also updates any git submodules referenced by the repository.
-
-For more about specifying packages, see 'go help packages'.
-
-For more about how 'go get' finds source code to
-download, see 'go help importpath'.
-
-See also: go build, go install, go clean.
-	`,
-}
-
-var getD = cmdGet.Flag.Bool("d", false, "")
-var getF = cmdGet.Flag.Bool("f", false, "")
-var getT = cmdGet.Flag.Bool("t", false, "")
-var getU = cmdGet.Flag.Bool("u", false, "")
-var getFix = cmdGet.Flag.Bool("fix", false, "")
-var getInsecure = cmdGet.Flag.Bool("insecure", false, "")
-
-func init() {
-	addBuildFlags(cmdGet)
-	cmdGet.Run = runGet // break init loop
-}
-
-func runGet(cmd *Command, args []string) {
-	if *getF && !*getU {
-		fatalf("go get: cannot use -f flag without -u")
-	}
-
-	// Disable any prompting for passwords by Git.
-	// Only has an effect for 2.3.0 or later, but avoiding
-	// the prompt in earlier versions is just too hard.
-	// See golang.org/issue/9341.
-	os.Setenv("GIT_TERMINAL_PROMPT", "0")
-
-	// Phase 1.  Download/update.
-	var stk importStack
-	mode := 0
-	if *getT {
-		mode |= getTestDeps
-	}
-	for _, arg := range downloadPaths(args) {
-		download(arg, nil, &stk, mode)
-	}
-	exitIfErrors()
-
-	// Phase 2. Rescan packages and re-evaluate args list.
-
-	// Code we downloaded and all code that depends on it
-	// needs to be evicted from the package cache so that
-	// the information will be recomputed.  Instead of keeping
-	// track of the reverse dependency information, evict
-	// everything.
-	for name := range packageCache {
-		delete(packageCache, name)
-	}
-
-	args = importPaths(args)
-	packagesForBuild(args)
-
-	// Phase 3.  Install.
-	if *getD {
-		// Download only.
-		// Check delayed until now so that importPaths
-		// and packagesForBuild have a chance to print errors.
-		return
-	}
-
-	runInstall(cmd, args)
-}
-
-// downloadPaths prepares the list of paths to pass to download.
-// It expands ... patterns that can be expanded.  If there is no match
-// for a particular pattern, downloadPaths leaves it in the result list,
-// in the hope that we can figure out the repository from the
-// initial ...-free prefix.
-func downloadPaths(args []string) []string {
-	args = importPathsNoDotExpansion(args)
-	var out []string
-	for _, a := range args {
-		if strings.Contains(a, "...") {
-			var expand []string
-			// Use matchPackagesInFS to avoid printing
-			// warnings.  They will be printed by the
-			// eventual call to importPaths instead.
-			if build.IsLocalImport(a) {
-				expand = matchPackagesInFS(a)
-			} else {
-				expand = matchPackages(a)
-			}
-			if len(expand) > 0 {
-				out = append(out, expand...)
-				continue
-			}
-		}
-		out = append(out, a)
-	}
-	return out
-}
-
-// downloadCache records the import paths we have already
-// considered during the download, to avoid duplicate work when
-// there is more than one dependency sequence leading to
-// a particular package.
-var downloadCache = map[string]bool{}
-
-// downloadRootCache records the version control repository
-// root directories we have already considered during the download.
-// For example, all the packages in the code.google.com/p/codesearch repo
-// share the same root (the directory for that path), and we only need
-// to run the hg commands to consider each repository once.
-var downloadRootCache = map[string]bool{}
-
-// download runs the download half of the get command
-// for the package named by the argument.
-func download(arg string, parent *Package, stk *importStack, mode int) {
-	load := func(path string, mode int) *Package {
-		if parent == nil {
-			return loadPackage(path, stk)
-		}
-		return loadImport(path, parent.Dir, parent, stk, nil, mode)
-	}
-
-	p := load(arg, mode)
-	if p.Error != nil && p.Error.hard {
-		errorf("%s", p.Error)
-		return
-	}
-
-	// loadPackage inferred the canonical ImportPath from arg.
-	// Use that in the following to prevent hysteresis effects
-	// in e.g. downloadCache and packageCache.
-	// This allows invocations such as:
-	//   mkdir -p $GOPATH/src/github.com/user
-	//   cd $GOPATH/src/github.com/user
-	//   go get ./foo
-	// see: golang.org/issue/9767
-	arg = p.ImportPath
-
-	// There's nothing to do if this is a package in the standard library.
-	if p.Standard {
-		return
-	}
-
-	// Only process each package once.
-	// (Unless we're fetching test dependencies for this package,
-	// in which case we want to process it again.)
-	if downloadCache[arg] && mode&getTestDeps == 0 {
-		return
-	}
-	downloadCache[arg] = true
-
-	pkgs := []*Package{p}
-	wildcardOkay := len(*stk) == 0
-	isWildcard := false
-
-	// Download if the package is missing, or update if we're using -u.
-	if p.Dir == "" || *getU {
-		// The actual download.
-		stk.push(arg)
-		err := downloadPackage(p)
-		if err != nil {
-			errorf("%s", &PackageError{ImportStack: stk.copy(), Err: err.Error()})
-			stk.pop()
-			return
-		}
-
-		// Warn that code.google.com is shutting down.  We
-		// issue the warning here because this is where we
-		// have the import stack.
-		if strings.HasPrefix(p.ImportPath, "code.google.com") {
-			fmt.Fprintf(os.Stderr, "warning: code.google.com is shutting down; import path %v will stop working\n", p.ImportPath)
-			if len(*stk) > 1 {
-				fmt.Fprintf(os.Stderr, "warning: package %v\n", strings.Join(*stk, "\n\timports "))
-			}
-		}
-		stk.pop()
-
-		args := []string{arg}
-		// If the argument has a wildcard in it, re-evaluate the wildcard.
-		// We delay this until after reloadPackage so that the old entry
-		// for p has been replaced in the package cache.
-		if wildcardOkay && strings.Contains(arg, "...") {
-			if build.IsLocalImport(arg) {
-				args = matchPackagesInFS(arg)
-			} else {
-				args = matchPackages(arg)
-			}
-			isWildcard = true
-		}
-
-		// Clear all relevant package cache entries before
-		// doing any new loads.
-		for _, arg := range args {
-			p := packageCache[arg]
-			if p != nil {
-				delete(packageCache, p.Dir)
-				delete(packageCache, p.ImportPath)
-			}
-		}
-
-		pkgs = pkgs[:0]
-		for _, arg := range args {
-			// Note: load calls loadPackage or loadImport,
-			// which push arg onto stk already.
-			// Do not push here too, or else stk will say arg imports arg.
-			p := load(arg, mode)
-			if p.Error != nil {
-				errorf("%s", p.Error)
-				continue
-			}
-			pkgs = append(pkgs, p)
-		}
-	}
-
-	// Process package, which might now be multiple packages
-	// due to wildcard expansion.
-	for _, p := range pkgs {
-		if *getFix {
-			run(buildToolExec, stringList(tool("fix"), relPaths(p.allgofiles)))
-
-			// The imports might have changed, so reload again.
-			p = reloadPackage(arg, stk)
-			if p.Error != nil {
-				errorf("%s", p.Error)
-				return
-			}
-		}
-
-		if isWildcard {
-			// Report both the real package and the
-			// wildcard in any error message.
-			stk.push(p.ImportPath)
-		}
-
-		// Process dependencies, now that we know what they are.
-		for _, path := range p.Imports {
-			if path == "C" {
-				continue
-			}
-			// Don't get test dependencies recursively.
-			// Imports is already vendor-expanded.
-			download(path, p, stk, 0)
-		}
-		if mode&getTestDeps != 0 {
-			// Process test dependencies when -t is specified.
-			// (Don't get test dependencies for test dependencies.)
-			// We pass useVendor here because p.load does not
-			// vendor-expand TestImports and XTestImports.
-			// The call to loadImport inside download needs to do that.
-			for _, path := range p.TestImports {
-				if path == "C" {
-					continue
-				}
-				download(path, p, stk, useVendor)
-			}
-			for _, path := range p.XTestImports {
-				if path == "C" {
-					continue
-				}
-				download(path, p, stk, useVendor)
-			}
-		}
-
-		if isWildcard {
-			stk.pop()
-		}
-	}
-}
-
-// downloadPackage runs the create or download command
-// to make the first copy of or update a copy of the given package.
-func downloadPackage(p *Package) error {
-	var (
-		vcs            *vcsCmd
-		repo, rootPath string
-		err            error
-	)
-
-	security := secure
-	if *getInsecure {
-		security = insecure
-	}
-
-	if p.build.SrcRoot != "" {
-		// Directory exists.  Look for checkout along path to src.
-		vcs, rootPath, err = vcsForDir(p)
-		if err != nil {
-			return err
-		}
-		repo = "<local>" // should be unused; make distinctive
-
-		// Double-check where it came from.
-		if *getU && vcs.remoteRepo != nil {
-			dir := filepath.Join(p.build.SrcRoot, rootPath)
-			remote, err := vcs.remoteRepo(vcs, dir)
-			if err != nil {
-				return err
-			}
-			repo = remote
-			if !*getF {
-				if rr, err := repoRootForImportPath(p.ImportPath, security); err == nil {
-					repo := rr.repo
-					if rr.vcs.resolveRepo != nil {
-						resolved, err := rr.vcs.resolveRepo(rr.vcs, dir, repo)
-						if err == nil {
-							repo = resolved
-						}
-					}
-					if remote != repo && p.ImportComment != "" {
-						return fmt.Errorf("%s is a custom import path for %s, but %s is checked out from %s", rr.root, repo, dir, remote)
-					}
-				}
-			}
-		}
-	} else {
-		// Analyze the import path to determine the version control system,
-		// repository, and the import path for the root of the repository.
-		rr, err := repoRootForImportPath(p.ImportPath, security)
-		if err != nil {
-			return err
-		}
-		vcs, repo, rootPath = rr.vcs, rr.repo, rr.root
-	}
-	if !vcs.isSecure(repo) && !*getInsecure {
-		return fmt.Errorf("cannot download, %v uses insecure protocol", repo)
-	}
-
-	if p.build.SrcRoot == "" {
-		// Package not found.  Put in first directory of $GOPATH.
-		list := filepath.SplitList(buildContext.GOPATH)
-		if len(list) == 0 {
-			return fmt.Errorf("cannot download, $GOPATH not set. For more details see: go help gopath")
-		}
-		// Guard against people setting GOPATH=$GOROOT.
-		if list[0] == goroot {
-			return fmt.Errorf("cannot download, $GOPATH must not be set to $GOROOT. For more details see: go help gopath")
-		}
-		p.build.SrcRoot = filepath.Join(list[0], "src")
-		p.build.PkgRoot = filepath.Join(list[0], "pkg")
-	}
-	root := filepath.Join(p.build.SrcRoot, rootPath)
-	// If we've considered this repository already, don't do it again.
-	if downloadRootCache[root] {
-		return nil
-	}
-	downloadRootCache[root] = true
-
-	if buildV {
-		fmt.Fprintf(os.Stderr, "%s (download)\n", rootPath)
-	}
-
-	// Check that this is an appropriate place for the repo to be checked out.
-	// The target directory must either not exist or have a repo checked out already.
-	meta := filepath.Join(root, "."+vcs.cmd)
-	st, err := os.Stat(meta)
-	if err == nil && !st.IsDir() {
-		return fmt.Errorf("%s exists but is not a directory", meta)
-	}
-	if err != nil {
-		// Metadata directory does not exist.  Prepare to checkout new copy.
-		// Some version control tools require the target directory not to exist.
-		// We require that too, just to avoid stepping on existing work.
-		if _, err := os.Stat(root); err == nil {
-			return fmt.Errorf("%s exists but %s does not - stale checkout?", root, meta)
-		}
-		// Some version control tools require the parent of the target to exist.
-		parent, _ := filepath.Split(root)
-		if err = os.MkdirAll(parent, 0777); err != nil {
-			return err
-		}
-		if err = vcs.create(root, repo); err != nil {
-			return err
-		}
-	} else {
-		// Metadata directory does exist; download incremental updates.
-		if err = vcs.download(root); err != nil {
-			return err
-		}
-	}
-
-	if buildN {
-		// Do not show tag sync in -n; it's noise more than anything,
-		// and since we're not running commands, no tag will be found.
-		// But avoid printing nothing.
-		fmt.Fprintf(os.Stderr, "# cd %s; %s sync/update\n", root, vcs.cmd)
-		return nil
-	}
-
-	// Select and sync to appropriate version of the repository.
-	tags, err := vcs.tags(root)
-	if err != nil {
-		return err
-	}
-	vers := runtime.Version()
-	if i := strings.Index(vers, " "); i >= 0 {
-		vers = vers[:i]
-	}
-	if err := vcs.tagSync(root, selectTag(vers, tags)); err != nil {
-		return err
-	}
-
-	return nil
-}
-
-// goTag matches go release tags such as go1 and go1.2.3.
-// The numbers involved must be small (at most 4 digits),
-// have no unnecessary leading zeros, and the version cannot
-// end in .0 - it is go1, not go1.0 or go1.0.0.
-var goTag = regexp.MustCompile(
-	`^go((0|[1-9][0-9]{0,3})\.)*([1-9][0-9]{0,3})$`,
-)
-
-// selectTag returns the closest matching tag for a given version.
-// Closest means the latest one that is not after the current release.
-// Version "goX" (or "goX.Y" or "goX.Y.Z") matches tags of the same form.
-// Version "release.rN" matches tags of the form "go.rN" (N being a floating-point number).
-// Version "weekly.YYYY-MM-DD" matches tags like "go.weekly.YYYY-MM-DD".
-//
-// NOTE(rsc): Eventually we will need to decide on some logic here.
-// For now, there is only "go1".  This matches the docs in go help get.
-func selectTag(goVersion string, tags []string) (match string) {
-	for _, t := range tags {
-		if t == "go1" {
-			return "go1"
-		}
-	}
-	return ""
-
-	/*
-		if goTag.MatchString(goVersion) {
-			v := goVersion
-			for _, t := range tags {
-				if !goTag.MatchString(t) {
-					continue
-				}
-				if cmpGoVersion(match, t) < 0 && cmpGoVersion(t, v) <= 0 {
-					match = t
-				}
-			}
-		}
-
-		return match
-	*/
-}
-
-// cmpGoVersion returns -1, 0, +1 reporting whether
-// x < y, x == y, or x > y.
-func cmpGoVersion(x, y string) int {
-	// Malformed strings compare less than well-formed strings.
-	if !goTag.MatchString(x) {
-		return -1
-	}
-	if !goTag.MatchString(y) {
-		return +1
-	}
-
-	// Compare numbers in sequence.
-	xx := strings.Split(x[len("go"):], ".")
-	yy := strings.Split(y[len("go"):], ".")
-
-	for i := 0; i < len(xx) && i < len(yy); i++ {
-		// The Atoi are guaranteed to succeed
-		// because the versions match goTag.
-		xi, _ := strconv.Atoi(xx[i])
-		yi, _ := strconv.Atoi(yy[i])
-		if xi < yi {
-			return -1
-		} else if xi > yi {
-			return +1
-		}
-	}
-
-	if len(xx) < len(yy) {
-		return -1
-	}
-	if len(xx) > len(yy) {
-		return +1
-	}
-	return 0
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/go11.go b/third_party/gofrontend/libgo/go/cmd/go/go11.go
deleted file mode 100644
index 8a434df..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/go11.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.1
-
-package main
-
-// Test that go1.1 tag above is included in builds. main.go refers to this definition.
-const go11tag = true
diff --git a/third_party/gofrontend/libgo/go/cmd/go/go_test.go b/third_party/gofrontend/libgo/go/cmd/go/go_test.go
deleted file mode 100644
index 77b2628..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/go_test.go
+++ /dev/null
@@ -1,2389 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main_test
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"go/build"
-	"go/format"
-	"internal/testenv"
-	"io"
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"regexp"
-	"runtime"
-	"strconv"
-	"strings"
-	"testing"
-	"time"
-)
-
-var (
-	canRun  = true  // whether we can run go or ./testgo
-	canRace = false // whether we can run the race detector
-	canCgo  = false // whether we can use cgo
-
-	exeSuffix string // ".exe" on Windows
-
-	builder             = testenv.Builder()
-	skipExternalBuilder = false // skip external tests on this builder
-)
-
-func init() {
-	switch runtime.GOOS {
-	case "android", "nacl":
-		canRun = false
-	case "darwin":
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			canRun = false
-		}
-	}
-
-	if strings.HasPrefix(builder+"-", "freebsd-arm-") {
-		skipExternalBuilder = true
-		canRun = false
-	}
-
-	switch runtime.GOOS {
-	case "windows":
-		exeSuffix = ".exe"
-	}
-}
-
-// The TestMain function creates a go command for testing purposes and
-// deletes it after the tests have been run.
-func TestMain(m *testing.M) {
-	flag.Parse()
-
-	if canRun {
-		out, err := exec.Command("go", "build", "-tags", "testgo", "-o", "testgo"+exeSuffix).CombinedOutput()
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "building testgo failed: %v\n%s", err, out)
-			os.Exit(2)
-		}
-
-		if out, err := exec.Command("./testgo"+exeSuffix, "env", "CGO_ENABLED").Output(); err != nil {
-			fmt.Fprintf(os.Stderr, "running testgo failed: %v\n", err)
-			canRun = false
-		} else {
-			canCgo, err = strconv.ParseBool(strings.TrimSpace(string(out)))
-			if err != nil {
-				fmt.Fprintf(os.Stderr, "can't parse go env CGO_ENABLED output: %v\n", strings.TrimSpace(string(out)))
-			}
-		}
-
-		switch runtime.GOOS {
-		case "linux", "darwin", "freebsd", "windows":
-			canRace = canCgo && runtime.GOARCH == "amd64"
-		}
-
-		measureTick("./testgo" + exeSuffix)
-	}
-
-	// Don't let these environment variables confuse the test.
-	os.Unsetenv("GOBIN")
-	os.Unsetenv("GOPATH")
-
-	r := m.Run()
-
-	if canRun {
-		os.Remove("testgo" + exeSuffix)
-	}
-
-	os.Exit(r)
-}
-
-// The length of an mtime tick on this system.  This is an estimate of
-// how long we need to sleep to ensure that the mtime of two files is
-// different.
-var mtimeTick time.Duration
-
-// measureTick sets mtimeTick by looking at the rounding of the mtime
-// of a file.
-func measureTick(path string) {
-	st, err := os.Stat(path)
-	if err != nil {
-		// Default to one second, the most conservative value.
-		mtimeTick = time.Second
-		return
-	}
-	mtime := st.ModTime()
-	t := time.Microsecond
-	for mtime.Round(t).Equal(mtime) && t < time.Second {
-		t *= 10
-	}
-	mtimeTick = t
-}
-
-// Manage a single run of the testgo binary.
-type testgoData struct {
-	t              *testing.T
-	temps          []string
-	wd             string
-	env            []string
-	tempdir        string
-	ran            bool
-	inParallel     bool
-	stdout, stderr bytes.Buffer
-}
-
-// testgo sets up for a test that runs testgo.
-func testgo(t *testing.T) *testgoData {
-	testenv.MustHaveGoBuild(t)
-
-	if skipExternalBuilder {
-		t.Skip("skipping external tests on %s builder", builder)
-	}
-
-	return &testgoData{t: t}
-}
-
-// must gives a fatal error if err is not nil.
-func (tg *testgoData) must(err error) {
-	if err != nil {
-		tg.t.Fatal(err)
-	}
-}
-
-// check gives a test non-fatal error if err is not nil.
-func (tg *testgoData) check(err error) {
-	if err != nil {
-		tg.t.Error(err)
-	}
-}
-
-// parallel runs the test in parallel by calling t.Parallel.
-func (tg *testgoData) parallel() {
-	if tg.ran {
-		tg.t.Fatal("internal testsuite error: call to parallel after run")
-	}
-	if tg.wd != "" {
-		tg.t.Fatal("internal testsuite error: call to parallel after cd")
-	}
-	for _, e := range tg.env {
-		if strings.HasPrefix(e, "GOROOT=") || strings.HasPrefix(e, "GOPATH=") || strings.HasPrefix(e, "GOBIN=") {
-			val := e[strings.Index(e, "=")+1:]
-			if strings.HasPrefix(val, "testdata") || strings.HasPrefix(val, "./testdata") {
-				tg.t.Fatalf("internal testsuite error: call to parallel with testdata in environment (%s)", e)
-			}
-		}
-	}
-	tg.inParallel = true
-	tg.t.Parallel()
-}
-
-// pwd returns the current directory.
-func (tg *testgoData) pwd() string {
-	wd, err := os.Getwd()
-	if err != nil {
-		tg.t.Fatalf("could not get working directory: %v", err)
-	}
-	return wd
-}
-
-// cd changes the current directory to the named directory.  Note that
-// using this means that the test must not be run in parallel with any
-// other tests.
-func (tg *testgoData) cd(dir string) {
-	if tg.inParallel {
-		tg.t.Fatal("internal testsuite error: changing directory when running in parallel")
-	}
-	if tg.wd == "" {
-		tg.wd = tg.pwd()
-	}
-	abs, err := filepath.Abs(dir)
-	tg.must(os.Chdir(dir))
-	if err == nil {
-		tg.setenv("PWD", abs)
-	}
-}
-
-// sleep sleeps for one tick, where a tick is a conservative estimate
-// of how long it takes for a file modification to get a different
-// mtime.
-func (tg *testgoData) sleep() {
-	time.Sleep(mtimeTick)
-}
-
-// setenv sets an environment variable to use when running the test go
-// command.
-func (tg *testgoData) setenv(name, val string) {
-	if tg.inParallel && (name == "GOROOT" || name == "GOPATH" || name == "GOBIN") && (strings.HasPrefix(val, "testdata") || strings.HasPrefix(val, "./testdata")) {
-		tg.t.Fatalf("internal testsuite error: call to setenv with testdata (%s=%s) after parallel", name, val)
-	}
-	tg.unsetenv(name)
-	tg.env = append(tg.env, name+"="+val)
-}
-
-// unsetenv removes an environment variable.
-func (tg *testgoData) unsetenv(name string) {
-	if tg.env == nil {
-		tg.env = append([]string(nil), os.Environ()...)
-	}
-	for i, v := range tg.env {
-		if strings.HasPrefix(v, name+"=") {
-			tg.env = append(tg.env[:i], tg.env[i+1:]...)
-			break
-		}
-	}
-}
-
-// doRun runs the test go command, recording stdout and stderr and
-// returning exit status.
-func (tg *testgoData) doRun(args []string) error {
-	if !canRun {
-		panic("testgoData.doRun called but canRun false")
-	}
-	if tg.inParallel {
-		for _, arg := range args {
-			if strings.HasPrefix(arg, "testdata") || strings.HasPrefix(arg, "./testdata") {
-				tg.t.Fatal("internal testsuite error: parallel run using testdata")
-			}
-		}
-	}
-	tg.t.Logf("running testgo %v", args)
-	var prog string
-	if tg.wd == "" {
-		prog = "./testgo" + exeSuffix
-	} else {
-		prog = filepath.Join(tg.wd, "testgo"+exeSuffix)
-	}
-	cmd := exec.Command(prog, args...)
-	tg.stdout.Reset()
-	tg.stderr.Reset()
-	cmd.Stdout = &tg.stdout
-	cmd.Stderr = &tg.stderr
-	cmd.Env = tg.env
-	status := cmd.Run()
-	if tg.stdout.Len() > 0 {
-		tg.t.Log("standard output:")
-		tg.t.Log(tg.stdout.String())
-	}
-	if tg.stderr.Len() > 0 {
-		tg.t.Log("standard error:")
-		tg.t.Log(tg.stderr.String())
-	}
-	tg.ran = true
-	return status
-}
-
-// run runs the test go command, and expects it to succeed.
-func (tg *testgoData) run(args ...string) {
-	if status := tg.doRun(args); status != nil {
-		tg.t.Logf("go %v failed unexpectedly: %v", args, status)
-		tg.t.FailNow()
-	}
-}
-
-// runFail runs the test go command, and expects it to fail.
-func (tg *testgoData) runFail(args ...string) {
-	if status := tg.doRun(args); status == nil {
-		tg.t.Fatal("testgo succeeded unexpectedly")
-	} else {
-		tg.t.Log("testgo failed as expected:", status)
-	}
-}
-
-// runGit runs a git command, and expects it to succeed.
-func (tg *testgoData) runGit(dir string, args ...string) {
-	cmd := exec.Command("git", args...)
-	tg.stdout.Reset()
-	tg.stderr.Reset()
-	cmd.Stdout = &tg.stdout
-	cmd.Stderr = &tg.stderr
-	cmd.Dir = dir
-	cmd.Env = tg.env
-	status := cmd.Run()
-	if tg.stdout.Len() > 0 {
-		tg.t.Log("git standard output:")
-		tg.t.Log(tg.stdout.String())
-	}
-	if tg.stderr.Len() > 0 {
-		tg.t.Log("git standard error:")
-		tg.t.Log(tg.stderr.String())
-	}
-	if status != nil {
-		tg.t.Logf("git %v failed unexpectedly: %v", args, status)
-		tg.t.FailNow()
-	}
-}
-
-// getStdout returns standard output of the testgo run as a string.
-func (tg *testgoData) getStdout() string {
-	if !tg.ran {
-		tg.t.Fatal("internal testsuite error: stdout called before run")
-	}
-	return tg.stdout.String()
-}
-
-// getStderr returns standard error of the testgo run as a string.
-func (tg *testgoData) getStderr() string {
-	if !tg.ran {
-		tg.t.Fatal("internal testsuite error: stdout called before run")
-	}
-	return tg.stderr.String()
-}
-
-// doGrepMatch looks for a regular expression in a buffer, and returns
-// whether it is found.  The regular expression is matched against
-// each line separately, as with the grep command.
-func (tg *testgoData) doGrepMatch(match string, b *bytes.Buffer) bool {
-	if !tg.ran {
-		tg.t.Fatal("internal testsuite error: grep called before run")
-	}
-	re := regexp.MustCompile(match)
-	for _, ln := range bytes.Split(b.Bytes(), []byte{'\n'}) {
-		if re.Match(ln) {
-			return true
-		}
-	}
-	return false
-}
-
-// doGrep looks for a regular expression in a buffer and fails if it
-// is not found.  The name argument is the name of the output we are
-// searching, "output" or "error".  The msg argument is logged on
-// failure.
-func (tg *testgoData) doGrep(match string, b *bytes.Buffer, name, msg string) {
-	if !tg.doGrepMatch(match, b) {
-		tg.t.Log(msg)
-		tg.t.Logf("pattern %v not found in standard %s", match, name)
-		tg.t.FailNow()
-	}
-}
-
-// grepStdout looks for a regular expression in the test run's
-// standard output and fails, logging msg, if it is not found.
-func (tg *testgoData) grepStdout(match, msg string) {
-	tg.doGrep(match, &tg.stdout, "output", msg)
-}
-
-// grepStderr looks for a regular expression in the test run's
-// standard error and fails, logging msg, if it is not found.
-func (tg *testgoData) grepStderr(match, msg string) {
-	tg.doGrep(match, &tg.stderr, "error", msg)
-}
-
-// grepBoth looks for a regular expression in the test run's standard
-// output or stand error and fails, logging msg, if it is not found.
-func (tg *testgoData) grepBoth(match, msg string) {
-	if !tg.doGrepMatch(match, &tg.stdout) && !tg.doGrepMatch(match, &tg.stderr) {
-		tg.t.Log(msg)
-		tg.t.Logf("pattern %v not found in standard output or standard error", match)
-		tg.t.FailNow()
-	}
-}
-
-// doGrepNot looks for a regular expression in a buffer and fails if
-// it is found.  The name and msg arguments are as for doGrep.
-func (tg *testgoData) doGrepNot(match string, b *bytes.Buffer, name, msg string) {
-	if tg.doGrepMatch(match, b) {
-		tg.t.Log(msg)
-		tg.t.Logf("pattern %v found unexpectedly in standard %s", match, name)
-		tg.t.FailNow()
-	}
-}
-
-// grepStdoutNot looks for a regular expression in the test run's
-// standard output and fails, logging msg, if it is found.
-func (tg *testgoData) grepStdoutNot(match, msg string) {
-	tg.doGrepNot(match, &tg.stdout, "output", msg)
-}
-
-// grepStderrNot looks for a regular expression in the test run's
-// standard error and fails, logging msg, if it is found.
-func (tg *testgoData) grepStderrNot(match, msg string) {
-	tg.doGrepNot(match, &tg.stderr, "error", msg)
-}
-
-// grepBothNot looks for a regular expression in the test run's
-// standard output or stand error and fails, logging msg, if it is
-// found.
-func (tg *testgoData) grepBothNot(match, msg string) {
-	if tg.doGrepMatch(match, &tg.stdout) || tg.doGrepMatch(match, &tg.stderr) {
-		tg.t.Log(msg)
-		tg.t.Fatalf("pattern %v found unexpectedly in standard output or standard error", match)
-	}
-}
-
-// doGrepCount counts the number of times a regexp is seen in a buffer.
-func (tg *testgoData) doGrepCount(match string, b *bytes.Buffer) int {
-	if !tg.ran {
-		tg.t.Fatal("internal testsuite error: doGrepCount called before run")
-	}
-	re := regexp.MustCompile(match)
-	c := 0
-	for _, ln := range bytes.Split(b.Bytes(), []byte{'\n'}) {
-		if re.Match(ln) {
-			c++
-		}
-	}
-	return c
-}
-
-// grepCountStdout returns the number of times a regexp is seen in
-// standard output.
-func (tg *testgoData) grepCountStdout(match string) int {
-	return tg.doGrepCount(match, &tg.stdout)
-}
-
-// grepCountStderr returns the number of times a regexp is seen in
-// standard error.
-func (tg *testgoData) grepCountStderr(match string) int {
-	return tg.doGrepCount(match, &tg.stderr)
-}
-
-// grepCountBoth returns the number of times a regexp is seen in both
-// standard output and standard error.
-func (tg *testgoData) grepCountBoth(match string) int {
-	return tg.doGrepCount(match, &tg.stdout) + tg.doGrepCount(match, &tg.stderr)
-}
-
-// creatingTemp records that the test plans to create a temporary file
-// or directory.  If the file or directory exists already, it will be
-// removed.  When the test completes, the file or directory will be
-// removed if it exists.
-func (tg *testgoData) creatingTemp(path string) {
-	if filepath.IsAbs(path) && !strings.HasPrefix(path, tg.tempdir) {
-		tg.t.Fatal("internal testsuite error: creatingTemp(%q) with absolute path not in temporary directory", path)
-	}
-	// If we have changed the working directory, make sure we have
-	// an absolute path, because we are going to change directory
-	// back before we remove the temporary.
-	if tg.wd != "" && !filepath.IsAbs(path) {
-		path = filepath.Join(tg.pwd(), path)
-	}
-	tg.must(os.RemoveAll(path))
-	tg.temps = append(tg.temps, path)
-}
-
-// makeTempdir makes a temporary directory for a run of testgo.  If
-// the temporary directory was already created, this does nothing.
-func (tg *testgoData) makeTempdir() {
-	if tg.tempdir == "" {
-		var err error
-		tg.tempdir, err = ioutil.TempDir("", "gotest")
-		tg.must(err)
-	}
-}
-
-// tempFile adds a temporary file for a run of testgo.
-func (tg *testgoData) tempFile(path, contents string) {
-	tg.makeTempdir()
-	tg.must(os.MkdirAll(filepath.Join(tg.tempdir, filepath.Dir(path)), 0755))
-	bytes := []byte(contents)
-	if strings.HasSuffix(path, ".go") {
-		formatted, err := format.Source(bytes)
-		if err == nil {
-			bytes = formatted
-		}
-	}
-	tg.must(ioutil.WriteFile(filepath.Join(tg.tempdir, path), bytes, 0644))
-}
-
-// tempDir adds a temporary directory for a run of testgo.
-func (tg *testgoData) tempDir(path string) {
-	tg.makeTempdir()
-	if err := os.MkdirAll(filepath.Join(tg.tempdir, path), 0755); err != nil && !os.IsExist(err) {
-		tg.t.Fatal(err)
-	}
-}
-
-// path returns the absolute pathname to file with the temporary
-// directory.
-func (tg *testgoData) path(name string) string {
-	if tg.tempdir == "" {
-		tg.t.Fatalf("internal testsuite error: path(%q) with no tempdir", name)
-	}
-	if name == "." {
-		return tg.tempdir
-	}
-	return filepath.Join(tg.tempdir, name)
-}
-
-// mustNotExist fails if path exists.
-func (tg *testgoData) mustNotExist(path string) {
-	if _, err := os.Stat(path); err == nil || !os.IsNotExist(err) {
-		tg.t.Fatalf("%s exists but should not (%v)", path, err)
-	}
-}
-
-// wantExecutable fails with msg if path is not executable.
-func (tg *testgoData) wantExecutable(path, msg string) {
-	if st, err := os.Stat(path); err != nil {
-		if !os.IsNotExist(err) {
-			tg.t.Log(err)
-		}
-		tg.t.Fatal(msg)
-	} else {
-		if runtime.GOOS != "windows" && st.Mode()&0111 == 0 {
-			tg.t.Fatalf("binary %s exists but is not executable", path)
-		}
-	}
-}
-
-// wantArchive fails if path is not an archive.
-func (tg *testgoData) wantArchive(path string) {
-	f, err := os.Open(path)
-	if err != nil {
-		tg.t.Fatal(err)
-	}
-	buf := make([]byte, 100)
-	io.ReadFull(f, buf)
-	f.Close()
-	if !bytes.HasPrefix(buf, []byte("!<arch>\n")) {
-		tg.t.Fatalf("file %s exists but is not an archive", path)
-	}
-}
-
-// isStale returns whether pkg is stale.
-func (tg *testgoData) isStale(pkg string) bool {
-	tg.run("list", "-f", "{{.Stale}}", pkg)
-	switch v := strings.TrimSpace(tg.getStdout()); v {
-	case "true":
-		return true
-	case "false":
-		return false
-	default:
-		tg.t.Fatalf("unexpected output checking staleness of package %v: %v", pkg, v)
-		panic("unreachable")
-	}
-}
-
-// wantStale fails with msg if pkg is not stale.
-func (tg *testgoData) wantStale(pkg, msg string) {
-	if !tg.isStale(pkg) {
-		tg.t.Fatal(msg)
-	}
-}
-
-// wantNotStale fails with msg if pkg is stale.
-func (tg *testgoData) wantNotStale(pkg, msg string) {
-	if tg.isStale(pkg) {
-		tg.t.Fatal(msg)
-	}
-}
-
-// cleanup cleans up a test that runs testgo.
-func (tg *testgoData) cleanup() {
-	if tg.wd != "" {
-		if err := os.Chdir(tg.wd); err != nil {
-			// We are unlikely to be able to continue.
-			fmt.Fprintln(os.Stderr, "could not restore working directory, crashing:", err)
-			os.Exit(2)
-		}
-	}
-	for _, path := range tg.temps {
-		tg.check(os.RemoveAll(path))
-	}
-	if tg.tempdir != "" {
-		tg.check(os.RemoveAll(tg.tempdir))
-	}
-}
-
-// resetReadOnlyFlagAll resets windows read-only flag
-// set on path and any children it contains.
-// The flag is set by git and has to be removed.
-// os.Remove refuses to remove files with read-only flag set.
-func (tg *testgoData) resetReadOnlyFlagAll(path string) {
-	fi, err := os.Stat(path)
-	if err != nil {
-		tg.t.Fatalf("resetReadOnlyFlagAll(%q) failed: %v", path, err)
-	}
-	if !fi.IsDir() {
-		err := os.Chmod(path, 0666)
-		if err != nil {
-			tg.t.Fatalf("resetReadOnlyFlagAll(%q) failed: %v", path, err)
-		}
-	}
-	fd, err := os.Open(path)
-	if err != nil {
-		tg.t.Fatalf("resetReadOnlyFlagAll(%q) failed: %v", path, err)
-	}
-	defer fd.Close()
-	names, _ := fd.Readdirnames(-1)
-	for _, name := range names {
-		tg.resetReadOnlyFlagAll(path + string(filepath.Separator) + name)
-	}
-}
-
-// failSSH puts an ssh executable in the PATH that always fails.
-// This is to stub out uses of ssh by go get.
-func (tg *testgoData) failSSH() {
-	wd, err := os.Getwd()
-	if err != nil {
-		tg.t.Fatal(err)
-	}
-	fail := filepath.Join(wd, "testdata/failssh")
-	tg.setenv("PATH", fmt.Sprintf("%v%c%v", fail, filepath.ListSeparator, os.Getenv("PATH")))
-}
-
-func TestFileLineInErrorMessages(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempFile("err.go", `package main; import "bar"`)
-	path := tg.path("err.go")
-	tg.runFail("run", path)
-	shortPath := path
-	if rel, err := filepath.Rel(tg.pwd(), path); err == nil && len(rel) < len(path) {
-		shortPath = rel
-	}
-	tg.grepStderr("^"+regexp.QuoteMeta(shortPath)+":", "missing file:line in error message")
-}
-
-func TestProgramNameInCrashMessages(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempFile("triv.go", `package main; func main() {}`)
-	tg.runFail("build", "-ldflags", "-crash_for_testing", tg.path("triv.go"))
-	tg.grepStderr(`[/\\]tool[/\\].*[/\\]link`, "missing linker name in error message")
-}
-
-func TestBrokenTestsWithoutTestFunctionsAllFail(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.runFail("test", "./testdata/src/badtest/...")
-	tg.grepBothNot("^ok", "test passed unexpectedly")
-	tg.grepBoth("FAIL.*badtest/badexec", "test did not run everything")
-	tg.grepBoth("FAIL.*badtest/badsyntax", "test did not run everything")
-	tg.grepBoth("FAIL.*badtest/badvar", "test did not run everything")
-}
-
-func TestGoBuildDashAInDevBranch(t *testing.T) {
-	if testing.Short() {
-		t.Skip("don't rebuild the standard library in short mode")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("install", "math") // should be up to date already but just in case
-	tg.setenv("TESTGO_IS_GO_RELEASE", "0")
-	tg.run("build", "-v", "-a", "math")
-	tg.grepStderr("runtime", "testgo build -a math in dev branch DID NOT build runtime, but should have")
-}
-
-func TestGoBuilDashAInReleaseBranch(t *testing.T) {
-	if testing.Short() {
-		t.Skip("don't rebuild the standard library in short mode")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("install", "math") // should be up to date already but just in case
-	tg.setenv("TESTGO_IS_GO_RELEASE", "1")
-	tg.run("build", "-v", "-a", "math")
-	tg.grepStderr("runtime", "testgo build -a math in dev branch did not build runtime, but should have")
-}
-
-func TestGoInstallCleansUpAfterGoBuild(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.tempFile("src/mycmd/main.go", `package main; func main(){}`)
-	tg.setenv("GOPATH", tg.path("."))
-	tg.cd(tg.path("src/mycmd"))
-
-	doesNotExist := func(file, msg string) {
-		if _, err := os.Stat(file); err == nil {
-			t.Fatal(msg)
-		} else if !os.IsNotExist(err) {
-			t.Fatal(msg, "error:", err)
-		}
-	}
-
-	tg.run("build")
-	tg.wantExecutable("mycmd"+exeSuffix, "testgo build did not write command binary")
-	tg.run("install")
-	doesNotExist("mycmd"+exeSuffix, "testgo install did not remove command binary")
-	tg.run("build")
-	tg.wantExecutable("mycmd"+exeSuffix, "testgo build did not write command binary (second time)")
-	// Running install with arguments does not remove the target,
-	// even in the same directory.
-	tg.run("install", "mycmd")
-	tg.wantExecutable("mycmd"+exeSuffix, "testgo install mycmd removed command binary when run in mycmd")
-	tg.run("build")
-	tg.wantExecutable("mycmd"+exeSuffix, "testgo build did not write command binary (third time)")
-	// And especially not outside the directory.
-	tg.cd(tg.path("."))
-	if data, err := ioutil.ReadFile("src/mycmd/mycmd" + exeSuffix); err != nil {
-		t.Fatal("could not read file:", err)
-	} else {
-		if err := ioutil.WriteFile("mycmd"+exeSuffix, data, 0555); err != nil {
-			t.Fatal("could not write file:", err)
-		}
-	}
-	tg.run("install", "mycmd")
-	tg.wantExecutable("src/mycmd/mycmd"+exeSuffix, "testgo install mycmd removed command binary from its source dir when run outside mycmd")
-	tg.wantExecutable("mycmd"+exeSuffix, "testgo install mycmd removed command binary from current dir when run outside mycmd")
-}
-
-func TestGoInstallRebuildsStalePackagesInOtherGOPATH(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempFile("d1/src/p1/p1.go", `package p1
-		import "p2"
-		func F() { p2.F() }`)
-	tg.tempFile("d2/src/p2/p2.go", `package p2
-		func F() {}`)
-	sep := string(filepath.ListSeparator)
-	tg.setenv("GOPATH", tg.path("d1")+sep+tg.path("d2"))
-	tg.run("install", "p1")
-	tg.wantNotStale("p1", "./testgo list mypkg claims p1 is stale, incorrectly")
-	tg.wantNotStale("p2", "./testgo list mypkg claims p2 is stale, incorrectly")
-	tg.sleep()
-	if f, err := os.OpenFile(tg.path("d2/src/p2/p2.go"), os.O_WRONLY|os.O_APPEND, 0); err != nil {
-		t.Fatal(err)
-	} else if _, err = f.WriteString(`func G() {}`); err != nil {
-		t.Fatal(err)
-	} else {
-		tg.must(f.Close())
-	}
-	tg.wantStale("p2", "./testgo list mypkg claims p2 is NOT stale, incorrectly")
-	tg.wantStale("p1", "./testgo list mypkg claims p1 is NOT stale, incorrectly")
-
-	tg.run("install", "p1")
-	tg.wantNotStale("p2", "./testgo list mypkg claims p2 is stale after reinstall, incorrectly")
-	tg.wantNotStale("p1", "./testgo list mypkg claims p1 is stale after reinstall, incorrectly")
-}
-
-func TestGoInstallDetectsRemovedFiles(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempFile("src/mypkg/x.go", `package mypkg`)
-	tg.tempFile("src/mypkg/y.go", `package mypkg`)
-	tg.tempFile("src/mypkg/z.go", `// +build missingtag
-
-		package mypkg`)
-	tg.setenv("GOPATH", tg.path("."))
-	tg.run("install", "mypkg")
-	tg.wantNotStale("mypkg", "./testgo list mypkg claims mypkg is stale, incorrectly")
-	// z.go was not part of the build; removing it is okay.
-	tg.must(os.Remove(tg.path("src/mypkg/z.go")))
-	tg.wantNotStale("mypkg", "./testgo list mypkg claims mypkg is stale after removing z.go; should not be stale")
-	// y.go was part of the package; removing it should be detected.
-	tg.must(os.Remove(tg.path("src/mypkg/y.go")))
-	tg.wantStale("mypkg", "./testgo list mypkg claims mypkg is NOT stale after removing y.go; should be stale")
-}
-
-func TestGoInstallErrorOnCrossCompileToBin(t *testing.T) {
-	if testing.Short() {
-		t.Skip("don't install into GOROOT in short mode")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.tempFile("src/mycmd/x.go", `package main
-		func main() {}`)
-	tg.setenv("GOPATH", tg.path("."))
-	tg.cd(tg.path("src/mycmd"))
-
-	tg.run("build", "mycmd")
-
-	goarch := "386"
-	if runtime.GOARCH == "386" {
-		goarch = "amd64"
-	}
-	tg.setenv("GOOS", "linux")
-	tg.setenv("GOARCH", goarch)
-	tg.run("install", "mycmd")
-	tg.setenv("GOBIN", tg.path("."))
-	tg.runFail("install", "mycmd")
-	tg.run("install", "cmd/pack")
-}
-
-func TestGoInstallDetectsRemovedFilesInPackageMain(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempFile("src/mycmd/x.go", `package main
-		func main() {}`)
-	tg.tempFile("src/mycmd/y.go", `package main`)
-	tg.tempFile("src/mycmd/z.go", `// +build missingtag
-
-		package main`)
-	tg.setenv("GOPATH", tg.path("."))
-	tg.run("install", "mycmd")
-	tg.wantNotStale("mycmd", "./testgo list mypkg claims mycmd is stale, incorrectly")
-	// z.go was not part of the build; removing it is okay.
-	tg.must(os.Remove(tg.path("src/mycmd/z.go")))
-	tg.wantNotStale("mycmd", "./testgo list mycmd claims mycmd is stale after removing z.go; should not be stale")
-	// y.go was part of the package; removing it should be detected.
-	tg.must(os.Remove(tg.path("src/mycmd/y.go")))
-	tg.wantStale("mycmd", "./testgo list mycmd claims mycmd is NOT stale after removing y.go; should be stale")
-}
-
-func testLocalRun(tg *testgoData, exepath, local, match string) {
-	out, err := exec.Command(exepath).Output()
-	if err != nil {
-		tg.t.Fatalf("error running %v: %v", exepath, err)
-	}
-	if !regexp.MustCompile(match).Match(out) {
-		tg.t.Log(string(out))
-		tg.t.Errorf("testdata/%s/easy.go did not generate expected output", local)
-	}
-}
-
-func testLocalEasy(tg *testgoData, local string) {
-	exepath := "./easy" + exeSuffix
-	tg.creatingTemp(exepath)
-	tg.run("build", "-o", exepath, filepath.Join("testdata", local, "easy.go"))
-	testLocalRun(tg, exepath, local, `(?m)^easysub\.Hello`)
-}
-
-func testLocalEasySub(tg *testgoData, local string) {
-	exepath := "./easysub" + exeSuffix
-	tg.creatingTemp(exepath)
-	tg.run("build", "-o", exepath, filepath.Join("testdata", local, "easysub", "main.go"))
-	testLocalRun(tg, exepath, local, `(?m)^easysub\.Hello`)
-}
-
-func testLocalHard(tg *testgoData, local string) {
-	exepath := "./hard" + exeSuffix
-	tg.creatingTemp(exepath)
-	tg.run("build", "-o", exepath, filepath.Join("testdata", local, "hard.go"))
-	testLocalRun(tg, exepath, local, `(?m)^sub\.Hello`)
-}
-
-func testLocalInstall(tg *testgoData, local string) {
-	tg.runFail("install", filepath.Join("testdata", local, "easy.go"))
-}
-
-func TestLocalImportsEasy(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	testLocalEasy(tg, "local")
-}
-
-func TestLocalImportsEasySub(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	testLocalEasySub(tg, "local")
-}
-
-func TestLocalImportsHard(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	testLocalHard(tg, "local")
-}
-
-func TestLocalImportsGoInstallShouldFail(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	testLocalInstall(tg, "local")
-}
-
-const badDirName = `#$%:, &()*;<=>?\^{}`
-
-func copyBad(tg *testgoData) {
-	if runtime.GOOS == "windows" {
-		tg.t.Skipf("skipping test because %q is an invalid directory name", badDirName)
-	}
-
-	tg.must(filepath.Walk("testdata/local",
-		func(path string, info os.FileInfo, err error) error {
-			if err != nil {
-				return err
-			}
-			if info.IsDir() {
-				return nil
-			}
-			var data []byte
-			data, err = ioutil.ReadFile(path)
-			if err != nil {
-				return err
-			}
-			newpath := strings.Replace(path, "local", badDirName, 1)
-			tg.tempFile(newpath, string(data))
-			return nil
-		}))
-	tg.cd(tg.path("."))
-}
-
-func TestBadImportsEasy(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	copyBad(tg)
-	testLocalEasy(tg, badDirName)
-}
-
-func TestBadImportsEasySub(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	copyBad(tg)
-	testLocalEasySub(tg, badDirName)
-}
-
-func TestBadImportsHard(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	copyBad(tg)
-	testLocalHard(tg, badDirName)
-}
-
-func TestBadImportsGoInstallShouldFail(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	copyBad(tg)
-	testLocalInstall(tg, badDirName)
-}
-
-func TestInternalPackagesInGOROOTAreRespected(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.runFail("build", "-v", "./testdata/testinternal")
-	tg.grepBoth("use of internal package not allowed", "wrong error message for testdata/testinternal")
-}
-
-func TestInternalPackagesOutsideGOROOTAreRespected(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.runFail("build", "-v", "./testdata/testinternal2")
-	tg.grepBoth("use of internal package not allowed", "wrote error message for testdata/testinternal2")
-}
-
-func testMove(t *testing.T, vcs, url, base, config string) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempDir("src")
-	tg.setenv("GOPATH", tg.path("."))
-	tg.run("get", "-d", url)
-	tg.run("get", "-d", "-u", url)
-	switch vcs {
-	case "svn":
-		// SVN doesn't believe in text files so we can't just edit the config.
-		// Check out a different repo into the wrong place.
-		tg.must(os.RemoveAll(tg.path("src/code.google.com/p/rsc-svn")))
-		tg.run("get", "-d", "-u", "code.google.com/p/rsc-svn2/trunk")
-		tg.must(os.Rename(tg.path("src/code.google.com/p/rsc-svn2"), tg.path("src/code.google.com/p/rsc-svn")))
-	default:
-		path := tg.path(filepath.Join("src", config))
-		data, err := ioutil.ReadFile(path)
-		tg.must(err)
-		data = bytes.Replace(data, []byte(base), []byte(base+"XXX"), -1)
-		tg.must(ioutil.WriteFile(path, data, 0644))
-	}
-	if vcs == "git" {
-		// git will ask for a username and password when we
-		// run go get -d -f -u.  An empty username and
-		// password will work.  Prevent asking by setting
-		// GIT_ASKPASS.
-		tg.creatingTemp("sink" + exeSuffix)
-		tg.tempFile("src/sink/sink.go", `package main; func main() {}`)
-		tg.run("build", "-o", "sink"+exeSuffix, "sink")
-		tg.setenv("GIT_ASKPASS", filepath.Join(tg.pwd(), "sink"+exeSuffix))
-	}
-	tg.runFail("get", "-d", "-u", url)
-	tg.grepStderr("is a custom import path for", "go get -d -u "+url+" failed for wrong reason")
-	tg.runFail("get", "-d", "-f", "-u", url)
-	tg.grepStderr("validating server certificate|not found", "go get -d -f -u "+url+" failed for wrong reason")
-}
-
-func TestInternalPackageErrorsAreHandled(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("list", "./testdata/testinternal3")
-}
-
-func TestInternalCache(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata/testinternal4"))
-	tg.runFail("build", "p")
-	tg.grepStderr("internal", "did not fail to build p")
-}
-
-func TestMoveGit(t *testing.T) {
-	testMove(t, "git", "rsc.io/pdf", "pdf", "rsc.io/pdf/.git/config")
-}
-
-// TODO(rsc): Set up a test case on bitbucket for hg.
-// func TestMoveHG(t *testing.T) {
-// 	testMove(t, "hg", "rsc.io/x86/x86asm", "x86", "rsc.io/x86/.hg/hgrc")
-// }
-
-// TODO(rsc): Set up a test case on SourceForge (?) for svn.
-// func testMoveSVN(t *testing.T) {
-//	testMove(t, "svn", "code.google.com/p/rsc-svn/trunk", "-", "-")
-// }
-
-func TestImportCommandMatch(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata/importcom"))
-	tg.run("build", "./testdata/importcom/works.go")
-}
-
-func TestImportCommentMismatch(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata/importcom"))
-	tg.runFail("build", "./testdata/importcom/wrongplace.go")
-	tg.grepStderr(`wrongplace expects import "my/x"`, "go build did not mention incorrect import")
-}
-
-func TestImportCommentSyntaxError(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata/importcom"))
-	tg.runFail("build", "./testdata/importcom/bad.go")
-	tg.grepStderr("cannot parse import comment", "go build did not mention syntax error")
-}
-
-func TestImportCommentConflict(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata/importcom"))
-	tg.runFail("build", "./testdata/importcom/conflict.go")
-	tg.grepStderr("found import comments", "go build did not mention comment conflict")
-}
-
-// cmd/go: custom import path checking should not apply to github.com/xxx/yyy.
-func TestIssue10952(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	if _, err := exec.LookPath("git"); err != nil {
-		t.Skip("skipping because git binary not found")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempDir("src")
-	tg.setenv("GOPATH", tg.path("."))
-	const importPath = "github.com/zombiezen/go-get-issue-10952"
-	tg.run("get", "-d", "-u", importPath)
-	repoDir := tg.path("src/" + importPath)
-	defer tg.resetReadOnlyFlagAll(repoDir)
-	tg.runGit(repoDir, "remote", "set-url", "origin", "https://"+importPath+".git")
-	tg.run("get", "-d", "-u", importPath)
-}
-
-func TestDisallowedCSourceFiles(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.runFail("build", "badc")
-	tg.grepStderr("C source files not allowed", "go test did not say C source files not allowed")
-}
-
-func TestErrorMessageForSyntaxErrorInTestGoFileSaysFAIL(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.runFail("test", "syntaxerror")
-	tg.grepStderr("FAIL", "go test did not say FAIL")
-}
-
-func TestWildcardsDoNotLookInUselessDirectories(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.runFail("list", "...")
-	tg.grepBoth("badpkg", "go list ... failure does not mention badpkg")
-	tg.run("list", "m...")
-}
-
-func TestRelativeImportsGoTest(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("test", "./testdata/testimport")
-}
-
-func TestRelativeImportsGoTestDashI(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("test", "-i", "./testdata/testimport")
-}
-
-func TestRelativeImportsInCommandLinePackage(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	files, err := filepath.Glob("./testdata/testimport/*.go")
-	tg.must(err)
-	tg.run(append([]string{"test"}, files...)...)
-}
-
-func TestVersionControlErrorMessageIncludesCorrectDirectory(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata/shadow/root1"))
-	tg.runFail("get", "-u", "foo")
-
-	// TODO(iant): We should not have to use strconv.Quote here.
-	// The code in vcs.go should be changed so that it is not required.
-	quoted := strconv.Quote(filepath.Join("testdata", "shadow", "root1", "src", "foo"))
-	quoted = quoted[1 : len(quoted)-1]
-
-	tg.grepStderr(regexp.QuoteMeta(quoted), "go get -u error does not mention shadow/root1/src/foo")
-}
-
-func TestInstallFailsWithNoBuildableFiles(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.setenv("CGO_ENABLED", "0")
-	tg.runFail("install", "cgotest")
-	tg.grepStderr("no buildable Go source files", "go install cgotest did not report 'no buildable Go Source files'")
-}
-
-// Test that without $GOBIN set, binaries get installed
-// into the GOPATH bin directory.
-func TestInstallIntoGOPATH(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.creatingTemp("testdata/bin/go-cmd-test" + exeSuffix)
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.run("install", "go-cmd-test")
-	tg.wantExecutable("testdata/bin/go-cmd-test"+exeSuffix, "go install go-cmd-test did not write to testdata/bin/go-cmd-test")
-}
-
-func TestPackageMainTestImportsArchiveNotBinary(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	gobin := filepath.Join(tg.pwd(), "testdata", "bin")
-	tg.creatingTemp(gobin)
-	tg.setenv("GOBIN", gobin)
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.must(os.Chtimes("./testdata/src/main_test/m.go", time.Now(), time.Now()))
-	tg.sleep()
-	tg.run("test", "main_test")
-	tg.run("install", "main_test")
-	tg.wantNotStale("main_test", "after go install, main listed as stale")
-	tg.run("test", "main_test")
-}
-
-// With $GOBIN set, binaries get installed to $GOBIN.
-func TestInstallIntoGOBIN(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	gobin := filepath.Join(tg.pwd(), "testdata", "bin1")
-	tg.creatingTemp(gobin)
-	tg.setenv("GOBIN", gobin)
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.run("install", "go-cmd-test")
-	tg.wantExecutable("testdata/bin1/go-cmd-test"+exeSuffix, "go install go-cmd-test did not write to testdata/bin1/go-cmd-test")
-}
-
-// Issue 11065
-func TestInstallToCurrentDirectoryCreatesExecutable(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	pkg := filepath.Join(tg.pwd(), "testdata", "src", "go-cmd-test")
-	tg.creatingTemp(filepath.Join(pkg, "go-cmd-test"+exeSuffix))
-	tg.setenv("GOBIN", pkg)
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.cd(pkg)
-	tg.run("install")
-	tg.wantExecutable("go-cmd-test"+exeSuffix, "go install did not write to current directory")
-}
-
-// Without $GOBIN set, installing a program outside $GOPATH should fail
-// (there is nowhere to install it).
-func TestInstallWithoutDestinationFails(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.runFail("install", "testdata/src/go-cmd-test/helloworld.go")
-	tg.grepStderr("no install location for .go files listed on command line", "wrong error")
-}
-
-// With $GOBIN set, should install there.
-func TestInstallToGOBINCommandLinePackage(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	gobin := filepath.Join(tg.pwd(), "testdata", "bin1")
-	tg.creatingTemp(gobin)
-	tg.setenv("GOBIN", gobin)
-	tg.run("install", "testdata/src/go-cmd-test/helloworld.go")
-	tg.wantExecutable("testdata/bin1/helloworld"+exeSuffix, "go install testdata/src/go-cmd-test/helloworld.go did not write testdata/bin1/helloworld")
-}
-
-func TestGodocInstalls(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	// godoc installs into GOBIN
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempDir("gobin")
-	tg.setenv("GOPATH", tg.path("."))
-	tg.setenv("GOBIN", tg.path("gobin"))
-	tg.run("get", "golang.org/x/tools/cmd/godoc")
-	tg.wantExecutable(tg.path("gobin/godoc"), "did not install godoc to $GOBIN")
-	tg.unsetenv("GOBIN")
-
-	// godoc installs into GOROOT
-	goroot := runtime.GOROOT()
-	tg.setenv("GOROOT", goroot)
-	tg.check(os.RemoveAll(filepath.Join(goroot, "bin", "godoc")))
-	tg.run("install", "golang.org/x/tools/cmd/godoc")
-	tg.wantExecutable(filepath.Join(goroot, "bin", "godoc"), "did not install godoc to $GOROOT/bin")
-}
-
-func TestGoGetNonPkg(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.tempDir("gobin")
-	tg.setenv("GOPATH", tg.path("."))
-	tg.setenv("GOBIN", tg.path("gobin"))
-	tg.runFail("get", "-d", "golang.org/x/tools")
-	tg.grepStderr("golang.org/x/tools: no buildable Go source files", "missing error")
-	tg.runFail("get", "-d", "-u", "golang.org/x/tools")
-	tg.grepStderr("golang.org/x/tools: no buildable Go source files", "missing error")
-	tg.runFail("get", "-d", "golang.org/x/tools")
-	tg.grepStderr("golang.org/x/tools: no buildable Go source files", "missing error")
-}
-
-func TestInstalls(t *testing.T) {
-	if testing.Short() {
-		t.Skip("don't install into GOROOT in short mode")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempDir("gobin")
-	tg.setenv("GOPATH", tg.path("."))
-	goroot := runtime.GOROOT()
-	tg.setenv("GOROOT", goroot)
-
-	// cmd/fix installs into tool
-	tg.run("env", "GOOS")
-	goos := strings.TrimSpace(tg.getStdout())
-	tg.setenv("GOOS", goos)
-	tg.run("env", "GOARCH")
-	goarch := strings.TrimSpace(tg.getStdout())
-	tg.setenv("GOARCH", goarch)
-	fixbin := filepath.Join(goroot, "pkg", "tool", goos+"_"+goarch, "fix") + exeSuffix
-	tg.must(os.RemoveAll(fixbin))
-	tg.run("install", "cmd/fix")
-	tg.wantExecutable(fixbin, "did not install cmd/fix to $GOROOT/pkg/tool")
-	tg.must(os.Remove(fixbin))
-	tg.setenv("GOBIN", tg.path("gobin"))
-	tg.run("install", "cmd/fix")
-	tg.wantExecutable(fixbin, "did not install cmd/fix to $GOROOT/pkg/tool with $GOBIN set")
-	tg.unsetenv("GOBIN")
-
-	// gopath program installs into GOBIN
-	tg.tempFile("src/progname/p.go", `package main; func main() {}`)
-	tg.setenv("GOBIN", tg.path("gobin"))
-	tg.run("install", "progname")
-	tg.unsetenv("GOBIN")
-	tg.wantExecutable(tg.path("gobin/progname")+exeSuffix, "did not install progname to $GOBIN/progname")
-
-	// gopath program installs into GOPATH/bin
-	tg.run("install", "progname")
-	tg.wantExecutable(tg.path("bin/progname")+exeSuffix, "did not install progname to $GOPATH/bin/progname")
-}
-
-func TestRejectRelativeDotPathInGOPATHCommandLinePackage(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", ".")
-	tg.runFail("build", "testdata/src/go-cmd-test/helloworld.go")
-	tg.grepStderr("GOPATH entry is relative", "expected an error message rejecting relative GOPATH entries")
-}
-
-func TestRejectRelativePathsInGOPATH(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	sep := string(filepath.ListSeparator)
-	tg.setenv("GOPATH", sep+filepath.Join(tg.pwd(), "testdata")+sep+".")
-	tg.runFail("build", "go-cmd-test")
-	tg.grepStderr("GOPATH entry is relative", "expected an error message rejecting relative GOPATH entries")
-}
-
-func TestRejectRelativePathsInGOPATHCommandLinePackage(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", "testdata")
-	tg.runFail("build", "testdata/src/go-cmd-test/helloworld.go")
-	tg.grepStderr("GOPATH entry is relative", "expected an error message rejecting relative GOPATH entries")
-}
-
-// Issue 4104.
-func TestGoTestWithPackageListedMultipleTimes(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.run("test", "errors", "errors", "errors", "errors", "errors")
-	if strings.Index(strings.TrimSpace(tg.getStdout()), "\n") != -1 {
-		t.Error("go test errors errors errors errors errors tested the same package multiple times")
-	}
-}
-
-func TestGoListHasAConsistentOrder(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("list", "std")
-	first := tg.getStdout()
-	tg.run("list", "std")
-	if first != tg.getStdout() {
-		t.Error("go list std ordering is inconsistent")
-	}
-}
-
-func TestGoListStdDoesNotIncludeCommands(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("list", "std")
-	tg.grepStdoutNot("cmd/", "go list std shows commands")
-}
-
-func TestGoListCmdOnlyShowsCommands(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("list", "cmd")
-	out := strings.TrimSpace(tg.getStdout())
-	for _, line := range strings.Split(out, "\n") {
-		if strings.Index(line, "cmd/") == -1 {
-			t.Error("go list cmd shows non-commands")
-			break
-		}
-	}
-}
-
-// Issue 4096. Validate the output of unsuccessful go install foo/quxx.
-func TestUnsuccessfulGoInstallShouldMentionMissingPackage(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.runFail("install", "foo/quxx")
-	if tg.grepCountBoth(`cannot find package "foo/quxx" in any of`) != 1 {
-		t.Error(`go install foo/quxx expected error: .*cannot find package "foo/quxx" in any of`)
-	}
-}
-
-func TestGOROOTSearchFailureReporting(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.runFail("install", "foo/quxx")
-	if tg.grepCountBoth(regexp.QuoteMeta(filepath.Join("foo", "quxx"))+` \(from \$GOROOT\)$`) != 1 {
-		t.Error(`go install foo/quxx expected error: .*foo/quxx (from $GOROOT)`)
-	}
-}
-
-func TestMultipleGOPATHEntriesReportedSeparately(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	sep := string(filepath.ListSeparator)
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata", "a")+sep+filepath.Join(tg.pwd(), "testdata", "b"))
-	tg.runFail("install", "foo/quxx")
-	if tg.grepCountBoth(`testdata[/\\].[/\\]src[/\\]foo[/\\]quxx`) != 2 {
-		t.Error(`go install foo/quxx expected error: .*testdata/a/src/foo/quxx (from $GOPATH)\n.*testdata/b/src/foo/quxx`)
-	}
-}
-
-// Test (from $GOPATH) annotation is reported for the first GOPATH entry,
-func TestMentionGOPATHInFirstGOPATHEntry(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	sep := string(filepath.ListSeparator)
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata", "a")+sep+filepath.Join(tg.pwd(), "testdata", "b"))
-	tg.runFail("install", "foo/quxx")
-	if tg.grepCountBoth(regexp.QuoteMeta(filepath.Join("testdata", "a", "src", "foo", "quxx"))+` \(from \$GOPATH\)$`) != 1 {
-		t.Error(`go install foo/quxx expected error: .*testdata/a/src/foo/quxx (from $GOPATH)`)
-	}
-}
-
-// but not on the second.
-func TestMentionGOPATHNotOnSecondEntry(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	sep := string(filepath.ListSeparator)
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata", "a")+sep+filepath.Join(tg.pwd(), "testdata", "b"))
-	tg.runFail("install", "foo/quxx")
-	if tg.grepCountBoth(regexp.QuoteMeta(filepath.Join("testdata", "b", "src", "foo", "quxx"))+`$`) != 1 {
-		t.Error(`go install foo/quxx expected error: .*testdata/b/src/foo/quxx`)
-	}
-}
-
-// Test missing GOPATH is reported.
-func TestMissingGOPATHIsReported(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", "")
-	tg.runFail("install", "foo/quxx")
-	if tg.grepCountBoth(`\(\$GOPATH not set\)$`) != 1 {
-		t.Error(`go install foo/quxx expected error: ($GOPATH not set)`)
-	}
-}
-
-// Issue 4186.  go get cannot be used to download packages to $GOROOT.
-// Test that without GOPATH set, go get should fail.
-func TestWithoutGOPATHGoGetFails(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempDir("src")
-	tg.setenv("GOPATH", "")
-	tg.setenv("GOROOT", tg.path("."))
-	tg.runFail("get", "-d", "golang.org/x/codereview/cmd/hgpatch")
-}
-
-// Test that with GOPATH=$GOROOT, go get should fail.
-func TestWithGOPATHEqualsGOROOTGoGetFails(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempDir("src")
-	tg.setenv("GOPATH", tg.path("."))
-	tg.setenv("GOROOT", tg.path("."))
-	tg.runFail("get", "-d", "golang.org/x/codereview/cmd/hgpatch")
-}
-
-func TestLdflagsArgumentsWithSpacesIssue3941(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempFile("main.go", `package main
-		var extern string
-		func main() {
-			println(extern)
-		}`)
-	tg.run("run", "-ldflags", `-X main.extern "hello world"`, tg.path("main.go"))
-	tg.grepStderr("^hello world", `ldflags -X main.extern 'hello world' failed`)
-}
-
-func TestGoTestCpuprofileLeavesBinaryBehind(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.cd(tg.path("."))
-	tg.run("test", "-cpuprofile", "errors.prof", "errors")
-	tg.wantExecutable("errors.test"+exeSuffix, "go test -cpuprofile did not create errors.test")
-}
-
-func TestGoTestCpuprofileDashOControlsBinaryLocation(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.cd(tg.path("."))
-	tg.run("test", "-cpuprofile", "errors.prof", "-o", "myerrors.test"+exeSuffix, "errors")
-	tg.wantExecutable("myerrors.test"+exeSuffix, "go test -cpuprofile -o myerrors.test did not create myerrors.test")
-}
-
-func TestGoTestDashCDashOControlsBinaryLocation(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.makeTempdir()
-	tg.run("test", "-c", "-o", tg.path("myerrors.test"+exeSuffix), "errors")
-	tg.wantExecutable(tg.path("myerrors.test"+exeSuffix), "go test -c -o myerrors.test did not create myerrors.test")
-}
-
-func TestGoTestDashOWritesBinary(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.makeTempdir()
-	tg.run("test", "-o", tg.path("myerrors.test"+exeSuffix), "errors")
-	tg.wantExecutable(tg.path("myerrors.test"+exeSuffix), "go test -o myerrors.test did not create myerrors.test")
-}
-
-// Issue 4568.
-func TestSymlinksDoNotConfuseGoList(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9", "windows":
-		t.Skipf("skipping symlink test on %s", runtime.GOOS)
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.tempDir("src")
-	tg.must(os.Symlink(tg.path("."), tg.path("src/dir1")))
-	tg.tempFile("src/dir1/p.go", "package p")
-	tg.setenv("GOPATH", tg.path("."))
-	tg.cd(tg.path("src"))
-	tg.run("list", "-f", "{{.Root}}", "dir1")
-	if strings.TrimSpace(tg.getStdout()) != tg.path(".") {
-		t.Error("confused by symlinks")
-	}
-}
-
-// Issue 4515.
-func TestInstallWithTags(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempDir("bin")
-	tg.tempFile("src/example/a/main.go", `package main
-		func main() {}`)
-	tg.tempFile("src/example/b/main.go", `// +build mytag
-
-		package main
-		func main() {}`)
-	tg.setenv("GOPATH", tg.path("."))
-	tg.run("install", "-tags", "mytag", "example/a", "example/b")
-	tg.wantExecutable(tg.path("bin/a"+exeSuffix), "go install example/a example/b did not install binaries")
-	tg.wantExecutable(tg.path("bin/b"+exeSuffix), "go install example/a example/b did not install binaries")
-	tg.must(os.Remove(tg.path("bin/a" + exeSuffix)))
-	tg.must(os.Remove(tg.path("bin/b" + exeSuffix)))
-	tg.run("install", "-tags", "mytag", "example/...")
-	tg.wantExecutable(tg.path("bin/a"+exeSuffix), "go install example/... did not install binaries")
-	tg.wantExecutable(tg.path("bin/b"+exeSuffix), "go install example/... did not install binaries")
-	tg.run("list", "-tags", "mytag", "example/b...")
-	if strings.TrimSpace(tg.getStdout()) != "example/b" {
-		t.Error("go list example/b did not find example/b")
-	}
-}
-
-// Issue 4773
-func TestCaseCollisions(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempDir("src/example/a/pkg")
-	tg.tempDir("src/example/a/Pkg")
-	tg.tempDir("src/example/b")
-	tg.setenv("GOPATH", tg.path("."))
-	tg.tempFile("src/example/a/a.go", `package p
-		import (
-			_ "example/a/pkg"
-			_ "example/a/Pkg"
-		)`)
-	tg.tempFile("src/example/a/pkg/pkg.go", `package pkg`)
-	tg.tempFile("src/example/a/Pkg/pkg.go", `package pkg`)
-	tg.runFail("list", "example/a")
-	tg.grepStderr("case-insensitive import collision", "go list example/a did not report import collision")
-	tg.tempFile("src/example/b/file.go", `package b`)
-	tg.tempFile("src/example/b/FILE.go", `package b`)
-	f, err := os.Open(tg.path("src/example/b"))
-	tg.must(err)
-	names, err := f.Readdirnames(0)
-	tg.must(err)
-	tg.check(f.Close())
-	args := []string{"list"}
-	if len(names) == 2 {
-		// case-sensitive file system, let directory read find both files
-		args = append(args, "example/b")
-	} else {
-		// case-insensitive file system, list files explicitly on command line
-		args = append(args, tg.path("src/example/b/file.go"), tg.path("src/example/b/FILE.go"))
-	}
-	tg.runFail(args...)
-	tg.grepStderr("case-insensitive file name collision", "go list example/b did not report file name collision")
-}
-
-// Issue 8181.
-func TestGoGetDashTIssue8181(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping test that uses network in short mode")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-	tg.run("get", "-v", "-t", "github.com/rsc/go-get-issue-8181/a", "github.com/rsc/go-get-issue-8181/b")
-	tg.run("list", "...")
-	tg.grepStdout("x/build/cmd/cl", "missing expected x/build/cmd/cl")
-}
-
-func TestIssue11307(t *testing.T) {
-	// go get -u was not working except in checkout directory
-	if testing.Short() {
-		t.Skip("skipping test that uses network in short mode")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-	tg.run("get", "github.com/rsc/go-get-issue-11307")
-	tg.run("get", "-u", "github.com/rsc/go-get-issue-11307") // was failing
-}
-
-func TestShadowingLogic(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	pwd := tg.pwd()
-	sep := string(filepath.ListSeparator)
-	tg.setenv("GOPATH", filepath.Join(pwd, "testdata", "shadow", "root1")+sep+filepath.Join(pwd, "testdata", "shadow", "root2"))
-
-	// The math in root1 is not "math" because the standard math is.
-	tg.run("list", "-f", "({{.ImportPath}}) ({{.ConflictDir}})", "./testdata/shadow/root1/src/math")
-	pwdForwardSlash := strings.Replace(pwd, string(os.PathSeparator), "/", -1)
-	if !strings.HasPrefix(pwdForwardSlash, "/") {
-		pwdForwardSlash = "/" + pwdForwardSlash
-	}
-	// The output will have makeImportValid applies, but we only
-	// bother to deal with characters we might reasonably see.
-	pwdForwardSlash = strings.Replace(pwdForwardSlash, ":", "_", -1)
-	want := "(_" + pwdForwardSlash + "/testdata/shadow/root1/src/math) (" + filepath.Join(runtime.GOROOT(), "src", "math") + ")"
-	if strings.TrimSpace(tg.getStdout()) != want {
-		t.Error("shadowed math is not shadowed; looking for", want)
-	}
-
-	// The foo in root1 is "foo".
-	tg.run("list", "-f", "({{.ImportPath}}) ({{.ConflictDir}})", "./testdata/shadow/root1/src/foo")
-	if strings.TrimSpace(tg.getStdout()) != "(foo) ()" {
-		t.Error("unshadowed foo is shadowed")
-	}
-
-	// The foo in root2 is not "foo" because the foo in root1 got there first.
-	tg.run("list", "-f", "({{.ImportPath}}) ({{.ConflictDir}})", "./testdata/shadow/root2/src/foo")
-	want = "(_" + pwdForwardSlash + "/testdata/shadow/root2/src/foo) (" + filepath.Join(pwd, "testdata", "shadow", "root1", "src", "foo") + ")"
-	if strings.TrimSpace(tg.getStdout()) != want {
-		t.Error("shadowed foo is not shadowed; looking for", want)
-	}
-
-	// The error for go install should mention the conflicting directory.
-	tg.runFail("install", "./testdata/shadow/root2/src/foo")
-	want = "go install: no install location for " + filepath.Join(pwd, "testdata", "shadow", "root2", "src", "foo") + ": hidden by " + filepath.Join(pwd, "testdata", "shadow", "root1", "src", "foo")
-	if strings.TrimSpace(tg.getStderr()) != want {
-		t.Error("wrong shadowed install error; looking for", want)
-	}
-}
-
-// Only succeeds if source order is preserved.
-func TestSourceFileNameOrderPreserved(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("test", "testdata/example1_test.go", "testdata/example2_test.go")
-}
-
-// Check that coverage analysis works at all.
-// Don't worry about the exact numbers but require not 0.0%.
-func checkCoverage(tg *testgoData, data string) {
-	if regexp.MustCompile(`[^0-9]0\.0%`).MatchString(data) {
-		tg.t.Error("some coverage results are 0.0%")
-	}
-	tg.t.Log(data)
-}
-
-func TestCoverageRuns(t *testing.T) {
-	if testing.Short() {
-		t.Skip("don't build libraries for coverage in short mode")
-	}
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("test", "-short", "-coverpkg=strings", "strings", "regexp")
-	data := tg.getStdout() + tg.getStderr()
-	tg.run("test", "-short", "-cover", "strings", "math", "regexp")
-	data += tg.getStdout() + tg.getStderr()
-	checkCoverage(tg, data)
-}
-
-// Check that coverage analysis uses set mode.
-func TestCoverageUsesSetMode(t *testing.T) {
-	if testing.Short() {
-		t.Skip("don't build libraries for coverage in short mode")
-	}
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.creatingTemp("testdata/cover.out")
-	tg.run("test", "-short", "-cover", "encoding/binary", "-coverprofile=testdata/cover.out")
-	data := tg.getStdout() + tg.getStderr()
-	if out, err := ioutil.ReadFile("testdata/cover.out"); err != nil {
-		t.Error(err)
-	} else {
-		if !bytes.Contains(out, []byte("mode: set")) {
-			t.Error("missing mode: set")
-		}
-	}
-	checkCoverage(tg, data)
-}
-
-func TestCoverageUsesAtomicModeForRace(t *testing.T) {
-	if testing.Short() {
-		t.Skip("don't build libraries for coverage in short mode")
-	}
-	if !canRace {
-		t.Skip("skipping because race detector not supported")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.creatingTemp("testdata/cover.out")
-	tg.run("test", "-short", "-race", "-cover", "encoding/binary", "-coverprofile=testdata/cover.out")
-	data := tg.getStdout() + tg.getStderr()
-	if out, err := ioutil.ReadFile("testdata/cover.out"); err != nil {
-		t.Error(err)
-	} else {
-		if !bytes.Contains(out, []byte("mode: atomic")) {
-			t.Error("missing mode: atomic")
-		}
-	}
-	checkCoverage(tg, data)
-}
-
-func TestCoverageUsesActualSettingToOverrideEvenForRace(t *testing.T) {
-	if testing.Short() {
-		t.Skip("don't build libraries for coverage in short mode")
-	}
-	if !canRace {
-		t.Skip("skipping because race detector not supported")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.creatingTemp("testdata/cover.out")
-	tg.run("test", "-short", "-race", "-cover", "encoding/binary", "-covermode=count", "-coverprofile=testdata/cover.out")
-	data := tg.getStdout() + tg.getStderr()
-	if out, err := ioutil.ReadFile("testdata/cover.out"); err != nil {
-		t.Error(err)
-	} else {
-		if !bytes.Contains(out, []byte("mode: count")) {
-			t.Error("missing mode: count")
-		}
-	}
-	checkCoverage(tg, data)
-}
-
-func TestCoverageWithCgo(t *testing.T) {
-	if !canCgo {
-		t.Skip("skipping because cgo not enabled")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("test", "-short", "-cover", "./testdata/cgocover")
-	data := tg.getStdout() + tg.getStderr()
-	checkCoverage(tg, data)
-}
-
-func TestCgoDependsOnSyscall(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping test that removes $GOROOT/pkg/*_race in short mode")
-	}
-	if !canCgo {
-		t.Skip("skipping because cgo not enabled")
-	}
-	if !canRace {
-		t.Skip("skipping because race detector not supported")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	files, err := filepath.Glob(filepath.Join(runtime.GOROOT(), "pkg", "*_race"))
-	tg.must(err)
-	for _, file := range files {
-		tg.check(os.RemoveAll(file))
-	}
-	tg.tempFile("src/foo/foo.go", `
-		package foo
-		//#include <stdio.h>
-		import "C"`)
-	tg.setenv("GOPATH", tg.path("."))
-	tg.run("build", "-race", "foo")
-}
-
-func TestCgoShowsFullPathNames(t *testing.T) {
-	if !canCgo {
-		t.Skip("skipping because cgo not enabled")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempFile("src/x/y/dirname/foo.go", `
-		package foo
-		import "C"
-		func f() {`)
-	tg.setenv("GOPATH", tg.path("."))
-	tg.runFail("build", "x/y/dirname")
-	tg.grepBoth("x/y/dirname", "error did not use full path")
-}
-
-func TestCgoHandlesWlORIGIN(t *testing.T) {
-	if !canCgo {
-		t.Skip("skipping because cgo not enabled")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempFile("src/origin/origin.go", `package origin
-		// #cgo !darwin LDFLAGS: -Wl,-rpath -Wl,$ORIGIN
-		// void f(void) {}
-		import "C"
-		func f() { C.f() }`)
-	tg.setenv("GOPATH", tg.path("."))
-	tg.run("build", "origin")
-}
-
-// "go test -c -test.bench=XXX errors" should not hang
-func TestIssue6480(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.cd(tg.path("."))
-	tg.run("test", "-c", "-test.bench=XXX", "errors")
-}
-
-// cmd/cgo: undefined reference when linking a C-library using gccgo
-func TestIssue7573(t *testing.T) {
-	if _, err := exec.LookPath("gccgo"); err != nil {
-		t.Skip("skipping because no gccgo compiler found")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempFile("src/cgoref/cgoref.go", `
-package main
-// #cgo LDFLAGS: -L alibpath -lalib
-// void f(void) {}
-import "C"
-
-func main() { C.f() }`)
-	tg.setenv("GOPATH", tg.path("."))
-	tg.run("build", "-n", "-compiler", "gccgo", "cgoref")
-	tg.grepStderr(`gccgo.*\-L alibpath \-lalib`, `no Go-inline "#cgo LDFLAGS:" ("-L alibpath -lalib") passed to gccgo linking stage`)
-}
-
-func TestListTemplateCanUseContextFunction(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("list", "-f", "GOARCH: {{context.GOARCH}}")
-}
-
-// cmd/go: "go test" should fail if package does not build
-func TestIssue7108(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.runFail("test", "notest")
-}
-
-// cmd/go: go test -a foo does not rebuild regexp.
-func TestIssue6844(t *testing.T) {
-	if testing.Short() {
-		t.Skip("don't rebuild the standard libary in short mode")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.creatingTemp("deps.test" + exeSuffix)
-	tg.run("test", "-x", "-a", "-c", "testdata/dep_test.go")
-	tg.grepStderr("regexp", "go test -x -a -c testdata/dep-test.go did not rebuild regexp")
-}
-
-func TestBuildDashIInstallsDependencies(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempFile("src/x/y/foo/foo.go", `package foo
-		func F() {}`)
-	tg.tempFile("src/x/y/bar/bar.go", `package bar
-		import "x/y/foo"
-		func F() { foo.F() }`)
-	tg.setenv("GOPATH", tg.path("."))
-
-	checkbar := func(desc string) {
-		tg.sleep()
-		tg.must(os.Chtimes(tg.path("src/x/y/foo/foo.go"), time.Now(), time.Now()))
-		tg.sleep()
-		tg.run("build", "-v", "-i", "x/y/bar")
-		tg.grepBoth("x/y/foo", "first build -i "+desc+" did not build x/y/foo")
-		tg.run("build", "-v", "-i", "x/y/bar")
-		tg.grepBothNot("x/y/foo", "second build -i "+desc+" built x/y/foo")
-	}
-	checkbar("pkg")
-	tg.creatingTemp("bar" + exeSuffix)
-	tg.tempFile("src/x/y/bar/bar.go", `package main
-		import "x/y/foo"
-		func main() { foo.F() }`)
-	checkbar("cmd")
-}
-
-func TestGoBuildInTestOnlyDirectoryFailsWithAGoodError(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.runFail("build", "./testdata/testonly")
-	tg.grepStderr("no buildable Go", "go build ./testdata/testonly produced unexpected error")
-}
-
-func TestGoTestDetectsTestOnlyImportCycles(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.runFail("test", "-c", "testcycle/p3")
-	tg.grepStderr("import cycle not allowed in test", "go test testcycle/p3 produced unexpected error")
-
-	tg.runFail("test", "-c", "testcycle/q1")
-	tg.grepStderr("import cycle not allowed in test", "go test testcycle/q1 produced unexpected error")
-}
-
-func TestGoTestFooTestWorks(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("test", "testdata/standalone_test.go")
-}
-
-func TestGoTestXtestonlyWorks(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.run("clean", "-i", "xtestonly")
-	tg.run("test", "xtestonly")
-}
-
-func TestGoTestBuildsAnXtestContainingOnlyNonRunnableExamples(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("test", "-v", "./testdata/norunexample")
-	tg.grepStdout("File with non-runnable example was built.", "file with non-runnable example was not built")
-}
-
-func TestGoGenerateHandlesSimpleCommand(t *testing.T) {
-	if runtime.GOOS == "windows" {
-		t.Skip("skipping because windows has no echo command")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("generate", "./testdata/generate/test1.go")
-	tg.grepStdout("Success", "go generate ./testdata/generate/test1.go generated wrong output")
-}
-
-func TestGoGenerateHandlesCommandAlias(t *testing.T) {
-	if runtime.GOOS == "windows" {
-		t.Skip("skipping because windows has no echo command")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("generate", "./testdata/generate/test2.go")
-	tg.grepStdout("Now is the time for all good men", "go generate ./testdata/generate/test2.go generated wrong output")
-}
-
-func TestGoGenerateVariableSubstitution(t *testing.T) {
-	if runtime.GOOS == "windows" {
-		t.Skip("skipping because windows has no echo command")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("generate", "./testdata/generate/test3.go")
-	tg.grepStdout(runtime.GOARCH+" test3.go:7 pabc xyzp/test3.go/123", "go generate ./testdata/generate/test3.go generated wrong output")
-}
-
-func TestGoGenerateRunFlag(t *testing.T) {
-	if runtime.GOOS == "windows" {
-		t.Skip("skipping because windows has no echo command")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("generate", "-run", "y.s", "./testdata/generate/test4.go")
-	tg.grepStdout("yes", "go generate -run yes ./testdata/generate/test4.go did not select yes")
-	tg.grepStdoutNot("no", "go generate -run yes ./testdata/generate/test4.go selected no")
-}
-
-func TestGoGetCustomDomainWildcard(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-	tg.run("get", "-u", "rsc.io/pdf/...")
-	tg.wantExecutable(tg.path("bin/pdfpasswd"+exeSuffix), "did not build rsc/io/pdf/pdfpasswd")
-}
-
-func TestGoGetInternalWildcard(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-	// used to fail with errors about internal packages
-	tg.run("get", "github.com/rsc/go-get-issue-11960/...")
-}
-
-func TestGoVetWithExternalTests(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-	tg.run("get", "golang.org/x/tools/cmd/vet")
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.runFail("vet", "vetpkg")
-	tg.grepBoth("missing argument for Printf", "go vet vetpkg did not find missing argument for Printf")
-}
-
-func TestGoVetWithTags(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-	tg.run("get", "golang.org/x/tools/cmd/vet")
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.runFail("vet", "-tags", "tagtest", "vetpkg")
-	tg.grepBoth(`c\.go.*wrong number of args for format`, "go get vetpkg did not run scan tagged file")
-}
-
-// Issue 9767.
-func TestGoGetRscIoToolstash(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.tempDir("src/rsc.io")
-	tg.setenv("GOPATH", tg.path("."))
-	tg.cd(tg.path("src/rsc.io"))
-	tg.run("get", "./toolstash")
-}
-
-// Test that you can not import a main package.
-func TestIssue4210(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.tempFile("src/x/main.go", `package main
-		var X int
-		func main() {}`)
-	tg.tempFile("src/y/main.go", `package main
-		import "fmt"
-		import xmain "x"
-		func main() {
-			fmt.Println(xmain.X)
-		}`)
-	tg.setenv("GOPATH", tg.path("."))
-	tg.runFail("build", "y")
-	tg.grepBoth("is a program", `did not find expected error message ("is a program")`)
-}
-
-func TestGoGetInsecure(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-	tg.failSSH()
-
-	const repo = "wh3rd.net/git.git"
-
-	// Try go get -d of HTTP-only repo (should fail).
-	tg.runFail("get", "-d", repo)
-
-	// Try again with -insecure (should succeed).
-	tg.run("get", "-d", "-insecure", repo)
-
-	// Try updating without -insecure (should fail).
-	tg.runFail("get", "-d", "-u", "-f", repo)
-}
-
-func TestGoGetUpdateInsecure(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-
-	const repo = "github.com/golang/example"
-
-	// Clone the repo via HTTP manually.
-	cmd := exec.Command("git", "clone", "-q", "http://"+repo, tg.path("src/"+repo))
-	if out, err := cmd.CombinedOutput(); err != nil {
-		t.Fatalf("cloning %v repo: %v\n%s", repo, err, out)
-	}
-
-	// Update without -insecure should fail.
-	// Update with -insecure should succeed.
-	// We need -f to ignore import comments.
-	const pkg = repo + "/hello"
-	tg.runFail("get", "-d", "-u", "-f", pkg)
-	tg.run("get", "-d", "-u", "-f", "-insecure", pkg)
-}
-
-func TestGoGetInsecureCustomDomain(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-
-	const repo = "wh3rd.net/repo"
-	tg.runFail("get", "-d", repo)
-	tg.run("get", "-d", "-insecure", repo)
-}
-
-func TestIssue10193(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.parallel()
-	tg.tempDir("src")
-	tg.setenv("GOPATH", tg.path("."))
-	tg.runFail("get", "code.google.com/p/rsc/pdf")
-	tg.grepStderr("is shutting down", "missed warning about code.google.com")
-}
-
-func TestGoRunDirs(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.cd("testdata/rundir")
-	tg.runFail("run", "x.go", "sub/sub.go")
-	tg.grepStderr("named files must all be in one directory; have ./ and sub/", "wrong output")
-	tg.runFail("run", "sub/sub.go", "x.go")
-	tg.grepStderr("named files must all be in one directory; have sub/ and ./", "wrong output")
-}
-
-func TestGoInstallPkgdir(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	pkg := tg.path(".")
-	tg.run("install", "-pkgdir", pkg, "errors")
-	_, err := os.Stat(filepath.Join(pkg, "errors.a"))
-	tg.must(err)
-	_, err = os.Stat(filepath.Join(pkg, "runtime.a"))
-	tg.must(err)
-}
-
-func TestGoTestRaceInstallCgo(t *testing.T) {
-	switch sys := runtime.GOOS + "/" + runtime.GOARCH; sys {
-	case "darwin/amd64", "freebsd/amd64", "linux/amd64", "windows/amd64":
-		// ok
-	default:
-		t.Skip("no race detector on %s", sys)
-	}
-
-	if !build.Default.CgoEnabled {
-		t.Skip("no race detector without cgo")
-	}
-
-	// golang.org/issue/10500.
-	// This used to install a race-enabled cgo.
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.run("tool", "-n", "cgo")
-	cgo := strings.TrimSpace(tg.stdout.String())
-	old, err := os.Stat(cgo)
-	tg.must(err)
-	tg.run("test", "-race", "-i", "runtime/race")
-	new, err := os.Stat(cgo)
-	tg.must(err)
-	if new.ModTime() != old.ModTime() {
-		t.Fatalf("go test -i runtime/race reinstalled cmd/cgo")
-	}
-}
-
-func TestGoTestImportErrorStack(t *testing.T) {
-	const out = `package testdep/p1 (test)
-	imports testdep/p2
-	imports testdep/p3: no buildable Go source files`
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.runFail("test", "testdep/p1")
-	if !strings.Contains(tg.stderr.String(), out) {
-		t.Fatal("did not give full import stack:\n\n%s", tg.stderr.String())
-	}
-}
-
-func TestGoGetUpdate(t *testing.T) {
-	// golang.org/issue/9224.
-	// The recursive updating was trying to walk to
-	// former dependencies, not current ones.
-
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-
-	rewind := func() {
-		tg.run("get", "github.com/rsc/go-get-issue-9224-cmd")
-		cmd := exec.Command("git", "reset", "--hard", "HEAD~")
-		cmd.Dir = tg.path("src/github.com/rsc/go-get-issue-9224-lib")
-		out, err := cmd.CombinedOutput()
-		if err != nil {
-			t.Fatalf("git: %v\n%s", err, out)
-		}
-	}
-
-	rewind()
-	tg.run("get", "-u", "github.com/rsc/go-get-issue-9224-cmd")
-
-	// Again with -d -u.
-	rewind()
-	tg.run("get", "-d", "-u", "github.com/rsc/go-get-issue-9224-cmd")
-}
-
-func TestGoGetDomainRoot(t *testing.T) {
-	// golang.org/issue/9357.
-	// go get foo.io (not foo.io/subdir) was not working consistently.
-
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-
-	// go-get-issue-9357.appspot.com is running
-	// the code at github.com/rsc/go-get-issue-9357,
-	// a trivial Go on App Engine app that serves a
-	// <meta> tag for the domain root.
-	tg.run("get", "-d", "go-get-issue-9357.appspot.com")
-	tg.run("get", "go-get-issue-9357.appspot.com")
-	tg.run("get", "-u", "go-get-issue-9357.appspot.com")
-
-	tg.must(os.RemoveAll(tg.path("src/go-get-issue-9357.appspot.com")))
-	tg.run("get", "go-get-issue-9357.appspot.com")
-
-	tg.must(os.RemoveAll(tg.path("src/go-get-issue-9357.appspot.com")))
-	tg.run("get", "-u", "go-get-issue-9357.appspot.com")
-}
-
-func TestGoInstallShadowedGOPATH(t *testing.T) {
-	// golang.org/issue/3652.
-	// go get foo.io (not foo.io/subdir) was not working consistently.
-
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("gopath1")+string(filepath.ListSeparator)+tg.path("gopath2"))
-
-	tg.tempDir("gopath1/src/test")
-	tg.tempDir("gopath2/src/test")
-	tg.tempFile("gopath2/src/test/main.go", "package main\nfunc main(){}\n")
-
-	tg.cd(tg.path("gopath2/src/test"))
-	tg.runFail("install")
-	tg.grepStderr("no install location for.*gopath2.src.test: hidden by .*gopath1.src.test", "missing error")
-}
-
-func TestIssue11709(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.tempFile("run.go", `
-		package main
-		import "os"
-		func main() {
-			if os.Getenv("TERM") != "" {
-				os.Exit(1)
-			}
-		}`)
-	tg.unsetenv("TERM")
-	tg.run("run", tg.path("run.go"))
-}
-
-func TestIssue12096(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.tempFile("test_test.go", `
-		package main
-		import ("os"; "testing")
-		func TestEnv(t *testing.T) {
-			if os.Getenv("TERM") != "" {
-				t.Fatal("TERM is set")
-			}
-		}`)
-	tg.unsetenv("TERM")
-	tg.run("test", tg.path("test_test.go"))
-}
-
-func TestGoBuildOutput(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-
-	tg.makeTempdir()
-	tg.cd(tg.path("."))
-
-	nonExeSuffix := ".exe"
-	if exeSuffix == ".exe" {
-		nonExeSuffix = ""
-	}
-
-	tg.tempFile("x.go", "package main\nfunc main(){}\n")
-	tg.run("build", "x.go")
-	tg.wantExecutable("x"+exeSuffix, "go build x.go did not write x"+exeSuffix)
-	tg.must(os.Remove(tg.path("x" + exeSuffix)))
-	tg.mustNotExist("x" + nonExeSuffix)
-
-	tg.run("build", "-o", "myprog", "x.go")
-	tg.mustNotExist("x")
-	tg.mustNotExist("x.exe")
-	tg.wantExecutable("myprog", "go build -o myprog x.go did not write myprog")
-	tg.mustNotExist("myprog.exe")
-
-	tg.tempFile("p.go", "package p\n")
-	tg.run("build", "p.go")
-	tg.mustNotExist("p")
-	tg.mustNotExist("p.a")
-	tg.mustNotExist("p.o")
-	tg.mustNotExist("p.exe")
-
-	tg.run("build", "-o", "p.a", "p.go")
-	tg.wantArchive("p.a")
-
-	tg.run("build", "cmd/gofmt")
-	tg.wantExecutable("gofmt"+exeSuffix, "go build cmd/gofmt did not write gofmt"+exeSuffix)
-	tg.must(os.Remove(tg.path("gofmt" + exeSuffix)))
-	tg.mustNotExist("gofmt" + nonExeSuffix)
-
-	tg.run("build", "-o", "mygofmt", "cmd/gofmt")
-	tg.wantExecutable("mygofmt", "go build -o mygofmt cmd/gofmt did not write mygofmt")
-	tg.mustNotExist("mygofmt.exe")
-	tg.mustNotExist("gofmt")
-	tg.mustNotExist("gofmt.exe")
-
-	tg.run("build", "sync/atomic")
-	tg.mustNotExist("atomic")
-	tg.mustNotExist("atomic.exe")
-
-	tg.run("build", "-o", "myatomic.a", "sync/atomic")
-	tg.wantArchive("myatomic.a")
-	tg.mustNotExist("atomic")
-	tg.mustNotExist("atomic.a")
-	tg.mustNotExist("atomic.exe")
-
-	tg.runFail("build", "-o", "whatever", "cmd/gofmt", "sync/atomic")
-	tg.grepStderr("multiple packages", "did not reject -o with multiple packages")
-}
-
-func TestGoBuildARM(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping cross-compile in short mode")
-	}
-
-	tg := testgo(t)
-	defer tg.cleanup()
-
-	tg.makeTempdir()
-	tg.cd(tg.path("."))
-
-	tg.setenv("GOARCH", "arm")
-	tg.setenv("GOOS", "linux")
-	tg.setenv("GOARM", "5")
-	tg.tempFile("hello.go", `package main
-		func main() {}`)
-	tg.run("build", "hello.go")
-	tg.grepStderrNot("unable to find math.a", "did not build math.a correctly")
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/go_windows_test.go b/third_party/gofrontend/libgo/go/cmd/go/go_windows_test.go
deleted file mode 100644
index 53d695c..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/go_windows_test.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-	"testing"
-)
-
-func TestAbsolutePath(t *testing.T) {
-	tmp, err := ioutil.TempDir("", "TestAbsolutePath")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(tmp)
-
-	file := filepath.Join(tmp, "a.go")
-	err = ioutil.WriteFile(file, []byte{}, 0644)
-	if err != nil {
-		t.Fatal(err)
-	}
-	dir := filepath.Join(tmp, "dir")
-	err = os.Mkdir(dir, 0777)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	wd, err := os.Getwd()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.Chdir(wd)
-
-	// Chdir so current directory and a.go reside on the same drive.
-	err = os.Chdir(dir)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	noVolume := file[len(filepath.VolumeName(file)):]
-	wrongPath := filepath.Join(dir, noVolume)
-	output, err := exec.Command("go", "build", noVolume).CombinedOutput()
-	if err == nil {
-		t.Fatal("build should fail")
-	}
-	if strings.Contains(string(output), wrongPath) {
-		t.Fatalf("wrong output found: %v %v", err, string(output))
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/help.go b/third_party/gofrontend/libgo/go/cmd/go/help.go
deleted file mode 100644
index 5dff267..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/help.go
+++ /dev/null
@@ -1,574 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-var helpC = &Command{
-	UsageLine: "c",
-	Short:     "calling between Go and C",
-	Long: `
-There are two different ways to call between Go and C/C++ code.
-
-The first is the cgo tool, which is part of the Go distribution.  For
-information on how to use it see the cgo documentation (go doc cmd/cgo).
-
-The second is the SWIG program, which is a general tool for
-interfacing between languages.  For information on SWIG see
-http://swig.org/.  When running go build, any file with a .swig
-extension will be passed to SWIG.  Any file with a .swigcxx extension
-will be passed to SWIG with the -c++ option.
-
-When either cgo or SWIG is used, go build will pass any .c, .m, .s,
-or .S files to the C compiler, and any .cc, .cpp, .cxx files to the C++
-compiler.  The CC or CXX environment variables may be set to determine
-the C or C++ compiler, respectively, to use.
-	`,
-}
-
-var helpPackages = &Command{
-	UsageLine: "packages",
-	Short:     "description of package lists",
-	Long: `
-Many commands apply to a set of packages:
-
-	go action [packages]
-
-Usually, [packages] is a list of import paths.
-
-An import path that is a rooted path or that begins with
-a . or .. element is interpreted as a file system path and
-denotes the package in that directory.
-
-Otherwise, the import path P denotes the package found in
-the directory DIR/src/P for some DIR listed in the GOPATH
-environment variable (see 'go help gopath').
-
-If no import paths are given, the action applies to the
-package in the current directory.
-
-There are four reserved names for paths that should not be used
-for packages to be built with the go tool:
-
-- "main" denotes the top-level package in a stand-alone executable.
-
-- "all" expands to all package directories found in all the GOPATH
-trees. For example, 'go list all' lists all the packages on the local
-system.
-
-- "std" is like all but expands to just the packages in the standard
-Go library.
-
-- "cmd" expands to the Go repository's commands and their
-internal libraries.
-
-An import path is a pattern if it includes one or more "..." wildcards,
-each of which can match any string, including the empty string and
-strings containing slashes.  Such a pattern expands to all package
-directories found in the GOPATH trees with names matching the
-patterns.  As a special case, x/... matches x as well as x's subdirectories.
-For example, net/... expands to net and packages in its subdirectories.
-
-An import path can also name a package to be downloaded from
-a remote repository.  Run 'go help importpath' for details.
-
-Every package in a program must have a unique import path.
-By convention, this is arranged by starting each path with a
-unique prefix that belongs to you.  For example, paths used
-internally at Google all begin with 'google', and paths
-denoting remote repositories begin with the path to the code,
-such as 'github.com/user/repo'.
-
-As a special case, if the package list is a list of .go files from a
-single directory, the command is applied to a single synthesized
-package made up of exactly those files, ignoring any build constraints
-in those files and ignoring any other files in the directory.
-
-Directory and file names that begin with "." or "_" are ignored
-by the go tool, as are directories named "testdata".
-	`,
-}
-
-var helpImportPath = &Command{
-	UsageLine: "importpath",
-	Short:     "import path syntax",
-	Long: `
-
-An import path (see 'go help packages') denotes a package
-stored in the local file system.  In general, an import path denotes
-either a standard package (such as "unicode/utf8") or a package
-found in one of the work spaces (see 'go help gopath').
-
-Relative import paths
-
-An import path beginning with ./ or ../ is called a relative path.
-The toolchain supports relative import paths as a shortcut in two ways.
-
-First, a relative path can be used as a shorthand on the command line.
-If you are working in the directory containing the code imported as
-"unicode" and want to run the tests for "unicode/utf8", you can type
-"go test ./utf8" instead of needing to specify the full path.
-Similarly, in the reverse situation, "go test .." will test "unicode" from
-the "unicode/utf8" directory. Relative patterns are also allowed, like
-"go test ./..." to test all subdirectories. See 'go help packages' for details
-on the pattern syntax.
-
-Second, if you are compiling a Go program not in a work space,
-you can use a relative path in an import statement in that program
-to refer to nearby code also not in a work space.
-This makes it easy to experiment with small multipackage programs
-outside of the usual work spaces, but such programs cannot be
-installed with "go install" (there is no work space in which to install them),
-so they are rebuilt from scratch each time they are built.
-To avoid ambiguity, Go programs cannot use relative import paths
-within a work space.
-
-Remote import paths
-
-Certain import paths also
-describe how to obtain the source code for the package using
-a revision control system.
-
-A few common code hosting sites have special syntax:
-
-	Bitbucket (Git, Mercurial)
-
-		import "bitbucket.org/user/project"
-		import "bitbucket.org/user/project/sub/directory"
-
-	GitHub (Git)
-
-		import "github.com/user/project"
-		import "github.com/user/project/sub/directory"
-
-	Google Code Project Hosting (Git, Mercurial, Subversion)
-
-		import "code.google.com/p/project"
-		import "code.google.com/p/project/sub/directory"
-
-		import "code.google.com/p/project.subrepository"
-		import "code.google.com/p/project.subrepository/sub/directory"
-
-	Launchpad (Bazaar)
-
-		import "launchpad.net/project"
-		import "launchpad.net/project/series"
-		import "launchpad.net/project/series/sub/directory"
-
-		import "launchpad.net/~user/project/branch"
-		import "launchpad.net/~user/project/branch/sub/directory"
-
-	IBM DevOps Services (Git)
-
-		import "hub.jazz.net/git/user/project"
-		import "hub.jazz.net/git/user/project/sub/directory"
-
-For code hosted on other servers, import paths may either be qualified
-with the version control type, or the go tool can dynamically fetch
-the import path over https/http and discover where the code resides
-from a <meta> tag in the HTML.
-
-To declare the code location, an import path of the form
-
-	repository.vcs/path
-
-specifies the given repository, with or without the .vcs suffix,
-using the named version control system, and then the path inside
-that repository.  The supported version control systems are:
-
-	Bazaar      .bzr
-	Git         .git
-	Mercurial   .hg
-	Subversion  .svn
-
-For example,
-
-	import "example.org/user/foo.hg"
-
-denotes the root directory of the Mercurial repository at
-example.org/user/foo or foo.hg, and
-
-	import "example.org/repo.git/foo/bar"
-
-denotes the foo/bar directory of the Git repository at
-example.org/repo or repo.git.
-
-When a version control system supports multiple protocols,
-each is tried in turn when downloading.  For example, a Git
-download tries https://, then git+ssh://.
-
-If the import path is not a known code hosting site and also lacks a
-version control qualifier, the go tool attempts to fetch the import
-over https/http and looks for a <meta> tag in the document's HTML
-<head>.
-
-The meta tag has the form:
-
-	<meta name="go-import" content="import-prefix vcs repo-root">
-
-The import-prefix is the import path corresponding to the repository
-root. It must be a prefix or an exact match of the package being
-fetched with "go get". If it's not an exact match, another http
-request is made at the prefix to verify the <meta> tags match.
-
-The meta tag should appear as early in the file as possible.
-In particular, it should appear before any raw JavaScript or CSS,
-to avoid confusing the go command's restricted parser.
-
-The vcs is one of "git", "hg", "svn", etc,
-
-The repo-root is the root of the version control system
-containing a scheme and not containing a .vcs qualifier.
-
-For example,
-
-	import "example.org/pkg/foo"
-
-will result in the following requests:
-
-	https://example.org/pkg/foo?go-get=1 (preferred)
-	http://example.org/pkg/foo?go-get=1  (fallback, only with -insecure)
-
-If that page contains the meta tag
-
-	<meta name="go-import" content="example.org git https://code.org/r/p/exproj">
-
-the go tool will verify that https://example.org/?go-get=1 contains the
-same meta tag and then git clone https://code.org/r/p/exproj into
-GOPATH/src/example.org.
-
-New downloaded packages are written to the first directory
-listed in the GOPATH environment variable (see 'go help gopath').
-
-The go command attempts to download the version of the
-package appropriate for the Go release being used.
-Run 'go help get' for more.
-
-Import path checking
-
-When the custom import path feature described above redirects to a
-known code hosting site, each of the resulting packages has two possible
-import paths, using the custom domain or the known hosting site.
-
-A package statement is said to have an "import comment" if it is immediately
-followed (before the next newline) by a comment of one of these two forms:
-
-	package math // import "path"
-	package math /* import "path" */
-
-The go command will refuse to install a package with an import comment
-unless it is being referred to by that import path. In this way, import comments
-let package authors make sure the custom import path is used and not a
-direct path to the underlying code hosting site.
-
-If the vendoring experiment is enabled (see 'go help gopath'),
-then import path checking is disabled for code found within vendor trees.
-This makes it possible to copy code into alternate locations in vendor trees
-without needing to update import comments.
-
-See https://golang.org/s/go14customimport for details.
-	`,
-}
-
-var helpGopath = &Command{
-	UsageLine: "gopath",
-	Short:     "GOPATH environment variable",
-	Long: `
-The Go path is used to resolve import statements.
-It is implemented by and documented in the go/build package.
-
-The GOPATH environment variable lists places to look for Go code.
-On Unix, the value is a colon-separated string.
-On Windows, the value is a semicolon-separated string.
-On Plan 9, the value is a list.
-
-GOPATH must be set to get, build and install packages outside the
-standard Go tree.
-
-Each directory listed in GOPATH must have a prescribed structure:
-
-The src directory holds source code.  The path below src
-determines the import path or executable name.
-
-The pkg directory holds installed package objects.
-As in the Go tree, each target operating system and
-architecture pair has its own subdirectory of pkg
-(pkg/GOOS_GOARCH).
-
-If DIR is a directory listed in the GOPATH, a package with
-source in DIR/src/foo/bar can be imported as "foo/bar" and
-has its compiled form installed to "DIR/pkg/GOOS_GOARCH/foo/bar.a".
-
-The bin directory holds compiled commands.
-Each command is named for its source directory, but only
-the final element, not the entire path.  That is, the
-command with source in DIR/src/foo/quux is installed into
-DIR/bin/quux, not DIR/bin/foo/quux.  The "foo/" prefix is stripped
-so that you can add DIR/bin to your PATH to get at the
-installed commands.  If the GOBIN environment variable is
-set, commands are installed to the directory it names instead
-of DIR/bin.
-
-Here's an example directory layout:
-
-    GOPATH=/home/user/gocode
-
-    /home/user/gocode/
-        src/
-            foo/
-                bar/               (go code in package bar)
-                    x.go
-                quux/              (go code in package main)
-                    y.go
-        bin/
-            quux                   (installed command)
-        pkg/
-            linux_amd64/
-                foo/
-                    bar.a          (installed package object)
-
-Go searches each directory listed in GOPATH to find source code,
-but new packages are always downloaded into the first directory
-in the list.
-
-See https://golang.org/doc/code.html for an example.
-
-Internal Directories
-
-Code in or below a directory named "internal" is importable only
-by code in the directory tree rooted at the parent of "internal".
-Here's an extended version of the directory layout above:
-
-    /home/user/gocode/
-        src/
-            crash/
-                bang/              (go code in package bang)
-                    b.go
-            foo/                   (go code in package foo)
-                f.go
-                bar/               (go code in package bar)
-                    x.go
-                internal/
-                    baz/           (go code in package baz)
-                        z.go
-                quux/              (go code in package main)
-                    y.go
-
-
-The code in z.go is imported as "foo/internal/baz", but that
-import statement can only appear in source files in the subtree
-rooted at foo. The source files foo/f.go, foo/bar/x.go, and
-foo/quux/y.go can all import "foo/internal/baz", but the source file
-crash/bang/b.go cannot.
-
-See https://golang.org/s/go14internal for details.
-
-Vendor Directories
-
-Go 1.5 includes experimental support for using local copies
-of external dependencies to satisfy imports of those dependencies,
-often referred to as vendoring. Setting the environment variable
-GO15VENDOREXPERIMENT=1 enables that experimental support.
-
-When the vendor experiment is enabled,
-code below a directory named "vendor" is importable only
-by code in the directory tree rooted at the parent of "vendor",
-and only using an import path that omits the prefix up to and
-including the vendor element.
-
-Here's the example from the previous section,
-but with the "internal" directory renamed to "vendor"
-and a new foo/vendor/crash/bang directory added:
-
-    /home/user/gocode/
-        src/
-            crash/
-                bang/              (go code in package bang)
-                    b.go
-            foo/                   (go code in package foo)
-                f.go
-                bar/               (go code in package bar)
-                    x.go
-                vendor/
-                    crash/
-                        bang/      (go code in package bang)
-                            b.go
-                    baz/           (go code in package baz)
-                        z.go
-                quux/              (go code in package main)
-                    y.go
-
-The same visibility rules apply as for internal, but the code
-in z.go is imported as "baz", not as "foo/vendor/baz".
-
-Code in vendor directories deeper in the source tree shadows
-code in higher directories. Within the subtree rooted at foo, an import
-of "crash/bang" resolves to "foo/vendor/crash/bang", not the
-top-level "crash/bang".
-
-Code in vendor directories is not subject to import path
-checking (see 'go help importpath').
-
-When the vendor experiment is enabled, 'go get' checks out
-submodules when checking out or updating a git repository
-(see 'go help get').
-
-The vendoring semantics are an experiment, and they may change
-in future releases. Once settled, they will be on by default.
-
-See https://golang.org/s/go15vendor for details.
-	`,
-}
-
-var helpEnvironment = &Command{
-	UsageLine: "environment",
-	Short:     "environment variables",
-	Long: `
-
-The go command, and the tools it invokes, examine a few different
-environment variables. For many of these, you can see the default
-value of on your system by running 'go env NAME', where NAME is the
-name of the variable.
-
-General-purpose environment variables:
-
-	GCCGO
-		The gccgo command to run for 'go build -compiler=gccgo'.
-	GOARCH
-		The architecture, or processor, for which to compile code.
-		Examples are amd64, 386, arm, ppc64.
-	GOBIN
-		The directory where 'go install' will install a command.
-	GOOS
-		The operating system for which to compile code.
-		Examples are linux, darwin, windows, netbsd.
-	GOPATH
-		See 'go help gopath'.
-	GORACE
-		Options for the race detector.
-		See https://golang.org/doc/articles/race_detector.html.
-	GOROOT
-		The root of the go tree.
-
-Environment variables for use with cgo:
-
-	CC
-		The command to use to compile C code.
-	CGO_ENABLED
-		Whether the cgo command is supported.  Either 0 or 1.
-	CGO_CFLAGS
-		Flags that cgo will pass to the compiler when compiling
-		C code.
-	CGO_CPPFLAGS
-		Flags that cgo will pass to the compiler when compiling
-		C or C++ code.
-	CGO_CXXFLAGS
-		Flags that cgo will pass to the compiler when compiling
-		C++ code.
-	CGO_LDFLAGS
-		Flags that cgo will pass to the compiler when linking.
-	CXX
-		The command to use to compile C++ code.
-
-Architecture-specific environment variables:
-
-	GOARM
-		For GOARCH=arm, the ARM architecture for which to compile.
-		Valid values are 5, 6, 7.
-	GO386
-		For GOARCH=386, the floating point instruction set.
-		Valid values are 387, sse2.
-
-Special-purpose environment variables:
-
-	GOROOT_FINAL
-		The root of the installed Go tree, when it is
-		installed in a location other than where it is built.
-		File names in stack traces are rewritten from GOROOT to
-		GOROOT_FINAL.
-	GO15VENDOREXPERIMENT
-		Set to 1 to enable the Go 1.5 vendoring experiment.
-	GO_EXTLINK_ENABLED
-		Whether the linker should use external linking mode
-		when using -linkmode=auto with code that uses cgo.
-		Set to 0 to disable external linking mode, 1 to enable it.
-	`,
-}
-
-var helpFileType = &Command{
-	UsageLine: "filetype",
-	Short:     "file types",
-	Long: `
-The go command examines the contents of a restricted set of files
-in each directory. It identifies which files to examine based on
-the extension of the file name. These extensions are:
-
-	.go
-		Go source files.
-	.c, .h
-		C source files.
-		If the package uses cgo or SWIG, these will be compiled with the
-		OS-native compiler (typically gcc); otherwise they will
-		trigger an error.
-	.cc, .cpp, .cxx, .hh, .hpp, .hxx
-		C++ source files. Only useful with cgo or SWIG, and always
-		compiled with the OS-native compiler.
-	.m
-		Objective-C source files. Only useful with cgo, and always
-		compiled with the OS-native compiler.
-	.s, .S
-		Assembler source files.
-		If the package uses cgo or SWIG, these will be assembled with the
-		OS-native assembler (typically gcc (sic)); otherwise they
-		will be assembled with the Go assembler.
-	.swig, .swigcxx
-		SWIG definition files.
-	.syso
-		System object files.
-
-Files of each of these types except .syso may contain build
-constraints, but the go command stops scanning for build constraints
-at the first item in the file that is not a blank line or //-style
-line comment.
-	`,
-}
-
-var helpBuildmode = &Command{
-	UsageLine: "buildmode",
-	Short:     "description of build modes",
-	Long: `
-The 'go build' and 'go install' commands take a -buildmode argument which
-indicates which kind of object file is to be built. Currently supported values
-are:
-
-	-buildmode=archive
-		Build the listed non-main packages into .a files. Packages named
-		main are ignored.
-
-	-buildmode=c-archive
-		Build the listed main package, plus all packages it imports,
-		into a C archive file. The only callable symbols will be those
-		functions exported using a cgo //export comment. Requires
-		exactly one main package to be listed.
-
-	-buildmode=c-shared
-		Build the listed main packages, plus all packages that they
-		import, into C shared libraries. The only callable symbols will
-		be those functions exported using a cgo //export comment.
-		Non-main packages are ignored.
-
-	-buildmode=default
-		Listed main packages are built into executables and listed
-		non-main packages are built into .a files (the default
-		behavior).
-
-	-buildmode=shared
-		Combine all the listed non-main packages into a single shared
-		library that will be used when building with the -linkshared
-		option. Packages named main are ignored.
-
-	-buildmode=exe
-		Build the listed main packages and everything they import into
-		executables. Packages not named main are ignored.
-`,
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/http.go b/third_party/gofrontend/libgo/go/cmd/go/http.go
deleted file mode 100644
index 7979c41..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/http.go
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !cmd_go_bootstrap
-
-// This code is compiled into the real 'go' binary, but it is not
-// compiled into the binary that is built during all.bash, so as
-// to avoid needing to build net (and thus use cgo) during the
-// bootstrap process.
-
-package main
-
-import (
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	"net/http"
-	"net/url"
-	"time"
-)
-
-// httpClient is the default HTTP client, but a variable so it can be
-// changed by tests, without modifying http.DefaultClient.
-var httpClient = http.DefaultClient
-var impatientHTTPClient = &http.Client{
-	Timeout: time.Duration(5 * time.Second),
-}
-
-type httpError struct {
-	status     string
-	statusCode int
-	url        string
-}
-
-func (e *httpError) Error() string {
-	return fmt.Sprintf("%s: %s", e.url, e.status)
-}
-
-// httpGET returns the data from an HTTP GET request for the given URL.
-func httpGET(url string) ([]byte, error) {
-	resp, err := httpClient.Get(url)
-	if err != nil {
-		return nil, err
-	}
-	defer resp.Body.Close()
-	if resp.StatusCode != 200 {
-		err := &httpError{status: resp.Status, statusCode: resp.StatusCode, url: url}
-
-		return nil, err
-	}
-	b, err := ioutil.ReadAll(resp.Body)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %v", url, err)
-	}
-	return b, nil
-}
-
-// httpsOrHTTP returns the body of either the importPath's
-// https resource or, if unavailable, the http resource.
-func httpsOrHTTP(importPath string, security securityMode) (urlStr string, body io.ReadCloser, err error) {
-	fetch := func(scheme string) (urlStr string, res *http.Response, err error) {
-		u, err := url.Parse(scheme + "://" + importPath)
-		if err != nil {
-			return "", nil, err
-		}
-		u.RawQuery = "go-get=1"
-		urlStr = u.String()
-		if buildV {
-			log.Printf("Fetching %s", urlStr)
-		}
-		if security == insecure && scheme == "https" { // fail earlier
-			res, err = impatientHTTPClient.Get(urlStr)
-		} else {
-			res, err = httpClient.Get(urlStr)
-		}
-		return
-	}
-	closeBody := func(res *http.Response) {
-		if res != nil {
-			res.Body.Close()
-		}
-	}
-	urlStr, res, err := fetch("https")
-	if err != nil || res.StatusCode != 200 {
-		if buildV {
-			if err != nil {
-				log.Printf("https fetch failed.")
-			} else {
-				log.Printf("ignoring https fetch with status code %d", res.StatusCode)
-			}
-		}
-		closeBody(res)
-		if security == insecure {
-			urlStr, res, err = fetch("http")
-		}
-	}
-	if err != nil {
-		closeBody(res)
-		return "", nil, err
-	}
-	// Note: accepting a non-200 OK here, so people can serve a
-	// meta import in their http 404 page.
-	if buildV {
-		log.Printf("Parsing meta tags from %s (status code %d)", urlStr, res.StatusCode)
-	}
-	return urlStr, res.Body, nil
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/list.go b/third_party/gofrontend/libgo/go/cmd/go/list.go
deleted file mode 100644
index 35c7cc4..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/list.go
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bufio"
-	"encoding/json"
-	"io"
-	"os"
-	"strings"
-	"text/template"
-)
-
-var cmdList = &Command{
-	UsageLine: "list [-e] [-f format] [-json] [build flags] [packages]",
-	Short:     "list packages",
-	Long: `
-List lists the packages named by the import paths, one per line.
-
-The default output shows the package import path:
-
-    bytes
-    encoding/json
-    github.com/gorilla/mux
-    golang.org/x/net/html
-
-The -f flag specifies an alternate format for the list, using the
-syntax of package template.  The default output is equivalent to -f
-'{{.ImportPath}}'. The struct being passed to the template is:
-
-    type Package struct {
-        Dir           string // directory containing package sources
-        ImportPath    string // import path of package in dir
-        ImportComment string // path in import comment on package statement
-        Name          string // package name
-        Doc           string // package documentation string
-        Target        string // install path
-        Shlib         string // the shared library that contains this package (only set when -linkshared)
-        Goroot        bool   // is this package in the Go root?
-        Standard      bool   // is this package part of the standard Go library?
-        Stale         bool   // would 'go install' do anything for this package?
-        Root          string // Go root or Go path dir containing this package
-
-        // Source files
-        GoFiles        []string // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
-        CgoFiles       []string // .go sources files that import "C"
-        IgnoredGoFiles []string // .go sources ignored due to build constraints
-        CFiles         []string // .c source files
-        CXXFiles       []string // .cc, .cxx and .cpp source files
-        MFiles         []string // .m source files
-        HFiles         []string // .h, .hh, .hpp and .hxx source files
-        SFiles         []string // .s source files
-        SwigFiles      []string // .swig files
-        SwigCXXFiles   []string // .swigcxx files
-        SysoFiles      []string // .syso object files to add to archive
-
-        // Cgo directives
-        CgoCFLAGS    []string // cgo: flags for C compiler
-        CgoCPPFLAGS  []string // cgo: flags for C preprocessor
-        CgoCXXFLAGS  []string // cgo: flags for C++ compiler
-        CgoLDFLAGS   []string // cgo: flags for linker
-        CgoPkgConfig []string // cgo: pkg-config names
-
-        // Dependency information
-        Imports []string // import paths used by this package
-        Deps    []string // all (recursively) imported dependencies
-
-        // Error information
-        Incomplete bool            // this package or a dependency has an error
-        Error      *PackageError   // error loading package
-        DepsErrors []*PackageError // errors loading dependencies
-
-        TestGoFiles  []string // _test.go files in package
-        TestImports  []string // imports from TestGoFiles
-        XTestGoFiles []string // _test.go files outside package
-        XTestImports []string // imports from XTestGoFiles
-    }
-
-The template function "join" calls strings.Join.
-
-The template function "context" returns the build context, defined as:
-
-	type Context struct {
-		GOARCH        string   // target architecture
-		GOOS          string   // target operating system
-		GOROOT        string   // Go root
-		GOPATH        string   // Go path
-		CgoEnabled    bool     // whether cgo can be used
-		UseAllFiles   bool     // use files regardless of +build lines, file names
-		Compiler      string   // compiler to assume when computing target paths
-		BuildTags     []string // build constraints to match in +build lines
-		ReleaseTags   []string // releases the current release is compatible with
-		InstallSuffix string   // suffix to use in the name of the install dir
-	}
-
-For more information about the meaning of these fields see the documentation
-for the go/build package's Context type.
-
-The -json flag causes the package data to be printed in JSON format
-instead of using the template format.
-
-The -e flag changes the handling of erroneous packages, those that
-cannot be found or are malformed.  By default, the list command
-prints an error to standard error for each erroneous package and
-omits the packages from consideration during the usual printing.
-With the -e flag, the list command never prints errors to standard
-error and instead processes the erroneous packages with the usual
-printing.  Erroneous packages will have a non-empty ImportPath and
-a non-nil Error field; other information may or may not be missing
-(zeroed).
-
-For more about build flags, see 'go help build'.
-
-For more about specifying packages, see 'go help packages'.
-	`,
-}
-
-func init() {
-	cmdList.Run = runList // break init cycle
-	addBuildFlags(cmdList)
-}
-
-var listE = cmdList.Flag.Bool("e", false, "")
-var listFmt = cmdList.Flag.String("f", "{{.ImportPath}}", "")
-var listJson = cmdList.Flag.Bool("json", false, "")
-var nl = []byte{'\n'}
-
-func runList(cmd *Command, args []string) {
-	buildModeInit()
-	out := newTrackingWriter(os.Stdout)
-	defer out.w.Flush()
-
-	var do func(*Package)
-	if *listJson {
-		do = func(p *Package) {
-			b, err := json.MarshalIndent(p, "", "\t")
-			if err != nil {
-				out.Flush()
-				fatalf("%s", err)
-			}
-			out.Write(b)
-			out.Write(nl)
-		}
-	} else {
-		var cachedCtxt *Context
-		context := func() *Context {
-			if cachedCtxt == nil {
-				cachedCtxt = newContext(&buildContext)
-			}
-			return cachedCtxt
-		}
-		fm := template.FuncMap{
-			"join":    strings.Join,
-			"context": context,
-		}
-		tmpl, err := template.New("main").Funcs(fm).Parse(*listFmt)
-		if err != nil {
-			fatalf("%s", err)
-		}
-		do = func(p *Package) {
-			if err := tmpl.Execute(out, p); err != nil {
-				out.Flush()
-				fatalf("%s", err)
-			}
-			if out.NeedNL() {
-				out.Write(nl)
-			}
-		}
-	}
-
-	load := packages
-	if *listE {
-		load = packagesAndErrors
-	}
-
-	for _, pkg := range load(args) {
-		// Show vendor-expanded paths in listing
-		pkg.TestImports = pkg.vendored(pkg.TestImports)
-		pkg.XTestImports = pkg.vendored(pkg.XTestImports)
-
-		do(pkg)
-	}
-}
-
-// TrackingWriter tracks the last byte written on every write so
-// we can avoid printing a newline if one was already written or
-// if there is no output at all.
-type TrackingWriter struct {
-	w    *bufio.Writer
-	last byte
-}
-
-func newTrackingWriter(w io.Writer) *TrackingWriter {
-	return &TrackingWriter{
-		w:    bufio.NewWriter(w),
-		last: '\n',
-	}
-}
-
-func (t *TrackingWriter) Write(p []byte) (n int, err error) {
-	n, err = t.w.Write(p)
-	if n > 0 {
-		t.last = p[n-1]
-	}
-	return
-}
-
-func (t *TrackingWriter) Flush() {
-	t.w.Flush()
-}
-
-func (t *TrackingWriter) NeedNL() bool {
-	return t.last != '\n'
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/main.go b/third_party/gofrontend/libgo/go/cmd/go/main.go
deleted file mode 100644
index 8ebde89..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/main.go
+++ /dev/null
@@ -1,761 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bufio"
-	"bytes"
-	"flag"
-	"fmt"
-	"go/build"
-	"io"
-	"log"
-	"os"
-	"os/exec"
-	"path"
-	"path/filepath"
-	"regexp"
-	"runtime"
-	"strings"
-	"sync"
-	"text/template"
-	"unicode"
-	"unicode/utf8"
-)
-
-// A Command is an implementation of a go command
-// like go build or go fix.
-type Command struct {
-	// Run runs the command.
-	// The args are the arguments after the command name.
-	Run func(cmd *Command, args []string)
-
-	// UsageLine is the one-line usage message.
-	// The first word in the line is taken to be the command name.
-	UsageLine string
-
-	// Short is the short description shown in the 'go help' output.
-	Short string
-
-	// Long is the long message shown in the 'go help <this-command>' output.
-	Long string
-
-	// Flag is a set of flags specific to this command.
-	Flag flag.FlagSet
-
-	// CustomFlags indicates that the command will do its own
-	// flag parsing.
-	CustomFlags bool
-}
-
-// Name returns the command's name: the first word in the usage line.
-func (c *Command) Name() string {
-	name := c.UsageLine
-	i := strings.Index(name, " ")
-	if i >= 0 {
-		name = name[:i]
-	}
-	return name
-}
-
-func (c *Command) Usage() {
-	fmt.Fprintf(os.Stderr, "usage: %s\n\n", c.UsageLine)
-	fmt.Fprintf(os.Stderr, "%s\n", strings.TrimSpace(c.Long))
-	os.Exit(2)
-}
-
-// Runnable reports whether the command can be run; otherwise
-// it is a documentation pseudo-command such as importpath.
-func (c *Command) Runnable() bool {
-	return c.Run != nil
-}
-
-// Commands lists the available commands and help topics.
-// The order here is the order in which they are printed by 'go help'.
-var commands = []*Command{
-	cmdBuild,
-	cmdClean,
-	cmdDoc,
-	cmdEnv,
-	cmdFix,
-	cmdFmt,
-	cmdGenerate,
-	cmdGet,
-	cmdInstall,
-	cmdList,
-	cmdRun,
-	cmdTest,
-	cmdTool,
-	cmdVersion,
-	cmdVet,
-
-	helpC,
-	helpBuildmode,
-	helpFileType,
-	helpGopath,
-	helpEnvironment,
-	helpImportPath,
-	helpPackages,
-	helpTestflag,
-	helpTestfunc,
-}
-
-var exitStatus = 0
-var exitMu sync.Mutex
-
-func setExitStatus(n int) {
-	exitMu.Lock()
-	if exitStatus < n {
-		exitStatus = n
-	}
-	exitMu.Unlock()
-}
-
-var origEnv []string
-
-func main() {
-	_ = go11tag
-	flag.Usage = usage
-	flag.Parse()
-	log.SetFlags(0)
-
-	args := flag.Args()
-	if len(args) < 1 {
-		usage()
-	}
-
-	if args[0] == "help" {
-		help(args[1:])
-		return
-	}
-
-	// Diagnose common mistake: GOPATH==GOROOT.
-	// This setting is equivalent to not setting GOPATH at all,
-	// which is not what most people want when they do it.
-	if gopath := os.Getenv("GOPATH"); gopath == runtime.GOROOT() {
-		fmt.Fprintf(os.Stderr, "warning: GOPATH set to GOROOT (%s) has no effect\n", gopath)
-	} else {
-		for _, p := range filepath.SplitList(gopath) {
-			// Note: using HasPrefix instead of Contains because a ~ can appear
-			// in the middle of directory elements, such as /tmp/git-1.8.2~rc3
-			// or C:\PROGRA~1. Only ~ as a path prefix has meaning to the shell.
-			if strings.HasPrefix(p, "~") {
-				fmt.Fprintf(os.Stderr, "go: GOPATH entry cannot start with shell metacharacter '~': %q\n", p)
-				os.Exit(2)
-			}
-			if !filepath.IsAbs(p) {
-				fmt.Fprintf(os.Stderr, "go: GOPATH entry is relative; must be absolute path: %q.\nRun 'go help gopath' for usage.\n", p)
-				os.Exit(2)
-			}
-		}
-	}
-
-	if fi, err := os.Stat(goroot); err != nil || !fi.IsDir() {
-		fmt.Fprintf(os.Stderr, "go: cannot find GOROOT directory: %v\n", goroot)
-		os.Exit(2)
-	}
-
-	// Set environment (GOOS, GOARCH, etc) explicitly.
-	// In theory all the commands we invoke should have
-	// the same default computation of these as we do,
-	// but in practice there might be skew
-	// This makes sure we all agree.
-	origEnv = os.Environ()
-	for _, env := range mkEnv() {
-		if os.Getenv(env.name) != env.value {
-			os.Setenv(env.name, env.value)
-		}
-	}
-
-	for _, cmd := range commands {
-		if cmd.Name() == args[0] && cmd.Runnable() {
-			cmd.Flag.Usage = func() { cmd.Usage() }
-			if cmd.CustomFlags {
-				args = args[1:]
-			} else {
-				cmd.Flag.Parse(args[1:])
-				args = cmd.Flag.Args()
-			}
-			cmd.Run(cmd, args)
-			exit()
-			return
-		}
-	}
-
-	fmt.Fprintf(os.Stderr, "go: unknown subcommand %q\nRun 'go help' for usage.\n", args[0])
-	setExitStatus(2)
-	exit()
-}
-
-var usageTemplate = `Go is a tool for managing Go source code.
-
-Usage:
-
-	go command [arguments]
-
-The commands are:
-{{range .}}{{if .Runnable}}
-	{{.Name | printf "%-11s"}} {{.Short}}{{end}}{{end}}
-
-Use "go help [command]" for more information about a command.
-
-Additional help topics:
-{{range .}}{{if not .Runnable}}
-	{{.Name | printf "%-11s"}} {{.Short}}{{end}}{{end}}
-
-Use "go help [topic]" for more information about that topic.
-
-`
-
-var helpTemplate = `{{if .Runnable}}usage: go {{.UsageLine}}
-
-{{end}}{{.Long | trim}}
-`
-
-var documentationTemplate = `// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// DO NOT EDIT THIS FILE. GENERATED BY mkalldocs.sh.
-// Edit the documentation in other files and rerun mkalldocs.sh to generate this one.
-
-/*
-{{range .}}{{if .Short}}{{.Short | capitalize}}
-
-{{end}}{{if .Runnable}}Usage:
-
-	go {{.UsageLine}}
-
-{{end}}{{.Long | trim}}
-
-
-{{end}}*/
-package main
-`
-
-// An errWriter wraps a writer, recording whether a write error occurred.
-type errWriter struct {
-	w   io.Writer
-	err error
-}
-
-func (w *errWriter) Write(b []byte) (int, error) {
-	n, err := w.w.Write(b)
-	if err != nil {
-		w.err = err
-	}
-	return n, err
-}
-
-// tmpl executes the given template text on data, writing the result to w.
-func tmpl(w io.Writer, text string, data interface{}) {
-	t := template.New("top")
-	t.Funcs(template.FuncMap{"trim": strings.TrimSpace, "capitalize": capitalize})
-	template.Must(t.Parse(text))
-	ew := &errWriter{w: w}
-	err := t.Execute(ew, data)
-	if ew.err != nil {
-		// I/O error writing. Ignore write on closed pipe.
-		if strings.Contains(ew.err.Error(), "pipe") {
-			os.Exit(1)
-		}
-		fatalf("writing output: %v", ew.err)
-	}
-	if err != nil {
-		panic(err)
-	}
-}
-
-func capitalize(s string) string {
-	if s == "" {
-		return s
-	}
-	r, n := utf8.DecodeRuneInString(s)
-	return string(unicode.ToTitle(r)) + s[n:]
-}
-
-func printUsage(w io.Writer) {
-	bw := bufio.NewWriter(w)
-	tmpl(bw, usageTemplate, commands)
-	bw.Flush()
-}
-
-func usage() {
-	// special case "go test -h"
-	if len(os.Args) > 1 && os.Args[1] == "test" {
-		os.Stdout.WriteString(testUsage + "\n\n" +
-			strings.TrimSpace(testFlag1) + "\n\n" +
-			strings.TrimSpace(testFlag2) + "\n")
-		os.Exit(2)
-	}
-	printUsage(os.Stderr)
-	os.Exit(2)
-}
-
-// help implements the 'help' command.
-func help(args []string) {
-	if len(args) == 0 {
-		printUsage(os.Stdout)
-		// not exit 2: succeeded at 'go help'.
-		return
-	}
-	if len(args) != 1 {
-		fmt.Fprintf(os.Stderr, "usage: go help command\n\nToo many arguments given.\n")
-		os.Exit(2) // failed at 'go help'
-	}
-
-	arg := args[0]
-
-	// 'go help documentation' generates doc.go.
-	if arg == "documentation" {
-		buf := new(bytes.Buffer)
-		printUsage(buf)
-		usage := &Command{Long: buf.String()}
-		tmpl(os.Stdout, documentationTemplate, append([]*Command{usage}, commands...))
-		return
-	}
-
-	for _, cmd := range commands {
-		if cmd.Name() == arg {
-			tmpl(os.Stdout, helpTemplate, cmd)
-			// not exit 2: succeeded at 'go help cmd'.
-			return
-		}
-	}
-
-	fmt.Fprintf(os.Stderr, "Unknown help topic %#q.  Run 'go help'.\n", arg)
-	os.Exit(2) // failed at 'go help cmd'
-}
-
-// importPathsNoDotExpansion returns the import paths to use for the given
-// command line, but it does no ... expansion.
-func importPathsNoDotExpansion(args []string) []string {
-	if len(args) == 0 {
-		return []string{"."}
-	}
-	var out []string
-	for _, a := range args {
-		// Arguments are supposed to be import paths, but
-		// as a courtesy to Windows developers, rewrite \ to /
-		// in command-line arguments.  Handles .\... and so on.
-		if filepath.Separator == '\\' {
-			a = strings.Replace(a, `\`, `/`, -1)
-		}
-
-		// Put argument in canonical form, but preserve leading ./.
-		if strings.HasPrefix(a, "./") {
-			a = "./" + path.Clean(a)
-			if a == "./." {
-				a = "."
-			}
-		} else {
-			a = path.Clean(a)
-		}
-		if a == "all" || a == "std" || a == "cmd" {
-			out = append(out, allPackages(a)...)
-			continue
-		}
-		out = append(out, a)
-	}
-	return out
-}
-
-// importPaths returns the import paths to use for the given command line.
-func importPaths(args []string) []string {
-	args = importPathsNoDotExpansion(args)
-	var out []string
-	for _, a := range args {
-		if strings.Contains(a, "...") {
-			if build.IsLocalImport(a) {
-				out = append(out, allPackagesInFS(a)...)
-			} else {
-				out = append(out, allPackages(a)...)
-			}
-			continue
-		}
-		out = append(out, a)
-	}
-	return out
-}
-
-var atexitFuncs []func()
-
-func atexit(f func()) {
-	atexitFuncs = append(atexitFuncs, f)
-}
-
-func exit() {
-	for _, f := range atexitFuncs {
-		f()
-	}
-	os.Exit(exitStatus)
-}
-
-func fatalf(format string, args ...interface{}) {
-	errorf(format, args...)
-	exit()
-}
-
-func errorf(format string, args ...interface{}) {
-	log.Printf(format, args...)
-	setExitStatus(1)
-}
-
-var logf = log.Printf
-
-func exitIfErrors() {
-	if exitStatus != 0 {
-		exit()
-	}
-}
-
-func run(cmdargs ...interface{}) {
-	cmdline := stringList(cmdargs...)
-	if buildN || buildX {
-		fmt.Printf("%s\n", strings.Join(cmdline, " "))
-		if buildN {
-			return
-		}
-	}
-
-	cmd := exec.Command(cmdline[0], cmdline[1:]...)
-	cmd.Stdout = os.Stdout
-	cmd.Stderr = os.Stderr
-	if err := cmd.Run(); err != nil {
-		errorf("%v", err)
-	}
-}
-
-func runOut(dir string, cmdargs ...interface{}) []byte {
-	cmdline := stringList(cmdargs...)
-	cmd := exec.Command(cmdline[0], cmdline[1:]...)
-	cmd.Dir = dir
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		os.Stderr.Write(out)
-		errorf("%v", err)
-		out = nil
-	}
-	return out
-}
-
-// envForDir returns a copy of the environment
-// suitable for running in the given directory.
-// The environment is the current process's environment
-// but with an updated $PWD, so that an os.Getwd in the
-// child will be faster.
-func envForDir(dir string, base []string) []string {
-	// Internally we only use rooted paths, so dir is rooted.
-	// Even if dir is not rooted, no harm done.
-	return mergeEnvLists([]string{"PWD=" + dir}, base)
-}
-
-// mergeEnvLists merges the two environment lists such that
-// variables with the same name in "in" replace those in "out".
-func mergeEnvLists(in, out []string) []string {
-NextVar:
-	for _, inkv := range in {
-		k := strings.SplitAfterN(inkv, "=", 2)[0]
-		for i, outkv := range out {
-			if strings.HasPrefix(outkv, k) {
-				out[i] = inkv
-				continue NextVar
-			}
-		}
-		out = append(out, inkv)
-	}
-	return out
-}
-
-// matchPattern(pattern)(name) reports whether
-// name matches pattern.  Pattern is a limited glob
-// pattern in which '...' means 'any string' and there
-// is no other special syntax.
-func matchPattern(pattern string) func(name string) bool {
-	re := regexp.QuoteMeta(pattern)
-	re = strings.Replace(re, `\.\.\.`, `.*`, -1)
-	// Special case: foo/... matches foo too.
-	if strings.HasSuffix(re, `/.*`) {
-		re = re[:len(re)-len(`/.*`)] + `(/.*)?`
-	}
-	reg := regexp.MustCompile(`^` + re + `$`)
-	return func(name string) bool {
-		return reg.MatchString(name)
-	}
-}
-
-// hasPathPrefix reports whether the path s begins with the
-// elements in prefix.
-func hasPathPrefix(s, prefix string) bool {
-	switch {
-	default:
-		return false
-	case len(s) == len(prefix):
-		return s == prefix
-	case len(s) > len(prefix):
-		if prefix != "" && prefix[len(prefix)-1] == '/' {
-			return strings.HasPrefix(s, prefix)
-		}
-		return s[len(prefix)] == '/' && s[:len(prefix)] == prefix
-	}
-}
-
-// hasFilePathPrefix reports whether the filesystem path s begins with the
-// elements in prefix.
-func hasFilePathPrefix(s, prefix string) bool {
-	sv := strings.ToUpper(filepath.VolumeName(s))
-	pv := strings.ToUpper(filepath.VolumeName(prefix))
-	s = s[len(sv):]
-	prefix = prefix[len(pv):]
-	switch {
-	default:
-		return false
-	case sv != pv:
-		return false
-	case len(s) == len(prefix):
-		return s == prefix
-	case len(s) > len(prefix):
-		if prefix != "" && prefix[len(prefix)-1] == filepath.Separator {
-			return strings.HasPrefix(s, prefix)
-		}
-		return s[len(prefix)] == filepath.Separator && s[:len(prefix)] == prefix
-	}
-}
-
-// treeCanMatchPattern(pattern)(name) reports whether
-// name or children of name can possibly match pattern.
-// Pattern is the same limited glob accepted by matchPattern.
-func treeCanMatchPattern(pattern string) func(name string) bool {
-	wildCard := false
-	if i := strings.Index(pattern, "..."); i >= 0 {
-		wildCard = true
-		pattern = pattern[:i]
-	}
-	return func(name string) bool {
-		return len(name) <= len(pattern) && hasPathPrefix(pattern, name) ||
-			wildCard && strings.HasPrefix(name, pattern)
-	}
-}
-
-// allPackages returns all the packages that can be found
-// under the $GOPATH directories and $GOROOT matching pattern.
-// The pattern is either "all" (all packages), "std" (standard packages),
-// "cmd" (standard commands), or a path including "...".
-func allPackages(pattern string) []string {
-	pkgs := matchPackages(pattern)
-	if len(pkgs) == 0 {
-		fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
-	}
-	return pkgs
-}
-
-func matchPackages(pattern string) []string {
-	match := func(string) bool { return true }
-	treeCanMatch := func(string) bool { return true }
-	if pattern != "all" && pattern != "std" && pattern != "cmd" {
-		match = matchPattern(pattern)
-		treeCanMatch = treeCanMatchPattern(pattern)
-	}
-
-	have := map[string]bool{
-		"builtin": true, // ignore pseudo-package that exists only for documentation
-	}
-	if !buildContext.CgoEnabled {
-		have["runtime/cgo"] = true // ignore during walk
-	}
-	var pkgs []string
-
-	for _, src := range buildContext.SrcDirs() {
-		if (pattern == "std" || pattern == "cmd") && src != gorootSrc {
-			continue
-		}
-		src = filepath.Clean(src) + string(filepath.Separator)
-		root := src
-		if pattern == "cmd" {
-			root += "cmd" + string(filepath.Separator)
-		}
-		filepath.Walk(root, func(path string, fi os.FileInfo, err error) error {
-			if err != nil || !fi.IsDir() || path == src {
-				return nil
-			}
-
-			// Avoid .foo, _foo, and testdata directory trees.
-			_, elem := filepath.Split(path)
-			if strings.HasPrefix(elem, ".") || strings.HasPrefix(elem, "_") || elem == "testdata" {
-				return filepath.SkipDir
-			}
-
-			name := filepath.ToSlash(path[len(src):])
-			if pattern == "std" && (strings.Contains(name, ".") || name == "cmd") {
-				// The name "std" is only the standard library.
-				// If the name has a dot, assume it's a domain name for go get,
-				// and if the name is cmd, it's the root of the command tree.
-				return filepath.SkipDir
-			}
-			if !treeCanMatch(name) {
-				return filepath.SkipDir
-			}
-			if have[name] {
-				return nil
-			}
-			have[name] = true
-			if !match(name) {
-				return nil
-			}
-			_, err = buildContext.ImportDir(path, 0)
-			if err != nil {
-				if _, noGo := err.(*build.NoGoError); noGo {
-					return nil
-				}
-			}
-			pkgs = append(pkgs, name)
-			return nil
-		})
-	}
-	return pkgs
-}
-
-// allPackagesInFS is like allPackages but is passed a pattern
-// beginning ./ or ../, meaning it should scan the tree rooted
-// at the given directory.  There are ... in the pattern too.
-func allPackagesInFS(pattern string) []string {
-	pkgs := matchPackagesInFS(pattern)
-	if len(pkgs) == 0 {
-		fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
-	}
-	return pkgs
-}
-
-func matchPackagesInFS(pattern string) []string {
-	// Find directory to begin the scan.
-	// Could be smarter but this one optimization
-	// is enough for now, since ... is usually at the
-	// end of a path.
-	i := strings.Index(pattern, "...")
-	dir, _ := path.Split(pattern[:i])
-
-	// pattern begins with ./ or ../.
-	// path.Clean will discard the ./ but not the ../.
-	// We need to preserve the ./ for pattern matching
-	// and in the returned import paths.
-	prefix := ""
-	if strings.HasPrefix(pattern, "./") {
-		prefix = "./"
-	}
-	match := matchPattern(pattern)
-
-	var pkgs []string
-	filepath.Walk(dir, func(path string, fi os.FileInfo, err error) error {
-		if err != nil || !fi.IsDir() {
-			return nil
-		}
-		if path == dir {
-			// filepath.Walk starts at dir and recurses. For the recursive case,
-			// the path is the result of filepath.Join, which calls filepath.Clean.
-			// The initial case is not Cleaned, though, so we do this explicitly.
-			//
-			// This converts a path like "./io/" to "io". Without this step, running
-			// "cd $GOROOT/src; go list ./io/..." would incorrectly skip the io
-			// package, because prepending the prefix "./" to the unclean path would
-			// result in "././io", and match("././io") returns false.
-			path = filepath.Clean(path)
-		}
-
-		// Avoid .foo, _foo, and testdata directory trees, but do not avoid "." or "..".
-		_, elem := filepath.Split(path)
-		dot := strings.HasPrefix(elem, ".") && elem != "." && elem != ".."
-		if dot || strings.HasPrefix(elem, "_") || elem == "testdata" {
-			return filepath.SkipDir
-		}
-
-		name := prefix + filepath.ToSlash(path)
-		if !match(name) {
-			return nil
-		}
-		if _, err = build.ImportDir(path, 0); err != nil {
-			if _, noGo := err.(*build.NoGoError); !noGo {
-				log.Print(err)
-			}
-			return nil
-		}
-		pkgs = append(pkgs, name)
-		return nil
-	})
-	return pkgs
-}
-
-// stringList's arguments should be a sequence of string or []string values.
-// stringList flattens them into a single []string.
-func stringList(args ...interface{}) []string {
-	var x []string
-	for _, arg := range args {
-		switch arg := arg.(type) {
-		case []string:
-			x = append(x, arg...)
-		case string:
-			x = append(x, arg)
-		default:
-			panic("stringList: invalid argument of type " + fmt.Sprintf("%T", arg))
-		}
-	}
-	return x
-}
-
-// toFold returns a string with the property that
-//	strings.EqualFold(s, t) iff toFold(s) == toFold(t)
-// This lets us test a large set of strings for fold-equivalent
-// duplicates without making a quadratic number of calls
-// to EqualFold. Note that strings.ToUpper and strings.ToLower
-// have the desired property in some corner cases.
-func toFold(s string) string {
-	// Fast path: all ASCII, no upper case.
-	// Most paths look like this already.
-	for i := 0; i < len(s); i++ {
-		c := s[i]
-		if c >= utf8.RuneSelf || 'A' <= c && c <= 'Z' {
-			goto Slow
-		}
-	}
-	return s
-
-Slow:
-	var buf bytes.Buffer
-	for _, r := range s {
-		// SimpleFold(x) cycles to the next equivalent rune > x
-		// or wraps around to smaller values. Iterate until it wraps,
-		// and we've found the minimum value.
-		for {
-			r0 := r
-			r = unicode.SimpleFold(r0)
-			if r <= r0 {
-				break
-			}
-		}
-		// Exception to allow fast path above: A-Z => a-z
-		if 'A' <= r && r <= 'Z' {
-			r += 'a' - 'A'
-		}
-		buf.WriteRune(r)
-	}
-	return buf.String()
-}
-
-// foldDup reports a pair of strings from the list that are
-// equal according to strings.EqualFold.
-// It returns "", "" if there are no such strings.
-func foldDup(list []string) (string, string) {
-	clash := map[string]string{}
-	for _, s := range list {
-		fold := toFold(s)
-		if t := clash[fold]; t != "" {
-			if s > t {
-				s, t = t, s
-			}
-			return s, t
-		}
-		clash[fold] = s
-	}
-	return "", ""
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/match_test.go b/third_party/gofrontend/libgo/go/cmd/go/match_test.go
deleted file mode 100644
index 38b9b11..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/match_test.go
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "testing"
-
-var matchPatternTests = []stringPairTest{
-	{"...", "foo", true},
-	{"net", "net", true},
-	{"net", "net/http", false},
-	{"net/http", "net", false},
-	{"net/http", "net/http", true},
-	{"net...", "netchan", true},
-	{"net...", "net", true},
-	{"net...", "net/http", true},
-	{"net...", "not/http", false},
-	{"net/...", "netchan", false},
-	{"net/...", "net", true},
-	{"net/...", "net/http", true},
-	{"net/...", "not/http", false},
-}
-
-func TestMatchPattern(t *testing.T) {
-	testStringPairs(t, "matchPattern", matchPatternTests, func(pattern, name string) bool {
-		return matchPattern(pattern)(name)
-	})
-}
-
-var treeCanMatchPatternTests = []stringPairTest{
-	{"...", "foo", true},
-	{"net", "net", true},
-	{"net", "net/http", false},
-	{"net/http", "net", true},
-	{"net/http", "net/http", true},
-	{"net...", "netchan", true},
-	{"net...", "net", true},
-	{"net...", "net/http", true},
-	{"net...", "not/http", false},
-	{"net/...", "netchan", false},
-	{"net/...", "net", true},
-	{"net/...", "net/http", true},
-	{"net/...", "not/http", false},
-	{"abc.../def", "abcxyz", true},
-	{"abc.../def", "xyxabc", false},
-	{"x/y/z/...", "x", true},
-	{"x/y/z/...", "x/y", true},
-	{"x/y/z/...", "x/y/z", true},
-	{"x/y/z/...", "x/y/z/w", true},
-	{"x/y/z", "x", true},
-	{"x/y/z", "x/y", true},
-	{"x/y/z", "x/y/z", true},
-	{"x/y/z", "x/y/z/w", false},
-	{"x/.../y/z", "x/a/b/c", true},
-	{"x/.../y/z", "y/x/a/b/c", false},
-}
-
-func TestChildrenCanMatchPattern(t *testing.T) {
-	testStringPairs(t, "treeCanMatchPattern", treeCanMatchPatternTests, func(pattern, name string) bool {
-		return treeCanMatchPattern(pattern)(name)
-	})
-}
-
-var hasPathPrefixTests = []stringPairTest{
-	{"abc", "a", false},
-	{"a/bc", "a", true},
-	{"a", "a", true},
-	{"a/bc", "a/", true},
-}
-
-func TestHasPathPrefix(t *testing.T) {
-	testStringPairs(t, "hasPathPrefix", hasPathPrefixTests, hasPathPrefix)
-}
-
-type stringPairTest struct {
-	in1 string
-	in2 string
-	out bool
-}
-
-func testStringPairs(t *testing.T, name string, tests []stringPairTest, f func(string, string) bool) {
-	for _, tt := range tests {
-		if out := f(tt.in1, tt.in2); out != tt.out {
-			t.Errorf("%s(%q, %q) = %v, want %v", name, tt.in1, tt.in2, out, tt.out)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/mkdoc.sh b/third_party/gofrontend/libgo/go/cmd/go/mkdoc.sh
deleted file mode 100755
index 12fd7ba..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/mkdoc.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-# Copyright 2012 The Go Authors.  All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-go install # So the next line will produce updated documentation.
-go help documentation > doc.go
-gofmt -w doc.go
-
diff --git a/third_party/gofrontend/libgo/go/cmd/go/note.go b/third_party/gofrontend/libgo/go/cmd/go/note.go
deleted file mode 100644
index 97e1865..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/note.go
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bytes"
-	"debug/elf"
-	"encoding/binary"
-	"fmt"
-	"io"
-	"os"
-)
-
-func readAligned4(r io.Reader, sz int32) ([]byte, error) {
-	full := (sz + 3) &^ 3
-	data := make([]byte, full)
-	_, err := io.ReadFull(r, data)
-	if err != nil {
-		return nil, err
-	}
-	data = data[:sz]
-	return data, nil
-}
-
-func readELFNote(filename, name string, typ int32) ([]byte, error) {
-	f, err := elf.Open(filename)
-	if err != nil {
-		return nil, err
-	}
-	for _, sect := range f.Sections {
-		if sect.Type != elf.SHT_NOTE {
-			continue
-		}
-		r := sect.Open()
-		for {
-			var namesize, descsize, noteType int32
-			err = binary.Read(r, f.ByteOrder, &namesize)
-			if err != nil {
-				if err == io.EOF {
-					break
-				}
-				return nil, fmt.Errorf("read namesize failed: %v", err)
-			}
-			err = binary.Read(r, f.ByteOrder, &descsize)
-			if err != nil {
-				return nil, fmt.Errorf("read descsize failed: %v", err)
-			}
-			err = binary.Read(r, f.ByteOrder, &noteType)
-			if err != nil {
-				return nil, fmt.Errorf("read type failed: %v", err)
-			}
-			noteName, err := readAligned4(r, namesize)
-			if err != nil {
-				return nil, fmt.Errorf("read name failed: %v", err)
-			}
-			desc, err := readAligned4(r, descsize)
-			if err != nil {
-				return nil, fmt.Errorf("read desc failed: %v", err)
-			}
-			if name == string(noteName) && typ == noteType {
-				return desc, nil
-			}
-		}
-	}
-	return nil, nil
-}
-
-var elfGoNote = []byte("Go\x00\x00")
-
-// readELFGoBuildID the Go build ID string from an ELF binary.
-// The Go build ID is stored in a note described by an ELF PT_NOTE prog header.
-// The caller has already opened filename, to get f, and read the first 4 kB out, in data.
-func readELFGoBuildID(filename string, f *os.File, data []byte) (buildid string, err error) {
-	// Assume the note content is in the first 4 kB, already read.
-	// Rewrite the ELF header to set shnum to 0, so that we can pass
-	// the data to elf.NewFile and it will decode the Prog list but not
-	// try to read the section headers and the string table from disk.
-	// That's a waste of I/O when all we care about is the Prog list
-	// and the one ELF note.
-	switch elf.Class(data[elf.EI_CLASS]) {
-	case elf.ELFCLASS32:
-		data[48] = 0
-		data[49] = 0
-	case elf.ELFCLASS64:
-		data[60] = 0
-		data[61] = 0
-	}
-
-	const elfGoBuildIDTag = 4
-
-	ef, err := elf.NewFile(bytes.NewReader(data))
-	if err != nil {
-		return "", &os.PathError{Path: filename, Op: "parse", Err: err}
-	}
-	for _, p := range ef.Progs {
-		if p.Type != elf.PT_NOTE || p.Off >= uint64(len(data)) || p.Off+p.Filesz >= uint64(len(data)) || p.Filesz < 16 {
-			continue
-		}
-
-		note := data[p.Off : p.Off+p.Filesz]
-		nameSize := ef.ByteOrder.Uint32(note)
-		valSize := ef.ByteOrder.Uint32(note[4:])
-		tag := ef.ByteOrder.Uint32(note[8:])
-		name := note[12:16]
-		if nameSize != 4 || 16+valSize > uint32(len(note)) || tag != elfGoBuildIDTag || !bytes.Equal(name, elfGoNote) {
-			continue
-		}
-
-		return string(note[16 : 16+valSize]), nil
-	}
-
-	// No note. Treat as successful but build ID empty.
-	return "", nil
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/note_test.go b/third_party/gofrontend/libgo/go/cmd/go/note_test.go
deleted file mode 100644
index 3d64451..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/note_test.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main_test
-
-import (
-	main "cmd/go"
-	"runtime"
-	"testing"
-)
-
-func TestNoteReading(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.tempFile("hello.go", `package main; func main() { print("hello, world\n") }`)
-	const buildID = "TestNoteReading-Build-ID"
-	tg.run("build", "-ldflags", "-buildid="+buildID, "-o", tg.path("hello.exe"), tg.path("hello.go"))
-	id, err := main.ReadBuildIDFromBinary(tg.path("hello.exe"))
-	if err != nil {
-		t.Fatalf("reading build ID from hello binary: %v", err)
-	}
-	if id != buildID {
-		t.Fatalf("buildID in hello binary = %q, want %q", id, buildID)
-	}
-
-	if runtime.GOOS == "linux" && runtime.GOARCH == "ppc64le" {
-		t.Skipf("skipping - golang.org/issue/11184")
-	}
-
-	switch runtime.GOOS {
-	case "plan9":
-		// no external linking
-		t.Logf("no external linking - skipping linkmode=external test")
-
-	case "solaris":
-		t.Logf("skipping - golang.org/issue/12178")
-
-	default:
-		tg.run("build", "-ldflags", "-buildid="+buildID+" -linkmode=external", "-o", tg.path("hello.exe"), tg.path("hello.go"))
-		id, err := main.ReadBuildIDFromBinary(tg.path("hello.exe"))
-		if err != nil {
-			t.Fatalf("reading build ID from hello binary (linkmode=external): %v", err)
-		}
-		if id != buildID {
-			t.Fatalf("buildID in hello binary = %q, want %q (linkmode=external)", id, buildID)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/pkg.go b/third_party/gofrontend/libgo/go/cmd/go/pkg.go
deleted file mode 100644
index 3270a8b..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/pkg.go
+++ /dev/null
@@ -1,1861 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bytes"
-	"crypto/sha1"
-	"errors"
-	"fmt"
-	"go/build"
-	"go/scanner"
-	"go/token"
-	"io"
-	"io/ioutil"
-	"os"
-	pathpkg "path"
-	"path/filepath"
-	"runtime"
-	"sort"
-	"strconv"
-	"strings"
-	"unicode"
-)
-
-// A Package describes a single package found in a directory.
-type Package struct {
-	// Note: These fields are part of the go command's public API.
-	// See list.go.  It is okay to add fields, but not to change or
-	// remove existing ones.  Keep in sync with list.go
-	Dir           string `json:",omitempty"` // directory containing package sources
-	ImportPath    string `json:",omitempty"` // import path of package in dir
-	ImportComment string `json:",omitempty"` // path in import comment on package statement
-	Name          string `json:",omitempty"` // package name
-	Doc           string `json:",omitempty"` // package documentation string
-	Target        string `json:",omitempty"` // install path
-	Shlib         string `json:",omitempty"` // the shared library that contains this package (only set when -linkshared)
-	Goroot        bool   `json:",omitempty"` // is this package found in the Go root?
-	Standard      bool   `json:",omitempty"` // is this package part of the standard Go library?
-	Stale         bool   `json:",omitempty"` // would 'go install' do anything for this package?
-	Root          string `json:",omitempty"` // Go root or Go path dir containing this package
-	ConflictDir   string `json:",omitempty"` // Dir is hidden by this other directory
-
-	// Source files
-	GoFiles        []string `json:",omitempty"` // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
-	CgoFiles       []string `json:",omitempty"` // .go sources files that import "C"
-	IgnoredGoFiles []string `json:",omitempty"` // .go sources ignored due to build constraints
-	CFiles         []string `json:",omitempty"` // .c source files
-	CXXFiles       []string `json:",omitempty"` // .cc, .cpp and .cxx source files
-	MFiles         []string `json:",omitempty"` // .m source files
-	HFiles         []string `json:",omitempty"` // .h, .hh, .hpp and .hxx source files
-	SFiles         []string `json:",omitempty"` // .s source files
-	SwigFiles      []string `json:",omitempty"` // .swig files
-	SwigCXXFiles   []string `json:",omitempty"` // .swigcxx files
-	SysoFiles      []string `json:",omitempty"` // .syso system object files added to package
-
-	// Cgo directives
-	CgoCFLAGS    []string `json:",omitempty"` // cgo: flags for C compiler
-	CgoCPPFLAGS  []string `json:",omitempty"` // cgo: flags for C preprocessor
-	CgoCXXFLAGS  []string `json:",omitempty"` // cgo: flags for C++ compiler
-	CgoLDFLAGS   []string `json:",omitempty"` // cgo: flags for linker
-	CgoPkgConfig []string `json:",omitempty"` // cgo: pkg-config names
-
-	// Dependency information
-	Imports []string `json:",omitempty"` // import paths used by this package
-	Deps    []string `json:",omitempty"` // all (recursively) imported dependencies
-
-	// Error information
-	Incomplete bool            `json:",omitempty"` // was there an error loading this package or dependencies?
-	Error      *PackageError   `json:",omitempty"` // error loading this package (not dependencies)
-	DepsErrors []*PackageError `json:",omitempty"` // errors loading dependencies
-
-	// Test information
-	TestGoFiles  []string `json:",omitempty"` // _test.go files in package
-	TestImports  []string `json:",omitempty"` // imports from TestGoFiles
-	XTestGoFiles []string `json:",omitempty"` // _test.go files outside package
-	XTestImports []string `json:",omitempty"` // imports from XTestGoFiles
-
-	// Unexported fields are not part of the public API.
-	build        *build.Package
-	pkgdir       string // overrides build.PkgDir
-	imports      []*Package
-	deps         []*Package
-	gofiles      []string // GoFiles+CgoFiles+TestGoFiles+XTestGoFiles files, absolute paths
-	sfiles       []string
-	allgofiles   []string             // gofiles + IgnoredGoFiles, absolute paths
-	target       string               // installed file for this package (may be executable)
-	fake         bool                 // synthesized package
-	external     bool                 // synthesized external test package
-	forceBuild   bool                 // this package must be rebuilt
-	forceLibrary bool                 // this package is a library (even if named "main")
-	cmdline      bool                 // defined by files listed on command line
-	local        bool                 // imported via local path (./ or ../)
-	localPrefix  string               // interpret ./ and ../ imports relative to this prefix
-	exeName      string               // desired name for temporary executable
-	coverMode    string               // preprocess Go source files with the coverage tool in this mode
-	coverVars    map[string]*CoverVar // variables created by coverage analysis
-	omitDWARF    bool                 // tell linker not to write DWARF information
-	buildID      string               // expected build ID for generated package
-	gobinSubdir  bool                 // install target would be subdir of GOBIN
-}
-
-// vendored returns the vendor-resolved version of imports,
-// which should be p.TestImports or p.XTestImports, NOT p.Imports.
-// The imports in p.TestImports and p.XTestImports are not recursively
-// loaded during the initial load of p, so they list the imports found in
-// the source file, but most processing should be over the vendor-resolved
-// import paths. We do this resolution lazily both to avoid file system work
-// and because the eventual real load of the test imports (during 'go test')
-// can produce better error messages if it starts with the original paths.
-// The initial load of p loads all the non-test imports and rewrites
-// the vendored paths, so nothing should ever call p.vendored(p.Imports).
-func (p *Package) vendored(imports []string) []string {
-	if len(imports) > 0 && len(p.Imports) > 0 && &imports[0] == &p.Imports[0] {
-		panic("internal error: p.vendored(p.Imports) called")
-	}
-	seen := make(map[string]bool)
-	var all []string
-	for _, path := range imports {
-		path, _ = vendoredImportPath(p, path)
-		if !seen[path] {
-			seen[path] = true
-			all = append(all, path)
-		}
-	}
-	sort.Strings(all)
-	return all
-}
-
-// CoverVar holds the name of the generated coverage variables targeting the named file.
-type CoverVar struct {
-	File string // local file name
-	Var  string // name of count struct
-}
-
-func (p *Package) copyBuild(pp *build.Package) {
-	p.build = pp
-
-	if pp.PkgTargetRoot != "" && buildPkgdir != "" {
-		old := pp.PkgTargetRoot
-		pp.PkgRoot = buildPkgdir
-		pp.PkgTargetRoot = buildPkgdir
-		pp.PkgObj = filepath.Join(buildPkgdir, strings.TrimPrefix(pp.PkgObj, old))
-	}
-
-	p.Dir = pp.Dir
-	p.ImportPath = pp.ImportPath
-	p.ImportComment = pp.ImportComment
-	p.Name = pp.Name
-	p.Doc = pp.Doc
-	p.Root = pp.Root
-	p.ConflictDir = pp.ConflictDir
-	// TODO? Target
-	p.Goroot = pp.Goroot
-	if buildContext.Compiler == "gccgo" {
-		p.Standard = stdpkg[p.ImportPath]
-	} else {
-		p.Standard = p.Goroot && p.ImportPath != "" && !strings.Contains(p.ImportPath, ".")
-	}
-	p.GoFiles = pp.GoFiles
-	p.CgoFiles = pp.CgoFiles
-	p.IgnoredGoFiles = pp.IgnoredGoFiles
-	p.CFiles = pp.CFiles
-	p.CXXFiles = pp.CXXFiles
-	p.MFiles = pp.MFiles
-	p.HFiles = pp.HFiles
-	p.SFiles = pp.SFiles
-	p.SwigFiles = pp.SwigFiles
-	p.SwigCXXFiles = pp.SwigCXXFiles
-	p.SysoFiles = pp.SysoFiles
-	p.CgoCFLAGS = pp.CgoCFLAGS
-	p.CgoCPPFLAGS = pp.CgoCPPFLAGS
-	p.CgoCXXFLAGS = pp.CgoCXXFLAGS
-	p.CgoLDFLAGS = pp.CgoLDFLAGS
-	p.CgoPkgConfig = pp.CgoPkgConfig
-	p.Imports = pp.Imports
-	p.TestGoFiles = pp.TestGoFiles
-	p.TestImports = pp.TestImports
-	p.XTestGoFiles = pp.XTestGoFiles
-	p.XTestImports = pp.XTestImports
-}
-
-// A PackageError describes an error loading information about a package.
-type PackageError struct {
-	ImportStack   []string // shortest path from package named on command line to this one
-	Pos           string   // position of error
-	Err           string   // the error itself
-	isImportCycle bool     // the error is an import cycle
-	hard          bool     // whether the error is soft or hard; soft errors are ignored in some places
-}
-
-func (p *PackageError) Error() string {
-	// Import cycles deserve special treatment.
-	if p.isImportCycle {
-		return fmt.Sprintf("%s\npackage %s\n", p.Err, strings.Join(p.ImportStack, "\n\timports "))
-	}
-	if p.Pos != "" {
-		// Omit import stack.  The full path to the file where the error
-		// is the most important thing.
-		return p.Pos + ": " + p.Err
-	}
-	if len(p.ImportStack) == 0 {
-		return p.Err
-	}
-	return "package " + strings.Join(p.ImportStack, "\n\timports ") + ": " + p.Err
-}
-
-// An importStack is a stack of import paths.
-type importStack []string
-
-func (s *importStack) push(p string) {
-	*s = append(*s, p)
-}
-
-func (s *importStack) pop() {
-	*s = (*s)[0 : len(*s)-1]
-}
-
-func (s *importStack) copy() []string {
-	return append([]string{}, *s...)
-}
-
-// shorterThan reports whether sp is shorter than t.
-// We use this to record the shortest import sequence
-// that leads to a particular package.
-func (sp *importStack) shorterThan(t []string) bool {
-	s := *sp
-	if len(s) != len(t) {
-		return len(s) < len(t)
-	}
-	// If they are the same length, settle ties using string ordering.
-	for i := range s {
-		if s[i] != t[i] {
-			return s[i] < t[i]
-		}
-	}
-	return false // they are equal
-}
-
-// packageCache is a lookup cache for loadPackage,
-// so that if we look up a package multiple times
-// we return the same pointer each time.
-var packageCache = map[string]*Package{}
-
-// reloadPackage is like loadPackage but makes sure
-// not to use the package cache.
-func reloadPackage(arg string, stk *importStack) *Package {
-	p := packageCache[arg]
-	if p != nil {
-		delete(packageCache, p.Dir)
-		delete(packageCache, p.ImportPath)
-	}
-	return loadPackage(arg, stk)
-}
-
-// The Go 1.5 vendoring experiment is enabled by setting GO15VENDOREXPERIMENT=1.
-// The variable is obnoxiously long so that years from now when people find it in
-// their profiles and wonder what it does, there is some chance that a web search
-// might answer the question.
-var go15VendorExperiment = os.Getenv("GO15VENDOREXPERIMENT") == "1"
-
-// dirToImportPath returns the pseudo-import path we use for a package
-// outside the Go path.  It begins with _/ and then contains the full path
-// to the directory.  If the package lives in c:\home\gopher\my\pkg then
-// the pseudo-import path is _/c_/home/gopher/my/pkg.
-// Using a pseudo-import path like this makes the ./ imports no longer
-// a special case, so that all the code to deal with ordinary imports works
-// automatically.
-func dirToImportPath(dir string) string {
-	return pathpkg.Join("_", strings.Map(makeImportValid, filepath.ToSlash(dir)))
-}
-
-func makeImportValid(r rune) rune {
-	// Should match Go spec, compilers, and ../../go/parser/parser.go:/isValidImport.
-	const illegalChars = `!"#$%&'()*,:;<=>?[\]^{|}` + "`\uFFFD"
-	if !unicode.IsGraphic(r) || unicode.IsSpace(r) || strings.ContainsRune(illegalChars, r) {
-		return '_'
-	}
-	return r
-}
-
-// Mode flags for loadImport and download (in get.go).
-const (
-	// useVendor means that loadImport should do vendor expansion
-	// (provided the vendoring experiment is enabled).
-	// That is, useVendor means that the import path came from
-	// a source file and has not been vendor-expanded yet.
-	// Every import path should be loaded initially with useVendor,
-	// and then the expanded version (with the /vendor/ in it) gets
-	// recorded as the canonical import path. At that point, future loads
-	// of that package must not pass useVendor, because
-	// disallowVendor will reject direct use of paths containing /vendor/.
-	useVendor = 1 << iota
-
-	// getTestDeps is for download (part of "go get") and indicates
-	// that test dependencies should be fetched too.
-	getTestDeps
-)
-
-// loadImport scans the directory named by path, which must be an import path,
-// but possibly a local import path (an absolute file system path or one beginning
-// with ./ or ../).  A local relative path is interpreted relative to srcDir.
-// It returns a *Package describing the package found in that directory.
-func loadImport(path, srcDir string, parent *Package, stk *importStack, importPos []token.Position, mode int) *Package {
-	stk.push(path)
-	defer stk.pop()
-
-	// Determine canonical identifier for this package.
-	// For a local import the identifier is the pseudo-import path
-	// we create from the full directory to the package.
-	// Otherwise it is the usual import path.
-	// For vendored imports, it is the expanded form.
-	importPath := path
-	origPath := path
-	isLocal := build.IsLocalImport(path)
-	var vendorSearch []string
-	if isLocal {
-		importPath = dirToImportPath(filepath.Join(srcDir, path))
-	} else if mode&useVendor != 0 {
-		path, vendorSearch = vendoredImportPath(parent, path)
-		importPath = path
-	}
-
-	if p := packageCache[importPath]; p != nil {
-		if perr := disallowInternal(srcDir, p, stk); perr != p {
-			return perr
-		}
-		if mode&useVendor != 0 {
-			if perr := disallowVendor(srcDir, origPath, p, stk); perr != p {
-				return perr
-			}
-		}
-		return reusePackage(p, stk)
-	}
-
-	p := new(Package)
-	p.local = isLocal
-	p.ImportPath = importPath
-	packageCache[importPath] = p
-
-	// Load package.
-	// Import always returns bp != nil, even if an error occurs,
-	// in order to return partial information.
-	//
-	// TODO: After Go 1, decide when to pass build.AllowBinary here.
-	// See issue 3268 for mistakes to avoid.
-	bp, err := buildContext.Import(path, srcDir, build.ImportComment)
-
-	// If we got an error from go/build about package not found,
-	// it contains the directories from $GOROOT and $GOPATH that
-	// were searched. Add to that message the vendor directories
-	// that were searched.
-	if err != nil && len(vendorSearch) > 0 {
-		// NOTE(rsc): The direct text manipulation here is fairly awful,
-		// but it avoids defining new go/build API (an exported error type)
-		// late in the Go 1.5 release cycle. If this turns out to be a more general
-		// problem we could define a real error type when the decision can be
-		// considered more carefully.
-		text := err.Error()
-		if strings.Contains(text, "cannot find package \"") && strings.Contains(text, "\" in any of:\n\t") {
-			old := strings.SplitAfter(text, "\n")
-			lines := []string{old[0]}
-			for _, dir := range vendorSearch {
-				lines = append(lines, "\t"+dir+" (vendor tree)\n")
-			}
-			lines = append(lines, old[1:]...)
-			err = errors.New(strings.Join(lines, ""))
-		}
-	}
-	bp.ImportPath = importPath
-	if gobin != "" {
-		bp.BinDir = gobin
-	}
-	if err == nil && !isLocal && bp.ImportComment != "" && bp.ImportComment != path &&
-		(!go15VendorExperiment || (!strings.Contains(path, "/vendor/") && !strings.HasPrefix(path, "vendor/"))) {
-		err = fmt.Errorf("code in directory %s expects import %q", bp.Dir, bp.ImportComment)
-	}
-	p.load(stk, bp, err)
-	if p.Error != nil && len(importPos) > 0 {
-		pos := importPos[0]
-		pos.Filename = shortPath(pos.Filename)
-		p.Error.Pos = pos.String()
-	}
-
-	if perr := disallowInternal(srcDir, p, stk); perr != p {
-		return perr
-	}
-	if mode&useVendor != 0 {
-		if perr := disallowVendor(srcDir, origPath, p, stk); perr != p {
-			return perr
-		}
-	}
-
-	return p
-}
-
-var isDirCache = map[string]bool{}
-
-func isDir(path string) bool {
-	result, ok := isDirCache[path]
-	if ok {
-		return result
-	}
-
-	fi, err := os.Stat(path)
-	result = err == nil && fi.IsDir()
-	isDirCache[path] = result
-	return result
-}
-
-// vendoredImportPath returns the expansion of path when it appears in parent.
-// If parent is x/y/z, then path might expand to x/y/z/vendor/path, x/y/vendor/path,
-// x/vendor/path, vendor/path, or else stay x/y/z if none of those exist.
-// vendoredImportPath returns the expanded path or, if no expansion is found, the original.
-// If no expansion is found, vendoredImportPath also returns a list of vendor directories
-// it searched along the way, to help prepare a useful error message should path turn
-// out not to exist.
-func vendoredImportPath(parent *Package, path string) (found string, searched []string) {
-	if parent == nil || parent.Root == "" || !go15VendorExperiment {
-		return path, nil
-	}
-	dir := filepath.Clean(parent.Dir)
-	root := filepath.Join(parent.Root, "src")
-	if !hasFilePathPrefix(dir, root) || len(dir) <= len(root) || dir[len(root)] != filepath.Separator {
-		fatalf("invalid vendoredImportPath: dir=%q root=%q separator=%q", dir, root, string(filepath.Separator))
-	}
-	vpath := "vendor/" + path
-	for i := len(dir); i >= len(root); i-- {
-		if i < len(dir) && dir[i] != filepath.Separator {
-			continue
-		}
-		// Note: checking for the vendor directory before checking
-		// for the vendor/path directory helps us hit the
-		// isDir cache more often. It also helps us prepare a more useful
-		// list of places we looked, to report when an import is not found.
-		if !isDir(filepath.Join(dir[:i], "vendor")) {
-			continue
-		}
-		targ := filepath.Join(dir[:i], vpath)
-		if isDir(targ) {
-			// We started with parent's dir c:\gopath\src\foo\bar\baz\quux\xyzzy.
-			// We know the import path for parent's dir.
-			// We chopped off some number of path elements and
-			// added vendor\path to produce c:\gopath\src\foo\bar\baz\vendor\path.
-			// Now we want to know the import path for that directory.
-			// Construct it by chopping the same number of path elements
-			// (actually the same number of bytes) from parent's import path
-			// and then append /vendor/path.
-			chopped := len(dir) - i
-			if chopped == len(parent.ImportPath)+1 {
-				// We walked up from c:\gopath\src\foo\bar
-				// and found c:\gopath\src\vendor\path.
-				// We chopped \foo\bar (length 8) but the import path is "foo/bar" (length 7).
-				// Use "vendor/path" without any prefix.
-				return vpath, nil
-			}
-			return parent.ImportPath[:len(parent.ImportPath)-chopped] + "/" + vpath, nil
-		}
-		// Note the existence of a vendor directory in case path is not found anywhere.
-		searched = append(searched, targ)
-	}
-	return path, searched
-}
-
-// reusePackage reuses package p to satisfy the import at the top
-// of the import stack stk.  If this use causes an import loop,
-// reusePackage updates p's error information to record the loop.
-func reusePackage(p *Package, stk *importStack) *Package {
-	// We use p.imports==nil to detect a package that
-	// is in the midst of its own loadPackage call
-	// (all the recursion below happens before p.imports gets set).
-	if p.imports == nil {
-		if p.Error == nil {
-			p.Error = &PackageError{
-				ImportStack:   stk.copy(),
-				Err:           "import cycle not allowed",
-				isImportCycle: true,
-			}
-		}
-		p.Incomplete = true
-	}
-	// Don't rewrite the import stack in the error if we have an import cycle.
-	// If we do, we'll lose the path that describes the cycle.
-	if p.Error != nil && !p.Error.isImportCycle && stk.shorterThan(p.Error.ImportStack) {
-		p.Error.ImportStack = stk.copy()
-	}
-	return p
-}
-
-// disallowInternal checks that srcDir is allowed to import p.
-// If the import is allowed, disallowInternal returns the original package p.
-// If not, it returns a new package containing just an appropriate error.
-func disallowInternal(srcDir string, p *Package, stk *importStack) *Package {
-	// golang.org/s/go14internal:
-	// An import of a path containing the element “internal”
-	// is disallowed if the importing code is outside the tree
-	// rooted at the parent of the “internal” directory.
-
-	// There was an error loading the package; stop here.
-	if p.Error != nil {
-		return p
-	}
-
-	// The stack includes p.ImportPath.
-	// If that's the only thing on the stack, we started
-	// with a name given on the command line, not an
-	// import. Anything listed on the command line is fine.
-	if len(*stk) == 1 {
-		return p
-	}
-
-	// Check for "internal" element: four cases depending on begin of string and/or end of string.
-	i, ok := findInternal(p.ImportPath)
-	if !ok {
-		return p
-	}
-
-	// Internal is present.
-	// Map import path back to directory corresponding to parent of internal.
-	if i > 0 {
-		i-- // rewind over slash in ".../internal"
-	}
-	parent := p.Dir[:i+len(p.Dir)-len(p.ImportPath)]
-	if hasPathPrefix(filepath.ToSlash(srcDir), filepath.ToSlash(parent)) {
-		return p
-	}
-
-	// Internal is present, and srcDir is outside parent's tree. Not allowed.
-	perr := *p
-	perr.Error = &PackageError{
-		ImportStack: stk.copy(),
-		Err:         "use of internal package not allowed",
-	}
-	perr.Incomplete = true
-	return &perr
-}
-
-// findInternal looks for the final "internal" path element in the given import path.
-// If there isn't one, findInternal returns ok=false.
-// Otherwise, findInternal returns ok=true and the index of the "internal".
-func findInternal(path string) (index int, ok bool) {
-	// Four cases, depending on internal at start/end of string or not.
-	// The order matters: we must return the index of the final element,
-	// because the final one produces the most restrictive requirement
-	// on the importer.
-	switch {
-	case strings.HasSuffix(path, "/internal"):
-		return len(path) - len("internal"), true
-	case strings.Contains(path, "/internal/"):
-		return strings.LastIndex(path, "/internal/") + 1, true
-	case path == "internal", strings.HasPrefix(path, "internal/"):
-		return 0, true
-	}
-	return 0, false
-}
-
-// disallowVendor checks that srcDir is allowed to import p as path.
-// If the import is allowed, disallowVendor returns the original package p.
-// If not, it returns a new package containing just an appropriate error.
-func disallowVendor(srcDir, path string, p *Package, stk *importStack) *Package {
-	if !go15VendorExperiment {
-		return p
-	}
-
-	// The stack includes p.ImportPath.
-	// If that's the only thing on the stack, we started
-	// with a name given on the command line, not an
-	// import. Anything listed on the command line is fine.
-	if len(*stk) == 1 {
-		return p
-	}
-
-	if perr := disallowVendorVisibility(srcDir, p, stk); perr != p {
-		return perr
-	}
-
-	// Paths like x/vendor/y must be imported as y, never as x/vendor/y.
-	if i, ok := findVendor(path); ok {
-		perr := *p
-		perr.Error = &PackageError{
-			ImportStack: stk.copy(),
-			Err:         "must be imported as " + path[i+len("vendor/"):],
-		}
-		perr.Incomplete = true
-		return &perr
-	}
-
-	return p
-}
-
-// disallowVendorVisibility checks that srcDir is allowed to import p.
-// The rules are the same as for /internal/ except that a path ending in /vendor
-// is not subject to the rules, only subdirectories of vendor.
-// This allows people to have packages and commands named vendor,
-// for maximal compatibility with existing source trees.
-func disallowVendorVisibility(srcDir string, p *Package, stk *importStack) *Package {
-	// The stack includes p.ImportPath.
-	// If that's the only thing on the stack, we started
-	// with a name given on the command line, not an
-	// import. Anything listed on the command line is fine.
-	if len(*stk) == 1 {
-		return p
-	}
-
-	// Check for "vendor" element.
-	i, ok := findVendor(p.ImportPath)
-	if !ok {
-		return p
-	}
-
-	// Vendor is present.
-	// Map import path back to directory corresponding to parent of vendor.
-	if i > 0 {
-		i-- // rewind over slash in ".../vendor"
-	}
-	truncateTo := i + len(p.Dir) - len(p.ImportPath)
-	if truncateTo < 0 || len(p.Dir) < truncateTo {
-		return p
-	}
-	parent := p.Dir[:truncateTo]
-	if hasPathPrefix(filepath.ToSlash(srcDir), filepath.ToSlash(parent)) {
-		return p
-	}
-
-	// Vendor is present, and srcDir is outside parent's tree. Not allowed.
-	perr := *p
-	perr.Error = &PackageError{
-		ImportStack: stk.copy(),
-		Err:         "use of vendored package not allowed",
-	}
-	perr.Incomplete = true
-	return &perr
-}
-
-// findVendor looks for the last non-terminating "vendor" path element in the given import path.
-// If there isn't one, findVendor returns ok=false.
-// Otherwise, findInternal returns ok=true and the index of the "vendor".
-//
-// Note that terminating "vendor" elements don't count: "x/vendor" is its own package,
-// not the vendored copy of an import "" (the empty import path).
-// This will allow people to have packages or commands named vendor.
-// This may help reduce breakage, or it may just be confusing. We'll see.
-func findVendor(path string) (index int, ok bool) {
-	// Two cases, depending on internal at start of string or not.
-	// The order matters: we must return the index of the final element,
-	// because the final one is where the effective import path starts.
-	switch {
-	case strings.Contains(path, "/vendor/"):
-		return strings.LastIndex(path, "/vendor/") + 1, true
-	case strings.HasPrefix(path, "vendor/"):
-		return 0, true
-	}
-	return 0, false
-}
-
-type targetDir int
-
-const (
-	toRoot    targetDir = iota // to bin dir inside package root (default)
-	toTool                     // GOROOT/pkg/tool
-	toBin                      // GOROOT/bin
-	stalePath                  // the old import path; fail to build
-)
-
-// goTools is a map of Go program import path to install target directory.
-var goTools = map[string]targetDir{
-	"cmd/addr2line":                        toTool,
-	"cmd/api":                              toTool,
-	"cmd/asm":                              toTool,
-	"cmd/compile":                          toTool,
-	"cmd/cgo":                              toTool,
-	"cmd/cover":                            toTool,
-	"cmd/dist":                             toTool,
-	"cmd/doc":                              toTool,
-	"cmd/fix":                              toTool,
-	"cmd/link":                             toTool,
-	"cmd/newlink":                          toTool,
-	"cmd/nm":                               toTool,
-	"cmd/objdump":                          toTool,
-	"cmd/pack":                             toTool,
-	"cmd/pprof":                            toTool,
-	"cmd/trace":                            toTool,
-	"cmd/vet":                              toTool,
-	"cmd/yacc":                             toTool,
-	"golang.org/x/tools/cmd/godoc":         toBin,
-	"code.google.com/p/go.tools/cmd/cover": stalePath,
-	"code.google.com/p/go.tools/cmd/godoc": stalePath,
-	"code.google.com/p/go.tools/cmd/vet":   stalePath,
-}
-
-// expandScanner expands a scanner.List error into all the errors in the list.
-// The default Error method only shows the first error.
-func expandScanner(err error) error {
-	// Look for parser errors.
-	if err, ok := err.(scanner.ErrorList); ok {
-		// Prepare error with \n before each message.
-		// When printed in something like context: %v
-		// this will put the leading file positions each on
-		// its own line.  It will also show all the errors
-		// instead of just the first, as err.Error does.
-		var buf bytes.Buffer
-		for _, e := range err {
-			e.Pos.Filename = shortPath(e.Pos.Filename)
-			buf.WriteString("\n")
-			buf.WriteString(e.Error())
-		}
-		return errors.New(buf.String())
-	}
-	return err
-}
-
-var raceExclude = map[string]bool{
-	"runtime/race": true,
-	"runtime/cgo":  true,
-	"cmd/cgo":      true,
-	"syscall":      true,
-	"errors":       true,
-}
-
-var cgoExclude = map[string]bool{
-	"runtime/cgo": true,
-}
-
-var cgoSyscallExclude = map[string]bool{
-	"runtime/cgo":  true,
-	"runtime/race": true,
-}
-
-// load populates p using information from bp, err, which should
-// be the result of calling build.Context.Import.
-func (p *Package) load(stk *importStack, bp *build.Package, err error) *Package {
-	p.copyBuild(bp)
-
-	// The localPrefix is the path we interpret ./ imports relative to.
-	// Synthesized main packages sometimes override this.
-	p.localPrefix = dirToImportPath(p.Dir)
-
-	if err != nil {
-		p.Incomplete = true
-		err = expandScanner(err)
-		p.Error = &PackageError{
-			ImportStack: stk.copy(),
-			Err:         err.Error(),
-		}
-		return p
-	}
-
-	useBindir := p.Name == "main"
-	if !p.Standard {
-		switch buildBuildmode {
-		case "c-archive", "c-shared":
-			useBindir = false
-		}
-	}
-
-	if useBindir {
-		// Report an error when the old code.google.com/p/go.tools paths are used.
-		if goTools[p.ImportPath] == stalePath {
-			newPath := strings.Replace(p.ImportPath, "code.google.com/p/go.", "golang.org/x/", 1)
-			e := fmt.Sprintf("the %v command has moved; use %v instead.", p.ImportPath, newPath)
-			p.Error = &PackageError{Err: e}
-			return p
-		}
-		_, elem := filepath.Split(p.Dir)
-		full := buildContext.GOOS + "_" + buildContext.GOARCH + "/" + elem
-		if buildContext.GOOS != toolGOOS || buildContext.GOARCH != toolGOARCH {
-			// Install cross-compiled binaries to subdirectories of bin.
-			elem = full
-		}
-		if p.build.BinDir != gobin && goTools[p.ImportPath] == toBin {
-			// Override BinDir.
-			// This is from a subrepo but installs to $GOROOT/bin
-			// by default anyway (like godoc).
-			p.target = filepath.Join(gorootBin, elem)
-		} else if p.build.BinDir != "" {
-			// Install to GOBIN or bin of GOPATH entry.
-			p.target = filepath.Join(p.build.BinDir, elem)
-			if !p.Goroot && strings.Contains(elem, "/") && gobin != "" {
-				// Do not create $GOBIN/goos_goarch/elem.
-				p.target = ""
-				p.gobinSubdir = true
-			}
-		}
-		if goTools[p.ImportPath] == toTool {
-			// This is for 'go tool'.
-			// Override all the usual logic and force it into the tool directory.
-			if buildContext.Compiler == "gccgo" {
-				p.target = filepath.Join(runtime.GCCGOTOOLDIR, elem)
-			} else {
-				p.target = filepath.Join(gorootPkg, "tool", full)
-			}
-		}
-		if p.target != "" && buildContext.GOOS == "windows" {
-			p.target += ".exe"
-		}
-	} else if p.local {
-		// Local import turned into absolute path.
-		// No permanent install target.
-		p.target = ""
-	} else {
-		p.target = p.build.PkgObj
-		if buildLinkshared {
-			shlibnamefile := p.target[:len(p.target)-2] + ".shlibname"
-			shlib, err := ioutil.ReadFile(shlibnamefile)
-			if err == nil {
-				libname := strings.TrimSpace(string(shlib))
-				if buildContext.Compiler == "gccgo" {
-					p.Shlib = filepath.Join(p.build.PkgTargetRoot, "shlibs", libname)
-				} else {
-					p.Shlib = filepath.Join(p.build.PkgTargetRoot, libname)
-
-				}
-			} else if !os.IsNotExist(err) {
-				fatalf("unexpected error reading %s: %v", shlibnamefile, err)
-			}
-		}
-	}
-
-	importPaths := p.Imports
-	// Packages that use cgo import runtime/cgo implicitly.
-	// Packages that use cgo also import syscall implicitly,
-	// to wrap errno.
-	// Exclude certain packages to avoid circular dependencies.
-	if len(p.CgoFiles) > 0 && (!p.Standard || !cgoExclude[p.ImportPath]) {
-		importPaths = append(importPaths, "runtime/cgo")
-	}
-	if len(p.CgoFiles) > 0 && (!p.Standard || !cgoSyscallExclude[p.ImportPath]) {
-		importPaths = append(importPaths, "syscall")
-	}
-
-	// Currently build mode c-shared, or -linkshared, forces
-	// external linking mode, and external linking mode forces an
-	// import of runtime/cgo.
-	if p.Name == "main" && !p.Goroot && (buildBuildmode == "c-shared" || buildLinkshared) {
-		importPaths = append(importPaths, "runtime/cgo")
-	}
-
-	// Everything depends on runtime, except runtime and unsafe.
-	if !p.Standard || (p.ImportPath != "runtime" && p.ImportPath != "unsafe") {
-		importPaths = append(importPaths, "runtime")
-		// When race detection enabled everything depends on runtime/race.
-		// Exclude certain packages to avoid circular dependencies.
-		if buildRace && (!p.Standard || !raceExclude[p.ImportPath]) {
-			importPaths = append(importPaths, "runtime/race")
-		}
-		// On ARM with GOARM=5, everything depends on math for the link.
-		if p.Name == "main" && goarch == "arm" {
-			importPaths = append(importPaths, "math")
-		}
-	}
-
-	// Build list of full paths to all Go files in the package,
-	// for use by commands like go fmt.
-	p.gofiles = stringList(p.GoFiles, p.CgoFiles, p.TestGoFiles, p.XTestGoFiles)
-	for i := range p.gofiles {
-		p.gofiles[i] = filepath.Join(p.Dir, p.gofiles[i])
-	}
-	sort.Strings(p.gofiles)
-
-	p.sfiles = stringList(p.SFiles)
-	for i := range p.sfiles {
-		p.sfiles[i] = filepath.Join(p.Dir, p.sfiles[i])
-	}
-	sort.Strings(p.sfiles)
-
-	p.allgofiles = stringList(p.IgnoredGoFiles)
-	for i := range p.allgofiles {
-		p.allgofiles[i] = filepath.Join(p.Dir, p.allgofiles[i])
-	}
-	p.allgofiles = append(p.allgofiles, p.gofiles...)
-	sort.Strings(p.allgofiles)
-
-	// Check for case-insensitive collision of input files.
-	// To avoid problems on case-insensitive files, we reject any package
-	// where two different input files have equal names under a case-insensitive
-	// comparison.
-	f1, f2 := foldDup(stringList(
-		p.GoFiles,
-		p.CgoFiles,
-		p.IgnoredGoFiles,
-		p.CFiles,
-		p.CXXFiles,
-		p.MFiles,
-		p.HFiles,
-		p.SFiles,
-		p.SysoFiles,
-		p.SwigFiles,
-		p.SwigCXXFiles,
-		p.TestGoFiles,
-		p.XTestGoFiles,
-	))
-	if f1 != "" {
-		p.Error = &PackageError{
-			ImportStack: stk.copy(),
-			Err:         fmt.Sprintf("case-insensitive file name collision: %q and %q", f1, f2),
-		}
-		return p
-	}
-
-	// Build list of imported packages and full dependency list.
-	imports := make([]*Package, 0, len(p.Imports))
-	deps := make(map[string]*Package)
-	for i, path := range importPaths {
-		if path == "C" {
-			continue
-		}
-		p1 := loadImport(path, p.Dir, p, stk, p.build.ImportPos[path], useVendor)
-		if !reqStdPkgSrc && p1.Standard {
-			continue
-		}
-		if p1.Name == "main" {
-			p.Error = &PackageError{
-				ImportStack: stk.copy(),
-				Err:         fmt.Sprintf("import %q is a program, not an importable package", path),
-			}
-			pos := p.build.ImportPos[path]
-			if len(pos) > 0 {
-				p.Error.Pos = pos[0].String()
-			}
-		}
-		if p1.local {
-			if !p.local && p.Error == nil {
-				p.Error = &PackageError{
-					ImportStack: stk.copy(),
-					Err:         fmt.Sprintf("local import %q in non-local package", path),
-				}
-				pos := p.build.ImportPos[path]
-				if len(pos) > 0 {
-					p.Error.Pos = pos[0].String()
-				}
-			}
-		}
-		path = p1.ImportPath
-		importPaths[i] = path
-		if i < len(p.Imports) {
-			p.Imports[i] = path
-		}
-		deps[path] = p1
-		imports = append(imports, p1)
-		for _, dep := range p1.deps {
-			// The same import path could produce an error or not,
-			// depending on what tries to import it.
-			// Prefer to record entries with errors, so we can report them.
-			if deps[dep.ImportPath] == nil || dep.Error != nil {
-				deps[dep.ImportPath] = dep
-			}
-		}
-		if p1.Incomplete {
-			p.Incomplete = true
-		}
-	}
-	p.imports = imports
-
-	p.Deps = make([]string, 0, len(deps))
-	for dep := range deps {
-		p.Deps = append(p.Deps, dep)
-	}
-	sort.Strings(p.Deps)
-	for _, dep := range p.Deps {
-		p1 := deps[dep]
-		if p1 == nil {
-			panic("impossible: missing entry in package cache for " + dep + " imported by " + p.ImportPath)
-		}
-		p.deps = append(p.deps, p1)
-		if p1.Error != nil {
-			p.DepsErrors = append(p.DepsErrors, p1.Error)
-		}
-	}
-
-	// unsafe is a fake package.
-	if p.Standard && (p.ImportPath == "unsafe" || buildContext.Compiler == "gccgo") {
-		p.target = ""
-	}
-	p.Target = p.target
-
-	// The gc toolchain only permits C source files with cgo.
-	if len(p.CFiles) > 0 && !p.usesCgo() && !p.usesSwig() && buildContext.Compiler == "gc" {
-		p.Error = &PackageError{
-			ImportStack: stk.copy(),
-			Err:         fmt.Sprintf("C source files not allowed when not using cgo or SWIG: %s", strings.Join(p.CFiles, " ")),
-		}
-		return p
-	}
-
-	// In the absence of errors lower in the dependency tree,
-	// check for case-insensitive collisions of import paths.
-	if len(p.DepsErrors) == 0 {
-		dep1, dep2 := foldDup(p.Deps)
-		if dep1 != "" {
-			p.Error = &PackageError{
-				ImportStack: stk.copy(),
-				Err:         fmt.Sprintf("case-insensitive import collision: %q and %q", dep1, dep2),
-			}
-			return p
-		}
-	}
-
-	computeBuildID(p)
-	return p
-}
-
-// usesSwig reports whether the package needs to run SWIG.
-func (p *Package) usesSwig() bool {
-	return len(p.SwigFiles) > 0 || len(p.SwigCXXFiles) > 0
-}
-
-// usesCgo reports whether the package needs to run cgo
-func (p *Package) usesCgo() bool {
-	return len(p.CgoFiles) > 0
-}
-
-// packageList returns the list of packages in the dag rooted at roots
-// as visited in a depth-first post-order traversal.
-func packageList(roots []*Package) []*Package {
-	seen := map[*Package]bool{}
-	all := []*Package{}
-	var walk func(*Package)
-	walk = func(p *Package) {
-		if seen[p] {
-			return
-		}
-		seen[p] = true
-		for _, p1 := range p.imports {
-			walk(p1)
-		}
-		all = append(all, p)
-	}
-	for _, root := range roots {
-		walk(root)
-	}
-	return all
-}
-
-// computeStale computes the Stale flag in the package dag that starts
-// at the named pkgs (command-line arguments).
-func computeStale(pkgs ...*Package) {
-	for _, p := range packageList(pkgs) {
-		p.Stale = isStale(p)
-	}
-}
-
-// The runtime version string takes one of two forms:
-// "go1.X[.Y]" for Go releases, and "devel +hash" at tip.
-// Determine whether we are in a released copy by
-// inspecting the version.
-var isGoRelease = strings.HasPrefix(runtime.Version(), "go1")
-
-// isStale and computeBuildID
-//
-// Theory of Operation
-//
-// There is an installed copy of the package (or binary).
-// Can we reuse the installed copy, or do we need to build a new one?
-//
-// We can use the installed copy if it matches what we'd get
-// by building a new one. The hard part is predicting that without
-// actually running a build.
-//
-// To start, we must know the set of inputs to the build process that can
-// affect the generated output. At a minimum, that includes the source
-// files for the package and also any compiled packages imported by those
-// source files. The *Package has these, and we use them. One might also
-// argue for including in the input set: the build tags, whether the race
-// detector is in use, the target operating system and architecture, the
-// compiler and linker binaries being used, the additional flags being
-// passed to those, the cgo binary being used, the additional flags cgo
-// passes to the host C compiler, the host C compiler being used, the set
-// of host C include files and installed C libraries, and so on.
-// We include some but not all of this information.
-//
-// Once we have decided on a set of inputs, we must next decide how to
-// tell whether the content of that set has changed since the last build
-// of p. If there have been no changes, then we assume a new build would
-// produce the same result and reuse the installed package or binary.
-// But if there have been changes, then we assume a new build might not
-// produce the same result, so we rebuild.
-//
-// There are two common ways to decide whether the content of the set has
-// changed: modification times and content hashes. We use a mixture of both.
-//
-// The use of modification times (mtimes) was pioneered by make:
-// assuming that a file's mtime is an accurate record of when that file was last written,
-// and assuming that the modification time of an installed package or
-// binary is the time that it was built, if the mtimes of the inputs
-// predate the mtime of the installed object, then the build of that
-// object saw those versions of the files, and therefore a rebuild using
-// those same versions would produce the same object. In contrast, if any
-// mtime of an input is newer than the mtime of the installed object, a
-// change has occurred since the build, and the build should be redone.
-//
-// Modification times are attractive because the logic is easy to
-// understand and the file system maintains the mtimes automatically
-// (less work for us). Unfortunately, there are a variety of ways in
-// which the mtime approach fails to detect a change and reuses a stale
-// object file incorrectly. (Making the opposite mistake, rebuilding
-// unnecessarily, is only a performance problem and not a correctness
-// problem, so we ignore that one.)
-//
-// As a warmup, one problem is that to be perfectly precise, we need to
-// compare the input mtimes against the time at the beginning of the
-// build, but the object file time is the time at the end of the build.
-// If an input file changes after being read but before the object is
-// written, the next build will see an object newer than the input and
-// will incorrectly decide that the object is up to date. We make no
-// attempt to detect or solve this problem.
-//
-// Another problem is that due to file system imprecision, an input and
-// output that are actually ordered in time have the same mtime.
-// This typically happens on file systems with 1-second (or, worse,
-// 2-second) mtime granularity and with automated scripts that write an
-// input and then immediately run a build, or vice versa. If an input and
-// an output have the same mtime, the conservative behavior is to treat
-// the output as out-of-date and rebuild. This can cause one or more
-// spurious rebuilds, but only for 1 second, until the object finally has
-// an mtime later than the input.
-//
-// Another problem is that binary distributions often set the mtime on
-// all files to the same time. If the distribution includes both inputs
-// and cached build outputs, the conservative solution to the previous
-// problem will cause unnecessary rebuilds. Worse, in such a binary
-// distribution, those rebuilds might not even have permission to update
-// the cached build output. To avoid these write errors, if an input and
-// output have the same mtime, we assume the output is up-to-date.
-// This is the opposite of what the previous problem would have us do,
-// but binary distributions are more common than instances of the
-// previous problem.
-//
-// A variant of the last problem is that some binary distributions do not
-// set the mtime on all files to the same time. Instead they let the file
-// system record mtimes as the distribution is unpacked. If the outputs
-// are unpacked before the inputs, they'll be older and a build will try
-// to rebuild them. That rebuild might hit the same write errors as in
-// the last scenario. We don't make any attempt to solve this, and we
-// haven't had many reports of it. Perhaps the only time this happens is
-// when people manually unpack the distribution, and most of the time
-// that's done as the same user who will be using it, so an initial
-// rebuild on first use succeeds quietly.
-//
-// More generally, people and programs change mtimes on files. The last
-// few problems were specific examples of this, but it's a general problem.
-// For example, instead of a binary distribution, copying a home
-// directory from one directory or machine to another might copy files
-// but not preserve mtimes. If the inputs are new than the outputs on the
-// first machine but copied first, they end up older than the outputs on
-// the second machine.
-//
-// Because many other build systems have the same sensitivity to mtimes,
-// most programs manipulating source code take pains not to break the
-// mtime assumptions. For example, Git does not set the mtime of files
-// during a checkout operation, even when checking out an old version of
-// the code. This decision was made specifically to work well with
-// mtime-based build systems.
-//
-// The killer problem, though, for mtime-based build systems is that the
-// build only has access to the mtimes of the inputs that still exist.
-// If it is possible to remove an input without changing any other inputs,
-// a later build will think the object is up-to-date when it is not.
-// This happens for Go because a package is made up of all source
-// files in a directory. If a source file is removed, there is no newer
-// mtime available recording that fact. The mtime on the directory could
-// be used, but it also changes when unrelated files are added to or
-// removed from the directory, so including the directory mtime would
-// cause unnecessary rebuilds, possibly many. It would also exacerbate
-// the problems mentioned earlier, since even programs that are careful
-// to maintain mtimes on files rarely maintain mtimes on directories.
-//
-// A variant of the last problem is when the inputs change for other
-// reasons. For example, Go 1.4 and Go 1.5 both install $GOPATH/src/mypkg
-// into the same target, $GOPATH/pkg/$GOOS_$GOARCH/mypkg.a.
-// If Go 1.4 has built mypkg into mypkg.a, a build using Go 1.5 must
-// rebuild mypkg.a, but from mtimes alone mypkg.a looks up-to-date.
-// If Go 1.5 has just been installed, perhaps the compiler will have a
-// newer mtime; since the compiler is considered an input, that would
-// trigger a rebuild. But only once, and only the last Go 1.4 build of
-// mypkg.a happened before Go 1.5 was installed. If a user has the two
-// versions installed in different locations and flips back and forth,
-// mtimes alone cannot tell what to do. Changing the toolchain is
-// changing the set of inputs, without affecting any mtimes.
-//
-// To detect the set of inputs changing, we turn away from mtimes and to
-// an explicit data comparison. Specifically, we build a list of the
-// inputs to the build, compute its SHA1 hash, and record that as the
-// ``build ID'' in the generated object. At the next build, we can
-// recompute the buid ID and compare it to the one in the generated
-// object. If they differ, the list of inputs has changed, so the object
-// is out of date and must be rebuilt.
-//
-// Because this build ID is computed before the build begins, the
-// comparison does not have the race that mtime comparison does.
-//
-// Making the build sensitive to changes in other state is
-// straightforward: include the state in the build ID hash, and if it
-// changes, so does the build ID, triggering a rebuild.
-//
-// To detect changes in toolchain, we include the toolchain version in
-// the build ID hash for package runtime, and then we include the build
-// IDs of all imported packages in the build ID for p.
-//
-// It is natural to think about including build tags in the build ID, but
-// the naive approach of just dumping the tags into the hash would cause
-// spurious rebuilds. For example, 'go install' and 'go install -tags neverusedtag'
-// produce the same binaries (assuming neverusedtag is never used).
-// A more precise approach would be to include only tags that have an
-// effect on the build. But the effect of a tag on the build is to
-// include or exclude a file from the compilation, and that file list is
-// already in the build ID hash. So the build ID is already tag-sensitive
-// in a perfectly precise way. So we do NOT explicitly add build tags to
-// the build ID hash.
-//
-// We do not include as part of the build ID the operating system,
-// architecture, or whether the race detector is enabled, even though all
-// three have an effect on the output, because that information is used
-// to decide the install location. Binaries for linux and binaries for
-// darwin are written to different directory trees; including that
-// information in the build ID is unnecessary (although it would be
-// harmless).
-//
-// TODO(rsc): Investigate the cost of putting source file content into
-// the build ID hash as a replacement for the use of mtimes. Using the
-// file content would avoid all the mtime problems, but it does require
-// reading all the source files, something we avoid today (we read the
-// beginning to find the build tags and the imports, but we stop as soon
-// as we see the import block is over). If the package is stale, the compiler
-// is going to read the files anyway. But if the package is up-to-date, the
-// read is overhead.
-//
-// TODO(rsc): Investigate the complexity of making the build more
-// precise about when individual results are needed. To be fully precise,
-// there are two results of a compilation: the entire .a file used by the link
-// and the subpiece used by later compilations (__.PKGDEF only).
-// If a rebuild is needed but produces the previous __.PKGDEF, then
-// no more recompilation due to the rebuilt package is needed, only
-// relinking. To date, there is nothing in the Go command to express this.
-//
-// Special Cases
-//
-// When the go command makes the wrong build decision and does not
-// rebuild something it should, users fall back to adding the -a flag.
-// Any common use of the -a flag should be considered prima facie evidence
-// that isStale is returning an incorrect false result in some important case.
-// Bugs reported in the behavior of -a itself should prompt the question
-// ``Why is -a being used at all? What bug does that indicate?''
-//
-// There is a long history of changes to isStale to try to make -a into a
-// suitable workaround for bugs in the mtime-based decisions.
-// It is worth recording that history to inform (and, as much as possible, deter) future changes.
-//
-// (1) Before the build IDs were introduced, building with alternate tags
-// would happily reuse installed objects built without those tags.
-// For example, "go build -tags netgo myprog.go" would use the installed
-// copy of package net, even if that copy had been built without netgo.
-// (The netgo tag controls whether package net uses cgo or pure Go for
-// functionality such as name resolution.)
-// Using the installed non-netgo package defeats the purpose.
-//
-// Users worked around this with "go build -tags netgo -a myprog.go".
-//
-// Build IDs have made that workaround unnecessary:
-// "go build -tags netgo myprog.go"
-// cannot use a non-netgo copy of package net.
-//
-// (2) Before the build IDs were introduced, building with different toolchains,
-// especially changing between toolchains, tried to reuse objects stored in
-// $GOPATH/pkg, resulting in link-time errors about object file mismatches.
-//
-// Users worked around this with "go install -a ./...".
-//
-// Build IDs have made that workaround unnecessary:
-// "go install ./..." will rebuild any objects it finds that were built against
-// a different toolchain.
-//
-// (3) The common use of "go install -a ./..." led to reports of problems
-// when the -a forced the rebuild of the standard library, which for some
-// users was not writable. Because we didn't understand that the real
-// problem was the bug -a was working around, we changed -a not to
-// apply to the standard library.
-//
-// (4) The common use of "go build -tags netgo -a myprog.go" broke
-// when we changed -a not to apply to the standard library, because
-// if go build doesn't rebuild package net, it uses the non-netgo version.
-//
-// Users worked around this with "go build -tags netgo -installsuffix barf myprog.go".
-// The -installsuffix here is making the go command look for packages
-// in pkg/$GOOS_$GOARCH_barf instead of pkg/$GOOS_$GOARCH.
-// Since the former presumably doesn't exist, go build decides to rebuild
-// everything, including the standard library. Since go build doesn't
-// install anything it builds, nothing is ever written to pkg/$GOOS_$GOARCH_barf,
-// so repeated invocations continue to work.
-//
-// If the use of -a wasn't a red flag, the use of -installsuffix to point to
-// a non-existent directory in a command that installs nothing should
-// have been.
-//
-// (5) Now that (1) and (2) no longer need -a, we have removed the kludge
-// introduced in (3): once again, -a means ``rebuild everything,'' not
-// ``rebuild everything except the standard library.'' Only Go 1.4 had
-// the restricted meaning.
-//
-// In addition to these cases trying to trigger rebuilds, there are
-// special cases trying NOT to trigger rebuilds. The main one is that for
-// a variety of reasons (see above), the install process for a Go release
-// cannot be relied upon to set the mtimes such that the go command will
-// think the standard library is up to date. So the mtime evidence is
-// ignored for the standard library if we find ourselves in a release
-// version of Go. Build ID-based staleness checks still apply to the
-// standard library, even in release versions. This makes
-// 'go build -tags netgo' work, among other things.
-
-// isStale reports whether package p needs to be rebuilt.
-func isStale(p *Package) bool {
-	if p.Standard && (p.ImportPath == "unsafe" || buildContext.Compiler == "gccgo") {
-		// fake, builtin package
-		return false
-	}
-	if p.Error != nil {
-		return true
-	}
-
-	// A package without Go sources means we only found
-	// the installed .a file.  Since we don't know how to rebuild
-	// it, it can't be stale, even if -a is set.  This enables binary-only
-	// distributions of Go packages, although such binaries are
-	// only useful with the specific version of the toolchain that
-	// created them.
-	if len(p.gofiles) == 0 && !p.usesSwig() {
-		return false
-	}
-
-	// If the -a flag is given, rebuild everything.
-	if buildA {
-		return true
-	}
-
-	// If there's no install target or it's already marked stale, we have to rebuild.
-	if p.target == "" || p.Stale {
-		return true
-	}
-
-	// Package is stale if completely unbuilt.
-	fi, err := os.Stat(p.target)
-	if err != nil {
-		return true
-	}
-
-	// Package is stale if the expected build ID differs from the
-	// recorded build ID. This catches changes like a source file
-	// being removed from a package directory. See issue 3895.
-	// It also catches changes in build tags that affect the set of
-	// files being compiled. See issue 9369.
-	// It also catches changes in toolchain, like when flipping between
-	// two versions of Go compiling a single GOPATH.
-	// See issue 8290 and issue 10702.
-	targetBuildID, err := readBuildID(p)
-	if err == nil && targetBuildID != p.buildID {
-		return true
-	}
-
-	// Package is stale if a dependency is.
-	for _, p1 := range p.deps {
-		if p1.Stale {
-			return true
-		}
-	}
-
-	// The checks above are content-based staleness.
-	// We assume they are always accurate.
-	//
-	// The checks below are mtime-based staleness.
-	// We hope they are accurate, but we know that they fail in the case of
-	// prebuilt Go installations that don't preserve the build mtimes
-	// (for example, if the pkg/ mtimes are before the src/ mtimes).
-	// See the large comment above isStale for details.
-
-	// If we are running a release copy of Go and didn't find a content-based
-	// reason to rebuild the standard packages, do not rebuild them.
-	// They may not be writable anyway, but they are certainly not changing.
-	// This makes 'go build' skip the standard packages when
-	// using an official release, even when the mtimes have been changed.
-	// See issue 3036, issue 3149, issue 4106, issue 8290.
-	// (If a change to a release tree must be made by hand, the way to force the
-	// install is to run make.bash, which will remove the old package archives
-	// before rebuilding.)
-	if p.Standard && isGoRelease {
-		return false
-	}
-
-	// Time-based staleness.
-
-	built := fi.ModTime()
-
-	olderThan := func(file string) bool {
-		fi, err := os.Stat(file)
-		return err != nil || fi.ModTime().After(built)
-	}
-
-	// Package is stale if a dependency is, or if a dependency is newer.
-	for _, p1 := range p.deps {
-		if p1.target != "" && olderThan(p1.target) {
-			return true
-		}
-	}
-
-	// As a courtesy to developers installing new versions of the compiler
-	// frequently, define that packages are stale if they are
-	// older than the compiler, and commands if they are older than
-	// the linker.  This heuristic will not work if the binaries are
-	// back-dated, as some binary distributions may do, but it does handle
-	// a very common case.
-	// See issue 3036.
-	// Exclude $GOROOT, under the assumption that people working on
-	// the compiler may want to control when everything gets rebuilt,
-	// and people updating the Go repository will run make.bash or all.bash
-	// and get a full rebuild anyway.
-	// Excluding $GOROOT used to also fix issue 4106, but that's now
-	// taken care of above (at least when the installed Go is a released version).
-	if p.Root != goroot {
-		if olderThan(buildToolchain.compiler()) {
-			return true
-		}
-		if p.build.IsCommand() && olderThan(buildToolchain.linker()) {
-			return true
-		}
-	}
-
-	// Note: Until Go 1.5, we had an additional shortcut here.
-	// We built a list of the workspace roots ($GOROOT, each $GOPATH)
-	// containing targets directly named on the command line,
-	// and if p were not in any of those, it would be treated as up-to-date
-	// as long as it is built. The goal was to avoid rebuilding a system-installed
-	// $GOROOT, unless something from $GOROOT were explicitly named
-	// on the command line (like go install math).
-	// That's now handled by the isGoRelease clause above.
-	// The other effect of the shortcut was to isolate different entries in
-	// $GOPATH from each other. This had the unfortunate effect that
-	// if you had (say), GOPATH listing two entries, one for commands
-	// and one for libraries, and you did a 'git pull' in the library one
-	// and then tried 'go install commands/...', it would build the new libraries
-	// during the first build (because they wouldn't have been installed at all)
-	// but then subsequent builds would not rebuild the libraries, even if the
-	// mtimes indicate they are stale, because the different GOPATH entries
-	// were treated differently. This behavior was confusing when using
-	// non-trivial GOPATHs, which were particularly common with some
-	// code management conventions, like the original godep.
-	// Since the $GOROOT case (the original motivation) is handled separately,
-	// we no longer put a barrier between the different $GOPATH entries.
-	//
-	// One implication of this is that if there is a system directory for
-	// non-standard Go packages that is included in $GOPATH, the mtimes
-	// on those compiled packages must be no earlier than the mtimes
-	// on the source files. Since most distributions use the same mtime
-	// for all files in a tree, they will be unaffected. People using plain
-	// tar x to extract system-installed packages will need to adjust mtimes,
-	// but it's better to force them to get the mtimes right than to ignore
-	// the mtimes and thereby do the wrong thing in common use cases.
-	//
-	// So there is no GOPATH vs GOPATH shortcut here anymore.
-	//
-	// If something needs to come back here, we could try writing a dummy
-	// file with a random name to the $GOPATH/pkg directory (and removing it)
-	// to test for write access, and then skip GOPATH roots we don't have write
-	// access to. But hopefully we can just use the mtimes always.
-
-	srcs := stringList(p.GoFiles, p.CFiles, p.CXXFiles, p.MFiles, p.HFiles, p.SFiles, p.CgoFiles, p.SysoFiles, p.SwigFiles, p.SwigCXXFiles)
-	for _, src := range srcs {
-		if olderThan(filepath.Join(p.Dir, src)) {
-			return true
-		}
-	}
-
-	return false
-}
-
-// computeBuildID computes the build ID for p, leaving it in p.buildID.
-// Build ID is a hash of the information we want to detect changes in.
-// See the long comment in isStale for details.
-func computeBuildID(p *Package) {
-	h := sha1.New()
-
-	// Include the list of files compiled as part of the package.
-	// This lets us detect removed files. See issue 3895.
-	inputFiles := stringList(
-		p.GoFiles,
-		p.CgoFiles,
-		p.CFiles,
-		p.CXXFiles,
-		p.MFiles,
-		p.HFiles,
-		p.SFiles,
-		p.SysoFiles,
-		p.SwigFiles,
-		p.SwigCXXFiles,
-	)
-	for _, file := range inputFiles {
-		fmt.Fprintf(h, "file %s\n", file)
-	}
-
-	// Include the content of runtime/zversion.go in the hash
-	// for package runtime. This will give package runtime a
-	// different build ID in each Go release.
-	if p.Standard && p.ImportPath == "runtime" {
-		data, _ := ioutil.ReadFile(filepath.Join(p.Dir, "zversion.go"))
-		fmt.Fprintf(h, "zversion %q\n", string(data))
-	}
-
-	// Include the build IDs of any dependencies in the hash.
-	// This, combined with the runtime/zversion content,
-	// will cause packages to have different build IDs when
-	// compiled with different Go releases.
-	// This helps the go command know to recompile when
-	// people use the same GOPATH but switch between
-	// different Go releases. See issue 10702.
-	// This is also a better fix for issue 8290.
-	for _, p1 := range p.deps {
-		fmt.Fprintf(h, "dep %s %s\n", p1.ImportPath, p1.buildID)
-	}
-
-	p.buildID = fmt.Sprintf("%x", h.Sum(nil))
-}
-
-var cwd, _ = os.Getwd()
-
-var cmdCache = map[string]*Package{}
-
-// loadPackage is like loadImport but is used for command-line arguments,
-// not for paths found in import statements.  In addition to ordinary import paths,
-// loadPackage accepts pseudo-paths beginning with cmd/ to denote commands
-// in the Go command directory, as well as paths to those directories.
-func loadPackage(arg string, stk *importStack) *Package {
-	if build.IsLocalImport(arg) {
-		dir := arg
-		if !filepath.IsAbs(dir) {
-			if abs, err := filepath.Abs(dir); err == nil {
-				// interpret relative to current directory
-				dir = abs
-			}
-		}
-		if sub, ok := hasSubdir(gorootSrc, dir); ok && strings.HasPrefix(sub, "cmd/") && !strings.Contains(sub[4:], "/") {
-			arg = sub
-		}
-	}
-	if strings.HasPrefix(arg, "cmd/") && !strings.Contains(arg[4:], "/") {
-		if p := cmdCache[arg]; p != nil {
-			return p
-		}
-		stk.push(arg)
-		defer stk.pop()
-
-		bp, err := buildContext.ImportDir(filepath.Join(gorootSrc, arg), 0)
-		bp.ImportPath = arg
-		bp.Goroot = true
-		bp.BinDir = gorootBin
-		if gobin != "" {
-			bp.BinDir = gobin
-		}
-		bp.Root = goroot
-		bp.SrcRoot = gorootSrc
-		p := new(Package)
-		cmdCache[arg] = p
-		p.load(stk, bp, err)
-		if p.Error == nil && p.Name != "main" {
-			p.Error = &PackageError{
-				ImportStack: stk.copy(),
-				Err:         fmt.Sprintf("expected package main but found package %s in %s", p.Name, p.Dir),
-			}
-		}
-		return p
-	}
-
-	// Wasn't a command; must be a package.
-	// If it is a local import path but names a standard package,
-	// we treat it as if the user specified the standard package.
-	// This lets you run go test ./ioutil in package io and be
-	// referring to io/ioutil rather than a hypothetical import of
-	// "./ioutil".
-	if build.IsLocalImport(arg) {
-		bp, _ := buildContext.ImportDir(filepath.Join(cwd, arg), build.FindOnly)
-		if bp.ImportPath != "" && bp.ImportPath != "." {
-			arg = bp.ImportPath
-		}
-	}
-
-	return loadImport(arg, cwd, nil, stk, nil, 0)
-}
-
-// packages returns the packages named by the
-// command line arguments 'args'.  If a named package
-// cannot be loaded at all (for example, if the directory does not exist),
-// then packages prints an error and does not include that
-// package in the results.  However, if errors occur trying
-// to load dependencies of a named package, the named
-// package is still returned, with p.Incomplete = true
-// and details in p.DepsErrors.
-func packages(args []string) []*Package {
-	var pkgs []*Package
-	for _, pkg := range packagesAndErrors(args) {
-		if pkg.Error != nil {
-			errorf("can't load package: %s", pkg.Error)
-			continue
-		}
-		pkgs = append(pkgs, pkg)
-	}
-	return pkgs
-}
-
-// packagesAndErrors is like 'packages' but returns a
-// *Package for every argument, even the ones that
-// cannot be loaded at all.
-// The packages that fail to load will have p.Error != nil.
-func packagesAndErrors(args []string) []*Package {
-	if len(args) > 0 && strings.HasSuffix(args[0], ".go") {
-		return []*Package{goFilesPackage(args)}
-	}
-
-	args = importPaths(args)
-	var pkgs []*Package
-	var stk importStack
-	var set = make(map[string]bool)
-
-	for _, arg := range args {
-		if !set[arg] {
-			pkgs = append(pkgs, loadPackage(arg, &stk))
-			set[arg] = true
-		}
-	}
-	computeStale(pkgs...)
-
-	return pkgs
-}
-
-// packagesForBuild is like 'packages' but fails if any of
-// the packages or their dependencies have errors
-// (cannot be built).
-func packagesForBuild(args []string) []*Package {
-	pkgs := packagesAndErrors(args)
-	printed := map[*PackageError]bool{}
-	for _, pkg := range pkgs {
-		if pkg.Error != nil {
-			errorf("can't load package: %s", pkg.Error)
-		}
-		for _, err := range pkg.DepsErrors {
-			// Since these are errors in dependencies,
-			// the same error might show up multiple times,
-			// once in each package that depends on it.
-			// Only print each once.
-			if !printed[err] {
-				printed[err] = true
-				errorf("%s", err)
-			}
-		}
-	}
-	exitIfErrors()
-
-	// Check for duplicate loads of the same package.
-	// That should be impossible, but if it does happen then
-	// we end up trying to build the same package twice,
-	// usually in parallel overwriting the same files,
-	// which doesn't work very well.
-	seen := map[string]bool{}
-	reported := map[string]bool{}
-	for _, pkg := range packageList(pkgs) {
-		if seen[pkg.ImportPath] && !reported[pkg.ImportPath] {
-			reported[pkg.ImportPath] = true
-			errorf("internal error: duplicate loads of %s", pkg.ImportPath)
-		}
-		seen[pkg.ImportPath] = true
-	}
-	exitIfErrors()
-
-	return pkgs
-}
-
-// hasSubdir reports whether dir is a subdirectory of
-// (possibly multiple levels below) root.
-// If so, it sets rel to the path fragment that must be
-// appended to root to reach dir.
-func hasSubdir(root, dir string) (rel string, ok bool) {
-	if p, err := filepath.EvalSymlinks(root); err == nil {
-		root = p
-	}
-	if p, err := filepath.EvalSymlinks(dir); err == nil {
-		dir = p
-	}
-	const sep = string(filepath.Separator)
-	root = filepath.Clean(root)
-	if !strings.HasSuffix(root, sep) {
-		root += sep
-	}
-	dir = filepath.Clean(dir)
-	if !strings.HasPrefix(dir, root) {
-		return "", false
-	}
-	return filepath.ToSlash(dir[len(root):]), true
-}
-
-var (
-	errBuildIDToolchain = fmt.Errorf("build ID only supported in gc toolchain")
-	errBuildIDMalformed = fmt.Errorf("malformed object file")
-	errBuildIDUnknown   = fmt.Errorf("lost build ID")
-)
-
-var (
-	bangArch = []byte("!<arch>")
-	pkgdef   = []byte("__.PKGDEF")
-	goobject = []byte("go object ")
-	buildid  = []byte("build id ")
-)
-
-// readBuildID reads the build ID from an archive or binary.
-// It only supports the gc toolchain.
-// Other toolchain maintainers should adjust this function.
-func readBuildID(p *Package) (id string, err error) {
-	if buildToolchain != (gcToolchain{}) {
-		return "", errBuildIDToolchain
-	}
-
-	// For commands, read build ID directly from binary.
-	if p.Name == "main" {
-		return ReadBuildIDFromBinary(p.Target)
-	}
-
-	// Otherwise, we expect to have an archive (.a) file,
-	// and we can read the build ID from the Go export data.
-	if !strings.HasSuffix(p.Target, ".a") {
-		return "", &os.PathError{Op: "parse", Path: p.Target, Err: errBuildIDUnknown}
-	}
-
-	// Read just enough of the target to fetch the build ID.
-	// The archive is expected to look like:
-	//
-	//	!<arch>
-	//	__.PKGDEF       0           0     0     644     7955      `
-	//	go object darwin amd64 devel X:none
-	//	build id "b41e5c45250e25c9fd5e9f9a1de7857ea0d41224"
-	//
-	// The variable-sized strings are GOOS, GOARCH, and the experiment list (X:none).
-	// Reading the first 1024 bytes should be plenty.
-	f, err := os.Open(p.Target)
-	if err != nil {
-		return "", err
-	}
-	data := make([]byte, 1024)
-	n, err := io.ReadFull(f, data)
-	f.Close()
-
-	if err != nil && n == 0 {
-		return "", err
-	}
-
-	bad := func() (string, error) {
-		return "", &os.PathError{Op: "parse", Path: p.Target, Err: errBuildIDMalformed}
-	}
-
-	// Archive header.
-	for i := 0; ; i++ { // returns during i==3
-		j := bytes.IndexByte(data, '\n')
-		if j < 0 {
-			return bad()
-		}
-		line := data[:j]
-		data = data[j+1:]
-		switch i {
-		case 0:
-			if !bytes.Equal(line, bangArch) {
-				return bad()
-			}
-		case 1:
-			if !bytes.HasPrefix(line, pkgdef) {
-				return bad()
-			}
-		case 2:
-			if !bytes.HasPrefix(line, goobject) {
-				return bad()
-			}
-		case 3:
-			if !bytes.HasPrefix(line, buildid) {
-				// Found the object header, just doesn't have a build id line.
-				// Treat as successful, with empty build id.
-				return "", nil
-			}
-			id, err := strconv.Unquote(string(line[len(buildid):]))
-			if err != nil {
-				return bad()
-			}
-			return id, nil
-		}
-	}
-}
-
-var (
-	goBuildPrefix = []byte("\xff Go build ID: \"")
-	goBuildEnd    = []byte("\"\n \xff")
-
-	elfPrefix = []byte("\x7fELF")
-)
-
-// ReadBuildIDFromBinary reads the build ID from a binary.
-//
-// ELF binaries store the build ID in a proper PT_NOTE section.
-//
-// Other binary formats are not so flexible. For those, the linker
-// stores the build ID as non-instruction bytes at the very beginning
-// of the text segment, which should appear near the beginning
-// of the file. This is clumsy but fairly portable. Custom locations
-// can be added for other binary types as needed, like we did for ELF.
-func ReadBuildIDFromBinary(filename string) (id string, err error) {
-	if filename == "" {
-		return "", &os.PathError{Op: "parse", Path: filename, Err: errBuildIDUnknown}
-	}
-
-	// Read the first 16 kB of the binary file.
-	// That should be enough to find the build ID.
-	// In ELF files, the build ID is in the leading headers,
-	// which are typically less than 4 kB, not to mention 16 kB.
-	// On other systems, we're trying to read enough that
-	// we get the beginning of the text segment in the read.
-	// The offset where the text segment begins in a hello
-	// world compiled for each different object format today:
-	//
-	//	Plan 9: 0x20
-	//	Windows: 0x600
-	//	Mach-O: 0x2000
-	//
-	f, err := os.Open(filename)
-	if err != nil {
-		return "", err
-	}
-	defer f.Close()
-
-	data := make([]byte, 16*1024)
-	_, err = io.ReadFull(f, data)
-	if err == io.ErrUnexpectedEOF {
-		err = nil
-	}
-	if err != nil {
-		return "", err
-	}
-
-	if bytes.HasPrefix(data, elfPrefix) {
-		return readELFGoBuildID(filename, f, data)
-	}
-
-	i := bytes.Index(data, goBuildPrefix)
-	if i < 0 {
-		// Missing. Treat as successful but build ID empty.
-		return "", nil
-	}
-
-	j := bytes.Index(data[i+len(goBuildPrefix):], goBuildEnd)
-	if j < 0 {
-		return "", &os.PathError{Op: "parse", Path: filename, Err: errBuildIDMalformed}
-	}
-
-	quoted := data[i+len(goBuildPrefix)-1 : i+len(goBuildPrefix)+j+1]
-	id, err = strconv.Unquote(string(quoted))
-	if err != nil {
-		return "", &os.PathError{Op: "parse", Path: filename, Err: errBuildIDMalformed}
-	}
-
-	return id, nil
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/pkg_test.go b/third_party/gofrontend/libgo/go/cmd/go/pkg_test.go
deleted file mode 100644
index 06b9f0a..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/pkg_test.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"reflect"
-	"strings"
-	"testing"
-)
-
-var foldDupTests = []struct {
-	list   []string
-	f1, f2 string
-}{
-	{stringList("math/rand", "math/big"), "", ""},
-	{stringList("math", "strings"), "", ""},
-	{stringList("strings"), "", ""},
-	{stringList("strings", "strings"), "strings", "strings"},
-	{stringList("Rand", "rand", "math", "math/rand", "math/Rand"), "Rand", "rand"},
-}
-
-func TestFoldDup(t *testing.T) {
-	for _, tt := range foldDupTests {
-		f1, f2 := foldDup(tt.list)
-		if f1 != tt.f1 || f2 != tt.f2 {
-			t.Errorf("foldDup(%q) = %q, %q, want %q, %q", tt.list, f1, f2, tt.f1, tt.f2)
-		}
-	}
-}
-
-var parseMetaGoImportsTests = []struct {
-	in  string
-	out []metaImport
-}{
-	{
-		`<meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">`,
-		[]metaImport{{"foo/bar", "git", "https://github.com/rsc/foo/bar"}},
-	},
-	{
-		`<meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">
-		<meta name="go-import" content="baz/quux git http://github.com/rsc/baz/quux">`,
-		[]metaImport{
-			{"foo/bar", "git", "https://github.com/rsc/foo/bar"},
-			{"baz/quux", "git", "http://github.com/rsc/baz/quux"},
-		},
-	},
-	{
-		`<head>
-		<meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">
-		</head>`,
-		[]metaImport{{"foo/bar", "git", "https://github.com/rsc/foo/bar"}},
-	},
-	{
-		`<meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">
-		<body>`,
-		[]metaImport{{"foo/bar", "git", "https://github.com/rsc/foo/bar"}},
-	},
-}
-
-func TestParseMetaGoImports(t *testing.T) {
-	for i, tt := range parseMetaGoImportsTests {
-		out, err := parseMetaGoImports(strings.NewReader(tt.in))
-		if err != nil {
-			t.Errorf("test#%d: %v", i, err)
-			continue
-		}
-		if !reflect.DeepEqual(out, tt.out) {
-			t.Errorf("test#%d:\n\thave %q\n\twant %q", i, out, tt.out)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/run.go b/third_party/gofrontend/libgo/go/cmd/go/run.go
deleted file mode 100644
index f6da373..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/run.go
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"fmt"
-	"os"
-	"os/exec"
-	"runtime"
-	"strings"
-)
-
-var execCmd []string // -exec flag, for run and test
-
-func findExecCmd() []string {
-	if execCmd != nil {
-		return execCmd
-	}
-	execCmd = []string{} // avoid work the second time
-	if goos == runtime.GOOS && goarch == runtime.GOARCH {
-		return execCmd
-	}
-	path, err := exec.LookPath(fmt.Sprintf("go_%s_%s_exec", goos, goarch))
-	if err == nil {
-		execCmd = []string{path}
-	}
-	return execCmd
-}
-
-var cmdRun = &Command{
-	UsageLine: "run [build flags] [-exec xprog] gofiles... [arguments...]",
-	Short:     "compile and run Go program",
-	Long: `
-Run compiles and runs the main package comprising the named Go source files.
-A Go source file is defined to be a file ending in a literal ".go" suffix.
-
-By default, 'go run' runs the compiled binary directly: 'a.out arguments...'.
-If the -exec flag is given, 'go run' invokes the binary using xprog:
-	'xprog a.out arguments...'.
-If the -exec flag is not given, GOOS or GOARCH is different from the system
-default, and a program named go_$GOOS_$GOARCH_exec can be found
-on the current search path, 'go run' invokes the binary using that program,
-for example 'go_nacl_386_exec a.out arguments...'. This allows execution of
-cross-compiled programs when a simulator or other execution method is
-available.
-
-For more about build flags, see 'go help build'.
-
-See also: go build.
-	`,
-}
-
-func init() {
-	cmdRun.Run = runRun // break init loop
-
-	addBuildFlags(cmdRun)
-	cmdRun.Flag.Var((*stringsFlag)(&execCmd), "exec", "")
-}
-
-func printStderr(args ...interface{}) (int, error) {
-	return fmt.Fprint(os.Stderr, args...)
-}
-
-func runRun(cmd *Command, args []string) {
-	raceInit()
-	buildModeInit()
-	var b builder
-	b.init()
-	b.print = printStderr
-	i := 0
-	for i < len(args) && strings.HasSuffix(args[i], ".go") {
-		i++
-	}
-	files, cmdArgs := args[:i], args[i:]
-	if len(files) == 0 {
-		fatalf("go run: no go files listed")
-	}
-	for _, file := range files {
-		if strings.HasSuffix(file, "_test.go") {
-			// goFilesPackage is going to assign this to TestGoFiles.
-			// Reject since it won't be part of the build.
-			fatalf("go run: cannot run *_test.go files (%s)", file)
-		}
-	}
-	p := goFilesPackage(files)
-	if p.Error != nil {
-		fatalf("%s", p.Error)
-	}
-	p.omitDWARF = true
-	for _, err := range p.DepsErrors {
-		errorf("%s", err)
-	}
-	exitIfErrors()
-	if p.Name != "main" {
-		fatalf("go run: cannot run non-main package")
-	}
-	p.target = "" // must build - not up to date
-	var src string
-	if len(p.GoFiles) > 0 {
-		src = p.GoFiles[0]
-	} else if len(p.CgoFiles) > 0 {
-		src = p.CgoFiles[0]
-	} else {
-		// this case could only happen if the provided source uses cgo
-		// while cgo is disabled.
-		hint := ""
-		if !buildContext.CgoEnabled {
-			hint = " (cgo is disabled)"
-		}
-		fatalf("go run: no suitable source files%s", hint)
-	}
-	p.exeName = src[:len(src)-len(".go")] // name temporary executable for first go file
-	a1 := b.action(modeBuild, modeBuild, p)
-	a := &action{f: (*builder).runProgram, args: cmdArgs, deps: []*action{a1}}
-	b.do(a)
-}
-
-// runProgram is the action for running a binary that has already
-// been compiled.  We ignore exit status.
-func (b *builder) runProgram(a *action) error {
-	cmdline := stringList(findExecCmd(), a.deps[0].target, a.args)
-	if buildN || buildX {
-		b.showcmd("", "%s", strings.Join(cmdline, " "))
-		if buildN {
-			return nil
-		}
-	}
-
-	runStdin(cmdline)
-	return nil
-}
-
-// runStdin is like run, but connects Stdin.
-func runStdin(cmdline []string) {
-	cmd := exec.Command(cmdline[0], cmdline[1:]...)
-	cmd.Stdin = os.Stdin
-	cmd.Stdout = os.Stdout
-	cmd.Stderr = os.Stderr
-	cmd.Env = origEnv
-	startSigHandlers()
-	if err := cmd.Run(); err != nil {
-		errorf("%v", err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/script b/third_party/gofrontend/libgo/go/cmd/go/script
deleted file mode 100755
index 340a7e8..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/script
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-
-x() {
-	echo '--- ' "$@"
-	"$@"
-	echo '---'
-	echo
-}
-
-x go help
-x go help build
-x go help clean
-x go help install
-x go help fix
-x go help fmt
-x go help get
-x go help list
-x go help test
-x go help version
-x go help vet
-x go help gopath
-x go help importpath
-x go help remote
diff --git a/third_party/gofrontend/libgo/go/cmd/go/script.txt b/third_party/gofrontend/libgo/go/cmd/go/script.txt
deleted file mode 100644
index a672146..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/script.txt
+++ /dev/null
@@ -1,352 +0,0 @@
----  go help
-usage: go command [arguments]
-
-go manages Go source code.
-
-The commands are:
-
-    build       compile and install packages and dependencies
-    clean       remove intermediate objects
-    fix         run gofix on packages
-    fmt         run gofmt -w on packages
-    get         download and install packages and dependencies
-    install     install packages and dependencies
-    list        list packages
-    test        test packages
-    version     print Go version
-    vet         run govet on packages
-
-Use "go help [command]" for more information about a command.
-
-Additional help topics:
-
-    gopath      GOPATH environment variable
-    importpath  description of import paths
-    remote      remote import path syntax
-
-Use "go help [topic]" for more information about that topic.
-
----
-
----  go help build
-usage: go build [-n] [-v] [importpath...]
-
-Build compiles the packages named by the import paths,
-along with their dependencies, but it does not install the results.
-
-The -n flag prints the commands but does not run them.
-The -v flag prints the commands.
-
-For more about import paths, see 'go help importpath'.
-
-See also: go install, go get, go clean.
----
-
----  go help clean
-usage: go clean [-nuke] [importpath...]
-
-Clean removes intermediate object files generated during
-the compilation of the packages named by the import paths,
-but by default it does not remove the installed package binaries.
-
-The -nuke flag causes clean to remove the installed package binaries too.
-
-TODO: Clean does not clean dependencies of the packages.
-
-For more about import paths, see 'go help importpath'.
----
-
----  go help install
-usage: go install [-n] [-v] [importpath...]
-
-Install compiles and installs the packages named by the import paths,
-along with their dependencies.
-
-The -n flag prints the commands but does not run them.
-The -v flag prints the commands.
-
-For more about import paths, see 'go help importpath'.
-
-See also: go build, go get, go clean.
----
-
----  go help fix
-usage: go fix [importpath...]
-
-Fix runs the gofix command on the packages named by the import paths.
-
-For more about gofix, see 'godoc gofix'.
-For more about import paths, see 'go help importpath'.
-
-To run gofix with specific options, run gofix itself.
-
-See also: go fmt, go vet.
----
-
----  go help fmt
-usage: go fmt [importpath...]
-
-Fmt runs the command 'gofmt -w' on the packages named by the import paths.
-
-For more about gofmt, see 'godoc gofmt'.
-For more about import paths, see 'go help importpath'.
-
-To run gofmt with specific options, run gofmt itself.
-
-See also: go fix, go vet.
----
-
----  go help get
-usage: go get [importpath...]
-
-Get downloads and installs the packages named by the import paths,
-along with their dependencies.
-
-After downloading the code, 'go get' looks for a tag beginning
-with "go." that corresponds to the local Go version.
-For Go "release.r58" it looks for a tag named "go.r58".
-For "weekly.2011-06-03" it looks for "go.weekly.2011-06-03".
-If the specific "go.X" tag is not found, it uses the latest earlier
-version it can find.  Otherwise, it uses the default version for
-the version control system: HEAD for git, tip for Mercurial,
-and so on.
-
-TODO: Explain versions better.
-
-For more about import paths, see 'go help importpath'.
-
-For more about how 'go get' finds source code to
-download, see 'go help remote'.
-
-See also: go build, go install, go clean.
----
-
----  go help list
-usage: go list [-f format] [-json] [importpath...]
-
-List lists the packages named by the import paths.
-
-The default output shows the package name and file system location:
-
-    books /home/you/src/google-api-go-client.googlecode.com/hg/books/v1
-    oauth /home/you/src/goauth2.googlecode.com/hg/oauth
-    sqlite /home/you/src/gosqlite.googlecode.com/hg/sqlite
-
-The -f flag specifies an alternate format for the list,
-using the syntax of package template.  The default output
-is equivalent to -f '{{.Name}} {{.Dir}}'  The struct
-being passed to the template is:
-
-    type Package struct {
-        Name string         // package name
-        Doc string          // package documentation string
-        GoFiles []string    // names of Go source files in package
-        ImportPath string   // import path denoting package
-        Imports []string    // import paths used by this package
-        Deps []string       // all (recursively) imported dependencies
-        Dir string          // directory containing package sources
-        Version string      // version of installed package
-    }
-
-The -json flag causes the package data to be printed in JSON format.
-
-For more about import paths, see 'go help importpath'.
----
-
----  go help test
-usage: go test [importpath...]
-
-Test runs gotest to test the packages named by the import paths.
-It prints a summary of the test results in the format:
-
-	test archive/tar
-	FAIL archive/zip
-	test compress/gzip
-	...
-
-followed by gotest output for each failed package.
-
-For more about import paths, see 'go help importpath'.
-
-See also: go build, go compile, go vet.
----
-
----  go help version
-usage: go version
-
-Version prints the Go version, as reported by runtime.Version.
----
-
----  go help vet
-usage: go vet [importpath...]
-
-Vet runs the govet command on the packages named by the import paths.
-
-For more about govet, see 'godoc govet'.
-For more about import paths, see 'go help importpath'.
-
-To run govet with specific options, run govet itself.
-
-See also: go fmt, go fix.
----
-
----  go help gopath
-The GOPATH environment variable lists places to look for Go code.
-On Unix, the value is a colon-separated string.
-On Windows, the value is a semicolon-separated string.
-On Plan 9, the value is a list.
-
-GOPATH must be set to build and install packages outside the
-standard Go tree.
-
-Each directory listed in GOPATH must have a prescribed structure:
-
-The src/ directory holds source code.  The path below 'src'
-determines the import path or executable name.
-
-The pkg/ directory holds installed package objects.
-As in the Go tree, each target operating system and
-architecture pair has its own subdirectory of pkg
-(pkg/GOOS_GOARCH).
-
-If DIR is a directory listed in the GOPATH, a package with
-source in DIR/src/foo/bar can be imported as "foo/bar" and
-has its compiled form installed to "DIR/pkg/GOOS_GOARCH/foo/bar.a".
-
-The bin/ directory holds compiled commands.
-Each command is named for its source directory, but only
-the final element, not the entire path.  That is, the
-command with source in DIR/src/foo/quux is installed into
-DIR/bin/quux, not DIR/bin/foo/quux.  The foo/ is stripped
-so that you can add DIR/bin to your PATH to get at the
-installed commands.
-
-Here's an example directory layout:
-
-    GOPATH=/home/user/gocode
-
-    /home/user/gocode/
-        src/
-            foo/
-                bar/               (go code in package bar)
-                    x.go
-                quux/              (go code in package main)
-                    y.go
-        bin/
-            quux                   (installed command)
-		pkg/
-		    linux_amd64/
-		        foo/
-		            bar.a          (installed package object)
-
-Go searches each directory listed in GOPATH to find source code,
-but new packages are always downloaded into the first directory 
-in the list.
----
-
----  go help importpath
-Many commands apply to a set of packages named by import paths:
-
-	go action [importpath...]
-
-An import path that is a rooted path or that begins with
-a . or .. element is interpreted as a file system path and
-denotes the package in that directory.
-
-Otherwise, the import path P denotes the package found in
-the directory DIR/src/P for some DIR listed in the GOPATH
-environment variable (see 'go help gopath'). 
-
-If no import paths are given, the action applies to the
-package in the current directory.
-
-The special import path "all" expands to all package directories
-found in all the GOPATH trees.  For example, 'go list all' 
-lists all the packages on the local system.
-
-An import path can also name a package to be downloaded from
-a remote repository.  Run 'go help remote' for details.
-
-Every package in a program must have a unique import path.
-By convention, this is arranged by starting each path with a
-unique prefix that belongs to you.  For example, paths used
-internally at Google all begin with 'google', and paths
-denoting remote repositories begin with the path to the code,
-such as 'project.googlecode.com/'.
----
-
----  go help remote
-An import path (see 'go help importpath') denotes a package
-stored in the local file system.  Certain import paths also
-describe how to obtain the source code for the package using
-a revision control system.
-
-A few common code hosting sites have special syntax:
-
-	BitBucket (Mercurial)
-
-		import "bitbucket.org/user/project"
-		import "bitbucket.org/user/project/sub/directory"
-
-	GitHub (Git)
-
-		import "github.com/user/project"
-		import "github.com/user/project/sub/directory"
-
-	Google Code Project Hosting (Git, Mercurial, Subversion)
-
-		import "project.googlecode.com/git"
-		import "project.googlecode.com/git/sub/directory"
-
-		import "project.googlecode.com/hg"
-		import "project.googlecode.com/hg/sub/directory"
-
-		import "project.googlecode.com/svn/trunk"
-		import "project.googlecode.com/svn/trunk/sub/directory"
-
-	Launchpad (Bazaar)
-
-		import "launchpad.net/project"
-		import "launchpad.net/project/series"
-		import "launchpad.net/project/series/sub/directory"
-
-		import "launchpad.net/~user/project/branch"
-		import "launchpad.net/~user/project/branch/sub/directory"
-
-For code hosted on other servers, an import path of the form
-
-	repository.vcs/path
-
-specifies the given repository, with or without the .vcs suffix,
-using the named version control system, and then the path inside
-that repository.  The supported version control systems are:
-
-	Bazaar      .bzr
-	Git         .git
-	Mercurial   .hg
-	Subversion  .svn
-
-For example,
-
-	import "example.org/user/foo.hg"
-
-denotes the root directory of the Mercurial repository at
-example.org/user/foo or foo.hg, and
-
-	import "example.org/repo.git/foo/bar"
-
-denotes the foo/bar directory of the Git repository at
-example.com/repo or repo.git.
-
-When a version control system supports multiple protocols,
-each is tried in turn when downloading.  For example, a Git
-download tries git://, then https://, then http://.
-
-New downloaded packages are written to the first directory
-listed in the GOPATH environment variable (see 'go help gopath').
-
-The go command attempts to download the version of the
-package appropriate for the Go release being used.
-Run 'go help install' for more.
----
-
diff --git a/third_party/gofrontend/libgo/go/cmd/go/signal.go b/third_party/gofrontend/libgo/go/cmd/go/signal.go
deleted file mode 100644
index e8ba0d3..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/signal.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"os"
-	"os/signal"
-	"sync"
-)
-
-// interrupted is closed, if go process is interrupted.
-var interrupted = make(chan struct{})
-
-// processSignals setups signal handler.
-func processSignals() {
-	sig := make(chan os.Signal)
-	signal.Notify(sig, signalsToIgnore...)
-	go func() {
-		<-sig
-		close(interrupted)
-	}()
-}
-
-var onceProcessSignals sync.Once
-
-// startSigHandlers start signal handlers.
-func startSigHandlers() {
-	onceProcessSignals.Do(processSignals)
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/signal_notunix.go b/third_party/gofrontend/libgo/go/cmd/go/signal_notunix.go
deleted file mode 100644
index 29aa9d8..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/signal_notunix.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build plan9 windows
-
-package main
-
-import (
-	"os"
-)
-
-var signalsToIgnore = []os.Signal{os.Interrupt}
-
-// signalTrace is the signal to send to make a Go program
-// crash with a stack trace.
-var signalTrace os.Signal = nil
diff --git a/third_party/gofrontend/libgo/go/cmd/go/signal_unix.go b/third_party/gofrontend/libgo/go/cmd/go/signal_unix.go
deleted file mode 100644
index e86cd46..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/signal_unix.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package main
-
-import (
-	"os"
-	"syscall"
-)
-
-var signalsToIgnore = []os.Signal{os.Interrupt, syscall.SIGQUIT}
-
-// signalTrace is the signal to send to make a Go program
-// crash with a stack trace.
-var signalTrace os.Signal = syscall.SIGQUIT
diff --git a/third_party/gofrontend/libgo/go/cmd/go/tag_test.go b/third_party/gofrontend/libgo/go/cmd/go/tag_test.go
deleted file mode 100644
index ffe218c..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/tag_test.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "testing"
-
-var selectTagTestTags = []string{
-	"go.r58",
-	"go.r58.1",
-	"go.r59",
-	"go.r59.1",
-	"go.r61",
-	"go.r61.1",
-	"go.weekly.2010-01-02",
-	"go.weekly.2011-10-12",
-	"go.weekly.2011-10-12.1",
-	"go.weekly.2011-10-14",
-	"go.weekly.2011-11-01",
-	"go1",
-	"go1.0.1",
-	"go1.999",
-	"go1.9.2",
-	"go5",
-
-	// these should be ignored:
-	"release.r59",
-	"release.r59.1",
-	"release",
-	"weekly.2011-10-12",
-	"weekly.2011-10-12.1",
-	"weekly",
-	"foo",
-	"bar",
-	"go.f00",
-	"go!r60",
-	"go.1999-01-01",
-	"go.2x",
-	"go.20000000000000",
-	"go.2.",
-	"go.2.0",
-	"go2x",
-	"go20000000000000",
-	"go2.",
-	"go2.0",
-}
-
-var selectTagTests = []struct {
-	version  string
-	selected string
-}{
-	/*
-		{"release.r57", ""},
-		{"release.r58.2", "go.r58.1"},
-		{"release.r59", "go.r59"},
-		{"release.r59.1", "go.r59.1"},
-		{"release.r60", "go.r59.1"},
-		{"release.r60.1", "go.r59.1"},
-		{"release.r61", "go.r61"},
-		{"release.r66", "go.r61.1"},
-		{"weekly.2010-01-01", ""},
-		{"weekly.2010-01-02", "go.weekly.2010-01-02"},
-		{"weekly.2010-01-02.1", "go.weekly.2010-01-02"},
-		{"weekly.2010-01-03", "go.weekly.2010-01-02"},
-		{"weekly.2011-10-12", "go.weekly.2011-10-12"},
-		{"weekly.2011-10-12.1", "go.weekly.2011-10-12.1"},
-		{"weekly.2011-10-13", "go.weekly.2011-10-12.1"},
-		{"weekly.2011-10-14", "go.weekly.2011-10-14"},
-		{"weekly.2011-10-14.1", "go.weekly.2011-10-14"},
-		{"weekly.2011-11-01", "go.weekly.2011-11-01"},
-		{"weekly.2014-01-01", "go.weekly.2011-11-01"},
-		{"weekly.3000-01-01", "go.weekly.2011-11-01"},
-		{"go1", "go1"},
-		{"go1.1", "go1.0.1"},
-		{"go1.998", "go1.9.2"},
-		{"go1.1000", "go1.999"},
-		{"go6", "go5"},
-
-		// faulty versions:
-		{"release.f00", ""},
-		{"weekly.1999-01-01", ""},
-		{"junk", ""},
-		{"", ""},
-		{"go2x", ""},
-		{"go200000000000", ""},
-		{"go2.", ""},
-		{"go2.0", ""},
-	*/
-	{"anything", "go1"},
-}
-
-func TestSelectTag(t *testing.T) {
-	for _, c := range selectTagTests {
-		selected := selectTag(c.version, selectTagTestTags)
-		if selected != c.selected {
-			t.Errorf("selectTag(%q) = %q, want %q", c.version, selected, c.selected)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/test.bash b/third_party/gofrontend/libgo/go/cmd/go/test.bash
deleted file mode 100755
index 0060ce2..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/test.bash
+++ /dev/null
@@ -1,820 +0,0 @@
-#!/bin/bash
-# Copyright 2012 The Go Authors.  All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-set -e
-go build -o testgo
-go() {
-	echo TEST ERROR: ran go, not testgo: go "$@" >&2
-	exit 2
-}
-
-started=false
-TEST() {
-	if $started; then
-		stop
-	fi
-	echo TEST: "$@"
-	started=true
-	ok=true
-}
-stop() {
-	if ! $started; then
-		echo TEST ERROR: stop missing start >&2
-		exit 2
-	fi
-	started=false
-	if $ok; then
-		echo PASS
-	else
-		echo FAIL
-		allok=false
-	fi
-}
-
-ok=true
-allok=true
-
-unset GOBIN
-unset GOPATH
-unset GOROOT
-
-TEST 'file:line in error messages'
-# Test that error messages have file:line information at beginning of
-# the line. Also test issue 4917: that the error is on stderr.
-d=$(TMPDIR=/var/tmp mktemp -d -t testgoXXX)
-fn=$d/err.go
-echo "package main" > $fn
-echo 'import "bar"' >> $fn
-./testgo run $fn 2>$d/err.out || true
-if ! grep -q "^$fn:" $d/err.out; then
-	echo "missing file:line in error message"
-	cat $d/err.out
-	ok=false
-fi
-rm -r $d
-
-# Test local (./) imports.
-testlocal() {
-	local="$1"
-	TEST local imports $2 '(easy)'
-	./testgo build -o hello "testdata/$local/easy.go"
-	./hello >hello.out
-	if ! grep -q '^easysub\.Hello' hello.out; then
-		echo "testdata/$local/easy.go did not generate expected output"
-		cat hello.out
-		ok=false
-	fi
-	
-	TEST local imports $2 '(easysub)'
-	./testgo build -o hello "testdata/$local/easysub/main.go"
-	./hello >hello.out
-	if ! grep -q '^easysub\.Hello' hello.out; then
-		echo "testdata/$local/easysub/main.go did not generate expected output"
-		cat hello.out
-		ok=false
-	fi
-	
-	TEST local imports $2 '(hard)'
-	./testgo build -o hello "testdata/$local/hard.go"
-	./hello >hello.out
-	if ! grep -q '^sub\.Hello' hello.out || ! grep -q '^subsub\.Hello' hello.out ; then
-		echo "testdata/$local/hard.go did not generate expected output"
-		cat hello.out
-		ok=false
-	fi
-	
-	rm -f hello.out hello
-	
-	# Test that go install x.go fails.
-	TEST local imports $2 '(go install should fail)'
-	if ./testgo install "testdata/$local/easy.go" >/dev/null 2>&1; then
-		echo "go install testdata/$local/easy.go succeeded"
-		ok=false
-	fi
-}
-
-# Test local imports
-testlocal local ''
-
-# Test local imports again, with bad characters in the directory name.
-bad='#$%:, &()*;<=>?\^{}'
-rm -rf "testdata/$bad"
-cp -R testdata/local "testdata/$bad"
-testlocal "$bad" 'with bad characters in path'
-rm -rf "testdata/$bad"
-
-TEST error message for syntax error in test go file says FAIL
-export GOPATH=$(pwd)/testdata
-if ./testgo test syntaxerror 2>testdata/err; then
-	echo 'go test syntaxerror succeeded'
-	ok=false
-elif ! grep FAIL testdata/err >/dev/null; then
-	echo 'go test did not say FAIL:'
-	cat testdata/err
-	ok=false
-fi
-rm -f ./testdata/err
-unset GOPATH
-
-TEST wildcards do not look in useless directories
-export GOPATH=$(pwd)/testdata
-if ./testgo list ... >testdata/err 2>&1; then
-	echo "go list ... succeeded"
-	ok=false
-elif ! grep badpkg testdata/err >/dev/null; then
-	echo "go list ... failure does not mention badpkg"
-	cat testdata/err
-	ok=false
-elif ! ./testgo list m... >testdata/err 2>&1; then
-	echo "go list m... failed"
-	ok=false
-fi
-rm -rf ./testdata/err
-unset GOPATH
-
-# Test tests with relative imports.
-TEST relative imports '(go test)'
-if ! ./testgo test ./testdata/testimport; then
-	echo "go test ./testdata/testimport failed"
-	ok=false
-fi
-
-# Test installation with relative imports.
-TEST relative imports '(go test -i)'
-if ! ./testgo test -i ./testdata/testimport; then
-    echo "go test -i ./testdata/testimport failed"
-    ok=false
-fi
-
-# Test tests with relative imports in packages synthesized
-# from Go files named on the command line.
-TEST relative imports in command-line package
-if ! ./testgo test ./testdata/testimport/*.go; then
-	echo "go test ./testdata/testimport/*.go failed"
-	ok=false
-fi
-
-TEST version control error message includes correct directory
-export GOPATH=$(pwd)/testdata/shadow/root1
-if ./testgo get -u foo 2>testdata/err; then
-	echo "go get -u foo succeeded unexpectedly"
-	ok=false
-elif ! grep testdata/shadow/root1/src/foo testdata/err >/dev/null; then
-	echo "go get -u error does not mention shadow/root1/src/foo:"
-	cat testdata/err
-	ok=false
-fi
-unset GOPATH
-
-TEST go install fails with no buildable files
-export GOPATH=$(pwd)/testdata
-export CGO_ENABLED=0
-if ./testgo install cgotest 2>testdata/err; then
-	echo "go install cgotest succeeded unexpectedly"
-elif ! grep 'no buildable Go source files' testdata/err >/dev/null; then
-	echo "go install cgotest did not report 'no buildable Go source files'"
-	cat testdata/err
-	ok=false
-fi
-unset CGO_ENABLED
-unset GOPATH
-
-# Test that without $GOBIN set, binaries get installed
-# into the GOPATH bin directory.
-TEST install into GOPATH
-rm -rf testdata/bin
-if ! GOPATH=$(pwd)/testdata ./testgo install go-cmd-test; then
-	echo "go install go-cmd-test failed"
-	ok=false
-elif ! test -x testdata/bin/go-cmd-test; then
-	echo "go install go-cmd-test did not write to testdata/bin/go-cmd-test"
-	ok=false
-fi
-
-TEST package main_test imports archive not binary
-export GOBIN=$(pwd)/testdata/bin
-mkdir -p $GOBIN
-export GOPATH=$(pwd)/testdata
-touch ./testdata/src/main_test/m.go
-if ! ./testgo test main_test; then
-	echo "go test main_test failed without install"
-	ok=false
-elif ! ./testgo install main_test; then
-	echo "go test main_test failed"
-	ok=false
-elif [ "$(./testgo list -f '{{.Stale}}' main_test)" != false ]; then
-	echo "after go install, main listed as stale"
-	ok=false
-elif ! ./testgo test main_test; then
-	echo "go test main_test failed after install"
-	ok=false
-fi
-rm -rf $GOBIN
-unset GOBIN
-
-# And with $GOBIN set, binaries get installed to $GOBIN.
-TEST install into GOBIN
-if ! GOBIN=$(pwd)/testdata/bin1 GOPATH=$(pwd)/testdata ./testgo install go-cmd-test; then
-	echo "go install go-cmd-test failed"
-	ok=false
-elif ! test -x testdata/bin1/go-cmd-test; then
-	echo "go install go-cmd-test did not write to testdata/bin1/go-cmd-test"
-	ok=false
-fi
-
-# Without $GOBIN set, installing a program outside $GOPATH should fail
-# (there is nowhere to install it).
-TEST install without destination fails
-if ./testgo install testdata/src/go-cmd-test/helloworld.go 2>testdata/err; then
-	echo "go install testdata/src/go-cmd-test/helloworld.go should have failed, did not"
-	ok=false
-elif ! grep 'no install location for .go files listed on command line' testdata/err; then
-	echo "wrong error:"
-	cat testdata/err
-	ok=false
-fi
-rm -f testdata/err
-
-# With $GOBIN set, should install there.
-TEST install to GOBIN '(command-line package)'
-if ! GOBIN=$(pwd)/testdata/bin1 ./testgo install testdata/src/go-cmd-test/helloworld.go; then
-	echo "go install testdata/src/go-cmd-test/helloworld.go failed"
-	ok=false
-elif ! test -x testdata/bin1/helloworld; then
-	echo "go install testdata/src/go-cmd-test/helloworld.go did not write testdata/bin1/helloworld"
-	ok=false
-fi
-
-TEST godoc installs into GOBIN
-d=$(mktemp -d -t testgoXXX)
-export GOPATH=$d
-mkdir $d/gobin
-GOBIN=$d/gobin ./testgo get code.google.com/p/go.tools/cmd/godoc
-if [ ! -x $d/gobin/godoc ]; then
-	echo did not install godoc to '$GOBIN'
-	GOBIN=$d/gobin ./testgo list -f 'Target: {{.Target}}' code.google.com/p/go.tools/cmd/godoc
-	ok=false
-fi
-
-TEST godoc installs into GOROOT
-GOROOT=$(./testgo env GOROOT)
-rm -f $GOROOT/bin/godoc
-./testgo install code.google.com/p/go.tools/cmd/godoc
-if [ ! -x $GOROOT/bin/godoc ]; then
-	echo did not install godoc to '$GOROOT/bin'
-	./testgo list -f 'Target: {{.Target}}' code.google.com/p/go.tools/cmd/godoc
-	ok=false
-fi
-
-TEST cmd/fix installs into tool
-GOOS=$(./testgo env GOOS)
-GOARCH=$(./testgo env GOARCH)
-rm -f $GOROOT/pkg/tool/${GOOS}_${GOARCH}/fix
-./testgo install cmd/fix
-if [ ! -x $GOROOT/pkg/tool/${GOOS}_${GOARCH}/fix ]; then
-	echo 'did not install cmd/fix to $GOROOT/pkg/tool'
-	GOBIN=$d/gobin ./testgo list -f 'Target: {{.Target}}' cmd/fix
-	ok=false
-fi
-rm -f $GOROOT/pkg/tool/${GOOS}_${GOARCH}/fix
-GOBIN=$d/gobin ./testgo install cmd/fix
-if [ ! -x $GOROOT/pkg/tool/${GOOS}_${GOARCH}/fix ]; then
-	echo 'did not install cmd/fix to $GOROOT/pkg/tool with $GOBIN set'
-	GOBIN=$d/gobin ./testgo list -f 'Target: {{.Target}}' cmd/fix
-	ok=false
-fi
-
-TEST gopath program installs into GOBIN
-mkdir $d/src/progname
-echo 'package main; func main() {}' >$d/src/progname/p.go
-GOBIN=$d/gobin ./testgo install progname
-if [ ! -x $d/gobin/progname ]; then
-	echo 'did not install progname to $GOBIN/progname'
-	./testgo list -f 'Target: {{.Target}}' cmd/api
-	ok=false
-fi
-rm -f $d/gobin/progname $d/bin/progname
-
-TEST gopath program installs into GOPATH/bin
-./testgo install progname
-if [ ! -x $d/bin/progname ]; then
-	echo 'did not install progname to $GOPATH/bin/progname'
-	./testgo list -f 'Target: {{.Target}}' progname
-	ok=false
-fi
-
-unset GOPATH
-rm -rf $d
-
-# Reject relative paths in GOPATH.
-TEST reject relative paths in GOPATH '(command-line package)'
-if GOPATH=. ./testgo build testdata/src/go-cmd-test/helloworld.go; then
-    echo 'GOPATH="." go build should have failed, did not'
-    ok=false
-fi
-
-TEST reject relative paths in GOPATH 
-if GOPATH=:$(pwd)/testdata:. ./testgo build go-cmd-test; then
-    echo 'GOPATH=":$(pwd)/testdata:." go build should have failed, did not'
-    ok=false
-fi
-
-# issue 4104
-TEST go test with package listed multiple times
-if [ $(./testgo test fmt fmt fmt fmt fmt | wc -l) -ne 1 ] ; then
-    echo 'go test fmt fmt fmt fmt fmt tested the same package multiple times'
-    ok=false
-fi
-
-# ensure that output of 'go list' is consistent between runs
-TEST go list is consistent
-./testgo list std > test_std.list
-if ! ./testgo list std | cmp -s test_std.list - ; then
-	echo "go list std ordering is inconsistent"
-	ok=false
-fi
-rm -f test_std.list
-
-# issue 4096. Validate the output of unsuccessful go install foo/quxx 
-TEST unsuccessful go install should mention missing package
-if [ $(./testgo install 'foo/quxx' 2>&1 | grep -c 'cannot find package "foo/quxx" in any of') -ne 1 ] ; then
-	echo 'go install foo/quxx expected error: .*cannot find package "foo/quxx" in any of'
-	ok=false
-fi 
-# test GOROOT search failure is reported
-TEST GOROOT search failure reporting
-if [ $(./testgo install 'foo/quxx' 2>&1 | egrep -c 'foo/quxx \(from \$GOROOT\)$') -ne 1 ] ; then
-        echo 'go install foo/quxx expected error: .*foo/quxx (from $GOROOT)'
-        ok=false
-fi
-# test multiple GOPATH entries are reported separately
-TEST multiple GOPATH entries reported separately
-if [ $(GOPATH=$(pwd)/testdata/a:$(pwd)/testdata/b ./testgo install 'foo/quxx' 2>&1 | egrep -c 'testdata/./src/foo/quxx') -ne 2 ] ; then
-        echo 'go install foo/quxx expected error: .*testdata/a/src/foo/quxx (from $GOPATH)\n.*testdata/b/src/foo/quxx'
-        ok=false
-fi
-# test (from $GOPATH) annotation is reported for the first GOPATH entry
-TEST mention GOPATH in first GOPATH entry
-if [ $(GOPATH=$(pwd)/testdata/a:$(pwd)/testdata/b ./testgo install 'foo/quxx' 2>&1 | egrep -c 'testdata/a/src/foo/quxx \(from \$GOPATH\)$') -ne 1 ] ; then
-        echo 'go install foo/quxx expected error: .*testdata/a/src/foo/quxx (from $GOPATH)'
-        ok=false
-fi
-# but not on the second
-TEST but not the second entry
-if [ $(GOPATH=$(pwd)/testdata/a:$(pwd)/testdata/b ./testgo install 'foo/quxx' 2>&1 | egrep -c 'testdata/b/src/foo/quxx$') -ne 1 ] ; then
-        echo 'go install foo/quxx expected error: .*testdata/b/src/foo/quxx'
-        ok=false
-fi
-# test missing GOPATH is reported
-TEST missing GOPATH is reported
-if [ $(GOPATH= ./testgo install 'foo/quxx' 2>&1 | egrep -c '\(\$GOPATH not set\)$') -ne 1 ] ; then
-        echo 'go install foo/quxx expected error: ($GOPATH not set)'
-        ok=false
-fi
-
-# issue 4186. go get cannot be used to download packages to $GOROOT
-# Test that without GOPATH set, go get should fail
-TEST without GOPATH, go get fails
-d=$(mktemp -d -t testgoXXX)
-mkdir -p $d/src/pkg
-if GOPATH= GOROOT=$d ./testgo get -d code.google.com/p/go.codereview/cmd/hgpatch ; then 
-	echo 'go get code.google.com/p/go.codereview/cmd/hgpatch should not succeed with $GOPATH unset'
-	ok=false
-fi	
-rm -rf $d
-
-# Test that with GOPATH=$GOROOT, go get should fail
-TEST with GOPATH=GOROOT, go get fails
-d=$(mktemp -d -t testgoXXX)
-mkdir -p $d/src/pkg
-if GOPATH=$d GOROOT=$d ./testgo get -d code.google.com/p/go.codereview/cmd/hgpatch ; then
-        echo 'go get code.google.com/p/go.codereview/cmd/hgpatch should not succeed with GOPATH=$GOROOT'
-        ok=false
-fi
-rm -rf $d
-
-TEST ldflags arguments with spaces '(issue 3941)'
-d=$(mktemp -d -t testgoXXX)
-cat >$d/main.go<<EOF
-package main
-var extern string
-func main() {
-	println(extern)
-}
-EOF
-./testgo run -ldflags '-X main.extern "hello world"' $d/main.go 2>hello.out
-if ! grep -q '^hello world' hello.out; then
-	echo "ldflags -X main.extern 'hello world' failed. Output:"
-	cat hello.out
-	ok=false
-fi
-rm -rf $d hello.out
-
-TEST go test -cpuprofile leaves binary behind
-./testgo test -cpuprofile strings.prof strings || ok=false
-if [ ! -x strings.test ]; then
-	echo "go test -cpuprofile did not create strings.test"
-	ok=false
-fi
-rm -f strings.prof strings.test
-
-TEST symlinks do not confuse go list '(issue 4568)'
-old=$(pwd)
-tmp=$(cd /tmp && pwd -P)
-d=$(TMPDIR=$tmp mktemp -d -t testgoXXX)
-mkdir -p $d/src
-(
-	ln -s $d $d/src/dir1
-	cd $d/src
-	echo package p >dir1/p.go
-	export GOPATH=$d
-	if [ "$($old/testgo list -f '{{.Root}}' dir1)" != "$d" ]; then
-		echo Confused by symlinks.
-		echo "Package in current directory $(pwd) should have Root $d"
-		env|grep WD
-		$old/testgo list -json . dir1
-		touch $d/failed
-	fi		
-)
-if [ -f $d/failed ]; then
-	ok=false
-fi
-rm -rf $d
-
-TEST 'install with tags (issue 4515)'
-d=$(TMPDIR=/var/tmp mktemp -d -t testgoXXX)
-mkdir -p $d/src/example/a $d/src/example/b $d/bin
-cat >$d/src/example/a/main.go <<EOF
-package main
-func main() {}
-EOF
-cat >$d/src/example/b/main.go <<EOF
-// +build mytag
-
-package main
-func main() {}
-EOF
-GOPATH=$d ./testgo install -tags mytag example/a example/b || ok=false
-if [ ! -x $d/bin/a -o ! -x $d/bin/b ]; then
-	echo go install example/a example/b did not install binaries
-	ok=false
-fi
-rm -f $d/bin/*
-GOPATH=$d ./testgo install -tags mytag example/... || ok=false
-if [ ! -x $d/bin/a -o ! -x $d/bin/b ]; then
-	echo go install example/... did not install binaries
-	ok=false
-fi
-rm -f $d/bin/*go
-export GOPATH=$d
-if [ "$(./testgo list -tags mytag example/b...)" != "example/b" ]; then
-	echo go list example/b did not find example/b
-	ok=false
-fi
-unset GOPATH
-rm -rf $d
-
-TEST case collisions '(issue 4773)'
-d=$(TMPDIR=/var/tmp mktemp -d -t testgoXXX)
-export GOPATH=$d
-mkdir -p $d/src/example/{a/pkg,a/Pkg,b}
-cat >$d/src/example/a/a.go <<EOF
-package p
-import (
-	_ "example/a/pkg"
-	_ "example/a/Pkg"
-)
-EOF
-cat >$d/src/example/a/pkg/pkg.go <<EOF
-package pkg
-EOF
-cat >$d/src/example/a/Pkg/pkg.go <<EOF
-package pkg
-EOF
-if ./testgo list example/a 2>$d/out; then
-	echo go list example/a should have failed, did not.
-	ok=false
-elif ! grep "case-insensitive import collision" $d/out >/dev/null; then
-	echo go list example/a did not report import collision.
-	ok=false
-fi
-cat >$d/src/example/b/file.go <<EOF
-package b
-EOF
-cat >$d/src/example/b/FILE.go <<EOF
-package b
-EOF
-if [ $(ls $d/src/example/b | wc -l) = 2 ]; then
-	# case-sensitive file system, let directory read find both files
-	args="example/b"
-else
-	# case-insensitive file system, list files explicitly on command line.
-	args="$d/src/example/b/file.go $d/src/example/b/FILE.go"
-fi
-if ./testgo list $args 2>$d/out; then
-	echo go list example/b should have failed, did not.
-	ok=false
-elif ! grep "case-insensitive file name collision" $d/out >/dev/null; then
-	echo go list example/b did not report file name collision.
-	ok=false
-fi
-
-TEST go get cover
-./testgo get code.google.com/p/go.tools/cmd/cover || ok=false
-
-unset GOPATH
-rm -rf $d
-
-TEST shadowing logic
-export GOPATH=$(pwd)/testdata/shadow/root1:$(pwd)/testdata/shadow/root2
-
-# The math in root1 is not "math" because the standard math is.
-cdir=$(./testgo list -f '({{.ImportPath}}) ({{.ConflictDir}})' ./testdata/shadow/root1/src/math)
-if [ "$cdir" != "(_$(pwd)/testdata/shadow/root1/src/math) ($GOROOT/src/pkg/math)" ]; then
-	echo shadowed math is not shadowed: "$cdir"
-	ok=false
-fi
-
-# The foo in root1 is "foo".
-cdir=$(./testgo list -f '({{.ImportPath}}) ({{.ConflictDir}})' ./testdata/shadow/root1/src/foo)
-if [ "$cdir" != "(foo) ()" ]; then
-	echo unshadowed foo is shadowed: "$cdir"
-	ok=false
-fi
-
-# The foo in root2 is not "foo" because the foo in root1 got there first.
-cdir=$(./testgo list -f '({{.ImportPath}}) ({{.ConflictDir}})' ./testdata/shadow/root2/src/foo)
-if [ "$cdir" != "(_$(pwd)/testdata/shadow/root2/src/foo) ($(pwd)/testdata/shadow/root1/src/foo)" ]; then
-	echo shadowed foo is not shadowed: "$cdir"
-	ok=false
-fi
-
-# The error for go install should mention the conflicting directory.
-err=$(! ./testgo install ./testdata/shadow/root2/src/foo 2>&1)
-if [ "$err" != "go install: no install location for $(pwd)/testdata/shadow/root2/src/foo: hidden by $(pwd)/testdata/shadow/root1/src/foo" ]; then
-	echo wrong shadowed install error: "$err"
-	ok=false
-fi
-
-# Only succeeds if source order is preserved.
-TEST source file name order preserved
-./testgo test testdata/example[12]_test.go || ok=false
-
-# Check that coverage analysis works at all.
-# Don't worry about the exact numbers but require not 0.0%.
-checkcoverage() {
-	if grep '[^0-9]0\.0%' testdata/cover.txt >/dev/null; then
-		echo 'some coverage results are 0.0%'
-		ok=false
-	fi
-	cat testdata/cover.txt
-	rm -f testdata/cover.txt
-}
-	
-TEST coverage runs
-./testgo test -short -coverpkg=strings strings regexp >testdata/cover.txt 2>&1 || ok=false
-./testgo test -short -cover strings math regexp >>testdata/cover.txt 2>&1 || ok=false
-checkcoverage
-
-# Check that coverage analysis uses set mode.
-TEST coverage uses set mode
-if ./testgo test -short -cover encoding/binary -coverprofile=testdata/cover.out >testdata/cover.txt 2>&1; then
-	if ! grep -q 'mode: set' testdata/cover.out; then
-		ok=false
-	fi
-	checkcoverage
-else
-	ok=false
-fi
-rm -f testdata/cover.out testdata/cover.txt
-
-TEST coverage uses atomic mode for -race.
-if ./testgo test -short -race -cover encoding/binary -coverprofile=testdata/cover.out >testdata/cover.txt 2>&1; then
-	if ! grep -q 'mode: atomic' testdata/cover.out; then
-		ok=false
-	fi
-	checkcoverage
-else
-	ok=false
-fi
-rm -f testdata/cover.out
-
-TEST coverage uses actual setting to override even for -race.
-if ./testgo test -short -race -cover encoding/binary -covermode=count -coverprofile=testdata/cover.out >testdata/cover.txt 2>&1; then
-	if ! grep -q 'mode: count' testdata/cover.out; then
-		ok=false
-	fi
-	checkcoverage
-else
-	ok=false
-fi
-rm -f testdata/cover.out
-
-TEST coverage with cgo
-d=$(TMPDIR=/var/tmp mktemp -d -t testgoXXX)
-./testgo test -short -cover ./testdata/cgocover >testdata/cover.txt 2>&1 || ok=false
-checkcoverage
-
-TEST cgo depends on syscall
-rm -rf $GOROOT/pkg/*_race
-d=$(TMPDIR=/var/tmp mktemp -d -t testgoXXX)
-export GOPATH=$d
-mkdir -p $d/src/foo
-echo '
-package foo
-//#include <stdio.h>
-import "C"
-' >$d/src/foo/foo.go
-./testgo build -race foo || ok=false
-rm -rf $d
-unset GOPATH
-
-TEST cgo shows full path names
-d=$(TMPDIR=/var/tmp mktemp -d -t testgoXXX)
-export GOPATH=$d
-mkdir -p $d/src/x/y/dirname
-echo '
-package foo
-import "C"
-func f() {
-' >$d/src/x/y/dirname/foo.go
-if ./testgo build x/y/dirname >$d/err 2>&1; then
-	echo build succeeded unexpectedly.
-	ok=false
-elif ! grep x/y/dirname $d/err >/dev/null; then
-	echo error did not use full path.
-	cat $d/err
-	ok=false
-fi
-rm -rf $d
-unset GOPATH
-
-TEST 'cgo handles -Wl,$ORIGIN'
-d=$(TMPDIR=/var/tmp mktemp -d -t testgoXXX)
-export GOPATH=$d
-mkdir -p $d/src/origin
-echo '
-package origin
-// #cgo !darwin LDFLAGS: -Wl,-rpath -Wl,$ORIGIN
-// void f(void) {}
-import "C"
-
-func f() { C.f() }
-' >$d/src/origin/origin.go
-if ! ./testgo build origin; then
-	echo build failed
-	ok=false
-fi
-rm -rf $d
-unset GOPATH
-
-TEST 'Issue 6480: "go test -c -test.bench=XXX fmt" should not hang'
-if ! ./testgo test -c -test.bench=XXX fmt; then
-	echo build test failed
-	ok=false
-fi
-rm -f fmt.test
-
-TEST 'Issue 7573: cmd/cgo: undefined reference when linking a C-library using gccgo'
-d=$(mktemp -d -t testgoXXX)
-export GOPATH=$d
-mkdir -p $d/src/cgoref
-ldflags="-L alibpath -lalib"
-echo "
-package main
-// #cgo LDFLAGS: $ldflags
-// void f(void) {}
-import \"C\"
-
-func main() { C.f() }
-" >$d/src/cgoref/cgoref.go
-go_cmds="$(./testgo build -n -compiler gccgo cgoref 2>&1 1>/dev/null)"
-ldflags_count="$(echo "$go_cmds" | egrep -c "^gccgo.*$(echo $ldflags | sed -e 's/-/\\-/g')" || true)"
-if [ "$ldflags_count" -lt 1 ]; then
-	echo "No Go-inline "#cgo LDFLAGS:" (\"$ldflags\") passed to gccgo linking stage."
-	ok=false
-fi
-rm -rf $d
-unset ldflags_count
-unset go_cmds
-unset ldflags
-unset GOPATH
-
-TEST list template can use context function
-if ! ./testgo list -f "GOARCH: {{context.GOARCH}}"; then 
-	echo unable to use context in list template
-	ok=false
-fi
-
-TEST 'Issue 7108: cmd/go: "go test" should fail if package does not build'
-export GOPATH=$(pwd)/testdata
-if ./testgo test notest >/dev/null 2>&1; then
-	echo 'go test notest succeeded, but should fail'
-	ok=false
-fi
-unset GOPATH
-
-TEST 'Issue 6844: cmd/go: go test -a foo does not rebuild regexp'
-if ! ./testgo test -x -a -c testdata/dep_test.go 2>deplist; then
-	echo "go test -x -a -c testdata/dep_test.go failed"
-	ok=false
-elif ! grep -q regexp deplist; then
-	echo "go test -x -a -c testdata/dep_test.go did not rebuild regexp"
-	ok=false
-fi
-rm -f deplist
-rm -f deps.test
-
-TEST list template can use context function
-if ! ./testgo list -f "GOARCH: {{context.GOARCH}}"; then 
-	echo unable to use context in list template
-	ok=false
-fi
-
-TEST build -i installs dependencies
-d=$(TMPDIR=/var/tmp mktemp -d -t testgoXXX)
-export GOPATH=$d
-mkdir -p $d/src/x/y/foo $d/src/x/y/bar
-echo '
-package foo
-func F() {}
-' >$d/src/x/y/foo/foo.go
-echo '
-package bar
-import "x/y/foo"
-func F() { foo.F() }
-' >$d/src/x/y/bar/bar.go
-if ! ./testgo build -v -i x/y/bar &> $d/err; then
-	echo build -i failed
-	cat $d/err
-	ok=false
-elif ! grep x/y/foo $d/err >/dev/null; then
-	echo first build -i did not build x/y/foo
-	cat $d/err
-	ok=false
-fi
-if ! ./testgo build -v -i x/y/bar &> $d/err; then
-	echo second build -i failed
-	cat $d/err
-	ok=false
-elif grep x/y/foo $d/err >/dev/null; then
-	echo second build -i built x/y/foo
-	cat $d/err
-	ok=false
-fi
-rm -rf $d
-unset GOPATH
-
-TEST 'go build in test-only directory fails with a good error'
-if ./testgo build ./testdata/testonly 2>testdata/err.out; then
-	echo "go build ./testdata/testonly succeeded, should have failed"
-	ok=false
-elif ! grep 'no buildable Go' testdata/err.out >/dev/null; then
-	echo "go build ./testdata/testonly produced unexpected error:"
-	cat testdata/err.out
-	ok=false
-fi
-rm -f testdata/err.out
-
-TEST 'go test detects test-only import cycles'
-export GOPATH=$(pwd)/testdata
-if ./testgo test -c testcycle/p3 2>testdata/err.out; then
-	echo "go test testcycle/p3 succeeded, should have failed"
-	ok=false
-elif ! grep 'import cycle not allowed in test' testdata/err.out >/dev/null; then
-	echo "go test testcycle/p3 produced unexpected error:"
-	cat testdata/err.out
-	ok=false
-fi
-rm -f testdata/err.out
-unset GOPATH
-
-TEST 'go test foo_test.go works'
-if ! ./testgo test testdata/standalone_test.go; then
-	echo "go test testdata/standalone_test.go failed"
-	ok=false
-fi
-
-TEST 'go test xtestonly works'
-export GOPATH=$(pwd)/testdata
-./testgo clean -i xtestonly
-if ! ./testgo test xtestonly >/dev/null; then
-	echo "go test xtestonly failed"
-	ok=false
-fi
-unset GOPATH
-
-
-# clean up
-if $started; then stop; fi
-rm -rf testdata/bin testdata/bin1
-rm -f testgo
-
-if $allok; then
-	echo PASS
-else
-	echo FAIL
-	exit 1
-fi
diff --git a/third_party/gofrontend/libgo/go/cmd/go/test.go b/third_party/gofrontend/libgo/go/cmd/go/test.go
deleted file mode 100644
index aadfdf6..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/test.go
+++ /dev/null
@@ -1,1459 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"go/ast"
-	"go/build"
-	"go/doc"
-	"go/parser"
-	"go/token"
-	"log"
-	"os"
-	"os/exec"
-	"path"
-	"path/filepath"
-	"regexp"
-	"runtime"
-	"sort"
-	"strings"
-	"text/template"
-	"time"
-	"unicode"
-	"unicode/utf8"
-)
-
-// Break init loop.
-func init() {
-	cmdTest.Run = runTest
-}
-
-const testUsage = "test [-c] [-i] [build and test flags] [packages] [flags for test binary]"
-
-var cmdTest = &Command{
-	CustomFlags: true,
-	UsageLine:   testUsage,
-	Short:       "test packages",
-	Long: `
-'Go test' automates testing the packages named by the import paths.
-It prints a summary of the test results in the format:
-
-	ok   archive/tar   0.011s
-	FAIL archive/zip   0.022s
-	ok   compress/gzip 0.033s
-	...
-
-followed by detailed output for each failed package.
-
-'Go test' recompiles each package along with any files with names matching
-the file pattern "*_test.go".
-Files whose names begin with "_" (including "_test.go") or "." are ignored.
-These additional files can contain test functions, benchmark functions, and
-example functions.  See 'go help testfunc' for more.
-Each listed package causes the execution of a separate test binary.
-
-Test files that declare a package with the suffix "_test" will be compiled as a
-separate package, and then linked and run with the main test binary.
-
-By default, go test needs no arguments.  It compiles and tests the package
-with source in the current directory, including tests, and runs the tests.
-
-The package is built in a temporary directory so it does not interfere with the
-non-test installation.
-
-` + strings.TrimSpace(testFlag1) + ` See 'go help testflag' for details.
-
-If the test binary needs any other flags, they should be presented after the
-package names. The go tool treats as a flag the first argument that begins with
-a minus sign that it does not recognize itself; that argument and all subsequent
-arguments are passed as arguments to the test binary.
-
-For more about build flags, see 'go help build'.
-For more about specifying packages, see 'go help packages'.
-
-See also: go build, go vet.
-`,
-}
-
-const testFlag1 = `
-In addition to the build flags, the flags handled by 'go test' itself are:
-
-	-c
-		Compile the test binary to pkg.test but do not run it
-		(where pkg is the last element of the package's import path).
-		The file name can be changed with the -o flag.
-
-	-exec xprog
-	    Run the test binary using xprog. The behavior is the same as
-	    in 'go run'. See 'go help run' for details.
-
-	-i
-	    Install packages that are dependencies of the test.
-	    Do not run the test.
-
-	-o file
-		Compile the test binary to the named file.
-		The test still runs (unless -c or -i is specified).
-
-The test binary also accepts flags that control execution of the test; these
-flags are also accessible by 'go test'.
-`
-
-var helpTestflag = &Command{
-	UsageLine: "testflag",
-	Short:     "description of testing flags",
-	Long: `
-The 'go test' command takes both flags that apply to 'go test' itself
-and flags that apply to the resulting test binary.
-
-Several of the flags control profiling and write an execution profile
-suitable for "go tool pprof"; run "go tool pprof -h" for more
-information.  The --alloc_space, --alloc_objects, and --show_bytes
-options of pprof control how the information is presented.
-
-The following flags are recognized by the 'go test' command and
-control the execution of any test:
-
-	` + strings.TrimSpace(testFlag2) + `
-`,
-}
-
-const testFlag2 = `
-	-bench regexp
-	    Run benchmarks matching the regular expression.
-	    By default, no benchmarks run. To run all benchmarks,
-	    use '-bench .' or '-bench=.'.
-
-	-benchmem
-	    Print memory allocation statistics for benchmarks.
-
-	-benchtime t
-	    Run enough iterations of each benchmark to take t, specified
-	    as a time.Duration (for example, -benchtime 1h30s).
-	    The default is 1 second (1s).
-
-	-blockprofile block.out
-	    Write a goroutine blocking profile to the specified file
-	    when all tests are complete.
-	    Writes test binary as -c would.
-
-	-blockprofilerate n
-	    Control the detail provided in goroutine blocking profiles by
-	    calling runtime.SetBlockProfileRate with n.
-	    See 'go doc runtime.SetBlockProfileRate'.
-	    The profiler aims to sample, on average, one blocking event every
-	    n nanoseconds the program spends blocked.  By default,
-	    if -test.blockprofile is set without this flag, all blocking events
-	    are recorded, equivalent to -test.blockprofilerate=1.
-
-	-count n
-	    Run each test and benchmark n times (default 1).
-	    If -cpu is set, run n times for each GOMAXPROCS value.
-	    Examples are always run once.
-
-	-cover
-	    Enable coverage analysis.
-
-	-covermode set,count,atomic
-	    Set the mode for coverage analysis for the package[s]
-	    being tested. The default is "set" unless -race is enabled,
-	    in which case it is "atomic".
-	    The values:
-		set: bool: does this statement run?
-		count: int: how many times does this statement run?
-		atomic: int: count, but correct in multithreaded tests;
-			significantly more expensive.
-	    Sets -cover.
-
-	-coverpkg pkg1,pkg2,pkg3
-	    Apply coverage analysis in each test to the given list of packages.
-	    The default is for each test to analyze only the package being tested.
-	    Packages are specified as import paths.
-	    Sets -cover.
-
-	-coverprofile cover.out
-	    Write a coverage profile to the file after all tests have passed.
-	    Sets -cover.
-
-	-cpu 1,2,4
-	    Specify a list of GOMAXPROCS values for which the tests or
-	    benchmarks should be executed.  The default is the current value
-	    of GOMAXPROCS.
-
-	-cpuprofile cpu.out
-	    Write a CPU profile to the specified file before exiting.
-	    Writes test binary as -c would.
-
-	-memprofile mem.out
-	    Write a memory profile to the file after all tests have passed.
-	    Writes test binary as -c would.
-
-	-memprofilerate n
-	    Enable more precise (and expensive) memory profiles by setting
-	    runtime.MemProfileRate.  See 'go doc runtime.MemProfileRate'.
-	    To profile all memory allocations, use -test.memprofilerate=1
-	    and pass --alloc_space flag to the pprof tool.
-
-	-outputdir directory
-	    Place output files from profiling in the specified directory,
-	    by default the directory in which "go test" is running.
-
-	-parallel n
-	    Allow parallel execution of test functions that call t.Parallel.
-	    The value of this flag is the maximum number of tests to run
-	    simultaneously; by default, it is set to the value of GOMAXPROCS.
-
-	-run regexp
-	    Run only those tests and examples matching the regular
-	    expression.
-
-	-short
-	    Tell long-running tests to shorten their run time.
-	    It is off by default but set during all.bash so that installing
-	    the Go tree can run a sanity check but not spend time running
-	    exhaustive tests.
-
-	-timeout t
-	    If a test runs longer than t, panic.
-	    The default is 10 minutes (10m).
-
-	-trace trace.out
-	    Write an execution trace to the specified file before exiting.
-	    Writes test binary as -c would.
-
-	-v
-	    Verbose output: log all tests as they are run. Also print all
-	    text from Log and Logf calls even if the test succeeds.
-
-The test binary, called pkg.test where pkg is the name of the
-directory containing the package sources, can be invoked directly
-after building it with 'go test -c'. When invoking the test binary
-directly, each of the standard flag names must be prefixed with 'test.',
-as in -test.run=TestMyFunc or -test.v.
-
-When running 'go test', flags not listed above are passed through
-unaltered. For instance, the command
-
-	go test -x -v -cpuprofile=prof.out -dir=testdata -update
-
-will compile the test binary and then run it as
-
-	pkg.test -test.v -test.cpuprofile=prof.out -dir=testdata -update
-
-The test flags that generate profiles (other than for coverage) also
-leave the test binary in pkg.test for use when analyzing the profiles.
-
-Flags not recognized by 'go test' must be placed after any specified packages.
-`
-
-var helpTestfunc = &Command{
-	UsageLine: "testfunc",
-	Short:     "description of testing functions",
-	Long: `
-The 'go test' command expects to find test, benchmark, and example functions
-in the "*_test.go" files corresponding to the package under test.
-
-A test function is one named TestXXX (where XXX is any alphanumeric string
-not starting with a lower case letter) and should have the signature,
-
-	func TestXXX(t *testing.T) { ... }
-
-A benchmark function is one named BenchmarkXXX and should have the signature,
-
-	func BenchmarkXXX(b *testing.B) { ... }
-
-An example function is similar to a test function but, instead of using
-*testing.T to report success or failure, prints output to os.Stdout.
-That output is compared against the function's "Output:" comment, which
-must be the last comment in the function body (see example below). An
-example with no such comment, or with no text after "Output:" is compiled
-but not executed.
-
-Godoc displays the body of ExampleXXX to demonstrate the use
-of the function, constant, or variable XXX.  An example of a method M with
-receiver type T or *T is named ExampleT_M.  There may be multiple examples
-for a given function, constant, or variable, distinguished by a trailing _xxx,
-where xxx is a suffix not beginning with an upper case letter.
-
-Here is an example of an example:
-
-	func ExamplePrintln() {
-		Println("The output of\nthis example.")
-		// Output: The output of
-		// this example.
-	}
-
-The entire test file is presented as the example when it contains a single
-example function, at least one other function, type, variable, or constant
-declaration, and no test or benchmark functions.
-
-See the documentation of the testing package for more information.
-`,
-}
-
-var (
-	testC            bool       // -c flag
-	testCover        bool       // -cover flag
-	testCoverMode    string     // -covermode flag
-	testCoverPaths   []string   // -coverpkg flag
-	testCoverPkgs    []*Package // -coverpkg flag
-	testO            string     // -o flag
-	testProfile      bool       // some profiling flag
-	testNeedBinary   bool       // profile needs to keep binary around
-	testV            bool       // -v flag
-	testTimeout      string     // -timeout flag
-	testArgs         []string
-	testBench        bool
-	testStreamOutput bool // show output as it is generated
-	testShowPass     bool // show passing output
-
-	testKillTimeout = 10 * time.Minute
-)
-
-var testMainDeps = map[string]bool{
-	// Dependencies for testmain.
-	"testing": true,
-	"regexp":  true,
-	"os":      true,
-}
-
-func runTest(cmd *Command, args []string) {
-	var pkgArgs []string
-	pkgArgs, testArgs = testFlags(args)
-
-	findExecCmd() // initialize cached result
-
-	raceInit()
-	buildModeInit()
-	pkgs := packagesForBuild(pkgArgs)
-	if len(pkgs) == 0 {
-		fatalf("no packages to test")
-	}
-
-	if testC && len(pkgs) != 1 {
-		fatalf("cannot use -c flag with multiple packages")
-	}
-	if testO != "" && len(pkgs) != 1 {
-		fatalf("cannot use -o flag with multiple packages")
-	}
-	if testProfile && len(pkgs) != 1 {
-		fatalf("cannot use test profile flag with multiple packages")
-	}
-
-	// If a test timeout was given and is parseable, set our kill timeout
-	// to that timeout plus one minute.  This is a backup alarm in case
-	// the test wedges with a goroutine spinning and its background
-	// timer does not get a chance to fire.
-	if dt, err := time.ParseDuration(testTimeout); err == nil && dt > 0 {
-		testKillTimeout = dt + 1*time.Minute
-	}
-
-	// show passing test output (after buffering) with -v flag.
-	// must buffer because tests are running in parallel, and
-	// otherwise the output will get mixed.
-	testShowPass = testV
-
-	// stream test output (no buffering) when no package has
-	// been given on the command line (implicit current directory)
-	// or when benchmarking.
-	// Also stream if we're showing output anyway with a
-	// single package under test or if parallelism is set to 1.
-	// In these cases, streaming the output produces the same result
-	// as not streaming, just more immediately.
-	testStreamOutput = len(pkgArgs) == 0 || testBench ||
-		(testShowPass && (len(pkgs) == 1 || buildP == 1))
-
-	var b builder
-	b.init()
-
-	if buildI {
-		buildV = testV
-
-		deps := make(map[string]bool)
-		for dep := range testMainDeps {
-			deps[dep] = true
-		}
-
-		for _, p := range pkgs {
-			// Dependencies for each test.
-			for _, path := range p.Imports {
-				deps[path] = true
-			}
-			for _, path := range p.vendored(p.TestImports) {
-				deps[path] = true
-			}
-			for _, path := range p.vendored(p.XTestImports) {
-				deps[path] = true
-			}
-		}
-
-		// translate C to runtime/cgo
-		if deps["C"] {
-			delete(deps, "C")
-			deps["runtime/cgo"] = true
-			if goos == runtime.GOOS && goarch == runtime.GOARCH && !buildRace {
-				deps["cmd/cgo"] = true
-			}
-		}
-		// Ignore pseudo-packages.
-		delete(deps, "unsafe")
-
-		all := []string{}
-		for path := range deps {
-			if !build.IsLocalImport(path) {
-				all = append(all, path)
-			}
-		}
-		sort.Strings(all)
-
-		a := &action{}
-		for _, p := range packagesForBuild(all) {
-			if !reqStdPkgSrc && p.Standard {
-				continue
-			}
-			a.deps = append(a.deps, b.action(modeInstall, modeInstall, p))
-		}
-		b.do(a)
-		if !testC || a.failed {
-			return
-		}
-		b.init()
-	}
-
-	var builds, runs, prints []*action
-
-	if testCoverPaths != nil {
-		// Load packages that were asked about for coverage.
-		// packagesForBuild exits if the packages cannot be loaded.
-		testCoverPkgs = packagesForBuild(testCoverPaths)
-
-		// Warn about -coverpkg arguments that are not actually used.
-		used := make(map[string]bool)
-		for _, p := range pkgs {
-			used[p.ImportPath] = true
-			for _, dep := range p.Deps {
-				used[dep] = true
-			}
-		}
-		for _, p := range testCoverPkgs {
-			if !used[p.ImportPath] {
-				log.Printf("warning: no packages being tested depend on %s", p.ImportPath)
-			}
-		}
-
-		// Mark all the coverage packages for rebuilding with coverage.
-		for _, p := range testCoverPkgs {
-			// There is nothing to cover in package unsafe; it comes from the compiler.
-			if p.ImportPath == "unsafe" {
-				continue
-			}
-			p.Stale = true // rebuild
-			p.fake = true  // do not warn about rebuild
-			p.coverMode = testCoverMode
-			var coverFiles []string
-			coverFiles = append(coverFiles, p.GoFiles...)
-			coverFiles = append(coverFiles, p.CgoFiles...)
-			coverFiles = append(coverFiles, p.TestGoFiles...)
-			p.coverVars = declareCoverVars(p.ImportPath, coverFiles...)
-		}
-	}
-
-	// Prepare build + run + print actions for all packages being tested.
-	for _, p := range pkgs {
-		buildTest, runTest, printTest, err := b.test(p)
-		if err != nil {
-			str := err.Error()
-			if strings.HasPrefix(str, "\n") {
-				str = str[1:]
-			}
-			failed := fmt.Sprintf("FAIL\t%s [setup failed]\n", p.ImportPath)
-
-			if p.ImportPath != "" {
-				errorf("# %s\n%s\n%s", p.ImportPath, str, failed)
-			} else {
-				errorf("%s\n%s", str, failed)
-			}
-			continue
-		}
-		builds = append(builds, buildTest)
-		runs = append(runs, runTest)
-		prints = append(prints, printTest)
-	}
-
-	// Ultimately the goal is to print the output.
-	root := &action{deps: prints}
-
-	// Force the printing of results to happen in order,
-	// one at a time.
-	for i, a := range prints {
-		if i > 0 {
-			a.deps = append(a.deps, prints[i-1])
-		}
-	}
-
-	// Force benchmarks to run in serial.
-	if !testC && testBench {
-		// The first run must wait for all builds.
-		// Later runs must wait for the previous run's print.
-		for i, run := range runs {
-			if i == 0 {
-				run.deps = append(run.deps, builds...)
-			} else {
-				run.deps = append(run.deps, prints[i-1])
-			}
-		}
-	}
-
-	// If we are building any out-of-date packages other
-	// than those under test, warn.
-	okBuild := map[*Package]bool{}
-	for _, p := range pkgs {
-		okBuild[p] = true
-	}
-	warned := false
-	for _, a := range actionList(root) {
-		if a.p == nil || okBuild[a.p] {
-			continue
-		}
-		okBuild[a.p] = true // warn at most once
-
-		// Don't warn about packages being rebuilt because of
-		// things like coverage analysis.
-		for _, p1 := range a.p.imports {
-			if p1.fake {
-				a.p.fake = true
-			}
-		}
-
-		if a.f != nil && !okBuild[a.p] && !a.p.fake && !a.p.local {
-			if !warned {
-				fmt.Fprintf(os.Stderr, "warning: building out-of-date packages:\n")
-				warned = true
-			}
-			fmt.Fprintf(os.Stderr, "\t%s\n", a.p.ImportPath)
-		}
-	}
-	if warned {
-		args := strings.Join(pkgArgs, " ")
-		if args != "" {
-			args = " " + args
-		}
-		extraOpts := ""
-		if buildRace {
-			extraOpts = "-race "
-		}
-		fmt.Fprintf(os.Stderr, "installing these packages with 'go test %s-i%s' will speed future tests.\n\n", extraOpts, args)
-	}
-
-	b.do(root)
-}
-
-func contains(x []string, s string) bool {
-	for _, t := range x {
-		if t == s {
-			return true
-		}
-	}
-	return false
-}
-
-var windowsBadWords = []string{
-	"install",
-	"patch",
-	"setup",
-	"update",
-}
-
-func (b *builder) test(p *Package) (buildAction, runAction, printAction *action, err error) {
-	if len(p.TestGoFiles)+len(p.XTestGoFiles) == 0 {
-		build := b.action(modeBuild, modeBuild, p)
-		run := &action{p: p, deps: []*action{build}}
-		print := &action{f: (*builder).notest, p: p, deps: []*action{run}}
-		return build, run, print, nil
-	}
-
-	// Build Package structs describing:
-	//	ptest - package + test files
-	//	pxtest - package of external test files
-	//	pmain - pkg.test binary
-	var ptest, pxtest, pmain *Package
-
-	var imports, ximports []*Package
-	var stk importStack
-	stk.push(p.ImportPath + " (test)")
-	for i, path := range p.TestImports {
-		p1 := loadImport(path, p.Dir, p, &stk, p.build.TestImportPos[path], useVendor)
-		if !reqStdPkgSrc && p1.Standard {
-			continue
-		}
-		if p1.Error != nil {
-			return nil, nil, nil, p1.Error
-		}
-		if len(p1.DepsErrors) > 0 {
-			err := p1.DepsErrors[0]
-			err.Pos = "" // show full import stack
-			return nil, nil, nil, err
-		}
-		if contains(p1.Deps, p.ImportPath) || p1.ImportPath == p.ImportPath {
-			// Same error that loadPackage returns (via reusePackage) in pkg.go.
-			// Can't change that code, because that code is only for loading the
-			// non-test copy of a package.
-			err := &PackageError{
-				ImportStack:   testImportStack(stk[0], p1, p.ImportPath),
-				Err:           "import cycle not allowed in test",
-				isImportCycle: true,
-			}
-			return nil, nil, nil, err
-		}
-		p.TestImports[i] = p1.ImportPath
-		imports = append(imports, p1)
-	}
-	stk.pop()
-	stk.push(p.ImportPath + "_test")
-	pxtestNeedsPtest := false
-	for i, path := range p.XTestImports {
-		p1 := loadImport(path, p.Dir, p, &stk, p.build.XTestImportPos[path], useVendor)
-		if !reqStdPkgSrc && p1.Standard {
-			continue
-		}
-		if p1.Error != nil {
-			return nil, nil, nil, p1.Error
-		}
-		if len(p1.DepsErrors) > 0 {
-			err := p1.DepsErrors[0]
-			err.Pos = "" // show full import stack
-			return nil, nil, nil, err
-		}
-		if p1.ImportPath == p.ImportPath {
-			pxtestNeedsPtest = true
-		} else {
-			ximports = append(ximports, p1)
-		}
-		p.XTestImports[i] = p1.ImportPath
-	}
-	stk.pop()
-
-	// Use last element of import path, not package name.
-	// They differ when package name is "main".
-	// But if the import path is "command-line-arguments",
-	// like it is during 'go run', use the package name.
-	var elem string
-	if p.ImportPath == "command-line-arguments" {
-		elem = p.Name
-	} else {
-		_, elem = path.Split(p.ImportPath)
-	}
-	testBinary := elem + ".test"
-
-	// The ptest package needs to be importable under the
-	// same import path that p has, but we cannot put it in
-	// the usual place in the temporary tree, because then
-	// other tests will see it as the real package.
-	// Instead we make a _test directory under the import path
-	// and then repeat the import path there.  We tell the
-	// compiler and linker to look in that _test directory first.
-	//
-	// That is, if the package under test is unicode/utf8,
-	// then the normal place to write the package archive is
-	// $WORK/unicode/utf8.a, but we write the test package archive to
-	// $WORK/unicode/utf8/_test/unicode/utf8.a.
-	// We write the external test package archive to
-	// $WORK/unicode/utf8/_test/unicode/utf8_test.a.
-	testDir := filepath.Join(b.work, filepath.FromSlash(p.ImportPath+"/_test"))
-	ptestObj := buildToolchain.pkgpath(testDir, p)
-
-	// Create the directory for the .a files.
-	ptestDir, _ := filepath.Split(ptestObj)
-	if err := b.mkdir(ptestDir); err != nil {
-		return nil, nil, nil, err
-	}
-
-	// Should we apply coverage analysis locally,
-	// only for this package and only for this test?
-	// Yes, if -cover is on but -coverpkg has not specified
-	// a list of packages for global coverage.
-	localCover := testCover && testCoverPaths == nil
-
-	// Test package.
-	if len(p.TestGoFiles) > 0 || localCover || p.Name == "main" {
-		ptest = new(Package)
-		*ptest = *p
-		ptest.GoFiles = nil
-		ptest.GoFiles = append(ptest.GoFiles, p.GoFiles...)
-		ptest.GoFiles = append(ptest.GoFiles, p.TestGoFiles...)
-		ptest.target = ""
-		ptest.Imports = stringList(p.Imports, p.TestImports)
-		ptest.imports = append(append([]*Package{}, p.imports...), imports...)
-		ptest.pkgdir = testDir
-		ptest.fake = true
-		ptest.forceLibrary = true
-		ptest.Stale = true
-		ptest.build = new(build.Package)
-		*ptest.build = *p.build
-		m := map[string][]token.Position{}
-		for k, v := range p.build.ImportPos {
-			m[k] = append(m[k], v...)
-		}
-		for k, v := range p.build.TestImportPos {
-			m[k] = append(m[k], v...)
-		}
-		ptest.build.ImportPos = m
-
-		if localCover {
-			ptest.coverMode = testCoverMode
-			var coverFiles []string
-			coverFiles = append(coverFiles, ptest.GoFiles...)
-			coverFiles = append(coverFiles, ptest.CgoFiles...)
-			ptest.coverVars = declareCoverVars(ptest.ImportPath, coverFiles...)
-		}
-	} else {
-		ptest = p
-	}
-
-	// External test package.
-	if len(p.XTestGoFiles) > 0 {
-		pxtest = &Package{
-			Name:        p.Name + "_test",
-			ImportPath:  p.ImportPath + "_test",
-			localPrefix: p.localPrefix,
-			Root:        p.Root,
-			Dir:         p.Dir,
-			GoFiles:     p.XTestGoFiles,
-			Imports:     p.XTestImports,
-			build: &build.Package{
-				ImportPos: p.build.XTestImportPos,
-			},
-			imports:  ximports,
-			pkgdir:   testDir,
-			fake:     true,
-			external: true,
-			Stale:    true,
-		}
-		if pxtestNeedsPtest {
-			pxtest.imports = append(pxtest.imports, ptest)
-		}
-	}
-
-	// Action for building pkg.test.
-	pmain = &Package{
-		Name:       "main",
-		Dir:        testDir,
-		GoFiles:    []string{"_testmain.go"},
-		ImportPath: "testmain",
-		Root:       p.Root,
-		build:      &build.Package{Name: "main"},
-		pkgdir:     testDir,
-		fake:       true,
-		Stale:      true,
-		omitDWARF:  !testC && !testNeedBinary,
-	}
-
-	// The generated main also imports testing, regexp, and os.
-	stk.push("testmain")
-	for dep := range testMainDeps {
-		if dep == ptest.ImportPath {
-			pmain.imports = append(pmain.imports, ptest)
-		} else {
-			p1 := loadImport(dep, "", nil, &stk, nil, 0)
-			if !reqStdPkgSrc && p1.Standard {
-				continue
-			}
-			if p1.Error != nil {
-				return nil, nil, nil, p1.Error
-			}
-			pmain.imports = append(pmain.imports, p1)
-		}
-	}
-
-	if testCoverPkgs != nil {
-		// Add imports, but avoid duplicates.
-		seen := map[*Package]bool{p: true, ptest: true}
-		for _, p1 := range pmain.imports {
-			seen[p1] = true
-		}
-		for _, p1 := range testCoverPkgs {
-			if !seen[p1] {
-				seen[p1] = true
-				pmain.imports = append(pmain.imports, p1)
-			}
-		}
-	}
-
-	// Do initial scan for metadata needed for writing _testmain.go
-	// Use that metadata to update the list of imports for package main.
-	// The list of imports is used by recompileForTest and by the loop
-	// afterward that gathers t.Cover information.
-	t, err := loadTestFuncs(ptest)
-	if err != nil {
-		return nil, nil, nil, err
-	}
-	if len(ptest.GoFiles) > 0 {
-		pmain.imports = append(pmain.imports, ptest)
-		t.ImportTest = true
-	}
-	if pxtest != nil {
-		pmain.imports = append(pmain.imports, pxtest)
-		t.ImportXtest = true
-	}
-
-	if ptest != p && localCover {
-		// We have made modifications to the package p being tested
-		// and are rebuilding p (as ptest), writing it to the testDir tree.
-		// Arrange to rebuild, writing to that same tree, all packages q
-		// such that the test depends on q, and q depends on p.
-		// This makes sure that q sees the modifications to p.
-		// Strictly speaking, the rebuild is only necessary if the
-		// modifications to p change its export metadata, but
-		// determining that is a bit tricky, so we rebuild always.
-		//
-		// This will cause extra compilation, so for now we only do it
-		// when testCover is set. The conditions are more general, though,
-		// and we may find that we need to do it always in the future.
-		recompileForTest(pmain, p, ptest, testDir)
-	}
-
-	if buildContext.GOOS == "darwin" {
-		if buildContext.GOARCH == "arm" || buildContext.GOARCH == "arm64" {
-			t.NeedCgo = true
-		}
-	}
-
-	for _, cp := range pmain.imports {
-		if len(cp.coverVars) > 0 {
-			t.Cover = append(t.Cover, coverInfo{cp, cp.coverVars})
-		}
-	}
-
-	// writeTestmain writes _testmain.go. This must happen after recompileForTest,
-	// because recompileForTest modifies XXX.
-	if err := writeTestmain(filepath.Join(testDir, "_testmain.go"), t); err != nil {
-		return nil, nil, nil, err
-	}
-
-	computeStale(pmain)
-
-	if ptest != p {
-		a := b.action(modeBuild, modeBuild, ptest)
-		a.objdir = testDir + string(filepath.Separator) + "_obj_test" + string(filepath.Separator)
-		a.objpkg = ptestObj
-		a.target = ptestObj
-		a.link = false
-	}
-
-	if pxtest != nil {
-		a := b.action(modeBuild, modeBuild, pxtest)
-		a.objdir = testDir + string(filepath.Separator) + "_obj_xtest" + string(filepath.Separator)
-		a.objpkg = buildToolchain.pkgpath(testDir, pxtest)
-		a.target = a.objpkg
-	}
-
-	a := b.action(modeBuild, modeBuild, pmain)
-	a.objdir = testDir + string(filepath.Separator)
-	a.objpkg = filepath.Join(testDir, "main.a")
-	a.target = filepath.Join(testDir, testBinary) + exeSuffix
-	if goos == "windows" {
-		// There are many reserved words on Windows that,
-		// if used in the name of an executable, cause Windows
-		// to try to ask for extra permissions.
-		// The word list includes setup, install, update, and patch,
-		// but it does not appear to be defined anywhere.
-		// We have run into this trying to run the
-		// go.codereview/patch tests.
-		// For package names containing those words, use test.test.exe
-		// instead of pkgname.test.exe.
-		// Note that this file name is only used in the Go command's
-		// temporary directory. If the -c or other flags are
-		// given, the code below will still use pkgname.test.exe.
-		// There are two user-visible effects of this change.
-		// First, you can actually run 'go test' in directories that
-		// have names that Windows thinks are installer-like,
-		// without getting a dialog box asking for more permissions.
-		// Second, in the Windows process listing during go test,
-		// the test shows up as test.test.exe, not pkgname.test.exe.
-		// That second one is a drawback, but it seems a small
-		// price to pay for the test running at all.
-		// If maintaining the list of bad words is too onerous,
-		// we could just do this always on Windows.
-		for _, bad := range windowsBadWords {
-			if strings.Contains(testBinary, bad) {
-				a.target = filepath.Join(testDir, "test.test") + exeSuffix
-				break
-			}
-		}
-	}
-	buildAction = a
-
-	if testC || testNeedBinary {
-		// -c or profiling flag: create action to copy binary to ./test.out.
-		target := filepath.Join(cwd, testBinary+exeSuffix)
-		if testO != "" {
-			target = testO
-			if !filepath.IsAbs(target) {
-				target = filepath.Join(cwd, target)
-			}
-		}
-		buildAction = &action{
-			f:      (*builder).install,
-			deps:   []*action{buildAction},
-			p:      pmain,
-			target: target,
-		}
-		runAction = buildAction // make sure runAction != nil even if not running test
-	}
-	if testC {
-		printAction = &action{p: p, deps: []*action{runAction}} // nop
-	} else {
-		// run test
-		runAction = &action{
-			f:          (*builder).runTest,
-			deps:       []*action{buildAction},
-			p:          p,
-			ignoreFail: true,
-		}
-		cleanAction := &action{
-			f:    (*builder).cleanTest,
-			deps: []*action{runAction},
-			p:    p,
-		}
-		printAction = &action{
-			f:    (*builder).printTest,
-			deps: []*action{cleanAction},
-			p:    p,
-		}
-	}
-
-	return buildAction, runAction, printAction, nil
-}
-
-func testImportStack(top string, p *Package, target string) []string {
-	stk := []string{top, p.ImportPath}
-Search:
-	for p.ImportPath != target {
-		for _, p1 := range p.imports {
-			if p1.ImportPath == target || contains(p1.Deps, target) {
-				stk = append(stk, p1.ImportPath)
-				p = p1
-				continue Search
-			}
-		}
-		// Can't happen, but in case it does...
-		stk = append(stk, "<lost path to cycle>")
-		break
-	}
-	return stk
-}
-
-func recompileForTest(pmain, preal, ptest *Package, testDir string) {
-	// The "test copy" of preal is ptest.
-	// For each package that depends on preal, make a "test copy"
-	// that depends on ptest. And so on, up the dependency tree.
-	testCopy := map[*Package]*Package{preal: ptest}
-	for _, p := range packageList([]*Package{pmain}) {
-		// Copy on write.
-		didSplit := false
-		split := func() {
-			if didSplit {
-				return
-			}
-			didSplit = true
-			if p.pkgdir != testDir {
-				p1 := new(Package)
-				testCopy[p] = p1
-				*p1 = *p
-				p1.imports = make([]*Package, len(p.imports))
-				copy(p1.imports, p.imports)
-				p = p1
-				p.pkgdir = testDir
-				p.target = ""
-				p.fake = true
-				p.Stale = true
-			}
-		}
-
-		// Update p.deps and p.imports to use at test copies.
-		for i, dep := range p.deps {
-			if p1 := testCopy[dep]; p1 != nil && p1 != dep {
-				split()
-				p.deps[i] = p1
-			}
-		}
-		for i, imp := range p.imports {
-			if p1 := testCopy[imp]; p1 != nil && p1 != imp {
-				split()
-				p.imports[i] = p1
-			}
-		}
-	}
-}
-
-var coverIndex = 0
-
-// isTestFile reports whether the source file is a set of tests and should therefore
-// be excluded from coverage analysis.
-func isTestFile(file string) bool {
-	// We don't cover tests, only the code they test.
-	return strings.HasSuffix(file, "_test.go")
-}
-
-// declareCoverVars attaches the required cover variables names
-// to the files, to be used when annotating the files.
-func declareCoverVars(importPath string, files ...string) map[string]*CoverVar {
-	coverVars := make(map[string]*CoverVar)
-	for _, file := range files {
-		if isTestFile(file) {
-			continue
-		}
-		coverVars[file] = &CoverVar{
-			File: filepath.Join(importPath, file),
-			Var:  fmt.Sprintf("GoCover_%d", coverIndex),
-		}
-		coverIndex++
-	}
-	return coverVars
-}
-
-// runTest is the action for running a test binary.
-func (b *builder) runTest(a *action) error {
-	args := stringList(findExecCmd(), a.deps[0].target, testArgs)
-	a.testOutput = new(bytes.Buffer)
-
-	if buildN || buildX {
-		b.showcmd("", "%s", strings.Join(args, " "))
-		if buildN {
-			return nil
-		}
-	}
-
-	if a.failed {
-		// We were unable to build the binary.
-		a.failed = false
-		fmt.Fprintf(a.testOutput, "FAIL\t%s [build failed]\n", a.p.ImportPath)
-		setExitStatus(1)
-		return nil
-	}
-
-	cmd := exec.Command(args[0], args[1:]...)
-	cmd.Dir = a.p.Dir
-	cmd.Env = envForDir(cmd.Dir, origEnv)
-	var buf bytes.Buffer
-	if testStreamOutput {
-		cmd.Stdout = os.Stdout
-		cmd.Stderr = os.Stderr
-	} else {
-		cmd.Stdout = &buf
-		cmd.Stderr = &buf
-	}
-
-	// If there are any local SWIG dependencies, we want to load
-	// the shared library from the build directory.
-	if a.p.usesSwig() {
-		env := cmd.Env
-		found := false
-		prefix := "LD_LIBRARY_PATH="
-		for i, v := range env {
-			if strings.HasPrefix(v, prefix) {
-				env[i] = v + ":."
-				found = true
-				break
-			}
-		}
-		if !found {
-			env = append(env, "LD_LIBRARY_PATH=.")
-		}
-		cmd.Env = env
-	}
-
-	t0 := time.Now()
-	err := cmd.Start()
-
-	// This is a last-ditch deadline to detect and
-	// stop wedged test binaries, to keep the builders
-	// running.
-	if err == nil {
-		tick := time.NewTimer(testKillTimeout)
-		startSigHandlers()
-		done := make(chan error)
-		go func() {
-			done <- cmd.Wait()
-		}()
-	Outer:
-		select {
-		case err = <-done:
-			// ok
-		case <-tick.C:
-			if signalTrace != nil {
-				// Send a quit signal in the hope that the program will print
-				// a stack trace and exit. Give it five seconds before resorting
-				// to Kill.
-				cmd.Process.Signal(signalTrace)
-				select {
-				case err = <-done:
-					fmt.Fprintf(&buf, "*** Test killed with %v: ran too long (%v).\n", signalTrace, testKillTimeout)
-					break Outer
-				case <-time.After(5 * time.Second):
-				}
-			}
-			cmd.Process.Kill()
-			err = <-done
-			fmt.Fprintf(&buf, "*** Test killed: ran too long (%v).\n", testKillTimeout)
-		}
-		tick.Stop()
-	}
-	out := buf.Bytes()
-	t := fmt.Sprintf("%.3fs", time.Since(t0).Seconds())
-	if err == nil {
-		if testShowPass {
-			a.testOutput.Write(out)
-		}
-		fmt.Fprintf(a.testOutput, "ok  \t%s\t%s%s\n", a.p.ImportPath, t, coveragePercentage(out))
-		return nil
-	}
-
-	setExitStatus(1)
-	if len(out) > 0 {
-		a.testOutput.Write(out)
-		// assume printing the test binary's exit status is superfluous
-	} else {
-		fmt.Fprintf(a.testOutput, "%s\n", err)
-	}
-	fmt.Fprintf(a.testOutput, "FAIL\t%s\t%s\n", a.p.ImportPath, t)
-
-	return nil
-}
-
-// coveragePercentage returns the coverage results (if enabled) for the
-// test. It uncovers the data by scanning the output from the test run.
-func coveragePercentage(out []byte) string {
-	if !testCover {
-		return ""
-	}
-	// The string looks like
-	//	test coverage for encoding/binary: 79.9% of statements
-	// Extract the piece from the percentage to the end of the line.
-	re := regexp.MustCompile(`coverage: (.*)\n`)
-	matches := re.FindSubmatch(out)
-	if matches == nil {
-		// Probably running "go test -cover" not "go test -cover fmt".
-		// The coverage output will appear in the output directly.
-		return ""
-	}
-	return fmt.Sprintf("\tcoverage: %s", matches[1])
-}
-
-// cleanTest is the action for cleaning up after a test.
-func (b *builder) cleanTest(a *action) error {
-	if buildWork {
-		return nil
-	}
-	run := a.deps[0]
-	testDir := filepath.Join(b.work, filepath.FromSlash(run.p.ImportPath+"/_test"))
-	os.RemoveAll(testDir)
-	return nil
-}
-
-// printTest is the action for printing a test result.
-func (b *builder) printTest(a *action) error {
-	clean := a.deps[0]
-	run := clean.deps[0]
-	os.Stdout.Write(run.testOutput.Bytes())
-	run.testOutput = nil
-	return nil
-}
-
-// notest is the action for testing a package with no test files.
-func (b *builder) notest(a *action) error {
-	fmt.Printf("?   \t%s\t[no test files]\n", a.p.ImportPath)
-	return nil
-}
-
-// isTestMain tells whether fn is a TestMain(m *testing.M) function.
-func isTestMain(fn *ast.FuncDecl) bool {
-	if fn.Name.String() != "TestMain" ||
-		fn.Type.Results != nil && len(fn.Type.Results.List) > 0 ||
-		fn.Type.Params == nil ||
-		len(fn.Type.Params.List) != 1 ||
-		len(fn.Type.Params.List[0].Names) > 1 {
-		return false
-	}
-	ptr, ok := fn.Type.Params.List[0].Type.(*ast.StarExpr)
-	if !ok {
-		return false
-	}
-	// We can't easily check that the type is *testing.M
-	// because we don't know how testing has been imported,
-	// but at least check that it's *M or *something.M.
-	if name, ok := ptr.X.(*ast.Ident); ok && name.Name == "M" {
-		return true
-	}
-	if sel, ok := ptr.X.(*ast.SelectorExpr); ok && sel.Sel.Name == "M" {
-		return true
-	}
-	return false
-}
-
-// isTest tells whether name looks like a test (or benchmark, according to prefix).
-// It is a Test (say) if there is a character after Test that is not a lower-case letter.
-// We don't want TesticularCancer.
-func isTest(name, prefix string) bool {
-	if !strings.HasPrefix(name, prefix) {
-		return false
-	}
-	if len(name) == len(prefix) { // "Test" is ok
-		return true
-	}
-	rune, _ := utf8.DecodeRuneInString(name[len(prefix):])
-	return !unicode.IsLower(rune)
-}
-
-type coverInfo struct {
-	Package *Package
-	Vars    map[string]*CoverVar
-}
-
-// loadTestFuncs returns the testFuncs describing the tests that will be run.
-func loadTestFuncs(ptest *Package) (*testFuncs, error) {
-	t := &testFuncs{
-		Package: ptest,
-	}
-	for _, file := range ptest.TestGoFiles {
-		if err := t.load(filepath.Join(ptest.Dir, file), "_test", &t.ImportTest, &t.NeedTest); err != nil {
-			return nil, err
-		}
-	}
-	for _, file := range ptest.XTestGoFiles {
-		if err := t.load(filepath.Join(ptest.Dir, file), "_xtest", &t.ImportXtest, &t.NeedXtest); err != nil {
-			return nil, err
-		}
-	}
-	return t, nil
-}
-
-// writeTestmain writes the _testmain.go file for t to the file named out.
-func writeTestmain(out string, t *testFuncs) error {
-	f, err := os.Create(out)
-	if err != nil {
-		return err
-	}
-	defer f.Close()
-
-	if err := testmainTmpl.Execute(f, t); err != nil {
-		return err
-	}
-
-	return nil
-}
-
-type testFuncs struct {
-	Tests       []testFunc
-	Benchmarks  []testFunc
-	Examples    []testFunc
-	TestMain    *testFunc
-	Package     *Package
-	ImportTest  bool
-	NeedTest    bool
-	ImportXtest bool
-	NeedXtest   bool
-	NeedCgo     bool
-	Cover       []coverInfo
-}
-
-func (t *testFuncs) CoverMode() string {
-	return testCoverMode
-}
-
-func (t *testFuncs) CoverEnabled() bool {
-	return testCover
-}
-
-// Covered returns a string describing which packages are being tested for coverage.
-// If the covered package is the same as the tested package, it returns the empty string.
-// Otherwise it is a comma-separated human-readable list of packages beginning with
-// " in", ready for use in the coverage message.
-func (t *testFuncs) Covered() string {
-	if testCoverPaths == nil {
-		return ""
-	}
-	return " in " + strings.Join(testCoverPaths, ", ")
-}
-
-// Tested returns the name of the package being tested.
-func (t *testFuncs) Tested() string {
-	return t.Package.Name
-}
-
-type testFunc struct {
-	Package string // imported package name (_test or _xtest)
-	Name    string // function name
-	Output  string // output, for examples
-}
-
-var testFileSet = token.NewFileSet()
-
-func (t *testFuncs) load(filename, pkg string, doImport, seen *bool) error {
-	f, err := parser.ParseFile(testFileSet, filename, nil, parser.ParseComments)
-	if err != nil {
-		return expandScanner(err)
-	}
-	for _, d := range f.Decls {
-		n, ok := d.(*ast.FuncDecl)
-		if !ok {
-			continue
-		}
-		if n.Recv != nil {
-			continue
-		}
-		name := n.Name.String()
-		switch {
-		case isTestMain(n):
-			if t.TestMain != nil {
-				return errors.New("multiple definitions of TestMain")
-			}
-			t.TestMain = &testFunc{pkg, name, ""}
-			*doImport, *seen = true, true
-		case isTest(name, "Test"):
-			t.Tests = append(t.Tests, testFunc{pkg, name, ""})
-			*doImport, *seen = true, true
-		case isTest(name, "Benchmark"):
-			t.Benchmarks = append(t.Benchmarks, testFunc{pkg, name, ""})
-			*doImport, *seen = true, true
-		}
-	}
-	ex := doc.Examples(f)
-	sort.Sort(byOrder(ex))
-	for _, e := range ex {
-		*doImport = true // import test file whether executed or not
-		if e.Output == "" && !e.EmptyOutput {
-			// Don't run examples with no output.
-			continue
-		}
-		t.Examples = append(t.Examples, testFunc{pkg, "Example" + e.Name, e.Output})
-		*seen = true
-	}
-	return nil
-}
-
-type byOrder []*doc.Example
-
-func (x byOrder) Len() int           { return len(x) }
-func (x byOrder) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }
-func (x byOrder) Less(i, j int) bool { return x[i].Order < x[j].Order }
-
-var testmainTmpl = template.Must(template.New("main").Parse(`
-package main
-
-import (
-{{if not .TestMain}}
-	"os"
-{{end}}
-	"regexp"
-	"testing"
-
-{{if .ImportTest}}
-	{{if .NeedTest}}_test{{else}}_{{end}} {{.Package.ImportPath | printf "%q"}}
-{{end}}
-{{if .ImportXtest}}
-	{{if .NeedXtest}}_xtest{{else}}_{{end}} {{.Package.ImportPath | printf "%s_test" | printf "%q"}}
-{{end}}
-{{range $i, $p := .Cover}}
-	_cover{{$i}} {{$p.Package.ImportPath | printf "%q"}}
-{{end}}
-
-{{if .NeedCgo}}
-	_ "runtime/cgo"
-{{end}}
-)
-
-var tests = []testing.InternalTest{
-{{range .Tests}}
-	{"{{.Name}}", {{.Package}}.{{.Name}}},
-{{end}}
-}
-
-var benchmarks = []testing.InternalBenchmark{
-{{range .Benchmarks}}
-	{"{{.Name}}", {{.Package}}.{{.Name}}},
-{{end}}
-}
-
-var examples = []testing.InternalExample{
-{{range .Examples}}
-	{"{{.Name}}", {{.Package}}.{{.Name}}, {{.Output | printf "%q"}}},
-{{end}}
-}
-
-var matchPat string
-var matchRe *regexp.Regexp
-
-func matchString(pat, str string) (result bool, err error) {
-	if matchRe == nil || matchPat != pat {
-		matchPat = pat
-		matchRe, err = regexp.Compile(matchPat)
-		if err != nil {
-			return
-		}
-	}
-	return matchRe.MatchString(str), nil
-}
-
-{{if .CoverEnabled}}
-
-// Only updated by init functions, so no need for atomicity.
-var (
-	coverCounters = make(map[string][]uint32)
-	coverBlocks = make(map[string][]testing.CoverBlock)
-)
-
-func init() {
-	{{range $i, $p := .Cover}}
-	{{range $file, $cover := $p.Vars}}
-	coverRegisterFile({{printf "%q" $cover.File}}, _cover{{$i}}.{{$cover.Var}}.Count[:], _cover{{$i}}.{{$cover.Var}}.Pos[:], _cover{{$i}}.{{$cover.Var}}.NumStmt[:])
-	{{end}}
-	{{end}}
-}
-
-func coverRegisterFile(fileName string, counter []uint32, pos []uint32, numStmts []uint16) {
-	if 3*len(counter) != len(pos) || len(counter) != len(numStmts) {
-		panic("coverage: mismatched sizes")
-	}
-	if coverCounters[fileName] != nil {
-		// Already registered.
-		return
-	}
-	coverCounters[fileName] = counter
-	block := make([]testing.CoverBlock, len(counter))
-	for i := range counter {
-		block[i] = testing.CoverBlock{
-			Line0: pos[3*i+0],
-			Col0: uint16(pos[3*i+2]),
-			Line1: pos[3*i+1],
-			Col1: uint16(pos[3*i+2]>>16),
-			Stmts: numStmts[i],
-		}
-	}
-	coverBlocks[fileName] = block
-}
-{{end}}
-
-func main() {
-{{if .CoverEnabled}}
-	testing.RegisterCover(testing.Cover{
-		Mode: {{printf "%q" .CoverMode}},
-		Counters: coverCounters,
-		Blocks: coverBlocks,
-		CoveredPackages: {{printf "%q" .Covered}},
-	})
-{{end}}
-	m := testing.MainStart(matchString, tests, benchmarks, examples)
-{{with .TestMain}}
-	{{.Package}}.{{.Name}}(m)
-{{else}}
-	os.Exit(m.Run())
-{{end}}
-}
-
-`))
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/cgocover/p.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/cgocover/p.go
deleted file mode 100644
index a6a3891..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/cgocover/p.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package p
-
-/*
-void
-f(void)
-{
-}
-*/
-import "C"
-
-var b bool
-
-func F() {
-	if b {
-		for {
-		}
-	}
-	C.f()
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/cgocover/p_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/cgocover/p_test.go
deleted file mode 100644
index a8f057e..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/cgocover/p_test.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package p
-
-import "testing"
-
-func TestF(t *testing.T) {
-	F()
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/dep_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/dep_test.go
deleted file mode 100644
index 0c53ac4..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/dep_test.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package deps
-
-import _ "testing"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/example1_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/example1_test.go
deleted file mode 100644
index ec7092e..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/example1_test.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Make sure that go test runs Example_Z before Example_A, preserving source order.
-
-package p
-
-import "fmt"
-
-var n int
-
-func Example_Z() {
-	n++
-	fmt.Println(n)
-	// Output: 1
-}
-
-func Example_A() {
-	n++
-	fmt.Println(n)
-	// Output: 2
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/example2_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/example2_test.go
deleted file mode 100644
index 1e0e80b..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/example2_test.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Make sure that go test runs Example_Y before Example_B, preserving source order.
-
-package p
-
-import "fmt"
-
-func Example_Y() {
-	n++
-	fmt.Println(n)
-	// Output: 3
-}
-
-func Example_B() {
-	n++
-	fmt.Println(n)
-	// Output: 4
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/generate/test1.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/generate/test1.go
deleted file mode 100644
index 1f05734..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/generate/test1.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Simple test for go generate.
-
-// We include a build tag that go generate should ignore.
-
-// +build ignore
-
-//go:generate echo Success
-
-package p
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/generate/test2.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/generate/test2.go
deleted file mode 100644
index ef1a3d9..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/generate/test2.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that go generate handles command aliases.
-
-//go:generate -command run echo Now is the time
-//go:generate run for all good men
-
-package p
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/generate/test3.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/generate/test3.go
deleted file mode 100644
index 3d6a8a5..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/generate/test3.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test go generate variable substitution.
-
-//go:generate echo $GOARCH $GOFILE:$GOLINE ${GOPACKAGE}abc xyz$GOPACKAGE/$GOFILE/123
-
-package p
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/generate/test4.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/generate/test4.go
deleted file mode 100644
index a7631c4..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/generate/test4.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test -run flag
-
-//go:generate echo oh yes my man
-//go:generate echo no, no, a thousand times no
-
-package p
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/bad.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/bad.go
deleted file mode 100644
index e104c2e..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/bad.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package p
-
-import "bad"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/conflict.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/conflict.go
deleted file mode 100644
index 995556c..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/conflict.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package p
-
-import "conflict"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/bad/bad.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/bad/bad.go
deleted file mode 100644
index bc51fd3..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/bad/bad.go
+++ /dev/null
@@ -1 +0,0 @@
-package bad // import
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/conflict/a.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/conflict/a.go
deleted file mode 100644
index 2d67703..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/conflict/a.go
+++ /dev/null
@@ -1 +0,0 @@
-package conflict // import "a"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/conflict/b.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/conflict/b.go
deleted file mode 100644
index 8fcfb3c..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/conflict/b.go
+++ /dev/null
@@ -1 +0,0 @@
-package conflict /* import "b" */
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/works/x/x.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/works/x/x.go
deleted file mode 100644
index 044c6ec..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/works/x/x.go
+++ /dev/null
@@ -1 +0,0 @@
-package x // import "works/x"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/works/x/x1.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/works/x/x1.go
deleted file mode 100644
index 2449b29..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/works/x/x1.go
+++ /dev/null
@@ -1 +0,0 @@
-package x // important! not an import comment
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/wrongplace/x.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/wrongplace/x.go
deleted file mode 100644
index b89849d..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/src/wrongplace/x.go
+++ /dev/null
@@ -1 +0,0 @@
-package x // import "my/x"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/works.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/works.go
deleted file mode 100644
index 31b55d0..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/works.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package p
-
-import _ "works/x"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/wrongplace.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/wrongplace.go
deleted file mode 100644
index e2535e0..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/importcom/wrongplace.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package p
-
-import "wrongplace"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/local/easy.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/local/easy.go
deleted file mode 100644
index 4eeb517..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/local/easy.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package main
-
-import "./easysub"
-
-func main() {
-	easysub.Hello()
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/local/easysub/easysub.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/local/easysub/easysub.go
deleted file mode 100644
index 07040da..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/local/easysub/easysub.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package easysub
-
-import "fmt"
-
-func Hello() {
-	fmt.Println("easysub.Hello")
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/local/easysub/main.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/local/easysub/main.go
deleted file mode 100644
index 6c30b52..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/local/easysub/main.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// +build ignore
-
-package main
-
-import "."
-
-func main() {
-	easysub.Hello()
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/local/hard.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/local/hard.go
deleted file mode 100644
index 2ffac3f..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/local/hard.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package main
-
-import "./sub"
-
-func main() {
-	sub.Hello()
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/local/sub/sub.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/local/sub/sub.go
deleted file mode 100644
index d5dbf6d..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/local/sub/sub.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package sub
-
-import (
-	"fmt"
-
-	subsub "./sub"
-)
-
-func Hello() {
-	fmt.Println("sub.Hello")
-	subsub.Hello()
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/local/sub/sub/subsub.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/local/sub/sub/subsub.go
deleted file mode 100644
index 4cc7223..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/local/sub/sub/subsub.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package subsub
-
-import "fmt"
-
-func Hello() {
-	fmt.Println("subsub.Hello")
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/norunexample/example_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/norunexample/example_test.go
deleted file mode 100644
index e158305..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/norunexample/example_test.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package pkg_test
-
-import "os"
-
-func init() {
-	os.Stdout.Write([]byte("File with non-runnable example was built.\n"))
-}
-
-func Example_test() {
-	// This test will not be run, it has no "Output:" comment.
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/norunexample/test_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/norunexample/test_test.go
deleted file mode 100644
index d2e9198..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/norunexample/test_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package pkg
-
-import (
-	"os"
-	"testing"
-)
-
-func TestBuilt(t *testing.T) {
-	os.Stdout.Write([]byte("A normal test was executed.\n"))
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/rundir/sub/sub.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/rundir/sub/sub.go
deleted file mode 100644
index 06ab7d0..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/rundir/sub/sub.go
+++ /dev/null
@@ -1 +0,0 @@
-package main
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/rundir/x.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/rundir/x.go
deleted file mode 100644
index 06ab7d0..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/rundir/x.go
+++ /dev/null
@@ -1 +0,0 @@
-package main
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/shadow/root1/src/foo/foo.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/shadow/root1/src/foo/foo.go
deleted file mode 100644
index f52652b..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/shadow/root1/src/foo/foo.go
+++ /dev/null
@@ -1 +0,0 @@
-package foo
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/shadow/root1/src/math/math.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/shadow/root1/src/math/math.go
deleted file mode 100644
index c91c24e..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/shadow/root1/src/math/math.go
+++ /dev/null
@@ -1 +0,0 @@
-package math
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/shadow/root2/src/foo/foo.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/shadow/root2/src/foo/foo.go
deleted file mode 100644
index f52652b..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/shadow/root2/src/foo/foo.go
+++ /dev/null
@@ -1 +0,0 @@
-package foo
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badc/x.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badc/x.go
deleted file mode 100644
index bfa1de2..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badc/x.go
+++ /dev/null
@@ -1 +0,0 @@
-package badc
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badpkg/x.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badpkg/x.go
deleted file mode 100644
index dda35e8..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badpkg/x.go
+++ /dev/null
@@ -1 +0,0 @@
-pkg badpkg
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badexec/x_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badexec/x_test.go
deleted file mode 100644
index 12f5051..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badexec/x_test.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package badexec
-
-func init() {
-	panic("badexec")
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badsyntax/x.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badsyntax/x.go
deleted file mode 100644
index c8a5407..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badsyntax/x.go
+++ /dev/null
@@ -1 +0,0 @@
-package badsyntax
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badsyntax/x_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badsyntax/x_test.go
deleted file mode 100644
index 5be1074..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badsyntax/x_test.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package badsyntax
-
-func func func func func!
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badvar/x.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badvar/x.go
deleted file mode 100644
index fdd46c4..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badvar/x.go
+++ /dev/null
@@ -1 +0,0 @@
-package badvar
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badvar/x_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badvar/x_test.go
deleted file mode 100644
index c67df01..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/badtest/badvar/x_test.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package badvar_test
-
-func f() {
-	_ = notdefined
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/cgotest/m.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/cgotest/m.go
deleted file mode 100644
index 4d68307..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/cgotest/m.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package cgotest
-
-import "C"
-
-var _ C.int
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/go-cmd-test/helloworld.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/go-cmd-test/helloworld.go
deleted file mode 100644
index 002a5c7..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/go-cmd-test/helloworld.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package main
-
-func main() {
-	println("hello world")
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/main_test/m.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/main_test/m.go
deleted file mode 100644
index c682f03..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/main_test/m.go
+++ /dev/null
@@ -1,4 +0,0 @@
-package main
-
-func F()    {}
-func main() {}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/main_test/m_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/main_test/m_test.go
deleted file mode 100644
index f865b77..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/main_test/m_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package main_test
-
-import (
-	. "main_test"
-	"testing"
-)
-
-func Test1(t *testing.T) {
-	F()
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/notest/hello.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/notest/hello.go
deleted file mode 100644
index 7c42c32..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/notest/hello.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package notest
-
-func hello() {
-	println("hello world")
-}
-Hello world
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/syntaxerror/x.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/syntaxerror/x.go
deleted file mode 100644
index c89cd18..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/syntaxerror/x.go
+++ /dev/null
@@ -1 +0,0 @@
-package p
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/syntaxerror/x_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/syntaxerror/x_test.go
deleted file mode 100644
index 2460743..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/syntaxerror/x_test.go
+++ /dev/null
@@ -1,4 +0,0 @@
-package p
-
-func f() (x.y, z int) {
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p1/p1.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p1/p1.go
deleted file mode 100644
index 65ab76d..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p1/p1.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package p1
-
-import _ "testcycle/p2"
-
-func init() {
-	println("p1 init")
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p1/p1_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p1/p1_test.go
deleted file mode 100644
index 75abb13..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p1/p1_test.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package p1
-
-import "testing"
-
-func Test(t *testing.T) {
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p2/p2.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p2/p2.go
deleted file mode 100644
index 7e26cdf..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p2/p2.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2
-
-import _ "testcycle/p3"
-
-func init() {
-	println("p2 init")
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p3/p3.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p3/p3.go
deleted file mode 100644
index bb0a2f4..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p3/p3.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package p3
-
-func init() {
-	println("p3 init")
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p3/p3_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p3/p3_test.go
deleted file mode 100644
index 9b4b075..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/p3/p3_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package p3
-
-import (
-	"testing"
-
-	_ "testcycle/p1"
-)
-
-func Test(t *testing.T) {
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/q1/q1.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/q1/q1.go
deleted file mode 100644
index 7a471f0..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/q1/q1.go
+++ /dev/null
@@ -1 +0,0 @@
-package q1
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/q1/q1_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/q1/q1_test.go
deleted file mode 100644
index ca81bd2..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testcycle/q1/q1_test.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package q1
-
-import "testing"
-import _ "testcycle/q1"
-
-func Test(t *testing.T) {}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testdep/p1/p1.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testdep/p1/p1.go
deleted file mode 100644
index a457035..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testdep/p1/p1.go
+++ /dev/null
@@ -1 +0,0 @@
-package p1
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testdep/p1/p1_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testdep/p1/p1_test.go
deleted file mode 100644
index 8be7533..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testdep/p1/p1_test.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package p1
-
-import _ "testdep/p2"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testdep/p2/p2.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testdep/p2/p2.go
deleted file mode 100644
index 15ba2ea..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testdep/p2/p2.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package p2
-
-import _ "testdep/p3"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testdep/p3/p3.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testdep/p3/p3.go
deleted file mode 100644
index 0219e7f..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/testdep/p3/p3.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// +build ignore
-
-package ignored
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/bad.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/bad.go
deleted file mode 100644
index 57cc595..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/bad.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package vend
-
-import _ "r"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/good.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/good.go
deleted file mode 100644
index 952ada3..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/good.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package vend
-
-import _ "p"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/hello/hello.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/hello/hello.go
deleted file mode 100644
index 41dc03e..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/hello/hello.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package main
-
-import (
-	"fmt"
-	"strings" // really ../vendor/strings
-)
-
-func main() {
-	fmt.Printf("%s\n", strings.Msg)
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/hello/hello_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/hello/hello_test.go
deleted file mode 100644
index 5e72ada..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/hello/hello_test.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package main
-
-import (
-	"strings" // really ../vendor/strings
-	"testing"
-)
-
-func TestMsgInternal(t *testing.T) {
-	if strings.Msg != "hello, world" {
-		t.Fatal("unexpected msg: %v", strings.Msg)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/hello/hellox_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/hello/hellox_test.go
deleted file mode 100644
index 96e6049..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/hello/hellox_test.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package main_test
-
-import (
-	"strings" // really ../vendor/strings
-	"testing"
-)
-
-func TestMsgExternal(t *testing.T) {
-	if strings.Msg != "hello, world" {
-		t.Fatal("unexpected msg: %v", strings.Msg)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/subdir/bad.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/subdir/bad.go
deleted file mode 100644
index d0ddaac..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/subdir/bad.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package subdir
-
-import _ "r"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/subdir/good.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/subdir/good.go
deleted file mode 100644
index edd0454..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/subdir/good.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package subdir
-
-import _ "p"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/vendor/p/p.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/vendor/p/p.go
deleted file mode 100644
index c89cd18..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/vendor/p/p.go
+++ /dev/null
@@ -1 +0,0 @@
-package p
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/vendor/q/q.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/vendor/q/q.go
deleted file mode 100644
index 946e6d9..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/vendor/q/q.go
+++ /dev/null
@@ -1 +0,0 @@
-package q
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/vendor/strings/msg.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/vendor/strings/msg.go
deleted file mode 100644
index 438126b..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/vendor/strings/msg.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package strings
-
-var Msg = "hello, world"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/invalid/invalid.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/invalid/invalid.go
deleted file mode 100644
index e250d5b..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/invalid/invalid.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package invalid
-
-import "vend/x/invalid/vendor/foo"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/vendor/p/p.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/vendor/p/p.go
deleted file mode 100644
index c89cd18..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/vendor/p/p.go
+++ /dev/null
@@ -1 +0,0 @@
-package p
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/vendor/p/p/p.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/vendor/p/p/p.go
deleted file mode 100644
index e12e12c..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/vendor/p/p/p.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package p
-
-import _ "notfound"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/vendor/r/r.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/vendor/r/r.go
deleted file mode 100644
index 838c177..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/vendor/r/r.go
+++ /dev/null
@@ -1 +0,0 @@
-package r
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/x.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/x.go
deleted file mode 100644
index ae526eb..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vend/x/x.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package x
-
-import _ "p"
-import _ "q"
-import _ "r"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vetpkg/a_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vetpkg/a_test.go
deleted file mode 100644
index 9b64e8e..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vetpkg/a_test.go
+++ /dev/null
@@ -1 +0,0 @@
-package p_test
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vetpkg/b.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vetpkg/b.go
deleted file mode 100644
index 99e18f6..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vetpkg/b.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package p
-
-import "fmt"
-
-func f() {
-	fmt.Printf("%d")
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vetpkg/c.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vetpkg/c.go
deleted file mode 100644
index ef5648f..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/vetpkg/c.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// +build tagtest
-
-package p
-
-import "fmt"
-
-func g() {
-	fmt.Printf("%d", 3, 4)
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/xtestonly/f.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/xtestonly/f.go
deleted file mode 100644
index dac039e..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/xtestonly/f.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package xtestonly
-
-func F() int { return 42 }
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/xtestonly/f_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/src/xtestonly/f_test.go
deleted file mode 100644
index 01f6e83..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/src/xtestonly/f_test.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package xtestonly_test
-
-import (
-	"testing"
-	"xtestonly"
-)
-
-func TestF(t *testing.T) {
-	if x := xtestonly.F(); x != 42 {
-		t.Errorf("f.F() = %d, want 42", x)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/standalone_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/standalone_test.go
deleted file mode 100644
index 59cf918..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/standalone_test.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package standalone_test
-
-import "testing"
-
-func Test(t *testing.T) {
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/p.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/p.go
deleted file mode 100644
index f94d2cd..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/p.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package p
-
-func F() int { return 1 }
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/p1/p1.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/p1/p1.go
deleted file mode 100644
index fd31527..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/p1/p1.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package p1
-
-func F() int { return 1 }
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/p2/p2.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/p2/p2.go
deleted file mode 100644
index d488886..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/p2/p2.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package p2
-
-func F() int { return 1 }
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/p_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/p_test.go
deleted file mode 100644
index a3fb4a9..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/p_test.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package p
-
-import (
-	"./p1"
-
-	"testing"
-)
-
-func TestF(t *testing.T) {
-	if F() != p1.F() {
-		t.Fatal(F())
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/x_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/x_test.go
deleted file mode 100644
index b253e3f..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testimport/x_test.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package p_test
-
-import (
-	. "../testimport"
-
-	"./p2"
-
-	"testing"
-)
-
-func TestF1(t *testing.T) {
-	if F() != p2.F() {
-		t.Fatal(F())
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal/p.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal/p.go
deleted file mode 100644
index e3558a5..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal/p.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package p
-
-import _ "net/http/internal"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal2/p.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal2/p.go
deleted file mode 100644
index c594f5c..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal2/p.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package p
-
-import _ "./x/y/z/internal/w"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal2/x/y/z/internal/w/w.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal2/x/y/z/internal/w/w.go
deleted file mode 100644
index a796c0b..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal2/x/y/z/internal/w/w.go
+++ /dev/null
@@ -1 +0,0 @@
-package w
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal3/t.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal3/t.go
deleted file mode 100644
index 8576a4b..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal3/t.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package t
-
-import _ "internal/does-not-exist"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal4/src/p/p.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal4/src/p/p.go
deleted file mode 100644
index 6bdee27..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal4/src/p/p.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package p
-
-import (
-	_ "q/internal/x"
-	_ "q/j"
-)
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal4/src/q/internal/x/x.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal4/src/q/internal/x/x.go
deleted file mode 100644
index 823aafd..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal4/src/q/internal/x/x.go
+++ /dev/null
@@ -1 +0,0 @@
-package x
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal4/src/q/j/j.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal4/src/q/j/j.go
deleted file mode 100644
index 9f07543..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testinternal4/src/q/j/j.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package j
-
-import _ "q/internal/x"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testonly/p_test.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testonly/p_test.go
deleted file mode 100644
index c89cd18..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testonly/p_test.go
+++ /dev/null
@@ -1 +0,0 @@
-package p
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor/src/p/p.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor/src/p/p.go
deleted file mode 100644
index e740715..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor/src/p/p.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package p
-
-import (
-	_ "q/y"
-	_ "q/z"
-)
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor/src/q/vendor/x/x.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor/src/q/vendor/x/x.go
deleted file mode 100644
index 823aafd..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor/src/q/vendor/x/x.go
+++ /dev/null
@@ -1 +0,0 @@
-package x
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor/src/q/y/y.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor/src/q/y/y.go
deleted file mode 100644
index 4f84223..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor/src/q/y/y.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package y
-
-import _ "x"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor/src/q/z/z.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor/src/q/z/z.go
deleted file mode 100644
index a8d4924..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor/src/q/z/z.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package z
-
-import _ "q/vendor/x"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor2/src/p/p.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor2/src/p/p.go
deleted file mode 100644
index 220b2b2..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor2/src/p/p.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package p
-
-import "x"
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor2/vendor/x/x.go b/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor2/vendor/x/x.go
deleted file mode 100644
index 823aafd..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testdata/testvendor2/vendor/x/x.go
+++ /dev/null
@@ -1 +0,0 @@
-package x
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testflag.go b/third_party/gofrontend/libgo/go/cmd/go/testflag.go
deleted file mode 100644
index 1f3e3d3..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testflag.go
+++ /dev/null
@@ -1,281 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"os"
-	"strconv"
-	"strings"
-)
-
-// The flag handling part of go test is large and distracting.
-// We can't use the flag package because some of the flags from
-// our command line are for us, and some are for 6.out, and
-// some are for both.
-
-// testFlagSpec defines a flag we know about.
-type testFlagSpec struct {
-	name       string
-	boolVar    *bool
-	flagValue  flag.Value
-	passToTest bool // pass to Test
-	multiOK    bool // OK to have multiple instances
-	present    bool // flag has been seen
-}
-
-// testFlagDefn is the set of flags we process.
-var testFlagDefn = []*testFlagSpec{
-	// local.
-	{name: "c", boolVar: &testC},
-	{name: "i", boolVar: &buildI},
-	{name: "o"},
-	{name: "cover", boolVar: &testCover},
-	{name: "covermode"},
-	{name: "coverpkg"},
-	{name: "exec"},
-
-	// passed to 6.out, adding a "test." prefix to the name if necessary: -v becomes -test.v.
-	{name: "bench", passToTest: true},
-	{name: "benchmem", boolVar: new(bool), passToTest: true},
-	{name: "benchtime", passToTest: true},
-	{name: "count", passToTest: true},
-	{name: "coverprofile", passToTest: true},
-	{name: "cpu", passToTest: true},
-	{name: "cpuprofile", passToTest: true},
-	{name: "memprofile", passToTest: true},
-	{name: "memprofilerate", passToTest: true},
-	{name: "blockprofile", passToTest: true},
-	{name: "blockprofilerate", passToTest: true},
-	{name: "outputdir", passToTest: true},
-	{name: "parallel", passToTest: true},
-	{name: "run", passToTest: true},
-	{name: "short", boolVar: new(bool), passToTest: true},
-	{name: "timeout", passToTest: true},
-	{name: "trace", passToTest: true},
-	{name: "v", boolVar: &testV, passToTest: true},
-}
-
-// add build flags to testFlagDefn
-func init() {
-	var cmd Command
-	addBuildFlags(&cmd)
-	cmd.Flag.VisitAll(func(f *flag.Flag) {
-		if f.Name == "v" {
-			// test overrides the build -v flag
-			return
-		}
-		testFlagDefn = append(testFlagDefn, &testFlagSpec{
-			name:      f.Name,
-			flagValue: f.Value,
-		})
-	})
-}
-
-// testFlags processes the command line, grabbing -x and -c, rewriting known flags
-// to have "test" before them, and reading the command line for the 6.out.
-// Unfortunately for us, we need to do our own flag processing because go test
-// grabs some flags but otherwise its command line is just a holding place for
-// pkg.test's arguments.
-// We allow known flags both before and after the package name list,
-// to allow both
-//	go test fmt -custom-flag-for-fmt-test
-//	go test -x math
-func testFlags(args []string) (packageNames, passToTest []string) {
-	inPkg := false
-	outputDir := ""
-	for i := 0; i < len(args); i++ {
-		if !strings.HasPrefix(args[i], "-") {
-			if !inPkg && packageNames == nil {
-				// First package name we've seen.
-				inPkg = true
-			}
-			if inPkg {
-				packageNames = append(packageNames, args[i])
-				continue
-			}
-		}
-
-		if inPkg {
-			// Found an argument beginning with "-"; end of package list.
-			inPkg = false
-		}
-
-		f, value, extraWord := testFlag(args, i)
-		if f == nil {
-			// This is a flag we do not know; we must assume
-			// that any args we see after this might be flag
-			// arguments, not package names.
-			inPkg = false
-			if packageNames == nil {
-				// make non-nil: we have seen the empty package list
-				packageNames = []string{}
-			}
-			passToTest = append(passToTest, args[i])
-			continue
-		}
-		if f.flagValue != nil {
-			if err := f.flagValue.Set(value); err != nil {
-				fatalf("invalid flag argument for -%s: %v", f.name, err)
-			}
-		} else {
-			// Test-only flags.
-			// Arguably should be handled by f.flagValue, but aren't.
-			var err error
-			switch f.name {
-			// bool flags.
-			case "c", "i", "v", "cover":
-				setBoolFlag(f.boolVar, value)
-			case "o":
-				testO = value
-				testNeedBinary = true
-			case "exec":
-				execCmd, err = splitQuotedFields(value)
-				if err != nil {
-					fatalf("invalid flag argument for -%s: %v", f.name, err)
-				}
-			case "bench":
-				// record that we saw the flag; don't care about the value
-				testBench = true
-			case "timeout":
-				testTimeout = value
-			case "blockprofile", "cpuprofile", "memprofile", "trace":
-				testProfile = true
-				testNeedBinary = true
-			case "coverpkg":
-				testCover = true
-				if value == "" {
-					testCoverPaths = nil
-				} else {
-					testCoverPaths = strings.Split(value, ",")
-				}
-			case "coverprofile":
-				testCover = true
-				testProfile = true
-			case "covermode":
-				switch value {
-				case "set", "count", "atomic":
-					testCoverMode = value
-				default:
-					fatalf("invalid flag argument for -covermode: %q", value)
-				}
-				testCover = true
-			case "outputdir":
-				outputDir = value
-			}
-		}
-		if extraWord {
-			i++
-		}
-		if f.passToTest {
-			passToTest = append(passToTest, "-test."+f.name+"="+value)
-		}
-	}
-
-	if testCoverMode == "" {
-		testCoverMode = "set"
-		if buildRace {
-			// Default coverage mode is atomic when -race is set.
-			testCoverMode = "atomic"
-		}
-	}
-
-	// Tell the test what directory we're running in, so it can write the profiles there.
-	if testProfile && outputDir == "" {
-		dir, err := os.Getwd()
-		if err != nil {
-			fatalf("error from os.Getwd: %s", err)
-		}
-		passToTest = append(passToTest, "-test.outputdir", dir)
-	}
-	return
-}
-
-// testFlag sees if argument i is a known flag and returns its definition, value, and whether it consumed an extra word.
-func testFlag(args []string, i int) (f *testFlagSpec, value string, extra bool) {
-	arg := args[i]
-	if strings.HasPrefix(arg, "--") { // reduce two minuses to one
-		arg = arg[1:]
-	}
-	switch arg {
-	case "-?", "-h", "-help":
-		usage()
-	}
-	if arg == "" || arg[0] != '-' {
-		return
-	}
-	name := arg[1:]
-	// If there's already "test.", drop it for now.
-	name = strings.TrimPrefix(name, "test.")
-	equals := strings.Index(name, "=")
-	if equals >= 0 {
-		value = name[equals+1:]
-		name = name[:equals]
-	}
-	for _, f = range testFlagDefn {
-		if name == f.name {
-			// Booleans are special because they have modes -x, -x=true, -x=false.
-			if f.boolVar != nil || isBoolFlag(f.flagValue) {
-				if equals < 0 { // otherwise, it's been set and will be verified in setBoolFlag
-					value = "true"
-				} else {
-					// verify it parses
-					setBoolFlag(new(bool), value)
-				}
-			} else { // Non-booleans must have a value.
-				extra = equals < 0
-				if extra {
-					if i+1 >= len(args) {
-						testSyntaxError("missing argument for flag " + f.name)
-					}
-					value = args[i+1]
-				}
-			}
-			if f.present && !f.multiOK {
-				testSyntaxError(f.name + " flag may be set only once")
-			}
-			f.present = true
-			return
-		}
-	}
-	f = nil
-	return
-}
-
-// isBoolFlag reports whether v is a bool flag.
-func isBoolFlag(v flag.Value) bool {
-	vv, ok := v.(interface {
-		IsBoolFlag() bool
-	})
-	if ok {
-		return vv.IsBoolFlag()
-	}
-	return false
-}
-
-// setBoolFlag sets the addressed boolean to the value.
-func setBoolFlag(flag *bool, value string) {
-	x, err := strconv.ParseBool(value)
-	if err != nil {
-		testSyntaxError("illegal bool flag value " + value)
-	}
-	*flag = x
-}
-
-// setIntFlag sets the addressed integer to the value.
-func setIntFlag(flag *int, value string) {
-	x, err := strconv.Atoi(value)
-	if err != nil {
-		testSyntaxError("illegal int flag value " + value)
-	}
-	*flag = x
-}
-
-func testSyntaxError(msg string) {
-	fmt.Fprintf(os.Stderr, "go test: %s\n", msg)
-	fmt.Fprintf(os.Stderr, `run "go help test" or "go help testflag" for more information`+"\n")
-	os.Exit(2)
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/testgo.go b/third_party/gofrontend/libgo/go/cmd/go/testgo.go
deleted file mode 100644
index 01923f7..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/testgo.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains extra hooks for testing the go command.
-// It is compiled into the Go binary only when building the
-// test copy; it does not get compiled into the standard go
-// command, so these testing hooks are not present in the
-// go command that everyone uses.
-
-// +build testgo
-
-package main
-
-import "os"
-
-func init() {
-	if v := os.Getenv("TESTGO_IS_GO_RELEASE"); v != "" {
-		isGoRelease = v == "1"
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/tool.go b/third_party/gofrontend/libgo/go/cmd/go/tool.go
deleted file mode 100644
index 4b94939..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/tool.go
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"fmt"
-	"go/build"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"sort"
-	"strings"
-)
-
-var cmdTool = &Command{
-	Run:       runTool,
-	UsageLine: "tool [-n] command [args...]",
-	Short:     "run specified go tool",
-	Long: `
-Tool runs the go tool command identified by the arguments.
-With no arguments it prints the list of known tools.
-
-The -n flag causes tool to print the command that would be
-executed but not execute it.
-
-For more about each tool command, see 'go tool command -h'.
-`,
-}
-
-var (
-	toolGOOS      = runtime.GOOS
-	toolGOARCH    = runtime.GOARCH
-	toolIsWindows = toolGOOS == "windows"
-	toolDir       = build.ToolDir
-
-	toolN bool
-)
-
-// List of go tools found in the gccgo tool directory.
-// Other binaries could be in the same directory so don't
-// show those with the 'go tool' command.
-
-var gccgoTools = []string{"cgo", "fix", "cover", "godoc", "vet"}
-
-func init() {
-	cmdTool.Flag.BoolVar(&toolN, "n", false, "")
-}
-
-const toolWindowsExtension = ".exe"
-
-func tool(toolName string) string {
-	toolPath := filepath.Join(toolDir, toolName)
-	if toolIsWindows {
-		toolPath += toolWindowsExtension
-	}
-	if len(buildToolExec) > 0 {
-		return toolPath
-	}
-	// Give a nice message if there is no tool with that name.
-	if _, err := os.Stat(toolPath); err != nil {
-		if isInGoToolsRepo(toolName) {
-			fmt.Fprintf(os.Stderr, "go tool: no such tool %q; to install:\n\tgo get golang.org/x/tools/cmd/%s\n", toolName, toolName)
-		} else {
-			fmt.Fprintf(os.Stderr, "go tool: no such tool %q\n", toolName)
-		}
-		setExitStatus(3)
-		exit()
-	}
-	return toolPath
-}
-
-func isInGoToolsRepo(toolName string) bool {
-	return false
-}
-
-func runTool(cmd *Command, args []string) {
-	if len(args) == 0 {
-		listTools()
-		return
-	}
-	toolName := args[0]
-	// The tool name must be lower-case letters, numbers or underscores.
-	for _, c := range toolName {
-		switch {
-		case 'a' <= c && c <= 'z', '0' <= c && c <= '9', c == '_':
-		default:
-			fmt.Fprintf(os.Stderr, "go tool: bad tool name %q\n", toolName)
-			setExitStatus(2)
-			return
-		}
-	}
-	toolPath := tool(toolName)
-	if toolPath == "" {
-		return
-	}
-	if toolN {
-		cmd := toolPath
-		if len(args) > 1 {
-			cmd += " " + strings.Join(args[1:], " ")
-		}
-		fmt.Printf("%s\n", cmd)
-		return
-	}
-	toolCmd := &exec.Cmd{
-		Path:   toolPath,
-		Args:   args,
-		Stdin:  os.Stdin,
-		Stdout: os.Stdout,
-		Stderr: os.Stderr,
-		// Set $GOROOT, mainly for go tool dist.
-		Env: mergeEnvLists([]string{"GOROOT=" + goroot}, os.Environ()),
-	}
-	err := toolCmd.Run()
-	if err != nil {
-		// Only print about the exit status if the command
-		// didn't even run (not an ExitError) or it didn't exit cleanly
-		// or we're printing command lines too (-x mode).
-		// Assume if command exited cleanly (even with non-zero status)
-		// it printed any messages it wanted to print.
-		if e, ok := err.(*exec.ExitError); !ok || !e.Exited() || buildX {
-			fmt.Fprintf(os.Stderr, "go tool %s: %s\n", toolName, err)
-		}
-		setExitStatus(1)
-		return
-	}
-}
-
-// listTools prints a list of the available tools in the tools directory.
-func listTools() {
-	f, err := os.Open(toolDir)
-	if err != nil {
-		fmt.Fprintf(os.Stderr, "go tool: no tool directory: %s\n", err)
-		setExitStatus(2)
-		return
-	}
-	defer f.Close()
-	names, err := f.Readdirnames(-1)
-	if err != nil {
-		fmt.Fprintf(os.Stderr, "go tool: can't read directory: %s\n", err)
-		setExitStatus(2)
-		return
-	}
-
-	sort.Strings(names)
-	for _, name := range names {
-		// Unify presentation by going to lower case.
-		name = strings.ToLower(name)
-		// If it's windows, don't show the .exe suffix.
-		if toolIsWindows && strings.HasSuffix(name, toolWindowsExtension) {
-			name = name[:len(name)-len(toolWindowsExtension)]
-		}
-
-		// The tool directory used by gccgo will have other binaries
-		// in additions to go tools.  Only display go tools for this list.
-
-		if buildContext.Compiler == "gccgo" {
-			for _, tool := range gccgoTools {
-				if tool == name {
-					fmt.Println(name)
-				}
-			}
-		} else {
-
-			// Not gccgo, list all the tools found in this dir
-
-			fmt.Println(name)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/vcs.go b/third_party/gofrontend/libgo/go/cmd/go/vcs.go
deleted file mode 100644
index 28a7540..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/vcs.go
+++ /dev/null
@@ -1,1037 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bytes"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"internal/singleflight"
-	"log"
-	"net/url"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"regexp"
-	"strings"
-	"sync"
-)
-
-// A vcsCmd describes how to use a version control system
-// like Mercurial, Git, or Subversion.
-type vcsCmd struct {
-	name string
-	cmd  string // name of binary to invoke command
-
-	createCmd   []string // commands to download a fresh copy of a repository
-	downloadCmd []string // commands to download updates into an existing repository
-
-	tagCmd         []tagCmd // commands to list tags
-	tagLookupCmd   []tagCmd // commands to lookup tags before running tagSyncCmd
-	tagSyncCmd     []string // commands to sync to specific tag
-	tagSyncDefault []string // commands to sync to default tag
-
-	scheme  []string
-	pingCmd string
-
-	remoteRepo  func(v *vcsCmd, rootDir string) (remoteRepo string, err error)
-	resolveRepo func(v *vcsCmd, rootDir, remoteRepo string) (realRepo string, err error)
-}
-
-var isSecureScheme = map[string]bool{
-	"https":   true,
-	"git+ssh": true,
-	"bzr+ssh": true,
-	"svn+ssh": true,
-	"ssh":     true,
-}
-
-func (v *vcsCmd) isSecure(repo string) bool {
-	u, err := url.Parse(repo)
-	if err != nil {
-		// If repo is not a URL, it's not secure.
-		return false
-	}
-	return isSecureScheme[u.Scheme]
-}
-
-// A tagCmd describes a command to list available tags
-// that can be passed to tagSyncCmd.
-type tagCmd struct {
-	cmd     string // command to list tags
-	pattern string // regexp to extract tags from list
-}
-
-// vcsList lists the known version control systems
-var vcsList = []*vcsCmd{
-	vcsHg,
-	vcsGit,
-	vcsSvn,
-	vcsBzr,
-}
-
-// vcsByCmd returns the version control system for the given
-// command name (hg, git, svn, bzr).
-func vcsByCmd(cmd string) *vcsCmd {
-	for _, vcs := range vcsList {
-		if vcs.cmd == cmd {
-			return vcs
-		}
-	}
-	return nil
-}
-
-// vcsHg describes how to use Mercurial.
-var vcsHg = &vcsCmd{
-	name: "Mercurial",
-	cmd:  "hg",
-
-	createCmd:   []string{"clone -U {repo} {dir}"},
-	downloadCmd: []string{"pull"},
-
-	// We allow both tag and branch names as 'tags'
-	// for selecting a version.  This lets people have
-	// a go.release.r60 branch and a go1 branch
-	// and make changes in both, without constantly
-	// editing .hgtags.
-	tagCmd: []tagCmd{
-		{"tags", `^(\S+)`},
-		{"branches", `^(\S+)`},
-	},
-	tagSyncCmd:     []string{"update -r {tag}"},
-	tagSyncDefault: []string{"update default"},
-
-	scheme:     []string{"https", "http", "ssh"},
-	pingCmd:    "identify {scheme}://{repo}",
-	remoteRepo: hgRemoteRepo,
-}
-
-func hgRemoteRepo(vcsHg *vcsCmd, rootDir string) (remoteRepo string, err error) {
-	out, err := vcsHg.runOutput(rootDir, "paths default")
-	if err != nil {
-		return "", err
-	}
-	return strings.TrimSpace(string(out)), nil
-}
-
-// vcsGit describes how to use Git.
-var vcsGit = &vcsCmd{
-	name: "Git",
-	cmd:  "git",
-
-	createCmd:   []string{"clone {repo} {dir}", "--git-dir={dir}/.git submodule update --init --recursive"},
-	downloadCmd: []string{"pull --ff-only", "submodule update --init --recursive"},
-
-	tagCmd: []tagCmd{
-		// tags/xxx matches a git tag named xxx
-		// origin/xxx matches a git branch named xxx on the default remote repository
-		{"show-ref", `(?:tags|origin)/(\S+)$`},
-	},
-	tagLookupCmd: []tagCmd{
-		{"show-ref tags/{tag} origin/{tag}", `((?:tags|origin)/\S+)$`},
-	},
-	tagSyncCmd: []string{"checkout {tag}", "submodule update --init --recursive"},
-	// both createCmd and downloadCmd update the working dir.
-	// No need to do more here. We used to 'checkout master'
-	// but that doesn't work if the default branch is not named master.
-	// See golang.org/issue/9032.
-	tagSyncDefault: []string{"checkout master", "submodule update --init --recursive"},
-
-	scheme:     []string{"git", "https", "http", "git+ssh", "ssh"},
-	pingCmd:    "ls-remote {scheme}://{repo}",
-	remoteRepo: gitRemoteRepo,
-}
-
-// scpSyntaxRe matches the SCP-like addresses used by Git to access
-// repositories by SSH.
-var scpSyntaxRe = regexp.MustCompile(`^([a-zA-Z0-9_]+)@([a-zA-Z0-9._-]+):(.*)$`)
-
-func gitRemoteRepo(vcsGit *vcsCmd, rootDir string) (remoteRepo string, err error) {
-	cmd := "config remote.origin.url"
-	errParse := errors.New("unable to parse output of git " + cmd)
-	errRemoteOriginNotFound := errors.New("remote origin not found")
-	outb, err := vcsGit.run1(rootDir, cmd, nil, false)
-	if err != nil {
-		// if it doesn't output any message, it means the config argument is correct,
-		// but the config value itself doesn't exist
-		if outb != nil && len(outb) == 0 {
-			return "", errRemoteOriginNotFound
-		}
-		return "", err
-	}
-	out := strings.TrimSpace(string(outb))
-
-	var repoURL *url.URL
-	if m := scpSyntaxRe.FindStringSubmatch(out); m != nil {
-		// Match SCP-like syntax and convert it to a URL.
-		// Eg, "git@github.com:user/repo" becomes
-		// "ssh://git@github.com/user/repo".
-		repoURL = &url.URL{
-			Scheme:  "ssh",
-			User:    url.User(m[1]),
-			Host:    m[2],
-			RawPath: m[3],
-		}
-	} else {
-		repoURL, err = url.Parse(out)
-		if err != nil {
-			return "", err
-		}
-	}
-
-	// Iterate over insecure schemes too, because this function simply
-	// reports the state of the repo. If we can't see insecure schemes then
-	// we can't report the actual repo URL.
-	for _, s := range vcsGit.scheme {
-		if repoURL.Scheme == s {
-			return repoURL.String(), nil
-		}
-	}
-	return "", errParse
-}
-
-// vcsBzr describes how to use Bazaar.
-var vcsBzr = &vcsCmd{
-	name: "Bazaar",
-	cmd:  "bzr",
-
-	createCmd: []string{"branch {repo} {dir}"},
-
-	// Without --overwrite bzr will not pull tags that changed.
-	// Replace by --overwrite-tags after http://pad.lv/681792 goes in.
-	downloadCmd: []string{"pull --overwrite"},
-
-	tagCmd:         []tagCmd{{"tags", `^(\S+)`}},
-	tagSyncCmd:     []string{"update -r {tag}"},
-	tagSyncDefault: []string{"update -r revno:-1"},
-
-	scheme:      []string{"https", "http", "bzr", "bzr+ssh"},
-	pingCmd:     "info {scheme}://{repo}",
-	remoteRepo:  bzrRemoteRepo,
-	resolveRepo: bzrResolveRepo,
-}
-
-func bzrRemoteRepo(vcsBzr *vcsCmd, rootDir string) (remoteRepo string, err error) {
-	outb, err := vcsBzr.runOutput(rootDir, "config parent_location")
-	if err != nil {
-		return "", err
-	}
-	return strings.TrimSpace(string(outb)), nil
-}
-
-func bzrResolveRepo(vcsBzr *vcsCmd, rootDir, remoteRepo string) (realRepo string, err error) {
-	outb, err := vcsBzr.runOutput(rootDir, "info "+remoteRepo)
-	if err != nil {
-		return "", err
-	}
-	out := string(outb)
-
-	// Expect:
-	// ...
-	//   (branch root|repository branch): <URL>
-	// ...
-
-	found := false
-	for _, prefix := range []string{"\n  branch root: ", "\n  repository branch: "} {
-		i := strings.Index(out, prefix)
-		if i >= 0 {
-			out = out[i+len(prefix):]
-			found = true
-			break
-		}
-	}
-	if !found {
-		return "", fmt.Errorf("unable to parse output of bzr info")
-	}
-
-	i := strings.Index(out, "\n")
-	if i < 0 {
-		return "", fmt.Errorf("unable to parse output of bzr info")
-	}
-	out = out[:i]
-	return strings.TrimSpace(string(out)), nil
-}
-
-// vcsSvn describes how to use Subversion.
-var vcsSvn = &vcsCmd{
-	name: "Subversion",
-	cmd:  "svn",
-
-	createCmd:   []string{"checkout {repo} {dir}"},
-	downloadCmd: []string{"update"},
-
-	// There is no tag command in subversion.
-	// The branch information is all in the path names.
-
-	scheme:     []string{"https", "http", "svn", "svn+ssh"},
-	pingCmd:    "info {scheme}://{repo}",
-	remoteRepo: svnRemoteRepo,
-}
-
-func svnRemoteRepo(vcsSvn *vcsCmd, rootDir string) (remoteRepo string, err error) {
-	outb, err := vcsSvn.runOutput(rootDir, "info")
-	if err != nil {
-		return "", err
-	}
-	out := string(outb)
-
-	// Expect:
-	// ...
-	// Repository Root: <URL>
-	// ...
-
-	i := strings.Index(out, "\nRepository Root: ")
-	if i < 0 {
-		return "", fmt.Errorf("unable to parse output of svn info")
-	}
-	out = out[i+len("\nRepository Root: "):]
-	i = strings.Index(out, "\n")
-	if i < 0 {
-		return "", fmt.Errorf("unable to parse output of svn info")
-	}
-	out = out[:i]
-	return strings.TrimSpace(string(out)), nil
-}
-
-func (v *vcsCmd) String() string {
-	return v.name
-}
-
-// run runs the command line cmd in the given directory.
-// keyval is a list of key, value pairs.  run expands
-// instances of {key} in cmd into value, but only after
-// splitting cmd into individual arguments.
-// If an error occurs, run prints the command line and the
-// command's combined stdout+stderr to standard error.
-// Otherwise run discards the command's output.
-func (v *vcsCmd) run(dir string, cmd string, keyval ...string) error {
-	_, err := v.run1(dir, cmd, keyval, true)
-	return err
-}
-
-// runVerboseOnly is like run but only generates error output to standard error in verbose mode.
-func (v *vcsCmd) runVerboseOnly(dir string, cmd string, keyval ...string) error {
-	_, err := v.run1(dir, cmd, keyval, false)
-	return err
-}
-
-// runOutput is like run but returns the output of the command.
-func (v *vcsCmd) runOutput(dir string, cmd string, keyval ...string) ([]byte, error) {
-	return v.run1(dir, cmd, keyval, true)
-}
-
-// run1 is the generalized implementation of run and runOutput.
-func (v *vcsCmd) run1(dir string, cmdline string, keyval []string, verbose bool) ([]byte, error) {
-	m := make(map[string]string)
-	for i := 0; i < len(keyval); i += 2 {
-		m[keyval[i]] = keyval[i+1]
-	}
-	args := strings.Fields(cmdline)
-	for i, arg := range args {
-		args[i] = expand(m, arg)
-	}
-
-	_, err := exec.LookPath(v.cmd)
-	if err != nil {
-		fmt.Fprintf(os.Stderr,
-			"go: missing %s command. See https://golang.org/s/gogetcmd\n",
-			v.name)
-		return nil, err
-	}
-
-	cmd := exec.Command(v.cmd, args...)
-	cmd.Dir = dir
-	cmd.Env = envForDir(cmd.Dir, os.Environ())
-	if buildX {
-		fmt.Printf("cd %s\n", dir)
-		fmt.Printf("%s %s\n", v.cmd, strings.Join(args, " "))
-	}
-	var buf bytes.Buffer
-	cmd.Stdout = &buf
-	cmd.Stderr = &buf
-	err = cmd.Run()
-	out := buf.Bytes()
-	if err != nil {
-		if verbose || buildV {
-			fmt.Fprintf(os.Stderr, "# cd %s; %s %s\n", dir, v.cmd, strings.Join(args, " "))
-			os.Stderr.Write(out)
-		}
-		return out, err
-	}
-	return out, nil
-}
-
-// ping pings to determine scheme to use.
-func (v *vcsCmd) ping(scheme, repo string) error {
-	return v.runVerboseOnly(".", v.pingCmd, "scheme", scheme, "repo", repo)
-}
-
-// create creates a new copy of repo in dir.
-// The parent of dir must exist; dir must not.
-func (v *vcsCmd) create(dir, repo string) error {
-	for _, cmd := range v.createCmd {
-		if !go15VendorExperiment && strings.Contains(cmd, "submodule") {
-			continue
-		}
-		if err := v.run(".", cmd, "dir", dir, "repo", repo); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// download downloads any new changes for the repo in dir.
-func (v *vcsCmd) download(dir string) error {
-	if err := v.fixDetachedHead(dir); err != nil {
-		return err
-	}
-	for _, cmd := range v.downloadCmd {
-		if !go15VendorExperiment && strings.Contains(cmd, "submodule") {
-			continue
-		}
-		if err := v.run(dir, cmd); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// fixDetachedHead switches a Git repository in dir from a detached head to the master branch.
-// Go versions before 1.2 downloaded Git repositories in an unfortunate way
-// that resulted in the working tree state being on a detached head.
-// That meant the repository was not usable for normal Git operations.
-// Go 1.2 fixed that, but we can't pull into a detached head, so if this is
-// a Git repository we check for being on a detached head and switch to the
-// real branch, almost always called "master".
-// TODO(dsymonds): Consider removing this for Go 1.3.
-func (v *vcsCmd) fixDetachedHead(dir string) error {
-	if v != vcsGit {
-		return nil
-	}
-
-	// "git symbolic-ref HEAD" succeeds iff we are not on a detached head.
-	if err := v.runVerboseOnly(dir, "symbolic-ref HEAD"); err == nil {
-		// not on a detached head
-		return nil
-	}
-	if buildV {
-		log.Printf("%s on detached head; repairing", dir)
-	}
-	return v.run(dir, "checkout master")
-}
-
-// tags returns the list of available tags for the repo in dir.
-func (v *vcsCmd) tags(dir string) ([]string, error) {
-	var tags []string
-	for _, tc := range v.tagCmd {
-		out, err := v.runOutput(dir, tc.cmd)
-		if err != nil {
-			return nil, err
-		}
-		re := regexp.MustCompile(`(?m-s)` + tc.pattern)
-		for _, m := range re.FindAllStringSubmatch(string(out), -1) {
-			tags = append(tags, m[1])
-		}
-	}
-	return tags, nil
-}
-
-// tagSync syncs the repo in dir to the named tag,
-// which either is a tag returned by tags or is v.tagDefault.
-func (v *vcsCmd) tagSync(dir, tag string) error {
-	if v.tagSyncCmd == nil {
-		return nil
-	}
-	if tag != "" {
-		for _, tc := range v.tagLookupCmd {
-			out, err := v.runOutput(dir, tc.cmd, "tag", tag)
-			if err != nil {
-				return err
-			}
-			re := regexp.MustCompile(`(?m-s)` + tc.pattern)
-			m := re.FindStringSubmatch(string(out))
-			if len(m) > 1 {
-				tag = m[1]
-				break
-			}
-		}
-	}
-
-	if tag == "" && v.tagSyncDefault != nil {
-		for _, cmd := range v.tagSyncDefault {
-			if !go15VendorExperiment && strings.Contains(cmd, "submodule") {
-				continue
-			}
-			if err := v.run(dir, cmd); err != nil {
-				return err
-			}
-		}
-		return nil
-	}
-
-	for _, cmd := range v.tagSyncCmd {
-		if !go15VendorExperiment && strings.Contains(cmd, "submodule") {
-			continue
-		}
-		if err := v.run(dir, cmd, "tag", tag); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// A vcsPath describes how to convert an import path into a
-// version control system and repository name.
-type vcsPath struct {
-	prefix string                              // prefix this description applies to
-	re     string                              // pattern for import path
-	repo   string                              // repository to use (expand with match of re)
-	vcs    string                              // version control system to use (expand with match of re)
-	check  func(match map[string]string) error // additional checks
-	ping   bool                                // ping for scheme to use to download repo
-
-	regexp *regexp.Regexp // cached compiled form of re
-}
-
-// vcsForDir inspects dir and its parents to determine the
-// version control system and code repository to use.
-// On return, root is the import path
-// corresponding to the root of the repository
-// (thus root is a prefix of importPath).
-func vcsForDir(p *Package) (vcs *vcsCmd, root string, err error) {
-	// Clean and double-check that dir is in (a subdirectory of) srcRoot.
-	dir := filepath.Clean(p.Dir)
-	srcRoot := filepath.Clean(p.build.SrcRoot)
-	if len(dir) <= len(srcRoot) || dir[len(srcRoot)] != filepath.Separator {
-		return nil, "", fmt.Errorf("directory %q is outside source root %q", dir, srcRoot)
-	}
-
-	origDir := dir
-	for len(dir) > len(srcRoot) {
-		for _, vcs := range vcsList {
-			if fi, err := os.Stat(filepath.Join(dir, "."+vcs.cmd)); err == nil && fi.IsDir() {
-				return vcs, dir[len(srcRoot)+1:], nil
-			}
-		}
-
-		// Move to parent.
-		ndir := filepath.Dir(dir)
-		if len(ndir) >= len(dir) {
-			// Shouldn't happen, but just in case, stop.
-			break
-		}
-		dir = ndir
-	}
-
-	return nil, "", fmt.Errorf("directory %q is not using a known version control system", origDir)
-}
-
-// repoRoot represents a version control system, a repo, and a root of
-// where to put it on disk.
-type repoRoot struct {
-	vcs *vcsCmd
-
-	// repo is the repository URL, including scheme
-	repo string
-
-	// root is the import path corresponding to the root of the
-	// repository
-	root string
-}
-
-var httpPrefixRE = regexp.MustCompile(`^https?:`)
-
-// securityMode specifies whether a function should make network
-// calls using insecure transports (eg, plain text HTTP).
-// The zero value is "secure".
-type securityMode int
-
-const (
-	secure securityMode = iota
-	insecure
-)
-
-// repoRootForImportPath analyzes importPath to determine the
-// version control system, and code repository to use.
-func repoRootForImportPath(importPath string, security securityMode) (*repoRoot, error) {
-	rr, err := repoRootFromVCSPaths(importPath, "", security, vcsPaths)
-	if err == errUnknownSite {
-		// If there are wildcards, look up the thing before the wildcard,
-		// hoping it applies to the wildcarded parts too.
-		// This makes 'go get rsc.io/pdf/...' work in a fresh GOPATH.
-		lookup := strings.TrimSuffix(importPath, "/...")
-		if i := strings.Index(lookup, "/.../"); i >= 0 {
-			lookup = lookup[:i]
-		}
-		rr, err = repoRootForImportDynamic(lookup, security)
-
-		// repoRootForImportDynamic returns error detail
-		// that is irrelevant if the user didn't intend to use a
-		// dynamic import in the first place.
-		// Squelch it.
-		if err != nil {
-			if buildV {
-				log.Printf("import %q: %v", importPath, err)
-			}
-			err = fmt.Errorf("unrecognized import path %q", importPath)
-		}
-	}
-	if err != nil {
-		rr1, err1 := repoRootFromVCSPaths(importPath, "", security, vcsPathsAfterDynamic)
-		if err1 == nil {
-			rr = rr1
-			err = nil
-		}
-	}
-
-	if err == nil && strings.Contains(importPath, "...") && strings.Contains(rr.root, "...") {
-		// Do not allow wildcards in the repo root.
-		rr = nil
-		err = fmt.Errorf("cannot expand ... in %q", importPath)
-	}
-	return rr, err
-}
-
-var errUnknownSite = errors.New("dynamic lookup required to find mapping")
-
-// repoRootFromVCSPaths attempts to map importPath to a repoRoot
-// using the mappings defined in vcsPaths.
-// If scheme is non-empty, that scheme is forced.
-func repoRootFromVCSPaths(importPath, scheme string, security securityMode, vcsPaths []*vcsPath) (*repoRoot, error) {
-	// A common error is to use https://packagepath because that's what
-	// hg and git require. Diagnose this helpfully.
-	if loc := httpPrefixRE.FindStringIndex(importPath); loc != nil {
-		// The importPath has been cleaned, so has only one slash. The pattern
-		// ignores the slashes; the error message puts them back on the RHS at least.
-		return nil, fmt.Errorf("%q not allowed in import path", importPath[loc[0]:loc[1]]+"//")
-	}
-	for _, srv := range vcsPaths {
-		if !strings.HasPrefix(importPath, srv.prefix) {
-			continue
-		}
-		m := srv.regexp.FindStringSubmatch(importPath)
-		if m == nil {
-			if srv.prefix != "" {
-				return nil, fmt.Errorf("invalid %s import path %q", srv.prefix, importPath)
-			}
-			continue
-		}
-
-		// Build map of named subexpression matches for expand.
-		match := map[string]string{
-			"prefix": srv.prefix,
-			"import": importPath,
-		}
-		for i, name := range srv.regexp.SubexpNames() {
-			if name != "" && match[name] == "" {
-				match[name] = m[i]
-			}
-		}
-		if srv.vcs != "" {
-			match["vcs"] = expand(match, srv.vcs)
-		}
-		if srv.repo != "" {
-			match["repo"] = expand(match, srv.repo)
-		}
-		if srv.check != nil {
-			if err := srv.check(match); err != nil {
-				return nil, err
-			}
-		}
-		vcs := vcsByCmd(match["vcs"])
-		if vcs == nil {
-			return nil, fmt.Errorf("unknown version control system %q", match["vcs"])
-		}
-		if srv.ping {
-			if scheme != "" {
-				match["repo"] = scheme + "://" + match["repo"]
-			} else {
-				for _, scheme := range vcs.scheme {
-					if security == secure && !isSecureScheme[scheme] {
-						continue
-					}
-					if vcs.ping(scheme, match["repo"]) == nil {
-						match["repo"] = scheme + "://" + match["repo"]
-						break
-					}
-				}
-			}
-		}
-		rr := &repoRoot{
-			vcs:  vcs,
-			repo: match["repo"],
-			root: match["root"],
-		}
-		return rr, nil
-	}
-	return nil, errUnknownSite
-}
-
-// repoRootForImportDynamic finds a *repoRoot for a custom domain that's not
-// statically known by repoRootForImportPathStatic.
-//
-// This handles custom import paths like "name.tld/pkg/foo" or just "name.tld".
-func repoRootForImportDynamic(importPath string, security securityMode) (*repoRoot, error) {
-	slash := strings.Index(importPath, "/")
-	if slash < 0 {
-		slash = len(importPath)
-	}
-	host := importPath[:slash]
-	if !strings.Contains(host, ".") {
-		return nil, errors.New("import path does not begin with hostname")
-	}
-	urlStr, body, err := httpsOrHTTP(importPath, security)
-	if err != nil {
-		msg := "https fetch: %v"
-		if security == insecure {
-			msg = "http/" + msg
-		}
-		return nil, fmt.Errorf(msg, err)
-	}
-	defer body.Close()
-	imports, err := parseMetaGoImports(body)
-	if err != nil {
-		return nil, fmt.Errorf("parsing %s: %v", importPath, err)
-	}
-	// Find the matched meta import.
-	mmi, err := matchGoImport(imports, importPath)
-	if err != nil {
-		if err != errNoMatch {
-			return nil, fmt.Errorf("parse %s: %v", urlStr, err)
-		}
-		return nil, fmt.Errorf("parse %s: no go-import meta tags", urlStr)
-	}
-	if buildV {
-		log.Printf("get %q: found meta tag %#v at %s", importPath, mmi, urlStr)
-	}
-	// If the import was "uni.edu/bob/project", which said the
-	// prefix was "uni.edu" and the RepoRoot was "evilroot.com",
-	// make sure we don't trust Bob and check out evilroot.com to
-	// "uni.edu" yet (possibly overwriting/preempting another
-	// non-evil student).  Instead, first verify the root and see
-	// if it matches Bob's claim.
-	if mmi.Prefix != importPath {
-		if buildV {
-			log.Printf("get %q: verifying non-authoritative meta tag", importPath)
-		}
-		urlStr0 := urlStr
-		var imports []metaImport
-		urlStr, imports, err = metaImportsForPrefix(mmi.Prefix, security)
-		if err != nil {
-			return nil, err
-		}
-		metaImport2, err := matchGoImport(imports, importPath)
-		if err != nil || mmi != metaImport2 {
-			return nil, fmt.Errorf("%s and %s disagree about go-import for %s", urlStr0, urlStr, mmi.Prefix)
-		}
-	}
-
-	if !strings.Contains(mmi.RepoRoot, "://") {
-		return nil, fmt.Errorf("%s: invalid repo root %q; no scheme", urlStr, mmi.RepoRoot)
-	}
-	rr := &repoRoot{
-		vcs:  vcsByCmd(mmi.VCS),
-		repo: mmi.RepoRoot,
-		root: mmi.Prefix,
-	}
-	if rr.vcs == nil {
-		return nil, fmt.Errorf("%s: unknown vcs %q", urlStr, mmi.VCS)
-	}
-	return rr, nil
-}
-
-var fetchGroup singleflight.Group
-var (
-	fetchCacheMu sync.Mutex
-	fetchCache   = map[string]fetchResult{} // key is metaImportsForPrefix's importPrefix
-)
-
-// metaImportsForPrefix takes a package's root import path as declared in a <meta> tag
-// and returns its HTML discovery URL and the parsed metaImport lines
-// found on the page.
-//
-// The importPath is of the form "golang.org/x/tools".
-// It is an error if no imports are found.
-// urlStr will still be valid if err != nil.
-// The returned urlStr will be of the form "https://golang.org/x/tools?go-get=1"
-func metaImportsForPrefix(importPrefix string, security securityMode) (urlStr string, imports []metaImport, err error) {
-	setCache := func(res fetchResult) (fetchResult, error) {
-		fetchCacheMu.Lock()
-		defer fetchCacheMu.Unlock()
-		fetchCache[importPrefix] = res
-		return res, nil
-	}
-
-	resi, _, _ := fetchGroup.Do(importPrefix, func() (resi interface{}, err error) {
-		fetchCacheMu.Lock()
-		if res, ok := fetchCache[importPrefix]; ok {
-			fetchCacheMu.Unlock()
-			return res, nil
-		}
-		fetchCacheMu.Unlock()
-
-		urlStr, body, err := httpsOrHTTP(importPrefix, security)
-		if err != nil {
-			return setCache(fetchResult{urlStr: urlStr, err: fmt.Errorf("fetch %s: %v", urlStr, err)})
-		}
-		imports, err := parseMetaGoImports(body)
-		if err != nil {
-			return setCache(fetchResult{urlStr: urlStr, err: fmt.Errorf("parsing %s: %v", urlStr, err)})
-		}
-		if len(imports) == 0 {
-			err = fmt.Errorf("fetch %s: no go-import meta tag", urlStr)
-		}
-		return setCache(fetchResult{urlStr: urlStr, imports: imports, err: err})
-	})
-	res := resi.(fetchResult)
-	return res.urlStr, res.imports, res.err
-}
-
-type fetchResult struct {
-	urlStr  string // e.g. "https://foo.com/x/bar?go-get=1"
-	imports []metaImport
-	err     error
-}
-
-// metaImport represents the parsed <meta name="go-import"
-// content="prefix vcs reporoot" /> tags from HTML files.
-type metaImport struct {
-	Prefix, VCS, RepoRoot string
-}
-
-// errNoMatch is returned from matchGoImport when there's no applicable match.
-var errNoMatch = errors.New("no import match")
-
-// matchGoImport returns the metaImport from imports matching importPath.
-// An error is returned if there are multiple matches.
-// errNoMatch is returned if none match.
-func matchGoImport(imports []metaImport, importPath string) (_ metaImport, err error) {
-	match := -1
-	for i, im := range imports {
-		if !strings.HasPrefix(importPath, im.Prefix) {
-			continue
-		}
-		if match != -1 {
-			err = fmt.Errorf("multiple meta tags match import path %q", importPath)
-			return
-		}
-		match = i
-	}
-	if match == -1 {
-		err = errNoMatch
-		return
-	}
-	return imports[match], nil
-}
-
-// expand rewrites s to replace {k} with match[k] for each key k in match.
-func expand(match map[string]string, s string) string {
-	for k, v := range match {
-		s = strings.Replace(s, "{"+k+"}", v, -1)
-	}
-	return s
-}
-
-// vcsPaths defines the meaning of import paths referring to
-// commonly-used VCS hosting sites (github.com/user/dir)
-// and import paths referring to a fully-qualified importPath
-// containing a VCS type (foo.com/repo.git/dir)
-var vcsPaths = []*vcsPath{
-	// Google Code - new syntax
-	{
-		prefix: "code.google.com/",
-		re:     `^(?P<root>code\.google\.com/p/(?P<project>[a-z0-9\-]+)(\.(?P<subrepo>[a-z0-9\-]+))?)(/[A-Za-z0-9_.\-]+)*$`,
-		repo:   "https://{root}",
-		check:  googleCodeVCS,
-	},
-
-	// Google Code - old syntax
-	{
-		re:    `^(?P<project>[a-z0-9_\-.]+)\.googlecode\.com/(git|hg|svn)(?P<path>/.*)?$`,
-		check: oldGoogleCode,
-	},
-
-	// Github
-	{
-		prefix: "github.com/",
-		re:     `^(?P<root>github\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`,
-		vcs:    "git",
-		repo:   "https://{root}",
-		check:  noVCSSuffix,
-	},
-
-	// Bitbucket
-	{
-		prefix: "bitbucket.org/",
-		re:     `^(?P<root>bitbucket\.org/(?P<bitname>[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`,
-		repo:   "https://{root}",
-		check:  bitbucketVCS,
-	},
-
-	// IBM DevOps Services (JazzHub)
-	{
-		prefix: "hub.jazz.net/git",
-		re:     `^(?P<root>hub.jazz.net/git/[a-z0-9]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`,
-		vcs:    "git",
-		repo:   "https://{root}",
-		check:  noVCSSuffix,
-	},
-
-	// Git at Apache
-	{
-		prefix: "git.apache.org",
-		re:     `^(?P<root>git.apache.org/[a-z0-9_.\-]+\.git)(/[A-Za-z0-9_.\-]+)*$`,
-		vcs:    "git",
-		repo:   "https://{root}",
-	},
-
-	// General syntax for any server.
-	// Must be last.
-	{
-		re:   `^(?P<root>(?P<repo>([a-z0-9.\-]+\.)+[a-z0-9.\-]+(:[0-9]+)?/[A-Za-z0-9_.\-/]*?)\.(?P<vcs>bzr|git|hg|svn))(/[A-Za-z0-9_.\-]+)*$`,
-		ping: true,
-	},
-}
-
-// vcsPathsAfterDynamic gives additional vcsPaths entries
-// to try after the dynamic HTML check.
-// This gives those sites a chance to introduce <meta> tags
-// as part of a graceful transition away from the hard-coded logic.
-var vcsPathsAfterDynamic = []*vcsPath{
-	// Launchpad. See golang.org/issue/11436.
-	{
-		prefix: "launchpad.net/",
-		re:     `^(?P<root>launchpad\.net/((?P<project>[A-Za-z0-9_.\-]+)(?P<series>/[A-Za-z0-9_.\-]+)?|~[A-Za-z0-9_.\-]+/(\+junk|[A-Za-z0-9_.\-]+)/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`,
-		vcs:    "bzr",
-		repo:   "https://{root}",
-		check:  launchpadVCS,
-	},
-}
-
-func init() {
-	// fill in cached regexps.
-	// Doing this eagerly discovers invalid regexp syntax
-	// without having to run a command that needs that regexp.
-	for _, srv := range vcsPaths {
-		srv.regexp = regexp.MustCompile(srv.re)
-	}
-	for _, srv := range vcsPathsAfterDynamic {
-		srv.regexp = regexp.MustCompile(srv.re)
-	}
-}
-
-// noVCSSuffix checks that the repository name does not
-// end in .foo for any version control system foo.
-// The usual culprit is ".git".
-func noVCSSuffix(match map[string]string) error {
-	repo := match["repo"]
-	for _, vcs := range vcsList {
-		if strings.HasSuffix(repo, "."+vcs.cmd) {
-			return fmt.Errorf("invalid version control suffix in %s path", match["prefix"])
-		}
-	}
-	return nil
-}
-
-var googleCheckout = regexp.MustCompile(`id="checkoutcmd">(hg|git|svn)`)
-
-// googleCodeVCS determines the version control system for
-// a code.google.com repository, by scraping the project's
-// /source/checkout page.
-func googleCodeVCS(match map[string]string) error {
-	if err := noVCSSuffix(match); err != nil {
-		return err
-	}
-	data, err := httpGET(expand(match, "https://code.google.com/p/{project}/source/checkout?repo={subrepo}"))
-	if err != nil {
-		return err
-	}
-
-	if m := googleCheckout.FindSubmatch(data); m != nil {
-		if vcs := vcsByCmd(string(m[1])); vcs != nil {
-			// Subversion requires the old URLs.
-			// TODO: Test.
-			if vcs == vcsSvn {
-				if match["subrepo"] != "" {
-					return fmt.Errorf("sub-repositories not supported in Google Code Subversion projects")
-				}
-				match["repo"] = expand(match, "https://{project}.googlecode.com/svn")
-			}
-			match["vcs"] = vcs.cmd
-			return nil
-		}
-	}
-
-	return fmt.Errorf("unable to detect version control system for code.google.com/ path")
-}
-
-// oldGoogleCode is invoked for old-style foo.googlecode.com paths.
-// It prints an error giving the equivalent new path.
-func oldGoogleCode(match map[string]string) error {
-	return fmt.Errorf("invalid Google Code import path: use %s instead",
-		expand(match, "code.google.com/p/{project}{path}"))
-}
-
-// bitbucketVCS determines the version control system for a
-// Bitbucket repository, by using the Bitbucket API.
-func bitbucketVCS(match map[string]string) error {
-	if err := noVCSSuffix(match); err != nil {
-		return err
-	}
-
-	var resp struct {
-		SCM string `json:"scm"`
-	}
-	url := expand(match, "https://api.bitbucket.org/1.0/repositories/{bitname}")
-	data, err := httpGET(url)
-	if err != nil {
-		if httpErr, ok := err.(*httpError); ok && httpErr.statusCode == 403 {
-			// this may be a private repository. If so, attempt to determine which
-			// VCS it uses. See issue 5375.
-			root := match["root"]
-			for _, vcs := range []string{"git", "hg"} {
-				if vcsByCmd(vcs).ping("https", root) == nil {
-					resp.SCM = vcs
-					break
-				}
-			}
-		}
-
-		if resp.SCM == "" {
-			return err
-		}
-	} else {
-		if err := json.Unmarshal(data, &resp); err != nil {
-			return fmt.Errorf("decoding %s: %v", url, err)
-		}
-	}
-
-	if vcsByCmd(resp.SCM) != nil {
-		match["vcs"] = resp.SCM
-		if resp.SCM == "git" {
-			match["repo"] += ".git"
-		}
-		return nil
-	}
-
-	return fmt.Errorf("unable to detect version control system for bitbucket.org/ path")
-}
-
-// launchpadVCS solves the ambiguity for "lp.net/project/foo". In this case,
-// "foo" could be a series name registered in Launchpad with its own branch,
-// and it could also be the name of a directory within the main project
-// branch one level up.
-func launchpadVCS(match map[string]string) error {
-	if match["project"] == "" || match["series"] == "" {
-		return nil
-	}
-	_, err := httpGET(expand(match, "https://code.launchpad.net/{project}{series}/.bzr/branch-format"))
-	if err != nil {
-		match["root"] = expand(match, "launchpad.net/{project}")
-		match["repo"] = expand(match, "https://{root}")
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/vcs_test.go b/third_party/gofrontend/libgo/go/cmd/go/vcs_test.go
deleted file mode 100644
index f5d5e4f..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/vcs_test.go
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"internal/testenv"
-	"testing"
-)
-
-// Test that RepoRootForImportPath creates the correct RepoRoot for a given importPath.
-// TODO(cmang): Add tests for SVN and BZR.
-func TestRepoRootForImportPath(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tests := []struct {
-		path string
-		want *repoRoot
-	}{
-		{
-			"code.google.com/p/go",
-			&repoRoot{
-				vcs:  vcsHg,
-				repo: "https://code.google.com/p/go",
-			},
-		},
-		/*{
-		        "code.google.com/r/go",
-		        &repoRoot{
-		                vcs:  vcsHg,
-		                repo: "https://code.google.com/r/go",
-		        },
-		},*/
-		{
-			"github.com/golang/groupcache",
-			&repoRoot{
-				vcs:  vcsGit,
-				repo: "https://github.com/golang/groupcache",
-			},
-		},
-		// IBM DevOps Services tests
-		{
-			"hub.jazz.net/git/user1/pkgname",
-			&repoRoot{
-				vcs:  vcsGit,
-				repo: "https://hub.jazz.net/git/user1/pkgname",
-			},
-		},
-		{
-			"hub.jazz.net/git/user1/pkgname/submodule/submodule/submodule",
-			&repoRoot{
-				vcs:  vcsGit,
-				repo: "https://hub.jazz.net/git/user1/pkgname",
-			},
-		},
-		{
-			"hub.jazz.net",
-			nil,
-		},
-		{
-			"hub2.jazz.net",
-			nil,
-		},
-		{
-			"hub.jazz.net/someotherprefix",
-			nil,
-		},
-		{
-			"hub.jazz.net/someotherprefix/user1/pkgname",
-			nil,
-		},
-		// Spaces are not valid in user names or package names
-		{
-			"hub.jazz.net/git/User 1/pkgname",
-			nil,
-		},
-		{
-			"hub.jazz.net/git/user1/pkg name",
-			nil,
-		},
-		// Dots are not valid in user names
-		{
-			"hub.jazz.net/git/user.1/pkgname",
-			nil,
-		},
-		{
-			"hub.jazz.net/git/user/pkg.name",
-			&repoRoot{
-				vcs:  vcsGit,
-				repo: "https://hub.jazz.net/git/user/pkg.name",
-			},
-		},
-		// User names cannot have uppercase letters
-		{
-			"hub.jazz.net/git/USER/pkgname",
-			nil,
-		},
-		// Spaces are not valid in package name
-		{
-			"git.apache.org/package name/path/to/lib",
-			nil,
-		},
-		// Should have ".git" suffix
-		{
-			"git.apache.org/package-name/path/to/lib",
-			nil,
-		},
-		{
-			"git.apache.org/package-name.git",
-			&repoRoot{
-				vcs:  vcsGit,
-				repo: "https://git.apache.org/package-name.git",
-			},
-		},
-		{
-			"git.apache.org/package-name_2.x.git/path/to/lib",
-			&repoRoot{
-				vcs:  vcsGit,
-				repo: "https://git.apache.org/package-name_2.x.git",
-			},
-		},
-	}
-
-	for _, test := range tests {
-		got, err := repoRootForImportPath(test.path, secure)
-		want := test.want
-
-		if want == nil {
-			if err == nil {
-				t.Errorf("RepoRootForImport(%q): Error expected but not received", test.path)
-			}
-			continue
-		}
-		if err != nil {
-			t.Errorf("RepoRootForImport(%q): %v", test.path, err)
-			continue
-		}
-		if got.vcs.name != want.vcs.name || got.repo != want.repo {
-			t.Errorf("RepoRootForImport(%q) = VCS(%s) Repo(%s), want VCS(%s) Repo(%s)", test.path, got.vcs, got.repo, want.vcs, want.repo)
-		}
-	}
-}
-
-func TestIsSecure(t *testing.T) {
-	tests := []struct {
-		vcs    *vcsCmd
-		url    string
-		secure bool
-	}{
-		{vcsGit, "http://example.com/foo.git", false},
-		{vcsGit, "https://example.com/foo.git", true},
-		{vcsBzr, "http://example.com/foo.bzr", false},
-		{vcsBzr, "https://example.com/foo.bzr", true},
-		{vcsSvn, "http://example.com/svn", false},
-		{vcsSvn, "https://example.com/svn", true},
-		{vcsHg, "http://example.com/foo.hg", false},
-		{vcsHg, "https://example.com/foo.hg", true},
-		{vcsGit, "ssh://user@example.com/foo.git", true},
-		{vcsGit, "user@server:path/to/repo.git", false},
-		{vcsGit, "user@server:", false},
-		{vcsGit, "server:repo.git", false},
-		{vcsGit, "server:path/to/repo.git", false},
-		{vcsGit, "example.com:path/to/repo.git", false},
-		{vcsGit, "path/that/contains/a:colon/repo.git", false},
-		{vcsHg, "ssh://user@example.com/path/to/repo.hg", true},
-	}
-
-	for _, test := range tests {
-		secure := test.vcs.isSecure(test.url)
-		if secure != test.secure {
-			t.Errorf("%s isSecure(%q) = %t; want %t", test.vcs, test.url, secure, test.secure)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/vendor_test.go b/third_party/gofrontend/libgo/go/cmd/go/vendor_test.go
deleted file mode 100644
index 1e8cf9c..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/vendor_test.go
+++ /dev/null
@@ -1,258 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Tests for vendoring semantics.
-
-package main_test
-
-import (
-	"bytes"
-	"fmt"
-	"internal/testenv"
-	"path/filepath"
-	"regexp"
-	"strings"
-	"testing"
-)
-
-func TestVendorImports(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.setenv("GO15VENDOREXPERIMENT", "1")
-	tg.run("list", "-f", "{{.ImportPath}} {{.Imports}}", "vend/...")
-	want := `
-		vend [vend/vendor/p r]
-		vend/hello [fmt vend/vendor/strings]
-		vend/subdir [vend/vendor/p r]
-		vend/vendor/p []
-		vend/vendor/q []
-		vend/vendor/strings []
-		vend/x [vend/x/vendor/p vend/vendor/q vend/x/vendor/r]
-		vend/x/invalid [vend/x/invalid/vendor/foo]
-		vend/x/vendor/p []
-		vend/x/vendor/p/p [notfound]
-		vend/x/vendor/r []
-	`
-	want = strings.Replace(want+"\t", "\n\t\t", "\n", -1)
-	want = strings.TrimPrefix(want, "\n")
-
-	have := tg.stdout.String()
-
-	if have != want {
-		t.Errorf("incorrect go list output:\n%s", diffSortedOutputs(have, want))
-	}
-}
-
-func TestVendorRun(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.setenv("GO15VENDOREXPERIMENT", "1")
-	tg.cd(filepath.Join(tg.pwd(), "testdata/src/vend/hello"))
-	tg.run("run", "hello.go")
-	tg.grepStdout("hello, world", "missing hello world output")
-}
-
-func TestVendorGOPATH(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	changeVolume := func(s string, f func(s string) string) string {
-		vol := filepath.VolumeName(s)
-		return f(vol) + s[len(vol):]
-	}
-	gopath := changeVolume(filepath.Join(tg.pwd(), "testdata"), strings.ToLower)
-	tg.setenv("GOPATH", gopath)
-	tg.setenv("GO15VENDOREXPERIMENT", "1")
-	cd := changeVolume(filepath.Join(tg.pwd(), "testdata/src/vend/hello"), strings.ToUpper)
-	tg.cd(cd)
-	tg.run("run", "hello.go")
-	tg.grepStdout("hello, world", "missing hello world output")
-}
-
-func TestVendorTest(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.setenv("GO15VENDOREXPERIMENT", "1")
-	tg.cd(filepath.Join(tg.pwd(), "testdata/src/vend/hello"))
-	tg.run("test", "-v")
-	tg.grepStdout("TestMsgInternal", "missing use in internal test")
-	tg.grepStdout("TestMsgExternal", "missing use in external test")
-}
-
-func TestVendorInvalid(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.setenv("GO15VENDOREXPERIMENT", "1")
-
-	tg.runFail("build", "vend/x/invalid")
-	tg.grepStderr("must be imported as foo", "missing vendor import error")
-}
-
-func TestVendorImportError(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
-	tg.setenv("GO15VENDOREXPERIMENT", "1")
-
-	tg.runFail("build", "vend/x/vendor/p/p")
-
-	re := regexp.MustCompile(`cannot find package "notfound" in any of:
-	.*[\\/]testdata[\\/]src[\\/]vend[\\/]x[\\/]vendor[\\/]notfound \(vendor tree\)
-	.*[\\/]testdata[\\/]src[\\/]vend[\\/]vendor[\\/]notfound \(vendor tree\)
-	.*[\\/]src[\\/]notfound \(from \$GOROOT\)
-	.*[\\/]testdata[\\/]src[\\/]notfound \(from \$GOPATH\)`)
-
-	if !re.MatchString(tg.stderr.String()) {
-		t.Errorf("did not find expected search list in error text")
-	}
-}
-
-// diffSortedOutput prepares a diff of the already sorted outputs haveText and wantText.
-// The diff shows common lines prefixed by a tab, lines present only in haveText
-// prefixed by "unexpected: ", and lines present only in wantText prefixed by "missing: ".
-func diffSortedOutputs(haveText, wantText string) string {
-	var diff bytes.Buffer
-	have := splitLines(haveText)
-	want := splitLines(wantText)
-	for len(have) > 0 || len(want) > 0 {
-		if len(want) == 0 || len(have) > 0 && have[0] < want[0] {
-			fmt.Fprintf(&diff, "unexpected: %s\n", have[0])
-			have = have[1:]
-			continue
-		}
-		if len(have) == 0 || len(want) > 0 && want[0] < have[0] {
-			fmt.Fprintf(&diff, "missing: %s\n", want[0])
-			want = want[1:]
-			continue
-		}
-		fmt.Fprintf(&diff, "\t%s\n", want[0])
-		want = want[1:]
-		have = have[1:]
-	}
-	return diff.String()
-}
-
-func splitLines(s string) []string {
-	x := strings.Split(s, "\n")
-	if x[len(x)-1] == "" {
-		x = x[:len(x)-1]
-	}
-	return x
-}
-
-func TestVendorGet(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.tempFile("src/v/m.go", `
-		package main
-		import ("fmt"; "vendor.org/p")
-		func main() {
-			fmt.Println(p.C)
-		}`)
-	tg.tempFile("src/v/m_test.go", `
-		package main
-		import ("fmt"; "testing"; "vendor.org/p")
-		func TestNothing(t *testing.T) {
-			fmt.Println(p.C)
-		}`)
-	tg.tempFile("src/v/vendor/vendor.org/p/p.go", `
-		package p
-		const C = 1`)
-	tg.setenv("GOPATH", tg.path("."))
-	tg.setenv("GO15VENDOREXPERIMENT", "1")
-	tg.cd(tg.path("src/v"))
-	tg.run("run", "m.go")
-	tg.run("test")
-	tg.run("list", "-f", "{{.Imports}}")
-	tg.grepStdout("v/vendor/vendor.org/p", "import not in vendor directory")
-	tg.run("list", "-f", "{{.TestImports}}")
-	tg.grepStdout("v/vendor/vendor.org/p", "test import not in vendor directory")
-	tg.run("get")
-	tg.run("get", "-t")
-}
-
-func TestVendorGetUpdate(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-	tg.setenv("GO15VENDOREXPERIMENT", "1")
-	tg.run("get", "github.com/rsc/go-get-issue-11864")
-	tg.run("get", "-u", "github.com/rsc/go-get-issue-11864")
-}
-
-func TestVendorCache(t *testing.T) {
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata/testvendor"))
-	tg.setenv("GO15VENDOREXPERIMENT", "1")
-	tg.runFail("build", "p")
-	tg.grepStderr("must be imported as x", "did not fail to build p")
-}
-
-func TestVendorTest2(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-	tg.setenv("GO15VENDOREXPERIMENT", "1")
-	tg.run("get", "github.com/rsc/go-get-issue-11864")
-
-	// build -i should work
-	tg.run("build", "-i", "github.com/rsc/go-get-issue-11864")
-	tg.run("build", "-i", "github.com/rsc/go-get-issue-11864/t")
-
-	// test -i should work like build -i (golang.org/issue/11988)
-	tg.run("test", "-i", "github.com/rsc/go-get-issue-11864")
-	tg.run("test", "-i", "github.com/rsc/go-get-issue-11864/t")
-
-	// test should work too
-	tg.run("test", "github.com/rsc/go-get-issue-11864")
-	tg.run("test", "github.com/rsc/go-get-issue-11864/t")
-
-	// external tests should observe internal test exports (golang.org/issue/11977)
-	tg.run("test", "github.com/rsc/go-get-issue-11864/vendor/vendor.org/tx2")
-}
-
-func TestVendorList(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.makeTempdir()
-	tg.setenv("GOPATH", tg.path("."))
-	tg.setenv("GO15VENDOREXPERIMENT", "1")
-	tg.run("get", "github.com/rsc/go-get-issue-11864")
-
-	tg.run("list", "-f", `{{join .TestImports "\n"}}`, "github.com/rsc/go-get-issue-11864/t")
-	tg.grepStdout("go-get-issue-11864/vendor/vendor.org/p", "did not find vendor-expanded p")
-
-	tg.run("list", "-f", `{{join .XTestImports "\n"}}`, "github.com/rsc/go-get-issue-11864/tx")
-	tg.grepStdout("go-get-issue-11864/vendor/vendor.org/p", "did not find vendor-expanded p")
-
-	tg.run("list", "-f", `{{join .XTestImports "\n"}}`, "github.com/rsc/go-get-issue-11864/vendor/vendor.org/tx2")
-	tg.grepStdout("go-get-issue-11864/vendor/vendor.org/tx2", "did not find vendor-expanded tx2")
-
-	tg.run("list", "-f", `{{join .XTestImports "\n"}}`, "github.com/rsc/go-get-issue-11864/vendor/vendor.org/tx3")
-	tg.grepStdout("go-get-issue-11864/vendor/vendor.org/tx3", "did not find vendor-expanded tx3")
-}
-
-func TestVendor12156(t *testing.T) {
-	// Former index out of range panic.
-	tg := testgo(t)
-	defer tg.cleanup()
-	tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata/testvendor2"))
-	tg.setenv("GO15VENDOREXPERIMENT", "1")
-	tg.cd(filepath.Join(tg.pwd(), "testdata/testvendor2/src/p"))
-	tg.runFail("build", "p.go")
-	tg.grepStderrNot("panic", "panicked")
-	tg.grepStderr(`cannot find package "x"`, "wrong error")
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/version.go b/third_party/gofrontend/libgo/go/cmd/go/version.go
deleted file mode 100644
index a41f4a7..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/version.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"fmt"
-	"runtime"
-)
-
-var cmdVersion = &Command{
-	Run:       runVersion,
-	UsageLine: "version",
-	Short:     "print Go version",
-	Long:      `Version prints the Go version, as reported by runtime.Version.`,
-}
-
-func runVersion(cmd *Command, args []string) {
-	if len(args) != 0 {
-		cmd.Usage()
-	}
-
-	fmt.Printf("go version %s %s/%s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH)
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/go/vet.go b/third_party/gofrontend/libgo/go/cmd/go/vet.go
deleted file mode 100644
index 81b978e..0000000
--- a/third_party/gofrontend/libgo/go/cmd/go/vet.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "path/filepath"
-
-func init() {
-	addBuildFlags(cmdVet)
-}
-
-var cmdVet = &Command{
-	Run:       runVet,
-	UsageLine: "vet [-n] [-x] [build flags] [packages]",
-	Short:     "run go tool vet on packages",
-	Long: `
-Vet runs the Go vet command on the packages named by the import paths.
-
-For more about vet, see 'go doc cmd/vet'.
-For more about specifying packages, see 'go help packages'.
-
-To run the vet tool with specific options, run 'go tool vet'.
-
-The -n flag prints commands that would be executed.
-The -x flag prints commands as they are executed.
-
-For more about build flags, see 'go help build'.
-
-See also: go fmt, go fix.
-	`,
-}
-
-func runVet(cmd *Command, args []string) {
-	for _, p := range packages(args) {
-		// Vet expects to be given a set of files all from the same package.
-		// Run once for package p and once for package p_test.
-		if len(p.GoFiles)+len(p.CgoFiles)+len(p.TestGoFiles) > 0 {
-			runVetFiles(p, stringList(p.GoFiles, p.CgoFiles, p.TestGoFiles, p.SFiles))
-		}
-		if len(p.XTestGoFiles) > 0 {
-			runVetFiles(p, stringList(p.XTestGoFiles))
-		}
-	}
-}
-
-func runVetFiles(p *Package, files []string) {
-	for i := range files {
-		files[i] = filepath.Join(p.Dir, files[i])
-	}
-	run(buildToolExec, tool("vet"), relPaths(files))
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/doc.go b/third_party/gofrontend/libgo/go/cmd/gofmt/doc.go
deleted file mode 100644
index 9d0cd32..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/doc.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Gofmt formats Go programs.
-It uses tabs (width = 8) for indentation and blanks for alignment.
-
-Without an explicit path, it processes the standard input.  Given a file,
-it operates on that file; given a directory, it operates on all .go files in
-that directory, recursively.  (Files starting with a period are ignored.)
-By default, gofmt prints the reformatted sources to standard output.
-
-Usage:
-	gofmt [flags] [path ...]
-
-The flags are:
-	-d
-		Do not print reformatted sources to standard output.
-		If a file's formatting is different than gofmt's, print diffs
-		to standard output.
-	-e
-		Print all (including spurious) errors.
-	-l
-		Do not print reformatted sources to standard output.
-		If a file's formatting is different from gofmt's, print its name
-		to standard output.
-	-r rule
-		Apply the rewrite rule to the source before reformatting.
-	-s
-		Try to simplify code (after applying the rewrite rule, if any).
-	-w
-		Do not print reformatted sources to standard output.
-		If a file's formatting is different from gofmt's, overwrite it
-		with gofmt's version.
-
-Debugging support:
-	-cpuprofile filename
-		Write cpu profile to the specified file.
-
-
-The rewrite rule specified with the -r flag must be a string of the form:
-
-	pattern -> replacement
-
-Both pattern and replacement must be valid Go expressions.
-In the pattern, single-character lowercase identifiers serve as
-wildcards matching arbitrary sub-expressions; those expressions
-will be substituted for the same identifiers in the replacement.
-
-When gofmt reads from standard input, it accepts either a full Go program
-or a program fragment.  A program fragment must be a syntactically
-valid declaration list, statement list, or expression.  When formatting
-such a fragment, gofmt preserves leading indentation as well as leading
-and trailing spaces, so that individual sections of a Go program can be
-formatted by piping them through gofmt.
-
-Examples
-
-To check files for unnecessary parentheses:
-
-	gofmt -r '(a) -> a' -l *.go
-
-To remove the parentheses:
-
-	gofmt -r '(a) -> a' -w *.go
-
-To convert the package tree from explicit slice upper bounds to implicit ones:
-
-	gofmt -r 'α[β:len(α)] -> α[β:]' -w $GOROOT/src
-
-The simplify command
-
-When invoked with -s gofmt will make the following source transformations where possible.
-
-	An array, slice, or map composite literal of the form:
-		[]T{T{}, T{}}
-	will be simplified to:
-		[]T{{}, {}}
-
-	A slice expression of the form:
-		s[a:len(s)]
-	will be simplified to:
-		s[a:]
-
-	A range of the form:
-		for x, _ = range v {...}
-	will be simplified to:
-		for x = range v {...}
-
-	A range of the form:
-		for _ = range v {...}
-	will be simplified to:
-		for range v {...}
-
-This may result in changes that are incompatible with earlier versions of Go.
-*/
-package main
-
-// BUG(rsc): The implementation of -r is a bit slow.
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/gofmt.go b/third_party/gofrontend/libgo/go/cmd/gofmt/gofmt.go
deleted file mode 100644
index b2805ac..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/gofmt.go
+++ /dev/null
@@ -1,237 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/printer"
-	"go/scanner"
-	"go/token"
-	"internal/format"
-	"io"
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime/pprof"
-	"strings"
-)
-
-var (
-	// main operation modes
-	list        = flag.Bool("l", false, "list files whose formatting differs from gofmt's")
-	write       = flag.Bool("w", false, "write result to (source) file instead of stdout")
-	rewriteRule = flag.String("r", "", "rewrite rule (e.g., 'a[b:len(a)] -> a[b:]')")
-	simplifyAST = flag.Bool("s", false, "simplify code")
-	doDiff      = flag.Bool("d", false, "display diffs instead of rewriting files")
-	allErrors   = flag.Bool("e", false, "report all errors (not just the first 10 on different lines)")
-
-	// debugging
-	cpuprofile = flag.String("cpuprofile", "", "write cpu profile to this file")
-)
-
-const (
-	tabWidth    = 8
-	printerMode = printer.UseSpaces | printer.TabIndent
-)
-
-var (
-	fileSet    = token.NewFileSet() // per process FileSet
-	exitCode   = 0
-	rewrite    func(*ast.File) *ast.File
-	parserMode parser.Mode
-)
-
-func report(err error) {
-	scanner.PrintError(os.Stderr, err)
-	exitCode = 2
-}
-
-func usage() {
-	fmt.Fprintf(os.Stderr, "usage: gofmt [flags] [path ...]\n")
-	flag.PrintDefaults()
-	os.Exit(2)
-}
-
-func initParserMode() {
-	parserMode = parser.ParseComments
-	if *allErrors {
-		parserMode |= parser.AllErrors
-	}
-}
-
-func isGoFile(f os.FileInfo) bool {
-	// ignore non-Go files
-	name := f.Name()
-	return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
-}
-
-// If in == nil, the source is the contents of the file with the given filename.
-func processFile(filename string, in io.Reader, out io.Writer, stdin bool) error {
-	if in == nil {
-		f, err := os.Open(filename)
-		if err != nil {
-			return err
-		}
-		defer f.Close()
-		in = f
-	}
-
-	src, err := ioutil.ReadAll(in)
-	if err != nil {
-		return err
-	}
-
-	file, sourceAdj, indentAdj, err := format.Parse(fileSet, filename, src, stdin)
-	if err != nil {
-		return err
-	}
-
-	if rewrite != nil {
-		if sourceAdj == nil {
-			file = rewrite(file)
-		} else {
-			fmt.Fprintf(os.Stderr, "warning: rewrite ignored for incomplete programs\n")
-		}
-	}
-
-	ast.SortImports(fileSet, file)
-
-	if *simplifyAST {
-		simplify(file)
-	}
-
-	res, err := format.Format(fileSet, file, sourceAdj, indentAdj, src, printer.Config{Mode: printerMode, Tabwidth: tabWidth})
-	if err != nil {
-		return err
-	}
-
-	if !bytes.Equal(src, res) {
-		// formatting has changed
-		if *list {
-			fmt.Fprintln(out, filename)
-		}
-		if *write {
-			err = ioutil.WriteFile(filename, res, 0644)
-			if err != nil {
-				return err
-			}
-		}
-		if *doDiff {
-			data, err := diff(src, res)
-			if err != nil {
-				return fmt.Errorf("computing diff: %s", err)
-			}
-			fmt.Printf("diff %s gofmt/%s\n", filename, filename)
-			out.Write(data)
-		}
-	}
-
-	if !*list && !*write && !*doDiff {
-		_, err = out.Write(res)
-	}
-
-	return err
-}
-
-func visitFile(path string, f os.FileInfo, err error) error {
-	if err == nil && isGoFile(f) {
-		err = processFile(path, nil, os.Stdout, false)
-	}
-	if err != nil {
-		report(err)
-	}
-	return nil
-}
-
-func walkDir(path string) {
-	filepath.Walk(path, visitFile)
-}
-
-func main() {
-	// call gofmtMain in a separate function
-	// so that it can use defer and have them
-	// run before the exit.
-	gofmtMain()
-	os.Exit(exitCode)
-}
-
-func gofmtMain() {
-	flag.Usage = usage
-	flag.Parse()
-
-	if *cpuprofile != "" {
-		f, err := os.Create(*cpuprofile)
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "creating cpu profile: %s\n", err)
-			exitCode = 2
-			return
-		}
-		defer f.Close()
-		pprof.StartCPUProfile(f)
-		defer pprof.StopCPUProfile()
-	}
-
-	initParserMode()
-	initRewrite()
-
-	if flag.NArg() == 0 {
-		if *write {
-			fmt.Fprintln(os.Stderr, "error: cannot use -w with standard input")
-			exitCode = 2
-			return
-		}
-		if err := processFile("<standard input>", os.Stdin, os.Stdout, true); err != nil {
-			report(err)
-		}
-		return
-	}
-
-	for i := 0; i < flag.NArg(); i++ {
-		path := flag.Arg(i)
-		switch dir, err := os.Stat(path); {
-		case err != nil:
-			report(err)
-		case dir.IsDir():
-			walkDir(path)
-		default:
-			if err := processFile(path, nil, os.Stdout, false); err != nil {
-				report(err)
-			}
-		}
-	}
-}
-
-func diff(b1, b2 []byte) (data []byte, err error) {
-	f1, err := ioutil.TempFile("", "gofmt")
-	if err != nil {
-		return
-	}
-	defer os.Remove(f1.Name())
-	defer f1.Close()
-
-	f2, err := ioutil.TempFile("", "gofmt")
-	if err != nil {
-		return
-	}
-	defer os.Remove(f2.Name())
-	defer f2.Close()
-
-	f1.Write(b1)
-	f2.Write(b2)
-
-	data, err = exec.Command("diff", "-u", f1.Name(), f2.Name()).CombinedOutput()
-	if len(data) > 0 {
-		// diff exits with a non-zero status when the files don't match.
-		// Ignore that failure as long as we get output.
-		err = nil
-	}
-	return
-
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/gofmt_test.go b/third_party/gofrontend/libgo/go/cmd/gofmt/gofmt_test.go
deleted file mode 100644
index d1edb7b..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/gofmt_test.go
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bytes"
-	"flag"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"strings"
-	"testing"
-	"text/scanner"
-)
-
-var update = flag.Bool("update", false, "update .golden files")
-
-// gofmtFlags looks for a comment of the form
-//
-//	//gofmt flags
-//
-// within the first maxLines lines of the given file,
-// and returns the flags string, if any. Otherwise it
-// returns the empty string.
-func gofmtFlags(filename string, maxLines int) string {
-	f, err := os.Open(filename)
-	if err != nil {
-		return "" // ignore errors - they will be found later
-	}
-	defer f.Close()
-
-	// initialize scanner
-	var s scanner.Scanner
-	s.Init(f)
-	s.Error = func(*scanner.Scanner, string) {}       // ignore errors
-	s.Mode = scanner.GoTokens &^ scanner.SkipComments // want comments
-
-	// look for //gofmt comment
-	for s.Line <= maxLines {
-		switch s.Scan() {
-		case scanner.Comment:
-			const prefix = "//gofmt "
-			if t := s.TokenText(); strings.HasPrefix(t, prefix) {
-				return strings.TrimSpace(t[len(prefix):])
-			}
-		case scanner.EOF:
-			return ""
-		}
-
-	}
-
-	return ""
-}
-
-func runTest(t *testing.T, in, out string) {
-	// process flags
-	*simplifyAST = false
-	*rewriteRule = ""
-	stdin := false
-	for _, flag := range strings.Split(gofmtFlags(in, 20), " ") {
-		elts := strings.SplitN(flag, "=", 2)
-		name := elts[0]
-		value := ""
-		if len(elts) == 2 {
-			value = elts[1]
-		}
-		switch name {
-		case "":
-			// no flags
-		case "-r":
-			*rewriteRule = value
-		case "-s":
-			*simplifyAST = true
-		case "-stdin":
-			// fake flag - pretend input is from stdin
-			stdin = true
-		default:
-			t.Errorf("unrecognized flag name: %s", name)
-		}
-	}
-
-	initParserMode()
-	initRewrite()
-
-	var buf bytes.Buffer
-	err := processFile(in, nil, &buf, stdin)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	expected, err := ioutil.ReadFile(out)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	if got := buf.Bytes(); !bytes.Equal(got, expected) {
-		if *update {
-			if in != out {
-				if err := ioutil.WriteFile(out, got, 0666); err != nil {
-					t.Error(err)
-				}
-				return
-			}
-			// in == out: don't accidentally destroy input
-			t.Errorf("WARNING: -update did not rewrite input file %s", in)
-		}
-
-		t.Errorf("(gofmt %s) != %s (see %s.gofmt)", in, out, in)
-		d, err := diff(expected, got)
-		if err == nil {
-			t.Errorf("%s", d)
-		}
-		if err := ioutil.WriteFile(in+".gofmt", got, 0666); err != nil {
-			t.Error(err)
-		}
-	}
-}
-
-// TestRewrite processes testdata/*.input files and compares them to the
-// corresponding testdata/*.golden files. The gofmt flags used to process
-// a file must be provided via a comment of the form
-//
-//	//gofmt flags
-//
-// in the processed file within the first 20 lines, if any.
-func TestRewrite(t *testing.T) {
-	// determine input files
-	match, err := filepath.Glob("testdata/*.input")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// add larger examples
-	match = append(match, "gofmt.go", "gofmt_test.go")
-
-	for _, in := range match {
-		out := in // for files where input and output are identical
-		if strings.HasSuffix(in, ".input") {
-			out = in[:len(in)-len(".input")] + ".golden"
-		}
-		runTest(t, in, out)
-		if in != out {
-			// Check idempotence.
-			runTest(t, out, out)
-		}
-	}
-}
-
-// Test case for issue 3961.
-func TestCRLF(t *testing.T) {
-	const input = "testdata/crlf.input"   // must contain CR/LF's
-	const golden = "testdata/crlf.golden" // must not contain any CR's
-
-	data, err := ioutil.ReadFile(input)
-	if err != nil {
-		t.Error(err)
-	}
-	if bytes.Index(data, []byte("\r\n")) < 0 {
-		t.Errorf("%s contains no CR/LF's", input)
-	}
-
-	data, err = ioutil.ReadFile(golden)
-	if err != nil {
-		t.Error(err)
-	}
-	if bytes.Index(data, []byte("\r")) >= 0 {
-		t.Errorf("%s contains CR's", golden)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/long_test.go b/third_party/gofrontend/libgo/go/cmd/gofmt/long_test.go
deleted file mode 100644
index df9a878..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/long_test.go
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This test applies gofmt to all Go files under -root.
-// To test specific files provide a list of comma-separated
-// filenames via the -files flag: go test -files=gofmt.go .
-
-package main
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"go/ast"
-	"go/printer"
-	"go/token"
-	"internal/format"
-	"io"
-	"os"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-var (
-	root    = flag.String("root", runtime.GOROOT(), "test root directory")
-	files   = flag.String("files", "", "comma-separated list of files to test")
-	ngo     = flag.Int("n", runtime.NumCPU(), "number of goroutines used")
-	verbose = flag.Bool("verbose", false, "verbose mode")
-	nfiles  int // number of files processed
-)
-
-func gofmt(fset *token.FileSet, filename string, src *bytes.Buffer) error {
-	f, _, _, err := format.Parse(fset, filename, src.Bytes(), false)
-	if err != nil {
-		return err
-	}
-	ast.SortImports(fset, f)
-	src.Reset()
-	return (&printer.Config{Mode: printerMode, Tabwidth: tabWidth}).Fprint(src, fset, f)
-}
-
-func testFile(t *testing.T, b1, b2 *bytes.Buffer, filename string) {
-	// open file
-	f, err := os.Open(filename)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	// read file
-	b1.Reset()
-	_, err = io.Copy(b1, f)
-	f.Close()
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	// exclude files w/ syntax errors (typically test cases)
-	fset := token.NewFileSet()
-	if _, _, _, err = format.Parse(fset, filename, b1.Bytes(), false); err != nil {
-		if *verbose {
-			fmt.Fprintf(os.Stderr, "ignoring %s\n", err)
-		}
-		return
-	}
-
-	// gofmt file
-	if err = gofmt(fset, filename, b1); err != nil {
-		t.Errorf("1st gofmt failed: %v", err)
-		return
-	}
-
-	// make a copy of the result
-	b2.Reset()
-	b2.Write(b1.Bytes())
-
-	// gofmt result again
-	if err = gofmt(fset, filename, b2); err != nil {
-		t.Errorf("2nd gofmt failed: %v", err)
-		return
-	}
-
-	// the first and 2nd result should be identical
-	if !bytes.Equal(b1.Bytes(), b2.Bytes()) {
-		t.Errorf("gofmt %s not idempotent", filename)
-	}
-}
-
-func testFiles(t *testing.T, filenames <-chan string, done chan<- int) {
-	b1 := new(bytes.Buffer)
-	b2 := new(bytes.Buffer)
-	for filename := range filenames {
-		testFile(t, b1, b2, filename)
-	}
-	done <- 0
-}
-
-func genFilenames(t *testing.T, filenames chan<- string) {
-	defer close(filenames)
-
-	handleFile := func(filename string, fi os.FileInfo, err error) error {
-		if err != nil {
-			t.Error(err)
-			return nil
-		}
-		if isGoFile(fi) {
-			filenames <- filename
-			nfiles++
-		}
-		return nil
-	}
-
-	// test Go files provided via -files, if any
-	if *files != "" {
-		for _, filename := range strings.Split(*files, ",") {
-			fi, err := os.Stat(filename)
-			handleFile(filename, fi, err)
-		}
-		return // ignore files under -root
-	}
-
-	// otherwise, test all Go files under *root
-	filepath.Walk(*root, handleFile)
-}
-
-func TestAll(t *testing.T) {
-	if testing.Short() {
-		return
-	}
-
-	if *ngo < 1 {
-		*ngo = 1 // make sure test is run
-	}
-	if *verbose {
-		fmt.Printf("running test using %d goroutines\n", *ngo)
-	}
-
-	// generate filenames
-	filenames := make(chan string, 32)
-	go genFilenames(t, filenames)
-
-	// launch test goroutines
-	done := make(chan int)
-	for i := 0; i < *ngo; i++ {
-		go testFiles(t, filenames, done)
-	}
-
-	// wait for all test goroutines to complete
-	for i := 0; i < *ngo; i++ {
-		<-done
-	}
-
-	if *verbose {
-		fmt.Printf("processed %d files\n", nfiles)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/rewrite.go b/third_party/gofrontend/libgo/go/cmd/gofmt/rewrite.go
deleted file mode 100644
index 069f966..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/rewrite.go
+++ /dev/null
@@ -1,303 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"os"
-	"reflect"
-	"strings"
-	"unicode"
-	"unicode/utf8"
-)
-
-func initRewrite() {
-	if *rewriteRule == "" {
-		rewrite = nil // disable any previous rewrite
-		return
-	}
-	f := strings.Split(*rewriteRule, "->")
-	if len(f) != 2 {
-		fmt.Fprintf(os.Stderr, "rewrite rule must be of the form 'pattern -> replacement'\n")
-		os.Exit(2)
-	}
-	pattern := parseExpr(f[0], "pattern")
-	replace := parseExpr(f[1], "replacement")
-	rewrite = func(p *ast.File) *ast.File { return rewriteFile(pattern, replace, p) }
-}
-
-// parseExpr parses s as an expression.
-// It might make sense to expand this to allow statement patterns,
-// but there are problems with preserving formatting and also
-// with what a wildcard for a statement looks like.
-func parseExpr(s, what string) ast.Expr {
-	x, err := parser.ParseExpr(s)
-	if err != nil {
-		fmt.Fprintf(os.Stderr, "parsing %s %s at %s\n", what, s, err)
-		os.Exit(2)
-	}
-	return x
-}
-
-// Keep this function for debugging.
-/*
-func dump(msg string, val reflect.Value) {
-	fmt.Printf("%s:\n", msg)
-	ast.Print(fileSet, val.Interface())
-	fmt.Println()
-}
-*/
-
-// rewriteFile applies the rewrite rule 'pattern -> replace' to an entire file.
-func rewriteFile(pattern, replace ast.Expr, p *ast.File) *ast.File {
-	cmap := ast.NewCommentMap(fileSet, p, p.Comments)
-	m := make(map[string]reflect.Value)
-	pat := reflect.ValueOf(pattern)
-	repl := reflect.ValueOf(replace)
-
-	var rewriteVal func(val reflect.Value) reflect.Value
-	rewriteVal = func(val reflect.Value) reflect.Value {
-		// don't bother if val is invalid to start with
-		if !val.IsValid() {
-			return reflect.Value{}
-		}
-		for k := range m {
-			delete(m, k)
-		}
-		val = apply(rewriteVal, val)
-		if match(m, pat, val) {
-			val = subst(m, repl, reflect.ValueOf(val.Interface().(ast.Node).Pos()))
-		}
-		return val
-	}
-
-	r := apply(rewriteVal, reflect.ValueOf(p)).Interface().(*ast.File)
-	r.Comments = cmap.Filter(r).Comments() // recreate comments list
-	return r
-}
-
-// set is a wrapper for x.Set(y); it protects the caller from panics if x cannot be changed to y.
-func set(x, y reflect.Value) {
-	// don't bother if x cannot be set or y is invalid
-	if !x.CanSet() || !y.IsValid() {
-		return
-	}
-	defer func() {
-		if x := recover(); x != nil {
-			if s, ok := x.(string); ok &&
-				(strings.Contains(s, "type mismatch") || strings.Contains(s, "not assignable")) {
-				// x cannot be set to y - ignore this rewrite
-				return
-			}
-			panic(x)
-		}
-	}()
-	x.Set(y)
-}
-
-// Values/types for special cases.
-var (
-	objectPtrNil = reflect.ValueOf((*ast.Object)(nil))
-	scopePtrNil  = reflect.ValueOf((*ast.Scope)(nil))
-
-	identType     = reflect.TypeOf((*ast.Ident)(nil))
-	objectPtrType = reflect.TypeOf((*ast.Object)(nil))
-	positionType  = reflect.TypeOf(token.NoPos)
-	callExprType  = reflect.TypeOf((*ast.CallExpr)(nil))
-	scopePtrType  = reflect.TypeOf((*ast.Scope)(nil))
-)
-
-// apply replaces each AST field x in val with f(x), returning val.
-// To avoid extra conversions, f operates on the reflect.Value form.
-func apply(f func(reflect.Value) reflect.Value, val reflect.Value) reflect.Value {
-	if !val.IsValid() {
-		return reflect.Value{}
-	}
-
-	// *ast.Objects introduce cycles and are likely incorrect after
-	// rewrite; don't follow them but replace with nil instead
-	if val.Type() == objectPtrType {
-		return objectPtrNil
-	}
-
-	// similarly for scopes: they are likely incorrect after a rewrite;
-	// replace them with nil
-	if val.Type() == scopePtrType {
-		return scopePtrNil
-	}
-
-	switch v := reflect.Indirect(val); v.Kind() {
-	case reflect.Slice:
-		for i := 0; i < v.Len(); i++ {
-			e := v.Index(i)
-			set(e, f(e))
-		}
-	case reflect.Struct:
-		for i := 0; i < v.NumField(); i++ {
-			e := v.Field(i)
-			set(e, f(e))
-		}
-	case reflect.Interface:
-		e := v.Elem()
-		set(v, f(e))
-	}
-	return val
-}
-
-func isWildcard(s string) bool {
-	rune, size := utf8.DecodeRuneInString(s)
-	return size == len(s) && unicode.IsLower(rune)
-}
-
-// match reports whether pattern matches val,
-// recording wildcard submatches in m.
-// If m == nil, match checks whether pattern == val.
-func match(m map[string]reflect.Value, pattern, val reflect.Value) bool {
-	// Wildcard matches any expression.  If it appears multiple
-	// times in the pattern, it must match the same expression
-	// each time.
-	if m != nil && pattern.IsValid() && pattern.Type() == identType {
-		name := pattern.Interface().(*ast.Ident).Name
-		if isWildcard(name) && val.IsValid() {
-			// wildcards only match valid (non-nil) expressions.
-			if _, ok := val.Interface().(ast.Expr); ok && !val.IsNil() {
-				if old, ok := m[name]; ok {
-					return match(nil, old, val)
-				}
-				m[name] = val
-				return true
-			}
-		}
-	}
-
-	// Otherwise, pattern and val must match recursively.
-	if !pattern.IsValid() || !val.IsValid() {
-		return !pattern.IsValid() && !val.IsValid()
-	}
-	if pattern.Type() != val.Type() {
-		return false
-	}
-
-	// Special cases.
-	switch pattern.Type() {
-	case identType:
-		// For identifiers, only the names need to match
-		// (and none of the other *ast.Object information).
-		// This is a common case, handle it all here instead
-		// of recursing down any further via reflection.
-		p := pattern.Interface().(*ast.Ident)
-		v := val.Interface().(*ast.Ident)
-		return p == nil && v == nil || p != nil && v != nil && p.Name == v.Name
-	case objectPtrType, positionType:
-		// object pointers and token positions always match
-		return true
-	case callExprType:
-		// For calls, the Ellipsis fields (token.Position) must
-		// match since that is how f(x) and f(x...) are different.
-		// Check them here but fall through for the remaining fields.
-		p := pattern.Interface().(*ast.CallExpr)
-		v := val.Interface().(*ast.CallExpr)
-		if p.Ellipsis.IsValid() != v.Ellipsis.IsValid() {
-			return false
-		}
-	}
-
-	p := reflect.Indirect(pattern)
-	v := reflect.Indirect(val)
-	if !p.IsValid() || !v.IsValid() {
-		return !p.IsValid() && !v.IsValid()
-	}
-
-	switch p.Kind() {
-	case reflect.Slice:
-		if p.Len() != v.Len() {
-			return false
-		}
-		for i := 0; i < p.Len(); i++ {
-			if !match(m, p.Index(i), v.Index(i)) {
-				return false
-			}
-		}
-		return true
-
-	case reflect.Struct:
-		for i := 0; i < p.NumField(); i++ {
-			if !match(m, p.Field(i), v.Field(i)) {
-				return false
-			}
-		}
-		return true
-
-	case reflect.Interface:
-		return match(m, p.Elem(), v.Elem())
-	}
-
-	// Handle token integers, etc.
-	return p.Interface() == v.Interface()
-}
-
-// subst returns a copy of pattern with values from m substituted in place
-// of wildcards and pos used as the position of tokens from the pattern.
-// if m == nil, subst returns a copy of pattern and doesn't change the line
-// number information.
-func subst(m map[string]reflect.Value, pattern reflect.Value, pos reflect.Value) reflect.Value {
-	if !pattern.IsValid() {
-		return reflect.Value{}
-	}
-
-	// Wildcard gets replaced with map value.
-	if m != nil && pattern.Type() == identType {
-		name := pattern.Interface().(*ast.Ident).Name
-		if isWildcard(name) {
-			if old, ok := m[name]; ok {
-				return subst(nil, old, reflect.Value{})
-			}
-		}
-	}
-
-	if pos.IsValid() && pattern.Type() == positionType {
-		// use new position only if old position was valid in the first place
-		if old := pattern.Interface().(token.Pos); !old.IsValid() {
-			return pattern
-		}
-		return pos
-	}
-
-	// Otherwise copy.
-	switch p := pattern; p.Kind() {
-	case reflect.Slice:
-		v := reflect.MakeSlice(p.Type(), p.Len(), p.Len())
-		for i := 0; i < p.Len(); i++ {
-			v.Index(i).Set(subst(m, p.Index(i), pos))
-		}
-		return v
-
-	case reflect.Struct:
-		v := reflect.New(p.Type()).Elem()
-		for i := 0; i < p.NumField(); i++ {
-			v.Field(i).Set(subst(m, p.Field(i), pos))
-		}
-		return v
-
-	case reflect.Ptr:
-		v := reflect.New(p.Type()).Elem()
-		if elem := p.Elem(); elem.IsValid() {
-			v.Set(subst(m, elem, pos).Addr())
-		}
-		return v
-
-	case reflect.Interface:
-		v := reflect.New(p.Type()).Elem()
-		if elem := p.Elem(); elem.IsValid() {
-			v.Set(subst(m, elem, pos))
-		}
-		return v
-	}
-
-	return pattern
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/simplify.go b/third_party/gofrontend/libgo/go/cmd/gofmt/simplify.go
deleted file mode 100644
index 69f7bf2..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/simplify.go
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"go/ast"
-	"go/token"
-	"reflect"
-)
-
-type simplifier struct {
-	hasDotImport bool // package file contains: import . "some/import/path"
-}
-
-func (s *simplifier) Visit(node ast.Node) ast.Visitor {
-	switch n := node.(type) {
-	case *ast.CompositeLit:
-		// array, slice, and map composite literals may be simplified
-		outer := n
-		var eltType ast.Expr
-		switch typ := outer.Type.(type) {
-		case *ast.ArrayType:
-			eltType = typ.Elt
-		case *ast.MapType:
-			eltType = typ.Value
-		}
-
-		if eltType != nil {
-			typ := reflect.ValueOf(eltType)
-			for i, x := range outer.Elts {
-				px := &outer.Elts[i]
-				// look at value of indexed/named elements
-				if t, ok := x.(*ast.KeyValueExpr); ok {
-					x = t.Value
-					px = &t.Value
-				}
-				ast.Walk(s, x) // simplify x
-				// if the element is a composite literal and its literal type
-				// matches the outer literal's element type exactly, the inner
-				// literal type may be omitted
-				if inner, ok := x.(*ast.CompositeLit); ok {
-					if match(nil, typ, reflect.ValueOf(inner.Type)) {
-						inner.Type = nil
-					}
-				}
-				// if the outer literal's element type is a pointer type *T
-				// and the element is & of a composite literal of type T,
-				// the inner &T may be omitted.
-				if ptr, ok := eltType.(*ast.StarExpr); ok {
-					if addr, ok := x.(*ast.UnaryExpr); ok && addr.Op == token.AND {
-						if inner, ok := addr.X.(*ast.CompositeLit); ok {
-							if match(nil, reflect.ValueOf(ptr.X), reflect.ValueOf(inner.Type)) {
-								inner.Type = nil // drop T
-								*px = inner      // drop &
-							}
-						}
-					}
-				}
-			}
-
-			// node was simplified - stop walk (there are no subnodes to simplify)
-			return nil
-		}
-
-	case *ast.SliceExpr:
-		// a slice expression of the form: s[a:len(s)]
-		// can be simplified to: s[a:]
-		// if s is "simple enough" (for now we only accept identifiers)
-		if n.Max != nil || s.hasDotImport {
-			// - 3-index slices always require the 2nd and 3rd index
-			// - if dot imports are present, we cannot be certain that an
-			//   unresolved "len" identifier refers to the predefined len()
-			break
-		}
-		if s, _ := n.X.(*ast.Ident); s != nil && s.Obj != nil {
-			// the array/slice object is a single, resolved identifier
-			if call, _ := n.High.(*ast.CallExpr); call != nil && len(call.Args) == 1 && !call.Ellipsis.IsValid() {
-				// the high expression is a function call with a single argument
-				if fun, _ := call.Fun.(*ast.Ident); fun != nil && fun.Name == "len" && fun.Obj == nil {
-					// the function called is "len" and it is not locally defined; and
-					// because we don't have dot imports, it must be the predefined len()
-					if arg, _ := call.Args[0].(*ast.Ident); arg != nil && arg.Obj == s.Obj {
-						// the len argument is the array/slice object
-						n.High = nil
-					}
-				}
-			}
-		}
-		// Note: We could also simplify slice expressions of the form s[0:b] to s[:b]
-		//       but we leave them as is since sometimes we want to be very explicit
-		//       about the lower bound.
-		// An example where the 0 helps:
-		//       x, y, z := b[0:2], b[2:4], b[4:6]
-		// An example where it does not:
-		//       x, y := b[:n], b[n:]
-
-	case *ast.RangeStmt:
-		// - a range of the form: for x, _ = range v {...}
-		// can be simplified to: for x = range v {...}
-		// - a range of the form: for _ = range v {...}
-		// can be simplified to: for range v {...}
-		if isBlank(n.Value) {
-			n.Value = nil
-		}
-		if isBlank(n.Key) && n.Value == nil {
-			n.Key = nil
-		}
-	}
-
-	return s
-}
-
-func isBlank(x ast.Expr) bool {
-	ident, ok := x.(*ast.Ident)
-	return ok && ident.Name == "_"
-}
-
-func simplify(f *ast.File) {
-	var s simplifier
-
-	// determine if f contains dot imports
-	for _, imp := range f.Imports {
-		if imp.Name != nil && imp.Name.Name == "." {
-			s.hasDotImport = true
-			break
-		}
-	}
-
-	// remove empty declarations such as "const ()", etc
-	removeEmptyDeclGroups(f)
-
-	ast.Walk(&s, f)
-}
-
-func removeEmptyDeclGroups(f *ast.File) {
-	i := 0
-	for _, d := range f.Decls {
-		if g, ok := d.(*ast.GenDecl); !ok || !isEmpty(f, g) {
-			f.Decls[i] = d
-			i++
-		}
-	}
-	f.Decls = f.Decls[:i]
-}
-
-func isEmpty(f *ast.File, g *ast.GenDecl) bool {
-	if g.Doc != nil || g.Specs != nil {
-		return false
-	}
-
-	for _, c := range f.Comments {
-		// if there is a comment in the declaration, it is not considered empty
-		if g.Pos() <= c.Pos() && c.End() <= g.End() {
-			return false
-		}
-	}
-
-	return true
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/comments.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/comments.golden
deleted file mode 100644
index ad6bcaf..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/comments.golden
+++ /dev/null
@@ -1,9 +0,0 @@
-package main
-
-func main() {}
-
-// comment here
-
-func f() {}
-
-//line foo.go:1
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/comments.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/comments.input
deleted file mode 100644
index ad6bcaf..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/comments.input
+++ /dev/null
@@ -1,9 +0,0 @@
-package main
-
-func main() {}
-
-// comment here
-
-func f() {}
-
-//line foo.go:1
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/composites.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/composites.golden
deleted file mode 100644
index fc9c98e..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/composites.golden
+++ /dev/null
@@ -1,204 +0,0 @@
-//gofmt -s
-
-package P
-
-type T struct {
-	x, y int
-}
-
-var _ = [42]T{
-	{},
-	{1, 2},
-	{3, 4},
-}
-
-var _ = [...]T{
-	{},
-	{1, 2},
-	{3, 4},
-}
-
-var _ = []T{
-	{},
-	{1, 2},
-	{3, 4},
-}
-
-var _ = []T{
-	{},
-	10: {1, 2},
-	20: {3, 4},
-}
-
-var _ = []struct {
-	x, y int
-}{
-	{},
-	10: {1, 2},
-	20: {3, 4},
-}
-
-var _ = []interface{}{
-	T{},
-	10: T{1, 2},
-	20: T{3, 4},
-}
-
-var _ = [][]int{
-	{},
-	{1, 2},
-	{3, 4},
-}
-
-var _ = [][]int{
-	([]int{}),
-	([]int{1, 2}),
-	{3, 4},
-}
-
-var _ = [][][]int{
-	{},
-	{
-		{},
-		{0, 1, 2, 3},
-		{4, 5},
-	},
-}
-
-var _ = map[string]T{
-	"foo": {},
-	"bar": {1, 2},
-	"bal": {3, 4},
-}
-
-var _ = map[string]struct {
-	x, y int
-}{
-	"foo": {},
-	"bar": {1, 2},
-	"bal": {3, 4},
-}
-
-var _ = map[string]interface{}{
-	"foo": T{},
-	"bar": T{1, 2},
-	"bal": T{3, 4},
-}
-
-var _ = map[string][]int{
-	"foo": {},
-	"bar": {1, 2},
-	"bal": {3, 4},
-}
-
-var _ = map[string][]int{
-	"foo": ([]int{}),
-	"bar": ([]int{1, 2}),
-	"bal": {3, 4},
-}
-
-// from exp/4s/data.go
-var pieces4 = []Piece{
-	{0, 0, Point{4, 1}, []Point{{0, 0}, {1, 0}, {1, 0}, {1, 0}}, nil, nil},
-	{1, 0, Point{1, 4}, []Point{{0, 0}, {0, 1}, {0, 1}, {0, 1}}, nil, nil},
-	{2, 0, Point{4, 1}, []Point{{0, 0}, {1, 0}, {1, 0}, {1, 0}}, nil, nil},
-	{3, 0, Point{1, 4}, []Point{{0, 0}, {0, 1}, {0, 1}, {0, 1}}, nil, nil},
-}
-
-var _ = [42]*T{
-	{},
-	{1, 2},
-	{3, 4},
-}
-
-var _ = [...]*T{
-	{},
-	{1, 2},
-	{3, 4},
-}
-
-var _ = []*T{
-	{},
-	{1, 2},
-	{3, 4},
-}
-
-var _ = []*T{
-	{},
-	10: {1, 2},
-	20: {3, 4},
-}
-
-var _ = []*struct {
-	x, y int
-}{
-	{},
-	10: {1, 2},
-	20: {3, 4},
-}
-
-var _ = []interface{}{
-	&T{},
-	10: &T{1, 2},
-	20: &T{3, 4},
-}
-
-var _ = []*[]int{
-	{},
-	{1, 2},
-	{3, 4},
-}
-
-var _ = []*[]int{
-	(&[]int{}),
-	(&[]int{1, 2}),
-	{3, 4},
-}
-
-var _ = []*[]*[]int{
-	{},
-	{
-		{},
-		{0, 1, 2, 3},
-		{4, 5},
-	},
-}
-
-var _ = map[string]*T{
-	"foo": {},
-	"bar": {1, 2},
-	"bal": {3, 4},
-}
-
-var _ = map[string]*struct {
-	x, y int
-}{
-	"foo": {},
-	"bar": {1, 2},
-	"bal": {3, 4},
-}
-
-var _ = map[string]interface{}{
-	"foo": &T{},
-	"bar": &T{1, 2},
-	"bal": &T{3, 4},
-}
-
-var _ = map[string]*[]int{
-	"foo": {},
-	"bar": {1, 2},
-	"bal": {3, 4},
-}
-
-var _ = map[string]*[]int{
-	"foo": (&[]int{}),
-	"bar": (&[]int{1, 2}),
-	"bal": {3, 4},
-}
-
-var pieces4 = []*Piece{
-	{0, 0, Point{4, 1}, []Point{{0, 0}, {1, 0}, {1, 0}, {1, 0}}, nil, nil},
-	{1, 0, Point{1, 4}, []Point{{0, 0}, {0, 1}, {0, 1}, {0, 1}}, nil, nil},
-	{2, 0, Point{4, 1}, []Point{{0, 0}, {1, 0}, {1, 0}, {1, 0}}, nil, nil},
-	{3, 0, Point{1, 4}, []Point{{0, 0}, {0, 1}, {0, 1}, {0, 1}}, nil, nil},
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/composites.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/composites.input
deleted file mode 100644
index fc7598a..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/composites.input
+++ /dev/null
@@ -1,204 +0,0 @@
-//gofmt -s
-
-package P
-
-type T struct {
-	x, y int
-}
-
-var _ = [42]T{
-	T{},
-	T{1, 2},
-	T{3, 4},
-}
-
-var _ = [...]T{
-	T{},
-	T{1, 2},
-	T{3, 4},
-}
-
-var _ = []T{
-	T{},
-	T{1, 2},
-	T{3, 4},
-}
-
-var _ = []T{
-	T{},
-	10: T{1, 2},
-	20: T{3, 4},
-}
-
-var _ = []struct {
-	x, y int
-}{
-	struct{ x, y int }{},
-	10: struct{ x, y int }{1, 2},
-	20: struct{ x, y int }{3, 4},
-}
-
-var _ = []interface{}{
-	T{},
-	10: T{1, 2},
-	20: T{3, 4},
-}
-
-var _ = [][]int{
-	[]int{},
-	[]int{1, 2},
-	[]int{3, 4},
-}
-
-var _ = [][]int{
-	([]int{}),
-	([]int{1, 2}),
-	[]int{3, 4},
-}
-
-var _ = [][][]int{
-	[][]int{},
-	[][]int{
-		[]int{},
-		[]int{0, 1, 2, 3},
-		[]int{4, 5},
-	},
-}
-
-var _ = map[string]T{
-	"foo": T{},
-	"bar": T{1, 2},
-	"bal": T{3, 4},
-}
-
-var _ = map[string]struct {
-	x, y int
-}{
-	"foo": struct{ x, y int }{},
-	"bar": struct{ x, y int }{1, 2},
-	"bal": struct{ x, y int }{3, 4},
-}
-
-var _ = map[string]interface{}{
-	"foo": T{},
-	"bar": T{1, 2},
-	"bal": T{3, 4},
-}
-
-var _ = map[string][]int{
-	"foo": []int{},
-	"bar": []int{1, 2},
-	"bal": []int{3, 4},
-}
-
-var _ = map[string][]int{
-	"foo": ([]int{}),
-	"bar": ([]int{1, 2}),
-	"bal": []int{3, 4},
-}
-
-// from exp/4s/data.go
-var pieces4 = []Piece{
-	Piece{0, 0, Point{4, 1}, []Point{Point{0, 0}, Point{1, 0}, Point{1, 0}, Point{1, 0}}, nil, nil},
-	Piece{1, 0, Point{1, 4}, []Point{Point{0, 0}, Point{0, 1}, Point{0, 1}, Point{0, 1}}, nil, nil},
-	Piece{2, 0, Point{4, 1}, []Point{Point{0, 0}, Point{1, 0}, Point{1, 0}, Point{1, 0}}, nil, nil},
-	Piece{3, 0, Point{1, 4}, []Point{Point{0, 0}, Point{0, 1}, Point{0, 1}, Point{0, 1}}, nil, nil},
-}
-
-var _ = [42]*T{
-	&T{},
-	&T{1, 2},
-	&T{3, 4},
-}
-
-var _ = [...]*T{
-	&T{},
-	&T{1, 2},
-	&T{3, 4},
-}
-
-var _ = []*T{
-	&T{},
-	&T{1, 2},
-	&T{3, 4},
-}
-
-var _ = []*T{
-	&T{},
-	10: &T{1, 2},
-	20: &T{3, 4},
-}
-
-var _ = []*struct {
-	x, y int
-}{
-	&struct{ x, y int }{},
-	10: &struct{ x, y int }{1, 2},
-	20: &struct{ x, y int }{3, 4},
-}
-
-var _ = []interface{}{
-	&T{},
-	10: &T{1, 2},
-	20: &T{3, 4},
-}
-
-var _ = []*[]int{
-	&[]int{},
-	&[]int{1, 2},
-	&[]int{3, 4},
-}
-
-var _ = []*[]int{
-	(&[]int{}),
-	(&[]int{1, 2}),
-	&[]int{3, 4},
-}
-
-var _ = []*[]*[]int{
-	&[]*[]int{},
-	&[]*[]int{
-		&[]int{},
-		&[]int{0, 1, 2, 3},
-		&[]int{4, 5},
-	},
-}
-
-var _ = map[string]*T{
-	"foo": &T{},
-	"bar": &T{1, 2},
-	"bal": &T{3, 4},
-}
-
-var _ = map[string]*struct {
-	x, y int
-}{
-	"foo": &struct{ x, y int }{},
-	"bar": &struct{ x, y int }{1, 2},
-	"bal": &struct{ x, y int }{3, 4},
-}
-
-var _ = map[string]interface{}{
-	"foo": &T{},
-	"bar": &T{1, 2},
-	"bal": &T{3, 4},
-}
-
-var _ = map[string]*[]int{
-	"foo": &[]int{},
-	"bar": &[]int{1, 2},
-	"bal": &[]int{3, 4},
-}
-
-var _ = map[string]*[]int{
-	"foo": (&[]int{}),
-	"bar": (&[]int{1, 2}),
-	"bal": &[]int{3, 4},
-}
-
-var pieces4 = []*Piece{
-	&Piece{0, 0, Point{4, 1}, []Point{Point{0, 0}, Point{1, 0}, Point{1, 0}, Point{1, 0}}, nil, nil},
-	&Piece{1, 0, Point{1, 4}, []Point{Point{0, 0}, Point{0, 1}, Point{0, 1}, Point{0, 1}}, nil, nil},
-	&Piece{2, 0, Point{4, 1}, []Point{Point{0, 0}, Point{1, 0}, Point{1, 0}, Point{1, 0}}, nil, nil},
-	&Piece{3, 0, Point{1, 4}, []Point{Point{0, 0}, Point{0, 1}, Point{0, 1}, Point{0, 1}}, nil, nil},
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/crlf.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/crlf.golden
deleted file mode 100644
index 193dbac..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/crlf.golden
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
-	Source containing CR/LF line endings.
-	The gofmt'ed output must only have LF
-	line endings.
-	Test case for issue 3961.
-*/
-package main
-
-func main() {
-	// line comment
-	println("hello, world!") // another line comment
-	println()
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/crlf.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/crlf.input
deleted file mode 100644
index ae7e14d..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/crlf.input
+++ /dev/null
@@ -1,13 +0,0 @@
-/*

-	Source containing CR/LF line endings.

-	The gofmt'ed output must only have LF

-	line endings.

-	Test case for issue 3961.

-*/

-package main

-

-func main() {

-	// line comment

-	println("hello, world!") // another line comment

-	println()

-}

diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/import.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/import.golden
deleted file mode 100644
index 51d7be7..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/import.golden
+++ /dev/null
@@ -1,126 +0,0 @@
-package main
-
-import (
-	"errors"
-	"fmt"
-	"io"
-	"log"
-	"math"
-)
-
-import (
-	"fmt"
-
-	"math"
-
-	"log"
-
-	"errors"
-
-	"io"
-)
-
-import (
-	"errors"
-	"fmt"
-	"io"
-	"log"
-	"math"
-
-	"fmt"
-
-	"math"
-
-	"log"
-
-	"errors"
-
-	"io"
-)
-
-import (
-	// a block with comments
-	"errors"
-	"fmt" // for Printf
-	"io"  // for Reader
-	"log" // for Fatal
-	"math"
-)
-
-import (
-	"fmt" // for Printf
-
-	"math"
-
-	"log" // for Fatal
-
-	"errors"
-
-	"io" // for Reader
-)
-
-import (
-	// for Printf
-	"fmt"
-
-	"math"
-
-	// for Fatal
-	"log"
-
-	"errors"
-
-	// for Reader
-	"io"
-)
-
-import (
-	"errors"
-	"fmt" // for Printf
-	"io"  // for Reader
-	"log" // for Fatal
-	"math"
-
-	"fmt" // for Printf
-
-	"math"
-
-	"log" // for Fatal
-
-	"errors"
-
-	"io" // for Reader
-)
-
-import (
-	"fmt" // for Printf
-
-	"errors"
-	"io"  // for Reader
-	"log" // for Fatal
-	"math"
-
-	"errors"
-	"fmt" // for Printf
-	"io"  // for Reader
-	"log" // for Fatal
-	"math"
-)
-
-// Test deduping and extended sorting
-import (
-	a "A" // aA
-	b "A" // bA1
-	b "A" // bA2
-	"B"   // B
-	. "B" // .B
-	_ "B" // _b
-	"C"
-	a "D" // aD
-)
-
-import (
-	"dedup_by_group"
-
-	"dedup_by_group"
-)
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/import.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/import.input
deleted file mode 100644
index 9a4b09d..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/import.input
+++ /dev/null
@@ -1,131 +0,0 @@
-package main
-
-import (
-	"fmt"
-	"math"
-	"log"
-	"errors"
-	"io"
-)
-
-import (
-	"fmt"
-
-	"math"
-
-	"log"
-
-	"errors"
-
-	"io"
-)
-
-import (
-	"fmt"
-	"math"
-	"log"
-	"errors"
-	"io"
-
-	"fmt"
-
-	"math"
-
-	"log"
-
-	"errors"
-
-	"io"
-)
-
-import (
-	// a block with comments
-	"fmt" // for Printf
-	"math"
-	"log" // for Fatal
-	"errors"
-	"io" // for Reader
-)
-
-import (
-	"fmt" // for Printf
-
-	"math"
-
-	"log" // for Fatal
-
-	"errors"
-
-	"io" // for Reader
-)
-
-import (
-	// for Printf
-	"fmt"
-
-	"math"
-
-	// for Fatal
-	"log"
-
-	"errors"
-
-	// for Reader
-	"io"
-)
-
-import (
-	"fmt" // for Printf
-	"math"
-	"log" // for Fatal
-	"errors"
-	"io" // for Reader
-
-	"fmt" // for Printf
-
-	"math"
-
-	"log" // for Fatal
-
-	"errors"
-
-	"io" // for Reader
-)
-
-import (
-	"fmt" // for Printf
-
-	"math"
-	"log" // for Fatal
-	"errors"
-	"io" // for Reader
-
-	"fmt" // for Printf
-	"math"
-	"log" // for Fatal
-	"errors"
-	"io" // for Reader
-)
-
-// Test deduping and extended sorting
-import (
-	"B" // B
-	a "A" // aA
-	b "A" // bA2
-	b "A" // bA1
-	. "B" // .B
-	. "B"
-	"C"
-	"C"
-	"C"
-	a "D" // aD
-	"B"
-	_ "B" // _b
-)
-
-import (
-	"dedup_by_group"
-	"dedup_by_group"
-
-	"dedup_by_group"
-)
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/old.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/old.golden
deleted file mode 100644
index 95a0b72..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/old.golden
+++ /dev/null
@@ -1,9 +0,0 @@
-package P
-
-func f() {
-	if x {
-		y
-	} else {
-		z
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/old.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/old.input
deleted file mode 100644
index e24eed2..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/old.input
+++ /dev/null
@@ -1,8 +0,0 @@
-package P
-
-func f() {
-	if x {
-		y
-	} else
-		z
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite1.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite1.golden
deleted file mode 100644
index 3ee5373..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite1.golden
+++ /dev/null
@@ -1,14 +0,0 @@
-//gofmt -r=Foo->Bar
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-type Bar int
-
-func main() {
-	var a Bar
-	println(a)
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite1.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite1.input
deleted file mode 100644
index a84c8f7..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite1.input
+++ /dev/null
@@ -1,14 +0,0 @@
-//gofmt -r=Foo->Bar
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-type Foo int
-
-func main() {
-	var a Foo
-	println(a)
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite2.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite2.golden
deleted file mode 100644
index f980e03..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite2.golden
+++ /dev/null
@@ -1,12 +0,0 @@
-//gofmt -r=int->bool
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package p
-
-// Slices have nil Len values in the corresponding ast.ArrayType
-// node and reflect.NewValue(slice.Len) is an invalid reflect.Value.
-// The rewriter must not crash in that case. Was issue 1696.
-func f() []bool {}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite2.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite2.input
deleted file mode 100644
index 489be4e..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite2.input
+++ /dev/null
@@ -1,12 +0,0 @@
-//gofmt -r=int->bool
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package p
-
-// Slices have nil Len values in the corresponding ast.ArrayType
-// node and reflect.NewValue(slice.Len) is an invalid reflect.Value.
-// The rewriter must not crash in that case. Was issue 1696.
-func f() []int {}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite3.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite3.golden
deleted file mode 100644
index 261a220..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite3.golden
+++ /dev/null
@@ -1,14 +0,0 @@
-//gofmt -r=x->x
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// Field tags are *ast.BasicLit nodes that are nil when the tag is
-// absent. These nil nodes must not be mistaken for expressions,
-// the rewriter should not try to dereference them. Was issue 2410.
-type Foo struct {
-	Field int
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite3.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite3.input
deleted file mode 100644
index 261a220..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite3.input
+++ /dev/null
@@ -1,14 +0,0 @@
-//gofmt -r=x->x
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// Field tags are *ast.BasicLit nodes that are nil when the tag is
-// absent. These nil nodes must not be mistaken for expressions,
-// the rewriter should not try to dereference them. Was issue 2410.
-type Foo struct {
-	Field int
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite4.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite4.golden
deleted file mode 100644
index b05547b..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite4.golden
+++ /dev/null
@@ -1,76 +0,0 @@
-//gofmt -r=(x)->x
-
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Rewriting of parenthesized expressions (x) -> x
-// must not drop parentheses if that would lead to
-// wrong association of the operands.
-// Was issue 1847.
-
-package main
-
-// From example 1 of issue 1847.
-func _() {
-	var t = (&T{1000}).Id()
-}
-
-// From example 2 of issue 1847.
-func _() {
-	fmt.Println((*xpp).a)
-}
-
-// Some more test cases.
-func _() {
-	_ = (-x).f
-	_ = (*x).f
-	_ = (&x).f
-	_ = (!x).f
-	_ = -x.f
-	_ = *x.f
-	_ = &x.f
-	_ = !x.f
-	(-x).f()
-	(*x).f()
-	(&x).f()
-	(!x).f()
-	_ = -x.f()
-	_ = *x.f()
-	_ = &x.f()
-	_ = !x.f()
-
-	_ = (-x).f
-	_ = (*x).f
-	_ = (&x).f
-	_ = (!x).f
-	_ = -x.f
-	_ = *x.f
-	_ = &x.f
-	_ = !x.f
-	(-x).f()
-	(*x).f()
-	(&x).f()
-	(!x).f()
-	_ = -x.f()
-	_ = *x.f()
-	_ = &x.f()
-	_ = !x.f()
-
-	_ = -x.f
-	_ = *x.f
-	_ = &x.f
-	_ = !x.f
-	_ = -x.f
-	_ = *x.f
-	_ = &x.f
-	_ = !x.f
-	_ = -x.f()
-	_ = *x.f()
-	_ = &x.f()
-	_ = !x.f()
-	_ = -x.f()
-	_ = *x.f()
-	_ = &x.f()
-	_ = !x.f()
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite4.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite4.input
deleted file mode 100644
index 0817099..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite4.input
+++ /dev/null
@@ -1,76 +0,0 @@
-//gofmt -r=(x)->x
-
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Rewriting of parenthesized expressions (x) -> x
-// must not drop parentheses if that would lead to
-// wrong association of the operands.
-// Was issue 1847.
-
-package main
-
-// From example 1 of issue 1847.
-func _() {
-	var t = (&T{1000}).Id()
-}
-
-// From example 2 of issue 1847.
-func _() {
-       fmt.Println((*xpp).a)
-}
-
-// Some more test cases.
-func _() {
-	_ = (-x).f
-	_ = (*x).f
-	_ = (&x).f
-	_ = (!x).f
-	_ = (-x.f)
-	_ = (*x.f)
-	_ = (&x.f)
-	_ = (!x.f)
-	(-x).f()
-	(*x).f()
-	(&x).f()
-	(!x).f()
-	_ = (-x.f())
-	_ = (*x.f())
-	_ = (&x.f())
-	_ = (!x.f())
-
-	_ = ((-x)).f
-	_ = ((*x)).f
-	_ = ((&x)).f
-	_ = ((!x)).f
-	_ = ((-x.f))
-	_ = ((*x.f))
-	_ = ((&x.f))
-	_ = ((!x.f))
-	((-x)).f()
-	((*x)).f()
-	((&x)).f()
-	((!x)).f()
-	_ = ((-x.f()))
-	_ = ((*x.f()))
-	_ = ((&x.f()))
-	_ = ((!x.f()))
-
-	_ = -(x).f
-	_ = *(x).f
-	_ = &(x).f
-	_ = !(x).f
-	_ = -x.f
-	_ = *x.f
-	_ = &x.f
-	_ = !x.f
-	_ = -(x).f()
-	_ = *(x).f()
-	_ = &(x).f()
-	_ = !(x).f()
-	_ = -x.f()
-	_ = *x.f()
-	_ = &x.f()
-	_ = !x.f()
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite5.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite5.golden
deleted file mode 100644
index 9beb34a..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite5.golden
+++ /dev/null
@@ -1,17 +0,0 @@
-//gofmt -r=x+x->2*x
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Rewriting of expressions containing nodes with associated comments to
-// expressions without those nodes must also eliminate the associated
-// comments.
-
-package p
-
-func f(x int) int {
-	_ = 2 * x // this comment remains in the rewrite
-	_ = 2 * x
-	return 2 * x
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite5.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite5.input
deleted file mode 100644
index d7a6122..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite5.input
+++ /dev/null
@@ -1,17 +0,0 @@
-//gofmt -r=x+x->2*x
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Rewriting of expressions containing nodes with associated comments to
-// expressions without those nodes must also eliminate the associated
-// comments.
-
-package p
-
-func f(x int) int {
-	_ = x + x // this comment remains in the rewrite
-	_ = x /* this comment must not be in the rewrite */ + x
-	return x /* this comment must not be in the rewrite */ + x
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite6.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite6.golden
deleted file mode 100644
index 48ec9aa..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite6.golden
+++ /dev/null
@@ -1,17 +0,0 @@
-//gofmt -r=fun(x)->Fun(x)
-
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Rewriting of calls must take the ... (ellipsis)
-// attribute for the last argument into account.
-
-package p
-
-func fun(x []int) {}
-
-func g(x []int) {
-	Fun(x)    // -r='fun(x)->Fun(x)' should rewrite this to Fun(x)
-	fun(x...) // -r='fun(x)->Fun(x)' should not rewrite this
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite6.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite6.input
deleted file mode 100644
index b085a84..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite6.input
+++ /dev/null
@@ -1,17 +0,0 @@
-//gofmt -r=fun(x)->Fun(x)
-
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Rewriting of calls must take the ... (ellipsis)
-// attribute for the last argument into account.
-
-package p
-
-func fun(x []int) {}
-
-func g(x []int) {
-	fun(x)    // -r='fun(x)->Fun(x)' should rewrite this to Fun(x)
-	fun(x...) // -r='fun(x)->Fun(x)' should not rewrite this
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite7.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite7.golden
deleted file mode 100644
index 8386a0b..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite7.golden
+++ /dev/null
@@ -1,17 +0,0 @@
-//gofmt -r=fun(x...)->Fun(x)
-
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Rewriting of calls must take the ... (ellipsis)
-// attribute for the last argument into account.
-
-package p
-
-func fun(x []int) {}
-
-func g(x []int) {
-	fun(x) // -r='fun(x...)->Fun(x)' should not rewrite this
-	Fun(x) // -r='fun(x...)->Fun(x)' should rewrite this to Fun(x)
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite7.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite7.input
deleted file mode 100644
index c198470..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite7.input
+++ /dev/null
@@ -1,17 +0,0 @@
-//gofmt -r=fun(x...)->Fun(x)
-
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Rewriting of calls must take the ... (ellipsis)
-// attribute for the last argument into account.
-
-package p
-
-func fun(x []int) {}
-
-func g(x []int) {
-	fun(x)    // -r='fun(x...)->Fun(x)' should not rewrite this
-	fun(x...) // -r='fun(x...)->Fun(x)' should rewrite this to Fun(x)
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite8.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite8.golden
deleted file mode 100644
index 62f0419..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite8.golden
+++ /dev/null
@@ -1,12 +0,0 @@
-//gofmt -r=interface{}->int
-
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Check that literal type expression rewrites are accepted.
-// Was issue 4406.
-
-package p
-
-type T int
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite8.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite8.input
deleted file mode 100644
index 7964c5c..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/rewrite8.input
+++ /dev/null
@@ -1,12 +0,0 @@
-//gofmt -r=interface{}->int
-
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Check that literal type expression rewrites are accepted.
-// Was issue 4406.
-
-package p
-
-type T interface{}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/slices1.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/slices1.golden
deleted file mode 100644
index 04bc16f..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/slices1.golden
+++ /dev/null
@@ -1,66 +0,0 @@
-//gofmt -s
-
-// Test cases for slice expression simplification.
-package p
-
-var (
-	a [10]byte
-	b [20]float32
-	s []int
-	t struct {
-		s []byte
-	}
-
-	_ = a[0:]
-	_ = a[1:10]
-	_ = a[2:]
-	_ = a[3:(len(a))]
-	_ = a[len(a) : len(a)-1]
-	_ = a[0:len(b)]
-	_ = a[2:len(a):len(a)]
-
-	_ = a[:]
-	_ = a[:10]
-	_ = a[:]
-	_ = a[:(len(a))]
-	_ = a[:len(a)-1]
-	_ = a[:len(b)]
-	_ = a[:len(a):len(a)]
-
-	_ = s[0:]
-	_ = s[1:10]
-	_ = s[2:]
-	_ = s[3:(len(s))]
-	_ = s[len(a) : len(s)-1]
-	_ = s[0:len(b)]
-	_ = s[2:len(s):len(s)]
-
-	_ = s[:]
-	_ = s[:10]
-	_ = s[:]
-	_ = s[:(len(s))]
-	_ = s[:len(s)-1]
-	_ = s[:len(b)]
-	_ = s[:len(s):len(s)]
-
-	_ = t.s[0:]
-	_ = t.s[1:10]
-	_ = t.s[2:len(t.s)]
-	_ = t.s[3:(len(t.s))]
-	_ = t.s[len(a) : len(t.s)-1]
-	_ = t.s[0:len(b)]
-	_ = t.s[2:len(t.s):len(t.s)]
-
-	_ = t.s[:]
-	_ = t.s[:10]
-	_ = t.s[:len(t.s)]
-	_ = t.s[:(len(t.s))]
-	_ = t.s[:len(t.s)-1]
-	_ = t.s[:len(b)]
-	_ = t.s[:len(t.s):len(t.s)]
-)
-
-func _() {
-	s := s[0:]
-	_ = s
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/slices1.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/slices1.input
deleted file mode 100644
index 1f25c43..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/slices1.input
+++ /dev/null
@@ -1,66 +0,0 @@
-//gofmt -s
-
-// Test cases for slice expression simplification.
-package p
-
-var (
-	a [10]byte
-	b [20]float32
-	s []int
-	t struct {
-		s []byte
-	}
-
-	_ = a[0:]
-	_ = a[1:10]
-	_ = a[2:len(a)]
-	_ = a[3:(len(a))]
-	_ = a[len(a) : len(a)-1]
-	_ = a[0:len(b)]
-	_ = a[2:len(a):len(a)]
-
-	_ = a[:]
-	_ = a[:10]
-	_ = a[:len(a)]
-	_ = a[:(len(a))]
-	_ = a[:len(a)-1]
-	_ = a[:len(b)]
-	_ = a[:len(a):len(a)]
-
-	_ = s[0:]
-	_ = s[1:10]
-	_ = s[2:len(s)]
-	_ = s[3:(len(s))]
-	_ = s[len(a) : len(s)-1]
-	_ = s[0:len(b)]
-	_ = s[2:len(s):len(s)]
-
-	_ = s[:]
-	_ = s[:10]
-	_ = s[:len(s)]
-	_ = s[:(len(s))]
-	_ = s[:len(s)-1]
-	_ = s[:len(b)]
-	_ = s[:len(s):len(s)]
-
-	_ = t.s[0:]
-	_ = t.s[1:10]
-	_ = t.s[2:len(t.s)]
-	_ = t.s[3:(len(t.s))]
-	_ = t.s[len(a) : len(t.s)-1]
-	_ = t.s[0:len(b)]
-	_ = t.s[2:len(t.s):len(t.s)]
-
-	_ = t.s[:]
-	_ = t.s[:10]
-	_ = t.s[:len(t.s)]
-	_ = t.s[:(len(t.s))]
-	_ = t.s[:len(t.s)-1]
-	_ = t.s[:len(b)]
-	_ = t.s[:len(t.s):len(t.s)]
-)
-
-func _() {
-	s := s[0:len(s)]
-	_ = s
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/slices2.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/slices2.golden
deleted file mode 100644
index ab65700..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/slices2.golden
+++ /dev/null
@@ -1,63 +0,0 @@
-//gofmt -s
-
-// Test cases for slice expression simplification.
-// Because of a dot import, these slices must remain untouched.
-package p
-
-import . "math"
-
-var (
-	a [10]byte
-	b [20]float32
-	s []int
-	t struct {
-		s []byte
-	}
-
-	_ = a[0:]
-	_ = a[1:10]
-	_ = a[2:len(a)]
-	_ = a[3:(len(a))]
-	_ = a[len(a) : len(a)-1]
-	_ = a[0:len(b)]
-
-	_ = a[:]
-	_ = a[:10]
-	_ = a[:len(a)]
-	_ = a[:(len(a))]
-	_ = a[:len(a)-1]
-	_ = a[:len(b)]
-
-	_ = s[0:]
-	_ = s[1:10]
-	_ = s[2:len(s)]
-	_ = s[3:(len(s))]
-	_ = s[len(a) : len(s)-1]
-	_ = s[0:len(b)]
-
-	_ = s[:]
-	_ = s[:10]
-	_ = s[:len(s)]
-	_ = s[:(len(s))]
-	_ = s[:len(s)-1]
-	_ = s[:len(b)]
-
-	_ = t.s[0:]
-	_ = t.s[1:10]
-	_ = t.s[2:len(t.s)]
-	_ = t.s[3:(len(t.s))]
-	_ = t.s[len(a) : len(t.s)-1]
-	_ = t.s[0:len(b)]
-
-	_ = t.s[:]
-	_ = t.s[:10]
-	_ = t.s[:len(t.s)]
-	_ = t.s[:(len(t.s))]
-	_ = t.s[:len(t.s)-1]
-	_ = t.s[:len(b)]
-)
-
-func _() {
-	s := s[0:len(s)]
-	_ = s
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/slices2.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/slices2.input
deleted file mode 100644
index ab65700..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/slices2.input
+++ /dev/null
@@ -1,63 +0,0 @@
-//gofmt -s
-
-// Test cases for slice expression simplification.
-// Because of a dot import, these slices must remain untouched.
-package p
-
-import . "math"
-
-var (
-	a [10]byte
-	b [20]float32
-	s []int
-	t struct {
-		s []byte
-	}
-
-	_ = a[0:]
-	_ = a[1:10]
-	_ = a[2:len(a)]
-	_ = a[3:(len(a))]
-	_ = a[len(a) : len(a)-1]
-	_ = a[0:len(b)]
-
-	_ = a[:]
-	_ = a[:10]
-	_ = a[:len(a)]
-	_ = a[:(len(a))]
-	_ = a[:len(a)-1]
-	_ = a[:len(b)]
-
-	_ = s[0:]
-	_ = s[1:10]
-	_ = s[2:len(s)]
-	_ = s[3:(len(s))]
-	_ = s[len(a) : len(s)-1]
-	_ = s[0:len(b)]
-
-	_ = s[:]
-	_ = s[:10]
-	_ = s[:len(s)]
-	_ = s[:(len(s))]
-	_ = s[:len(s)-1]
-	_ = s[:len(b)]
-
-	_ = t.s[0:]
-	_ = t.s[1:10]
-	_ = t.s[2:len(t.s)]
-	_ = t.s[3:(len(t.s))]
-	_ = t.s[len(a) : len(t.s)-1]
-	_ = t.s[0:len(b)]
-
-	_ = t.s[:]
-	_ = t.s[:10]
-	_ = t.s[:len(t.s)]
-	_ = t.s[:(len(t.s))]
-	_ = t.s[:len(t.s)-1]
-	_ = t.s[:len(b)]
-)
-
-func _() {
-	s := s[0:len(s)]
-	_ = s
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin1.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin1.golden
deleted file mode 100644
index 9e4dcd2..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin1.golden
+++ /dev/null
@@ -1,5 +0,0 @@
-	//gofmt -stdin
-
-	if x {
-		y
-	}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin1.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin1.input
deleted file mode 100644
index 9e4dcd2..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin1.input
+++ /dev/null
@@ -1,5 +0,0 @@
-	//gofmt -stdin
-
-	if x {
-		y
-	}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin2.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin2.golden
deleted file mode 100644
index 57df355..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin2.golden
+++ /dev/null
@@ -1,11 +0,0 @@
-//gofmt -stdin
-
-var x int
-
-func f() {
-	y := z
-	/* this is a comment */
-	// this is a comment too
-}
-
-
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin2.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin2.input
deleted file mode 100644
index 69d6bdd..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin2.input
+++ /dev/null
@@ -1,11 +0,0 @@
-//gofmt -stdin
-
-var x int
-
-
-func f() { y := z
-	/* this is a comment */
-	// this is a comment too
-}
-
-
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin3.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin3.golden
deleted file mode 100644
index d6da0e4..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin3.golden
+++ /dev/null
@@ -1,7 +0,0 @@
-		//gofmt -stdin
-
-		/* note: no newline at end of file */
-		for i := 0; i < 10; i++ {
-			s += i
-		}
-	
\ No newline at end of file
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin3.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin3.input
deleted file mode 100644
index ab46c10..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin3.input
+++ /dev/null
@@ -1,5 +0,0 @@
-		//gofmt -stdin
-
-		/* note: no newline at end of file */
-		for i := 0; i < 10; i++ { s += i }
-	
\ No newline at end of file
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin4.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin4.golden
deleted file mode 100644
index 0c7acac..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin4.golden
+++ /dev/null
@@ -1,5 +0,0 @@
-	//gofmt -stdin
-
-	// comment
-
-	i := 0
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin4.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin4.input
deleted file mode 100644
index 1fc73f3..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/stdin4.input
+++ /dev/null
@@ -1,5 +0,0 @@
-	//gofmt -stdin
-
-	// comment
-	
-	i := 0
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/typeswitch.golden b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/typeswitch.golden
deleted file mode 100644
index 2b1905e..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/typeswitch.golden
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-	Parenthesized type switch expressions originally
-	accepted by gofmt must continue to be rewritten
-	into the correct unparenthesized form.
-
-	Only type-switches that didn't declare a variable
-	in the type switch type assertion and which
-	contained only "expression-like" (named) types in their
-	cases were permitted to have their type assertion parenthesized
-	by go/parser (due to a weak predicate in the parser). All others
-	were rejected always, either with a syntax error in the
-	type switch header or in the case.
-
-	See also issue 4470.
-*/
-package p
-
-func f() {
-	var x interface{}
-	switch x.(type) { // should remain the same
-	}
-	switch x.(type) { // should become: switch x.(type) {
-	}
-
-	switch x.(type) { // should remain the same
-	case int:
-	}
-	switch x.(type) { // should become: switch x.(type) {
-	case int:
-	}
-
-	switch x.(type) { // should remain the same
-	case []int:
-	}
-
-	// Parenthesized (x.(type)) in type switches containing cases
-	// with unnamed (literal) types were never permitted by gofmt;
-	// thus there won't be any code in the wild using this style if
-	// the code was gofmt-ed.
-	/*
-		switch (x.(type)) {
-		case []int:
-		}
-	*/
-
-	switch t := x.(type) { // should remain the same
-	default:
-		_ = t
-	}
-
-	// Parenthesized (x.(type)) in type switches declaring a variable
-	// were never permitted by gofmt; thus there won't be any code in
-	// the wild using this style if the code was gofmt-ed.
-	/*
-		switch t := (x.(type)) {
-		default:
-			_ = t
-		}
-	*/
-}
diff --git a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/typeswitch.input b/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/typeswitch.input
deleted file mode 100644
index 8f8cba9..0000000
--- a/third_party/gofrontend/libgo/go/cmd/gofmt/testdata/typeswitch.input
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-	Parenthesized type switch expressions originally
-	accepted by gofmt must continue to be rewritten
-	into the correct unparenthesized form.
-
-	Only type-switches that didn't declare a variable
-	in the type switch type assertion and which
-	contained only "expression-like" (named) types in their
-	cases were permitted to have their type assertion parenthesized
-	by go/parser (due to a weak predicate in the parser). All others
-	were rejected always, either with a syntax error in the
-	type switch header or in the case.
-
-	See also issue 4470.
-*/
-package p
-
-func f() {
-	var x interface{}
-	switch x.(type) { // should remain the same
-	}
-	switch (x.(type)) { // should become: switch x.(type) {
-	}
-
-	switch x.(type) { // should remain the same
-	case int:
-	}
-	switch (x.(type)) { // should become: switch x.(type) {
-	case int:
-	}
-
-	switch x.(type) { // should remain the same
-	case []int:
-	}
-
-	// Parenthesized (x.(type)) in type switches containing cases
-	// with unnamed (literal) types were never permitted by gofmt;
-	// thus there won't be any code in the wild using this style if
-	// the code was gofmt-ed.
-	/*
-	switch (x.(type)) {
-	case []int:
-	}
-	*/
-
-	switch t := x.(type) { // should remain the same
-	default:
-		_ = t
-	}
-
-	// Parenthesized (x.(type)) in type switches declaring a variable
-	// were never permitted by gofmt; thus there won't be any code in
-	// the wild using this style if the code was gofmt-ed.
-	/*
-	switch t := (x.(type)) {
-	default:
-		_ = t
-	}
-	*/
-}
diff --git a/third_party/gofrontend/libgo/go/compress/bzip2/bit_reader.go b/third_party/gofrontend/libgo/go/compress/bzip2/bit_reader.go
deleted file mode 100644
index 32d1036..0000000
--- a/third_party/gofrontend/libgo/go/compress/bzip2/bit_reader.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bzip2
-
-import (
-	"bufio"
-	"io"
-)
-
-// bitReader wraps an io.Reader and provides the ability to read values,
-// bit-by-bit, from it. Its Read* methods don't return the usual error
-// because the error handling was verbose. Instead, any error is kept and can
-// be checked afterwards.
-type bitReader struct {
-	r    io.ByteReader
-	n    uint64
-	bits uint
-	err  error
-}
-
-// newBitReader returns a new bitReader reading from r. If r is not
-// already an io.ByteReader, it will be converted via a bufio.Reader.
-func newBitReader(r io.Reader) bitReader {
-	byter, ok := r.(io.ByteReader)
-	if !ok {
-		byter = bufio.NewReader(r)
-	}
-	return bitReader{r: byter}
-}
-
-// ReadBits64 reads the given number of bits and returns them in the
-// least-significant part of a uint64. In the event of an error, it returns 0
-// and the error can be obtained by calling Err().
-func (br *bitReader) ReadBits64(bits uint) (n uint64) {
-	for bits > br.bits {
-		b, err := br.r.ReadByte()
-		if err == io.EOF {
-			err = io.ErrUnexpectedEOF
-		}
-		if err != nil {
-			br.err = err
-			return 0
-		}
-		br.n <<= 8
-		br.n |= uint64(b)
-		br.bits += 8
-	}
-
-	// br.n looks like this (assuming that br.bits = 14 and bits = 6):
-	// Bit: 111111
-	//      5432109876543210
-	//
-	//         (6 bits, the desired output)
-	//        |-----|
-	//        V     V
-	//      0101101101001110
-	//        ^            ^
-	//        |------------|
-	//           br.bits (num valid bits)
-	//
-	// This the next line right shifts the desired bits into the
-	// least-significant places and masks off anything above.
-	n = (br.n >> (br.bits - bits)) & ((1 << bits) - 1)
-	br.bits -= bits
-	return
-}
-
-func (br *bitReader) ReadBits(bits uint) (n int) {
-	n64 := br.ReadBits64(bits)
-	return int(n64)
-}
-
-func (br *bitReader) ReadBit() bool {
-	n := br.ReadBits(1)
-	return n != 0
-}
-
-func (br *bitReader) TryReadBit() (bit byte, ok bool) {
-	if br.bits > 0 {
-		br.bits--
-		return byte(br.n>>br.bits) & 1, true
-	}
-	return 0, false
-}
-
-func (br *bitReader) Err() error {
-	return br.err
-}
diff --git a/third_party/gofrontend/libgo/go/compress/bzip2/bzip2.go b/third_party/gofrontend/libgo/go/compress/bzip2/bzip2.go
deleted file mode 100644
index 6897957..0000000
--- a/third_party/gofrontend/libgo/go/compress/bzip2/bzip2.go
+++ /dev/null
@@ -1,503 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package bzip2 implements bzip2 decompression.
-package bzip2
-
-import "io"
-
-// There's no RFC for bzip2. I used the Wikipedia page for reference and a lot
-// of guessing: http://en.wikipedia.org/wiki/Bzip2
-// The source code to pyflate was useful for debugging:
-// http://www.paul.sladen.org/projects/pyflate
-
-// A StructuralError is returned when the bzip2 data is found to be
-// syntactically invalid.
-type StructuralError string
-
-func (s StructuralError) Error() string {
-	return "bzip2 data invalid: " + string(s)
-}
-
-// A reader decompresses bzip2 compressed data.
-type reader struct {
-	br           bitReader
-	fileCRC      uint32
-	blockCRC     uint32
-	wantBlockCRC uint32
-	setupDone    bool // true if we have parsed the bzip2 header.
-	blockSize    int  // blockSize in bytes, i.e. 900 * 1024.
-	eof          bool
-	buf          []byte    // stores Burrows-Wheeler transformed data.
-	c            [256]uint // the `C' array for the inverse BWT.
-	tt           []uint32  // mirrors the `tt' array in the bzip2 source and contains the P array in the upper 24 bits.
-	tPos         uint32    // Index of the next output byte in tt.
-
-	preRLE      []uint32 // contains the RLE data still to be processed.
-	preRLEUsed  int      // number of entries of preRLE used.
-	lastByte    int      // the last byte value seen.
-	byteRepeats uint     // the number of repeats of lastByte seen.
-	repeats     uint     // the number of copies of lastByte to output.
-}
-
-// NewReader returns an io.Reader which decompresses bzip2 data from r.
-// If r does not also implement io.ByteReader,
-// the decompressor may read more data than necessary from r.
-func NewReader(r io.Reader) io.Reader {
-	bz2 := new(reader)
-	bz2.br = newBitReader(r)
-	return bz2
-}
-
-const bzip2FileMagic = 0x425a // "BZ"
-const bzip2BlockMagic = 0x314159265359
-const bzip2FinalMagic = 0x177245385090
-
-// setup parses the bzip2 header.
-func (bz2 *reader) setup(needMagic bool) error {
-	br := &bz2.br
-
-	if needMagic {
-		magic := br.ReadBits(16)
-		if magic != bzip2FileMagic {
-			return StructuralError("bad magic value")
-		}
-	}
-
-	t := br.ReadBits(8)
-	if t != 'h' {
-		return StructuralError("non-Huffman entropy encoding")
-	}
-
-	level := br.ReadBits(8)
-	if level < '1' || level > '9' {
-		return StructuralError("invalid compression level")
-	}
-
-	bz2.fileCRC = 0
-	bz2.blockSize = 100 * 1024 * (int(level) - '0')
-	if bz2.blockSize > len(bz2.tt) {
-		bz2.tt = make([]uint32, bz2.blockSize)
-	}
-	return nil
-}
-
-func (bz2 *reader) Read(buf []byte) (n int, err error) {
-	if bz2.eof {
-		return 0, io.EOF
-	}
-
-	if !bz2.setupDone {
-		err = bz2.setup(true)
-		brErr := bz2.br.Err()
-		if brErr != nil {
-			err = brErr
-		}
-		if err != nil {
-			return 0, err
-		}
-		bz2.setupDone = true
-	}
-
-	n, err = bz2.read(buf)
-	brErr := bz2.br.Err()
-	if brErr != nil {
-		err = brErr
-	}
-	return
-}
-
-func (bz2 *reader) readFromBlock(buf []byte) int {
-	// bzip2 is a block based compressor, except that it has a run-length
-	// preprocessing step. The block based nature means that we can
-	// preallocate fixed-size buffers and reuse them. However, the RLE
-	// preprocessing would require allocating huge buffers to store the
-	// maximum expansion. Thus we process blocks all at once, except for
-	// the RLE which we decompress as required.
-	n := 0
-	for (bz2.repeats > 0 || bz2.preRLEUsed < len(bz2.preRLE)) && n < len(buf) {
-		// We have RLE data pending.
-
-		// The run-length encoding works like this:
-		// Any sequence of four equal bytes is followed by a length
-		// byte which contains the number of repeats of that byte to
-		// include. (The number of repeats can be zero.) Because we are
-		// decompressing on-demand our state is kept in the reader
-		// object.
-
-		if bz2.repeats > 0 {
-			buf[n] = byte(bz2.lastByte)
-			n++
-			bz2.repeats--
-			if bz2.repeats == 0 {
-				bz2.lastByte = -1
-			}
-			continue
-		}
-
-		bz2.tPos = bz2.preRLE[bz2.tPos]
-		b := byte(bz2.tPos)
-		bz2.tPos >>= 8
-		bz2.preRLEUsed++
-
-		if bz2.byteRepeats == 3 {
-			bz2.repeats = uint(b)
-			bz2.byteRepeats = 0
-			continue
-		}
-
-		if bz2.lastByte == int(b) {
-			bz2.byteRepeats++
-		} else {
-			bz2.byteRepeats = 0
-		}
-		bz2.lastByte = int(b)
-
-		buf[n] = b
-		n++
-	}
-
-	return n
-}
-
-func (bz2 *reader) read(buf []byte) (int, error) {
-	for {
-		n := bz2.readFromBlock(buf)
-		if n > 0 {
-			bz2.blockCRC = updateCRC(bz2.blockCRC, buf[:n])
-			return n, nil
-		}
-
-		// End of block. Check CRC.
-		if bz2.blockCRC != bz2.wantBlockCRC {
-			bz2.br.err = StructuralError("block checksum mismatch")
-			return 0, bz2.br.err
-		}
-
-		// Find next block.
-		br := &bz2.br
-		switch br.ReadBits64(48) {
-		default:
-			return 0, StructuralError("bad magic value found")
-
-		case bzip2BlockMagic:
-			// Start of block.
-			err := bz2.readBlock()
-			if err != nil {
-				return 0, err
-			}
-
-		case bzip2FinalMagic:
-			// Check end-of-file CRC.
-			wantFileCRC := uint32(br.ReadBits64(32))
-			if br.err != nil {
-				return 0, br.err
-			}
-			if bz2.fileCRC != wantFileCRC {
-				br.err = StructuralError("file checksum mismatch")
-				return 0, br.err
-			}
-
-			// Skip ahead to byte boundary.
-			// Is there a file concatenated to this one?
-			// It would start with BZ.
-			if br.bits%8 != 0 {
-				br.ReadBits(br.bits % 8)
-			}
-			b, err := br.r.ReadByte()
-			if err == io.EOF {
-				br.err = io.EOF
-				bz2.eof = true
-				return 0, io.EOF
-			}
-			if err != nil {
-				br.err = err
-				return 0, err
-			}
-			z, err := br.r.ReadByte()
-			if err != nil {
-				if err == io.EOF {
-					err = io.ErrUnexpectedEOF
-				}
-				br.err = err
-				return 0, err
-			}
-			if b != 'B' || z != 'Z' {
-				return 0, StructuralError("bad magic value in continuation file")
-			}
-			if err := bz2.setup(false); err != nil {
-				return 0, err
-			}
-		}
-	}
-}
-
-// readBlock reads a bzip2 block. The magic number should already have been consumed.
-func (bz2 *reader) readBlock() (err error) {
-	br := &bz2.br
-	bz2.wantBlockCRC = uint32(br.ReadBits64(32)) // skip checksum. TODO: check it if we can figure out what it is.
-	bz2.blockCRC = 0
-	bz2.fileCRC = (bz2.fileCRC<<1 | bz2.fileCRC>>31) ^ bz2.wantBlockCRC
-	randomized := br.ReadBits(1)
-	if randomized != 0 {
-		return StructuralError("deprecated randomized files")
-	}
-	origPtr := uint(br.ReadBits(24))
-
-	// If not every byte value is used in the block (i.e., it's text) then
-	// the symbol set is reduced. The symbols used are stored as a
-	// two-level, 16x16 bitmap.
-	symbolRangeUsedBitmap := br.ReadBits(16)
-	symbolPresent := make([]bool, 256)
-	numSymbols := 0
-	for symRange := uint(0); symRange < 16; symRange++ {
-		if symbolRangeUsedBitmap&(1<<(15-symRange)) != 0 {
-			bits := br.ReadBits(16)
-			for symbol := uint(0); symbol < 16; symbol++ {
-				if bits&(1<<(15-symbol)) != 0 {
-					symbolPresent[16*symRange+symbol] = true
-					numSymbols++
-				}
-			}
-		}
-	}
-
-	if numSymbols == 0 {
-		// There must be an EOF symbol.
-		return StructuralError("no symbols in input")
-	}
-
-	// A block uses between two and six different Huffman trees.
-	numHuffmanTrees := br.ReadBits(3)
-	if numHuffmanTrees < 2 || numHuffmanTrees > 6 {
-		return StructuralError("invalid number of Huffman trees")
-	}
-
-	// The Huffman tree can switch every 50 symbols so there's a list of
-	// tree indexes telling us which tree to use for each 50 symbol block.
-	numSelectors := br.ReadBits(15)
-	treeIndexes := make([]uint8, numSelectors)
-
-	// The tree indexes are move-to-front transformed and stored as unary
-	// numbers.
-	mtfTreeDecoder := newMTFDecoderWithRange(numHuffmanTrees)
-	for i := range treeIndexes {
-		c := 0
-		for {
-			inc := br.ReadBits(1)
-			if inc == 0 {
-				break
-			}
-			c++
-		}
-		if c >= numHuffmanTrees {
-			return StructuralError("tree index too large")
-		}
-		treeIndexes[i] = uint8(mtfTreeDecoder.Decode(c))
-	}
-
-	// The list of symbols for the move-to-front transform is taken from
-	// the previously decoded symbol bitmap.
-	symbols := make([]byte, numSymbols)
-	nextSymbol := 0
-	for i := 0; i < 256; i++ {
-		if symbolPresent[i] {
-			symbols[nextSymbol] = byte(i)
-			nextSymbol++
-		}
-	}
-	mtf := newMTFDecoder(symbols)
-
-	numSymbols += 2 // to account for RUNA and RUNB symbols
-	huffmanTrees := make([]huffmanTree, numHuffmanTrees)
-
-	// Now we decode the arrays of code-lengths for each tree.
-	lengths := make([]uint8, numSymbols)
-	for i := range huffmanTrees {
-		// The code lengths are delta encoded from a 5-bit base value.
-		length := br.ReadBits(5)
-		for j := range lengths {
-			for {
-				if !br.ReadBit() {
-					break
-				}
-				if br.ReadBit() {
-					length--
-				} else {
-					length++
-				}
-			}
-			if length < 0 || length > 20 {
-				return StructuralError("Huffman length out of range")
-			}
-			lengths[j] = uint8(length)
-		}
-		huffmanTrees[i], err = newHuffmanTree(lengths)
-		if err != nil {
-			return err
-		}
-	}
-
-	selectorIndex := 1 // the next tree index to use
-	if len(treeIndexes) == 0 {
-		return StructuralError("no tree selectors given")
-	}
-	if int(treeIndexes[0]) >= len(huffmanTrees) {
-		return StructuralError("tree selector out of range")
-	}
-	currentHuffmanTree := huffmanTrees[treeIndexes[0]]
-	bufIndex := 0 // indexes bz2.buf, the output buffer.
-	// The output of the move-to-front transform is run-length encoded and
-	// we merge the decoding into the Huffman parsing loop. These two
-	// variables accumulate the repeat count. See the Wikipedia page for
-	// details.
-	repeat := 0
-	repeatPower := 0
-
-	// The `C' array (used by the inverse BWT) needs to be zero initialized.
-	for i := range bz2.c {
-		bz2.c[i] = 0
-	}
-
-	decoded := 0 // counts the number of symbols decoded by the current tree.
-	for {
-		if decoded == 50 {
-			if selectorIndex >= numSelectors {
-				return StructuralError("insufficient selector indices for number of symbols")
-			}
-			if int(treeIndexes[selectorIndex]) >= len(huffmanTrees) {
-				return StructuralError("tree selector out of range")
-			}
-			currentHuffmanTree = huffmanTrees[treeIndexes[selectorIndex]]
-			selectorIndex++
-			decoded = 0
-		}
-
-		v := currentHuffmanTree.Decode(br)
-		decoded++
-
-		if v < 2 {
-			// This is either the RUNA or RUNB symbol.
-			if repeat == 0 {
-				repeatPower = 1
-			}
-			repeat += repeatPower << v
-			repeatPower <<= 1
-
-			// This limit of 2 million comes from the bzip2 source
-			// code. It prevents repeat from overflowing.
-			if repeat > 2*1024*1024 {
-				return StructuralError("repeat count too large")
-			}
-			continue
-		}
-
-		if repeat > 0 {
-			// We have decoded a complete run-length so we need to
-			// replicate the last output symbol.
-			if repeat > bz2.blockSize-bufIndex {
-				return StructuralError("repeats past end of block")
-			}
-			for i := 0; i < repeat; i++ {
-				b := byte(mtf.First())
-				bz2.tt[bufIndex] = uint32(b)
-				bz2.c[b]++
-				bufIndex++
-			}
-			repeat = 0
-		}
-
-		if int(v) == numSymbols-1 {
-			// This is the EOF symbol. Because it's always at the
-			// end of the move-to-front list, and never gets moved
-			// to the front, it has this unique value.
-			break
-		}
-
-		// Since two metasymbols (RUNA and RUNB) have values 0 and 1,
-		// one would expect |v-2| to be passed to the MTF decoder.
-		// However, the front of the MTF list is never referenced as 0,
-		// it's always referenced with a run-length of 1. Thus 0
-		// doesn't need to be encoded and we have |v-1| in the next
-		// line.
-		b := byte(mtf.Decode(int(v - 1)))
-		if bufIndex >= bz2.blockSize {
-			return StructuralError("data exceeds block size")
-		}
-		bz2.tt[bufIndex] = uint32(b)
-		bz2.c[b]++
-		bufIndex++
-	}
-
-	if origPtr >= uint(bufIndex) {
-		return StructuralError("origPtr out of bounds")
-	}
-
-	// We have completed the entropy decoding. Now we can perform the
-	// inverse BWT and setup the RLE buffer.
-	bz2.preRLE = bz2.tt[:bufIndex]
-	bz2.preRLEUsed = 0
-	bz2.tPos = inverseBWT(bz2.preRLE, origPtr, bz2.c[:])
-	bz2.lastByte = -1
-	bz2.byteRepeats = 0
-	bz2.repeats = 0
-
-	return nil
-}
-
-// inverseBWT implements the inverse Burrows-Wheeler transform as described in
-// http://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf, section 4.2.
-// In that document, origPtr is called `I' and c is the `C' array after the
-// first pass over the data. It's an argument here because we merge the first
-// pass with the Huffman decoding.
-//
-// This also implements the `single array' method from the bzip2 source code
-// which leaves the output, still shuffled, in the bottom 8 bits of tt with the
-// index of the next byte in the top 24-bits. The index of the first byte is
-// returned.
-func inverseBWT(tt []uint32, origPtr uint, c []uint) uint32 {
-	sum := uint(0)
-	for i := 0; i < 256; i++ {
-		sum += c[i]
-		c[i] = sum - c[i]
-	}
-
-	for i := range tt {
-		b := tt[i] & 0xff
-		tt[c[b]] |= uint32(i) << 8
-		c[b]++
-	}
-
-	return tt[origPtr] >> 8
-}
-
-// This is a standard CRC32 like in hash/crc32 except that all the shifts are reversed,
-// causing the bits in the input to be processed in the reverse of the usual order.
-
-var crctab [256]uint32
-
-func init() {
-	const poly = 0x04C11DB7
-	for i := range crctab {
-		crc := uint32(i) << 24
-		for j := 0; j < 8; j++ {
-			if crc&0x80000000 != 0 {
-				crc = (crc << 1) ^ poly
-			} else {
-				crc <<= 1
-			}
-		}
-		crctab[i] = crc
-	}
-}
-
-// updateCRC updates the crc value to incorporate the data in b.
-// The initial value is 0.
-func updateCRC(val uint32, b []byte) uint32 {
-	crc := ^val
-	for _, v := range b {
-		crc = crctab[byte(crc>>24)^v] ^ (crc << 8)
-	}
-	return ^crc
-}
diff --git a/third_party/gofrontend/libgo/go/compress/bzip2/bzip2_test.go b/third_party/gofrontend/libgo/go/compress/bzip2/bzip2_test.go
deleted file mode 100644
index 77c50df..0000000
--- a/third_party/gofrontend/libgo/go/compress/bzip2/bzip2_test.go
+++ /dev/null
@@ -1,419 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bzip2
-
-import (
-	"bytes"
-	"encoding/base64"
-	"encoding/hex"
-	"io"
-	"io/ioutil"
-	"testing"
-)
-
-func TestBitReader(t *testing.T) {
-	buf := bytes.NewReader([]byte{0xaa})
-	br := newBitReader(buf)
-	if n := br.ReadBits(1); n != 1 {
-		t.Errorf("read 1 wrong")
-	}
-	if n := br.ReadBits(1); n != 0 {
-		t.Errorf("read 2 wrong")
-	}
-	if n := br.ReadBits(1); n != 1 {
-		t.Errorf("read 3 wrong")
-	}
-	if n := br.ReadBits(1); n != 0 {
-		t.Errorf("read 4 wrong")
-	}
-}
-
-func TestBitReaderLarge(t *testing.T) {
-	buf := bytes.NewReader([]byte{0x12, 0x34, 0x56, 0x78})
-	br := newBitReader(buf)
-	if n := br.ReadBits(32); n != 0x12345678 {
-		t.Errorf("got: %x want: %x", n, 0x12345678)
-	}
-}
-
-func readerFromHex(s string) io.Reader {
-	data, err := hex.DecodeString(s)
-	if err != nil {
-		panic("readerFromHex: bad input")
-	}
-	return bytes.NewReader(data)
-}
-
-func decompressHex(s string) (out []byte, err error) {
-	r := NewReader(readerFromHex(s))
-	return ioutil.ReadAll(r)
-}
-
-func TestHelloWorldBZ2(t *testing.T) {
-	out, err := decompressHex(helloWorldBZ2Hex)
-	if err != nil {
-		t.Errorf("error from Read: %s", err)
-		return
-	}
-
-	if !bytes.Equal(helloWorld, out) {
-		t.Errorf("got %x, want %x", out, helloWorld)
-	}
-}
-
-func TestConcat(t *testing.T) {
-	out, err := decompressHex(helloWorldBZ2Hex + helloWorldBZ2Hex)
-	if err != nil {
-		t.Errorf("error from Read: %s", err)
-		return
-	}
-
-	hello2 := bytes.Repeat(helloWorld, 2)
-	if !bytes.Equal(hello2, out) {
-		t.Errorf("got %x, want %x", out, hello2)
-	}
-}
-
-func testZeros(t *testing.T, inHex string, n int) {
-	out, err := decompressHex(inHex)
-	if err != nil {
-		t.Errorf("error from Read: %s", err)
-		return
-	}
-
-	expected := make([]byte, n)
-
-	if !bytes.Equal(expected, out) {
-		allZeros := true
-		for _, b := range out {
-			if b != 0 {
-				allZeros = false
-				break
-			}
-		}
-		t.Errorf("incorrect result, got %d bytes (allZeros: %t)", len(out), allZeros)
-	}
-}
-
-func Test32Zeros(t *testing.T) {
-	testZeros(t, thirtyTwoZerosBZ2Hex, 32)
-}
-
-func Test1MBZeros(t *testing.T) {
-	testZeros(t, oneMBZerosBZ2Hex, 1024*1024)
-}
-
-func testRandomData(t *testing.T, compressedHex, uncompressedHex string) {
-	out, err := decompressHex(compressedHex)
-	if err != nil {
-		t.Errorf("error from Read: %s", err)
-		return
-	}
-
-	expected, _ := hex.DecodeString(uncompressedHex)
-
-	if !bytes.Equal(out, expected) {
-		t.Errorf("incorrect result\ngot:  %x\nwant: %x", out, expected)
-	}
-}
-
-func TestRandomData1(t *testing.T) {
-	testRandomData(t, randBZ2Hex, randHex)
-}
-
-func TestRandomData2(t *testing.T) {
-	// This test involves several repeated bytes in the output, but they
-	// should trigger RLE decoding.
-	testRandomData(t, rand2BZ2Hex, rand2Hex)
-}
-
-func TestRandomData3(t *testing.T) {
-	// This test uses the full range of symbols.
-	testRandomData(t, rand3BZ2Hex, rand3Hex)
-}
-
-func Test1MBSawtooth(t *testing.T) {
-	out, err := decompressHex(oneMBSawtoothBZ2Hex)
-	if err != nil {
-		t.Errorf("error from Read: %s", err)
-		return
-	}
-
-	expected := make([]byte, 1024*1024)
-
-	for i := range expected {
-		expected[i] = byte(i)
-	}
-
-	if !bytes.Equal(out, expected) {
-		t.Error("incorrect result")
-	}
-}
-
-const helloWorldBZ2Hex = "425a68393141592653594eece83600000251800010400006449080200031064c4101a7a9a580bb9431f8bb9229c28482776741b0"
-
-var helloWorld = []byte("hello world\n")
-
-const thirtyTwoZerosBZ2Hex = "425a6839314159265359b5aa5098000000600040000004200021008283177245385090b5aa5098"
-const oneMBZerosBZ2Hex = "425a683931415926535938571ce50008084000c0040008200030cc0529a60806c4201e2ee48a70a12070ae39ca"
-
-const randBZ2Hex = "425a6839314159265359905d990d0001957fffffffffffafffffffffffffffffbfff6fffdfffffffffffffffffffffffffffffc002b6dd75676ed5b77720098320d11a64626981323d4da47a83131a13d09e8040f534cd4f4d27a464d193008cd09804601347a980026350c9886234d36864193d1351b44c136919e90340d26127a4cd264c32023009898981310c0344c340027a8303427a99a04c00003534c230d034f5006468d268cf54d36a3009a69a62626261311b40026013d34201a6934c9a604c98ca6c8460989fa9346234d30d3469a2604fd4131a7aa6d0046043d4c62098479269e89e835190d018d4c046001a11e801a0264792321932308c43a130688c260d46686804cd01a9e80981193684c6a68c00000004c4c20c04627a4c0000260003400d04c0681a01334026009a6f48041466132581ec5212b081d96b0effc16543e2228b052fcd30f2567ee8d970e0f10aabca68dd8270591c376cfc1baae0dba00aaff2d6caf6b211322c997cc18eaee5927f75185336bf907021324c71626c1dd20e22b9b0977f05d0f901eaa51db9fbaf7c603b4c87bc82890e6dd7e61d0079e27ec050dd788fd958152061cd01e222f9547cb9efc465d775b6fc98bac7d387bffd151ae09dadf19494f7a638e2eae58e550faba5fe6820ea520eb986096de4e527d80def3ba625e71fbefdcf7e7844e0a25d29b52dcd1344fca083737d42692aab38d230485f3c8ed54c2ed31f15cf0270c8143765b10b92157233fa1dfe0d7ce8ffe70b8b8f7250071701dfe9f1c94de362c9031455951c93eb098a6b50ee45c6131fefc3b6f9643e21f4adc59497138e246f5c57d834aa67c4f10d8bd8b3908d8130dd7388409c299a268eab3664fa4907c5c31574874bd8d388a4ab22b339660804e53e1b8d05867d40e3082560608d35d5d2c6054e8bab23da28f61f83efd41d25529ad6ea15fb50505cacfabb0902166427354ca3830a2c8415f21b19e592690fbe447020d685a4bcd16ecc4ff1a1c0e572627d0ef6265c008a43fc243240541061ed7840606be466d1c0dac2c53250ed567507d926c844154560d631960c65e15157829b2c7f16859f111a3a8cb72bf24ffa57a680c3be67b1be67c8dd8aea73ac2437a78df5b686d427080ebc01bd30b71a49f6ea31dc0f08e4849e38face96717690239538bc08b6cc5aa8d467cb9c36aa83d40ac7e58bddbfa185b22065e89a86c0145569d9e23726651aec49e31588d70f40fe9a4449dcf4f89eac220171e9c938e803dc195679651004b79ad33cc0c13aeeba5941b33ffeeb8fbe16e76c7811445c67b4269c90479433ddf9e8ed1d00c166b6c17217fb22c3ef1b0c1c7e28e185446a111c37f1ea6c07a59fbcc6546ecc6968d36ba58bc5489a5640647e426b0c39350cb6f07d5dc7a717648c4ec7f841467597ae1f65f408fd2d9940a4b1b860b3c9ae351dcae0b4425f7e8538710f2e40b7f70d13b51ac05ccc6ecda8264a88cad2d721d18132a9b9110a9e759c2483c77dcefc7e464ec88588174cb0c9abff93230ea0bed8decdd8ed8bfe2b5df0a253803678df04fab44c03b9ab7cc97d6e6d6fd0c4c840ce0efc498436f453bbb181603459471f2b588724592b222ec990614db530e10cadd84705621cfdd9261fa44a5f5806a2d74b575056b3c915255c65678f9c16e6dc00a99180fef1a840aff0e842ac02731080cc92782538360a60a727991013984da4fad95f79d5030677b7528d076b2483685fca4429edf804682fdc110dfc2f7c30e23e20a72e039108a0ad6fdee2f76985a4b4be4f5afc6101bf9d5042b657a05dc914e1424241766434"
-const randHex = "c95138082bdf2b9bfa5b1072b23f729735d42c785eeb94320fb14c265b9c2ca421d01a3db986df1ac2acde5a0e6bf955d6f95e61261540905928e195f1a66644cc7f37281744fff4dc6df35566a494c41a8167151950eb74f5fc45f85ad0e5ed28b49adfe218aa7ec1707e8e1d55825f61f72beda3b4c006b8c9188d7336a5d875329b1b58c27cc4e89ecbae02c7712400c39dd131d2c6de82e2863da51d472bdfb21ecce62cc9cf769ed28aedc7583d755da45a0d90874bda269dd53283a9bdfd05f95fc8e9a304bb338ea1a2111894678c18134f17d31a15d9bfc1237894650f3e715e2548639ecbddb845cfe4a46a7b3a3c540f48629488e8c869f1e9f3f4c552243a8105b20eb8e264994214349dae83b165fd6c2a5b8e83fce09fc0a80d3281c8d53a9a08095bd19cbc1388df23975646ed259e003d39261ee68cbece8bcf32971f7fe7e588e8ba8f5e8597909abaea693836a79a1964050ed910a45a0f13a58cd2d3ae18992c5b23082407fd920d0bf01e33118a017bb5e39f44931346845af52128f7965206759433a346034ea481671f501280067567619f5ecef6cded077f92ed7f3b3ce8e308c80f34ba06939e9303f91b4318c8c1dd4cc223c1f057ac0c91211c629cd30e46ee9ec1d9fd493086b7bc2bc83e33f08749a5d430b0ed4f79d70f481940c9b0930b16321886a0df4fa5a1465d5208c7d3494a7987d9a5e42aa256f0c9523947f8318d0ef0af3d59a45cfc2418d0785c9a548b32b81e7de18be7d55a69a4c156bbb3d7579c0ac8e9c72b24646e54b0d0e8725f8f49fb44ae3c6b9d0287be118586255a90a4a83483ed0328518037e52aa959c5748ed83e13023e532306be98b8288da306bbb040bcf5d92176f84a9306dc6b274b040370b61d71fde58dd6d20e6fee348eae0c54bd0a5a487b2d005f329794f2a902c296af0a4c1f638f63292a1fa18e006c1b1838636f4de71c73635b25660d32e88a0917e1a5677f6a02ca65585b82cbd99fb4badbfa97a585da1e6cadf6737b4ec6ca33f245d66ee6a9fae6785d69b003c17b9fc6ec34fe5824ab8caae5e8e14dc6f9e116e7bf4a60c04388783c8ae929e1b46b3ef3bbe81b38f2fa6da771bf39dfba2374d3d2ed356b8e2c42081d885a91a3afb2f31986d2f9873354c48cf5448492c32e62385af423aa4f83db6d1b2669650379a1134b0a04cbca0862d6f9743c791cbb527d36cd5d1f0fc7f503831c8bd1b7a0ef8ae1a5ed1155dfdd9e32b6bb33138112d3d476b802179cb85a2a6c354ccfed2f31604fbd8d6ec4baf9f1c8454f72c6588c06a7df3178c43a6970bfa02dd6f74cb5ec3b63f9eddaa17db5cbf27fac6de8e57c384afd0954179f7b5690c3bee42abc4fa79b4b12101a9cf5f0b9aecdda945def0bd04163237247d3539850e123fe18139f316fa0256d5bd2faa8"
-
-const oneMBSawtoothBZ2Hex = "425a683931415926535971931ea00006ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe007de00000000000000024c00130001300000000000000000000000000000000000000000000000000000000126000980009800000000000000000000000000000000000000000000000000000000930004c0004c000000000000000000000000000000000000000000000000000000004980026000260000000000000000000000000000000000000000000000000000000009aaaaa0000000000000000000000000000000000000000000000000000000000000000498002600026000000000000000000000000000000000000000000000000000000007fc42271980d044c0a822607411304a08982d044c1a82260f411308a08984d044c2a82261741130ca08986d044c3a82261f411310a08988d044c4a822627411314a0898ad044c5a82262f411318a0898cd044c6a82263741131ca0898ed044c7a82263f411320a08990d044c8a822647411324a08992d044c9a82264f411328a08994d044caa82265741132ca08996d044cba82265f411330a08998d044cca822667411334a0899ad044cda82266f411338a0899cd044cea82267741133ca0899ed044cfa82267f411340a089a0d044d0a822687411344a089a2d044d1a82268f411348a089a4d044d2a82269741134ca089a6d044d3a82269f411350a089a8d044d4a8226a7411354a089aad044d5a8226af411358a089acd044d6a8226b741135ca089aed044d7a8226bf411360a089b0d044d8a8226c7411364a089b2d044d9a8226cf411368a089b4d044daa8226d741136ca089b6d044dba8226df411370a089b8d044dca8226e7411374a089bad044dda8226ef411378a089bcd044dea8226f741137ca089bed044dfa8226ff411380a089c0d044e0a822707411384a089c2d044e1a82270f411388a089c4d044e2a82271741138ca089c59089c69089c71089c79089c81089c89089c91089c99089ca1089ca9089cb1089cb9089cc1089cc9089cd1089cd9089ce1089ce9089cf1089cf9089d01089d09089d11089d19089d21089d29089d31089d39089d41089d49089d51089d59089d61089d69089d71089d79089d81089d89089d91089d99089da1089da9089db1089db9089dc1089dc9089dd1089dd9089de1089de9089df1089df9089e01089e09089e11089e19089e21089e29089e31089e39089e41089e49089e51089e59089e61089e69089e71089e79089e81089e89089e91089e99089ea1089ea9089eb1089eb9089ec1089ec9089ed1089ed9089ee1089ee9089ef1089ef9089f01089f09089f11089f19089f21089f29089f31089f39089f41089f49089f51089f59089f61089f69089f71089f79089f81089f89089f91089f99089fa1089fa9089fb1089fb9089fc1089fc9089fd1089fd9089fe1089fe9089ff1089ff98a0ac9329acf23ba884804fdd3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0034f800000000000024c00130001300000000000000000000000000000000000000000000000000000000126000980009800000000000000000000000000000000000000000000000000000000930004c0004c000000000000000000000000000000000000000000000000000000004980026000260000000000000000000000000000000000000000000000000000000024c0013000130000000000000000000000000000000000000000000000000000000002955540000000000000000000000000000000000000000000000000000000000000001ff108c00846024230221181908c108460a4230621183908c20846124230a21185908c308461a4230e21187908c40846224231221189908c508462a423162118b908c60846324231a2118d908c708463a4231e2118f908c80846424232221191908c908464a4232621193908ca0846524232a21195908cb08465a4232e21197908cc0846624233221199908cd08466a423362119b908ce0846724233a2119d908cf08467a4233e2119f908d008468242342211a1908d108468a42346211a3908d20846924234a211a5908d308469a4234e211a7908d40846a242352211a9908d50846aa42356211ab908d60846b24235a211ad908d70846ba4235e211af908d80846c242362211b1908d90846ca42366211b3908da0846d24236a211b5908db0846da4236e211b7908dc0846e242372211b9908dd0846ea42376211bb908de0846f24237a211bd908df0846fa4237e211bf908e008470242382211c1908e108470a42386211c3908e20847124238a211c5908e2f8c211c6c8471d211c7c84721211c8c84725211c9c84729211cac8472d211cbc84731211ccc84735211cdc84739211cec8473d211cfc84741211d0c84745211d1c84749211d2c8474d211d3c84751211d4c84755211d5c84759211d6c8475d211d7c84761211d8c84765211d9c84769211dac8476d211dbc84771211dcc84775211ddc84779211dec8477d211dfc84781211e0c84785211e1c84789211e2c8478d211e3c84791211e4c84795211e5c84799211e6c8479d211e7c847a1211e8c847a5211e9c847a9211eac847ad211ebc847b1211ecc847b5211edc847b9211eec847bd211efc847c1211f0c847c5211f1c847c9211f2c847cd211f3c847d1211f4c847d5211f5c847d9211f6c847dd211f7c847e1211f8c847e5211f9c847e9211fac847ed211fbc847f1211fcc847f5211fdc847f9211fec847fd211ff8bb9229c284803a8b6248"
-
-const rand2BZ2Hex = "425a6839314159265359d992d0f60000137dfe84020310091c1e280e100e042801099210094806c0110002e70806402000546034000034000000f2830000032000d3403264049270eb7a9280d308ca06ad28f6981bee1bf8160727c7364510d73a1e123083421b63f031f63993a0f40051fbf177245385090d992d0f60"
-const rand2Hex = "92d5652616ac444a4a04af1a8a3964aca0450d43d6cf233bd03233f4ba92f8719e6c2a2bd4f5f88db07ecd0da3a33b263483db9b2c158786ad6363be35d17335ba"
-
-const rand3BZ2Hex = "425a68393141592653593be669d00000327ffffffffffffffffffffffffffffffffffff7ffffffffffffffffffffffffffffffc002b3b2b1b6e2bae400004c00132300004c0d268c004c08c0130026001a008683234c0684c34008c230261a04c0260064d07a8d00034000d27a1268c9931a8d327a3427a41faa69ea0da264c1a34219326869b51b49a6469a3268c689fa53269a62794687a9a68f5189994c9e487a8f534fd49a3d34043629e8c93d04da4f4648d30d4f44d3234c4d3023d0840680984d309934c234d3131a000640984f536a6132601300130130c8d00d04d1841ea7a8d31a02609b40023460010c01a34d4c1a0d04d3069306810034d0d0d4c0046130d034d0131a9a64d321804c68003400098344c13000991808c0001a00000000098004d3d4da4604c47a13012140aadf8d673c922c607ef6212a8c0403adea4b28aee578900e653b9cdeb8d11e6b838815f3ebaad5a01c5408d84a332170aff8734d4e06612d3c2889f31925fb89e33561f5100ae89b1f7047102e729373d3667e58d73aaa80fa7be368a1cc2dadd81d81ec8e1b504bd772ca31d03649269b01ceddaca07bf3d4eba24de141be3f86f93601e03714c0f64654671684f9f9528626fd4e1b76753dc0c54b842486b8d59d8ab314e86ca818e7a1f079463cbbd70d9b79b283c7edc419406311022e4be98c2c1374df9cdde2d008ce1d00e5f06ad1024baf555631f70831fc1023034e62be7c4bcb648caf276963ffa20e96bb50377fe1c113da0db4625b50741c35a058edb009c6ee5dbf93b8a6b060eec568180e8db791b82aab96cbf4326ca98361461379425ba8dcc347be670bdba7641883e5526ae3d833f6e9cb9bac9557747c79e206151072f7f0071dff3880411846f66bf4075c7462f302b53cb3400a74cf35652ad5641ed33572fd54e7ed7f85f58a0acba89327e7c6be5c58cb71528b99df2431f1d0358f8d28d81d95292da631fb06701decabb205fac59ff0fb1df536afc681eece6ea658c4d9eaa45f1342aa1ff70bdaff2ddaf25ec88c22f12829a0553db1ec2505554cb17d7b282e213a5a2aa30431ded2bce665bb199d023840832fedb2c0c350a27291407ff77440792872137df281592e82076a05c64c345ffb058c64f7f7c207ef78420b7010520610f17e302cc4dfcfaef72a0ed091aab4b541eb0531bbe941ca2f792bf7b31ca6162882b68054a8470115bc2c19f2df2023f7800432b39b04d3a304e8085ba3f1f0ca5b1ba4d38d339e6084de979cdea6d0e244c6c9fa0366bd890621e3d30846f5e8497e21597b8f29bbf52c961a485dfbea647600da0fc1f25ce4d203a8352ece310c39073525044e7ac46acf2ed9120bae1b4f6f02364abfe343f80b290983160c103557af1c68416480d024cc31b6c06cfec011456f1e95c420a12b48b1c3fe220c2879a982fb099948ac440db844b9a112a5188c7783fd3b19593290785f908d95c9db4b280bafe89c1313aeec24772046d9bc089645f0d182a21184e143823c5f52de50e5d7e98d3d7ab56f5413bbccd1415c9bcff707def475b643fb7f29842582104d4cc1dbaaca8f10a2f44273c339e0984f2b1e06ab2f0771db01fafa8142298345f3196f23e5847bda024034b6f59b11c29e981c881456e40d211929fd4f766200258aad8212016322bd5c605790dcfdf1bd2a93d99c9b8f498722d311d7eae7ff420496a31804c55f4759a7b13aaaf5f7ce006c3a8a998897d5e0a504398c2b627852545baf440798bcc5cc049357cf3f17d9771e4528a1af3d77dc794a11346e1bdf5efe37a405b127b4c43b616d61fbc5dc914e14240ef99a7400"
-const rand3Hex = "1744b384d68c042371244e13500d4bfb98c6244e3d71a5b700224420b59c593553f33bd786e3d0ce31626f511bc985f59d1a88aa38ba8ad6218d306abee60dd9172540232b95be1af146c69e72e5fde667a090dc3f93bdc5c5af0ab80acdbaa7a505f628c59dc0247b31a439cacf5010a94376d71521df08c178b02fb96fdb1809144ea38c68536187c53201fea8631fb0a880b4451ccdca7cc61f6aafca21cc7449d920599db61789ac3b1e164b3390124f95022aeea39ccca3ec1053f4fa10de2978e2861ea58e477085c2220021a0927aa94c5d0006b5055abba340e4f9eba22e969978dfd18e278a8b89d877328ae34268bc0174cfe211954c0036f078025217d1269fac1932a03b05a0b616012271bbe1fb554171c7a59b196d8a4479f45a77931b5d97aaf6c0c673cbe597b79b96e2a0c1eae2e66e46ccc8c85798e23ffe972ebdaa3f6caea243c004e60321eb47cd79137d78fd0613be606feacc5b3637bdc96a89c13746db8cad886f3ccf912b2178c823bcac395f06d28080269bdca2debf3419c66c690fd1adcfbd53e32e79443d7a42511a84cb22ca94fffad9149275a075b2f8ae0b021dcde9bf62b102db920733b897560518b06e1ad7f4b03458493ddaa7f4fa2c1609f7a1735aeeb1b3e2cea3ab45fc376323cc91873b7e9c90d07c192e38d3f5dfc9bfab1fd821c854da9e607ea596c391c7ec4161c6c4493929a8176badaa5a5af7211c623f29643a937677d3df0da9266181b7c4da5dd40376db677fe8f4a1dc456adf6f33c1e37cec471dd318c2647644fe52f93707a77da7d1702380a80e14cc0fdce7bf2eed48a529090bae0388ee277ce6c7018c5fb00b88362554362205c641f0d0fab94fd5b8357b5ff08b207fee023709bc126ec90cfb17c006754638f8186aaeb1265e80be0c1189ec07d01d5f6f96cb9ce82744147d18490de7dc72862f42f024a16968891a356f5e7e0e695d8c933ba5b5e43ad4c4ade5399bc2cae9bb6189b7870d7f22956194d277f28b10e01c10c6ffe3e065f7e2d6d056aa790db5649ca84dc64c35566c0af1b68c32b5b7874aaa66467afa44f40e9a0846a07ae75360a641dd2acc69d93219b2891f190621511e62a27f5e4fbe641ece1fa234fc7e9a74f48d2a760d82160d9540f649256b169d1fed6fbefdc491126530f3cbad7913e19fbd7aa53b1e243fbf28d5f38c10ebd77c8b986775975cc1d619efb27cdcd733fa1ca36cffe9c0a33cc9f02463c91a886601fd349efee85ef1462065ef9bd2c8f533220ad93138b8382d5938103ab25b2d9af8ae106e1211eb9b18793fba033900c809c02cd6d17e2f3e6fc84dae873411f8e87c3f0a8f1765b7825d185ce3730f299c3028d4a62da9ee95c2b870fb70c79370d485f9d5d9acb78926d20444033d960524d2776dc31988ec7c0dbf23b9905d"
-
-const (
-	digits = iota
-	twain
-)
-
-var testfiles = []string{
-	// Digits is the digits of the irrational number e. Its decimal representation
-	// does not repeat, but there are only 10 possible digits, so it should be
-	// reasonably compressible.
-	digits: "testdata/e.txt.bz2",
-	// Twain is Project Gutenberg's edition of Mark Twain's classic English novel.
-	twain: "testdata/Mark.Twain-Tom.Sawyer.txt.bz2",
-}
-
-func benchmarkDecode(b *testing.B, testfile int) {
-	compressed, err := ioutil.ReadFile(testfiles[testfile])
-	if err != nil {
-		b.Fatal(err)
-	}
-	b.SetBytes(int64(len(compressed)))
-	for i := 0; i < b.N; i++ {
-		r := bytes.NewReader(compressed)
-		io.Copy(ioutil.Discard, NewReader(r))
-	}
-}
-
-func BenchmarkDecodeDigits(b *testing.B) { benchmarkDecode(b, digits) }
-func BenchmarkDecodeTwain(b *testing.B)  { benchmarkDecode(b, twain) }
-
-func TestBufferOverrun(t *testing.T) {
-	// Tests https://golang.org/issue/5747.
-	buffer := bytes.NewReader([]byte(bufferOverrunBase64))
-	decoder := base64.NewDecoder(base64.StdEncoding, buffer)
-	decompressor := NewReader(decoder)
-	// This shouldn't panic.
-	ioutil.ReadAll(decompressor)
-}
-
-func TestOutOfRangeSelector(t *testing.T) {
-	// Tests https://golang.org/issue/8363.
-	buffer := bytes.NewReader(outOfRangeSelector)
-	decompressor := NewReader(buffer)
-	// This shouldn't panic.
-	ioutil.ReadAll(decompressor)
-}
-
-func TestMTF(t *testing.T) {
-	mtf := newMTFDecoderWithRange(5)
-
-	// 0 1 2 3 4
-	expect := byte(1)
-	x := mtf.Decode(1)
-	if x != expect {
-		t.Errorf("expected %v, got %v", expect, x)
-	}
-
-	// 1 0 2 3 4
-	x = mtf.Decode(0)
-	if x != expect {
-		t.Errorf("expected %v, got %v", expect, x)
-	}
-
-	// 1 0 2 3 4
-	expect = byte(0)
-	x = mtf.Decode(1)
-	if x != expect {
-		t.Errorf("expected %v, got %v", expect, x)
-	}
-
-	// 0 1 2 3 4
-	expect = byte(4)
-	x = mtf.Decode(4)
-	if x != expect {
-		t.Errorf("expected %v, got %v", expect, x)
-	}
-
-	// 4 0 1 2 3
-	expect = byte(0)
-	x = mtf.Decode(1)
-	if x != expect {
-		t.Errorf("expected %v, got %v", expect, x)
-	}
-}
-
-var bufferOverrunBase64 string = `
-QlpoNTFBWSZTWTzyiGcACMP/////////////////////////////////3/7f3///
-////4N/fCZODak2Xo44GIHZgkGzDRbFAuwAAKoFV7T6AO6qwA6APb6s2rOoAkAAD
-oACUoDtndh0iQAPkAAAAaPWihQoCgr5t97Obju21ChQB0NBm3RbA7apXrRoBooAA
-AhA+IAHWl2Us3O7t9yieb3udvd76+4+fd33nd3HO1bVvfcGRne6+3vfPvfc++995
-w7k973eJhasLVec970tzDNXdX28LoPXZ3H3K9z0s5ufWAfes49d5594c3dUYtI+2
-+h1dvtpRa+uvrVEAG9bl893RVEN7cWvroSqWjPMGgAQi7Gq8TJSgKKdjKFBIB9Ae
-LqWxleu715eXe7ml9e5098Z6G1vr7t1QZ6ot76YzPd3j7333t2ql2Chm7XrA9ICQ
-VF77z3rVBWqkSXtlfb099hyezAr6USbGpICTSCFAaqHrKo+tUnm32rpE4Ue+t2mj
-bKUeipEqwc93EdhhTwmQpOhhesC9iqDSPNTWYNSnUtBdm1nsA0nqqNd7OWwDXtFL
-ONmmA6Ubke26I9UblvWIPR5VOWOnctai443URunnDy77uVC59OfRvezlDu33Z7Ly
-3NNuuHW63088xu3t3NHZhkZbG7tXRlj00qOtbaXTJUUdspTbABR9R6EUwQAEAAAA
-EMEwRpoAAAABMmhoAAjBNNAaCMhponpoGpgJpk9TEyp6niGKZkAaAEfqMQ09U80p
-+pMGSCKngIAAAAgAAg0AAJhGgABGCEaaTyTKeNI1PE0wkj01GajMSNPSZGnqbU9T
-anlPUNAHqGQ0DQAMg9TamgAAYRU/IAAICAmjQJgjQBMEwp5DTSaaYmhTeqfplPID
-U1T9TynoU82pT1NPU/VP0j1NHqRpk9TTR7SnqaNNGmmQAaAD1Aeo0PSAAAAaaBiK
-eBAQBGgIABGQA0AmBNNBoaAgaJmpglPEyYap6npiTT0agGjJjUaaDTQAAAAAAM1A
-9QAaAAAADU8iEAQAEyAJk0NNNJgIZTJ5E00YSemiaZNGm1MpGNJ+lPU9qm9U2RDM
-oY0EzJB6h6nqDID1NMBDDRpo1AGNAjCMmhkMgaYSJIgAAAQyAAEyBoATECCNhTT0
-U/IZAmCM1DSTxkzUE8p6NDaGiZGJqntTFHvUyU9qPQp7Kn5GgKNPU9QAGg9QAAA3
-wz0Pk/g/m/m9P9H4vxv2+dH3gCS8nhbbbbbYxtgNsBsG0m2MbG0NNtsbYNsaY0wb
-bBibGmm22mxptNpsaGNDTY02JsG0MY0xg2MaYNNDbGwG0L5vsK/F9DO+EAA447Kq
-p7Wdf6Y+5c20T7DfHyMXIzRKrZexw72uiQI+y55vOe52xpqbCLC2uR20JdER7Zvr
-7ufuKb6zhiBxLuj0eA27v8RpMLucw9Ohwcizi2wrpt+yU1FdpM7ZYPcwS3XTef+A
-Wzjxwhdrgw3aH1LeC1eZW900x8V9Nv4hTPXp4l067P/4ANVZFF/imOe/d5bdueam
-/DFFokQWnFaU+ZqLBCM+d0PialJQWnLqRQZk/KhfbbYc2pCUTgffcSYbrCM1N+8l
-HU6gSz+h2GJXs+tbrNviL83M97X0vcTn/F82P8wen8/3/h3sHY+sf9CSej9ThYTV
-3lQ+FUHpfpGD4kv7dYMV995dpDX/y3xR8FoXx1bjUxBTNxuutwQ/h/Eedn9wpn6w
-E3+ND8YhN1HSriIxRE/6uFyMv6/oC6Elarw3aHMMqHJkGiiz6tejmvnYLQa+Qm6G
-deZ7jXTZV6NlpocgDnRdimS06bTYSkvPAL/xoWNLkX6N6VljU0dfKSBmm2uZE/xu
-sutQ1EdP7GdjhglIq4xlOFUFEQpmX+xx7R8y6c0GSAaqusOjNZwxZRudOvmXm1tZ
-T+YnbeB2ir9eiHNrtJNSLD/J/WDyuQpwBUtLKo0krccY/wIILP7f86teb9Z/9oyz
-OX05qEWbObfhpRw+9+rCvp/35ML8KX3aHaI0n+tudbFRsV5FLW+Oa8ruLN4peyVL
-DWjTHrXNthq/s7zAJYMeFJZkZt5mT9rfpH+5g3nc+piOSZ+J5nHtOnKI7Ff8Xl+j
-0t76XTNucCHQ6whav1OHdF53TY5wuv5OzvrdnxoId8fTyUvERr0ERINu/8XxZZ5f
-B5/kTZ8bBO0wv54Jp+ED/GQI8lZHzIQCP3vfQhwnCTj9TvITic7P4mYLDbH3fyzR
-i+6EajCcpXLWSGf+ZXkOrWspDWDhXtEKas0v3UqWksqgY1rTj45krX4KihN+daXs
-pZl5WPlta5p06CX6Xm2SfzqkMw12/3ix1bpnnZ+kFeBNX7A+E9zzG6OZaN78GOpl
-9Ht/eZn9PqWdav852zr0zqkDK2H5IjdvNah+b1YVGdQGzwR4Nw+f13yEKnV+y66W
-djfq7zWp7m5w+hzfv+Ly8O7oet5Vvd8/wQvO7qzOZ2vjf9X8Tj8PnMb/nc/nKqRR
-+ml4UEhOOwfCeJEEI109CMYSh91iAJqPjMyH6KjrPD7W25llZVcREYNCTg6htbQt
-M38wYoquCWP6tdKYlVIv14xTNUeUf4El/FunCf6csZkmv+9tfWx7t59wuKIa3saU
-tZs9M+3HFOZtz3OLg/Unoaj9BYazYqA78xBU9tZzrtmF/rQL9CGJt90o/oYnSfcS
-SL3haaw351LXWQ1XOsv1SmH3v6ymuxEpPPnEDmBELaTYsvvMIWJsmPZFFww++Kd7
-s/Jo0JFeUU7uNtI+gVosAIpVVuWfI/9tOIycz7I5Z7zjV+NR2OuZbYtW5F08KX4o
-2k/xuJIchcNFPtxPfw9dkDgscRbMckyFMrzuZ3IvrcGzk0J6iI5ytrv37bGpAXMz
-WK9mMMPebepNevmLjjo/QWoM968Sjv7ldlPS5AinHcXwsFv6dmmh8lJt7UOJWoKu
-lMD1cB2ksIGpMdv8iuqR42Rn/kn+17BhhUZcwDBaUXVdX6bKW7fxlUYbq+mlqIcf
-a9v8HF87M9ANbi9bq9onf9TD7nQ6Xf6vZci8TBPX+/GI0He6j31fTVQYW+NsQxvO
-J8xrx+e58CCLQNjxeIyPt+F+qk/QMiXw+LyxGVkV/XcGQT9X03jSDP6beJ5QG1JW
-9Q3qLv/YixWI7gPV9Mrhf2oRYTc/9KLFRhkE3SjKOTKuSSBKQ24fI+hEznamH71D
-66Hwez8/0et7AtTv9zvamv2OD5He6fMV4k+ePl6+qPfO5CdHtK+eCDZL5+4f5yrl
-gTcRFiq8fXbc5IaI5fbbc1KMM/2T0Mr7+Hwaco6FtXm0fmhCgTZRqY4pKiEIfmaz
-QwHNOOCrtMJ2VwsyMumt7xsOolGnizRev6lILH43qPcczQM7Gc5zRin80YvFt1Qm
-h/57Z0auR2h0fuX50MBO4XQ+26y5l6v4j902R66c0j3z2KHstKQ04J/h6LbuNQE4
-D6cu/lyfK69DxxX8wb8XaQkMUcJdo1LzqUGDAb3Kfn/A3P/JYc99MO9qv67+SxWb
-wYTyqKdWTd+1KbR/Rcn0Io5zI/QquX7FA1bxfMytjQ/X+l0fh0Pf+Hx97meH4fQL
-7/T8/sdTm9Tn8nELvedyhydLlPPTScINdXyLIq9wgIJr4fWPbp9ZhFh/56fdSgOG
-HDXg+gkXsN2Rddr4HQ5P3u+RhLzmSjhzoqY5EsPC4QvRlX9JXjB84rPV5USR66qa
-/kjw4156GJnzoXtydKJE53t6PHfZWO+3ujsfI6iAdshc7OFzGXiZB9PtItKodhYq
-nABkTKdcpu4+TOpf9h5piX5slsaBjkeTnj/Ba02ilboQfcDVigxrYn/iTH5ySWUW
-/lHtg78s5UZM8sErwhNe3N3w+6ZOMnU+5i86/xFNtqZfDdXTGy1H3PzGbdtZXYT+
-Ixx2vpwBYzbPVYHxKosM5rPiVmcTllI9nuoSfeh9ib4foFWauOpvdmhBDqpTpKTX
-u8EO2l2Z195G2RIV7TlKSxGWjR5sl/nALu1uzBeLd9zpSujzMTd1uTX9Qk/Q1S+r
-vaW6bm8qqPO4jb6Wx6XIkm321nrIF6Ae25d1+Dpv/P5G4NoLd2j6/EtENC3FeR5z
-oo7bA+tI8yEQRhiF0z1FlJXLD5ZbhNNWQm/j/IbzRfh8JtOFZU7ruShLvHXysW9S
-9V909tr9jn8/E/Hb5N/1NVNHnZu2HIUvJvHJiHd2ucmeI9PWUMnppmE65GQ5E9xV
-ZRlGEH0X85EvmHyEupkMrCC0oMv9RCq+/H8gcfpe00Hs/S+regT5p58cyYomh93v
-qvuw/A06BE/wzJESuYbN9pqYpoXqXFemW1NksHEJ2w+PYMJ27WJyD5FpaXB85VaW
-qMOhDfO8E3QdH8ybyKt/UgI8/tDGpFbyOlaVdIv1FXJhoLp8soAA4Djg6/KZ066N
-ZFYuS8WdjpSZGP4/Lw+1yaXlzNznc/k2uHe2uXP3uFuPcHx+Dm44utxldoO1uBPy
-+jzOs14+MIgOjOHMVNqAbMd8fUedLlhJMCfMtm4uz01enLNKcMrtLlPIR37Yukh1
-YEMXYpm7eU4XU+j+Jj3pDyaXtXs+p1fWfTN/cy9/Oxs4umUXQ4uHh1kObtayDJ56
-/QMxiHobjHNKuKfMxsrYEwN+QVIyVjAwMDYuMjQ1AAA9IwJniiBLRkZDAAAXt0Ja
-aDQxQVkmU1lZtwytAACLf///////////////////+//////v//////////bv78//
-/+AXO133uwO2xB2UxIvbKXrCqCoURUBL2ytFI82AFdcOwMhVTHtk5rD3szEVNYD4
-aIQINCaMRoTaSn7SbSMJiYmEwieTEp+psqbMCp+VNPaFNpqbBNR7UmanlPUeKfqm
-j1PU0/VPU08o9Q9EeKHlPJtKbYqeTCYhN6U9T1NH6mp+lPyoGNTI/Knkyg1MggAg
-CaMEyQnqZoaaRtRtJpppppoDaTR6hpphGh6mmgHpMQBpkGTTEAAaAAAA00AZDag0
-ADIBkGgABqemiRNTI0k8aU0PRGRoAZlP0UAAAGgAAAyAADQaAAAaAAAAAAAAAAAA
-AaAAAAM0kgRBJ5MlPFP1Gj0jTTTUaekxNAbUGjTQMgaZANNAAAAaAADTQAAAAAAA
-ANAA0AAANADQ0QAAAAAAAAAaGgAAAAAAABoA0AAA0AAAAAAAAAAAAANAAAAAkSEI
-aTRpomp5DUxNNDTJPTKaep6T09Kemmo2JG0aTQ9ENogaaGhkABo0NHqaBoDTI0DC
-Gj0gNAMhoDQ9QMQNAGQAaDDwyMPIMlbG1vhRBTFo6JksSupgpAjPbY0ec02IGXjb
-eS+FBsh01+O4ZOaD+srUZCFaT4DRjVDLx7uKIsFtESIDUg1ZkhyCSYov05C00MtR
-BdNNa/AYPGOQZWcs+VegXOPrkushFbZ3mBoRD6WamClkpBaHZrUhUl02bIfRXX4w
-b3/9cW9nHDVxh2qFBxqgRKfmq7/Jc/tdJk05nVrGbckGVy2PnIy30CDhpWmqrSot
-K2bOnX0NbP1iy2cd0Na0ZmbRstm4MzMzbbMySTd35F7f+zPP8DC+NJLYcakkkkRd
-NZlupJt3OMFoDAD2g+N3FAMCydhIpoRHRQAdFI5nNg4ugEXHCYxkMyGCwtaJmial
-y0IMlpSYYM/weXNJAhFqS0GNmvaPEtYGjbvaucMdklOTmBX1vfVAkTYB1uXCSK64
-UNIixOqRKLuRCFtqIQtgwqaFrCkIYbbewErWABa+VGADWsJXJjfx5SJViLuwiGXq
-Ru6vCuwmU5CJiJz3UiBpmLv0r2wskxUhY4tzPVGQ9RMXJl65eLSNwZVwaSyGZ9Cm
-A3jztQUUpFeUryBTskW95iVwRMFrhBCwZBAFJBZvhMEMNoDJJlUoIhQkAkjbExp2
-YZio+ZYeAZUwmH1qUbdQixmxf0+61+aVgJ1hwxsO1yG3hFx4pfjc09ITVht0pG8u
-FtVFhPa1KE0gTRUSVXywkITucqk0Waz5Fs6qJpVHYdNrbYRFxnFsQGY1qmsTLjK6
-4QX5Rddo6krM/Bx9CqIAKq4CzVQYHrmIAd2EBhYmwVYwLvhzKIUrc2EirnGIvyuD
-O4YZDSwsVTA0BpVvUOjDErkCraBoSutcKwUSSLGhVvNYHLz3klgZD++wWsa/swLw
-gvNDY2De+sncOv8X2lq4HD95ZdwPuTIMXCwSbg4RrIqv+L0y6F17pqDecyQYPEj3
-iN/0BBeWZlJAyBMi5U3Q1zAlsK8IlDhaXGmvZrgISq5CfNjmUgxDeMggOKqxu4sI
-OrilS49Lkl1J3u3GjXTuH+rX+4ccyFAQnizCpPClcY77F59j63S6fr5vr+y99tuO
-7Ox7Wg/ljwhdyaK4xMmXczeJbx7x07htJNtC4xcQfAtvzeznLrN6MN/ILIBOI65I
-qIA2D5fHHj1XN4aN6TvOjWDaSbSWqxCSCvXUpzkNJAkWXAuTwF8k5uSJvQj/rVo0
-hAhEMEIYkCRGx9AX+byIuXWlLMbbVeliHNUL5AQYmNwLFu4SkmGD+UWtBMyVHQOQ
-ss0ggoVKSKOBUgnVS6ljt7WE1qXqJJ4QA1pEwYNLEaguEE1LtPNoVr5WzjbSbWPk
-V9OW3y9IneUDLoIV5pAkEFTEFGFVjeTFxtpzBBfGgycBxVCdz8eESBIzsamRchAa
-TQunQH8DHnpfod9QuAuRvc7JBlKUCYmCjMvynLcxIFohxCaYrDvGw4QbXZB7oWQ7
-hpoGlz23ayDfB8NrRRzdilsEQyQniu9ASLQg7RrGZnoTr1ai12IbCEUCGdFq03P5
-nBnRFAGmisQGcyykV9gKtcVMWLhCuVmXg86dndn7slUpRNSSEAU20oaWIm1maFTu
-E0DT4gTbg0nuhjtz3kNOz+i7sBm0bkXjxQWuLqlZEmp60ZTyRZJDUqKSEKg6hqcy
-ERxdU22CSNOO10RYUUiDVpKhPNdKTOIE1thp02sBNoNTFSht8WJtaBQ09qN3jd5r
-dOLX4IA5fevRyCCzDgRXfV4wzik4KROjmxmTMglBySlIMEzcXehnDXCRiZSlvwA2
-0YsIOROcm4UrIRFxJHctJH7OdN5u1aHVHb5UaLHpv48NgmFRE56KTSoaWunqm2st
-S0mrAdOiqcR12PWVbdVRJKcQ0DQuhwlAPcRtpxN3D4kbXJjToSYJIFw406G2CSaK
-jQMIJPZGlQmgyFhoCSzeGS1VSq5SKKQQxs5RqKUcVUNY57YUETb4mXzV84SPngKi
-nsce0mXByZq5BKUA9puHZWLNwQIYuDaJUNgG+E01E3pDYVNLKYQ0hsVesgV5gZY0
-htDsRdGtm0+iGnkN6+Ea9YJtUZNAkx2GgSoix12nTW0avTUfxR3oYcpvZ7IdtABE
-UhBcjG4qZtDZsS1JQHys243vhLaDTSvvTeBiJA2tmokqECTBcSOCAGkAxMKlVAva
-4IsLRaBBqhxDbcGtgdw03mFcLUaFuhtKuuEIEkUleJQwby/zwu9uvvZK4xTV+ECM
-a8lmzxKmqkBggYK1+xPdbmJclm6tSZhE/OSJtCEjs+unJIQkT9hCWgBJqGMS07Eh
-AJNmBiuVEVdTyjkIJkavuZmx2sJF13htgEZUCC23lZFOE6gWbM9WyYNJTM8yCQrb
-0Sx3OQvBML5cRATAQkSQkAJOAhoxpQkNi4ZiEVDbdtJAME0RXNDXGHA3M3Q0mm1o
-IEwbWpaM1DQCSMbGRCAu3iRIQiT6RlBpT1n3tfwvUXz3gIVlx3mEximY/kZW1kNG
-sgEJIrBisaEoGYPJ+1CQUYFBw+eGEHJQBpNHjErXUJY2iWHQ30hXwFBuMSxQ2lB5
-bg+/LX3euG6HsHUB1lFvBvaiaBrITVwkCTa1d0s9CHZCiDZjbWReKyrpPE2oSa7o
-LPrR4BJvys9ttjUpzETSSMxh8vsr9dXTwKBtK+1xCTGDQmNIaE29HmHdS5GSxpya
-MismcAUSEgSxHBrKtgsZzduG7vHZn16l3kFkVITtENIzS2JsiBwFTDlhgexsjBHv
-5HXOYxHBzoSDCcPZ0ctvkY9aS5XpoQuFYkGJgCsqjJZeUMNUEpDSbKcnUc1PifIA
-CbR2UoXawBlspkEBr9HBfvUi/MUakZVOf1WKYrqSaIXce62JOyhJLq3qJBloTA0F
-VbILEtM+heFmNRCFt70GJrExVJri0ArYbCRbADSGDBpBXxxb/6fo+s3C7uaL7RjM
-LV2IQBNrAJrKFeJwTsPnxbAsemirUx2lk1kaxschzdK4TQNJN5wQnolIFg401OZ4
-2na11LnT3lR+1k1TMJhiAjXMk0F1ooHnYlt9LKfJ3ZIOmeY+2l9bUQHWFNGyEyfj
-EAcu3kpGLq0Ez7XOS+EpAASRQTAYMATfVQibHLTT30zG732+pNe9za1JNt8sNJYn
-RjWuJ6jL5ILV0rcd9vT7X9fObvcXitpvJ2XBJE+PhX2HaTkyWeF9pwnlQNrTe9hV
-tzhA+ihZrDrHNmLcQjZbnv/IMubqq8egxY80t5n6vZ6U5TR6U9uZJvai1xtqAyCR
-NWkW52m00rDTEuO6BA4q2RHDWwbETF55rRsWLIgNW9qJCyMHPbTM/dMBmWMQSMxz
-4M2pRzt47SICxA327UqSCEERqMFybmYi3nUxePtLgHYplqRiw4ynMbXd/kiQ0LE0
-PKJSSCXA42ymziCpAxNWflzpzQdJZusahRFr6t6m+4p273/Taj7k+hZyNgBAgXAY
-8F7pTts6orLb8IA6o4TOwkwQYmKvKu9VwMrE7+GUhVIAgY9a8DyQMiDBkEAwh7S1
-KgCBfao8DK1CwSS8Z3WjL5MEgt93z2koUQCD/YxMBppiCMp7SDVSmkkIHptfGpeh
-t+M13Ccv1tavIASFiaQl6rBz3K4N3DSGwNkCibrvEAC0fQirOWnc4NVbcLKpFG1l
-NQXF/eqdT79wq1Mvlap3QSCLhcD2D3fCkKVWid4aSjtp9FOX1Uaf7P9eT93zd9Sv
-mj2yNLRUGzyI/0oONNSzmmkvJ5Cq2X2CdldIWMGZO57RJ8oyATAWTQmRmNkfh0Sx
-uuR/J9oUsomVy1AEntc0dlPivkqBkBqrxU3j5PnWkaI3ZRGc0gg9spCQEISh4xEU
-pMhVrnmDQLfLP8Ouqpx917MAw7hkjQk6BJFTAbXDsz3LSHIxo/gB8qrA1vbvdZZh
-LtR0frJdfdppX8nAQX/TAxOQ8+H6yw8a9i7/zJEfSYIhop59N/fhcWW2F14cj2Xc
-fyHaZ04lTO4uPnly91jwuFPaREuZVp8AxImIhlkxkAN61tWdWG7tEbaCgszh6VIz
-ThFnHo2Vi8SQXPrXCN7J9Tc9ZYiAYqoThV/u6SYsea5aZL8deOvKBQCgZZuIxX1z
-4EnfcqG176vY4VqMBIC4pMJz0WcHJYqN+j7BiwGoMBwExrIdTB7q4XIFLotcIpS0
-1MqyVsesvoQq7WObmGQXdMliMirSLcDuSx8Qy+4pIBgGDIyMp1qbonnGdcHYvU8S
-O0A8s/iua5oFdNZTWvbVI4FUH9sKcLiB3/fIAF+sB4n8q6L+UCfmbPcAo/crQ6b3
-HqhDBMY9J0q/jdz9GNYZ/1fbXdkUqAQKFePhtzJDRBZba27+LPQNMCcrHMq06F1T
-4QmLmkHt7LxB2pAczUO+T2O9bHEw/HWw+dYf2MoRDUw=
-`
-
-var outOfRangeSelector = []byte{
-	0x42, 0x5a, 0x68, 0x39, 0x31, 0x41, 0x59, 0x26,
-	0x53, 0x59, 0x4e, 0xec, 0xe8, 0x36, 0x00, 0x00,
-	0x02, 0x51, 0x80, 0x00, 0x10, 0x40, 0x00, 0x06,
-	0x44, 0x90, 0x80, 0x20, 0x00, 0x31, 0x06, 0x4c,
-	0x41, 0x01, 0xa7, 0xa9, 0xa5, 0x80, 0xbb, 0x94,
-	0x31, 0x17, 0x72, 0x45, 0x38, 0x50, 0x90, 0x00,
-	0x00, 0x00, 0x00,
-}
diff --git a/third_party/gofrontend/libgo/go/compress/bzip2/huffman.go b/third_party/gofrontend/libgo/go/compress/bzip2/huffman.go
deleted file mode 100644
index 75a6223..0000000
--- a/third_party/gofrontend/libgo/go/compress/bzip2/huffman.go
+++ /dev/null
@@ -1,251 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bzip2
-
-import "sort"
-
-// A huffmanTree is a binary tree which is navigated, bit-by-bit to reach a
-// symbol.
-type huffmanTree struct {
-	// nodes contains all the non-leaf nodes in the tree. nodes[0] is the
-	// root of the tree and nextNode contains the index of the next element
-	// of nodes to use when the tree is being constructed.
-	nodes    []huffmanNode
-	nextNode int
-}
-
-// A huffmanNode is a node in the tree. left and right contain indexes into the
-// nodes slice of the tree. If left or right is invalidNodeValue then the child
-// is a left node and its value is in leftValue/rightValue.
-//
-// The symbols are uint16s because bzip2 encodes not only MTF indexes in the
-// tree, but also two magic values for run-length encoding and an EOF symbol.
-// Thus there are more than 256 possible symbols.
-type huffmanNode struct {
-	left, right           uint16
-	leftValue, rightValue uint16
-}
-
-// invalidNodeValue is an invalid index which marks a leaf node in the tree.
-const invalidNodeValue = 0xffff
-
-// Decode reads bits from the given bitReader and navigates the tree until a
-// symbol is found.
-func (t *huffmanTree) Decode(br *bitReader) (v uint16) {
-	nodeIndex := uint16(0) // node 0 is the root of the tree.
-
-	for {
-		node := &t.nodes[nodeIndex]
-		bit, ok := br.TryReadBit()
-		if !ok && br.ReadBit() {
-			bit = 1
-		}
-		// bzip2 encodes left as a true bit.
-		if bit != 0 {
-			// left
-			if node.left == invalidNodeValue {
-				return node.leftValue
-			}
-			nodeIndex = node.left
-		} else {
-			// right
-			if node.right == invalidNodeValue {
-				return node.rightValue
-			}
-			nodeIndex = node.right
-		}
-	}
-}
-
-// newHuffmanTree builds a Huffman tree from a slice containing the code
-// lengths of each symbol. The maximum code length is 32 bits.
-func newHuffmanTree(lengths []uint8) (huffmanTree, error) {
-	// There are many possible trees that assign the same code length to
-	// each symbol (consider reflecting a tree down the middle, for
-	// example). Since the code length assignments determine the
-	// efficiency of the tree, each of these trees is equally good. In
-	// order to minimize the amount of information needed to build a tree
-	// bzip2 uses a canonical tree so that it can be reconstructed given
-	// only the code length assignments.
-
-	if len(lengths) < 2 {
-		panic("newHuffmanTree: too few symbols")
-	}
-
-	var t huffmanTree
-
-	// First we sort the code length assignments by ascending code length,
-	// using the symbol value to break ties.
-	pairs := huffmanSymbolLengthPairs(make([]huffmanSymbolLengthPair, len(lengths)))
-	for i, length := range lengths {
-		pairs[i].value = uint16(i)
-		pairs[i].length = length
-	}
-
-	sort.Sort(pairs)
-
-	// Now we assign codes to the symbols, starting with the longest code.
-	// We keep the codes packed into a uint32, at the most-significant end.
-	// So branches are taken from the MSB downwards. This makes it easy to
-	// sort them later.
-	code := uint32(0)
-	length := uint8(32)
-
-	codes := huffmanCodes(make([]huffmanCode, len(lengths)))
-	for i := len(pairs) - 1; i >= 0; i-- {
-		if length > pairs[i].length {
-			// If the code length decreases we shift in order to
-			// zero any bits beyond the end of the code.
-			length >>= 32 - pairs[i].length
-			length <<= 32 - pairs[i].length
-			length = pairs[i].length
-		}
-		codes[i].code = code
-		codes[i].codeLen = length
-		codes[i].value = pairs[i].value
-		// We need to 'increment' the code, which means treating |code|
-		// like a |length| bit number.
-		code += 1 << (32 - length)
-	}
-
-	// Now we can sort by the code so that the left half of each branch are
-	// grouped together, recursively.
-	sort.Sort(codes)
-
-	t.nodes = make([]huffmanNode, len(codes))
-	_, err := buildHuffmanNode(&t, codes, 0)
-	return t, err
-}
-
-// huffmanSymbolLengthPair contains a symbol and its code length.
-type huffmanSymbolLengthPair struct {
-	value  uint16
-	length uint8
-}
-
-// huffmanSymbolLengthPair is used to provide an interface for sorting.
-type huffmanSymbolLengthPairs []huffmanSymbolLengthPair
-
-func (h huffmanSymbolLengthPairs) Len() int {
-	return len(h)
-}
-
-func (h huffmanSymbolLengthPairs) Less(i, j int) bool {
-	if h[i].length < h[j].length {
-		return true
-	}
-	if h[i].length > h[j].length {
-		return false
-	}
-	if h[i].value < h[j].value {
-		return true
-	}
-	return false
-}
-
-func (h huffmanSymbolLengthPairs) Swap(i, j int) {
-	h[i], h[j] = h[j], h[i]
-}
-
-// huffmanCode contains a symbol, its code and code length.
-type huffmanCode struct {
-	code    uint32
-	codeLen uint8
-	value   uint16
-}
-
-// huffmanCodes is used to provide an interface for sorting.
-type huffmanCodes []huffmanCode
-
-func (n huffmanCodes) Len() int {
-	return len(n)
-}
-
-func (n huffmanCodes) Less(i, j int) bool {
-	return n[i].code < n[j].code
-}
-
-func (n huffmanCodes) Swap(i, j int) {
-	n[i], n[j] = n[j], n[i]
-}
-
-// buildHuffmanNode takes a slice of sorted huffmanCodes and builds a node in
-// the Huffman tree at the given level. It returns the index of the newly
-// constructed node.
-func buildHuffmanNode(t *huffmanTree, codes []huffmanCode, level uint32) (nodeIndex uint16, err error) {
-	test := uint32(1) << (31 - level)
-
-	// We have to search the list of codes to find the divide between the left and right sides.
-	firstRightIndex := len(codes)
-	for i, code := range codes {
-		if code.code&test != 0 {
-			firstRightIndex = i
-			break
-		}
-	}
-
-	left := codes[:firstRightIndex]
-	right := codes[firstRightIndex:]
-
-	if len(left) == 0 || len(right) == 0 {
-		// There is a superfluous level in the Huffman tree indicating
-		// a bug in the encoder. However, this bug has been observed in
-		// the wild so we handle it.
-
-		// If this function was called recursively then we know that
-		// len(codes) >= 2 because, otherwise, we would have hit the
-		// "leaf node" case, below, and not recursed.
-		//
-		// However, for the initial call it's possible that len(codes)
-		// is zero or one. Both cases are invalid because a zero length
-		// tree cannot encode anything and a length-1 tree can only
-		// encode EOF and so is superfluous. We reject both.
-		if len(codes) < 2 {
-			return 0, StructuralError("empty Huffman tree")
-		}
-
-		// In this case the recursion doesn't always reduce the length
-		// of codes so we need to ensure termination via another
-		// mechanism.
-		if level == 31 {
-			// Since len(codes) >= 2 the only way that the values
-			// can match at all 32 bits is if they are equal, which
-			// is invalid. This ensures that we never enter
-			// infinite recursion.
-			return 0, StructuralError("equal symbols in Huffman tree")
-		}
-
-		if len(left) == 0 {
-			return buildHuffmanNode(t, right, level+1)
-		}
-		return buildHuffmanNode(t, left, level+1)
-	}
-
-	nodeIndex = uint16(t.nextNode)
-	node := &t.nodes[t.nextNode]
-	t.nextNode++
-
-	if len(left) == 1 {
-		// leaf node
-		node.left = invalidNodeValue
-		node.leftValue = left[0].value
-	} else {
-		node.left, err = buildHuffmanNode(t, left, level+1)
-	}
-
-	if err != nil {
-		return
-	}
-
-	if len(right) == 1 {
-		// leaf node
-		node.right = invalidNodeValue
-		node.rightValue = right[0].value
-	} else {
-		node.right, err = buildHuffmanNode(t, right, level+1)
-	}
-
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/compress/bzip2/move_to_front.go b/third_party/gofrontend/libgo/go/compress/bzip2/move_to_front.go
deleted file mode 100644
index 526dfb3..0000000
--- a/third_party/gofrontend/libgo/go/compress/bzip2/move_to_front.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bzip2
-
-// moveToFrontDecoder implements a move-to-front list. Such a list is an
-// efficient way to transform a string with repeating elements into one with
-// many small valued numbers, which is suitable for entropy encoding. It works
-// by starting with an initial list of symbols and references symbols by their
-// index into that list. When a symbol is referenced, it's moved to the front
-// of the list. Thus, a repeated symbol ends up being encoded with many zeros,
-// as the symbol will be at the front of the list after the first access.
-type moveToFrontDecoder []byte
-
-// newMTFDecoder creates a move-to-front decoder with an explicit initial list
-// of symbols.
-func newMTFDecoder(symbols []byte) moveToFrontDecoder {
-	if len(symbols) > 256 {
-		panic("too many symbols")
-	}
-	return moveToFrontDecoder(symbols)
-}
-
-// newMTFDecoderWithRange creates a move-to-front decoder with an initial
-// symbol list of 0...n-1.
-func newMTFDecoderWithRange(n int) moveToFrontDecoder {
-	if n > 256 {
-		panic("newMTFDecoderWithRange: cannot have > 256 symbols")
-	}
-
-	m := make([]byte, n)
-	for i := 0; i < n; i++ {
-		m[i] = byte(i)
-	}
-	return moveToFrontDecoder(m)
-}
-
-func (m moveToFrontDecoder) Decode(n int) (b byte) {
-	// Implement move-to-front with a simple copy. This approach
-	// beats more sophisticated approaches in benchmarking, probably
-	// because it has high locality of reference inside of a
-	// single cache line (most move-to-front operations have n < 64).
-	b = m[n]
-	copy(m[1:], m[:n])
-	m[0] = b
-	return
-}
-
-// First returns the symbol at the front of the list.
-func (m moveToFrontDecoder) First() byte {
-	return m[0]
-}
diff --git a/third_party/gofrontend/libgo/go/compress/bzip2/testdata/Mark.Twain-Tom.Sawyer.txt.bz2 b/third_party/gofrontend/libgo/go/compress/bzip2/testdata/Mark.Twain-Tom.Sawyer.txt.bz2
deleted file mode 100644
index 0bd61a6..0000000
--- a/third_party/gofrontend/libgo/go/compress/bzip2/testdata/Mark.Twain-Tom.Sawyer.txt.bz2
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/compress/bzip2/testdata/e.txt.bz2 b/third_party/gofrontend/libgo/go/compress/bzip2/testdata/e.txt.bz2
deleted file mode 100644
index 65bf3b4..0000000
--- a/third_party/gofrontend/libgo/go/compress/bzip2/testdata/e.txt.bz2
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/compress/flate/copy.go b/third_party/gofrontend/libgo/go/compress/flate/copy.go
deleted file mode 100644
index a3200a8..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/copy.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flate
-
-// forwardCopy is like the built-in copy function except that it always goes
-// forward from the start, even if the dst and src overlap.
-// It is equivalent to:
-//   for i := 0; i < n; i++ {
-//     mem[dst+i] = mem[src+i]
-//   }
-func forwardCopy(mem []byte, dst, src, n int) {
-	if dst <= src {
-		copy(mem[dst:dst+n], mem[src:src+n])
-		return
-	}
-	for {
-		if dst >= src+n {
-			copy(mem[dst:dst+n], mem[src:src+n])
-			return
-		}
-		// There is some forward overlap.  The destination
-		// will be filled with a repeated pattern of mem[src:src+k].
-		// We copy one instance of the pattern here, then repeat.
-		// Each time around this loop k will double.
-		k := dst - src
-		copy(mem[dst:dst+k], mem[src:src+k])
-		n -= k
-		dst += k
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/compress/flate/copy_test.go b/third_party/gofrontend/libgo/go/compress/flate/copy_test.go
deleted file mode 100644
index 2011b15..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/copy_test.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flate
-
-import (
-	"testing"
-)
-
-func TestForwardCopy(t *testing.T) {
-	testCases := []struct {
-		dst0, dst1 int
-		src0, src1 int
-		want       string
-	}{
-		{0, 9, 0, 9, "012345678"},
-		{0, 5, 4, 9, "45678"},
-		{4, 9, 0, 5, "01230"},
-		{1, 6, 3, 8, "34567"},
-		{3, 8, 1, 6, "12121"},
-		{0, 9, 3, 6, "345"},
-		{3, 6, 0, 9, "012"},
-		{1, 6, 0, 9, "00000"},
-		{0, 4, 7, 8, "7"},
-		{0, 1, 6, 8, "6"},
-		{4, 4, 6, 9, ""},
-		{2, 8, 6, 6, ""},
-		{0, 0, 0, 0, ""},
-	}
-	for _, tc := range testCases {
-		b := []byte("0123456789")
-		n := tc.dst1 - tc.dst0
-		if tc.src1-tc.src0 < n {
-			n = tc.src1 - tc.src0
-		}
-		forwardCopy(b, tc.dst0, tc.src0, n)
-		got := string(b[tc.dst0 : tc.dst0+n])
-		if got != tc.want {
-			t.Errorf("dst=b[%d:%d], src=b[%d:%d]: got %q, want %q",
-				tc.dst0, tc.dst1, tc.src0, tc.src1, got, tc.want)
-		}
-		// Check that the bytes outside of dst[:n] were not modified.
-		for i, x := range b {
-			if i >= tc.dst0 && i < tc.dst0+n {
-				continue
-			}
-			if int(x) != '0'+i {
-				t.Errorf("dst=b[%d:%d], src=b[%d:%d]: copy overrun at b[%d]: got '%c', want '%c'",
-					tc.dst0, tc.dst1, tc.src0, tc.src1, i, x, '0'+i)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/compress/flate/deflate.go b/third_party/gofrontend/libgo/go/compress/flate/deflate.go
deleted file mode 100644
index 169a0c7..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/deflate.go
+++ /dev/null
@@ -1,571 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flate
-
-import (
-	"fmt"
-	"io"
-	"math"
-)
-
-const (
-	NoCompression      = 0
-	BestSpeed          = 1
-	fastCompression    = 3
-	BestCompression    = 9
-	DefaultCompression = -1
-	logWindowSize      = 15
-	windowSize         = 1 << logWindowSize
-	windowMask         = windowSize - 1
-	logMaxOffsetSize   = 15  // Standard DEFLATE
-	minMatchLength     = 3   // The smallest match that the compressor looks for
-	maxMatchLength     = 258 // The longest match for the compressor
-	minOffsetSize      = 1   // The shortest offset that makes any sense
-
-	// The maximum number of tokens we put into a single flat block, just to
-	// stop things from getting too large.
-	maxFlateBlockTokens = 1 << 14
-	maxStoreBlockSize   = 65535
-	hashBits            = 17
-	hashSize            = 1 << hashBits
-	hashMask            = (1 << hashBits) - 1
-	hashShift           = (hashBits + minMatchLength - 1) / minMatchLength
-	maxHashOffset       = 1 << 24
-
-	skipNever = math.MaxInt32
-)
-
-type compressionLevel struct {
-	good, lazy, nice, chain, fastSkipHashing int
-}
-
-var levels = []compressionLevel{
-	{}, // 0
-	// For levels 1-3 we don't bother trying with lazy matches
-	{3, 0, 8, 4, 4},
-	{3, 0, 16, 8, 5},
-	{3, 0, 32, 32, 6},
-	// Levels 4-9 use increasingly more lazy matching
-	// and increasingly stringent conditions for "good enough".
-	{4, 4, 16, 16, skipNever},
-	{8, 16, 32, 32, skipNever},
-	{8, 16, 128, 128, skipNever},
-	{8, 32, 128, 256, skipNever},
-	{32, 128, 258, 1024, skipNever},
-	{32, 258, 258, 4096, skipNever},
-}
-
-type compressor struct {
-	compressionLevel
-
-	w *huffmanBitWriter
-
-	// compression algorithm
-	fill func(*compressor, []byte) int // copy data to window
-	step func(*compressor)             // process window
-	sync bool                          // requesting flush
-
-	// Input hash chains
-	// hashHead[hashValue] contains the largest inputIndex with the specified hash value
-	// If hashHead[hashValue] is within the current window, then
-	// hashPrev[hashHead[hashValue] & windowMask] contains the previous index
-	// with the same hash value.
-	chainHead  int
-	hashHead   []int
-	hashPrev   []int
-	hashOffset int
-
-	// input window: unprocessed data is window[index:windowEnd]
-	index         int
-	window        []byte
-	windowEnd     int
-	blockStart    int  // window index where current tokens start
-	byteAvailable bool // if true, still need to process window[index-1].
-
-	// queued output tokens
-	tokens []token
-
-	// deflate state
-	length         int
-	offset         int
-	hash           int
-	maxInsertIndex int
-	err            error
-}
-
-func (d *compressor) fillDeflate(b []byte) int {
-	if d.index >= 2*windowSize-(minMatchLength+maxMatchLength) {
-		// shift the window by windowSize
-		copy(d.window, d.window[windowSize:2*windowSize])
-		d.index -= windowSize
-		d.windowEnd -= windowSize
-		if d.blockStart >= windowSize {
-			d.blockStart -= windowSize
-		} else {
-			d.blockStart = math.MaxInt32
-		}
-		d.hashOffset += windowSize
-		if d.hashOffset > maxHashOffset {
-			delta := d.hashOffset - 1
-			d.hashOffset -= delta
-			d.chainHead -= delta
-			for i, v := range d.hashPrev {
-				if v > delta {
-					d.hashPrev[i] -= delta
-				} else {
-					d.hashPrev[i] = 0
-				}
-			}
-			for i, v := range d.hashHead {
-				if v > delta {
-					d.hashHead[i] -= delta
-				} else {
-					d.hashHead[i] = 0
-				}
-			}
-		}
-	}
-	n := copy(d.window[d.windowEnd:], b)
-	d.windowEnd += n
-	return n
-}
-
-func (d *compressor) writeBlock(tokens []token, index int, eof bool) error {
-	if index > 0 || eof {
-		var window []byte
-		if d.blockStart <= index {
-			window = d.window[d.blockStart:index]
-		}
-		d.blockStart = index
-		d.w.writeBlock(tokens, eof, window)
-		return d.w.err
-	}
-	return nil
-}
-
-// Try to find a match starting at index whose length is greater than prevSize.
-// We only look at chainCount possibilities before giving up.
-func (d *compressor) findMatch(pos int, prevHead int, prevLength int, lookahead int) (length, offset int, ok bool) {
-	minMatchLook := maxMatchLength
-	if lookahead < minMatchLook {
-		minMatchLook = lookahead
-	}
-
-	win := d.window[0 : pos+minMatchLook]
-
-	// We quit when we get a match that's at least nice long
-	nice := len(win) - pos
-	if d.nice < nice {
-		nice = d.nice
-	}
-
-	// If we've got a match that's good enough, only look in 1/4 the chain.
-	tries := d.chain
-	length = prevLength
-	if length >= d.good {
-		tries >>= 2
-	}
-
-	w0 := win[pos]
-	w1 := win[pos+1]
-	wEnd := win[pos+length]
-	minIndex := pos - windowSize
-
-	for i := prevHead; tries > 0; tries-- {
-		if w0 == win[i] && w1 == win[i+1] && wEnd == win[i+length] {
-			// The hash function ensures that if win[i] and win[i+1] match, win[i+2] matches
-
-			n := 3
-			for pos+n < len(win) && win[i+n] == win[pos+n] {
-				n++
-			}
-			if n > length && (n > 3 || pos-i <= 4096) {
-				length = n
-				offset = pos - i
-				ok = true
-				if n >= nice {
-					// The match is good enough that we don't try to find a better one.
-					break
-				}
-				wEnd = win[pos+n]
-			}
-		}
-		if i == minIndex {
-			// hashPrev[i & windowMask] has already been overwritten, so stop now.
-			break
-		}
-		if i = d.hashPrev[i&windowMask] - d.hashOffset; i < minIndex || i < 0 {
-			break
-		}
-	}
-	return
-}
-
-func (d *compressor) writeStoredBlock(buf []byte) error {
-	if d.w.writeStoredHeader(len(buf), false); d.w.err != nil {
-		return d.w.err
-	}
-	d.w.writeBytes(buf)
-	return d.w.err
-}
-
-func (d *compressor) initDeflate() {
-	d.hashHead = make([]int, hashSize)
-	d.hashPrev = make([]int, windowSize)
-	d.window = make([]byte, 2*windowSize)
-	d.hashOffset = 1
-	d.tokens = make([]token, 0, maxFlateBlockTokens+1)
-	d.length = minMatchLength - 1
-	d.offset = 0
-	d.byteAvailable = false
-	d.index = 0
-	d.hash = 0
-	d.chainHead = -1
-}
-
-func (d *compressor) deflate() {
-	if d.windowEnd-d.index < minMatchLength+maxMatchLength && !d.sync {
-		return
-	}
-
-	d.maxInsertIndex = d.windowEnd - (minMatchLength - 1)
-	if d.index < d.maxInsertIndex {
-		d.hash = int(d.window[d.index])<<hashShift + int(d.window[d.index+1])
-	}
-
-Loop:
-	for {
-		if d.index > d.windowEnd {
-			panic("index > windowEnd")
-		}
-		lookahead := d.windowEnd - d.index
-		if lookahead < minMatchLength+maxMatchLength {
-			if !d.sync {
-				break Loop
-			}
-			if d.index > d.windowEnd {
-				panic("index > windowEnd")
-			}
-			if lookahead == 0 {
-				// Flush current output block if any.
-				if d.byteAvailable {
-					// There is still one pending token that needs to be flushed
-					d.tokens = append(d.tokens, literalToken(uint32(d.window[d.index-1])))
-					d.byteAvailable = false
-				}
-				if len(d.tokens) > 0 {
-					if d.err = d.writeBlock(d.tokens, d.index, false); d.err != nil {
-						return
-					}
-					d.tokens = d.tokens[:0]
-				}
-				break Loop
-			}
-		}
-		if d.index < d.maxInsertIndex {
-			// Update the hash
-			d.hash = (d.hash<<hashShift + int(d.window[d.index+2])) & hashMask
-			d.chainHead = d.hashHead[d.hash]
-			d.hashPrev[d.index&windowMask] = d.chainHead
-			d.hashHead[d.hash] = d.index + d.hashOffset
-		}
-		prevLength := d.length
-		prevOffset := d.offset
-		d.length = minMatchLength - 1
-		d.offset = 0
-		minIndex := d.index - windowSize
-		if minIndex < 0 {
-			minIndex = 0
-		}
-
-		if d.chainHead-d.hashOffset >= minIndex &&
-			(d.fastSkipHashing != skipNever && lookahead > minMatchLength-1 ||
-				d.fastSkipHashing == skipNever && lookahead > prevLength && prevLength < d.lazy) {
-			if newLength, newOffset, ok := d.findMatch(d.index, d.chainHead-d.hashOffset, minMatchLength-1, lookahead); ok {
-				d.length = newLength
-				d.offset = newOffset
-			}
-		}
-		if d.fastSkipHashing != skipNever && d.length >= minMatchLength ||
-			d.fastSkipHashing == skipNever && prevLength >= minMatchLength && d.length <= prevLength {
-			// There was a match at the previous step, and the current match is
-			// not better. Output the previous match.
-			if d.fastSkipHashing != skipNever {
-				d.tokens = append(d.tokens, matchToken(uint32(d.length-minMatchLength), uint32(d.offset-minOffsetSize)))
-			} else {
-				d.tokens = append(d.tokens, matchToken(uint32(prevLength-minMatchLength), uint32(prevOffset-minOffsetSize)))
-			}
-			// Insert in the hash table all strings up to the end of the match.
-			// index and index-1 are already inserted. If there is not enough
-			// lookahead, the last two strings are not inserted into the hash
-			// table.
-			if d.length <= d.fastSkipHashing {
-				var newIndex int
-				if d.fastSkipHashing != skipNever {
-					newIndex = d.index + d.length
-				} else {
-					newIndex = d.index + prevLength - 1
-				}
-				for d.index++; d.index < newIndex; d.index++ {
-					if d.index < d.maxInsertIndex {
-						d.hash = (d.hash<<hashShift + int(d.window[d.index+2])) & hashMask
-						// Get previous value with the same hash.
-						// Our chain should point to the previous value.
-						d.hashPrev[d.index&windowMask] = d.hashHead[d.hash]
-						// Set the head of the hash chain to us.
-						d.hashHead[d.hash] = d.index + d.hashOffset
-					}
-				}
-				if d.fastSkipHashing == skipNever {
-					d.byteAvailable = false
-					d.length = minMatchLength - 1
-				}
-			} else {
-				// For matches this long, we don't bother inserting each individual
-				// item into the table.
-				d.index += d.length
-				if d.index < d.maxInsertIndex {
-					d.hash = (int(d.window[d.index])<<hashShift + int(d.window[d.index+1]))
-				}
-			}
-			if len(d.tokens) == maxFlateBlockTokens {
-				// The block includes the current character
-				if d.err = d.writeBlock(d.tokens, d.index, false); d.err != nil {
-					return
-				}
-				d.tokens = d.tokens[:0]
-			}
-		} else {
-			if d.fastSkipHashing != skipNever || d.byteAvailable {
-				i := d.index - 1
-				if d.fastSkipHashing != skipNever {
-					i = d.index
-				}
-				d.tokens = append(d.tokens, literalToken(uint32(d.window[i])))
-				if len(d.tokens) == maxFlateBlockTokens {
-					if d.err = d.writeBlock(d.tokens, i+1, false); d.err != nil {
-						return
-					}
-					d.tokens = d.tokens[:0]
-				}
-			}
-			d.index++
-			if d.fastSkipHashing == skipNever {
-				d.byteAvailable = true
-			}
-		}
-	}
-}
-
-func (d *compressor) fillStore(b []byte) int {
-	n := copy(d.window[d.windowEnd:], b)
-	d.windowEnd += n
-	return n
-}
-
-func (d *compressor) store() {
-	if d.windowEnd > 0 {
-		d.err = d.writeStoredBlock(d.window[:d.windowEnd])
-	}
-	d.windowEnd = 0
-}
-
-func (d *compressor) write(b []byte) (n int, err error) {
-	n = len(b)
-	b = b[d.fill(d, b):]
-	for len(b) > 0 {
-		d.step(d)
-		b = b[d.fill(d, b):]
-	}
-	return n, d.err
-}
-
-func (d *compressor) syncFlush() error {
-	d.sync = true
-	d.step(d)
-	if d.err == nil {
-		d.w.writeStoredHeader(0, false)
-		d.w.flush()
-		d.err = d.w.err
-	}
-	d.sync = false
-	return d.err
-}
-
-func (d *compressor) init(w io.Writer, level int) (err error) {
-	d.w = newHuffmanBitWriter(w)
-
-	switch {
-	case level == NoCompression:
-		d.window = make([]byte, maxStoreBlockSize)
-		d.fill = (*compressor).fillStore
-		d.step = (*compressor).store
-	case level == DefaultCompression:
-		level = 6
-		fallthrough
-	case 1 <= level && level <= 9:
-		d.compressionLevel = levels[level]
-		d.initDeflate()
-		d.fill = (*compressor).fillDeflate
-		d.step = (*compressor).deflate
-	default:
-		return fmt.Errorf("flate: invalid compression level %d: want value in range [-1, 9]", level)
-	}
-	return nil
-}
-
-var zeroes [32]int
-var bzeroes [256]byte
-
-func (d *compressor) reset(w io.Writer) {
-	d.w.reset(w)
-	d.sync = false
-	d.err = nil
-	switch d.compressionLevel.chain {
-	case 0:
-		// level was NoCompression.
-		for i := range d.window {
-			d.window[i] = 0
-		}
-		d.windowEnd = 0
-	default:
-		d.chainHead = -1
-		for s := d.hashHead; len(s) > 0; {
-			n := copy(s, zeroes[:])
-			s = s[n:]
-		}
-		for s := d.hashPrev; len(s) > 0; s = s[len(zeroes):] {
-			copy(s, zeroes[:])
-		}
-		d.hashOffset = 1
-
-		d.index, d.windowEnd = 0, 0
-		for s := d.window; len(s) > 0; {
-			n := copy(s, bzeroes[:])
-			s = s[n:]
-		}
-		d.blockStart, d.byteAvailable = 0, false
-
-		d.tokens = d.tokens[:maxFlateBlockTokens+1]
-		for i := 0; i <= maxFlateBlockTokens; i++ {
-			d.tokens[i] = 0
-		}
-		d.tokens = d.tokens[:0]
-		d.length = minMatchLength - 1
-		d.offset = 0
-		d.hash = 0
-		d.maxInsertIndex = 0
-	}
-}
-
-func (d *compressor) close() error {
-	d.sync = true
-	d.step(d)
-	if d.err != nil {
-		return d.err
-	}
-	if d.w.writeStoredHeader(0, true); d.w.err != nil {
-		return d.w.err
-	}
-	d.w.flush()
-	return d.w.err
-}
-
-// NewWriter returns a new Writer compressing data at the given level.
-// Following zlib, levels range from 1 (BestSpeed) to 9 (BestCompression);
-// higher levels typically run slower but compress more. Level 0
-// (NoCompression) does not attempt any compression; it only adds the
-// necessary DEFLATE framing. Level -1 (DefaultCompression) uses the default
-// compression level.
-//
-// If level is in the range [-1, 9] then the error returned will be nil.
-// Otherwise the error returned will be non-nil.
-func NewWriter(w io.Writer, level int) (*Writer, error) {
-	var dw Writer
-	if err := dw.d.init(w, level); err != nil {
-		return nil, err
-	}
-	return &dw, nil
-}
-
-// NewWriterDict is like NewWriter but initializes the new
-// Writer with a preset dictionary.  The returned Writer behaves
-// as if the dictionary had been written to it without producing
-// any compressed output.  The compressed data written to w
-// can only be decompressed by a Reader initialized with the
-// same dictionary.
-func NewWriterDict(w io.Writer, level int, dict []byte) (*Writer, error) {
-	dw := &dictWriter{w, false}
-	zw, err := NewWriter(dw, level)
-	if err != nil {
-		return nil, err
-	}
-	zw.Write(dict)
-	zw.Flush()
-	dw.enabled = true
-	zw.dict = append(zw.dict, dict...) // duplicate dictionary for Reset method.
-	return zw, err
-}
-
-type dictWriter struct {
-	w       io.Writer
-	enabled bool
-}
-
-func (w *dictWriter) Write(b []byte) (n int, err error) {
-	if w.enabled {
-		return w.w.Write(b)
-	}
-	return len(b), nil
-}
-
-// A Writer takes data written to it and writes the compressed
-// form of that data to an underlying writer (see NewWriter).
-type Writer struct {
-	d    compressor
-	dict []byte
-}
-
-// Write writes data to w, which will eventually write the
-// compressed form of data to its underlying writer.
-func (w *Writer) Write(data []byte) (n int, err error) {
-	return w.d.write(data)
-}
-
-// Flush flushes any pending compressed data to the underlying writer.
-// It is useful mainly in compressed network protocols, to ensure that
-// a remote reader has enough data to reconstruct a packet.
-// Flush does not return until the data has been written.
-// If the underlying writer returns an error, Flush returns that error.
-//
-// In the terminology of the zlib library, Flush is equivalent to Z_SYNC_FLUSH.
-func (w *Writer) Flush() error {
-	// For more about flushing:
-	// http://www.bolet.org/~pornin/deflate-flush.html
-	return w.d.syncFlush()
-}
-
-// Close flushes and closes the writer.
-func (w *Writer) Close() error {
-	return w.d.close()
-}
-
-// Reset discards the writer's state and makes it equivalent to
-// the result of NewWriter or NewWriterDict called with dst
-// and w's level and dictionary.
-func (w *Writer) Reset(dst io.Writer) {
-	if dw, ok := w.d.w.w.(*dictWriter); ok {
-		// w was created with NewWriterDict
-		dw.w = dst
-		w.d.reset(dw)
-		dw.enabled = false
-		w.Write(w.dict)
-		w.Flush()
-		dw.enabled = true
-	} else {
-		// w was created with NewWriter
-		w.d.reset(dst)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/compress/flate/deflate_test.go b/third_party/gofrontend/libgo/go/compress/flate/deflate_test.go
deleted file mode 100644
index d5d6e73..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/deflate_test.go
+++ /dev/null
@@ -1,490 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flate
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"reflect"
-	"sync"
-	"testing"
-)
-
-type deflateTest struct {
-	in    []byte
-	level int
-	out   []byte
-}
-
-type deflateInflateTest struct {
-	in []byte
-}
-
-type reverseBitsTest struct {
-	in       uint16
-	bitCount uint8
-	out      uint16
-}
-
-var deflateTests = []*deflateTest{
-	{[]byte{}, 0, []byte{1, 0, 0, 255, 255}},
-	{[]byte{0x11}, -1, []byte{18, 4, 4, 0, 0, 255, 255}},
-	{[]byte{0x11}, DefaultCompression, []byte{18, 4, 4, 0, 0, 255, 255}},
-	{[]byte{0x11}, 4, []byte{18, 4, 4, 0, 0, 255, 255}},
-
-	{[]byte{0x11}, 0, []byte{0, 1, 0, 254, 255, 17, 1, 0, 0, 255, 255}},
-	{[]byte{0x11, 0x12}, 0, []byte{0, 2, 0, 253, 255, 17, 18, 1, 0, 0, 255, 255}},
-	{[]byte{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 0,
-		[]byte{0, 8, 0, 247, 255, 17, 17, 17, 17, 17, 17, 17, 17, 1, 0, 0, 255, 255},
-	},
-	{[]byte{}, 1, []byte{1, 0, 0, 255, 255}},
-	{[]byte{0x11}, 1, []byte{18, 4, 4, 0, 0, 255, 255}},
-	{[]byte{0x11, 0x12}, 1, []byte{18, 20, 2, 4, 0, 0, 255, 255}},
-	{[]byte{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 1, []byte{18, 132, 2, 64, 0, 0, 0, 255, 255}},
-	{[]byte{}, 9, []byte{1, 0, 0, 255, 255}},
-	{[]byte{0x11}, 9, []byte{18, 4, 4, 0, 0, 255, 255}},
-	{[]byte{0x11, 0x12}, 9, []byte{18, 20, 2, 4, 0, 0, 255, 255}},
-	{[]byte{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 9, []byte{18, 132, 2, 64, 0, 0, 0, 255, 255}},
-}
-
-var deflateInflateTests = []*deflateInflateTest{
-	{[]byte{}},
-	{[]byte{0x11}},
-	{[]byte{0x11, 0x12}},
-	{[]byte{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}},
-	{[]byte{0x11, 0x10, 0x13, 0x41, 0x21, 0x21, 0x41, 0x13, 0x87, 0x78, 0x13}},
-	{largeDataChunk()},
-}
-
-var reverseBitsTests = []*reverseBitsTest{
-	{1, 1, 1},
-	{1, 2, 2},
-	{1, 3, 4},
-	{1, 4, 8},
-	{1, 5, 16},
-	{17, 5, 17},
-	{257, 9, 257},
-	{29, 5, 23},
-}
-
-func largeDataChunk() []byte {
-	result := make([]byte, 100000)
-	for i := range result {
-		result[i] = byte(i * i & 0xFF)
-	}
-	return result
-}
-
-func TestDeflate(t *testing.T) {
-	for _, h := range deflateTests {
-		var buf bytes.Buffer
-		w, err := NewWriter(&buf, h.level)
-		if err != nil {
-			t.Errorf("NewWriter: %v", err)
-			continue
-		}
-		w.Write(h.in)
-		w.Close()
-		if !bytes.Equal(buf.Bytes(), h.out) {
-			t.Errorf("Deflate(%d, %x) = %x, want %x", h.level, h.in, buf.Bytes(), h.out)
-		}
-	}
-}
-
-// A sparseReader returns a stream consisting of 0s followed by 1<<16 1s.
-// This tests missing hash references in a very large input.
-type sparseReader struct {
-	l   int64
-	cur int64
-}
-
-func (r *sparseReader) Read(b []byte) (n int, err error) {
-	if r.cur >= r.l {
-		return 0, io.EOF
-	}
-	n = len(b)
-	cur := r.cur + int64(n)
-	if cur > r.l {
-		n -= int(cur - r.l)
-		cur = r.l
-	}
-	for i := range b[0:n] {
-		if r.cur+int64(i) >= r.l-1<<16 {
-			b[i] = 1
-		} else {
-			b[i] = 0
-		}
-	}
-	r.cur = cur
-	return
-}
-
-func TestVeryLongSparseChunk(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping sparse chunk during short test")
-	}
-	w, err := NewWriter(ioutil.Discard, 1)
-	if err != nil {
-		t.Errorf("NewWriter: %v", err)
-		return
-	}
-	if _, err = io.Copy(w, &sparseReader{l: 23E8}); err != nil {
-		t.Errorf("Compress failed: %v", err)
-		return
-	}
-}
-
-type syncBuffer struct {
-	buf    bytes.Buffer
-	mu     sync.RWMutex
-	closed bool
-	ready  chan bool
-}
-
-func newSyncBuffer() *syncBuffer {
-	return &syncBuffer{ready: make(chan bool, 1)}
-}
-
-func (b *syncBuffer) Read(p []byte) (n int, err error) {
-	for {
-		b.mu.RLock()
-		n, err = b.buf.Read(p)
-		b.mu.RUnlock()
-		if n > 0 || b.closed {
-			return
-		}
-		<-b.ready
-	}
-}
-
-func (b *syncBuffer) signal() {
-	select {
-	case b.ready <- true:
-	default:
-	}
-}
-
-func (b *syncBuffer) Write(p []byte) (n int, err error) {
-	n, err = b.buf.Write(p)
-	b.signal()
-	return
-}
-
-func (b *syncBuffer) WriteMode() {
-	b.mu.Lock()
-}
-
-func (b *syncBuffer) ReadMode() {
-	b.mu.Unlock()
-	b.signal()
-}
-
-func (b *syncBuffer) Close() error {
-	b.closed = true
-	b.signal()
-	return nil
-}
-
-func testSync(t *testing.T, level int, input []byte, name string) {
-	if len(input) == 0 {
-		return
-	}
-
-	t.Logf("--testSync %d, %d, %s", level, len(input), name)
-	buf := newSyncBuffer()
-	buf1 := new(bytes.Buffer)
-	buf.WriteMode()
-	w, err := NewWriter(io.MultiWriter(buf, buf1), level)
-	if err != nil {
-		t.Errorf("NewWriter: %v", err)
-		return
-	}
-	r := NewReader(buf)
-
-	// Write half the input and read back.
-	for i := 0; i < 2; i++ {
-		var lo, hi int
-		if i == 0 {
-			lo, hi = 0, (len(input)+1)/2
-		} else {
-			lo, hi = (len(input)+1)/2, len(input)
-		}
-		t.Logf("#%d: write %d-%d", i, lo, hi)
-		if _, err := w.Write(input[lo:hi]); err != nil {
-			t.Errorf("testSync: write: %v", err)
-			return
-		}
-		if i == 0 {
-			if err := w.Flush(); err != nil {
-				t.Errorf("testSync: flush: %v", err)
-				return
-			}
-		} else {
-			if err := w.Close(); err != nil {
-				t.Errorf("testSync: close: %v", err)
-			}
-		}
-		buf.ReadMode()
-		out := make([]byte, hi-lo+1)
-		m, err := io.ReadAtLeast(r, out, hi-lo)
-		t.Logf("#%d: read %d", i, m)
-		if m != hi-lo || err != nil {
-			t.Errorf("testSync/%d (%d, %d, %s): read %d: %d, %v (%d left)", i, level, len(input), name, hi-lo, m, err, buf.buf.Len())
-			return
-		}
-		if !bytes.Equal(input[lo:hi], out[:hi-lo]) {
-			t.Errorf("testSync/%d: read wrong bytes: %x vs %x", i, input[lo:hi], out[:hi-lo])
-			return
-		}
-		// This test originally checked that after reading
-		// the first half of the input, there was nothing left
-		// in the read buffer (buf.buf.Len() != 0) but that is
-		// not necessarily the case: the write Flush may emit
-		// some extra framing bits that are not necessary
-		// to process to obtain the first half of the uncompressed
-		// data.  The test ran correctly most of the time, because
-		// the background goroutine had usually read even
-		// those extra bits by now, but it's not a useful thing to
-		// check.
-		buf.WriteMode()
-	}
-	buf.ReadMode()
-	out := make([]byte, 10)
-	if n, err := r.Read(out); n > 0 || err != io.EOF {
-		t.Errorf("testSync (%d, %d, %s): final Read: %d, %v (hex: %x)", level, len(input), name, n, err, out[0:n])
-	}
-	if buf.buf.Len() != 0 {
-		t.Errorf("testSync (%d, %d, %s): extra data at end", level, len(input), name)
-	}
-	r.Close()
-
-	// stream should work for ordinary reader too
-	r = NewReader(buf1)
-	out, err = ioutil.ReadAll(r)
-	if err != nil {
-		t.Errorf("testSync: read: %s", err)
-		return
-	}
-	r.Close()
-	if !bytes.Equal(input, out) {
-		t.Errorf("testSync: decompress(compress(data)) != data: level=%d input=%s", level, name)
-	}
-}
-
-func testToFromWithLevelAndLimit(t *testing.T, level int, input []byte, name string, limit int) {
-	var buffer bytes.Buffer
-	w, err := NewWriter(&buffer, level)
-	if err != nil {
-		t.Errorf("NewWriter: %v", err)
-		return
-	}
-	w.Write(input)
-	w.Close()
-	if limit > 0 && buffer.Len() > limit {
-		t.Errorf("level: %d, len(compress(data)) = %d > limit = %d", level, buffer.Len(), limit)
-		return
-	}
-	r := NewReader(&buffer)
-	out, err := ioutil.ReadAll(r)
-	if err != nil {
-		t.Errorf("read: %s", err)
-		return
-	}
-	r.Close()
-	if !bytes.Equal(input, out) {
-		t.Errorf("decompress(compress(data)) != data: level=%d input=%s", level, name)
-		return
-	}
-	testSync(t, level, input, name)
-}
-
-func testToFromWithLimit(t *testing.T, input []byte, name string, limit [10]int) {
-	for i := 0; i < 10; i++ {
-		testToFromWithLevelAndLimit(t, i, input, name, limit[i])
-	}
-}
-
-func TestDeflateInflate(t *testing.T) {
-	for i, h := range deflateInflateTests {
-		testToFromWithLimit(t, h.in, fmt.Sprintf("#%d", i), [10]int{})
-	}
-}
-
-func TestReverseBits(t *testing.T) {
-	for _, h := range reverseBitsTests {
-		if v := reverseBits(h.in, h.bitCount); v != h.out {
-			t.Errorf("reverseBits(%v,%v) = %v, want %v",
-				h.in, h.bitCount, v, h.out)
-		}
-	}
-}
-
-type deflateInflateStringTest struct {
-	filename string
-	label    string
-	limit    [10]int
-}
-
-var deflateInflateStringTests = []deflateInflateStringTest{
-	{
-		"../testdata/e.txt",
-		"2.718281828...",
-		[...]int{100018, 50650, 50960, 51150, 50930, 50790, 50790, 50790, 50790, 50790},
-	},
-	{
-		"../testdata/Mark.Twain-Tom.Sawyer.txt",
-		"Mark.Twain-Tom.Sawyer",
-		[...]int{407330, 187598, 180361, 172974, 169160, 163476, 160936, 160506, 160295, 160295},
-	},
-}
-
-func TestDeflateInflateString(t *testing.T) {
-	for _, test := range deflateInflateStringTests {
-		gold, err := ioutil.ReadFile(test.filename)
-		if err != nil {
-			t.Error(err)
-		}
-		testToFromWithLimit(t, gold, test.label, test.limit)
-		if testing.Short() {
-			break
-		}
-	}
-}
-
-func TestReaderDict(t *testing.T) {
-	const (
-		dict = "hello world"
-		text = "hello again world"
-	)
-	var b bytes.Buffer
-	w, err := NewWriter(&b, 5)
-	if err != nil {
-		t.Fatalf("NewWriter: %v", err)
-	}
-	w.Write([]byte(dict))
-	w.Flush()
-	b.Reset()
-	w.Write([]byte(text))
-	w.Close()
-
-	r := NewReaderDict(&b, []byte(dict))
-	data, err := ioutil.ReadAll(r)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if string(data) != "hello again world" {
-		t.Fatalf("read returned %q want %q", string(data), text)
-	}
-}
-
-func TestWriterDict(t *testing.T) {
-	const (
-		dict = "hello world"
-		text = "hello again world"
-	)
-	var b bytes.Buffer
-	w, err := NewWriter(&b, 5)
-	if err != nil {
-		t.Fatalf("NewWriter: %v", err)
-	}
-	w.Write([]byte(dict))
-	w.Flush()
-	b.Reset()
-	w.Write([]byte(text))
-	w.Close()
-
-	var b1 bytes.Buffer
-	w, _ = NewWriterDict(&b1, 5, []byte(dict))
-	w.Write([]byte(text))
-	w.Close()
-
-	if !bytes.Equal(b1.Bytes(), b.Bytes()) {
-		t.Fatalf("writer wrote %q want %q", b1.Bytes(), b.Bytes())
-	}
-}
-
-// See https://golang.org/issue/2508
-func TestRegression2508(t *testing.T) {
-	if testing.Short() {
-		t.Logf("test disabled with -short")
-		return
-	}
-	w, err := NewWriter(ioutil.Discard, 1)
-	if err != nil {
-		t.Fatalf("NewWriter: %v", err)
-	}
-	buf := make([]byte, 1024)
-	for i := 0; i < 131072; i++ {
-		if _, err := w.Write(buf); err != nil {
-			t.Fatalf("writer failed: %v", err)
-		}
-	}
-	w.Close()
-}
-
-func TestWriterReset(t *testing.T) {
-	for level := 0; level <= 9; level++ {
-		if testing.Short() && level > 1 {
-			break
-		}
-		w, err := NewWriter(ioutil.Discard, level)
-		if err != nil {
-			t.Fatalf("NewWriter: %v", err)
-		}
-		buf := []byte("hello world")
-		for i := 0; i < 1024; i++ {
-			w.Write(buf)
-		}
-		w.Reset(ioutil.Discard)
-
-		wref, err := NewWriter(ioutil.Discard, level)
-		if err != nil {
-			t.Fatalf("NewWriter: %v", err)
-		}
-
-		// DeepEqual doesn't compare functions.
-		w.d.fill, wref.d.fill = nil, nil
-		w.d.step, wref.d.step = nil, nil
-		if !reflect.DeepEqual(w, wref) {
-			t.Errorf("level %d Writer not reset after Reset", level)
-		}
-	}
-	testResetOutput(t, func(w io.Writer) (*Writer, error) { return NewWriter(w, NoCompression) })
-	testResetOutput(t, func(w io.Writer) (*Writer, error) { return NewWriter(w, DefaultCompression) })
-	testResetOutput(t, func(w io.Writer) (*Writer, error) { return NewWriter(w, BestCompression) })
-	dict := []byte("we are the world")
-	testResetOutput(t, func(w io.Writer) (*Writer, error) { return NewWriterDict(w, NoCompression, dict) })
-	testResetOutput(t, func(w io.Writer) (*Writer, error) { return NewWriterDict(w, DefaultCompression, dict) })
-	testResetOutput(t, func(w io.Writer) (*Writer, error) { return NewWriterDict(w, BestCompression, dict) })
-}
-
-func testResetOutput(t *testing.T, newWriter func(w io.Writer) (*Writer, error)) {
-	buf := new(bytes.Buffer)
-	w, err := newWriter(buf)
-	if err != nil {
-		t.Fatalf("NewWriter: %v", err)
-	}
-	b := []byte("hello world")
-	for i := 0; i < 1024; i++ {
-		w.Write(b)
-	}
-	w.Close()
-	out1 := buf.String()
-
-	buf2 := new(bytes.Buffer)
-	w.Reset(buf2)
-	for i := 0; i < 1024; i++ {
-		w.Write(b)
-	}
-	w.Close()
-	out2 := buf2.String()
-
-	if out1 != out2 {
-		t.Errorf("got %q, expected %q", out2, out1)
-	}
-	t.Logf("got %d bytes", len(out1))
-}
diff --git a/third_party/gofrontend/libgo/go/compress/flate/fixedhuff.go b/third_party/gofrontend/libgo/go/compress/flate/fixedhuff.go
deleted file mode 100644
index 7df8b9a..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/fixedhuff.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flate
-
-// autogenerated by go run gen.go -output fixedhuff.go, DO NOT EDIT
-
-var fixedHuffmanDecoder = huffmanDecoder{
-	7,
-	[huffmanNumChunks]uint32{
-		0x1007, 0x0508, 0x0108, 0x1188, 0x1107, 0x0708, 0x0308, 0x0c09,
-		0x1087, 0x0608, 0x0208, 0x0a09, 0x0008, 0x0808, 0x0408, 0x0e09,
-		0x1047, 0x0588, 0x0188, 0x0909, 0x1147, 0x0788, 0x0388, 0x0d09,
-		0x10c7, 0x0688, 0x0288, 0x0b09, 0x0088, 0x0888, 0x0488, 0x0f09,
-		0x1027, 0x0548, 0x0148, 0x11c8, 0x1127, 0x0748, 0x0348, 0x0c89,
-		0x10a7, 0x0648, 0x0248, 0x0a89, 0x0048, 0x0848, 0x0448, 0x0e89,
-		0x1067, 0x05c8, 0x01c8, 0x0989, 0x1167, 0x07c8, 0x03c8, 0x0d89,
-		0x10e7, 0x06c8, 0x02c8, 0x0b89, 0x00c8, 0x08c8, 0x04c8, 0x0f89,
-		0x1017, 0x0528, 0x0128, 0x11a8, 0x1117, 0x0728, 0x0328, 0x0c49,
-		0x1097, 0x0628, 0x0228, 0x0a49, 0x0028, 0x0828, 0x0428, 0x0e49,
-		0x1057, 0x05a8, 0x01a8, 0x0949, 0x1157, 0x07a8, 0x03a8, 0x0d49,
-		0x10d7, 0x06a8, 0x02a8, 0x0b49, 0x00a8, 0x08a8, 0x04a8, 0x0f49,
-		0x1037, 0x0568, 0x0168, 0x11e8, 0x1137, 0x0768, 0x0368, 0x0cc9,
-		0x10b7, 0x0668, 0x0268, 0x0ac9, 0x0068, 0x0868, 0x0468, 0x0ec9,
-		0x1077, 0x05e8, 0x01e8, 0x09c9, 0x1177, 0x07e8, 0x03e8, 0x0dc9,
-		0x10f7, 0x06e8, 0x02e8, 0x0bc9, 0x00e8, 0x08e8, 0x04e8, 0x0fc9,
-		0x1007, 0x0518, 0x0118, 0x1198, 0x1107, 0x0718, 0x0318, 0x0c29,
-		0x1087, 0x0618, 0x0218, 0x0a29, 0x0018, 0x0818, 0x0418, 0x0e29,
-		0x1047, 0x0598, 0x0198, 0x0929, 0x1147, 0x0798, 0x0398, 0x0d29,
-		0x10c7, 0x0698, 0x0298, 0x0b29, 0x0098, 0x0898, 0x0498, 0x0f29,
-		0x1027, 0x0558, 0x0158, 0x11d8, 0x1127, 0x0758, 0x0358, 0x0ca9,
-		0x10a7, 0x0658, 0x0258, 0x0aa9, 0x0058, 0x0858, 0x0458, 0x0ea9,
-		0x1067, 0x05d8, 0x01d8, 0x09a9, 0x1167, 0x07d8, 0x03d8, 0x0da9,
-		0x10e7, 0x06d8, 0x02d8, 0x0ba9, 0x00d8, 0x08d8, 0x04d8, 0x0fa9,
-		0x1017, 0x0538, 0x0138, 0x11b8, 0x1117, 0x0738, 0x0338, 0x0c69,
-		0x1097, 0x0638, 0x0238, 0x0a69, 0x0038, 0x0838, 0x0438, 0x0e69,
-		0x1057, 0x05b8, 0x01b8, 0x0969, 0x1157, 0x07b8, 0x03b8, 0x0d69,
-		0x10d7, 0x06b8, 0x02b8, 0x0b69, 0x00b8, 0x08b8, 0x04b8, 0x0f69,
-		0x1037, 0x0578, 0x0178, 0x11f8, 0x1137, 0x0778, 0x0378, 0x0ce9,
-		0x10b7, 0x0678, 0x0278, 0x0ae9, 0x0078, 0x0878, 0x0478, 0x0ee9,
-		0x1077, 0x05f8, 0x01f8, 0x09e9, 0x1177, 0x07f8, 0x03f8, 0x0de9,
-		0x10f7, 0x06f8, 0x02f8, 0x0be9, 0x00f8, 0x08f8, 0x04f8, 0x0fe9,
-		0x1007, 0x0508, 0x0108, 0x1188, 0x1107, 0x0708, 0x0308, 0x0c19,
-		0x1087, 0x0608, 0x0208, 0x0a19, 0x0008, 0x0808, 0x0408, 0x0e19,
-		0x1047, 0x0588, 0x0188, 0x0919, 0x1147, 0x0788, 0x0388, 0x0d19,
-		0x10c7, 0x0688, 0x0288, 0x0b19, 0x0088, 0x0888, 0x0488, 0x0f19,
-		0x1027, 0x0548, 0x0148, 0x11c8, 0x1127, 0x0748, 0x0348, 0x0c99,
-		0x10a7, 0x0648, 0x0248, 0x0a99, 0x0048, 0x0848, 0x0448, 0x0e99,
-		0x1067, 0x05c8, 0x01c8, 0x0999, 0x1167, 0x07c8, 0x03c8, 0x0d99,
-		0x10e7, 0x06c8, 0x02c8, 0x0b99, 0x00c8, 0x08c8, 0x04c8, 0x0f99,
-		0x1017, 0x0528, 0x0128, 0x11a8, 0x1117, 0x0728, 0x0328, 0x0c59,
-		0x1097, 0x0628, 0x0228, 0x0a59, 0x0028, 0x0828, 0x0428, 0x0e59,
-		0x1057, 0x05a8, 0x01a8, 0x0959, 0x1157, 0x07a8, 0x03a8, 0x0d59,
-		0x10d7, 0x06a8, 0x02a8, 0x0b59, 0x00a8, 0x08a8, 0x04a8, 0x0f59,
-		0x1037, 0x0568, 0x0168, 0x11e8, 0x1137, 0x0768, 0x0368, 0x0cd9,
-		0x10b7, 0x0668, 0x0268, 0x0ad9, 0x0068, 0x0868, 0x0468, 0x0ed9,
-		0x1077, 0x05e8, 0x01e8, 0x09d9, 0x1177, 0x07e8, 0x03e8, 0x0dd9,
-		0x10f7, 0x06e8, 0x02e8, 0x0bd9, 0x00e8, 0x08e8, 0x04e8, 0x0fd9,
-		0x1007, 0x0518, 0x0118, 0x1198, 0x1107, 0x0718, 0x0318, 0x0c39,
-		0x1087, 0x0618, 0x0218, 0x0a39, 0x0018, 0x0818, 0x0418, 0x0e39,
-		0x1047, 0x0598, 0x0198, 0x0939, 0x1147, 0x0798, 0x0398, 0x0d39,
-		0x10c7, 0x0698, 0x0298, 0x0b39, 0x0098, 0x0898, 0x0498, 0x0f39,
-		0x1027, 0x0558, 0x0158, 0x11d8, 0x1127, 0x0758, 0x0358, 0x0cb9,
-		0x10a7, 0x0658, 0x0258, 0x0ab9, 0x0058, 0x0858, 0x0458, 0x0eb9,
-		0x1067, 0x05d8, 0x01d8, 0x09b9, 0x1167, 0x07d8, 0x03d8, 0x0db9,
-		0x10e7, 0x06d8, 0x02d8, 0x0bb9, 0x00d8, 0x08d8, 0x04d8, 0x0fb9,
-		0x1017, 0x0538, 0x0138, 0x11b8, 0x1117, 0x0738, 0x0338, 0x0c79,
-		0x1097, 0x0638, 0x0238, 0x0a79, 0x0038, 0x0838, 0x0438, 0x0e79,
-		0x1057, 0x05b8, 0x01b8, 0x0979, 0x1157, 0x07b8, 0x03b8, 0x0d79,
-		0x10d7, 0x06b8, 0x02b8, 0x0b79, 0x00b8, 0x08b8, 0x04b8, 0x0f79,
-		0x1037, 0x0578, 0x0178, 0x11f8, 0x1137, 0x0778, 0x0378, 0x0cf9,
-		0x10b7, 0x0678, 0x0278, 0x0af9, 0x0078, 0x0878, 0x0478, 0x0ef9,
-		0x1077, 0x05f8, 0x01f8, 0x09f9, 0x1177, 0x07f8, 0x03f8, 0x0df9,
-		0x10f7, 0x06f8, 0x02f8, 0x0bf9, 0x00f8, 0x08f8, 0x04f8, 0x0ff9,
-	},
-	nil, 0,
-}
diff --git a/third_party/gofrontend/libgo/go/compress/flate/flate_test.go b/third_party/gofrontend/libgo/go/compress/flate/flate_test.go
deleted file mode 100644
index 3f67025..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/flate_test.go
+++ /dev/null
@@ -1,260 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This test tests some internals of the flate package.
-// The tests in package compress/gzip serve as the
-// end-to-end test of the decompressor.
-
-package flate
-
-import (
-	"bytes"
-	"encoding/hex"
-	"io/ioutil"
-	"testing"
-)
-
-// The following test should not panic.
-func TestIssue5915(t *testing.T) {
-	bits := []int{4, 0, 0, 6, 4, 3, 2, 3, 3, 4, 4, 5, 0, 0, 0, 0, 5, 5, 6,
-		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 6, 0, 11, 0, 8, 0, 6, 6, 10, 8}
-	var h huffmanDecoder
-	if h.init(bits) {
-		t.Fatalf("Given sequence of bits is bad, and should not succeed.")
-	}
-}
-
-// The following test should not panic.
-func TestIssue5962(t *testing.T) {
-	bits := []int{4, 0, 0, 6, 4, 3, 2, 3, 3, 4, 4, 5, 0, 0, 0, 0,
-		5, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11}
-	var h huffmanDecoder
-	if h.init(bits) {
-		t.Fatalf("Given sequence of bits is bad, and should not succeed.")
-	}
-}
-
-// The following test should not panic.
-func TestIssue6255(t *testing.T) {
-	bits1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11}
-	bits2 := []int{11, 13}
-	var h huffmanDecoder
-	if !h.init(bits1) {
-		t.Fatalf("Given sequence of bits is good and should succeed.")
-	}
-	if h.init(bits2) {
-		t.Fatalf("Given sequence of bits is bad and should not succeed.")
-	}
-}
-
-func TestInvalidEncoding(t *testing.T) {
-	// Initialize Huffman decoder to recognize "0".
-	var h huffmanDecoder
-	if !h.init([]int{1}) {
-		t.Fatal("Failed to initialize Huffman decoder")
-	}
-
-	// Initialize decompressor with invalid Huffman coding.
-	var f decompressor
-	f.r = bytes.NewReader([]byte{0xff})
-
-	_, err := f.huffSym(&h)
-	if err == nil {
-		t.Fatal("Should have rejected invalid bit sequence")
-	}
-}
-
-func TestInvalidBits(t *testing.T) {
-	oversubscribed := []int{1, 2, 3, 4, 4, 5}
-	incomplete := []int{1, 2, 4, 4}
-	var h huffmanDecoder
-	if h.init(oversubscribed) {
-		t.Fatal("Should reject oversubscribed bit-length set")
-	}
-	if h.init(incomplete) {
-		t.Fatal("Should reject incomplete bit-length set")
-	}
-}
-
-func TestStreams(t *testing.T) {
-	// To verify any of these hexstrings as valid or invalid flate streams
-	// according to the C zlib library, you can use the Python wrapper library:
-	// >>> hex_string = "010100feff11"
-	// >>> import zlib
-	// >>> zlib.decompress(hex_string.decode("hex"), -15) # Negative means raw DEFLATE
-	// '\x11'
-
-	testCases := []struct {
-		desc   string // Description of the stream
-		stream string // Hexstring of the input DEFLATE stream
-		want   string // Expected result. Use "fail" to expect failure
-	}{{
-		"degenerate HCLenTree",
-		"05e0010000000000100000000000000000000000000000000000000000000000" +
-			"00000000000000000004",
-		"fail",
-	}, {
-		"complete HCLenTree, empty HLitTree, empty HDistTree",
-		"05e0010400000000000000000000000000000000000000000000000000000000" +
-			"00000000000000000010",
-		"fail",
-	}, {
-		"empty HCLenTree",
-		"05e0010000000000000000000000000000000000000000000000000000000000" +
-			"00000000000000000010",
-		"fail",
-	}, {
-		"complete HCLenTree, complete HLitTree, empty HDistTree, use missing HDist symbol",
-		"000100feff000de0010400000000100000000000000000000000000000000000" +
-			"0000000000000000000000000000002c",
-		"fail",
-	}, {
-		"complete HCLenTree, complete HLitTree, degenerate HDistTree, use missing HDist symbol",
-		"000100feff000de0010000000000000000000000000000000000000000000000" +
-			"00000000000000000610000000004070",
-		"fail",
-	}, {
-		"complete HCLenTree, empty HLitTree, empty HDistTree",
-		"05e0010400000000100400000000000000000000000000000000000000000000" +
-			"0000000000000000000000000008",
-		"fail",
-	}, {
-		"complete HCLenTree, empty HLitTree, degenerate HDistTree",
-		"05e0010400000000100400000000000000000000000000000000000000000000" +
-			"0000000000000000000800000008",
-		"fail",
-	}, {
-		"complete HCLenTree, degenerate HLitTree, degenerate HDistTree, use missing HLit symbol",
-		"05e0010400000000100000000000000000000000000000000000000000000000" +
-			"0000000000000000001c",
-		"fail",
-	}, {
-		"complete HCLenTree, complete HLitTree, too large HDistTree",
-		"edff870500000000200400000000000000000000000000000000000000000000" +
-			"000000000000000000080000000000000004",
-		"fail",
-	}, {
-		"complete HCLenTree, complete HLitTree, empty HDistTree, excessive repeater code",
-		"edfd870500000000200400000000000000000000000000000000000000000000" +
-			"000000000000000000e8b100",
-		"fail",
-	}, {
-		"complete HCLenTree, complete HLitTree, empty HDistTree of normal length 30",
-		"05fd01240000000000f8ffffffffffffffffffffffffffffffffffffffffffff" +
-			"ffffffffffffffffff07000000fe01",
-		"",
-	}, {
-		"complete HCLenTree, complete HLitTree, empty HDistTree of excessive length 31",
-		"05fe01240000000000f8ffffffffffffffffffffffffffffffffffffffffffff" +
-			"ffffffffffffffffff07000000fc03",
-		"fail",
-	}, {
-		"complete HCLenTree, over-subscribed HLitTree, empty HDistTree",
-		"05e001240000000000fcffffffffffffffffffffffffffffffffffffffffffff" +
-			"ffffffffffffffffff07f00f",
-		"fail",
-	}, {
-		"complete HCLenTree, under-subscribed HLitTree, empty HDistTree",
-		"05e001240000000000fcffffffffffffffffffffffffffffffffffffffffffff" +
-			"fffffffffcffffffff07f00f",
-		"fail",
-	}, {
-		"complete HCLenTree, complete HLitTree with single code, empty HDistTree",
-		"05e001240000000000f8ffffffffffffffffffffffffffffffffffffffffffff" +
-			"ffffffffffffffffff07f00f",
-		"01",
-	}, {
-		"complete HCLenTree, complete HLitTree with multiple codes, empty HDistTree",
-		"05e301240000000000f8ffffffffffffffffffffffffffffffffffffffffffff" +
-			"ffffffffffffffffff07807f",
-		"01",
-	}, {
-		"complete HCLenTree, complete HLitTree, degenerate HDistTree, use valid HDist symbol",
-		"000100feff000de0010400000000100000000000000000000000000000000000" +
-			"0000000000000000000000000000003c",
-		"00000000",
-	}, {
-		"complete HCLenTree, degenerate HLitTree, degenerate HDistTree",
-		"05e0010400000000100000000000000000000000000000000000000000000000" +
-			"0000000000000000000c",
-		"",
-	}, {
-		"complete HCLenTree, degenerate HLitTree, empty HDistTree",
-		"05e0010400000000100000000000000000000000000000000000000000000000" +
-			"00000000000000000004",
-		"",
-	}, {
-		"complete HCLenTree, complete HLitTree, empty HDistTree, spanning repeater code",
-		"edfd870500000000200400000000000000000000000000000000000000000000" +
-			"000000000000000000e8b000",
-		"",
-	}, {
-		"complete HCLenTree with length codes, complete HLitTree, empty HDistTree",
-		"ede0010400000000100000000000000000000000000000000000000000000000" +
-			"0000000000000000000400004000",
-		"",
-	}, {
-		"complete HCLenTree, complete HLitTree, degenerate HDistTree, use valid HLit symbol 284 with count 31",
-		"000100feff00ede0010400000000100000000000000000000000000000000000" +
-			"000000000000000000000000000000040000407f00",
-		"0000000000000000000000000000000000000000000000000000000000000000" +
-			"0000000000000000000000000000000000000000000000000000000000000000" +
-			"0000000000000000000000000000000000000000000000000000000000000000" +
-			"0000000000000000000000000000000000000000000000000000000000000000" +
-			"0000000000000000000000000000000000000000000000000000000000000000" +
-			"0000000000000000000000000000000000000000000000000000000000000000" +
-			"0000000000000000000000000000000000000000000000000000000000000000" +
-			"0000000000000000000000000000000000000000000000000000000000000000" +
-			"000000",
-	}, {
-		"complete HCLenTree, complete HLitTree, degenerate HDistTree, use valid HLit and HDist symbols",
-		"0cc2010d00000082b0ac4aff0eb07d27060000ffff",
-		"616263616263",
-	}, {
-		"fixed block, use reserved symbol 287",
-		"33180700",
-		"fail",
-	}, {
-		"raw block",
-		"010100feff11",
-		"11",
-	}, {
-		"issue 10426 - over-subscribed HCLenTree causes a hang",
-		"344c4a4e494d4b070000ff2e2eff2e2e2e2e2eff",
-		"fail",
-	}, {
-		"issue 11030 - empty HDistTree unexpectedly leads to error",
-		"05c0070600000080400fff37a0ca",
-		"",
-	}, {
-		"issue 11033 - empty HDistTree unexpectedly leads to error",
-		"050fb109c020cca5d017dcbca044881ee1034ec149c8980bbc413c2ab35be9dc" +
-			"b1473449922449922411202306ee97b0383a521b4ffdcf3217f9f7d3adb701",
-		"3130303634342068652e706870005d05355f7ed957ff084a90925d19e3ebc6d0" +
-			"c6d7",
-	}}
-
-	for i, tc := range testCases {
-		data, err := hex.DecodeString(tc.stream)
-		if err != nil {
-			t.Fatal(err)
-		}
-		data, err = ioutil.ReadAll(NewReader(bytes.NewReader(data)))
-		if tc.want == "fail" {
-			if err == nil {
-				t.Errorf("#%d (%s): got nil error, want non-nil", i, tc.desc)
-			}
-		} else {
-			if err != nil {
-				t.Errorf("#%d (%s): %v", i, tc.desc, err)
-				continue
-			}
-			if got := hex.EncodeToString(data); got != tc.want {
-				t.Errorf("#%d (%s):\ngot  %q\nwant %q", i, tc.desc, got, tc.want)
-			}
-
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/compress/flate/gen.go b/third_party/gofrontend/libgo/go/compress/flate/gen.go
deleted file mode 100644
index 154c89a..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/gen.go
+++ /dev/null
@@ -1,265 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// This program generates fixedhuff.go
-// Invoke as
-//
-//	go run gen.go -output fixedhuff.go
-
-package main
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"go/format"
-	"io/ioutil"
-	"log"
-)
-
-var filename = flag.String("output", "fixedhuff.go", "output file name")
-
-const maxCodeLen = 16
-
-// Note: the definition of the huffmanDecoder struct is copied from
-// inflate.go, as it is private to the implementation.
-
-// chunk & 15 is number of bits
-// chunk >> 4 is value, including table link
-
-const (
-	huffmanChunkBits  = 9
-	huffmanNumChunks  = 1 << huffmanChunkBits
-	huffmanCountMask  = 15
-	huffmanValueShift = 4
-)
-
-type huffmanDecoder struct {
-	min      int                      // the minimum code length
-	chunks   [huffmanNumChunks]uint32 // chunks as described above
-	links    [][]uint32               // overflow links
-	linkMask uint32                   // mask the width of the link table
-}
-
-// Initialize Huffman decoding tables from array of code lengths.
-// Following this function, h is guaranteed to be initialized into a complete
-// tree (i.e., neither over-subscribed nor under-subscribed). The exception is a
-// degenerate case where the tree has only a single symbol with length 1. Empty
-// trees are permitted.
-func (h *huffmanDecoder) init(bits []int) bool {
-	// Sanity enables additional runtime tests during Huffman
-	// table construction.  It's intended to be used during
-	// development to supplement the currently ad-hoc unit tests.
-	const sanity = false
-
-	if h.min != 0 {
-		*h = huffmanDecoder{}
-	}
-
-	// Count number of codes of each length,
-	// compute min and max length.
-	var count [maxCodeLen]int
-	var min, max int
-	for _, n := range bits {
-		if n == 0 {
-			continue
-		}
-		if min == 0 || n < min {
-			min = n
-		}
-		if n > max {
-			max = n
-		}
-		count[n]++
-	}
-
-	// Empty tree. The decompressor.huffSym function will fail later if the tree
-	// is used. Technically, an empty tree is only valid for the HDIST tree and
-	// not the HCLEN and HLIT tree. However, a stream with an empty HCLEN tree
-	// is guaranteed to fail since it will attempt to use the tree to decode the
-	// codes for the HLIT and HDIST trees. Similarly, an empty HLIT tree is
-	// guaranteed to fail later since the compressed data section must be
-	// composed of at least one symbol (the end-of-block marker).
-	if max == 0 {
-		return true
-	}
-
-	code := 0
-	var nextcode [maxCodeLen]int
-	for i := min; i <= max; i++ {
-		code <<= 1
-		nextcode[i] = code
-		code += count[i]
-	}
-
-	// Check that the coding is complete (i.e., that we've
-	// assigned all 2-to-the-max possible bit sequences).
-	// Exception: To be compatible with zlib, we also need to
-	// accept degenerate single-code codings.  See also
-	// TestDegenerateHuffmanCoding.
-	if code != 1<<uint(max) && !(code == 1 && max == 1) {
-		return false
-	}
-
-	h.min = min
-	if max > huffmanChunkBits {
-		numLinks := 1 << (uint(max) - huffmanChunkBits)
-		h.linkMask = uint32(numLinks - 1)
-
-		// create link tables
-		link := nextcode[huffmanChunkBits+1] >> 1
-		h.links = make([][]uint32, huffmanNumChunks-link)
-		for j := uint(link); j < huffmanNumChunks; j++ {
-			reverse := int(reverseByte[j>>8]) | int(reverseByte[j&0xff])<<8
-			reverse >>= uint(16 - huffmanChunkBits)
-			off := j - uint(link)
-			if sanity && h.chunks[reverse] != 0 {
-				panic("impossible: overwriting existing chunk")
-			}
-			h.chunks[reverse] = uint32(off<<huffmanValueShift | (huffmanChunkBits + 1))
-			h.links[off] = make([]uint32, numLinks)
-		}
-	}
-
-	for i, n := range bits {
-		if n == 0 {
-			continue
-		}
-		code := nextcode[n]
-		nextcode[n]++
-		chunk := uint32(i<<huffmanValueShift | n)
-		reverse := int(reverseByte[code>>8]) | int(reverseByte[code&0xff])<<8
-		reverse >>= uint(16 - n)
-		if n <= huffmanChunkBits {
-			for off := reverse; off < len(h.chunks); off += 1 << uint(n) {
-				// We should never need to overwrite
-				// an existing chunk.  Also, 0 is
-				// never a valid chunk, because the
-				// lower 4 "count" bits should be
-				// between 1 and 15.
-				if sanity && h.chunks[off] != 0 {
-					panic("impossible: overwriting existing chunk")
-				}
-				h.chunks[off] = chunk
-			}
-		} else {
-			j := reverse & (huffmanNumChunks - 1)
-			if sanity && h.chunks[j]&huffmanCountMask != huffmanChunkBits+1 {
-				// Longer codes should have been
-				// associated with a link table above.
-				panic("impossible: not an indirect chunk")
-			}
-			value := h.chunks[j] >> huffmanValueShift
-			linktab := h.links[value]
-			reverse >>= huffmanChunkBits
-			for off := reverse; off < len(linktab); off += 1 << uint(n-huffmanChunkBits) {
-				if sanity && linktab[off] != 0 {
-					panic("impossible: overwriting existing chunk")
-				}
-				linktab[off] = chunk
-			}
-		}
-	}
-
-	if sanity {
-		// Above we've sanity checked that we never overwrote
-		// an existing entry.  Here we additionally check that
-		// we filled the tables completely.
-		for i, chunk := range h.chunks {
-			if chunk == 0 {
-				// As an exception, in the degenerate
-				// single-code case, we allow odd
-				// chunks to be missing.
-				if code == 1 && i%2 == 1 {
-					continue
-				}
-				panic("impossible: missing chunk")
-			}
-		}
-		for _, linktab := range h.links {
-			for _, chunk := range linktab {
-				if chunk == 0 {
-					panic("impossible: missing chunk")
-				}
-			}
-		}
-	}
-
-	return true
-}
-
-func main() {
-	flag.Parse()
-
-	var h huffmanDecoder
-	var bits [288]int
-	initReverseByte()
-	for i := 0; i < 144; i++ {
-		bits[i] = 8
-	}
-	for i := 144; i < 256; i++ {
-		bits[i] = 9
-	}
-	for i := 256; i < 280; i++ {
-		bits[i] = 7
-	}
-	for i := 280; i < 288; i++ {
-		bits[i] = 8
-	}
-	h.init(bits[:])
-	if h.links != nil {
-		log.Fatal("Unexpected links table in fixed Huffman decoder")
-	}
-
-	var buf bytes.Buffer
-
-	fmt.Fprintf(&buf, `// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.`+"\n\n")
-
-	fmt.Fprintln(&buf, "package flate")
-	fmt.Fprintln(&buf)
-	fmt.Fprintln(&buf, "// autogenerated by go run gen.go -output fixedhuff.go, DO NOT EDIT")
-	fmt.Fprintln(&buf)
-	fmt.Fprintln(&buf, "var fixedHuffmanDecoder = huffmanDecoder{")
-	fmt.Fprintf(&buf, "\t%d,\n", h.min)
-	fmt.Fprintln(&buf, "\t[huffmanNumChunks]uint32{")
-	for i := 0; i < huffmanNumChunks; i++ {
-		if i&7 == 0 {
-			fmt.Fprintf(&buf, "\t\t")
-		} else {
-			fmt.Fprintf(&buf, " ")
-		}
-		fmt.Fprintf(&buf, "0x%04x,", h.chunks[i])
-		if i&7 == 7 {
-			fmt.Fprintln(&buf)
-		}
-	}
-	fmt.Fprintln(&buf, "\t},")
-	fmt.Fprintln(&buf, "\tnil, 0,")
-	fmt.Fprintln(&buf, "}")
-
-	data, err := format.Source(buf.Bytes())
-	if err != nil {
-		log.Fatal(err)
-	}
-	err = ioutil.WriteFile(*filename, data, 0644)
-	if err != nil {
-		log.Fatal(err)
-	}
-}
-
-var reverseByte [256]byte
-
-func initReverseByte() {
-	for x := 0; x < 256; x++ {
-		var result byte
-		for i := uint(0); i < 8; i++ {
-			result |= byte(((x >> i) & 1) << (7 - i))
-		}
-		reverseByte[x] = result
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/compress/flate/huffman_bit_writer.go b/third_party/gofrontend/libgo/go/compress/flate/huffman_bit_writer.go
deleted file mode 100644
index 6164404..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/huffman_bit_writer.go
+++ /dev/null
@@ -1,517 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flate
-
-import (
-	"io"
-	"math"
-)
-
-const (
-	// The largest offset code.
-	offsetCodeCount = 30
-
-	// The special code used to mark the end of a block.
-	endBlockMarker = 256
-
-	// The first length code.
-	lengthCodesStart = 257
-
-	// The number of codegen codes.
-	codegenCodeCount = 19
-	badCode          = 255
-)
-
-// The number of extra bits needed by length code X - LENGTH_CODES_START.
-var lengthExtraBits = []int8{
-	/* 257 */ 0, 0, 0,
-	/* 260 */ 0, 0, 0, 0, 0, 1, 1, 1, 1, 2,
-	/* 270 */ 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,
-	/* 280 */ 4, 5, 5, 5, 5, 0,
-}
-
-// The length indicated by length code X - LENGTH_CODES_START.
-var lengthBase = []uint32{
-	0, 1, 2, 3, 4, 5, 6, 7, 8, 10,
-	12, 14, 16, 20, 24, 28, 32, 40, 48, 56,
-	64, 80, 96, 112, 128, 160, 192, 224, 255,
-}
-
-// offset code word extra bits.
-var offsetExtraBits = []int8{
-	0, 0, 0, 0, 1, 1, 2, 2, 3, 3,
-	4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
-	9, 9, 10, 10, 11, 11, 12, 12, 13, 13,
-	/* extended window */
-	14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20,
-}
-
-var offsetBase = []uint32{
-	/* normal deflate */
-	0x000000, 0x000001, 0x000002, 0x000003, 0x000004,
-	0x000006, 0x000008, 0x00000c, 0x000010, 0x000018,
-	0x000020, 0x000030, 0x000040, 0x000060, 0x000080,
-	0x0000c0, 0x000100, 0x000180, 0x000200, 0x000300,
-	0x000400, 0x000600, 0x000800, 0x000c00, 0x001000,
-	0x001800, 0x002000, 0x003000, 0x004000, 0x006000,
-
-	/* extended window */
-	0x008000, 0x00c000, 0x010000, 0x018000, 0x020000,
-	0x030000, 0x040000, 0x060000, 0x080000, 0x0c0000,
-	0x100000, 0x180000, 0x200000, 0x300000,
-}
-
-// The odd order in which the codegen code sizes are written.
-var codegenOrder = []uint32{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}
-
-type huffmanBitWriter struct {
-	w io.Writer
-	// Data waiting to be written is bytes[0:nbytes]
-	// and then the low nbits of bits.
-	bits            uint32
-	nbits           uint32
-	bytes           [64]byte
-	nbytes          int
-	literalFreq     []int32
-	offsetFreq      []int32
-	codegen         []uint8
-	codegenFreq     []int32
-	literalEncoding *huffmanEncoder
-	offsetEncoding  *huffmanEncoder
-	codegenEncoding *huffmanEncoder
-	err             error
-}
-
-func newHuffmanBitWriter(w io.Writer) *huffmanBitWriter {
-	return &huffmanBitWriter{
-		w:               w,
-		literalFreq:     make([]int32, maxNumLit),
-		offsetFreq:      make([]int32, offsetCodeCount),
-		codegen:         make([]uint8, maxNumLit+offsetCodeCount+1),
-		codegenFreq:     make([]int32, codegenCodeCount),
-		literalEncoding: newHuffmanEncoder(maxNumLit),
-		offsetEncoding:  newHuffmanEncoder(offsetCodeCount),
-		codegenEncoding: newHuffmanEncoder(codegenCodeCount),
-	}
-}
-
-func (w *huffmanBitWriter) reset(writer io.Writer) {
-	w.w = writer
-	w.bits, w.nbits, w.nbytes, w.err = 0, 0, 0, nil
-	w.bytes = [64]byte{}
-	for i := range w.codegen {
-		w.codegen[i] = 0
-	}
-	for _, s := range [...][]int32{w.literalFreq, w.offsetFreq, w.codegenFreq} {
-		for i := range s {
-			s[i] = 0
-		}
-	}
-	for _, enc := range [...]*huffmanEncoder{
-		w.literalEncoding,
-		w.offsetEncoding,
-		w.codegenEncoding} {
-		for i := range enc.code {
-			enc.code[i] = 0
-		}
-		for i := range enc.codeBits {
-			enc.codeBits[i] = 0
-		}
-	}
-}
-
-func (w *huffmanBitWriter) flushBits() {
-	if w.err != nil {
-		w.nbits = 0
-		return
-	}
-	bits := w.bits
-	w.bits >>= 16
-	w.nbits -= 16
-	n := w.nbytes
-	w.bytes[n] = byte(bits)
-	w.bytes[n+1] = byte(bits >> 8)
-	if n += 2; n >= len(w.bytes) {
-		_, w.err = w.w.Write(w.bytes[0:])
-		n = 0
-	}
-	w.nbytes = n
-}
-
-func (w *huffmanBitWriter) flush() {
-	if w.err != nil {
-		w.nbits = 0
-		return
-	}
-	n := w.nbytes
-	if w.nbits > 8 {
-		w.bytes[n] = byte(w.bits)
-		w.bits >>= 8
-		w.nbits -= 8
-		n++
-	}
-	if w.nbits > 0 {
-		w.bytes[n] = byte(w.bits)
-		w.nbits = 0
-		n++
-	}
-	w.bits = 0
-	_, w.err = w.w.Write(w.bytes[0:n])
-	w.nbytes = 0
-}
-
-func (w *huffmanBitWriter) writeBits(b, nb int32) {
-	w.bits |= uint32(b) << w.nbits
-	if w.nbits += uint32(nb); w.nbits >= 16 {
-		w.flushBits()
-	}
-}
-
-func (w *huffmanBitWriter) writeBytes(bytes []byte) {
-	if w.err != nil {
-		return
-	}
-	n := w.nbytes
-	if w.nbits == 8 {
-		w.bytes[n] = byte(w.bits)
-		w.nbits = 0
-		n++
-	}
-	if w.nbits != 0 {
-		w.err = InternalError("writeBytes with unfinished bits")
-		return
-	}
-	if n != 0 {
-		_, w.err = w.w.Write(w.bytes[0:n])
-		if w.err != nil {
-			return
-		}
-	}
-	w.nbytes = 0
-	_, w.err = w.w.Write(bytes)
-}
-
-// RFC 1951 3.2.7 specifies a special run-length encoding for specifying
-// the literal and offset lengths arrays (which are concatenated into a single
-// array).  This method generates that run-length encoding.
-//
-// The result is written into the codegen array, and the frequencies
-// of each code is written into the codegenFreq array.
-// Codes 0-15 are single byte codes. Codes 16-18 are followed by additional
-// information.  Code badCode is an end marker
-//
-//  numLiterals      The number of literals in literalEncoding
-//  numOffsets       The number of offsets in offsetEncoding
-func (w *huffmanBitWriter) generateCodegen(numLiterals int, numOffsets int) {
-	for i := range w.codegenFreq {
-		w.codegenFreq[i] = 0
-	}
-	// Note that we are using codegen both as a temporary variable for holding
-	// a copy of the frequencies, and as the place where we put the result.
-	// This is fine because the output is always shorter than the input used
-	// so far.
-	codegen := w.codegen // cache
-	// Copy the concatenated code sizes to codegen.  Put a marker at the end.
-	copy(codegen[0:numLiterals], w.literalEncoding.codeBits)
-	copy(codegen[numLiterals:numLiterals+numOffsets], w.offsetEncoding.codeBits)
-	codegen[numLiterals+numOffsets] = badCode
-
-	size := codegen[0]
-	count := 1
-	outIndex := 0
-	for inIndex := 1; size != badCode; inIndex++ {
-		// INVARIANT: We have seen "count" copies of size that have not yet
-		// had output generated for them.
-		nextSize := codegen[inIndex]
-		if nextSize == size {
-			count++
-			continue
-		}
-		// We need to generate codegen indicating "count" of size.
-		if size != 0 {
-			codegen[outIndex] = size
-			outIndex++
-			w.codegenFreq[size]++
-			count--
-			for count >= 3 {
-				n := 6
-				if n > count {
-					n = count
-				}
-				codegen[outIndex] = 16
-				outIndex++
-				codegen[outIndex] = uint8(n - 3)
-				outIndex++
-				w.codegenFreq[16]++
-				count -= n
-			}
-		} else {
-			for count >= 11 {
-				n := 138
-				if n > count {
-					n = count
-				}
-				codegen[outIndex] = 18
-				outIndex++
-				codegen[outIndex] = uint8(n - 11)
-				outIndex++
-				w.codegenFreq[18]++
-				count -= n
-			}
-			if count >= 3 {
-				// count >= 3 && count <= 10
-				codegen[outIndex] = 17
-				outIndex++
-				codegen[outIndex] = uint8(count - 3)
-				outIndex++
-				w.codegenFreq[17]++
-				count = 0
-			}
-		}
-		count--
-		for ; count >= 0; count-- {
-			codegen[outIndex] = size
-			outIndex++
-			w.codegenFreq[size]++
-		}
-		// Set up invariant for next time through the loop.
-		size = nextSize
-		count = 1
-	}
-	// Marker indicating the end of the codegen.
-	codegen[outIndex] = badCode
-}
-
-func (w *huffmanBitWriter) writeCode(code *huffmanEncoder, literal uint32) {
-	if w.err != nil {
-		return
-	}
-	w.writeBits(int32(code.code[literal]), int32(code.codeBits[literal]))
-}
-
-// Write the header of a dynamic Huffman block to the output stream.
-//
-//  numLiterals  The number of literals specified in codegen
-//  numOffsets   The number of offsets specified in codegen
-//  numCodegens  The number of codegens used in codegen
-func (w *huffmanBitWriter) writeDynamicHeader(numLiterals int, numOffsets int, numCodegens int, isEof bool) {
-	if w.err != nil {
-		return
-	}
-	var firstBits int32 = 4
-	if isEof {
-		firstBits = 5
-	}
-	w.writeBits(firstBits, 3)
-	w.writeBits(int32(numLiterals-257), 5)
-	w.writeBits(int32(numOffsets-1), 5)
-	w.writeBits(int32(numCodegens-4), 4)
-
-	for i := 0; i < numCodegens; i++ {
-		value := w.codegenEncoding.codeBits[codegenOrder[i]]
-		w.writeBits(int32(value), 3)
-	}
-
-	i := 0
-	for {
-		var codeWord int = int(w.codegen[i])
-		i++
-		if codeWord == badCode {
-			break
-		}
-		// The low byte contains the actual code to generate.
-		w.writeCode(w.codegenEncoding, uint32(codeWord))
-
-		switch codeWord {
-		case 16:
-			w.writeBits(int32(w.codegen[i]), 2)
-			i++
-			break
-		case 17:
-			w.writeBits(int32(w.codegen[i]), 3)
-			i++
-			break
-		case 18:
-			w.writeBits(int32(w.codegen[i]), 7)
-			i++
-			break
-		}
-	}
-}
-
-func (w *huffmanBitWriter) writeStoredHeader(length int, isEof bool) {
-	if w.err != nil {
-		return
-	}
-	var flag int32
-	if isEof {
-		flag = 1
-	}
-	w.writeBits(flag, 3)
-	w.flush()
-	w.writeBits(int32(length), 16)
-	w.writeBits(int32(^uint16(length)), 16)
-}
-
-func (w *huffmanBitWriter) writeFixedHeader(isEof bool) {
-	if w.err != nil {
-		return
-	}
-	// Indicate that we are a fixed Huffman block
-	var value int32 = 2
-	if isEof {
-		value = 3
-	}
-	w.writeBits(value, 3)
-}
-
-func (w *huffmanBitWriter) writeBlock(tokens []token, eof bool, input []byte) {
-	if w.err != nil {
-		return
-	}
-	for i := range w.literalFreq {
-		w.literalFreq[i] = 0
-	}
-	for i := range w.offsetFreq {
-		w.offsetFreq[i] = 0
-	}
-
-	n := len(tokens)
-	tokens = tokens[0 : n+1]
-	tokens[n] = endBlockMarker
-
-	for _, t := range tokens {
-		switch t.typ() {
-		case literalType:
-			w.literalFreq[t.literal()]++
-		case matchType:
-			length := t.length()
-			offset := t.offset()
-			w.literalFreq[lengthCodesStart+lengthCode(length)]++
-			w.offsetFreq[offsetCode(offset)]++
-		}
-	}
-
-	// get the number of literals
-	numLiterals := len(w.literalFreq)
-	for w.literalFreq[numLiterals-1] == 0 {
-		numLiterals--
-	}
-	// get the number of offsets
-	numOffsets := len(w.offsetFreq)
-	for numOffsets > 0 && w.offsetFreq[numOffsets-1] == 0 {
-		numOffsets--
-	}
-	if numOffsets == 0 {
-		// We haven't found a single match. If we want to go with the dynamic encoding,
-		// we should count at least one offset to be sure that the offset huffman tree could be encoded.
-		w.offsetFreq[0] = 1
-		numOffsets = 1
-	}
-
-	w.literalEncoding.generate(w.literalFreq, 15)
-	w.offsetEncoding.generate(w.offsetFreq, 15)
-
-	storedBytes := 0
-	if input != nil {
-		storedBytes = len(input)
-	}
-	var extraBits int64
-	var storedSize int64 = math.MaxInt64
-	if storedBytes <= maxStoreBlockSize && input != nil {
-		storedSize = int64((storedBytes + 5) * 8)
-		// We only bother calculating the costs of the extra bits required by
-		// the length of offset fields (which will be the same for both fixed
-		// and dynamic encoding), if we need to compare those two encodings
-		// against stored encoding.
-		for lengthCode := lengthCodesStart + 8; lengthCode < numLiterals; lengthCode++ {
-			// First eight length codes have extra size = 0.
-			extraBits += int64(w.literalFreq[lengthCode]) * int64(lengthExtraBits[lengthCode-lengthCodesStart])
-		}
-		for offsetCode := 4; offsetCode < numOffsets; offsetCode++ {
-			// First four offset codes have extra size = 0.
-			extraBits += int64(w.offsetFreq[offsetCode]) * int64(offsetExtraBits[offsetCode])
-		}
-	}
-
-	// Figure out smallest code.
-	// Fixed Huffman baseline.
-	var size = int64(3) +
-		fixedLiteralEncoding.bitLength(w.literalFreq) +
-		fixedOffsetEncoding.bitLength(w.offsetFreq) +
-		extraBits
-	var literalEncoding = fixedLiteralEncoding
-	var offsetEncoding = fixedOffsetEncoding
-
-	// Dynamic Huffman?
-	var numCodegens int
-
-	// Generate codegen and codegenFrequencies, which indicates how to encode
-	// the literalEncoding and the offsetEncoding.
-	w.generateCodegen(numLiterals, numOffsets)
-	w.codegenEncoding.generate(w.codegenFreq, 7)
-	numCodegens = len(w.codegenFreq)
-	for numCodegens > 4 && w.codegenFreq[codegenOrder[numCodegens-1]] == 0 {
-		numCodegens--
-	}
-	dynamicHeader := int64(3+5+5+4+(3*numCodegens)) +
-		w.codegenEncoding.bitLength(w.codegenFreq) +
-		int64(extraBits) +
-		int64(w.codegenFreq[16]*2) +
-		int64(w.codegenFreq[17]*3) +
-		int64(w.codegenFreq[18]*7)
-	dynamicSize := dynamicHeader +
-		w.literalEncoding.bitLength(w.literalFreq) +
-		w.offsetEncoding.bitLength(w.offsetFreq)
-
-	if dynamicSize < size {
-		size = dynamicSize
-		literalEncoding = w.literalEncoding
-		offsetEncoding = w.offsetEncoding
-	}
-
-	// Stored bytes?
-	if storedSize < size {
-		w.writeStoredHeader(storedBytes, eof)
-		w.writeBytes(input[0:storedBytes])
-		return
-	}
-
-	// Huffman.
-	if literalEncoding == fixedLiteralEncoding {
-		w.writeFixedHeader(eof)
-	} else {
-		w.writeDynamicHeader(numLiterals, numOffsets, numCodegens, eof)
-	}
-	for _, t := range tokens {
-		switch t.typ() {
-		case literalType:
-			w.writeCode(literalEncoding, t.literal())
-			break
-		case matchType:
-			// Write the length
-			length := t.length()
-			lengthCode := lengthCode(length)
-			w.writeCode(literalEncoding, lengthCode+lengthCodesStart)
-			extraLengthBits := int32(lengthExtraBits[lengthCode])
-			if extraLengthBits > 0 {
-				extraLength := int32(length - lengthBase[lengthCode])
-				w.writeBits(extraLength, extraLengthBits)
-			}
-			// Write the offset
-			offset := t.offset()
-			offsetCode := offsetCode(offset)
-			w.writeCode(offsetEncoding, offsetCode)
-			extraOffsetBits := int32(offsetExtraBits[offsetCode])
-			if extraOffsetBits > 0 {
-				extraOffset := int32(offset - offsetBase[offsetCode])
-				w.writeBits(extraOffset, extraOffsetBits)
-			}
-			break
-		default:
-			panic("unknown token type: " + string(t))
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/compress/flate/huffman_code.go b/third_party/gofrontend/libgo/go/compress/flate/huffman_code.go
deleted file mode 100644
index 50ec79c..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/huffman_code.go
+++ /dev/null
@@ -1,323 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flate
-
-import (
-	"math"
-	"sort"
-)
-
-type huffmanEncoder struct {
-	codeBits []uint8
-	code     []uint16
-}
-
-type literalNode struct {
-	literal uint16
-	freq    int32
-}
-
-// A levelInfo describes the state of the constructed tree for a given depth.
-type levelInfo struct {
-	// Our level.  for better printing
-	level int32
-
-	// The frequency of the last node at this level
-	lastFreq int32
-
-	// The frequency of the next character to add to this level
-	nextCharFreq int32
-
-	// The frequency of the next pair (from level below) to add to this level.
-	// Only valid if the "needed" value of the next lower level is 0.
-	nextPairFreq int32
-
-	// The number of chains remaining to generate for this level before moving
-	// up to the next level
-	needed int32
-}
-
-func maxNode() literalNode { return literalNode{math.MaxUint16, math.MaxInt32} }
-
-func newHuffmanEncoder(size int) *huffmanEncoder {
-	return &huffmanEncoder{make([]uint8, size), make([]uint16, size)}
-}
-
-// Generates a HuffmanCode corresponding to the fixed literal table
-func generateFixedLiteralEncoding() *huffmanEncoder {
-	h := newHuffmanEncoder(maxNumLit)
-	codeBits := h.codeBits
-	code := h.code
-	var ch uint16
-	for ch = 0; ch < maxNumLit; ch++ {
-		var bits uint16
-		var size uint8
-		switch {
-		case ch < 144:
-			// size 8, 000110000  .. 10111111
-			bits = ch + 48
-			size = 8
-			break
-		case ch < 256:
-			// size 9, 110010000 .. 111111111
-			bits = ch + 400 - 144
-			size = 9
-			break
-		case ch < 280:
-			// size 7, 0000000 .. 0010111
-			bits = ch - 256
-			size = 7
-			break
-		default:
-			// size 8, 11000000 .. 11000111
-			bits = ch + 192 - 280
-			size = 8
-		}
-		codeBits[ch] = size
-		code[ch] = reverseBits(bits, size)
-	}
-	return h
-}
-
-func generateFixedOffsetEncoding() *huffmanEncoder {
-	h := newHuffmanEncoder(30)
-	codeBits := h.codeBits
-	code := h.code
-	for ch := uint16(0); ch < 30; ch++ {
-		codeBits[ch] = 5
-		code[ch] = reverseBits(ch, 5)
-	}
-	return h
-}
-
-var fixedLiteralEncoding *huffmanEncoder = generateFixedLiteralEncoding()
-var fixedOffsetEncoding *huffmanEncoder = generateFixedOffsetEncoding()
-
-func (h *huffmanEncoder) bitLength(freq []int32) int64 {
-	var total int64
-	for i, f := range freq {
-		if f != 0 {
-			total += int64(f) * int64(h.codeBits[i])
-		}
-	}
-	return total
-}
-
-const maxBitsLimit = 16
-
-// Return the number of literals assigned to each bit size in the Huffman encoding
-//
-// This method is only called when list.length >= 3
-// The cases of 0, 1, and 2 literals are handled by special case code.
-//
-// list  An array of the literals with non-zero frequencies
-//             and their associated frequencies.  The array is in order of increasing
-//             frequency, and has as its last element a special element with frequency
-//             MaxInt32
-// maxBits     The maximum number of bits that should be used to encode any literal.
-//             Must be less than 16.
-// return      An integer array in which array[i] indicates the number of literals
-//             that should be encoded in i bits.
-func (h *huffmanEncoder) bitCounts(list []literalNode, maxBits int32) []int32 {
-	if maxBits >= maxBitsLimit {
-		panic("flate: maxBits too large")
-	}
-	n := int32(len(list))
-	list = list[0 : n+1]
-	list[n] = maxNode()
-
-	// The tree can't have greater depth than n - 1, no matter what.  This
-	// saves a little bit of work in some small cases
-	if maxBits > n-1 {
-		maxBits = n - 1
-	}
-
-	// Create information about each of the levels.
-	// A bogus "Level 0" whose sole purpose is so that
-	// level1.prev.needed==0.  This makes level1.nextPairFreq
-	// be a legitimate value that never gets chosen.
-	var levels [maxBitsLimit]levelInfo
-	// leafCounts[i] counts the number of literals at the left
-	// of ancestors of the rightmost node at level i.
-	// leafCounts[i][j] is the number of literals at the left
-	// of the level j ancestor.
-	var leafCounts [maxBitsLimit][maxBitsLimit]int32
-
-	for level := int32(1); level <= maxBits; level++ {
-		// For every level, the first two items are the first two characters.
-		// We initialize the levels as if we had already figured this out.
-		levels[level] = levelInfo{
-			level:        level,
-			lastFreq:     list[1].freq,
-			nextCharFreq: list[2].freq,
-			nextPairFreq: list[0].freq + list[1].freq,
-		}
-		leafCounts[level][level] = 2
-		if level == 1 {
-			levels[level].nextPairFreq = math.MaxInt32
-		}
-	}
-
-	// We need a total of 2*n - 2 items at top level and have already generated 2.
-	levels[maxBits].needed = 2*n - 4
-
-	level := maxBits
-	for {
-		l := &levels[level]
-		if l.nextPairFreq == math.MaxInt32 && l.nextCharFreq == math.MaxInt32 {
-			// We've run out of both leafs and pairs.
-			// End all calculations for this level.
-			// To make sure we never come back to this level or any lower level,
-			// set nextPairFreq impossibly large.
-			l.needed = 0
-			levels[level+1].nextPairFreq = math.MaxInt32
-			level++
-			continue
-		}
-
-		prevFreq := l.lastFreq
-		if l.nextCharFreq < l.nextPairFreq {
-			// The next item on this row is a leaf node.
-			n := leafCounts[level][level] + 1
-			l.lastFreq = l.nextCharFreq
-			// Lower leafCounts are the same of the previous node.
-			leafCounts[level][level] = n
-			l.nextCharFreq = list[n].freq
-		} else {
-			// The next item on this row is a pair from the previous row.
-			// nextPairFreq isn't valid until we generate two
-			// more values in the level below
-			l.lastFreq = l.nextPairFreq
-			// Take leaf counts from the lower level, except counts[level] remains the same.
-			copy(leafCounts[level][:level], leafCounts[level-1][:level])
-			levels[l.level-1].needed = 2
-		}
-
-		if l.needed--; l.needed == 0 {
-			// We've done everything we need to do for this level.
-			// Continue calculating one level up.  Fill in nextPairFreq
-			// of that level with the sum of the two nodes we've just calculated on
-			// this level.
-			if l.level == maxBits {
-				// All done!
-				break
-			}
-			levels[l.level+1].nextPairFreq = prevFreq + l.lastFreq
-			level++
-		} else {
-			// If we stole from below, move down temporarily to replenish it.
-			for levels[level-1].needed > 0 {
-				level--
-			}
-		}
-	}
-
-	// Somethings is wrong if at the end, the top level is null or hasn't used
-	// all of the leaves.
-	if leafCounts[maxBits][maxBits] != n {
-		panic("leafCounts[maxBits][maxBits] != n")
-	}
-
-	bitCount := make([]int32, maxBits+1)
-	bits := 1
-	counts := &leafCounts[maxBits]
-	for level := maxBits; level > 0; level-- {
-		// chain.leafCount gives the number of literals requiring at least "bits"
-		// bits to encode.
-		bitCount[bits] = counts[level] - counts[level-1]
-		bits++
-	}
-	return bitCount
-}
-
-// Look at the leaves and assign them a bit count and an encoding as specified
-// in RFC 1951 3.2.2
-func (h *huffmanEncoder) assignEncodingAndSize(bitCount []int32, list []literalNode) {
-	code := uint16(0)
-	for n, bits := range bitCount {
-		code <<= 1
-		if n == 0 || bits == 0 {
-			continue
-		}
-		// The literals list[len(list)-bits] .. list[len(list)-bits]
-		// are encoded using "bits" bits, and get the values
-		// code, code + 1, ....  The code values are
-		// assigned in literal order (not frequency order).
-		chunk := list[len(list)-int(bits):]
-		sortByLiteral(chunk)
-		for _, node := range chunk {
-			h.codeBits[node.literal] = uint8(n)
-			h.code[node.literal] = reverseBits(code, uint8(n))
-			code++
-		}
-		list = list[0 : len(list)-int(bits)]
-	}
-}
-
-// Update this Huffman Code object to be the minimum code for the specified frequency count.
-//
-// freq  An array of frequencies, in which frequency[i] gives the frequency of literal i.
-// maxBits  The maximum number of bits to use for any literal.
-func (h *huffmanEncoder) generate(freq []int32, maxBits int32) {
-	list := make([]literalNode, len(freq)+1)
-	// Number of non-zero literals
-	count := 0
-	// Set list to be the set of all non-zero literals and their frequencies
-	for i, f := range freq {
-		if f != 0 {
-			list[count] = literalNode{uint16(i), f}
-			count++
-		} else {
-			h.codeBits[i] = 0
-		}
-	}
-	// If freq[] is shorter than codeBits[], fill rest of codeBits[] with zeros
-	h.codeBits = h.codeBits[0:len(freq)]
-	list = list[0:count]
-	if count <= 2 {
-		// Handle the small cases here, because they are awkward for the general case code.  With
-		// two or fewer literals, everything has bit length 1.
-		for i, node := range list {
-			// "list" is in order of increasing literal value.
-			h.codeBits[node.literal] = 1
-			h.code[node.literal] = uint16(i)
-		}
-		return
-	}
-	sortByFreq(list)
-
-	// Get the number of literals for each bit count
-	bitCount := h.bitCounts(list, maxBits)
-	// And do the assignment
-	h.assignEncodingAndSize(bitCount, list)
-}
-
-type literalNodeSorter struct {
-	a    []literalNode
-	less func(i, j int) bool
-}
-
-func (s literalNodeSorter) Len() int { return len(s.a) }
-
-func (s literalNodeSorter) Less(i, j int) bool {
-	return s.less(i, j)
-}
-
-func (s literalNodeSorter) Swap(i, j int) { s.a[i], s.a[j] = s.a[j], s.a[i] }
-
-func sortByFreq(a []literalNode) {
-	s := &literalNodeSorter{a, func(i, j int) bool {
-		if a[i].freq == a[j].freq {
-			return a[i].literal < a[j].literal
-		}
-		return a[i].freq < a[j].freq
-	}}
-	sort.Sort(s)
-}
-
-func sortByLiteral(a []literalNode) {
-	s := &literalNodeSorter{a, func(i, j int) bool { return a[i].literal < a[j].literal }}
-	sort.Sort(s)
-}
diff --git a/third_party/gofrontend/libgo/go/compress/flate/inflate.go b/third_party/gofrontend/libgo/go/compress/flate/inflate.go
deleted file mode 100644
index 04372de..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/inflate.go
+++ /dev/null
@@ -1,811 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:generate go run gen.go -output fixedhuff.go
-
-// Package flate implements the DEFLATE compressed data format, described in
-// RFC 1951.  The gzip and zlib packages implement access to DEFLATE-based file
-// formats.
-package flate
-
-import (
-	"bufio"
-	"io"
-	"strconv"
-)
-
-const (
-	maxCodeLen = 16    // max length of Huffman code
-	maxHist    = 32768 // max history required
-	// The next three numbers come from the RFC section 3.2.7, with the
-	// additional proviso in section 3.2.5 which implies that distance codes
-	// 30 and 31 should never occur in compressed data.
-	maxNumLit  = 286
-	maxNumDist = 30
-	numCodes   = 19 // number of codes in Huffman meta-code
-)
-
-// A CorruptInputError reports the presence of corrupt input at a given offset.
-type CorruptInputError int64
-
-func (e CorruptInputError) Error() string {
-	return "flate: corrupt input before offset " + strconv.FormatInt(int64(e), 10)
-}
-
-// An InternalError reports an error in the flate code itself.
-type InternalError string
-
-func (e InternalError) Error() string { return "flate: internal error: " + string(e) }
-
-// A ReadError reports an error encountered while reading input.
-type ReadError struct {
-	Offset int64 // byte offset where error occurred
-	Err    error // error returned by underlying Read
-}
-
-func (e *ReadError) Error() string {
-	return "flate: read error at offset " + strconv.FormatInt(e.Offset, 10) + ": " + e.Err.Error()
-}
-
-// A WriteError reports an error encountered while writing output.
-type WriteError struct {
-	Offset int64 // byte offset where error occurred
-	Err    error // error returned by underlying Write
-}
-
-func (e *WriteError) Error() string {
-	return "flate: write error at offset " + strconv.FormatInt(e.Offset, 10) + ": " + e.Err.Error()
-}
-
-// Resetter resets a ReadCloser returned by NewReader or NewReaderDict to
-// to switch to a new underlying Reader. This permits reusing a ReadCloser
-// instead of allocating a new one.
-type Resetter interface {
-	// Reset discards any buffered data and resets the Resetter as if it was
-	// newly initialized with the given reader.
-	Reset(r io.Reader, dict []byte) error
-}
-
-// Note that much of the implementation of huffmanDecoder is also copied
-// into gen.go (in package main) for the purpose of precomputing the
-// fixed huffman tables so they can be included statically.
-
-// The data structure for decoding Huffman tables is based on that of
-// zlib. There is a lookup table of a fixed bit width (huffmanChunkBits),
-// For codes smaller than the table width, there are multiple entries
-// (each combination of trailing bits has the same value). For codes
-// larger than the table width, the table contains a link to an overflow
-// table. The width of each entry in the link table is the maximum code
-// size minus the chunk width.
-
-// Note that you can do a lookup in the table even without all bits
-// filled. Since the extra bits are zero, and the DEFLATE Huffman codes
-// have the property that shorter codes come before longer ones, the
-// bit length estimate in the result is a lower bound on the actual
-// number of bits.
-
-// chunk & 15 is number of bits
-// chunk >> 4 is value, including table link
-
-const (
-	huffmanChunkBits  = 9
-	huffmanNumChunks  = 1 << huffmanChunkBits
-	huffmanCountMask  = 15
-	huffmanValueShift = 4
-)
-
-type huffmanDecoder struct {
-	min      int                      // the minimum code length
-	chunks   [huffmanNumChunks]uint32 // chunks as described above
-	links    [][]uint32               // overflow links
-	linkMask uint32                   // mask the width of the link table
-}
-
-// Initialize Huffman decoding tables from array of code lengths.
-// Following this function, h is guaranteed to be initialized into a complete
-// tree (i.e., neither over-subscribed nor under-subscribed). The exception is a
-// degenerate case where the tree has only a single symbol with length 1. Empty
-// trees are permitted.
-func (h *huffmanDecoder) init(bits []int) bool {
-	// Sanity enables additional runtime tests during Huffman
-	// table construction.  It's intended to be used during
-	// development to supplement the currently ad-hoc unit tests.
-	const sanity = false
-
-	if h.min != 0 {
-		*h = huffmanDecoder{}
-	}
-
-	// Count number of codes of each length,
-	// compute min and max length.
-	var count [maxCodeLen]int
-	var min, max int
-	for _, n := range bits {
-		if n == 0 {
-			continue
-		}
-		if min == 0 || n < min {
-			min = n
-		}
-		if n > max {
-			max = n
-		}
-		count[n]++
-	}
-
-	// Empty tree. The decompressor.huffSym function will fail later if the tree
-	// is used. Technically, an empty tree is only valid for the HDIST tree and
-	// not the HCLEN and HLIT tree. However, a stream with an empty HCLEN tree
-	// is guaranteed to fail since it will attempt to use the tree to decode the
-	// codes for the HLIT and HDIST trees. Similarly, an empty HLIT tree is
-	// guaranteed to fail later since the compressed data section must be
-	// composed of at least one symbol (the end-of-block marker).
-	if max == 0 {
-		return true
-	}
-
-	code := 0
-	var nextcode [maxCodeLen]int
-	for i := min; i <= max; i++ {
-		code <<= 1
-		nextcode[i] = code
-		code += count[i]
-	}
-
-	// Check that the coding is complete (i.e., that we've
-	// assigned all 2-to-the-max possible bit sequences).
-	// Exception: To be compatible with zlib, we also need to
-	// accept degenerate single-code codings.  See also
-	// TestDegenerateHuffmanCoding.
-	if code != 1<<uint(max) && !(code == 1 && max == 1) {
-		return false
-	}
-
-	h.min = min
-	if max > huffmanChunkBits {
-		numLinks := 1 << (uint(max) - huffmanChunkBits)
-		h.linkMask = uint32(numLinks - 1)
-
-		// create link tables
-		link := nextcode[huffmanChunkBits+1] >> 1
-		h.links = make([][]uint32, huffmanNumChunks-link)
-		for j := uint(link); j < huffmanNumChunks; j++ {
-			reverse := int(reverseByte[j>>8]) | int(reverseByte[j&0xff])<<8
-			reverse >>= uint(16 - huffmanChunkBits)
-			off := j - uint(link)
-			if sanity && h.chunks[reverse] != 0 {
-				panic("impossible: overwriting existing chunk")
-			}
-			h.chunks[reverse] = uint32(off<<huffmanValueShift | (huffmanChunkBits + 1))
-			h.links[off] = make([]uint32, numLinks)
-		}
-	}
-
-	for i, n := range bits {
-		if n == 0 {
-			continue
-		}
-		code := nextcode[n]
-		nextcode[n]++
-		chunk := uint32(i<<huffmanValueShift | n)
-		reverse := int(reverseByte[code>>8]) | int(reverseByte[code&0xff])<<8
-		reverse >>= uint(16 - n)
-		if n <= huffmanChunkBits {
-			for off := reverse; off < len(h.chunks); off += 1 << uint(n) {
-				// We should never need to overwrite
-				// an existing chunk.  Also, 0 is
-				// never a valid chunk, because the
-				// lower 4 "count" bits should be
-				// between 1 and 15.
-				if sanity && h.chunks[off] != 0 {
-					panic("impossible: overwriting existing chunk")
-				}
-				h.chunks[off] = chunk
-			}
-		} else {
-			j := reverse & (huffmanNumChunks - 1)
-			if sanity && h.chunks[j]&huffmanCountMask != huffmanChunkBits+1 {
-				// Longer codes should have been
-				// associated with a link table above.
-				panic("impossible: not an indirect chunk")
-			}
-			value := h.chunks[j] >> huffmanValueShift
-			linktab := h.links[value]
-			reverse >>= huffmanChunkBits
-			for off := reverse; off < len(linktab); off += 1 << uint(n-huffmanChunkBits) {
-				if sanity && linktab[off] != 0 {
-					panic("impossible: overwriting existing chunk")
-				}
-				linktab[off] = chunk
-			}
-		}
-	}
-
-	if sanity {
-		// Above we've sanity checked that we never overwrote
-		// an existing entry.  Here we additionally check that
-		// we filled the tables completely.
-		for i, chunk := range h.chunks {
-			if chunk == 0 {
-				// As an exception, in the degenerate
-				// single-code case, we allow odd
-				// chunks to be missing.
-				if code == 1 && i%2 == 1 {
-					continue
-				}
-				panic("impossible: missing chunk")
-			}
-		}
-		for _, linktab := range h.links {
-			for _, chunk := range linktab {
-				if chunk == 0 {
-					panic("impossible: missing chunk")
-				}
-			}
-		}
-	}
-
-	return true
-}
-
-// The actual read interface needed by NewReader.
-// If the passed in io.Reader does not also have ReadByte,
-// the NewReader will introduce its own buffering.
-type Reader interface {
-	io.Reader
-	io.ByteReader
-}
-
-// Decompress state.
-type decompressor struct {
-	// Input source.
-	r       Reader
-	roffset int64
-	woffset int64
-
-	// Input bits, in top of b.
-	b  uint32
-	nb uint
-
-	// Huffman decoders for literal/length, distance.
-	h1, h2 huffmanDecoder
-
-	// Length arrays used to define Huffman codes.
-	bits     *[maxNumLit + maxNumDist]int
-	codebits *[numCodes]int
-
-	// Output history, buffer.
-	hist  *[maxHist]byte
-	hp    int  // current output position in buffer
-	hw    int  // have written hist[0:hw] already
-	hfull bool // buffer has filled at least once
-
-	// Temporary buffer (avoids repeated allocation).
-	buf [4]byte
-
-	// Next step in the decompression,
-	// and decompression state.
-	step     func(*decompressor)
-	final    bool
-	err      error
-	toRead   []byte
-	hl, hd   *huffmanDecoder
-	copyLen  int
-	copyDist int
-}
-
-func (f *decompressor) nextBlock() {
-	if f.final {
-		if f.hw != f.hp {
-			f.flush((*decompressor).nextBlock)
-			return
-		}
-		f.err = io.EOF
-		return
-	}
-	for f.nb < 1+2 {
-		if f.err = f.moreBits(); f.err != nil {
-			return
-		}
-	}
-	f.final = f.b&1 == 1
-	f.b >>= 1
-	typ := f.b & 3
-	f.b >>= 2
-	f.nb -= 1 + 2
-	switch typ {
-	case 0:
-		f.dataBlock()
-	case 1:
-		// compressed, fixed Huffman tables
-		f.hl = &fixedHuffmanDecoder
-		f.hd = nil
-		f.huffmanBlock()
-	case 2:
-		// compressed, dynamic Huffman tables
-		if f.err = f.readHuffman(); f.err != nil {
-			break
-		}
-		f.hl = &f.h1
-		f.hd = &f.h2
-		f.huffmanBlock()
-	default:
-		// 3 is reserved.
-		f.err = CorruptInputError(f.roffset)
-	}
-}
-
-func (f *decompressor) Read(b []byte) (int, error) {
-	for {
-		if len(f.toRead) > 0 {
-			n := copy(b, f.toRead)
-			f.toRead = f.toRead[n:]
-			return n, nil
-		}
-		if f.err != nil {
-			return 0, f.err
-		}
-		f.step(f)
-	}
-}
-
-func (f *decompressor) Close() error {
-	if f.err == io.EOF {
-		return nil
-	}
-	return f.err
-}
-
-// RFC 1951 section 3.2.7.
-// Compression with dynamic Huffman codes
-
-var codeOrder = [...]int{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}
-
-func (f *decompressor) readHuffman() error {
-	// HLIT[5], HDIST[5], HCLEN[4].
-	for f.nb < 5+5+4 {
-		if err := f.moreBits(); err != nil {
-			return err
-		}
-	}
-	nlit := int(f.b&0x1F) + 257
-	if nlit > maxNumLit {
-		return CorruptInputError(f.roffset)
-	}
-	f.b >>= 5
-	ndist := int(f.b&0x1F) + 1
-	if ndist > maxNumDist {
-		return CorruptInputError(f.roffset)
-	}
-	f.b >>= 5
-	nclen := int(f.b&0xF) + 4
-	// numCodes is 19, so nclen is always valid.
-	f.b >>= 4
-	f.nb -= 5 + 5 + 4
-
-	// (HCLEN+4)*3 bits: code lengths in the magic codeOrder order.
-	for i := 0; i < nclen; i++ {
-		for f.nb < 3 {
-			if err := f.moreBits(); err != nil {
-				return err
-			}
-		}
-		f.codebits[codeOrder[i]] = int(f.b & 0x7)
-		f.b >>= 3
-		f.nb -= 3
-	}
-	for i := nclen; i < len(codeOrder); i++ {
-		f.codebits[codeOrder[i]] = 0
-	}
-	if !f.h1.init(f.codebits[0:]) {
-		return CorruptInputError(f.roffset)
-	}
-
-	// HLIT + 257 code lengths, HDIST + 1 code lengths,
-	// using the code length Huffman code.
-	for i, n := 0, nlit+ndist; i < n; {
-		x, err := f.huffSym(&f.h1)
-		if err != nil {
-			return err
-		}
-		if x < 16 {
-			// Actual length.
-			f.bits[i] = x
-			i++
-			continue
-		}
-		// Repeat previous length or zero.
-		var rep int
-		var nb uint
-		var b int
-		switch x {
-		default:
-			return InternalError("unexpected length code")
-		case 16:
-			rep = 3
-			nb = 2
-			if i == 0 {
-				return CorruptInputError(f.roffset)
-			}
-			b = f.bits[i-1]
-		case 17:
-			rep = 3
-			nb = 3
-			b = 0
-		case 18:
-			rep = 11
-			nb = 7
-			b = 0
-		}
-		for f.nb < nb {
-			if err := f.moreBits(); err != nil {
-				return err
-			}
-		}
-		rep += int(f.b & uint32(1<<nb-1))
-		f.b >>= nb
-		f.nb -= nb
-		if i+rep > n {
-			return CorruptInputError(f.roffset)
-		}
-		for j := 0; j < rep; j++ {
-			f.bits[i] = b
-			i++
-		}
-	}
-
-	if !f.h1.init(f.bits[0:nlit]) || !f.h2.init(f.bits[nlit:nlit+ndist]) {
-		return CorruptInputError(f.roffset)
-	}
-
-	return nil
-}
-
-// Decode a single Huffman block from f.
-// hl and hd are the Huffman states for the lit/length values
-// and the distance values, respectively.  If hd == nil, using the
-// fixed distance encoding associated with fixed Huffman blocks.
-func (f *decompressor) huffmanBlock() {
-	for {
-		v, err := f.huffSym(f.hl)
-		if err != nil {
-			f.err = err
-			return
-		}
-		var n uint // number of bits extra
-		var length int
-		switch {
-		case v < 256:
-			f.hist[f.hp] = byte(v)
-			f.hp++
-			if f.hp == len(f.hist) {
-				// After the flush, continue this loop.
-				f.flush((*decompressor).huffmanBlock)
-				return
-			}
-			continue
-		case v == 256:
-			// Done with huffman block; read next block.
-			f.step = (*decompressor).nextBlock
-			return
-		// otherwise, reference to older data
-		case v < 265:
-			length = v - (257 - 3)
-			n = 0
-		case v < 269:
-			length = v*2 - (265*2 - 11)
-			n = 1
-		case v < 273:
-			length = v*4 - (269*4 - 19)
-			n = 2
-		case v < 277:
-			length = v*8 - (273*8 - 35)
-			n = 3
-		case v < 281:
-			length = v*16 - (277*16 - 67)
-			n = 4
-		case v < 285:
-			length = v*32 - (281*32 - 131)
-			n = 5
-		case v < maxNumLit:
-			length = 258
-			n = 0
-		default:
-			f.err = CorruptInputError(f.roffset)
-			return
-		}
-		if n > 0 {
-			for f.nb < n {
-				if err = f.moreBits(); err != nil {
-					f.err = err
-					return
-				}
-			}
-			length += int(f.b & uint32(1<<n-1))
-			f.b >>= n
-			f.nb -= n
-		}
-
-		var dist int
-		if f.hd == nil {
-			for f.nb < 5 {
-				if err = f.moreBits(); err != nil {
-					f.err = err
-					return
-				}
-			}
-			dist = int(reverseByte[(f.b&0x1F)<<3])
-			f.b >>= 5
-			f.nb -= 5
-		} else {
-			if dist, err = f.huffSym(f.hd); err != nil {
-				f.err = err
-				return
-			}
-		}
-
-		switch {
-		case dist < 4:
-			dist++
-		case dist < maxNumDist:
-			nb := uint(dist-2) >> 1
-			// have 1 bit in bottom of dist, need nb more.
-			extra := (dist & 1) << nb
-			for f.nb < nb {
-				if err = f.moreBits(); err != nil {
-					f.err = err
-					return
-				}
-			}
-			extra |= int(f.b & uint32(1<<nb-1))
-			f.b >>= nb
-			f.nb -= nb
-			dist = 1<<(nb+1) + 1 + extra
-		default:
-			f.err = CorruptInputError(f.roffset)
-			return
-		}
-
-		// Copy history[-dist:-dist+length] into output.
-		if dist > len(f.hist) {
-			f.err = InternalError("bad history distance")
-			return
-		}
-
-		// No check on length; encoding can be prescient.
-		if !f.hfull && dist > f.hp {
-			f.err = CorruptInputError(f.roffset)
-			return
-		}
-
-		f.copyLen, f.copyDist = length, dist
-		if f.copyHist() {
-			return
-		}
-	}
-}
-
-// copyHist copies f.copyLen bytes from f.hist (f.copyDist bytes ago) to itself.
-// It reports whether the f.hist buffer is full.
-func (f *decompressor) copyHist() bool {
-	p := f.hp - f.copyDist
-	if p < 0 {
-		p += len(f.hist)
-	}
-	for f.copyLen > 0 {
-		n := f.copyLen
-		if x := len(f.hist) - f.hp; n > x {
-			n = x
-		}
-		if x := len(f.hist) - p; n > x {
-			n = x
-		}
-		forwardCopy(f.hist[:], f.hp, p, n)
-		p += n
-		f.hp += n
-		f.copyLen -= n
-		if f.hp == len(f.hist) {
-			// After flush continue copying out of history.
-			f.flush((*decompressor).copyHuff)
-			return true
-		}
-		if p == len(f.hist) {
-			p = 0
-		}
-	}
-	return false
-}
-
-func (f *decompressor) copyHuff() {
-	if f.copyHist() {
-		return
-	}
-	f.huffmanBlock()
-}
-
-// Copy a single uncompressed data block from input to output.
-func (f *decompressor) dataBlock() {
-	// Uncompressed.
-	// Discard current half-byte.
-	f.nb = 0
-	f.b = 0
-
-	// Length then ones-complement of length.
-	nr, err := io.ReadFull(f.r, f.buf[0:4])
-	f.roffset += int64(nr)
-	if err != nil {
-		f.err = &ReadError{f.roffset, err}
-		return
-	}
-	n := int(f.buf[0]) | int(f.buf[1])<<8
-	nn := int(f.buf[2]) | int(f.buf[3])<<8
-	if uint16(nn) != uint16(^n) {
-		f.err = CorruptInputError(f.roffset)
-		return
-	}
-
-	if n == 0 {
-		// 0-length block means sync
-		f.flush((*decompressor).nextBlock)
-		return
-	}
-
-	f.copyLen = n
-	f.copyData()
-}
-
-// copyData copies f.copyLen bytes from the underlying reader into f.hist.
-// It pauses for reads when f.hist is full.
-func (f *decompressor) copyData() {
-	n := f.copyLen
-	for n > 0 {
-		m := len(f.hist) - f.hp
-		if m > n {
-			m = n
-		}
-		m, err := io.ReadFull(f.r, f.hist[f.hp:f.hp+m])
-		f.roffset += int64(m)
-		if err != nil {
-			f.err = &ReadError{f.roffset, err}
-			return
-		}
-		n -= m
-		f.hp += m
-		if f.hp == len(f.hist) {
-			f.copyLen = n
-			f.flush((*decompressor).copyData)
-			return
-		}
-	}
-	f.step = (*decompressor).nextBlock
-}
-
-func (f *decompressor) setDict(dict []byte) {
-	if len(dict) > len(f.hist) {
-		// Will only remember the tail.
-		dict = dict[len(dict)-len(f.hist):]
-	}
-
-	f.hp = copy(f.hist[:], dict)
-	if f.hp == len(f.hist) {
-		f.hp = 0
-		f.hfull = true
-	}
-	f.hw = f.hp
-}
-
-func (f *decompressor) moreBits() error {
-	c, err := f.r.ReadByte()
-	if err != nil {
-		if err == io.EOF {
-			err = io.ErrUnexpectedEOF
-		}
-		return err
-	}
-	f.roffset++
-	f.b |= uint32(c) << f.nb
-	f.nb += 8
-	return nil
-}
-
-// Read the next Huffman-encoded symbol from f according to h.
-func (f *decompressor) huffSym(h *huffmanDecoder) (int, error) {
-	// Since a huffmanDecoder can be empty or be composed of a degenerate tree
-	// with single element, huffSym must error on these two edge cases. In both
-	// cases, the chunks slice will be 0 for the invalid sequence, leading it
-	// satisfy the n == 0 check below.
-	n := uint(h.min)
-	for {
-		for f.nb < n {
-			if err := f.moreBits(); err != nil {
-				return 0, err
-			}
-		}
-		chunk := h.chunks[f.b&(huffmanNumChunks-1)]
-		n = uint(chunk & huffmanCountMask)
-		if n > huffmanChunkBits {
-			chunk = h.links[chunk>>huffmanValueShift][(f.b>>huffmanChunkBits)&h.linkMask]
-			n = uint(chunk & huffmanCountMask)
-		}
-		if n <= f.nb {
-			if n == 0 {
-				f.err = CorruptInputError(f.roffset)
-				return 0, f.err
-			}
-			f.b >>= n
-			f.nb -= n
-			return int(chunk >> huffmanValueShift), nil
-		}
-	}
-}
-
-// Flush any buffered output to the underlying writer.
-func (f *decompressor) flush(step func(*decompressor)) {
-	f.toRead = f.hist[f.hw:f.hp]
-	f.woffset += int64(f.hp - f.hw)
-	f.hw = f.hp
-	if f.hp == len(f.hist) {
-		f.hp = 0
-		f.hw = 0
-		f.hfull = true
-	}
-	f.step = step
-}
-
-func makeReader(r io.Reader) Reader {
-	if rr, ok := r.(Reader); ok {
-		return rr
-	}
-	return bufio.NewReader(r)
-}
-
-func (f *decompressor) Reset(r io.Reader, dict []byte) error {
-	*f = decompressor{
-		r:        makeReader(r),
-		bits:     f.bits,
-		codebits: f.codebits,
-		hist:     f.hist,
-		step:     (*decompressor).nextBlock,
-	}
-	if dict != nil {
-		f.setDict(dict)
-	}
-	return nil
-}
-
-// NewReader returns a new ReadCloser that can be used
-// to read the uncompressed version of r.
-// If r does not also implement io.ByteReader,
-// the decompressor may read more data than necessary from r.
-// It is the caller's responsibility to call Close on the ReadCloser
-// when finished reading.
-//
-// The ReadCloser returned by NewReader also implements Resetter.
-func NewReader(r io.Reader) io.ReadCloser {
-	var f decompressor
-	f.bits = new([maxNumLit + maxNumDist]int)
-	f.codebits = new([numCodes]int)
-	f.r = makeReader(r)
-	f.hist = new([maxHist]byte)
-	f.step = (*decompressor).nextBlock
-	return &f
-}
-
-// NewReaderDict is like NewReader but initializes the reader
-// with a preset dictionary.  The returned Reader behaves as if
-// the uncompressed data stream started with the given dictionary,
-// which has already been read.  NewReaderDict is typically used
-// to read data compressed by NewWriterDict.
-//
-// The ReadCloser returned by NewReader also implements Resetter.
-func NewReaderDict(r io.Reader, dict []byte) io.ReadCloser {
-	var f decompressor
-	f.r = makeReader(r)
-	f.hist = new([maxHist]byte)
-	f.bits = new([maxNumLit + maxNumDist]int)
-	f.codebits = new([numCodes]int)
-	f.step = (*decompressor).nextBlock
-	f.setDict(dict)
-	return &f
-}
diff --git a/third_party/gofrontend/libgo/go/compress/flate/inflate_test.go b/third_party/gofrontend/libgo/go/compress/flate/inflate_test.go
deleted file mode 100644
index 9f25d30..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/inflate_test.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flate
-
-import (
-	"bytes"
-	"io"
-	"testing"
-)
-
-func TestReset(t *testing.T) {
-	ss := []string{
-		"lorem ipsum izzle fo rizzle",
-		"the quick brown fox jumped over",
-	}
-
-	deflated := make([]bytes.Buffer, 2)
-	for i, s := range ss {
-		w, _ := NewWriter(&deflated[i], 1)
-		w.Write([]byte(s))
-		w.Close()
-	}
-
-	inflated := make([]bytes.Buffer, 2)
-
-	f := NewReader(&deflated[0])
-	io.Copy(&inflated[0], f)
-	f.(Resetter).Reset(&deflated[1], nil)
-	io.Copy(&inflated[1], f)
-	f.Close()
-
-	for i, s := range ss {
-		if s != inflated[i].String() {
-			t.Errorf("inflated[%d]:\ngot  %q\nwant %q", i, inflated[i], s)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/compress/flate/reader_test.go b/third_party/gofrontend/libgo/go/compress/flate/reader_test.go
deleted file mode 100644
index a62ef74..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/reader_test.go
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flate
-
-import (
-	"bytes"
-	"io"
-	"io/ioutil"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-func TestNlitOutOfRange(t *testing.T) {
-	// Trying to decode this bogus flate data, which has a Huffman table
-	// with nlit=288, should not panic.
-	io.Copy(ioutil.Discard, NewReader(strings.NewReader(
-		"\xfc\xfe\x36\xe7\x5e\x1c\xef\xb3\x55\x58\x77\xb6\x56\xb5\x43\xf4"+
-			"\x6f\xf2\xd2\xe6\x3d\x99\xa0\x85\x8c\x48\xeb\xf8\xda\x83\x04\x2a"+
-			"\x75\xc4\xf8\x0f\x12\x11\xb9\xb4\x4b\x09\xa0\xbe\x8b\x91\x4c")))
-}
-
-const (
-	digits = iota
-	twain
-)
-
-var testfiles = []string{
-	// Digits is the digits of the irrational number e. Its decimal representation
-	// does not repeat, but there are only 10 possible digits, so it should be
-	// reasonably compressible.
-	digits: "../testdata/e.txt",
-	// Twain is Project Gutenberg's edition of Mark Twain's classic English novel.
-	twain: "../testdata/Mark.Twain-Tom.Sawyer.txt",
-}
-
-func benchmarkDecode(b *testing.B, testfile, level, n int) {
-	b.ReportAllocs()
-	b.StopTimer()
-	b.SetBytes(int64(n))
-	buf0, err := ioutil.ReadFile(testfiles[testfile])
-	if err != nil {
-		b.Fatal(err)
-	}
-	if len(buf0) == 0 {
-		b.Fatalf("test file %q has no data", testfiles[testfile])
-	}
-	compressed := new(bytes.Buffer)
-	w, err := NewWriter(compressed, level)
-	if err != nil {
-		b.Fatal(err)
-	}
-	for i := 0; i < n; i += len(buf0) {
-		if len(buf0) > n-i {
-			buf0 = buf0[:n-i]
-		}
-		io.Copy(w, bytes.NewReader(buf0))
-	}
-	w.Close()
-	buf1 := compressed.Bytes()
-	buf0, compressed, w = nil, nil, nil
-	runtime.GC()
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		io.Copy(ioutil.Discard, NewReader(bytes.NewReader(buf1)))
-	}
-}
-
-// These short names are so that gofmt doesn't break the BenchmarkXxx function
-// bodies below over multiple lines.
-const (
-	speed    = BestSpeed
-	default_ = DefaultCompression
-	compress = BestCompression
-)
-
-func BenchmarkDecodeDigitsSpeed1e4(b *testing.B)    { benchmarkDecode(b, digits, speed, 1e4) }
-func BenchmarkDecodeDigitsSpeed1e5(b *testing.B)    { benchmarkDecode(b, digits, speed, 1e5) }
-func BenchmarkDecodeDigitsSpeed1e6(b *testing.B)    { benchmarkDecode(b, digits, speed, 1e6) }
-func BenchmarkDecodeDigitsDefault1e4(b *testing.B)  { benchmarkDecode(b, digits, default_, 1e4) }
-func BenchmarkDecodeDigitsDefault1e5(b *testing.B)  { benchmarkDecode(b, digits, default_, 1e5) }
-func BenchmarkDecodeDigitsDefault1e6(b *testing.B)  { benchmarkDecode(b, digits, default_, 1e6) }
-func BenchmarkDecodeDigitsCompress1e4(b *testing.B) { benchmarkDecode(b, digits, compress, 1e4) }
-func BenchmarkDecodeDigitsCompress1e5(b *testing.B) { benchmarkDecode(b, digits, compress, 1e5) }
-func BenchmarkDecodeDigitsCompress1e6(b *testing.B) { benchmarkDecode(b, digits, compress, 1e6) }
-func BenchmarkDecodeTwainSpeed1e4(b *testing.B)     { benchmarkDecode(b, twain, speed, 1e4) }
-func BenchmarkDecodeTwainSpeed1e5(b *testing.B)     { benchmarkDecode(b, twain, speed, 1e5) }
-func BenchmarkDecodeTwainSpeed1e6(b *testing.B)     { benchmarkDecode(b, twain, speed, 1e6) }
-func BenchmarkDecodeTwainDefault1e4(b *testing.B)   { benchmarkDecode(b, twain, default_, 1e4) }
-func BenchmarkDecodeTwainDefault1e5(b *testing.B)   { benchmarkDecode(b, twain, default_, 1e5) }
-func BenchmarkDecodeTwainDefault1e6(b *testing.B)   { benchmarkDecode(b, twain, default_, 1e6) }
-func BenchmarkDecodeTwainCompress1e4(b *testing.B)  { benchmarkDecode(b, twain, compress, 1e4) }
-func BenchmarkDecodeTwainCompress1e5(b *testing.B)  { benchmarkDecode(b, twain, compress, 1e5) }
-func BenchmarkDecodeTwainCompress1e6(b *testing.B)  { benchmarkDecode(b, twain, compress, 1e6) }
diff --git a/third_party/gofrontend/libgo/go/compress/flate/reverse_bits.go b/third_party/gofrontend/libgo/go/compress/flate/reverse_bits.go
deleted file mode 100644
index c1a0272..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/reverse_bits.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flate
-
-var reverseByte = [256]byte{
-	0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
-	0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
-	0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
-	0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
-	0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
-	0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
-	0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
-	0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
-	0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
-	0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
-	0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
-	0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
-	0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
-	0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
-	0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
-	0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
-	0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
-	0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
-	0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
-	0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
-	0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
-	0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
-	0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
-	0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
-	0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
-	0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
-	0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
-	0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
-	0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
-	0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
-	0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
-	0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
-}
-
-func reverseUint16(v uint16) uint16 {
-	return uint16(reverseByte[v>>8]) | uint16(reverseByte[v&0xFF])<<8
-}
-
-func reverseBits(number uint16, bitLength byte) uint16 {
-	return reverseUint16(number << uint8(16-bitLength))
-}
diff --git a/third_party/gofrontend/libgo/go/compress/flate/token.go b/third_party/gofrontend/libgo/go/compress/flate/token.go
deleted file mode 100644
index 4d49176..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/token.go
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flate
-
-const (
-	// 2 bits:   type   0 = literal  1=EOF  2=Match   3=Unused
-	// 8 bits:   xlength = length - MIN_MATCH_LENGTH
-	// 22 bits   xoffset = offset - MIN_OFFSET_SIZE, or literal
-	lengthShift = 22
-	offsetMask  = 1<<lengthShift - 1
-	typeMask    = 3 << 30
-	literalType = 0 << 30
-	matchType   = 1 << 30
-)
-
-// The length code for length X (MIN_MATCH_LENGTH <= X <= MAX_MATCH_LENGTH)
-// is lengthCodes[length - MIN_MATCH_LENGTH]
-var lengthCodes = [...]uint32{
-	0, 1, 2, 3, 4, 5, 6, 7, 8, 8,
-	9, 9, 10, 10, 11, 11, 12, 12, 12, 12,
-	13, 13, 13, 13, 14, 14, 14, 14, 15, 15,
-	15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
-	17, 17, 17, 17, 17, 17, 17, 17, 18, 18,
-	18, 18, 18, 18, 18, 18, 19, 19, 19, 19,
-	19, 19, 19, 19, 20, 20, 20, 20, 20, 20,
-	20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-	21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
-	21, 21, 21, 21, 21, 21, 22, 22, 22, 22,
-	22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
-	22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
-	23, 23, 23, 23, 23, 23, 23, 23, 24, 24,
-	24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-	24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-	24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-	25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-	25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-	25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-	25, 25, 26, 26, 26, 26, 26, 26, 26, 26,
-	26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-	26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-	26, 26, 26, 26, 27, 27, 27, 27, 27, 27,
-	27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
-	27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
-	27, 27, 27, 27, 27, 28,
-}
-
-var offsetCodes = [...]uint32{
-	0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,
-	8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9,
-	10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
-	11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-	12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-	12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-	13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-	13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-	14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-	14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-	14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-	14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-	15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-	15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-	15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-	15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-}
-
-type token uint32
-
-// Convert a literal into a literal token.
-func literalToken(literal uint32) token { return token(literalType + literal) }
-
-// Convert a < xlength, xoffset > pair into a match token.
-func matchToken(xlength uint32, xoffset uint32) token {
-	return token(matchType + xlength<<lengthShift + xoffset)
-}
-
-// Returns the type of a token
-func (t token) typ() uint32 { return uint32(t) & typeMask }
-
-// Returns the literal of a literal token
-func (t token) literal() uint32 { return uint32(t - literalType) }
-
-// Returns the extra offset of a match token
-func (t token) offset() uint32 { return uint32(t) & offsetMask }
-
-func (t token) length() uint32 { return uint32((t - matchType) >> lengthShift) }
-
-func lengthCode(len uint32) uint32 { return lengthCodes[len] }
-
-// Returns the offset code corresponding to a specific offset
-func offsetCode(off uint32) uint32 {
-	const n = uint32(len(offsetCodes))
-	switch {
-	case off < n:
-		return offsetCodes[off]
-	case off>>7 < n:
-		return offsetCodes[off>>7] + 14
-	default:
-		return offsetCodes[off>>14] + 28
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/compress/flate/writer_test.go b/third_party/gofrontend/libgo/go/compress/flate/writer_test.go
deleted file mode 100644
index 5843177..0000000
--- a/third_party/gofrontend/libgo/go/compress/flate/writer_test.go
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flate
-
-import (
-	"io/ioutil"
-	"runtime"
-	"testing"
-)
-
-func benchmarkEncoder(b *testing.B, testfile, level, n int) {
-	b.StopTimer()
-	b.SetBytes(int64(n))
-	buf0, err := ioutil.ReadFile(testfiles[testfile])
-	if err != nil {
-		b.Fatal(err)
-	}
-	if len(buf0) == 0 {
-		b.Fatalf("test file %q has no data", testfiles[testfile])
-	}
-	buf1 := make([]byte, n)
-	for i := 0; i < n; i += len(buf0) {
-		if len(buf0) > n-i {
-			buf0 = buf0[:n-i]
-		}
-		copy(buf1[i:], buf0)
-	}
-	buf0 = nil
-	runtime.GC()
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		w, err := NewWriter(ioutil.Discard, level)
-		if err != nil {
-			b.Fatal(err)
-		}
-		w.Write(buf1)
-		w.Close()
-	}
-}
-
-func BenchmarkEncodeDigitsSpeed1e4(b *testing.B)    { benchmarkEncoder(b, digits, speed, 1e4) }
-func BenchmarkEncodeDigitsSpeed1e5(b *testing.B)    { benchmarkEncoder(b, digits, speed, 1e5) }
-func BenchmarkEncodeDigitsSpeed1e6(b *testing.B)    { benchmarkEncoder(b, digits, speed, 1e6) }
-func BenchmarkEncodeDigitsDefault1e4(b *testing.B)  { benchmarkEncoder(b, digits, default_, 1e4) }
-func BenchmarkEncodeDigitsDefault1e5(b *testing.B)  { benchmarkEncoder(b, digits, default_, 1e5) }
-func BenchmarkEncodeDigitsDefault1e6(b *testing.B)  { benchmarkEncoder(b, digits, default_, 1e6) }
-func BenchmarkEncodeDigitsCompress1e4(b *testing.B) { benchmarkEncoder(b, digits, compress, 1e4) }
-func BenchmarkEncodeDigitsCompress1e5(b *testing.B) { benchmarkEncoder(b, digits, compress, 1e5) }
-func BenchmarkEncodeDigitsCompress1e6(b *testing.B) { benchmarkEncoder(b, digits, compress, 1e6) }
-func BenchmarkEncodeTwainSpeed1e4(b *testing.B)     { benchmarkEncoder(b, twain, speed, 1e4) }
-func BenchmarkEncodeTwainSpeed1e5(b *testing.B)     { benchmarkEncoder(b, twain, speed, 1e5) }
-func BenchmarkEncodeTwainSpeed1e6(b *testing.B)     { benchmarkEncoder(b, twain, speed, 1e6) }
-func BenchmarkEncodeTwainDefault1e4(b *testing.B)   { benchmarkEncoder(b, twain, default_, 1e4) }
-func BenchmarkEncodeTwainDefault1e5(b *testing.B)   { benchmarkEncoder(b, twain, default_, 1e5) }
-func BenchmarkEncodeTwainDefault1e6(b *testing.B)   { benchmarkEncoder(b, twain, default_, 1e6) }
-func BenchmarkEncodeTwainCompress1e4(b *testing.B)  { benchmarkEncoder(b, twain, compress, 1e4) }
-func BenchmarkEncodeTwainCompress1e5(b *testing.B)  { benchmarkEncoder(b, twain, compress, 1e5) }
-func BenchmarkEncodeTwainCompress1e6(b *testing.B)  { benchmarkEncoder(b, twain, compress, 1e6) }
diff --git a/third_party/gofrontend/libgo/go/compress/gzip/gunzip.go b/third_party/gofrontend/libgo/go/compress/gzip/gunzip.go
deleted file mode 100644
index 72ee55c..0000000
--- a/third_party/gofrontend/libgo/go/compress/gzip/gunzip.go
+++ /dev/null
@@ -1,287 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package gzip implements reading and writing of gzip format compressed files,
-// as specified in RFC 1952.
-package gzip
-
-import (
-	"bufio"
-	"compress/flate"
-	"errors"
-	"hash"
-	"hash/crc32"
-	"io"
-	"time"
-)
-
-const (
-	gzipID1     = 0x1f
-	gzipID2     = 0x8b
-	gzipDeflate = 8
-	flagText    = 1 << 0
-	flagHdrCrc  = 1 << 1
-	flagExtra   = 1 << 2
-	flagName    = 1 << 3
-	flagComment = 1 << 4
-)
-
-func makeReader(r io.Reader) flate.Reader {
-	if rr, ok := r.(flate.Reader); ok {
-		return rr
-	}
-	return bufio.NewReader(r)
-}
-
-var (
-	// ErrChecksum is returned when reading GZIP data that has an invalid checksum.
-	ErrChecksum = errors.New("gzip: invalid checksum")
-	// ErrHeader is returned when reading GZIP data that has an invalid header.
-	ErrHeader = errors.New("gzip: invalid header")
-)
-
-// The gzip file stores a header giving metadata about the compressed file.
-// That header is exposed as the fields of the Writer and Reader structs.
-type Header struct {
-	Comment string    // comment
-	Extra   []byte    // "extra data"
-	ModTime time.Time // modification time
-	Name    string    // file name
-	OS      byte      // operating system type
-}
-
-// A Reader is an io.Reader that can be read to retrieve
-// uncompressed data from a gzip-format compressed file.
-//
-// In general, a gzip file can be a concatenation of gzip files,
-// each with its own header.  Reads from the Reader
-// return the concatenation of the uncompressed data of each.
-// Only the first header is recorded in the Reader fields.
-//
-// Gzip files store a length and checksum of the uncompressed data.
-// The Reader will return a ErrChecksum when Read
-// reaches the end of the uncompressed data if it does not
-// have the expected length or checksum.  Clients should treat data
-// returned by Read as tentative until they receive the io.EOF
-// marking the end of the data.
-type Reader struct {
-	Header
-	r            flate.Reader
-	decompressor io.ReadCloser
-	digest       hash.Hash32
-	size         uint32
-	flg          byte
-	buf          [512]byte
-	err          error
-	multistream  bool
-}
-
-// NewReader creates a new Reader reading the given reader.
-// If r does not also implement io.ByteReader,
-// the decompressor may read more data than necessary from r.
-// It is the caller's responsibility to call Close on the Reader when done.
-func NewReader(r io.Reader) (*Reader, error) {
-	z := new(Reader)
-	z.r = makeReader(r)
-	z.multistream = true
-	z.digest = crc32.NewIEEE()
-	if err := z.readHeader(true); err != nil {
-		return nil, err
-	}
-	return z, nil
-}
-
-// Reset discards the Reader z's state and makes it equivalent to the
-// result of its original state from NewReader, but reading from r instead.
-// This permits reusing a Reader rather than allocating a new one.
-func (z *Reader) Reset(r io.Reader) error {
-	z.r = makeReader(r)
-	if z.digest == nil {
-		z.digest = crc32.NewIEEE()
-	} else {
-		z.digest.Reset()
-	}
-	z.size = 0
-	z.err = nil
-	z.multistream = true
-	return z.readHeader(true)
-}
-
-// Multistream controls whether the reader supports multistream files.
-//
-// If enabled (the default), the Reader expects the input to be a sequence
-// of individually gzipped data streams, each with its own header and
-// trailer, ending at EOF. The effect is that the concatenation of a sequence
-// of gzipped files is treated as equivalent to the gzip of the concatenation
-// of the sequence. This is standard behavior for gzip readers.
-//
-// Calling Multistream(false) disables this behavior; disabling the behavior
-// can be useful when reading file formats that distinguish individual gzip
-// data streams or mix gzip data streams with other data streams.
-// In this mode, when the Reader reaches the end of the data stream,
-// Read returns io.EOF. If the underlying reader implements io.ByteReader,
-// it will be left positioned just after the gzip stream.
-// To start the next stream, call z.Reset(r) followed by z.Multistream(false).
-// If there is no next stream, z.Reset(r) will return io.EOF.
-func (z *Reader) Multistream(ok bool) {
-	z.multistream = ok
-}
-
-// GZIP (RFC 1952) is little-endian, unlike ZLIB (RFC 1950).
-func get4(p []byte) uint32 {
-	return uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24
-}
-
-func (z *Reader) readString() (string, error) {
-	var err error
-	needconv := false
-	for i := 0; ; i++ {
-		if i >= len(z.buf) {
-			return "", ErrHeader
-		}
-		z.buf[i], err = z.r.ReadByte()
-		if err != nil {
-			return "", err
-		}
-		if z.buf[i] > 0x7f {
-			needconv = true
-		}
-		if z.buf[i] == 0 {
-			// GZIP (RFC 1952) specifies that strings are NUL-terminated ISO 8859-1 (Latin-1).
-			if needconv {
-				s := make([]rune, 0, i)
-				for _, v := range z.buf[0:i] {
-					s = append(s, rune(v))
-				}
-				return string(s), nil
-			}
-			return string(z.buf[0:i]), nil
-		}
-	}
-}
-
-func (z *Reader) read2() (uint32, error) {
-	_, err := io.ReadFull(z.r, z.buf[0:2])
-	if err != nil {
-		return 0, err
-	}
-	return uint32(z.buf[0]) | uint32(z.buf[1])<<8, nil
-}
-
-func (z *Reader) readHeader(save bool) error {
-	_, err := io.ReadFull(z.r, z.buf[0:10])
-	if err != nil {
-		return err
-	}
-	if z.buf[0] != gzipID1 || z.buf[1] != gzipID2 || z.buf[2] != gzipDeflate {
-		return ErrHeader
-	}
-	z.flg = z.buf[3]
-	if save {
-		z.ModTime = time.Unix(int64(get4(z.buf[4:8])), 0)
-		// z.buf[8] is xfl, ignored
-		z.OS = z.buf[9]
-	}
-	z.digest.Reset()
-	z.digest.Write(z.buf[0:10])
-
-	if z.flg&flagExtra != 0 {
-		n, err := z.read2()
-		if err != nil {
-			return err
-		}
-		data := make([]byte, n)
-		if _, err = io.ReadFull(z.r, data); err != nil {
-			return err
-		}
-		if save {
-			z.Extra = data
-		}
-	}
-
-	var s string
-	if z.flg&flagName != 0 {
-		if s, err = z.readString(); err != nil {
-			return err
-		}
-		if save {
-			z.Name = s
-		}
-	}
-
-	if z.flg&flagComment != 0 {
-		if s, err = z.readString(); err != nil {
-			return err
-		}
-		if save {
-			z.Comment = s
-		}
-	}
-
-	if z.flg&flagHdrCrc != 0 {
-		n, err := z.read2()
-		if err != nil {
-			return err
-		}
-		sum := z.digest.Sum32() & 0xFFFF
-		if n != sum {
-			return ErrHeader
-		}
-	}
-
-	z.digest.Reset()
-	if z.decompressor == nil {
-		z.decompressor = flate.NewReader(z.r)
-	} else {
-		z.decompressor.(flate.Resetter).Reset(z.r, nil)
-	}
-	return nil
-}
-
-func (z *Reader) Read(p []byte) (n int, err error) {
-	if z.err != nil {
-		return 0, z.err
-	}
-	if len(p) == 0 {
-		return 0, nil
-	}
-
-	n, err = z.decompressor.Read(p)
-	z.digest.Write(p[0:n])
-	z.size += uint32(n)
-	if n != 0 || err != io.EOF {
-		z.err = err
-		return
-	}
-
-	// Finished file; check checksum + size.
-	if _, err := io.ReadFull(z.r, z.buf[0:8]); err != nil {
-		z.err = err
-		return 0, err
-	}
-	crc32, isize := get4(z.buf[0:4]), get4(z.buf[4:8])
-	sum := z.digest.Sum32()
-	if sum != crc32 || isize != z.size {
-		z.err = ErrChecksum
-		return 0, z.err
-	}
-
-	// File is ok; is there another?
-	if !z.multistream {
-		return 0, io.EOF
-	}
-
-	if err = z.readHeader(false); err != nil {
-		z.err = err
-		return
-	}
-
-	// Yes.  Reset and read from it.
-	z.digest.Reset()
-	z.size = 0
-	return z.Read(p)
-}
-
-// Close closes the Reader. It does not close the underlying io.Reader.
-func (z *Reader) Close() error { return z.decompressor.Close() }
diff --git a/third_party/gofrontend/libgo/go/compress/gzip/gunzip_test.go b/third_party/gofrontend/libgo/go/compress/gzip/gunzip_test.go
deleted file mode 100644
index 0636dec..0000000
--- a/third_party/gofrontend/libgo/go/compress/gzip/gunzip_test.go
+++ /dev/null
@@ -1,410 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gzip
-
-import (
-	"bytes"
-	"io"
-	"io/ioutil"
-	"os"
-	"strings"
-	"testing"
-	"time"
-)
-
-type gunzipTest struct {
-	name string
-	desc string
-	raw  string
-	gzip []byte
-	err  error
-}
-
-var gunzipTests = []gunzipTest{
-	{ // has 1 empty fixed-huffman block
-		"empty.txt",
-		"empty.txt",
-		"",
-		[]byte{
-			0x1f, 0x8b, 0x08, 0x08, 0xf7, 0x5e, 0x14, 0x4a,
-			0x00, 0x03, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e,
-			0x74, 0x78, 0x74, 0x00, 0x03, 0x00, 0x00, 0x00,
-			0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		},
-		nil,
-	},
-	{ // has 1 non-empty fixed huffman block
-		"hello.txt",
-		"hello.txt",
-		"hello world\n",
-		[]byte{
-			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
-			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
-			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
-			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
-			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
-			0x00, 0x00,
-		},
-		nil,
-	},
-	{ // concatenation
-		"hello.txt",
-		"hello.txt x2",
-		"hello world\n" +
-			"hello world\n",
-		[]byte{
-			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
-			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
-			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
-			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
-			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
-			0x00, 0x00,
-			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
-			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
-			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
-			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
-			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
-			0x00, 0x00,
-		},
-		nil,
-	},
-	{ // has a fixed huffman block with some length-distance pairs
-		"shesells.txt",
-		"shesells.txt",
-		"she sells seashells by the seashore\n",
-		[]byte{
-			0x1f, 0x8b, 0x08, 0x08, 0x72, 0x66, 0x8b, 0x4a,
-			0x00, 0x03, 0x73, 0x68, 0x65, 0x73, 0x65, 0x6c,
-			0x6c, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x2b,
-			0xce, 0x48, 0x55, 0x28, 0x4e, 0xcd, 0xc9, 0x29,
-			0x06, 0x92, 0x89, 0xc5, 0x19, 0x60, 0x56, 0x52,
-			0xa5, 0x42, 0x09, 0x58, 0x18, 0x28, 0x90, 0x5f,
-			0x94, 0xca, 0x05, 0x00, 0x76, 0xb0, 0x3b, 0xeb,
-			0x24, 0x00, 0x00, 0x00,
-		},
-		nil,
-	},
-	{ // has dynamic huffman blocks
-		"gettysburg",
-		"gettysburg",
-		"  Four score and seven years ago our fathers brought forth on\n" +
-			"this continent, a new nation, conceived in Liberty, and dedicated\n" +
-			"to the proposition that all men are created equal.\n" +
-			"  Now we are engaged in a great Civil War, testing whether that\n" +
-			"nation, or any nation so conceived and so dedicated, can long\n" +
-			"endure.\n" +
-			"  We are met on a great battle-field of that war.\n" +
-			"  We have come to dedicate a portion of that field, as a final\n" +
-			"resting place for those who here gave their lives that that\n" +
-			"nation might live.  It is altogether fitting and proper that\n" +
-			"we should do this.\n" +
-			"  But, in a larger sense, we can not dedicate — we can not\n" +
-			"consecrate — we can not hallow — this ground.\n" +
-			"  The brave men, living and dead, who struggled here, have\n" +
-			"consecrated it, far above our poor power to add or detract.\n" +
-			"The world will little note, nor long remember what we say here,\n" +
-			"but it can never forget what they did here.\n" +
-			"  It is for us the living, rather, to be dedicated here to the\n" +
-			"unfinished work which they who fought here have thus far so\n" +
-			"nobly advanced.  It is rather for us to be here dedicated to\n" +
-			"the great task remaining before us — that from these honored\n" +
-			"dead we take increased devotion to that cause for which they\n" +
-			"gave the last full measure of devotion —\n" +
-			"  that we here highly resolve that these dead shall not have\n" +
-			"died in vain — that this nation, under God, shall have a new\n" +
-			"birth of freedom — and that government of the people, by the\n" +
-			"people, for the people, shall not perish from this earth.\n" +
-			"\n" +
-			"Abraham Lincoln, November 19, 1863, Gettysburg, Pennsylvania\n",
-		[]byte{
-			0x1f, 0x8b, 0x08, 0x08, 0xd1, 0x12, 0x2b, 0x4a,
-			0x00, 0x03, 0x67, 0x65, 0x74, 0x74, 0x79, 0x73,
-			0x62, 0x75, 0x72, 0x67, 0x00, 0x65, 0x54, 0xcd,
-			0x6e, 0xd4, 0x30, 0x10, 0xbe, 0xfb, 0x29, 0xe6,
-			0x01, 0x42, 0xa5, 0x0a, 0x09, 0xc1, 0x11, 0x90,
-			0x40, 0x48, 0xa8, 0xe2, 0x80, 0xd4, 0xf3, 0x24,
-			0x9e, 0x24, 0x56, 0xbd, 0x9e, 0xc5, 0x76, 0x76,
-			0x95, 0x1b, 0x0f, 0xc1, 0x13, 0xf2, 0x24, 0x7c,
-			0x63, 0x77, 0x9b, 0x4a, 0x5c, 0xaa, 0x6e, 0x6c,
-			0xcf, 0x7c, 0x7f, 0x33, 0x44, 0x5f, 0x74, 0xcb,
-			0x54, 0x26, 0xcd, 0x42, 0x9c, 0x3c, 0x15, 0xb9,
-			0x48, 0xa2, 0x5d, 0x38, 0x17, 0xe2, 0x45, 0xc9,
-			0x4e, 0x67, 0xae, 0xab, 0xe0, 0xf7, 0x98, 0x75,
-			0x5b, 0xd6, 0x4a, 0xb3, 0xe6, 0xba, 0x92, 0x26,
-			0x57, 0xd7, 0x50, 0x68, 0xd2, 0x54, 0x43, 0x92,
-			0x54, 0x07, 0x62, 0x4a, 0x72, 0xa5, 0xc4, 0x35,
-			0x68, 0x1a, 0xec, 0x60, 0x92, 0x70, 0x11, 0x4f,
-			0x21, 0xd1, 0xf7, 0x30, 0x4a, 0xae, 0xfb, 0xd0,
-			0x9a, 0x78, 0xf1, 0x61, 0xe2, 0x2a, 0xde, 0x55,
-			0x25, 0xd4, 0xa6, 0x73, 0xd6, 0xb3, 0x96, 0x60,
-			0xef, 0xf0, 0x9b, 0x2b, 0x71, 0x8c, 0x74, 0x02,
-			0x10, 0x06, 0xac, 0x29, 0x8b, 0xdd, 0x25, 0xf9,
-			0xb5, 0x71, 0xbc, 0x73, 0x44, 0x0f, 0x7a, 0xa5,
-			0xab, 0xb4, 0x33, 0x49, 0x0b, 0x2f, 0xbd, 0x03,
-			0xd3, 0x62, 0x17, 0xe9, 0x73, 0xb8, 0x84, 0x48,
-			0x8f, 0x9c, 0x07, 0xaa, 0x52, 0x00, 0x6d, 0xa1,
-			0xeb, 0x2a, 0xc6, 0xa0, 0x95, 0x76, 0x37, 0x78,
-			0x9a, 0x81, 0x65, 0x7f, 0x46, 0x4b, 0x45, 0x5f,
-			0xe1, 0x6d, 0x42, 0xe8, 0x01, 0x13, 0x5c, 0x38,
-			0x51, 0xd4, 0xb4, 0x38, 0x49, 0x7e, 0xcb, 0x62,
-			0x28, 0x1e, 0x3b, 0x82, 0x93, 0x54, 0x48, 0xf1,
-			0xd2, 0x7d, 0xe4, 0x5a, 0xa3, 0xbc, 0x99, 0x83,
-			0x44, 0x4f, 0x3a, 0x77, 0x36, 0x57, 0xce, 0xcf,
-			0x2f, 0x56, 0xbe, 0x80, 0x90, 0x9e, 0x84, 0xea,
-			0x51, 0x1f, 0x8f, 0xcf, 0x90, 0xd4, 0x60, 0xdc,
-			0x5e, 0xb4, 0xf7, 0x10, 0x0b, 0x26, 0xe0, 0xff,
-			0xc4, 0xd1, 0xe5, 0x67, 0x2e, 0xe7, 0xc8, 0x93,
-			0x98, 0x05, 0xb8, 0xa8, 0x45, 0xc0, 0x4d, 0x09,
-			0xdc, 0x84, 0x16, 0x2b, 0x0d, 0x9a, 0x21, 0x53,
-			0x04, 0x8b, 0xd2, 0x0b, 0xbd, 0xa2, 0x4c, 0xa7,
-			0x60, 0xee, 0xd9, 0xe1, 0x1d, 0xd1, 0xb7, 0x4a,
-			0x30, 0x8f, 0x63, 0xd5, 0xa5, 0x8b, 0x33, 0x87,
-			0xda, 0x1a, 0x18, 0x79, 0xf3, 0xe3, 0xa6, 0x17,
-			0x94, 0x2e, 0xab, 0x6e, 0xa0, 0xe3, 0xcd, 0xac,
-			0x50, 0x8c, 0xca, 0xa7, 0x0d, 0x76, 0x37, 0xd1,
-			0x23, 0xe7, 0x05, 0x57, 0x8b, 0xa4, 0x22, 0x83,
-			0xd9, 0x62, 0x52, 0x25, 0xad, 0x07, 0xbb, 0xbf,
-			0xbf, 0xff, 0xbc, 0xfa, 0xee, 0x20, 0x73, 0x91,
-			0x29, 0xff, 0x7f, 0x02, 0x71, 0x62, 0x84, 0xb5,
-			0xf6, 0xb5, 0x25, 0x6b, 0x41, 0xde, 0x92, 0xb7,
-			0x76, 0x3f, 0x91, 0x91, 0x31, 0x1b, 0x41, 0x84,
-			0x62, 0x30, 0x0a, 0x37, 0xa4, 0x5e, 0x18, 0x3a,
-			0x99, 0x08, 0xa5, 0xe6, 0x6d, 0x59, 0x22, 0xec,
-			0x33, 0x39, 0x86, 0x26, 0xf5, 0xab, 0x66, 0xc8,
-			0x08, 0x20, 0xcf, 0x0c, 0xd7, 0x47, 0x45, 0x21,
-			0x0b, 0xf6, 0x59, 0xd5, 0xfe, 0x5c, 0x8d, 0xaa,
-			0x12, 0x7b, 0x6f, 0xa1, 0xf0, 0x52, 0x33, 0x4f,
-			0xf5, 0xce, 0x59, 0xd3, 0xab, 0x66, 0x10, 0xbf,
-			0x06, 0xc4, 0x31, 0x06, 0x73, 0xd6, 0x80, 0xa2,
-			0x78, 0xc2, 0x45, 0xcb, 0x03, 0x65, 0x39, 0xc9,
-			0x09, 0xd1, 0x06, 0x04, 0x33, 0x1a, 0x5a, 0xf1,
-			0xde, 0x01, 0xb8, 0x71, 0x83, 0xc4, 0xb5, 0xb3,
-			0xc3, 0x54, 0x65, 0x33, 0x0d, 0x5a, 0xf7, 0x9b,
-			0x90, 0x7c, 0x27, 0x1f, 0x3a, 0x58, 0xa3, 0xd8,
-			0xfd, 0x30, 0x5f, 0xb7, 0xd2, 0x66, 0xa2, 0x93,
-			0x1c, 0x28, 0xb7, 0xe9, 0x1b, 0x0c, 0xe1, 0x28,
-			0x47, 0x26, 0xbb, 0xe9, 0x7d, 0x7e, 0xdc, 0x96,
-			0x10, 0x92, 0x50, 0x56, 0x7c, 0x06, 0xe2, 0x27,
-			0xb4, 0x08, 0xd3, 0xda, 0x7b, 0x98, 0x34, 0x73,
-			0x9f, 0xdb, 0xf6, 0x62, 0xed, 0x31, 0x41, 0x13,
-			0xd3, 0xa2, 0xa8, 0x4b, 0x3a, 0xc6, 0x1d, 0xe4,
-			0x2f, 0x8c, 0xf8, 0xfb, 0x97, 0x64, 0xf4, 0xb6,
-			0x2f, 0x80, 0x5a, 0xf3, 0x56, 0xe0, 0x40, 0x50,
-			0xd5, 0x19, 0xd0, 0x1e, 0xfc, 0xca, 0xe5, 0xc9,
-			0xd4, 0x60, 0x00, 0x81, 0x2e, 0xa3, 0xcc, 0xb6,
-			0x52, 0xf0, 0xb4, 0xdb, 0x69, 0x99, 0xce, 0x7a,
-			0x32, 0x4c, 0x08, 0xed, 0xaa, 0x10, 0x10, 0xe3,
-			0x6f, 0xee, 0x99, 0x68, 0x95, 0x9f, 0x04, 0x71,
-			0xb2, 0x49, 0x2f, 0x62, 0xa6, 0x5e, 0xb4, 0xef,
-			0x02, 0xed, 0x4f, 0x27, 0xde, 0x4a, 0x0f, 0xfd,
-			0xc1, 0xcc, 0xdd, 0x02, 0x8f, 0x08, 0x16, 0x54,
-			0xdf, 0xda, 0xca, 0xe0, 0x82, 0xf1, 0xb4, 0x31,
-			0x7a, 0xa9, 0x81, 0xfe, 0x90, 0xb7, 0x3e, 0xdb,
-			0xd3, 0x35, 0xc0, 0x20, 0x80, 0x33, 0x46, 0x4a,
-			0x63, 0xab, 0xd1, 0x0d, 0x29, 0xd2, 0xe2, 0x84,
-			0xb8, 0xdb, 0xfa, 0xe9, 0x89, 0x44, 0x86, 0x7c,
-			0xe8, 0x0b, 0xe6, 0x02, 0x6a, 0x07, 0x9b, 0x96,
-			0xd0, 0xdb, 0x2e, 0x41, 0x4c, 0xa1, 0xd5, 0x57,
-			0x45, 0x14, 0xfb, 0xe3, 0xa6, 0x72, 0x5b, 0x87,
-			0x6e, 0x0c, 0x6d, 0x5b, 0xce, 0xe0, 0x2f, 0xe2,
-			0x21, 0x81, 0x95, 0xb0, 0xe8, 0xb6, 0x32, 0x0b,
-			0xb2, 0x98, 0x13, 0x52, 0x5d, 0xfb, 0xec, 0x63,
-			0x17, 0x8a, 0x9e, 0x23, 0x22, 0x36, 0xee, 0xcd,
-			0xda, 0xdb, 0xcf, 0x3e, 0xf1, 0xc7, 0xf1, 0x01,
-			0x12, 0x93, 0x0a, 0xeb, 0x6f, 0xf2, 0x02, 0x15,
-			0x96, 0x77, 0x5d, 0xef, 0x9c, 0xfb, 0x88, 0x91,
-			0x59, 0xf9, 0x84, 0xdd, 0x9b, 0x26, 0x8d, 0x80,
-			0xf9, 0x80, 0x66, 0x2d, 0xac, 0xf7, 0x1f, 0x06,
-			0xba, 0x7f, 0xff, 0xee, 0xed, 0x40, 0x5f, 0xa5,
-			0xd6, 0xbd, 0x8c, 0x5b, 0x46, 0xd2, 0x7e, 0x48,
-			0x4a, 0x65, 0x8f, 0x08, 0x42, 0x60, 0xf7, 0x0f,
-			0xb9, 0x16, 0x0b, 0x0c, 0x1a, 0x06, 0x00, 0x00,
-		},
-		nil,
-	},
-	{ // has 1 non-empty fixed huffman block then garbage
-		"hello.txt",
-		"hello.txt + garbage",
-		"hello world\n",
-		[]byte{
-			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
-			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
-			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
-			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
-			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
-			0x00, 0x00, 'g', 'a', 'r', 'b', 'a', 'g', 'e', '!', '!', '!',
-		},
-		ErrHeader,
-	},
-	{ // has 1 non-empty fixed huffman block not enough header
-		"hello.txt",
-		"hello.txt + garbage",
-		"hello world\n",
-		[]byte{
-			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
-			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
-			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
-			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
-			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0x0c, 0x00,
-			0x00, 0x00, gzipID1,
-		},
-		io.ErrUnexpectedEOF,
-	},
-	{ // has 1 non-empty fixed huffman block but corrupt checksum
-		"hello.txt",
-		"hello.txt + corrupt checksum",
-		"hello world\n",
-		[]byte{
-			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
-			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
-			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
-			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
-			0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x00,
-			0x00, 0x00,
-		},
-		ErrChecksum,
-	},
-	{ // has 1 non-empty fixed huffman block but corrupt size
-		"hello.txt",
-		"hello.txt + corrupt size",
-		"hello world\n",
-		[]byte{
-			0x1f, 0x8b, 0x08, 0x08, 0xc8, 0x58, 0x13, 0x4a,
-			0x00, 0x03, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e,
-			0x74, 0x78, 0x74, 0x00, 0xcb, 0x48, 0xcd, 0xc9,
-			0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca, 0x49, 0xe1,
-			0x02, 0x00, 0x2d, 0x3b, 0x08, 0xaf, 0xff, 0x00,
-			0x00, 0x00,
-		},
-		ErrChecksum,
-	},
-}
-
-func TestDecompressor(t *testing.T) {
-	b := new(bytes.Buffer)
-	for _, tt := range gunzipTests {
-		in := bytes.NewReader(tt.gzip)
-		gzip, err := NewReader(in)
-		if err != nil {
-			t.Errorf("%s: NewReader: %s", tt.name, err)
-			continue
-		}
-		defer gzip.Close()
-		if tt.name != gzip.Name {
-			t.Errorf("%s: got name %s", tt.name, gzip.Name)
-		}
-		b.Reset()
-		n, err := io.Copy(b, gzip)
-		if err != tt.err {
-			t.Errorf("%s: io.Copy: %v want %v", tt.name, err, tt.err)
-		}
-		s := b.String()
-		if s != tt.raw {
-			t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.name, n, s, len(tt.raw), tt.raw)
-		}
-
-		// Test Reader Reset.
-		in = bytes.NewReader(tt.gzip)
-		err = gzip.Reset(in)
-		if err != nil {
-			t.Errorf("%s: Reset: %s", tt.name, err)
-			continue
-		}
-		if tt.name != gzip.Name {
-			t.Errorf("%s: got name %s", tt.name, gzip.Name)
-		}
-		b.Reset()
-		n, err = io.Copy(b, gzip)
-		if err != tt.err {
-			t.Errorf("%s: io.Copy: %v want %v", tt.name, err, tt.err)
-		}
-		s = b.String()
-		if s != tt.raw {
-			t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.name, n, s, len(tt.raw), tt.raw)
-		}
-	}
-}
-
-func TestIssue6550(t *testing.T) {
-	f, err := os.Open("testdata/issue6550.gz")
-	if err != nil {
-		t.Fatal(err)
-	}
-	gzip, err := NewReader(f)
-	if err != nil {
-		t.Fatalf("NewReader(testdata/issue6550.gz): %v", err)
-	}
-	defer gzip.Close()
-	done := make(chan bool, 1)
-	go func() {
-		_, err := io.Copy(ioutil.Discard, gzip)
-		if err == nil {
-			t.Errorf("Copy succeeded")
-		} else {
-			t.Logf("Copy failed (correctly): %v", err)
-		}
-		done <- true
-	}()
-	select {
-	case <-time.After(1 * time.Second):
-		t.Errorf("Copy hung")
-	case <-done:
-		// ok
-	}
-}
-
-func TestInitialReset(t *testing.T) {
-	var r Reader
-	if err := r.Reset(bytes.NewReader(gunzipTests[1].gzip)); err != nil {
-		t.Error(err)
-	}
-	var buf bytes.Buffer
-	if _, err := io.Copy(&buf, &r); err != nil {
-		t.Error(err)
-	}
-	if s := buf.String(); s != gunzipTests[1].raw {
-		t.Errorf("got %q want %q", s, gunzipTests[1].raw)
-	}
-}
-
-func TestMultistreamFalse(t *testing.T) {
-	// Find concatenation test.
-	var tt gunzipTest
-	for _, tt = range gunzipTests {
-		if strings.HasSuffix(tt.desc, " x2") {
-			goto Found
-		}
-	}
-	t.Fatal("cannot find hello.txt x2 in gunzip tests")
-
-Found:
-	br := bytes.NewReader(tt.gzip)
-	var r Reader
-	if err := r.Reset(br); err != nil {
-		t.Fatalf("first reset: %v", err)
-	}
-
-	// Expect two streams with "hello world\n", then real EOF.
-	const hello = "hello world\n"
-
-	r.Multistream(false)
-	data, err := ioutil.ReadAll(&r)
-	if string(data) != hello || err != nil {
-		t.Fatalf("first stream = %q, %v, want %q, %v", string(data), err, hello, nil)
-	}
-
-	if err := r.Reset(br); err != nil {
-		t.Fatalf("second reset: %v", err)
-	}
-	r.Multistream(false)
-	data, err = ioutil.ReadAll(&r)
-	if string(data) != hello || err != nil {
-		t.Fatalf("second stream = %q, %v, want %q, %v", string(data), err, hello, nil)
-	}
-
-	if err := r.Reset(br); err != io.EOF {
-		t.Fatalf("third reset: err=%v, want io.EOF", err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/compress/gzip/gzip.go b/third_party/gofrontend/libgo/go/compress/gzip/gzip.go
deleted file mode 100644
index 5131d12..0000000
--- a/third_party/gofrontend/libgo/go/compress/gzip/gzip.go
+++ /dev/null
@@ -1,272 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gzip
-
-import (
-	"compress/flate"
-	"errors"
-	"fmt"
-	"hash"
-	"hash/crc32"
-	"io"
-)
-
-// These constants are copied from the flate package, so that code that imports
-// "compress/gzip" does not also have to import "compress/flate".
-const (
-	NoCompression      = flate.NoCompression
-	BestSpeed          = flate.BestSpeed
-	BestCompression    = flate.BestCompression
-	DefaultCompression = flate.DefaultCompression
-)
-
-// A Writer is an io.WriteCloser.
-// Writes to a Writer are compressed and written to w.
-type Writer struct {
-	Header
-	w           io.Writer
-	level       int
-	wroteHeader bool
-	compressor  *flate.Writer
-	digest      hash.Hash32
-	size        uint32
-	closed      bool
-	buf         [10]byte
-	err         error
-}
-
-// NewWriter returns a new Writer.
-// Writes to the returned writer are compressed and written to w.
-//
-// It is the caller's responsibility to call Close on the WriteCloser when done.
-// Writes may be buffered and not flushed until Close.
-//
-// Callers that wish to set the fields in Writer.Header must do so before
-// the first call to Write or Close. The Comment and Name header fields are
-// UTF-8 strings in Go, but the underlying format requires NUL-terminated ISO
-// 8859-1 (Latin-1). NUL or non-Latin-1 runes in those strings will lead to an
-// error on Write.
-func NewWriter(w io.Writer) *Writer {
-	z, _ := NewWriterLevel(w, DefaultCompression)
-	return z
-}
-
-// NewWriterLevel is like NewWriter but specifies the compression level instead
-// of assuming DefaultCompression.
-//
-// The compression level can be DefaultCompression, NoCompression, or any
-// integer value between BestSpeed and BestCompression inclusive. The error
-// returned will be nil if the level is valid.
-func NewWriterLevel(w io.Writer, level int) (*Writer, error) {
-	if level < DefaultCompression || level > BestCompression {
-		return nil, fmt.Errorf("gzip: invalid compression level: %d", level)
-	}
-	z := new(Writer)
-	z.init(w, level)
-	return z, nil
-}
-
-func (z *Writer) init(w io.Writer, level int) {
-	digest := z.digest
-	if digest != nil {
-		digest.Reset()
-	} else {
-		digest = crc32.NewIEEE()
-	}
-	compressor := z.compressor
-	if compressor != nil {
-		compressor.Reset(w)
-	}
-	*z = Writer{
-		Header: Header{
-			OS: 255, // unknown
-		},
-		w:          w,
-		level:      level,
-		digest:     digest,
-		compressor: compressor,
-	}
-}
-
-// Reset discards the Writer z's state and makes it equivalent to the
-// result of its original state from NewWriter or NewWriterLevel, but
-// writing to w instead. This permits reusing a Writer rather than
-// allocating a new one.
-func (z *Writer) Reset(w io.Writer) {
-	z.init(w, z.level)
-}
-
-// GZIP (RFC 1952) is little-endian, unlike ZLIB (RFC 1950).
-func put2(p []byte, v uint16) {
-	p[0] = uint8(v >> 0)
-	p[1] = uint8(v >> 8)
-}
-
-func put4(p []byte, v uint32) {
-	p[0] = uint8(v >> 0)
-	p[1] = uint8(v >> 8)
-	p[2] = uint8(v >> 16)
-	p[3] = uint8(v >> 24)
-}
-
-// writeBytes writes a length-prefixed byte slice to z.w.
-func (z *Writer) writeBytes(b []byte) error {
-	if len(b) > 0xffff {
-		return errors.New("gzip.Write: Extra data is too large")
-	}
-	put2(z.buf[0:2], uint16(len(b)))
-	_, err := z.w.Write(z.buf[0:2])
-	if err != nil {
-		return err
-	}
-	_, err = z.w.Write(b)
-	return err
-}
-
-// writeString writes a UTF-8 string s in GZIP's format to z.w.
-// GZIP (RFC 1952) specifies that strings are NUL-terminated ISO 8859-1 (Latin-1).
-func (z *Writer) writeString(s string) (err error) {
-	// GZIP stores Latin-1 strings; error if non-Latin-1; convert if non-ASCII.
-	needconv := false
-	for _, v := range s {
-		if v == 0 || v > 0xff {
-			return errors.New("gzip.Write: non-Latin-1 header string")
-		}
-		if v > 0x7f {
-			needconv = true
-		}
-	}
-	if needconv {
-		b := make([]byte, 0, len(s))
-		for _, v := range s {
-			b = append(b, byte(v))
-		}
-		_, err = z.w.Write(b)
-	} else {
-		_, err = io.WriteString(z.w, s)
-	}
-	if err != nil {
-		return err
-	}
-	// GZIP strings are NUL-terminated.
-	z.buf[0] = 0
-	_, err = z.w.Write(z.buf[0:1])
-	return err
-}
-
-// Write writes a compressed form of p to the underlying io.Writer. The
-// compressed bytes are not necessarily flushed until the Writer is closed.
-func (z *Writer) Write(p []byte) (int, error) {
-	if z.err != nil {
-		return 0, z.err
-	}
-	var n int
-	// Write the GZIP header lazily.
-	if !z.wroteHeader {
-		z.wroteHeader = true
-		z.buf[0] = gzipID1
-		z.buf[1] = gzipID2
-		z.buf[2] = gzipDeflate
-		z.buf[3] = 0
-		if z.Extra != nil {
-			z.buf[3] |= 0x04
-		}
-		if z.Name != "" {
-			z.buf[3] |= 0x08
-		}
-		if z.Comment != "" {
-			z.buf[3] |= 0x10
-		}
-		put4(z.buf[4:8], uint32(z.ModTime.Unix()))
-		if z.level == BestCompression {
-			z.buf[8] = 2
-		} else if z.level == BestSpeed {
-			z.buf[8] = 4
-		} else {
-			z.buf[8] = 0
-		}
-		z.buf[9] = z.OS
-		n, z.err = z.w.Write(z.buf[0:10])
-		if z.err != nil {
-			return n, z.err
-		}
-		if z.Extra != nil {
-			z.err = z.writeBytes(z.Extra)
-			if z.err != nil {
-				return n, z.err
-			}
-		}
-		if z.Name != "" {
-			z.err = z.writeString(z.Name)
-			if z.err != nil {
-				return n, z.err
-			}
-		}
-		if z.Comment != "" {
-			z.err = z.writeString(z.Comment)
-			if z.err != nil {
-				return n, z.err
-			}
-		}
-		if z.compressor == nil {
-			z.compressor, _ = flate.NewWriter(z.w, z.level)
-		}
-	}
-	z.size += uint32(len(p))
-	z.digest.Write(p)
-	n, z.err = z.compressor.Write(p)
-	return n, z.err
-}
-
-// Flush flushes any pending compressed data to the underlying writer.
-//
-// It is useful mainly in compressed network protocols, to ensure that
-// a remote reader has enough data to reconstruct a packet. Flush does
-// not return until the data has been written. If the underlying
-// writer returns an error, Flush returns that error.
-//
-// In the terminology of the zlib library, Flush is equivalent to Z_SYNC_FLUSH.
-func (z *Writer) Flush() error {
-	if z.err != nil {
-		return z.err
-	}
-	if z.closed {
-		return nil
-	}
-	if !z.wroteHeader {
-		z.Write(nil)
-		if z.err != nil {
-			return z.err
-		}
-	}
-	z.err = z.compressor.Flush()
-	return z.err
-}
-
-// Close closes the Writer, flushing any unwritten data to the underlying
-// io.Writer, but does not close the underlying io.Writer.
-func (z *Writer) Close() error {
-	if z.err != nil {
-		return z.err
-	}
-	if z.closed {
-		return nil
-	}
-	z.closed = true
-	if !z.wroteHeader {
-		z.Write(nil)
-		if z.err != nil {
-			return z.err
-		}
-	}
-	z.err = z.compressor.Close()
-	if z.err != nil {
-		return z.err
-	}
-	put4(z.buf[0:4], z.digest.Sum32())
-	put4(z.buf[4:8], z.size)
-	_, z.err = z.w.Write(z.buf[0:8])
-	return z.err
-}
diff --git a/third_party/gofrontend/libgo/go/compress/gzip/gzip_test.go b/third_party/gofrontend/libgo/go/compress/gzip/gzip_test.go
deleted file mode 100644
index 09271b2..0000000
--- a/third_party/gofrontend/libgo/go/compress/gzip/gzip_test.go
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gzip
-
-import (
-	"bufio"
-	"bytes"
-	"io/ioutil"
-	"testing"
-	"time"
-)
-
-// TestEmpty tests that an empty payload still forms a valid GZIP stream.
-func TestEmpty(t *testing.T) {
-	buf := new(bytes.Buffer)
-
-	if err := NewWriter(buf).Close(); err != nil {
-		t.Fatalf("Writer.Close: %v", err)
-	}
-
-	r, err := NewReader(buf)
-	if err != nil {
-		t.Fatalf("NewReader: %v", err)
-	}
-	b, err := ioutil.ReadAll(r)
-	if err != nil {
-		t.Fatalf("ReadAll: %v", err)
-	}
-	if len(b) != 0 {
-		t.Fatalf("got %d bytes, want 0", len(b))
-	}
-	if err := r.Close(); err != nil {
-		t.Fatalf("Reader.Close: %v", err)
-	}
-}
-
-// TestRoundTrip tests that gzipping and then gunzipping is the identity
-// function.
-func TestRoundTrip(t *testing.T) {
-	buf := new(bytes.Buffer)
-
-	w := NewWriter(buf)
-	w.Comment = "comment"
-	w.Extra = []byte("extra")
-	w.ModTime = time.Unix(1e8, 0)
-	w.Name = "name"
-	if _, err := w.Write([]byte("payload")); err != nil {
-		t.Fatalf("Write: %v", err)
-	}
-	if err := w.Close(); err != nil {
-		t.Fatalf("Writer.Close: %v", err)
-	}
-
-	r, err := NewReader(buf)
-	if err != nil {
-		t.Fatalf("NewReader: %v", err)
-	}
-	b, err := ioutil.ReadAll(r)
-	if err != nil {
-		t.Fatalf("ReadAll: %v", err)
-	}
-	if string(b) != "payload" {
-		t.Fatalf("payload is %q, want %q", string(b), "payload")
-	}
-	if r.Comment != "comment" {
-		t.Fatalf("comment is %q, want %q", r.Comment, "comment")
-	}
-	if string(r.Extra) != "extra" {
-		t.Fatalf("extra is %q, want %q", r.Extra, "extra")
-	}
-	if r.ModTime.Unix() != 1e8 {
-		t.Fatalf("mtime is %d, want %d", r.ModTime.Unix(), uint32(1e8))
-	}
-	if r.Name != "name" {
-		t.Fatalf("name is %q, want %q", r.Name, "name")
-	}
-	if err := r.Close(); err != nil {
-		t.Fatalf("Reader.Close: %v", err)
-	}
-}
-
-// TestLatin1 tests the internal functions for converting to and from Latin-1.
-func TestLatin1(t *testing.T) {
-	latin1 := []byte{0xc4, 'u', 0xdf, 'e', 'r', 'u', 'n', 'g', 0}
-	utf8 := "Äußerung"
-	z := Reader{r: bufio.NewReader(bytes.NewReader(latin1))}
-	s, err := z.readString()
-	if err != nil {
-		t.Fatalf("readString: %v", err)
-	}
-	if s != utf8 {
-		t.Fatalf("read latin-1: got %q, want %q", s, utf8)
-	}
-
-	buf := bytes.NewBuffer(make([]byte, 0, len(latin1)))
-	c := Writer{w: buf}
-	if err = c.writeString(utf8); err != nil {
-		t.Fatalf("writeString: %v", err)
-	}
-	s = buf.String()
-	if s != string(latin1) {
-		t.Fatalf("write utf-8: got %q, want %q", s, string(latin1))
-	}
-}
-
-// TestLatin1RoundTrip tests that metadata that is representable in Latin-1
-// survives a round trip.
-func TestLatin1RoundTrip(t *testing.T) {
-	testCases := []struct {
-		name string
-		ok   bool
-	}{
-		{"", true},
-		{"ASCII is OK", true},
-		{"unless it contains a NUL\x00", false},
-		{"no matter where \x00 occurs", false},
-		{"\x00\x00\x00", false},
-		{"Látin-1 also passes (U+00E1)", true},
-		{"but LĀtin Extended-A (U+0100) does not", false},
-		{"neither does 日本語", false},
-		{"invalid UTF-8 also \xffails", false},
-		{"\x00 as does Látin-1 with NUL", false},
-	}
-	for _, tc := range testCases {
-		buf := new(bytes.Buffer)
-
-		w := NewWriter(buf)
-		w.Name = tc.name
-		err := w.Close()
-		if (err == nil) != tc.ok {
-			t.Errorf("Writer.Close: name = %q, err = %v", tc.name, err)
-			continue
-		}
-		if !tc.ok {
-			continue
-		}
-
-		r, err := NewReader(buf)
-		if err != nil {
-			t.Errorf("NewReader: %v", err)
-			continue
-		}
-		_, err = ioutil.ReadAll(r)
-		if err != nil {
-			t.Errorf("ReadAll: %v", err)
-			continue
-		}
-		if r.Name != tc.name {
-			t.Errorf("name is %q, want %q", r.Name, tc.name)
-			continue
-		}
-		if err := r.Close(); err != nil {
-			t.Errorf("Reader.Close: %v", err)
-			continue
-		}
-	}
-}
-
-func TestWriterFlush(t *testing.T) {
-	buf := new(bytes.Buffer)
-
-	w := NewWriter(buf)
-	w.Comment = "comment"
-	w.Extra = []byte("extra")
-	w.ModTime = time.Unix(1e8, 0)
-	w.Name = "name"
-
-	n0 := buf.Len()
-	if n0 != 0 {
-		t.Fatalf("buffer size = %d before writes; want 0", n0)
-	}
-
-	if err := w.Flush(); err != nil {
-		t.Fatal(err)
-	}
-
-	n1 := buf.Len()
-	if n1 == 0 {
-		t.Fatal("no data after first flush")
-	}
-
-	w.Write([]byte("x"))
-
-	n2 := buf.Len()
-	if n1 != n2 {
-		t.Fatalf("after writing a single byte, size changed from %d to %d; want no change", n1, n2)
-	}
-
-	if err := w.Flush(); err != nil {
-		t.Fatal(err)
-	}
-
-	n3 := buf.Len()
-	if n2 == n3 {
-		t.Fatal("Flush didn't flush any data")
-	}
-}
-
-// Multiple gzip files concatenated form a valid gzip file.
-func TestConcat(t *testing.T) {
-	var buf bytes.Buffer
-	w := NewWriter(&buf)
-	w.Write([]byte("hello "))
-	w.Close()
-	w = NewWriter(&buf)
-	w.Write([]byte("world\n"))
-	w.Close()
-
-	r, err := NewReader(&buf)
-	data, err := ioutil.ReadAll(r)
-	if string(data) != "hello world\n" || err != nil {
-		t.Fatalf("ReadAll = %q, %v, want %q, nil", data, err, "hello world")
-	}
-}
-
-func TestWriterReset(t *testing.T) {
-	buf := new(bytes.Buffer)
-	buf2 := new(bytes.Buffer)
-	z := NewWriter(buf)
-	msg := []byte("hello world")
-	z.Write(msg)
-	z.Close()
-	z.Reset(buf2)
-	z.Write(msg)
-	z.Close()
-	if buf.String() != buf2.String() {
-		t.Errorf("buf2 %q != original buf of %q", buf2.String(), buf.String())
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/compress/gzip/testdata/issue6550.gz b/third_party/gofrontend/libgo/go/compress/gzip/testdata/issue6550.gz
deleted file mode 100644
index 57972b6..0000000
--- a/third_party/gofrontend/libgo/go/compress/gzip/testdata/issue6550.gz
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/compress/lzw/reader.go b/third_party/gofrontend/libgo/go/compress/lzw/reader.go
deleted file mode 100644
index 1353831..0000000
--- a/third_party/gofrontend/libgo/go/compress/lzw/reader.go
+++ /dev/null
@@ -1,262 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package lzw implements the Lempel-Ziv-Welch compressed data format,
-// described in T. A. Welch, ``A Technique for High-Performance Data
-// Compression'', Computer, 17(6) (June 1984), pp 8-19.
-//
-// In particular, it implements LZW as used by the GIF and PDF file
-// formats, which means variable-width codes up to 12 bits and the first
-// two non-literal codes are a clear code and an EOF code.
-//
-// The TIFF file format uses a similar but incompatible version of the LZW
-// algorithm. See the golang.org/x/image/tiff/lzw package for an
-// implementation.
-package lzw
-
-// TODO(nigeltao): check that PDF uses LZW in the same way as GIF,
-// modulo LSB/MSB packing order.
-
-import (
-	"bufio"
-	"errors"
-	"fmt"
-	"io"
-)
-
-// Order specifies the bit ordering in an LZW data stream.
-type Order int
-
-const (
-	// LSB means Least Significant Bits first, as used in the GIF file format.
-	LSB Order = iota
-	// MSB means Most Significant Bits first, as used in the TIFF and PDF
-	// file formats.
-	MSB
-)
-
-const (
-	maxWidth           = 12
-	decoderInvalidCode = 0xffff
-	flushBuffer        = 1 << maxWidth
-)
-
-// decoder is the state from which the readXxx method converts a byte
-// stream into a code stream.
-type decoder struct {
-	r        io.ByteReader
-	bits     uint32
-	nBits    uint
-	width    uint
-	read     func(*decoder) (uint16, error) // readLSB or readMSB
-	litWidth int                            // width in bits of literal codes
-	err      error
-
-	// The first 1<<litWidth codes are literal codes.
-	// The next two codes mean clear and EOF.
-	// Other valid codes are in the range [lo, hi] where lo := clear + 2,
-	// with the upper bound incrementing on each code seen.
-	// overflow is the code at which hi overflows the code width.
-	// last is the most recently seen code, or decoderInvalidCode.
-	clear, eof, hi, overflow, last uint16
-
-	// Each code c in [lo, hi] expands to two or more bytes. For c != hi:
-	//   suffix[c] is the last of these bytes.
-	//   prefix[c] is the code for all but the last byte.
-	//   This code can either be a literal code or another code in [lo, c).
-	// The c == hi case is a special case.
-	suffix [1 << maxWidth]uint8
-	prefix [1 << maxWidth]uint16
-
-	// output is the temporary output buffer.
-	// Literal codes are accumulated from the start of the buffer.
-	// Non-literal codes decode to a sequence of suffixes that are first
-	// written right-to-left from the end of the buffer before being copied
-	// to the start of the buffer.
-	// It is flushed when it contains >= 1<<maxWidth bytes,
-	// so that there is always room to decode an entire code.
-	output [2 * 1 << maxWidth]byte
-	o      int    // write index into output
-	toRead []byte // bytes to return from Read
-}
-
-// readLSB returns the next code for "Least Significant Bits first" data.
-func (d *decoder) readLSB() (uint16, error) {
-	for d.nBits < d.width {
-		x, err := d.r.ReadByte()
-		if err != nil {
-			return 0, err
-		}
-		d.bits |= uint32(x) << d.nBits
-		d.nBits += 8
-	}
-	code := uint16(d.bits & (1<<d.width - 1))
-	d.bits >>= d.width
-	d.nBits -= d.width
-	return code, nil
-}
-
-// readMSB returns the next code for "Most Significant Bits first" data.
-func (d *decoder) readMSB() (uint16, error) {
-	for d.nBits < d.width {
-		x, err := d.r.ReadByte()
-		if err != nil {
-			return 0, err
-		}
-		d.bits |= uint32(x) << (24 - d.nBits)
-		d.nBits += 8
-	}
-	code := uint16(d.bits >> (32 - d.width))
-	d.bits <<= d.width
-	d.nBits -= d.width
-	return code, nil
-}
-
-func (d *decoder) Read(b []byte) (int, error) {
-	for {
-		if len(d.toRead) > 0 {
-			n := copy(b, d.toRead)
-			d.toRead = d.toRead[n:]
-			return n, nil
-		}
-		if d.err != nil {
-			return 0, d.err
-		}
-		d.decode()
-	}
-}
-
-// decode decompresses bytes from r and leaves them in d.toRead.
-// read specifies how to decode bytes into codes.
-// litWidth is the width in bits of literal codes.
-func (d *decoder) decode() {
-	// Loop over the code stream, converting codes into decompressed bytes.
-	for {
-		code, err := d.read(d)
-		if err != nil {
-			if err == io.EOF {
-				err = io.ErrUnexpectedEOF
-			}
-			d.err = err
-			d.flush()
-			return
-		}
-		switch {
-		case code < d.clear:
-			// We have a literal code.
-			d.output[d.o] = uint8(code)
-			d.o++
-			if d.last != decoderInvalidCode {
-				// Save what the hi code expands to.
-				d.suffix[d.hi] = uint8(code)
-				d.prefix[d.hi] = d.last
-			}
-		case code == d.clear:
-			d.width = 1 + uint(d.litWidth)
-			d.hi = d.eof
-			d.overflow = 1 << d.width
-			d.last = decoderInvalidCode
-			continue
-		case code == d.eof:
-			d.flush()
-			d.err = io.EOF
-			return
-		case code <= d.hi:
-			c, i := code, len(d.output)-1
-			if code == d.hi {
-				// code == hi is a special case which expands to the last expansion
-				// followed by the head of the last expansion. To find the head, we walk
-				// the prefix chain until we find a literal code.
-				c = d.last
-				for c >= d.clear {
-					c = d.prefix[c]
-				}
-				d.output[i] = uint8(c)
-				i--
-				c = d.last
-			}
-			// Copy the suffix chain into output and then write that to w.
-			for c >= d.clear {
-				d.output[i] = d.suffix[c]
-				i--
-				c = d.prefix[c]
-			}
-			d.output[i] = uint8(c)
-			d.o += copy(d.output[d.o:], d.output[i:])
-			if d.last != decoderInvalidCode {
-				// Save what the hi code expands to.
-				d.suffix[d.hi] = uint8(c)
-				d.prefix[d.hi] = d.last
-			}
-		default:
-			d.err = errors.New("lzw: invalid code")
-			d.flush()
-			return
-		}
-		d.last, d.hi = code, d.hi+1
-		if d.hi >= d.overflow {
-			if d.width == maxWidth {
-				d.last = decoderInvalidCode
-			} else {
-				d.width++
-				d.overflow <<= 1
-			}
-		}
-		if d.o >= flushBuffer {
-			d.flush()
-			return
-		}
-	}
-}
-
-func (d *decoder) flush() {
-	d.toRead = d.output[:d.o]
-	d.o = 0
-}
-
-var errClosed = errors.New("lzw: reader/writer is closed")
-
-func (d *decoder) Close() error {
-	d.err = errClosed // in case any Reads come along
-	return nil
-}
-
-// NewReader creates a new io.ReadCloser.
-// Reads from the returned io.ReadCloser read and decompress data from r.
-// If r does not also implement io.ByteReader,
-// the decompressor may read more data than necessary from r.
-// It is the caller's responsibility to call Close on the ReadCloser when
-// finished reading.
-// The number of bits to use for literal codes, litWidth, must be in the
-// range [2,8] and is typically 8. It must equal the litWidth
-// used during compression.
-func NewReader(r io.Reader, order Order, litWidth int) io.ReadCloser {
-	d := new(decoder)
-	switch order {
-	case LSB:
-		d.read = (*decoder).readLSB
-	case MSB:
-		d.read = (*decoder).readMSB
-	default:
-		d.err = errors.New("lzw: unknown order")
-		return d
-	}
-	if litWidth < 2 || 8 < litWidth {
-		d.err = fmt.Errorf("lzw: litWidth %d out of range", litWidth)
-		return d
-	}
-	if br, ok := r.(io.ByteReader); ok {
-		d.r = br
-	} else {
-		d.r = bufio.NewReader(r)
-	}
-	d.litWidth = litWidth
-	d.width = 1 + uint(litWidth)
-	d.clear = uint16(1) << uint(litWidth)
-	d.eof, d.hi = d.clear+1, d.clear+1
-	d.overflow = uint16(1) << d.width
-	d.last = decoderInvalidCode
-
-	return d
-}
diff --git a/third_party/gofrontend/libgo/go/compress/lzw/reader_test.go b/third_party/gofrontend/libgo/go/compress/lzw/reader_test.go
deleted file mode 100644
index c3a5c3a..0000000
--- a/third_party/gofrontend/libgo/go/compress/lzw/reader_test.go
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package lzw
-
-import (
-	"bytes"
-	"io"
-	"io/ioutil"
-	"runtime"
-	"strconv"
-	"strings"
-	"testing"
-)
-
-type lzwTest struct {
-	desc       string
-	raw        string
-	compressed string
-	err        error
-}
-
-var lzwTests = []lzwTest{
-	{
-		"empty;LSB;8",
-		"",
-		"\x01\x01",
-		nil,
-	},
-	{
-		"empty;MSB;8",
-		"",
-		"\x80\x80",
-		nil,
-	},
-	{
-		"tobe;LSB;7",
-		"TOBEORNOTTOBEORTOBEORNOT",
-		"\x54\x4f\x42\x45\x4f\x52\x4e\x4f\x54\x82\x84\x86\x8b\x85\x87\x89\x81",
-		nil,
-	},
-	{
-		"tobe;LSB;8",
-		"TOBEORNOTTOBEORTOBEORNOT",
-		"\x54\x9e\x08\x29\xf2\x44\x8a\x93\x27\x54\x04\x12\x34\xb8\xb0\xe0\xc1\x84\x01\x01",
-		nil,
-	},
-	{
-		"tobe;MSB;7",
-		"TOBEORNOTTOBEORTOBEORNOT",
-		"\x54\x4f\x42\x45\x4f\x52\x4e\x4f\x54\x82\x84\x86\x8b\x85\x87\x89\x81",
-		nil,
-	},
-	{
-		"tobe;MSB;8",
-		"TOBEORNOTTOBEORTOBEORNOT",
-		"\x2a\x13\xc8\x44\x52\x79\x48\x9c\x4f\x2a\x40\xa0\x90\x68\x5c\x16\x0f\x09\x80\x80",
-		nil,
-	},
-	{
-		"tobe-truncated;LSB;8",
-		"TOBEORNOTTOBEORTOBEORNOT",
-		"\x54\x9e\x08\x29\xf2\x44\x8a\x93\x27\x54\x04",
-		io.ErrUnexpectedEOF,
-	},
-	// This example comes from http://en.wikipedia.org/wiki/Graphics_Interchange_Format.
-	{
-		"gif;LSB;8",
-		"\x28\xff\xff\xff\x28\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
-		"\x00\x51\xfc\x1b\x28\x70\xa0\xc1\x83\x01\x01",
-		nil,
-	},
-	// This example comes from http://compgroups.net/comp.lang.ruby/Decompressing-LZW-compression-from-PDF-file
-	{
-		"pdf;MSB;8",
-		"-----A---B",
-		"\x80\x0b\x60\x50\x22\x0c\x0c\x85\x01",
-		nil,
-	},
-}
-
-func TestReader(t *testing.T) {
-	var b bytes.Buffer
-	for _, tt := range lzwTests {
-		d := strings.Split(tt.desc, ";")
-		var order Order
-		switch d[1] {
-		case "LSB":
-			order = LSB
-		case "MSB":
-			order = MSB
-		default:
-			t.Errorf("%s: bad order %q", tt.desc, d[1])
-		}
-		litWidth, _ := strconv.Atoi(d[2])
-		rc := NewReader(strings.NewReader(tt.compressed), order, litWidth)
-		defer rc.Close()
-		b.Reset()
-		n, err := io.Copy(&b, rc)
-		s := b.String()
-		if err != nil {
-			if err != tt.err {
-				t.Errorf("%s: io.Copy: %v want %v", tt.desc, err, tt.err)
-			}
-			if err == io.ErrUnexpectedEOF {
-				// Even if the input is truncated, we should still return the
-				// partial decoded result.
-				if n == 0 || !strings.HasPrefix(tt.raw, s) {
-					t.Errorf("got %d bytes (%q), want a non-empty prefix of %q", n, s, tt.raw)
-				}
-			}
-			continue
-		}
-		if s != tt.raw {
-			t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.desc, n, s, len(tt.raw), tt.raw)
-		}
-	}
-}
-
-func benchmarkDecoder(b *testing.B, n int) {
-	b.StopTimer()
-	b.SetBytes(int64(n))
-	buf0, err := ioutil.ReadFile("../testdata/e.txt")
-	if err != nil {
-		b.Fatal(err)
-	}
-	if len(buf0) == 0 {
-		b.Fatalf("test file has no data")
-	}
-	compressed := new(bytes.Buffer)
-	w := NewWriter(compressed, LSB, 8)
-	for i := 0; i < n; i += len(buf0) {
-		if len(buf0) > n-i {
-			buf0 = buf0[:n-i]
-		}
-		w.Write(buf0)
-	}
-	w.Close()
-	buf1 := compressed.Bytes()
-	buf0, compressed, w = nil, nil, nil
-	runtime.GC()
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		io.Copy(ioutil.Discard, NewReader(bytes.NewReader(buf1), LSB, 8))
-	}
-}
-
-func BenchmarkDecoder1e4(b *testing.B) {
-	benchmarkDecoder(b, 1e4)
-}
-
-func BenchmarkDecoder1e5(b *testing.B) {
-	benchmarkDecoder(b, 1e5)
-}
-
-func BenchmarkDecoder1e6(b *testing.B) {
-	benchmarkDecoder(b, 1e6)
-}
diff --git a/third_party/gofrontend/libgo/go/compress/lzw/writer.go b/third_party/gofrontend/libgo/go/compress/lzw/writer.go
deleted file mode 100644
index 7367c29..0000000
--- a/third_party/gofrontend/libgo/go/compress/lzw/writer.go
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package lzw
-
-import (
-	"bufio"
-	"errors"
-	"fmt"
-	"io"
-)
-
-// A writer is a buffered, flushable writer.
-type writer interface {
-	io.ByteWriter
-	Flush() error
-}
-
-// An errWriteCloser is an io.WriteCloser that always returns a given error.
-type errWriteCloser struct {
-	err error
-}
-
-func (e *errWriteCloser) Write([]byte) (int, error) {
-	return 0, e.err
-}
-
-func (e *errWriteCloser) Close() error {
-	return e.err
-}
-
-const (
-	// A code is a 12 bit value, stored as a uint32 when encoding to avoid
-	// type conversions when shifting bits.
-	maxCode     = 1<<12 - 1
-	invalidCode = 1<<32 - 1
-	// There are 1<<12 possible codes, which is an upper bound on the number of
-	// valid hash table entries at any given point in time. tableSize is 4x that.
-	tableSize = 4 * 1 << 12
-	tableMask = tableSize - 1
-	// A hash table entry is a uint32. Zero is an invalid entry since the
-	// lower 12 bits of a valid entry must be a non-literal code.
-	invalidEntry = 0
-)
-
-// encoder is LZW compressor.
-type encoder struct {
-	// w is the writer that compressed bytes are written to.
-	w writer
-	// order, write, bits, nBits and width are the state for
-	// converting a code stream into a byte stream.
-	order Order
-	write func(*encoder, uint32) error
-	bits  uint32
-	nBits uint
-	width uint
-	// litWidth is the width in bits of literal codes.
-	litWidth uint
-	// hi is the code implied by the next code emission.
-	// overflow is the code at which hi overflows the code width.
-	hi, overflow uint32
-	// savedCode is the accumulated code at the end of the most recent Write
-	// call. It is equal to invalidCode if there was no such call.
-	savedCode uint32
-	// err is the first error encountered during writing. Closing the encoder
-	// will make any future Write calls return errClosed
-	err error
-	// table is the hash table from 20-bit keys to 12-bit values. Each table
-	// entry contains key<<12|val and collisions resolve by linear probing.
-	// The keys consist of a 12-bit code prefix and an 8-bit byte suffix.
-	// The values are a 12-bit code.
-	table [tableSize]uint32
-}
-
-// writeLSB writes the code c for "Least Significant Bits first" data.
-func (e *encoder) writeLSB(c uint32) error {
-	e.bits |= c << e.nBits
-	e.nBits += e.width
-	for e.nBits >= 8 {
-		if err := e.w.WriteByte(uint8(e.bits)); err != nil {
-			return err
-		}
-		e.bits >>= 8
-		e.nBits -= 8
-	}
-	return nil
-}
-
-// writeMSB writes the code c for "Most Significant Bits first" data.
-func (e *encoder) writeMSB(c uint32) error {
-	e.bits |= c << (32 - e.width - e.nBits)
-	e.nBits += e.width
-	for e.nBits >= 8 {
-		if err := e.w.WriteByte(uint8(e.bits >> 24)); err != nil {
-			return err
-		}
-		e.bits <<= 8
-		e.nBits -= 8
-	}
-	return nil
-}
-
-// errOutOfCodes is an internal error that means that the encoder has run out
-// of unused codes and a clear code needs to be sent next.
-var errOutOfCodes = errors.New("lzw: out of codes")
-
-// incHi increments e.hi and checks for both overflow and running out of
-// unused codes. In the latter case, incHi sends a clear code, resets the
-// encoder state and returns errOutOfCodes.
-func (e *encoder) incHi() error {
-	e.hi++
-	if e.hi == e.overflow {
-		e.width++
-		e.overflow <<= 1
-	}
-	if e.hi == maxCode {
-		clear := uint32(1) << e.litWidth
-		if err := e.write(e, clear); err != nil {
-			return err
-		}
-		e.width = uint(e.litWidth) + 1
-		e.hi = clear + 1
-		e.overflow = clear << 1
-		for i := range e.table {
-			e.table[i] = invalidEntry
-		}
-		return errOutOfCodes
-	}
-	return nil
-}
-
-// Write writes a compressed representation of p to e's underlying writer.
-func (e *encoder) Write(p []byte) (n int, err error) {
-	if e.err != nil {
-		return 0, e.err
-	}
-	if len(p) == 0 {
-		return 0, nil
-	}
-	if maxLit := uint8(1<<e.litWidth - 1); maxLit != 0xff {
-		for _, x := range p {
-			if x > maxLit {
-				e.err = errors.New("lzw: input byte too large for the litWidth")
-				return 0, e.err
-			}
-		}
-	}
-	n = len(p)
-	code := e.savedCode
-	if code == invalidCode {
-		// The first code sent is always a literal code.
-		code, p = uint32(p[0]), p[1:]
-	}
-loop:
-	for _, x := range p {
-		literal := uint32(x)
-		key := code<<8 | literal
-		// If there is a hash table hit for this key then we continue the loop
-		// and do not emit a code yet.
-		hash := (key>>12 ^ key) & tableMask
-		for h, t := hash, e.table[hash]; t != invalidEntry; {
-			if key == t>>12 {
-				code = t & maxCode
-				continue loop
-			}
-			h = (h + 1) & tableMask
-			t = e.table[h]
-		}
-		// Otherwise, write the current code, and literal becomes the start of
-		// the next emitted code.
-		if e.err = e.write(e, code); e.err != nil {
-			return 0, e.err
-		}
-		code = literal
-		// Increment e.hi, the next implied code. If we run out of codes, reset
-		// the encoder state (including clearing the hash table) and continue.
-		if err1 := e.incHi(); err1 != nil {
-			if err1 == errOutOfCodes {
-				continue
-			}
-			e.err = err1
-			return 0, e.err
-		}
-		// Otherwise, insert key -> e.hi into the map that e.table represents.
-		for {
-			if e.table[hash] == invalidEntry {
-				e.table[hash] = (key << 12) | e.hi
-				break
-			}
-			hash = (hash + 1) & tableMask
-		}
-	}
-	e.savedCode = code
-	return n, nil
-}
-
-// Close closes the encoder, flushing any pending output. It does not close or
-// flush e's underlying writer.
-func (e *encoder) Close() error {
-	if e.err != nil {
-		if e.err == errClosed {
-			return nil
-		}
-		return e.err
-	}
-	// Make any future calls to Write return errClosed.
-	e.err = errClosed
-	// Write the savedCode if valid.
-	if e.savedCode != invalidCode {
-		if err := e.write(e, e.savedCode); err != nil {
-			return err
-		}
-		if err := e.incHi(); err != nil && err != errOutOfCodes {
-			return err
-		}
-	}
-	// Write the eof code.
-	eof := uint32(1)<<e.litWidth + 1
-	if err := e.write(e, eof); err != nil {
-		return err
-	}
-	// Write the final bits.
-	if e.nBits > 0 {
-		if e.order == MSB {
-			e.bits >>= 24
-		}
-		if err := e.w.WriteByte(uint8(e.bits)); err != nil {
-			return err
-		}
-	}
-	return e.w.Flush()
-}
-
-// NewWriter creates a new io.WriteCloser.
-// Writes to the returned io.WriteCloser are compressed and written to w.
-// It is the caller's responsibility to call Close on the WriteCloser when
-// finished writing.
-// The number of bits to use for literal codes, litWidth, must be in the
-// range [2,8] and is typically 8. Input bytes must be less than 1<<litWidth.
-func NewWriter(w io.Writer, order Order, litWidth int) io.WriteCloser {
-	var write func(*encoder, uint32) error
-	switch order {
-	case LSB:
-		write = (*encoder).writeLSB
-	case MSB:
-		write = (*encoder).writeMSB
-	default:
-		return &errWriteCloser{errors.New("lzw: unknown order")}
-	}
-	if litWidth < 2 || 8 < litWidth {
-		return &errWriteCloser{fmt.Errorf("lzw: litWidth %d out of range", litWidth)}
-	}
-	bw, ok := w.(writer)
-	if !ok {
-		bw = bufio.NewWriter(w)
-	}
-	lw := uint(litWidth)
-	return &encoder{
-		w:         bw,
-		order:     order,
-		write:     write,
-		width:     1 + lw,
-		litWidth:  lw,
-		hi:        1<<lw + 1,
-		overflow:  1 << (lw + 1),
-		savedCode: invalidCode,
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/compress/lzw/writer_test.go b/third_party/gofrontend/libgo/go/compress/lzw/writer_test.go
deleted file mode 100644
index c20d058..0000000
--- a/third_party/gofrontend/libgo/go/compress/lzw/writer_test.go
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package lzw
-
-import (
-	"io"
-	"io/ioutil"
-	"os"
-	"runtime"
-	"testing"
-)
-
-var filenames = []string{
-	"../testdata/e.txt",
-	"../testdata/pi.txt",
-}
-
-// testFile tests that compressing and then decompressing the given file with
-// the given options yields equivalent bytes to the original file.
-func testFile(t *testing.T, fn string, order Order, litWidth int) {
-	// Read the file, as golden output.
-	golden, err := os.Open(fn)
-	if err != nil {
-		t.Errorf("%s (order=%d litWidth=%d): %v", fn, order, litWidth, err)
-		return
-	}
-	defer golden.Close()
-
-	// Read the file again, and push it through a pipe that compresses at the write end, and decompresses at the read end.
-	raw, err := os.Open(fn)
-	if err != nil {
-		t.Errorf("%s (order=%d litWidth=%d): %v", fn, order, litWidth, err)
-		return
-	}
-
-	piper, pipew := io.Pipe()
-	defer piper.Close()
-	go func() {
-		defer raw.Close()
-		defer pipew.Close()
-		lzww := NewWriter(pipew, order, litWidth)
-		defer lzww.Close()
-		var b [4096]byte
-		for {
-			n, err0 := raw.Read(b[:])
-			if err0 != nil && err0 != io.EOF {
-				t.Errorf("%s (order=%d litWidth=%d): %v", fn, order, litWidth, err0)
-				return
-			}
-			_, err1 := lzww.Write(b[:n])
-			if err1 != nil {
-				t.Errorf("%s (order=%d litWidth=%d): %v", fn, order, litWidth, err1)
-				return
-			}
-			if err0 == io.EOF {
-				break
-			}
-		}
-	}()
-	lzwr := NewReader(piper, order, litWidth)
-	defer lzwr.Close()
-
-	// Compare the two.
-	b0, err0 := ioutil.ReadAll(golden)
-	b1, err1 := ioutil.ReadAll(lzwr)
-	if err0 != nil {
-		t.Errorf("%s (order=%d litWidth=%d): %v", fn, order, litWidth, err0)
-		return
-	}
-	if err1 != nil {
-		t.Errorf("%s (order=%d litWidth=%d): %v", fn, order, litWidth, err1)
-		return
-	}
-	if len(b1) != len(b0) {
-		t.Errorf("%s (order=%d litWidth=%d): length mismatch %d != %d", fn, order, litWidth, len(b1), len(b0))
-		return
-	}
-	for i := 0; i < len(b0); i++ {
-		if b1[i] != b0[i] {
-			t.Errorf("%s (order=%d litWidth=%d): mismatch at %d, 0x%02x != 0x%02x\n", fn, order, litWidth, i, b1[i], b0[i])
-			return
-		}
-	}
-}
-
-func TestWriter(t *testing.T) {
-	for _, filename := range filenames {
-		for _, order := range [...]Order{LSB, MSB} {
-			// The test data "2.71828 etcetera" is ASCII text requiring at least 6 bits.
-			for _, litWidth := range [...]int{6, 7, 8} {
-				testFile(t, filename, order, litWidth)
-			}
-		}
-	}
-}
-
-func TestWriterReturnValues(t *testing.T) {
-	w := NewWriter(ioutil.Discard, LSB, 8)
-	n, err := w.Write([]byte("asdf"))
-	if n != 4 || err != nil {
-		t.Errorf("got %d, %v, want 4, nil", n, err)
-	}
-}
-
-func TestSmallLitWidth(t *testing.T) {
-	w := NewWriter(ioutil.Discard, LSB, 2)
-	if _, err := w.Write([]byte{0x03}); err != nil {
-		t.Fatalf("write a byte < 1<<2: %v", err)
-	}
-	if _, err := w.Write([]byte{0x04}); err == nil {
-		t.Fatal("write a byte >= 1<<2: got nil error, want non-nil")
-	}
-}
-
-func benchmarkEncoder(b *testing.B, n int) {
-	b.StopTimer()
-	b.SetBytes(int64(n))
-	buf0, err := ioutil.ReadFile("../testdata/e.txt")
-	if err != nil {
-		b.Fatal(err)
-	}
-	if len(buf0) == 0 {
-		b.Fatalf("test file has no data")
-	}
-	buf1 := make([]byte, n)
-	for i := 0; i < n; i += len(buf0) {
-		if len(buf0) > n-i {
-			buf0 = buf0[:n-i]
-		}
-		copy(buf1[i:], buf0)
-	}
-	buf0 = nil
-	runtime.GC()
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		w := NewWriter(ioutil.Discard, LSB, 8)
-		w.Write(buf1)
-		w.Close()
-	}
-}
-
-func BenchmarkEncoder1e4(b *testing.B) {
-	benchmarkEncoder(b, 1e4)
-}
-
-func BenchmarkEncoder1e5(b *testing.B) {
-	benchmarkEncoder(b, 1e5)
-}
-
-func BenchmarkEncoder1e6(b *testing.B) {
-	benchmarkEncoder(b, 1e6)
-}
diff --git a/third_party/gofrontend/libgo/go/compress/testdata/Mark.Twain-Tom.Sawyer.txt b/third_party/gofrontend/libgo/go/compress/testdata/Mark.Twain-Tom.Sawyer.txt
deleted file mode 100644
index c97da7e..0000000
--- a/third_party/gofrontend/libgo/go/compress/testdata/Mark.Twain-Tom.Sawyer.txt
+++ /dev/null
@@ -1,8858 +0,0 @@
-The Project Gutenberg EBook of The Adventures of Tom Sawyer, Complete
-by Mark Twain (Samuel Clemens)
-
-This eBook is for the use of anyone anywhere at no cost and with
-almost no restrictions whatsoever.  You may copy it, give it away or
-re-use it under the terms of the Project Gutenberg License included
-with this eBook or online at www.gutenberg.net
-
-
-Title: The Adventures of Tom Sawyer, Complete
-
-Author: Mark Twain (Samuel Clemens)
-
-Release Date: August 20, 2006 [EBook #74]
-[Last updated: May 3, 2011]
-
-Language: English
-
-
-*** START OF THIS PROJECT GUTENBERG EBOOK TOM SAWYER ***
-
-
-
-
-Produced by David Widger. The previous edition was updated by Jose
-Menendez.
-
-
-
-
-
-                   THE ADVENTURES OF TOM SAWYER
-                                BY
-                            MARK TWAIN
-                     (Samuel Langhorne Clemens)
-
-
-
-
-                           P R E F A C E
-
-MOST of the adventures recorded in this book really occurred; one or
-two were experiences of my own, the rest those of boys who were
-schoolmates of mine. Huck Finn is drawn from life; Tom Sawyer also, but
-not from an individual--he is a combination of the characteristics of
-three boys whom I knew, and therefore belongs to the composite order of
-architecture.
-
-The odd superstitions touched upon were all prevalent among children
-and slaves in the West at the period of this story--that is to say,
-thirty or forty years ago.
-
-Although my book is intended mainly for the entertainment of boys and
-girls, I hope it will not be shunned by men and women on that account,
-for part of my plan has been to try to pleasantly remind adults of what
-they once were themselves, and of how they felt and thought and talked,
-and what queer enterprises they sometimes engaged in.
-
-                                                            THE AUTHOR.
-
-HARTFORD, 1876.
-
-
-
-                          T O M   S A W Y E R
-
-
-
-CHAPTER I
-
-"TOM!"
-
-No answer.
-
-"TOM!"
-
-No answer.
-
-"What's gone with that boy,  I wonder? You TOM!"
-
-No answer.
-
-The old lady pulled her spectacles down and looked over them about the
-room; then she put them up and looked out under them. She seldom or
-never looked THROUGH them for so small a thing as a boy; they were her
-state pair, the pride of her heart, and were built for "style," not
-service--she could have seen through a pair of stove-lids just as well.
-She looked perplexed for a moment, and then said, not fiercely, but
-still loud enough for the furniture to hear:
-
-"Well, I lay if I get hold of you I'll--"
-
-She did not finish, for by this time she was bending down and punching
-under the bed with the broom, and so she needed breath to punctuate the
-punches with. She resurrected nothing but the cat.
-
-"I never did see the beat of that boy!"
-
-She went to the open door and stood in it and looked out among the
-tomato vines and "jimpson" weeds that constituted the garden. No Tom.
-So she lifted up her voice at an angle calculated for distance and
-shouted:
-
-"Y-o-u-u TOM!"
-
-There was a slight noise behind her and she turned just in time to
-seize a small boy by the slack of his roundabout and arrest his flight.
-
-"There! I might 'a' thought of that closet. What you been doing in
-there?"
-
-"Nothing."
-
-"Nothing! Look at your hands. And look at your mouth. What IS that
-truck?"
-
-"I don't know, aunt."
-
-"Well, I know. It's jam--that's what it is. Forty times I've said if
-you didn't let that jam alone I'd skin you. Hand me that switch."
-
-The switch hovered in the air--the peril was desperate--
-
-"My! Look behind you, aunt!"
-
-The old lady whirled round, and snatched her skirts out of danger. The
-lad fled on the instant, scrambled up the high board-fence, and
-disappeared over it.
-
-His aunt Polly stood surprised a moment, and then broke into a gentle
-laugh.
-
-"Hang the boy, can't I never learn anything? Ain't he played me tricks
-enough like that for me to be looking out for him by this time? But old
-fools is the biggest fools there is. Can't learn an old dog new tricks,
-as the saying is. But my goodness, he never plays them alike, two days,
-and how is a body to know what's coming? He 'pears to know just how
-long he can torment me before I get my dander up, and he knows if he
-can make out to put me off for a minute or make me laugh, it's all down
-again and I can't hit him a lick. I ain't doing my duty by that boy,
-and that's the Lord's truth, goodness knows. Spare the rod and spile
-the child, as the Good Book says. I'm a laying up sin and suffering for
-us both, I know. He's full of the Old Scratch, but laws-a-me! he's my
-own dead sister's boy, poor thing, and I ain't got the heart to lash
-him, somehow. Every time I let him off, my conscience does hurt me so,
-and every time I hit him my old heart most breaks. Well-a-well, man
-that is born of woman is of few days and full of trouble, as the
-Scripture says, and I reckon it's so. He'll play hookey this evening, *
-and [* Southwestern for "afternoon"] I'll just be obleeged to make him
-work, to-morrow, to punish him. It's mighty hard to make him work
-Saturdays, when all the boys is having holiday, but he hates work more
-than he hates anything else, and I've GOT to do some of my duty by him,
-or I'll be the ruination of the child."
-
-Tom did play hookey, and he had a very good time. He got back home
-barely in season to help Jim, the small colored boy, saw next-day's
-wood and split the kindlings before supper--at least he was there in
-time to tell his adventures to Jim while Jim did three-fourths of the
-work. Tom's younger brother (or rather half-brother) Sid was already
-through with his part of the work (picking up chips), for he was a
-quiet boy, and had no adventurous, troublesome ways.
-
-While Tom was eating his supper, and stealing sugar as opportunity
-offered, Aunt Polly asked him questions that were full of guile, and
-very deep--for she wanted to trap him into damaging revealments. Like
-many other simple-hearted souls, it was her pet vanity to believe she
-was endowed with a talent for dark and mysterious diplomacy, and she
-loved to contemplate her most transparent devices as marvels of low
-cunning. Said she:
-
-"Tom, it was middling warm in school, warn't it?"
-
-"Yes'm."
-
-"Powerful warm, warn't it?"
-
-"Yes'm."
-
-"Didn't you want to go in a-swimming, Tom?"
-
-A bit of a scare shot through Tom--a touch of uncomfortable suspicion.
-He searched Aunt Polly's face, but it told him nothing. So he said:
-
-"No'm--well, not very much."
-
-The old lady reached out her hand and felt Tom's shirt, and said:
-
-"But you ain't too warm now, though." And it flattered her to reflect
-that she had discovered that the shirt was dry without anybody knowing
-that that was what she had in her mind. But in spite of her, Tom knew
-where the wind lay, now. So he forestalled what might be the next move:
-
-"Some of us pumped on our heads--mine's damp yet. See?"
-
-Aunt Polly was vexed to think she had overlooked that bit of
-circumstantial evidence, and missed a trick. Then she had a new
-inspiration:
-
-"Tom, you didn't have to undo your shirt collar where I sewed it, to
-pump on your head, did you? Unbutton your jacket!"
-
-The trouble vanished out of Tom's face. He opened his jacket. His
-shirt collar was securely sewed.
-
-"Bother! Well, go 'long with you. I'd made sure you'd played hookey
-and been a-swimming. But I forgive ye, Tom. I reckon you're a kind of a
-singed cat, as the saying is--better'n you look. THIS time."
-
-She was half sorry her sagacity had miscarried, and half glad that Tom
-had stumbled into obedient conduct for once.
-
-But Sidney said:
-
-"Well, now, if I didn't think you sewed his collar with white thread,
-but it's black."
-
-"Why, I did sew it with white! Tom!"
-
-But Tom did not wait for the rest. As he went out at the door he said:
-
-"Siddy, I'll lick you for that."
-
-In a safe place Tom examined two large needles which were thrust into
-the lapels of his jacket, and had thread bound about them--one needle
-carried white thread and the other black. He said:
-
-"She'd never noticed if it hadn't been for Sid. Confound it! sometimes
-she sews it with white, and sometimes she sews it with black. I wish to
-geeminy she'd stick to one or t'other--I can't keep the run of 'em. But
-I bet you I'll lam Sid for that. I'll learn him!"
-
-He was not the Model Boy of the village. He knew the model boy very
-well though--and loathed him.
-
-Within two minutes, or even less, he had forgotten all his troubles.
-Not because his troubles were one whit less heavy and bitter to him
-than a man's are to a man, but because a new and powerful interest bore
-them down and drove them out of his mind for the time--just as men's
-misfortunes are forgotten in the excitement of new enterprises. This
-new interest was a valued novelty in whistling, which he had just
-acquired from a negro, and he was suffering to practise it undisturbed.
-It consisted in a peculiar bird-like turn, a sort of liquid warble,
-produced by touching the tongue to the roof of the mouth at short
-intervals in the midst of the music--the reader probably remembers how
-to do it, if he has ever been a boy. Diligence and attention soon gave
-him the knack of it, and he strode down the street with his mouth full
-of harmony and his soul full of gratitude. He felt much as an
-astronomer feels who has discovered a new planet--no doubt, as far as
-strong, deep, unalloyed pleasure is concerned, the advantage was with
-the boy, not the astronomer.
-
-The summer evenings were long. It was not dark, yet. Presently Tom
-checked his whistle. A stranger was before him--a boy a shade larger
-than himself. A new-comer of any age or either sex was an impressive
-curiosity in the poor little shabby village of St. Petersburg. This boy
-was well dressed, too--well dressed on a week-day. This was simply
-astounding. His cap was a dainty thing, his close-buttoned blue cloth
-roundabout was new and natty, and so were his pantaloons. He had shoes
-on--and it was only Friday. He even wore a necktie, a bright bit of
-ribbon. He had a citified air about him that ate into Tom's vitals. The
-more Tom stared at the splendid marvel, the higher he turned up his
-nose at his finery and the shabbier and shabbier his own outfit seemed
-to him to grow. Neither boy spoke. If one moved, the other moved--but
-only sidewise, in a circle; they kept face to face and eye to eye all
-the time. Finally Tom said:
-
-"I can lick you!"
-
-"I'd like to see you try it."
-
-"Well, I can do it."
-
-"No you can't, either."
-
-"Yes I can."
-
-"No you can't."
-
-"I can."
-
-"You can't."
-
-"Can!"
-
-"Can't!"
-
-An uncomfortable pause. Then Tom said:
-
-"What's your name?"
-
-"'Tisn't any of your business, maybe."
-
-"Well I 'low I'll MAKE it my business."
-
-"Well why don't you?"
-
-"If you say much, I will."
-
-"Much--much--MUCH. There now."
-
-"Oh, you think you're mighty smart, DON'T you? I could lick you with
-one hand tied behind me, if I wanted to."
-
-"Well why don't you DO it? You SAY you can do it."
-
-"Well I WILL, if you fool with me."
-
-"Oh yes--I've seen whole families in the same fix."
-
-"Smarty! You think you're SOME, now, DON'T you? Oh, what a hat!"
-
-"You can lump that hat if you don't like it. I dare you to knock it
-off--and anybody that'll take a dare will suck eggs."
-
-"You're a liar!"
-
-"You're another."
-
-"You're a fighting liar and dasn't take it up."
-
-"Aw--take a walk!"
-
-"Say--if you give me much more of your sass I'll take and bounce a
-rock off'n your head."
-
-"Oh, of COURSE you will."
-
-"Well I WILL."
-
-"Well why don't you DO it then? What do you keep SAYING you will for?
-Why don't you DO it? It's because you're afraid."
-
-"I AIN'T afraid."
-
-"You are."
-
-"I ain't."
-
-"You are."
-
-Another pause, and more eying and sidling around each other. Presently
-they were shoulder to shoulder. Tom said:
-
-"Get away from here!"
-
-"Go away yourself!"
-
-"I won't."
-
-"I won't either."
-
-So they stood, each with a foot placed at an angle as a brace, and
-both shoving with might and main, and glowering at each other with
-hate. But neither could get an advantage. After struggling till both
-were hot and flushed, each relaxed his strain with watchful caution,
-and Tom said:
-
-"You're a coward and a pup. I'll tell my big brother on you, and he
-can thrash you with his little finger, and I'll make him do it, too."
-
-"What do I care for your big brother? I've got a brother that's bigger
-than he is--and what's more, he can throw him over that fence, too."
-[Both brothers were imaginary.]
-
-"That's a lie."
-
-"YOUR saying so don't make it so."
-
-Tom drew a line in the dust with his big toe, and said:
-
-"I dare you to step over that, and I'll lick you till you can't stand
-up. Anybody that'll take a dare will steal sheep."
-
-The new boy stepped over promptly, and said:
-
-"Now you said you'd do it, now let's see you do it."
-
-"Don't you crowd me now; you better look out."
-
-"Well, you SAID you'd do it--why don't you do it?"
-
-"By jingo! for two cents I WILL do it."
-
-The new boy took two broad coppers out of his pocket and held them out
-with derision. Tom struck them to the ground. In an instant both boys
-were rolling and tumbling in the dirt, gripped together like cats; and
-for the space of a minute they tugged and tore at each other's hair and
-clothes, punched and scratched each other's nose, and covered
-themselves with dust and glory. Presently the confusion took form, and
-through the fog of battle Tom appeared, seated astride the new boy, and
-pounding him with his fists. "Holler 'nuff!" said he.
-
-The boy only struggled to free himself. He was crying--mainly from rage.
-
-"Holler 'nuff!"--and the pounding went on.
-
-At last the stranger got out a smothered "'Nuff!" and Tom let him up
-and said:
-
-"Now that'll learn you. Better look out who you're fooling with next
-time."
-
-The new boy went off brushing the dust from his clothes, sobbing,
-snuffling, and occasionally looking back and shaking his head and
-threatening what he would do to Tom the "next time he caught him out."
-To which Tom responded with jeers, and started off in high feather, and
-as soon as his back was turned the new boy snatched up a stone, threw
-it and hit him between the shoulders and then turned tail and ran like
-an antelope. Tom chased the traitor home, and thus found out where he
-lived. He then held a position at the gate for some time, daring the
-enemy to come outside, but the enemy only made faces at him through the
-window and declined. At last the enemy's mother appeared, and called
-Tom a bad, vicious, vulgar child, and ordered him away. So he went
-away; but he said he "'lowed" to "lay" for that boy.
-
-He got home pretty late that night, and when he climbed cautiously in
-at the window, he uncovered an ambuscade, in the person of his aunt;
-and when she saw the state his clothes were in her resolution to turn
-his Saturday holiday into captivity at hard labor became adamantine in
-its firmness.
-
-
-
-CHAPTER II
-
-SATURDAY morning was come, and all the summer world was bright and
-fresh, and brimming with life. There was a song in every heart; and if
-the heart was young the music issued at the lips. There was cheer in
-every face and a spring in every step. The locust-trees were in bloom
-and the fragrance of the blossoms filled the air. Cardiff Hill, beyond
-the village and above it, was green with vegetation and it lay just far
-enough away to seem a Delectable Land, dreamy, reposeful, and inviting.
-
-Tom appeared on the sidewalk with a bucket of whitewash and a
-long-handled brush. He surveyed the fence, and all gladness left him and
-a deep melancholy settled down upon his spirit. Thirty yards of board
-fence nine feet high. Life to him seemed hollow, and existence but a
-burden. Sighing, he dipped his brush and passed it along the topmost
-plank; repeated the operation; did it again; compared the insignificant
-whitewashed streak with the far-reaching continent of unwhitewashed
-fence, and sat down on a tree-box discouraged. Jim came skipping out at
-the gate with a tin pail, and singing Buffalo Gals. Bringing water from
-the town pump had always been hateful work in Tom's eyes, before, but
-now it did not strike him so. He remembered that there was company at
-the pump. White, mulatto, and negro boys and girls were always there
-waiting their turns, resting, trading playthings, quarrelling,
-fighting, skylarking. And he remembered that although the pump was only
-a hundred and fifty yards off, Jim never got back with a bucket of
-water under an hour--and even then somebody generally had to go after
-him. Tom said:
-
-"Say, Jim, I'll fetch the water if you'll whitewash some."
-
-Jim shook his head and said:
-
-"Can't, Mars Tom. Ole missis, she tole me I got to go an' git dis
-water an' not stop foolin' roun' wid anybody. She say she spec' Mars
-Tom gwine to ax me to whitewash, an' so she tole me go 'long an' 'tend
-to my own business--she 'lowed SHE'D 'tend to de whitewashin'."
-
-"Oh, never you mind what she said, Jim. That's the way she always
-talks. Gimme the bucket--I won't be gone only a a minute. SHE won't
-ever know."
-
-"Oh, I dasn't, Mars Tom. Ole missis she'd take an' tar de head off'n
-me. 'Deed she would."
-
-"SHE! She never licks anybody--whacks 'em over the head with her
-thimble--and who cares for that, I'd like to know. She talks awful, but
-talk don't hurt--anyways it don't if she don't cry. Jim, I'll give you
-a marvel. I'll give you a white alley!"
-
-Jim began to waver.
-
-"White alley, Jim! And it's a bully taw."
-
-"My! Dat's a mighty gay marvel, I tell you! But Mars Tom I's powerful
-'fraid ole missis--"
-
-"And besides, if you will I'll show you my sore toe."
-
-Jim was only human--this attraction was too much for him. He put down
-his pail, took the white alley, and bent over the toe with absorbing
-interest while the bandage was being unwound. In another moment he was
-flying down the street with his pail and a tingling rear, Tom was
-whitewashing with vigor, and Aunt Polly was retiring from the field
-with a slipper in her hand and triumph in her eye.
-
-But Tom's energy did not last. He began to think of the fun he had
-planned for this day, and his sorrows multiplied. Soon the free boys
-would come tripping along on all sorts of delicious expeditions, and
-they would make a world of fun of him for having to work--the very
-thought of it burnt him like fire. He got out his worldly wealth and
-examined it--bits of toys, marbles, and trash; enough to buy an
-exchange of WORK, maybe, but not half enough to buy so much as half an
-hour of pure freedom. So he returned his straitened means to his
-pocket, and gave up the idea of trying to buy the boys. At this dark
-and hopeless moment an inspiration burst upon him! Nothing less than a
-great, magnificent inspiration.
-
-He took up his brush and went tranquilly to work. Ben Rogers hove in
-sight presently--the very boy, of all boys, whose ridicule he had been
-dreading. Ben's gait was the hop-skip-and-jump--proof enough that his
-heart was light and his anticipations high. He was eating an apple, and
-giving a long, melodious whoop, at intervals, followed by a deep-toned
-ding-dong-dong, ding-dong-dong, for he was personating a steamboat. As
-he drew near, he slackened speed, took the middle of the street, leaned
-far over to starboard and rounded to ponderously and with laborious
-pomp and circumstance--for he was personating the Big Missouri, and
-considered himself to be drawing nine feet of water. He was boat and
-captain and engine-bells combined, so he had to imagine himself
-standing on his own hurricane-deck giving the orders and executing them:
-
-"Stop her, sir! Ting-a-ling-ling!" The headway ran almost out, and he
-drew up slowly toward the sidewalk.
-
-"Ship up to back! Ting-a-ling-ling!" His arms straightened and
-stiffened down his sides.
-
-"Set her back on the stabboard! Ting-a-ling-ling! Chow! ch-chow-wow!
-Chow!" His right hand, meantime, describing stately circles--for it was
-representing a forty-foot wheel.
-
-"Let her go back on the labboard! Ting-a-lingling! Chow-ch-chow-chow!"
-The left hand began to describe circles.
-
-"Stop the stabboard! Ting-a-ling-ling! Stop the labboard! Come ahead
-on the stabboard! Stop her! Let your outside turn over slow!
-Ting-a-ling-ling! Chow-ow-ow! Get out that head-line! LIVELY now!
-Come--out with your spring-line--what're you about there! Take a turn
-round that stump with the bight of it! Stand by that stage, now--let her
-go! Done with the engines, sir! Ting-a-ling-ling! SH'T! S'H'T! SH'T!"
-(trying the gauge-cocks).
-
-Tom went on whitewashing--paid no attention to the steamboat. Ben
-stared a moment and then said: "Hi-YI! YOU'RE up a stump, ain't you!"
-
-No answer. Tom surveyed his last touch with the eye of an artist, then
-he gave his brush another gentle sweep and surveyed the result, as
-before. Ben ranged up alongside of him. Tom's mouth watered for the
-apple, but he stuck to his work. Ben said:
-
-"Hello, old chap, you got to work, hey?"
-
-Tom wheeled suddenly and said:
-
-"Why, it's you, Ben! I warn't noticing."
-
-"Say--I'm going in a-swimming, I am. Don't you wish you could? But of
-course you'd druther WORK--wouldn't you? Course you would!"
-
-Tom contemplated the boy a bit, and said:
-
-"What do you call work?"
-
-"Why, ain't THAT work?"
-
-Tom resumed his whitewashing, and answered carelessly:
-
-"Well, maybe it is, and maybe it ain't. All I know, is, it suits Tom
-Sawyer."
-
-"Oh come, now, you don't mean to let on that you LIKE it?"
-
-The brush continued to move.
-
-"Like it? Well, I don't see why I oughtn't to like it. Does a boy get
-a chance to whitewash a fence every day?"
-
-That put the thing in a new light. Ben stopped nibbling his apple. Tom
-swept his brush daintily back and forth--stepped back to note the
-effect--added a touch here and there--criticised the effect again--Ben
-watching every move and getting more and more interested, more and more
-absorbed. Presently he said:
-
-"Say, Tom, let ME whitewash a little."
-
-Tom considered, was about to consent; but he altered his mind:
-
-"No--no--I reckon it wouldn't hardly do, Ben. You see, Aunt Polly's
-awful particular about this fence--right here on the street, you know
---but if it was the back fence I wouldn't mind and SHE wouldn't. Yes,
-she's awful particular about this fence; it's got to be done very
-careful; I reckon there ain't one boy in a thousand, maybe two
-thousand, that can do it the way it's got to be done."
-
-"No--is that so? Oh come, now--lemme just try. Only just a little--I'd
-let YOU, if you was me, Tom."
-
-"Ben, I'd like to, honest injun; but Aunt Polly--well, Jim wanted to
-do it, but she wouldn't let him; Sid wanted to do it, and she wouldn't
-let Sid. Now don't you see how I'm fixed? If you was to tackle this
-fence and anything was to happen to it--"
-
-"Oh, shucks, I'll be just as careful. Now lemme try. Say--I'll give
-you the core of my apple."
-
-"Well, here--No, Ben, now don't. I'm afeard--"
-
-"I'll give you ALL of it!"
-
-Tom gave up the brush with reluctance in his face, but alacrity in his
-heart. And while the late steamer Big Missouri worked and sweated in
-the sun, the retired artist sat on a barrel in the shade close by,
-dangled his legs, munched his apple, and planned the slaughter of more
-innocents. There was no lack of material; boys happened along every
-little while; they came to jeer, but remained to whitewash. By the time
-Ben was fagged out, Tom had traded the next chance to Billy Fisher for
-a kite, in good repair; and when he played out, Johnny Miller bought in
-for a dead rat and a string to swing it with--and so on, and so on,
-hour after hour. And when the middle of the afternoon came, from being
-a poor poverty-stricken boy in the morning, Tom was literally rolling
-in wealth. He had besides the things before mentioned, twelve marbles,
-part of a jews-harp, a piece of blue bottle-glass to look through, a
-spool cannon, a key that wouldn't unlock anything, a fragment of chalk,
-a glass stopper of a decanter, a tin soldier, a couple of tadpoles, six
-fire-crackers, a kitten with only one eye, a brass doorknob, a
-dog-collar--but no dog--the handle of a knife, four pieces of
-orange-peel, and a dilapidated old window sash.
-
-He had had a nice, good, idle time all the while--plenty of company
---and the fence had three coats of whitewash on it! If he hadn't run out
-of whitewash he would have bankrupted every boy in the village.
-
-Tom said to himself that it was not such a hollow world, after all. He
-had discovered a great law of human action, without knowing it--namely,
-that in order to make a man or a boy covet a thing, it is only
-necessary to make the thing difficult to attain. If he had been a great
-and wise philosopher, like the writer of this book, he would now have
-comprehended that Work consists of whatever a body is OBLIGED to do,
-and that Play consists of whatever a body is not obliged to do. And
-this would help him to understand why constructing artificial flowers
-or performing on a tread-mill is work, while rolling ten-pins or
-climbing Mont Blanc is only amusement. There are wealthy gentlemen in
-England who drive four-horse passenger-coaches twenty or thirty miles
-on a daily line, in the summer, because the privilege costs them
-considerable money; but if they were offered wages for the service,
-that would turn it into work and then they would resign.
-
-The boy mused awhile over the substantial change which had taken place
-in his worldly circumstances, and then wended toward headquarters to
-report.
-
-
-
-CHAPTER III
-
-TOM presented himself before Aunt Polly, who was sitting by an open
-window in a pleasant rearward apartment, which was bedroom,
-breakfast-room, dining-room, and library, combined. The balmy summer
-air, the restful quiet, the odor of the flowers, and the drowsing murmur
-of the bees had had their effect, and she was nodding over her knitting
---for she had no company but the cat, and it was asleep in her lap. Her
-spectacles were propped up on her gray head for safety. She had thought
-that of course Tom had deserted long ago, and she wondered at seeing him
-place himself in her power again in this intrepid way. He said: "Mayn't
-I go and play now, aunt?"
-
-"What, a'ready? How much have you done?"
-
-"It's all done, aunt."
-
-"Tom, don't lie to me--I can't bear it."
-
-"I ain't, aunt; it IS all done."
-
-Aunt Polly placed small trust in such evidence. She went out to see
-for herself; and she would have been content to find twenty per cent.
-of Tom's statement true. When she found the entire fence whitewashed,
-and not only whitewashed but elaborately coated and recoated, and even
-a streak added to the ground, her astonishment was almost unspeakable.
-She said:
-
-"Well, I never! There's no getting round it, you can work when you're
-a mind to, Tom." And then she diluted the compliment by adding, "But
-it's powerful seldom you're a mind to, I'm bound to say. Well, go 'long
-and play; but mind you get back some time in a week, or I'll tan you."
-
-She was so overcome by the splendor of his achievement that she took
-him into the closet and selected a choice apple and delivered it to
-him, along with an improving lecture upon the added value and flavor a
-treat took to itself when it came without sin through virtuous effort.
-And while she closed with a happy Scriptural flourish, he "hooked" a
-doughnut.
-
-Then he skipped out, and saw Sid just starting up the outside stairway
-that led to the back rooms on the second floor. Clods were handy and
-the air was full of them in a twinkling. They raged around Sid like a
-hail-storm; and before Aunt Polly could collect her surprised faculties
-and sally to the rescue, six or seven clods had taken personal effect,
-and Tom was over the fence and gone. There was a gate, but as a general
-thing he was too crowded for time to make use of it. His soul was at
-peace, now that he had settled with Sid for calling attention to his
-black thread and getting him into trouble.
-
-Tom skirted the block, and came round into a muddy alley that led by
-the back of his aunt's cow-stable. He presently got safely beyond the
-reach of capture and punishment, and hastened toward the public square
-of the village, where two "military" companies of boys had met for
-conflict, according to previous appointment. Tom was General of one of
-these armies, Joe Harper (a bosom friend) General of the other. These
-two great commanders did not condescend to fight in person--that being
-better suited to the still smaller fry--but sat together on an eminence
-and conducted the field operations by orders delivered through
-aides-de-camp. Tom's army won a great victory, after a long and
-hard-fought battle. Then the dead were counted, prisoners exchanged,
-the terms of the next disagreement agreed upon, and the day for the
-necessary battle appointed; after which the armies fell into line and
-marched away, and Tom turned homeward alone.
-
-As he was passing by the house where Jeff Thatcher lived, he saw a new
-girl in the garden--a lovely little blue-eyed creature with yellow hair
-plaited into two long-tails, white summer frock and embroidered
-pantalettes. The fresh-crowned hero fell without firing a shot. A
-certain Amy Lawrence vanished out of his heart and left not even a
-memory of herself behind. He had thought he loved her to distraction;
-he had regarded his passion as adoration; and behold it was only a poor
-little evanescent partiality. He had been months winning her; she had
-confessed hardly a week ago; he had been the happiest and the proudest
-boy in the world only seven short days, and here in one instant of time
-she had gone out of his heart like a casual stranger whose visit is
-done.
-
-He worshipped this new angel with furtive eye, till he saw that she
-had discovered him; then he pretended he did not know she was present,
-and began to "show off" in all sorts of absurd boyish ways, in order to
-win her admiration. He kept up this grotesque foolishness for some
-time; but by-and-by, while he was in the midst of some dangerous
-gymnastic performances, he glanced aside and saw that the little girl
-was wending her way toward the house. Tom came up to the fence and
-leaned on it, grieving, and hoping she would tarry yet awhile longer.
-She halted a moment on the steps and then moved toward the door. Tom
-heaved a great sigh as she put her foot on the threshold. But his face
-lit up, right away, for she tossed a pansy over the fence a moment
-before she disappeared.
-
-The boy ran around and stopped within a foot or two of the flower, and
-then shaded his eyes with his hand and began to look down street as if
-he had discovered something of interest going on in that direction.
-Presently he picked up a straw and began trying to balance it on his
-nose, with his head tilted far back; and as he moved from side to side,
-in his efforts, he edged nearer and nearer toward the pansy; finally
-his bare foot rested upon it, his pliant toes closed upon it, and he
-hopped away with the treasure and disappeared round the corner. But
-only for a minute--only while he could button the flower inside his
-jacket, next his heart--or next his stomach, possibly, for he was not
-much posted in anatomy, and not hypercritical, anyway.
-
-He returned, now, and hung about the fence till nightfall, "showing
-off," as before; but the girl never exhibited herself again, though Tom
-comforted himself a little with the hope that she had been near some
-window, meantime, and been aware of his attentions. Finally he strode
-home reluctantly, with his poor head full of visions.
-
-All through supper his spirits were so high that his aunt wondered
-"what had got into the child." He took a good scolding about clodding
-Sid, and did not seem to mind it in the least. He tried to steal sugar
-under his aunt's very nose, and got his knuckles rapped for it. He said:
-
-"Aunt, you don't whack Sid when he takes it."
-
-"Well, Sid don't torment a body the way you do. You'd be always into
-that sugar if I warn't watching you."
-
-Presently she stepped into the kitchen, and Sid, happy in his
-immunity, reached for the sugar-bowl--a sort of glorying over Tom which
-was wellnigh unbearable. But Sid's fingers slipped and the bowl dropped
-and broke. Tom was in ecstasies. In such ecstasies that he even
-controlled his tongue and was silent. He said to himself that he would
-not speak a word, even when his aunt came in, but would sit perfectly
-still till she asked who did the mischief; and then he would tell, and
-there would be nothing so good in the world as to see that pet model
-"catch it." He was so brimful of exultation that he could hardly hold
-himself when the old lady came back and stood above the wreck
-discharging lightnings of wrath from over her spectacles. He said to
-himself, "Now it's coming!" And the next instant he was sprawling on
-the floor! The potent palm was uplifted to strike again when Tom cried
-out:
-
-"Hold on, now, what 'er you belting ME for?--Sid broke it!"
-
-Aunt Polly paused, perplexed, and Tom looked for healing pity. But
-when she got her tongue again, she only said:
-
-"Umf! Well, you didn't get a lick amiss, I reckon. You been into some
-other audacious mischief when I wasn't around, like enough."
-
-Then her conscience reproached her, and she yearned to say something
-kind and loving; but she judged that this would be construed into a
-confession that she had been in the wrong, and discipline forbade that.
-So she kept silence, and went about her affairs with a troubled heart.
-Tom sulked in a corner and exalted his woes. He knew that in her heart
-his aunt was on her knees to him, and he was morosely gratified by the
-consciousness of it. He would hang out no signals, he would take notice
-of none. He knew that a yearning glance fell upon him, now and then,
-through a film of tears, but he refused recognition of it. He pictured
-himself lying sick unto death and his aunt bending over him beseeching
-one little forgiving word, but he would turn his face to the wall, and
-die with that word unsaid. Ah, how would she feel then? And he pictured
-himself brought home from the river, dead, with his curls all wet, and
-his sore heart at rest. How she would throw herself upon him, and how
-her tears would fall like rain, and her lips pray God to give her back
-her boy and she would never, never abuse him any more! But he would lie
-there cold and white and make no sign--a poor little sufferer, whose
-griefs were at an end. He so worked upon his feelings with the pathos
-of these dreams, that he had to keep swallowing, he was so like to
-choke; and his eyes swam in a blur of water, which overflowed when he
-winked, and ran down and trickled from the end of his nose. And such a
-luxury to him was this petting of his sorrows, that he could not bear
-to have any worldly cheeriness or any grating delight intrude upon it;
-it was too sacred for such contact; and so, presently, when his cousin
-Mary danced in, all alive with the joy of seeing home again after an
-age-long visit of one week to the country, he got up and moved in
-clouds and darkness out at one door as she brought song and sunshine in
-at the other.
-
-He wandered far from the accustomed haunts of boys, and sought
-desolate places that were in harmony with his spirit. A log raft in the
-river invited him, and he seated himself on its outer edge and
-contemplated the dreary vastness of the stream, wishing, the while,
-that he could only be drowned, all at once and unconsciously, without
-undergoing the uncomfortable routine devised by nature. Then he thought
-of his flower. He got it out, rumpled and wilted, and it mightily
-increased his dismal felicity. He wondered if she would pity him if she
-knew? Would she cry, and wish that she had a right to put her arms
-around his neck and comfort him? Or would she turn coldly away like all
-the hollow world? This picture brought such an agony of pleasurable
-suffering that he worked it over and over again in his mind and set it
-up in new and varied lights, till he wore it threadbare. At last he
-rose up sighing and departed in the darkness.
-
-About half-past nine or ten o'clock he came along the deserted street
-to where the Adored Unknown lived; he paused a moment; no sound fell
-upon his listening ear; a candle was casting a dull glow upon the
-curtain of a second-story window. Was the sacred presence there? He
-climbed the fence, threaded his stealthy way through the plants, till
-he stood under that window; he looked up at it long, and with emotion;
-then he laid him down on the ground under it, disposing himself upon
-his back, with his hands clasped upon his breast and holding his poor
-wilted flower. And thus he would die--out in the cold world, with no
-shelter over his homeless head, no friendly hand to wipe the
-death-damps from his brow, no loving face to bend pityingly over him
-when the great agony came. And thus SHE would see him when she looked
-out upon the glad morning, and oh! would she drop one little tear upon
-his poor, lifeless form, would she heave one little sigh to see a bright
-young life so rudely blighted, so untimely cut down?
-
-The window went up, a maid-servant's discordant voice profaned the
-holy calm, and a deluge of water drenched the prone martyr's remains!
-
-The strangling hero sprang up with a relieving snort. There was a whiz
-as of a missile in the air, mingled with the murmur of a curse, a sound
-as of shivering glass followed, and a small, vague form went over the
-fence and shot away in the gloom.
-
-Not long after, as Tom, all undressed for bed, was surveying his
-drenched garments by the light of a tallow dip, Sid woke up; but if he
-had any dim idea of making any "references to allusions," he thought
-better of it and held his peace, for there was danger in Tom's eye.
-
-Tom turned in without the added vexation of prayers, and Sid made
-mental note of the omission.
-
-
-
-CHAPTER IV
-
-THE sun rose upon a tranquil world, and beamed down upon the peaceful
-village like a benediction. Breakfast over, Aunt Polly had family
-worship: it began with a prayer built from the ground up of solid
-courses of Scriptural quotations, welded together with a thin mortar of
-originality; and from the summit of this she delivered a grim chapter
-of the Mosaic Law, as from Sinai.
-
-Then Tom girded up his loins, so to speak, and went to work to "get
-his verses." Sid had learned his lesson days before. Tom bent all his
-energies to the memorizing of five verses, and he chose part of the
-Sermon on the Mount, because he could find no verses that were shorter.
-At the end of half an hour Tom had a vague general idea of his lesson,
-but no more, for his mind was traversing the whole field of human
-thought, and his hands were busy with distracting recreations. Mary
-took his book to hear him recite, and he tried to find his way through
-the fog:
-
-"Blessed are the--a--a--"
-
-"Poor"--
-
-"Yes--poor; blessed are the poor--a--a--"
-
-"In spirit--"
-
-"In spirit; blessed are the poor in spirit, for they--they--"
-
-"THEIRS--"
-
-"For THEIRS. Blessed are the poor in spirit, for theirs is the kingdom
-of heaven. Blessed are they that mourn, for they--they--"
-
-"Sh--"
-
-"For they--a--"
-
-"S, H, A--"
-
-"For they S, H--Oh, I don't know what it is!"
-
-"SHALL!"
-
-"Oh, SHALL! for they shall--for they shall--a--a--shall mourn--a--a--
-blessed are they that shall--they that--a--they that shall mourn, for
-they shall--a--shall WHAT? Why don't you tell me, Mary?--what do you
-want to be so mean for?"
-
-"Oh, Tom, you poor thick-headed thing, I'm not teasing you. I wouldn't
-do that. You must go and learn it again. Don't you be discouraged, Tom,
-you'll manage it--and if you do, I'll give you something ever so nice.
-There, now, that's a good boy."
-
-"All right! What is it, Mary, tell me what it is."
-
-"Never you mind, Tom. You know if I say it's nice, it is nice."
-
-"You bet you that's so, Mary. All right, I'll tackle it again."
-
-And he did "tackle it again"--and under the double pressure of
-curiosity and prospective gain he did it with such spirit that he
-accomplished a shining success. Mary gave him a brand-new "Barlow"
-knife worth twelve and a half cents; and the convulsion of delight that
-swept his system shook him to his foundations. True, the knife would
-not cut anything, but it was a "sure-enough" Barlow, and there was
-inconceivable grandeur in that--though where the Western boys ever got
-the idea that such a weapon could possibly be counterfeited to its
-injury is an imposing mystery and will always remain so, perhaps. Tom
-contrived to scarify the cupboard with it, and was arranging to begin
-on the bureau, when he was called off to dress for Sunday-school.
-
-Mary gave him a tin basin of water and a piece of soap, and he went
-outside the door and set the basin on a little bench there; then he
-dipped the soap in the water and laid it down; turned up his sleeves;
-poured out the water on the ground, gently, and then entered the
-kitchen and began to wipe his face diligently on the towel behind the
-door. But Mary removed the towel and said:
-
-"Now ain't you ashamed, Tom. You mustn't be so bad. Water won't hurt
-you."
-
-Tom was a trifle disconcerted. The basin was refilled, and this time
-he stood over it a little while, gathering resolution; took in a big
-breath and began. When he entered the kitchen presently, with both eyes
-shut and groping for the towel with his hands, an honorable testimony
-of suds and water was dripping from his face. But when he emerged from
-the towel, he was not yet satisfactory, for the clean territory stopped
-short at his chin and his jaws, like a mask; below and beyond this line
-there was a dark expanse of unirrigated soil that spread downward in
-front and backward around his neck. Mary took him in hand, and when she
-was done with him he was a man and a brother, without distinction of
-color, and his saturated hair was neatly brushed, and its short curls
-wrought into a dainty and symmetrical general effect. [He privately
-smoothed out the curls, with labor and difficulty, and plastered his
-hair close down to his head; for he held curls to be effeminate, and
-his own filled his life with bitterness.] Then Mary got out a suit of
-his clothing that had been used only on Sundays during two years--they
-were simply called his "other clothes"--and so by that we know the
-size of his wardrobe. The girl "put him to rights" after he had dressed
-himself; she buttoned his neat roundabout up to his chin, turned his
-vast shirt collar down over his shoulders, brushed him off and crowned
-him with his speckled straw hat. He now looked exceedingly improved and
-uncomfortable. He was fully as uncomfortable as he looked; for there
-was a restraint about whole clothes and cleanliness that galled him. He
-hoped that Mary would forget his shoes, but the hope was blighted; she
-coated them thoroughly with tallow, as was the custom, and brought them
-out. He lost his temper and said he was always being made to do
-everything he didn't want to do. But Mary said, persuasively:
-
-"Please, Tom--that's a good boy."
-
-So he got into the shoes snarling. Mary was soon ready, and the three
-children set out for Sunday-school--a place that Tom hated with his
-whole heart; but Sid and Mary were fond of it.
-
-Sabbath-school hours were from nine to half-past ten; and then church
-service. Two of the children always remained for the sermon
-voluntarily, and the other always remained too--for stronger reasons.
-The church's high-backed, uncushioned pews would seat about three
-hundred persons; the edifice was but a small, plain affair, with a sort
-of pine board tree-box on top of it for a steeple. At the door Tom
-dropped back a step and accosted a Sunday-dressed comrade:
-
-"Say, Billy, got a yaller ticket?"
-
-"Yes."
-
-"What'll you take for her?"
-
-"What'll you give?"
-
-"Piece of lickrish and a fish-hook."
-
-"Less see 'em."
-
-Tom exhibited. They were satisfactory, and the property changed hands.
-Then Tom traded a couple of white alleys for three red tickets, and
-some small trifle or other for a couple of blue ones. He waylaid other
-boys as they came, and went on buying tickets of various colors ten or
-fifteen minutes longer. He entered the church, now, with a swarm of
-clean and noisy boys and girls, proceeded to his seat and started a
-quarrel with the first boy that came handy. The teacher, a grave,
-elderly man, interfered; then turned his back a moment and Tom pulled a
-boy's hair in the next bench, and was absorbed in his book when the boy
-turned around; stuck a pin in another boy, presently, in order to hear
-him say "Ouch!" and got a new reprimand from his teacher. Tom's whole
-class were of a pattern--restless, noisy, and troublesome. When they
-came to recite their lessons, not one of them knew his verses
-perfectly, but had to be prompted all along. However, they worried
-through, and each got his reward--in small blue tickets, each with a
-passage of Scripture on it; each blue ticket was pay for two verses of
-the recitation. Ten blue tickets equalled a red one, and could be
-exchanged for it; ten red tickets equalled a yellow one; for ten yellow
-tickets the superintendent gave a very plainly bound Bible (worth forty
-cents in those easy times) to the pupil. How many of my readers would
-have the industry and application to memorize two thousand verses, even
-for a Dore Bible? And yet Mary had acquired two Bibles in this way--it
-was the patient work of two years--and a boy of German parentage had
-won four or five. He once recited three thousand verses without
-stopping; but the strain upon his mental faculties was too great, and
-he was little better than an idiot from that day forth--a grievous
-misfortune for the school, for on great occasions, before company, the
-superintendent (as Tom expressed it) had always made this boy come out
-and "spread himself." Only the older pupils managed to keep their
-tickets and stick to their tedious work long enough to get a Bible, and
-so the delivery of one of these prizes was a rare and noteworthy
-circumstance; the successful pupil was so great and conspicuous for
-that day that on the spot every scholar's heart was fired with a fresh
-ambition that often lasted a couple of weeks. It is possible that Tom's
-mental stomach had never really hungered for one of those prizes, but
-unquestionably his entire being had for many a day longed for the glory
-and the eclat that came with it.
-
-In due course the superintendent stood up in front of the pulpit, with
-a closed hymn-book in his hand and his forefinger inserted between its
-leaves, and commanded attention. When a Sunday-school superintendent
-makes his customary little speech, a hymn-book in the hand is as
-necessary as is the inevitable sheet of music in the hand of a singer
-who stands forward on the platform and sings a solo at a concert
---though why, is a mystery: for neither the hymn-book nor the sheet of
-music is ever referred to by the sufferer. This superintendent was a
-slim creature of thirty-five, with a sandy goatee and short sandy hair;
-he wore a stiff standing-collar whose upper edge almost reached his
-ears and whose sharp points curved forward abreast the corners of his
-mouth--a fence that compelled a straight lookout ahead, and a turning
-of the whole body when a side view was required; his chin was propped
-on a spreading cravat which was as broad and as long as a bank-note,
-and had fringed ends; his boot toes were turned sharply up, in the
-fashion of the day, like sleigh-runners--an effect patiently and
-laboriously produced by the young men by sitting with their toes
-pressed against a wall for hours together. Mr. Walters was very earnest
-of mien, and very sincere and honest at heart; and he held sacred
-things and places in such reverence, and so separated them from worldly
-matters, that unconsciously to himself his Sunday-school voice had
-acquired a peculiar intonation which was wholly absent on week-days. He
-began after this fashion:
-
-"Now, children, I want you all to sit up just as straight and pretty
-as you can and give me all your attention for a minute or two. There
---that is it. That is the way good little boys and girls should do. I see
-one little girl who is looking out of the window--I am afraid she
-thinks I am out there somewhere--perhaps up in one of the trees making
-a speech to the little birds. [Applausive titter.] I want to tell you
-how good it makes me feel to see so many bright, clean little faces
-assembled in a place like this, learning to do right and be good." And
-so forth and so on. It is not necessary to set down the rest of the
-oration. It was of a pattern which does not vary, and so it is familiar
-to us all.
-
-The latter third of the speech was marred by the resumption of fights
-and other recreations among certain of the bad boys, and by fidgetings
-and whisperings that extended far and wide, washing even to the bases
-of isolated and incorruptible rocks like Sid and Mary. But now every
-sound ceased suddenly, with the subsidence of Mr. Walters' voice, and
-the conclusion of the speech was received with a burst of silent
-gratitude.
-
-A good part of the whispering had been occasioned by an event which
-was more or less rare--the entrance of visitors: lawyer Thatcher,
-accompanied by a very feeble and aged man; a fine, portly, middle-aged
-gentleman with iron-gray hair; and a dignified lady who was doubtless
-the latter's wife. The lady was leading a child. Tom had been restless
-and full of chafings and repinings; conscience-smitten, too--he could
-not meet Amy Lawrence's eye, he could not brook her loving gaze. But
-when he saw this small new-comer his soul was all ablaze with bliss in
-a moment. The next moment he was "showing off" with all his might
---cuffing boys, pulling hair, making faces--in a word, using every art
-that seemed likely to fascinate a girl and win her applause. His
-exaltation had but one alloy--the memory of his humiliation in this
-angel's garden--and that record in sand was fast washing out, under
-the waves of happiness that were sweeping over it now.
-
-The visitors were given the highest seat of honor, and as soon as Mr.
-Walters' speech was finished, he introduced them to the school. The
-middle-aged man turned out to be a prodigious personage--no less a one
-than the county judge--altogether the most august creation these
-children had ever looked upon--and they wondered what kind of material
-he was made of--and they half wanted to hear him roar, and were half
-afraid he might, too. He was from Constantinople, twelve miles away--so
-he had travelled, and seen the world--these very eyes had looked upon
-the county court-house--which was said to have a tin roof. The awe
-which these reflections inspired was attested by the impressive silence
-and the ranks of staring eyes. This was the great Judge Thatcher,
-brother of their own lawyer. Jeff Thatcher immediately went forward, to
-be familiar with the great man and be envied by the school. It would
-have been music to his soul to hear the whisperings:
-
-"Look at him, Jim! He's a going up there. Say--look! he's a going to
-shake hands with him--he IS shaking hands with him! By jings, don't you
-wish you was Jeff?"
-
-Mr. Walters fell to "showing off," with all sorts of official
-bustlings and activities, giving orders, delivering judgments,
-discharging directions here, there, everywhere that he could find a
-target. The librarian "showed off"--running hither and thither with his
-arms full of books and making a deal of the splutter and fuss that
-insect authority delights in. The young lady teachers "showed off"
---bending sweetly over pupils that were lately being boxed, lifting
-pretty warning fingers at bad little boys and patting good ones
-lovingly. The young gentlemen teachers "showed off" with small
-scoldings and other little displays of authority and fine attention to
-discipline--and most of the teachers, of both sexes, found business up
-at the library, by the pulpit; and it was business that frequently had
-to be done over again two or three times (with much seeming vexation).
-The little girls "showed off" in various ways, and the little boys
-"showed off" with such diligence that the air was thick with paper wads
-and the murmur of scufflings. And above it all the great man sat and
-beamed a majestic judicial smile upon all the house, and warmed himself
-in the sun of his own grandeur--for he was "showing off," too.
-
-There was only one thing wanting to make Mr. Walters' ecstasy
-complete, and that was a chance to deliver a Bible-prize and exhibit a
-prodigy. Several pupils had a few yellow tickets, but none had enough
---he had been around among the star pupils inquiring. He would have given
-worlds, now, to have that German lad back again with a sound mind.
-
-And now at this moment, when hope was dead, Tom Sawyer came forward
-with nine yellow tickets, nine red tickets, and ten blue ones, and
-demanded a Bible. This was a thunderbolt out of a clear sky. Walters
-was not expecting an application from this source for the next ten
-years. But there was no getting around it--here were the certified
-checks, and they were good for their face. Tom was therefore elevated
-to a place with the Judge and the other elect, and the great news was
-announced from headquarters. It was the most stunning surprise of the
-decade, and so profound was the sensation that it lifted the new hero
-up to the judicial one's altitude, and the school had two marvels to
-gaze upon in place of one. The boys were all eaten up with envy--but
-those that suffered the bitterest pangs were those who perceived too
-late that they themselves had contributed to this hated splendor by
-trading tickets to Tom for the wealth he had amassed in selling
-whitewashing privileges. These despised themselves, as being the dupes
-of a wily fraud, a guileful snake in the grass.
-
-The prize was delivered to Tom with as much effusion as the
-superintendent could pump up under the circumstances; but it lacked
-somewhat of the true gush, for the poor fellow's instinct taught him
-that there was a mystery here that could not well bear the light,
-perhaps; it was simply preposterous that this boy had warehoused two
-thousand sheaves of Scriptural wisdom on his premises--a dozen would
-strain his capacity, without a doubt.
-
-Amy Lawrence was proud and glad, and she tried to make Tom see it in
-her face--but he wouldn't look. She wondered; then she was just a grain
-troubled; next a dim suspicion came and went--came again; she watched;
-a furtive glance told her worlds--and then her heart broke, and she was
-jealous, and angry, and the tears came and she hated everybody. Tom
-most of all (she thought).
-
-Tom was introduced to the Judge; but his tongue was tied, his breath
-would hardly come, his heart quaked--partly because of the awful
-greatness of the man, but mainly because he was her parent. He would
-have liked to fall down and worship him, if it were in the dark. The
-Judge put his hand on Tom's head and called him a fine little man, and
-asked him what his name was. The boy stammered, gasped, and got it out:
-
-"Tom."
-
-"Oh, no, not Tom--it is--"
-
-"Thomas."
-
-"Ah, that's it. I thought there was more to it, maybe. That's very
-well. But you've another one I daresay, and you'll tell it to me, won't
-you?"
-
-"Tell the gentleman your other name, Thomas," said Walters, "and say
-sir. You mustn't forget your manners."
-
-"Thomas Sawyer--sir."
-
-"That's it! That's a good boy. Fine boy. Fine, manly little fellow.
-Two thousand verses is a great many--very, very great many. And you
-never can be sorry for the trouble you took to learn them; for
-knowledge is worth more than anything there is in the world; it's what
-makes great men and good men; you'll be a great man and a good man
-yourself, some day, Thomas, and then you'll look back and say, It's all
-owing to the precious Sunday-school privileges of my boyhood--it's all
-owing to my dear teachers that taught me to learn--it's all owing to
-the good superintendent, who encouraged me, and watched over me, and
-gave me a beautiful Bible--a splendid elegant Bible--to keep and have
-it all for my own, always--it's all owing to right bringing up! That is
-what you will say, Thomas--and you wouldn't take any money for those
-two thousand verses--no indeed you wouldn't. And now you wouldn't mind
-telling me and this lady some of the things you've learned--no, I know
-you wouldn't--for we are proud of little boys that learn. Now, no
-doubt you know the names of all the twelve disciples. Won't you tell us
-the names of the first two that were appointed?"
-
-Tom was tugging at a button-hole and looking sheepish. He blushed,
-now, and his eyes fell. Mr. Walters' heart sank within him. He said to
-himself, it is not possible that the boy can answer the simplest
-question--why DID the Judge ask him? Yet he felt obliged to speak up
-and say:
-
-"Answer the gentleman, Thomas--don't be afraid."
-
-Tom still hung fire.
-
-"Now I know you'll tell me," said the lady. "The names of the first
-two disciples were--"
-
-"DAVID AND GOLIAH!"
-
-Let us draw the curtain of charity over the rest of the scene.
-
-
-
-CHAPTER V
-
-ABOUT half-past ten the cracked bell of the small church began to
-ring, and presently the people began to gather for the morning sermon.
-The Sunday-school children distributed themselves about the house and
-occupied pews with their parents, so as to be under supervision. Aunt
-Polly came, and Tom and Sid and Mary sat with her--Tom being placed
-next the aisle, in order that he might be as far away from the open
-window and the seductive outside summer scenes as possible. The crowd
-filed up the aisles: the aged and needy postmaster, who had seen better
-days; the mayor and his wife--for they had a mayor there, among other
-unnecessaries; the justice of the peace; the widow Douglass, fair,
-smart, and forty, a generous, good-hearted soul and well-to-do, her
-hill mansion the only palace in the town, and the most hospitable and
-much the most lavish in the matter of festivities that St. Petersburg
-could boast; the bent and venerable Major and Mrs. Ward; lawyer
-Riverson, the new notable from a distance; next the belle of the
-village, followed by a troop of lawn-clad and ribbon-decked young
-heart-breakers; then all the young clerks in town in a body--for they
-had stood in the vestibule sucking their cane-heads, a circling wall of
-oiled and simpering admirers, till the last girl had run their gantlet;
-and last of all came the Model Boy, Willie Mufferson, taking as heedful
-care of his mother as if she were cut glass. He always brought his
-mother to church, and was the pride of all the matrons. The boys all
-hated him, he was so good. And besides, he had been "thrown up to them"
-so much. His white handkerchief was hanging out of his pocket behind, as
-usual on Sundays--accidentally. Tom had no handkerchief, and he looked
-upon boys who had as snobs.
-
-The congregation being fully assembled, now, the bell rang once more,
-to warn laggards and stragglers, and then a solemn hush fell upon the
-church which was only broken by the tittering and whispering of the
-choir in the gallery. The choir always tittered and whispered all
-through service. There was once a church choir that was not ill-bred,
-but I have forgotten where it was, now. It was a great many years ago,
-and I can scarcely remember anything about it, but I think it was in
-some foreign country.
-
-The minister gave out the hymn, and read it through with a relish, in
-a peculiar style which was much admired in that part of the country.
-His voice began on a medium key and climbed steadily up till it reached
-a certain point, where it bore with strong emphasis upon the topmost
-word and then plunged down as if from a spring-board:
-
-  Shall I be car-ri-ed toe the skies, on flow'ry BEDS of ease,
-
-  Whilst others fight to win the prize, and sail thro' BLOODY seas?
-
-He was regarded as a wonderful reader. At church "sociables" he was
-always called upon to read poetry; and when he was through, the ladies
-would lift up their hands and let them fall helplessly in their laps,
-and "wall" their eyes, and shake their heads, as much as to say, "Words
-cannot express it; it is too beautiful, TOO beautiful for this mortal
-earth."
-
-After the hymn had been sung, the Rev. Mr. Sprague turned himself into
-a bulletin-board, and read off "notices" of meetings and societies and
-things till it seemed that the list would stretch out to the crack of
-doom--a queer custom which is still kept up in America, even in cities,
-away here in this age of abundant newspapers. Often, the less there is
-to justify a traditional custom, the harder it is to get rid of it.
-
-And now the minister prayed. A good, generous prayer it was, and went
-into details: it pleaded for the church, and the little children of the
-church; for the other churches of the village; for the village itself;
-for the county; for the State; for the State officers; for the United
-States; for the churches of the United States; for Congress; for the
-President; for the officers of the Government; for poor sailors, tossed
-by stormy seas; for the oppressed millions groaning under the heel of
-European monarchies and Oriental despotisms; for such as have the light
-and the good tidings, and yet have not eyes to see nor ears to hear
-withal; for the heathen in the far islands of the sea; and closed with
-a supplication that the words he was about to speak might find grace
-and favor, and be as seed sown in fertile ground, yielding in time a
-grateful harvest of good. Amen.
-
-There was a rustling of dresses, and the standing congregation sat
-down. The boy whose history this book relates did not enjoy the prayer,
-he only endured it--if he even did that much. He was restive all
-through it; he kept tally of the details of the prayer, unconsciously
---for he was not listening, but he knew the ground of old, and the
-clergyman's regular route over it--and when a little trifle of new
-matter was interlarded, his ear detected it and his whole nature
-resented it; he considered additions unfair, and scoundrelly. In the
-midst of the prayer a fly had lit on the back of the pew in front of
-him and tortured his spirit by calmly rubbing its hands together,
-embracing its head with its arms, and polishing it so vigorously that
-it seemed to almost part company with the body, and the slender thread
-of a neck was exposed to view; scraping its wings with its hind legs
-and smoothing them to its body as if they had been coat-tails; going
-through its whole toilet as tranquilly as if it knew it was perfectly
-safe. As indeed it was; for as sorely as Tom's hands itched to grab for
-it they did not dare--he believed his soul would be instantly destroyed
-if he did such a thing while the prayer was going on. But with the
-closing sentence his hand began to curve and steal forward; and the
-instant the "Amen" was out the fly was a prisoner of war. His aunt
-detected the act and made him let it go.
-
-The minister gave out his text and droned along monotonously through
-an argument that was so prosy that many a head by and by began to nod
---and yet it was an argument that dealt in limitless fire and brimstone
-and thinned the predestined elect down to a company so small as to be
-hardly worth the saving. Tom counted the pages of the sermon; after
-church he always knew how many pages there had been, but he seldom knew
-anything else about the discourse. However, this time he was really
-interested for a little while. The minister made a grand and moving
-picture of the assembling together of the world's hosts at the
-millennium when the lion and the lamb should lie down together and a
-little child should lead them. But the pathos, the lesson, the moral of
-the great spectacle were lost upon the boy; he only thought of the
-conspicuousness of the principal character before the on-looking
-nations; his face lit with the thought, and he said to himself that he
-wished he could be that child, if it was a tame lion.
-
-Now he lapsed into suffering again, as the dry argument was resumed.
-Presently he bethought him of a treasure he had and got it out. It was
-a large black beetle with formidable jaws--a "pinchbug," he called it.
-It was in a percussion-cap box. The first thing the beetle did was to
-take him by the finger. A natural fillip followed, the beetle went
-floundering into the aisle and lit on its back, and the hurt finger
-went into the boy's mouth. The beetle lay there working its helpless
-legs, unable to turn over. Tom eyed it, and longed for it; but it was
-safe out of his reach. Other people uninterested in the sermon found
-relief in the beetle, and they eyed it too. Presently a vagrant poodle
-dog came idling along, sad at heart, lazy with the summer softness and
-the quiet, weary of captivity, sighing for change. He spied the beetle;
-the drooping tail lifted and wagged. He surveyed the prize; walked
-around it; smelt at it from a safe distance; walked around it again;
-grew bolder, and took a closer smell; then lifted his lip and made a
-gingerly snatch at it, just missing it; made another, and another;
-began to enjoy the diversion; subsided to his stomach with the beetle
-between his paws, and continued his experiments; grew weary at last,
-and then indifferent and absent-minded. His head nodded, and little by
-little his chin descended and touched the enemy, who seized it. There
-was a sharp yelp, a flirt of the poodle's head, and the beetle fell a
-couple of yards away, and lit on its back once more. The neighboring
-spectators shook with a gentle inward joy, several faces went behind
-fans and handkerchiefs, and Tom was entirely happy. The dog looked
-foolish, and probably felt so; but there was resentment in his heart,
-too, and a craving for revenge. So he went to the beetle and began a
-wary attack on it again; jumping at it from every point of a circle,
-lighting with his fore-paws within an inch of the creature, making even
-closer snatches at it with his teeth, and jerking his head till his
-ears flapped again. But he grew tired once more, after a while; tried
-to amuse himself with a fly but found no relief; followed an ant
-around, with his nose close to the floor, and quickly wearied of that;
-yawned, sighed, forgot the beetle entirely, and sat down on it. Then
-there was a wild yelp of agony and the poodle went sailing up the
-aisle; the yelps continued, and so did the dog; he crossed the house in
-front of the altar; he flew down the other aisle; he crossed before the
-doors; he clamored up the home-stretch; his anguish grew with his
-progress, till presently he was but a woolly comet moving in its orbit
-with the gleam and the speed of light. At last the frantic sufferer
-sheered from its course, and sprang into its master's lap; he flung it
-out of the window, and the voice of distress quickly thinned away and
-died in the distance.
-
-By this time the whole church was red-faced and suffocating with
-suppressed laughter, and the sermon had come to a dead standstill. The
-discourse was resumed presently, but it went lame and halting, all
-possibility of impressiveness being at an end; for even the gravest
-sentiments were constantly being received with a smothered burst of
-unholy mirth, under cover of some remote pew-back, as if the poor
-parson had said a rarely facetious thing. It was a genuine relief to
-the whole congregation when the ordeal was over and the benediction
-pronounced.
-
-Tom Sawyer went home quite cheerful, thinking to himself that there
-was some satisfaction about divine service when there was a bit of
-variety in it. He had but one marring thought; he was willing that the
-dog should play with his pinchbug, but he did not think it was upright
-in him to carry it off.
-
-
-
-CHAPTER VI
-
-MONDAY morning found Tom Sawyer miserable. Monday morning always found
-him so--because it began another week's slow suffering in school. He
-generally began that day with wishing he had had no intervening
-holiday, it made the going into captivity and fetters again so much
-more odious.
-
-Tom lay thinking. Presently it occurred to him that he wished he was
-sick; then he could stay home from school. Here was a vague
-possibility. He canvassed his system. No ailment was found, and he
-investigated again. This time he thought he could detect colicky
-symptoms, and he began to encourage them with considerable hope. But
-they soon grew feeble, and presently died wholly away. He reflected
-further. Suddenly he discovered something. One of his upper front teeth
-was loose. This was lucky; he was about to begin to groan, as a
-"starter," as he called it, when it occurred to him that if he came
-into court with that argument, his aunt would pull it out, and that
-would hurt. So he thought he would hold the tooth in reserve for the
-present, and seek further. Nothing offered for some little time, and
-then he remembered hearing the doctor tell about a certain thing that
-laid up a patient for two or three weeks and threatened to make him
-lose a finger. So the boy eagerly drew his sore toe from under the
-sheet and held it up for inspection. But now he did not know the
-necessary symptoms. However, it seemed well worth while to chance it,
-so he fell to groaning with considerable spirit.
-
-But Sid slept on unconscious.
-
-Tom groaned louder, and fancied that he began to feel pain in the toe.
-
-No result from Sid.
-
-Tom was panting with his exertions by this time. He took a rest and
-then swelled himself up and fetched a succession of admirable groans.
-
-Sid snored on.
-
-Tom was aggravated. He said, "Sid, Sid!" and shook him. This course
-worked well, and Tom began to groan again. Sid yawned, stretched, then
-brought himself up on his elbow with a snort, and began to stare at
-Tom. Tom went on groaning. Sid said:
-
-"Tom! Say, Tom!" [No response.] "Here, Tom! TOM! What is the matter,
-Tom?" And he shook him and looked in his face anxiously.
-
-Tom moaned out:
-
-"Oh, don't, Sid. Don't joggle me."
-
-"Why, what's the matter, Tom? I must call auntie."
-
-"No--never mind. It'll be over by and by, maybe. Don't call anybody."
-
-"But I must! DON'T groan so, Tom, it's awful. How long you been this
-way?"
-
-"Hours. Ouch! Oh, don't stir so, Sid, you'll kill me."
-
-"Tom, why didn't you wake me sooner? Oh, Tom, DON'T! It makes my
-flesh crawl to hear you. Tom, what is the matter?"
-
-"I forgive you everything, Sid. [Groan.] Everything you've ever done
-to me. When I'm gone--"
-
-"Oh, Tom, you ain't dying, are you? Don't, Tom--oh, don't. Maybe--"
-
-"I forgive everybody, Sid. [Groan.] Tell 'em so, Sid. And Sid, you
-give my window-sash and my cat with one eye to that new girl that's
-come to town, and tell her--"
-
-But Sid had snatched his clothes and gone. Tom was suffering in
-reality, now, so handsomely was his imagination working, and so his
-groans had gathered quite a genuine tone.
-
-Sid flew down-stairs and said:
-
-"Oh, Aunt Polly, come! Tom's dying!"
-
-"Dying!"
-
-"Yes'm. Don't wait--come quick!"
-
-"Rubbage! I don't believe it!"
-
-But she fled up-stairs, nevertheless, with Sid and Mary at her heels.
-And her face grew white, too, and her lip trembled. When she reached
-the bedside she gasped out:
-
-"You, Tom! Tom, what's the matter with you?"
-
-"Oh, auntie, I'm--"
-
-"What's the matter with you--what is the matter with you, child?"
-
-"Oh, auntie, my sore toe's mortified!"
-
-The old lady sank down into a chair and laughed a little, then cried a
-little, then did both together. This restored her and she said:
-
-"Tom, what a turn you did give me. Now you shut up that nonsense and
-climb out of this."
-
-The groans ceased and the pain vanished from the toe. The boy felt a
-little foolish, and he said:
-
-"Aunt Polly, it SEEMED mortified, and it hurt so I never minded my
-tooth at all."
-
-"Your tooth, indeed! What's the matter with your tooth?"
-
-"One of them's loose, and it aches perfectly awful."
-
-"There, there, now, don't begin that groaning again. Open your mouth.
-Well--your tooth IS loose, but you're not going to die about that.
-Mary, get me a silk thread, and a chunk of fire out of the kitchen."
-
-Tom said:
-
-"Oh, please, auntie, don't pull it out. It don't hurt any more. I wish
-I may never stir if it does. Please don't, auntie. I don't want to stay
-home from school."
-
-"Oh, you don't, don't you? So all this row was because you thought
-you'd get to stay home from school and go a-fishing? Tom, Tom, I love
-you so, and you seem to try every way you can to break my old heart
-with your outrageousness." By this time the dental instruments were
-ready. The old lady made one end of the silk thread fast to Tom's tooth
-with a loop and tied the other to the bedpost. Then she seized the
-chunk of fire and suddenly thrust it almost into the boy's face. The
-tooth hung dangling by the bedpost, now.
-
-But all trials bring their compensations. As Tom wended to school
-after breakfast, he was the envy of every boy he met because the gap in
-his upper row of teeth enabled him to expectorate in a new and
-admirable way. He gathered quite a following of lads interested in the
-exhibition; and one that had cut his finger and had been a centre of
-fascination and homage up to this time, now found himself suddenly
-without an adherent, and shorn of his glory. His heart was heavy, and
-he said with a disdain which he did not feel that it wasn't anything to
-spit like Tom Sawyer; but another boy said, "Sour grapes!" and he
-wandered away a dismantled hero.
-
-Shortly Tom came upon the juvenile pariah of the village, Huckleberry
-Finn, son of the town drunkard. Huckleberry was cordially hated and
-dreaded by all the mothers of the town, because he was idle and lawless
-and vulgar and bad--and because all their children admired him so, and
-delighted in his forbidden society, and wished they dared to be like
-him. Tom was like the rest of the respectable boys, in that he envied
-Huckleberry his gaudy outcast condition, and was under strict orders
-not to play with him. So he played with him every time he got a chance.
-Huckleberry was always dressed in the cast-off clothes of full-grown
-men, and they were in perennial bloom and fluttering with rags. His hat
-was a vast ruin with a wide crescent lopped out of its brim; his coat,
-when he wore one, hung nearly to his heels and had the rearward buttons
-far down the back; but one suspender supported his trousers; the seat
-of the trousers bagged low and contained nothing, the fringed legs
-dragged in the dirt when not rolled up.
-
-Huckleberry came and went, at his own free will. He slept on doorsteps
-in fine weather and in empty hogsheads in wet; he did not have to go to
-school or to church, or call any being master or obey anybody; he could
-go fishing or swimming when and where he chose, and stay as long as it
-suited him; nobody forbade him to fight; he could sit up as late as he
-pleased; he was always the first boy that went barefoot in the spring
-and the last to resume leather in the fall; he never had to wash, nor
-put on clean clothes; he could swear wonderfully. In a word, everything
-that goes to make life precious that boy had. So thought every
-harassed, hampered, respectable boy in St. Petersburg.
-
-Tom hailed the romantic outcast:
-
-"Hello, Huckleberry!"
-
-"Hello yourself, and see how you like it."
-
-"What's that you got?"
-
-"Dead cat."
-
-"Lemme see him, Huck. My, he's pretty stiff. Where'd you get him?"
-
-"Bought him off'n a boy."
-
-"What did you give?"
-
-"I give a blue ticket and a bladder that I got at the slaughter-house."
-
-"Where'd you get the blue ticket?"
-
-"Bought it off'n Ben Rogers two weeks ago for a hoop-stick."
-
-"Say--what is dead cats good for, Huck?"
-
-"Good for? Cure warts with."
-
-"No! Is that so? I know something that's better."
-
-"I bet you don't. What is it?"
-
-"Why, spunk-water."
-
-"Spunk-water! I wouldn't give a dern for spunk-water."
-
-"You wouldn't, wouldn't you? D'you ever try it?"
-
-"No, I hain't. But Bob Tanner did."
-
-"Who told you so!"
-
-"Why, he told Jeff Thatcher, and Jeff told Johnny Baker, and Johnny
-told Jim Hollis, and Jim told Ben Rogers, and Ben told a nigger, and
-the nigger told me. There now!"
-
-"Well, what of it? They'll all lie. Leastways all but the nigger. I
-don't know HIM. But I never see a nigger that WOULDN'T lie. Shucks! Now
-you tell me how Bob Tanner done it, Huck."
-
-"Why, he took and dipped his hand in a rotten stump where the
-rain-water was."
-
-"In the daytime?"
-
-"Certainly."
-
-"With his face to the stump?"
-
-"Yes. Least I reckon so."
-
-"Did he say anything?"
-
-"I don't reckon he did. I don't know."
-
-"Aha! Talk about trying to cure warts with spunk-water such a blame
-fool way as that! Why, that ain't a-going to do any good. You got to go
-all by yourself, to the middle of the woods, where you know there's a
-spunk-water stump, and just as it's midnight you back up against the
-stump and jam your hand in and say:
-
-  'Barley-corn, barley-corn, injun-meal shorts,
-   Spunk-water, spunk-water, swaller these warts,'
-
-and then walk away quick, eleven steps, with your eyes shut, and then
-turn around three times and walk home without speaking to anybody.
-Because if you speak the charm's busted."
-
-"Well, that sounds like a good way; but that ain't the way Bob Tanner
-done."
-
-"No, sir, you can bet he didn't, becuz he's the wartiest boy in this
-town; and he wouldn't have a wart on him if he'd knowed how to work
-spunk-water. I've took off thousands of warts off of my hands that way,
-Huck. I play with frogs so much that I've always got considerable many
-warts. Sometimes I take 'em off with a bean."
-
-"Yes, bean's good. I've done that."
-
-"Have you? What's your way?"
-
-"You take and split the bean, and cut the wart so as to get some
-blood, and then you put the blood on one piece of the bean and take and
-dig a hole and bury it 'bout midnight at the crossroads in the dark of
-the moon, and then you burn up the rest of the bean. You see that piece
-that's got the blood on it will keep drawing and drawing, trying to
-fetch the other piece to it, and so that helps the blood to draw the
-wart, and pretty soon off she comes."
-
-"Yes, that's it, Huck--that's it; though when you're burying it if you
-say 'Down bean; off wart; come no more to bother me!' it's better.
-That's the way Joe Harper does, and he's been nearly to Coonville and
-most everywheres. But say--how do you cure 'em with dead cats?"
-
-"Why, you take your cat and go and get in the graveyard 'long about
-midnight when somebody that was wicked has been buried; and when it's
-midnight a devil will come, or maybe two or three, but you can't see
-'em, you can only hear something like the wind, or maybe hear 'em talk;
-and when they're taking that feller away, you heave your cat after 'em
-and say, 'Devil follow corpse, cat follow devil, warts follow cat, I'm
-done with ye!' That'll fetch ANY wart."
-
-"Sounds right. D'you ever try it, Huck?"
-
-"No, but old Mother Hopkins told me."
-
-"Well, I reckon it's so, then. Becuz they say she's a witch."
-
-"Say! Why, Tom, I KNOW she is. She witched pap. Pap says so his own
-self. He come along one day, and he see she was a-witching him, so he
-took up a rock, and if she hadn't dodged, he'd a got her. Well, that
-very night he rolled off'n a shed wher' he was a layin drunk, and broke
-his arm."
-
-"Why, that's awful. How did he know she was a-witching him?"
-
-"Lord, pap can tell, easy. Pap says when they keep looking at you
-right stiddy, they're a-witching you. Specially if they mumble. Becuz
-when they mumble they're saying the Lord's Prayer backards."
-
-"Say, Hucky, when you going to try the cat?"
-
-"To-night. I reckon they'll come after old Hoss Williams to-night."
-
-"But they buried him Saturday. Didn't they get him Saturday night?"
-
-"Why, how you talk! How could their charms work till midnight?--and
-THEN it's Sunday. Devils don't slosh around much of a Sunday, I don't
-reckon."
-
-"I never thought of that. That's so. Lemme go with you?"
-
-"Of course--if you ain't afeard."
-
-"Afeard! 'Tain't likely. Will you meow?"
-
-"Yes--and you meow back, if you get a chance. Last time, you kep' me
-a-meowing around till old Hays went to throwing rocks at me and says
-'Dern that cat!' and so I hove a brick through his window--but don't
-you tell."
-
-"I won't. I couldn't meow that night, becuz auntie was watching me,
-but I'll meow this time. Say--what's that?"
-
-"Nothing but a tick."
-
-"Where'd you get him?"
-
-"Out in the woods."
-
-"What'll you take for him?"
-
-"I don't know. I don't want to sell him."
-
-"All right. It's a mighty small tick, anyway."
-
-"Oh, anybody can run a tick down that don't belong to them. I'm
-satisfied with it. It's a good enough tick for me."
-
-"Sho, there's ticks a plenty. I could have a thousand of 'em if I
-wanted to."
-
-"Well, why don't you? Becuz you know mighty well you can't. This is a
-pretty early tick, I reckon. It's the first one I've seen this year."
-
-"Say, Huck--I'll give you my tooth for him."
-
-"Less see it."
-
-Tom got out a bit of paper and carefully unrolled it. Huckleberry
-viewed it wistfully. The temptation was very strong. At last he said:
-
-"Is it genuwyne?"
-
-Tom lifted his lip and showed the vacancy.
-
-"Well, all right," said Huckleberry, "it's a trade."
-
-Tom enclosed the tick in the percussion-cap box that had lately been
-the pinchbug's prison, and the boys separated, each feeling wealthier
-than before.
-
-When Tom reached the little isolated frame schoolhouse, he strode in
-briskly, with the manner of one who had come with all honest speed.
-He hung his hat on a peg and flung himself into his seat with
-business-like alacrity. The master, throned on high in his great
-splint-bottom arm-chair, was dozing, lulled by the drowsy hum of study.
-The interruption roused him.
-
-"Thomas Sawyer!"
-
-Tom knew that when his name was pronounced in full, it meant trouble.
-
-"Sir!"
-
-"Come up here. Now, sir, why are you late again, as usual?"
-
-Tom was about to take refuge in a lie, when he saw two long tails of
-yellow hair hanging down a back that he recognized by the electric
-sympathy of love; and by that form was THE ONLY VACANT PLACE on the
-girls' side of the schoolhouse. He instantly said:
-
-"I STOPPED TO TALK WITH HUCKLEBERRY FINN!"
-
-The master's pulse stood still, and he stared helplessly. The buzz of
-study ceased. The pupils wondered if this foolhardy boy had lost his
-mind. The master said:
-
-"You--you did what?"
-
-"Stopped to talk with Huckleberry Finn."
-
-There was no mistaking the words.
-
-"Thomas Sawyer, this is the most astounding confession I have ever
-listened to. No mere ferule will answer for this offence. Take off your
-jacket."
-
-The master's arm performed until it was tired and the stock of
-switches notably diminished. Then the order followed:
-
-"Now, sir, go and sit with the girls! And let this be a warning to you."
-
-The titter that rippled around the room appeared to abash the boy, but
-in reality that result was caused rather more by his worshipful awe of
-his unknown idol and the dread pleasure that lay in his high good
-fortune. He sat down upon the end of the pine bench and the girl
-hitched herself away from him with a toss of her head. Nudges and winks
-and whispers traversed the room, but Tom sat still, with his arms upon
-the long, low desk before him, and seemed to study his book.
-
-By and by attention ceased from him, and the accustomed school murmur
-rose upon the dull air once more. Presently the boy began to steal
-furtive glances at the girl. She observed it, "made a mouth" at him and
-gave him the back of her head for the space of a minute. When she
-cautiously faced around again, a peach lay before her. She thrust it
-away. Tom gently put it back. She thrust it away again, but with less
-animosity. Tom patiently returned it to its place. Then she let it
-remain. Tom scrawled on his slate, "Please take it--I got more." The
-girl glanced at the words, but made no sign. Now the boy began to draw
-something on the slate, hiding his work with his left hand. For a time
-the girl refused to notice; but her human curiosity presently began to
-manifest itself by hardly perceptible signs. The boy worked on,
-apparently unconscious. The girl made a sort of noncommittal attempt to
-see, but the boy did not betray that he was aware of it. At last she
-gave in and hesitatingly whispered:
-
-"Let me see it."
-
-Tom partly uncovered a dismal caricature of a house with two gable
-ends to it and a corkscrew of smoke issuing from the chimney. Then the
-girl's interest began to fasten itself upon the work and she forgot
-everything else. When it was finished, she gazed a moment, then
-whispered:
-
-"It's nice--make a man."
-
-The artist erected a man in the front yard, that resembled a derrick.
-He could have stepped over the house; but the girl was not
-hypercritical; she was satisfied with the monster, and whispered:
-
-"It's a beautiful man--now make me coming along."
-
-Tom drew an hour-glass with a full moon and straw limbs to it and
-armed the spreading fingers with a portentous fan. The girl said:
-
-"It's ever so nice--I wish I could draw."
-
-"It's easy," whispered Tom, "I'll learn you."
-
-"Oh, will you? When?"
-
-"At noon. Do you go home to dinner?"
-
-"I'll stay if you will."
-
-"Good--that's a whack. What's your name?"
-
-"Becky Thatcher. What's yours? Oh, I know. It's Thomas Sawyer."
-
-"That's the name they lick me by. I'm Tom when I'm good. You call me
-Tom, will you?"
-
-"Yes."
-
-Now Tom began to scrawl something on the slate, hiding the words from
-the girl. But she was not backward this time. She begged to see. Tom
-said:
-
-"Oh, it ain't anything."
-
-"Yes it is."
-
-"No it ain't. You don't want to see."
-
-"Yes I do, indeed I do. Please let me."
-
-"You'll tell."
-
-"No I won't--deed and deed and double deed won't."
-
-"You won't tell anybody at all? Ever, as long as you live?"
-
-"No, I won't ever tell ANYbody. Now let me."
-
-"Oh, YOU don't want to see!"
-
-"Now that you treat me so, I WILL see." And she put her small hand
-upon his and a little scuffle ensued, Tom pretending to resist in
-earnest but letting his hand slip by degrees till these words were
-revealed: "I LOVE YOU."
-
-"Oh, you bad thing!" And she hit his hand a smart rap, but reddened
-and looked pleased, nevertheless.
-
-Just at this juncture the boy felt a slow, fateful grip closing on his
-ear, and a steady lifting impulse. In that wise he was borne across the
-house and deposited in his own seat, under a peppering fire of giggles
-from the whole school. Then the master stood over him during a few
-awful moments, and finally moved away to his throne without saying a
-word. But although Tom's ear tingled, his heart was jubilant.
-
-As the school quieted down Tom made an honest effort to study, but the
-turmoil within him was too great. In turn he took his place in the
-reading class and made a botch of it; then in the geography class and
-turned lakes into mountains, mountains into rivers, and rivers into
-continents, till chaos was come again; then in the spelling class, and
-got "turned down," by a succession of mere baby words, till he brought
-up at the foot and yielded up the pewter medal which he had worn with
-ostentation for months.
-
-
-
-CHAPTER VII
-
-THE harder Tom tried to fasten his mind on his book, the more his
-ideas wandered. So at last, with a sigh and a yawn, he gave it up. It
-seemed to him that the noon recess would never come. The air was
-utterly dead. There was not a breath stirring. It was the sleepiest of
-sleepy days. The drowsing murmur of the five and twenty studying
-scholars soothed the soul like the spell that is in the murmur of bees.
-Away off in the flaming sunshine, Cardiff Hill lifted its soft green
-sides through a shimmering veil of heat, tinted with the purple of
-distance; a few birds floated on lazy wing high in the air; no other
-living thing was visible but some cows, and they were asleep. Tom's
-heart ached to be free, or else to have something of interest to do to
-pass the dreary time. His hand wandered into his pocket and his face
-lit up with a glow of gratitude that was prayer, though he did not know
-it. Then furtively the percussion-cap box came out. He released the
-tick and put him on the long flat desk. The creature probably glowed
-with a gratitude that amounted to prayer, too, at this moment, but it
-was premature: for when he started thankfully to travel off, Tom turned
-him aside with a pin and made him take a new direction.
-
-Tom's bosom friend sat next him, suffering just as Tom had been, and
-now he was deeply and gratefully interested in this entertainment in an
-instant. This bosom friend was Joe Harper. The two boys were sworn
-friends all the week, and embattled enemies on Saturdays. Joe took a
-pin out of his lapel and began to assist in exercising the prisoner.
-The sport grew in interest momently. Soon Tom said that they were
-interfering with each other, and neither getting the fullest benefit of
-the tick. So he put Joe's slate on the desk and drew a line down the
-middle of it from top to bottom.
-
-"Now," said he, "as long as he is on your side you can stir him up and
-I'll let him alone; but if you let him get away and get on my side,
-you're to leave him alone as long as I can keep him from crossing over."
-
-"All right, go ahead; start him up."
-
-The tick escaped from Tom, presently, and crossed the equator. Joe
-harassed him awhile, and then he got away and crossed back again. This
-change of base occurred often. While one boy was worrying the tick with
-absorbing interest, the other would look on with interest as strong,
-the two heads bowed together over the slate, and the two souls dead to
-all things else. At last luck seemed to settle and abide with Joe. The
-tick tried this, that, and the other course, and got as excited and as
-anxious as the boys themselves, but time and again just as he would
-have victory in his very grasp, so to speak, and Tom's fingers would be
-twitching to begin, Joe's pin would deftly head him off, and keep
-possession. At last Tom could stand it no longer. The temptation was
-too strong. So he reached out and lent a hand with his pin. Joe was
-angry in a moment. Said he:
-
-"Tom, you let him alone."
-
-"I only just want to stir him up a little, Joe."
-
-"No, sir, it ain't fair; you just let him alone."
-
-"Blame it, I ain't going to stir him much."
-
-"Let him alone, I tell you."
-
-"I won't!"
-
-"You shall--he's on my side of the line."
-
-"Look here, Joe Harper, whose is that tick?"
-
-"I don't care whose tick he is--he's on my side of the line, and you
-sha'n't touch him."
-
-"Well, I'll just bet I will, though. He's my tick and I'll do what I
-blame please with him, or die!"
-
-A tremendous whack came down on Tom's shoulders, and its duplicate on
-Joe's; and for the space of two minutes the dust continued to fly from
-the two jackets and the whole school to enjoy it. The boys had been too
-absorbed to notice the hush that had stolen upon the school awhile
-before when the master came tiptoeing down the room and stood over
-them. He had contemplated a good part of the performance before he
-contributed his bit of variety to it.
-
-When school broke up at noon, Tom flew to Becky Thatcher, and
-whispered in her ear:
-
-"Put on your bonnet and let on you're going home; and when you get to
-the corner, give the rest of 'em the slip, and turn down through the
-lane and come back. I'll go the other way and come it over 'em the same
-way."
-
-So the one went off with one group of scholars, and the other with
-another. In a little while the two met at the bottom of the lane, and
-when they reached the school they had it all to themselves. Then they
-sat together, with a slate before them, and Tom gave Becky the pencil
-and held her hand in his, guiding it, and so created another surprising
-house. When the interest in art began to wane, the two fell to talking.
-Tom was swimming in bliss. He said:
-
-"Do you love rats?"
-
-"No! I hate them!"
-
-"Well, I do, too--LIVE ones. But I mean dead ones, to swing round your
-head with a string."
-
-"No, I don't care for rats much, anyway. What I like is chewing-gum."
-
-"Oh, I should say so! I wish I had some now."
-
-"Do you? I've got some. I'll let you chew it awhile, but you must give
-it back to me."
-
-That was agreeable, so they chewed it turn about, and dangled their
-legs against the bench in excess of contentment.
-
-"Was you ever at a circus?" said Tom.
-
-"Yes, and my pa's going to take me again some time, if I'm good."
-
-"I been to the circus three or four times--lots of times. Church ain't
-shucks to a circus. There's things going on at a circus all the time.
-I'm going to be a clown in a circus when I grow up."
-
-"Oh, are you! That will be nice. They're so lovely, all spotted up."
-
-"Yes, that's so. And they get slathers of money--most a dollar a day,
-Ben Rogers says. Say, Becky, was you ever engaged?"
-
-"What's that?"
-
-"Why, engaged to be married."
-
-"No."
-
-"Would you like to?"
-
-"I reckon so. I don't know. What is it like?"
-
-"Like? Why it ain't like anything. You only just tell a boy you won't
-ever have anybody but him, ever ever ever, and then you kiss and that's
-all. Anybody can do it."
-
-"Kiss? What do you kiss for?"
-
-"Why, that, you know, is to--well, they always do that."
-
-"Everybody?"
-
-"Why, yes, everybody that's in love with each other. Do you remember
-what I wrote on the slate?"
-
-"Ye--yes."
-
-"What was it?"
-
-"I sha'n't tell you."
-
-"Shall I tell YOU?"
-
-"Ye--yes--but some other time."
-
-"No, now."
-
-"No, not now--to-morrow."
-
-"Oh, no, NOW. Please, Becky--I'll whisper it, I'll whisper it ever so
-easy."
-
-Becky hesitating, Tom took silence for consent, and passed his arm
-about her waist and whispered the tale ever so softly, with his mouth
-close to her ear. And then he added:
-
-"Now you whisper it to me--just the same."
-
-She resisted, for a while, and then said:
-
-"You turn your face away so you can't see, and then I will. But you
-mustn't ever tell anybody--WILL you, Tom? Now you won't, WILL you?"
-
-"No, indeed, indeed I won't. Now, Becky."
-
-He turned his face away. She bent timidly around till her breath
-stirred his curls and whispered, "I--love--you!"
-
-Then she sprang away and ran around and around the desks and benches,
-with Tom after her, and took refuge in a corner at last, with her
-little white apron to her face. Tom clasped her about her neck and
-pleaded:
-
-"Now, Becky, it's all done--all over but the kiss. Don't you be afraid
-of that--it ain't anything at all. Please, Becky." And he tugged at her
-apron and the hands.
-
-By and by she gave up, and let her hands drop; her face, all glowing
-with the struggle, came up and submitted. Tom kissed the red lips and
-said:
-
-"Now it's all done, Becky. And always after this, you know, you ain't
-ever to love anybody but me, and you ain't ever to marry anybody but
-me, ever never and forever. Will you?"
-
-"No, I'll never love anybody but you, Tom, and I'll never marry
-anybody but you--and you ain't to ever marry anybody but me, either."
-
-"Certainly. Of course. That's PART of it. And always coming to school
-or when we're going home, you're to walk with me, when there ain't
-anybody looking--and you choose me and I choose you at parties, because
-that's the way you do when you're engaged."
-
-"It's so nice. I never heard of it before."
-
-"Oh, it's ever so gay! Why, me and Amy Lawrence--"
-
-The big eyes told Tom his blunder and he stopped, confused.
-
-"Oh, Tom! Then I ain't the first you've ever been engaged to!"
-
-The child began to cry. Tom said:
-
-"Oh, don't cry, Becky, I don't care for her any more."
-
-"Yes, you do, Tom--you know you do."
-
-Tom tried to put his arm about her neck, but she pushed him away and
-turned her face to the wall, and went on crying. Tom tried again, with
-soothing words in his mouth, and was repulsed again. Then his pride was
-up, and he strode away and went outside. He stood about, restless and
-uneasy, for a while, glancing at the door, every now and then, hoping
-she would repent and come to find him. But she did not. Then he began
-to feel badly and fear that he was in the wrong. It was a hard struggle
-with him to make new advances, now, but he nerved himself to it and
-entered. She was still standing back there in the corner, sobbing, with
-her face to the wall. Tom's heart smote him. He went to her and stood a
-moment, not knowing exactly how to proceed. Then he said hesitatingly:
-
-"Becky, I--I don't care for anybody but you."
-
-No reply--but sobs.
-
-"Becky"--pleadingly. "Becky, won't you say something?"
-
-More sobs.
-
-Tom got out his chiefest jewel, a brass knob from the top of an
-andiron, and passed it around her so that she could see it, and said:
-
-"Please, Becky, won't you take it?"
-
-She struck it to the floor. Then Tom marched out of the house and over
-the hills and far away, to return to school no more that day. Presently
-Becky began to suspect. She ran to the door; he was not in sight; she
-flew around to the play-yard; he was not there. Then she called:
-
-"Tom! Come back, Tom!"
-
-She listened intently, but there was no answer. She had no companions
-but silence and loneliness. So she sat down to cry again and upbraid
-herself; and by this time the scholars began to gather again, and she
-had to hide her griefs and still her broken heart and take up the cross
-of a long, dreary, aching afternoon, with none among the strangers
-about her to exchange sorrows with.
-
-
-
-CHAPTER VIII
-
-TOM dodged hither and thither through lanes until he was well out of
-the track of returning scholars, and then fell into a moody jog. He
-crossed a small "branch" two or three times, because of a prevailing
-juvenile superstition that to cross water baffled pursuit. Half an hour
-later he was disappearing behind the Douglas mansion on the summit of
-Cardiff Hill, and the schoolhouse was hardly distinguishable away off
-in the valley behind him. He entered a dense wood, picked his pathless
-way to the centre of it, and sat down on a mossy spot under a spreading
-oak. There was not even a zephyr stirring; the dead noonday heat had
-even stilled the songs of the birds; nature lay in a trance that was
-broken by no sound but the occasional far-off hammering of a
-woodpecker, and this seemed to render the pervading silence and sense
-of loneliness the more profound. The boy's soul was steeped in
-melancholy; his feelings were in happy accord with his surroundings. He
-sat long with his elbows on his knees and his chin in his hands,
-meditating. It seemed to him that life was but a trouble, at best, and
-he more than half envied Jimmy Hodges, so lately released; it must be
-very peaceful, he thought, to lie and slumber and dream forever and
-ever, with the wind whispering through the trees and caressing the
-grass and the flowers over the grave, and nothing to bother and grieve
-about, ever any more. If he only had a clean Sunday-school record he
-could be willing to go, and be done with it all. Now as to this girl.
-What had he done? Nothing. He had meant the best in the world, and been
-treated like a dog--like a very dog. She would be sorry some day--maybe
-when it was too late. Ah, if he could only die TEMPORARILY!
-
-But the elastic heart of youth cannot be compressed into one
-constrained shape long at a time. Tom presently began to drift
-insensibly back into the concerns of this life again. What if he turned
-his back, now, and disappeared mysteriously? What if he went away--ever
-so far away, into unknown countries beyond the seas--and never came
-back any more! How would she feel then! The idea of being a clown
-recurred to him now, only to fill him with disgust. For frivolity and
-jokes and spotted tights were an offense, when they intruded themselves
-upon a spirit that was exalted into the vague august realm of the
-romantic. No, he would be a soldier, and return after long years, all
-war-worn and illustrious. No--better still, he would join the Indians,
-and hunt buffaloes and go on the warpath in the mountain ranges and the
-trackless great plains of the Far West, and away in the future come
-back a great chief, bristling with feathers, hideous with paint, and
-prance into Sunday-school, some drowsy summer morning, with a
-bloodcurdling war-whoop, and sear the eyeballs of all his companions
-with unappeasable envy. But no, there was something gaudier even than
-this. He would be a pirate! That was it! NOW his future lay plain
-before him, and glowing with unimaginable splendor. How his name would
-fill the world, and make people shudder! How gloriously he would go
-plowing the dancing seas, in his long, low, black-hulled racer, the
-Spirit of the Storm, with his grisly flag flying at the fore! And at
-the zenith of his fame, how he would suddenly appear at the old village
-and stalk into church, brown and weather-beaten, in his black velvet
-doublet and trunks, his great jack-boots, his crimson sash, his belt
-bristling with horse-pistols, his crime-rusted cutlass at his side, his
-slouch hat with waving plumes, his black flag unfurled, with the skull
-and crossbones on it, and hear with swelling ecstasy the whisperings,
-"It's Tom Sawyer the Pirate!--the Black Avenger of the Spanish Main!"
-
-Yes, it was settled; his career was determined. He would run away from
-home and enter upon it. He would start the very next morning. Therefore
-he must now begin to get ready. He would collect his resources
-together. He went to a rotten log near at hand and began to dig under
-one end of it with his Barlow knife. He soon struck wood that sounded
-hollow. He put his hand there and uttered this incantation impressively:
-
-"What hasn't come here, come! What's here, stay here!"
-
-Then he scraped away the dirt, and exposed a pine shingle. He took it
-up and disclosed a shapely little treasure-house whose bottom and sides
-were of shingles. In it lay a marble. Tom's astonishment was boundless!
-He scratched his head with a perplexed air, and said:
-
-"Well, that beats anything!"
-
-Then he tossed the marble away pettishly, and stood cogitating. The
-truth was, that a superstition of his had failed, here, which he and
-all his comrades had always looked upon as infallible. If you buried a
-marble with certain necessary incantations, and left it alone a
-fortnight, and then opened the place with the incantation he had just
-used, you would find that all the marbles you had ever lost had
-gathered themselves together there, meantime, no matter how widely they
-had been separated. But now, this thing had actually and unquestionably
-failed. Tom's whole structure of faith was shaken to its foundations.
-He had many a time heard of this thing succeeding but never of its
-failing before. It did not occur to him that he had tried it several
-times before, himself, but could never find the hiding-places
-afterward. He puzzled over the matter some time, and finally decided
-that some witch had interfered and broken the charm. He thought he
-would satisfy himself on that point; so he searched around till he
-found a small sandy spot with a little funnel-shaped depression in it.
-He laid himself down and put his mouth close to this depression and
-called--
-
-"Doodle-bug, doodle-bug, tell me what I want to know! Doodle-bug,
-doodle-bug, tell me what I want to know!"
-
-The sand began to work, and presently a small black bug appeared for a
-second and then darted under again in a fright.
-
-"He dasn't tell! So it WAS a witch that done it. I just knowed it."
-
-He well knew the futility of trying to contend against witches, so he
-gave up discouraged. But it occurred to him that he might as well have
-the marble he had just thrown away, and therefore he went and made a
-patient search for it. But he could not find it. Now he went back to
-his treasure-house and carefully placed himself just as he had been
-standing when he tossed the marble away; then he took another marble
-from his pocket and tossed it in the same way, saying:
-
-"Brother, go find your brother!"
-
-He watched where it stopped, and went there and looked. But it must
-have fallen short or gone too far; so he tried twice more. The last
-repetition was successful. The two marbles lay within a foot of each
-other.
-
-Just here the blast of a toy tin trumpet came faintly down the green
-aisles of the forest. Tom flung off his jacket and trousers, turned a
-suspender into a belt, raked away some brush behind the rotten log,
-disclosing a rude bow and arrow, a lath sword and a tin trumpet, and in
-a moment had seized these things and bounded away, barelegged, with
-fluttering shirt. He presently halted under a great elm, blew an
-answering blast, and then began to tiptoe and look warily out, this way
-and that. He said cautiously--to an imaginary company:
-
-"Hold, my merry men! Keep hid till I blow."
-
-Now appeared Joe Harper, as airily clad and elaborately armed as Tom.
-Tom called:
-
-"Hold! Who comes here into Sherwood Forest without my pass?"
-
-"Guy of Guisborne wants no man's pass. Who art thou that--that--"
-
-"Dares to hold such language," said Tom, prompting--for they talked
-"by the book," from memory.
-
-"Who art thou that dares to hold such language?"
-
-"I, indeed! I am Robin Hood, as thy caitiff carcase soon shall know."
-
-"Then art thou indeed that famous outlaw? Right gladly will I dispute
-with thee the passes of the merry wood. Have at thee!"
-
-They took their lath swords, dumped their other traps on the ground,
-struck a fencing attitude, foot to foot, and began a grave, careful
-combat, "two up and two down." Presently Tom said:
-
-"Now, if you've got the hang, go it lively!"
-
-So they "went it lively," panting and perspiring with the work. By and
-by Tom shouted:
-
-"Fall! fall! Why don't you fall?"
-
-"I sha'n't! Why don't you fall yourself? You're getting the worst of
-it."
-
-"Why, that ain't anything. I can't fall; that ain't the way it is in
-the book. The book says, 'Then with one back-handed stroke he slew poor
-Guy of Guisborne.' You're to turn around and let me hit you in the
-back."
-
-There was no getting around the authorities, so Joe turned, received
-the whack and fell.
-
-"Now," said Joe, getting up, "you got to let me kill YOU. That's fair."
-
-"Why, I can't do that, it ain't in the book."
-
-"Well, it's blamed mean--that's all."
-
-"Well, say, Joe, you can be Friar Tuck or Much the miller's son, and
-lam me with a quarter-staff; or I'll be the Sheriff of Nottingham and
-you be Robin Hood a little while and kill me."
-
-This was satisfactory, and so these adventures were carried out. Then
-Tom became Robin Hood again, and was allowed by the treacherous nun to
-bleed his strength away through his neglected wound. And at last Joe,
-representing a whole tribe of weeping outlaws, dragged him sadly forth,
-gave his bow into his feeble hands, and Tom said, "Where this arrow
-falls, there bury poor Robin Hood under the greenwood tree." Then he
-shot the arrow and fell back and would have died, but he lit on a
-nettle and sprang up too gaily for a corpse.
-
-The boys dressed themselves, hid their accoutrements, and went off
-grieving that there were no outlaws any more, and wondering what modern
-civilization could claim to have done to compensate for their loss.
-They said they would rather be outlaws a year in Sherwood Forest than
-President of the United States forever.
-
-
-
-CHAPTER IX
-
-AT half-past nine, that night, Tom and Sid were sent to bed, as usual.
-They said their prayers, and Sid was soon asleep. Tom lay awake and
-waited, in restless impatience. When it seemed to him that it must be
-nearly daylight, he heard the clock strike ten! This was despair. He
-would have tossed and fidgeted, as his nerves demanded, but he was
-afraid he might wake Sid. So he lay still, and stared up into the dark.
-Everything was dismally still. By and by, out of the stillness, little,
-scarcely perceptible noises began to emphasize themselves. The ticking
-of the clock began to bring itself into notice. Old beams began to
-crack mysteriously. The stairs creaked faintly. Evidently spirits were
-abroad. A measured, muffled snore issued from Aunt Polly's chamber. And
-now the tiresome chirping of a cricket that no human ingenuity could
-locate, began. Next the ghastly ticking of a deathwatch in the wall at
-the bed's head made Tom shudder--it meant that somebody's days were
-numbered. Then the howl of a far-off dog rose on the night air, and was
-answered by a fainter howl from a remoter distance. Tom was in an
-agony. At last he was satisfied that time had ceased and eternity
-begun; he began to doze, in spite of himself; the clock chimed eleven,
-but he did not hear it. And then there came, mingling with his
-half-formed dreams, a most melancholy caterwauling. The raising of a
-neighboring window disturbed him. A cry of "Scat! you devil!" and the
-crash of an empty bottle against the back of his aunt's woodshed
-brought him wide awake, and a single minute later he was dressed and
-out of the window and creeping along the roof of the "ell" on all
-fours. He "meow'd" with caution once or twice, as he went; then jumped
-to the roof of the woodshed and thence to the ground. Huckleberry Finn
-was there, with his dead cat. The boys moved off and disappeared in the
-gloom. At the end of half an hour they were wading through the tall
-grass of the graveyard.
-
-It was a graveyard of the old-fashioned Western kind. It was on a
-hill, about a mile and a half from the village. It had a crazy board
-fence around it, which leaned inward in places, and outward the rest of
-the time, but stood upright nowhere. Grass and weeds grew rank over the
-whole cemetery. All the old graves were sunken in, there was not a
-tombstone on the place; round-topped, worm-eaten boards staggered over
-the graves, leaning for support and finding none. "Sacred to the memory
-of" So-and-So had been painted on them once, but it could no longer
-have been read, on the most of them, now, even if there had been light.
-
-A faint wind moaned through the trees, and Tom feared it might be the
-spirits of the dead, complaining at being disturbed. The boys talked
-little, and only under their breath, for the time and the place and the
-pervading solemnity and silence oppressed their spirits. They found the
-sharp new heap they were seeking, and ensconced themselves within the
-protection of three great elms that grew in a bunch within a few feet
-of the grave.
-
-Then they waited in silence for what seemed a long time. The hooting
-of a distant owl was all the sound that troubled the dead stillness.
-Tom's reflections grew oppressive. He must force some talk. So he said
-in a whisper:
-
-"Hucky, do you believe the dead people like it for us to be here?"
-
-Huckleberry whispered:
-
-"I wisht I knowed. It's awful solemn like, AIN'T it?"
-
-"I bet it is."
-
-There was a considerable pause, while the boys canvassed this matter
-inwardly. Then Tom whispered:
-
-"Say, Hucky--do you reckon Hoss Williams hears us talking?"
-
-"O' course he does. Least his sperrit does."
-
-Tom, after a pause:
-
-"I wish I'd said Mister Williams. But I never meant any harm.
-Everybody calls him Hoss."
-
-"A body can't be too partic'lar how they talk 'bout these-yer dead
-people, Tom."
-
-This was a damper, and conversation died again.
-
-Presently Tom seized his comrade's arm and said:
-
-"Sh!"
-
-"What is it, Tom?" And the two clung together with beating hearts.
-
-"Sh! There 'tis again! Didn't you hear it?"
-
-"I--"
-
-"There! Now you hear it."
-
-"Lord, Tom, they're coming! They're coming, sure. What'll we do?"
-
-"I dono. Think they'll see us?"
-
-"Oh, Tom, they can see in the dark, same as cats. I wisht I hadn't
-come."
-
-"Oh, don't be afeard. I don't believe they'll bother us. We ain't
-doing any harm. If we keep perfectly still, maybe they won't notice us
-at all."
-
-"I'll try to, Tom, but, Lord, I'm all of a shiver."
-
-"Listen!"
-
-The boys bent their heads together and scarcely breathed. A muffled
-sound of voices floated up from the far end of the graveyard.
-
-"Look! See there!" whispered Tom. "What is it?"
-
-"It's devil-fire. Oh, Tom, this is awful."
-
-Some vague figures approached through the gloom, swinging an
-old-fashioned tin lantern that freckled the ground with innumerable
-little spangles of light. Presently Huckleberry whispered with a
-shudder:
-
-"It's the devils sure enough. Three of 'em! Lordy, Tom, we're goners!
-Can you pray?"
-
-"I'll try, but don't you be afeard. They ain't going to hurt us. 'Now
-I lay me down to sleep, I--'"
-
-"Sh!"
-
-"What is it, Huck?"
-
-"They're HUMANS! One of 'em is, anyway. One of 'em's old Muff Potter's
-voice."
-
-"No--'tain't so, is it?"
-
-"I bet I know it. Don't you stir nor budge. He ain't sharp enough to
-notice us. Drunk, the same as usual, likely--blamed old rip!"
-
-"All right, I'll keep still. Now they're stuck. Can't find it. Here
-they come again. Now they're hot. Cold again. Hot again. Red hot!
-They're p'inted right, this time. Say, Huck, I know another o' them
-voices; it's Injun Joe."
-
-"That's so--that murderin' half-breed! I'd druther they was devils a
-dern sight. What kin they be up to?"
-
-The whisper died wholly out, now, for the three men had reached the
-grave and stood within a few feet of the boys' hiding-place.
-
-"Here it is," said the third voice; and the owner of it held the
-lantern up and revealed the face of young Doctor Robinson.
-
-Potter and Injun Joe were carrying a handbarrow with a rope and a
-couple of shovels on it. They cast down their load and began to open
-the grave. The doctor put the lantern at the head of the grave and came
-and sat down with his back against one of the elm trees. He was so
-close the boys could have touched him.
-
-"Hurry, men!" he said, in a low voice; "the moon might come out at any
-moment."
-
-They growled a response and went on digging. For some time there was
-no noise but the grating sound of the spades discharging their freight
-of mould and gravel. It was very monotonous. Finally a spade struck
-upon the coffin with a dull woody accent, and within another minute or
-two the men had hoisted it out on the ground. They pried off the lid
-with their shovels, got out the body and dumped it rudely on the
-ground. The moon drifted from behind the clouds and exposed the pallid
-face. The barrow was got ready and the corpse placed on it, covered
-with a blanket, and bound to its place with the rope. Potter took out a
-large spring-knife and cut off the dangling end of the rope and then
-said:
-
-"Now the cussed thing's ready, Sawbones, and you'll just out with
-another five, or here she stays."
-
-"That's the talk!" said Injun Joe.
-
-"Look here, what does this mean?" said the doctor. "You required your
-pay in advance, and I've paid you."
-
-"Yes, and you done more than that," said Injun Joe, approaching the
-doctor, who was now standing. "Five years ago you drove me away from
-your father's kitchen one night, when I come to ask for something to
-eat, and you said I warn't there for any good; and when I swore I'd get
-even with you if it took a hundred years, your father had me jailed for
-a vagrant. Did you think I'd forget? The Injun blood ain't in me for
-nothing. And now I've GOT you, and you got to SETTLE, you know!"
-
-He was threatening the doctor, with his fist in his face, by this
-time. The doctor struck out suddenly and stretched the ruffian on the
-ground. Potter dropped his knife, and exclaimed:
-
-"Here, now, don't you hit my pard!" and the next moment he had
-grappled with the doctor and the two were struggling with might and
-main, trampling the grass and tearing the ground with their heels.
-Injun Joe sprang to his feet, his eyes flaming with passion, snatched
-up Potter's knife, and went creeping, catlike and stooping, round and
-round about the combatants, seeking an opportunity. All at once the
-doctor flung himself free, seized the heavy headboard of Williams'
-grave and felled Potter to the earth with it--and in the same instant
-the half-breed saw his chance and drove the knife to the hilt in the
-young man's breast. He reeled and fell partly upon Potter, flooding him
-with his blood, and in the same moment the clouds blotted out the
-dreadful spectacle and the two frightened boys went speeding away in
-the dark.
-
-Presently, when the moon emerged again, Injun Joe was standing over
-the two forms, contemplating them. The doctor murmured inarticulately,
-gave a long gasp or two and was still. The half-breed muttered:
-
-"THAT score is settled--damn you."
-
-Then he robbed the body. After which he put the fatal knife in
-Potter's open right hand, and sat down on the dismantled coffin. Three
---four--five minutes passed, and then Potter began to stir and moan. His
-hand closed upon the knife; he raised it, glanced at it, and let it
-fall, with a shudder. Then he sat up, pushing the body from him, and
-gazed at it, and then around him, confusedly. His eyes met Joe's.
-
-"Lord, how is this, Joe?" he said.
-
-"It's a dirty business," said Joe, without moving.
-
-"What did you do it for?"
-
-"I! I never done it!"
-
-"Look here! That kind of talk won't wash."
-
-Potter trembled and grew white.
-
-"I thought I'd got sober. I'd no business to drink to-night. But it's
-in my head yet--worse'n when we started here. I'm all in a muddle;
-can't recollect anything of it, hardly. Tell me, Joe--HONEST, now, old
-feller--did I do it? Joe, I never meant to--'pon my soul and honor, I
-never meant to, Joe. Tell me how it was, Joe. Oh, it's awful--and him
-so young and promising."
-
-"Why, you two was scuffling, and he fetched you one with the headboard
-and you fell flat; and then up you come, all reeling and staggering
-like, and snatched the knife and jammed it into him, just as he fetched
-you another awful clip--and here you've laid, as dead as a wedge til
-now."
-
-"Oh, I didn't know what I was a-doing. I wish I may die this minute if
-I did. It was all on account of the whiskey and the excitement, I
-reckon. I never used a weepon in my life before, Joe. I've fought, but
-never with weepons. They'll all say that. Joe, don't tell! Say you
-won't tell, Joe--that's a good feller. I always liked you, Joe, and
-stood up for you, too. Don't you remember? You WON'T tell, WILL you,
-Joe?" And the poor creature dropped on his knees before the stolid
-murderer, and clasped his appealing hands.
-
-"No, you've always been fair and square with me, Muff Potter, and I
-won't go back on you. There, now, that's as fair as a man can say."
-
-"Oh, Joe, you're an angel. I'll bless you for this the longest day I
-live." And Potter began to cry.
-
-"Come, now, that's enough of that. This ain't any time for blubbering.
-You be off yonder way and I'll go this. Move, now, and don't leave any
-tracks behind you."
-
-Potter started on a trot that quickly increased to a run. The
-half-breed stood looking after him. He muttered:
-
-"If he's as much stunned with the lick and fuddled with the rum as he
-had the look of being, he won't think of the knife till he's gone so
-far he'll be afraid to come back after it to such a place by himself
---chicken-heart!"
-
-Two or three minutes later the murdered man, the blanketed corpse, the
-lidless coffin, and the open grave were under no inspection but the
-moon's. The stillness was complete again, too.
-
-
-
-CHAPTER X
-
-THE two boys flew on and on, toward the village, speechless with
-horror. They glanced backward over their shoulders from time to time,
-apprehensively, as if they feared they might be followed. Every stump
-that started up in their path seemed a man and an enemy, and made them
-catch their breath; and as they sped by some outlying cottages that lay
-near the village, the barking of the aroused watch-dogs seemed to give
-wings to their feet.
-
-"If we can only get to the old tannery before we break down!"
-whispered Tom, in short catches between breaths. "I can't stand it much
-longer."
-
-Huckleberry's hard pantings were his only reply, and the boys fixed
-their eyes on the goal of their hopes and bent to their work to win it.
-They gained steadily on it, and at last, breast to breast, they burst
-through the open door and fell grateful and exhausted in the sheltering
-shadows beyond. By and by their pulses slowed down, and Tom whispered:
-
-"Huckleberry, what do you reckon'll come of this?"
-
-"If Doctor Robinson dies, I reckon hanging'll come of it."
-
-"Do you though?"
-
-"Why, I KNOW it, Tom."
-
-Tom thought a while, then he said:
-
-"Who'll tell? We?"
-
-"What are you talking about? S'pose something happened and Injun Joe
-DIDN'T hang? Why, he'd kill us some time or other, just as dead sure as
-we're a laying here."
-
-"That's just what I was thinking to myself, Huck."
-
-"If anybody tells, let Muff Potter do it, if he's fool enough. He's
-generally drunk enough."
-
-Tom said nothing--went on thinking. Presently he whispered:
-
-"Huck, Muff Potter don't know it. How can he tell?"
-
-"What's the reason he don't know it?"
-
-"Because he'd just got that whack when Injun Joe done it. D'you reckon
-he could see anything? D'you reckon he knowed anything?"
-
-"By hokey, that's so, Tom!"
-
-"And besides, look-a-here--maybe that whack done for HIM!"
-
-"No, 'taint likely, Tom. He had liquor in him; I could see that; and
-besides, he always has. Well, when pap's full, you might take and belt
-him over the head with a church and you couldn't phase him. He says so,
-his own self. So it's the same with Muff Potter, of course. But if a
-man was dead sober, I reckon maybe that whack might fetch him; I dono."
-
-After another reflective silence, Tom said:
-
-"Hucky, you sure you can keep mum?"
-
-"Tom, we GOT to keep mum. You know that. That Injun devil wouldn't
-make any more of drownding us than a couple of cats, if we was to
-squeak 'bout this and they didn't hang him. Now, look-a-here, Tom, less
-take and swear to one another--that's what we got to do--swear to keep
-mum."
-
-"I'm agreed. It's the best thing. Would you just hold hands and swear
-that we--"
-
-"Oh no, that wouldn't do for this. That's good enough for little
-rubbishy common things--specially with gals, cuz THEY go back on you
-anyway, and blab if they get in a huff--but there orter be writing
-'bout a big thing like this. And blood."
-
-Tom's whole being applauded this idea. It was deep, and dark, and
-awful; the hour, the circumstances, the surroundings, were in keeping
-with it. He picked up a clean pine shingle that lay in the moonlight,
-took a little fragment of "red keel" out of his pocket, got the moon on
-his work, and painfully scrawled these lines, emphasizing each slow
-down-stroke by clamping his tongue between his teeth, and letting up
-the pressure on the up-strokes. [See next page.]
-
-   "Huck Finn and
-    Tom Sawyer swears
-    they will keep mum
-    about This and They
-    wish They may Drop
-    down dead in Their
-    Tracks if They ever
-    Tell and Rot."
-
-Huckleberry was filled with admiration of Tom's facility in writing,
-and the sublimity of his language. He at once took a pin from his lapel
-and was going to prick his flesh, but Tom said:
-
-"Hold on! Don't do that. A pin's brass. It might have verdigrease on
-it."
-
-"What's verdigrease?"
-
-"It's p'ison. That's what it is. You just swaller some of it once
---you'll see."
-
-So Tom unwound the thread from one of his needles, and each boy
-pricked the ball of his thumb and squeezed out a drop of blood. In
-time, after many squeezes, Tom managed to sign his initials, using the
-ball of his little finger for a pen. Then he showed Huckleberry how to
-make an H and an F, and the oath was complete. They buried the shingle
-close to the wall, with some dismal ceremonies and incantations, and
-the fetters that bound their tongues were considered to be locked and
-the key thrown away.
-
-A figure crept stealthily through a break in the other end of the
-ruined building, now, but they did not notice it.
-
-"Tom," whispered Huckleberry, "does this keep us from EVER telling
---ALWAYS?"
-
-"Of course it does. It don't make any difference WHAT happens, we got
-to keep mum. We'd drop down dead--don't YOU know that?"
-
-"Yes, I reckon that's so."
-
-They continued to whisper for some little time. Presently a dog set up
-a long, lugubrious howl just outside--within ten feet of them. The boys
-clasped each other suddenly, in an agony of fright.
-
-"Which of us does he mean?" gasped Huckleberry.
-
-"I dono--peep through the crack. Quick!"
-
-"No, YOU, Tom!"
-
-"I can't--I can't DO it, Huck!"
-
-"Please, Tom. There 'tis again!"
-
-"Oh, lordy, I'm thankful!" whispered Tom. "I know his voice. It's Bull
-Harbison." *
-
-[* If Mr. Harbison owned a slave named Bull, Tom would have spoken of
-him as "Harbison's Bull," but a son or a dog of that name was "Bull
-Harbison."]
-
-"Oh, that's good--I tell you, Tom, I was most scared to death; I'd a
-bet anything it was a STRAY dog."
-
-The dog howled again. The boys' hearts sank once more.
-
-"Oh, my! that ain't no Bull Harbison!" whispered Huckleberry. "DO, Tom!"
-
-Tom, quaking with fear, yielded, and put his eye to the crack. His
-whisper was hardly audible when he said:
-
-"Oh, Huck, IT S A STRAY DOG!"
-
-"Quick, Tom, quick! Who does he mean?"
-
-"Huck, he must mean us both--we're right together."
-
-"Oh, Tom, I reckon we're goners. I reckon there ain't no mistake 'bout
-where I'LL go to. I been so wicked."
-
-"Dad fetch it! This comes of playing hookey and doing everything a
-feller's told NOT to do. I might a been good, like Sid, if I'd a tried
---but no, I wouldn't, of course. But if ever I get off this time, I lay
-I'll just WALLER in Sunday-schools!" And Tom began to snuffle a little.
-
-"YOU bad!" and Huckleberry began to snuffle too. "Consound it, Tom
-Sawyer, you're just old pie, 'longside o' what I am. Oh, LORDY, lordy,
-lordy, I wisht I only had half your chance."
-
-Tom choked off and whispered:
-
-"Look, Hucky, look! He's got his BACK to us!"
-
-Hucky looked, with joy in his heart.
-
-"Well, he has, by jingoes! Did he before?"
-
-"Yes, he did. But I, like a fool, never thought. Oh, this is bully,
-you know. NOW who can he mean?"
-
-The howling stopped. Tom pricked up his ears.
-
-"Sh! What's that?" he whispered.
-
-"Sounds like--like hogs grunting. No--it's somebody snoring, Tom."
-
-"That IS it! Where 'bouts is it, Huck?"
-
-"I bleeve it's down at 'tother end. Sounds so, anyway. Pap used to
-sleep there, sometimes, 'long with the hogs, but laws bless you, he
-just lifts things when HE snores. Besides, I reckon he ain't ever
-coming back to this town any more."
-
-The spirit of adventure rose in the boys' souls once more.
-
-"Hucky, do you das't to go if I lead?"
-
-"I don't like to, much. Tom, s'pose it's Injun Joe!"
-
-Tom quailed. But presently the temptation rose up strong again and the
-boys agreed to try, with the understanding that they would take to
-their heels if the snoring stopped. So they went tiptoeing stealthily
-down, the one behind the other. When they had got to within five steps
-of the snorer, Tom stepped on a stick, and it broke with a sharp snap.
-The man moaned, writhed a little, and his face came into the moonlight.
-It was Muff Potter. The boys' hearts had stood still, and their hopes
-too, when the man moved, but their fears passed away now. They tiptoed
-out, through the broken weather-boarding, and stopped at a little
-distance to exchange a parting word. That long, lugubrious howl rose on
-the night air again! They turned and saw the strange dog standing
-within a few feet of where Potter was lying, and FACING Potter, with
-his nose pointing heavenward.
-
-"Oh, geeminy, it's HIM!" exclaimed both boys, in a breath.
-
-"Say, Tom--they say a stray dog come howling around Johnny Miller's
-house, 'bout midnight, as much as two weeks ago; and a whippoorwill
-come in and lit on the banisters and sung, the very same evening; and
-there ain't anybody dead there yet."
-
-"Well, I know that. And suppose there ain't. Didn't Gracie Miller fall
-in the kitchen fire and burn herself terrible the very next Saturday?"
-
-"Yes, but she ain't DEAD. And what's more, she's getting better, too."
-
-"All right, you wait and see. She's a goner, just as dead sure as Muff
-Potter's a goner. That's what the niggers say, and they know all about
-these kind of things, Huck."
-
-Then they separated, cogitating. When Tom crept in at his bedroom
-window the night was almost spent. He undressed with excessive caution,
-and fell asleep congratulating himself that nobody knew of his
-escapade. He was not aware that the gently-snoring Sid was awake, and
-had been so for an hour.
-
-When Tom awoke, Sid was dressed and gone. There was a late look in the
-light, a late sense in the atmosphere. He was startled. Why had he not
-been called--persecuted till he was up, as usual? The thought filled
-him with bodings. Within five minutes he was dressed and down-stairs,
-feeling sore and drowsy. The family were still at table, but they had
-finished breakfast. There was no voice of rebuke; but there were
-averted eyes; there was a silence and an air of solemnity that struck a
-chill to the culprit's heart. He sat down and tried to seem gay, but it
-was up-hill work; it roused no smile, no response, and he lapsed into
-silence and let his heart sink down to the depths.
-
-After breakfast his aunt took him aside, and Tom almost brightened in
-the hope that he was going to be flogged; but it was not so. His aunt
-wept over him and asked him how he could go and break her old heart so;
-and finally told him to go on, and ruin himself and bring her gray
-hairs with sorrow to the grave, for it was no use for her to try any
-more. This was worse than a thousand whippings, and Tom's heart was
-sorer now than his body. He cried, he pleaded for forgiveness, promised
-to reform over and over again, and then received his dismissal, feeling
-that he had won but an imperfect forgiveness and established but a
-feeble confidence.
-
-He left the presence too miserable to even feel revengeful toward Sid;
-and so the latter's prompt retreat through the back gate was
-unnecessary. He moped to school gloomy and sad, and took his flogging,
-along with Joe Harper, for playing hookey the day before, with the air
-of one whose heart was busy with heavier woes and wholly dead to
-trifles. Then he betook himself to his seat, rested his elbows on his
-desk and his jaws in his hands, and stared at the wall with the stony
-stare of suffering that has reached the limit and can no further go.
-His elbow was pressing against some hard substance. After a long time
-he slowly and sadly changed his position, and took up this object with
-a sigh. It was in a paper. He unrolled it. A long, lingering, colossal
-sigh followed, and his heart broke. It was his brass andiron knob!
-
-This final feather broke the camel's back.
-
-
-
-CHAPTER XI
-
-CLOSE upon the hour of noon the whole village was suddenly electrified
-with the ghastly news. No need of the as yet undreamed-of telegraph;
-the tale flew from man to man, from group to group, from house to
-house, with little less than telegraphic speed. Of course the
-schoolmaster gave holiday for that afternoon; the town would have
-thought strangely of him if he had not.
-
-A gory knife had been found close to the murdered man, and it had been
-recognized by somebody as belonging to Muff Potter--so the story ran.
-And it was said that a belated citizen had come upon Potter washing
-himself in the "branch" about one or two o'clock in the morning, and
-that Potter had at once sneaked off--suspicious circumstances,
-especially the washing which was not a habit with Potter. It was also
-said that the town had been ransacked for this "murderer" (the public
-are not slow in the matter of sifting evidence and arriving at a
-verdict), but that he could not be found. Horsemen had departed down
-all the roads in every direction, and the Sheriff "was confident" that
-he would be captured before night.
-
-All the town was drifting toward the graveyard. Tom's heartbreak
-vanished and he joined the procession, not because he would not a
-thousand times rather go anywhere else, but because an awful,
-unaccountable fascination drew him on. Arrived at the dreadful place,
-he wormed his small body through the crowd and saw the dismal
-spectacle. It seemed to him an age since he was there before. Somebody
-pinched his arm. He turned, and his eyes met Huckleberry's. Then both
-looked elsewhere at once, and wondered if anybody had noticed anything
-in their mutual glance. But everybody was talking, and intent upon the
-grisly spectacle before them.
-
-"Poor fellow!" "Poor young fellow!" "This ought to be a lesson to
-grave robbers!" "Muff Potter'll hang for this if they catch him!" This
-was the drift of remark; and the minister said, "It was a judgment; His
-hand is here."
-
-Now Tom shivered from head to heel; for his eye fell upon the stolid
-face of Injun Joe. At this moment the crowd began to sway and struggle,
-and voices shouted, "It's him! it's him! he's coming himself!"
-
-"Who? Who?" from twenty voices.
-
-"Muff Potter!"
-
-"Hallo, he's stopped!--Look out, he's turning! Don't let him get away!"
-
-People in the branches of the trees over Tom's head said he wasn't
-trying to get away--he only looked doubtful and perplexed.
-
-"Infernal impudence!" said a bystander; "wanted to come and take a
-quiet look at his work, I reckon--didn't expect any company."
-
-The crowd fell apart, now, and the Sheriff came through,
-ostentatiously leading Potter by the arm. The poor fellow's face was
-haggard, and his eyes showed the fear that was upon him. When he stood
-before the murdered man, he shook as with a palsy, and he put his face
-in his hands and burst into tears.
-
-"I didn't do it, friends," he sobbed; "'pon my word and honor I never
-done it."
-
-"Who's accused you?" shouted a voice.
-
-This shot seemed to carry home. Potter lifted his face and looked
-around him with a pathetic hopelessness in his eyes. He saw Injun Joe,
-and exclaimed:
-
-"Oh, Injun Joe, you promised me you'd never--"
-
-"Is that your knife?" and it was thrust before him by the Sheriff.
-
-Potter would have fallen if they had not caught him and eased him to
-the ground. Then he said:
-
-"Something told me 't if I didn't come back and get--" He shuddered;
-then waved his nerveless hand with a vanquished gesture and said, "Tell
-'em, Joe, tell 'em--it ain't any use any more."
-
-Then Huckleberry and Tom stood dumb and staring, and heard the
-stony-hearted liar reel off his serene statement, they expecting every
-moment that the clear sky would deliver God's lightnings upon his head,
-and wondering to see how long the stroke was delayed. And when he had
-finished and still stood alive and whole, their wavering impulse to
-break their oath and save the poor betrayed prisoner's life faded and
-vanished away, for plainly this miscreant had sold himself to Satan and
-it would be fatal to meddle with the property of such a power as that.
-
-"Why didn't you leave? What did you want to come here for?" somebody
-said.
-
-"I couldn't help it--I couldn't help it," Potter moaned. "I wanted to
-run away, but I couldn't seem to come anywhere but here." And he fell
-to sobbing again.
-
-Injun Joe repeated his statement, just as calmly, a few minutes
-afterward on the inquest, under oath; and the boys, seeing that the
-lightnings were still withheld, were confirmed in their belief that Joe
-had sold himself to the devil. He was now become, to them, the most
-balefully interesting object they had ever looked upon, and they could
-not take their fascinated eyes from his face.
-
-They inwardly resolved to watch him nights, when opportunity should
-offer, in the hope of getting a glimpse of his dread master.
-
-Injun Joe helped to raise the body of the murdered man and put it in a
-wagon for removal; and it was whispered through the shuddering crowd
-that the wound bled a little! The boys thought that this happy
-circumstance would turn suspicion in the right direction; but they were
-disappointed, for more than one villager remarked:
-
-"It was within three feet of Muff Potter when it done it."
-
-Tom's fearful secret and gnawing conscience disturbed his sleep for as
-much as a week after this; and at breakfast one morning Sid said:
-
-"Tom, you pitch around and talk in your sleep so much that you keep me
-awake half the time."
-
-Tom blanched and dropped his eyes.
-
-"It's a bad sign," said Aunt Polly, gravely. "What you got on your
-mind, Tom?"
-
-"Nothing. Nothing 't I know of." But the boy's hand shook so that he
-spilled his coffee.
-
-"And you do talk such stuff," Sid said. "Last night you said, 'It's
-blood, it's blood, that's what it is!' You said that over and over. And
-you said, 'Don't torment me so--I'll tell!' Tell WHAT? What is it
-you'll tell?"
-
-Everything was swimming before Tom. There is no telling what might
-have happened, now, but luckily the concern passed out of Aunt Polly's
-face and she came to Tom's relief without knowing it. She said:
-
-"Sho! It's that dreadful murder. I dream about it most every night
-myself. Sometimes I dream it's me that done it."
-
-Mary said she had been affected much the same way. Sid seemed
-satisfied. Tom got out of the presence as quick as he plausibly could,
-and after that he complained of toothache for a week, and tied up his
-jaws every night. He never knew that Sid lay nightly watching, and
-frequently slipped the bandage free and then leaned on his elbow
-listening a good while at a time, and afterward slipped the bandage
-back to its place again. Tom's distress of mind wore off gradually and
-the toothache grew irksome and was discarded. If Sid really managed to
-make anything out of Tom's disjointed mutterings, he kept it to himself.
-
-It seemed to Tom that his schoolmates never would get done holding
-inquests on dead cats, and thus keeping his trouble present to his
-mind. Sid noticed that Tom never was coroner at one of these inquiries,
-though it had been his habit to take the lead in all new enterprises;
-he noticed, too, that Tom never acted as a witness--and that was
-strange; and Sid did not overlook the fact that Tom even showed a
-marked aversion to these inquests, and always avoided them when he
-could. Sid marvelled, but said nothing. However, even inquests went out
-of vogue at last, and ceased to torture Tom's conscience.
-
-Every day or two, during this time of sorrow, Tom watched his
-opportunity and went to the little grated jail-window and smuggled such
-small comforts through to the "murderer" as he could get hold of. The
-jail was a trifling little brick den that stood in a marsh at the edge
-of the village, and no guards were afforded for it; indeed, it was
-seldom occupied. These offerings greatly helped to ease Tom's
-conscience.
-
-The villagers had a strong desire to tar-and-feather Injun Joe and
-ride him on a rail, for body-snatching, but so formidable was his
-character that nobody could be found who was willing to take the lead
-in the matter, so it was dropped. He had been careful to begin both of
-his inquest-statements with the fight, without confessing the
-grave-robbery that preceded it; therefore it was deemed wisest not
-to try the case in the courts at present.
-
-
-
-CHAPTER XII
-
-ONE of the reasons why Tom's mind had drifted away from its secret
-troubles was, that it had found a new and weighty matter to interest
-itself about. Becky Thatcher had stopped coming to school. Tom had
-struggled with his pride a few days, and tried to "whistle her down the
-wind," but failed. He began to find himself hanging around her father's
-house, nights, and feeling very miserable. She was ill. What if she
-should die! There was distraction in the thought. He no longer took an
-interest in war, nor even in piracy. The charm of life was gone; there
-was nothing but dreariness left. He put his hoop away, and his bat;
-there was no joy in them any more. His aunt was concerned. She began to
-try all manner of remedies on him. She was one of those people who are
-infatuated with patent medicines and all new-fangled methods of
-producing health or mending it. She was an inveterate experimenter in
-these things. When something fresh in this line came out she was in a
-fever, right away, to try it; not on herself, for she was never ailing,
-but on anybody else that came handy. She was a subscriber for all the
-"Health" periodicals and phrenological frauds; and the solemn ignorance
-they were inflated with was breath to her nostrils. All the "rot" they
-contained about ventilation, and how to go to bed, and how to get up,
-and what to eat, and what to drink, and how much exercise to take, and
-what frame of mind to keep one's self in, and what sort of clothing to
-wear, was all gospel to her, and she never observed that her
-health-journals of the current month customarily upset everything they
-had recommended the month before. She was as simple-hearted and honest
-as the day was long, and so she was an easy victim. She gathered
-together her quack periodicals and her quack medicines, and thus armed
-with death, went about on her pale horse, metaphorically speaking, with
-"hell following after." But she never suspected that she was not an
-angel of healing and the balm of Gilead in disguise, to the suffering
-neighbors.
-
-The water treatment was new, now, and Tom's low condition was a
-windfall to her. She had him out at daylight every morning, stood him
-up in the woodshed and drowned him with a deluge of cold water; then
-she scrubbed him down with a towel like a file, and so brought him to;
-then she rolled him up in a wet sheet and put him away under blankets
-till she sweated his soul clean and "the yellow stains of it came
-through his pores"--as Tom said.
-
-Yet notwithstanding all this, the boy grew more and more melancholy
-and pale and dejected. She added hot baths, sitz baths, shower baths,
-and plunges. The boy remained as dismal as a hearse. She began to
-assist the water with a slim oatmeal diet and blister-plasters. She
-calculated his capacity as she would a jug's, and filled him up every
-day with quack cure-alls.
-
-Tom had become indifferent to persecution by this time. This phase
-filled the old lady's heart with consternation. This indifference must
-be broken up at any cost. Now she heard of Pain-killer for the first
-time. She ordered a lot at once. She tasted it and was filled with
-gratitude. It was simply fire in a liquid form. She dropped the water
-treatment and everything else, and pinned her faith to Pain-killer. She
-gave Tom a teaspoonful and watched with the deepest anxiety for the
-result. Her troubles were instantly at rest, her soul at peace again;
-for the "indifference" was broken up. The boy could not have shown a
-wilder, heartier interest, if she had built a fire under him.
-
-Tom felt that it was time to wake up; this sort of life might be
-romantic enough, in his blighted condition, but it was getting to have
-too little sentiment and too much distracting variety about it. So he
-thought over various plans for relief, and finally hit pon that of
-professing to be fond of Pain-killer. He asked for it so often that he
-became a nuisance, and his aunt ended by telling him to help himself
-and quit bothering her. If it had been Sid, she would have had no
-misgivings to alloy her delight; but since it was Tom, she watched the
-bottle clandestinely. She found that the medicine did really diminish,
-but it did not occur to her that the boy was mending the health of a
-crack in the sitting-room floor with it.
-
-One day Tom was in the act of dosing the crack when his aunt's yellow
-cat came along, purring, eying the teaspoon avariciously, and begging
-for a taste. Tom said:
-
-"Don't ask for it unless you want it, Peter."
-
-But Peter signified that he did want it.
-
-"You better make sure."
-
-Peter was sure.
-
-"Now you've asked for it, and I'll give it to you, because there ain't
-anything mean about me; but if you find you don't like it, you mustn't
-blame anybody but your own self."
-
-Peter was agreeable. So Tom pried his mouth open and poured down the
-Pain-killer. Peter sprang a couple of yards in the air, and then
-delivered a war-whoop and set off round and round the room, banging
-against furniture, upsetting flower-pots, and making general havoc.
-Next he rose on his hind feet and pranced around, in a frenzy of
-enjoyment, with his head over his shoulder and his voice proclaiming
-his unappeasable happiness. Then he went tearing around the house again
-spreading chaos and destruction in his path. Aunt Polly entered in time
-to see him throw a few double summersets, deliver a final mighty
-hurrah, and sail through the open window, carrying the rest of the
-flower-pots with him. The old lady stood petrified with astonishment,
-peering over her glasses; Tom lay on the floor expiring with laughter.
-
-"Tom, what on earth ails that cat?"
-
-"I don't know, aunt," gasped the boy.
-
-"Why, I never see anything like it. What did make him act so?"
-
-"Deed I don't know, Aunt Polly; cats always act so when they're having
-a good time."
-
-"They do, do they?" There was something in the tone that made Tom
-apprehensive.
-
-"Yes'm. That is, I believe they do."
-
-"You DO?"
-
-"Yes'm."
-
-The old lady was bending down, Tom watching, with interest emphasized
-by anxiety. Too late he divined her "drift." The handle of the telltale
-teaspoon was visible under the bed-valance. Aunt Polly took it, held it
-up. Tom winced, and dropped his eyes. Aunt Polly raised him by the
-usual handle--his ear--and cracked his head soundly with her thimble.
-
-"Now, sir, what did you want to treat that poor dumb beast so, for?"
-
-"I done it out of pity for him--because he hadn't any aunt."
-
-"Hadn't any aunt!--you numskull. What has that got to do with it?"
-
-"Heaps. Because if he'd had one she'd a burnt him out herself! She'd a
-roasted his bowels out of him 'thout any more feeling than if he was a
-human!"
-
-Aunt Polly felt a sudden pang of remorse. This was putting the thing
-in a new light; what was cruelty to a cat MIGHT be cruelty to a boy,
-too. She began to soften; she felt sorry. Her eyes watered a little,
-and she put her hand on Tom's head and said gently:
-
-"I was meaning for the best, Tom. And, Tom, it DID do you good."
-
-Tom looked up in her face with just a perceptible twinkle peeping
-through his gravity.
-
-"I know you was meaning for the best, aunty, and so was I with Peter.
-It done HIM good, too. I never see him get around so since--"
-
-"Oh, go 'long with you, Tom, before you aggravate me again. And you
-try and see if you can't be a good boy, for once, and you needn't take
-any more medicine."
-
-Tom reached school ahead of time. It was noticed that this strange
-thing had been occurring every day latterly. And now, as usual of late,
-he hung about the gate of the schoolyard instead of playing with his
-comrades. He was sick, he said, and he looked it. He tried to seem to
-be looking everywhere but whither he really was looking--down the road.
-Presently Jeff Thatcher hove in sight, and Tom's face lighted; he gazed
-a moment, and then turned sorrowfully away. When Jeff arrived, Tom
-accosted him; and "led up" warily to opportunities for remark about
-Becky, but the giddy lad never could see the bait. Tom watched and
-watched, hoping whenever a frisking frock came in sight, and hating the
-owner of it as soon as he saw she was not the right one. At last frocks
-ceased to appear, and he dropped hopelessly into the dumps; he entered
-the empty schoolhouse and sat down to suffer. Then one more frock
-passed in at the gate, and Tom's heart gave a great bound. The next
-instant he was out, and "going on" like an Indian; yelling, laughing,
-chasing boys, jumping over the fence at risk of life and limb, throwing
-handsprings, standing on his head--doing all the heroic things he could
-conceive of, and keeping a furtive eye out, all the while, to see if
-Becky Thatcher was noticing. But she seemed to be unconscious of it
-all; she never looked. Could it be possible that she was not aware that
-he was there? He carried his exploits to her immediate vicinity; came
-war-whooping around, snatched a boy's cap, hurled it to the roof of the
-schoolhouse, broke through a group of boys, tumbling them in every
-direction, and fell sprawling, himself, under Becky's nose, almost
-upsetting her--and she turned, with her nose in the air, and he heard
-her say: "Mf! some people think they're mighty smart--always showing
-off!"
-
-Tom's cheeks burned. He gathered himself up and sneaked off, crushed
-and crestfallen.
-
-
-
-CHAPTER XIII
-
-TOM'S mind was made up now. He was gloomy and desperate. He was a
-forsaken, friendless boy, he said; nobody loved him; when they found
-out what they had driven him to, perhaps they would be sorry; he had
-tried to do right and get along, but they would not let him; since
-nothing would do them but to be rid of him, let it be so; and let them
-blame HIM for the consequences--why shouldn't they? What right had the
-friendless to complain? Yes, they had forced him to it at last: he
-would lead a life of crime. There was no choice.
-
-By this time he was far down Meadow Lane, and the bell for school to
-"take up" tinkled faintly upon his ear. He sobbed, now, to think he
-should never, never hear that old familiar sound any more--it was very
-hard, but it was forced on him; since he was driven out into the cold
-world, he must submit--but he forgave them. Then the sobs came thick
-and fast.
-
-Just at this point he met his soul's sworn comrade, Joe Harper
---hard-eyed, and with evidently a great and dismal purpose in his heart.
-Plainly here were "two souls with but a single thought." Tom, wiping
-his eyes with his sleeve, began to blubber out something about a
-resolution to escape from hard usage and lack of sympathy at home by
-roaming abroad into the great world never to return; and ended by
-hoping that Joe would not forget him.
-
-But it transpired that this was a request which Joe had just been
-going to make of Tom, and had come to hunt him up for that purpose. His
-mother had whipped him for drinking some cream which he had never
-tasted and knew nothing about; it was plain that she was tired of him
-and wished him to go; if she felt that way, there was nothing for him
-to do but succumb; he hoped she would be happy, and never regret having
-driven her poor boy out into the unfeeling world to suffer and die.
-
-As the two boys walked sorrowing along, they made a new compact to
-stand by each other and be brothers and never separate till death
-relieved them of their troubles. Then they began to lay their plans.
-Joe was for being a hermit, and living on crusts in a remote cave, and
-dying, some time, of cold and want and grief; but after listening to
-Tom, he conceded that there were some conspicuous advantages about a
-life of crime, and so he consented to be a pirate.
-
-Three miles below St. Petersburg, at a point where the Mississippi
-River was a trifle over a mile wide, there was a long, narrow, wooded
-island, with a shallow bar at the head of it, and this offered well as
-a rendezvous. It was not inhabited; it lay far over toward the further
-shore, abreast a dense and almost wholly unpeopled forest. So Jackson's
-Island was chosen. Who were to be the subjects of their piracies was a
-matter that did not occur to them. Then they hunted up Huckleberry
-Finn, and he joined them promptly, for all careers were one to him; he
-was indifferent. They presently separated to meet at a lonely spot on
-the river-bank two miles above the village at the favorite hour--which
-was midnight. There was a small log raft there which they meant to
-capture. Each would bring hooks and lines, and such provision as he
-could steal in the most dark and mysterious way--as became outlaws. And
-before the afternoon was done, they had all managed to enjoy the sweet
-glory of spreading the fact that pretty soon the town would "hear
-something." All who got this vague hint were cautioned to "be mum and
-wait."
-
-About midnight Tom arrived with a boiled ham and a few trifles,
-and stopped in a dense undergrowth on a small bluff overlooking the
-meeting-place. It was starlight, and very still. The mighty river lay
-like an ocean at rest. Tom listened a moment, but no sound disturbed the
-quiet. Then he gave a low, distinct whistle. It was answered from under
-the bluff. Tom whistled twice more; these signals were answered in the
-same way. Then a guarded voice said:
-
-"Who goes there?"
-
-"Tom Sawyer, the Black Avenger of the Spanish Main. Name your names."
-
-"Huck Finn the Red-Handed, and Joe Harper the Terror of the Seas." Tom
-had furnished these titles, from his favorite literature.
-
-"'Tis well. Give the countersign."
-
-Two hoarse whispers delivered the same awful word simultaneously to
-the brooding night:
-
-"BLOOD!"
-
-Then Tom tumbled his ham over the bluff and let himself down after it,
-tearing both skin and clothes to some extent in the effort. There was
-an easy, comfortable path along the shore under the bluff, but it
-lacked the advantages of difficulty and danger so valued by a pirate.
-
-The Terror of the Seas had brought a side of bacon, and had about worn
-himself out with getting it there. Finn the Red-Handed had stolen a
-skillet and a quantity of half-cured leaf tobacco, and had also brought
-a few corn-cobs to make pipes with. But none of the pirates smoked or
-"chewed" but himself. The Black Avenger of the Spanish Main said it
-would never do to start without some fire. That was a wise thought;
-matches were hardly known there in that day. They saw a fire
-smouldering upon a great raft a hundred yards above, and they went
-stealthily thither and helped themselves to a chunk. They made an
-imposing adventure of it, saying, "Hist!" every now and then, and
-suddenly halting with finger on lip; moving with hands on imaginary
-dagger-hilts; and giving orders in dismal whispers that if "the foe"
-stirred, to "let him have it to the hilt," because "dead men tell no
-tales." They knew well enough that the raftsmen were all down at the
-village laying in stores or having a spree, but still that was no
-excuse for their conducting this thing in an unpiratical way.
-
-They shoved off, presently, Tom in command, Huck at the after oar and
-Joe at the forward. Tom stood amidships, gloomy-browed, and with folded
-arms, and gave his orders in a low, stern whisper:
-
-"Luff, and bring her to the wind!"
-
-"Aye-aye, sir!"
-
-"Steady, steady-y-y-y!"
-
-"Steady it is, sir!"
-
-"Let her go off a point!"
-
-"Point it is, sir!"
-
-As the boys steadily and monotonously drove the raft toward mid-stream
-it was no doubt understood that these orders were given only for
-"style," and were not intended to mean anything in particular.
-
-"What sail's she carrying?"
-
-"Courses, tops'ls, and flying-jib, sir."
-
-"Send the r'yals up! Lay out aloft, there, half a dozen of ye
---foretopmaststuns'l! Lively, now!"
-
-"Aye-aye, sir!"
-
-"Shake out that maintogalans'l! Sheets and braces! NOW my hearties!"
-
-"Aye-aye, sir!"
-
-"Hellum-a-lee--hard a port! Stand by to meet her when she comes! Port,
-port! NOW, men! With a will! Stead-y-y-y!"
-
-"Steady it is, sir!"
-
-The raft drew beyond the middle of the river; the boys pointed her
-head right, and then lay on their oars. The river was not high, so
-there was not more than a two or three mile current. Hardly a word was
-said during the next three-quarters of an hour. Now the raft was
-passing before the distant town. Two or three glimmering lights showed
-where it lay, peacefully sleeping, beyond the vague vast sweep of
-star-gemmed water, unconscious of the tremendous event that was happening.
-The Black Avenger stood still with folded arms, "looking his last" upon
-the scene of his former joys and his later sufferings, and wishing
-"she" could see him now, abroad on the wild sea, facing peril and death
-with dauntless heart, going to his doom with a grim smile on his lips.
-It was but a small strain on his imagination to remove Jackson's Island
-beyond eyeshot of the village, and so he "looked his last" with a
-broken and satisfied heart. The other pirates were looking their last,
-too; and they all looked so long that they came near letting the
-current drift them out of the range of the island. But they discovered
-the danger in time, and made shift to avert it. About two o'clock in
-the morning the raft grounded on the bar two hundred yards above the
-head of the island, and they waded back and forth until they had landed
-their freight. Part of the little raft's belongings consisted of an old
-sail, and this they spread over a nook in the bushes for a tent to
-shelter their provisions; but they themselves would sleep in the open
-air in good weather, as became outlaws.
-
-They built a fire against the side of a great log twenty or thirty
-steps within the sombre depths of the forest, and then cooked some
-bacon in the frying-pan for supper, and used up half of the corn "pone"
-stock they had brought. It seemed glorious sport to be feasting in that
-wild, free way in the virgin forest of an unexplored and uninhabited
-island, far from the haunts of men, and they said they never would
-return to civilization. The climbing fire lit up their faces and threw
-its ruddy glare upon the pillared tree-trunks of their forest temple,
-and upon the varnished foliage and festooning vines.
-
-When the last crisp slice of bacon was gone, and the last allowance of
-corn pone devoured, the boys stretched themselves out on the grass,
-filled with contentment. They could have found a cooler place, but they
-would not deny themselves such a romantic feature as the roasting
-camp-fire.
-
-"AIN'T it gay?" said Joe.
-
-"It's NUTS!" said Tom. "What would the boys say if they could see us?"
-
-"Say? Well, they'd just die to be here--hey, Hucky!"
-
-"I reckon so," said Huckleberry; "anyways, I'm suited. I don't want
-nothing better'n this. I don't ever get enough to eat, gen'ally--and
-here they can't come and pick at a feller and bullyrag him so."
-
-"It's just the life for me," said Tom. "You don't have to get up,
-mornings, and you don't have to go to school, and wash, and all that
-blame foolishness. You see a pirate don't have to do ANYTHING, Joe,
-when he's ashore, but a hermit HE has to be praying considerable, and
-then he don't have any fun, anyway, all by himself that way."
-
-"Oh yes, that's so," said Joe, "but I hadn't thought much about it,
-you know. I'd a good deal rather be a pirate, now that I've tried it."
-
-"You see," said Tom, "people don't go much on hermits, nowadays, like
-they used to in old times, but a pirate's always respected. And a
-hermit's got to sleep on the hardest place he can find, and put
-sackcloth and ashes on his head, and stand out in the rain, and--"
-
-"What does he put sackcloth and ashes on his head for?" inquired Huck.
-
-"I dono. But they've GOT to do it. Hermits always do. You'd have to do
-that if you was a hermit."
-
-"Dern'd if I would," said Huck.
-
-"Well, what would you do?"
-
-"I dono. But I wouldn't do that."
-
-"Why, Huck, you'd HAVE to. How'd you get around it?"
-
-"Why, I just wouldn't stand it. I'd run away."
-
-"Run away! Well, you WOULD be a nice old slouch of a hermit. You'd be
-a disgrace."
-
-The Red-Handed made no response, being better employed. He had
-finished gouging out a cob, and now he fitted a weed stem to it, loaded
-it with tobacco, and was pressing a coal to the charge and blowing a
-cloud of fragrant smoke--he was in the full bloom of luxurious
-contentment. The other pirates envied him this majestic vice, and
-secretly resolved to acquire it shortly. Presently Huck said:
-
-"What does pirates have to do?"
-
-Tom said:
-
-"Oh, they have just a bully time--take ships and burn them, and get
-the money and bury it in awful places in their island where there's
-ghosts and things to watch it, and kill everybody in the ships--make
-'em walk a plank."
-
-"And they carry the women to the island," said Joe; "they don't kill
-the women."
-
-"No," assented Tom, "they don't kill the women--they're too noble. And
-the women's always beautiful, too.
-
-"And don't they wear the bulliest clothes! Oh no! All gold and silver
-and di'monds," said Joe, with enthusiasm.
-
-"Who?" said Huck.
-
-"Why, the pirates."
-
-Huck scanned his own clothing forlornly.
-
-"I reckon I ain't dressed fitten for a pirate," said he, with a
-regretful pathos in his voice; "but I ain't got none but these."
-
-But the other boys told him the fine clothes would come fast enough,
-after they should have begun their adventures. They made him understand
-that his poor rags would do to begin with, though it was customary for
-wealthy pirates to start with a proper wardrobe.
-
-Gradually their talk died out and drowsiness began to steal upon the
-eyelids of the little waifs. The pipe dropped from the fingers of the
-Red-Handed, and he slept the sleep of the conscience-free and the
-weary. The Terror of the Seas and the Black Avenger of the Spanish Main
-had more difficulty in getting to sleep. They said their prayers
-inwardly, and lying down, since there was nobody there with authority
-to make them kneel and recite aloud; in truth, they had a mind not to
-say them at all, but they were afraid to proceed to such lengths as
-that, lest they might call down a sudden and special thunderbolt from
-heaven. Then at once they reached and hovered upon the imminent verge
-of sleep--but an intruder came, now, that would not "down." It was
-conscience. They began to feel a vague fear that they had been doing
-wrong to run away; and next they thought of the stolen meat, and then
-the real torture came. They tried to argue it away by reminding
-conscience that they had purloined sweetmeats and apples scores of
-times; but conscience was not to be appeased by such thin
-plausibilities; it seemed to them, in the end, that there was no
-getting around the stubborn fact that taking sweetmeats was only
-"hooking," while taking bacon and hams and such valuables was plain
-simple stealing--and there was a command against that in the Bible. So
-they inwardly resolved that so long as they remained in the business,
-their piracies should not again be sullied with the crime of stealing.
-Then conscience granted a truce, and these curiously inconsistent
-pirates fell peacefully to sleep.
-
-
-
-CHAPTER XIV
-
-WHEN Tom awoke in the morning, he wondered where he was. He sat up and
-rubbed his eyes and looked around. Then he comprehended. It was the
-cool gray dawn, and there was a delicious sense of repose and peace in
-the deep pervading calm and silence of the woods. Not a leaf stirred;
-not a sound obtruded upon great Nature's meditation. Beaded dewdrops
-stood upon the leaves and grasses. A white layer of ashes covered the
-fire, and a thin blue breath of smoke rose straight into the air. Joe
-and Huck still slept.
-
-Now, far away in the woods a bird called; another answered; presently
-the hammering of a woodpecker was heard. Gradually the cool dim gray of
-the morning whitened, and as gradually sounds multiplied and life
-manifested itself. The marvel of Nature shaking off sleep and going to
-work unfolded itself to the musing boy. A little green worm came
-crawling over a dewy leaf, lifting two-thirds of his body into the air
-from time to time and "sniffing around," then proceeding again--for he
-was measuring, Tom said; and when the worm approached him, of its own
-accord, he sat as still as a stone, with his hopes rising and falling,
-by turns, as the creature still came toward him or seemed inclined to
-go elsewhere; and when at last it considered a painful moment with its
-curved body in the air and then came decisively down upon Tom's leg and
-began a journey over him, his whole heart was glad--for that meant that
-he was going to have a new suit of clothes--without the shadow of a
-doubt a gaudy piratical uniform. Now a procession of ants appeared,
-from nowhere in particular, and went about their labors; one struggled
-manfully by with a dead spider five times as big as itself in its arms,
-and lugged it straight up a tree-trunk. A brown spotted lady-bug
-climbed the dizzy height of a grass blade, and Tom bent down close to
-it and said, "Lady-bug, lady-bug, fly away home, your house is on fire,
-your children's alone," and she took wing and went off to see about it
---which did not surprise the boy, for he knew of old that this insect was
-credulous about conflagrations, and he had practised upon its
-simplicity more than once. A tumblebug came next, heaving sturdily at
-its ball, and Tom touched the creature, to see it shut its legs against
-its body and pretend to be dead. The birds were fairly rioting by this
-time. A catbird, the Northern mocker, lit in a tree over Tom's head,
-and trilled out her imitations of her neighbors in a rapture of
-enjoyment; then a shrill jay swept down, a flash of blue flame, and
-stopped on a twig almost within the boy's reach, cocked his head to one
-side and eyed the strangers with a consuming curiosity; a gray squirrel
-and a big fellow of the "fox" kind came skurrying along, sitting up at
-intervals to inspect and chatter at the boys, for the wild things had
-probably never seen a human being before and scarcely knew whether to
-be afraid or not. All Nature was wide awake and stirring, now; long
-lances of sunlight pierced down through the dense foliage far and near,
-and a few butterflies came fluttering upon the scene.
-
-Tom stirred up the other pirates and they all clattered away with a
-shout, and in a minute or two were stripped and chasing after and
-tumbling over each other in the shallow limpid water of the white
-sandbar. They felt no longing for the little village sleeping in the
-distance beyond the majestic waste of water. A vagrant current or a
-slight rise in the river had carried off their raft, but this only
-gratified them, since its going was something like burning the bridge
-between them and civilization.
-
-They came back to camp wonderfully refreshed, glad-hearted, and
-ravenous; and they soon had the camp-fire blazing up again. Huck found
-a spring of clear cold water close by, and the boys made cups of broad
-oak or hickory leaves, and felt that water, sweetened with such a
-wildwood charm as that, would be a good enough substitute for coffee.
-While Joe was slicing bacon for breakfast, Tom and Huck asked him to
-hold on a minute; they stepped to a promising nook in the river-bank
-and threw in their lines; almost immediately they had reward. Joe had
-not had time to get impatient before they were back again with some
-handsome bass, a couple of sun-perch and a small catfish--provisions
-enough for quite a family. They fried the fish with the bacon, and were
-astonished; for no fish had ever seemed so delicious before. They did
-not know that the quicker a fresh-water fish is on the fire after he is
-caught the better he is; and they reflected little upon what a sauce
-open-air sleeping, open-air exercise, bathing, and a large ingredient
-of hunger make, too.
-
-They lay around in the shade, after breakfast, while Huck had a smoke,
-and then went off through the woods on an exploring expedition. They
-tramped gayly along, over decaying logs, through tangled underbrush,
-among solemn monarchs of the forest, hung from their crowns to the
-ground with a drooping regalia of grape-vines. Now and then they came
-upon snug nooks carpeted with grass and jeweled with flowers.
-
-They found plenty of things to be delighted with, but nothing to be
-astonished at. They discovered that the island was about three miles
-long and a quarter of a mile wide, and that the shore it lay closest to
-was only separated from it by a narrow channel hardly two hundred yards
-wide. They took a swim about every hour, so it was close upon the
-middle of the afternoon when they got back to camp. They were too
-hungry to stop to fish, but they fared sumptuously upon cold ham, and
-then threw themselves down in the shade to talk. But the talk soon
-began to drag, and then died. The stillness, the solemnity that brooded
-in the woods, and the sense of loneliness, began to tell upon the
-spirits of the boys. They fell to thinking. A sort of undefined longing
-crept upon them. This took dim shape, presently--it was budding
-homesickness. Even Finn the Red-Handed was dreaming of his doorsteps
-and empty hogsheads. But they were all ashamed of their weakness, and
-none was brave enough to speak his thought.
-
-For some time, now, the boys had been dully conscious of a peculiar
-sound in the distance, just as one sometimes is of the ticking of a
-clock which he takes no distinct note of. But now this mysterious sound
-became more pronounced, and forced a recognition. The boys started,
-glanced at each other, and then each assumed a listening attitude.
-There was a long silence, profound and unbroken; then a deep, sullen
-boom came floating down out of the distance.
-
-"What is it!" exclaimed Joe, under his breath.
-
-"I wonder," said Tom in a whisper.
-
-"'Tain't thunder," said Huckleberry, in an awed tone, "becuz thunder--"
-
-"Hark!" said Tom. "Listen--don't talk."
-
-They waited a time that seemed an age, and then the same muffled boom
-troubled the solemn hush.
-
-"Let's go and see."
-
-They sprang to their feet and hurried to the shore toward the town.
-They parted the bushes on the bank and peered out over the water. The
-little steam ferryboat was about a mile below the village, drifting
-with the current. Her broad deck seemed crowded with people. There were
-a great many skiffs rowing about or floating with the stream in the
-neighborhood of the ferryboat, but the boys could not determine what
-the men in them were doing. Presently a great jet of white smoke burst
-from the ferryboat's side, and as it expanded and rose in a lazy cloud,
-that same dull throb of sound was borne to the listeners again.
-
-"I know now!" exclaimed Tom; "somebody's drownded!"
-
-"That's it!" said Huck; "they done that last summer, when Bill Turner
-got drownded; they shoot a cannon over the water, and that makes him
-come up to the top. Yes, and they take loaves of bread and put
-quicksilver in 'em and set 'em afloat, and wherever there's anybody
-that's drownded, they'll float right there and stop."
-
-"Yes, I've heard about that," said Joe. "I wonder what makes the bread
-do that."
-
-"Oh, it ain't the bread, so much," said Tom; "I reckon it's mostly
-what they SAY over it before they start it out."
-
-"But they don't say anything over it," said Huck. "I've seen 'em and
-they don't."
-
-"Well, that's funny," said Tom. "But maybe they say it to themselves.
-Of COURSE they do. Anybody might know that."
-
-The other boys agreed that there was reason in what Tom said, because
-an ignorant lump of bread, uninstructed by an incantation, could not be
-expected to act very intelligently when set upon an errand of such
-gravity.
-
-"By jings, I wish I was over there, now," said Joe.
-
-"I do too" said Huck "I'd give heaps to know who it is."
-
-The boys still listened and watched. Presently a revealing thought
-flashed through Tom's mind, and he exclaimed:
-
-"Boys, I know who's drownded--it's us!"
-
-They felt like heroes in an instant. Here was a gorgeous triumph; they
-were missed; they were mourned; hearts were breaking on their account;
-tears were being shed; accusing memories of unkindness to these poor
-lost lads were rising up, and unavailing regrets and remorse were being
-indulged; and best of all, the departed were the talk of the whole
-town, and the envy of all the boys, as far as this dazzling notoriety
-was concerned. This was fine. It was worth while to be a pirate, after
-all.
-
-As twilight drew on, the ferryboat went back to her accustomed
-business and the skiffs disappeared. The pirates returned to camp. They
-were jubilant with vanity over their new grandeur and the illustrious
-trouble they were making. They caught fish, cooked supper and ate it,
-and then fell to guessing at what the village was thinking and saying
-about them; and the pictures they drew of the public distress on their
-account were gratifying to look upon--from their point of view. But
-when the shadows of night closed them in, they gradually ceased to
-talk, and sat gazing into the fire, with their minds evidently
-wandering elsewhere. The excitement was gone, now, and Tom and Joe
-could not keep back thoughts of certain persons at home who were not
-enjoying this fine frolic as much as they were. Misgivings came; they
-grew troubled and unhappy; a sigh or two escaped, unawares. By and by
-Joe timidly ventured upon a roundabout "feeler" as to how the others
-might look upon a return to civilization--not right now, but--
-
-Tom withered him with derision! Huck, being uncommitted as yet, joined
-in with Tom, and the waverer quickly "explained," and was glad to get
-out of the scrape with as little taint of chicken-hearted homesickness
-clinging to his garments as he could. Mutiny was effectually laid to
-rest for the moment.
-
-As the night deepened, Huck began to nod, and presently to snore. Joe
-followed next. Tom lay upon his elbow motionless, for some time,
-watching the two intently. At last he got up cautiously, on his knees,
-and went searching among the grass and the flickering reflections flung
-by the camp-fire. He picked up and inspected several large
-semi-cylinders of the thin white bark of a sycamore, and finally chose
-two which seemed to suit him. Then he knelt by the fire and painfully
-wrote something upon each of these with his "red keel"; one he rolled up
-and put in his jacket pocket, and the other he put in Joe's hat and
-removed it to a little distance from the owner. And he also put into the
-hat certain schoolboy treasures of almost inestimable value--among them
-a lump of chalk, an India-rubber ball, three fishhooks, and one of that
-kind of marbles known as a "sure 'nough crystal." Then he tiptoed his
-way cautiously among the trees till he felt that he was out of hearing,
-and straightway broke into a keen run in the direction of the sandbar.
-
-
-
-CHAPTER XV
-
-A FEW minutes later Tom was in the shoal water of the bar, wading
-toward the Illinois shore. Before the depth reached his middle he was
-half-way over; the current would permit no more wading, now, so he
-struck out confidently to swim the remaining hundred yards. He swam
-quartering upstream, but still was swept downward rather faster than he
-had expected. However, he reached the shore finally, and drifted along
-till he found a low place and drew himself out. He put his hand on his
-jacket pocket, found his piece of bark safe, and then struck through
-the woods, following the shore, with streaming garments. Shortly before
-ten o'clock he came out into an open place opposite the village, and
-saw the ferryboat lying in the shadow of the trees and the high bank.
-Everything was quiet under the blinking stars. He crept down the bank,
-watching with all his eyes, slipped into the water, swam three or four
-strokes and climbed into the skiff that did "yawl" duty at the boat's
-stern. He laid himself down under the thwarts and waited, panting.
-
-Presently the cracked bell tapped and a voice gave the order to "cast
-off." A minute or two later the skiff's head was standing high up,
-against the boat's swell, and the voyage was begun. Tom felt happy in
-his success, for he knew it was the boat's last trip for the night. At
-the end of a long twelve or fifteen minutes the wheels stopped, and Tom
-slipped overboard and swam ashore in the dusk, landing fifty yards
-downstream, out of danger of possible stragglers.
-
-He flew along unfrequented alleys, and shortly found himself at his
-aunt's back fence. He climbed over, approached the "ell," and looked in
-at the sitting-room window, for a light was burning there. There sat
-Aunt Polly, Sid, Mary, and Joe Harper's mother, grouped together,
-talking. They were by the bed, and the bed was between them and the
-door. Tom went to the door and began to softly lift the latch; then he
-pressed gently and the door yielded a crack; he continued pushing
-cautiously, and quaking every time it creaked, till he judged he might
-squeeze through on his knees; so he put his head through and began,
-warily.
-
-"What makes the candle blow so?" said Aunt Polly. Tom hurried up.
-"Why, that door's open, I believe. Why, of course it is. No end of
-strange things now. Go 'long and shut it, Sid."
-
-Tom disappeared under the bed just in time. He lay and "breathed"
-himself for a time, and then crept to where he could almost touch his
-aunt's foot.
-
-"But as I was saying," said Aunt Polly, "he warn't BAD, so to say
---only mischEEvous. Only just giddy, and harum-scarum, you know. He
-warn't any more responsible than a colt. HE never meant any harm, and
-he was the best-hearted boy that ever was"--and she began to cry.
-
-"It was just so with my Joe--always full of his devilment, and up to
-every kind of mischief, but he was just as unselfish and kind as he
-could be--and laws bless me, to think I went and whipped him for taking
-that cream, never once recollecting that I throwed it out myself
-because it was sour, and I never to see him again in this world, never,
-never, never, poor abused boy!" And Mrs. Harper sobbed as if her heart
-would break.
-
-"I hope Tom's better off where he is," said Sid, "but if he'd been
-better in some ways--"
-
-"SID!" Tom felt the glare of the old lady's eye, though he could not
-see it. "Not a word against my Tom, now that he's gone! God'll take
-care of HIM--never you trouble YOURself, sir! Oh, Mrs. Harper, I don't
-know how to give him up! I don't know how to give him up! He was such a
-comfort to me, although he tormented my old heart out of me, 'most."
-
-"The Lord giveth and the Lord hath taken away--Blessed be the name of
-the Lord! But it's so hard--Oh, it's so hard! Only last Saturday my
-Joe busted a firecracker right under my nose and I knocked him
-sprawling. Little did I know then, how soon--Oh, if it was to do over
-again I'd hug him and bless him for it."
-
-"Yes, yes, yes, I know just how you feel, Mrs. Harper, I know just
-exactly how you feel. No longer ago than yesterday noon, my Tom took
-and filled the cat full of Pain-killer, and I did think the cretur
-would tear the house down. And God forgive me, I cracked Tom's head
-with my thimble, poor boy, poor dead boy. But he's out of all his
-troubles now. And the last words I ever heard him say was to reproach--"
-
-But this memory was too much for the old lady, and she broke entirely
-down. Tom was snuffling, now, himself--and more in pity of himself than
-anybody else. He could hear Mary crying, and putting in a kindly word
-for him from time to time. He began to have a nobler opinion of himself
-than ever before. Still, he was sufficiently touched by his aunt's
-grief to long to rush out from under the bed and overwhelm her with
-joy--and the theatrical gorgeousness of the thing appealed strongly to
-his nature, too, but he resisted and lay still.
-
-He went on listening, and gathered by odds and ends that it was
-conjectured at first that the boys had got drowned while taking a swim;
-then the small raft had been missed; next, certain boys said the
-missing lads had promised that the village should "hear something"
-soon; the wise-heads had "put this and that together" and decided that
-the lads had gone off on that raft and would turn up at the next town
-below, presently; but toward noon the raft had been found, lodged
-against the Missouri shore some five or six miles below the village
---and then hope perished; they must be drowned, else hunger would have
-driven them home by nightfall if not sooner. It was believed that the
-search for the bodies had been a fruitless effort merely because the
-drowning must have occurred in mid-channel, since the boys, being good
-swimmers, would otherwise have escaped to shore. This was Wednesday
-night. If the bodies continued missing until Sunday, all hope would be
-given over, and the funerals would be preached on that morning. Tom
-shuddered.
-
-Mrs. Harper gave a sobbing good-night and turned to go. Then with a
-mutual impulse the two bereaved women flung themselves into each
-other's arms and had a good, consoling cry, and then parted. Aunt Polly
-was tender far beyond her wont, in her good-night to Sid and Mary. Sid
-snuffled a bit and Mary went off crying with all her heart.
-
-Aunt Polly knelt down and prayed for Tom so touchingly, so
-appealingly, and with such measureless love in her words and her old
-trembling voice, that he was weltering in tears again, long before she
-was through.
-
-He had to keep still long after she went to bed, for she kept making
-broken-hearted ejaculations from time to time, tossing unrestfully, and
-turning over. But at last she was still, only moaning a little in her
-sleep. Now the boy stole out, rose gradually by the bedside, shaded the
-candle-light with his hand, and stood regarding her. His heart was full
-of pity for her. He took out his sycamore scroll and placed it by the
-candle. But something occurred to him, and he lingered considering. His
-face lighted with a happy solution of his thought; he put the bark
-hastily in his pocket. Then he bent over and kissed the faded lips, and
-straightway made his stealthy exit, latching the door behind him.
-
-He threaded his way back to the ferry landing, found nobody at large
-there, and walked boldly on board the boat, for he knew she was
-tenantless except that there was a watchman, who always turned in and
-slept like a graven image. He untied the skiff at the stern, slipped
-into it, and was soon rowing cautiously upstream. When he had pulled a
-mile above the village, he started quartering across and bent himself
-stoutly to his work. He hit the landing on the other side neatly, for
-this was a familiar bit of work to him. He was moved to capture the
-skiff, arguing that it might be considered a ship and therefore
-legitimate prey for a pirate, but he knew a thorough search would be
-made for it and that might end in revelations. So he stepped ashore and
-entered the woods.
-
-He sat down and took a long rest, torturing himself meanwhile to keep
-awake, and then started warily down the home-stretch. The night was far
-spent. It was broad daylight before he found himself fairly abreast the
-island bar. He rested again until the sun was well up and gilding the
-great river with its splendor, and then he plunged into the stream. A
-little later he paused, dripping, upon the threshold of the camp, and
-heard Joe say:
-
-"No, Tom's true-blue, Huck, and he'll come back. He won't desert. He
-knows that would be a disgrace to a pirate, and Tom's too proud for
-that sort of thing. He's up to something or other. Now I wonder what?"
-
-"Well, the things is ours, anyway, ain't they?"
-
-"Pretty near, but not yet, Huck. The writing says they are if he ain't
-back here to breakfast."
-
-"Which he is!" exclaimed Tom, with fine dramatic effect, stepping
-grandly into camp.
-
-A sumptuous breakfast of bacon and fish was shortly provided, and as
-the boys set to work upon it, Tom recounted (and adorned) his
-adventures. They were a vain and boastful company of heroes when the
-tale was done. Then Tom hid himself away in a shady nook to sleep till
-noon, and the other pirates got ready to fish and explore.
-
-
-
-CHAPTER XVI
-
-AFTER dinner all the gang turned out to hunt for turtle eggs on the
-bar. They went about poking sticks into the sand, and when they found a
-soft place they went down on their knees and dug with their hands.
-Sometimes they would take fifty or sixty eggs out of one hole. They
-were perfectly round white things a trifle smaller than an English
-walnut. They had a famous fried-egg feast that night, and another on
-Friday morning.
-
-After breakfast they went whooping and prancing out on the bar, and
-chased each other round and round, shedding clothes as they went, until
-they were naked, and then continued the frolic far away up the shoal
-water of the bar, against the stiff current, which latter tripped their
-legs from under them from time to time and greatly increased the fun.
-And now and then they stooped in a group and splashed water in each
-other's faces with their palms, gradually approaching each other, with
-averted faces to avoid the strangling sprays, and finally gripping and
-struggling till the best man ducked his neighbor, and then they all
-went under in a tangle of white legs and arms and came up blowing,
-sputtering, laughing, and gasping for breath at one and the same time.
-
-When they were well exhausted, they would run out and sprawl on the
-dry, hot sand, and lie there and cover themselves up with it, and by
-and by break for the water again and go through the original
-performance once more. Finally it occurred to them that their naked
-skin represented flesh-colored "tights" very fairly; so they drew a
-ring in the sand and had a circus--with three clowns in it, for none
-would yield this proudest post to his neighbor.
-
-Next they got their marbles and played "knucks" and "ring-taw" and
-"keeps" till that amusement grew stale. Then Joe and Huck had another
-swim, but Tom would not venture, because he found that in kicking off
-his trousers he had kicked his string of rattlesnake rattles off his
-ankle, and he wondered how he had escaped cramp so long without the
-protection of this mysterious charm. He did not venture again until he
-had found it, and by that time the other boys were tired and ready to
-rest. They gradually wandered apart, dropped into the "dumps," and fell
-to gazing longingly across the wide river to where the village lay
-drowsing in the sun. Tom found himself writing "BECKY" in the sand with
-his big toe; he scratched it out, and was angry with himself for his
-weakness. But he wrote it again, nevertheless; he could not help it. He
-erased it once more and then took himself out of temptation by driving
-the other boys together and joining them.
-
-But Joe's spirits had gone down almost beyond resurrection. He was so
-homesick that he could hardly endure the misery of it. The tears lay
-very near the surface. Huck was melancholy, too. Tom was downhearted,
-but tried hard not to show it. He had a secret which he was not ready
-to tell, yet, but if this mutinous depression was not broken up soon,
-he would have to bring it out. He said, with a great show of
-cheerfulness:
-
-"I bet there's been pirates on this island before, boys. We'll explore
-it again. They've hid treasures here somewhere. How'd you feel to light
-on a rotten chest full of gold and silver--hey?"
-
-But it roused only faint enthusiasm, which faded out, with no reply.
-Tom tried one or two other seductions; but they failed, too. It was
-discouraging work. Joe sat poking up the sand with a stick and looking
-very gloomy. Finally he said:
-
-"Oh, boys, let's give it up. I want to go home. It's so lonesome."
-
-"Oh no, Joe, you'll feel better by and by," said Tom. "Just think of
-the fishing that's here."
-
-"I don't care for fishing. I want to go home."
-
-"But, Joe, there ain't such another swimming-place anywhere."
-
-"Swimming's no good. I don't seem to care for it, somehow, when there
-ain't anybody to say I sha'n't go in. I mean to go home."
-
-"Oh, shucks! Baby! You want to see your mother, I reckon."
-
-"Yes, I DO want to see my mother--and you would, too, if you had one.
-I ain't any more baby than you are." And Joe snuffled a little.
-
-"Well, we'll let the cry-baby go home to his mother, won't we, Huck?
-Poor thing--does it want to see its mother? And so it shall. You like
-it here, don't you, Huck? We'll stay, won't we?"
-
-Huck said, "Y-e-s"--without any heart in it.
-
-"I'll never speak to you again as long as I live," said Joe, rising.
-"There now!" And he moved moodily away and began to dress himself.
-
-"Who cares!" said Tom. "Nobody wants you to. Go 'long home and get
-laughed at. Oh, you're a nice pirate. Huck and me ain't cry-babies.
-We'll stay, won't we, Huck? Let him go if he wants to. I reckon we can
-get along without him, per'aps."
-
-But Tom was uneasy, nevertheless, and was alarmed to see Joe go
-sullenly on with his dressing. And then it was discomforting to see
-Huck eying Joe's preparations so wistfully, and keeping up such an
-ominous silence. Presently, without a parting word, Joe began to wade
-off toward the Illinois shore. Tom's heart began to sink. He glanced at
-Huck. Huck could not bear the look, and dropped his eyes. Then he said:
-
-"I want to go, too, Tom. It was getting so lonesome anyway, and now
-it'll be worse. Let's us go, too, Tom."
-
-"I won't! You can all go, if you want to. I mean to stay."
-
-"Tom, I better go."
-
-"Well, go 'long--who's hendering you."
-
-Huck began to pick up his scattered clothes. He said:
-
-"Tom, I wisht you'd come, too. Now you think it over. We'll wait for
-you when we get to shore."
-
-"Well, you'll wait a blame long time, that's all."
-
-Huck started sorrowfully away, and Tom stood looking after him, with a
-strong desire tugging at his heart to yield his pride and go along too.
-He hoped the boys would stop, but they still waded slowly on. It
-suddenly dawned on Tom that it was become very lonely and still. He
-made one final struggle with his pride, and then darted after his
-comrades, yelling:
-
-"Wait! Wait! I want to tell you something!"
-
-They presently stopped and turned around. When he got to where they
-were, he began unfolding his secret, and they listened moodily till at
-last they saw the "point" he was driving at, and then they set up a
-war-whoop of applause and said it was "splendid!" and said if he had
-told them at first, they wouldn't have started away. He made a plausible
-excuse; but his real reason had been the fear that not even the secret
-would keep them with him any very great length of time, and so he had
-meant to hold it in reserve as a last seduction.
-
-The lads came gayly back and went at their sports again with a will,
-chattering all the time about Tom's stupendous plan and admiring the
-genius of it. After a dainty egg and fish dinner, Tom said he wanted to
-learn to smoke, now. Joe caught at the idea and said he would like to
-try, too. So Huck made pipes and filled them. These novices had never
-smoked anything before but cigars made of grape-vine, and they "bit"
-the tongue, and were not considered manly anyway.
-
-Now they stretched themselves out on their elbows and began to puff,
-charily, and with slender confidence. The smoke had an unpleasant
-taste, and they gagged a little, but Tom said:
-
-"Why, it's just as easy! If I'd a knowed this was all, I'd a learnt
-long ago."
-
-"So would I," said Joe. "It's just nothing."
-
-"Why, many a time I've looked at people smoking, and thought well I
-wish I could do that; but I never thought I could," said Tom.
-
-"That's just the way with me, hain't it, Huck? You've heard me talk
-just that way--haven't you, Huck? I'll leave it to Huck if I haven't."
-
-"Yes--heaps of times," said Huck.
-
-"Well, I have too," said Tom; "oh, hundreds of times. Once down by the
-slaughter-house. Don't you remember, Huck? Bob Tanner was there, and
-Johnny Miller, and Jeff Thatcher, when I said it. Don't you remember,
-Huck, 'bout me saying that?"
-
-"Yes, that's so," said Huck. "That was the day after I lost a white
-alley. No, 'twas the day before."
-
-"There--I told you so," said Tom. "Huck recollects it."
-
-"I bleeve I could smoke this pipe all day," said Joe. "I don't feel
-sick."
-
-"Neither do I," said Tom. "I could smoke it all day. But I bet you
-Jeff Thatcher couldn't."
-
-"Jeff Thatcher! Why, he'd keel over just with two draws. Just let him
-try it once. HE'D see!"
-
-"I bet he would. And Johnny Miller--I wish could see Johnny Miller
-tackle it once."
-
-"Oh, don't I!" said Joe. "Why, I bet you Johnny Miller couldn't any
-more do this than nothing. Just one little snifter would fetch HIM."
-
-"'Deed it would, Joe. Say--I wish the boys could see us now."
-
-"So do I."
-
-"Say--boys, don't say anything about it, and some time when they're
-around, I'll come up to you and say, 'Joe, got a pipe? I want a smoke.'
-And you'll say, kind of careless like, as if it warn't anything, you'll
-say, 'Yes, I got my OLD pipe, and another one, but my tobacker ain't
-very good.' And I'll say, 'Oh, that's all right, if it's STRONG
-enough.' And then you'll out with the pipes, and we'll light up just as
-ca'm, and then just see 'em look!"
-
-"By jings, that'll be gay, Tom! I wish it was NOW!"
-
-"So do I! And when we tell 'em we learned when we was off pirating,
-won't they wish they'd been along?"
-
-"Oh, I reckon not! I'll just BET they will!"
-
-So the talk ran on. But presently it began to flag a trifle, and grow
-disjointed. The silences widened; the expectoration marvellously
-increased. Every pore inside the boys' cheeks became a spouting
-fountain; they could scarcely bail out the cellars under their tongues
-fast enough to prevent an inundation; little overflowings down their
-throats occurred in spite of all they could do, and sudden retchings
-followed every time. Both boys were looking very pale and miserable,
-now. Joe's pipe dropped from his nerveless fingers. Tom's followed.
-Both fountains were going furiously and both pumps bailing with might
-and main. Joe said feebly:
-
-"I've lost my knife. I reckon I better go and find it."
-
-Tom said, with quivering lips and halting utterance:
-
-"I'll help you. You go over that way and I'll hunt around by the
-spring. No, you needn't come, Huck--we can find it."
-
-So Huck sat down again, and waited an hour. Then he found it lonesome,
-and went to find his comrades. They were wide apart in the woods, both
-very pale, both fast asleep. But something informed him that if they
-had had any trouble they had got rid of it.
-
-They were not talkative at supper that night. They had a humble look,
-and when Huck prepared his pipe after the meal and was going to prepare
-theirs, they said no, they were not feeling very well--something they
-ate at dinner had disagreed with them.
-
-About midnight Joe awoke, and called the boys. There was a brooding
-oppressiveness in the air that seemed to bode something. The boys
-huddled themselves together and sought the friendly companionship of
-the fire, though the dull dead heat of the breathless atmosphere was
-stifling. They sat still, intent and waiting. The solemn hush
-continued. Beyond the light of the fire everything was swallowed up in
-the blackness of darkness. Presently there came a quivering glow that
-vaguely revealed the foliage for a moment and then vanished. By and by
-another came, a little stronger. Then another. Then a faint moan came
-sighing through the branches of the forest and the boys felt a fleeting
-breath upon their cheeks, and shuddered with the fancy that the Spirit
-of the Night had gone by. There was a pause. Now a weird flash turned
-night into day and showed every little grass-blade, separate and
-distinct, that grew about their feet. And it showed three white,
-startled faces, too. A deep peal of thunder went rolling and tumbling
-down the heavens and lost itself in sullen rumblings in the distance. A
-sweep of chilly air passed by, rustling all the leaves and snowing the
-flaky ashes broadcast about the fire. Another fierce glare lit up the
-forest and an instant crash followed that seemed to rend the tree-tops
-right over the boys' heads. They clung together in terror, in the thick
-gloom that followed. A few big rain-drops fell pattering upon the
-leaves.
-
-"Quick! boys, go for the tent!" exclaimed Tom.
-
-They sprang away, stumbling over roots and among vines in the dark, no
-two plunging in the same direction. A furious blast roared through the
-trees, making everything sing as it went. One blinding flash after
-another came, and peal on peal of deafening thunder. And now a
-drenching rain poured down and the rising hurricane drove it in sheets
-along the ground. The boys cried out to each other, but the roaring
-wind and the booming thunder-blasts drowned their voices utterly.
-However, one by one they straggled in at last and took shelter under
-the tent, cold, scared, and streaming with water; but to have company
-in misery seemed something to be grateful for. They could not talk, the
-old sail flapped so furiously, even if the other noises would have
-allowed them. The tempest rose higher and higher, and presently the
-sail tore loose from its fastenings and went winging away on the blast.
-The boys seized each others' hands and fled, with many tumblings and
-bruises, to the shelter of a great oak that stood upon the river-bank.
-Now the battle was at its highest. Under the ceaseless conflagration of
-lightning that flamed in the skies, everything below stood out in
-clean-cut and shadowless distinctness: the bending trees, the billowy
-river, white with foam, the driving spray of spume-flakes, the dim
-outlines of the high bluffs on the other side, glimpsed through the
-drifting cloud-rack and the slanting veil of rain. Every little while
-some giant tree yielded the fight and fell crashing through the younger
-growth; and the unflagging thunder-peals came now in ear-splitting
-explosive bursts, keen and sharp, and unspeakably appalling. The storm
-culminated in one matchless effort that seemed likely to tear the island
-to pieces, burn it up, drown it to the tree-tops, blow it away, and
-deafen every creature in it, all at one and the same moment. It was a
-wild night for homeless young heads to be out in.
-
-But at last the battle was done, and the forces retired with weaker
-and weaker threatenings and grumblings, and peace resumed her sway. The
-boys went back to camp, a good deal awed; but they found there was
-still something to be thankful for, because the great sycamore, the
-shelter of their beds, was a ruin, now, blasted by the lightnings, and
-they were not under it when the catastrophe happened.
-
-Everything in camp was drenched, the camp-fire as well; for they were
-but heedless lads, like their generation, and had made no provision
-against rain. Here was matter for dismay, for they were soaked through
-and chilled. They were eloquent in their distress; but they presently
-discovered that the fire had eaten so far up under the great log it had
-been built against (where it curved upward and separated itself from
-the ground), that a handbreadth or so of it had escaped wetting; so
-they patiently wrought until, with shreds and bark gathered from the
-under sides of sheltered logs, they coaxed the fire to burn again. Then
-they piled on great dead boughs till they had a roaring furnace, and
-were glad-hearted once more. They dried their boiled ham and had a
-feast, and after that they sat by the fire and expanded and glorified
-their midnight adventure until morning, for there was not a dry spot to
-sleep on, anywhere around.
-
-As the sun began to steal in upon the boys, drowsiness came over them,
-and they went out on the sandbar and lay down to sleep. They got
-scorched out by and by, and drearily set about getting breakfast. After
-the meal they felt rusty, and stiff-jointed, and a little homesick once
-more. Tom saw the signs, and fell to cheering up the pirates as well as
-he could. But they cared nothing for marbles, or circus, or swimming,
-or anything. He reminded them of the imposing secret, and raised a ray
-of cheer. While it lasted, he got them interested in a new device. This
-was to knock off being pirates, for a while, and be Indians for a
-change. They were attracted by this idea; so it was not long before
-they were stripped, and striped from head to heel with black mud, like
-so many zebras--all of them chiefs, of course--and then they went
-tearing through the woods to attack an English settlement.
-
-By and by they separated into three hostile tribes, and darted upon
-each other from ambush with dreadful war-whoops, and killed and scalped
-each other by thousands. It was a gory day. Consequently it was an
-extremely satisfactory one.
-
-They assembled in camp toward supper-time, hungry and happy; but now a
-difficulty arose--hostile Indians could not break the bread of
-hospitality together without first making peace, and this was a simple
-impossibility without smoking a pipe of peace. There was no other
-process that ever they had heard of. Two of the savages almost wished
-they had remained pirates. However, there was no other way; so with
-such show of cheerfulness as they could muster they called for the pipe
-and took their whiff as it passed, in due form.
-
-And behold, they were glad they had gone into savagery, for they had
-gained something; they found that they could now smoke a little without
-having to go and hunt for a lost knife; they did not get sick enough to
-be seriously uncomfortable. They were not likely to fool away this high
-promise for lack of effort. No, they practised cautiously, after
-supper, with right fair success, and so they spent a jubilant evening.
-They were prouder and happier in their new acquirement than they would
-have been in the scalping and skinning of the Six Nations. We will
-leave them to smoke and chatter and brag, since we have no further use
-for them at present.
-
-
-
-CHAPTER XVII
-
-BUT there was no hilarity in the little town that same tranquil
-Saturday afternoon. The Harpers, and Aunt Polly's family, were being
-put into mourning, with great grief and many tears. An unusual quiet
-possessed the village, although it was ordinarily quiet enough, in all
-conscience. The villagers conducted their concerns with an absent air,
-and talked little; but they sighed often. The Saturday holiday seemed a
-burden to the children. They had no heart in their sports, and
-gradually gave them up.
-
-In the afternoon Becky Thatcher found herself moping about the
-deserted schoolhouse yard, and feeling very melancholy. But she found
-nothing there to comfort her. She soliloquized:
-
-"Oh, if I only had a brass andiron-knob again! But I haven't got
-anything now to remember him by." And she choked back a little sob.
-
-Presently she stopped, and said to herself:
-
-"It was right here. Oh, if it was to do over again, I wouldn't say
-that--I wouldn't say it for the whole world. But he's gone now; I'll
-never, never, never see him any more."
-
-This thought broke her down, and she wandered away, with tears rolling
-down her cheeks. Then quite a group of boys and girls--playmates of
-Tom's and Joe's--came by, and stood looking over the paling fence and
-talking in reverent tones of how Tom did so-and-so the last time they
-saw him, and how Joe said this and that small trifle (pregnant with
-awful prophecy, as they could easily see now!)--and each speaker
-pointed out the exact spot where the lost lads stood at the time, and
-then added something like "and I was a-standing just so--just as I am
-now, and as if you was him--I was as close as that--and he smiled, just
-this way--and then something seemed to go all over me, like--awful, you
-know--and I never thought what it meant, of course, but I can see now!"
-
-Then there was a dispute about who saw the dead boys last in life, and
-many claimed that dismal distinction, and offered evidences, more or
-less tampered with by the witness; and when it was ultimately decided
-who DID see the departed last, and exchanged the last words with them,
-the lucky parties took upon themselves a sort of sacred importance, and
-were gaped at and envied by all the rest. One poor chap, who had no
-other grandeur to offer, said with tolerably manifest pride in the
-remembrance:
-
-"Well, Tom Sawyer he licked me once."
-
-But that bid for glory was a failure. Most of the boys could say that,
-and so that cheapened the distinction too much. The group loitered
-away, still recalling memories of the lost heroes, in awed voices.
-
-When the Sunday-school hour was finished, the next morning, the bell
-began to toll, instead of ringing in the usual way. It was a very still
-Sabbath, and the mournful sound seemed in keeping with the musing hush
-that lay upon nature. The villagers began to gather, loitering a moment
-in the vestibule to converse in whispers about the sad event. But there
-was no whispering in the house; only the funereal rustling of dresses
-as the women gathered to their seats disturbed the silence there. None
-could remember when the little church had been so full before. There
-was finally a waiting pause, an expectant dumbness, and then Aunt Polly
-entered, followed by Sid and Mary, and they by the Harper family, all
-in deep black, and the whole congregation, the old minister as well,
-rose reverently and stood until the mourners were seated in the front
-pew. There was another communing silence, broken at intervals by
-muffled sobs, and then the minister spread his hands abroad and prayed.
-A moving hymn was sung, and the text followed: "I am the Resurrection
-and the Life."
-
-As the service proceeded, the clergyman drew such pictures of the
-graces, the winning ways, and the rare promise of the lost lads that
-every soul there, thinking he recognized these pictures, felt a pang in
-remembering that he had persistently blinded himself to them always
-before, and had as persistently seen only faults and flaws in the poor
-boys. The minister related many a touching incident in the lives of the
-departed, too, which illustrated their sweet, generous natures, and the
-people could easily see, now, how noble and beautiful those episodes
-were, and remembered with grief that at the time they occurred they had
-seemed rank rascalities, well deserving of the cowhide. The
-congregation became more and more moved, as the pathetic tale went on,
-till at last the whole company broke down and joined the weeping
-mourners in a chorus of anguished sobs, the preacher himself giving way
-to his feelings, and crying in the pulpit.
-
-There was a rustle in the gallery, which nobody noticed; a moment
-later the church door creaked; the minister raised his streaming eyes
-above his handkerchief, and stood transfixed! First one and then
-another pair of eyes followed the minister's, and then almost with one
-impulse the congregation rose and stared while the three dead boys came
-marching up the aisle, Tom in the lead, Joe next, and Huck, a ruin of
-drooping rags, sneaking sheepishly in the rear! They had been hid in
-the unused gallery listening to their own funeral sermon!
-
-Aunt Polly, Mary, and the Harpers threw themselves upon their restored
-ones, smothered them with kisses and poured out thanksgivings, while
-poor Huck stood abashed and uncomfortable, not knowing exactly what to
-do or where to hide from so many unwelcoming eyes. He wavered, and
-started to slink away, but Tom seized him and said:
-
-"Aunt Polly, it ain't fair. Somebody's got to be glad to see Huck."
-
-"And so they shall. I'm glad to see him, poor motherless thing!" And
-the loving attentions Aunt Polly lavished upon him were the one thing
-capable of making him more uncomfortable than he was before.
-
-Suddenly the minister shouted at the top of his voice: "Praise God
-from whom all blessings flow--SING!--and put your hearts in it!"
-
-And they did. Old Hundred swelled up with a triumphant burst, and
-while it shook the rafters Tom Sawyer the Pirate looked around upon the
-envying juveniles about him and confessed in his heart that this was
-the proudest moment of his life.
-
-As the "sold" congregation trooped out they said they would almost be
-willing to be made ridiculous again to hear Old Hundred sung like that
-once more.
-
-Tom got more cuffs and kisses that day--according to Aunt Polly's
-varying moods--than he had earned before in a year; and he hardly knew
-which expressed the most gratefulness to God and affection for himself.
-
-
-
-CHAPTER XVIII
-
-THAT was Tom's great secret--the scheme to return home with his
-brother pirates and attend their own funerals. They had paddled over to
-the Missouri shore on a log, at dusk on Saturday, landing five or six
-miles below the village; they had slept in the woods at the edge of the
-town till nearly daylight, and had then crept through back lanes and
-alleys and finished their sleep in the gallery of the church among a
-chaos of invalided benches.
-
-At breakfast, Monday morning, Aunt Polly and Mary were very loving to
-Tom, and very attentive to his wants. There was an unusual amount of
-talk. In the course of it Aunt Polly said:
-
-"Well, I don't say it wasn't a fine joke, Tom, to keep everybody
-suffering 'most a week so you boys had a good time, but it is a pity
-you could be so hard-hearted as to let me suffer so. If you could come
-over on a log to go to your funeral, you could have come over and give
-me a hint some way that you warn't dead, but only run off."
-
-"Yes, you could have done that, Tom," said Mary; "and I believe you
-would if you had thought of it."
-
-"Would you, Tom?" said Aunt Polly, her face lighting wistfully. "Say,
-now, would you, if you'd thought of it?"
-
-"I--well, I don't know. 'Twould 'a' spoiled everything."
-
-"Tom, I hoped you loved me that much," said Aunt Polly, with a grieved
-tone that discomforted the boy. "It would have been something if you'd
-cared enough to THINK of it, even if you didn't DO it."
-
-"Now, auntie, that ain't any harm," pleaded Mary; "it's only Tom's
-giddy way--he is always in such a rush that he never thinks of
-anything."
-
-"More's the pity. Sid would have thought. And Sid would have come and
-DONE it, too. Tom, you'll look back, some day, when it's too late, and
-wish you'd cared a little more for me when it would have cost you so
-little."
-
-"Now, auntie, you know I do care for you," said Tom.
-
-"I'd know it better if you acted more like it."
-
-"I wish now I'd thought," said Tom, with a repentant tone; "but I
-dreamt about you, anyway. That's something, ain't it?"
-
-"It ain't much--a cat does that much--but it's better than nothing.
-What did you dream?"
-
-"Why, Wednesday night I dreamt that you was sitting over there by the
-bed, and Sid was sitting by the woodbox, and Mary next to him."
-
-"Well, so we did. So we always do. I'm glad your dreams could take
-even that much trouble about us."
-
-"And I dreamt that Joe Harper's mother was here."
-
-"Why, she was here! Did you dream any more?"
-
-"Oh, lots. But it's so dim, now."
-
-"Well, try to recollect--can't you?"
-
-"Somehow it seems to me that the wind--the wind blowed the--the--"
-
-"Try harder, Tom! The wind did blow something. Come!"
-
-Tom pressed his fingers on his forehead an anxious minute, and then
-said:
-
-"I've got it now! I've got it now! It blowed the candle!"
-
-"Mercy on us! Go on, Tom--go on!"
-
-"And it seems to me that you said, 'Why, I believe that that door--'"
-
-"Go ON, Tom!"
-
-"Just let me study a moment--just a moment. Oh, yes--you said you
-believed the door was open."
-
-"As I'm sitting here, I did! Didn't I, Mary! Go on!"
-
-"And then--and then--well I won't be certain, but it seems like as if
-you made Sid go and--and--"
-
-"Well? Well? What did I make him do, Tom? What did I make him do?"
-
-"You made him--you--Oh, you made him shut it."
-
-"Well, for the land's sake! I never heard the beat of that in all my
-days! Don't tell ME there ain't anything in dreams, any more. Sereny
-Harper shall know of this before I'm an hour older. I'd like to see her
-get around THIS with her rubbage 'bout superstition. Go on, Tom!"
-
-"Oh, it's all getting just as bright as day, now. Next you said I
-warn't BAD, only mischeevous and harum-scarum, and not any more
-responsible than--than--I think it was a colt, or something."
-
-"And so it was! Well, goodness gracious! Go on, Tom!"
-
-"And then you began to cry."
-
-"So I did. So I did. Not the first time, neither. And then--"
-
-"Then Mrs. Harper she began to cry, and said Joe was just the same,
-and she wished she hadn't whipped him for taking cream when she'd
-throwed it out her own self--"
-
-"Tom! The sperrit was upon you! You was a prophesying--that's what you
-was doing! Land alive, go on, Tom!"
-
-"Then Sid he said--he said--"
-
-"I don't think I said anything," said Sid.
-
-"Yes you did, Sid," said Mary.
-
-"Shut your heads and let Tom go on! What did he say, Tom?"
-
-"He said--I THINK he said he hoped I was better off where I was gone
-to, but if I'd been better sometimes--"
-
-"THERE, d'you hear that! It was his very words!"
-
-"And you shut him up sharp."
-
-"I lay I did! There must 'a' been an angel there. There WAS an angel
-there, somewheres!"
-
-"And Mrs. Harper told about Joe scaring her with a firecracker, and
-you told about Peter and the Painkiller--"
-
-"Just as true as I live!"
-
-"And then there was a whole lot of talk 'bout dragging the river for
-us, and 'bout having the funeral Sunday, and then you and old Miss
-Harper hugged and cried, and she went."
-
-"It happened just so! It happened just so, as sure as I'm a-sitting in
-these very tracks. Tom, you couldn't told it more like if you'd 'a'
-seen it! And then what? Go on, Tom!"
-
-"Then I thought you prayed for me--and I could see you and hear every
-word you said. And you went to bed, and I was so sorry that I took and
-wrote on a piece of sycamore bark, 'We ain't dead--we are only off
-being pirates,' and put it on the table by the candle; and then you
-looked so good, laying there asleep, that I thought I went and leaned
-over and kissed you on the lips."
-
-"Did you, Tom, DID you! I just forgive you everything for that!" And
-she seized the boy in a crushing embrace that made him feel like the
-guiltiest of villains.
-
-"It was very kind, even though it was only a--dream," Sid soliloquized
-just audibly.
-
-"Shut up, Sid! A body does just the same in a dream as he'd do if he
-was awake. Here's a big Milum apple I've been saving for you, Tom, if
-you was ever found again--now go 'long to school. I'm thankful to the
-good God and Father of us all I've got you back, that's long-suffering
-and merciful to them that believe on Him and keep His word, though
-goodness knows I'm unworthy of it, but if only the worthy ones got His
-blessings and had His hand to help them over the rough places, there's
-few enough would smile here or ever enter into His rest when the long
-night comes. Go 'long Sid, Mary, Tom--take yourselves off--you've
-hendered me long enough."
-
-The children left for school, and the old lady to call on Mrs. Harper
-and vanquish her realism with Tom's marvellous dream. Sid had better
-judgment than to utter the thought that was in his mind as he left the
-house. It was this: "Pretty thin--as long a dream as that, without any
-mistakes in it!"
-
-What a hero Tom was become, now! He did not go skipping and prancing,
-but moved with a dignified swagger as became a pirate who felt that the
-public eye was on him. And indeed it was; he tried not to seem to see
-the looks or hear the remarks as he passed along, but they were food
-and drink to him. Smaller boys than himself flocked at his heels, as
-proud to be seen with him, and tolerated by him, as if he had been the
-drummer at the head of a procession or the elephant leading a menagerie
-into town. Boys of his own size pretended not to know he had been away
-at all; but they were consuming with envy, nevertheless. They would
-have given anything to have that swarthy suntanned skin of his, and his
-glittering notoriety; and Tom would not have parted with either for a
-circus.
-
-At school the children made so much of him and of Joe, and delivered
-such eloquent admiration from their eyes, that the two heroes were not
-long in becoming insufferably "stuck-up." They began to tell their
-adventures to hungry listeners--but they only began; it was not a thing
-likely to have an end, with imaginations like theirs to furnish
-material. And finally, when they got out their pipes and went serenely
-puffing around, the very summit of glory was reached.
-
-Tom decided that he could be independent of Becky Thatcher now. Glory
-was sufficient. He would live for glory. Now that he was distinguished,
-maybe she would be wanting to "make up." Well, let her--she should see
-that he could be as indifferent as some other people. Presently she
-arrived. Tom pretended not to see her. He moved away and joined a group
-of boys and girls and began to talk. Soon he observed that she was
-tripping gayly back and forth with flushed face and dancing eyes,
-pretending to be busy chasing schoolmates, and screaming with laughter
-when she made a capture; but he noticed that she always made her
-captures in his vicinity, and that she seemed to cast a conscious eye
-in his direction at such times, too. It gratified all the vicious
-vanity that was in him; and so, instead of winning him, it only "set
-him up" the more and made him the more diligent to avoid betraying that
-he knew she was about. Presently she gave over skylarking, and moved
-irresolutely about, sighing once or twice and glancing furtively and
-wistfully toward Tom. Then she observed that now Tom was talking more
-particularly to Amy Lawrence than to any one else. She felt a sharp
-pang and grew disturbed and uneasy at once. She tried to go away, but
-her feet were treacherous, and carried her to the group instead. She
-said to a girl almost at Tom's elbow--with sham vivacity:
-
-"Why, Mary Austin! you bad girl, why didn't you come to Sunday-school?"
-
-"I did come--didn't you see me?"
-
-"Why, no! Did you? Where did you sit?"
-
-"I was in Miss Peters' class, where I always go. I saw YOU."
-
-"Did you? Why, it's funny I didn't see you. I wanted to tell you about
-the picnic."
-
-"Oh, that's jolly. Who's going to give it?"
-
-"My ma's going to let me have one."
-
-"Oh, goody; I hope she'll let ME come."
-
-"Well, she will. The picnic's for me. She'll let anybody come that I
-want, and I want you."
-
-"That's ever so nice. When is it going to be?"
-
-"By and by. Maybe about vacation."
-
-"Oh, won't it be fun! You going to have all the girls and boys?"
-
-"Yes, every one that's friends to me--or wants to be"; and she glanced
-ever so furtively at Tom, but he talked right along to Amy Lawrence
-about the terrible storm on the island, and how the lightning tore the
-great sycamore tree "all to flinders" while he was "standing within
-three feet of it."
-
-"Oh, may I come?" said Grace Miller.
-
-"Yes."
-
-"And me?" said Sally Rogers.
-
-"Yes."
-
-"And me, too?" said Susy Harper. "And Joe?"
-
-"Yes."
-
-And so on, with clapping of joyful hands till all the group had begged
-for invitations but Tom and Amy. Then Tom turned coolly away, still
-talking, and took Amy with him. Becky's lips trembled and the tears
-came to her eyes; she hid these signs with a forced gayety and went on
-chattering, but the life had gone out of the picnic, now, and out of
-everything else; she got away as soon as she could and hid herself and
-had what her sex call "a good cry." Then she sat moody, with wounded
-pride, till the bell rang. She roused up, now, with a vindictive cast
-in her eye, and gave her plaited tails a shake and said she knew what
-SHE'D do.
-
-At recess Tom continued his flirtation with Amy with jubilant
-self-satisfaction. And he kept drifting about to find Becky and lacerate
-her with the performance. At last he spied her, but there was a sudden
-falling of his mercury. She was sitting cosily on a little bench behind
-the schoolhouse looking at a picture-book with Alfred Temple--and so
-absorbed were they, and their heads so close together over the book,
-that they did not seem to be conscious of anything in the world besides.
-Jealousy ran red-hot through Tom's veins. He began to hate himself for
-throwing away the chance Becky had offered for a reconciliation. He
-called himself a fool, and all the hard names he could think of. He
-wanted to cry with vexation. Amy chatted happily along, as they walked,
-for her heart was singing, but Tom's tongue had lost its function. He
-did not hear what Amy was saying, and whenever she paused expectantly he
-could only stammer an awkward assent, which was as often misplaced as
-otherwise. He kept drifting to the rear of the schoolhouse, again and
-again, to sear his eyeballs with the hateful spectacle there. He could
-not help it. And it maddened him to see, as he thought he saw, that
-Becky Thatcher never once suspected that he was even in the land of the
-living. But she did see, nevertheless; and she knew she was winning her
-fight, too, and was glad to see him suffer as she had suffered.
-
-Amy's happy prattle became intolerable. Tom hinted at things he had to
-attend to; things that must be done; and time was fleeting. But in
-vain--the girl chirped on. Tom thought, "Oh, hang her, ain't I ever
-going to get rid of her?" At last he must be attending to those
-things--and she said artlessly that she would be "around" when school
-let out. And he hastened away, hating her for it.
-
-"Any other boy!" Tom thought, grating his teeth. "Any boy in the whole
-town but that Saint Louis smarty that thinks he dresses so fine and is
-aristocracy! Oh, all right, I licked you the first day you ever saw
-this town, mister, and I'll lick you again! You just wait till I catch
-you out! I'll just take and--"
-
-And he went through the motions of thrashing an imaginary boy
---pummelling the air, and kicking and gouging. "Oh, you do, do you? You
-holler 'nough, do you? Now, then, let that learn you!" And so the
-imaginary flogging was finished to his satisfaction.
-
-Tom fled home at noon. His conscience could not endure any more of
-Amy's grateful happiness, and his jealousy could bear no more of the
-other distress. Becky resumed her picture inspections with Alfred, but
-as the minutes dragged along and no Tom came to suffer, her triumph
-began to cloud and she lost interest; gravity and absent-mindedness
-followed, and then melancholy; two or three times she pricked up her
-ear at a footstep, but it was a false hope; no Tom came. At last she
-grew entirely miserable and wished she hadn't carried it so far. When
-poor Alfred, seeing that he was losing her, he did not know how, kept
-exclaiming: "Oh, here's a jolly one! look at this!" she lost patience
-at last, and said, "Oh, don't bother me! I don't care for them!" and
-burst into tears, and got up and walked away.
-
-Alfred dropped alongside and was going to try to comfort her, but she
-said:
-
-"Go away and leave me alone, can't you! I hate you!"
-
-So the boy halted, wondering what he could have done--for she had said
-she would look at pictures all through the nooning--and she walked on,
-crying. Then Alfred went musing into the deserted schoolhouse. He was
-humiliated and angry. He easily guessed his way to the truth--the girl
-had simply made a convenience of him to vent her spite upon Tom Sawyer.
-He was far from hating Tom the less when this thought occurred to him.
-He wished there was some way to get that boy into trouble without much
-risk to himself. Tom's spelling-book fell under his eye. Here was his
-opportunity. He gratefully opened to the lesson for the afternoon and
-poured ink upon the page.
-
-Becky, glancing in at a window behind him at the moment, saw the act,
-and moved on, without discovering herself. She started homeward, now,
-intending to find Tom and tell him; Tom would be thankful and their
-troubles would be healed. Before she was half way home, however, she
-had changed her mind. The thought of Tom's treatment of her when she
-was talking about her picnic came scorching back and filled her with
-shame. She resolved to let him get whipped on the damaged
-spelling-book's account, and to hate him forever, into the bargain.
-
-
-
-CHAPTER XIX
-
-TOM arrived at home in a dreary mood, and the first thing his aunt
-said to him showed him that he had brought his sorrows to an
-unpromising market:
-
-"Tom, I've a notion to skin you alive!"
-
-"Auntie, what have I done?"
-
-"Well, you've done enough. Here I go over to Sereny Harper, like an
-old softy, expecting I'm going to make her believe all that rubbage
-about that dream, when lo and behold you she'd found out from Joe that
-you was over here and heard all the talk we had that night. Tom, I
-don't know what is to become of a boy that will act like that. It makes
-me feel so bad to think you could let me go to Sereny Harper and make
-such a fool of myself and never say a word."
-
-This was a new aspect of the thing. His smartness of the morning had
-seemed to Tom a good joke before, and very ingenious. It merely looked
-mean and shabby now. He hung his head and could not think of anything
-to say for a moment. Then he said:
-
-"Auntie, I wish I hadn't done it--but I didn't think."
-
-"Oh, child, you never think. You never think of anything but your own
-selfishness. You could think to come all the way over here from
-Jackson's Island in the night to laugh at our troubles, and you could
-think to fool me with a lie about a dream; but you couldn't ever think
-to pity us and save us from sorrow."
-
-"Auntie, I know now it was mean, but I didn't mean to be mean. I
-didn't, honest. And besides, I didn't come over here to laugh at you
-that night."
-
-"What did you come for, then?"
-
-"It was to tell you not to be uneasy about us, because we hadn't got
-drownded."
-
-"Tom, Tom, I would be the thankfullest soul in this world if I could
-believe you ever had as good a thought as that, but you know you never
-did--and I know it, Tom."
-
-"Indeed and 'deed I did, auntie--I wish I may never stir if I didn't."
-
-"Oh, Tom, don't lie--don't do it. It only makes things a hundred times
-worse."
-
-"It ain't a lie, auntie; it's the truth. I wanted to keep you from
-grieving--that was all that made me come."
-
-"I'd give the whole world to believe that--it would cover up a power
-of sins, Tom. I'd 'most be glad you'd run off and acted so bad. But it
-ain't reasonable; because, why didn't you tell me, child?"
-
-"Why, you see, when you got to talking about the funeral, I just got
-all full of the idea of our coming and hiding in the church, and I
-couldn't somehow bear to spoil it. So I just put the bark back in my
-pocket and kept mum."
-
-"What bark?"
-
-"The bark I had wrote on to tell you we'd gone pirating. I wish, now,
-you'd waked up when I kissed you--I do, honest."
-
-The hard lines in his aunt's face relaxed and a sudden tenderness
-dawned in her eyes.
-
-"DID you kiss me, Tom?"
-
-"Why, yes, I did."
-
-"Are you sure you did, Tom?"
-
-"Why, yes, I did, auntie--certain sure."
-
-"What did you kiss me for, Tom?"
-
-"Because I loved you so, and you laid there moaning and I was so sorry."
-
-The words sounded like truth. The old lady could not hide a tremor in
-her voice when she said:
-
-"Kiss me again, Tom!--and be off with you to school, now, and don't
-bother me any more."
-
-The moment he was gone, she ran to a closet and got out the ruin of a
-jacket which Tom had gone pirating in. Then she stopped, with it in her
-hand, and said to herself:
-
-"No, I don't dare. Poor boy, I reckon he's lied about it--but it's a
-blessed, blessed lie, there's such a comfort come from it. I hope the
-Lord--I KNOW the Lord will forgive him, because it was such
-goodheartedness in him to tell it. But I don't want to find out it's a
-lie. I won't look."
-
-She put the jacket away, and stood by musing a minute. Twice she put
-out her hand to take the garment again, and twice she refrained. Once
-more she ventured, and this time she fortified herself with the
-thought: "It's a good lie--it's a good lie--I won't let it grieve me."
-So she sought the jacket pocket. A moment later she was reading Tom's
-piece of bark through flowing tears and saying: "I could forgive the
-boy, now, if he'd committed a million sins!"
-
-
-
-CHAPTER XX
-
-THERE was something about Aunt Polly's manner, when she kissed Tom,
-that swept away his low spirits and made him lighthearted and happy
-again. He started to school and had the luck of coming upon Becky
-Thatcher at the head of Meadow Lane. His mood always determined his
-manner. Without a moment's hesitation he ran to her and said:
-
-"I acted mighty mean to-day, Becky, and I'm so sorry. I won't ever,
-ever do that way again, as long as ever I live--please make up, won't
-you?"
-
-The girl stopped and looked him scornfully in the face:
-
-"I'll thank you to keep yourself TO yourself, Mr. Thomas Sawyer. I'll
-never speak to you again."
-
-She tossed her head and passed on. Tom was so stunned that he had not
-even presence of mind enough to say "Who cares, Miss Smarty?" until the
-right time to say it had gone by. So he said nothing. But he was in a
-fine rage, nevertheless. He moped into the schoolyard wishing she were
-a boy, and imagining how he would trounce her if she were. He presently
-encountered her and delivered a stinging remark as he passed. She
-hurled one in return, and the angry breach was complete. It seemed to
-Becky, in her hot resentment, that she could hardly wait for school to
-"take in," she was so impatient to see Tom flogged for the injured
-spelling-book. If she had had any lingering notion of exposing Alfred
-Temple, Tom's offensive fling had driven it entirely away.
-
-Poor girl, she did not know how fast she was nearing trouble herself.
-The master, Mr. Dobbins, had reached middle age with an unsatisfied
-ambition. The darling of his desires was, to be a doctor, but poverty
-had decreed that he should be nothing higher than a village
-schoolmaster. Every day he took a mysterious book out of his desk and
-absorbed himself in it at times when no classes were reciting. He kept
-that book under lock and key. There was not an urchin in school but was
-perishing to have a glimpse of it, but the chance never came. Every boy
-and girl had a theory about the nature of that book; but no two
-theories were alike, and there was no way of getting at the facts in
-the case. Now, as Becky was passing by the desk, which stood near the
-door, she noticed that the key was in the lock! It was a precious
-moment. She glanced around; found herself alone, and the next instant
-she had the book in her hands. The title-page--Professor Somebody's
-ANATOMY--carried no information to her mind; so she began to turn the
-leaves. She came at once upon a handsomely engraved and colored
-frontispiece--a human figure, stark naked. At that moment a shadow fell
-on the page and Tom Sawyer stepped in at the door and caught a glimpse
-of the picture. Becky snatched at the book to close it, and had the
-hard luck to tear the pictured page half down the middle. She thrust
-the volume into the desk, turned the key, and burst out crying with
-shame and vexation.
-
-"Tom Sawyer, you are just as mean as you can be, to sneak up on a
-person and look at what they're looking at."
-
-"How could I know you was looking at anything?"
-
-"You ought to be ashamed of yourself, Tom Sawyer; you know you're
-going to tell on me, and oh, what shall I do, what shall I do! I'll be
-whipped, and I never was whipped in school."
-
-Then she stamped her little foot and said:
-
-"BE so mean if you want to! I know something that's going to happen.
-You just wait and you'll see! Hateful, hateful, hateful!"--and she
-flung out of the house with a new explosion of crying.
-
-Tom stood still, rather flustered by this onslaught. Presently he said
-to himself:
-
-"What a curious kind of a fool a girl is! Never been licked in school!
-Shucks! What's a licking! That's just like a girl--they're so
-thin-skinned and chicken-hearted. Well, of course I ain't going to tell
-old Dobbins on this little fool, because there's other ways of getting
-even on her, that ain't so mean; but what of it? Old Dobbins will ask
-who it was tore his book. Nobody'll answer. Then he'll do just the way
-he always does--ask first one and then t'other, and when he comes to the
-right girl he'll know it, without any telling. Girls' faces always tell
-on them. They ain't got any backbone. She'll get licked. Well, it's a
-kind of a tight place for Becky Thatcher, because there ain't any way
-out of it." Tom conned the thing a moment longer, and then added: "All
-right, though; she'd like to see me in just such a fix--let her sweat it
-out!"
-
-Tom joined the mob of skylarking scholars outside. In a few moments
-the master arrived and school "took in." Tom did not feel a strong
-interest in his studies. Every time he stole a glance at the girls'
-side of the room Becky's face troubled him. Considering all things, he
-did not want to pity her, and yet it was all he could do to help it. He
-could get up no exultation that was really worthy the name. Presently
-the spelling-book discovery was made, and Tom's mind was entirely full
-of his own matters for a while after that. Becky roused up from her
-lethargy of distress and showed good interest in the proceedings. She
-did not expect that Tom could get out of his trouble by denying that he
-spilt the ink on the book himself; and she was right. The denial only
-seemed to make the thing worse for Tom. Becky supposed she would be
-glad of that, and she tried to believe she was glad of it, but she
-found she was not certain. When the worst came to the worst, she had an
-impulse to get up and tell on Alfred Temple, but she made an effort and
-forced herself to keep still--because, said she to herself, "he'll tell
-about me tearing the picture sure. I wouldn't say a word, not to save
-his life!"
-
-Tom took his whipping and went back to his seat not at all
-broken-hearted, for he thought it was possible that he had unknowingly
-upset the ink on the spelling-book himself, in some skylarking bout--he
-had denied it for form's sake and because it was custom, and had stuck
-to the denial from principle.
-
-A whole hour drifted by, the master sat nodding in his throne, the air
-was drowsy with the hum of study. By and by, Mr. Dobbins straightened
-himself up, yawned, then unlocked his desk, and reached for his book,
-but seemed undecided whether to take it out or leave it. Most of the
-pupils glanced up languidly, but there were two among them that watched
-his movements with intent eyes. Mr. Dobbins fingered his book absently
-for a while, then took it out and settled himself in his chair to read!
-Tom shot a glance at Becky. He had seen a hunted and helpless rabbit
-look as she did, with a gun levelled at its head. Instantly he forgot
-his quarrel with her. Quick--something must be done! done in a flash,
-too! But the very imminence of the emergency paralyzed his invention.
-Good!--he had an inspiration! He would run and snatch the book, spring
-through the door and fly. But his resolution shook for one little
-instant, and the chance was lost--the master opened the volume. If Tom
-only had the wasted opportunity back again! Too late. There was no help
-for Becky now, he said. The next moment the master faced the school.
-Every eye sank under his gaze. There was that in it which smote even
-the innocent with fear. There was silence while one might count ten
---the master was gathering his wrath. Then he spoke: "Who tore this book?"
-
-There was not a sound. One could have heard a pin drop. The stillness
-continued; the master searched face after face for signs of guilt.
-
-"Benjamin Rogers, did you tear this book?"
-
-A denial. Another pause.
-
-"Joseph Harper, did you?"
-
-Another denial. Tom's uneasiness grew more and more intense under the
-slow torture of these proceedings. The master scanned the ranks of
-boys--considered a while, then turned to the girls:
-
-"Amy Lawrence?"
-
-A shake of the head.
-
-"Gracie Miller?"
-
-The same sign.
-
-"Susan Harper, did you do this?"
-
-Another negative. The next girl was Becky Thatcher. Tom was trembling
-from head to foot with excitement and a sense of the hopelessness of
-the situation.
-
-"Rebecca Thatcher" [Tom glanced at her face--it was white with terror]
---"did you tear--no, look me in the face" [her hands rose in appeal]
---"did you tear this book?"
-
-A thought shot like lightning through Tom's brain. He sprang to his
-feet and shouted--"I done it!"
-
-The school stared in perplexity at this incredible folly. Tom stood a
-moment, to gather his dismembered faculties; and when he stepped
-forward to go to his punishment the surprise, the gratitude, the
-adoration that shone upon him out of poor Becky's eyes seemed pay
-enough for a hundred floggings. Inspired by the splendor of his own
-act, he took without an outcry the most merciless flaying that even Mr.
-Dobbins had ever administered; and also received with indifference the
-added cruelty of a command to remain two hours after school should be
-dismissed--for he knew who would wait for him outside till his
-captivity was done, and not count the tedious time as loss, either.
-
-Tom went to bed that night planning vengeance against Alfred Temple;
-for with shame and repentance Becky had told him all, not forgetting
-her own treachery; but even the longing for vengeance had to give way,
-soon, to pleasanter musings, and he fell asleep at last with Becky's
-latest words lingering dreamily in his ear--
-
-"Tom, how COULD you be so noble!"
-
-
-
-CHAPTER XXI
-
-VACATION was approaching. The schoolmaster, always severe, grew
-severer and more exacting than ever, for he wanted the school to make a
-good showing on "Examination" day. His rod and his ferule were seldom
-idle now--at least among the smaller pupils. Only the biggest boys, and
-young ladies of eighteen and twenty, escaped lashing. Mr. Dobbins'
-lashings were very vigorous ones, too; for although he carried, under
-his wig, a perfectly bald and shiny head, he had only reached middle
-age, and there was no sign of feebleness in his muscle. As the great
-day approached, all the tyranny that was in him came to the surface; he
-seemed to take a vindictive pleasure in punishing the least
-shortcomings. The consequence was, that the smaller boys spent their
-days in terror and suffering and their nights in plotting revenge. They
-threw away no opportunity to do the master a mischief. But he kept
-ahead all the time. The retribution that followed every vengeful
-success was so sweeping and majestic that the boys always retired from
-the field badly worsted. At last they conspired together and hit upon a
-plan that promised a dazzling victory. They swore in the sign-painter's
-boy, told him the scheme, and asked his help. He had his own reasons
-for being delighted, for the master boarded in his father's family and
-had given the boy ample cause to hate him. The master's wife would go
-on a visit to the country in a few days, and there would be nothing to
-interfere with the plan; the master always prepared himself for great
-occasions by getting pretty well fuddled, and the sign-painter's boy
-said that when the dominie had reached the proper condition on
-Examination Evening he would "manage the thing" while he napped in his
-chair; then he would have him awakened at the right time and hurried
-away to school.
-
-In the fulness of time the interesting occasion arrived. At eight in
-the evening the schoolhouse was brilliantly lighted, and adorned with
-wreaths and festoons of foliage and flowers. The master sat throned in
-his great chair upon a raised platform, with his blackboard behind him.
-He was looking tolerably mellow. Three rows of benches on each side and
-six rows in front of him were occupied by the dignitaries of the town
-and by the parents of the pupils. To his left, back of the rows of
-citizens, was a spacious temporary platform upon which were seated the
-scholars who were to take part in the exercises of the evening; rows of
-small boys, washed and dressed to an intolerable state of discomfort;
-rows of gawky big boys; snowbanks of girls and young ladies clad in
-lawn and muslin and conspicuously conscious of their bare arms, their
-grandmothers' ancient trinkets, their bits of pink and blue ribbon and
-the flowers in their hair. All the rest of the house was filled with
-non-participating scholars.
-
-The exercises began. A very little boy stood up and sheepishly
-recited, "You'd scarce expect one of my age to speak in public on the
-stage," etc.--accompanying himself with the painfully exact and
-spasmodic gestures which a machine might have used--supposing the
-machine to be a trifle out of order. But he got through safely, though
-cruelly scared, and got a fine round of applause when he made his
-manufactured bow and retired.
-
-A little shamefaced girl lisped, "Mary had a little lamb," etc.,
-performed a compassion-inspiring curtsy, got her meed of applause, and
-sat down flushed and happy.
-
-Tom Sawyer stepped forward with conceited confidence and soared into
-the unquenchable and indestructible "Give me liberty or give me death"
-speech, with fine fury and frantic gesticulation, and broke down in the
-middle of it. A ghastly stage-fright seized him, his legs quaked under
-him and he was like to choke. True, he had the manifest sympathy of the
-house but he had the house's silence, too, which was even worse than
-its sympathy. The master frowned, and this completed the disaster. Tom
-struggled awhile and then retired, utterly defeated. There was a weak
-attempt at applause, but it died early.
-
-"The Boy Stood on the Burning Deck" followed; also "The Assyrian Came
-Down," and other declamatory gems. Then there were reading exercises,
-and a spelling fight. The meagre Latin class recited with honor. The
-prime feature of the evening was in order, now--original "compositions"
-by the young ladies. Each in her turn stepped forward to the edge of
-the platform, cleared her throat, held up her manuscript (tied with
-dainty ribbon), and proceeded to read, with labored attention to
-"expression" and punctuation. The themes were the same that had been
-illuminated upon similar occasions by their mothers before them, their
-grandmothers, and doubtless all their ancestors in the female line
-clear back to the Crusades. "Friendship" was one; "Memories of Other
-Days"; "Religion in History"; "Dream Land"; "The Advantages of
-Culture"; "Forms of Political Government Compared and Contrasted";
-"Melancholy"; "Filial Love"; "Heart Longings," etc., etc.
-
-A prevalent feature in these compositions was a nursed and petted
-melancholy; another was a wasteful and opulent gush of "fine language";
-another was a tendency to lug in by the ears particularly prized words
-and phrases until they were worn entirely out; and a peculiarity that
-conspicuously marked and marred them was the inveterate and intolerable
-sermon that wagged its crippled tail at the end of each and every one
-of them. No matter what the subject might be, a brain-racking effort
-was made to squirm it into some aspect or other that the moral and
-religious mind could contemplate with edification. The glaring
-insincerity of these sermons was not sufficient to compass the
-banishment of the fashion from the schools, and it is not sufficient
-to-day; it never will be sufficient while the world stands, perhaps.
-There is no school in all our land where the young ladies do not feel
-obliged to close their compositions with a sermon; and you will find
-that the sermon of the most frivolous and the least religious girl in
-the school is always the longest and the most relentlessly pious. But
-enough of this. Homely truth is unpalatable.
-
-Let us return to the "Examination." The first composition that was
-read was one entitled "Is this, then, Life?" Perhaps the reader can
-endure an extract from it:
-
-  "In the common walks of life, with what delightful
-   emotions does the youthful mind look forward to some
-   anticipated scene of festivity! Imagination is busy
-   sketching rose-tinted pictures of joy. In fancy, the
-   voluptuous votary of fashion sees herself amid the
-   festive throng, 'the observed of all observers.' Her
-   graceful form, arrayed in snowy robes, is whirling
-   through the mazes of the joyous dance; her eye is
-   brightest, her step is lightest in the gay assembly.
-
-  "In such delicious fancies time quickly glides by,
-   and the welcome hour arrives for her entrance into
-   the Elysian world, of which she has had such bright
-   dreams. How fairy-like does everything appear to
-   her enchanted vision! Each new scene is more charming
-   than the last. But after a while she finds that
-   beneath this goodly exterior, all is vanity, the
-   flattery which once charmed her soul, now grates
-   harshly upon her ear; the ball-room has lost its
-   charms; and with wasted health and imbittered heart,
-   she turns away with the conviction that earthly
-   pleasures cannot satisfy the longings of the soul!"
-
-And so forth and so on. There was a buzz of gratification from time to
-time during the reading, accompanied by whispered ejaculations of "How
-sweet!" "How eloquent!" "So true!" etc., and after the thing had closed
-with a peculiarly afflicting sermon the applause was enthusiastic.
-
-Then arose a slim, melancholy girl, whose face had the "interesting"
-paleness that comes of pills and indigestion, and read a "poem." Two
-stanzas of it will do:
-
-   "A MISSOURI MAIDEN'S FAREWELL TO ALABAMA
-
-   "Alabama, good-bye! I love thee well!
-      But yet for a while do I leave thee now!
-    Sad, yes, sad thoughts of thee my heart doth swell,
-      And burning recollections throng my brow!
-    For I have wandered through thy flowery woods;
-      Have roamed and read near Tallapoosa's stream;
-    Have listened to Tallassee's warring floods,
-      And wooed on Coosa's side Aurora's beam.
-
-   "Yet shame I not to bear an o'er-full heart,
-      Nor blush to turn behind my tearful eyes;
-    'Tis from no stranger land I now must part,
-      'Tis to no strangers left I yield these sighs.
-    Welcome and home were mine within this State,
-      Whose vales I leave--whose spires fade fast from me
-    And cold must be mine eyes, and heart, and tete,
-      When, dear Alabama! they turn cold on thee!"
-
-There were very few there who knew what "tete" meant, but the poem was
-very satisfactory, nevertheless.
-
-Next appeared a dark-complexioned, black-eyed, black-haired young
-lady, who paused an impressive moment, assumed a tragic expression, and
-began to read in a measured, solemn tone:
-
-  "A VISION
-
-   "Dark and tempestuous was night. Around the
-   throne on high not a single star quivered; but
-   the deep intonations of the heavy thunder
-   constantly vibrated upon the ear; whilst the
-   terrific lightning revelled in angry mood
-   through the cloudy chambers of heaven, seeming
-   to scorn the power exerted over its terror by
-   the illustrious Franklin! Even the boisterous
-   winds unanimously came forth from their mystic
-   homes, and blustered about as if to enhance by
-   their aid the wildness of the scene.
-
-   "At such a time, so dark, so dreary, for human
-   sympathy my very spirit sighed; but instead thereof,
-
-   "'My dearest friend, my counsellor, my comforter
-   and guide--My joy in grief, my second bliss
-   in joy,' came to my side. She moved like one of
-   those bright beings pictured in the sunny walks
-   of fancy's Eden by the romantic and young, a
-   queen of beauty unadorned save by her own
-   transcendent loveliness. So soft was her step, it
-   failed to make even a sound, and but for the
-   magical thrill imparted by her genial touch, as
-   other unobtrusive beauties, she would have glided
-   away un-perceived--unsought. A strange sadness
-   rested upon her features, like icy tears upon
-   the robe of December, as she pointed to the
-   contending elements without, and bade me contemplate
-   the two beings presented."
-
-This nightmare occupied some ten pages of manuscript and wound up with
-a sermon so destructive of all hope to non-Presbyterians that it took
-the first prize. This composition was considered to be the very finest
-effort of the evening. The mayor of the village, in delivering the
-prize to the author of it, made a warm speech in which he said that it
-was by far the most "eloquent" thing he had ever listened to, and that
-Daniel Webster himself might well be proud of it.
-
-It may be remarked, in passing, that the number of compositions in
-which the word "beauteous" was over-fondled, and human experience
-referred to as "life's page," was up to the usual average.
-
-Now the master, mellow almost to the verge of geniality, put his chair
-aside, turned his back to the audience, and began to draw a map of
-America on the blackboard, to exercise the geography class upon. But he
-made a sad business of it with his unsteady hand, and a smothered
-titter rippled over the house. He knew what the matter was, and set
-himself to right it. He sponged out lines and remade them; but he only
-distorted them more than ever, and the tittering was more pronounced.
-He threw his entire attention upon his work, now, as if determined not
-to be put down by the mirth. He felt that all eyes were fastened upon
-him; he imagined he was succeeding, and yet the tittering continued; it
-even manifestly increased. And well it might. There was a garret above,
-pierced with a scuttle over his head; and down through this scuttle
-came a cat, suspended around the haunches by a string; she had a rag
-tied about her head and jaws to keep her from mewing; as she slowly
-descended she curved upward and clawed at the string, she swung
-downward and clawed at the intangible air. The tittering rose higher
-and higher--the cat was within six inches of the absorbed teacher's
-head--down, down, a little lower, and she grabbed his wig with her
-desperate claws, clung to it, and was snatched up into the garret in an
-instant with her trophy still in her possession! And how the light did
-blaze abroad from the master's bald pate--for the sign-painter's boy
-had GILDED it!
-
-That broke up the meeting. The boys were avenged. Vacation had come.
-
-   NOTE:--The pretended "compositions" quoted in
-   this chapter are taken without alteration from a
-   volume entitled "Prose and Poetry, by a Western
-   Lady"--but they are exactly and precisely after
-   the schoolgirl pattern, and hence are much
-   happier than any mere imitations could be.
-
-
-
-CHAPTER XXII
-
-TOM joined the new order of Cadets of Temperance, being attracted by
-the showy character of their "regalia." He promised to abstain from
-smoking, chewing, and profanity as long as he remained a member. Now he
-found out a new thing--namely, that to promise not to do a thing is the
-surest way in the world to make a body want to go and do that very
-thing. Tom soon found himself tormented with a desire to drink and
-swear; the desire grew to be so intense that nothing but the hope of a
-chance to display himself in his red sash kept him from withdrawing
-from the order. Fourth of July was coming; but he soon gave that up
---gave it up before he had worn his shackles over forty-eight hours--and
-fixed his hopes upon old Judge Frazer, justice of the peace, who was
-apparently on his deathbed and would have a big public funeral, since
-he was so high an official. During three days Tom was deeply concerned
-about the Judge's condition and hungry for news of it. Sometimes his
-hopes ran high--so high that he would venture to get out his regalia
-and practise before the looking-glass. But the Judge had a most
-discouraging way of fluctuating. At last he was pronounced upon the
-mend--and then convalescent. Tom was disgusted; and felt a sense of
-injury, too. He handed in his resignation at once--and that night the
-Judge suffered a relapse and died. Tom resolved that he would never
-trust a man like that again.
-
-The funeral was a fine thing. The Cadets paraded in a style calculated
-to kill the late member with envy. Tom was a free boy again, however
---there was something in that. He could drink and swear, now--but found
-to his surprise that he did not want to. The simple fact that he could,
-took the desire away, and the charm of it.
-
-Tom presently wondered to find that his coveted vacation was beginning
-to hang a little heavily on his hands.
-
-He attempted a diary--but nothing happened during three days, and so
-he abandoned it.
-
-The first of all the negro minstrel shows came to town, and made a
-sensation. Tom and Joe Harper got up a band of performers and were
-happy for two days.
-
-Even the Glorious Fourth was in some sense a failure, for it rained
-hard, there was no procession in consequence, and the greatest man in
-the world (as Tom supposed), Mr. Benton, an actual United States
-Senator, proved an overwhelming disappointment--for he was not
-twenty-five feet high, nor even anywhere in the neighborhood of it.
-
-A circus came. The boys played circus for three days afterward in
-tents made of rag carpeting--admission, three pins for boys, two for
-girls--and then circusing was abandoned.
-
-A phrenologist and a mesmerizer came--and went again and left the
-village duller and drearier than ever.
-
-There were some boys-and-girls' parties, but they were so few and so
-delightful that they only made the aching voids between ache the harder.
-
-Becky Thatcher was gone to her Constantinople home to stay with her
-parents during vacation--so there was no bright side to life anywhere.
-
-The dreadful secret of the murder was a chronic misery. It was a very
-cancer for permanency and pain.
-
-Then came the measles.
-
-During two long weeks Tom lay a prisoner, dead to the world and its
-happenings. He was very ill, he was interested in nothing. When he got
-upon his feet at last and moved feebly down-town, a melancholy change
-had come over everything and every creature. There had been a
-"revival," and everybody had "got religion," not only the adults, but
-even the boys and girls. Tom went about, hoping against hope for the
-sight of one blessed sinful face, but disappointment crossed him
-everywhere. He found Joe Harper studying a Testament, and turned sadly
-away from the depressing spectacle. He sought Ben Rogers, and found him
-visiting the poor with a basket of tracts. He hunted up Jim Hollis, who
-called his attention to the precious blessing of his late measles as a
-warning. Every boy he encountered added another ton to his depression;
-and when, in desperation, he flew for refuge at last to the bosom of
-Huckleberry Finn and was received with a Scriptural quotation, his
-heart broke and he crept home and to bed realizing that he alone of all
-the town was lost, forever and forever.
-
-And that night there came on a terrific storm, with driving rain,
-awful claps of thunder and blinding sheets of lightning. He covered his
-head with the bedclothes and waited in a horror of suspense for his
-doom; for he had not the shadow of a doubt that all this hubbub was
-about him. He believed he had taxed the forbearance of the powers above
-to the extremity of endurance and that this was the result. It might
-have seemed to him a waste of pomp and ammunition to kill a bug with a
-battery of artillery, but there seemed nothing incongruous about the
-getting up such an expensive thunderstorm as this to knock the turf
-from under an insect like himself.
-
-By and by the tempest spent itself and died without accomplishing its
-object. The boy's first impulse was to be grateful, and reform. His
-second was to wait--for there might not be any more storms.
-
-The next day the doctors were back; Tom had relapsed. The three weeks
-he spent on his back this time seemed an entire age. When he got abroad
-at last he was hardly grateful that he had been spared, remembering how
-lonely was his estate, how companionless and forlorn he was. He drifted
-listlessly down the street and found Jim Hollis acting as judge in a
-juvenile court that was trying a cat for murder, in the presence of her
-victim, a bird. He found Joe Harper and Huck Finn up an alley eating a
-stolen melon. Poor lads! they--like Tom--had suffered a relapse.
-
-
-
-CHAPTER XXIII
-
-AT last the sleepy atmosphere was stirred--and vigorously: the murder
-trial came on in the court. It became the absorbing topic of village
-talk immediately. Tom could not get away from it. Every reference to
-the murder sent a shudder to his heart, for his troubled conscience and
-fears almost persuaded him that these remarks were put forth in his
-hearing as "feelers"; he did not see how he could be suspected of
-knowing anything about the murder, but still he could not be
-comfortable in the midst of this gossip. It kept him in a cold shiver
-all the time. He took Huck to a lonely place to have a talk with him.
-It would be some relief to unseal his tongue for a little while; to
-divide his burden of distress with another sufferer. Moreover, he
-wanted to assure himself that Huck had remained discreet.
-
-"Huck, have you ever told anybody about--that?"
-
-"'Bout what?"
-
-"You know what."
-
-"Oh--'course I haven't."
-
-"Never a word?"
-
-"Never a solitary word, so help me. What makes you ask?"
-
-"Well, I was afeard."
-
-"Why, Tom Sawyer, we wouldn't be alive two days if that got found out.
-YOU know that."
-
-Tom felt more comfortable. After a pause:
-
-"Huck, they couldn't anybody get you to tell, could they?"
-
-"Get me to tell? Why, if I wanted that half-breed devil to drownd me
-they could get me to tell. They ain't no different way."
-
-"Well, that's all right, then. I reckon we're safe as long as we keep
-mum. But let's swear again, anyway. It's more surer."
-
-"I'm agreed."
-
-So they swore again with dread solemnities.
-
-"What is the talk around, Huck? I've heard a power of it."
-
-"Talk? Well, it's just Muff Potter, Muff Potter, Muff Potter all the
-time. It keeps me in a sweat, constant, so's I want to hide som'ers."
-
-"That's just the same way they go on round me. I reckon he's a goner.
-Don't you feel sorry for him, sometimes?"
-
-"Most always--most always. He ain't no account; but then he hain't
-ever done anything to hurt anybody. Just fishes a little, to get money
-to get drunk on--and loafs around considerable; but lord, we all do
-that--leastways most of us--preachers and such like. But he's kind of
-good--he give me half a fish, once, when there warn't enough for two;
-and lots of times he's kind of stood by me when I was out of luck."
-
-"Well, he's mended kites for me, Huck, and knitted hooks on to my
-line. I wish we could get him out of there."
-
-"My! we couldn't get him out, Tom. And besides, 'twouldn't do any
-good; they'd ketch him again."
-
-"Yes--so they would. But I hate to hear 'em abuse him so like the
-dickens when he never done--that."
-
-"I do too, Tom. Lord, I hear 'em say he's the bloodiest looking
-villain in this country, and they wonder he wasn't ever hung before."
-
-"Yes, they talk like that, all the time. I've heard 'em say that if he
-was to get free they'd lynch him."
-
-"And they'd do it, too."
-
-The boys had a long talk, but it brought them little comfort. As the
-twilight drew on, they found themselves hanging about the neighborhood
-of the little isolated jail, perhaps with an undefined hope that
-something would happen that might clear away their difficulties. But
-nothing happened; there seemed to be no angels or fairies interested in
-this luckless captive.
-
-The boys did as they had often done before--went to the cell grating
-and gave Potter some tobacco and matches. He was on the ground floor
-and there were no guards.
-
-His gratitude for their gifts had always smote their consciences
-before--it cut deeper than ever, this time. They felt cowardly and
-treacherous to the last degree when Potter said:
-
-"You've been mighty good to me, boys--better'n anybody else in this
-town. And I don't forget it, I don't. Often I says to myself, says I,
-'I used to mend all the boys' kites and things, and show 'em where the
-good fishin' places was, and befriend 'em what I could, and now they've
-all forgot old Muff when he's in trouble; but Tom don't, and Huck
-don't--THEY don't forget him, says I, 'and I don't forget them.' Well,
-boys, I done an awful thing--drunk and crazy at the time--that's the
-only way I account for it--and now I got to swing for it, and it's
-right. Right, and BEST, too, I reckon--hope so, anyway. Well, we won't
-talk about that. I don't want to make YOU feel bad; you've befriended
-me. But what I want to say, is, don't YOU ever get drunk--then you won't
-ever get here. Stand a litter furder west--so--that's it; it's a prime
-comfort to see faces that's friendly when a body's in such a muck of
-trouble, and there don't none come here but yourn. Good friendly
-faces--good friendly faces. Git up on one another's backs and let me
-touch 'em. That's it. Shake hands--yourn'll come through the bars, but
-mine's too big. Little hands, and weak--but they've helped Muff Potter
-a power, and they'd help him more if they could."
-
-Tom went home miserable, and his dreams that night were full of
-horrors. The next day and the day after, he hung about the court-room,
-drawn by an almost irresistible impulse to go in, but forcing himself
-to stay out. Huck was having the same experience. They studiously
-avoided each other. Each wandered away, from time to time, but the same
-dismal fascination always brought them back presently. Tom kept his
-ears open when idlers sauntered out of the court-room, but invariably
-heard distressing news--the toils were closing more and more
-relentlessly around poor Potter. At the end of the second day the
-village talk was to the effect that Injun Joe's evidence stood firm and
-unshaken, and that there was not the slightest question as to what the
-jury's verdict would be.
-
-Tom was out late, that night, and came to bed through the window. He
-was in a tremendous state of excitement. It was hours before he got to
-sleep. All the village flocked to the court-house the next morning, for
-this was to be the great day. Both sexes were about equally represented
-in the packed audience. After a long wait the jury filed in and took
-their places; shortly afterward, Potter, pale and haggard, timid and
-hopeless, was brought in, with chains upon him, and seated where all
-the curious eyes could stare at him; no less conspicuous was Injun Joe,
-stolid as ever. There was another pause, and then the judge arrived and
-the sheriff proclaimed the opening of the court. The usual whisperings
-among the lawyers and gathering together of papers followed. These
-details and accompanying delays worked up an atmosphere of preparation
-that was as impressive as it was fascinating.
-
-Now a witness was called who testified that he found Muff Potter
-washing in the brook, at an early hour of the morning that the murder
-was discovered, and that he immediately sneaked away. After some
-further questioning, counsel for the prosecution said:
-
-"Take the witness."
-
-The prisoner raised his eyes for a moment, but dropped them again when
-his own counsel said:
-
-"I have no questions to ask him."
-
-The next witness proved the finding of the knife near the corpse.
-Counsel for the prosecution said:
-
-"Take the witness."
-
-"I have no questions to ask him," Potter's lawyer replied.
-
-A third witness swore he had often seen the knife in Potter's
-possession.
-
-"Take the witness."
-
-Counsel for Potter declined to question him. The faces of the audience
-began to betray annoyance. Did this attorney mean to throw away his
-client's life without an effort?
-
-Several witnesses deposed concerning Potter's guilty behavior when
-brought to the scene of the murder. They were allowed to leave the
-stand without being cross-questioned.
-
-Every detail of the damaging circumstances that occurred in the
-graveyard upon that morning which all present remembered so well was
-brought out by credible witnesses, but none of them were cross-examined
-by Potter's lawyer. The perplexity and dissatisfaction of the house
-expressed itself in murmurs and provoked a reproof from the bench.
-Counsel for the prosecution now said:
-
-"By the oaths of citizens whose simple word is above suspicion, we
-have fastened this awful crime, beyond all possibility of question,
-upon the unhappy prisoner at the bar. We rest our case here."
-
-A groan escaped from poor Potter, and he put his face in his hands and
-rocked his body softly to and fro, while a painful silence reigned in
-the court-room. Many men were moved, and many women's compassion
-testified itself in tears. Counsel for the defence rose and said:
-
-"Your honor, in our remarks at the opening of this trial, we
-foreshadowed our purpose to prove that our client did this fearful deed
-while under the influence of a blind and irresponsible delirium
-produced by drink. We have changed our mind. We shall not offer that
-plea." [Then to the clerk:] "Call Thomas Sawyer!"
-
-A puzzled amazement awoke in every face in the house, not even
-excepting Potter's. Every eye fastened itself with wondering interest
-upon Tom as he rose and took his place upon the stand. The boy looked
-wild enough, for he was badly scared. The oath was administered.
-
-"Thomas Sawyer, where were you on the seventeenth of June, about the
-hour of midnight?"
-
-Tom glanced at Injun Joe's iron face and his tongue failed him. The
-audience listened breathless, but the words refused to come. After a
-few moments, however, the boy got a little of his strength back, and
-managed to put enough of it into his voice to make part of the house
-hear:
-
-"In the graveyard!"
-
-"A little bit louder, please. Don't be afraid. You were--"
-
-"In the graveyard."
-
-A contemptuous smile flitted across Injun Joe's face.
-
-"Were you anywhere near Horse Williams' grave?"
-
-"Yes, sir."
-
-"Speak up--just a trifle louder. How near were you?"
-
-"Near as I am to you."
-
-"Were you hidden, or not?"
-
-"I was hid."
-
-"Where?"
-
-"Behind the elms that's on the edge of the grave."
-
-Injun Joe gave a barely perceptible start.
-
-"Any one with you?"
-
-"Yes, sir. I went there with--"
-
-"Wait--wait a moment. Never mind mentioning your companion's name. We
-will produce him at the proper time. Did you carry anything there with
-you."
-
-Tom hesitated and looked confused.
-
-"Speak out, my boy--don't be diffident. The truth is always
-respectable. What did you take there?"
-
-"Only a--a--dead cat."
-
-There was a ripple of mirth, which the court checked.
-
-"We will produce the skeleton of that cat. Now, my boy, tell us
-everything that occurred--tell it in your own way--don't skip anything,
-and don't be afraid."
-
-Tom began--hesitatingly at first, but as he warmed to his subject his
-words flowed more and more easily; in a little while every sound ceased
-but his own voice; every eye fixed itself upon him; with parted lips
-and bated breath the audience hung upon his words, taking no note of
-time, rapt in the ghastly fascinations of the tale. The strain upon
-pent emotion reached its climax when the boy said:
-
-"--and as the doctor fetched the board around and Muff Potter fell,
-Injun Joe jumped with the knife and--"
-
-Crash! Quick as lightning the half-breed sprang for a window, tore his
-way through all opposers, and was gone!
-
-
-
-CHAPTER XXIV
-
-TOM was a glittering hero once more--the pet of the old, the envy of
-the young. His name even went into immortal print, for the village
-paper magnified him. There were some that believed he would be
-President, yet, if he escaped hanging.
-
-As usual, the fickle, unreasoning world took Muff Potter to its bosom
-and fondled him as lavishly as it had abused him before. But that sort
-of conduct is to the world's credit; therefore it is not well to find
-fault with it.
-
-Tom's days were days of splendor and exultation to him, but his nights
-were seasons of horror. Injun Joe infested all his dreams, and always
-with doom in his eye. Hardly any temptation could persuade the boy to
-stir abroad after nightfall. Poor Huck was in the same state of
-wretchedness and terror, for Tom had told the whole story to the lawyer
-the night before the great day of the trial, and Huck was sore afraid
-that his share in the business might leak out, yet, notwithstanding
-Injun Joe's flight had saved him the suffering of testifying in court.
-The poor fellow had got the attorney to promise secrecy, but what of
-that? Since Tom's harassed conscience had managed to drive him to the
-lawyer's house by night and wring a dread tale from lips that had been
-sealed with the dismalest and most formidable of oaths, Huck's
-confidence in the human race was well-nigh obliterated.
-
-Daily Muff Potter's gratitude made Tom glad he had spoken; but nightly
-he wished he had sealed up his tongue.
-
-Half the time Tom was afraid Injun Joe would never be captured; the
-other half he was afraid he would be. He felt sure he never could draw
-a safe breath again until that man was dead and he had seen the corpse.
-
-Rewards had been offered, the country had been scoured, but no Injun
-Joe was found. One of those omniscient and awe-inspiring marvels, a
-detective, came up from St. Louis, moused around, shook his head,
-looked wise, and made that sort of astounding success which members of
-that craft usually achieve. That is to say, he "found a clew." But you
-can't hang a "clew" for murder, and so after that detective had got
-through and gone home, Tom felt just as insecure as he was before.
-
-The slow days drifted on, and each left behind it a slightly lightened
-weight of apprehension.
-
-
-
-CHAPTER XXV
-
-THERE comes a time in every rightly-constructed boy's life when he has
-a raging desire to go somewhere and dig for hidden treasure. This
-desire suddenly came upon Tom one day. He sallied out to find Joe
-Harper, but failed of success. Next he sought Ben Rogers; he had gone
-fishing. Presently he stumbled upon Huck Finn the Red-Handed. Huck
-would answer. Tom took him to a private place and opened the matter to
-him confidentially. Huck was willing. Huck was always willing to take a
-hand in any enterprise that offered entertainment and required no
-capital, for he had a troublesome superabundance of that sort of time
-which is not money. "Where'll we dig?" said Huck.
-
-"Oh, most anywhere."
-
-"Why, is it hid all around?"
-
-"No, indeed it ain't. It's hid in mighty particular places, Huck
---sometimes on islands, sometimes in rotten chests under the end of a
-limb of an old dead tree, just where the shadow falls at midnight; but
-mostly under the floor in ha'nted houses."
-
-"Who hides it?"
-
-"Why, robbers, of course--who'd you reckon? Sunday-school
-sup'rintendents?"
-
-"I don't know. If 'twas mine I wouldn't hide it; I'd spend it and have
-a good time."
-
-"So would I. But robbers don't do that way. They always hide it and
-leave it there."
-
-"Don't they come after it any more?"
-
-"No, they think they will, but they generally forget the marks, or
-else they die. Anyway, it lays there a long time and gets rusty; and by
-and by somebody finds an old yellow paper that tells how to find the
-marks--a paper that's got to be ciphered over about a week because it's
-mostly signs and hy'roglyphics."
-
-"Hyro--which?"
-
-"Hy'roglyphics--pictures and things, you know, that don't seem to mean
-anything."
-
-"Have you got one of them papers, Tom?"
-
-"No."
-
-"Well then, how you going to find the marks?"
-
-"I don't want any marks. They always bury it under a ha'nted house or
-on an island, or under a dead tree that's got one limb sticking out.
-Well, we've tried Jackson's Island a little, and we can try it again
-some time; and there's the old ha'nted house up the Still-House branch,
-and there's lots of dead-limb trees--dead loads of 'em."
-
-"Is it under all of them?"
-
-"How you talk! No!"
-
-"Then how you going to know which one to go for?"
-
-"Go for all of 'em!"
-
-"Why, Tom, it'll take all summer."
-
-"Well, what of that? Suppose you find a brass pot with a hundred
-dollars in it, all rusty and gray, or rotten chest full of di'monds.
-How's that?"
-
-Huck's eyes glowed.
-
-"That's bully. Plenty bully enough for me. Just you gimme the hundred
-dollars and I don't want no di'monds."
-
-"All right. But I bet you I ain't going to throw off on di'monds. Some
-of 'em's worth twenty dollars apiece--there ain't any, hardly, but's
-worth six bits or a dollar."
-
-"No! Is that so?"
-
-"Cert'nly--anybody'll tell you so. Hain't you ever seen one, Huck?"
-
-"Not as I remember."
-
-"Oh, kings have slathers of them."
-
-"Well, I don' know no kings, Tom."
-
-"I reckon you don't. But if you was to go to Europe you'd see a raft
-of 'em hopping around."
-
-"Do they hop?"
-
-"Hop?--your granny! No!"
-
-"Well, what did you say they did, for?"
-
-"Shucks, I only meant you'd SEE 'em--not hopping, of course--what do
-they want to hop for?--but I mean you'd just see 'em--scattered around,
-you know, in a kind of a general way. Like that old humpbacked Richard."
-
-"Richard? What's his other name?"
-
-"He didn't have any other name. Kings don't have any but a given name."
-
-"No?"
-
-"But they don't."
-
-"Well, if they like it, Tom, all right; but I don't want to be a king
-and have only just a given name, like a nigger. But say--where you
-going to dig first?"
-
-"Well, I don't know. S'pose we tackle that old dead-limb tree on the
-hill t'other side of Still-House branch?"
-
-"I'm agreed."
-
-So they got a crippled pick and a shovel, and set out on their
-three-mile tramp. They arrived hot and panting, and threw themselves
-down in the shade of a neighboring elm to rest and have a smoke.
-
-"I like this," said Tom.
-
-"So do I."
-
-"Say, Huck, if we find a treasure here, what you going to do with your
-share?"
-
-"Well, I'll have pie and a glass of soda every day, and I'll go to
-every circus that comes along. I bet I'll have a gay time."
-
-"Well, ain't you going to save any of it?"
-
-"Save it? What for?"
-
-"Why, so as to have something to live on, by and by."
-
-"Oh, that ain't any use. Pap would come back to thish-yer town some
-day and get his claws on it if I didn't hurry up, and I tell you he'd
-clean it out pretty quick. What you going to do with yourn, Tom?"
-
-"I'm going to buy a new drum, and a sure-'nough sword, and a red
-necktie and a bull pup, and get married."
-
-"Married!"
-
-"That's it."
-
-"Tom, you--why, you ain't in your right mind."
-
-"Wait--you'll see."
-
-"Well, that's the foolishest thing you could do. Look at pap and my
-mother. Fight! Why, they used to fight all the time. I remember, mighty
-well."
-
-"That ain't anything. The girl I'm going to marry won't fight."
-
-"Tom, I reckon they're all alike. They'll all comb a body. Now you
-better think 'bout this awhile. I tell you you better. What's the name
-of the gal?"
-
-"It ain't a gal at all--it's a girl."
-
-"It's all the same, I reckon; some says gal, some says girl--both's
-right, like enough. Anyway, what's her name, Tom?"
-
-"I'll tell you some time--not now."
-
-"All right--that'll do. Only if you get married I'll be more lonesomer
-than ever."
-
-"No you won't. You'll come and live with me. Now stir out of this and
-we'll go to digging."
-
-They worked and sweated for half an hour. No result. They toiled
-another half-hour. Still no result. Huck said:
-
-"Do they always bury it as deep as this?"
-
-"Sometimes--not always. Not generally. I reckon we haven't got the
-right place."
-
-So they chose a new spot and began again. The labor dragged a little,
-but still they made progress. They pegged away in silence for some
-time. Finally Huck leaned on his shovel, swabbed the beaded drops from
-his brow with his sleeve, and said:
-
-"Where you going to dig next, after we get this one?"
-
-"I reckon maybe we'll tackle the old tree that's over yonder on
-Cardiff Hill back of the widow's."
-
-"I reckon that'll be a good one. But won't the widow take it away from
-us, Tom? It's on her land."
-
-"SHE take it away! Maybe she'd like to try it once. Whoever finds one
-of these hid treasures, it belongs to him. It don't make any difference
-whose land it's on."
-
-That was satisfactory. The work went on. By and by Huck said:
-
-"Blame it, we must be in the wrong place again. What do you think?"
-
-"It is mighty curious, Huck. I don't understand it. Sometimes witches
-interfere. I reckon maybe that's what's the trouble now."
-
-"Shucks! Witches ain't got no power in the daytime."
-
-"Well, that's so. I didn't think of that. Oh, I know what the matter
-is! What a blamed lot of fools we are! You got to find out where the
-shadow of the limb falls at midnight, and that's where you dig!"
-
-"Then consound it, we've fooled away all this work for nothing. Now
-hang it all, we got to come back in the night. It's an awful long way.
-Can you get out?"
-
-"I bet I will. We've got to do it to-night, too, because if somebody
-sees these holes they'll know in a minute what's here and they'll go
-for it."
-
-"Well, I'll come around and maow to-night."
-
-"All right. Let's hide the tools in the bushes."
-
-The boys were there that night, about the appointed time. They sat in
-the shadow waiting. It was a lonely place, and an hour made solemn by
-old traditions. Spirits whispered in the rustling leaves, ghosts lurked
-in the murky nooks, the deep baying of a hound floated up out of the
-distance, an owl answered with his sepulchral note. The boys were
-subdued by these solemnities, and talked little. By and by they judged
-that twelve had come; they marked where the shadow fell, and began to
-dig. Their hopes commenced to rise. Their interest grew stronger, and
-their industry kept pace with it. The hole deepened and still deepened,
-but every time their hearts jumped to hear the pick strike upon
-something, they only suffered a new disappointment. It was only a stone
-or a chunk. At last Tom said:
-
-"It ain't any use, Huck, we're wrong again."
-
-"Well, but we CAN'T be wrong. We spotted the shadder to a dot."
-
-"I know it, but then there's another thing."
-
-"What's that?".
-
-"Why, we only guessed at the time. Like enough it was too late or too
-early."
-
-Huck dropped his shovel.
-
-"That's it," said he. "That's the very trouble. We got to give this
-one up. We can't ever tell the right time, and besides this kind of
-thing's too awful, here this time of night with witches and ghosts
-a-fluttering around so. I feel as if something's behind me all the time;
-and I'm afeard to turn around, becuz maybe there's others in front
-a-waiting for a chance. I been creeping all over, ever since I got here."
-
-"Well, I've been pretty much so, too, Huck. They most always put in a
-dead man when they bury a treasure under a tree, to look out for it."
-
-"Lordy!"
-
-"Yes, they do. I've always heard that."
-
-"Tom, I don't like to fool around much where there's dead people. A
-body's bound to get into trouble with 'em, sure."
-
-"I don't like to stir 'em up, either. S'pose this one here was to
-stick his skull out and say something!"
-
-"Don't Tom! It's awful."
-
-"Well, it just is. Huck, I don't feel comfortable a bit."
-
-"Say, Tom, let's give this place up, and try somewheres else."
-
-"All right, I reckon we better."
-
-"What'll it be?"
-
-Tom considered awhile; and then said:
-
-"The ha'nted house. That's it!"
-
-"Blame it, I don't like ha'nted houses, Tom. Why, they're a dern sight
-worse'n dead people. Dead people might talk, maybe, but they don't come
-sliding around in a shroud, when you ain't noticing, and peep over your
-shoulder all of a sudden and grit their teeth, the way a ghost does. I
-couldn't stand such a thing as that, Tom--nobody could."
-
-"Yes, but, Huck, ghosts don't travel around only at night. They won't
-hender us from digging there in the daytime."
-
-"Well, that's so. But you know mighty well people don't go about that
-ha'nted house in the day nor the night."
-
-"Well, that's mostly because they don't like to go where a man's been
-murdered, anyway--but nothing's ever been seen around that house except
-in the night--just some blue lights slipping by the windows--no regular
-ghosts."
-
-"Well, where you see one of them blue lights flickering around, Tom,
-you can bet there's a ghost mighty close behind it. It stands to
-reason. Becuz you know that they don't anybody but ghosts use 'em."
-
-"Yes, that's so. But anyway they don't come around in the daytime, so
-what's the use of our being afeard?"
-
-"Well, all right. We'll tackle the ha'nted house if you say so--but I
-reckon it's taking chances."
-
-They had started down the hill by this time. There in the middle of
-the moonlit valley below them stood the "ha'nted" house, utterly
-isolated, its fences gone long ago, rank weeds smothering the very
-doorsteps, the chimney crumbled to ruin, the window-sashes vacant, a
-corner of the roof caved in. The boys gazed awhile, half expecting to
-see a blue light flit past a window; then talking in a low tone, as
-befitted the time and the circumstances, they struck far off to the
-right, to give the haunted house a wide berth, and took their way
-homeward through the woods that adorned the rearward side of Cardiff
-Hill.
-
-
-
-CHAPTER XXVI
-
-ABOUT noon the next day the boys arrived at the dead tree; they had
-come for their tools. Tom was impatient to go to the haunted house;
-Huck was measurably so, also--but suddenly said:
-
-"Lookyhere, Tom, do you know what day it is?"
-
-Tom mentally ran over the days of the week, and then quickly lifted
-his eyes with a startled look in them--
-
-"My! I never once thought of it, Huck!"
-
-"Well, I didn't neither, but all at once it popped onto me that it was
-Friday."
-
-"Blame it, a body can't be too careful, Huck. We might 'a' got into an
-awful scrape, tackling such a thing on a Friday."
-
-"MIGHT! Better say we WOULD! There's some lucky days, maybe, but
-Friday ain't."
-
-"Any fool knows that. I don't reckon YOU was the first that found it
-out, Huck."
-
-"Well, I never said I was, did I? And Friday ain't all, neither. I had
-a rotten bad dream last night--dreampt about rats."
-
-"No! Sure sign of trouble. Did they fight?"
-
-"No."
-
-"Well, that's good, Huck. When they don't fight it's only a sign that
-there's trouble around, you know. All we got to do is to look mighty
-sharp and keep out of it. We'll drop this thing for to-day, and play.
-Do you know Robin Hood, Huck?"
-
-"No. Who's Robin Hood?"
-
-"Why, he was one of the greatest men that was ever in England--and the
-best. He was a robber."
-
-"Cracky, I wisht I was. Who did he rob?"
-
-"Only sheriffs and bishops and rich people and kings, and such like.
-But he never bothered the poor. He loved 'em. He always divided up with
-'em perfectly square."
-
-"Well, he must 'a' been a brick."
-
-"I bet you he was, Huck. Oh, he was the noblest man that ever was.
-They ain't any such men now, I can tell you. He could lick any man in
-England, with one hand tied behind him; and he could take his yew bow
-and plug a ten-cent piece every time, a mile and a half."
-
-"What's a YEW bow?"
-
-"I don't know. It's some kind of a bow, of course. And if he hit that
-dime only on the edge he would set down and cry--and curse. But we'll
-play Robin Hood--it's nobby fun. I'll learn you."
-
-"I'm agreed."
-
-So they played Robin Hood all the afternoon, now and then casting a
-yearning eye down upon the haunted house and passing a remark about the
-morrow's prospects and possibilities there. As the sun began to sink
-into the west they took their way homeward athwart the long shadows of
-the trees and soon were buried from sight in the forests of Cardiff
-Hill.
-
-On Saturday, shortly after noon, the boys were at the dead tree again.
-They had a smoke and a chat in the shade, and then dug a little in
-their last hole, not with great hope, but merely because Tom said there
-were so many cases where people had given up a treasure after getting
-down within six inches of it, and then somebody else had come along and
-turned it up with a single thrust of a shovel. The thing failed this
-time, however, so the boys shouldered their tools and went away feeling
-that they had not trifled with fortune, but had fulfilled all the
-requirements that belong to the business of treasure-hunting.
-
-When they reached the haunted house there was something so weird and
-grisly about the dead silence that reigned there under the baking sun,
-and something so depressing about the loneliness and desolation of the
-place, that they were afraid, for a moment, to venture in. Then they
-crept to the door and took a trembling peep. They saw a weed-grown,
-floorless room, unplastered, an ancient fireplace, vacant windows, a
-ruinous staircase; and here, there, and everywhere hung ragged and
-abandoned cobwebs. They presently entered, softly, with quickened
-pulses, talking in whispers, ears alert to catch the slightest sound,
-and muscles tense and ready for instant retreat.
-
-In a little while familiarity modified their fears and they gave the
-place a critical and interested examination, rather admiring their own
-boldness, and wondering at it, too. Next they wanted to look up-stairs.
-This was something like cutting off retreat, but they got to daring
-each other, and of course there could be but one result--they threw
-their tools into a corner and made the ascent. Up there were the same
-signs of decay. In one corner they found a closet that promised
-mystery, but the promise was a fraud--there was nothing in it. Their
-courage was up now and well in hand. They were about to go down and
-begin work when--
-
-"Sh!" said Tom.
-
-"What is it?" whispered Huck, blanching with fright.
-
-"Sh!... There!... Hear it?"
-
-"Yes!... Oh, my! Let's run!"
-
-"Keep still! Don't you budge! They're coming right toward the door."
-
-The boys stretched themselves upon the floor with their eyes to
-knot-holes in the planking, and lay waiting, in a misery of fear.
-
-"They've stopped.... No--coming.... Here they are. Don't whisper
-another word, Huck. My goodness, I wish I was out of this!"
-
-Two men entered. Each boy said to himself: "There's the old deaf and
-dumb Spaniard that's been about town once or twice lately--never saw
-t'other man before."
-
-"T'other" was a ragged, unkempt creature, with nothing very pleasant
-in his face. The Spaniard was wrapped in a serape; he had bushy white
-whiskers; long white hair flowed from under his sombrero, and he wore
-green goggles. When they came in, "t'other" was talking in a low voice;
-they sat down on the ground, facing the door, with their backs to the
-wall, and the speaker continued his remarks. His manner became less
-guarded and his words more distinct as he proceeded:
-
-"No," said he, "I've thought it all over, and I don't like it. It's
-dangerous."
-
-"Dangerous!" grunted the "deaf and dumb" Spaniard--to the vast
-surprise of the boys. "Milksop!"
-
-This voice made the boys gasp and quake. It was Injun Joe's! There was
-silence for some time. Then Joe said:
-
-"What's any more dangerous than that job up yonder--but nothing's come
-of it."
-
-"That's different. Away up the river so, and not another house about.
-'Twon't ever be known that we tried, anyway, long as we didn't succeed."
-
-"Well, what's more dangerous than coming here in the daytime!--anybody
-would suspicion us that saw us."
-
-"I know that. But there warn't any other place as handy after that
-fool of a job. I want to quit this shanty. I wanted to yesterday, only
-it warn't any use trying to stir out of here, with those infernal boys
-playing over there on the hill right in full view."
-
-"Those infernal boys" quaked again under the inspiration of this
-remark, and thought how lucky it was that they had remembered it was
-Friday and concluded to wait a day. They wished in their hearts they
-had waited a year.
-
-The two men got out some food and made a luncheon. After a long and
-thoughtful silence, Injun Joe said:
-
-"Look here, lad--you go back up the river where you belong. Wait there
-till you hear from me. I'll take the chances on dropping into this town
-just once more, for a look. We'll do that 'dangerous' job after I've
-spied around a little and think things look well for it. Then for
-Texas! We'll leg it together!"
-
-This was satisfactory. Both men presently fell to yawning, and Injun
-Joe said:
-
-"I'm dead for sleep! It's your turn to watch."
-
-He curled down in the weeds and soon began to snore. His comrade
-stirred him once or twice and he became quiet. Presently the watcher
-began to nod; his head drooped lower and lower, both men began to snore
-now.
-
-The boys drew a long, grateful breath. Tom whispered:
-
-"Now's our chance--come!"
-
-Huck said:
-
-"I can't--I'd die if they was to wake."
-
-Tom urged--Huck held back. At last Tom rose slowly and softly, and
-started alone. But the first step he made wrung such a hideous creak
-from the crazy floor that he sank down almost dead with fright. He
-never made a second attempt. The boys lay there counting the dragging
-moments till it seemed to them that time must be done and eternity
-growing gray; and then they were grateful to note that at last the sun
-was setting.
-
-Now one snore ceased. Injun Joe sat up, stared around--smiled grimly
-upon his comrade, whose head was drooping upon his knees--stirred him
-up with his foot and said:
-
-"Here! YOU'RE a watchman, ain't you! All right, though--nothing's
-happened."
-
-"My! have I been asleep?"
-
-"Oh, partly, partly. Nearly time for us to be moving, pard. What'll we
-do with what little swag we've got left?"
-
-"I don't know--leave it here as we've always done, I reckon. No use to
-take it away till we start south. Six hundred and fifty in silver's
-something to carry."
-
-"Well--all right--it won't matter to come here once more."
-
-"No--but I'd say come in the night as we used to do--it's better."
-
-"Yes: but look here; it may be a good while before I get the right
-chance at that job; accidents might happen; 'tain't in such a very good
-place; we'll just regularly bury it--and bury it deep."
-
-"Good idea," said the comrade, who walked across the room, knelt down,
-raised one of the rearward hearth-stones and took out a bag that
-jingled pleasantly. He subtracted from it twenty or thirty dollars for
-himself and as much for Injun Joe, and passed the bag to the latter,
-who was on his knees in the corner, now, digging with his bowie-knife.
-
-The boys forgot all their fears, all their miseries in an instant.
-With gloating eyes they watched every movement. Luck!--the splendor of
-it was beyond all imagination! Six hundred dollars was money enough to
-make half a dozen boys rich! Here was treasure-hunting under the
-happiest auspices--there would not be any bothersome uncertainty as to
-where to dig. They nudged each other every moment--eloquent nudges and
-easily understood, for they simply meant--"Oh, but ain't you glad NOW
-we're here!"
-
-Joe's knife struck upon something.
-
-"Hello!" said he.
-
-"What is it?" said his comrade.
-
-"Half-rotten plank--no, it's a box, I believe. Here--bear a hand and
-we'll see what it's here for. Never mind, I've broke a hole."
-
-He reached his hand in and drew it out--
-
-"Man, it's money!"
-
-The two men examined the handful of coins. They were gold. The boys
-above were as excited as themselves, and as delighted.
-
-Joe's comrade said:
-
-"We'll make quick work of this. There's an old rusty pick over amongst
-the weeds in the corner the other side of the fireplace--I saw it a
-minute ago."
-
-He ran and brought the boys' pick and shovel. Injun Joe took the pick,
-looked it over critically, shook his head, muttered something to
-himself, and then began to use it. The box was soon unearthed. It was
-not very large; it was iron bound and had been very strong before the
-slow years had injured it. The men contemplated the treasure awhile in
-blissful silence.
-
-"Pard, there's thousands of dollars here," said Injun Joe.
-
-"'Twas always said that Murrel's gang used to be around here one
-summer," the stranger observed.
-
-"I know it," said Injun Joe; "and this looks like it, I should say."
-
-"Now you won't need to do that job."
-
-The half-breed frowned. Said he:
-
-"You don't know me. Least you don't know all about that thing. 'Tain't
-robbery altogether--it's REVENGE!" and a wicked light flamed in his
-eyes. "I'll need your help in it. When it's finished--then Texas. Go
-home to your Nance and your kids, and stand by till you hear from me."
-
-"Well--if you say so; what'll we do with this--bury it again?"
-
-"Yes. [Ravishing delight overhead.] NO! by the great Sachem, no!
-[Profound distress overhead.] I'd nearly forgot. That pick had fresh
-earth on it! [The boys were sick with terror in a moment.] What
-business has a pick and a shovel here? What business with fresh earth
-on them? Who brought them here--and where are they gone? Have you heard
-anybody?--seen anybody? What! bury it again and leave them to come and
-see the ground disturbed? Not exactly--not exactly. We'll take it to my
-den."
-
-"Why, of course! Might have thought of that before. You mean Number
-One?"
-
-"No--Number Two--under the cross. The other place is bad--too common."
-
-"All right. It's nearly dark enough to start."
-
-Injun Joe got up and went about from window to window cautiously
-peeping out. Presently he said:
-
-"Who could have brought those tools here? Do you reckon they can be
-up-stairs?"
-
-The boys' breath forsook them. Injun Joe put his hand on his knife,
-halted a moment, undecided, and then turned toward the stairway. The
-boys thought of the closet, but their strength was gone. The steps came
-creaking up the stairs--the intolerable distress of the situation woke
-the stricken resolution of the lads--they were about to spring for the
-closet, when there was a crash of rotten timbers and Injun Joe landed
-on the ground amid the debris of the ruined stairway. He gathered
-himself up cursing, and his comrade said:
-
-"Now what's the use of all that? If it's anybody, and they're up
-there, let them STAY there--who cares? If they want to jump down, now,
-and get into trouble, who objects? It will be dark in fifteen minutes
---and then let them follow us if they want to. I'm willing. In my
-opinion, whoever hove those things in here caught a sight of us and
-took us for ghosts or devils or something. I'll bet they're running
-yet."
-
-Joe grumbled awhile; then he agreed with his friend that what daylight
-was left ought to be economized in getting things ready for leaving.
-Shortly afterward they slipped out of the house in the deepening
-twilight, and moved toward the river with their precious box.
-
-Tom and Huck rose up, weak but vastly relieved, and stared after them
-through the chinks between the logs of the house. Follow? Not they.
-They were content to reach ground again without broken necks, and take
-the townward track over the hill. They did not talk much. They were too
-much absorbed in hating themselves--hating the ill luck that made them
-take the spade and the pick there. But for that, Injun Joe never would
-have suspected. He would have hidden the silver with the gold to wait
-there till his "revenge" was satisfied, and then he would have had the
-misfortune to find that money turn up missing. Bitter, bitter luck that
-the tools were ever brought there!
-
-They resolved to keep a lookout for that Spaniard when he should come
-to town spying out for chances to do his revengeful job, and follow him
-to "Number Two," wherever that might be. Then a ghastly thought
-occurred to Tom.
-
-"Revenge? What if he means US, Huck!"
-
-"Oh, don't!" said Huck, nearly fainting.
-
-They talked it all over, and as they entered town they agreed to
-believe that he might possibly mean somebody else--at least that he
-might at least mean nobody but Tom, since only Tom had testified.
-
-Very, very small comfort it was to Tom to be alone in danger! Company
-would be a palpable improvement, he thought.
-
-
-
-CHAPTER XXVII
-
-THE adventure of the day mightily tormented Tom's dreams that night.
-Four times he had his hands on that rich treasure and four times it
-wasted to nothingness in his fingers as sleep forsook him and
-wakefulness brought back the hard reality of his misfortune. As he lay
-in the early morning recalling the incidents of his great adventure, he
-noticed that they seemed curiously subdued and far away--somewhat as if
-they had happened in another world, or in a time long gone by. Then it
-occurred to him that the great adventure itself must be a dream! There
-was one very strong argument in favor of this idea--namely, that the
-quantity of coin he had seen was too vast to be real. He had never seen
-as much as fifty dollars in one mass before, and he was like all boys
-of his age and station in life, in that he imagined that all references
-to "hundreds" and "thousands" were mere fanciful forms of speech, and
-that no such sums really existed in the world. He never had supposed
-for a moment that so large a sum as a hundred dollars was to be found
-in actual money in any one's possession. If his notions of hidden
-treasure had been analyzed, they would have been found to consist of a
-handful of real dimes and a bushel of vague, splendid, ungraspable
-dollars.
-
-But the incidents of his adventure grew sensibly sharper and clearer
-under the attrition of thinking them over, and so he presently found
-himself leaning to the impression that the thing might not have been a
-dream, after all. This uncertainty must be swept away. He would snatch
-a hurried breakfast and go and find Huck. Huck was sitting on the
-gunwale of a flatboat, listlessly dangling his feet in the water and
-looking very melancholy. Tom concluded to let Huck lead up to the
-subject. If he did not do it, then the adventure would be proved to
-have been only a dream.
-
-"Hello, Huck!"
-
-"Hello, yourself."
-
-Silence, for a minute.
-
-"Tom, if we'd 'a' left the blame tools at the dead tree, we'd 'a' got
-the money. Oh, ain't it awful!"
-
-"'Tain't a dream, then, 'tain't a dream! Somehow I most wish it was.
-Dog'd if I don't, Huck."
-
-"What ain't a dream?"
-
-"Oh, that thing yesterday. I been half thinking it was."
-
-"Dream! If them stairs hadn't broke down you'd 'a' seen how much dream
-it was! I've had dreams enough all night--with that patch-eyed Spanish
-devil going for me all through 'em--rot him!"
-
-"No, not rot him. FIND him! Track the money!"
-
-"Tom, we'll never find him. A feller don't have only one chance for
-such a pile--and that one's lost. I'd feel mighty shaky if I was to see
-him, anyway."
-
-"Well, so'd I; but I'd like to see him, anyway--and track him out--to
-his Number Two."
-
-"Number Two--yes, that's it. I been thinking 'bout that. But I can't
-make nothing out of it. What do you reckon it is?"
-
-"I dono. It's too deep. Say, Huck--maybe it's the number of a house!"
-
-"Goody!... No, Tom, that ain't it. If it is, it ain't in this
-one-horse town. They ain't no numbers here."
-
-"Well, that's so. Lemme think a minute. Here--it's the number of a
-room--in a tavern, you know!"
-
-"Oh, that's the trick! They ain't only two taverns. We can find out
-quick."
-
-"You stay here, Huck, till I come."
-
-Tom was off at once. He did not care to have Huck's company in public
-places. He was gone half an hour. He found that in the best tavern, No.
-2 had long been occupied by a young lawyer, and was still so occupied.
-In the less ostentatious house, No. 2 was a mystery. The
-tavern-keeper's young son said it was kept locked all the time, and he
-never saw anybody go into it or come out of it except at night; he did
-not know any particular reason for this state of things; had had some
-little curiosity, but it was rather feeble; had made the most of the
-mystery by entertaining himself with the idea that that room was
-"ha'nted"; had noticed that there was a light in there the night before.
-
-"That's what I've found out, Huck. I reckon that's the very No. 2
-we're after."
-
-"I reckon it is, Tom. Now what you going to do?"
-
-"Lemme think."
-
-Tom thought a long time. Then he said:
-
-"I'll tell you. The back door of that No. 2 is the door that comes out
-into that little close alley between the tavern and the old rattle trap
-of a brick store. Now you get hold of all the door-keys you can find,
-and I'll nip all of auntie's, and the first dark night we'll go there
-and try 'em. And mind you, keep a lookout for Injun Joe, because he
-said he was going to drop into town and spy around once more for a
-chance to get his revenge. If you see him, you just follow him; and if
-he don't go to that No. 2, that ain't the place."
-
-"Lordy, I don't want to foller him by myself!"
-
-"Why, it'll be night, sure. He mightn't ever see you--and if he did,
-maybe he'd never think anything."
-
-"Well, if it's pretty dark I reckon I'll track him. I dono--I dono.
-I'll try."
-
-"You bet I'll follow him, if it's dark, Huck. Why, he might 'a' found
-out he couldn't get his revenge, and be going right after that money."
-
-"It's so, Tom, it's so. I'll foller him; I will, by jingoes!"
-
-"Now you're TALKING! Don't you ever weaken, Huck, and I won't."
-
-
-
-CHAPTER XXVIII
-
-THAT night Tom and Huck were ready for their adventure. They hung
-about the neighborhood of the tavern until after nine, one watching the
-alley at a distance and the other the tavern door. Nobody entered the
-alley or left it; nobody resembling the Spaniard entered or left the
-tavern door. The night promised to be a fair one; so Tom went home with
-the understanding that if a considerable degree of darkness came on,
-Huck was to come and "maow," whereupon he would slip out and try the
-keys. But the night remained clear, and Huck closed his watch and
-retired to bed in an empty sugar hogshead about twelve.
-
-Tuesday the boys had the same ill luck. Also Wednesday. But Thursday
-night promised better. Tom slipped out in good season with his aunt's
-old tin lantern, and a large towel to blindfold it with. He hid the
-lantern in Huck's sugar hogshead and the watch began. An hour before
-midnight the tavern closed up and its lights (the only ones
-thereabouts) were put out. No Spaniard had been seen. Nobody had
-entered or left the alley. Everything was auspicious. The blackness of
-darkness reigned, the perfect stillness was interrupted only by
-occasional mutterings of distant thunder.
-
-Tom got his lantern, lit it in the hogshead, wrapped it closely in the
-towel, and the two adventurers crept in the gloom toward the tavern.
-Huck stood sentry and Tom felt his way into the alley. Then there was a
-season of waiting anxiety that weighed upon Huck's spirits like a
-mountain. He began to wish he could see a flash from the lantern--it
-would frighten him, but it would at least tell him that Tom was alive
-yet. It seemed hours since Tom had disappeared. Surely he must have
-fainted; maybe he was dead; maybe his heart had burst under terror and
-excitement. In his uneasiness Huck found himself drawing closer and
-closer to the alley; fearing all sorts of dreadful things, and
-momentarily expecting some catastrophe to happen that would take away
-his breath. There was not much to take away, for he seemed only able to
-inhale it by thimblefuls, and his heart would soon wear itself out, the
-way it was beating. Suddenly there was a flash of light and Tom came
-tearing by him: "Run!" said he; "run, for your life!"
-
-He needn't have repeated it; once was enough; Huck was making thirty
-or forty miles an hour before the repetition was uttered. The boys
-never stopped till they reached the shed of a deserted slaughter-house
-at the lower end of the village. Just as they got within its shelter
-the storm burst and the rain poured down. As soon as Tom got his breath
-he said:
-
-"Huck, it was awful! I tried two of the keys, just as soft as I could;
-but they seemed to make such a power of racket that I couldn't hardly
-get my breath I was so scared. They wouldn't turn in the lock, either.
-Well, without noticing what I was doing, I took hold of the knob, and
-open comes the door! It warn't locked! I hopped in, and shook off the
-towel, and, GREAT CAESAR'S GHOST!"
-
-"What!--what'd you see, Tom?"
-
-"Huck, I most stepped onto Injun Joe's hand!"
-
-"No!"
-
-"Yes! He was lying there, sound asleep on the floor, with his old
-patch on his eye and his arms spread out."
-
-"Lordy, what did you do? Did he wake up?"
-
-"No, never budged. Drunk, I reckon. I just grabbed that towel and
-started!"
-
-"I'd never 'a' thought of the towel, I bet!"
-
-"Well, I would. My aunt would make me mighty sick if I lost it."
-
-"Say, Tom, did you see that box?"
-
-"Huck, I didn't wait to look around. I didn't see the box, I didn't
-see the cross. I didn't see anything but a bottle and a tin cup on the
-floor by Injun Joe; yes, I saw two barrels and lots more bottles in the
-room. Don't you see, now, what's the matter with that ha'nted room?"
-
-"How?"
-
-"Why, it's ha'nted with whiskey! Maybe ALL the Temperance Taverns have
-got a ha'nted room, hey, Huck?"
-
-"Well, I reckon maybe that's so. Who'd 'a' thought such a thing? But
-say, Tom, now's a mighty good time to get that box, if Injun Joe's
-drunk."
-
-"It is, that! You try it!"
-
-Huck shuddered.
-
-"Well, no--I reckon not."
-
-"And I reckon not, Huck. Only one bottle alongside of Injun Joe ain't
-enough. If there'd been three, he'd be drunk enough and I'd do it."
-
-There was a long pause for reflection, and then Tom said:
-
-"Lookyhere, Huck, less not try that thing any more till we know Injun
-Joe's not in there. It's too scary. Now, if we watch every night, we'll
-be dead sure to see him go out, some time or other, and then we'll
-snatch that box quicker'n lightning."
-
-"Well, I'm agreed. I'll watch the whole night long, and I'll do it
-every night, too, if you'll do the other part of the job."
-
-"All right, I will. All you got to do is to trot up Hooper Street a
-block and maow--and if I'm asleep, you throw some gravel at the window
-and that'll fetch me."
-
-"Agreed, and good as wheat!"
-
-"Now, Huck, the storm's over, and I'll go home. It'll begin to be
-daylight in a couple of hours. You go back and watch that long, will
-you?"
-
-"I said I would, Tom, and I will. I'll ha'nt that tavern every night
-for a year! I'll sleep all day and I'll stand watch all night."
-
-"That's all right. Now, where you going to sleep?"
-
-"In Ben Rogers' hayloft. He lets me, and so does his pap's nigger man,
-Uncle Jake. I tote water for Uncle Jake whenever he wants me to, and
-any time I ask him he gives me a little something to eat if he can
-spare it. That's a mighty good nigger, Tom. He likes me, becuz I don't
-ever act as if I was above him. Sometime I've set right down and eat
-WITH him. But you needn't tell that. A body's got to do things when
-he's awful hungry he wouldn't want to do as a steady thing."
-
-"Well, if I don't want you in the daytime, I'll let you sleep. I won't
-come bothering around. Any time you see something's up, in the night,
-just skip right around and maow."
-
-
-
-CHAPTER XXIX
-
-THE first thing Tom heard on Friday morning was a glad piece of news
---Judge Thatcher's family had come back to town the night before. Both
-Injun Joe and the treasure sunk into secondary importance for a moment,
-and Becky took the chief place in the boy's interest. He saw her and
-they had an exhausting good time playing "hi-spy" and "gully-keeper"
-with a crowd of their school-mates. The day was completed and crowned
-in a peculiarly satisfactory way: Becky teased her mother to appoint
-the next day for the long-promised and long-delayed picnic, and she
-consented. The child's delight was boundless; and Tom's not more
-moderate. The invitations were sent out before sunset, and straightway
-the young folks of the village were thrown into a fever of preparation
-and pleasurable anticipation. Tom's excitement enabled him to keep
-awake until a pretty late hour, and he had good hopes of hearing Huck's
-"maow," and of having his treasure to astonish Becky and the picnickers
-with, next day; but he was disappointed. No signal came that night.
-
-Morning came, eventually, and by ten or eleven o'clock a giddy and
-rollicking company were gathered at Judge Thatcher's, and everything
-was ready for a start. It was not the custom for elderly people to mar
-the picnics with their presence. The children were considered safe
-enough under the wings of a few young ladies of eighteen and a few
-young gentlemen of twenty-three or thereabouts. The old steam ferryboat
-was chartered for the occasion; presently the gay throng filed up the
-main street laden with provision-baskets. Sid was sick and had to miss
-the fun; Mary remained at home to entertain him. The last thing Mrs.
-Thatcher said to Becky, was:
-
-"You'll not get back till late. Perhaps you'd better stay all night
-with some of the girls that live near the ferry-landing, child."
-
-"Then I'll stay with Susy Harper, mamma."
-
-"Very well. And mind and behave yourself and don't be any trouble."
-
-Presently, as they tripped along, Tom said to Becky:
-
-"Say--I'll tell you what we'll do. 'Stead of going to Joe Harper's
-we'll climb right up the hill and stop at the Widow Douglas'. She'll
-have ice-cream! She has it most every day--dead loads of it. And she'll
-be awful glad to have us."
-
-"Oh, that will be fun!"
-
-Then Becky reflected a moment and said:
-
-"But what will mamma say?"
-
-"How'll she ever know?"
-
-The girl turned the idea over in her mind, and said reluctantly:
-
-"I reckon it's wrong--but--"
-
-"But shucks! Your mother won't know, and so what's the harm? All she
-wants is that you'll be safe; and I bet you she'd 'a' said go there if
-she'd 'a' thought of it. I know she would!"
-
-The Widow Douglas' splendid hospitality was a tempting bait. It and
-Tom's persuasions presently carried the day. So it was decided to say
-nothing anybody about the night's programme. Presently it occurred to
-Tom that maybe Huck might come this very night and give the signal. The
-thought took a deal of the spirit out of his anticipations. Still he
-could not bear to give up the fun at Widow Douglas'. And why should he
-give it up, he reasoned--the signal did not come the night before, so
-why should it be any more likely to come to-night? The sure fun of the
-evening outweighed the uncertain treasure; and, boy-like, he determined
-to yield to the stronger inclination and not allow himself to think of
-the box of money another time that day.
-
-Three miles below town the ferryboat stopped at the mouth of a woody
-hollow and tied up. The crowd swarmed ashore and soon the forest
-distances and craggy heights echoed far and near with shoutings and
-laughter. All the different ways of getting hot and tired were gone
-through with, and by-and-by the rovers straggled back to camp fortified
-with responsible appetites, and then the destruction of the good things
-began. After the feast there was a refreshing season of rest and chat
-in the shade of spreading oaks. By-and-by somebody shouted:
-
-"Who's ready for the cave?"
-
-Everybody was. Bundles of candles were procured, and straightway there
-was a general scamper up the hill. The mouth of the cave was up the
-hillside--an opening shaped like a letter A. Its massive oaken door
-stood unbarred. Within was a small chamber, chilly as an ice-house, and
-walled by Nature with solid limestone that was dewy with a cold sweat.
-It was romantic and mysterious to stand here in the deep gloom and look
-out upon the green valley shining in the sun. But the impressiveness of
-the situation quickly wore off, and the romping began again. The moment
-a candle was lighted there was a general rush upon the owner of it; a
-struggle and a gallant defence followed, but the candle was soon
-knocked down or blown out, and then there was a glad clamor of laughter
-and a new chase. But all things have an end. By-and-by the procession
-went filing down the steep descent of the main avenue, the flickering
-rank of lights dimly revealing the lofty walls of rock almost to their
-point of junction sixty feet overhead. This main avenue was not more
-than eight or ten feet wide. Every few steps other lofty and still
-narrower crevices branched from it on either hand--for McDougal's cave
-was but a vast labyrinth of crooked aisles that ran into each other and
-out again and led nowhere. It was said that one might wander days and
-nights together through its intricate tangle of rifts and chasms, and
-never find the end of the cave; and that he might go down, and down,
-and still down, into the earth, and it was just the same--labyrinth
-under labyrinth, and no end to any of them. No man "knew" the cave.
-That was an impossible thing. Most of the young men knew a portion of
-it, and it was not customary to venture much beyond this known portion.
-Tom Sawyer knew as much of the cave as any one.
-
-The procession moved along the main avenue some three-quarters of a
-mile, and then groups and couples began to slip aside into branch
-avenues, fly along the dismal corridors, and take each other by
-surprise at points where the corridors joined again. Parties were able
-to elude each other for the space of half an hour without going beyond
-the "known" ground.
-
-By-and-by, one group after another came straggling back to the mouth
-of the cave, panting, hilarious, smeared from head to foot with tallow
-drippings, daubed with clay, and entirely delighted with the success of
-the day. Then they were astonished to find that they had been taking no
-note of time and that night was about at hand. The clanging bell had
-been calling for half an hour. However, this sort of close to the day's
-adventures was romantic and therefore satisfactory. When the ferryboat
-with her wild freight pushed into the stream, nobody cared sixpence for
-the wasted time but the captain of the craft.
-
-Huck was already upon his watch when the ferryboat's lights went
-glinting past the wharf. He heard no noise on board, for the young
-people were as subdued and still as people usually are who are nearly
-tired to death. He wondered what boat it was, and why she did not stop
-at the wharf--and then he dropped her out of his mind and put his
-attention upon his business. The night was growing cloudy and dark. Ten
-o'clock came, and the noise of vehicles ceased, scattered lights began
-to wink out, all straggling foot-passengers disappeared, the village
-betook itself to its slumbers and left the small watcher alone with the
-silence and the ghosts. Eleven o'clock came, and the tavern lights were
-put out; darkness everywhere, now. Huck waited what seemed a weary long
-time, but nothing happened. His faith was weakening. Was there any use?
-Was there really any use? Why not give it up and turn in?
-
-A noise fell upon his ear. He was all attention in an instant. The
-alley door closed softly. He sprang to the corner of the brick store.
-The next moment two men brushed by him, and one seemed to have
-something under his arm. It must be that box! So they were going to
-remove the treasure. Why call Tom now? It would be absurd--the men
-would get away with the box and never be found again. No, he would
-stick to their wake and follow them; he would trust to the darkness for
-security from discovery. So communing with himself, Huck stepped out
-and glided along behind the men, cat-like, with bare feet, allowing
-them to keep just far enough ahead not to be invisible.
-
-They moved up the river street three blocks, then turned to the left
-up a cross-street. They went straight ahead, then, until they came to
-the path that led up Cardiff Hill; this they took. They passed by the
-old Welshman's house, half-way up the hill, without hesitating, and
-still climbed upward. Good, thought Huck, they will bury it in the old
-quarry. But they never stopped at the quarry. They passed on, up the
-summit. They plunged into the narrow path between the tall sumach
-bushes, and were at once hidden in the gloom. Huck closed up and
-shortened his distance, now, for they would never be able to see him.
-He trotted along awhile; then slackened his pace, fearing he was
-gaining too fast; moved on a piece, then stopped altogether; listened;
-no sound; none, save that he seemed to hear the beating of his own
-heart. The hooting of an owl came over the hill--ominous sound! But no
-footsteps. Heavens, was everything lost! He was about to spring with
-winged feet, when a man cleared his throat not four feet from him!
-Huck's heart shot into his throat, but he swallowed it again; and then
-he stood there shaking as if a dozen agues had taken charge of him at
-once, and so weak that he thought he must surely fall to the ground. He
-knew where he was. He knew he was within five steps of the stile
-leading into Widow Douglas' grounds. Very well, he thought, let them
-bury it there; it won't be hard to find.
-
-Now there was a voice--a very low voice--Injun Joe's:
-
-"Damn her, maybe she's got company--there's lights, late as it is."
-
-"I can't see any."
-
-This was that stranger's voice--the stranger of the haunted house. A
-deadly chill went to Huck's heart--this, then, was the "revenge" job!
-His thought was, to fly. Then he remembered that the Widow Douglas had
-been kind to him more than once, and maybe these men were going to
-murder her. He wished he dared venture to warn her; but he knew he
-didn't dare--they might come and catch him. He thought all this and
-more in the moment that elapsed between the stranger's remark and Injun
-Joe's next--which was--
-
-"Because the bush is in your way. Now--this way--now you see, don't
-you?"
-
-"Yes. Well, there IS company there, I reckon. Better give it up."
-
-"Give it up, and I just leaving this country forever! Give it up and
-maybe never have another chance. I tell you again, as I've told you
-before, I don't care for her swag--you may have it. But her husband was
-rough on me--many times he was rough on me--and mainly he was the
-justice of the peace that jugged me for a vagrant. And that ain't all.
-It ain't a millionth part of it! He had me HORSEWHIPPED!--horsewhipped
-in front of the jail, like a nigger!--with all the town looking on!
-HORSEWHIPPED!--do you understand? He took advantage of me and died. But
-I'll take it out of HER."
-
-"Oh, don't kill her! Don't do that!"
-
-"Kill? Who said anything about killing? I would kill HIM if he was
-here; but not her. When you want to get revenge on a woman you don't
-kill her--bosh! you go for her looks. You slit her nostrils--you notch
-her ears like a sow!"
-
-"By God, that's--"
-
-"Keep your opinion to yourself! It will be safest for you. I'll tie
-her to the bed. If she bleeds to death, is that my fault? I'll not cry,
-if she does. My friend, you'll help me in this thing--for MY sake
---that's why you're here--I mightn't be able alone. If you flinch, I'll
-kill you. Do you understand that? And if I have to kill you, I'll kill
-her--and then I reckon nobody'll ever know much about who done this
-business."
-
-"Well, if it's got to be done, let's get at it. The quicker the
-better--I'm all in a shiver."
-
-"Do it NOW? And company there? Look here--I'll get suspicious of you,
-first thing you know. No--we'll wait till the lights are out--there's
-no hurry."
-
-Huck felt that a silence was going to ensue--a thing still more awful
-than any amount of murderous talk; so he held his breath and stepped
-gingerly back; planted his foot carefully and firmly, after balancing,
-one-legged, in a precarious way and almost toppling over, first on one
-side and then on the other. He took another step back, with the same
-elaboration and the same risks; then another and another, and--a twig
-snapped under his foot! His breath stopped and he listened. There was
-no sound--the stillness was perfect. His gratitude was measureless. Now
-he turned in his tracks, between the walls of sumach bushes--turned
-himself as carefully as if he were a ship--and then stepped quickly but
-cautiously along. When he emerged at the quarry he felt secure, and so
-he picked up his nimble heels and flew. Down, down he sped, till he
-reached the Welshman's. He banged at the door, and presently the heads
-of the old man and his two stalwart sons were thrust from windows.
-
-"What's the row there? Who's banging? What do you want?"
-
-"Let me in--quick! I'll tell everything."
-
-"Why, who are you?"
-
-"Huckleberry Finn--quick, let me in!"
-
-"Huckleberry Finn, indeed! It ain't a name to open many doors, I
-judge! But let him in, lads, and let's see what's the trouble."
-
-"Please don't ever tell I told you," were Huck's first words when he
-got in. "Please don't--I'd be killed, sure--but the widow's been good
-friends to me sometimes, and I want to tell--I WILL tell if you'll
-promise you won't ever say it was me."
-
-"By George, he HAS got something to tell, or he wouldn't act so!"
-exclaimed the old man; "out with it and nobody here'll ever tell, lad."
-
-Three minutes later the old man and his sons, well armed, were up the
-hill, and just entering the sumach path on tiptoe, their weapons in
-their hands. Huck accompanied them no further. He hid behind a great
-bowlder and fell to listening. There was a lagging, anxious silence,
-and then all of a sudden there was an explosion of firearms and a cry.
-
-Huck waited for no particulars. He sprang away and sped down the hill
-as fast as his legs could carry him.
-
-
-
-CHAPTER XXX
-
-AS the earliest suspicion of dawn appeared on Sunday morning, Huck
-came groping up the hill and rapped gently at the old Welshman's door.
-The inmates were asleep, but it was a sleep that was set on a
-hair-trigger, on account of the exciting episode of the night. A call
-came from a window:
-
-"Who's there!"
-
-Huck's scared voice answered in a low tone:
-
-"Please let me in! It's only Huck Finn!"
-
-"It's a name that can open this door night or day, lad!--and welcome!"
-
-These were strange words to the vagabond boy's ears, and the
-pleasantest he had ever heard. He could not recollect that the closing
-word had ever been applied in his case before. The door was quickly
-unlocked, and he entered. Huck was given a seat and the old man and his
-brace of tall sons speedily dressed themselves.
-
-"Now, my boy, I hope you're good and hungry, because breakfast will be
-ready as soon as the sun's up, and we'll have a piping hot one, too
---make yourself easy about that! I and the boys hoped you'd turn up and
-stop here last night."
-
-"I was awful scared," said Huck, "and I run. I took out when the
-pistols went off, and I didn't stop for three mile. I've come now becuz
-I wanted to know about it, you know; and I come before daylight becuz I
-didn't want to run across them devils, even if they was dead."
-
-"Well, poor chap, you do look as if you'd had a hard night of it--but
-there's a bed here for you when you've had your breakfast. No, they
-ain't dead, lad--we are sorry enough for that. You see we knew right
-where to put our hands on them, by your description; so we crept along
-on tiptoe till we got within fifteen feet of them--dark as a cellar
-that sumach path was--and just then I found I was going to sneeze. It
-was the meanest kind of luck! I tried to keep it back, but no use
---'twas bound to come, and it did come! I was in the lead with my pistol
-raised, and when the sneeze started those scoundrels a-rustling to get
-out of the path, I sung out, 'Fire boys!' and blazed away at the place
-where the rustling was. So did the boys. But they were off in a jiffy,
-those villains, and we after them, down through the woods. I judge we
-never touched them. They fired a shot apiece as they started, but their
-bullets whizzed by and didn't do us any harm. As soon as we lost the
-sound of their feet we quit chasing, and went down and stirred up the
-constables. They got a posse together, and went off to guard the river
-bank, and as soon as it is light the sheriff and a gang are going to
-beat up the woods. My boys will be with them presently. I wish we had
-some sort of description of those rascals--'twould help a good deal.
-But you couldn't see what they were like, in the dark, lad, I suppose?"
-
-"Oh yes; I saw them down-town and follered them."
-
-"Splendid! Describe them--describe them, my boy!"
-
-"One's the old deaf and dumb Spaniard that's ben around here once or
-twice, and t'other's a mean-looking, ragged--"
-
-"That's enough, lad, we know the men! Happened on them in the woods
-back of the widow's one day, and they slunk away. Off with you, boys,
-and tell the sheriff--get your breakfast to-morrow morning!"
-
-The Welshman's sons departed at once. As they were leaving the room
-Huck sprang up and exclaimed:
-
-"Oh, please don't tell ANYbody it was me that blowed on them! Oh,
-please!"
-
-"All right if you say it, Huck, but you ought to have the credit of
-what you did."
-
-"Oh no, no! Please don't tell!"
-
-When the young men were gone, the old Welshman said:
-
-"They won't tell--and I won't. But why don't you want it known?"
-
-Huck would not explain, further than to say that he already knew too
-much about one of those men and would not have the man know that he
-knew anything against him for the whole world--he would be killed for
-knowing it, sure.
-
-The old man promised secrecy once more, and said:
-
-"How did you come to follow these fellows, lad? Were they looking
-suspicious?"
-
-Huck was silent while he framed a duly cautious reply. Then he said:
-
-"Well, you see, I'm a kind of a hard lot,--least everybody says so,
-and I don't see nothing agin it--and sometimes I can't sleep much, on
-account of thinking about it and sort of trying to strike out a new way
-of doing. That was the way of it last night. I couldn't sleep, and so I
-come along up-street 'bout midnight, a-turning it all over, and when I
-got to that old shackly brick store by the Temperance Tavern, I backed
-up agin the wall to have another think. Well, just then along comes
-these two chaps slipping along close by me, with something under their
-arm, and I reckoned they'd stole it. One was a-smoking, and t'other one
-wanted a light; so they stopped right before me and the cigars lit up
-their faces and I see that the big one was the deaf and dumb Spaniard,
-by his white whiskers and the patch on his eye, and t'other one was a
-rusty, ragged-looking devil."
-
-"Could you see the rags by the light of the cigars?"
-
-This staggered Huck for a moment. Then he said:
-
-"Well, I don't know--but somehow it seems as if I did."
-
-"Then they went on, and you--"
-
-"Follered 'em--yes. That was it. I wanted to see what was up--they
-sneaked along so. I dogged 'em to the widder's stile, and stood in the
-dark and heard the ragged one beg for the widder, and the Spaniard
-swear he'd spile her looks just as I told you and your two--"
-
-"What! The DEAF AND DUMB man said all that!"
-
-Huck had made another terrible mistake! He was trying his best to keep
-the old man from getting the faintest hint of who the Spaniard might
-be, and yet his tongue seemed determined to get him into trouble in
-spite of all he could do. He made several efforts to creep out of his
-scrape, but the old man's eye was upon him and he made blunder after
-blunder. Presently the Welshman said:
-
-"My boy, don't be afraid of me. I wouldn't hurt a hair of your head
-for all the world. No--I'd protect you--I'd protect you. This Spaniard
-is not deaf and dumb; you've let that slip without intending it; you
-can't cover that up now. You know something about that Spaniard that
-you want to keep dark. Now trust me--tell me what it is, and trust me
---I won't betray you."
-
-Huck looked into the old man's honest eyes a moment, then bent over
-and whispered in his ear:
-
-"'Tain't a Spaniard--it's Injun Joe!"
-
-The Welshman almost jumped out of his chair. In a moment he said:
-
-"It's all plain enough, now. When you talked about notching ears and
-slitting noses I judged that that was your own embellishment, because
-white men don't take that sort of revenge. But an Injun! That's a
-different matter altogether."
-
-During breakfast the talk went on, and in the course of it the old man
-said that the last thing which he and his sons had done, before going
-to bed, was to get a lantern and examine the stile and its vicinity for
-marks of blood. They found none, but captured a bulky bundle of--
-
-"Of WHAT?"
-
-If the words had been lightning they could not have leaped with a more
-stunning suddenness from Huck's blanched lips. His eyes were staring
-wide, now, and his breath suspended--waiting for the answer. The
-Welshman started--stared in return--three seconds--five seconds--ten
---then replied:
-
-"Of burglar's tools. Why, what's the MATTER with you?"
-
-Huck sank back, panting gently, but deeply, unutterably grateful. The
-Welshman eyed him gravely, curiously--and presently said:
-
-"Yes, burglar's tools. That appears to relieve you a good deal. But
-what did give you that turn? What were YOU expecting we'd found?"
-
-Huck was in a close place--the inquiring eye was upon him--he would
-have given anything for material for a plausible answer--nothing
-suggested itself--the inquiring eye was boring deeper and deeper--a
-senseless reply offered--there was no time to weigh it, so at a venture
-he uttered it--feebly:
-
-"Sunday-school books, maybe."
-
-Poor Huck was too distressed to smile, but the old man laughed loud
-and joyously, shook up the details of his anatomy from head to foot,
-and ended by saying that such a laugh was money in a-man's pocket,
-because it cut down the doctor's bill like everything. Then he added:
-
-"Poor old chap, you're white and jaded--you ain't well a bit--no
-wonder you're a little flighty and off your balance. But you'll come
-out of it. Rest and sleep will fetch you out all right, I hope."
-
-Huck was irritated to think he had been such a goose and betrayed such
-a suspicious excitement, for he had dropped the idea that the parcel
-brought from the tavern was the treasure, as soon as he had heard the
-talk at the widow's stile. He had only thought it was not the treasure,
-however--he had not known that it wasn't--and so the suggestion of a
-captured bundle was too much for his self-possession. But on the whole
-he felt glad the little episode had happened, for now he knew beyond
-all question that that bundle was not THE bundle, and so his mind was
-at rest and exceedingly comfortable. In fact, everything seemed to be
-drifting just in the right direction, now; the treasure must be still
-in No. 2, the men would be captured and jailed that day, and he and Tom
-could seize the gold that night without any trouble or any fear of
-interruption.
-
-Just as breakfast was completed there was a knock at the door. Huck
-jumped for a hiding-place, for he had no mind to be connected even
-remotely with the late event. The Welshman admitted several ladies and
-gentlemen, among them the Widow Douglas, and noticed that groups of
-citizens were climbing up the hill--to stare at the stile. So the news
-had spread. The Welshman had to tell the story of the night to the
-visitors. The widow's gratitude for her preservation was outspoken.
-
-"Don't say a word about it, madam. There's another that you're more
-beholden to than you are to me and my boys, maybe, but he don't allow
-me to tell his name. We wouldn't have been there but for him."
-
-Of course this excited a curiosity so vast that it almost belittled
-the main matter--but the Welshman allowed it to eat into the vitals of
-his visitors, and through them be transmitted to the whole town, for he
-refused to part with his secret. When all else had been learned, the
-widow said:
-
-"I went to sleep reading in bed and slept straight through all that
-noise. Why didn't you come and wake me?"
-
-"We judged it warn't worth while. Those fellows warn't likely to come
-again--they hadn't any tools left to work with, and what was the use of
-waking you up and scaring you to death? My three negro men stood guard
-at your house all the rest of the night. They've just come back."
-
-More visitors came, and the story had to be told and retold for a
-couple of hours more.
-
-There was no Sabbath-school during day-school vacation, but everybody
-was early at church. The stirring event was well canvassed. News came
-that not a sign of the two villains had been yet discovered. When the
-sermon was finished, Judge Thatcher's wife dropped alongside of Mrs.
-Harper as she moved down the aisle with the crowd and said:
-
-"Is my Becky going to sleep all day? I just expected she would be
-tired to death."
-
-"Your Becky?"
-
-"Yes," with a startled look--"didn't she stay with you last night?"
-
-"Why, no."
-
-Mrs. Thatcher turned pale, and sank into a pew, just as Aunt Polly,
-talking briskly with a friend, passed by. Aunt Polly said:
-
-"Good-morning, Mrs. Thatcher. Good-morning, Mrs. Harper. I've got a
-boy that's turned up missing. I reckon my Tom stayed at your house last
-night--one of you. And now he's afraid to come to church. I've got to
-settle with him."
-
-Mrs. Thatcher shook her head feebly and turned paler than ever.
-
-"He didn't stay with us," said Mrs. Harper, beginning to look uneasy.
-A marked anxiety came into Aunt Polly's face.
-
-"Joe Harper, have you seen my Tom this morning?"
-
-"No'm."
-
-"When did you see him last?"
-
-Joe tried to remember, but was not sure he could say. The people had
-stopped moving out of church. Whispers passed along, and a boding
-uneasiness took possession of every countenance. Children were
-anxiously questioned, and young teachers. They all said they had not
-noticed whether Tom and Becky were on board the ferryboat on the
-homeward trip; it was dark; no one thought of inquiring if any one was
-missing. One young man finally blurted out his fear that they were
-still in the cave! Mrs. Thatcher swooned away. Aunt Polly fell to
-crying and wringing her hands.
-
-The alarm swept from lip to lip, from group to group, from street to
-street, and within five minutes the bells were wildly clanging and the
-whole town was up! The Cardiff Hill episode sank into instant
-insignificance, the burglars were forgotten, horses were saddled,
-skiffs were manned, the ferryboat ordered out, and before the horror
-was half an hour old, two hundred men were pouring down highroad and
-river toward the cave.
-
-All the long afternoon the village seemed empty and dead. Many women
-visited Aunt Polly and Mrs. Thatcher and tried to comfort them. They
-cried with them, too, and that was still better than words. All the
-tedious night the town waited for news; but when the morning dawned at
-last, all the word that came was, "Send more candles--and send food."
-Mrs. Thatcher was almost crazed; and Aunt Polly, also. Judge Thatcher
-sent messages of hope and encouragement from the cave, but they
-conveyed no real cheer.
-
-The old Welshman came home toward daylight, spattered with
-candle-grease, smeared with clay, and almost worn out. He found Huck
-still in the bed that had been provided for him, and delirious with
-fever. The physicians were all at the cave, so the Widow Douglas came
-and took charge of the patient. She said she would do her best by him,
-because, whether he was good, bad, or indifferent, he was the Lord's,
-and nothing that was the Lord's was a thing to be neglected. The
-Welshman said Huck had good spots in him, and the widow said:
-
-"You can depend on it. That's the Lord's mark. He don't leave it off.
-He never does. Puts it somewhere on every creature that comes from his
-hands."
-
-Early in the forenoon parties of jaded men began to straggle into the
-village, but the strongest of the citizens continued searching. All the
-news that could be gained was that remotenesses of the cavern were
-being ransacked that had never been visited before; that every corner
-and crevice was going to be thoroughly searched; that wherever one
-wandered through the maze of passages, lights were to be seen flitting
-hither and thither in the distance, and shoutings and pistol-shots sent
-their hollow reverberations to the ear down the sombre aisles. In one
-place, far from the section usually traversed by tourists, the names
-"BECKY & TOM" had been found traced upon the rocky wall with
-candle-smoke, and near at hand a grease-soiled bit of ribbon. Mrs.
-Thatcher recognized the ribbon and cried over it. She said it was the
-last relic she should ever have of her child; and that no other memorial
-of her could ever be so precious, because this one parted latest from
-the living body before the awful death came. Some said that now and
-then, in the cave, a far-away speck of light would glimmer, and then a
-glorious shout would burst forth and a score of men go trooping down the
-echoing aisle--and then a sickening disappointment always followed; the
-children were not there; it was only a searcher's light.
-
-Three dreadful days and nights dragged their tedious hours along, and
-the village sank into a hopeless stupor. No one had heart for anything.
-The accidental discovery, just made, that the proprietor of the
-Temperance Tavern kept liquor on his premises, scarcely fluttered the
-public pulse, tremendous as the fact was. In a lucid interval, Huck
-feebly led up to the subject of taverns, and finally asked--dimly
-dreading the worst--if anything had been discovered at the Temperance
-Tavern since he had been ill.
-
-"Yes," said the widow.
-
-Huck started up in bed, wild-eyed:
-
-"What? What was it?"
-
-"Liquor!--and the place has been shut up. Lie down, child--what a turn
-you did give me!"
-
-"Only tell me just one thing--only just one--please! Was it Tom Sawyer
-that found it?"
-
-The widow burst into tears. "Hush, hush, child, hush! I've told you
-before, you must NOT talk. You are very, very sick!"
-
-Then nothing but liquor had been found; there would have been a great
-powwow if it had been the gold. So the treasure was gone forever--gone
-forever! But what could she be crying about? Curious that she should
-cry.
-
-These thoughts worked their dim way through Huck's mind, and under the
-weariness they gave him he fell asleep. The widow said to herself:
-
-"There--he's asleep, poor wreck. Tom Sawyer find it! Pity but somebody
-could find Tom Sawyer! Ah, there ain't many left, now, that's got hope
-enough, or strength enough, either, to go on searching."
-
-
-
-CHAPTER XXXI
-
-NOW to return to Tom and Becky's share in the picnic. They tripped
-along the murky aisles with the rest of the company, visiting the
-familiar wonders of the cave--wonders dubbed with rather
-over-descriptive names, such as "The Drawing-Room," "The Cathedral,"
-"Aladdin's Palace," and so on. Presently the hide-and-seek frolicking
-began, and Tom and Becky engaged in it with zeal until the exertion
-began to grow a trifle wearisome; then they wandered down a sinuous
-avenue holding their candles aloft and reading the tangled web-work of
-names, dates, post-office addresses, and mottoes with which the rocky
-walls had been frescoed (in candle-smoke). Still drifting along and
-talking, they scarcely noticed that they were now in a part of the cave
-whose walls were not frescoed. They smoked their own names under an
-overhanging shelf and moved on. Presently they came to a place where a
-little stream of water, trickling over a ledge and carrying a limestone
-sediment with it, had, in the slow-dragging ages, formed a laced and
-ruffled Niagara in gleaming and imperishable stone. Tom squeezed his
-small body behind it in order to illuminate it for Becky's
-gratification. He found that it curtained a sort of steep natural
-stairway which was enclosed between narrow walls, and at once the
-ambition to be a discoverer seized him. Becky responded to his call,
-and they made a smoke-mark for future guidance, and started upon their
-quest. They wound this way and that, far down into the secret depths of
-the cave, made another mark, and branched off in search of novelties to
-tell the upper world about. In one place they found a spacious cavern,
-from whose ceiling depended a multitude of shining stalactites of the
-length and circumference of a man's leg; they walked all about it,
-wondering and admiring, and presently left it by one of the numerous
-passages that opened into it. This shortly brought them to a bewitching
-spring, whose basin was incrusted with a frostwork of glittering
-crystals; it was in the midst of a cavern whose walls were supported by
-many fantastic pillars which had been formed by the joining of great
-stalactites and stalagmites together, the result of the ceaseless
-water-drip of centuries. Under the roof vast knots of bats had packed
-themselves together, thousands in a bunch; the lights disturbed the
-creatures and they came flocking down by hundreds, squeaking and
-darting furiously at the candles. Tom knew their ways and the danger of
-this sort of conduct. He seized Becky's hand and hurried her into the
-first corridor that offered; and none too soon, for a bat struck
-Becky's light out with its wing while she was passing out of the
-cavern. The bats chased the children a good distance; but the fugitives
-plunged into every new passage that offered, and at last got rid of the
-perilous things. Tom found a subterranean lake, shortly, which
-stretched its dim length away until its shape was lost in the shadows.
-He wanted to explore its borders, but concluded that it would be best
-to sit down and rest awhile, first. Now, for the first time, the deep
-stillness of the place laid a clammy hand upon the spirits of the
-children. Becky said:
-
-"Why, I didn't notice, but it seems ever so long since I heard any of
-the others."
-
-"Come to think, Becky, we are away down below them--and I don't know
-how far away north, or south, or east, or whichever it is. We couldn't
-hear them here."
-
-Becky grew apprehensive.
-
-"I wonder how long we've been down here, Tom? We better start back."
-
-"Yes, I reckon we better. P'raps we better."
-
-"Can you find the way, Tom? It's all a mixed-up crookedness to me."
-
-"I reckon I could find it--but then the bats. If they put our candles
-out it will be an awful fix. Let's try some other way, so as not to go
-through there."
-
-"Well. But I hope we won't get lost. It would be so awful!" and the
-girl shuddered at the thought of the dreadful possibilities.
-
-They started through a corridor, and traversed it in silence a long
-way, glancing at each new opening, to see if there was anything
-familiar about the look of it; but they were all strange. Every time
-Tom made an examination, Becky would watch his face for an encouraging
-sign, and he would say cheerily:
-
-"Oh, it's all right. This ain't the one, but we'll come to it right
-away!"
-
-But he felt less and less hopeful with each failure, and presently
-began to turn off into diverging avenues at sheer random, in desperate
-hope of finding the one that was wanted. He still said it was "all
-right," but there was such a leaden dread at his heart that the words
-had lost their ring and sounded just as if he had said, "All is lost!"
-Becky clung to his side in an anguish of fear, and tried hard to keep
-back the tears, but they would come. At last she said:
-
-"Oh, Tom, never mind the bats, let's go back that way! We seem to get
-worse and worse off all the time."
-
-"Listen!" said he.
-
-Profound silence; silence so deep that even their breathings were
-conspicuous in the hush. Tom shouted. The call went echoing down the
-empty aisles and died out in the distance in a faint sound that
-resembled a ripple of mocking laughter.
-
-"Oh, don't do it again, Tom, it is too horrid," said Becky.
-
-"It is horrid, but I better, Becky; they might hear us, you know," and
-he shouted again.
-
-The "might" was even a chillier horror than the ghostly laughter, it
-so confessed a perishing hope. The children stood still and listened;
-but there was no result. Tom turned upon the back track at once, and
-hurried his steps. It was but a little while before a certain
-indecision in his manner revealed another fearful fact to Becky--he
-could not find his way back!
-
-"Oh, Tom, you didn't make any marks!"
-
-"Becky, I was such a fool! Such a fool! I never thought we might want
-to come back! No--I can't find the way. It's all mixed up."
-
-"Tom, Tom, we're lost! we're lost! We never can get out of this awful
-place! Oh, why DID we ever leave the others!"
-
-She sank to the ground and burst into such a frenzy of crying that Tom
-was appalled with the idea that she might die, or lose her reason. He
-sat down by her and put his arms around her; she buried her face in his
-bosom, she clung to him, she poured out her terrors, her unavailing
-regrets, and the far echoes turned them all to jeering laughter. Tom
-begged her to pluck up hope again, and she said she could not. He fell
-to blaming and abusing himself for getting her into this miserable
-situation; this had a better effect. She said she would try to hope
-again, she would get up and follow wherever he might lead if only he
-would not talk like that any more. For he was no more to blame than
-she, she said.
-
-So they moved on again--aimlessly--simply at random--all they could do
-was to move, keep moving. For a little while, hope made a show of
-reviving--not with any reason to back it, but only because it is its
-nature to revive when the spring has not been taken out of it by age
-and familiarity with failure.
-
-By-and-by Tom took Becky's candle and blew it out. This economy meant
-so much! Words were not needed. Becky understood, and her hope died
-again. She knew that Tom had a whole candle and three or four pieces in
-his pockets--yet he must economize.
-
-By-and-by, fatigue began to assert its claims; the children tried to
-pay attention, for it was dreadful to think of sitting down when time
-was grown to be so precious, moving, in some direction, in any
-direction, was at least progress and might bear fruit; but to sit down
-was to invite death and shorten its pursuit.
-
-At last Becky's frail limbs refused to carry her farther. She sat
-down. Tom rested with her, and they talked of home, and the friends
-there, and the comfortable beds and, above all, the light! Becky cried,
-and Tom tried to think of some way of comforting her, but all his
-encouragements were grown threadbare with use, and sounded like
-sarcasms. Fatigue bore so heavily upon Becky that she drowsed off to
-sleep. Tom was grateful. He sat looking into her drawn face and saw it
-grow smooth and natural under the influence of pleasant dreams; and
-by-and-by a smile dawned and rested there. The peaceful face reflected
-somewhat of peace and healing into his own spirit, and his thoughts
-wandered away to bygone times and dreamy memories. While he was deep in
-his musings, Becky woke up with a breezy little laugh--but it was
-stricken dead upon her lips, and a groan followed it.
-
-"Oh, how COULD I sleep! I wish I never, never had waked! No! No, I
-don't, Tom! Don't look so! I won't say it again."
-
-"I'm glad you've slept, Becky; you'll feel rested, now, and we'll find
-the way out."
-
-"We can try, Tom; but I've seen such a beautiful country in my dream.
-I reckon we are going there."
-
-"Maybe not, maybe not. Cheer up, Becky, and let's go on trying."
-
-They rose up and wandered along, hand in hand and hopeless. They tried
-to estimate how long they had been in the cave, but all they knew was
-that it seemed days and weeks, and yet it was plain that this could not
-be, for their candles were not gone yet. A long time after this--they
-could not tell how long--Tom said they must go softly and listen for
-dripping water--they must find a spring. They found one presently, and
-Tom said it was time to rest again. Both were cruelly tired, yet Becky
-said she thought she could go a little farther. She was surprised to
-hear Tom dissent. She could not understand it. They sat down, and Tom
-fastened his candle to the wall in front of them with some clay.
-Thought was soon busy; nothing was said for some time. Then Becky broke
-the silence:
-
-"Tom, I am so hungry!"
-
-Tom took something out of his pocket.
-
-"Do you remember this?" said he.
-
-Becky almost smiled.
-
-"It's our wedding-cake, Tom."
-
-"Yes--I wish it was as big as a barrel, for it's all we've got."
-
-"I saved it from the picnic for us to dream on, Tom, the way grown-up
-people do with wedding-cake--but it'll be our--"
-
-She dropped the sentence where it was. Tom divided the cake and Becky
-ate with good appetite, while Tom nibbled at his moiety. There was
-abundance of cold water to finish the feast with. By-and-by Becky
-suggested that they move on again. Tom was silent a moment. Then he
-said:
-
-"Becky, can you bear it if I tell you something?"
-
-Becky's face paled, but she thought she could.
-
-"Well, then, Becky, we must stay here, where there's water to drink.
-That little piece is our last candle!"
-
-Becky gave loose to tears and wailings. Tom did what he could to
-comfort her, but with little effect. At length Becky said:
-
-"Tom!"
-
-"Well, Becky?"
-
-"They'll miss us and hunt for us!"
-
-"Yes, they will! Certainly they will!"
-
-"Maybe they're hunting for us now, Tom."
-
-"Why, I reckon maybe they are. I hope they are."
-
-"When would they miss us, Tom?"
-
-"When they get back to the boat, I reckon."
-
-"Tom, it might be dark then--would they notice we hadn't come?"
-
-"I don't know. But anyway, your mother would miss you as soon as they
-got home."
-
-A frightened look in Becky's face brought Tom to his senses and he saw
-that he had made a blunder. Becky was not to have gone home that night!
-The children became silent and thoughtful. In a moment a new burst of
-grief from Becky showed Tom that the thing in his mind had struck hers
-also--that the Sabbath morning might be half spent before Mrs. Thatcher
-discovered that Becky was not at Mrs. Harper's.
-
-The children fastened their eyes upon their bit of candle and watched
-it melt slowly and pitilessly away; saw the half inch of wick stand
-alone at last; saw the feeble flame rise and fall, climb the thin
-column of smoke, linger at its top a moment, and then--the horror of
-utter darkness reigned!
-
-How long afterward it was that Becky came to a slow consciousness that
-she was crying in Tom's arms, neither could tell. All that they knew
-was, that after what seemed a mighty stretch of time, both awoke out of
-a dead stupor of sleep and resumed their miseries once more. Tom said
-it might be Sunday, now--maybe Monday. He tried to get Becky to talk,
-but her sorrows were too oppressive, all her hopes were gone. Tom said
-that they must have been missed long ago, and no doubt the search was
-going on. He would shout and maybe some one would come. He tried it;
-but in the darkness the distant echoes sounded so hideously that he
-tried it no more.
-
-The hours wasted away, and hunger came to torment the captives again.
-A portion of Tom's half of the cake was left; they divided and ate it.
-But they seemed hungrier than before. The poor morsel of food only
-whetted desire.
-
-By-and-by Tom said:
-
-"SH! Did you hear that?"
-
-Both held their breath and listened. There was a sound like the
-faintest, far-off shout. Instantly Tom answered it, and leading Becky
-by the hand, started groping down the corridor in its direction.
-Presently he listened again; again the sound was heard, and apparently
-a little nearer.
-
-"It's them!" said Tom; "they're coming! Come along, Becky--we're all
-right now!"
-
-The joy of the prisoners was almost overwhelming. Their speed was
-slow, however, because pitfalls were somewhat common, and had to be
-guarded against. They shortly came to one and had to stop. It might be
-three feet deep, it might be a hundred--there was no passing it at any
-rate. Tom got down on his breast and reached as far down as he could.
-No bottom. They must stay there and wait until the searchers came. They
-listened; evidently the distant shoutings were growing more distant! a
-moment or two more and they had gone altogether. The heart-sinking
-misery of it! Tom whooped until he was hoarse, but it was of no use. He
-talked hopefully to Becky; but an age of anxious waiting passed and no
-sounds came again.
-
-The children groped their way back to the spring. The weary time
-dragged on; they slept again, and awoke famished and woe-stricken. Tom
-believed it must be Tuesday by this time.
-
-Now an idea struck him. There were some side passages near at hand. It
-would be better to explore some of these than bear the weight of the
-heavy time in idleness. He took a kite-line from his pocket, tied it to
-a projection, and he and Becky started, Tom in the lead, unwinding the
-line as he groped along. At the end of twenty steps the corridor ended
-in a "jumping-off place." Tom got down on his knees and felt below, and
-then as far around the corner as he could reach with his hands
-conveniently; he made an effort to stretch yet a little farther to the
-right, and at that moment, not twenty yards away, a human hand, holding
-a candle, appeared from behind a rock! Tom lifted up a glorious shout,
-and instantly that hand was followed by the body it belonged to--Injun
-Joe's! Tom was paralyzed; he could not move. He was vastly gratified
-the next moment, to see the "Spaniard" take to his heels and get
-himself out of sight. Tom wondered that Joe had not recognized his
-voice and come over and killed him for testifying in court. But the
-echoes must have disguised the voice. Without doubt, that was it, he
-reasoned. Tom's fright weakened every muscle in his body. He said to
-himself that if he had strength enough to get back to the spring he
-would stay there, and nothing should tempt him to run the risk of
-meeting Injun Joe again. He was careful to keep from Becky what it was
-he had seen. He told her he had only shouted "for luck."
-
-But hunger and wretchedness rise superior to fears in the long run.
-Another tedious wait at the spring and another long sleep brought
-changes. The children awoke tortured with a raging hunger. Tom believed
-that it must be Wednesday or Thursday or even Friday or Saturday, now,
-and that the search had been given over. He proposed to explore another
-passage. He felt willing to risk Injun Joe and all other terrors. But
-Becky was very weak. She had sunk into a dreary apathy and would not be
-roused. She said she would wait, now, where she was, and die--it would
-not be long. She told Tom to go with the kite-line and explore if he
-chose; but she implored him to come back every little while and speak
-to her; and she made him promise that when the awful time came, he
-would stay by her and hold her hand until all was over.
-
-Tom kissed her, with a choking sensation in his throat, and made a
-show of being confident of finding the searchers or an escape from the
-cave; then he took the kite-line in his hand and went groping down one
-of the passages on his hands and knees, distressed with hunger and sick
-with bodings of coming doom.
-
-
-
-CHAPTER XXXII
-
-TUESDAY afternoon came, and waned to the twilight. The village of St.
-Petersburg still mourned. The lost children had not been found. Public
-prayers had been offered up for them, and many and many a private
-prayer that had the petitioner's whole heart in it; but still no good
-news came from the cave. The majority of the searchers had given up the
-quest and gone back to their daily avocations, saying that it was plain
-the children could never be found. Mrs. Thatcher was very ill, and a
-great part of the time delirious. People said it was heartbreaking to
-hear her call her child, and raise her head and listen a whole minute
-at a time, then lay it wearily down again with a moan. Aunt Polly had
-drooped into a settled melancholy, and her gray hair had grown almost
-white. The village went to its rest on Tuesday night, sad and forlorn.
-
-Away in the middle of the night a wild peal burst from the village
-bells, and in a moment the streets were swarming with frantic half-clad
-people, who shouted, "Turn out! turn out! they're found! they're
-found!" Tin pans and horns were added to the din, the population massed
-itself and moved toward the river, met the children coming in an open
-carriage drawn by shouting citizens, thronged around it, joined its
-homeward march, and swept magnificently up the main street roaring
-huzzah after huzzah!
-
-The village was illuminated; nobody went to bed again; it was the
-greatest night the little town had ever seen. During the first half-hour
-a procession of villagers filed through Judge Thatcher's house, seized
-the saved ones and kissed them, squeezed Mrs. Thatcher's hand, tried to
-speak but couldn't--and drifted out raining tears all over the place.
-
-Aunt Polly's happiness was complete, and Mrs. Thatcher's nearly so. It
-would be complete, however, as soon as the messenger dispatched with
-the great news to the cave should get the word to her husband. Tom lay
-upon a sofa with an eager auditory about him and told the history of
-the wonderful adventure, putting in many striking additions to adorn it
-withal; and closed with a description of how he left Becky and went on
-an exploring expedition; how he followed two avenues as far as his
-kite-line would reach; how he followed a third to the fullest stretch of
-the kite-line, and was about to turn back when he glimpsed a far-off
-speck that looked like daylight; dropped the line and groped toward it,
-pushed his head and shoulders through a small hole, and saw the broad
-Mississippi rolling by! And if it had only happened to be night he would
-not have seen that speck of daylight and would not have explored that
-passage any more! He told how he went back for Becky and broke the good
-news and she told him not to fret her with such stuff, for she was
-tired, and knew she was going to die, and wanted to. He described how he
-labored with her and convinced her; and how she almost died for joy when
-she had groped to where she actually saw the blue speck of daylight; how
-he pushed his way out at the hole and then helped her out; how they sat
-there and cried for gladness; how some men came along in a skiff and Tom
-hailed them and told them their situation and their famished condition;
-how the men didn't believe the wild tale at first, "because," said they,
-"you are five miles down the river below the valley the cave is in"
---then took them aboard, rowed to a house, gave them supper, made them
-rest till two or three hours after dark and then brought them home.
-
-Before day-dawn, Judge Thatcher and the handful of searchers with him
-were tracked out, in the cave, by the twine clews they had strung
-behind them, and informed of the great news.
-
-Three days and nights of toil and hunger in the cave were not to be
-shaken off at once, as Tom and Becky soon discovered. They were
-bedridden all of Wednesday and Thursday, and seemed to grow more and
-more tired and worn, all the time. Tom got about, a little, on
-Thursday, was down-town Friday, and nearly as whole as ever Saturday;
-but Becky did not leave her room until Sunday, and then she looked as
-if she had passed through a wasting illness.
-
-Tom learned of Huck's sickness and went to see him on Friday, but
-could not be admitted to the bedroom; neither could he on Saturday or
-Sunday. He was admitted daily after that, but was warned to keep still
-about his adventure and introduce no exciting topic. The Widow Douglas
-stayed by to see that he obeyed. At home Tom learned of the Cardiff
-Hill event; also that the "ragged man's" body had eventually been found
-in the river near the ferry-landing; he had been drowned while trying
-to escape, perhaps.
-
-About a fortnight after Tom's rescue from the cave, he started off to
-visit Huck, who had grown plenty strong enough, now, to hear exciting
-talk, and Tom had some that would interest him, he thought. Judge
-Thatcher's house was on Tom's way, and he stopped to see Becky. The
-Judge and some friends set Tom to talking, and some one asked him
-ironically if he wouldn't like to go to the cave again. Tom said he
-thought he wouldn't mind it. The Judge said:
-
-"Well, there are others just like you, Tom, I've not the least doubt.
-But we have taken care of that. Nobody will get lost in that cave any
-more."
-
-"Why?"
-
-"Because I had its big door sheathed with boiler iron two weeks ago,
-and triple-locked--and I've got the keys."
-
-Tom turned as white as a sheet.
-
-"What's the matter, boy! Here, run, somebody! Fetch a glass of water!"
-
-The water was brought and thrown into Tom's face.
-
-"Ah, now you're all right. What was the matter with you, Tom?"
-
-"Oh, Judge, Injun Joe's in the cave!"
-
-
-
-CHAPTER XXXIII
-
-WITHIN a few minutes the news had spread, and a dozen skiff-loads of
-men were on their way to McDougal's cave, and the ferryboat, well
-filled with passengers, soon followed. Tom Sawyer was in the skiff that
-bore Judge Thatcher.
-
-When the cave door was unlocked, a sorrowful sight presented itself in
-the dim twilight of the place. Injun Joe lay stretched upon the ground,
-dead, with his face close to the crack of the door, as if his longing
-eyes had been fixed, to the latest moment, upon the light and the cheer
-of the free world outside. Tom was touched, for he knew by his own
-experience how this wretch had suffered. His pity was moved, but
-nevertheless he felt an abounding sense of relief and security, now,
-which revealed to him in a degree which he had not fully appreciated
-before how vast a weight of dread had been lying upon him since the day
-he lifted his voice against this bloody-minded outcast.
-
-Injun Joe's bowie-knife lay close by, its blade broken in two. The
-great foundation-beam of the door had been chipped and hacked through,
-with tedious labor; useless labor, too, it was, for the native rock
-formed a sill outside it, and upon that stubborn material the knife had
-wrought no effect; the only damage done was to the knife itself. But if
-there had been no stony obstruction there the labor would have been
-useless still, for if the beam had been wholly cut away Injun Joe could
-not have squeezed his body under the door, and he knew it. So he had
-only hacked that place in order to be doing something--in order to pass
-the weary time--in order to employ his tortured faculties. Ordinarily
-one could find half a dozen bits of candle stuck around in the crevices
-of this vestibule, left there by tourists; but there were none now. The
-prisoner had searched them out and eaten them. He had also contrived to
-catch a few bats, and these, also, he had eaten, leaving only their
-claws. The poor unfortunate had starved to death. In one place, near at
-hand, a stalagmite had been slowly growing up from the ground for ages,
-builded by the water-drip from a stalactite overhead. The captive had
-broken off the stalagmite, and upon the stump had placed a stone,
-wherein he had scooped a shallow hollow to catch the precious drop
-that fell once in every three minutes with the dreary regularity of a
-clock-tick--a dessertspoonful once in four and twenty hours. That drop
-was falling when the Pyramids were new; when Troy fell; when the
-foundations of Rome were laid; when Christ was crucified; when the
-Conqueror created the British empire; when Columbus sailed; when the
-massacre at Lexington was "news." It is falling now; it will still be
-falling when all these things shall have sunk down the afternoon of
-history, and the twilight of tradition, and been swallowed up in the
-thick night of oblivion. Has everything a purpose and a mission? Did
-this drop fall patiently during five thousand years to be ready for
-this flitting human insect's need? and has it another important object
-to accomplish ten thousand years to come? No matter. It is many and
-many a year since the hapless half-breed scooped out the stone to catch
-the priceless drops, but to this day the tourist stares longest at that
-pathetic stone and that slow-dropping water when he comes to see the
-wonders of McDougal's cave. Injun Joe's cup stands first in the list of
-the cavern's marvels; even "Aladdin's Palace" cannot rival it.
-
-Injun Joe was buried near the mouth of the cave; and people flocked
-there in boats and wagons from the towns and from all the farms and
-hamlets for seven miles around; they brought their children, and all
-sorts of provisions, and confessed that they had had almost as
-satisfactory a time at the funeral as they could have had at the
-hanging.
-
-This funeral stopped the further growth of one thing--the petition to
-the governor for Injun Joe's pardon. The petition had been largely
-signed; many tearful and eloquent meetings had been held, and a
-committee of sappy women been appointed to go in deep mourning and wail
-around the governor, and implore him to be a merciful ass and trample
-his duty under foot. Injun Joe was believed to have killed five
-citizens of the village, but what of that? If he had been Satan himself
-there would have been plenty of weaklings ready to scribble their names
-to a pardon-petition, and drip a tear on it from their permanently
-impaired and leaky water-works.
-
-The morning after the funeral Tom took Huck to a private place to have
-an important talk. Huck had learned all about Tom's adventure from the
-Welshman and the Widow Douglas, by this time, but Tom said he reckoned
-there was one thing they had not told him; that thing was what he
-wanted to talk about now. Huck's face saddened. He said:
-
-"I know what it is. You got into No. 2 and never found anything but
-whiskey. Nobody told me it was you; but I just knowed it must 'a' ben
-you, soon as I heard 'bout that whiskey business; and I knowed you
-hadn't got the money becuz you'd 'a' got at me some way or other and
-told me even if you was mum to everybody else. Tom, something's always
-told me we'd never get holt of that swag."
-
-"Why, Huck, I never told on that tavern-keeper. YOU know his tavern
-was all right the Saturday I went to the picnic. Don't you remember you
-was to watch there that night?"
-
-"Oh yes! Why, it seems 'bout a year ago. It was that very night that I
-follered Injun Joe to the widder's."
-
-"YOU followed him?"
-
-"Yes--but you keep mum. I reckon Injun Joe's left friends behind him,
-and I don't want 'em souring on me and doing me mean tricks. If it
-hadn't ben for me he'd be down in Texas now, all right."
-
-Then Huck told his entire adventure in confidence to Tom, who had only
-heard of the Welshman's part of it before.
-
-"Well," said Huck, presently, coming back to the main question,
-"whoever nipped the whiskey in No. 2, nipped the money, too, I reckon
---anyways it's a goner for us, Tom."
-
-"Huck, that money wasn't ever in No. 2!"
-
-"What!" Huck searched his comrade's face keenly. "Tom, have you got on
-the track of that money again?"
-
-"Huck, it's in the cave!"
-
-Huck's eyes blazed.
-
-"Say it again, Tom."
-
-"The money's in the cave!"
-
-"Tom--honest injun, now--is it fun, or earnest?"
-
-"Earnest, Huck--just as earnest as ever I was in my life. Will you go
-in there with me and help get it out?"
-
-"I bet I will! I will if it's where we can blaze our way to it and not
-get lost."
-
-"Huck, we can do that without the least little bit of trouble in the
-world."
-
-"Good as wheat! What makes you think the money's--"
-
-"Huck, you just wait till we get in there. If we don't find it I'll
-agree to give you my drum and every thing I've got in the world. I
-will, by jings."
-
-"All right--it's a whiz. When do you say?"
-
-"Right now, if you say it. Are you strong enough?"
-
-"Is it far in the cave? I ben on my pins a little, three or four days,
-now, but I can't walk more'n a mile, Tom--least I don't think I could."
-
-"It's about five mile into there the way anybody but me would go,
-Huck, but there's a mighty short cut that they don't anybody but me
-know about. Huck, I'll take you right to it in a skiff. I'll float the
-skiff down there, and I'll pull it back again all by myself. You
-needn't ever turn your hand over."
-
-"Less start right off, Tom."
-
-"All right. We want some bread and meat, and our pipes, and a little
-bag or two, and two or three kite-strings, and some of these
-new-fangled things they call lucifer matches. I tell you, many's
-the time I wished I had some when I was in there before."
-
-A trifle after noon the boys borrowed a small skiff from a citizen who
-was absent, and got under way at once. When they were several miles
-below "Cave Hollow," Tom said:
-
-"Now you see this bluff here looks all alike all the way down from the
-cave hollow--no houses, no wood-yards, bushes all alike. But do you see
-that white place up yonder where there's been a landslide? Well, that's
-one of my marks. We'll get ashore, now."
-
-They landed.
-
-"Now, Huck, where we're a-standing you could touch that hole I got out
-of with a fishing-pole. See if you can find it."
-
-Huck searched all the place about, and found nothing. Tom proudly
-marched into a thick clump of sumach bushes and said:
-
-"Here you are! Look at it, Huck; it's the snuggest hole in this
-country. You just keep mum about it. All along I've been wanting to be
-a robber, but I knew I'd got to have a thing like this, and where to
-run across it was the bother. We've got it now, and we'll keep it
-quiet, only we'll let Joe Harper and Ben Rogers in--because of course
-there's got to be a Gang, or else there wouldn't be any style about it.
-Tom Sawyer's Gang--it sounds splendid, don't it, Huck?"
-
-"Well, it just does, Tom. And who'll we rob?"
-
-"Oh, most anybody. Waylay people--that's mostly the way."
-
-"And kill them?"
-
-"No, not always. Hive them in the cave till they raise a ransom."
-
-"What's a ransom?"
-
-"Money. You make them raise all they can, off'n their friends; and
-after you've kept them a year, if it ain't raised then you kill them.
-That's the general way. Only you don't kill the women. You shut up the
-women, but you don't kill them. They're always beautiful and rich, and
-awfully scared. You take their watches and things, but you always take
-your hat off and talk polite. They ain't anybody as polite as robbers
---you'll see that in any book. Well, the women get to loving you, and
-after they've been in the cave a week or two weeks they stop crying and
-after that you couldn't get them to leave. If you drove them out they'd
-turn right around and come back. It's so in all the books."
-
-"Why, it's real bully, Tom. I believe it's better'n to be a pirate."
-
-"Yes, it's better in some ways, because it's close to home and
-circuses and all that."
-
-By this time everything was ready and the boys entered the hole, Tom
-in the lead. They toiled their way to the farther end of the tunnel,
-then made their spliced kite-strings fast and moved on. A few steps
-brought them to the spring, and Tom felt a shudder quiver all through
-him. He showed Huck the fragment of candle-wick perched on a lump of
-clay against the wall, and described how he and Becky had watched the
-flame struggle and expire.
-
-The boys began to quiet down to whispers, now, for the stillness and
-gloom of the place oppressed their spirits. They went on, and presently
-entered and followed Tom's other corridor until they reached the
-"jumping-off place." The candles revealed the fact that it was not
-really a precipice, but only a steep clay hill twenty or thirty feet
-high. Tom whispered:
-
-"Now I'll show you something, Huck."
-
-He held his candle aloft and said:
-
-"Look as far around the corner as you can. Do you see that? There--on
-the big rock over yonder--done with candle-smoke."
-
-"Tom, it's a CROSS!"
-
-"NOW where's your Number Two? 'UNDER THE CROSS,' hey? Right yonder's
-where I saw Injun Joe poke up his candle, Huck!"
-
-Huck stared at the mystic sign awhile, and then said with a shaky voice:
-
-"Tom, less git out of here!"
-
-"What! and leave the treasure?"
-
-"Yes--leave it. Injun Joe's ghost is round about there, certain."
-
-"No it ain't, Huck, no it ain't. It would ha'nt the place where he
-died--away out at the mouth of the cave--five mile from here."
-
-"No, Tom, it wouldn't. It would hang round the money. I know the ways
-of ghosts, and so do you."
-
-Tom began to fear that Huck was right. Misgivings gathered in his
-mind. But presently an idea occurred to him--
-
-"Lookyhere, Huck, what fools we're making of ourselves! Injun Joe's
-ghost ain't a going to come around where there's a cross!"
-
-The point was well taken. It had its effect.
-
-"Tom, I didn't think of that. But that's so. It's luck for us, that
-cross is. I reckon we'll climb down there and have a hunt for that box."
-
-Tom went first, cutting rude steps in the clay hill as he descended.
-Huck followed. Four avenues opened out of the small cavern which the
-great rock stood in. The boys examined three of them with no result.
-They found a small recess in the one nearest the base of the rock, with
-a pallet of blankets spread down in it; also an old suspender, some
-bacon rind, and the well-gnawed bones of two or three fowls. But there
-was no money-box. The lads searched and researched this place, but in
-vain. Tom said:
-
-"He said UNDER the cross. Well, this comes nearest to being under the
-cross. It can't be under the rock itself, because that sets solid on
-the ground."
-
-They searched everywhere once more, and then sat down discouraged.
-Huck could suggest nothing. By-and-by Tom said:
-
-"Lookyhere, Huck, there's footprints and some candle-grease on the
-clay about one side of this rock, but not on the other sides. Now,
-what's that for? I bet you the money IS under the rock. I'm going to
-dig in the clay."
-
-"That ain't no bad notion, Tom!" said Huck with animation.
-
-Tom's "real Barlow" was out at once, and he had not dug four inches
-before he struck wood.
-
-"Hey, Huck!--you hear that?"
-
-Huck began to dig and scratch now. Some boards were soon uncovered and
-removed. They had concealed a natural chasm which led under the rock.
-Tom got into this and held his candle as far under the rock as he
-could, but said he could not see to the end of the rift. He proposed to
-explore. He stooped and passed under; the narrow way descended
-gradually. He followed its winding course, first to the right, then to
-the left, Huck at his heels. Tom turned a short curve, by-and-by, and
-exclaimed:
-
-"My goodness, Huck, lookyhere!"
-
-It was the treasure-box, sure enough, occupying a snug little cavern,
-along with an empty powder-keg, a couple of guns in leather cases, two
-or three pairs of old moccasins, a leather belt, and some other rubbish
-well soaked with the water-drip.
-
-"Got it at last!" said Huck, ploughing among the tarnished coins with
-his hand. "My, but we're rich, Tom!"
-
-"Huck, I always reckoned we'd get it. It's just too good to believe,
-but we HAVE got it, sure! Say--let's not fool around here. Let's snake
-it out. Lemme see if I can lift the box."
-
-It weighed about fifty pounds. Tom could lift it, after an awkward
-fashion, but could not carry it conveniently.
-
-"I thought so," he said; "THEY carried it like it was heavy, that day
-at the ha'nted house. I noticed that. I reckon I was right to think of
-fetching the little bags along."
-
-The money was soon in the bags and the boys took it up to the cross
-rock.
-
-"Now less fetch the guns and things," said Huck.
-
-"No, Huck--leave them there. They're just the tricks to have when we
-go to robbing. We'll keep them there all the time, and we'll hold our
-orgies there, too. It's an awful snug place for orgies."
-
-"What orgies?"
-
-"I dono. But robbers always have orgies, and of course we've got to
-have them, too. Come along, Huck, we've been in here a long time. It's
-getting late, I reckon. I'm hungry, too. We'll eat and smoke when we
-get to the skiff."
-
-They presently emerged into the clump of sumach bushes, looked warily
-out, found the coast clear, and were soon lunching and smoking in the
-skiff. As the sun dipped toward the horizon they pushed out and got
-under way. Tom skimmed up the shore through the long twilight, chatting
-cheerily with Huck, and landed shortly after dark.
-
-"Now, Huck," said Tom, "we'll hide the money in the loft of the
-widow's woodshed, and I'll come up in the morning and we'll count it
-and divide, and then we'll hunt up a place out in the woods for it
-where it will be safe. Just you lay quiet here and watch the stuff till
-I run and hook Benny Taylor's little wagon; I won't be gone a minute."
-
-He disappeared, and presently returned with the wagon, put the two
-small sacks into it, threw some old rags on top of them, and started
-off, dragging his cargo behind him. When the boys reached the
-Welshman's house, they stopped to rest. Just as they were about to move
-on, the Welshman stepped out and said:
-
-"Hallo, who's that?"
-
-"Huck and Tom Sawyer."
-
-"Good! Come along with me, boys, you are keeping everybody waiting.
-Here--hurry up, trot ahead--I'll haul the wagon for you. Why, it's not
-as light as it might be. Got bricks in it?--or old metal?"
-
-"Old metal," said Tom.
-
-"I judged so; the boys in this town will take more trouble and fool
-away more time hunting up six bits' worth of old iron to sell to the
-foundry than they would to make twice the money at regular work. But
-that's human nature--hurry along, hurry along!"
-
-The boys wanted to know what the hurry was about.
-
-"Never mind; you'll see, when we get to the Widow Douglas'."
-
-Huck said with some apprehension--for he was long used to being
-falsely accused:
-
-"Mr. Jones, we haven't been doing nothing."
-
-The Welshman laughed.
-
-"Well, I don't know, Huck, my boy. I don't know about that. Ain't you
-and the widow good friends?"
-
-"Yes. Well, she's ben good friends to me, anyway."
-
-"All right, then. What do you want to be afraid for?"
-
-This question was not entirely answered in Huck's slow mind before he
-found himself pushed, along with Tom, into Mrs. Douglas' drawing-room.
-Mr. Jones left the wagon near the door and followed.
-
-The place was grandly lighted, and everybody that was of any
-consequence in the village was there. The Thatchers were there, the
-Harpers, the Rogerses, Aunt Polly, Sid, Mary, the minister, the editor,
-and a great many more, and all dressed in their best. The widow
-received the boys as heartily as any one could well receive two such
-looking beings. They were covered with clay and candle-grease. Aunt
-Polly blushed crimson with humiliation, and frowned and shook her head
-at Tom. Nobody suffered half as much as the two boys did, however. Mr.
-Jones said:
-
-"Tom wasn't at home, yet, so I gave him up; but I stumbled on him and
-Huck right at my door, and so I just brought them along in a hurry."
-
-"And you did just right," said the widow. "Come with me, boys."
-
-She took them to a bedchamber and said:
-
-"Now wash and dress yourselves. Here are two new suits of clothes
---shirts, socks, everything complete. They're Huck's--no, no thanks,
-Huck--Mr. Jones bought one and I the other. But they'll fit both of you.
-Get into them. We'll wait--come down when you are slicked up enough."
-
-Then she left.
-
-
-
-CHAPTER XXXIV
-
-HUCK said: "Tom, we can slope, if we can find a rope. The window ain't
-high from the ground."
-
-"Shucks! what do you want to slope for?"
-
-"Well, I ain't used to that kind of a crowd. I can't stand it. I ain't
-going down there, Tom."
-
-"Oh, bother! It ain't anything. I don't mind it a bit. I'll take care
-of you."
-
-Sid appeared.
-
-"Tom," said he, "auntie has been waiting for you all the afternoon.
-Mary got your Sunday clothes ready, and everybody's been fretting about
-you. Say--ain't this grease and clay, on your clothes?"
-
-"Now, Mr. Siddy, you jist 'tend to your own business. What's all this
-blow-out about, anyway?"
-
-"It's one of the widow's parties that she's always having. This time
-it's for the Welshman and his sons, on account of that scrape they
-helped her out of the other night. And say--I can tell you something,
-if you want to know."
-
-"Well, what?"
-
-"Why, old Mr. Jones is going to try to spring something on the people
-here to-night, but I overheard him tell auntie to-day about it, as a
-secret, but I reckon it's not much of a secret now. Everybody knows
---the widow, too, for all she tries to let on she don't. Mr. Jones was
-bound Huck should be here--couldn't get along with his grand secret
-without Huck, you know!"
-
-"Secret about what, Sid?"
-
-"About Huck tracking the robbers to the widow's. I reckon Mr. Jones
-was going to make a grand time over his surprise, but I bet you it will
-drop pretty flat."
-
-Sid chuckled in a very contented and satisfied way.
-
-"Sid, was it you that told?"
-
-"Oh, never mind who it was. SOMEBODY told--that's enough."
-
-"Sid, there's only one person in this town mean enough to do that, and
-that's you. If you had been in Huck's place you'd 'a' sneaked down the
-hill and never told anybody on the robbers. You can't do any but mean
-things, and you can't bear to see anybody praised for doing good ones.
-There--no thanks, as the widow says"--and Tom cuffed Sid's ears and
-helped him to the door with several kicks. "Now go and tell auntie if
-you dare--and to-morrow you'll catch it!"
-
-Some minutes later the widow's guests were at the supper-table, and a
-dozen children were propped up at little side-tables in the same room,
-after the fashion of that country and that day. At the proper time Mr.
-Jones made his little speech, in which he thanked the widow for the
-honor she was doing himself and his sons, but said that there was
-another person whose modesty--
-
-And so forth and so on. He sprung his secret about Huck's share in the
-adventure in the finest dramatic manner he was master of, but the
-surprise it occasioned was largely counterfeit and not as clamorous and
-effusive as it might have been under happier circumstances. However,
-the widow made a pretty fair show of astonishment, and heaped so many
-compliments and so much gratitude upon Huck that he almost forgot the
-nearly intolerable discomfort of his new clothes in the entirely
-intolerable discomfort of being set up as a target for everybody's gaze
-and everybody's laudations.
-
-The widow said she meant to give Huck a home under her roof and have
-him educated; and that when she could spare the money she would start
-him in business in a modest way. Tom's chance was come. He said:
-
-"Huck don't need it. Huck's rich."
-
-Nothing but a heavy strain upon the good manners of the company kept
-back the due and proper complimentary laugh at this pleasant joke. But
-the silence was a little awkward. Tom broke it:
-
-"Huck's got money. Maybe you don't believe it, but he's got lots of
-it. Oh, you needn't smile--I reckon I can show you. You just wait a
-minute."
-
-Tom ran out of doors. The company looked at each other with a
-perplexed interest--and inquiringly at Huck, who was tongue-tied.
-
-"Sid, what ails Tom?" said Aunt Polly. "He--well, there ain't ever any
-making of that boy out. I never--"
-
-Tom entered, struggling with the weight of his sacks, and Aunt Polly
-did not finish her sentence. Tom poured the mass of yellow coin upon
-the table and said:
-
-"There--what did I tell you? Half of it's Huck's and half of it's mine!"
-
-The spectacle took the general breath away. All gazed, nobody spoke
-for a moment. Then there was a unanimous call for an explanation. Tom
-said he could furnish it, and he did. The tale was long, but brimful of
-interest. There was scarcely an interruption from any one to break the
-charm of its flow. When he had finished, Mr. Jones said:
-
-"I thought I had fixed up a little surprise for this occasion, but it
-don't amount to anything now. This one makes it sing mighty small, I'm
-willing to allow."
-
-The money was counted. The sum amounted to a little over twelve
-thousand dollars. It was more than any one present had ever seen at one
-time before, though several persons were there who were worth
-considerably more than that in property.
-
-
-
-CHAPTER XXXV
-
-THE reader may rest satisfied that Tom's and Huck's windfall made a
-mighty stir in the poor little village of St. Petersburg. So vast a
-sum, all in actual cash, seemed next to incredible. It was talked
-about, gloated over, glorified, until the reason of many of the
-citizens tottered under the strain of the unhealthy excitement. Every
-"haunted" house in St. Petersburg and the neighboring villages was
-dissected, plank by plank, and its foundations dug up and ransacked for
-hidden treasure--and not by boys, but men--pretty grave, unromantic
-men, too, some of them. Wherever Tom and Huck appeared they were
-courted, admired, stared at. The boys were not able to remember that
-their remarks had possessed weight before; but now their sayings were
-treasured and repeated; everything they did seemed somehow to be
-regarded as remarkable; they had evidently lost the power of doing and
-saying commonplace things; moreover, their past history was raked up
-and discovered to bear marks of conspicuous originality. The village
-paper published biographical sketches of the boys.
-
-The Widow Douglas put Huck's money out at six per cent., and Judge
-Thatcher did the same with Tom's at Aunt Polly's request. Each lad had
-an income, now, that was simply prodigious--a dollar for every week-day
-in the year and half of the Sundays. It was just what the minister got
---no, it was what he was promised--he generally couldn't collect it. A
-dollar and a quarter a week would board, lodge, and school a boy in
-those old simple days--and clothe him and wash him, too, for that
-matter.
-
-Judge Thatcher had conceived a great opinion of Tom. He said that no
-commonplace boy would ever have got his daughter out of the cave. When
-Becky told her father, in strict confidence, how Tom had taken her
-whipping at school, the Judge was visibly moved; and when she pleaded
-grace for the mighty lie which Tom had told in order to shift that
-whipping from her shoulders to his own, the Judge said with a fine
-outburst that it was a noble, a generous, a magnanimous lie--a lie that
-was worthy to hold up its head and march down through history breast to
-breast with George Washington's lauded Truth about the hatchet! Becky
-thought her father had never looked so tall and so superb as when he
-walked the floor and stamped his foot and said that. She went straight
-off and told Tom about it.
-
-Judge Thatcher hoped to see Tom a great lawyer or a great soldier some
-day. He said he meant to look to it that Tom should be admitted to the
-National Military Academy and afterward trained in the best law school
-in the country, in order that he might be ready for either career or
-both.
-
-Huck Finn's wealth and the fact that he was now under the Widow
-Douglas' protection introduced him into society--no, dragged him into
-it, hurled him into it--and his sufferings were almost more than he
-could bear. The widow's servants kept him clean and neat, combed and
-brushed, and they bedded him nightly in unsympathetic sheets that had
-not one little spot or stain which he could press to his heart and know
-for a friend. He had to eat with a knife and fork; he had to use
-napkin, cup, and plate; he had to learn his book, he had to go to
-church; he had to talk so properly that speech was become insipid in
-his mouth; whithersoever he turned, the bars and shackles of
-civilization shut him in and bound him hand and foot.
-
-He bravely bore his miseries three weeks, and then one day turned up
-missing. For forty-eight hours the widow hunted for him everywhere in
-great distress. The public were profoundly concerned; they searched
-high and low, they dragged the river for his body. Early the third
-morning Tom Sawyer wisely went poking among some old empty hogsheads
-down behind the abandoned slaughter-house, and in one of them he found
-the refugee. Huck had slept there; he had just breakfasted upon some
-stolen odds and ends of food, and was lying off, now, in comfort, with
-his pipe. He was unkempt, uncombed, and clad in the same old ruin of
-rags that had made him picturesque in the days when he was free and
-happy. Tom routed him out, told him the trouble he had been causing,
-and urged him to go home. Huck's face lost its tranquil content, and
-took a melancholy cast. He said:
-
-"Don't talk about it, Tom. I've tried it, and it don't work; it don't
-work, Tom. It ain't for me; I ain't used to it. The widder's good to
-me, and friendly; but I can't stand them ways. She makes me get up just
-at the same time every morning; she makes me wash, they comb me all to
-thunder; she won't let me sleep in the woodshed; I got to wear them
-blamed clothes that just smothers me, Tom; they don't seem to any air
-git through 'em, somehow; and they're so rotten nice that I can't set
-down, nor lay down, nor roll around anywher's; I hain't slid on a
-cellar-door for--well, it 'pears to be years; I got to go to church and
-sweat and sweat--I hate them ornery sermons! I can't ketch a fly in
-there, I can't chaw. I got to wear shoes all Sunday. The widder eats by
-a bell; she goes to bed by a bell; she gits up by a bell--everything's
-so awful reg'lar a body can't stand it."
-
-"Well, everybody does that way, Huck."
-
-"Tom, it don't make no difference. I ain't everybody, and I can't
-STAND it. It's awful to be tied up so. And grub comes too easy--I don't
-take no interest in vittles, that way. I got to ask to go a-fishing; I
-got to ask to go in a-swimming--dern'd if I hain't got to ask to do
-everything. Well, I'd got to talk so nice it wasn't no comfort--I'd got
-to go up in the attic and rip out awhile, every day, to git a taste in
-my mouth, or I'd a died, Tom. The widder wouldn't let me smoke; she
-wouldn't let me yell, she wouldn't let me gape, nor stretch, nor
-scratch, before folks--" [Then with a spasm of special irritation and
-injury]--"And dad fetch it, she prayed all the time! I never see such a
-woman! I HAD to shove, Tom--I just had to. And besides, that school's
-going to open, and I'd a had to go to it--well, I wouldn't stand THAT,
-Tom. Looky here, Tom, being rich ain't what it's cracked up to be. It's
-just worry and worry, and sweat and sweat, and a-wishing you was dead
-all the time. Now these clothes suits me, and this bar'l suits me, and
-I ain't ever going to shake 'em any more. Tom, I wouldn't ever got into
-all this trouble if it hadn't 'a' ben for that money; now you just take
-my sheer of it along with your'n, and gimme a ten-center sometimes--not
-many times, becuz I don't give a dern for a thing 'thout it's tollable
-hard to git--and you go and beg off for me with the widder."
-
-"Oh, Huck, you know I can't do that. 'Tain't fair; and besides if
-you'll try this thing just a while longer you'll come to like it."
-
-"Like it! Yes--the way I'd like a hot stove if I was to set on it long
-enough. No, Tom, I won't be rich, and I won't live in them cussed
-smothery houses. I like the woods, and the river, and hogsheads, and
-I'll stick to 'em, too. Blame it all! just as we'd got guns, and a
-cave, and all just fixed to rob, here this dern foolishness has got to
-come up and spile it all!"
-
-Tom saw his opportunity--
-
-"Lookyhere, Huck, being rich ain't going to keep me back from turning
-robber."
-
-"No! Oh, good-licks; are you in real dead-wood earnest, Tom?"
-
-"Just as dead earnest as I'm sitting here. But Huck, we can't let you
-into the gang if you ain't respectable, you know."
-
-Huck's joy was quenched.
-
-"Can't let me in, Tom? Didn't you let me go for a pirate?"
-
-"Yes, but that's different. A robber is more high-toned than what a
-pirate is--as a general thing. In most countries they're awful high up
-in the nobility--dukes and such."
-
-"Now, Tom, hain't you always ben friendly to me? You wouldn't shet me
-out, would you, Tom? You wouldn't do that, now, WOULD you, Tom?"
-
-"Huck, I wouldn't want to, and I DON'T want to--but what would people
-say? Why, they'd say, 'Mph! Tom Sawyer's Gang! pretty low characters in
-it!' They'd mean you, Huck. You wouldn't like that, and I wouldn't."
-
-Huck was silent for some time, engaged in a mental struggle. Finally
-he said:
-
-"Well, I'll go back to the widder for a month and tackle it and see if
-I can come to stand it, if you'll let me b'long to the gang, Tom."
-
-"All right, Huck, it's a whiz! Come along, old chap, and I'll ask the
-widow to let up on you a little, Huck."
-
-"Will you, Tom--now will you? That's good. If she'll let up on some of
-the roughest things, I'll smoke private and cuss private, and crowd
-through or bust. When you going to start the gang and turn robbers?"
-
-"Oh, right off. We'll get the boys together and have the initiation
-to-night, maybe."
-
-"Have the which?"
-
-"Have the initiation."
-
-"What's that?"
-
-"It's to swear to stand by one another, and never tell the gang's
-secrets, even if you're chopped all to flinders, and kill anybody and
-all his family that hurts one of the gang."
-
-"That's gay--that's mighty gay, Tom, I tell you."
-
-"Well, I bet it is. And all that swearing's got to be done at
-midnight, in the lonesomest, awfulest place you can find--a ha'nted
-house is the best, but they're all ripped up now."
-
-"Well, midnight's good, anyway, Tom."
-
-"Yes, so it is. And you've got to swear on a coffin, and sign it with
-blood."
-
-"Now, that's something LIKE! Why, it's a million times bullier than
-pirating. I'll stick to the widder till I rot, Tom; and if I git to be
-a reg'lar ripper of a robber, and everybody talking 'bout it, I reckon
-she'll be proud she snaked me in out of the wet."
-
-
-
-CONCLUSION
-
-SO endeth this chronicle. It being strictly a history of a BOY, it
-must stop here; the story could not go much further without becoming
-the history of a MAN. When one writes a novel about grown people, he
-knows exactly where to stop--that is, with a marriage; but when he
-writes of juveniles, he must stop where he best can.
-
-Most of the characters that perform in this book still live, and are
-prosperous and happy. Some day it may seem worth while to take up the
-story of the younger ones again and see what sort of men and women they
-turned out to be; therefore it will be wisest not to reveal any of that
-part of their lives at present.
-
-
-
-
-
-End of the Project Gutenberg EBook of The Adventures of Tom Sawyer, Complete
-by Mark Twain (Samuel Clemens)
-
-*** END OF THIS PROJECT GUTENBERG EBOOK TOM SAWYER ***
-
-***** This file should be named 74.txt or 74.zip *****
-This and all associated files of various formats will be found in:
-        http://www.gutenberg.net/7/74/
-
-Produced by David Widger. The previous edition was update by Jose
-Menendez.
-
-
-Updated editions will replace the previous one--the old editions
-will be renamed.
-
-Creating the works from public domain print editions means that no
-one owns a United States copyright in these works, so the Foundation
-(and you!) can copy and distribute it in the United States without
-permission and without paying copyright royalties.  Special rules,
-set forth in the General Terms of Use part of this license, apply to
-copying and distributing Project Gutenberg-tm electronic works to
-protect the PROJECT GUTENBERG-tm concept and trademark.  Project
-Gutenberg is a registered trademark, and may not be used if you
-charge for the eBooks, unless you receive specific permission.  If you
-do not charge anything for copies of this eBook, complying with the
-rules is very easy.  You may use this eBook for nearly any purpose
-such as creation of derivative works, reports, performances and
-research.  They may be modified and printed and given away--you may do
-practically ANYTHING with public domain eBooks.  Redistribution is
-subject to the trademark license, especially commercial
-redistribution.
-
-
-
-*** START: FULL LICENSE ***
-
-THE FULL PROJECT GUTENBERG LICENSE
-PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK
-
-To protect the Project Gutenberg-tm mission of promoting the free
-distribution of electronic works, by using or distributing this work
-(or any other work associated in any way with the phrase "Project
-Gutenberg"), you agree to comply with all the terms of the Full Project
-Gutenberg-tm License (available with this file or online at
-http://gutenberg.net/license).
-
-
-Section 1.  General Terms of Use and Redistributing Project Gutenberg-tm
-electronic works
-
-1.A.  By reading or using any part of this Project Gutenberg-tm
-electronic work, you indicate that you have read, understand, agree to
-and accept all the terms of this license and intellectual property
-(trademark/copyright) agreement.  If you do not agree to abide by all
-the terms of this agreement, you must cease using and return or destroy
-all copies of Project Gutenberg-tm electronic works in your possession.
-If you paid a fee for obtaining a copy of or access to a Project
-Gutenberg-tm electronic work and you do not agree to be bound by the
-terms of this agreement, you may obtain a refund from the person or
-entity to whom you paid the fee as set forth in paragraph 1.E.8.
-
-1.B.  "Project Gutenberg" is a registered trademark.  It may only be
-used on or associated in any way with an electronic work by people who
-agree to be bound by the terms of this agreement.  There are a few
-things that you can do with most Project Gutenberg-tm electronic works
-even without complying with the full terms of this agreement.  See
-paragraph 1.C below.  There are a lot of things you can do with Project
-Gutenberg-tm electronic works if you follow the terms of this agreement
-and help preserve free future access to Project Gutenberg-tm electronic
-works.  See paragraph 1.E below.
-
-1.C.  The Project Gutenberg Literary Archive Foundation ("the Foundation"
-or PGLAF), owns a compilation copyright in the collection of Project
-Gutenberg-tm electronic works.  Nearly all the individual works in the
-collection are in the public domain in the United States.  If an
-individual work is in the public domain in the United States and you are
-located in the United States, we do not claim a right to prevent you from
-copying, distributing, performing, displaying or creating derivative
-works based on the work as long as all references to Project Gutenberg
-are removed.  Of course, we hope that you will support the Project
-Gutenberg-tm mission of promoting free access to electronic works by
-freely sharing Project Gutenberg-tm works in compliance with the terms of
-this agreement for keeping the Project Gutenberg-tm name associated with
-the work.  You can easily comply with the terms of this agreement by
-keeping this work in the same format with its attached full Project
-Gutenberg-tm License when you share it without charge with others.
-
-1.D.  The copyright laws of the place where you are located also govern
-what you can do with this work.  Copyright laws in most countries are in
-a constant state of change.  If you are outside the United States, check
-the laws of your country in addition to the terms of this agreement
-before downloading, copying, displaying, performing, distributing or
-creating derivative works based on this work or any other Project
-Gutenberg-tm work.  The Foundation makes no representations concerning
-the copyright status of any work in any country outside the United
-States.
-
-1.E.  Unless you have removed all references to Project Gutenberg:
-
-1.E.1.  The following sentence, with active links to, or other immediate
-access to, the full Project Gutenberg-tm License must appear prominently
-whenever any copy of a Project Gutenberg-tm work (any work on which the
-phrase "Project Gutenberg" appears, or with which the phrase "Project
-Gutenberg" is associated) is accessed, displayed, performed, viewed,
-copied or distributed:
-
-This eBook is for the use of anyone anywhere at no cost and with
-almost no restrictions whatsoever.  You may copy it, give it away or
-re-use it under the terms of the Project Gutenberg License included
-with this eBook or online at www.gutenberg.net
-
-1.E.2.  If an individual Project Gutenberg-tm electronic work is derived
-from the public domain (does not contain a notice indicating that it is
-posted with permission of the copyright holder), the work can be copied
-and distributed to anyone in the United States without paying any fees
-or charges.  If you are redistributing or providing access to a work
-with the phrase "Project Gutenberg" associated with or appearing on the
-work, you must comply either with the requirements of paragraphs 1.E.1
-through 1.E.7 or obtain permission for the use of the work and the
-Project Gutenberg-tm trademark as set forth in paragraphs 1.E.8 or
-1.E.9.
-
-1.E.3.  If an individual Project Gutenberg-tm electronic work is posted
-with the permission of the copyright holder, your use and distribution
-must comply with both paragraphs 1.E.1 through 1.E.7 and any additional
-terms imposed by the copyright holder.  Additional terms will be linked
-to the Project Gutenberg-tm License for all works posted with the
-permission of the copyright holder found at the beginning of this work.
-
-1.E.4.  Do not unlink or detach or remove the full Project Gutenberg-tm
-License terms from this work, or any files containing a part of this
-work or any other work associated with Project Gutenberg-tm.
-
-1.E.5.  Do not copy, display, perform, distribute or redistribute this
-electronic work, or any part of this electronic work, without
-prominently displaying the sentence set forth in paragraph 1.E.1 with
-active links or immediate access to the full terms of the Project
-Gutenberg-tm License.
-
-1.E.6.  You may convert to and distribute this work in any binary,
-compressed, marked up, nonproprietary or proprietary form, including any
-word processing or hypertext form.  However, if you provide access to or
-distribute copies of a Project Gutenberg-tm work in a format other than
-"Plain Vanilla ASCII" or other format used in the official version
-posted on the official Project Gutenberg-tm web site (www.gutenberg.net),
-you must, at no additional cost, fee or expense to the user, provide a
-copy, a means of exporting a copy, or a means of obtaining a copy upon
-request, of the work in its original "Plain Vanilla ASCII" or other
-form.  Any alternate format must include the full Project Gutenberg-tm
-License as specified in paragraph 1.E.1.
-
-1.E.7.  Do not charge a fee for access to, viewing, displaying,
-performing, copying or distributing any Project Gutenberg-tm works
-unless you comply with paragraph 1.E.8 or 1.E.9.
-
-1.E.8.  You may charge a reasonable fee for copies of or providing
-access to or distributing Project Gutenberg-tm electronic works provided
-that
-
-- You pay a royalty fee of 20% of the gross profits you derive from
-     the use of Project Gutenberg-tm works calculated using the method
-     you already use to calculate your applicable taxes.  The fee is
-     owed to the owner of the Project Gutenberg-tm trademark, but he
-     has agreed to donate royalties under this paragraph to the
-     Project Gutenberg Literary Archive Foundation.  Royalty payments
-     must be paid within 60 days following each date on which you
-     prepare (or are legally required to prepare) your periodic tax
-     returns.  Royalty payments should be clearly marked as such and
-     sent to the Project Gutenberg Literary Archive Foundation at the
-     address specified in Section 4, "Information about donations to
-     the Project Gutenberg Literary Archive Foundation."
-
-- You provide a full refund of any money paid by a user who notifies
-     you in writing (or by e-mail) within 30 days of receipt that s/he
-     does not agree to the terms of the full Project Gutenberg-tm
-     License.  You must require such a user to return or
-     destroy all copies of the works possessed in a physical medium
-     and discontinue all use of and all access to other copies of
-     Project Gutenberg-tm works.
-
-- You provide, in accordance with paragraph 1.F.3, a full refund of any
-     money paid for a work or a replacement copy, if a defect in the
-     electronic work is discovered and reported to you within 90 days
-     of receipt of the work.
-
-- You comply with all other terms of this agreement for free
-     distribution of Project Gutenberg-tm works.
-
-1.E.9.  If you wish to charge a fee or distribute a Project Gutenberg-tm
-electronic work or group of works on different terms than are set
-forth in this agreement, you must obtain permission in writing from
-both the Project Gutenberg Literary Archive Foundation and Michael
-Hart, the owner of the Project Gutenberg-tm trademark.  Contact the
-Foundation as set forth in Section 3 below.
-
-1.F.
-
-1.F.1.  Project Gutenberg volunteers and employees expend considerable
-effort to identify, do copyright research on, transcribe and proofread
-public domain works in creating the Project Gutenberg-tm
-collection.  Despite these efforts, Project Gutenberg-tm electronic
-works, and the medium on which they may be stored, may contain
-"Defects," such as, but not limited to, incomplete, inaccurate or
-corrupt data, transcription errors, a copyright or other intellectual
-property infringement, a defective or damaged disk or other medium, a
-computer virus, or computer codes that damage or cannot be read by
-your equipment.
-
-1.F.2.  LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the "Right
-of Replacement or Refund" described in paragraph 1.F.3, the Project
-Gutenberg Literary Archive Foundation, the owner of the Project
-Gutenberg-tm trademark, and any other party distributing a Project
-Gutenberg-tm electronic work under this agreement, disclaim all
-liability to you for damages, costs and expenses, including legal
-fees.  YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT
-LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE
-PROVIDED IN PARAGRAPH F3.  YOU AGREE THAT THE FOUNDATION, THE
-TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE
-LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR
-INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-1.F.3.  LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a
-defect in this electronic work within 90 days of receiving it, you can
-receive a refund of the money (if any) you paid for it by sending a
-written explanation to the person you received the work from.  If you
-received the work on a physical medium, you must return the medium with
-your written explanation.  The person or entity that provided you with
-the defective work may elect to provide a replacement copy in lieu of a
-refund.  If you received the work electronically, the person or entity
-providing it to you may choose to give you a second opportunity to
-receive the work electronically in lieu of a refund.  If the second copy
-is also defective, you may demand a refund in writing without further
-opportunities to fix the problem.
-
-1.F.4.  Except for the limited right of replacement or refund set forth
-in paragraph 1.F.3, this work is provided to you 'AS-IS' WITH NO OTHER
-WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
-WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR ANY PURPOSE.
-
-1.F.5.  Some states do not allow disclaimers of certain implied
-warranties or the exclusion or limitation of certain types of damages.
-If any disclaimer or limitation set forth in this agreement violates the
-law of the state applicable to this agreement, the agreement shall be
-interpreted to make the maximum disclaimer or limitation permitted by
-the applicable state law.  The invalidity or unenforceability of any
-provision of this agreement shall not void the remaining provisions.
-
-1.F.6.  INDEMNITY - You agree to indemnify and hold the Foundation, the
-trademark owner, any agent or employee of the Foundation, anyone
-providing copies of Project Gutenberg-tm electronic works in accordance
-with this agreement, and any volunteers associated with the production,
-promotion and distribution of Project Gutenberg-tm electronic works,
-harmless from all liability, costs and expenses, including legal fees,
-that arise directly or indirectly from any of the following which you do
-or cause to occur: (a) distribution of this or any Project Gutenberg-tm
-work, (b) alteration, modification, or additions or deletions to any
-Project Gutenberg-tm work, and (c) any Defect you cause.
-
-
-Section  2.  Information about the Mission of Project Gutenberg-tm
-
-Project Gutenberg-tm is synonymous with the free distribution of
-electronic works in formats readable by the widest variety of computers
-including obsolete, old, middle-aged and new computers.  It exists
-because of the efforts of hundreds of volunteers and donations from
-people in all walks of life.
-
-Volunteers and financial support to provide volunteers with the
-assistance they need, is critical to reaching Project Gutenberg-tm's
-goals and ensuring that the Project Gutenberg-tm collection will
-remain freely available for generations to come.  In 2001, the Project
-Gutenberg Literary Archive Foundation was created to provide a secure
-and permanent future for Project Gutenberg-tm and future generations.
-To learn more about the Project Gutenberg Literary Archive Foundation
-and how your efforts and donations can help, see Sections 3 and 4
-and the Foundation web page at http://www.pglaf.org.
-
-
-Section 3.  Information about the Project Gutenberg Literary Archive
-Foundation
-
-The Project Gutenberg Literary Archive Foundation is a non profit
-501(c)(3) educational corporation organized under the laws of the
-state of Mississippi and granted tax exempt status by the Internal
-Revenue Service.  The Foundation's EIN or federal tax identification
-number is 64-6221541.  Its 501(c)(3) letter is posted at
-http://pglaf.org/fundraising.  Contributions to the Project Gutenberg
-Literary Archive Foundation are tax deductible to the full extent
-permitted by U.S. federal laws and your state's laws.
-
-The Foundation's principal office is located at 4557 Melan Dr. S.
-Fairbanks, AK, 99712., but its volunteers and employees are scattered
-throughout numerous locations.  Its business office is located at
-809 North 1500 West, Salt Lake City, UT 84116, (801) 596-1887, email
-business@pglaf.org.  Email contact links and up to date contact
-information can be found at the Foundation's web site and official
-page at http://pglaf.org
-
-For additional contact information:
-     Dr. Gregory B. Newby
-     Chief Executive and Director
-     gbnewby@pglaf.org
-
-
-Section 4.  Information about Donations to the Project Gutenberg
-Literary Archive Foundation
-
-Project Gutenberg-tm depends upon and cannot survive without wide
-spread public support and donations to carry out its mission of
-increasing the number of public domain and licensed works that can be
-freely distributed in machine readable form accessible by the widest
-array of equipment including outdated equipment.  Many small donations
-($1 to $5,000) are particularly important to maintaining tax exempt
-status with the IRS.
-
-The Foundation is committed to complying with the laws regulating
-charities and charitable donations in all 50 states of the United
-States.  Compliance requirements are not uniform and it takes a
-considerable effort, much paperwork and many fees to meet and keep up
-with these requirements.  We do not solicit donations in locations
-where we have not received written confirmation of compliance.  To
-SEND DONATIONS or determine the status of compliance for any
-particular state visit http://pglaf.org
-
-While we cannot and do not solicit contributions from states where we
-have not met the solicitation requirements, we know of no prohibition
-against accepting unsolicited donations from donors in such states who
-approach us with offers to donate.
-
-International donations are gratefully accepted, but we cannot make
-any statements concerning tax treatment of donations received from
-outside the United States.  U.S. laws alone swamp our small staff.
-
-Please check the Project Gutenberg Web pages for current donation
-methods and addresses.  Donations are accepted in a number of other
-ways including including checks, online payments and credit card
-donations.  To donate, please visit: http://pglaf.org/donate
-
-
-Section 5.  General Information About Project Gutenberg-tm electronic
-works.
-
-Professor Michael S. Hart is the originator of the Project Gutenberg-tm
-concept of a library of electronic works that could be freely shared
-with anyone.  For thirty years, he produced and distributed Project
-Gutenberg-tm eBooks with only a loose network of volunteer support.
-
-
-Project Gutenberg-tm eBooks are often created from several printed
-editions, all of which are confirmed as Public Domain in the U.S.
-unless a copyright notice is included.  Thus, we do not necessarily
-keep eBooks in compliance with any particular paper edition.
-
-
-Most people start at our Web site which has the main PG search facility:
-
-     http://www.gutenberg.net
-
-This Web site includes information about Project Gutenberg-tm,
-including how to make donations to the Project Gutenberg Literary
-Archive Foundation, how to help produce our new eBooks, and how to
-subscribe to our email newsletter to hear about new eBooks.
diff --git a/third_party/gofrontend/libgo/go/compress/testdata/e.txt b/third_party/gofrontend/libgo/go/compress/testdata/e.txt
deleted file mode 100644
index 5ca186f..0000000
--- a/third_party/gofrontend/libgo/go/compress/testdata/e.txt
+++ /dev/null
@@ -1 +0,0 @@
-2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161403970198376793206832823764648042953118023287825098194558153017567173613320698112509961818815930416903515988885193458072738667385894228792284998920868058257492796104841984443634632449684875602336248270419786232090021609902353043699418491463140934317381436405462531520961836908887070167683964243781405927145635490613031072085103837505101157477041718986106873969655212671546889570350354021234078498193343210681701210056278802351930332247450158539047304199577770935036604169973297250886876966403555707162268447162560798826517871341951246652010305921236677194325278675398558944896970964097545918569563802363701621120477427228364896134225164450781824423529486363721417402388934412479635743702637552944483379980161254922785092577825620926226483262779333865664816277251640191059004916449982893150566047258027786318641551956532442586982946959308019152987211725563475463964479101459040905862984967912874068705048958586717479854667757573205681288459205413340539220001137863009455606881667400169842055804033637953764520304024322566135278369511778838638744396625322498506549958862342818997077332761717839280349465014345588970719425863987727547109629537415211151368350627526023264847287039207643100595841166120545297030236472549296669381151373227536450988890313602057248176585118063036442812314965507047510254465011727211555194866850800368532281831521960037356252794495158284188294787610852639813955990067376482922443752871846245780361929819713991475644882626039033814418232625150974827987779964373089970388867782271383605772978824125611907176639465070633045279546618550966661856647097113444740160704626215680717481877844371436988218559670959102596862002353718588748569652200050311734392073211390803293634479727355955277349071783793421637012050054513263835440001863239914907054797780566978533580489669062951194324730995876552368128590413832411607226029983305353708761389396391779574540161372236187893652605381558415871869255386061647798340254351284396129460352913325942794904337299085731580290958631382683291477116396337092400316894586360606458459251269946557248391865642097526850823075442545993769170419777800853627309417101634349076964237222943523661255725088147792231519747780605696725380171807763603462459278778465850656050780844211529697521890874019660906651803516501792504619501366585436632712549639908549144200014574760819302212066024330096412704894390397177195180699086998606636583232278709376502260149291011517177635944602023249300280401867723910288097866605651183260043688508817157238669842242201024950551881694803221002515426494639812873677658927688163598312477886520141174110913601164995076629077943646005851941998560162647907615321038727557126992518275687989302761761146162549356495903798045838182323368612016243736569846703785853305275833337939907521660692380533698879565137285593883499894707416181550125397064648171946708348197214488898790676503795903669672494992545279033729636162658976039498576741397359441023744329709355477982629614591442936451428617158587339746791897571211956187385783644758448423555581050025611492391518893099463428413936080383091662818811503715284967059741625628236092168075150177725387402564253470879089137291722828611515915683725241630772254406337875931059826760944203261924285317018781772960235413060672136046000389661093647095141417185777014180606443636815464440053316087783143174440811949422975599314011888683314832802706553833004693290115744147563139997221703804617092894579096271662260740718749975359212756084414737823303270330168237193648002173285734935947564334129943024850235732214597843282641421684878721673367010615094243456984401873312810107945127223737886126058165668053714396127888732527373890392890506865324138062796025930387727697783792868409325365880733988457218746021005311483351323850047827169376218004904795597959290591655470505777514308175112698985188408718564026035305583737832422924185625644255022672155980274012617971928047139600689163828665277009752767069777036439260224372841840883251848770472638440379530166905465937461619323840363893131364327137688841026811219891275223056256756254701725086349765367288605966752740868627407912856576996313789753034660616669804218267724560530660773899624218340859882071864682623215080288286359746839654358856685503773131296587975810501214916207656769950659715344763470320853215603674828608378656803073062657633469774295634643716709397193060876963495328846833613038829431040800296873869117066666146800015121143442256023874474325250769387077775193299942137277211258843608715834835626961661980572526612206797540621062080649882918454395301529982092503005498257043390553570168653120526495614857249257386206917403695213533732531666345466588597286659451136441370331393672118569553952108458407244323835586063106806964924851232632699514603596037297253198368423363904632136710116192821711150282801604488058802382031981493096369596735832742024988245684941273860566491352526706046234450549227581151709314921879592718001940968866986837037302200475314338181092708030017205935530520700706072233999463990571311587099635777359027196285061146514837526209565346713290025994397663114545902685898979115837093419370441155121920117164880566945938131183843765620627846310490346293950029458341164824114969758326011800731699437393506966295712410273239138741754923071862454543222039552735295240245903805744502892246886285336542213815722131163288112052146489805180092024719391710555390113943316681515828843687606961102505171007392762385553386272553538830960671644662370922646809671254061869502143176211668140097595281493907222601112681153108387317617323235263605838173151034595736538223534992935822836851007810884634349983518404451704270189381994243410090575376257767571118090088164183319201962623416288166521374717325477727783488774366518828752156685719506371936565390389449366421764003121527870222366463635755503565576948886549500270853923617105502131147413744106134445544192101336172996285694899193369184729478580729156088510396781959429833186480756083679551496636448965592948187851784038773326247051945050419847742014183947731202815886845707290544057510601285258056594703046836344592652552137008068752009593453607316226118728173928074623094685367823106097921599360019946237993434210687813497346959246469752506246958616909178573976595199392993995567542714654910456860702099012606818704984178079173924071945996323060254707901774527513186809982284730860766536866855516467702911336827563107223346726113705490795365834538637196235856312618387156774118738527722922594743373785695538456246801013905727871016512966636764451872465653730402443684140814488732957847348490003019477888020460324660842875351848364959195082888323206522128104190448047247949291342284951970022601310430062410717971502793433263407995960531446053230488528972917659876016667811937932372453857209607582277178483361613582612896226118129455927462767137794487586753657544861407611931125958512655759734573015333642630767985443385761715333462325270572005303988289499034259566232975782488735029259166825894456894655992658454762694528780516501720674785417887982276806536650641910973434528878338621726156269582654478205672987756426325321594294418039943217000090542650763095588465895171709147607437136893319469090981904501290307099566226620303182649365733698419555776963787624918852865686607600566025605445711337286840205574416030837052312242587223438854123179481388550075689381124935386318635287083799845692619981794523364087429591180747453419551420351726184200845509170845682368200897739455842679214273477560879644279202708312150156406341341617166448069815483764491573900121217041547872591998943825364950514771379399147205219529079396137621107238494290616357604596231253506068537651423115349665683715116604220796394466621163255157729070978473156278277598788136491951257483328793771571459091064841642678309949723674420175862269402159407924480541255360431317992696739157542419296607312393763542139230617876753958711436104089409966089471418340698362993675362621545247298464213752891079884381306095552622720837518629837066787224430195793793786072107254277289071732854874374355781966511716618330881129120245204048682200072344035025448202834254187884653602591506445271657700044521097735585897622655484941621714989532383421600114062950718490427789258552743035221396835679018076406042138307308774460170842688272261177180842664333651780002171903449234264266292261456004337383868335555343453004264818473989215627086095650629340405264943244261445665921291225648893569655009154306426134252668472594914314239398845432486327461842846655985332312210466259890141712103446084271616619001257195870793217569698544013397622096749454185407118446433946990162698351607848924514058940946395267807354579700307051163682519487701189764002827648414160587206184185297189154019688253289309149665345753571427318482016384644832499037886069008072709327673127581966563941148961716832980455139729506687604740915420428429993541025829113502241690769431668574242522509026939034814856451303069925199590436384028429267412573422447765584177886171737265462085498294498946787350929581652632072258992368768457017823038096567883112289305809140572610865884845873101658151167533327674887014829167419701512559782572707406431808601428149024146780472327597684269633935773542930186739439716388611764209004068663398856841681003872389214483176070116684503887212364367043314091155733280182977988736590916659612402021778558854876176161989370794380056663364884365089144805571039765214696027662583599051987042300179465536788567430285974600143785483237068701190078499404930918919181649327259774030074879681484882342932023012128032327460392219687528340516906974194257614673978110715464186273369091584973185011183960482533518748438923177292613543024932562896371361977285456622924461644497284597867711574125670307871885109336344480149675240618536569532074170533486782754827815415561966911055101472799040386897220465550833170782394808785990501947563108984124144672821865459971596639015641941751820935932616316888380132758752601460507676098392625726411120135288591317848299475682472564885533357279772205543568126302535748216585414000805314820697137262149755576051890481622376790414926742600071045922695314835188137463887104273544767623577933993970632396604969145303273887874557905934937772320142954803345000695256980935282887783710670585567749481373858630385762823040694005665340584887527005308832459182183494318049834199639981458773435863115940570443683515285383609442955964360676090221741896883548131643997437764158365242234642619597390455450680695232850751868719449064767791886720306418630751053512149851051207313846648717547518382979990189317751550639981016466414592102406838294603208535554058147159273220677567669213664081505900806952540610628536408293276621931939933861623836069111767785448236129326858199965239275488427435414402884536455595124735546139403154952097397051896240157976832639450633230452192645049651735466775699295718989690470902730288544945416699791992948038254980285946029052763145580316514066229171223429375806143993484914362107993576737317948964252488813720435579287511385856973381976083524423240466778020948399639946684833774706725483618848273000648319163826022110555221246733323184463005504481849916996622087746140216157021029603318588727333298779352570182393861244026868339555870607758169954398469568540671174444932479519572159419645863736126915526457574786985964242176592896862383506370433939811671397544736228625506803682664135541448048997721373174119199970017293907303350869020922519124447393278376156321810842898207706974138707053266117683698647741787180202729412982310888796831880854367327806879771659111654224453806625861711729498038248879986504061563975629936962809358189761491017145343556659542757064194408833816841111166200759787244137082333917886114708228657531078536674695018462140736493917366254937783014074302668422150335117736471853872324040421037907750266020114814935482228916663640782450166815341213505278578539332606110249802273093636740213515386431693015267460536064351732154701091440650878823636764236831187390937464232609021646365627553976834019482932795750624399645272578624400375983422050808935129023122475970644105678361870877172333555465482598906861201410107222465904008553798235253885171623518256518482203125214950700378300411216212126052726059944320443056274522916128891766814160639131235975350390320077529587392412476451850809163911459296071156344204347133544720981178461451077872399140606290228276664309264900592249810291068759434533858330391178747575977065953570979640012224092199031158229259667913153991561438070129260780197022589662923368154312499412259460023399472228171056603931877226800493833148980338548909468685130789292064242819174795866199944411196208730498064385006852620258432842085582338566936649849720817046135376163584015342840674118587581546514598270228676671855309311923340191286170613364873183197560812569460089402953094429119590295968563923037689976327462283900735457144596414108229285922239332836210192822937243590283003884445701383771632056518351970100115722010956997890484964453434612129224964732356126321951155701565824427661599326463155806672053127596948538057364208384918887095176052287817339462747644656858900936266123311152910816041524100214195937349786431661556732702792109593543055579732660554677963552005378304619540636971842916168582734122217145885870814274090248185446421774876925093328785670674677381226752831653559245204578070541352576903253522738963847495646255940378924925007624386893776475310102323746733771474581625530698032499033676455430305274561512961214585944432150749051491453950981001388737926379964873728396416897555132275962011838248650746985492038097691932606437608743209385602815642849756549307909733854185583515789409814007691892389063090542534883896831762904120212949167195811935791203162514344096503132835216728021372415947344095498316138322505486708172221475138425166790445416617303200820330902895488808516797258495813407132180533988828139346049850532340472595097214331492586604248511405819579711564191458842833000525684776874305916390494306871343118796189637475503362820939949343690321031976898112055595369465424704173323895394046035325396758354395350516720261647961347790912327995264929045151148307923369382166010702872651938143844844532639517394110131152502750465749343063766541866128915264446926222884366299462732467958736383501937142786471398054038215513463223702071533134887083174146591492406359493020921122052610312390682941345696785958518393491382340884274312419099152870804332809132993078936867127413922890033069995875921815297612482409116951587789964090352577345938248232053055567238095022266790439614231852991989181065554412477204508510210071522352342792531266930108270633942321762570076323139159349709946933241013908779161651226804414809765618979735043151396066913258379033748620836695475083280318786707751177525663963479259219733577949555498655214193398170268639987388347010255262052312317215254062571636771270010760912281528326508984359568975961038372157726831170734552250194121701541318793651818502020877326906133592182000762327269503283827391243828198170871168108951187896746707073377869592565542713340052326706040004348843432902760360498027862160749469654989210474443927871934536701798673920803845633723311983855862638008516345597194441994344624761123844617615736242015935078520825600604101556889899501732554337298073561699861101908472096600708320280569917042590103876928658336557728758684250492690370934262028022399861803400211320742198642917383679176232826444645756330336556777374808644109969141827774253417010988435853189339175934511574023847292909015468559163792696196841000676598399744972047287881831200233383298030567865480871476464512824264478216644266616732096012564794514827125671326697067367144617795643752391742928503987022583734069852309190464967260243411270345611114149835783901793499713790913696706497637127248466613279908254305449295528594932793818341607827091326680865655921102733746700132583428715240835661522165574998431236278287106649401564670141943713823863454729606978693335973109537126499416282656463708490580151538205338326511289504938566468752921135932220265681856418260827538790002407915892646028490894922299966167437731347776134150965262448332709343898412056926145108857812249139616912534202918139898683901335795857624435194008943955180554746554000051766240202825944828833811886381749594284892013520090951007864941868256009273977667585642598378587497776669563350170748579027248701370264203283965756348010818356182372177082236423186591595883669487322411726504487268392328453010991677518376831599821263237123854357312681202445175401852132663740538802901249728180895021553100673598184430429105288459323064725590442355960551978839325930339572934663055160430923785677229293537208416693134575284011873746854691620648991164726909428982971065606801805807843600461866223562874591385185904416250663222249561448724413813849763797102676020845531824111963927941069619465426480006761727618115630063644321116224837379105623611358836334550102286170517890440570419577859833348463317921904494652923021469259756566389965893747728751393377105569802455757436190501772466214587592374418657530064998056688376964229825501195065837843125232135309371235243969149662310110328243570065781487677299160941153954063362752423712935549926713485031578238899567545287915578420483105749330060197958207739558522807307048950936235550769837881926357141779338750216344391014187576711938914416277109602859415809719913429313295145924373636456473035037374538503489286113141638094752301745088784885645741275003353303416138096560043105860548355773946625033230034341587814634602169235079216111013148948281895391028916816328709309713184139815427678818067628650978085718262117003140003377301581536334149093237034703637513354537634521050370995452942055232078817449370937677056009306353645510913481627378204985657055608784211964039972344556458607689515569686899384896439195225232309703301037277227710870564912966121061494072782442033414057441446459968236966118878411656290355117839944070961772567164919790168195234523807446299877664824873753313018142763910519234685081979001796519907050490865237442841652776611425351538665162781316090964802801234493372427866930894827913465443931965254154829494577875758599482099181824522449312077768250830768282335001597040419199560509705364696473142448453825888112602753909548852639708652339052941829691802357120545328231809270356491743371932080628731303589640570873779967845174740515317401384878082881006046388936711640477755985481263907504747295012609419990373721246201677030517790352952793168766305099837441859803498821239340919805055103821539827677291373138006715339240126954586376422065097810852907639079727841301764553247527073788764069366420012194745702358295481365781809867944020220280822637957006755393575808086318932075864444206644691649334467698180811716568665213389686173592450920801465312529777966137198695916451869432324246404401672381978020728394418264502183131483366019384891972317817154372192103946638473715630226701801343515930442853848941825678870721238520597263859224934763623122188113706307506918260109689069251417142514218153491532129077723748506635489170892850760234351768218355008829647410655814882049239533702270536705630750317499788187009989251020178015601042277836283644323729779929935160925884515772055232896978333126427671291093993103773425910592303277652667641874842441076564447767097790392324958416348527735171981064673837142742974468992320406932506062834468937543016787815320616009057693404906146176607094380110915443261929000745209895959201159412324102274845482605404361871836330268992858623582145643879695210235266673372434423091577183277565800211928270391042391966426911155333594569685782817020325495552528875464466074620294766116004435551604735044292127916358748473501590215522120388281168021413865865168464569964810015633741255098479730138656275460161279246359783661480163871602794405482710196290774543628092612567507181773641749763254436773503632580004042919906963117397787875081560227368824967077635559869284901628768699628053790181848148810833946900016380791075960745504688912686792812391148880036720729730801354431325347713094186717178607522981373539126772812593958220524289991371690685650421575056729991274177149279608831502358697816190894908487717722503860872618384947939757440664912760518878124233683125467278331513186758915668300679210215947336858591201395360301678110413444411030903388761520488296909104689167671555373346622545575975202624771242796225983278405833585897671474205724047439720232895903726148688388003174146490203843590358527993123871042845981608996101945691646983837718267264685264869172948414153004604004299585035164101899027529366867431834955447458124140190754681607770977920579383895378192128847409929537040546962226547278807248685508046571043123854873351653070570784584243335550958221912862797205455466267099131902370311779690892786623112661337671178512943059323281605826535623848164192144732543731002062738466812351691016359252588256806438946389880872735284406462208149513862275239938938734905082625472417781702582044129853760499827899020083498387362992498125742354568439023012261733665820546785671147973065077035475620567428300187473019197310881157516777005071432012726354601912460800451608108641835539669946936947322271670748972850464195392966434725254724357659192969949061670189061433616907056148280980363243454128229968275980226694045642181328624517549652147221620839824594576613342710564957193564431561774500828376935700995419541839029151033187933907614207467028867968594985439789457300768939890070073924697461812855764662265412913204052279071212820653775058280040897163467163709024906774736309136904002615646432159560910851092445162454420141442641660181385990017417408244245378610158433361777292580611159192008414091888191208858207627011483671760749046980914443057262211104583300789331698191603917150622792986282709446275915009683226345073725451366858172483498470080840163868209726371345205439802277866337293290829914010645589761697455978409211409167684020269370229231743334499986901841510888993165125090001163719114994852024821586396216294981753094623047604832399379391002142532996476235163569009445086058091202459904612118623318278614464727795523218635916551883057930657703331498510068357135624341881884405780028844018129031378653794869614630467726914552953690154167025838032477842272417994513653582260971652588356712133519546838335349801503269359798167463231847628306340588324731228951257944267639877946713121042763380872695738609314631539148548792514028885025189788076023838995615684850391995855029256054176767663145354058496296796781349420116003325874431438746248313850214980401681940795687219268462617287403480967931949965604299190281810597603263251746405016454606266765529010639868703668263299050577706266397868453584384057673298268163448646707439990917504018892319267557518354054956017732907127219134577524905771512773358423314008356080926962298894163047287780054743798498545562870729968407382937218623831766524716090967192007237658894226186550487552614557855898773008703234726418384831040394818743616224455286163287628541175946460497027724490799275146445792982549802258601001772437840167723166802004162547244179415547810554178036773553354467030326469619447560812831933095679685582771932031205941616693902049665352189672822671972640029493307384717544753761937017882976382487233361813499414541694736549254840633793674361541081593464960431603544354737728802361047743115330785159902977771499610274627769759612488879448609863349422852847651310277926279743981957617505591300993377368240510902583759345170015340522266144077237050890044496613295859536020556034009492820943862994618834790932894161098856594954213114335608810239423706087108026465913203560121875933791639666437282836752328391688865373751335794859860107569374889645657187292540448508624449947816273842517229343960137212406286783636675845331904743954740664015260871940915743955282773904303868772728262065663129387459875317749973799293043294371763801856280061141619563942414312254397099163565102848315765427037906837175764870230052388197498746636856292655058222887713221781440489538099681072143012394693530931524054081215705402274414521876541901428386744260011889041724570537470755550581632831687247110220353727166112304857340460879272501694701067831178927095527253222125224361673343366384756590949728221809418684074238351567868893421148203905824224324264643630201441787982022116248471657468291146315407563770222740135841109076078464780070182766336227978104546331131294044833570134869585165267459515187680033395522410548181767867772152798270250117195816577603549732923724732067853690257536233971216884390878879262188202305529937132397194333083536231248870386416194361506529551267334207198502259771408638122015980894363561808597010080081622557455039101321981979045520049618583777721048046635533806616517023595097133203631578945644487800945620369784973459902004606886572701865867757842758530645706617127194967371083950603267501532435909029491516973738110897934782297684100117657987098185725131372267749706609250481876835516003714638685918913011736805218743265426063700710595364425062760458252336880552521181566417553430681181548267844169315284408461087588214317641649835663127518728182948655658524206852221830755306118393326934164459415342651778653397980580828158806300749952897558204686612590853678738603318442905510689778698417735603118111677563872589911516803236547002987989628986181014596471307916144369564690909518788574398821730583884980809523077569358851616027719521488998358632323127308909861560777386006984035267826785387215920936255817889813416247486456433211043194821421299793188104636399541496539441501383868748384870224681829391860319598667962363489309283087840712400431022706137591368056518861313458307990705003607588327248867879324093380071864152853317943535073401891193638546730000660453783784472469288830546979000131248952100446949032058838294923613919284305249167833012980192255157050378521810552961623637523647962685751660066539364142273063001648652613891842243501797455993616794063303522111829071597538821839777552812981538570168702202620274678647916644030729018445497956399844836807851997088201407769199261674991148329821854382718946282165387064858588646221611410343570342878862979083418871606214430014533275029715104673156021000043869510583773779766003460887624861640938645252177935289947578496255243925598620521409052346250847830487046492688313289470553891357290706967599556298586669559721686506052072801342104355762779184021797626656484580261591407173477009039475168017709900129391137881248534255949312866653465033728846390649968460644741907524313323903404908195233044389559060547854954620263256676813262435925020249516275607080900436460421497025691488555265022810327762115842282433269528629137662675481993546118143913367579700141255870143319434764035725376914388899683088262844616425575034001428982557620386364384137906519612917777354183694676232982904981261717676191554292570438432239918482261744350470199171258214687683172646078959690569981353264435973965173473319484798758064137926885413552523275720457329477215706850016950046959758389373527538622664943456437071610511521617176237598050900553232154896062817794302268640579555845730600598376482703339859420098582351400179507104569019191359062304102336798080907240196312675268916362136351032648077232914950859151265812143823371072949148088472355286394195993455684156344577951727033374238129903260198160571971183950662758220321837136059718025940870615534713104482272716848395524105913605919812444978458110854511231668173534838253724825347636777581712867205865148285317273569069839935110763432091319780314031658897379628301178409806410175016511072932907832177487566289310650383806093372841399226733384778203302020700517188941706465146238366720632742644336612174011766914919235570905644803016342294301837655263108450172510307540942604409687066288066265900569082451407632599158164499361455172452057020443093722305550217222299706209749268609762787409626448772056043078634808885709143464793241536214303199965695610753570417207285334250171325558818113295504095217830139465216436594262960768570585698507157151317262928960072587601564840556088613165411835958628710665496282599535127193244635791046554389165150954187306071015034430609582302257455974944275067630926322529966338219395202927917973247094559691016402983683080426309910481567503623509654924302589575273521412445149542462972258510120707802110188106722347972579330653187713438466713807546383471635428854957610942841898601794658721444495198801550804042506452191484989920400007310672369944655246020908767882300064337725657385010969899058191290957079866699453765080407917852438222041070599278889267745752084287526377986730360561230710723922581504781379172731261234878334034473833573601973235946604273704635201327182592410906040097638585857716958419563109577748529579836844756803121874818202833941887076311731615289811756429711334181497218078040465077657204457082859417475114926179367379999220181789399433337731146911970737861041963986422166045588965683206701337505745038872111332436739840284188639147633491695114032583475841514170325690161784931455706904169858050217798497637014758914810543205854914100662201721719726878930012101267481270235940855162601689425111458499658315589660460091525797881670384625905383256920520425791378948827579603278877535466861441826827797651258953563761485994485049706638406266121957141911063246061774180577212381659872472432252969098533628440799030007594546281549235506086481557928961969617060715201589825299772803520002610888814176506636216905928021516429198484077446143617891415191517976537848282687018750030264867608433204658525470555882410254654806040437372771834769014720664234434374255514129178503032471263418076525187802925534774001104853996960549926508093910691337614841834884596365621526610332239417467064368340504749943339802285610313083038484571294767389856293937641914407036507544622061186499127249643799875806537850203753189972618014404667793050140301580709266213229273649718653952866567538572115133606114457222800851183757899219543063413692302293139751143702404830227357629039911794499248480915071002444078482866598579406525539141041497342780203520135419925977628178182825372022920108186449448349255421793982723279357095828748597126780783134286180750497175747373730296280477376908932558914598141724852658299510882230055223242218586191394795184220131553319634363922684259164168669438122537135960710031743651959027712571604588486044820674410935215327906816032054215967959066411120187618531256710150212239401285668608469435937408158536481912528004920724042172170913983123118054043277015835629513656274610248827706488865037765175678806872498861657094846665770674577000207144332525555736557083150320019082992096545498737419756608619533492312940263904930982014700371161829485939931199955070455381196711289367735249958182011774799788636393286405807810818657337668157893827656450642917396685579555053188715314552353070355994740186225988149854660737787698781542360397080977412361518245964026869979609564523828584235953564615185448165799966460648261396618720304839119560250381111550938420209894591555760083897989949964566262540514195610780090298667014635238532066032574466820259430618801773091109212741138269148784355679352572808875543164693077235363768226036080174040660997151176880434927489197133087822951123746632635635328517394189466510943745768270782209928468034684157443127739811044186762032954475468077511126663685479944460934809992951875666499902261686019672053749149951226823637895865245462813439289338365156536992413109638102559114643923805213907862893561660998836479175633176725856523591069520326895990054884753424160586689820067483163174286329119633399132709086065074595260357157323069712106423424081597068328707624437165532750228797802598690981111226558888151520837482450034463046505984569690276166958278982913613535306291331427881888249342136442417833519319786543940201465328083410341785272489879050919932369270996567133507711905899945951923990615156165480300145359212550696405345263823452155999210578191371030188979206408883974767667144727314254467923500524618849237455307575734902707342496298879996942094595961008702501329453325358045689285707241207965919809225550560061971283541270202072583994171175520920820151096509526685113897577150810849443508285458749912943857563115668324566827992991861539009255871716840495663991959154034218364537212023678608655364745175654879318925644085274489190918193411667583563439758886046349413111875241038425467937999203546910411935443113219136068129657568583611774564654674861061988591414805799318725367531243470335482637527081353105570818049642498584646147973467599315946514787025065271083508782350656532331797738656666181652390017664988485456054961300215776115255813396184027067814900350252876823607822107397102339146870159735868589015297010347780503292154014359595298683404657471756232196640515401477953167461726208727304820634652469109953327375561090578378455945469160223687689641425960164689647106348074109928546482353083540132332924864037318003195202317476206537726163717445360549726690601711176761047774971666890152163838974311714180622222345718567941507299526201086205084783127474791909996889937275229053674785020500038630036526218800670926674104806027341997756660029427941090400064654281074454007616429525362460261476180471744322889953285828397762184600967669267581270302806519535452053173536808954589902180783145775891280203970053633193821100095443241244197949192916205234421346395653840781209416214835001155883618421164283992454027590719621537570187067083731012246141362048926555668109467076386536083015847614512581588569610030337081197058344452874666198891534664244887911940711423940115986970795745946337170243268484864632018986352827092313047089215684758207753034387689978702323438584381125011714013265769320554911860153519551654627941175593967947958810333935413289702528893533748106257875620364294270257512121137330213811951395756419122685155962476203282038726342066227347868223036522019655729325905068134849292299647248229359787842720945578267329975853818536442370617353517653060396801087899490506654491544577952166038552398013798104340564182403396162494910454712104839439200945914647542424785991096900046541371091630096785951563947332190934511838669964622788855817353221326876634958059123761251203010983867841195725887799206041260049865895027247133146763722204388398558347770112599424691208308595666787531942465131444389971195968105937957532155524204659410081418351120174196853432672343271868099625045432475688702055341969199545300952644398446384346598830418262932239295612610045884644244285011551557765935780379565026806130721758672048541797157896401554276881090475899564605488362989140226580026134158039480357971019004151547655018391755772677897148793477372747525743898158705040701968215101218826088040084551332795162841280679678965570163917067779841529149397403158167896865448841319046368332179115059107813898261026271979696826411179918656038993895418928488851750122504754778999508544083983800725431468842988412616042682248823097788556495765424017114510393927980290997604904428832198976751320535115230545666467143795931915272680278210241540629795828828466355623580986725638200565215519951793551069127710538552661926903526081367717666435071213453983711357500975854405939558661737828297120544693182260401670308530911657973113259516101749193468250063285777004686987177255226525708428745733039859744230639751837209975339055095883623642814493247460522424051972825153787541962759327436278819283740253185668545040893929401040561666867664402868211607294830305236465560955351079987185041352121321534713770667681396211443891632403235741573773787908838267618458756361026435182951815392455211729022985278518025598478407179607904114472041476091765804302984501746867981277584971731733287305281134969591668387877072315968334322509070204019030503595891994666652037530271923764252552910347950343816357721698115464329245608951158732012675424975710520894362639501382962152214033621065422821876739580121286442788547491928976959315766891987305176388698461503354594898541849550251690616888419122873385522699976822609645007504500096116866129171093180282355042553653997166054753907348915189650027442328981181709248273610863801576007240601649547082331349361582435128299050405405333992577071321011503713898695076713447940748097845416328110406350804863393555238405735580863718763530261867971725608155328716436111474875107033512913923595452951407437943144900950809932872153235195999616750297532475931909938012968640379783553559071355708369947311923538531051736669154087312467233440702525006918026747725078958903448856673081487299464807786497709361969389290891718228134002845552513917355978456150353144603409441211512001738697261466786933733154341007587514908295822756919350542184106448264951943804240543255345965248373785310657979037977505031436474651422484768831323479762673689855474944277949916560108528257618964374464656819789319422077536824661110427671936481836360534108748971066866318805026555929568123959680449295166615409802610781691689418764353363449482900125929366840591370059526914934421861891742142561071896846626335874414976973921566392767687720145153302241853125308442727245771161505550519076276250016522166274796257424425420546785767478190959486500575711016264847833741198041625940813327229905891486422127968042984725356237202887830051788539737909455265135144073130049869453403245984236934627060242579432563660640597549471239092372458126154582526667304702319359866523378856244229188278436440434628094888288712101968642736370461639297485616780079779959696843367730352483047478240669928277140069031660709951473154191919911453182543906294573298686613524886500574780251977607442660798300291573030523199052185718628543687577860915726925232573171665625274275808460620177046433101212443409281314659760221360416223031167750085960128475289259463348312408766740128170543067985261868949895004918275008304998926472034986965363326210919830621495095877228260815566702155693484634079776879525038204442326697479264829899016938511552124688935873289878336267819361764023681714606495185508780596635354698788205094762016350757090024201498400967867845405354130050482404996646978558002628931826518708714613909521454987992300431779500489569529280112698632533646737179519363094399609176354568799002814515169743717518330632232942199132137614506411391269837128970829395360832883050256072727563548374205497856659895469089938558918441085605111510354367477810778500572718180809661542709143010161515013086522842238721618109043183163796046431523184434669799904865336375319295967726080853457652274714047941973192220960296582500937408249714373040087376988068797038047223488825819819025644086847749767508999164153502160223967816357097637814023962825054332801828798160046910336602415904504637333597488119998663995617171089911809851197616486499233594328274275983382931099806461605360243604040848379619072542165869409486682092396143083817303621520642297839982533698027039931804024928814430649614747600087654305571672697259114631990688823893005380061568007730984416061355843701277573463708822073792921409548717956947854414951731561828176343929570234710460088230637509877521391223419548471196982303169544468045517922669260631327498272520906329003279972932906827204647650366969765227673645419031639887433042226322021325368176044169612053532174352764937901877252263626883107879345194133825996368795020985033021472307603375442346871647223795507794130304865403488955400210765171630884759704098331306109510294140865574071074640401937347718815339902047036749084359309086354777210564861918603858715882024476138160390378532660185842568914109194464566162667753712365992832481865739251429498555141512136758288423285957759412684479036912662015308418041737698963759002546999454131659341985624780714434977201991702665380714107259910648709897259362243300706760476097690456341576573395549588448948093604077155688747288451838106069038026528318275560395905381507241627615047252487759578650784894547389096573312763852962664517004459626327934637721151028545472312880039058405918498833810711366073657536918428084655898982349219315205257478363855266205400703561310260405145079325925798227406012199249391735122145336707913500607486561657301854049217477162051678486507913573336334257685988361252720250944019430674728667983441293018131344299088234006652915385763779110955708000600143579956351811596764725075668367726052352939773016348235753572874236648294604770429166438403558846422370760111774821079625901180265548868995181239470625954254584491340203400196442965370643088660925268811549596291166168612036195319253262662271108142149856132646467211954801142455133946382385908540917878668826947602781853283155445565265933912487885639504644196022475186011405239187543742526581685003052301877096152411653980646785444273124462179491306502631062903402737260479940181929954454297256377507172705659271779285537195547433852182309492703218343678206382655341157162788603990157495208065443409462446634653253581574814022471260618973060860559065082163068709634119751925774318683671722139063093061019303182326666420628155129647685313861018672921889347039342072245556791239578260248978371473556820782675452142687314252252601795889759116238720807580527221031327444754083319215135934526961397220564699247718289310588394769170851420631557192703636345039529604362885088555160008371973526383838996789184600327073682083234847108471706160879195227388252347506380811606090840124222431476103563328940609282430125462013806032608121942876847907192546246309055749298781661271916548229644317263587524548607563020667656942355342774617635549231817456159185668061686428714964129290560130053913469569829490891003991259088290348791943368696942620662946948514931472688923571615032405542263391673583102728579723061998175868700492227418629077079508809336215346303842967525604369606110193842723883107587771653594778681499030978765900869583480043137176832954871752604714113064847270887246697164585218774442100900090916189819413456305028950484575822161887397443918833085509908566008543102796375247476265353031558684515120283396640547496946343986288291957510384781539068343717740714095628337554413567955424664601335663617305811711646062717854078898495334329100315985673932305693426085376230981047171826940937686754301837015557540822371538037838383342702379535934403549452173960327095407712107332936507766465603712364707109272580867897181182493799540477008369348889220963814281561595610931815183701135104790176383595168144627670903450457460997444500166918675661035889313483800512736411157304599205955471122443903196476642761038164285918037488354360663299436899730090925177601162043761411616688128178292382311221745850238080733727204908880095181889576314103157447684338100457385008523652069340710078955916549813037292944462306371284357984809871964143085146878525033128989319500645722582281175483887671061073178169281242483613796475692482076321356427357261609825142445262515952514875273805633150964052552659776922077806644338105562443538136258941809788015677378951310313157361136026047890761945591820289365770116416881703644242694283057457471567494391573593353763114830246668754727566653059819746822346578699972291792416156043557665183382167059157867799311835820189855730344883681934418305987021880502259192818047775223884407167894780414701414651073580452021499197980812095692195622632313741870979731320870864552236740416185590793816745658234353037283309503729022429802768451559528656923189798000383061378732434546500582722712325031420712488100290697226311129067629080951145758060270806092801504406139446350643069742785469477459876821004441453438033759717384777232052065301037861326418823586036569054773343070911759152582503029410738914441818378779490613137536794654893375260322906277631983337976816641721083140551864133302224787118511817036598365960493964571491686005656771360533192423185262166760222073368844844409234470948568027905894191829969467724456269443308241243846160408284006424867072583661011433404214473683453638496544701067827313169538435919120440283949541956874453676459875488726170687163109591315801609722382049772577307454562979127906177531663252857205858766376754282917933549923678212008601904369428956102301731743150352204665675088491593025926618816581008701658499456495586855628208747248318351516339189292646558880593601275151838235485893426165223086697314511412035659916934103076974774451947043836739600076578628245472064617380804602903639144493859012422380173377038154675297645596518492676039300171943042511794045679862114630138402371099347243455794730048929825402680821621522346560274258486595687074510352794291633405915025075992398611224340312056999780516223878772230396359709132856830486160362127579561601328561866388146004722200580017580282279272167842720649966956840905752590774886105493806116954293569077377792821084159737469613143291808510446953973485067590503662391722108732333169909603363771705474725026941732982890400239372879549386540463828596742216318201530139629734398479588628632934746650690284066719018081265539973675916799759010867483920062877888531102781695087545740384607594616919584610655963327283485609570305572502494416337066573150237126843581984154103154401008430380631442183776750349813408169325201240813452285974626715177152223063741359255747513535160669108359443999692315898156732033027129284241219651936303734407981204656795322986357374589031654007016472204989445629050395873788912680565516464274460174738175296313458739390484560414203426465560422112239134631023161290836446988901247285192778589195228773637440432659264672239982186452797664826673070168802722052338600372842903155828454593854349099449420750911108532138744823216151007808922516285123275724355101999038195993350032641446053470357293073912578481757987468353429629749652545426864234949270336399427519354240001973125098882419600095766257217621860474573769577649582201796258392376391717855799468922496750179251915218219624653575570564228220399546682648329822996167217080156801080799777126517156274295763666959661983507435667132218383358509536665806605597148376773866922551603463644386269977295750658468929599809168949981898588529537874489519527097766262684177088590284321676352132630838812766335363319004134332844347630067982023716933653652880580156390360562722752187272454764258840995216482554453662083811789117725225682611478014242896970967121967502094421226279437073328703410646312100557376727450271638975234111426287828736758358819056742163061523416789476056879277154789714326222041069587947186435439940738639948986836168919377836648327137363654676901173760246643082285362494712605173293777247276797635865806019396287718060679122426813922872134061694882029506831654589707623668302556167559477498715183426989208952182644710514911419441192277010977616645850068963849426165593473112961064282379048216056210094265076173838082479030510998790719611852832556787472942907151041468948104916751035295897242381802288151276582257190705537652455285511598636421244284176256230139538669970308943645907600684938040875210854159851278070333207779865635907968462191534944587677170063778573171211036517486371634098385626541555573292664616402279791195975248525300376741774056125700303625811704838385391207273191845064713669122576415213769896260940351804147432053600369234179035440735703058314741623452840188940808983125191307741823338981880316339159565954543405777784331681162551898060409183018907512170192983622897099598983405484962284289398469847938668614293324543983592637036699355184231661615244505980576745765335552338715678211466689996845227042954589710922163652573965950289645637766038988037941517917867910675199009966139206238732318786758420544279396366759104126821843375015743069045967947046685602358283919759975285865384338189120042853787549302768972168199113340697282255535300044743958830079799736518459131437946494086272149669719100359399974735262764126125995350902609540048669398955899487421379590802893196914845826873123710180229775301190684280440780938156598081694611679374425663244656799606363751546304833112722231812338371779800439731087402647536582575657351059978314264831879619843765495877803685261751835391844920488198629786329743136948511780579298636452193232481339393090754566368038513630619718033957979522539508697432546502659123585049283028832934489284591373621624852528877442891851104093746333590660233239711922814450735588373324057814862662207486215513375036775585494138678352928273109003823116855374520901095101174796663003330352534143230024288248051396631446632656081582045216883922312025671065388459503224002320453633895521539919011035217362720909565500846486605368975498478995875596103167696587161281951919668893326641203784750417081752273735270989343717167642329956935697166213782736138899530515711822960896394055380431939398453970864418654291655853168697537052760701061488025700785387150835779480952313152747735711713643356413242974208137266896149109564214803567792270566625834289773407718710649866150447478726164249976671481383053947984958938064202886667951943482750168192023591633247099185942520392818083953020434979919361853380201407072481627304313418985942503858404365993281651941497377286729589582881907490040331593436076189609669494800067194371424058105327517721952474344983414191979918179909864631583246021516575531754156198940698289315745851842783390581029411600498699307751428513021286202539508732388779357409781288187000829944831476678183644656510024467827445695591845768068704978044824105799710771577579093525803824227377612436908709875189149049904225568041463131309240101049368241449253427992201346380538342369643767428862595140146178201810734100565466708236854312816339049676558789901487477972479202502227218169405159042170892104287552188658308608452708423928652597536146290037780167001654671681605343292907573031466562485809639550080023347676187068086526878722783177420214068980703410506200235273632267291964034093571225623659496432076928058165514428643204955256838543079254299909353199329432966018220787933122323225928276556048763399988478426451731890365879756498207607478270258861409976050788036706732268192473513646356758611212953074644777149423343867876705824452296605797007134458987594126654609414211447540007211790607458330686866231309155780005966522736183536340439991445294960728379007338249976020630448806064574892740547730693971337007962746135534442514745423654662752252624869916077111131569725392943756732215758704952417232428206555322808868670153681482911738542735797154157943689491063759749151524510096986573825654899585216747260540468342338610760823605782941948009334370046866568258579827323875158302566720152604684361412652956519894291184887986819088277339147282063794512260294515707367105637720023427811802621502691790400488001808901847311751199425460594416773315777951735444490965752131026306836047140331442314298077895617051256930051804287472368435536402764392777908638966566390166776625678575354239947427919442544664643315554138265543388487778859972063679660692327601733858843763144148113561693030468420017434061395220072403658812798249143261731617813894970955038369479594617979829257740992171922783223006387384996138434398468502234780438733784470928703890536420557474836284616809363650973790900204118525835525201575239280826462555785658190226958376345342663420946214426672453987171047721482128157607275305173330963455909323664528978019175132987747952929099598069790148515839540444283988381797511245355548426126784217797728268989735007954505834273726937288386902125284843370917479603207479554080911491866208687184899550445210616155437083299502854903659617362726552868081324793106686855857401668022408227992433394360936223390321499357262507480617409173636062365464458476384647869520547719533384203403990244761056010612777546471464177412625548519830144627405538601855708359981544891286863480720710061787059669365218674805943569985859699554089329219507269337550235821561424994538234781138316591662683103065194730233419384164076823699357668723462219641322516076261161976034708844046473083172682611277723613381938490606534404043904909864126903479263503943531836741051762565704797064478004684323069430241749029731181951132935746854550484711078742905499870600373983113761544808189067620753424526993443755719446665453524088287267537759197074526286322840219629557247932987132852479994638938924943286917770190128914220188747760484939855471168524810559991574441551507431214406120333762869533792439547155394213121021954430556748370425907553004950664994802614794524739012802842646689229455664958621308118913500279654910344806150170407268010067948926855360944990373928383520627992820181576427054962997401900837493444950600754365525758905546552402103412862124809003162941975876195941956592556732874237856112669741771367104424821916671499611728903944393665340294226514575682907490402153401026923964977275904729573320027982816062130523130658731513076913832317193626664465502290735017347656293033318520949298475227462534564256702254695786484819977513326393221579478212493307051107367474918016345667888810782101151826314878755138027101379868751299375133303843885631415175908928986956197561123025310875057188962535763225834275763348421016668109884514141469311719314272028007223449941999003964948245457520704922091620614222912795322688239046498239081592961111003756999529251250673688233852648213896986384052437049402152187547825163347082430303521036927849762517317825860862215614519165573478940019558704784741658847364803865995119651409542615026615147651220820245816010801218275982577477652393859159165067449846149161165153821266726927461290533753163055654440793427876550267301214578324885948736899073512166118397877342715872870912311383472485146035661382188014840560716074652441118841800734067898587159273982452147328317214621907330492060817440914125388918087968538960627860118193099489240811702350413554126823863744341209267781729790694714759018264824761112414556423937732224538665992861551475342773370683344173073150805440138894084087253197595538897613986400165639906934600670780501058567196636796167140097031535132386972899001749862948883362389858632127176571330142071330179992326381982094042993377790345261665892577931395405145369730429462079488033141099249907113241694504241391265397274078984953073730364134893688060340009640631540701820289244667315059736321311926231179142794944897281477264038321021720718017561601025111179022163703476297572233435788863537030535008357679180120653016668316780269873860755423748298548246360981608957670421903145684942967286646362305101773132268579232832164818921732941553151386988781837232271364011755881332524294135348699384658137175857614330952147617551708342432434174779579226338663454959438736807839569911987059388085500837507984051126658973018149321061950769007587519836861526164087252594820126991923916722273718430385263107266000047367872474915828601694439920041571102706081507270147619679971490141639274282889578424398001497985658130305740620028554097382687819891158955487586486645709231721825870342960508203415938806006561845735081804032347750084214100574577342802985404049555529215986404933246481040773076611691605586804857302606467764258503301836174306413323887707999698641372275526317649662882467901094531117120243890323410259937511584651917675138077575448307953064925086002835629697045016137935696266759775923436166369375035368699454550392874449940328328128905560530091416446608691247256021455381248285307613556149618444364923014290938289373215312818797541139219415606631622784836152140668972661027123715779503062132916001988806369127647416567067485490795342762338253943990022498972883660263920518704790601584084302914787302246651371144395418253441269003331181914268070735159284180415100555199146564934872796969351992963117195821262627236458009708099166752820365818699111948365866102758375863322993225541477479210421324166848264953111826527351008031659958888814809945737293785681411438021523876706455063233067233939551964260397443829874822322662036352861302543796600943104500158604854027036789711934695579989189112302233381602302236277726084846296189550730850698061500281436425336666311433321645213882557346329366870956708432252564333895997812402164189946978348320376011613913855499933990786652305860332060641949298931012423081105800169745975038516887112037747631577311831360002742502722451570906304496369230938382329175076469684003556425503797106891999812319602533733677437970687713814747552190142928586781724044248049323750330957002929126630316970587409214456472022710796484778657310660832173093768033821742156446602190335203981531618935787083561603302255162155107179460621892674335641960083663483835896703409115513087820138723494714321400450513941428998350576038799343355677628023346565854351219361896876831439866735726040869511136649881229957801618882834124004126142251475184552502502640896823664946401177803776799157180146386554733265278569418005501363433953502870836220605121839418516239153709790768084909674194289061134979961034672077354959593868862427986411437928435620575955500144308051267664432183688321434583708549082240014585748228606859593502657405750939203135881722442164955416889785558265198046245527898343289578416968890756237467281044803018524217706136533236073856228166664597654076844715963930782091017090763377917711485205493367936868430832404126789220929930411890501756484917499452393770674524578019171841679541825554377930299249277892416277257788147974770446005423669346157135208417428211847353652367573702352791459837645712257646122605628127852169580892808988394594406165340521932514843306105322700231133680378433377389724881307874325614952744243584753011150345103737688223837573804282007358586938044331529253129961025096113761670187568525921208929131354473196308440066835155160913925692912175784379179004808848023029304392630921342768601226558630456913133560978156776098711809238440656353136182676923761613389237802972720736243967239854144480757286813436768000573823963610796223140429490728058551444771338682314499547929338131259971996894072233847404542592316639781608209399269744676323921370773991899853301483814622364299493902073285072098040905300059160091641710175605409814301906444379905831277826625762288108104414704097708248077905168225857235732665234414956169007985520848841886027352780861218049418060017941147110410688703738674378147161236141950474056521041002268987858525470689031657094677131822113205505046579701869337769278257145248837213394613987859786320048011792814546859096532616616068403160077901584946840224344163938313618742275417712170336151163782359059685168880561304838542087505126933144171705880517278127917564053282929427357971823360842784676292324980318169828654166132873909074116734612367109059236155113860447246378721244612580406931724769152219217409096880209008801535633471775664392125733993165330324425899852598966724744126503608416484160724482125980550754851232313331300621490042708542735985913041306918279258584509440150719217604794274047740253314305451367710311947544521321732225875550489799267468541529538871443696399406391099267018219539890685186755868574434469213792094590683677929528246795437302263472495359466300235998990248299853826140395410812427393530207575128774273992824866921285637240069184859771126480352376025469714309316636539718514623865421671429236191647402172547787238964043145364190541101514371773797752463632741619269990461595895793940622986041489302535678633503526382069821487003578061101552210224486633247184367035502326672749787730470216165019711937442505629639916559369593557640005236360445141148916155147776301876302136068825296274460238077523189646894043033182148655637014692476427395401909403584437251915352134557610698046469739424511797999048754951422010043090235713636892619493763602673645872492900162675597083797995647487354531686531900176427222751039446099641439322672532108666047912598938351926694497553568096931962642014042788365702610390456105151611792018698900673027082384103280213487456720062839744828713298223957579105420819286308176631987048287388639069922461848323992902685392499812367091421613488781501234093387999776097433615750910992585468475923085725368613605356762146929424264323906626708602846163376051573599050869800314239735368928435294958099434465414316189806451480849292695749412903363373410480943579407321266012450796613789442208485840536446021616517885568969302685188950832476793300404851688934411125834396590422211152736276278672366665845757559585409486248261694480201791748223085835007862255216359325125768382924978090431102048708975715033330963651576804501966025215527080352103848176167004443740572131294252820989545456276344353575741673638980108310579931697917916718271145837435222026387771805250290791645414791173616253155840768495583288190293564201219633684854080865928095131505012602919562576032932512847250469881908146475324342363863860247943921015193235101390117789997483527186469346024554247028375300033725403910085997650987642832802908445662021678362267272292737780213652404028817217012490974899454430826861772239385250883760749742195942655217301733355851389407457348144161511380845358039740277795072051893487170722955427683655826706766313911972211811528466502223383490906676554168336907959409404576472940901354356409277969379842065738891481990225399022315913388145851487225126560927576795873759207013915029216513720851137197522734365458411622066281660256333632074449918511469174455062297146086578736313585389023662557285424516018080487167823688885575325066254262367702604215835160174851981885460860036597606743233346410471991027562358645341748631726556391320606407754779439671383653877377610828300019937359760370467245737880967939894493795829602910746901609451288456550071458091887879542641820145369659962842686882363495879277007025298960996798975941955735253914237782443302746708282008722602053415292735847582937522487377937899136764642153727843553986244015856488692101644781661602962113570056638347990334049623875941092886778920270077504951511405782565295015024484968204744379710872943108541684540513016310902267112951959140520827546866418137305837933236150599142045255880213558474751516267815309465541240524091663857551298894834797423322854504140527354235070335984964593699534959698554244978249586929179182415068053002553370412778703476446244329205906832901886692400222391918714603175399666877477960121790688623311002908668305431787009355066944389131913333586368037447530664502418437136030852288582121720231274167009740351431532131803978033680228154223490183737494117973254478594157962104378787072154814091725163615415163381388912588517924237727229603497305533840942889918919161186249580560073570527227874940321250645426206304469470804277945973817146810395192821550688079136701210109944220737024613687196031491162370967939354636396448139025711768057799751751298979667073292674886430097398814873780767363792886767781170520534367705731566895899181530825761606591843760505051704242093231358724816618683821026679970982966436224723644898648976857100173643547336955619347638598187756855912376232580849341570570863450733443976604780386678461711520325115528237161469200634713570383377229877321365028868868859434051205798386937002783312365427450532283462669786446920780944052138528653384627970748017872477988461146015077617116261800781557915472305214759943058006652042710117125674185860274188801377931279938153727692612114066810156521441903567333926116697140453812010040811760123270513163743154487571768761575554916236601762880220601068655524141619314312671535587154866747899398685510873576261006923021359580838145290642217792987748784161516349497309700794368305080955621264592795333690631936594413261117944256602433064619312002953123619348034504503004315096798588111896950537335671086336886944665564112662287921812114121425167348136472449021275252555647623248505638391391630760976364990288930588053406631352470996993362568102360392264043588787550723319888417590521211390376609272658409023873553418516426444865247805763826160023858280693148922231457758783791564902227590699346481624734399733206013058796068136378152964615963260698744961105368384203105364183675373594176373955988088591188920114871545460924735613515979992999722298041707112256996310945945097765566409972722824015293663094891067963296735505830412258608050740410916678539569261234499102819759563955711753011823480304181029089719655278245770283085321733741593938595853203645590564229716679900322284081259569032886928291260139267587858284765599075828016611120063145411315144108875767081854894287737618991537664505164279985451077400771946398046265077776614053524831090497899859510873112620613018757108643735744708366215377470972660188656210681516328000908086198554303597948479869789466434027029290899143432223920333487108261968698934611177160561910681226015874410833093070377506876977485840324132474643763087889666151972556180371472590029550718424245405129246729039791532535999005557334600111693557020225722442772950263840538309433999383388018839553821540371447394465152512354603526742382254148328248990134023054550811390236768038649723899924257800315803725555410178461863478690646045865826036072306952576113184134225274786464852363324759102670562466350802553058142201552282050989197818420425028259521880098846231828512448393059455162005455907776121981297954040150653985341579053629101777939776957892084510979265382905626736402636703151957650493344879513766262192237185642999150828898080904189181015450813145034385734032579549707819385285699926238835221520814478940626889936085239827537174490903769904145555260249190126341431327373827075950390882531223536876389814182564965563294518709637484074360669912550026080424160562533591856230955376566866124027875883101021495284600804805028045254063691285010599912421270508133194975917146762267305044225075915290251742774636494555052325186322411388406191257012917881384181566918237215400893603475101448554254698937834239606460813666829750019379115061709452680984785152862123171377897417492087541064556959508967969794980679770961683057941674310519254486327358885118436597143583348756027405400165571178309126113117314169066606067613797690123141099672013123730329707678988740099317309687380126740538923612230370779727025191340850390101739924877352408881040807749924412635346413181858792480760553268122881584307471326768283097203149049868884456187976015468233715478415429742230166504759393312132256510189175368566338139736836336126010908419590215582111816677413843969205870515074254852744810154541079359513596653630049188769523677579147319184225806802539818418929888943038224766186405856591859943091324575886587044653095332668532261321209825839180538360814144791320319699276037194760191286674308615217243049852806380129834255379486287824758850820609389214668693729881191560115633701248675404205911464930888219050248857645752083363921499441937170268576222251074166230901665867067714568862793343153513505688216165112807318529333124070912343832502302341169501745502360505475824093175657701604884577017762183184615567978427541088499501610912720817913532406784267161792013428902861583277304794830971705537485109380418091491750245433432217445924133037928381694330975012918544596923388733288616144238100112755828623259628572648121538348900698511503485369544461542161283241700533583180520082915722904696365553178152398468725451306350506984981006205514844020769539324155096762680887603572463913955278222246439122592651921288446961107463586148252820017348957533954255019475442643148903233373926763409115527189768429887783617346613535388507656327107814312435018965109238453660236940276060642119384227665755210663671879603217527184404651560427289869560206997012906367847161654793068868305846508082886614111979138822898112498261434559408961813509226857611474609406147937240008842153535862052780125014270055274468359151840373309373580494342483940467505708347927948338133276237937844629209323999417593374917899786484958148818865149169302451512835579818112344900827168644548306546633975256079615935830821400021951611342337058359111545217293721664061708131602078213341260356852013161345136871600980378712556766143923146458085652084039744217352744813741215277475202259244561520365608268890193913957991844109971588312780020898275935898106482117936157951837937026741451400902833064466209280549839169261068975151083963132117128513257434964510681479694782619701483204392206140109523453209269311762298139422044308117317394338867965739135764377642819353621467837436136161591167926578700137748127848510041447845416464568496606699139509524527949914769441031612575776863713634644477006787131066832417871556281779122339077841275184193161188155887229676749605752053192594847679397486414128879475647133049543555044790277128690095643357913405127375570391806822344718167939329121448449553897728696601037841520390662890781218240141299368590465146519209198605347788576842696538459445700169758422531241268031418456268722581132040056433413524302102739213788415250475704533878002467378571470021087314693254557923134757243640544448132093266582986850659125571745568328831440322798049274104403921761438405750750288608423536966715191668510428001748971774811216784160854454400190449242294333666338347684438072624307319019363571067447363413698467328522605570126450123348367412135721830146848071241856625742852208909104583727386227300781566668914250733456373259567253354316171586533339843321723688126003809020585719930855573100508771533737446465211874481748868710652311198691114058503492239156755462142467550498676710264926176510110766876596258810039163948397811986615585196216487695936398904500383258041054420595482859955239065758108017936807080830518996468540836412752905182813744878769639548306385089756146421874889271294890398025623046812175145502330254086076115859321603465240763923593699949180470780496764486889980902123735780457040380820770357387588525976042434608851075199334470112741787878845674656640471901619633546770714090590826954225196409446319547658653032104723804625249971910690110456227579220926904132753699634145768795242244563973018311291451151322757841320376225862458224784696669785947914981610522628786944136373683125108310682898766123782697506343047263278453719024447970975017396831214493357290791648779915089163278018852504558488782722376705263811803792477835540018117452957747339714012352011459901984753358434861297092928529424139865507522507808919352104173963493428604871342370429572757862549365917805401652536330410692033704691093097588782938291296447890613200063096560747882082122140978472301680600835812336957051454650181292694364578357815608503303392466039553797630836137289498678842851139853615593352782103740733076818433040893624460576706096188294529171362940967592507631348636606011346115980434147450705511490716640635688739020690279453438236930531133440901381392849163507484449076828386687476663619303412376248380175840467851210698290605196112357188811150723607303158506622574566366740720668999061320627793994112805759798332878792144188725498543014546662945079670707688135022230580562225942983096887732856788971494623888272184647618153045844390967248232348259587963698908456664795754200195991919240707615823002328977439748112690476546256873684352229063217889227643289360535947903046811114130586348244566489159211382258867880972564351646404364328416076247766114349880319792230537889671148058968061594279189647401954989466232962162567264739015818692956765601444248501821713300527995551312539849919933907083138030214072556753022600033565715934283182650908979350869698950542635843046765145668997627989606295925119763672907762567862769469947280606094290314917493590511523235698715397127866718077578671910380368991445381484562682604003456798248689847811138328054940490519768008320299631757043011485087384048591850157264392187414592464617404735275250506783992273121600117160338604710710015235631159734711153198198710616109850375758965576728904060387168114313084172893710817412764581206119054145955378853200366615264923610030157044627231777788649806700723598889528747481372190175074700005571108178930354895017924552067329003818814068686247959272205591627902292600592107710510448103392878991286820705448979977319695574374529708195463942431669050083984398993036790655541596099324867822475424361758944371791403787168166189093900243862038610001362193667280872414291108080291896093127526202667881902085595708111853836166128848729527875143202956393295910508349687029060692838441522579419764824996318479414814660898281725690484184326061946254276693688953540732363428302189694947766126078346328490315128061501009539164530614554234923393806214007779256337619373052025699319099789404390847443596972052065999017828537676265683558625452697455260991024576619614037537859594506363227095122489241931813728141668427013096050734578659047904243852086508154491350136491698639048125666610843702294730266721499164849610746803261583352580352858275799038584091667618877199539888680431991650866887781701439663176815592262016991396613153738021294160006906947533431677802632207226265881842757216055461439677336258462997385077307751473833315101468395296411397329672457933540390136107395245686243008096720460995545708974893048753897955544443791303790422346037768729236001386569593952300768091377768847789746299699489949016141866131552200856673695770822720338936659590666350594330040363762591189195691561626122704788696510356062748423100605472091437069471661080277379848576543481249822444235828329813543645124092220896643987201997945619030397327254617823136363375927622656301565813545578319730419339269008282952718252138855126583037630477490625995514925943105307478901043009876580816508144862607975129633326675259272351611791836777128931053144471668835182920514343609292493191180249366051791485330421043899773019267686085347768149502299280938065840007311767895491286098112311307002535600347898600653805084532572431553654422067661352337408211307834360326940015926958459588297845649462271300855594293344520727007718206398887404742186697709349647758173683580193168322111365547392288184271373843690526638607662451284299368435082612881367358536293873792369928837047900484722240370919885912556341130849457067599032002751632513926694249485692320904596897775676762684224768120033279577059394613185252356456291805905295974791266162882381429824622654141067246487216174351317397697122228010100668178786776119825961537643641828573481088089988571570279722274734750248439022607880448075724807701621064670166965100202654371260046641935546165838945950143502160890185703558173661823437491622669077311800121188299737319891006060966841193266075165452741829459541189277264192546108246351931647783837078295218389645376236304858042774417907169146356546201215125418664885396161542055152375000426794253417764590821513675258479774465114750438460596325820468809667795709044645884673847481638045635188183210386594798204376334738389017759714236223057776395541011294523488098341476645559342209402059733452337956309441446698222457026367119493286653989491344225517746402732596722993581333110831711807234044326813737231209669052411856734897392234152750707954137453460386506786693396236535556479102508529284294227710593056660625152290924148057080971159783458351173168204129645967070633303569271821496292272073250126955216172649821895790908865085382490848904421755530946832055636316431893917626269931034289485184392539670922412565933079102365485294162132200251193795272480340133135247014182195618419055761030190199521647459734401211601239235679307823190770288415814605647291481745105388060109787505925537152356112290181284710137917215124667428500061818271276125025241876177485994084521492727902567005925854431027704636911098800554312457229683836980470864041706010966962231877065395275783874454229129966623016408054769705821417128636329650130416501278156397799631957412627634011130135082721772287129164002237230234809031485343677016544959380750634285293053131127965945266651960426350406454862543383772209428482543536823186182982713182489884498260285705690699045790998144649193654563259496570044689011049923939218088155626191834404362264965506449848521612498442375928443642612004256628602157801140467879662339228190804577624109076487087406157070486658398144845855803277997327929143195789110373530019873110486895656281917362036703039179710646309906285483702836118486672219457621775034511770110458001291255925462680537427727378863726783016568351092332280649908459179620305691566806180826586923920561895421631986004793961133953226395999749526798801074576466538377400437463695133685671362553184054638475191646737948743270916620098057717103475575333102702706317395612448413745782734376330101853438497450236265733191742446567787499665000938706441886733491099877926005340862442833450486907338279348425305698737469497333364267191968992849534561045719338665222471536681145666596959735075972188416698767321649331898967182978657974612216573922404856900225324160367805329990925438960169901664189038843548375648056012628830409421321300206164540821986138099462721214327234457806819925823202851398237118926541234460723597174777907172041523181575194793527456442984630888846385381068621715274531612303165705848974316209831401326306699896632888532682145204083110738032052784669279984003137878996525635126885368435559620598057278951754498694219326972133205286374577983487319388899574634252048213337552584571056619586932031563299451502519194559691231437579991138301656117185508816658756751184338145761060365142858427872190232598107834593970738225147111878311540875777560020664124562293239116606733386480367086953749244898068000217666674827426925968686433731916548717750106343608307376281613984107392410037196754833838054369880310983922140260514297591221159148505938770679068701351029862207502287721123345624421024715163941251258954337788492834236361124473822814504596821452253550035968325337489186278678359443979041598043992124889848660795045011701169092519383155609441705397900600291315024253848282782826223304151370929502192196508374714697845805550615914539506437316401173317807741497557116733034632008408954066541694665746735785483133770133628948904397670025863002540635264006601631712883920305576358989492412827022489373848906764385339931878608019223108328847459816417701264089078551777830131616162049792779670521847212730327970738223860581986744668610994383049960437407323195784473254857416239738852016202384784256163512597161783106850156299135559874758848151014815490937380933394074455700842090155903853444962128368313687375166780513082594599771257467939781491953642874321122421579851584491669362551569370916855252644720786527971466476760328471332985501945689772758983450586004316822658631176606237201721007922216410188299330808409384014213759697185976897042759041500946595252763487628135867117352364964121058854934496645898651826545634382851159137631569519895230262881794959971545221250667461174394884433312659432286710965281109501693028351496524082850120190831078678067061851145740970787563117610746428835593915985421673115153096948758378955979586132649569817205284291038172721213138681565524428109871168862743968021885581515367531218374119972919471325465199144188500672036481975944167950887487934416759598361960010994838744709079104099785974656112459851972157558134628546189728615020774374529539536929655449012953097288963767713353842429715394179547179095580120134210175150931491664699052366350233024087218654727629639065723341455005903913890253699317155917179823065162679744711857951506573868504088229934804445549850597823297898617029498418376255258757455303112991914341109413088238114443068843062655305601658801408561023324210300218460588586954418502977463085858496130037238190325162225570729975710727306066072916922978033647048840958711228045188511908718588299514331534128549297173849768523136276076868494780364948299904475715771141080958058141208956059471668626290036145602625334863284986816039463372436667112964460292915746181117789169695839947080954788863503281129626899231110099889317815313946681882028368363373822281414974006917942192888817139116283910295684918233358930813360131488748366464224381776081007739183393749346933644748150564933649323157235306109385796839902153381449126925350768211098738352197507736653475499431740580563099143218212547336281359488317681489194306530426029773885492974570569448783077945878865062970895499843760181694031056909587141386804846359853684034105948341788438963179956468815791937174656705047441528027712541569401365862097760735632832966564135817028088013546326104892768731829917950379944446328158595181380144716817284996793061814177131912099236282922612543236071226270324572637946863533391758737446552006008819975294017572421299723542069630427857950608911113416534893431149175314953530067419744979017235181671568754163484949491289001739377451431928382431183263265079530371177806185851153508809998200482761808307209649636476943066172549186143700971387567940218696710148540307471561091358933165600167252126542502898612259306484105898847129649230941215144563947889999327145875969555737090855150648002321476443037232466147111552578583071024936898814562568786834745518893385181791667579054210421036349316257870476543126790661216644142285017446278477132740595579600648343288827864837043456066966456899746910373987712891593313271266247505582258634928427718355831641593667712218537642376222104779338956378722902509543014182257180331300148113377736941508488867501893156994849838936052666818012783912005801431596441910546663236810148207799356523056490420711364192200177189107935243234322761787712568251126481332974354926568682748715986654943041648468220593921673359485057849622807932422649812705271398407720995707236227009245067665680069149966555737866411877079767754867028786431817941521796178310655030287157272282250812017060713380339641841211253856248920130010782462165136989511064611133562443838185366273563783436921279354709230119655914915800561707258518503167289370411936374780625824298250726464801821523430268081486978164824349353456855843696378384153838051184406043696871666416514036129729992912630842812149152469877429332305214999981829046119471676727503742221367186614654042534463141660649871499001000660041544868437352208483059495953182872280520828676300361091734508632133033647289584176588755345227938480297724485711815574893561311524926772006362198369980664159549388683836411891430443767715498026544959061738265591178545999378510861446014967645550103653971251138583505085112442517772923814396233043724036032603181442991365750246012787514117944901305803452199992701148071712847770301254994886841867572975189214295652512486943983729047410363121899124217339550688778643130750024823361832738729697376598820053895902935486054979802320400472236873557411858132734337978931582039412878989728973298812553514507641535360519462112217000676321611195841029252568536561813138784086477147099724553013170761712163186600291464501378587854802096244703771373587720086738054108140042311418525803293267396324596914044834665722042880679280616029884043400536534009706581694636096660911110968789751801325224478246957913251892122653056085866541115373584912790254654369020869419871125588453729063224423222287139122012248769976837147645598526739225904997885514250047585260297929306159913444898341973583316070107516452301310796620382579278533125161760789984630103493496981494261055367836366022561213767081421091373531780682420175737470287189310207606953355721704357535177461573524838432101571399813798596607129664438314791296359275429627129436142685922138993054980645399144588692472767598544271527788443836760149912897358259961869729756588978741082189422337344547375227693199222635973520722998387368484349176841191020246627479579564349615012657433845758638834735832242535328142047826934473129971189346354502994681747128179298167439644524956655532311649920677163664580318205849626132234652606175413532444702007661807418914040158148560001030119994109595492321434406067634769713089513389171050503856336503545166431774489640061738861761193622676890576955693918707703942304940038440622614449572516631017080642923345170422426679607075404028551182398361531383751432493056398381877995594942545196756559181968690885283434886050828529642437578712929439366177362830136595872723080969468398938676366226456791132977469812675226595621009318322081754694778878755356188335083870248295346078597023609865656376722755704495258739871812593441903785275571333409842450127258596692434317689018966145404453679047136294238156127656824247864736176671770647002431119711090007474065945650315375044177982192306323700872039212085499569681061379189029961178936752146022386905665481382858280449537530160921422195940638787074787991194920898374091788534417523064715030278397979864517336625329511775105559014160459873338186887977858817291976604516353353556047648420520888811722831990044504284486852338334530105533929637308039738230604714104525470094899407601215247602819963846343554852932377161410869591950786873276075400085220065031871239272857835807010762542769655355964789450166013816295177908531139811092831583216931563867459747449584385282701658246192092219529134323496779345585613140207765996142546463288677356891785576835169608392864188830094883324700447958316931533832382377876344426323456301679513671047510469669001217777128065522453689371871451567394733440447280450959433090683667110655953338602938000999949010642769859623260401863733572846679531229683156358145420890540651226419162015504500430562136991850941034609601030543816694795964585804425194905110733387679946734471718615647723811737035654917628707589456035519195603962301157866323750234725054461073979402475184415558178087962822231972692984516683306919505079993357259165675557294585962182052650473353712351623662770479333289322136141858785972771685682725303734836891911847197133753088446777943274857148827821608844765700041403499921376794209627560883081509438030705666022764678117533361028187800710219794428777313146387857817205661409023041499923248268982477222109852189758140879763486146763606368674611966620347304608917277240045953051376938375381543486981101990651706961774052218247422657652138152740612699012706880875386408669901461740890540981877671880076124151967064152117653084325544261017536348281196837493395825742541244634247233586360777980960199745187758845459645895956779558869098404768259253477849930457883128541747079059795909431627722327844578918694214929451540174214623240300841907975296782445969183509474202123617940309048634960534054931299919496087957952586977170236680033862505764938088740994009589948109397983231108838769236490221499111120870639202892490698435333152727991330986335454324971441378059132240814960156485679843966464780280409057580889190254236606774500413415794312112501275232250148067232979652230488493751166084976116412777395311302041566848265531411348993243747890268935173904043294851610659785832253168204202834993641595980197343889883020994152152288611175126686173051956249367180053845637855129171848417841594797435580617856680758491080185805695567990185198397660693358224779136504562705766735170961550493338390452612404395517449136885115987454340932040102218982707539212403241042424451570052968378815749468441508011138612561164102477190903050040240662278945607061512108266146098662040425010583978098192019726759010749924884966139441184159734610382401178556739080566483321039073867083298691078093495828888707110651559651222542929154212923108071159723275797510859911398076844732639426419452063138217862260999160086752446265457028969067192282283045169111363652774517975842147102219099906257373383472726498678244401048998507631630668050267115944636293525120269424810854530602810627264236538250773340575475701704367039596467715959261029438313074897245505729085688496091346323165819468660587092144653716755655531962091865952628448253731353698162517351930115341581171353292035873164168839107994000677266031617527582917398395852606454113318985505747847121053505795649095931672167565624818782002769963734155880000867852567422461511406015760115910256449002264980039498403358091309140197877843650167960167465370287466062584346329708303725980494653589318912163976013193079476972058034710553111117215859219066231028099212084069283091906017370764654655683413207556315315006453462321007133584907633048328153458698497332599801187479664273140279381289961720524540674695271948079930396730194274036466594154400092799908634806622334906695224044652158992864203435098858422692019340575496840904812955522654754650713532842543496616084954788090727649930252702815067862810825243222979985391759845188868387004477101866772159439708514664612871148749531862180941719676843144666435175837688436786081446319641912566574047718699160915550910878919431253671945651261878486910876729910565595155159739659034383628124629118117760949411880105946336671039049777312004243578115790429823045072038322781246413671297959415082918378213212876890545963586369344879749784841123274921331663162812456388238288715648447883142417650147980187858215768793063001153788998014623690135803753306246148576074932567807682651045738059018831237617271889933790487113395588485234240255002352200613574914318259142479829367775490496399350755839668967578364316618369307625603528602940662803255416535431518013714821941772672244005268401996533334184004345525296592918502940131600651124395297874364222806977720437363717873457948420238745151249157913139411148608416429347958793681868609689684640858334131017858142710955416293375915178392341303110543328703526599993904966822112768158316511246866451167351378214345336650598328347443536290312393672084593164394941881138607974670134709640378534907149089842317891739783650654751982883367395714360000003439863363212091718954899055748693397700245632475954504411422582410783866837655467400137324322809113692670682805397549111166171102397437749479335174036135005397581475520834285772800986189401984375446435081498218360112577632447389452051636938585136484259964518361856989088721789764694721246807900330925083496645841656554261294195108847197209106605105540933731954888406444080280579549008076040034154662137669606444293774985897353625591959618552448187940317374508256072895120945456562159540405425814886929842786582357673195799285293120866275922366115137445767916063621675267440451221051052090834707443986137829082352772895849625656881972792768694795806100573787084121444815034797422312103295359297822377134077549545477791813823542607184617108389097825964406170543546968567030745411634244134486308676327949177682923093183221341455482591367202823284396549001805653203960795517074496039006696990334199278212696767771835209083959545341866777944872740383733381985235884202840150981579594685874537989503257362809837592216229258598599123843993575573285028613155970362934249814178056461615863415338635077223269996508860870999964899373049307170967888740149746147542880387421250689212155876692242387434701120990859082164073576380817386959755176083877600277517253037133445654852635661720197563001580049790223419586738061442401502436288957503206533690825756785507020555105572381878574650371086308158185862815883054564662297694803970618265491385181326737485227188267917919091354407852685476254126683398240534022469989966652573155637645862251862823092085424412805997628505488913098331761884983352975136073772030571342739638126588567405013841074788943393996603591853934198416322617654857376671943132840050626295140357877264680649549355746326408186979718630218760025813995719923601345374229758918285167511358171472625828596940798518571870075823122317068134867930884899275181661399609753105295773584618525865211893339375771859916335112163441037910451845019023066893064178977808158101360449495409665363660370075881004450265734935127707426742578608784898185628869980851665713320835842613381142623855420315774246613108873106318111989880289722849790551075148403702290580483052731884959994156606537314021296702220821915862905952604040620011815269664910068587592655660567562963361434230232810747488395040380984981860056164646099819257616235478710913832967563761506732550860683433720438748186791668975746563456020002562889601191100980453350423842063824039434163502977688802779835087481178298349417211674919425601608685332435385951152061809031241698182079314615062073826097180458265687043623935757495737332781578904386011378078508110273049446611821957450170106059384336519458628360682108585130499820420578458577175933849015564447305834515291412561679970569657426139901681932056241927977282026714297258700193234337873153939403115411184101414292741703537542003698760608765500109345299007034032401334806388514095769557147190364152027721127070187421548123931953220997506553022646844227700020589045922742423904937051507367764629844971682121994198274794049092601715727439368569721862936007387077810797440975556627807371228030350048829843919546433753355787895064018998685060281902452191177018634505171087023903398550540704454189088472042376499749035038518949505897971286631644699407490959473411581934618336692169573605081585080837952036335619947691937965065016808710250735070825260046821242820434367245824478859256555487861614478717581068572356895150707602217433511627331709472765932413249132702425519391509083601346239612335001086614623850633127072987745618984384288764099836164964775714638573247333226653894523588365972955159905187411779288608760239306160016168434070611663449248395156319152882728822831375458678269830696691220130954815935450754923554167766876455212545681242936427474153815692219503331560151614492247512488957534835926226263545406704767033866410025277276800886383266629488582740369655329362236090572479794734434077704284318507901973469071141230364111729224929307731939309795452877412451183953480382210373644697046967493042810911797232448615413264031578430955396671061468083815548947146733652483679138566431084747848676243012018489329109615281108087617422779131629345494425395422727309645057976122885347393189600810965202090151104579377602529543130188938184010247010134929317443562883578609861545691161669857388024973756940558138630581099823372565164920155443216861690537054630176154809626620800633059320775897175589925862195462096455464624399535391743228225433267174308492508396461328929584567927365409119947616225155964704061297047759818551878441419948614013153859322060745185909608884280218943358691959604936409651570327527570641500776261323783648149005245481413195989296398441371781402764122087644989688629798910870164270169014007825748311598976330612951195680427485317886333041169767175063822135213839779138443325644288490872919067009802496281560626258636942322658490628628035057282983101266919109637258378149363774960594515216932644945188292639525772348420077356021656909077097264985642831778694777804964343991762549216500608626285329471055602670413384500507827390640287529864161287496473708235188892189612641279553536442286955430551308700009878557534223100547153412810957024870812654319123261956462149376527526356402127388765103883255007364899937167183280028398832319373301564123277185395654932422977953016534830128490677845037490891749347389015649588574802194996722621185874361039774946338633057887487405540005440439344888192044102134790034598411927024921557026873700970995205391930979319495883265922171508324621942300185974396706491149559411733728199869021311629886680267446443489233020607003821262841723679627307191405008084085703978151998148822390059948911946474438682533745889962375133378280532928272016815977970066488394482446332210928320504045983008943565954267256879714918703447338237767914829203283196838105907715727191903042365315650957464549643425328069510396558733549803850995143463506175361480050195045201350200180281506933241918267855737764414097080945745624854867704904368368717590918057269794010465019484853146726642978667687697789291431128505043098192949736165944259471754765135205245072597538577958372797702972231435199958499522344049394502115428867244188717409524554771867484911475031801773304689909317974472957035192387686405544278134169807249382219749124257510162187439772902147704638010731470653154201300583810458905006764557332998149945854655105526374914354195867992595981412218735238407957416123372264063860431988936249867649693592569592128495906254446474331759999685163660305216426770428154681777589339252115538590526823311608302751194384823861552852465010329467297198112105314125898165100120742688143577590825227466863206188376830450921784582526239594189673003640808624233657620979111641766331328852352062487922978959456450333733139422384778582717195412347860434376165241568717943562570215636666680088531006728947033079540804583324192188488870712275670333173939262509073556164513677064199539111948881240659821685787131385056850623094155206877987539740658484250135205615103489821873770245063583314243624807432542464195984647411575625441010389671576677263196442524931941806472423789334668561083789808830313571333157729435664956078125304917594015895146954965223118559669048559467607968190167266634650186182955669893965019614544401768162810604465068448139561667220729261210164692339016793399632833013163850830967942792934551268435760356901970523138364640961311774904600772840862214747547653221505518116489887879087780918009050706040061220010051271575991225725282523378026809030528461581739558198122397010092017202251606352922464781615533532275453264543087093320924631855976580561717446840450048285353396546862678852330044967795580761661801833668792312510460809773895565488962815089519622093675058841609752282328250433712970186608193748968699961301486924694482420723632912367052542145464162968910442981633373266871675946715392611950649224725627254543274193495995569590243279097174392258098103601486364409101491734183079646345064833303404765711827040276868271418084574998493392039317445402616663674646668754385093967129918067471909885312710726724428584870694307099756567949198418996425748884764622030325637751112534060087936904565779272035205921345924272965206683338510673615276261016026647772485083344719891986802656197236420847504962661607797092906844757798251795569758235084371746103310387911789239441630112634077535773520558040066982523191225570519133631407211349723226549151062961739050617857127509403623146700931176133132018631158730886798239298009805089491510788371194099750375473674305745187265414016446924576792185753680363289139664155342066705623272936001177781498886100830877849571709880858667023104043242526785955562077310543072298032125941107957349146684680220501816192150766649106862033378713826058987655210423668198670177861672671972374156917880001690656659046965316154923604061891820982414006103779407166342002735828911994182647812782659666207030384795881442790246669264032799404016800137293477301530941805070587421153284642203006550763966756168318897005152026656649929417382840327305940740147117478464839241225676523593418554066440983706083636457657081801664285044258224551650808864421212113914352453935225522162483791737330329812349528984098613273709957407786789349311975204237925022851375880436791854547836416773151821457226504640800104202100410766027807729152555503218182387221708112766208665317651926458452495269685376314437998340336947124447247796973890514941120010934140073794061859447165516612674930799374705772930521750426383798367668159183589049652163726492960837147204067428996276720315410211504333742057182854090136325721437592054640471894328548696883599785122262130812989581571391597464534806099601555877223193450760315411663112963843719400333736013305526352571490454327925190794007111504785378036370897340146753465517470747096935814912797188187854376797751675927822300312945518595042883902735494672667647506072643698761394806879080593531793001711000214417701504495496412454361656210150919997862972495905809191825255486358703529320142005857057855419217730505342687533799076038746689684283402648733290888881745453047194740939258407362058242849349024756883352446212456101562729065130618520732925434179252299417447855189995098959999877410951464170076989305620163502192692653166599093238118295411937545448509428621839424186218067457128099385258842631930670182098008050900019819621758458932516877698594110522845465835679362969619219080897536813210484518784516230623911878024604050824909336069998094776253792973597037759066145994638578378211017122446355845171941670344732162722443265914858595797823752976323442911242311368603724514438765801271594060878788638511089680883165505046309006148832545452819908256238805872042843941834687865142541377686054291079721004271658
diff --git a/third_party/gofrontend/libgo/go/compress/testdata/pi.txt b/third_party/gofrontend/libgo/go/compress/testdata/pi.txt
deleted file mode 100644
index ca99bbc..0000000
--- a/third_party/gofrontend/libgo/go/compress/testdata/pi.txt
+++ /dev/null
@@ -1 +0,0 @@
-3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900994657640789512694683983525957098258226205224894077267194782684826014769909026401363944374553050682034962524517493996514314298091906592509372216964615157098583874105978859597729754989301617539284681382686838689427741559918559252459539594310499725246808459872736446958486538367362226260991246080512438843904512441365497627807977156914359977001296160894416948685558484063534220722258284886481584560285060168427394522674676788952521385225499546667278239864565961163548862305774564980355936345681743241125150760694794510965960940252288797108931456691368672287489405601015033086179286809208747609178249385890097149096759852613655497818931297848216829989487226588048575640142704775551323796414515237462343645428584447952658678210511413547357395231134271661021359695362314429524849371871101457654035902799344037420073105785390621983874478084784896833214457138687519435064302184531910484810053706146806749192781911979399520614196634287544406437451237181921799983910159195618146751426912397489409071864942319615679452080951465502252316038819301420937621378559566389377870830390697920773467221825625996615014215030680384477345492026054146659252014974428507325186660021324340881907104863317346496514539057962685610055081066587969981635747363840525714591028970641401109712062804390397595156771577004203378699360072305587631763594218731251471205329281918261861258673215791984148488291644706095752706957220917567116722910981690915280173506712748583222871835209353965725121083579151369882091444210067510334671103141267111369908658516398315019701651511685171437657618351556508849099898599823873455283316355076479185358932261854896321329330898570642046752590709154814165498594616371802709819943099244889575712828905923233260972997120844335732654893823911932597463667305836041428138830320382490375898524374417029132765618093773444030707469211201913020330380197621101100449293215160842444859637669838952286847831235526582131449576857262433441893039686426243410773226978028073189154411010446823252716201052652272111660396665573092547110557853763466820653109896526918620564769312570586356620185581007293606598764861179104533488503461136576867532494416680396265797877185560845529654126654085306143444318586769751456614068007002378776591344017127494704205622305389945613140711270004078547332699390814546646458807972708266830634328587856983052358089330657574067954571637752542021149557615814002501262285941302164715509792592309907965473761255176567513575178296664547791745011299614890304639947132962107340437518957359614589019389713111790429782856475032031986915140287080859904801094121472213179476477726224142548545403321571853061422881375850430633217518297986622371721591607716692547487389866549494501146540628433663937900397692656721463853067360965712091807638327166416274888800786925602902284721040317211860820419000422966171196377921337575114959501566049631862947265473642523081770367515906735023507283540567040386743513622224771589150495309844489333096340878076932599397805419341447377441842631298608099888687413260472156951623965864573021631598193195167353812974167729478672422924654366800980676928238280689964004824354037014163149658979409243237896907069779422362508221688957383798623001593776471651228935786015881617557829735233446042815126272037343146531977774160319906655418763979293344195215413418994854447345673831624993419131814809277771038638773431772075456545322077709212019051660962804909263601975988281613323166636528619326686336062735676303544776280350450777235547105859548702790814356240145171806246436267945612753181340783303362542327839449753824372058353114771199260638133467768796959703098339130771098704085913374641442822772634659470474587847787201927715280731767907707157213444730605700733492436931138350493163128404251219256517980694113528013147013047816437885185290928545201165839341965621349143415956258658655705526904965209858033850722426482939728584783163057777560688876446248246857926039535277348030480290058760758251047470916439613626760449256274204208320856611906254543372131535958450687724602901618766795240616342522577195429162991930645537799140373404328752628889639958794757291746426357455254079091451357111369410911939325191076020825202618798531887705842972591677813149699009019211697173727847684726860849003377024242916513005005168323364350389517029893922334517220138128069650117844087451960121228599371623130171144484640903890644954440061986907548516026327505298349187407866808818338510228334508504860825039302133219715518430635455007668282949304137765527939751754613953984683393638304746119966538581538420568533862186725233402830871123282789212507712629463229563989898935821167456270102183564622013496715188190973038119800497340723961036854066431939509790190699639552453005450580685501956730229219139339185680344903982059551002263535361920419947455385938102343955449597783779023742161727111723643435439478221818528624085140066604433258885698670543154706965747458550332323342107301545940516553790686627333799585115625784322988273723198987571415957811196358330059408730681216028764962867446047746491599505497374256269010490377819868359381465741268049256487985561453723478673303904688383436346553794986419270563872931748723320837601123029911367938627089438799362016295154133714248928307220126901475466847653576164773794675200490757155527819653621323926406160136358155907422020203187277605277219005561484255518792530343513984425322341576233610642506390497500865627109535919465897514131034822769306247435363256916078154781811528436679570611086153315044521274739245449454236828860613408414863776700961207151249140430272538607648236341433462351897576645216413767969031495019108575984423919862916421939949072362346468441173940326591840443780513338945257423995082965912285085558215725031071257012668302402929525220118726767562204154205161841634847565169998116141010029960783869092916030288400269104140792886215078424516709087000699282120660418371806535567252532567532861291042487761825829765157959847035622262934860034158722980534989650226291748788202734209222245339856264766914905562842503912757710284027998066365825488926488025456610172967026640765590429099456815065265305371829412703369313785178609040708667114965583434347693385781711386455873678123014587687126603489139095620099393610310291616152881384379099042317473363948045759314931405297634757481193567091101377517210080315590248530906692037671922033229094334676851422144773793937517034436619910403375111735471918550464490263655128162288244625759163330391072253837421821408835086573917715096828874782656995995744906617583441375223970968340800535598491754173818839994469748676265516582765848358845314277568790029095170283529716344562129640435231176006651012412006597558512761785838292041974844236080071930457618932349229279650198751872127267507981255470958904556357921221033346697499235630254947802490114195212382815309114079073860251522742995818072471625916685451333123948049470791191532673430282441860414263639548000448002670496248201792896476697583183271314251702969234889627668440323260927524960357996469256504936818360900323809293459588970695365349406034021665443755890045632882250545255640564482465151875471196218443965825337543885690941130315095261793780029741207665147939425902989695946995565761218656196733786236256125216320862869222103274889218654364802296780705765615144632046927906821207388377814233562823608963208068222468012248261177185896381409183903673672220888321513755600372798394004152970028783076670944474560134556417254370906979396122571429894671543578468788614445812314593571984922528471605049221242470141214780573455105008019086996033027634787081081754501193071412233908663938339529425786905076431006383519834389341596131854347546495569781038293097164651438407007073604112373599843452251610507027056235266012764848308407611830130527932054274628654036036745328651057065874882256981579367897669742205750596834408697350201410206723585020072452256326513410559240190274216248439140359989535394590944070469120914093870012645600162374288021092764579310657922955249887275846101264836999892256959688159205600101655256375678566722796619885782794848855834397518744545512965634434803966420557982936804352202770984294232533022576341807039476994159791594530069752148293366555661567873640053666564165473217043903521329543529169414599041608753201868379370234888689479151071637852902345292440773659495630510074210871426134974595615138498713757047101787957310422969066670214498637464595280824369445789772330048764765241339075920434019634039114732023380715095222010682563427471646024335440051521266932493419673977041595683753555166730273900749729736354964533288869844061196496162773449518273695588220757355176651589855190986665393549481068873206859907540792342402300925900701731960362254756478940647548346647760411463233905651343306844953979070903023460461470961696886885014083470405460742958699138296682468185710318879065287036650832431974404771855678934823089431068287027228097362480939962706074726455399253994428081137369433887294063079261595995462624629707062594845569034711972996409089418059534393251236235508134949004364278527138315912568989295196427287573946914272534366941532361004537304881985517065941217352462589548730167600298865925786628561249665523533829428785425340483083307016537228563559152534784459818313411290019992059813522051173365856407826484942764411376393866924803118364453698589175442647399882284621844900877769776312795722672655562596282542765318300134070922334365779160128093179401718598599933849235495640057099558561134980252499066984233017350358044081168552653117099570899427328709258487894436460050410892266917835258707859512983441729535195378855345737426085902908176515578039059464087350612322611200937310804854852635722825768203416050484662775045003126200800799804925485346941469775164932709504934639382432227188515974054702148289711177792376122578873477188196825462981268685817050740272550263329044976277894423621674119186269439650671515779586756482399391760426017633870454990176143641204692182370764887834196896861181558158736062938603810171215855272668300823834046564758804051380801633638874216371406435495561868964112282140753302655100424104896783528588290243670904887118190909494533144218287661810310073547705498159680772009474696134360928614849417850171807793068108546900094458995279424398139213505586422196483491512639012803832001097738680662877923971801461343244572640097374257007359210031541508936793008169980536520276007277496745840028362405346037263416554259027601834840306811381855105979705664007509426087885735796037324514146786703688098806097164258497595138069309449401515422221943291302173912538355915031003330325111749156969174502714943315155885403922164097229101129035521815762823283182342548326111912800928252561902052630163911477247331485739107775874425387611746578671169414776421441111263583553871361011023267987756410246824032264834641766369806637857681349204530224081972785647198396308781543221166912246415911776732253264335686146186545222681268872684459684424161078540167681420808850280054143613146230821025941737562389942075713627516745731891894562835257044133543758575342698699472547031656613991999682628247270641336222178923903176085428943733935618891651250424404008952719837873864805847268954624388234375178852014395600571048119498842390606136957342315590796703461491434478863604103182350736502778590897578272731305048893989009923913503373250855982655867089242612429473670193907727130706869170926462548423240748550366080136046689511840093668609546325002145852930950000907151058236267293264537382104938724996699339424685516483261134146110680267446637334375340764294026682973865220935701626384648528514903629320199199688285171839536691345222444708045923966028171565515656661113598231122506289058549145097157553900243931535190902107119457300243880176615035270862602537881797519478061013715004489917210022201335013106016391541589578037117792775225978742891917915522417189585361680594741234193398420218745649256443462392531953135103311476394911995072858430658361935369329699289837914941939406085724863968836903265564364216644257607914710869984315733749648835292769328220762947282381537409961545598798259891093717126218283025848112389011968221429457667580718653806506487026133892822994972574530332838963818439447707794022843598834100358385423897354243956475556840952248445541392394100016207693636846776413017819659379971557468541946334893748439129742391433659360410035234377706588867781139498616478747140793263858738624732889645643598774667638479466504074111825658378878454858148962961273998413442726086061872455452360643153710112746809778704464094758280348769758948328241239292960582948619196670918958089833201210318430340128495116203534280144127617285830243559830032042024512072872535581195840149180969253395075778400067465526031446167050827682772223534191102634163157147406123850425845988419907611287258059113935689601431668283176323567325417073420817332230462987992804908514094790368878687894930546955703072619009502076433493359106024545086453628935456862958531315337183868265617862273637169757741830239860065914816164049449650117321313895747062088474802365371031150898427992754426853277974311395143574172219759799359685252285745263796289612691572357986620573408375766873884266405990993505000813375432454635967504844235284874701443545419576258473564216198134073468541117668831186544893776979566517279662326714810338643913751865946730024434500544995399742372328712494834706044063471606325830649829795510109541836235030309453097335834462839476304775645015008507578949548931393944899216125525597701436858943585877526379625597081677643800125436502371412783467926101995585224717220177723700417808419423948725406801556035998390548985723546745642390585850216719031395262944554391316631345308939062046784387785054239390524731362012947691874975191011472315289326772533918146607300089027768963114810902209724520759167297007850580717186381054967973100167870850694207092232908070383263453452038027860990556900134137182368370991949516489600755049341267876436746384902063964019766685592335654639138363185745698147196210841080961884605456039038455343729141446513474940784884423772175154334260306698831768331001133108690421939031080143784334151370924353013677631084913516156422698475074303297167469640666531527035325467112667522460551199581831963763707617991919203579582007595605302346267757943936307463056901080114942714100939136913810725813781357894005599500183542511841721360557275221035268037357265279224173736057511278872181908449006178013889710770822931002797665935838758909395688148560263224393726562472776037890814458837855019702843779362407825052704875816470324581290878395232453237896029841669225489649715606981192186584926770403956481278102179913217416305810554598801300484562997651121241536374515005635070127815926714241342103301566165356024733807843028655257222753049998837015348793008062601809623815161366903341111386538510919367393835229345888322550887064507539473952043968079067086806445096986548801682874343786126453815834280753061845485903798217994599681154419742536344399602902510015888272164745006820704193761584547123183460072629339550548239557137256840232268213012476794522644820910235647752723082081063518899152692889108455571126603965034397896278250016110153235160519655904211844949907789992007329476905868577878720982901352956613978884860509786085957017731298155314951681467176959760994210036183559138777817698458758104466283998806006162298486169353373865787735983361613384133853684211978938900185295691967804554482858483701170967212535338758621582310133103877668272115726949518179589754693992642197915523385766231676275475703546994148929041301863861194391962838870543677743224276809132365449485366768000001065262485473055861598999140170769838548318875014293890899506854530765116803337322265175662207526951791442252808165171667766727930354851542040238174608923283917032754257508676551178593950027933895920576682789677644531840404185540104351348389531201326378369283580827193783126549617459970567450718332065034556644034490453627560011250184335607361222765949278393706478426456763388188075656121689605041611390390639601620221536849410926053876887148379895599991120991646464411918568277004574243434021672276445589330127781586869525069499364610175685060167145354315814801054588605645501332037586454858403240298717093480910556211671546848477803944756979804263180991756422809873998766973237695737015808068229045992123661689025962730430679316531149401764737693873514093361833216142802149763399189835484875625298752423873077559555955465196394401821840998412489826236737714672260616336432964063357281070788758164043814850188411431885988276944901193212968271588841338694346828590066640806314077757725705630729400492940302420498416565479736705485580445865720227637840466823379852827105784319753541795011347273625774080213476826045022851579795797647467022840999561601569108903845824502679265942055503958792298185264800706837650418365620945554346135134152570065974881916341359556719649654032187271602648593049039787489589066127250794828276938953521753621850796297785146188432719223223810158744450528665238022532843891375273845892384422535472653098171578447834215822327020690287232330053862163479885094695472004795231120150432932266282727632177908840087861480221475376578105819702226309717495072127248479478169572961423658595782090830733233560348465318730293026659645013718375428897557971449924654038681799213893469244741985097334626793321072686870768062639919361965044099542167627840914669856925715074315740793805323925239477557441591845821562518192155233709607483329234921034514626437449805596103307994145347784574699992128599999399612281615219314888769388022281083001986016549416542616968586788372609587745676182507275992950893180521872924610867639958916145855058397274209809097817293239301067663868240401113040247007350857828724627134946368531815469690466968693925472519413992914652423857762550047485295476814795467007050347999588867695016124972282040303995463278830695976249361510102436555352230690612949388599015734661023712235478911292547696176005047974928060721268039226911027772261025441492215765045081206771735712027180242968106203776578837166909109418074487814049075517820385653909910477594141321543284406250301802757169650820964273484146957263978842560084531214065935809041271135920041975985136254796160632288736181367373244506079244117639975974619383584574915988097667447093006546342423460634237474666080431701260052055928493695941434081468529815053947178900451835755154125223590590687264878635752541911288877371766374860276606349603536794702692322971868327717393236192007774522126247518698334951510198642698878471719396649769070825217423365662725928440620430214113719922785269984698847702323823840055655517889087661360130477098438611687052310553149162517283732728676007248172987637569816335415074608838663640693470437206688651275688266149730788657015685016918647488541679154596507234287730699853713904300266530783987763850323818215535597323530686043010675760838908627049841888595138091030423595782495143988590113185835840667472370297149785084145853085781339156270760356390763947311455495832266945702494139831634332378975955680856836297253867913275055542524491943589128405045226953812179131914513500993846311774017971512283785460116035955402864405902496466930707769055481028850208085800878115773817191741776017330738554758006056014337743299012728677253043182519757916792969965041460706645712588834697979642931622965520168797300035646304579308840327480771811555330909887025505207680463034608658165394876951960044084820659673794731680864156456505300498816164905788311543454850526600698230931577765003780704661264706021457505793270962047825615247145918965223608396645624105195510522357239739512881816405978591427914816542632892004281609136937773722299983327082082969955737727375667615527113922588055201898876201141680054687365580633471603734291703907986396522961312801782679717289822936070288069087768660593252746378405397691848082041021944719713869256084162451123980620113184541244782050110798760717155683154078865439041210873032402010685341947230476666721749869868547076781205124736792479193150856444775379853799732234456122785843296846647513336573692387201464723679427870042503255589926884349592876124007558756946413705625140011797133166207153715436006876477318675587148783989081074295309410605969443158477539700943988394914432353668539209946879645066533985738887866147629443414010498889931600512076781035886116602029611936396821349607501116498327856353161451684576956871090029997698412632665023477167286573785790857466460772283415403114415294188047825438761770790430001566986776795760909966936075594965152736349811896413043311662774712338817406037317439705406703109676765748695358789670031925866259410510533584384656023391796749267844763708474978333655579007384191473198862713525954625181604342253729962863267496824058060296421146386436864224724887283434170441573482481833301640566959668866769563491416328426414974533349999480002669987588815935073578151958899005395120853510357261373640343675347141048360175464883004078464167452167371904831096767113443494819262681110739948250607394950735031690197318521195526356325843390998224986240670310768318446607291248747540316179699411397387765899868554170318847788675929026070043212666179192235209382278788809886335991160819235355570464634911320859189796132791319756490976000139962344455350143464268604644958624769094347048293294140411146540923988344435159133201077394411184074107684981066347241048239358274019449356651610884631256785297769734684303061462418035852933159734583038455410337010916767763742762102137013548544509263071901147318485749233181672072137279355679528443925481560913728128406333039373562420016045664557414588166052166608738748047243391212955877763906969037078828527753894052460758496231574369171131761347838827194168606625721036851321566478001476752310393578606896111259960281839309548709059073861351914591819510297327875571049729011487171897180046961697770017913919613791417162707018958469214343696762927459109940060084983568425201915593703701011049747339493877885989417433031785348707603221982970579751191440510994235883034546353492349826883624043327267415540301619505680654180939409982020609994140216890900708213307230896621197755306659188141191577836272927461561857103721724710095214236964830864102592887457999322374955191221951903424452307535133806856807354464995127203174487195403976107308060269906258076020292731455252078079914184290638844373499681458273372072663917670201183004648190002413083508846584152148991276106513741539435657211390328574918769094413702090517031487773461652879848235338297260136110984514841823808120540996125274580881099486972216128524897425555516076371675054896173016809613803811914361143992106380050832140987604599309324851025168294467260666138151745712559754953580239983146982203613380828499356705575524712902745397762140493182014658008021566536067765508783804304134310591804606800834591136640834887408005741272586704792258319127415739080914383138456424150940849133918096840251163991936853225557338966953749026620923261318855891580832455571948453875628786128859004106006073746501402627824027346962528217174941582331749239683530136178653673760642166778137739951006589528877427662636841830680190804609849809469763667335662282915132352788806157768278159588669180238940333076441912403412022316368577860357276941541778826435238131905028087018575047046312933353757285386605888904583111450773942935201994321971171642235005644042979892081594307167019857469273848653833436145794634175922573898588001698014757420542995801242958105456510831046297282937584161162532562516572498078492099897990620035936509934721582965174135798491047111660791587436986541222348341887722929446335178653856731962559852026072947674072616767145573649812105677716893484917660771705277187601199908144113058645577910525684304811440261938402322470939249802933550731845890355397133088446174107959162511714864874468611247605428673436709046678468670274091881014249711149657817724279347070216688295610877794405048437528443375108828264771978540006509704033021862556147332117771174413350281608840351781452541964320309576018694649088681545285621346988355444560249556668436602922195124830910605377201980218310103270417838665447181260397190688462370857518080035327047185659499476124248110999288679158969049563947624608424065930948621507690314987020673533848349550836366017848771060809804269247132410009464014373603265645184566792456669551001502298330798496079949882497061723674493612262229617908143114146609412341593593095854079139087208322733549572080757165171876599449856937956238755516175754380917805280294642004472153962807463602113294255916002570735628126387331060058910652457080244749375431841494014821199962764531068006631183823761639663180931444671298615527598201451410275600689297502463040173514891945763607893528555053173314164570504996443890936308438744847839616840518452732884032345202470568516465716477139323775517294795126132398229602394548579754586517458787713318138752959809412174227300352296508089177705068259248822322154938048371454781647213976820963320508305647920482085920475499857320388876391601995240918938945576768749730856955958010659526503036266159750662225084067428898265907510637563569968211510949669744580547288693631020367823250182323708459790111548472087618212477813266330412076216587312970811230758159821248639807212407868878114501655825136178903070860870198975889807456643955157415363193191981070575336633738038272152798849350397480015890519420879711308051233933221903466249917169150948541401871060354603794643379005890957721180804465743962806186717861017156740967662080295766577051291209907944304632892947306159510430902221439371849560634056189342513057268291465783293340524635028929175470872564842600349629611654138230077313327298305001602567240141851520418907011542885799208121984493156999059182011819733500126187728036812481995877070207532406361259313438595542547781961142935163561223496661522614735399674051584998603552953329245752388810136202347624669055816438967863097627365504724348643071218494373485300606387644566272186661701238127715621379746149861328744117714552444708997144522885662942440230184791205478498574521634696448973892062401943518310088283480249249085403077863875165911302873958787098100772718271874529013972836614842142871705531796543076504534324600536361472618180969976933486264077435199928686323835088756683595097265574815431940195576850437248001020413749831872259677387154958399718444907279141965845930083942637020875635398216962055324803212267498911402678528599673405242031091797899905718821949391320753431707980023736590985375520238911643467185582906853711897952626234492483392496342449714656846591248918556629589329909035239233333647435203707701010843880032907598342170185542283861617210417603011645918780539367447472059985023582891833692922337323999480437108419659473162654825748099482509991833006976569367159689364493348864744213500840700660883597235039532340179582557036016936990988671132109798897070517280755855191269930673099250704070245568507786790694766126298082251633136399521170984528092630375922426742575599892892783704744452189363203489415521044597261883800300677617931381399162058062701651024458869247649246891924612125310275731390840470007143561362316992371694848132554200914530410371354532966206392105479824392125172540132314902740585892063217589494345489068463993137570910346332714153162232805522972979538018801628590735729554162788676498274186164218789885741071649069191851162815285486794173638906653885764229158342500673612453849160674137340173572779956341043326883569507814931378007362354180070619180267328551191942676091221035987469241172837493126163395001239599240508454375698507957046222664619000103500490183034153545842833764378111988556318777792537201166718539541835984438305203762819440761594106820716970302285152250573126093046898423433152732131361216582808075212631547730604423774753505952287174402666389148817173086436111389069420279088143119448799417154042103412190847094080254023932942945493878640230512927119097513536000921971105412096683111516328705423028470073120658032626417116165957613272351566662536672718998534199895236884830999302757419916463841427077988708874229277053891227172486322028898425125287217826030500994510824783572905691988555467886079462805371227042466543192145281760741482403827835829719301017888345674167811398954750448339314689630763396657226727043393216745421824557062524797219978668542798977992339579057581890622525473582205236424850783407110144980478726691990186438822932305382318559732869780922253529591017341407334884761005564018242392192695062083183814546983923664613639891012102177095976704908305081854704194664371312299692358895384930136356576186106062228705599423371631021278457446463989738188566746260879482018647487672727222062676465338099801966883680994159075776852639865146253336312450536402610569605513183813174261184420189088853196356986962795036738424313011331753305329802016688817481342988681585577810343231753064784983210629718425184385534427620128234570716988530518326179641178579608888150329602290705614476220915094739035946646916235396809201394578175891088931992112260073928149169481615273842736264298098234063200244024495894456129167049508235812487391799648641133480324757775219708932772262349486015046652681439877051615317026696929704928316285504212898146706195331970269507214378230476875280287354126166391708245925170010714180854800636923259462019002278087409859771921805158532147392653251559035410209284665925299914353791825314545290598415817637058927906909896911164381187809435371521332261443625314490127454772695739393481546916311624928873574718824071503995009446731954316193855485207665738825139639163576723151005556037263394867208207808653734942440115799667507360711159351331959197120948964717553024531364770942094635696982226673775209945168450643623824211853534887989395673187806606107885440005508276570305587448541805778891719207881423351138662929667179643468760077047999537883387870348718021842437342112273940255717690819603092018240188427057046092622564178375265263358324240661253311529423457965569502506810018310900411245379015332966156970522379210325706937051090830789479999004999395322153622748476603613677697978567386584670936679588583788795625946464891376652199588286933801836011932368578558558195556042156250883650203322024513762158204618106705195330653060606501054887167245377942831338871631395596905832083416898476065607118347136218123246227258841990286142087284956879639325464285343075301105285713829643709990356948885285190402956047346131138263878897551788560424998748316382804046848618938189590542039889872650697620201995548412650005394428203930127481638158530396439925470201672759328574366661644110962566337305409219519675148328734808957477775278344221091073111351828046036347198185655572957144747682552857863349342858423118749440003229690697758315903858039353521358860079600342097547392296733310649395601812237812854584317605561733861126734780745850676063048229409653041118306671081893031108871728167519579675347188537229309616143204006381322465841111157758358581135018569047815368938137718472814751998350504781297718599084707621974605887423256995828892535041937958260616211842368768511418316068315867994601652057740529423053601780313357263267054790338401257305912339601880137825421927094767337191987287385248057421248921183470876629667207272325650565129333126059505777727542471241648312832982072361750574673870128209575544305968395555686861188397135522084452852640081252027665557677495969626612604565245684086139238265768583384698499778726706555191854468698469478495734622606294219624557085371272776523098955450193037732166649182578154677292005212667143463209637891852323215018976126034373684067194193037746880999296877582441047878123266253181845960453853543839114496775312864260925211537673258866722604042523491087026958099647595805794663973419064010036361904042033113579336542426303561457009011244800890020801478056603710154122328891465722393145076071670643556827437743965789067972687438473076346451677562103098604092717090951280863090297385044527182892749689212106670081648583395537735919136950153162018908887484210798706899114804669270650940762046502772528650728905328548561433160812693005693785417861096969202538865034577183176686885923681488475276498468821949739729707737187188400414323127636504814531122850990020742409255859252926103021067368154347015252348786351643976235860419194129697690405264832347009911154242601273438022089331096686367898694977994001260164227609260823493041180643829138347354679725399262338791582998486459271734059225620749105308531537182911681637219395188700957788181586850464507699343940987433514431626330317247747486897918209239480833143970840673084079589358108966564775859905563769525232653614424780230826811831037735887089240613031336477371011628214614661679404090518615260360092521947218890918107335871964142144478654899528582343947050079830388538860831035719306002771194558021911942899922722353458707566246926177663178855144350218287026685610665003531050216318206017609217984684936863161293727951873078972637353717150256378733579771808184878458866504335824377004147710414934927438457587107159731559439426412570270965125108115548247939403597681188117282472158250109496096625393395380922195591918188552678062149923172763163218339896938075616855911752998450132067129392404144593862398809381240452191484831646210147389182510109096773869066404158973610476436500068077105656718486281496371118832192445663945814491486165500495676982690308911185687986929470513524816091743243015383684707292898982846022237301452655679898627767968091469798378268764311598832109043715611299766521539635464420869197567370005738764978437686287681792497469438427465256316323005551304174227341646455127812784577772457520386543754282825671412885834544435132562054464241011037955464190581168623059644769587054072141985212106734332410756767575818456990693046047522770167005684543969234041711089888993416350585157887353430815520811772071880379104046983069578685473937656433631979786803671873079693924236321448450354776315670255390065423117920153464977929066241508328858395290542637687668968805033317227800185885069736232403894700471897619347344308437443759925034178807972235859134245813144049847701732361694719765715353197754997162785663119046912609182591249890367654176979903623755286526375733763526969344354400473067198868901968147428767790866979688522501636949856730217523132529265375896415171479559538784278499866456302878831962099830494519874396369070682762657485810439112232618794059941554063270131989895703761105323606298674803779153767511583043208498720920280929752649812569163425000522908872646925284666104665392171482080130502298052637836426959733707053922789153510568883938113249757071331029504430346715989448786847116438328050692507766274500122003526203709466023414648998390252588830148678162196775194583167718762757200505439794412459900771152051546199305098386982542846407255540927403132571632640792934183342147090412542533523248021932277075355546795871638358750181593387174236061551171013123525633485820365146141870049205704372018261733194715700867578539336078622739558185797587258744102542077105475361294047460100094095444959662881486915903899071865980563617137692227290764197755177720104276496949611056220592502420217704269622154958726453989227697660310524980855759471631075870133208861463266412591148633881220284440694169488261529577625325019870359870674380469821942056381255833436421949232275937221289056420943082352544084110864545369404969271494003319782861318186188811118408257865928757426384450059944229568586460481033015388911499486935436030221810943466764000022362550573631294626296096198760564259963946138692330837196265954739234624134597795748524647837980795693198650815977675350553918991151335252298736112779182748542008689539658359421963331502869561192012298889887006079992795411188269023078913107603617634779489432032102773359416908650071932804017163840644987871753756781185321328408216571107549528294974936214608215583205687232185574065161096274874375098092230211609982633033915469494644491004515280925089745074896760324090768983652940657920198315265410658136823791984090645712468948470209357761193139980246813405200394781949866202624008902150166163813538381515037735022966074627952910384068685569070157516624192987244482719429331004854824454580718897633003232525821581280327467962002814762431828622171054352898348208273451680186131719593324711074662228508710666117703465352839577625997744672185715816126411143271794347885990892808486694914139097716736900277758502686646540565950394867841110790116104008572744562938425494167594605487117235946429105850909950214958793112196135908315882620682332156153086833730838173279328196983875087083483880463884784418840031847126974543709373298362402875197920802321878744882872843727378017827008058782410749357514889978911739746129320351081432703251409030487462262942344327571260086642508333187688650756429271605525289544921537651751492196367181049435317858383453865255656640657251363575064353236508936790431702597878177190314867963840828810209461490079715137717099061954969640070867667102330048672631475510537231757114322317411411680622864206388906210192355223546711662137499693269321737043105987225039456574924616978260970253359475020913836673772894438696400028110344026084712899000746807764844088711341352503367877316797709372778682166117865344231732264637847697875144332095340001650692130546476890985050203015044880834261845208730530973189492916425322933612431514306578264070283898409841602950309241897120971601649265613413433422298827909921786042679812457285345801338260995877178113102167340256562744007296834066198480676615805021691833723680399027931606420436812079900316264449146190219458229690992122788553948783538305646864881655562294315673128274390826450611628942803501661336697824051770155219626522725455850738640585299830379180350432876703809252167907571204061237596327685674845079151147313440001832570344920909712435809447900462494313455028900680648704293534037436032625820535790118395649089354345101342969617545249573960621490288728932792520696535386396443225388327522499605986974759882329916263545973324445163755334377492928990581175786355555626937426910947117002165411718219750519831787137106051063795558588905568852887989084750915764639074693619881507814685262133252473837651192990156109189777922008705793396463827490680698769168197492365624226087154176100430608904377976678519661891404144925270480881971498801542057787006521594009289777601330756847966992955433656139847738060394368895887646054983871478968482805384701730871117761159663505039979343869339119789887109156541709133082607647406305711411098839388095481437828474528838368079418884342666222070438722887413947801017721392281911992365405516395893474263953824829609036900288359327745855060801317988407162446563997948275783650195514221551339281978226984278638391679715091262410548725700924070045488485692950448110738087996547481568913935380943474556972128919827177020766613602489581468119133614121258783895577357194986317210844398901423948496659251731388171602663261931065366535041473070804414939169363262373767777095850313255990095762731957308648042467701212327020533742667053142448208168130306397378736642483672539837487690980602182785786216512738563513290148903509883270617258932575363993979055729175160097615459044771692265806315111028038436017374742152476085152099016158582312571590733421736576267142390478279587281505095633092802668458937649649770232973641319060982740633531089792464242134583740901169391964250459128813403498810635400887596820054408364386516617880557608956896727531538081942077332597917278437625661184319891025007491829086475149794003160703845549465385946027452447466812314687943441610993338908992638411847425257044572517459325738989565185716575961481266020310797628254165590506042479114016957900338356574869252800743025623419498286467914476322774005529460903940177536335655471931000175430047504719144899841040015867946179241610016454716551337074073950260442769538553834397550548871099785205401175169747581344926079433689543783221172450687344231989878844128542064742809735625807066983106979935260693392135685881391214807354728463227784908087002467776303605551232386656295178853719673034634701222939581606792509153217489030840886516061119011498443412350124646928028805996134283511884715449771278473361766285062169778717743824362565711779450064477718370221999106695021656757644044997940765037999954845002710665987813603802314126836905783190460792765297277694043613023051787080546511542469395265127101052927070306673024447125973939950514628404767431363739978259184541176413327906460636584152927019030276017339474866960348694976541752429306040727005059039503148522921392575594845078867977925253931765156416197168443524369794447355964260633391055126826061595726217036698506473281266724521989060549880280782881429796336696744124805982192146339565745722102298677599746738126069367069134081559412016115960190237753525556300606247983261249881288192937343476862689219239777833910733106588256813777172328315329082525092733047850724977139448333892552081175608452966590553940965568541706001179857293813998258319293679100391844099286575605993598910002969864460974714718470101531283762631146774209145574041815908800064943237855839308530828305476076799524357391631221886057549673832243195650655460852881201902363644712703748634421727257879503428486312944916318475347531435041392096108796057730987201352484075057637199253650470908582513936863463863368042891767107602111159828875539940120076013947033661793715396306139863655492213741597905119083588290097656647300733879314678913181465109316761575821351424860442292445304113160652700974330088499034675405518640677342603583409608605533747362760935658853109760994238347382222087292464497684560579562516765574088410321731345627735856052358236389532038534024842273371639123973215995440828421666636023296545694703577184873442034227706653837387506169212768015766181095420097708363604361110592409117889540338021426523948929686439808926114635414571535194342850721353453018315875628275733898268898523557799295727645229391567477566676051087887648453493636068278050564622813598885879259940946446041705204470046315137975431737187756039815962647501410906658866162180038266989961965580587208639721176995219466789857011798332440601811575658074284182910615193917630059194314434605154047710570054339000182453117733718955857603607182860506356479979004139761808955363669603162193113250223851791672055180659263518036251214575926238369348222665895576994660491938112486609099798128571823494006615552196112207203092277646200999315244273589488710576623894693889446495093960330454340842102462401048723328750081749179875543879387381439894238011762700837196053094383940063756116458560943129517597713935396074322792489221267045808183313764165818269562105872892447740035947009268662659651422050630078592002488291860839743732353849083964326147000532423540647042089499210250404726781059083644007466380020870126664209457181702946752278540074508552377720890581683918446592829417018288233014971554235235911774818628592967605048203864343108779562892925405638946621948268711042828163893975711757786915430165058602965217459581988878680408110328432739867198621306205559855266036405046282152306154594474489908839081999738747452969810776201487134000122535522246695409315213115337915798026979555710508507473874750758068765376445782524432638046143042889235934852961058269382103498000405248407084403561167817170512813378805705643450616119330424440798260377951198548694559152051960093041271007277849301555038895360338261929343797081874320949914159593396368110627557295278004254863060054523839151068998913578820019411786535682149118528207852130125518518493711503422159542244511900207393539627400208110465530207932867254740543652717595893500716336076321614725815407642053020045340183572338292661915308354095120226329165054426123619197051613839357326693760156914429944943744856809775696303129588719161129294681884936338647392747601226964158848900965717086160598147204467428664208765334799858222090619802173211614230419477754990738738567941189824660913091691772274207233367635032678340586301930193242996397204445179288122854478211953530898910125342975524727635730226281382091807439748671453590778633530160821559911314144205091447293535022230817193663509346865858656314855575862447818620108711889760652969899269328178705576435143382060141077329261063431525337182243385263520217735440715281898137698755157574546939727150488469793619500477720970561793913828989845327426227288647108883270173723258818244658436249580592560338105215606206155713299156084892064340303395262263451454283678698288074251422567451806184149564686111635404971897682154227722479474033571527436819409892050113653400123846714296551867344153741615042563256713430247655125219218035780169240326699541746087592409207004669340396510178134857835694440760470232540755557764728450751826890418293966113310160131119077398632462778219023650660374041606724962490137433217246454097412995570529142438208076098364823465973886691349919784013108015581343979194852830436739012482082444814128095443773898320059864909159505322857914576884962578665885999179867520554558099004556461178755249370124553217170194282884617402736649978475508294228020232901221630102309772151569446427909802190826689868834263071609207914085197695235553488657743425277531197247430873043619511396119080030255878387644206085044730631299277888942729189727169890575925244679660189707482960949190648764693702750773866432391919042254290235318923377293166736086996228032557185308919284403805071030064776847863243191000223929785255372375566213644740096760539439838235764606992465260089090624105904215453927904411529580345334500256244101006359530039598864466169595626351878060688513723462707997327233134693971456285542615467650632465676620279245208581347717608521691340946520307673391841147504140168924121319826881568664561485380287539331160232292555618941042995335640095786495340935115266454024418775949316930560448686420862757201172319526405023099774567647838488973464317215980626787671838005247696884084989185086149003432403476742686245952395890358582135006450998178244636087317754378859677672919526111213859194725451400301180503437875277664402762618941017576872680428176623860680477885242887430259145247073950546525135339459598789619778911041890292943818567205070964606263541732944649576612651953495701860015412623962286413897796733329070567376962156498184506842263690367849555970026079867996261019039331263768556968767029295371162528005543100786408728939225714512481135778627664902425161990277471090335933309304948380597856628844787441469841499067123764789582263294904679812089984857163571087831191848630254501620929805829208334813638405421720056121989353669371336733392464416125223196943471206417375491216357008573694397305979709719726666642267431117762176403068681310351899112271339724036887000996862922546465006385288620393800504778276912835603372548255793912985251506829969107754257647488325341412132800626717094009098223529657957997803018282428490221470748111124018607613415150387569830918652780658896682362523937845272634530420418802508442363190383318384550522367992357752929106925043261446950109861088899914658551881873582528164302520939285258077969737620845637482114433988162710031703151334402309526351929588680690821355853680161000213740851154484912685841268695899174149133820578492800698255195740201818105641297250836070356851055331787840829000041552511865779453963317538532092149720526607831260281961164858098684587525129997404092797683176639914655386108937587952214971731728131517932904431121815871023518740757222100123768721944747209349312324107065080618562372526732540733324875754482967573450019321902199119960797989373383673242576103938985349278777473980508080015544764061053522202325409443567718794565430406735896491017610775948364540823486130254718476485189575836674399791508512858020607820554462991723202028222914886959399729974297471155371858924238493855858595407438104882624648788053304271463011941589896328792678327322456103852197011130466587100500083285177311776489735230926661234588873102883515626446023671996644554727608310118788389151149340939344750073025855814756190881398752357812331342279866503522725367171230756861045004548970360079569827626392344107146584895780241408158405229536937499710665594894459246286619963556350652623405339439142111271810691052290024657423604130093691889255865784668461215679554256605416005071276641766056874274200329577160643448606201239821698271723197826816628249938714995449137302051843669076723577400053932662622760323659751718925901801104290384274185507894887438832703063283279963007200698012244365116394086922220745320244624121155804354542064215121585056896157356414313068883443185280853975927734433655384188340303517822946253702015782157373265523185763554098954033236382319219892171177449469403678296185920803403867575834111518824177439145077366384071880489358256868542011645031357633355509440319236720348651010561049872726472131986543435450409131859513145181276437310438972507004981987052176272494065214619959232142314439776546708351714749367986186552791715824080651063799500184295938799158350171580759883784962257398512129810326379376218322456594236685376799113140108043139732335449090824910499143325843298821033984698141715756010829706583065211347076803680695322971990599904451209087275776225351040902392888779424630483280319132710495478599180196967835321464441189260631526618167443193550817081875477050802654025294109218264858213857526688155584113198560022135158887210365696087515063187533002942118682221893775546027227291290504292259787710667873840000616772154638441292371193521828499824350920891801685572798156421858191197490985730570332667646460728757430565372602768982373259745084479649545648030771598153955827779139373601717422996027353102768719449444917939785144631597314435351850491413941557329382048542123508173912549749819308714396615132942045919380106231421774199184060180347949887691051557905554806953878540066453375981862846419905220452803306263695626490910827627115903856995051246529996062855443838330327638599800792922846659503551211245284087516229060262011857775313747949362055496401073001348853150735487353905602908933526400713274732621960311773433943673385759124508149335736911664541281788171454023054750667136518258284898099512139193995633241336556777098003081910272040997148687418134667006094051021462690280449159646545330107754695413088714165312544813061192407821188690056027781824235022696189344352547633573536485619363254417756613981703930632872166905722259745209192917262199844409646158269456380239502837121686446561785235565164127712826918688615572716201474934052276946595712198314943381622114006936307430444173284786101777743837977037231795255434107223445512555589998646183876764903972461167959018100035098928641204195163551108763204267612979826529425882951141275841262732790798807559751851576841264742209479721843309352972665210015662514552994745127631550917636730259462132930190402837954246323258550301096706922720227074863419005438302650681214142135057154175057508639907673946335146209082888934938376439399256900604067311422093312195936202982972351163259386772241477911629572780752395056251581603133359382311500518626890530658368129988108663263271980611271548858798093487912913707498230575929091862939195014721197586067270092547718025750337730799397134539532646195269996596385654917590458333585799102012713204583903200853878881633637685182083727885131175227769609787962142372162545214591281831798216044111311671406914827170981015457781939202311563871950805024679725792497605772625913328559726371211201905720771409148645074094926718035815157571514050397610963846755569298970383547314100223802583468767350129775413279532060971154506484212185936490997917766874774481882870632315515865032898164228288232746866106592732197907162384642153489852476216789050260998045266483929542357287343977680495774091449538391575565485459058976495198513801007958010783759945775299196700547602252552034453988712538780171960718164078124847847257912407824544361682345239570689514272269750431873633263011103053423335821609333191218806608268341428910415173247216053355849993224548730778822905252324234861531520976938461042582849714963475341837562003014915703279685301868631572488401526639835689563634657435321783493199825542117308467745297085839507616458229630324424328237737450517028560698067889521768198156710781633405266759539424926280756968326107495323390536223090807081455919837355377748742029039018142937311529334644468151212945097596534306284215319445727118614900017650558177095302468875263250119705209476159416768727784472000192789137251841622857783792284439084301181121496366424659033634194540657183544771912446621259392656620306888520055599121235363718226922531781458792593750441448933981608657900876165024635197045828895481793756681046474614105142498870252139936870509372305447734112641354892806841059107716677821238332810262185587751312721179344448201440425745083063944738363793906283008973306241380614589414227694747931665717623182472168350678076487573420491557628217583972975134478990696589532548940335615613167403276472469212505759116251529654568544633498114317670257295661844775487469378464233737238981920662048511894378868224807279352022501796545343757274163910791972952950812942922205347717304184477915673991738418311710362524395716152714669005814700002633010452643547865903290733205468338872078735444762647925297690170912007874183736735087713376977683496344252419949951388315074877537433849458259765560996555954318040920178497184685497370696212088524377013853757681416632722412634423982152941645378000492507262765150789085071265997036708726692764308377229685985169122305037462744310852934305273078865283977335246017463527703205938179125396915621063637625882937571373840754406468964783100704580613446731271591194608435935825987782835266531151065041623295329047772174083559349723758552138048305090009646676088301540612824308740645594431853413755220166305812111033453120745086824339432159043594430312431227471385842030390106070940315235556172767994160020393975099897629335325855575624808996691829864222677502360193257974726742578211119734709402357457222271212526852384295874273501563660093188045493338989741571490544182559738080871565281430102670460284316819230392535297795765862414392701549740879273131051636119137577008929564823323648298263024607975875767745377160102490804624301856524161756655600160859121534556267602192689982855377872583145144082654583484409478463178777374794653580169960779405568701192328608041130904629350871827125934668712766694873899824598527786499569165464029458935064964335809824765965165142090986755203808309203230487342703468288751604071546653834619611223013759451579252696743642531927390036038608236450762698827497618723575476762889950752114804852527950845033958570838130476937881321123674281319487950228066320170022460331989671970649163741175854851878484012054844672588851401562725019821719066960812627785485964818369621410721714214986361918774754509650308957099470934337856981674465828267911940611956037845397855839240761276344105766751024307559814552786167815949657062559755074306521085301597908073343736079432866757890533483669555486803913433720156498834220893399971641479746938696905480089193067138057171505857307148815649920714086758259602876056459782423770242469805328056632787041926768467116266879463486950464507420219373945259262668613552940624781361206202636498199999498405143868285258956342264328707663299304891723400725471764188685351372332667877921738347541480022803392997357936152412755829569276837231234798989446274330454566790062032420516396282588443085438307201495672106460533238537203143242112607424485845094580494081820927639140008540422023556260218564348994145439950410980591817948882628052066441086319001688568155169229486203010738897181007709290590480749092427141018933542818429995988169660993836961644381528877214085268088757488293258735809905670755817017949161906114001908553744882726200936685604475596557476485674008177381703307380305476973609786543859382187220583902344443508867499866506040645874346005331827436296177862518081893144363251205107094690813586440519229512932450078833398788429339342435126343365204385812912834345297308652909783300671261798130316794385535726296998740359570458452230856390098913179475948752126397078375944861139451960286751210561638976008880092746115860800207803341591451797073036835196977766076373785333012024120112046988609209339085365773222392412449051532780950955866459477634482269986074813297302630975028812103517723124465095349653693090018637764094094349837313251321862080214809922685502948454661814715557444709669530177690434272031892770604717784527939160472281534379803539679861424370956683221491465438014593829277393396032754048009552231816667380357183932757077142046723838624617803976292377131209580789363841447929802588065522129262093623930637313496640186619510811583471173312025805866727639992763579078063818813069156366274125431259589936119647626101405563503399523140323113819656236327198961837254845333702062563464223952766943568376761368711962921818754576081617053031590728828700712313666308722754918661395773730546065997437810987649802414011242142773668082751390959313404155826266789510846776118665957660165998178089414985754976284387856100263796543178313634025135814161151902096499133548733131115022700681930135929595971640197196053625033558479980963488718039111612813595968565478868325856437896173159762002419621552896297904819822199462269487137462444729093456470028537694958859591606789282491054412515996300781368367490209374915732896270028656829344431342347351239298259166739503425995868970697267332582735903121288746660451461487850346142827765991608090398652575717263081833494441820193533385071292345774375579344062178711330063106003324053991693682603746176638565758877580201229366353270267100681261825172914608202541892885935244491070138206211553827793565296914576502048643282865557934707209634807372692141186895467322767751335690190153723669036865389161291688887876407525493494249733427181178892759931596719354758988097924525262363659036320070854440784544797348291802082044926670634420437555325050527522833778887040804033531923407685630109347772125639088640413101073817853338316038135280828119040832564401842053746792992622037698718018061122624490909242641985820861751177113789051609140381575003366424156095216328197122335023167422600567941281406217219641842705784328959802882335059828208196666249035857789940333152274817776952843681630088531769694783690580671064828083598046698841098135158654906933319522394363287923990534810987830274500172065433699066117784554364687723631844464768069142828004551074686645392805399409108754939166095731619715033166968309929466349142798780842257220697148875580637480308862995118473187124777291910070227588893486939456289515802965372150409603107761289831263589964893410247036036645058687287589051406841238124247386385427908282733827973326885504935874303160274749063129572349742611221517417153133618622410913869500688835898962349276317316478340077460886655598733382113829928776911495492184192087771606068472874673681886167507221017261103830671787856694812948785048943063086169948798703160515884108282351274153538513365895332948629494495061868514779105804696039069372662670386512905201137810858616188886947957607413585534585151768051973334433495230120395770739623771316030242887200537320998253008977618973129817881944671731160647231476248457551928732782825127182446807824215216469567819294098238926284943760248852279003620219386696482215628093605373178040863727268426696421929946819214908701707533361094791381804063287387593848269535583077395761447997270003472880182785281389503217986345216111066608839314053226944905455527867894417579202440021450780192099804461382547805858048442416404775031536054906591430078158372430123137511562284015838644270890718284816757527123846782459534334449622010096071051370608461801187543120725491334994247617115633321408934609156561550600317384218701570226103101916603887064661438897736318780940711527528174689576401581047016965247557740891644568677717158500583269943401677202156767724068128366565264122982439465133197359199709403275938502669557470231813203243716420586141033606524536939160050644953060161267822648942437397166717661231048975031885732165554988342121802846912529086101485527815277625623750456375769497734336846015607727035509629049392487088406281067943622418704747008368842671022558302403599841645951122485272633632645114017395248086194635840783753556885622317115520947223065437092606797351000565549381224575483728545711797393615756167641692895805257297522338558611388322171107362265816218842443178857488798109026653793426664216990914056536432249301334867988154886628665052346997235574738424830590423677143278792316422403877764330192600192284778313837632536121025336935812624086866699738275977365682227907215832478888642369346396164363308730139814211430306008730666164803678984091335926293402304324974926887831643602681011309570716141912830686577323532639653677390317661361315965553584999398600565155921936759977717933019744688148371103206503693192894521402650915465184309936553493337183425298433679915939417466223900389527673813330617747629574943868716978453767219493506590875711917720875477107189937960894774512654757501871194870738736785890200617373321075693302216320628432065671192096950585761173961632326217708945426214609858410237813215817727602222738133495410481003073275107799948991977963883530734443457532975914263768405442264784216063122769646967156473999043715903323906560726644116438605404838847161912109008701019130726071044114143241976796828547885524779476481802959736049439700479596040292746299203572099761950140348315380947714601056333446998820822120587281510729182971211917876424880354672316916541852256729234429187128163232596965413548589577133208339911288775917226115273379010341362085614577992398778325083550730199818459025958355989260553299673770491722454935329683300002230181517226575787524058832249085821280089747909326100762578770428656006996176212176845478996440705066241710213327486796237430229155358200780141165348065647488230615003392068983794766255036549822805329662862117930628430170492402301985719978948836897183043805182174419147660429752437251683435411217038631379411422095295885798060152938752753799030938871683572095760715221900279379292786303637268765822681241993384808166021603722154710143007377537792699069587121289288019052031601285861825494413353820784883465311632650407642428390870121015194231961652268422003711230464300673442064747718021353070124098860353399152667923871101706221865883573781210935179775604425634694999787251125440854522274810914874307259869602040275941178942581281882159952359658979181144077653354321757595255536158128001163846720319346507296807990793963714961774312119402021297573125165253768017359101557338153772001952444543620071848475663415407442328621060997613243487548847434539665981338717466093020535070271952983943271425371155766600025784423031073429551533945060486222764966687624079324353192992639253731076892135352572321080889819339168668278948281170472624501948409700975760920983724090074717973340788141825195842598096241747610138252643955135259311885045636264188300338539652435997416931322894719878308427600401368074703904097238473945834896186539790594118599310356168436869219485382055780395773881360679549900085123259442529724486666766834641402189915944565309423440650667851948417766779470472041958822043295380326310537494883122180391279678446100139726753892195119117836587662528083690053249004597410947068772912328214304635337283519953648274325833119144459017809607782883583730111857543659958982724531925310588115026307542571493943024453931870179923608166611305426253995833897942971602070338767815033010280120095997252222280801423571094760351925544434929986767817891045559063015953809761875920358937341978962358931125983902598310267193304189215109689156225069659119828323455503059081730735195503721665870288053992138576037035377105178021280129566841984140362872725623214428754302210909472721073474134975514190737043318276626177275996888826027225247133683353452816692779591328861381766349857728936900965749562287103024362590772412219094300871755692625758065709912016659622436080242870024547362036394841255954881727272473653467783647201918303998717627037515724649922289467932322693619177641614618795613956699567783068290316589699430767333508234990790624100202506134057344300695745474682175690441651540636584680463692621274211075399042188716127617787014258864825775223889184599523376292377915585744549477361295525952226578636462118377598473700347971408206994145580719080213590732269233100831759510659019121294795408603640757358750205890208704579670007055262505811420663907459215273309406823649441590891009220296680523325266198911311842016291631076894084723564366808182168657219688268358402785500782804043453710183651096951782335743030504852653738073531074185917705610397395062640355442275156101107261779370634723804990666922161971194259120445084641746383589938239946517395509000859479990136026674261494290066467115067175422177038774507673563742154782905911012619157555870238957001405117822646989944917908301795475876760168094100135837613578591356924455647764464178667115391951357696104864922490083446715486383054477914330097680486878348184672733758436892724310447406807685278625585165092088263813233623148733336714764520450876627614950389949504809560460989604329123358348859990294526400284994280878624039811814884767301216754161106629995553668193123287425702063738352020086863691311733469731741219153633246745325630871347302792174956227014687325867891734558379964351358800959350877556356248810493852999007675135513527792412429277488565888566513247302514710210575352516511814850902750476845518252096331899068527614435138213662152368890578786699432288816028377482035506016029894009119713850179871683633744139275973644017007014763706655703504338121113576415018451821413619823495159601064752712575935185304332875537783057509567425442684712219618709178560783936144511383335649103256405733898667178123972237519316430617013859539474367843392670986712452211189690840236327411496601243483098929941738030588417166613073040067588380432111555379440605497721705942821514886165672771240903387727745629097110134885184374118695655449745736845218066982911045058004299887953899027804383596282409421860556287788428802127553884803728640019441614257499904272009595204654170598104989967504511936471172772220436102614079750809686975176600237187748348016120310234680567112644766123747627852190241202569943534716226660893675219833111813511146503854895025120655772636145473604426859498074396932331297127377157347099713952291182653485155587137336629120242714302503763269501350911612952993785864681307226486008270881333538193703682598867893321238327053297625857382790097826460545598555131836688844628265133798491667839409761353766251798258249663458771950124384040359140849209733754642474488176184070023569580177410177696925077814893386672557898564589851056891960924398841569280696983352240225634570497312245269354193837004843183357196516626721575524193401933099018319309196582920969656247667683659647019595754739345514337413708761517323677204227385674279170698204549953095918872434939524094441678998846319845504852393662972079777452814399418256789457795712552426826089940863317371538896262889629402112108884427376568624527612130371017300785135715404533041507959447776143597437803742436646973247138410492124314138903579092416036406314038149831481905251720937103964026808994832572297954564042701757722904173234796073618787889913318305843069394825961318713816423467218730845133877219086975104942843769325024981656673816260615941768252509993741672883951744066932549653403101452225316189009235376486378482881344209870048096227171226407489571939002918573307460104360729190945767994614929290427981687729426487729952858434647775386906950148984133924540394144680263625402118614317031251117577642829914644533408920976961699098372652361768745605894704968170136974909523072082682887890730190018253425805343421705928713931737993142410852647390948284596418093614138475831136130576108462366837237695913492615824516221552134879244145041756848064120636520170386330129532777699023118648020067556905682295016354931992305914246396217025329747573114094220180199368035026495636955866425906762685687372110339156793839895765565193177883000241613539562437777840801748819373095020699900890899328088397430367736595524891300156633294077907139615464534088791510300651321934486673248275907946807879819425019582622320395131252014109960531260696555404248670549986786923021746989009547850725672978794769888831093487464426400718183160331655511534276155622405474473378049246214952133258527698847336269182649174338987824789278468918828054669982303689939783413747587025805716349413568433929396068192061773331791738208562436433635359863494496890781064019674074436583667071586924521182997893804077137501290858646578905771426833582768978554717687184427726120509266486102051535642840632368481807287940717127966820060727559555904040233178749447346454760628189541512139162918444297651066947969354016866010055196077687335396511614930937570968554559381513789569039251014953265628147011998326992200066392875374713135236421589265126204072887716578358405219646054105435443642166562244565042999010256586927279142752931172082793937751326106052881235373451068372939893580871243869385934389175713376300720319760816604464683937725806909237297523486702916910426369262090199605204121024077648190316014085863558427609537086558164273995349346546314504040199528537252004957805254656251154109252437991326262713609099402902262062836752132305065183934057450112099341464918433323646569371725914489324159006242020612885732926133596808726500045628284557574596592120530341310111827501306961509835515632004310784601906565493806542525229161991819959602752327702249855738824899882707465936355768582560518068964285376850772012220347920993936179268206590142165615925306737944568949070853263568196831861772268249911472615732035807646298116244013316737892788689229032593349861797021994981925739617673075834417098559222170171825712777534491508205278430904619460835217402005838672849709411023266953921445461066215006410674740207009189911951376466904481267253691537162290791385403937560077835153374167747942100384002308951850994548779039346122220865060160500351776264831611153325587705073541279249909859373473787081194253055121436979749914951860535920403830235716352727630874693219622190064260886183676103346002255477477813641012691906569686495012688376296907233961276287223041141813610060264044030035996988919945827397624114613744804059697062576764723766065541618574690527229238228275186799156983390747671146103022776606020061246876477728819096791613354019881402757992174167678799231603963569492851513633647219540611171767387372555728522940054361785176502307544693869307873499110352182532929726044553210797887711449898870911511237250604238753734841257086064069052058452122754533848008205302450456517669518576913200042816758054924811780519832646032445792829730129105318385636821206215531288668564956512613892261367064093953334570526986959692350353094224543865278677673027540402702246384483553239914751363441044050092330361271496081355490531539021002299595756583705381261965683144286057956696622154721695620870013727768536960840704833325132793112232507148630206951245395003735723346807094656483089209801534878705633491092366057554050864111521441481434630437273271045027768661953107858323334857840297160925215326092558932655600672124359464255065996771770388445396181632879614460817789272171836908880126778207430106422524634807454300476492885553409062185153654355474125476152769772667769772777058315801412185688011705028365275543214803488004442979998062157904564161957212784508928489806426497427090579129069217807298769477975112447305991406050629946894280931034216416629935614828130998870745292716048433630818404126469637925843094185442216359084576146078558562473814931427078266215185541603870206876980461747400808324343665382354555109449498431093494759944672673665352517662706772194183191977196378015702169933675083760057163454643671776723387588643405644871566964321041282595645349841388412890420682047007615596916843038999348366793542549210328113363184722592305554383058206941675629992013373175489122037230349072681068534454035993561823576312837767640631013125335212141994611869350833176587852047112364331226765129964171325217513553261867681942338790365468908001827135283584888444111761234101179918709236507184857856221021104009776994453121795022479578069506532965940383987369907240797679040826794007618729547835963492793904576973661643405359792219285870574957481696694062334272619733518136626063735982575552496509807260123668283605928341855848026958413772558970883789942910549800331113884603401939166122186696058491571485733568286149500019097591125218800396419762163559375743718011480559442298730418196808085647265713547612831629200449880315402105530597076666362749328308916880932359290081787411985738317192616728834918402429721290434965526942726402559641463525914348400675867690350382320572934132981593533044446496829441367323442158380761694831219333119819061096142952201536170298575105594326461468505452684975764807808009221335811378197749271768545075538328768874474591593731162470601091244609829424841287520224462594477638749491997840446829257360968534549843266536862844489365704111817793806441616531223600214918768769467398407517176307516849856359201486892943105940202457969622924566644881967576294349535326382171613395757790766370764569570259738800438415805894336137106551859987600754924187211714889295221737721146081154344982665479872580056674724051122007383459271575727715218589946948117940644466399432370044291140747218180224825837736017346685300744985564715420036123593397312914458591522887408719508708632218837288262822884631843717261903305777147651564143822306791847386039147683108141358275755853643597721650028277803713422869688787349795096031108899196143386664068450697420787700280509367203387232629637856038653216432348815557557018469089074647879122436375556668678067610544955017260791142930831285761254481944449473244819093795369008206384631678225064809531810406570254327604385703505922818919878065865412184299217273720955103242251079718077833042609086794273428955735559252723805511440438001239041687716445180226491681641927401106451622431101700056691121733189423400547959684669804298017362570406733282129962153684881404102194463424646220745575643960452985313071409084608499653767803793201899140865814662175319337665970114330608625009829566917638846056762972931464911493704624469351984039534449135141193667933301936617663652555149174982307987072280860859626112660504289296966535652516688885572112276802772743708917389639772257564890533401038855931125679991516589025016486961427207005916056166159702451989051832969278935550303934681219761582183980483960562523091462638447386296039848924386187298507775928792722068554807210497817653286210187476766897248841139560349480376727036316921007350834073865261684507482496448597428134936480372426116704266870831925040997615319076855770327421785010006441984124207396400139603601583810565928413684574119102736420274163723488214524101347716529603128408658419787951116511529827814620379139855006399960326591248525308493690313130100799977191362230866011099929142871249388541612038020411340188887219693477904497527454288072803509305828754420755134816660927879353566521255620139988249628478726214432362853676502591450468377635282587652139156480972141929675549384375582600253168536356731379262475878049445944183429172756988376226261846365452743497662411138451305481449836311789784489732076719508784158618879692955819733250699951402601511675529750575437810242238957925786562128432731202200716730574069286869363930186765958251326499145950260917069347519408975357464016830811798846452473618956056479426358070562563281189269663026479535951097127659136233180866921535788607812759910537171402204506186075374866306350591483916467656723205714516886170790984695932236724946737583099607042589220481550799132752088583781117685214269334786921895240622657921043620348852926267984013953216458791151579050460579710838983371864038024417511347226472547010794793996953554669619726763255229914654933499663234185951450360980344092212206712567698723427940708857070474293173329188523896721971353924492426178641188637790962814486917869468177591717150669111480020759432012061969637795103227089029566085562225452602610460736131368869009281721068198618553780982018471154163630326265699283424155023600978046417108525537612728905335045506135684143775854429677977014660294387687225115363801191758154028120818255606485410787933598921064427244898618961629413418001295130683638609294100083136673372153008352696235737175330738653338204842190308186449184093723944033405244909554558016406460761581010301767488475017661908692946098769201691202181688291040870709560951470416921147027413390052253340834812870353031023919699978597413908593605433599697075604460134242453682496098772581311024732798562072126572499003468293886872304895562253204463602639854225258416464324271611419817802482595563544907219226583863662663750835944314877635156145710745528016159677048442714194435183275698407552677926411261765250615965235457187956673170913319358761628255920783080185206890151504713340386100310055914817852110384754542933389188444120517943969970194112695119526564919594189975418393234647424290702718875223534393673633663200307232747037407123982562024662651974090199762452056198557625760008708173083288344381831070054514493545885422678578551915372292379555494333410174420169600090696415612732297770221217951868376359082255128816470021992348864043959153018464004714321186360622527011541122283802778538911098490201342741014121559769965438877197485376431158229838533123071751132961904559007938064276695819014842627991221792947987348901868471676503827328552059082984529806259250352128451925927986593506132961946796252373972565584157853744567558998032405492186962888490332560851455344391660226257775512916200772796852629387937530454181080729285891989715381797343496187232927614747850192611450413274873242970583408471112333746274617274626582415324271059322506255302314738759251724787322881491455915605036334575424233779160374952502493022351481961381162563911415610326844958072508273431765944054098269765269344579863479709743124498271933113863873159636361218623497261409556079920628316999420072054811525353393946076850019909886553861433495781650089961649079678142901148387645682174914075623767618453775144031475411206760160726460556859257799322070337333398916369504346690694828436629980037414527627716547623825546170883189810868806847853705536480469350958818025360529740793538676511195079373282083146268960071075175520614433784114549950136432446328193346389050936545714506900864483440180428363390513578157273973334537284263372174065775771079830517555721036795976901889958494130195999573017901240193908681356585539661941371794487632079868800371607303220547423572266896801882123424391885984168972277652194032493227314793669234004848976059037958094696041754279613782553781223947646147832926976545162290281701100437846038756544151739433960048915318817576650500951697402415644771293656614253949368884230517400129920556854289853897942669956777027089146513736892206104415481662156804219838476730871787590279209175900695273456682026513373111518000181434120962601658629821076663523361774007837783423709152644063054071807843358061072961105550020415131696373046849213356837265400307509829089364612047891114753037049893952833457824082817386441322710002968311940203323456420826473276233830294639378998375836554559919340866235090967961134004867027123176526663710778725111860354037554487418693519733656621772359229396776463251562023487570113795712096237723431370212031004965152111976013176419408203437348512852602913334915125083119802850177855710725373149139215709105130965059885999931560863655477403551898166733535880048214665099741433761182777723351910741217572841592580872591315074606025634903777263373914461377038021318347447301113032670296917335047701632106616227830027269283365584011791419447808748253360714403296252285775009808599609040936312635621328162071453406104224112083010008587264252112262480142647519426184325853386753874054743491072710049754281159466017136122590440158991600229827801796035194080046513534752698777609527839984368086908989197839693532179980139135442552717910225397010810632143048511378291498511381969143043497500189980681644412123273328307192824362406733196554692677851193152775113446468905504248113361434984604849051258345683266441528489713972376040328212660253516693914082049947320486021627759791771234751097502403078935759937715095021751693555827072533911892334070223832077585802137174778378778391015234132098489423459613692340497998279304144463162707214796117456975719681239291913740982925805561955207434243295982898980529233366415419256367380689494201471241340525072204061794355252555225008748790086568314542835167750542294803274783044056438581591952666758282929705226127628711040134801787224801789684052407924360582742467443076721645270313451354167649668901274786801010295133862698649748212118629040337691568576240699296372493097201628707200189835423690364149270236961938547372480329855045112089192879829874467864129159417531675602533435310626745254507114181483239880607297140234725520713490798398982355268723950909365667878992383712578976248755990443228895388377317348941122757071410959790047919301046740750411435381782464630795989555638991884773781341347070246747362112048986226991888517456251732519341352038115863350123913054441910073628447567514161050410973505852762044489190978901984315485280533985777844313933883994310444465669244550885946314081751220331390681596592510546858013133838152176418210433429788826119630443111388796258746090226130900849975430395771243230616906262919403921439740270894777663702488155499322458825979020631257436910946393252806241642476868495455324938017639371615636847859823715902385421265840615367228607131702674740131145261063765383390315921943469817605358380310612887852051546933639241088467632009567089718367490578163085158138161966882222047570437590614338040725853862083565176998426774523195824182683698270160237414938363496629351576854061397342746470899685618170160551104880971554859118617189668025973541705423985135560018720335079060946421271143993196046527424050882225359773481519135438571253258540493946010865793798058620143366078825219717809025817370870916460452727977153509910340736425020386386718220522879694458387652947951048660717390229327455426785669776865939923416834122274663015062155320502655341460995249356050854921756549134830958906536175693817637473644183378974229700703545206663170929607591989627732423090252397443861014263098687733913882518684316501027964911497737582888913450341148865948670215492101084328080783428089417298008983297536940644969903125399863919581601468995220880662285408414864274786281975546629278814621607171381880180840572084715868906836919393381864278454537956719272397972364651667592011057995663962598535512763558768140213409829016296873429850792471846056874828331381259161962476156902875901072733103299140623864608333378638257926302391590003557609032477281338887339178096966601469615031754226751125993315529674213336300222964906480934582008181061802100227664580400278213336758573019011371754672763059044353131319036092489097246427928455549913490005180295707082919052556781889913899625138662319380053611346224294610248954072404857123256628888931722116432947816190554868054943441034090680716088028227959686950133643814268252170472870863010137301155236861416908375675747637239763185757038109443390564564468524183028148107998376918512127201935044041804604721626939445788377090105974693219720558114078775989772072009689382249303236830515862657281114637996983137517937623215111252349734305240622105244234353732905655163406669506165892878218707756794176080712973781335187117931650033155523822487730653444179453415395202424449703410120874072188109388268167512042299404948179449472732894770111574139441228455521828424922240658752689172272780607116754046973008037039618787796694882555614674384392570115829546661358678671897661297311267200072971553613027503556167817765442287442114729881614802705243806817653573275578602505847084013208837932816008769081300492491473682517035382219619039014999523495387105997351143478292339499187936608692301375596368532373806703591144243268561512109404259582639301678017128669239283231057658851714020211196957064799814031505633045141564414623163763809904402816256917576489142569714163598439317433270237812336938043012892626375382667795034169334323607500248175741808750388475094939454896209740485442635637164995949920980884294790363666297526003243856352945844728944547166209297495496616877414120882130477022816116456044007236351581149729739218966737382647204722642221242016560150284971306332795814302516013694825567014780935790889657134926158161346901806965089556310121218491805847922720691871696316330044858020102860657858591269974637661741463934159569539554203314628026518951167938074573315759846086173702687867602943677780500244673391332431669880354073232388281847501051641331189537036488422690270478052742490603492082954755054003457160184072574536938145531175354210726557835615499874447480427323457880061873149341566046352979779455075359304795687209316724536547208381685855606043801977030764246083489876101345709394877002946175792061952549255757109038525171488525265671045349813419803390641529876343695420256080277614421914318921393908834543131769685101840103844472348948869520981943531906506555354617335814045544837884752526253949665869992058417652780125341033896469818642430034146791380619028059607854888010789705516946215228773090104467462497979992627120951684779568482583341402266477210843362437593741610536734041954738964197895425335036301861400951534766961476255651873823292468547356935802896011536791787303553159378363082248615177770541577576561759358512016692943111138863582159667618830326104164651714846979385422621687161400122378213779774131268977266712992025922017408770076956283473932201088159356286281928563571893384958850603853158179760679479840878360975960149733420572704603521790605647603285569276273495182203236144112584182426247712012035776388895974318232827871314608053533574494297621796789034568169889553518504478325616380709476951699086247100019748809205009521943632378719764870339223811540363475488626845956159755193765410115014067001226927474393888589943859730245414801061235908036274585288493563251585384383242493252666087588908318700709100237377106576985056433928854337658342596750653715005333514489908293887737352051459333049626531415141386124437935885070944688045486975358170212908490787347806814366323322819415827345671356443171537967818058195852464840084032909981943781718177302317003989733050495387356116261023999433259780126893432605584710278764901070923443884634011735556865903585244919370181041626208504299258697435817098133894045934471937493877624232409852832762266604942385129709453245586252103600829286649724174919141988966129558076770979594795306013119159011773943104209049079424448868513086844493705909026006120649425744710353547657859242708130410618546219881830090634588187038755856274911587375421064667951346487586771543838018521348281915812462599335160198935595167968932852205824799421034512715877163345222995418839680448835529753361286837225935390079201666941339091168758803988828869216002373257361588207163516271332810518187602104852180675526648673908900907195138058626735124312215691637902277328705410842037841525683288718046987952513073266340278519059417338920358540395677035611329354482585628287610610698229721420961993509331312171187891078766872044548876089410174798647137882462153955933333275562009439580434537919782280590395959927436913793778664940964048777841748336432684026282932406260081908081804390914556351936856063045089142289645219987798849347477729132797266027658401667890136490508741142126861969862044126965282981087045479861559545338021201155646979976785738920186243599326777689454060508218838227909833627167124490026761178498264377033002081844590009717235204331994708242098771514449751017055643029542821819670009202515615844174205933658148134902693111517093872260026458630561325605792560927332265579346280805683443921373688405650434307396574061017779370141424615493070741360805442100295600095663588977899267630517718781943706761498217564186590116160865408635391513039201316805769034172596453692350806417446562351523929050409479953184074862151210561833854566176652606393713658802521666223576132201941701372664966073252010771947931265282763302413805164907174565964853748354669194523580315301969160480994606814904037819829732360930087135760798621425422096419004367905479049930078372421581954535418371129368658430553842717628035279128821129308351575656599944741788438381565148434229858704245592434693295232821803508333726283791830216591836181554217157448465778420134329982594566884558266171979012180849480332448787258183774805522268151011371745368417870280274452442905474518234674919564188551244421337783521423865979925988203287085109338386829906571994614906290257427686038850511032638544540419184958866538545040571323629681069146814847869659166861842756798460041868762298055562963045953227923051616721591968675849523635298935788507746081537321454642984792310511676357749494622952569497660359473962430995343310404994209677883827002714478494069037073249106444151696053256560586778757417472110827435774315194060757983563629143326397812218946287447798119807225646714664054850131009656786314880090303749338875364183165134982546694673316118123364854397649325026179549357204305402182974871251107404011611405899911093062492312813116340549262571356721818628932786138833718028535056503591952741400869510926167541476792668032109237467087213606278332922386413619594121339278036118276324106004740971111048140003623342714514483334641675466354699731494756643423659493496845884551524150756376605086632827424794136062876041290644913828519456402643153225858624043141838669590633245063000392213192647625962691510904457695301444054618037857503036686212462278639752746667870121003392984873375014475600322100622358029343774955032037012738468163061026570300872275462966796880890587127676361066225722352229739206443093524327228100859973095132528630601105497915644791845004618046762408928925680912930592960642357021061524646205023248966593987324933967376952023991760898474571843531936646529125848064480196520162838795189499336759241485626136995945307287254532463291529110128763770605570609531377527751867923292134955245133089867969165129073841302167573238637575820080363575728002754490327953079900799442541108725693188014667935595834676432868876966610097395749967836593397846346959948950610490383647409504695226063858046758073069912290474089879166872117147527644711604401952718169508289733537148530928937046384420893299771125856840846608339934045689026787516008775461267988015465856522061210953490796707365539702576199431376639960606061106406959330828171876426043573425361756943784848495250108266488395159700490598380812105221111091943323951136051446459834210799058082093716464523127704023160072138543723461267260997870385657091998507595634613248460188409850194287687902268734556500519121546544063829253851276317663922050938345204300773017029940362615434001322763910912988327863920412300445551684054889809080779174636092439334912641164240093880746356607262336695842764583698268734815881961058571835767462009650526065929263548291499045768307210893245857073701660717398194485028842603963660746031184786225831056580870870305567595861341700745402965687634774176431051751036732869245558582082372038601781739405175130437994868822320044378043103170921034261674998000073016094814586374488778522273076330495383944345382770608760763542098445008306247630253572781032783461766970544287155315340016497076657195985041748199087201490875686037783591994719343352772947285537925787684832301101859365800717291186967617655053775030293033830706448912811412025506150896411007623824574488655182581058140345320124754723269087547507078577659732542844459353044992070014538748948226556442223696365544194225441338212225477497535494624827680533336983284156138692363443358553868471111430498248398991803165458638289353799130535222833430137953372954016257623228081138499491876144141322933767106563492528814528239506209022357876684650116660097382753660405446941653422239052108314585847035529352219928272760574821266065291385530345549744551470344939486863429459658431024190785923680224560763936784166270518555178702904073557304620639692453307795782245949710420188043000183881429008173039450507342787013124466860092778581811040911511729374873627887874907465285565434748886831064110051023020875107768918781525622735251550379532444857787277617001964853703555167655209119339343762866284619844026295252183678522367475108809781507098978413086245881522660963551401874495836926917799047120726494905737264286005211403581231076006699518536124862746756375896225299116496066876508261734178484789337295056739007878617925351440621045366250640463728815698232317500596261080921955211150859302955654967538862612972339914628358476048627627027309739202001432248707582337354915246085608210328882974183906478869923273691360048837436615223517058437705545210815513361262142911815615301758882573594892507108879262128641392443309383797333867806131795237315266773820858024701433527009243803266951742119507670884326346442749127558907746863582162166042741315170212458586056233631493164646913946562497471741958354218607748711057338458433689939645913740603382159352243594751626239188685307822821763983237306180204246560477527943104796189724299533029792497481684052893791044947004590864991872727345413508101983881864673609392571930511968645601855782450218231065889437986522432050677379966196955472440585922417953006820451795370043472451762893566770508490213107736625751697335527462302943031203596260953423574397249659211010657817826108745318874803187430823573699195156340957162700992444929749105489851519658664740148225106335367949737142510229341882585117371994499115097583746130105505064197721531929354875371191630262030328588658528480193509225875775597425276584011721342323648084027143356367542046375182552524944329657043861387865901965738802868401894087672816714137033661732650120578653915780703088714261519075001492576112927675193096728453971160213606303090542243966320674323582797889332324405779199278484633339777737655901870574806828678347965624146102899508487399692970750432753029972872297327934442988646412725348160603779707298299173029296308695801996312413304939350493325412355071054461182591141116454534710329881047844067780138077131465400099386306481266614330858206811395838319169545558259426895769841428893743467084107946318932539106963955780706021245974898293564613560788983472419979478564362042094613412387613198865352358312996862268948608408456655606876954501274486631405054735351746873009806322780468912246821460806727627708402402266155485024008952891657117617439020337584877842911289623247059191874691042005848326140677333751027195653994697162517248312230633919328707983800748485726516123434933273356664473358556430235280883924348278760886164943289399166399210488307847777048045728491456303353265070029588906265915498509407972767567129795010098229476228961891591441520032283878773485130979081019129267227103778898053964156362364169154985768408398468861684375407065121039062506128107663799047908879674778069738473170475253442156390387201238806323688037017949308954900776331523063548374256816653361606641980030188287123767481898330246836371488309259283375902278942588060087286038859168849730693948020511221766359138251524278670094406942355120201568377778851824670025651708509249623747726813694284350062938814429987905301056217375459182679973217735029368928065210025396268807498092643458011655715886700443503976505323478287327368840863540002740676783821963522226539290939807367391364082898722017776747168118195856133721583119054682936083236976113450281757830202934845982925000895682630271263295866292147653142233351793093387951357095346377183684092444422096319331295620305575517340067973740614162107923633423805646850092037167152642556371853889571416419772387422610596667396997173168169415435095283193556417705668622215217991151355639707143312893657553844648326201206424338016955862698561022460646069330793847858814367407000599769703649019273328826135329363112403650698652160638987250267238087403396744397830258296894256896741864336134979475245526291426522842419243083388103580053787023999542172113686550275341362211693140694669513186928102574795985605145005021715913317751609957865551981886193211282110709442287240442481153406055895958355815232012184605820563592699303478851132068626627588771446035996656108430725696500563064489187599466596772847171539573612108180841547273142661748933134174632662354222072600146012701206934639520564445543291662986660783089068118790090815295063626782075614388815781351134695366303878412092346942868730839320432333872775496805210302821544324723388845215343727250128589747691460808314404125868181540049187772287869801853454537006526655649170915429522756709222217474112062720656622989806032891672068743654948246108697367225547404812889242471854323605753411672850757552057131156697954584887398742228135887985840783135060548290551482785294891121905383195624228719484759407859398047901094194070671764439032730712135887385049993638838205501683402777496070276844880281912220636888636811043569529300652195528261526991271637277388418993287130563464688227398288763198645709836308917786487086676185485680047672552675414742851028145807403152992197814557756843681110185317498167016426647884090262682824448258027532094549915104518517716546311804904567985713257528117913656278158111288816562285876030875974963849435275676612168959261485030785362045274507752950631012480341804584059432926079854435620093708091821523920371790678121992280496069738238743312626730306795943960954957189577217915597300588693646845576676092450906088202212235719254536715191834872587423919410890444115959932760044506556206461164655665487594247369252336955993030355095817626176231849561906494839673002037763874369343999829430209147073618947932692762445186560239559053705128978163455423320114975994896278424327483788032701418676952621180975006405149755889650293004867605208010491537885413909424531691719987628941277221129464568294860281493181560249677887949813777216229359437811004448060797672429276249510784153446429150842764520002042769470698041775832209097020291657347251582904630910359037842977572651720877244740952267166306005469716387943171196873484688738186656751279298575016363411314627530499019135646823804329970695770150789337728658035712790913767420805655493624646
diff --git a/third_party/gofrontend/libgo/go/compress/zlib/reader.go b/third_party/gofrontend/libgo/go/compress/zlib/reader.go
deleted file mode 100644
index 816f1bf..0000000
--- a/third_party/gofrontend/libgo/go/compress/zlib/reader.go
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package zlib implements reading and writing of zlib format compressed data,
-as specified in RFC 1950.
-
-The implementation provides filters that uncompress during reading
-and compress during writing.  For example, to write compressed data
-to a buffer:
-
-	var b bytes.Buffer
-	w := zlib.NewWriter(&b)
-	w.Write([]byte("hello, world\n"))
-	w.Close()
-
-and to read that data back:
-
-	r, err := zlib.NewReader(&b)
-	io.Copy(os.Stdout, r)
-	r.Close()
-*/
-package zlib
-
-import (
-	"bufio"
-	"compress/flate"
-	"errors"
-	"hash"
-	"hash/adler32"
-	"io"
-)
-
-const zlibDeflate = 8
-
-var (
-	// ErrChecksum is returned when reading ZLIB data that has an invalid checksum.
-	ErrChecksum = errors.New("zlib: invalid checksum")
-	// ErrDictionary is returned when reading ZLIB data that has an invalid dictionary.
-	ErrDictionary = errors.New("zlib: invalid dictionary")
-	// ErrHeader is returned when reading ZLIB data that has an invalid header.
-	ErrHeader = errors.New("zlib: invalid header")
-)
-
-type reader struct {
-	r            flate.Reader
-	decompressor io.ReadCloser
-	digest       hash.Hash32
-	err          error
-	scratch      [4]byte
-}
-
-// Resetter resets a ReadCloser returned by NewReader or NewReaderDict to
-// to switch to a new underlying Reader. This permits reusing a ReadCloser
-// instead of allocating a new one.
-type Resetter interface {
-	// Reset discards any buffered data and resets the Resetter as if it was
-	// newly initialized with the given reader.
-	Reset(r io.Reader, dict []byte) error
-}
-
-// NewReader creates a new ReadCloser.
-// Reads from the returned ReadCloser read and decompress data from r.
-// The implementation buffers input and may read more data than necessary from r.
-// It is the caller's responsibility to call Close on the ReadCloser when done.
-//
-// The ReadCloser returned by NewReader also implements Resetter.
-func NewReader(r io.Reader) (io.ReadCloser, error) {
-	return NewReaderDict(r, nil)
-}
-
-// NewReaderDict is like NewReader but uses a preset dictionary.
-// NewReaderDict ignores the dictionary if the compressed data does not refer to it.
-// If the compressed data refers to a different dictionary, NewReaderDict returns ErrDictionary.
-//
-// The ReadCloser returned by NewReaderDict also implements Resetter.
-func NewReaderDict(r io.Reader, dict []byte) (io.ReadCloser, error) {
-	z := new(reader)
-	err := z.Reset(r, dict)
-	if err != nil {
-		return nil, err
-	}
-	return z, nil
-}
-
-func (z *reader) Read(p []byte) (n int, err error) {
-	if z.err != nil {
-		return 0, z.err
-	}
-	if len(p) == 0 {
-		return 0, nil
-	}
-
-	n, err = z.decompressor.Read(p)
-	z.digest.Write(p[0:n])
-	if n != 0 || err != io.EOF {
-		z.err = err
-		return
-	}
-
-	// Finished file; check checksum.
-	if _, err := io.ReadFull(z.r, z.scratch[0:4]); err != nil {
-		z.err = err
-		return 0, err
-	}
-	// ZLIB (RFC 1950) is big-endian, unlike GZIP (RFC 1952).
-	checksum := uint32(z.scratch[0])<<24 | uint32(z.scratch[1])<<16 | uint32(z.scratch[2])<<8 | uint32(z.scratch[3])
-	if checksum != z.digest.Sum32() {
-		z.err = ErrChecksum
-		return 0, z.err
-	}
-	return
-}
-
-// Calling Close does not close the wrapped io.Reader originally passed to NewReader.
-func (z *reader) Close() error {
-	if z.err != nil {
-		return z.err
-	}
-	z.err = z.decompressor.Close()
-	return z.err
-}
-
-func (z *reader) Reset(r io.Reader, dict []byte) error {
-	if fr, ok := r.(flate.Reader); ok {
-		z.r = fr
-	} else {
-		z.r = bufio.NewReader(r)
-	}
-	_, err := io.ReadFull(z.r, z.scratch[0:2])
-	if err != nil {
-		return err
-	}
-	h := uint(z.scratch[0])<<8 | uint(z.scratch[1])
-	if (z.scratch[0]&0x0f != zlibDeflate) || (h%31 != 0) {
-		return ErrHeader
-	}
-	haveDict := z.scratch[1]&0x20 != 0
-	if haveDict {
-		_, err = io.ReadFull(z.r, z.scratch[0:4])
-		if err != nil {
-			return err
-		}
-		checksum := uint32(z.scratch[0])<<24 | uint32(z.scratch[1])<<16 | uint32(z.scratch[2])<<8 | uint32(z.scratch[3])
-		if checksum != adler32.Checksum(dict) {
-			return ErrDictionary
-		}
-	}
-	if z.decompressor == nil {
-		if haveDict {
-			z.decompressor = flate.NewReaderDict(z.r, dict)
-		} else {
-			z.decompressor = flate.NewReader(z.r)
-		}
-	} else {
-		z.decompressor.(flate.Resetter).Reset(z.r, dict)
-	}
-	z.digest = adler32.New()
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/compress/zlib/reader_test.go b/third_party/gofrontend/libgo/go/compress/zlib/reader_test.go
deleted file mode 100644
index 218ccba..0000000
--- a/third_party/gofrontend/libgo/go/compress/zlib/reader_test.go
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package zlib
-
-import (
-	"bytes"
-	"io"
-	"testing"
-)
-
-type zlibTest struct {
-	desc       string
-	raw        string
-	compressed []byte
-	dict       []byte
-	err        error
-}
-
-// Compare-to-golden test data was generated by the ZLIB example program at
-// http://www.zlib.net/zpipe.c
-
-var zlibTests = []zlibTest{
-	{
-		"empty",
-		"",
-		[]byte{0x78, 0x9c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01},
-		nil,
-		nil,
-	},
-	{
-		"goodbye",
-		"goodbye, world",
-		[]byte{
-			0x78, 0x9c, 0x4b, 0xcf, 0xcf, 0x4f, 0x49, 0xaa,
-			0x4c, 0xd5, 0x51, 0x28, 0xcf, 0x2f, 0xca, 0x49,
-			0x01, 0x00, 0x28, 0xa5, 0x05, 0x5e,
-		},
-		nil,
-		nil,
-	},
-	{
-		"bad header",
-		"",
-		[]byte{0x78, 0x9f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01},
-		nil,
-		ErrHeader,
-	},
-	{
-		"bad checksum",
-		"",
-		[]byte{0x78, 0x9c, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff},
-		nil,
-		ErrChecksum,
-	},
-	{
-		"not enough data",
-		"",
-		[]byte{0x78, 0x9c, 0x03, 0x00, 0x00, 0x00},
-		nil,
-		io.ErrUnexpectedEOF,
-	},
-	{
-		"excess data is silently ignored",
-		"",
-		[]byte{
-			0x78, 0x9c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01,
-			0x78, 0x9c, 0xff,
-		},
-		nil,
-		nil,
-	},
-	{
-		"dictionary",
-		"Hello, World!\n",
-		[]byte{
-			0x78, 0xbb, 0x1c, 0x32, 0x04, 0x27, 0xf3, 0x00,
-			0xb1, 0x75, 0x20, 0x1c, 0x45, 0x2e, 0x00, 0x24,
-			0x12, 0x04, 0x74,
-		},
-		[]byte{
-			0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x0a,
-		},
-		nil,
-	},
-	{
-		"wrong dictionary",
-		"",
-		[]byte{
-			0x78, 0xbb, 0x1c, 0x32, 0x04, 0x27, 0xf3, 0x00,
-			0xb1, 0x75, 0x20, 0x1c, 0x45, 0x2e, 0x00, 0x24,
-			0x12, 0x04, 0x74,
-		},
-		[]byte{
-			0x48, 0x65, 0x6c, 0x6c,
-		},
-		ErrDictionary,
-	},
-}
-
-func TestDecompressor(t *testing.T) {
-	b := new(bytes.Buffer)
-	for _, tt := range zlibTests {
-		in := bytes.NewReader(tt.compressed)
-		zlib, err := NewReaderDict(in, tt.dict)
-		if err != nil {
-			if err != tt.err {
-				t.Errorf("%s: NewReader: %s", tt.desc, err)
-			}
-			continue
-		}
-		defer zlib.Close()
-		b.Reset()
-		n, err := io.Copy(b, zlib)
-		if err != nil {
-			if err != tt.err {
-				t.Errorf("%s: io.Copy: %v want %v", tt.desc, err, tt.err)
-			}
-			continue
-		}
-		s := b.String()
-		if s != tt.raw {
-			t.Errorf("%s: got %d-byte %q want %d-byte %q", tt.desc, n, s, len(tt.raw), tt.raw)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/compress/zlib/writer.go b/third_party/gofrontend/libgo/go/compress/zlib/writer.go
deleted file mode 100644
index 3b4313a..0000000
--- a/third_party/gofrontend/libgo/go/compress/zlib/writer.go
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package zlib
-
-import (
-	"compress/flate"
-	"fmt"
-	"hash"
-	"hash/adler32"
-	"io"
-)
-
-// These constants are copied from the flate package, so that code that imports
-// "compress/zlib" does not also have to import "compress/flate".
-const (
-	NoCompression      = flate.NoCompression
-	BestSpeed          = flate.BestSpeed
-	BestCompression    = flate.BestCompression
-	DefaultCompression = flate.DefaultCompression
-)
-
-// A Writer takes data written to it and writes the compressed
-// form of that data to an underlying writer (see NewWriter).
-type Writer struct {
-	w           io.Writer
-	level       int
-	dict        []byte
-	compressor  *flate.Writer
-	digest      hash.Hash32
-	err         error
-	scratch     [4]byte
-	wroteHeader bool
-}
-
-// NewWriter creates a new Writer.
-// Writes to the returned Writer are compressed and written to w.
-//
-// It is the caller's responsibility to call Close on the WriteCloser when done.
-// Writes may be buffered and not flushed until Close.
-func NewWriter(w io.Writer) *Writer {
-	z, _ := NewWriterLevelDict(w, DefaultCompression, nil)
-	return z
-}
-
-// NewWriterLevel is like NewWriter but specifies the compression level instead
-// of assuming DefaultCompression.
-//
-// The compression level can be DefaultCompression, NoCompression, or any
-// integer value between BestSpeed and BestCompression inclusive. The error
-// returned will be nil if the level is valid.
-func NewWriterLevel(w io.Writer, level int) (*Writer, error) {
-	return NewWriterLevelDict(w, level, nil)
-}
-
-// NewWriterLevelDict is like NewWriterLevel but specifies a dictionary to
-// compress with.
-//
-// The dictionary may be nil. If not, its contents should not be modified until
-// the Writer is closed.
-func NewWriterLevelDict(w io.Writer, level int, dict []byte) (*Writer, error) {
-	if level < DefaultCompression || level > BestCompression {
-		return nil, fmt.Errorf("zlib: invalid compression level: %d", level)
-	}
-	return &Writer{
-		w:     w,
-		level: level,
-		dict:  dict,
-	}, nil
-}
-
-// Reset clears the state of the Writer z such that it is equivalent to its
-// initial state from NewWriterLevel or NewWriterLevelDict, but instead writing
-// to w.
-func (z *Writer) Reset(w io.Writer) {
-	z.w = w
-	// z.level and z.dict left unchanged.
-	if z.compressor != nil {
-		z.compressor.Reset(w)
-	}
-	if z.digest != nil {
-		z.digest.Reset()
-	}
-	z.err = nil
-	z.scratch = [4]byte{}
-	z.wroteHeader = false
-}
-
-// writeHeader writes the ZLIB header.
-func (z *Writer) writeHeader() (err error) {
-	z.wroteHeader = true
-	// ZLIB has a two-byte header (as documented in RFC 1950).
-	// The first four bits is the CINFO (compression info), which is 7 for the default deflate window size.
-	// The next four bits is the CM (compression method), which is 8 for deflate.
-	z.scratch[0] = 0x78
-	// The next two bits is the FLEVEL (compression level). The four values are:
-	// 0=fastest, 1=fast, 2=default, 3=best.
-	// The next bit, FDICT, is set if a dictionary is given.
-	// The final five FCHECK bits form a mod-31 checksum.
-	switch z.level {
-	case 0, 1:
-		z.scratch[1] = 0 << 6
-	case 2, 3, 4, 5:
-		z.scratch[1] = 1 << 6
-	case 6, -1:
-		z.scratch[1] = 2 << 6
-	case 7, 8, 9:
-		z.scratch[1] = 3 << 6
-	default:
-		panic("unreachable")
-	}
-	if z.dict != nil {
-		z.scratch[1] |= 1 << 5
-	}
-	z.scratch[1] += uint8(31 - (uint16(z.scratch[0])<<8+uint16(z.scratch[1]))%31)
-	if _, err = z.w.Write(z.scratch[0:2]); err != nil {
-		return err
-	}
-	if z.dict != nil {
-		// The next four bytes are the Adler-32 checksum of the dictionary.
-		checksum := adler32.Checksum(z.dict)
-		z.scratch[0] = uint8(checksum >> 24)
-		z.scratch[1] = uint8(checksum >> 16)
-		z.scratch[2] = uint8(checksum >> 8)
-		z.scratch[3] = uint8(checksum >> 0)
-		if _, err = z.w.Write(z.scratch[0:4]); err != nil {
-			return err
-		}
-	}
-	if z.compressor == nil {
-		// Initialize deflater unless the Writer is being reused
-		// after a Reset call.
-		z.compressor, err = flate.NewWriterDict(z.w, z.level, z.dict)
-		if err != nil {
-			return err
-		}
-		z.digest = adler32.New()
-	}
-	return nil
-}
-
-// Write writes a compressed form of p to the underlying io.Writer. The
-// compressed bytes are not necessarily flushed until the Writer is closed or
-// explicitly flushed.
-func (z *Writer) Write(p []byte) (n int, err error) {
-	if !z.wroteHeader {
-		z.err = z.writeHeader()
-	}
-	if z.err != nil {
-		return 0, z.err
-	}
-	if len(p) == 0 {
-		return 0, nil
-	}
-	n, err = z.compressor.Write(p)
-	if err != nil {
-		z.err = err
-		return
-	}
-	z.digest.Write(p)
-	return
-}
-
-// Flush flushes the Writer to its underlying io.Writer.
-func (z *Writer) Flush() error {
-	if !z.wroteHeader {
-		z.err = z.writeHeader()
-	}
-	if z.err != nil {
-		return z.err
-	}
-	z.err = z.compressor.Flush()
-	return z.err
-}
-
-// Close closes the Writer, flushing any unwritten data to the underlying
-// io.Writer, but does not close the underlying io.Writer.
-func (z *Writer) Close() error {
-	if !z.wroteHeader {
-		z.err = z.writeHeader()
-	}
-	if z.err != nil {
-		return z.err
-	}
-	z.err = z.compressor.Close()
-	if z.err != nil {
-		return z.err
-	}
-	checksum := z.digest.Sum32()
-	// ZLIB (RFC 1950) is big-endian, unlike GZIP (RFC 1952).
-	z.scratch[0] = uint8(checksum >> 24)
-	z.scratch[1] = uint8(checksum >> 16)
-	z.scratch[2] = uint8(checksum >> 8)
-	z.scratch[3] = uint8(checksum >> 0)
-	_, z.err = z.w.Write(z.scratch[0:4])
-	return z.err
-}
diff --git a/third_party/gofrontend/libgo/go/compress/zlib/writer_test.go b/third_party/gofrontend/libgo/go/compress/zlib/writer_test.go
deleted file mode 100644
index 71ba81a..0000000
--- a/third_party/gofrontend/libgo/go/compress/zlib/writer_test.go
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package zlib
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"os"
-	"testing"
-)
-
-var filenames = []string{
-	"../testdata/e.txt",
-	"../testdata/pi.txt",
-}
-
-var data = []string{
-	"test a reasonable sized string that can be compressed",
-}
-
-// Tests that compressing and then decompressing the given file at the given compression level and dictionary
-// yields equivalent bytes to the original file.
-func testFileLevelDict(t *testing.T, fn string, level int, d string) {
-	// Read the file, as golden output.
-	golden, err := os.Open(fn)
-	if err != nil {
-		t.Errorf("%s (level=%d, dict=%q): %v", fn, level, d, err)
-		return
-	}
-	defer golden.Close()
-	b0, err0 := ioutil.ReadAll(golden)
-	if err0 != nil {
-		t.Errorf("%s (level=%d, dict=%q): %v", fn, level, d, err0)
-		return
-	}
-	testLevelDict(t, fn, b0, level, d)
-}
-
-func testLevelDict(t *testing.T, fn string, b0 []byte, level int, d string) {
-	// Make dictionary, if given.
-	var dict []byte
-	if d != "" {
-		dict = []byte(d)
-	}
-
-	// Push data through a pipe that compresses at the write end, and decompresses at the read end.
-	piper, pipew := io.Pipe()
-	defer piper.Close()
-	go func() {
-		defer pipew.Close()
-		zlibw, err := NewWriterLevelDict(pipew, level, dict)
-		if err != nil {
-			t.Errorf("%s (level=%d, dict=%q): %v", fn, level, d, err)
-			return
-		}
-		defer zlibw.Close()
-		_, err = zlibw.Write(b0)
-		if err != nil {
-			t.Errorf("%s (level=%d, dict=%q): %v", fn, level, d, err)
-			return
-		}
-	}()
-	zlibr, err := NewReaderDict(piper, dict)
-	if err != nil {
-		t.Errorf("%s (level=%d, dict=%q): %v", fn, level, d, err)
-		return
-	}
-	defer zlibr.Close()
-
-	// Compare the decompressed data.
-	b1, err1 := ioutil.ReadAll(zlibr)
-	if err1 != nil {
-		t.Errorf("%s (level=%d, dict=%q): %v", fn, level, d, err1)
-		return
-	}
-	if len(b0) != len(b1) {
-		t.Errorf("%s (level=%d, dict=%q): length mismatch %d versus %d", fn, level, d, len(b0), len(b1))
-		return
-	}
-	for i := 0; i < len(b0); i++ {
-		if b0[i] != b1[i] {
-			t.Errorf("%s (level=%d, dict=%q): mismatch at %d, 0x%02x versus 0x%02x\n", fn, level, d, i, b0[i], b1[i])
-			return
-		}
-	}
-}
-
-func testFileLevelDictReset(t *testing.T, fn string, level int, dict []byte) {
-	var b0 []byte
-	var err error
-	if fn != "" {
-		b0, err = ioutil.ReadFile(fn)
-		if err != nil {
-			t.Errorf("%s (level=%d): %v", fn, level, err)
-			return
-		}
-	}
-
-	// Compress once.
-	buf := new(bytes.Buffer)
-	var zlibw *Writer
-	if dict == nil {
-		zlibw, err = NewWriterLevel(buf, level)
-	} else {
-		zlibw, err = NewWriterLevelDict(buf, level, dict)
-	}
-	if err == nil {
-		_, err = zlibw.Write(b0)
-	}
-	if err == nil {
-		err = zlibw.Close()
-	}
-	if err != nil {
-		t.Errorf("%s (level=%d): %v", fn, level, err)
-		return
-	}
-	out := buf.String()
-
-	// Reset and compress again.
-	buf2 := new(bytes.Buffer)
-	zlibw.Reset(buf2)
-	_, err = zlibw.Write(b0)
-	if err == nil {
-		err = zlibw.Close()
-	}
-	if err != nil {
-		t.Errorf("%s (level=%d): %v", fn, level, err)
-		return
-	}
-	out2 := buf2.String()
-
-	if out2 != out {
-		t.Errorf("%s (level=%d): different output after reset (got %d bytes, expected %d",
-			fn, level, len(out2), len(out))
-	}
-}
-
-func TestWriter(t *testing.T) {
-	for i, s := range data {
-		b := []byte(s)
-		tag := fmt.Sprintf("#%d", i)
-		testLevelDict(t, tag, b, DefaultCompression, "")
-		testLevelDict(t, tag, b, NoCompression, "")
-		for level := BestSpeed; level <= BestCompression; level++ {
-			testLevelDict(t, tag, b, level, "")
-		}
-	}
-}
-
-func TestWriterBig(t *testing.T) {
-	for _, fn := range filenames {
-		testFileLevelDict(t, fn, DefaultCompression, "")
-		testFileLevelDict(t, fn, NoCompression, "")
-		for level := BestSpeed; level <= BestCompression; level++ {
-			testFileLevelDict(t, fn, level, "")
-		}
-	}
-}
-
-func TestWriterDict(t *testing.T) {
-	const dictionary = "0123456789."
-	for _, fn := range filenames {
-		testFileLevelDict(t, fn, DefaultCompression, dictionary)
-		testFileLevelDict(t, fn, NoCompression, dictionary)
-		for level := BestSpeed; level <= BestCompression; level++ {
-			testFileLevelDict(t, fn, level, dictionary)
-		}
-	}
-}
-
-func TestWriterReset(t *testing.T) {
-	const dictionary = "0123456789."
-	for _, fn := range filenames {
-		testFileLevelDictReset(t, fn, NoCompression, nil)
-		testFileLevelDictReset(t, fn, DefaultCompression, nil)
-		testFileLevelDictReset(t, fn, NoCompression, []byte(dictionary))
-		testFileLevelDictReset(t, fn, DefaultCompression, []byte(dictionary))
-		if !testing.Short() {
-			for level := BestSpeed; level <= BestCompression; level++ {
-				testFileLevelDictReset(t, fn, level, nil)
-			}
-		}
-	}
-}
-
-func TestWriterDictIsUsed(t *testing.T) {
-	var input = []byte("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.")
-	var buf bytes.Buffer
-	compressor, err := NewWriterLevelDict(&buf, BestCompression, input)
-	if err != nil {
-		t.Errorf("error in NewWriterLevelDict: %s", err)
-		return
-	}
-	compressor.Write(input)
-	compressor.Close()
-	const expectedMaxSize = 25
-	output := buf.Bytes()
-	if len(output) > expectedMaxSize {
-		t.Errorf("result too large (got %d, want <= %d bytes). Is the dictionary being used?", len(output), expectedMaxSize)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/container/heap/heap.go b/third_party/gofrontend/libgo/go/container/heap/heap.go
deleted file mode 100644
index c467a11..0000000
--- a/third_party/gofrontend/libgo/go/container/heap/heap.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package heap provides heap operations for any type that implements
-// heap.Interface. A heap is a tree with the property that each node is the
-// minimum-valued node in its subtree.
-//
-// The minimum element in the tree is the root, at index 0.
-//
-// A heap is a common way to implement a priority queue. To build a priority
-// queue, implement the Heap interface with the (negative) priority as the
-// ordering for the Less method, so Push adds items while Pop removes the
-// highest-priority item from the queue. The Examples include such an
-// implementation; the file example_pq_test.go has the complete source.
-//
-package heap
-
-import "sort"
-
-// Any type that implements heap.Interface may be used as a
-// min-heap with the following invariants (established after
-// Init has been called or if the data is empty or sorted):
-//
-//	!h.Less(j, i) for 0 <= i < h.Len() and 2*i+1 <= j <= 2*i+2 and j < h.Len()
-//
-// Note that Push and Pop in this interface are for package heap's
-// implementation to call.  To add and remove things from the heap,
-// use heap.Push and heap.Pop.
-type Interface interface {
-	sort.Interface
-	Push(x interface{}) // add x as element Len()
-	Pop() interface{}   // remove and return element Len() - 1.
-}
-
-// A heap must be initialized before any of the heap operations
-// can be used. Init is idempotent with respect to the heap invariants
-// and may be called whenever the heap invariants may have been invalidated.
-// Its complexity is O(n) where n = h.Len().
-//
-func Init(h Interface) {
-	// heapify
-	n := h.Len()
-	for i := n/2 - 1; i >= 0; i-- {
-		down(h, i, n)
-	}
-}
-
-// Push pushes the element x onto the heap. The complexity is
-// O(log(n)) where n = h.Len().
-//
-func Push(h Interface, x interface{}) {
-	h.Push(x)
-	up(h, h.Len()-1)
-}
-
-// Pop removes the minimum element (according to Less) from the heap
-// and returns it. The complexity is O(log(n)) where n = h.Len().
-// It is equivalent to Remove(h, 0).
-//
-func Pop(h Interface) interface{} {
-	n := h.Len() - 1
-	h.Swap(0, n)
-	down(h, 0, n)
-	return h.Pop()
-}
-
-// Remove removes the element at index i from the heap.
-// The complexity is O(log(n)) where n = h.Len().
-//
-func Remove(h Interface, i int) interface{} {
-	n := h.Len() - 1
-	if n != i {
-		h.Swap(i, n)
-		down(h, i, n)
-		up(h, i)
-	}
-	return h.Pop()
-}
-
-// Fix re-establishes the heap ordering after the element at index i has changed its value.
-// Changing the value of the element at index i and then calling Fix is equivalent to,
-// but less expensive than, calling Remove(h, i) followed by a Push of the new value.
-// The complexity is O(log(n)) where n = h.Len().
-func Fix(h Interface, i int) {
-	down(h, i, h.Len())
-	up(h, i)
-}
-
-func up(h Interface, j int) {
-	for {
-		i := (j - 1) / 2 // parent
-		if i == j || !h.Less(j, i) {
-			break
-		}
-		h.Swap(i, j)
-		j = i
-	}
-}
-
-func down(h Interface, i, n int) {
-	for {
-		j1 := 2*i + 1
-		if j1 >= n || j1 < 0 { // j1 < 0 after int overflow
-			break
-		}
-		j := j1 // left child
-		if j2 := j1 + 1; j2 < n && !h.Less(j1, j2) {
-			j = j2 // = 2*i + 2  // right child
-		}
-		if !h.Less(j, i) {
-			break
-		}
-		h.Swap(i, j)
-		i = j
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/container/heap/heap_test.go b/third_party/gofrontend/libgo/go/container/heap/heap_test.go
deleted file mode 100644
index b3d054c..0000000
--- a/third_party/gofrontend/libgo/go/container/heap/heap_test.go
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package heap
-
-import (
-	"math/rand"
-	"testing"
-)
-
-type myHeap []int
-
-func (h *myHeap) Less(i, j int) bool {
-	return (*h)[i] < (*h)[j]
-}
-
-func (h *myHeap) Swap(i, j int) {
-	(*h)[i], (*h)[j] = (*h)[j], (*h)[i]
-}
-
-func (h *myHeap) Len() int {
-	return len(*h)
-}
-
-func (h *myHeap) Pop() (v interface{}) {
-	*h, v = (*h)[:h.Len()-1], (*h)[h.Len()-1]
-	return
-}
-
-func (h *myHeap) Push(v interface{}) {
-	*h = append(*h, v.(int))
-}
-
-func (h myHeap) verify(t *testing.T, i int) {
-	n := h.Len()
-	j1 := 2*i + 1
-	j2 := 2*i + 2
-	if j1 < n {
-		if h.Less(j1, i) {
-			t.Errorf("heap invariant invalidated [%d] = %d > [%d] = %d", i, h[i], j1, h[j1])
-			return
-		}
-		h.verify(t, j1)
-	}
-	if j2 < n {
-		if h.Less(j2, i) {
-			t.Errorf("heap invariant invalidated [%d] = %d > [%d] = %d", i, h[i], j1, h[j2])
-			return
-		}
-		h.verify(t, j2)
-	}
-}
-
-func TestInit0(t *testing.T) {
-	h := new(myHeap)
-	for i := 20; i > 0; i-- {
-		h.Push(0) // all elements are the same
-	}
-	Init(h)
-	h.verify(t, 0)
-
-	for i := 1; h.Len() > 0; i++ {
-		x := Pop(h).(int)
-		h.verify(t, 0)
-		if x != 0 {
-			t.Errorf("%d.th pop got %d; want %d", i, x, 0)
-		}
-	}
-}
-
-func TestInit1(t *testing.T) {
-	h := new(myHeap)
-	for i := 20; i > 0; i-- {
-		h.Push(i) // all elements are different
-	}
-	Init(h)
-	h.verify(t, 0)
-
-	for i := 1; h.Len() > 0; i++ {
-		x := Pop(h).(int)
-		h.verify(t, 0)
-		if x != i {
-			t.Errorf("%d.th pop got %d; want %d", i, x, i)
-		}
-	}
-}
-
-func Test(t *testing.T) {
-	h := new(myHeap)
-	h.verify(t, 0)
-
-	for i := 20; i > 10; i-- {
-		h.Push(i)
-	}
-	Init(h)
-	h.verify(t, 0)
-
-	for i := 10; i > 0; i-- {
-		Push(h, i)
-		h.verify(t, 0)
-	}
-
-	for i := 1; h.Len() > 0; i++ {
-		x := Pop(h).(int)
-		if i < 20 {
-			Push(h, 20+i)
-		}
-		h.verify(t, 0)
-		if x != i {
-			t.Errorf("%d.th pop got %d; want %d", i, x, i)
-		}
-	}
-}
-
-func TestRemove0(t *testing.T) {
-	h := new(myHeap)
-	for i := 0; i < 10; i++ {
-		h.Push(i)
-	}
-	h.verify(t, 0)
-
-	for h.Len() > 0 {
-		i := h.Len() - 1
-		x := Remove(h, i).(int)
-		if x != i {
-			t.Errorf("Remove(%d) got %d; want %d", i, x, i)
-		}
-		h.verify(t, 0)
-	}
-}
-
-func TestRemove1(t *testing.T) {
-	h := new(myHeap)
-	for i := 0; i < 10; i++ {
-		h.Push(i)
-	}
-	h.verify(t, 0)
-
-	for i := 0; h.Len() > 0; i++ {
-		x := Remove(h, 0).(int)
-		if x != i {
-			t.Errorf("Remove(0) got %d; want %d", x, i)
-		}
-		h.verify(t, 0)
-	}
-}
-
-func TestRemove2(t *testing.T) {
-	N := 10
-
-	h := new(myHeap)
-	for i := 0; i < N; i++ {
-		h.Push(i)
-	}
-	h.verify(t, 0)
-
-	m := make(map[int]bool)
-	for h.Len() > 0 {
-		m[Remove(h, (h.Len()-1)/2).(int)] = true
-		h.verify(t, 0)
-	}
-
-	if len(m) != N {
-		t.Errorf("len(m) = %d; want %d", len(m), N)
-	}
-	for i := 0; i < len(m); i++ {
-		if !m[i] {
-			t.Errorf("m[%d] doesn't exist", i)
-		}
-	}
-}
-
-func BenchmarkDup(b *testing.B) {
-	const n = 10000
-	h := make(myHeap, n)
-	for i := 0; i < b.N; i++ {
-		for j := 0; j < n; j++ {
-			Push(&h, 0) // all elements are the same
-		}
-		for h.Len() > 0 {
-			Pop(&h)
-		}
-	}
-}
-
-func TestFix(t *testing.T) {
-	h := new(myHeap)
-	h.verify(t, 0)
-
-	for i := 200; i > 0; i -= 10 {
-		Push(h, i)
-	}
-	h.verify(t, 0)
-
-	if (*h)[0] != 10 {
-		t.Fatalf("Expected head to be 10, was %d", (*h)[0])
-	}
-	(*h)[0] = 210
-	Fix(h, 0)
-	h.verify(t, 0)
-
-	for i := 100; i > 0; i-- {
-		elem := rand.Intn(h.Len())
-		if i&1 == 0 {
-			(*h)[elem] *= 2
-		} else {
-			(*h)[elem] /= 2
-		}
-		Fix(h, elem)
-		h.verify(t, 0)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/container/list/list.go b/third_party/gofrontend/libgo/go/container/list/list.go
deleted file mode 100644
index 0256768..0000000
--- a/third_party/gofrontend/libgo/go/container/list/list.go
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package list implements a doubly linked list.
-//
-// To iterate over a list (where l is a *List):
-//	for e := l.Front(); e != nil; e = e.Next() {
-//		// do something with e.Value
-//	}
-//
-package list
-
-// Element is an element of a linked list.
-type Element struct {
-	// Next and previous pointers in the doubly-linked list of elements.
-	// To simplify the implementation, internally a list l is implemented
-	// as a ring, such that &l.root is both the next element of the last
-	// list element (l.Back()) and the previous element of the first list
-	// element (l.Front()).
-	next, prev *Element
-
-	// The list to which this element belongs.
-	list *List
-
-	// The value stored with this element.
-	Value interface{}
-}
-
-// Next returns the next list element or nil.
-func (e *Element) Next() *Element {
-	if p := e.next; e.list != nil && p != &e.list.root {
-		return p
-	}
-	return nil
-}
-
-// Prev returns the previous list element or nil.
-func (e *Element) Prev() *Element {
-	if p := e.prev; e.list != nil && p != &e.list.root {
-		return p
-	}
-	return nil
-}
-
-// List represents a doubly linked list.
-// The zero value for List is an empty list ready to use.
-type List struct {
-	root Element // sentinel list element, only &root, root.prev, and root.next are used
-	len  int     // current list length excluding (this) sentinel element
-}
-
-// Init initializes or clears list l.
-func (l *List) Init() *List {
-	l.root.next = &l.root
-	l.root.prev = &l.root
-	l.len = 0
-	return l
-}
-
-// New returns an initialized list.
-func New() *List { return new(List).Init() }
-
-// Len returns the number of elements of list l.
-// The complexity is O(1).
-func (l *List) Len() int { return l.len }
-
-// Front returns the first element of list l or nil.
-func (l *List) Front() *Element {
-	if l.len == 0 {
-		return nil
-	}
-	return l.root.next
-}
-
-// Back returns the last element of list l or nil.
-func (l *List) Back() *Element {
-	if l.len == 0 {
-		return nil
-	}
-	return l.root.prev
-}
-
-// lazyInit lazily initializes a zero List value.
-func (l *List) lazyInit() {
-	if l.root.next == nil {
-		l.Init()
-	}
-}
-
-// insert inserts e after at, increments l.len, and returns e.
-func (l *List) insert(e, at *Element) *Element {
-	n := at.next
-	at.next = e
-	e.prev = at
-	e.next = n
-	n.prev = e
-	e.list = l
-	l.len++
-	return e
-}
-
-// insertValue is a convenience wrapper for insert(&Element{Value: v}, at).
-func (l *List) insertValue(v interface{}, at *Element) *Element {
-	return l.insert(&Element{Value: v}, at)
-}
-
-// remove removes e from its list, decrements l.len, and returns e.
-func (l *List) remove(e *Element) *Element {
-	e.prev.next = e.next
-	e.next.prev = e.prev
-	e.next = nil // avoid memory leaks
-	e.prev = nil // avoid memory leaks
-	e.list = nil
-	l.len--
-	return e
-}
-
-// Remove removes e from l if e is an element of list l.
-// It returns the element value e.Value.
-func (l *List) Remove(e *Element) interface{} {
-	if e.list == l {
-		// if e.list == l, l must have been initialized when e was inserted
-		// in l or l == nil (e is a zero Element) and l.remove will crash
-		l.remove(e)
-	}
-	return e.Value
-}
-
-// PushFront inserts a new element e with value v at the front of list l and returns e.
-func (l *List) PushFront(v interface{}) *Element {
-	l.lazyInit()
-	return l.insertValue(v, &l.root)
-}
-
-// PushBack inserts a new element e with value v at the back of list l and returns e.
-func (l *List) PushBack(v interface{}) *Element {
-	l.lazyInit()
-	return l.insertValue(v, l.root.prev)
-}
-
-// InsertBefore inserts a new element e with value v immediately before mark and returns e.
-// If mark is not an element of l, the list is not modified.
-func (l *List) InsertBefore(v interface{}, mark *Element) *Element {
-	if mark.list != l {
-		return nil
-	}
-	// see comment in List.Remove about initialization of l
-	return l.insertValue(v, mark.prev)
-}
-
-// InsertAfter inserts a new element e with value v immediately after mark and returns e.
-// If mark is not an element of l, the list is not modified.
-func (l *List) InsertAfter(v interface{}, mark *Element) *Element {
-	if mark.list != l {
-		return nil
-	}
-	// see comment in List.Remove about initialization of l
-	return l.insertValue(v, mark)
-}
-
-// MoveToFront moves element e to the front of list l.
-// If e is not an element of l, the list is not modified.
-func (l *List) MoveToFront(e *Element) {
-	if e.list != l || l.root.next == e {
-		return
-	}
-	// see comment in List.Remove about initialization of l
-	l.insert(l.remove(e), &l.root)
-}
-
-// MoveToBack moves element e to the back of list l.
-// If e is not an element of l, the list is not modified.
-func (l *List) MoveToBack(e *Element) {
-	if e.list != l || l.root.prev == e {
-		return
-	}
-	// see comment in List.Remove about initialization of l
-	l.insert(l.remove(e), l.root.prev)
-}
-
-// MoveBefore moves element e to its new position before mark.
-// If e or mark is not an element of l, or e == mark, the list is not modified.
-func (l *List) MoveBefore(e, mark *Element) {
-	if e.list != l || e == mark || mark.list != l {
-		return
-	}
-	l.insert(l.remove(e), mark.prev)
-}
-
-// MoveAfter moves element e to its new position after mark.
-// If e or mark is not an element of l, or e == mark, the list is not modified.
-func (l *List) MoveAfter(e, mark *Element) {
-	if e.list != l || e == mark || mark.list != l {
-		return
-	}
-	l.insert(l.remove(e), mark)
-}
-
-// PushBackList inserts a copy of an other list at the back of list l.
-// The lists l and other may be the same.
-func (l *List) PushBackList(other *List) {
-	l.lazyInit()
-	for i, e := other.Len(), other.Front(); i > 0; i, e = i-1, e.Next() {
-		l.insertValue(e.Value, l.root.prev)
-	}
-}
-
-// PushFrontList inserts a copy of an other list at the front of list l.
-// The lists l and other may be the same.
-func (l *List) PushFrontList(other *List) {
-	l.lazyInit()
-	for i, e := other.Len(), other.Back(); i > 0; i, e = i-1, e.Prev() {
-		l.insertValue(e.Value, &l.root)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/container/list/list_test.go b/third_party/gofrontend/libgo/go/container/list/list_test.go
deleted file mode 100644
index 4d8bfc2..0000000
--- a/third_party/gofrontend/libgo/go/container/list/list_test.go
+++ /dev/null
@@ -1,343 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package list
-
-import "testing"
-
-func checkListLen(t *testing.T, l *List, len int) bool {
-	if n := l.Len(); n != len {
-		t.Errorf("l.Len() = %d, want %d", n, len)
-		return false
-	}
-	return true
-}
-
-func checkListPointers(t *testing.T, l *List, es []*Element) {
-	root := &l.root
-
-	if !checkListLen(t, l, len(es)) {
-		return
-	}
-
-	// zero length lists must be the zero value or properly initialized (sentinel circle)
-	if len(es) == 0 {
-		if l.root.next != nil && l.root.next != root || l.root.prev != nil && l.root.prev != root {
-			t.Errorf("l.root.next = %p, l.root.prev = %p; both should both be nil or %p", l.root.next, l.root.prev, root)
-		}
-		return
-	}
-	// len(es) > 0
-
-	// check internal and external prev/next connections
-	for i, e := range es {
-		prev := root
-		Prev := (*Element)(nil)
-		if i > 0 {
-			prev = es[i-1]
-			Prev = prev
-		}
-		if p := e.prev; p != prev {
-			t.Errorf("elt[%d](%p).prev = %p, want %p", i, e, p, prev)
-		}
-		if p := e.Prev(); p != Prev {
-			t.Errorf("elt[%d](%p).Prev() = %p, want %p", i, e, p, Prev)
-		}
-
-		next := root
-		Next := (*Element)(nil)
-		if i < len(es)-1 {
-			next = es[i+1]
-			Next = next
-		}
-		if n := e.next; n != next {
-			t.Errorf("elt[%d](%p).next = %p, want %p", i, e, n, next)
-		}
-		if n := e.Next(); n != Next {
-			t.Errorf("elt[%d](%p).Next() = %p, want %p", i, e, n, Next)
-		}
-	}
-}
-
-func TestList(t *testing.T) {
-	l := New()
-	checkListPointers(t, l, []*Element{})
-
-	// Single element list
-	e := l.PushFront("a")
-	checkListPointers(t, l, []*Element{e})
-	l.MoveToFront(e)
-	checkListPointers(t, l, []*Element{e})
-	l.MoveToBack(e)
-	checkListPointers(t, l, []*Element{e})
-	l.Remove(e)
-	checkListPointers(t, l, []*Element{})
-
-	// Bigger list
-	e2 := l.PushFront(2)
-	e1 := l.PushFront(1)
-	e3 := l.PushBack(3)
-	e4 := l.PushBack("banana")
-	checkListPointers(t, l, []*Element{e1, e2, e3, e4})
-
-	l.Remove(e2)
-	checkListPointers(t, l, []*Element{e1, e3, e4})
-
-	l.MoveToFront(e3) // move from middle
-	checkListPointers(t, l, []*Element{e3, e1, e4})
-
-	l.MoveToFront(e1)
-	l.MoveToBack(e3) // move from middle
-	checkListPointers(t, l, []*Element{e1, e4, e3})
-
-	l.MoveToFront(e3) // move from back
-	checkListPointers(t, l, []*Element{e3, e1, e4})
-	l.MoveToFront(e3) // should be no-op
-	checkListPointers(t, l, []*Element{e3, e1, e4})
-
-	l.MoveToBack(e3) // move from front
-	checkListPointers(t, l, []*Element{e1, e4, e3})
-	l.MoveToBack(e3) // should be no-op
-	checkListPointers(t, l, []*Element{e1, e4, e3})
-
-	e2 = l.InsertBefore(2, e1) // insert before front
-	checkListPointers(t, l, []*Element{e2, e1, e4, e3})
-	l.Remove(e2)
-	e2 = l.InsertBefore(2, e4) // insert before middle
-	checkListPointers(t, l, []*Element{e1, e2, e4, e3})
-	l.Remove(e2)
-	e2 = l.InsertBefore(2, e3) // insert before back
-	checkListPointers(t, l, []*Element{e1, e4, e2, e3})
-	l.Remove(e2)
-
-	e2 = l.InsertAfter(2, e1) // insert after front
-	checkListPointers(t, l, []*Element{e1, e2, e4, e3})
-	l.Remove(e2)
-	e2 = l.InsertAfter(2, e4) // insert after middle
-	checkListPointers(t, l, []*Element{e1, e4, e2, e3})
-	l.Remove(e2)
-	e2 = l.InsertAfter(2, e3) // insert after back
-	checkListPointers(t, l, []*Element{e1, e4, e3, e2})
-	l.Remove(e2)
-
-	// Check standard iteration.
-	sum := 0
-	for e := l.Front(); e != nil; e = e.Next() {
-		if i, ok := e.Value.(int); ok {
-			sum += i
-		}
-	}
-	if sum != 4 {
-		t.Errorf("sum over l = %d, want 4", sum)
-	}
-
-	// Clear all elements by iterating
-	var next *Element
-	for e := l.Front(); e != nil; e = next {
-		next = e.Next()
-		l.Remove(e)
-	}
-	checkListPointers(t, l, []*Element{})
-}
-
-func checkList(t *testing.T, l *List, es []interface{}) {
-	if !checkListLen(t, l, len(es)) {
-		return
-	}
-
-	i := 0
-	for e := l.Front(); e != nil; e = e.Next() {
-		le := e.Value.(int)
-		if le != es[i] {
-			t.Errorf("elt[%d].Value = %v, want %v", i, le, es[i])
-		}
-		i++
-	}
-}
-
-func TestExtending(t *testing.T) {
-	l1 := New()
-	l2 := New()
-
-	l1.PushBack(1)
-	l1.PushBack(2)
-	l1.PushBack(3)
-
-	l2.PushBack(4)
-	l2.PushBack(5)
-
-	l3 := New()
-	l3.PushBackList(l1)
-	checkList(t, l3, []interface{}{1, 2, 3})
-	l3.PushBackList(l2)
-	checkList(t, l3, []interface{}{1, 2, 3, 4, 5})
-
-	l3 = New()
-	l3.PushFrontList(l2)
-	checkList(t, l3, []interface{}{4, 5})
-	l3.PushFrontList(l1)
-	checkList(t, l3, []interface{}{1, 2, 3, 4, 5})
-
-	checkList(t, l1, []interface{}{1, 2, 3})
-	checkList(t, l2, []interface{}{4, 5})
-
-	l3 = New()
-	l3.PushBackList(l1)
-	checkList(t, l3, []interface{}{1, 2, 3})
-	l3.PushBackList(l3)
-	checkList(t, l3, []interface{}{1, 2, 3, 1, 2, 3})
-
-	l3 = New()
-	l3.PushFrontList(l1)
-	checkList(t, l3, []interface{}{1, 2, 3})
-	l3.PushFrontList(l3)
-	checkList(t, l3, []interface{}{1, 2, 3, 1, 2, 3})
-
-	l3 = New()
-	l1.PushBackList(l3)
-	checkList(t, l1, []interface{}{1, 2, 3})
-	l1.PushFrontList(l3)
-	checkList(t, l1, []interface{}{1, 2, 3})
-}
-
-func TestRemove(t *testing.T) {
-	l := New()
-	e1 := l.PushBack(1)
-	e2 := l.PushBack(2)
-	checkListPointers(t, l, []*Element{e1, e2})
-	e := l.Front()
-	l.Remove(e)
-	checkListPointers(t, l, []*Element{e2})
-	l.Remove(e)
-	checkListPointers(t, l, []*Element{e2})
-}
-
-func TestIssue4103(t *testing.T) {
-	l1 := New()
-	l1.PushBack(1)
-	l1.PushBack(2)
-
-	l2 := New()
-	l2.PushBack(3)
-	l2.PushBack(4)
-
-	e := l1.Front()
-	l2.Remove(e) // l2 should not change because e is not an element of l2
-	if n := l2.Len(); n != 2 {
-		t.Errorf("l2.Len() = %d, want 2", n)
-	}
-
-	l1.InsertBefore(8, e)
-	if n := l1.Len(); n != 3 {
-		t.Errorf("l1.Len() = %d, want 3", n)
-	}
-}
-
-func TestIssue6349(t *testing.T) {
-	l := New()
-	l.PushBack(1)
-	l.PushBack(2)
-
-	e := l.Front()
-	l.Remove(e)
-	if e.Value != 1 {
-		t.Errorf("e.value = %d, want 1", e.Value)
-	}
-	if e.Next() != nil {
-		t.Errorf("e.Next() != nil")
-	}
-	if e.Prev() != nil {
-		t.Errorf("e.Prev() != nil")
-	}
-}
-
-func TestMove(t *testing.T) {
-	l := New()
-	e1 := l.PushBack(1)
-	e2 := l.PushBack(2)
-	e3 := l.PushBack(3)
-	e4 := l.PushBack(4)
-
-	l.MoveAfter(e3, e3)
-	checkListPointers(t, l, []*Element{e1, e2, e3, e4})
-	l.MoveBefore(e2, e2)
-	checkListPointers(t, l, []*Element{e1, e2, e3, e4})
-
-	l.MoveAfter(e3, e2)
-	checkListPointers(t, l, []*Element{e1, e2, e3, e4})
-	l.MoveBefore(e2, e3)
-	checkListPointers(t, l, []*Element{e1, e2, e3, e4})
-
-	l.MoveBefore(e2, e4)
-	checkListPointers(t, l, []*Element{e1, e3, e2, e4})
-	e1, e2, e3, e4 = e1, e3, e2, e4
-
-	l.MoveBefore(e4, e1)
-	checkListPointers(t, l, []*Element{e4, e1, e2, e3})
-	e1, e2, e3, e4 = e4, e1, e2, e3
-
-	l.MoveAfter(e4, e1)
-	checkListPointers(t, l, []*Element{e1, e4, e2, e3})
-	e1, e2, e3, e4 = e1, e4, e2, e3
-
-	l.MoveAfter(e2, e3)
-	checkListPointers(t, l, []*Element{e1, e3, e2, e4})
-	e1, e2, e3, e4 = e1, e3, e2, e4
-}
-
-// Test PushFront, PushBack, PushFrontList, PushBackList with uninitialized List
-func TestZeroList(t *testing.T) {
-	var l1 = new(List)
-	l1.PushFront(1)
-	checkList(t, l1, []interface{}{1})
-
-	var l2 = new(List)
-	l2.PushBack(1)
-	checkList(t, l2, []interface{}{1})
-
-	var l3 = new(List)
-	l3.PushFrontList(l1)
-	checkList(t, l3, []interface{}{1})
-
-	var l4 = new(List)
-	l4.PushBackList(l2)
-	checkList(t, l4, []interface{}{1})
-}
-
-// Test that a list l is not modified when calling InsertBefore with a mark that is not an element of l.
-func TestInsertBeforeUnknownMark(t *testing.T) {
-	var l List
-	l.PushBack(1)
-	l.PushBack(2)
-	l.PushBack(3)
-	l.InsertBefore(1, new(Element))
-	checkList(t, &l, []interface{}{1, 2, 3})
-}
-
-// Test that a list l is not modified when calling InsertAfter with a mark that is not an element of l.
-func TestInsertAfterUnknownMark(t *testing.T) {
-	var l List
-	l.PushBack(1)
-	l.PushBack(2)
-	l.PushBack(3)
-	l.InsertAfter(1, new(Element))
-	checkList(t, &l, []interface{}{1, 2, 3})
-}
-
-// Test that a list l is not modified when calling MoveAfter or MoveBefore with a mark that is not an element of l.
-func TestMoveUnkownMark(t *testing.T) {
-	var l1 List
-	e1 := l1.PushBack(1)
-
-	var l2 List
-	e2 := l2.PushBack(2)
-
-	l1.MoveAfter(e1, e2)
-	checkList(t, &l1, []interface{}{1})
-	checkList(t, &l2, []interface{}{2})
-
-	l1.MoveBefore(e1, e2)
-	checkList(t, &l1, []interface{}{1})
-	checkList(t, &l2, []interface{}{2})
-}
diff --git a/third_party/gofrontend/libgo/go/container/ring/ring.go b/third_party/gofrontend/libgo/go/container/ring/ring.go
deleted file mode 100644
index 6d3b3e5..0000000
--- a/third_party/gofrontend/libgo/go/container/ring/ring.go
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package ring implements operations on circular lists.
-package ring
-
-// A Ring is an element of a circular list, or ring.
-// Rings do not have a beginning or end; a pointer to any ring element
-// serves as reference to the entire ring. Empty rings are represented
-// as nil Ring pointers. The zero value for a Ring is a one-element
-// ring with a nil Value.
-//
-type Ring struct {
-	next, prev *Ring
-	Value      interface{} // for use by client; untouched by this library
-}
-
-func (r *Ring) init() *Ring {
-	r.next = r
-	r.prev = r
-	return r
-}
-
-// Next returns the next ring element. r must not be empty.
-func (r *Ring) Next() *Ring {
-	if r.next == nil {
-		return r.init()
-	}
-	return r.next
-}
-
-// Prev returns the previous ring element. r must not be empty.
-func (r *Ring) Prev() *Ring {
-	if r.next == nil {
-		return r.init()
-	}
-	return r.prev
-}
-
-// Move moves n % r.Len() elements backward (n < 0) or forward (n >= 0)
-// in the ring and returns that ring element. r must not be empty.
-//
-func (r *Ring) Move(n int) *Ring {
-	if r.next == nil {
-		return r.init()
-	}
-	switch {
-	case n < 0:
-		for ; n < 0; n++ {
-			r = r.prev
-		}
-	case n > 0:
-		for ; n > 0; n-- {
-			r = r.next
-		}
-	}
-	return r
-}
-
-// New creates a ring of n elements.
-func New(n int) *Ring {
-	if n <= 0 {
-		return nil
-	}
-	r := new(Ring)
-	p := r
-	for i := 1; i < n; i++ {
-		p.next = &Ring{prev: p}
-		p = p.next
-	}
-	p.next = r
-	r.prev = p
-	return r
-}
-
-// Link connects ring r with ring s such that r.Next()
-// becomes s and returns the original value for r.Next().
-// r must not be empty.
-//
-// If r and s point to the same ring, linking
-// them removes the elements between r and s from the ring.
-// The removed elements form a subring and the result is a
-// reference to that subring (if no elements were removed,
-// the result is still the original value for r.Next(),
-// and not nil).
-//
-// If r and s point to different rings, linking
-// them creates a single ring with the elements of s inserted
-// after r. The result points to the element following the
-// last element of s after insertion.
-//
-func (r *Ring) Link(s *Ring) *Ring {
-	n := r.Next()
-	if s != nil {
-		p := s.Prev()
-		// Note: Cannot use multiple assignment because
-		// evaluation order of LHS is not specified.
-		r.next = s
-		s.prev = r
-		n.prev = p
-		p.next = n
-	}
-	return n
-}
-
-// Unlink removes n % r.Len() elements from the ring r, starting
-// at r.Next(). If n % r.Len() == 0, r remains unchanged.
-// The result is the removed subring. r must not be empty.
-//
-func (r *Ring) Unlink(n int) *Ring {
-	if n <= 0 {
-		return nil
-	}
-	return r.Link(r.Move(n + 1))
-}
-
-// Len computes the number of elements in ring r.
-// It executes in time proportional to the number of elements.
-//
-func (r *Ring) Len() int {
-	n := 0
-	if r != nil {
-		n = 1
-		for p := r.Next(); p != r; p = p.next {
-			n++
-		}
-	}
-	return n
-}
-
-// Do calls function f on each element of the ring, in forward order.
-// The behavior of Do is undefined if f changes *r.
-func (r *Ring) Do(f func(interface{})) {
-	if r != nil {
-		f(r.Value)
-		for p := r.Next(); p != r; p = p.next {
-			f(p.Value)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/container/ring/ring_test.go b/third_party/gofrontend/libgo/go/container/ring/ring_test.go
deleted file mode 100644
index 552f0e2..0000000
--- a/third_party/gofrontend/libgo/go/container/ring/ring_test.go
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ring
-
-import (
-	"fmt"
-	"testing"
-)
-
-// For debugging - keep around.
-func dump(r *Ring) {
-	if r == nil {
-		fmt.Println("empty")
-		return
-	}
-	i, n := 0, r.Len()
-	for p := r; i < n; p = p.next {
-		fmt.Printf("%4d: %p = {<- %p | %p ->}\n", i, p, p.prev, p.next)
-		i++
-	}
-	fmt.Println()
-}
-
-func verify(t *testing.T, r *Ring, N int, sum int) {
-	// Len
-	n := r.Len()
-	if n != N {
-		t.Errorf("r.Len() == %d; expected %d", n, N)
-	}
-
-	// iteration
-	n = 0
-	s := 0
-	r.Do(func(p interface{}) {
-		n++
-		if p != nil {
-			s += p.(int)
-		}
-	})
-	if n != N {
-		t.Errorf("number of forward iterations == %d; expected %d", n, N)
-	}
-	if sum >= 0 && s != sum {
-		t.Errorf("forward ring sum = %d; expected %d", s, sum)
-	}
-
-	if r == nil {
-		return
-	}
-
-	// connections
-	if r.next != nil {
-		var p *Ring // previous element
-		for q := r; p == nil || q != r; q = q.next {
-			if p != nil && p != q.prev {
-				t.Errorf("prev = %p, expected q.prev = %p\n", p, q.prev)
-			}
-			p = q
-		}
-		if p != r.prev {
-			t.Errorf("prev = %p, expected r.prev = %p\n", p, r.prev)
-		}
-	}
-
-	// Next, Prev
-	if r.Next() != r.next {
-		t.Errorf("r.Next() != r.next")
-	}
-	if r.Prev() != r.prev {
-		t.Errorf("r.Prev() != r.prev")
-	}
-
-	// Move
-	if r.Move(0) != r {
-		t.Errorf("r.Move(0) != r")
-	}
-	if r.Move(N) != r {
-		t.Errorf("r.Move(%d) != r", N)
-	}
-	if r.Move(-N) != r {
-		t.Errorf("r.Move(%d) != r", -N)
-	}
-	for i := 0; i < 10; i++ {
-		ni := N + i
-		mi := ni % N
-		if r.Move(ni) != r.Move(mi) {
-			t.Errorf("r.Move(%d) != r.Move(%d)", ni, mi)
-		}
-		if r.Move(-ni) != r.Move(-mi) {
-			t.Errorf("r.Move(%d) != r.Move(%d)", -ni, -mi)
-		}
-	}
-}
-
-func TestCornerCases(t *testing.T) {
-	var (
-		r0 *Ring
-		r1 Ring
-	)
-	// Basics
-	verify(t, r0, 0, 0)
-	verify(t, &r1, 1, 0)
-	// Insert
-	r1.Link(r0)
-	verify(t, r0, 0, 0)
-	verify(t, &r1, 1, 0)
-	// Insert
-	r1.Link(r0)
-	verify(t, r0, 0, 0)
-	verify(t, &r1, 1, 0)
-	// Unlink
-	r1.Unlink(0)
-	verify(t, &r1, 1, 0)
-}
-
-func makeN(n int) *Ring {
-	r := New(n)
-	for i := 1; i <= n; i++ {
-		r.Value = i
-		r = r.Next()
-	}
-	return r
-}
-
-func sumN(n int) int { return (n*n + n) / 2 }
-
-func TestNew(t *testing.T) {
-	for i := 0; i < 10; i++ {
-		r := New(i)
-		verify(t, r, i, -1)
-	}
-	for i := 0; i < 10; i++ {
-		r := makeN(i)
-		verify(t, r, i, sumN(i))
-	}
-}
-
-func TestLink1(t *testing.T) {
-	r1a := makeN(1)
-	var r1b Ring
-	r2a := r1a.Link(&r1b)
-	verify(t, r2a, 2, 1)
-	if r2a != r1a {
-		t.Errorf("a) 2-element link failed")
-	}
-
-	r2b := r2a.Link(r2a.Next())
-	verify(t, r2b, 2, 1)
-	if r2b != r2a.Next() {
-		t.Errorf("b) 2-element link failed")
-	}
-
-	r1c := r2b.Link(r2b)
-	verify(t, r1c, 1, 1)
-	verify(t, r2b, 1, 0)
-}
-
-func TestLink2(t *testing.T) {
-	var r0 *Ring
-	r1a := &Ring{Value: 42}
-	r1b := &Ring{Value: 77}
-	r10 := makeN(10)
-
-	r1a.Link(r0)
-	verify(t, r1a, 1, 42)
-
-	r1a.Link(r1b)
-	verify(t, r1a, 2, 42+77)
-
-	r10.Link(r0)
-	verify(t, r10, 10, sumN(10))
-
-	r10.Link(r1a)
-	verify(t, r10, 12, sumN(10)+42+77)
-}
-
-func TestLink3(t *testing.T) {
-	var r Ring
-	n := 1
-	for i := 1; i < 100; i++ {
-		n += i
-		verify(t, r.Link(New(i)), n, -1)
-	}
-}
-
-func TestUnlink(t *testing.T) {
-	r10 := makeN(10)
-	s10 := r10.Move(6)
-
-	sum10 := sumN(10)
-
-	verify(t, r10, 10, sum10)
-	verify(t, s10, 10, sum10)
-
-	r0 := r10.Unlink(0)
-	verify(t, r0, 0, 0)
-
-	r1 := r10.Unlink(1)
-	verify(t, r1, 1, 2)
-	verify(t, r10, 9, sum10-2)
-
-	r9 := r10.Unlink(9)
-	verify(t, r9, 9, sum10-2)
-	verify(t, r10, 9, sum10-2)
-}
-
-func TestLinkUnlink(t *testing.T) {
-	for i := 1; i < 4; i++ {
-		ri := New(i)
-		for j := 0; j < i; j++ {
-			rj := ri.Unlink(j)
-			verify(t, rj, j, -1)
-			verify(t, ri, i-j, -1)
-			ri.Link(rj)
-			verify(t, ri, i, -1)
-		}
-	}
-}
-
-// Test that calling Move() on an empty Ring initializes it.
-func TestMoveEmptyRing(t *testing.T) {
-	var r Ring
-
-	r.Move(1)
-	verify(t, &r, 1, 0)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/aes/aes_test.go b/third_party/gofrontend/libgo/go/crypto/aes/aes_test.go
deleted file mode 100644
index 3631809..0000000
--- a/third_party/gofrontend/libgo/go/crypto/aes/aes_test.go
+++ /dev/null
@@ -1,421 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package aes
-
-import (
-	"testing"
-)
-
-// See const.go for overview of math here.
-
-// Test that powx is initialized correctly.
-// (Can adapt this code to generate it too.)
-func TestPowx(t *testing.T) {
-	p := 1
-	for i := 0; i < len(powx); i++ {
-		if powx[i] != byte(p) {
-			t.Errorf("powx[%d] = %#x, want %#x", i, powx[i], p)
-		}
-		p <<= 1
-		if p&0x100 != 0 {
-			p ^= poly
-		}
-	}
-}
-
-// Multiply b and c as GF(2) polynomials modulo poly
-func mul(b, c uint32) uint32 {
-	i := b
-	j := c
-	s := uint32(0)
-	for k := uint32(1); k < 0x100 && j != 0; k <<= 1 {
-		// Invariant: k == 1<<n, i == b * xⁿ
-
-		if j&k != 0 {
-			// s += i in GF(2); xor in binary
-			s ^= i
-			j ^= k // turn off bit to end loop early
-		}
-
-		// i *= x in GF(2) modulo the polynomial
-		i <<= 1
-		if i&0x100 != 0 {
-			i ^= poly
-		}
-	}
-	return s
-}
-
-// Test all mul inputs against bit-by-bit n² algorithm.
-func TestMul(t *testing.T) {
-	for i := uint32(0); i < 256; i++ {
-		for j := uint32(0); j < 256; j++ {
-			// Multiply i, j bit by bit.
-			s := uint8(0)
-			for k := uint(0); k < 8; k++ {
-				for l := uint(0); l < 8; l++ {
-					if i&(1<<k) != 0 && j&(1<<l) != 0 {
-						s ^= powx[k+l]
-					}
-				}
-			}
-			if x := mul(i, j); x != uint32(s) {
-				t.Fatalf("mul(%#x, %#x) = %#x, want %#x", i, j, x, s)
-			}
-		}
-	}
-}
-
-// Check that S-boxes are inverses of each other.
-// They have more structure that we could test,
-// but if this sanity check passes, we'll assume
-// the cut and paste from the FIPS PDF worked.
-func TestSboxes(t *testing.T) {
-	for i := 0; i < 256; i++ {
-		if j := sbox0[sbox1[i]]; j != byte(i) {
-			t.Errorf("sbox0[sbox1[%#x]] = %#x", i, j)
-		}
-		if j := sbox1[sbox0[i]]; j != byte(i) {
-			t.Errorf("sbox1[sbox0[%#x]] = %#x", i, j)
-		}
-	}
-}
-
-// Test that encryption tables are correct.
-// (Can adapt this code to generate them too.)
-func TestTe(t *testing.T) {
-	for i := 0; i < 256; i++ {
-		s := uint32(sbox0[i])
-		s2 := mul(s, 2)
-		s3 := mul(s, 3)
-		w := s2<<24 | s<<16 | s<<8 | s3
-		te := [][256]uint32{te0, te1, te2, te3}
-		for j := 0; j < 4; j++ {
-			if x := te[j][i]; x != w {
-				t.Fatalf("te[%d][%d] = %#x, want %#x", j, i, x, w)
-			}
-			w = w<<24 | w>>8
-		}
-	}
-}
-
-// Test that decryption tables are correct.
-// (Can adapt this code to generate them too.)
-func TestTd(t *testing.T) {
-	for i := 0; i < 256; i++ {
-		s := uint32(sbox1[i])
-		s9 := mul(s, 0x9)
-		sb := mul(s, 0xb)
-		sd := mul(s, 0xd)
-		se := mul(s, 0xe)
-		w := se<<24 | s9<<16 | sd<<8 | sb
-		td := [][256]uint32{td0, td1, td2, td3}
-		for j := 0; j < 4; j++ {
-			if x := td[j][i]; x != w {
-				t.Fatalf("td[%d][%d] = %#x, want %#x", j, i, x, w)
-			}
-			w = w<<24 | w>>8
-		}
-	}
-}
-
-// Test vectors are from FIPS 197:
-//	http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf
-
-// Appendix A of FIPS 197: Key expansion examples
-type KeyTest struct {
-	key []byte
-	enc []uint32
-	dec []uint32 // decryption expansion; not in FIPS 197, computed from C implementation.
-}
-
-var keyTests = []KeyTest{
-	{
-		// A.1.  Expansion of a 128-bit Cipher Key
-		[]byte{0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c},
-		[]uint32{
-			0x2b7e1516, 0x28aed2a6, 0xabf71588, 0x09cf4f3c,
-			0xa0fafe17, 0x88542cb1, 0x23a33939, 0x2a6c7605,
-			0xf2c295f2, 0x7a96b943, 0x5935807a, 0x7359f67f,
-			0x3d80477d, 0x4716fe3e, 0x1e237e44, 0x6d7a883b,
-			0xef44a541, 0xa8525b7f, 0xb671253b, 0xdb0bad00,
-			0xd4d1c6f8, 0x7c839d87, 0xcaf2b8bc, 0x11f915bc,
-			0x6d88a37a, 0x110b3efd, 0xdbf98641, 0xca0093fd,
-			0x4e54f70e, 0x5f5fc9f3, 0x84a64fb2, 0x4ea6dc4f,
-			0xead27321, 0xb58dbad2, 0x312bf560, 0x7f8d292f,
-			0xac7766f3, 0x19fadc21, 0x28d12941, 0x575c006e,
-			0xd014f9a8, 0xc9ee2589, 0xe13f0cc8, 0xb6630ca6,
-		},
-		[]uint32{
-			0xd014f9a8, 0xc9ee2589, 0xe13f0cc8, 0xb6630ca6,
-			0xc7b5a63, 0x1319eafe, 0xb0398890, 0x664cfbb4,
-			0xdf7d925a, 0x1f62b09d, 0xa320626e, 0xd6757324,
-			0x12c07647, 0xc01f22c7, 0xbc42d2f3, 0x7555114a,
-			0x6efcd876, 0xd2df5480, 0x7c5df034, 0xc917c3b9,
-			0x6ea30afc, 0xbc238cf6, 0xae82a4b4, 0xb54a338d,
-			0x90884413, 0xd280860a, 0x12a12842, 0x1bc89739,
-			0x7c1f13f7, 0x4208c219, 0xc021ae48, 0x969bf7b,
-			0xcc7505eb, 0x3e17d1ee, 0x82296c51, 0xc9481133,
-			0x2b3708a7, 0xf262d405, 0xbc3ebdbf, 0x4b617d62,
-			0x2b7e1516, 0x28aed2a6, 0xabf71588, 0x9cf4f3c,
-		},
-	},
-	{
-		// A.2.  Expansion of a 192-bit Cipher Key
-		[]byte{
-			0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
-			0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b,
-		},
-		[]uint32{
-			0x8e73b0f7, 0xda0e6452, 0xc810f32b, 0x809079e5,
-			0x62f8ead2, 0x522c6b7b, 0xfe0c91f7, 0x2402f5a5,
-			0xec12068e, 0x6c827f6b, 0x0e7a95b9, 0x5c56fec2,
-			0x4db7b4bd, 0x69b54118, 0x85a74796, 0xe92538fd,
-			0xe75fad44, 0xbb095386, 0x485af057, 0x21efb14f,
-			0xa448f6d9, 0x4d6dce24, 0xaa326360, 0x113b30e6,
-			0xa25e7ed5, 0x83b1cf9a, 0x27f93943, 0x6a94f767,
-			0xc0a69407, 0xd19da4e1, 0xec1786eb, 0x6fa64971,
-			0x485f7032, 0x22cb8755, 0xe26d1352, 0x33f0b7b3,
-			0x40beeb28, 0x2f18a259, 0x6747d26b, 0x458c553e,
-			0xa7e1466c, 0x9411f1df, 0x821f750a, 0xad07d753,
-			0xca400538, 0x8fcc5006, 0x282d166a, 0xbc3ce7b5,
-			0xe98ba06f, 0x448c773c, 0x8ecc7204, 0x01002202,
-		},
-		nil,
-	},
-	{
-		// A.3.  Expansion of a 256-bit Cipher Key
-		[]byte{
-			0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
-			0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4,
-		},
-		[]uint32{
-			0x603deb10, 0x15ca71be, 0x2b73aef0, 0x857d7781,
-			0x1f352c07, 0x3b6108d7, 0x2d9810a3, 0x0914dff4,
-			0x9ba35411, 0x8e6925af, 0xa51a8b5f, 0x2067fcde,
-			0xa8b09c1a, 0x93d194cd, 0xbe49846e, 0xb75d5b9a,
-			0xd59aecb8, 0x5bf3c917, 0xfee94248, 0xde8ebe96,
-			0xb5a9328a, 0x2678a647, 0x98312229, 0x2f6c79b3,
-			0x812c81ad, 0xdadf48ba, 0x24360af2, 0xfab8b464,
-			0x98c5bfc9, 0xbebd198e, 0x268c3ba7, 0x09e04214,
-			0x68007bac, 0xb2df3316, 0x96e939e4, 0x6c518d80,
-			0xc814e204, 0x76a9fb8a, 0x5025c02d, 0x59c58239,
-			0xde136967, 0x6ccc5a71, 0xfa256395, 0x9674ee15,
-			0x5886ca5d, 0x2e2f31d7, 0x7e0af1fa, 0x27cf73c3,
-			0x749c47ab, 0x18501dda, 0xe2757e4f, 0x7401905a,
-			0xcafaaae3, 0xe4d59b34, 0x9adf6ace, 0xbd10190d,
-			0xfe4890d1, 0xe6188d0b, 0x046df344, 0x706c631e,
-		},
-		nil,
-	},
-}
-
-// Test key expansion against FIPS 197 examples.
-func TestExpandKey(t *testing.T) {
-L:
-	for i, tt := range keyTests {
-		enc := make([]uint32, len(tt.enc))
-		var dec []uint32
-		if tt.dec != nil {
-			dec = make([]uint32, len(tt.dec))
-		}
-		// This test could only test Go version of expandKey because asm
-		// version might use different memory layout for expanded keys
-		// This is OK because we don't expose expanded keys to the outside
-		expandKeyGo(tt.key, enc, dec)
-		for j, v := range enc {
-			if v != tt.enc[j] {
-				t.Errorf("key %d: enc[%d] = %#x, want %#x", i, j, v, tt.enc[j])
-				continue L
-			}
-		}
-		if dec != nil {
-			for j, v := range dec {
-				if v != tt.dec[j] {
-					t.Errorf("key %d: dec[%d] = %#x, want %#x", i, j, v, tt.dec[j])
-					continue L
-				}
-			}
-		}
-	}
-}
-
-// Appendix B, C of FIPS 197: Cipher examples, Example vectors.
-type CryptTest struct {
-	key []byte
-	in  []byte
-	out []byte
-}
-
-var encryptTests = []CryptTest{
-	{
-		// Appendix B.
-		[]byte{0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c},
-		[]byte{0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d, 0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34},
-		[]byte{0x39, 0x25, 0x84, 0x1d, 0x02, 0xdc, 0x09, 0xfb, 0xdc, 0x11, 0x85, 0x97, 0x19, 0x6a, 0x0b, 0x32},
-	},
-	{
-		// Appendix C.1.  AES-128
-		[]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f},
-		[]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff},
-		[]byte{0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30, 0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a},
-	},
-	{
-		// Appendix C.2.  AES-192
-		[]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-		},
-		[]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff},
-		[]byte{0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0, 0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91},
-	},
-	{
-		// Appendix C.3.  AES-256
-		[]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-		},
-		[]byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff},
-		[]byte{0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf, 0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89},
-	},
-}
-
-// Test encryptBlock against FIPS 197 examples.
-func TestEncryptBlock(t *testing.T) {
-	for i, tt := range encryptTests {
-		n := len(tt.key) + 28
-		enc := make([]uint32, n)
-		dec := make([]uint32, n)
-		expandKey(tt.key, enc, dec)
-		out := make([]byte, len(tt.in))
-		encryptBlock(enc, out, tt.in)
-		for j, v := range out {
-			if v != tt.out[j] {
-				t.Errorf("encryptBlock %d: out[%d] = %#x, want %#x", i, j, v, tt.out[j])
-				break
-			}
-		}
-	}
-}
-
-// Test decryptBlock against FIPS 197 examples.
-func TestDecryptBlock(t *testing.T) {
-	for i, tt := range encryptTests {
-		n := len(tt.key) + 28
-		enc := make([]uint32, n)
-		dec := make([]uint32, n)
-		expandKey(tt.key, enc, dec)
-		plain := make([]byte, len(tt.in))
-		decryptBlock(dec, plain, tt.out)
-		for j, v := range plain {
-			if v != tt.in[j] {
-				t.Errorf("decryptBlock %d: plain[%d] = %#x, want %#x", i, j, v, tt.in[j])
-				break
-			}
-		}
-	}
-}
-
-// Test Cipher Encrypt method against FIPS 197 examples.
-func TestCipherEncrypt(t *testing.T) {
-	for i, tt := range encryptTests {
-		c, err := NewCipher(tt.key)
-		if err != nil {
-			t.Errorf("NewCipher(%d bytes) = %s", len(tt.key), err)
-			continue
-		}
-		out := make([]byte, len(tt.in))
-		c.Encrypt(out, tt.in)
-		for j, v := range out {
-			if v != tt.out[j] {
-				t.Errorf("Cipher.Encrypt %d: out[%d] = %#x, want %#x", i, j, v, tt.out[j])
-				break
-			}
-		}
-	}
-}
-
-// Test Cipher Decrypt against FIPS 197 examples.
-func TestCipherDecrypt(t *testing.T) {
-	for i, tt := range encryptTests {
-		c, err := NewCipher(tt.key)
-		if err != nil {
-			t.Errorf("NewCipher(%d bytes) = %s", len(tt.key), err)
-			continue
-		}
-		plain := make([]byte, len(tt.in))
-		c.Decrypt(plain, tt.out)
-		for j, v := range plain {
-			if v != tt.in[j] {
-				t.Errorf("decryptBlock %d: plain[%d] = %#x, want %#x", i, j, v, tt.in[j])
-				break
-			}
-		}
-	}
-}
-
-// Test short input/output.
-// Assembly used to not notice.
-// See issue 7928.
-func TestShortBlocks(t *testing.T) {
-	bytes := func(n int) []byte { return make([]byte, n) }
-
-	c, _ := NewCipher(bytes(16))
-
-	mustPanic(t, "crypto/aes: input not full block", func() { c.Encrypt(bytes(1), bytes(1)) })
-	mustPanic(t, "crypto/aes: input not full block", func() { c.Decrypt(bytes(1), bytes(1)) })
-	mustPanic(t, "crypto/aes: input not full block", func() { c.Encrypt(bytes(100), bytes(1)) })
-	mustPanic(t, "crypto/aes: input not full block", func() { c.Decrypt(bytes(100), bytes(1)) })
-	mustPanic(t, "crypto/aes: output not full block", func() { c.Encrypt(bytes(1), bytes(100)) })
-	mustPanic(t, "crypto/aes: output not full block", func() { c.Decrypt(bytes(1), bytes(100)) })
-}
-
-func mustPanic(t *testing.T, msg string, f func()) {
-	defer func() {
-		err := recover()
-		if err == nil {
-			t.Errorf("function did not panic, wanted %q", msg)
-		} else if err != msg {
-			t.Errorf("got panic %v, wanted %q", err, msg)
-		}
-	}()
-	f()
-}
-
-func BenchmarkEncrypt(b *testing.B) {
-	tt := encryptTests[0]
-	c, err := NewCipher(tt.key)
-	if err != nil {
-		b.Fatal("NewCipher:", err)
-	}
-	out := make([]byte, len(tt.in))
-	b.SetBytes(int64(len(out)))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		c.Encrypt(out, tt.in)
-	}
-}
-
-func BenchmarkDecrypt(b *testing.B) {
-	tt := encryptTests[0]
-	c, err := NewCipher(tt.key)
-	if err != nil {
-		b.Fatal("NewCipher:", err)
-	}
-	out := make([]byte, len(tt.out))
-	b.SetBytes(int64(len(out)))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		c.Decrypt(out, tt.out)
-	}
-}
-
-func BenchmarkExpand(b *testing.B) {
-	tt := encryptTests[0]
-	n := len(tt.key) + 28
-	c := &aesCipher{make([]uint32, n), make([]uint32, n)}
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		expandKey(tt.key, c.enc, c.dec)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/aes/block.go b/third_party/gofrontend/libgo/go/crypto/aes/block.go
deleted file mode 100644
index 57a7e9e..0000000
--- a/third_party/gofrontend/libgo/go/crypto/aes/block.go
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This Go implementation is derived in part from the reference
-// ANSI C implementation, which carries the following notice:
-//
-//	rijndael-alg-fst.c
-//
-//	@version 3.0 (December 2000)
-//
-//	Optimised ANSI C code for the Rijndael cipher (now AES)
-//
-//	@author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
-//	@author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
-//	@author Paulo Barreto <paulo.barreto@terra.com.br>
-//
-//	This code is hereby placed in the public domain.
-//
-//	THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''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 AUTHORS 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.
-//
-// See FIPS 197 for specification, and see Daemen and Rijmen's Rijndael submission
-// for implementation details.
-//	http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf
-//	http://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf
-
-package aes
-
-// Encrypt one block from src into dst, using the expanded key xk.
-func encryptBlockGo(xk []uint32, dst, src []byte) {
-	var s0, s1, s2, s3, t0, t1, t2, t3 uint32
-
-	s0 = uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3])
-	s1 = uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7])
-	s2 = uint32(src[8])<<24 | uint32(src[9])<<16 | uint32(src[10])<<8 | uint32(src[11])
-	s3 = uint32(src[12])<<24 | uint32(src[13])<<16 | uint32(src[14])<<8 | uint32(src[15])
-
-	// First round just XORs input with key.
-	s0 ^= xk[0]
-	s1 ^= xk[1]
-	s2 ^= xk[2]
-	s3 ^= xk[3]
-
-	// Middle rounds shuffle using tables.
-	// Number of rounds is set by length of expanded key.
-	nr := len(xk)/4 - 2 // - 2: one above, one more below
-	k := 4
-	for r := 0; r < nr; r++ {
-		t0 = xk[k+0] ^ te0[uint8(s0>>24)] ^ te1[uint8(s1>>16)] ^ te2[uint8(s2>>8)] ^ te3[uint8(s3)]
-		t1 = xk[k+1] ^ te0[uint8(s1>>24)] ^ te1[uint8(s2>>16)] ^ te2[uint8(s3>>8)] ^ te3[uint8(s0)]
-		t2 = xk[k+2] ^ te0[uint8(s2>>24)] ^ te1[uint8(s3>>16)] ^ te2[uint8(s0>>8)] ^ te3[uint8(s1)]
-		t3 = xk[k+3] ^ te0[uint8(s3>>24)] ^ te1[uint8(s0>>16)] ^ te2[uint8(s1>>8)] ^ te3[uint8(s2)]
-		k += 4
-		s0, s1, s2, s3 = t0, t1, t2, t3
-	}
-
-	// Last round uses s-box directly and XORs to produce output.
-	s0 = uint32(sbox0[t0>>24])<<24 | uint32(sbox0[t1>>16&0xff])<<16 | uint32(sbox0[t2>>8&0xff])<<8 | uint32(sbox0[t3&0xff])
-	s1 = uint32(sbox0[t1>>24])<<24 | uint32(sbox0[t2>>16&0xff])<<16 | uint32(sbox0[t3>>8&0xff])<<8 | uint32(sbox0[t0&0xff])
-	s2 = uint32(sbox0[t2>>24])<<24 | uint32(sbox0[t3>>16&0xff])<<16 | uint32(sbox0[t0>>8&0xff])<<8 | uint32(sbox0[t1&0xff])
-	s3 = uint32(sbox0[t3>>24])<<24 | uint32(sbox0[t0>>16&0xff])<<16 | uint32(sbox0[t1>>8&0xff])<<8 | uint32(sbox0[t2&0xff])
-
-	s0 ^= xk[k+0]
-	s1 ^= xk[k+1]
-	s2 ^= xk[k+2]
-	s3 ^= xk[k+3]
-
-	dst[0], dst[1], dst[2], dst[3] = byte(s0>>24), byte(s0>>16), byte(s0>>8), byte(s0)
-	dst[4], dst[5], dst[6], dst[7] = byte(s1>>24), byte(s1>>16), byte(s1>>8), byte(s1)
-	dst[8], dst[9], dst[10], dst[11] = byte(s2>>24), byte(s2>>16), byte(s2>>8), byte(s2)
-	dst[12], dst[13], dst[14], dst[15] = byte(s3>>24), byte(s3>>16), byte(s3>>8), byte(s3)
-}
-
-// Decrypt one block from src into dst, using the expanded key xk.
-func decryptBlockGo(xk []uint32, dst, src []byte) {
-	var s0, s1, s2, s3, t0, t1, t2, t3 uint32
-
-	s0 = uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3])
-	s1 = uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7])
-	s2 = uint32(src[8])<<24 | uint32(src[9])<<16 | uint32(src[10])<<8 | uint32(src[11])
-	s3 = uint32(src[12])<<24 | uint32(src[13])<<16 | uint32(src[14])<<8 | uint32(src[15])
-
-	// First round just XORs input with key.
-	s0 ^= xk[0]
-	s1 ^= xk[1]
-	s2 ^= xk[2]
-	s3 ^= xk[3]
-
-	// Middle rounds shuffle using tables.
-	// Number of rounds is set by length of expanded key.
-	nr := len(xk)/4 - 2 // - 2: one above, one more below
-	k := 4
-	for r := 0; r < nr; r++ {
-		t0 = xk[k+0] ^ td0[uint8(s0>>24)] ^ td1[uint8(s3>>16)] ^ td2[uint8(s2>>8)] ^ td3[uint8(s1)]
-		t1 = xk[k+1] ^ td0[uint8(s1>>24)] ^ td1[uint8(s0>>16)] ^ td2[uint8(s3>>8)] ^ td3[uint8(s2)]
-		t2 = xk[k+2] ^ td0[uint8(s2>>24)] ^ td1[uint8(s1>>16)] ^ td2[uint8(s0>>8)] ^ td3[uint8(s3)]
-		t3 = xk[k+3] ^ td0[uint8(s3>>24)] ^ td1[uint8(s2>>16)] ^ td2[uint8(s1>>8)] ^ td3[uint8(s0)]
-		k += 4
-		s0, s1, s2, s3 = t0, t1, t2, t3
-	}
-
-	// Last round uses s-box directly and XORs to produce output.
-	s0 = uint32(sbox1[t0>>24])<<24 | uint32(sbox1[t3>>16&0xff])<<16 | uint32(sbox1[t2>>8&0xff])<<8 | uint32(sbox1[t1&0xff])
-	s1 = uint32(sbox1[t1>>24])<<24 | uint32(sbox1[t0>>16&0xff])<<16 | uint32(sbox1[t3>>8&0xff])<<8 | uint32(sbox1[t2&0xff])
-	s2 = uint32(sbox1[t2>>24])<<24 | uint32(sbox1[t1>>16&0xff])<<16 | uint32(sbox1[t0>>8&0xff])<<8 | uint32(sbox1[t3&0xff])
-	s3 = uint32(sbox1[t3>>24])<<24 | uint32(sbox1[t2>>16&0xff])<<16 | uint32(sbox1[t1>>8&0xff])<<8 | uint32(sbox1[t0&0xff])
-
-	s0 ^= xk[k+0]
-	s1 ^= xk[k+1]
-	s2 ^= xk[k+2]
-	s3 ^= xk[k+3]
-
-	dst[0], dst[1], dst[2], dst[3] = byte(s0>>24), byte(s0>>16), byte(s0>>8), byte(s0)
-	dst[4], dst[5], dst[6], dst[7] = byte(s1>>24), byte(s1>>16), byte(s1>>8), byte(s1)
-	dst[8], dst[9], dst[10], dst[11] = byte(s2>>24), byte(s2>>16), byte(s2>>8), byte(s2)
-	dst[12], dst[13], dst[14], dst[15] = byte(s3>>24), byte(s3>>16), byte(s3>>8), byte(s3)
-}
-
-// Apply sbox0 to each byte in w.
-func subw(w uint32) uint32 {
-	return uint32(sbox0[w>>24])<<24 |
-		uint32(sbox0[w>>16&0xff])<<16 |
-		uint32(sbox0[w>>8&0xff])<<8 |
-		uint32(sbox0[w&0xff])
-}
-
-// Rotate
-func rotw(w uint32) uint32 { return w<<8 | w>>24 }
-
-// Key expansion algorithm.  See FIPS-197, Figure 11.
-// Their rcon[i] is our powx[i-1] << 24.
-func expandKeyGo(key []byte, enc, dec []uint32) {
-	// Encryption key setup.
-	var i int
-	nk := len(key) / 4
-	for i = 0; i < nk; i++ {
-		enc[i] = uint32(key[4*i])<<24 | uint32(key[4*i+1])<<16 | uint32(key[4*i+2])<<8 | uint32(key[4*i+3])
-	}
-	for ; i < len(enc); i++ {
-		t := enc[i-1]
-		if i%nk == 0 {
-			t = subw(rotw(t)) ^ (uint32(powx[i/nk-1]) << 24)
-		} else if nk > 6 && i%nk == 4 {
-			t = subw(t)
-		}
-		enc[i] = enc[i-nk] ^ t
-	}
-
-	// Derive decryption key from encryption key.
-	// Reverse the 4-word round key sets from enc to produce dec.
-	// All sets but the first and last get the MixColumn transform applied.
-	if dec == nil {
-		return
-	}
-	n := len(enc)
-	for i := 0; i < n; i += 4 {
-		ei := n - i - 4
-		for j := 0; j < 4; j++ {
-			x := enc[ei+j]
-			if i > 0 && i+4 < n {
-				x = td0[sbox0[x>>24]] ^ td1[sbox0[x>>16&0xff]] ^ td2[sbox0[x>>8&0xff]] ^ td3[sbox0[x&0xff]]
-			}
-			dec[i+j] = x
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/aes/cipher.go b/third_party/gofrontend/libgo/go/crypto/aes/cipher.go
deleted file mode 100644
index 2c6bb0a..0000000
--- a/third_party/gofrontend/libgo/go/crypto/aes/cipher.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package aes
-
-import (
-	"crypto/cipher"
-	"strconv"
-)
-
-// The AES block size in bytes.
-const BlockSize = 16
-
-// A cipher is an instance of AES encryption using a particular key.
-type aesCipher struct {
-	enc []uint32
-	dec []uint32
-}
-
-type KeySizeError int
-
-func (k KeySizeError) Error() string {
-	return "crypto/aes: invalid key size " + strconv.Itoa(int(k))
-}
-
-// NewCipher creates and returns a new cipher.Block.
-// The key argument should be the AES key,
-// either 16, 24, or 32 bytes to select
-// AES-128, AES-192, or AES-256.
-func NewCipher(key []byte) (cipher.Block, error) {
-	k := len(key)
-	switch k {
-	default:
-		return nil, KeySizeError(k)
-	case 16, 24, 32:
-		break
-	}
-
-	n := k + 28
-	c := &aesCipher{make([]uint32, n), make([]uint32, n)}
-	expandKey(key, c.enc, c.dec)
-	return c, nil
-}
-
-func (c *aesCipher) BlockSize() int { return BlockSize }
-
-func (c *aesCipher) Encrypt(dst, src []byte) {
-	if len(src) < BlockSize {
-		panic("crypto/aes: input not full block")
-	}
-	if len(dst) < BlockSize {
-		panic("crypto/aes: output not full block")
-	}
-	encryptBlock(c.enc, dst, src)
-}
-
-func (c *aesCipher) Decrypt(dst, src []byte) {
-	if len(src) < BlockSize {
-		panic("crypto/aes: input not full block")
-	}
-	if len(dst) < BlockSize {
-		panic("crypto/aes: output not full block")
-	}
-	decryptBlock(c.dec, dst, src)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/aes/cipher_asm.go b/third_party/gofrontend/libgo/go/crypto/aes/cipher_asm.go
deleted file mode 100644
index 964eaaa..0000000
--- a/third_party/gofrontend/libgo/go/crypto/aes/cipher_asm.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64
-
-package aes
-
-// defined in asm_$GOARCH.s
-func hasAsm() bool
-func encryptBlockAsm(nr int, xk *uint32, dst, src *byte)
-func decryptBlockAsm(nr int, xk *uint32, dst, src *byte)
-func expandKeyAsm(nr int, key *byte, enc *uint32, dec *uint32)
-
-var useAsm = hasAsm()
-
-func encryptBlock(xk []uint32, dst, src []byte) {
-	if useAsm {
-		encryptBlockAsm(len(xk)/4-1, &xk[0], &dst[0], &src[0])
-	} else {
-		encryptBlockGo(xk, dst, src)
-	}
-}
-
-func decryptBlock(xk []uint32, dst, src []byte) {
-	if useAsm {
-		decryptBlockAsm(len(xk)/4-1, &xk[0], &dst[0], &src[0])
-	} else {
-		decryptBlockGo(xk, dst, src)
-	}
-}
-
-func expandKey(key []byte, enc, dec []uint32) {
-	if useAsm {
-		rounds := 10
-		switch len(key) {
-		case 128 / 8:
-			rounds = 10
-		case 192 / 8:
-			rounds = 12
-		case 256 / 8:
-			rounds = 14
-		}
-		expandKeyAsm(rounds, &key[0], &enc[0], &dec[0])
-	} else {
-		expandKeyGo(key, enc, dec)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/aes/cipher_generic.go b/third_party/gofrontend/libgo/go/crypto/aes/cipher_generic.go
deleted file mode 100644
index 1714e0f..0000000
--- a/third_party/gofrontend/libgo/go/crypto/aes/cipher_generic.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !amd64
-
-package aes
-
-func encryptBlock(xk []uint32, dst, src []byte) {
-	encryptBlockGo(xk, dst, src)
-}
-
-func decryptBlock(xk []uint32, dst, src []byte) {
-	decryptBlockGo(xk, dst, src)
-}
-
-func expandKey(key []byte, enc, dec []uint32) {
-	expandKeyGo(key, enc, dec)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/aes/const.go b/third_party/gofrontend/libgo/go/crypto/aes/const.go
deleted file mode 100644
index aee73a7..0000000
--- a/third_party/gofrontend/libgo/go/crypto/aes/const.go
+++ /dev/null
@@ -1,358 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package aes implements AES encryption (formerly Rijndael), as defined in
-// U.S. Federal Information Processing Standards Publication 197.
-package aes
-
-// This file contains AES constants - 8720 bytes of initialized data.
-
-// http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf
-
-// AES is based on the mathematical behavior of binary polynomials
-// (polynomials over GF(2)) modulo the irreducible polynomial x⁸ + x⁴ + x³ + x + 1.
-// Addition of these binary polynomials corresponds to binary xor.
-// Reducing mod poly corresponds to binary xor with poly every
-// time a 0x100 bit appears.
-const poly = 1<<8 | 1<<4 | 1<<3 | 1<<1 | 1<<0 // x⁸ + x⁴ + x³ + x + 1
-
-// Powers of x mod poly in GF(2).
-var powx = [16]byte{
-	0x01,
-	0x02,
-	0x04,
-	0x08,
-	0x10,
-	0x20,
-	0x40,
-	0x80,
-	0x1b,
-	0x36,
-	0x6c,
-	0xd8,
-	0xab,
-	0x4d,
-	0x9a,
-	0x2f,
-}
-
-// FIPS-197 Figure 7. S-box substitution values in hexadecimal format.
-var sbox0 = [256]byte{
-	0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
-	0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
-	0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
-	0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
-	0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
-	0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
-	0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
-	0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
-	0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
-	0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
-	0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
-	0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
-	0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
-	0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
-	0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
-	0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16,
-}
-
-// FIPS-197 Figure 14.  Inverse S-box substitution values in hexadecimal format.
-var sbox1 = [256]byte{
-	0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
-	0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
-	0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
-	0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
-	0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
-	0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
-	0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
-	0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
-	0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
-	0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
-	0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
-	0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
-	0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
-	0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
-	0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
-	0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d,
-}
-
-// Lookup tables for encryption.
-// These can be recomputed by adapting the tests in aes_test.go.
-
-var te0 = [256]uint32{
-	0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
-	0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
-	0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
-	0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
-	0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
-	0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
-	0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
-	0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
-	0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
-	0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
-	0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
-	0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
-	0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
-	0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
-	0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
-	0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
-	0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
-	0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
-	0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
-	0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
-	0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
-	0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
-	0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
-	0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
-	0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
-	0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
-	0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
-	0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
-	0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
-	0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
-	0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
-	0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,
-}
-var te1 = [256]uint32{
-	0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
-	0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
-	0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
-	0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
-	0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
-	0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
-	0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
-	0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
-	0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
-	0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
-	0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
-	0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
-	0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
-	0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
-	0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
-	0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
-	0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
-	0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
-	0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
-	0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
-	0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
-	0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
-	0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
-	0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
-	0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
-	0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
-	0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
-	0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
-	0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
-	0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
-	0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
-	0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,
-}
-var te2 = [256]uint32{
-	0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
-	0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
-	0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
-	0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
-	0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
-	0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
-	0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
-	0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
-	0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
-	0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
-	0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
-	0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
-	0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
-	0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
-	0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
-	0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
-	0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
-	0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
-	0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
-	0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
-	0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
-	0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
-	0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
-	0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
-	0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
-	0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
-	0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
-	0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
-	0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
-	0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
-	0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
-	0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,
-}
-var te3 = [256]uint32{
-	0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
-	0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
-	0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
-	0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
-	0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
-	0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
-	0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
-	0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
-	0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
-	0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
-	0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
-	0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
-	0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
-	0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
-	0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
-	0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
-	0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
-	0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
-	0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
-	0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
-	0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
-	0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
-	0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
-	0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
-	0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
-	0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
-	0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
-	0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
-	0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
-	0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
-	0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
-	0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,
-}
-
-// Lookup tables for decryption.
-// These can be recomputed by adapting the tests in aes_test.go.
-
-var td0 = [256]uint32{
-	0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
-	0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
-	0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
-	0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
-	0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
-	0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
-	0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
-	0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
-	0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
-	0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
-	0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
-	0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
-	0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
-	0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
-	0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
-	0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
-	0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
-	0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
-	0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
-	0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
-	0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
-	0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
-	0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
-	0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
-	0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
-	0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
-	0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
-	0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
-	0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
-	0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
-	0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
-	0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742,
-}
-var td1 = [256]uint32{
-	0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
-	0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
-	0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
-	0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
-	0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
-	0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
-	0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
-	0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
-	0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
-	0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
-	0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
-	0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
-	0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
-	0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
-	0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
-	0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
-	0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
-	0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
-	0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
-	0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
-	0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
-	0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
-	0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
-	0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
-	0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
-	0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
-	0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
-	0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
-	0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
-	0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
-	0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
-	0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857,
-}
-var td2 = [256]uint32{
-	0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
-	0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
-	0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
-	0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
-	0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
-	0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
-	0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
-	0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
-	0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
-	0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
-	0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
-	0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
-	0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
-	0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
-	0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
-	0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
-	0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
-	0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
-	0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
-	0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
-	0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
-	0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
-	0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
-	0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
-	0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
-	0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
-	0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
-	0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
-	0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
-	0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
-	0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
-	0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8,
-}
-var td3 = [256]uint32{
-	0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
-	0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
-	0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
-	0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
-	0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
-	0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
-	0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
-	0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
-	0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
-	0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
-	0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
-	0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
-	0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
-	0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
-	0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
-	0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
-	0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
-	0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
-	0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
-	0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
-	0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
-	0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
-	0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
-	0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
-	0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
-	0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
-	0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
-	0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
-	0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
-	0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
-	0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
-	0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/benchmark_test.go b/third_party/gofrontend/libgo/go/crypto/cipher/benchmark_test.go
deleted file mode 100644
index 027b248..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/benchmark_test.go
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cipher_test
-
-import (
-	"crypto/aes"
-	"crypto/cipher"
-	"testing"
-)
-
-func BenchmarkAESGCMSeal1K(b *testing.B) {
-	buf := make([]byte, 1024)
-	b.SetBytes(int64(len(buf)))
-
-	var key [16]byte
-	var nonce [12]byte
-	aes, _ := aes.NewCipher(key[:])
-	aesgcm, _ := cipher.NewGCM(aes)
-	var out []byte
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		out = aesgcm.Seal(out[:0], nonce[:], buf, nonce[:])
-	}
-}
-
-func BenchmarkAESGCMOpen1K(b *testing.B) {
-	buf := make([]byte, 1024)
-	b.SetBytes(int64(len(buf)))
-
-	var key [16]byte
-	var nonce [12]byte
-	aes, _ := aes.NewCipher(key[:])
-	aesgcm, _ := cipher.NewGCM(aes)
-	var out []byte
-	out = aesgcm.Seal(out[:0], nonce[:], buf, nonce[:])
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		_, err := aesgcm.Open(buf[:0], nonce[:], out, nonce[:])
-		if err != nil {
-			b.Errorf("Open: %v", err)
-		}
-	}
-}
-
-// If we test exactly 1K blocks, we would generate exact multiples of
-// the cipher's block size, and the cipher stream fragments would
-// always be wordsize aligned, whereas non-aligned is a more typical
-// use-case.
-const almost1K = 1024 - 5
-
-func BenchmarkAESCFBEncrypt1K(b *testing.B) {
-	buf := make([]byte, almost1K)
-	b.SetBytes(int64(len(buf)))
-
-	var key [16]byte
-	var iv [16]byte
-	aes, _ := aes.NewCipher(key[:])
-	ctr := cipher.NewCFBEncrypter(aes, iv[:])
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		ctr.XORKeyStream(buf, buf)
-	}
-}
-
-func BenchmarkAESCFBDecrypt1K(b *testing.B) {
-	buf := make([]byte, almost1K)
-	b.SetBytes(int64(len(buf)))
-
-	var key [16]byte
-	var iv [16]byte
-	aes, _ := aes.NewCipher(key[:])
-	ctr := cipher.NewCFBDecrypter(aes, iv[:])
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		ctr.XORKeyStream(buf, buf)
-	}
-}
-
-func BenchmarkAESOFB1K(b *testing.B) {
-	buf := make([]byte, almost1K)
-	b.SetBytes(int64(len(buf)))
-
-	var key [16]byte
-	var iv [16]byte
-	aes, _ := aes.NewCipher(key[:])
-	ctr := cipher.NewOFB(aes, iv[:])
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		ctr.XORKeyStream(buf, buf)
-	}
-}
-
-func BenchmarkAESCTR1K(b *testing.B) {
-	buf := make([]byte, almost1K)
-	b.SetBytes(int64(len(buf)))
-
-	var key [16]byte
-	var iv [16]byte
-	aes, _ := aes.NewCipher(key[:])
-	ctr := cipher.NewCTR(aes, iv[:])
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		ctr.XORKeyStream(buf, buf)
-	}
-}
-
-func BenchmarkAESCBCEncrypt1K(b *testing.B) {
-	buf := make([]byte, 1024)
-	b.SetBytes(int64(len(buf)))
-
-	var key [16]byte
-	var iv [16]byte
-	aes, _ := aes.NewCipher(key[:])
-	cbc := cipher.NewCBCEncrypter(aes, iv[:])
-	for i := 0; i < b.N; i++ {
-		cbc.CryptBlocks(buf, buf)
-	}
-}
-
-func BenchmarkAESCBCDecrypt1K(b *testing.B) {
-	buf := make([]byte, 1024)
-	b.SetBytes(int64(len(buf)))
-
-	var key [16]byte
-	var iv [16]byte
-	aes, _ := aes.NewCipher(key[:])
-	cbc := cipher.NewCBCDecrypter(aes, iv[:])
-	for i := 0; i < b.N; i++ {
-		cbc.CryptBlocks(buf, buf)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/cbc.go b/third_party/gofrontend/libgo/go/crypto/cipher/cbc.go
deleted file mode 100644
index 241e122..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/cbc.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Cipher block chaining (CBC) mode.
-
-// CBC provides confidentiality by xoring (chaining) each plaintext block
-// with the previous ciphertext block before applying the block cipher.
-
-// See NIST SP 800-38A, pp 10-11
-
-package cipher
-
-type cbc struct {
-	b         Block
-	blockSize int
-	iv        []byte
-	tmp       []byte
-}
-
-func newCBC(b Block, iv []byte) *cbc {
-	return &cbc{
-		b:         b,
-		blockSize: b.BlockSize(),
-		iv:        dup(iv),
-		tmp:       make([]byte, b.BlockSize()),
-	}
-}
-
-type cbcEncrypter cbc
-
-// NewCBCEncrypter returns a BlockMode which encrypts in cipher block chaining
-// mode, using the given Block. The length of iv must be the same as the
-// Block's block size.
-func NewCBCEncrypter(b Block, iv []byte) BlockMode {
-	if len(iv) != b.BlockSize() {
-		panic("cipher.NewCBCEncrypter: IV length must equal block size")
-	}
-	return (*cbcEncrypter)(newCBC(b, iv))
-}
-
-func (x *cbcEncrypter) BlockSize() int { return x.blockSize }
-
-func (x *cbcEncrypter) CryptBlocks(dst, src []byte) {
-	if len(src)%x.blockSize != 0 {
-		panic("crypto/cipher: input not full blocks")
-	}
-	if len(dst) < len(src) {
-		panic("crypto/cipher: output smaller than input")
-	}
-
-	iv := x.iv
-
-	for len(src) > 0 {
-		// Write the xor to dst, then encrypt in place.
-		xorBytes(dst[:x.blockSize], src[:x.blockSize], iv)
-		x.b.Encrypt(dst[:x.blockSize], dst[:x.blockSize])
-
-		// Move to the next block with this block as the next iv.
-		iv = dst[:x.blockSize]
-		src = src[x.blockSize:]
-		dst = dst[x.blockSize:]
-	}
-
-	// Save the iv for the next CryptBlocks call.
-	copy(x.iv, iv)
-}
-
-func (x *cbcEncrypter) SetIV(iv []byte) {
-	if len(iv) != len(x.iv) {
-		panic("cipher: incorrect length IV")
-	}
-	copy(x.iv, iv)
-}
-
-type cbcDecrypter cbc
-
-// NewCBCDecrypter returns a BlockMode which decrypts in cipher block chaining
-// mode, using the given Block. The length of iv must be the same as the
-// Block's block size and must match the iv used to encrypt the data.
-func NewCBCDecrypter(b Block, iv []byte) BlockMode {
-	if len(iv) != b.BlockSize() {
-		panic("cipher.NewCBCDecrypter: IV length must equal block size")
-	}
-	return (*cbcDecrypter)(newCBC(b, iv))
-}
-
-func (x *cbcDecrypter) BlockSize() int { return x.blockSize }
-
-func (x *cbcDecrypter) CryptBlocks(dst, src []byte) {
-	if len(src)%x.blockSize != 0 {
-		panic("crypto/cipher: input not full blocks")
-	}
-	if len(dst) < len(src) {
-		panic("crypto/cipher: output smaller than input")
-	}
-	if len(src) == 0 {
-		return
-	}
-
-	// For each block, we need to xor the decrypted data with the previous block's ciphertext (the iv).
-	// To avoid making a copy each time, we loop over the blocks BACKWARDS.
-	end := len(src)
-	start := end - x.blockSize
-	prev := start - x.blockSize
-
-	// Copy the last block of ciphertext in preparation as the new iv.
-	copy(x.tmp, src[start:end])
-
-	// Loop over all but the first block.
-	for start > 0 {
-		x.b.Decrypt(dst[start:end], src[start:end])
-		xorBytes(dst[start:end], dst[start:end], src[prev:start])
-
-		end = start
-		start = prev
-		prev -= x.blockSize
-	}
-
-	// The first block is special because it uses the saved iv.
-	x.b.Decrypt(dst[start:end], src[start:end])
-	xorBytes(dst[start:end], dst[start:end], x.iv)
-
-	// Set the new iv to the first block we copied earlier.
-	x.iv, x.tmp = x.tmp, x.iv
-}
-
-func (x *cbcDecrypter) SetIV(iv []byte) {
-	if len(iv) != len(x.iv) {
-		panic("cipher: incorrect length IV")
-	}
-	copy(x.iv, iv)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/cbc_aes_test.go b/third_party/gofrontend/libgo/go/crypto/cipher/cbc_aes_test.go
deleted file mode 100644
index bf9e7ad..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/cbc_aes_test.go
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// CBC AES test vectors.
-
-// See U.S. National Institute of Standards and Technology (NIST)
-// Special Publication 800-38A, ``Recommendation for Block Cipher
-// Modes of Operation,'' 2001 Edition, pp. 24-29.
-
-package cipher_test
-
-import (
-	"bytes"
-	"crypto/aes"
-	"crypto/cipher"
-	"testing"
-)
-
-var cbcAESTests = []struct {
-	name string
-	key  []byte
-	iv   []byte
-	in   []byte
-	out  []byte
-}{
-	// NIST SP 800-38A pp 27-29
-	{
-		"CBC-AES128",
-		commonKey128,
-		commonIV,
-		commonInput,
-		[]byte{
-			0x76, 0x49, 0xab, 0xac, 0x81, 0x19, 0xb2, 0x46, 0xce, 0xe9, 0x8e, 0x9b, 0x12, 0xe9, 0x19, 0x7d,
-			0x50, 0x86, 0xcb, 0x9b, 0x50, 0x72, 0x19, 0xee, 0x95, 0xdb, 0x11, 0x3a, 0x91, 0x76, 0x78, 0xb2,
-			0x73, 0xbe, 0xd6, 0xb8, 0xe3, 0xc1, 0x74, 0x3b, 0x71, 0x16, 0xe6, 0x9e, 0x22, 0x22, 0x95, 0x16,
-			0x3f, 0xf1, 0xca, 0xa1, 0x68, 0x1f, 0xac, 0x09, 0x12, 0x0e, 0xca, 0x30, 0x75, 0x86, 0xe1, 0xa7,
-		},
-	},
-	{
-		"CBC-AES192",
-		commonKey192,
-		commonIV,
-		commonInput,
-		[]byte{
-			0x4f, 0x02, 0x1d, 0xb2, 0x43, 0xbc, 0x63, 0x3d, 0x71, 0x78, 0x18, 0x3a, 0x9f, 0xa0, 0x71, 0xe8,
-			0xb4, 0xd9, 0xad, 0xa9, 0xad, 0x7d, 0xed, 0xf4, 0xe5, 0xe7, 0x38, 0x76, 0x3f, 0x69, 0x14, 0x5a,
-			0x57, 0x1b, 0x24, 0x20, 0x12, 0xfb, 0x7a, 0xe0, 0x7f, 0xa9, 0xba, 0xac, 0x3d, 0xf1, 0x02, 0xe0,
-			0x08, 0xb0, 0xe2, 0x79, 0x88, 0x59, 0x88, 0x81, 0xd9, 0x20, 0xa9, 0xe6, 0x4f, 0x56, 0x15, 0xcd,
-		},
-	},
-	{
-		"CBC-AES256",
-		commonKey256,
-		commonIV,
-		commonInput,
-		[]byte{
-			0xf5, 0x8c, 0x4c, 0x04, 0xd6, 0xe5, 0xf1, 0xba, 0x77, 0x9e, 0xab, 0xfb, 0x5f, 0x7b, 0xfb, 0xd6,
-			0x9c, 0xfc, 0x4e, 0x96, 0x7e, 0xdb, 0x80, 0x8d, 0x67, 0x9f, 0x77, 0x7b, 0xc6, 0x70, 0x2c, 0x7d,
-			0x39, 0xf2, 0x33, 0x69, 0xa9, 0xd9, 0xba, 0xcf, 0xa5, 0x30, 0xe2, 0x63, 0x04, 0x23, 0x14, 0x61,
-			0xb2, 0xeb, 0x05, 0xe2, 0xc3, 0x9b, 0xe9, 0xfc, 0xda, 0x6c, 0x19, 0x07, 0x8c, 0x6a, 0x9d, 0x1b,
-		},
-	},
-}
-
-func TestCBCEncrypterAES(t *testing.T) {
-	for _, test := range cbcAESTests {
-		c, err := aes.NewCipher(test.key)
-		if err != nil {
-			t.Errorf("%s: NewCipher(%d bytes) = %s", test.name, len(test.key), err)
-			continue
-		}
-
-		encrypter := cipher.NewCBCEncrypter(c, test.iv)
-
-		data := make([]byte, len(test.in))
-		copy(data, test.in)
-
-		encrypter.CryptBlocks(data, data)
-		if !bytes.Equal(test.out, data) {
-			t.Errorf("%s: CBCEncrypter\nhave %x\nwant %x", test.name, data, test.out)
-		}
-	}
-}
-
-func TestCBCDecrypterAES(t *testing.T) {
-	for _, test := range cbcAESTests {
-		c, err := aes.NewCipher(test.key)
-		if err != nil {
-			t.Errorf("%s: NewCipher(%d bytes) = %s", test.name, len(test.key), err)
-			continue
-		}
-
-		decrypter := cipher.NewCBCDecrypter(c, test.iv)
-
-		data := make([]byte, len(test.out))
-		copy(data, test.out)
-
-		decrypter.CryptBlocks(data, data)
-		if !bytes.Equal(test.in, data) {
-			t.Errorf("%s: CBCDecrypter\nhave %x\nwant %x", test.name, data, test.in)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/cfb.go b/third_party/gofrontend/libgo/go/crypto/cipher/cfb.go
deleted file mode 100644
index 9b4eebf..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/cfb.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// CFB (Cipher Feedback) Mode.
-
-package cipher
-
-type cfb struct {
-	b       Block
-	next    []byte
-	out     []byte
-	outUsed int
-
-	decrypt bool
-}
-
-func (x *cfb) XORKeyStream(dst, src []byte) {
-	for len(src) > 0 {
-		if x.outUsed == len(x.out) {
-			x.b.Encrypt(x.out, x.next)
-			x.outUsed = 0
-		}
-
-		if x.decrypt {
-			// We can precompute a larger segment of the
-			// keystream on decryption. This will allow
-			// larger batches for xor, and we should be
-			// able to match CTR/OFB performance.
-			copy(x.next[x.outUsed:], src)
-		}
-		n := xorBytes(dst, src, x.out[x.outUsed:])
-		if !x.decrypt {
-			copy(x.next[x.outUsed:], dst)
-		}
-		dst = dst[n:]
-		src = src[n:]
-		x.outUsed += n
-	}
-}
-
-// NewCFBEncrypter returns a Stream which encrypts with cipher feedback mode,
-// using the given Block. The iv must be the same length as the Block's block
-// size.
-func NewCFBEncrypter(block Block, iv []byte) Stream {
-	return newCFB(block, iv, false)
-}
-
-// NewCFBDecrypter returns a Stream which decrypts with cipher feedback mode,
-// using the given Block. The iv must be the same length as the Block's block
-// size.
-func NewCFBDecrypter(block Block, iv []byte) Stream {
-	return newCFB(block, iv, true)
-}
-
-func newCFB(block Block, iv []byte, decrypt bool) Stream {
-	blockSize := block.BlockSize()
-	if len(iv) != blockSize {
-		// stack trace will indicate whether it was de or encryption
-		panic("cipher.newCFB: IV length must equal block size")
-	}
-	x := &cfb{
-		b:       block,
-		out:     make([]byte, blockSize),
-		next:    make([]byte, blockSize),
-		outUsed: blockSize,
-		decrypt: decrypt,
-	}
-	copy(x.next, iv)
-
-	return x
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/cfb_test.go b/third_party/gofrontend/libgo/go/crypto/cipher/cfb_test.go
deleted file mode 100644
index 9b544bb..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/cfb_test.go
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cipher_test
-
-import (
-	"bytes"
-	"crypto/aes"
-	"crypto/cipher"
-	"crypto/rand"
-	"encoding/hex"
-	"testing"
-)
-
-// cfbTests contains the test vectors from
-// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section
-// F.3.13.
-var cfbTests = []struct {
-	key, iv, plaintext, ciphertext string
-}{
-	{
-		"2b7e151628aed2a6abf7158809cf4f3c",
-		"000102030405060708090a0b0c0d0e0f",
-		"6bc1bee22e409f96e93d7e117393172a",
-		"3b3fd92eb72dad20333449f8e83cfb4a",
-	},
-	{
-		"2b7e151628aed2a6abf7158809cf4f3c",
-		"3B3FD92EB72DAD20333449F8E83CFB4A",
-		"ae2d8a571e03ac9c9eb76fac45af8e51",
-		"c8a64537a0b3a93fcde3cdad9f1ce58b",
-	},
-	{
-		"2b7e151628aed2a6abf7158809cf4f3c",
-		"C8A64537A0B3A93FCDE3CDAD9F1CE58B",
-		"30c81c46a35ce411e5fbc1191a0a52ef",
-		"26751f67a3cbb140b1808cf187a4f4df",
-	},
-	{
-		"2b7e151628aed2a6abf7158809cf4f3c",
-		"26751F67A3CBB140B1808CF187A4F4DF",
-		"f69f2445df4f9b17ad2b417be66c3710",
-		"c04b05357c5d1c0eeac4c66f9ff7f2e6",
-	},
-}
-
-func TestCFBVectors(t *testing.T) {
-	for i, test := range cfbTests {
-		key, err := hex.DecodeString(test.key)
-		if err != nil {
-			t.Fatal(err)
-		}
-		iv, err := hex.DecodeString(test.iv)
-		if err != nil {
-			t.Fatal(err)
-		}
-		plaintext, err := hex.DecodeString(test.plaintext)
-		if err != nil {
-			t.Fatal(err)
-		}
-		expected, err := hex.DecodeString(test.ciphertext)
-		if err != nil {
-			t.Fatal(err)
-		}
-
-		block, err := aes.NewCipher(key)
-		if err != nil {
-			t.Fatal(err)
-		}
-
-		ciphertext := make([]byte, len(plaintext))
-		cfb := cipher.NewCFBEncrypter(block, iv)
-		cfb.XORKeyStream(ciphertext, plaintext)
-
-		if !bytes.Equal(ciphertext, expected) {
-			t.Errorf("#%d: wrong output: got %x, expected %x", i, ciphertext, expected)
-		}
-
-		cfbdec := cipher.NewCFBDecrypter(block, iv)
-		plaintextCopy := make([]byte, len(ciphertext))
-		cfbdec.XORKeyStream(plaintextCopy, ciphertext)
-
-		if !bytes.Equal(plaintextCopy, plaintextCopy) {
-			t.Errorf("#%d: wrong plaintext: got %x, expected %x", i, plaintextCopy, plaintext)
-		}
-	}
-}
-
-func TestCFBInverse(t *testing.T) {
-	block, err := aes.NewCipher(commonKey128)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	plaintext := []byte("this is the plaintext. this is the plaintext.")
-	iv := make([]byte, block.BlockSize())
-	rand.Reader.Read(iv)
-	cfb := cipher.NewCFBEncrypter(block, iv)
-	ciphertext := make([]byte, len(plaintext))
-	copy(ciphertext, plaintext)
-	cfb.XORKeyStream(ciphertext, ciphertext)
-
-	cfbdec := cipher.NewCFBDecrypter(block, iv)
-	plaintextCopy := make([]byte, len(plaintext))
-	copy(plaintextCopy, ciphertext)
-	cfbdec.XORKeyStream(plaintextCopy, plaintextCopy)
-
-	if !bytes.Equal(plaintextCopy, plaintext) {
-		t.Errorf("got: %x, want: %x", plaintextCopy, plaintext)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/cipher.go b/third_party/gofrontend/libgo/go/crypto/cipher/cipher.go
deleted file mode 100644
index 7d27fde..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/cipher.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package cipher implements standard block cipher modes that can be wrapped
-// around low-level block cipher implementations.
-// See http://csrc.nist.gov/groups/ST/toolkit/BCM/current_modes.html
-// and NIST Special Publication 800-38A.
-package cipher
-
-// A Block represents an implementation of block cipher
-// using a given key.  It provides the capability to encrypt
-// or decrypt individual blocks.  The mode implementations
-// extend that capability to streams of blocks.
-type Block interface {
-	// BlockSize returns the cipher's block size.
-	BlockSize() int
-
-	// Encrypt encrypts the first block in src into dst.
-	// Dst and src may point at the same memory.
-	Encrypt(dst, src []byte)
-
-	// Decrypt decrypts the first block in src into dst.
-	// Dst and src may point at the same memory.
-	Decrypt(dst, src []byte)
-}
-
-// A Stream represents a stream cipher.
-type Stream interface {
-	// XORKeyStream XORs each byte in the given slice with a byte from the
-	// cipher's key stream. Dst and src may point to the same memory.
-	// If len(dst) < len(src), XORKeyStream should panic. It is acceptable
-	// to pass a dst bigger than src, and in that case, XORKeyStream will
-	// only update dst[:len(src)] and will not touch the rest of dst.
-	XORKeyStream(dst, src []byte)
-}
-
-// A BlockMode represents a block cipher running in a block-based mode (CBC,
-// ECB etc).
-type BlockMode interface {
-	// BlockSize returns the mode's block size.
-	BlockSize() int
-
-	// CryptBlocks encrypts or decrypts a number of blocks. The length of
-	// src must be a multiple of the block size. Dst and src may point to
-	// the same memory.
-	CryptBlocks(dst, src []byte)
-}
-
-// Utility routines
-
-func dup(p []byte) []byte {
-	q := make([]byte, len(p))
-	copy(q, p)
-	return q
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/cipher_test.go b/third_party/gofrontend/libgo/go/crypto/cipher/cipher_test.go
deleted file mode 100644
index 8da5bce..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/cipher_test.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cipher_test
-
-import (
-	"crypto/aes"
-	"crypto/cipher"
-	"testing"
-)
-
-func TestCryptBlocks(t *testing.T) {
-	buf := make([]byte, 16)
-	block, _ := aes.NewCipher(buf)
-
-	mode := cipher.NewCBCDecrypter(block, buf)
-	mustPanic(t, "crypto/cipher: input not full blocks", func() { mode.CryptBlocks(buf, buf[:3]) })
-	mustPanic(t, "crypto/cipher: output smaller than input", func() { mode.CryptBlocks(buf[:3], buf) })
-
-	mode = cipher.NewCBCEncrypter(block, buf)
-	mustPanic(t, "crypto/cipher: input not full blocks", func() { mode.CryptBlocks(buf, buf[:3]) })
-	mustPanic(t, "crypto/cipher: output smaller than input", func() { mode.CryptBlocks(buf[:3], buf) })
-}
-
-func mustPanic(t *testing.T, msg string, f func()) {
-	defer func() {
-		err := recover()
-		if err == nil {
-			t.Errorf("function did not panic, wanted %q", msg)
-		} else if err != msg {
-			t.Errorf("got panic %v, wanted %q", err, msg)
-		}
-	}()
-	f()
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/common_test.go b/third_party/gofrontend/libgo/go/crypto/cipher/common_test.go
deleted file mode 100644
index c75c919..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/common_test.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cipher_test
-
-// Common values for tests.
-
-var commonInput = []byte{
-	0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
-	0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
-	0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
-	0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10,
-}
-
-var commonKey128 = []byte{0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c}
-
-var commonKey192 = []byte{
-	0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
-	0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b,
-}
-
-var commonKey256 = []byte{
-	0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
-	0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4,
-}
-
-var commonIV = []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/ctr.go b/third_party/gofrontend/libgo/go/crypto/cipher/ctr.go
deleted file mode 100644
index 70ac40f..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/ctr.go
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Counter (CTR) mode.
-
-// CTR converts a block cipher into a stream cipher by
-// repeatedly encrypting an incrementing counter and
-// xoring the resulting stream of data with the input.
-
-// See NIST SP 800-38A, pp 13-15
-
-package cipher
-
-type ctr struct {
-	b       Block
-	ctr     []byte
-	out     []byte
-	outUsed int
-}
-
-const streamBufferSize = 512
-
-// NewCTR returns a Stream which encrypts/decrypts using the given Block in
-// counter mode. The length of iv must be the same as the Block's block size.
-func NewCTR(block Block, iv []byte) Stream {
-	if len(iv) != block.BlockSize() {
-		panic("cipher.NewCTR: IV length must equal block size")
-	}
-	bufSize := streamBufferSize
-	if bufSize < block.BlockSize() {
-		bufSize = block.BlockSize()
-	}
-	return &ctr{
-		b:       block,
-		ctr:     dup(iv),
-		out:     make([]byte, 0, bufSize),
-		outUsed: 0,
-	}
-}
-
-func (x *ctr) refill() {
-	remain := len(x.out) - x.outUsed
-	if remain > x.outUsed {
-		return
-	}
-	copy(x.out, x.out[x.outUsed:])
-	x.out = x.out[:cap(x.out)]
-	bs := x.b.BlockSize()
-	for remain < len(x.out)-bs {
-		x.b.Encrypt(x.out[remain:], x.ctr)
-		remain += bs
-
-		// Increment counter
-		for i := len(x.ctr) - 1; i >= 0; i-- {
-			x.ctr[i]++
-			if x.ctr[i] != 0 {
-				break
-			}
-		}
-	}
-	x.out = x.out[:remain]
-	x.outUsed = 0
-}
-
-func (x *ctr) XORKeyStream(dst, src []byte) {
-	for len(src) > 0 {
-		if x.outUsed >= len(x.out)-x.b.BlockSize() {
-			x.refill()
-		}
-		n := xorBytes(dst, src, x.out[x.outUsed:])
-		dst = dst[n:]
-		src = src[n:]
-		x.outUsed += n
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/ctr_aes_test.go b/third_party/gofrontend/libgo/go/crypto/cipher/ctr_aes_test.go
deleted file mode 100644
index d019ae0..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/ctr_aes_test.go
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// CTR AES test vectors.
-
-// See U.S. National Institute of Standards and Technology (NIST)
-// Special Publication 800-38A, ``Recommendation for Block Cipher
-// Modes of Operation,'' 2001 Edition, pp. 55-58.
-
-package cipher_test
-
-import (
-	"bytes"
-	"crypto/aes"
-	"crypto/cipher"
-	"testing"
-)
-
-var commonCounter = []byte{0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff}
-
-var ctrAESTests = []struct {
-	name string
-	key  []byte
-	iv   []byte
-	in   []byte
-	out  []byte
-}{
-	// NIST SP 800-38A pp 55-58
-	{
-		"CTR-AES128",
-		commonKey128,
-		commonCounter,
-		commonInput,
-		[]byte{
-			0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26, 0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce,
-			0x98, 0x06, 0xf6, 0x6b, 0x79, 0x70, 0xfd, 0xff, 0x86, 0x17, 0x18, 0x7b, 0xb9, 0xff, 0xfd, 0xff,
-			0x5a, 0xe4, 0xdf, 0x3e, 0xdb, 0xd5, 0xd3, 0x5e, 0x5b, 0x4f, 0x09, 0x02, 0x0d, 0xb0, 0x3e, 0xab,
-			0x1e, 0x03, 0x1d, 0xda, 0x2f, 0xbe, 0x03, 0xd1, 0x79, 0x21, 0x70, 0xa0, 0xf3, 0x00, 0x9c, 0xee,
-		},
-	},
-	{
-		"CTR-AES192",
-		commonKey192,
-		commonCounter,
-		commonInput,
-		[]byte{
-			0x1a, 0xbc, 0x93, 0x24, 0x17, 0x52, 0x1c, 0xa2, 0x4f, 0x2b, 0x04, 0x59, 0xfe, 0x7e, 0x6e, 0x0b,
-			0x09, 0x03, 0x39, 0xec, 0x0a, 0xa6, 0xfa, 0xef, 0xd5, 0xcc, 0xc2, 0xc6, 0xf4, 0xce, 0x8e, 0x94,
-			0x1e, 0x36, 0xb2, 0x6b, 0xd1, 0xeb, 0xc6, 0x70, 0xd1, 0xbd, 0x1d, 0x66, 0x56, 0x20, 0xab, 0xf7,
-			0x4f, 0x78, 0xa7, 0xf6, 0xd2, 0x98, 0x09, 0x58, 0x5a, 0x97, 0xda, 0xec, 0x58, 0xc6, 0xb0, 0x50,
-		},
-	},
-	{
-		"CTR-AES256",
-		commonKey256,
-		commonCounter,
-		commonInput,
-		[]byte{
-			0x60, 0x1e, 0xc3, 0x13, 0x77, 0x57, 0x89, 0xa5, 0xb7, 0xa7, 0xf5, 0x04, 0xbb, 0xf3, 0xd2, 0x28,
-			0xf4, 0x43, 0xe3, 0xca, 0x4d, 0x62, 0xb5, 0x9a, 0xca, 0x84, 0xe9, 0x90, 0xca, 0xca, 0xf5, 0xc5,
-			0x2b, 0x09, 0x30, 0xda, 0xa2, 0x3d, 0xe9, 0x4c, 0xe8, 0x70, 0x17, 0xba, 0x2d, 0x84, 0x98, 0x8d,
-			0xdf, 0xc9, 0xc5, 0x8d, 0xb6, 0x7a, 0xad, 0xa6, 0x13, 0xc2, 0xdd, 0x08, 0x45, 0x79, 0x41, 0xa6,
-		},
-	},
-}
-
-func TestCTR_AES(t *testing.T) {
-	for _, tt := range ctrAESTests {
-		test := tt.name
-
-		c, err := aes.NewCipher(tt.key)
-		if err != nil {
-			t.Errorf("%s: NewCipher(%d bytes) = %s", test, len(tt.key), err)
-			continue
-		}
-
-		for j := 0; j <= 5; j += 5 {
-			in := tt.in[0 : len(tt.in)-j]
-			ctr := cipher.NewCTR(c, tt.iv)
-			encrypted := make([]byte, len(in))
-			ctr.XORKeyStream(encrypted, in)
-			if out := tt.out[0:len(in)]; !bytes.Equal(out, encrypted) {
-				t.Errorf("%s/%d: CTR\ninpt %x\nhave %x\nwant %x", test, len(in), in, encrypted, out)
-			}
-		}
-
-		for j := 0; j <= 7; j += 7 {
-			in := tt.out[0 : len(tt.out)-j]
-			ctr := cipher.NewCTR(c, tt.iv)
-			plain := make([]byte, len(in))
-			ctr.XORKeyStream(plain, in)
-			if out := tt.in[0:len(in)]; !bytes.Equal(out, plain) {
-				t.Errorf("%s/%d: CTRReader\nhave %x\nwant %x", test, len(out), plain, out)
-			}
-		}
-
-		if t.Failed() {
-			break
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/example_test.go b/third_party/gofrontend/libgo/go/crypto/cipher/example_test.go
deleted file mode 100644
index 1cfa982..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/example_test.go
+++ /dev/null
@@ -1,283 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cipher_test
-
-import (
-	"crypto/aes"
-	"crypto/cipher"
-	"crypto/rand"
-	"encoding/hex"
-	"fmt"
-	"io"
-	"os"
-)
-
-func ExampleNewCBCDecrypter() {
-	key := []byte("example key 1234")
-	ciphertext, _ := hex.DecodeString("f363f3ccdcb12bb883abf484ba77d9cd7d32b5baecb3d4b1b3e0e4beffdb3ded")
-
-	block, err := aes.NewCipher(key)
-	if err != nil {
-		panic(err)
-	}
-
-	// The IV needs to be unique, but not secure. Therefore it's common to
-	// include it at the beginning of the ciphertext.
-	if len(ciphertext) < aes.BlockSize {
-		panic("ciphertext too short")
-	}
-	iv := ciphertext[:aes.BlockSize]
-	ciphertext = ciphertext[aes.BlockSize:]
-
-	// CBC mode always works in whole blocks.
-	if len(ciphertext)%aes.BlockSize != 0 {
-		panic("ciphertext is not a multiple of the block size")
-	}
-
-	mode := cipher.NewCBCDecrypter(block, iv)
-
-	// CryptBlocks can work in-place if the two arguments are the same.
-	mode.CryptBlocks(ciphertext, ciphertext)
-
-	// If the original plaintext lengths are not a multiple of the block
-	// size, padding would have to be added when encrypting, which would be
-	// removed at this point. For an example, see
-	// https://tools.ietf.org/html/rfc5246#section-6.2.3.2. However, it's
-	// critical to note that ciphertexts must be authenticated (i.e. by
-	// using crypto/hmac) before being decrypted in order to avoid creating
-	// a padding oracle.
-
-	fmt.Printf("%s\n", ciphertext)
-	// Output: exampleplaintext
-}
-
-func ExampleNewCBCEncrypter() {
-	key := []byte("example key 1234")
-	plaintext := []byte("exampleplaintext")
-
-	// CBC mode works on blocks so plaintexts may need to be padded to the
-	// next whole block. For an example of such padding, see
-	// https://tools.ietf.org/html/rfc5246#section-6.2.3.2. Here we'll
-	// assume that the plaintext is already of the correct length.
-	if len(plaintext)%aes.BlockSize != 0 {
-		panic("plaintext is not a multiple of the block size")
-	}
-
-	block, err := aes.NewCipher(key)
-	if err != nil {
-		panic(err)
-	}
-
-	// The IV needs to be unique, but not secure. Therefore it's common to
-	// include it at the beginning of the ciphertext.
-	ciphertext := make([]byte, aes.BlockSize+len(plaintext))
-	iv := ciphertext[:aes.BlockSize]
-	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
-		panic(err)
-	}
-
-	mode := cipher.NewCBCEncrypter(block, iv)
-	mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext)
-
-	// It's important to remember that ciphertexts must be authenticated
-	// (i.e. by using crypto/hmac) as well as being encrypted in order to
-	// be secure.
-
-	fmt.Printf("%x\n", ciphertext)
-}
-
-func ExampleNewCFBDecrypter() {
-	key := []byte("example key 1234")
-	ciphertext, _ := hex.DecodeString("22277966616d9bc47177bd02603d08c9a67d5380d0fe8cf3b44438dff7b9")
-
-	block, err := aes.NewCipher(key)
-	if err != nil {
-		panic(err)
-	}
-
-	// The IV needs to be unique, but not secure. Therefore it's common to
-	// include it at the beginning of the ciphertext.
-	if len(ciphertext) < aes.BlockSize {
-		panic("ciphertext too short")
-	}
-	iv := ciphertext[:aes.BlockSize]
-	ciphertext = ciphertext[aes.BlockSize:]
-
-	stream := cipher.NewCFBDecrypter(block, iv)
-
-	// XORKeyStream can work in-place if the two arguments are the same.
-	stream.XORKeyStream(ciphertext, ciphertext)
-	fmt.Printf("%s", ciphertext)
-	// Output: some plaintext
-}
-
-func ExampleNewCFBEncrypter() {
-	key := []byte("example key 1234")
-	plaintext := []byte("some plaintext")
-
-	block, err := aes.NewCipher(key)
-	if err != nil {
-		panic(err)
-	}
-
-	// The IV needs to be unique, but not secure. Therefore it's common to
-	// include it at the beginning of the ciphertext.
-	ciphertext := make([]byte, aes.BlockSize+len(plaintext))
-	iv := ciphertext[:aes.BlockSize]
-	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
-		panic(err)
-	}
-
-	stream := cipher.NewCFBEncrypter(block, iv)
-	stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)
-
-	// It's important to remember that ciphertexts must be authenticated
-	// (i.e. by using crypto/hmac) as well as being encrypted in order to
-	// be secure.
-}
-
-func ExampleNewCTR() {
-	key := []byte("example key 1234")
-	plaintext := []byte("some plaintext")
-
-	block, err := aes.NewCipher(key)
-	if err != nil {
-		panic(err)
-	}
-
-	// The IV needs to be unique, but not secure. Therefore it's common to
-	// include it at the beginning of the ciphertext.
-	ciphertext := make([]byte, aes.BlockSize+len(plaintext))
-	iv := ciphertext[:aes.BlockSize]
-	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
-		panic(err)
-	}
-
-	stream := cipher.NewCTR(block, iv)
-	stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)
-
-	// It's important to remember that ciphertexts must be authenticated
-	// (i.e. by using crypto/hmac) as well as being encrypted in order to
-	// be secure.
-
-	// CTR mode is the same for both encryption and decryption, so we can
-	// also decrypt that ciphertext with NewCTR.
-
-	plaintext2 := make([]byte, len(plaintext))
-	stream = cipher.NewCTR(block, iv)
-	stream.XORKeyStream(plaintext2, ciphertext[aes.BlockSize:])
-
-	fmt.Printf("%s\n", plaintext2)
-	// Output: some plaintext
-}
-
-func ExampleNewOFB() {
-	key := []byte("example key 1234")
-	plaintext := []byte("some plaintext")
-
-	block, err := aes.NewCipher(key)
-	if err != nil {
-		panic(err)
-	}
-
-	// The IV needs to be unique, but not secure. Therefore it's common to
-	// include it at the beginning of the ciphertext.
-	ciphertext := make([]byte, aes.BlockSize+len(plaintext))
-	iv := ciphertext[:aes.BlockSize]
-	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
-		panic(err)
-	}
-
-	stream := cipher.NewOFB(block, iv)
-	stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)
-
-	// It's important to remember that ciphertexts must be authenticated
-	// (i.e. by using crypto/hmac) as well as being encrypted in order to
-	// be secure.
-
-	// OFB mode is the same for both encryption and decryption, so we can
-	// also decrypt that ciphertext with NewOFB.
-
-	plaintext2 := make([]byte, len(plaintext))
-	stream = cipher.NewOFB(block, iv)
-	stream.XORKeyStream(plaintext2, ciphertext[aes.BlockSize:])
-
-	fmt.Printf("%s\n", plaintext2)
-	// Output: some plaintext
-}
-
-func ExampleStreamReader() {
-	key := []byte("example key 1234")
-
-	inFile, err := os.Open("encrypted-file")
-	if err != nil {
-		panic(err)
-	}
-	defer inFile.Close()
-
-	block, err := aes.NewCipher(key)
-	if err != nil {
-		panic(err)
-	}
-
-	// If the key is unique for each ciphertext, then it's ok to use a zero
-	// IV.
-	var iv [aes.BlockSize]byte
-	stream := cipher.NewOFB(block, iv[:])
-
-	outFile, err := os.OpenFile("decrypted-file", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
-	if err != nil {
-		panic(err)
-	}
-	defer outFile.Close()
-
-	reader := &cipher.StreamReader{S: stream, R: inFile}
-	// Copy the input file to the output file, decrypting as we go.
-	if _, err := io.Copy(outFile, reader); err != nil {
-		panic(err)
-	}
-
-	// Note that this example is simplistic in that it omits any
-	// authentication of the encrypted data. If you were actually to use
-	// StreamReader in this manner, an attacker could flip arbitrary bits in
-	// the output.
-}
-
-func ExampleStreamWriter() {
-	key := []byte("example key 1234")
-
-	inFile, err := os.Open("plaintext-file")
-	if err != nil {
-		panic(err)
-	}
-	defer inFile.Close()
-
-	block, err := aes.NewCipher(key)
-	if err != nil {
-		panic(err)
-	}
-
-	// If the key is unique for each ciphertext, then it's ok to use a zero
-	// IV.
-	var iv [aes.BlockSize]byte
-	stream := cipher.NewOFB(block, iv[:])
-
-	outFile, err := os.OpenFile("encrypted-file", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
-	if err != nil {
-		panic(err)
-	}
-	defer outFile.Close()
-
-	writer := &cipher.StreamWriter{S: stream, W: outFile}
-	// Copy the input file to the output file, encrypting as we go.
-	if _, err := io.Copy(writer, inFile); err != nil {
-		panic(err)
-	}
-
-	// Note that this example is simplistic in that it omits any
-	// authentication of the encrypted data. If you were actually to use
-	// StreamReader in this manner, an attacker could flip arbitrary bits in
-	// the decrypted result.
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/gcm.go b/third_party/gofrontend/libgo/go/crypto/cipher/gcm.go
deleted file mode 100644
index bbdf9f5..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/gcm.go
+++ /dev/null
@@ -1,373 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cipher
-
-import (
-	"crypto/subtle"
-	"errors"
-)
-
-// AEAD is a cipher mode providing authenticated encryption with associated
-// data.
-type AEAD interface {
-	// NonceSize returns the size of the nonce that must be passed to Seal
-	// and Open.
-	NonceSize() int
-
-	// Overhead returns the maximum difference between the lengths of a
-	// plaintext and ciphertext.
-	Overhead() int
-
-	// Seal encrypts and authenticates plaintext, authenticates the
-	// additional data and appends the result to dst, returning the updated
-	// slice. The nonce must be NonceSize() bytes long and unique for all
-	// time, for a given key.
-	//
-	// The plaintext and dst may alias exactly or not at all.
-	Seal(dst, nonce, plaintext, data []byte) []byte
-
-	// Open decrypts and authenticates ciphertext, authenticates the
-	// additional data and, if successful, appends the resulting plaintext
-	// to dst, returning the updated slice. The nonce must be NonceSize()
-	// bytes long and both it and the additional data must match the
-	// value passed to Seal.
-	//
-	// The ciphertext and dst may alias exactly or not at all.
-	Open(dst, nonce, ciphertext, data []byte) ([]byte, error)
-}
-
-// gcmFieldElement represents a value in GF(2¹²⁸). In order to reflect the GCM
-// standard and make getUint64 suitable for marshaling these values, the bits
-// are stored backwards. For example:
-//   the coefficient of x⁰ can be obtained by v.low >> 63.
-//   the coefficient of x⁶³ can be obtained by v.low & 1.
-//   the coefficient of x⁶⁴ can be obtained by v.high >> 63.
-//   the coefficient of x¹²⁷ can be obtained by v.high & 1.
-type gcmFieldElement struct {
-	low, high uint64
-}
-
-// gcm represents a Galois Counter Mode with a specific key. See
-// http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf
-type gcm struct {
-	cipher    Block
-	nonceSize int
-	// productTable contains the first sixteen powers of the key, H.
-	// However, they are in bit reversed order. See NewGCMWithNonceSize.
-	productTable [16]gcmFieldElement
-}
-
-// NewGCM returns the given 128-bit, block cipher wrapped in Galois Counter Mode
-// with the standard nonce length.
-func NewGCM(cipher Block) (AEAD, error) {
-	return NewGCMWithNonceSize(cipher, gcmStandardNonceSize)
-}
-
-// NewGCMWithNonceSize returns the given 128-bit, block cipher wrapped in Galois
-// Counter Mode, which accepts nonces of the given length.
-//
-// Only use this function if you require compatibility with an existing
-// cryptosystem that uses non-standard nonce lengths. All other users should use
-// NewGCM, which is faster and more resistant to misuse.
-func NewGCMWithNonceSize(cipher Block, size int) (AEAD, error) {
-	if cipher.BlockSize() != gcmBlockSize {
-		return nil, errors.New("cipher: NewGCM requires 128-bit block cipher")
-	}
-
-	var key [gcmBlockSize]byte
-	cipher.Encrypt(key[:], key[:])
-
-	g := &gcm{cipher: cipher, nonceSize: size}
-
-	// We precompute 16 multiples of |key|. However, when we do lookups
-	// into this table we'll be using bits from a field element and
-	// therefore the bits will be in the reverse order. So normally one
-	// would expect, say, 4*key to be in index 4 of the table but due to
-	// this bit ordering it will actually be in index 0010 (base 2) = 2.
-	x := gcmFieldElement{
-		getUint64(key[:8]),
-		getUint64(key[8:]),
-	}
-	g.productTable[reverseBits(1)] = x
-
-	for i := 2; i < 16; i += 2 {
-		g.productTable[reverseBits(i)] = gcmDouble(&g.productTable[reverseBits(i/2)])
-		g.productTable[reverseBits(i+1)] = gcmAdd(&g.productTable[reverseBits(i)], &x)
-	}
-
-	return g, nil
-}
-
-const (
-	gcmBlockSize         = 16
-	gcmTagSize           = 16
-	gcmStandardNonceSize = 12
-)
-
-func (g *gcm) NonceSize() int {
-	return g.nonceSize
-}
-
-func (*gcm) Overhead() int {
-	return gcmTagSize
-}
-
-func (g *gcm) Seal(dst, nonce, plaintext, data []byte) []byte {
-	if len(nonce) != g.nonceSize {
-		panic("cipher: incorrect nonce length given to GCM")
-	}
-	ret, out := sliceForAppend(dst, len(plaintext)+gcmTagSize)
-
-	var counter, tagMask [gcmBlockSize]byte
-	g.deriveCounter(&counter, nonce)
-
-	g.cipher.Encrypt(tagMask[:], counter[:])
-	gcmInc32(&counter)
-
-	g.counterCrypt(out, plaintext, &counter)
-	g.auth(out[len(plaintext):], out[:len(plaintext)], data, &tagMask)
-
-	return ret
-}
-
-var errOpen = errors.New("cipher: message authentication failed")
-
-func (g *gcm) Open(dst, nonce, ciphertext, data []byte) ([]byte, error) {
-	if len(nonce) != g.nonceSize {
-		panic("cipher: incorrect nonce length given to GCM")
-	}
-
-	if len(ciphertext) < gcmTagSize {
-		return nil, errOpen
-	}
-	tag := ciphertext[len(ciphertext)-gcmTagSize:]
-	ciphertext = ciphertext[:len(ciphertext)-gcmTagSize]
-
-	var counter, tagMask [gcmBlockSize]byte
-	g.deriveCounter(&counter, nonce)
-
-	g.cipher.Encrypt(tagMask[:], counter[:])
-	gcmInc32(&counter)
-
-	var expectedTag [gcmTagSize]byte
-	g.auth(expectedTag[:], ciphertext, data, &tagMask)
-
-	if subtle.ConstantTimeCompare(expectedTag[:], tag) != 1 {
-		return nil, errOpen
-	}
-
-	ret, out := sliceForAppend(dst, len(ciphertext))
-	g.counterCrypt(out, ciphertext, &counter)
-
-	return ret, nil
-}
-
-// reverseBits reverses the order of the bits of 4-bit number in i.
-func reverseBits(i int) int {
-	i = ((i << 2) & 0xc) | ((i >> 2) & 0x3)
-	i = ((i << 1) & 0xa) | ((i >> 1) & 0x5)
-	return i
-}
-
-// gcmAdd adds two elements of GF(2¹²⁸) and returns the sum.
-func gcmAdd(x, y *gcmFieldElement) gcmFieldElement {
-	// Addition in a characteristic 2 field is just XOR.
-	return gcmFieldElement{x.low ^ y.low, x.high ^ y.high}
-}
-
-// gcmDouble returns the result of doubling an element of GF(2¹²⁸).
-func gcmDouble(x *gcmFieldElement) (double gcmFieldElement) {
-	msbSet := x.high&1 == 1
-
-	// Because of the bit-ordering, doubling is actually a right shift.
-	double.high = x.high >> 1
-	double.high |= x.low << 63
-	double.low = x.low >> 1
-
-	// If the most-significant bit was set before shifting then it,
-	// conceptually, becomes a term of x^128. This is greater than the
-	// irreducible polynomial so the result has to be reduced. The
-	// irreducible polynomial is 1+x+x^2+x^7+x^128. We can subtract that to
-	// eliminate the term at x^128 which also means subtracting the other
-	// four terms. In characteristic 2 fields, subtraction == addition ==
-	// XOR.
-	if msbSet {
-		double.low ^= 0xe100000000000000
-	}
-
-	return
-}
-
-var gcmReductionTable = []uint16{
-	0x0000, 0x1c20, 0x3840, 0x2460, 0x7080, 0x6ca0, 0x48c0, 0x54e0,
-	0xe100, 0xfd20, 0xd940, 0xc560, 0x9180, 0x8da0, 0xa9c0, 0xb5e0,
-}
-
-// mul sets y to y*H, where H is the GCM key, fixed during NewGCMWithNonceSize.
-func (g *gcm) mul(y *gcmFieldElement) {
-	var z gcmFieldElement
-
-	for i := 0; i < 2; i++ {
-		word := y.high
-		if i == 1 {
-			word = y.low
-		}
-
-		// Multiplication works by multiplying z by 16 and adding in
-		// one of the precomputed multiples of H.
-		for j := 0; j < 64; j += 4 {
-			msw := z.high & 0xf
-			z.high >>= 4
-			z.high |= z.low << 60
-			z.low >>= 4
-			z.low ^= uint64(gcmReductionTable[msw]) << 48
-
-			// the values in |table| are ordered for
-			// little-endian bit positions. See the comment
-			// in NewGCMWithNonceSize.
-			t := &g.productTable[word&0xf]
-
-			z.low ^= t.low
-			z.high ^= t.high
-			word >>= 4
-		}
-	}
-
-	*y = z
-}
-
-// updateBlocks extends y with more polynomial terms from blocks, based on
-// Horner's rule. There must be a multiple of gcmBlockSize bytes in blocks.
-func (g *gcm) updateBlocks(y *gcmFieldElement, blocks []byte) {
-	for len(blocks) > 0 {
-		y.low ^= getUint64(blocks)
-		y.high ^= getUint64(blocks[8:])
-		g.mul(y)
-		blocks = blocks[gcmBlockSize:]
-	}
-}
-
-// update extends y with more polynomial terms from data. If data is not a
-// multiple of gcmBlockSize bytes long then the remainder is zero padded.
-func (g *gcm) update(y *gcmFieldElement, data []byte) {
-	fullBlocks := (len(data) >> 4) << 4
-	g.updateBlocks(y, data[:fullBlocks])
-
-	if len(data) != fullBlocks {
-		var partialBlock [gcmBlockSize]byte
-		copy(partialBlock[:], data[fullBlocks:])
-		g.updateBlocks(y, partialBlock[:])
-	}
-}
-
-// gcmInc32 treats the final four bytes of counterBlock as a big-endian value
-// and increments it.
-func gcmInc32(counterBlock *[16]byte) {
-	for i := gcmBlockSize - 1; i >= gcmBlockSize-4; i-- {
-		counterBlock[i]++
-		if counterBlock[i] != 0 {
-			break
-		}
-	}
-}
-
-// sliceForAppend takes a slice and a requested number of bytes. It returns a
-// slice with the contents of the given slice followed by that many bytes and a
-// second slice that aliases into it and contains only the extra bytes. If the
-// original slice has sufficient capacity then no allocation is performed.
-func sliceForAppend(in []byte, n int) (head, tail []byte) {
-	if total := len(in) + n; cap(in) >= total {
-		head = in[:total]
-	} else {
-		head = make([]byte, total)
-		copy(head, in)
-	}
-	tail = head[len(in):]
-	return
-}
-
-// counterCrypt crypts in to out using g.cipher in counter mode.
-func (g *gcm) counterCrypt(out, in []byte, counter *[gcmBlockSize]byte) {
-	var mask [gcmBlockSize]byte
-
-	for len(in) >= gcmBlockSize {
-		g.cipher.Encrypt(mask[:], counter[:])
-		gcmInc32(counter)
-
-		xorWords(out, in, mask[:])
-		out = out[gcmBlockSize:]
-		in = in[gcmBlockSize:]
-	}
-
-	if len(in) > 0 {
-		g.cipher.Encrypt(mask[:], counter[:])
-		gcmInc32(counter)
-		xorBytes(out, in, mask[:])
-	}
-}
-
-// deriveCounter computes the initial GCM counter state from the given nonce.
-// See NIST SP 800-38D, section 7.1. This assumes that counter is filled with
-// zeros on entry.
-func (g *gcm) deriveCounter(counter *[gcmBlockSize]byte, nonce []byte) {
-	// GCM has two modes of operation with respect to the initial counter
-	// state: a "fast path" for 96-bit (12-byte) nonces, and a "slow path"
-	// for nonces of other lengths. For a 96-bit nonce, the nonce, along
-	// with a four-byte big-endian counter starting at one, is used
-	// directly as the starting counter. For other nonce sizes, the counter
-	// is computed by passing it through the GHASH function.
-	if len(nonce) == gcmStandardNonceSize {
-		copy(counter[:], nonce)
-		counter[gcmBlockSize-1] = 1
-	} else {
-		var y gcmFieldElement
-		g.update(&y, nonce)
-		y.high ^= uint64(len(nonce)) * 8
-		g.mul(&y)
-		putUint64(counter[:8], y.low)
-		putUint64(counter[8:], y.high)
-	}
-}
-
-// auth calculates GHASH(ciphertext, additionalData), masks the result with
-// tagMask and writes the result to out.
-func (g *gcm) auth(out, ciphertext, additionalData []byte, tagMask *[gcmTagSize]byte) {
-	var y gcmFieldElement
-	g.update(&y, additionalData)
-	g.update(&y, ciphertext)
-
-	y.low ^= uint64(len(additionalData)) * 8
-	y.high ^= uint64(len(ciphertext)) * 8
-
-	g.mul(&y)
-
-	putUint64(out, y.low)
-	putUint64(out[8:], y.high)
-
-	xorWords(out, out, tagMask[:])
-}
-
-func getUint64(data []byte) uint64 {
-	r := uint64(data[0])<<56 |
-		uint64(data[1])<<48 |
-		uint64(data[2])<<40 |
-		uint64(data[3])<<32 |
-		uint64(data[4])<<24 |
-		uint64(data[5])<<16 |
-		uint64(data[6])<<8 |
-		uint64(data[7])
-	return r
-}
-
-func putUint64(out []byte, v uint64) {
-	out[0] = byte(v >> 56)
-	out[1] = byte(v >> 48)
-	out[2] = byte(v >> 40)
-	out[3] = byte(v >> 32)
-	out[4] = byte(v >> 24)
-	out[5] = byte(v >> 16)
-	out[6] = byte(v >> 8)
-	out[7] = byte(v)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/gcm_test.go b/third_party/gofrontend/libgo/go/crypto/cipher/gcm_test.go
deleted file mode 100644
index 81b9aa2..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/gcm_test.go
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cipher_test
-
-import (
-	"bytes"
-	"crypto/aes"
-	"crypto/cipher"
-	"encoding/hex"
-	"testing"
-)
-
-// AES-GCM test vectors taken from gcmEncryptExtIV128.rsp from
-// http://csrc.nist.gov/groups/STM/cavp/index.html.
-var aesGCMTests = []struct {
-	key, nonce, plaintext, ad, result string
-}{
-	{
-		"11754cd72aec309bf52f7687212e8957",
-		"3c819d9a9bed087615030b65",
-		"",
-		"",
-		"250327c674aaf477aef2675748cf6971",
-	},
-	{
-		"ca47248ac0b6f8372a97ac43508308ed",
-		"ffd2b598feabc9019262d2be",
-		"",
-		"",
-		"60d20404af527d248d893ae495707d1a",
-	},
-	{
-		"77be63708971c4e240d1cb79e8d77feb",
-		"e0e00f19fed7ba0136a797f3",
-		"",
-		"7a43ec1d9c0a5a78a0b16533a6213cab",
-		"209fcc8d3675ed938e9c7166709dd946",
-	},
-	{
-		"7680c5d3ca6154758e510f4d25b98820",
-		"f8f105f9c3df4965780321f8",
-		"",
-		"c94c410194c765e3dcc7964379758ed3",
-		"94dca8edfcf90bb74b153c8d48a17930",
-	},
-	{
-		"7fddb57453c241d03efbed3ac44e371c",
-		"ee283a3fc75575e33efd4887",
-		"d5de42b461646c255c87bd2962d3b9a2",
-		"",
-		"2ccda4a5415cb91e135c2a0f78c9b2fdb36d1df9b9d5e596f83e8b7f52971cb3",
-	},
-	{
-		"ab72c77b97cb5fe9a382d9fe81ffdbed",
-		"54cc7dc2c37ec006bcc6d1da",
-		"007c5e5b3e59df24a7c355584fc1518d",
-		"",
-		"0e1bde206a07a9c2c1b65300f8c649972b4401346697138c7a4891ee59867d0c",
-	},
-	{
-		"fe47fcce5fc32665d2ae399e4eec72ba",
-		"5adb9609dbaeb58cbd6e7275",
-		"7c0e88c88899a779228465074797cd4c2e1498d259b54390b85e3eef1c02df60e743f1b840382c4bccaf3bafb4ca8429bea063",
-		"88319d6e1d3ffa5f987199166c8a9b56c2aeba5a",
-		"98f4826f05a265e6dd2be82db241c0fbbbf9ffb1c173aa83964b7cf5393043736365253ddbc5db8778371495da76d269e5db3e291ef1982e4defedaa2249f898556b47",
-	},
-	{
-		"ec0c2ba17aa95cd6afffe949da9cc3a8",
-		"296bce5b50b7d66096d627ef",
-		"b85b3753535b825cbe5f632c0b843c741351f18aa484281aebec2f45bb9eea2d79d987b764b9611f6c0f8641843d5d58f3a242",
-		"f8d00f05d22bf68599bcdeb131292ad6e2df5d14",
-		"a7443d31c26bdf2a1c945e29ee4bd344a99cfaf3aa71f8b3f191f83c2adfc7a07162995506fde6309ffc19e716eddf1a828c5a890147971946b627c40016da1ecf3e77",
-	},
-	{
-		"2c1f21cf0f6fb3661943155c3e3d8492",
-		"23cb5ff362e22426984d1907",
-		"42f758836986954db44bf37c6ef5e4ac0adaf38f27252a1b82d02ea949c8a1a2dbc0d68b5615ba7c1220ff6510e259f06655d8",
-		"5d3624879d35e46849953e45a32a624d6a6c536ed9857c613b572b0333e701557a713e3f010ecdf9a6bd6c9e3e44b065208645aff4aabee611b391528514170084ccf587177f4488f33cfb5e979e42b6e1cfc0a60238982a7aec",
-		"81824f0e0d523db30d3da369fdc0d60894c7a0a20646dd015073ad2732bd989b14a222b6ad57af43e1895df9dca2a5344a62cc57a3ee28136e94c74838997ae9823f3a",
-	},
-	{
-		"d9f7d2411091f947b4d6f1e2d1f0fb2e",
-		"e1934f5db57cc983e6b180e7",
-		"73ed042327f70fe9c572a61545eda8b2a0c6e1d6c291ef19248e973aee6c312012f490c2c6f6166f4a59431e182663fcaea05a",
-		"0a8a18a7150e940c3d87b38e73baee9a5c049ee21795663e264b694a949822b639092d0e67015e86363583fcf0ca645af9f43375f05fdb4ce84f411dcbca73c2220dea03a20115d2e51398344b16bee1ed7c499b353d6c597af8",
-		"aaadbd5c92e9151ce3db7210b8714126b73e43436d242677afa50384f2149b831f1d573c7891c2a91fbc48db29967ec9542b2321b51ca862cb637cdd03b99a0f93b134",
-	},
-	{
-		"fe9bb47deb3a61e423c2231841cfd1fb",
-		"4d328eb776f500a2f7fb47aa",
-		"f1cc3818e421876bb6b8bbd6c9",
-		"",
-		"b88c5c1977b35b517b0aeae96743fd4727fe5cdb4b5b42818dea7ef8c9",
-	},
-	{
-		"6703df3701a7f54911ca72e24dca046a",
-		"12823ab601c350ea4bc2488c",
-		"793cd125b0b84a043e3ac67717",
-		"",
-		"b2051c80014f42f08735a7b0cd38e6bcd29962e5f2c13626b85a877101",
-	},
-	// These cases test non-standard nonce sizes.
-	{
-		"1672c3537afa82004c6b8a46f6f0d026",
-		"05",
-		"",
-		"",
-		"8e2ad721f9455f74d8b53d3141f27e8e",
-	},
-	{
-		"9a4fea86a621a91ab371e492457796c0",
-		"75",
-		"ca6131faf0ff210e4e693d6c31c109fc5b6f54224eb120f37de31dc59ec669b6",
-		"4f6e2585c161f05a9ae1f2f894e9f0ab52b45d0f",
-		"5698c0a384241d30004290aac56bb3ece6fe8eacc5c4be98954deb9c3ff6aebf5d50e1af100509e1fba2a5e8a0af9670",
-	},
-	{
-		"d0f1f4defa1e8c08b4b26d576392027c",
-		"42b4f01eb9f5a1ea5b1eb73b0fb0baed54f387ecaa0393c7d7dffc6af50146ecc021abf7eb9038d4303d91f8d741a11743166c0860208bcc02c6258fd9511a2fa626f96d60b72fcff773af4e88e7a923506e4916ecbd814651e9f445adef4ad6a6b6c7290cc13b956130eef5b837c939fcac0cbbcc9656cd75b13823ee5acdac",
-		"",
-		"",
-		"7ab49b57ddf5f62c427950111c5c4f0d",
-	},
-	{
-		"4a0c00a3d284dea9d4bf8b8dde86685e",
-		"f8cbe82588e784bcacbe092cd9089b51e01527297f635bf294b3aa787d91057ef23869789698ac960707857f163ecb242135a228ad93964f5dc4a4d7f88fd7b3b07dd0a5b37f9768fb05a523639f108c34c661498a56879e501a2321c8a4a94d7e1b89db255ac1f685e185263368e99735ebe62a7f2931b47282be8eb165e4d7",
-		"6d4bf87640a6a48a50d28797b7",
-		"8d8c7ffc55086d539b5a8f0d1232654c",
-		"0d803ec309482f35b8e6226f2b56303239298e06b281c2d51aaba3c125",
-	},
-}
-
-func TestAESGCM(t *testing.T) {
-	for i, test := range aesGCMTests {
-		key, _ := hex.DecodeString(test.key)
-		aes, err := aes.NewCipher(key)
-		if err != nil {
-			t.Fatal(err)
-		}
-
-		nonce, _ := hex.DecodeString(test.nonce)
-		plaintext, _ := hex.DecodeString(test.plaintext)
-		ad, _ := hex.DecodeString(test.ad)
-		aesgcm, err := cipher.NewGCMWithNonceSize(aes, len(nonce))
-		if err != nil {
-			t.Fatal(err)
-		}
-
-		ct := aesgcm.Seal(nil, nonce, plaintext, ad)
-		if ctHex := hex.EncodeToString(ct); ctHex != test.result {
-			t.Errorf("#%d: got %s, want %s", i, ctHex, test.result)
-			continue
-		}
-
-		plaintext2, err := aesgcm.Open(nil, nonce, ct, ad)
-		if err != nil {
-			t.Errorf("#%d: Open failed", i)
-			continue
-		}
-
-		if !bytes.Equal(plaintext, plaintext2) {
-			t.Errorf("#%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext)
-			continue
-		}
-
-		if len(ad) > 0 {
-			ad[0] ^= 0x80
-			if _, err := aesgcm.Open(nil, nonce, ct, ad); err == nil {
-				t.Errorf("#%d: Open was successful after altering additional data", i)
-			}
-			ad[0] ^= 0x80
-		}
-
-		nonce[0] ^= 0x80
-		if _, err := aesgcm.Open(nil, nonce, ct, ad); err == nil {
-			t.Errorf("#%d: Open was successful after altering nonce", i)
-		}
-		nonce[0] ^= 0x80
-
-		ct[0] ^= 0x80
-		if _, err := aesgcm.Open(nil, nonce, ct, ad); err == nil {
-			t.Errorf("#%d: Open was successful after altering ciphertext", i)
-		}
-		ct[0] ^= 0x80
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/io.go b/third_party/gofrontend/libgo/go/crypto/cipher/io.go
deleted file mode 100644
index 3938c0a..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/io.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cipher
-
-import "io"
-
-// The Stream* objects are so simple that all their members are public. Users
-// can create them themselves.
-
-// StreamReader wraps a Stream into an io.Reader. It calls XORKeyStream
-// to process each slice of data which passes through.
-type StreamReader struct {
-	S Stream
-	R io.Reader
-}
-
-func (r StreamReader) Read(dst []byte) (n int, err error) {
-	n, err = r.R.Read(dst)
-	r.S.XORKeyStream(dst[:n], dst[:n])
-	return
-}
-
-// StreamWriter wraps a Stream into an io.Writer. It calls XORKeyStream
-// to process each slice of data which passes through. If any Write call
-// returns short then the StreamWriter is out of sync and must be discarded.
-// A StreamWriter has no internal buffering; Close does not need
-// to be called to flush write data.
-type StreamWriter struct {
-	S   Stream
-	W   io.Writer
-	Err error // unused
-}
-
-func (w StreamWriter) Write(src []byte) (n int, err error) {
-	c := make([]byte, len(src))
-	w.S.XORKeyStream(c, src)
-	n, err = w.W.Write(c)
-	if n != len(src) {
-		if err == nil { // should never happen
-			err = io.ErrShortWrite
-		}
-	}
-	return
-}
-
-// Close closes the underlying Writer and returns its Close return value, if the Writer
-// is also an io.Closer. Otherwise it returns nil.
-func (w StreamWriter) Close() error {
-	if c, ok := w.W.(io.Closer); ok {
-		return c.Close()
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/ofb.go b/third_party/gofrontend/libgo/go/crypto/cipher/ofb.go
deleted file mode 100644
index e86ebcb..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/ofb.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// OFB (Output Feedback) Mode.
-
-package cipher
-
-type ofb struct {
-	b       Block
-	cipher  []byte
-	out     []byte
-	outUsed int
-}
-
-// NewOFB returns a Stream that encrypts or decrypts using the block cipher b
-// in output feedback mode. The initialization vector iv's length must be equal
-// to b's block size.
-func NewOFB(b Block, iv []byte) Stream {
-	blockSize := b.BlockSize()
-	if len(iv) != blockSize {
-		return nil
-	}
-	bufSize := streamBufferSize
-	if bufSize < blockSize {
-		bufSize = blockSize
-	}
-	x := &ofb{
-		b:       b,
-		cipher:  make([]byte, blockSize),
-		out:     make([]byte, 0, bufSize),
-		outUsed: 0,
-	}
-
-	copy(x.cipher, iv)
-	return x
-}
-
-func (x *ofb) refill() {
-	bs := x.b.BlockSize()
-	remain := len(x.out) - x.outUsed
-	if remain > x.outUsed {
-		return
-	}
-	copy(x.out, x.out[x.outUsed:])
-	x.out = x.out[:cap(x.out)]
-	for remain < len(x.out)-bs {
-		x.b.Encrypt(x.cipher, x.cipher)
-		copy(x.out[remain:], x.cipher)
-		remain += bs
-	}
-	x.out = x.out[:remain]
-	x.outUsed = 0
-}
-
-func (x *ofb) XORKeyStream(dst, src []byte) {
-	for len(src) > 0 {
-		if x.outUsed >= len(x.out)-x.b.BlockSize() {
-			x.refill()
-		}
-		n := xorBytes(dst, src, x.out[x.outUsed:])
-		dst = dst[n:]
-		src = src[n:]
-		x.outUsed += n
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/ofb_test.go b/third_party/gofrontend/libgo/go/crypto/cipher/ofb_test.go
deleted file mode 100644
index 8d3c5d3..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/ofb_test.go
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// OFB AES test vectors.
-
-// See U.S. National Institute of Standards and Technology (NIST)
-// Special Publication 800-38A, ``Recommendation for Block Cipher
-// Modes of Operation,'' 2001 Edition, pp. 52-55.
-
-package cipher_test
-
-import (
-	"bytes"
-	"crypto/aes"
-	"crypto/cipher"
-	"testing"
-)
-
-type ofbTest struct {
-	name string
-	key  []byte
-	iv   []byte
-	in   []byte
-	out  []byte
-}
-
-var ofbTests = []ofbTest{
-	// NIST SP 800-38A pp 52-55
-	{
-		"OFB-AES128",
-		commonKey128,
-		commonIV,
-		commonInput,
-		[]byte{
-			0x3b, 0x3f, 0xd9, 0x2e, 0xb7, 0x2d, 0xad, 0x20, 0x33, 0x34, 0x49, 0xf8, 0xe8, 0x3c, 0xfb, 0x4a,
-			0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03, 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25,
-			0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6, 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc,
-			0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78, 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e,
-		},
-	},
-	{
-		"OFB-AES192",
-		commonKey192,
-		commonIV,
-		commonInput,
-		[]byte{
-			0xcd, 0xc8, 0x0d, 0x6f, 0xdd, 0xf1, 0x8c, 0xab, 0x34, 0xc2, 0x59, 0x09, 0xc9, 0x9a, 0x41, 0x74,
-			0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c, 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01,
-			0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f, 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2,
-			0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e, 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a,
-		},
-	},
-	{
-		"OFB-AES256",
-		commonKey256,
-		commonIV,
-		commonInput,
-		[]byte{
-			0xdc, 0x7e, 0x84, 0xbf, 0xda, 0x79, 0x16, 0x4b, 0x7e, 0xcd, 0x84, 0x86, 0x98, 0x5d, 0x38, 0x60,
-			0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a, 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d,
-			0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed, 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08,
-			0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8, 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84,
-		},
-	},
-}
-
-func TestOFB(t *testing.T) {
-	for _, tt := range ofbTests {
-		test := tt.name
-
-		c, err := aes.NewCipher(tt.key)
-		if err != nil {
-			t.Errorf("%s: NewCipher(%d bytes) = %s", test, len(tt.key), err)
-			continue
-		}
-
-		for j := 0; j <= 5; j += 5 {
-			plaintext := tt.in[0 : len(tt.in)-j]
-			ofb := cipher.NewOFB(c, tt.iv)
-			ciphertext := make([]byte, len(plaintext))
-			ofb.XORKeyStream(ciphertext, plaintext)
-			if !bytes.Equal(ciphertext, tt.out[:len(plaintext)]) {
-				t.Errorf("%s/%d: encrypting\ninput % x\nhave % x\nwant % x", test, len(plaintext), plaintext, ciphertext, tt.out)
-			}
-		}
-
-		for j := 0; j <= 5; j += 5 {
-			ciphertext := tt.out[0 : len(tt.in)-j]
-			ofb := cipher.NewOFB(c, tt.iv)
-			plaintext := make([]byte, len(ciphertext))
-			ofb.XORKeyStream(plaintext, ciphertext)
-			if !bytes.Equal(plaintext, tt.in[:len(ciphertext)]) {
-				t.Errorf("%s/%d: decrypting\nhave % x\nwant % x", test, len(ciphertext), plaintext, tt.in)
-			}
-		}
-
-		if t.Failed() {
-			break
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/xor.go b/third_party/gofrontend/libgo/go/crypto/cipher/xor.go
deleted file mode 100644
index f88dc89..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/xor.go
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cipher
-
-import (
-	"runtime"
-	"unsafe"
-)
-
-const wordSize = int(unsafe.Sizeof(uintptr(0)))
-const supportsUnaligned = runtime.GOARCH == "386" || runtime.GOARCH == "amd64"
-
-// fastXORBytes xors in bulk. It only works on architectures that
-// support unaligned read/writes.
-func fastXORBytes(dst, a, b []byte) int {
-	n := len(a)
-	if len(b) < n {
-		n = len(b)
-	}
-
-	w := n / wordSize
-	if w > 0 {
-		dw := *(*[]uintptr)(unsafe.Pointer(&dst))
-		aw := *(*[]uintptr)(unsafe.Pointer(&a))
-		bw := *(*[]uintptr)(unsafe.Pointer(&b))
-		for i := 0; i < w; i++ {
-			dw[i] = aw[i] ^ bw[i]
-		}
-	}
-
-	for i := (n - n%wordSize); i < n; i++ {
-		dst[i] = a[i] ^ b[i]
-	}
-
-	return n
-}
-
-func safeXORBytes(dst, a, b []byte) int {
-	n := len(a)
-	if len(b) < n {
-		n = len(b)
-	}
-	for i := 0; i < n; i++ {
-		dst[i] = a[i] ^ b[i]
-	}
-	return n
-}
-
-// xorBytes xors the bytes in a and b. The destination is assumed to have enough
-// space. Returns the number of bytes xor'd.
-func xorBytes(dst, a, b []byte) int {
-	if supportsUnaligned {
-		return fastXORBytes(dst, a, b)
-	} else {
-		// TODO(hanwen): if (dst, a, b) have common alignment
-		// we could still try fastXORBytes. It is not clear
-		// how often this happens, and it's only worth it if
-		// the block encryption itself is hardware
-		// accelerated.
-		return safeXORBytes(dst, a, b)
-	}
-}
-
-// fastXORWords XORs multiples of 4 or 8 bytes (depending on architecture.)
-// The arguments are assumed to be of equal length.
-func fastXORWords(dst, a, b []byte) {
-	dw := *(*[]uintptr)(unsafe.Pointer(&dst))
-	aw := *(*[]uintptr)(unsafe.Pointer(&a))
-	bw := *(*[]uintptr)(unsafe.Pointer(&b))
-	n := len(b) / wordSize
-	for i := 0; i < n; i++ {
-		dw[i] = aw[i] ^ bw[i]
-	}
-}
-
-func xorWords(dst, a, b []byte) {
-	if supportsUnaligned {
-		fastXORWords(dst, a, b)
-	} else {
-		safeXORBytes(dst, a, b)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/cipher/xor_test.go b/third_party/gofrontend/libgo/go/crypto/cipher/xor_test.go
deleted file mode 100644
index cc1c9d7..0000000
--- a/third_party/gofrontend/libgo/go/crypto/cipher/xor_test.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cipher
-
-import (
-	"bytes"
-	"testing"
-)
-
-func TestXOR(t *testing.T) {
-	for alignP := 0; alignP < 2; alignP++ {
-		for alignQ := 0; alignQ < 2; alignQ++ {
-			for alignD := 0; alignD < 2; alignD++ {
-				p := make([]byte, 1024)[alignP:]
-				q := make([]byte, 1024)[alignQ:]
-				d1 := make([]byte, 1024+alignD)[alignD:]
-				d2 := make([]byte, 1024+alignD)[alignD:]
-				xorBytes(d1, p, q)
-				safeXORBytes(d2, p, q)
-				if bytes.Compare(d1, d2) != 0 {
-					t.Error("not equal")
-				}
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/crypto.go b/third_party/gofrontend/libgo/go/crypto/crypto.go
deleted file mode 100644
index 184ea9d..0000000
--- a/third_party/gofrontend/libgo/go/crypto/crypto.go
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package crypto collects common cryptographic constants.
-package crypto
-
-import (
-	"hash"
-	"io"
-	"strconv"
-)
-
-// Hash identifies a cryptographic hash function that is implemented in another
-// package.
-type Hash uint
-
-// HashFunc simply returns the value of h so that Hash implements SignerOpts.
-func (h Hash) HashFunc() Hash {
-	return h
-}
-
-const (
-	MD4        Hash = 1 + iota // import golang.org/x/crypto/md4
-	MD5                        // import crypto/md5
-	SHA1                       // import crypto/sha1
-	SHA224                     // import crypto/sha256
-	SHA256                     // import crypto/sha256
-	SHA384                     // import crypto/sha512
-	SHA512                     // import crypto/sha512
-	MD5SHA1                    // no implementation; MD5+SHA1 used for TLS RSA
-	RIPEMD160                  // import golang.org/x/crypto/ripemd160
-	SHA3_224                   // import golang.org/x/crypto/sha3
-	SHA3_256                   // import golang.org/x/crypto/sha3
-	SHA3_384                   // import golang.org/x/crypto/sha3
-	SHA3_512                   // import golang.org/x/crypto/sha3
-	SHA512_224                 // import crypto/sha512
-	SHA512_256                 // import crypto/sha512
-	maxHash
-)
-
-var digestSizes = []uint8{
-	MD4:        16,
-	MD5:        16,
-	SHA1:       20,
-	SHA224:     28,
-	SHA256:     32,
-	SHA384:     48,
-	SHA512:     64,
-	SHA512_224: 28,
-	SHA512_256: 32,
-	SHA3_224:   28,
-	SHA3_256:   32,
-	SHA3_384:   48,
-	SHA3_512:   64,
-	MD5SHA1:    36,
-	RIPEMD160:  20,
-}
-
-// Size returns the length, in bytes, of a digest resulting from the given hash
-// function. It doesn't require that the hash function in question be linked
-// into the program.
-func (h Hash) Size() int {
-	if h > 0 && h < maxHash {
-		return int(digestSizes[h])
-	}
-	panic("crypto: Size of unknown hash function")
-}
-
-var hashes = make([]func() hash.Hash, maxHash)
-
-// New returns a new hash.Hash calculating the given hash function. New panics
-// if the hash function is not linked into the binary.
-func (h Hash) New() hash.Hash {
-	if h > 0 && h < maxHash {
-		f := hashes[h]
-		if f != nil {
-			return f()
-		}
-	}
-	panic("crypto: requested hash function #" + strconv.Itoa(int(h)) + " is unavailable")
-}
-
-// Available reports whether the given hash function is linked into the binary.
-func (h Hash) Available() bool {
-	return h < maxHash && hashes[h] != nil
-}
-
-// RegisterHash registers a function that returns a new instance of the given
-// hash function. This is intended to be called from the init function in
-// packages that implement hash functions.
-func RegisterHash(h Hash, f func() hash.Hash) {
-	if h >= maxHash {
-		panic("crypto: RegisterHash of unknown hash function")
-	}
-	hashes[h] = f
-}
-
-// PublicKey represents a public key using an unspecified algorithm.
-type PublicKey interface{}
-
-// PrivateKey represents a private key using an unspecified algorithm.
-type PrivateKey interface{}
-
-// Signer is an interface for an opaque private key that can be used for
-// signing operations. For example, an RSA key kept in a hardware module.
-type Signer interface {
-	// Public returns the public key corresponding to the opaque,
-	// private key.
-	Public() PublicKey
-
-	// Sign signs msg with the private key, possibly using entropy from
-	// rand. For an RSA key, the resulting signature should be either a
-	// PKCS#1 v1.5 or PSS signature (as indicated by opts). For an (EC)DSA
-	// key, it should be a DER-serialised, ASN.1 signature structure.
-	//
-	// Hash implements the SignerOpts interface and, in most cases, one can
-	// simply pass in the hash function used as opts. Sign may also attempt
-	// to type assert opts to other types in order to obtain algorithm
-	// specific values. See the documentation in each package for details.
-	Sign(rand io.Reader, msg []byte, opts SignerOpts) (signature []byte, err error)
-}
-
-// SignerOpts contains options for signing with a Signer.
-type SignerOpts interface {
-	// HashFunc returns an identifier for the hash function used to produce
-	// the message passed to Signer.Sign, or else zero to indicate that no
-	// hashing was done.
-	HashFunc() Hash
-}
-
-// Decrypter is an interface for an opaque private key that can be used for
-// asymmetric decryption operations. An example would be an RSA key
-// kept in a hardware module.
-type Decrypter interface {
-	// Public returns the public key corresponding to the opaque,
-	// private key.
-	Public() PublicKey
-
-	// Decrypt decrypts msg. The opts argument should be appropriate for
-	// the primitive used. See the documentation in each implementation for
-	// details.
-	Decrypt(rand io.Reader, msg []byte, opts DecrypterOpts) (plaintext []byte, err error)
-}
-
-type DecrypterOpts interface{}
diff --git a/third_party/gofrontend/libgo/go/crypto/des/block.go b/third_party/gofrontend/libgo/go/crypto/des/block.go
deleted file mode 100644
index 26355a2..0000000
--- a/third_party/gofrontend/libgo/go/crypto/des/block.go
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package des
-
-import (
-	"encoding/binary"
-)
-
-func cryptBlock(subkeys []uint64, dst, src []byte, decrypt bool) {
-	b := binary.BigEndian.Uint64(src)
-	b = permuteInitialBlock(b)
-	left, right := uint32(b>>32), uint32(b)
-
-	var subkey uint64
-	for i := 0; i < 16; i++ {
-		if decrypt {
-			subkey = subkeys[15-i]
-		} else {
-			subkey = subkeys[i]
-		}
-
-		left, right = right, left^feistel(right, subkey)
-	}
-	// switch left & right and perform final permutation
-	preOutput := (uint64(right) << 32) | uint64(left)
-	binary.BigEndian.PutUint64(dst, permuteFinalBlock(preOutput))
-}
-
-// Encrypt one block from src into dst, using the subkeys.
-func encryptBlock(subkeys []uint64, dst, src []byte) {
-	cryptBlock(subkeys, dst, src, false)
-}
-
-// Decrypt one block from src into dst, using the subkeys.
-func decryptBlock(subkeys []uint64, dst, src []byte) {
-	cryptBlock(subkeys, dst, src, true)
-}
-
-// DES Feistel function
-func feistel(right uint32, key uint64) (result uint32) {
-	sBoxLocations := key ^ expandBlock(right)
-	var sBoxResult uint32
-	for i := uint8(0); i < 8; i++ {
-		sBoxLocation := uint8(sBoxLocations>>42) & 0x3f
-		sBoxLocations <<= 6
-		// row determined by 1st and 6th bit
-		// column is middle four bits
-		row := (sBoxLocation & 0x1) | ((sBoxLocation & 0x20) >> 4)
-		column := (sBoxLocation >> 1) & 0xf
-		sBoxResult ^= feistelBox[i][16*row+column]
-	}
-	return sBoxResult
-}
-
-// feistelBox[s][16*i+j] contains the output of permutationFunction
-// for sBoxes[s][i][j] << 4*(7-s)
-var feistelBox [8][64]uint32
-
-// general purpose function to perform DES block permutations
-func permuteBlock(src uint64, permutation []uint8) (block uint64) {
-	for position, n := range permutation {
-		bit := (src >> n) & 1
-		block |= bit << uint((len(permutation)-1)-position)
-	}
-	return
-}
-
-func init() {
-	for s := range sBoxes {
-		for i := 0; i < 4; i++ {
-			for j := 0; j < 16; j++ {
-				f := uint64(sBoxes[s][i][j]) << (4 * (7 - uint(s)))
-				f = permuteBlock(uint64(f), permutationFunction[:])
-				feistelBox[s][16*i+j] = uint32(f)
-			}
-		}
-	}
-}
-
-// expandBlock expands an input block of 32 bits,
-// producing an output block of 48 bits.
-func expandBlock(src uint32) (block uint64) {
-	// rotate the 5 highest bits to the right.
-	src = (src << 5) | (src >> 27)
-	for i := 0; i < 8; i++ {
-		block <<= 6
-		// take the 6 bits on the right
-		block |= uint64(src) & (1<<6 - 1)
-		// advance by 4 bits.
-		src = (src << 4) | (src >> 28)
-	}
-	return
-}
-
-// permuteInitialBlock is equivalent to the permutation defined
-// by initialPermutation.
-func permuteInitialBlock(block uint64) uint64 {
-	// block = b7 b6 b5 b4 b3 b2 b1 b0 (8 bytes)
-	b1 := block >> 48
-	b2 := block << 48
-	block ^= b1 ^ b2 ^ b1<<48 ^ b2>>48
-
-	// block = b1 b0 b5 b4 b3 b2 b7 b6
-	b1 = block >> 32 & 0xff00ff
-	b2 = (block & 0xff00ff00)
-	block ^= b1<<32 ^ b2 ^ b1<<8 ^ b2<<24 // exchange b0 b4 with b3 b7
-
-	// block is now b1 b3 b5 b7 b0 b2 b4 b7, the permutation:
-	//                  ...  8
-	//                  ... 24
-	//                  ... 40
-	//                  ... 56
-	//  7  6  5  4  3  2  1  0
-	// 23 22 21 20 19 18 17 16
-	//                  ... 32
-	//                  ... 48
-
-	// exchange 4,5,6,7 with 32,33,34,35 etc.
-	b1 = block & 0x0f0f00000f0f0000
-	b2 = block & 0x0000f0f00000f0f0
-	block ^= b1 ^ b2 ^ b1>>12 ^ b2<<12
-
-	// block is the permutation:
-	//
-	//   [+8]         [+40]
-	//
-	//  7  6  5  4
-	// 23 22 21 20
-	//  3  2  1  0
-	// 19 18 17 16    [+32]
-
-	// exchange 0,1,4,5 with 18,19,22,23
-	b1 = block & 0x3300330033003300
-	b2 = block & 0x00cc00cc00cc00cc
-	block ^= b1 ^ b2 ^ b1>>6 ^ b2<<6
-
-	// block is the permutation:
-	// 15 14
-	// 13 12
-	// 11 10
-	//  9  8
-	//  7  6
-	//  5  4
-	//  3  2
-	//  1  0 [+16] [+32] [+64]
-
-	// exchange 0,2,4,6 with 9,11,13,15:
-	b1 = block & 0xaaaaaaaa55555555
-	block ^= b1 ^ b1>>33 ^ b1<<33
-
-	// block is the permutation:
-	// 6 14 22 30 38 46 54 62
-	// 4 12 20 28 36 44 52 60
-	// 2 10 18 26 34 42 50 58
-	// 0  8 16 24 32 40 48 56
-	// 7 15 23 31 39 47 55 63
-	// 5 13 21 29 37 45 53 61
-	// 3 11 19 27 35 43 51 59
-	// 1  9 17 25 33 41 49 57
-	return block
-}
-
-// permuteInitialBlock is equivalent to the permutation defined
-// by finalPermutation.
-func permuteFinalBlock(block uint64) uint64 {
-	// Perform the same bit exchanges as permuteInitialBlock
-	// but in reverse order.
-	b1 := block & 0xaaaaaaaa55555555
-	block ^= b1 ^ b1>>33 ^ b1<<33
-
-	b1 = block & 0x3300330033003300
-	b2 := block & 0x00cc00cc00cc00cc
-	block ^= b1 ^ b2 ^ b1>>6 ^ b2<<6
-
-	b1 = block & 0x0f0f00000f0f0000
-	b2 = block & 0x0000f0f00000f0f0
-	block ^= b1 ^ b2 ^ b1>>12 ^ b2<<12
-
-	b1 = block >> 32 & 0xff00ff
-	b2 = (block & 0xff00ff00)
-	block ^= b1<<32 ^ b2 ^ b1<<8 ^ b2<<24
-
-	b1 = block >> 48
-	b2 = block << 48
-	block ^= b1 ^ b2 ^ b1<<48 ^ b2>>48
-	return block
-}
-
-// creates 16 28-bit blocks rotated according
-// to the rotation schedule
-func ksRotate(in uint32) (out []uint32) {
-	out = make([]uint32, 16)
-	last := in
-	for i := 0; i < 16; i++ {
-		// 28-bit circular left shift
-		left := (last << (4 + ksRotations[i])) >> 4
-		right := (last << 4) >> (32 - ksRotations[i])
-		out[i] = left | right
-		last = out[i]
-	}
-	return
-}
-
-// creates 16 56-bit subkeys from the original key
-func (c *desCipher) generateSubkeys(keyBytes []byte) {
-	// apply PC1 permutation to key
-	key := binary.BigEndian.Uint64(keyBytes)
-	permutedKey := permuteBlock(key, permutedChoice1[:])
-
-	// rotate halves of permuted key according to the rotation schedule
-	leftRotations := ksRotate(uint32(permutedKey >> 28))
-	rightRotations := ksRotate(uint32(permutedKey<<4) >> 4)
-
-	// generate subkeys
-	for i := 0; i < 16; i++ {
-		// combine halves to form 56-bit input to PC2
-		pc2Input := uint64(leftRotations[i])<<28 | uint64(rightRotations[i])
-		// apply PC2 permutation to 7 byte input
-		c.subkeys[i] = permuteBlock(pc2Input, permutedChoice2[:])
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/des/cipher.go b/third_party/gofrontend/libgo/go/crypto/des/cipher.go
deleted file mode 100644
index 2f929ca..0000000
--- a/third_party/gofrontend/libgo/go/crypto/des/cipher.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package des
-
-import (
-	"crypto/cipher"
-	"strconv"
-)
-
-// The DES block size in bytes.
-const BlockSize = 8
-
-type KeySizeError int
-
-func (k KeySizeError) Error() string {
-	return "crypto/des: invalid key size " + strconv.Itoa(int(k))
-}
-
-// desCipher is an instance of DES encryption.
-type desCipher struct {
-	subkeys [16]uint64
-}
-
-// NewCipher creates and returns a new cipher.Block.
-func NewCipher(key []byte) (cipher.Block, error) {
-	if len(key) != 8 {
-		return nil, KeySizeError(len(key))
-	}
-
-	c := new(desCipher)
-	c.generateSubkeys(key)
-	return c, nil
-}
-
-func (c *desCipher) BlockSize() int { return BlockSize }
-
-func (c *desCipher) Encrypt(dst, src []byte) { encryptBlock(c.subkeys[:], dst, src) }
-
-func (c *desCipher) Decrypt(dst, src []byte) { decryptBlock(c.subkeys[:], dst, src) }
-
-// A tripleDESCipher is an instance of TripleDES encryption.
-type tripleDESCipher struct {
-	cipher1, cipher2, cipher3 desCipher
-}
-
-// NewTripleDESCipher creates and returns a new cipher.Block.
-func NewTripleDESCipher(key []byte) (cipher.Block, error) {
-	if len(key) != 24 {
-		return nil, KeySizeError(len(key))
-	}
-
-	c := new(tripleDESCipher)
-	c.cipher1.generateSubkeys(key[:8])
-	c.cipher2.generateSubkeys(key[8:16])
-	c.cipher3.generateSubkeys(key[16:])
-	return c, nil
-}
-
-func (c *tripleDESCipher) BlockSize() int { return BlockSize }
-
-func (c *tripleDESCipher) Encrypt(dst, src []byte) {
-	c.cipher1.Encrypt(dst, src)
-	c.cipher2.Decrypt(dst, dst)
-	c.cipher3.Encrypt(dst, dst)
-}
-
-func (c *tripleDESCipher) Decrypt(dst, src []byte) {
-	c.cipher3.Decrypt(dst, src)
-	c.cipher2.Encrypt(dst, dst)
-	c.cipher1.Decrypt(dst, dst)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/des/const.go b/third_party/gofrontend/libgo/go/crypto/des/const.go
deleted file mode 100644
index 2bd485e..0000000
--- a/third_party/gofrontend/libgo/go/crypto/des/const.go
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package des implements the Data Encryption Standard (DES) and the
-// Triple Data Encryption Algorithm (TDEA) as defined
-// in U.S. Federal Information Processing Standards Publication 46-3.
-package des
-
-// Used to perform an initial permutation of a 64-bit input block.
-var initialPermutation = [64]byte{
-	6, 14, 22, 30, 38, 46, 54, 62,
-	4, 12, 20, 28, 36, 44, 52, 60,
-	2, 10, 18, 26, 34, 42, 50, 58,
-	0, 8, 16, 24, 32, 40, 48, 56,
-	7, 15, 23, 31, 39, 47, 55, 63,
-	5, 13, 21, 29, 37, 45, 53, 61,
-	3, 11, 19, 27, 35, 43, 51, 59,
-	1, 9, 17, 25, 33, 41, 49, 57,
-}
-
-// Used to perform a final permutation of a 4-bit preoutput block. This is the
-// inverse of initialPermutation
-var finalPermutation = [64]byte{
-	24, 56, 16, 48, 8, 40, 0, 32,
-	25, 57, 17, 49, 9, 41, 1, 33,
-	26, 58, 18, 50, 10, 42, 2, 34,
-	27, 59, 19, 51, 11, 43, 3, 35,
-	28, 60, 20, 52, 12, 44, 4, 36,
-	29, 61, 21, 53, 13, 45, 5, 37,
-	30, 62, 22, 54, 14, 46, 6, 38,
-	31, 63, 23, 55, 15, 47, 7, 39,
-}
-
-// Used to expand an input block of 32 bits, producing an output block of 48
-// bits.
-var expansionFunction = [48]byte{
-	0, 31, 30, 29, 28, 27, 28, 27,
-	26, 25, 24, 23, 24, 23, 22, 21,
-	20, 19, 20, 19, 18, 17, 16, 15,
-	16, 15, 14, 13, 12, 11, 12, 11,
-	10, 9, 8, 7, 8, 7, 6, 5,
-	4, 3, 4, 3, 2, 1, 0, 31,
-}
-
-// Yields a 32-bit output from a 32-bit input
-var permutationFunction = [32]byte{
-	16, 25, 12, 11, 3, 20, 4, 15,
-	31, 17, 9, 6, 27, 14, 1, 22,
-	30, 24, 8, 18, 0, 5, 29, 23,
-	13, 19, 2, 26, 10, 21, 28, 7,
-}
-
-// Used in the key schedule to select 56 bits
-// from a 64-bit input.
-var permutedChoice1 = [56]byte{
-	7, 15, 23, 31, 39, 47, 55, 63,
-	6, 14, 22, 30, 38, 46, 54, 62,
-	5, 13, 21, 29, 37, 45, 53, 61,
-	4, 12, 20, 28, 1, 9, 17, 25,
-	33, 41, 49, 57, 2, 10, 18, 26,
-	34, 42, 50, 58, 3, 11, 19, 27,
-	35, 43, 51, 59, 36, 44, 52, 60,
-}
-
-// Used in the key schedule to produce each subkey by selecting 48 bits from
-// the 56-bit input
-var permutedChoice2 = [48]byte{
-	42, 39, 45, 32, 55, 51, 53, 28,
-	41, 50, 35, 46, 33, 37, 44, 52,
-	30, 48, 40, 49, 29, 36, 43, 54,
-	15, 4, 25, 19, 9, 1, 26, 16,
-	5, 11, 23, 8, 12, 7, 17, 0,
-	22, 3, 10, 14, 6, 20, 27, 24,
-}
-
-// 8 S-boxes composed of 4 rows and 16 columns
-// Used in the DES cipher function
-var sBoxes = [8][4][16]uint8{
-	// S-box 1
-	{
-		{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7},
-		{0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8},
-		{4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0},
-		{15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13},
-	},
-	// S-box 2
-	{
-		{15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10},
-		{3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5},
-		{0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15},
-		{13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9},
-	},
-	// S-box 3
-	{
-		{10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8},
-		{13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1},
-		{13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7},
-		{1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12},
-	},
-	// S-box 4
-	{
-		{7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15},
-		{13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9},
-		{10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4},
-		{3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14},
-	},
-	// S-box 5
-	{
-		{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9},
-		{14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6},
-		{4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14},
-		{11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3},
-	},
-	// S-box 6
-	{
-		{12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11},
-		{10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8},
-		{9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6},
-		{4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13},
-	},
-	// S-box 7
-	{
-		{4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1},
-		{13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6},
-		{1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2},
-		{6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12},
-	},
-	// S-box 8
-	{
-		{13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7},
-		{1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2},
-		{7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8},
-		{2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11},
-	},
-}
-
-// Size of left rotation per round in each half of the key schedule
-var ksRotations = [16]uint8{1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1}
diff --git a/third_party/gofrontend/libgo/go/crypto/des/des_test.go b/third_party/gofrontend/libgo/go/crypto/des/des_test.go
deleted file mode 100644
index 2bd525a..0000000
--- a/third_party/gofrontend/libgo/go/crypto/des/des_test.go
+++ /dev/null
@@ -1,1566 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package des
-
-import (
-	"bytes"
-	"testing"
-)
-
-type CryptTest struct {
-	key []byte
-	in  []byte
-	out []byte
-}
-
-// some custom tests for DES
-var encryptDESTests = []CryptTest{
-	{
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x8c, 0xa6, 0x4d, 0xe9, 0xc1, 0xb1, 0x23, 0xa7}},
-	{
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-		[]byte{0x35, 0x55, 0x50, 0xb2, 0x15, 0x0e, 0x24, 0x51}},
-	{
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		[]byte{0x61, 0x7b, 0x3a, 0x0c, 0xe8, 0xf0, 0x71, 0x00}},
-	{
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-		[]byte{0x92, 0x31, 0xf2, 0x36, 0xff, 0x9a, 0xa9, 0x5c}},
-	{
-		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xca, 0xaa, 0xaf, 0x4d, 0xea, 0xf1, 0xdb, 0xae}},
-	{
-		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-		[]byte{0x73, 0x59, 0xb2, 0x16, 0x3e, 0x4e, 0xdc, 0x58}},
-	{
-		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		[]byte{0x6d, 0xce, 0x0d, 0xc9, 0x00, 0x65, 0x56, 0xa3}},
-	{
-		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-		[]byte{0x9e, 0x84, 0xc5, 0xf3, 0x17, 0x0f, 0x8e, 0xff}},
-	{
-		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xd5, 0xd4, 0x4f, 0xf7, 0x20, 0x68, 0x3d, 0x0d}},
-	{
-		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-		[]byte{0x59, 0x73, 0x23, 0x56, 0xf3, 0x6f, 0xde, 0x06}},
-	{
-		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		[]byte{0x56, 0xcc, 0x09, 0xe7, 0xcf, 0xdc, 0x4c, 0xef}},
-	{
-		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-		[]byte{0x12, 0xc6, 0x26, 0xaf, 0x05, 0x8b, 0x43, 0x3b}},
-	{
-		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xa6, 0x8c, 0xdc, 0xa9, 0x0c, 0x90, 0x21, 0xf9}},
-	{
-		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-		[]byte{0x2a, 0x2b, 0xb0, 0x08, 0xdf, 0x97, 0xc2, 0xf2}},
-	{
-		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		[]byte{0xed, 0x39, 0xd9, 0x50, 0xfa, 0x74, 0xbc, 0xc4}},
-	{
-		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-		[]byte{0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-		[]byte{0xa9, 0x33, 0xf6, 0x18, 0x30, 0x23, 0xb3, 0x10}},
-	{
-		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		[]byte{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
-		[]byte{0x17, 0x66, 0x8d, 0xfc, 0x72, 0x92, 0x53, 0x2d}},
-	{
-		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		[]byte{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		[]byte{0xb4, 0xfd, 0x23, 0x16, 0x47, 0xa5, 0xbe, 0xc0}},
-	{
-		[]byte{0x0e, 0x32, 0x92, 0x32, 0xea, 0x6d, 0x0d, 0x73},
-		[]byte{0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87},
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
-	{
-		[]byte{0x73, 0x65, 0x63, 0x52, 0x33, 0x74, 0x24, 0x3b}, // "secR3t$;"
-		[]byte{0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x31, 0x32}, // "a test12"
-		[]byte{0x37, 0x0d, 0xee, 0x2c, 0x1f, 0xb4, 0xf7, 0xa5}},
-	{
-		[]byte{0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68}, // "abcdefgh"
-		[]byte{0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68}, // "abcdefgh"
-		[]byte{0x2a, 0x8d, 0x69, 0xde, 0x9d, 0x5f, 0xdf, 0xf9}},
-	{
-		[]byte{0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68}, // "abcdefgh"
-		[]byte{0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}, // "12345678"
-		[]byte{0x21, 0xc6, 0x0d, 0xa5, 0x34, 0x24, 0x8b, 0xce}},
-	{
-		[]byte{0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}, // "12345678"
-		[]byte{0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68}, // "abcdefgh"
-		[]byte{0x94, 0xd4, 0x43, 0x6b, 0xc3, 0xb5, 0xb6, 0x93}},
-	{
-		[]byte{0x1f, 0x79, 0x90, 0x5f, 0x88, 0x01, 0xc8, 0x88}, // random
-		[]byte{0xc7, 0x46, 0x18, 0x73, 0xaf, 0x48, 0x5f, 0xb3}, // random
-		[]byte{0xb0, 0x93, 0x50, 0x88, 0xf9, 0x92, 0x44, 0x6a}},
-	{
-		[]byte{0xe6, 0xf4, 0xf2, 0xdb, 0x31, 0x42, 0x53, 0x01}, // random
-		[]byte{0xff, 0x3d, 0x25, 0x50, 0x12, 0xe3, 0x4a, 0xc5}, // random
-		[]byte{0x86, 0x08, 0xd3, 0xd1, 0x6c, 0x2f, 0xd2, 0x55}},
-	{
-		[]byte{0x69, 0xc1, 0x9d, 0xc1, 0x15, 0xc5, 0xfb, 0x2b}, // random
-		[]byte{0x1a, 0x22, 0x5c, 0xaf, 0x1f, 0x1d, 0xa3, 0xf9}, // random
-		[]byte{0x64, 0xba, 0x31, 0x67, 0x56, 0x91, 0x1e, 0xa7}},
-	{
-		[]byte{0x6e, 0x5e, 0xe2, 0x47, 0xc4, 0xbf, 0xf6, 0x51}, // random
-		[]byte{0x11, 0xc9, 0x57, 0xff, 0x66, 0x89, 0x0e, 0xf0}, // random
-		[]byte{0x94, 0xc5, 0x35, 0xb2, 0xc5, 0x8b, 0x39, 0x72}},
-}
-
-var weakKeyTests = []CryptTest{
-	{
-		[]byte{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		[]byte{0x55, 0x74, 0xc0, 0xbd, 0x7c, 0xdf, 0xf7, 0x39}, // random
-		nil},
-	{
-		[]byte{0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe},
-		[]byte{0xe8, 0xe1, 0xa7, 0xc1, 0xde, 0x11, 0x89, 0xaa}, // random
-		nil},
-	{
-		[]byte{0xe0, 0xe0, 0xe0, 0xe0, 0xf1, 0xf1, 0xf1, 0xf1},
-		[]byte{0x50, 0x6a, 0x4b, 0x94, 0x3b, 0xed, 0x7d, 0xdc}, // random
-		nil},
-	{
-		[]byte{0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e},
-		[]byte{0x88, 0x81, 0x56, 0x38, 0xec, 0x3b, 0x1c, 0x97}, // random
-		nil},
-	{
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x17, 0xa0, 0x83, 0x62, 0x32, 0xfe, 0x9a, 0x0b}, // random
-		nil},
-	{
-		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-		[]byte{0xca, 0x8f, 0xca, 0x1f, 0x50, 0xc5, 0x7b, 0x49}, // random
-		nil},
-	{
-		[]byte{0xe1, 0xe1, 0xe1, 0xe1, 0xf0, 0xf0, 0xf0, 0xf0},
-		[]byte{0xb1, 0xea, 0xad, 0x7d, 0xe7, 0xc3, 0x7a, 0x43}, // random
-		nil},
-	{
-		[]byte{0x1e, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, 0x0f, 0x0f},
-		[]byte{0xae, 0x74, 0x7d, 0x6f, 0xef, 0x16, 0xbb, 0x81}, // random
-		nil},
-}
-
-var semiWeakKeyTests = []CryptTest{
-	// key and out contain the semi-weak key pair
-	{
-		[]byte{0x01, 0x1f, 0x01, 0x1f, 0x01, 0x0e, 0x01, 0x0e},
-		[]byte{0x12, 0xfa, 0x31, 0x16, 0xf9, 0xc5, 0x0a, 0xe4}, // random
-		[]byte{0x1f, 0x01, 0x1f, 0x01, 0x0e, 0x01, 0x0e, 0x01}},
-	{
-		[]byte{0x01, 0xe0, 0x01, 0xe0, 0x01, 0xf1, 0x01, 0xf1},
-		[]byte{0xb0, 0x4c, 0x7a, 0xee, 0xd2, 0xe5, 0x4d, 0xb7}, // random
-		[]byte{0xe0, 0x01, 0xe0, 0x01, 0xf1, 0x01, 0xf1, 0x01}},
-	{
-		[]byte{0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe},
-		[]byte{0xa4, 0x81, 0xcd, 0xb1, 0x64, 0x6f, 0xd3, 0xbc}, // random
-		[]byte{0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01}},
-	{
-		[]byte{0x1f, 0xe0, 0x1f, 0xe0, 0x0e, 0xf1, 0x0e, 0xf1},
-		[]byte{0xee, 0x27, 0xdd, 0x88, 0x4c, 0x22, 0xcd, 0xce}, // random
-		[]byte{0xe0, 0x1f, 0xe0, 0x1f, 0xf1, 0x0e, 0xf1, 0x0e}},
-	{
-		[]byte{0x1f, 0xfe, 0x1f, 0xfe, 0x0e, 0xfe, 0x0e, 0xfe},
-		[]byte{0x19, 0x3d, 0xcf, 0x97, 0x70, 0xfb, 0xab, 0xe1}, // random
-		[]byte{0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x0e, 0xfe, 0x0e}},
-	{
-		[]byte{0xe0, 0xfe, 0xe0, 0xfe, 0xf1, 0xfe, 0xf1, 0xfe},
-		[]byte{0x7c, 0x82, 0x69, 0xe4, 0x1e, 0x86, 0x99, 0xd7}, // random
-		[]byte{0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xf1, 0xfe, 0xf1}},
-}
-
-// some custom tests for TripleDES
-var encryptTripleDESTests = []CryptTest{
-	{
-		[]byte{
-			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x92, 0x95, 0xb5, 0x9b, 0xb3, 0x84, 0x73, 0x6e}},
-	{
-		[]byte{
-			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-		[]byte{0xc1, 0x97, 0xf5, 0x58, 0x74, 0x8a, 0x20, 0xe7}},
-	{
-		[]byte{
-			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x3e, 0x68, 0x0a, 0xa7, 0x8b, 0x75, 0xdf, 0x18}},
-	{
-		[]byte{
-			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-		[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-		[]byte{0x6d, 0x6a, 0x4a, 0x64, 0x4c, 0x7b, 0x8c, 0x91}},
-	{
-		[]byte{ // "abcdefgh12345678ABCDEFGH"
-			0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
-			0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
-			0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48},
-		[]byte{0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30}, // "00000000"
-		[]byte{0xe4, 0x61, 0xb7, 0x59, 0x68, 0x8b, 0xff, 0x66}},
-	{
-		[]byte{ // "abcdefgh12345678ABCDEFGH"
-			0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
-			0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
-			0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48},
-		[]byte{0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}, // "12345678"
-		[]byte{0xdb, 0xd0, 0x92, 0xde, 0xf8, 0x34, 0xff, 0x58}},
-	{
-		[]byte{ // "abcdefgh12345678ABCDEFGH"
-			0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
-			0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
-			0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48},
-		[]byte{0xf0, 0xc5, 0x82, 0x22, 0xd3, 0xe6, 0x12, 0xd2}, // random
-		[]byte{0xba, 0xe4, 0x41, 0xb1, 0x3c, 0x37, 0x4d, 0xf4}},
-	{
-		[]byte{ // random
-			0xd3, 0x7d, 0x45, 0xee, 0x22, 0xe9, 0xcf, 0x52,
-			0xf4, 0x65, 0xa2, 0x4f, 0x70, 0xd1, 0x81, 0x8a,
-			0x3d, 0xbe, 0x2f, 0x39, 0xc7, 0x71, 0xd2, 0xe9},
-		[]byte{0x49, 0x53, 0xc3, 0xe9, 0x78, 0xdf, 0x9f, 0xaf}, // random
-		[]byte{0x53, 0x40, 0x51, 0x24, 0xd8, 0x3c, 0xf9, 0x88}},
-	{
-		[]byte{ // random
-			0xcb, 0x10, 0x7d, 0xda, 0x7e, 0x96, 0x57, 0x0a,
-			0xe8, 0xeb, 0xe8, 0x07, 0x8e, 0x87, 0xd3, 0x57,
-			0xb2, 0x61, 0x12, 0xb8, 0x2a, 0x90, 0xb7, 0x2f},
-		[]byte{0xa3, 0xc2, 0x60, 0xb1, 0x0b, 0xb7, 0x28, 0x6e}, // random
-		[]byte{0x56, 0x73, 0x7d, 0xfb, 0xb5, 0xa1, 0xc3, 0xde}},
-}
-
-// NIST Special Publication 800-20, Appendix A
-// Key for use with Table A.1 tests
-var tableA1Key = []byte{
-	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-}
-
-// Table A.1 Resulting Ciphertext from the Variable Plaintext Known Answer Test
-var tableA1Tests = []CryptTest{
-	{nil, // 0
-		[]byte{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x95, 0xf8, 0xa5, 0xe5, 0xdd, 0x31, 0xd9, 0x00}},
-	{nil, // 1
-		[]byte{0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xdd, 0x7f, 0x12, 0x1c, 0xa5, 0x01, 0x56, 0x19}},
-	{nil, // 2
-		[]byte{0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x2e, 0x86, 0x53, 0x10, 0x4f, 0x38, 0x34, 0xea}},
-	{nil, // 3
-		[]byte{0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x4b, 0xd3, 0x88, 0xff, 0x6c, 0xd8, 0x1d, 0x4f}},
-	{nil, // 4
-		[]byte{0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x20, 0xb9, 0xe7, 0x67, 0xb2, 0xfb, 0x14, 0x56}},
-	{nil, // 5
-		[]byte{0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x55, 0x57, 0x93, 0x80, 0xd7, 0x71, 0x38, 0xef}},
-	{nil, // 6
-		[]byte{0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x6c, 0xc5, 0xde, 0xfa, 0xaf, 0x04, 0x51, 0x2f}},
-	{nil, // 7
-		[]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x0d, 0x9f, 0x27, 0x9b, 0xa5, 0xd8, 0x72, 0x60}},
-	{nil, // 8
-		[]byte{0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xd9, 0x03, 0x1b, 0x02, 0x71, 0xbd, 0x5a, 0x0a}},
-	{nil, // 9
-		[]byte{0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x42, 0x42, 0x50, 0xb3, 0x7c, 0x3d, 0xd9, 0x51}},
-	{nil, // 10
-		[]byte{0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xb8, 0x06, 0x1b, 0x7e, 0xcd, 0x9a, 0x21, 0xe5}},
-	{nil, // 11
-		[]byte{0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xf1, 0x5d, 0x0f, 0x28, 0x6b, 0x65, 0xbd, 0x28}},
-	{nil, // 12
-		[]byte{0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xad, 0xd0, 0xcc, 0x8d, 0x6e, 0x5d, 0xeb, 0xa1}},
-	{nil, // 13
-		[]byte{0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xe6, 0xd5, 0xf8, 0x27, 0x52, 0xad, 0x63, 0xd1}},
-	{nil, // 14
-		[]byte{0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xec, 0xbf, 0xe3, 0xbd, 0x3f, 0x59, 0x1a, 0x5e}},
-	{nil, // 15
-		[]byte{0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xf3, 0x56, 0x83, 0x43, 0x79, 0xd1, 0x65, 0xcd}},
-	{nil, // 16
-		[]byte{0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x2b, 0x9f, 0x98, 0x2f, 0x20, 0x03, 0x7f, 0xa9}},
-	{nil, // 17
-		[]byte{0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x88, 0x9d, 0xe0, 0x68, 0xa1, 0x6f, 0x0b, 0xe6}},
-	{nil, // 18
-		[]byte{0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xe1, 0x9e, 0x27, 0x5d, 0x84, 0x6a, 0x12, 0x98}},
-	{nil, // 19
-		[]byte{0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x32, 0x9a, 0x8e, 0xd5, 0x23, 0xd7, 0x1a, 0xec}},
-	{nil, // 20
-		[]byte{0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xe7, 0xfc, 0xe2, 0x25, 0x57, 0xd2, 0x3c, 0x97}},
-	{nil, // 21
-		[]byte{0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x12, 0xa9, 0xf5, 0x81, 0x7f, 0xf2, 0xd6, 0x5d}},
-	{nil, // 22
-		[]byte{0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xa4, 0x84, 0xc3, 0xad, 0x38, 0xdc, 0x9c, 0x19}},
-	{nil, // 23
-		[]byte{0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xfb, 0xe0, 0x0a, 0x8a, 0x1e, 0xf8, 0xad, 0x72}},
-	{nil, // 24
-		[]byte{0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x75, 0x0d, 0x07, 0x94, 0x07, 0x52, 0x13, 0x63}},
-	{nil, // 25
-		[]byte{0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x64, 0xfe, 0xed, 0x9c, 0x72, 0x4c, 0x2f, 0xaf}},
-	{nil, // 26
-		[]byte{0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xf0, 0x2b, 0x26, 0x3b, 0x32, 0x8e, 0x2b, 0x60}},
-	{nil, // 27
-		[]byte{0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0x9d, 0x64, 0x55, 0x5a, 0x9a, 0x10, 0xb8, 0x52}},
-	{nil, // 28
-		[]byte{0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xd1, 0x06, 0xff, 0x0b, 0xed, 0x52, 0x55, 0xd7}},
-	{nil, // 29
-		[]byte{0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xe1, 0x65, 0x2c, 0x6b, 0x13, 0x8c, 0x64, 0xa5}},
-	{nil, // 30
-		[]byte{0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xe4, 0x28, 0x58, 0x11, 0x86, 0xec, 0x8f, 0x46}},
-	{nil, // 31
-		[]byte{0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xae, 0xb5, 0xf5, 0xed, 0xe2, 0x2d, 0x1a, 0x36}},
-	{nil, // 32
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00},
-		[]byte{0xe9, 0x43, 0xd7, 0x56, 0x8a, 0xec, 0x0c, 0x5c}},
-	{nil, // 33
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00},
-		[]byte{0xdf, 0x98, 0xc8, 0x27, 0x6f, 0x54, 0xb0, 0x4b}},
-	{nil, // 34
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00},
-		[]byte{0xb1, 0x60, 0xe4, 0x68, 0x0f, 0x6c, 0x69, 0x6f}},
-	{nil, // 35
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00},
-		[]byte{0xfa, 0x07, 0x52, 0xb0, 0x7d, 0x9c, 0x4a, 0xb8}},
-	{nil, // 36
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00},
-		[]byte{0xca, 0x3a, 0x2b, 0x03, 0x6d, 0xbc, 0x85, 0x02}},
-	{nil, // 37
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00},
-		[]byte{0x5e, 0x09, 0x05, 0x51, 0x7b, 0xb5, 0x9b, 0xcf}},
-	{nil, // 38
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00},
-		[]byte{0x81, 0x4e, 0xeb, 0x3b, 0x91, 0xd9, 0x07, 0x26}},
-	{nil, // 39
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00},
-		[]byte{0x4d, 0x49, 0xdb, 0x15, 0x32, 0x91, 0x9c, 0x9f}},
-	{nil, // 40
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00},
-		[]byte{0x25, 0xeb, 0x5f, 0xc3, 0xf8, 0xcf, 0x06, 0x21}},
-	{nil, // 41
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00},
-		[]byte{0xab, 0x6a, 0x20, 0xc0, 0x62, 0x0d, 0x1c, 0x6f}},
-	{nil, // 42
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00},
-		[]byte{0x79, 0xe9, 0x0d, 0xbc, 0x98, 0xf9, 0x2c, 0xca}},
-	{nil, // 43
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00},
-		[]byte{0x86, 0x6e, 0xce, 0xdd, 0x80, 0x72, 0xbb, 0x0e}},
-	{nil, // 44
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00},
-		[]byte{0x8b, 0x54, 0x53, 0x6f, 0x2f, 0x3e, 0x64, 0xa8}},
-	{nil, // 45
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00},
-		[]byte{0xea, 0x51, 0xd3, 0x97, 0x55, 0x95, 0xb8, 0x6b}},
-	{nil, // 46
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00},
-		[]byte{0xca, 0xff, 0xc6, 0xac, 0x45, 0x42, 0xde, 0x31}},
-	{nil, // 47
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00},
-		[]byte{0x8d, 0xd4, 0x5a, 0x2d, 0xdf, 0x90, 0x79, 0x6c}},
-	{nil, // 48
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00},
-		[]byte{0x10, 0x29, 0xd5, 0x5e, 0x88, 0x0e, 0xc2, 0xd0}},
-	{nil, // 49
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00},
-		[]byte{0x5d, 0x86, 0xcb, 0x23, 0x63, 0x9d, 0xbe, 0xa9}},
-	{nil, // 50
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00},
-		[]byte{0x1d, 0x1c, 0xa8, 0x53, 0xae, 0x7c, 0x0c, 0x5f}},
-	{nil, // 51
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00},
-		[]byte{0xce, 0x33, 0x23, 0x29, 0x24, 0x8f, 0x32, 0x28}},
-	{nil, // 52
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00},
-		[]byte{0x84, 0x05, 0xd1, 0xab, 0xe2, 0x4f, 0xb9, 0x42}},
-	{nil, // 53
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00},
-		[]byte{0xe6, 0x43, 0xd7, 0x80, 0x90, 0xca, 0x42, 0x07}},
-	{nil, // 54
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00},
-		[]byte{0x48, 0x22, 0x1b, 0x99, 0x37, 0x74, 0x8a, 0x23}},
-	{nil, // 55
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00},
-		[]byte{0xdd, 0x7c, 0x0b, 0xbd, 0x61, 0xfa, 0xfd, 0x54}},
-	{nil, // 56
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80},
-		[]byte{0x2f, 0xbc, 0x29, 0x1a, 0x57, 0x0d, 0xb5, 0xc4}},
-	{nil, // 57
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40},
-		[]byte{0xe0, 0x7c, 0x30, 0xd7, 0xe4, 0xe2, 0x6e, 0x12}},
-	{nil, // 58
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20},
-		[]byte{0x09, 0x53, 0xe2, 0x25, 0x8e, 0x8e, 0x90, 0xa1}},
-	{nil, // 59
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
-		[]byte{0x5b, 0x71, 0x1b, 0xc4, 0xce, 0xeb, 0xf2, 0xee}},
-	{nil, // 60
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08},
-		[]byte{0xcc, 0x08, 0x3f, 0x1e, 0x6d, 0x9e, 0x85, 0xf6}},
-	{nil, // 61
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04},
-		[]byte{0xd2, 0xfd, 0x88, 0x67, 0xd5, 0x0d, 0x2d, 0xfe}},
-	{nil, // 62
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
-		[]byte{0x06, 0xe7, 0xea, 0x22, 0xce, 0x92, 0x70, 0x8f}},
-	{nil, // 63
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
-		[]byte{0x16, 0x6b, 0x40, 0xb4, 0x4a, 0xba, 0x4b, 0xd6}},
-}
-
-// Plaintext for use with Table A.2 tests
-var tableA2Plaintext = []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
-
-// Table A.2 Resulting Ciphertext from the Variable Key Known Answer Test
-var tableA2Tests = []CryptTest{
-	{ // 0
-		[]byte{
-			0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x95, 0xa8, 0xd7, 0x28, 0x13, 0xda, 0xa9, 0x4d}},
-	{ // 1
-		[]byte{
-			0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x0e, 0xec, 0x14, 0x87, 0xdd, 0x8c, 0x26, 0xd5}},
-	{ // 2
-		[]byte{
-			0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x7a, 0xd1, 0x6f, 0xfb, 0x79, 0xc4, 0x59, 0x26}},
-	{ // 3
-		[]byte{
-			0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xd3, 0x74, 0x62, 0x94, 0xca, 0x6a, 0x6c, 0xf3}},
-	{ // 4
-		[]byte{
-			0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x80, 0x9f, 0x5f, 0x87, 0x3c, 0x1f, 0xd7, 0x61}},
-	{ // 5
-		[]byte{
-			0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xc0, 0x2f, 0xaf, 0xfe, 0xc9, 0x89, 0xd1, 0xfc}},
-	{ // 6
-		[]byte{
-			0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x46, 0x15, 0xaa, 0x1d, 0x33, 0xe7, 0x2f, 0x10}},
-	{ // 7
-		[]byte{
-			0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x20, 0x55, 0x12, 0x33, 0x50, 0xc0, 0x08, 0x58}},
-	{ // 8
-		[]byte{
-			0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xdf, 0x3b, 0x99, 0xd6, 0x57, 0x73, 0x97, 0xc8}},
-	{ // 9
-		[]byte{
-			0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x31, 0xfe, 0x17, 0x36, 0x9b, 0x52, 0x88, 0xc9}},
-	{ // 10
-		[]byte{
-			0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xdf, 0xdd, 0x3c, 0xc6, 0x4d, 0xae, 0x16, 0x42}},
-	{ // 11
-		[]byte{
-			0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x17, 0x8c, 0x83, 0xce, 0x2b, 0x39, 0x9d, 0x94}},
-	{ // 12
-		[]byte{
-			0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x50, 0xf6, 0x36, 0x32, 0x4a, 0x9b, 0x7f, 0x80}},
-	{ // 13
-		[]byte{
-			0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xa8, 0x46, 0x8e, 0xe3, 0xbc, 0x18, 0xf0, 0x6d}},
-	{ // 14
-		[]byte{
-			0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xa2, 0xdc, 0x9e, 0x92, 0xfd, 0x3c, 0xde, 0x92}},
-	{ // 15
-		[]byte{
-			0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xca, 0xc0, 0x9f, 0x79, 0x7d, 0x03, 0x12, 0x87}},
-	{ // 16
-		[]byte{
-			0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x90, 0xba, 0x68, 0x0b, 0x22, 0xae, 0xb5, 0x25}},
-	{ // 17
-		[]byte{
-			0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xce, 0x7a, 0x24, 0xf3, 0x50, 0xe2, 0x80, 0xb6}},
-	{ // 18
-		[]byte{
-			0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x88, 0x2b, 0xff, 0x0a, 0xa0, 0x1a, 0x0b, 0x87}},
-	{ // 19
-		[]byte{
-			0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x25, 0x61, 0x02, 0x88, 0x92, 0x45, 0x11, 0xc2}},
-	{ // 20
-		[]byte{
-			0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xc7, 0x15, 0x16, 0xc2, 0x9c, 0x75, 0xd1, 0x70}},
-	{ // 21
-		[]byte{
-			0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x51, 0x99, 0xc2, 0x9a, 0x52, 0xc9, 0xf0, 0x59}},
-	{ // 22
-		[]byte{
-			0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xc2, 0x2f, 0x0a, 0x29, 0x4a, 0x71, 0xf2, 0x9f}},
-	{ // 23
-		[]byte{
-			0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xee, 0x37, 0x14, 0x83, 0x71, 0x4c, 0x02, 0xea}},
-	{ // 24
-		[]byte{
-			0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xa8, 0x1f, 0xbd, 0x44, 0x8f, 0x9e, 0x52, 0x2f}},
-	{ // 25
-		[]byte{
-			0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x4f, 0x64, 0x4c, 0x92, 0xe1, 0x92, 0xdf, 0xed}},
-	{ // 26
-		[]byte{
-			0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x1a, 0xfa, 0x9a, 0x66, 0xa6, 0xdf, 0x92, 0xae}},
-	{ // 27
-		[]byte{
-			0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xb3, 0xc1, 0xcc, 0x71, 0x5c, 0xb8, 0x79, 0xd8}},
-	{ // 28
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x19, 0xd0, 0x32, 0xe6, 0x4a, 0xb0, 0xbd, 0x8b}},
-	{ // 29
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x3c, 0xfa, 0xa7, 0xa7, 0xdc, 0x87, 0x20, 0xdc}},
-	{ // 30
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0xb7, 0x26, 0x5f, 0x7f, 0x44, 0x7a, 0xc6, 0xf3}},
-	{ // 31
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x9d, 0xb7, 0x3b, 0x3c, 0x0d, 0x16, 0x3f, 0x54}},
-	{ // 32
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x81, 0x81, 0xb6, 0x5b, 0xab, 0xf4, 0xa9, 0x75}},
-	{ // 33
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x93, 0xc9, 0xb6, 0x40, 0x42, 0xea, 0xa2, 0x40}},
-	{ // 34
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01},
-		nil,
-		[]byte{0x55, 0x70, 0x53, 0x08, 0x29, 0x70, 0x55, 0x92}},
-	{ // 35
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01, 0x01},
-		nil,
-		[]byte{0x86, 0x38, 0x80, 0x9e, 0x87, 0x87, 0x87, 0xa0}},
-	{ // 36
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01, 0x01},
-		nil,
-		[]byte{0x41, 0xb9, 0xa7, 0x9a, 0xf7, 0x9a, 0xc2, 0x08}},
-	{ // 37
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01, 0x01},
-		nil,
-		[]byte{0x7a, 0x9b, 0xe4, 0x2f, 0x20, 0x09, 0xa8, 0x92}},
-	{ // 38
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01, 0x01},
-		nil,
-		[]byte{0x29, 0x03, 0x8d, 0x56, 0xba, 0x6d, 0x27, 0x45}},
-	{ // 39
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01},
-		nil,
-		[]byte{0x54, 0x95, 0xc6, 0xab, 0xf1, 0xe5, 0xdf, 0x51}},
-	{ // 40
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x01},
-		nil,
-		[]byte{0xae, 0x13, 0xdb, 0xd5, 0x61, 0x48, 0x89, 0x33}},
-	{ // 41
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01},
-		nil,
-		[]byte{0x02, 0x4d, 0x1f, 0xfa, 0x89, 0x04, 0xe3, 0x89}},
-	{ // 42
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x01},
-		nil,
-		[]byte{0xd1, 0x39, 0x97, 0x12, 0xf9, 0x9b, 0xf0, 0x2e}},
-	{ // 43
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40, 0x01},
-		nil,
-		[]byte{0x14, 0xc1, 0xd7, 0xc1, 0xcf, 0xfe, 0xc7, 0x9e}},
-	{ // 44
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20, 0x01},
-		nil,
-		[]byte{0x1d, 0xe5, 0x27, 0x9d, 0xae, 0x3b, 0xed, 0x6f}},
-	{ // 45
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, 0x01},
-		nil,
-		[]byte{0xe9, 0x41, 0xa3, 0x3f, 0x85, 0x50, 0x13, 0x03}},
-	{ // 46
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01},
-		nil,
-		[]byte{0xda, 0x99, 0xdb, 0xbc, 0x9a, 0x03, 0xf3, 0x79}},
-	{ // 47
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01},
-		nil,
-		[]byte{0xb7, 0xfc, 0x92, 0xf9, 0x1d, 0x8e, 0x92, 0xe9}},
-	{ // 48
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01},
-		nil,
-		[]byte{0xae, 0x8e, 0x5c, 0xaa, 0x3c, 0xa0, 0x4e, 0x85}},
-	{ // 49
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80},
-		nil,
-		[]byte{0x9c, 0xc6, 0x2d, 0xf4, 0x3b, 0x6e, 0xed, 0x74}},
-	{ // 50
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x40},
-		nil,
-		[]byte{0xd8, 0x63, 0xdb, 0xb5, 0xc5, 0x9a, 0x91, 0xa0}},
-	{ // 50
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x20},
-		nil,
-		[]byte{0xa1, 0xab, 0x21, 0x90, 0x54, 0x5b, 0x91, 0xd7}},
-	{ // 52
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10},
-		nil,
-		[]byte{0x08, 0x75, 0x04, 0x1e, 0x64, 0xc5, 0x70, 0xf7}},
-	{ // 53
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08},
-		nil,
-		[]byte{0x5a, 0x59, 0x45, 0x28, 0xbe, 0xbe, 0xf1, 0xcc}},
-	{ // 54
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04},
-		nil,
-		[]byte{0xfc, 0xdb, 0x32, 0x91, 0xde, 0x21, 0xf0, 0xc0}},
-	{ // 55
-		[]byte{
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
-			0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02},
-		nil,
-		[]byte{0x86, 0x9e, 0xfd, 0x7f, 0x9f, 0x26, 0x5a, 0x09}},
-}
-
-// Plaintext for use with Table A.3 tests
-var tableA3Plaintext = []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
-
-// Table A.3 Values To Be Used for the Permutation Operation Known Answer Test
-var tableA3Tests = []CryptTest{
-	{ // 0
-		[]byte{
-			0x10, 0x46, 0x91, 0x34, 0x89, 0x98, 0x01, 0x31,
-			0x10, 0x46, 0x91, 0x34, 0x89, 0x98, 0x01, 0x31,
-			0x10, 0x46, 0x91, 0x34, 0x89, 0x98, 0x01, 0x31,
-		},
-		nil,
-		[]byte{0x88, 0xd5, 0x5e, 0x54, 0xf5, 0x4c, 0x97, 0xb4}},
-	{ // 1
-		[]byte{
-			0x10, 0x07, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
-			0x10, 0x07, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
-			0x10, 0x07, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
-		},
-		nil,
-		[]byte{0x0c, 0x0c, 0xc0, 0x0c, 0x83, 0xea, 0x48, 0xfd}},
-	{ // 2
-		[]byte{
-			0x10, 0x07, 0x10, 0x34, 0xc8, 0x98, 0x01, 0x20,
-			0x10, 0x07, 0x10, 0x34, 0xc8, 0x98, 0x01, 0x20,
-			0x10, 0x07, 0x10, 0x34, 0xc8, 0x98, 0x01, 0x20,
-		},
-		nil,
-		[]byte{0x83, 0xbc, 0x8e, 0xf3, 0xa6, 0x57, 0x01, 0x83}},
-	{ // 3
-		[]byte{
-			0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
-			0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
-			0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
-		},
-		nil,
-		[]byte{0xdf, 0x72, 0x5d, 0xca, 0xd9, 0x4e, 0xa2, 0xe9}},
-	{ // 4
-		[]byte{
-			0x10, 0x86, 0x91, 0x15, 0x19, 0x19, 0x01, 0x01,
-			0x10, 0x86, 0x91, 0x15, 0x19, 0x19, 0x01, 0x01,
-			0x10, 0x86, 0x91, 0x15, 0x19, 0x19, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0xe6, 0x52, 0xb5, 0x3b, 0x55, 0x0b, 0xe8, 0xb0}},
-	{ // 5
-		[]byte{
-			0x10, 0x86, 0x91, 0x15, 0x19, 0x58, 0x01, 0x01,
-			0x10, 0x86, 0x91, 0x15, 0x19, 0x58, 0x01, 0x01,
-			0x10, 0x86, 0x91, 0x15, 0x19, 0x58, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0xaf, 0x52, 0x71, 0x20, 0xc4, 0x85, 0xcb, 0xb0}},
-	{ // 6
-		[]byte{
-			0x51, 0x07, 0xb0, 0x15, 0x19, 0x58, 0x01, 0x01,
-			0x51, 0x07, 0xb0, 0x15, 0x19, 0x58, 0x01, 0x01,
-			0x51, 0x07, 0xb0, 0x15, 0x19, 0x58, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0x0f, 0x04, 0xce, 0x39, 0x3d, 0xb9, 0x26, 0xd5}},
-	{ // 7
-		[]byte{
-			0x10, 0x07, 0xb0, 0x15, 0x19, 0x19, 0x01, 0x01,
-			0x10, 0x07, 0xb0, 0x15, 0x19, 0x19, 0x01, 0x01,
-			0x10, 0x07, 0xb0, 0x15, 0x19, 0x19, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0xc9, 0xf0, 0x0f, 0xfc, 0x74, 0x07, 0x90, 0x67}},
-	{ // 8
-		[]byte{
-			0x31, 0x07, 0x91, 0x54, 0x98, 0x08, 0x01, 0x01,
-			0x31, 0x07, 0x91, 0x54, 0x98, 0x08, 0x01, 0x01,
-			0x31, 0x07, 0x91, 0x54, 0x98, 0x08, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0x7c, 0xfd, 0x82, 0xa5, 0x93, 0x25, 0x2b, 0x4e}},
-	{ // 9
-		[]byte{
-			0x31, 0x07, 0x91, 0x94, 0x98, 0x08, 0x01, 0x01,
-			0x31, 0x07, 0x91, 0x94, 0x98, 0x08, 0x01, 0x01,
-			0x31, 0x07, 0x91, 0x94, 0x98, 0x08, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0xcb, 0x49, 0xa2, 0xf9, 0xe9, 0x13, 0x63, 0xe3}},
-	{ // 10
-		[]byte{
-			0x10, 0x07, 0x91, 0x15, 0xb9, 0x08, 0x01, 0x40,
-			0x10, 0x07, 0x91, 0x15, 0xb9, 0x08, 0x01, 0x40,
-			0x10, 0x07, 0x91, 0x15, 0xb9, 0x08, 0x01, 0x40,
-		},
-		nil,
-		[]byte{0x00, 0xb5, 0x88, 0xbe, 0x70, 0xd2, 0x3f, 0x56}},
-	{ // 11
-		[]byte{
-			0x31, 0x07, 0x91, 0x15, 0x98, 0x08, 0x01, 0x40,
-			0x31, 0x07, 0x91, 0x15, 0x98, 0x08, 0x01, 0x40,
-			0x31, 0x07, 0x91, 0x15, 0x98, 0x08, 0x01, 0x40,
-		},
-		nil,
-		[]byte{0x40, 0x6a, 0x9a, 0x6a, 0xb4, 0x33, 0x99, 0xae}},
-	{ // 12
-		[]byte{
-			0x10, 0x07, 0xd0, 0x15, 0x89, 0x98, 0x01, 0x01,
-			0x10, 0x07, 0xd0, 0x15, 0x89, 0x98, 0x01, 0x01,
-			0x10, 0x07, 0xd0, 0x15, 0x89, 0x98, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0x6c, 0xb7, 0x73, 0x61, 0x1d, 0xca, 0x9a, 0xda}},
-	{ // 13
-		[]byte{
-			0x91, 0x07, 0x91, 0x15, 0x89, 0x98, 0x01, 0x01,
-			0x91, 0x07, 0x91, 0x15, 0x89, 0x98, 0x01, 0x01,
-			0x91, 0x07, 0x91, 0x15, 0x89, 0x98, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0x67, 0xfd, 0x21, 0xc1, 0x7d, 0xbb, 0x5d, 0x70}},
-	{ // 14
-		[]byte{
-			0x91, 0x07, 0xd0, 0x15, 0x89, 0x19, 0x01, 0x01,
-			0x91, 0x07, 0xd0, 0x15, 0x89, 0x19, 0x01, 0x01,
-			0x91, 0x07, 0xd0, 0x15, 0x89, 0x19, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0x95, 0x92, 0xcb, 0x41, 0x10, 0x43, 0x07, 0x87}},
-	{ // 15
-		[]byte{
-			0x10, 0x07, 0xd0, 0x15, 0x98, 0x98, 0x01, 0x20,
-			0x10, 0x07, 0xd0, 0x15, 0x98, 0x98, 0x01, 0x20,
-			0x10, 0x07, 0xd0, 0x15, 0x98, 0x98, 0x01, 0x20,
-		},
-		nil,
-		[]byte{0xa6, 0xb7, 0xff, 0x68, 0xa3, 0x18, 0xdd, 0xd3}},
-	{ // 16
-		[]byte{
-			0x10, 0x07, 0x94, 0x04, 0x98, 0x19, 0x01, 0x01,
-			0x10, 0x07, 0x94, 0x04, 0x98, 0x19, 0x01, 0x01,
-			0x10, 0x07, 0x94, 0x04, 0x98, 0x19, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0x4d, 0x10, 0x21, 0x96, 0xc9, 0x14, 0xca, 0x16}},
-	{ // 17
-		[]byte{
-			0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x04, 0x01,
-			0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x04, 0x01,
-			0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x04, 0x01,
-		},
-		nil,
-		[]byte{0x2d, 0xfa, 0x9f, 0x45, 0x73, 0x59, 0x49, 0x65}},
-	{ // 18
-		[]byte{
-			0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x01, 0x01,
-			0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x01, 0x01,
-			0x01, 0x07, 0x91, 0x04, 0x91, 0x19, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0xb4, 0x66, 0x04, 0x81, 0x6c, 0x0e, 0x07, 0x74}},
-	{ // 19
-		[]byte{
-			0x01, 0x07, 0x94, 0x04, 0x91, 0x19, 0x04, 0x01,
-			0x01, 0x07, 0x94, 0x04, 0x91, 0x19, 0x04, 0x01,
-			0x01, 0x07, 0x94, 0x04, 0x91, 0x19, 0x04, 0x01,
-		},
-		nil,
-		[]byte{0x6e, 0x7e, 0x62, 0x21, 0xa4, 0xf3, 0x4e, 0x87}},
-	{ // 20
-		[]byte{
-			0x19, 0x07, 0x92, 0x10, 0x98, 0x1a, 0x01, 0x01,
-			0x19, 0x07, 0x92, 0x10, 0x98, 0x1a, 0x01, 0x01,
-			0x19, 0x07, 0x92, 0x10, 0x98, 0x1a, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0xaa, 0x85, 0xe7, 0x46, 0x43, 0x23, 0x31, 0x99}},
-	{ // 21
-		[]byte{
-			0x10, 0x07, 0x91, 0x19, 0x98, 0x19, 0x08, 0x01,
-			0x10, 0x07, 0x91, 0x19, 0x98, 0x19, 0x08, 0x01,
-			0x10, 0x07, 0x91, 0x19, 0x98, 0x19, 0x08, 0x01,
-		},
-		nil,
-		[]byte{0x2e, 0x5a, 0x19, 0xdb, 0x4d, 0x19, 0x62, 0xd6}},
-	{ // 22
-		[]byte{
-			0x10, 0x07, 0x91, 0x19, 0x98, 0x1a, 0x08, 0x01,
-			0x10, 0x07, 0x91, 0x19, 0x98, 0x1a, 0x08, 0x01,
-			0x10, 0x07, 0x91, 0x19, 0x98, 0x1a, 0x08, 0x01,
-		},
-		nil,
-		[]byte{0x23, 0xa8, 0x66, 0xa8, 0x09, 0xd3, 0x08, 0x94}},
-	{ // 23
-		[]byte{
-			0x10, 0x07, 0x92, 0x10, 0x98, 0x19, 0x01, 0x01,
-			0x10, 0x07, 0x92, 0x10, 0x98, 0x19, 0x01, 0x01,
-			0x10, 0x07, 0x92, 0x10, 0x98, 0x19, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0xd8, 0x12, 0xd9, 0x61, 0xf0, 0x17, 0xd3, 0x20}},
-	{ // 24
-		[]byte{
-			0x10, 0x07, 0x91, 0x15, 0x98, 0x19, 0x01, 0x0b,
-			0x10, 0x07, 0x91, 0x15, 0x98, 0x19, 0x01, 0x0b,
-			0x10, 0x07, 0x91, 0x15, 0x98, 0x19, 0x01, 0x0b,
-		},
-		nil,
-		[]byte{0x05, 0x56, 0x05, 0x81, 0x6e, 0x58, 0x60, 0x8f}},
-	{ // 25
-		[]byte{
-			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x01,
-			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x01,
-			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0xab, 0xd8, 0x8e, 0x8b, 0x1b, 0x77, 0x16, 0xf1}},
-	{ // 26
-		[]byte{
-			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x02,
-			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x02,
-			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x02,
-		},
-		nil,
-		[]byte{0x53, 0x7a, 0xc9, 0x5b, 0xe6, 0x9d, 0xa1, 0xe1}},
-	{ // 27
-		[]byte{
-			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x08,
-			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x08,
-			0x10, 0x04, 0x80, 0x15, 0x98, 0x19, 0x01, 0x08,
-		},
-		nil,
-		[]byte{0xae, 0xd0, 0xf6, 0xae, 0x3c, 0x25, 0xcd, 0xd8}},
-	{ // 28
-		[]byte{
-			0x10, 0x02, 0x91, 0x15, 0x98, 0x10, 0x01, 0x04,
-			0x10, 0x02, 0x91, 0x15, 0x98, 0x10, 0x01, 0x04,
-			0x10, 0x02, 0x91, 0x15, 0x98, 0x10, 0x01, 0x04,
-		},
-		nil,
-		[]byte{0xb3, 0xe3, 0x5a, 0x5e, 0xe5, 0x3e, 0x7b, 0x8d}},
-	{ // 29
-		[]byte{
-			0x10, 0x02, 0x91, 0x15, 0x98, 0x19, 0x01, 0x04,
-			0x10, 0x02, 0x91, 0x15, 0x98, 0x19, 0x01, 0x04,
-			0x10, 0x02, 0x91, 0x15, 0x98, 0x19, 0x01, 0x04,
-		},
-		nil,
-		[]byte{0x61, 0xc7, 0x9c, 0x71, 0x92, 0x1a, 0x2e, 0xf8}},
-	{ // 30
-		[]byte{
-			0x10, 0x02, 0x91, 0x15, 0x98, 0x10, 0x02, 0x01,
-			0x10, 0x02, 0x91, 0x15, 0x98, 0x10, 0x02, 0x01,
-			0x10, 0x02, 0x91, 0x15, 0x98, 0x10, 0x02, 0x01,
-		},
-		nil,
-		[]byte{0xe2, 0xf5, 0x72, 0x8f, 0x09, 0x95, 0x01, 0x3c}},
-	{ // 31
-		[]byte{
-			0x10, 0x02, 0x91, 0x16, 0x98, 0x10, 0x01, 0x01,
-			0x10, 0x02, 0x91, 0x16, 0x98, 0x10, 0x01, 0x01,
-			0x10, 0x02, 0x91, 0x16, 0x98, 0x10, 0x01, 0x01,
-		},
-		nil,
-		[]byte{0x1a, 0xea, 0xc3, 0x9a, 0x61, 0xf0, 0xa4, 0x64}},
-}
-
-// Table A.4 Values To Be Used for the Substitution Table Known Answer Test
-var tableA4Tests = []CryptTest{
-	{ // 0
-		[]byte{
-			0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57,
-			0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57,
-			0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57},
-		[]byte{0x01, 0xa1, 0xd6, 0xd0, 0x39, 0x77, 0x67, 0x42},
-		[]byte{0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b}},
-	{ // 1
-		[]byte{
-			0x01, 0x31, 0xd9, 0x61, 0x9d, 0xc1, 0x37, 0x6e,
-			0x01, 0x31, 0xd9, 0x61, 0x9d, 0xc1, 0x37, 0x6e,
-			0x01, 0x31, 0xd9, 0x61, 0x9d, 0xc1, 0x37, 0x6e},
-		[]byte{0x5c, 0xd5, 0x4c, 0xa8, 0x3d, 0xef, 0x57, 0xda},
-		[]byte{0x7a, 0x38, 0x9d, 0x10, 0x35, 0x4b, 0xd2, 0x71}},
-	{ // 2
-		[]byte{
-			0x07, 0xa1, 0x13, 0x3e, 0x4a, 0x0b, 0x26, 0x86,
-			0x07, 0xa1, 0x13, 0x3e, 0x4a, 0x0b, 0x26, 0x86,
-			0x07, 0xa1, 0x13, 0x3e, 0x4a, 0x0b, 0x26, 0x86},
-		[]byte{0x02, 0x48, 0xd4, 0x38, 0x06, 0xf6, 0x71, 0x72},
-		[]byte{0x86, 0x8e, 0xbb, 0x51, 0xca, 0xb4, 0x59, 0x9a}},
-	{ // 3
-		[]byte{
-			0x38, 0x49, 0x67, 0x4c, 0x26, 0x02, 0x31, 0x9e,
-			0x38, 0x49, 0x67, 0x4c, 0x26, 0x02, 0x31, 0x9e,
-			0x38, 0x49, 0x67, 0x4c, 0x26, 0x02, 0x31, 0x9e},
-		[]byte{0x51, 0x45, 0x4b, 0x58, 0x2d, 0xdf, 0x44, 0x0a},
-		[]byte{0x71, 0x78, 0x87, 0x6e, 0x01, 0xf1, 0x9b, 0x2a}},
-	{ // 4
-		[]byte{
-			0x04, 0xb9, 0x15, 0xba, 0x43, 0xfe, 0xb5, 0xb6,
-			0x04, 0xb9, 0x15, 0xba, 0x43, 0xfe, 0xb5, 0xb6,
-			0x04, 0xb9, 0x15, 0xba, 0x43, 0xfe, 0xb5, 0xb6},
-		[]byte{0x42, 0xfd, 0x44, 0x30, 0x59, 0x57, 0x7f, 0xa2},
-		[]byte{0xaf, 0x37, 0xfb, 0x42, 0x1f, 0x8c, 0x40, 0x95}},
-	{ // 5
-		[]byte{
-			0x01, 0x13, 0xb9, 0x70, 0xfd, 0x34, 0xf2, 0xce,
-			0x01, 0x13, 0xb9, 0x70, 0xfd, 0x34, 0xf2, 0xce,
-			0x01, 0x13, 0xb9, 0x70, 0xfd, 0x34, 0xf2, 0xce},
-		[]byte{0x05, 0x9b, 0x5e, 0x08, 0x51, 0xcf, 0x14, 0x3a},
-		[]byte{0x86, 0xa5, 0x60, 0xf1, 0x0e, 0xc6, 0xd8, 0x5b}},
-	{ // 6
-		[]byte{
-			0x01, 0x70, 0xf1, 0x75, 0x46, 0x8f, 0xb5, 0xe6,
-			0x01, 0x70, 0xf1, 0x75, 0x46, 0x8f, 0xb5, 0xe6,
-			0x01, 0x70, 0xf1, 0x75, 0x46, 0x8f, 0xb5, 0xe6},
-		[]byte{0x07, 0x56, 0xd8, 0xe0, 0x77, 0x47, 0x61, 0xd2},
-		[]byte{0x0c, 0xd3, 0xda, 0x02, 0x00, 0x21, 0xdc, 0x09}},
-	{ // 7
-		[]byte{
-			0x43, 0x29, 0x7f, 0xad, 0x38, 0xe3, 0x73, 0xfe,
-			0x43, 0x29, 0x7f, 0xad, 0x38, 0xe3, 0x73, 0xfe,
-			0x43, 0x29, 0x7f, 0xad, 0x38, 0xe3, 0x73, 0xfe},
-		[]byte{0x76, 0x25, 0x14, 0xb8, 0x29, 0xbf, 0x48, 0x6a},
-		[]byte{0xea, 0x67, 0x6b, 0x2c, 0xb7, 0xdb, 0x2b, 0x7a}},
-	{ // 8
-		[]byte{
-			0x07, 0xa7, 0x13, 0x70, 0x45, 0xda, 0x2a, 0x16,
-			0x07, 0xa7, 0x13, 0x70, 0x45, 0xda, 0x2a, 0x16,
-			0x07, 0xa7, 0x13, 0x70, 0x45, 0xda, 0x2a, 0x16},
-		[]byte{0x3b, 0xdd, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02},
-		[]byte{0xdf, 0xd6, 0x4a, 0x81, 0x5c, 0xaf, 0x1a, 0x0f}},
-	{ // 9
-		[]byte{
-			0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f,
-			0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f,
-			0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f},
-		[]byte{0x26, 0x95, 0x5f, 0x68, 0x35, 0xaf, 0x60, 0x9a},
-		[]byte{0x5c, 0x51, 0x3c, 0x9c, 0x48, 0x86, 0xc0, 0x88}},
-	{ // 10
-		[]byte{
-			0x37, 0xd0, 0x6b, 0xb5, 0x16, 0xcb, 0x75, 0x46,
-			0x37, 0xd0, 0x6b, 0xb5, 0x16, 0xcb, 0x75, 0x46,
-			0x37, 0xd0, 0x6b, 0xb5, 0x16, 0xcb, 0x75, 0x46},
-		[]byte{0x16, 0x4d, 0x5e, 0x40, 0x4f, 0x27, 0x52, 0x32},
-		[]byte{0x0a, 0x2a, 0xee, 0xae, 0x3f, 0xf4, 0xab, 0x77}},
-	{ // 11
-		[]byte{
-			0x1f, 0x08, 0x26, 0x0d, 0x1a, 0xc2, 0x46, 0x5e,
-			0x1f, 0x08, 0x26, 0x0d, 0x1a, 0xc2, 0x46, 0x5e,
-			0x1f, 0x08, 0x26, 0x0d, 0x1a, 0xc2, 0x46, 0x5e},
-		[]byte{0x6b, 0x05, 0x6e, 0x18, 0x75, 0x9f, 0x5c, 0xca},
-		[]byte{0xef, 0x1b, 0xf0, 0x3e, 0x5d, 0xfa, 0x57, 0x5a}},
-	{ // 12
-		[]byte{
-			0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76,
-			0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76,
-			0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76},
-		[]byte{0x00, 0x4b, 0xd6, 0xef, 0x09, 0x17, 0x60, 0x62},
-		[]byte{0x88, 0xbf, 0x0d, 0xb6, 0xd7, 0x0d, 0xee, 0x56}},
-	{ // 13
-		[]byte{
-			0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xb0, 0x07,
-			0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xb0, 0x07,
-			0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xb0, 0x07},
-		[]byte{0x48, 0x0d, 0x39, 0x00, 0x6e, 0xe7, 0x62, 0xf2},
-		[]byte{0xa1, 0xf9, 0x91, 0x55, 0x41, 0x02, 0x0b, 0x56}},
-	{ // 14
-		[]byte{
-			0x49, 0x79, 0x3e, 0xbc, 0x79, 0xb3, 0x25, 0x8f,
-			0x49, 0x79, 0x3e, 0xbc, 0x79, 0xb3, 0x25, 0x8f,
-			0x49, 0x79, 0x3e, 0xbc, 0x79, 0xb3, 0x25, 0x8f},
-		[]byte{0x43, 0x75, 0x40, 0xc8, 0x69, 0x8f, 0x3c, 0xfa},
-		[]byte{0x6f, 0xbf, 0x1c, 0xaf, 0xcf, 0xfd, 0x05, 0x56}},
-	{ // 15
-		[]byte{
-			0x4f, 0xb0, 0x5e, 0x15, 0x15, 0xab, 0x73, 0xa7,
-			0x4f, 0xb0, 0x5e, 0x15, 0x15, 0xab, 0x73, 0xa7,
-			0x4f, 0xb0, 0x5e, 0x15, 0x15, 0xab, 0x73, 0xa7},
-		[]byte{0x07, 0x2d, 0x43, 0xa0, 0x77, 0x07, 0x52, 0x92},
-		[]byte{0x2f, 0x22, 0xe4, 0x9b, 0xab, 0x7c, 0xa1, 0xac}},
-	{ // 16
-		[]byte{
-			0x49, 0xe9, 0x5d, 0x6d, 0x4c, 0xa2, 0x29, 0xbf,
-			0x49, 0xe9, 0x5d, 0x6d, 0x4c, 0xa2, 0x29, 0xbf,
-			0x49, 0xe9, 0x5d, 0x6d, 0x4c, 0xa2, 0x29, 0xbf},
-		[]byte{0x02, 0xfe, 0x55, 0x77, 0x81, 0x17, 0xf1, 0x2a},
-		[]byte{0x5a, 0x6b, 0x61, 0x2c, 0xc2, 0x6c, 0xce, 0x4a}},
-	{ // 17
-		[]byte{
-			0x01, 0x83, 0x10, 0xdc, 0x40, 0x9b, 0x26, 0xd6,
-			0x01, 0x83, 0x10, 0xdc, 0x40, 0x9b, 0x26, 0xd6,
-			0x01, 0x83, 0x10, 0xdc, 0x40, 0x9b, 0x26, 0xd6},
-		[]byte{0x1d, 0x9d, 0x5c, 0x50, 0x18, 0xf7, 0x28, 0xc2},
-		[]byte{0x5f, 0x4c, 0x03, 0x8e, 0xd1, 0x2b, 0x2e, 0x41}},
-	{ // 18
-		[]byte{
-			0x1c, 0x58, 0x7f, 0x1c, 0x13, 0x92, 0x4f, 0xef,
-			0x1c, 0x58, 0x7f, 0x1c, 0x13, 0x92, 0x4f, 0xef,
-			0x1c, 0x58, 0x7f, 0x1c, 0x13, 0x92, 0x4f, 0xef},
-		[]byte{0x30, 0x55, 0x32, 0x28, 0x6d, 0x6f, 0x29, 0x5a},
-		[]byte{0x63, 0xfa, 0xc0, 0xd0, 0x34, 0xd9, 0xf7, 0x93}},
-}
-
-func newCipher(key []byte) *desCipher {
-	c, err := NewCipher(key)
-	if err != nil {
-		panic("NewCipher failed: " + err.Error())
-	}
-	return c.(*desCipher)
-}
-
-// Use the known weak keys to test DES implementation
-func TestWeakKeys(t *testing.T) {
-	for i, tt := range weakKeyTests {
-		var encrypt = func(in []byte) (out []byte) {
-			c := newCipher(tt.key)
-			out = make([]byte, len(in))
-			encryptBlock(c.subkeys[:], out, in)
-			return
-		}
-
-		// Encrypting twice with a DES weak
-		// key should reproduce the original input
-		result := encrypt(tt.in)
-		result = encrypt(result)
-
-		if !bytes.Equal(result, tt.in) {
-			t.Errorf("#%d: result: %x want: %x", i, result, tt.in)
-		}
-	}
-}
-
-// Use the known semi-weak key pairs to test DES implementation
-func TestSemiWeakKeyPairs(t *testing.T) {
-	for i, tt := range semiWeakKeyTests {
-		var encrypt = func(key, in []byte) (out []byte) {
-			c := newCipher(key)
-			out = make([]byte, len(in))
-			encryptBlock(c.subkeys[:], out, in)
-			return
-		}
-
-		// Encrypting with one member of the semi-weak pair
-		// and then encrypting the result with the other member
-		// should reproduce the original input.
-		result := encrypt(tt.key, tt.in)
-		result = encrypt(tt.out, result)
-
-		if !bytes.Equal(result, tt.in) {
-			t.Errorf("#%d: result: %x want: %x", i, result, tt.in)
-		}
-	}
-}
-
-func TestDESEncryptBlock(t *testing.T) {
-	for i, tt := range encryptDESTests {
-		c := newCipher(tt.key)
-		out := make([]byte, len(tt.in))
-		encryptBlock(c.subkeys[:], out, tt.in)
-
-		if !bytes.Equal(out, tt.out) {
-			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
-		}
-	}
-}
-
-func TestDESDecryptBlock(t *testing.T) {
-	for i, tt := range encryptDESTests {
-		c := newCipher(tt.key)
-		plain := make([]byte, len(tt.in))
-		decryptBlock(c.subkeys[:], plain, tt.out)
-
-		if !bytes.Equal(plain, tt.in) {
-			t.Errorf("#%d: result: %x want: %x", i, plain, tt.in)
-		}
-	}
-}
-
-func TestEncryptTripleDES(t *testing.T) {
-	for i, tt := range encryptTripleDESTests {
-		c, _ := NewTripleDESCipher(tt.key)
-		out := make([]byte, len(tt.in))
-		c.Encrypt(out, tt.in)
-
-		if !bytes.Equal(out, tt.out) {
-			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
-		}
-	}
-}
-
-func TestDecryptTripleDES(t *testing.T) {
-	for i, tt := range encryptTripleDESTests {
-		c, _ := NewTripleDESCipher(tt.key)
-
-		plain := make([]byte, len(tt.in))
-		c.Decrypt(plain, tt.out)
-
-		if !bytes.Equal(plain, tt.in) {
-			t.Errorf("#%d: result: %x want: %x", i, plain, tt.in)
-		}
-	}
-}
-
-// Defined in Pub 800-20
-func TestVariablePlaintextKnownAnswer(t *testing.T) {
-	for i, tt := range tableA1Tests {
-		c, _ := NewTripleDESCipher(tableA1Key)
-
-		out := make([]byte, len(tt.in))
-		c.Encrypt(out, tt.in)
-
-		if !bytes.Equal(out, tt.out) {
-			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
-		}
-	}
-}
-
-// Defined in Pub 800-20
-func TestVariableCiphertextKnownAnswer(t *testing.T) {
-	for i, tt := range tableA1Tests {
-		c, _ := NewTripleDESCipher(tableA1Key)
-
-		plain := make([]byte, len(tt.out))
-		c.Decrypt(plain, tt.out)
-
-		if !bytes.Equal(plain, tt.in) {
-			t.Errorf("#%d: result: %x want: %x", i, plain, tt.in)
-		}
-	}
-}
-
-// Defined in Pub 800-20
-// Encrypting the Table A.1 ciphertext with the
-// 0x01... key produces the original plaintext
-func TestInversePermutationKnownAnswer(t *testing.T) {
-	for i, tt := range tableA1Tests {
-		c, _ := NewTripleDESCipher(tableA1Key)
-
-		plain := make([]byte, len(tt.in))
-		c.Encrypt(plain, tt.out)
-
-		if !bytes.Equal(plain, tt.in) {
-			t.Errorf("#%d: result: %x want: %x", i, plain, tt.in)
-		}
-	}
-}
-
-// Defined in Pub 800-20
-// Decrypting the Table A.1 plaintext with the
-// 0x01... key produces the corresponding ciphertext
-func TestInitialPermutationKnownAnswer(t *testing.T) {
-	for i, tt := range tableA1Tests {
-		c, _ := NewTripleDESCipher(tableA1Key)
-
-		out := make([]byte, len(tt.in))
-		c.Decrypt(out, tt.in)
-
-		if !bytes.Equal(out, tt.out) {
-			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
-		}
-	}
-}
-
-// Defined in Pub 800-20
-func TestVariableKeyKnownAnswerEncrypt(t *testing.T) {
-	for i, tt := range tableA2Tests {
-		c, _ := NewTripleDESCipher(tt.key)
-
-		out := make([]byte, len(tableA2Plaintext))
-		c.Encrypt(out, tableA2Plaintext)
-
-		if !bytes.Equal(out, tt.out) {
-			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
-		}
-	}
-}
-
-// Defined in Pub 800-20
-func TestVariableKeyKnownAnswerDecrypt(t *testing.T) {
-	for i, tt := range tableA2Tests {
-		c, _ := NewTripleDESCipher(tt.key)
-
-		out := make([]byte, len(tt.out))
-		c.Decrypt(out, tt.out)
-
-		if !bytes.Equal(out, tableA2Plaintext) {
-			t.Errorf("#%d: result: %x want: %x", i, out, tableA2Plaintext)
-		}
-	}
-}
-
-// Defined in Pub 800-20
-func TestPermutationOperationKnownAnswerEncrypt(t *testing.T) {
-	for i, tt := range tableA3Tests {
-		c, _ := NewTripleDESCipher(tt.key)
-
-		out := make([]byte, len(tableA3Plaintext))
-		c.Encrypt(out, tableA3Plaintext)
-
-		if !bytes.Equal(out, tt.out) {
-			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
-		}
-	}
-}
-
-// Defined in Pub 800-20
-func TestPermutationOperationKnownAnswerDecrypt(t *testing.T) {
-	for i, tt := range tableA3Tests {
-		c, _ := NewTripleDESCipher(tt.key)
-
-		out := make([]byte, len(tt.out))
-		c.Decrypt(out, tt.out)
-
-		if !bytes.Equal(out, tableA3Plaintext) {
-			t.Errorf("#%d: result: %x want: %x", i, out, tableA3Plaintext)
-		}
-	}
-}
-
-// Defined in Pub 800-20
-func TestSubstitutionTableKnownAnswerEncrypt(t *testing.T) {
-	for i, tt := range tableA4Tests {
-		c, _ := NewTripleDESCipher(tt.key)
-
-		out := make([]byte, len(tt.in))
-		c.Encrypt(out, tt.in)
-
-		if !bytes.Equal(out, tt.out) {
-			t.Errorf("#%d: result: %x want: %x", i, out, tt.out)
-		}
-	}
-}
-
-// Defined in Pub 800-20
-func TestSubstitutionTableKnownAnswerDecrypt(t *testing.T) {
-	for i, tt := range tableA4Tests {
-		c, _ := NewTripleDESCipher(tt.key)
-
-		out := make([]byte, len(tt.out))
-		c.Decrypt(out, tt.out)
-
-		if !bytes.Equal(out, tt.in) {
-			t.Errorf("#%d: result: %x want: %x", i, out, tt.in)
-		}
-	}
-}
-
-func TestInitialPermute(t *testing.T) {
-	for i := uint(0); i < 64; i++ {
-		bit := uint64(1) << i
-		got := permuteInitialBlock(bit)
-		want := uint64(1) << finalPermutation[63-i]
-		if got != want {
-			t.Errorf("permute(%x) = %x, want %x", bit, got, want)
-		}
-	}
-}
-
-func TestFinalPermute(t *testing.T) {
-	for i := uint(0); i < 64; i++ {
-		bit := uint64(1) << i
-		got := permuteFinalBlock(bit)
-		want := uint64(1) << initialPermutation[63-i]
-		if got != want {
-			t.Errorf("permute(%x) = %x, want %x", bit, got, want)
-		}
-	}
-}
-
-func TestExpandBlock(t *testing.T) {
-	for i := uint(0); i < 32; i++ {
-		bit := uint32(1) << i
-		got := expandBlock(bit)
-		want := permuteBlock(uint64(bit), expansionFunction[:])
-		if got != want {
-			t.Errorf("expand(%x) = %x, want %x", bit, got, want)
-		}
-	}
-}
-
-func BenchmarkEncrypt(b *testing.B) {
-	tt := encryptDESTests[0]
-	c, err := NewCipher(tt.key)
-	if err != nil {
-		b.Fatal("NewCipher:", err)
-	}
-	out := make([]byte, len(tt.in))
-	b.SetBytes(int64(len(out)))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		c.Encrypt(out, tt.in)
-	}
-}
-
-func BenchmarkDecrypt(b *testing.B) {
-	tt := encryptDESTests[0]
-	c, err := NewCipher(tt.key)
-	if err != nil {
-		b.Fatal("NewCipher:", err)
-	}
-	out := make([]byte, len(tt.out))
-	b.SetBytes(int64(len(out)))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		c.Decrypt(out, tt.out)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/dsa/dsa.go b/third_party/gofrontend/libgo/go/crypto/dsa/dsa.go
deleted file mode 100644
index b7565a6..0000000
--- a/third_party/gofrontend/libgo/go/crypto/dsa/dsa.go
+++ /dev/null
@@ -1,278 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package dsa implements the Digital Signature Algorithm, as defined in FIPS 186-3.
-package dsa
-
-import (
-	"errors"
-	"io"
-	"math/big"
-)
-
-// Parameters represents the domain parameters for a key. These parameters can
-// be shared across many keys. The bit length of Q must be a multiple of 8.
-type Parameters struct {
-	P, Q, G *big.Int
-}
-
-// PublicKey represents a DSA public key.
-type PublicKey struct {
-	Parameters
-	Y *big.Int
-}
-
-// PrivateKey represents a DSA private key.
-type PrivateKey struct {
-	PublicKey
-	X *big.Int
-}
-
-// ErrInvalidPublicKey results when a public key is not usable by this code.
-// FIPS is quite strict about the format of DSA keys, but other code may be
-// less so. Thus, when using keys which may have been generated by other code,
-// this error must be handled.
-var ErrInvalidPublicKey = errors.New("crypto/dsa: invalid public key")
-
-// ParameterSizes is a enumeration of the acceptable bit lengths of the primes
-// in a set of DSA parameters. See FIPS 186-3, section 4.2.
-type ParameterSizes int
-
-const (
-	L1024N160 ParameterSizes = iota
-	L2048N224
-	L2048N256
-	L3072N256
-)
-
-// numMRTests is the number of Miller-Rabin primality tests that we perform. We
-// pick the largest recommended number from table C.1 of FIPS 186-3.
-const numMRTests = 64
-
-// GenerateParameters puts a random, valid set of DSA parameters into params.
-// This function takes many seconds, even on fast machines.
-func GenerateParameters(params *Parameters, rand io.Reader, sizes ParameterSizes) (err error) {
-	// This function doesn't follow FIPS 186-3 exactly in that it doesn't
-	// use a verification seed to generate the primes. The verification
-	// seed doesn't appear to be exported or used by other code and
-	// omitting it makes the code cleaner.
-
-	var L, N int
-	switch sizes {
-	case L1024N160:
-		L = 1024
-		N = 160
-	case L2048N224:
-		L = 2048
-		N = 224
-	case L2048N256:
-		L = 2048
-		N = 256
-	case L3072N256:
-		L = 3072
-		N = 256
-	default:
-		return errors.New("crypto/dsa: invalid ParameterSizes")
-	}
-
-	qBytes := make([]byte, N/8)
-	pBytes := make([]byte, L/8)
-
-	q := new(big.Int)
-	p := new(big.Int)
-	rem := new(big.Int)
-	one := new(big.Int)
-	one.SetInt64(1)
-
-GeneratePrimes:
-	for {
-		_, err = io.ReadFull(rand, qBytes)
-		if err != nil {
-			return
-		}
-
-		qBytes[len(qBytes)-1] |= 1
-		qBytes[0] |= 0x80
-		q.SetBytes(qBytes)
-
-		if !q.ProbablyPrime(numMRTests) {
-			continue
-		}
-
-		for i := 0; i < 4*L; i++ {
-			_, err = io.ReadFull(rand, pBytes)
-			if err != nil {
-				return
-			}
-
-			pBytes[len(pBytes)-1] |= 1
-			pBytes[0] |= 0x80
-
-			p.SetBytes(pBytes)
-			rem.Mod(p, q)
-			rem.Sub(rem, one)
-			p.Sub(p, rem)
-			if p.BitLen() < L {
-				continue
-			}
-
-			if !p.ProbablyPrime(numMRTests) {
-				continue
-			}
-
-			params.P = p
-			params.Q = q
-			break GeneratePrimes
-		}
-	}
-
-	h := new(big.Int)
-	h.SetInt64(2)
-	g := new(big.Int)
-
-	pm1 := new(big.Int).Sub(p, one)
-	e := new(big.Int).Div(pm1, q)
-
-	for {
-		g.Exp(h, e, p)
-		if g.Cmp(one) == 0 {
-			h.Add(h, one)
-			continue
-		}
-
-		params.G = g
-		return
-	}
-}
-
-// GenerateKey generates a public&private key pair. The Parameters of the
-// PrivateKey must already be valid (see GenerateParameters).
-func GenerateKey(priv *PrivateKey, rand io.Reader) error {
-	if priv.P == nil || priv.Q == nil || priv.G == nil {
-		return errors.New("crypto/dsa: parameters not set up before generating key")
-	}
-
-	x := new(big.Int)
-	xBytes := make([]byte, priv.Q.BitLen()/8)
-
-	for {
-		_, err := io.ReadFull(rand, xBytes)
-		if err != nil {
-			return err
-		}
-		x.SetBytes(xBytes)
-		if x.Sign() != 0 && x.Cmp(priv.Q) < 0 {
-			break
-		}
-	}
-
-	priv.X = x
-	priv.Y = new(big.Int)
-	priv.Y.Exp(priv.G, x, priv.P)
-	return nil
-}
-
-// fermatInverse calculates the inverse of k in GF(P) using Fermat's method.
-// This has better constant-time properties than Euclid's method (implemented
-// in math/big.Int.ModInverse) although math/big itself isn't strictly
-// constant-time so it's not perfect.
-func fermatInverse(k, P *big.Int) *big.Int {
-	two := big.NewInt(2)
-	pMinus2 := new(big.Int).Sub(P, two)
-	return new(big.Int).Exp(k, pMinus2, P)
-}
-
-// Sign signs an arbitrary length hash (which should be the result of hashing a
-// larger message) using the private key, priv. It returns the signature as a
-// pair of integers. The security of the private key depends on the entropy of
-// rand.
-//
-// Note that FIPS 186-3 section 4.6 specifies that the hash should be truncated
-// to the byte-length of the subgroup. This function does not perform that
-// truncation itself.
-func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error) {
-	// FIPS 186-3, section 4.6
-
-	n := priv.Q.BitLen()
-	if n&7 != 0 {
-		err = ErrInvalidPublicKey
-		return
-	}
-	n >>= 3
-
-	for {
-		k := new(big.Int)
-		buf := make([]byte, n)
-		for {
-			_, err = io.ReadFull(rand, buf)
-			if err != nil {
-				return
-			}
-			k.SetBytes(buf)
-			if k.Sign() > 0 && k.Cmp(priv.Q) < 0 {
-				break
-			}
-		}
-
-		kInv := fermatInverse(k, priv.Q)
-
-		r = new(big.Int).Exp(priv.G, k, priv.P)
-		r.Mod(r, priv.Q)
-
-		if r.Sign() == 0 {
-			continue
-		}
-
-		z := k.SetBytes(hash)
-
-		s = new(big.Int).Mul(priv.X, r)
-		s.Add(s, z)
-		s.Mod(s, priv.Q)
-		s.Mul(s, kInv)
-		s.Mod(s, priv.Q)
-
-		if s.Sign() != 0 {
-			break
-		}
-	}
-
-	return
-}
-
-// Verify verifies the signature in r, s of hash using the public key, pub. It
-// reports whether the signature is valid.
-//
-// Note that FIPS 186-3 section 4.6 specifies that the hash should be truncated
-// to the byte-length of the subgroup. This function does not perform that
-// truncation itself.
-func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool {
-	// FIPS 186-3, section 4.7
-
-	if r.Sign() < 1 || r.Cmp(pub.Q) >= 0 {
-		return false
-	}
-	if s.Sign() < 1 || s.Cmp(pub.Q) >= 0 {
-		return false
-	}
-
-	w := new(big.Int).ModInverse(s, pub.Q)
-
-	n := pub.Q.BitLen()
-	if n&7 != 0 {
-		return false
-	}
-	z := new(big.Int).SetBytes(hash)
-
-	u1 := new(big.Int).Mul(z, w)
-	u1.Mod(u1, pub.Q)
-	u2 := w.Mul(r, w)
-	u2.Mod(u2, pub.Q)
-	v := u1.Exp(pub.G, u1, pub.P)
-	u2.Exp(pub.Y, u2, pub.P)
-	v.Mul(v, u2)
-	v.Mod(v, pub.P)
-	v.Mod(v, pub.Q)
-
-	return v.Cmp(r) == 0
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/dsa/dsa_test.go b/third_party/gofrontend/libgo/go/crypto/dsa/dsa_test.go
deleted file mode 100644
index 568416d..0000000
--- a/third_party/gofrontend/libgo/go/crypto/dsa/dsa_test.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package dsa
-
-import (
-	"crypto/rand"
-	"math/big"
-	"testing"
-)
-
-func testSignAndVerify(t *testing.T, i int, priv *PrivateKey) {
-	hashed := []byte("testing")
-	r, s, err := Sign(rand.Reader, priv, hashed)
-	if err != nil {
-		t.Errorf("%d: error signing: %s", i, err)
-		return
-	}
-
-	if !Verify(&priv.PublicKey, hashed, r, s) {
-		t.Errorf("%d: Verify failed", i)
-	}
-}
-
-func testParameterGeneration(t *testing.T, sizes ParameterSizes, L, N int) {
-	var priv PrivateKey
-	params := &priv.Parameters
-
-	err := GenerateParameters(params, rand.Reader, sizes)
-	if err != nil {
-		t.Errorf("%d: %s", int(sizes), err)
-		return
-	}
-
-	if params.P.BitLen() != L {
-		t.Errorf("%d: params.BitLen got:%d want:%d", int(sizes), params.P.BitLen(), L)
-	}
-
-	if params.Q.BitLen() != N {
-		t.Errorf("%d: q.BitLen got:%d want:%d", int(sizes), params.Q.BitLen(), L)
-	}
-
-	one := new(big.Int)
-	one.SetInt64(1)
-	pm1 := new(big.Int).Sub(params.P, one)
-	quo, rem := new(big.Int).DivMod(pm1, params.Q, new(big.Int))
-	if rem.Sign() != 0 {
-		t.Errorf("%d: p-1 mod q != 0", int(sizes))
-	}
-	x := new(big.Int).Exp(params.G, quo, params.P)
-	if x.Cmp(one) == 0 {
-		t.Errorf("%d: invalid generator", int(sizes))
-	}
-
-	err = GenerateKey(&priv, rand.Reader)
-	if err != nil {
-		t.Errorf("error generating key: %s", err)
-		return
-	}
-
-	testSignAndVerify(t, int(sizes), &priv)
-}
-
-func TestParameterGeneration(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping parameter generation test in short mode")
-	}
-
-	testParameterGeneration(t, L1024N160, 1024, 160)
-	testParameterGeneration(t, L2048N224, 2048, 224)
-	testParameterGeneration(t, L2048N256, 2048, 256)
-	testParameterGeneration(t, L3072N256, 3072, 256)
-}
-
-func TestSignAndVerify(t *testing.T) {
-	var priv PrivateKey
-	priv.P, _ = new(big.Int).SetString("A9B5B793FB4785793D246BAE77E8FF63CA52F442DA763C440259919FE1BC1D6065A9350637A04F75A2F039401D49F08E066C4D275A5A65DA5684BC563C14289D7AB8A67163BFBF79D85972619AD2CFF55AB0EE77A9002B0EF96293BDD0F42685EBB2C66C327079F6C98000FBCB79AACDE1BC6F9D5C7B1A97E3D9D54ED7951FEF", 16)
-	priv.Q, _ = new(big.Int).SetString("E1D3391245933D68A0714ED34BBCB7A1F422B9C1", 16)
-	priv.G, _ = new(big.Int).SetString("634364FC25248933D01D1993ECABD0657CC0CB2CEED7ED2E3E8AECDFCDC4A25C3B15E9E3B163ACA2984B5539181F3EFF1A5E8903D71D5B95DA4F27202B77D2C44B430BB53741A8D59A8F86887525C9F2A6A5980A195EAA7F2FF910064301DEF89D3AA213E1FAC7768D89365318E370AF54A112EFBA9246D9158386BA1B4EEFDA", 16)
-	priv.Y, _ = new(big.Int).SetString("32969E5780CFE1C849A1C276D7AEB4F38A23B591739AA2FE197349AEEBD31366AEE5EB7E6C6DDB7C57D02432B30DB5AA66D9884299FAA72568944E4EEDC92EA3FBC6F39F53412FBCC563208F7C15B737AC8910DBC2D9C9B8C001E72FDC40EB694AB1F06A5A2DBD18D9E36C66F31F566742F11EC0A52E9F7B89355C02FB5D32D2", 16)
-	priv.X, _ = new(big.Int).SetString("5078D4D29795CBE76D3AACFE48C9AF0BCDBEE91A", 16)
-
-	testSignAndVerify(t, 0, &priv)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/ecdsa/ecdsa.go b/third_party/gofrontend/libgo/go/crypto/ecdsa/ecdsa.go
deleted file mode 100644
index 8d66477..0000000
--- a/third_party/gofrontend/libgo/go/crypto/ecdsa/ecdsa.go
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package ecdsa implements the Elliptic Curve Digital Signature Algorithm, as
-// defined in FIPS 186-3.
-//
-// This implementation  derives the nonce from an AES-CTR CSPRNG keyed by
-// ChopMD(256, SHA2-512(priv.D || entropy || hash)). The CSPRNG key is IRO by
-// a result of Coron; the AES-CTR stream is IRO under standard assumptions.
-package ecdsa
-
-// References:
-//   [NSA]: Suite B implementer's guide to FIPS 186-3,
-//     http://www.nsa.gov/ia/_files/ecdsa.pdf
-//   [SECG]: SECG, SEC1
-//     http://www.secg.org/sec1-v2.pdf
-
-import (
-	"crypto"
-	"crypto/aes"
-	"crypto/cipher"
-	"crypto/elliptic"
-	"crypto/sha512"
-	"encoding/asn1"
-	"io"
-	"math/big"
-)
-
-const (
-	aesIV = "IV for ECDSA CTR"
-)
-
-// PublicKey represents an ECDSA public key.
-type PublicKey struct {
-	elliptic.Curve
-	X, Y *big.Int
-}
-
-// PrivateKey represents a ECDSA private key.
-type PrivateKey struct {
-	PublicKey
-	D *big.Int
-}
-
-type ecdsaSignature struct {
-	R, S *big.Int
-}
-
-// Public returns the public key corresponding to priv.
-func (priv *PrivateKey) Public() crypto.PublicKey {
-	return &priv.PublicKey
-}
-
-// Sign signs msg with priv, reading randomness from rand. This method is
-// intended to support keys where the private part is kept in, for example, a
-// hardware module. Common uses should use the Sign function in this package
-// directly.
-func (priv *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ([]byte, error) {
-	r, s, err := Sign(rand, priv, msg)
-	if err != nil {
-		return nil, err
-	}
-
-	return asn1.Marshal(ecdsaSignature{r, s})
-}
-
-var one = new(big.Int).SetInt64(1)
-
-// randFieldElement returns a random element of the field underlying the given
-// curve using the procedure given in [NSA] A.2.1.
-func randFieldElement(c elliptic.Curve, rand io.Reader) (k *big.Int, err error) {
-	params := c.Params()
-	b := make([]byte, params.BitSize/8+8)
-	_, err = io.ReadFull(rand, b)
-	if err != nil {
-		return
-	}
-
-	k = new(big.Int).SetBytes(b)
-	n := new(big.Int).Sub(params.N, one)
-	k.Mod(k, n)
-	k.Add(k, one)
-	return
-}
-
-// GenerateKey generates a public and private key pair.
-func GenerateKey(c elliptic.Curve, rand io.Reader) (priv *PrivateKey, err error) {
-	k, err := randFieldElement(c, rand)
-	if err != nil {
-		return
-	}
-
-	priv = new(PrivateKey)
-	priv.PublicKey.Curve = c
-	priv.D = k
-	priv.PublicKey.X, priv.PublicKey.Y = c.ScalarBaseMult(k.Bytes())
-	return
-}
-
-// hashToInt converts a hash value to an integer. There is some disagreement
-// about how this is done. [NSA] suggests that this is done in the obvious
-// manner, but [SECG] truncates the hash to the bit-length of the curve order
-// first. We follow [SECG] because that's what OpenSSL does. Additionally,
-// OpenSSL right shifts excess bits from the number if the hash is too large
-// and we mirror that too.
-func hashToInt(hash []byte, c elliptic.Curve) *big.Int {
-	orderBits := c.Params().N.BitLen()
-	orderBytes := (orderBits + 7) / 8
-	if len(hash) > orderBytes {
-		hash = hash[:orderBytes]
-	}
-
-	ret := new(big.Int).SetBytes(hash)
-	excess := len(hash)*8 - orderBits
-	if excess > 0 {
-		ret.Rsh(ret, uint(excess))
-	}
-	return ret
-}
-
-// fermatInverse calculates the inverse of k in GF(P) using Fermat's method.
-// This has better constant-time properties than Euclid's method (implemented
-// in math/big.Int.ModInverse) although math/big itself isn't strictly
-// constant-time so it's not perfect.
-func fermatInverse(k, N *big.Int) *big.Int {
-	two := big.NewInt(2)
-	nMinus2 := new(big.Int).Sub(N, two)
-	return new(big.Int).Exp(k, nMinus2, N)
-}
-
-// Sign signs an arbitrary length hash (which should be the result of hashing a
-// larger message) using the private key, priv. It returns the signature as a
-// pair of integers. The security of the private key depends on the entropy of
-// rand.
-func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error) {
-	// Get max(log2(q) / 2, 256) bits of entropy from rand.
-	entropylen := (priv.Curve.Params().BitSize + 7) / 16
-	if entropylen > 32 {
-		entropylen = 32
-	}
-	entropy := make([]byte, entropylen)
-	_, err = io.ReadFull(rand, entropy)
-	if err != nil {
-		return
-	}
-
-	// Initialize an SHA-512 hash context; digest ...
-	md := sha512.New()
-	md.Write(priv.D.Bytes()) // the private key,
-	md.Write(entropy)        // the entropy,
-	md.Write(hash)           // and the input hash;
-	key := md.Sum(nil)[:32]  // and compute ChopMD-256(SHA-512),
-	// which is an indifferentiable MAC.
-
-	// Create an AES-CTR instance to use as a CSPRNG.
-	block, err := aes.NewCipher(key)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	// Create a CSPRNG that xors a stream of zeros with
-	// the output of the AES-CTR instance.
-	csprng := cipher.StreamReader{
-		R: zeroReader,
-		S: cipher.NewCTR(block, []byte(aesIV)),
-	}
-
-	// See [NSA] 3.4.1
-	c := priv.PublicKey.Curve
-	N := c.Params().N
-
-	var k, kInv *big.Int
-	for {
-		for {
-			k, err = randFieldElement(c, csprng)
-			if err != nil {
-				r = nil
-				return
-			}
-
-			kInv = fermatInverse(k, N)
-			r, _ = priv.Curve.ScalarBaseMult(k.Bytes())
-			r.Mod(r, N)
-			if r.Sign() != 0 {
-				break
-			}
-		}
-
-		e := hashToInt(hash, c)
-		s = new(big.Int).Mul(priv.D, r)
-		s.Add(s, e)
-		s.Mul(s, kInv)
-		s.Mod(s, N)
-		if s.Sign() != 0 {
-			break
-		}
-	}
-
-	return
-}
-
-// Verify verifies the signature in r, s of hash using the public key, pub. Its
-// return value records whether the signature is valid.
-func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool {
-	// See [NSA] 3.4.2
-	c := pub.Curve
-	N := c.Params().N
-
-	if r.Sign() == 0 || s.Sign() == 0 {
-		return false
-	}
-	if r.Cmp(N) >= 0 || s.Cmp(N) >= 0 {
-		return false
-	}
-	e := hashToInt(hash, c)
-	w := new(big.Int).ModInverse(s, N)
-
-	u1 := e.Mul(e, w)
-	u1.Mod(u1, N)
-	u2 := w.Mul(r, w)
-	u2.Mod(u2, N)
-
-	x1, y1 := c.ScalarBaseMult(u1.Bytes())
-	x2, y2 := c.ScalarMult(pub.X, pub.Y, u2.Bytes())
-	x, y := c.Add(x1, y1, x2, y2)
-	if x.Sign() == 0 && y.Sign() == 0 {
-		return false
-	}
-	x.Mod(x, N)
-	return x.Cmp(r) == 0
-}
-
-type zr struct {
-	io.Reader
-}
-
-// Read replaces the contents of dst with zeros.
-func (z *zr) Read(dst []byte) (n int, err error) {
-	for i := range dst {
-		dst[i] = 0
-	}
-	return len(dst), nil
-}
-
-var zeroReader = &zr{}
diff --git a/third_party/gofrontend/libgo/go/crypto/ecdsa/ecdsa_test.go b/third_party/gofrontend/libgo/go/crypto/ecdsa/ecdsa_test.go
deleted file mode 100644
index 169944d..0000000
--- a/third_party/gofrontend/libgo/go/crypto/ecdsa/ecdsa_test.go
+++ /dev/null
@@ -1,263 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ecdsa
-
-import (
-	"bufio"
-	"compress/bzip2"
-	"crypto/elliptic"
-	"crypto/rand"
-	"crypto/sha1"
-	"crypto/sha256"
-	"crypto/sha512"
-	"encoding/hex"
-	"hash"
-	"io"
-	"math/big"
-	"os"
-	"strings"
-	"testing"
-)
-
-func testKeyGeneration(t *testing.T, c elliptic.Curve, tag string) {
-	priv, err := GenerateKey(c, rand.Reader)
-	if err != nil {
-		t.Errorf("%s: error: %s", tag, err)
-		return
-	}
-	if !c.IsOnCurve(priv.PublicKey.X, priv.PublicKey.Y) {
-		t.Errorf("%s: public key invalid: %s", tag, err)
-	}
-}
-
-func TestKeyGeneration(t *testing.T) {
-	testKeyGeneration(t, elliptic.P224(), "p224")
-	if testing.Short() {
-		return
-	}
-	testKeyGeneration(t, elliptic.P256(), "p256")
-	testKeyGeneration(t, elliptic.P384(), "p384")
-	testKeyGeneration(t, elliptic.P521(), "p521")
-}
-
-func testSignAndVerify(t *testing.T, c elliptic.Curve, tag string) {
-	priv, _ := GenerateKey(c, rand.Reader)
-
-	hashed := []byte("testing")
-	r, s, err := Sign(rand.Reader, priv, hashed)
-	if err != nil {
-		t.Errorf("%s: error signing: %s", tag, err)
-		return
-	}
-
-	if !Verify(&priv.PublicKey, hashed, r, s) {
-		t.Errorf("%s: Verify failed", tag)
-	}
-
-	hashed[0] ^= 0xff
-	if Verify(&priv.PublicKey, hashed, r, s) {
-		t.Errorf("%s: Verify always works!", tag)
-	}
-}
-
-func TestSignAndVerify(t *testing.T) {
-	testSignAndVerify(t, elliptic.P224(), "p224")
-	if testing.Short() {
-		return
-	}
-	testSignAndVerify(t, elliptic.P256(), "p256")
-	testSignAndVerify(t, elliptic.P384(), "p384")
-	testSignAndVerify(t, elliptic.P521(), "p521")
-}
-
-func testNonceSafety(t *testing.T, c elliptic.Curve, tag string) {
-	priv, _ := GenerateKey(c, rand.Reader)
-
-	hashed := []byte("testing")
-	r0, s0, err := Sign(zeroReader, priv, hashed)
-	if err != nil {
-		t.Errorf("%s: error signing: %s", tag, err)
-		return
-	}
-
-	hashed = []byte("testing...")
-	r1, s1, err := Sign(zeroReader, priv, hashed)
-	if err != nil {
-		t.Errorf("%s: error signing: %s", tag, err)
-		return
-	}
-
-	if s0.Cmp(s1) == 0 {
-		// This should never happen.
-		t.Errorf("%s: the signatures on two different messages were the same")
-	}
-
-	if r0.Cmp(r1) == 0 {
-		t.Errorf("%s: the nonce used for two diferent messages was the same")
-	}
-}
-
-func TestNonceSafety(t *testing.T) {
-	testNonceSafety(t, elliptic.P224(), "p224")
-	if testing.Short() {
-		return
-	}
-	testNonceSafety(t, elliptic.P256(), "p256")
-	testNonceSafety(t, elliptic.P384(), "p384")
-	testNonceSafety(t, elliptic.P521(), "p521")
-}
-
-func testINDCCA(t *testing.T, c elliptic.Curve, tag string) {
-	priv, _ := GenerateKey(c, rand.Reader)
-
-	hashed := []byte("testing")
-	r0, s0, err := Sign(rand.Reader, priv, hashed)
-	if err != nil {
-		t.Errorf("%s: error signing: %s", tag, err)
-		return
-	}
-
-	r1, s1, err := Sign(rand.Reader, priv, hashed)
-	if err != nil {
-		t.Errorf("%s: error signing: %s", tag, err)
-		return
-	}
-
-	if s0.Cmp(s1) == 0 {
-		t.Errorf("%s: two signatures of the same message produced the same result")
-	}
-
-	if r0.Cmp(r1) == 0 {
-		t.Errorf("%s: two signatures of the same message produced the same nonce")
-	}
-}
-
-func TestINDCCA(t *testing.T) {
-	testINDCCA(t, elliptic.P224(), "p224")
-	if testing.Short() {
-		return
-	}
-	testINDCCA(t, elliptic.P256(), "p256")
-	testINDCCA(t, elliptic.P384(), "p384")
-	testINDCCA(t, elliptic.P521(), "p521")
-}
-
-func fromHex(s string) *big.Int {
-	r, ok := new(big.Int).SetString(s, 16)
-	if !ok {
-		panic("bad hex")
-	}
-	return r
-}
-
-func TestVectors(t *testing.T) {
-	// This test runs the full set of NIST test vectors from
-	// http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip
-	//
-	// The SigVer.rsp file has been edited to remove test vectors for
-	// unsupported algorithms and has been compressed.
-
-	if testing.Short() {
-		return
-	}
-
-	f, err := os.Open("testdata/SigVer.rsp.bz2")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	buf := bufio.NewReader(bzip2.NewReader(f))
-
-	lineNo := 1
-	var h hash.Hash
-	var msg []byte
-	var hashed []byte
-	var r, s *big.Int
-	pub := new(PublicKey)
-
-	for {
-		line, err := buf.ReadString('\n')
-		if len(line) == 0 {
-			if err == io.EOF {
-				break
-			}
-			t.Fatalf("error reading from input: %s", err)
-		}
-		lineNo++
-		// Need to remove \r\n from the end of the line.
-		if !strings.HasSuffix(line, "\r\n") {
-			t.Fatalf("bad line ending (expected \\r\\n) on line %d", lineNo)
-		}
-		line = line[:len(line)-2]
-
-		if len(line) == 0 || line[0] == '#' {
-			continue
-		}
-
-		if line[0] == '[' {
-			line = line[1 : len(line)-1]
-			parts := strings.SplitN(line, ",", 2)
-
-			switch parts[0] {
-			case "P-224":
-				pub.Curve = elliptic.P224()
-			case "P-256":
-				pub.Curve = elliptic.P256()
-			case "P-384":
-				pub.Curve = elliptic.P384()
-			case "P-521":
-				pub.Curve = elliptic.P521()
-			default:
-				pub.Curve = nil
-			}
-
-			switch parts[1] {
-			case "SHA-1":
-				h = sha1.New()
-			case "SHA-224":
-				h = sha256.New224()
-			case "SHA-256":
-				h = sha256.New()
-			case "SHA-384":
-				h = sha512.New384()
-			case "SHA-512":
-				h = sha512.New()
-			default:
-				h = nil
-			}
-
-			continue
-		}
-
-		if h == nil || pub.Curve == nil {
-			continue
-		}
-
-		switch {
-		case strings.HasPrefix(line, "Msg = "):
-			if msg, err = hex.DecodeString(line[6:]); err != nil {
-				t.Fatalf("failed to decode message on line %d: %s", lineNo, err)
-			}
-		case strings.HasPrefix(line, "Qx = "):
-			pub.X = fromHex(line[5:])
-		case strings.HasPrefix(line, "Qy = "):
-			pub.Y = fromHex(line[5:])
-		case strings.HasPrefix(line, "R = "):
-			r = fromHex(line[4:])
-		case strings.HasPrefix(line, "S = "):
-			s = fromHex(line[4:])
-		case strings.HasPrefix(line, "Result = "):
-			expected := line[9] == 'P'
-			h.Reset()
-			h.Write(msg)
-			hashed := h.Sum(hashed[:0])
-			if Verify(pub, hashed, r, s) != expected {
-				t.Fatalf("incorrect result on line %d", lineNo)
-			}
-		default:
-			t.Fatalf("unknown variable on line %d: %s", lineNo, line)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/elliptic/elliptic.go b/third_party/gofrontend/libgo/go/crypto/elliptic/elliptic.go
deleted file mode 100644
index e6b59c5..0000000
--- a/third_party/gofrontend/libgo/go/crypto/elliptic/elliptic.go
+++ /dev/null
@@ -1,378 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package elliptic implements several standard elliptic curves over prime
-// fields.
-package elliptic
-
-// This package operates, internally, on Jacobian coordinates. For a given
-// (x, y) position on the curve, the Jacobian coordinates are (x1, y1, z1)
-// where x = x1/z1² and y = y1/z1³. The greatest speedups come when the whole
-// calculation can be performed within the transform (as in ScalarMult and
-// ScalarBaseMult). But even for Add and Double, it's faster to apply and
-// reverse the transform than to operate in affine coordinates.
-
-import (
-	"io"
-	"math/big"
-	"sync"
-)
-
-// A Curve represents a short-form Weierstrass curve with a=-3.
-// See http://www.hyperelliptic.org/EFD/g1p/auto-shortw.html
-type Curve interface {
-	// Params returns the parameters for the curve.
-	Params() *CurveParams
-	// IsOnCurve reports whether the given (x,y) lies on the curve.
-	IsOnCurve(x, y *big.Int) bool
-	// Add returns the sum of (x1,y1) and (x2,y2)
-	Add(x1, y1, x2, y2 *big.Int) (x, y *big.Int)
-	// Double returns 2*(x,y)
-	Double(x1, y1 *big.Int) (x, y *big.Int)
-	// ScalarMult returns k*(Bx,By) where k is a number in big-endian form.
-	ScalarMult(x1, y1 *big.Int, k []byte) (x, y *big.Int)
-	// ScalarBaseMult returns k*G, where G is the base point of the group
-	// and k is an integer in big-endian form.
-	ScalarBaseMult(k []byte) (x, y *big.Int)
-}
-
-// CurveParams contains the parameters of an elliptic curve and also provides
-// a generic, non-constant time implementation of Curve.
-type CurveParams struct {
-	P       *big.Int // the order of the underlying field
-	N       *big.Int // the order of the base point
-	B       *big.Int // the constant of the curve equation
-	Gx, Gy  *big.Int // (x,y) of the base point
-	BitSize int      // the size of the underlying field
-	Name    string   // the canonical name of the curve
-}
-
-func (curve *CurveParams) Params() *CurveParams {
-	return curve
-}
-
-func (curve *CurveParams) IsOnCurve(x, y *big.Int) bool {
-	// y² = x³ - 3x + b
-	y2 := new(big.Int).Mul(y, y)
-	y2.Mod(y2, curve.P)
-
-	x3 := new(big.Int).Mul(x, x)
-	x3.Mul(x3, x)
-
-	threeX := new(big.Int).Lsh(x, 1)
-	threeX.Add(threeX, x)
-
-	x3.Sub(x3, threeX)
-	x3.Add(x3, curve.B)
-	x3.Mod(x3, curve.P)
-
-	return x3.Cmp(y2) == 0
-}
-
-// zForAffine returns a Jacobian Z value for the affine point (x, y). If x and
-// y are zero, it assumes that they represent the point at infinity because (0,
-// 0) is not on the any of the curves handled here.
-func zForAffine(x, y *big.Int) *big.Int {
-	z := new(big.Int)
-	if x.Sign() != 0 || y.Sign() != 0 {
-		z.SetInt64(1)
-	}
-	return z
-}
-
-// affineFromJacobian reverses the Jacobian transform. See the comment at the
-// top of the file. If the point is ∞ it returns 0, 0.
-func (curve *CurveParams) affineFromJacobian(x, y, z *big.Int) (xOut, yOut *big.Int) {
-	if z.Sign() == 0 {
-		return new(big.Int), new(big.Int)
-	}
-
-	zinv := new(big.Int).ModInverse(z, curve.P)
-	zinvsq := new(big.Int).Mul(zinv, zinv)
-
-	xOut = new(big.Int).Mul(x, zinvsq)
-	xOut.Mod(xOut, curve.P)
-	zinvsq.Mul(zinvsq, zinv)
-	yOut = new(big.Int).Mul(y, zinvsq)
-	yOut.Mod(yOut, curve.P)
-	return
-}
-
-func (curve *CurveParams) Add(x1, y1, x2, y2 *big.Int) (*big.Int, *big.Int) {
-	z1 := zForAffine(x1, y1)
-	z2 := zForAffine(x2, y2)
-	return curve.affineFromJacobian(curve.addJacobian(x1, y1, z1, x2, y2, z2))
-}
-
-// addJacobian takes two points in Jacobian coordinates, (x1, y1, z1) and
-// (x2, y2, z2) and returns their sum, also in Jacobian form.
-func (curve *CurveParams) addJacobian(x1, y1, z1, x2, y2, z2 *big.Int) (*big.Int, *big.Int, *big.Int) {
-	// See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-add-2007-bl
-	x3, y3, z3 := new(big.Int), new(big.Int), new(big.Int)
-	if z1.Sign() == 0 {
-		x3.Set(x2)
-		y3.Set(y2)
-		z3.Set(z2)
-		return x3, y3, z3
-	}
-	if z2.Sign() == 0 {
-		x3.Set(x1)
-		y3.Set(y1)
-		z3.Set(z1)
-		return x3, y3, z3
-	}
-
-	z1z1 := new(big.Int).Mul(z1, z1)
-	z1z1.Mod(z1z1, curve.P)
-	z2z2 := new(big.Int).Mul(z2, z2)
-	z2z2.Mod(z2z2, curve.P)
-
-	u1 := new(big.Int).Mul(x1, z2z2)
-	u1.Mod(u1, curve.P)
-	u2 := new(big.Int).Mul(x2, z1z1)
-	u2.Mod(u2, curve.P)
-	h := new(big.Int).Sub(u2, u1)
-	xEqual := h.Sign() == 0
-	if h.Sign() == -1 {
-		h.Add(h, curve.P)
-	}
-	i := new(big.Int).Lsh(h, 1)
-	i.Mul(i, i)
-	j := new(big.Int).Mul(h, i)
-
-	s1 := new(big.Int).Mul(y1, z2)
-	s1.Mul(s1, z2z2)
-	s1.Mod(s1, curve.P)
-	s2 := new(big.Int).Mul(y2, z1)
-	s2.Mul(s2, z1z1)
-	s2.Mod(s2, curve.P)
-	r := new(big.Int).Sub(s2, s1)
-	if r.Sign() == -1 {
-		r.Add(r, curve.P)
-	}
-	yEqual := r.Sign() == 0
-	if xEqual && yEqual {
-		return curve.doubleJacobian(x1, y1, z1)
-	}
-	r.Lsh(r, 1)
-	v := new(big.Int).Mul(u1, i)
-
-	x3.Set(r)
-	x3.Mul(x3, x3)
-	x3.Sub(x3, j)
-	x3.Sub(x3, v)
-	x3.Sub(x3, v)
-	x3.Mod(x3, curve.P)
-
-	y3.Set(r)
-	v.Sub(v, x3)
-	y3.Mul(y3, v)
-	s1.Mul(s1, j)
-	s1.Lsh(s1, 1)
-	y3.Sub(y3, s1)
-	y3.Mod(y3, curve.P)
-
-	z3.Add(z1, z2)
-	z3.Mul(z3, z3)
-	z3.Sub(z3, z1z1)
-	z3.Sub(z3, z2z2)
-	z3.Mul(z3, h)
-	z3.Mod(z3, curve.P)
-
-	return x3, y3, z3
-}
-
-func (curve *CurveParams) Double(x1, y1 *big.Int) (*big.Int, *big.Int) {
-	z1 := zForAffine(x1, y1)
-	return curve.affineFromJacobian(curve.doubleJacobian(x1, y1, z1))
-}
-
-// doubleJacobian takes a point in Jacobian coordinates, (x, y, z), and
-// returns its double, also in Jacobian form.
-func (curve *CurveParams) doubleJacobian(x, y, z *big.Int) (*big.Int, *big.Int, *big.Int) {
-	// See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b
-	delta := new(big.Int).Mul(z, z)
-	delta.Mod(delta, curve.P)
-	gamma := new(big.Int).Mul(y, y)
-	gamma.Mod(gamma, curve.P)
-	alpha := new(big.Int).Sub(x, delta)
-	if alpha.Sign() == -1 {
-		alpha.Add(alpha, curve.P)
-	}
-	alpha2 := new(big.Int).Add(x, delta)
-	alpha.Mul(alpha, alpha2)
-	alpha2.Set(alpha)
-	alpha.Lsh(alpha, 1)
-	alpha.Add(alpha, alpha2)
-
-	beta := alpha2.Mul(x, gamma)
-
-	x3 := new(big.Int).Mul(alpha, alpha)
-	beta8 := new(big.Int).Lsh(beta, 3)
-	x3.Sub(x3, beta8)
-	for x3.Sign() == -1 {
-		x3.Add(x3, curve.P)
-	}
-	x3.Mod(x3, curve.P)
-
-	z3 := new(big.Int).Add(y, z)
-	z3.Mul(z3, z3)
-	z3.Sub(z3, gamma)
-	if z3.Sign() == -1 {
-		z3.Add(z3, curve.P)
-	}
-	z3.Sub(z3, delta)
-	if z3.Sign() == -1 {
-		z3.Add(z3, curve.P)
-	}
-	z3.Mod(z3, curve.P)
-
-	beta.Lsh(beta, 2)
-	beta.Sub(beta, x3)
-	if beta.Sign() == -1 {
-		beta.Add(beta, curve.P)
-	}
-	y3 := alpha.Mul(alpha, beta)
-
-	gamma.Mul(gamma, gamma)
-	gamma.Lsh(gamma, 3)
-	gamma.Mod(gamma, curve.P)
-
-	y3.Sub(y3, gamma)
-	if y3.Sign() == -1 {
-		y3.Add(y3, curve.P)
-	}
-	y3.Mod(y3, curve.P)
-
-	return x3, y3, z3
-}
-
-func (curve *CurveParams) ScalarMult(Bx, By *big.Int, k []byte) (*big.Int, *big.Int) {
-	Bz := new(big.Int).SetInt64(1)
-	x, y, z := new(big.Int), new(big.Int), new(big.Int)
-
-	for _, byte := range k {
-		for bitNum := 0; bitNum < 8; bitNum++ {
-			x, y, z = curve.doubleJacobian(x, y, z)
-			if byte&0x80 == 0x80 {
-				x, y, z = curve.addJacobian(Bx, By, Bz, x, y, z)
-			}
-			byte <<= 1
-		}
-	}
-
-	return curve.affineFromJacobian(x, y, z)
-}
-
-func (curve *CurveParams) ScalarBaseMult(k []byte) (*big.Int, *big.Int) {
-	return curve.ScalarMult(curve.Gx, curve.Gy, k)
-}
-
-var mask = []byte{0xff, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f}
-
-// GenerateKey returns a public/private key pair. The private key is
-// generated using the given reader, which must return random data.
-func GenerateKey(curve Curve, rand io.Reader) (priv []byte, x, y *big.Int, err error) {
-	bitSize := curve.Params().BitSize
-	byteLen := (bitSize + 7) >> 3
-	priv = make([]byte, byteLen)
-
-	for x == nil {
-		_, err = io.ReadFull(rand, priv)
-		if err != nil {
-			return
-		}
-		// We have to mask off any excess bits in the case that the size of the
-		// underlying field is not a whole number of bytes.
-		priv[0] &= mask[bitSize%8]
-		// This is because, in tests, rand will return all zeros and we don't
-		// want to get the point at infinity and loop forever.
-		priv[1] ^= 0x42
-		x, y = curve.ScalarBaseMult(priv)
-	}
-	return
-}
-
-// Marshal converts a point into the form specified in section 4.3.6 of ANSI X9.62.
-func Marshal(curve Curve, x, y *big.Int) []byte {
-	byteLen := (curve.Params().BitSize + 7) >> 3
-
-	ret := make([]byte, 1+2*byteLen)
-	ret[0] = 4 // uncompressed point
-
-	xBytes := x.Bytes()
-	copy(ret[1+byteLen-len(xBytes):], xBytes)
-	yBytes := y.Bytes()
-	copy(ret[1+2*byteLen-len(yBytes):], yBytes)
-	return ret
-}
-
-// Unmarshal converts a point, serialized by Marshal, into an x, y pair.
-// It is an error if the point is not on the curve. On error, x = nil.
-func Unmarshal(curve Curve, data []byte) (x, y *big.Int) {
-	byteLen := (curve.Params().BitSize + 7) >> 3
-	if len(data) != 1+2*byteLen {
-		return
-	}
-	if data[0] != 4 { // uncompressed form
-		return
-	}
-	x = new(big.Int).SetBytes(data[1 : 1+byteLen])
-	y = new(big.Int).SetBytes(data[1+byteLen:])
-	if !curve.IsOnCurve(x, y) {
-		x, y = nil, nil
-	}
-	return
-}
-
-var initonce sync.Once
-var p384 *CurveParams
-var p521 *CurveParams
-
-func initAll() {
-	initP224()
-	initP256()
-	initP384()
-	initP521()
-}
-
-func initP384() {
-	// See FIPS 186-3, section D.2.4
-	p384 = &CurveParams{Name: "P-384"}
-	p384.P, _ = new(big.Int).SetString("39402006196394479212279040100143613805079739270465446667948293404245721771496870329047266088258938001861606973112319", 10)
-	p384.N, _ = new(big.Int).SetString("39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942643", 10)
-	p384.B, _ = new(big.Int).SetString("b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef", 16)
-	p384.Gx, _ = new(big.Int).SetString("aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", 16)
-	p384.Gy, _ = new(big.Int).SetString("3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f", 16)
-	p384.BitSize = 384
-}
-
-func initP521() {
-	// See FIPS 186-3, section D.2.5
-	p521 = &CurveParams{Name: "P-521"}
-	p521.P, _ = new(big.Int).SetString("6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151", 10)
-	p521.N, _ = new(big.Int).SetString("6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005449", 10)
-	p521.B, _ = new(big.Int).SetString("051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00", 16)
-	p521.Gx, _ = new(big.Int).SetString("c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66", 16)
-	p521.Gy, _ = new(big.Int).SetString("11839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650", 16)
-	p521.BitSize = 521
-}
-
-// P256 returns a Curve which implements P-256 (see FIPS 186-3, section D.2.3)
-func P256() Curve {
-	initonce.Do(initAll)
-	return p256
-}
-
-// P384 returns a Curve which implements P-384 (see FIPS 186-3, section D.2.4)
-func P384() Curve {
-	initonce.Do(initAll)
-	return p384
-}
-
-// P521 returns a Curve which implements P-521 (see FIPS 186-3, section D.2.5)
-func P521() Curve {
-	initonce.Do(initAll)
-	return p521
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/elliptic/elliptic_test.go b/third_party/gofrontend/libgo/go/crypto/elliptic/elliptic_test.go
deleted file mode 100644
index 7e27913..0000000
--- a/third_party/gofrontend/libgo/go/crypto/elliptic/elliptic_test.go
+++ /dev/null
@@ -1,471 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package elliptic
-
-import (
-	"crypto/rand"
-	"encoding/hex"
-	"fmt"
-	"math/big"
-	"testing"
-)
-
-func TestOnCurve(t *testing.T) {
-	p224 := P224()
-	if !p224.IsOnCurve(p224.Params().Gx, p224.Params().Gy) {
-		t.Errorf("FAIL")
-	}
-}
-
-func TestOffCurve(t *testing.T) {
-	p224 := P224()
-	x, y := new(big.Int).SetInt64(1), new(big.Int).SetInt64(1)
-	if p224.IsOnCurve(x, y) {
-		t.Errorf("FAIL: point off curve is claimed to be on the curve")
-	}
-	b := Marshal(p224, x, y)
-	x1, y1 := Unmarshal(p224, b)
-	if x1 != nil || y1 != nil {
-		t.Errorf("FAIL: unmarshalling a point not on the curve succeeded")
-	}
-}
-
-type baseMultTest struct {
-	k    string
-	x, y string
-}
-
-var p224BaseMultTests = []baseMultTest{
-	{
-		"1",
-		"b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21",
-		"bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34",
-	},
-	{
-		"2",
-		"706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6",
-		"1c2b76a7bc25e7702a704fa986892849fca629487acf3709d2e4e8bb",
-	},
-	{
-		"3",
-		"df1b1d66a551d0d31eff822558b9d2cc75c2180279fe0d08fd896d04",
-		"a3f7f03cadd0be444c0aa56830130ddf77d317344e1af3591981a925",
-	},
-	{
-		"4",
-		"ae99feebb5d26945b54892092a8aee02912930fa41cd114e40447301",
-		"482580a0ec5bc47e88bc8c378632cd196cb3fa058a7114eb03054c9",
-	},
-	{
-		"5",
-		"31c49ae75bce7807cdff22055d94ee9021fedbb5ab51c57526f011aa",
-		"27e8bff1745635ec5ba0c9f1c2ede15414c6507d29ffe37e790a079b",
-	},
-	{
-		"6",
-		"1f2483f82572251fca975fea40db821df8ad82a3c002ee6c57112408",
-		"89faf0ccb750d99b553c574fad7ecfb0438586eb3952af5b4b153c7e",
-	},
-	{
-		"7",
-		"db2f6be630e246a5cf7d99b85194b123d487e2d466b94b24a03c3e28",
-		"f3a30085497f2f611ee2517b163ef8c53b715d18bb4e4808d02b963",
-	},
-	{
-		"8",
-		"858e6f9cc6c12c31f5df124aa77767b05c8bc021bd683d2b55571550",
-		"46dcd3ea5c43898c5c5fc4fdac7db39c2f02ebee4e3541d1e78047a",
-	},
-	{
-		"9",
-		"2fdcccfee720a77ef6cb3bfbb447f9383117e3daa4a07e36ed15f78d",
-		"371732e4f41bf4f7883035e6a79fcedc0e196eb07b48171697517463",
-	},
-	{
-		"10",
-		"aea9e17a306517eb89152aa7096d2c381ec813c51aa880e7bee2c0fd",
-		"39bb30eab337e0a521b6cba1abe4b2b3a3e524c14a3fe3eb116b655f",
-	},
-	{
-		"11",
-		"ef53b6294aca431f0f3c22dc82eb9050324f1d88d377e716448e507c",
-		"20b510004092e96636cfb7e32efded8265c266dfb754fa6d6491a6da",
-	},
-	{
-		"12",
-		"6e31ee1dc137f81b056752e4deab1443a481033e9b4c93a3044f4f7a",
-		"207dddf0385bfdeab6e9acda8da06b3bbef224a93ab1e9e036109d13",
-	},
-	{
-		"13",
-		"34e8e17a430e43289793c383fac9774247b40e9ebd3366981fcfaeca",
-		"252819f71c7fb7fbcb159be337d37d3336d7feb963724fdfb0ecb767",
-	},
-	{
-		"14",
-		"a53640c83dc208603ded83e4ecf758f24c357d7cf48088b2ce01e9fa",
-		"d5814cd724199c4a5b974a43685fbf5b8bac69459c9469bc8f23ccaf",
-	},
-	{
-		"15",
-		"baa4d8635511a7d288aebeedd12ce529ff102c91f97f867e21916bf9",
-		"979a5f4759f80f4fb4ec2e34f5566d595680a11735e7b61046127989",
-	},
-	{
-		"16",
-		"b6ec4fe1777382404ef679997ba8d1cc5cd8e85349259f590c4c66d",
-		"3399d464345906b11b00e363ef429221f2ec720d2f665d7dead5b482",
-	},
-	{
-		"17",
-		"b8357c3a6ceef288310e17b8bfeff9200846ca8c1942497c484403bc",
-		"ff149efa6606a6bd20ef7d1b06bd92f6904639dce5174db6cc554a26",
-	},
-	{
-		"18",
-		"c9ff61b040874c0568479216824a15eab1a838a797d189746226e4cc",
-		"ea98d60e5ffc9b8fcf999fab1df7e7ef7084f20ddb61bb045a6ce002",
-	},
-	{
-		"19",
-		"a1e81c04f30ce201c7c9ace785ed44cc33b455a022f2acdbc6cae83c",
-		"dcf1f6c3db09c70acc25391d492fe25b4a180babd6cea356c04719cd",
-	},
-	{
-		"20",
-		"fcc7f2b45df1cd5a3c0c0731ca47a8af75cfb0347e8354eefe782455",
-		"d5d7110274cba7cdee90e1a8b0d394c376a5573db6be0bf2747f530",
-	},
-	{
-		"112233445566778899",
-		"61f077c6f62ed802dad7c2f38f5c67f2cc453601e61bd076bb46179e",
-		"2272f9e9f5933e70388ee652513443b5e289dd135dcc0d0299b225e4",
-	},
-	{
-		"112233445566778899112233445566778899",
-		"29895f0af496bfc62b6ef8d8a65c88c613949b03668aab4f0429e35",
-		"3ea6e53f9a841f2019ec24bde1a75677aa9b5902e61081c01064de93",
-	},
-	{
-		"6950511619965839450988900688150712778015737983940691968051900319680",
-		"ab689930bcae4a4aa5f5cb085e823e8ae30fd365eb1da4aba9cf0379",
-		"3345a121bbd233548af0d210654eb40bab788a03666419be6fbd34e7",
-	},
-	{
-		"13479972933410060327035789020509431695094902435494295338570602119423",
-		"bdb6a8817c1f89da1c2f3dd8e97feb4494f2ed302a4ce2bc7f5f4025",
-		"4c7020d57c00411889462d77a5438bb4e97d177700bf7243a07f1680",
-	},
-	{
-		"13479971751745682581351455311314208093898607229429740618390390702079",
-		"d58b61aa41c32dd5eba462647dba75c5d67c83606c0af2bd928446a9",
-		"d24ba6a837be0460dd107ae77725696d211446c5609b4595976b16bd",
-	},
-	{
-		"13479972931865328106486971546324465392952975980343228160962702868479",
-		"dc9fa77978a005510980e929a1485f63716df695d7a0c18bb518df03",
-		"ede2b016f2ddffc2a8c015b134928275ce09e5661b7ab14ce0d1d403",
-	},
-	{
-		"11795773708834916026404142434151065506931607341523388140225443265536",
-		"499d8b2829cfb879c901f7d85d357045edab55028824d0f05ba279ba",
-		"bf929537b06e4015919639d94f57838fa33fc3d952598dcdbb44d638",
-	},
-	{
-		"784254593043826236572847595991346435467177662189391577090",
-		"8246c999137186632c5f9eddf3b1b0e1764c5e8bd0e0d8a554b9cb77",
-		"e80ed8660bc1cb17ac7d845be40a7a022d3306f116ae9f81fea65947",
-	},
-	{
-		"13479767645505654746623887797783387853576174193480695826442858012671",
-		"6670c20afcceaea672c97f75e2e9dd5c8460e54bb38538ebb4bd30eb",
-		"f280d8008d07a4caf54271f993527d46ff3ff46fd1190a3f1faa4f74",
-	},
-	{
-		"205688069665150753842126177372015544874550518966168735589597183",
-		"eca934247425cfd949b795cb5ce1eff401550386e28d1a4c5a8eb",
-		"d4c01040dba19628931bc8855370317c722cbd9ca6156985f1c2e9ce",
-	},
-	{
-		"13479966930919337728895168462090683249159702977113823384618282123295",
-		"ef353bf5c73cd551b96d596fbc9a67f16d61dd9fe56af19de1fba9cd",
-		"21771b9cdce3e8430c09b3838be70b48c21e15bc09ee1f2d7945b91f",
-	},
-	{
-		"50210731791415612487756441341851895584393717453129007497216",
-		"4036052a3091eb481046ad3289c95d3ac905ca0023de2c03ecd451cf",
-		"d768165a38a2b96f812586a9d59d4136035d9c853a5bf2e1c86a4993",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368041",
-		"fcc7f2b45df1cd5a3c0c0731ca47a8af75cfb0347e8354eefe782455",
-		"f2a28eefd8b345832116f1e574f2c6b2c895aa8c24941f40d8b80ad1",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368042",
-		"a1e81c04f30ce201c7c9ace785ed44cc33b455a022f2acdbc6cae83c",
-		"230e093c24f638f533dac6e2b6d01da3b5e7f45429315ca93fb8e634",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368043",
-		"c9ff61b040874c0568479216824a15eab1a838a797d189746226e4cc",
-		"156729f1a003647030666054e208180f8f7b0df2249e44fba5931fff",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368044",
-		"b8357c3a6ceef288310e17b8bfeff9200846ca8c1942497c484403bc",
-		"eb610599f95942df1082e4f9426d086fb9c6231ae8b24933aab5db",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368045",
-		"b6ec4fe1777382404ef679997ba8d1cc5cd8e85349259f590c4c66d",
-		"cc662b9bcba6f94ee4ff1c9c10bd6ddd0d138df2d099a282152a4b7f",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368046",
-		"baa4d8635511a7d288aebeedd12ce529ff102c91f97f867e21916bf9",
-		"6865a0b8a607f0b04b13d1cb0aa992a5a97f5ee8ca1849efb9ed8678",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368047",
-		"a53640c83dc208603ded83e4ecf758f24c357d7cf48088b2ce01e9fa",
-		"2a7eb328dbe663b5a468b5bc97a040a3745396ba636b964370dc3352",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368048",
-		"34e8e17a430e43289793c383fac9774247b40e9ebd3366981fcfaeca",
-		"dad7e608e380480434ea641cc82c82cbc92801469c8db0204f13489a",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368049",
-		"6e31ee1dc137f81b056752e4deab1443a481033e9b4c93a3044f4f7a",
-		"df82220fc7a4021549165325725f94c3410ddb56c54e161fc9ef62ee",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368050",
-		"ef53b6294aca431f0f3c22dc82eb9050324f1d88d377e716448e507c",
-		"df4aefffbf6d1699c930481cd102127c9a3d992048ab05929b6e5927",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368051",
-		"aea9e17a306517eb89152aa7096d2c381ec813c51aa880e7bee2c0fd",
-		"c644cf154cc81f5ade49345e541b4d4b5c1adb3eb5c01c14ee949aa2",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368052",
-		"2fdcccfee720a77ef6cb3bfbb447f9383117e3daa4a07e36ed15f78d",
-		"c8e8cd1b0be40b0877cfca1958603122f1e6914f84b7e8e968ae8b9e",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368053",
-		"858e6f9cc6c12c31f5df124aa77767b05c8bc021bd683d2b55571550",
-		"fb9232c15a3bc7673a3a03b0253824c53d0fd1411b1cabe2e187fb87",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368054",
-		"db2f6be630e246a5cf7d99b85194b123d487e2d466b94b24a03c3e28",
-		"f0c5cff7ab680d09ee11dae84e9c1072ac48ea2e744b1b7f72fd469e",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368055",
-		"1f2483f82572251fca975fea40db821df8ad82a3c002ee6c57112408",
-		"76050f3348af2664aac3a8b05281304ebc7a7914c6ad50a4b4eac383",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368056",
-		"31c49ae75bce7807cdff22055d94ee9021fedbb5ab51c57526f011aa",
-		"d817400e8ba9ca13a45f360e3d121eaaeb39af82d6001c8186f5f866",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368057",
-		"ae99feebb5d26945b54892092a8aee02912930fa41cd114e40447301",
-		"fb7da7f5f13a43b81774373c879cd32d6934c05fa758eeb14fcfab38",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368058",
-		"df1b1d66a551d0d31eff822558b9d2cc75c2180279fe0d08fd896d04",
-		"5c080fc3522f41bbb3f55a97cfecf21f882ce8cbb1e50ca6e67e56dc",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368059",
-		"706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6",
-		"e3d4895843da188fd58fb0567976d7b50359d6b78530c8f62d1b1746",
-	},
-	{
-		"26959946667150639794667015087019625940457807714424391721682722368060",
-		"b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21",
-		"42c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd",
-	},
-}
-
-func TestBaseMult(t *testing.T) {
-	p224 := P224()
-	for i, e := range p224BaseMultTests {
-		k, ok := new(big.Int).SetString(e.k, 10)
-		if !ok {
-			t.Errorf("%d: bad value for k: %s", i, e.k)
-		}
-		x, y := p224.ScalarBaseMult(k.Bytes())
-		if fmt.Sprintf("%x", x) != e.x || fmt.Sprintf("%x", y) != e.y {
-			t.Errorf("%d: bad output for k=%s: got (%x, %x), want (%s, %s)", i, e.k, x, y, e.x, e.y)
-		}
-		if testing.Short() && i > 5 {
-			break
-		}
-	}
-}
-
-func TestGenericBaseMult(t *testing.T) {
-	// We use the P224 CurveParams directly in order to test the generic implementation.
-	p224 := P224().Params()
-	for i, e := range p224BaseMultTests {
-		k, ok := new(big.Int).SetString(e.k, 10)
-		if !ok {
-			t.Errorf("%d: bad value for k: %s", i, e.k)
-		}
-		x, y := p224.ScalarBaseMult(k.Bytes())
-		if fmt.Sprintf("%x", x) != e.x || fmt.Sprintf("%x", y) != e.y {
-			t.Errorf("%d: bad output for k=%s: got (%x, %x), want (%s, %s)", i, e.k, x, y, e.x, e.y)
-		}
-		if testing.Short() && i > 5 {
-			break
-		}
-	}
-}
-
-func TestP256BaseMult(t *testing.T) {
-	p256 := P256()
-	p256Generic := p256.Params()
-
-	scalars := make([]*big.Int, 0, len(p224BaseMultTests)+1)
-	for _, e := range p224BaseMultTests {
-		k, _ := new(big.Int).SetString(e.k, 10)
-		scalars = append(scalars, k)
-	}
-	k := new(big.Int).SetInt64(1)
-	k.Lsh(k, 500)
-	scalars = append(scalars, k)
-
-	for i, k := range scalars {
-		x, y := p256.ScalarBaseMult(k.Bytes())
-		x2, y2 := p256Generic.ScalarBaseMult(k.Bytes())
-		if x.Cmp(x2) != 0 || y.Cmp(y2) != 0 {
-			t.Errorf("#%d: got (%x, %x), want (%x, %x)", i, x, y, x2, y2)
-		}
-
-		if testing.Short() && i > 5 {
-			break
-		}
-	}
-}
-
-func TestP256Mult(t *testing.T) {
-	p256 := P256()
-	p256Generic := p256.Params()
-
-	for i, e := range p224BaseMultTests {
-		x, _ := new(big.Int).SetString(e.x, 16)
-		y, _ := new(big.Int).SetString(e.y, 16)
-		k, _ := new(big.Int).SetString(e.k, 10)
-
-		xx, yy := p256.ScalarMult(x, y, k.Bytes())
-		xx2, yy2 := p256Generic.ScalarMult(x, y, k.Bytes())
-		if xx.Cmp(xx2) != 0 || yy.Cmp(yy2) != 0 {
-			t.Errorf("#%d: got (%x, %x), want (%x, %x)", i, xx, yy, xx2, yy2)
-		}
-		if testing.Short() && i > 5 {
-			break
-		}
-	}
-}
-
-func TestInfinity(t *testing.T) {
-	tests := []struct {
-		name  string
-		curve Curve
-	}{
-		{"p224", P224()},
-		{"p256", P256()},
-	}
-
-	for _, test := range tests {
-		curve := test.curve
-		x, y := curve.ScalarBaseMult(nil)
-		if x.Sign() != 0 || y.Sign() != 0 {
-			t.Errorf("%s: x^0 != ∞", test.name)
-		}
-		x.SetInt64(0)
-		y.SetInt64(0)
-
-		x2, y2 := curve.Double(x, y)
-		if x2.Sign() != 0 || y2.Sign() != 0 {
-			t.Errorf("%s: 2∞ != ∞", test.name)
-		}
-
-		baseX := curve.Params().Gx
-		baseY := curve.Params().Gy
-
-		x3, y3 := curve.Add(baseX, baseY, x, y)
-		if x3.Cmp(baseX) != 0 || y3.Cmp(baseY) != 0 {
-			t.Errorf("%s: x+∞ != x", test.name)
-		}
-
-		x4, y4 := curve.Add(x, y, baseX, baseY)
-		if x4.Cmp(baseX) != 0 || y4.Cmp(baseY) != 0 {
-			t.Errorf("%s: ∞+x != x", test.name)
-		}
-	}
-}
-
-func BenchmarkBaseMult(b *testing.B) {
-	b.ResetTimer()
-	p224 := P224()
-	e := p224BaseMultTests[25]
-	k, _ := new(big.Int).SetString(e.k, 10)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		p224.ScalarBaseMult(k.Bytes())
-	}
-}
-
-func BenchmarkBaseMultP256(b *testing.B) {
-	b.ResetTimer()
-	p256 := P256()
-	e := p224BaseMultTests[25]
-	k, _ := new(big.Int).SetString(e.k, 10)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		p256.ScalarBaseMult(k.Bytes())
-	}
-}
-
-func TestMarshal(t *testing.T) {
-	p224 := P224()
-	_, x, y, err := GenerateKey(p224, rand.Reader)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	serialized := Marshal(p224, x, y)
-	xx, yy := Unmarshal(p224, serialized)
-	if xx == nil {
-		t.Error("failed to unmarshal")
-		return
-	}
-	if xx.Cmp(x) != 0 || yy.Cmp(y) != 0 {
-		t.Error("unmarshal returned different values")
-		return
-	}
-}
-
-func TestP224Overflow(t *testing.T) {
-	// This tests for a specific bug in the P224 implementation.
-	p224 := P224()
-	pointData, _ := hex.DecodeString("049B535B45FB0A2072398A6831834624C7E32CCFD5A4B933BCEAF77F1DD945E08BBE5178F5EDF5E733388F196D2A631D2E075BB16CBFEEA15B")
-	x, y := Unmarshal(p224, pointData)
-	if !p224.IsOnCurve(x, y) {
-		t.Error("P224 failed to validate a correct point")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/elliptic/p224.go b/third_party/gofrontend/libgo/go/crypto/elliptic/p224.go
deleted file mode 100644
index 2d3fac7..0000000
--- a/third_party/gofrontend/libgo/go/crypto/elliptic/p224.go
+++ /dev/null
@@ -1,765 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package elliptic
-
-// This is a constant-time, 32-bit implementation of P224. See FIPS 186-3,
-// section D.2.2.
-//
-// See http://www.imperialviolet.org/2010/12/04/ecc.html ([1]) for background.
-
-import (
-	"math/big"
-)
-
-var p224 p224Curve
-
-type p224Curve struct {
-	*CurveParams
-	gx, gy, b p224FieldElement
-}
-
-func initP224() {
-	// See FIPS 186-3, section D.2.2
-	p224.CurveParams = &CurveParams{Name: "P-224"}
-	p224.P, _ = new(big.Int).SetString("26959946667150639794667015087019630673557916260026308143510066298881", 10)
-	p224.N, _ = new(big.Int).SetString("26959946667150639794667015087019625940457807714424391721682722368061", 10)
-	p224.B, _ = new(big.Int).SetString("b4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4", 16)
-	p224.Gx, _ = new(big.Int).SetString("b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21", 16)
-	p224.Gy, _ = new(big.Int).SetString("bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34", 16)
-	p224.BitSize = 224
-
-	p224FromBig(&p224.gx, p224.Gx)
-	p224FromBig(&p224.gy, p224.Gy)
-	p224FromBig(&p224.b, p224.B)
-}
-
-// P224 returns a Curve which implements P-224 (see FIPS 186-3, section D.2.2)
-func P224() Curve {
-	initonce.Do(initAll)
-	return p224
-}
-
-func (curve p224Curve) Params() *CurveParams {
-	return curve.CurveParams
-}
-
-func (curve p224Curve) IsOnCurve(bigX, bigY *big.Int) bool {
-	var x, y p224FieldElement
-	p224FromBig(&x, bigX)
-	p224FromBig(&y, bigY)
-
-	// y² = x³ - 3x + b
-	var tmp p224LargeFieldElement
-	var x3 p224FieldElement
-	p224Square(&x3, &x, &tmp)
-	p224Mul(&x3, &x3, &x, &tmp)
-
-	for i := 0; i < 8; i++ {
-		x[i] *= 3
-	}
-	p224Sub(&x3, &x3, &x)
-	p224Reduce(&x3)
-	p224Add(&x3, &x3, &curve.b)
-	p224Contract(&x3, &x3)
-
-	p224Square(&y, &y, &tmp)
-	p224Contract(&y, &y)
-
-	for i := 0; i < 8; i++ {
-		if y[i] != x3[i] {
-			return false
-		}
-	}
-	return true
-}
-
-func (p224Curve) Add(bigX1, bigY1, bigX2, bigY2 *big.Int) (x, y *big.Int) {
-	var x1, y1, z1, x2, y2, z2, x3, y3, z3 p224FieldElement
-
-	p224FromBig(&x1, bigX1)
-	p224FromBig(&y1, bigY1)
-	if bigX1.Sign() != 0 || bigY1.Sign() != 0 {
-		z1[0] = 1
-	}
-	p224FromBig(&x2, bigX2)
-	p224FromBig(&y2, bigY2)
-	if bigX2.Sign() != 0 || bigY2.Sign() != 0 {
-		z2[0] = 1
-	}
-
-	p224AddJacobian(&x3, &y3, &z3, &x1, &y1, &z1, &x2, &y2, &z2)
-	return p224ToAffine(&x3, &y3, &z3)
-}
-
-func (p224Curve) Double(bigX1, bigY1 *big.Int) (x, y *big.Int) {
-	var x1, y1, z1, x2, y2, z2 p224FieldElement
-
-	p224FromBig(&x1, bigX1)
-	p224FromBig(&y1, bigY1)
-	z1[0] = 1
-
-	p224DoubleJacobian(&x2, &y2, &z2, &x1, &y1, &z1)
-	return p224ToAffine(&x2, &y2, &z2)
-}
-
-func (p224Curve) ScalarMult(bigX1, bigY1 *big.Int, scalar []byte) (x, y *big.Int) {
-	var x1, y1, z1, x2, y2, z2 p224FieldElement
-
-	p224FromBig(&x1, bigX1)
-	p224FromBig(&y1, bigY1)
-	z1[0] = 1
-
-	p224ScalarMult(&x2, &y2, &z2, &x1, &y1, &z1, scalar)
-	return p224ToAffine(&x2, &y2, &z2)
-}
-
-func (curve p224Curve) ScalarBaseMult(scalar []byte) (x, y *big.Int) {
-	var z1, x2, y2, z2 p224FieldElement
-
-	z1[0] = 1
-	p224ScalarMult(&x2, &y2, &z2, &curve.gx, &curve.gy, &z1, scalar)
-	return p224ToAffine(&x2, &y2, &z2)
-}
-
-// Field element functions.
-//
-// The field that we're dealing with is ℤ/pℤ where p = 2**224 - 2**96 + 1.
-//
-// Field elements are represented by a FieldElement, which is a typedef to an
-// array of 8 uint32's. The value of a FieldElement, a, is:
-//   a[0] + 2**28·a[1] + 2**56·a[1] + ... + 2**196·a[7]
-//
-// Using 28-bit limbs means that there's only 4 bits of headroom, which is less
-// than we would really like. But it has the useful feature that we hit 2**224
-// exactly, making the reflections during a reduce much nicer.
-type p224FieldElement [8]uint32
-
-// p224P is the order of the field, represented as a p224FieldElement.
-var p224P = [8]uint32{1, 0, 0, 0xffff000, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff}
-
-// p224IsZero returns 1 if a == 0 mod p and 0 otherwise.
-//
-// a[i] < 2**29
-func p224IsZero(a *p224FieldElement) uint32 {
-	// Since a p224FieldElement contains 224 bits there are two possible
-	// representations of 0: 0 and p.
-	var minimal p224FieldElement
-	p224Contract(&minimal, a)
-
-	var isZero, isP uint32
-	for i, v := range minimal {
-		isZero |= v
-		isP |= v - p224P[i]
-	}
-
-	// If either isZero or isP is 0, then we should return 1.
-	isZero |= isZero >> 16
-	isZero |= isZero >> 8
-	isZero |= isZero >> 4
-	isZero |= isZero >> 2
-	isZero |= isZero >> 1
-
-	isP |= isP >> 16
-	isP |= isP >> 8
-	isP |= isP >> 4
-	isP |= isP >> 2
-	isP |= isP >> 1
-
-	// For isZero and isP, the LSB is 0 iff all the bits are zero.
-	result := isZero & isP
-	result = (^result) & 1
-
-	return result
-}
-
-// p224Add computes *out = a+b
-//
-// a[i] + b[i] < 2**32
-func p224Add(out, a, b *p224FieldElement) {
-	for i := 0; i < 8; i++ {
-		out[i] = a[i] + b[i]
-	}
-}
-
-const two31p3 = 1<<31 + 1<<3
-const two31m3 = 1<<31 - 1<<3
-const two31m15m3 = 1<<31 - 1<<15 - 1<<3
-
-// p224ZeroModP31 is 0 mod p where bit 31 is set in all limbs so that we can
-// subtract smaller amounts without underflow. See the section "Subtraction" in
-// [1] for reasoning.
-var p224ZeroModP31 = []uint32{two31p3, two31m3, two31m3, two31m15m3, two31m3, two31m3, two31m3, two31m3}
-
-// p224Sub computes *out = a-b
-//
-// a[i], b[i] < 2**30
-// out[i] < 2**32
-func p224Sub(out, a, b *p224FieldElement) {
-	for i := 0; i < 8; i++ {
-		out[i] = a[i] + p224ZeroModP31[i] - b[i]
-	}
-}
-
-// LargeFieldElement also represents an element of the field. The limbs are
-// still spaced 28-bits apart and in little-endian order. So the limbs are at
-// 0, 28, 56, ..., 392 bits, each 64-bits wide.
-type p224LargeFieldElement [15]uint64
-
-const two63p35 = 1<<63 + 1<<35
-const two63m35 = 1<<63 - 1<<35
-const two63m35m19 = 1<<63 - 1<<35 - 1<<19
-
-// p224ZeroModP63 is 0 mod p where bit 63 is set in all limbs. See the section
-// "Subtraction" in [1] for why.
-var p224ZeroModP63 = [8]uint64{two63p35, two63m35, two63m35, two63m35, two63m35m19, two63m35, two63m35, two63m35}
-
-const bottom12Bits = 0xfff
-const bottom28Bits = 0xfffffff
-
-// p224Mul computes *out = a*b
-//
-// a[i] < 2**29, b[i] < 2**30 (or vice versa)
-// out[i] < 2**29
-func p224Mul(out, a, b *p224FieldElement, tmp *p224LargeFieldElement) {
-	for i := 0; i < 15; i++ {
-		tmp[i] = 0
-	}
-
-	for i := 0; i < 8; i++ {
-		for j := 0; j < 8; j++ {
-			tmp[i+j] += uint64(a[i]) * uint64(b[j])
-		}
-	}
-
-	p224ReduceLarge(out, tmp)
-}
-
-// Square computes *out = a*a
-//
-// a[i] < 2**29
-// out[i] < 2**29
-func p224Square(out, a *p224FieldElement, tmp *p224LargeFieldElement) {
-	for i := 0; i < 15; i++ {
-		tmp[i] = 0
-	}
-
-	for i := 0; i < 8; i++ {
-		for j := 0; j <= i; j++ {
-			r := uint64(a[i]) * uint64(a[j])
-			if i == j {
-				tmp[i+j] += r
-			} else {
-				tmp[i+j] += r << 1
-			}
-		}
-	}
-
-	p224ReduceLarge(out, tmp)
-}
-
-// ReduceLarge converts a p224LargeFieldElement to a p224FieldElement.
-//
-// in[i] < 2**62
-func p224ReduceLarge(out *p224FieldElement, in *p224LargeFieldElement) {
-	for i := 0; i < 8; i++ {
-		in[i] += p224ZeroModP63[i]
-	}
-
-	// Eliminate the coefficients at 2**224 and greater.
-	for i := 14; i >= 8; i-- {
-		in[i-8] -= in[i]
-		in[i-5] += (in[i] & 0xffff) << 12
-		in[i-4] += in[i] >> 16
-	}
-	in[8] = 0
-	// in[0..8] < 2**64
-
-	// As the values become small enough, we start to store them in |out|
-	// and use 32-bit operations.
-	for i := 1; i < 8; i++ {
-		in[i+1] += in[i] >> 28
-		out[i] = uint32(in[i] & bottom28Bits)
-	}
-	in[0] -= in[8]
-	out[3] += uint32(in[8]&0xffff) << 12
-	out[4] += uint32(in[8] >> 16)
-	// in[0] < 2**64
-	// out[3] < 2**29
-	// out[4] < 2**29
-	// out[1,2,5..7] < 2**28
-
-	out[0] = uint32(in[0] & bottom28Bits)
-	out[1] += uint32((in[0] >> 28) & bottom28Bits)
-	out[2] += uint32(in[0] >> 56)
-	// out[0] < 2**28
-	// out[1..4] < 2**29
-	// out[5..7] < 2**28
-}
-
-// Reduce reduces the coefficients of a to smaller bounds.
-//
-// On entry: a[i] < 2**31 + 2**30
-// On exit: a[i] < 2**29
-func p224Reduce(a *p224FieldElement) {
-	for i := 0; i < 7; i++ {
-		a[i+1] += a[i] >> 28
-		a[i] &= bottom28Bits
-	}
-	top := a[7] >> 28
-	a[7] &= bottom28Bits
-
-	// top < 2**4
-	mask := top
-	mask |= mask >> 2
-	mask |= mask >> 1
-	mask <<= 31
-	mask = uint32(int32(mask) >> 31)
-	// Mask is all ones if top != 0, all zero otherwise
-
-	a[0] -= top
-	a[3] += top << 12
-
-	// We may have just made a[0] negative but, if we did, then we must
-	// have added something to a[3], this it's > 2**12. Therefore we can
-	// carry down to a[0].
-	a[3] -= 1 & mask
-	a[2] += mask & (1<<28 - 1)
-	a[1] += mask & (1<<28 - 1)
-	a[0] += mask & (1 << 28)
-}
-
-// p224Invert calculates *out = in**-1 by computing in**(2**224 - 2**96 - 1),
-// i.e. Fermat's little theorem.
-func p224Invert(out, in *p224FieldElement) {
-	var f1, f2, f3, f4 p224FieldElement
-	var c p224LargeFieldElement
-
-	p224Square(&f1, in, &c)    // 2
-	p224Mul(&f1, &f1, in, &c)  // 2**2 - 1
-	p224Square(&f1, &f1, &c)   // 2**3 - 2
-	p224Mul(&f1, &f1, in, &c)  // 2**3 - 1
-	p224Square(&f2, &f1, &c)   // 2**4 - 2
-	p224Square(&f2, &f2, &c)   // 2**5 - 4
-	p224Square(&f2, &f2, &c)   // 2**6 - 8
-	p224Mul(&f1, &f1, &f2, &c) // 2**6 - 1
-	p224Square(&f2, &f1, &c)   // 2**7 - 2
-	for i := 0; i < 5; i++ {   // 2**12 - 2**6
-		p224Square(&f2, &f2, &c)
-	}
-	p224Mul(&f2, &f2, &f1, &c) // 2**12 - 1
-	p224Square(&f3, &f2, &c)   // 2**13 - 2
-	for i := 0; i < 11; i++ {  // 2**24 - 2**12
-		p224Square(&f3, &f3, &c)
-	}
-	p224Mul(&f2, &f3, &f2, &c) // 2**24 - 1
-	p224Square(&f3, &f2, &c)   // 2**25 - 2
-	for i := 0; i < 23; i++ {  // 2**48 - 2**24
-		p224Square(&f3, &f3, &c)
-	}
-	p224Mul(&f3, &f3, &f2, &c) // 2**48 - 1
-	p224Square(&f4, &f3, &c)   // 2**49 - 2
-	for i := 0; i < 47; i++ {  // 2**96 - 2**48
-		p224Square(&f4, &f4, &c)
-	}
-	p224Mul(&f3, &f3, &f4, &c) // 2**96 - 1
-	p224Square(&f4, &f3, &c)   // 2**97 - 2
-	for i := 0; i < 23; i++ {  // 2**120 - 2**24
-		p224Square(&f4, &f4, &c)
-	}
-	p224Mul(&f2, &f4, &f2, &c) // 2**120 - 1
-	for i := 0; i < 6; i++ {   // 2**126 - 2**6
-		p224Square(&f2, &f2, &c)
-	}
-	p224Mul(&f1, &f1, &f2, &c) // 2**126 - 1
-	p224Square(&f1, &f1, &c)   // 2**127 - 2
-	p224Mul(&f1, &f1, in, &c)  // 2**127 - 1
-	for i := 0; i < 97; i++ {  // 2**224 - 2**97
-		p224Square(&f1, &f1, &c)
-	}
-	p224Mul(out, &f1, &f3, &c) // 2**224 - 2**96 - 1
-}
-
-// p224Contract converts a FieldElement to its unique, minimal form.
-//
-// On entry, in[i] < 2**29
-// On exit, in[i] < 2**28
-func p224Contract(out, in *p224FieldElement) {
-	copy(out[:], in[:])
-
-	for i := 0; i < 7; i++ {
-		out[i+1] += out[i] >> 28
-		out[i] &= bottom28Bits
-	}
-	top := out[7] >> 28
-	out[7] &= bottom28Bits
-
-	out[0] -= top
-	out[3] += top << 12
-
-	// We may just have made out[i] negative. So we carry down. If we made
-	// out[0] negative then we know that out[3] is sufficiently positive
-	// because we just added to it.
-	for i := 0; i < 3; i++ {
-		mask := uint32(int32(out[i]) >> 31)
-		out[i] += (1 << 28) & mask
-		out[i+1] -= 1 & mask
-	}
-
-	// We might have pushed out[3] over 2**28 so we perform another, partial,
-	// carry chain.
-	for i := 3; i < 7; i++ {
-		out[i+1] += out[i] >> 28
-		out[i] &= bottom28Bits
-	}
-	top = out[7] >> 28
-	out[7] &= bottom28Bits
-
-	// Eliminate top while maintaining the same value mod p.
-	out[0] -= top
-	out[3] += top << 12
-
-	// There are two cases to consider for out[3]:
-	//   1) The first time that we eliminated top, we didn't push out[3] over
-	//      2**28. In this case, the partial carry chain didn't change any values
-	//      and top is zero.
-	//   2) We did push out[3] over 2**28 the first time that we eliminated top.
-	//      The first value of top was in [0..16), therefore, prior to eliminating
-	//      the first top, 0xfff1000 <= out[3] <= 0xfffffff. Therefore, after
-	//      overflowing and being reduced by the second carry chain, out[3] <=
-	//      0xf000. Thus it cannot have overflowed when we eliminated top for the
-	//      second time.
-
-	// Again, we may just have made out[0] negative, so do the same carry down.
-	// As before, if we made out[0] negative then we know that out[3] is
-	// sufficiently positive.
-	for i := 0; i < 3; i++ {
-		mask := uint32(int32(out[i]) >> 31)
-		out[i] += (1 << 28) & mask
-		out[i+1] -= 1 & mask
-	}
-
-	// Now we see if the value is >= p and, if so, subtract p.
-
-	// First we build a mask from the top four limbs, which must all be
-	// equal to bottom28Bits if the whole value is >= p. If top4AllOnes
-	// ends up with any zero bits in the bottom 28 bits, then this wasn't
-	// true.
-	top4AllOnes := uint32(0xffffffff)
-	for i := 4; i < 8; i++ {
-		top4AllOnes &= out[i]
-	}
-	top4AllOnes |= 0xf0000000
-	// Now we replicate any zero bits to all the bits in top4AllOnes.
-	top4AllOnes &= top4AllOnes >> 16
-	top4AllOnes &= top4AllOnes >> 8
-	top4AllOnes &= top4AllOnes >> 4
-	top4AllOnes &= top4AllOnes >> 2
-	top4AllOnes &= top4AllOnes >> 1
-	top4AllOnes = uint32(int32(top4AllOnes<<31) >> 31)
-
-	// Now we test whether the bottom three limbs are non-zero.
-	bottom3NonZero := out[0] | out[1] | out[2]
-	bottom3NonZero |= bottom3NonZero >> 16
-	bottom3NonZero |= bottom3NonZero >> 8
-	bottom3NonZero |= bottom3NonZero >> 4
-	bottom3NonZero |= bottom3NonZero >> 2
-	bottom3NonZero |= bottom3NonZero >> 1
-	bottom3NonZero = uint32(int32(bottom3NonZero<<31) >> 31)
-
-	// Everything depends on the value of out[3].
-	//    If it's > 0xffff000 and top4AllOnes != 0 then the whole value is >= p
-	//    If it's = 0xffff000 and top4AllOnes != 0 and bottom3NonZero != 0,
-	//      then the whole value is >= p
-	//    If it's < 0xffff000, then the whole value is < p
-	n := out[3] - 0xffff000
-	out3Equal := n
-	out3Equal |= out3Equal >> 16
-	out3Equal |= out3Equal >> 8
-	out3Equal |= out3Equal >> 4
-	out3Equal |= out3Equal >> 2
-	out3Equal |= out3Equal >> 1
-	out3Equal = ^uint32(int32(out3Equal<<31) >> 31)
-
-	// If out[3] > 0xffff000 then n's MSB will be zero.
-	out3GT := ^uint32(int32(n) >> 31)
-
-	mask := top4AllOnes & ((out3Equal & bottom3NonZero) | out3GT)
-	out[0] -= 1 & mask
-	out[3] -= 0xffff000 & mask
-	out[4] -= 0xfffffff & mask
-	out[5] -= 0xfffffff & mask
-	out[6] -= 0xfffffff & mask
-	out[7] -= 0xfffffff & mask
-}
-
-// Group element functions.
-//
-// These functions deal with group elements. The group is an elliptic curve
-// group with a = -3 defined in FIPS 186-3, section D.2.2.
-
-// p224AddJacobian computes *out = a+b where a != b.
-func p224AddJacobian(x3, y3, z3, x1, y1, z1, x2, y2, z2 *p224FieldElement) {
-	// See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-p224Add-2007-bl
-	var z1z1, z2z2, u1, u2, s1, s2, h, i, j, r, v p224FieldElement
-	var c p224LargeFieldElement
-
-	z1IsZero := p224IsZero(z1)
-	z2IsZero := p224IsZero(z2)
-
-	// Z1Z1 = Z1²
-	p224Square(&z1z1, z1, &c)
-	// Z2Z2 = Z2²
-	p224Square(&z2z2, z2, &c)
-	// U1 = X1*Z2Z2
-	p224Mul(&u1, x1, &z2z2, &c)
-	// U2 = X2*Z1Z1
-	p224Mul(&u2, x2, &z1z1, &c)
-	// S1 = Y1*Z2*Z2Z2
-	p224Mul(&s1, z2, &z2z2, &c)
-	p224Mul(&s1, y1, &s1, &c)
-	// S2 = Y2*Z1*Z1Z1
-	p224Mul(&s2, z1, &z1z1, &c)
-	p224Mul(&s2, y2, &s2, &c)
-	// H = U2-U1
-	p224Sub(&h, &u2, &u1)
-	p224Reduce(&h)
-	xEqual := p224IsZero(&h)
-	// I = (2*H)²
-	for j := 0; j < 8; j++ {
-		i[j] = h[j] << 1
-	}
-	p224Reduce(&i)
-	p224Square(&i, &i, &c)
-	// J = H*I
-	p224Mul(&j, &h, &i, &c)
-	// r = 2*(S2-S1)
-	p224Sub(&r, &s2, &s1)
-	p224Reduce(&r)
-	yEqual := p224IsZero(&r)
-	if xEqual == 1 && yEqual == 1 && z1IsZero == 0 && z2IsZero == 0 {
-		p224DoubleJacobian(x3, y3, z3, x1, y1, z1)
-		return
-	}
-	for i := 0; i < 8; i++ {
-		r[i] <<= 1
-	}
-	p224Reduce(&r)
-	// V = U1*I
-	p224Mul(&v, &u1, &i, &c)
-	// Z3 = ((Z1+Z2)²-Z1Z1-Z2Z2)*H
-	p224Add(&z1z1, &z1z1, &z2z2)
-	p224Add(&z2z2, z1, z2)
-	p224Reduce(&z2z2)
-	p224Square(&z2z2, &z2z2, &c)
-	p224Sub(z3, &z2z2, &z1z1)
-	p224Reduce(z3)
-	p224Mul(z3, z3, &h, &c)
-	// X3 = r²-J-2*V
-	for i := 0; i < 8; i++ {
-		z1z1[i] = v[i] << 1
-	}
-	p224Add(&z1z1, &j, &z1z1)
-	p224Reduce(&z1z1)
-	p224Square(x3, &r, &c)
-	p224Sub(x3, x3, &z1z1)
-	p224Reduce(x3)
-	// Y3 = r*(V-X3)-2*S1*J
-	for i := 0; i < 8; i++ {
-		s1[i] <<= 1
-	}
-	p224Mul(&s1, &s1, &j, &c)
-	p224Sub(&z1z1, &v, x3)
-	p224Reduce(&z1z1)
-	p224Mul(&z1z1, &z1z1, &r, &c)
-	p224Sub(y3, &z1z1, &s1)
-	p224Reduce(y3)
-
-	p224CopyConditional(x3, x2, z1IsZero)
-	p224CopyConditional(x3, x1, z2IsZero)
-	p224CopyConditional(y3, y2, z1IsZero)
-	p224CopyConditional(y3, y1, z2IsZero)
-	p224CopyConditional(z3, z2, z1IsZero)
-	p224CopyConditional(z3, z1, z2IsZero)
-}
-
-// p224DoubleJacobian computes *out = a+a.
-func p224DoubleJacobian(x3, y3, z3, x1, y1, z1 *p224FieldElement) {
-	var delta, gamma, beta, alpha, t p224FieldElement
-	var c p224LargeFieldElement
-
-	p224Square(&delta, z1, &c)
-	p224Square(&gamma, y1, &c)
-	p224Mul(&beta, x1, &gamma, &c)
-
-	// alpha = 3*(X1-delta)*(X1+delta)
-	p224Add(&t, x1, &delta)
-	for i := 0; i < 8; i++ {
-		t[i] += t[i] << 1
-	}
-	p224Reduce(&t)
-	p224Sub(&alpha, x1, &delta)
-	p224Reduce(&alpha)
-	p224Mul(&alpha, &alpha, &t, &c)
-
-	// Z3 = (Y1+Z1)²-gamma-delta
-	p224Add(z3, y1, z1)
-	p224Reduce(z3)
-	p224Square(z3, z3, &c)
-	p224Sub(z3, z3, &gamma)
-	p224Reduce(z3)
-	p224Sub(z3, z3, &delta)
-	p224Reduce(z3)
-
-	// X3 = alpha²-8*beta
-	for i := 0; i < 8; i++ {
-		delta[i] = beta[i] << 3
-	}
-	p224Reduce(&delta)
-	p224Square(x3, &alpha, &c)
-	p224Sub(x3, x3, &delta)
-	p224Reduce(x3)
-
-	// Y3 = alpha*(4*beta-X3)-8*gamma²
-	for i := 0; i < 8; i++ {
-		beta[i] <<= 2
-	}
-	p224Sub(&beta, &beta, x3)
-	p224Reduce(&beta)
-	p224Square(&gamma, &gamma, &c)
-	for i := 0; i < 8; i++ {
-		gamma[i] <<= 3
-	}
-	p224Reduce(&gamma)
-	p224Mul(y3, &alpha, &beta, &c)
-	p224Sub(y3, y3, &gamma)
-	p224Reduce(y3)
-}
-
-// p224CopyConditional sets *out = *in iff the least-significant-bit of control
-// is true, and it runs in constant time.
-func p224CopyConditional(out, in *p224FieldElement, control uint32) {
-	control <<= 31
-	control = uint32(int32(control) >> 31)
-
-	for i := 0; i < 8; i++ {
-		out[i] ^= (out[i] ^ in[i]) & control
-	}
-}
-
-func p224ScalarMult(outX, outY, outZ, inX, inY, inZ *p224FieldElement, scalar []byte) {
-	var xx, yy, zz p224FieldElement
-	for i := 0; i < 8; i++ {
-		outX[i] = 0
-		outY[i] = 0
-		outZ[i] = 0
-	}
-
-	for _, byte := range scalar {
-		for bitNum := uint(0); bitNum < 8; bitNum++ {
-			p224DoubleJacobian(outX, outY, outZ, outX, outY, outZ)
-			bit := uint32((byte >> (7 - bitNum)) & 1)
-			p224AddJacobian(&xx, &yy, &zz, inX, inY, inZ, outX, outY, outZ)
-			p224CopyConditional(outX, &xx, bit)
-			p224CopyConditional(outY, &yy, bit)
-			p224CopyConditional(outZ, &zz, bit)
-		}
-	}
-}
-
-// p224ToAffine converts from Jacobian to affine form.
-func p224ToAffine(x, y, z *p224FieldElement) (*big.Int, *big.Int) {
-	var zinv, zinvsq, outx, outy p224FieldElement
-	var tmp p224LargeFieldElement
-
-	if isPointAtInfinity := p224IsZero(z); isPointAtInfinity == 1 {
-		return new(big.Int), new(big.Int)
-	}
-
-	p224Invert(&zinv, z)
-	p224Square(&zinvsq, &zinv, &tmp)
-	p224Mul(x, x, &zinvsq, &tmp)
-	p224Mul(&zinvsq, &zinvsq, &zinv, &tmp)
-	p224Mul(y, y, &zinvsq, &tmp)
-
-	p224Contract(&outx, x)
-	p224Contract(&outy, y)
-	return p224ToBig(&outx), p224ToBig(&outy)
-}
-
-// get28BitsFromEnd returns the least-significant 28 bits from buf>>shift,
-// where buf is interpreted as a big-endian number.
-func get28BitsFromEnd(buf []byte, shift uint) (uint32, []byte) {
-	var ret uint32
-
-	for i := uint(0); i < 4; i++ {
-		var b byte
-		if l := len(buf); l > 0 {
-			b = buf[l-1]
-			// We don't remove the byte if we're about to return and we're not
-			// reading all of it.
-			if i != 3 || shift == 4 {
-				buf = buf[:l-1]
-			}
-		}
-		ret |= uint32(b) << (8 * i) >> shift
-	}
-	ret &= bottom28Bits
-	return ret, buf
-}
-
-// p224FromBig sets *out = *in.
-func p224FromBig(out *p224FieldElement, in *big.Int) {
-	bytes := in.Bytes()
-	out[0], bytes = get28BitsFromEnd(bytes, 0)
-	out[1], bytes = get28BitsFromEnd(bytes, 4)
-	out[2], bytes = get28BitsFromEnd(bytes, 0)
-	out[3], bytes = get28BitsFromEnd(bytes, 4)
-	out[4], bytes = get28BitsFromEnd(bytes, 0)
-	out[5], bytes = get28BitsFromEnd(bytes, 4)
-	out[6], bytes = get28BitsFromEnd(bytes, 0)
-	out[7], bytes = get28BitsFromEnd(bytes, 4)
-}
-
-// p224ToBig returns in as a big.Int.
-func p224ToBig(in *p224FieldElement) *big.Int {
-	var buf [28]byte
-	buf[27] = byte(in[0])
-	buf[26] = byte(in[0] >> 8)
-	buf[25] = byte(in[0] >> 16)
-	buf[24] = byte(((in[0] >> 24) & 0x0f) | (in[1]<<4)&0xf0)
-
-	buf[23] = byte(in[1] >> 4)
-	buf[22] = byte(in[1] >> 12)
-	buf[21] = byte(in[1] >> 20)
-
-	buf[20] = byte(in[2])
-	buf[19] = byte(in[2] >> 8)
-	buf[18] = byte(in[2] >> 16)
-	buf[17] = byte(((in[2] >> 24) & 0x0f) | (in[3]<<4)&0xf0)
-
-	buf[16] = byte(in[3] >> 4)
-	buf[15] = byte(in[3] >> 12)
-	buf[14] = byte(in[3] >> 20)
-
-	buf[13] = byte(in[4])
-	buf[12] = byte(in[4] >> 8)
-	buf[11] = byte(in[4] >> 16)
-	buf[10] = byte(((in[4] >> 24) & 0x0f) | (in[5]<<4)&0xf0)
-
-	buf[9] = byte(in[5] >> 4)
-	buf[8] = byte(in[5] >> 12)
-	buf[7] = byte(in[5] >> 20)
-
-	buf[6] = byte(in[6])
-	buf[5] = byte(in[6] >> 8)
-	buf[4] = byte(in[6] >> 16)
-	buf[3] = byte(((in[6] >> 24) & 0x0f) | (in[7]<<4)&0xf0)
-
-	buf[2] = byte(in[7] >> 4)
-	buf[1] = byte(in[7] >> 12)
-	buf[0] = byte(in[7] >> 20)
-
-	return new(big.Int).SetBytes(buf[:])
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/elliptic/p224_test.go b/third_party/gofrontend/libgo/go/crypto/elliptic/p224_test.go
deleted file mode 100644
index 4b26d16..0000000
--- a/third_party/gofrontend/libgo/go/crypto/elliptic/p224_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package elliptic
-
-import (
-	"math/big"
-	"testing"
-)
-
-var toFromBigTests = []string{
-	"0",
-	"1",
-	"23",
-	"b70e0cb46bb4bf7f321390b94a03c1d356c01122343280d6105c1d21",
-	"706a46d476dcb76798e6046d89474788d164c18032d268fd10704fa6",
-}
-
-func p224AlternativeToBig(in *p224FieldElement) *big.Int {
-	ret := new(big.Int)
-	tmp := new(big.Int)
-
-	for i := uint(0); i < 8; i++ {
-		tmp.SetInt64(int64(in[i]))
-		tmp.Lsh(tmp, 28*i)
-		ret.Add(ret, tmp)
-	}
-	ret.Mod(ret, p224.P)
-	return ret
-}
-
-func TestToFromBig(t *testing.T) {
-	for i, test := range toFromBigTests {
-		n, _ := new(big.Int).SetString(test, 16)
-		var x p224FieldElement
-		p224FromBig(&x, n)
-		m := p224ToBig(&x)
-		if n.Cmp(m) != 0 {
-			t.Errorf("#%d: %x != %x", i, n, m)
-		}
-		q := p224AlternativeToBig(&x)
-		if n.Cmp(q) != 0 {
-			t.Errorf("#%d: %x != %x (alternative)", i, n, m)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/elliptic/p256.go b/third_party/gofrontend/libgo/go/crypto/elliptic/p256.go
deleted file mode 100644
index 82bc7b3..0000000
--- a/third_party/gofrontend/libgo/go/crypto/elliptic/p256.go
+++ /dev/null
@@ -1,1186 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package elliptic
-
-// This file contains a constant-time, 32-bit implementation of P256.
-
-import (
-	"math/big"
-)
-
-type p256Curve struct {
-	*CurveParams
-}
-
-var (
-	p256 p256Curve
-	// RInverse contains 1/R mod p - the inverse of the Montgomery constant
-	// (2**257).
-	p256RInverse *big.Int
-)
-
-func initP256() {
-	// See FIPS 186-3, section D.2.3
-	p256.CurveParams = &CurveParams{Name: "P-256"}
-	p256.P, _ = new(big.Int).SetString("115792089210356248762697446949407573530086143415290314195533631308867097853951", 10)
-	p256.N, _ = new(big.Int).SetString("115792089210356248762697446949407573529996955224135760342422259061068512044369", 10)
-	p256.B, _ = new(big.Int).SetString("5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", 16)
-	p256.Gx, _ = new(big.Int).SetString("6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", 16)
-	p256.Gy, _ = new(big.Int).SetString("4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", 16)
-	p256.BitSize = 256
-
-	p256RInverse, _ = new(big.Int).SetString("7fffffff00000001fffffffe8000000100000000ffffffff0000000180000000", 16)
-}
-
-func (curve p256Curve) Params() *CurveParams {
-	return curve.CurveParams
-}
-
-// p256GetScalar endian-swaps the big-endian scalar value from in and writes it
-// to out. If the scalar is equal or greater than the order of the group, it's
-// reduced modulo that order.
-func p256GetScalar(out *[32]byte, in []byte) {
-	n := new(big.Int).SetBytes(in)
-	var scalarBytes []byte
-
-	if n.Cmp(p256.N) >= 0 {
-		n.Mod(n, p256.N)
-		scalarBytes = n.Bytes()
-	} else {
-		scalarBytes = in
-	}
-
-	for i, v := range scalarBytes {
-		out[len(scalarBytes)-(1+i)] = v
-	}
-}
-
-func (p256Curve) ScalarBaseMult(scalar []byte) (x, y *big.Int) {
-	var scalarReversed [32]byte
-	p256GetScalar(&scalarReversed, scalar)
-
-	var x1, y1, z1 [p256Limbs]uint32
-	p256ScalarBaseMult(&x1, &y1, &z1, &scalarReversed)
-	return p256ToAffine(&x1, &y1, &z1)
-}
-
-func (p256Curve) ScalarMult(bigX, bigY *big.Int, scalar []byte) (x, y *big.Int) {
-	var scalarReversed [32]byte
-	p256GetScalar(&scalarReversed, scalar)
-
-	var px, py, x1, y1, z1 [p256Limbs]uint32
-	p256FromBig(&px, bigX)
-	p256FromBig(&py, bigY)
-	p256ScalarMult(&x1, &y1, &z1, &px, &py, &scalarReversed)
-	return p256ToAffine(&x1, &y1, &z1)
-}
-
-// Field elements are represented as nine, unsigned 32-bit words.
-//
-// The value of an field element is:
-//   x[0] + (x[1] * 2**29) + (x[2] * 2**57) + ... + (x[8] * 2**228)
-//
-// That is, each limb is alternately 29 or 28-bits wide in little-endian
-// order.
-//
-// This means that a field element hits 2**257, rather than 2**256 as we would
-// like. A 28, 29, ... pattern would cause us to hit 2**256, but that causes
-// problems when multiplying as terms end up one bit short of a limb which
-// would require much bit-shifting to correct.
-//
-// Finally, the values stored in a field element are in Montgomery form. So the
-// value |y| is stored as (y*R) mod p, where p is the P-256 prime and R is
-// 2**257.
-
-const (
-	p256Limbs    = 9
-	bottom29Bits = 0x1fffffff
-)
-
-var (
-	// p256One is the number 1 as a field element.
-	p256One  = [p256Limbs]uint32{2, 0, 0, 0xffff800, 0x1fffffff, 0xfffffff, 0x1fbfffff, 0x1ffffff, 0}
-	p256Zero = [p256Limbs]uint32{0, 0, 0, 0, 0, 0, 0, 0, 0}
-	// p256P is the prime modulus as a field element.
-	p256P = [p256Limbs]uint32{0x1fffffff, 0xfffffff, 0x1fffffff, 0x3ff, 0, 0, 0x200000, 0xf000000, 0xfffffff}
-	// p2562P is the twice prime modulus as a field element.
-	p2562P = [p256Limbs]uint32{0x1ffffffe, 0xfffffff, 0x1fffffff, 0x7ff, 0, 0, 0x400000, 0xe000000, 0x1fffffff}
-)
-
-// p256Precomputed contains precomputed values to aid the calculation of scalar
-// multiples of the base point, G. It's actually two, equal length, tables
-// concatenated.
-//
-// The first table contains (x,y) field element pairs for 16 multiples of the
-// base point, G.
-//
-//   Index  |  Index (binary) | Value
-//       0  |           0000  | 0G (all zeros, omitted)
-//       1  |           0001  | G
-//       2  |           0010  | 2**64G
-//       3  |           0011  | 2**64G + G
-//       4  |           0100  | 2**128G
-//       5  |           0101  | 2**128G + G
-//       6  |           0110  | 2**128G + 2**64G
-//       7  |           0111  | 2**128G + 2**64G + G
-//       8  |           1000  | 2**192G
-//       9  |           1001  | 2**192G + G
-//      10  |           1010  | 2**192G + 2**64G
-//      11  |           1011  | 2**192G + 2**64G + G
-//      12  |           1100  | 2**192G + 2**128G
-//      13  |           1101  | 2**192G + 2**128G + G
-//      14  |           1110  | 2**192G + 2**128G + 2**64G
-//      15  |           1111  | 2**192G + 2**128G + 2**64G + G
-//
-// The second table follows the same style, but the terms are 2**32G,
-// 2**96G, 2**160G, 2**224G.
-//
-// This is ~2KB of data.
-var p256Precomputed = [p256Limbs * 2 * 15 * 2]uint32{
-	0x11522878, 0xe730d41, 0xdb60179, 0x4afe2ff, 0x12883add, 0xcaddd88, 0x119e7edc, 0xd4a6eab, 0x3120bee,
-	0x1d2aac15, 0xf25357c, 0x19e45cdd, 0x5c721d0, 0x1992c5a5, 0xa237487, 0x154ba21, 0x14b10bb, 0xae3fe3,
-	0xd41a576, 0x922fc51, 0x234994f, 0x60b60d3, 0x164586ae, 0xce95f18, 0x1fe49073, 0x3fa36cc, 0x5ebcd2c,
-	0xb402f2f, 0x15c70bf, 0x1561925c, 0x5a26704, 0xda91e90, 0xcdc1c7f, 0x1ea12446, 0xe1ade1e, 0xec91f22,
-	0x26f7778, 0x566847e, 0xa0bec9e, 0x234f453, 0x1a31f21a, 0xd85e75c, 0x56c7109, 0xa267a00, 0xb57c050,
-	0x98fb57, 0xaa837cc, 0x60c0792, 0xcfa5e19, 0x61bab9e, 0x589e39b, 0xa324c5, 0x7d6dee7, 0x2976e4b,
-	0x1fc4124a, 0xa8c244b, 0x1ce86762, 0xcd61c7e, 0x1831c8e0, 0x75774e1, 0x1d96a5a9, 0x843a649, 0xc3ab0fa,
-	0x6e2e7d5, 0x7673a2a, 0x178b65e8, 0x4003e9b, 0x1a1f11c2, 0x7816ea, 0xf643e11, 0x58c43df, 0xf423fc2,
-	0x19633ffa, 0x891f2b2, 0x123c231c, 0x46add8c, 0x54700dd, 0x59e2b17, 0x172db40f, 0x83e277d, 0xb0dd609,
-	0xfd1da12, 0x35c6e52, 0x19ede20c, 0xd19e0c0, 0x97d0f40, 0xb015b19, 0x449e3f5, 0xe10c9e, 0x33ab581,
-	0x56a67ab, 0x577734d, 0x1dddc062, 0xc57b10d, 0x149b39d, 0x26a9e7b, 0xc35df9f, 0x48764cd, 0x76dbcca,
-	0xca4b366, 0xe9303ab, 0x1a7480e7, 0x57e9e81, 0x1e13eb50, 0xf466cf3, 0x6f16b20, 0x4ba3173, 0xc168c33,
-	0x15cb5439, 0x6a38e11, 0x73658bd, 0xb29564f, 0x3f6dc5b, 0x53b97e, 0x1322c4c0, 0x65dd7ff, 0x3a1e4f6,
-	0x14e614aa, 0x9246317, 0x1bc83aca, 0xad97eed, 0xd38ce4a, 0xf82b006, 0x341f077, 0xa6add89, 0x4894acd,
-	0x9f162d5, 0xf8410ef, 0x1b266a56, 0xd7f223, 0x3e0cb92, 0xe39b672, 0x6a2901a, 0x69a8556, 0x7e7c0,
-	0x9b7d8d3, 0x309a80, 0x1ad05f7f, 0xc2fb5dd, 0xcbfd41d, 0x9ceb638, 0x1051825c, 0xda0cf5b, 0x812e881,
-	0x6f35669, 0x6a56f2c, 0x1df8d184, 0x345820, 0x1477d477, 0x1645db1, 0xbe80c51, 0xc22be3e, 0xe35e65a,
-	0x1aeb7aa0, 0xc375315, 0xf67bc99, 0x7fdd7b9, 0x191fc1be, 0x61235d, 0x2c184e9, 0x1c5a839, 0x47a1e26,
-	0xb7cb456, 0x93e225d, 0x14f3c6ed, 0xccc1ac9, 0x17fe37f3, 0x4988989, 0x1a90c502, 0x2f32042, 0xa17769b,
-	0xafd8c7c, 0x8191c6e, 0x1dcdb237, 0x16200c0, 0x107b32a1, 0x66c08db, 0x10d06a02, 0x3fc93, 0x5620023,
-	0x16722b27, 0x68b5c59, 0x270fcfc, 0xfad0ecc, 0xe5de1c2, 0xeab466b, 0x2fc513c, 0x407f75c, 0xbaab133,
-	0x9705fe9, 0xb88b8e7, 0x734c993, 0x1e1ff8f, 0x19156970, 0xabd0f00, 0x10469ea7, 0x3293ac0, 0xcdc98aa,
-	0x1d843fd, 0xe14bfe8, 0x15be825f, 0x8b5212, 0xeb3fb67, 0x81cbd29, 0xbc62f16, 0x2b6fcc7, 0xf5a4e29,
-	0x13560b66, 0xc0b6ac2, 0x51ae690, 0xd41e271, 0xf3e9bd4, 0x1d70aab, 0x1029f72, 0x73e1c35, 0xee70fbc,
-	0xad81baf, 0x9ecc49a, 0x86c741e, 0xfe6be30, 0x176752e7, 0x23d416, 0x1f83de85, 0x27de188, 0x66f70b8,
-	0x181cd51f, 0x96b6e4c, 0x188f2335, 0xa5df759, 0x17a77eb6, 0xfeb0e73, 0x154ae914, 0x2f3ec51, 0x3826b59,
-	0xb91f17d, 0x1c72949, 0x1362bf0a, 0xe23fddf, 0xa5614b0, 0xf7d8f, 0x79061, 0x823d9d2, 0x8213f39,
-	0x1128ae0b, 0xd095d05, 0xb85c0c2, 0x1ecb2ef, 0x24ddc84, 0xe35e901, 0x18411a4a, 0xf5ddc3d, 0x3786689,
-	0x52260e8, 0x5ae3564, 0x542b10d, 0x8d93a45, 0x19952aa4, 0x996cc41, 0x1051a729, 0x4be3499, 0x52b23aa,
-	0x109f307e, 0x6f5b6bb, 0x1f84e1e7, 0x77a0cfa, 0x10c4df3f, 0x25a02ea, 0xb048035, 0xe31de66, 0xc6ecaa3,
-	0x28ea335, 0x2886024, 0x1372f020, 0xf55d35, 0x15e4684c, 0xf2a9e17, 0x1a4a7529, 0xcb7beb1, 0xb2a78a1,
-	0x1ab21f1f, 0x6361ccf, 0x6c9179d, 0xb135627, 0x1267b974, 0x4408bad, 0x1cbff658, 0xe3d6511, 0xc7d76f,
-	0x1cc7a69, 0xe7ee31b, 0x54fab4f, 0x2b914f, 0x1ad27a30, 0xcd3579e, 0xc50124c, 0x50daa90, 0xb13f72,
-	0xb06aa75, 0x70f5cc6, 0x1649e5aa, 0x84a5312, 0x329043c, 0x41c4011, 0x13d32411, 0xb04a838, 0xd760d2d,
-	0x1713b532, 0xbaa0c03, 0x84022ab, 0x6bcf5c1, 0x2f45379, 0x18ae070, 0x18c9e11e, 0x20bca9a, 0x66f496b,
-	0x3eef294, 0x67500d2, 0xd7f613c, 0x2dbbeb, 0xb741038, 0xe04133f, 0x1582968d, 0xbe985f7, 0x1acbc1a,
-	0x1a6a939f, 0x33e50f6, 0xd665ed4, 0xb4b7bd6, 0x1e5a3799, 0x6b33847, 0x17fa56ff, 0x65ef930, 0x21dc4a,
-	0x2b37659, 0x450fe17, 0xb357b65, 0xdf5efac, 0x15397bef, 0x9d35a7f, 0x112ac15f, 0x624e62e, 0xa90ae2f,
-	0x107eecd2, 0x1f69bbe, 0x77d6bce, 0x5741394, 0x13c684fc, 0x950c910, 0x725522b, 0xdc78583, 0x40eeabb,
-	0x1fde328a, 0xbd61d96, 0xd28c387, 0x9e77d89, 0x12550c40, 0x759cb7d, 0x367ef34, 0xae2a960, 0x91b8bdc,
-	0x93462a9, 0xf469ef, 0xb2e9aef, 0xd2ca771, 0x54e1f42, 0x7aaa49, 0x6316abb, 0x2413c8e, 0x5425bf9,
-	0x1bed3e3a, 0xf272274, 0x1f5e7326, 0x6416517, 0xea27072, 0x9cedea7, 0x6e7633, 0x7c91952, 0xd806dce,
-	0x8e2a7e1, 0xe421e1a, 0x418c9e1, 0x1dbc890, 0x1b395c36, 0xa1dc175, 0x1dc4ef73, 0x8956f34, 0xe4b5cf2,
-	0x1b0d3a18, 0x3194a36, 0x6c2641f, 0xe44124c, 0xa2f4eaa, 0xa8c25ba, 0xf927ed7, 0x627b614, 0x7371cca,
-	0xba16694, 0x417bc03, 0x7c0a7e3, 0x9c35c19, 0x1168a205, 0x8b6b00d, 0x10e3edc9, 0x9c19bf2, 0x5882229,
-	0x1b2b4162, 0xa5cef1a, 0x1543622b, 0x9bd433e, 0x364e04d, 0x7480792, 0x5c9b5b3, 0xe85ff25, 0x408ef57,
-	0x1814cfa4, 0x121b41b, 0xd248a0f, 0x3b05222, 0x39bb16a, 0xc75966d, 0xa038113, 0xa4a1769, 0x11fbc6c,
-	0x917e50e, 0xeec3da8, 0x169d6eac, 0x10c1699, 0xa416153, 0xf724912, 0x15cd60b7, 0x4acbad9, 0x5efc5fa,
-	0xf150ed7, 0x122b51, 0x1104b40a, 0xcb7f442, 0xfbb28ff, 0x6ac53ca, 0x196142cc, 0x7bf0fa9, 0x957651,
-	0x4e0f215, 0xed439f8, 0x3f46bd5, 0x5ace82f, 0x110916b6, 0x6db078, 0xffd7d57, 0xf2ecaac, 0xca86dec,
-	0x15d6b2da, 0x965ecc9, 0x1c92b4c2, 0x1f3811, 0x1cb080f5, 0x2d8b804, 0x19d1c12d, 0xf20bd46, 0x1951fa7,
-	0xa3656c3, 0x523a425, 0xfcd0692, 0xd44ddc8, 0x131f0f5b, 0xaf80e4a, 0xcd9fc74, 0x99bb618, 0x2db944c,
-	0xa673090, 0x1c210e1, 0x178c8d23, 0x1474383, 0x10b8743d, 0x985a55b, 0x2e74779, 0x576138, 0x9587927,
-	0x133130fa, 0xbe05516, 0x9f4d619, 0xbb62570, 0x99ec591, 0xd9468fe, 0x1d07782d, 0xfc72e0b, 0x701b298,
-	0x1863863b, 0x85954b8, 0x121a0c36, 0x9e7fedf, 0xf64b429, 0x9b9d71e, 0x14e2f5d8, 0xf858d3a, 0x942eea8,
-	0xda5b765, 0x6edafff, 0xa9d18cc, 0xc65e4ba, 0x1c747e86, 0xe4ea915, 0x1981d7a1, 0x8395659, 0x52ed4e2,
-	0x87d43b7, 0x37ab11b, 0x19d292ce, 0xf8d4692, 0x18c3053f, 0x8863e13, 0x4c146c0, 0x6bdf55a, 0x4e4457d,
-	0x16152289, 0xac78ec2, 0x1a59c5a2, 0x2028b97, 0x71c2d01, 0x295851f, 0x404747b, 0x878558d, 0x7d29aa4,
-	0x13d8341f, 0x8daefd7, 0x139c972d, 0x6b7ea75, 0xd4a9dde, 0xff163d8, 0x81d55d7, 0xa5bef68, 0xb7b30d8,
-	0xbe73d6f, 0xaa88141, 0xd976c81, 0x7e7a9cc, 0x18beb771, 0xd773cbd, 0x13f51951, 0x9d0c177, 0x1c49a78,
-}
-
-// Field element operations:
-
-// nonZeroToAllOnes returns:
-//   0xffffffff for 0 < x <= 2**31
-//   0 for x == 0 or x > 2**31.
-func nonZeroToAllOnes(x uint32) uint32 {
-	return ((x - 1) >> 31) - 1
-}
-
-// p256ReduceCarry adds a multiple of p in order to cancel |carry|,
-// which is a term at 2**257.
-//
-// On entry: carry < 2**3, inout[0,2,...] < 2**29, inout[1,3,...] < 2**28.
-// On exit: inout[0,2,..] < 2**30, inout[1,3,...] < 2**29.
-func p256ReduceCarry(inout *[p256Limbs]uint32, carry uint32) {
-	carry_mask := nonZeroToAllOnes(carry)
-
-	inout[0] += carry << 1
-	inout[3] += 0x10000000 & carry_mask
-	// carry < 2**3 thus (carry << 11) < 2**14 and we added 2**28 in the
-	// previous line therefore this doesn't underflow.
-	inout[3] -= carry << 11
-	inout[4] += (0x20000000 - 1) & carry_mask
-	inout[5] += (0x10000000 - 1) & carry_mask
-	inout[6] += (0x20000000 - 1) & carry_mask
-	inout[6] -= carry << 22
-	// This may underflow if carry is non-zero but, if so, we'll fix it in the
-	// next line.
-	inout[7] -= 1 & carry_mask
-	inout[7] += carry << 25
-}
-
-// p256Sum sets out = in+in2.
-//
-// On entry, in[i]+in2[i] must not overflow a 32-bit word.
-// On exit: out[0,2,...] < 2**30, out[1,3,...] < 2**29
-func p256Sum(out, in, in2 *[p256Limbs]uint32) {
-	carry := uint32(0)
-	for i := 0; ; i++ {
-		out[i] = in[i] + in2[i]
-		out[i] += carry
-		carry = out[i] >> 29
-		out[i] &= bottom29Bits
-
-		i++
-		if i == p256Limbs {
-			break
-		}
-
-		out[i] = in[i] + in2[i]
-		out[i] += carry
-		carry = out[i] >> 28
-		out[i] &= bottom28Bits
-	}
-
-	p256ReduceCarry(out, carry)
-}
-
-const (
-	two30m2    = 1<<30 - 1<<2
-	two30p13m2 = 1<<30 + 1<<13 - 1<<2
-	two31m2    = 1<<31 - 1<<2
-	two31p24m2 = 1<<31 + 1<<24 - 1<<2
-	two30m27m2 = 1<<30 - 1<<27 - 1<<2
-)
-
-// p256Zero31 is 0 mod p.
-var p256Zero31 = [p256Limbs]uint32{two31m3, two30m2, two31m2, two30p13m2, two31m2, two30m2, two31p24m2, two30m27m2, two31m2}
-
-// p256Diff sets out = in-in2.
-//
-// On entry: in[0,2,...] < 2**30, in[1,3,...] < 2**29 and
-//           in2[0,2,...] < 2**30, in2[1,3,...] < 2**29.
-// On exit: out[0,2,...] < 2**30, out[1,3,...] < 2**29.
-func p256Diff(out, in, in2 *[p256Limbs]uint32) {
-	var carry uint32
-
-	for i := 0; ; i++ {
-		out[i] = in[i] - in2[i]
-		out[i] += p256Zero31[i]
-		out[i] += carry
-		carry = out[i] >> 29
-		out[i] &= bottom29Bits
-
-		i++
-		if i == p256Limbs {
-			break
-		}
-
-		out[i] = in[i] - in2[i]
-		out[i] += p256Zero31[i]
-		out[i] += carry
-		carry = out[i] >> 28
-		out[i] &= bottom28Bits
-	}
-
-	p256ReduceCarry(out, carry)
-}
-
-// p256ReduceDegree sets out = tmp/R mod p where tmp contains 64-bit words with
-// the same 29,28,... bit positions as an field element.
-//
-// The values in field elements are in Montgomery form: x*R mod p where R =
-// 2**257. Since we just multiplied two Montgomery values together, the result
-// is x*y*R*R mod p. We wish to divide by R in order for the result also to be
-// in Montgomery form.
-//
-// On entry: tmp[i] < 2**64
-// On exit: out[0,2,...] < 2**30, out[1,3,...] < 2**29
-func p256ReduceDegree(out *[p256Limbs]uint32, tmp [17]uint64) {
-	// The following table may be helpful when reading this code:
-	//
-	// Limb number:   0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10...
-	// Width (bits):  29| 28| 29| 28| 29| 28| 29| 28| 29| 28| 29
-	// Start bit:     0 | 29| 57| 86|114|143|171|200|228|257|285
-	//   (odd phase): 0 | 28| 57| 85|114|142|171|199|228|256|285
-	var tmp2 [18]uint32
-	var carry, x, xMask uint32
-
-	// tmp contains 64-bit words with the same 29,28,29-bit positions as an
-	// field element. So the top of an element of tmp might overlap with
-	// another element two positions down. The following loop eliminates
-	// this overlap.
-	tmp2[0] = uint32(tmp[0]) & bottom29Bits
-
-	tmp2[1] = uint32(tmp[0]) >> 29
-	tmp2[1] |= (uint32(tmp[0]>>32) << 3) & bottom28Bits
-	tmp2[1] += uint32(tmp[1]) & bottom28Bits
-	carry = tmp2[1] >> 28
-	tmp2[1] &= bottom28Bits
-
-	for i := 2; i < 17; i++ {
-		tmp2[i] = (uint32(tmp[i-2] >> 32)) >> 25
-		tmp2[i] += (uint32(tmp[i-1])) >> 28
-		tmp2[i] += (uint32(tmp[i-1]>>32) << 4) & bottom29Bits
-		tmp2[i] += uint32(tmp[i]) & bottom29Bits
-		tmp2[i] += carry
-		carry = tmp2[i] >> 29
-		tmp2[i] &= bottom29Bits
-
-		i++
-		if i == 17 {
-			break
-		}
-		tmp2[i] = uint32(tmp[i-2]>>32) >> 25
-		tmp2[i] += uint32(tmp[i-1]) >> 29
-		tmp2[i] += ((uint32(tmp[i-1] >> 32)) << 3) & bottom28Bits
-		tmp2[i] += uint32(tmp[i]) & bottom28Bits
-		tmp2[i] += carry
-		carry = tmp2[i] >> 28
-		tmp2[i] &= bottom28Bits
-	}
-
-	tmp2[17] = uint32(tmp[15]>>32) >> 25
-	tmp2[17] += uint32(tmp[16]) >> 29
-	tmp2[17] += uint32(tmp[16]>>32) << 3
-	tmp2[17] += carry
-
-	// Montgomery elimination of terms:
-	//
-	// Since R is 2**257, we can divide by R with a bitwise shift if we can
-	// ensure that the right-most 257 bits are all zero. We can make that true
-	// by adding multiplies of p without affecting the value.
-	//
-	// So we eliminate limbs from right to left. Since the bottom 29 bits of p
-	// are all ones, then by adding tmp2[0]*p to tmp2 we'll make tmp2[0] == 0.
-	// We can do that for 8 further limbs and then right shift to eliminate the
-	// extra factor of R.
-	for i := 0; ; i += 2 {
-		tmp2[i+1] += tmp2[i] >> 29
-		x = tmp2[i] & bottom29Bits
-		xMask = nonZeroToAllOnes(x)
-		tmp2[i] = 0
-
-		// The bounds calculations for this loop are tricky. Each iteration of
-		// the loop eliminates two words by adding values to words to their
-		// right.
-		//
-		// The following table contains the amounts added to each word (as an
-		// offset from the value of i at the top of the loop). The amounts are
-		// accounted for from the first and second half of the loop separately
-		// and are written as, for example, 28 to mean a value <2**28.
-		//
-		// Word:                   3   4   5   6   7   8   9   10
-		// Added in top half:     28  11      29  21  29  28
-		//                                        28  29
-		//                                            29
-		// Added in bottom half:      29  10      28  21  28   28
-		//                                            29
-		//
-		// The value that is currently offset 7 will be offset 5 for the next
-		// iteration and then offset 3 for the iteration after that. Therefore
-		// the total value added will be the values added at 7, 5 and 3.
-		//
-		// The following table accumulates these values. The sums at the bottom
-		// are written as, for example, 29+28, to mean a value < 2**29+2**28.
-		//
-		// Word:                   3   4   5   6   7   8   9  10  11  12  13
-		//                        28  11  10  29  21  29  28  28  28  28  28
-		//                            29  28  11  28  29  28  29  28  29  28
-		//                                    29  28  21  21  29  21  29  21
-		//                                        10  29  28  21  28  21  28
-		//                                        28  29  28  29  28  29  28
-		//                                            11  10  29  10  29  10
-		//                                            29  28  11  28  11
-		//                                                    29      29
-		//                        --------------------------------------------
-		//                                                30+ 31+ 30+ 31+ 30+
-		//                                                28+ 29+ 28+ 29+ 21+
-		//                                                21+ 28+ 21+ 28+ 10
-		//                                                10  21+ 10  21+
-		//                                                    11      11
-		//
-		// So the greatest amount is added to tmp2[10] and tmp2[12]. If
-		// tmp2[10/12] has an initial value of <2**29, then the maximum value
-		// will be < 2**31 + 2**30 + 2**28 + 2**21 + 2**11, which is < 2**32,
-		// as required.
-		tmp2[i+3] += (x << 10) & bottom28Bits
-		tmp2[i+4] += (x >> 18)
-
-		tmp2[i+6] += (x << 21) & bottom29Bits
-		tmp2[i+7] += x >> 8
-
-		// At position 200, which is the starting bit position for word 7, we
-		// have a factor of 0xf000000 = 2**28 - 2**24.
-		tmp2[i+7] += 0x10000000 & xMask
-		tmp2[i+8] += (x - 1) & xMask
-		tmp2[i+7] -= (x << 24) & bottom28Bits
-		tmp2[i+8] -= x >> 4
-
-		tmp2[i+8] += 0x20000000 & xMask
-		tmp2[i+8] -= x
-		tmp2[i+8] += (x << 28) & bottom29Bits
-		tmp2[i+9] += ((x >> 1) - 1) & xMask
-
-		if i+1 == p256Limbs {
-			break
-		}
-		tmp2[i+2] += tmp2[i+1] >> 28
-		x = tmp2[i+1] & bottom28Bits
-		xMask = nonZeroToAllOnes(x)
-		tmp2[i+1] = 0
-
-		tmp2[i+4] += (x << 11) & bottom29Bits
-		tmp2[i+5] += (x >> 18)
-
-		tmp2[i+7] += (x << 21) & bottom28Bits
-		tmp2[i+8] += x >> 7
-
-		// At position 199, which is the starting bit of the 8th word when
-		// dealing with a context starting on an odd word, we have a factor of
-		// 0x1e000000 = 2**29 - 2**25. Since we have not updated i, the 8th
-		// word from i+1 is i+8.
-		tmp2[i+8] += 0x20000000 & xMask
-		tmp2[i+9] += (x - 1) & xMask
-		tmp2[i+8] -= (x << 25) & bottom29Bits
-		tmp2[i+9] -= x >> 4
-
-		tmp2[i+9] += 0x10000000 & xMask
-		tmp2[i+9] -= x
-		tmp2[i+10] += (x - 1) & xMask
-	}
-
-	// We merge the right shift with a carry chain. The words above 2**257 have
-	// widths of 28,29,... which we need to correct when copying them down.
-	carry = 0
-	for i := 0; i < 8; i++ {
-		// The maximum value of tmp2[i + 9] occurs on the first iteration and
-		// is < 2**30+2**29+2**28. Adding 2**29 (from tmp2[i + 10]) is
-		// therefore safe.
-		out[i] = tmp2[i+9]
-		out[i] += carry
-		out[i] += (tmp2[i+10] << 28) & bottom29Bits
-		carry = out[i] >> 29
-		out[i] &= bottom29Bits
-
-		i++
-		out[i] = tmp2[i+9] >> 1
-		out[i] += carry
-		carry = out[i] >> 28
-		out[i] &= bottom28Bits
-	}
-
-	out[8] = tmp2[17]
-	out[8] += carry
-	carry = out[8] >> 29
-	out[8] &= bottom29Bits
-
-	p256ReduceCarry(out, carry)
-}
-
-// p256Square sets out=in*in.
-//
-// On entry: in[0,2,...] < 2**30, in[1,3,...] < 2**29.
-// On exit: out[0,2,...] < 2**30, out[1,3,...] < 2**29.
-func p256Square(out, in *[p256Limbs]uint32) {
-	var tmp [17]uint64
-
-	tmp[0] = uint64(in[0]) * uint64(in[0])
-	tmp[1] = uint64(in[0]) * (uint64(in[1]) << 1)
-	tmp[2] = uint64(in[0])*(uint64(in[2])<<1) +
-		uint64(in[1])*(uint64(in[1])<<1)
-	tmp[3] = uint64(in[0])*(uint64(in[3])<<1) +
-		uint64(in[1])*(uint64(in[2])<<1)
-	tmp[4] = uint64(in[0])*(uint64(in[4])<<1) +
-		uint64(in[1])*(uint64(in[3])<<2) +
-		uint64(in[2])*uint64(in[2])
-	tmp[5] = uint64(in[0])*(uint64(in[5])<<1) +
-		uint64(in[1])*(uint64(in[4])<<1) +
-		uint64(in[2])*(uint64(in[3])<<1)
-	tmp[6] = uint64(in[0])*(uint64(in[6])<<1) +
-		uint64(in[1])*(uint64(in[5])<<2) +
-		uint64(in[2])*(uint64(in[4])<<1) +
-		uint64(in[3])*(uint64(in[3])<<1)
-	tmp[7] = uint64(in[0])*(uint64(in[7])<<1) +
-		uint64(in[1])*(uint64(in[6])<<1) +
-		uint64(in[2])*(uint64(in[5])<<1) +
-		uint64(in[3])*(uint64(in[4])<<1)
-	// tmp[8] has the greatest value of 2**61 + 2**60 + 2**61 + 2**60 + 2**60,
-	// which is < 2**64 as required.
-	tmp[8] = uint64(in[0])*(uint64(in[8])<<1) +
-		uint64(in[1])*(uint64(in[7])<<2) +
-		uint64(in[2])*(uint64(in[6])<<1) +
-		uint64(in[3])*(uint64(in[5])<<2) +
-		uint64(in[4])*uint64(in[4])
-	tmp[9] = uint64(in[1])*(uint64(in[8])<<1) +
-		uint64(in[2])*(uint64(in[7])<<1) +
-		uint64(in[3])*(uint64(in[6])<<1) +
-		uint64(in[4])*(uint64(in[5])<<1)
-	tmp[10] = uint64(in[2])*(uint64(in[8])<<1) +
-		uint64(in[3])*(uint64(in[7])<<2) +
-		uint64(in[4])*(uint64(in[6])<<1) +
-		uint64(in[5])*(uint64(in[5])<<1)
-	tmp[11] = uint64(in[3])*(uint64(in[8])<<1) +
-		uint64(in[4])*(uint64(in[7])<<1) +
-		uint64(in[5])*(uint64(in[6])<<1)
-	tmp[12] = uint64(in[4])*(uint64(in[8])<<1) +
-		uint64(in[5])*(uint64(in[7])<<2) +
-		uint64(in[6])*uint64(in[6])
-	tmp[13] = uint64(in[5])*(uint64(in[8])<<1) +
-		uint64(in[6])*(uint64(in[7])<<1)
-	tmp[14] = uint64(in[6])*(uint64(in[8])<<1) +
-		uint64(in[7])*(uint64(in[7])<<1)
-	tmp[15] = uint64(in[7]) * (uint64(in[8]) << 1)
-	tmp[16] = uint64(in[8]) * uint64(in[8])
-
-	p256ReduceDegree(out, tmp)
-}
-
-// p256Mul sets out=in*in2.
-//
-// On entry: in[0,2,...] < 2**30, in[1,3,...] < 2**29 and
-//           in2[0,2,...] < 2**30, in2[1,3,...] < 2**29.
-// On exit: out[0,2,...] < 2**30, out[1,3,...] < 2**29.
-func p256Mul(out, in, in2 *[p256Limbs]uint32) {
-	var tmp [17]uint64
-
-	tmp[0] = uint64(in[0]) * uint64(in2[0])
-	tmp[1] = uint64(in[0])*(uint64(in2[1])<<0) +
-		uint64(in[1])*(uint64(in2[0])<<0)
-	tmp[2] = uint64(in[0])*(uint64(in2[2])<<0) +
-		uint64(in[1])*(uint64(in2[1])<<1) +
-		uint64(in[2])*(uint64(in2[0])<<0)
-	tmp[3] = uint64(in[0])*(uint64(in2[3])<<0) +
-		uint64(in[1])*(uint64(in2[2])<<0) +
-		uint64(in[2])*(uint64(in2[1])<<0) +
-		uint64(in[3])*(uint64(in2[0])<<0)
-	tmp[4] = uint64(in[0])*(uint64(in2[4])<<0) +
-		uint64(in[1])*(uint64(in2[3])<<1) +
-		uint64(in[2])*(uint64(in2[2])<<0) +
-		uint64(in[3])*(uint64(in2[1])<<1) +
-		uint64(in[4])*(uint64(in2[0])<<0)
-	tmp[5] = uint64(in[0])*(uint64(in2[5])<<0) +
-		uint64(in[1])*(uint64(in2[4])<<0) +
-		uint64(in[2])*(uint64(in2[3])<<0) +
-		uint64(in[3])*(uint64(in2[2])<<0) +
-		uint64(in[4])*(uint64(in2[1])<<0) +
-		uint64(in[5])*(uint64(in2[0])<<0)
-	tmp[6] = uint64(in[0])*(uint64(in2[6])<<0) +
-		uint64(in[1])*(uint64(in2[5])<<1) +
-		uint64(in[2])*(uint64(in2[4])<<0) +
-		uint64(in[3])*(uint64(in2[3])<<1) +
-		uint64(in[4])*(uint64(in2[2])<<0) +
-		uint64(in[5])*(uint64(in2[1])<<1) +
-		uint64(in[6])*(uint64(in2[0])<<0)
-	tmp[7] = uint64(in[0])*(uint64(in2[7])<<0) +
-		uint64(in[1])*(uint64(in2[6])<<0) +
-		uint64(in[2])*(uint64(in2[5])<<0) +
-		uint64(in[3])*(uint64(in2[4])<<0) +
-		uint64(in[4])*(uint64(in2[3])<<0) +
-		uint64(in[5])*(uint64(in2[2])<<0) +
-		uint64(in[6])*(uint64(in2[1])<<0) +
-		uint64(in[7])*(uint64(in2[0])<<0)
-	// tmp[8] has the greatest value but doesn't overflow. See logic in
-	// p256Square.
-	tmp[8] = uint64(in[0])*(uint64(in2[8])<<0) +
-		uint64(in[1])*(uint64(in2[7])<<1) +
-		uint64(in[2])*(uint64(in2[6])<<0) +
-		uint64(in[3])*(uint64(in2[5])<<1) +
-		uint64(in[4])*(uint64(in2[4])<<0) +
-		uint64(in[5])*(uint64(in2[3])<<1) +
-		uint64(in[6])*(uint64(in2[2])<<0) +
-		uint64(in[7])*(uint64(in2[1])<<1) +
-		uint64(in[8])*(uint64(in2[0])<<0)
-	tmp[9] = uint64(in[1])*(uint64(in2[8])<<0) +
-		uint64(in[2])*(uint64(in2[7])<<0) +
-		uint64(in[3])*(uint64(in2[6])<<0) +
-		uint64(in[4])*(uint64(in2[5])<<0) +
-		uint64(in[5])*(uint64(in2[4])<<0) +
-		uint64(in[6])*(uint64(in2[3])<<0) +
-		uint64(in[7])*(uint64(in2[2])<<0) +
-		uint64(in[8])*(uint64(in2[1])<<0)
-	tmp[10] = uint64(in[2])*(uint64(in2[8])<<0) +
-		uint64(in[3])*(uint64(in2[7])<<1) +
-		uint64(in[4])*(uint64(in2[6])<<0) +
-		uint64(in[5])*(uint64(in2[5])<<1) +
-		uint64(in[6])*(uint64(in2[4])<<0) +
-		uint64(in[7])*(uint64(in2[3])<<1) +
-		uint64(in[8])*(uint64(in2[2])<<0)
-	tmp[11] = uint64(in[3])*(uint64(in2[8])<<0) +
-		uint64(in[4])*(uint64(in2[7])<<0) +
-		uint64(in[5])*(uint64(in2[6])<<0) +
-		uint64(in[6])*(uint64(in2[5])<<0) +
-		uint64(in[7])*(uint64(in2[4])<<0) +
-		uint64(in[8])*(uint64(in2[3])<<0)
-	tmp[12] = uint64(in[4])*(uint64(in2[8])<<0) +
-		uint64(in[5])*(uint64(in2[7])<<1) +
-		uint64(in[6])*(uint64(in2[6])<<0) +
-		uint64(in[7])*(uint64(in2[5])<<1) +
-		uint64(in[8])*(uint64(in2[4])<<0)
-	tmp[13] = uint64(in[5])*(uint64(in2[8])<<0) +
-		uint64(in[6])*(uint64(in2[7])<<0) +
-		uint64(in[7])*(uint64(in2[6])<<0) +
-		uint64(in[8])*(uint64(in2[5])<<0)
-	tmp[14] = uint64(in[6])*(uint64(in2[8])<<0) +
-		uint64(in[7])*(uint64(in2[7])<<1) +
-		uint64(in[8])*(uint64(in2[6])<<0)
-	tmp[15] = uint64(in[7])*(uint64(in2[8])<<0) +
-		uint64(in[8])*(uint64(in2[7])<<0)
-	tmp[16] = uint64(in[8]) * (uint64(in2[8]) << 0)
-
-	p256ReduceDegree(out, tmp)
-}
-
-func p256Assign(out, in *[p256Limbs]uint32) {
-	*out = *in
-}
-
-// p256Invert calculates |out| = |in|^{-1}
-//
-// Based on Fermat's Little Theorem:
-//   a^p = a (mod p)
-//   a^{p-1} = 1 (mod p)
-//   a^{p-2} = a^{-1} (mod p)
-func p256Invert(out, in *[p256Limbs]uint32) {
-	var ftmp, ftmp2 [p256Limbs]uint32
-
-	// each e_I will hold |in|^{2^I - 1}
-	var e2, e4, e8, e16, e32, e64 [p256Limbs]uint32
-
-	p256Square(&ftmp, in)     // 2^1
-	p256Mul(&ftmp, in, &ftmp) // 2^2 - 2^0
-	p256Assign(&e2, &ftmp)
-	p256Square(&ftmp, &ftmp)   // 2^3 - 2^1
-	p256Square(&ftmp, &ftmp)   // 2^4 - 2^2
-	p256Mul(&ftmp, &ftmp, &e2) // 2^4 - 2^0
-	p256Assign(&e4, &ftmp)
-	p256Square(&ftmp, &ftmp)   // 2^5 - 2^1
-	p256Square(&ftmp, &ftmp)   // 2^6 - 2^2
-	p256Square(&ftmp, &ftmp)   // 2^7 - 2^3
-	p256Square(&ftmp, &ftmp)   // 2^8 - 2^4
-	p256Mul(&ftmp, &ftmp, &e4) // 2^8 - 2^0
-	p256Assign(&e8, &ftmp)
-	for i := 0; i < 8; i++ {
-		p256Square(&ftmp, &ftmp)
-	} // 2^16 - 2^8
-	p256Mul(&ftmp, &ftmp, &e8) // 2^16 - 2^0
-	p256Assign(&e16, &ftmp)
-	for i := 0; i < 16; i++ {
-		p256Square(&ftmp, &ftmp)
-	} // 2^32 - 2^16
-	p256Mul(&ftmp, &ftmp, &e16) // 2^32 - 2^0
-	p256Assign(&e32, &ftmp)
-	for i := 0; i < 32; i++ {
-		p256Square(&ftmp, &ftmp)
-	} // 2^64 - 2^32
-	p256Assign(&e64, &ftmp)
-	p256Mul(&ftmp, &ftmp, in) // 2^64 - 2^32 + 2^0
-	for i := 0; i < 192; i++ {
-		p256Square(&ftmp, &ftmp)
-	} // 2^256 - 2^224 + 2^192
-
-	p256Mul(&ftmp2, &e64, &e32) // 2^64 - 2^0
-	for i := 0; i < 16; i++ {
-		p256Square(&ftmp2, &ftmp2)
-	} // 2^80 - 2^16
-	p256Mul(&ftmp2, &ftmp2, &e16) // 2^80 - 2^0
-	for i := 0; i < 8; i++ {
-		p256Square(&ftmp2, &ftmp2)
-	} // 2^88 - 2^8
-	p256Mul(&ftmp2, &ftmp2, &e8) // 2^88 - 2^0
-	for i := 0; i < 4; i++ {
-		p256Square(&ftmp2, &ftmp2)
-	} // 2^92 - 2^4
-	p256Mul(&ftmp2, &ftmp2, &e4) // 2^92 - 2^0
-	p256Square(&ftmp2, &ftmp2)   // 2^93 - 2^1
-	p256Square(&ftmp2, &ftmp2)   // 2^94 - 2^2
-	p256Mul(&ftmp2, &ftmp2, &e2) // 2^94 - 2^0
-	p256Square(&ftmp2, &ftmp2)   // 2^95 - 2^1
-	p256Square(&ftmp2, &ftmp2)   // 2^96 - 2^2
-	p256Mul(&ftmp2, &ftmp2, in)  // 2^96 - 3
-
-	p256Mul(out, &ftmp2, &ftmp) // 2^256 - 2^224 + 2^192 + 2^96 - 3
-}
-
-// p256Scalar3 sets out=3*out.
-//
-// On entry: out[0,2,...] < 2**30, out[1,3,...] < 2**29.
-// On exit: out[0,2,...] < 2**30, out[1,3,...] < 2**29.
-func p256Scalar3(out *[p256Limbs]uint32) {
-	var carry uint32
-
-	for i := 0; ; i++ {
-		out[i] *= 3
-		out[i] += carry
-		carry = out[i] >> 29
-		out[i] &= bottom29Bits
-
-		i++
-		if i == p256Limbs {
-			break
-		}
-
-		out[i] *= 3
-		out[i] += carry
-		carry = out[i] >> 28
-		out[i] &= bottom28Bits
-	}
-
-	p256ReduceCarry(out, carry)
-}
-
-// p256Scalar4 sets out=4*out.
-//
-// On entry: out[0,2,...] < 2**30, out[1,3,...] < 2**29.
-// On exit: out[0,2,...] < 2**30, out[1,3,...] < 2**29.
-func p256Scalar4(out *[p256Limbs]uint32) {
-	var carry, nextCarry uint32
-
-	for i := 0; ; i++ {
-		nextCarry = out[i] >> 27
-		out[i] <<= 2
-		out[i] &= bottom29Bits
-		out[i] += carry
-		carry = nextCarry + (out[i] >> 29)
-		out[i] &= bottom29Bits
-
-		i++
-		if i == p256Limbs {
-			break
-		}
-		nextCarry = out[i] >> 26
-		out[i] <<= 2
-		out[i] &= bottom28Bits
-		out[i] += carry
-		carry = nextCarry + (out[i] >> 28)
-		out[i] &= bottom28Bits
-	}
-
-	p256ReduceCarry(out, carry)
-}
-
-// p256Scalar8 sets out=8*out.
-//
-// On entry: out[0,2,...] < 2**30, out[1,3,...] < 2**29.
-// On exit: out[0,2,...] < 2**30, out[1,3,...] < 2**29.
-func p256Scalar8(out *[p256Limbs]uint32) {
-	var carry, nextCarry uint32
-
-	for i := 0; ; i++ {
-		nextCarry = out[i] >> 26
-		out[i] <<= 3
-		out[i] &= bottom29Bits
-		out[i] += carry
-		carry = nextCarry + (out[i] >> 29)
-		out[i] &= bottom29Bits
-
-		i++
-		if i == p256Limbs {
-			break
-		}
-		nextCarry = out[i] >> 25
-		out[i] <<= 3
-		out[i] &= bottom28Bits
-		out[i] += carry
-		carry = nextCarry + (out[i] >> 28)
-		out[i] &= bottom28Bits
-	}
-
-	p256ReduceCarry(out, carry)
-}
-
-// Group operations:
-//
-// Elements of the elliptic curve group are represented in Jacobian
-// coordinates: (x, y, z). An affine point (x', y') is x'=x/z**2, y'=y/z**3 in
-// Jacobian form.
-
-// p256PointDouble sets {xOut,yOut,zOut} = 2*{x,y,z}.
-//
-// See http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
-func p256PointDouble(xOut, yOut, zOut, x, y, z *[p256Limbs]uint32) {
-	var delta, gamma, alpha, beta, tmp, tmp2 [p256Limbs]uint32
-
-	p256Square(&delta, z)
-	p256Square(&gamma, y)
-	p256Mul(&beta, x, &gamma)
-
-	p256Sum(&tmp, x, &delta)
-	p256Diff(&tmp2, x, &delta)
-	p256Mul(&alpha, &tmp, &tmp2)
-	p256Scalar3(&alpha)
-
-	p256Sum(&tmp, y, z)
-	p256Square(&tmp, &tmp)
-	p256Diff(&tmp, &tmp, &gamma)
-	p256Diff(zOut, &tmp, &delta)
-
-	p256Scalar4(&beta)
-	p256Square(xOut, &alpha)
-	p256Diff(xOut, xOut, &beta)
-	p256Diff(xOut, xOut, &beta)
-
-	p256Diff(&tmp, &beta, xOut)
-	p256Mul(&tmp, &alpha, &tmp)
-	p256Square(&tmp2, &gamma)
-	p256Scalar8(&tmp2)
-	p256Diff(yOut, &tmp, &tmp2)
-}
-
-// p256PointAddMixed sets {xOut,yOut,zOut} = {x1,y1,z1} + {x2,y2,1}.
-// (i.e. the second point is affine.)
-//
-// See http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl
-//
-// Note that this function does not handle P+P, infinity+P nor P+infinity
-// correctly.
-func p256PointAddMixed(xOut, yOut, zOut, x1, y1, z1, x2, y2 *[p256Limbs]uint32) {
-	var z1z1, z1z1z1, s2, u2, h, i, j, r, rr, v, tmp [p256Limbs]uint32
-
-	p256Square(&z1z1, z1)
-	p256Sum(&tmp, z1, z1)
-
-	p256Mul(&u2, x2, &z1z1)
-	p256Mul(&z1z1z1, z1, &z1z1)
-	p256Mul(&s2, y2, &z1z1z1)
-	p256Diff(&h, &u2, x1)
-	p256Sum(&i, &h, &h)
-	p256Square(&i, &i)
-	p256Mul(&j, &h, &i)
-	p256Diff(&r, &s2, y1)
-	p256Sum(&r, &r, &r)
-	p256Mul(&v, x1, &i)
-
-	p256Mul(zOut, &tmp, &h)
-	p256Square(&rr, &r)
-	p256Diff(xOut, &rr, &j)
-	p256Diff(xOut, xOut, &v)
-	p256Diff(xOut, xOut, &v)
-
-	p256Diff(&tmp, &v, xOut)
-	p256Mul(yOut, &tmp, &r)
-	p256Mul(&tmp, y1, &j)
-	p256Diff(yOut, yOut, &tmp)
-	p256Diff(yOut, yOut, &tmp)
-}
-
-// p256PointAdd sets {xOut,yOut,zOut} = {x1,y1,z1} + {x2,y2,z2}.
-//
-// See http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl
-//
-// Note that this function does not handle P+P, infinity+P nor P+infinity
-// correctly.
-func p256PointAdd(xOut, yOut, zOut, x1, y1, z1, x2, y2, z2 *[p256Limbs]uint32) {
-	var z1z1, z1z1z1, z2z2, z2z2z2, s1, s2, u1, u2, h, i, j, r, rr, v, tmp [p256Limbs]uint32
-
-	p256Square(&z1z1, z1)
-	p256Square(&z2z2, z2)
-	p256Mul(&u1, x1, &z2z2)
-
-	p256Sum(&tmp, z1, z2)
-	p256Square(&tmp, &tmp)
-	p256Diff(&tmp, &tmp, &z1z1)
-	p256Diff(&tmp, &tmp, &z2z2)
-
-	p256Mul(&z2z2z2, z2, &z2z2)
-	p256Mul(&s1, y1, &z2z2z2)
-
-	p256Mul(&u2, x2, &z1z1)
-	p256Mul(&z1z1z1, z1, &z1z1)
-	p256Mul(&s2, y2, &z1z1z1)
-	p256Diff(&h, &u2, &u1)
-	p256Sum(&i, &h, &h)
-	p256Square(&i, &i)
-	p256Mul(&j, &h, &i)
-	p256Diff(&r, &s2, &s1)
-	p256Sum(&r, &r, &r)
-	p256Mul(&v, &u1, &i)
-
-	p256Mul(zOut, &tmp, &h)
-	p256Square(&rr, &r)
-	p256Diff(xOut, &rr, &j)
-	p256Diff(xOut, xOut, &v)
-	p256Diff(xOut, xOut, &v)
-
-	p256Diff(&tmp, &v, xOut)
-	p256Mul(yOut, &tmp, &r)
-	p256Mul(&tmp, &s1, &j)
-	p256Diff(yOut, yOut, &tmp)
-	p256Diff(yOut, yOut, &tmp)
-}
-
-// p256CopyConditional sets out=in if mask = 0xffffffff in constant time.
-//
-// On entry: mask is either 0 or 0xffffffff.
-func p256CopyConditional(out, in *[p256Limbs]uint32, mask uint32) {
-	for i := 0; i < p256Limbs; i++ {
-		tmp := mask & (in[i] ^ out[i])
-		out[i] ^= tmp
-	}
-}
-
-// p256SelectAffinePoint sets {out_x,out_y} to the index'th entry of table.
-// On entry: index < 16, table[0] must be zero.
-func p256SelectAffinePoint(xOut, yOut *[p256Limbs]uint32, table []uint32, index uint32) {
-	for i := range xOut {
-		xOut[i] = 0
-	}
-	for i := range yOut {
-		yOut[i] = 0
-	}
-
-	for i := uint32(1); i < 16; i++ {
-		mask := i ^ index
-		mask |= mask >> 2
-		mask |= mask >> 1
-		mask &= 1
-		mask--
-		for j := range xOut {
-			xOut[j] |= table[0] & mask
-			table = table[1:]
-		}
-		for j := range yOut {
-			yOut[j] |= table[0] & mask
-			table = table[1:]
-		}
-	}
-}
-
-// p256SelectJacobianPoint sets {out_x,out_y,out_z} to the index'th entry of
-// table.
-// On entry: index < 16, table[0] must be zero.
-func p256SelectJacobianPoint(xOut, yOut, zOut *[p256Limbs]uint32, table *[16][3][p256Limbs]uint32, index uint32) {
-	for i := range xOut {
-		xOut[i] = 0
-	}
-	for i := range yOut {
-		yOut[i] = 0
-	}
-	for i := range zOut {
-		zOut[i] = 0
-	}
-
-	// The implicit value at index 0 is all zero. We don't need to perform that
-	// iteration of the loop because we already set out_* to zero.
-	for i := uint32(1); i < 16; i++ {
-		mask := i ^ index
-		mask |= mask >> 2
-		mask |= mask >> 1
-		mask &= 1
-		mask--
-		for j := range xOut {
-			xOut[j] |= table[i][0][j] & mask
-		}
-		for j := range yOut {
-			yOut[j] |= table[i][1][j] & mask
-		}
-		for j := range zOut {
-			zOut[j] |= table[i][2][j] & mask
-		}
-	}
-}
-
-// p256GetBit returns the bit'th bit of scalar.
-func p256GetBit(scalar *[32]uint8, bit uint) uint32 {
-	return uint32(((scalar[bit>>3]) >> (bit & 7)) & 1)
-}
-
-// p256ScalarBaseMult sets {xOut,yOut,zOut} = scalar*G where scalar is a
-// little-endian number. Note that the value of scalar must be less than the
-// order of the group.
-func p256ScalarBaseMult(xOut, yOut, zOut *[p256Limbs]uint32, scalar *[32]uint8) {
-	nIsInfinityMask := ^uint32(0)
-	var pIsNoninfiniteMask, mask, tableOffset uint32
-	var px, py, tx, ty, tz [p256Limbs]uint32
-
-	for i := range xOut {
-		xOut[i] = 0
-	}
-	for i := range yOut {
-		yOut[i] = 0
-	}
-	for i := range zOut {
-		zOut[i] = 0
-	}
-
-	// The loop adds bits at positions 0, 64, 128 and 192, followed by
-	// positions 32,96,160 and 224 and does this 32 times.
-	for i := uint(0); i < 32; i++ {
-		if i != 0 {
-			p256PointDouble(xOut, yOut, zOut, xOut, yOut, zOut)
-		}
-		tableOffset = 0
-		for j := uint(0); j <= 32; j += 32 {
-			bit0 := p256GetBit(scalar, 31-i+j)
-			bit1 := p256GetBit(scalar, 95-i+j)
-			bit2 := p256GetBit(scalar, 159-i+j)
-			bit3 := p256GetBit(scalar, 223-i+j)
-			index := bit0 | (bit1 << 1) | (bit2 << 2) | (bit3 << 3)
-
-			p256SelectAffinePoint(&px, &py, p256Precomputed[tableOffset:], index)
-			tableOffset += 30 * p256Limbs
-
-			// Since scalar is less than the order of the group, we know that
-			// {xOut,yOut,zOut} != {px,py,1}, unless both are zero, which we handle
-			// below.
-			p256PointAddMixed(&tx, &ty, &tz, xOut, yOut, zOut, &px, &py)
-			// The result of pointAddMixed is incorrect if {xOut,yOut,zOut} is zero
-			// (a.k.a.  the point at infinity). We handle that situation by
-			// copying the point from the table.
-			p256CopyConditional(xOut, &px, nIsInfinityMask)
-			p256CopyConditional(yOut, &py, nIsInfinityMask)
-			p256CopyConditional(zOut, &p256One, nIsInfinityMask)
-
-			// Equally, the result is also wrong if the point from the table is
-			// zero, which happens when the index is zero. We handle that by
-			// only copying from {tx,ty,tz} to {xOut,yOut,zOut} if index != 0.
-			pIsNoninfiniteMask = nonZeroToAllOnes(index)
-			mask = pIsNoninfiniteMask & ^nIsInfinityMask
-			p256CopyConditional(xOut, &tx, mask)
-			p256CopyConditional(yOut, &ty, mask)
-			p256CopyConditional(zOut, &tz, mask)
-			// If p was not zero, then n is now non-zero.
-			nIsInfinityMask &= ^pIsNoninfiniteMask
-		}
-	}
-}
-
-// p256PointToAffine converts a Jacobian point to an affine point. If the input
-// is the point at infinity then it returns (0, 0) in constant time.
-func p256PointToAffine(xOut, yOut, x, y, z *[p256Limbs]uint32) {
-	var zInv, zInvSq [p256Limbs]uint32
-
-	p256Invert(&zInv, z)
-	p256Square(&zInvSq, &zInv)
-	p256Mul(xOut, x, &zInvSq)
-	p256Mul(&zInv, &zInv, &zInvSq)
-	p256Mul(yOut, y, &zInv)
-}
-
-// p256ToAffine returns a pair of *big.Int containing the affine representation
-// of {x,y,z}.
-func p256ToAffine(x, y, z *[p256Limbs]uint32) (xOut, yOut *big.Int) {
-	var xx, yy [p256Limbs]uint32
-	p256PointToAffine(&xx, &yy, x, y, z)
-	return p256ToBig(&xx), p256ToBig(&yy)
-}
-
-// p256ScalarMult sets {xOut,yOut,zOut} = scalar*{x,y}.
-func p256ScalarMult(xOut, yOut, zOut, x, y *[p256Limbs]uint32, scalar *[32]uint8) {
-	var px, py, pz, tx, ty, tz [p256Limbs]uint32
-	var precomp [16][3][p256Limbs]uint32
-	var nIsInfinityMask, index, pIsNoninfiniteMask, mask uint32
-
-	// We precompute 0,1,2,... times {x,y}.
-	precomp[1][0] = *x
-	precomp[1][1] = *y
-	precomp[1][2] = p256One
-
-	for i := 2; i < 16; i += 2 {
-		p256PointDouble(&precomp[i][0], &precomp[i][1], &precomp[i][2], &precomp[i/2][0], &precomp[i/2][1], &precomp[i/2][2])
-		p256PointAddMixed(&precomp[i+1][0], &precomp[i+1][1], &precomp[i+1][2], &precomp[i][0], &precomp[i][1], &precomp[i][2], x, y)
-	}
-
-	for i := range xOut {
-		xOut[i] = 0
-	}
-	for i := range yOut {
-		yOut[i] = 0
-	}
-	for i := range zOut {
-		zOut[i] = 0
-	}
-	nIsInfinityMask = ^uint32(0)
-
-	// We add in a window of four bits each iteration and do this 64 times.
-	for i := 0; i < 64; i++ {
-		if i != 0 {
-			p256PointDouble(xOut, yOut, zOut, xOut, yOut, zOut)
-			p256PointDouble(xOut, yOut, zOut, xOut, yOut, zOut)
-			p256PointDouble(xOut, yOut, zOut, xOut, yOut, zOut)
-			p256PointDouble(xOut, yOut, zOut, xOut, yOut, zOut)
-		}
-
-		index = uint32(scalar[31-i/2])
-		if (i & 1) == 1 {
-			index &= 15
-		} else {
-			index >>= 4
-		}
-
-		// See the comments in scalarBaseMult about handling infinities.
-		p256SelectJacobianPoint(&px, &py, &pz, &precomp, index)
-		p256PointAdd(&tx, &ty, &tz, xOut, yOut, zOut, &px, &py, &pz)
-		p256CopyConditional(xOut, &px, nIsInfinityMask)
-		p256CopyConditional(yOut, &py, nIsInfinityMask)
-		p256CopyConditional(zOut, &pz, nIsInfinityMask)
-
-		pIsNoninfiniteMask = nonZeroToAllOnes(index)
-		mask = pIsNoninfiniteMask & ^nIsInfinityMask
-		p256CopyConditional(xOut, &tx, mask)
-		p256CopyConditional(yOut, &ty, mask)
-		p256CopyConditional(zOut, &tz, mask)
-		nIsInfinityMask &= ^pIsNoninfiniteMask
-	}
-}
-
-// p256FromBig sets out = R*in.
-func p256FromBig(out *[p256Limbs]uint32, in *big.Int) {
-	tmp := new(big.Int).Lsh(in, 257)
-	tmp.Mod(tmp, p256.P)
-
-	for i := 0; i < p256Limbs; i++ {
-		if bits := tmp.Bits(); len(bits) > 0 {
-			out[i] = uint32(bits[0]) & bottom29Bits
-		} else {
-			out[i] = 0
-		}
-		tmp.Rsh(tmp, 29)
-
-		i++
-		if i == p256Limbs {
-			break
-		}
-
-		if bits := tmp.Bits(); len(bits) > 0 {
-			out[i] = uint32(bits[0]) & bottom28Bits
-		} else {
-			out[i] = 0
-		}
-		tmp.Rsh(tmp, 28)
-	}
-}
-
-// p256ToBig returns a *big.Int containing the value of in.
-func p256ToBig(in *[p256Limbs]uint32) *big.Int {
-	result, tmp := new(big.Int), new(big.Int)
-
-	result.SetInt64(int64(in[p256Limbs-1]))
-	for i := p256Limbs - 2; i >= 0; i-- {
-		if (i & 1) == 0 {
-			result.Lsh(result, 29)
-		} else {
-			result.Lsh(result, 28)
-		}
-		tmp.SetInt64(int64(in[i]))
-		result.Add(result, tmp)
-	}
-
-	result.Mul(result, p256RInverse)
-	result.Mod(result, p256.P)
-	return result
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/hmac/hmac.go b/third_party/gofrontend/libgo/go/crypto/hmac/hmac.go
deleted file mode 100644
index e0cc1d6..0000000
--- a/third_party/gofrontend/libgo/go/crypto/hmac/hmac.go
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package hmac implements the Keyed-Hash Message Authentication Code (HMAC) as
-defined in U.S. Federal Information Processing Standards Publication 198.
-An HMAC is a cryptographic hash that uses a key to sign a message.
-The receiver verifies the hash by recomputing it using the same key.
-
-Receivers should be careful to use Equal to compare MACs in order to avoid
-timing side-channels:
-
-	// CheckMAC reports whether messageMAC is a valid HMAC tag for message.
-	func CheckMAC(message, messageMAC, key []byte) bool {
-		mac := hmac.New(sha256.New, key)
-		mac.Write(message)
-		expectedMAC := mac.Sum(nil)
-		return hmac.Equal(messageMAC, expectedMAC)
-	}
-*/
-package hmac
-
-import (
-	"crypto/subtle"
-	"hash"
-)
-
-// FIPS 198:
-// http://csrc.nist.gov/publications/fips/fips198/fips-198a.pdf
-
-// key is zero padded to the block size of the hash function
-// ipad = 0x36 byte repeated for key length
-// opad = 0x5c byte repeated for key length
-// hmac = H([key ^ opad] H([key ^ ipad] text))
-
-type hmac struct {
-	size         int
-	blocksize    int
-	key, tmp     []byte
-	outer, inner hash.Hash
-}
-
-func (h *hmac) tmpPad(xor byte) {
-	for i, k := range h.key {
-		h.tmp[i] = xor ^ k
-	}
-	for i := len(h.key); i < h.blocksize; i++ {
-		h.tmp[i] = xor
-	}
-}
-
-func (h *hmac) Sum(in []byte) []byte {
-	origLen := len(in)
-	in = h.inner.Sum(in)
-	h.tmpPad(0x5c)
-	copy(h.tmp[h.blocksize:], in[origLen:])
-	h.outer.Reset()
-	h.outer.Write(h.tmp)
-	return h.outer.Sum(in[:origLen])
-}
-
-func (h *hmac) Write(p []byte) (n int, err error) {
-	return h.inner.Write(p)
-}
-
-func (h *hmac) Size() int { return h.size }
-
-func (h *hmac) BlockSize() int { return h.blocksize }
-
-func (h *hmac) Reset() {
-	h.inner.Reset()
-	h.tmpPad(0x36)
-	h.inner.Write(h.tmp[:h.blocksize])
-}
-
-// New returns a new HMAC hash using the given hash.Hash type and key.
-func New(h func() hash.Hash, key []byte) hash.Hash {
-	hm := new(hmac)
-	hm.outer = h()
-	hm.inner = h()
-	hm.size = hm.inner.Size()
-	hm.blocksize = hm.inner.BlockSize()
-	hm.tmp = make([]byte, hm.blocksize+hm.size)
-	if len(key) > hm.blocksize {
-		// If key is too big, hash it.
-		hm.outer.Write(key)
-		key = hm.outer.Sum(nil)
-	}
-	hm.key = make([]byte, len(key))
-	copy(hm.key, key)
-	hm.Reset()
-	return hm
-}
-
-// Equal compares two MACs for equality without leaking timing information.
-func Equal(mac1, mac2 []byte) bool {
-	// We don't have to be constant time if the lengths of the MACs are
-	// different as that suggests that a completely different hash function
-	// was used.
-	return len(mac1) == len(mac2) && subtle.ConstantTimeCompare(mac1, mac2) == 1
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/hmac/hmac_test.go b/third_party/gofrontend/libgo/go/crypto/hmac/hmac_test.go
deleted file mode 100644
index e80b7e0..0000000
--- a/third_party/gofrontend/libgo/go/crypto/hmac/hmac_test.go
+++ /dev/null
@@ -1,570 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package hmac
-
-import (
-	"crypto/md5"
-	"crypto/sha1"
-	"crypto/sha256"
-	"crypto/sha512"
-	"fmt"
-	"hash"
-	"testing"
-)
-
-type hmacTest struct {
-	hash      func() hash.Hash
-	key       []byte
-	in        []byte
-	out       string
-	size      int
-	blocksize int
-}
-
-var hmacTests = []hmacTest{
-	// Tests from US FIPS 198
-	// http://csrc.nist.gov/publications/fips/fips198/fips-198a.pdf
-	{
-		sha1.New,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-		},
-		[]byte("Sample #1"),
-		"4f4ca3d5d68ba7cc0a1208c9c61e9c5da0403c0a",
-		sha1.Size,
-		sha1.BlockSize,
-	},
-	{
-		sha1.New,
-		[]byte{
-			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-			0x40, 0x41, 0x42, 0x43,
-		},
-		[]byte("Sample #2"),
-		"0922d3405faa3d194f82a45830737d5cc6c75d24",
-		sha1.Size,
-		sha1.BlockSize,
-	},
-	{
-		sha1.New,
-		[]byte{
-			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
-			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
-			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-			0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
-			0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-			0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
-			0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-			0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-			0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-			0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
-			0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
-			0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
-			0xb0, 0xb1, 0xb2, 0xb3,
-		},
-		[]byte("Sample #3"),
-		"bcf41eab8bb2d802f3d05caf7cb092ecf8d1a3aa",
-		sha1.Size,
-		sha1.BlockSize,
-	},
-
-	// Test from Plan 9.
-	{
-		md5.New,
-		[]byte("Jefe"),
-		[]byte("what do ya want for nothing?"),
-		"750c783e6ab0b503eaa86e310a5db738",
-		md5.Size,
-		md5.BlockSize,
-	},
-
-	// Tests from RFC 4231
-	{
-		sha256.New,
-		[]byte{
-			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-			0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-			0x0b, 0x0b, 0x0b, 0x0b,
-		},
-		[]byte("Hi There"),
-		"b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7",
-		sha256.Size,
-		sha256.BlockSize,
-	},
-	{
-		sha256.New,
-		[]byte("Jefe"),
-		[]byte("what do ya want for nothing?"),
-		"5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843",
-		sha256.Size,
-		sha256.BlockSize,
-	},
-	{
-		sha256.New,
-		[]byte{
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa,
-		},
-		[]byte{
-			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-			0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-			0xdd, 0xdd,
-		},
-		"773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe",
-		sha256.Size,
-		sha256.BlockSize,
-	},
-	{
-		sha256.New,
-		[]byte{
-			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-			0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-			0x19,
-		},
-		[]byte{
-			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-			0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-			0xcd, 0xcd,
-		},
-		"82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b",
-		sha256.Size,
-		sha256.BlockSize,
-	},
-	{
-		sha256.New,
-		[]byte{
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa,
-		},
-		[]byte("Test Using Larger Than Block-Size Key - Hash Key First"),
-		"60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54",
-		sha256.Size,
-		sha256.BlockSize,
-	},
-	{
-		sha256.New,
-		[]byte{
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-			0xaa, 0xaa, 0xaa,
-		},
-		[]byte("This is a test using a larger than block-size key " +
-			"and a larger than block-size data. The key needs to " +
-			"be hashed before being used by the HMAC algorithm."),
-		"9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2",
-		sha256.Size,
-		sha256.BlockSize,
-	},
-
-	// Tests from http://csrc.nist.gov/groups/ST/toolkit/examples.html
-	// (truncated tag tests are left out)
-	{
-		sha1.New,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-		},
-		[]byte("Sample message for keylen=blocklen"),
-		"5fd596ee78d5553c8ff4e72d266dfd192366da29",
-		sha1.Size,
-		sha1.BlockSize,
-	},
-	{
-		sha1.New,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13,
-		},
-		[]byte("Sample message for keylen<blocklen"),
-		"4c99ff0cb1b31bd33f8431dbaf4d17fcd356a807",
-		sha1.Size,
-		sha1.BlockSize,
-	},
-	{
-		sha1.New,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
-			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
-			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
-			0x60, 0x61, 0x62, 0x63,
-		},
-		[]byte("Sample message for keylen=blocklen"),
-		"2d51b2f7750e410584662e38f133435f4c4fd42a",
-		sha1.Size,
-		sha1.BlockSize,
-	},
-	{
-		sha256.New224,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-		},
-		[]byte("Sample message for keylen=blocklen"),
-		"c7405e3ae058e8cd30b08b4140248581ed174cb34e1224bcc1efc81b",
-		sha256.Size224,
-		sha256.BlockSize,
-	},
-	{
-		sha256.New224,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b,
-		},
-		[]byte("Sample message for keylen<blocklen"),
-		"e3d249a8cfb67ef8b7a169e9a0a599714a2cecba65999a51beb8fbbe",
-		sha256.Size224,
-		sha256.BlockSize,
-	},
-	{
-		sha256.New224,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
-			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
-			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
-			0x60, 0x61, 0x62, 0x63,
-		},
-		[]byte("Sample message for keylen=blocklen"),
-		"91c52509e5af8531601ae6230099d90bef88aaefb961f4080abc014d",
-		sha256.Size224,
-		sha256.BlockSize,
-	},
-	{
-		sha256.New,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-		},
-		[]byte("Sample message for keylen=blocklen"),
-		"8bb9a1db9806f20df7f77b82138c7914d174d59e13dc4d0169c9057b133e1d62",
-		sha256.Size,
-		sha256.BlockSize,
-	},
-	{
-		sha256.New,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-		},
-		[]byte("Sample message for keylen<blocklen"),
-		"a28cf43130ee696a98f14a37678b56bcfcbdd9e5cf69717fecf5480f0ebdf790",
-		sha256.Size,
-		sha256.BlockSize,
-	},
-	{
-		sha256.New,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
-			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
-			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
-			0x60, 0x61, 0x62, 0x63,
-		},
-		[]byte("Sample message for keylen=blocklen"),
-		"bdccb6c72ddeadb500ae768386cb38cc41c63dbb0878ddb9c7a38a431b78378d",
-		sha256.Size,
-		sha256.BlockSize,
-	},
-	{
-		sha512.New384,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
-			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
-			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
-			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-			0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
-			0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-			0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
-		},
-		[]byte("Sample message for keylen=blocklen"),
-		"63c5daa5e651847ca897c95814ab830bededc7d25e83eef9195cd45857a37f448947858f5af50cc2b1b730ddf29671a9",
-		sha512.Size384,
-		sha512.BlockSize,
-	},
-	{
-		sha512.New384,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-		},
-		[]byte("Sample message for keylen<blocklen"),
-		"6eb242bdbb582ca17bebfa481b1e23211464d2b7f8c20b9ff2201637b93646af5ae9ac316e98db45d9cae773675eeed0",
-		sha512.Size384,
-		sha512.BlockSize,
-	},
-	{
-		sha512.New384,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
-			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
-			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
-			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-			0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
-			0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-			0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
-			0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-			0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-			0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-			0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
-			0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
-			0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
-			0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
-			0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
-			0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
-		},
-		[]byte("Sample message for keylen=blocklen"),
-		"5b664436df69b0ca22551231a3f0a3d5b4f97991713cfa84bff4d0792eff96c27dccbbb6f79b65d548b40e8564cef594",
-		sha512.Size384,
-		sha512.BlockSize,
-	},
-	{
-		sha512.New,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
-			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
-			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
-			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-			0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
-			0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-			0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
-		},
-		[]byte("Sample message for keylen=blocklen"),
-		"fc25e240658ca785b7a811a8d3f7b4ca" +
-			"48cfa26a8a366bf2cd1f836b05fcb024bd36853081811d6c" +
-			"ea4216ebad79da1cfcb95ea4586b8a0ce356596a55fb1347",
-		sha512.Size,
-		sha512.BlockSize,
-	},
-	{
-		sha512.New,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-		},
-		[]byte("Sample message for keylen<blocklen"),
-		"fd44c18bda0bb0a6ce0e82b031bf2818" +
-			"f6539bd56ec00bdc10a8a2d730b3634de2545d639b0f2cf7" +
-			"10d0692c72a1896f1f211c2b922d1a96c392e07e7ea9fedc",
-		sha512.Size,
-		sha512.BlockSize,
-	},
-	{
-		sha512.New,
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-			0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-			0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-			0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-			0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-			0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-			0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-			0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-			0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-			0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
-			0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
-			0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
-			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-			0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
-			0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-			0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
-			0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-			0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-			0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-			0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
-			0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
-			0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
-			0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
-			0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
-			0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
-		},
-		[]byte("Sample message for keylen=blocklen"),
-		"d93ec8d2de1ad2a9957cb9b83f14e76a" +
-			"d6b5e0cce285079a127d3b14bccb7aa7286d4ac0d4ce6421" +
-			"5f2bc9e6870b33d97438be4aaa20cda5c5a912b48b8e27f3",
-		sha512.Size,
-		sha512.BlockSize,
-	},
-}
-
-func TestHMAC(t *testing.T) {
-	for i, tt := range hmacTests {
-		h := New(tt.hash, tt.key)
-		if s := h.Size(); s != tt.size {
-			t.Errorf("Size: got %v, want %v", s, tt.size)
-		}
-		if b := h.BlockSize(); b != tt.blocksize {
-			t.Errorf("BlockSize: got %v, want %v", b, tt.blocksize)
-		}
-		for j := 0; j < 2; j++ {
-			n, err := h.Write(tt.in)
-			if n != len(tt.in) || err != nil {
-				t.Errorf("test %d.%d: Write(%d) = %d, %v", i, j, len(tt.in), n, err)
-				continue
-			}
-
-			// Repetitive Sum() calls should return the same value
-			for k := 0; k < 2; k++ {
-				sum := fmt.Sprintf("%x", h.Sum(nil))
-				if sum != tt.out {
-					t.Errorf("test %d.%d.%d: have %s want %s\n", i, j, k, sum, tt.out)
-				}
-			}
-
-			// Second iteration: make sure reset works.
-			h.Reset()
-		}
-	}
-}
-
-func TestEqual(t *testing.T) {
-	a := []byte("test")
-	b := []byte("test1")
-	c := []byte("test2")
-
-	if !Equal(b, b) {
-		t.Error("Equal failed with equal arguments")
-	}
-	if Equal(a, b) {
-		t.Error("Equal accepted a prefix of the second argument")
-	}
-	if Equal(b, a) {
-		t.Error("Equal accepted a prefix of the first argument")
-	}
-	if Equal(b, c) {
-		t.Error("Equal accepted unequal slices")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/md5/gen.go b/third_party/gofrontend/libgo/go/crypto/md5/gen.go
deleted file mode 100644
index 8cd0a63..0000000
--- a/third_party/gofrontend/libgo/go/crypto/md5/gen.go
+++ /dev/null
@@ -1,331 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// This program generates md5block.go
-// Invoke as
-//
-//	go run gen.go [-full] -output md5block.go
-//
-// The -full flag causes the generated code to do a full
-// (16x) unrolling instead of a 4x unrolling.
-
-package main
-
-import (
-	"bytes"
-	"flag"
-	"go/format"
-	"io/ioutil"
-	"log"
-	"strings"
-	"text/template"
-)
-
-var filename = flag.String("output", "md5block.go", "output file name")
-
-func main() {
-	flag.Parse()
-
-	var buf bytes.Buffer
-
-	t := template.Must(template.New("main").Funcs(funcs).Parse(program))
-	if err := t.Execute(&buf, data); err != nil {
-		log.Fatal(err)
-	}
-
-	data, err := format.Source(buf.Bytes())
-	if err != nil {
-		log.Fatal(err)
-	}
-	err = ioutil.WriteFile(*filename, data, 0644)
-	if err != nil {
-		log.Fatal(err)
-	}
-}
-
-type Data struct {
-	a, b, c, d string
-	Shift1     []int
-	Shift2     []int
-	Shift3     []int
-	Shift4     []int
-	Table1     []uint32
-	Table2     []uint32
-	Table3     []uint32
-	Table4     []uint32
-	Full       bool
-}
-
-var funcs = template.FuncMap{
-	"dup":     dup,
-	"relabel": relabel,
-	"rotate":  rotate,
-}
-
-func dup(count int, x []int) []int {
-	var out []int
-	for i := 0; i < count; i++ {
-		out = append(out, x...)
-	}
-	return out
-}
-
-func relabel(s string) string {
-	return strings.NewReplacer("a", data.a, "b", data.b, "c", data.c, "d", data.d).Replace(s)
-}
-
-func rotate() string {
-	data.a, data.b, data.c, data.d = data.d, data.a, data.b, data.c
-	return "" // no output
-}
-
-func init() {
-	flag.BoolVar(&data.Full, "full", false, "complete unrolling")
-}
-
-var data = Data{
-	a:      "a",
-	b:      "b",
-	c:      "c",
-	d:      "d",
-	Shift1: []int{7, 12, 17, 22},
-	Shift2: []int{5, 9, 14, 20},
-	Shift3: []int{4, 11, 16, 23},
-	Shift4: []int{6, 10, 15, 21},
-
-	// table[i] = int((1<<32) * abs(sin(i+1 radians))).
-	Table1: []uint32{
-		// round 1
-		0xd76aa478,
-		0xe8c7b756,
-		0x242070db,
-		0xc1bdceee,
-		0xf57c0faf,
-		0x4787c62a,
-		0xa8304613,
-		0xfd469501,
-		0x698098d8,
-		0x8b44f7af,
-		0xffff5bb1,
-		0x895cd7be,
-		0x6b901122,
-		0xfd987193,
-		0xa679438e,
-		0x49b40821,
-	},
-	Table2: []uint32{
-		// round 2
-		0xf61e2562,
-		0xc040b340,
-		0x265e5a51,
-		0xe9b6c7aa,
-		0xd62f105d,
-		0x2441453,
-		0xd8a1e681,
-		0xe7d3fbc8,
-		0x21e1cde6,
-		0xc33707d6,
-		0xf4d50d87,
-		0x455a14ed,
-		0xa9e3e905,
-		0xfcefa3f8,
-		0x676f02d9,
-		0x8d2a4c8a,
-	},
-	Table3: []uint32{
-		// round3
-		0xfffa3942,
-		0x8771f681,
-		0x6d9d6122,
-		0xfde5380c,
-		0xa4beea44,
-		0x4bdecfa9,
-		0xf6bb4b60,
-		0xbebfbc70,
-		0x289b7ec6,
-		0xeaa127fa,
-		0xd4ef3085,
-		0x4881d05,
-		0xd9d4d039,
-		0xe6db99e5,
-		0x1fa27cf8,
-		0xc4ac5665,
-	},
-	Table4: []uint32{
-		// round 4
-		0xf4292244,
-		0x432aff97,
-		0xab9423a7,
-		0xfc93a039,
-		0x655b59c3,
-		0x8f0ccc92,
-		0xffeff47d,
-		0x85845dd1,
-		0x6fa87e4f,
-		0xfe2ce6e0,
-		0xa3014314,
-		0x4e0811a1,
-		0xf7537e82,
-		0xbd3af235,
-		0x2ad7d2bb,
-		0xeb86d391,
-	},
-}
-
-var program = `// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// DO NOT EDIT.
-// Generate with: go run gen.go{{if .Full}} -full{{end}} -output md5block.go
-
-package md5
-
-import (
-	"unsafe"
-	"runtime"
-)
-
-{{if not .Full}}
-	var t1 = [...]uint32{
-	{{range .Table1}}{{printf "\t%#x,\n" .}}{{end}}
-	}
-	
-	var t2 = [...]uint32{
-	{{range .Table2}}{{printf "\t%#x,\n" .}}{{end}}
-	}
-	
-	var t3 = [...]uint32{
-	{{range .Table3}}{{printf "\t%#x,\n" .}}{{end}}
-	}
-	
-	var t4 = [...]uint32{
-	{{range .Table4}}{{printf "\t%#x,\n" .}}{{end}}
-	}
-{{end}}
-
-const x86 = runtime.GOARCH == "amd64" || runtime.GOARCH == "386"
-
-var littleEndian bool
-
-func init() {
-	x := uint32(0x04030201)
-	y := [4]byte{0x1, 0x2, 0x3, 0x4}
-	littleEndian = *(*[4]byte)(unsafe.Pointer(&x)) == y
-}
-
-func blockGeneric(dig *digest, p []byte) {
-	a := dig.s[0]
-	b := dig.s[1]
-	c := dig.s[2]
-	d := dig.s[3]
-	var X *[16]uint32
-	var xbuf [16]uint32
-	for len(p) >= chunk {
-		aa, bb, cc, dd := a, b, c, d
-
-		// This is a constant condition - it is not evaluated on each iteration.
-		if x86 {
-			// MD5 was designed so that x86 processors can just iterate
-			// over the block data directly as uint32s, and we generate
-			// less code and run 1.3x faster if we take advantage of that.
-			// My apologies.
-			X = (*[16]uint32)(unsafe.Pointer(&p[0]))
-		} else if littleEndian && uintptr(unsafe.Pointer(&p[0]))&(unsafe.Alignof(uint32(0))-1) == 0 {
-			X = (*[16]uint32)(unsafe.Pointer(&p[0]))
-		} else {
-			X = &xbuf
-			j := 0
-			for i := 0; i < 16; i++ {
-				X[i&15] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24
-				j += 4
-			}
-		}
-
-		{{if .Full}}
-			// Round 1.
-			{{range $i, $s := dup 4 .Shift1}}
-				{{index $.Table1 $i | printf "a += (((c^d)&b)^d) + X[%d] + %d" $i | relabel}}
-				{{printf "a = a<<%d | a>>(32-%d) + b" $s $s | relabel}}
-				{{rotate}}
-			{{end}}
-	
-			// Round 2.
-			{{range $i, $s := dup 4 .Shift2}}
-				{{index $.Table2 $i | printf "a += (((b^c)&d)^c) + X[(1+5*%d)&15] + %d" $i | relabel}}
-				{{printf "a = a<<%d | a>>(32-%d) + b" $s $s | relabel}}
-				{{rotate}}
-			{{end}}
-	
-			// Round 3.
-			{{range $i, $s := dup 4 .Shift3}}
-				{{index $.Table3 $i | printf "a += (b^c^d) + X[(5+3*%d)&15] + %d" $i | relabel}}
-				{{printf "a = a<<%d | a>>(32-%d) + b" $s $s | relabel}}
-				{{rotate}}
-			{{end}}
-	
-			// Round 4.
-			{{range $i, $s := dup 4 .Shift4}}
-				{{index $.Table4 $i | printf "a += (c^(b|^d)) + X[(7*%d)&15] + %d" $i | relabel}}
-				{{printf "a = a<<%d | a>>(32-%d) + b" $s $s | relabel}}
-				{{rotate}}
-			{{end}}
-		{{else}}
-			// Round 1.
-			for i := uint(0); i < 16; {
-				{{range $s := .Shift1}}
-					{{printf "a += (((c^d)&b)^d) + X[i&15] + t1[i&15]" | relabel}}
-					{{printf "a = a<<%d | a>>(32-%d) + b" $s $s | relabel}}
-					i++
-					{{rotate}}
-				{{end}}
-			}
-	
-			// Round 2.
-			for i := uint(0); i < 16; {
-				{{range $s := .Shift2}}
-					{{printf "a += (((b^c)&d)^c) + X[(1+5*i)&15] + t2[i&15]" | relabel}}
-					{{printf "a = a<<%d | a>>(32-%d) + b" $s $s | relabel}}
-					i++
-					{{rotate}}
-				{{end}}
-			}
-	
-			// Round 3.
-			for i := uint(0); i < 16; {
-				{{range $s := .Shift3}}
-					{{printf "a += (b^c^d) + X[(5+3*i)&15] + t3[i&15]" | relabel}}
-					{{printf "a = a<<%d | a>>(32-%d) + b" $s $s | relabel}}
-					i++
-					{{rotate}}
-				{{end}}
-			}
-	
-			// Round 4.
-			for i := uint(0); i < 16; {
-				{{range $s := .Shift4}}
-					{{printf "a += (c^(b|^d)) + X[(7*i)&15] + t4[i&15]" | relabel}}
-					{{printf "a = a<<%d | a>>(32-%d) + b" $s $s | relabel}}
-					i++
-					{{rotate}}
-				{{end}}
-			}
-		{{end}}
-
-		a += aa
-		b += bb
-		c += cc
-		d += dd
-
-		p = p[chunk:]
-	}
-
-	dig.s[0] = a
-	dig.s[1] = b
-	dig.s[2] = c
-	dig.s[3] = d
-}
-`
diff --git a/third_party/gofrontend/libgo/go/crypto/md5/md5.go b/third_party/gofrontend/libgo/go/crypto/md5/md5.go
deleted file mode 100644
index 8c50c6d..0000000
--- a/third_party/gofrontend/libgo/go/crypto/md5/md5.go
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:generate go run gen.go -full -output md5block.go
-
-// Package md5 implements the MD5 hash algorithm as defined in RFC 1321.
-package md5
-
-import (
-	"crypto"
-	"hash"
-)
-
-func init() {
-	crypto.RegisterHash(crypto.MD5, New)
-}
-
-// The size of an MD5 checksum in bytes.
-const Size = 16
-
-// The blocksize of MD5 in bytes.
-const BlockSize = 64
-
-const (
-	chunk = 64
-	init0 = 0x67452301
-	init1 = 0xEFCDAB89
-	init2 = 0x98BADCFE
-	init3 = 0x10325476
-)
-
-// digest represents the partial evaluation of a checksum.
-type digest struct {
-	s   [4]uint32
-	x   [chunk]byte
-	nx  int
-	len uint64
-}
-
-func (d *digest) Reset() {
-	d.s[0] = init0
-	d.s[1] = init1
-	d.s[2] = init2
-	d.s[3] = init3
-	d.nx = 0
-	d.len = 0
-}
-
-// New returns a new hash.Hash computing the MD5 checksum.
-func New() hash.Hash {
-	d := new(digest)
-	d.Reset()
-	return d
-}
-
-func (d *digest) Size() int { return Size }
-
-func (d *digest) BlockSize() int { return BlockSize }
-
-func (d *digest) Write(p []byte) (nn int, err error) {
-	nn = len(p)
-	d.len += uint64(nn)
-	if d.nx > 0 {
-		n := len(p)
-		if n > chunk-d.nx {
-			n = chunk - d.nx
-		}
-		for i := 0; i < n; i++ {
-			d.x[d.nx+i] = p[i]
-		}
-		d.nx += n
-		if d.nx == chunk {
-			block(d, d.x[0:chunk])
-			d.nx = 0
-		}
-		p = p[n:]
-	}
-	if len(p) >= chunk {
-		n := len(p) &^ (chunk - 1)
-		block(d, p[:n])
-		p = p[n:]
-	}
-	if len(p) > 0 {
-		d.nx = copy(d.x[:], p)
-	}
-	return
-}
-
-func (d0 *digest) Sum(in []byte) []byte {
-	// Make a copy of d0 so that caller can keep writing and summing.
-	d := *d0
-	hash := d.checkSum()
-	return append(in, hash[:]...)
-}
-
-func (d *digest) checkSum() [Size]byte {
-	// Padding.  Add a 1 bit and 0 bits until 56 bytes mod 64.
-	len := d.len
-	var tmp [64]byte
-	tmp[0] = 0x80
-	if len%64 < 56 {
-		d.Write(tmp[0 : 56-len%64])
-	} else {
-		d.Write(tmp[0 : 64+56-len%64])
-	}
-
-	// Length in bits.
-	len <<= 3
-	for i := uint(0); i < 8; i++ {
-		tmp[i] = byte(len >> (8 * i))
-	}
-	d.Write(tmp[0:8])
-
-	if d.nx != 0 {
-		panic("d.nx != 0")
-	}
-
-	var digest [Size]byte
-	for i, s := range d.s {
-		digest[i*4] = byte(s)
-		digest[i*4+1] = byte(s >> 8)
-		digest[i*4+2] = byte(s >> 16)
-		digest[i*4+3] = byte(s >> 24)
-	}
-
-	return digest
-}
-
-// Sum returns the MD5 checksum of the data.
-func Sum(data []byte) [Size]byte {
-	var d digest
-	d.Reset()
-	d.Write(data)
-	return d.checkSum()
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/md5/md5_test.go b/third_party/gofrontend/libgo/go/crypto/md5/md5_test.go
deleted file mode 100644
index e7faf49..0000000
--- a/third_party/gofrontend/libgo/go/crypto/md5/md5_test.go
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package md5
-
-import (
-	"crypto/rand"
-	"fmt"
-	"io"
-	"testing"
-	"unsafe"
-)
-
-type md5Test struct {
-	out string
-	in  string
-}
-
-var golden = []md5Test{
-	{"d41d8cd98f00b204e9800998ecf8427e", ""},
-	{"0cc175b9c0f1b6a831c399e269772661", "a"},
-	{"187ef4436122d1cc2f40dc2b92f0eba0", "ab"},
-	{"900150983cd24fb0d6963f7d28e17f72", "abc"},
-	{"e2fc714c4727ee9395f324cd2e7f331f", "abcd"},
-	{"ab56b4d92b40713acc5af89985d4b786", "abcde"},
-	{"e80b5017098950fc58aad83c8c14978e", "abcdef"},
-	{"7ac66c0f148de9519b8bd264312c4d64", "abcdefg"},
-	{"e8dc4081b13434b45189a720b77b6818", "abcdefgh"},
-	{"8aa99b1f439ff71293e95357bac6fd94", "abcdefghi"},
-	{"a925576942e94b2ef57a066101b48876", "abcdefghij"},
-	{"d747fc1719c7eacb84058196cfe56d57", "Discard medicine more than two years old."},
-	{"bff2dcb37ef3a44ba43ab144768ca837", "He who has a shady past knows that nice guys finish last."},
-	{"0441015ecb54a7342d017ed1bcfdbea5", "I wouldn't marry him with a ten foot pole."},
-	{"9e3cac8e9e9757a60c3ea391130d3689", "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave"},
-	{"a0f04459b031f916a59a35cc482dc039", "The days of the digital watch are numbered.  -Tom Stoppard"},
-	{"e7a48e0fe884faf31475d2a04b1362cc", "Nepal premier won't resign."},
-	{"637d2fe925c07c113800509964fb0e06", "For every action there is an equal and opposite government program."},
-	{"834a8d18d5c6562119cf4c7f5086cb71", "His money is twice tainted: 'taint yours and 'taint mine."},
-	{"de3a4d2fd6c73ec2db2abad23b444281", "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977"},
-	{"acf203f997e2cf74ea3aff86985aefaf", "It's a tiny change to the code and not completely disgusting. - Bob Manchek"},
-	{"e1c1384cb4d2221dfdd7c795a4222c9a", "size:  a.out:  bad magic"},
-	{"c90f3ddecc54f34228c063d7525bf644", "The major problem is with sendmail.  -Mark Horton"},
-	{"cdf7ab6c1fd49bd9933c43f3ea5af185", "Give me a rock, paper and scissors and I will move the world.  CCFestoon"},
-	{"83bc85234942fc883c063cbd7f0ad5d0", "If the enemy is within range, then so are you."},
-	{"277cbe255686b48dd7e8f389394d9299", "It's well we cannot hear the screams/That we create in others' dreams."},
-	{"fd3fb0a7ffb8af16603f3d3af98f8e1f", "You remind me of a TV show, but that's all right: I watch it anyway."},
-	{"469b13a78ebf297ecda64d4723655154", "C is as portable as Stonehedge!!"},
-	{"63eb3a2f466410104731c4b037600110", "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley"},
-	{"72c2ed7592debca1c90fc0100f931a2f", "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction.  Lewis-Randall Rule"},
-	{"132f7619d33b523b1d9e5bd8e0928355", "How can you write a big system without C++?  -Paul Glick"},
-}
-
-func TestGolden(t *testing.T) {
-	for i := 0; i < len(golden); i++ {
-		g := golden[i]
-		s := fmt.Sprintf("%x", Sum([]byte(g.in)))
-		if s != g.out {
-			t.Fatalf("Sum function: md5(%s) = %s want %s", g.in, s, g.out)
-		}
-		c := New()
-		buf := make([]byte, len(g.in)+4)
-		for j := 0; j < 3+4; j++ {
-			if j < 2 {
-				io.WriteString(c, g.in)
-			} else if j == 2 {
-				io.WriteString(c, g.in[0:len(g.in)/2])
-				c.Sum(nil)
-				io.WriteString(c, g.in[len(g.in)/2:])
-			} else if j > 2 {
-				// test unaligned write
-				buf = buf[1:]
-				copy(buf, g.in)
-				c.Write(buf[:len(g.in)])
-			}
-			s := fmt.Sprintf("%x", c.Sum(nil))
-			if s != g.out {
-				t.Fatalf("md5[%d](%s) = %s want %s", j, g.in, s, g.out)
-			}
-			c.Reset()
-		}
-	}
-}
-
-func TestLarge(t *testing.T) {
-	const N = 10000
-	ok := "2bb571599a4180e1d542f76904adc3df" // md5sum of "0123456789" * 1000
-	block := make([]byte, 10004)
-	c := New()
-	for offset := 0; offset < 4; offset++ {
-		for i := 0; i < N; i++ {
-			block[offset+i] = '0' + byte(i%10)
-		}
-		for blockSize := 10; blockSize <= N; blockSize *= 10 {
-			blocks := N / blockSize
-			b := block[offset : offset+blockSize]
-			c.Reset()
-			for i := 0; i < blocks; i++ {
-				c.Write(b)
-			}
-			s := fmt.Sprintf("%x", c.Sum(nil))
-			if s != ok {
-				t.Fatalf("md5 TestLarge offset=%d, blockSize=%d = %s want %s", offset, blockSize, s, ok)
-			}
-		}
-	}
-}
-
-// Tests that blockGeneric (pure Go) and block (in assembly for amd64, 386, arm) match.
-func TestBlockGeneric(t *testing.T) {
-	gen, asm := New().(*digest), New().(*digest)
-	buf := make([]byte, BlockSize*20) // arbitrary factor
-	rand.Read(buf)
-	blockGeneric(gen, buf)
-	block(asm, buf)
-	if *gen != *asm {
-		t.Error("block and blockGeneric resulted in different states")
-	}
-}
-
-var bench = New()
-var buf = make([]byte, 8192+1)
-var sum = make([]byte, bench.Size())
-
-func benchmarkSize(b *testing.B, size int, unaligned bool) {
-	b.SetBytes(int64(size))
-	buf := buf
-	if unaligned {
-		if uintptr(unsafe.Pointer(&buf[0]))&(unsafe.Alignof(uint32(0))-1) == 0 {
-			buf = buf[1:]
-		}
-	}
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		bench.Reset()
-		bench.Write(buf[:size])
-		bench.Sum(sum[:0])
-	}
-}
-
-func BenchmarkHash8Bytes(b *testing.B) {
-	benchmarkSize(b, 8, false)
-}
-
-func BenchmarkHash1K(b *testing.B) {
-	benchmarkSize(b, 1024, false)
-}
-
-func BenchmarkHash8K(b *testing.B) {
-	benchmarkSize(b, 8192, false)
-}
-
-func BenchmarkHash8BytesUnaligned(b *testing.B) {
-	benchmarkSize(b, 8, true)
-}
-
-func BenchmarkHash1KUnaligned(b *testing.B) {
-	benchmarkSize(b, 1024, true)
-}
-
-func BenchmarkHash8KUnaligned(b *testing.B) {
-	benchmarkSize(b, 8192, true)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/md5/md5block.go b/third_party/gofrontend/libgo/go/crypto/md5/md5block.go
deleted file mode 100644
index 64e1e7c..0000000
--- a/third_party/gofrontend/libgo/go/crypto/md5/md5block.go
+++ /dev/null
@@ -1,265 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// DO NOT EDIT.
-// Generate with: go run gen.go -full -output md5block.go
-
-package md5
-
-import (
-	"runtime"
-	"unsafe"
-)
-
-const x86 = runtime.GOARCH == "amd64" || runtime.GOARCH == "386"
-
-var littleEndian bool
-
-func init() {
-	x := uint32(0x04030201)
-	y := [4]byte{0x1, 0x2, 0x3, 0x4}
-	littleEndian = *(*[4]byte)(unsafe.Pointer(&x)) == y
-}
-
-func blockGeneric(dig *digest, p []byte) {
-	a := dig.s[0]
-	b := dig.s[1]
-	c := dig.s[2]
-	d := dig.s[3]
-	var X *[16]uint32
-	var xbuf [16]uint32
-	for len(p) >= chunk {
-		aa, bb, cc, dd := a, b, c, d
-
-		// This is a constant condition - it is not evaluated on each iteration.
-		if x86 {
-			// MD5 was designed so that x86 processors can just iterate
-			// over the block data directly as uint32s, and we generate
-			// less code and run 1.3x faster if we take advantage of that.
-			// My apologies.
-			X = (*[16]uint32)(unsafe.Pointer(&p[0]))
-		} else if littleEndian && uintptr(unsafe.Pointer(&p[0]))&(unsafe.Alignof(uint32(0))-1) == 0 {
-			X = (*[16]uint32)(unsafe.Pointer(&p[0]))
-		} else {
-			X = &xbuf
-			j := 0
-			for i := 0; i < 16; i++ {
-				X[i&15] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24
-				j += 4
-			}
-		}
-
-		// Round 1.
-
-		a += (((c ^ d) & b) ^ d) + X[0] + 3614090360
-		a = a<<7 | a>>(32-7) + b
-
-		d += (((b ^ c) & a) ^ c) + X[1] + 3905402710
-		d = d<<12 | d>>(32-12) + a
-
-		c += (((a ^ b) & d) ^ b) + X[2] + 606105819
-		c = c<<17 | c>>(32-17) + d
-
-		b += (((d ^ a) & c) ^ a) + X[3] + 3250441966
-		b = b<<22 | b>>(32-22) + c
-
-		a += (((c ^ d) & b) ^ d) + X[4] + 4118548399
-		a = a<<7 | a>>(32-7) + b
-
-		d += (((b ^ c) & a) ^ c) + X[5] + 1200080426
-		d = d<<12 | d>>(32-12) + a
-
-		c += (((a ^ b) & d) ^ b) + X[6] + 2821735955
-		c = c<<17 | c>>(32-17) + d
-
-		b += (((d ^ a) & c) ^ a) + X[7] + 4249261313
-		b = b<<22 | b>>(32-22) + c
-
-		a += (((c ^ d) & b) ^ d) + X[8] + 1770035416
-		a = a<<7 | a>>(32-7) + b
-
-		d += (((b ^ c) & a) ^ c) + X[9] + 2336552879
-		d = d<<12 | d>>(32-12) + a
-
-		c += (((a ^ b) & d) ^ b) + X[10] + 4294925233
-		c = c<<17 | c>>(32-17) + d
-
-		b += (((d ^ a) & c) ^ a) + X[11] + 2304563134
-		b = b<<22 | b>>(32-22) + c
-
-		a += (((c ^ d) & b) ^ d) + X[12] + 1804603682
-		a = a<<7 | a>>(32-7) + b
-
-		d += (((b ^ c) & a) ^ c) + X[13] + 4254626195
-		d = d<<12 | d>>(32-12) + a
-
-		c += (((a ^ b) & d) ^ b) + X[14] + 2792965006
-		c = c<<17 | c>>(32-17) + d
-
-		b += (((d ^ a) & c) ^ a) + X[15] + 1236535329
-		b = b<<22 | b>>(32-22) + c
-
-		// Round 2.
-
-		a += (((b ^ c) & d) ^ c) + X[(1+5*0)&15] + 4129170786
-		a = a<<5 | a>>(32-5) + b
-
-		d += (((a ^ b) & c) ^ b) + X[(1+5*1)&15] + 3225465664
-		d = d<<9 | d>>(32-9) + a
-
-		c += (((d ^ a) & b) ^ a) + X[(1+5*2)&15] + 643717713
-		c = c<<14 | c>>(32-14) + d
-
-		b += (((c ^ d) & a) ^ d) + X[(1+5*3)&15] + 3921069994
-		b = b<<20 | b>>(32-20) + c
-
-		a += (((b ^ c) & d) ^ c) + X[(1+5*4)&15] + 3593408605
-		a = a<<5 | a>>(32-5) + b
-
-		d += (((a ^ b) & c) ^ b) + X[(1+5*5)&15] + 38016083
-		d = d<<9 | d>>(32-9) + a
-
-		c += (((d ^ a) & b) ^ a) + X[(1+5*6)&15] + 3634488961
-		c = c<<14 | c>>(32-14) + d
-
-		b += (((c ^ d) & a) ^ d) + X[(1+5*7)&15] + 3889429448
-		b = b<<20 | b>>(32-20) + c
-
-		a += (((b ^ c) & d) ^ c) + X[(1+5*8)&15] + 568446438
-		a = a<<5 | a>>(32-5) + b
-
-		d += (((a ^ b) & c) ^ b) + X[(1+5*9)&15] + 3275163606
-		d = d<<9 | d>>(32-9) + a
-
-		c += (((d ^ a) & b) ^ a) + X[(1+5*10)&15] + 4107603335
-		c = c<<14 | c>>(32-14) + d
-
-		b += (((c ^ d) & a) ^ d) + X[(1+5*11)&15] + 1163531501
-		b = b<<20 | b>>(32-20) + c
-
-		a += (((b ^ c) & d) ^ c) + X[(1+5*12)&15] + 2850285829
-		a = a<<5 | a>>(32-5) + b
-
-		d += (((a ^ b) & c) ^ b) + X[(1+5*13)&15] + 4243563512
-		d = d<<9 | d>>(32-9) + a
-
-		c += (((d ^ a) & b) ^ a) + X[(1+5*14)&15] + 1735328473
-		c = c<<14 | c>>(32-14) + d
-
-		b += (((c ^ d) & a) ^ d) + X[(1+5*15)&15] + 2368359562
-		b = b<<20 | b>>(32-20) + c
-
-		// Round 3.
-
-		a += (b ^ c ^ d) + X[(5+3*0)&15] + 4294588738
-		a = a<<4 | a>>(32-4) + b
-
-		d += (a ^ b ^ c) + X[(5+3*1)&15] + 2272392833
-		d = d<<11 | d>>(32-11) + a
-
-		c += (d ^ a ^ b) + X[(5+3*2)&15] + 1839030562
-		c = c<<16 | c>>(32-16) + d
-
-		b += (c ^ d ^ a) + X[(5+3*3)&15] + 4259657740
-		b = b<<23 | b>>(32-23) + c
-
-		a += (b ^ c ^ d) + X[(5+3*4)&15] + 2763975236
-		a = a<<4 | a>>(32-4) + b
-
-		d += (a ^ b ^ c) + X[(5+3*5)&15] + 1272893353
-		d = d<<11 | d>>(32-11) + a
-
-		c += (d ^ a ^ b) + X[(5+3*6)&15] + 4139469664
-		c = c<<16 | c>>(32-16) + d
-
-		b += (c ^ d ^ a) + X[(5+3*7)&15] + 3200236656
-		b = b<<23 | b>>(32-23) + c
-
-		a += (b ^ c ^ d) + X[(5+3*8)&15] + 681279174
-		a = a<<4 | a>>(32-4) + b
-
-		d += (a ^ b ^ c) + X[(5+3*9)&15] + 3936430074
-		d = d<<11 | d>>(32-11) + a
-
-		c += (d ^ a ^ b) + X[(5+3*10)&15] + 3572445317
-		c = c<<16 | c>>(32-16) + d
-
-		b += (c ^ d ^ a) + X[(5+3*11)&15] + 76029189
-		b = b<<23 | b>>(32-23) + c
-
-		a += (b ^ c ^ d) + X[(5+3*12)&15] + 3654602809
-		a = a<<4 | a>>(32-4) + b
-
-		d += (a ^ b ^ c) + X[(5+3*13)&15] + 3873151461
-		d = d<<11 | d>>(32-11) + a
-
-		c += (d ^ a ^ b) + X[(5+3*14)&15] + 530742520
-		c = c<<16 | c>>(32-16) + d
-
-		b += (c ^ d ^ a) + X[(5+3*15)&15] + 3299628645
-		b = b<<23 | b>>(32-23) + c
-
-		// Round 4.
-
-		a += (c ^ (b | ^d)) + X[(7*0)&15] + 4096336452
-		a = a<<6 | a>>(32-6) + b
-
-		d += (b ^ (a | ^c)) + X[(7*1)&15] + 1126891415
-		d = d<<10 | d>>(32-10) + a
-
-		c += (a ^ (d | ^b)) + X[(7*2)&15] + 2878612391
-		c = c<<15 | c>>(32-15) + d
-
-		b += (d ^ (c | ^a)) + X[(7*3)&15] + 4237533241
-		b = b<<21 | b>>(32-21) + c
-
-		a += (c ^ (b | ^d)) + X[(7*4)&15] + 1700485571
-		a = a<<6 | a>>(32-6) + b
-
-		d += (b ^ (a | ^c)) + X[(7*5)&15] + 2399980690
-		d = d<<10 | d>>(32-10) + a
-
-		c += (a ^ (d | ^b)) + X[(7*6)&15] + 4293915773
-		c = c<<15 | c>>(32-15) + d
-
-		b += (d ^ (c | ^a)) + X[(7*7)&15] + 2240044497
-		b = b<<21 | b>>(32-21) + c
-
-		a += (c ^ (b | ^d)) + X[(7*8)&15] + 1873313359
-		a = a<<6 | a>>(32-6) + b
-
-		d += (b ^ (a | ^c)) + X[(7*9)&15] + 4264355552
-		d = d<<10 | d>>(32-10) + a
-
-		c += (a ^ (d | ^b)) + X[(7*10)&15] + 2734768916
-		c = c<<15 | c>>(32-15) + d
-
-		b += (d ^ (c | ^a)) + X[(7*11)&15] + 1309151649
-		b = b<<21 | b>>(32-21) + c
-
-		a += (c ^ (b | ^d)) + X[(7*12)&15] + 4149444226
-		a = a<<6 | a>>(32-6) + b
-
-		d += (b ^ (a | ^c)) + X[(7*13)&15] + 3174756917
-		d = d<<10 | d>>(32-10) + a
-
-		c += (a ^ (d | ^b)) + X[(7*14)&15] + 718787259
-		c = c<<15 | c>>(32-15) + d
-
-		b += (d ^ (c | ^a)) + X[(7*15)&15] + 3951481745
-		b = b<<21 | b>>(32-21) + c
-
-		a += aa
-		b += bb
-		c += cc
-		d += dd
-
-		p = p[chunk:]
-	}
-
-	dig.s[0] = a
-	dig.s[1] = b
-	dig.s[2] = c
-	dig.s[3] = d
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/md5/md5block_decl.go b/third_party/gofrontend/libgo/go/crypto/md5/md5block_decl.go
deleted file mode 100644
index d7956a6..0000000
--- a/third_party/gofrontend/libgo/go/crypto/md5/md5block_decl.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64 amd64p32 386 arm
-
-package md5
-
-//go:noescape
-
-func block(dig *digest, p []byte)
diff --git a/third_party/gofrontend/libgo/go/crypto/md5/md5block_generic.go b/third_party/gofrontend/libgo/go/crypto/md5/md5block_generic.go
deleted file mode 100644
index 263463e..0000000
--- a/third_party/gofrontend/libgo/go/crypto/md5/md5block_generic.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !amd64,!amd64p32,!386,!arm
-
-package md5
-
-var block = blockGeneric
diff --git a/third_party/gofrontend/libgo/go/crypto/rand/eagain.go b/third_party/gofrontend/libgo/go/crypto/rand/eagain.go
deleted file mode 100644
index 2c853d0..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rand/eagain.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package rand
-
-import (
-	"os"
-	"syscall"
-)
-
-func init() {
-	isEAGAIN = unixIsEAGAIN
-}
-
-// unixIsEAGAIN reports whether err is a syscall.EAGAIN wrapped in a PathError.
-// See golang.org/issue/9205
-func unixIsEAGAIN(err error) bool {
-	if pe, ok := err.(*os.PathError); ok {
-		if errno, ok := pe.Err.(syscall.Errno); ok && errno == syscall.EAGAIN {
-			return true
-		}
-	}
-	return false
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rand/rand.go b/third_party/gofrontend/libgo/go/crypto/rand/rand.go
deleted file mode 100644
index ee32fa0..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rand/rand.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package rand implements a cryptographically secure
-// pseudorandom number generator.
-package rand
-
-import "io"
-
-// Reader is a global, shared instance of a cryptographically
-// strong pseudo-random generator.
-//
-// On Unix-like systems, Reader reads from /dev/urandom.
-// On Linux, Reader uses getrandom(2) if available, /dev/urandom otherwise.
-// On Windows systems, Reader uses the CryptGenRandom API.
-var Reader io.Reader
-
-// Read is a helper function that calls Reader.Read using io.ReadFull.
-// On return, n == len(b) if and only if err == nil.
-func Read(b []byte) (n int, err error) {
-	return io.ReadFull(Reader, b)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rand/rand_linux.go b/third_party/gofrontend/libgo/go/crypto/rand/rand_linux.go
deleted file mode 100644
index 7d6d9e8..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rand/rand_linux.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rand
-
-import (
-	"internal/syscall/unix"
-	"sync"
-)
-
-func init() {
-	altGetRandom = getRandomLinux
-}
-
-var (
-	once       sync.Once
-	useSyscall bool
-)
-
-func pickStrategy() {
-	// Test whether we should use the system call or /dev/urandom.
-	// We'll fall back to urandom if:
-	// - the kernel is too old (before 3.17)
-	// - the machine has no entropy available (early boot + no hardware
-	//   entropy source?) and we want to avoid blocking later.
-	var buf [1]byte
-	n, err := unix.GetRandom(buf[:], unix.GRND_NONBLOCK)
-	useSyscall = n == 1 && err == nil
-}
-
-func getRandomLinux(p []byte) (ok bool) {
-	once.Do(pickStrategy)
-	if !useSyscall {
-		return false
-	}
-	n, err := unix.GetRandom(p, 0)
-	return n == len(p) && err == nil
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rand/rand_test.go b/third_party/gofrontend/libgo/go/crypto/rand/rand_test.go
deleted file mode 100644
index e46e61d..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rand/rand_test.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rand
-
-import (
-	"bytes"
-	"compress/flate"
-	"io"
-	"testing"
-)
-
-func TestRead(t *testing.T) {
-	var n int = 4e6
-	if testing.Short() {
-		n = 1e5
-	}
-	b := make([]byte, n)
-	n, err := io.ReadFull(Reader, b)
-	if n != len(b) || err != nil {
-		t.Fatalf("ReadFull(buf) = %d, %s", n, err)
-	}
-
-	var z bytes.Buffer
-	f, _ := flate.NewWriter(&z, 5)
-	f.Write(b)
-	f.Close()
-	if z.Len() < len(b)*99/100 {
-		t.Fatalf("Compressed %d -> %d", len(b), z.Len())
-	}
-}
-
-func TestReadEmpty(t *testing.T) {
-	n, err := Reader.Read(make([]byte, 0))
-	if n != 0 || err != nil {
-		t.Fatalf("Read(make([]byte, 0)) = %d, %v", n, err)
-	}
-	n, err = Reader.Read(nil)
-	if n != 0 || err != nil {
-		t.Fatalf("Read(nil) = %d, %v", n, err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rand/rand_unix.go b/third_party/gofrontend/libgo/go/crypto/rand/rand_unix.go
deleted file mode 100644
index 75c36e0..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rand/rand_unix.go
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd plan9 solaris
-
-// Unix cryptographically secure pseudorandom number
-// generator.
-
-package rand
-
-import (
-	"bufio"
-	"crypto/aes"
-	"crypto/cipher"
-	"io"
-	"os"
-	"runtime"
-	"sync"
-	"time"
-)
-
-const urandomDevice = "/dev/urandom"
-
-// Easy implementation: read from /dev/urandom.
-// This is sufficient on Linux, OS X, and FreeBSD.
-
-func init() {
-	if runtime.GOOS == "plan9" {
-		Reader = newReader(nil)
-	} else {
-		Reader = &devReader{name: urandomDevice}
-	}
-}
-
-// A devReader satisfies reads by reading the file named name.
-type devReader struct {
-	name string
-	f    io.Reader
-	mu   sync.Mutex
-}
-
-// altGetRandom if non-nil specifies an OS-specific function to get
-// urandom-style randomness.
-var altGetRandom func([]byte) (ok bool)
-
-func (r *devReader) Read(b []byte) (n int, err error) {
-	if altGetRandom != nil && r.name == urandomDevice && altGetRandom(b) {
-		return len(b), nil
-	}
-	r.mu.Lock()
-	defer r.mu.Unlock()
-	if r.f == nil {
-		f, err := os.Open(r.name)
-		if f == nil {
-			return 0, err
-		}
-		if runtime.GOOS == "plan9" {
-			r.f = f
-		} else {
-			r.f = bufio.NewReader(hideAgainReader{f})
-		}
-	}
-	return r.f.Read(b)
-}
-
-var isEAGAIN func(error) bool // set by eagain.go on unix systems
-
-// hideAgainReader masks EAGAIN reads from /dev/urandom.
-// See golang.org/issue/9205
-type hideAgainReader struct {
-	r io.Reader
-}
-
-func (hr hideAgainReader) Read(p []byte) (n int, err error) {
-	n, err = hr.r.Read(p)
-	if err != nil && isEAGAIN != nil && isEAGAIN(err) {
-		err = nil
-	}
-	return
-}
-
-// Alternate pseudo-random implementation for use on
-// systems without a reliable /dev/urandom.
-
-// newReader returns a new pseudorandom generator that
-// seeds itself by reading from entropy.  If entropy == nil,
-// the generator seeds itself by reading from the system's
-// random number generator, typically /dev/random.
-// The Read method on the returned reader always returns
-// the full amount asked for, or else it returns an error.
-//
-// The generator uses the X9.31 algorithm with AES-128,
-// reseeding after every 1 MB of generated data.
-func newReader(entropy io.Reader) io.Reader {
-	if entropy == nil {
-		entropy = &devReader{name: "/dev/random"}
-	}
-	return &reader{entropy: entropy}
-}
-
-type reader struct {
-	mu                   sync.Mutex
-	budget               int // number of bytes that can be generated
-	cipher               cipher.Block
-	entropy              io.Reader
-	time, seed, dst, key [aes.BlockSize]byte
-}
-
-func (r *reader) Read(b []byte) (n int, err error) {
-	r.mu.Lock()
-	defer r.mu.Unlock()
-	n = len(b)
-
-	for len(b) > 0 {
-		if r.budget == 0 {
-			_, err := io.ReadFull(r.entropy, r.seed[0:])
-			if err != nil {
-				return n - len(b), err
-			}
-			_, err = io.ReadFull(r.entropy, r.key[0:])
-			if err != nil {
-				return n - len(b), err
-			}
-			r.cipher, err = aes.NewCipher(r.key[0:])
-			if err != nil {
-				return n - len(b), err
-			}
-			r.budget = 1 << 20 // reseed after generating 1MB
-		}
-		r.budget -= aes.BlockSize
-
-		// ANSI X9.31 (== X9.17) algorithm, but using AES in place of 3DES.
-		//
-		// single block:
-		// t = encrypt(time)
-		// dst = encrypt(t^seed)
-		// seed = encrypt(t^dst)
-		ns := time.Now().UnixNano()
-		r.time[0] = byte(ns >> 56)
-		r.time[1] = byte(ns >> 48)
-		r.time[2] = byte(ns >> 40)
-		r.time[3] = byte(ns >> 32)
-		r.time[4] = byte(ns >> 24)
-		r.time[5] = byte(ns >> 16)
-		r.time[6] = byte(ns >> 8)
-		r.time[7] = byte(ns)
-		r.cipher.Encrypt(r.time[0:], r.time[0:])
-		for i := 0; i < aes.BlockSize; i++ {
-			r.dst[i] = r.time[i] ^ r.seed[i]
-		}
-		r.cipher.Encrypt(r.dst[0:], r.dst[0:])
-		for i := 0; i < aes.BlockSize; i++ {
-			r.seed[i] = r.time[i] ^ r.dst[i]
-		}
-		r.cipher.Encrypt(r.seed[0:], r.seed[0:])
-
-		m := copy(b, r.dst[0:])
-		b = b[m:]
-	}
-
-	return n, nil
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rand/rand_windows.go b/third_party/gofrontend/libgo/go/crypto/rand/rand_windows.go
deleted file mode 100644
index 82b39b6..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rand/rand_windows.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Windows cryptographically secure pseudorandom number
-// generator.
-
-package rand
-
-import (
-	"os"
-	"sync"
-	"syscall"
-)
-
-// Implemented by using Windows CryptoAPI 2.0.
-
-func init() { Reader = &rngReader{} }
-
-// A rngReader satisfies reads by reading from the Windows CryptGenRandom API.
-type rngReader struct {
-	prov syscall.Handle
-	mu   sync.Mutex
-}
-
-func (r *rngReader) Read(b []byte) (n int, err error) {
-	r.mu.Lock()
-	if r.prov == 0 {
-		const provType = syscall.PROV_RSA_FULL
-		const flags = syscall.CRYPT_VERIFYCONTEXT | syscall.CRYPT_SILENT
-		err := syscall.CryptAcquireContext(&r.prov, nil, nil, provType, flags)
-		if err != nil {
-			r.mu.Unlock()
-			return 0, os.NewSyscallError("CryptAcquireContext", err)
-		}
-	}
-	r.mu.Unlock()
-
-	if len(b) == 0 {
-		return 0, nil
-	}
-	err = syscall.CryptGenRandom(r.prov, uint32(len(b)), &b[0])
-	if err != nil {
-		return 0, os.NewSyscallError("CryptGenRandom", err)
-	}
-	return len(b), nil
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rand/util.go b/third_party/gofrontend/libgo/go/crypto/rand/util.go
deleted file mode 100644
index 5f74407..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rand/util.go
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rand
-
-import (
-	"errors"
-	"io"
-	"math/big"
-)
-
-// smallPrimes is a list of small, prime numbers that allows us to rapidly
-// exclude some fraction of composite candidates when searching for a random
-// prime. This list is truncated at the point where smallPrimesProduct exceeds
-// a uint64. It does not include two because we ensure that the candidates are
-// odd by construction.
-var smallPrimes = []uint8{
-	3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53,
-}
-
-// smallPrimesProduct is the product of the values in smallPrimes and allows us
-// to reduce a candidate prime by this number and then determine whether it's
-// coprime to all the elements of smallPrimes without further big.Int
-// operations.
-var smallPrimesProduct = new(big.Int).SetUint64(16294579238595022365)
-
-// Prime returns a number, p, of the given size, such that p is prime
-// with high probability.
-// Prime will return error for any error returned by rand.Read or if bits < 2.
-func Prime(rand io.Reader, bits int) (p *big.Int, err error) {
-	if bits < 2 {
-		err = errors.New("crypto/rand: prime size must be at least 2-bit")
-		return
-	}
-
-	b := uint(bits % 8)
-	if b == 0 {
-		b = 8
-	}
-
-	bytes := make([]byte, (bits+7)/8)
-	p = new(big.Int)
-
-	bigMod := new(big.Int)
-
-	for {
-		_, err = io.ReadFull(rand, bytes)
-		if err != nil {
-			return nil, err
-		}
-
-		// Clear bits in the first byte to make sure the candidate has a size <= bits.
-		bytes[0] &= uint8(int(1<<b) - 1)
-		// Don't let the value be too small, i.e, set the most significant two bits.
-		// Setting the top two bits, rather than just the top bit,
-		// means that when two of these values are multiplied together,
-		// the result isn't ever one bit short.
-		if b >= 2 {
-			bytes[0] |= 3 << (b - 2)
-		} else {
-			// Here b==1, because b cannot be zero.
-			bytes[0] |= 1
-			if len(bytes) > 1 {
-				bytes[1] |= 0x80
-			}
-		}
-		// Make the value odd since an even number this large certainly isn't prime.
-		bytes[len(bytes)-1] |= 1
-
-		p.SetBytes(bytes)
-
-		// Calculate the value mod the product of smallPrimes.  If it's
-		// a multiple of any of these primes we add two until it isn't.
-		// The probability of overflowing is minimal and can be ignored
-		// because we still perform Miller-Rabin tests on the result.
-		bigMod.Mod(p, smallPrimesProduct)
-		mod := bigMod.Uint64()
-
-	NextDelta:
-		for delta := uint64(0); delta < 1<<20; delta += 2 {
-			m := mod + delta
-			for _, prime := range smallPrimes {
-				if m%uint64(prime) == 0 && (bits > 6 || m != uint64(prime)) {
-					continue NextDelta
-				}
-			}
-
-			if delta > 0 {
-				bigMod.SetUint64(delta)
-				p.Add(p, bigMod)
-			}
-			break
-		}
-
-		// There is a tiny possibility that, by adding delta, we caused
-		// the number to be one bit too long. Thus we check BitLen
-		// here.
-		if p.ProbablyPrime(20) && p.BitLen() == bits {
-			return
-		}
-	}
-}
-
-// Int returns a uniform random value in [0, max). It panics if max <= 0.
-func Int(rand io.Reader, max *big.Int) (n *big.Int, err error) {
-	if max.Sign() <= 0 {
-		panic("crypto/rand: argument to Int is <= 0")
-	}
-	k := (max.BitLen() + 7) / 8
-
-	// b is the number of bits in the most significant byte of max.
-	b := uint(max.BitLen() % 8)
-	if b == 0 {
-		b = 8
-	}
-
-	bytes := make([]byte, k)
-	n = new(big.Int)
-
-	for {
-		_, err = io.ReadFull(rand, bytes)
-		if err != nil {
-			return nil, err
-		}
-
-		// Clear bits in the first byte to increase the probability
-		// that the candidate is < max.
-		bytes[0] &= uint8(int(1<<b) - 1)
-
-		n.SetBytes(bytes)
-		if n.Cmp(max) < 0 {
-			return
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rand/util_test.go b/third_party/gofrontend/libgo/go/crypto/rand/util_test.go
deleted file mode 100644
index 2f7cba8..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rand/util_test.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rand_test
-
-import (
-	"crypto/rand"
-	"math/big"
-	"testing"
-)
-
-// https://golang.org/issue/6849.
-func TestPrimeSmall(t *testing.T) {
-	for n := 2; n < 10; n++ {
-		p, err := rand.Prime(rand.Reader, n)
-		if err != nil {
-			t.Fatalf("Can't generate %d-bit prime: %v", n, err)
-		}
-		if p.BitLen() != n {
-			t.Fatalf("%v is not %d-bit", p, n)
-		}
-		if !p.ProbablyPrime(32) {
-			t.Fatalf("%v is not prime", p)
-		}
-	}
-}
-
-// Test that passing bits < 2 causes Prime to return nil, error
-func TestPrimeBitsLt2(t *testing.T) {
-	if p, err := rand.Prime(rand.Reader, 1); p != nil || err == nil {
-		t.Errorf("Prime should return nil, error when called with bits < 2")
-	}
-}
-
-func TestInt(t *testing.T) {
-	// start at 128 so the case of (max.BitLen() % 8) == 0 is covered
-	for n := 128; n < 140; n++ {
-		b := new(big.Int).SetInt64(int64(n))
-		if i, err := rand.Int(rand.Reader, b); err != nil {
-			t.Fatalf("Can't generate random value: %v, %v", i, err)
-		}
-	}
-}
-
-func testIntPanics(t *testing.T, b *big.Int) {
-	defer func() {
-		if err := recover(); err == nil {
-			t.Errorf("Int should panic when called with max <= 0: %v", b)
-		}
-	}()
-	rand.Int(rand.Reader, b)
-}
-
-// Test that passing a new big.Int as max causes Int to panic
-func TestIntEmptyMaxPanics(t *testing.T) {
-	b := new(big.Int)
-	testIntPanics(t, b)
-}
-
-// Test that passing a negative value as max causes Int to panic
-func TestIntNegativeMaxPanics(t *testing.T) {
-	b := new(big.Int).SetInt64(int64(-1))
-	testIntPanics(t, b)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rc4/rc4.go b/third_party/gofrontend/libgo/go/crypto/rc4/rc4.go
deleted file mode 100644
index 9acb681..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rc4/rc4.go
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package rc4 implements RC4 encryption, as defined in Bruce Schneier's
-// Applied Cryptography.
-package rc4
-
-// BUG(agl): RC4 is in common use but has design weaknesses that make
-// it a poor choice for new protocols.
-
-import "strconv"
-
-// A Cipher is an instance of RC4 using a particular key.
-type Cipher struct {
-	s    [256]uint32
-	i, j uint8
-}
-
-type KeySizeError int
-
-func (k KeySizeError) Error() string {
-	return "crypto/rc4: invalid key size " + strconv.Itoa(int(k))
-}
-
-// NewCipher creates and returns a new Cipher.  The key argument should be the
-// RC4 key, at least 1 byte and at most 256 bytes.
-func NewCipher(key []byte) (*Cipher, error) {
-	k := len(key)
-	if k < 1 || k > 256 {
-		return nil, KeySizeError(k)
-	}
-	var c Cipher
-	for i := 0; i < 256; i++ {
-		c.s[i] = uint32(i)
-	}
-	var j uint8 = 0
-	for i := 0; i < 256; i++ {
-		j += uint8(c.s[i]) + key[i%k]
-		c.s[i], c.s[j] = c.s[j], c.s[i]
-	}
-	return &c, nil
-}
-
-// Reset zeros the key data so that it will no longer appear in the
-// process's memory.
-func (c *Cipher) Reset() {
-	for i := range c.s {
-		c.s[i] = 0
-	}
-	c.i, c.j = 0, 0
-}
-
-// xorKeyStreamGeneric sets dst to the result of XORing src with the
-// key stream.  Dst and src may be the same slice but otherwise should
-// not overlap.
-//
-// This is the pure Go version. rc4_{amd64,386,arm}* contain assembly
-// implementations. This is here for tests and to prevent bitrot.
-func (c *Cipher) xorKeyStreamGeneric(dst, src []byte) {
-	i, j := c.i, c.j
-	for k, v := range src {
-		i += 1
-		j += uint8(c.s[i])
-		c.s[i], c.s[j] = c.s[j], c.s[i]
-		dst[k] = v ^ uint8(c.s[uint8(c.s[i]+c.s[j])])
-	}
-	c.i, c.j = i, j
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rc4/rc4_asm.go b/third_party/gofrontend/libgo/go/crypto/rc4/rc4_asm.go
deleted file mode 100644
index 02e5b67..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rc4/rc4_asm.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64 amd64p32 arm,!nacl 386
-
-package rc4
-
-func xorKeyStream(dst, src *byte, n int, state *[256]uint32, i, j *uint8)
-
-// XORKeyStream sets dst to the result of XORing src with the key stream.
-// Dst and src may be the same slice but otherwise should not overlap.
-func (c *Cipher) XORKeyStream(dst, src []byte) {
-	if len(src) == 0 {
-		return
-	}
-	xorKeyStream(&dst[0], &src[0], len(src), &c.s, &c.i, &c.j)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rc4/rc4_ref.go b/third_party/gofrontend/libgo/go/crypto/rc4/rc4_ref.go
deleted file mode 100644
index e34bd34..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rc4/rc4_ref.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !amd64,!amd64p32,!arm,!386 arm,nacl
-
-package rc4
-
-// XORKeyStream sets dst to the result of XORing src with the key stream.
-// Dst and src may be the same slice but otherwise should not overlap.
-func (c *Cipher) XORKeyStream(dst, src []byte) {
-	c.xorKeyStreamGeneric(dst, src)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rc4/rc4_test.go b/third_party/gofrontend/libgo/go/crypto/rc4/rc4_test.go
deleted file mode 100644
index af79882..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rc4/rc4_test.go
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rc4
-
-import (
-	"bytes"
-	"fmt"
-	"testing"
-)
-
-type rc4Test struct {
-	key, keystream []byte
-}
-
-var golden = []rc4Test{
-	// Test vectors from the original cypherpunk posting of ARC4:
-	//   http://groups.google.com/group/sci.crypt/msg/10a300c9d21afca0?pli=1
-	{
-		[]byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-		[]byte{0x74, 0x94, 0xc2, 0xe7, 0x10, 0x4b, 0x08, 0x79},
-	},
-	{
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{0xde, 0x18, 0x89, 0x41, 0xa3, 0x37, 0x5d, 0x3a},
-	},
-	{
-		[]byte{0xef, 0x01, 0x23, 0x45},
-		[]byte{0xd6, 0xa1, 0x41, 0xa7, 0xec, 0x3c, 0x38, 0xdf, 0xbd, 0x61},
-	},
-
-	// Test vectors from the Wikipedia page: http://en.wikipedia.org/wiki/RC4
-	{
-		[]byte{0x4b, 0x65, 0x79},
-		[]byte{0xeb, 0x9f, 0x77, 0x81, 0xb7, 0x34, 0xca, 0x72, 0xa7, 0x19},
-	},
-	{
-		[]byte{0x57, 0x69, 0x6b, 0x69},
-		[]byte{0x60, 0x44, 0xdb, 0x6d, 0x41, 0xb7},
-	},
-	{
-		[]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-		[]byte{
-			0xde, 0x18, 0x89, 0x41, 0xa3, 0x37, 0x5d, 0x3a,
-			0x8a, 0x06, 0x1e, 0x67, 0x57, 0x6e, 0x92, 0x6d,
-			0xc7, 0x1a, 0x7f, 0xa3, 0xf0, 0xcc, 0xeb, 0x97,
-			0x45, 0x2b, 0x4d, 0x32, 0x27, 0x96, 0x5f, 0x9e,
-			0xa8, 0xcc, 0x75, 0x07, 0x6d, 0x9f, 0xb9, 0xc5,
-			0x41, 0x7a, 0xa5, 0xcb, 0x30, 0xfc, 0x22, 0x19,
-			0x8b, 0x34, 0x98, 0x2d, 0xbb, 0x62, 0x9e, 0xc0,
-			0x4b, 0x4f, 0x8b, 0x05, 0xa0, 0x71, 0x08, 0x50,
-			0x92, 0xa0, 0xc3, 0x58, 0x4a, 0x48, 0xe4, 0xa3,
-			0x0a, 0x39, 0x7b, 0x8a, 0xcd, 0x1d, 0x00, 0x9e,
-			0xc8, 0x7d, 0x68, 0x11, 0xf2, 0x2c, 0xf4, 0x9c,
-			0xa3, 0xe5, 0x93, 0x54, 0xb9, 0x45, 0x15, 0x35,
-			0xa2, 0x18, 0x7a, 0x86, 0x42, 0x6c, 0xca, 0x7d,
-			0x5e, 0x82, 0x3e, 0xba, 0x00, 0x44, 0x12, 0x67,
-			0x12, 0x57, 0xb8, 0xd8, 0x60, 0xae, 0x4c, 0xbd,
-			0x4c, 0x49, 0x06, 0xbb, 0xc5, 0x35, 0xef, 0xe1,
-			0x58, 0x7f, 0x08, 0xdb, 0x33, 0x95, 0x5c, 0xdb,
-			0xcb, 0xad, 0x9b, 0x10, 0xf5, 0x3f, 0xc4, 0xe5,
-			0x2c, 0x59, 0x15, 0x65, 0x51, 0x84, 0x87, 0xfe,
-			0x08, 0x4d, 0x0e, 0x3f, 0x03, 0xde, 0xbc, 0xc9,
-			0xda, 0x1c, 0xe9, 0x0d, 0x08, 0x5c, 0x2d, 0x8a,
-			0x19, 0xd8, 0x37, 0x30, 0x86, 0x16, 0x36, 0x92,
-			0x14, 0x2b, 0xd8, 0xfc, 0x5d, 0x7a, 0x73, 0x49,
-			0x6a, 0x8e, 0x59, 0xee, 0x7e, 0xcf, 0x6b, 0x94,
-			0x06, 0x63, 0xf4, 0xa6, 0xbe, 0xe6, 0x5b, 0xd2,
-			0xc8, 0x5c, 0x46, 0x98, 0x6c, 0x1b, 0xef, 0x34,
-			0x90, 0xd3, 0x7b, 0x38, 0xda, 0x85, 0xd3, 0x2e,
-			0x97, 0x39, 0xcb, 0x23, 0x4a, 0x2b, 0xe7, 0x40,
-		},
-	},
-}
-
-func testEncrypt(t *testing.T, desc string, c *Cipher, src, expect []byte) {
-	dst := make([]byte, len(src))
-	c.XORKeyStream(dst, src)
-	for i, v := range dst {
-		if v != expect[i] {
-			t.Fatalf("%s: mismatch at byte %d:\nhave %x\nwant %x", desc, i, dst, expect)
-		}
-	}
-}
-
-func TestGolden(t *testing.T) {
-	for gi, g := range golden {
-		data := make([]byte, len(g.keystream))
-		for i := range data {
-			data[i] = byte(i)
-		}
-
-		expect := make([]byte, len(g.keystream))
-		for i := range expect {
-			expect[i] = byte(i) ^ g.keystream[i]
-		}
-
-		for size := 1; size <= len(g.keystream); size++ {
-			c, err := NewCipher(g.key)
-			if err != nil {
-				t.Fatalf("#%d: NewCipher: %v", gi, err)
-			}
-
-			off := 0
-			for off < len(g.keystream) {
-				n := len(g.keystream) - off
-				if n > size {
-					n = size
-				}
-				desc := fmt.Sprintf("#%d@[%d:%d]", gi, off, off+n)
-				testEncrypt(t, desc, c, data[off:off+n], expect[off:off+n])
-				off += n
-			}
-		}
-	}
-}
-
-func TestBlock(t *testing.T) {
-	testBlock(t, (*Cipher).XORKeyStream)
-}
-
-// Test the pure Go version.
-// Because we have assembly for amd64, 386, and arm, this prevents
-// bitrot of the reference implementations.
-func TestBlockGeneric(t *testing.T) {
-	testBlock(t, (*Cipher).xorKeyStreamGeneric)
-}
-
-func testBlock(t *testing.T, xor func(c *Cipher, dst, src []byte)) {
-	c1a, _ := NewCipher(golden[0].key)
-	c1b, _ := NewCipher(golden[1].key)
-	data1 := make([]byte, 1<<20)
-	for i := range data1 {
-		xor(c1a, data1[i:i+1], data1[i:i+1])
-		xor(c1b, data1[i:i+1], data1[i:i+1])
-	}
-
-	c2a, _ := NewCipher(golden[0].key)
-	c2b, _ := NewCipher(golden[1].key)
-	data2 := make([]byte, 1<<20)
-	xor(c2a, data2, data2)
-	xor(c2b, data2, data2)
-
-	if !bytes.Equal(data1, data2) {
-		t.Fatalf("bad block")
-	}
-}
-
-func benchmark(b *testing.B, size int64) {
-	buf := make([]byte, size)
-	c, err := NewCipher(golden[0].key)
-	if err != nil {
-		panic(err)
-	}
-	b.SetBytes(size)
-
-	for i := 0; i < b.N; i++ {
-		c.XORKeyStream(buf, buf)
-	}
-}
-
-func BenchmarkRC4_128(b *testing.B) {
-	benchmark(b, 128)
-}
-
-func BenchmarkRC4_1K(b *testing.B) {
-	benchmark(b, 1024)
-}
-
-func BenchmarkRC4_8K(b *testing.B) {
-	benchmark(b, 8096)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rsa/pkcs1v15.go b/third_party/gofrontend/libgo/go/crypto/rsa/pkcs1v15.go
deleted file mode 100644
index 34037b0..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rsa/pkcs1v15.go
+++ /dev/null
@@ -1,302 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rsa
-
-import (
-	"crypto"
-	"crypto/subtle"
-	"errors"
-	"io"
-	"math/big"
-)
-
-// This file implements encryption and decryption using PKCS#1 v1.5 padding.
-
-// PKCS1v15DecrypterOpts is for passing options to PKCS#1 v1.5 decryption using
-// the crypto.Decrypter interface.
-type PKCS1v15DecryptOptions struct {
-	// SessionKeyLen is the length of the session key that is being
-	// decrypted. If not zero, then a padding error during decryption will
-	// cause a random plaintext of this length to be returned rather than
-	// an error. These alternatives happen in constant time.
-	SessionKeyLen int
-}
-
-// EncryptPKCS1v15 encrypts the given message with RSA and the padding scheme from PKCS#1 v1.5.
-// The message must be no longer than the length of the public modulus minus 11 bytes.
-// WARNING: use of this function to encrypt plaintexts other than session keys
-// is dangerous. Use RSA OAEP in new protocols.
-func EncryptPKCS1v15(rand io.Reader, pub *PublicKey, msg []byte) (out []byte, err error) {
-	if err := checkPub(pub); err != nil {
-		return nil, err
-	}
-	k := (pub.N.BitLen() + 7) / 8
-	if len(msg) > k-11 {
-		err = ErrMessageTooLong
-		return
-	}
-
-	// EM = 0x00 || 0x02 || PS || 0x00 || M
-	em := make([]byte, k)
-	em[1] = 2
-	ps, mm := em[2:len(em)-len(msg)-1], em[len(em)-len(msg):]
-	err = nonZeroRandomBytes(ps, rand)
-	if err != nil {
-		return
-	}
-	em[len(em)-len(msg)-1] = 0
-	copy(mm, msg)
-
-	m := new(big.Int).SetBytes(em)
-	c := encrypt(new(big.Int), pub, m)
-
-	copyWithLeftPad(em, c.Bytes())
-	out = em
-	return
-}
-
-// DecryptPKCS1v15 decrypts a plaintext using RSA and the padding scheme from PKCS#1 v1.5.
-// If rand != nil, it uses RSA blinding to avoid timing side-channel attacks.
-func DecryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) (out []byte, err error) {
-	if err := checkPub(&priv.PublicKey); err != nil {
-		return nil, err
-	}
-	valid, out, index, err := decryptPKCS1v15(rand, priv, ciphertext)
-	if err != nil {
-		return
-	}
-	if valid == 0 {
-		return nil, ErrDecryption
-	}
-	out = out[index:]
-	return
-}
-
-// DecryptPKCS1v15SessionKey decrypts a session key using RSA and the padding scheme from PKCS#1 v1.5.
-// If rand != nil, it uses RSA blinding to avoid timing side-channel attacks.
-// It returns an error if the ciphertext is the wrong length or if the
-// ciphertext is greater than the public modulus. Otherwise, no error is
-// returned. If the padding is valid, the resulting plaintext message is copied
-// into key. Otherwise, key is unchanged. These alternatives occur in constant
-// time. It is intended that the user of this function generate a random
-// session key beforehand and continue the protocol with the resulting value.
-// This will remove any possibility that an attacker can learn any information
-// about the plaintext.
-// See ``Chosen Ciphertext Attacks Against Protocols Based on the RSA
-// Encryption Standard PKCS #1'', Daniel Bleichenbacher, Advances in Cryptology
-// (Crypto '98).
-func DecryptPKCS1v15SessionKey(rand io.Reader, priv *PrivateKey, ciphertext []byte, key []byte) (err error) {
-	if err := checkPub(&priv.PublicKey); err != nil {
-		return err
-	}
-	k := (priv.N.BitLen() + 7) / 8
-	if k-(len(key)+3+8) < 0 {
-		return ErrDecryption
-	}
-
-	valid, em, index, err := decryptPKCS1v15(rand, priv, ciphertext)
-	if err != nil {
-		return
-	}
-
-	if len(em) != k {
-		// This should be impossible because decryptPKCS1v15 always
-		// returns the full slice.
-		return ErrDecryption
-	}
-
-	valid &= subtle.ConstantTimeEq(int32(len(em)-index), int32(len(key)))
-	subtle.ConstantTimeCopy(valid, key, em[len(em)-len(key):])
-	return
-}
-
-// decryptPKCS1v15 decrypts ciphertext using priv and blinds the operation if
-// rand is not nil. It returns one or zero in valid that indicates whether the
-// plaintext was correctly structured. In either case, the plaintext is
-// returned in em so that it may be read independently of whether it was valid
-// in order to maintain constant memory access patterns. If the plaintext was
-// valid then index contains the index of the original message in em.
-func decryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) (valid int, em []byte, index int, err error) {
-	k := (priv.N.BitLen() + 7) / 8
-	if k < 11 {
-		err = ErrDecryption
-		return
-	}
-
-	c := new(big.Int).SetBytes(ciphertext)
-	m, err := decrypt(rand, priv, c)
-	if err != nil {
-		return
-	}
-
-	em = leftPad(m.Bytes(), k)
-	firstByteIsZero := subtle.ConstantTimeByteEq(em[0], 0)
-	secondByteIsTwo := subtle.ConstantTimeByteEq(em[1], 2)
-
-	// The remainder of the plaintext must be a string of non-zero random
-	// octets, followed by a 0, followed by the message.
-	//   lookingForIndex: 1 iff we are still looking for the zero.
-	//   index: the offset of the first zero byte.
-	lookingForIndex := 1
-
-	for i := 2; i < len(em); i++ {
-		equals0 := subtle.ConstantTimeByteEq(em[i], 0)
-		index = subtle.ConstantTimeSelect(lookingForIndex&equals0, i, index)
-		lookingForIndex = subtle.ConstantTimeSelect(equals0, 0, lookingForIndex)
-	}
-
-	// The PS padding must be at least 8 bytes long, and it starts two
-	// bytes into em.
-	validPS := subtle.ConstantTimeLessOrEq(2+8, index)
-
-	valid = firstByteIsZero & secondByteIsTwo & (^lookingForIndex & 1) & validPS
-	index = subtle.ConstantTimeSelect(valid, index+1, 0)
-	return valid, em, index, nil
-}
-
-// nonZeroRandomBytes fills the given slice with non-zero random octets.
-func nonZeroRandomBytes(s []byte, rand io.Reader) (err error) {
-	_, err = io.ReadFull(rand, s)
-	if err != nil {
-		return
-	}
-
-	for i := 0; i < len(s); i++ {
-		for s[i] == 0 {
-			_, err = io.ReadFull(rand, s[i:i+1])
-			if err != nil {
-				return
-			}
-			// In tests, the PRNG may return all zeros so we do
-			// this to break the loop.
-			s[i] ^= 0x42
-		}
-	}
-
-	return
-}
-
-// These are ASN1 DER structures:
-//   DigestInfo ::= SEQUENCE {
-//     digestAlgorithm AlgorithmIdentifier,
-//     digest OCTET STRING
-//   }
-// For performance, we don't use the generic ASN1 encoder. Rather, we
-// precompute a prefix of the digest value that makes a valid ASN1 DER string
-// with the correct contents.
-var hashPrefixes = map[crypto.Hash][]byte{
-	crypto.MD5:       {0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10},
-	crypto.SHA1:      {0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14},
-	crypto.SHA224:    {0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04, 0x1c},
-	crypto.SHA256:    {0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20},
-	crypto.SHA384:    {0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30},
-	crypto.SHA512:    {0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40},
-	crypto.MD5SHA1:   {}, // A special TLS case which doesn't use an ASN1 prefix.
-	crypto.RIPEMD160: {0x30, 0x20, 0x30, 0x08, 0x06, 0x06, 0x28, 0xcf, 0x06, 0x03, 0x00, 0x31, 0x04, 0x14},
-}
-
-// SignPKCS1v15 calculates the signature of hashed using RSASSA-PKCS1-V1_5-SIGN from RSA PKCS#1 v1.5.
-// Note that hashed must be the result of hashing the input message using the
-// given hash function. If hash is zero, hashed is signed directly. This isn't
-// advisable except for interoperability.
-func SignPKCS1v15(rand io.Reader, priv *PrivateKey, hash crypto.Hash, hashed []byte) (s []byte, err error) {
-	hashLen, prefix, err := pkcs1v15HashInfo(hash, len(hashed))
-	if err != nil {
-		return
-	}
-
-	tLen := len(prefix) + hashLen
-	k := (priv.N.BitLen() + 7) / 8
-	if k < tLen+11 {
-		return nil, ErrMessageTooLong
-	}
-
-	// EM = 0x00 || 0x01 || PS || 0x00 || T
-	em := make([]byte, k)
-	em[1] = 1
-	for i := 2; i < k-tLen-1; i++ {
-		em[i] = 0xff
-	}
-	copy(em[k-tLen:k-hashLen], prefix)
-	copy(em[k-hashLen:k], hashed)
-
-	m := new(big.Int).SetBytes(em)
-	c, err := decrypt(rand, priv, m)
-	if err != nil {
-		return
-	}
-
-	copyWithLeftPad(em, c.Bytes())
-	s = em
-	return
-}
-
-// VerifyPKCS1v15 verifies an RSA PKCS#1 v1.5 signature.
-// hashed is the result of hashing the input message using the given hash
-// function and sig is the signature. A valid signature is indicated by
-// returning a nil error. If hash is zero then hashed is used directly. This
-// isn't advisable except for interoperability.
-func VerifyPKCS1v15(pub *PublicKey, hash crypto.Hash, hashed []byte, sig []byte) (err error) {
-	hashLen, prefix, err := pkcs1v15HashInfo(hash, len(hashed))
-	if err != nil {
-		return
-	}
-
-	tLen := len(prefix) + hashLen
-	k := (pub.N.BitLen() + 7) / 8
-	if k < tLen+11 {
-		err = ErrVerification
-		return
-	}
-
-	c := new(big.Int).SetBytes(sig)
-	m := encrypt(new(big.Int), pub, c)
-	em := leftPad(m.Bytes(), k)
-	// EM = 0x00 || 0x01 || PS || 0x00 || T
-
-	ok := subtle.ConstantTimeByteEq(em[0], 0)
-	ok &= subtle.ConstantTimeByteEq(em[1], 1)
-	ok &= subtle.ConstantTimeCompare(em[k-hashLen:k], hashed)
-	ok &= subtle.ConstantTimeCompare(em[k-tLen:k-hashLen], prefix)
-	ok &= subtle.ConstantTimeByteEq(em[k-tLen-1], 0)
-
-	for i := 2; i < k-tLen-1; i++ {
-		ok &= subtle.ConstantTimeByteEq(em[i], 0xff)
-	}
-
-	if ok != 1 {
-		return ErrVerification
-	}
-
-	return nil
-}
-
-func pkcs1v15HashInfo(hash crypto.Hash, inLen int) (hashLen int, prefix []byte, err error) {
-	// Special case: crypto.Hash(0) is used to indicate that the data is
-	// signed directly.
-	if hash == 0 {
-		return inLen, nil, nil
-	}
-
-	hashLen = hash.Size()
-	if inLen != hashLen {
-		return 0, nil, errors.New("crypto/rsa: input must be hashed message")
-	}
-	prefix, ok := hashPrefixes[hash]
-	if !ok {
-		return 0, nil, errors.New("crypto/rsa: unsupported hash function")
-	}
-	return
-}
-
-// copyWithLeftPad copies src to the end of dest, padding with zero bytes as
-// needed.
-func copyWithLeftPad(dest, src []byte) {
-	numPaddingBytes := len(dest) - len(src)
-	for i := 0; i < numPaddingBytes; i++ {
-		dest[i] = 0
-	}
-	copy(dest[numPaddingBytes:], src)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rsa/pkcs1v15_test.go b/third_party/gofrontend/libgo/go/crypto/rsa/pkcs1v15_test.go
deleted file mode 100644
index 8925375..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rsa/pkcs1v15_test.go
+++ /dev/null
@@ -1,298 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rsa
-
-import (
-	"bytes"
-	"crypto"
-	"crypto/rand"
-	"crypto/sha1"
-	"encoding/base64"
-	"encoding/hex"
-	"io"
-	"math/big"
-	"testing"
-	"testing/quick"
-)
-
-func decodeBase64(in string) []byte {
-	out := make([]byte, base64.StdEncoding.DecodedLen(len(in)))
-	n, err := base64.StdEncoding.Decode(out, []byte(in))
-	if err != nil {
-		return nil
-	}
-	return out[0:n]
-}
-
-type DecryptPKCS1v15Test struct {
-	in, out string
-}
-
-// These test vectors were generated with `openssl rsautl -pkcs -encrypt`
-var decryptPKCS1v15Tests = []DecryptPKCS1v15Test{
-	{
-		"gIcUIoVkD6ATMBk/u/nlCZCCWRKdkfjCgFdo35VpRXLduiKXhNz1XupLLzTXAybEq15juc+EgY5o0DHv/nt3yg==",
-		"x",
-	},
-	{
-		"Y7TOCSqofGhkRb+jaVRLzK8xw2cSo1IVES19utzv6hwvx+M8kFsoWQm5DzBeJCZTCVDPkTpavUuEbgp8hnUGDw==",
-		"testing.",
-	},
-	{
-		"arReP9DJtEVyV2Dg3dDp4c/PSk1O6lxkoJ8HcFupoRorBZG+7+1fDAwT1olNddFnQMjmkb8vxwmNMoTAT/BFjQ==",
-		"testing.\n",
-	},
-	{
-		"WtaBXIoGC54+vH0NH0CHHE+dRDOsMc/6BrfFu2lEqcKL9+uDuWaf+Xj9mrbQCjjZcpQuX733zyok/jsnqe/Ftw==",
-		"01234567890123456789012345678901234567890123456789012",
-	},
-}
-
-func TestDecryptPKCS1v15(t *testing.T) {
-	decryptionFuncs := []func([]byte) ([]byte, error){
-		func(ciphertext []byte) (plaintext []byte, err error) {
-			return DecryptPKCS1v15(nil, rsaPrivateKey, ciphertext)
-		},
-		func(ciphertext []byte) (plaintext []byte, err error) {
-			return rsaPrivateKey.Decrypt(nil, ciphertext, nil)
-		},
-	}
-
-	for _, decryptFunc := range decryptionFuncs {
-		for i, test := range decryptPKCS1v15Tests {
-			out, err := decryptFunc(decodeBase64(test.in))
-			if err != nil {
-				t.Errorf("#%d error decrypting", i)
-			}
-			want := []byte(test.out)
-			if !bytes.Equal(out, want) {
-				t.Errorf("#%d got:%#v want:%#v", i, out, want)
-			}
-		}
-	}
-}
-
-func TestEncryptPKCS1v15(t *testing.T) {
-	random := rand.Reader
-	k := (rsaPrivateKey.N.BitLen() + 7) / 8
-
-	tryEncryptDecrypt := func(in []byte, blind bool) bool {
-		if len(in) > k-11 {
-			in = in[0 : k-11]
-		}
-
-		ciphertext, err := EncryptPKCS1v15(random, &rsaPrivateKey.PublicKey, in)
-		if err != nil {
-			t.Errorf("error encrypting: %s", err)
-			return false
-		}
-
-		var rand io.Reader
-		if !blind {
-			rand = nil
-		} else {
-			rand = random
-		}
-		plaintext, err := DecryptPKCS1v15(rand, rsaPrivateKey, ciphertext)
-		if err != nil {
-			t.Errorf("error decrypting: %s", err)
-			return false
-		}
-
-		if !bytes.Equal(plaintext, in) {
-			t.Errorf("output mismatch: %#v %#v", plaintext, in)
-			return false
-		}
-		return true
-	}
-
-	config := new(quick.Config)
-	if testing.Short() {
-		config.MaxCount = 10
-	}
-	quick.Check(tryEncryptDecrypt, config)
-}
-
-// These test vectors were generated with `openssl rsautl -pkcs -encrypt`
-var decryptPKCS1v15SessionKeyTests = []DecryptPKCS1v15Test{
-	{
-		"e6ukkae6Gykq0fKzYwULpZehX+UPXYzMoB5mHQUDEiclRbOTqas4Y0E6nwns1BBpdvEJcilhl5zsox/6DtGsYg==",
-		"1234",
-	},
-	{
-		"Dtis4uk/q/LQGGqGk97P59K03hkCIVFMEFZRgVWOAAhxgYpCRG0MX2adptt92l67IqMki6iVQyyt0TtX3IdtEw==",
-		"FAIL",
-	},
-	{
-		"LIyFyCYCptPxrvTxpol8F3M7ZivlMsf53zs0vHRAv+rDIh2YsHS69ePMoPMe3TkOMZ3NupiL3takPxIs1sK+dw==",
-		"abcd",
-	},
-	{
-		"bafnobel46bKy76JzqU/RIVOH0uAYvzUtauKmIidKgM0sMlvobYVAVQPeUQ/oTGjbIZ1v/6Gyi5AO4DtHruGdw==",
-		"FAIL",
-	},
-}
-
-func TestEncryptPKCS1v15SessionKey(t *testing.T) {
-	for i, test := range decryptPKCS1v15SessionKeyTests {
-		key := []byte("FAIL")
-		err := DecryptPKCS1v15SessionKey(nil, rsaPrivateKey, decodeBase64(test.in), key)
-		if err != nil {
-			t.Errorf("#%d error decrypting", i)
-		}
-		want := []byte(test.out)
-		if !bytes.Equal(key, want) {
-			t.Errorf("#%d got:%#v want:%#v", i, key, want)
-		}
-	}
-}
-
-func TestEncryptPKCS1v15DecrypterSessionKey(t *testing.T) {
-	for i, test := range decryptPKCS1v15SessionKeyTests {
-		plaintext, err := rsaPrivateKey.Decrypt(rand.Reader, decodeBase64(test.in), &PKCS1v15DecryptOptions{SessionKeyLen: 4})
-		if err != nil {
-			t.Fatalf("#%d: error decrypting: %s", i, err)
-		}
-		if len(plaintext) != 4 {
-			t.Fatalf("#%d: incorrect length plaintext: got %d, want 4", i, len(plaintext))
-		}
-
-		if test.out != "FAIL" && !bytes.Equal(plaintext, []byte(test.out)) {
-			t.Errorf("#%d: incorrect plaintext: got %x, want %x", plaintext, test.out)
-		}
-	}
-}
-
-func TestNonZeroRandomBytes(t *testing.T) {
-	random := rand.Reader
-
-	b := make([]byte, 512)
-	err := nonZeroRandomBytes(b, random)
-	if err != nil {
-		t.Errorf("returned error: %s", err)
-	}
-	for _, b := range b {
-		if b == 0 {
-			t.Errorf("Zero octet found")
-			return
-		}
-	}
-}
-
-type signPKCS1v15Test struct {
-	in, out string
-}
-
-// These vectors have been tested with
-//   `openssl rsautl -verify -inkey pk -in signature | hexdump -C`
-var signPKCS1v15Tests = []signPKCS1v15Test{
-	{"Test.\n", "a4f3fa6ea93bcdd0c57be020c1193ecbfd6f200a3d95c409769b029578fa0e336ad9a347600e40d3ae823b8c7e6bad88cc07c1d54c3a1523cbbb6d58efc362ae"},
-}
-
-func TestSignPKCS1v15(t *testing.T) {
-	for i, test := range signPKCS1v15Tests {
-		h := sha1.New()
-		h.Write([]byte(test.in))
-		digest := h.Sum(nil)
-
-		s, err := SignPKCS1v15(nil, rsaPrivateKey, crypto.SHA1, digest)
-		if err != nil {
-			t.Errorf("#%d %s", i, err)
-		}
-
-		expected, _ := hex.DecodeString(test.out)
-		if !bytes.Equal(s, expected) {
-			t.Errorf("#%d got: %x want: %x", i, s, expected)
-		}
-	}
-}
-
-func TestVerifyPKCS1v15(t *testing.T) {
-	for i, test := range signPKCS1v15Tests {
-		h := sha1.New()
-		h.Write([]byte(test.in))
-		digest := h.Sum(nil)
-
-		sig, _ := hex.DecodeString(test.out)
-
-		err := VerifyPKCS1v15(&rsaPrivateKey.PublicKey, crypto.SHA1, digest, sig)
-		if err != nil {
-			t.Errorf("#%d %s", i, err)
-		}
-	}
-}
-
-func TestOverlongMessagePKCS1v15(t *testing.T) {
-	ciphertext := decodeBase64("fjOVdirUzFoLlukv80dBllMLjXythIf22feqPrNo0YoIjzyzyoMFiLjAc/Y4krkeZ11XFThIrEvw\nkRiZcCq5ng==")
-	_, err := DecryptPKCS1v15(nil, rsaPrivateKey, ciphertext)
-	if err == nil {
-		t.Error("RSA decrypted a message that was too long.")
-	}
-}
-
-func TestUnpaddedSignature(t *testing.T) {
-	msg := []byte("Thu Dec 19 18:06:16 EST 2013\n")
-	// This base64 value was generated with:
-	// % echo Thu Dec 19 18:06:16 EST 2013 > /tmp/msg
-	// % openssl rsautl -sign -inkey key -out /tmp/sig -in /tmp/msg
-	//
-	// Where "key" contains the RSA private key given at the bottom of this
-	// file.
-	expectedSig := decodeBase64("pX4DR8azytjdQ1rtUiC040FjkepuQut5q2ZFX1pTjBrOVKNjgsCDyiJDGZTCNoh9qpXYbhl7iEym30BWWwuiZg==")
-
-	sig, err := SignPKCS1v15(nil, rsaPrivateKey, crypto.Hash(0), msg)
-	if err != nil {
-		t.Fatalf("SignPKCS1v15 failed: %s", err)
-	}
-	if !bytes.Equal(sig, expectedSig) {
-		t.Fatalf("signature is not expected value: got %x, want %x", sig, expectedSig)
-	}
-	if err := VerifyPKCS1v15(&rsaPrivateKey.PublicKey, crypto.Hash(0), msg, sig); err != nil {
-		t.Fatalf("signature failed to verify: %s", err)
-	}
-}
-
-func TestShortSessionKey(t *testing.T) {
-	// This tests that attempting to decrypt a session key where the
-	// ciphertext is too small doesn't run outside the array bounds.
-	ciphertext, err := EncryptPKCS1v15(rand.Reader, &rsaPrivateKey.PublicKey, []byte{1})
-	if err != nil {
-		t.Fatalf("Failed to encrypt short message: %s", err)
-	}
-
-	var key [32]byte
-	if err := DecryptPKCS1v15SessionKey(nil, rsaPrivateKey, ciphertext, key[:]); err != nil {
-		t.Fatalf("Failed to decrypt short message: %s", err)
-	}
-
-	for _, v := range key {
-		if v != 0 {
-			t.Fatal("key was modified when ciphertext was invalid")
-		}
-	}
-}
-
-// In order to generate new test vectors you'll need the PEM form of this key:
-// -----BEGIN RSA PRIVATE KEY-----
-// MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0
-// fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu
-// /ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWu
-// RTUCIQDasvGASLqmjeffBNLTXV2A5g4t+kLVCpsEIZAycV5GswIhANEPLmax0ME/
-// EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7A
-// IU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlS
-// tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
-// -----END RSA PRIVATE KEY-----
-
-var rsaPrivateKey = &PrivateKey{
-	PublicKey: PublicKey{
-		N: fromBase10("9353930466774385905609975137998169297361893554149986716853295022578535724979677252958524466350471210367835187480748268864277464700638583474144061408845077"),
-		E: 65537,
-	},
-	D: fromBase10("7266398431328116344057699379749222532279343923819063639497049039389899328538543087657733766554155839834519529439851673014800261285757759040931985506583861"),
-	Primes: []*big.Int{
-		fromBase10("98920366548084643601728869055592650835572950932266967461790948584315647051443"),
-		fromBase10("94560208308847015747498523884063394671606671904944666360068158221458669711639"),
-	},
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rsa/pss.go b/third_party/gofrontend/libgo/go/crypto/rsa/pss.go
deleted file mode 100644
index 0a41814..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rsa/pss.go
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rsa
-
-// This file implements the PSS signature scheme [1].
-//
-// [1] http://www.rsa.com/rsalabs/pkcs/files/h11300-wp-pkcs-1v2-2-rsa-cryptography-standard.pdf
-
-import (
-	"bytes"
-	"crypto"
-	"errors"
-	"hash"
-	"io"
-	"math/big"
-)
-
-func emsaPSSEncode(mHash []byte, emBits int, salt []byte, hash hash.Hash) ([]byte, error) {
-	// See [1], section 9.1.1
-	hLen := hash.Size()
-	sLen := len(salt)
-	emLen := (emBits + 7) / 8
-
-	// 1.  If the length of M is greater than the input limitation for the
-	//     hash function (2^61 - 1 octets for SHA-1), output "message too
-	//     long" and stop.
-	//
-	// 2.  Let mHash = Hash(M), an octet string of length hLen.
-
-	if len(mHash) != hLen {
-		return nil, errors.New("crypto/rsa: input must be hashed message")
-	}
-
-	// 3.  If emLen < hLen + sLen + 2, output "encoding error" and stop.
-
-	if emLen < hLen+sLen+2 {
-		return nil, errors.New("crypto/rsa: encoding error")
-	}
-
-	em := make([]byte, emLen)
-	db := em[:emLen-sLen-hLen-2+1+sLen]
-	h := em[emLen-sLen-hLen-2+1+sLen : emLen-1]
-
-	// 4.  Generate a random octet string salt of length sLen; if sLen = 0,
-	//     then salt is the empty string.
-	//
-	// 5.  Let
-	//       M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt;
-	//
-	//     M' is an octet string of length 8 + hLen + sLen with eight
-	//     initial zero octets.
-	//
-	// 6.  Let H = Hash(M'), an octet string of length hLen.
-
-	var prefix [8]byte
-
-	hash.Write(prefix[:])
-	hash.Write(mHash)
-	hash.Write(salt)
-
-	h = hash.Sum(h[:0])
-	hash.Reset()
-
-	// 7.  Generate an octet string PS consisting of emLen - sLen - hLen - 2
-	//     zero octets.  The length of PS may be 0.
-	//
-	// 8.  Let DB = PS || 0x01 || salt; DB is an octet string of length
-	//     emLen - hLen - 1.
-
-	db[emLen-sLen-hLen-2] = 0x01
-	copy(db[emLen-sLen-hLen-1:], salt)
-
-	// 9.  Let dbMask = MGF(H, emLen - hLen - 1).
-	//
-	// 10. Let maskedDB = DB \xor dbMask.
-
-	mgf1XOR(db, hash, h)
-
-	// 11. Set the leftmost 8 * emLen - emBits bits of the leftmost octet in
-	//     maskedDB to zero.
-
-	db[0] &= (0xFF >> uint(8*emLen-emBits))
-
-	// 12. Let EM = maskedDB || H || 0xbc.
-	em[emLen-1] = 0xBC
-
-	// 13. Output EM.
-	return em, nil
-}
-
-func emsaPSSVerify(mHash, em []byte, emBits, sLen int, hash hash.Hash) error {
-	// 1.  If the length of M is greater than the input limitation for the
-	//     hash function (2^61 - 1 octets for SHA-1), output "inconsistent"
-	//     and stop.
-	//
-	// 2.  Let mHash = Hash(M), an octet string of length hLen.
-	hLen := hash.Size()
-	if hLen != len(mHash) {
-		return ErrVerification
-	}
-
-	// 3.  If emLen < hLen + sLen + 2, output "inconsistent" and stop.
-	emLen := (emBits + 7) / 8
-	if emLen < hLen+sLen+2 {
-		return ErrVerification
-	}
-
-	// 4.  If the rightmost octet of EM does not have hexadecimal value
-	//     0xbc, output "inconsistent" and stop.
-	if em[len(em)-1] != 0xBC {
-		return ErrVerification
-	}
-
-	// 5.  Let maskedDB be the leftmost emLen - hLen - 1 octets of EM, and
-	//     let H be the next hLen octets.
-	db := em[:emLen-hLen-1]
-	h := em[emLen-hLen-1 : len(em)-1]
-
-	// 6.  If the leftmost 8 * emLen - emBits bits of the leftmost octet in
-	//     maskedDB are not all equal to zero, output "inconsistent" and
-	//     stop.
-	if em[0]&(0xFF<<uint(8-(8*emLen-emBits))) != 0 {
-		return ErrVerification
-	}
-
-	// 7.  Let dbMask = MGF(H, emLen - hLen - 1).
-	//
-	// 8.  Let DB = maskedDB \xor dbMask.
-	mgf1XOR(db, hash, h)
-
-	// 9.  Set the leftmost 8 * emLen - emBits bits of the leftmost octet in DB
-	//     to zero.
-	db[0] &= (0xFF >> uint(8*emLen-emBits))
-
-	if sLen == PSSSaltLengthAuto {
-	FindSaltLength:
-		for sLen = emLen - (hLen + 2); sLen >= 0; sLen-- {
-			switch db[emLen-hLen-sLen-2] {
-			case 1:
-				break FindSaltLength
-			case 0:
-				continue
-			default:
-				return ErrVerification
-			}
-		}
-		if sLen < 0 {
-			return ErrVerification
-		}
-	} else {
-		// 10. If the emLen - hLen - sLen - 2 leftmost octets of DB are not zero
-		//     or if the octet at position emLen - hLen - sLen - 1 (the leftmost
-		//     position is "position 1") does not have hexadecimal value 0x01,
-		//     output "inconsistent" and stop.
-		for _, e := range db[:emLen-hLen-sLen-2] {
-			if e != 0x00 {
-				return ErrVerification
-			}
-		}
-		if db[emLen-hLen-sLen-2] != 0x01 {
-			return ErrVerification
-		}
-	}
-
-	// 11.  Let salt be the last sLen octets of DB.
-	salt := db[len(db)-sLen:]
-
-	// 12.  Let
-	//          M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt ;
-	//     M' is an octet string of length 8 + hLen + sLen with eight
-	//     initial zero octets.
-	//
-	// 13. Let H' = Hash(M'), an octet string of length hLen.
-	var prefix [8]byte
-	hash.Write(prefix[:])
-	hash.Write(mHash)
-	hash.Write(salt)
-
-	h0 := hash.Sum(nil)
-
-	// 14. If H = H', output "consistent." Otherwise, output "inconsistent."
-	if !bytes.Equal(h0, h) {
-		return ErrVerification
-	}
-	return nil
-}
-
-// signPSSWithSalt calculates the signature of hashed using PSS [1] with specified salt.
-// Note that hashed must be the result of hashing the input message using the
-// given hash function. salt is a random sequence of bytes whose length will be
-// later used to verify the signature.
-func signPSSWithSalt(rand io.Reader, priv *PrivateKey, hash crypto.Hash, hashed, salt []byte) (s []byte, err error) {
-	nBits := priv.N.BitLen()
-	em, err := emsaPSSEncode(hashed, nBits-1, salt, hash.New())
-	if err != nil {
-		return
-	}
-	m := new(big.Int).SetBytes(em)
-	c, err := decrypt(rand, priv, m)
-	if err != nil {
-		return
-	}
-	s = make([]byte, (nBits+7)/8)
-	copyWithLeftPad(s, c.Bytes())
-	return
-}
-
-const (
-	// PSSSaltLengthAuto causes the salt in a PSS signature to be as large
-	// as possible when signing, and to be auto-detected when verifying.
-	PSSSaltLengthAuto = 0
-	// PSSSaltLengthEqualsHash causes the salt length to equal the length
-	// of the hash used in the signature.
-	PSSSaltLengthEqualsHash = -1
-)
-
-// PSSOptions contains options for creating and verifying PSS signatures.
-type PSSOptions struct {
-	// SaltLength controls the length of the salt used in the PSS
-	// signature. It can either be a number of bytes, or one of the special
-	// PSSSaltLength constants.
-	SaltLength int
-
-	// Hash, if not zero, overrides the hash function passed to SignPSS.
-	// This is the only way to specify the hash function when using the
-	// crypto.Signer interface.
-	Hash crypto.Hash
-}
-
-// HashFunc returns pssOpts.Hash so that PSSOptions implements
-// crypto.SignerOpts.
-func (pssOpts *PSSOptions) HashFunc() crypto.Hash {
-	return pssOpts.Hash
-}
-
-func (opts *PSSOptions) saltLength() int {
-	if opts == nil {
-		return PSSSaltLengthAuto
-	}
-	return opts.SaltLength
-}
-
-// SignPSS calculates the signature of hashed using RSASSA-PSS [1].
-// Note that hashed must be the result of hashing the input message using the
-// given hash function. The opts argument may be nil, in which case sensible
-// defaults are used.
-func SignPSS(rand io.Reader, priv *PrivateKey, hash crypto.Hash, hashed []byte, opts *PSSOptions) (s []byte, err error) {
-	saltLength := opts.saltLength()
-	switch saltLength {
-	case PSSSaltLengthAuto:
-		saltLength = (priv.N.BitLen()+7)/8 - 2 - hash.Size()
-	case PSSSaltLengthEqualsHash:
-		saltLength = hash.Size()
-	}
-
-	if opts != nil && opts.Hash != 0 {
-		hash = opts.Hash
-	}
-
-	salt := make([]byte, saltLength)
-	if _, err = io.ReadFull(rand, salt); err != nil {
-		return
-	}
-	return signPSSWithSalt(rand, priv, hash, hashed, salt)
-}
-
-// VerifyPSS verifies a PSS signature.
-// hashed is the result of hashing the input message using the given hash
-// function and sig is the signature. A valid signature is indicated by
-// returning a nil error. The opts argument may be nil, in which case sensible
-// defaults are used.
-func VerifyPSS(pub *PublicKey, hash crypto.Hash, hashed []byte, sig []byte, opts *PSSOptions) error {
-	return verifyPSS(pub, hash, hashed, sig, opts.saltLength())
-}
-
-// verifyPSS verifies a PSS signature with the given salt length.
-func verifyPSS(pub *PublicKey, hash crypto.Hash, hashed []byte, sig []byte, saltLen int) error {
-	nBits := pub.N.BitLen()
-	if len(sig) != (nBits+7)/8 {
-		return ErrVerification
-	}
-	s := new(big.Int).SetBytes(sig)
-	m := encrypt(new(big.Int), pub, s)
-	emBits := nBits - 1
-	emLen := (emBits + 7) / 8
-	if emLen < len(m.Bytes()) {
-		return ErrVerification
-	}
-	em := make([]byte, emLen)
-	copyWithLeftPad(em, m.Bytes())
-	if saltLen == PSSSaltLengthEqualsHash {
-		saltLen = hash.Size()
-	}
-	return emsaPSSVerify(hashed, em, emBits, saltLen, hash.New())
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rsa/pss_test.go b/third_party/gofrontend/libgo/go/crypto/rsa/pss_test.go
deleted file mode 100644
index cae24e5..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rsa/pss_test.go
+++ /dev/null
@@ -1,258 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rsa
-
-import (
-	"bufio"
-	"bytes"
-	"compress/bzip2"
-	"crypto"
-	_ "crypto/md5"
-	"crypto/rand"
-	"crypto/sha1"
-	_ "crypto/sha256"
-	"encoding/hex"
-	"math/big"
-	"os"
-	"strconv"
-	"strings"
-	"testing"
-)
-
-func TestEMSAPSS(t *testing.T) {
-	// Test vector in file pss-int.txt from: ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip
-	msg := []byte{
-		0x85, 0x9e, 0xef, 0x2f, 0xd7, 0x8a, 0xca, 0x00, 0x30, 0x8b,
-		0xdc, 0x47, 0x11, 0x93, 0xbf, 0x55, 0xbf, 0x9d, 0x78, 0xdb,
-		0x8f, 0x8a, 0x67, 0x2b, 0x48, 0x46, 0x34, 0xf3, 0xc9, 0xc2,
-		0x6e, 0x64, 0x78, 0xae, 0x10, 0x26, 0x0f, 0xe0, 0xdd, 0x8c,
-		0x08, 0x2e, 0x53, 0xa5, 0x29, 0x3a, 0xf2, 0x17, 0x3c, 0xd5,
-		0x0c, 0x6d, 0x5d, 0x35, 0x4f, 0xeb, 0xf7, 0x8b, 0x26, 0x02,
-		0x1c, 0x25, 0xc0, 0x27, 0x12, 0xe7, 0x8c, 0xd4, 0x69, 0x4c,
-		0x9f, 0x46, 0x97, 0x77, 0xe4, 0x51, 0xe7, 0xf8, 0xe9, 0xe0,
-		0x4c, 0xd3, 0x73, 0x9c, 0x6b, 0xbf, 0xed, 0xae, 0x48, 0x7f,
-		0xb5, 0x56, 0x44, 0xe9, 0xca, 0x74, 0xff, 0x77, 0xa5, 0x3c,
-		0xb7, 0x29, 0x80, 0x2f, 0x6e, 0xd4, 0xa5, 0xff, 0xa8, 0xba,
-		0x15, 0x98, 0x90, 0xfc,
-	}
-	salt := []byte{
-		0xe3, 0xb5, 0xd5, 0xd0, 0x02, 0xc1, 0xbc, 0xe5, 0x0c, 0x2b,
-		0x65, 0xef, 0x88, 0xa1, 0x88, 0xd8, 0x3b, 0xce, 0x7e, 0x61,
-	}
-	expected := []byte{
-		0x66, 0xe4, 0x67, 0x2e, 0x83, 0x6a, 0xd1, 0x21, 0xba, 0x24,
-		0x4b, 0xed, 0x65, 0x76, 0xb8, 0x67, 0xd9, 0xa4, 0x47, 0xc2,
-		0x8a, 0x6e, 0x66, 0xa5, 0xb8, 0x7d, 0xee, 0x7f, 0xbc, 0x7e,
-		0x65, 0xaf, 0x50, 0x57, 0xf8, 0x6f, 0xae, 0x89, 0x84, 0xd9,
-		0xba, 0x7f, 0x96, 0x9a, 0xd6, 0xfe, 0x02, 0xa4, 0xd7, 0x5f,
-		0x74, 0x45, 0xfe, 0xfd, 0xd8, 0x5b, 0x6d, 0x3a, 0x47, 0x7c,
-		0x28, 0xd2, 0x4b, 0xa1, 0xe3, 0x75, 0x6f, 0x79, 0x2d, 0xd1,
-		0xdc, 0xe8, 0xca, 0x94, 0x44, 0x0e, 0xcb, 0x52, 0x79, 0xec,
-		0xd3, 0x18, 0x3a, 0x31, 0x1f, 0xc8, 0x96, 0xda, 0x1c, 0xb3,
-		0x93, 0x11, 0xaf, 0x37, 0xea, 0x4a, 0x75, 0xe2, 0x4b, 0xdb,
-		0xfd, 0x5c, 0x1d, 0xa0, 0xde, 0x7c, 0xec, 0xdf, 0x1a, 0x89,
-		0x6f, 0x9d, 0x8b, 0xc8, 0x16, 0xd9, 0x7c, 0xd7, 0xa2, 0xc4,
-		0x3b, 0xad, 0x54, 0x6f, 0xbe, 0x8c, 0xfe, 0xbc,
-	}
-
-	hash := sha1.New()
-	hash.Write(msg)
-	hashed := hash.Sum(nil)
-
-	encoded, err := emsaPSSEncode(hashed, 1023, salt, sha1.New())
-	if err != nil {
-		t.Errorf("Error from emsaPSSEncode: %s\n", err)
-	}
-	if !bytes.Equal(encoded, expected) {
-		t.Errorf("Bad encoding. got %x, want %x", encoded, expected)
-	}
-
-	if err = emsaPSSVerify(hashed, encoded, 1023, len(salt), sha1.New()); err != nil {
-		t.Errorf("Bad verification: %s", err)
-	}
-}
-
-// TestPSSGolden tests all the test vectors in pss-vect.txt from
-// ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip
-func TestPSSGolden(t *testing.T) {
-	inFile, err := os.Open("testdata/pss-vect.txt.bz2")
-	if err != nil {
-		t.Fatalf("Failed to open input file: %s", err)
-	}
-	defer inFile.Close()
-
-	// The pss-vect.txt file contains RSA keys and then a series of
-	// signatures. A goroutine is used to preprocess the input by merging
-	// lines, removing spaces in hex values and identifying the start of
-	// new keys and signature blocks.
-	const newKeyMarker = "START NEW KEY"
-	const newSignatureMarker = "START NEW SIGNATURE"
-
-	values := make(chan string)
-
-	go func() {
-		defer close(values)
-		scanner := bufio.NewScanner(bzip2.NewReader(inFile))
-		var partialValue string
-		lastWasValue := true
-
-		for scanner.Scan() {
-			line := scanner.Text()
-			switch {
-			case len(line) == 0:
-				if len(partialValue) > 0 {
-					values <- strings.Replace(partialValue, " ", "", -1)
-					partialValue = ""
-					lastWasValue = true
-				}
-				continue
-			case strings.HasPrefix(line, "# ======") && lastWasValue:
-				values <- newKeyMarker
-				lastWasValue = false
-			case strings.HasPrefix(line, "# ------") && lastWasValue:
-				values <- newSignatureMarker
-				lastWasValue = false
-			case strings.HasPrefix(line, "#"):
-				continue
-			default:
-				partialValue += line
-			}
-		}
-		if err := scanner.Err(); err != nil {
-			panic(err)
-		}
-	}()
-
-	var key *PublicKey
-	var hashed []byte
-	hash := crypto.SHA1
-	h := hash.New()
-	opts := &PSSOptions{
-		SaltLength: PSSSaltLengthEqualsHash,
-	}
-
-	for marker := range values {
-		switch marker {
-		case newKeyMarker:
-			key = new(PublicKey)
-			nHex, ok := <-values
-			if !ok {
-				continue
-			}
-			key.N = bigFromHex(nHex)
-			key.E = intFromHex(<-values)
-			// We don't care for d, p, q, dP, dQ or qInv.
-			for i := 0; i < 6; i++ {
-				<-values
-			}
-		case newSignatureMarker:
-			msg := fromHex(<-values)
-			<-values // skip salt
-			sig := fromHex(<-values)
-
-			h.Reset()
-			h.Write(msg)
-			hashed = h.Sum(hashed[:0])
-
-			if err := VerifyPSS(key, hash, hashed, sig, opts); err != nil {
-				t.Error(err)
-			}
-		default:
-			t.Fatalf("unknown marker: " + marker)
-		}
-	}
-}
-
-// TestPSSOpenSSL ensures that we can verify a PSS signature from OpenSSL with
-// the default options. OpenSSL sets the salt length to be maximal.
-func TestPSSOpenSSL(t *testing.T) {
-	hash := crypto.SHA256
-	h := hash.New()
-	h.Write([]byte("testing"))
-	hashed := h.Sum(nil)
-
-	// Generated with `echo -n testing | openssl dgst -sign key.pem -sigopt rsa_padding_mode:pss -sha256 > sig`
-	sig := []byte{
-		0x95, 0x59, 0x6f, 0xd3, 0x10, 0xa2, 0xe7, 0xa2, 0x92, 0x9d,
-		0x4a, 0x07, 0x2e, 0x2b, 0x27, 0xcc, 0x06, 0xc2, 0x87, 0x2c,
-		0x52, 0xf0, 0x4a, 0xcc, 0x05, 0x94, 0xf2, 0xc3, 0x2e, 0x20,
-		0xd7, 0x3e, 0x66, 0x62, 0xb5, 0x95, 0x2b, 0xa3, 0x93, 0x9a,
-		0x66, 0x64, 0x25, 0xe0, 0x74, 0x66, 0x8c, 0x3e, 0x92, 0xeb,
-		0xc6, 0xe6, 0xc0, 0x44, 0xf3, 0xb4, 0xb4, 0x2e, 0x8c, 0x66,
-		0x0a, 0x37, 0x9c, 0x69,
-	}
-
-	if err := VerifyPSS(&rsaPrivateKey.PublicKey, hash, hashed, sig, nil); err != nil {
-		t.Error(err)
-	}
-}
-
-func TestPSSNilOpts(t *testing.T) {
-	hash := crypto.SHA256
-	h := hash.New()
-	h.Write([]byte("testing"))
-	hashed := h.Sum(nil)
-
-	SignPSS(rand.Reader, rsaPrivateKey, hash, hashed, nil)
-}
-
-func TestPSSSigning(t *testing.T) {
-	var saltLengthCombinations = []struct {
-		signSaltLength, verifySaltLength int
-		good                             bool
-	}{
-		{PSSSaltLengthAuto, PSSSaltLengthAuto, true},
-		{PSSSaltLengthEqualsHash, PSSSaltLengthAuto, true},
-		{PSSSaltLengthEqualsHash, PSSSaltLengthEqualsHash, true},
-		{PSSSaltLengthEqualsHash, 8, false},
-		{PSSSaltLengthAuto, PSSSaltLengthEqualsHash, false},
-		{8, 8, true},
-	}
-
-	hash := crypto.MD5
-	h := hash.New()
-	h.Write([]byte("testing"))
-	hashed := h.Sum(nil)
-	var opts PSSOptions
-
-	for i, test := range saltLengthCombinations {
-		opts.SaltLength = test.signSaltLength
-		sig, err := SignPSS(rand.Reader, rsaPrivateKey, hash, hashed, &opts)
-		if err != nil {
-			t.Errorf("#%d: error while signing: %s", i, err)
-			continue
-		}
-
-		opts.SaltLength = test.verifySaltLength
-		err = VerifyPSS(&rsaPrivateKey.PublicKey, hash, hashed, sig, &opts)
-		if (err == nil) != test.good {
-			t.Errorf("#%d: bad result, wanted: %t, got: %s", i, test.good, err)
-		}
-	}
-}
-
-func bigFromHex(hex string) *big.Int {
-	n, ok := new(big.Int).SetString(hex, 16)
-	if !ok {
-		panic("bad hex: " + hex)
-	}
-	return n
-}
-
-func intFromHex(hex string) int {
-	i, err := strconv.ParseInt(hex, 16, 32)
-	if err != nil {
-		panic(err)
-	}
-	return int(i)
-}
-
-func fromHex(hexStr string) []byte {
-	s, err := hex.DecodeString(hexStr)
-	if err != nil {
-		panic(err)
-	}
-	return s
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rsa/rsa.go b/third_party/gofrontend/libgo/go/crypto/rsa/rsa.go
deleted file mode 100644
index 1293b78..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rsa/rsa.go
+++ /dev/null
@@ -1,592 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package rsa implements RSA encryption as specified in PKCS#1.
-package rsa
-
-import (
-	"crypto"
-	"crypto/rand"
-	"crypto/subtle"
-	"errors"
-	"hash"
-	"io"
-	"math/big"
-)
-
-var bigZero = big.NewInt(0)
-var bigOne = big.NewInt(1)
-
-// A PublicKey represents the public part of an RSA key.
-type PublicKey struct {
-	N *big.Int // modulus
-	E int      // public exponent
-}
-
-// OAEPOptions is an interface for passing options to OAEP decryption using the
-// crypto.Decrypter interface.
-type OAEPOptions struct {
-	// Hash is the hash function that will be used when generating the mask.
-	Hash crypto.Hash
-	// Label is an arbitrary byte string that must be equal to the value
-	// used when encrypting.
-	Label []byte
-}
-
-var (
-	errPublicModulus       = errors.New("crypto/rsa: missing public modulus")
-	errPublicExponentSmall = errors.New("crypto/rsa: public exponent too small")
-	errPublicExponentLarge = errors.New("crypto/rsa: public exponent too large")
-)
-
-// checkPub sanity checks the public key before we use it.
-// We require pub.E to fit into a 32-bit integer so that we
-// do not have different behavior depending on whether
-// int is 32 or 64 bits. See also
-// http://www.imperialviolet.org/2012/03/16/rsae.html.
-func checkPub(pub *PublicKey) error {
-	if pub.N == nil {
-		return errPublicModulus
-	}
-	if pub.E < 2 {
-		return errPublicExponentSmall
-	}
-	if pub.E > 1<<31-1 {
-		return errPublicExponentLarge
-	}
-	return nil
-}
-
-// A PrivateKey represents an RSA key
-type PrivateKey struct {
-	PublicKey            // public part.
-	D         *big.Int   // private exponent
-	Primes    []*big.Int // prime factors of N, has >= 2 elements.
-
-	// Precomputed contains precomputed values that speed up private
-	// operations, if available.
-	Precomputed PrecomputedValues
-}
-
-// Public returns the public key corresponding to priv.
-func (priv *PrivateKey) Public() crypto.PublicKey {
-	return &priv.PublicKey
-}
-
-// Sign signs msg with priv, reading randomness from rand. If opts is a
-// *PSSOptions then the PSS algorithm will be used, otherwise PKCS#1 v1.5 will
-// be used. This method is intended to support keys where the private part is
-// kept in, for example, a hardware module. Common uses should use the Sign*
-// functions in this package.
-func (priv *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ([]byte, error) {
-	if pssOpts, ok := opts.(*PSSOptions); ok {
-		return SignPSS(rand, priv, pssOpts.Hash, msg, pssOpts)
-	}
-
-	return SignPKCS1v15(rand, priv, opts.HashFunc(), msg)
-}
-
-// Decrypt decrypts ciphertext with priv. If opts is nil or of type
-// *PKCS1v15DecryptOptions then PKCS#1 v1.5 decryption is performed. Otherwise
-// opts must have type *OAEPOptions and OAEP decryption is done.
-func (priv *PrivateKey) Decrypt(rand io.Reader, ciphertext []byte, opts crypto.DecrypterOpts) (plaintext []byte, err error) {
-	if opts == nil {
-		return DecryptPKCS1v15(rand, priv, ciphertext)
-	}
-
-	switch opts := opts.(type) {
-	case *OAEPOptions:
-		return DecryptOAEP(opts.Hash.New(), rand, priv, ciphertext, opts.Label)
-
-	case *PKCS1v15DecryptOptions:
-		if l := opts.SessionKeyLen; l > 0 {
-			plaintext = make([]byte, l)
-			if _, err := io.ReadFull(rand, plaintext); err != nil {
-				return nil, err
-			}
-			if err := DecryptPKCS1v15SessionKey(rand, priv, ciphertext, plaintext); err != nil {
-				return nil, err
-			}
-			return plaintext, nil
-		} else {
-			return DecryptPKCS1v15(rand, priv, ciphertext)
-		}
-
-	default:
-		return nil, errors.New("crypto/rsa: invalid options for Decrypt")
-	}
-}
-
-type PrecomputedValues struct {
-	Dp, Dq *big.Int // D mod (P-1) (or mod Q-1)
-	Qinv   *big.Int // Q^-1 mod P
-
-	// CRTValues is used for the 3rd and subsequent primes. Due to a
-	// historical accident, the CRT for the first two primes is handled
-	// differently in PKCS#1 and interoperability is sufficiently
-	// important that we mirror this.
-	CRTValues []CRTValue
-}
-
-// CRTValue contains the precomputed Chinese remainder theorem values.
-type CRTValue struct {
-	Exp   *big.Int // D mod (prime-1).
-	Coeff *big.Int // R·Coeff ≡ 1 mod Prime.
-	R     *big.Int // product of primes prior to this (inc p and q).
-}
-
-// Validate performs basic sanity checks on the key.
-// It returns nil if the key is valid, or else an error describing a problem.
-func (priv *PrivateKey) Validate() error {
-	if err := checkPub(&priv.PublicKey); err != nil {
-		return err
-	}
-
-	// Check that Πprimes == n.
-	modulus := new(big.Int).Set(bigOne)
-	for _, prime := range priv.Primes {
-		// Any primes ≤ 1 will cause divide-by-zero panics later.
-		if prime.Cmp(bigOne) <= 0 {
-			return errors.New("crypto/rsa: invalid prime value")
-		}
-		modulus.Mul(modulus, prime)
-	}
-	if modulus.Cmp(priv.N) != 0 {
-		return errors.New("crypto/rsa: invalid modulus")
-	}
-
-	// Check that de ≡ 1 mod p-1, for each prime.
-	// This implies that e is coprime to each p-1 as e has a multiplicative
-	// inverse. Therefore e is coprime to lcm(p-1,q-1,r-1,...) =
-	// exponent(ℤ/nℤ). It also implies that a^de ≡ a mod p as a^(p-1) ≡ 1
-	// mod p. Thus a^de ≡ a mod n for all a coprime to n, as required.
-	congruence := new(big.Int)
-	de := new(big.Int).SetInt64(int64(priv.E))
-	de.Mul(de, priv.D)
-	for _, prime := range priv.Primes {
-		pminus1 := new(big.Int).Sub(prime, bigOne)
-		congruence.Mod(de, pminus1)
-		if congruence.Cmp(bigOne) != 0 {
-			return errors.New("crypto/rsa: invalid exponents")
-		}
-	}
-	return nil
-}
-
-// GenerateKey generates an RSA keypair of the given bit size using the
-// random source random (for example, crypto/rand.Reader).
-func GenerateKey(random io.Reader, bits int) (priv *PrivateKey, err error) {
-	return GenerateMultiPrimeKey(random, 2, bits)
-}
-
-// GenerateMultiPrimeKey generates a multi-prime RSA keypair of the given bit
-// size and the given random source, as suggested in [1]. Although the public
-// keys are compatible (actually, indistinguishable) from the 2-prime case,
-// the private keys are not. Thus it may not be possible to export multi-prime
-// private keys in certain formats or to subsequently import them into other
-// code.
-//
-// Table 1 in [2] suggests maximum numbers of primes for a given size.
-//
-// [1] US patent 4405829 (1972, expired)
-// [2] http://www.cacr.math.uwaterloo.ca/techreports/2006/cacr2006-16.pdf
-func GenerateMultiPrimeKey(random io.Reader, nprimes int, bits int) (priv *PrivateKey, err error) {
-	priv = new(PrivateKey)
-	priv.E = 65537
-
-	if nprimes < 2 {
-		return nil, errors.New("crypto/rsa: GenerateMultiPrimeKey: nprimes must be >= 2")
-	}
-
-	primes := make([]*big.Int, nprimes)
-
-NextSetOfPrimes:
-	for {
-		todo := bits
-		// crypto/rand should set the top two bits in each prime.
-		// Thus each prime has the form
-		//   p_i = 2^bitlen(p_i) × 0.11... (in base 2).
-		// And the product is:
-		//   P = 2^todo × α
-		// where α is the product of nprimes numbers of the form 0.11...
-		//
-		// If α < 1/2 (which can happen for nprimes > 2), we need to
-		// shift todo to compensate for lost bits: the mean value of 0.11...
-		// is 7/8, so todo + shift - nprimes * log2(7/8) ~= bits - 1/2
-		// will give good results.
-		if nprimes >= 7 {
-			todo += (nprimes - 2) / 5
-		}
-		for i := 0; i < nprimes; i++ {
-			primes[i], err = rand.Prime(random, todo/(nprimes-i))
-			if err != nil {
-				return nil, err
-			}
-			todo -= primes[i].BitLen()
-		}
-
-		// Make sure that primes is pairwise unequal.
-		for i, prime := range primes {
-			for j := 0; j < i; j++ {
-				if prime.Cmp(primes[j]) == 0 {
-					continue NextSetOfPrimes
-				}
-			}
-		}
-
-		n := new(big.Int).Set(bigOne)
-		totient := new(big.Int).Set(bigOne)
-		pminus1 := new(big.Int)
-		for _, prime := range primes {
-			n.Mul(n, prime)
-			pminus1.Sub(prime, bigOne)
-			totient.Mul(totient, pminus1)
-		}
-		if n.BitLen() != bits {
-			// This should never happen for nprimes == 2 because
-			// crypto/rand should set the top two bits in each prime.
-			// For nprimes > 2 we hope it does not happen often.
-			continue NextSetOfPrimes
-		}
-
-		g := new(big.Int)
-		priv.D = new(big.Int)
-		y := new(big.Int)
-		e := big.NewInt(int64(priv.E))
-		g.GCD(priv.D, y, e, totient)
-
-		if g.Cmp(bigOne) == 0 {
-			if priv.D.Sign() < 0 {
-				priv.D.Add(priv.D, totient)
-			}
-			priv.Primes = primes
-			priv.N = n
-
-			break
-		}
-	}
-
-	priv.Precompute()
-	return
-}
-
-// incCounter increments a four byte, big-endian counter.
-func incCounter(c *[4]byte) {
-	if c[3]++; c[3] != 0 {
-		return
-	}
-	if c[2]++; c[2] != 0 {
-		return
-	}
-	if c[1]++; c[1] != 0 {
-		return
-	}
-	c[0]++
-}
-
-// mgf1XOR XORs the bytes in out with a mask generated using the MGF1 function
-// specified in PKCS#1 v2.1.
-func mgf1XOR(out []byte, hash hash.Hash, seed []byte) {
-	var counter [4]byte
-	var digest []byte
-
-	done := 0
-	for done < len(out) {
-		hash.Write(seed)
-		hash.Write(counter[0:4])
-		digest = hash.Sum(digest[:0])
-		hash.Reset()
-
-		for i := 0; i < len(digest) && done < len(out); i++ {
-			out[done] ^= digest[i]
-			done++
-		}
-		incCounter(&counter)
-	}
-}
-
-// ErrMessageTooLong is returned when attempting to encrypt a message which is
-// too large for the size of the public key.
-var ErrMessageTooLong = errors.New("crypto/rsa: message too long for RSA public key size")
-
-func encrypt(c *big.Int, pub *PublicKey, m *big.Int) *big.Int {
-	e := big.NewInt(int64(pub.E))
-	c.Exp(m, e, pub.N)
-	return c
-}
-
-// EncryptOAEP encrypts the given message with RSA-OAEP.
-// The message must be no longer than the length of the public modulus less
-// twice the hash length plus 2.
-func EncryptOAEP(hash hash.Hash, random io.Reader, pub *PublicKey, msg []byte, label []byte) (out []byte, err error) {
-	if err := checkPub(pub); err != nil {
-		return nil, err
-	}
-	hash.Reset()
-	k := (pub.N.BitLen() + 7) / 8
-	if len(msg) > k-2*hash.Size()-2 {
-		err = ErrMessageTooLong
-		return
-	}
-
-	hash.Write(label)
-	lHash := hash.Sum(nil)
-	hash.Reset()
-
-	em := make([]byte, k)
-	seed := em[1 : 1+hash.Size()]
-	db := em[1+hash.Size():]
-
-	copy(db[0:hash.Size()], lHash)
-	db[len(db)-len(msg)-1] = 1
-	copy(db[len(db)-len(msg):], msg)
-
-	_, err = io.ReadFull(random, seed)
-	if err != nil {
-		return
-	}
-
-	mgf1XOR(db, hash, seed)
-	mgf1XOR(seed, hash, db)
-
-	m := new(big.Int)
-	m.SetBytes(em)
-	c := encrypt(new(big.Int), pub, m)
-	out = c.Bytes()
-
-	if len(out) < k {
-		// If the output is too small, we need to left-pad with zeros.
-		t := make([]byte, k)
-		copy(t[k-len(out):], out)
-		out = t
-	}
-
-	return
-}
-
-// ErrDecryption represents a failure to decrypt a message.
-// It is deliberately vague to avoid adaptive attacks.
-var ErrDecryption = errors.New("crypto/rsa: decryption error")
-
-// ErrVerification represents a failure to verify a signature.
-// It is deliberately vague to avoid adaptive attacks.
-var ErrVerification = errors.New("crypto/rsa: verification error")
-
-// modInverse returns ia, the inverse of a in the multiplicative group of prime
-// order n. It requires that a be a member of the group (i.e. less than n).
-func modInverse(a, n *big.Int) (ia *big.Int, ok bool) {
-	g := new(big.Int)
-	x := new(big.Int)
-	y := new(big.Int)
-	g.GCD(x, y, a, n)
-	if g.Cmp(bigOne) != 0 {
-		// In this case, a and n aren't coprime and we cannot calculate
-		// the inverse. This happens because the values of n are nearly
-		// prime (being the product of two primes) rather than truly
-		// prime.
-		return
-	}
-
-	if x.Cmp(bigOne) < 0 {
-		// 0 is not the multiplicative inverse of any element so, if x
-		// < 1, then x is negative.
-		x.Add(x, n)
-	}
-
-	return x, true
-}
-
-// Precompute performs some calculations that speed up private key operations
-// in the future.
-func (priv *PrivateKey) Precompute() {
-	if priv.Precomputed.Dp != nil {
-		return
-	}
-
-	priv.Precomputed.Dp = new(big.Int).Sub(priv.Primes[0], bigOne)
-	priv.Precomputed.Dp.Mod(priv.D, priv.Precomputed.Dp)
-
-	priv.Precomputed.Dq = new(big.Int).Sub(priv.Primes[1], bigOne)
-	priv.Precomputed.Dq.Mod(priv.D, priv.Precomputed.Dq)
-
-	priv.Precomputed.Qinv = new(big.Int).ModInverse(priv.Primes[1], priv.Primes[0])
-
-	r := new(big.Int).Mul(priv.Primes[0], priv.Primes[1])
-	priv.Precomputed.CRTValues = make([]CRTValue, len(priv.Primes)-2)
-	for i := 2; i < len(priv.Primes); i++ {
-		prime := priv.Primes[i]
-		values := &priv.Precomputed.CRTValues[i-2]
-
-		values.Exp = new(big.Int).Sub(prime, bigOne)
-		values.Exp.Mod(priv.D, values.Exp)
-
-		values.R = new(big.Int).Set(r)
-		values.Coeff = new(big.Int).ModInverse(r, prime)
-
-		r.Mul(r, prime)
-	}
-}
-
-// decrypt performs an RSA decryption, resulting in a plaintext integer. If a
-// random source is given, RSA blinding is used.
-func decrypt(random io.Reader, priv *PrivateKey, c *big.Int) (m *big.Int, err error) {
-	// TODO(agl): can we get away with reusing blinds?
-	if c.Cmp(priv.N) > 0 {
-		err = ErrDecryption
-		return
-	}
-
-	var ir *big.Int
-	if random != nil {
-		// Blinding enabled. Blinding involves multiplying c by r^e.
-		// Then the decryption operation performs (m^e * r^e)^d mod n
-		// which equals mr mod n. The factor of r can then be removed
-		// by multiplying by the multiplicative inverse of r.
-
-		var r *big.Int
-
-		for {
-			r, err = rand.Int(random, priv.N)
-			if err != nil {
-				return
-			}
-			if r.Cmp(bigZero) == 0 {
-				r = bigOne
-			}
-			var ok bool
-			ir, ok = modInverse(r, priv.N)
-			if ok {
-				break
-			}
-		}
-		bigE := big.NewInt(int64(priv.E))
-		rpowe := new(big.Int).Exp(r, bigE, priv.N)
-		cCopy := new(big.Int).Set(c)
-		cCopy.Mul(cCopy, rpowe)
-		cCopy.Mod(cCopy, priv.N)
-		c = cCopy
-	}
-
-	if priv.Precomputed.Dp == nil {
-		m = new(big.Int).Exp(c, priv.D, priv.N)
-	} else {
-		// We have the precalculated values needed for the CRT.
-		m = new(big.Int).Exp(c, priv.Precomputed.Dp, priv.Primes[0])
-		m2 := new(big.Int).Exp(c, priv.Precomputed.Dq, priv.Primes[1])
-		m.Sub(m, m2)
-		if m.Sign() < 0 {
-			m.Add(m, priv.Primes[0])
-		}
-		m.Mul(m, priv.Precomputed.Qinv)
-		m.Mod(m, priv.Primes[0])
-		m.Mul(m, priv.Primes[1])
-		m.Add(m, m2)
-
-		for i, values := range priv.Precomputed.CRTValues {
-			prime := priv.Primes[2+i]
-			m2.Exp(c, values.Exp, prime)
-			m2.Sub(m2, m)
-			m2.Mul(m2, values.Coeff)
-			m2.Mod(m2, prime)
-			if m2.Sign() < 0 {
-				m2.Add(m2, prime)
-			}
-			m2.Mul(m2, values.R)
-			m.Add(m, m2)
-		}
-	}
-
-	if ir != nil {
-		// Unblind.
-		m.Mul(m, ir)
-		m.Mod(m, priv.N)
-	}
-
-	return
-}
-
-// DecryptOAEP decrypts ciphertext using RSA-OAEP.
-// If random != nil, DecryptOAEP uses RSA blinding to avoid timing side-channel attacks.
-func DecryptOAEP(hash hash.Hash, random io.Reader, priv *PrivateKey, ciphertext []byte, label []byte) (msg []byte, err error) {
-	if err := checkPub(&priv.PublicKey); err != nil {
-		return nil, err
-	}
-	k := (priv.N.BitLen() + 7) / 8
-	if len(ciphertext) > k ||
-		k < hash.Size()*2+2 {
-		err = ErrDecryption
-		return
-	}
-
-	c := new(big.Int).SetBytes(ciphertext)
-
-	m, err := decrypt(random, priv, c)
-	if err != nil {
-		return
-	}
-
-	hash.Write(label)
-	lHash := hash.Sum(nil)
-	hash.Reset()
-
-	// Converting the plaintext number to bytes will strip any
-	// leading zeros so we may have to left pad. We do this unconditionally
-	// to avoid leaking timing information. (Although we still probably
-	// leak the number of leading zeros. It's not clear that we can do
-	// anything about this.)
-	em := leftPad(m.Bytes(), k)
-
-	firstByteIsZero := subtle.ConstantTimeByteEq(em[0], 0)
-
-	seed := em[1 : hash.Size()+1]
-	db := em[hash.Size()+1:]
-
-	mgf1XOR(seed, hash, db)
-	mgf1XOR(db, hash, seed)
-
-	lHash2 := db[0:hash.Size()]
-
-	// We have to validate the plaintext in constant time in order to avoid
-	// attacks like: J. Manger. A Chosen Ciphertext Attack on RSA Optimal
-	// Asymmetric Encryption Padding (OAEP) as Standardized in PKCS #1
-	// v2.0. In J. Kilian, editor, Advances in Cryptology.
-	lHash2Good := subtle.ConstantTimeCompare(lHash, lHash2)
-
-	// The remainder of the plaintext must be zero or more 0x00, followed
-	// by 0x01, followed by the message.
-	//   lookingForIndex: 1 iff we are still looking for the 0x01
-	//   index: the offset of the first 0x01 byte
-	//   invalid: 1 iff we saw a non-zero byte before the 0x01.
-	var lookingForIndex, index, invalid int
-	lookingForIndex = 1
-	rest := db[hash.Size():]
-
-	for i := 0; i < len(rest); i++ {
-		equals0 := subtle.ConstantTimeByteEq(rest[i], 0)
-		equals1 := subtle.ConstantTimeByteEq(rest[i], 1)
-		index = subtle.ConstantTimeSelect(lookingForIndex&equals1, i, index)
-		lookingForIndex = subtle.ConstantTimeSelect(equals1, 0, lookingForIndex)
-		invalid = subtle.ConstantTimeSelect(lookingForIndex&^equals0, 1, invalid)
-	}
-
-	if firstByteIsZero&lHash2Good&^invalid&^lookingForIndex != 1 {
-		err = ErrDecryption
-		return
-	}
-
-	msg = rest[index+1:]
-	return
-}
-
-// leftPad returns a new slice of length size. The contents of input are right
-// aligned in the new slice.
-func leftPad(input []byte, size int) (out []byte) {
-	n := len(input)
-	if n > size {
-		n = size
-	}
-	out = make([]byte, size)
-	copy(out[len(out)-n:], input)
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rsa/rsa_test.go b/third_party/gofrontend/libgo/go/crypto/rsa/rsa_test.go
deleted file mode 100644
index 4ee1c3a..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rsa/rsa_test.go
+++ /dev/null
@@ -1,392 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rsa
-
-import (
-	"bytes"
-	"crypto/rand"
-	"crypto/sha1"
-	"math/big"
-	"testing"
-)
-
-func TestKeyGeneration(t *testing.T) {
-	size := 1024
-	if testing.Short() {
-		size = 128
-	}
-	priv, err := GenerateKey(rand.Reader, size)
-	if err != nil {
-		t.Errorf("failed to generate key")
-	}
-	if bits := priv.N.BitLen(); bits != size {
-		t.Errorf("key too short (%d vs %d)", bits, size)
-	}
-	testKeyBasics(t, priv)
-}
-
-func Test3PrimeKeyGeneration(t *testing.T) {
-	size := 768
-	if testing.Short() {
-		size = 256
-	}
-
-	priv, err := GenerateMultiPrimeKey(rand.Reader, 3, size)
-	if err != nil {
-		t.Errorf("failed to generate key")
-	}
-	testKeyBasics(t, priv)
-}
-
-func Test4PrimeKeyGeneration(t *testing.T) {
-	size := 768
-	if testing.Short() {
-		size = 256
-	}
-
-	priv, err := GenerateMultiPrimeKey(rand.Reader, 4, size)
-	if err != nil {
-		t.Errorf("failed to generate key")
-	}
-	testKeyBasics(t, priv)
-}
-
-func TestNPrimeKeyGeneration(t *testing.T) {
-	primeSize := 64
-	maxN := 24
-	if testing.Short() {
-		primeSize = 16
-		maxN = 16
-	}
-	// Test that generation of N-prime keys works for N > 4.
-	for n := 5; n < maxN; n++ {
-		priv, err := GenerateMultiPrimeKey(rand.Reader, n, 64+n*primeSize)
-		if err == nil {
-			testKeyBasics(t, priv)
-		} else {
-			t.Errorf("failed to generate %d-prime key", n)
-		}
-	}
-}
-
-func TestGnuTLSKey(t *testing.T) {
-	// This is a key generated by `certtool --generate-privkey --bits 128`.
-	// It's such that de ≢ 1 mod φ(n), but is congruent mod the order of
-	// the group.
-	priv := &PrivateKey{
-		PublicKey: PublicKey{
-			N: fromBase10("290684273230919398108010081414538931343"),
-			E: 65537,
-		},
-		D: fromBase10("31877380284581499213530787347443987241"),
-		Primes: []*big.Int{
-			fromBase10("16775196964030542637"),
-			fromBase10("17328218193455850539"),
-		},
-	}
-	testKeyBasics(t, priv)
-}
-
-func testKeyBasics(t *testing.T, priv *PrivateKey) {
-	if err := priv.Validate(); err != nil {
-		t.Errorf("Validate() failed: %s", err)
-	}
-	if priv.D.Cmp(priv.N) > 0 {
-		t.Errorf("private exponent too large")
-	}
-
-	pub := &priv.PublicKey
-	m := big.NewInt(42)
-	c := encrypt(new(big.Int), pub, m)
-
-	m2, err := decrypt(nil, priv, c)
-	if err != nil {
-		t.Errorf("error while decrypting: %s", err)
-		return
-	}
-	if m.Cmp(m2) != 0 {
-		t.Errorf("got:%v, want:%v (%+v)", m2, m, priv)
-	}
-
-	m3, err := decrypt(rand.Reader, priv, c)
-	if err != nil {
-		t.Errorf("error while decrypting (blind): %s", err)
-	}
-	if m.Cmp(m3) != 0 {
-		t.Errorf("(blind) got:%v, want:%v (%#v)", m3, m, priv)
-	}
-}
-
-func fromBase10(base10 string) *big.Int {
-	i, ok := new(big.Int).SetString(base10, 10)
-	if !ok {
-		panic("bad number: " + base10)
-	}
-	return i
-}
-
-func BenchmarkRSA2048Decrypt(b *testing.B) {
-	b.StopTimer()
-	priv := &PrivateKey{
-		PublicKey: PublicKey{
-			N: fromBase10("14314132931241006650998084889274020608918049032671858325988396851334124245188214251956198731333464217832226406088020736932173064754214329009979944037640912127943488972644697423190955557435910767690712778463524983667852819010259499695177313115447116110358524558307947613422897787329221478860907963827160223559690523660574329011927531289655711860504630573766609239332569210831325633840174683944553667352219670930408593321661375473885147973879086994006440025257225431977751512374815915392249179976902953721486040787792801849818254465486633791826766873076617116727073077821584676715609985777563958286637185868165868520557"),
-			E: 3,
-		},
-		D: fromBase10("9542755287494004433998723259516013739278699355114572217325597900889416163458809501304132487555642811888150937392013824621448709836142886006653296025093941418628992648429798282127303704957273845127141852309016655778568546006839666463451542076964744073572349705538631742281931858219480985907271975884773482372966847639853897890615456605598071088189838676728836833012254065983259638538107719766738032720239892094196108713378822882383694456030043492571063441943847195939549773271694647657549658603365629458610273821292232646334717612674519997533901052790334279661754176490593041941863932308687197618671528035670452762731"),
-		Primes: []*big.Int{
-			fromBase10("130903255182996722426771613606077755295583329135067340152947172868415809027537376306193179624298874215608270802054347609836776473930072411958753044562214537013874103802006369634761074377213995983876788718033850153719421695468704276694983032644416930879093914927146648402139231293035971427838068945045019075433"),
-			fromBase10("109348945610485453577574767652527472924289229538286649661240938988020367005475727988253438647560958573506159449538793540472829815903949343191091817779240101054552748665267574271163617694640513549693841337820602726596756351006149518830932261246698766355347898158548465400674856021497190430791824869615170301029"),
-		},
-	}
-	priv.Precompute()
-
-	c := fromBase10("8472002792838218989464636159316973636630013835787202418124758118372358261975764365740026024610403138425986214991379012696600761514742817632790916315594342398720903716529235119816755589383377471752116975374952783629225022962092351886861518911824745188989071172097120352727368980275252089141512321893536744324822590480751098257559766328893767334861211872318961900897793874075248286439689249972315699410830094164386544311554704755110361048571142336148077772023880664786019636334369759624917224888206329520528064315309519262325023881707530002540634660750469137117568199824615333883758410040459705787022909848740188613313")
-
-	b.StartTimer()
-
-	for i := 0; i < b.N; i++ {
-		decrypt(nil, priv, c)
-	}
-}
-
-func Benchmark3PrimeRSA2048Decrypt(b *testing.B) {
-	b.StopTimer()
-	priv := &PrivateKey{
-		PublicKey: PublicKey{
-			N: fromBase10("16346378922382193400538269749936049106320265317511766357599732575277382844051791096569333808598921852351577762718529818072849191122419410612033592401403764925096136759934497687765453905884149505175426053037420486697072448609022753683683718057795566811401938833367954642951433473337066311978821180526439641496973296037000052546108507805269279414789035461158073156772151892452251106173507240488993608650881929629163465099476849643165682709047462010581308719577053905787496296934240246311806555924593059995202856826239801816771116902778517096212527979497399966526283516447337775509777558018145573127308919204297111496233"),
-			E: 3,
-		},
-		D: fromBase10("10897585948254795600358846499957366070880176878341177571733155050184921896034527397712889205732614568234385175145686545381899460748279607074689061600935843283397424506622998458510302603922766336783617368686090042765718290914099334449154829375179958369993407724946186243249568928237086215759259909861748642124071874879861299389874230489928271621259294894142840428407196932444474088857746123104978617098858619445675532587787023228852383149557470077802718705420275739737958953794088728369933811184572620857678792001136676902250566845618813972833750098806496641114644760255910789397593428910198080271317419213080834885003"),
-		Primes: []*big.Int{
-			fromBase10("1025363189502892836833747188838978207017355117492483312747347695538428729137306368764177201532277413433182799108299960196606011786562992097313508180436744488171474690412562218914213688661311117337381958560443"),
-			fromBase10("3467903426626310123395340254094941045497208049900750380025518552334536945536837294961497712862519984786362199788654739924501424784631315081391467293694361474867825728031147665777546570788493758372218019373"),
-			fromBase10("4597024781409332673052708605078359346966325141767460991205742124888960305710298765592730135879076084498363772408626791576005136245060321874472727132746643162385746062759369754202494417496879741537284589047"),
-		},
-	}
-	priv.Precompute()
-
-	c := fromBase10("8472002792838218989464636159316973636630013835787202418124758118372358261975764365740026024610403138425986214991379012696600761514742817632790916315594342398720903716529235119816755589383377471752116975374952783629225022962092351886861518911824745188989071172097120352727368980275252089141512321893536744324822590480751098257559766328893767334861211872318961900897793874075248286439689249972315699410830094164386544311554704755110361048571142336148077772023880664786019636334369759624917224888206329520528064315309519262325023881707530002540634660750469137117568199824615333883758410040459705787022909848740188613313")
-
-	b.StartTimer()
-
-	for i := 0; i < b.N; i++ {
-		decrypt(nil, priv, c)
-	}
-}
-
-type testEncryptOAEPMessage struct {
-	in   []byte
-	seed []byte
-	out  []byte
-}
-
-type testEncryptOAEPStruct struct {
-	modulus string
-	e       int
-	d       string
-	msgs    []testEncryptOAEPMessage
-}
-
-func TestEncryptOAEP(t *testing.T) {
-	sha1 := sha1.New()
-	n := new(big.Int)
-	for i, test := range testEncryptOAEPData {
-		n.SetString(test.modulus, 16)
-		public := PublicKey{n, test.e}
-
-		for j, message := range test.msgs {
-			randomSource := bytes.NewReader(message.seed)
-			out, err := EncryptOAEP(sha1, randomSource, &public, message.in, nil)
-			if err != nil {
-				t.Errorf("#%d,%d error: %s", i, j, err)
-			}
-			if !bytes.Equal(out, message.out) {
-				t.Errorf("#%d,%d bad result: %x (want %x)", i, j, out, message.out)
-			}
-		}
-	}
-}
-
-func TestDecryptOAEP(t *testing.T) {
-	random := rand.Reader
-
-	sha1 := sha1.New()
-	n := new(big.Int)
-	d := new(big.Int)
-	for i, test := range testEncryptOAEPData {
-		n.SetString(test.modulus, 16)
-		d.SetString(test.d, 16)
-		private := new(PrivateKey)
-		private.PublicKey = PublicKey{n, test.e}
-		private.D = d
-
-		for j, message := range test.msgs {
-			out, err := DecryptOAEP(sha1, nil, private, message.out, nil)
-			if err != nil {
-				t.Errorf("#%d,%d error: %s", i, j, err)
-			} else if !bytes.Equal(out, message.in) {
-				t.Errorf("#%d,%d bad result: %#v (want %#v)", i, j, out, message.in)
-			}
-
-			// Decrypt with blinding.
-			out, err = DecryptOAEP(sha1, random, private, message.out, nil)
-			if err != nil {
-				t.Errorf("#%d,%d (blind) error: %s", i, j, err)
-			} else if !bytes.Equal(out, message.in) {
-				t.Errorf("#%d,%d (blind) bad result: %#v (want %#v)", i, j, out, message.in)
-			}
-		}
-		if testing.Short() {
-			break
-		}
-	}
-}
-
-// testEncryptOAEPData contains a subset of the vectors from RSA's "Test vectors for RSA-OAEP".
-var testEncryptOAEPData = []testEncryptOAEPStruct{
-	// Key 1
-	{"a8b3b284af8eb50b387034a860f146c4919f318763cd6c5598c8ae4811a1e0abc4c7e0b082d693a5e7fced675cf4668512772c0cbc64a742c6c630f533c8cc72f62ae833c40bf25842e984bb78bdbf97c0107d55bdb662f5c4e0fab9845cb5148ef7392dd3aaff93ae1e6b667bb3d4247616d4f5ba10d4cfd226de88d39f16fb",
-		65537,
-		"53339cfdb79fc8466a655c7316aca85c55fd8f6dd898fdaf119517ef4f52e8fd8e258df93fee180fa0e4ab29693cd83b152a553d4ac4d1812b8b9fa5af0e7f55fe7304df41570926f3311f15c4d65a732c483116ee3d3d2d0af3549ad9bf7cbfb78ad884f84d5beb04724dc7369b31def37d0cf539e9cfcdd3de653729ead5d1",
-		[]testEncryptOAEPMessage{
-			// Example 1.1
-			{
-				[]byte{0x66, 0x28, 0x19, 0x4e, 0x12, 0x07, 0x3d, 0xb0,
-					0x3b, 0xa9, 0x4c, 0xda, 0x9e, 0xf9, 0x53, 0x23, 0x97,
-					0xd5, 0x0d, 0xba, 0x79, 0xb9, 0x87, 0x00, 0x4a, 0xfe,
-					0xfe, 0x34,
-				},
-				[]byte{0x18, 0xb7, 0x76, 0xea, 0x21, 0x06, 0x9d, 0x69,
-					0x77, 0x6a, 0x33, 0xe9, 0x6b, 0xad, 0x48, 0xe1, 0xdd,
-					0xa0, 0xa5, 0xef,
-				},
-				[]byte{0x35, 0x4f, 0xe6, 0x7b, 0x4a, 0x12, 0x6d, 0x5d,
-					0x35, 0xfe, 0x36, 0xc7, 0x77, 0x79, 0x1a, 0x3f, 0x7b,
-					0xa1, 0x3d, 0xef, 0x48, 0x4e, 0x2d, 0x39, 0x08, 0xaf,
-					0xf7, 0x22, 0xfa, 0xd4, 0x68, 0xfb, 0x21, 0x69, 0x6d,
-					0xe9, 0x5d, 0x0b, 0xe9, 0x11, 0xc2, 0xd3, 0x17, 0x4f,
-					0x8a, 0xfc, 0xc2, 0x01, 0x03, 0x5f, 0x7b, 0x6d, 0x8e,
-					0x69, 0x40, 0x2d, 0xe5, 0x45, 0x16, 0x18, 0xc2, 0x1a,
-					0x53, 0x5f, 0xa9, 0xd7, 0xbf, 0xc5, 0xb8, 0xdd, 0x9f,
-					0xc2, 0x43, 0xf8, 0xcf, 0x92, 0x7d, 0xb3, 0x13, 0x22,
-					0xd6, 0xe8, 0x81, 0xea, 0xa9, 0x1a, 0x99, 0x61, 0x70,
-					0xe6, 0x57, 0xa0, 0x5a, 0x26, 0x64, 0x26, 0xd9, 0x8c,
-					0x88, 0x00, 0x3f, 0x84, 0x77, 0xc1, 0x22, 0x70, 0x94,
-					0xa0, 0xd9, 0xfa, 0x1e, 0x8c, 0x40, 0x24, 0x30, 0x9c,
-					0xe1, 0xec, 0xcc, 0xb5, 0x21, 0x00, 0x35, 0xd4, 0x7a,
-					0xc7, 0x2e, 0x8a,
-				},
-			},
-			// Example 1.2
-			{
-				[]byte{0x75, 0x0c, 0x40, 0x47, 0xf5, 0x47, 0xe8, 0xe4,
-					0x14, 0x11, 0x85, 0x65, 0x23, 0x29, 0x8a, 0xc9, 0xba,
-					0xe2, 0x45, 0xef, 0xaf, 0x13, 0x97, 0xfb, 0xe5, 0x6f,
-					0x9d, 0xd5,
-				},
-				[]byte{0x0c, 0xc7, 0x42, 0xce, 0x4a, 0x9b, 0x7f, 0x32,
-					0xf9, 0x51, 0xbc, 0xb2, 0x51, 0xef, 0xd9, 0x25, 0xfe,
-					0x4f, 0xe3, 0x5f,
-				},
-				[]byte{0x64, 0x0d, 0xb1, 0xac, 0xc5, 0x8e, 0x05, 0x68,
-					0xfe, 0x54, 0x07, 0xe5, 0xf9, 0xb7, 0x01, 0xdf, 0xf8,
-					0xc3, 0xc9, 0x1e, 0x71, 0x6c, 0x53, 0x6f, 0xc7, 0xfc,
-					0xec, 0x6c, 0xb5, 0xb7, 0x1c, 0x11, 0x65, 0x98, 0x8d,
-					0x4a, 0x27, 0x9e, 0x15, 0x77, 0xd7, 0x30, 0xfc, 0x7a,
-					0x29, 0x93, 0x2e, 0x3f, 0x00, 0xc8, 0x15, 0x15, 0x23,
-					0x6d, 0x8d, 0x8e, 0x31, 0x01, 0x7a, 0x7a, 0x09, 0xdf,
-					0x43, 0x52, 0xd9, 0x04, 0xcd, 0xeb, 0x79, 0xaa, 0x58,
-					0x3a, 0xdc, 0xc3, 0x1e, 0xa6, 0x98, 0xa4, 0xc0, 0x52,
-					0x83, 0xda, 0xba, 0x90, 0x89, 0xbe, 0x54, 0x91, 0xf6,
-					0x7c, 0x1a, 0x4e, 0xe4, 0x8d, 0xc7, 0x4b, 0xbb, 0xe6,
-					0x64, 0x3a, 0xef, 0x84, 0x66, 0x79, 0xb4, 0xcb, 0x39,
-					0x5a, 0x35, 0x2d, 0x5e, 0xd1, 0x15, 0x91, 0x2d, 0xf6,
-					0x96, 0xff, 0xe0, 0x70, 0x29, 0x32, 0x94, 0x6d, 0x71,
-					0x49, 0x2b, 0x44,
-				},
-			},
-			// Example 1.3
-			{
-				[]byte{0xd9, 0x4a, 0xe0, 0x83, 0x2e, 0x64, 0x45, 0xce,
-					0x42, 0x33, 0x1c, 0xb0, 0x6d, 0x53, 0x1a, 0x82, 0xb1,
-					0xdb, 0x4b, 0xaa, 0xd3, 0x0f, 0x74, 0x6d, 0xc9, 0x16,
-					0xdf, 0x24, 0xd4, 0xe3, 0xc2, 0x45, 0x1f, 0xff, 0x59,
-					0xa6, 0x42, 0x3e, 0xb0, 0xe1, 0xd0, 0x2d, 0x4f, 0xe6,
-					0x46, 0xcf, 0x69, 0x9d, 0xfd, 0x81, 0x8c, 0x6e, 0x97,
-					0xb0, 0x51,
-				},
-				[]byte{0x25, 0x14, 0xdf, 0x46, 0x95, 0x75, 0x5a, 0x67,
-					0xb2, 0x88, 0xea, 0xf4, 0x90, 0x5c, 0x36, 0xee, 0xc6,
-					0x6f, 0xd2, 0xfd,
-				},
-				[]byte{0x42, 0x37, 0x36, 0xed, 0x03, 0x5f, 0x60, 0x26,
-					0xaf, 0x27, 0x6c, 0x35, 0xc0, 0xb3, 0x74, 0x1b, 0x36,
-					0x5e, 0x5f, 0x76, 0xca, 0x09, 0x1b, 0x4e, 0x8c, 0x29,
-					0xe2, 0xf0, 0xbe, 0xfe, 0xe6, 0x03, 0x59, 0x5a, 0xa8,
-					0x32, 0x2d, 0x60, 0x2d, 0x2e, 0x62, 0x5e, 0x95, 0xeb,
-					0x81, 0xb2, 0xf1, 0xc9, 0x72, 0x4e, 0x82, 0x2e, 0xca,
-					0x76, 0xdb, 0x86, 0x18, 0xcf, 0x09, 0xc5, 0x34, 0x35,
-					0x03, 0xa4, 0x36, 0x08, 0x35, 0xb5, 0x90, 0x3b, 0xc6,
-					0x37, 0xe3, 0x87, 0x9f, 0xb0, 0x5e, 0x0e, 0xf3, 0x26,
-					0x85, 0xd5, 0xae, 0xc5, 0x06, 0x7c, 0xd7, 0xcc, 0x96,
-					0xfe, 0x4b, 0x26, 0x70, 0xb6, 0xea, 0xc3, 0x06, 0x6b,
-					0x1f, 0xcf, 0x56, 0x86, 0xb6, 0x85, 0x89, 0xaa, 0xfb,
-					0x7d, 0x62, 0x9b, 0x02, 0xd8, 0xf8, 0x62, 0x5c, 0xa3,
-					0x83, 0x36, 0x24, 0xd4, 0x80, 0x0f, 0xb0, 0x81, 0xb1,
-					0xcf, 0x94, 0xeb,
-				},
-			},
-		},
-	},
-	// Key 10
-	{"ae45ed5601cec6b8cc05f803935c674ddbe0d75c4c09fd7951fc6b0caec313a8df39970c518bffba5ed68f3f0d7f22a4029d413f1ae07e4ebe9e4177ce23e7f5404b569e4ee1bdcf3c1fb03ef113802d4f855eb9b5134b5a7c8085adcae6fa2fa1417ec3763be171b0c62b760ede23c12ad92b980884c641f5a8fac26bdad4a03381a22fe1b754885094c82506d4019a535a286afeb271bb9ba592de18dcf600c2aeeae56e02f7cf79fc14cf3bdc7cd84febbbf950ca90304b2219a7aa063aefa2c3c1980e560cd64afe779585b6107657b957857efde6010988ab7de417fc88d8f384c4e6e72c3f943e0c31c0c4a5cc36f879d8a3ac9d7d59860eaada6b83bb",
-		65537,
-		"056b04216fe5f354ac77250a4b6b0c8525a85c59b0bd80c56450a22d5f438e596a333aa875e291dd43f48cb88b9d5fc0d499f9fcd1c397f9afc070cd9e398c8d19e61db7c7410a6b2675dfbf5d345b804d201add502d5ce2dfcb091ce9997bbebe57306f383e4d588103f036f7e85d1934d152a323e4a8db451d6f4a5b1b0f102cc150e02feee2b88dea4ad4c1baccb24d84072d14e1d24a6771f7408ee30564fb86d4393a34bcf0b788501d193303f13a2284b001f0f649eaf79328d4ac5c430ab4414920a9460ed1b7bc40ec653e876d09abc509ae45b525190116a0c26101848298509c1c3bf3a483e7274054e15e97075036e989f60932807b5257751e79",
-		[]testEncryptOAEPMessage{
-			// Example 10.1
-			{
-				[]byte{0x8b, 0xba, 0x6b, 0xf8, 0x2a, 0x6c, 0x0f, 0x86,
-					0xd5, 0xf1, 0x75, 0x6e, 0x97, 0x95, 0x68, 0x70, 0xb0,
-					0x89, 0x53, 0xb0, 0x6b, 0x4e, 0xb2, 0x05, 0xbc, 0x16,
-					0x94, 0xee,
-				},
-				[]byte{0x47, 0xe1, 0xab, 0x71, 0x19, 0xfe, 0xe5, 0x6c,
-					0x95, 0xee, 0x5e, 0xaa, 0xd8, 0x6f, 0x40, 0xd0, 0xaa,
-					0x63, 0xbd, 0x33,
-				},
-				[]byte{0x53, 0xea, 0x5d, 0xc0, 0x8c, 0xd2, 0x60, 0xfb,
-					0x3b, 0x85, 0x85, 0x67, 0x28, 0x7f, 0xa9, 0x15, 0x52,
-					0xc3, 0x0b, 0x2f, 0xeb, 0xfb, 0xa2, 0x13, 0xf0, 0xae,
-					0x87, 0x70, 0x2d, 0x06, 0x8d, 0x19, 0xba, 0xb0, 0x7f,
-					0xe5, 0x74, 0x52, 0x3d, 0xfb, 0x42, 0x13, 0x9d, 0x68,
-					0xc3, 0xc5, 0xaf, 0xee, 0xe0, 0xbf, 0xe4, 0xcb, 0x79,
-					0x69, 0xcb, 0xf3, 0x82, 0xb8, 0x04, 0xd6, 0xe6, 0x13,
-					0x96, 0x14, 0x4e, 0x2d, 0x0e, 0x60, 0x74, 0x1f, 0x89,
-					0x93, 0xc3, 0x01, 0x4b, 0x58, 0xb9, 0xb1, 0x95, 0x7a,
-					0x8b, 0xab, 0xcd, 0x23, 0xaf, 0x85, 0x4f, 0x4c, 0x35,
-					0x6f, 0xb1, 0x66, 0x2a, 0xa7, 0x2b, 0xfc, 0xc7, 0xe5,
-					0x86, 0x55, 0x9d, 0xc4, 0x28, 0x0d, 0x16, 0x0c, 0x12,
-					0x67, 0x85, 0xa7, 0x23, 0xeb, 0xee, 0xbe, 0xff, 0x71,
-					0xf1, 0x15, 0x94, 0x44, 0x0a, 0xae, 0xf8, 0x7d, 0x10,
-					0x79, 0x3a, 0x87, 0x74, 0xa2, 0x39, 0xd4, 0xa0, 0x4c,
-					0x87, 0xfe, 0x14, 0x67, 0xb9, 0xda, 0xf8, 0x52, 0x08,
-					0xec, 0x6c, 0x72, 0x55, 0x79, 0x4a, 0x96, 0xcc, 0x29,
-					0x14, 0x2f, 0x9a, 0x8b, 0xd4, 0x18, 0xe3, 0xc1, 0xfd,
-					0x67, 0x34, 0x4b, 0x0c, 0xd0, 0x82, 0x9d, 0xf3, 0xb2,
-					0xbe, 0xc6, 0x02, 0x53, 0x19, 0x62, 0x93, 0xc6, 0xb3,
-					0x4d, 0x3f, 0x75, 0xd3, 0x2f, 0x21, 0x3d, 0xd4, 0x5c,
-					0x62, 0x73, 0xd5, 0x05, 0xad, 0xf4, 0xcc, 0xed, 0x10,
-					0x57, 0xcb, 0x75, 0x8f, 0xc2, 0x6a, 0xee, 0xfa, 0x44,
-					0x12, 0x55, 0xed, 0x4e, 0x64, 0xc1, 0x99, 0xee, 0x07,
-					0x5e, 0x7f, 0x16, 0x64, 0x61, 0x82, 0xfd, 0xb4, 0x64,
-					0x73, 0x9b, 0x68, 0xab, 0x5d, 0xaf, 0xf0, 0xe6, 0x3e,
-					0x95, 0x52, 0x01, 0x68, 0x24, 0xf0, 0x54, 0xbf, 0x4d,
-					0x3c, 0x8c, 0x90, 0xa9, 0x7b, 0xb6, 0xb6, 0x55, 0x32,
-					0x84, 0xeb, 0x42, 0x9f, 0xcc,
-				},
-			},
-		},
-	},
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/rsa/testdata/pss-vect.txt.bz2 b/third_party/gofrontend/libgo/go/crypto/rsa/testdata/pss-vect.txt.bz2
deleted file mode 100644
index ad3da1a..0000000
--- a/third_party/gofrontend/libgo/go/crypto/rsa/testdata/pss-vect.txt.bz2
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/crypto/sha1/sha1.go b/third_party/gofrontend/libgo/go/crypto/sha1/sha1.go
deleted file mode 100644
index 9f1a96e..0000000
--- a/third_party/gofrontend/libgo/go/crypto/sha1/sha1.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package sha1 implements the SHA1 hash algorithm as defined in RFC 3174.
-package sha1
-
-import (
-	"crypto"
-	"hash"
-)
-
-func init() {
-	crypto.RegisterHash(crypto.SHA1, New)
-}
-
-// The size of a SHA1 checksum in bytes.
-const Size = 20
-
-// The blocksize of SHA1 in bytes.
-const BlockSize = 64
-
-const (
-	chunk = 64
-	init0 = 0x67452301
-	init1 = 0xEFCDAB89
-	init2 = 0x98BADCFE
-	init3 = 0x10325476
-	init4 = 0xC3D2E1F0
-)
-
-// digest represents the partial evaluation of a checksum.
-type digest struct {
-	h   [5]uint32
-	x   [chunk]byte
-	nx  int
-	len uint64
-}
-
-func (d *digest) Reset() {
-	d.h[0] = init0
-	d.h[1] = init1
-	d.h[2] = init2
-	d.h[3] = init3
-	d.h[4] = init4
-	d.nx = 0
-	d.len = 0
-}
-
-// New returns a new hash.Hash computing the SHA1 checksum.
-func New() hash.Hash {
-	d := new(digest)
-	d.Reset()
-	return d
-}
-
-func (d *digest) Size() int { return Size }
-
-func (d *digest) BlockSize() int { return BlockSize }
-
-func (d *digest) Write(p []byte) (nn int, err error) {
-	nn = len(p)
-	d.len += uint64(nn)
-	if d.nx > 0 {
-		n := copy(d.x[d.nx:], p)
-		d.nx += n
-		if d.nx == chunk {
-			block(d, d.x[:])
-			d.nx = 0
-		}
-		p = p[n:]
-	}
-	if len(p) >= chunk {
-		n := len(p) &^ (chunk - 1)
-		block(d, p[:n])
-		p = p[n:]
-	}
-	if len(p) > 0 {
-		d.nx = copy(d.x[:], p)
-	}
-	return
-}
-
-func (d0 *digest) Sum(in []byte) []byte {
-	// Make a copy of d0 so that caller can keep writing and summing.
-	d := *d0
-	hash := d.checkSum()
-	return append(in, hash[:]...)
-}
-
-func (d *digest) checkSum() [Size]byte {
-	len := d.len
-	// Padding.  Add a 1 bit and 0 bits until 56 bytes mod 64.
-	var tmp [64]byte
-	tmp[0] = 0x80
-	if len%64 < 56 {
-		d.Write(tmp[0 : 56-len%64])
-	} else {
-		d.Write(tmp[0 : 64+56-len%64])
-	}
-
-	// Length in bits.
-	len <<= 3
-	for i := uint(0); i < 8; i++ {
-		tmp[i] = byte(len >> (56 - 8*i))
-	}
-	d.Write(tmp[0:8])
-
-	if d.nx != 0 {
-		panic("d.nx != 0")
-	}
-
-	var digest [Size]byte
-	for i, s := range d.h {
-		digest[i*4] = byte(s >> 24)
-		digest[i*4+1] = byte(s >> 16)
-		digest[i*4+2] = byte(s >> 8)
-		digest[i*4+3] = byte(s)
-	}
-
-	return digest
-}
-
-// Sum returns the SHA1 checksum of the data.
-func Sum(data []byte) [Size]byte {
-	var d digest
-	d.Reset()
-	d.Write(data)
-	return d.checkSum()
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/sha1/sha1_test.go b/third_party/gofrontend/libgo/go/crypto/sha1/sha1_test.go
deleted file mode 100644
index 4a62951..0000000
--- a/third_party/gofrontend/libgo/go/crypto/sha1/sha1_test.go
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// SHA1 hash algorithm.  See RFC 3174.
-
-package sha1
-
-import (
-	"crypto/rand"
-	"fmt"
-	"io"
-	"testing"
-)
-
-type sha1Test struct {
-	out string
-	in  string
-}
-
-var golden = []sha1Test{
-	{"da39a3ee5e6b4b0d3255bfef95601890afd80709", ""},
-	{"86f7e437faa5a7fce15d1ddcb9eaeaea377667b8", "a"},
-	{"da23614e02469a0d7c7bd1bdab5c9c474b1904dc", "ab"},
-	{"a9993e364706816aba3e25717850c26c9cd0d89d", "abc"},
-	{"81fe8bfe87576c3ecb22426f8e57847382917acf", "abcd"},
-	{"03de6c570bfe24bfc328ccd7ca46b76eadaf4334", "abcde"},
-	{"1f8ac10f23c5b5bc1167bda84b833e5c057a77d2", "abcdef"},
-	{"2fb5e13419fc89246865e7a324f476ec624e8740", "abcdefg"},
-	{"425af12a0743502b322e93a015bcf868e324d56a", "abcdefgh"},
-	{"c63b19f1e4c8b5f76b25c49b8b87f57d8e4872a1", "abcdefghi"},
-	{"d68c19a0a345b7eab78d5e11e991c026ec60db63", "abcdefghij"},
-	{"ebf81ddcbe5bf13aaabdc4d65354fdf2044f38a7", "Discard medicine more than two years old."},
-	{"e5dea09392dd886ca63531aaa00571dc07554bb6", "He who has a shady past knows that nice guys finish last."},
-	{"45988f7234467b94e3e9494434c96ee3609d8f8f", "I wouldn't marry him with a ten foot pole."},
-	{"55dee037eb7460d5a692d1ce11330b260e40c988", "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave"},
-	{"b7bc5fb91080c7de6b582ea281f8a396d7c0aee8", "The days of the digital watch are numbered.  -Tom Stoppard"},
-	{"c3aed9358f7c77f523afe86135f06b95b3999797", "Nepal premier won't resign."},
-	{"6e29d302bf6e3a5e4305ff318d983197d6906bb9", "For every action there is an equal and opposite government program."},
-	{"597f6a540010f94c15d71806a99a2c8710e747bd", "His money is twice tainted: 'taint yours and 'taint mine."},
-	{"6859733b2590a8a091cecf50086febc5ceef1e80", "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977"},
-	{"514b2630ec089b8aee18795fc0cf1f4860cdacad", "It's a tiny change to the code and not completely disgusting. - Bob Manchek"},
-	{"c5ca0d4a7b6676fc7aa72caa41cc3d5df567ed69", "size:  a.out:  bad magic"},
-	{"74c51fa9a04eadc8c1bbeaa7fc442f834b90a00a", "The major problem is with sendmail.  -Mark Horton"},
-	{"0b4c4ce5f52c3ad2821852a8dc00217fa18b8b66", "Give me a rock, paper and scissors and I will move the world.  CCFestoon"},
-	{"3ae7937dd790315beb0f48330e8642237c61550a", "If the enemy is within range, then so are you."},
-	{"410a2b296df92b9a47412b13281df8f830a9f44b", "It's well we cannot hear the screams/That we create in others' dreams."},
-	{"841e7c85ca1adcddbdd0187f1289acb5c642f7f5", "You remind me of a TV show, but that's all right: I watch it anyway."},
-	{"163173b825d03b952601376b25212df66763e1db", "C is as portable as Stonehedge!!"},
-	{"32b0377f2687eb88e22106f133c586ab314d5279", "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley"},
-	{"0885aaf99b569542fd165fa44e322718f4a984e0", "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction.  Lewis-Randall Rule"},
-	{"6627d6904d71420b0bf3886ab629623538689f45", "How can you write a big system without C++?  -Paul Glick"},
-}
-
-func TestGolden(t *testing.T) {
-	for i := 0; i < len(golden); i++ {
-		g := golden[i]
-		s := fmt.Sprintf("%x", Sum([]byte(g.in)))
-		if s != g.out {
-			t.Fatalf("Sum function: sha1(%s) = %s want %s", g.in, s, g.out)
-		}
-		c := New()
-		for j := 0; j < 3; j++ {
-			if j < 2 {
-				io.WriteString(c, g.in)
-			} else {
-				io.WriteString(c, g.in[0:len(g.in)/2])
-				c.Sum(nil)
-				io.WriteString(c, g.in[len(g.in)/2:])
-			}
-			s := fmt.Sprintf("%x", c.Sum(nil))
-			if s != g.out {
-				t.Fatalf("sha1[%d](%s) = %s want %s", j, g.in, s, g.out)
-			}
-			c.Reset()
-		}
-	}
-}
-
-func TestSize(t *testing.T) {
-	c := New()
-	if got := c.Size(); got != Size {
-		t.Errorf("Size = %d; want %d", got, Size)
-	}
-}
-
-func TestBlockSize(t *testing.T) {
-	c := New()
-	if got := c.BlockSize(); got != BlockSize {
-		t.Errorf("BlockSize = %d; want %d", got, BlockSize)
-	}
-}
-
-// Tests that blockGeneric (pure Go) and block (in assembly for amd64, 386, arm) match.
-func TestBlockGeneric(t *testing.T) {
-	gen, asm := New().(*digest), New().(*digest)
-	buf := make([]byte, BlockSize*20) // arbitrary factor
-	rand.Read(buf)
-	blockGeneric(gen, buf)
-	block(asm, buf)
-	if *gen != *asm {
-		t.Error("block and blockGeneric resulted in different states")
-	}
-}
-
-var bench = New()
-var buf = make([]byte, 8192)
-
-func benchmarkSize(b *testing.B, size int) {
-	b.SetBytes(int64(size))
-	sum := make([]byte, bench.Size())
-	for i := 0; i < b.N; i++ {
-		bench.Reset()
-		bench.Write(buf[:size])
-		bench.Sum(sum[:0])
-	}
-}
-
-func BenchmarkHash8Bytes(b *testing.B) {
-	benchmarkSize(b, 8)
-}
-
-func BenchmarkHash1K(b *testing.B) {
-	benchmarkSize(b, 1024)
-}
-
-func BenchmarkHash8K(b *testing.B) {
-	benchmarkSize(b, 8192)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/sha1/sha1block.go b/third_party/gofrontend/libgo/go/crypto/sha1/sha1block.go
deleted file mode 100644
index fde3c98..0000000
--- a/third_party/gofrontend/libgo/go/crypto/sha1/sha1block.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sha1
-
-const (
-	_K0 = 0x5A827999
-	_K1 = 0x6ED9EBA1
-	_K2 = 0x8F1BBCDC
-	_K3 = 0xCA62C1D6
-)
-
-// blockGeneric is a portable, pure Go version of the SHA1 block step.
-// It's used by sha1block_generic.go and tests.
-func blockGeneric(dig *digest, p []byte) {
-	var w [16]uint32
-
-	h0, h1, h2, h3, h4 := dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4]
-	for len(p) >= chunk {
-		// Can interlace the computation of w with the
-		// rounds below if needed for speed.
-		for i := 0; i < 16; i++ {
-			j := i * 4
-			w[i] = uint32(p[j])<<24 | uint32(p[j+1])<<16 | uint32(p[j+2])<<8 | uint32(p[j+3])
-		}
-
-		a, b, c, d, e := h0, h1, h2, h3, h4
-
-		// Each of the four 20-iteration rounds
-		// differs only in the computation of f and
-		// the choice of K (_K0, _K1, etc).
-		i := 0
-		for ; i < 16; i++ {
-			f := b&c | (^b)&d
-			a5 := a<<5 | a>>(32-5)
-			b30 := b<<30 | b>>(32-30)
-			t := a5 + f + e + w[i&0xf] + _K0
-			a, b, c, d, e = t, a, b30, c, d
-		}
-		for ; i < 20; i++ {
-			tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
-			w[i&0xf] = tmp<<1 | tmp>>(32-1)
-
-			f := b&c | (^b)&d
-			a5 := a<<5 | a>>(32-5)
-			b30 := b<<30 | b>>(32-30)
-			t := a5 + f + e + w[i&0xf] + _K0
-			a, b, c, d, e = t, a, b30, c, d
-		}
-		for ; i < 40; i++ {
-			tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
-			w[i&0xf] = tmp<<1 | tmp>>(32-1)
-			f := b ^ c ^ d
-			a5 := a<<5 | a>>(32-5)
-			b30 := b<<30 | b>>(32-30)
-			t := a5 + f + e + w[i&0xf] + _K1
-			a, b, c, d, e = t, a, b30, c, d
-		}
-		for ; i < 60; i++ {
-			tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
-			w[i&0xf] = tmp<<1 | tmp>>(32-1)
-			f := ((b | c) & d) | (b & c)
-
-			a5 := a<<5 | a>>(32-5)
-			b30 := b<<30 | b>>(32-30)
-			t := a5 + f + e + w[i&0xf] + _K2
-			a, b, c, d, e = t, a, b30, c, d
-		}
-		for ; i < 80; i++ {
-			tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf]
-			w[i&0xf] = tmp<<1 | tmp>>(32-1)
-			f := b ^ c ^ d
-			a5 := a<<5 | a>>(32-5)
-			b30 := b<<30 | b>>(32-30)
-			t := a5 + f + e + w[i&0xf] + _K3
-			a, b, c, d, e = t, a, b30, c, d
-		}
-
-		h0 += a
-		h1 += b
-		h2 += c
-		h3 += d
-		h4 += e
-
-		p = p[chunk:]
-	}
-
-	dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4] = h0, h1, h2, h3, h4
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/sha1/sha1block_decl.go b/third_party/gofrontend/libgo/go/crypto/sha1/sha1block_decl.go
deleted file mode 100644
index 24e521a..0000000
--- a/third_party/gofrontend/libgo/go/crypto/sha1/sha1block_decl.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64 amd64p32 arm 386
-
-package sha1
-
-//go:noescape
-
-func block(dig *digest, p []byte)
diff --git a/third_party/gofrontend/libgo/go/crypto/sha1/sha1block_generic.go b/third_party/gofrontend/libgo/go/crypto/sha1/sha1block_generic.go
deleted file mode 100644
index 696e26b..0000000
--- a/third_party/gofrontend/libgo/go/crypto/sha1/sha1block_generic.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !amd64,!amd64p32,!386,!arm
-
-package sha1
-
-var block = blockGeneric
diff --git a/third_party/gofrontend/libgo/go/crypto/sha256/sha256.go b/third_party/gofrontend/libgo/go/crypto/sha256/sha256.go
deleted file mode 100644
index d84cebf..0000000
--- a/third_party/gofrontend/libgo/go/crypto/sha256/sha256.go
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package sha256 implements the SHA224 and SHA256 hash algorithms as defined
-// in FIPS 180-4.
-package sha256
-
-import (
-	"crypto"
-	"hash"
-)
-
-func init() {
-	crypto.RegisterHash(crypto.SHA224, New224)
-	crypto.RegisterHash(crypto.SHA256, New)
-}
-
-// The size of a SHA256 checksum in bytes.
-const Size = 32
-
-// The size of a SHA224 checksum in bytes.
-const Size224 = 28
-
-// The blocksize of SHA256 and SHA224 in bytes.
-const BlockSize = 64
-
-const (
-	chunk     = 64
-	init0     = 0x6A09E667
-	init1     = 0xBB67AE85
-	init2     = 0x3C6EF372
-	init3     = 0xA54FF53A
-	init4     = 0x510E527F
-	init5     = 0x9B05688C
-	init6     = 0x1F83D9AB
-	init7     = 0x5BE0CD19
-	init0_224 = 0xC1059ED8
-	init1_224 = 0x367CD507
-	init2_224 = 0x3070DD17
-	init3_224 = 0xF70E5939
-	init4_224 = 0xFFC00B31
-	init5_224 = 0x68581511
-	init6_224 = 0x64F98FA7
-	init7_224 = 0xBEFA4FA4
-)
-
-// digest represents the partial evaluation of a checksum.
-type digest struct {
-	h     [8]uint32
-	x     [chunk]byte
-	nx    int
-	len   uint64
-	is224 bool // mark if this digest is SHA-224
-}
-
-func (d *digest) Reset() {
-	if !d.is224 {
-		d.h[0] = init0
-		d.h[1] = init1
-		d.h[2] = init2
-		d.h[3] = init3
-		d.h[4] = init4
-		d.h[5] = init5
-		d.h[6] = init6
-		d.h[7] = init7
-	} else {
-		d.h[0] = init0_224
-		d.h[1] = init1_224
-		d.h[2] = init2_224
-		d.h[3] = init3_224
-		d.h[4] = init4_224
-		d.h[5] = init5_224
-		d.h[6] = init6_224
-		d.h[7] = init7_224
-	}
-	d.nx = 0
-	d.len = 0
-}
-
-// New returns a new hash.Hash computing the SHA256 checksum.
-func New() hash.Hash {
-	d := new(digest)
-	d.Reset()
-	return d
-}
-
-// New224 returns a new hash.Hash computing the SHA224 checksum.
-func New224() hash.Hash {
-	d := new(digest)
-	d.is224 = true
-	d.Reset()
-	return d
-}
-
-func (d *digest) Size() int {
-	if !d.is224 {
-		return Size
-	}
-	return Size224
-}
-
-func (d *digest) BlockSize() int { return BlockSize }
-
-func (d *digest) Write(p []byte) (nn int, err error) {
-	nn = len(p)
-	d.len += uint64(nn)
-	if d.nx > 0 {
-		n := copy(d.x[d.nx:], p)
-		d.nx += n
-		if d.nx == chunk {
-			block(d, d.x[:])
-			d.nx = 0
-		}
-		p = p[n:]
-	}
-	if len(p) >= chunk {
-		n := len(p) &^ (chunk - 1)
-		block(d, p[:n])
-		p = p[n:]
-	}
-	if len(p) > 0 {
-		d.nx = copy(d.x[:], p)
-	}
-	return
-}
-
-func (d0 *digest) Sum(in []byte) []byte {
-	// Make a copy of d0 so that caller can keep writing and summing.
-	d := *d0
-	hash := d.checkSum()
-	if d.is224 {
-		return append(in, hash[:Size224]...)
-	}
-	return append(in, hash[:]...)
-}
-
-func (d *digest) checkSum() [Size]byte {
-	len := d.len
-	// Padding.  Add a 1 bit and 0 bits until 56 bytes mod 64.
-	var tmp [64]byte
-	tmp[0] = 0x80
-	if len%64 < 56 {
-		d.Write(tmp[0 : 56-len%64])
-	} else {
-		d.Write(tmp[0 : 64+56-len%64])
-	}
-
-	// Length in bits.
-	len <<= 3
-	for i := uint(0); i < 8; i++ {
-		tmp[i] = byte(len >> (56 - 8*i))
-	}
-	d.Write(tmp[0:8])
-
-	if d.nx != 0 {
-		panic("d.nx != 0")
-	}
-
-	h := d.h[:]
-	if d.is224 {
-		h = d.h[:7]
-	}
-
-	var digest [Size]byte
-	for i, s := range h {
-		digest[i*4] = byte(s >> 24)
-		digest[i*4+1] = byte(s >> 16)
-		digest[i*4+2] = byte(s >> 8)
-		digest[i*4+3] = byte(s)
-	}
-
-	return digest
-}
-
-// Sum256 returns the SHA256 checksum of the data.
-func Sum256(data []byte) [Size]byte {
-	var d digest
-	d.Reset()
-	d.Write(data)
-	return d.checkSum()
-}
-
-// Sum224 returns the SHA224 checksum of the data.
-func Sum224(data []byte) (sum224 [Size224]byte) {
-	var d digest
-	d.is224 = true
-	d.Reset()
-	d.Write(data)
-	sum := d.checkSum()
-	copy(sum224[:], sum[:Size224])
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/sha256/sha256_test.go b/third_party/gofrontend/libgo/go/crypto/sha256/sha256_test.go
deleted file mode 100644
index 1d883d3..0000000
--- a/third_party/gofrontend/libgo/go/crypto/sha256/sha256_test.go
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// SHA256 hash algorithm.  See FIPS 180-2.
-
-package sha256
-
-import (
-	"fmt"
-	"io"
-	"testing"
-)
-
-type sha256Test struct {
-	out string
-	in  string
-}
-
-var golden = []sha256Test{
-	{"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ""},
-	{"ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb", "a"},
-	{"fb8e20fc2e4c3f248c60c39bd652f3c1347298bb977b8b4d5903b85055620603", "ab"},
-	{"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", "abc"},
-	{"88d4266fd4e6338d13b845fcf289579d209c897823b9217da3e161936f031589", "abcd"},
-	{"36bbe50ed96841d10443bcb670d6554f0a34b761be67ec9c4a8ad2c0c44ca42c", "abcde"},
-	{"bef57ec7f53a6d40beb640a780a639c83bc29ac8a9816f1fc6c5c6dcd93c4721", "abcdef"},
-	{"7d1a54127b222502f5b79b5fb0803061152a44f92b37e23c6527baf665d4da9a", "abcdefg"},
-	{"9c56cc51b374c3ba189210d5b6d4bf57790d351c96c47c02190ecf1e430635ab", "abcdefgh"},
-	{"19cc02f26df43cc571bc9ed7b0c4d29224a3ec229529221725ef76d021c8326f", "abcdefghi"},
-	{"72399361da6a7754fec986dca5b7cbaf1c810a28ded4abaf56b2106d06cb78b0", "abcdefghij"},
-	{"a144061c271f152da4d151034508fed1c138b8c976339de229c3bb6d4bbb4fce", "Discard medicine more than two years old."},
-	{"6dae5caa713a10ad04b46028bf6dad68837c581616a1589a265a11288d4bb5c4", "He who has a shady past knows that nice guys finish last."},
-	{"ae7a702a9509039ddbf29f0765e70d0001177914b86459284dab8b348c2dce3f", "I wouldn't marry him with a ten foot pole."},
-	{"6748450b01c568586715291dfa3ee018da07d36bb7ea6f180c1af6270215c64f", "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave"},
-	{"14b82014ad2b11f661b5ae6a99b75105c2ffac278cd071cd6c05832793635774", "The days of the digital watch are numbered.  -Tom Stoppard"},
-	{"7102cfd76e2e324889eece5d6c41921b1e142a4ac5a2692be78803097f6a48d8", "Nepal premier won't resign."},
-	{"23b1018cd81db1d67983c5f7417c44da9deb582459e378d7a068552ea649dc9f", "For every action there is an equal and opposite government program."},
-	{"8001f190dfb527261c4cfcab70c98e8097a7a1922129bc4096950e57c7999a5a", "His money is twice tainted: 'taint yours and 'taint mine."},
-	{"8c87deb65505c3993eb24b7a150c4155e82eee6960cf0c3a8114ff736d69cad5", "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977"},
-	{"bfb0a67a19cdec3646498b2e0f751bddc41bba4b7f30081b0b932aad214d16d7", "It's a tiny change to the code and not completely disgusting. - Bob Manchek"},
-	{"7f9a0b9bf56332e19f5a0ec1ad9c1425a153da1c624868fda44561d6b74daf36", "size:  a.out:  bad magic"},
-	{"b13f81b8aad9e3666879af19886140904f7f429ef083286195982a7588858cfc", "The major problem is with sendmail.  -Mark Horton"},
-	{"b26c38d61519e894480c70c8374ea35aa0ad05b2ae3d6674eec5f52a69305ed4", "Give me a rock, paper and scissors and I will move the world.  CCFestoon"},
-	{"049d5e26d4f10222cd841a119e38bd8d2e0d1129728688449575d4ff42b842c1", "If the enemy is within range, then so are you."},
-	{"0e116838e3cc1c1a14cd045397e29b4d087aa11b0853fc69ec82e90330d60949", "It's well we cannot hear the screams/That we create in others' dreams."},
-	{"4f7d8eb5bcf11de2a56b971021a444aa4eafd6ecd0f307b5109e4e776cd0fe46", "You remind me of a TV show, but that's all right: I watch it anyway."},
-	{"61c0cc4c4bd8406d5120b3fb4ebc31ce87667c162f29468b3c779675a85aebce", "C is as portable as Stonehedge!!"},
-	{"1fb2eb3688093c4a3f80cd87a5547e2ce940a4f923243a79a2a1e242220693ac", "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley"},
-	{"395585ce30617b62c80b93e8208ce866d4edc811a177fdb4b82d3911d8696423", "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction.  Lewis-Randall Rule"},
-	{"4f9b189a13d030838269dce846b16a1ce9ce81fe63e65de2f636863336a98fe6", "How can you write a big system without C++?  -Paul Glick"},
-}
-
-var golden224 = []sha256Test{
-	{"d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f", ""},
-	{"abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5", "a"},
-	{"db3cda86d4429a1d39c148989566b38f7bda0156296bd364ba2f878b", "ab"},
-	{"23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7", "abc"},
-	{"a76654d8e3550e9a2d67a0eeb6c67b220e5885eddd3fde135806e601", "abcd"},
-	{"bdd03d560993e675516ba5a50638b6531ac2ac3d5847c61916cfced6", "abcde"},
-	{"7043631cb415556a275a4ebecb802c74ee9f6153908e1792a90b6a98", "abcdef"},
-	{"d1884e711701ad81abe0c77a3b0ea12e19ba9af64077286c72fc602d", "abcdefg"},
-	{"17eb7d40f0356f8598e89eafad5f6c759b1f822975d9c9b737c8a517", "abcdefgh"},
-	{"aeb35915346c584db820d2de7af3929ffafef9222a9bcb26516c7334", "abcdefghi"},
-	{"d35e1e5af29ddb0d7e154357df4ad9842afee527c689ee547f753188", "abcdefghij"},
-	{"19297f1cef7ddc8a7e947f5c5a341e10f7245045e425db67043988d7", "Discard medicine more than two years old."},
-	{"0f10c2eb436251f777fbbd125e260d36aecf180411726c7c885f599a", "He who has a shady past knows that nice guys finish last."},
-	{"4d1842104919f314cad8a3cd20b3cba7e8ed3e7abed62b57441358f6", "I wouldn't marry him with a ten foot pole."},
-	{"a8ba85c6fe0c48fbffc72bbb2f03fcdbc87ae2dc7a56804d1590fb3b", "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave"},
-	{"5543fbab26e67e8885b1a852d567d1cb8b9bfe42e0899584c50449a9", "The days of the digital watch are numbered.  -Tom Stoppard"},
-	{"65ca107390f5da9efa05d28e57b221657edc7e43a9a18fb15b053ddb", "Nepal premier won't resign."},
-	{"84953962be366305a9cc9b5cd16ed019edc37ac96c0deb3e12cca116", "For every action there is an equal and opposite government program."},
-	{"35a189ce987151dfd00b3577583cc6a74b9869eecf894459cb52038d", "His money is twice tainted: 'taint yours and 'taint mine."},
-	{"2fc333713983edfd4ef2c0da6fb6d6415afb94987c91e4069eb063e6", "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977"},
-	{"cbe32d38d577a1b355960a4bc3c659c2dc4670859a19777a875842c4", "It's a tiny change to the code and not completely disgusting. - Bob Manchek"},
-	{"a2dc118ce959e027576413a7b440c875cdc8d40df9141d6ef78a57e1", "size:  a.out:  bad magic"},
-	{"d10787e24052bcff26dc484787a54ed819e4e4511c54890ee977bf81", "The major problem is with sendmail.  -Mark Horton"},
-	{"62efcf16ab8a893acdf2f348aaf06b63039ff1bf55508c830532c9fb", "Give me a rock, paper and scissors and I will move the world.  CCFestoon"},
-	{"3e9b7e4613c59f58665104c5fa86c272db5d3a2ff30df5bb194a5c99", "If the enemy is within range, then so are you."},
-	{"5999c208b8bdf6d471bb7c359ac5b829e73a8211dff686143a4e7f18", "It's well we cannot hear the screams/That we create in others' dreams."},
-	{"3b2d67ff54eabc4ef737b14edf87c64280ef582bcdf2a6d56908b405", "You remind me of a TV show, but that's all right: I watch it anyway."},
-	{"d0733595d20e4d3d6b5c565a445814d1bbb2fd08b9a3b8ffb97930c6", "C is as portable as Stonehedge!!"},
-	{"43fb8aeed8a833175c9295c1165415f98c866ef08a4922959d673507", "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley"},
-	{"ec18e66e93afc4fb1604bc2baedbfd20b44c43d76e65c0996d7851c6", "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction.  Lewis-Randall Rule"},
-	{"86ed2eaa9c75ba98396e5c9fb2f679ecf0ea2ed1e0ee9ceecb4a9332", "How can you write a big system without C++?  -Paul Glick"},
-}
-
-func TestGolden(t *testing.T) {
-	for i := 0; i < len(golden); i++ {
-		g := golden[i]
-		s := fmt.Sprintf("%x", Sum256([]byte(g.in)))
-		if s != g.out {
-			t.Fatalf("Sum256 function: sha256(%s) = %s want %s", g.in, s, g.out)
-		}
-		c := New()
-		for j := 0; j < 3; j++ {
-			if j < 2 {
-				io.WriteString(c, g.in)
-			} else {
-				io.WriteString(c, g.in[0:len(g.in)/2])
-				c.Sum(nil)
-				io.WriteString(c, g.in[len(g.in)/2:])
-			}
-			s := fmt.Sprintf("%x", c.Sum(nil))
-			if s != g.out {
-				t.Fatalf("sha256[%d](%s) = %s want %s", j, g.in, s, g.out)
-			}
-			c.Reset()
-		}
-	}
-	for i := 0; i < len(golden224); i++ {
-		g := golden224[i]
-		s := fmt.Sprintf("%x", Sum224([]byte(g.in)))
-		if s != g.out {
-			t.Fatalf("Sum224 function: sha224(%s) = %s want %s", g.in, s, g.out)
-		}
-		c := New224()
-		for j := 0; j < 3; j++ {
-			if j < 2 {
-				io.WriteString(c, g.in)
-			} else {
-				io.WriteString(c, g.in[0:len(g.in)/2])
-				c.Sum(nil)
-				io.WriteString(c, g.in[len(g.in)/2:])
-			}
-			s := fmt.Sprintf("%x", c.Sum(nil))
-			if s != g.out {
-				t.Fatalf("sha224[%d](%s) = %s want %s", j, g.in, s, g.out)
-			}
-			c.Reset()
-		}
-	}
-}
-
-func TestSize(t *testing.T) {
-	c := New()
-	if got := c.Size(); got != Size {
-		t.Errorf("Size = %d; want %d", got, Size)
-	}
-	c = New224()
-	if got := c.Size(); got != Size224 {
-		t.Errorf("New224.Size = %d; want %d", got, Size224)
-	}
-}
-
-func TestBlockSize(t *testing.T) {
-	c := New()
-	if got := c.BlockSize(); got != BlockSize {
-		t.Errorf("BlockSize = %d want %d", got, BlockSize)
-	}
-}
-
-var bench = New()
-var buf = make([]byte, 8192)
-
-func benchmarkSize(b *testing.B, size int) {
-	b.SetBytes(int64(size))
-	sum := make([]byte, bench.Size())
-	for i := 0; i < b.N; i++ {
-		bench.Reset()
-		bench.Write(buf[:size])
-		bench.Sum(sum[:0])
-	}
-}
-
-func BenchmarkHash8Bytes(b *testing.B) {
-	benchmarkSize(b, 8)
-}
-
-func BenchmarkHash1K(b *testing.B) {
-	benchmarkSize(b, 1024)
-}
-
-func BenchmarkHash8K(b *testing.B) {
-	benchmarkSize(b, 8192)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/sha256/sha256block.go b/third_party/gofrontend/libgo/go/crypto/sha256/sha256block.go
deleted file mode 100644
index ca5efd1..0000000
--- a/third_party/gofrontend/libgo/go/crypto/sha256/sha256block.go
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !386,!amd64
-
-// SHA256 block step.
-// In its own file so that a faster assembly or C version
-// can be substituted easily.
-
-package sha256
-
-var _K = []uint32{
-	0x428a2f98,
-	0x71374491,
-	0xb5c0fbcf,
-	0xe9b5dba5,
-	0x3956c25b,
-	0x59f111f1,
-	0x923f82a4,
-	0xab1c5ed5,
-	0xd807aa98,
-	0x12835b01,
-	0x243185be,
-	0x550c7dc3,
-	0x72be5d74,
-	0x80deb1fe,
-	0x9bdc06a7,
-	0xc19bf174,
-	0xe49b69c1,
-	0xefbe4786,
-	0x0fc19dc6,
-	0x240ca1cc,
-	0x2de92c6f,
-	0x4a7484aa,
-	0x5cb0a9dc,
-	0x76f988da,
-	0x983e5152,
-	0xa831c66d,
-	0xb00327c8,
-	0xbf597fc7,
-	0xc6e00bf3,
-	0xd5a79147,
-	0x06ca6351,
-	0x14292967,
-	0x27b70a85,
-	0x2e1b2138,
-	0x4d2c6dfc,
-	0x53380d13,
-	0x650a7354,
-	0x766a0abb,
-	0x81c2c92e,
-	0x92722c85,
-	0xa2bfe8a1,
-	0xa81a664b,
-	0xc24b8b70,
-	0xc76c51a3,
-	0xd192e819,
-	0xd6990624,
-	0xf40e3585,
-	0x106aa070,
-	0x19a4c116,
-	0x1e376c08,
-	0x2748774c,
-	0x34b0bcb5,
-	0x391c0cb3,
-	0x4ed8aa4a,
-	0x5b9cca4f,
-	0x682e6ff3,
-	0x748f82ee,
-	0x78a5636f,
-	0x84c87814,
-	0x8cc70208,
-	0x90befffa,
-	0xa4506ceb,
-	0xbef9a3f7,
-	0xc67178f2,
-}
-
-func block(dig *digest, p []byte) {
-	var w [64]uint32
-	h0, h1, h2, h3, h4, h5, h6, h7 := dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7]
-	for len(p) >= chunk {
-		// Can interlace the computation of w with the
-		// rounds below if needed for speed.
-		for i := 0; i < 16; i++ {
-			j := i * 4
-			w[i] = uint32(p[j])<<24 | uint32(p[j+1])<<16 | uint32(p[j+2])<<8 | uint32(p[j+3])
-		}
-		for i := 16; i < 64; i++ {
-			v1 := w[i-2]
-			t1 := (v1>>17 | v1<<(32-17)) ^ (v1>>19 | v1<<(32-19)) ^ (v1 >> 10)
-			v2 := w[i-15]
-			t2 := (v2>>7 | v2<<(32-7)) ^ (v2>>18 | v2<<(32-18)) ^ (v2 >> 3)
-			w[i] = t1 + w[i-7] + t2 + w[i-16]
-		}
-
-		a, b, c, d, e, f, g, h := h0, h1, h2, h3, h4, h5, h6, h7
-
-		for i := 0; i < 64; i++ {
-			t1 := h + ((e>>6 | e<<(32-6)) ^ (e>>11 | e<<(32-11)) ^ (e>>25 | e<<(32-25))) + ((e & f) ^ (^e & g)) + _K[i] + w[i]
-
-			t2 := ((a>>2 | a<<(32-2)) ^ (a>>13 | a<<(32-13)) ^ (a>>22 | a<<(32-22))) + ((a & b) ^ (a & c) ^ (b & c))
-
-			h = g
-			g = f
-			f = e
-			e = d + t1
-			d = c
-			c = b
-			b = a
-			a = t1 + t2
-		}
-
-		h0 += a
-		h1 += b
-		h2 += c
-		h3 += d
-		h4 += e
-		h5 += f
-		h6 += g
-		h7 += h
-
-		p = p[chunk:]
-	}
-
-	dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7] = h0, h1, h2, h3, h4, h5, h6, h7
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/sha256/sha256block_decl.go b/third_party/gofrontend/libgo/go/crypto/sha256/sha256block_decl.go
deleted file mode 100644
index a50c978..0000000
--- a/third_party/gofrontend/libgo/go/crypto/sha256/sha256block_decl.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build 386 amd64
-
-package sha256
-
-//go:noescape
-
-func block(dig *digest, p []byte)
diff --git a/third_party/gofrontend/libgo/go/crypto/sha512/sha512.go b/third_party/gofrontend/libgo/go/crypto/sha512/sha512.go
deleted file mode 100644
index e7781fd..0000000
--- a/third_party/gofrontend/libgo/go/crypto/sha512/sha512.go
+++ /dev/null
@@ -1,288 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package sha512 implements the SHA-384, SHA-512, SHA-512/224, and SHA-512/256
-// hash algorithms as defined in FIPS 180-4.
-package sha512
-
-import (
-	"crypto"
-	"hash"
-)
-
-func init() {
-	crypto.RegisterHash(crypto.SHA384, New384)
-	crypto.RegisterHash(crypto.SHA512, New)
-	crypto.RegisterHash(crypto.SHA512_224, New512_224)
-	crypto.RegisterHash(crypto.SHA512_256, New512_256)
-}
-
-const (
-	// Size is the size, in bytes, of a SHA-512 checksum.
-	Size = 64
-
-	// Size224 is the size, in bytes, of a SHA-512/224 checksum.
-	Size224 = 28
-
-	// Size256 is the size, in bytes, of a SHA-512/256 checksum.
-	Size256 = 32
-
-	// Size384 is the size, in bytes, of a SHA-384 checksum.
-	Size384 = 48
-
-	// BlockSize is the block size, in bytes, of the SHA-512/224,
-	// SHA-512/256, SHA-384 and SHA-512 hash functions.
-	BlockSize = 128
-)
-
-const (
-	chunk     = 128
-	init0     = 0x6a09e667f3bcc908
-	init1     = 0xbb67ae8584caa73b
-	init2     = 0x3c6ef372fe94f82b
-	init3     = 0xa54ff53a5f1d36f1
-	init4     = 0x510e527fade682d1
-	init5     = 0x9b05688c2b3e6c1f
-	init6     = 0x1f83d9abfb41bd6b
-	init7     = 0x5be0cd19137e2179
-	init0_224 = 0x8c3d37c819544da2
-	init1_224 = 0x73e1996689dcd4d6
-	init2_224 = 0x1dfab7ae32ff9c82
-	init3_224 = 0x679dd514582f9fcf
-	init4_224 = 0x0f6d2b697bd44da8
-	init5_224 = 0x77e36f7304c48942
-	init6_224 = 0x3f9d85a86a1d36c8
-	init7_224 = 0x1112e6ad91d692a1
-	init0_256 = 0x22312194fc2bf72c
-	init1_256 = 0x9f555fa3c84c64c2
-	init2_256 = 0x2393b86b6f53b151
-	init3_256 = 0x963877195940eabd
-	init4_256 = 0x96283ee2a88effe3
-	init5_256 = 0xbe5e1e2553863992
-	init6_256 = 0x2b0199fc2c85b8aa
-	init7_256 = 0x0eb72ddc81c52ca2
-	init0_384 = 0xcbbb9d5dc1059ed8
-	init1_384 = 0x629a292a367cd507
-	init2_384 = 0x9159015a3070dd17
-	init3_384 = 0x152fecd8f70e5939
-	init4_384 = 0x67332667ffc00b31
-	init5_384 = 0x8eb44a8768581511
-	init6_384 = 0xdb0c2e0d64f98fa7
-	init7_384 = 0x47b5481dbefa4fa4
-)
-
-// digest represents the partial evaluation of a checksum.
-type digest struct {
-	h        [8]uint64
-	x        [chunk]byte
-	nx       int
-	len      uint64
-	function crypto.Hash
-}
-
-func (d *digest) Reset() {
-	switch d.function {
-	case crypto.SHA384:
-		d.h[0] = init0_384
-		d.h[1] = init1_384
-		d.h[2] = init2_384
-		d.h[3] = init3_384
-		d.h[4] = init4_384
-		d.h[5] = init5_384
-		d.h[6] = init6_384
-		d.h[7] = init7_384
-	case crypto.SHA512_224:
-		d.h[0] = init0_224
-		d.h[1] = init1_224
-		d.h[2] = init2_224
-		d.h[3] = init3_224
-		d.h[4] = init4_224
-		d.h[5] = init5_224
-		d.h[6] = init6_224
-		d.h[7] = init7_224
-	case crypto.SHA512_256:
-		d.h[0] = init0_256
-		d.h[1] = init1_256
-		d.h[2] = init2_256
-		d.h[3] = init3_256
-		d.h[4] = init4_256
-		d.h[5] = init5_256
-		d.h[6] = init6_256
-		d.h[7] = init7_256
-	default:
-		d.h[0] = init0
-		d.h[1] = init1
-		d.h[2] = init2
-		d.h[3] = init3
-		d.h[4] = init4
-		d.h[5] = init5
-		d.h[6] = init6
-		d.h[7] = init7
-	}
-	d.nx = 0
-	d.len = 0
-}
-
-// New returns a new hash.Hash computing the SHA-512 checksum.
-func New() hash.Hash {
-	d := &digest{function: crypto.SHA512}
-	d.Reset()
-	return d
-}
-
-// New512_224 returns a new hash.Hash computing the SHA-512/224 checksum.
-func New512_224() hash.Hash {
-	d := &digest{function: crypto.SHA512_224}
-	d.Reset()
-	return d
-}
-
-// New512_256 returns a new hash.Hash computing the SHA-512/256 checksum.
-func New512_256() hash.Hash {
-	d := &digest{function: crypto.SHA512_256}
-	d.Reset()
-	return d
-}
-
-// New384 returns a new hash.Hash computing the SHA-384 checksum.
-func New384() hash.Hash {
-	d := &digest{function: crypto.SHA384}
-	d.Reset()
-	return d
-}
-
-func (d *digest) Size() int {
-	switch d.function {
-	case crypto.SHA512_224:
-		return Size224
-	case crypto.SHA512_256:
-		return Size256
-	case crypto.SHA384:
-		return Size384
-	default:
-		return Size
-	}
-}
-
-func (d *digest) BlockSize() int { return BlockSize }
-
-func (d *digest) Write(p []byte) (nn int, err error) {
-	nn = len(p)
-	d.len += uint64(nn)
-	if d.nx > 0 {
-		n := copy(d.x[d.nx:], p)
-		d.nx += n
-		if d.nx == chunk {
-			block(d, d.x[:])
-			d.nx = 0
-		}
-		p = p[n:]
-	}
-	if len(p) >= chunk {
-		n := len(p) &^ (chunk - 1)
-		block(d, p[:n])
-		p = p[n:]
-	}
-	if len(p) > 0 {
-		d.nx = copy(d.x[:], p)
-	}
-	return
-}
-
-func (d0 *digest) Sum(in []byte) []byte {
-	// Make a copy of d0 so that caller can keep writing and summing.
-	d := new(digest)
-	*d = *d0
-	hash := d.checkSum()
-	switch d.function {
-	case crypto.SHA384:
-		return append(in, hash[:Size384]...)
-	case crypto.SHA512_224:
-		return append(in, hash[:Size224]...)
-	case crypto.SHA512_256:
-		return append(in, hash[:Size256]...)
-	default:
-		return append(in, hash[:]...)
-	}
-}
-
-func (d *digest) checkSum() [Size]byte {
-	// Padding.  Add a 1 bit and 0 bits until 112 bytes mod 128.
-	len := d.len
-	var tmp [128]byte
-	tmp[0] = 0x80
-	if len%128 < 112 {
-		d.Write(tmp[0 : 112-len%128])
-	} else {
-		d.Write(tmp[0 : 128+112-len%128])
-	}
-
-	// Length in bits.
-	len <<= 3
-	for i := uint(0); i < 16; i++ {
-		tmp[i] = byte(len >> (120 - 8*i))
-	}
-	d.Write(tmp[0:16])
-
-	if d.nx != 0 {
-		panic("d.nx != 0")
-	}
-
-	h := d.h[:]
-	if d.function == crypto.SHA384 {
-		h = d.h[:6]
-	}
-
-	var digest [Size]byte
-	for i, s := range h {
-		digest[i*8] = byte(s >> 56)
-		digest[i*8+1] = byte(s >> 48)
-		digest[i*8+2] = byte(s >> 40)
-		digest[i*8+3] = byte(s >> 32)
-		digest[i*8+4] = byte(s >> 24)
-		digest[i*8+5] = byte(s >> 16)
-		digest[i*8+6] = byte(s >> 8)
-		digest[i*8+7] = byte(s)
-	}
-
-	return digest
-}
-
-// Sum512 returns the SHA512 checksum of the data.
-func Sum512(data []byte) [Size]byte {
-	d := digest{function: crypto.SHA512}
-	d.Reset()
-	d.Write(data)
-	return d.checkSum()
-}
-
-// Sum384 returns the SHA384 checksum of the data.
-func Sum384(data []byte) (sum384 [Size384]byte) {
-	d := digest{function: crypto.SHA384}
-	d.Reset()
-	d.Write(data)
-	sum := d.checkSum()
-	copy(sum384[:], sum[:Size384])
-	return
-}
-
-// Sum512_224 returns the Sum512/224 checksum of the data.
-func Sum512_224(data []byte) (sum224 [Size224]byte) {
-	d := digest{function: crypto.SHA512_224}
-	d.Reset()
-	d.Write(data)
-	sum := d.checkSum()
-	copy(sum224[:], sum[:Size224])
-	return
-}
-
-// Sum512_256 returns the Sum512/256 checksum of the data.
-func Sum512_256(data []byte) (sum256 [Size256]byte) {
-	d := digest{function: crypto.SHA512_256}
-	d.Reset()
-	d.Write(data)
-	sum := d.checkSum()
-	copy(sum256[:], sum[:Size256])
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/sha512/sha512_test.go b/third_party/gofrontend/libgo/go/crypto/sha512/sha512_test.go
deleted file mode 100644
index 04b3d4a..0000000
--- a/third_party/gofrontend/libgo/go/crypto/sha512/sha512_test.go
+++ /dev/null
@@ -1,330 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// SHA512 hash algorithm.  See FIPS 180-4.
-
-package sha512
-
-import (
-	"encoding/hex"
-	"hash"
-	"io"
-	"testing"
-)
-
-type sha512Test struct {
-	in     string
-	out224 string
-	out256 string
-	out384 string
-	out512 string
-}
-
-var golden = []sha512Test{
-	{
-		"",
-		"6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4",
-		"c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a",
-		"38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b",
-		"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
-	},
-	{
-		"a",
-		"d5cdb9ccc769a5121d4175f2bfdd13d6310e0d3d361ea75d82108327",
-		"455e518824bc0601f9fb858ff5c37d417d67c2f8e0df2babe4808858aea830f8",
-		"54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31",
-		"1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75",
-	},
-	{
-		"ab",
-		"b35878d07bfedf39fc638af08547eb5d1072d8546319f247b442fbf5",
-		"22d4d37ec6370571af7109fb12eae79673d5f7c83e6e677083faa3cfac3b2c14",
-		"c7be03ba5bcaa384727076db0018e99248e1a6e8bd1b9ef58a9ec9dd4eeebb3f48b836201221175befa74ddc3d35afdd",
-		"2d408a0717ec188158278a796c689044361dc6fdde28d6f04973b80896e1823975cdbf12eb63f9e0591328ee235d80e9b5bf1aa6a44f4617ff3caf6400eb172d",
-	},
-	{
-		"abc",
-		"4634270f707b6a54daae7530460842e20e37ed265ceee9a43e8924aa",
-		"53048e2681941ef99b2e29b76b4c7dabe4c2d0c634fc6d46e0e2f13107e7af23",
-		"cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7",
-		"ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f",
-	},
-	{
-		"abcd",
-		"0c9f157ab030fb06e957c14e3938dc5908962e5dd7b66f04a36fc534",
-		"d2891c7978be0e24948f37caa415b87cb5cbe2b26b7bad9dc6391b8a6f6ddcc9",
-		"1165b3406ff0b52a3d24721f785462ca2276c9f454a116c2b2ba20171a7905ea5a026682eb659c4d5f115c363aa3c79b",
-		"d8022f2060ad6efd297ab73dcc5355c9b214054b0d1776a136a669d26a7d3b14f73aa0d0ebff19ee333368f0164b6419a96da49e3e481753e7e96b716bdccb6f",
-	},
-	{
-		"abcde",
-		"880e79bb0a1d2c9b7528d851edb6b8342c58c831de98123b432a4515",
-		"de8322b46e78b67d4431997070703e9764e03a1237b896fd8b379ed4576e8363",
-		"4c525cbeac729eaf4b4665815bc5db0c84fe6300068a727cf74e2813521565abc0ec57a37ee4d8be89d097c0d2ad52f0",
-		"878ae65a92e86cac011a570d4c30a7eaec442b85ce8eca0c2952b5e3cc0628c2e79d889ad4d5c7c626986d452dd86374b6ffaa7cd8b67665bef2289a5c70b0a1",
-	},
-	{
-		"abcdef",
-		"236c829cfea4fd6d4de61ad15fcf34dca62342adaf9f2001c16f29b8",
-		"e4fdcb11d1ac14e698743acd8805174cea5ddc0d312e3e47f6372032571bad84",
-		"c6a4c65b227e7387b9c3e839d44869c4cfca3ef583dea64117859b808c1e3d8ae689e1e314eeef52a6ffe22681aa11f5",
-		"e32ef19623e8ed9d267f657a81944b3d07adbb768518068e88435745564e8d4150a0a703be2a7d88b61e3d390c2bb97e2d4c311fdc69d6b1267f05f59aa920e7",
-	},
-	{
-		"abcdefg",
-		"4767af672b3ed107f25018dc22d6fa4b07d156e13b720971e2c4f6bf",
-		"a8117f680bdceb5d1443617cbdae9255f6900075422326a972fdd2f65ba9bee3",
-		"9f11fc131123f844c1226f429b6a0a6af0525d9f40f056c7fc16cdf1b06bda08e302554417a59fa7dcf6247421959d22",
-		"d716a4188569b68ab1b6dfac178e570114cdf0ea3a1cc0e31486c3e41241bc6a76424e8c37ab26f096fc85ef9886c8cb634187f4fddff645fb099f1ff54c6b8c",
-	},
-	{
-		"abcdefgh",
-		"792e25e0ae286d123a38950007e037d3122e76c4ee201668c385edab",
-		"a29b9645d2a02a8b582888d044199787220e316bf2e89d1422d3df26bf545bbe",
-		"9000cd7cada59d1d2eb82912f7f24e5e69cc5517f68283b005fa27c285b61e05edf1ad1a8a9bded6fd29eb87d75ad806",
-		"a3a8c81bc97c2560010d7389bc88aac974a104e0e2381220c6e084c4dccd1d2d17d4f86db31c2a851dc80e6681d74733c55dcd03dd96f6062cdda12a291ae6ce",
-	},
-	{
-		"abcdefghi",
-		"56b275d36127dc070cda4019baf2ce2579a25d8c67fa2bc9be61b539",
-		"b955095330f9c8188d11884ec1679dc44c9c5b25ff9bda700416df9cdd39188f",
-		"ef54915b60cf062b8dd0c29ae3cad69abe6310de63ac081f46ef019c5c90897caefd79b796cfa81139788a260ded52df",
-		"f22d51d25292ca1d0f68f69aedc7897019308cc9db46efb75a03dd494fc7f126c010e8ade6a00a0c1a5f1b75d81e0ed5a93ce98dc9b833db7839247b1d9c24fe",
-	},
-	{
-		"abcdefghij",
-		"f809423cbb25e81a2a64aecee2cd5fdc7d91d5db583901fbf1db3116",
-		"550762913d51eefbcd1a55068fcfc9b154fd11c1078b996df0d926ea59d2a68d",
-		"a12070030a02d86b0ddacd0d3a5b598344513d0a051e7355053e556a0055489c1555399b03342845c4adde2dc44ff66c",
-		"ef6b97321f34b1fea2169a7db9e1960b471aa13302a988087357c520be957ca119c3ba68e6b4982c019ec89de3865ccf6a3cda1fe11e59f98d99f1502c8b9745",
-	},
-	{
-		"Discard medicine more than two years old.",
-		"4c46e10b5b72204e509c3c06072cea970bc020cd45a61a0acdfa97ac",
-		"690c8ad3916cefd3ad29226d9875965e3ee9ec0d4482eacc248f2ff4aa0d8e5b",
-		"86f58ec2d74d1b7f8eb0c2ff0967316699639e8d4eb129de54bdf34c96cdbabe200d052149f2dd787f43571ba74670d4",
-		"2210d99af9c8bdecda1b4beff822136753d8342505ddce37f1314e2cdbb488c6016bdaa9bd2ffa513dd5de2e4b50f031393d8ab61f773b0e0130d7381e0f8a1d",
-	},
-	{
-		"He who has a shady past knows that nice guys finish last.",
-		"cb0cef13c1848d91a6d02637c7c520de1914ad4a7aea824671cc328e",
-		"25938ca49f7ef1178ce81620842b65e576245fcaed86026a36b516b80bb86b3b",
-		"ae4a2b639ca9bfa04b1855d5a05fe7f230994f790891c6979103e2605f660c4c1262a48142dcbeb57a1914ba5f7c3fa7",
-		"a687a8985b4d8d0a24f115fe272255c6afaf3909225838546159c1ed685c211a203796ae8ecc4c81a5b6315919b3a64f10713da07e341fcdbb08541bf03066ce",
-	},
-	{
-		"I wouldn't marry him with a ten foot pole.",
-		"6c7bd0f3a6544ea698006c2ea583a85f80ea2913590a186db8bb2f1b",
-		"698e420c3a7038e53d8e73f4be2b02e03b93464ac1a61ebe69f557079921ef65",
-		"40ae213df6436eca952aa6841886fcdb82908ef1576a99c8f49bb9dd5023169f7c53035abdda0b54c302f4974e2105e7",
-		"8ddb0392e818b7d585ab22769a50df660d9f6d559cca3afc5691b8ca91b8451374e42bcdabd64589ed7c91d85f626596228a5c8572677eb98bc6b624befb7af8",
-	},
-	{
-		"Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave",
-		"981323be3eca6ccfa598e58dd74ed8cb05d5f7f6653b7604b684f904",
-		"839b414d7e3900ee243aa3d1f9b6955720e64041f5ab9bedd3eb0a08da5a2ca8",
-		"e7cf8b873c9bc950f06259aa54309f349cefa72c00d597aebf903e6519a50011dfe355afff064a10701c705693848df9",
-		"26ed8f6ca7f8d44b6a8a54ae39640fa8ad5c673f70ee9ce074ba4ef0d483eea00bab2f61d8695d6b34df9c6c48ae36246362200ed820448bdc03a720366a87c6",
-	},
-	{
-		"The days of the digital watch are numbered.  -Tom Stoppard",
-		"e6fbf82df5138bf361e826903cadf0612cb2986649ba47a57e1bca99",
-		"5625ecb9d284e54c00b257b67a8cacb25a78db2845c60ef2d29e43c84f236e8e",
-		"c3d4f0f4047181c7d39d34703365f7bf70207183caf2c2f6145f04da895ef69124d9cdeb635da636c3a474e61024e29b",
-		"e5a14bf044be69615aade89afcf1ab0389d5fc302a884d403579d1386a2400c089b0dbb387ed0f463f9ee342f8244d5a38cfbc0e819da9529fbff78368c9a982",
-	},
-	{
-		"Nepal premier won't resign.",
-		"6ec2cb2ecafc1a9bddaf4caf57344d853e6ded398927d5694fd7714f",
-		"9b81d06bca2f985e6ad3249096ff3c0f2a9ec5bb16ef530d738d19d81e7806f2",
-		"a097aab567e167d5cf93676ed73252a69f9687cb3179bb2d27c9878119e94bf7b7c4b58dc90582edfaf66e11388ed714",
-		"420a1faa48919e14651bed45725abe0f7a58e0f099424c4e5a49194946e38b46c1f8034b18ef169b2e31050d1648e0b982386595f7df47da4b6fd18e55333015",
-	},
-	{
-		"For every action there is an equal and opposite government program.",
-		"7f62f36e716e0badaf4a4658da9d09bea26357a1bc6aeb8cf7c3ae35",
-		"08241df8d91edfcd68bb1a1dada6e0ae1475a5c6e7b8f12d8e24ca43a38240a9",
-		"5026ca45c41fc64712eb65065da92f6467541c78f8966d3fe2c8e3fb769a3ec14215f819654b47bd64f7f0eac17184f3",
-		"d926a863beadb20134db07683535c72007b0e695045876254f341ddcccde132a908c5af57baa6a6a9c63e6649bba0c213dc05fadcf9abccea09f23dcfb637fbe",
-	},
-	{
-		"His money is twice tainted: 'taint yours and 'taint mine.",
-		"45adffcb86a05ee4d91263a6115dda011b805d442c60836963cb8378",
-		"4ff74d9213a8117745f5d37b5353a774ec81c5dfe65c4c8986a56fc01f2c551e",
-		"ac1cc0f5ac8d5f5514a7b738ac322b7fb52a161b449c3672e9b6a6ad1a5e4b26b001cf3bad24c56598676ca17d4b445a",
-		"9a98dd9bb67d0da7bf83da5313dff4fd60a4bac0094f1b05633690ffa7f6d61de9a1d4f8617937d560833a9aaa9ccafe3fd24db418d0e728833545cadd3ad92d",
-	},
-	{
-		"There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977",
-		"51cb518f1f68daa901a3075a0a5e1acc755b4e5c82cb47687537f880",
-		"b5baf747c307f98849ec881cf0d48605ae4edd386372aea9b26e71db517e650b",
-		"722d10c5de371ec0c8c4b5247ac8a5f1d240d68c73f8da13d8b25f0166d6f309bf9561979a111a0049405771d201941a",
-		"d7fde2d2351efade52f4211d3746a0780a26eec3df9b2ed575368a8a1c09ec452402293a8ea4eceb5a4f60064ea29b13cdd86918cd7a4faf366160b009804107",
-	},
-	{
-		"It's a tiny change to the code and not completely disgusting. - Bob Manchek",
-		"3b59c5e64b0da7bfc18d7017bf458d90f2c83601ff1afc6263ac0993",
-		"7eef0538ebd7ecf18611d23b0e1cd26a74d65b929a2e374197dc66e755ca4944",
-		"dc2d3ea18bfa10549c63bf2b75b39b5167a80c12aff0e05443168ea87ff149fb0eda5e0bd234eb5d48c7d02ffc5807f1",
-		"b0f35ffa2697359c33a56f5c0cf715c7aeed96da9905ca2698acadb08fbc9e669bf566b6bd5d61a3e86dc22999bcc9f2224e33d1d4f32a228cf9d0349e2db518",
-	},
-	{
-		"size:  a.out:  bad magic",
-		"6a9525c0fac0f91b489bc4f0f539b9ec4a156a4e98bc15b655c2c881",
-		"d05600964f83f55323104aadab434f32391c029718a7690d08ddb2d7e8708443",
-		"1d67c969e2a945ae5346d2139760261504d4ba164c522443afe19ef3e29b152a4c52445489cfc9d7215e5a450e8e1e4e",
-		"3d2e5f91778c9e66f7e061293aaa8a8fc742dd3b2e4f483772464b1144189b49273e610e5cccd7a81a19ca1fa70f16b10f1a100a4d8c1372336be8484c64b311",
-	},
-	{
-		"The major problem is with sendmail.  -Mark Horton",
-		"a1b2b2905b1527d682049c6a76e35c7d8c72551abfe7833ac1be595f",
-		"53ed5f9b5c0b674ac0f3425d9f9a5d462655b07cc90f5d0f692eec093884a607",
-		"5ff8e075e465646e7b73ef36d812c6e9f7d60fa6ea0e533e5569b4f73cde53cdd2cc787f33540af57cca3fe467d32fe0",
-		"b2f68ff58ac015efb1c94c908b0d8c2bf06f491e4de8e6302c49016f7f8a33eac3e959856c7fddbc464de618701338a4b46f76dbfaf9a1e5262b5f40639771c7",
-	},
-	{
-		"Give me a rock, paper and scissors and I will move the world.  CCFestoon",
-		"76cf045c76a5f2e3d64d56c3cdba6a25479334611bc375460526f8c1",
-		"5a0147685a44eea2435dbd582724efca7637acd9c428e5e1a05115bc3bc2a0e0",
-		"5bd0a997a67c9ae1979a894eb0cde403dde003c9b6f2c03cf21925c42ff4e1176e6df1ca005381612ef18457b9b7ec3b",
-		"d8c92db5fdf52cf8215e4df3b4909d29203ff4d00e9ad0b64a6a4e04dec5e74f62e7c35c7fb881bd5de95442123df8f57a489b0ae616bd326f84d10021121c57",
-	},
-	{
-		"If the enemy is within range, then so are you.",
-		"4473671daeecfdb6f6c5bc06b26374aa5e497cc37119fe14144c430c",
-		"1152c9b27a99dbf4057d21438f4e63dd0cd0977d5ff12317c64d3b97fcac875a",
-		"1eee6da33e7e54fc5be52ae23b94b16ba4d2a947ae4505c6a3edfc7401151ea5205ac01b669b56f27d8ef7f175ed7762",
-		"19a9f8dc0a233e464e8566ad3ca9b91e459a7b8c4780985b015776e1bf239a19bc233d0556343e2b0a9bc220900b4ebf4f8bdf89ff8efeaf79602d6849e6f72e",
-	},
-	{
-		"It's well we cannot hear the screams/That we create in others' dreams.",
-		"6accb6394758523fcd453d47d37ebd10868957a0a9e81c796736abf8",
-		"105e890f5d5cf1748d9a7b4cdaf58b69855779deebc2097747c2210a17b2cb51",
-		"76b06e9dea66bfbb1a96029426dc0dfd7830bd297eb447ff5358d94a87cd00c88b59df2493fef56ecbb5231073892ea9",
-		"00b4c41f307bde87301cdc5b5ab1ae9a592e8ecbb2021dd7bc4b34e2ace60741cc362560bec566ba35178595a91932b8d5357e2c9cec92d393b0fa7831852476",
-	},
-	{
-		"You remind me of a TV show, but that's all right: I watch it anyway.",
-		"6f173f4b6eac7f2a73eaa0833c4563752df2c869dc00b7d30219e12e",
-		"74644ead770da1434365cd912656fe1aca2056d3039d39f10eb1151bddb32cf3",
-		"12acaf21452cff586143e3f5db0bfdf7802c057e1adf2a619031c4e1b0ccc4208cf6cef8fe722bbaa2fb46a30d9135d8",
-		"91eccc3d5375fd026e4d6787874b1dce201cecd8a27dbded5065728cb2d09c58a3d467bb1faf353bf7ba567e005245d5321b55bc344f7c07b91cb6f26c959be7",
-	},
-	{
-		"C is as portable as Stonehedge!!",
-		"db05bf4d0f73325208755f4af96cfac6cb3db5dbfc323d675d68f938",
-		"50a234625de5587581883dad9ef399460928032a5ea6bd005d7dc7b68d8cc3d6",
-		"0fc23d7f4183efd186f0bc4fc5db867e026e2146b06cb3d52f4bdbd57d1740122caa853b41868b197b2ac759db39df88",
-		"fabbbe22180f1f137cfdc9556d2570e775d1ae02a597ded43a72a40f9b485d500043b7be128fb9fcd982b83159a0d99aa855a9e7cc4240c00dc01a9bdf8218d7",
-	},
-	{
-		"Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley",
-		"05ffa71bb02e855de1aaee1777b3bdbaf7507646f19c4c6aa29933d0",
-		"a7a3846005f8a9935a0a2d43e7fd56d95132a9a3609bf3296ef80b8218acffa0",
-		"bc805578a7f85d34a86a32976e1c34fe65cf815186fbef76f46ef99cda10723f971f3f1464d488243f5e29db7488598d",
-		"2ecdec235c1fa4fc2a154d8fba1dddb8a72a1ad73838b51d792331d143f8b96a9f6fcb0f34d7caa351fe6d88771c4f105040e0392f06e0621689d33b2f3ba92e",
-	},
-	{
-		"The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction.  Lewis-Randall Rule",
-		"3ad3c89e15b91e6273534c5d18adadbb528e7b840b288f64e81b8c6d",
-		"688ff03e367680757aa9906cb1e2ad218c51f4526dc0426ea229a5ba9d002c69",
-		"b23918399a12ebf4431559eec3813eaf7412e875fd7464f16d581e473330842d2e96c6be49a7ce3f9bb0b8bc0fcbe0fe",
-		"7ad681f6f96f82f7abfa7ecc0334e8fa16d3dc1cdc45b60b7af43fe4075d2357c0c1d60e98350f1afb1f2fe7a4d7cd2ad55b88e458e06b73c40b437331f5dab4",
-	},
-	{
-		"How can you write a big system without C++?  -Paul Glick",
-		"e3763669d1b760c1be7bfcb6625f92300a8430419d1dbad57ec9f53c",
-		"3fa46d52094b01021cff5af9a438982b887a5793f624c0a6644149b6b7c3f485",
-		"1764b700eb1ead52a2fc33cc28975c2180f1b8faa5038d94cffa8d78154aab16e91dd787e7b0303948ebed62561542c8",
-		"833f9248ab4a3b9e5131f745fda1ffd2dd435b30e965957e78291c7ab73605fd1912b0794e5c233ab0a12d205a39778d19b83515d6a47003f19cdee51d98c7e0",
-	},
-}
-
-func testHash(t *testing.T, name, in, outHex string, oneShotResult []byte, digestFunc hash.Hash) {
-	if calculated := hex.EncodeToString(oneShotResult); calculated != outHex {
-		t.Errorf("one-shot result for %s(%q) = %q, but expected %q", name, in, calculated, outHex)
-		return
-	}
-
-	for pass := 0; pass < 3; pass++ {
-		if pass < 2 {
-			io.WriteString(digestFunc, in)
-		} else {
-			io.WriteString(digestFunc, in[:len(in)/2])
-			digestFunc.Sum(nil)
-			io.WriteString(digestFunc, in[len(in)/2:])
-		}
-
-		if calculated := hex.EncodeToString(digestFunc.Sum(nil)); calculated != outHex {
-			t.Errorf("%s(%q) = %q (in pass #%d), but expected %q", name, in, calculated, pass, outHex)
-		}
-		digestFunc.Reset()
-	}
-}
-
-func TestGolden(t *testing.T) {
-	for _, test := range golden {
-		in := []byte(test.in)
-
-		sum224 := Sum512_224(in)
-		sum256 := Sum512_256(in)
-		sum384 := Sum384(in)
-		sum512 := Sum512(in)
-		testHash(t, "SHA512/224", test.in, test.out224, sum224[:], New512_224())
-		testHash(t, "SHA512/256", test.in, test.out256, sum256[:], New512_256())
-		testHash(t, "SHA384", test.in, test.out384, sum384[:], New384())
-		testHash(t, "SHA512", test.in, test.out512, sum512[:], New())
-	}
-}
-
-func TestSize(t *testing.T) {
-	c := New()
-	if got := c.Size(); got != Size {
-		t.Errorf("Size = %d; want %d", got, Size)
-	}
-	c = New384()
-	if got := c.Size(); got != Size384 {
-		t.Errorf("New384.Size = %d; want %d", got, Size384)
-	}
-	c = New512_224()
-	if got := c.Size(); got != Size224 {
-		t.Errorf("New512224.Size = %d; want %d", got, Size224)
-	}
-	c = New512_256()
-	if got := c.Size(); got != Size256 {
-		t.Errorf("New512256.Size = %d; want %d", got, Size256)
-	}
-}
-
-func TestBlockSize(t *testing.T) {
-	c := New()
-	if got := c.BlockSize(); got != BlockSize {
-		t.Errorf("BlockSize = %d; want %d", got, BlockSize)
-	}
-}
-
-var bench = New()
-var buf = make([]byte, 8192)
-
-func benchmarkSize(b *testing.B, size int) {
-	b.SetBytes(int64(size))
-	sum := make([]byte, bench.Size())
-	for i := 0; i < b.N; i++ {
-		bench.Reset()
-		bench.Write(buf[:size])
-		bench.Sum(sum[:0])
-	}
-}
-
-func BenchmarkHash8Bytes(b *testing.B) {
-	benchmarkSize(b, 8)
-}
-
-func BenchmarkHash1K(b *testing.B) {
-	benchmarkSize(b, 1024)
-}
-
-func BenchmarkHash8K(b *testing.B) {
-	benchmarkSize(b, 8192)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/sha512/sha512block.go b/third_party/gofrontend/libgo/go/crypto/sha512/sha512block.go
deleted file mode 100644
index 648ae8f..0000000
--- a/third_party/gofrontend/libgo/go/crypto/sha512/sha512block.go
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !amd64
-
-// SHA512 block step.
-// In its own file so that a faster assembly or C version
-// can be substituted easily.
-
-package sha512
-
-var _K = []uint64{
-	0x428a2f98d728ae22,
-	0x7137449123ef65cd,
-	0xb5c0fbcfec4d3b2f,
-	0xe9b5dba58189dbbc,
-	0x3956c25bf348b538,
-	0x59f111f1b605d019,
-	0x923f82a4af194f9b,
-	0xab1c5ed5da6d8118,
-	0xd807aa98a3030242,
-	0x12835b0145706fbe,
-	0x243185be4ee4b28c,
-	0x550c7dc3d5ffb4e2,
-	0x72be5d74f27b896f,
-	0x80deb1fe3b1696b1,
-	0x9bdc06a725c71235,
-	0xc19bf174cf692694,
-	0xe49b69c19ef14ad2,
-	0xefbe4786384f25e3,
-	0x0fc19dc68b8cd5b5,
-	0x240ca1cc77ac9c65,
-	0x2de92c6f592b0275,
-	0x4a7484aa6ea6e483,
-	0x5cb0a9dcbd41fbd4,
-	0x76f988da831153b5,
-	0x983e5152ee66dfab,
-	0xa831c66d2db43210,
-	0xb00327c898fb213f,
-	0xbf597fc7beef0ee4,
-	0xc6e00bf33da88fc2,
-	0xd5a79147930aa725,
-	0x06ca6351e003826f,
-	0x142929670a0e6e70,
-	0x27b70a8546d22ffc,
-	0x2e1b21385c26c926,
-	0x4d2c6dfc5ac42aed,
-	0x53380d139d95b3df,
-	0x650a73548baf63de,
-	0x766a0abb3c77b2a8,
-	0x81c2c92e47edaee6,
-	0x92722c851482353b,
-	0xa2bfe8a14cf10364,
-	0xa81a664bbc423001,
-	0xc24b8b70d0f89791,
-	0xc76c51a30654be30,
-	0xd192e819d6ef5218,
-	0xd69906245565a910,
-	0xf40e35855771202a,
-	0x106aa07032bbd1b8,
-	0x19a4c116b8d2d0c8,
-	0x1e376c085141ab53,
-	0x2748774cdf8eeb99,
-	0x34b0bcb5e19b48a8,
-	0x391c0cb3c5c95a63,
-	0x4ed8aa4ae3418acb,
-	0x5b9cca4f7763e373,
-	0x682e6ff3d6b2b8a3,
-	0x748f82ee5defb2fc,
-	0x78a5636f43172f60,
-	0x84c87814a1f0ab72,
-	0x8cc702081a6439ec,
-	0x90befffa23631e28,
-	0xa4506cebde82bde9,
-	0xbef9a3f7b2c67915,
-	0xc67178f2e372532b,
-	0xca273eceea26619c,
-	0xd186b8c721c0c207,
-	0xeada7dd6cde0eb1e,
-	0xf57d4f7fee6ed178,
-	0x06f067aa72176fba,
-	0x0a637dc5a2c898a6,
-	0x113f9804bef90dae,
-	0x1b710b35131c471b,
-	0x28db77f523047d84,
-	0x32caab7b40c72493,
-	0x3c9ebe0a15c9bebc,
-	0x431d67c49c100d4c,
-	0x4cc5d4becb3e42b6,
-	0x597f299cfc657e2a,
-	0x5fcb6fab3ad6faec,
-	0x6c44198c4a475817,
-}
-
-func block(dig *digest, p []byte) {
-	var w [80]uint64
-	h0, h1, h2, h3, h4, h5, h6, h7 := dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7]
-	for len(p) >= chunk {
-		for i := 0; i < 16; i++ {
-			j := i * 8
-			w[i] = uint64(p[j])<<56 | uint64(p[j+1])<<48 | uint64(p[j+2])<<40 | uint64(p[j+3])<<32 |
-				uint64(p[j+4])<<24 | uint64(p[j+5])<<16 | uint64(p[j+6])<<8 | uint64(p[j+7])
-		}
-		for i := 16; i < 80; i++ {
-			v1 := w[i-2]
-			t1 := (v1>>19 | v1<<(64-19)) ^ (v1>>61 | v1<<(64-61)) ^ (v1 >> 6)
-			v2 := w[i-15]
-			t2 := (v2>>1 | v2<<(64-1)) ^ (v2>>8 | v2<<(64-8)) ^ (v2 >> 7)
-
-			w[i] = t1 + w[i-7] + t2 + w[i-16]
-		}
-
-		a, b, c, d, e, f, g, h := h0, h1, h2, h3, h4, h5, h6, h7
-
-		for i := 0; i < 80; i++ {
-			t1 := h + ((e>>14 | e<<(64-14)) ^ (e>>18 | e<<(64-18)) ^ (e>>41 | e<<(64-41))) + ((e & f) ^ (^e & g)) + _K[i] + w[i]
-
-			t2 := ((a>>28 | a<<(64-28)) ^ (a>>34 | a<<(64-34)) ^ (a>>39 | a<<(64-39))) + ((a & b) ^ (a & c) ^ (b & c))
-
-			h = g
-			g = f
-			f = e
-			e = d + t1
-			d = c
-			c = b
-			b = a
-			a = t1 + t2
-		}
-
-		h0 += a
-		h1 += b
-		h2 += c
-		h3 += d
-		h4 += e
-		h5 += f
-		h6 += g
-		h7 += h
-
-		p = p[chunk:]
-	}
-
-	dig.h[0], dig.h[1], dig.h[2], dig.h[3], dig.h[4], dig.h[5], dig.h[6], dig.h[7] = h0, h1, h2, h3, h4, h5, h6, h7
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/sha512/sha512block_decl.go b/third_party/gofrontend/libgo/go/crypto/sha512/sha512block_decl.go
deleted file mode 100644
index bef99de..0000000
--- a/third_party/gofrontend/libgo/go/crypto/sha512/sha512block_decl.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64
-
-package sha512
-
-//go:noescape
-
-func block(dig *digest, p []byte)
diff --git a/third_party/gofrontend/libgo/go/crypto/subtle/constant_time.go b/third_party/gofrontend/libgo/go/crypto/subtle/constant_time.go
deleted file mode 100644
index 6f80e7c..0000000
--- a/third_party/gofrontend/libgo/go/crypto/subtle/constant_time.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package subtle implements functions that are often useful in cryptographic
-// code but require careful thought to use correctly.
-package subtle
-
-// ConstantTimeCompare returns 1 iff the two slices, x
-// and y, have equal contents. The time taken is a function of the length of
-// the slices and is independent of the contents.
-func ConstantTimeCompare(x, y []byte) int {
-	if len(x) != len(y) {
-		return 0
-	}
-
-	var v byte
-
-	for i := 0; i < len(x); i++ {
-		v |= x[i] ^ y[i]
-	}
-
-	return ConstantTimeByteEq(v, 0)
-}
-
-// ConstantTimeSelect returns x if v is 1 and y if v is 0.
-// Its behavior is undefined if v takes any other value.
-func ConstantTimeSelect(v, x, y int) int { return ^(v-1)&x | (v-1)&y }
-
-// ConstantTimeByteEq returns 1 if x == y and 0 otherwise.
-func ConstantTimeByteEq(x, y uint8) int {
-	z := ^(x ^ y)
-	z &= z >> 4
-	z &= z >> 2
-	z &= z >> 1
-
-	return int(z)
-}
-
-// ConstantTimeEq returns 1 if x == y and 0 otherwise.
-func ConstantTimeEq(x, y int32) int {
-	z := ^(x ^ y)
-	z &= z >> 16
-	z &= z >> 8
-	z &= z >> 4
-	z &= z >> 2
-	z &= z >> 1
-
-	return int(z & 1)
-}
-
-// ConstantTimeCopy copies the contents of y into x (a slice of equal length)
-// if v == 1. If v == 0, x is left unchanged. Its behavior is undefined if v
-// takes any other value.
-func ConstantTimeCopy(v int, x, y []byte) {
-	if len(x) != len(y) {
-		panic("subtle: slices have different lengths")
-	}
-
-	xmask := byte(v - 1)
-	ymask := byte(^(v - 1))
-	for i := 0; i < len(x); i++ {
-		x[i] = x[i]&xmask | y[i]&ymask
-	}
-}
-
-// ConstantTimeLessOrEq returns 1 if x <= y and 0 otherwise.
-// Its behavior is undefined if x or y are negative or > 2**31 - 1.
-func ConstantTimeLessOrEq(x, y int) int {
-	x32 := int32(x)
-	y32 := int32(y)
-	return int(((x32 - y32 - 1) >> 31) & 1)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/subtle/constant_time_test.go b/third_party/gofrontend/libgo/go/crypto/subtle/constant_time_test.go
deleted file mode 100644
index 619a454..0000000
--- a/third_party/gofrontend/libgo/go/crypto/subtle/constant_time_test.go
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package subtle
-
-import (
-	"testing"
-	"testing/quick"
-)
-
-type TestConstantTimeCompareStruct struct {
-	a, b []byte
-	out  int
-}
-
-var testConstantTimeCompareData = []TestConstantTimeCompareStruct{
-	{[]byte{}, []byte{}, 1},
-	{[]byte{0x11}, []byte{0x11}, 1},
-	{[]byte{0x12}, []byte{0x11}, 0},
-	{[]byte{0x11}, []byte{0x11, 0x12}, 0},
-	{[]byte{0x11, 0x12}, []byte{0x11}, 0},
-}
-
-func TestConstantTimeCompare(t *testing.T) {
-	for i, test := range testConstantTimeCompareData {
-		if r := ConstantTimeCompare(test.a, test.b); r != test.out {
-			t.Errorf("#%d bad result (got %x, want %x)", i, r, test.out)
-		}
-	}
-}
-
-type TestConstantTimeByteEqStruct struct {
-	a, b uint8
-	out  int
-}
-
-var testConstandTimeByteEqData = []TestConstantTimeByteEqStruct{
-	{0, 0, 1},
-	{0, 1, 0},
-	{1, 0, 0},
-	{0xff, 0xff, 1},
-	{0xff, 0xfe, 0},
-}
-
-func byteEq(a, b uint8) int {
-	if a == b {
-		return 1
-	}
-	return 0
-}
-
-func TestConstantTimeByteEq(t *testing.T) {
-	for i, test := range testConstandTimeByteEqData {
-		if r := ConstantTimeByteEq(test.a, test.b); r != test.out {
-			t.Errorf("#%d bad result (got %x, want %x)", i, r, test.out)
-		}
-	}
-	err := quick.CheckEqual(ConstantTimeByteEq, byteEq, nil)
-	if err != nil {
-		t.Error(err)
-	}
-}
-
-func eq(a, b int32) int {
-	if a == b {
-		return 1
-	}
-	return 0
-}
-
-func TestConstantTimeEq(t *testing.T) {
-	err := quick.CheckEqual(ConstantTimeEq, eq, nil)
-	if err != nil {
-		t.Error(err)
-	}
-}
-
-func makeCopy(v int, x, y []byte) []byte {
-	if len(x) > len(y) {
-		x = x[0:len(y)]
-	} else {
-		y = y[0:len(x)]
-	}
-	if v == 1 {
-		copy(x, y)
-	}
-	return x
-}
-
-func constantTimeCopyWrapper(v int, x, y []byte) []byte {
-	if len(x) > len(y) {
-		x = x[0:len(y)]
-	} else {
-		y = y[0:len(x)]
-	}
-	v &= 1
-	ConstantTimeCopy(v, x, y)
-	return x
-}
-
-func TestConstantTimeCopy(t *testing.T) {
-	err := quick.CheckEqual(constantTimeCopyWrapper, makeCopy, nil)
-	if err != nil {
-		t.Error(err)
-	}
-}
-
-var lessOrEqTests = []struct {
-	x, y, result int
-}{
-	{0, 0, 1},
-	{1, 0, 0},
-	{0, 1, 1},
-	{10, 20, 1},
-	{20, 10, 0},
-	{10, 10, 1},
-}
-
-func TestConstantTimeLessOrEq(t *testing.T) {
-	for i, test := range lessOrEqTests {
-		result := ConstantTimeLessOrEq(test.x, test.y)
-		if result != test.result {
-			t.Errorf("#%d: %d <= %d gave %d, expected %d", i, test.x, test.y, result, test.result)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/alert.go b/third_party/gofrontend/libgo/go/crypto/tls/alert.go
deleted file mode 100644
index 3de4834..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/alert.go
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import "strconv"
-
-type alert uint8
-
-const (
-	// alert level
-	alertLevelWarning = 1
-	alertLevelError   = 2
-)
-
-const (
-	alertCloseNotify            alert = 0
-	alertUnexpectedMessage      alert = 10
-	alertBadRecordMAC           alert = 20
-	alertDecryptionFailed       alert = 21
-	alertRecordOverflow         alert = 22
-	alertDecompressionFailure   alert = 30
-	alertHandshakeFailure       alert = 40
-	alertBadCertificate         alert = 42
-	alertUnsupportedCertificate alert = 43
-	alertCertificateRevoked     alert = 44
-	alertCertificateExpired     alert = 45
-	alertCertificateUnknown     alert = 46
-	alertIllegalParameter       alert = 47
-	alertUnknownCA              alert = 48
-	alertAccessDenied           alert = 49
-	alertDecodeError            alert = 50
-	alertDecryptError           alert = 51
-	alertProtocolVersion        alert = 70
-	alertInsufficientSecurity   alert = 71
-	alertInternalError          alert = 80
-	alertInappropriateFallback  alert = 86
-	alertUserCanceled           alert = 90
-	alertNoRenegotiation        alert = 100
-)
-
-var alertText = map[alert]string{
-	alertCloseNotify:            "close notify",
-	alertUnexpectedMessage:      "unexpected message",
-	alertBadRecordMAC:           "bad record MAC",
-	alertDecryptionFailed:       "decryption failed",
-	alertRecordOverflow:         "record overflow",
-	alertDecompressionFailure:   "decompression failure",
-	alertHandshakeFailure:       "handshake failure",
-	alertBadCertificate:         "bad certificate",
-	alertUnsupportedCertificate: "unsupported certificate",
-	alertCertificateRevoked:     "revoked certificate",
-	alertCertificateExpired:     "expired certificate",
-	alertCertificateUnknown:     "unknown certificate",
-	alertIllegalParameter:       "illegal parameter",
-	alertUnknownCA:              "unknown certificate authority",
-	alertAccessDenied:           "access denied",
-	alertDecodeError:            "error decoding message",
-	alertDecryptError:           "error decrypting message",
-	alertProtocolVersion:        "protocol version not supported",
-	alertInsufficientSecurity:   "insufficient security level",
-	alertInternalError:          "internal error",
-	alertInappropriateFallback:  "inappropriate fallback",
-	alertUserCanceled:           "user canceled",
-	alertNoRenegotiation:        "no renegotiation",
-}
-
-func (e alert) String() string {
-	s, ok := alertText[e]
-	if ok {
-		return s
-	}
-	return "alert(" + strconv.Itoa(int(e)) + ")"
-}
-
-func (e alert) Error() string {
-	return e.String()
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/cipher_suites.go b/third_party/gofrontend/libgo/go/crypto/tls/cipher_suites.go
deleted file mode 100644
index a5fed29..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/cipher_suites.go
+++ /dev/null
@@ -1,285 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"crypto/aes"
-	"crypto/cipher"
-	"crypto/des"
-	"crypto/hmac"
-	"crypto/rc4"
-	"crypto/sha1"
-	"crypto/x509"
-	"hash"
-)
-
-// a keyAgreement implements the client and server side of a TLS key agreement
-// protocol by generating and processing key exchange messages.
-type keyAgreement interface {
-	// On the server side, the first two methods are called in order.
-
-	// In the case that the key agreement protocol doesn't use a
-	// ServerKeyExchange message, generateServerKeyExchange can return nil,
-	// nil.
-	generateServerKeyExchange(*Config, *Certificate, *clientHelloMsg, *serverHelloMsg) (*serverKeyExchangeMsg, error)
-	processClientKeyExchange(*Config, *Certificate, *clientKeyExchangeMsg, uint16) ([]byte, error)
-
-	// On the client side, the next two methods are called in order.
-
-	// This method may not be called if the server doesn't send a
-	// ServerKeyExchange message.
-	processServerKeyExchange(*Config, *clientHelloMsg, *serverHelloMsg, *x509.Certificate, *serverKeyExchangeMsg) error
-	generateClientKeyExchange(*Config, *clientHelloMsg, *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error)
-}
-
-const (
-	// suiteECDH indicates that the cipher suite involves elliptic curve
-	// Diffie-Hellman. This means that it should only be selected when the
-	// client indicates that it supports ECC with a curve and point format
-	// that we're happy with.
-	suiteECDHE = 1 << iota
-	// suiteECDSA indicates that the cipher suite involves an ECDSA
-	// signature and therefore may only be selected when the server's
-	// certificate is ECDSA. If this is not set then the cipher suite is
-	// RSA based.
-	suiteECDSA
-	// suiteTLS12 indicates that the cipher suite should only be advertised
-	// and accepted when using TLS 1.2.
-	suiteTLS12
-	// suiteSHA384 indicates that the cipher suite uses SHA384 as the
-	// handshake hash.
-	suiteSHA384
-	// suiteDefaultOff indicates that this cipher suite is not included by
-	// default.
-	suiteDefaultOff
-)
-
-// A cipherSuite is a specific combination of key agreement, cipher and MAC
-// function. All cipher suites currently assume RSA key agreement.
-type cipherSuite struct {
-	id uint16
-	// the lengths, in bytes, of the key material needed for each component.
-	keyLen int
-	macLen int
-	ivLen  int
-	ka     func(version uint16) keyAgreement
-	// flags is a bitmask of the suite* values, above.
-	flags  int
-	cipher func(key, iv []byte, isRead bool) interface{}
-	mac    func(version uint16, macKey []byte) macFunction
-	aead   func(key, fixedNonce []byte) cipher.AEAD
-}
-
-var cipherSuites = []*cipherSuite{
-	// Ciphersuite order is chosen so that ECDHE comes before plain RSA
-	// and RC4 comes before AES (because of the Lucky13 attack).
-	{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, ecdheRSAKA, suiteECDHE | suiteTLS12, nil, nil, aeadAESGCM},
-	{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteTLS12, nil, nil, aeadAESGCM},
-	{TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, ecdheRSAKA, suiteECDHE | suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM},
-	{TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM},
-	{TLS_ECDHE_RSA_WITH_RC4_128_SHA, 16, 20, 0, ecdheRSAKA, suiteECDHE | suiteDefaultOff, cipherRC4, macSHA1, nil},
-	{TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, 16, 20, 0, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteDefaultOff, cipherRC4, macSHA1, nil},
-	{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, 16, 20, 16, ecdheRSAKA, suiteECDHE, cipherAES, macSHA1, nil},
-	{TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, 16, 20, 16, ecdheECDSAKA, suiteECDHE | suiteECDSA, cipherAES, macSHA1, nil},
-	{TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, 32, 20, 16, ecdheRSAKA, suiteECDHE, cipherAES, macSHA1, nil},
-	{TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, 32, 20, 16, ecdheECDSAKA, suiteECDHE | suiteECDSA, cipherAES, macSHA1, nil},
-	{TLS_RSA_WITH_RC4_128_SHA, 16, 20, 0, rsaKA, suiteDefaultOff, cipherRC4, macSHA1, nil},
-	{TLS_RSA_WITH_AES_128_CBC_SHA, 16, 20, 16, rsaKA, 0, cipherAES, macSHA1, nil},
-	{TLS_RSA_WITH_AES_256_CBC_SHA, 32, 20, 16, rsaKA, 0, cipherAES, macSHA1, nil},
-	{TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, 24, 20, 8, ecdheRSAKA, suiteECDHE, cipher3DES, macSHA1, nil},
-	{TLS_RSA_WITH_3DES_EDE_CBC_SHA, 24, 20, 8, rsaKA, 0, cipher3DES, macSHA1, nil},
-}
-
-func cipherRC4(key, iv []byte, isRead bool) interface{} {
-	cipher, _ := rc4.NewCipher(key)
-	return cipher
-}
-
-func cipher3DES(key, iv []byte, isRead bool) interface{} {
-	block, _ := des.NewTripleDESCipher(key)
-	if isRead {
-		return cipher.NewCBCDecrypter(block, iv)
-	}
-	return cipher.NewCBCEncrypter(block, iv)
-}
-
-func cipherAES(key, iv []byte, isRead bool) interface{} {
-	block, _ := aes.NewCipher(key)
-	if isRead {
-		return cipher.NewCBCDecrypter(block, iv)
-	}
-	return cipher.NewCBCEncrypter(block, iv)
-}
-
-// macSHA1 returns a macFunction for the given protocol version.
-func macSHA1(version uint16, key []byte) macFunction {
-	if version == VersionSSL30 {
-		mac := ssl30MAC{
-			h:   sha1.New(),
-			key: make([]byte, len(key)),
-		}
-		copy(mac.key, key)
-		return mac
-	}
-	return tls10MAC{hmac.New(sha1.New, key)}
-}
-
-type macFunction interface {
-	Size() int
-	MAC(digestBuf, seq, header, data []byte) []byte
-}
-
-// fixedNonceAEAD wraps an AEAD and prefixes a fixed portion of the nonce to
-// each call.
-type fixedNonceAEAD struct {
-	// sealNonce and openNonce are buffers where the larger nonce will be
-	// constructed. Since a seal and open operation may be running
-	// concurrently, there is a separate buffer for each.
-	sealNonce, openNonce []byte
-	aead                 cipher.AEAD
-}
-
-func (f *fixedNonceAEAD) NonceSize() int { return 8 }
-func (f *fixedNonceAEAD) Overhead() int  { return f.aead.Overhead() }
-
-func (f *fixedNonceAEAD) Seal(out, nonce, plaintext, additionalData []byte) []byte {
-	copy(f.sealNonce[len(f.sealNonce)-8:], nonce)
-	return f.aead.Seal(out, f.sealNonce, plaintext, additionalData)
-}
-
-func (f *fixedNonceAEAD) Open(out, nonce, plaintext, additionalData []byte) ([]byte, error) {
-	copy(f.openNonce[len(f.openNonce)-8:], nonce)
-	return f.aead.Open(out, f.openNonce, plaintext, additionalData)
-}
-
-func aeadAESGCM(key, fixedNonce []byte) cipher.AEAD {
-	aes, err := aes.NewCipher(key)
-	if err != nil {
-		panic(err)
-	}
-	aead, err := cipher.NewGCM(aes)
-	if err != nil {
-		panic(err)
-	}
-
-	nonce1, nonce2 := make([]byte, 12), make([]byte, 12)
-	copy(nonce1, fixedNonce)
-	copy(nonce2, fixedNonce)
-
-	return &fixedNonceAEAD{nonce1, nonce2, aead}
-}
-
-// ssl30MAC implements the SSLv3 MAC function, as defined in
-// www.mozilla.org/projects/security/pki/nss/ssl/draft302.txt section 5.2.3.1
-type ssl30MAC struct {
-	h   hash.Hash
-	key []byte
-}
-
-func (s ssl30MAC) Size() int {
-	return s.h.Size()
-}
-
-var ssl30Pad1 = [48]byte{0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}
-
-var ssl30Pad2 = [48]byte{0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c}
-
-func (s ssl30MAC) MAC(digestBuf, seq, header, data []byte) []byte {
-	padLength := 48
-	if s.h.Size() == 20 {
-		padLength = 40
-	}
-
-	s.h.Reset()
-	s.h.Write(s.key)
-	s.h.Write(ssl30Pad1[:padLength])
-	s.h.Write(seq)
-	s.h.Write(header[:1])
-	s.h.Write(header[3:5])
-	s.h.Write(data)
-	digestBuf = s.h.Sum(digestBuf[:0])
-
-	s.h.Reset()
-	s.h.Write(s.key)
-	s.h.Write(ssl30Pad2[:padLength])
-	s.h.Write(digestBuf)
-	return s.h.Sum(digestBuf[:0])
-}
-
-// tls10MAC implements the TLS 1.0 MAC function. RFC 2246, section 6.2.3.
-type tls10MAC struct {
-	h hash.Hash
-}
-
-func (s tls10MAC) Size() int {
-	return s.h.Size()
-}
-
-func (s tls10MAC) MAC(digestBuf, seq, header, data []byte) []byte {
-	s.h.Reset()
-	s.h.Write(seq)
-	s.h.Write(header)
-	s.h.Write(data)
-	return s.h.Sum(digestBuf[:0])
-}
-
-func rsaKA(version uint16) keyAgreement {
-	return rsaKeyAgreement{}
-}
-
-func ecdheECDSAKA(version uint16) keyAgreement {
-	return &ecdheKeyAgreement{
-		sigType: signatureECDSA,
-		version: version,
-	}
-}
-
-func ecdheRSAKA(version uint16) keyAgreement {
-	return &ecdheKeyAgreement{
-		sigType: signatureRSA,
-		version: version,
-	}
-}
-
-// mutualCipherSuite returns a cipherSuite given a list of supported
-// ciphersuites and the id requested by the peer.
-func mutualCipherSuite(have []uint16, want uint16) *cipherSuite {
-	for _, id := range have {
-		if id == want {
-			for _, suite := range cipherSuites {
-				if suite.id == want {
-					return suite
-				}
-			}
-			return nil
-		}
-	}
-	return nil
-}
-
-// A list of the possible cipher suite ids. Taken from
-// http://www.iana.org/assignments/tls-parameters/tls-parameters.xml
-const (
-	TLS_RSA_WITH_RC4_128_SHA                uint16 = 0x0005
-	TLS_RSA_WITH_3DES_EDE_CBC_SHA           uint16 = 0x000a
-	TLS_RSA_WITH_AES_128_CBC_SHA            uint16 = 0x002f
-	TLS_RSA_WITH_AES_256_CBC_SHA            uint16 = 0x0035
-	TLS_ECDHE_ECDSA_WITH_RC4_128_SHA        uint16 = 0xc007
-	TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA    uint16 = 0xc009
-	TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA    uint16 = 0xc00a
-	TLS_ECDHE_RSA_WITH_RC4_128_SHA          uint16 = 0xc011
-	TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA     uint16 = 0xc012
-	TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA      uint16 = 0xc013
-	TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA      uint16 = 0xc014
-	TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256   uint16 = 0xc02f
-	TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 uint16 = 0xc02b
-	TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384   uint16 = 0xc030
-	TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 uint16 = 0xc02c
-
-	// TLS_FALLBACK_SCSV isn't a standard cipher suite but an indicator
-	// that the client is doing version fallback. See
-	// https://tools.ietf.org/html/draft-ietf-tls-downgrade-scsv-00.
-	TLS_FALLBACK_SCSV uint16 = 0x5600
-)
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/common.go b/third_party/gofrontend/libgo/go/crypto/tls/common.go
deleted file mode 100644
index a3d75d6..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/common.go
+++ /dev/null
@@ -1,712 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"container/list"
-	"crypto"
-	"crypto/rand"
-	"crypto/sha512"
-	"crypto/x509"
-	"errors"
-	"fmt"
-	"io"
-	"math/big"
-	"strings"
-	"sync"
-	"time"
-)
-
-const (
-	VersionSSL30 = 0x0300
-	VersionTLS10 = 0x0301
-	VersionTLS11 = 0x0302
-	VersionTLS12 = 0x0303
-)
-
-const (
-	maxPlaintext    = 16384        // maximum plaintext payload length
-	maxCiphertext   = 16384 + 2048 // maximum ciphertext payload length
-	recordHeaderLen = 5            // record header length
-	maxHandshake    = 65536        // maximum handshake we support (protocol max is 16 MB)
-
-	minVersion = VersionTLS10
-	maxVersion = VersionTLS12
-)
-
-// TLS record types.
-type recordType uint8
-
-const (
-	recordTypeChangeCipherSpec recordType = 20
-	recordTypeAlert            recordType = 21
-	recordTypeHandshake        recordType = 22
-	recordTypeApplicationData  recordType = 23
-)
-
-// TLS handshake message types.
-const (
-	typeClientHello        uint8 = 1
-	typeServerHello        uint8 = 2
-	typeNewSessionTicket   uint8 = 4
-	typeCertificate        uint8 = 11
-	typeServerKeyExchange  uint8 = 12
-	typeCertificateRequest uint8 = 13
-	typeServerHelloDone    uint8 = 14
-	typeCertificateVerify  uint8 = 15
-	typeClientKeyExchange  uint8 = 16
-	typeFinished           uint8 = 20
-	typeCertificateStatus  uint8 = 22
-	typeNextProtocol       uint8 = 67 // Not IANA assigned
-)
-
-// TLS compression types.
-const (
-	compressionNone uint8 = 0
-)
-
-// TLS extension numbers
-const (
-	extensionServerName          uint16 = 0
-	extensionStatusRequest       uint16 = 5
-	extensionSupportedCurves     uint16 = 10
-	extensionSupportedPoints     uint16 = 11
-	extensionSignatureAlgorithms uint16 = 13
-	extensionALPN                uint16 = 16
-	extensionSCT                 uint16 = 18 // https://tools.ietf.org/html/rfc6962#section-6
-	extensionSessionTicket       uint16 = 35
-	extensionNextProtoNeg        uint16 = 13172 // not IANA assigned
-	extensionRenegotiationInfo   uint16 = 0xff01
-)
-
-// TLS signaling cipher suite values
-const (
-	scsvRenegotiation uint16 = 0x00ff
-)
-
-// CurveID is the type of a TLS identifier for an elliptic curve. See
-// http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-8
-type CurveID uint16
-
-const (
-	CurveP256 CurveID = 23
-	CurveP384 CurveID = 24
-	CurveP521 CurveID = 25
-)
-
-// TLS Elliptic Curve Point Formats
-// http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-9
-const (
-	pointFormatUncompressed uint8 = 0
-)
-
-// TLS CertificateStatusType (RFC 3546)
-const (
-	statusTypeOCSP uint8 = 1
-)
-
-// Certificate types (for certificateRequestMsg)
-const (
-	certTypeRSASign    = 1 // A certificate containing an RSA key
-	certTypeDSSSign    = 2 // A certificate containing a DSA key
-	certTypeRSAFixedDH = 3 // A certificate containing a static DH key
-	certTypeDSSFixedDH = 4 // A certificate containing a static DH key
-
-	// See RFC4492 sections 3 and 5.5.
-	certTypeECDSASign      = 64 // A certificate containing an ECDSA-capable public key, signed with ECDSA.
-	certTypeRSAFixedECDH   = 65 // A certificate containing an ECDH-capable public key, signed with RSA.
-	certTypeECDSAFixedECDH = 66 // A certificate containing an ECDH-capable public key, signed with ECDSA.
-
-	// Rest of these are reserved by the TLS spec
-)
-
-// Hash functions for TLS 1.2 (See RFC 5246, section A.4.1)
-const (
-	hashSHA1   uint8 = 2
-	hashSHA256 uint8 = 4
-	hashSHA384 uint8 = 5
-)
-
-// Signature algorithms for TLS 1.2 (See RFC 5246, section A.4.1)
-const (
-	signatureRSA   uint8 = 1
-	signatureECDSA uint8 = 3
-)
-
-// signatureAndHash mirrors the TLS 1.2, SignatureAndHashAlgorithm struct. See
-// RFC 5246, section A.4.1.
-type signatureAndHash struct {
-	hash, signature uint8
-}
-
-// supportedSignatureAlgorithms contains the signature and hash algorithms that
-// the code advertises as supported in a TLS 1.2 ClientHello and in a TLS 1.2
-// CertificateRequest.
-var supportedSignatureAlgorithms = []signatureAndHash{
-	{hashSHA256, signatureRSA},
-	{hashSHA256, signatureECDSA},
-	{hashSHA384, signatureRSA},
-	{hashSHA384, signatureECDSA},
-	{hashSHA1, signatureRSA},
-	{hashSHA1, signatureECDSA},
-}
-
-// ConnectionState records basic TLS details about the connection.
-type ConnectionState struct {
-	Version                     uint16                // TLS version used by the connection (e.g. VersionTLS12)
-	HandshakeComplete           bool                  // TLS handshake is complete
-	DidResume                   bool                  // connection resumes a previous TLS connection
-	CipherSuite                 uint16                // cipher suite in use (TLS_RSA_WITH_RC4_128_SHA, ...)
-	NegotiatedProtocol          string                // negotiated next protocol (from Config.NextProtos)
-	NegotiatedProtocolIsMutual  bool                  // negotiated protocol was advertised by server
-	ServerName                  string                // server name requested by client, if any (server side only)
-	PeerCertificates            []*x509.Certificate   // certificate chain presented by remote peer
-	VerifiedChains              [][]*x509.Certificate // verified chains built from PeerCertificates
-	SignedCertificateTimestamps [][]byte              // SCTs from the server, if any
-	OCSPResponse                []byte                // stapled OCSP response from server, if any
-
-	// TLSUnique contains the "tls-unique" channel binding value (see RFC
-	// 5929, section 3). For resumed sessions this value will be nil
-	// because resumption does not include enough context (see
-	// https://secure-resumption.com/#channelbindings). This will change in
-	// future versions of Go once the TLS master-secret fix has been
-	// standardized and implemented.
-	TLSUnique []byte
-}
-
-// ClientAuthType declares the policy the server will follow for
-// TLS Client Authentication.
-type ClientAuthType int
-
-const (
-	NoClientCert ClientAuthType = iota
-	RequestClientCert
-	RequireAnyClientCert
-	VerifyClientCertIfGiven
-	RequireAndVerifyClientCert
-)
-
-// ClientSessionState contains the state needed by clients to resume TLS
-// sessions.
-type ClientSessionState struct {
-	sessionTicket      []uint8               // Encrypted ticket used for session resumption with server
-	vers               uint16                // SSL/TLS version negotiated for the session
-	cipherSuite        uint16                // Ciphersuite negotiated for the session
-	masterSecret       []byte                // MasterSecret generated by client on a full handshake
-	serverCertificates []*x509.Certificate   // Certificate chain presented by the server
-	verifiedChains     [][]*x509.Certificate // Certificate chains we built for verification
-}
-
-// ClientSessionCache is a cache of ClientSessionState objects that can be used
-// by a client to resume a TLS session with a given server. ClientSessionCache
-// implementations should expect to be called concurrently from different
-// goroutines.
-type ClientSessionCache interface {
-	// Get searches for a ClientSessionState associated with the given key.
-	// On return, ok is true if one was found.
-	Get(sessionKey string) (session *ClientSessionState, ok bool)
-
-	// Put adds the ClientSessionState to the cache with the given key.
-	Put(sessionKey string, cs *ClientSessionState)
-}
-
-// ClientHelloInfo contains information from a ClientHello message in order to
-// guide certificate selection in the GetCertificate callback.
-type ClientHelloInfo struct {
-	// CipherSuites lists the CipherSuites supported by the client (e.g.
-	// TLS_RSA_WITH_RC4_128_SHA).
-	CipherSuites []uint16
-
-	// ServerName indicates the name of the server requested by the client
-	// in order to support virtual hosting. ServerName is only set if the
-	// client is using SNI (see
-	// http://tools.ietf.org/html/rfc4366#section-3.1).
-	ServerName string
-
-	// SupportedCurves lists the elliptic curves supported by the client.
-	// SupportedCurves is set only if the Supported Elliptic Curves
-	// Extension is being used (see
-	// http://tools.ietf.org/html/rfc4492#section-5.1.1).
-	SupportedCurves []CurveID
-
-	// SupportedPoints lists the point formats supported by the client.
-	// SupportedPoints is set only if the Supported Point Formats Extension
-	// is being used (see
-	// http://tools.ietf.org/html/rfc4492#section-5.1.2).
-	SupportedPoints []uint8
-}
-
-// A Config structure is used to configure a TLS client or server.
-// After one has been passed to a TLS function it must not be
-// modified. A Config may be reused; the tls package will also not
-// modify it.
-type Config struct {
-	// Rand provides the source of entropy for nonces and RSA blinding.
-	// If Rand is nil, TLS uses the cryptographic random reader in package
-	// crypto/rand.
-	// The Reader must be safe for use by multiple goroutines.
-	Rand io.Reader
-
-	// Time returns the current time as the number of seconds since the epoch.
-	// If Time is nil, TLS uses time.Now.
-	Time func() time.Time
-
-	// Certificates contains one or more certificate chains
-	// to present to the other side of the connection.
-	// Server configurations must include at least one certificate.
-	Certificates []Certificate
-
-	// NameToCertificate maps from a certificate name to an element of
-	// Certificates. Note that a certificate name can be of the form
-	// '*.example.com' and so doesn't have to be a domain name as such.
-	// See Config.BuildNameToCertificate
-	// The nil value causes the first element of Certificates to be used
-	// for all connections.
-	NameToCertificate map[string]*Certificate
-
-	// GetCertificate returns a Certificate based on the given
-	// ClientHelloInfo. It will only be called if the client supplies SNI
-	// information or if Certificates is empty.
-	//
-	// If GetCertificate is nil or returns nil, then the certificate is
-	// retrieved from NameToCertificate. If NameToCertificate is nil, the
-	// first element of Certificates will be used.
-	GetCertificate func(clientHello *ClientHelloInfo) (*Certificate, error)
-
-	// RootCAs defines the set of root certificate authorities
-	// that clients use when verifying server certificates.
-	// If RootCAs is nil, TLS uses the host's root CA set.
-	RootCAs *x509.CertPool
-
-	// NextProtos is a list of supported, application level protocols.
-	NextProtos []string
-
-	// ServerName is used to verify the hostname on the returned
-	// certificates unless InsecureSkipVerify is given. It is also included
-	// in the client's handshake to support virtual hosting.
-	ServerName string
-
-	// ClientAuth determines the server's policy for
-	// TLS Client Authentication. The default is NoClientCert.
-	ClientAuth ClientAuthType
-
-	// ClientCAs defines the set of root certificate authorities
-	// that servers use if required to verify a client certificate
-	// by the policy in ClientAuth.
-	ClientCAs *x509.CertPool
-
-	// InsecureSkipVerify controls whether a client verifies the
-	// server's certificate chain and host name.
-	// If InsecureSkipVerify is true, TLS accepts any certificate
-	// presented by the server and any host name in that certificate.
-	// In this mode, TLS is susceptible to man-in-the-middle attacks.
-	// This should be used only for testing.
-	InsecureSkipVerify bool
-
-	// CipherSuites is a list of supported cipher suites. If CipherSuites
-	// is nil, TLS uses a list of suites supported by the implementation.
-	CipherSuites []uint16
-
-	// PreferServerCipherSuites controls whether the server selects the
-	// client's most preferred ciphersuite, or the server's most preferred
-	// ciphersuite. If true then the server's preference, as expressed in
-	// the order of elements in CipherSuites, is used.
-	PreferServerCipherSuites bool
-
-	// SessionTicketsDisabled may be set to true to disable session ticket
-	// (resumption) support.
-	SessionTicketsDisabled bool
-
-	// SessionTicketKey is used by TLS servers to provide session
-	// resumption. See RFC 5077. If zero, it will be filled with
-	// random data before the first server handshake.
-	//
-	// If multiple servers are terminating connections for the same host
-	// they should all have the same SessionTicketKey. If the
-	// SessionTicketKey leaks, previously recorded and future TLS
-	// connections using that key are compromised.
-	SessionTicketKey [32]byte
-
-	// SessionCache is a cache of ClientSessionState entries for TLS session
-	// resumption.
-	ClientSessionCache ClientSessionCache
-
-	// MinVersion contains the minimum SSL/TLS version that is acceptable.
-	// If zero, then TLS 1.0 is taken as the minimum.
-	MinVersion uint16
-
-	// MaxVersion contains the maximum SSL/TLS version that is acceptable.
-	// If zero, then the maximum version supported by this package is used,
-	// which is currently TLS 1.2.
-	MaxVersion uint16
-
-	// CurvePreferences contains the elliptic curves that will be used in
-	// an ECDHE handshake, in preference order. If empty, the default will
-	// be used.
-	CurvePreferences []CurveID
-
-	serverInitOnce sync.Once // guards calling (*Config).serverInit
-
-	// mutex protects sessionTicketKeys
-	mutex sync.RWMutex
-	// sessionTicketKeys contains zero or more ticket keys. If the length
-	// is zero, SessionTicketsDisabled must be true. The first key is used
-	// for new tickets and any subsequent keys can be used to decrypt old
-	// tickets.
-	sessionTicketKeys []ticketKey
-}
-
-// ticketKeyNameLen is the number of bytes of identifier that is prepended to
-// an encrypted session ticket in order to identify the key used to encrypt it.
-const ticketKeyNameLen = 16
-
-// ticketKey is the internal representation of a session ticket key.
-type ticketKey struct {
-	// keyName is an opaque byte string that serves to identify the session
-	// ticket key. It's exposed as plaintext in every session ticket.
-	keyName [ticketKeyNameLen]byte
-	aesKey  [16]byte
-	hmacKey [16]byte
-}
-
-// ticketKeyFromBytes converts from the external representation of a session
-// ticket key to a ticketKey. Externally, session ticket keys are 32 random
-// bytes and this function expands that into sufficient name and key material.
-func ticketKeyFromBytes(b [32]byte) (key ticketKey) {
-	hashed := sha512.Sum512(b[:])
-	copy(key.keyName[:], hashed[:ticketKeyNameLen])
-	copy(key.aesKey[:], hashed[ticketKeyNameLen:ticketKeyNameLen+16])
-	copy(key.hmacKey[:], hashed[ticketKeyNameLen+16:ticketKeyNameLen+32])
-	return key
-}
-
-func (c *Config) serverInit() {
-	if c.SessionTicketsDisabled {
-		return
-	}
-
-	alreadySet := false
-	for _, b := range c.SessionTicketKey {
-		if b != 0 {
-			alreadySet = true
-			break
-		}
-	}
-
-	if !alreadySet {
-		if _, err := io.ReadFull(c.rand(), c.SessionTicketKey[:]); err != nil {
-			c.SessionTicketsDisabled = true
-			return
-		}
-	}
-
-	c.sessionTicketKeys = []ticketKey{ticketKeyFromBytes(c.SessionTicketKey)}
-}
-
-func (c *Config) ticketKeys() []ticketKey {
-	c.mutex.RLock()
-	// c.sessionTicketKeys is constant once created. SetSessionTicketKeys
-	// will only update it by replacing it with a new value.
-	ret := c.sessionTicketKeys
-	c.mutex.RUnlock()
-	return ret
-}
-
-// SetSessionTicketKeys updates the session ticket keys for a server. The first
-// key will be used when creating new tickets, while all keys can be used for
-// decrypting tickets. It is safe to call this function while the server is
-// running in order to rotate the session ticket keys. The function will panic
-// if keys is empty.
-func (c *Config) SetSessionTicketKeys(keys [][32]byte) {
-	if len(keys) == 0 {
-		panic("tls: keys must have at least one key")
-	}
-
-	newKeys := make([]ticketKey, len(keys))
-	for i, bytes := range keys {
-		newKeys[i] = ticketKeyFromBytes(bytes)
-	}
-
-	c.mutex.Lock()
-	c.sessionTicketKeys = newKeys
-	c.mutex.Unlock()
-}
-
-func (c *Config) rand() io.Reader {
-	r := c.Rand
-	if r == nil {
-		return rand.Reader
-	}
-	return r
-}
-
-func (c *Config) time() time.Time {
-	t := c.Time
-	if t == nil {
-		t = time.Now
-	}
-	return t()
-}
-
-func (c *Config) cipherSuites() []uint16 {
-	s := c.CipherSuites
-	if s == nil {
-		s = defaultCipherSuites()
-	}
-	return s
-}
-
-func (c *Config) minVersion() uint16 {
-	if c == nil || c.MinVersion == 0 {
-		return minVersion
-	}
-	return c.MinVersion
-}
-
-func (c *Config) maxVersion() uint16 {
-	if c == nil || c.MaxVersion == 0 {
-		return maxVersion
-	}
-	return c.MaxVersion
-}
-
-var defaultCurvePreferences = []CurveID{CurveP256, CurveP384, CurveP521}
-
-func (c *Config) curvePreferences() []CurveID {
-	if c == nil || len(c.CurvePreferences) == 0 {
-		return defaultCurvePreferences
-	}
-	return c.CurvePreferences
-}
-
-// mutualVersion returns the protocol version to use given the advertised
-// version of the peer.
-func (c *Config) mutualVersion(vers uint16) (uint16, bool) {
-	minVersion := c.minVersion()
-	maxVersion := c.maxVersion()
-
-	if vers < minVersion {
-		return 0, false
-	}
-	if vers > maxVersion {
-		vers = maxVersion
-	}
-	return vers, true
-}
-
-// getCertificate returns the best certificate for the given ClientHelloInfo,
-// defaulting to the first element of c.Certificates.
-func (c *Config) getCertificate(clientHello *ClientHelloInfo) (*Certificate, error) {
-	if c.GetCertificate != nil &&
-		(len(c.Certificates) == 0 || len(clientHello.ServerName) > 0) {
-		cert, err := c.GetCertificate(clientHello)
-		if cert != nil || err != nil {
-			return cert, err
-		}
-	}
-
-	if len(c.Certificates) == 0 {
-		return nil, errors.New("crypto/tls: no certificates configured")
-	}
-
-	if len(c.Certificates) == 1 || c.NameToCertificate == nil {
-		// There's only one choice, so no point doing any work.
-		return &c.Certificates[0], nil
-	}
-
-	name := strings.ToLower(clientHello.ServerName)
-	for len(name) > 0 && name[len(name)-1] == '.' {
-		name = name[:len(name)-1]
-	}
-
-	if cert, ok := c.NameToCertificate[name]; ok {
-		return cert, nil
-	}
-
-	// try replacing labels in the name with wildcards until we get a
-	// match.
-	labels := strings.Split(name, ".")
-	for i := range labels {
-		labels[i] = "*"
-		candidate := strings.Join(labels, ".")
-		if cert, ok := c.NameToCertificate[candidate]; ok {
-			return cert, nil
-		}
-	}
-
-	// If nothing matches, return the first certificate.
-	return &c.Certificates[0], nil
-}
-
-// BuildNameToCertificate parses c.Certificates and builds c.NameToCertificate
-// from the CommonName and SubjectAlternateName fields of each of the leaf
-// certificates.
-func (c *Config) BuildNameToCertificate() {
-	c.NameToCertificate = make(map[string]*Certificate)
-	for i := range c.Certificates {
-		cert := &c.Certificates[i]
-		x509Cert, err := x509.ParseCertificate(cert.Certificate[0])
-		if err != nil {
-			continue
-		}
-		if len(x509Cert.Subject.CommonName) > 0 {
-			c.NameToCertificate[x509Cert.Subject.CommonName] = cert
-		}
-		for _, san := range x509Cert.DNSNames {
-			c.NameToCertificate[san] = cert
-		}
-	}
-}
-
-// A Certificate is a chain of one or more certificates, leaf first.
-type Certificate struct {
-	Certificate [][]byte
-	// PrivateKey contains the private key corresponding to the public key
-	// in Leaf. For a server, this must implement crypto.Signer and/or
-	// crypto.Decrypter, with an RSA or ECDSA PublicKey. For a client
-	// (performing client authentication), this must be a crypto.Signer
-	// with an RSA or ECDSA PublicKey.
-	PrivateKey crypto.PrivateKey
-	// OCSPStaple contains an optional OCSP response which will be served
-	// to clients that request it.
-	OCSPStaple []byte
-	// SignedCertificateTimestamps contains an optional list of Signed
-	// Certificate Timestamps which will be served to clients that request it.
-	SignedCertificateTimestamps [][]byte
-	// Leaf is the parsed form of the leaf certificate, which may be
-	// initialized using x509.ParseCertificate to reduce per-handshake
-	// processing for TLS clients doing client authentication. If nil, the
-	// leaf certificate will be parsed as needed.
-	Leaf *x509.Certificate
-}
-
-// A TLS record.
-type record struct {
-	contentType  recordType
-	major, minor uint8
-	payload      []byte
-}
-
-type handshakeMessage interface {
-	marshal() []byte
-	unmarshal([]byte) bool
-}
-
-// lruSessionCache is a ClientSessionCache implementation that uses an LRU
-// caching strategy.
-type lruSessionCache struct {
-	sync.Mutex
-
-	m        map[string]*list.Element
-	q        *list.List
-	capacity int
-}
-
-type lruSessionCacheEntry struct {
-	sessionKey string
-	state      *ClientSessionState
-}
-
-// NewLRUClientSessionCache returns a ClientSessionCache with the given
-// capacity that uses an LRU strategy. If capacity is < 1, a default capacity
-// is used instead.
-func NewLRUClientSessionCache(capacity int) ClientSessionCache {
-	const defaultSessionCacheCapacity = 64
-
-	if capacity < 1 {
-		capacity = defaultSessionCacheCapacity
-	}
-	return &lruSessionCache{
-		m:        make(map[string]*list.Element),
-		q:        list.New(),
-		capacity: capacity,
-	}
-}
-
-// Put adds the provided (sessionKey, cs) pair to the cache.
-func (c *lruSessionCache) Put(sessionKey string, cs *ClientSessionState) {
-	c.Lock()
-	defer c.Unlock()
-
-	if elem, ok := c.m[sessionKey]; ok {
-		entry := elem.Value.(*lruSessionCacheEntry)
-		entry.state = cs
-		c.q.MoveToFront(elem)
-		return
-	}
-
-	if c.q.Len() < c.capacity {
-		entry := &lruSessionCacheEntry{sessionKey, cs}
-		c.m[sessionKey] = c.q.PushFront(entry)
-		return
-	}
-
-	elem := c.q.Back()
-	entry := elem.Value.(*lruSessionCacheEntry)
-	delete(c.m, entry.sessionKey)
-	entry.sessionKey = sessionKey
-	entry.state = cs
-	c.q.MoveToFront(elem)
-	c.m[sessionKey] = elem
-}
-
-// Get returns the ClientSessionState value associated with a given key. It
-// returns (nil, false) if no value is found.
-func (c *lruSessionCache) Get(sessionKey string) (*ClientSessionState, bool) {
-	c.Lock()
-	defer c.Unlock()
-
-	if elem, ok := c.m[sessionKey]; ok {
-		c.q.MoveToFront(elem)
-		return elem.Value.(*lruSessionCacheEntry).state, true
-	}
-	return nil, false
-}
-
-// TODO(jsing): Make these available to both crypto/x509 and crypto/tls.
-type dsaSignature struct {
-	R, S *big.Int
-}
-
-type ecdsaSignature dsaSignature
-
-var emptyConfig Config
-
-func defaultConfig() *Config {
-	return &emptyConfig
-}
-
-var (
-	once                   sync.Once
-	varDefaultCipherSuites []uint16
-)
-
-func defaultCipherSuites() []uint16 {
-	once.Do(initDefaultCipherSuites)
-	return varDefaultCipherSuites
-}
-
-func initDefaultCipherSuites() {
-	varDefaultCipherSuites = make([]uint16, 0, len(cipherSuites))
-	for _, suite := range cipherSuites {
-		if suite.flags&suiteDefaultOff != 0 {
-			continue
-		}
-		varDefaultCipherSuites = append(varDefaultCipherSuites, suite.id)
-	}
-}
-
-func unexpectedMessageError(wanted, got interface{}) error {
-	return fmt.Errorf("tls: received unexpected handshake message of type %T when waiting for %T", got, wanted)
-}
-
-func isSupportedSignatureAndHash(sigHash signatureAndHash, sigHashes []signatureAndHash) bool {
-	for _, s := range sigHashes {
-		if s == sigHash {
-			return true
-		}
-	}
-	return false
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/conn.go b/third_party/gofrontend/libgo/go/crypto/tls/conn.go
deleted file mode 100644
index e3dcf15..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/conn.go
+++ /dev/null
@@ -1,1032 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// TLS low level connection and record layer
-
-package tls
-
-import (
-	"bytes"
-	"crypto/cipher"
-	"crypto/subtle"
-	"crypto/x509"
-	"errors"
-	"fmt"
-	"io"
-	"net"
-	"sync"
-	"time"
-)
-
-// A Conn represents a secured connection.
-// It implements the net.Conn interface.
-type Conn struct {
-	// constant
-	conn     net.Conn
-	isClient bool
-
-	// constant after handshake; protected by handshakeMutex
-	handshakeMutex    sync.Mutex // handshakeMutex < in.Mutex, out.Mutex, errMutex
-	handshakeErr      error      // error resulting from handshake
-	vers              uint16     // TLS version
-	haveVers          bool       // version has been negotiated
-	config            *Config    // configuration passed to constructor
-	handshakeComplete bool
-	didResume         bool // whether this connection was a session resumption
-	cipherSuite       uint16
-	ocspResponse      []byte   // stapled OCSP response
-	scts              [][]byte // signed certificate timestamps from server
-	peerCertificates  []*x509.Certificate
-	// verifiedChains contains the certificate chains that we built, as
-	// opposed to the ones presented by the server.
-	verifiedChains [][]*x509.Certificate
-	// serverName contains the server name indicated by the client, if any.
-	serverName string
-	// firstFinished contains the first Finished hash sent during the
-	// handshake. This is the "tls-unique" channel binding value.
-	firstFinished [12]byte
-
-	clientProtocol         string
-	clientProtocolFallback bool
-
-	// input/output
-	in, out  halfConn     // in.Mutex < out.Mutex
-	rawInput *block       // raw input, right off the wire
-	input    *block       // application data waiting to be read
-	hand     bytes.Buffer // handshake data waiting to be read
-
-	tmp [16]byte
-}
-
-// Access to net.Conn methods.
-// Cannot just embed net.Conn because that would
-// export the struct field too.
-
-// LocalAddr returns the local network address.
-func (c *Conn) LocalAddr() net.Addr {
-	return c.conn.LocalAddr()
-}
-
-// RemoteAddr returns the remote network address.
-func (c *Conn) RemoteAddr() net.Addr {
-	return c.conn.RemoteAddr()
-}
-
-// SetDeadline sets the read and write deadlines associated with the connection.
-// A zero value for t means Read and Write will not time out.
-// After a Write has timed out, the TLS state is corrupt and all future writes will return the same error.
-func (c *Conn) SetDeadline(t time.Time) error {
-	return c.conn.SetDeadline(t)
-}
-
-// SetReadDeadline sets the read deadline on the underlying connection.
-// A zero value for t means Read will not time out.
-func (c *Conn) SetReadDeadline(t time.Time) error {
-	return c.conn.SetReadDeadline(t)
-}
-
-// SetWriteDeadline sets the write deadline on the underlying connection.
-// A zero value for t means Write will not time out.
-// After a Write has timed out, the TLS state is corrupt and all future writes will return the same error.
-func (c *Conn) SetWriteDeadline(t time.Time) error {
-	return c.conn.SetWriteDeadline(t)
-}
-
-// A halfConn represents one direction of the record layer
-// connection, either sending or receiving.
-type halfConn struct {
-	sync.Mutex
-
-	err     error       // first permanent error
-	version uint16      // protocol version
-	cipher  interface{} // cipher algorithm
-	mac     macFunction
-	seq     [8]byte // 64-bit sequence number
-	bfree   *block  // list of free blocks
-
-	nextCipher interface{} // next encryption state
-	nextMac    macFunction // next MAC algorithm
-
-	// used to save allocating a new buffer for each MAC.
-	inDigestBuf, outDigestBuf []byte
-}
-
-func (hc *halfConn) setErrorLocked(err error) error {
-	hc.err = err
-	return err
-}
-
-func (hc *halfConn) error() error {
-	hc.Lock()
-	err := hc.err
-	hc.Unlock()
-	return err
-}
-
-// prepareCipherSpec sets the encryption and MAC states
-// that a subsequent changeCipherSpec will use.
-func (hc *halfConn) prepareCipherSpec(version uint16, cipher interface{}, mac macFunction) {
-	hc.version = version
-	hc.nextCipher = cipher
-	hc.nextMac = mac
-}
-
-// changeCipherSpec changes the encryption and MAC states
-// to the ones previously passed to prepareCipherSpec.
-func (hc *halfConn) changeCipherSpec() error {
-	if hc.nextCipher == nil {
-		return alertInternalError
-	}
-	hc.cipher = hc.nextCipher
-	hc.mac = hc.nextMac
-	hc.nextCipher = nil
-	hc.nextMac = nil
-	for i := range hc.seq {
-		hc.seq[i] = 0
-	}
-	return nil
-}
-
-// incSeq increments the sequence number.
-func (hc *halfConn) incSeq() {
-	for i := 7; i >= 0; i-- {
-		hc.seq[i]++
-		if hc.seq[i] != 0 {
-			return
-		}
-	}
-
-	// Not allowed to let sequence number wrap.
-	// Instead, must renegotiate before it does.
-	// Not likely enough to bother.
-	panic("TLS: sequence number wraparound")
-}
-
-// resetSeq resets the sequence number to zero.
-func (hc *halfConn) resetSeq() {
-	for i := range hc.seq {
-		hc.seq[i] = 0
-	}
-}
-
-// removePadding returns an unpadded slice, in constant time, which is a prefix
-// of the input. It also returns a byte which is equal to 255 if the padding
-// was valid and 0 otherwise. See RFC 2246, section 6.2.3.2
-func removePadding(payload []byte) ([]byte, byte) {
-	if len(payload) < 1 {
-		return payload, 0
-	}
-
-	paddingLen := payload[len(payload)-1]
-	t := uint(len(payload)-1) - uint(paddingLen)
-	// if len(payload) >= (paddingLen - 1) then the MSB of t is zero
-	good := byte(int32(^t) >> 31)
-
-	toCheck := 255 // the maximum possible padding length
-	// The length of the padded data is public, so we can use an if here
-	if toCheck+1 > len(payload) {
-		toCheck = len(payload) - 1
-	}
-
-	for i := 0; i < toCheck; i++ {
-		t := uint(paddingLen) - uint(i)
-		// if i <= paddingLen then the MSB of t is zero
-		mask := byte(int32(^t) >> 31)
-		b := payload[len(payload)-1-i]
-		good &^= mask&paddingLen ^ mask&b
-	}
-
-	// We AND together the bits of good and replicate the result across
-	// all the bits.
-	good &= good << 4
-	good &= good << 2
-	good &= good << 1
-	good = uint8(int8(good) >> 7)
-
-	toRemove := good&paddingLen + 1
-	return payload[:len(payload)-int(toRemove)], good
-}
-
-// removePaddingSSL30 is a replacement for removePadding in the case that the
-// protocol version is SSLv3. In this version, the contents of the padding
-// are random and cannot be checked.
-func removePaddingSSL30(payload []byte) ([]byte, byte) {
-	if len(payload) < 1 {
-		return payload, 0
-	}
-
-	paddingLen := int(payload[len(payload)-1]) + 1
-	if paddingLen > len(payload) {
-		return payload, 0
-	}
-
-	return payload[:len(payload)-paddingLen], 255
-}
-
-func roundUp(a, b int) int {
-	return a + (b-a%b)%b
-}
-
-// cbcMode is an interface for block ciphers using cipher block chaining.
-type cbcMode interface {
-	cipher.BlockMode
-	SetIV([]byte)
-}
-
-// decrypt checks and strips the mac and decrypts the data in b. Returns a
-// success boolean, the number of bytes to skip from the start of the record in
-// order to get the application payload, and an optional alert value.
-func (hc *halfConn) decrypt(b *block) (ok bool, prefixLen int, alertValue alert) {
-	// pull out payload
-	payload := b.data[recordHeaderLen:]
-
-	macSize := 0
-	if hc.mac != nil {
-		macSize = hc.mac.Size()
-	}
-
-	paddingGood := byte(255)
-	explicitIVLen := 0
-
-	// decrypt
-	if hc.cipher != nil {
-		switch c := hc.cipher.(type) {
-		case cipher.Stream:
-			c.XORKeyStream(payload, payload)
-		case cipher.AEAD:
-			explicitIVLen = 8
-			if len(payload) < explicitIVLen {
-				return false, 0, alertBadRecordMAC
-			}
-			nonce := payload[:8]
-			payload = payload[8:]
-
-			var additionalData [13]byte
-			copy(additionalData[:], hc.seq[:])
-			copy(additionalData[8:], b.data[:3])
-			n := len(payload) - c.Overhead()
-			additionalData[11] = byte(n >> 8)
-			additionalData[12] = byte(n)
-			var err error
-			payload, err = c.Open(payload[:0], nonce, payload, additionalData[:])
-			if err != nil {
-				return false, 0, alertBadRecordMAC
-			}
-			b.resize(recordHeaderLen + explicitIVLen + len(payload))
-		case cbcMode:
-			blockSize := c.BlockSize()
-			if hc.version >= VersionTLS11 {
-				explicitIVLen = blockSize
-			}
-
-			if len(payload)%blockSize != 0 || len(payload) < roundUp(explicitIVLen+macSize+1, blockSize) {
-				return false, 0, alertBadRecordMAC
-			}
-
-			if explicitIVLen > 0 {
-				c.SetIV(payload[:explicitIVLen])
-				payload = payload[explicitIVLen:]
-			}
-			c.CryptBlocks(payload, payload)
-			if hc.version == VersionSSL30 {
-				payload, paddingGood = removePaddingSSL30(payload)
-			} else {
-				payload, paddingGood = removePadding(payload)
-			}
-			b.resize(recordHeaderLen + explicitIVLen + len(payload))
-
-			// note that we still have a timing side-channel in the
-			// MAC check, below. An attacker can align the record
-			// so that a correct padding will cause one less hash
-			// block to be calculated. Then they can iteratively
-			// decrypt a record by breaking each byte. See
-			// "Password Interception in a SSL/TLS Channel", Brice
-			// Canvel et al.
-			//
-			// However, our behavior matches OpenSSL, so we leak
-			// only as much as they do.
-		default:
-			panic("unknown cipher type")
-		}
-	}
-
-	// check, strip mac
-	if hc.mac != nil {
-		if len(payload) < macSize {
-			return false, 0, alertBadRecordMAC
-		}
-
-		// strip mac off payload, b.data
-		n := len(payload) - macSize
-		b.data[3] = byte(n >> 8)
-		b.data[4] = byte(n)
-		b.resize(recordHeaderLen + explicitIVLen + n)
-		remoteMAC := payload[n:]
-		localMAC := hc.mac.MAC(hc.inDigestBuf, hc.seq[0:], b.data[:recordHeaderLen], payload[:n])
-
-		if subtle.ConstantTimeCompare(localMAC, remoteMAC) != 1 || paddingGood != 255 {
-			return false, 0, alertBadRecordMAC
-		}
-		hc.inDigestBuf = localMAC
-	}
-	hc.incSeq()
-
-	return true, recordHeaderLen + explicitIVLen, 0
-}
-
-// padToBlockSize calculates the needed padding block, if any, for a payload.
-// On exit, prefix aliases payload and extends to the end of the last full
-// block of payload. finalBlock is a fresh slice which contains the contents of
-// any suffix of payload as well as the needed padding to make finalBlock a
-// full block.
-func padToBlockSize(payload []byte, blockSize int) (prefix, finalBlock []byte) {
-	overrun := len(payload) % blockSize
-	paddingLen := blockSize - overrun
-	prefix = payload[:len(payload)-overrun]
-	finalBlock = make([]byte, blockSize)
-	copy(finalBlock, payload[len(payload)-overrun:])
-	for i := overrun; i < blockSize; i++ {
-		finalBlock[i] = byte(paddingLen - 1)
-	}
-	return
-}
-
-// encrypt encrypts and macs the data in b.
-func (hc *halfConn) encrypt(b *block, explicitIVLen int) (bool, alert) {
-	// mac
-	if hc.mac != nil {
-		mac := hc.mac.MAC(hc.outDigestBuf, hc.seq[0:], b.data[:recordHeaderLen], b.data[recordHeaderLen+explicitIVLen:])
-
-		n := len(b.data)
-		b.resize(n + len(mac))
-		copy(b.data[n:], mac)
-		hc.outDigestBuf = mac
-	}
-
-	payload := b.data[recordHeaderLen:]
-
-	// encrypt
-	if hc.cipher != nil {
-		switch c := hc.cipher.(type) {
-		case cipher.Stream:
-			c.XORKeyStream(payload, payload)
-		case cipher.AEAD:
-			payloadLen := len(b.data) - recordHeaderLen - explicitIVLen
-			b.resize(len(b.data) + c.Overhead())
-			nonce := b.data[recordHeaderLen : recordHeaderLen+explicitIVLen]
-			payload := b.data[recordHeaderLen+explicitIVLen:]
-			payload = payload[:payloadLen]
-
-			var additionalData [13]byte
-			copy(additionalData[:], hc.seq[:])
-			copy(additionalData[8:], b.data[:3])
-			additionalData[11] = byte(payloadLen >> 8)
-			additionalData[12] = byte(payloadLen)
-
-			c.Seal(payload[:0], nonce, payload, additionalData[:])
-		case cbcMode:
-			blockSize := c.BlockSize()
-			if explicitIVLen > 0 {
-				c.SetIV(payload[:explicitIVLen])
-				payload = payload[explicitIVLen:]
-			}
-			prefix, finalBlock := padToBlockSize(payload, blockSize)
-			b.resize(recordHeaderLen + explicitIVLen + len(prefix) + len(finalBlock))
-			c.CryptBlocks(b.data[recordHeaderLen+explicitIVLen:], prefix)
-			c.CryptBlocks(b.data[recordHeaderLen+explicitIVLen+len(prefix):], finalBlock)
-		default:
-			panic("unknown cipher type")
-		}
-	}
-
-	// update length to include MAC and any block padding needed.
-	n := len(b.data) - recordHeaderLen
-	b.data[3] = byte(n >> 8)
-	b.data[4] = byte(n)
-	hc.incSeq()
-
-	return true, 0
-}
-
-// A block is a simple data buffer.
-type block struct {
-	data []byte
-	off  int // index for Read
-	link *block
-}
-
-// resize resizes block to be n bytes, growing if necessary.
-func (b *block) resize(n int) {
-	if n > cap(b.data) {
-		b.reserve(n)
-	}
-	b.data = b.data[0:n]
-}
-
-// reserve makes sure that block contains a capacity of at least n bytes.
-func (b *block) reserve(n int) {
-	if cap(b.data) >= n {
-		return
-	}
-	m := cap(b.data)
-	if m == 0 {
-		m = 1024
-	}
-	for m < n {
-		m *= 2
-	}
-	data := make([]byte, len(b.data), m)
-	copy(data, b.data)
-	b.data = data
-}
-
-// readFromUntil reads from r into b until b contains at least n bytes
-// or else returns an error.
-func (b *block) readFromUntil(r io.Reader, n int) error {
-	// quick case
-	if len(b.data) >= n {
-		return nil
-	}
-
-	// read until have enough.
-	b.reserve(n)
-	for {
-		m, err := r.Read(b.data[len(b.data):cap(b.data)])
-		b.data = b.data[0 : len(b.data)+m]
-		if len(b.data) >= n {
-			// TODO(bradfitz,agl): slightly suspicious
-			// that we're throwing away r.Read's err here.
-			break
-		}
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func (b *block) Read(p []byte) (n int, err error) {
-	n = copy(p, b.data[b.off:])
-	b.off += n
-	return
-}
-
-// newBlock allocates a new block, from hc's free list if possible.
-func (hc *halfConn) newBlock() *block {
-	b := hc.bfree
-	if b == nil {
-		return new(block)
-	}
-	hc.bfree = b.link
-	b.link = nil
-	b.resize(0)
-	return b
-}
-
-// freeBlock returns a block to hc's free list.
-// The protocol is such that each side only has a block or two on
-// its free list at a time, so there's no need to worry about
-// trimming the list, etc.
-func (hc *halfConn) freeBlock(b *block) {
-	b.link = hc.bfree
-	hc.bfree = b
-}
-
-// splitBlock splits a block after the first n bytes,
-// returning a block with those n bytes and a
-// block with the remainder.  the latter may be nil.
-func (hc *halfConn) splitBlock(b *block, n int) (*block, *block) {
-	if len(b.data) <= n {
-		return b, nil
-	}
-	bb := hc.newBlock()
-	bb.resize(len(b.data) - n)
-	copy(bb.data, b.data[n:])
-	b.data = b.data[0:n]
-	return b, bb
-}
-
-// readRecord reads the next TLS record from the connection
-// and updates the record layer state.
-// c.in.Mutex <= L; c.input == nil.
-func (c *Conn) readRecord(want recordType) error {
-	// Caller must be in sync with connection:
-	// handshake data if handshake not yet completed,
-	// else application data.  (We don't support renegotiation.)
-	switch want {
-	default:
-		c.sendAlert(alertInternalError)
-		return c.in.setErrorLocked(errors.New("tls: unknown record type requested"))
-	case recordTypeHandshake, recordTypeChangeCipherSpec:
-		if c.handshakeComplete {
-			c.sendAlert(alertInternalError)
-			return c.in.setErrorLocked(errors.New("tls: handshake or ChangeCipherSpec requested after handshake complete"))
-		}
-	case recordTypeApplicationData:
-		if !c.handshakeComplete {
-			c.sendAlert(alertInternalError)
-			return c.in.setErrorLocked(errors.New("tls: application data record requested before handshake complete"))
-		}
-	}
-
-Again:
-	if c.rawInput == nil {
-		c.rawInput = c.in.newBlock()
-	}
-	b := c.rawInput
-
-	// Read header, payload.
-	if err := b.readFromUntil(c.conn, recordHeaderLen); err != nil {
-		// RFC suggests that EOF without an alertCloseNotify is
-		// an error, but popular web sites seem to do this,
-		// so we can't make it an error.
-		// if err == io.EOF {
-		// 	err = io.ErrUnexpectedEOF
-		// }
-		if e, ok := err.(net.Error); !ok || !e.Temporary() {
-			c.in.setErrorLocked(err)
-		}
-		return err
-	}
-	typ := recordType(b.data[0])
-
-	// No valid TLS record has a type of 0x80, however SSLv2 handshakes
-	// start with a uint16 length where the MSB is set and the first record
-	// is always < 256 bytes long. Therefore typ == 0x80 strongly suggests
-	// an SSLv2 client.
-	if want == recordTypeHandshake && typ == 0x80 {
-		c.sendAlert(alertProtocolVersion)
-		return c.in.setErrorLocked(errors.New("tls: unsupported SSLv2 handshake received"))
-	}
-
-	vers := uint16(b.data[1])<<8 | uint16(b.data[2])
-	n := int(b.data[3])<<8 | int(b.data[4])
-	if c.haveVers && vers != c.vers {
-		c.sendAlert(alertProtocolVersion)
-		return c.in.setErrorLocked(fmt.Errorf("tls: received record with version %x when expecting version %x", vers, c.vers))
-	}
-	if n > maxCiphertext {
-		c.sendAlert(alertRecordOverflow)
-		return c.in.setErrorLocked(fmt.Errorf("tls: oversized record received with length %d", n))
-	}
-	if !c.haveVers {
-		// First message, be extra suspicious: this might not be a TLS
-		// client. Bail out before reading a full 'body', if possible.
-		// The current max version is 3.3 so if the version is >= 16.0,
-		// it's probably not real.
-		if (typ != recordTypeAlert && typ != want) || vers >= 0x1000 {
-			c.sendAlert(alertUnexpectedMessage)
-			return c.in.setErrorLocked(fmt.Errorf("tls: first record does not look like a TLS handshake"))
-		}
-	}
-	if err := b.readFromUntil(c.conn, recordHeaderLen+n); err != nil {
-		if err == io.EOF {
-			err = io.ErrUnexpectedEOF
-		}
-		if e, ok := err.(net.Error); !ok || !e.Temporary() {
-			c.in.setErrorLocked(err)
-		}
-		return err
-	}
-
-	// Process message.
-	b, c.rawInput = c.in.splitBlock(b, recordHeaderLen+n)
-	ok, off, err := c.in.decrypt(b)
-	if !ok {
-		c.in.setErrorLocked(c.sendAlert(err))
-	}
-	b.off = off
-	data := b.data[b.off:]
-	if len(data) > maxPlaintext {
-		err := c.sendAlert(alertRecordOverflow)
-		c.in.freeBlock(b)
-		return c.in.setErrorLocked(err)
-	}
-
-	switch typ {
-	default:
-		c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
-
-	case recordTypeAlert:
-		if len(data) != 2 {
-			c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
-			break
-		}
-		if alert(data[1]) == alertCloseNotify {
-			c.in.setErrorLocked(io.EOF)
-			break
-		}
-		switch data[0] {
-		case alertLevelWarning:
-			// drop on the floor
-			c.in.freeBlock(b)
-			goto Again
-		case alertLevelError:
-			c.in.setErrorLocked(&net.OpError{Op: "remote error", Err: alert(data[1])})
-		default:
-			c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
-		}
-
-	case recordTypeChangeCipherSpec:
-		if typ != want || len(data) != 1 || data[0] != 1 {
-			c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
-			break
-		}
-		err := c.in.changeCipherSpec()
-		if err != nil {
-			c.in.setErrorLocked(c.sendAlert(err.(alert)))
-		}
-
-	case recordTypeApplicationData:
-		if typ != want {
-			c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
-			break
-		}
-		c.input = b
-		b = nil
-
-	case recordTypeHandshake:
-		// TODO(rsc): Should at least pick off connection close.
-		if typ != want {
-			return c.in.setErrorLocked(c.sendAlert(alertNoRenegotiation))
-		}
-		c.hand.Write(data)
-	}
-
-	if b != nil {
-		c.in.freeBlock(b)
-	}
-	return c.in.err
-}
-
-// sendAlert sends a TLS alert message.
-// c.out.Mutex <= L.
-func (c *Conn) sendAlertLocked(err alert) error {
-	switch err {
-	case alertNoRenegotiation, alertCloseNotify:
-		c.tmp[0] = alertLevelWarning
-	default:
-		c.tmp[0] = alertLevelError
-	}
-	c.tmp[1] = byte(err)
-	c.writeRecord(recordTypeAlert, c.tmp[0:2])
-	// closeNotify is a special case in that it isn't an error:
-	if err != alertCloseNotify {
-		return c.out.setErrorLocked(&net.OpError{Op: "local error", Err: err})
-	}
-	return nil
-}
-
-// sendAlert sends a TLS alert message.
-// L < c.out.Mutex.
-func (c *Conn) sendAlert(err alert) error {
-	c.out.Lock()
-	defer c.out.Unlock()
-	return c.sendAlertLocked(err)
-}
-
-// writeRecord writes a TLS record with the given type and payload
-// to the connection and updates the record layer state.
-// c.out.Mutex <= L.
-func (c *Conn) writeRecord(typ recordType, data []byte) (n int, err error) {
-	b := c.out.newBlock()
-	for len(data) > 0 {
-		m := len(data)
-		if m > maxPlaintext {
-			m = maxPlaintext
-		}
-		explicitIVLen := 0
-		explicitIVIsSeq := false
-
-		var cbc cbcMode
-		if c.out.version >= VersionTLS11 {
-			var ok bool
-			if cbc, ok = c.out.cipher.(cbcMode); ok {
-				explicitIVLen = cbc.BlockSize()
-			}
-		}
-		if explicitIVLen == 0 {
-			if _, ok := c.out.cipher.(cipher.AEAD); ok {
-				explicitIVLen = 8
-				// The AES-GCM construction in TLS has an
-				// explicit nonce so that the nonce can be
-				// random. However, the nonce is only 8 bytes
-				// which is too small for a secure, random
-				// nonce. Therefore we use the sequence number
-				// as the nonce.
-				explicitIVIsSeq = true
-			}
-		}
-		b.resize(recordHeaderLen + explicitIVLen + m)
-		b.data[0] = byte(typ)
-		vers := c.vers
-		if vers == 0 {
-			// Some TLS servers fail if the record version is
-			// greater than TLS 1.0 for the initial ClientHello.
-			vers = VersionTLS10
-		}
-		b.data[1] = byte(vers >> 8)
-		b.data[2] = byte(vers)
-		b.data[3] = byte(m >> 8)
-		b.data[4] = byte(m)
-		if explicitIVLen > 0 {
-			explicitIV := b.data[recordHeaderLen : recordHeaderLen+explicitIVLen]
-			if explicitIVIsSeq {
-				copy(explicitIV, c.out.seq[:])
-			} else {
-				if _, err = io.ReadFull(c.config.rand(), explicitIV); err != nil {
-					break
-				}
-			}
-		}
-		copy(b.data[recordHeaderLen+explicitIVLen:], data)
-		c.out.encrypt(b, explicitIVLen)
-		_, err = c.conn.Write(b.data)
-		if err != nil {
-			break
-		}
-		n += m
-		data = data[m:]
-	}
-	c.out.freeBlock(b)
-
-	if typ == recordTypeChangeCipherSpec {
-		err = c.out.changeCipherSpec()
-		if err != nil {
-			// Cannot call sendAlert directly,
-			// because we already hold c.out.Mutex.
-			c.tmp[0] = alertLevelError
-			c.tmp[1] = byte(err.(alert))
-			c.writeRecord(recordTypeAlert, c.tmp[0:2])
-			return n, c.out.setErrorLocked(&net.OpError{Op: "local error", Err: err})
-		}
-	}
-	return
-}
-
-// readHandshake reads the next handshake message from
-// the record layer.
-// c.in.Mutex < L; c.out.Mutex < L.
-func (c *Conn) readHandshake() (interface{}, error) {
-	for c.hand.Len() < 4 {
-		if err := c.in.err; err != nil {
-			return nil, err
-		}
-		if err := c.readRecord(recordTypeHandshake); err != nil {
-			return nil, err
-		}
-	}
-
-	data := c.hand.Bytes()
-	n := int(data[1])<<16 | int(data[2])<<8 | int(data[3])
-	if n > maxHandshake {
-		return nil, c.in.setErrorLocked(c.sendAlert(alertInternalError))
-	}
-	for c.hand.Len() < 4+n {
-		if err := c.in.err; err != nil {
-			return nil, err
-		}
-		if err := c.readRecord(recordTypeHandshake); err != nil {
-			return nil, err
-		}
-	}
-	data = c.hand.Next(4 + n)
-	var m handshakeMessage
-	switch data[0] {
-	case typeClientHello:
-		m = new(clientHelloMsg)
-	case typeServerHello:
-		m = new(serverHelloMsg)
-	case typeNewSessionTicket:
-		m = new(newSessionTicketMsg)
-	case typeCertificate:
-		m = new(certificateMsg)
-	case typeCertificateRequest:
-		m = &certificateRequestMsg{
-			hasSignatureAndHash: c.vers >= VersionTLS12,
-		}
-	case typeCertificateStatus:
-		m = new(certificateStatusMsg)
-	case typeServerKeyExchange:
-		m = new(serverKeyExchangeMsg)
-	case typeServerHelloDone:
-		m = new(serverHelloDoneMsg)
-	case typeClientKeyExchange:
-		m = new(clientKeyExchangeMsg)
-	case typeCertificateVerify:
-		m = &certificateVerifyMsg{
-			hasSignatureAndHash: c.vers >= VersionTLS12,
-		}
-	case typeNextProtocol:
-		m = new(nextProtoMsg)
-	case typeFinished:
-		m = new(finishedMsg)
-	default:
-		return nil, c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
-	}
-
-	// The handshake message unmarshallers
-	// expect to be able to keep references to data,
-	// so pass in a fresh copy that won't be overwritten.
-	data = append([]byte(nil), data...)
-
-	if !m.unmarshal(data) {
-		return nil, c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
-	}
-	return m, nil
-}
-
-// Write writes data to the connection.
-func (c *Conn) Write(b []byte) (int, error) {
-	if err := c.Handshake(); err != nil {
-		return 0, err
-	}
-
-	c.out.Lock()
-	defer c.out.Unlock()
-
-	if err := c.out.err; err != nil {
-		return 0, err
-	}
-
-	if !c.handshakeComplete {
-		return 0, alertInternalError
-	}
-
-	// SSL 3.0 and TLS 1.0 are susceptible to a chosen-plaintext
-	// attack when using block mode ciphers due to predictable IVs.
-	// This can be prevented by splitting each Application Data
-	// record into two records, effectively randomizing the IV.
-	//
-	// http://www.openssl.org/~bodo/tls-cbc.txt
-	// https://bugzilla.mozilla.org/show_bug.cgi?id=665814
-	// http://www.imperialviolet.org/2012/01/15/beastfollowup.html
-
-	var m int
-	if len(b) > 1 && c.vers <= VersionTLS10 {
-		if _, ok := c.out.cipher.(cipher.BlockMode); ok {
-			n, err := c.writeRecord(recordTypeApplicationData, b[:1])
-			if err != nil {
-				return n, c.out.setErrorLocked(err)
-			}
-			m, b = 1, b[1:]
-		}
-	}
-
-	n, err := c.writeRecord(recordTypeApplicationData, b)
-	return n + m, c.out.setErrorLocked(err)
-}
-
-// Read can be made to time out and return a net.Error with Timeout() == true
-// after a fixed time limit; see SetDeadline and SetReadDeadline.
-func (c *Conn) Read(b []byte) (n int, err error) {
-	if err = c.Handshake(); err != nil {
-		return
-	}
-	if len(b) == 0 {
-		// Put this after Handshake, in case people were calling
-		// Read(nil) for the side effect of the Handshake.
-		return
-	}
-
-	c.in.Lock()
-	defer c.in.Unlock()
-
-	// Some OpenSSL servers send empty records in order to randomize the
-	// CBC IV. So this loop ignores a limited number of empty records.
-	const maxConsecutiveEmptyRecords = 100
-	for emptyRecordCount := 0; emptyRecordCount <= maxConsecutiveEmptyRecords; emptyRecordCount++ {
-		for c.input == nil && c.in.err == nil {
-			if err := c.readRecord(recordTypeApplicationData); err != nil {
-				// Soft error, like EAGAIN
-				return 0, err
-			}
-		}
-		if err := c.in.err; err != nil {
-			return 0, err
-		}
-
-		n, err = c.input.Read(b)
-		if c.input.off >= len(c.input.data) {
-			c.in.freeBlock(c.input)
-			c.input = nil
-		}
-
-		// If a close-notify alert is waiting, read it so that
-		// we can return (n, EOF) instead of (n, nil), to signal
-		// to the HTTP response reading goroutine that the
-		// connection is now closed. This eliminates a race
-		// where the HTTP response reading goroutine would
-		// otherwise not observe the EOF until its next read,
-		// by which time a client goroutine might have already
-		// tried to reuse the HTTP connection for a new
-		// request.
-		// See https://codereview.appspot.com/76400046
-		// and https://golang.org/issue/3514
-		if ri := c.rawInput; ri != nil &&
-			n != 0 && err == nil &&
-			c.input == nil && len(ri.data) > 0 && recordType(ri.data[0]) == recordTypeAlert {
-			if recErr := c.readRecord(recordTypeApplicationData); recErr != nil {
-				err = recErr // will be io.EOF on closeNotify
-			}
-		}
-
-		if n != 0 || err != nil {
-			return n, err
-		}
-	}
-
-	return 0, io.ErrNoProgress
-}
-
-// Close closes the connection.
-func (c *Conn) Close() error {
-	var alertErr error
-
-	c.handshakeMutex.Lock()
-	defer c.handshakeMutex.Unlock()
-	if c.handshakeComplete {
-		alertErr = c.sendAlert(alertCloseNotify)
-	}
-
-	if err := c.conn.Close(); err != nil {
-		return err
-	}
-	return alertErr
-}
-
-// Handshake runs the client or server handshake
-// protocol if it has not yet been run.
-// Most uses of this package need not call Handshake
-// explicitly: the first Read or Write will call it automatically.
-func (c *Conn) Handshake() error {
-	c.handshakeMutex.Lock()
-	defer c.handshakeMutex.Unlock()
-	if err := c.handshakeErr; err != nil {
-		return err
-	}
-	if c.handshakeComplete {
-		return nil
-	}
-
-	if c.isClient {
-		c.handshakeErr = c.clientHandshake()
-	} else {
-		c.handshakeErr = c.serverHandshake()
-	}
-	return c.handshakeErr
-}
-
-// ConnectionState returns basic TLS details about the connection.
-func (c *Conn) ConnectionState() ConnectionState {
-	c.handshakeMutex.Lock()
-	defer c.handshakeMutex.Unlock()
-
-	var state ConnectionState
-	state.HandshakeComplete = c.handshakeComplete
-	if c.handshakeComplete {
-		state.Version = c.vers
-		state.NegotiatedProtocol = c.clientProtocol
-		state.DidResume = c.didResume
-		state.NegotiatedProtocolIsMutual = !c.clientProtocolFallback
-		state.CipherSuite = c.cipherSuite
-		state.PeerCertificates = c.peerCertificates
-		state.VerifiedChains = c.verifiedChains
-		state.ServerName = c.serverName
-		state.SignedCertificateTimestamps = c.scts
-		state.OCSPResponse = c.ocspResponse
-		if !c.didResume {
-			state.TLSUnique = c.firstFinished[:]
-		}
-	}
-
-	return state
-}
-
-// OCSPResponse returns the stapled OCSP response from the TLS server, if
-// any. (Only valid for client connections.)
-func (c *Conn) OCSPResponse() []byte {
-	c.handshakeMutex.Lock()
-	defer c.handshakeMutex.Unlock()
-
-	return c.ocspResponse
-}
-
-// VerifyHostname checks that the peer certificate chain is valid for
-// connecting to host.  If so, it returns nil; if not, it returns an error
-// describing the problem.
-func (c *Conn) VerifyHostname(host string) error {
-	c.handshakeMutex.Lock()
-	defer c.handshakeMutex.Unlock()
-	if !c.isClient {
-		return errors.New("tls: VerifyHostname called on TLS server connection")
-	}
-	if !c.handshakeComplete {
-		return errors.New("tls: handshake has not yet been performed")
-	}
-	if len(c.verifiedChains) == 0 {
-		return errors.New("tls: handshake did not verify certificate chain")
-	}
-	return c.peerCertificates[0].VerifyHostname(host)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/conn_test.go b/third_party/gofrontend/libgo/go/crypto/tls/conn_test.go
deleted file mode 100644
index ec802ca..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/conn_test.go
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"testing"
-)
-
-func TestRoundUp(t *testing.T) {
-	if roundUp(0, 16) != 0 ||
-		roundUp(1, 16) != 16 ||
-		roundUp(15, 16) != 16 ||
-		roundUp(16, 16) != 16 ||
-		roundUp(17, 16) != 32 {
-		t.Error("roundUp broken")
-	}
-}
-
-var paddingTests = []struct {
-	in          []byte
-	good        bool
-	expectedLen int
-}{
-	{[]byte{1, 2, 3, 4, 0}, true, 4},
-	{[]byte{1, 2, 3, 4, 0, 1}, false, 0},
-	{[]byte{1, 2, 3, 4, 99, 99}, false, 0},
-	{[]byte{1, 2, 3, 4, 1, 1}, true, 4},
-	{[]byte{1, 2, 3, 2, 2, 2}, true, 3},
-	{[]byte{1, 2, 3, 3, 3, 3}, true, 2},
-	{[]byte{1, 2, 3, 4, 3, 3}, false, 0},
-	{[]byte{1, 4, 4, 4, 4, 4}, true, 1},
-	{[]byte{5, 5, 5, 5, 5, 5}, true, 0},
-	{[]byte{6, 6, 6, 6, 6, 6}, false, 0},
-}
-
-func TestRemovePadding(t *testing.T) {
-	for i, test := range paddingTests {
-		payload, good := removePadding(test.in)
-		expectedGood := byte(255)
-		if !test.good {
-			expectedGood = 0
-		}
-		if good != expectedGood {
-			t.Errorf("#%d: wrong validity, want:%d got:%d", i, expectedGood, good)
-		}
-		if good == 255 && len(payload) != test.expectedLen {
-			t.Errorf("#%d: got %d, want %d", i, len(payload), test.expectedLen)
-		}
-	}
-}
-
-var certExampleCom = `308201403081eda003020102020101300b06092a864886f70d010105301e311c301a060355040a131354657374696e67204365727469666963617465301e170d3131313030313138353835325a170d3132303933303138353835325a301e311c301a060355040a131354657374696e67204365727469666963617465305a300b06092a864886f70d010101034b003048024100bced6e32368599eeddf18796bfd03958a154f87e5b084f96e85136a56b886733592f493f0fc68b0d6b3551781cb95e13c5de458b28d6fb60d20a9129313261410203010001a31a301830160603551d11040f300d820b6578616d706c652e636f6d300b06092a864886f70d0101050341001a0b419d2c74474c6450654e5f10b32bf426ffdf55cad1c52602e7a9151513a3424c70f5960dcd682db0c33769cc1daa3fcdd3db10809d2392ed4a1bf50ced18`
-
-var certWildcardExampleCom = `308201423081efa003020102020101300b06092a864886f70d010105301e311c301a060355040a131354657374696e67204365727469666963617465301e170d3131313030313139303034365a170d3132303933303139303034365a301e311c301a060355040a131354657374696e67204365727469666963617465305a300b06092a864886f70d010101034b003048024100bced6e32368599eeddf18796bfd03958a154f87e5b084f96e85136a56b886733592f493f0fc68b0d6b3551781cb95e13c5de458b28d6fb60d20a9129313261410203010001a31c301a30180603551d110411300f820d2a2e6578616d706c652e636f6d300b06092a864886f70d0101050341001676f0c9e7c33c1b656ed5a6476c4e2ee9ec8e62df7407accb1875272b2edd0a22096cb2c22598d11604104d604f810eb4b5987ca6bb319c7e6ce48725c54059`
-
-var certFooExampleCom = `308201443081f1a003020102020101300b06092a864886f70d010105301e311c301a060355040a131354657374696e67204365727469666963617465301e170d3131313030313139303131345a170d3132303933303139303131345a301e311c301a060355040a131354657374696e67204365727469666963617465305a300b06092a864886f70d010101034b003048024100bced6e32368599eeddf18796bfd03958a154f87e5b084f96e85136a56b886733592f493f0fc68b0d6b3551781cb95e13c5de458b28d6fb60d20a9129313261410203010001a31e301c301a0603551d1104133011820f666f6f2e6578616d706c652e636f6d300b06092a864886f70d010105034100646a2a51f2aa2477add854b462cf5207ba16d3213ffb5d3d0eed473fbf09935019192d1d5b8ca6a2407b424cf04d97c4cd9197c83ecf81f0eab9464a1109d09f`
-
-var certDoubleWildcardExampleCom = `308201443081f1a003020102020101300b06092a864886f70d010105301e311c301a060355040a131354657374696e67204365727469666963617465301e170d3131313030313139303134315a170d3132303933303139303134315a301e311c301a060355040a131354657374696e67204365727469666963617465305a300b06092a864886f70d010101034b003048024100bced6e32368599eeddf18796bfd03958a154f87e5b084f96e85136a56b886733592f493f0fc68b0d6b3551781cb95e13c5de458b28d6fb60d20a9129313261410203010001a31e301c301a0603551d1104133011820f2a2e2a2e6578616d706c652e636f6d300b06092a864886f70d0101050341001c3de267975f56ef57771c6218ef95ecc65102e57bd1defe6f7efea90d9b26cf40de5bd7ad75e46201c7f2a92aaa3e907451e9409f65e28ddb6db80d726290f6`
-
-func TestCertificateSelection(t *testing.T) {
-	config := Config{
-		Certificates: []Certificate{
-			{
-				Certificate: [][]byte{fromHex(certExampleCom)},
-			},
-			{
-				Certificate: [][]byte{fromHex(certWildcardExampleCom)},
-			},
-			{
-				Certificate: [][]byte{fromHex(certFooExampleCom)},
-			},
-			{
-				Certificate: [][]byte{fromHex(certDoubleWildcardExampleCom)},
-			},
-		},
-	}
-
-	config.BuildNameToCertificate()
-
-	pointerToIndex := func(c *Certificate) int {
-		for i := range config.Certificates {
-			if c == &config.Certificates[i] {
-				return i
-			}
-		}
-		return -1
-	}
-
-	certificateForName := func(name string) *Certificate {
-		clientHello := &ClientHelloInfo{
-			ServerName: name,
-		}
-		if cert, err := config.getCertificate(clientHello); err != nil {
-			t.Errorf("unable to get certificate for name '%s': %s", name, err)
-			return nil
-		} else {
-			return cert
-		}
-	}
-
-	if n := pointerToIndex(certificateForName("example.com")); n != 0 {
-		t.Errorf("example.com returned certificate %d, not 0", n)
-	}
-	if n := pointerToIndex(certificateForName("bar.example.com")); n != 1 {
-		t.Errorf("bar.example.com returned certificate %d, not 1", n)
-	}
-	if n := pointerToIndex(certificateForName("foo.example.com")); n != 2 {
-		t.Errorf("foo.example.com returned certificate %d, not 2", n)
-	}
-	if n := pointerToIndex(certificateForName("foo.bar.example.com")); n != 3 {
-		t.Errorf("foo.bar.example.com returned certificate %d, not 3", n)
-	}
-	if n := pointerToIndex(certificateForName("foo.bar.baz.example.com")); n != 0 {
-		t.Errorf("foo.bar.baz.example.com returned certificate %d, not 0", n)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/generate_cert.go b/third_party/gofrontend/libgo/go/crypto/tls/generate_cert.go
deleted file mode 100644
index 83f9916..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/generate_cert.go
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// Generate a self-signed X.509 certificate for a TLS server. Outputs to
-// 'cert.pem' and 'key.pem' and will overwrite existing files.
-
-package main
-
-import (
-	"crypto/ecdsa"
-	"crypto/elliptic"
-	"crypto/rand"
-	"crypto/rsa"
-	"crypto/x509"
-	"crypto/x509/pkix"
-	"encoding/pem"
-	"flag"
-	"fmt"
-	"log"
-	"math/big"
-	"net"
-	"os"
-	"strings"
-	"time"
-)
-
-var (
-	host       = flag.String("host", "", "Comma-separated hostnames and IPs to generate a certificate for")
-	validFrom  = flag.String("start-date", "", "Creation date formatted as Jan 1 15:04:05 2011")
-	validFor   = flag.Duration("duration", 365*24*time.Hour, "Duration that certificate is valid for")
-	isCA       = flag.Bool("ca", false, "whether this cert should be its own Certificate Authority")
-	rsaBits    = flag.Int("rsa-bits", 2048, "Size of RSA key to generate. Ignored if --ecdsa-curve is set")
-	ecdsaCurve = flag.String("ecdsa-curve", "", "ECDSA curve to use to generate a key. Valid values are P224, P256, P384, P521")
-)
-
-func publicKey(priv interface{}) interface{} {
-	switch k := priv.(type) {
-	case *rsa.PrivateKey:
-		return &k.PublicKey
-	case *ecdsa.PrivateKey:
-		return &k.PublicKey
-	default:
-		return nil
-	}
-}
-
-func pemBlockForKey(priv interface{}) *pem.Block {
-	switch k := priv.(type) {
-	case *rsa.PrivateKey:
-		return &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(k)}
-	case *ecdsa.PrivateKey:
-		b, err := x509.MarshalECPrivateKey(k)
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "Unable to marshal ECDSA private key: %v", err)
-			os.Exit(2)
-		}
-		return &pem.Block{Type: "EC PRIVATE KEY", Bytes: b}
-	default:
-		return nil
-	}
-}
-
-func main() {
-	flag.Parse()
-
-	if len(*host) == 0 {
-		log.Fatalf("Missing required --host parameter")
-	}
-
-	var priv interface{}
-	var err error
-	switch *ecdsaCurve {
-	case "":
-		priv, err = rsa.GenerateKey(rand.Reader, *rsaBits)
-	case "P224":
-		priv, err = ecdsa.GenerateKey(elliptic.P224(), rand.Reader)
-	case "P256":
-		priv, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
-	case "P384":
-		priv, err = ecdsa.GenerateKey(elliptic.P384(), rand.Reader)
-	case "P521":
-		priv, err = ecdsa.GenerateKey(elliptic.P521(), rand.Reader)
-	default:
-		fmt.Fprintf(os.Stderr, "Unrecognized elliptic curve: %q", *ecdsaCurve)
-		os.Exit(1)
-	}
-	if err != nil {
-		log.Fatalf("failed to generate private key: %s", err)
-	}
-
-	var notBefore time.Time
-	if len(*validFrom) == 0 {
-		notBefore = time.Now()
-	} else {
-		notBefore, err = time.Parse("Jan 2 15:04:05 2006", *validFrom)
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "Failed to parse creation date: %s\n", err)
-			os.Exit(1)
-		}
-	}
-
-	notAfter := notBefore.Add(*validFor)
-
-	serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
-	serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
-	if err != nil {
-		log.Fatalf("failed to generate serial number: %s", err)
-	}
-
-	template := x509.Certificate{
-		SerialNumber: serialNumber,
-		Subject: pkix.Name{
-			Organization: []string{"Acme Co"},
-		},
-		NotBefore: notBefore,
-		NotAfter:  notAfter,
-
-		KeyUsage:              x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
-		ExtKeyUsage:           []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
-		BasicConstraintsValid: true,
-	}
-
-	hosts := strings.Split(*host, ",")
-	for _, h := range hosts {
-		if ip := net.ParseIP(h); ip != nil {
-			template.IPAddresses = append(template.IPAddresses, ip)
-		} else {
-			template.DNSNames = append(template.DNSNames, h)
-		}
-	}
-
-	if *isCA {
-		template.IsCA = true
-		template.KeyUsage |= x509.KeyUsageCertSign
-	}
-
-	derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, publicKey(priv), priv)
-	if err != nil {
-		log.Fatalf("Failed to create certificate: %s", err)
-	}
-
-	certOut, err := os.Create("cert.pem")
-	if err != nil {
-		log.Fatalf("failed to open cert.pem for writing: %s", err)
-	}
-	pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes})
-	certOut.Close()
-	log.Print("written cert.pem\n")
-
-	keyOut, err := os.OpenFile("key.pem", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
-	if err != nil {
-		log.Print("failed to open key.pem for writing:", err)
-		return
-	}
-	pem.Encode(keyOut, pemBlockForKey(priv))
-	keyOut.Close()
-	log.Print("written key.pem\n")
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/handshake_client.go b/third_party/gofrontend/libgo/go/crypto/tls/handshake_client.go
deleted file mode 100644
index 0b591d7..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/handshake_client.go
+++ /dev/null
@@ -1,660 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"bytes"
-	"crypto"
-	"crypto/ecdsa"
-	"crypto/rsa"
-	"crypto/subtle"
-	"crypto/x509"
-	"errors"
-	"fmt"
-	"io"
-	"net"
-	"strconv"
-)
-
-type clientHandshakeState struct {
-	c            *Conn
-	serverHello  *serverHelloMsg
-	hello        *clientHelloMsg
-	suite        *cipherSuite
-	finishedHash finishedHash
-	masterSecret []byte
-	session      *ClientSessionState
-}
-
-func (c *Conn) clientHandshake() error {
-	if c.config == nil {
-		c.config = defaultConfig()
-	}
-
-	if len(c.config.ServerName) == 0 && !c.config.InsecureSkipVerify {
-		return errors.New("tls: either ServerName or InsecureSkipVerify must be specified in the tls.Config")
-	}
-
-	nextProtosLength := 0
-	for _, proto := range c.config.NextProtos {
-		if l := len(proto); l == 0 || l > 255 {
-			return errors.New("tls: invalid NextProtos value")
-		} else {
-			nextProtosLength += 1 + l
-		}
-	}
-	if nextProtosLength > 0xffff {
-		return errors.New("tls: NextProtos values too large")
-	}
-
-	hello := &clientHelloMsg{
-		vers:                c.config.maxVersion(),
-		compressionMethods:  []uint8{compressionNone},
-		random:              make([]byte, 32),
-		ocspStapling:        true,
-		scts:                true,
-		serverName:          c.config.ServerName,
-		supportedCurves:     c.config.curvePreferences(),
-		supportedPoints:     []uint8{pointFormatUncompressed},
-		nextProtoNeg:        len(c.config.NextProtos) > 0,
-		secureRenegotiation: true,
-		alpnProtocols:       c.config.NextProtos,
-	}
-
-	possibleCipherSuites := c.config.cipherSuites()
-	hello.cipherSuites = make([]uint16, 0, len(possibleCipherSuites))
-
-NextCipherSuite:
-	for _, suiteId := range possibleCipherSuites {
-		for _, suite := range cipherSuites {
-			if suite.id != suiteId {
-				continue
-			}
-			// Don't advertise TLS 1.2-only cipher suites unless
-			// we're attempting TLS 1.2.
-			if hello.vers < VersionTLS12 && suite.flags&suiteTLS12 != 0 {
-				continue
-			}
-			hello.cipherSuites = append(hello.cipherSuites, suiteId)
-			continue NextCipherSuite
-		}
-	}
-
-	_, err := io.ReadFull(c.config.rand(), hello.random)
-	if err != nil {
-		c.sendAlert(alertInternalError)
-		return errors.New("tls: short read from Rand: " + err.Error())
-	}
-
-	if hello.vers >= VersionTLS12 {
-		hello.signatureAndHashes = supportedSignatureAlgorithms
-	}
-
-	var session *ClientSessionState
-	var cacheKey string
-	sessionCache := c.config.ClientSessionCache
-	if c.config.SessionTicketsDisabled {
-		sessionCache = nil
-	}
-
-	if sessionCache != nil {
-		hello.ticketSupported = true
-
-		// Try to resume a previously negotiated TLS session, if
-		// available.
-		cacheKey = clientSessionCacheKey(c.conn.RemoteAddr(), c.config)
-		candidateSession, ok := sessionCache.Get(cacheKey)
-		if ok {
-			// Check that the ciphersuite/version used for the
-			// previous session are still valid.
-			cipherSuiteOk := false
-			for _, id := range hello.cipherSuites {
-				if id == candidateSession.cipherSuite {
-					cipherSuiteOk = true
-					break
-				}
-			}
-
-			versOk := candidateSession.vers >= c.config.minVersion() &&
-				candidateSession.vers <= c.config.maxVersion()
-			if versOk && cipherSuiteOk {
-				session = candidateSession
-			}
-		}
-	}
-
-	if session != nil {
-		hello.sessionTicket = session.sessionTicket
-		// A random session ID is used to detect when the
-		// server accepted the ticket and is resuming a session
-		// (see RFC 5077).
-		hello.sessionId = make([]byte, 16)
-		if _, err := io.ReadFull(c.config.rand(), hello.sessionId); err != nil {
-			c.sendAlert(alertInternalError)
-			return errors.New("tls: short read from Rand: " + err.Error())
-		}
-	}
-
-	c.writeRecord(recordTypeHandshake, hello.marshal())
-
-	msg, err := c.readHandshake()
-	if err != nil {
-		return err
-	}
-	serverHello, ok := msg.(*serverHelloMsg)
-	if !ok {
-		c.sendAlert(alertUnexpectedMessage)
-		return unexpectedMessageError(serverHello, msg)
-	}
-
-	vers, ok := c.config.mutualVersion(serverHello.vers)
-	if !ok || vers < VersionTLS10 {
-		// TLS 1.0 is the minimum version supported as a client.
-		c.sendAlert(alertProtocolVersion)
-		return fmt.Errorf("tls: server selected unsupported protocol version %x", serverHello.vers)
-	}
-	c.vers = vers
-	c.haveVers = true
-
-	suite := mutualCipherSuite(c.config.cipherSuites(), serverHello.cipherSuite)
-	if suite == nil {
-		c.sendAlert(alertHandshakeFailure)
-		return fmt.Errorf("tls: server selected an unsupported cipher suite")
-	}
-
-	hs := &clientHandshakeState{
-		c:            c,
-		serverHello:  serverHello,
-		hello:        hello,
-		suite:        suite,
-		finishedHash: newFinishedHash(c.vers, suite),
-		session:      session,
-	}
-
-	isResume, err := hs.processServerHello()
-	if err != nil {
-		return err
-	}
-
-	// No signatures of the handshake are needed in a resumption.
-	// Otherwise, in a full handshake, if we don't have any certificates
-	// configured then we will never send a CertificateVerify message and
-	// thus no signatures are needed in that case either.
-	if isResume || len(c.config.Certificates) == 0 {
-		hs.finishedHash.discardHandshakeBuffer()
-	}
-
-	hs.finishedHash.Write(hs.hello.marshal())
-	hs.finishedHash.Write(hs.serverHello.marshal())
-
-	if isResume {
-		if err := hs.establishKeys(); err != nil {
-			return err
-		}
-		if err := hs.readSessionTicket(); err != nil {
-			return err
-		}
-		if err := hs.readFinished(c.firstFinished[:]); err != nil {
-			return err
-		}
-		if err := hs.sendFinished(nil); err != nil {
-			return err
-		}
-	} else {
-		if err := hs.doFullHandshake(); err != nil {
-			return err
-		}
-		if err := hs.establishKeys(); err != nil {
-			return err
-		}
-		if err := hs.sendFinished(c.firstFinished[:]); err != nil {
-			return err
-		}
-		if err := hs.readSessionTicket(); err != nil {
-			return err
-		}
-		if err := hs.readFinished(nil); err != nil {
-			return err
-		}
-	}
-
-	if sessionCache != nil && hs.session != nil && session != hs.session {
-		sessionCache.Put(cacheKey, hs.session)
-	}
-
-	c.didResume = isResume
-	c.handshakeComplete = true
-	c.cipherSuite = suite.id
-	return nil
-}
-
-func (hs *clientHandshakeState) doFullHandshake() error {
-	c := hs.c
-
-	msg, err := c.readHandshake()
-	if err != nil {
-		return err
-	}
-	certMsg, ok := msg.(*certificateMsg)
-	if !ok || len(certMsg.certificates) == 0 {
-		c.sendAlert(alertUnexpectedMessage)
-		return unexpectedMessageError(certMsg, msg)
-	}
-	hs.finishedHash.Write(certMsg.marshal())
-
-	certs := make([]*x509.Certificate, len(certMsg.certificates))
-	for i, asn1Data := range certMsg.certificates {
-		cert, err := x509.ParseCertificate(asn1Data)
-		if err != nil {
-			c.sendAlert(alertBadCertificate)
-			return errors.New("tls: failed to parse certificate from server: " + err.Error())
-		}
-		certs[i] = cert
-	}
-
-	if !c.config.InsecureSkipVerify {
-		opts := x509.VerifyOptions{
-			Roots:         c.config.RootCAs,
-			CurrentTime:   c.config.time(),
-			DNSName:       c.config.ServerName,
-			Intermediates: x509.NewCertPool(),
-		}
-
-		for i, cert := range certs {
-			if i == 0 {
-				continue
-			}
-			opts.Intermediates.AddCert(cert)
-		}
-		c.verifiedChains, err = certs[0].Verify(opts)
-		if err != nil {
-			c.sendAlert(alertBadCertificate)
-			return err
-		}
-	}
-
-	switch certs[0].PublicKey.(type) {
-	case *rsa.PublicKey, *ecdsa.PublicKey:
-		break
-	default:
-		c.sendAlert(alertUnsupportedCertificate)
-		return fmt.Errorf("tls: server's certificate contains an unsupported type of public key: %T", certs[0].PublicKey)
-	}
-
-	c.peerCertificates = certs
-
-	if hs.serverHello.ocspStapling {
-		msg, err = c.readHandshake()
-		if err != nil {
-			return err
-		}
-		cs, ok := msg.(*certificateStatusMsg)
-		if !ok {
-			c.sendAlert(alertUnexpectedMessage)
-			return unexpectedMessageError(cs, msg)
-		}
-		hs.finishedHash.Write(cs.marshal())
-
-		if cs.statusType == statusTypeOCSP {
-			c.ocspResponse = cs.response
-		}
-	}
-
-	msg, err = c.readHandshake()
-	if err != nil {
-		return err
-	}
-
-	keyAgreement := hs.suite.ka(c.vers)
-
-	skx, ok := msg.(*serverKeyExchangeMsg)
-	if ok {
-		hs.finishedHash.Write(skx.marshal())
-		err = keyAgreement.processServerKeyExchange(c.config, hs.hello, hs.serverHello, certs[0], skx)
-		if err != nil {
-			c.sendAlert(alertUnexpectedMessage)
-			return err
-		}
-
-		msg, err = c.readHandshake()
-		if err != nil {
-			return err
-		}
-	}
-
-	var chainToSend *Certificate
-	var certRequested bool
-	certReq, ok := msg.(*certificateRequestMsg)
-	if ok {
-		certRequested = true
-
-		// RFC 4346 on the certificateAuthorities field:
-		// A list of the distinguished names of acceptable certificate
-		// authorities. These distinguished names may specify a desired
-		// distinguished name for a root CA or for a subordinate CA;
-		// thus, this message can be used to describe both known roots
-		// and a desired authorization space. If the
-		// certificate_authorities list is empty then the client MAY
-		// send any certificate of the appropriate
-		// ClientCertificateType, unless there is some external
-		// arrangement to the contrary.
-
-		hs.finishedHash.Write(certReq.marshal())
-
-		var rsaAvail, ecdsaAvail bool
-		for _, certType := range certReq.certificateTypes {
-			switch certType {
-			case certTypeRSASign:
-				rsaAvail = true
-			case certTypeECDSASign:
-				ecdsaAvail = true
-			}
-		}
-
-		// We need to search our list of client certs for one
-		// where SignatureAlgorithm is acceptable to the server and the
-		// Issuer is in certReq.certificateAuthorities
-	findCert:
-		for i, chain := range c.config.Certificates {
-			if !rsaAvail && !ecdsaAvail {
-				continue
-			}
-
-			for j, cert := range chain.Certificate {
-				x509Cert := chain.Leaf
-				// parse the certificate if this isn't the leaf
-				// node, or if chain.Leaf was nil
-				if j != 0 || x509Cert == nil {
-					if x509Cert, err = x509.ParseCertificate(cert); err != nil {
-						c.sendAlert(alertInternalError)
-						return errors.New("tls: failed to parse client certificate #" + strconv.Itoa(i) + ": " + err.Error())
-					}
-				}
-
-				switch {
-				case rsaAvail && x509Cert.PublicKeyAlgorithm == x509.RSA:
-				case ecdsaAvail && x509Cert.PublicKeyAlgorithm == x509.ECDSA:
-				default:
-					continue findCert
-				}
-
-				if len(certReq.certificateAuthorities) == 0 {
-					// they gave us an empty list, so just take the
-					// first cert from c.config.Certificates
-					chainToSend = &chain
-					break findCert
-				}
-
-				for _, ca := range certReq.certificateAuthorities {
-					if bytes.Equal(x509Cert.RawIssuer, ca) {
-						chainToSend = &chain
-						break findCert
-					}
-				}
-			}
-		}
-
-		msg, err = c.readHandshake()
-		if err != nil {
-			return err
-		}
-	}
-
-	shd, ok := msg.(*serverHelloDoneMsg)
-	if !ok {
-		c.sendAlert(alertUnexpectedMessage)
-		return unexpectedMessageError(shd, msg)
-	}
-	hs.finishedHash.Write(shd.marshal())
-
-	// If the server requested a certificate then we have to send a
-	// Certificate message, even if it's empty because we don't have a
-	// certificate to send.
-	if certRequested {
-		certMsg = new(certificateMsg)
-		if chainToSend != nil {
-			certMsg.certificates = chainToSend.Certificate
-		}
-		hs.finishedHash.Write(certMsg.marshal())
-		c.writeRecord(recordTypeHandshake, certMsg.marshal())
-	}
-
-	preMasterSecret, ckx, err := keyAgreement.generateClientKeyExchange(c.config, hs.hello, certs[0])
-	if err != nil {
-		c.sendAlert(alertInternalError)
-		return err
-	}
-	if ckx != nil {
-		hs.finishedHash.Write(ckx.marshal())
-		c.writeRecord(recordTypeHandshake, ckx.marshal())
-	}
-
-	if chainToSend != nil {
-		certVerify := &certificateVerifyMsg{
-			hasSignatureAndHash: c.vers >= VersionTLS12,
-		}
-
-		key, ok := chainToSend.PrivateKey.(crypto.Signer)
-		if !ok {
-			c.sendAlert(alertInternalError)
-			return fmt.Errorf("tls: client certificate private key of type %T does not implement crypto.Signer", chainToSend.PrivateKey)
-		}
-
-		var signatureType uint8
-		switch key.Public().(type) {
-		case *ecdsa.PublicKey:
-			signatureType = signatureECDSA
-		case *rsa.PublicKey:
-			signatureType = signatureRSA
-		default:
-			c.sendAlert(alertInternalError)
-			return fmt.Errorf("tls: failed to sign handshake with client certificate: unknown client certificate key type: %T", key)
-		}
-
-		certVerify.signatureAndHash, err = hs.finishedHash.selectClientCertSignatureAlgorithm(certReq.signatureAndHashes, signatureType)
-		if err != nil {
-			c.sendAlert(alertInternalError)
-			return err
-		}
-		digest, hashFunc, err := hs.finishedHash.hashForClientCertificate(certVerify.signatureAndHash, hs.masterSecret)
-		if err != nil {
-			c.sendAlert(alertInternalError)
-			return err
-		}
-		certVerify.signature, err = key.Sign(c.config.rand(), digest, hashFunc)
-		if err != nil {
-			c.sendAlert(alertInternalError)
-			return err
-		}
-
-		hs.finishedHash.Write(certVerify.marshal())
-		c.writeRecord(recordTypeHandshake, certVerify.marshal())
-	}
-
-	hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.hello.random, hs.serverHello.random)
-
-	hs.finishedHash.discardHandshakeBuffer()
-
-	return nil
-}
-
-func (hs *clientHandshakeState) establishKeys() error {
-	c := hs.c
-
-	clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
-		keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.hello.random, hs.serverHello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen)
-	var clientCipher, serverCipher interface{}
-	var clientHash, serverHash macFunction
-	if hs.suite.cipher != nil {
-		clientCipher = hs.suite.cipher(clientKey, clientIV, false /* not for reading */)
-		clientHash = hs.suite.mac(c.vers, clientMAC)
-		serverCipher = hs.suite.cipher(serverKey, serverIV, true /* for reading */)
-		serverHash = hs.suite.mac(c.vers, serverMAC)
-	} else {
-		clientCipher = hs.suite.aead(clientKey, clientIV)
-		serverCipher = hs.suite.aead(serverKey, serverIV)
-	}
-
-	c.in.prepareCipherSpec(c.vers, serverCipher, serverHash)
-	c.out.prepareCipherSpec(c.vers, clientCipher, clientHash)
-	return nil
-}
-
-func (hs *clientHandshakeState) serverResumedSession() bool {
-	// If the server responded with the same sessionId then it means the
-	// sessionTicket is being used to resume a TLS session.
-	return hs.session != nil && hs.hello.sessionId != nil &&
-		bytes.Equal(hs.serverHello.sessionId, hs.hello.sessionId)
-}
-
-func (hs *clientHandshakeState) processServerHello() (bool, error) {
-	c := hs.c
-
-	if hs.serverHello.compressionMethod != compressionNone {
-		c.sendAlert(alertUnexpectedMessage)
-		return false, errors.New("tls: server selected unsupported compression format")
-	}
-
-	clientDidNPN := hs.hello.nextProtoNeg
-	clientDidALPN := len(hs.hello.alpnProtocols) > 0
-	serverHasNPN := hs.serverHello.nextProtoNeg
-	serverHasALPN := len(hs.serverHello.alpnProtocol) > 0
-
-	if !clientDidNPN && serverHasNPN {
-		c.sendAlert(alertHandshakeFailure)
-		return false, errors.New("server advertised unrequested NPN extension")
-	}
-
-	if !clientDidALPN && serverHasALPN {
-		c.sendAlert(alertHandshakeFailure)
-		return false, errors.New("server advertised unrequested ALPN extension")
-	}
-
-	if serverHasNPN && serverHasALPN {
-		c.sendAlert(alertHandshakeFailure)
-		return false, errors.New("server advertised both NPN and ALPN extensions")
-	}
-
-	if serverHasALPN {
-		c.clientProtocol = hs.serverHello.alpnProtocol
-		c.clientProtocolFallback = false
-	}
-	c.scts = hs.serverHello.scts
-
-	if hs.serverResumedSession() {
-		// Restore masterSecret and peerCerts from previous state
-		hs.masterSecret = hs.session.masterSecret
-		c.peerCertificates = hs.session.serverCertificates
-		c.verifiedChains = hs.session.verifiedChains
-		return true, nil
-	}
-	return false, nil
-}
-
-func (hs *clientHandshakeState) readFinished(out []byte) error {
-	c := hs.c
-
-	c.readRecord(recordTypeChangeCipherSpec)
-	if err := c.in.error(); err != nil {
-		return err
-	}
-
-	msg, err := c.readHandshake()
-	if err != nil {
-		return err
-	}
-	serverFinished, ok := msg.(*finishedMsg)
-	if !ok {
-		c.sendAlert(alertUnexpectedMessage)
-		return unexpectedMessageError(serverFinished, msg)
-	}
-
-	verify := hs.finishedHash.serverSum(hs.masterSecret)
-	if len(verify) != len(serverFinished.verifyData) ||
-		subtle.ConstantTimeCompare(verify, serverFinished.verifyData) != 1 {
-		c.sendAlert(alertHandshakeFailure)
-		return errors.New("tls: server's Finished message was incorrect")
-	}
-	hs.finishedHash.Write(serverFinished.marshal())
-	copy(out, verify)
-	return nil
-}
-
-func (hs *clientHandshakeState) readSessionTicket() error {
-	if !hs.serverHello.ticketSupported {
-		return nil
-	}
-
-	c := hs.c
-	msg, err := c.readHandshake()
-	if err != nil {
-		return err
-	}
-	sessionTicketMsg, ok := msg.(*newSessionTicketMsg)
-	if !ok {
-		c.sendAlert(alertUnexpectedMessage)
-		return unexpectedMessageError(sessionTicketMsg, msg)
-	}
-	hs.finishedHash.Write(sessionTicketMsg.marshal())
-
-	hs.session = &ClientSessionState{
-		sessionTicket:      sessionTicketMsg.ticket,
-		vers:               c.vers,
-		cipherSuite:        hs.suite.id,
-		masterSecret:       hs.masterSecret,
-		serverCertificates: c.peerCertificates,
-		verifiedChains:     c.verifiedChains,
-	}
-
-	return nil
-}
-
-func (hs *clientHandshakeState) sendFinished(out []byte) error {
-	c := hs.c
-
-	c.writeRecord(recordTypeChangeCipherSpec, []byte{1})
-	if hs.serverHello.nextProtoNeg {
-		nextProto := new(nextProtoMsg)
-		proto, fallback := mutualProtocol(c.config.NextProtos, hs.serverHello.nextProtos)
-		nextProto.proto = proto
-		c.clientProtocol = proto
-		c.clientProtocolFallback = fallback
-
-		hs.finishedHash.Write(nextProto.marshal())
-		c.writeRecord(recordTypeHandshake, nextProto.marshal())
-	}
-
-	finished := new(finishedMsg)
-	finished.verifyData = hs.finishedHash.clientSum(hs.masterSecret)
-	hs.finishedHash.Write(finished.marshal())
-	c.writeRecord(recordTypeHandshake, finished.marshal())
-	copy(out, finished.verifyData)
-	return nil
-}
-
-// clientSessionCacheKey returns a key used to cache sessionTickets that could
-// be used to resume previously negotiated TLS sessions with a server.
-func clientSessionCacheKey(serverAddr net.Addr, config *Config) string {
-	if len(config.ServerName) > 0 {
-		return config.ServerName
-	}
-	return serverAddr.String()
-}
-
-// mutualProtocol finds the mutual Next Protocol Negotiation or ALPN protocol
-// given list of possible protocols and a list of the preference order. The
-// first list must not be empty. It returns the resulting protocol and flag
-// indicating if the fallback case was reached.
-func mutualProtocol(protos, preferenceProtos []string) (string, bool) {
-	for _, s := range preferenceProtos {
-		for _, c := range protos {
-			if s == c {
-				return s, false
-			}
-		}
-	}
-
-	return protos[0], true
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/handshake_client_test.go b/third_party/gofrontend/libgo/go/crypto/tls/handshake_client_test.go
deleted file mode 100644
index 664fe8d..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/handshake_client_test.go
+++ /dev/null
@@ -1,602 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"bytes"
-	"crypto/ecdsa"
-	"crypto/rsa"
-	"crypto/x509"
-	"encoding/base64"
-	"encoding/binary"
-	"encoding/pem"
-	"fmt"
-	"io"
-	"net"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strconv"
-	"testing"
-	"time"
-)
-
-// Note: see comment in handshake_test.go for details of how the reference
-// tests work.
-
-// blockingSource is an io.Reader that blocks a Read call until it's closed.
-type blockingSource chan bool
-
-func (b blockingSource) Read([]byte) (n int, err error) {
-	<-b
-	return 0, io.EOF
-}
-
-// clientTest represents a test of the TLS client handshake against a reference
-// implementation.
-type clientTest struct {
-	// name is a freeform string identifying the test and the file in which
-	// the expected results will be stored.
-	name string
-	// command, if not empty, contains a series of arguments for the
-	// command to run for the reference server.
-	command []string
-	// config, if not nil, contains a custom Config to use for this test.
-	config *Config
-	// cert, if not empty, contains a DER-encoded certificate for the
-	// reference server.
-	cert []byte
-	// key, if not nil, contains either a *rsa.PrivateKey or
-	// *ecdsa.PrivateKey which is the private key for the reference server.
-	key interface{}
-	// extensions, if not nil, contains a list of extension data to be returned
-	// from the ServerHello. The data should be in standard TLS format with
-	// a 2-byte uint16 type, 2-byte data length, followed by the extension data.
-	extensions [][]byte
-	// validate, if not nil, is a function that will be called with the
-	// ConnectionState of the resulting connection. It returns a non-nil
-	// error if the ConnectionState is unacceptable.
-	validate func(ConnectionState) error
-}
-
-var defaultServerCommand = []string{"openssl", "s_server"}
-
-// connFromCommand starts the reference server process, connects to it and
-// returns a recordingConn for the connection. The stdin return value is a
-// blockingSource for the stdin of the child process. It must be closed before
-// Waiting for child.
-func (test *clientTest) connFromCommand() (conn *recordingConn, child *exec.Cmd, stdin blockingSource, err error) {
-	cert := testRSACertificate
-	if len(test.cert) > 0 {
-		cert = test.cert
-	}
-	certPath := tempFile(string(cert))
-	defer os.Remove(certPath)
-
-	var key interface{} = testRSAPrivateKey
-	if test.key != nil {
-		key = test.key
-	}
-	var pemType string
-	var derBytes []byte
-	switch key := key.(type) {
-	case *rsa.PrivateKey:
-		pemType = "RSA"
-		derBytes = x509.MarshalPKCS1PrivateKey(key)
-	case *ecdsa.PrivateKey:
-		pemType = "EC"
-		var err error
-		derBytes, err = x509.MarshalECPrivateKey(key)
-		if err != nil {
-			panic(err)
-		}
-	default:
-		panic("unknown key type")
-	}
-
-	var pemOut bytes.Buffer
-	pem.Encode(&pemOut, &pem.Block{Type: pemType + " PRIVATE KEY", Bytes: derBytes})
-
-	keyPath := tempFile(string(pemOut.Bytes()))
-	defer os.Remove(keyPath)
-
-	var command []string
-	if len(test.command) > 0 {
-		command = append(command, test.command...)
-	} else {
-		command = append(command, defaultServerCommand...)
-	}
-	command = append(command, "-cert", certPath, "-certform", "DER", "-key", keyPath)
-	// serverPort contains the port that OpenSSL will listen on. OpenSSL
-	// can't take "0" as an argument here so we have to pick a number and
-	// hope that it's not in use on the machine. Since this only occurs
-	// when -update is given and thus when there's a human watching the
-	// test, this isn't too bad.
-	const serverPort = 24323
-	command = append(command, "-accept", strconv.Itoa(serverPort))
-
-	if len(test.extensions) > 0 {
-		var serverInfo bytes.Buffer
-		for _, ext := range test.extensions {
-			pem.Encode(&serverInfo, &pem.Block{
-				Type:  fmt.Sprintf("SERVERINFO FOR EXTENSION %d", binary.BigEndian.Uint16(ext)),
-				Bytes: ext,
-			})
-		}
-		serverInfoPath := tempFile(serverInfo.String())
-		defer os.Remove(serverInfoPath)
-		command = append(command, "-serverinfo", serverInfoPath)
-	}
-
-	cmd := exec.Command(command[0], command[1:]...)
-	stdin = blockingSource(make(chan bool))
-	cmd.Stdin = stdin
-	var out bytes.Buffer
-	cmd.Stdout = &out
-	cmd.Stderr = &out
-	if err := cmd.Start(); err != nil {
-		return nil, nil, nil, err
-	}
-
-	// OpenSSL does print an "ACCEPT" banner, but it does so *before*
-	// opening the listening socket, so we can't use that to wait until it
-	// has started listening. Thus we are forced to poll until we get a
-	// connection.
-	var tcpConn net.Conn
-	for i := uint(0); i < 5; i++ {
-		tcpConn, err = net.DialTCP("tcp", nil, &net.TCPAddr{
-			IP:   net.IPv4(127, 0, 0, 1),
-			Port: serverPort,
-		})
-		if err == nil {
-			break
-		}
-		time.Sleep((1 << i) * 5 * time.Millisecond)
-	}
-	if err != nil {
-		close(stdin)
-		out.WriteTo(os.Stdout)
-		cmd.Process.Kill()
-		return nil, nil, nil, cmd.Wait()
-	}
-
-	record := &recordingConn{
-		Conn: tcpConn,
-	}
-
-	return record, cmd, stdin, nil
-}
-
-func (test *clientTest) dataPath() string {
-	return filepath.Join("testdata", "Client-"+test.name)
-}
-
-func (test *clientTest) loadData() (flows [][]byte, err error) {
-	in, err := os.Open(test.dataPath())
-	if err != nil {
-		return nil, err
-	}
-	defer in.Close()
-	return parseTestData(in)
-}
-
-func (test *clientTest) run(t *testing.T, write bool) {
-	var clientConn, serverConn net.Conn
-	var recordingConn *recordingConn
-	var childProcess *exec.Cmd
-	var stdin blockingSource
-
-	if write {
-		var err error
-		recordingConn, childProcess, stdin, err = test.connFromCommand()
-		if err != nil {
-			t.Fatalf("Failed to start subcommand: %s", err)
-		}
-		clientConn = recordingConn
-	} else {
-		clientConn, serverConn = net.Pipe()
-	}
-
-	config := test.config
-	if config == nil {
-		config = testConfig
-	}
-	client := Client(clientConn, config)
-
-	doneChan := make(chan bool)
-	go func() {
-		if _, err := client.Write([]byte("hello\n")); err != nil {
-			t.Errorf("Client.Write failed: %s", err)
-		}
-		if test.validate != nil {
-			if err := test.validate(client.ConnectionState()); err != nil {
-				t.Errorf("validate callback returned error: %s", err)
-			}
-		}
-		client.Close()
-		clientConn.Close()
-		doneChan <- true
-	}()
-
-	if !write {
-		flows, err := test.loadData()
-		if err != nil {
-			t.Fatalf("%s: failed to load data from %s: %v", test.name, test.dataPath(), err)
-		}
-		for i, b := range flows {
-			if i%2 == 1 {
-				serverConn.Write(b)
-				continue
-			}
-			bb := make([]byte, len(b))
-			_, err := io.ReadFull(serverConn, bb)
-			if err != nil {
-				t.Fatalf("%s #%d: %s", test.name, i, err)
-			}
-			if !bytes.Equal(b, bb) {
-				t.Fatalf("%s #%d: mismatch on read: got:%x want:%x", test.name, i, bb, b)
-			}
-		}
-		serverConn.Close()
-	}
-
-	<-doneChan
-
-	if write {
-		path := test.dataPath()
-		out, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
-		if err != nil {
-			t.Fatalf("Failed to create output file: %s", err)
-		}
-		defer out.Close()
-		recordingConn.Close()
-		close(stdin)
-		childProcess.Process.Kill()
-		childProcess.Wait()
-		if len(recordingConn.flows) < 3 {
-			childProcess.Stdout.(*bytes.Buffer).WriteTo(os.Stdout)
-			t.Fatalf("Client connection didn't work")
-		}
-		recordingConn.WriteTo(out)
-		fmt.Printf("Wrote %s\n", path)
-	}
-}
-
-func runClientTestForVersion(t *testing.T, template *clientTest, prefix, option string) {
-	test := *template
-	test.name = prefix + test.name
-	if len(test.command) == 0 {
-		test.command = defaultClientCommand
-	}
-	test.command = append([]string(nil), test.command...)
-	test.command = append(test.command, option)
-	test.run(t, *update)
-}
-
-func runClientTestTLS10(t *testing.T, template *clientTest) {
-	runClientTestForVersion(t, template, "TLSv10-", "-tls1")
-}
-
-func runClientTestTLS11(t *testing.T, template *clientTest) {
-	runClientTestForVersion(t, template, "TLSv11-", "-tls1_1")
-}
-
-func runClientTestTLS12(t *testing.T, template *clientTest) {
-	runClientTestForVersion(t, template, "TLSv12-", "-tls1_2")
-}
-
-func TestHandshakeClientRSARC4(t *testing.T) {
-	test := &clientTest{
-		name:    "RSA-RC4",
-		command: []string{"openssl", "s_server", "-cipher", "RC4-SHA"},
-	}
-	runClientTestTLS10(t, test)
-	runClientTestTLS11(t, test)
-	runClientTestTLS12(t, test)
-}
-
-func TestHandshakeClientECDHERSAAES(t *testing.T) {
-	test := &clientTest{
-		name:    "ECDHE-RSA-AES",
-		command: []string{"openssl", "s_server", "-cipher", "ECDHE-RSA-AES128-SHA"},
-	}
-	runClientTestTLS10(t, test)
-	runClientTestTLS11(t, test)
-	runClientTestTLS12(t, test)
-}
-
-func TestHandshakeClientECDHEECDSAAES(t *testing.T) {
-	test := &clientTest{
-		name:    "ECDHE-ECDSA-AES",
-		command: []string{"openssl", "s_server", "-cipher", "ECDHE-ECDSA-AES128-SHA"},
-		cert:    testECDSACertificate,
-		key:     testECDSAPrivateKey,
-	}
-	runClientTestTLS10(t, test)
-	runClientTestTLS11(t, test)
-	runClientTestTLS12(t, test)
-}
-
-func TestHandshakeClientECDHEECDSAAESGCM(t *testing.T) {
-	test := &clientTest{
-		name:    "ECDHE-ECDSA-AES-GCM",
-		command: []string{"openssl", "s_server", "-cipher", "ECDHE-ECDSA-AES128-GCM-SHA256"},
-		cert:    testECDSACertificate,
-		key:     testECDSAPrivateKey,
-	}
-	runClientTestTLS12(t, test)
-}
-
-func TestHandshakeClientAES256GCMSHA384(t *testing.T) {
-	test := &clientTest{
-		name:    "ECDHE-ECDSA-AES256-GCM-SHA384",
-		command: []string{"openssl", "s_server", "-cipher", "ECDHE-ECDSA-AES256-GCM-SHA384"},
-		cert:    testECDSACertificate,
-		key:     testECDSAPrivateKey,
-	}
-	runClientTestTLS12(t, test)
-}
-
-func TestHandshakeClientCertRSA(t *testing.T) {
-	config := *testConfig
-	cert, _ := X509KeyPair([]byte(clientCertificatePEM), []byte(clientKeyPEM))
-	config.Certificates = []Certificate{cert}
-
-	test := &clientTest{
-		name:    "ClientCert-RSA-RSA",
-		command: []string{"openssl", "s_server", "-cipher", "RC4-SHA", "-verify", "1"},
-		config:  &config,
-	}
-
-	runClientTestTLS10(t, test)
-	runClientTestTLS12(t, test)
-
-	test = &clientTest{
-		name:    "ClientCert-RSA-ECDSA",
-		command: []string{"openssl", "s_server", "-cipher", "ECDHE-ECDSA-AES128-SHA", "-verify", "1"},
-		config:  &config,
-		cert:    testECDSACertificate,
-		key:     testECDSAPrivateKey,
-	}
-
-	runClientTestTLS10(t, test)
-	runClientTestTLS12(t, test)
-
-	test = &clientTest{
-		name:    "ClientCert-RSA-AES256-GCM-SHA384",
-		command: []string{"openssl", "s_server", "-cipher", "ECDHE-RSA-AES256-GCM-SHA384", "-verify", "1"},
-		config:  &config,
-		cert:    testRSACertificate,
-		key:     testRSAPrivateKey,
-	}
-
-	runClientTestTLS12(t, test)
-}
-
-func TestHandshakeClientCertECDSA(t *testing.T) {
-	config := *testConfig
-	cert, _ := X509KeyPair([]byte(clientECDSACertificatePEM), []byte(clientECDSAKeyPEM))
-	config.Certificates = []Certificate{cert}
-
-	test := &clientTest{
-		name:    "ClientCert-ECDSA-RSA",
-		command: []string{"openssl", "s_server", "-cipher", "RC4-SHA", "-verify", "1"},
-		config:  &config,
-	}
-
-	runClientTestTLS10(t, test)
-	runClientTestTLS12(t, test)
-
-	test = &clientTest{
-		name:    "ClientCert-ECDSA-ECDSA",
-		command: []string{"openssl", "s_server", "-cipher", "ECDHE-ECDSA-AES128-SHA", "-verify", "1"},
-		config:  &config,
-		cert:    testECDSACertificate,
-		key:     testECDSAPrivateKey,
-	}
-
-	runClientTestTLS10(t, test)
-	runClientTestTLS12(t, test)
-}
-
-func TestClientResumption(t *testing.T) {
-	serverConfig := &Config{
-		CipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA},
-		Certificates: testConfig.Certificates,
-	}
-
-	issuer, err := x509.ParseCertificate(testRSACertificateIssuer)
-	if err != nil {
-		panic(err)
-	}
-
-	rootCAs := x509.NewCertPool()
-	rootCAs.AddCert(issuer)
-
-	clientConfig := &Config{
-		CipherSuites:       []uint16{TLS_RSA_WITH_RC4_128_SHA},
-		ClientSessionCache: NewLRUClientSessionCache(32),
-		RootCAs:            rootCAs,
-		ServerName:         "example.golang",
-	}
-
-	testResumeState := func(test string, didResume bool) {
-		_, hs, err := testHandshake(clientConfig, serverConfig)
-		if err != nil {
-			t.Fatalf("%s: handshake failed: %s", test, err)
-		}
-		if hs.DidResume != didResume {
-			t.Fatalf("%s resumed: %v, expected: %v", test, hs.DidResume, didResume)
-		}
-		if didResume && (hs.PeerCertificates == nil || hs.VerifiedChains == nil) {
-			t.Fatalf("expected non-nil certificates after resumption. Got peerCertificates: %#v, verifedCertificates: %#v", hs.PeerCertificates, hs.VerifiedChains)
-		}
-	}
-
-	getTicket := func() []byte {
-		return clientConfig.ClientSessionCache.(*lruSessionCache).q.Front().Value.(*lruSessionCacheEntry).state.sessionTicket
-	}
-	randomKey := func() [32]byte {
-		var k [32]byte
-		if _, err := io.ReadFull(serverConfig.rand(), k[:]); err != nil {
-			t.Fatalf("Failed to read new SessionTicketKey: %s", err)
-		}
-		return k
-	}
-
-	testResumeState("Handshake", false)
-	ticket := getTicket()
-	testResumeState("Resume", true)
-	if !bytes.Equal(ticket, getTicket()) {
-		t.Fatal("first ticket doesn't match ticket after resumption")
-	}
-
-	key2 := randomKey()
-	serverConfig.SetSessionTicketKeys([][32]byte{key2})
-
-	testResumeState("InvalidSessionTicketKey", false)
-	testResumeState("ResumeAfterInvalidSessionTicketKey", true)
-
-	serverConfig.SetSessionTicketKeys([][32]byte{randomKey(), key2})
-	ticket = getTicket()
-	testResumeState("KeyChange", true)
-	if bytes.Equal(ticket, getTicket()) {
-		t.Fatal("new ticket wasn't included while resuming")
-	}
-	testResumeState("KeyChangeFinish", true)
-
-	clientConfig.CipherSuites = []uint16{TLS_ECDHE_RSA_WITH_RC4_128_SHA}
-	testResumeState("DifferentCipherSuite", false)
-	testResumeState("DifferentCipherSuiteRecovers", true)
-
-	clientConfig.ClientSessionCache = nil
-	testResumeState("WithoutSessionCache", false)
-}
-
-func TestLRUClientSessionCache(t *testing.T) {
-	// Initialize cache of capacity 4.
-	cache := NewLRUClientSessionCache(4)
-	cs := make([]ClientSessionState, 6)
-	keys := []string{"0", "1", "2", "3", "4", "5", "6"}
-
-	// Add 4 entries to the cache and look them up.
-	for i := 0; i < 4; i++ {
-		cache.Put(keys[i], &cs[i])
-	}
-	for i := 0; i < 4; i++ {
-		if s, ok := cache.Get(keys[i]); !ok || s != &cs[i] {
-			t.Fatalf("session cache failed lookup for added key: %s", keys[i])
-		}
-	}
-
-	// Add 2 more entries to the cache. First 2 should be evicted.
-	for i := 4; i < 6; i++ {
-		cache.Put(keys[i], &cs[i])
-	}
-	for i := 0; i < 2; i++ {
-		if s, ok := cache.Get(keys[i]); ok || s != nil {
-			t.Fatalf("session cache should have evicted key: %s", keys[i])
-		}
-	}
-
-	// Touch entry 2. LRU should evict 3 next.
-	cache.Get(keys[2])
-	cache.Put(keys[0], &cs[0])
-	if s, ok := cache.Get(keys[3]); ok || s != nil {
-		t.Fatalf("session cache should have evicted key 3")
-	}
-
-	// Update entry 0 in place.
-	cache.Put(keys[0], &cs[3])
-	if s, ok := cache.Get(keys[0]); !ok || s != &cs[3] {
-		t.Fatalf("session cache failed update for key 0")
-	}
-
-	// Adding a nil entry is valid.
-	cache.Put(keys[0], nil)
-	if s, ok := cache.Get(keys[0]); !ok || s != nil {
-		t.Fatalf("failed to add nil entry to cache")
-	}
-}
-
-func TestHandshakeClientALPNMatch(t *testing.T) {
-	config := *testConfig
-	config.NextProtos = []string{"proto2", "proto1"}
-
-	test := &clientTest{
-		name: "ALPN",
-		// Note that this needs OpenSSL 1.0.2 because that is the first
-		// version that supports the -alpn flag.
-		command: []string{"openssl", "s_server", "-alpn", "proto1,proto2"},
-		config:  &config,
-		validate: func(state ConnectionState) error {
-			// The server's preferences should override the client.
-			if state.NegotiatedProtocol != "proto1" {
-				return fmt.Errorf("Got protocol %q, wanted proto1", state.NegotiatedProtocol)
-			}
-			return nil
-		},
-	}
-	runClientTestTLS12(t, test)
-}
-
-func TestHandshakeClientALPNNoMatch(t *testing.T) {
-	config := *testConfig
-	config.NextProtos = []string{"proto3"}
-
-	test := &clientTest{
-		name: "ALPN-NoMatch",
-		// Note that this needs OpenSSL 1.0.2 because that is the first
-		// version that supports the -alpn flag.
-		command: []string{"openssl", "s_server", "-alpn", "proto1,proto2"},
-		config:  &config,
-		validate: func(state ConnectionState) error {
-			// There's no overlap so OpenSSL will not select a protocol.
-			if state.NegotiatedProtocol != "" {
-				return fmt.Errorf("Got protocol %q, wanted ''", state.NegotiatedProtocol)
-			}
-			return nil
-		},
-	}
-	runClientTestTLS12(t, test)
-}
-
-// sctsBase64 contains data from `openssl s_client -serverinfo 18 -connect ritter.vg:443`
-const sctsBase64 = "ABIBaQFnAHUApLkJkLQYWBSHuxOizGdwCjw1mAT5G9+443fNDsgN3BAAAAFHl5nuFgAABAMARjBEAiAcS4JdlW5nW9sElUv2zvQyPoZ6ejKrGGB03gjaBZFMLwIgc1Qbbn+hsH0RvObzhS+XZhr3iuQQJY8S9G85D9KeGPAAdgBo9pj4H2SCvjqM7rkoHUz8cVFdZ5PURNEKZ6y7T0/7xAAAAUeX4bVwAAAEAwBHMEUCIDIhFDgG2HIuADBkGuLobU5a4dlCHoJLliWJ1SYT05z6AiEAjxIoZFFPRNWMGGIjskOTMwXzQ1Wh2e7NxXE1kd1J0QsAdgDuS723dc5guuFCaR+r4Z5mow9+X7By2IMAxHuJeqj9ywAAAUhcZIqHAAAEAwBHMEUCICmJ1rBT09LpkbzxtUC+Hi7nXLR0J+2PmwLp+sJMuqK+AiEAr0NkUnEVKVhAkccIFpYDqHOlZaBsuEhWWrYpg2RtKp0="
-
-func TestHandshakClientSCTs(t *testing.T) {
-	config := *testConfig
-
-	scts, err := base64.StdEncoding.DecodeString(sctsBase64)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	test := &clientTest{
-		name: "SCT",
-		// Note that this needs OpenSSL 1.0.2 because that is the first
-		// version that supports the -serverinfo flag.
-		command:    []string{"openssl", "s_server"},
-		config:     &config,
-		extensions: [][]byte{scts},
-		validate: func(state ConnectionState) error {
-			expectedSCTs := [][]byte{
-				scts[8:125],
-				scts[127:245],
-				scts[247:],
-			}
-			if n := len(state.SignedCertificateTimestamps); n != len(expectedSCTs) {
-				return fmt.Errorf("Got %d scts, wanted %d", n, len(expectedSCTs))
-			}
-			for i, expected := range expectedSCTs {
-				if sct := state.SignedCertificateTimestamps[i]; !bytes.Equal(sct, expected) {
-					return fmt.Errorf("SCT #%d contained %x, expected %x", i, sct, expected)
-				}
-			}
-			return nil
-		},
-	}
-	runClientTestTLS12(t, test)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/handshake_messages.go b/third_party/gofrontend/libgo/go/crypto/tls/handshake_messages.go
deleted file mode 100644
index 799a776..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/handshake_messages.go
+++ /dev/null
@@ -1,1524 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import "bytes"
-
-type clientHelloMsg struct {
-	raw                 []byte
-	vers                uint16
-	random              []byte
-	sessionId           []byte
-	cipherSuites        []uint16
-	compressionMethods  []uint8
-	nextProtoNeg        bool
-	serverName          string
-	ocspStapling        bool
-	scts                bool
-	supportedCurves     []CurveID
-	supportedPoints     []uint8
-	ticketSupported     bool
-	sessionTicket       []uint8
-	signatureAndHashes  []signatureAndHash
-	secureRenegotiation bool
-	alpnProtocols       []string
-}
-
-func (m *clientHelloMsg) equal(i interface{}) bool {
-	m1, ok := i.(*clientHelloMsg)
-	if !ok {
-		return false
-	}
-
-	return bytes.Equal(m.raw, m1.raw) &&
-		m.vers == m1.vers &&
-		bytes.Equal(m.random, m1.random) &&
-		bytes.Equal(m.sessionId, m1.sessionId) &&
-		eqUint16s(m.cipherSuites, m1.cipherSuites) &&
-		bytes.Equal(m.compressionMethods, m1.compressionMethods) &&
-		m.nextProtoNeg == m1.nextProtoNeg &&
-		m.serverName == m1.serverName &&
-		m.ocspStapling == m1.ocspStapling &&
-		m.scts == m1.scts &&
-		eqCurveIDs(m.supportedCurves, m1.supportedCurves) &&
-		bytes.Equal(m.supportedPoints, m1.supportedPoints) &&
-		m.ticketSupported == m1.ticketSupported &&
-		bytes.Equal(m.sessionTicket, m1.sessionTicket) &&
-		eqSignatureAndHashes(m.signatureAndHashes, m1.signatureAndHashes) &&
-		m.secureRenegotiation == m1.secureRenegotiation &&
-		eqStrings(m.alpnProtocols, m1.alpnProtocols)
-}
-
-func (m *clientHelloMsg) marshal() []byte {
-	if m.raw != nil {
-		return m.raw
-	}
-
-	length := 2 + 32 + 1 + len(m.sessionId) + 2 + len(m.cipherSuites)*2 + 1 + len(m.compressionMethods)
-	numExtensions := 0
-	extensionsLength := 0
-	if m.nextProtoNeg {
-		numExtensions++
-	}
-	if m.ocspStapling {
-		extensionsLength += 1 + 2 + 2
-		numExtensions++
-	}
-	if len(m.serverName) > 0 {
-		extensionsLength += 5 + len(m.serverName)
-		numExtensions++
-	}
-	if len(m.supportedCurves) > 0 {
-		extensionsLength += 2 + 2*len(m.supportedCurves)
-		numExtensions++
-	}
-	if len(m.supportedPoints) > 0 {
-		extensionsLength += 1 + len(m.supportedPoints)
-		numExtensions++
-	}
-	if m.ticketSupported {
-		extensionsLength += len(m.sessionTicket)
-		numExtensions++
-	}
-	if len(m.signatureAndHashes) > 0 {
-		extensionsLength += 2 + 2*len(m.signatureAndHashes)
-		numExtensions++
-	}
-	if m.secureRenegotiation {
-		extensionsLength += 1
-		numExtensions++
-	}
-	if len(m.alpnProtocols) > 0 {
-		extensionsLength += 2
-		for _, s := range m.alpnProtocols {
-			if l := len(s); l == 0 || l > 255 {
-				panic("invalid ALPN protocol")
-			}
-			extensionsLength++
-			extensionsLength += len(s)
-		}
-		numExtensions++
-	}
-	if m.scts {
-		numExtensions++
-	}
-	if numExtensions > 0 {
-		extensionsLength += 4 * numExtensions
-		length += 2 + extensionsLength
-	}
-
-	x := make([]byte, 4+length)
-	x[0] = typeClientHello
-	x[1] = uint8(length >> 16)
-	x[2] = uint8(length >> 8)
-	x[3] = uint8(length)
-	x[4] = uint8(m.vers >> 8)
-	x[5] = uint8(m.vers)
-	copy(x[6:38], m.random)
-	x[38] = uint8(len(m.sessionId))
-	copy(x[39:39+len(m.sessionId)], m.sessionId)
-	y := x[39+len(m.sessionId):]
-	y[0] = uint8(len(m.cipherSuites) >> 7)
-	y[1] = uint8(len(m.cipherSuites) << 1)
-	for i, suite := range m.cipherSuites {
-		y[2+i*2] = uint8(suite >> 8)
-		y[3+i*2] = uint8(suite)
-	}
-	z := y[2+len(m.cipherSuites)*2:]
-	z[0] = uint8(len(m.compressionMethods))
-	copy(z[1:], m.compressionMethods)
-
-	z = z[1+len(m.compressionMethods):]
-	if numExtensions > 0 {
-		z[0] = byte(extensionsLength >> 8)
-		z[1] = byte(extensionsLength)
-		z = z[2:]
-	}
-	if m.nextProtoNeg {
-		z[0] = byte(extensionNextProtoNeg >> 8)
-		z[1] = byte(extensionNextProtoNeg & 0xff)
-		// The length is always 0
-		z = z[4:]
-	}
-	if len(m.serverName) > 0 {
-		z[0] = byte(extensionServerName >> 8)
-		z[1] = byte(extensionServerName & 0xff)
-		l := len(m.serverName) + 5
-		z[2] = byte(l >> 8)
-		z[3] = byte(l)
-		z = z[4:]
-
-		// RFC 3546, section 3.1
-		//
-		// struct {
-		//     NameType name_type;
-		//     select (name_type) {
-		//         case host_name: HostName;
-		//     } name;
-		// } ServerName;
-		//
-		// enum {
-		//     host_name(0), (255)
-		// } NameType;
-		//
-		// opaque HostName<1..2^16-1>;
-		//
-		// struct {
-		//     ServerName server_name_list<1..2^16-1>
-		// } ServerNameList;
-
-		z[0] = byte((len(m.serverName) + 3) >> 8)
-		z[1] = byte(len(m.serverName) + 3)
-		z[3] = byte(len(m.serverName) >> 8)
-		z[4] = byte(len(m.serverName))
-		copy(z[5:], []byte(m.serverName))
-		z = z[l:]
-	}
-	if m.ocspStapling {
-		// RFC 4366, section 3.6
-		z[0] = byte(extensionStatusRequest >> 8)
-		z[1] = byte(extensionStatusRequest)
-		z[2] = 0
-		z[3] = 5
-		z[4] = 1 // OCSP type
-		// Two zero valued uint16s for the two lengths.
-		z = z[9:]
-	}
-	if len(m.supportedCurves) > 0 {
-		// http://tools.ietf.org/html/rfc4492#section-5.5.1
-		z[0] = byte(extensionSupportedCurves >> 8)
-		z[1] = byte(extensionSupportedCurves)
-		l := 2 + 2*len(m.supportedCurves)
-		z[2] = byte(l >> 8)
-		z[3] = byte(l)
-		l -= 2
-		z[4] = byte(l >> 8)
-		z[5] = byte(l)
-		z = z[6:]
-		for _, curve := range m.supportedCurves {
-			z[0] = byte(curve >> 8)
-			z[1] = byte(curve)
-			z = z[2:]
-		}
-	}
-	if len(m.supportedPoints) > 0 {
-		// http://tools.ietf.org/html/rfc4492#section-5.5.2
-		z[0] = byte(extensionSupportedPoints >> 8)
-		z[1] = byte(extensionSupportedPoints)
-		l := 1 + len(m.supportedPoints)
-		z[2] = byte(l >> 8)
-		z[3] = byte(l)
-		l--
-		z[4] = byte(l)
-		z = z[5:]
-		for _, pointFormat := range m.supportedPoints {
-			z[0] = byte(pointFormat)
-			z = z[1:]
-		}
-	}
-	if m.ticketSupported {
-		// http://tools.ietf.org/html/rfc5077#section-3.2
-		z[0] = byte(extensionSessionTicket >> 8)
-		z[1] = byte(extensionSessionTicket)
-		l := len(m.sessionTicket)
-		z[2] = byte(l >> 8)
-		z[3] = byte(l)
-		z = z[4:]
-		copy(z, m.sessionTicket)
-		z = z[len(m.sessionTicket):]
-	}
-	if len(m.signatureAndHashes) > 0 {
-		// https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
-		z[0] = byte(extensionSignatureAlgorithms >> 8)
-		z[1] = byte(extensionSignatureAlgorithms)
-		l := 2 + 2*len(m.signatureAndHashes)
-		z[2] = byte(l >> 8)
-		z[3] = byte(l)
-		z = z[4:]
-
-		l -= 2
-		z[0] = byte(l >> 8)
-		z[1] = byte(l)
-		z = z[2:]
-		for _, sigAndHash := range m.signatureAndHashes {
-			z[0] = sigAndHash.hash
-			z[1] = sigAndHash.signature
-			z = z[2:]
-		}
-	}
-	if m.secureRenegotiation {
-		z[0] = byte(extensionRenegotiationInfo >> 8)
-		z[1] = byte(extensionRenegotiationInfo & 0xff)
-		z[2] = 0
-		z[3] = 1
-		z = z[5:]
-	}
-	if len(m.alpnProtocols) > 0 {
-		z[0] = byte(extensionALPN >> 8)
-		z[1] = byte(extensionALPN & 0xff)
-		lengths := z[2:]
-		z = z[6:]
-
-		stringsLength := 0
-		for _, s := range m.alpnProtocols {
-			l := len(s)
-			z[0] = byte(l)
-			copy(z[1:], s)
-			z = z[1+l:]
-			stringsLength += 1 + l
-		}
-
-		lengths[2] = byte(stringsLength >> 8)
-		lengths[3] = byte(stringsLength)
-		stringsLength += 2
-		lengths[0] = byte(stringsLength >> 8)
-		lengths[1] = byte(stringsLength)
-	}
-	if m.scts {
-		// https://tools.ietf.org/html/rfc6962#section-3.3.1
-		z[0] = byte(extensionSCT >> 8)
-		z[1] = byte(extensionSCT)
-		// zero uint16 for the zero-length extension_data
-		z = z[4:]
-	}
-
-	m.raw = x
-
-	return x
-}
-
-func (m *clientHelloMsg) unmarshal(data []byte) bool {
-	if len(data) < 42 {
-		return false
-	}
-	m.raw = data
-	m.vers = uint16(data[4])<<8 | uint16(data[5])
-	m.random = data[6:38]
-	sessionIdLen := int(data[38])
-	if sessionIdLen > 32 || len(data) < 39+sessionIdLen {
-		return false
-	}
-	m.sessionId = data[39 : 39+sessionIdLen]
-	data = data[39+sessionIdLen:]
-	if len(data) < 2 {
-		return false
-	}
-	// cipherSuiteLen is the number of bytes of cipher suite numbers. Since
-	// they are uint16s, the number must be even.
-	cipherSuiteLen := int(data[0])<<8 | int(data[1])
-	if cipherSuiteLen%2 == 1 || len(data) < 2+cipherSuiteLen {
-		return false
-	}
-	numCipherSuites := cipherSuiteLen / 2
-	m.cipherSuites = make([]uint16, numCipherSuites)
-	for i := 0; i < numCipherSuites; i++ {
-		m.cipherSuites[i] = uint16(data[2+2*i])<<8 | uint16(data[3+2*i])
-		if m.cipherSuites[i] == scsvRenegotiation {
-			m.secureRenegotiation = true
-		}
-	}
-	data = data[2+cipherSuiteLen:]
-	if len(data) < 1 {
-		return false
-	}
-	compressionMethodsLen := int(data[0])
-	if len(data) < 1+compressionMethodsLen {
-		return false
-	}
-	m.compressionMethods = data[1 : 1+compressionMethodsLen]
-
-	data = data[1+compressionMethodsLen:]
-
-	m.nextProtoNeg = false
-	m.serverName = ""
-	m.ocspStapling = false
-	m.ticketSupported = false
-	m.sessionTicket = nil
-	m.signatureAndHashes = nil
-	m.alpnProtocols = nil
-	m.scts = false
-
-	if len(data) == 0 {
-		// ClientHello is optionally followed by extension data
-		return true
-	}
-	if len(data) < 2 {
-		return false
-	}
-
-	extensionsLength := int(data[0])<<8 | int(data[1])
-	data = data[2:]
-	if extensionsLength != len(data) {
-		return false
-	}
-
-	for len(data) != 0 {
-		if len(data) < 4 {
-			return false
-		}
-		extension := uint16(data[0])<<8 | uint16(data[1])
-		length := int(data[2])<<8 | int(data[3])
-		data = data[4:]
-		if len(data) < length {
-			return false
-		}
-
-		switch extension {
-		case extensionServerName:
-			d := data[:length]
-			if len(d) < 2 {
-				return false
-			}
-			namesLen := int(d[0])<<8 | int(d[1])
-			d = d[2:]
-			if len(d) != namesLen {
-				return false
-			}
-			for len(d) > 0 {
-				if len(d) < 3 {
-					return false
-				}
-				nameType := d[0]
-				nameLen := int(d[1])<<8 | int(d[2])
-				d = d[3:]
-				if len(d) < nameLen {
-					return false
-				}
-				if nameType == 0 {
-					m.serverName = string(d[:nameLen])
-					break
-				}
-				d = d[nameLen:]
-			}
-		case extensionNextProtoNeg:
-			if length > 0 {
-				return false
-			}
-			m.nextProtoNeg = true
-		case extensionStatusRequest:
-			m.ocspStapling = length > 0 && data[0] == statusTypeOCSP
-		case extensionSupportedCurves:
-			// http://tools.ietf.org/html/rfc4492#section-5.5.1
-			if length < 2 {
-				return false
-			}
-			l := int(data[0])<<8 | int(data[1])
-			if l%2 == 1 || length != l+2 {
-				return false
-			}
-			numCurves := l / 2
-			m.supportedCurves = make([]CurveID, numCurves)
-			d := data[2:]
-			for i := 0; i < numCurves; i++ {
-				m.supportedCurves[i] = CurveID(d[0])<<8 | CurveID(d[1])
-				d = d[2:]
-			}
-		case extensionSupportedPoints:
-			// http://tools.ietf.org/html/rfc4492#section-5.5.2
-			if length < 1 {
-				return false
-			}
-			l := int(data[0])
-			if length != l+1 {
-				return false
-			}
-			m.supportedPoints = make([]uint8, l)
-			copy(m.supportedPoints, data[1:])
-		case extensionSessionTicket:
-			// http://tools.ietf.org/html/rfc5077#section-3.2
-			m.ticketSupported = true
-			m.sessionTicket = data[:length]
-		case extensionSignatureAlgorithms:
-			// https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
-			if length < 2 || length&1 != 0 {
-				return false
-			}
-			l := int(data[0])<<8 | int(data[1])
-			if l != length-2 {
-				return false
-			}
-			n := l / 2
-			d := data[2:]
-			m.signatureAndHashes = make([]signatureAndHash, n)
-			for i := range m.signatureAndHashes {
-				m.signatureAndHashes[i].hash = d[0]
-				m.signatureAndHashes[i].signature = d[1]
-				d = d[2:]
-			}
-		case extensionRenegotiationInfo:
-			if length != 1 || data[0] != 0 {
-				return false
-			}
-			m.secureRenegotiation = true
-		case extensionALPN:
-			if length < 2 {
-				return false
-			}
-			l := int(data[0])<<8 | int(data[1])
-			if l != length-2 {
-				return false
-			}
-			d := data[2:length]
-			for len(d) != 0 {
-				stringLen := int(d[0])
-				d = d[1:]
-				if stringLen == 0 || stringLen > len(d) {
-					return false
-				}
-				m.alpnProtocols = append(m.alpnProtocols, string(d[:stringLen]))
-				d = d[stringLen:]
-			}
-		case extensionSCT:
-			m.scts = true
-			if length != 0 {
-				return false
-			}
-		}
-		data = data[length:]
-	}
-
-	return true
-}
-
-type serverHelloMsg struct {
-	raw                 []byte
-	vers                uint16
-	random              []byte
-	sessionId           []byte
-	cipherSuite         uint16
-	compressionMethod   uint8
-	nextProtoNeg        bool
-	nextProtos          []string
-	ocspStapling        bool
-	scts                [][]byte
-	ticketSupported     bool
-	secureRenegotiation bool
-	alpnProtocol        string
-}
-
-func (m *serverHelloMsg) equal(i interface{}) bool {
-	m1, ok := i.(*serverHelloMsg)
-	if !ok {
-		return false
-	}
-
-	if len(m.scts) != len(m1.scts) {
-		return false
-	}
-	for i, sct := range m.scts {
-		if !bytes.Equal(sct, m1.scts[i]) {
-			return false
-		}
-	}
-
-	return bytes.Equal(m.raw, m1.raw) &&
-		m.vers == m1.vers &&
-		bytes.Equal(m.random, m1.random) &&
-		bytes.Equal(m.sessionId, m1.sessionId) &&
-		m.cipherSuite == m1.cipherSuite &&
-		m.compressionMethod == m1.compressionMethod &&
-		m.nextProtoNeg == m1.nextProtoNeg &&
-		eqStrings(m.nextProtos, m1.nextProtos) &&
-		m.ocspStapling == m1.ocspStapling &&
-		m.ticketSupported == m1.ticketSupported &&
-		m.secureRenegotiation == m1.secureRenegotiation &&
-		m.alpnProtocol == m1.alpnProtocol
-}
-
-func (m *serverHelloMsg) marshal() []byte {
-	if m.raw != nil {
-		return m.raw
-	}
-
-	length := 38 + len(m.sessionId)
-	numExtensions := 0
-	extensionsLength := 0
-
-	nextProtoLen := 0
-	if m.nextProtoNeg {
-		numExtensions++
-		for _, v := range m.nextProtos {
-			nextProtoLen += len(v)
-		}
-		nextProtoLen += len(m.nextProtos)
-		extensionsLength += nextProtoLen
-	}
-	if m.ocspStapling {
-		numExtensions++
-	}
-	if m.ticketSupported {
-		numExtensions++
-	}
-	if m.secureRenegotiation {
-		extensionsLength += 1
-		numExtensions++
-	}
-	if alpnLen := len(m.alpnProtocol); alpnLen > 0 {
-		if alpnLen >= 256 {
-			panic("invalid ALPN protocol")
-		}
-		extensionsLength += 2 + 1 + alpnLen
-		numExtensions++
-	}
-	sctLen := 0
-	if len(m.scts) > 0 {
-		for _, sct := range m.scts {
-			sctLen += len(sct) + 2
-		}
-		extensionsLength += 2 + sctLen
-		numExtensions++
-	}
-
-	if numExtensions > 0 {
-		extensionsLength += 4 * numExtensions
-		length += 2 + extensionsLength
-	}
-
-	x := make([]byte, 4+length)
-	x[0] = typeServerHello
-	x[1] = uint8(length >> 16)
-	x[2] = uint8(length >> 8)
-	x[3] = uint8(length)
-	x[4] = uint8(m.vers >> 8)
-	x[5] = uint8(m.vers)
-	copy(x[6:38], m.random)
-	x[38] = uint8(len(m.sessionId))
-	copy(x[39:39+len(m.sessionId)], m.sessionId)
-	z := x[39+len(m.sessionId):]
-	z[0] = uint8(m.cipherSuite >> 8)
-	z[1] = uint8(m.cipherSuite)
-	z[2] = uint8(m.compressionMethod)
-
-	z = z[3:]
-	if numExtensions > 0 {
-		z[0] = byte(extensionsLength >> 8)
-		z[1] = byte(extensionsLength)
-		z = z[2:]
-	}
-	if m.nextProtoNeg {
-		z[0] = byte(extensionNextProtoNeg >> 8)
-		z[1] = byte(extensionNextProtoNeg & 0xff)
-		z[2] = byte(nextProtoLen >> 8)
-		z[3] = byte(nextProtoLen)
-		z = z[4:]
-
-		for _, v := range m.nextProtos {
-			l := len(v)
-			if l > 255 {
-				l = 255
-			}
-			z[0] = byte(l)
-			copy(z[1:], []byte(v[0:l]))
-			z = z[1+l:]
-		}
-	}
-	if m.ocspStapling {
-		z[0] = byte(extensionStatusRequest >> 8)
-		z[1] = byte(extensionStatusRequest)
-		z = z[4:]
-	}
-	if m.ticketSupported {
-		z[0] = byte(extensionSessionTicket >> 8)
-		z[1] = byte(extensionSessionTicket)
-		z = z[4:]
-	}
-	if m.secureRenegotiation {
-		z[0] = byte(extensionRenegotiationInfo >> 8)
-		z[1] = byte(extensionRenegotiationInfo & 0xff)
-		z[2] = 0
-		z[3] = 1
-		z = z[5:]
-	}
-	if alpnLen := len(m.alpnProtocol); alpnLen > 0 {
-		z[0] = byte(extensionALPN >> 8)
-		z[1] = byte(extensionALPN & 0xff)
-		l := 2 + 1 + alpnLen
-		z[2] = byte(l >> 8)
-		z[3] = byte(l)
-		l -= 2
-		z[4] = byte(l >> 8)
-		z[5] = byte(l)
-		l -= 1
-		z[6] = byte(l)
-		copy(z[7:], []byte(m.alpnProtocol))
-		z = z[7+alpnLen:]
-	}
-	if sctLen > 0 {
-		z[0] = byte(extensionSCT >> 8)
-		z[1] = byte(extensionSCT)
-		l := sctLen + 2
-		z[2] = byte(l >> 8)
-		z[3] = byte(l)
-		z[4] = byte(sctLen >> 8)
-		z[5] = byte(sctLen)
-
-		z = z[6:]
-		for _, sct := range m.scts {
-			z[0] = byte(len(sct) >> 8)
-			z[1] = byte(len(sct))
-			copy(z[2:], sct)
-			z = z[len(sct)+2:]
-		}
-	}
-
-	m.raw = x
-
-	return x
-}
-
-func (m *serverHelloMsg) unmarshal(data []byte) bool {
-	if len(data) < 42 {
-		return false
-	}
-	m.raw = data
-	m.vers = uint16(data[4])<<8 | uint16(data[5])
-	m.random = data[6:38]
-	sessionIdLen := int(data[38])
-	if sessionIdLen > 32 || len(data) < 39+sessionIdLen {
-		return false
-	}
-	m.sessionId = data[39 : 39+sessionIdLen]
-	data = data[39+sessionIdLen:]
-	if len(data) < 3 {
-		return false
-	}
-	m.cipherSuite = uint16(data[0])<<8 | uint16(data[1])
-	m.compressionMethod = data[2]
-	data = data[3:]
-
-	m.nextProtoNeg = false
-	m.nextProtos = nil
-	m.ocspStapling = false
-	m.scts = nil
-	m.ticketSupported = false
-	m.alpnProtocol = ""
-
-	if len(data) == 0 {
-		// ServerHello is optionally followed by extension data
-		return true
-	}
-	if len(data) < 2 {
-		return false
-	}
-
-	extensionsLength := int(data[0])<<8 | int(data[1])
-	data = data[2:]
-	if len(data) != extensionsLength {
-		return false
-	}
-
-	for len(data) != 0 {
-		if len(data) < 4 {
-			return false
-		}
-		extension := uint16(data[0])<<8 | uint16(data[1])
-		length := int(data[2])<<8 | int(data[3])
-		data = data[4:]
-		if len(data) < length {
-			return false
-		}
-
-		switch extension {
-		case extensionNextProtoNeg:
-			m.nextProtoNeg = true
-			d := data[:length]
-			for len(d) > 0 {
-				l := int(d[0])
-				d = d[1:]
-				if l == 0 || l > len(d) {
-					return false
-				}
-				m.nextProtos = append(m.nextProtos, string(d[:l]))
-				d = d[l:]
-			}
-		case extensionStatusRequest:
-			if length > 0 {
-				return false
-			}
-			m.ocspStapling = true
-		case extensionSessionTicket:
-			if length > 0 {
-				return false
-			}
-			m.ticketSupported = true
-		case extensionRenegotiationInfo:
-			if length != 1 || data[0] != 0 {
-				return false
-			}
-			m.secureRenegotiation = true
-		case extensionALPN:
-			d := data[:length]
-			if len(d) < 3 {
-				return false
-			}
-			l := int(d[0])<<8 | int(d[1])
-			if l != len(d)-2 {
-				return false
-			}
-			d = d[2:]
-			l = int(d[0])
-			if l != len(d)-1 {
-				return false
-			}
-			d = d[1:]
-			m.alpnProtocol = string(d)
-		case extensionSCT:
-			d := data[:length]
-
-			if len(d) < 2 {
-				return false
-			}
-			l := int(d[0])<<8 | int(d[1])
-			d = d[2:]
-			if len(d) != l {
-				return false
-			}
-			if l == 0 {
-				continue
-			}
-
-			m.scts = make([][]byte, 0, 3)
-			for len(d) != 0 {
-				if len(d) < 2 {
-					return false
-				}
-				sctLen := int(d[0])<<8 | int(d[1])
-				d = d[2:]
-				if len(d) < sctLen {
-					return false
-				}
-				m.scts = append(m.scts, d[:sctLen])
-				d = d[sctLen:]
-			}
-		}
-		data = data[length:]
-	}
-
-	return true
-}
-
-type certificateMsg struct {
-	raw          []byte
-	certificates [][]byte
-}
-
-func (m *certificateMsg) equal(i interface{}) bool {
-	m1, ok := i.(*certificateMsg)
-	if !ok {
-		return false
-	}
-
-	return bytes.Equal(m.raw, m1.raw) &&
-		eqByteSlices(m.certificates, m1.certificates)
-}
-
-func (m *certificateMsg) marshal() (x []byte) {
-	if m.raw != nil {
-		return m.raw
-	}
-
-	var i int
-	for _, slice := range m.certificates {
-		i += len(slice)
-	}
-
-	length := 3 + 3*len(m.certificates) + i
-	x = make([]byte, 4+length)
-	x[0] = typeCertificate
-	x[1] = uint8(length >> 16)
-	x[2] = uint8(length >> 8)
-	x[3] = uint8(length)
-
-	certificateOctets := length - 3
-	x[4] = uint8(certificateOctets >> 16)
-	x[5] = uint8(certificateOctets >> 8)
-	x[6] = uint8(certificateOctets)
-
-	y := x[7:]
-	for _, slice := range m.certificates {
-		y[0] = uint8(len(slice) >> 16)
-		y[1] = uint8(len(slice) >> 8)
-		y[2] = uint8(len(slice))
-		copy(y[3:], slice)
-		y = y[3+len(slice):]
-	}
-
-	m.raw = x
-	return
-}
-
-func (m *certificateMsg) unmarshal(data []byte) bool {
-	if len(data) < 7 {
-		return false
-	}
-
-	m.raw = data
-	certsLen := uint32(data[4])<<16 | uint32(data[5])<<8 | uint32(data[6])
-	if uint32(len(data)) != certsLen+7 {
-		return false
-	}
-
-	numCerts := 0
-	d := data[7:]
-	for certsLen > 0 {
-		if len(d) < 4 {
-			return false
-		}
-		certLen := uint32(d[0])<<16 | uint32(d[1])<<8 | uint32(d[2])
-		if uint32(len(d)) < 3+certLen {
-			return false
-		}
-		d = d[3+certLen:]
-		certsLen -= 3 + certLen
-		numCerts++
-	}
-
-	m.certificates = make([][]byte, numCerts)
-	d = data[7:]
-	for i := 0; i < numCerts; i++ {
-		certLen := uint32(d[0])<<16 | uint32(d[1])<<8 | uint32(d[2])
-		m.certificates[i] = d[3 : 3+certLen]
-		d = d[3+certLen:]
-	}
-
-	return true
-}
-
-type serverKeyExchangeMsg struct {
-	raw []byte
-	key []byte
-}
-
-func (m *serverKeyExchangeMsg) equal(i interface{}) bool {
-	m1, ok := i.(*serverKeyExchangeMsg)
-	if !ok {
-		return false
-	}
-
-	return bytes.Equal(m.raw, m1.raw) &&
-		bytes.Equal(m.key, m1.key)
-}
-
-func (m *serverKeyExchangeMsg) marshal() []byte {
-	if m.raw != nil {
-		return m.raw
-	}
-	length := len(m.key)
-	x := make([]byte, length+4)
-	x[0] = typeServerKeyExchange
-	x[1] = uint8(length >> 16)
-	x[2] = uint8(length >> 8)
-	x[3] = uint8(length)
-	copy(x[4:], m.key)
-
-	m.raw = x
-	return x
-}
-
-func (m *serverKeyExchangeMsg) unmarshal(data []byte) bool {
-	m.raw = data
-	if len(data) < 4 {
-		return false
-	}
-	m.key = data[4:]
-	return true
-}
-
-type certificateStatusMsg struct {
-	raw        []byte
-	statusType uint8
-	response   []byte
-}
-
-func (m *certificateStatusMsg) equal(i interface{}) bool {
-	m1, ok := i.(*certificateStatusMsg)
-	if !ok {
-		return false
-	}
-
-	return bytes.Equal(m.raw, m1.raw) &&
-		m.statusType == m1.statusType &&
-		bytes.Equal(m.response, m1.response)
-}
-
-func (m *certificateStatusMsg) marshal() []byte {
-	if m.raw != nil {
-		return m.raw
-	}
-
-	var x []byte
-	if m.statusType == statusTypeOCSP {
-		x = make([]byte, 4+4+len(m.response))
-		x[0] = typeCertificateStatus
-		l := len(m.response) + 4
-		x[1] = byte(l >> 16)
-		x[2] = byte(l >> 8)
-		x[3] = byte(l)
-		x[4] = statusTypeOCSP
-
-		l -= 4
-		x[5] = byte(l >> 16)
-		x[6] = byte(l >> 8)
-		x[7] = byte(l)
-		copy(x[8:], m.response)
-	} else {
-		x = []byte{typeCertificateStatus, 0, 0, 1, m.statusType}
-	}
-
-	m.raw = x
-	return x
-}
-
-func (m *certificateStatusMsg) unmarshal(data []byte) bool {
-	m.raw = data
-	if len(data) < 5 {
-		return false
-	}
-	m.statusType = data[4]
-
-	m.response = nil
-	if m.statusType == statusTypeOCSP {
-		if len(data) < 8 {
-			return false
-		}
-		respLen := uint32(data[5])<<16 | uint32(data[6])<<8 | uint32(data[7])
-		if uint32(len(data)) != 4+4+respLen {
-			return false
-		}
-		m.response = data[8:]
-	}
-	return true
-}
-
-type serverHelloDoneMsg struct{}
-
-func (m *serverHelloDoneMsg) equal(i interface{}) bool {
-	_, ok := i.(*serverHelloDoneMsg)
-	return ok
-}
-
-func (m *serverHelloDoneMsg) marshal() []byte {
-	x := make([]byte, 4)
-	x[0] = typeServerHelloDone
-	return x
-}
-
-func (m *serverHelloDoneMsg) unmarshal(data []byte) bool {
-	return len(data) == 4
-}
-
-type clientKeyExchangeMsg struct {
-	raw        []byte
-	ciphertext []byte
-}
-
-func (m *clientKeyExchangeMsg) equal(i interface{}) bool {
-	m1, ok := i.(*clientKeyExchangeMsg)
-	if !ok {
-		return false
-	}
-
-	return bytes.Equal(m.raw, m1.raw) &&
-		bytes.Equal(m.ciphertext, m1.ciphertext)
-}
-
-func (m *clientKeyExchangeMsg) marshal() []byte {
-	if m.raw != nil {
-		return m.raw
-	}
-	length := len(m.ciphertext)
-	x := make([]byte, length+4)
-	x[0] = typeClientKeyExchange
-	x[1] = uint8(length >> 16)
-	x[2] = uint8(length >> 8)
-	x[3] = uint8(length)
-	copy(x[4:], m.ciphertext)
-
-	m.raw = x
-	return x
-}
-
-func (m *clientKeyExchangeMsg) unmarshal(data []byte) bool {
-	m.raw = data
-	if len(data) < 4 {
-		return false
-	}
-	l := int(data[1])<<16 | int(data[2])<<8 | int(data[3])
-	if l != len(data)-4 {
-		return false
-	}
-	m.ciphertext = data[4:]
-	return true
-}
-
-type finishedMsg struct {
-	raw        []byte
-	verifyData []byte
-}
-
-func (m *finishedMsg) equal(i interface{}) bool {
-	m1, ok := i.(*finishedMsg)
-	if !ok {
-		return false
-	}
-
-	return bytes.Equal(m.raw, m1.raw) &&
-		bytes.Equal(m.verifyData, m1.verifyData)
-}
-
-func (m *finishedMsg) marshal() (x []byte) {
-	if m.raw != nil {
-		return m.raw
-	}
-
-	x = make([]byte, 4+len(m.verifyData))
-	x[0] = typeFinished
-	x[3] = byte(len(m.verifyData))
-	copy(x[4:], m.verifyData)
-	m.raw = x
-	return
-}
-
-func (m *finishedMsg) unmarshal(data []byte) bool {
-	m.raw = data
-	if len(data) < 4 {
-		return false
-	}
-	m.verifyData = data[4:]
-	return true
-}
-
-type nextProtoMsg struct {
-	raw   []byte
-	proto string
-}
-
-func (m *nextProtoMsg) equal(i interface{}) bool {
-	m1, ok := i.(*nextProtoMsg)
-	if !ok {
-		return false
-	}
-
-	return bytes.Equal(m.raw, m1.raw) &&
-		m.proto == m1.proto
-}
-
-func (m *nextProtoMsg) marshal() []byte {
-	if m.raw != nil {
-		return m.raw
-	}
-	l := len(m.proto)
-	if l > 255 {
-		l = 255
-	}
-
-	padding := 32 - (l+2)%32
-	length := l + padding + 2
-	x := make([]byte, length+4)
-	x[0] = typeNextProtocol
-	x[1] = uint8(length >> 16)
-	x[2] = uint8(length >> 8)
-	x[3] = uint8(length)
-
-	y := x[4:]
-	y[0] = byte(l)
-	copy(y[1:], []byte(m.proto[0:l]))
-	y = y[1+l:]
-	y[0] = byte(padding)
-
-	m.raw = x
-
-	return x
-}
-
-func (m *nextProtoMsg) unmarshal(data []byte) bool {
-	m.raw = data
-
-	if len(data) < 5 {
-		return false
-	}
-	data = data[4:]
-	protoLen := int(data[0])
-	data = data[1:]
-	if len(data) < protoLen {
-		return false
-	}
-	m.proto = string(data[0:protoLen])
-	data = data[protoLen:]
-
-	if len(data) < 1 {
-		return false
-	}
-	paddingLen := int(data[0])
-	data = data[1:]
-	if len(data) != paddingLen {
-		return false
-	}
-
-	return true
-}
-
-type certificateRequestMsg struct {
-	raw []byte
-	// hasSignatureAndHash indicates whether this message includes a list
-	// of signature and hash functions. This change was introduced with TLS
-	// 1.2.
-	hasSignatureAndHash bool
-
-	certificateTypes       []byte
-	signatureAndHashes     []signatureAndHash
-	certificateAuthorities [][]byte
-}
-
-func (m *certificateRequestMsg) equal(i interface{}) bool {
-	m1, ok := i.(*certificateRequestMsg)
-	if !ok {
-		return false
-	}
-
-	return bytes.Equal(m.raw, m1.raw) &&
-		bytes.Equal(m.certificateTypes, m1.certificateTypes) &&
-		eqByteSlices(m.certificateAuthorities, m1.certificateAuthorities) &&
-		eqSignatureAndHashes(m.signatureAndHashes, m1.signatureAndHashes)
-}
-
-func (m *certificateRequestMsg) marshal() (x []byte) {
-	if m.raw != nil {
-		return m.raw
-	}
-
-	// See http://tools.ietf.org/html/rfc4346#section-7.4.4
-	length := 1 + len(m.certificateTypes) + 2
-	casLength := 0
-	for _, ca := range m.certificateAuthorities {
-		casLength += 2 + len(ca)
-	}
-	length += casLength
-
-	if m.hasSignatureAndHash {
-		length += 2 + 2*len(m.signatureAndHashes)
-	}
-
-	x = make([]byte, 4+length)
-	x[0] = typeCertificateRequest
-	x[1] = uint8(length >> 16)
-	x[2] = uint8(length >> 8)
-	x[3] = uint8(length)
-
-	x[4] = uint8(len(m.certificateTypes))
-
-	copy(x[5:], m.certificateTypes)
-	y := x[5+len(m.certificateTypes):]
-
-	if m.hasSignatureAndHash {
-		n := len(m.signatureAndHashes) * 2
-		y[0] = uint8(n >> 8)
-		y[1] = uint8(n)
-		y = y[2:]
-		for _, sigAndHash := range m.signatureAndHashes {
-			y[0] = sigAndHash.hash
-			y[1] = sigAndHash.signature
-			y = y[2:]
-		}
-	}
-
-	y[0] = uint8(casLength >> 8)
-	y[1] = uint8(casLength)
-	y = y[2:]
-	for _, ca := range m.certificateAuthorities {
-		y[0] = uint8(len(ca) >> 8)
-		y[1] = uint8(len(ca))
-		y = y[2:]
-		copy(y, ca)
-		y = y[len(ca):]
-	}
-
-	m.raw = x
-	return
-}
-
-func (m *certificateRequestMsg) unmarshal(data []byte) bool {
-	m.raw = data
-
-	if len(data) < 5 {
-		return false
-	}
-
-	length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
-	if uint32(len(data))-4 != length {
-		return false
-	}
-
-	numCertTypes := int(data[4])
-	data = data[5:]
-	if numCertTypes == 0 || len(data) <= numCertTypes {
-		return false
-	}
-
-	m.certificateTypes = make([]byte, numCertTypes)
-	if copy(m.certificateTypes, data) != numCertTypes {
-		return false
-	}
-
-	data = data[numCertTypes:]
-
-	if m.hasSignatureAndHash {
-		if len(data) < 2 {
-			return false
-		}
-		sigAndHashLen := uint16(data[0])<<8 | uint16(data[1])
-		data = data[2:]
-		if sigAndHashLen&1 != 0 {
-			return false
-		}
-		if len(data) < int(sigAndHashLen) {
-			return false
-		}
-		numSigAndHash := sigAndHashLen / 2
-		m.signatureAndHashes = make([]signatureAndHash, numSigAndHash)
-		for i := range m.signatureAndHashes {
-			m.signatureAndHashes[i].hash = data[0]
-			m.signatureAndHashes[i].signature = data[1]
-			data = data[2:]
-		}
-	}
-
-	if len(data) < 2 {
-		return false
-	}
-	casLength := uint16(data[0])<<8 | uint16(data[1])
-	data = data[2:]
-	if len(data) < int(casLength) {
-		return false
-	}
-	cas := make([]byte, casLength)
-	copy(cas, data)
-	data = data[casLength:]
-
-	m.certificateAuthorities = nil
-	for len(cas) > 0 {
-		if len(cas) < 2 {
-			return false
-		}
-		caLen := uint16(cas[0])<<8 | uint16(cas[1])
-		cas = cas[2:]
-
-		if len(cas) < int(caLen) {
-			return false
-		}
-
-		m.certificateAuthorities = append(m.certificateAuthorities, cas[:caLen])
-		cas = cas[caLen:]
-	}
-	if len(data) > 0 {
-		return false
-	}
-
-	return true
-}
-
-type certificateVerifyMsg struct {
-	raw                 []byte
-	hasSignatureAndHash bool
-	signatureAndHash    signatureAndHash
-	signature           []byte
-}
-
-func (m *certificateVerifyMsg) equal(i interface{}) bool {
-	m1, ok := i.(*certificateVerifyMsg)
-	if !ok {
-		return false
-	}
-
-	return bytes.Equal(m.raw, m1.raw) &&
-		m.hasSignatureAndHash == m1.hasSignatureAndHash &&
-		m.signatureAndHash.hash == m1.signatureAndHash.hash &&
-		m.signatureAndHash.signature == m1.signatureAndHash.signature &&
-		bytes.Equal(m.signature, m1.signature)
-}
-
-func (m *certificateVerifyMsg) marshal() (x []byte) {
-	if m.raw != nil {
-		return m.raw
-	}
-
-	// See http://tools.ietf.org/html/rfc4346#section-7.4.8
-	siglength := len(m.signature)
-	length := 2 + siglength
-	if m.hasSignatureAndHash {
-		length += 2
-	}
-	x = make([]byte, 4+length)
-	x[0] = typeCertificateVerify
-	x[1] = uint8(length >> 16)
-	x[2] = uint8(length >> 8)
-	x[3] = uint8(length)
-	y := x[4:]
-	if m.hasSignatureAndHash {
-		y[0] = m.signatureAndHash.hash
-		y[1] = m.signatureAndHash.signature
-		y = y[2:]
-	}
-	y[0] = uint8(siglength >> 8)
-	y[1] = uint8(siglength)
-	copy(y[2:], m.signature)
-
-	m.raw = x
-
-	return
-}
-
-func (m *certificateVerifyMsg) unmarshal(data []byte) bool {
-	m.raw = data
-
-	if len(data) < 6 {
-		return false
-	}
-
-	length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
-	if uint32(len(data))-4 != length {
-		return false
-	}
-
-	data = data[4:]
-	if m.hasSignatureAndHash {
-		m.signatureAndHash.hash = data[0]
-		m.signatureAndHash.signature = data[1]
-		data = data[2:]
-	}
-
-	if len(data) < 2 {
-		return false
-	}
-	siglength := int(data[0])<<8 + int(data[1])
-	data = data[2:]
-	if len(data) != siglength {
-		return false
-	}
-
-	m.signature = data
-
-	return true
-}
-
-type newSessionTicketMsg struct {
-	raw    []byte
-	ticket []byte
-}
-
-func (m *newSessionTicketMsg) equal(i interface{}) bool {
-	m1, ok := i.(*newSessionTicketMsg)
-	if !ok {
-		return false
-	}
-
-	return bytes.Equal(m.raw, m1.raw) &&
-		bytes.Equal(m.ticket, m1.ticket)
-}
-
-func (m *newSessionTicketMsg) marshal() (x []byte) {
-	if m.raw != nil {
-		return m.raw
-	}
-
-	// See http://tools.ietf.org/html/rfc5077#section-3.3
-	ticketLen := len(m.ticket)
-	length := 2 + 4 + ticketLen
-	x = make([]byte, 4+length)
-	x[0] = typeNewSessionTicket
-	x[1] = uint8(length >> 16)
-	x[2] = uint8(length >> 8)
-	x[3] = uint8(length)
-	x[8] = uint8(ticketLen >> 8)
-	x[9] = uint8(ticketLen)
-	copy(x[10:], m.ticket)
-
-	m.raw = x
-
-	return
-}
-
-func (m *newSessionTicketMsg) unmarshal(data []byte) bool {
-	m.raw = data
-
-	if len(data) < 10 {
-		return false
-	}
-
-	length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
-	if uint32(len(data))-4 != length {
-		return false
-	}
-
-	ticketLen := int(data[8])<<8 + int(data[9])
-	if len(data)-10 != ticketLen {
-		return false
-	}
-
-	m.ticket = data[10:]
-
-	return true
-}
-
-func eqUint16s(x, y []uint16) bool {
-	if len(x) != len(y) {
-		return false
-	}
-	for i, v := range x {
-		if y[i] != v {
-			return false
-		}
-	}
-	return true
-}
-
-func eqCurveIDs(x, y []CurveID) bool {
-	if len(x) != len(y) {
-		return false
-	}
-	for i, v := range x {
-		if y[i] != v {
-			return false
-		}
-	}
-	return true
-}
-
-func eqStrings(x, y []string) bool {
-	if len(x) != len(y) {
-		return false
-	}
-	for i, v := range x {
-		if y[i] != v {
-			return false
-		}
-	}
-	return true
-}
-
-func eqByteSlices(x, y [][]byte) bool {
-	if len(x) != len(y) {
-		return false
-	}
-	for i, v := range x {
-		if !bytes.Equal(v, y[i]) {
-			return false
-		}
-	}
-	return true
-}
-
-func eqSignatureAndHashes(x, y []signatureAndHash) bool {
-	if len(x) != len(y) {
-		return false
-	}
-	for i, v := range x {
-		v2 := y[i]
-		if v.hash != v2.hash || v.signature != v2.signature {
-			return false
-		}
-	}
-	return true
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/handshake_messages_test.go b/third_party/gofrontend/libgo/go/crypto/tls/handshake_messages_test.go
deleted file mode 100644
index 95d825b..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/handshake_messages_test.go
+++ /dev/null
@@ -1,262 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"math/rand"
-	"reflect"
-	"testing"
-	"testing/quick"
-)
-
-var tests = []interface{}{
-	&clientHelloMsg{},
-	&serverHelloMsg{},
-	&finishedMsg{},
-
-	&certificateMsg{},
-	&certificateRequestMsg{},
-	&certificateVerifyMsg{},
-	&certificateStatusMsg{},
-	&clientKeyExchangeMsg{},
-	&nextProtoMsg{},
-	&newSessionTicketMsg{},
-	&sessionState{},
-}
-
-type testMessage interface {
-	marshal() []byte
-	unmarshal([]byte) bool
-	equal(interface{}) bool
-}
-
-func TestMarshalUnmarshal(t *testing.T) {
-	rand := rand.New(rand.NewSource(0))
-
-	for i, iface := range tests {
-		ty := reflect.ValueOf(iface).Type()
-
-		n := 100
-		if testing.Short() {
-			n = 5
-		}
-		for j := 0; j < n; j++ {
-			v, ok := quick.Value(ty, rand)
-			if !ok {
-				t.Errorf("#%d: failed to create value", i)
-				break
-			}
-
-			m1 := v.Interface().(testMessage)
-			marshaled := m1.marshal()
-			m2 := iface.(testMessage)
-			if !m2.unmarshal(marshaled) {
-				t.Errorf("#%d failed to unmarshal %#v %x", i, m1, marshaled)
-				break
-			}
-			m2.marshal() // to fill any marshal cache in the message
-
-			if !m1.equal(m2) {
-				t.Errorf("#%d got:%#v want:%#v %x", i, m2, m1, marshaled)
-				break
-			}
-
-			if i >= 3 {
-				// The first three message types (ClientHello,
-				// ServerHello and Finished) are allowed to
-				// have parsable prefixes because the extension
-				// data is optional and the length of the
-				// Finished varies across versions.
-				for j := 0; j < len(marshaled); j++ {
-					if m2.unmarshal(marshaled[0:j]) {
-						t.Errorf("#%d unmarshaled a prefix of length %d of %#v", i, j, m1)
-						break
-					}
-				}
-			}
-		}
-	}
-}
-
-func TestFuzz(t *testing.T) {
-	rand := rand.New(rand.NewSource(0))
-	for _, iface := range tests {
-		m := iface.(testMessage)
-
-		for j := 0; j < 1000; j++ {
-			len := rand.Intn(100)
-			bytes := randomBytes(len, rand)
-			// This just looks for crashes due to bounds errors etc.
-			m.unmarshal(bytes)
-		}
-	}
-}
-
-func randomBytes(n int, rand *rand.Rand) []byte {
-	r := make([]byte, n)
-	for i := 0; i < n; i++ {
-		r[i] = byte(rand.Int31())
-	}
-	return r
-}
-
-func randomString(n int, rand *rand.Rand) string {
-	b := randomBytes(n, rand)
-	return string(b)
-}
-
-func (*clientHelloMsg) Generate(rand *rand.Rand, size int) reflect.Value {
-	m := &clientHelloMsg{}
-	m.vers = uint16(rand.Intn(65536))
-	m.random = randomBytes(32, rand)
-	m.sessionId = randomBytes(rand.Intn(32), rand)
-	m.cipherSuites = make([]uint16, rand.Intn(63)+1)
-	for i := 0; i < len(m.cipherSuites); i++ {
-		m.cipherSuites[i] = uint16(rand.Int31())
-	}
-	m.compressionMethods = randomBytes(rand.Intn(63)+1, rand)
-	if rand.Intn(10) > 5 {
-		m.nextProtoNeg = true
-	}
-	if rand.Intn(10) > 5 {
-		m.serverName = randomString(rand.Intn(255), rand)
-	}
-	m.ocspStapling = rand.Intn(10) > 5
-	m.supportedPoints = randomBytes(rand.Intn(5)+1, rand)
-	m.supportedCurves = make([]CurveID, rand.Intn(5)+1)
-	for i := range m.supportedCurves {
-		m.supportedCurves[i] = CurveID(rand.Intn(30000))
-	}
-	if rand.Intn(10) > 5 {
-		m.ticketSupported = true
-		if rand.Intn(10) > 5 {
-			m.sessionTicket = randomBytes(rand.Intn(300), rand)
-		}
-	}
-	if rand.Intn(10) > 5 {
-		m.signatureAndHashes = supportedSignatureAlgorithms
-	}
-	m.alpnProtocols = make([]string, rand.Intn(5))
-	for i := range m.alpnProtocols {
-		m.alpnProtocols[i] = randomString(rand.Intn(20)+1, rand)
-	}
-	if rand.Intn(10) > 5 {
-		m.scts = true
-	}
-
-	return reflect.ValueOf(m)
-}
-
-func (*serverHelloMsg) Generate(rand *rand.Rand, size int) reflect.Value {
-	m := &serverHelloMsg{}
-	m.vers = uint16(rand.Intn(65536))
-	m.random = randomBytes(32, rand)
-	m.sessionId = randomBytes(rand.Intn(32), rand)
-	m.cipherSuite = uint16(rand.Int31())
-	m.compressionMethod = uint8(rand.Intn(256))
-
-	if rand.Intn(10) > 5 {
-		m.nextProtoNeg = true
-
-		n := rand.Intn(10)
-		m.nextProtos = make([]string, n)
-		for i := 0; i < n; i++ {
-			m.nextProtos[i] = randomString(20, rand)
-		}
-	}
-
-	if rand.Intn(10) > 5 {
-		m.ocspStapling = true
-	}
-	if rand.Intn(10) > 5 {
-		m.ticketSupported = true
-	}
-	m.alpnProtocol = randomString(rand.Intn(32)+1, rand)
-
-	if rand.Intn(10) > 5 {
-		numSCTs := rand.Intn(4)
-		m.scts = make([][]byte, numSCTs)
-		for i := range m.scts {
-			m.scts[i] = randomBytes(rand.Intn(500), rand)
-		}
-	}
-
-	return reflect.ValueOf(m)
-}
-
-func (*certificateMsg) Generate(rand *rand.Rand, size int) reflect.Value {
-	m := &certificateMsg{}
-	numCerts := rand.Intn(20)
-	m.certificates = make([][]byte, numCerts)
-	for i := 0; i < numCerts; i++ {
-		m.certificates[i] = randomBytes(rand.Intn(10)+1, rand)
-	}
-	return reflect.ValueOf(m)
-}
-
-func (*certificateRequestMsg) Generate(rand *rand.Rand, size int) reflect.Value {
-	m := &certificateRequestMsg{}
-	m.certificateTypes = randomBytes(rand.Intn(5)+1, rand)
-	numCAs := rand.Intn(100)
-	m.certificateAuthorities = make([][]byte, numCAs)
-	for i := 0; i < numCAs; i++ {
-		m.certificateAuthorities[i] = randomBytes(rand.Intn(15)+1, rand)
-	}
-	return reflect.ValueOf(m)
-}
-
-func (*certificateVerifyMsg) Generate(rand *rand.Rand, size int) reflect.Value {
-	m := &certificateVerifyMsg{}
-	m.signature = randomBytes(rand.Intn(15)+1, rand)
-	return reflect.ValueOf(m)
-}
-
-func (*certificateStatusMsg) Generate(rand *rand.Rand, size int) reflect.Value {
-	m := &certificateStatusMsg{}
-	if rand.Intn(10) > 5 {
-		m.statusType = statusTypeOCSP
-		m.response = randomBytes(rand.Intn(10)+1, rand)
-	} else {
-		m.statusType = 42
-	}
-	return reflect.ValueOf(m)
-}
-
-func (*clientKeyExchangeMsg) Generate(rand *rand.Rand, size int) reflect.Value {
-	m := &clientKeyExchangeMsg{}
-	m.ciphertext = randomBytes(rand.Intn(1000)+1, rand)
-	return reflect.ValueOf(m)
-}
-
-func (*finishedMsg) Generate(rand *rand.Rand, size int) reflect.Value {
-	m := &finishedMsg{}
-	m.verifyData = randomBytes(12, rand)
-	return reflect.ValueOf(m)
-}
-
-func (*nextProtoMsg) Generate(rand *rand.Rand, size int) reflect.Value {
-	m := &nextProtoMsg{}
-	m.proto = randomString(rand.Intn(255), rand)
-	return reflect.ValueOf(m)
-}
-
-func (*newSessionTicketMsg) Generate(rand *rand.Rand, size int) reflect.Value {
-	m := &newSessionTicketMsg{}
-	m.ticket = randomBytes(rand.Intn(4), rand)
-	return reflect.ValueOf(m)
-}
-
-func (*sessionState) Generate(rand *rand.Rand, size int) reflect.Value {
-	s := &sessionState{}
-	s.vers = uint16(rand.Intn(10000))
-	s.cipherSuite = uint16(rand.Intn(10000))
-	s.masterSecret = randomBytes(rand.Intn(100), rand)
-	numCerts := rand.Intn(20)
-	s.certificates = make([][]byte, numCerts)
-	for i := 0; i < numCerts; i++ {
-		s.certificates[i] = randomBytes(rand.Intn(10)+1, rand)
-	}
-	return reflect.ValueOf(s)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/handshake_server.go b/third_party/gofrontend/libgo/go/crypto/tls/handshake_server.go
deleted file mode 100644
index e16cddc..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/handshake_server.go
+++ /dev/null
@@ -1,750 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"crypto"
-	"crypto/ecdsa"
-	"crypto/rsa"
-	"crypto/subtle"
-	"crypto/x509"
-	"encoding/asn1"
-	"errors"
-	"fmt"
-	"io"
-)
-
-// serverHandshakeState contains details of a server handshake in progress.
-// It's discarded once the handshake has completed.
-type serverHandshakeState struct {
-	c               *Conn
-	clientHello     *clientHelloMsg
-	hello           *serverHelloMsg
-	suite           *cipherSuite
-	ellipticOk      bool
-	ecdsaOk         bool
-	rsaDecryptOk    bool
-	rsaSignOk       bool
-	sessionState    *sessionState
-	finishedHash    finishedHash
-	masterSecret    []byte
-	certsFromClient [][]byte
-	cert            *Certificate
-}
-
-// serverHandshake performs a TLS handshake as a server.
-func (c *Conn) serverHandshake() error {
-	config := c.config
-
-	// If this is the first server handshake, we generate a random key to
-	// encrypt the tickets with.
-	config.serverInitOnce.Do(config.serverInit)
-
-	hs := serverHandshakeState{
-		c: c,
-	}
-	isResume, err := hs.readClientHello()
-	if err != nil {
-		return err
-	}
-
-	// For an overview of TLS handshaking, see https://tools.ietf.org/html/rfc5246#section-7.3
-	if isResume {
-		// The client has included a session ticket and so we do an abbreviated handshake.
-		if err := hs.doResumeHandshake(); err != nil {
-			return err
-		}
-		if err := hs.establishKeys(); err != nil {
-			return err
-		}
-		// ticketSupported is set in a resumption handshake if the
-		// ticket from the client was encrypted with an old session
-		// ticket key and thus a refreshed ticket should be sent.
-		if hs.hello.ticketSupported {
-			if err := hs.sendSessionTicket(); err != nil {
-				return err
-			}
-		}
-		if err := hs.sendFinished(c.firstFinished[:]); err != nil {
-			return err
-		}
-		if err := hs.readFinished(nil); err != nil {
-			return err
-		}
-		c.didResume = true
-	} else {
-		// The client didn't include a session ticket, or it wasn't
-		// valid so we do a full handshake.
-		if err := hs.doFullHandshake(); err != nil {
-			return err
-		}
-		if err := hs.establishKeys(); err != nil {
-			return err
-		}
-		if err := hs.readFinished(c.firstFinished[:]); err != nil {
-			return err
-		}
-		if err := hs.sendSessionTicket(); err != nil {
-			return err
-		}
-		if err := hs.sendFinished(nil); err != nil {
-			return err
-		}
-	}
-	c.handshakeComplete = true
-
-	return nil
-}
-
-// readClientHello reads a ClientHello message from the client and decides
-// whether we will perform session resumption.
-func (hs *serverHandshakeState) readClientHello() (isResume bool, err error) {
-	config := hs.c.config
-	c := hs.c
-
-	msg, err := c.readHandshake()
-	if err != nil {
-		return false, err
-	}
-	var ok bool
-	hs.clientHello, ok = msg.(*clientHelloMsg)
-	if !ok {
-		c.sendAlert(alertUnexpectedMessage)
-		return false, unexpectedMessageError(hs.clientHello, msg)
-	}
-	c.vers, ok = config.mutualVersion(hs.clientHello.vers)
-	if !ok {
-		c.sendAlert(alertProtocolVersion)
-		return false, fmt.Errorf("tls: client offered an unsupported, maximum protocol version of %x", hs.clientHello.vers)
-	}
-	c.haveVers = true
-
-	hs.hello = new(serverHelloMsg)
-
-	supportedCurve := false
-	preferredCurves := config.curvePreferences()
-Curves:
-	for _, curve := range hs.clientHello.supportedCurves {
-		for _, supported := range preferredCurves {
-			if supported == curve {
-				supportedCurve = true
-				break Curves
-			}
-		}
-	}
-
-	supportedPointFormat := false
-	for _, pointFormat := range hs.clientHello.supportedPoints {
-		if pointFormat == pointFormatUncompressed {
-			supportedPointFormat = true
-			break
-		}
-	}
-	hs.ellipticOk = supportedCurve && supportedPointFormat
-
-	foundCompression := false
-	// We only support null compression, so check that the client offered it.
-	for _, compression := range hs.clientHello.compressionMethods {
-		if compression == compressionNone {
-			foundCompression = true
-			break
-		}
-	}
-
-	if !foundCompression {
-		c.sendAlert(alertHandshakeFailure)
-		return false, errors.New("tls: client does not support uncompressed connections")
-	}
-
-	hs.hello.vers = c.vers
-	hs.hello.random = make([]byte, 32)
-	_, err = io.ReadFull(config.rand(), hs.hello.random)
-	if err != nil {
-		c.sendAlert(alertInternalError)
-		return false, err
-	}
-	hs.hello.secureRenegotiation = hs.clientHello.secureRenegotiation
-	hs.hello.compressionMethod = compressionNone
-	if len(hs.clientHello.serverName) > 0 {
-		c.serverName = hs.clientHello.serverName
-	}
-
-	if len(hs.clientHello.alpnProtocols) > 0 {
-		if selectedProto, fallback := mutualProtocol(hs.clientHello.alpnProtocols, c.config.NextProtos); !fallback {
-			hs.hello.alpnProtocol = selectedProto
-			c.clientProtocol = selectedProto
-		}
-	} else {
-		// Although sending an empty NPN extension is reasonable, Firefox has
-		// had a bug around this. Best to send nothing at all if
-		// config.NextProtos is empty. See
-		// https://golang.org/issue/5445.
-		if hs.clientHello.nextProtoNeg && len(config.NextProtos) > 0 {
-			hs.hello.nextProtoNeg = true
-			hs.hello.nextProtos = config.NextProtos
-		}
-	}
-
-	if hs.cert, err = config.getCertificate(&ClientHelloInfo{
-		CipherSuites:    hs.clientHello.cipherSuites,
-		ServerName:      hs.clientHello.serverName,
-		SupportedCurves: hs.clientHello.supportedCurves,
-		SupportedPoints: hs.clientHello.supportedPoints,
-	}); err != nil {
-		c.sendAlert(alertInternalError)
-		return false, err
-	}
-	if hs.clientHello.scts {
-		hs.hello.scts = hs.cert.SignedCertificateTimestamps
-	}
-
-	if priv, ok := hs.cert.PrivateKey.(crypto.Signer); ok {
-		switch priv.Public().(type) {
-		case *ecdsa.PublicKey:
-			hs.ecdsaOk = true
-		case *rsa.PublicKey:
-			hs.rsaSignOk = true
-		default:
-			c.sendAlert(alertInternalError)
-			return false, fmt.Errorf("crypto/tls: unsupported signing key type (%T)", priv.Public())
-		}
-	}
-	if priv, ok := hs.cert.PrivateKey.(crypto.Decrypter); ok {
-		switch priv.Public().(type) {
-		case *rsa.PublicKey:
-			hs.rsaDecryptOk = true
-		default:
-			c.sendAlert(alertInternalError)
-			return false, fmt.Errorf("crypto/tls: unsupported decryption key type (%T)", priv.Public())
-		}
-	}
-
-	if hs.checkForResumption() {
-		return true, nil
-	}
-
-	var preferenceList, supportedList []uint16
-	if c.config.PreferServerCipherSuites {
-		preferenceList = c.config.cipherSuites()
-		supportedList = hs.clientHello.cipherSuites
-	} else {
-		preferenceList = hs.clientHello.cipherSuites
-		supportedList = c.config.cipherSuites()
-	}
-
-	for _, id := range preferenceList {
-		if hs.setCipherSuite(id, supportedList, c.vers) {
-			break
-		}
-	}
-
-	if hs.suite == nil {
-		c.sendAlert(alertHandshakeFailure)
-		return false, errors.New("tls: no cipher suite supported by both client and server")
-	}
-
-	// See https://tools.ietf.org/html/draft-ietf-tls-downgrade-scsv-00.
-	for _, id := range hs.clientHello.cipherSuites {
-		if id == TLS_FALLBACK_SCSV {
-			// The client is doing a fallback connection.
-			if hs.clientHello.vers < c.config.maxVersion() {
-				c.sendAlert(alertInappropriateFallback)
-				return false, errors.New("tls: client using inappropriate protocol fallback")
-			}
-			break
-		}
-	}
-
-	return false, nil
-}
-
-// checkForResumption reports whether we should perform resumption on this connection.
-func (hs *serverHandshakeState) checkForResumption() bool {
-	c := hs.c
-
-	if c.config.SessionTicketsDisabled {
-		return false
-	}
-
-	var ok bool
-	var sessionTicket = append([]uint8{}, hs.clientHello.sessionTicket...)
-	if hs.sessionState, ok = c.decryptTicket(sessionTicket); !ok {
-		return false
-	}
-
-	if hs.sessionState.vers > hs.clientHello.vers {
-		return false
-	}
-	if vers, ok := c.config.mutualVersion(hs.sessionState.vers); !ok || vers != hs.sessionState.vers {
-		return false
-	}
-
-	cipherSuiteOk := false
-	// Check that the client is still offering the ciphersuite in the session.
-	for _, id := range hs.clientHello.cipherSuites {
-		if id == hs.sessionState.cipherSuite {
-			cipherSuiteOk = true
-			break
-		}
-	}
-	if !cipherSuiteOk {
-		return false
-	}
-
-	// Check that we also support the ciphersuite from the session.
-	if !hs.setCipherSuite(hs.sessionState.cipherSuite, c.config.cipherSuites(), hs.sessionState.vers) {
-		return false
-	}
-
-	sessionHasClientCerts := len(hs.sessionState.certificates) != 0
-	needClientCerts := c.config.ClientAuth == RequireAnyClientCert || c.config.ClientAuth == RequireAndVerifyClientCert
-	if needClientCerts && !sessionHasClientCerts {
-		return false
-	}
-	if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
-		return false
-	}
-
-	return true
-}
-
-func (hs *serverHandshakeState) doResumeHandshake() error {
-	c := hs.c
-
-	hs.hello.cipherSuite = hs.suite.id
-	// We echo the client's session ID in the ServerHello to let it know
-	// that we're doing a resumption.
-	hs.hello.sessionId = hs.clientHello.sessionId
-	hs.hello.ticketSupported = hs.sessionState.usedOldKey
-	hs.finishedHash = newFinishedHash(c.vers, hs.suite)
-	hs.finishedHash.discardHandshakeBuffer()
-	hs.finishedHash.Write(hs.clientHello.marshal())
-	hs.finishedHash.Write(hs.hello.marshal())
-	c.writeRecord(recordTypeHandshake, hs.hello.marshal())
-
-	if len(hs.sessionState.certificates) > 0 {
-		if _, err := hs.processCertsFromClient(hs.sessionState.certificates); err != nil {
-			return err
-		}
-	}
-
-	hs.masterSecret = hs.sessionState.masterSecret
-
-	return nil
-}
-
-func (hs *serverHandshakeState) doFullHandshake() error {
-	config := hs.c.config
-	c := hs.c
-
-	if hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 {
-		hs.hello.ocspStapling = true
-	}
-
-	hs.hello.ticketSupported = hs.clientHello.ticketSupported && !config.SessionTicketsDisabled
-	hs.hello.cipherSuite = hs.suite.id
-
-	hs.finishedHash = newFinishedHash(hs.c.vers, hs.suite)
-	if config.ClientAuth == NoClientCert {
-		// No need to keep a full record of the handshake if client
-		// certificates won't be used.
-		hs.finishedHash.discardHandshakeBuffer()
-	}
-	hs.finishedHash.Write(hs.clientHello.marshal())
-	hs.finishedHash.Write(hs.hello.marshal())
-	c.writeRecord(recordTypeHandshake, hs.hello.marshal())
-
-	certMsg := new(certificateMsg)
-	certMsg.certificates = hs.cert.Certificate
-	hs.finishedHash.Write(certMsg.marshal())
-	c.writeRecord(recordTypeHandshake, certMsg.marshal())
-
-	if hs.hello.ocspStapling {
-		certStatus := new(certificateStatusMsg)
-		certStatus.statusType = statusTypeOCSP
-		certStatus.response = hs.cert.OCSPStaple
-		hs.finishedHash.Write(certStatus.marshal())
-		c.writeRecord(recordTypeHandshake, certStatus.marshal())
-	}
-
-	keyAgreement := hs.suite.ka(c.vers)
-	skx, err := keyAgreement.generateServerKeyExchange(config, hs.cert, hs.clientHello, hs.hello)
-	if err != nil {
-		c.sendAlert(alertHandshakeFailure)
-		return err
-	}
-	if skx != nil {
-		hs.finishedHash.Write(skx.marshal())
-		c.writeRecord(recordTypeHandshake, skx.marshal())
-	}
-
-	if config.ClientAuth >= RequestClientCert {
-		// Request a client certificate
-		certReq := new(certificateRequestMsg)
-		certReq.certificateTypes = []byte{
-			byte(certTypeRSASign),
-			byte(certTypeECDSASign),
-		}
-		if c.vers >= VersionTLS12 {
-			certReq.hasSignatureAndHash = true
-			certReq.signatureAndHashes = supportedSignatureAlgorithms
-		}
-
-		// An empty list of certificateAuthorities signals to
-		// the client that it may send any certificate in response
-		// to our request. When we know the CAs we trust, then
-		// we can send them down, so that the client can choose
-		// an appropriate certificate to give to us.
-		if config.ClientCAs != nil {
-			certReq.certificateAuthorities = config.ClientCAs.Subjects()
-		}
-		hs.finishedHash.Write(certReq.marshal())
-		c.writeRecord(recordTypeHandshake, certReq.marshal())
-	}
-
-	helloDone := new(serverHelloDoneMsg)
-	hs.finishedHash.Write(helloDone.marshal())
-	c.writeRecord(recordTypeHandshake, helloDone.marshal())
-
-	var pub crypto.PublicKey // public key for client auth, if any
-
-	msg, err := c.readHandshake()
-	if err != nil {
-		return err
-	}
-
-	var ok bool
-	// If we requested a client certificate, then the client must send a
-	// certificate message, even if it's empty.
-	if config.ClientAuth >= RequestClientCert {
-		if certMsg, ok = msg.(*certificateMsg); !ok {
-			c.sendAlert(alertUnexpectedMessage)
-			return unexpectedMessageError(certMsg, msg)
-		}
-		hs.finishedHash.Write(certMsg.marshal())
-
-		if len(certMsg.certificates) == 0 {
-			// The client didn't actually send a certificate
-			switch config.ClientAuth {
-			case RequireAnyClientCert, RequireAndVerifyClientCert:
-				c.sendAlert(alertBadCertificate)
-				return errors.New("tls: client didn't provide a certificate")
-			}
-		}
-
-		pub, err = hs.processCertsFromClient(certMsg.certificates)
-		if err != nil {
-			return err
-		}
-
-		msg, err = c.readHandshake()
-		if err != nil {
-			return err
-		}
-	}
-
-	// Get client key exchange
-	ckx, ok := msg.(*clientKeyExchangeMsg)
-	if !ok {
-		c.sendAlert(alertUnexpectedMessage)
-		return unexpectedMessageError(ckx, msg)
-	}
-	hs.finishedHash.Write(ckx.marshal())
-
-	preMasterSecret, err := keyAgreement.processClientKeyExchange(config, hs.cert, ckx, c.vers)
-	if err != nil {
-		c.sendAlert(alertHandshakeFailure)
-		return err
-	}
-	hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.clientHello.random, hs.hello.random)
-
-	// If we received a client cert in response to our certificate request message,
-	// the client will send us a certificateVerifyMsg immediately after the
-	// clientKeyExchangeMsg.  This message is a digest of all preceding
-	// handshake-layer messages that is signed using the private key corresponding
-	// to the client's certificate. This allows us to verify that the client is in
-	// possession of the private key of the certificate.
-	if len(c.peerCertificates) > 0 {
-		msg, err = c.readHandshake()
-		if err != nil {
-			return err
-		}
-		certVerify, ok := msg.(*certificateVerifyMsg)
-		if !ok {
-			c.sendAlert(alertUnexpectedMessage)
-			return unexpectedMessageError(certVerify, msg)
-		}
-
-		// Determine the signature type.
-		var signatureAndHash signatureAndHash
-		if certVerify.hasSignatureAndHash {
-			signatureAndHash = certVerify.signatureAndHash
-			if !isSupportedSignatureAndHash(signatureAndHash, supportedSignatureAlgorithms) {
-				return errors.New("tls: unsupported hash function for client certificate")
-			}
-		} else {
-			// Before TLS 1.2 the signature algorithm was implicit
-			// from the key type, and only one hash per signature
-			// algorithm was possible. Leave the hash as zero.
-			switch pub.(type) {
-			case *ecdsa.PublicKey:
-				signatureAndHash.signature = signatureECDSA
-			case *rsa.PublicKey:
-				signatureAndHash.signature = signatureRSA
-			}
-		}
-
-		switch key := pub.(type) {
-		case *ecdsa.PublicKey:
-			if signatureAndHash.signature != signatureECDSA {
-				err = errors.New("bad signature type for client's ECDSA certificate")
-				break
-			}
-			ecdsaSig := new(ecdsaSignature)
-			if _, err = asn1.Unmarshal(certVerify.signature, ecdsaSig); err != nil {
-				break
-			}
-			if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
-				err = errors.New("ECDSA signature contained zero or negative values")
-				break
-			}
-			var digest []byte
-			if digest, _, err = hs.finishedHash.hashForClientCertificate(signatureAndHash, hs.masterSecret); err != nil {
-				break
-			}
-			if !ecdsa.Verify(key, digest, ecdsaSig.R, ecdsaSig.S) {
-				err = errors.New("ECDSA verification failure")
-			}
-		case *rsa.PublicKey:
-			if signatureAndHash.signature != signatureRSA {
-				err = errors.New("bad signature type for client's RSA certificate")
-				break
-			}
-			var digest []byte
-			var hashFunc crypto.Hash
-			if digest, hashFunc, err = hs.finishedHash.hashForClientCertificate(signatureAndHash, hs.masterSecret); err != nil {
-				break
-			}
-			err = rsa.VerifyPKCS1v15(key, hashFunc, digest, certVerify.signature)
-		}
-		if err != nil {
-			c.sendAlert(alertBadCertificate)
-			return errors.New("tls: could not validate signature of connection nonces: " + err.Error())
-		}
-
-		hs.finishedHash.Write(certVerify.marshal())
-	}
-
-	hs.finishedHash.discardHandshakeBuffer()
-
-	return nil
-}
-
-func (hs *serverHandshakeState) establishKeys() error {
-	c := hs.c
-
-	clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
-		keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen)
-
-	var clientCipher, serverCipher interface{}
-	var clientHash, serverHash macFunction
-
-	if hs.suite.aead == nil {
-		clientCipher = hs.suite.cipher(clientKey, clientIV, true /* for reading */)
-		clientHash = hs.suite.mac(c.vers, clientMAC)
-		serverCipher = hs.suite.cipher(serverKey, serverIV, false /* not for reading */)
-		serverHash = hs.suite.mac(c.vers, serverMAC)
-	} else {
-		clientCipher = hs.suite.aead(clientKey, clientIV)
-		serverCipher = hs.suite.aead(serverKey, serverIV)
-	}
-
-	c.in.prepareCipherSpec(c.vers, clientCipher, clientHash)
-	c.out.prepareCipherSpec(c.vers, serverCipher, serverHash)
-
-	return nil
-}
-
-func (hs *serverHandshakeState) readFinished(out []byte) error {
-	c := hs.c
-
-	c.readRecord(recordTypeChangeCipherSpec)
-	if err := c.in.error(); err != nil {
-		return err
-	}
-
-	if hs.hello.nextProtoNeg {
-		msg, err := c.readHandshake()
-		if err != nil {
-			return err
-		}
-		nextProto, ok := msg.(*nextProtoMsg)
-		if !ok {
-			c.sendAlert(alertUnexpectedMessage)
-			return unexpectedMessageError(nextProto, msg)
-		}
-		hs.finishedHash.Write(nextProto.marshal())
-		c.clientProtocol = nextProto.proto
-	}
-
-	msg, err := c.readHandshake()
-	if err != nil {
-		return err
-	}
-	clientFinished, ok := msg.(*finishedMsg)
-	if !ok {
-		c.sendAlert(alertUnexpectedMessage)
-		return unexpectedMessageError(clientFinished, msg)
-	}
-
-	verify := hs.finishedHash.clientSum(hs.masterSecret)
-	if len(verify) != len(clientFinished.verifyData) ||
-		subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 {
-		c.sendAlert(alertHandshakeFailure)
-		return errors.New("tls: client's Finished message is incorrect")
-	}
-
-	hs.finishedHash.Write(clientFinished.marshal())
-	copy(out, verify)
-	return nil
-}
-
-func (hs *serverHandshakeState) sendSessionTicket() error {
-	if !hs.hello.ticketSupported {
-		return nil
-	}
-
-	c := hs.c
-	m := new(newSessionTicketMsg)
-
-	var err error
-	state := sessionState{
-		vers:         c.vers,
-		cipherSuite:  hs.suite.id,
-		masterSecret: hs.masterSecret,
-		certificates: hs.certsFromClient,
-	}
-	m.ticket, err = c.encryptTicket(&state)
-	if err != nil {
-		return err
-	}
-
-	hs.finishedHash.Write(m.marshal())
-	c.writeRecord(recordTypeHandshake, m.marshal())
-
-	return nil
-}
-
-func (hs *serverHandshakeState) sendFinished(out []byte) error {
-	c := hs.c
-
-	c.writeRecord(recordTypeChangeCipherSpec, []byte{1})
-
-	finished := new(finishedMsg)
-	finished.verifyData = hs.finishedHash.serverSum(hs.masterSecret)
-	hs.finishedHash.Write(finished.marshal())
-	c.writeRecord(recordTypeHandshake, finished.marshal())
-
-	c.cipherSuite = hs.suite.id
-	copy(out, finished.verifyData)
-
-	return nil
-}
-
-// processCertsFromClient takes a chain of client certificates either from a
-// Certificates message or from a sessionState and verifies them. It returns
-// the public key of the leaf certificate.
-func (hs *serverHandshakeState) processCertsFromClient(certificates [][]byte) (crypto.PublicKey, error) {
-	c := hs.c
-
-	hs.certsFromClient = certificates
-	certs := make([]*x509.Certificate, len(certificates))
-	var err error
-	for i, asn1Data := range certificates {
-		if certs[i], err = x509.ParseCertificate(asn1Data); err != nil {
-			c.sendAlert(alertBadCertificate)
-			return nil, errors.New("tls: failed to parse client certificate: " + err.Error())
-		}
-	}
-
-	if c.config.ClientAuth >= VerifyClientCertIfGiven && len(certs) > 0 {
-		opts := x509.VerifyOptions{
-			Roots:         c.config.ClientCAs,
-			CurrentTime:   c.config.time(),
-			Intermediates: x509.NewCertPool(),
-			KeyUsages:     []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
-		}
-
-		for _, cert := range certs[1:] {
-			opts.Intermediates.AddCert(cert)
-		}
-
-		chains, err := certs[0].Verify(opts)
-		if err != nil {
-			c.sendAlert(alertBadCertificate)
-			return nil, errors.New("tls: failed to verify client's certificate: " + err.Error())
-		}
-
-		c.verifiedChains = chains
-	}
-
-	if len(certs) > 0 {
-		var pub crypto.PublicKey
-		switch key := certs[0].PublicKey.(type) {
-		case *ecdsa.PublicKey, *rsa.PublicKey:
-			pub = key
-		default:
-			c.sendAlert(alertUnsupportedCertificate)
-			return nil, fmt.Errorf("tls: client's certificate contains an unsupported public key of type %T", certs[0].PublicKey)
-		}
-		c.peerCertificates = certs
-		return pub, nil
-	}
-
-	return nil, nil
-}
-
-// setCipherSuite sets a cipherSuite with the given id as the serverHandshakeState
-// suite if that cipher suite is acceptable to use.
-// It returns a bool indicating if the suite was set.
-func (hs *serverHandshakeState) setCipherSuite(id uint16, supportedCipherSuites []uint16, version uint16) bool {
-	for _, supported := range supportedCipherSuites {
-		if id == supported {
-			var candidate *cipherSuite
-
-			for _, s := range cipherSuites {
-				if s.id == id {
-					candidate = s
-					break
-				}
-			}
-			if candidate == nil {
-				continue
-			}
-			// Don't select a ciphersuite which we can't
-			// support for this client.
-			if candidate.flags&suiteECDHE != 0 {
-				if !hs.ellipticOk {
-					continue
-				}
-				if candidate.flags&suiteECDSA != 0 {
-					if !hs.ecdsaOk {
-						continue
-					}
-				} else if !hs.rsaSignOk {
-					continue
-				}
-			} else if !hs.rsaDecryptOk {
-				continue
-			}
-			if version < VersionTLS12 && candidate.flags&suiteTLS12 != 0 {
-				continue
-			}
-			hs.suite = candidate
-			return true
-		}
-	}
-	return false
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/handshake_server_test.go b/third_party/gofrontend/libgo/go/crypto/tls/handshake_server_test.go
deleted file mode 100644
index 20c2bd6..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/handshake_server_test.go
+++ /dev/null
@@ -1,1059 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"bytes"
-	"crypto/ecdsa"
-	"crypto/elliptic"
-	"crypto/rsa"
-	"encoding/hex"
-	"encoding/pem"
-	"errors"
-	"fmt"
-	"io"
-	"math/big"
-	"net"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-	"testing"
-	"time"
-)
-
-// zeroSource is an io.Reader that returns an unlimited number of zero bytes.
-type zeroSource struct{}
-
-func (zeroSource) Read(b []byte) (n int, err error) {
-	for i := range b {
-		b[i] = 0
-	}
-
-	return len(b), nil
-}
-
-var testConfig *Config
-
-func allCipherSuites() []uint16 {
-	ids := make([]uint16, len(cipherSuites))
-	for i, suite := range cipherSuites {
-		ids[i] = suite.id
-	}
-
-	return ids
-}
-
-func init() {
-	testConfig = &Config{
-		Time:               func() time.Time { return time.Unix(0, 0) },
-		Rand:               zeroSource{},
-		Certificates:       make([]Certificate, 2),
-		InsecureSkipVerify: true,
-		MinVersion:         VersionSSL30,
-		MaxVersion:         VersionTLS12,
-		CipherSuites:       allCipherSuites(),
-	}
-	testConfig.Certificates[0].Certificate = [][]byte{testRSACertificate}
-	testConfig.Certificates[0].PrivateKey = testRSAPrivateKey
-	testConfig.Certificates[1].Certificate = [][]byte{testSNICertificate}
-	testConfig.Certificates[1].PrivateKey = testRSAPrivateKey
-	testConfig.BuildNameToCertificate()
-}
-
-func testClientHello(t *testing.T, serverConfig *Config, m handshakeMessage) {
-	testClientHelloFailure(t, serverConfig, m, "")
-}
-
-func testClientHelloFailure(t *testing.T, serverConfig *Config, m handshakeMessage, expectedSubStr string) {
-	// Create in-memory network connection,
-	// send message to server.  Should return
-	// expected error.
-	c, s := net.Pipe()
-	go func() {
-		cli := Client(c, testConfig)
-		if ch, ok := m.(*clientHelloMsg); ok {
-			cli.vers = ch.vers
-		}
-		cli.writeRecord(recordTypeHandshake, m.marshal())
-		c.Close()
-	}()
-	err := Server(s, serverConfig).Handshake()
-	s.Close()
-	if len(expectedSubStr) == 0 {
-		if err != nil && err != io.EOF {
-			t.Errorf("Got error: %s; expected to succeed", err, expectedSubStr)
-		}
-	} else if err == nil || !strings.Contains(err.Error(), expectedSubStr) {
-		t.Errorf("Got error: %s; expected to match substring '%s'", err, expectedSubStr)
-	}
-}
-
-func TestSimpleError(t *testing.T) {
-	testClientHelloFailure(t, testConfig, &serverHelloDoneMsg{}, "unexpected handshake message")
-}
-
-var badProtocolVersions = []uint16{0x0000, 0x0005, 0x0100, 0x0105, 0x0200, 0x0205}
-
-func TestRejectBadProtocolVersion(t *testing.T) {
-	for _, v := range badProtocolVersions {
-		testClientHelloFailure(t, testConfig, &clientHelloMsg{vers: v}, "unsupported, maximum protocol version")
-	}
-}
-
-func TestNoSuiteOverlap(t *testing.T) {
-	clientHello := &clientHelloMsg{
-		vers:               0x0301,
-		cipherSuites:       []uint16{0xff00},
-		compressionMethods: []uint8{0},
-	}
-	testClientHelloFailure(t, testConfig, clientHello, "no cipher suite supported by both client and server")
-}
-
-func TestNoCompressionOverlap(t *testing.T) {
-	clientHello := &clientHelloMsg{
-		vers:               0x0301,
-		cipherSuites:       []uint16{TLS_RSA_WITH_RC4_128_SHA},
-		compressionMethods: []uint8{0xff},
-	}
-	testClientHelloFailure(t, testConfig, clientHello, "client does not support uncompressed connections")
-}
-
-func TestNoRC4ByDefault(t *testing.T) {
-	clientHello := &clientHelloMsg{
-		vers:               0x0301,
-		cipherSuites:       []uint16{TLS_RSA_WITH_RC4_128_SHA},
-		compressionMethods: []uint8{0},
-	}
-	serverConfig := *testConfig
-	// Reset the enabled cipher suites to nil in order to test the
-	// defaults.
-	serverConfig.CipherSuites = nil
-	testClientHelloFailure(t, &serverConfig, clientHello, "no cipher suite supported by both client and server")
-}
-
-func TestDontSelectECDSAWithRSAKey(t *testing.T) {
-	// Test that, even when both sides support an ECDSA cipher suite, it
-	// won't be selected if the server's private key doesn't support it.
-	clientHello := &clientHelloMsg{
-		vers:               0x0301,
-		cipherSuites:       []uint16{TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA},
-		compressionMethods: []uint8{0},
-		supportedCurves:    []CurveID{CurveP256},
-		supportedPoints:    []uint8{pointFormatUncompressed},
-	}
-	serverConfig := *testConfig
-	serverConfig.CipherSuites = clientHello.cipherSuites
-	serverConfig.Certificates = make([]Certificate, 1)
-	serverConfig.Certificates[0].Certificate = [][]byte{testECDSACertificate}
-	serverConfig.Certificates[0].PrivateKey = testECDSAPrivateKey
-	serverConfig.BuildNameToCertificate()
-	// First test that it *does* work when the server's key is ECDSA.
-	testClientHello(t, &serverConfig, clientHello)
-
-	// Now test that switching to an RSA key causes the expected error (and
-	// not an internal error about a signing failure).
-	serverConfig.Certificates = testConfig.Certificates
-	testClientHelloFailure(t, &serverConfig, clientHello, "no cipher suite supported by both client and server")
-}
-
-func TestDontSelectRSAWithECDSAKey(t *testing.T) {
-	// Test that, even when both sides support an RSA cipher suite, it
-	// won't be selected if the server's private key doesn't support it.
-	clientHello := &clientHelloMsg{
-		vers:               0x0301,
-		cipherSuites:       []uint16{TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA},
-		compressionMethods: []uint8{0},
-		supportedCurves:    []CurveID{CurveP256},
-		supportedPoints:    []uint8{pointFormatUncompressed},
-	}
-	serverConfig := *testConfig
-	serverConfig.CipherSuites = clientHello.cipherSuites
-	// First test that it *does* work when the server's key is RSA.
-	testClientHello(t, &serverConfig, clientHello)
-
-	// Now test that switching to an ECDSA key causes the expected error
-	// (and not an internal error about a signing failure).
-	serverConfig.Certificates = make([]Certificate, 1)
-	serverConfig.Certificates[0].Certificate = [][]byte{testECDSACertificate}
-	serverConfig.Certificates[0].PrivateKey = testECDSAPrivateKey
-	serverConfig.BuildNameToCertificate()
-	testClientHelloFailure(t, &serverConfig, clientHello, "no cipher suite supported by both client and server")
-}
-
-func TestRenegotiationExtension(t *testing.T) {
-	clientHello := &clientHelloMsg{
-		vers:                VersionTLS12,
-		compressionMethods:  []uint8{compressionNone},
-		random:              make([]byte, 32),
-		secureRenegotiation: true,
-		cipherSuites:        []uint16{TLS_RSA_WITH_RC4_128_SHA},
-	}
-
-	var buf []byte
-	c, s := net.Pipe()
-
-	go func() {
-		cli := Client(c, testConfig)
-		cli.vers = clientHello.vers
-		cli.writeRecord(recordTypeHandshake, clientHello.marshal())
-
-		buf = make([]byte, 1024)
-		n, err := c.Read(buf)
-		if err != nil {
-			t.Fatalf("Server read returned error: %s", err)
-		}
-		buf = buf[:n]
-		c.Close()
-	}()
-
-	Server(s, testConfig).Handshake()
-
-	if len(buf) < 5+4 {
-		t.Fatalf("Server returned short message of length %d", len(buf))
-	}
-	// buf contains a TLS record, with a 5 byte record header and a 4 byte
-	// handshake header. The length of the ServerHello is taken from the
-	// handshake header.
-	serverHelloLen := int(buf[6])<<16 | int(buf[7])<<8 | int(buf[8])
-
-	var serverHello serverHelloMsg
-	// unmarshal expects to be given the handshake header, but
-	// serverHelloLen doesn't include it.
-	if !serverHello.unmarshal(buf[5 : 9+serverHelloLen]) {
-		t.Fatalf("Failed to parse ServerHello")
-	}
-
-	if !serverHello.secureRenegotiation {
-		t.Errorf("Secure renegotiation extension was not echoed.")
-	}
-}
-
-func TestTLS12OnlyCipherSuites(t *testing.T) {
-	// Test that a Server doesn't select a TLS 1.2-only cipher suite when
-	// the client negotiates TLS 1.1.
-	var zeros [32]byte
-
-	clientHello := &clientHelloMsg{
-		vers:   VersionTLS11,
-		random: zeros[:],
-		cipherSuites: []uint16{
-			// The Server, by default, will use the client's
-			// preference order. So the GCM cipher suite
-			// will be selected unless it's excluded because
-			// of the version in this ClientHello.
-			TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
-			TLS_RSA_WITH_RC4_128_SHA,
-		},
-		compressionMethods: []uint8{compressionNone},
-		supportedCurves:    []CurveID{CurveP256, CurveP384, CurveP521},
-		supportedPoints:    []uint8{pointFormatUncompressed},
-	}
-
-	c, s := net.Pipe()
-	var reply interface{}
-	var clientErr error
-	go func() {
-		cli := Client(c, testConfig)
-		cli.vers = clientHello.vers
-		cli.writeRecord(recordTypeHandshake, clientHello.marshal())
-		reply, clientErr = cli.readHandshake()
-		c.Close()
-	}()
-	config := *testConfig
-	config.CipherSuites = clientHello.cipherSuites
-	Server(s, &config).Handshake()
-	s.Close()
-	if clientErr != nil {
-		t.Fatal(clientErr)
-	}
-	serverHello, ok := reply.(*serverHelloMsg)
-	if !ok {
-		t.Fatalf("didn't get ServerHello message in reply. Got %v\n", reply)
-	}
-	if s := serverHello.cipherSuite; s != TLS_RSA_WITH_RC4_128_SHA {
-		t.Fatalf("bad cipher suite from server: %x", s)
-	}
-}
-
-func TestAlertForwarding(t *testing.T) {
-	c, s := net.Pipe()
-	go func() {
-		Client(c, testConfig).sendAlert(alertUnknownCA)
-		c.Close()
-	}()
-
-	err := Server(s, testConfig).Handshake()
-	s.Close()
-	if e, ok := err.(*net.OpError); !ok || e.Err != error(alertUnknownCA) {
-		t.Errorf("Got error: %s; expected: %s", err, error(alertUnknownCA))
-	}
-}
-
-func TestClose(t *testing.T) {
-	c, s := net.Pipe()
-	go c.Close()
-
-	err := Server(s, testConfig).Handshake()
-	s.Close()
-	if err != io.EOF {
-		t.Errorf("Got error: %s; expected: %s", err, io.EOF)
-	}
-}
-
-func testHandshake(clientConfig, serverConfig *Config) (serverState, clientState ConnectionState, err error) {
-	c, s := net.Pipe()
-	done := make(chan bool)
-	go func() {
-		cli := Client(c, clientConfig)
-		cli.Handshake()
-		clientState = cli.ConnectionState()
-		c.Close()
-		done <- true
-	}()
-	server := Server(s, serverConfig)
-	err = server.Handshake()
-	if err == nil {
-		serverState = server.ConnectionState()
-	}
-	s.Close()
-	<-done
-	return
-}
-
-func TestVersion(t *testing.T) {
-	serverConfig := &Config{
-		Certificates: testConfig.Certificates,
-		MaxVersion:   VersionTLS11,
-	}
-	clientConfig := &Config{
-		InsecureSkipVerify: true,
-	}
-	state, _, err := testHandshake(clientConfig, serverConfig)
-	if err != nil {
-		t.Fatalf("handshake failed: %s", err)
-	}
-	if state.Version != VersionTLS11 {
-		t.Fatalf("Incorrect version %x, should be %x", state.Version, VersionTLS11)
-	}
-}
-
-func TestCipherSuitePreference(t *testing.T) {
-	serverConfig := &Config{
-		CipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA},
-		Certificates: testConfig.Certificates,
-		MaxVersion:   VersionTLS11,
-	}
-	clientConfig := &Config{
-		CipherSuites:       []uint16{TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_RC4_128_SHA},
-		InsecureSkipVerify: true,
-	}
-	state, _, err := testHandshake(clientConfig, serverConfig)
-	if err != nil {
-		t.Fatalf("handshake failed: %s", err)
-	}
-	if state.CipherSuite != TLS_RSA_WITH_AES_128_CBC_SHA {
-		// By default the server should use the client's preference.
-		t.Fatalf("Client's preference was not used, got %x", state.CipherSuite)
-	}
-
-	serverConfig.PreferServerCipherSuites = true
-	state, _, err = testHandshake(clientConfig, serverConfig)
-	if err != nil {
-		t.Fatalf("handshake failed: %s", err)
-	}
-	if state.CipherSuite != TLS_RSA_WITH_RC4_128_SHA {
-		t.Fatalf("Server's preference was not used, got %x", state.CipherSuite)
-	}
-}
-
-func TestSCTHandshake(t *testing.T) {
-	expected := [][]byte{[]byte("certificate"), []byte("transparency")}
-	serverConfig := &Config{
-		Certificates: []Certificate{{
-			Certificate:                 [][]byte{testRSACertificate},
-			PrivateKey:                  testRSAPrivateKey,
-			SignedCertificateTimestamps: expected,
-		}},
-	}
-	clientConfig := &Config{
-		InsecureSkipVerify: true,
-	}
-	_, state, err := testHandshake(clientConfig, serverConfig)
-	if err != nil {
-		t.Fatalf("handshake failed: %s", err)
-	}
-	actual := state.SignedCertificateTimestamps
-	if len(actual) != len(expected) {
-		t.Fatalf("got %d scts, want %d", len(actual), len(expected))
-	}
-	for i, sct := range expected {
-		if !bytes.Equal(sct, actual[i]) {
-			t.Fatalf("SCT #%d was %x, but expected %x", i, actual[i], sct)
-		}
-	}
-}
-
-// Note: see comment in handshake_test.go for details of how the reference
-// tests work.
-
-// serverTest represents a test of the TLS server handshake against a reference
-// implementation.
-type serverTest struct {
-	// name is a freeform string identifying the test and the file in which
-	// the expected results will be stored.
-	name string
-	// command, if not empty, contains a series of arguments for the
-	// command to run for the reference server.
-	command []string
-	// expectedPeerCerts contains a list of PEM blocks of expected
-	// certificates from the client.
-	expectedPeerCerts []string
-	// config, if not nil, contains a custom Config to use for this test.
-	config *Config
-	// expectHandshakeErrorIncluding, when not empty, contains a string
-	// that must be a substring of the error resulting from the handshake.
-	expectHandshakeErrorIncluding string
-	// validate, if not nil, is a function that will be called with the
-	// ConnectionState of the resulting connection. It returns false if the
-	// ConnectionState is unacceptable.
-	validate func(ConnectionState) error
-}
-
-var defaultClientCommand = []string{"openssl", "s_client", "-no_ticket"}
-
-// connFromCommand starts opens a listening socket and starts the reference
-// client to connect to it. It returns a recordingConn that wraps the resulting
-// connection.
-func (test *serverTest) connFromCommand() (conn *recordingConn, child *exec.Cmd, err error) {
-	l, err := net.ListenTCP("tcp", &net.TCPAddr{
-		IP:   net.IPv4(127, 0, 0, 1),
-		Port: 0,
-	})
-	if err != nil {
-		return nil, nil, err
-	}
-	defer l.Close()
-
-	port := l.Addr().(*net.TCPAddr).Port
-
-	var command []string
-	command = append(command, test.command...)
-	if len(command) == 0 {
-		command = defaultClientCommand
-	}
-	command = append(command, "-connect")
-	command = append(command, fmt.Sprintf("127.0.0.1:%d", port))
-	cmd := exec.Command(command[0], command[1:]...)
-	cmd.Stdin = nil
-	var output bytes.Buffer
-	cmd.Stdout = &output
-	cmd.Stderr = &output
-	if err := cmd.Start(); err != nil {
-		return nil, nil, err
-	}
-
-	connChan := make(chan interface{})
-	go func() {
-		tcpConn, err := l.Accept()
-		if err != nil {
-			connChan <- err
-		}
-		connChan <- tcpConn
-	}()
-
-	var tcpConn net.Conn
-	select {
-	case connOrError := <-connChan:
-		if err, ok := connOrError.(error); ok {
-			return nil, nil, err
-		}
-		tcpConn = connOrError.(net.Conn)
-	case <-time.After(2 * time.Second):
-		output.WriteTo(os.Stdout)
-		return nil, nil, errors.New("timed out waiting for connection from child process")
-	}
-
-	record := &recordingConn{
-		Conn: tcpConn,
-	}
-
-	return record, cmd, nil
-}
-
-func (test *serverTest) dataPath() string {
-	return filepath.Join("testdata", "Server-"+test.name)
-}
-
-func (test *serverTest) loadData() (flows [][]byte, err error) {
-	in, err := os.Open(test.dataPath())
-	if err != nil {
-		return nil, err
-	}
-	defer in.Close()
-	return parseTestData(in)
-}
-
-func (test *serverTest) run(t *testing.T, write bool) {
-	var clientConn, serverConn net.Conn
-	var recordingConn *recordingConn
-	var childProcess *exec.Cmd
-
-	if write {
-		var err error
-		recordingConn, childProcess, err = test.connFromCommand()
-		if err != nil {
-			t.Fatalf("Failed to start subcommand: %s", err)
-		}
-		serverConn = recordingConn
-	} else {
-		clientConn, serverConn = net.Pipe()
-	}
-	config := test.config
-	if config == nil {
-		config = testConfig
-	}
-	server := Server(serverConn, config)
-	connStateChan := make(chan ConnectionState, 1)
-	go func() {
-		var err error
-		if _, err = server.Write([]byte("hello, world\n")); err != nil {
-			t.Logf("Error from Server.Write: %s", err)
-		}
-		if len(test.expectHandshakeErrorIncluding) > 0 {
-			if err == nil {
-				t.Errorf("Error expected, but no error returned")
-			} else if s := err.Error(); !strings.Contains(s, test.expectHandshakeErrorIncluding) {
-				t.Errorf("Error expected containing '%s' but got '%s'", test.expectHandshakeErrorIncluding, s)
-			}
-		}
-		server.Close()
-		serverConn.Close()
-		connStateChan <- server.ConnectionState()
-	}()
-
-	if !write {
-		flows, err := test.loadData()
-		if err != nil {
-			t.Fatalf("%s: failed to load data from %s", test.name, test.dataPath())
-		}
-		for i, b := range flows {
-			if i%2 == 0 {
-				clientConn.Write(b)
-				continue
-			}
-			bb := make([]byte, len(b))
-			n, err := io.ReadFull(clientConn, bb)
-			if err != nil {
-				t.Fatalf("%s #%d: %s\nRead %d, wanted %d, got %x, wanted %x\n", test.name, i+1, err, n, len(bb), bb[:n], b)
-			}
-			if !bytes.Equal(b, bb) {
-				t.Fatalf("%s #%d: mismatch on read: got:%x want:%x", test.name, i+1, bb, b)
-			}
-		}
-		clientConn.Close()
-	}
-
-	connState := <-connStateChan
-	peerCerts := connState.PeerCertificates
-	if len(peerCerts) == len(test.expectedPeerCerts) {
-		for i, peerCert := range peerCerts {
-			block, _ := pem.Decode([]byte(test.expectedPeerCerts[i]))
-			if !bytes.Equal(block.Bytes, peerCert.Raw) {
-				t.Fatalf("%s: mismatch on peer cert %d", test.name, i+1)
-			}
-		}
-	} else {
-		t.Fatalf("%s: mismatch on peer list length: %d (wanted) != %d (got)", test.name, len(test.expectedPeerCerts), len(peerCerts))
-	}
-
-	if test.validate != nil {
-		if err := test.validate(connState); err != nil {
-			t.Fatalf("validate callback returned error: %s", err)
-		}
-	}
-
-	if write {
-		path := test.dataPath()
-		out, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
-		if err != nil {
-			t.Fatalf("Failed to create output file: %s", err)
-		}
-		defer out.Close()
-		recordingConn.Close()
-		if len(recordingConn.flows) < 3 {
-			childProcess.Stdout.(*bytes.Buffer).WriteTo(os.Stdout)
-			if len(test.expectHandshakeErrorIncluding) == 0 {
-				t.Fatalf("Handshake failed")
-			}
-		}
-		recordingConn.WriteTo(out)
-		fmt.Printf("Wrote %s\n", path)
-		childProcess.Wait()
-	}
-}
-
-func runServerTestForVersion(t *testing.T, template *serverTest, prefix, option string) {
-	test := *template
-	test.name = prefix + test.name
-	if len(test.command) == 0 {
-		test.command = defaultClientCommand
-	}
-	test.command = append([]string(nil), test.command...)
-	test.command = append(test.command, option)
-	test.run(t, *update)
-}
-
-func runServerTestSSLv3(t *testing.T, template *serverTest) {
-	runServerTestForVersion(t, template, "SSLv3-", "-ssl3")
-}
-
-func runServerTestTLS10(t *testing.T, template *serverTest) {
-	runServerTestForVersion(t, template, "TLSv10-", "-tls1")
-}
-
-func runServerTestTLS11(t *testing.T, template *serverTest) {
-	runServerTestForVersion(t, template, "TLSv11-", "-tls1_1")
-}
-
-func runServerTestTLS12(t *testing.T, template *serverTest) {
-	runServerTestForVersion(t, template, "TLSv12-", "-tls1_2")
-}
-
-func TestHandshakeServerRSARC4(t *testing.T) {
-	test := &serverTest{
-		name:    "RSA-RC4",
-		command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "RC4-SHA"},
-	}
-	runServerTestSSLv3(t, test)
-	runServerTestTLS10(t, test)
-	runServerTestTLS11(t, test)
-	runServerTestTLS12(t, test)
-}
-
-func TestHandshakeServerRSA3DES(t *testing.T) {
-	test := &serverTest{
-		name:    "RSA-3DES",
-		command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "DES-CBC3-SHA"},
-	}
-	runServerTestSSLv3(t, test)
-	runServerTestTLS10(t, test)
-	runServerTestTLS12(t, test)
-}
-
-func TestHandshakeServerRSAAES(t *testing.T) {
-	test := &serverTest{
-		name:    "RSA-AES",
-		command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA"},
-	}
-	runServerTestSSLv3(t, test)
-	runServerTestTLS10(t, test)
-	runServerTestTLS12(t, test)
-}
-
-func TestHandshakeServerAESGCM(t *testing.T) {
-	test := &serverTest{
-		name:    "RSA-AES-GCM",
-		command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "ECDHE-RSA-AES128-GCM-SHA256"},
-	}
-	runServerTestTLS12(t, test)
-}
-
-func TestHandshakeServerAES256GCMSHA384(t *testing.T) {
-	test := &serverTest{
-		name:    "RSA-AES256-GCM-SHA384",
-		command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "ECDHE-RSA-AES256-GCM-SHA384"},
-	}
-	runServerTestTLS12(t, test)
-}
-
-func TestHandshakeServerECDHEECDSAAES(t *testing.T) {
-	config := *testConfig
-	config.Certificates = make([]Certificate, 1)
-	config.Certificates[0].Certificate = [][]byte{testECDSACertificate}
-	config.Certificates[0].PrivateKey = testECDSAPrivateKey
-	config.BuildNameToCertificate()
-
-	test := &serverTest{
-		name:    "ECDHE-ECDSA-AES",
-		command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "ECDHE-ECDSA-AES256-SHA"},
-		config:  &config,
-	}
-	runServerTestTLS10(t, test)
-	runServerTestTLS12(t, test)
-}
-
-func TestHandshakeServerALPN(t *testing.T) {
-	config := *testConfig
-	config.NextProtos = []string{"proto1", "proto2"}
-
-	test := &serverTest{
-		name: "ALPN",
-		// Note that this needs OpenSSL 1.0.2 because that is the first
-		// version that supports the -alpn flag.
-		command: []string{"openssl", "s_client", "-alpn", "proto2,proto1"},
-		config:  &config,
-		validate: func(state ConnectionState) error {
-			// The server's preferences should override the client.
-			if state.NegotiatedProtocol != "proto1" {
-				return fmt.Errorf("Got protocol %q, wanted proto1", state.NegotiatedProtocol)
-			}
-			return nil
-		},
-	}
-	runServerTestTLS12(t, test)
-}
-
-func TestHandshakeServerALPNNoMatch(t *testing.T) {
-	config := *testConfig
-	config.NextProtos = []string{"proto3"}
-
-	test := &serverTest{
-		name: "ALPN-NoMatch",
-		// Note that this needs OpenSSL 1.0.2 because that is the first
-		// version that supports the -alpn flag.
-		command: []string{"openssl", "s_client", "-alpn", "proto2,proto1"},
-		config:  &config,
-		validate: func(state ConnectionState) error {
-			// Rather than reject the connection, Go doesn't select
-			// a protocol when there is no overlap.
-			if state.NegotiatedProtocol != "" {
-				return fmt.Errorf("Got protocol %q, wanted ''", state.NegotiatedProtocol)
-			}
-			return nil
-		},
-	}
-	runServerTestTLS12(t, test)
-}
-
-// TestHandshakeServerSNI involves a client sending an SNI extension of
-// "snitest.com", which happens to match the CN of testSNICertificate. The test
-// verifies that the server correctly selects that certificate.
-func TestHandshakeServerSNI(t *testing.T) {
-	test := &serverTest{
-		name:    "SNI",
-		command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA", "-servername", "snitest.com"},
-	}
-	runServerTestTLS12(t, test)
-}
-
-// TestHandshakeServerSNICertForName is similar to TestHandshakeServerSNI, but
-// tests the dynamic GetCertificate method
-func TestHandshakeServerSNIGetCertificate(t *testing.T) {
-	config := *testConfig
-
-	// Replace the NameToCertificate map with a GetCertificate function
-	nameToCert := config.NameToCertificate
-	config.NameToCertificate = nil
-	config.GetCertificate = func(clientHello *ClientHelloInfo) (*Certificate, error) {
-		cert, _ := nameToCert[clientHello.ServerName]
-		return cert, nil
-	}
-	test := &serverTest{
-		name:    "SNI-GetCertificate",
-		command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA", "-servername", "snitest.com"},
-		config:  &config,
-	}
-	runServerTestTLS12(t, test)
-}
-
-// TestHandshakeServerSNICertForNameNotFound is similar to
-// TestHandshakeServerSNICertForName, but tests to make sure that when the
-// GetCertificate method doesn't return a cert, we fall back to what's in
-// the NameToCertificate map.
-func TestHandshakeServerSNIGetCertificateNotFound(t *testing.T) {
-	config := *testConfig
-
-	config.GetCertificate = func(clientHello *ClientHelloInfo) (*Certificate, error) {
-		return nil, nil
-	}
-	test := &serverTest{
-		name:    "SNI-GetCertificateNotFound",
-		command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA", "-servername", "snitest.com"},
-		config:  &config,
-	}
-	runServerTestTLS12(t, test)
-}
-
-// TestHandshakeServerSNICertForNameError tests to make sure that errors in
-// GetCertificate result in a tls alert.
-func TestHandshakeServerSNIGetCertificateError(t *testing.T) {
-	const errMsg = "TestHandshakeServerSNIGetCertificateError error"
-
-	serverConfig := *testConfig
-	serverConfig.GetCertificate = func(clientHello *ClientHelloInfo) (*Certificate, error) {
-		return nil, errors.New(errMsg)
-	}
-
-	clientHello := &clientHelloMsg{
-		vers:               0x0301,
-		cipherSuites:       []uint16{TLS_RSA_WITH_RC4_128_SHA},
-		compressionMethods: []uint8{0},
-		serverName:         "test",
-	}
-	testClientHelloFailure(t, &serverConfig, clientHello, errMsg)
-}
-
-// TestHandshakeServerEmptyCertificates tests that GetCertificates is called in
-// the case that Certificates is empty, even without SNI.
-func TestHandshakeServerEmptyCertificates(t *testing.T) {
-	const errMsg = "TestHandshakeServerEmptyCertificates error"
-
-	serverConfig := *testConfig
-	serverConfig.GetCertificate = func(clientHello *ClientHelloInfo) (*Certificate, error) {
-		return nil, errors.New(errMsg)
-	}
-	serverConfig.Certificates = nil
-
-	clientHello := &clientHelloMsg{
-		vers:               0x0301,
-		cipherSuites:       []uint16{TLS_RSA_WITH_RC4_128_SHA},
-		compressionMethods: []uint8{0},
-	}
-	testClientHelloFailure(t, &serverConfig, clientHello, errMsg)
-
-	// With an empty Certificates and a nil GetCertificate, the server
-	// should always return a “no certificates” error.
-	serverConfig.GetCertificate = nil
-
-	clientHello = &clientHelloMsg{
-		vers:               0x0301,
-		cipherSuites:       []uint16{TLS_RSA_WITH_RC4_128_SHA},
-		compressionMethods: []uint8{0},
-	}
-	testClientHelloFailure(t, &serverConfig, clientHello, "no certificates")
-}
-
-// TestCipherSuiteCertPreferance ensures that we select an RSA ciphersuite with
-// an RSA certificate and an ECDSA ciphersuite with an ECDSA certificate.
-func TestCipherSuiteCertPreferenceECDSA(t *testing.T) {
-	config := *testConfig
-	config.CipherSuites = []uint16{TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA}
-	config.PreferServerCipherSuites = true
-
-	test := &serverTest{
-		name:   "CipherSuiteCertPreferenceRSA",
-		config: &config,
-	}
-	runServerTestTLS12(t, test)
-
-	config = *testConfig
-	config.CipherSuites = []uint16{TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA}
-	config.Certificates = []Certificate{
-		{
-			Certificate: [][]byte{testECDSACertificate},
-			PrivateKey:  testECDSAPrivateKey,
-		},
-	}
-	config.BuildNameToCertificate()
-	config.PreferServerCipherSuites = true
-
-	test = &serverTest{
-		name:   "CipherSuiteCertPreferenceECDSA",
-		config: &config,
-	}
-	runServerTestTLS12(t, test)
-}
-
-func TestResumption(t *testing.T) {
-	sessionFilePath := tempFile("")
-	defer os.Remove(sessionFilePath)
-
-	test := &serverTest{
-		name:    "IssueTicket",
-		command: []string{"openssl", "s_client", "-cipher", "RC4-SHA", "-sess_out", sessionFilePath},
-	}
-	runServerTestTLS12(t, test)
-
-	test = &serverTest{
-		name:    "Resume",
-		command: []string{"openssl", "s_client", "-cipher", "RC4-SHA", "-sess_in", sessionFilePath},
-	}
-	runServerTestTLS12(t, test)
-}
-
-func TestResumptionDisabled(t *testing.T) {
-	sessionFilePath := tempFile("")
-	defer os.Remove(sessionFilePath)
-
-	config := *testConfig
-
-	test := &serverTest{
-		name:    "IssueTicketPreDisable",
-		command: []string{"openssl", "s_client", "-cipher", "RC4-SHA", "-sess_out", sessionFilePath},
-		config:  &config,
-	}
-	runServerTestTLS12(t, test)
-
-	config.SessionTicketsDisabled = true
-
-	test = &serverTest{
-		name:    "ResumeDisabled",
-		command: []string{"openssl", "s_client", "-cipher", "RC4-SHA", "-sess_in", sessionFilePath},
-		config:  &config,
-	}
-	runServerTestTLS12(t, test)
-
-	// One needs to manually confirm that the handshake in the golden data
-	// file for ResumeDisabled does not include a resumption handshake.
-}
-
-func TestFallbackSCSV(t *testing.T) {
-	serverConfig := &Config{
-		Certificates: testConfig.Certificates,
-	}
-	test := &serverTest{
-		name:   "FallbackSCSV",
-		config: serverConfig,
-		// OpenSSL 1.0.1j is needed for the -fallback_scsv option.
-		command: []string{"openssl", "s_client", "-fallback_scsv"},
-		expectHandshakeErrorIncluding: "inappropriate protocol fallback",
-	}
-	runServerTestTLS11(t, test)
-}
-
-// cert.pem and key.pem were generated with generate_cert.go
-// Thus, they have no ExtKeyUsage fields and trigger an error
-// when verification is turned on.
-
-const clientCertificatePEM = `
------BEGIN CERTIFICATE-----
-MIIB7TCCAVigAwIBAgIBADALBgkqhkiG9w0BAQUwJjEQMA4GA1UEChMHQWNtZSBD
-bzESMBAGA1UEAxMJMTI3LjAuMC4xMB4XDTExMTIwODA3NTUxMloXDTEyMTIwNzA4
-MDAxMlowJjEQMA4GA1UEChMHQWNtZSBDbzESMBAGA1UEAxMJMTI3LjAuMC4xMIGc
-MAsGCSqGSIb3DQEBAQOBjAAwgYgCgYBO0Hsx44Jk2VnAwoekXh6LczPHY1PfZpIG
-hPZk1Y/kNqcdK+izIDZFI7Xjla7t4PUgnI2V339aEu+H5Fto5OkOdOwEin/ekyfE
-ARl6vfLcPRSr0FTKIQzQTW6HLlzF0rtNS0/Otiz3fojsfNcCkXSmHgwa2uNKWi7e
-E5xMQIhZkwIDAQABozIwMDAOBgNVHQ8BAf8EBAMCAKAwDQYDVR0OBAYEBAECAwQw
-DwYDVR0jBAgwBoAEAQIDBDALBgkqhkiG9w0BAQUDgYEANh+zegx1yW43RmEr1b3A
-p0vMRpqBWHyFeSnIyMZn3TJWRSt1tukkqVCavh9a+hoV2cxVlXIWg7nCto/9iIw4
-hB2rXZIxE0/9gzvGnfERYraL7KtnvshksBFQRlgXa5kc0x38BvEO5ZaoDPl4ILdE
-GFGNEH5PlGffo05wc46QkYU=
------END CERTIFICATE-----`
-
-const clientKeyPEM = `
------BEGIN RSA PRIVATE KEY-----
-MIICWgIBAAKBgE7QezHjgmTZWcDCh6ReHotzM8djU99mkgaE9mTVj+Q2px0r6LMg
-NkUjteOVru3g9SCcjZXff1oS74fkW2jk6Q507ASKf96TJ8QBGXq98tw9FKvQVMoh
-DNBNbocuXMXSu01LT862LPd+iOx81wKRdKYeDBra40paLt4TnExAiFmTAgMBAAEC
-gYBxvXd8yNteFTns8A/2yomEMC4yeosJJSpp1CsN3BJ7g8/qTnrVPxBy+RU+qr63
-t2WquaOu/cr5P8iEsa6lk20tf8pjKLNXeX0b1RTzK8rJLbS7nGzP3tvOhL096VtQ
-dAo4ROEaro0TzYpHmpciSvxVIeEIAAdFDObDJPKqcJAxyQJBAJizfYgK8Gzx9fsx
-hxp+VteCbVPg2euASH5Yv3K5LukRdKoSzHE2grUVQgN/LafC0eZibRanxHegYSr7
-7qaswKUCQQCEIWor/X4XTMdVj3Oj+vpiw75y/S9gh682+myZL+d/02IEkwnB098P
-RkKVpenBHyrGg0oeN5La7URILWKj7CPXAkBKo6F+d+phNjwIFoN1Xb/RA32w/D1I
-saG9sF+UEhRt9AxUfW/U/tIQ9V0ZHHcSg1XaCM5Nvp934brdKdvTOKnJAkBD5h/3
-Rybatlvg/fzBEaJFyq09zhngkxlZOUtBVTqzl17RVvY2orgH02U4HbCHy4phxOn7
-qTdQRYlHRftgnWK1AkANibn9PRYJ7mJyJ9Dyj2QeNcSkSTzrt0tPvUMf4+meJymN
-1Ntu5+S1DLLzfxlaljWG6ylW6DNxujCyuXIV2rvA
------END RSA PRIVATE KEY-----`
-
-const clientECDSACertificatePEM = `
------BEGIN CERTIFICATE-----
-MIIB/DCCAV4CCQCaMIRsJjXZFzAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw
-EQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0
-eSBMdGQwHhcNMTIxMTE0MTMyNTUzWhcNMjIxMTEyMTMyNTUzWjBBMQswCQYDVQQG
-EwJBVTEMMAoGA1UECBMDTlNXMRAwDgYDVQQHEwdQeXJtb250MRIwEAYDVQQDEwlK
-b2VsIFNpbmcwgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABACVjJF1FMBexFe01MNv
-ja5oHt1vzobhfm6ySD6B5U7ixohLZNz1MLvT/2XMW/TdtWo+PtAd3kfDdq0Z9kUs
-jLzYHQFMH3CQRnZIi4+DzEpcj0B22uCJ7B0rxE4wdihBsmKo+1vx+U56jb0JuK7q
-ixgnTy5w/hOWusPTQBbNZU6sER7m8TAJBgcqhkjOPQQBA4GMADCBiAJCAOAUxGBg
-C3JosDJdYUoCdFzCgbkWqD8pyDbHgf9stlvZcPE4O1BIKJTLCRpS8V3ujfK58PDa
-2RU6+b0DeoeiIzXsAkIBo9SKeDUcSpoj0gq+KxAxnZxfvuiRs9oa9V2jI/Umi0Vw
-jWVim34BmT0Y9hCaOGGbLlfk+syxis7iI6CH8OFnUes=
------END CERTIFICATE-----`
-
-const clientECDSAKeyPEM = `
------BEGIN EC PARAMETERS-----
-BgUrgQQAIw==
------END EC PARAMETERS-----
------BEGIN EC PRIVATE KEY-----
-MIHcAgEBBEIBkJN9X4IqZIguiEVKMqeBUP5xtRsEv4HJEtOpOGLELwO53SD78Ew8
-k+wLWoqizS3NpQyMtrU8JFdWfj+C57UNkOugBwYFK4EEACOhgYkDgYYABACVjJF1
-FMBexFe01MNvja5oHt1vzobhfm6ySD6B5U7ixohLZNz1MLvT/2XMW/TdtWo+PtAd
-3kfDdq0Z9kUsjLzYHQFMH3CQRnZIi4+DzEpcj0B22uCJ7B0rxE4wdihBsmKo+1vx
-+U56jb0JuK7qixgnTy5w/hOWusPTQBbNZU6sER7m8Q==
------END EC PRIVATE KEY-----`
-
-func TestClientAuth(t *testing.T) {
-	var certPath, keyPath, ecdsaCertPath, ecdsaKeyPath string
-
-	if *update {
-		certPath = tempFile(clientCertificatePEM)
-		defer os.Remove(certPath)
-		keyPath = tempFile(clientKeyPEM)
-		defer os.Remove(keyPath)
-		ecdsaCertPath = tempFile(clientECDSACertificatePEM)
-		defer os.Remove(ecdsaCertPath)
-		ecdsaKeyPath = tempFile(clientECDSAKeyPEM)
-		defer os.Remove(ecdsaKeyPath)
-	}
-
-	config := *testConfig
-	config.ClientAuth = RequestClientCert
-
-	test := &serverTest{
-		name:    "ClientAuthRequestedNotGiven",
-		command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "RC4-SHA"},
-		config:  &config,
-	}
-	runServerTestTLS12(t, test)
-
-	test = &serverTest{
-		name:              "ClientAuthRequestedAndGiven",
-		command:           []string{"openssl", "s_client", "-no_ticket", "-cipher", "RC4-SHA", "-cert", certPath, "-key", keyPath},
-		config:            &config,
-		expectedPeerCerts: []string{clientCertificatePEM},
-	}
-	runServerTestTLS12(t, test)
-
-	test = &serverTest{
-		name:              "ClientAuthRequestedAndECDSAGiven",
-		command:           []string{"openssl", "s_client", "-no_ticket", "-cipher", "RC4-SHA", "-cert", ecdsaCertPath, "-key", ecdsaKeyPath},
-		config:            &config,
-		expectedPeerCerts: []string{clientECDSACertificatePEM},
-	}
-	runServerTestTLS12(t, test)
-}
-
-func bigFromString(s string) *big.Int {
-	ret := new(big.Int)
-	ret.SetString(s, 10)
-	return ret
-}
-
-func fromHex(s string) []byte {
-	b, _ := hex.DecodeString(s)
-	return b
-}
-
-var testRSACertificate = fromHex("30820263308201cca003020102020900a273000c8100cbf3300d06092a864886f70d01010b0500302b31173015060355040a130e476f6f676c652054455354494e473110300e06035504031307476f20526f6f74301e170d3135303130313030303030305a170d3235303130313030303030305a302631173015060355040a130e476f6f676c652054455354494e47310b300906035504031302476f30819f300d06092a864886f70d010101050003818d0030818902818100af8788f6201b95656c14ab4405af3b4514e3b76dfd00634d957ffe6a623586c04af9187cf6aa255e7a64316600baf48e92afc76bd876d4f35f41cb6e5615971b97c13c123921663d2b16d1bcdb1cc0a7dab7caadbadacbd52150ecde8dabd16b814b8902f3c4bec16c89b14484bd21d1047d9d164df98215f6effad60947f2fb0203010001a38193308190300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030106082b06010505070302300c0603551d130101ff0402300030190603551d0e0412041012508d896f1bd1dc544d6ecb695e06f4301b0603551d23041430128010bf3db6a966f2b840cfeab40378481a4130190603551d1104123010820e6578616d706c652e676f6c616e67300d06092a864886f70d01010b050003818100927caf91551218965931a64840d52dd5eebb02a0f5c21e7c9bb3307d3cdc76da4f3dc0faae2d33246b037b1b67591121b511bc77b9d9e06ea82d2e35fa645f223e63106bbeff14866d0df01531a814381e3b84872ccb98ed5176b9b14fdddb9b84048640fa51ddbab48debe346de46b94f86c7f9a4c24134acccf6eab0ab3918")
-
-var testRSACertificateIssuer = fromHex("3082024d308201b6a003020102020827326bd913b7c43d300d06092a864886f70d01010b0500302b31173015060355040a130e476f6f676c652054455354494e473110300e06035504031307476f20526f6f74301e170d3135303130313030303030305a170d3235303130313030303030305a302b31173015060355040a130e476f6f676c652054455354494e473110300e06035504031307476f20526f6f7430819f300d06092a864886f70d010101050003818d0030818902818100f0429a7b9f66a222c8453800452db355b34c4409fee09af2510a6589bfa35bdb4d453200d1de24338d6d5e5a91cc8301628445d6eb4e675927b9c1ea5c0f676acfb0f708ce4f19827e321c1898bf86df9823d5f0b05df2b6779888eff8abbc7f41c6e7d2667386a579b8cbaad3f6fd597cd7c4b187911a425aed1b555c1965190203010001a37a3078300e0603551d0f0101ff040403020204301d0603551d250416301406082b0601050507030106082b06010505070302300f0603551d130101ff040530030101ff30190603551d0e04120410bf3db6a966f2b840cfeab40378481a41301b0603551d23041430128010bf3db6a966f2b840cfeab40378481a41300d06092a864886f70d01010b050003818100586e68c1219ed4f5782b7cfd53cf1a55750a98781b2023f8694bb831fff6d7d4aad1f0ac782b1ec787f00a8956bdd06b4a1063444fcafe955c07d679163a730802c568886a2cf8a3c2ab41176957131c4b9e077ebd7ffbb91fdad8b08b932e9aeefac04923ffdc0aa145563f7f061995317400203578f350e3e566deb29dec5e")
-
-var testECDSACertificate = fromHex("3082020030820162020900b8bf2d47a0d2ebf4300906072a8648ce3d04013045310b3009060355040613024155311330110603550408130a536f6d652d53746174653121301f060355040a1318496e7465726e6574205769646769747320507479204c7464301e170d3132313132323135303633325a170d3232313132303135303633325a3045310b3009060355040613024155311330110603550408130a536f6d652d53746174653121301f060355040a1318496e7465726e6574205769646769747320507479204c746430819b301006072a8648ce3d020106052b81040023038186000400c4a1edbe98f90b4873367ec316561122f23d53c33b4d213dcd6b75e6f6b0dc9adf26c1bcb287f072327cb3642f1c90bcea6823107efee325c0483a69e0286dd33700ef0462dd0da09c706283d881d36431aa9e9731bd96b068c09b23de76643f1a5c7fe9120e5858b65f70dd9bd8ead5d7f5d5ccb9b69f30665b669a20e227e5bffe3b300906072a8648ce3d040103818c0030818802420188a24febe245c5487d1bacf5ed989dae4770c05e1bb62fbdf1b64db76140d311a2ceee0b7e927eff769dc33b7ea53fcefa10e259ec472d7cacda4e970e15a06fd00242014dfcbe67139c2d050ebd3fa38c25c13313830d9406bbd4377af6ec7ac9862eddd711697f857c56defb31782be4c7780daecbbe9e4e3624317b6a0f399512078f2a")
-
-var testSNICertificate = fromHex("308201f23082015da003020102020100300b06092a864886f70d01010530283110300e060355040a130741636d6520436f311430120603550403130b736e69746573742e636f6d301e170d3132303431313137343033355a170d3133303431313137343533355a30283110300e060355040a130741636d6520436f311430120603550403130b736e69746573742e636f6d30819d300b06092a864886f70d01010103818d0030818902818100bb79d6f517b5e5bf4610d0dc69bee62b07435ad0032d8a7a4385b71452e7a5654c2c78b8238cb5b482e5de1f953b7e62a52ca533d6fe125c7a56fcf506bffa587b263fb5cd04d3d0c921964ac7f4549f5abfef427100fe1899077f7e887d7df10439c4a22edb51c97ce3c04c3b326601cfafb11db8719a1ddbdb896baeda2d790203010001a3323030300e0603551d0f0101ff0404030200a0300d0603551d0e0406040401020304300f0603551d2304083006800401020304300b06092a864886f70d0101050381810089c6455f1c1f5ef8eb1ab174ee2439059f5c4259bb1a8d86cdb1d056f56a717da40e95ab90f59e8deaf627c157995094db0802266eb34fc6842dea8a4b68d9c1389103ab84fb9e1f85d9b5d23ff2312c8670fbb540148245a4ebafe264d90c8a4cf4f85b0fac12ac2fc4a3154bad52462868af96c62c6525d652b6e31845bdcc")
-
-var testRSAPrivateKey = &rsa.PrivateKey{
-	PublicKey: rsa.PublicKey{
-		N: bigFromString("123260960069105588390096594560395120585636206567569540256061833976822892593755073841963170165000086278069699238754008398039246547214989242849418349143232951701395321381739566687846006911427966669790845430647688107009232778985142860108863460556510585049041936029324503323373417214453307648498561956908810892027L"),
-		E: 65537,
-	},
-	D: bigFromString("73196363031103823625826315929954946106043759818067219550565550066527203472294428548476778865091068522665312037075674791871635825938217363523103946045078950060973913307430314113074463630778799389010335923241901501086246276485964417618981733827707048660375428006201525399194575538037883519254056917253456403553L"),
-	Primes: []*big.Int{
-		bigFromString("11157426355495284553529769521954035649776033703833034489026848970480272318436419662860715175517581249375929775774910501512841707465207184924996975125010787L"),
-		bigFromString("11047436580963564307160117670964629323534448585520694947919342920137706075617545637058809770319843170934495909554506529982972972247390145716507031692656521L"),
-	},
-}
-
-var testECDSAPrivateKey = &ecdsa.PrivateKey{
-	PublicKey: ecdsa.PublicKey{
-		Curve: elliptic.P521(),
-		X:     bigFromString("2636411247892461147287360222306590634450676461695221912739908880441342231985950069527906976759812296359387337367668045707086543273113073382714101597903639351"),
-		Y:     bigFromString("3204695818431246682253994090650952614555094516658732116404513121125038617915183037601737180082382202488628239201196033284060130040574800684774115478859677243"),
-	},
-	D: bigFromString("5477294338614160138026852784385529180817726002953041720191098180813046231640184669647735805135001309477695746518160084669446643325196003346204701381388769751"),
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/handshake_test.go b/third_party/gofrontend/libgo/go/crypto/tls/handshake_test.go
deleted file mode 100644
index f95f274..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/handshake_test.go
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"bufio"
-	"encoding/hex"
-	"errors"
-	"flag"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net"
-	"strconv"
-	"strings"
-	"sync"
-)
-
-// TLS reference tests run a connection against a reference implementation
-// (OpenSSL) of TLS and record the bytes of the resulting connection. The Go
-// code, during a test, is configured with deterministic randomness and so the
-// reference test can be reproduced exactly in the future.
-//
-// In order to save everyone who wishes to run the tests from needing the
-// reference implementation installed, the reference connections are saved in
-// files in the testdata directory. Thus running the tests involves nothing
-// external, but creating and updating them requires the reference
-// implementation.
-//
-// Tests can be updated by running them with the -update flag. This will cause
-// the test files. Generally one should combine the -update flag with -test.run
-// to updated a specific test. Since the reference implementation will always
-// generate fresh random numbers, large parts of the reference connection will
-// always change.
-
-var update = flag.Bool("update", false, "update golden files on disk")
-
-// recordingConn is a net.Conn that records the traffic that passes through it.
-// WriteTo can be used to produce output that can be later be loaded with
-// ParseTestData.
-type recordingConn struct {
-	net.Conn
-	sync.Mutex
-	flows   [][]byte
-	reading bool
-}
-
-func (r *recordingConn) Read(b []byte) (n int, err error) {
-	if n, err = r.Conn.Read(b); n == 0 {
-		return
-	}
-	b = b[:n]
-
-	r.Lock()
-	defer r.Unlock()
-
-	if l := len(r.flows); l == 0 || !r.reading {
-		buf := make([]byte, len(b))
-		copy(buf, b)
-		r.flows = append(r.flows, buf)
-	} else {
-		r.flows[l-1] = append(r.flows[l-1], b[:n]...)
-	}
-	r.reading = true
-	return
-}
-
-func (r *recordingConn) Write(b []byte) (n int, err error) {
-	if n, err = r.Conn.Write(b); n == 0 {
-		return
-	}
-	b = b[:n]
-
-	r.Lock()
-	defer r.Unlock()
-
-	if l := len(r.flows); l == 0 || r.reading {
-		buf := make([]byte, len(b))
-		copy(buf, b)
-		r.flows = append(r.flows, buf)
-	} else {
-		r.flows[l-1] = append(r.flows[l-1], b[:n]...)
-	}
-	r.reading = false
-	return
-}
-
-// WriteTo writes Go source code to w that contains the recorded traffic.
-func (r *recordingConn) WriteTo(w io.Writer) {
-	// TLS always starts with a client to server flow.
-	clientToServer := true
-
-	for i, flow := range r.flows {
-		source, dest := "client", "server"
-		if !clientToServer {
-			source, dest = dest, source
-		}
-		fmt.Fprintf(w, ">>> Flow %d (%s to %s)\n", i+1, source, dest)
-		dumper := hex.Dumper(w)
-		dumper.Write(flow)
-		dumper.Close()
-		clientToServer = !clientToServer
-	}
-}
-
-func parseTestData(r io.Reader) (flows [][]byte, err error) {
-	var currentFlow []byte
-
-	scanner := bufio.NewScanner(r)
-	for scanner.Scan() {
-		line := scanner.Text()
-		// If the line starts with ">>> " then it marks the beginning
-		// of a new flow.
-		if strings.HasPrefix(line, ">>> ") {
-			if len(currentFlow) > 0 || len(flows) > 0 {
-				flows = append(flows, currentFlow)
-				currentFlow = nil
-			}
-			continue
-		}
-
-		// Otherwise the line is a line of hex dump that looks like:
-		// 00000170  fc f5 06 bf (...)  |.....X{&?......!|
-		// (Some bytes have been omitted from the middle section.)
-
-		if i := strings.IndexByte(line, ' '); i >= 0 {
-			line = line[i:]
-		} else {
-			return nil, errors.New("invalid test data")
-		}
-
-		if i := strings.IndexByte(line, '|'); i >= 0 {
-			line = line[:i]
-		} else {
-			return nil, errors.New("invalid test data")
-		}
-
-		hexBytes := strings.Fields(line)
-		for _, hexByte := range hexBytes {
-			val, err := strconv.ParseUint(hexByte, 16, 8)
-			if err != nil {
-				return nil, errors.New("invalid hex byte in test data: " + err.Error())
-			}
-			currentFlow = append(currentFlow, byte(val))
-		}
-	}
-
-	if len(currentFlow) > 0 {
-		flows = append(flows, currentFlow)
-	}
-
-	return flows, nil
-}
-
-// tempFile creates a temp file containing contents and returns its path.
-func tempFile(contents string) string {
-	file, err := ioutil.TempFile("", "go-tls-test")
-	if err != nil {
-		panic("failed to create temp file: " + err.Error())
-	}
-	path := file.Name()
-	file.WriteString(contents)
-	file.Close()
-	return path
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/key_agreement.go b/third_party/gofrontend/libgo/go/crypto/tls/key_agreement.go
deleted file mode 100644
index 0e6a7c2..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/key_agreement.go
+++ /dev/null
@@ -1,405 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"crypto"
-	"crypto/ecdsa"
-	"crypto/elliptic"
-	"crypto/md5"
-	"crypto/rsa"
-	"crypto/sha1"
-	"crypto/x509"
-	"encoding/asn1"
-	"errors"
-	"io"
-	"math/big"
-)
-
-var errClientKeyExchange = errors.New("tls: invalid ClientKeyExchange message")
-var errServerKeyExchange = errors.New("tls: invalid ServerKeyExchange message")
-
-// rsaKeyAgreement implements the standard TLS key agreement where the client
-// encrypts the pre-master secret to the server's public key.
-type rsaKeyAgreement struct{}
-
-func (ka rsaKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
-	return nil, nil
-}
-
-func (ka rsaKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
-	if len(ckx.ciphertext) < 2 {
-		return nil, errClientKeyExchange
-	}
-
-	ciphertext := ckx.ciphertext
-	if version != VersionSSL30 {
-		ciphertextLen := int(ckx.ciphertext[0])<<8 | int(ckx.ciphertext[1])
-		if ciphertextLen != len(ckx.ciphertext)-2 {
-			return nil, errClientKeyExchange
-		}
-		ciphertext = ckx.ciphertext[2:]
-	}
-	priv, ok := cert.PrivateKey.(crypto.Decrypter)
-	if !ok {
-		return nil, errors.New("tls: certificate private key does not implement crypto.Decrypter")
-	}
-	// Perform constant time RSA PKCS#1 v1.5 decryption
-	preMasterSecret, err := priv.Decrypt(config.rand(), ciphertext, &rsa.PKCS1v15DecryptOptions{SessionKeyLen: 48})
-	if err != nil {
-		return nil, err
-	}
-	// We don't check the version number in the premaster secret.  For one,
-	// by checking it, we would leak information about the validity of the
-	// encrypted pre-master secret. Secondly, it provides only a small
-	// benefit against a downgrade attack and some implementations send the
-	// wrong version anyway. See the discussion at the end of section
-	// 7.4.7.1 of RFC 4346.
-	return preMasterSecret, nil
-}
-
-func (ka rsaKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
-	return errors.New("tls: unexpected ServerKeyExchange")
-}
-
-func (ka rsaKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
-	preMasterSecret := make([]byte, 48)
-	preMasterSecret[0] = byte(clientHello.vers >> 8)
-	preMasterSecret[1] = byte(clientHello.vers)
-	_, err := io.ReadFull(config.rand(), preMasterSecret[2:])
-	if err != nil {
-		return nil, nil, err
-	}
-
-	encrypted, err := rsa.EncryptPKCS1v15(config.rand(), cert.PublicKey.(*rsa.PublicKey), preMasterSecret)
-	if err != nil {
-		return nil, nil, err
-	}
-	ckx := new(clientKeyExchangeMsg)
-	ckx.ciphertext = make([]byte, len(encrypted)+2)
-	ckx.ciphertext[0] = byte(len(encrypted) >> 8)
-	ckx.ciphertext[1] = byte(len(encrypted))
-	copy(ckx.ciphertext[2:], encrypted)
-	return preMasterSecret, ckx, nil
-}
-
-// sha1Hash calculates a SHA1 hash over the given byte slices.
-func sha1Hash(slices [][]byte) []byte {
-	hsha1 := sha1.New()
-	for _, slice := range slices {
-		hsha1.Write(slice)
-	}
-	return hsha1.Sum(nil)
-}
-
-// md5SHA1Hash implements TLS 1.0's hybrid hash function which consists of the
-// concatenation of an MD5 and SHA1 hash.
-func md5SHA1Hash(slices [][]byte) []byte {
-	md5sha1 := make([]byte, md5.Size+sha1.Size)
-	hmd5 := md5.New()
-	for _, slice := range slices {
-		hmd5.Write(slice)
-	}
-	copy(md5sha1, hmd5.Sum(nil))
-	copy(md5sha1[md5.Size:], sha1Hash(slices))
-	return md5sha1
-}
-
-// hashForServerKeyExchange hashes the given slices and returns their digest
-// and the identifier of the hash function used. The sigAndHash argument is
-// only used for >= TLS 1.2 and precisely identifies the hash function to use.
-func hashForServerKeyExchange(sigAndHash signatureAndHash, version uint16, slices ...[]byte) ([]byte, crypto.Hash, error) {
-	if version >= VersionTLS12 {
-		if !isSupportedSignatureAndHash(sigAndHash, supportedSignatureAlgorithms) {
-			return nil, crypto.Hash(0), errors.New("tls: unsupported hash function used by peer")
-		}
-		hashFunc, err := lookupTLSHash(sigAndHash.hash)
-		if err != nil {
-			return nil, crypto.Hash(0), err
-		}
-		h := hashFunc.New()
-		for _, slice := range slices {
-			h.Write(slice)
-		}
-		digest := h.Sum(nil)
-		return digest, hashFunc, nil
-	}
-	if sigAndHash.signature == signatureECDSA {
-		return sha1Hash(slices), crypto.SHA1, nil
-	}
-	return md5SHA1Hash(slices), crypto.MD5SHA1, nil
-}
-
-// pickTLS12HashForSignature returns a TLS 1.2 hash identifier for signing a
-// ServerKeyExchange given the signature type being used and the client's
-// advertised list of supported signature and hash combinations.
-func pickTLS12HashForSignature(sigType uint8, clientList []signatureAndHash) (uint8, error) {
-	if len(clientList) == 0 {
-		// If the client didn't specify any signature_algorithms
-		// extension then we can assume that it supports SHA1. See
-		// http://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
-		return hashSHA1, nil
-	}
-
-	for _, sigAndHash := range clientList {
-		if sigAndHash.signature != sigType {
-			continue
-		}
-		if isSupportedSignatureAndHash(sigAndHash, supportedSignatureAlgorithms) {
-			return sigAndHash.hash, nil
-		}
-	}
-
-	return 0, errors.New("tls: client doesn't support any common hash functions")
-}
-
-func curveForCurveID(id CurveID) (elliptic.Curve, bool) {
-	switch id {
-	case CurveP256:
-		return elliptic.P256(), true
-	case CurveP384:
-		return elliptic.P384(), true
-	case CurveP521:
-		return elliptic.P521(), true
-	default:
-		return nil, false
-	}
-
-}
-
-// ecdheRSAKeyAgreement implements a TLS key agreement where the server
-// generates a ephemeral EC public/private key pair and signs it. The
-// pre-master secret is then calculated using ECDH. The signature may
-// either be ECDSA or RSA.
-type ecdheKeyAgreement struct {
-	version    uint16
-	sigType    uint8
-	privateKey []byte
-	curve      elliptic.Curve
-	x, y       *big.Int
-}
-
-func (ka *ecdheKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
-	var curveid CurveID
-	preferredCurves := config.curvePreferences()
-
-NextCandidate:
-	for _, candidate := range preferredCurves {
-		for _, c := range clientHello.supportedCurves {
-			if candidate == c {
-				curveid = c
-				break NextCandidate
-			}
-		}
-	}
-
-	if curveid == 0 {
-		return nil, errors.New("tls: no supported elliptic curves offered")
-	}
-
-	var ok bool
-	if ka.curve, ok = curveForCurveID(curveid); !ok {
-		return nil, errors.New("tls: preferredCurves includes unsupported curve")
-	}
-
-	var x, y *big.Int
-	var err error
-	ka.privateKey, x, y, err = elliptic.GenerateKey(ka.curve, config.rand())
-	if err != nil {
-		return nil, err
-	}
-	ecdhePublic := elliptic.Marshal(ka.curve, x, y)
-
-	// http://tools.ietf.org/html/rfc4492#section-5.4
-	serverECDHParams := make([]byte, 1+2+1+len(ecdhePublic))
-	serverECDHParams[0] = 3 // named curve
-	serverECDHParams[1] = byte(curveid >> 8)
-	serverECDHParams[2] = byte(curveid)
-	serverECDHParams[3] = byte(len(ecdhePublic))
-	copy(serverECDHParams[4:], ecdhePublic)
-
-	sigAndHash := signatureAndHash{signature: ka.sigType}
-
-	if ka.version >= VersionTLS12 {
-		if sigAndHash.hash, err = pickTLS12HashForSignature(ka.sigType, clientHello.signatureAndHashes); err != nil {
-			return nil, err
-		}
-	}
-
-	digest, hashFunc, err := hashForServerKeyExchange(sigAndHash, ka.version, clientHello.random, hello.random, serverECDHParams)
-	if err != nil {
-		return nil, err
-	}
-
-	priv, ok := cert.PrivateKey.(crypto.Signer)
-	if !ok {
-		return nil, errors.New("tls: certificate private key does not implement crypto.Signer")
-	}
-	var sig []byte
-	switch ka.sigType {
-	case signatureECDSA:
-		_, ok := priv.Public().(*ecdsa.PublicKey)
-		if !ok {
-			return nil, errors.New("ECDHE ECDSA requires an ECDSA server key")
-		}
-	case signatureRSA:
-		_, ok := priv.Public().(*rsa.PublicKey)
-		if !ok {
-			return nil, errors.New("ECDHE RSA requires a RSA server key")
-		}
-	default:
-		return nil, errors.New("unknown ECDHE signature algorithm")
-	}
-	sig, err = priv.Sign(config.rand(), digest, hashFunc)
-	if err != nil {
-		return nil, errors.New("failed to sign ECDHE parameters: " + err.Error())
-	}
-
-	skx := new(serverKeyExchangeMsg)
-	sigAndHashLen := 0
-	if ka.version >= VersionTLS12 {
-		sigAndHashLen = 2
-	}
-	skx.key = make([]byte, len(serverECDHParams)+sigAndHashLen+2+len(sig))
-	copy(skx.key, serverECDHParams)
-	k := skx.key[len(serverECDHParams):]
-	if ka.version >= VersionTLS12 {
-		k[0] = sigAndHash.hash
-		k[1] = sigAndHash.signature
-		k = k[2:]
-	}
-	k[0] = byte(len(sig) >> 8)
-	k[1] = byte(len(sig))
-	copy(k[2:], sig)
-
-	return skx, nil
-}
-
-func (ka *ecdheKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
-	if len(ckx.ciphertext) == 0 || int(ckx.ciphertext[0]) != len(ckx.ciphertext)-1 {
-		return nil, errClientKeyExchange
-	}
-	x, y := elliptic.Unmarshal(ka.curve, ckx.ciphertext[1:])
-	if x == nil {
-		return nil, errClientKeyExchange
-	}
-	if !ka.curve.IsOnCurve(x, y) {
-		return nil, errClientKeyExchange
-	}
-	x, _ = ka.curve.ScalarMult(x, y, ka.privateKey)
-	preMasterSecret := make([]byte, (ka.curve.Params().BitSize+7)>>3)
-	xBytes := x.Bytes()
-	copy(preMasterSecret[len(preMasterSecret)-len(xBytes):], xBytes)
-
-	return preMasterSecret, nil
-}
-
-func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
-	if len(skx.key) < 4 {
-		return errServerKeyExchange
-	}
-	if skx.key[0] != 3 { // named curve
-		return errors.New("tls: server selected unsupported curve")
-	}
-	curveid := CurveID(skx.key[1])<<8 | CurveID(skx.key[2])
-
-	var ok bool
-	if ka.curve, ok = curveForCurveID(curveid); !ok {
-		return errors.New("tls: server selected unsupported curve")
-	}
-
-	publicLen := int(skx.key[3])
-	if publicLen+4 > len(skx.key) {
-		return errServerKeyExchange
-	}
-	ka.x, ka.y = elliptic.Unmarshal(ka.curve, skx.key[4:4+publicLen])
-	if ka.x == nil {
-		return errServerKeyExchange
-	}
-	if !ka.curve.IsOnCurve(ka.x, ka.y) {
-		return errServerKeyExchange
-	}
-	serverECDHParams := skx.key[:4+publicLen]
-
-	sig := skx.key[4+publicLen:]
-	if len(sig) < 2 {
-		return errServerKeyExchange
-	}
-
-	sigAndHash := signatureAndHash{signature: ka.sigType}
-	if ka.version >= VersionTLS12 {
-		// handle SignatureAndHashAlgorithm
-		sigAndHash = signatureAndHash{hash: sig[0], signature: sig[1]}
-		if sigAndHash.signature != ka.sigType {
-			return errServerKeyExchange
-		}
-		sig = sig[2:]
-		if len(sig) < 2 {
-			return errServerKeyExchange
-		}
-	}
-	sigLen := int(sig[0])<<8 | int(sig[1])
-	if sigLen+2 != len(sig) {
-		return errServerKeyExchange
-	}
-	sig = sig[2:]
-
-	digest, hashFunc, err := hashForServerKeyExchange(sigAndHash, ka.version, clientHello.random, serverHello.random, serverECDHParams)
-	if err != nil {
-		return err
-	}
-	switch ka.sigType {
-	case signatureECDSA:
-		pubKey, ok := cert.PublicKey.(*ecdsa.PublicKey)
-		if !ok {
-			return errors.New("ECDHE ECDSA requires a ECDSA server public key")
-		}
-		ecdsaSig := new(ecdsaSignature)
-		if _, err := asn1.Unmarshal(sig, ecdsaSig); err != nil {
-			return err
-		}
-		if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
-			return errors.New("ECDSA signature contained zero or negative values")
-		}
-		if !ecdsa.Verify(pubKey, digest, ecdsaSig.R, ecdsaSig.S) {
-			return errors.New("ECDSA verification failure")
-		}
-	case signatureRSA:
-		pubKey, ok := cert.PublicKey.(*rsa.PublicKey)
-		if !ok {
-			return errors.New("ECDHE RSA requires a RSA server public key")
-		}
-		if err := rsa.VerifyPKCS1v15(pubKey, hashFunc, digest, sig); err != nil {
-			return err
-		}
-	default:
-		return errors.New("unknown ECDHE signature algorithm")
-	}
-
-	return nil
-}
-
-func (ka *ecdheKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
-	if ka.curve == nil {
-		return nil, nil, errors.New("missing ServerKeyExchange message")
-	}
-	priv, mx, my, err := elliptic.GenerateKey(ka.curve, config.rand())
-	if err != nil {
-		return nil, nil, err
-	}
-	x, _ := ka.curve.ScalarMult(ka.x, ka.y, priv)
-	preMasterSecret := make([]byte, (ka.curve.Params().BitSize+7)>>3)
-	xBytes := x.Bytes()
-	copy(preMasterSecret[len(preMasterSecret)-len(xBytes):], xBytes)
-
-	serialized := elliptic.Marshal(ka.curve, mx, my)
-
-	ckx := new(clientKeyExchangeMsg)
-	ckx.ciphertext = make([]byte, 1+len(serialized))
-	ckx.ciphertext[0] = byte(len(serialized))
-	copy(ckx.ciphertext[1:], serialized)
-
-	return preMasterSecret, ckx, nil
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/prf.go b/third_party/gofrontend/libgo/go/crypto/tls/prf.go
deleted file mode 100644
index 6127c1c..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/prf.go
+++ /dev/null
@@ -1,367 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"crypto"
-	"crypto/hmac"
-	"crypto/md5"
-	"crypto/sha1"
-	"crypto/sha256"
-	"crypto/sha512"
-	"errors"
-	"hash"
-)
-
-// Split a premaster secret in two as specified in RFC 4346, section 5.
-func splitPreMasterSecret(secret []byte) (s1, s2 []byte) {
-	s1 = secret[0 : (len(secret)+1)/2]
-	s2 = secret[len(secret)/2:]
-	return
-}
-
-// pHash implements the P_hash function, as defined in RFC 4346, section 5.
-func pHash(result, secret, seed []byte, hash func() hash.Hash) {
-	h := hmac.New(hash, secret)
-	h.Write(seed)
-	a := h.Sum(nil)
-
-	j := 0
-	for j < len(result) {
-		h.Reset()
-		h.Write(a)
-		h.Write(seed)
-		b := h.Sum(nil)
-		todo := len(b)
-		if j+todo > len(result) {
-			todo = len(result) - j
-		}
-		copy(result[j:j+todo], b)
-		j += todo
-
-		h.Reset()
-		h.Write(a)
-		a = h.Sum(nil)
-	}
-}
-
-// prf10 implements the TLS 1.0 pseudo-random function, as defined in RFC 2246, section 5.
-func prf10(result, secret, label, seed []byte) {
-	hashSHA1 := sha1.New
-	hashMD5 := md5.New
-
-	labelAndSeed := make([]byte, len(label)+len(seed))
-	copy(labelAndSeed, label)
-	copy(labelAndSeed[len(label):], seed)
-
-	s1, s2 := splitPreMasterSecret(secret)
-	pHash(result, s1, labelAndSeed, hashMD5)
-	result2 := make([]byte, len(result))
-	pHash(result2, s2, labelAndSeed, hashSHA1)
-
-	for i, b := range result2 {
-		result[i] ^= b
-	}
-}
-
-// prf12 implements the TLS 1.2 pseudo-random function, as defined in RFC 5246, section 5.
-func prf12(hashFunc func() hash.Hash) func(result, secret, label, seed []byte) {
-	return func(result, secret, label, seed []byte) {
-		labelAndSeed := make([]byte, len(label)+len(seed))
-		copy(labelAndSeed, label)
-		copy(labelAndSeed[len(label):], seed)
-
-		pHash(result, secret, labelAndSeed, hashFunc)
-	}
-}
-
-// prf30 implements the SSL 3.0 pseudo-random function, as defined in
-// www.mozilla.org/projects/security/pki/nss/ssl/draft302.txt section 6.
-func prf30(result, secret, label, seed []byte) {
-	hashSHA1 := sha1.New()
-	hashMD5 := md5.New()
-
-	done := 0
-	i := 0
-	// RFC5246 section 6.3 says that the largest PRF output needed is 128
-	// bytes. Since no more ciphersuites will be added to SSLv3, this will
-	// remain true. Each iteration gives us 16 bytes so 10 iterations will
-	// be sufficient.
-	var b [11]byte
-	for done < len(result) {
-		for j := 0; j <= i; j++ {
-			b[j] = 'A' + byte(i)
-		}
-
-		hashSHA1.Reset()
-		hashSHA1.Write(b[:i+1])
-		hashSHA1.Write(secret)
-		hashSHA1.Write(seed)
-		digest := hashSHA1.Sum(nil)
-
-		hashMD5.Reset()
-		hashMD5.Write(secret)
-		hashMD5.Write(digest)
-
-		done += copy(result[done:], hashMD5.Sum(nil))
-		i++
-	}
-}
-
-const (
-	tlsRandomLength      = 32 // Length of a random nonce in TLS 1.1.
-	masterSecretLength   = 48 // Length of a master secret in TLS 1.1.
-	finishedVerifyLength = 12 // Length of verify_data in a Finished message.
-)
-
-var masterSecretLabel = []byte("master secret")
-var keyExpansionLabel = []byte("key expansion")
-var clientFinishedLabel = []byte("client finished")
-var serverFinishedLabel = []byte("server finished")
-
-func prfAndHashForVersion(version uint16, suite *cipherSuite) (func(result, secret, label, seed []byte), crypto.Hash) {
-	switch version {
-	case VersionSSL30:
-		return prf30, crypto.Hash(0)
-	case VersionTLS10, VersionTLS11:
-		return prf10, crypto.Hash(0)
-	case VersionTLS12:
-		if suite.flags&suiteSHA384 != 0 {
-			return prf12(sha512.New384), crypto.SHA384
-		}
-		return prf12(sha256.New), crypto.SHA256
-	default:
-		panic("unknown version")
-	}
-}
-
-func prfForVersion(version uint16, suite *cipherSuite) func(result, secret, label, seed []byte) {
-	prf, _ := prfAndHashForVersion(version, suite)
-	return prf
-}
-
-// masterFromPreMasterSecret generates the master secret from the pre-master
-// secret. See http://tools.ietf.org/html/rfc5246#section-8.1
-func masterFromPreMasterSecret(version uint16, suite *cipherSuite, preMasterSecret, clientRandom, serverRandom []byte) []byte {
-	var seed [tlsRandomLength * 2]byte
-	copy(seed[0:len(clientRandom)], clientRandom)
-	copy(seed[len(clientRandom):], serverRandom)
-	masterSecret := make([]byte, masterSecretLength)
-	prfForVersion(version, suite)(masterSecret, preMasterSecret, masterSecretLabel, seed[0:])
-	return masterSecret
-}
-
-// keysFromMasterSecret generates the connection keys from the master
-// secret, given the lengths of the MAC key, cipher key and IV, as defined in
-// RFC 2246, section 6.3.
-func keysFromMasterSecret(version uint16, suite *cipherSuite, masterSecret, clientRandom, serverRandom []byte, macLen, keyLen, ivLen int) (clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV []byte) {
-	var seed [tlsRandomLength * 2]byte
-	copy(seed[0:len(clientRandom)], serverRandom)
-	copy(seed[len(serverRandom):], clientRandom)
-
-	n := 2*macLen + 2*keyLen + 2*ivLen
-	keyMaterial := make([]byte, n)
-	prfForVersion(version, suite)(keyMaterial, masterSecret, keyExpansionLabel, seed[0:])
-	clientMAC = keyMaterial[:macLen]
-	keyMaterial = keyMaterial[macLen:]
-	serverMAC = keyMaterial[:macLen]
-	keyMaterial = keyMaterial[macLen:]
-	clientKey = keyMaterial[:keyLen]
-	keyMaterial = keyMaterial[keyLen:]
-	serverKey = keyMaterial[:keyLen]
-	keyMaterial = keyMaterial[keyLen:]
-	clientIV = keyMaterial[:ivLen]
-	keyMaterial = keyMaterial[ivLen:]
-	serverIV = keyMaterial[:ivLen]
-	return
-}
-
-// lookupTLSHash looks up the corresponding crypto.Hash for a given
-// TLS hash identifier.
-func lookupTLSHash(hash uint8) (crypto.Hash, error) {
-	switch hash {
-	case hashSHA1:
-		return crypto.SHA1, nil
-	case hashSHA256:
-		return crypto.SHA256, nil
-	case hashSHA384:
-		return crypto.SHA384, nil
-	default:
-		return 0, errors.New("tls: unsupported hash algorithm")
-	}
-}
-
-func newFinishedHash(version uint16, cipherSuite *cipherSuite) finishedHash {
-	var buffer []byte
-	if version == VersionSSL30 || version >= VersionTLS12 {
-		buffer = []byte{}
-	}
-
-	prf, hash := prfAndHashForVersion(version, cipherSuite)
-	if hash != 0 {
-		return finishedHash{hash.New(), hash.New(), nil, nil, buffer, version, prf}
-	}
-
-	return finishedHash{sha1.New(), sha1.New(), md5.New(), md5.New(), buffer, version, prf}
-}
-
-// A finishedHash calculates the hash of a set of handshake messages suitable
-// for including in a Finished message.
-type finishedHash struct {
-	client hash.Hash
-	server hash.Hash
-
-	// Prior to TLS 1.2, an additional MD5 hash is required.
-	clientMD5 hash.Hash
-	serverMD5 hash.Hash
-
-	// In TLS 1.2, a full buffer is sadly required.
-	buffer []byte
-
-	version uint16
-	prf     func(result, secret, label, seed []byte)
-}
-
-func (h *finishedHash) Write(msg []byte) (n int, err error) {
-	h.client.Write(msg)
-	h.server.Write(msg)
-
-	if h.version < VersionTLS12 {
-		h.clientMD5.Write(msg)
-		h.serverMD5.Write(msg)
-	}
-
-	if h.buffer != nil {
-		h.buffer = append(h.buffer, msg...)
-	}
-
-	return len(msg), nil
-}
-
-func (h finishedHash) Sum() []byte {
-	if h.version >= VersionTLS12 {
-		return h.client.Sum(nil)
-	}
-
-	out := make([]byte, 0, md5.Size+sha1.Size)
-	out = h.clientMD5.Sum(out)
-	return h.client.Sum(out)
-}
-
-// finishedSum30 calculates the contents of the verify_data member of a SSLv3
-// Finished message given the MD5 and SHA1 hashes of a set of handshake
-// messages.
-func finishedSum30(md5, sha1 hash.Hash, masterSecret []byte, magic []byte) []byte {
-	md5.Write(magic)
-	md5.Write(masterSecret)
-	md5.Write(ssl30Pad1[:])
-	md5Digest := md5.Sum(nil)
-
-	md5.Reset()
-	md5.Write(masterSecret)
-	md5.Write(ssl30Pad2[:])
-	md5.Write(md5Digest)
-	md5Digest = md5.Sum(nil)
-
-	sha1.Write(magic)
-	sha1.Write(masterSecret)
-	sha1.Write(ssl30Pad1[:40])
-	sha1Digest := sha1.Sum(nil)
-
-	sha1.Reset()
-	sha1.Write(masterSecret)
-	sha1.Write(ssl30Pad2[:40])
-	sha1.Write(sha1Digest)
-	sha1Digest = sha1.Sum(nil)
-
-	ret := make([]byte, len(md5Digest)+len(sha1Digest))
-	copy(ret, md5Digest)
-	copy(ret[len(md5Digest):], sha1Digest)
-	return ret
-}
-
-var ssl3ClientFinishedMagic = [4]byte{0x43, 0x4c, 0x4e, 0x54}
-var ssl3ServerFinishedMagic = [4]byte{0x53, 0x52, 0x56, 0x52}
-
-// clientSum returns the contents of the verify_data member of a client's
-// Finished message.
-func (h finishedHash) clientSum(masterSecret []byte) []byte {
-	if h.version == VersionSSL30 {
-		return finishedSum30(h.clientMD5, h.client, masterSecret, ssl3ClientFinishedMagic[:])
-	}
-
-	out := make([]byte, finishedVerifyLength)
-	h.prf(out, masterSecret, clientFinishedLabel, h.Sum())
-	return out
-}
-
-// serverSum returns the contents of the verify_data member of a server's
-// Finished message.
-func (h finishedHash) serverSum(masterSecret []byte) []byte {
-	if h.version == VersionSSL30 {
-		return finishedSum30(h.serverMD5, h.server, masterSecret, ssl3ServerFinishedMagic[:])
-	}
-
-	out := make([]byte, finishedVerifyLength)
-	h.prf(out, masterSecret, serverFinishedLabel, h.Sum())
-	return out
-}
-
-// selectClientCertSignatureAlgorithm returns a signatureAndHash to sign a
-// client's CertificateVerify with, or an error if none can be found.
-func (h finishedHash) selectClientCertSignatureAlgorithm(serverList []signatureAndHash, sigType uint8) (signatureAndHash, error) {
-	if h.version < VersionTLS12 {
-		// Nothing to negotiate before TLS 1.2.
-		return signatureAndHash{signature: sigType}, nil
-	}
-
-	for _, v := range serverList {
-		if v.signature == sigType && isSupportedSignatureAndHash(v, supportedSignatureAlgorithms) {
-			return v, nil
-		}
-	}
-	return signatureAndHash{}, errors.New("tls: no supported signature algorithm found for signing client certificate")
-}
-
-// hashForClientCertificate returns a digest, hash function, and TLS 1.2 hash
-// id suitable for signing by a TLS client certificate.
-func (h finishedHash) hashForClientCertificate(signatureAndHash signatureAndHash, masterSecret []byte) ([]byte, crypto.Hash, error) {
-	if (h.version == VersionSSL30 || h.version >= VersionTLS12) && h.buffer == nil {
-		panic("a handshake hash for a client-certificate was requested after discarding the handshake buffer")
-	}
-
-	if h.version == VersionSSL30 {
-		if signatureAndHash.signature != signatureRSA {
-			return nil, 0, errors.New("tls: unsupported signature type for client certificate")
-		}
-
-		md5Hash := md5.New()
-		md5Hash.Write(h.buffer)
-		sha1Hash := sha1.New()
-		sha1Hash.Write(h.buffer)
-		return finishedSum30(md5Hash, sha1Hash, masterSecret, nil), crypto.MD5SHA1, nil
-	}
-	if h.version >= VersionTLS12 {
-		hashAlg, err := lookupTLSHash(signatureAndHash.hash)
-		if err != nil {
-			return nil, 0, err
-		}
-		hash := hashAlg.New()
-		hash.Write(h.buffer)
-		return hash.Sum(nil), hashAlg, nil
-	}
-
-	if signatureAndHash.signature == signatureECDSA {
-		return h.server.Sum(nil), crypto.SHA1, nil
-	}
-
-	return h.Sum(), crypto.MD5SHA1, nil
-}
-
-// discardHandshakeBuffer is called when there is no more need to
-// buffer the entirety of the handshake messages.
-func (h *finishedHash) discardHandshakeBuffer() {
-	h.buffer = nil
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/prf_test.go b/third_party/gofrontend/libgo/go/crypto/tls/prf_test.go
deleted file mode 100644
index 0a1b1bc..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/prf_test.go
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"encoding/hex"
-	"testing"
-)
-
-type testSplitPreMasterSecretTest struct {
-	in, out1, out2 string
-}
-
-var testSplitPreMasterSecretTests = []testSplitPreMasterSecretTest{
-	{"", "", ""},
-	{"00", "00", "00"},
-	{"0011", "00", "11"},
-	{"001122", "0011", "1122"},
-	{"00112233", "0011", "2233"},
-}
-
-func TestSplitPreMasterSecret(t *testing.T) {
-	for i, test := range testSplitPreMasterSecretTests {
-		in, _ := hex.DecodeString(test.in)
-		out1, out2 := splitPreMasterSecret(in)
-		s1 := hex.EncodeToString(out1)
-		s2 := hex.EncodeToString(out2)
-		if s1 != test.out1 || s2 != test.out2 {
-			t.Errorf("#%d: got: (%s, %s) want: (%s, %s)", i, s1, s2, test.out1, test.out2)
-		}
-	}
-}
-
-type testKeysFromTest struct {
-	version                    uint16
-	suite                      *cipherSuite
-	preMasterSecret            string
-	clientRandom, serverRandom string
-	masterSecret               string
-	clientMAC, serverMAC       string
-	clientKey, serverKey       string
-	macLen, keyLen             int
-}
-
-func TestKeysFromPreMasterSecret(t *testing.T) {
-	for i, test := range testKeysFromTests {
-		in, _ := hex.DecodeString(test.preMasterSecret)
-		clientRandom, _ := hex.DecodeString(test.clientRandom)
-		serverRandom, _ := hex.DecodeString(test.serverRandom)
-
-		masterSecret := masterFromPreMasterSecret(test.version, test.suite, in, clientRandom, serverRandom)
-		if s := hex.EncodeToString(masterSecret); s != test.masterSecret {
-			t.Errorf("#%d: bad master secret %s, want %s", i, s, test.masterSecret)
-			continue
-		}
-
-		clientMAC, serverMAC, clientKey, serverKey, _, _ := keysFromMasterSecret(test.version, test.suite, masterSecret, clientRandom, serverRandom, test.macLen, test.keyLen, 0)
-		clientMACString := hex.EncodeToString(clientMAC)
-		serverMACString := hex.EncodeToString(serverMAC)
-		clientKeyString := hex.EncodeToString(clientKey)
-		serverKeyString := hex.EncodeToString(serverKey)
-		if clientMACString != test.clientMAC ||
-			serverMACString != test.serverMAC ||
-			clientKeyString != test.clientKey ||
-			serverKeyString != test.serverKey {
-			t.Errorf("#%d: got: (%s, %s, %s, %s) want: (%s, %s, %s, %s)", i, clientMACString, serverMACString, clientKeyString, serverKeyString, test.clientMAC, test.serverMAC, test.clientKey, test.serverKey)
-		}
-	}
-}
-
-func cipherSuiteById(id uint16) *cipherSuite {
-	for _, cipherSuite := range cipherSuites {
-		if cipherSuite.id == id {
-			return cipherSuite
-		}
-	}
-	panic("ciphersuite not found")
-}
-
-// These test vectors were generated from GnuTLS using `gnutls-cli --insecure -d 9 `
-var testKeysFromTests = []testKeysFromTest{
-	{
-		VersionTLS10,
-		cipherSuiteById(TLS_RSA_WITH_RC4_128_SHA),
-		"0302cac83ad4b1db3b9ab49ad05957de2a504a634a386fc600889321e1a971f57479466830ac3e6f468e87f5385fa0c5",
-		"4ae66303755184a3917fcb44880605fcc53baa01912b22ed94473fc69cebd558",
-		"4ae663020ec16e6bb5130be918cfcafd4d765979a3136a5d50c593446e4e44db",
-		"3d851bab6e5556e959a16bc36d66cfae32f672bfa9ecdef6096cbb1b23472df1da63dbbd9827606413221d149ed08ceb",
-		"805aaa19b3d2c0a0759a4b6c9959890e08480119",
-		"2d22f9fe519c075c16448305ceee209fc24ad109",
-		"d50b5771244f850cd8117a9ccafe2cf1",
-		"e076e33206b30507a85c32855acd0919",
-		20,
-		16,
-	},
-	{
-		VersionTLS10,
-		cipherSuiteById(TLS_RSA_WITH_RC4_128_SHA),
-		"03023f7527316bc12cbcd69e4b9e8275d62c028f27e65c745cfcddc7ce01bd3570a111378b63848127f1c36e5f9e4890",
-		"4ae66364b5ea56b20ce4e25555aed2d7e67f42788dd03f3fee4adae0459ab106",
-		"4ae66363ab815cbf6a248b87d6b556184e945e9b97fbdf247858b0bdafacfa1c",
-		"7d64be7c80c59b740200b4b9c26d0baaa1c5ae56705acbcf2307fe62beb4728c19392c83f20483801cce022c77645460",
-		"97742ed60a0554ca13f04f97ee193177b971e3b0",
-		"37068751700400e03a8477a5c7eec0813ab9e0dc",
-		"207cddbc600d2a200abac6502053ee5c",
-		"df3f94f6e1eacc753b815fe16055cd43",
-		20,
-		16,
-	},
-	{
-		VersionTLS10,
-		cipherSuiteById(TLS_RSA_WITH_RC4_128_SHA),
-		"832d515f1d61eebb2be56ba0ef79879efb9b527504abb386fb4310ed5d0e3b1f220d3bb6b455033a2773e6d8bdf951d278a187482b400d45deb88a5d5a6bb7d6a7a1decc04eb9ef0642876cd4a82d374d3b6ff35f0351dc5d411104de431375355addc39bfb1f6329fb163b0bc298d658338930d07d313cd980a7e3d9196cac1",
-		"4ae663b2ee389c0de147c509d8f18f5052afc4aaf9699efe8cb05ece883d3a5e",
-		"4ae664d503fd4cff50cfc1fb8fc606580f87b0fcdac9554ba0e01d785bdf278e",
-		"1aff2e7a2c4279d0126f57a65a77a8d9d0087cf2733366699bec27eb53d5740705a8574bb1acc2abbe90e44f0dd28d6c",
-		"3c7647c93c1379a31a609542aa44e7f117a70085",
-		"0d73102994be74a575a3ead8532590ca32a526d4",
-		"ac7581b0b6c10d85bbd905ffbf36c65e",
-		"ff07edde49682b45466bd2e39464b306",
-		20,
-		16,
-	},
-	{
-		VersionSSL30,
-		cipherSuiteById(TLS_RSA_WITH_RC4_128_SHA),
-		"832d515f1d61eebb2be56ba0ef79879efb9b527504abb386fb4310ed5d0e3b1f220d3bb6b455033a2773e6d8bdf951d278a187482b400d45deb88a5d5a6bb7d6a7a1decc04eb9ef0642876cd4a82d374d3b6ff35f0351dc5d411104de431375355addc39bfb1f6329fb163b0bc298d658338930d07d313cd980a7e3d9196cac1",
-		"4ae663b2ee389c0de147c509d8f18f5052afc4aaf9699efe8cb05ece883d3a5e",
-		"4ae664d503fd4cff50cfc1fb8fc606580f87b0fcdac9554ba0e01d785bdf278e",
-		"a614863e56299dcffeea2938f22c2ba023768dbe4b3f6877bc9c346c6ae529b51d9cb87ff9695ea4d01f2205584405b2",
-		"2c450d5b6f6e2013ac6bea6a0b32200d4e1ffb94",
-		"7a7a7438769536f2fb1ae49a61f0703b79b2dc53",
-		"f8f6b26c10f12855c9aafb1e0e839ccf",
-		"2b9d4b4a60cb7f396780ebff50650419",
-		20,
-		16,
-	},
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-ECDSA b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-ECDSA
deleted file mode 100644
index 4bad786..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-ECDSA
+++ /dev/null
@@ -1,130 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 c0 e1 5c 5b 45  |....Y...U....\[E|
-00000010  70 fc a1 73 44 e7 69 b6  83 a1 71 bc 03 21 2e cc  |p..sD.i...q..!..|
-00000020  21 7a 28 20 82 6b 2f 77  7d 40 c7 20 0d e4 19 db  |!z( .k/w}@. ....|
-00000030  35 cd 75 a4 e7 e5 6c 3e  c9 d5 fe 9d c5 88 78 7b  |5.u...l>......x{|
-00000040  c4 fc 04 9a c1 10 7a 15  d9 e9 4a 95 c0 09 00 00  |......z...J.....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  01 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
-00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
-00000080  30 09 06 07 2a 86 48 ce  3d 04 01 30 45 31 0b 30  |0...*.H.=..0E1.0|
-00000090  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-000000a0  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-000000b0  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-000000c0  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-000000d0  74 64 30 1e 17 0d 31 32  31 31 32 32 31 35 30 36  |td0...1211221506|
-000000e0  33 32 5a 17 0d 32 32 31  31 32 30 31 35 30 36 33  |32Z..22112015063|
-000000f0  32 5a 30 45 31 0b 30 09  06 03 55 04 06 13 02 41  |2Z0E1.0...U....A|
-00000100  55 31 13 30 11 06 03 55  04 08 13 0a 53 6f 6d 65  |U1.0...U....Some|
-00000110  2d 53 74 61 74 65 31 21  30 1f 06 03 55 04 0a 13  |-State1!0...U...|
-00000120  18 49 6e 74 65 72 6e 65  74 20 57 69 64 67 69 74  |.Internet Widgit|
-00000130  73 20 50 74 79 20 4c 74  64 30 81 9b 30 10 06 07  |s Pty Ltd0..0...|
-00000140  2a 86 48 ce 3d 02 01 06  05 2b 81 04 00 23 03 81  |*.H.=....+...#..|
-00000150  86 00 04 00 c4 a1 ed be  98 f9 0b 48 73 36 7e c3  |...........Hs6~.|
-00000160  16 56 11 22 f2 3d 53 c3  3b 4d 21 3d cd 6b 75 e6  |.V.".=S.;M!=.ku.|
-00000170  f6 b0 dc 9a df 26 c1 bc  b2 87 f0 72 32 7c b3 64  |.....&.....r2|.d|
-00000180  2f 1c 90 bc ea 68 23 10  7e fe e3 25 c0 48 3a 69  |/....h#.~..%.H:i|
-00000190  e0 28 6d d3 37 00 ef 04  62 dd 0d a0 9c 70 62 83  |.(m.7...b....pb.|
-000001a0  d8 81 d3 64 31 aa 9e 97  31 bd 96 b0 68 c0 9b 23  |...d1...1...h..#|
-000001b0  de 76 64 3f 1a 5c 7f e9  12 0e 58 58 b6 5f 70 dd  |.vd?.\....XX._p.|
-000001c0  9b d8 ea d5 d7 f5 d5 cc  b9 b6 9f 30 66 5b 66 9a  |...........0f[f.|
-000001d0  20 e2 27 e5 bf fe 3b 30  09 06 07 2a 86 48 ce 3d  | .'...;0...*.H.=|
-000001e0  04 01 03 81 8c 00 30 81  88 02 42 01 88 a2 4f eb  |......0...B...O.|
-000001f0  e2 45 c5 48 7d 1b ac f5  ed 98 9d ae 47 70 c0 5e  |.E.H}.......Gp.^|
-00000200  1b b6 2f bd f1 b6 4d b7  61 40 d3 11 a2 ce ee 0b  |../...M.a@......|
-00000210  7e 92 7e ff 76 9d c3 3b  7e a5 3f ce fa 10 e2 59  |~.~.v..;~.?....Y|
-00000220  ec 47 2d 7c ac da 4e 97  0e 15 a0 6f d0 02 42 01  |.G-|..N....o..B.|
-00000230  4d fc be 67 13 9c 2d 05  0e bd 3f a3 8c 25 c1 33  |M..g..-...?..%.3|
-00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
-00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
-00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 01 00 d6 0c 00  00 d2 03 00 17 41 04 01  |*............A..|
-00000280  74 83 af 3a 65 7a ad 1a  63 1f 13 82 9d f4 de 06  |t..:ez..c.......|
-00000290  4e 3a 03 81 61 72 ff f8  58 da 7b f5 81 6d 81 57  |N:..ar..X.{..m.W|
-000002a0  d9 d1 b1 6d e3 97 db 86  72 17 15 18 16 d4 ec 04  |...m....r.......|
-000002b0  32 7c 38 90 6b a4 3c e9  35 79 2d 4c 39 5e 2d 00  |2|8.k.<.5y-L9^-.|
-000002c0  8b 30 81 88 02 42 01 44  78 e1 2a bb 95 f7 45 58  |.0...B.Dx.*...EX|
-000002d0  d4 0d b6 e4 4e ff 48 b3  11 14 ee d5 6c bb 5f 0c  |....N.H.....l._.|
-000002e0  90 b6 ef bc 05 77 f6 05  42 b4 d8 a6 70 e6 8c 90  |.....w..B...p...|
-000002f0  f0 4b 3b c9 d3 4e 0c 85  65 b4 e0 fe b5 10 09 9b  |.K;..N..e.......|
-00000300  e1 08 84 ea 93 96 8e a4  02 42 01 c7 15 ee 9d 98  |.........B......|
-00000310  b7 25 eb 07 ff f6 94 7e  e7 9d a5 17 9e 37 93 40  |.%.....~.....7.@|
-00000320  4c 9f eb 6b a3 7a 57 d8  81 c6 d9 09 34 aa 96 8c  |L..k.zW.....4...|
-00000330  4d 28 2e 9f f7 0b 1c 09  e1 d1 d8 48 6e 8a 8e 9c  |M(.........Hn...|
-00000340  01 4c e7 2d 53 8f 8e 71  61 82 ff ff 16 03 01 00  |.L.-S..qa.......|
-00000350  0e 0d 00 00 06 03 01 02  40 00 00 0e 00 00 00     |........@......|
->>> Flow 3 (client to server)
-00000000  16 03 01 02 0a 0b 00 02  06 00 02 03 00 02 00 30  |...............0|
-00000010  82 01 fc 30 82 01 5e 02  09 00 9a 30 84 6c 26 35  |...0..^....0.l&5|
-00000020  d9 17 30 09 06 07 2a 86  48 ce 3d 04 01 30 45 31  |..0...*.H.=..0E1|
-00000030  0b 30 09 06 03 55 04 06  13 02 41 55 31 13 30 11  |.0...U....AU1.0.|
-00000040  06 03 55 04 08 13 0a 53  6f 6d 65 2d 53 74 61 74  |..U....Some-Stat|
-00000050  65 31 21 30 1f 06 03 55  04 0a 13 18 49 6e 74 65  |e1!0...U....Inte|
-00000060  72 6e 65 74 20 57 69 64  67 69 74 73 20 50 74 79  |rnet Widgits Pty|
-00000070  20 4c 74 64 30 1e 17 0d  31 32 31 31 31 34 31 33  | Ltd0...12111413|
-00000080  32 35 35 33 5a 17 0d 32  32 31 31 31 32 31 33 32  |2553Z..221112132|
-00000090  35 35 33 5a 30 41 31 0b  30 09 06 03 55 04 06 13  |553Z0A1.0...U...|
-000000a0  02 41 55 31 0c 30 0a 06  03 55 04 08 13 03 4e 53  |.AU1.0...U....NS|
-000000b0  57 31 10 30 0e 06 03 55  04 07 13 07 50 79 72 6d  |W1.0...U....Pyrm|
-000000c0  6f 6e 74 31 12 30 10 06  03 55 04 03 13 09 4a 6f  |ont1.0...U....Jo|
-000000d0  65 6c 20 53 69 6e 67 30  81 9b 30 10 06 07 2a 86  |el Sing0..0...*.|
-000000e0  48 ce 3d 02 01 06 05 2b  81 04 00 23 03 81 86 00  |H.=....+...#....|
-000000f0  04 00 95 8c 91 75 14 c0  5e c4 57 b4 d4 c3 6f 8d  |.....u..^.W...o.|
-00000100  ae 68 1e dd 6f ce 86 e1  7e 6e b2 48 3e 81 e5 4e  |.h..o...~n.H>..N|
-00000110  e2 c6 88 4b 64 dc f5 30  bb d3 ff 65 cc 5b f4 dd  |...Kd..0...e.[..|
-00000120  b5 6a 3e 3e d0 1d de 47  c3 76 ad 19 f6 45 2c 8c  |.j>>...G.v...E,.|
-00000130  bc d8 1d 01 4c 1f 70 90  46 76 48 8b 8f 83 cc 4a  |....L.p.FvH....J|
-00000140  5c 8f 40 76 da e0 89 ec  1d 2b c4 4e 30 76 28 41  |\.@v.....+.N0v(A|
-00000150  b2 62 a8 fb 5b f1 f9 4e  7a 8d bd 09 b8 ae ea 8b  |.b..[..Nz.......|
-00000160  18 27 4f 2e 70 fe 13 96  ba c3 d3 40 16 cd 65 4e  |.'O.p......@..eN|
-00000170  ac 11 1e e6 f1 30 09 06  07 2a 86 48 ce 3d 04 01  |.....0...*.H.=..|
-00000180  03 81 8c 00 30 81 88 02  42 00 e0 14 c4 60 60 0b  |....0...B....``.|
-00000190  72 68 b0 32 5d 61 4a 02  74 5c c2 81 b9 16 a8 3f  |rh.2]aJ.t\.....?|
-000001a0  29 c8 36 c7 81 ff 6c b6  5b d9 70 f1 38 3b 50 48  |).6...l.[.p.8;PH|
-000001b0  28 94 cb 09 1a 52 f1 5d  ee 8d f2 b9 f0 f0 da d9  |(....R.]........|
-000001c0  15 3a f9 bd 03 7a 87 a2  23 35 ec 02 42 01 a3 d4  |.:...z..#5..B...|
-000001d0  8a 78 35 1c 4a 9a 23 d2  0a be 2b 10 31 9d 9c 5f  |.x5.J.#...+.1.._|
-000001e0  be e8 91 b3 da 1a f5 5d  a3 23 f5 26 8b 45 70 8d  |.......].#.&.Ep.|
-000001f0  65 62 9b 7e 01 99 3d 18  f6 10 9a 38 61 9b 2e 57  |eb.~..=....8a..W|
-00000200  e4 fa cc b1 8a ce e2 23  a0 87 f0 e1 67 51 eb 16  |.......#....gQ..|
-00000210  03 01 00 46 10 00 00 42  41 04 1e 18 37 ef 0d 19  |...F...BA...7...|
-00000220  51 88 35 75 71 b5 e5 54  5b 12 2e 8f 09 67 fd a7  |Q.5uq..T[....g..|
-00000230  24 20 3e b2 56 1c ce 97  28 5e f8 2b 2d 4f 9e f1  |$ >.V...(^.+-O..|
-00000240  07 9f 6c 4b 5b 83 56 e2  32 42 e9 58 b6 d7 49 a6  |..lK[.V.2B.X..I.|
-00000250  b5 68 1a 41 03 56 6b dc  5a 89 16 03 01 00 91 0f  |.h.A.Vk.Z.......|
-00000260  00 00 8d 00 8b 30 81 88  02 42 01 91 2d e9 99 a4  |.....0...B..-...|
-00000270  88 5c 03 9c ea 8b 64 07  f2 c9 e7 ad 5b a3 fb 27  |.\....d.....[..'|
-00000280  fd 19 9b 78 bd 7b 9d 0a  cc 8a 61 c5 83 33 02 29  |...x.{....a..3.)|
-00000290  c3 66 24 9d 5f bc 03 d9  2a 49 aa 59 51 83 49 72  |.f$._...*I.YQ.Ir|
-000002a0  13 be ea 82 5a 5c 09 2f  da 23 bc 18 02 42 01 0d  |....Z\./.#...B..|
-000002b0  a1 15 4d fe 18 ec 90 d5  4e 9a 75 60 05 67 10 5e  |..M.....N.u`.g.^|
-000002c0  3c 34 00 e8 18 33 8f 90  26 2e d3 a9 81 6c 43 17  |<4...3..&....lC.|
-000002d0  80 9e c5 bd 23 c9 24 96  a1 29 23 a4 13 3f ad d2  |....#.$..)#..?..|
-000002e0  45 19 0b 56 56 4b c1 f1  cc 70 c8 af 44 ff 34 96  |E..VVK...p..D.4.|
-000002f0  14 03 01 00 01 01 16 03  01 00 30 c4 0c 67 53 06  |..........0..gS.|
-00000300  49 b3 c9 5c 2e 72 f6 54  ba ad ac a8 80 55 17 01  |I..\.r.T.....U..|
-00000310  5c 44 71 7d ad 15 34 95  9a 7f 7b 95 0e 08 70 ce  |\Dq}..4...{...p.|
-00000320  5a 33 f4 3b 4e 80 06 43  70 93 17                 |Z3.;N..Cp..|
->>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 3b ba 6c 73 ec  |..........0;.ls.|
-00000010  11 5b 44 46 1d bb 31 1b  1b e8 d8 51 4f 95 b0 40  |.[DF..1....QO..@|
-00000020  87 49 33 73 40 98 61 1c  94 02 48 9b 80 d3 6c af  |.I3s@.a...H...l.|
-00000030  e2 31 63 11 a7 c8 db ed  7a a4 4d                 |.1c.....z.M|
->>> Flow 5 (client to server)
-00000000  17 03 01 00 20 2e f7 66  f0 ce 50 d7 38 7a d4 fd  |.... ..f..P.8z..|
-00000010  e3 66 b1 76 76 59 ad bc  b0 0a 75 1d f0 92 6e e3  |.f.vvY....u...n.|
-00000020  21 1d 13 dc ad 17 03 01  00 20 f1 b2 0f 3b 26 91  |!........ ...;&.|
-00000030  ed ff 9f fc 41 04 7e 47  17 02 af 0c 2b e8 b7 31  |....A.~G....+..1|
-00000040  ae 29 71 f9 a8 89 84 f3  e8 da 15 03 01 00 20 1f  |.)q........... .|
-00000050  26 64 cf 34 c1 48 6b 79  61 e2 77 57 9d 27 14 45  |&d.4.Hkya.wW.'.E|
-00000060  46 24 ad 2d 35 57 db 2b  32 03 e2 68 b0 1a 5a     |F$.-5W.+2..h..Z|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-RSA b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-RSA
deleted file mode 100644
index 0e420a6..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-ECDSA-RSA
+++ /dev/null
@@ -1,126 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 01 00 51 02 00 00  4d 03 01 b7 de 52 5a 07  |....Q...M....RZ.|
-00000010  43 b8 72 1d d9 6f 5c a5  70 da ee 27 b7 a9 50 9d  |C.r..o\.p..'..P.|
-00000020  e7 75 ad 61 a5 2f 69 47  2a d8 2e 20 a8 b0 64 6b  |.u.a./iG*.. ..dk|
-00000030  4d 25 ec 50 2b 8e a7 9b  0c f9 f5 3c 62 96 a3 53  |M%.P+......<b..S|
-00000040  a7 4b af 33 1e e7 f8 43  b9 be 6e e7 00 05 00 00  |.K.3...C..n.....|
-00000050  05 ff 01 00 01 00 16 03  01 02 be 0b 00 02 ba 00  |................|
-00000060  02 b7 00 02 b4 30 82 02  b0 30 82 02 19 a0 03 02  |.....0...0......|
-00000070  01 02 02 09 00 85 b0 bb  a4 8a 7f b8 ca 30 0d 06  |.............0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 05 05 00 30 45 31 0b  |.*.H........0E1.|
-00000090  30 09 06 03 55 04 06 13  02 41 55 31 13 30 11 06  |0...U....AU1.0..|
-000000a0  03 55 04 08 13 0a 53 6f  6d 65 2d 53 74 61 74 65  |.U....Some-State|
-000000b0  31 21 30 1f 06 03 55 04  0a 13 18 49 6e 74 65 72  |1!0...U....Inter|
-000000c0  6e 65 74 20 57 69 64 67  69 74 73 20 50 74 79 20  |net Widgits Pty |
-000000d0  4c 74 64 30 1e 17 0d 31  30 30 34 32 34 30 39 30  |Ltd0...100424090|
-000000e0  39 33 38 5a 17 0d 31 31  30 34 32 34 30 39 30 39  |938Z..1104240909|
-000000f0  33 38 5a 30 45 31 0b 30  09 06 03 55 04 06 13 02  |38Z0E1.0...U....|
-00000100  41 55 31 13 30 11 06 03  55 04 08 13 0a 53 6f 6d  |AU1.0...U....Som|
-00000110  65 2d 53 74 61 74 65 31  21 30 1f 06 03 55 04 0a  |e-State1!0...U..|
-00000120  13 18 49 6e 74 65 72 6e  65 74 20 57 69 64 67 69  |..Internet Widgi|
-00000130  74 73 20 50 74 79 20 4c  74 64 30 81 9f 30 0d 06  |ts Pty Ltd0..0..|
-00000140  09 2a 86 48 86 f7 0d 01  01 01 05 00 03 81 8d 00  |.*.H............|
-00000150  30 81 89 02 81 81 00 bb  79 d6 f5 17 b5 e5 bf 46  |0.......y......F|
-00000160  10 d0 dc 69 be e6 2b 07  43 5a d0 03 2d 8a 7a 43  |...i..+.CZ..-.zC|
-00000170  85 b7 14 52 e7 a5 65 4c  2c 78 b8 23 8c b5 b4 82  |...R..eL,x.#....|
-00000180  e5 de 1f 95 3b 7e 62 a5  2c a5 33 d6 fe 12 5c 7a  |....;~b.,.3...\z|
-00000190  56 fc f5 06 bf fa 58 7b  26 3f b5 cd 04 d3 d0 c9  |V.....X{&?......|
-000001a0  21 96 4a c7 f4 54 9f 5a  bf ef 42 71 00 fe 18 99  |!.J..T.Z..Bq....|
-000001b0  07 7f 7e 88 7d 7d f1 04  39 c4 a2 2e db 51 c9 7c  |..~.}}..9....Q.||
-000001c0  e3 c0 4c 3b 32 66 01 cf  af b1 1d b8 71 9a 1d db  |..L;2f......q...|
-000001d0  db 89 6b ae da 2d 79 02  03 01 00 01 a3 81 a7 30  |..k..-y........0|
-000001e0  81 a4 30 1d 06 03 55 1d  0e 04 16 04 14 b1 ad e2  |..0...U.........|
-000001f0  85 5a cf cb 28 db 69 ce  23 69 de d3 26 8e 18 88  |.Z..(.i.#i..&...|
-00000200  39 30 75 06 03 55 1d 23  04 6e 30 6c 80 14 b1 ad  |90u..U.#.n0l....|
-00000210  e2 85 5a cf cb 28 db 69  ce 23 69 de d3 26 8e 18  |..Z..(.i.#i..&..|
-00000220  88 39 a1 49 a4 47 30 45  31 0b 30 09 06 03 55 04  |.9.I.G0E1.0...U.|
-00000230  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
-00000240  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
-00000250  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
-00000260  64 67 69 74 73 20 50 74  79 20 4c 74 64 82 09 00  |dgits Pty Ltd...|
-00000270  85 b0 bb a4 8a 7f b8 ca  30 0c 06 03 55 1d 13 04  |........0...U...|
-00000280  05 30 03 01 01 ff 30 0d  06 09 2a 86 48 86 f7 0d  |.0....0...*.H...|
-00000290  01 01 05 05 00 03 81 81  00 08 6c 45 24 c7 6b b1  |..........lE$.k.|
-000002a0  59 ab 0c 52 cc f2 b0 14  d7 87 9d 7a 64 75 b5 5a  |Y..R.......zdu.Z|
-000002b0  95 66 e4 c5 2b 8e ae 12  66 1f eb 4f 38 b3 6e 60  |.f..+...f..O8.n`|
-000002c0  d3 92 fd f7 41 08 b5 25  13 b1 18 7a 24 fb 30 1d  |....A..%...z$.0.|
-000002d0  ba ed 98 b9 17 ec e7 d7  31 59 db 95 d3 1d 78 ea  |........1Y....x.|
-000002e0  50 56 5c d5 82 5a 2d 5a  5f 33 c4 b6 d8 c9 75 90  |PV\..Z-Z_3....u.|
-000002f0  96 8c 0f 52 98 b5 cd 98  1f 89 20 5f f2 a0 1c a3  |...R...... _....|
-00000300  1b 96 94 dd a9 fd 57 e9  70 e8 26 6d 71 99 9b 26  |......W.p.&mq..&|
-00000310  6e 38 50 29 6c 90 a7 bd  d9 16 03 01 00 0e 0d 00  |n8P)l...........|
-00000320  00 06 03 01 02 40 00 00  0e 00 00 00              |.....@......|
->>> Flow 3 (client to server)
-00000000  16 03 01 02 0a 0b 00 02  06 00 02 03 00 02 00 30  |...............0|
-00000010  82 01 fc 30 82 01 5e 02  09 00 9a 30 84 6c 26 35  |...0..^....0.l&5|
-00000020  d9 17 30 09 06 07 2a 86  48 ce 3d 04 01 30 45 31  |..0...*.H.=..0E1|
-00000030  0b 30 09 06 03 55 04 06  13 02 41 55 31 13 30 11  |.0...U....AU1.0.|
-00000040  06 03 55 04 08 13 0a 53  6f 6d 65 2d 53 74 61 74  |..U....Some-Stat|
-00000050  65 31 21 30 1f 06 03 55  04 0a 13 18 49 6e 74 65  |e1!0...U....Inte|
-00000060  72 6e 65 74 20 57 69 64  67 69 74 73 20 50 74 79  |rnet Widgits Pty|
-00000070  20 4c 74 64 30 1e 17 0d  31 32 31 31 31 34 31 33  | Ltd0...12111413|
-00000080  32 35 35 33 5a 17 0d 32  32 31 31 31 32 31 33 32  |2553Z..221112132|
-00000090  35 35 33 5a 30 41 31 0b  30 09 06 03 55 04 06 13  |553Z0A1.0...U...|
-000000a0  02 41 55 31 0c 30 0a 06  03 55 04 08 13 03 4e 53  |.AU1.0...U....NS|
-000000b0  57 31 10 30 0e 06 03 55  04 07 13 07 50 79 72 6d  |W1.0...U....Pyrm|
-000000c0  6f 6e 74 31 12 30 10 06  03 55 04 03 13 09 4a 6f  |ont1.0...U....Jo|
-000000d0  65 6c 20 53 69 6e 67 30  81 9b 30 10 06 07 2a 86  |el Sing0..0...*.|
-000000e0  48 ce 3d 02 01 06 05 2b  81 04 00 23 03 81 86 00  |H.=....+...#....|
-000000f0  04 00 95 8c 91 75 14 c0  5e c4 57 b4 d4 c3 6f 8d  |.....u..^.W...o.|
-00000100  ae 68 1e dd 6f ce 86 e1  7e 6e b2 48 3e 81 e5 4e  |.h..o...~n.H>..N|
-00000110  e2 c6 88 4b 64 dc f5 30  bb d3 ff 65 cc 5b f4 dd  |...Kd..0...e.[..|
-00000120  b5 6a 3e 3e d0 1d de 47  c3 76 ad 19 f6 45 2c 8c  |.j>>...G.v...E,.|
-00000130  bc d8 1d 01 4c 1f 70 90  46 76 48 8b 8f 83 cc 4a  |....L.p.FvH....J|
-00000140  5c 8f 40 76 da e0 89 ec  1d 2b c4 4e 30 76 28 41  |\.@v.....+.N0v(A|
-00000150  b2 62 a8 fb 5b f1 f9 4e  7a 8d bd 09 b8 ae ea 8b  |.b..[..Nz.......|
-00000160  18 27 4f 2e 70 fe 13 96  ba c3 d3 40 16 cd 65 4e  |.'O.p......@..eN|
-00000170  ac 11 1e e6 f1 30 09 06  07 2a 86 48 ce 3d 04 01  |.....0...*.H.=..|
-00000180  03 81 8c 00 30 81 88 02  42 00 e0 14 c4 60 60 0b  |....0...B....``.|
-00000190  72 68 b0 32 5d 61 4a 02  74 5c c2 81 b9 16 a8 3f  |rh.2]aJ.t\.....?|
-000001a0  29 c8 36 c7 81 ff 6c b6  5b d9 70 f1 38 3b 50 48  |).6...l.[.p.8;PH|
-000001b0  28 94 cb 09 1a 52 f1 5d  ee 8d f2 b9 f0 f0 da d9  |(....R.]........|
-000001c0  15 3a f9 bd 03 7a 87 a2  23 35 ec 02 42 01 a3 d4  |.:...z..#5..B...|
-000001d0  8a 78 35 1c 4a 9a 23 d2  0a be 2b 10 31 9d 9c 5f  |.x5.J.#...+.1.._|
-000001e0  be e8 91 b3 da 1a f5 5d  a3 23 f5 26 8b 45 70 8d  |.......].#.&.Ep.|
-000001f0  65 62 9b 7e 01 99 3d 18  f6 10 9a 38 61 9b 2e 57  |eb.~..=....8a..W|
-00000200  e4 fa cc b1 8a ce e2 23  a0 87 f0 e1 67 51 eb 16  |.......#....gQ..|
-00000210  03 01 00 86 10 00 00 82  00 80 6d 51 f3 7f f9 3e  |..........mQ...>|
-00000220  fb 75 82 41 36 83 e8 6a  ee 2a 2e 25 90 67 4c 8e  |.u.A6..j.*.%.gL.|
-00000230  62 2f 30 81 17 e0 85 09  0c 2b b7 23 d7 b0 e2 1d  |b/0......+.#....|
-00000240  f7 3b d7 f5 a1 27 b6 ee  24 b6 1b cc 5b ea 66 0d  |.;...'..$...[.f.|
-00000250  6a f4 e5 85 f9 da 43 b4  0e 86 85 e1 f5 aa be c8  |j.....C.........|
-00000260  ce 39 4c 9c 86 00 08 c2  4b e2 c6 ec 2f f7 ce e6  |.9L.....K.../...|
-00000270  bd 77 82 6f 23 b6 e0 bd  a2 92 b7 3a ac e8 56 f1  |.w.o#......:..V.|
-00000280  af 54 5e 46 87 e9 3b 33  e7 b8 28 b7 d6 c8 90 35  |.T^F..;3..(....5|
-00000290  d4 1c 43 d1 30 6f 55 4e  0a 70 16 03 01 00 91 0f  |..C.0oUN.p......|
-000002a0  00 00 8d 00 8b 30 81 88  02 42 00 b5 1a 9d 48 90  |.....0...B....H.|
-000002b0  2f d9 1a 04 66 f7 3b 4d  d7 ae d9 1e dd 3c fa 24  |/...f.;M.....<.$|
-000002c0  0f 24 97 b2 61 46 16 d9  a0 35 f9 f7 54 45 92 fd  |.$..aF...5..TE..|
-000002d0  10 56 ab 26 d7 b5 10 80  8b 88 95 ef c6 73 1c d2  |.V.&.........s..|
-000002e0  ff e9 20 cd 18 a8 40 c4  4d 83 c2 e2 02 42 01 8c  |.. ...@.M....B..|
-000002f0  d2 13 4c cc e5 38 37 17  6c 83 d6 ad c1 dc af ec  |..L..87.l.......|
-00000300  8d 06 75 b8 08 ad 56 4a  8f b9 03 59 80 f8 81 d4  |..u...VJ...Y....|
-00000310  f3 91 89 eb 9c 27 5d e1  dc 6d ef d6 20 da e7 9c  |.....']..m.. ...|
-00000320  71 75 cb 2a f9 e4 05 46  c8 85 ca 7b 9c 97 e8 6d  |qu.*...F...{...m|
-00000330  14 03 01 00 01 01 16 03  01 00 24 9f 67 4e 22 04  |..........$.gN".|
-00000340  10 f4 28 55 3e 50 88 90  61 07 42 29 f5 9b f5 32  |..(U>P..a.B)...2|
-00000350  16 3d ea c1 8f aa a1 4c  b5 72 26 d8 32 cd 50     |.=.....L.r&.2.P|
->>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 24 df 8d f1 07 6d  |..........$....m|
-00000010  63 39 fc ba b1 67 3b 68  85 b9 37 7d d3 67 19 76  |c9...g;h..7}.g.v|
-00000020  34 a4 1b 86 31 bd fe 06  72 00 d8 2b f2 65 3d     |4...1...r..+.e=|
->>> Flow 5 (client to server)
-00000000  17 03 01 00 1a 60 cc 81  4f 8b 73 b3 7f 34 bf f1  |.....`..O.s..4..|
-00000010  7c d8 32 0a ef 2a 26 f9  b8 69 84 83 48 21 ee 15  ||.2..*&..i..H!..|
-00000020  03 01 00 16 23 7a 0c 65  3a 66 1a 75 03 e4 85 3f  |....#z.e:f.u...?|
-00000030  83 cd 55 70 99 f4 44 dc  67 ba                    |..Up..D.g.|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-ECDSA b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-ECDSA
deleted file mode 100644
index 7e33edc..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-ECDSA
+++ /dev/null
@@ -1,129 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 dc a9 22 c2 a2  |....Y...U...."..|
-00000010  05 ba c4 66 9a 71 aa 0f  92 6a fc df b0 29 4d 36  |...f.q...j...)M6|
-00000020  39 2e f8 39 ed 8e f6 7f  8f 17 13 20 f8 9c f3 3d  |9..9....... ...=|
-00000030  0a 41 8f 30 c7 5d cd 17  c5 ad 1c 52 45 a3 47 8c  |.A.0.].....RE.G.|
-00000040  07 4c 48 e1 00 2b 32 38  01 c8 79 b7 c0 09 00 00  |.LH..+28..y.....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  01 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
-00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
-00000080  30 09 06 07 2a 86 48 ce  3d 04 01 30 45 31 0b 30  |0...*.H.=..0E1.0|
-00000090  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-000000a0  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-000000b0  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-000000c0  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-000000d0  74 64 30 1e 17 0d 31 32  31 31 32 32 31 35 30 36  |td0...1211221506|
-000000e0  33 32 5a 17 0d 32 32 31  31 32 30 31 35 30 36 33  |32Z..22112015063|
-000000f0  32 5a 30 45 31 0b 30 09  06 03 55 04 06 13 02 41  |2Z0E1.0...U....A|
-00000100  55 31 13 30 11 06 03 55  04 08 13 0a 53 6f 6d 65  |U1.0...U....Some|
-00000110  2d 53 74 61 74 65 31 21  30 1f 06 03 55 04 0a 13  |-State1!0...U...|
-00000120  18 49 6e 74 65 72 6e 65  74 20 57 69 64 67 69 74  |.Internet Widgit|
-00000130  73 20 50 74 79 20 4c 74  64 30 81 9b 30 10 06 07  |s Pty Ltd0..0...|
-00000140  2a 86 48 ce 3d 02 01 06  05 2b 81 04 00 23 03 81  |*.H.=....+...#..|
-00000150  86 00 04 00 c4 a1 ed be  98 f9 0b 48 73 36 7e c3  |...........Hs6~.|
-00000160  16 56 11 22 f2 3d 53 c3  3b 4d 21 3d cd 6b 75 e6  |.V.".=S.;M!=.ku.|
-00000170  f6 b0 dc 9a df 26 c1 bc  b2 87 f0 72 32 7c b3 64  |.....&.....r2|.d|
-00000180  2f 1c 90 bc ea 68 23 10  7e fe e3 25 c0 48 3a 69  |/....h#.~..%.H:i|
-00000190  e0 28 6d d3 37 00 ef 04  62 dd 0d a0 9c 70 62 83  |.(m.7...b....pb.|
-000001a0  d8 81 d3 64 31 aa 9e 97  31 bd 96 b0 68 c0 9b 23  |...d1...1...h..#|
-000001b0  de 76 64 3f 1a 5c 7f e9  12 0e 58 58 b6 5f 70 dd  |.vd?.\....XX._p.|
-000001c0  9b d8 ea d5 d7 f5 d5 cc  b9 b6 9f 30 66 5b 66 9a  |...........0f[f.|
-000001d0  20 e2 27 e5 bf fe 3b 30  09 06 07 2a 86 48 ce 3d  | .'...;0...*.H.=|
-000001e0  04 01 03 81 8c 00 30 81  88 02 42 01 88 a2 4f eb  |......0...B...O.|
-000001f0  e2 45 c5 48 7d 1b ac f5  ed 98 9d ae 47 70 c0 5e  |.E.H}.......Gp.^|
-00000200  1b b6 2f bd f1 b6 4d b7  61 40 d3 11 a2 ce ee 0b  |../...M.a@......|
-00000210  7e 92 7e ff 76 9d c3 3b  7e a5 3f ce fa 10 e2 59  |~.~.v..;~.?....Y|
-00000220  ec 47 2d 7c ac da 4e 97  0e 15 a0 6f d0 02 42 01  |.G-|..N....o..B.|
-00000230  4d fc be 67 13 9c 2d 05  0e bd 3f a3 8c 25 c1 33  |M..g..-...?..%.3|
-00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
-00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
-00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 01 00 d5 0c 00  00 d1 03 00 17 41 04 89  |*............A..|
-00000280  95 9a 90 82 59 ab 29 bf  10 06 8c 6c 0d 67 cf b1  |....Y.)....l.g..|
-00000290  66 8b 5e 43 b8 46 56 3a  8d 30 92 35 28 82 f2 38  |f.^C.FV:.0.5(..8|
-000002a0  6e 19 5d 37 f0 ab fc 78  15 6a 6a 73 ca dc a6 f2  |n.]7...x.jjs....|
-000002b0  68 5d b3 ab 6d 68 44 3b  80 d2 d9 cd 78 0a ed 00  |h]..mhD;....x...|
-000002c0  8a 30 81 87 02 42 01 80  63 4a 22 4c 8e 66 4e 25  |.0...B..cJ"L.fN%|
-000002d0  e1 86 27 81 de eb b3 a0  c4 dc dc e2 a0 94 2a b6  |..'...........*.|
-000002e0  b3 e9 e7 42 e1 1d 1a c0  43 8d a1 d6 8d 77 84 06  |...B....C....w..|
-000002f0  ba 95 99 e3 54 80 59 4e  3c fb 0c f3 b7 d3 a8 d2  |....T.YN<.......|
-00000300  ce 49 97 fb e2 79 91 93  02 41 2b 2c b7 9f 81 ea  |.I...y...A+,....|
-00000310  de 17 12 af 4d 20 bc a1  43 1d 60 a0 37 52 a2 7b  |....M ..C.`.7R.{|
-00000320  a8 4c de fd 1d fe 37 3b  00 23 61 ce d2 80 47 43  |.L....7;.#a...GC|
-00000330  b0 3a f3 1f aa c7 07 b1  68 5b d8 f3 03 a9 56 5c  |.:......h[....V\|
-00000340  63 ef 83 1d 9c 9c 8d 29  81 e9 3b 16 03 01 00 0e  |c......)..;.....|
-00000350  0d 00 00 06 03 01 02 40  00 00 0e 00 00 00        |.......@......|
->>> Flow 3 (client to server)
-00000000  16 03 01 01 fb 0b 00 01  f7 00 01 f4 00 01 f1 30  |...............0|
-00000010  82 01 ed 30 82 01 58 a0  03 02 01 02 02 01 00 30  |...0..X........0|
-00000020  0b 06 09 2a 86 48 86 f7  0d 01 01 05 30 26 31 10  |...*.H......0&1.|
-00000030  30 0e 06 03 55 04 0a 13  07 41 63 6d 65 20 43 6f  |0...U....Acme Co|
-00000040  31 12 30 10 06 03 55 04  03 13 09 31 32 37 2e 30  |1.0...U....127.0|
-00000050  2e 30 2e 31 30 1e 17 0d  31 31 31 32 30 38 30 37  |.0.10...11120807|
-00000060  35 35 31 32 5a 17 0d 31  32 31 32 30 37 30 38 30  |5512Z..121207080|
-00000070  30 31 32 5a 30 26 31 10  30 0e 06 03 55 04 0a 13  |012Z0&1.0...U...|
-00000080  07 41 63 6d 65 20 43 6f  31 12 30 10 06 03 55 04  |.Acme Co1.0...U.|
-00000090  03 13 09 31 32 37 2e 30  2e 30 2e 31 30 81 9c 30  |...127.0.0.10..0|
-000000a0  0b 06 09 2a 86 48 86 f7  0d 01 01 01 03 81 8c 00  |...*.H..........|
-000000b0  30 81 88 02 81 80 4e d0  7b 31 e3 82 64 d9 59 c0  |0.....N.{1..d.Y.|
-000000c0  c2 87 a4 5e 1e 8b 73 33  c7 63 53 df 66 92 06 84  |...^..s3.cS.f...|
-000000d0  f6 64 d5 8f e4 36 a7 1d  2b e8 b3 20 36 45 23 b5  |.d...6..+.. 6E#.|
-000000e0  e3 95 ae ed e0 f5 20 9c  8d 95 df 7f 5a 12 ef 87  |...... .....Z...|
-000000f0  e4 5b 68 e4 e9 0e 74 ec  04 8a 7f de 93 27 c4 01  |.[h...t......'..|
-00000100  19 7a bd f2 dc 3d 14 ab  d0 54 ca 21 0c d0 4d 6e  |.z...=...T.!..Mn|
-00000110  87 2e 5c c5 d2 bb 4d 4b  4f ce b6 2c f7 7e 88 ec  |..\...MKO..,.~..|
-00000120  7c d7 02 91 74 a6 1e 0c  1a da e3 4a 5a 2e de 13  ||...t......JZ...|
-00000130  9c 4c 40 88 59 93 02 03  01 00 01 a3 32 30 30 30  |.L@.Y.......2000|
-00000140  0e 06 03 55 1d 0f 01 01  ff 04 04 03 02 00 a0 30  |...U...........0|
-00000150  0d 06 03 55 1d 0e 04 06  04 04 01 02 03 04 30 0f  |...U..........0.|
-00000160  06 03 55 1d 23 04 08 30  06 80 04 01 02 03 04 30  |..U.#..0.......0|
-00000170  0b 06 09 2a 86 48 86 f7  0d 01 01 05 03 81 81 00  |...*.H..........|
-00000180  36 1f b3 7a 0c 75 c9 6e  37 46 61 2b d5 bd c0 a7  |6..z.u.n7Fa+....|
-00000190  4b cc 46 9a 81 58 7c 85  79 29 c8 c8 c6 67 dd 32  |K.F..X|.y)...g.2|
-000001a0  56 45 2b 75 b6 e9 24 a9  50 9a be 1f 5a fa 1a 15  |VE+u..$.P...Z...|
-000001b0  d9 cc 55 95 72 16 83 b9  c2 b6 8f fd 88 8c 38 84  |..U.r.........8.|
-000001c0  1d ab 5d 92 31 13 4f fd  83 3b c6 9d f1 11 62 b6  |..].1.O..;....b.|
-000001d0  8b ec ab 67 be c8 64 b0  11 50 46 58 17 6b 99 1c  |...g..d..PFX.k..|
-000001e0  d3 1d fc 06 f1 0e e5 96  a8 0c f9 78 20 b7 44 18  |...........x .D.|
-000001f0  51 8d 10 7e 4f 94 67 df  a3 4e 70 73 8e 90 91 85  |Q..~O.g..Nps....|
-00000200  16 03 01 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000210  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000220  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000230  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000240  a6 b5 68 1a 41 03 56 6b  dc 5a 89 16 03 01 00 86  |..h.A.Vk.Z......|
-00000250  0f 00 00 82 00 80 0e 80  9c 3a 6e 40 51 09 39 d4  |.........:n@Q.9.|
-00000260  40 58 10 da 7f 32 12 08  9e f0 4d 9a d7 20 a2 9c  |@X...2....M.. ..|
-00000270  b0 95 3a 33 4e f8 b1 a3  74 62 ab 51 7d 23 d4 32  |..:3N...tb.Q}#.2|
-00000280  a2 af b8 5a 3b b0 23 e4  7a f1 eb 4d b7 bb 23 d5  |...Z;.#.z..M..#.|
-00000290  a9 0d b4 81 d2 b4 45 bd  15 52 ad 58 da 92 a2 c4  |......E..R.X....|
-000002a0  30 66 87 f2 ae c5 e4 8c  fa ba a0 40 76 b8 3f 72  |0f.........@v.?r|
-000002b0  2a d9 95 2a 2d c6 05 3c  1e 2f 11 ef c5 3c 11 e4  |*..*-..<./...<..|
-000002c0  be 5a de 37 43 7f 74 52  6e ee 3c 39 cc f1 14 05  |.Z.7C.tRn.<9....|
-000002d0  2d 91 c2 3d c4 7c 14 03  01 00 01 01 16 03 01 00  |-..=.|..........|
-000002e0  30 cd 3c 92 f8 b9 36 7a  e7 8a fb 0f 2f b8 2c 7b  |0.<...6z..../.,{|
-000002f0  10 59 45 14 0a b0 6a 8c  31 b2 89 5b ac 19 dc 12  |.YE...j.1..[....|
-00000300  73 8c 8c 10 49 5a bf 9f  bc 58 82 32 11 ba c5 38  |s...IZ...X.2...8|
-00000310  ff                                                |.|
->>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 da 45 99 fe 52  |..........0.E..R|
-00000010  4f cd d0 e6 30 19 f4 bd  80 6d 5c 8a 72 03 d3 88  |O...0....m\.r...|
-00000020  38 63 e9 c9 39 ee ab 3f  52 26 84 b0 4d cb 5c a4  |8c..9..?R&..M.\.|
-00000030  0d 51 c7 47 48 43 3a bf  89 c7 13                 |.Q.GHC:....|
->>> Flow 5 (client to server)
-00000000  17 03 01 00 20 4d d9 1d  0d 3d 8b 73 91 b9 4e 5e  |.... M...=.s..N^|
-00000010  35 71 4f 67 79 d2 f7 39  35 ea 23 d0 6d 64 de a5  |5qOgy..95.#.md..|
-00000020  59 fb 75 1f c9 17 03 01  00 20 ba bd 3c b4 d7 be  |Y.u...... ..<...|
-00000030  24 64 68 1e 8c b2 bf 6f  78 9f ad 7f fa dd 89 a6  |$dh....ox.......|
-00000040  f9 e7 5e 70 db e9 db 3a  62 b2 15 03 01 00 20 2a  |..^p...:b..... *|
-00000050  82 f4 8b 45 fc 76 35 6c  54 48 62 2f 52 55 f2 d9  |...E.v5lTHb/RU..|
-00000060  99 b2 b5 2d 5f a0 05 ab  f1 93 58 75 4a 87 35     |...-_.....XuJ.5|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-RSA b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-RSA
deleted file mode 100644
index 9b1a553..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ClientCert-RSA-RSA
+++ /dev/null
@@ -1,125 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 01 00 51 02 00 00  4d 03 01 90 e6 e1 c6 bd  |....Q...M.......|
-00000010  86 08 db 33 94 f3 bd 0b  2d fc e0 ba 89 a7 c5 66  |...3....-......f|
-00000020  a5 19 78 33 2b b9 c4 22  d8 e0 63 20 2e 85 53 25  |..x3+.."..c ..S%|
-00000030  f2 22 e3 ca 79 94 9e 50  00 13 da 9d 21 33 49 27  |."..y..P....!3I'|
-00000040  9b 44 c5 10 bc e8 44 01  04 31 02 81 00 05 00 00  |.D....D..1......|
-00000050  05 ff 01 00 01 00 16 03  01 02 be 0b 00 02 ba 00  |................|
-00000060  02 b7 00 02 b4 30 82 02  b0 30 82 02 19 a0 03 02  |.....0...0......|
-00000070  01 02 02 09 00 85 b0 bb  a4 8a 7f b8 ca 30 0d 06  |.............0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 05 05 00 30 45 31 0b  |.*.H........0E1.|
-00000090  30 09 06 03 55 04 06 13  02 41 55 31 13 30 11 06  |0...U....AU1.0..|
-000000a0  03 55 04 08 13 0a 53 6f  6d 65 2d 53 74 61 74 65  |.U....Some-State|
-000000b0  31 21 30 1f 06 03 55 04  0a 13 18 49 6e 74 65 72  |1!0...U....Inter|
-000000c0  6e 65 74 20 57 69 64 67  69 74 73 20 50 74 79 20  |net Widgits Pty |
-000000d0  4c 74 64 30 1e 17 0d 31  30 30 34 32 34 30 39 30  |Ltd0...100424090|
-000000e0  39 33 38 5a 17 0d 31 31  30 34 32 34 30 39 30 39  |938Z..1104240909|
-000000f0  33 38 5a 30 45 31 0b 30  09 06 03 55 04 06 13 02  |38Z0E1.0...U....|
-00000100  41 55 31 13 30 11 06 03  55 04 08 13 0a 53 6f 6d  |AU1.0...U....Som|
-00000110  65 2d 53 74 61 74 65 31  21 30 1f 06 03 55 04 0a  |e-State1!0...U..|
-00000120  13 18 49 6e 74 65 72 6e  65 74 20 57 69 64 67 69  |..Internet Widgi|
-00000130  74 73 20 50 74 79 20 4c  74 64 30 81 9f 30 0d 06  |ts Pty Ltd0..0..|
-00000140  09 2a 86 48 86 f7 0d 01  01 01 05 00 03 81 8d 00  |.*.H............|
-00000150  30 81 89 02 81 81 00 bb  79 d6 f5 17 b5 e5 bf 46  |0.......y......F|
-00000160  10 d0 dc 69 be e6 2b 07  43 5a d0 03 2d 8a 7a 43  |...i..+.CZ..-.zC|
-00000170  85 b7 14 52 e7 a5 65 4c  2c 78 b8 23 8c b5 b4 82  |...R..eL,x.#....|
-00000180  e5 de 1f 95 3b 7e 62 a5  2c a5 33 d6 fe 12 5c 7a  |....;~b.,.3...\z|
-00000190  56 fc f5 06 bf fa 58 7b  26 3f b5 cd 04 d3 d0 c9  |V.....X{&?......|
-000001a0  21 96 4a c7 f4 54 9f 5a  bf ef 42 71 00 fe 18 99  |!.J..T.Z..Bq....|
-000001b0  07 7f 7e 88 7d 7d f1 04  39 c4 a2 2e db 51 c9 7c  |..~.}}..9....Q.||
-000001c0  e3 c0 4c 3b 32 66 01 cf  af b1 1d b8 71 9a 1d db  |..L;2f......q...|
-000001d0  db 89 6b ae da 2d 79 02  03 01 00 01 a3 81 a7 30  |..k..-y........0|
-000001e0  81 a4 30 1d 06 03 55 1d  0e 04 16 04 14 b1 ad e2  |..0...U.........|
-000001f0  85 5a cf cb 28 db 69 ce  23 69 de d3 26 8e 18 88  |.Z..(.i.#i..&...|
-00000200  39 30 75 06 03 55 1d 23  04 6e 30 6c 80 14 b1 ad  |90u..U.#.n0l....|
-00000210  e2 85 5a cf cb 28 db 69  ce 23 69 de d3 26 8e 18  |..Z..(.i.#i..&..|
-00000220  88 39 a1 49 a4 47 30 45  31 0b 30 09 06 03 55 04  |.9.I.G0E1.0...U.|
-00000230  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
-00000240  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
-00000250  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
-00000260  64 67 69 74 73 20 50 74  79 20 4c 74 64 82 09 00  |dgits Pty Ltd...|
-00000270  85 b0 bb a4 8a 7f b8 ca  30 0c 06 03 55 1d 13 04  |........0...U...|
-00000280  05 30 03 01 01 ff 30 0d  06 09 2a 86 48 86 f7 0d  |.0....0...*.H...|
-00000290  01 01 05 05 00 03 81 81  00 08 6c 45 24 c7 6b b1  |..........lE$.k.|
-000002a0  59 ab 0c 52 cc f2 b0 14  d7 87 9d 7a 64 75 b5 5a  |Y..R.......zdu.Z|
-000002b0  95 66 e4 c5 2b 8e ae 12  66 1f eb 4f 38 b3 6e 60  |.f..+...f..O8.n`|
-000002c0  d3 92 fd f7 41 08 b5 25  13 b1 18 7a 24 fb 30 1d  |....A..%...z$.0.|
-000002d0  ba ed 98 b9 17 ec e7 d7  31 59 db 95 d3 1d 78 ea  |........1Y....x.|
-000002e0  50 56 5c d5 82 5a 2d 5a  5f 33 c4 b6 d8 c9 75 90  |PV\..Z-Z_3....u.|
-000002f0  96 8c 0f 52 98 b5 cd 98  1f 89 20 5f f2 a0 1c a3  |...R...... _....|
-00000300  1b 96 94 dd a9 fd 57 e9  70 e8 26 6d 71 99 9b 26  |......W.p.&mq..&|
-00000310  6e 38 50 29 6c 90 a7 bd  d9 16 03 01 00 0e 0d 00  |n8P)l...........|
-00000320  00 06 03 01 02 40 00 00  0e 00 00 00              |.....@......|
->>> Flow 3 (client to server)
-00000000  16 03 01 01 fb 0b 00 01  f7 00 01 f4 00 01 f1 30  |...............0|
-00000010  82 01 ed 30 82 01 58 a0  03 02 01 02 02 01 00 30  |...0..X........0|
-00000020  0b 06 09 2a 86 48 86 f7  0d 01 01 05 30 26 31 10  |...*.H......0&1.|
-00000030  30 0e 06 03 55 04 0a 13  07 41 63 6d 65 20 43 6f  |0...U....Acme Co|
-00000040  31 12 30 10 06 03 55 04  03 13 09 31 32 37 2e 30  |1.0...U....127.0|
-00000050  2e 30 2e 31 30 1e 17 0d  31 31 31 32 30 38 30 37  |.0.10...11120807|
-00000060  35 35 31 32 5a 17 0d 31  32 31 32 30 37 30 38 30  |5512Z..121207080|
-00000070  30 31 32 5a 30 26 31 10  30 0e 06 03 55 04 0a 13  |012Z0&1.0...U...|
-00000080  07 41 63 6d 65 20 43 6f  31 12 30 10 06 03 55 04  |.Acme Co1.0...U.|
-00000090  03 13 09 31 32 37 2e 30  2e 30 2e 31 30 81 9c 30  |...127.0.0.10..0|
-000000a0  0b 06 09 2a 86 48 86 f7  0d 01 01 01 03 81 8c 00  |...*.H..........|
-000000b0  30 81 88 02 81 80 4e d0  7b 31 e3 82 64 d9 59 c0  |0.....N.{1..d.Y.|
-000000c0  c2 87 a4 5e 1e 8b 73 33  c7 63 53 df 66 92 06 84  |...^..s3.cS.f...|
-000000d0  f6 64 d5 8f e4 36 a7 1d  2b e8 b3 20 36 45 23 b5  |.d...6..+.. 6E#.|
-000000e0  e3 95 ae ed e0 f5 20 9c  8d 95 df 7f 5a 12 ef 87  |...... .....Z...|
-000000f0  e4 5b 68 e4 e9 0e 74 ec  04 8a 7f de 93 27 c4 01  |.[h...t......'..|
-00000100  19 7a bd f2 dc 3d 14 ab  d0 54 ca 21 0c d0 4d 6e  |.z...=...T.!..Mn|
-00000110  87 2e 5c c5 d2 bb 4d 4b  4f ce b6 2c f7 7e 88 ec  |..\...MKO..,.~..|
-00000120  7c d7 02 91 74 a6 1e 0c  1a da e3 4a 5a 2e de 13  ||...t......JZ...|
-00000130  9c 4c 40 88 59 93 02 03  01 00 01 a3 32 30 30 30  |.L@.Y.......2000|
-00000140  0e 06 03 55 1d 0f 01 01  ff 04 04 03 02 00 a0 30  |...U...........0|
-00000150  0d 06 03 55 1d 0e 04 06  04 04 01 02 03 04 30 0f  |...U..........0.|
-00000160  06 03 55 1d 23 04 08 30  06 80 04 01 02 03 04 30  |..U.#..0.......0|
-00000170  0b 06 09 2a 86 48 86 f7  0d 01 01 05 03 81 81 00  |...*.H..........|
-00000180  36 1f b3 7a 0c 75 c9 6e  37 46 61 2b d5 bd c0 a7  |6..z.u.n7Fa+....|
-00000190  4b cc 46 9a 81 58 7c 85  79 29 c8 c8 c6 67 dd 32  |K.F..X|.y)...g.2|
-000001a0  56 45 2b 75 b6 e9 24 a9  50 9a be 1f 5a fa 1a 15  |VE+u..$.P...Z...|
-000001b0  d9 cc 55 95 72 16 83 b9  c2 b6 8f fd 88 8c 38 84  |..U.r.........8.|
-000001c0  1d ab 5d 92 31 13 4f fd  83 3b c6 9d f1 11 62 b6  |..].1.O..;....b.|
-000001d0  8b ec ab 67 be c8 64 b0  11 50 46 58 17 6b 99 1c  |...g..d..PFX.k..|
-000001e0  d3 1d fc 06 f1 0e e5 96  a8 0c f9 78 20 b7 44 18  |...........x .D.|
-000001f0  51 8d 10 7e 4f 94 67 df  a3 4e 70 73 8e 90 91 85  |Q..~O.g..Nps....|
-00000200  16 03 01 00 86 10 00 00  82 00 80 6d 51 f3 7f f9  |...........mQ...|
-00000210  3e fb 75 82 41 36 83 e8  6a ee 2a 2e 25 90 67 4c  |>.u.A6..j.*.%.gL|
-00000220  8e 62 2f 30 81 17 e0 85  09 0c 2b b7 23 d7 b0 e2  |.b/0......+.#...|
-00000230  1d f7 3b d7 f5 a1 27 b6  ee 24 b6 1b cc 5b ea 66  |..;...'..$...[.f|
-00000240  0d 6a f4 e5 85 f9 da 43  b4 0e 86 85 e1 f5 aa be  |.j.....C........|
-00000250  c8 ce 39 4c 9c 86 00 08  c2 4b e2 c6 ec 2f f7 ce  |..9L.....K.../..|
-00000260  e6 bd 77 82 6f 23 b6 e0  bd a2 92 b7 3a ac e8 56  |..w.o#......:..V|
-00000270  f1 af 54 5e 46 87 e9 3b  33 e7 b8 28 b7 d6 c8 90  |..T^F..;3..(....|
-00000280  35 d4 1c 43 d1 30 6f 55  4e 0a 70 16 03 01 00 86  |5..C.0oUN.p.....|
-00000290  0f 00 00 82 00 80 10 19  57 14 c3 ee 2d da cb de  |........W...-...|
-000002a0  f3 70 c5 62 91 2f ad 62  dd 10 f1 65 20 a2 cf d5  |.p.b./.b...e ...|
-000002b0  cd 6d 5f e4 b3 3e 38 e8  d0 1a f7 f0 e7 7e b6 5d  |.m_..>8......~.]|
-000002c0  c3 6c ad f6 0d 05 1e 41  35 2d 04 15 3c 36 96 00  |.l.....A5-..<6..|
-000002d0  e8 02 b2 01 b8 9f 21 4b  34 85 ef 5e 4c 87 ef 49  |......!K4..^L..I|
-000002e0  df d1 9a b6 b2 bd b8 90  fd 3f 31 93 0c dc c7 18  |.........?1.....|
-000002f0  ff f6 76 bd 5b 74 76 b3  62 87 6a df ff 63 15 d5  |..v.[tv.b.j..c..|
-00000300  94 d5 fe fd 4c 12 df f1  35 07 f1 8a f1 77 7a 35  |....L...5....wz5|
-00000310  cd 99 1d 2a d7 9a 14 03  01 00 01 01 16 03 01 00  |...*............|
-00000320  24 8d db 0c 87 b5 df fd  68 de fe 46 3e e4 41 b5  |$.......h..F>.A.|
-00000330  19 64 68 3c c4 e2 2b 43  50 e4 ee 52 75 34 d3 c1  |.dh<..+CP..Ru4..|
-00000340  51 18 c0 b2 5f                                    |Q..._|
->>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 24 0b a4 04 46 60  |..........$...F`|
-00000010  15 fb 9a 9f 47 51 6d b4  4b c6 e7 2a 1b 98 b4 8a  |....GQm.K..*....|
-00000020  8a 1a 03 cf f4 16 7d 80  70 27 e5 e8 d5 9f ad     |......}.p'.....|
->>> Flow 5 (client to server)
-00000000  17 03 01 00 1a 6f 84 50  27 c7 f1 aa b0 04 7d 80  |.....o.P'.....}.|
-00000010  6d a7 20 8a 73 cf d9 de  9a d6 f5 e9 36 13 7c 15  |m. .s.......6.|.|
-00000020  03 01 00 16 e8 0b e0 a6  3b 1e 21 24 65 4e 49 b2  |........;.!$eNI.|
-00000030  2d a3 41 2b 98 23 4e d5  4b fd                    |-.A+.#N.K.|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ECDHE-ECDSA-AES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ECDHE-ECDSA-AES
deleted file mode 100644
index 937c290..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ECDHE-ECDSA-AES
+++ /dev/null
@@ -1,88 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 f5 8f 8d 8e ca  |....Y...U.......|
-00000010  30 6b fe 63 c9 84 57 c0  f1 c8 a5 d8 10 56 14 62  |0k.c..W......V.b|
-00000020  c8 02 b2 89 21 5c 09 67  86 d8 9b 20 dc 3f 55 54  |....!\.g... .?UT|
-00000030  33 29 47 45 d3 e0 87 1a  4b 1b 75 30 89 e0 4d 01  |3)GE....K.u0..M.|
-00000040  a1 6a 46 f7 8f 23 d6 74  fd 90 2f 53 c0 09 00 00  |.jF..#.t../S....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  01 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
-00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
-00000080  30 09 06 07 2a 86 48 ce  3d 04 01 30 45 31 0b 30  |0...*.H.=..0E1.0|
-00000090  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-000000a0  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-000000b0  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-000000c0  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-000000d0  74 64 30 1e 17 0d 31 32  31 31 32 32 31 35 30 36  |td0...1211221506|
-000000e0  33 32 5a 17 0d 32 32 31  31 32 30 31 35 30 36 33  |32Z..22112015063|
-000000f0  32 5a 30 45 31 0b 30 09  06 03 55 04 06 13 02 41  |2Z0E1.0...U....A|
-00000100  55 31 13 30 11 06 03 55  04 08 13 0a 53 6f 6d 65  |U1.0...U....Some|
-00000110  2d 53 74 61 74 65 31 21  30 1f 06 03 55 04 0a 13  |-State1!0...U...|
-00000120  18 49 6e 74 65 72 6e 65  74 20 57 69 64 67 69 74  |.Internet Widgit|
-00000130  73 20 50 74 79 20 4c 74  64 30 81 9b 30 10 06 07  |s Pty Ltd0..0...|
-00000140  2a 86 48 ce 3d 02 01 06  05 2b 81 04 00 23 03 81  |*.H.=....+...#..|
-00000150  86 00 04 00 c4 a1 ed be  98 f9 0b 48 73 36 7e c3  |...........Hs6~.|
-00000160  16 56 11 22 f2 3d 53 c3  3b 4d 21 3d cd 6b 75 e6  |.V.".=S.;M!=.ku.|
-00000170  f6 b0 dc 9a df 26 c1 bc  b2 87 f0 72 32 7c b3 64  |.....&.....r2|.d|
-00000180  2f 1c 90 bc ea 68 23 10  7e fe e3 25 c0 48 3a 69  |/....h#.~..%.H:i|
-00000190  e0 28 6d d3 37 00 ef 04  62 dd 0d a0 9c 70 62 83  |.(m.7...b....pb.|
-000001a0  d8 81 d3 64 31 aa 9e 97  31 bd 96 b0 68 c0 9b 23  |...d1...1...h..#|
-000001b0  de 76 64 3f 1a 5c 7f e9  12 0e 58 58 b6 5f 70 dd  |.vd?.\....XX._p.|
-000001c0  9b d8 ea d5 d7 f5 d5 cc  b9 b6 9f 30 66 5b 66 9a  |...........0f[f.|
-000001d0  20 e2 27 e5 bf fe 3b 30  09 06 07 2a 86 48 ce 3d  | .'...;0...*.H.=|
-000001e0  04 01 03 81 8c 00 30 81  88 02 42 01 88 a2 4f eb  |......0...B...O.|
-000001f0  e2 45 c5 48 7d 1b ac f5  ed 98 9d ae 47 70 c0 5e  |.E.H}.......Gp.^|
-00000200  1b b6 2f bd f1 b6 4d b7  61 40 d3 11 a2 ce ee 0b  |../...M.a@......|
-00000210  7e 92 7e ff 76 9d c3 3b  7e a5 3f ce fa 10 e2 59  |~.~.v..;~.?....Y|
-00000220  ec 47 2d 7c ac da 4e 97  0e 15 a0 6f d0 02 42 01  |.G-|..N....o..B.|
-00000230  4d fc be 67 13 9c 2d 05  0e bd 3f a3 8c 25 c1 33  |M..g..-...?..%.3|
-00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
-00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
-00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 01 00 d5 0c 00  00 d1 03 00 17 41 04 22  |*............A."|
-00000280  8a 47 c6 d3 7a c4 30 a4  8e 41 11 ac b3 2d 2f 45  |.G..z.0..A...-/E|
-00000290  61 54 9b 1f 2e 03 5d 50  eb fc 5b 44 a0 a7 48 78  |aT....]P..[D..Hx|
-000002a0  ce 14 d5 39 a7 c4 ed f5  4d 8f da 9d 71 52 69 70  |...9....M...qRip|
-000002b0  7e 52 29 ad 80 8a 19 ad  4c 5d 1c f1 22 7e 1a 00  |~R).....L].."~..|
-000002c0  8a 30 81 87 02 42 00 97  8b 6d f7 87 c1 a9 a6 55  |.0...B...m.....U|
-000002d0  0f 61 c2 f2 e1 05 26 a8  83 16 1c 0b 69 3b 95 57  |.a....&.....i;.W|
-000002e0  76 5b eb 45 7a bd 6a f1  3e a0 93 49 fa 74 32 fd  |v[.Ez.j.>..I.t2.|
-000002f0  dc 20 3a bb e3 ee 6d b8  56 aa e9 d2 7d 6a ec b7  |. :...m.V...}j..|
-00000300  0a bd aa dc d7 b0 69 65  02 41 4d 19 61 16 d8 5f  |......ie.AM.a.._|
-00000310  1d c1 32 25 15 26 eb 88  5b c1 dd 9a 12 40 fa f1  |..2%.&..[....@..|
-00000320  81 5e 7d b8 2b 6e 60 63  1a 9e 86 cb d5 64 96 d4  |.^}.+n`c.....d..|
-00000330  75 fc 02 33 e0 66 60 b2  40 47 cf e6 6d 25 9c 83  |u..3.f`.@G..m%..|
-00000340  23 d3 4b e2 eb ac f1 56  44 f8 3f 16 03 01 00 04  |#.K....VD.?.....|
-00000350  0e 00 00 00                                       |....|
->>> Flow 3 (client to server)
-00000000  16 03 01 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000010  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000020  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000030  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000040  a6 b5 68 1a 41 03 56 6b  dc 5a 89 14 03 01 00 01  |..h.A.Vk.Z......|
-00000050  01 16 03 01 00 30 cc 86  f1 7e 6e a8 c9 b5 02 5f  |.....0...~n...._|
-00000060  fb b2 3b ea 74 bf a8 da  e4 6a 69 50 a2 5a 78 4f  |..;.t....jiP.ZxO|
-00000070  35 e1 cc 87 c3 fb 1f 5e  f6 a4 5c 63 cc 59 12 3e  |5......^..\c.Y.>|
-00000080  07 c3 a8 d7 87 ba                                 |......|
->>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 e8 b6 20 b9 c1  |..........0.. ..|
-00000010  07 38 38 bb 42 b2 b2 a1  c5 8d 92 62 db 67 ab fc  |.88.B......b.g..|
-00000020  f6 64 3f 71 83 1d a0 86  bb 2d e3 4f 65 d5 44 52  |.d?q.....-.Oe.DR|
-00000030  4d f5 62 80 3c af 95 87  19 7c 20                 |M.b.<....| |
->>> Flow 5 (client to server)
-00000000  17 03 01 00 20 bd 65 61  28 e5 ea 1b 81 db 75 92  |.... .ea(.....u.|
-00000010  ad a7 3b 01 a3 23 0e 3b  60 10 8a 1e 04 91 fb 9e  |..;..#.;`.......|
-00000020  7a cf 1f cf 9c 17 03 01  00 20 87 9c dc ed 0d 08  |z........ ......|
-00000030  56 40 23 8b c5 2c d8 7e  42 82 3c 0a c9 f3 77 6d  |V@#..,.~B.<...wm|
-00000040  8d 9a 30 d1 9c c4 ae 04  fb b7 15 03 01 00 20 f7  |..0........... .|
-00000050  f0 12 0d e5 03 c1 80 4e  7e 21 d7 75 55 1c 91 89  |.......N~!.uU...|
-00000060  e7 e1 45 fc 7d d8 fc b1  d0 e7 dc e2 4c ba f4     |..E.}.......L..|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ECDHE-RSA-AES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ECDHE-RSA-AES
deleted file mode 100644
index f8183f1..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-ECDHE-RSA-AES
+++ /dev/null
@@ -1,98 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 01 00 59 02 00 00  55 03 01 5c 69 d0 60 d6  |....Y...U..\i.`.|
-00000010  b3 f4 23 19 5e 3e 26 d8  29 ea c3 94 e4 ed 51 f6  |..#.^>&.).....Q.|
-00000020  58 a2 e3 9c 79 a1 0b 6d  29 90 32 20 23 5b 47 b1  |X...y..m).2 #[G.|
-00000030  8f 22 bc 06 aa ee f7 c3  97 ca 93 df b1 90 7d b4  |."............}.|
-00000040  8c c0 d9 54 35 ca 5b 11  98 37 84 ea c0 13 00 00  |...T5.[..7......|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  01 02 be 0b 00 02 ba 00  02 b7 00 02 b4 30 82 02  |.............0..|
-00000070  b0 30 82 02 19 a0 03 02  01 02 02 09 00 85 b0 bb  |.0..............|
-00000080  a4 8a 7f b8 ca 30 0d 06  09 2a 86 48 86 f7 0d 01  |.....0...*.H....|
-00000090  01 05 05 00 30 45 31 0b  30 09 06 03 55 04 06 13  |....0E1.0...U...|
-000000a0  02 41 55 31 13 30 11 06  03 55 04 08 13 0a 53 6f  |.AU1.0...U....So|
-000000b0  6d 65 2d 53 74 61 74 65  31 21 30 1f 06 03 55 04  |me-State1!0...U.|
-000000c0  0a 13 18 49 6e 74 65 72  6e 65 74 20 57 69 64 67  |...Internet Widg|
-000000d0  69 74 73 20 50 74 79 20  4c 74 64 30 1e 17 0d 31  |its Pty Ltd0...1|
-000000e0  30 30 34 32 34 30 39 30  39 33 38 5a 17 0d 31 31  |00424090938Z..11|
-000000f0  30 34 32 34 30 39 30 39  33 38 5a 30 45 31 0b 30  |0424090938Z0E1.0|
-00000100  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-00000110  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-00000120  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-00000130  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-00000140  74 64 30 81 9f 30 0d 06  09 2a 86 48 86 f7 0d 01  |td0..0...*.H....|
-00000150  01 01 05 00 03 81 8d 00  30 81 89 02 81 81 00 bb  |........0.......|
-00000160  79 d6 f5 17 b5 e5 bf 46  10 d0 dc 69 be e6 2b 07  |y......F...i..+.|
-00000170  43 5a d0 03 2d 8a 7a 43  85 b7 14 52 e7 a5 65 4c  |CZ..-.zC...R..eL|
-00000180  2c 78 b8 23 8c b5 b4 82  e5 de 1f 95 3b 7e 62 a5  |,x.#........;~b.|
-00000190  2c a5 33 d6 fe 12 5c 7a  56 fc f5 06 bf fa 58 7b  |,.3...\zV.....X{|
-000001a0  26 3f b5 cd 04 d3 d0 c9  21 96 4a c7 f4 54 9f 5a  |&?......!.J..T.Z|
-000001b0  bf ef 42 71 00 fe 18 99  07 7f 7e 88 7d 7d f1 04  |..Bq......~.}}..|
-000001c0  39 c4 a2 2e db 51 c9 7c  e3 c0 4c 3b 32 66 01 cf  |9....Q.|..L;2f..|
-000001d0  af b1 1d b8 71 9a 1d db  db 89 6b ae da 2d 79 02  |....q.....k..-y.|
-000001e0  03 01 00 01 a3 81 a7 30  81 a4 30 1d 06 03 55 1d  |.......0..0...U.|
-000001f0  0e 04 16 04 14 b1 ad e2  85 5a cf cb 28 db 69 ce  |.........Z..(.i.|
-00000200  23 69 de d3 26 8e 18 88  39 30 75 06 03 55 1d 23  |#i..&...90u..U.#|
-00000210  04 6e 30 6c 80 14 b1 ad  e2 85 5a cf cb 28 db 69  |.n0l......Z..(.i|
-00000220  ce 23 69 de d3 26 8e 18  88 39 a1 49 a4 47 30 45  |.#i..&...9.I.G0E|
-00000230  31 0b 30 09 06 03 55 04  06 13 02 41 55 31 13 30  |1.0...U....AU1.0|
-00000240  11 06 03 55 04 08 13 0a  53 6f 6d 65 2d 53 74 61  |...U....Some-Sta|
-00000250  74 65 31 21 30 1f 06 03  55 04 0a 13 18 49 6e 74  |te1!0...U....Int|
-00000260  65 72 6e 65 74 20 57 69  64 67 69 74 73 20 50 74  |ernet Widgits Pt|
-00000270  79 20 4c 74 64 82 09 00  85 b0 bb a4 8a 7f b8 ca  |y Ltd...........|
-00000280  30 0c 06 03 55 1d 13 04  05 30 03 01 01 ff 30 0d  |0...U....0....0.|
-00000290  06 09 2a 86 48 86 f7 0d  01 01 05 05 00 03 81 81  |..*.H...........|
-000002a0  00 08 6c 45 24 c7 6b b1  59 ab 0c 52 cc f2 b0 14  |..lE$.k.Y..R....|
-000002b0  d7 87 9d 7a 64 75 b5 5a  95 66 e4 c5 2b 8e ae 12  |...zdu.Z.f..+...|
-000002c0  66 1f eb 4f 38 b3 6e 60  d3 92 fd f7 41 08 b5 25  |f..O8.n`....A..%|
-000002d0  13 b1 18 7a 24 fb 30 1d  ba ed 98 b9 17 ec e7 d7  |...z$.0.........|
-000002e0  31 59 db 95 d3 1d 78 ea  50 56 5c d5 82 5a 2d 5a  |1Y....x.PV\..Z-Z|
-000002f0  5f 33 c4 b6 d8 c9 75 90  96 8c 0f 52 98 b5 cd 98  |_3....u....R....|
-00000300  1f 89 20 5f f2 a0 1c a3  1b 96 94 dd a9 fd 57 e9  |.. _..........W.|
-00000310  70 e8 26 6d 71 99 9b 26  6e 38 50 29 6c 90 a7 bd  |p.&mq..&n8P)l...|
-00000320  d9 16 03 01 00 cb 0c 00  00 c7 03 00 17 41 04 a6  |.............A..|
-00000330  57 60 8d 63 4e 4d 3f 48  e0 5d ad 9a 9c f7 e6 8c  |W`.cNM?H.]......|
-00000340  00 18 9c eb 34 ea f0 5c  d5 77 3f af 81 a9 50 d9  |....4..\.w?...P.|
-00000350  05 cf b9 bf 88 5c 70 29  24 61 6f d8 77 11 21 57  |.....\p)$ao.w.!W|
-00000360  a0 4d e1 4b 8e 55 06 50  7f a2 30 c1 c2 b9 c6 00  |.M.K.U.P..0.....|
-00000370  80 68 7c e4 1a bc a4 1e  16 b9 3e 4a 59 39 a9 54  |.h|.......>JY9.T|
-00000380  6f c7 17 b2 f5 af b5 73  5b db cc 71 f2 1b aa dc  |o......s[..q....|
-00000390  9d 64 3c 0f 82 e6 da 1a  6b 96 19 e2 f0 15 b0 df  |.d<.....k.......|
-000003a0  8a 2d 96 09 63 52 f6 53  ef 12 d4 3b 35 b7 0b 43  |.-..cR.S...;5..C|
-000003b0  2c 6e 58 4c c8 2f b8 55  84 89 c9 39 81 7a 7a 7d  |,nXL./.U...9.zz}|
-000003c0  88 68 db eb d7 81 aa 2e  b2 25 ba 98 6c 46 b7 85  |.h.......%..lF..|
-000003d0  8a 21 17 b9 36 23 c0 84  94 af 3b 9b 04 5d ec 31  |.!..6#....;..].1|
-000003e0  f5 75 84 d8 77 d7 80 37  ae c3 5c 26 41 f6 72 af  |.u..w..7..\&A.r.|
-000003f0  88 16 03 01 00 04 0e 00  00 00                    |..........|
->>> Flow 3 (client to server)
-00000000  16 03 01 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000010  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000020  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000030  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000040  a6 b5 68 1a 41 03 56 6b  dc 5a 89 14 03 01 00 01  |..h.A.Vk.Z......|
-00000050  01 16 03 01 00 30 d2 5b  27 5a f5 64 49 31 d5 aa  |.....0.['Z.dI1..|
-00000060  a3 72 ae c9 af 0b aa 75  af ac f3 45 f4 e3 03 fa  |.r.....u...E....|
-00000070  e8 97 88 7b 51 a9 ae 61  40 c8 11 74 3e d8 9a b6  |...{Q..a@..t>...|
-00000080  e7 6a 5e 71 84 7e                                 |.j^q.~|
->>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 8d 63 fc 58 2e  |..........0.c.X.|
-00000010  50 f7 60 2c 9f 5a 8e 58  29 6c a6 3a 8d 2b a7 2b  |P.`,.Z.X)l.:.+.+|
-00000020  1c 12 8a 53 3f d5 60 79  12 c3 78 e3 aa 50 15 45  |...S?.`y..x..P.E|
-00000030  07 da 2d c7 a9 c3 45 07  48 00 78                 |..-...E.H.x|
->>> Flow 5 (client to server)
-00000000  17 03 01 00 20 40 91 8d  e6 95 2f 97 c8 0c 94 5c  |.... @..../....\|
-00000010  46 a7 d3 31 82 3d dc 7e  86 5b dd df 3f 3b 5b 9c  |F..1.=.~.[..?;[.|
-00000020  d5 0d 52 5a 53 17 03 01  00 20 1d 18 da 6b e8 66  |..RZS.... ...k.f|
-00000030  ce 58 18 81 4b 69 8c f6  db 1a ee d0 78 fb f5 68  |.X..Ki......x..h|
-00000040  2c 99 48 47 65 15 2a ae  ff 4e 15 03 01 00 20 68  |,.HGe.*..N.... h|
-00000050  aa 7f 75 33 45 7a 1a 33  18 35 5a 5b 14 b0 f6 83  |..u3Ez.3.5Z[....|
-00000060  97 85 3f b2 dc 78 68 eb  43 ef 92 7f 38 bd f8     |..?..xh.C...8..|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-RSA-RC4 b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-RSA-RC4
deleted file mode 100644
index b5deaeb..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv10-RSA-RC4
+++ /dev/null
@@ -1,84 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 01 00 51 02 00 00  4d 03 01 a9 b0 bf 24 3f  |....Q...M.....$?|
-00000010  98 c6 0f 83 23 2b b6 e4  3f d5 5b 10 9a 6f b8 63  |....#+..?.[..o.c|
-00000020  4c 3c d6 4d 05 c0 08 85  f7 72 72 20 ab 85 8c ff  |L<.M.....rr ....|
-00000030  f7 bb 95 ab 69 37 3d b6  79 cb 46 ad 4e 22 e7 c6  |....i7=.y.F.N"..|
-00000040  a5 9b 72 92 32 ff a5 f7  ed dc 30 41 00 05 00 00  |..r.2.....0A....|
-00000050  05 ff 01 00 01 00 16 03  01 02 be 0b 00 02 ba 00  |................|
-00000060  02 b7 00 02 b4 30 82 02  b0 30 82 02 19 a0 03 02  |.....0...0......|
-00000070  01 02 02 09 00 85 b0 bb  a4 8a 7f b8 ca 30 0d 06  |.............0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 05 05 00 30 45 31 0b  |.*.H........0E1.|
-00000090  30 09 06 03 55 04 06 13  02 41 55 31 13 30 11 06  |0...U....AU1.0..|
-000000a0  03 55 04 08 13 0a 53 6f  6d 65 2d 53 74 61 74 65  |.U....Some-State|
-000000b0  31 21 30 1f 06 03 55 04  0a 13 18 49 6e 74 65 72  |1!0...U....Inter|
-000000c0  6e 65 74 20 57 69 64 67  69 74 73 20 50 74 79 20  |net Widgits Pty |
-000000d0  4c 74 64 30 1e 17 0d 31  30 30 34 32 34 30 39 30  |Ltd0...100424090|
-000000e0  39 33 38 5a 17 0d 31 31  30 34 32 34 30 39 30 39  |938Z..1104240909|
-000000f0  33 38 5a 30 45 31 0b 30  09 06 03 55 04 06 13 02  |38Z0E1.0...U....|
-00000100  41 55 31 13 30 11 06 03  55 04 08 13 0a 53 6f 6d  |AU1.0...U....Som|
-00000110  65 2d 53 74 61 74 65 31  21 30 1f 06 03 55 04 0a  |e-State1!0...U..|
-00000120  13 18 49 6e 74 65 72 6e  65 74 20 57 69 64 67 69  |..Internet Widgi|
-00000130  74 73 20 50 74 79 20 4c  74 64 30 81 9f 30 0d 06  |ts Pty Ltd0..0..|
-00000140  09 2a 86 48 86 f7 0d 01  01 01 05 00 03 81 8d 00  |.*.H............|
-00000150  30 81 89 02 81 81 00 bb  79 d6 f5 17 b5 e5 bf 46  |0.......y......F|
-00000160  10 d0 dc 69 be e6 2b 07  43 5a d0 03 2d 8a 7a 43  |...i..+.CZ..-.zC|
-00000170  85 b7 14 52 e7 a5 65 4c  2c 78 b8 23 8c b5 b4 82  |...R..eL,x.#....|
-00000180  e5 de 1f 95 3b 7e 62 a5  2c a5 33 d6 fe 12 5c 7a  |....;~b.,.3...\z|
-00000190  56 fc f5 06 bf fa 58 7b  26 3f b5 cd 04 d3 d0 c9  |V.....X{&?......|
-000001a0  21 96 4a c7 f4 54 9f 5a  bf ef 42 71 00 fe 18 99  |!.J..T.Z..Bq....|
-000001b0  07 7f 7e 88 7d 7d f1 04  39 c4 a2 2e db 51 c9 7c  |..~.}}..9....Q.||
-000001c0  e3 c0 4c 3b 32 66 01 cf  af b1 1d b8 71 9a 1d db  |..L;2f......q...|
-000001d0  db 89 6b ae da 2d 79 02  03 01 00 01 a3 81 a7 30  |..k..-y........0|
-000001e0  81 a4 30 1d 06 03 55 1d  0e 04 16 04 14 b1 ad e2  |..0...U.........|
-000001f0  85 5a cf cb 28 db 69 ce  23 69 de d3 26 8e 18 88  |.Z..(.i.#i..&...|
-00000200  39 30 75 06 03 55 1d 23  04 6e 30 6c 80 14 b1 ad  |90u..U.#.n0l....|
-00000210  e2 85 5a cf cb 28 db 69  ce 23 69 de d3 26 8e 18  |..Z..(.i.#i..&..|
-00000220  88 39 a1 49 a4 47 30 45  31 0b 30 09 06 03 55 04  |.9.I.G0E1.0...U.|
-00000230  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
-00000240  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
-00000250  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
-00000260  64 67 69 74 73 20 50 74  79 20 4c 74 64 82 09 00  |dgits Pty Ltd...|
-00000270  85 b0 bb a4 8a 7f b8 ca  30 0c 06 03 55 1d 13 04  |........0...U...|
-00000280  05 30 03 01 01 ff 30 0d  06 09 2a 86 48 86 f7 0d  |.0....0...*.H...|
-00000290  01 01 05 05 00 03 81 81  00 08 6c 45 24 c7 6b b1  |..........lE$.k.|
-000002a0  59 ab 0c 52 cc f2 b0 14  d7 87 9d 7a 64 75 b5 5a  |Y..R.......zdu.Z|
-000002b0  95 66 e4 c5 2b 8e ae 12  66 1f eb 4f 38 b3 6e 60  |.f..+...f..O8.n`|
-000002c0  d3 92 fd f7 41 08 b5 25  13 b1 18 7a 24 fb 30 1d  |....A..%...z$.0.|
-000002d0  ba ed 98 b9 17 ec e7 d7  31 59 db 95 d3 1d 78 ea  |........1Y....x.|
-000002e0  50 56 5c d5 82 5a 2d 5a  5f 33 c4 b6 d8 c9 75 90  |PV\..Z-Z_3....u.|
-000002f0  96 8c 0f 52 98 b5 cd 98  1f 89 20 5f f2 a0 1c a3  |...R...... _....|
-00000300  1b 96 94 dd a9 fd 57 e9  70 e8 26 6d 71 99 9b 26  |......W.p.&mq..&|
-00000310  6e 38 50 29 6c 90 a7 bd  d9 16 03 01 00 04 0e 00  |n8P)l...........|
-00000320  00 00                                             |..|
->>> Flow 3 (client to server)
-00000000  16 03 01 00 86 10 00 00  82 00 80 6d 51 f3 7f f9  |...........mQ...|
-00000010  3e fb 75 82 41 36 83 e8  6a ee 2a 2e 25 90 67 4c  |>.u.A6..j.*.%.gL|
-00000020  8e 62 2f 30 81 17 e0 85  09 0c 2b b7 23 d7 b0 e2  |.b/0......+.#...|
-00000030  1d f7 3b d7 f5 a1 27 b6  ee 24 b6 1b cc 5b ea 66  |..;...'..$...[.f|
-00000040  0d 6a f4 e5 85 f9 da 43  b4 0e 86 85 e1 f5 aa be  |.j.....C........|
-00000050  c8 ce 39 4c 9c 86 00 08  c2 4b e2 c6 ec 2f f7 ce  |..9L.....K.../..|
-00000060  e6 bd 77 82 6f 23 b6 e0  bd a2 92 b7 3a ac e8 56  |..w.o#......:..V|
-00000070  f1 af 54 5e 46 87 e9 3b  33 e7 b8 28 b7 d6 c8 90  |..T^F..;3..(....|
-00000080  35 d4 1c 43 d1 30 6f 55  4e 0a 70 14 03 01 00 01  |5..C.0oUN.p.....|
-00000090  01 16 03 01 00 24 4d 1d  d7 8c d6 c7 65 a6 ce af  |.....$M.....e...|
-000000a0  e7 59 0d 7e dc d9 96 1c  ed 9c 57 94 84 b8 3f b5  |.Y.~......W...?.|
-000000b0  34 e1 61 a5 61 f3 5d 09  bc ff                    |4.a.a.]...|
->>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 24 13 81 89 61 5c  |..........$...a\|
-00000010  fb 0a 9c a1 4b db 94 6b  8b 41 6e 63 d6 aa db 88  |....K..k.Anc....|
-00000020  03 b7 b5 19 b8 12 cf 5e  17 54 79 2f 03 91 7e     |.......^.Ty/..~|
->>> Flow 5 (client to server)
-00000000  17 03 01 00 1a b3 2b da  ce 45 ec b2 9d 3b 18 d9  |......+..E...;..|
-00000010  7a cb 99 ea ff 4d 91 b5  48 df 6f 8b 2f 85 c7 15  |z....M..H.o./...|
-00000020  03 01 00 16 19 1c 72 74  36 cf 22 0f a0 a7 18 96  |......rt6.".....|
-00000030  3a 67 cb 22 16 f1 a8 7b  57 37                    |:g."...{W7|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv11-ECDHE-ECDSA-AES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv11-ECDHE-ECDSA-AES
deleted file mode 100644
index a4a2930..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv11-ECDHE-ECDSA-AES
+++ /dev/null
@@ -1,90 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 02 00 59 02 00 00  55 03 02 5a 52 92 23 05  |....Y...U..ZR.#.|
-00000010  58 68 b2 1e 77 a2 a8 16  e9 88 85 ea 38 b3 63 c2  |Xh..w.......8.c.|
-00000020  40 f8 de 37 3c d4 b9 51  11 2d d1 20 12 fd 95 b3  |@..7<..Q.-. ....|
-00000030  2a 54 40 c0 23 3a 4e 4e  f6 7b f8 77 04 6e e7 d7  |*T@.#:NN.{.w.n..|
-00000040  3b 9a 45 32 e0 af df aa  ff bf 78 8b c0 09 00 00  |;.E2......x.....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  02 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
-00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
-00000080  30 09 06 07 2a 86 48 ce  3d 04 01 30 45 31 0b 30  |0...*.H.=..0E1.0|
-00000090  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-000000a0  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-000000b0  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-000000c0  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-000000d0  74 64 30 1e 17 0d 31 32  31 31 32 32 31 35 30 36  |td0...1211221506|
-000000e0  33 32 5a 17 0d 32 32 31  31 32 30 31 35 30 36 33  |32Z..22112015063|
-000000f0  32 5a 30 45 31 0b 30 09  06 03 55 04 06 13 02 41  |2Z0E1.0...U....A|
-00000100  55 31 13 30 11 06 03 55  04 08 13 0a 53 6f 6d 65  |U1.0...U....Some|
-00000110  2d 53 74 61 74 65 31 21  30 1f 06 03 55 04 0a 13  |-State1!0...U...|
-00000120  18 49 6e 74 65 72 6e 65  74 20 57 69 64 67 69 74  |.Internet Widgit|
-00000130  73 20 50 74 79 20 4c 74  64 30 81 9b 30 10 06 07  |s Pty Ltd0..0...|
-00000140  2a 86 48 ce 3d 02 01 06  05 2b 81 04 00 23 03 81  |*.H.=....+...#..|
-00000150  86 00 04 00 c4 a1 ed be  98 f9 0b 48 73 36 7e c3  |...........Hs6~.|
-00000160  16 56 11 22 f2 3d 53 c3  3b 4d 21 3d cd 6b 75 e6  |.V.".=S.;M!=.ku.|
-00000170  f6 b0 dc 9a df 26 c1 bc  b2 87 f0 72 32 7c b3 64  |.....&.....r2|.d|
-00000180  2f 1c 90 bc ea 68 23 10  7e fe e3 25 c0 48 3a 69  |/....h#.~..%.H:i|
-00000190  e0 28 6d d3 37 00 ef 04  62 dd 0d a0 9c 70 62 83  |.(m.7...b....pb.|
-000001a0  d8 81 d3 64 31 aa 9e 97  31 bd 96 b0 68 c0 9b 23  |...d1...1...h..#|
-000001b0  de 76 64 3f 1a 5c 7f e9  12 0e 58 58 b6 5f 70 dd  |.vd?.\....XX._p.|
-000001c0  9b d8 ea d5 d7 f5 d5 cc  b9 b6 9f 30 66 5b 66 9a  |...........0f[f.|
-000001d0  20 e2 27 e5 bf fe 3b 30  09 06 07 2a 86 48 ce 3d  | .'...;0...*.H.=|
-000001e0  04 01 03 81 8c 00 30 81  88 02 42 01 88 a2 4f eb  |......0...B...O.|
-000001f0  e2 45 c5 48 7d 1b ac f5  ed 98 9d ae 47 70 c0 5e  |.E.H}.......Gp.^|
-00000200  1b b6 2f bd f1 b6 4d b7  61 40 d3 11 a2 ce ee 0b  |../...M.a@......|
-00000210  7e 92 7e ff 76 9d c3 3b  7e a5 3f ce fa 10 e2 59  |~.~.v..;~.?....Y|
-00000220  ec 47 2d 7c ac da 4e 97  0e 15 a0 6f d0 02 42 01  |.G-|..N....o..B.|
-00000230  4d fc be 67 13 9c 2d 05  0e bd 3f a3 8c 25 c1 33  |M..g..-...?..%.3|
-00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
-00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
-00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 02 00 d5 0c 00  00 d1 03 00 17 41 04 c3  |*............A..|
-00000280  55 86 65 95 83 02 4b 69  6e 95 f4 52 46 83 21 86  |U.e...Kin..RF.!.|
-00000290  9e 99 cf 81 d9 b8 20 7a  87 b3 07 48 14 04 20 d9  |...... z...H.. .|
-000002a0  6c 2e 22 5a b5 b4 ef de  15 b3 08 ef 1e 18 ea 67  |l."Z...........g|
-000002b0  eb 45 fd e1 27 43 ed 41  ea 05 7e f3 f9 ee 23 00  |.E..'C.A..~...#.|
-000002c0  8a 30 81 87 02 42 00 b0  9c 06 85 83 b2 bf 42 22  |.0...B........B"|
-000002d0  6e 57 7a 31 fe a9 d9 28  be 0a a9 80 49 a2 14 c1  |nWz1...(....I...|
-000002e0  a9 99 76 b7 f9 76 d0 3c  d3 0c c7 42 34 d7 94 a9  |..v..v.<...B4...|
-000002f0  15 66 7e 6b 83 6e b2 b4  5b 22 c9 4e a0 96 db 2b  |.f~k.n..[".N...+|
-00000300  ad 77 33 1e 4a 5c 2f 2e  02 41 26 0c 1a 5a b4 07  |.w3.J\/..A&..Z..|
-00000310  95 99 ec 0b 5b 2e bb db  0e d5 26 c4 b3 eb c2 30  |....[.....&....0|
-00000320  b0 7b c1 07 97 a0 99 3f  db 4e b0 c4 b8 bb 5e be  |.{.....?.N....^.|
-00000330  2a e4 b3 a4 5c ad d1 d7  7a 2d fb ae 73 ee 0c 1e  |*...\...z-..s...|
-00000340  3b 64 e1 74 14 bc c0 1e  8b f3 26 16 03 02 00 04  |;d.t......&.....|
-00000350  0e 00 00 00                                       |....|
->>> Flow 3 (client to server)
-00000000  16 03 02 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000010  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000020  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000030  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000040  a6 b5 68 1a 41 03 56 6b  dc 5a 89 14 03 02 00 01  |..h.A.Vk.Z......|
-00000050  01 16 03 02 00 40 00 00  00 00 00 00 00 00 00 00  |.....@..........|
-00000060  00 00 00 00 00 00 33 07  8a af e1 94 ef f9 08 3a  |......3........:|
-00000070  33 5f b3 e6 42 07 85 af  40 e2 8b 34 53 62 1a 10  |3_..B...@..4Sb..|
-00000080  bb 08 7e 75 d4 21 12 2d  54 87 33 1c 4e 13 27 72  |..~u.!.-T.3.N.'r|
-00000090  3f 9e 9f cc de 47                                 |?....G|
->>> Flow 4 (server to client)
-00000000  14 03 02 00 01 01 16 03  02 00 40 4f 47 0d 43 54  |..........@OG.CT|
-00000010  50 69 3a c8 21 a6 6e 28  78 cc 01 b4 5d eb f7 2b  |Pi:.!.n(x...]..+|
-00000020  8b 7e 26 6e cf 56 98 65  ad bf 0f a0 b4 67 13 70  |.~&n.V.e.....g.p|
-00000030  de b5 b5 91 df d6 df 8c  53 c6 54 3d 5d 98 e4 25  |........S.T=]..%|
-00000040  47 a0 0f 91 c7 08 96 17  48 bd 0f                 |G.......H..|
->>> Flow 5 (client to server)
-00000000  17 03 02 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000010  00 00 00 00 00 4e fe 12  d7 4b d7 3f 86 5a 2c f6  |.....N...K.?.Z,.|
-00000020  86 03 2a bd 1a 98 d7 bb  9f 59 6c 6d 4d 57 b0 50  |..*......YlmMW.P|
-00000030  d6 97 7e d4 b6 15 03 02  00 30 00 00 00 00 00 00  |..~......0......|
-00000040  00 00 00 00 00 00 00 00  00 00 65 8b b5 ae 86 90  |..........e.....|
-00000050  00 4e 1e 3f bc ac ed 49  f4 5e 73 49 e6 d8 37 83  |.N.?...I.^sI..7.|
-00000060  cf 4f e5 7b 5e c9 1d c8  c9 dc                    |.O.{^.....|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv11-ECDHE-RSA-AES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv11-ECDHE-RSA-AES
deleted file mode 100644
index 103f1d8..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv11-ECDHE-RSA-AES
+++ /dev/null
@@ -1,100 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 02 00 59 02 00 00  55 03 02 e3 ed 49 27 a3  |....Y...U....I'.|
-00000010  28 c5 8c 30 27 c2 ed 57  9b f7 37 a1 6d 2b 88 c2  |(..0'..W..7.m+..|
-00000020  df a7 2d 01 01 00 9a 09  da c2 1f 20 ee 33 87 03  |..-........ .3..|
-00000030  28 93 1c 16 99 5b b1 e0  bf 87 e8 77 4a 72 c9 92  |(....[.....wJr..|
-00000040  8a bc b2 3e 24 e1 f6 e8  f4 3f a2 24 c0 13 00 00  |...>$....?.$....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  02 02 be 0b 00 02 ba 00  02 b7 00 02 b4 30 82 02  |.............0..|
-00000070  b0 30 82 02 19 a0 03 02  01 02 02 09 00 85 b0 bb  |.0..............|
-00000080  a4 8a 7f b8 ca 30 0d 06  09 2a 86 48 86 f7 0d 01  |.....0...*.H....|
-00000090  01 05 05 00 30 45 31 0b  30 09 06 03 55 04 06 13  |....0E1.0...U...|
-000000a0  02 41 55 31 13 30 11 06  03 55 04 08 13 0a 53 6f  |.AU1.0...U....So|
-000000b0  6d 65 2d 53 74 61 74 65  31 21 30 1f 06 03 55 04  |me-State1!0...U.|
-000000c0  0a 13 18 49 6e 74 65 72  6e 65 74 20 57 69 64 67  |...Internet Widg|
-000000d0  69 74 73 20 50 74 79 20  4c 74 64 30 1e 17 0d 31  |its Pty Ltd0...1|
-000000e0  30 30 34 32 34 30 39 30  39 33 38 5a 17 0d 31 31  |00424090938Z..11|
-000000f0  30 34 32 34 30 39 30 39  33 38 5a 30 45 31 0b 30  |0424090938Z0E1.0|
-00000100  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-00000110  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-00000120  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-00000130  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-00000140  74 64 30 81 9f 30 0d 06  09 2a 86 48 86 f7 0d 01  |td0..0...*.H....|
-00000150  01 01 05 00 03 81 8d 00  30 81 89 02 81 81 00 bb  |........0.......|
-00000160  79 d6 f5 17 b5 e5 bf 46  10 d0 dc 69 be e6 2b 07  |y......F...i..+.|
-00000170  43 5a d0 03 2d 8a 7a 43  85 b7 14 52 e7 a5 65 4c  |CZ..-.zC...R..eL|
-00000180  2c 78 b8 23 8c b5 b4 82  e5 de 1f 95 3b 7e 62 a5  |,x.#........;~b.|
-00000190  2c a5 33 d6 fe 12 5c 7a  56 fc f5 06 bf fa 58 7b  |,.3...\zV.....X{|
-000001a0  26 3f b5 cd 04 d3 d0 c9  21 96 4a c7 f4 54 9f 5a  |&?......!.J..T.Z|
-000001b0  bf ef 42 71 00 fe 18 99  07 7f 7e 88 7d 7d f1 04  |..Bq......~.}}..|
-000001c0  39 c4 a2 2e db 51 c9 7c  e3 c0 4c 3b 32 66 01 cf  |9....Q.|..L;2f..|
-000001d0  af b1 1d b8 71 9a 1d db  db 89 6b ae da 2d 79 02  |....q.....k..-y.|
-000001e0  03 01 00 01 a3 81 a7 30  81 a4 30 1d 06 03 55 1d  |.......0..0...U.|
-000001f0  0e 04 16 04 14 b1 ad e2  85 5a cf cb 28 db 69 ce  |.........Z..(.i.|
-00000200  23 69 de d3 26 8e 18 88  39 30 75 06 03 55 1d 23  |#i..&...90u..U.#|
-00000210  04 6e 30 6c 80 14 b1 ad  e2 85 5a cf cb 28 db 69  |.n0l......Z..(.i|
-00000220  ce 23 69 de d3 26 8e 18  88 39 a1 49 a4 47 30 45  |.#i..&...9.I.G0E|
-00000230  31 0b 30 09 06 03 55 04  06 13 02 41 55 31 13 30  |1.0...U....AU1.0|
-00000240  11 06 03 55 04 08 13 0a  53 6f 6d 65 2d 53 74 61  |...U....Some-Sta|
-00000250  74 65 31 21 30 1f 06 03  55 04 0a 13 18 49 6e 74  |te1!0...U....Int|
-00000260  65 72 6e 65 74 20 57 69  64 67 69 74 73 20 50 74  |ernet Widgits Pt|
-00000270  79 20 4c 74 64 82 09 00  85 b0 bb a4 8a 7f b8 ca  |y Ltd...........|
-00000280  30 0c 06 03 55 1d 13 04  05 30 03 01 01 ff 30 0d  |0...U....0....0.|
-00000290  06 09 2a 86 48 86 f7 0d  01 01 05 05 00 03 81 81  |..*.H...........|
-000002a0  00 08 6c 45 24 c7 6b b1  59 ab 0c 52 cc f2 b0 14  |..lE$.k.Y..R....|
-000002b0  d7 87 9d 7a 64 75 b5 5a  95 66 e4 c5 2b 8e ae 12  |...zdu.Z.f..+...|
-000002c0  66 1f eb 4f 38 b3 6e 60  d3 92 fd f7 41 08 b5 25  |f..O8.n`....A..%|
-000002d0  13 b1 18 7a 24 fb 30 1d  ba ed 98 b9 17 ec e7 d7  |...z$.0.........|
-000002e0  31 59 db 95 d3 1d 78 ea  50 56 5c d5 82 5a 2d 5a  |1Y....x.PV\..Z-Z|
-000002f0  5f 33 c4 b6 d8 c9 75 90  96 8c 0f 52 98 b5 cd 98  |_3....u....R....|
-00000300  1f 89 20 5f f2 a0 1c a3  1b 96 94 dd a9 fd 57 e9  |.. _..........W.|
-00000310  70 e8 26 6d 71 99 9b 26  6e 38 50 29 6c 90 a7 bd  |p.&mq..&n8P)l...|
-00000320  d9 16 03 02 00 cb 0c 00  00 c7 03 00 17 41 04 f7  |.............A..|
-00000330  75 c1 b9 58 a0 7d 50 48  e9 85 79 db 89 76 4c d7  |u..X.}PH..y..vL.|
-00000340  84 5b 94 9a 15 d8 92 32  74 d2 3e ce 76 5a bd 0e  |.[.....2t.>.vZ..|
-00000350  24 e7 a6 d0 77 5d 8e 3d  9f 94 7a ea 15 46 3c 5c  |$...w].=..z..F<\|
-00000360  61 28 76 4a ff 81 97 2b  3a 0c b7 aa b4 0e cb 00  |a(vJ...+:.......|
-00000370  80 19 00 a8 fe 0a ea 35  30 51 a3 77 37 08 68 10  |.......50Q.w7.h.|
-00000380  5a e9 07 2d 83 67 77 4c  3a 25 14 1c 5b c1 2e 80  |Z..-.gwL:%..[...|
-00000390  30 6d ba 26 c1 f9 c6 3e  fc 55 34 8c d2 9f 2b a6  |0m.&...>.U4...+.|
-000003a0  46 0c 9d 58 2c 9c 2b ce  6f 03 d7 49 4e df 21 ce  |F..X,.+.o..IN.!.|
-000003b0  3f 8b 19 fe 3e 71 23 51  c3 ec 30 c8 3e 3c 3c 50  |?...>q#Q..0.><<P|
-000003c0  da 08 52 c0 10 9f e3 4a  be e0 97 aa de 5e 13 22  |..R....J.....^."|
-000003d0  b2 77 ee 5d 2d d4 ff fb  7f c3 1e e7 51 fe fc 4b  |.w.]-.......Q..K|
-000003e0  56 5b 8f 50 ad cc 34 7a  a9 dd 24 0a d0 c7 b9 bf  |V[.P..4z..$.....|
-000003f0  1a 16 03 02 00 04 0e 00  00 00                    |..........|
->>> Flow 3 (client to server)
-00000000  16 03 02 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000010  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000020  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000030  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000040  a6 b5 68 1a 41 03 56 6b  dc 5a 89 14 03 02 00 01  |..h.A.Vk.Z......|
-00000050  01 16 03 02 00 40 00 00  00 00 00 00 00 00 00 00  |.....@..........|
-00000060  00 00 00 00 00 00 1e 0b  cd 40 fa 0f ed fa 55 74  |.........@....Ut|
-00000070  4e ad 10 d1 b5 e1 41 8c  c0 93 81 38 f3 83 f1 37  |N.....A....8...7|
-00000080  6a d4 6c ea ba 5b 9e 38  d3 c1 bb 41 45 fb f0 48  |j.l..[.8...AE..H|
-00000090  c1 06 31 64 e0 65                                 |..1d.e|
->>> Flow 4 (server to client)
-00000000  14 03 02 00 01 01 16 03  02 00 40 17 d1 79 f8 e0  |..........@..y..|
-00000010  d4 40 15 85 df 4d a6 d5  60 90 1f d6 52 58 e7 ae  |.@...M..`...RX..|
-00000020  05 eb a2 ea ed c9 be ae  b5 54 39 de 05 66 27 67  |.........T9..f'g|
-00000030  59 07 03 e7 10 f9 3f da  d8 85 8b 2f 7b 33 9f f5  |Y.....?..../{3..|
-00000040  43 50 b9 9c 6e dd 01 ae  d8 c9 1d                 |CP..n......|
->>> Flow 5 (client to server)
-00000000  17 03 02 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000010  00 00 00 00 00 65 81 63  71 55 1c 46 8a 60 46 d9  |.....e.cqU.F.`F.|
-00000020  7d 71 a2 62 b8 a8 3b 06  3d a2 f4 53 a4 46 a8 9e  |}q.b..;.=..S.F..|
-00000030  b7 89 8a 42 ce 15 03 02  00 30 00 00 00 00 00 00  |...B.....0......|
-00000040  00 00 00 00 00 00 00 00  00 00 7a 78 a4 e7 2f 40  |..........zx../@|
-00000050  df 42 9b 76 7a 45 0a 86  40 af 3c 40 c6 69 ba e1  |.B.vzE..@.<@.i..|
-00000060  23 82 fa 44 fd 73 fc 5b  f7 b9                    |#..D.s.[..|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv11-RSA-RC4 b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv11-RSA-RC4
deleted file mode 100644
index 729391f..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv11-RSA-RC4
+++ /dev/null
@@ -1,84 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 02 00 51 02 00 00  4d 03 02 7e 38 ae 3c 50  |....Q...M..~8.<P|
-00000010  03 96 3d 54 2f cd 86 21  98 7f 87 43 d8 58 aa a3  |..=T/..!...C.X..|
-00000020  d5 9f e7 25 a6 ab 34 7f  10 5f 99 20 56 c5 a8 dd  |...%..4.._. V...|
-00000030  37 17 0d 51 f1 0d c4 4e  76 0f 01 26 56 c9 0c 20  |7..Q...Nv..&V.. |
-00000040  28 ef cd ac 38 ea d3 7f  6f aa 7c b8 00 05 00 00  |(...8...o.|.....|
-00000050  05 ff 01 00 01 00 16 03  02 02 be 0b 00 02 ba 00  |................|
-00000060  02 b7 00 02 b4 30 82 02  b0 30 82 02 19 a0 03 02  |.....0...0......|
-00000070  01 02 02 09 00 85 b0 bb  a4 8a 7f b8 ca 30 0d 06  |.............0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 05 05 00 30 45 31 0b  |.*.H........0E1.|
-00000090  30 09 06 03 55 04 06 13  02 41 55 31 13 30 11 06  |0...U....AU1.0..|
-000000a0  03 55 04 08 13 0a 53 6f  6d 65 2d 53 74 61 74 65  |.U....Some-State|
-000000b0  31 21 30 1f 06 03 55 04  0a 13 18 49 6e 74 65 72  |1!0...U....Inter|
-000000c0  6e 65 74 20 57 69 64 67  69 74 73 20 50 74 79 20  |net Widgits Pty |
-000000d0  4c 74 64 30 1e 17 0d 31  30 30 34 32 34 30 39 30  |Ltd0...100424090|
-000000e0  39 33 38 5a 17 0d 31 31  30 34 32 34 30 39 30 39  |938Z..1104240909|
-000000f0  33 38 5a 30 45 31 0b 30  09 06 03 55 04 06 13 02  |38Z0E1.0...U....|
-00000100  41 55 31 13 30 11 06 03  55 04 08 13 0a 53 6f 6d  |AU1.0...U....Som|
-00000110  65 2d 53 74 61 74 65 31  21 30 1f 06 03 55 04 0a  |e-State1!0...U..|
-00000120  13 18 49 6e 74 65 72 6e  65 74 20 57 69 64 67 69  |..Internet Widgi|
-00000130  74 73 20 50 74 79 20 4c  74 64 30 81 9f 30 0d 06  |ts Pty Ltd0..0..|
-00000140  09 2a 86 48 86 f7 0d 01  01 01 05 00 03 81 8d 00  |.*.H............|
-00000150  30 81 89 02 81 81 00 bb  79 d6 f5 17 b5 e5 bf 46  |0.......y......F|
-00000160  10 d0 dc 69 be e6 2b 07  43 5a d0 03 2d 8a 7a 43  |...i..+.CZ..-.zC|
-00000170  85 b7 14 52 e7 a5 65 4c  2c 78 b8 23 8c b5 b4 82  |...R..eL,x.#....|
-00000180  e5 de 1f 95 3b 7e 62 a5  2c a5 33 d6 fe 12 5c 7a  |....;~b.,.3...\z|
-00000190  56 fc f5 06 bf fa 58 7b  26 3f b5 cd 04 d3 d0 c9  |V.....X{&?......|
-000001a0  21 96 4a c7 f4 54 9f 5a  bf ef 42 71 00 fe 18 99  |!.J..T.Z..Bq....|
-000001b0  07 7f 7e 88 7d 7d f1 04  39 c4 a2 2e db 51 c9 7c  |..~.}}..9....Q.||
-000001c0  e3 c0 4c 3b 32 66 01 cf  af b1 1d b8 71 9a 1d db  |..L;2f......q...|
-000001d0  db 89 6b ae da 2d 79 02  03 01 00 01 a3 81 a7 30  |..k..-y........0|
-000001e0  81 a4 30 1d 06 03 55 1d  0e 04 16 04 14 b1 ad e2  |..0...U.........|
-000001f0  85 5a cf cb 28 db 69 ce  23 69 de d3 26 8e 18 88  |.Z..(.i.#i..&...|
-00000200  39 30 75 06 03 55 1d 23  04 6e 30 6c 80 14 b1 ad  |90u..U.#.n0l....|
-00000210  e2 85 5a cf cb 28 db 69  ce 23 69 de d3 26 8e 18  |..Z..(.i.#i..&..|
-00000220  88 39 a1 49 a4 47 30 45  31 0b 30 09 06 03 55 04  |.9.I.G0E1.0...U.|
-00000230  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
-00000240  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
-00000250  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
-00000260  64 67 69 74 73 20 50 74  79 20 4c 74 64 82 09 00  |dgits Pty Ltd...|
-00000270  85 b0 bb a4 8a 7f b8 ca  30 0c 06 03 55 1d 13 04  |........0...U...|
-00000280  05 30 03 01 01 ff 30 0d  06 09 2a 86 48 86 f7 0d  |.0....0...*.H...|
-00000290  01 01 05 05 00 03 81 81  00 08 6c 45 24 c7 6b b1  |..........lE$.k.|
-000002a0  59 ab 0c 52 cc f2 b0 14  d7 87 9d 7a 64 75 b5 5a  |Y..R.......zdu.Z|
-000002b0  95 66 e4 c5 2b 8e ae 12  66 1f eb 4f 38 b3 6e 60  |.f..+...f..O8.n`|
-000002c0  d3 92 fd f7 41 08 b5 25  13 b1 18 7a 24 fb 30 1d  |....A..%...z$.0.|
-000002d0  ba ed 98 b9 17 ec e7 d7  31 59 db 95 d3 1d 78 ea  |........1Y....x.|
-000002e0  50 56 5c d5 82 5a 2d 5a  5f 33 c4 b6 d8 c9 75 90  |PV\..Z-Z_3....u.|
-000002f0  96 8c 0f 52 98 b5 cd 98  1f 89 20 5f f2 a0 1c a3  |...R...... _....|
-00000300  1b 96 94 dd a9 fd 57 e9  70 e8 26 6d 71 99 9b 26  |......W.p.&mq..&|
-00000310  6e 38 50 29 6c 90 a7 bd  d9 16 03 02 00 04 0e 00  |n8P)l...........|
-00000320  00 00                                             |..|
->>> Flow 3 (client to server)
-00000000  16 03 02 00 86 10 00 00  82 00 80 6d 51 f3 7f f9  |...........mQ...|
-00000010  3e fb 75 82 41 36 83 e8  6a ee 2a 2e 25 90 67 4c  |>.u.A6..j.*.%.gL|
-00000020  8e 62 2f 30 81 17 e0 85  09 0c 2b b7 23 d7 b0 e2  |.b/0......+.#...|
-00000030  1d f7 3b d7 f5 a1 27 b6  ee 24 b6 1b cc 5b ea 66  |..;...'..$...[.f|
-00000040  0d 6a f4 e5 85 f9 da 43  b4 0e 86 85 e1 f5 aa be  |.j.....C........|
-00000050  c8 ce 39 4c 9c 86 00 08  c2 4b e2 c6 ec 2f f7 ce  |..9L.....K.../..|
-00000060  e6 bd 77 82 6f 23 b6 e0  bd a2 92 b7 3a ac e8 56  |..w.o#......:..V|
-00000070  f1 af 54 5e 46 87 e9 3b  33 e7 b8 28 b7 d6 c8 90  |..T^F..;3..(....|
-00000080  35 d4 1c 43 d1 30 6f 55  4e 0a 70 14 03 02 00 01  |5..C.0oUN.p.....|
-00000090  01 16 03 02 00 24 b9 df  85 a1 6d a7 14 b5 bc f5  |.....$....m.....|
-000000a0  c2 1d 40 fc 1e 19 f2 36  2d ec 6b 59 c5 6d ae c7  |..@....6-.kY.m..|
-000000b0  1c ad 7e a3 5b 4d 12 e5  58 5a                    |..~.[M..XZ|
->>> Flow 4 (server to client)
-00000000  14 03 02 00 01 01 16 03  02 00 24 a3 f3 22 a8 32  |..........$..".2|
-00000010  63 c3 88 5c 0f fb 2d 47  21 0d 62 e2 db aa ed ae  |c..\..-G!.b.....|
-00000020  b6 5f e3 c8 98 fc 91 5e  04 83 cf c3 21 17 ce     |._.....^....!..|
->>> Flow 5 (client to server)
-00000000  17 03 02 00 1a f1 e4 46  c7 14 91 4b c6 25 fd aa  |.......F...K.%..|
-00000010  5d dd 3f 61 ac 9c 79 68  bc e6 0f a1 e4 f3 73 15  |].?a..yh......s.|
-00000020  03 02 00 16 6b 8d 23 3c  99 b4 c2 23 3c 27 fd 41  |....k.#<...#<'.A|
-00000030  cc 04 e5 fc e7 f9 d9 81  0a b8                    |..........|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ALPN b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ALPN
deleted file mode 100644
index 9ecb065..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ALPN
+++ /dev/null
@@ -1,97 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 99 01 00 00  95 03 03 00 00 00 00 00  |................|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 4e  |...../.5.......N|
-00000050  33 74 00 00 00 05 00 05  01 00 00 00 00 00 0a 00  |3t..............|
-00000060  08 00 06 00 17 00 18 00  19 00 0b 00 02 01 00 00  |................|
-00000070  0d 00 0e 00 0c 04 01 04  03 05 01 05 03 02 01 02  |................|
-00000080  03 ff 01 00 01 00 00 10  00 10 00 0e 06 70 72 6f  |.............pro|
-00000090  74 6f 32 06 70 72 6f 74  6f 31 00 12 00 00        |to2.proto1....|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 66 02 00 00  62 03 03 56 83 34 0f 9e  |....f...b..V.4..|
-00000010  dd 02 1c 4f 4f 09 d0 2c  df e6 c1 d2 4a c0 6a e7  |...OO..,....J.j.|
-00000020  1e 65 51 c2 42 01 05 70  4a 6c 97 20 0f a8 fb d8  |.eQ.B..pJl. ....|
-00000030  2f 0f 75 21 17 f8 dd 63  28 4a 18 f6 b1 e5 6f 7c  |/.u!...c(J....o||
-00000040  1d 09 d4 13 bf 66 3a bd  c5 48 14 fc c0 2f 00 00  |.....f:..H.../..|
-00000050  1a ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 10  |................|
-00000060  00 09 00 07 06 70 72 6f  74 6f 31 16 03 03 02 be  |.....proto1.....|
-00000070  0b 00 02 ba 00 02 b7 00  02 b4 30 82 02 b0 30 82  |..........0...0.|
-00000080  02 19 a0 03 02 01 02 02  09 00 85 b0 bb a4 8a 7f  |................|
-00000090  b8 ca 30 0d 06 09 2a 86  48 86 f7 0d 01 01 05 05  |..0...*.H.......|
-000000a0  00 30 45 31 0b 30 09 06  03 55 04 06 13 02 41 55  |.0E1.0...U....AU|
-000000b0  31 13 30 11 06 03 55 04  08 13 0a 53 6f 6d 65 2d  |1.0...U....Some-|
-000000c0  53 74 61 74 65 31 21 30  1f 06 03 55 04 0a 13 18  |State1!0...U....|
-000000d0  49 6e 74 65 72 6e 65 74  20 57 69 64 67 69 74 73  |Internet Widgits|
-000000e0  20 50 74 79 20 4c 74 64  30 1e 17 0d 31 30 30 34  | Pty Ltd0...1004|
-000000f0  32 34 30 39 30 39 33 38  5a 17 0d 31 31 30 34 32  |24090938Z..11042|
-00000100  34 30 39 30 39 33 38 5a  30 45 31 0b 30 09 06 03  |4090938Z0E1.0...|
-00000110  55 04 06 13 02 41 55 31  13 30 11 06 03 55 04 08  |U....AU1.0...U..|
-00000120  13 0a 53 6f 6d 65 2d 53  74 61 74 65 31 21 30 1f  |..Some-State1!0.|
-00000130  06 03 55 04 0a 13 18 49  6e 74 65 72 6e 65 74 20  |..U....Internet |
-00000140  57 69 64 67 69 74 73 20  50 74 79 20 4c 74 64 30  |Widgits Pty Ltd0|
-00000150  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-00000160  00 03 81 8d 00 30 81 89  02 81 81 00 bb 79 d6 f5  |.....0.......y..|
-00000170  17 b5 e5 bf 46 10 d0 dc  69 be e6 2b 07 43 5a d0  |....F...i..+.CZ.|
-00000180  03 2d 8a 7a 43 85 b7 14  52 e7 a5 65 4c 2c 78 b8  |.-.zC...R..eL,x.|
-00000190  23 8c b5 b4 82 e5 de 1f  95 3b 7e 62 a5 2c a5 33  |#........;~b.,.3|
-000001a0  d6 fe 12 5c 7a 56 fc f5  06 bf fa 58 7b 26 3f b5  |...\zV.....X{&?.|
-000001b0  cd 04 d3 d0 c9 21 96 4a  c7 f4 54 9f 5a bf ef 42  |.....!.J..T.Z..B|
-000001c0  71 00 fe 18 99 07 7f 7e  88 7d 7d f1 04 39 c4 a2  |q......~.}}..9..|
-000001d0  2e db 51 c9 7c e3 c0 4c  3b 32 66 01 cf af b1 1d  |..Q.|..L;2f.....|
-000001e0  b8 71 9a 1d db db 89 6b  ae da 2d 79 02 03 01 00  |.q.....k..-y....|
-000001f0  01 a3 81 a7 30 81 a4 30  1d 06 03 55 1d 0e 04 16  |....0..0...U....|
-00000200  04 14 b1 ad e2 85 5a cf  cb 28 db 69 ce 23 69 de  |......Z..(.i.#i.|
-00000210  d3 26 8e 18 88 39 30 75  06 03 55 1d 23 04 6e 30  |.&...90u..U.#.n0|
-00000220  6c 80 14 b1 ad e2 85 5a  cf cb 28 db 69 ce 23 69  |l......Z..(.i.#i|
-00000230  de d3 26 8e 18 88 39 a1  49 a4 47 30 45 31 0b 30  |..&...9.I.G0E1.0|
-00000240  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-00000250  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-00000260  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-00000270  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-00000280  74 64 82 09 00 85 b0 bb  a4 8a 7f b8 ca 30 0c 06  |td...........0..|
-00000290  03 55 1d 13 04 05 30 03  01 01 ff 30 0d 06 09 2a  |.U....0....0...*|
-000002a0  86 48 86 f7 0d 01 01 05  05 00 03 81 81 00 08 6c  |.H.............l|
-000002b0  45 24 c7 6b b1 59 ab 0c  52 cc f2 b0 14 d7 87 9d  |E$.k.Y..R.......|
-000002c0  7a 64 75 b5 5a 95 66 e4  c5 2b 8e ae 12 66 1f eb  |zdu.Z.f..+...f..|
-000002d0  4f 38 b3 6e 60 d3 92 fd  f7 41 08 b5 25 13 b1 18  |O8.n`....A..%...|
-000002e0  7a 24 fb 30 1d ba ed 98  b9 17 ec e7 d7 31 59 db  |z$.0.........1Y.|
-000002f0  95 d3 1d 78 ea 50 56 5c  d5 82 5a 2d 5a 5f 33 c4  |...x.PV\..Z-Z_3.|
-00000300  b6 d8 c9 75 90 96 8c 0f  52 98 b5 cd 98 1f 89 20  |...u....R...... |
-00000310  5f f2 a0 1c a3 1b 96 94  dd a9 fd 57 e9 70 e8 26  |_..........W.p.&|
-00000320  6d 71 99 9b 26 6e 38 50  29 6c 90 a7 bd d9 16 03  |mq..&n8P)l......|
-00000330  03 00 cd 0c 00 00 c9 03  00 17 41 04 85 b7 f7 7c  |..........A....||
-00000340  49 4e 97 14 07 51 bc 56  2d 3f cf 1d 29 08 ac 6a  |IN...Q.V-?..)..j|
-00000350  b4 e7 0d 62 d8 fd 4d 03  29 0d f8 6c 36 6f 4d 5f  |...b..M.)..l6oM_|
-00000360  b7 5a 8e 37 3e c2 d9 dc  f4 15 52 e9 87 71 0f e5  |.Z.7>.....R..q..|
-00000370  4e a6 88 0e 54 35 e0 8b  50 91 e1 c4 04 01 00 80  |N...T5..P.......|
-00000380  51 eb f8 d6 52 ba f5 b5  0a 22 5f 91 fe f7 ee 43  |Q...R...."_....C|
-00000390  f8 af 52 b6 27 2c fc 14  e2 fb 41 61 ff 7c b9 be  |..R.',....Aa.|..|
-000003a0  f9 78 be dc 18 32 8c 4d  ef 46 c0 5a a7 91 6a 1b  |.x...2.M.F.Z..j.|
-000003b0  47 78 46 39 47 81 8a 2d  b4 cb fd bb 44 3e a7 b7  |GxF9G..-....D>..|
-000003c0  cc 4e df 17 7b 2b 38 49  fa 9d 9f 4e cd ed f2 16  |.N..{+8I...N....|
-000003d0  03 d9 68 cf c9 5a 08 32  f8 ed 02 30 54 61 f6 c0  |..h..Z.2...0Ta..|
-000003e0  f6 78 bc ad 04 9c 8e 90  7d 3d f5 35 86 aa 6e e9  |.x......}=.5..n.|
-000003f0  a2 9a d3 86 27 9f 2d 6e  ea 6e ad 82 0e aa ef 97  |....'.-n.n......|
-00000400  16 03 03 00 04 0e 00 00  00                       |.........|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000010  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000020  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000030  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000040  a6 b5 68 1a 41 03 56 6b  dc 5a 89 14 03 03 00 01  |..h.A.Vk.Z......|
-00000050  01 16 03 03 00 28 00 00  00 00 00 00 00 00 47 18  |.....(........G.|
-00000060  39 03 93 d9 5b 27 29 70  52 68 15 79 f2 60 e6 58  |9...[')pRh.y.`.X|
-00000070  d9 98 cd ce a1 8f 4d ee  2c f0 34 9f fa 73        |......M.,.4..s|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 39 76 15 70 f1  |..........(9v.p.|
-00000010  73 c9 9a 1e 76 40 bc de  de 49 be 3e 10 4d 6a 42  |s...v@...I.>.MjB|
-00000020  1b 9b bd 07 6b 19 ff f9  2c 19 3c c8 e7 06 fa c8  |....k...,.<.....|
-00000030  3d 52 b4                                          |=R.|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 14 96 ec  |................|
-00000010  f4 bb ae 45 81 0c 39 10  e2 3a 91 51 04 2c 01 a8  |...E..9..:.Q.,..|
-00000020  8b a3 25 15 03 03 00 1a  00 00 00 00 00 00 00 02  |..%.............|
-00000030  fe 1a 53 01 17 ad a1 30  0a 73 17 9f 39 b4 30 ac  |..S....0.s..9.0.|
-00000040  91 ee                                             |..|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ALPN-NoMatch b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ALPN-NoMatch
deleted file mode 100644
index a22ffae..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ALPN-NoMatch
+++ /dev/null
@@ -1,96 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 92 01 00 00  8e 03 03 00 00 00 00 00  |................|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 47  |...../.5.......G|
-00000050  33 74 00 00 00 05 00 05  01 00 00 00 00 00 0a 00  |3t..............|
-00000060  08 00 06 00 17 00 18 00  19 00 0b 00 02 01 00 00  |................|
-00000070  0d 00 0e 00 0c 04 01 04  03 05 01 05 03 02 01 02  |................|
-00000080  03 ff 01 00 01 00 00 10  00 09 00 07 06 70 72 6f  |.............pro|
-00000090  74 6f 33 00 12 00 00                              |to3....|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 94 d7 79 73 82  |....Y...U....ys.|
-00000010  87 7c 85 6e 8a 1b 7d bf  69 c9 98 0c 44 bd f6 78  |.|.n..}.i...D..x|
-00000020  d2 80 dc d8 7d 80 bb 91  4b d4 ed 20 fe 9f 2f 7b  |....}...K.. ../{|
-00000030  f2 1a 44 36 cd ce af f1  b5 01 8a ac 18 e4 2b 23  |..D6..........+#|
-00000040  a8 ab 1a 32 23 8b 0b e2  81 a8 0a 40 c0 2f 00 00  |...2#......@./..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 be 0b 00 02 ba 00  02 b7 00 02 b4 30 82 02  |.............0..|
-00000070  b0 30 82 02 19 a0 03 02  01 02 02 09 00 85 b0 bb  |.0..............|
-00000080  a4 8a 7f b8 ca 30 0d 06  09 2a 86 48 86 f7 0d 01  |.....0...*.H....|
-00000090  01 05 05 00 30 45 31 0b  30 09 06 03 55 04 06 13  |....0E1.0...U...|
-000000a0  02 41 55 31 13 30 11 06  03 55 04 08 13 0a 53 6f  |.AU1.0...U....So|
-000000b0  6d 65 2d 53 74 61 74 65  31 21 30 1f 06 03 55 04  |me-State1!0...U.|
-000000c0  0a 13 18 49 6e 74 65 72  6e 65 74 20 57 69 64 67  |...Internet Widg|
-000000d0  69 74 73 20 50 74 79 20  4c 74 64 30 1e 17 0d 31  |its Pty Ltd0...1|
-000000e0  30 30 34 32 34 30 39 30  39 33 38 5a 17 0d 31 31  |00424090938Z..11|
-000000f0  30 34 32 34 30 39 30 39  33 38 5a 30 45 31 0b 30  |0424090938Z0E1.0|
-00000100  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-00000110  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-00000120  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-00000130  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-00000140  74 64 30 81 9f 30 0d 06  09 2a 86 48 86 f7 0d 01  |td0..0...*.H....|
-00000150  01 01 05 00 03 81 8d 00  30 81 89 02 81 81 00 bb  |........0.......|
-00000160  79 d6 f5 17 b5 e5 bf 46  10 d0 dc 69 be e6 2b 07  |y......F...i..+.|
-00000170  43 5a d0 03 2d 8a 7a 43  85 b7 14 52 e7 a5 65 4c  |CZ..-.zC...R..eL|
-00000180  2c 78 b8 23 8c b5 b4 82  e5 de 1f 95 3b 7e 62 a5  |,x.#........;~b.|
-00000190  2c a5 33 d6 fe 12 5c 7a  56 fc f5 06 bf fa 58 7b  |,.3...\zV.....X{|
-000001a0  26 3f b5 cd 04 d3 d0 c9  21 96 4a c7 f4 54 9f 5a  |&?......!.J..T.Z|
-000001b0  bf ef 42 71 00 fe 18 99  07 7f 7e 88 7d 7d f1 04  |..Bq......~.}}..|
-000001c0  39 c4 a2 2e db 51 c9 7c  e3 c0 4c 3b 32 66 01 cf  |9....Q.|..L;2f..|
-000001d0  af b1 1d b8 71 9a 1d db  db 89 6b ae da 2d 79 02  |....q.....k..-y.|
-000001e0  03 01 00 01 a3 81 a7 30  81 a4 30 1d 06 03 55 1d  |.......0..0...U.|
-000001f0  0e 04 16 04 14 b1 ad e2  85 5a cf cb 28 db 69 ce  |.........Z..(.i.|
-00000200  23 69 de d3 26 8e 18 88  39 30 75 06 03 55 1d 23  |#i..&...90u..U.#|
-00000210  04 6e 30 6c 80 14 b1 ad  e2 85 5a cf cb 28 db 69  |.n0l......Z..(.i|
-00000220  ce 23 69 de d3 26 8e 18  88 39 a1 49 a4 47 30 45  |.#i..&...9.I.G0E|
-00000230  31 0b 30 09 06 03 55 04  06 13 02 41 55 31 13 30  |1.0...U....AU1.0|
-00000240  11 06 03 55 04 08 13 0a  53 6f 6d 65 2d 53 74 61  |...U....Some-Sta|
-00000250  74 65 31 21 30 1f 06 03  55 04 0a 13 18 49 6e 74  |te1!0...U....Int|
-00000260  65 72 6e 65 74 20 57 69  64 67 69 74 73 20 50 74  |ernet Widgits Pt|
-00000270  79 20 4c 74 64 82 09 00  85 b0 bb a4 8a 7f b8 ca  |y Ltd...........|
-00000280  30 0c 06 03 55 1d 13 04  05 30 03 01 01 ff 30 0d  |0...U....0....0.|
-00000290  06 09 2a 86 48 86 f7 0d  01 01 05 05 00 03 81 81  |..*.H...........|
-000002a0  00 08 6c 45 24 c7 6b b1  59 ab 0c 52 cc f2 b0 14  |..lE$.k.Y..R....|
-000002b0  d7 87 9d 7a 64 75 b5 5a  95 66 e4 c5 2b 8e ae 12  |...zdu.Z.f..+...|
-000002c0  66 1f eb 4f 38 b3 6e 60  d3 92 fd f7 41 08 b5 25  |f..O8.n`....A..%|
-000002d0  13 b1 18 7a 24 fb 30 1d  ba ed 98 b9 17 ec e7 d7  |...z$.0.........|
-000002e0  31 59 db 95 d3 1d 78 ea  50 56 5c d5 82 5a 2d 5a  |1Y....x.PV\..Z-Z|
-000002f0  5f 33 c4 b6 d8 c9 75 90  96 8c 0f 52 98 b5 cd 98  |_3....u....R....|
-00000300  1f 89 20 5f f2 a0 1c a3  1b 96 94 dd a9 fd 57 e9  |.. _..........W.|
-00000310  70 e8 26 6d 71 99 9b 26  6e 38 50 29 6c 90 a7 bd  |p.&mq..&n8P)l...|
-00000320  d9 16 03 03 00 cd 0c 00  00 c9 03 00 17 41 04 7d  |.............A.}|
-00000330  75 a5 53 0b a5 4d a6 81  e0 df c4 11 c9 b5 31 ba  |u.S..M........1.|
-00000340  9f 7b 51 04 57 c6 e0 b9  b0 bc 4f bc 71 74 8a 2e  |.{Q.W.....O.qt..|
-00000350  d1 f6 39 36 94 4e c7 d3  a7 1b 2c b5 55 04 71 01  |..96.N....,.U.q.|
-00000360  9e 2b 42 1e 8b a4 40 b2  13 4f 03 1f 51 9e 5c 04  |.+B...@..O..Q.\.|
-00000370  01 00 80 68 05 c7 4a ca  df 00 85 2b 53 f7 4f c3  |...h..J....+S.O.|
-00000380  b4 0f e8 f7 b8 30 b7 36  56 65 7b 03 6a 72 f1 aa  |.....0.6Ve{.jr..|
-00000390  54 30 90 9e c7 dc fc 03  96 15 70 67 13 12 a4 f4  |T0........pg....|
-000003a0  42 f0 f9 a1 48 c0 44 44  77 0e ea fd cb b5 6e 19  |B...H.DDw.....n.|
-000003b0  89 94 a7 12 67 87 47 19  c3 00 2d c4 9b d4 dc 66  |....g.G...-....f|
-000003c0  fa ca d7 97 79 9b 28 7f  74 d4 37 c0 06 63 d4 9e  |....y.(.t.7..c..|
-000003d0  a1 53 16 5a 8e d7 a5 cc  90 4d 63 f9 0c 18 85 7f  |.S.Z.....Mc.....|
-000003e0  0e 35 3a 49 73 88 82 51  41 e5 2d 58 aa 38 3e bd  |.5:Is..QA.-X.8>.|
-000003f0  3d d8 da 16 03 03 00 04  0e 00 00 00              |=...........|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000010  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000020  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000030  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000040  a6 b5 68 1a 41 03 56 6b  dc 5a 89 14 03 03 00 01  |..h.A.Vk.Z......|
-00000050  01 16 03 03 00 28 00 00  00 00 00 00 00 00 a8 da  |.....(..........|
-00000060  74 a6 d0 a5 26 86 f3 5f  89 a4 af ac 9c 1a 01 1f  |t...&.._........|
-00000070  89 8a 1c fc cf 68 3e a5  a3 20 1a b3 78 af        |.....h>.. ..x.|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 1a f2 a9 e8 71  |..........(....q|
-00000010  b2 a6 ca 36 4a ea 55 f6  20 03 fd f7 90 c3 af 30  |...6J.U. ......0|
-00000020  d3 29 c3 d7 1b d6 4d 3e  61 55 94 0d 4e 3e 83 1a  |.)....M>aU..N>..|
-00000030  97 dd 19                                          |...|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 94 5b 5e  |..............[^|
-00000010  51 a1 52 ee 19 78 78 ef  12 0d 9c 66 bf e2 48 cb  |Q.R..xx....f..H.|
-00000020  f6 00 1e 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
-00000030  cd 5d 31 58 d9 5a 12 65  5b c6 7e 4e e2 04 e7 1d  |.]1X.Z.e[.~N....|
-00000040  b1 4c                                             |.L|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-ECDSA b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-ECDSA
deleted file mode 100644
index 1470ba7..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-ECDSA
+++ /dev/null
@@ -1,134 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 a5 28 60 99 bf  |....Y...U...(`..|
-00000010  c7 54 04 87 60 ad c5 32  f6 bf ed 11 47 de 4d ff  |.T..`..2....G.M.|
-00000020  99 e1 8f 88 f6 af 10 6e  29 74 0a 20 1d 39 cb e0  |.......n)t. .9..|
-00000030  a5 11 fe 8e 23 11 83 c7  a6 53 fc 97 03 9d ff 7c  |....#....S.....||
-00000040  cf 51 ba 41 64 61 38 22  5c c6 4a 04 c0 09 00 00  |.Q.Ada8"\.J.....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
-00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
-00000080  30 09 06 07 2a 86 48 ce  3d 04 01 30 45 31 0b 30  |0...*.H.=..0E1.0|
-00000090  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-000000a0  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-000000b0  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-000000c0  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-000000d0  74 64 30 1e 17 0d 31 32  31 31 32 32 31 35 30 36  |td0...1211221506|
-000000e0  33 32 5a 17 0d 32 32 31  31 32 30 31 35 30 36 33  |32Z..22112015063|
-000000f0  32 5a 30 45 31 0b 30 09  06 03 55 04 06 13 02 41  |2Z0E1.0...U....A|
-00000100  55 31 13 30 11 06 03 55  04 08 13 0a 53 6f 6d 65  |U1.0...U....Some|
-00000110  2d 53 74 61 74 65 31 21  30 1f 06 03 55 04 0a 13  |-State1!0...U...|
-00000120  18 49 6e 74 65 72 6e 65  74 20 57 69 64 67 69 74  |.Internet Widgit|
-00000130  73 20 50 74 79 20 4c 74  64 30 81 9b 30 10 06 07  |s Pty Ltd0..0...|
-00000140  2a 86 48 ce 3d 02 01 06  05 2b 81 04 00 23 03 81  |*.H.=....+...#..|
-00000150  86 00 04 00 c4 a1 ed be  98 f9 0b 48 73 36 7e c3  |...........Hs6~.|
-00000160  16 56 11 22 f2 3d 53 c3  3b 4d 21 3d cd 6b 75 e6  |.V.".=S.;M!=.ku.|
-00000170  f6 b0 dc 9a df 26 c1 bc  b2 87 f0 72 32 7c b3 64  |.....&.....r2|.d|
-00000180  2f 1c 90 bc ea 68 23 10  7e fe e3 25 c0 48 3a 69  |/....h#.~..%.H:i|
-00000190  e0 28 6d d3 37 00 ef 04  62 dd 0d a0 9c 70 62 83  |.(m.7...b....pb.|
-000001a0  d8 81 d3 64 31 aa 9e 97  31 bd 96 b0 68 c0 9b 23  |...d1...1...h..#|
-000001b0  de 76 64 3f 1a 5c 7f e9  12 0e 58 58 b6 5f 70 dd  |.vd?.\....XX._p.|
-000001c0  9b d8 ea d5 d7 f5 d5 cc  b9 b6 9f 30 66 5b 66 9a  |...........0f[f.|
-000001d0  20 e2 27 e5 bf fe 3b 30  09 06 07 2a 86 48 ce 3d  | .'...;0...*.H.=|
-000001e0  04 01 03 81 8c 00 30 81  88 02 42 01 88 a2 4f eb  |......0...B...O.|
-000001f0  e2 45 c5 48 7d 1b ac f5  ed 98 9d ae 47 70 c0 5e  |.E.H}.......Gp.^|
-00000200  1b b6 2f bd f1 b6 4d b7  61 40 d3 11 a2 ce ee 0b  |../...M.a@......|
-00000210  7e 92 7e ff 76 9d c3 3b  7e a5 3f ce fa 10 e2 59  |~.~.v..;~.?....Y|
-00000220  ec 47 2d 7c ac da 4e 97  0e 15 a0 6f d0 02 42 01  |.G-|..N....o..B.|
-00000230  4d fc be 67 13 9c 2d 05  0e bd 3f a3 8c 25 c1 33  |M..g..-...?..%.3|
-00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
-00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
-00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 03 00 d7 0c 00  00 d3 03 00 17 41 04 c4  |*............A..|
-00000280  0a 40 05 84 eb 90 3c 13  d0 90 af 69 fa 5c 20 75  |.@....<....i.\ u|
-00000290  e1 9b f2 30 f7 df cc 75  2c 35 7e 38 16 99 7d 57  |...0...u,5~8..}W|
-000002a0  6d d7 f0 93 2d 1d c8 03  89 6e 52 3b 20 e5 8a 5f  |m...-....nR; .._|
-000002b0  6d ca 6e 6a ca 51 f8 a4  dc 1d ec 3e 73 c9 72 04  |m.nj.Q.....>s.r.|
-000002c0  03 00 8a 30 81 87 02 41  37 bf 0d 1d c1 9a 37 39  |...0...A7.....79|
-000002d0  4d 4a f8 17 50 5d 4c 78  d4 25 99 9d 81 48 98 a8  |MJ..P]Lx.%...H..|
-000002e0  ff 2d 3f 98 4b 9f d8 96  2b fa 37 cc e8 66 25 0e  |.-?.K...+.7..f%.|
-000002f0  d3 5e 53 c5 3b ad 17 3f  21 ce d2 45 d8 93 95 6c  |.^S.;..?!..E...l|
-00000300  25 f9 5a 10 9f 37 c8 14  a6 02 42 00 e6 bd 9a 89  |%.Z..7....B.....|
-00000310  8e 73 40 f4 90 e6 d8 e2  98 51 10 23 fb 98 e5 47  |.s@......Q.#...G|
-00000320  0c 2a 7a 2f 02 66 a8 20  e4 cb 4f ba 14 1d 9e 3a  |.*z/.f. ..O....:|
-00000330  2f 09 47 44 02 e0 9f 30  21 71 f0 99 09 de 23 d2  |/.GD...0!q....#.|
-00000340  f5 f0 b2 93 70 a3 8f 79  b9 4f 88 0b 35 16 03 03  |....p..y.O..5...|
-00000350  00 2e 0d 00 00 26 03 01  02 40 00 1e 06 01 06 02  |.....&...@......|
-00000360  06 03 05 01 05 02 05 03  04 01 04 02 04 03 03 01  |................|
-00000370  03 02 03 03 02 01 02 02  02 03 00 00 0e 00 00 00  |................|
->>> Flow 3 (client to server)
-00000000  16 03 03 02 0a 0b 00 02  06 00 02 03 00 02 00 30  |...............0|
-00000010  82 01 fc 30 82 01 5e 02  09 00 9a 30 84 6c 26 35  |...0..^....0.l&5|
-00000020  d9 17 30 09 06 07 2a 86  48 ce 3d 04 01 30 45 31  |..0...*.H.=..0E1|
-00000030  0b 30 09 06 03 55 04 06  13 02 41 55 31 13 30 11  |.0...U....AU1.0.|
-00000040  06 03 55 04 08 13 0a 53  6f 6d 65 2d 53 74 61 74  |..U....Some-Stat|
-00000050  65 31 21 30 1f 06 03 55  04 0a 13 18 49 6e 74 65  |e1!0...U....Inte|
-00000060  72 6e 65 74 20 57 69 64  67 69 74 73 20 50 74 79  |rnet Widgits Pty|
-00000070  20 4c 74 64 30 1e 17 0d  31 32 31 31 31 34 31 33  | Ltd0...12111413|
-00000080  32 35 35 33 5a 17 0d 32  32 31 31 31 32 31 33 32  |2553Z..221112132|
-00000090  35 35 33 5a 30 41 31 0b  30 09 06 03 55 04 06 13  |553Z0A1.0...U...|
-000000a0  02 41 55 31 0c 30 0a 06  03 55 04 08 13 03 4e 53  |.AU1.0...U....NS|
-000000b0  57 31 10 30 0e 06 03 55  04 07 13 07 50 79 72 6d  |W1.0...U....Pyrm|
-000000c0  6f 6e 74 31 12 30 10 06  03 55 04 03 13 09 4a 6f  |ont1.0...U....Jo|
-000000d0  65 6c 20 53 69 6e 67 30  81 9b 30 10 06 07 2a 86  |el Sing0..0...*.|
-000000e0  48 ce 3d 02 01 06 05 2b  81 04 00 23 03 81 86 00  |H.=....+...#....|
-000000f0  04 00 95 8c 91 75 14 c0  5e c4 57 b4 d4 c3 6f 8d  |.....u..^.W...o.|
-00000100  ae 68 1e dd 6f ce 86 e1  7e 6e b2 48 3e 81 e5 4e  |.h..o...~n.H>..N|
-00000110  e2 c6 88 4b 64 dc f5 30  bb d3 ff 65 cc 5b f4 dd  |...Kd..0...e.[..|
-00000120  b5 6a 3e 3e d0 1d de 47  c3 76 ad 19 f6 45 2c 8c  |.j>>...G.v...E,.|
-00000130  bc d8 1d 01 4c 1f 70 90  46 76 48 8b 8f 83 cc 4a  |....L.p.FvH....J|
-00000140  5c 8f 40 76 da e0 89 ec  1d 2b c4 4e 30 76 28 41  |\.@v.....+.N0v(A|
-00000150  b2 62 a8 fb 5b f1 f9 4e  7a 8d bd 09 b8 ae ea 8b  |.b..[..Nz.......|
-00000160  18 27 4f 2e 70 fe 13 96  ba c3 d3 40 16 cd 65 4e  |.'O.p......@..eN|
-00000170  ac 11 1e e6 f1 30 09 06  07 2a 86 48 ce 3d 04 01  |.....0...*.H.=..|
-00000180  03 81 8c 00 30 81 88 02  42 00 e0 14 c4 60 60 0b  |....0...B....``.|
-00000190  72 68 b0 32 5d 61 4a 02  74 5c c2 81 b9 16 a8 3f  |rh.2]aJ.t\.....?|
-000001a0  29 c8 36 c7 81 ff 6c b6  5b d9 70 f1 38 3b 50 48  |).6...l.[.p.8;PH|
-000001b0  28 94 cb 09 1a 52 f1 5d  ee 8d f2 b9 f0 f0 da d9  |(....R.]........|
-000001c0  15 3a f9 bd 03 7a 87 a2  23 35 ec 02 42 01 a3 d4  |.:...z..#5..B...|
-000001d0  8a 78 35 1c 4a 9a 23 d2  0a be 2b 10 31 9d 9c 5f  |.x5.J.#...+.1.._|
-000001e0  be e8 91 b3 da 1a f5 5d  a3 23 f5 26 8b 45 70 8d  |.......].#.&.Ep.|
-000001f0  65 62 9b 7e 01 99 3d 18  f6 10 9a 38 61 9b 2e 57  |eb.~..=....8a..W|
-00000200  e4 fa cc b1 8a ce e2 23  a0 87 f0 e1 67 51 eb 16  |.......#....gQ..|
-00000210  03 03 00 46 10 00 00 42  41 04 1e 18 37 ef 0d 19  |...F...BA...7...|
-00000220  51 88 35 75 71 b5 e5 54  5b 12 2e 8f 09 67 fd a7  |Q.5uq..T[....g..|
-00000230  24 20 3e b2 56 1c ce 97  28 5e f8 2b 2d 4f 9e f1  |$ >.V...(^.+-O..|
-00000240  07 9f 6c 4b 5b 83 56 e2  32 42 e9 58 b6 d7 49 a6  |..lK[.V.2B.X..I.|
-00000250  b5 68 1a 41 03 56 6b dc  5a 89 16 03 03 00 92 0f  |.h.A.Vk.Z.......|
-00000260  00 00 8e 05 03 00 8a 30  81 87 02 42 00 cc a4 ad  |.......0...B....|
-00000270  0b ff 09 40 8f 2c a6 37  72 1d f7 d2 19 74 85 ad  |...@.,.7r....t..|
-00000280  ac 33 b0 b8 5b 56 39 cf  b0 ef 46 68 94 39 4c d0  |.3..[V9...Fh.9L.|
-00000290  f4 97 32 10 99 36 c5 95  c8 14 23 37 78 46 5c a9  |..2..6....#7xF\.|
-000002a0  20 95 65 47 ff 54 02 f1  aa 1d d7 bc 39 2d 02 41  | .eG.T......9-.A|
-000002b0  2e f9 d6 8c e8 c5 a9 6f  10 4f d6 5f 4e 88 e9 71  |.......o.O._N..q|
-000002c0  23 5b 6f b8 ab 19 d3 dd  ec f3 32 e3 3b fa 41 a2  |#[o.......2.;.A.|
-000002d0  e8 ae dc 27 8d 4e 79 f4  47 ef c9 8f bf 0b 41 3b  |...'.Ny.G.....A;|
-000002e0  94 16 cb 8f 1e b5 f3 4e  6e 42 46 35 1a 0c ca 79  |.......NnBF5...y|
-000002f0  4b 14 03 03 00 01 01 16  03 03 00 40 00 00 00 00  |K..........@....|
-00000300  00 00 00 00 00 00 00 00  00 00 00 00 64 1c d9 9f  |............d...|
-00000310  34 ec c2 74 76 7a 9f cf  95 19 be 8d 6a 2f 25 96  |4..tvz......j/%.|
-00000320  df de 18 ca 0e c9 d4 2f  e4 b0 34 10 5b 72 7a 18  |......./..4.[rz.|
-00000330  5c 64 d7 fc 2e 1b 28 10  ae a6 31 e9              |\d....(...1.|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 27 6f 24 a3 0c  |..........@'o$..|
-00000010  6d d7 68 4a fb 43 b0 97  02 6c 22 7e 2f a1 f1 7a  |m.hJ.C...l"~/..z|
-00000020  37 bf 38 82 dc a0 83 24  01 4b c0 4f 15 e1 7c 4c  |7.8....$.K.O..|L|
-00000030  d4 cd b8 e2 71 af f5 20  7d f9 4a 48 4b f0 a1 f3  |....q.. }.JHK...|
-00000040  7b 02 29 18 c0 87 a5 dd  c4 73 8e                 |{.)......s.|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000010  00 00 00 00 00 bf 7a e1  23 0d d0 13 6e 96 81 6d  |......z.#...n..m|
-00000020  32 56 0f 75 7e 01 88 5f  6d e6 d6 ca ec 3c 17 e9  |2V.u~.._m....<..|
-00000030  44 a9 c0 1c a4 15 03 03  00 30 00 00 00 00 00 00  |D........0......|
-00000040  00 00 00 00 00 00 00 00  00 00 76 be 7a 77 29 01  |..........v.zw).|
-00000050  8e 13 02 66 81 43 a0 55  03 35 22 09 de ea 52 bb  |...f.C.U.5"...R.|
-00000060  51 cc c1 09 0e 9b 4d bd  94 85                    |Q.....M...|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-RSA b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-RSA
deleted file mode 100644
index 95c5782..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-ECDSA-RSA
+++ /dev/null
@@ -1,128 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 51 02 00 00  4d 03 03 79 e8 35 e3 d2  |....Q...M..y.5..|
-00000010  c0 5e 39 d1 46 da 9c 94  56 20 e2 06 d6 9b f6 dd  |.^9.F...V ......|
-00000020  4f 7a c1 e8 34 a1 9f 8b  c2 e1 fb 20 66 9c 5a 9a  |Oz..4...... f.Z.|
-00000030  3d 22 ab 8e d8 81 03 94  68 a0 6c 72 d8 23 0b 4b  |="......h.lr.#.K|
-00000040  fe 9d c7 49 a7 7c bd fa  b5 7a 5e 5b 00 05 00 00  |...I.|...z^[....|
-00000050  05 ff 01 00 01 00 16 03  03 02 be 0b 00 02 ba 00  |................|
-00000060  02 b7 00 02 b4 30 82 02  b0 30 82 02 19 a0 03 02  |.....0...0......|
-00000070  01 02 02 09 00 85 b0 bb  a4 8a 7f b8 ca 30 0d 06  |.............0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 05 05 00 30 45 31 0b  |.*.H........0E1.|
-00000090  30 09 06 03 55 04 06 13  02 41 55 31 13 30 11 06  |0...U....AU1.0..|
-000000a0  03 55 04 08 13 0a 53 6f  6d 65 2d 53 74 61 74 65  |.U....Some-State|
-000000b0  31 21 30 1f 06 03 55 04  0a 13 18 49 6e 74 65 72  |1!0...U....Inter|
-000000c0  6e 65 74 20 57 69 64 67  69 74 73 20 50 74 79 20  |net Widgits Pty |
-000000d0  4c 74 64 30 1e 17 0d 31  30 30 34 32 34 30 39 30  |Ltd0...100424090|
-000000e0  39 33 38 5a 17 0d 31 31  30 34 32 34 30 39 30 39  |938Z..1104240909|
-000000f0  33 38 5a 30 45 31 0b 30  09 06 03 55 04 06 13 02  |38Z0E1.0...U....|
-00000100  41 55 31 13 30 11 06 03  55 04 08 13 0a 53 6f 6d  |AU1.0...U....Som|
-00000110  65 2d 53 74 61 74 65 31  21 30 1f 06 03 55 04 0a  |e-State1!0...U..|
-00000120  13 18 49 6e 74 65 72 6e  65 74 20 57 69 64 67 69  |..Internet Widgi|
-00000130  74 73 20 50 74 79 20 4c  74 64 30 81 9f 30 0d 06  |ts Pty Ltd0..0..|
-00000140  09 2a 86 48 86 f7 0d 01  01 01 05 00 03 81 8d 00  |.*.H............|
-00000150  30 81 89 02 81 81 00 bb  79 d6 f5 17 b5 e5 bf 46  |0.......y......F|
-00000160  10 d0 dc 69 be e6 2b 07  43 5a d0 03 2d 8a 7a 43  |...i..+.CZ..-.zC|
-00000170  85 b7 14 52 e7 a5 65 4c  2c 78 b8 23 8c b5 b4 82  |...R..eL,x.#....|
-00000180  e5 de 1f 95 3b 7e 62 a5  2c a5 33 d6 fe 12 5c 7a  |....;~b.,.3...\z|
-00000190  56 fc f5 06 bf fa 58 7b  26 3f b5 cd 04 d3 d0 c9  |V.....X{&?......|
-000001a0  21 96 4a c7 f4 54 9f 5a  bf ef 42 71 00 fe 18 99  |!.J..T.Z..Bq....|
-000001b0  07 7f 7e 88 7d 7d f1 04  39 c4 a2 2e db 51 c9 7c  |..~.}}..9....Q.||
-000001c0  e3 c0 4c 3b 32 66 01 cf  af b1 1d b8 71 9a 1d db  |..L;2f......q...|
-000001d0  db 89 6b ae da 2d 79 02  03 01 00 01 a3 81 a7 30  |..k..-y........0|
-000001e0  81 a4 30 1d 06 03 55 1d  0e 04 16 04 14 b1 ad e2  |..0...U.........|
-000001f0  85 5a cf cb 28 db 69 ce  23 69 de d3 26 8e 18 88  |.Z..(.i.#i..&...|
-00000200  39 30 75 06 03 55 1d 23  04 6e 30 6c 80 14 b1 ad  |90u..U.#.n0l....|
-00000210  e2 85 5a cf cb 28 db 69  ce 23 69 de d3 26 8e 18  |..Z..(.i.#i..&..|
-00000220  88 39 a1 49 a4 47 30 45  31 0b 30 09 06 03 55 04  |.9.I.G0E1.0...U.|
-00000230  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
-00000240  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
-00000250  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
-00000260  64 67 69 74 73 20 50 74  79 20 4c 74 64 82 09 00  |dgits Pty Ltd...|
-00000270  85 b0 bb a4 8a 7f b8 ca  30 0c 06 03 55 1d 13 04  |........0...U...|
-00000280  05 30 03 01 01 ff 30 0d  06 09 2a 86 48 86 f7 0d  |.0....0...*.H...|
-00000290  01 01 05 05 00 03 81 81  00 08 6c 45 24 c7 6b b1  |..........lE$.k.|
-000002a0  59 ab 0c 52 cc f2 b0 14  d7 87 9d 7a 64 75 b5 5a  |Y..R.......zdu.Z|
-000002b0  95 66 e4 c5 2b 8e ae 12  66 1f eb 4f 38 b3 6e 60  |.f..+...f..O8.n`|
-000002c0  d3 92 fd f7 41 08 b5 25  13 b1 18 7a 24 fb 30 1d  |....A..%...z$.0.|
-000002d0  ba ed 98 b9 17 ec e7 d7  31 59 db 95 d3 1d 78 ea  |........1Y....x.|
-000002e0  50 56 5c d5 82 5a 2d 5a  5f 33 c4 b6 d8 c9 75 90  |PV\..Z-Z_3....u.|
-000002f0  96 8c 0f 52 98 b5 cd 98  1f 89 20 5f f2 a0 1c a3  |...R...... _....|
-00000300  1b 96 94 dd a9 fd 57 e9  70 e8 26 6d 71 99 9b 26  |......W.p.&mq..&|
-00000310  6e 38 50 29 6c 90 a7 bd  d9 16 03 03 00 2e 0d 00  |n8P)l...........|
-00000320  00 26 03 01 02 40 00 1e  06 01 06 02 06 03 05 01  |.&...@..........|
-00000330  05 02 05 03 04 01 04 02  04 03 03 01 03 02 03 03  |................|
-00000340  02 01 02 02 02 03 00 00  0e 00 00 00              |............|
->>> Flow 3 (client to server)
-00000000  16 03 03 02 0a 0b 00 02  06 00 02 03 00 02 00 30  |...............0|
-00000010  82 01 fc 30 82 01 5e 02  09 00 9a 30 84 6c 26 35  |...0..^....0.l&5|
-00000020  d9 17 30 09 06 07 2a 86  48 ce 3d 04 01 30 45 31  |..0...*.H.=..0E1|
-00000030  0b 30 09 06 03 55 04 06  13 02 41 55 31 13 30 11  |.0...U....AU1.0.|
-00000040  06 03 55 04 08 13 0a 53  6f 6d 65 2d 53 74 61 74  |..U....Some-Stat|
-00000050  65 31 21 30 1f 06 03 55  04 0a 13 18 49 6e 74 65  |e1!0...U....Inte|
-00000060  72 6e 65 74 20 57 69 64  67 69 74 73 20 50 74 79  |rnet Widgits Pty|
-00000070  20 4c 74 64 30 1e 17 0d  31 32 31 31 31 34 31 33  | Ltd0...12111413|
-00000080  32 35 35 33 5a 17 0d 32  32 31 31 31 32 31 33 32  |2553Z..221112132|
-00000090  35 35 33 5a 30 41 31 0b  30 09 06 03 55 04 06 13  |553Z0A1.0...U...|
-000000a0  02 41 55 31 0c 30 0a 06  03 55 04 08 13 03 4e 53  |.AU1.0...U....NS|
-000000b0  57 31 10 30 0e 06 03 55  04 07 13 07 50 79 72 6d  |W1.0...U....Pyrm|
-000000c0  6f 6e 74 31 12 30 10 06  03 55 04 03 13 09 4a 6f  |ont1.0...U....Jo|
-000000d0  65 6c 20 53 69 6e 67 30  81 9b 30 10 06 07 2a 86  |el Sing0..0...*.|
-000000e0  48 ce 3d 02 01 06 05 2b  81 04 00 23 03 81 86 00  |H.=....+...#....|
-000000f0  04 00 95 8c 91 75 14 c0  5e c4 57 b4 d4 c3 6f 8d  |.....u..^.W...o.|
-00000100  ae 68 1e dd 6f ce 86 e1  7e 6e b2 48 3e 81 e5 4e  |.h..o...~n.H>..N|
-00000110  e2 c6 88 4b 64 dc f5 30  bb d3 ff 65 cc 5b f4 dd  |...Kd..0...e.[..|
-00000120  b5 6a 3e 3e d0 1d de 47  c3 76 ad 19 f6 45 2c 8c  |.j>>...G.v...E,.|
-00000130  bc d8 1d 01 4c 1f 70 90  46 76 48 8b 8f 83 cc 4a  |....L.p.FvH....J|
-00000140  5c 8f 40 76 da e0 89 ec  1d 2b c4 4e 30 76 28 41  |\.@v.....+.N0v(A|
-00000150  b2 62 a8 fb 5b f1 f9 4e  7a 8d bd 09 b8 ae ea 8b  |.b..[..Nz.......|
-00000160  18 27 4f 2e 70 fe 13 96  ba c3 d3 40 16 cd 65 4e  |.'O.p......@..eN|
-00000170  ac 11 1e e6 f1 30 09 06  07 2a 86 48 ce 3d 04 01  |.....0...*.H.=..|
-00000180  03 81 8c 00 30 81 88 02  42 00 e0 14 c4 60 60 0b  |....0...B....``.|
-00000190  72 68 b0 32 5d 61 4a 02  74 5c c2 81 b9 16 a8 3f  |rh.2]aJ.t\.....?|
-000001a0  29 c8 36 c7 81 ff 6c b6  5b d9 70 f1 38 3b 50 48  |).6...l.[.p.8;PH|
-000001b0  28 94 cb 09 1a 52 f1 5d  ee 8d f2 b9 f0 f0 da d9  |(....R.]........|
-000001c0  15 3a f9 bd 03 7a 87 a2  23 35 ec 02 42 01 a3 d4  |.:...z..#5..B...|
-000001d0  8a 78 35 1c 4a 9a 23 d2  0a be 2b 10 31 9d 9c 5f  |.x5.J.#...+.1.._|
-000001e0  be e8 91 b3 da 1a f5 5d  a3 23 f5 26 8b 45 70 8d  |.......].#.&.Ep.|
-000001f0  65 62 9b 7e 01 99 3d 18  f6 10 9a 38 61 9b 2e 57  |eb.~..=....8a..W|
-00000200  e4 fa cc b1 8a ce e2 23  a0 87 f0 e1 67 51 eb 16  |.......#....gQ..|
-00000210  03 03 00 86 10 00 00 82  00 80 6d 51 f3 7f f9 3e  |..........mQ...>|
-00000220  fb 75 82 41 36 83 e8 6a  ee 2a 2e 25 90 67 4c 8e  |.u.A6..j.*.%.gL.|
-00000230  62 2f 30 81 17 e0 85 09  0c 2b b7 23 d7 b0 e2 1d  |b/0......+.#....|
-00000240  f7 3b d7 f5 a1 27 b6 ee  24 b6 1b cc 5b ea 66 0d  |.;...'..$...[.f.|
-00000250  6a f4 e5 85 f9 da 43 b4  0e 86 85 e1 f5 aa be c8  |j.....C.........|
-00000260  ce 39 4c 9c 86 00 08 c2  4b e2 c6 ec 2f f7 ce e6  |.9L.....K.../...|
-00000270  bd 77 82 6f 23 b6 e0 bd  a2 92 b7 3a ac e8 56 f1  |.w.o#......:..V.|
-00000280  af 54 5e 46 87 e9 3b 33  e7 b8 28 b7 d6 c8 90 35  |.T^F..;3..(....5|
-00000290  d4 1c 43 d1 30 6f 55 4e  0a 70 16 03 03 00 92 0f  |..C.0oUN.p......|
-000002a0  00 00 8e 05 03 00 8a 30  81 87 02 41 19 c7 50 06  |.......0...A..P.|
-000002b0  42 82 f9 e5 ec 0b f7 65  7e b1 19 53 5f 23 ab 19  |B......e~..S_#..|
-000002c0  54 08 ec d2 a7 22 dd 83  7c 97 76 59 a5 6b f4 1d  |T...."..|.vY.k..|
-000002d0  92 86 34 2d ce 71 bb 01  d2 8a 67 0e a8 fb 51 e4  |..4-.q....g...Q.|
-000002e0  69 9c 27 23 74 b9 fd 6f  b6 5e 48 a0 cc 02 42 01  |i.'#t..o.^H...B.|
-000002f0  50 97 b7 95 14 f4 a6 f2  95 63 17 38 59 a1 51 95  |P........c.8Y.Q.|
-00000300  1e bc 99 fb fd 82 8b ab  cb 4d 8e 17 a9 f8 e9 c2  |.........M......|
-00000310  9b 93 15 02 50 e6 c2 05  54 e7 8a ec 6f 93 1f 79  |....P...T...o..y|
-00000320  8d 67 e7 2d d6 65 ab 97  fd be 20 97 bd 6b c4 fc  |.g.-.e.... ..k..|
-00000330  02 14 03 03 00 01 01 16  03 03 00 24 24 df 52 6e  |...........$$.Rn|
-00000340  c1 35 48 fe 60 77 28 69  36 fe 96 a1 72 db a2 f5  |.5H.`w(i6...r...|
-00000350  d0 b7 c3 d9 67 e5 ee f2  d9 18 bf f0 35 80 06 c2  |....g.......5...|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 24 40 5b dc 01 59  |..........$@[..Y|
-00000010  33 6e 61 5a 6d fc c8 a5  f5 00 9b 55 77 c5 e6 f2  |3naZm......Uw...|
-00000020  c6 5c b6 2f 94 3c 72 5b  b5 0c 3e 78 88 e6 44     |.\./.<r[..>x..D|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 1a cd 2f 11  b1 3a e4 1c 31 95 9b c4  |....../..:..1...|
-00000010  37 20 9f 03 d3 45 a4 15  e1 09 1e 0c f6 5d d3 15  |7 ...E.......]..|
-00000020  03 03 00 16 d7 f6 a1 d0  ad 41 69 73 c0 40 22 f2  |.........Ais.@".|
-00000030  5f e8 c3 50 f9 35 fc 59  e0 3a                    |_..P.5.Y.:|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-AES256-GCM-SHA384 b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-AES256-GCM-SHA384
deleted file mode 100644
index 52e3bef..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-AES256-GCM-SHA384
+++ /dev/null
@@ -1,139 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 74 fe 19 af 4b  |....Y...U..t...K|
-00000010  f3 d8 92 62 5a df 90 2c  cc 09 fd 79 45 26 cd 52  |...bZ..,...yE&.R|
-00000020  9a e6 da 16 99 fe 1d 91  79 a7 a0 20 b3 13 e9 03  |........y.. ....|
-00000030  52 23 5f f0 55 59 f1 9e  00 a7 77 97 90 ed 2b fb  |R#_.UY....w...+.|
-00000040  9c ab fe b1 db ea 16 95  95 68 b0 e9 c0 30 00 00  |.........h...0..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 be 0b 00 02 ba 00  02 b7 00 02 b4 30 82 02  |.............0..|
-00000070  b0 30 82 02 19 a0 03 02  01 02 02 09 00 85 b0 bb  |.0..............|
-00000080  a4 8a 7f b8 ca 30 0d 06  09 2a 86 48 86 f7 0d 01  |.....0...*.H....|
-00000090  01 05 05 00 30 45 31 0b  30 09 06 03 55 04 06 13  |....0E1.0...U...|
-000000a0  02 41 55 31 13 30 11 06  03 55 04 08 13 0a 53 6f  |.AU1.0...U....So|
-000000b0  6d 65 2d 53 74 61 74 65  31 21 30 1f 06 03 55 04  |me-State1!0...U.|
-000000c0  0a 13 18 49 6e 74 65 72  6e 65 74 20 57 69 64 67  |...Internet Widg|
-000000d0  69 74 73 20 50 74 79 20  4c 74 64 30 1e 17 0d 31  |its Pty Ltd0...1|
-000000e0  30 30 34 32 34 30 39 30  39 33 38 5a 17 0d 31 31  |00424090938Z..11|
-000000f0  30 34 32 34 30 39 30 39  33 38 5a 30 45 31 0b 30  |0424090938Z0E1.0|
-00000100  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-00000110  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-00000120  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-00000130  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-00000140  74 64 30 81 9f 30 0d 06  09 2a 86 48 86 f7 0d 01  |td0..0...*.H....|
-00000150  01 01 05 00 03 81 8d 00  30 81 89 02 81 81 00 bb  |........0.......|
-00000160  79 d6 f5 17 b5 e5 bf 46  10 d0 dc 69 be e6 2b 07  |y......F...i..+.|
-00000170  43 5a d0 03 2d 8a 7a 43  85 b7 14 52 e7 a5 65 4c  |CZ..-.zC...R..eL|
-00000180  2c 78 b8 23 8c b5 b4 82  e5 de 1f 95 3b 7e 62 a5  |,x.#........;~b.|
-00000190  2c a5 33 d6 fe 12 5c 7a  56 fc f5 06 bf fa 58 7b  |,.3...\zV.....X{|
-000001a0  26 3f b5 cd 04 d3 d0 c9  21 96 4a c7 f4 54 9f 5a  |&?......!.J..T.Z|
-000001b0  bf ef 42 71 00 fe 18 99  07 7f 7e 88 7d 7d f1 04  |..Bq......~.}}..|
-000001c0  39 c4 a2 2e db 51 c9 7c  e3 c0 4c 3b 32 66 01 cf  |9....Q.|..L;2f..|
-000001d0  af b1 1d b8 71 9a 1d db  db 89 6b ae da 2d 79 02  |....q.....k..-y.|
-000001e0  03 01 00 01 a3 81 a7 30  81 a4 30 1d 06 03 55 1d  |.......0..0...U.|
-000001f0  0e 04 16 04 14 b1 ad e2  85 5a cf cb 28 db 69 ce  |.........Z..(.i.|
-00000200  23 69 de d3 26 8e 18 88  39 30 75 06 03 55 1d 23  |#i..&...90u..U.#|
-00000210  04 6e 30 6c 80 14 b1 ad  e2 85 5a cf cb 28 db 69  |.n0l......Z..(.i|
-00000220  ce 23 69 de d3 26 8e 18  88 39 a1 49 a4 47 30 45  |.#i..&...9.I.G0E|
-00000230  31 0b 30 09 06 03 55 04  06 13 02 41 55 31 13 30  |1.0...U....AU1.0|
-00000240  11 06 03 55 04 08 13 0a  53 6f 6d 65 2d 53 74 61  |...U....Some-Sta|
-00000250  74 65 31 21 30 1f 06 03  55 04 0a 13 18 49 6e 74  |te1!0...U....Int|
-00000260  65 72 6e 65 74 20 57 69  64 67 69 74 73 20 50 74  |ernet Widgits Pt|
-00000270  79 20 4c 74 64 82 09 00  85 b0 bb a4 8a 7f b8 ca  |y Ltd...........|
-00000280  30 0c 06 03 55 1d 13 04  05 30 03 01 01 ff 30 0d  |0...U....0....0.|
-00000290  06 09 2a 86 48 86 f7 0d  01 01 05 05 00 03 81 81  |..*.H...........|
-000002a0  00 08 6c 45 24 c7 6b b1  59 ab 0c 52 cc f2 b0 14  |..lE$.k.Y..R....|
-000002b0  d7 87 9d 7a 64 75 b5 5a  95 66 e4 c5 2b 8e ae 12  |...zdu.Z.f..+...|
-000002c0  66 1f eb 4f 38 b3 6e 60  d3 92 fd f7 41 08 b5 25  |f..O8.n`....A..%|
-000002d0  13 b1 18 7a 24 fb 30 1d  ba ed 98 b9 17 ec e7 d7  |...z$.0.........|
-000002e0  31 59 db 95 d3 1d 78 ea  50 56 5c d5 82 5a 2d 5a  |1Y....x.PV\..Z-Z|
-000002f0  5f 33 c4 b6 d8 c9 75 90  96 8c 0f 52 98 b5 cd 98  |_3....u....R....|
-00000300  1f 89 20 5f f2 a0 1c a3  1b 96 94 dd a9 fd 57 e9  |.. _..........W.|
-00000310  70 e8 26 6d 71 99 9b 26  6e 38 50 29 6c 90 a7 bd  |p.&mq..&n8P)l...|
-00000320  d9 16 03 03 00 cd 0c 00  00 c9 03 00 17 41 04 22  |.............A."|
-00000330  84 e9 5e 6e 35 92 a3 83  73 0a d6 0d 1a c1 4d ab  |..^n5...s.....M.|
-00000340  1f ab c2 dc 3f 53 a5 7d  38 c0 92 a4 82 e1 3c c5  |....?S.}8.....<.|
-00000350  24 60 20 a5 3b c5 65 ba  9c f1 b9 a5 b9 c2 70 73  |$` .;.e.......ps|
-00000360  19 74 a6 d1 0f 75 b4 75  e0 e8 60 20 e9 23 fe 04  |.t...u.u..` .#..|
-00000370  01 00 80 92 e0 56 3f 48  0d 10 23 48 b5 95 b6 91  |.....V?H..#H....|
-00000380  3e 8a 2e c7 02 e2 85 0e  59 c8 03 24 d9 1a 1a 25  |>.......Y..$...%|
-00000390  8e 12 bb 0b 83 ac 51 36  81 3f bc 0e be b9 3b 1d  |......Q6.?....;.|
-000003a0  67 56 21 4d 24 36 84 05  61 e7 70 60 d5 8e ae 97  |gV!M$6..a.p`....|
-000003b0  b8 3a d3 b1 94 72 52 cd  b0 0d dd 46 b1 15 3b 58  |.:...rR....F..;X|
-000003c0  c1 a4 63 2c 4c 31 f9 c7  4f 27 c1 0f f0 24 36 72  |..c,L1..O'...$6r|
-000003d0  e0 f8 51 12 86 c2 13 ed  6b 84 a8 15 c3 d0 39 55  |..Q.....k.....9U|
-000003e0  a4 60 50 88 c9 1e 60 60  aa 8d a5 31 3e 35 c3 f8  |.`P...``...1>5..|
-000003f0  2c 90 1c 16 03 03 00 2e  0d 00 00 26 03 01 02 40  |,..........&...@|
-00000400  00 1e 06 01 06 02 06 03  05 01 05 02 05 03 04 01  |................|
-00000410  04 02 04 03 03 01 03 02  03 03 02 01 02 02 02 03  |................|
-00000420  00 00 0e 00 00 00                                 |......|
->>> Flow 3 (client to server)
-00000000  16 03 03 01 fb 0b 00 01  f7 00 01 f4 00 01 f1 30  |...............0|
-00000010  82 01 ed 30 82 01 58 a0  03 02 01 02 02 01 00 30  |...0..X........0|
-00000020  0b 06 09 2a 86 48 86 f7  0d 01 01 05 30 26 31 10  |...*.H......0&1.|
-00000030  30 0e 06 03 55 04 0a 13  07 41 63 6d 65 20 43 6f  |0...U....Acme Co|
-00000040  31 12 30 10 06 03 55 04  03 13 09 31 32 37 2e 30  |1.0...U....127.0|
-00000050  2e 30 2e 31 30 1e 17 0d  31 31 31 32 30 38 30 37  |.0.10...11120807|
-00000060  35 35 31 32 5a 17 0d 31  32 31 32 30 37 30 38 30  |5512Z..121207080|
-00000070  30 31 32 5a 30 26 31 10  30 0e 06 03 55 04 0a 13  |012Z0&1.0...U...|
-00000080  07 41 63 6d 65 20 43 6f  31 12 30 10 06 03 55 04  |.Acme Co1.0...U.|
-00000090  03 13 09 31 32 37 2e 30  2e 30 2e 31 30 81 9c 30  |...127.0.0.10..0|
-000000a0  0b 06 09 2a 86 48 86 f7  0d 01 01 01 03 81 8c 00  |...*.H..........|
-000000b0  30 81 88 02 81 80 4e d0  7b 31 e3 82 64 d9 59 c0  |0.....N.{1..d.Y.|
-000000c0  c2 87 a4 5e 1e 8b 73 33  c7 63 53 df 66 92 06 84  |...^..s3.cS.f...|
-000000d0  f6 64 d5 8f e4 36 a7 1d  2b e8 b3 20 36 45 23 b5  |.d...6..+.. 6E#.|
-000000e0  e3 95 ae ed e0 f5 20 9c  8d 95 df 7f 5a 12 ef 87  |...... .....Z...|
-000000f0  e4 5b 68 e4 e9 0e 74 ec  04 8a 7f de 93 27 c4 01  |.[h...t......'..|
-00000100  19 7a bd f2 dc 3d 14 ab  d0 54 ca 21 0c d0 4d 6e  |.z...=...T.!..Mn|
-00000110  87 2e 5c c5 d2 bb 4d 4b  4f ce b6 2c f7 7e 88 ec  |..\...MKO..,.~..|
-00000120  7c d7 02 91 74 a6 1e 0c  1a da e3 4a 5a 2e de 13  ||...t......JZ...|
-00000130  9c 4c 40 88 59 93 02 03  01 00 01 a3 32 30 30 30  |.L@.Y.......2000|
-00000140  0e 06 03 55 1d 0f 01 01  ff 04 04 03 02 00 a0 30  |...U...........0|
-00000150  0d 06 03 55 1d 0e 04 06  04 04 01 02 03 04 30 0f  |...U..........0.|
-00000160  06 03 55 1d 23 04 08 30  06 80 04 01 02 03 04 30  |..U.#..0.......0|
-00000170  0b 06 09 2a 86 48 86 f7  0d 01 01 05 03 81 81 00  |...*.H..........|
-00000180  36 1f b3 7a 0c 75 c9 6e  37 46 61 2b d5 bd c0 a7  |6..z.u.n7Fa+....|
-00000190  4b cc 46 9a 81 58 7c 85  79 29 c8 c8 c6 67 dd 32  |K.F..X|.y)...g.2|
-000001a0  56 45 2b 75 b6 e9 24 a9  50 9a be 1f 5a fa 1a 15  |VE+u..$.P...Z...|
-000001b0  d9 cc 55 95 72 16 83 b9  c2 b6 8f fd 88 8c 38 84  |..U.r.........8.|
-000001c0  1d ab 5d 92 31 13 4f fd  83 3b c6 9d f1 11 62 b6  |..].1.O..;....b.|
-000001d0  8b ec ab 67 be c8 64 b0  11 50 46 58 17 6b 99 1c  |...g..d..PFX.k..|
-000001e0  d3 1d fc 06 f1 0e e5 96  a8 0c f9 78 20 b7 44 18  |...........x .D.|
-000001f0  51 8d 10 7e 4f 94 67 df  a3 4e 70 73 8e 90 91 85  |Q..~O.g..Nps....|
-00000200  16 03 03 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000210  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000220  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000230  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000240  a6 b5 68 1a 41 03 56 6b  dc 5a 89 16 03 03 00 88  |..h.A.Vk.Z......|
-00000250  0f 00 00 84 05 01 00 80  33 bb 8e 67 64 03 e7 7e  |........3..gd..~|
-00000260  be a5 b1 bc cf 7a 07 24  01 17 c3 3d 4b 72 dd c3  |.....z.$...=Kr..|
-00000270  64 a7 36 e8 49 ab b6 87  ce d6 af 9e 07 22 76 e8  |d.6.I........"v.|
-00000280  0d 44 a3 36 c9 eb a4 49  85 cf 72 67 e8 2a a7 5b  |.D.6...I..rg.*.[|
-00000290  d3 f2 46 af 53 48 c6 13  f7 0b 5b 9c c7 4d 3e 05  |..F.SH....[..M>.|
-000002a0  3c 0f 69 a7 40 3a e8 70  04 01 1c 29 b2 42 0f 5f  |<.i.@:.p...).B._|
-000002b0  1c d5 b7 5c c2 17 07 7f  bd a2 b3 9a 95 81 51 24  |...\..........Q$|
-000002c0  54 5c 42 d6 a4 76 c0 d7  54 d2 11 54 bf fd dc a0  |T\B..v..T..T....|
-000002d0  ee 95 26 64 59 a0 fc 51  14 03 03 00 01 01 16 03  |..&dY..Q........|
-000002e0  03 00 28 00 00 00 00 00  00 00 00 af f4 8a be d9  |..(.............|
-000002f0  ff f1 44 e4 41 ab 9b b3  d8 b0 3d 3f 6b c5 1d b6  |..D.A.....=?k...|
-00000300  1d 9e 35 f5 20 f4 2a af  e8 35 77                 |..5. .*..5w|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 ff 0d 47 63 2b  |..........(..Gc+|
-00000010  bd 00 3a ad 82 e3 a7 b3  b0 84 4a 26 f4 30 78 20  |..:.......J&.0x |
-00000020  80 f2 2b 15 98 61 1c cb  8b 17 67 8a 11 96 aa 93  |..+..a....g.....|
-00000030  68 f7 fb                                          |h..|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 a6 8d 7b  |...............{|
-00000010  99 5e a2 e1 95 bb 5f e4  01 f4 0e 20 52 b4 64 4e  |.^...._.... R.dN|
-00000020  86 b1 3f 15 03 03 00 1a  00 00 00 00 00 00 00 02  |..?.............|
-00000030  61 98 eb d0 7c ac bd 00  ac 7a e1 32 20 3e 81 b6  |a...|....z.2 >..|
-00000040  9d d5                                             |..|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-ECDSA b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-ECDSA
deleted file mode 100644
index 23bf29d..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-ECDSA
+++ /dev/null
@@ -1,133 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 b3 7f 4e e7 11  |....Y...U....N..|
-00000010  6d bc 56 ec 9c a8 61 08  d6 5a 2a 42 7b f1 94 0a  |m.V...a..Z*B{...|
-00000020  29 35 8b 7e 23 a0 6c 59  23 cf 39 20 84 09 b6 5b  |)5.~#.lY#.9 ...[|
-00000030  2f 46 80 3b 26 92 fd 81  e9 24 8c e2 b8 64 a2 03  |/F.;&....$...d..|
-00000040  3a 68 c3 7b 44 f8 28 41  e2 d3 6c 7c c0 09 00 00  |:h.{D.(A..l|....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
-00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
-00000080  30 09 06 07 2a 86 48 ce  3d 04 01 30 45 31 0b 30  |0...*.H.=..0E1.0|
-00000090  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-000000a0  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-000000b0  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-000000c0  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-000000d0  74 64 30 1e 17 0d 31 32  31 31 32 32 31 35 30 36  |td0...1211221506|
-000000e0  33 32 5a 17 0d 32 32 31  31 32 30 31 35 30 36 33  |32Z..22112015063|
-000000f0  32 5a 30 45 31 0b 30 09  06 03 55 04 06 13 02 41  |2Z0E1.0...U....A|
-00000100  55 31 13 30 11 06 03 55  04 08 13 0a 53 6f 6d 65  |U1.0...U....Some|
-00000110  2d 53 74 61 74 65 31 21  30 1f 06 03 55 04 0a 13  |-State1!0...U...|
-00000120  18 49 6e 74 65 72 6e 65  74 20 57 69 64 67 69 74  |.Internet Widgit|
-00000130  73 20 50 74 79 20 4c 74  64 30 81 9b 30 10 06 07  |s Pty Ltd0..0...|
-00000140  2a 86 48 ce 3d 02 01 06  05 2b 81 04 00 23 03 81  |*.H.=....+...#..|
-00000150  86 00 04 00 c4 a1 ed be  98 f9 0b 48 73 36 7e c3  |...........Hs6~.|
-00000160  16 56 11 22 f2 3d 53 c3  3b 4d 21 3d cd 6b 75 e6  |.V.".=S.;M!=.ku.|
-00000170  f6 b0 dc 9a df 26 c1 bc  b2 87 f0 72 32 7c b3 64  |.....&.....r2|.d|
-00000180  2f 1c 90 bc ea 68 23 10  7e fe e3 25 c0 48 3a 69  |/....h#.~..%.H:i|
-00000190  e0 28 6d d3 37 00 ef 04  62 dd 0d a0 9c 70 62 83  |.(m.7...b....pb.|
-000001a0  d8 81 d3 64 31 aa 9e 97  31 bd 96 b0 68 c0 9b 23  |...d1...1...h..#|
-000001b0  de 76 64 3f 1a 5c 7f e9  12 0e 58 58 b6 5f 70 dd  |.vd?.\....XX._p.|
-000001c0  9b d8 ea d5 d7 f5 d5 cc  b9 b6 9f 30 66 5b 66 9a  |...........0f[f.|
-000001d0  20 e2 27 e5 bf fe 3b 30  09 06 07 2a 86 48 ce 3d  | .'...;0...*.H.=|
-000001e0  04 01 03 81 8c 00 30 81  88 02 42 01 88 a2 4f eb  |......0...B...O.|
-000001f0  e2 45 c5 48 7d 1b ac f5  ed 98 9d ae 47 70 c0 5e  |.E.H}.......Gp.^|
-00000200  1b b6 2f bd f1 b6 4d b7  61 40 d3 11 a2 ce ee 0b  |../...M.a@......|
-00000210  7e 92 7e ff 76 9d c3 3b  7e a5 3f ce fa 10 e2 59  |~.~.v..;~.?....Y|
-00000220  ec 47 2d 7c ac da 4e 97  0e 15 a0 6f d0 02 42 01  |.G-|..N....o..B.|
-00000230  4d fc be 67 13 9c 2d 05  0e bd 3f a3 8c 25 c1 33  |M..g..-...?..%.3|
-00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
-00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
-00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 03 00 d7 0c 00  00 d3 03 00 17 41 04 0f  |*............A..|
-00000280  4d b0 41 d4 dc 6b 8a 85  52 eb eb 18 4a 8f a7 e6  |M.A..k..R...J...|
-00000290  24 52 e5 86 be 57 d7 0a  e7 23 84 a8 a9 6c 96 08  |$R...W...#...l..|
-000002a0  4b f7 47 32 79 d9 df 81  f6 05 40 63 3b 14 67 3b  |K.G2y.....@c;.g;|
-000002b0  ea 01 a0 0d 43 1a 36 29  b3 51 7a e4 af 1b 67 04  |....C.6).Qz...g.|
-000002c0  03 00 8a 30 81 87 02 42  01 8e 57 8a b8 b7 5b 2f  |...0...B..W...[/|
-000002d0  9c 31 74 d8 7d 68 d7 6e  83 73 5f fb d0 cd de 66  |.1t.}h.n.s_....f|
-000002e0  60 fa 0a 0a 15 0b 30 3b  08 b6 f1 3e 4f 20 13 62  |`.....0;...>O .b|
-000002f0  b5 ff 86 81 dc 42 a1 4c  af c8 ff b3 24 81 d8 e1  |.....B.L....$...|
-00000300  d1 09 0c 32 11 92 5e dd  3f 87 02 41 76 a7 29 48  |...2..^.?..Av.)H|
-00000310  52 68 1c 72 4d d5 39 bf  fa 61 ec b2 27 ce 10 4e  |Rh.rM.9..a..'..N|
-00000320  86 12 3d 1e 04 9c 11 b7  b4 0c cf 98 9d 01 c3 93  |..=.............|
-00000330  cf 83 9e 92 9a ca fd 8f  b1 9f 1b 20 c4 fb a4 46  |........... ...F|
-00000340  60 fc fd d5 33 b0 8f b5  b5 c8 a4 70 c5 16 03 03  |`...3......p....|
-00000350  00 2e 0d 00 00 26 03 01  02 40 00 1e 06 01 06 02  |.....&...@......|
-00000360  06 03 05 01 05 02 05 03  04 01 04 02 04 03 03 01  |................|
-00000370  03 02 03 03 02 01 02 02  02 03 00 00 0e 00 00 00  |................|
->>> Flow 3 (client to server)
-00000000  16 03 03 01 fb 0b 00 01  f7 00 01 f4 00 01 f1 30  |...............0|
-00000010  82 01 ed 30 82 01 58 a0  03 02 01 02 02 01 00 30  |...0..X........0|
-00000020  0b 06 09 2a 86 48 86 f7  0d 01 01 05 30 26 31 10  |...*.H......0&1.|
-00000030  30 0e 06 03 55 04 0a 13  07 41 63 6d 65 20 43 6f  |0...U....Acme Co|
-00000040  31 12 30 10 06 03 55 04  03 13 09 31 32 37 2e 30  |1.0...U....127.0|
-00000050  2e 30 2e 31 30 1e 17 0d  31 31 31 32 30 38 30 37  |.0.10...11120807|
-00000060  35 35 31 32 5a 17 0d 31  32 31 32 30 37 30 38 30  |5512Z..121207080|
-00000070  30 31 32 5a 30 26 31 10  30 0e 06 03 55 04 0a 13  |012Z0&1.0...U...|
-00000080  07 41 63 6d 65 20 43 6f  31 12 30 10 06 03 55 04  |.Acme Co1.0...U.|
-00000090  03 13 09 31 32 37 2e 30  2e 30 2e 31 30 81 9c 30  |...127.0.0.10..0|
-000000a0  0b 06 09 2a 86 48 86 f7  0d 01 01 01 03 81 8c 00  |...*.H..........|
-000000b0  30 81 88 02 81 80 4e d0  7b 31 e3 82 64 d9 59 c0  |0.....N.{1..d.Y.|
-000000c0  c2 87 a4 5e 1e 8b 73 33  c7 63 53 df 66 92 06 84  |...^..s3.cS.f...|
-000000d0  f6 64 d5 8f e4 36 a7 1d  2b e8 b3 20 36 45 23 b5  |.d...6..+.. 6E#.|
-000000e0  e3 95 ae ed e0 f5 20 9c  8d 95 df 7f 5a 12 ef 87  |...... .....Z...|
-000000f0  e4 5b 68 e4 e9 0e 74 ec  04 8a 7f de 93 27 c4 01  |.[h...t......'..|
-00000100  19 7a bd f2 dc 3d 14 ab  d0 54 ca 21 0c d0 4d 6e  |.z...=...T.!..Mn|
-00000110  87 2e 5c c5 d2 bb 4d 4b  4f ce b6 2c f7 7e 88 ec  |..\...MKO..,.~..|
-00000120  7c d7 02 91 74 a6 1e 0c  1a da e3 4a 5a 2e de 13  ||...t......JZ...|
-00000130  9c 4c 40 88 59 93 02 03  01 00 01 a3 32 30 30 30  |.L@.Y.......2000|
-00000140  0e 06 03 55 1d 0f 01 01  ff 04 04 03 02 00 a0 30  |...U...........0|
-00000150  0d 06 03 55 1d 0e 04 06  04 04 01 02 03 04 30 0f  |...U..........0.|
-00000160  06 03 55 1d 23 04 08 30  06 80 04 01 02 03 04 30  |..U.#..0.......0|
-00000170  0b 06 09 2a 86 48 86 f7  0d 01 01 05 03 81 81 00  |...*.H..........|
-00000180  36 1f b3 7a 0c 75 c9 6e  37 46 61 2b d5 bd c0 a7  |6..z.u.n7Fa+....|
-00000190  4b cc 46 9a 81 58 7c 85  79 29 c8 c8 c6 67 dd 32  |K.F..X|.y)...g.2|
-000001a0  56 45 2b 75 b6 e9 24 a9  50 9a be 1f 5a fa 1a 15  |VE+u..$.P...Z...|
-000001b0  d9 cc 55 95 72 16 83 b9  c2 b6 8f fd 88 8c 38 84  |..U.r.........8.|
-000001c0  1d ab 5d 92 31 13 4f fd  83 3b c6 9d f1 11 62 b6  |..].1.O..;....b.|
-000001d0  8b ec ab 67 be c8 64 b0  11 50 46 58 17 6b 99 1c  |...g..d..PFX.k..|
-000001e0  d3 1d fc 06 f1 0e e5 96  a8 0c f9 78 20 b7 44 18  |...........x .D.|
-000001f0  51 8d 10 7e 4f 94 67 df  a3 4e 70 73 8e 90 91 85  |Q..~O.g..Nps....|
-00000200  16 03 03 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000210  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000220  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000230  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000240  a6 b5 68 1a 41 03 56 6b  dc 5a 89 16 03 03 00 88  |..h.A.Vk.Z......|
-00000250  0f 00 00 84 05 01 00 80  02 19 16 cc 97 ad 70 20  |..............p |
-00000260  bd 64 63 dd b6 81 a0 16  b3 46 4b 42 ff 21 58 2c  |.dc......FKB.!X,|
-00000270  bb 2b 4c e1 4e d7 49 4d  5c 7c 63 32 3e ef e6 ad  |.+L.N.IM\|c2>...|
-00000280  85 3f ab b4 5c 2a 37 76  8b 28 56 08 4f 08 b9 51  |.?..\*7v.(V.O..Q|
-00000290  71 14 07 27 47 45 11 a0  03 cf 72 7d 67 ef 31 8d  |q..'GE....r}g.1.|
-000002a0  e7 db 36 76 b1 b3 f4 bf  aa 6c c4 56 94 35 71 e1  |..6v.....l.V.5q.|
-000002b0  dd 88 6d 15 90 c8 70 ad  d8 95 55 42 9b c1 45 19  |..m...p...UB..E.|
-000002c0  36 ce 87 c6 fd 94 8a d4  98 6e ec 18 d5 da 59 54  |6........n....YT|
-000002d0  80 a7 8c 90 ae 55 20 1c  14 03 03 00 01 01 16 03  |.....U .........|
-000002e0  03 00 40 00 00 00 00 00  00 00 00 00 00 00 00 00  |..@.............|
-000002f0  00 00 00 58 fe bc 5c ba  b2 a9 96 77 2f 95 c9 10  |...X..\....w/...|
-00000300  fd 6d fc 6a 88 8c df 82  c3 a4 3d cc 28 f4 bf 7d  |.m.j......=.(..}|
-00000310  4a f8 3d 97 36 e5 a0 76  92 94 da dd cc f5 e4 0e  |J.=.6..v........|
-00000320  7a c4 2c                                          |z.,|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 81 ab 5a 66 a8  |..........@..Zf.|
-00000010  0f a5 d3 07 00 66 45 1f  31 a9 ef f7 a0 d9 23 46  |.....fE.1.....#F|
-00000020  f0 3e 50 18 99 e3 5a bd  eb b7 1d 81 d5 95 d5 ee  |.>P...Z.........|
-00000030  21 31 41 4b 19 92 b5 95  36 da 21 c0 4a 2a a0 1c  |!1AK....6.!.J*..|
-00000040  a3 9f 8e a0 6f 9d 37 5e  12 11 03                 |....o.7^...|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000010  00 00 00 00 00 a9 51 94  19 72 ab 9f 3e 97 5e 99  |......Q..r..>.^.|
-00000020  2c ec 13 48 3e 10 54 5f  8a 85 88 4d 1a a8 f5 ed  |,..H>.T_...M....|
-00000030  c3 4f a9 59 a3 15 03 03  00 30 00 00 00 00 00 00  |.O.Y.....0......|
-00000040  00 00 00 00 00 00 00 00  00 00 25 00 6d 2f a0 f6  |..........%.m/..|
-00000050  ce 8a 30 ba 53 da 97 c6  11 f3 d2 f3 9e 66 d6 dd  |..0.S........f..|
-00000060  19 f3 ee 07 03 d3 e6 f1  30 32                    |........02|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSA b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSA
deleted file mode 100644
index ff79aa2..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-RSA
+++ /dev/null
@@ -1,127 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 51 02 00 00  4d 03 03 b3 b2 22 69 e4  |....Q...M...."i.|
-00000010  1a a1 56 94 26 0c 43 b7  89 0c 34 ce dc 5a c8 ca  |..V.&.C...4..Z..|
-00000020  e2 42 92 5c 75 9a b3 22  22 64 38 20 6d 2c 26 0b  |.B.\u..""d8 m,&.|
-00000030  34 b6 b8 20 36 e2 58 e5  ee 1f e2 9f a0 75 f6 d9  |4.. 6.X......u..|
-00000040  0c e4 39 ce 3c 8e 2e f8  e8 d1 a2 16 00 05 00 00  |..9.<...........|
-00000050  05 ff 01 00 01 00 16 03  03 02 be 0b 00 02 ba 00  |................|
-00000060  02 b7 00 02 b4 30 82 02  b0 30 82 02 19 a0 03 02  |.....0...0......|
-00000070  01 02 02 09 00 85 b0 bb  a4 8a 7f b8 ca 30 0d 06  |.............0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 05 05 00 30 45 31 0b  |.*.H........0E1.|
-00000090  30 09 06 03 55 04 06 13  02 41 55 31 13 30 11 06  |0...U....AU1.0..|
-000000a0  03 55 04 08 13 0a 53 6f  6d 65 2d 53 74 61 74 65  |.U....Some-State|
-000000b0  31 21 30 1f 06 03 55 04  0a 13 18 49 6e 74 65 72  |1!0...U....Inter|
-000000c0  6e 65 74 20 57 69 64 67  69 74 73 20 50 74 79 20  |net Widgits Pty |
-000000d0  4c 74 64 30 1e 17 0d 31  30 30 34 32 34 30 39 30  |Ltd0...100424090|
-000000e0  39 33 38 5a 17 0d 31 31  30 34 32 34 30 39 30 39  |938Z..1104240909|
-000000f0  33 38 5a 30 45 31 0b 30  09 06 03 55 04 06 13 02  |38Z0E1.0...U....|
-00000100  41 55 31 13 30 11 06 03  55 04 08 13 0a 53 6f 6d  |AU1.0...U....Som|
-00000110  65 2d 53 74 61 74 65 31  21 30 1f 06 03 55 04 0a  |e-State1!0...U..|
-00000120  13 18 49 6e 74 65 72 6e  65 74 20 57 69 64 67 69  |..Internet Widgi|
-00000130  74 73 20 50 74 79 20 4c  74 64 30 81 9f 30 0d 06  |ts Pty Ltd0..0..|
-00000140  09 2a 86 48 86 f7 0d 01  01 01 05 00 03 81 8d 00  |.*.H............|
-00000150  30 81 89 02 81 81 00 bb  79 d6 f5 17 b5 e5 bf 46  |0.......y......F|
-00000160  10 d0 dc 69 be e6 2b 07  43 5a d0 03 2d 8a 7a 43  |...i..+.CZ..-.zC|
-00000170  85 b7 14 52 e7 a5 65 4c  2c 78 b8 23 8c b5 b4 82  |...R..eL,x.#....|
-00000180  e5 de 1f 95 3b 7e 62 a5  2c a5 33 d6 fe 12 5c 7a  |....;~b.,.3...\z|
-00000190  56 fc f5 06 bf fa 58 7b  26 3f b5 cd 04 d3 d0 c9  |V.....X{&?......|
-000001a0  21 96 4a c7 f4 54 9f 5a  bf ef 42 71 00 fe 18 99  |!.J..T.Z..Bq....|
-000001b0  07 7f 7e 88 7d 7d f1 04  39 c4 a2 2e db 51 c9 7c  |..~.}}..9....Q.||
-000001c0  e3 c0 4c 3b 32 66 01 cf  af b1 1d b8 71 9a 1d db  |..L;2f......q...|
-000001d0  db 89 6b ae da 2d 79 02  03 01 00 01 a3 81 a7 30  |..k..-y........0|
-000001e0  81 a4 30 1d 06 03 55 1d  0e 04 16 04 14 b1 ad e2  |..0...U.........|
-000001f0  85 5a cf cb 28 db 69 ce  23 69 de d3 26 8e 18 88  |.Z..(.i.#i..&...|
-00000200  39 30 75 06 03 55 1d 23  04 6e 30 6c 80 14 b1 ad  |90u..U.#.n0l....|
-00000210  e2 85 5a cf cb 28 db 69  ce 23 69 de d3 26 8e 18  |..Z..(.i.#i..&..|
-00000220  88 39 a1 49 a4 47 30 45  31 0b 30 09 06 03 55 04  |.9.I.G0E1.0...U.|
-00000230  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
-00000240  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
-00000250  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
-00000260  64 67 69 74 73 20 50 74  79 20 4c 74 64 82 09 00  |dgits Pty Ltd...|
-00000270  85 b0 bb a4 8a 7f b8 ca  30 0c 06 03 55 1d 13 04  |........0...U...|
-00000280  05 30 03 01 01 ff 30 0d  06 09 2a 86 48 86 f7 0d  |.0....0...*.H...|
-00000290  01 01 05 05 00 03 81 81  00 08 6c 45 24 c7 6b b1  |..........lE$.k.|
-000002a0  59 ab 0c 52 cc f2 b0 14  d7 87 9d 7a 64 75 b5 5a  |Y..R.......zdu.Z|
-000002b0  95 66 e4 c5 2b 8e ae 12  66 1f eb 4f 38 b3 6e 60  |.f..+...f..O8.n`|
-000002c0  d3 92 fd f7 41 08 b5 25  13 b1 18 7a 24 fb 30 1d  |....A..%...z$.0.|
-000002d0  ba ed 98 b9 17 ec e7 d7  31 59 db 95 d3 1d 78 ea  |........1Y....x.|
-000002e0  50 56 5c d5 82 5a 2d 5a  5f 33 c4 b6 d8 c9 75 90  |PV\..Z-Z_3....u.|
-000002f0  96 8c 0f 52 98 b5 cd 98  1f 89 20 5f f2 a0 1c a3  |...R...... _....|
-00000300  1b 96 94 dd a9 fd 57 e9  70 e8 26 6d 71 99 9b 26  |......W.p.&mq..&|
-00000310  6e 38 50 29 6c 90 a7 bd  d9 16 03 03 00 2e 0d 00  |n8P)l...........|
-00000320  00 26 03 01 02 40 00 1e  06 01 06 02 06 03 05 01  |.&...@..........|
-00000330  05 02 05 03 04 01 04 02  04 03 03 01 03 02 03 03  |................|
-00000340  02 01 02 02 02 03 00 00  0e 00 00 00              |............|
->>> Flow 3 (client to server)
-00000000  16 03 03 01 fb 0b 00 01  f7 00 01 f4 00 01 f1 30  |...............0|
-00000010  82 01 ed 30 82 01 58 a0  03 02 01 02 02 01 00 30  |...0..X........0|
-00000020  0b 06 09 2a 86 48 86 f7  0d 01 01 05 30 26 31 10  |...*.H......0&1.|
-00000030  30 0e 06 03 55 04 0a 13  07 41 63 6d 65 20 43 6f  |0...U....Acme Co|
-00000040  31 12 30 10 06 03 55 04  03 13 09 31 32 37 2e 30  |1.0...U....127.0|
-00000050  2e 30 2e 31 30 1e 17 0d  31 31 31 32 30 38 30 37  |.0.10...11120807|
-00000060  35 35 31 32 5a 17 0d 31  32 31 32 30 37 30 38 30  |5512Z..121207080|
-00000070  30 31 32 5a 30 26 31 10  30 0e 06 03 55 04 0a 13  |012Z0&1.0...U...|
-00000080  07 41 63 6d 65 20 43 6f  31 12 30 10 06 03 55 04  |.Acme Co1.0...U.|
-00000090  03 13 09 31 32 37 2e 30  2e 30 2e 31 30 81 9c 30  |...127.0.0.10..0|
-000000a0  0b 06 09 2a 86 48 86 f7  0d 01 01 01 03 81 8c 00  |...*.H..........|
-000000b0  30 81 88 02 81 80 4e d0  7b 31 e3 82 64 d9 59 c0  |0.....N.{1..d.Y.|
-000000c0  c2 87 a4 5e 1e 8b 73 33  c7 63 53 df 66 92 06 84  |...^..s3.cS.f...|
-000000d0  f6 64 d5 8f e4 36 a7 1d  2b e8 b3 20 36 45 23 b5  |.d...6..+.. 6E#.|
-000000e0  e3 95 ae ed e0 f5 20 9c  8d 95 df 7f 5a 12 ef 87  |...... .....Z...|
-000000f0  e4 5b 68 e4 e9 0e 74 ec  04 8a 7f de 93 27 c4 01  |.[h...t......'..|
-00000100  19 7a bd f2 dc 3d 14 ab  d0 54 ca 21 0c d0 4d 6e  |.z...=...T.!..Mn|
-00000110  87 2e 5c c5 d2 bb 4d 4b  4f ce b6 2c f7 7e 88 ec  |..\...MKO..,.~..|
-00000120  7c d7 02 91 74 a6 1e 0c  1a da e3 4a 5a 2e de 13  ||...t......JZ...|
-00000130  9c 4c 40 88 59 93 02 03  01 00 01 a3 32 30 30 30  |.L@.Y.......2000|
-00000140  0e 06 03 55 1d 0f 01 01  ff 04 04 03 02 00 a0 30  |...U...........0|
-00000150  0d 06 03 55 1d 0e 04 06  04 04 01 02 03 04 30 0f  |...U..........0.|
-00000160  06 03 55 1d 23 04 08 30  06 80 04 01 02 03 04 30  |..U.#..0.......0|
-00000170  0b 06 09 2a 86 48 86 f7  0d 01 01 05 03 81 81 00  |...*.H..........|
-00000180  36 1f b3 7a 0c 75 c9 6e  37 46 61 2b d5 bd c0 a7  |6..z.u.n7Fa+....|
-00000190  4b cc 46 9a 81 58 7c 85  79 29 c8 c8 c6 67 dd 32  |K.F..X|.y)...g.2|
-000001a0  56 45 2b 75 b6 e9 24 a9  50 9a be 1f 5a fa 1a 15  |VE+u..$.P...Z...|
-000001b0  d9 cc 55 95 72 16 83 b9  c2 b6 8f fd 88 8c 38 84  |..U.r.........8.|
-000001c0  1d ab 5d 92 31 13 4f fd  83 3b c6 9d f1 11 62 b6  |..].1.O..;....b.|
-000001d0  8b ec ab 67 be c8 64 b0  11 50 46 58 17 6b 99 1c  |...g..d..PFX.k..|
-000001e0  d3 1d fc 06 f1 0e e5 96  a8 0c f9 78 20 b7 44 18  |...........x .D.|
-000001f0  51 8d 10 7e 4f 94 67 df  a3 4e 70 73 8e 90 91 85  |Q..~O.g..Nps....|
-00000200  16 03 03 00 86 10 00 00  82 00 80 6d 51 f3 7f f9  |...........mQ...|
-00000210  3e fb 75 82 41 36 83 e8  6a ee 2a 2e 25 90 67 4c  |>.u.A6..j.*.%.gL|
-00000220  8e 62 2f 30 81 17 e0 85  09 0c 2b b7 23 d7 b0 e2  |.b/0......+.#...|
-00000230  1d f7 3b d7 f5 a1 27 b6  ee 24 b6 1b cc 5b ea 66  |..;...'..$...[.f|
-00000240  0d 6a f4 e5 85 f9 da 43  b4 0e 86 85 e1 f5 aa be  |.j.....C........|
-00000250  c8 ce 39 4c 9c 86 00 08  c2 4b e2 c6 ec 2f f7 ce  |..9L.....K.../..|
-00000260  e6 bd 77 82 6f 23 b6 e0  bd a2 92 b7 3a ac e8 56  |..w.o#......:..V|
-00000270  f1 af 54 5e 46 87 e9 3b  33 e7 b8 28 b7 d6 c8 90  |..T^F..;3..(....|
-00000280  35 d4 1c 43 d1 30 6f 55  4e 0a 70 16 03 03 00 88  |5..C.0oUN.p.....|
-00000290  0f 00 00 84 05 01 00 80  01 24 8d bb 05 61 2d 29  |.........$...a-)|
-000002a0  12 11 90 f5 57 21 be b7  29 76 55 63 94 8e 7b 4d  |....W!..)vUc..{M|
-000002b0  3b 3d 89 5b 1f b9 e1 8c  36 68 6f 31 21 50 af e4  |;=.[....6ho1!P..|
-000002c0  9f ca a5 68 55 b9 eb 36  75 3a 0c be 11 30 28 c8  |...hU..6u:...0(.|
-000002d0  8b 82 93 9a 71 37 4d 4e  4f d2 0c 2f 13 36 ad c3  |....q7MNO../.6..|
-000002e0  df 8a 1b 59 b2 f9 8b a7  74 63 75 4a f4 9d e0 6b  |...Y....tcuJ...k|
-000002f0  42 02 5a a9 6e a4 a8 24  d3 23 f7 09 ee b0 dc c4  |B.Z.n..$.#......|
-00000300  6f 87 58 72 e7 e3 87 b3  6b 15 ba 7f dd 9b 93 91  |o.Xr....k.......|
-00000310  5b 21 a0 31 31 bd 15 b5  14 03 03 00 01 01 16 03  |[!.11...........|
-00000320  03 00 24 fc 0e 7c e8 3e  8b b5 dc c9 3d 38 61 a1  |..$..|.>....=8a.|
-00000330  24 d6 77 1f 06 1f 30 32  ba dd 05 68 45 f1 4f 0d  |$.w...02...hE.O.|
-00000340  2e 24 09 ad c1 e5 b7                              |.$.....|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 24 d7 b6 b3 0a e6  |..........$.....|
-00000010  86 9a 25 e4 38 de d0 57  ff 93 0b f4 de 76 3d 00  |..%.8..W.....v=.|
-00000020  64 35 cf 70 f6 ea 74 2d  b0 71 2d 92 e2 df eb     |d5.p..t-.q-....|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 1a db bd 43  12 7c b5 83 b5 18 9d 6a  |.......C.|.....j|
-00000010  70 3f 5a eb cb d0 ba d4  03 3e a0 7b 25 f0 41 15  |p?Z......>.{%.A.|
-00000020  03 03 00 16 f8 f2 a3 27  a5 c7 25 d9 6c 08 b1 96  |.......'..%.l...|
-00000030  38 22 38 df 16 fb e2 9f  61 a3                    |8"8.....a.|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES
deleted file mode 100644
index e700e16..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES
+++ /dev/null
@@ -1,90 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 21 9b eb 15 24  |....Y...U..!...$|
-00000010  46 b6 c1 85 f5 be c5 0d  e2 6b 60 bc ee 73 b1 fb  |F........k`..s..|
-00000020  34 6f f0 b8 f0 9e 1c 26  a4 4b 0f 20 cb 2b 84 a2  |4o.....&.K. .+..|
-00000030  cb a5 48 70 fe 84 25 b0  16 20 14 a1 83 21 fc f9  |..Hp..%.. ...!..|
-00000040  82 fc 9e 1a d1 3b 56 69  ab c5 0e 2c c0 09 00 00  |.....;Vi...,....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
-00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
-00000080  30 09 06 07 2a 86 48 ce  3d 04 01 30 45 31 0b 30  |0...*.H.=..0E1.0|
-00000090  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-000000a0  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-000000b0  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-000000c0  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-000000d0  74 64 30 1e 17 0d 31 32  31 31 32 32 31 35 30 36  |td0...1211221506|
-000000e0  33 32 5a 17 0d 32 32 31  31 32 30 31 35 30 36 33  |32Z..22112015063|
-000000f0  32 5a 30 45 31 0b 30 09  06 03 55 04 06 13 02 41  |2Z0E1.0...U....A|
-00000100  55 31 13 30 11 06 03 55  04 08 13 0a 53 6f 6d 65  |U1.0...U....Some|
-00000110  2d 53 74 61 74 65 31 21  30 1f 06 03 55 04 0a 13  |-State1!0...U...|
-00000120  18 49 6e 74 65 72 6e 65  74 20 57 69 64 67 69 74  |.Internet Widgit|
-00000130  73 20 50 74 79 20 4c 74  64 30 81 9b 30 10 06 07  |s Pty Ltd0..0...|
-00000140  2a 86 48 ce 3d 02 01 06  05 2b 81 04 00 23 03 81  |*.H.=....+...#..|
-00000150  86 00 04 00 c4 a1 ed be  98 f9 0b 48 73 36 7e c3  |...........Hs6~.|
-00000160  16 56 11 22 f2 3d 53 c3  3b 4d 21 3d cd 6b 75 e6  |.V.".=S.;M!=.ku.|
-00000170  f6 b0 dc 9a df 26 c1 bc  b2 87 f0 72 32 7c b3 64  |.....&.....r2|.d|
-00000180  2f 1c 90 bc ea 68 23 10  7e fe e3 25 c0 48 3a 69  |/....h#.~..%.H:i|
-00000190  e0 28 6d d3 37 00 ef 04  62 dd 0d a0 9c 70 62 83  |.(m.7...b....pb.|
-000001a0  d8 81 d3 64 31 aa 9e 97  31 bd 96 b0 68 c0 9b 23  |...d1...1...h..#|
-000001b0  de 76 64 3f 1a 5c 7f e9  12 0e 58 58 b6 5f 70 dd  |.vd?.\....XX._p.|
-000001c0  9b d8 ea d5 d7 f5 d5 cc  b9 b6 9f 30 66 5b 66 9a  |...........0f[f.|
-000001d0  20 e2 27 e5 bf fe 3b 30  09 06 07 2a 86 48 ce 3d  | .'...;0...*.H.=|
-000001e0  04 01 03 81 8c 00 30 81  88 02 42 01 88 a2 4f eb  |......0...B...O.|
-000001f0  e2 45 c5 48 7d 1b ac f5  ed 98 9d ae 47 70 c0 5e  |.E.H}.......Gp.^|
-00000200  1b b6 2f bd f1 b6 4d b7  61 40 d3 11 a2 ce ee 0b  |../...M.a@......|
-00000210  7e 92 7e ff 76 9d c3 3b  7e a5 3f ce fa 10 e2 59  |~.~.v..;~.?....Y|
-00000220  ec 47 2d 7c ac da 4e 97  0e 15 a0 6f d0 02 42 01  |.G-|..N....o..B.|
-00000230  4d fc be 67 13 9c 2d 05  0e bd 3f a3 8c 25 c1 33  |M..g..-...?..%.3|
-00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
-00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
-00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 03 00 d8 0c 00  00 d4 03 00 17 41 04 b6  |*............A..|
-00000280  3f 37 33 68 cb 79 c0 86  f4 9d 12 ac c4 9d 8c 9b  |?73h.y..........|
-00000290  59 1c d4 a9 01 9f 2d cb  80 24 02 ec e0 ff d1 8c  |Y.....-..$......|
-000002a0  bd 82 67 3f 47 58 1a 2e  6b 61 f6 8e 4e 27 7f 49  |..g?GX..ka..N'.I|
-000002b0  b5 45 f1 0b 9a 33 ff 53  ac 65 e2 82 7a 18 5c 04  |.E...3.S.e..z.\.|
-000002c0  03 00 8b 30 81 88 02 42  00 e1 2d ff 5d e7 77 f1  |...0...B..-.].w.|
-000002d0  12 d9 e4 c2 4d cd 9c b5  ee e4 fd 21 b2 d8 53 a9  |....M......!..S.|
-000002e0  42 e7 c5 9b 51 c3 59 37  a5 08 d4 e6 29 12 c5 56  |B...Q.Y7....)..V|
-000002f0  b8 fe f0 bb 77 87 a3 ee  09 b0 8c cd 1c 39 9e b5  |....w........9..|
-00000300  d9 15 63 53 cb d7 f1 55  5b 48 02 42 01 19 10 8a  |..cS...U[H.B....|
-00000310  7a ee 95 b1 77 44 d4 a3  bf d1 f3 f1 b0 d8 c7 7e  |z...wD.........~|
-00000320  42 c0 83 04 f5 f7 9c c0  ce 6a 98 47 9d 21 29 84  |B........j.G.!).|
-00000330  c8 be 6b 67 4e fc c6 26  ec 63 df 00 33 e6 d2 f7  |..kgN..&.c..3...|
-00000340  34 93 85 9b 1b 0f e0 89  42 b6 0b 94 1b 80 16 03  |4.......B.......|
-00000350  03 00 04 0e 00 00 00                              |.......|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000010  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000020  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000030  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000040  a6 b5 68 1a 41 03 56 6b  dc 5a 89 14 03 03 00 01  |..h.A.Vk.Z......|
-00000050  01 16 03 03 00 40 00 00  00 00 00 00 00 00 00 00  |.....@..........|
-00000060  00 00 00 00 00 00 50 73  9c 9f a8 d7 78 ac 06 14  |......Ps....x...|
-00000070  8f ae fc fb ef 7d 99 db  b7 c9 91 dd f2 fe da 1b  |.....}..........|
-00000080  aa 9e 7d e4 5c 2f 5f dd  74 aa fe 03 51 e7 cd 98  |..}.\/_.t...Q...|
-00000090  e9 21 19 c9 6f 59                                 |.!..oY|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 47 18 b5 1b 75  |..........@G...u|
-00000010  b8 a3 63 ab 77 d3 47 cb  14 26 b4 88 fe 15 db 22  |..c.w.G..&....."|
-00000020  76 3b 25 d3 68 8e f2 a7  d5 03 2b 82 7b b1 0f 10  |v;%.h.....+.{...|
-00000030  49 6a 3d 95 d0 4b 55 0e  14 eb bb a7 34 bb 57 b3  |Ij=..KU.....4.W.|
-00000040  5d fb 7e 15 80 5a fa f3  3a df 90                 |].~..Z..:..|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000010  00 00 00 00 00 70 74 e2  60 fc 3a 7a b7 5e 16 07  |.....pt.`.:z.^..|
-00000020  22 92 07 fe 92 53 c4 43  1b 8f 94 07 84 48 2b 50  |"....S.C.....H+P|
-00000030  ab 1d 6d 49 ed 15 03 03  00 30 00 00 00 00 00 00  |..mI.....0......|
-00000040  00 00 00 00 00 00 00 00  00 00 ce a8 ba 91 0b e4  |................|
-00000050  8c 38 23 9b 8b 2c 0a 0c  63 79 61 f4 b6 25 f7 41  |.8#..,..cya..%.A|
-00000060  04 9f b0 8f e0 e5 24 44  2f e9                    |......$D/.|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES-GCM b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES-GCM
deleted file mode 100644
index 607ecdc..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES-GCM
+++ /dev/null
@@ -1,85 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 91 8a 4f 94 29  |....Y...U....O.)|
-00000010  32 fa 66 7a 7f b8 a7 04  5c 34 b9 7e 12 83 35 1f  |2.fz....\4.~..5.|
-00000020  93 b0 af e0 9f 71 07 5e  2f d7 ca 20 52 dc 0d e7  |.....q.^/.. R...|
-00000030  f8 16 db 90 9a 78 2f 03  0b f0 ae a7 2f c6 b4 4c  |.....x/...../..L|
-00000040  62 e7 de 32 d5 68 61 f3  07 e4 60 d2 c0 2b 00 00  |b..2.ha...`..+..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
-00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
-00000080  30 09 06 07 2a 86 48 ce  3d 04 01 30 45 31 0b 30  |0...*.H.=..0E1.0|
-00000090  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-000000a0  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-000000b0  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-000000c0  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-000000d0  74 64 30 1e 17 0d 31 32  31 31 32 32 31 35 30 36  |td0...1211221506|
-000000e0  33 32 5a 17 0d 32 32 31  31 32 30 31 35 30 36 33  |32Z..22112015063|
-000000f0  32 5a 30 45 31 0b 30 09  06 03 55 04 06 13 02 41  |2Z0E1.0...U....A|
-00000100  55 31 13 30 11 06 03 55  04 08 13 0a 53 6f 6d 65  |U1.0...U....Some|
-00000110  2d 53 74 61 74 65 31 21  30 1f 06 03 55 04 0a 13  |-State1!0...U...|
-00000120  18 49 6e 74 65 72 6e 65  74 20 57 69 64 67 69 74  |.Internet Widgit|
-00000130  73 20 50 74 79 20 4c 74  64 30 81 9b 30 10 06 07  |s Pty Ltd0..0...|
-00000140  2a 86 48 ce 3d 02 01 06  05 2b 81 04 00 23 03 81  |*.H.=....+...#..|
-00000150  86 00 04 00 c4 a1 ed be  98 f9 0b 48 73 36 7e c3  |...........Hs6~.|
-00000160  16 56 11 22 f2 3d 53 c3  3b 4d 21 3d cd 6b 75 e6  |.V.".=S.;M!=.ku.|
-00000170  f6 b0 dc 9a df 26 c1 bc  b2 87 f0 72 32 7c b3 64  |.....&.....r2|.d|
-00000180  2f 1c 90 bc ea 68 23 10  7e fe e3 25 c0 48 3a 69  |/....h#.~..%.H:i|
-00000190  e0 28 6d d3 37 00 ef 04  62 dd 0d a0 9c 70 62 83  |.(m.7...b....pb.|
-000001a0  d8 81 d3 64 31 aa 9e 97  31 bd 96 b0 68 c0 9b 23  |...d1...1...h..#|
-000001b0  de 76 64 3f 1a 5c 7f e9  12 0e 58 58 b6 5f 70 dd  |.vd?.\....XX._p.|
-000001c0  9b d8 ea d5 d7 f5 d5 cc  b9 b6 9f 30 66 5b 66 9a  |...........0f[f.|
-000001d0  20 e2 27 e5 bf fe 3b 30  09 06 07 2a 86 48 ce 3d  | .'...;0...*.H.=|
-000001e0  04 01 03 81 8c 00 30 81  88 02 42 01 88 a2 4f eb  |......0...B...O.|
-000001f0  e2 45 c5 48 7d 1b ac f5  ed 98 9d ae 47 70 c0 5e  |.E.H}.......Gp.^|
-00000200  1b b6 2f bd f1 b6 4d b7  61 40 d3 11 a2 ce ee 0b  |../...M.a@......|
-00000210  7e 92 7e ff 76 9d c3 3b  7e a5 3f ce fa 10 e2 59  |~.~.v..;~.?....Y|
-00000220  ec 47 2d 7c ac da 4e 97  0e 15 a0 6f d0 02 42 01  |.G-|..N....o..B.|
-00000230  4d fc be 67 13 9c 2d 05  0e bd 3f a3 8c 25 c1 33  |M..g..-...?..%.3|
-00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
-00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
-00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 03 00 d8 0c 00  00 d4 03 00 17 41 04 26  |*............A.&|
-00000280  c1 67 14 4b 9e b0 45 8c  27 bf a3 a2 78 5b 56 ad  |.g.K..E.'...x[V.|
-00000290  d1 21 56 53 df 86 e9 91  de e3 f9 5d e6 f6 5d 79  |.!VS.......]..]y|
-000002a0  11 8b 60 f9 c2 9a c6 3f  6b 72 cd 7c d7 0e 13 64  |..`....?kr.|...d|
-000002b0  af e8 9f 40 35 e6 fb 04  0c 60 aa 19 61 dd 24 04  |...@5....`..a.$.|
-000002c0  03 00 8b 30 81 88 02 42  00 9d e1 02 5d 8b b1 45  |...0...B....]..E|
-000002d0  e5 c7 b6 94 27 df 36 31  fd 5e 47 fe c8 0f 5f 17  |....'.61.^G..._.|
-000002e0  b1 92 56 76 29 45 3d 90  be 91 6e 2c a7 b2 e1 33  |..Vv)E=...n,...3|
-000002f0  3b f9 3c bb 80 58 c2 d8  a8 59 82 16 dc 9e dd 60  |;.<..X...Y.....`|
-00000300  ff 82 b9 0c 5a ca ff f3  02 2c 02 42 00 a4 c0 d3  |....Z....,.B....|
-00000310  aa 1d 69 52 c0 06 fa 93  e8 50 da a4 2f 72 c9 4a  |..iR.....P../r.J|
-00000320  2c 43 7f 95 05 f7 7a f3  4a 2e 2d ce 13 be 80 40  |,C....z.J.-....@|
-00000330  a4 3b b2 f0 73 8d f1 d4  7b a3 ff 01 e1 58 71 31  |.;..s...{....Xq1|
-00000340  fc d8 2f b3 ef 62 2e b7  ac f5 c4 bc b8 68 16 03  |../..b.......h..|
-00000350  03 00 04 0e 00 00 00                              |.......|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000010  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000020  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000030  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000040  a6 b5 68 1a 41 03 56 6b  dc 5a 89 14 03 03 00 01  |..h.A.Vk.Z......|
-00000050  01 16 03 03 00 28 00 00  00 00 00 00 00 00 83 cf  |.....(..........|
-00000060  ef 50 c2 e7 da b9 74 7f  1c e0 b8 fb dc 39 c9 98  |.P....t......9..|
-00000070  0c a3 7d 8c c6 fa 6f f2  ee 44 a0 a0 03 18        |..}...o..D....|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 73 c4 48 24 3d  |..........(s.H$=|
-00000010  8f 5f f3 8c fc fd 63 be  64 39 d5 56 67 bd d7 c4  |._....c.d9.Vg...|
-00000020  0d 57 88 1a 45 a6 f3 ad  11 b2 5a 41 58 33 f3 d3  |.W..E.....ZAX3..|
-00000030  58 fa 21                                          |X.!|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 65 5e 55  |.............e^U|
-00000010  32 be 00 77 6e 1d 8e 8f  95 33 24 3d 7a c2 b0 3f  |2..wn....3$=z..?|
-00000020  ca aa 97 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
-00000030  b2 71 6e 42 6a 0d cf c9  ac 14 a4 b5 9c c9 71 60  |.qnBj.........q`|
-00000040  d7 c2                                             |..|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES256-GCM-SHA384 b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES256-GCM-SHA384
deleted file mode 100644
index df2f737..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-ECDSA-AES256-GCM-SHA384
+++ /dev/null
@@ -1,85 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 11 50 81 a7 ef  |....Y...U...P...|
-00000010  3f bd a5 a9 41 11 e6 86  b2 a3 d8 bf 29 c3 d4 f4  |?...A.......)...|
-00000020  b6 20 2d cb 94 1b 0e dd  99 d1 0b 20 78 92 23 31  |. -........ x.#1|
-00000030  e3 fc 99 67 1f fd f3 2a  fc 9c 4c 74 6e 32 e4 f8  |...g...*..Ltn2..|
-00000040  ed 6d 2e 6d ad a9 a9 bf  63 27 7e 44 c0 2c 00 00  |.m.m....c'~D.,..|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 0e 0b 00 02 0a 00  02 07 00 02 04 30 82 02  |.............0..|
-00000070  00 30 82 01 62 02 09 00  b8 bf 2d 47 a0 d2 eb f4  |.0..b.....-G....|
-00000080  30 09 06 07 2a 86 48 ce  3d 04 01 30 45 31 0b 30  |0...*.H.=..0E1.0|
-00000090  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-000000a0  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-000000b0  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-000000c0  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-000000d0  74 64 30 1e 17 0d 31 32  31 31 32 32 31 35 30 36  |td0...1211221506|
-000000e0  33 32 5a 17 0d 32 32 31  31 32 30 31 35 30 36 33  |32Z..22112015063|
-000000f0  32 5a 30 45 31 0b 30 09  06 03 55 04 06 13 02 41  |2Z0E1.0...U....A|
-00000100  55 31 13 30 11 06 03 55  04 08 13 0a 53 6f 6d 65  |U1.0...U....Some|
-00000110  2d 53 74 61 74 65 31 21  30 1f 06 03 55 04 0a 13  |-State1!0...U...|
-00000120  18 49 6e 74 65 72 6e 65  74 20 57 69 64 67 69 74  |.Internet Widgit|
-00000130  73 20 50 74 79 20 4c 74  64 30 81 9b 30 10 06 07  |s Pty Ltd0..0...|
-00000140  2a 86 48 ce 3d 02 01 06  05 2b 81 04 00 23 03 81  |*.H.=....+...#..|
-00000150  86 00 04 00 c4 a1 ed be  98 f9 0b 48 73 36 7e c3  |...........Hs6~.|
-00000160  16 56 11 22 f2 3d 53 c3  3b 4d 21 3d cd 6b 75 e6  |.V.".=S.;M!=.ku.|
-00000170  f6 b0 dc 9a df 26 c1 bc  b2 87 f0 72 32 7c b3 64  |.....&.....r2|.d|
-00000180  2f 1c 90 bc ea 68 23 10  7e fe e3 25 c0 48 3a 69  |/....h#.~..%.H:i|
-00000190  e0 28 6d d3 37 00 ef 04  62 dd 0d a0 9c 70 62 83  |.(m.7...b....pb.|
-000001a0  d8 81 d3 64 31 aa 9e 97  31 bd 96 b0 68 c0 9b 23  |...d1...1...h..#|
-000001b0  de 76 64 3f 1a 5c 7f e9  12 0e 58 58 b6 5f 70 dd  |.vd?.\....XX._p.|
-000001c0  9b d8 ea d5 d7 f5 d5 cc  b9 b6 9f 30 66 5b 66 9a  |...........0f[f.|
-000001d0  20 e2 27 e5 bf fe 3b 30  09 06 07 2a 86 48 ce 3d  | .'...;0...*.H.=|
-000001e0  04 01 03 81 8c 00 30 81  88 02 42 01 88 a2 4f eb  |......0...B...O.|
-000001f0  e2 45 c5 48 7d 1b ac f5  ed 98 9d ae 47 70 c0 5e  |.E.H}.......Gp.^|
-00000200  1b b6 2f bd f1 b6 4d b7  61 40 d3 11 a2 ce ee 0b  |../...M.a@......|
-00000210  7e 92 7e ff 76 9d c3 3b  7e a5 3f ce fa 10 e2 59  |~.~.v..;~.?....Y|
-00000220  ec 47 2d 7c ac da 4e 97  0e 15 a0 6f d0 02 42 01  |.G-|..N....o..B.|
-00000230  4d fc be 67 13 9c 2d 05  0e bd 3f a3 8c 25 c1 33  |M..g..-...?..%.3|
-00000240  13 83 0d 94 06 bb d4 37  7a f6 ec 7a c9 86 2e dd  |.......7z..z....|
-00000250  d7 11 69 7f 85 7c 56 de  fb 31 78 2b e4 c7 78 0d  |..i..|V..1x+..x.|
-00000260  ae cb be 9e 4e 36 24 31  7b 6a 0f 39 95 12 07 8f  |....N6$1{j.9....|
-00000270  2a 16 03 03 00 d7 0c 00  00 d3 03 00 17 41 04 fc  |*............A..|
-00000280  e6 25 27 3c 76 10 a8 9e  d3 a4 a8 68 31 06 85 fc  |.%'<v......h1...|
-00000290  35 2a 76 b3 ad 08 c5 70  ed 3d 61 e0 29 cc 47 52  |5*v....p.=a.).GR|
-000002a0  68 21 ab 48 19 f9 28 ba  54 8c 56 8e b0 7d 55 7f  |h!.H..(.T.V..}U.|
-000002b0  75 f5 42 38 61 ff e2 06  98 1a ae fc bc a0 3a 04  |u.B8a.........:.|
-000002c0  03 00 8a 30 81 87 02 42  01 0c b2 7f c9 d3 1b 83  |...0...B........|
-000002d0  1e 24 a3 d7 1c 81 f0 02  ae ed 42 6f e9 d9 91 4d  |.$........Bo...M|
-000002e0  16 5f aa 8e 5a de 3b 00  0e e6 2d fb 05 30 f3 cf  |._..Z.;...-..0..|
-000002f0  31 a2 ec 99 87 ea 42 03  0a 57 82 e5 12 27 98 8a  |1.....B..W...'..|
-00000300  c6 56 4b 9a 0b d7 37 5f  46 50 02 41 57 61 13 3c  |.VK...7_FP.AWa.<|
-00000310  48 d0 b3 b0 d5 21 72 49  80 7b d7 ef 8f 0d a0 c5  |H....!rI.{......|
-00000320  88 a1 5d ca 61 6d fb 8b  51 15 5d e5 a2 61 c4 78  |..].am..Q.]..a.x|
-00000330  8f d9 e3 78 df 7d a0 8f  0c c0 cc 18 36 41 e6 bb  |...x.}......6A..|
-00000340  6d e3 9d 04 c2 c4 d0 66  35 45 9a 08 b2 16 03 03  |m......f5E......|
-00000350  00 04 0e 00 00 00                                 |......|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000010  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000020  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000030  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000040  a6 b5 68 1a 41 03 56 6b  dc 5a 89 14 03 03 00 01  |..h.A.Vk.Z......|
-00000050  01 16 03 03 00 28 00 00  00 00 00 00 00 00 a3 3f  |.....(.........?|
-00000060  be 65 91 cd fe 37 43 e0  ea 6f 15 9d c2 aa 6a 02  |.e...7C..o....j.|
-00000070  20 b8 bc b5 c8 9a 1c d4  c4 e5 9b 2e 39 e7        | ...........9.|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 7c b7 1f 13 9e  |..........(|....|
-00000010  21 d2 eb db 32 fc 36 d0  53 e1 11 04 ce d0 61 33  |!...2.6.S.....a3|
-00000020  1e 30 3d 91 c3 6a 0d 98  55 f5 e0 5c ca 77 fa 72  |.0=..j..U..\.w.r|
-00000030  63 6a be                                          |cj.|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 d9 db db  |................|
-00000010  4b 3a ae 5c a4 dc 96 33  ed b5 a0 70 64 1f 96 2f  |K:.\...3...pd../|
-00000020  b6 cd 1e 15 03 03 00 1a  00 00 00 00 00 00 00 02  |................|
-00000030  18 a0 d1 98 a6 71 c9 56  36 bd 1a 46 4b 5b 45 29  |.....q.V6..FK[E)|
-00000040  1f dd                                             |..|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-AES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-AES
deleted file mode 100644
index 994ebb1..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-ECDHE-RSA-AES
+++ /dev/null
@@ -1,100 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 59 02 00 00  55 03 03 e6 ae 89 0d 22  |....Y...U......"|
-00000010  e5 e0 cd 57 a3 ca 71 4f  17 2f 64 77 f8 30 89 ef  |...W..qO./dw.0..|
-00000020  e8 19 70 ac dd 2c c5 9f  84 7d 1d 20 1c 59 3c fe  |..p..,...}. .Y<.|
-00000030  a9 ec 10 dd 38 3b 43 fe  6b 09 e5 e4 83 d9 7a 78  |....8;C.k.....zx|
-00000040  86 08 33 da 9b e1 09 d8  c9 07 34 19 c0 13 00 00  |..3.......4.....|
-00000050  0d ff 01 00 01 00 00 0b  00 04 03 00 01 02 16 03  |................|
-00000060  03 02 be 0b 00 02 ba 00  02 b7 00 02 b4 30 82 02  |.............0..|
-00000070  b0 30 82 02 19 a0 03 02  01 02 02 09 00 85 b0 bb  |.0..............|
-00000080  a4 8a 7f b8 ca 30 0d 06  09 2a 86 48 86 f7 0d 01  |.....0...*.H....|
-00000090  01 05 05 00 30 45 31 0b  30 09 06 03 55 04 06 13  |....0E1.0...U...|
-000000a0  02 41 55 31 13 30 11 06  03 55 04 08 13 0a 53 6f  |.AU1.0...U....So|
-000000b0  6d 65 2d 53 74 61 74 65  31 21 30 1f 06 03 55 04  |me-State1!0...U.|
-000000c0  0a 13 18 49 6e 74 65 72  6e 65 74 20 57 69 64 67  |...Internet Widg|
-000000d0  69 74 73 20 50 74 79 20  4c 74 64 30 1e 17 0d 31  |its Pty Ltd0...1|
-000000e0  30 30 34 32 34 30 39 30  39 33 38 5a 17 0d 31 31  |00424090938Z..11|
-000000f0  30 34 32 34 30 39 30 39  33 38 5a 30 45 31 0b 30  |0424090938Z0E1.0|
-00000100  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-00000110  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-00000120  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-00000130  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-00000140  74 64 30 81 9f 30 0d 06  09 2a 86 48 86 f7 0d 01  |td0..0...*.H....|
-00000150  01 01 05 00 03 81 8d 00  30 81 89 02 81 81 00 bb  |........0.......|
-00000160  79 d6 f5 17 b5 e5 bf 46  10 d0 dc 69 be e6 2b 07  |y......F...i..+.|
-00000170  43 5a d0 03 2d 8a 7a 43  85 b7 14 52 e7 a5 65 4c  |CZ..-.zC...R..eL|
-00000180  2c 78 b8 23 8c b5 b4 82  e5 de 1f 95 3b 7e 62 a5  |,x.#........;~b.|
-00000190  2c a5 33 d6 fe 12 5c 7a  56 fc f5 06 bf fa 58 7b  |,.3...\zV.....X{|
-000001a0  26 3f b5 cd 04 d3 d0 c9  21 96 4a c7 f4 54 9f 5a  |&?......!.J..T.Z|
-000001b0  bf ef 42 71 00 fe 18 99  07 7f 7e 88 7d 7d f1 04  |..Bq......~.}}..|
-000001c0  39 c4 a2 2e db 51 c9 7c  e3 c0 4c 3b 32 66 01 cf  |9....Q.|..L;2f..|
-000001d0  af b1 1d b8 71 9a 1d db  db 89 6b ae da 2d 79 02  |....q.....k..-y.|
-000001e0  03 01 00 01 a3 81 a7 30  81 a4 30 1d 06 03 55 1d  |.......0..0...U.|
-000001f0  0e 04 16 04 14 b1 ad e2  85 5a cf cb 28 db 69 ce  |.........Z..(.i.|
-00000200  23 69 de d3 26 8e 18 88  39 30 75 06 03 55 1d 23  |#i..&...90u..U.#|
-00000210  04 6e 30 6c 80 14 b1 ad  e2 85 5a cf cb 28 db 69  |.n0l......Z..(.i|
-00000220  ce 23 69 de d3 26 8e 18  88 39 a1 49 a4 47 30 45  |.#i..&...9.I.G0E|
-00000230  31 0b 30 09 06 03 55 04  06 13 02 41 55 31 13 30  |1.0...U....AU1.0|
-00000240  11 06 03 55 04 08 13 0a  53 6f 6d 65 2d 53 74 61  |...U....Some-Sta|
-00000250  74 65 31 21 30 1f 06 03  55 04 0a 13 18 49 6e 74  |te1!0...U....Int|
-00000260  65 72 6e 65 74 20 57 69  64 67 69 74 73 20 50 74  |ernet Widgits Pt|
-00000270  79 20 4c 74 64 82 09 00  85 b0 bb a4 8a 7f b8 ca  |y Ltd...........|
-00000280  30 0c 06 03 55 1d 13 04  05 30 03 01 01 ff 30 0d  |0...U....0....0.|
-00000290  06 09 2a 86 48 86 f7 0d  01 01 05 05 00 03 81 81  |..*.H...........|
-000002a0  00 08 6c 45 24 c7 6b b1  59 ab 0c 52 cc f2 b0 14  |..lE$.k.Y..R....|
-000002b0  d7 87 9d 7a 64 75 b5 5a  95 66 e4 c5 2b 8e ae 12  |...zdu.Z.f..+...|
-000002c0  66 1f eb 4f 38 b3 6e 60  d3 92 fd f7 41 08 b5 25  |f..O8.n`....A..%|
-000002d0  13 b1 18 7a 24 fb 30 1d  ba ed 98 b9 17 ec e7 d7  |...z$.0.........|
-000002e0  31 59 db 95 d3 1d 78 ea  50 56 5c d5 82 5a 2d 5a  |1Y....x.PV\..Z-Z|
-000002f0  5f 33 c4 b6 d8 c9 75 90  96 8c 0f 52 98 b5 cd 98  |_3....u....R....|
-00000300  1f 89 20 5f f2 a0 1c a3  1b 96 94 dd a9 fd 57 e9  |.. _..........W.|
-00000310  70 e8 26 6d 71 99 9b 26  6e 38 50 29 6c 90 a7 bd  |p.&mq..&n8P)l...|
-00000320  d9 16 03 03 00 cd 0c 00  00 c9 03 00 17 41 04 77  |.............A.w|
-00000330  87 a7 ad f6 f8 34 82 05  ef bb 14 6d c7 8b 7b 2a  |.....4.....m..{*|
-00000340  4d ca 41 65 58 3c 83 fa  4d ce 0c 74 46 85 fe 38  |M.AeX<..M..tF..8|
-00000350  95 80 ee 7c c2 bf f2 be  a3 c6 bf f3 aa 07 23 40  |...|..........#@|
-00000360  7e cc 74 4a 4e 2e 69 af  6b e0 42 8a fc 41 be 04  |~.tJN.i.k.B..A..|
-00000370  01 00 80 99 ed a8 3a ef  93 1b 4c 17 80 9e cc eb  |......:...L.....|
-00000380  da 39 fb c8 9a 73 e1 96  20 3e 41 fa 8b 1a b1 68  |.9...s.. >A....h|
-00000390  cd 47 bc 4b 7b 0c 14 da  87 d3 36 09 5e 37 33 88  |.G.K{.....6.^73.|
-000003a0  7f 88 07 87 46 ec e5 72  a8 59 92 07 fa 4d 02 dc  |....F..r.Y...M..|
-000003b0  bf 3a f5 e4 77 0b a6 85  ce 43 ee 1b 90 30 7f ec  |.:..w....C...0..|
-000003c0  88 79 f8 88 59 af 6b 7f  2d 88 de 92 cd c8 36 cf  |.y..Y.k.-.....6.|
-000003d0  ba b9 08 6a c4 3d d7 9a  48 50 e1 67 d0 62 a5 b3  |...j.=..HP.g.b..|
-000003e0  b0 5f 2e 16 ee 4d 7d a2  cf d9 93 19 89 b7 64 0f  |._...M}.......d.|
-000003f0  0f 8e 3d 16 03 03 00 04  0e 00 00 00              |..=.........|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000010  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000020  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000030  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000040  a6 b5 68 1a 41 03 56 6b  dc 5a 89 14 03 03 00 01  |..h.A.Vk.Z......|
-00000050  01 16 03 03 00 40 00 00  00 00 00 00 00 00 00 00  |.....@..........|
-00000060  00 00 00 00 00 00 f2 20  58 ec f1 88 a6 26 79 9d  |....... X....&y.|
-00000070  2e 9b 02 b5 5e da e2 c1  c5 8d c8 93 6f 6d 07 4e  |....^.......om.N|
-00000080  fa dd ee cb b1 ae c7 3b  09 b2 cc 64 7a cd 98 91  |.......;...dz...|
-00000090  cb f8 3c 34 3b ed                                 |..<4;.|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 4c a1 8d bd 49  |..........@L...I|
-00000010  33 d3 72 fb 2f 23 7e 11  29 fc d2 ff 9b 67 30 c8  |3.r./#~.)....g0.|
-00000020  be c1 bc 51 6e 92 a5 f4  9d e3 b3 f9 d2 d4 c4 a5  |...Qn...........|
-00000030  83 23 90 b3 17 00 35 18  c5 ef 8b 18 a3 cf ed 9d  |.#....5.........|
-00000040  a9 52 c9 11 0a c9 55 c2  76 df 78                 |.R....U.v.x|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-00000010  00 00 00 00 00 60 40 d0  bf 8f ef 05 2b 89 d7 bb  |.....`@.....+...|
-00000020  27 d0 1f b2 cf c3 ff 8e  be 69 16 a9 b3 03 e8 3c  |'........i.....<|
-00000030  30 1d 58 39 4a 15 03 03  00 30 00 00 00 00 00 00  |0.X9J....0......|
-00000040  00 00 00 00 00 00 00 00  00 00 de 61 51 a1 3c fc  |...........aQ.<.|
-00000050  1c 7b e6 f2 7d e0 aa 80  2d 9c e9 22 09 5c dd 8a  |.{..}...-..".\..|
-00000060  55 cc c4 77 34 97 05 88  98 d3                    |U..w4.....|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-RSA-RC4 b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-RSA-RC4
deleted file mode 100644
index 73e34c0..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-RSA-RC4
+++ /dev/null
@@ -1,84 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 51 02 00 00  4d 03 03 e8 ae 4c 97 41  |....Q...M....L.A|
-00000010  78 0f 08 84 d4 4a 80 6d  a2 e1 d0 67 40 8f 01 8b  |x....J.m...g@...|
-00000020  20 54 cb 28 16 52 04 fd  3c c2 84 20 30 96 f0 51  | T.(.R..<.. 0..Q|
-00000030  72 86 6a d8 47 b9 47 e3  a4 ad 97 77 a9 77 1a f9  |r.j.G.G....w.w..|
-00000040  ba 63 33 32 4f 43 09 1c  e1 bd 1b 3b 00 05 00 00  |.c32OC.....;....|
-00000050  05 ff 01 00 01 00 16 03  03 02 be 0b 00 02 ba 00  |................|
-00000060  02 b7 00 02 b4 30 82 02  b0 30 82 02 19 a0 03 02  |.....0...0......|
-00000070  01 02 02 09 00 85 b0 bb  a4 8a 7f b8 ca 30 0d 06  |.............0..|
-00000080  09 2a 86 48 86 f7 0d 01  01 05 05 00 30 45 31 0b  |.*.H........0E1.|
-00000090  30 09 06 03 55 04 06 13  02 41 55 31 13 30 11 06  |0...U....AU1.0..|
-000000a0  03 55 04 08 13 0a 53 6f  6d 65 2d 53 74 61 74 65  |.U....Some-State|
-000000b0  31 21 30 1f 06 03 55 04  0a 13 18 49 6e 74 65 72  |1!0...U....Inter|
-000000c0  6e 65 74 20 57 69 64 67  69 74 73 20 50 74 79 20  |net Widgits Pty |
-000000d0  4c 74 64 30 1e 17 0d 31  30 30 34 32 34 30 39 30  |Ltd0...100424090|
-000000e0  39 33 38 5a 17 0d 31 31  30 34 32 34 30 39 30 39  |938Z..1104240909|
-000000f0  33 38 5a 30 45 31 0b 30  09 06 03 55 04 06 13 02  |38Z0E1.0...U....|
-00000100  41 55 31 13 30 11 06 03  55 04 08 13 0a 53 6f 6d  |AU1.0...U....Som|
-00000110  65 2d 53 74 61 74 65 31  21 30 1f 06 03 55 04 0a  |e-State1!0...U..|
-00000120  13 18 49 6e 74 65 72 6e  65 74 20 57 69 64 67 69  |..Internet Widgi|
-00000130  74 73 20 50 74 79 20 4c  74 64 30 81 9f 30 0d 06  |ts Pty Ltd0..0..|
-00000140  09 2a 86 48 86 f7 0d 01  01 01 05 00 03 81 8d 00  |.*.H............|
-00000150  30 81 89 02 81 81 00 bb  79 d6 f5 17 b5 e5 bf 46  |0.......y......F|
-00000160  10 d0 dc 69 be e6 2b 07  43 5a d0 03 2d 8a 7a 43  |...i..+.CZ..-.zC|
-00000170  85 b7 14 52 e7 a5 65 4c  2c 78 b8 23 8c b5 b4 82  |...R..eL,x.#....|
-00000180  e5 de 1f 95 3b 7e 62 a5  2c a5 33 d6 fe 12 5c 7a  |....;~b.,.3...\z|
-00000190  56 fc f5 06 bf fa 58 7b  26 3f b5 cd 04 d3 d0 c9  |V.....X{&?......|
-000001a0  21 96 4a c7 f4 54 9f 5a  bf ef 42 71 00 fe 18 99  |!.J..T.Z..Bq....|
-000001b0  07 7f 7e 88 7d 7d f1 04  39 c4 a2 2e db 51 c9 7c  |..~.}}..9....Q.||
-000001c0  e3 c0 4c 3b 32 66 01 cf  af b1 1d b8 71 9a 1d db  |..L;2f......q...|
-000001d0  db 89 6b ae da 2d 79 02  03 01 00 01 a3 81 a7 30  |..k..-y........0|
-000001e0  81 a4 30 1d 06 03 55 1d  0e 04 16 04 14 b1 ad e2  |..0...U.........|
-000001f0  85 5a cf cb 28 db 69 ce  23 69 de d3 26 8e 18 88  |.Z..(.i.#i..&...|
-00000200  39 30 75 06 03 55 1d 23  04 6e 30 6c 80 14 b1 ad  |90u..U.#.n0l....|
-00000210  e2 85 5a cf cb 28 db 69  ce 23 69 de d3 26 8e 18  |..Z..(.i.#i..&..|
-00000220  88 39 a1 49 a4 47 30 45  31 0b 30 09 06 03 55 04  |.9.I.G0E1.0...U.|
-00000230  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
-00000240  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
-00000250  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
-00000260  64 67 69 74 73 20 50 74  79 20 4c 74 64 82 09 00  |dgits Pty Ltd...|
-00000270  85 b0 bb a4 8a 7f b8 ca  30 0c 06 03 55 1d 13 04  |........0...U...|
-00000280  05 30 03 01 01 ff 30 0d  06 09 2a 86 48 86 f7 0d  |.0....0...*.H...|
-00000290  01 01 05 05 00 03 81 81  00 08 6c 45 24 c7 6b b1  |..........lE$.k.|
-000002a0  59 ab 0c 52 cc f2 b0 14  d7 87 9d 7a 64 75 b5 5a  |Y..R.......zdu.Z|
-000002b0  95 66 e4 c5 2b 8e ae 12  66 1f eb 4f 38 b3 6e 60  |.f..+...f..O8.n`|
-000002c0  d3 92 fd f7 41 08 b5 25  13 b1 18 7a 24 fb 30 1d  |....A..%...z$.0.|
-000002d0  ba ed 98 b9 17 ec e7 d7  31 59 db 95 d3 1d 78 ea  |........1Y....x.|
-000002e0  50 56 5c d5 82 5a 2d 5a  5f 33 c4 b6 d8 c9 75 90  |PV\..Z-Z_3....u.|
-000002f0  96 8c 0f 52 98 b5 cd 98  1f 89 20 5f f2 a0 1c a3  |...R...... _....|
-00000300  1b 96 94 dd a9 fd 57 e9  70 e8 26 6d 71 99 9b 26  |......W.p.&mq..&|
-00000310  6e 38 50 29 6c 90 a7 bd  d9 16 03 03 00 04 0e 00  |n8P)l...........|
-00000320  00 00                                             |..|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 6d 51 f3 7f f9  |...........mQ...|
-00000010  3e fb 75 82 41 36 83 e8  6a ee 2a 2e 25 90 67 4c  |>.u.A6..j.*.%.gL|
-00000020  8e 62 2f 30 81 17 e0 85  09 0c 2b b7 23 d7 b0 e2  |.b/0......+.#...|
-00000030  1d f7 3b d7 f5 a1 27 b6  ee 24 b6 1b cc 5b ea 66  |..;...'..$...[.f|
-00000040  0d 6a f4 e5 85 f9 da 43  b4 0e 86 85 e1 f5 aa be  |.j.....C........|
-00000050  c8 ce 39 4c 9c 86 00 08  c2 4b e2 c6 ec 2f f7 ce  |..9L.....K.../..|
-00000060  e6 bd 77 82 6f 23 b6 e0  bd a2 92 b7 3a ac e8 56  |..w.o#......:..V|
-00000070  f1 af 54 5e 46 87 e9 3b  33 e7 b8 28 b7 d6 c8 90  |..T^F..;3..(....|
-00000080  35 d4 1c 43 d1 30 6f 55  4e 0a 70 14 03 03 00 01  |5..C.0oUN.p.....|
-00000090  01 16 03 03 00 24 54 8c  7f 71 03 7c 98 e5 97 65  |.....$T..q.|...e|
-000000a0  51 13 b2 9d 4a b8 c9 c1  e6 11 1b 50 c8 1b c0 46  |Q...J......P...F|
-000000b0  a7 cb 13 97 92 a0 51 d4  a9 e5                    |......Q...|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 24 37 ca ae 55 79  |..........$7..Uy|
-00000010  e7 0a 70 55 1e d1 76 61  57 46 d2 c0 d0 ed 3d 70  |..pU..vaWF....=p|
-00000020  1f 02 f2 06 5b 3e 50 ec  13 4b 67 e2 7c bd 45     |....[>P..Kg.|.E|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 1a c4 13 68  ec e0 38 a1 07 35 da d7  |.......h..8..5..|
-00000010  c4 6b f9 5c ed a7 8a cb  96 7a 22 7c ca a5 30 15  |.k.\.....z"|..0.|
-00000020  03 03 00 16 f7 a7 8d 41  b0 c1 4b 61 60 b0 b2 ed  |.......A..Ka`...|
-00000030  4a ab c3 54 d5 20 eb 67  b7 8f                    |J..T. .g..|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-SCT b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-SCT
deleted file mode 100644
index 826c9f0..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Client-TLSv12-SCT
+++ /dev/null
@@ -1,118 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 81 01 00 00  7d 03 03 00 00 00 00 00  |........}.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 1e c0 2f  |.............../|
-00000030  c0 2b c0 30 c0 2c c0 11  c0 07 c0 13 c0 09 c0 14  |.+.0.,..........|
-00000040  c0 0a 00 05 00 2f 00 35  c0 12 00 0a 01 00 00 36  |...../.5.......6|
-00000050  00 05 00 05 01 00 00 00  00 00 0a 00 08 00 06 00  |................|
-00000060  17 00 18 00 19 00 0b 00  02 01 00 00 0d 00 0e 00  |................|
-00000070  0c 04 01 04 03 05 01 05  03 02 01 02 03 ff 01 00  |................|
-00000080  01 00 00 12 00 00                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 03 01 c6 02 00 01  c2 03 03 1b f6 69 c1 c2  |.............i..|
-00000010  36 77 72 32 69 95 c9 e7  db 9b 5d bd 59 ba 08 02  |6wr2i.....].Y...|
-00000020  1e 76 11 c4 8e 49 08 22  8e 8a 5a 20 44 ec d9 13  |.v...I."..Z D...|
-00000030  23 ad 05 45 48 29 00 c6  11 3d 5a 5c a1 ee 34 2b  |#..EH)...=Z\..4+|
-00000040  58 ef 34 5b 7e 42 08 84  23 66 56 ee c0 2f 00 01  |X.4[~B..#fV../..|
-00000050  7a ff 01 00 01 00 00 0b  00 04 03 00 01 02 00 12  |z...............|
-00000060  01 69 01 67 00 75 00 a4  b9 09 90 b4 18 58 14 87  |.i.g.u.......X..|
-00000070  bb 13 a2 cc 67 70 0a 3c  35 98 04 f9 1b df b8 e3  |....gp.<5.......|
-00000080  77 cd 0e c8 0d dc 10 00  00 01 47 97 99 ee 16 00  |w.........G.....|
-00000090  00 04 03 00 46 30 44 02  20 1c 4b 82 5d 95 6e 67  |....F0D. .K.].ng|
-000000a0  5b db 04 95 4b f6 ce f4  32 3e 86 7a 7a 32 ab 18  |[...K...2>.zz2..|
-000000b0  60 74 de 08 da 05 91 4c  2f 02 20 73 54 1b 6e 7f  |`t.....L/. sT.n.|
-000000c0  a1 b0 7d 11 bc e6 f3 85  2f 97 66 1a f7 8a e4 10  |..}...../.f.....|
-000000d0  25 8f 12 f4 6f 39 0f d2  9e 18 f0 00 76 00 68 f6  |%...o9......v.h.|
-000000e0  98 f8 1f 64 82 be 3a 8c  ee b9 28 1d 4c fc 71 51  |...d..:...(.L.qQ|
-000000f0  5d 67 93 d4 44 d1 0a 67  ac bb 4f 4f fb c4 00 00  |]g..D..g..OO....|
-00000100  01 47 97 e1 b5 70 00 00  04 03 00 47 30 45 02 20  |.G...p.....G0E. |
-00000110  32 21 14 38 06 d8 72 2e  00 30 64 1a e2 e8 6d 4e  |2!.8..r..0d...mN|
-00000120  5a e1 d9 42 1e 82 4b 96  25 89 d5 26 13 d3 9c fa  |Z..B..K.%..&....|
-00000130  02 21 00 8f 12 28 64 51  4f 44 d5 8c 18 62 23 b2  |.!...(dQOD...b#.|
-00000140  43 93 33 05 f3 43 55 a1  d9 ee cd c5 71 35 91 dd  |C.3..CU.....q5..|
-00000150  49 d1 0b 00 76 00 ee 4b  bd b7 75 ce 60 ba e1 42  |I...v..K..u.`..B|
-00000160  69 1f ab e1 9e 66 a3 0f  7e 5f b0 72 d8 83 00 c4  |i....f..~_.r....|
-00000170  7b 89 7a a8 fd cb 00 00  01 48 5c 64 8a 87 00 00  |{.z......H\d....|
-00000180  04 03 00 47 30 45 02 20  29 89 d6 b0 53 d3 d2 e9  |...G0E. )...S...|
-00000190  91 bc f1 b5 40 be 1e 2e  e7 5c b4 74 27 ed 8f 9b  |....@....\.t'...|
-000001a0  02 e9 fa c2 4c ba a2 be  02 21 00 af 43 64 52 71  |....L....!..CdRq|
-000001b0  15 29 58 40 91 c7 08 16  96 03 a8 73 a5 65 a0 6c  |.)X@.......s.e.l|
-000001c0  b8 48 56 5a b6 29 83 64  6d 2a 9d 16 03 03 02 be  |.HVZ.).dm*......|
-000001d0  0b 00 02 ba 00 02 b7 00  02 b4 30 82 02 b0 30 82  |..........0...0.|
-000001e0  02 19 a0 03 02 01 02 02  09 00 85 b0 bb a4 8a 7f  |................|
-000001f0  b8 ca 30 0d 06 09 2a 86  48 86 f7 0d 01 01 05 05  |..0...*.H.......|
-00000200  00 30 45 31 0b 30 09 06  03 55 04 06 13 02 41 55  |.0E1.0...U....AU|
-00000210  31 13 30 11 06 03 55 04  08 13 0a 53 6f 6d 65 2d  |1.0...U....Some-|
-00000220  53 74 61 74 65 31 21 30  1f 06 03 55 04 0a 13 18  |State1!0...U....|
-00000230  49 6e 74 65 72 6e 65 74  20 57 69 64 67 69 74 73  |Internet Widgits|
-00000240  20 50 74 79 20 4c 74 64  30 1e 17 0d 31 30 30 34  | Pty Ltd0...1004|
-00000250  32 34 30 39 30 39 33 38  5a 17 0d 31 31 30 34 32  |24090938Z..11042|
-00000260  34 30 39 30 39 33 38 5a  30 45 31 0b 30 09 06 03  |4090938Z0E1.0...|
-00000270  55 04 06 13 02 41 55 31  13 30 11 06 03 55 04 08  |U....AU1.0...U..|
-00000280  13 0a 53 6f 6d 65 2d 53  74 61 74 65 31 21 30 1f  |..Some-State1!0.|
-00000290  06 03 55 04 0a 13 18 49  6e 74 65 72 6e 65 74 20  |..U....Internet |
-000002a0  57 69 64 67 69 74 73 20  50 74 79 20 4c 74 64 30  |Widgits Pty Ltd0|
-000002b0  81 9f 30 0d 06 09 2a 86  48 86 f7 0d 01 01 01 05  |..0...*.H.......|
-000002c0  00 03 81 8d 00 30 81 89  02 81 81 00 bb 79 d6 f5  |.....0.......y..|
-000002d0  17 b5 e5 bf 46 10 d0 dc  69 be e6 2b 07 43 5a d0  |....F...i..+.CZ.|
-000002e0  03 2d 8a 7a 43 85 b7 14  52 e7 a5 65 4c 2c 78 b8  |.-.zC...R..eL,x.|
-000002f0  23 8c b5 b4 82 e5 de 1f  95 3b 7e 62 a5 2c a5 33  |#........;~b.,.3|
-00000300  d6 fe 12 5c 7a 56 fc f5  06 bf fa 58 7b 26 3f b5  |...\zV.....X{&?.|
-00000310  cd 04 d3 d0 c9 21 96 4a  c7 f4 54 9f 5a bf ef 42  |.....!.J..T.Z..B|
-00000320  71 00 fe 18 99 07 7f 7e  88 7d 7d f1 04 39 c4 a2  |q......~.}}..9..|
-00000330  2e db 51 c9 7c e3 c0 4c  3b 32 66 01 cf af b1 1d  |..Q.|..L;2f.....|
-00000340  b8 71 9a 1d db db 89 6b  ae da 2d 79 02 03 01 00  |.q.....k..-y....|
-00000350  01 a3 81 a7 30 81 a4 30  1d 06 03 55 1d 0e 04 16  |....0..0...U....|
-00000360  04 14 b1 ad e2 85 5a cf  cb 28 db 69 ce 23 69 de  |......Z..(.i.#i.|
-00000370  d3 26 8e 18 88 39 30 75  06 03 55 1d 23 04 6e 30  |.&...90u..U.#.n0|
-00000380  6c 80 14 b1 ad e2 85 5a  cf cb 28 db 69 ce 23 69  |l......Z..(.i.#i|
-00000390  de d3 26 8e 18 88 39 a1  49 a4 47 30 45 31 0b 30  |..&...9.I.G0E1.0|
-000003a0  09 06 03 55 04 06 13 02  41 55 31 13 30 11 06 03  |...U....AU1.0...|
-000003b0  55 04 08 13 0a 53 6f 6d  65 2d 53 74 61 74 65 31  |U....Some-State1|
-000003c0  21 30 1f 06 03 55 04 0a  13 18 49 6e 74 65 72 6e  |!0...U....Intern|
-000003d0  65 74 20 57 69 64 67 69  74 73 20 50 74 79 20 4c  |et Widgits Pty L|
-000003e0  74 64 82 09 00 85 b0 bb  a4 8a 7f b8 ca 30 0c 06  |td...........0..|
-000003f0  03 55 1d 13 04 05 30 03  01 01 ff 30 0d 06 09 2a  |.U....0....0...*|
-00000400  86 48 86 f7 0d 01 01 05  05 00 03 81 81 00 08 6c  |.H.............l|
-00000410  45 24 c7 6b b1 59 ab 0c  52 cc f2 b0 14 d7 87 9d  |E$.k.Y..R.......|
-00000420  7a 64 75 b5 5a 95 66 e4  c5 2b 8e ae 12 66 1f eb  |zdu.Z.f..+...f..|
-00000430  4f 38 b3 6e 60 d3 92 fd  f7 41 08 b5 25 13 b1 18  |O8.n`....A..%...|
-00000440  7a 24 fb 30 1d ba ed 98  b9 17 ec e7 d7 31 59 db  |z$.0.........1Y.|
-00000450  95 d3 1d 78 ea 50 56 5c  d5 82 5a 2d 5a 5f 33 c4  |...x.PV\..Z-Z_3.|
-00000460  b6 d8 c9 75 90 96 8c 0f  52 98 b5 cd 98 1f 89 20  |...u....R...... |
-00000470  5f f2 a0 1c a3 1b 96 94  dd a9 fd 57 e9 70 e8 26  |_..........W.p.&|
-00000480  6d 71 99 9b 26 6e 38 50  29 6c 90 a7 bd d9 16 03  |mq..&n8P)l......|
-00000490  03 00 cd 0c 00 00 c9 03  00 17 41 04 d7 61 5b 05  |..........A..a[.|
-000004a0  de 22 d3 3d 00 72 a5 be  0a c1 76 94 a1 34 41 6e  |.".=.r....v..4An|
-000004b0  55 f2 74 91 d2 6f 5c 47  87 c8 4b eb ab ab 10 b9  |U.t..o\G..K.....|
-000004c0  f9 0a bc 63 03 5f 90 5b  e3 6f e1 44 97 cc bf d2  |...c._.[.o.D....|
-000004d0  e8 0d f5 9c 2e 9d 07 2c  b2 00 90 0b 04 01 00 80  |.......,........|
-000004e0  67 3d c7 73 42 b9 b2 fd  4b dd 02 57 87 95 20 75  |g=.sB...K..W.. u|
-000004f0  da c1 e7 d3 33 09 01 5d  e9 32 d7 20 7f 92 a9 dd  |....3..].2. ....|
-00000500  bb 17 c5 ee f2 07 b2 04  1d 5e 1f c2 41 66 3f 14  |.........^..Af?.|
-00000510  90 cd 84 ac 49 46 04 3e  ce 89 7d 79 42 2a 8c 56  |....IF.>..}yB*.V|
-00000520  93 d3 9c 3b 57 38 9e 91  af 62 ad 86 40 29 3d 46  |...;W8...b..@)=F|
-00000530  c7 cc f4 3f a1 7d ee 53  3d 94 1c 85 b9 1d a9 5f  |...?.}.S=......_|
-00000540  10 8e ee 38 5e 98 5d 39  31 79 83 cd f9 02 a8 a9  |...8^.]91y......|
-00000550  b8 82 21 33 40 ed 27 54  a3 6e 64 cb e9 ce dd e1  |..!3@.'T.nd.....|
-00000560  16 03 03 00 04 0e 00 00  00                       |.........|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 1e 18 37 ef 0d  |....F...BA...7..|
-00000010  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-00000020  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-00000030  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000040  a6 b5 68 1a 41 03 56 6b  dc 5a 89 14 03 03 00 01  |..h.A.Vk.Z......|
-00000050  01 16 03 03 00 28 00 00  00 00 00 00 00 00 60 0e  |.....(........`.|
-00000060  49 99 7a 9f 28 6e 46 03  a8 fd 0e b7 ed bb 9c ba  |I.z.(nF.........|
-00000070  07 9c 4d cc 26 2b c2 70  a0 26 38 a0 f2 a0        |..M.&+.p.&8...|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 d2 ef 8f f4 7b  |..........(....{|
-00000010  7a 9b c8 98 a4 36 f2 be  61 46 0e af f4 6f 63 71  |z....6..aF...ocq|
-00000020  6e bd 87 ea 1b f2 95 ad  36 7d a3 52 7f b2 b6 45  |n.......6}.R...E|
-00000030  3f 0b 62                                          |?.b|
->>> Flow 5 (client to server)
-00000000  17 03 03 00 1e 00 00 00  00 00 00 00 01 53 a1 85  |.............S..|
-00000010  ce 3c c1 64 39 80 fb db  67 ec 48 20 7f e9 82 f4  |.<.d9...g.H ....|
-00000020  2d 69 0a 15 03 03 00 1a  00 00 00 00 00 00 00 02  |-i..............|
-00000030  ab 78 11 1b 80 55 23 db  07 c5 7f c3 5e 19 d8 b3  |.x...U#.....^...|
-00000040  f8 c6                                             |..|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-SSLv3-RSA-3DES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-SSLv3-RSA-3DES
deleted file mode 100644
index 20520f5..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-SSLv3-RSA-3DES
+++ /dev/null
@@ -1,78 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 00 00 2f 01 00 00  2b 03 00 10 71 68 59 99  |..../...+...qhY.|
-00000010  9c a6 e7 36 8b 0d 03 be  f5 42 ab 7c d0 3b 76 3e  |...6.....B.|.;v>|
-00000020  46 7c 6c a3 94 09 b7 1b  0e 42 27 00 00 04 00 0a  |F|l......B'.....|
-00000030  00 ff 01 00                                       |....|
->>> Flow 2 (server to client)
-00000000  16 03 00 00 31 02 00 00  2d 03 00 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 0a 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  00 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 00 00  |..A4......9.....|
-000002b0  04 0e 00 00 00                                    |.....|
->>> Flow 3 (client to server)
-00000000  16 03 00 00 84 10 00 00  80 1b 62 18 c8 60 0b f7  |..........b..`..|
-00000010  4a b8 ec 98 56 eb aa 4b  d9 05 c0 f1 be b9 a5 28  |J...V..K.......(|
-00000020  62 e8 3e 25 08 9f 28 dd  08 1f 04 80 5f 10 81 cf  |b.>%..(....._...|
-00000030  aa 2f 55 cd f1 0f ec 5b  90 0a 1f 49 bc a3 96 38  |./U....[...I...8|
-00000040  c7 32 b6 0a da b3 a5 7a  76 28 82 19 30 f4 6b ae  |.2.....zv(..0.k.|
-00000050  fb 81 cc b4 ad 92 f8 c6  20 da 27 89 45 f4 43 c2  |........ .'.E.C.|
-00000060  16 7e de 29 03 dc 90 dd  3a 23 58 4c 35 be 11 a5  |.~.)....:#XL5...|
-00000070  52 18 79 13 e6 b3 2d e6  8e f5 76 60 0c c1 92 bb  |R.y...-...v`....|
-00000080  07 67 c5 24 12 1b aa d6  53 14 03 00 00 01 01 16  |.g.$....S.......|
-00000090  03 00 00 40 5f 64 da b6  24 19 07 44 32 85 f3 c0  |...@_d..$..D2...|
-000000a0  9b c6 2c ad b1 d1 0f 4b  52 20 2f ea 6f 15 80 44  |..,....KR /.o..D|
-000000b0  78 34 44 02 67 e0 2e b4  b8 df 7b 3f 21 dd 66 9b  |x4D.g.....{?!.f.|
-000000c0  e7 5f 71 ff 5f 30 fb 5b  5a 19 f0 24 f8 21 bc 7c  |._q._0.[Z..$.!.||
-000000d0  00 e1 1f e8                                       |....|
->>> Flow 4 (server to client)
-00000000  14 03 00 00 01 01 16 03  00 00 40 48 01 fc 08 a0  |..........@H....|
-00000010  fa 0e 63 58 25 18 06 3c  54 5c 60 ce 35 f6 ec b8  |..cX%..<T\`.5...|
-00000020  ed f8 97 c7 b0 5f 96 6b  d1 10 53 e9 23 20 44 56  |....._.k..S.# DV|
-00000030  d7 ee 11 e1 6f b7 1e fb  33 94 7f f0 78 f5 2e 02  |....o...3...x...|
-00000040  37 7a 43 cf e7 c7 52 b3  c6 8d 8e 17 03 00 00 18  |7zC...R.........|
-00000050  f7 3c 05 79 4b 55 8c d7  2c 50 82 f0 61 34 f6 c7  |.<.yKU..,P..a4..|
-00000060  f3 71 e1 76 1d f0 65 b6  17 03 00 00 28 50 ce 6c  |.q.v..e.....(P.l|
-00000070  96 97 70 88 b7 3c 74 a9  cb a3 0e ae 3a 7f 85 99  |..p..<t.....:...|
-00000080  58 36 10 7f 1a e8 f8 7d  83 75 24 7e b1 6a 8e b0  |X6.....}.u$~.j..|
-00000090  f1 cc 06 19 f7 15 03 00  00 18 2c 1d 87 1d ce 08  |..........,.....|
-000000a0  8f 10 09 6e bd fc ad e0  1d a7 47 d5 b9 8f 3e b8  |...n......G...>.|
-000000b0  b3 fa                                             |..|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-SSLv3-RSA-AES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-SSLv3-RSA-AES
deleted file mode 100644
index e0fe956..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-SSLv3-RSA-AES
+++ /dev/null
@@ -1,79 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 00 00 2f 01 00 00  2b 03 00 37 cd 49 a6 9f  |..../...+..7.I..|
-00000010  e9 19 6a 39 cd 75 ce 6c  f1 1b 96 d3 d4 f0 33 0c  |..j9.u.l......3.|
-00000020  8f 53 b2 06 c4 0e 39 86  e3 98 7e 00 00 04 00 2f  |.S....9...~..../|
-00000030  00 ff 01 00                                       |....|
->>> Flow 2 (server to client)
-00000000  16 03 00 00 31 02 00 00  2d 03 00 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 2f 00 00  |............./..|
-00000030  05 ff 01 00 01 00 16 03  00 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 00 00  |..A4......9.....|
-000002b0  04 0e 00 00 00                                    |.....|
->>> Flow 3 (client to server)
-00000000  16 03 00 00 84 10 00 00  80 4d 3f 93 aa 84 d8 ad  |.........M?.....|
-00000010  93 2c 63 02 66 2f 96 88  b8 5c 09 1e 63 e2 e5 96  |.,c.f/...\..c...|
-00000020  26 d8 07 14 86 26 62 f4  0c 04 68 1c bf bb b1 53  |&....&b...h....S|
-00000030  97 96 43 59 4a 57 65 12  88 45 34 2b 86 2b 05 aa  |..CYJWe..E4+.+..|
-00000040  9b 2b b9 aa 13 30 5c 91  c0 9f 03 8a 96 61 dd 87  |.+...0\......a..|
-00000050  ae e3 ad 6a 7b 8a 18 23  67 c9 df ad f2 47 eb 8b  |...j{..#g....G..|
-00000060  7d 24 95 47 f1 4e b5 c6  15 b4 12 2a 42 df b3 99  |}$.G.N.....*B...|
-00000070  d1 b8 60 ce 6a cf 98 c1  13 a1 68 e6 92 ee 92 a2  |..`.j.....h.....|
-00000080  1d 2f 63 66 f3 b9 1b fc  33 14 03 00 00 01 01 16  |./cf....3.......|
-00000090  03 00 00 40 75 48 68 7d  8f f5 5a c0 cb 90 a5 9e  |...@uHh}..Z.....|
-000000a0  94 bb eb 61 b5 36 aa ce  09 7a 11 ba 22 56 2a d7  |...a.6...z.."V*.|
-000000b0  91 a3 99 73 5b c5 b2 b7  b9 92 56 c6 cb fe 13 73  |...s[.....V....s|
-000000c0  28 30 03 26 62 63 7e 8a  d2 58 c8 e7 52 03 26 67  |(0.&bc~..X..R.&g|
-000000d0  48 21 4f 21                                       |H!O!|
->>> Flow 4 (server to client)
-00000000  14 03 00 00 01 01 16 03  00 00 40 84 8f 6e 80 35  |..........@..n.5|
-00000010  57 73 64 ef 29 bb 25 ff  5d 9d c7 55 38 b7 18 b3  |Wsd.).%.]..U8...|
-00000020  13 d1 ac 20 e0 1e f8 48  47 7a 40 2d bc a7 f2 af  |... ...HGz@-....|
-00000030  ed a6 26 48 f4 51 b4 b6  56 60 9b c3 d9 43 00 95  |..&H.Q..V`...C..|
-00000040  86 be 6c 4e 49 6b f9 10  99 51 22 17 03 00 00 20  |..lNIk...Q".... |
-00000050  d4 7e dc 50 7b c2 26 ee  79 09 84 9f d7 e0 52 b1  |.~.P{.&.y.....R.|
-00000060  e8 9c 92 30 b7 34 06 c6  e5 86 57 a1 fb 8d 06 d6  |...0.4....W.....|
-00000070  17 03 00 00 30 93 0a 3d  64 26 3d a2 74 bc 8f d1  |....0..=d&=.t...|
-00000080  16 38 d0 6b 62 eb 82 b0  9a 50 68 aa 7e f7 45 32  |.8.kb....Ph.~.E2|
-00000090  43 cb 84 2d 95 39 6c bc  c8 a0 2d aa ea fe f5 84  |C..-.9l...-.....|
-000000a0  c8 e4 8b 93 a1 15 03 00  00 20 03 7b 3e 43 1d 0a  |......... .{>C..|
-000000b0  9b 9b e3 17 0f de be 75  e5 6e 2f 5b e8 8d a8 68  |.......u.n/[...h|
-000000c0  4e f0 82 49 00 dd b6 95  b4 22                    |N..I....."|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-SSLv3-RSA-RC4 b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-SSLv3-RSA-RC4
deleted file mode 100644
index 39124c6..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-SSLv3-RSA-RC4
+++ /dev/null
@@ -1,74 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 00 00 2f 01 00 00  2b 03 00 a7 1d 3d ed 0f  |..../...+....=..|
-00000010  2c 7b 1f f1 c8 1c a9 17  ce 69 e2 73 a2 07 d2 91  |,{.......i.s....|
-00000020  e9 27 fa 70 11 6f 18 6d  2a 25 f1 00 00 04 00 05  |.'.p.o.m*%......|
-00000030  00 ff 01 00                                       |....|
->>> Flow 2 (server to client)
-00000000  16 03 00 00 31 02 00 00  2d 03 00 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 05 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  00 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 00 00  |..A4......9.....|
-000002b0  04 0e 00 00 00                                    |.....|
->>> Flow 3 (client to server)
-00000000  16 03 00 00 84 10 00 00  80 25 85 a3 22 29 e4 fb  |.........%..")..|
-00000010  53 b9 a3 6b ed 70 2b 35  7f db 08 35 b8 4c 95 cd  |S..k.p+5...5.L..|
-00000020  00 ec 5e a1 2e ba e9 ac  a6 d4 ef ca 74 a0 12 1b  |..^.........t...|
-00000030  a7 ec 76 22 2c 63 71 1a  3a 50 94 ce 96 c4 d7 76  |..v",cq.:P.....v|
-00000040  1f 47 58 c7 57 98 af ea  7e 57 05 68 d3 f9 87 02  |.GX.W...~W.h....|
-00000050  35 72 35 66 08 b4 cf 48  24 15 92 d5 ba 46 8d 60  |5r5f...H$....F.`|
-00000060  5a 53 0b e4 9b 53 44 55  dc 77 d1 e4 e0 25 51 f6  |ZS...SDU.w...%Q.|
-00000070  f1 7c 96 0b 32 d4 8c 04  d3 3d e6 70 c7 d6 60 a7  |.|..2....=.p..`.|
-00000080  ae 69 22 69 41 1a 8d 12  67 14 03 00 00 01 01 16  |.i"iA...g.......|
-00000090  03 00 00 3c 32 dd 86 fd  5b 53 74 ea 01 45 5b 9e  |...<2...[St..E[.|
-000000a0  32 d0 9d 27 e8 ce 4c d5  a1 c2 d3 2e 0a e9 e5 d2  |2..'..L.........|
-000000b0  04 8c 77 a3 ff e9 8b 02  14 16 af 54 db ec c4 98  |..w........T....|
-000000c0  72 50 f7 65 fa eb ac 11  07 81 d7 fa 4e 18 34 bc  |rP.e........N.4.|
->>> Flow 4 (server to client)
-00000000  14 03 00 00 01 01 16 03  00 00 3c 29 af 2c 96 3a  |..........<).,.:|
-00000010  be a0 91 a8 e4 66 6b 30  ba e2 80 fc a2 8a 09 b4  |.....fk0........|
-00000020  28 14 3b 36 c2 3b 3e 88  e2 10 da 93 af 71 9a 06  |(.;6.;>......q..|
-00000030  1c 8d 97 04 05 ec e2 69  cf 28 20 0f ec 4c a7 f3  |.......i.( ..L..|
-00000040  18 4e 6b 5b 88 9c a9 17  03 00 00 21 5e 0b b4 2d  |.Nk[.......!^..-|
-00000050  a6 b5 0b 3a 86 de 8a e7  87 f3 4c f6 74 7e 0d 16  |...:......L.t~..|
-00000060  9b fc 0c 42 6b f4 9e 15  8b 6a c5 97 88 15 03 00  |...Bk....j......|
-00000070  00 16 f0 a4 e2 16 bf 81  05 ad 1d f5 1c 89 d9 ab  |................|
-00000080  48 23 ab 96 ea 92 aa cd                           |H#......|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv10-ECDHE-ECDSA-AES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv10-ECDHE-ECDSA-AES
deleted file mode 100644
index f81ffc2..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv10-ECDHE-ECDSA-AES
+++ /dev/null
@@ -1,85 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 7d 01 00 00  79 03 01 65 14 3f 40 e4  |....}...y..e.?@.|
-00000010  2f 74 65 7e d0 c8 87 03  59 61 9d c3 84 5e c9 62  |/te~....Ya...^.b|
-00000020  e6 46 b8 0c 4a 5e 3f 33  43 a5 dd 00 00 04 c0 0a  |.F..J^?3C.......|
-00000030  00 ff 02 01 00 00 4b 00  0b 00 04 03 00 01 02 00  |......K.........|
-00000040  0a 00 3a 00 38 00 0e 00  0d 00 19 00 1c 00 0b 00  |..:.8...........|
-00000050  0c 00 1b 00 18 00 09 00  0a 00 1a 00 16 00 17 00  |................|
-00000060  08 00 06 00 07 00 14 00  15 00 04 00 05 00 12 00  |................|
-00000070  13 00 01 00 02 00 03 00  0f 00 10 00 11 00 0f 00  |................|
-00000080  01 01                                             |..|
->>> Flow 2 (server to client)
-00000000  16 03 01 00 31 02 00 00  2d 03 01 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 c0 0a 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  01 02 0e 0b 00 02 0a 00  |................|
-00000040  02 07 00 02 04 30 82 02  00 30 82 01 62 02 09 00  |.....0...0..b...|
-00000050  b8 bf 2d 47 a0 d2 eb f4  30 09 06 07 2a 86 48 ce  |..-G....0...*.H.|
-00000060  3d 04 01 30 45 31 0b 30  09 06 03 55 04 06 13 02  |=..0E1.0...U....|
-00000070  41 55 31 13 30 11 06 03  55 04 08 13 0a 53 6f 6d  |AU1.0...U....Som|
-00000080  65 2d 53 74 61 74 65 31  21 30 1f 06 03 55 04 0a  |e-State1!0...U..|
-00000090  13 18 49 6e 74 65 72 6e  65 74 20 57 69 64 67 69  |..Internet Widgi|
-000000a0  74 73 20 50 74 79 20 4c  74 64 30 1e 17 0d 31 32  |ts Pty Ltd0...12|
-000000b0  31 31 32 32 31 35 30 36  33 32 5a 17 0d 32 32 31  |1122150632Z..221|
-000000c0  31 32 30 31 35 30 36 33  32 5a 30 45 31 0b 30 09  |120150632Z0E1.0.|
-000000d0  06 03 55 04 06 13 02 41  55 31 13 30 11 06 03 55  |..U....AU1.0...U|
-000000e0  04 08 13 0a 53 6f 6d 65  2d 53 74 61 74 65 31 21  |....Some-State1!|
-000000f0  30 1f 06 03 55 04 0a 13  18 49 6e 74 65 72 6e 65  |0...U....Interne|
-00000100  74 20 57 69 64 67 69 74  73 20 50 74 79 20 4c 74  |t Widgits Pty Lt|
-00000110  64 30 81 9b 30 10 06 07  2a 86 48 ce 3d 02 01 06  |d0..0...*.H.=...|
-00000120  05 2b 81 04 00 23 03 81  86 00 04 00 c4 a1 ed be  |.+...#..........|
-00000130  98 f9 0b 48 73 36 7e c3  16 56 11 22 f2 3d 53 c3  |...Hs6~..V.".=S.|
-00000140  3b 4d 21 3d cd 6b 75 e6  f6 b0 dc 9a df 26 c1 bc  |;M!=.ku......&..|
-00000150  b2 87 f0 72 32 7c b3 64  2f 1c 90 bc ea 68 23 10  |...r2|.d/....h#.|
-00000160  7e fe e3 25 c0 48 3a 69  e0 28 6d d3 37 00 ef 04  |~..%.H:i.(m.7...|
-00000170  62 dd 0d a0 9c 70 62 83  d8 81 d3 64 31 aa 9e 97  |b....pb....d1...|
-00000180  31 bd 96 b0 68 c0 9b 23  de 76 64 3f 1a 5c 7f e9  |1...h..#.vd?.\..|
-00000190  12 0e 58 58 b6 5f 70 dd  9b d8 ea d5 d7 f5 d5 cc  |..XX._p.........|
-000001a0  b9 b6 9f 30 66 5b 66 9a  20 e2 27 e5 bf fe 3b 30  |...0f[f. .'...;0|
-000001b0  09 06 07 2a 86 48 ce 3d  04 01 03 81 8c 00 30 81  |...*.H.=......0.|
-000001c0  88 02 42 01 88 a2 4f eb  e2 45 c5 48 7d 1b ac f5  |..B...O..E.H}...|
-000001d0  ed 98 9d ae 47 70 c0 5e  1b b6 2f bd f1 b6 4d b7  |....Gp.^../...M.|
-000001e0  61 40 d3 11 a2 ce ee 0b  7e 92 7e ff 76 9d c3 3b  |a@......~.~.v..;|
-000001f0  7e a5 3f ce fa 10 e2 59  ec 47 2d 7c ac da 4e 97  |~.?....Y.G-|..N.|
-00000200  0e 15 a0 6f d0 02 42 01  4d fc be 67 13 9c 2d 05  |...o..B.M..g..-.|
-00000210  0e bd 3f a3 8c 25 c1 33  13 83 0d 94 06 bb d4 37  |..?..%.3.......7|
-00000220  7a f6 ec 7a c9 86 2e dd  d7 11 69 7f 85 7c 56 de  |z..z......i..|V.|
-00000230  fb 31 78 2b e4 c7 78 0d  ae cb be 9e 4e 36 24 31  |.1x+..x.....N6$1|
-00000240  7b 6a 0f 39 95 12 07 8f  2a 16 03 01 00 d6 0c 00  |{j.9....*.......|
-00000250  00 d2 03 00 17 41 04 1e  18 37 ef 0d 19 51 88 35  |.....A...7...Q.5|
-00000260  75 71 b5 e5 54 5b 12 2e  8f 09 67 fd a7 24 20 3e  |uq..T[....g..$ >|
-00000270  b2 56 1c ce 97 28 5e f8  2b 2d 4f 9e f1 07 9f 6c  |.V...(^.+-O....l|
-00000280  4b 5b 83 56 e2 32 42 e9  58 b6 d7 49 a6 b5 68 1a  |K[.V.2B.X..I..h.|
-00000290  41 03 56 6b dc 5a 89 00  8b 30 81 88 02 42 01 3e  |A.Vk.Z...0...B.>|
-000002a0  79 81 6e 89 cd 3e 3f ec  e4 b5 75 17 28 ee fb 09  |y.n..>?...u.(...|
-000002b0  21 19 6f 3c e6 ca 1e f2  18 b6 47 f8 37 05 1c 85  |!.o<......G.7...|
-000002c0  0f a4 b8 6b 40 04 50 77  e3 05 9b 24 b8 93 e8 4d  |...k@.Pw...$...M|
-000002d0  ef 30 cd 51 90 58 a2 49  71 b3 3f b9 46 ab a9 72  |.0.Q.X.Iq.?.F..r|
-000002e0  02 42 01 58 ef 20 c1 0a  33 f8 fd 50 9e 65 f5 ef  |.B.X. ..3..P.e..|
-000002f0  f4 91 49 2d d2 de 66 2b  97 69 7d b1 d0 ef d6 91  |..I-..f+.i}.....|
-00000300  0f fc 57 2b 73 b9 49 01  33 d2 1b 5b 9a 2c 51 35  |..W+s.I.3..[.,Q5|
-00000310  0e eb 38 53 fa 20 07 84  52 b3 43 24 09 5a 32 c0  |..8S. ..R.C$.Z2.|
-00000320  32 17 34 6c 16 03 01 00  04 0e 00 00 00           |2.4l.........|
->>> Flow 3 (client to server)
-00000000  16 03 01 00 46 10 00 00  42 41 04 31 74 f8 f6 18  |....F...BA.1t...|
-00000010  55 6a 9b 3b 78 0a 0e f0  c9 91 aa 8e 77 39 0a 88  |Uj.;x.......w9..|
-00000020  a4 d4 f6 04 9d de 89 18  b6 50 12 72 26 9c 8f e1  |.........P.r&...|
-00000030  f0 b2 e6 df ce 3b 46 be  e9 2a 9a e3 7f d1 d5 92  |.....;F..*......|
-00000040  ff e3 ae 0a 2d a1 3b 07  f6 04 59 14 03 01 00 01  |....-.;...Y.....|
-00000050  01 16 03 01 00 30 02 4f  df 41 30 97 6f f7 18 ca  |.....0.O.A0.o...|
-00000060  05 35 17 a1 a2 a5 71 61  b1 d8 dd 9a c6 f3 54 53  |.5....qa......TS|
-00000070  84 f6 fb 93 1e 0e 9d e7  fe 35 85 9e 73 d0 2e a1  |.........5..s...|
-00000080  a7 63 d9 40 c6 ac                                 |.c.@..|
->>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 07 7e 4e 9c 19  |..........0.~N..|
-00000010  f0 35 cd 02 b7 a6 0a 1a  b1 a8 11 a3 f9 b1 35 7b  |.5............5{|
-00000020  96 7f e6 e1 00 c6 6d 9e  e6 8a bb a2 b8 bd a3 9d  |......m.........|
-00000030  05 22 1b f1 f5 28 4a 00  6e f1 71 17 03 01 00 20  |."...(J.n.q.... |
-00000040  ad c7 4c dc f4 81 1a 39  3d 86 5e 8e f5 0d a3 33  |..L....9=.^....3|
-00000050  88 32 e7 be 8b 6a 8d 44  29 7b 47 fd e5 33 01 1e  |.2...j.D){G..3..|
-00000060  17 03 01 00 30 61 47 ee  ae 89 25 ac 85 3b 8a 84  |....0aG...%..;..|
-00000070  47 61 ea 3e 4c 70 57 07  d6 f1 1c 21 cb 44 7e de  |Ga.>LpW....!.D~.|
-00000080  b5 01 9e fb fe ad bc be  74 c0 65 a0 6b c1 0c 8c  |........t.e.k...|
-00000090  2b 00 24 c6 b7 15 03 01  00 20 b7 8b 6b e5 77 ab  |+.$...... ..k.w.|
-000000a0  f6 50 9e 88 4d 56 a8 25  8d 02 db cb 68 8b 3f 62  |.P..MV.%....h.?b|
-000000b0  be aa 02 24 75 b1 e5 4b  18 c9                    |...$u..K..|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv10-RSA-3DES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv10-RSA-3DES
deleted file mode 100644
index 55cb487..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv10-RSA-3DES
+++ /dev/null
@@ -1,74 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 36 01 00 00  32 03 01 35 4a e8 32 84  |....6...2..5J.2.|
-00000010  51 68 04 7e d0 0f 43 94  c7 5d 44 d2 95 a3 12 63  |Qh.~..C..]D....c|
-00000020  77 c5 ce 78 5a 25 a3 81  df c4 6b 00 00 04 00 0a  |w..xZ%....k.....|
-00000030  00 ff 01 00 00 05 00 0f  00 01 01                 |...........|
->>> Flow 2 (server to client)
-00000000  16 03 01 00 31 02 00 00  2d 03 01 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 0a 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  01 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 01 00  |..A4......9.....|
-000002b0  04 0e 00 00 00                                    |.....|
->>> Flow 3 (client to server)
-00000000  16 03 01 00 86 10 00 00  82 00 80 1f 4d 12 64 f2  |............M.d.|
-00000010  72 22 86 4a 16 05 3f d2  1b e5 ed a7 f1 19 c4 6d  |r".J..?........m|
-00000020  1d 3a 5c f6 46 8f b9 4d  9e c4 d4 19 95 0a 63 9f  |.:\.F..M......c.|
-00000030  8a 41 1f fc d5 98 45 ca  69 33 37 64 d5 c8 0e 5a  |.A....E.i37d...Z|
-00000040  12 9f 06 54 8a 61 8b 13  f0 d8 fb b9 97 fb cd 1d  |...T.a..........|
-00000050  bd 6c 88 cc 98 57 c3 66  3a 86 04 c9 b9 21 c6 f2  |.l...W.f:....!..|
-00000060  f3 43 7d 4e bf 28 d5 a2  d7 39 e0 78 cb eb b4 af  |.C}N.(...9.x....|
-00000070  21 0e ae 4c 16 9b b3 49  5f 81 02 55 59 97 d9 d2  |!..L...I_..UY...|
-00000080  c4 e2 4c be 0a a6 41 62  48 1d 66 14 03 01 00 01  |..L...AbH.f.....|
-00000090  01 16 03 01 00 28 9d e0  c3 31 82 c2 48 5d fb 47  |.....(...1..H].G|
-000000a0  85 60 d4 17 d2 4f 4d 3c  64 db e4 49 1f a9 66 93  |.`...OM<d..I..f.|
-000000b0  72 6c 32 06 a5 0c 1f db  64 6d 54 71 fd 30        |rl2.....dmTq.0|
->>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 28 94 66 8f ad 8f  |..........(.f...|
-00000010  9f 00 72 f6 af 51 47 67  63 df 3f dd 17 09 0a c5  |..r..QGgc.?.....|
-00000020  bf f8 4d 66 39 f9 b5 47  01 f8 e8 6d ed b4 17 39  |..Mf9..G...m...9|
-00000030  ff 0a ca 17 03 01 00 18  68 93 94 51 12 b9 17 0b  |........h..Q....|
-00000040  d1 a0 22 fc cc c4 76 1a  1e 02 c6 20 5e 74 83 4c  |.."...v.... ^t.L|
-00000050  17 03 01 00 28 08 bd 86  07 84 90 78 bd 1d 90 ce  |....(......x....|
-00000060  09 80 bb d8 de fd 39 82  4b c4 0d 06 f3 65 f5 5b  |......9.K....e.[|
-00000070  3d c3 fd 69 80 1f 51 ce  1d 98 f1 05 fa 15 03 01  |=..i..Q.........|
-00000080  00 18 ed 48 04 21 85 77  d7 b6 29 e3 25 af ea ec  |...H.!.w..).%...|
-00000090  3e 41 82 a0 ca 7d 44 79  8a 0b                    |>A...}Dy..|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv10-RSA-AES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv10-RSA-AES
deleted file mode 100644
index 4671302..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv10-RSA-AES
+++ /dev/null
@@ -1,77 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 36 01 00 00  32 03 01 8c 5a 87 31 6a  |....6...2...Z.1j|
-00000010  8c 7a d5 26 4b 94 17 27  fc a2 c0 5f b5 bc 3f 10  |.z.&K..'..._..?.|
-00000020  80 0e e0 1e 36 80 4b 91  61 77 d4 00 00 04 00 2f  |....6.K.aw...../|
-00000030  00 ff 01 00 00 05 00 0f  00 01 01                 |...........|
->>> Flow 2 (server to client)
-00000000  16 03 01 00 31 02 00 00  2d 03 01 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 2f 00 00  |............./..|
-00000030  05 ff 01 00 01 00 16 03  01 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 01 00  |..A4......9.....|
-000002b0  04 0e 00 00 00                                    |.....|
->>> Flow 3 (client to server)
-00000000  16 03 01 00 86 10 00 00  82 00 80 31 f5 2e e4 c7  |...........1....|
-00000010  f5 76 d6 f7 2d 1b 8d 4d  a9 2a 43 84 b2 0b 08 d6  |.v..-..M.*C.....|
-00000020  4d d9 9a eb 4b 01 49 6e  11 45 43 0d 31 a7 c3 66  |M...K.In.EC.1..f|
-00000030  da 1c 92 68 fb 3d 36 27  94 2f 67 ae 3d 31 a3 8f  |...h.=6'./g.=1..|
-00000040  01 5a d9 17 92 bc 20 7c  cb ae b4 ca 4c ce d4 a9  |.Z.... |....L...|
-00000050  2c 1d fe fc 3c a9 14 31  1d 65 08 d8 6e 8d ac 9d  |,...<..1.e..n...|
-00000060  21 ee 63 4a e2 da 3c 0e  b1 34 8f 6e 20 dd d4 d4  |!.cJ..<..4.n ...|
-00000070  d8 16 27 5d 02 54 e6 ec  5f 43 84 5b 21 24 ef 5d  |..'].T.._C.[!$.]|
-00000080  45 c4 2b 2c 98 7d 50 dc  0b fc 76 14 03 01 00 01  |E.+,.}P...v.....|
-00000090  01 16 03 01 00 30 ef 50  ea 3c e3 b7 a8 5b 9a d2  |.....0.P.<...[..|
-000000a0  11 69 0f d0 5e 79 c8 cb  68 4a ac 16 ef b4 de 1f  |.i..^y..hJ......|
-000000b0  21 0b 8e 91 cb 70 3f 02  bd 45 c1 34 02 e0 66 8a  |!....p?..E.4..f.|
-000000c0  00 ea 6c 5a 96 41                                 |..lZ.A|
->>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 30 99 2c 65 32 5f  |..........0.,e2_|
-00000010  53 37 d8 c2 98 87 f4 68  b6 d7 52 6a 14 c7 df 6e  |S7.....h..Rj...n|
-00000020  bb ce ae 31 d4 04 24 4d  e9 c2 39 7b 68 a7 fa 90  |...1..$M..9{h...|
-00000030  c1 30 14 a2 20 c0 8d e1  2a dc 22 17 03 01 00 20  |.0.. ...*.".... |
-00000040  41 c5 03 05 20 53 e9 fa  0a 26 38 ab 84 6a 5e 36  |A... S...&8..j^6|
-00000050  1b 03 80 2f c3 5c 0b 2c  bd 7f 79 68 bb ab 4d 70  |.../.\.,..yh..Mp|
-00000060  17 03 01 00 30 a1 04 3e  f4 a2 54 7a e7 09 0f 20  |....0..>..Tz... |
-00000070  38 f8 9e bb 1b 61 28 bf  46 e8 75 56 b4 c3 93 b9  |8....a(.F.uV....|
-00000080  8c 18 3e 8e af 9f 59 1a  96 be db 61 80 56 c6 09  |..>...Y....a.V..|
-00000090  3c 21 02 37 d2 15 03 01  00 20 13 d1 81 7d ca 04  |<!.7..... ...}..|
-000000a0  2b c3 fc fa 06 5b b4 98  59 27 0d 07 2a 39 3c 6f  |+....[..Y'..*9<o|
-000000b0  8d 64 83 17 0f ba ec 22  21 36                    |.d....."!6|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv10-RSA-RC4 b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv10-RSA-RC4
deleted file mode 100644
index b5cb479..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv10-RSA-RC4
+++ /dev/null
@@ -1,71 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 36 01 00 00  32 03 01 c5 fc 32 c0 09  |....6...2....2..|
-00000010  47 0b a9 f3 72 c9 6c 3a  e0 94 33 48 35 ac b9 3b  |G...r.l:..3H5..;|
-00000020  da 5f 8b 6e 0c 54 c3 16  f0 39 bd 00 00 04 00 05  |._.n.T...9......|
-00000030  00 ff 01 00 00 05 00 0f  00 01 01                 |...........|
->>> Flow 2 (server to client)
-00000000  16 03 01 00 31 02 00 00  2d 03 01 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 05 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  01 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 01 00  |..A4......9.....|
-000002b0  04 0e 00 00 00                                    |.....|
->>> Flow 3 (client to server)
-00000000  16 03 01 00 86 10 00 00  82 00 80 6a ad 7f e3 26  |...........j...&|
-00000010  71 da 48 af 11 63 de 2e  e8 50 f9 6a be 04 3d 17  |q.H..c...P.j..=.|
-00000020  d1 29 fe 2c 7f b6 26 c1  7e 0b 18 1c 41 62 5c 91  |.).,..&.~...Ab\.|
-00000030  ee 26 9c 92 f5 d1 e9 29  e1 ca a7 01 6a 41 b9 00  |.&.....)....jA..|
-00000040  34 1d 5b c6 28 0e 1a 8f  32 c5 03 e7 a1 8f 89 1b  |4.[.(...2.......|
-00000050  af 13 22 2b 5b e8 76 2d  00 ac da 27 75 95 75 e7  |.."+[.v-...'u.u.|
-00000060  00 00 39 2c bf f2 01 57  e6 29 e3 26 b1 6b ae c5  |..9,...W.).&.k..|
-00000070  8d ce d2 36 b2 94 1f 9c  30 5e b2 16 3d 20 cf 4d  |...6....0^..= .M|
-00000080  88 f5 ac 4c 27 e3 f5 86  ef 9e dc 14 03 01 00 01  |...L'...........|
-00000090  01 16 03 01 00 24 48 d8  80 c4 37 22 31 99 53 30  |.....$H...7"1.S0|
-000000a0  5b 00 07 7e 87 2e 59 9a  d9 0c 42 9e dd ed da 89  |[..~..Y...B.....|
-000000b0  1a 1f cb ab 55 0c ba d9  a9 c0                    |....U.....|
->>> Flow 4 (server to client)
-00000000  14 03 01 00 01 01 16 03  01 00 24 ae 00 c8 14 67  |..........$....g|
-00000010  4b b5 21 96 98 91 d6 27  40 9b 5e a5 86 53 56 f3  |K.!....'@.^..SV.|
-00000020  f6 dc 7e b2 49 78 4b 4d  57 7c 62 a5 f2 16 8f 17  |..~.IxKMW|b.....|
-00000030  03 01 00 21 34 e3 48 58  1c 67 fb 3a 46 28 5d a1  |...!4.HX.g.:F(].|
-00000040  19 66 58 b1 bb fb e7 17  71 07 3f 0a d0 7c c9 24  |.fX.....q.?..|.$|
-00000050  c7 ef 41 af 62 15 03 01  00 16 dd dc 16 dc 16 cc  |..A.b...........|
-00000060  0d f3 2c 29 00 c0 4f 01  68 05 92 a0 f7 ad e2 63  |..,)..O.h......c|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv11-FallbackSCSV b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv11-FallbackSCSV
deleted file mode 100644
index 2d8dfbc..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv11-FallbackSCSV
+++ /dev/null
@@ -1,17 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 d4 01 00 00  d0 03 02 74 2d da 6d 98  |...........t-.m.|
-00000010  ad 3e a5 ec 90 ea d1 5b  f0 e0 a7 45 33 d9 5e 8d  |.>.....[...E3.^.|
-00000020  0f 1d 01 16 6d 00 31 65  ed 50 88 00 00 5e c0 14  |....m.1e.P...^..|
-00000030  c0 0a 00 39 00 38 00 88  00 87 c0 0f c0 05 00 35  |...9.8.........5|
-00000040  00 84 c0 13 c0 09 00 33  00 32 00 9a 00 99 00 45  |.......3.2.....E|
-00000050  00 44 c0 0e c0 04 00 2f  00 96 00 41 00 07 c0 11  |.D...../...A....|
-00000060  c0 07 c0 0c c0 02 00 05  00 04 c0 12 c0 08 00 16  |................|
-00000070  00 13 c0 0d c0 03 00 0a  00 15 00 12 00 09 00 14  |................|
-00000080  00 11 00 08 00 06 00 03  00 ff 56 00 01 00 00 49  |..........V....I|
-00000090  00 0b 00 04 03 00 01 02  00 0a 00 34 00 32 00 0e  |...........4.2..|
-000000a0  00 0d 00 19 00 0b 00 0c  00 18 00 09 00 0a 00 16  |................|
-000000b0  00 17 00 08 00 06 00 07  00 14 00 15 00 04 00 05  |................|
-000000c0  00 12 00 13 00 01 00 02  00 03 00 0f 00 10 00 11  |................|
-000000d0  00 23 00 00 00 0f 00 01  01                       |.#.......|
->>> Flow 2 (server to client)
-00000000  15 03 02 00 02 02 56                              |......V|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv11-RSA-RC4 b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv11-RSA-RC4
deleted file mode 100644
index dc5e765..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv11-RSA-RC4
+++ /dev/null
@@ -1,71 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 36 01 00 00  32 03 02 ff e1 a1 04 0b  |....6...2.......|
-00000010  c2 dc fb 7d 07 61 44 9b  00 67 fe 38 73 f5 fc 4e  |...}.aD..g.8s..N|
-00000020  35 94 0a d5 c1 d0 e7 54  dc 44 1f 00 00 04 00 05  |5......T.D......|
-00000030  00 ff 01 00 00 05 00 0f  00 01 01                 |...........|
->>> Flow 2 (server to client)
-00000000  16 03 02 00 31 02 00 00  2d 03 02 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 05 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  02 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 02 00  |..A4......9.....|
-000002b0  04 0e 00 00 00                                    |.....|
->>> Flow 3 (client to server)
-00000000  16 03 02 00 86 10 00 00  82 00 80 4c e0 4d 6a 19  |...........L.Mj.|
-00000010  a2 72 2a 3d 41 14 a7 b3  0a 25 11 bf c9 9f cf 8c  |.r*=A....%......|
-00000020  3c 0b 01 49 aa f1 59 4b  60 ac e5 72 9b ec 20 41  |<..I..YK`..r.. A|
-00000030  2f 7e ef bf e0 fe 13 c0  1d fd 51 c5 08 c6 9a 9e  |/~........Q.....|
-00000040  74 88 c7 e3 36 99 73 fd  00 2d a2 6a bd 25 f2 d7  |t...6.s..-.j.%..|
-00000050  24 fd fd ab 0c e0 18 38  ba 7b f0 c9 c0 58 a6 d0  |$......8.{...X..|
-00000060  4e e2 59 70 aa f4 52 34  12 a0 ec a4 53 1e 8b ee  |N.Yp..R4....S...|
-00000070  3e bf a4 87 da 02 4c 95  bd 10 af e8 88 c9 ce 87  |>.....L.........|
-00000080  3c 9e 91 70 91 a0 85 18  84 e4 e0 14 03 02 00 01  |<..p............|
-00000090  01 16 03 02 00 24 c5 c0  27 71 49 ad ed 37 e6 5d  |.....$..'qI..7.]|
-000000a0  1b 78 3e 74 15 b7 61 e5  f3 af 1e d0 a2 85 b3 13  |.x>t..a.........|
-000000b0  6e 5e 9a c7 3d 47 32 4d  1b 8d                    |n^..=G2M..|
->>> Flow 4 (server to client)
-00000000  14 03 02 00 01 01 16 03  02 00 24 31 22 76 4d 43  |..........$1"vMC|
-00000010  7a 8a 58 2c 7d 1c 41 39  bf 08 7e 82 17 55 52 b3  |z.X,}.A9..~..UR.|
-00000020  81 bd 7a f8 3c bf 9c 2b  f0 9b 3f 65 f5 42 15 17  |..z.<..+..?e.B..|
-00000030  03 02 00 21 b1 cc e5 56  16 70 58 0b 91 3c 8c 46  |...!...V.pX..<.F|
-00000040  0e 3b b6 fe 32 5d 2e b0  8c 6a 1c a0 82 c9 43 81  |.;..2]...j....C.|
-00000050  cf 07 25 47 c9 15 03 02  00 16 53 91 04 70 ba 03  |..%G......S..p..|
-00000060  53 69 57 86 3b 2f 8b 97  37 7c b8 85 46 b6 72 42  |SiW.;/..7|..F.rB|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ALPN b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ALPN
deleted file mode 100644
index cbfeb42..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ALPN
+++ /dev/null
@@ -1,109 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 01 4c 01 00 01  48 03 03 44 3b 24 ee 2f  |....L...H..D;$./|
-00000010  63 3d ca bd 3e c5 bf a2  24 f1 59 c3 54 dc f0 43  |c=..>...$.Y.T..C|
-00000020  15 c4 51 f2 29 ea 1b ce  2c fe af 00 00 b6 c0 30  |..Q.)...,......0|
-00000030  c0 2c c0 28 c0 24 c0 14  c0 0a 00 a5 00 a3 00 a1  |.,.(.$..........|
-00000040  00 9f 00 6b 00 6a 00 69  00 68 00 39 00 38 00 37  |...k.j.i.h.9.8.7|
-00000050  00 36 00 88 00 87 00 86  00 85 c0 32 c0 2e c0 2a  |.6.........2...*|
-00000060  c0 26 c0 0f c0 05 00 9d  00 3d 00 35 00 84 c0 2f  |.&.......=.5.../|
-00000070  c0 2b c0 27 c0 23 c0 13  c0 09 00 a4 00 a2 00 a0  |.+.'.#..........|
-00000080  00 9e 00 67 00 40 00 3f  00 3e 00 33 00 32 00 31  |...g.@.?.>.3.2.1|
-00000090  00 30 00 9a 00 99 00 98  00 97 00 45 00 44 00 43  |.0.........E.D.C|
-000000a0  00 42 c0 31 c0 2d c0 29  c0 25 c0 0e c0 04 00 9c  |.B.1.-.).%......|
-000000b0  00 3c 00 2f 00 96 00 41  00 07 c0 11 c0 07 c0 0c  |.<./...A........|
-000000c0  c0 02 00 05 00 04 c0 12  c0 08 00 16 00 13 00 10  |................|
-000000d0  00 0d c0 0d c0 03 00 0a  00 15 00 12 00 0f 00 0c  |................|
-000000e0  00 09 00 ff 01 00 00 69  00 0b 00 04 03 00 01 02  |.......i........|
-000000f0  00 0a 00 1c 00 1a 00 17  00 19 00 1c 00 1b 00 18  |................|
-00000100  00 1a 00 16 00 0e 00 0d  00 0b 00 0c 00 09 00 0a  |................|
-00000110  00 23 00 00 00 0d 00 20  00 1e 06 01 06 02 06 03  |.#..... ........|
-00000120  05 01 05 02 05 03 04 01  04 02 04 03 03 01 03 02  |................|
-00000130  03 03 02 01 02 02 02 03  00 0f 00 01 01 00 10 00  |................|
-00000140  10 00 0e 06 70 72 6f 74  6f 32 06 70 72 6f 74 6f  |....proto2.proto|
-00000150  31                                                |1|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 42 02 00 00  3e 03 03 00 00 00 00 00  |....B...>.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 c0 30 00 00  |.............0..|
-00000030  16 00 23 00 00 ff 01 00  01 00 00 10 00 09 00 07  |..#.............|
-00000040  06 70 72 6f 74 6f 31 16  03 03 02 71 0b 00 02 6d  |.proto1....q...m|
-00000050  00 02 6a 00 02 67 30 82  02 63 30 82 01 cc a0 03  |..j..g0..c0.....|
-00000060  02 01 02 02 09 00 a2 73  00 0c 81 00 cb f3 30 0d  |.......s......0.|
-00000070  06 09 2a 86 48 86 f7 0d  01 01 0b 05 00 30 2b 31  |..*.H........0+1|
-00000080  17 30 15 06 03 55 04 0a  13 0e 47 6f 6f 67 6c 65  |.0...U....Google|
-00000090  20 54 45 53 54 49 4e 47  31 10 30 0e 06 03 55 04  | TESTING1.0...U.|
-000000a0  03 13 07 47 6f 20 52 6f  6f 74 30 1e 17 0d 31 35  |...Go Root0...15|
-000000b0  30 31 30 31 30 30 30 30  30 30 5a 17 0d 32 35 30  |0101000000Z..250|
-000000c0  31 30 31 30 30 30 30 30  30 5a 30 26 31 17 30 15  |101000000Z0&1.0.|
-000000d0  06 03 55 04 0a 13 0e 47  6f 6f 67 6c 65 20 54 45  |..U....Google TE|
-000000e0  53 54 49 4e 47 31 0b 30  09 06 03 55 04 03 13 02  |STING1.0...U....|
-000000f0  47 6f 30 81 9f 30 0d 06  09 2a 86 48 86 f7 0d 01  |Go0..0...*.H....|
-00000100  01 01 05 00 03 81 8d 00  30 81 89 02 81 81 00 af  |........0.......|
-00000110  87 88 f6 20 1b 95 65 6c  14 ab 44 05 af 3b 45 14  |... ..el..D..;E.|
-00000120  e3 b7 6d fd 00 63 4d 95  7f fe 6a 62 35 86 c0 4a  |..m..cM...jb5..J|
-00000130  f9 18 7c f6 aa 25 5e 7a  64 31 66 00 ba f4 8e 92  |..|..%^zd1f.....|
-00000140  af c7 6b d8 76 d4 f3 5f  41 cb 6e 56 15 97 1b 97  |..k.v.._A.nV....|
-00000150  c1 3c 12 39 21 66 3d 2b  16 d1 bc db 1c c0 a7 da  |.<.9!f=+........|
-00000160  b7 ca ad ba da cb d5 21  50 ec de 8d ab d1 6b 81  |.......!P.....k.|
-00000170  4b 89 02 f3 c4 be c1 6c  89 b1 44 84 bd 21 d1 04  |K......l..D..!..|
-00000180  7d 9d 16 4d f9 82 15 f6  ef fa d6 09 47 f2 fb 02  |}..M........G...|
-00000190  03 01 00 01 a3 81 93 30  81 90 30 0e 06 03 55 1d  |.......0..0...U.|
-000001a0  0f 01 01 ff 04 04 03 02  05 a0 30 1d 06 03 55 1d  |..........0...U.|
-000001b0  25 04 16 30 14 06 08 2b  06 01 05 05 07 03 01 06  |%..0...+........|
-000001c0  08 2b 06 01 05 05 07 03  02 30 0c 06 03 55 1d 13  |.+.......0...U..|
-000001d0  01 01 ff 04 02 30 00 30  19 06 03 55 1d 0e 04 12  |.....0.0...U....|
-000001e0  04 10 12 50 8d 89 6f 1b  d1 dc 54 4d 6e cb 69 5e  |...P..o...TMn.i^|
-000001f0  06 f4 30 1b 06 03 55 1d  23 04 14 30 12 80 10 bf  |..0...U.#..0....|
-00000200  3d b6 a9 66 f2 b8 40 cf  ea b4 03 78 48 1a 41 30  |=..f..@....xH.A0|
-00000210  19 06 03 55 1d 11 04 12  30 10 82 0e 65 78 61 6d  |...U....0...exam|
-00000220  70 6c 65 2e 67 6f 6c 61  6e 67 30 0d 06 09 2a 86  |ple.golang0...*.|
-00000230  48 86 f7 0d 01 01 0b 05  00 03 81 81 00 92 7c af  |H.............|.|
-00000240  91 55 12 18 96 59 31 a6  48 40 d5 2d d5 ee bb 02  |.U...Y1.H@.-....|
-00000250  a0 f5 c2 1e 7c 9b b3 30  7d 3c dc 76 da 4f 3d c0  |....|..0}<.v.O=.|
-00000260  fa ae 2d 33 24 6b 03 7b  1b 67 59 11 21 b5 11 bc  |..-3$k.{.gY.!...|
-00000270  77 b9 d9 e0 6e a8 2d 2e  35 fa 64 5f 22 3e 63 10  |w...n.-.5.d_">c.|
-00000280  6b be ff 14 86 6d 0d f0  15 31 a8 14 38 1e 3b 84  |k....m...1..8.;.|
-00000290  87 2c cb 98 ed 51 76 b9  b1 4f dd db 9b 84 04 86  |.,...Qv..O......|
-000002a0  40 fa 51 dd ba b4 8d eb  e3 46 de 46 b9 4f 86 c7  |@.Q......F.F.O..|
-000002b0  f9 a4 c2 41 34 ac cc f6  ea b0 ab 39 18 16 03 03  |...A4......9....|
-000002c0  00 cd 0c 00 00 c9 03 00  17 41 04 1e 18 37 ef 0d  |.........A...7..|
-000002d0  19 51 88 35 75 71 b5 e5  54 5b 12 2e 8f 09 67 fd  |.Q.5uq..T[....g.|
-000002e0  a7 24 20 3e b2 56 1c ce  97 28 5e f8 2b 2d 4f 9e  |.$ >.V...(^.+-O.|
-000002f0  f1 07 9f 6c 4b 5b 83 56  e2 32 42 e9 58 b6 d7 49  |...lK[.V.2B.X..I|
-00000300  a6 b5 68 1a 41 03 56 6b  dc 5a 89 05 01 00 80 40  |..h.A.Vk.Z.....@|
-00000310  93 b2 1f 79 3d 56 c0 ae  94 87 c0 a7 28 ef 1d 15  |...y=V......(...|
-00000320  be 4b fb 66 e0 60 2c a3  57 ee 56 7d d6 89 b8 8e  |.K.f.`,.W.V}....|
-00000330  8f 0f 3f 1b c6 9f a4 1d  34 60 b6 9c e9 9b a9 27  |..?.....4`.....'|
-00000340  d0 45 7b 04 71 2d db 9c  67 1b d5 d4 fe 19 69 59  |.E{.q-..g.....iY|
-00000350  71 8a 35 75 33 a8 c9 f2  4d c4 8f 40 17 a7 25 53  |q.5u3...M..@..%S|
-00000360  57 c5 cd ee df a9 3b a3  61 ab e2 a2 ca de 5c 08  |W.....;.a.....\.|
-00000370  3d 5b a2 ef cd c8 bc 16  1f 1d 0f 83 9e b7 20 f5  |=[............ .|
-00000380  89 3f 09 ba 2e da 12 34  81 e5 2f 8d 3c 90 89 16  |.?.....4../.<...|
-00000390  03 03 00 04 0e 00 00 00                           |........|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 8b a2 de a6 1e  |....F...BA......|
-00000010  d9 22 3c 03 4a be 49 2f  40 e3 1e e0 b4 76 7f 78  |."<.J.I/@....v.x|
-00000020  96 22 8d 8d c9 45 3b d8  7a ce e3 16 3d 37 ec 80  |."...E;.z...=7..|
-00000030  aa 3f d5 19 de c1 2c 7b  7f eb 3c fc 5d c3 52 3b  |.?....,{..<.].R;|
-00000040  d4 22 25 1c c7 1f 39 c5  23 bd 73 14 03 03 00 01  |."%...9.#.s.....|
-00000050  01 16 03 03 00 28 c8 53  0a ad c2 f6 7e 18 08 a3  |.....(.S....~...|
-00000060  29 27 20 1c 6c 1d 6c d8  8f 05 31 de e6 ab 7f 22  |)' .l.l...1...."|
-00000070  93 6a fb ef b0 f8 43 a9  d3 4f 9d 04 b5 9a        |.j....C..O....|
->>> Flow 4 (server to client)
-00000000  16 03 03 00 82 04 00 00  7e 00 00 00 00 00 78 50  |........~.....xP|
-00000010  46 ad c1 db a8 38 86 7b  2b bb fd d0 c3 42 3e 00  |F....8.{+....B>.|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
-00000030  6f ec 80 83 61 8e d9 64  ac a2 ee 3b 69 31 79 e1  |o...a..d...;i1y.|
-00000040  53 0a 92 1d aa 23 09 c2  49 02 2d 0d 1d c1 63 d6  |S....#..I.-...c.|
-00000050  21 56 c7 24 02 28 d5 f1  11 b0 e7 1b 4a 7c 55 af  |!V.$.(......J|U.|
-00000060  1b c8 32 4c 5b 33 94 b0  ed b0 2f 52 c4 52 81 ee  |..2L[3..../R.R..|
-00000070  60 6f 66 fb f5 db dd f9  1e 30 11 d4 ca 75 0e 2b  |`of......0...u.+|
-00000080  ff d0 e5 f2 68 a4 e7 14  03 03 00 01 01 16 03 03  |....h...........|
-00000090  00 28 00 00 00 00 00 00  00 00 67 3b 4a ba f3 27  |.(........g;J..'|
-000000a0  c8 45 94 68 36 5a 40 e1  dc 67 9b d4 45 58 e9 24  |.E.h6Z@..g..EX.$|
-000000b0  31 85 3a f8 5d cb 84 8e  64 05 17 03 03 00 25 00  |1.:.]...d.....%.|
-000000c0  00 00 00 00 00 00 01 35  d9 ba 0a e2 3e fd a2 80  |.......5....>...|
-000000d0  10 0e 38 7b ad 85 85 48  6a 2a ab 2a 46 c3 59 96  |..8{...Hj*.*F.Y.|
-000000e0  fd 75 11 5d 15 03 03 00  1a 00 00 00 00 00 00 00  |.u.]............|
-000000f0  02 0b 4d a5 89 4d 86 47  14 60 27 f8 09 bc c9 4d  |..M..M.G.`'....M|
-00000100  00 31 cb                                          |.1.|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ALPN-NoMatch b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ALPN-NoMatch
deleted file mode 100644
index af75445..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ALPN-NoMatch
+++ /dev/null
@@ -1,108 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 01 4c 01 00 01  48 03 03 1d 1a f7 e5 ad  |....L...H.......|
-00000010  a4 5c fd 61 b4 c2 25 33  c7 b9 fc fb 2b a5 4b fe  |.\.a..%3....+.K.|
-00000020  16 84 55 4b 9f 68 73 61  b8 92 4d 00 00 b6 c0 30  |..UK.hsa..M....0|
-00000030  c0 2c c0 28 c0 24 c0 14  c0 0a 00 a5 00 a3 00 a1  |.,.(.$..........|
-00000040  00 9f 00 6b 00 6a 00 69  00 68 00 39 00 38 00 37  |...k.j.i.h.9.8.7|
-00000050  00 36 00 88 00 87 00 86  00 85 c0 32 c0 2e c0 2a  |.6.........2...*|
-00000060  c0 26 c0 0f c0 05 00 9d  00 3d 00 35 00 84 c0 2f  |.&.......=.5.../|
-00000070  c0 2b c0 27 c0 23 c0 13  c0 09 00 a4 00 a2 00 a0  |.+.'.#..........|
-00000080  00 9e 00 67 00 40 00 3f  00 3e 00 33 00 32 00 31  |...g.@.?.>.3.2.1|
-00000090  00 30 00 9a 00 99 00 98  00 97 00 45 00 44 00 43  |.0.........E.D.C|
-000000a0  00 42 c0 31 c0 2d c0 29  c0 25 c0 0e c0 04 00 9c  |.B.1.-.).%......|
-000000b0  00 3c 00 2f 00 96 00 41  00 07 c0 11 c0 07 c0 0c  |.<./...A........|
-000000c0  c0 02 00 05 00 04 c0 12  c0 08 00 16 00 13 00 10  |................|
-000000d0  00 0d c0 0d c0 03 00 0a  00 15 00 12 00 0f 00 0c  |................|
-000000e0  00 09 00 ff 01 00 00 69  00 0b 00 04 03 00 01 02  |.......i........|
-000000f0  00 0a 00 1c 00 1a 00 17  00 19 00 1c 00 1b 00 18  |................|
-00000100  00 1a 00 16 00 0e 00 0d  00 0b 00 0c 00 09 00 0a  |................|
-00000110  00 23 00 00 00 0d 00 20  00 1e 06 01 06 02 06 03  |.#..... ........|
-00000120  05 01 05 02 05 03 04 01  04 02 04 03 03 01 03 02  |................|
-00000130  03 03 02 01 02 02 02 03  00 0f 00 01 01 00 10 00  |................|
-00000140  10 00 0e 06 70 72 6f 74  6f 32 06 70 72 6f 74 6f  |....proto2.proto|
-00000150  31                                                |1|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 35 02 00 00  31 03 03 00 00 00 00 00  |....5...1.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 c0 30 00 00  |.............0..|
-00000030  09 00 23 00 00 ff 01 00  01 00 16 03 03 02 71 0b  |..#...........q.|
-00000040  00 02 6d 00 02 6a 00 02  67 30 82 02 63 30 82 01  |..m..j..g0..c0..|
-00000050  cc a0 03 02 01 02 02 09  00 a2 73 00 0c 81 00 cb  |..........s.....|
-00000060  f3 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
-00000070  30 2b 31 17 30 15 06 03  55 04 0a 13 0e 47 6f 6f  |0+1.0...U....Goo|
-00000080  67 6c 65 20 54 45 53 54  49 4e 47 31 10 30 0e 06  |gle TESTING1.0..|
-00000090  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-000000a0  0d 31 35 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.150101000000Z..|
-000000b0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 26 31  |250101000000Z0&1|
-000000c0  17 30 15 06 03 55 04 0a  13 0e 47 6f 6f 67 6c 65  |.0...U....Google|
-000000d0  20 54 45 53 54 49 4e 47  31 0b 30 09 06 03 55 04  | TESTING1.0...U.|
-000000e0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
-000000f0  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
-00000100  81 00 af 87 88 f6 20 1b  95 65 6c 14 ab 44 05 af  |...... ..el..D..|
-00000110  3b 45 14 e3 b7 6d fd 00  63 4d 95 7f fe 6a 62 35  |;E...m..cM...jb5|
-00000120  86 c0 4a f9 18 7c f6 aa  25 5e 7a 64 31 66 00 ba  |..J..|..%^zd1f..|
-00000130  f4 8e 92 af c7 6b d8 76  d4 f3 5f 41 cb 6e 56 15  |.....k.v.._A.nV.|
-00000140  97 1b 97 c1 3c 12 39 21  66 3d 2b 16 d1 bc db 1c  |....<.9!f=+.....|
-00000150  c0 a7 da b7 ca ad ba da  cb d5 21 50 ec de 8d ab  |..........!P....|
-00000160  d1 6b 81 4b 89 02 f3 c4  be c1 6c 89 b1 44 84 bd  |.k.K......l..D..|
-00000170  21 d1 04 7d 9d 16 4d f9  82 15 f6 ef fa d6 09 47  |!..}..M........G|
-00000180  f2 fb 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |..........0..0..|
-00000190  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
-000001a0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
-000001b0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
-000001c0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
-000001d0  0e 04 12 04 10 12 50 8d  89 6f 1b d1 dc 54 4d 6e  |......P..o...TMn|
-000001e0  cb 69 5e 06 f4 30 1b 06  03 55 1d 23 04 14 30 12  |.i^..0...U.#..0.|
-000001f0  80 10 bf 3d b6 a9 66 f2  b8 40 cf ea b4 03 78 48  |...=..f..@....xH|
-00000200  1a 41 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |.A0...U....0...e|
-00000210  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
-00000220  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
-00000230  92 7c af 91 55 12 18 96  59 31 a6 48 40 d5 2d d5  |.|..U...Y1.H@.-.|
-00000240  ee bb 02 a0 f5 c2 1e 7c  9b b3 30 7d 3c dc 76 da  |.......|..0}<.v.|
-00000250  4f 3d c0 fa ae 2d 33 24  6b 03 7b 1b 67 59 11 21  |O=...-3$k.{.gY.!|
-00000260  b5 11 bc 77 b9 d9 e0 6e  a8 2d 2e 35 fa 64 5f 22  |...w...n.-.5.d_"|
-00000270  3e 63 10 6b be ff 14 86  6d 0d f0 15 31 a8 14 38  |>c.k....m...1..8|
-00000280  1e 3b 84 87 2c cb 98 ed  51 76 b9 b1 4f dd db 9b  |.;..,...Qv..O...|
-00000290  84 04 86 40 fa 51 dd ba  b4 8d eb e3 46 de 46 b9  |...@.Q......F.F.|
-000002a0  4f 86 c7 f9 a4 c2 41 34  ac cc f6 ea b0 ab 39 18  |O.....A4......9.|
-000002b0  16 03 03 00 cd 0c 00 00  c9 03 00 17 41 04 1e 18  |............A...|
-000002c0  37 ef 0d 19 51 88 35 75  71 b5 e5 54 5b 12 2e 8f  |7...Q.5uq..T[...|
-000002d0  09 67 fd a7 24 20 3e b2  56 1c ce 97 28 5e f8 2b  |.g..$ >.V...(^.+|
-000002e0  2d 4f 9e f1 07 9f 6c 4b  5b 83 56 e2 32 42 e9 58  |-O....lK[.V.2B.X|
-000002f0  b6 d7 49 a6 b5 68 1a 41  03 56 6b dc 5a 89 05 01  |..I..h.A.Vk.Z...|
-00000300  00 80 36 d2 96 c8 27 66  d8 bd 6c 28 29 30 b3 be  |..6...'f..l()0..|
-00000310  0a bb b2 fe 9d c3 59 47  34 cf de fe f4 ab 5d 79  |......YG4.....]y|
-00000320  24 a9 9d c9 b5 e9 50 6a  3b 96 e3 29 cb d7 37 06  |$.....Pj;..)..7.|
-00000330  19 08 88 15 29 c2 55 03  62 75 1d 35 c2 8e 25 a2  |....).U.bu.5..%.|
-00000340  86 20 bf 18 46 15 81 f2  74 4b bb dd 3d e3 a5 f6  |. ..F...tK..=...|
-00000350  28 18 41 89 c8 39 13 f9  c0 88 fd cc f0 6e 9e 3d  |(.A..9.......n.=|
-00000360  cb 29 ad 26 5b d1 e6 11  5c 64 7d b6 df d7 39 87  |.).&[...\d}...9.|
-00000370  24 df 9f 62 17 ef f2 b3  3a b3 88 a4 f0 91 ea f2  |$..b....:.......|
-00000380  5d c9 16 03 03 00 04 0e  00 00 00                 |]..........|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 b0 22 15 73 fc  |....F...BA..".s.|
-00000010  1c fd 24 4a 36 69 8a be  ac bd 72 30 bb 6b e1 9b  |..$J6i....r0.k..|
-00000020  42 e8 56 7a 86 b1 8d cb  9c 3e 2d 63 13 57 a8 13  |B.Vz.....>-c.W..|
-00000030  71 3b a2 01 86 af f8 76  40 0b 44 4f 0a 0f 5a da  |q;.....v@.DO..Z.|
-00000040  31 36 3b 13 c0 10 6c 96  64 a7 24 14 03 03 00 01  |16;...l.d.$.....|
-00000050  01 16 03 03 00 28 10 2d  45 93 5c 37 34 d9 2a a0  |.....(.-E.\74.*.|
-00000060  b6 37 13 bc a6 1f 0c ce  2e 55 c1 ad 36 b8 60 72  |.7.......U..6.`r|
-00000070  81 cb 1a 7a 5b 26 49 ad  77 ef 62 e8 fc 00        |...z[&I.w.b...|
->>> Flow 4 (server to client)
-00000000  16 03 03 00 82 04 00 00  7e 00 00 00 00 00 78 50  |........~.....xP|
-00000010  46 ad c1 db a8 38 86 7b  2b bb fd d0 c3 42 3e 00  |F....8.{+....B>.|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
-00000030  6f ec 80 83 61 05 33 d2  9d 95 89 7b 28 54 50 50  |o...a.3....{(TPP|
-00000040  b3 3c 99 5c 82 ab cf 88  24 e8 48 81 db 4a 22 79  |.<.\....$.H..J"y|
-00000050  0b fa 33 50 ed 82 a1 7c  33 0e f2 ff 6d a7 d6 88  |..3P...|3...m...|
-00000060  29 65 74 e3 27 33 94 97  66 0c 86 ce fc ca 0e 2a  |)et.'3..f......*|
-00000070  96 fa fe 19 a3 01 64 d9  4d 8e 58 95 5b 74 a6 aa  |......d.M.X.[t..|
-00000080  f4 9f c1 34 97 2d e5 14  03 03 00 01 01 16 03 03  |...4.-..........|
-00000090  00 28 00 00 00 00 00 00  00 00 4d 56 6d d5 6f cc  |.(........MVm.o.|
-000000a0  3d d4 85 32 3c 07 ea 3c  52 61 88 8e dd d5 d3 d0  |=..2<..<Ra......|
-000000b0  f9 4e 1b b1 c1 d1 67 cb  1a e8 17 03 03 00 25 00  |.N....g.......%.|
-000000c0  00 00 00 00 00 00 01 c3  43 ab 0c ab 59 30 e9 d4  |........C...Y0..|
-000000d0  eb 65 c2 7f 9a 5a 1e 09  06 a4 9d 69 bb 3f 0b 06  |.e...Z.....i.?..|
-000000e0  87 b8 09 39 15 03 03 00  1a 00 00 00 00 00 00 00  |...9............|
-000000f0  02 c2 6f f4 88 f0 7a 59  a6 49 3e 44 a3 7b 6e 36  |..o...zY.I>D.{n6|
-00000100  ae 66 87                                          |.f.|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-CipherSuiteCertPreferenceECDSA b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-CipherSuiteCertPreferenceECDSA
deleted file mode 100644
index 344d973..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-CipherSuiteCertPreferenceECDSA
+++ /dev/null
@@ -1,98 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 01 34 01 00 01  30 03 03 78 08 b2 d4 18  |....4...0..x....|
-00000010  8e b1 6b a2 d2 e0 c6 41  02 c5 93 f1 b9 60 94 e8  |..k....A.....`..|
-00000020  f2 64 6c 97 50 2d 24 a3  cd c0 36 00 00 b6 c0 30  |.dl.P-$...6....0|
-00000030  c0 2c c0 28 c0 24 c0 14  c0 0a 00 a5 00 a3 00 a1  |.,.(.$..........|
-00000040  00 9f 00 6b 00 6a 00 69  00 68 00 39 00 38 00 37  |...k.j.i.h.9.8.7|
-00000050  00 36 00 88 00 87 00 86  00 85 c0 32 c0 2e c0 2a  |.6.........2...*|
-00000060  c0 26 c0 0f c0 05 00 9d  00 3d 00 35 00 84 c0 2f  |.&.......=.5.../|
-00000070  c0 2b c0 27 c0 23 c0 13  c0 09 00 a4 00 a2 00 a0  |.+.'.#..........|
-00000080  00 9e 00 67 00 40 00 3f  00 3e 00 33 00 32 00 31  |...g.@.?.>.3.2.1|
-00000090  00 30 00 9a 00 99 00 98  00 97 00 45 00 44 00 43  |.0.........E.D.C|
-000000a0  00 42 c0 31 c0 2d c0 29  c0 25 c0 0e c0 04 00 9c  |.B.1.-.).%......|
-000000b0  00 3c 00 2f 00 96 00 41  00 07 c0 11 c0 07 c0 0c  |.<./...A........|
-000000c0  c0 02 00 05 00 04 c0 12  c0 08 00 16 00 13 00 10  |................|
-000000d0  00 0d c0 0d c0 03 00 0a  00 15 00 12 00 0f 00 0c  |................|
-000000e0  00 09 00 ff 01 00 00 51  00 0b 00 04 03 00 01 02  |.......Q........|
-000000f0  00 0a 00 1c 00 1a 00 17  00 19 00 1c 00 1b 00 18  |................|
-00000100  00 1a 00 16 00 0e 00 0d  00 0b 00 0c 00 09 00 0a  |................|
-00000110  00 0d 00 20 00 1e 06 01  06 02 06 03 05 01 05 02  |... ............|
-00000120  05 03 04 01 04 02 04 03  03 01 03 02 03 03 02 01  |................|
-00000130  02 02 02 03 00 0f 00 01  01                       |.........|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 c0 0a 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  03 02 0e 0b 00 02 0a 00  |................|
-00000040  02 07 00 02 04 30 82 02  00 30 82 01 62 02 09 00  |.....0...0..b...|
-00000050  b8 bf 2d 47 a0 d2 eb f4  30 09 06 07 2a 86 48 ce  |..-G....0...*.H.|
-00000060  3d 04 01 30 45 31 0b 30  09 06 03 55 04 06 13 02  |=..0E1.0...U....|
-00000070  41 55 31 13 30 11 06 03  55 04 08 13 0a 53 6f 6d  |AU1.0...U....Som|
-00000080  65 2d 53 74 61 74 65 31  21 30 1f 06 03 55 04 0a  |e-State1!0...U..|
-00000090  13 18 49 6e 74 65 72 6e  65 74 20 57 69 64 67 69  |..Internet Widgi|
-000000a0  74 73 20 50 74 79 20 4c  74 64 30 1e 17 0d 31 32  |ts Pty Ltd0...12|
-000000b0  31 31 32 32 31 35 30 36  33 32 5a 17 0d 32 32 31  |1122150632Z..221|
-000000c0  31 32 30 31 35 30 36 33  32 5a 30 45 31 0b 30 09  |120150632Z0E1.0.|
-000000d0  06 03 55 04 06 13 02 41  55 31 13 30 11 06 03 55  |..U....AU1.0...U|
-000000e0  04 08 13 0a 53 6f 6d 65  2d 53 74 61 74 65 31 21  |....Some-State1!|
-000000f0  30 1f 06 03 55 04 0a 13  18 49 6e 74 65 72 6e 65  |0...U....Interne|
-00000100  74 20 57 69 64 67 69 74  73 20 50 74 79 20 4c 74  |t Widgits Pty Lt|
-00000110  64 30 81 9b 30 10 06 07  2a 86 48 ce 3d 02 01 06  |d0..0...*.H.=...|
-00000120  05 2b 81 04 00 23 03 81  86 00 04 00 c4 a1 ed be  |.+...#..........|
-00000130  98 f9 0b 48 73 36 7e c3  16 56 11 22 f2 3d 53 c3  |...Hs6~..V.".=S.|
-00000140  3b 4d 21 3d cd 6b 75 e6  f6 b0 dc 9a df 26 c1 bc  |;M!=.ku......&..|
-00000150  b2 87 f0 72 32 7c b3 64  2f 1c 90 bc ea 68 23 10  |...r2|.d/....h#.|
-00000160  7e fe e3 25 c0 48 3a 69  e0 28 6d d3 37 00 ef 04  |~..%.H:i.(m.7...|
-00000170  62 dd 0d a0 9c 70 62 83  d8 81 d3 64 31 aa 9e 97  |b....pb....d1...|
-00000180  31 bd 96 b0 68 c0 9b 23  de 76 64 3f 1a 5c 7f e9  |1...h..#.vd?.\..|
-00000190  12 0e 58 58 b6 5f 70 dd  9b d8 ea d5 d7 f5 d5 cc  |..XX._p.........|
-000001a0  b9 b6 9f 30 66 5b 66 9a  20 e2 27 e5 bf fe 3b 30  |...0f[f. .'...;0|
-000001b0  09 06 07 2a 86 48 ce 3d  04 01 03 81 8c 00 30 81  |...*.H.=......0.|
-000001c0  88 02 42 01 88 a2 4f eb  e2 45 c5 48 7d 1b ac f5  |..B...O..E.H}...|
-000001d0  ed 98 9d ae 47 70 c0 5e  1b b6 2f bd f1 b6 4d b7  |....Gp.^../...M.|
-000001e0  61 40 d3 11 a2 ce ee 0b  7e 92 7e ff 76 9d c3 3b  |a@......~.~.v..;|
-000001f0  7e a5 3f ce fa 10 e2 59  ec 47 2d 7c ac da 4e 97  |~.?....Y.G-|..N.|
-00000200  0e 15 a0 6f d0 02 42 01  4d fc be 67 13 9c 2d 05  |...o..B.M..g..-.|
-00000210  0e bd 3f a3 8c 25 c1 33  13 83 0d 94 06 bb d4 37  |..?..%.3.......7|
-00000220  7a f6 ec 7a c9 86 2e dd  d7 11 69 7f 85 7c 56 de  |z..z......i..|V.|
-00000230  fb 31 78 2b e4 c7 78 0d  ae cb be 9e 4e 36 24 31  |.1x+..x.....N6$1|
-00000240  7b 6a 0f 39 95 12 07 8f  2a 16 03 03 00 d8 0c 00  |{j.9....*.......|
-00000250  00 d4 03 00 17 41 04 1e  18 37 ef 0d 19 51 88 35  |.....A...7...Q.5|
-00000260  75 71 b5 e5 54 5b 12 2e  8f 09 67 fd a7 24 20 3e  |uq..T[....g..$ >|
-00000270  b2 56 1c ce 97 28 5e f8  2b 2d 4f 9e f1 07 9f 6c  |.V...(^.+-O....l|
-00000280  4b 5b 83 56 e2 32 42 e9  58 b6 d7 49 a6 b5 68 1a  |K[.V.2B.X..I..h.|
-00000290  41 03 56 6b dc 5a 89 05  03 00 8b 30 81 88 02 42  |A.Vk.Z.....0...B|
-000002a0  00 91 b4 4a f2 9d 13 a1  6d 3b ee 46 2f 3b 97 50  |...J....m;.F/;.P|
-000002b0  b9 3e 28 7a 51 7a 8b 3b  a6 16 03 d6 1f 92 0a ec  |.>(zQz.;........|
-000002c0  5b 9b b5 48 98 ce d8 22  bd 7d eb cb 14 7b 14 73  |[..H...".}...{.s|
-000002d0  2d 5f 01 8c dc 5a 63 34  92 4e 59 4a 90 f9 b1 c9  |-_...Zc4.NYJ....|
-000002e0  d8 18 02 42 01 89 e4 e4  39 d0 52 d1 70 19 fe d7  |...B....9.R.p...|
-000002f0  c6 70 10 36 94 1e 45 fd  b4 03 37 79 c7 db cf 6d  |.p.6..E...7y...m|
-00000300  33 5d 80 fe 04 de d1 78  bf c4 dd cf 91 82 57 14  |3].....x......W.|
-00000310  14 09 e3 2d dd d2 78 9c  53 cc 1f f7 40 6c 4a 59  |...-..x.S...@lJY|
-00000320  49 a8 a1 06 24 18 16 03  03 00 04 0e 00 00 00     |I...$..........|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 66 37 3a ce 68  |....F...BA.f7:.h|
-00000010  23 0f b2 d0 cb 20 24 26  37 d5 84 46 4a 2e 59 80  |#.... $&7..FJ.Y.|
-00000020  87 b3 10 7e 36 fd af 7c  99 07 99 dd 18 af 6d 7c  |...~6..|......m||
-00000030  b5 b2 b7 93 45 95 d9 98  1a 13 5b a2 12 e8 b7 95  |....E.....[.....|
-00000040  ed a1 3a 6d aa 8f fc b6  b5 b4 41 14 03 03 00 01  |..:m......A.....|
-00000050  01 16 03 03 00 40 b0 12  69 00 a4 3a 6d bd 56 40  |.....@..i..:m.V@|
-00000060  6e 9d 5e a8 1b 0f 59 c5  09 48 b2 07 d8 bc 7b 02  |n.^...Y..H....{.|
-00000070  70 61 f6 1b a9 27 55 8c  16 4d 69 4c ca 31 30 9f  |pa...'U..MiL.10.|
-00000080  d3 62 ba d4 1b 11 ee 0a  a0 f3 61 be c6 64 c3 dc  |.b........a..d..|
-00000090  97 50 47 27 ed 09                                 |.PG'..|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 09 34 9a eb 7c  |............4..||
-00000020  6a 6d 6a 02 7b 50 14 b8  f7 b0 93 30 ea 0b 61 4a  |jmj.{P.....0..aJ|
-00000030  0b 75 10 39 41 78 46 9d  ba 8e d3 e9 e4 ab dc 1f  |.u.9AxF.........|
-00000040  c9 43 95 e8 f9 d6 3a d3  5d 7d 09 17 03 03 00 40  |.C....:.]}.....@|
-00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  b4 64 88 d5 53 f9 1e 47  d4 d8 c4 fa 0e c2 76 a6  |.d..S..G......v.|
-00000070  ed 5c 17 ba ea 76 72 cb  c5 73 a3 c5 44 21 3c 40  |.\...vr..s..D!<@|
-00000080  33 27 09 37 73 3b 0e a3  7b 95 72 10 8d 74 85 19  |3'.7s;..{.r..t..|
-00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 b3 c0 05  e9 ec 05 06 52 ef 09 b7  |............R...|
-000000b0  52 29 04 88 ed 11 bb bd  36 a3 0f ce 2c 55 a2 87  |R)......6...,U..|
-000000c0  7e 2b 0c aa 83                                    |~+...|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-CipherSuiteCertPreferenceRSA b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-CipherSuiteCertPreferenceRSA
deleted file mode 100644
index 10624c0..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-CipherSuiteCertPreferenceRSA
+++ /dev/null
@@ -1,104 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 01 34 01 00 01  30 03 03 10 5e c8 3f c6  |....4...0...^.?.|
-00000010  fe 44 c4 f0 13 c5 bd ad  06 21 65 e5 a8 40 b5 1d  |.D.......!e..@..|
-00000020  21 07 99 34 5b ef 70 85  29 92 7d 00 00 b6 c0 30  |!..4[.p.).}....0|
-00000030  c0 2c c0 28 c0 24 c0 14  c0 0a 00 a5 00 a3 00 a1  |.,.(.$..........|
-00000040  00 9f 00 6b 00 6a 00 69  00 68 00 39 00 38 00 37  |...k.j.i.h.9.8.7|
-00000050  00 36 00 88 00 87 00 86  00 85 c0 32 c0 2e c0 2a  |.6.........2...*|
-00000060  c0 26 c0 0f c0 05 00 9d  00 3d 00 35 00 84 c0 2f  |.&.......=.5.../|
-00000070  c0 2b c0 27 c0 23 c0 13  c0 09 00 a4 00 a2 00 a0  |.+.'.#..........|
-00000080  00 9e 00 67 00 40 00 3f  00 3e 00 33 00 32 00 31  |...g.@.?.>.3.2.1|
-00000090  00 30 00 9a 00 99 00 98  00 97 00 45 00 44 00 43  |.0.........E.D.C|
-000000a0  00 42 c0 31 c0 2d c0 29  c0 25 c0 0e c0 04 00 9c  |.B.1.-.).%......|
-000000b0  00 3c 00 2f 00 96 00 41  00 07 c0 11 c0 07 c0 0c  |.<./...A........|
-000000c0  c0 02 00 05 00 04 c0 12  c0 08 00 16 00 13 00 10  |................|
-000000d0  00 0d c0 0d c0 03 00 0a  00 15 00 12 00 0f 00 0c  |................|
-000000e0  00 09 00 ff 01 00 00 51  00 0b 00 04 03 00 01 02  |.......Q........|
-000000f0  00 0a 00 1c 00 1a 00 17  00 19 00 1c 00 1b 00 18  |................|
-00000100  00 1a 00 16 00 0e 00 0d  00 0b 00 0c 00 09 00 0a  |................|
-00000110  00 0d 00 20 00 1e 06 01  06 02 06 03 05 01 05 02  |... ............|
-00000120  05 03 04 01 04 02 04 03  03 01 03 02 03 03 02 01  |................|
-00000130  02 02 02 03 00 0f 00 01  01                       |.........|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 c0 14 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  03 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 03 00  |..A4......9.....|
-000002b0  cd 0c 00 00 c9 03 00 17  41 04 1e 18 37 ef 0d 19  |........A...7...|
-000002c0  51 88 35 75 71 b5 e5 54  5b 12 2e 8f 09 67 fd a7  |Q.5uq..T[....g..|
-000002d0  24 20 3e b2 56 1c ce 97  28 5e f8 2b 2d 4f 9e f1  |$ >.V...(^.+-O..|
-000002e0  07 9f 6c 4b 5b 83 56 e2  32 42 e9 58 b6 d7 49 a6  |..lK[.V.2B.X..I.|
-000002f0  b5 68 1a 41 03 56 6b dc  5a 89 05 01 00 80 6a 4b  |.h.A.Vk.Z.....jK|
-00000300  b1 7d 23 cd 0e cb 26 02  d4 ee 90 f2 e0 4a 47 3d  |.}#...&......JG=|
-00000310  b3 36 90 8d 01 42 98 92  ad 75 87 71 02 70 02 a8  |.6...B...u.q.p..|
-00000320  0c b0 06 ee bd 6a 1f 3f  6c 4b 4b 6b 75 41 23 b4  |.....j.?lKKkuA#.|
-00000330  f9 c2 a6 60 e2 de 55 b6  d4 85 62 e9 8f 20 70 ed  |...`..U...b.. p.|
-00000340  9a b8 bb dd 1f 19 87 e9  ad b3 30 3f 7c 63 51 f1  |..........0?|cQ.|
-00000350  59 ab d1 a0 a1 80 22 56  ca 68 52 f8 0f 80 c6 a6  |Y....."V.hR.....|
-00000360  9e 12 51 ed 29 d0 6d c2  1a e5 37 dc 76 e3 f3 53  |..Q.).m...7.v..S|
-00000370  1b 07 0b ea a6 11 af dc  54 d3 ee 25 cc 27 16 03  |........T..%.'..|
-00000380  03 00 04 0e 00 00 00                              |.......|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 2d 4b 0c 6b 65  |....F...BA.-K.ke|
-00000010  82 32 95 8b 77 ec f0 f2  b2 ba d1 38 74 ed 82 49  |.2..w......8t..I|
-00000020  fb ce 8f 66 97 9d b6 97  d8 ae f5 19 af ad 47 b9  |...f..........G.|
-00000030  db 7b d2 c9 4e 10 68 14  ed 23 a5 98 94 f9 2a 00  |.{..N.h..#....*.|
-00000040  b6 44 b3 44 01 29 6c 56  da bb a8 14 03 03 00 01  |.D.D.)lV........|
-00000050  01 16 03 03 00 40 f4 fd  de d6 20 2e 18 80 4e 73  |.....@.... ...Ns|
-00000060  af dd 97 42 08 3b 51 80  e9 26 00 48 6b 8b 21 99  |...B.;Q..&.Hk.!.|
-00000070  a8 60 1f 64 51 d0 5a 90  8b b0 69 b8 6b 29 59 21  |.`.dQ.Z...i.k)Y!|
-00000080  b1 13 19 13 07 01 e1 2c  c3 6b 17 2d 01 a5 be d6  |.......,.k.-....|
-00000090  b0 0d 3d 6a 8c fe                                 |..=j..|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 84 e2 7f e3 b4  |................|
-00000020  53 d7 d0 30 c4 e5 ea 09  df ba 33 b0 02 34 eb 2e  |S..0......3..4..|
-00000030  b2 ec 47 0d e7 20 76 12  fa 53 3b 44 86 e1 e1 63  |..G.. v..S;D...c|
-00000040  06 29 57 98 ce 87 18 ad  02 17 01 17 03 03 00 40  |.)W............@|
-00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  b0 3a f5 90 90 30 9c b3  39 5b b4 56 f6 b9 30 7e  |.:...0..9[.V..0~|
-00000070  8e a8 2d 60 47 b6 57 8a  20 61 02 f2 8e 43 c2 01  |..-`G.W. a...C..|
-00000080  ee f0 be 5a 93 52 2f ea  03 2a 4f 01 ea 9e 1c a2  |...Z.R/..*O.....|
-00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 c0 7e 61  51 a1 76 15 8a 7e 20 5f  |......~aQ.v..~ _|
-000000b0  d4 a4 c6 3e 6c 50 18 c6  63 88 d0 ac 4c fa 31 b3  |...>lP..c...L.1.|
-000000c0  e7 c9 77 11 7a                                    |..w.z|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndECDSAGiven b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndECDSAGiven
deleted file mode 100644
index 56c3c82..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndECDSAGiven
+++ /dev/null
@@ -1,117 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 5a 01 00 00  56 03 03 80 13 c8 83 43  |....Z...V......C|
-00000010  94 79 15 01 6e 0a 9f c5  0f e7 f6 d8 b1 94 de b4  |.y..n...........|
-00000020  57 8c 4f a8 08 48 ee 9b  b4 d2 43 00 00 04 00 05  |W.O..H....C.....|
-00000030  00 ff 01 00 00 29 00 0d  00 20 00 1e 06 01 06 02  |.....)... ......|
-00000040  06 03 05 01 05 02 05 03  04 01 04 02 04 03 03 01  |................|
-00000050  03 02 03 03 02 01 02 02  02 03 00 0f 00 01 01     |...............|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 05 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  03 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 03 00  |..A4......9.....|
-000002b0  17 0d 00 00 13 02 01 40  00 0c 04 01 04 03 05 01  |.......@........|
-000002c0  05 03 02 01 02 03 00 00  16 03 03 00 04 0e 00 00  |................|
-000002d0  00                                                |.|
->>> Flow 3 (client to server)
-00000000  16 03 03 02 0a 0b 00 02  06 00 02 03 00 02 00 30  |...............0|
-00000010  82 01 fc 30 82 01 5e 02  09 00 9a 30 84 6c 26 35  |...0..^....0.l&5|
-00000020  d9 17 30 09 06 07 2a 86  48 ce 3d 04 01 30 45 31  |..0...*.H.=..0E1|
-00000030  0b 30 09 06 03 55 04 06  13 02 41 55 31 13 30 11  |.0...U....AU1.0.|
-00000040  06 03 55 04 08 13 0a 53  6f 6d 65 2d 53 74 61 74  |..U....Some-Stat|
-00000050  65 31 21 30 1f 06 03 55  04 0a 13 18 49 6e 74 65  |e1!0...U....Inte|
-00000060  72 6e 65 74 20 57 69 64  67 69 74 73 20 50 74 79  |rnet Widgits Pty|
-00000070  20 4c 74 64 30 1e 17 0d  31 32 31 31 31 34 31 33  | Ltd0...12111413|
-00000080  32 35 35 33 5a 17 0d 32  32 31 31 31 32 31 33 32  |2553Z..221112132|
-00000090  35 35 33 5a 30 41 31 0b  30 09 06 03 55 04 06 13  |553Z0A1.0...U...|
-000000a0  02 41 55 31 0c 30 0a 06  03 55 04 08 13 03 4e 53  |.AU1.0...U....NS|
-000000b0  57 31 10 30 0e 06 03 55  04 07 13 07 50 79 72 6d  |W1.0...U....Pyrm|
-000000c0  6f 6e 74 31 12 30 10 06  03 55 04 03 13 09 4a 6f  |ont1.0...U....Jo|
-000000d0  65 6c 20 53 69 6e 67 30  81 9b 30 10 06 07 2a 86  |el Sing0..0...*.|
-000000e0  48 ce 3d 02 01 06 05 2b  81 04 00 23 03 81 86 00  |H.=....+...#....|
-000000f0  04 00 95 8c 91 75 14 c0  5e c4 57 b4 d4 c3 6f 8d  |.....u..^.W...o.|
-00000100  ae 68 1e dd 6f ce 86 e1  7e 6e b2 48 3e 81 e5 4e  |.h..o...~n.H>..N|
-00000110  e2 c6 88 4b 64 dc f5 30  bb d3 ff 65 cc 5b f4 dd  |...Kd..0...e.[..|
-00000120  b5 6a 3e 3e d0 1d de 47  c3 76 ad 19 f6 45 2c 8c  |.j>>...G.v...E,.|
-00000130  bc d8 1d 01 4c 1f 70 90  46 76 48 8b 8f 83 cc 4a  |....L.p.FvH....J|
-00000140  5c 8f 40 76 da e0 89 ec  1d 2b c4 4e 30 76 28 41  |\.@v.....+.N0v(A|
-00000150  b2 62 a8 fb 5b f1 f9 4e  7a 8d bd 09 b8 ae ea 8b  |.b..[..Nz.......|
-00000160  18 27 4f 2e 70 fe 13 96  ba c3 d3 40 16 cd 65 4e  |.'O.p......@..eN|
-00000170  ac 11 1e e6 f1 30 09 06  07 2a 86 48 ce 3d 04 01  |.....0...*.H.=..|
-00000180  03 81 8c 00 30 81 88 02  42 00 e0 14 c4 60 60 0b  |....0...B....``.|
-00000190  72 68 b0 32 5d 61 4a 02  74 5c c2 81 b9 16 a8 3f  |rh.2]aJ.t\.....?|
-000001a0  29 c8 36 c7 81 ff 6c b6  5b d9 70 f1 38 3b 50 48  |).6...l.[.p.8;PH|
-000001b0  28 94 cb 09 1a 52 f1 5d  ee 8d f2 b9 f0 f0 da d9  |(....R.]........|
-000001c0  15 3a f9 bd 03 7a 87 a2  23 35 ec 02 42 01 a3 d4  |.:...z..#5..B...|
-000001d0  8a 78 35 1c 4a 9a 23 d2  0a be 2b 10 31 9d 9c 5f  |.x5.J.#...+.1.._|
-000001e0  be e8 91 b3 da 1a f5 5d  a3 23 f5 26 8b 45 70 8d  |.......].#.&.Ep.|
-000001f0  65 62 9b 7e 01 99 3d 18  f6 10 9a 38 61 9b 2e 57  |eb.~..=....8a..W|
-00000200  e4 fa cc b1 8a ce e2 23  a0 87 f0 e1 67 51 eb 16  |.......#....gQ..|
-00000210  03 03 00 86 10 00 00 82  00 80 88 00 24 23 a5 c7  |............$#..|
-00000220  03 2d 86 37 91 f1 71 a9  5f fb 97 49 88 04 9b 0e  |.-.7..q._..I....|
-00000230  89 da 65 d0 56 71 e7 76  22 ef 8e 11 0e 6b 50 3d  |..e.Vq.v"....kP=|
-00000240  64 3f f7 9b e4 45 01 d9  12 cb da fe 10 da 4e b5  |d?...E........N.|
-00000250  b8 6a b5 bc 74 19 d3 4f  a9 bb ee 54 37 e4 70 d0  |.j..t..O...T7.p.|
-00000260  b6 e7 35 96 70 fe a5 2b  14 ac fb c6 1a fa 7d 12  |..5.p..+......}.|
-00000270  87 1b 63 9d 72 30 4d 2c  1a c9 29 32 72 b6 13 53  |..c.r0M,..)2r..S|
-00000280  96 05 de 78 bc f0 1a 74  e2 31 b9 ea db 62 62 6e  |...x...t.1...bbn|
-00000290  a0 a6 b2 c0 3e 2a 94 0d  6a f7 16 03 03 00 92 0f  |....>*..j.......|
-000002a0  00 00 8e 04 03 00 8a 30  81 87 02 42 01 71 5b 3b  |.......0...B.q[;|
-000002b0  a3 35 58 c0 b6 08 09 4f  ac af 89 e0 b3 d5 3d 45  |.5X....O......=E|
-000002c0  1f 49 7f 4a c9 bc 9d 0e  50 3a f5 79 bc 54 5d a9  |.I.J....P:.y.T].|
-000002d0  62 ed 85 c5 f3 47 36 03  cc f1 cd 33 c3 70 2a a6  |b....G6....3.p*.|
-000002e0  7c d9 6e 0c db 0d 1b 4f  6a 39 ba 77 bd ea 02 41  ||.n....Oj9.w...A|
-000002f0  00 f2 b7 06 df 2f 81 7e  98 24 46 06 59 4e 86 6a  |...../.~.$F.YN.j|
-00000300  b7 4f b6 4b 95 40 88 f0  8f f8 bd 16 f5 d5 82 7e  |.O.K.@.........~|
-00000310  82 51 6f 05 49 43 59 cd  1d 40 69 67 ff 65 a8 68  |.Qo.ICY..@ig.e.h|
-00000320  39 2f a1 ad a7 6a ef 5c  d5 69 5e 16 50 bb 2a b2  |9/...j.\.i^.P.*.|
-00000330  2f 14 03 03 00 01 01 16  03 03 00 24 55 f6 74 21  |/..........$U.t!|
-00000340  b4 08 a0 7f a2 dc 86 44  e3 f8 e3 0d e1 d6 5c 1c  |.......D......\.|
-00000350  22 1e 41 2b 30 cc 34 0f  a4 a1 7c a0 27 21 01 e0  |".A+0.4...|.'!..|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 24 6f 6b e7 fb f7  |..........$ok...|
-00000010  52 83 b3 6f ba 1b d7 e8  cb 0a 05 ee 90 04 2b c7  |R..o..........+.|
-00000020  c2 bd 0d 8e ee 42 88 40  ae 01 4a d0 07 4b f4 17  |.....B.@..J..K..|
-00000030  03 03 00 21 e0 8b bd 80  04 18 9c be 12 07 d4 4d  |...!...........M|
-00000040  58 d9 ec c3 f0 67 b5 b3  d1 78 25 e7 2e dd a0 0a  |X....g...x%.....|
-00000050  ac 0f a1 90 59 15 03 03  00 16 76 30 22 0b 00 83  |....Y.....v0"...|
-00000060  c4 31 29 1c ca 44 cb 9f  0e 48 17 21 43 f6 af 47  |.1)..D...H.!C..G|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven
deleted file mode 100644
index 862e0be..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven
+++ /dev/null
@@ -1,116 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 5a 01 00 00  56 03 03 b0 80 f6 7c 13  |....Z...V.....|.|
-00000010  30 5d 57 f0 11 3b 30 4b  0e 01 50 9a 44 0b 89 6f  |0]W..;0K..P.D..o|
-00000020  b6 f1 a3 34 b4 f1 b9 bf  fe 66 a5 00 00 04 00 05  |...4.....f......|
-00000030  00 ff 01 00 00 29 00 0d  00 20 00 1e 06 01 06 02  |.....)... ......|
-00000040  06 03 05 01 05 02 05 03  04 01 04 02 04 03 03 01  |................|
-00000050  03 02 03 03 02 01 02 02  02 03 00 0f 00 01 01     |...............|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 05 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  03 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 03 00  |..A4......9.....|
-000002b0  17 0d 00 00 13 02 01 40  00 0c 04 01 04 03 05 01  |.......@........|
-000002c0  05 03 02 01 02 03 00 00  16 03 03 00 04 0e 00 00  |................|
-000002d0  00                                                |.|
->>> Flow 3 (client to server)
-00000000  16 03 03 01 fb 0b 00 01  f7 00 01 f4 00 01 f1 30  |...............0|
-00000010  82 01 ed 30 82 01 58 a0  03 02 01 02 02 01 00 30  |...0..X........0|
-00000020  0b 06 09 2a 86 48 86 f7  0d 01 01 05 30 26 31 10  |...*.H......0&1.|
-00000030  30 0e 06 03 55 04 0a 13  07 41 63 6d 65 20 43 6f  |0...U....Acme Co|
-00000040  31 12 30 10 06 03 55 04  03 13 09 31 32 37 2e 30  |1.0...U....127.0|
-00000050  2e 30 2e 31 30 1e 17 0d  31 31 31 32 30 38 30 37  |.0.10...11120807|
-00000060  35 35 31 32 5a 17 0d 31  32 31 32 30 37 30 38 30  |5512Z..121207080|
-00000070  30 31 32 5a 30 26 31 10  30 0e 06 03 55 04 0a 13  |012Z0&1.0...U...|
-00000080  07 41 63 6d 65 20 43 6f  31 12 30 10 06 03 55 04  |.Acme Co1.0...U.|
-00000090  03 13 09 31 32 37 2e 30  2e 30 2e 31 30 81 9c 30  |...127.0.0.10..0|
-000000a0  0b 06 09 2a 86 48 86 f7  0d 01 01 01 03 81 8c 00  |...*.H..........|
-000000b0  30 81 88 02 81 80 4e d0  7b 31 e3 82 64 d9 59 c0  |0.....N.{1..d.Y.|
-000000c0  c2 87 a4 5e 1e 8b 73 33  c7 63 53 df 66 92 06 84  |...^..s3.cS.f...|
-000000d0  f6 64 d5 8f e4 36 a7 1d  2b e8 b3 20 36 45 23 b5  |.d...6..+.. 6E#.|
-000000e0  e3 95 ae ed e0 f5 20 9c  8d 95 df 7f 5a 12 ef 87  |...... .....Z...|
-000000f0  e4 5b 68 e4 e9 0e 74 ec  04 8a 7f de 93 27 c4 01  |.[h...t......'..|
-00000100  19 7a bd f2 dc 3d 14 ab  d0 54 ca 21 0c d0 4d 6e  |.z...=...T.!..Mn|
-00000110  87 2e 5c c5 d2 bb 4d 4b  4f ce b6 2c f7 7e 88 ec  |..\...MKO..,.~..|
-00000120  7c d7 02 91 74 a6 1e 0c  1a da e3 4a 5a 2e de 13  ||...t......JZ...|
-00000130  9c 4c 40 88 59 93 02 03  01 00 01 a3 32 30 30 30  |.L@.Y.......2000|
-00000140  0e 06 03 55 1d 0f 01 01  ff 04 04 03 02 00 a0 30  |...U...........0|
-00000150  0d 06 03 55 1d 0e 04 06  04 04 01 02 03 04 30 0f  |...U..........0.|
-00000160  06 03 55 1d 23 04 08 30  06 80 04 01 02 03 04 30  |..U.#..0.......0|
-00000170  0b 06 09 2a 86 48 86 f7  0d 01 01 05 03 81 81 00  |...*.H..........|
-00000180  36 1f b3 7a 0c 75 c9 6e  37 46 61 2b d5 bd c0 a7  |6..z.u.n7Fa+....|
-00000190  4b cc 46 9a 81 58 7c 85  79 29 c8 c8 c6 67 dd 32  |K.F..X|.y)...g.2|
-000001a0  56 45 2b 75 b6 e9 24 a9  50 9a be 1f 5a fa 1a 15  |VE+u..$.P...Z...|
-000001b0  d9 cc 55 95 72 16 83 b9  c2 b6 8f fd 88 8c 38 84  |..U.r.........8.|
-000001c0  1d ab 5d 92 31 13 4f fd  83 3b c6 9d f1 11 62 b6  |..].1.O..;....b.|
-000001d0  8b ec ab 67 be c8 64 b0  11 50 46 58 17 6b 99 1c  |...g..d..PFX.k..|
-000001e0  d3 1d fc 06 f1 0e e5 96  a8 0c f9 78 20 b7 44 18  |...........x .D.|
-000001f0  51 8d 10 7e 4f 94 67 df  a3 4e 70 73 8e 90 91 85  |Q..~O.g..Nps....|
-00000200  16 03 03 00 86 10 00 00  82 00 80 98 61 16 34 c4  |............a.4.|
-00000210  c6 0a 47 c1 de 87 b1 b7  70 1b 24 8d 7e 35 90 35  |..G.....p.$.~5.5|
-00000220  f7 a5 6f c7 c9 91 ad 46  4c 50 e5 7e 61 7c 49 66  |..o....FLP.~a|If|
-00000230  e9 fe 1e 2c 30 fa 22 03  36 8f 44 27 a7 d2 14 84  |...,0.".6.D'....|
-00000240  d0 1f 21 ca 40 35 d1 7d  31 3f e1 73 de 69 bc da  |..!.@5.}1?.s.i..|
-00000250  a5 96 8a b5 50 2b 4b 87  5a b3 fb e1 11 0a 29 59  |....P+K.Z.....)Y|
-00000260  13 2e e3 c2 05 d3 23 e8  09 0c 42 f6 8e 26 67 89  |......#...B..&g.|
-00000270  24 0f 08 2f 3d 24 2b 0c  a2 98 38 02 5c 95 9f ce  |$../=$+...8.\...|
-00000280  e3 75 ba 05 b5 f8 f0 07  e9 a1 44 16 03 03 00 88  |.u........D.....|
-00000290  0f 00 00 84 04 01 00 80  04 c0 bc 4b 23 59 ed 26  |...........K#Y.&|
-000002a0  8d 90 35 da 5b 55 88 e7  12 10 7b d7 1c 27 d1 c4  |..5.[U....{..'..|
-000002b0  d8 1b e2 e7 54 ad a4 be  00 6b 5b 61 2d ec 97 0c  |....T....k[a-...|
-000002c0  a5 9b ae ab 13 fa 94 53  1c 65 28 21 7d b5 c5 be  |.......S.e(!}...|
-000002d0  22 62 91 78 fc e3 de 84  5c 4e 0d f5 73 5e 20 49  |"b.x....\N..s^ I|
-000002e0  5a e2 f9 d3 2f 36 23 91  31 5b ee c7 0b 6f b3 35  |Z.../6#.1[...o.5|
-000002f0  2f 8a 51 84 3c fe 78 34  1f 8c 68 d3 fc 4f c6 5e  |/.Q.<.x4..h..O.^|
-00000300  7b fe b2 81 79 91 37 ee  7f f1 9b a4 88 5f 1b 44  |{...y.7......_.D|
-00000310  dc e9 36 bb d1 45 bb 1f  14 03 03 00 01 01 16 03  |..6..E..........|
-00000320  03 00 24 12 e7 8a 31 36  26 9f fe 45 95 cf 41 56  |..$...16&..E..AV|
-00000330  b4 69 ef e4 22 14 5a 4d  c8 79 a7 18 7b 68 a8 02  |.i..".ZM.y..{h..|
-00000340  75 ea 42 fe c4 a1 32                              |u.B...2|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 24 ae 6d 7b ac b6  |..........$.m{..|
-00000010  62 5c 40 65 6b 0e 5c 12  68 61 14 90 54 3e 24 78  |b\@ek.\.ha..T>$x|
-00000020  be 85 17 a0 9b de a0 00  e9 80 1b a9 0f e4 d7 17  |................|
-00000030  03 03 00 21 86 06 17 6b  62 02 a7 a0 71 fe c0 e4  |...!...kb...q...|
-00000040  44 00 54 dd cc a9 70 cf  bc 92 0d 40 07 62 f5 39  |D.T...p....@.b.9|
-00000050  2a 30 ab 7f cd 15 03 03  00 16 6f 8d c9 d4 62 02  |*0........o...b.|
-00000060  da 64 4c 89 32 86 9f 29  24 05 ed cc 77 9d e5 55  |.dL.2..)$...w..U|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedNotGiven b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedNotGiven
deleted file mode 100644
index 5de6dd8..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedNotGiven
+++ /dev/null
@@ -1,76 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 5a 01 00 00  56 03 03 52 b6 c5 b4 e3  |....Z...V..R....|
-00000010  35 ce 4e b2 9c e0 38 09  e7 fe 00 a2 1a 0a 43 eb  |5.N...8.......C.|
-00000020  df 98 6a 34 71 f9 d0 f8  5d e7 5e 00 00 04 00 05  |..j4q...].^.....|
-00000030  00 ff 01 00 00 29 00 0d  00 20 00 1e 06 01 06 02  |.....)... ......|
-00000040  06 03 05 01 05 02 05 03  04 01 04 02 04 03 03 01  |................|
-00000050  03 02 03 03 02 01 02 02  02 03 00 0f 00 01 01     |...............|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 05 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  03 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 03 00  |..A4......9.....|
-000002b0  17 0d 00 00 13 02 01 40  00 0c 04 01 04 03 05 01  |.......@........|
-000002c0  05 03 02 01 02 03 00 00  16 03 03 00 04 0e 00 00  |................|
-000002d0  00                                                |.|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 07 0b 00 00  03 00 00 00 16 03 03 00  |................|
-00000010  86 10 00 00 82 00 80 2e  8e cb 6c f5 db 45 5b f0  |..........l..E[.|
-00000020  67 7d b1 ac 87 c2 d6 e9  ea 37 40 15 2a ea a1 af  |g}.......7@.*...|
-00000030  ed 71 68 18 9c 6c 84 20  52 3e 38 94 8e d9 cd b3  |.qh..l. R>8.....|
-00000040  15 73 8b db d7 ff 1d 8a  ed a6 f4 00 7d d0 0a 1e  |.s..........}...|
-00000050  9a 1b 5c 59 f6 a0 29 62  03 a1 c6 bf 8a 57 14 06  |..\Y..)b.....W..|
-00000060  9a e8 03 72 bc cd cd 6f  6d e2 ce a8 41 7a f0 65  |...r...om...Az.e|
-00000070  42 0c 7b dd 93 d7 ab 37  f8 2a b3 c4 72 95 61 e1  |B.{....7.*..r.a.|
-00000080  75 98 f5 99 69 ef 0a d0  00 41 0f 05 87 13 d3 7d  |u...i....A.....}|
-00000090  ba 74 34 43 9a 6c d0 14  03 03 00 01 01 16 03 03  |.t4C.l..........|
-000000a0  00 24 87 7e 7d 48 ca 17  9c ad 30 b8 6a 05 2f d3  |.$.~}H....0.j./.|
-000000b0  fc 18 2e df fd f5 0e 38  c3 06 57 4c 27 66 02 af  |.......8..WL'f..|
-000000c0  6d 78 4d 2e b6 dc                                 |mxM...|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 24 cf ee f6 28 ea  |..........$...(.|
-00000010  df e2 7e 9a 75 e0 f9 b4  c4 c2 57 3a 54 26 db 7f  |..~.u.....W:T&..|
-00000020  c4 19 6d b6 d6 c7 b1 05  7f 92 21 9e 51 1a 0a 17  |..m.......!.Q...|
-00000030  03 03 00 21 87 48 77 c4  eb 7c 5d 13 3b f4 8d 08  |...!.Hw..|].;...|
-00000040  f9 35 c3 d2 e5 c0 8c ea  15 c9 2d c5 e0 70 fd 7c  |.5........-..p.||
-00000050  de 93 4f 8c 8d 15 03 03  00 16 d4 8a d5 6a fc db  |..O..........j..|
-00000060  c7 1d 1f 76 64 b9 31 68  72 cc 58 de 9f 2a a6 45  |...vd.1hr.X..*.E|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ECDHE-ECDSA-AES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ECDHE-ECDSA-AES
deleted file mode 100644
index 3b7238a..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ECDHE-ECDSA-AES
+++ /dev/null
@@ -1,89 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 a1 01 00 00  9d 03 03 0f b7 07 5f c7  |.............._.|
-00000010  18 b8 39 6d 92 b3 90 ed  bf 5c 48 7c 6a 56 ee e9  |..9m.....\H|jV..|
-00000020  7a 5b 5f 71 a4 f0 7f 47  57 73 78 00 00 04 c0 0a  |z[_q...GWsx.....|
-00000030  00 ff 02 01 00 00 6f 00  0b 00 04 03 00 01 02 00  |......o.........|
-00000040  0a 00 3a 00 38 00 0e 00  0d 00 19 00 1c 00 0b 00  |..:.8...........|
-00000050  0c 00 1b 00 18 00 09 00  0a 00 1a 00 16 00 17 00  |................|
-00000060  08 00 06 00 07 00 14 00  15 00 04 00 05 00 12 00  |................|
-00000070  13 00 01 00 02 00 03 00  0f 00 10 00 11 00 0d 00  |................|
-00000080  20 00 1e 06 01 06 02 06  03 05 01 05 02 05 03 04  | ...............|
-00000090  01 04 02 04 03 03 01 03  02 03 03 02 01 02 02 02  |................|
-000000a0  03 00 0f 00 01 01                                 |......|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 c0 0a 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  03 02 0e 0b 00 02 0a 00  |................|
-00000040  02 07 00 02 04 30 82 02  00 30 82 01 62 02 09 00  |.....0...0..b...|
-00000050  b8 bf 2d 47 a0 d2 eb f4  30 09 06 07 2a 86 48 ce  |..-G....0...*.H.|
-00000060  3d 04 01 30 45 31 0b 30  09 06 03 55 04 06 13 02  |=..0E1.0...U....|
-00000070  41 55 31 13 30 11 06 03  55 04 08 13 0a 53 6f 6d  |AU1.0...U....Som|
-00000080  65 2d 53 74 61 74 65 31  21 30 1f 06 03 55 04 0a  |e-State1!0...U..|
-00000090  13 18 49 6e 74 65 72 6e  65 74 20 57 69 64 67 69  |..Internet Widgi|
-000000a0  74 73 20 50 74 79 20 4c  74 64 30 1e 17 0d 31 32  |ts Pty Ltd0...12|
-000000b0  31 31 32 32 31 35 30 36  33 32 5a 17 0d 32 32 31  |1122150632Z..221|
-000000c0  31 32 30 31 35 30 36 33  32 5a 30 45 31 0b 30 09  |120150632Z0E1.0.|
-000000d0  06 03 55 04 06 13 02 41  55 31 13 30 11 06 03 55  |..U....AU1.0...U|
-000000e0  04 08 13 0a 53 6f 6d 65  2d 53 74 61 74 65 31 21  |....Some-State1!|
-000000f0  30 1f 06 03 55 04 0a 13  18 49 6e 74 65 72 6e 65  |0...U....Interne|
-00000100  74 20 57 69 64 67 69 74  73 20 50 74 79 20 4c 74  |t Widgits Pty Lt|
-00000110  64 30 81 9b 30 10 06 07  2a 86 48 ce 3d 02 01 06  |d0..0...*.H.=...|
-00000120  05 2b 81 04 00 23 03 81  86 00 04 00 c4 a1 ed be  |.+...#..........|
-00000130  98 f9 0b 48 73 36 7e c3  16 56 11 22 f2 3d 53 c3  |...Hs6~..V.".=S.|
-00000140  3b 4d 21 3d cd 6b 75 e6  f6 b0 dc 9a df 26 c1 bc  |;M!=.ku......&..|
-00000150  b2 87 f0 72 32 7c b3 64  2f 1c 90 bc ea 68 23 10  |...r2|.d/....h#.|
-00000160  7e fe e3 25 c0 48 3a 69  e0 28 6d d3 37 00 ef 04  |~..%.H:i.(m.7...|
-00000170  62 dd 0d a0 9c 70 62 83  d8 81 d3 64 31 aa 9e 97  |b....pb....d1...|
-00000180  31 bd 96 b0 68 c0 9b 23  de 76 64 3f 1a 5c 7f e9  |1...h..#.vd?.\..|
-00000190  12 0e 58 58 b6 5f 70 dd  9b d8 ea d5 d7 f5 d5 cc  |..XX._p.........|
-000001a0  b9 b6 9f 30 66 5b 66 9a  20 e2 27 e5 bf fe 3b 30  |...0f[f. .'...;0|
-000001b0  09 06 07 2a 86 48 ce 3d  04 01 03 81 8c 00 30 81  |...*.H.=......0.|
-000001c0  88 02 42 01 88 a2 4f eb  e2 45 c5 48 7d 1b ac f5  |..B...O..E.H}...|
-000001d0  ed 98 9d ae 47 70 c0 5e  1b b6 2f bd f1 b6 4d b7  |....Gp.^../...M.|
-000001e0  61 40 d3 11 a2 ce ee 0b  7e 92 7e ff 76 9d c3 3b  |a@......~.~.v..;|
-000001f0  7e a5 3f ce fa 10 e2 59  ec 47 2d 7c ac da 4e 97  |~.?....Y.G-|..N.|
-00000200  0e 15 a0 6f d0 02 42 01  4d fc be 67 13 9c 2d 05  |...o..B.M..g..-.|
-00000210  0e bd 3f a3 8c 25 c1 33  13 83 0d 94 06 bb d4 37  |..?..%.3.......7|
-00000220  7a f6 ec 7a c9 86 2e dd  d7 11 69 7f 85 7c 56 de  |z..z......i..|V.|
-00000230  fb 31 78 2b e4 c7 78 0d  ae cb be 9e 4e 36 24 31  |.1x+..x.....N6$1|
-00000240  7b 6a 0f 39 95 12 07 8f  2a 16 03 03 00 d8 0c 00  |{j.9....*.......|
-00000250  00 d4 03 00 17 41 04 1e  18 37 ef 0d 19 51 88 35  |.....A...7...Q.5|
-00000260  75 71 b5 e5 54 5b 12 2e  8f 09 67 fd a7 24 20 3e  |uq..T[....g..$ >|
-00000270  b2 56 1c ce 97 28 5e f8  2b 2d 4f 9e f1 07 9f 6c  |.V...(^.+-O....l|
-00000280  4b 5b 83 56 e2 32 42 e9  58 b6 d7 49 a6 b5 68 1a  |K[.V.2B.X..I..h.|
-00000290  41 03 56 6b dc 5a 89 05  03 00 8b 30 81 88 02 42  |A.Vk.Z.....0...B|
-000002a0  00 d3 cf 21 cd 3c 2e 11  f5 f8 1d c8 c1 57 4b f8  |...!.<.......WK.|
-000002b0  1a c0 2b 1d 47 0f 2d a5  ac a1 c8 83 5d 76 87 05  |..+.G.-.....]v..|
-000002c0  2b 0d 36 d5 57 9f b9 8a  a0 a2 94 67 6a cd 29 db  |+.6.W......gj.).|
-000002d0  04 b0 6b 06 d9 f7 17 9f  1c 60 92 e7 4e 50 48 7f  |..k......`..NPH.|
-000002e0  dc d0 02 42 01 56 fd 38  bd 05 a5 16 6d 91 d1 ce  |...B.V.8....m...|
-000002f0  bb 8c 45 b2 76 2f 92 9c  8b 94 57 7d de 53 8b 7b  |..E.v/....W}.S.{|
-00000300  80 26 6c 4a 43 4b a6 c9  46 49 08 ab c7 57 f3 d9  |.&lJCK..FI...W..|
-00000310  fa 1d 55 fe 91 de 8a 0d  8b d1 44 96 87 85 cb 02  |..U.......D.....|
-00000320  76 9c 00 ad 5f b8 16 03  03 00 04 0e 00 00 00     |v..._..........|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 0b dc ea 22 05  |....F...BA....".|
-00000010  44 c2 09 47 65 31 3b 0b  e1 05 1a 87 8c 2d 3b 56  |D..Ge1;......-;V|
-00000020  49 34 27 3e d6 3b 93 e2  12 7f 5d 7b dc 85 c8 96  |I4'>.;....]{....|
-00000030  4c 8c f9 18 6f 15 cf db  6e 2c 14 6a c9 dd 1c 70  |L...o...n,.j...p|
-00000040  7e 05 c4 17 71 76 df 10  ee 8c b1 14 03 03 00 01  |~...qv..........|
-00000050  01 16 03 03 00 40 ff 12  88 36 3c 00 17 d1 b9 41  |.....@...6<....A|
-00000060  7a 12 25 94 4c 90 65 62  d8 09 ab f9 b4 ee c3 de  |z.%.L.eb........|
-00000070  46 2f cb ee 18 76 4f 76  8e dd 89 fc 7a 21 3b 5f  |F/...vOv....z!;_|
-00000080  ff ac 1c 03 aa be 96 82  82 ea 2e 22 2a 80 b3 86  |..........."*...|
-00000090  38 e4 4d 90 91 46                                 |8.M..F|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 e5 c1 f0 6a db  |..............j.|
-00000020  05 98 ed 33 94 73 7f 13  7f 78 17 7f d1 9e c5 a7  |...3.s...x......|
-00000030  62 7f 85 14 2c 7d b2 8e  ef 75 a9 df 92 cc 22 20  |b...,}...u...." |
-00000040  66 08 85 22 d3 ea 5c 4c  4c c8 d7 17 03 03 00 40  |f.."..\LL......@|
-00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  f2 20 07 d2 13 ca ed 01  c9 7b 91 14 01 2c 08 f5  |. .......{...,..|
-00000070  8a 69 94 bc 19 9a d9 65  6b 15 04 b4 45 17 ec 6f  |.i.....ek...E..o|
-00000080  85 de 31 dc a2 de 8b 4d  53 57 66 4a 29 21 5a 20  |..1....MSWfJ)!Z |
-00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 55 15 f7  89 8d 75 57 7e 92 db ec  |.....U....uW~...|
-000000b0  32 ec 07 5c 83 32 36 59  61 f1 9d a6 7a eb 76 c1  |2..\.26Ya...z.v.|
-000000c0  c7 96 3f 4d 0a                                    |..?M.|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-IssueTicket b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-IssueTicket
deleted file mode 100644
index 20a0731..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-IssueTicket
+++ /dev/null
@@ -1,83 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 5e 01 00 00  5a 03 03 f0 0a 06 d0 65  |....^...Z......e|
-00000010  1c c3 90 ac dc 61 42 e5  b8 a9 17 fb e7 c3 1e bd  |.....aB.........|
-00000020  d9 09 5a 63 71 e2 f9 58  db 26 6e 00 00 04 00 05  |..Zcq..X.&n.....|
-00000030  00 ff 01 00 00 2d 00 23  00 00 00 0d 00 20 00 1e  |.....-.#..... ..|
-00000040  06 01 06 02 06 03 05 01  05 02 05 03 04 01 04 02  |................|
-00000050  04 03 03 01 03 02 03 03  02 01 02 02 02 03 00 0f  |................|
-00000060  00 01 01                                          |...|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 35 02 00 00  31 03 03 00 00 00 00 00  |....5...1.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 05 00 00  |................|
-00000030  09 00 23 00 00 ff 01 00  01 00 16 03 03 02 71 0b  |..#...........q.|
-00000040  00 02 6d 00 02 6a 00 02  67 30 82 02 63 30 82 01  |..m..j..g0..c0..|
-00000050  cc a0 03 02 01 02 02 09  00 a2 73 00 0c 81 00 cb  |..........s.....|
-00000060  f3 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
-00000070  30 2b 31 17 30 15 06 03  55 04 0a 13 0e 47 6f 6f  |0+1.0...U....Goo|
-00000080  67 6c 65 20 54 45 53 54  49 4e 47 31 10 30 0e 06  |gle TESTING1.0..|
-00000090  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-000000a0  0d 31 35 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.150101000000Z..|
-000000b0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 26 31  |250101000000Z0&1|
-000000c0  17 30 15 06 03 55 04 0a  13 0e 47 6f 6f 67 6c 65  |.0...U....Google|
-000000d0  20 54 45 53 54 49 4e 47  31 0b 30 09 06 03 55 04  | TESTING1.0...U.|
-000000e0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
-000000f0  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
-00000100  81 00 af 87 88 f6 20 1b  95 65 6c 14 ab 44 05 af  |...... ..el..D..|
-00000110  3b 45 14 e3 b7 6d fd 00  63 4d 95 7f fe 6a 62 35  |;E...m..cM...jb5|
-00000120  86 c0 4a f9 18 7c f6 aa  25 5e 7a 64 31 66 00 ba  |..J..|..%^zd1f..|
-00000130  f4 8e 92 af c7 6b d8 76  d4 f3 5f 41 cb 6e 56 15  |.....k.v.._A.nV.|
-00000140  97 1b 97 c1 3c 12 39 21  66 3d 2b 16 d1 bc db 1c  |....<.9!f=+.....|
-00000150  c0 a7 da b7 ca ad ba da  cb d5 21 50 ec de 8d ab  |..........!P....|
-00000160  d1 6b 81 4b 89 02 f3 c4  be c1 6c 89 b1 44 84 bd  |.k.K......l..D..|
-00000170  21 d1 04 7d 9d 16 4d f9  82 15 f6 ef fa d6 09 47  |!..}..M........G|
-00000180  f2 fb 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |..........0..0..|
-00000190  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
-000001a0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
-000001b0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
-000001c0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
-000001d0  0e 04 12 04 10 12 50 8d  89 6f 1b d1 dc 54 4d 6e  |......P..o...TMn|
-000001e0  cb 69 5e 06 f4 30 1b 06  03 55 1d 23 04 14 30 12  |.i^..0...U.#..0.|
-000001f0  80 10 bf 3d b6 a9 66 f2  b8 40 cf ea b4 03 78 48  |...=..f..@....xH|
-00000200  1a 41 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |.A0...U....0...e|
-00000210  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
-00000220  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
-00000230  92 7c af 91 55 12 18 96  59 31 a6 48 40 d5 2d d5  |.|..U...Y1.H@.-.|
-00000240  ee bb 02 a0 f5 c2 1e 7c  9b b3 30 7d 3c dc 76 da  |.......|..0}<.v.|
-00000250  4f 3d c0 fa ae 2d 33 24  6b 03 7b 1b 67 59 11 21  |O=...-3$k.{.gY.!|
-00000260  b5 11 bc 77 b9 d9 e0 6e  a8 2d 2e 35 fa 64 5f 22  |...w...n.-.5.d_"|
-00000270  3e 63 10 6b be ff 14 86  6d 0d f0 15 31 a8 14 38  |>c.k....m...1..8|
-00000280  1e 3b 84 87 2c cb 98 ed  51 76 b9 b1 4f dd db 9b  |.;..,...Qv..O...|
-00000290  84 04 86 40 fa 51 dd ba  b4 8d eb e3 46 de 46 b9  |...@.Q......F.F.|
-000002a0  4f 86 c7 f9 a4 c2 41 34  ac cc f6 ea b0 ab 39 18  |O.....A4......9.|
-000002b0  16 03 03 00 04 0e 00 00  00                       |.........|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 87 06 ba d7 1f  |................|
-00000010  68 0c f2 a6 51 b4 ae af  8c c5 5d d4 bd f1 82 6d  |h...Q.....]....m|
-00000020  1d dd ce 69 be 07 62 13  af 06 71 3a 47 a9 bd f7  |...i..b...q:G...|
-00000030  bb 27 f0 38 df 88 01 40  29 c9 bb 7b 5d 6d 28 bd  |.'.8...@)..{]m(.|
-00000040  c8 28 e6 6d ff 5c c9 d3  c6 f5 06 17 e5 e5 1c 5b  |.(.m.\.........[|
-00000050  a1 18 7a 34 92 0a 39 20  5a 22 44 6c cc 5c 8c 83  |..z4..9 Z"Dl.\..|
-00000060  d0 19 4c bb 4e dc e2 64  ec b2 b8 3f 18 3f 9d 65  |..L.N..d...?.?.e|
-00000070  5b 89 26 ae f6 fd 54 71  c4 45 e9 56 6a 28 42 a9  |[.&...Tq.E.Vj(B.|
-00000080  5b 9f 12 69 a4 08 83 53  95 04 18 14 03 03 00 01  |[..i...S........|
-00000090  01 16 03 03 00 24 55 80  0f 43 c3 08 45 99 c9 1b  |.....$U..C..E...|
-000000a0  fd fe dd e8 48 f2 89 99  86 ef f7 fd 5f 2a 4b 0b  |....H......._*K.|
-000000b0  33 0e 5f 17 bb b7 a2 3c  9d 30                    |3._....<.0|
->>> Flow 4 (server to client)
-00000000  16 03 03 00 82 04 00 00  7e 00 00 00 00 00 78 50  |........~.....xP|
-00000010  46 ad c1 db a8 38 86 7b  2b bb fd d0 c3 42 3e 00  |F....8.{+....B>.|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
-00000030  6f 2c b5 83 61 c4 74 90  94 e5 6c fd 70 64 57 3a  |o,..a.t...l.pdW:|
-00000040  25 78 bf 9f a0 7c 51 bc  2a 69 1e b3 fd 71 34 b7  |%x...|Q.*i...q4.|
-00000050  9a ef cb 49 37 f8 5d 5e  7c cf 6d fc 13 c1 52 79  |...I7.]^|.m...Ry|
-00000060  8e ed c3 84 01 33 94 10  65 34 64 5e b4 9c 07 46  |.....3..e4d^...F|
-00000070  5b 9e d7 5e 55 df fd c0  e9 d2 e8 d3 c6 42 18 ef  |[..^U........B..|
-00000080  a5 6c be e8 d2 49 c6 14  03 03 00 01 01 16 03 03  |.l...I..........|
-00000090  00 24 66 94 4b b5 3f 5d  59 db 36 c1 dd 55 8c ee  |.$f.K.?]Y.6..U..|
-000000a0  de a4 bc d0 12 44 31 3e  e4 e7 4a 51 e3 62 69 ab  |.....D1>..JQ.bi.|
-000000b0  14 78 85 49 a3 97 17 03  03 00 21 dd 96 5d 21 e0  |.x.I......!..]!.|
-000000c0  2e 3d 33 dd 6c df bb 41  d7 bd 50 c7 1c 6f 97 34  |.=3.l..A..P..o.4|
-000000d0  6a 6e d6 1d 27 81 2d f7  fb 32 85 02 15 03 03 00  |jn..'.-..2......|
-000000e0  16 5e 4e 62 15 97 a7 a3  9b 1b 50 44 85 fb 28 66  |.^Nb......PD..(f|
-000000f0  aa 66 54 45 c9 dc 61                              |.fTE..a|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-IssueTicketPreDisable b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-IssueTicketPreDisable
deleted file mode 100644
index a8f7edf..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-IssueTicketPreDisable
+++ /dev/null
@@ -1,83 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 5e 01 00 00  5a 03 03 62 f6 20 66 23  |....^...Z..b. f#|
-00000010  d5 71 0a c0 57 92 2e 80  b6 06 0c 54 5b 1c 77 a0  |.q..W......T[.w.|
-00000020  ce 0b b2 52 4a b9 f2 c6  97 33 42 00 00 04 00 05  |...RJ....3B.....|
-00000030  00 ff 01 00 00 2d 00 23  00 00 00 0d 00 20 00 1e  |.....-.#..... ..|
-00000040  06 01 06 02 06 03 05 01  05 02 05 03 04 01 04 02  |................|
-00000050  04 03 03 01 03 02 03 03  02 01 02 02 02 03 00 0f  |................|
-00000060  00 01 01                                          |...|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 35 02 00 00  31 03 03 00 00 00 00 00  |....5...1.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 05 00 00  |................|
-00000030  09 00 23 00 00 ff 01 00  01 00 16 03 03 02 71 0b  |..#...........q.|
-00000040  00 02 6d 00 02 6a 00 02  67 30 82 02 63 30 82 01  |..m..j..g0..c0..|
-00000050  cc a0 03 02 01 02 02 09  00 a2 73 00 0c 81 00 cb  |..........s.....|
-00000060  f3 30 0d 06 09 2a 86 48  86 f7 0d 01 01 0b 05 00  |.0...*.H........|
-00000070  30 2b 31 17 30 15 06 03  55 04 0a 13 0e 47 6f 6f  |0+1.0...U....Goo|
-00000080  67 6c 65 20 54 45 53 54  49 4e 47 31 10 30 0e 06  |gle TESTING1.0..|
-00000090  03 55 04 03 13 07 47 6f  20 52 6f 6f 74 30 1e 17  |.U....Go Root0..|
-000000a0  0d 31 35 30 31 30 31 30  30 30 30 30 30 5a 17 0d  |.150101000000Z..|
-000000b0  32 35 30 31 30 31 30 30  30 30 30 30 5a 30 26 31  |250101000000Z0&1|
-000000c0  17 30 15 06 03 55 04 0a  13 0e 47 6f 6f 67 6c 65  |.0...U....Google|
-000000d0  20 54 45 53 54 49 4e 47  31 0b 30 09 06 03 55 04  | TESTING1.0...U.|
-000000e0  03 13 02 47 6f 30 81 9f  30 0d 06 09 2a 86 48 86  |...Go0..0...*.H.|
-000000f0  f7 0d 01 01 01 05 00 03  81 8d 00 30 81 89 02 81  |...........0....|
-00000100  81 00 af 87 88 f6 20 1b  95 65 6c 14 ab 44 05 af  |...... ..el..D..|
-00000110  3b 45 14 e3 b7 6d fd 00  63 4d 95 7f fe 6a 62 35  |;E...m..cM...jb5|
-00000120  86 c0 4a f9 18 7c f6 aa  25 5e 7a 64 31 66 00 ba  |..J..|..%^zd1f..|
-00000130  f4 8e 92 af c7 6b d8 76  d4 f3 5f 41 cb 6e 56 15  |.....k.v.._A.nV.|
-00000140  97 1b 97 c1 3c 12 39 21  66 3d 2b 16 d1 bc db 1c  |....<.9!f=+.....|
-00000150  c0 a7 da b7 ca ad ba da  cb d5 21 50 ec de 8d ab  |..........!P....|
-00000160  d1 6b 81 4b 89 02 f3 c4  be c1 6c 89 b1 44 84 bd  |.k.K......l..D..|
-00000170  21 d1 04 7d 9d 16 4d f9  82 15 f6 ef fa d6 09 47  |!..}..M........G|
-00000180  f2 fb 02 03 01 00 01 a3  81 93 30 81 90 30 0e 06  |..........0..0..|
-00000190  03 55 1d 0f 01 01 ff 04  04 03 02 05 a0 30 1d 06  |.U...........0..|
-000001a0  03 55 1d 25 04 16 30 14  06 08 2b 06 01 05 05 07  |.U.%..0...+.....|
-000001b0  03 01 06 08 2b 06 01 05  05 07 03 02 30 0c 06 03  |....+.......0...|
-000001c0  55 1d 13 01 01 ff 04 02  30 00 30 19 06 03 55 1d  |U.......0.0...U.|
-000001d0  0e 04 12 04 10 12 50 8d  89 6f 1b d1 dc 54 4d 6e  |......P..o...TMn|
-000001e0  cb 69 5e 06 f4 30 1b 06  03 55 1d 23 04 14 30 12  |.i^..0...U.#..0.|
-000001f0  80 10 bf 3d b6 a9 66 f2  b8 40 cf ea b4 03 78 48  |...=..f..@....xH|
-00000200  1a 41 30 19 06 03 55 1d  11 04 12 30 10 82 0e 65  |.A0...U....0...e|
-00000210  78 61 6d 70 6c 65 2e 67  6f 6c 61 6e 67 30 0d 06  |xample.golang0..|
-00000220  09 2a 86 48 86 f7 0d 01  01 0b 05 00 03 81 81 00  |.*.H............|
-00000230  92 7c af 91 55 12 18 96  59 31 a6 48 40 d5 2d d5  |.|..U...Y1.H@.-.|
-00000240  ee bb 02 a0 f5 c2 1e 7c  9b b3 30 7d 3c dc 76 da  |.......|..0}<.v.|
-00000250  4f 3d c0 fa ae 2d 33 24  6b 03 7b 1b 67 59 11 21  |O=...-3$k.{.gY.!|
-00000260  b5 11 bc 77 b9 d9 e0 6e  a8 2d 2e 35 fa 64 5f 22  |...w...n.-.5.d_"|
-00000270  3e 63 10 6b be ff 14 86  6d 0d f0 15 31 a8 14 38  |>c.k....m...1..8|
-00000280  1e 3b 84 87 2c cb 98 ed  51 76 b9 b1 4f dd db 9b  |.;..,...Qv..O...|
-00000290  84 04 86 40 fa 51 dd ba  b4 8d eb e3 46 de 46 b9  |...@.Q......F.F.|
-000002a0  4f 86 c7 f9 a4 c2 41 34  ac cc f6 ea b0 ab 39 18  |O.....A4......9.|
-000002b0  16 03 03 00 04 0e 00 00  00                       |.........|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 5b 43 6f db 52  |...........[Co.R|
-00000010  56 e3 d9 4b 1e c8 95 8b  78 a6 19 00 44 9c 44 b4  |V..K....x...D.D.|
-00000020  f7 fe d4 3f 69 ea 9c 67  d3 48 b8 c5 93 bc 22 f1  |...?i..g.H....".|
-00000030  a9 0e 81 82 d0 cf dc 0b  ea f0 02 67 92 8d 72 40  |...........g..r@|
-00000040  25 bb f3 88 53 c0 2f ba  38 ef da d1 7c 73 84 ec  |%...S./.8...|s..|
-00000050  61 96 b9 d4 93 06 4a 06  7b 6d 40 e7 bb 15 59 6e  |a.....J.{m@...Yn|
-00000060  ad 31 71 eb cf 84 57 3b  0c ad aa 70 02 63 24 a9  |.1q...W;...p.c$.|
-00000070  7c a1 9a 6d b7 e0 4c d5  67 4c ce 53 9d b6 31 de  ||..m..L.gL.S..1.|
-00000080  69 b9 f5 ca a8 e3 ea d6  f5 a3 f3 14 03 03 00 01  |i...............|
-00000090  01 16 03 03 00 24 66 ae  13 67 70 20 f5 f5 76 03  |.....$f..gp ..v.|
-000000a0  11 6e 32 a6 73 a2 70 42  ab 4f 16 93 d2 fa a1 ac  |.n2.s.pB.O......|
-000000b0  4e b2 08 4a a9 b5 20 aa  80 b6                    |N..J.. ...|
->>> Flow 4 (server to client)
-00000000  16 03 03 00 82 04 00 00  7e 00 00 00 00 00 78 50  |........~.....xP|
-00000010  46 ad c1 db a8 38 86 7b  2b bb fd d0 c3 42 3e 00  |F....8.{+....B>.|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 94  |................|
-00000030  6f 2c b5 83 61 bd 50 da  49 7f 8b 8f 58 57 00 a1  |o,..a.P.I...XW..|
-00000040  11 0d 4a 9d 8a 39 dd 85  23 c0 eb 9d 1a 45 93 92  |..J..9..#....E..|
-00000050  e7 af 15 a3 a4 48 da f9  a4 d8 8e cb 6c 3d 44 77  |.....H......l=Dw|
-00000060  f9 c4 83 89 85 33 94 c1  c6 20 9a 73 44 83 89 5e  |.....3... .sD..^|
-00000070  59 ee 05 c6 7e 8d e9 7d  7b f8 84 46 b6 7d 43 ec  |Y...~..}{..F.}C.|
-00000080  f1 af 1f 0f 35 b4 1c 14  03 03 00 01 01 16 03 03  |....5...........|
-00000090  00 24 8c 0d bd bc 34 93  ed ad 80 21 6d 08 e4 0e  |.$....4....!m...|
-000000a0  67 4f 99 8d df 2a 2d 4f  13 39 82 be a1 d2 1f 75  |gO...*-O.9.....u|
-000000b0  73 c8 b2 ce 41 0c 17 03  03 00 21 d8 c2 50 d6 11  |s...A.....!..P..|
-000000c0  bc 86 58 68 0e 60 4a 47  a5 d0 12 7e a3 b5 be 64  |..Xh.`JG...~...d|
-000000d0  e6 b1 bc 62 70 85 d4 7c  cd fe 67 cf 15 03 03 00  |...bp..|..g.....|
-000000e0  16 e4 1c d5 f4 f7 d0 f5  b2 b3 2b 3d b0 7d c0 23  |..........+=.}.#|
-000000f0  e2 5c a5 c7 a4 23 fa                              |.\...#.|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-3DES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-3DES
deleted file mode 100644
index 7457626..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-3DES
+++ /dev/null
@@ -1,77 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 5a 01 00 00  56 03 03 ac 1d 0b 6e f3  |....Z...V.....n.|
-00000010  25 04 00 97 a0 79 39 c5  ef 95 8b e3 c1 87 0d 1c  |%....y9.........|
-00000020  0b c3 39 3e ff 23 0e 3c  28 8f 75 00 00 04 00 0a  |..9>.#.<(.u.....|
-00000030  00 ff 01 00 00 29 00 0d  00 20 00 1e 06 01 06 02  |.....)... ......|
-00000040  06 03 05 01 05 02 05 03  04 01 04 02 04 03 03 01  |................|
-00000050  03 02 03 03 02 01 02 02  02 03 00 0f 00 01 01     |...............|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 0a 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  03 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 03 00  |..A4......9.....|
-000002b0  04 0e 00 00 00                                    |.....|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 15 75 c5 63 e0  |............u.c.|
-00000010  c3 a5 89 dd b3 bf 03 1d  bd 62 86 2e 10 98 79 cb  |.........b....y.|
-00000020  40 3d 9b 36 7e 55 65 d7  80 0a c5 24 ff ad 98 d5  |@=.6~Ue....$....|
-00000030  d4 d9 4e 1b ed 50 0a fa  8a 3e f3 01 c4 e3 47 f7  |..N..P...>....G.|
-00000040  bd 81 fc 33 0b 61 6b b5  3f 38 9b 24 cd 7d 46 66  |...3.ak.?8.$.}Ff|
-00000050  18 87 ea 67 04 b7 ad 23  ac 64 4e 21 cd 29 9f 60  |...g...#.dN!.).`|
-00000060  0e c1 ca 3d 25 d6 d5 2b  e2 60 dc b5 57 be c0 b8  |...=%..+.`..W...|
-00000070  b6 35 25 96 5b 36 55 53  86 b7 90 ef 6c bf 45 2a  |.5%.[6US....l.E*|
-00000080  3d a0 af 08 f0 8a 9c d0  d8 6b 88 14 03 03 00 01  |=........k......|
-00000090  01 16 03 03 00 30 c5 0f  b8 12 c6 5a 42 6a d8 3f  |.....0.....ZBj.?|
-000000a0  f5 49 e4 9a 5d b7 93 90  e7 09 1f 68 40 9d 33 a9  |.I..]......h@.3.|
-000000b0  21 fa 9c 12 c7 7c d4 bf  91 c2 f8 ac 27 b9 8b b6  |!....|......'...|
-000000c0  34 6e f3 c0 fb 83                                 |4n....|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 30 00 00 00 00 00  |..........0.....|
-00000010  00 00 00 c1 a2 65 c1 36  63 85 cd ca 5a eb 50 ab  |.....e.6c...Z.P.|
-00000020  bb ec 43 30 37 8f 71 b9  b7 2d 1b bb a2 88 fa d5  |..C07.q..-......|
-00000030  b4 a5 c5 4b 19 71 53 46  7d bb d0 17 03 03 00 30  |...K.qSF}......0|
-00000040  00 00 00 00 00 00 00 00  6a a1 3d c6 35 a0 58 c4  |........j.=.5.X.|
-00000050  ef 12 f2 59 1e 02 42 33  42 5f fe 87 a2 1a ce b7  |...Y..B3B_......|
-00000060  0d d2 36 7c 7f 1a 4c 79  1f 38 34 58 b3 05 fb 96  |..6|..Ly.84X....|
-00000070  15 03 03 00 20 00 00 00  00 00 00 00 00 a1 89 42  |.... ..........B|
-00000080  bc 58 1f 2f 9b c4 d7 e2  d1 ce 1c c9 e0 a5 47 be  |.X./..........G.|
-00000090  63 0c a4 bf 26                                    |c...&|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-AES b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-AES
deleted file mode 100644
index 4ca860d..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-AES
+++ /dev/null
@@ -1,81 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 5a 01 00 00  56 03 03 be 9a 2f 46 66  |....Z...V..../Ff|
-00000010  a3 b3 10 62 63 b6 32 cb  de 1e eb 76 13 50 60 d0  |...bc.2....v.P`.|
-00000020  ee 40 a9 cd 50 ae d8 86  10 37 8b 00 00 04 00 2f  |.@..P....7...../|
-00000030  00 ff 01 00 00 29 00 0d  00 20 00 1e 06 01 06 02  |.....)... ......|
-00000040  06 03 05 01 05 02 05 03  04 01 04 02 04 03 03 01  |................|
-00000050  03 02 03 03 02 01 02 02  02 03 00 0f 00 01 01     |...............|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 2f 00 00  |............./..|
-00000030  05 ff 01 00 01 00 16 03  03 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 03 00  |..A4......9.....|
-000002b0  04 0e 00 00 00                                    |.....|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 61 b4 31 93 2b  |...........a.1.+|
-00000010  d5 e8 06 74 b1 f6 d6 5f  a3 92 78 b6 cf bf 7f ea  |...t..._..x.....|
-00000020  a2 07 1e 90 94 68 5b 19  ae d4 e3 11 78 96 58 fd  |.....h[.....x.X.|
-00000030  96 18 f2 09 58 dc 39 a1  d9 9e 83 f0 24 45 6e 6b  |....X.9.....$Enk|
-00000040  e6 5e e7 cb 94 42 00 10  64 d5 d2 bc 80 23 bd fe  |.^...B..d....#..|
-00000050  5c 3e 3a 80 ff 38 b8 dc  ff 25 ba b0 0a cc ef 94  |\>:..8...%......|
-00000060  a1 31 bd 04 93 91 86 6e  8b fd a1 9d 01 ee 91 a6  |.1.....n........|
-00000070  44 8b 21 55 52 67 3e b1  e4 6e bd 1f 07 85 e1 97  |D.!URg>..n......|
-00000080  7f 55 70 00 5f f4 4b e6  50 45 f7 14 03 03 00 01  |.Up._.K.PE......|
-00000090  01 16 03 03 00 40 71 ff  ab 6d 79 3c da dc 5b 34  |.....@q..my<..[4|
-000000a0  48 39 48 08 e3 29 cb 53  21 fd 67 93 0b f8 81 47  |H9H..).S!.g....G|
-000000b0  40 7f 23 50 5f 94 db 2b  7b 7e 9f 0b bf 38 59 d9  |@.#P_..+{~...8Y.|
-000000c0  6b 57 8f 1e 83 eb 93 2c  62 12 31 c6 f5 21 f2 22  |kW.....,b.1..!."|
-000000d0  7a 82 e9 e6 ec 38                                 |z....8|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 40 00 00 00 00 00  |..........@.....|
-00000010  00 00 00 00 00 00 00 00  00 00 00 45 87 33 41 c1  |...........E.3A.|
-00000020  b8 e7 4c 11 1c 1b 7b 55  51 85 06 01 c1 b6 87 6b  |..L...{UQ......k|
-00000030  01 b3 56 c4 5a 37 ea b6  3a c4 b0 da 1b 5c 15 d4  |..V.Z7..:....\..|
-00000040  03 5a 57 e9 9a 56 16 a5  fa 77 1c 17 03 03 00 40  |.ZW..V...w.....@|
-00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000060  6f 2e 7c ba 3d 85 4c 7b  1f 13 a5 d6 97 e6 67 f4  |o.|.=.L{......g.|
-00000070  24 d5 a8 d4 26 41 64 0a  fd b3 2e a0 a2 7a 2b 54  |$...&Ad......z+T|
-00000080  a4 1d 6e fe 4c c4 73 e3  76 d0 3a 60 52 df b0 53  |..n.L.s.v.:`R..S|
-00000090  15 03 03 00 30 00 00 00  00 00 00 00 00 00 00 00  |....0...........|
-000000a0  00 00 00 00 00 8b 0a 6d  14 3b 84 bc 7d c6 8d 9d  |.......m.;..}...|
-000000b0  d5 27 32 84 4b 14 75 42  0f aa 5e 88 ba fa a2 c7  |.'2.K.uB..^.....|
-000000c0  16 93 8a c4 fd                                    |.....|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-AES-GCM b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-AES-GCM
deleted file mode 100644
index 7a26ebd..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-AES-GCM
+++ /dev/null
@@ -1,87 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 9a 01 00 00  96 03 03 16 dc f8 f5 3a  |...............:|
-00000010  13 32 e6 1f bd f6 3c 66  b7 4c 67 17 ee b2 2a ba  |.2....<f.Lg...*.|
-00000020  68 5b 8e b1 7c 8f 71 d6  6c 30 e1 00 00 04 c0 2f  |h[..|.q.l0...../|
-00000030  00 ff 01 00 00 69 00 0b  00 04 03 00 01 02 00 0a  |.....i..........|
-00000040  00 34 00 32 00 0e 00 0d  00 19 00 0b 00 0c 00 18  |.4.2............|
-00000050  00 09 00 0a 00 16 00 17  00 08 00 06 00 07 00 14  |................|
-00000060  00 15 00 04 00 05 00 12  00 13 00 01 00 02 00 03  |................|
-00000070  00 0f 00 10 00 11 00 0d  00 20 00 1e 06 01 06 02  |......... ......|
-00000080  06 03 05 01 05 02 05 03  04 01 04 02 04 03 03 01  |................|
-00000090  03 02 03 03 02 01 02 02  02 03 00 0f 00 01 01     |...............|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 c0 2f 00 00  |............./..|
-00000030  05 ff 01 00 01 00 16 03  03 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 03 00  |..A4......9.....|
-000002b0  cd 0c 00 00 c9 03 00 17  41 04 1e 18 37 ef 0d 19  |........A...7...|
-000002c0  51 88 35 75 71 b5 e5 54  5b 12 2e 8f 09 67 fd a7  |Q.5uq..T[....g..|
-000002d0  24 20 3e b2 56 1c ce 97  28 5e f8 2b 2d 4f 9e f1  |$ >.V...(^.+-O..|
-000002e0  07 9f 6c 4b 5b 83 56 e2  32 42 e9 58 b6 d7 49 a6  |..lK[.V.2B.X..I.|
-000002f0  b5 68 1a 41 03 56 6b dc  5a 89 05 01 00 80 40 b3  |.h.A.Vk.Z.....@.|
-00000300  66 ee 53 3c 80 f4 da d1  de e6 fe 50 c8 89 60 d5  |f.S<.......P..`.|
-00000310  e4 80 73 39 91 79 6c cf  89 bb a5 da e4 c7 e5 0d  |..s9.yl.........|
-00000320  13 a6 76 24 65 1a a2 b8  cb 95 c2 c6 9d 66 74 57  |..v$e........ftW|
-00000330  9e 90 4f 48 77 88 3a b4  f3 fa 88 ab 61 22 d3 40  |..OHw.:.....a".@|
-00000340  08 c4 0a 69 19 ed c3 ea  d8 15 79 12 d5 ac 8d af  |...i......y.....|
-00000350  41 7d 87 4b a9 ff f8 cb  24 55 88 38 34 11 a5 bd  |A}.K....$U.84...|
-00000360  c1 d6 e5 86 d5 64 b5 f2  df c8 03 f2 a2 6b ff f4  |.....d.......k..|
-00000370  a8 38 e0 18 04 d4 cd bd  e0 cc 63 fc 3f 8b 16 03  |.8........c.?...|
-00000380  03 00 04 0e 00 00 00                              |.......|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 de de ff 8c df  |....F...BA......|
-00000010  d8 4c 72 af 29 3c 4d e0  ed 0f 34 cc fd 2d 52 63  |.Lr.)<M...4..-Rc|
-00000020  94 e8 74 f1 0b 18 69 28  ed 1e f7 62 4e 4f 2c 14  |..t...i(...bNO,.|
-00000030  61 4b 9f 55 d8 70 59 8f  4b a8 ab c6 d2 cd aa 59  |aK.U.pY.K......Y|
-00000040  8a ef 9b b3 f6 ba 52 e5  51 bb a1 14 03 03 00 01  |......R.Q.......|
-00000050  01 16 03 03 00 28 44 1c  eb 89 59 bb ad fb 9f 3f  |.....(D...Y....?|
-00000060  56 06 54 ae 27 6d e4 47  3c 0c 60 30 db 0e d6 0e  |V.T.'m.G<.`0....|
-00000070  9d 0d a9 a0 e7 25 26 6e  99 d0 8f e0 1b 9d        |.....%&n......|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 00 00 00 00 00  |..........(.....|
-00000010  00 00 00 92 90 01 f0 70  fa 57 2e 40 d3 4c ef 6a  |.......p.W.@.L.j|
-00000020  03 0c 56 65 f7 c0 3b d0  8a db 48 c9 ae 58 3e 7c  |..Ve..;...H..X>||
-00000030  d1 48 67 17 03 03 00 25  00 00 00 00 00 00 00 01  |.Hg....%........|
-00000040  9e 35 a0 13 73 da 3f 26  ff 1d 90 08 e9 cc 40 7e  |.5..s.?&......@~|
-00000050  82 f3 5e 6e b4 8e 5a 39  7f a4 09 60 b2 15 03 03  |..^n..Z9...`....|
-00000060  00 1a 00 00 00 00 00 00  00 02 04 95 9b 2d 17 1c  |.............-..|
-00000070  6a bc 26 f7 6c 8e f1 c0  0e 82 4a 44              |j.&.l.....JD|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-AES256-GCM-SHA384 b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-AES256-GCM-SHA384
deleted file mode 100644
index d59645c..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-AES256-GCM-SHA384
+++ /dev/null
@@ -1,87 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 9a 01 00 00  96 03 03 5d 6b 2a ff 74  |...........]k*.t|
-00000010  88 f1 68 8d 1b eb c3 84  34 b5 19 0a 7d f1 9a 0f  |..h.....4...}...|
-00000020  4d c3 0a d7 98 b8 72 e0  73 e4 38 00 00 04 c0 30  |M.....r.s.8....0|
-00000030  00 ff 01 00 00 69 00 0b  00 04 03 00 01 02 00 0a  |.....i..........|
-00000040  00 34 00 32 00 0e 00 0d  00 19 00 0b 00 0c 00 18  |.4.2............|
-00000050  00 09 00 0a 00 16 00 17  00 08 00 06 00 07 00 14  |................|
-00000060  00 15 00 04 00 05 00 12  00 13 00 01 00 02 00 03  |................|
-00000070  00 0f 00 10 00 11 00 0d  00 20 00 1e 06 01 06 02  |......... ......|
-00000080  06 03 05 01 05 02 05 03  04 01 04 02 04 03 03 01  |................|
-00000090  03 02 03 03 02 01 02 02  02 03 00 0f 00 01 01     |...............|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 c0 30 00 00  |.............0..|
-00000030  05 ff 01 00 01 00 16 03  03 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 03 00  |..A4......9.....|
-000002b0  cd 0c 00 00 c9 03 00 17  41 04 1e 18 37 ef 0d 19  |........A...7...|
-000002c0  51 88 35 75 71 b5 e5 54  5b 12 2e 8f 09 67 fd a7  |Q.5uq..T[....g..|
-000002d0  24 20 3e b2 56 1c ce 97  28 5e f8 2b 2d 4f 9e f1  |$ >.V...(^.+-O..|
-000002e0  07 9f 6c 4b 5b 83 56 e2  32 42 e9 58 b6 d7 49 a6  |..lK[.V.2B.X..I.|
-000002f0  b5 68 1a 41 03 56 6b dc  5a 89 05 01 00 80 22 6b  |.h.A.Vk.Z....."k|
-00000300  87 4b f8 ba f2 09 91 ee  ce 81 67 d4 fd d8 b5 07  |.K........g.....|
-00000310  fe c3 88 96 ca e3 3a f0  87 cc ae 44 94 8e 8f 70  |......:....D...p|
-00000320  79 cd de a2 26 4e 17 45  d7 ea 0f 95 a6 c9 7b 17  |y...&N.E......{.|
-00000330  68 7c f5 e8 6c d5 87 6d  5a 7e 53 af 95 0c 42 91  |h|..l..mZ~S...B.|
-00000340  c0 07 18 75 fd 74 1c ad  ef df f8 41 b1 ad fc 36  |...u.t.....A...6|
-00000350  19 31 cf c8 3f 36 55 dd  54 ac 44 a9 3a d1 ae 23  |.1..?6U.T.D.:..#|
-00000360  0a 18 bf b7 6f c7 bc a6  70 50 5e 50 dd da ff 5b  |....o...pP^P...[|
-00000370  67 7d 0a f5 70 a0 8c 88  d9 38 d4 bf a9 c3 16 03  |g}..p....8......|
-00000380  03 00 04 0e 00 00 00                              |.......|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 46 10 00 00  42 41 04 d0 f7 11 ae 9f  |....F...BA......|
-00000010  ec 2e ac 8e 97 6c 58 0e  57 32 8e ac fa 3e af 36  |.....lX.W2...>.6|
-00000020  22 e1 41 2b d3 d1 9c c2  1d 51 c0 e4 20 b3 4c 85  |".A+.....Q.. .L.|
-00000030  b8 bd f2 d1 c6 2f 7d 83  c7 43 d9 31 36 1a 83 ca  |...../}..C.16...|
-00000040  c6 89 f8 ba 8c d1 7e 99  04 6e 92 14 03 03 00 01  |......~..n......|
-00000050  01 16 03 03 00 28 32 67  c1 6e 5e 1e 4b 51 1b 70  |.....(2g.n^.KQ.p|
-00000060  54 b9 1d 69 79 38 bd fa  7c 6b 58 71 af 72 08 2d  |T..iy8..|kXq.r.-|
-00000070  55 df 24 be 5b 41 0a ef  0e 90 cf d9 62 81        |U.$.[A......b.|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 28 00 00 00 00 00  |..........(.....|
-00000010  00 00 00 87 2a 3e 09 54  54 c3 58 c0 5b 7b 91 00  |....*>.TT.X.[{..|
-00000020  c4 07 98 9e de 1f f8 04  bb d7 42 04 55 7d 18 a4  |..........B.U}..|
-00000030  41 7c a6 17 03 03 00 25  00 00 00 00 00 00 00 01  |A|.....%........|
-00000040  ab 23 05 51 b4 60 a2 77  01 58 be a6 9f 89 2b b5  |.#.Q.`.w.X....+.|
-00000050  77 6b 19 23 67 f7 89 f1  ef d6 1b f5 e7 15 03 03  |wk.#g...........|
-00000060  00 1a 00 00 00 00 00 00  00 02 8a bf f0 fb 9f 56  |...............V|
-00000070  36 f1 92 49 a9 e5 40 87  f9 87 9e 4d              |6..I..@....M|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-RC4 b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-RC4
deleted file mode 100644
index 13163d6..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-RSA-RC4
+++ /dev/null
@@ -1,73 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 5a 01 00 00  56 03 03 8a fe f5 09 70  |....Z...V......p|
-00000010  8e 6b e3 2b 12 ff d1 b2  ae 15 bf 47 0e ca 5c b5  |.k.+.......G..\.|
-00000020  bb 0e ad af e5 a6 7e 36  c5 a4 c3 00 00 04 00 05  |......~6........|
-00000030  00 ff 01 00 00 29 00 0d  00 20 00 1e 06 01 06 02  |.....)... ......|
-00000040  06 03 05 01 05 02 05 03  04 01 04 02 04 03 03 01  |................|
-00000050  03 02 03 03 02 01 02 02  02 03 00 0f 00 01 01     |...............|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 05 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  03 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 03 00  |..A4......9.....|
-000002b0  04 0e 00 00 00                                    |.....|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 1c f7 2c 18 38  |.............,.8|
-00000010  d9 41 b5 ab b7 35 2b 75  2d 66 ba c8 70 c2 19 1c  |.A...5+u-f..p...|
-00000020  f2 6d d9 a9 a8 40 8e b5  2c 75 99 06 a5 25 be 0d  |.m...@..,u...%..|
-00000030  b4 b0 9b aa fc 6b 12 a5  b3 e7 02 60 aa 25 e9 7f  |.....k.....`.%..|
-00000040  6b f5 c4 7a 1d 16 a5 d1  76 cc d5 a1 18 68 91 c3  |k..z....v....h..|
-00000050  57 b8 10 f2 b8 81 f3 1b  74 ef 6c 37 3e 81 41 09  |W.......t.l7>.A.|
-00000060  2a c5 15 e6 cc bb 74 4c  01 7a b9 82 5c e2 7f b7  |*.....tL.z..\...|
-00000070  ac 2d 76 30 18 30 c2 19  8c 5f f2 80 41 89 bb 47  |.-v0.0..._..A..G|
-00000080  28 3d 61 cc 3c 06 a8 76  93 57 71 14 03 03 00 01  |(=a.<..v.Wq.....|
-00000090  01 16 03 03 00 24 46 34  1f cc eb 53 c7 d2 04 28  |.....$F4...S...(|
-000000a0  b6 3d 3f 39 06 70 56 b7  db eb 53 9c 66 c3 45 9f  |.=?9.pV...S.f.E.|
-000000b0  69 ca 58 8f e7 ba a7 e6  5a 97                    |i.X.....Z.|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 24 78 c3 02 89 60  |..........$x...`|
-00000010  e7 72 9f 51 87 14 ca 2e  0d 79 98 eb 1e 39 62 f9  |.r.Q.....y...9b.|
-00000020  fc a5 c9 2c f8 0c 04 16  60 70 90 b7 31 f8 30 17  |...,....`p..1.0.|
-00000030  03 03 00 21 6a b7 24 73  a7 0d 17 04 d7 54 a8 ea  |...!j.$s.....T..|
-00000040  28 4e f2 0a ef 87 d5 a9  b8 84 81 46 8e 97 d1 ae  |(N.........F....|
-00000050  3c cc b1 6b 72 15 03 03  00 16 1a bb 2f df ae 3e  |<..kr......./..>|
-00000060  a7 89 69 3e 35 f2 f6 cd  35 60 29 3a 6f be 32 0d  |..i>5...5`):o.2.|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-Resume b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-Resume
deleted file mode 100644
index 8cacd21..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-Resume
+++ /dev/null
@@ -1,37 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 f6 01 00 00  f2 03 03 53 1e 13 2e bd  |...........S....|
-00000010  ad 66 fd 77 1a ad 5f 4d  cb bd 2e ca b5 c2 45 1d  |.f.w.._M......E.|
-00000020  7c 83 9d 62 3e 39 9c ce  78 99 e7 20 b4 06 b0 ec  ||..b>9..x.. ....|
-00000030  cf b7 52 6e 38 10 31 37  b2 e6 58 0f fa e3 b0 cb  |..Rn8.17..X.....|
-00000040  20 a4 d2 4b f3 7d 92 e6  7e 13 37 08 00 04 00 05  | ..K.}..~.7.....|
-00000050  00 ff 01 00 00 a5 00 23  00 78 50 46 ad c1 db a8  |.......#.xPF....|
-00000060  38 86 7b 2b bb fd d0 c3  42 3e 00 00 00 00 00 00  |8.{+....B>......|
-00000070  00 00 00 00 00 00 00 00  00 00 94 6f 2c b5 83 61  |...........o,..a|
-00000080  c4 74 90 94 e5 6c fd 70  64 57 3a 25 78 bf 9f a0  |.t...l.pdW:%x...|
-00000090  7c 51 bc 2a 69 1e b3 fd  71 34 b7 9a ef cb 49 37  ||Q.*i...q4....I7|
-000000a0  f8 5d 5e 7c cf 6d fc 13  c1 52 79 8e ed c3 84 01  |.]^|.m...Ry.....|
-000000b0  33 94 10 65 34 64 5e b4  9c 07 46 5b 9e d7 5e 55  |3..e4d^...F[..^U|
-000000c0  df fd c0 e9 d2 e8 d3 c6  42 18 ef a5 6c be e8 d2  |........B...l...|
-000000d0  49 c6 00 0d 00 20 00 1e  06 01 06 02 06 03 05 01  |I.... ..........|
-000000e0  05 02 05 03 04 01 04 02  04 03 03 01 03 02 03 03  |................|
-000000f0  02 01 02 02 02 03 00 0f  00 01 01                 |...........|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 51 02 00 00  4d 03 03 00 00 00 00 00  |....Q...M.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 20 b4 06 b0 ec  |........... ....|
-00000030  cf b7 52 6e 38 10 31 37  b2 e6 58 0f fa e3 b0 cb  |..Rn8.17..X.....|
-00000040  20 a4 d2 4b f3 7d 92 e6  7e 13 37 08 00 05 00 00  | ..K.}..~.7.....|
-00000050  05 ff 01 00 01 00 14 03  03 00 01 01 16 03 03 00  |................|
-00000060  24 24 31 13 8c 45 4f 8a  fc 71 50 94 b0 6f 02 5e  |$$1..EO..qP..o.^|
-00000070  da d3 a3 13 8b c8 53 fb  54 8d ef 90 f7 55 b1 be  |......S.T....U..|
-00000080  37 30 05 e5 5d                                    |70..]|
->>> Flow 3 (client to server)
-00000000  14 03 03 00 01 01 16 03  03 00 24 ed dd e4 a5 09  |..........$.....|
-00000010  0d 7c cb e4 90 9c a1 1c  21 f4 13 bd 45 8f f4 d8  |.|......!...E...|
-00000020  7e e2 89 7a 0d f4 75 99  66 8c 05 a3 1a e2 2b     |~..z..u.f.....+|
->>> Flow 4 (server to client)
-00000000  17 03 03 00 21 69 fa 9e  98 fb 7a 95 b1 8e e5 74  |....!i....z....t|
-00000010  03 02 d7 3d 69 c4 b8 c9  5b 49 e3 30 32 e3 c5 6a  |...=i...[I.02..j|
-00000020  fa 20 98 bd 01 ed 15 03  03 00 16 c9 b1 20 1f 30  |. ........... .0|
-00000030  c1 2f 15 75 cd 82 45 de  1a 81 cd dc 10 05 1c 45  |./.u..E........E|
-00000040  dc                                                |.|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ResumeDisabled b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ResumeDisabled
deleted file mode 100644
index 912c178..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-ResumeDisabled
+++ /dev/null
@@ -1,83 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 f6 01 00 00  f2 03 03 aa 0c c2 75 42  |..............uB|
-00000010  62 2a 1d 14 a0 cc a1 e4  a7 19 77 50 80 2b f8 05  |b*........wP.+..|
-00000020  0b fa 60 3a a7 a7 84 d3  e1 68 26 20 68 97 0c ae  |..`:.....h& h...|
-00000030  7b 1d bc 13 14 a8 f6 c1  e1 96 1f 54 18 2c cb 99  |{..........T.,..|
-00000040  17 7d be 45 6a 39 53 c6  50 c7 8c 75 00 04 00 05  |.}.Ej9S.P..u....|
-00000050  00 ff 01 00 00 a5 00 23  00 78 50 46 ad c1 db a8  |.......#.xPF....|
-00000060  38 86 7b 2b bb fd d0 c3  42 3e 00 00 00 00 00 00  |8.{+....B>......|
-00000070  00 00 00 00 00 00 00 00  00 00 94 6f 2c b5 83 61  |...........o,..a|
-00000080  bd 50 da 49 7f 8b 8f 58  57 00 a1 11 0d 4a 9d 8a  |.P.I...XW....J..|
-00000090  39 dd 85 23 c0 eb 9d 1a  45 93 92 e7 af 15 a3 a4  |9..#....E.......|
-000000a0  48 da f9 a4 d8 8e cb 6c  3d 44 77 f9 c4 83 89 85  |H......l=Dw.....|
-000000b0  33 94 c1 c6 20 9a 73 44  83 89 5e 59 ee 05 c6 7e  |3... .sD..^Y...~|
-000000c0  8d e9 7d 7b f8 84 46 b6  7d 43 ec f1 af 1f 0f 35  |..}{..F.}C.....5|
-000000d0  b4 1c 00 0d 00 20 00 1e  06 01 06 02 06 03 05 01  |..... ..........|
-000000e0  05 02 05 03 04 01 04 02  04 03 03 01 03 02 03 03  |................|
-000000f0  02 01 02 02 02 03 00 0f  00 01 01                 |...........|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 05 00 00  |................|
-00000030  05 ff 01 00 01 00 16 03  03 02 71 0b 00 02 6d 00  |..........q...m.|
-00000040  02 6a 00 02 67 30 82 02  63 30 82 01 cc a0 03 02  |.j..g0..c0......|
-00000050  01 02 02 09 00 a2 73 00  0c 81 00 cb f3 30 0d 06  |......s......0..|
-00000060  09 2a 86 48 86 f7 0d 01  01 0b 05 00 30 2b 31 17  |.*.H........0+1.|
-00000070  30 15 06 03 55 04 0a 13  0e 47 6f 6f 67 6c 65 20  |0...U....Google |
-00000080  54 45 53 54 49 4e 47 31  10 30 0e 06 03 55 04 03  |TESTING1.0...U..|
-00000090  13 07 47 6f 20 52 6f 6f  74 30 1e 17 0d 31 35 30  |..Go Root0...150|
-000000a0  31 30 31 30 30 30 30 30  30 5a 17 0d 32 35 30 31  |101000000Z..2501|
-000000b0  30 31 30 30 30 30 30 30  5a 30 26 31 17 30 15 06  |01000000Z0&1.0..|
-000000c0  03 55 04 0a 13 0e 47 6f  6f 67 6c 65 20 54 45 53  |.U....Google TES|
-000000d0  54 49 4e 47 31 0b 30 09  06 03 55 04 03 13 02 47  |TING1.0...U....G|
-000000e0  6f 30 81 9f 30 0d 06 09  2a 86 48 86 f7 0d 01 01  |o0..0...*.H.....|
-000000f0  01 05 00 03 81 8d 00 30  81 89 02 81 81 00 af 87  |.......0........|
-00000100  88 f6 20 1b 95 65 6c 14  ab 44 05 af 3b 45 14 e3  |.. ..el..D..;E..|
-00000110  b7 6d fd 00 63 4d 95 7f  fe 6a 62 35 86 c0 4a f9  |.m..cM...jb5..J.|
-00000120  18 7c f6 aa 25 5e 7a 64  31 66 00 ba f4 8e 92 af  |.|..%^zd1f......|
-00000130  c7 6b d8 76 d4 f3 5f 41  cb 6e 56 15 97 1b 97 c1  |.k.v.._A.nV.....|
-00000140  3c 12 39 21 66 3d 2b 16  d1 bc db 1c c0 a7 da b7  |<.9!f=+.........|
-00000150  ca ad ba da cb d5 21 50  ec de 8d ab d1 6b 81 4b  |......!P.....k.K|
-00000160  89 02 f3 c4 be c1 6c 89  b1 44 84 bd 21 d1 04 7d  |......l..D..!..}|
-00000170  9d 16 4d f9 82 15 f6 ef  fa d6 09 47 f2 fb 02 03  |..M........G....|
-00000180  01 00 01 a3 81 93 30 81  90 30 0e 06 03 55 1d 0f  |......0..0...U..|
-00000190  01 01 ff 04 04 03 02 05  a0 30 1d 06 03 55 1d 25  |.........0...U.%|
-000001a0  04 16 30 14 06 08 2b 06  01 05 05 07 03 01 06 08  |..0...+.........|
-000001b0  2b 06 01 05 05 07 03 02  30 0c 06 03 55 1d 13 01  |+.......0...U...|
-000001c0  01 ff 04 02 30 00 30 19  06 03 55 1d 0e 04 12 04  |....0.0...U.....|
-000001d0  10 12 50 8d 89 6f 1b d1  dc 54 4d 6e cb 69 5e 06  |..P..o...TMn.i^.|
-000001e0  f4 30 1b 06 03 55 1d 23  04 14 30 12 80 10 bf 3d  |.0...U.#..0....=|
-000001f0  b6 a9 66 f2 b8 40 cf ea  b4 03 78 48 1a 41 30 19  |..f..@....xH.A0.|
-00000200  06 03 55 1d 11 04 12 30  10 82 0e 65 78 61 6d 70  |..U....0...examp|
-00000210  6c 65 2e 67 6f 6c 61 6e  67 30 0d 06 09 2a 86 48  |le.golang0...*.H|
-00000220  86 f7 0d 01 01 0b 05 00  03 81 81 00 92 7c af 91  |.............|..|
-00000230  55 12 18 96 59 31 a6 48  40 d5 2d d5 ee bb 02 a0  |U...Y1.H@.-.....|
-00000240  f5 c2 1e 7c 9b b3 30 7d  3c dc 76 da 4f 3d c0 fa  |...|..0}<.v.O=..|
-00000250  ae 2d 33 24 6b 03 7b 1b  67 59 11 21 b5 11 bc 77  |.-3$k.{.gY.!...w|
-00000260  b9 d9 e0 6e a8 2d 2e 35  fa 64 5f 22 3e 63 10 6b  |...n.-.5.d_">c.k|
-00000270  be ff 14 86 6d 0d f0 15  31 a8 14 38 1e 3b 84 87  |....m...1..8.;..|
-00000280  2c cb 98 ed 51 76 b9 b1  4f dd db 9b 84 04 86 40  |,...Qv..O......@|
-00000290  fa 51 dd ba b4 8d eb e3  46 de 46 b9 4f 86 c7 f9  |.Q......F.F.O...|
-000002a0  a4 c2 41 34 ac cc f6 ea  b0 ab 39 18 16 03 03 00  |..A4......9.....|
-000002b0  04 0e 00 00 00                                    |.....|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 ac 10 32 61 b0  |.............2a.|
-00000010  03 e3 1e 2f 89 91 5f d6  4c e0 82 a7 82 41 67 d3  |.../.._.L....Ag.|
-00000020  5f b3 68 2d c0 d1 6f 03  7b 79 94 cc bb 35 6c 8a  |_.h-..o.{y...5l.|
-00000030  bf 1c 83 ff 88 91 5c 04  64 cc a0 df 0b 08 8c 0f  |......\.d.......|
-00000040  72 13 17 9f 27 14 8d 9a  af 17 70 41 44 9f 89 8c  |r...'.....pAD...|
-00000050  fa e4 66 33 4d bd 2f 93  2a 1e 85 a1 af 9e 27 12  |..f3M./.*.....'.|
-00000060  59 a4 13 67 56 85 c2 86  47 f8 c5 49 8f a4 c2 6e  |Y..gV...G..I...n|
-00000070  04 78 0f 11 2b fb 7e 34  b8 eb 25 93 71 ab 9f f5  |.x..+.~4..%.q...|
-00000080  93 df 2b c3 1e 9e 6a 9e  e3 57 aa 14 03 03 00 01  |..+...j..W......|
-00000090  01 16 03 03 00 24 e0 13  15 10 4c db f3 b6 de d2  |.....$....L.....|
-000000a0  68 02 f5 ea 1f 8e 58 70  4a 5a 78 d9 66 c5 74 77  |h.....XpJZx.f.tw|
-000000b0  a0 3a ec d8 b7 42 e3 a5  d4 62                    |.:...B...b|
->>> Flow 4 (server to client)
-00000000  14 03 03 00 01 01 16 03  03 00 24 e9 c1 1f 5b e6  |..........$...[.|
-00000010  c1 d5 8a 14 eb c6 41 c1  77 6d 59 83 b6 95 34 f9  |......A.wmY...4.|
-00000020  7b a1 c9 9d 58 a5 b2 1b  33 6e 04 ab e0 03 61 17  |{...X...3n....a.|
-00000030  03 03 00 21 67 8b 55 43  d7 a7 05 c9 1f a0 d3 65  |...!g.UC.......e|
-00000040  30 36 07 8f d8 52 7e 40  79 31 2e 1c 1a c2 a6 fe  |06...R~@y1......|
-00000050  e0 39 4d a0 5d 15 03 03  00 16 b8 94 fb 17 e5 1d  |.9M.]...........|
-00000060  2e 28 95 cf 02 85 8e 11  2e 16 b1 53 72 aa a4 94  |.(.........Sr...|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-SNI b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-SNI
deleted file mode 100644
index aee5742..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-SNI
+++ /dev/null
@@ -1,64 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 6e 01 00 00  6a 03 03 be 99 22 5c d2  |....n...j...."\.|
-00000010  02 c7 a6 be f3 33 7a d4  76 1f cf 1e 39 0b 25 7c  |.....3z.v...9.%||
-00000020  32 70 e4 8c 49 a6 87 b9  c1 2f 6d 00 00 04 00 2f  |2p..I..../m..../|
-00000030  00 ff 01 00 00 3d 00 00  00 10 00 0e 00 00 0b 73  |.....=.........s|
-00000040  6e 69 74 65 73 74 2e 63  6f 6d 00 0d 00 20 00 1e  |nitest.com... ..|
-00000050  06 01 06 02 06 03 05 01  05 02 05 03 04 01 04 02  |................|
-00000060  04 03 03 01 03 02 03 03  02 01 02 02 02 03 00 0f  |................|
-00000070  00 01 01                                          |...|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 2f 00 00  |............./..|
-00000030  05 ff 01 00 01 00 16 03  03 02 00 0b 00 01 fc 00  |................|
-00000040  01 f9 00 01 f6 30 82 01  f2 30 82 01 5d a0 03 02  |.....0...0..]...|
-00000050  01 02 02 01 00 30 0b 06  09 2a 86 48 86 f7 0d 01  |.....0...*.H....|
-00000060  01 05 30 28 31 10 30 0e  06 03 55 04 0a 13 07 41  |..0(1.0...U....A|
-00000070  63 6d 65 20 43 6f 31 14  30 12 06 03 55 04 03 13  |cme Co1.0...U...|
-00000080  0b 73 6e 69 74 65 73 74  2e 63 6f 6d 30 1e 17 0d  |.snitest.com0...|
-00000090  31 32 30 34 31 31 31 37  34 30 33 35 5a 17 0d 31  |120411174035Z..1|
-000000a0  33 30 34 31 31 31 37 34  35 33 35 5a 30 28 31 10  |30411174535Z0(1.|
-000000b0  30 0e 06 03 55 04 0a 13  07 41 63 6d 65 20 43 6f  |0...U....Acme Co|
-000000c0  31 14 30 12 06 03 55 04  03 13 0b 73 6e 69 74 65  |1.0...U....snite|
-000000d0  73 74 2e 63 6f 6d 30 81  9d 30 0b 06 09 2a 86 48  |st.com0..0...*.H|
-000000e0  86 f7 0d 01 01 01 03 81  8d 00 30 81 89 02 81 81  |..........0.....|
-000000f0  00 bb 79 d6 f5 17 b5 e5  bf 46 10 d0 dc 69 be e6  |..y......F...i..|
-00000100  2b 07 43 5a d0 03 2d 8a  7a 43 85 b7 14 52 e7 a5  |+.CZ..-.zC...R..|
-00000110  65 4c 2c 78 b8 23 8c b5  b4 82 e5 de 1f 95 3b 7e  |eL,x.#........;~|
-00000120  62 a5 2c a5 33 d6 fe 12  5c 7a 56 fc f5 06 bf fa  |b.,.3...\zV.....|
-00000130  58 7b 26 3f b5 cd 04 d3  d0 c9 21 96 4a c7 f4 54  |X{&?......!.J..T|
-00000140  9f 5a bf ef 42 71 00 fe  18 99 07 7f 7e 88 7d 7d  |.Z..Bq......~.}}|
-00000150  f1 04 39 c4 a2 2e db 51  c9 7c e3 c0 4c 3b 32 66  |..9....Q.|..L;2f|
-00000160  01 cf af b1 1d b8 71 9a  1d db db 89 6b ae da 2d  |......q.....k..-|
-00000170  79 02 03 01 00 01 a3 32  30 30 30 0e 06 03 55 1d  |y......2000...U.|
-00000180  0f 01 01 ff 04 04 03 02  00 a0 30 0d 06 03 55 1d  |..........0...U.|
-00000190  0e 04 06 04 04 01 02 03  04 30 0f 06 03 55 1d 23  |.........0...U.#|
-000001a0  04 08 30 06 80 04 01 02  03 04 30 0b 06 09 2a 86  |..0.......0...*.|
-000001b0  48 86 f7 0d 01 01 05 03  81 81 00 89 c6 45 5f 1c  |H............E_.|
-000001c0  1f 5e f8 eb 1a b1 74 ee  24 39 05 9f 5c 42 59 bb  |.^....t.$9..\BY.|
-000001d0  1a 8d 86 cd b1 d0 56 f5  6a 71 7d a4 0e 95 ab 90  |......V.jq}.....|
-000001e0  f5 9e 8d ea f6 27 c1 57  99 50 94 db 08 02 26 6e  |.....'.W.P....&n|
-000001f0  b3 4f c6 84 2d ea 8a 4b  68 d9 c1 38 91 03 ab 84  |.O..-..Kh..8....|
-00000200  fb 9e 1f 85 d9 b5 d2 3f  f2 31 2c 86 70 fb b5 40  |.......?.1,.p..@|
-00000210  14 82 45 a4 eb af e2 64  d9 0c 8a 4c f4 f8 5b 0f  |..E....d...L..[.|
-00000220  ac 12 ac 2f c4 a3 15 4b  ad 52 46 28 68 af 96 c6  |.../...K.RF(h...|
-00000230  2c 65 25 d6 52 b6 e3 18  45 bd cc 16 03 03 00 04  |,e%.R...E.......|
-00000240  0e 00 00 00                                       |....|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 6b 03 31 ca a0  |...........k.1..|
-00000010  62 a2 53 11 ce 13 d9 f6  e7 d4 ec 2e c3 0a 38 56  |b.S...........8V|
-00000020  23 22 67 23 c8 8d 16 b4  3c 0b 26 9f 1c 2d 65 13  |#"g#....<.&..-e.|
-00000030  c3 cb 65 69 b0 47 ff 87  e8 02 56 c4 77 8a 40 29  |..ei.G....V.w.@)|
-00000040  82 62 8b 06 61 0a 1c b3  c7 29 b6 aa c9 96 37 18  |.b..a....)....7.|
-00000050  d0 60 66 63 9b 62 4b 30  cc 03 9c 37 05 c6 32 98  |.`fc.bK0...7..2.|
-00000060  cb a0 e2 e4 38 60 d4 93  99 9a fc 03 66 fb b6 ef  |....8`......f...|
-00000070  8a 1e bb ca 13 c5 d9 7a  7c 3b 50 dc d0 ad 00 b5  |.......z|;P.....|
-00000080  2c dc 1a ef c4 5c af d3  4e cd e6 14 03 03 00 01  |,....\..N.......|
-00000090  01 16 03 03 00 40 42 31  83 8a 2c 86 22 c5 df e5  |.....@B1..,."...|
-000000a0  f2 0b f8 0c 2f 1e 82 f4  69 fe 1d bd 4c db f1 80  |..../...i...L...|
-000000b0  68 30 b7 e3 60 76 b3 f1  52 ae d6 e7 b3 cb 4a e0  |h0..`v..R.....J.|
-000000c0  27 0a c1 1a 72 ed 71 ab  0a fc 10 d9 5e 4d fd 10  |'...r.q.....^M..|
-000000d0  04 92 39 78 be 23                                 |..9x.#|
->>> Flow 4 (server to client)
-00000000  15 03 03 00 02 02 14                              |.......|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificate b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificate
deleted file mode 100644
index 40d3714..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificate
+++ /dev/null
@@ -1,64 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 6e 01 00 00  6a 03 03 23 de 75 da 8e  |....n...j..#.u..|
-00000010  0a 4b 7b e4 cb 34 14 83  be d1 6a 95 25 86 f8 91  |.K{..4....j.%...|
-00000020  d8 bb ac 82 9e 19 d6 9f  52 26 f6 00 00 04 00 2f  |........R&...../|
-00000030  00 ff 01 00 00 3d 00 00  00 10 00 0e 00 00 0b 73  |.....=.........s|
-00000040  6e 69 74 65 73 74 2e 63  6f 6d 00 0d 00 20 00 1e  |nitest.com... ..|
-00000050  06 01 06 02 06 03 05 01  05 02 05 03 04 01 04 02  |................|
-00000060  04 03 03 01 03 02 03 03  02 01 02 02 02 03 00 0f  |................|
-00000070  00 01 01                                          |...|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 2f 00 00  |............./..|
-00000030  05 ff 01 00 01 00 16 03  03 02 00 0b 00 01 fc 00  |................|
-00000040  01 f9 00 01 f6 30 82 01  f2 30 82 01 5d a0 03 02  |.....0...0..]...|
-00000050  01 02 02 01 00 30 0b 06  09 2a 86 48 86 f7 0d 01  |.....0...*.H....|
-00000060  01 05 30 28 31 10 30 0e  06 03 55 04 0a 13 07 41  |..0(1.0...U....A|
-00000070  63 6d 65 20 43 6f 31 14  30 12 06 03 55 04 03 13  |cme Co1.0...U...|
-00000080  0b 73 6e 69 74 65 73 74  2e 63 6f 6d 30 1e 17 0d  |.snitest.com0...|
-00000090  31 32 30 34 31 31 31 37  34 30 33 35 5a 17 0d 31  |120411174035Z..1|
-000000a0  33 30 34 31 31 31 37 34  35 33 35 5a 30 28 31 10  |30411174535Z0(1.|
-000000b0  30 0e 06 03 55 04 0a 13  07 41 63 6d 65 20 43 6f  |0...U....Acme Co|
-000000c0  31 14 30 12 06 03 55 04  03 13 0b 73 6e 69 74 65  |1.0...U....snite|
-000000d0  73 74 2e 63 6f 6d 30 81  9d 30 0b 06 09 2a 86 48  |st.com0..0...*.H|
-000000e0  86 f7 0d 01 01 01 03 81  8d 00 30 81 89 02 81 81  |..........0.....|
-000000f0  00 bb 79 d6 f5 17 b5 e5  bf 46 10 d0 dc 69 be e6  |..y......F...i..|
-00000100  2b 07 43 5a d0 03 2d 8a  7a 43 85 b7 14 52 e7 a5  |+.CZ..-.zC...R..|
-00000110  65 4c 2c 78 b8 23 8c b5  b4 82 e5 de 1f 95 3b 7e  |eL,x.#........;~|
-00000120  62 a5 2c a5 33 d6 fe 12  5c 7a 56 fc f5 06 bf fa  |b.,.3...\zV.....|
-00000130  58 7b 26 3f b5 cd 04 d3  d0 c9 21 96 4a c7 f4 54  |X{&?......!.J..T|
-00000140  9f 5a bf ef 42 71 00 fe  18 99 07 7f 7e 88 7d 7d  |.Z..Bq......~.}}|
-00000150  f1 04 39 c4 a2 2e db 51  c9 7c e3 c0 4c 3b 32 66  |..9....Q.|..L;2f|
-00000160  01 cf af b1 1d b8 71 9a  1d db db 89 6b ae da 2d  |......q.....k..-|
-00000170  79 02 03 01 00 01 a3 32  30 30 30 0e 06 03 55 1d  |y......2000...U.|
-00000180  0f 01 01 ff 04 04 03 02  00 a0 30 0d 06 03 55 1d  |..........0...U.|
-00000190  0e 04 06 04 04 01 02 03  04 30 0f 06 03 55 1d 23  |.........0...U.#|
-000001a0  04 08 30 06 80 04 01 02  03 04 30 0b 06 09 2a 86  |..0.......0...*.|
-000001b0  48 86 f7 0d 01 01 05 03  81 81 00 89 c6 45 5f 1c  |H............E_.|
-000001c0  1f 5e f8 eb 1a b1 74 ee  24 39 05 9f 5c 42 59 bb  |.^....t.$9..\BY.|
-000001d0  1a 8d 86 cd b1 d0 56 f5  6a 71 7d a4 0e 95 ab 90  |......V.jq}.....|
-000001e0  f5 9e 8d ea f6 27 c1 57  99 50 94 db 08 02 26 6e  |.....'.W.P....&n|
-000001f0  b3 4f c6 84 2d ea 8a 4b  68 d9 c1 38 91 03 ab 84  |.O..-..Kh..8....|
-00000200  fb 9e 1f 85 d9 b5 d2 3f  f2 31 2c 86 70 fb b5 40  |.......?.1,.p..@|
-00000210  14 82 45 a4 eb af e2 64  d9 0c 8a 4c f4 f8 5b 0f  |..E....d...L..[.|
-00000220  ac 12 ac 2f c4 a3 15 4b  ad 52 46 28 68 af 96 c6  |.../...K.RF(h...|
-00000230  2c 65 25 d6 52 b6 e3 18  45 bd cc 16 03 03 00 04  |,e%.R...E.......|
-00000240  0e 00 00 00                                       |....|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 a2 99 61 c5 90  |.............a..|
-00000010  47 1a e7 47 56 51 59 e4  6e ab 82 01 18 78 ee 95  |G..GVQY.n....x..|
-00000020  b8 e2 c7 c7 f9 64 98 dd  84 8d 96 d9 2d 08 62 1e  |.....d......-.b.|
-00000030  4f 29 83 b6 93 68 77 7a  14 1b f0 b3 1a 67 7b 7a  |O)...hwz.....g{z|
-00000040  f9 54 f3 7e 6d eb b6 7a  c9 37 70 6a 83 68 f2 15  |.T.~m..z.7pj.h..|
-00000050  81 07 30 6e b8 fa 19 0e  46 dc d6 9a 4a 8e 8d f1  |..0n....F...J...|
-00000060  05 78 60 75 d4 00 d9 1e  11 5f 16 f7 bc 9f e8 8a  |.x`u....._......|
-00000070  c4 3e bd d9 1a b8 67 50  00 be 5f 43 ee 07 ad be  |.>....gP.._C....|
-00000080  f5 85 67 fc 8f c6 87 47  6d 6e b2 14 03 03 00 01  |..g....Gmn......|
-00000090  01 16 03 03 00 40 91 7d  7b 05 99 48 05 70 a9 67  |.....@.}{..H.p.g|
-000000a0  e9 7a 0a c3 6b bf b0 ad  68 65 17 fb 18 bf 8d bd  |.z..k...he......|
-000000b0  e1 4b 12 bf ea 82 9d a6  1e 3a c8 77 65 32 bd 5e  |.K.......:.we2.^|
-000000c0  c4 46 da e7 e1 ac 09 fe  4a ac bc 57 6a 17 7d dc  |.F......J..Wj.}.|
-000000d0  fe 9c d0 d0 6e fc                                 |....n.|
->>> Flow 4 (server to client)
-00000000  15 03 03 00 02 02 14                              |.......|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificateNotFound b/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificateNotFound
deleted file mode 100644
index 904f69e..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/testdata/Server-TLSv12-SNI-GetCertificateNotFound
+++ /dev/null
@@ -1,64 +0,0 @@
->>> Flow 1 (client to server)
-00000000  16 03 01 00 6e 01 00 00  6a 03 03 27 db e3 e8 f4  |....n...j..'....|
-00000010  48 1d 45 d5 20 64 97 b2  20 a6 67 94 7a 1e 87 12  |H.E. d.. .g.z...|
-00000020  25 b1 53 94 27 78 ed ae  58 2f 1b 00 00 04 00 2f  |%.S.'x..X/...../|
-00000030  00 ff 01 00 00 3d 00 00  00 10 00 0e 00 00 0b 73  |.....=.........s|
-00000040  6e 69 74 65 73 74 2e 63  6f 6d 00 0d 00 20 00 1e  |nitest.com... ..|
-00000050  06 01 06 02 06 03 05 01  05 02 05 03 04 01 04 02  |................|
-00000060  04 03 03 01 03 02 03 03  02 01 02 02 02 03 00 0f  |................|
-00000070  00 01 01                                          |...|
->>> Flow 2 (server to client)
-00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
-00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
-00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 2f 00 00  |............./..|
-00000030  05 ff 01 00 01 00 16 03  03 02 00 0b 00 01 fc 00  |................|
-00000040  01 f9 00 01 f6 30 82 01  f2 30 82 01 5d a0 03 02  |.....0...0..]...|
-00000050  01 02 02 01 00 30 0b 06  09 2a 86 48 86 f7 0d 01  |.....0...*.H....|
-00000060  01 05 30 28 31 10 30 0e  06 03 55 04 0a 13 07 41  |..0(1.0...U....A|
-00000070  63 6d 65 20 43 6f 31 14  30 12 06 03 55 04 03 13  |cme Co1.0...U...|
-00000080  0b 73 6e 69 74 65 73 74  2e 63 6f 6d 30 1e 17 0d  |.snitest.com0...|
-00000090  31 32 30 34 31 31 31 37  34 30 33 35 5a 17 0d 31  |120411174035Z..1|
-000000a0  33 30 34 31 31 31 37 34  35 33 35 5a 30 28 31 10  |30411174535Z0(1.|
-000000b0  30 0e 06 03 55 04 0a 13  07 41 63 6d 65 20 43 6f  |0...U....Acme Co|
-000000c0  31 14 30 12 06 03 55 04  03 13 0b 73 6e 69 74 65  |1.0...U....snite|
-000000d0  73 74 2e 63 6f 6d 30 81  9d 30 0b 06 09 2a 86 48  |st.com0..0...*.H|
-000000e0  86 f7 0d 01 01 01 03 81  8d 00 30 81 89 02 81 81  |..........0.....|
-000000f0  00 bb 79 d6 f5 17 b5 e5  bf 46 10 d0 dc 69 be e6  |..y......F...i..|
-00000100  2b 07 43 5a d0 03 2d 8a  7a 43 85 b7 14 52 e7 a5  |+.CZ..-.zC...R..|
-00000110  65 4c 2c 78 b8 23 8c b5  b4 82 e5 de 1f 95 3b 7e  |eL,x.#........;~|
-00000120  62 a5 2c a5 33 d6 fe 12  5c 7a 56 fc f5 06 bf fa  |b.,.3...\zV.....|
-00000130  58 7b 26 3f b5 cd 04 d3  d0 c9 21 96 4a c7 f4 54  |X{&?......!.J..T|
-00000140  9f 5a bf ef 42 71 00 fe  18 99 07 7f 7e 88 7d 7d  |.Z..Bq......~.}}|
-00000150  f1 04 39 c4 a2 2e db 51  c9 7c e3 c0 4c 3b 32 66  |..9....Q.|..L;2f|
-00000160  01 cf af b1 1d b8 71 9a  1d db db 89 6b ae da 2d  |......q.....k..-|
-00000170  79 02 03 01 00 01 a3 32  30 30 30 0e 06 03 55 1d  |y......2000...U.|
-00000180  0f 01 01 ff 04 04 03 02  00 a0 30 0d 06 03 55 1d  |..........0...U.|
-00000190  0e 04 06 04 04 01 02 03  04 30 0f 06 03 55 1d 23  |.........0...U.#|
-000001a0  04 08 30 06 80 04 01 02  03 04 30 0b 06 09 2a 86  |..0.......0...*.|
-000001b0  48 86 f7 0d 01 01 05 03  81 81 00 89 c6 45 5f 1c  |H............E_.|
-000001c0  1f 5e f8 eb 1a b1 74 ee  24 39 05 9f 5c 42 59 bb  |.^....t.$9..\BY.|
-000001d0  1a 8d 86 cd b1 d0 56 f5  6a 71 7d a4 0e 95 ab 90  |......V.jq}.....|
-000001e0  f5 9e 8d ea f6 27 c1 57  99 50 94 db 08 02 26 6e  |.....'.W.P....&n|
-000001f0  b3 4f c6 84 2d ea 8a 4b  68 d9 c1 38 91 03 ab 84  |.O..-..Kh..8....|
-00000200  fb 9e 1f 85 d9 b5 d2 3f  f2 31 2c 86 70 fb b5 40  |.......?.1,.p..@|
-00000210  14 82 45 a4 eb af e2 64  d9 0c 8a 4c f4 f8 5b 0f  |..E....d...L..[.|
-00000220  ac 12 ac 2f c4 a3 15 4b  ad 52 46 28 68 af 96 c6  |.../...K.RF(h...|
-00000230  2c 65 25 d6 52 b6 e3 18  45 bd cc 16 03 03 00 04  |,e%.R...E.......|
-00000240  0e 00 00 00                                       |....|
->>> Flow 3 (client to server)
-00000000  16 03 03 00 86 10 00 00  82 00 80 72 23 e9 89 70  |...........r#..p|
-00000010  97 02 08 58 0d 28 96 5b  19 73 dd 4f 6e 4c 11 dd  |...X.(.[.s.OnL..|
-00000020  cb 56 14 f4 8f c8 e5 84  03 f5 7e f0 a4 08 44 8c  |.V........~...D.|
-00000030  22 74 01 5c e4 9d e0 38  53 90 66 e3 df bb 09 a8  |"t.\...8S.f.....|
-00000040  11 97 0a 44 01 d2 70 85  14 a1 9a 2f 02 34 40 6d  |...D..p..../.4@m|
-00000050  66 80 72 9a 97 98 5c 91  0e dc 42 ac c2 90 2f 30  |f.r...\...B.../0|
-00000060  ca 39 25 94 da 6e b6 5f  94 a9 94 66 7f 32 6a bb  |.9%..n._...f.2j.|
-00000070  5d 43 20 c3 74 f7 52 29  1f d5 62 6b a4 a1 8c 25  |]C .t.R)..bk...%|
-00000080  46 69 22 a5 68 54 f4 68  30 e2 52 14 03 03 00 01  |Fi".hT.h0.R.....|
-00000090  01 16 03 03 00 40 51 d2  78 64 e3 59 ee b7 5f 95  |.....@Q.xd.Y.._.|
-000000a0  4c 49 7f 0d 49 3f 55 71  8c 3b 24 e3 81 22 4a d1  |LI..I?Uq.;$.."J.|
-000000b0  ab 84 4e df 02 9d 56 ea  2a 14 71 e1 dc 1d 5c 1d  |..N...V.*.q...\.|
-000000c0  54 ce cb 58 f6 4d e7 73  44 0d 99 95 a5 2d 7c 2f  |T..X.M.sD....-|/|
-000000d0  15 f5 8f fd 97 40                                 |.....@|
->>> Flow 4 (server to client)
-00000000  15 03 03 00 02 02 14                              |.......|
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/ticket.go b/third_party/gofrontend/libgo/go/crypto/tls/ticket.go
deleted file mode 100644
index 7be50ce..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/ticket.go
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"bytes"
-	"crypto/aes"
-	"crypto/cipher"
-	"crypto/hmac"
-	"crypto/sha256"
-	"crypto/subtle"
-	"errors"
-	"io"
-)
-
-// sessionState contains the information that is serialized into a session
-// ticket in order to later resume a connection.
-type sessionState struct {
-	vers         uint16
-	cipherSuite  uint16
-	masterSecret []byte
-	certificates [][]byte
-	// usedOldKey is true if the ticket from which this session came from
-	// was encrypted with an older key and thus should be refreshed.
-	usedOldKey bool
-}
-
-func (s *sessionState) equal(i interface{}) bool {
-	s1, ok := i.(*sessionState)
-	if !ok {
-		return false
-	}
-
-	if s.vers != s1.vers ||
-		s.cipherSuite != s1.cipherSuite ||
-		!bytes.Equal(s.masterSecret, s1.masterSecret) {
-		return false
-	}
-
-	if len(s.certificates) != len(s1.certificates) {
-		return false
-	}
-
-	for i := range s.certificates {
-		if !bytes.Equal(s.certificates[i], s1.certificates[i]) {
-			return false
-		}
-	}
-
-	return true
-}
-
-func (s *sessionState) marshal() []byte {
-	length := 2 + 2 + 2 + len(s.masterSecret) + 2
-	for _, cert := range s.certificates {
-		length += 4 + len(cert)
-	}
-
-	ret := make([]byte, length)
-	x := ret
-	x[0] = byte(s.vers >> 8)
-	x[1] = byte(s.vers)
-	x[2] = byte(s.cipherSuite >> 8)
-	x[3] = byte(s.cipherSuite)
-	x[4] = byte(len(s.masterSecret) >> 8)
-	x[5] = byte(len(s.masterSecret))
-	x = x[6:]
-	copy(x, s.masterSecret)
-	x = x[len(s.masterSecret):]
-
-	x[0] = byte(len(s.certificates) >> 8)
-	x[1] = byte(len(s.certificates))
-	x = x[2:]
-
-	for _, cert := range s.certificates {
-		x[0] = byte(len(cert) >> 24)
-		x[1] = byte(len(cert) >> 16)
-		x[2] = byte(len(cert) >> 8)
-		x[3] = byte(len(cert))
-		copy(x[4:], cert)
-		x = x[4+len(cert):]
-	}
-
-	return ret
-}
-
-func (s *sessionState) unmarshal(data []byte) bool {
-	if len(data) < 8 {
-		return false
-	}
-
-	s.vers = uint16(data[0])<<8 | uint16(data[1])
-	s.cipherSuite = uint16(data[2])<<8 | uint16(data[3])
-	masterSecretLen := int(data[4])<<8 | int(data[5])
-	data = data[6:]
-	if len(data) < masterSecretLen {
-		return false
-	}
-
-	s.masterSecret = data[:masterSecretLen]
-	data = data[masterSecretLen:]
-
-	if len(data) < 2 {
-		return false
-	}
-
-	numCerts := int(data[0])<<8 | int(data[1])
-	data = data[2:]
-
-	s.certificates = make([][]byte, numCerts)
-	for i := range s.certificates {
-		if len(data) < 4 {
-			return false
-		}
-		certLen := int(data[0])<<24 | int(data[1])<<16 | int(data[2])<<8 | int(data[3])
-		data = data[4:]
-		if certLen < 0 {
-			return false
-		}
-		if len(data) < certLen {
-			return false
-		}
-		s.certificates[i] = data[:certLen]
-		data = data[certLen:]
-	}
-
-	if len(data) > 0 {
-		return false
-	}
-
-	return true
-}
-
-func (c *Conn) encryptTicket(state *sessionState) ([]byte, error) {
-	serialized := state.marshal()
-	encrypted := make([]byte, ticketKeyNameLen+aes.BlockSize+len(serialized)+sha256.Size)
-	keyName := encrypted[:ticketKeyNameLen]
-	iv := encrypted[ticketKeyNameLen : ticketKeyNameLen+aes.BlockSize]
-	macBytes := encrypted[len(encrypted)-sha256.Size:]
-
-	if _, err := io.ReadFull(c.config.rand(), iv); err != nil {
-		return nil, err
-	}
-	key := c.config.ticketKeys()[0]
-	copy(keyName, key.keyName[:])
-	block, err := aes.NewCipher(key.aesKey[:])
-	if err != nil {
-		return nil, errors.New("tls: failed to create cipher while encrypting ticket: " + err.Error())
-	}
-	cipher.NewCTR(block, iv).XORKeyStream(encrypted[ticketKeyNameLen+aes.BlockSize:], serialized)
-
-	mac := hmac.New(sha256.New, key.hmacKey[:])
-	mac.Write(encrypted[:len(encrypted)-sha256.Size])
-	mac.Sum(macBytes[:0])
-
-	return encrypted, nil
-}
-
-func (c *Conn) decryptTicket(encrypted []byte) (*sessionState, bool) {
-	if c.config.SessionTicketsDisabled ||
-		len(encrypted) < ticketKeyNameLen+aes.BlockSize+sha256.Size {
-		return nil, false
-	}
-
-	keyName := encrypted[:ticketKeyNameLen]
-	iv := encrypted[ticketKeyNameLen : ticketKeyNameLen+aes.BlockSize]
-	macBytes := encrypted[len(encrypted)-sha256.Size:]
-
-	keys := c.config.ticketKeys()
-	keyIndex := -1
-	for i, candidateKey := range keys {
-		if bytes.Equal(keyName, candidateKey.keyName[:]) {
-			keyIndex = i
-			break
-		}
-	}
-
-	if keyIndex == -1 {
-		return nil, false
-	}
-	key := &keys[keyIndex]
-
-	mac := hmac.New(sha256.New, key.hmacKey[:])
-	mac.Write(encrypted[:len(encrypted)-sha256.Size])
-	expected := mac.Sum(nil)
-
-	if subtle.ConstantTimeCompare(macBytes, expected) != 1 {
-		return nil, false
-	}
-
-	block, err := aes.NewCipher(key.aesKey[:])
-	if err != nil {
-		return nil, false
-	}
-	ciphertext := encrypted[ticketKeyNameLen+aes.BlockSize : len(encrypted)-sha256.Size]
-	plaintext := ciphertext
-	cipher.NewCTR(block, iv).XORKeyStream(plaintext, ciphertext)
-
-	state := &sessionState{usedOldKey: keyIndex > 0}
-	ok := state.unmarshal(plaintext)
-	return state, ok
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/tls.go b/third_party/gofrontend/libgo/go/crypto/tls/tls.go
deleted file mode 100644
index 0b1c377..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/tls.go
+++ /dev/null
@@ -1,271 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package tls partially implements TLS 1.2, as specified in RFC 5246.
-package tls
-
-import (
-	"crypto"
-	"crypto/ecdsa"
-	"crypto/rsa"
-	"crypto/x509"
-	"encoding/pem"
-	"errors"
-	"io/ioutil"
-	"net"
-	"strings"
-	"time"
-)
-
-// Server returns a new TLS server side connection
-// using conn as the underlying transport.
-// The configuration config must be non-nil and must have
-// at least one certificate.
-func Server(conn net.Conn, config *Config) *Conn {
-	return &Conn{conn: conn, config: config}
-}
-
-// Client returns a new TLS client side connection
-// using conn as the underlying transport.
-// The config cannot be nil: users must set either ServerName or
-// InsecureSkipVerify in the config.
-func Client(conn net.Conn, config *Config) *Conn {
-	return &Conn{conn: conn, config: config, isClient: true}
-}
-
-// A listener implements a network listener (net.Listener) for TLS connections.
-type listener struct {
-	net.Listener
-	config *Config
-}
-
-// Accept waits for and returns the next incoming TLS connection.
-// The returned connection c is a *tls.Conn.
-func (l *listener) Accept() (c net.Conn, err error) {
-	c, err = l.Listener.Accept()
-	if err != nil {
-		return
-	}
-	c = Server(c, l.config)
-	return
-}
-
-// NewListener creates a Listener which accepts connections from an inner
-// Listener and wraps each connection with Server.
-// The configuration config must be non-nil and must have
-// at least one certificate.
-func NewListener(inner net.Listener, config *Config) net.Listener {
-	l := new(listener)
-	l.Listener = inner
-	l.config = config
-	return l
-}
-
-// Listen creates a TLS listener accepting connections on the
-// given network address using net.Listen.
-// The configuration config must be non-nil and must have
-// at least one certificate.
-func Listen(network, laddr string, config *Config) (net.Listener, error) {
-	if config == nil || len(config.Certificates) == 0 {
-		return nil, errors.New("tls.Listen: no certificates in configuration")
-	}
-	l, err := net.Listen(network, laddr)
-	if err != nil {
-		return nil, err
-	}
-	return NewListener(l, config), nil
-}
-
-type timeoutError struct{}
-
-func (timeoutError) Error() string   { return "tls: DialWithDialer timed out" }
-func (timeoutError) Timeout() bool   { return true }
-func (timeoutError) Temporary() bool { return true }
-
-// DialWithDialer connects to the given network address using dialer.Dial and
-// then initiates a TLS handshake, returning the resulting TLS connection. Any
-// timeout or deadline given in the dialer apply to connection and TLS
-// handshake as a whole.
-//
-// DialWithDialer interprets a nil configuration as equivalent to the zero
-// configuration; see the documentation of Config for the defaults.
-func DialWithDialer(dialer *net.Dialer, network, addr string, config *Config) (*Conn, error) {
-	// We want the Timeout and Deadline values from dialer to cover the
-	// whole process: TCP connection and TLS handshake. This means that we
-	// also need to start our own timers now.
-	timeout := dialer.Timeout
-
-	if !dialer.Deadline.IsZero() {
-		deadlineTimeout := dialer.Deadline.Sub(time.Now())
-		if timeout == 0 || deadlineTimeout < timeout {
-			timeout = deadlineTimeout
-		}
-	}
-
-	var errChannel chan error
-
-	if timeout != 0 {
-		errChannel = make(chan error, 2)
-		time.AfterFunc(timeout, func() {
-			errChannel <- timeoutError{}
-		})
-	}
-
-	rawConn, err := dialer.Dial(network, addr)
-	if err != nil {
-		return nil, err
-	}
-
-	colonPos := strings.LastIndex(addr, ":")
-	if colonPos == -1 {
-		colonPos = len(addr)
-	}
-	hostname := addr[:colonPos]
-
-	if config == nil {
-		config = defaultConfig()
-	}
-	// If no ServerName is set, infer the ServerName
-	// from the hostname we're connecting to.
-	if config.ServerName == "" {
-		// Make a copy to avoid polluting argument or default.
-		c := *config
-		c.ServerName = hostname
-		config = &c
-	}
-
-	conn := Client(rawConn, config)
-
-	if timeout == 0 {
-		err = conn.Handshake()
-	} else {
-		go func() {
-			errChannel <- conn.Handshake()
-		}()
-
-		err = <-errChannel
-	}
-
-	if err != nil {
-		rawConn.Close()
-		return nil, err
-	}
-
-	return conn, nil
-}
-
-// Dial connects to the given network address using net.Dial
-// and then initiates a TLS handshake, returning the resulting
-// TLS connection.
-// Dial interprets a nil configuration as equivalent to
-// the zero configuration; see the documentation of Config
-// for the defaults.
-func Dial(network, addr string, config *Config) (*Conn, error) {
-	return DialWithDialer(new(net.Dialer), network, addr, config)
-}
-
-// LoadX509KeyPair reads and parses a public/private key pair from a pair of
-// files. The files must contain PEM encoded data.
-func LoadX509KeyPair(certFile, keyFile string) (Certificate, error) {
-	certPEMBlock, err := ioutil.ReadFile(certFile)
-	if err != nil {
-		return Certificate{}, err
-	}
-	keyPEMBlock, err := ioutil.ReadFile(keyFile)
-	if err != nil {
-		return Certificate{}, err
-	}
-	return X509KeyPair(certPEMBlock, keyPEMBlock)
-}
-
-// X509KeyPair parses a public/private key pair from a pair of
-// PEM encoded data.
-func X509KeyPair(certPEMBlock, keyPEMBlock []byte) (Certificate, error) {
-	var cert Certificate
-	var certDERBlock *pem.Block
-	fail := func(err error) (Certificate, error) { return Certificate{}, err }
-	for {
-		certDERBlock, certPEMBlock = pem.Decode(certPEMBlock)
-		if certDERBlock == nil {
-			break
-		}
-		if certDERBlock.Type == "CERTIFICATE" {
-			cert.Certificate = append(cert.Certificate, certDERBlock.Bytes)
-		}
-	}
-
-	if len(cert.Certificate) == 0 {
-		return fail(errors.New("crypto/tls: failed to parse certificate PEM data"))
-	}
-
-	var keyDERBlock *pem.Block
-	for {
-		keyDERBlock, keyPEMBlock = pem.Decode(keyPEMBlock)
-		if keyDERBlock == nil {
-			return fail(errors.New("crypto/tls: failed to parse key PEM data"))
-		}
-		if keyDERBlock.Type == "PRIVATE KEY" || strings.HasSuffix(keyDERBlock.Type, " PRIVATE KEY") {
-			break
-		}
-	}
-
-	var err error
-	cert.PrivateKey, err = parsePrivateKey(keyDERBlock.Bytes)
-	if err != nil {
-		return fail(err)
-	}
-
-	// We don't need to parse the public key for TLS, but we so do anyway
-	// to check that it looks sane and matches the private key.
-	x509Cert, err := x509.ParseCertificate(cert.Certificate[0])
-	if err != nil {
-		return fail(err)
-	}
-
-	switch pub := x509Cert.PublicKey.(type) {
-	case *rsa.PublicKey:
-		priv, ok := cert.PrivateKey.(*rsa.PrivateKey)
-		if !ok {
-			return fail(errors.New("crypto/tls: private key type does not match public key type"))
-		}
-		if pub.N.Cmp(priv.N) != 0 {
-			return fail(errors.New("crypto/tls: private key does not match public key"))
-		}
-	case *ecdsa.PublicKey:
-		priv, ok := cert.PrivateKey.(*ecdsa.PrivateKey)
-		if !ok {
-			return fail(errors.New("crypto/tls: private key type does not match public key type"))
-
-		}
-		if pub.X.Cmp(priv.X) != 0 || pub.Y.Cmp(priv.Y) != 0 {
-			return fail(errors.New("crypto/tls: private key does not match public key"))
-		}
-	default:
-		return fail(errors.New("crypto/tls: unknown public key algorithm"))
-	}
-
-	return cert, nil
-}
-
-// Attempt to parse the given private key DER block. OpenSSL 0.9.8 generates
-// PKCS#1 private keys by default, while OpenSSL 1.0.0 generates PKCS#8 keys.
-// OpenSSL ecparam generates SEC1 EC private keys for ECDSA. We try all three.
-func parsePrivateKey(der []byte) (crypto.PrivateKey, error) {
-	if key, err := x509.ParsePKCS1PrivateKey(der); err == nil {
-		return key, nil
-	}
-	if key, err := x509.ParsePKCS8PrivateKey(der); err == nil {
-		switch key := key.(type) {
-		case *rsa.PrivateKey, *ecdsa.PrivateKey:
-			return key, nil
-		default:
-			return nil, errors.New("crypto/tls: found unknown private key type in PKCS#8 wrapping")
-		}
-	}
-	if key, err := x509.ParseECPrivateKey(der); err == nil {
-		return key, nil
-	}
-
-	return nil, errors.New("crypto/tls: failed to parse private key")
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/tls/tls_test.go b/third_party/gofrontend/libgo/go/crypto/tls/tls_test.go
deleted file mode 100644
index c45c103..0000000
--- a/third_party/gofrontend/libgo/go/crypto/tls/tls_test.go
+++ /dev/null
@@ -1,334 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tls
-
-import (
-	"bytes"
-	"fmt"
-	"internal/testenv"
-	"io"
-	"net"
-	"strings"
-	"testing"
-	"time"
-)
-
-var rsaCertPEM = `-----BEGIN CERTIFICATE-----
-MIIB0zCCAX2gAwIBAgIJAI/M7BYjwB+uMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
-BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
-aWRnaXRzIFB0eSBMdGQwHhcNMTIwOTEyMjE1MjAyWhcNMTUwOTEyMjE1MjAyWjBF
-MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
-ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANLJ
-hPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wok/4xIA+ui35/MmNa
-rtNuC+BdZ1tMuVCPFZcCAwEAAaNQME4wHQYDVR0OBBYEFJvKs8RfJaXTH08W+SGv
-zQyKn0H8MB8GA1UdIwQYMBaAFJvKs8RfJaXTH08W+SGvzQyKn0H8MAwGA1UdEwQF
-MAMBAf8wDQYJKoZIhvcNAQEFBQADQQBJlffJHybjDGxRMqaRmDhX0+6v02TUKZsW
-r5QuVbpQhH6u+0UgcW0jp9QwpxoPTLTWGXEWBBBurxFwiCBhkQ+V
------END CERTIFICATE-----
-`
-
-var rsaKeyPEM = `-----BEGIN RSA PRIVATE KEY-----
-MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
-k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
-6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
-MQIhAPW+eyZo7ay3lMz1V01WVjNKK9QSn1MJlb06h/LuYv9FAiEA25WPedKgVyCW
-SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
-xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
-D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
------END RSA PRIVATE KEY-----
-`
-
-// keyPEM is the same as rsaKeyPEM, but declares itself as just
-// "PRIVATE KEY", not "RSA PRIVATE KEY".  https://golang.org/issue/4477
-var keyPEM = `-----BEGIN PRIVATE KEY-----
-MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
-k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
-6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
-MQIhAPW+eyZo7ay3lMz1V01WVjNKK9QSn1MJlb06h/LuYv9FAiEA25WPedKgVyCW
-SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
-xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
-D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
------END PRIVATE KEY-----
-`
-
-var ecdsaCertPEM = `-----BEGIN CERTIFICATE-----
-MIIB/jCCAWICCQDscdUxw16XFDAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw
-EQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0
-eSBMdGQwHhcNMTIxMTE0MTI0MDQ4WhcNMTUxMTE0MTI0MDQ4WjBFMQswCQYDVQQG
-EwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lk
-Z2l0cyBQdHkgTHRkMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBY9+my9OoeSUR
-lDQdV/x8LsOuLilthhiS1Tz4aGDHIPwC1mlvnf7fg5lecYpMCrLLhauAc1UJXcgl
-01xoLuzgtAEAgv2P/jgytzRSpUYvgLBt1UA0leLYBy6mQQbrNEuqT3INapKIcUv8
-XxYP0xMEUksLPq6Ca+CRSqTtrd/23uTnapkwCQYHKoZIzj0EAQOBigAwgYYCQXJo
-A7Sl2nLVf+4Iu/tAX/IF4MavARKC4PPHK3zfuGfPR3oCCcsAoz3kAzOeijvd0iXb
-H5jBImIxPL4WxQNiBTexAkF8D1EtpYuWdlVQ80/h/f4pBcGiXPqX5h2PQSQY7hP1
-+jwM1FGS4fREIOvlBYr/SzzQRtwrvrzGYxDEDbsC0ZGRnA==
------END CERTIFICATE-----
-`
-
-var ecdsaKeyPEM = `-----BEGIN EC PARAMETERS-----
-BgUrgQQAIw==
------END EC PARAMETERS-----
------BEGIN EC PRIVATE KEY-----
-MIHcAgEBBEIBrsoKp0oqcv6/JovJJDoDVSGWdirrkgCWxrprGlzB9o0X8fV675X0
-NwuBenXFfeZvVcwluO7/Q9wkYoPd/t3jGImgBwYFK4EEACOhgYkDgYYABAFj36bL
-06h5JRGUNB1X/Hwuw64uKW2GGJLVPPhoYMcg/ALWaW+d/t+DmV5xikwKssuFq4Bz
-VQldyCXTXGgu7OC0AQCC/Y/+ODK3NFKlRi+AsG3VQDSV4tgHLqZBBus0S6pPcg1q
-kohxS/xfFg/TEwRSSws+roJr4JFKpO2t3/be5OdqmQ==
------END EC PRIVATE KEY-----
-`
-
-var keyPairTests = []struct {
-	algo string
-	cert string
-	key  string
-}{
-	{"ECDSA", ecdsaCertPEM, ecdsaKeyPEM},
-	{"RSA", rsaCertPEM, rsaKeyPEM},
-	{"RSA-untyped", rsaCertPEM, keyPEM}, // golang.org/issue/4477
-}
-
-func TestX509KeyPair(t *testing.T) {
-	var pem []byte
-	for _, test := range keyPairTests {
-		pem = []byte(test.cert + test.key)
-		if _, err := X509KeyPair(pem, pem); err != nil {
-			t.Errorf("Failed to load %s cert followed by %s key: %s", test.algo, test.algo, err)
-		}
-		pem = []byte(test.key + test.cert)
-		if _, err := X509KeyPair(pem, pem); err != nil {
-			t.Errorf("Failed to load %s key followed by %s cert: %s", test.algo, test.algo, err)
-		}
-	}
-}
-
-func TestX509MixedKeyPair(t *testing.T) {
-	if _, err := X509KeyPair([]byte(rsaCertPEM), []byte(ecdsaKeyPEM)); err == nil {
-		t.Error("Load of RSA certificate succeeded with ECDSA private key")
-	}
-	if _, err := X509KeyPair([]byte(ecdsaCertPEM), []byte(rsaKeyPEM)); err == nil {
-		t.Error("Load of ECDSA certificate succeeded with RSA private key")
-	}
-}
-
-func newLocalListener(t *testing.T) net.Listener {
-	ln, err := net.Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		ln, err = net.Listen("tcp6", "[::1]:0")
-	}
-	if err != nil {
-		t.Fatal(err)
-	}
-	return ln
-}
-
-func TestDialTimeout(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in short mode")
-	}
-	listener := newLocalListener(t)
-
-	addr := listener.Addr().String()
-	defer listener.Close()
-
-	complete := make(chan bool)
-	defer close(complete)
-
-	go func() {
-		conn, err := listener.Accept()
-		if err != nil {
-			t.Error(err)
-			return
-		}
-		<-complete
-		conn.Close()
-	}()
-
-	dialer := &net.Dialer{
-		Timeout: 10 * time.Millisecond,
-	}
-
-	var err error
-	if _, err = DialWithDialer(dialer, "tcp", addr, nil); err == nil {
-		t.Fatal("DialWithTimeout completed successfully")
-	}
-
-	if !strings.Contains(err.Error(), "timed out") {
-		t.Errorf("resulting error not a timeout: %s", err)
-	}
-}
-
-// tests that Conn.Read returns (non-zero, io.EOF) instead of
-// (non-zero, nil) when a Close (alertCloseNotify) is sitting right
-// behind the application data in the buffer.
-func TestConnReadNonzeroAndEOF(t *testing.T) {
-	// This test is racy: it assumes that after a write to a
-	// localhost TCP connection, the peer TCP connection can
-	// immediately read it.  Because it's racy, we skip this test
-	// in short mode, and then retry it several times with an
-	// increasing sleep in between our final write (via srv.Close
-	// below) and the following read.
-	if testing.Short() {
-		t.Skip("skipping in short mode")
-	}
-	var err error
-	for delay := time.Millisecond; delay <= 64*time.Millisecond; delay *= 2 {
-		if err = testConnReadNonzeroAndEOF(t, delay); err == nil {
-			return
-		}
-	}
-	t.Error(err)
-}
-
-func testConnReadNonzeroAndEOF(t *testing.T, delay time.Duration) error {
-	ln := newLocalListener(t)
-	defer ln.Close()
-
-	srvCh := make(chan *Conn, 1)
-	var serr error
-	go func() {
-		sconn, err := ln.Accept()
-		if err != nil {
-			serr = err
-			srvCh <- nil
-			return
-		}
-		serverConfig := *testConfig
-		srv := Server(sconn, &serverConfig)
-		if err := srv.Handshake(); err != nil {
-			serr = fmt.Errorf("handshake: %v", err)
-			srvCh <- nil
-			return
-		}
-		srvCh <- srv
-	}()
-
-	clientConfig := *testConfig
-	conn, err := Dial("tcp", ln.Addr().String(), &clientConfig)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer conn.Close()
-
-	srv := <-srvCh
-	if srv == nil {
-		return serr
-	}
-
-	buf := make([]byte, 6)
-
-	srv.Write([]byte("foobar"))
-	n, err := conn.Read(buf)
-	if n != 6 || err != nil || string(buf) != "foobar" {
-		return fmt.Errorf("Read = %d, %v, data %q; want 6, nil, foobar", n, err, buf)
-	}
-
-	srv.Write([]byte("abcdef"))
-	srv.Close()
-	time.Sleep(delay)
-	n, err = conn.Read(buf)
-	if n != 6 || string(buf) != "abcdef" {
-		return fmt.Errorf("Read = %d, buf= %q; want 6, abcdef", n, buf)
-	}
-	if err != io.EOF {
-		return fmt.Errorf("Second Read error = %v; want io.EOF", err)
-	}
-	return nil
-}
-
-func TestTLSUniqueMatches(t *testing.T) {
-	ln := newLocalListener(t)
-	defer ln.Close()
-
-	serverTLSUniques := make(chan []byte)
-	go func() {
-		for i := 0; i < 2; i++ {
-			sconn, err := ln.Accept()
-			if err != nil {
-				t.Fatal(err)
-			}
-			serverConfig := *testConfig
-			srv := Server(sconn, &serverConfig)
-			if err := srv.Handshake(); err != nil {
-				t.Fatal(err)
-			}
-			serverTLSUniques <- srv.ConnectionState().TLSUnique
-		}
-	}()
-
-	clientConfig := *testConfig
-	clientConfig.ClientSessionCache = NewLRUClientSessionCache(1)
-	conn, err := Dial("tcp", ln.Addr().String(), &clientConfig)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !bytes.Equal(conn.ConnectionState().TLSUnique, <-serverTLSUniques) {
-		t.Error("client and server channel bindings differ")
-	}
-	conn.Close()
-
-	conn, err = Dial("tcp", ln.Addr().String(), &clientConfig)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer conn.Close()
-	if !conn.ConnectionState().DidResume {
-		t.Error("second session did not use resumption")
-	}
-	if !bytes.Equal(conn.ConnectionState().TLSUnique, <-serverTLSUniques) {
-		t.Error("client and server channel bindings differ when session resumption is used")
-	}
-}
-
-func TestVerifyHostname(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	c, err := Dial("tcp", "www.google.com:https", nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err := c.VerifyHostname("www.google.com"); err != nil {
-		t.Fatalf("verify www.google.com: %v", err)
-	}
-	if err := c.VerifyHostname("www.yahoo.com"); err == nil {
-		t.Fatalf("verify www.yahoo.com succeeded")
-	}
-
-	c, err = Dial("tcp", "www.google.com:https", &Config{InsecureSkipVerify: true})
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err := c.VerifyHostname("www.google.com"); err == nil {
-		t.Fatalf("verify www.google.com succeeded with InsecureSkipVerify=true")
-	}
-	if err := c.VerifyHostname("www.yahoo.com"); err == nil {
-		t.Fatalf("verify www.google.com succeeded with InsecureSkipVerify=true")
-	}
-}
-
-func TestVerifyHostnameResumed(t *testing.T) {
-	testenv.MustHaveExternalNetwork(t)
-
-	config := &Config{
-		ClientSessionCache: NewLRUClientSessionCache(32),
-	}
-	for i := 0; i < 2; i++ {
-		c, err := Dial("tcp", "www.google.com:https", config)
-		if err != nil {
-			t.Fatalf("Dial #%d: %v", i, err)
-		}
-		cs := c.ConnectionState()
-		if i > 0 && !cs.DidResume {
-			t.Fatalf("Subsequent connection unexpectedly didn't resume")
-		}
-		if cs.VerifiedChains == nil {
-			t.Fatalf("Dial #%d: cs.VerifiedChains == nil", i)
-		}
-		if err := c.VerifyHostname("www.google.com"); err != nil {
-			t.Fatalf("verify www.google.com #%d: %v", i, err)
-		}
-		c.Close()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/cert_pool.go b/third_party/gofrontend/libgo/go/crypto/x509/cert_pool.go
deleted file mode 100644
index 2362e84..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/cert_pool.go
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-import (
-	"encoding/pem"
-)
-
-// CertPool is a set of certificates.
-type CertPool struct {
-	bySubjectKeyId map[string][]int
-	byName         map[string][]int
-	certs          []*Certificate
-}
-
-// NewCertPool returns a new, empty CertPool.
-func NewCertPool() *CertPool {
-	return &CertPool{
-		make(map[string][]int),
-		make(map[string][]int),
-		nil,
-	}
-}
-
-// findVerifiedParents attempts to find certificates in s which have signed the
-// given certificate. If any candidates were rejected then errCert will be set
-// to one of them, arbitrarily, and err will contain the reason that it was
-// rejected.
-func (s *CertPool) findVerifiedParents(cert *Certificate) (parents []int, errCert *Certificate, err error) {
-	if s == nil {
-		return
-	}
-	var candidates []int
-
-	if len(cert.AuthorityKeyId) > 0 {
-		candidates = s.bySubjectKeyId[string(cert.AuthorityKeyId)]
-	}
-	if len(candidates) == 0 {
-		candidates = s.byName[string(cert.RawIssuer)]
-	}
-
-	for _, c := range candidates {
-		if err = cert.CheckSignatureFrom(s.certs[c]); err == nil {
-			parents = append(parents, c)
-		} else {
-			errCert = s.certs[c]
-		}
-	}
-
-	return
-}
-
-// AddCert adds a certificate to a pool.
-func (s *CertPool) AddCert(cert *Certificate) {
-	if cert == nil {
-		panic("adding nil Certificate to CertPool")
-	}
-
-	// Check that the certificate isn't being added twice.
-	for _, c := range s.certs {
-		if c.Equal(cert) {
-			return
-		}
-	}
-
-	n := len(s.certs)
-	s.certs = append(s.certs, cert)
-
-	if len(cert.SubjectKeyId) > 0 {
-		keyId := string(cert.SubjectKeyId)
-		s.bySubjectKeyId[keyId] = append(s.bySubjectKeyId[keyId], n)
-	}
-	name := string(cert.RawSubject)
-	s.byName[name] = append(s.byName[name], n)
-}
-
-// AppendCertsFromPEM attempts to parse a series of PEM encoded certificates.
-// It appends any certificates found to s and reports whether any certificates
-// were successfully parsed.
-//
-// On many Linux systems, /etc/ssl/cert.pem will contain the system wide set
-// of root CAs in a format suitable for this function.
-func (s *CertPool) AppendCertsFromPEM(pemCerts []byte) (ok bool) {
-	for len(pemCerts) > 0 {
-		var block *pem.Block
-		block, pemCerts = pem.Decode(pemCerts)
-		if block == nil {
-			break
-		}
-		if block.Type != "CERTIFICATE" || len(block.Headers) != 0 {
-			continue
-		}
-
-		cert, err := ParseCertificate(block.Bytes)
-		if err != nil {
-			continue
-		}
-
-		s.AddCert(cert)
-		ok = true
-	}
-
-	return
-}
-
-// Subjects returns a list of the DER-encoded subjects of
-// all of the certificates in the pool.
-func (s *CertPool) Subjects() (res [][]byte) {
-	res = make([][]byte, len(s.certs))
-	for i, c := range s.certs {
-		res[i] = c.RawSubject
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/pem_decrypt.go b/third_party/gofrontend/libgo/go/crypto/x509/pem_decrypt.go
deleted file mode 100644
index 49ceadb..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/pem_decrypt.go
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-// RFC 1423 describes the encryption of PEM blocks. The algorithm used to
-// generate a key from the password was derived by looking at the OpenSSL
-// implementation.
-
-import (
-	"crypto/aes"
-	"crypto/cipher"
-	"crypto/des"
-	"crypto/md5"
-	"encoding/hex"
-	"encoding/pem"
-	"errors"
-	"io"
-	"strings"
-)
-
-type PEMCipher int
-
-// Possible values for the EncryptPEMBlock encryption algorithm.
-const (
-	_ PEMCipher = iota
-	PEMCipherDES
-	PEMCipher3DES
-	PEMCipherAES128
-	PEMCipherAES192
-	PEMCipherAES256
-)
-
-// rfc1423Algo holds a method for enciphering a PEM block.
-type rfc1423Algo struct {
-	cipher     PEMCipher
-	name       string
-	cipherFunc func(key []byte) (cipher.Block, error)
-	keySize    int
-	blockSize  int
-}
-
-// rfc1423Algos holds a slice of the possible ways to encrypt a PEM
-// block.  The ivSize numbers were taken from the OpenSSL source.
-var rfc1423Algos = []rfc1423Algo{{
-	cipher:     PEMCipherDES,
-	name:       "DES-CBC",
-	cipherFunc: des.NewCipher,
-	keySize:    8,
-	blockSize:  des.BlockSize,
-}, {
-	cipher:     PEMCipher3DES,
-	name:       "DES-EDE3-CBC",
-	cipherFunc: des.NewTripleDESCipher,
-	keySize:    24,
-	blockSize:  des.BlockSize,
-}, {
-	cipher:     PEMCipherAES128,
-	name:       "AES-128-CBC",
-	cipherFunc: aes.NewCipher,
-	keySize:    16,
-	blockSize:  aes.BlockSize,
-}, {
-	cipher:     PEMCipherAES192,
-	name:       "AES-192-CBC",
-	cipherFunc: aes.NewCipher,
-	keySize:    24,
-	blockSize:  aes.BlockSize,
-}, {
-	cipher:     PEMCipherAES256,
-	name:       "AES-256-CBC",
-	cipherFunc: aes.NewCipher,
-	keySize:    32,
-	blockSize:  aes.BlockSize,
-},
-}
-
-// deriveKey uses a key derivation function to stretch the password into a key
-// with the number of bits our cipher requires. This algorithm was derived from
-// the OpenSSL source.
-func (c rfc1423Algo) deriveKey(password, salt []byte) []byte {
-	hash := md5.New()
-	out := make([]byte, c.keySize)
-	var digest []byte
-
-	for i := 0; i < len(out); i += len(digest) {
-		hash.Reset()
-		hash.Write(digest)
-		hash.Write(password)
-		hash.Write(salt)
-		digest = hash.Sum(digest[:0])
-		copy(out[i:], digest)
-	}
-	return out
-}
-
-// IsEncryptedPEMBlock returns if the PEM block is password encrypted.
-func IsEncryptedPEMBlock(b *pem.Block) bool {
-	_, ok := b.Headers["DEK-Info"]
-	return ok
-}
-
-// IncorrectPasswordError is returned when an incorrect password is detected.
-var IncorrectPasswordError = errors.New("x509: decryption password incorrect")
-
-// DecryptPEMBlock takes a password encrypted PEM block and the password used to
-// encrypt it and returns a slice of decrypted DER encoded bytes. It inspects
-// the DEK-Info header to determine the algorithm used for decryption. If no
-// DEK-Info header is present, an error is returned. If an incorrect password
-// is detected an IncorrectPasswordError is returned. Because of deficiencies
-// in the encrypted-PEM format, it's not always possible to detect an incorrect
-// password. In these cases no error will be returned but the decrypted DER
-// bytes will be random noise.
-func DecryptPEMBlock(b *pem.Block, password []byte) ([]byte, error) {
-	dek, ok := b.Headers["DEK-Info"]
-	if !ok {
-		return nil, errors.New("x509: no DEK-Info header in block")
-	}
-
-	idx := strings.Index(dek, ",")
-	if idx == -1 {
-		return nil, errors.New("x509: malformed DEK-Info header")
-	}
-
-	mode, hexIV := dek[:idx], dek[idx+1:]
-	ciph := cipherByName(mode)
-	if ciph == nil {
-		return nil, errors.New("x509: unknown encryption mode")
-	}
-	iv, err := hex.DecodeString(hexIV)
-	if err != nil {
-		return nil, err
-	}
-	if len(iv) != ciph.blockSize {
-		return nil, errors.New("x509: incorrect IV size")
-	}
-
-	// Based on the OpenSSL implementation. The salt is the first 8 bytes
-	// of the initialization vector.
-	key := ciph.deriveKey(password, iv[:8])
-	block, err := ciph.cipherFunc(key)
-	if err != nil {
-		return nil, err
-	}
-
-	if len(b.Bytes)%block.BlockSize() != 0 {
-		return nil, errors.New("x509: encrypted PEM data is not a multiple of the block size")
-	}
-
-	data := make([]byte, len(b.Bytes))
-	dec := cipher.NewCBCDecrypter(block, iv)
-	dec.CryptBlocks(data, b.Bytes)
-
-	// Blocks are padded using a scheme where the last n bytes of padding are all
-	// equal to n. It can pad from 1 to blocksize bytes inclusive. See RFC 1423.
-	// For example:
-	//	[x y z 2 2]
-	//	[x y 7 7 7 7 7 7 7]
-	// If we detect a bad padding, we assume it is an invalid password.
-	dlen := len(data)
-	if dlen == 0 || dlen%ciph.blockSize != 0 {
-		return nil, errors.New("x509: invalid padding")
-	}
-	last := int(data[dlen-1])
-	if dlen < last {
-		return nil, IncorrectPasswordError
-	}
-	if last == 0 || last > ciph.blockSize {
-		return nil, IncorrectPasswordError
-	}
-	for _, val := range data[dlen-last:] {
-		if int(val) != last {
-			return nil, IncorrectPasswordError
-		}
-	}
-	return data[:dlen-last], nil
-}
-
-// EncryptPEMBlock returns a PEM block of the specified type holding the
-// given DER-encoded data encrypted with the specified algorithm and
-// password.
-func EncryptPEMBlock(rand io.Reader, blockType string, data, password []byte, alg PEMCipher) (*pem.Block, error) {
-	ciph := cipherByKey(alg)
-	if ciph == nil {
-		return nil, errors.New("x509: unknown encryption mode")
-	}
-	iv := make([]byte, ciph.blockSize)
-	if _, err := io.ReadFull(rand, iv); err != nil {
-		return nil, errors.New("x509: cannot generate IV: " + err.Error())
-	}
-	// The salt is the first 8 bytes of the initialization vector,
-	// matching the key derivation in DecryptPEMBlock.
-	key := ciph.deriveKey(password, iv[:8])
-	block, err := ciph.cipherFunc(key)
-	if err != nil {
-		return nil, err
-	}
-	enc := cipher.NewCBCEncrypter(block, iv)
-	pad := ciph.blockSize - len(data)%ciph.blockSize
-	encrypted := make([]byte, len(data), len(data)+pad)
-	// We could save this copy by encrypting all the whole blocks in
-	// the data separately, but it doesn't seem worth the additional
-	// code.
-	copy(encrypted, data)
-	// See RFC 1423, section 1.1
-	for i := 0; i < pad; i++ {
-		encrypted = append(encrypted, byte(pad))
-	}
-	enc.CryptBlocks(encrypted, encrypted)
-
-	return &pem.Block{
-		Type: blockType,
-		Headers: map[string]string{
-			"Proc-Type": "4,ENCRYPTED",
-			"DEK-Info":  ciph.name + "," + hex.EncodeToString(iv),
-		},
-		Bytes: encrypted,
-	}, nil
-}
-
-func cipherByName(name string) *rfc1423Algo {
-	for i := range rfc1423Algos {
-		alg := &rfc1423Algos[i]
-		if alg.name == name {
-			return alg
-		}
-	}
-	return nil
-}
-
-func cipherByKey(key PEMCipher) *rfc1423Algo {
-	for i := range rfc1423Algos {
-		alg := &rfc1423Algos[i]
-		if alg.cipher == key {
-			return alg
-		}
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/pem_decrypt_test.go b/third_party/gofrontend/libgo/go/crypto/x509/pem_decrypt_test.go
deleted file mode 100644
index 685d5ee..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/pem_decrypt_test.go
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-import (
-	"bytes"
-	"crypto/rand"
-	"encoding/base64"
-	"encoding/pem"
-	"strings"
-	"testing"
-)
-
-func TestDecrypt(t *testing.T) {
-	for i, data := range testData {
-		t.Logf("test %v. %v", i, data.kind)
-		block, rest := pem.Decode(data.pemData)
-		if len(rest) > 0 {
-			t.Error("extra data")
-		}
-		der, err := DecryptPEMBlock(block, data.password)
-		if err != nil {
-			t.Error("decrypt failed: ", err)
-			continue
-		}
-		if _, err := ParsePKCS1PrivateKey(der); err != nil {
-			t.Error("invalid private key: ", err)
-		}
-		plainDER, err := base64.StdEncoding.DecodeString(data.plainDER)
-		if err != nil {
-			t.Fatal("cannot decode test DER data: ", err)
-		}
-		if !bytes.Equal(der, plainDER) {
-			t.Error("data mismatch")
-		}
-	}
-}
-
-func TestEncrypt(t *testing.T) {
-	for i, data := range testData {
-		t.Logf("test %v. %v", i, data.kind)
-		plainDER, err := base64.StdEncoding.DecodeString(data.plainDER)
-		if err != nil {
-			t.Fatal("cannot decode test DER data: ", err)
-		}
-		password := []byte("kremvax1")
-		block, err := EncryptPEMBlock(rand.Reader, "RSA PRIVATE KEY", plainDER, password, data.kind)
-		if err != nil {
-			t.Error("encrypt: ", err)
-			continue
-		}
-		if !IsEncryptedPEMBlock(block) {
-			t.Error("PEM block does not appear to be encrypted")
-		}
-		if block.Type != "RSA PRIVATE KEY" {
-			t.Errorf("unexpected block type; got %q want %q", block.Type, "RSA PRIVATE KEY")
-		}
-		if block.Headers["Proc-Type"] != "4,ENCRYPTED" {
-			t.Errorf("block does not have correct Proc-Type header")
-		}
-		der, err := DecryptPEMBlock(block, password)
-		if err != nil {
-			t.Error("decrypt: ", err)
-			continue
-		}
-		if !bytes.Equal(der, plainDER) {
-			t.Errorf("data mismatch")
-		}
-	}
-}
-
-var testData = []struct {
-	kind     PEMCipher
-	password []byte
-	pemData  []byte
-	plainDER string
-}{
-	{
-		kind:     PEMCipherDES,
-		password: []byte("asdf"),
-		pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-CBC,34F09A4FC8DE22B5
-
-WXxy8kbZdiZvANtKvhmPBLV7eVFj2A5z6oAxvI9KGyhG0ZK0skfnt00C24vfU7m5
-ICXeoqP67lzJ18xCzQfHjDaBNs53DSDT+Iz4e8QUep1xQ30+8QKX2NA2coee3nwc
-6oM1cuvhNUDemBH2i3dKgMVkfaga0zQiiOq6HJyGSncCMSruQ7F9iWEfRbFcxFCx
-qtHb1kirfGKEtgWTF+ynyco6+2gMXNu70L7nJcnxnV/RLFkHt7AUU1yrclxz7eZz
-XOH9VfTjb52q/I8Suozq9coVQwg4tXfIoYUdT//O+mB7zJb9HI9Ps77b9TxDE6Gm
-4C9brwZ3zg2vqXcwwV6QRZMtyll9rOpxkbw6NPlpfBqkc3xS51bbxivbO/Nve4KD
-r12ymjFNF4stXCfJnNqKoZ50BHmEEUDu5Wb0fpVn82XrGw7CYc4iug==
------END RSA PRIVATE KEY-----`),
-		plainDER: `
-MIIBPAIBAAJBAPASZe+tCPU6p80AjHhDkVsLYa51D35e/YGa8QcZyooeZM8EHozo
-KD0fNiKI+53bHdy07N+81VQ8/ejPcRoXPlsCAwEAAQJBAMTxIuSq27VpR+zZ7WJf
-c6fvv1OBvpMZ0/d1pxL/KnOAgq2rD5hDtk9b0LGhTPgQAmrrMTKuSeGoIuYE+gKQ
-QvkCIQD+GC1m+/do+QRurr0uo46Kx1LzLeSCrjBk34wiOp2+dwIhAPHfTLRXS2fv
-7rljm0bYa4+eDZpz+E8RcXEgzhhvcQQ9AiAI5eHZJGOyml3MXnQjiPi55WcDOw0w
-glcRgT6QCEtz2wIhANSyqaFtosIkHKqrDUGfz/bb5tqMYTAnBruVPaf/WEOBAiEA
-9xORWeRG1tRpso4+dYy4KdDkuLPIO01KY6neYGm3BCM=`,
-	},
-	{
-		kind:     PEMCipher3DES,
-		password: []byte("asdf"),
-		pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,C1F4A6A03682C2C7
-
-0JqVdBEH6iqM7drTkj+e2W/bE3LqakaiWhb9WUVonFkhyu8ca/QzebY3b5gCvAZQ
-YwBvDcT/GHospKqPx+cxDHJNsUASDZws6bz8ZXWJGwZGExKzr0+Qx5fgXn44Ms3x
-8g1ENFuTXtxo+KoNK0zuAMAqp66Llcds3Fjl4XR18QaD0CrVNAfOdgATWZm5GJxk
-Fgx5f84nT+/ovvreG+xeOzWgvtKo0UUZVrhGOgfKLpa57adumcJ6SkUuBtEFpZFB
-ldw5w7WC7d13x2LsRkwo8ZrDKgIV+Y9GNvhuCCkTzNP0V3gNeJpd201HZHR+9n3w
-3z0VjR/MGqsfcy1ziEWMNOO53At3zlG6zP05aHMnMcZoVXadEK6L1gz++inSSDCq
-gI0UJP4e3JVB7AkgYymYAwiYALAkoEIuanxoc50njJk=
------END RSA PRIVATE KEY-----`),
-		plainDER: `
-MIIBOwIBAAJBANOCXKdoNS/iP/MAbl9cf1/SF3P+Ns7ZeNL27CfmDh0O6Zduaax5
-NBiumd2PmjkaCu7lQ5JOibHfWn+xJsc3kw0CAwEAAQJANX/W8d1Q/sCqzkuAn4xl
-B5a7qfJWaLHndu1QRLNTRJPn0Ee7OKJ4H0QKOhQM6vpjRrz+P2u9thn6wUxoPsef
-QQIhAP/jCkfejFcy4v15beqKzwz08/tslVjF+Yq41eJGejmxAiEA05pMoqfkyjcx
-fyvGhpoOyoCp71vSGUfR2I9CR65oKh0CIC1Msjs66LlfJtQctRq6bCEtFCxEcsP+
-eEjYo/Sk6WphAiEAxpgWPMJeU/shFT28gS+tmhjPZLpEoT1qkVlC14u0b3ECIQDX
-tZZZxCtPAm7shftEib0VU77Lk8MsXJcx2C4voRsjEw==`,
-	},
-	{
-		kind:     PEMCipherAES128,
-		password: []byte("asdf"),
-		pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: AES-128-CBC,D4492E793FC835CC038A728ED174F78A
-
-EyfQSzXSjv6BaNH+NHdXRlkHdimpF9izWlugVJAPApgXrq5YldPe2aGIOFXyJ+QE
-ZIG20DYqaPzJRjTEbPNZ6Es0S2JJ5yCpKxwJuDkgJZKtF39Q2i36JeGbSZQIuWJE
-GZbBpf1jDH/pr0iGonuAdl2PCCZUiy+8eLsD2tyviHUkFLOB+ykYoJ5t8ngZ/B6D
-33U43LLb7+9zD4y3Q9OVHqBFGyHcxCY9+9Qh4ZnFp7DTf6RY5TNEvE3s4g6aDpBs
-3NbvRVvYTgs8K9EPk4K+5R+P2kD8J8KvEIGxVa1vz8QoCJ/jr7Ka2rvNgPCex5/E
-080LzLHPCrXKdlr/f50yhNWq08ZxMWQFkui+FDHPDUaEELKAXV8/5PDxw80Rtybo
-AVYoCVIbZXZCuCO81op8UcOgEpTtyU5Lgh3Mw5scQL0=
------END RSA PRIVATE KEY-----`),
-		plainDER: `
-MIIBOgIBAAJBAMBlj5FxYtqbcy8wY89d/S7n0+r5MzD9F63BA/Lpl78vQKtdJ5dT
-cDGh/rBt1ufRrNp0WihcmZi7Mpl/3jHjiWECAwEAAQJABNOHYnKhtDIqFYj1OAJ3
-k3GlU0OlERmIOoeY/cL2V4lgwllPBEs7r134AY4wMmZSBUj8UR/O4SNO668ElKPE
-cQIhAOuqY7/115x5KCdGDMWi+jNaMxIvI4ETGwV40ykGzqlzAiEA0P9oEC3m9tHB
-kbpjSTxaNkrXxDgdEOZz8X0uOUUwHNsCIAwzcSCiGLyYJTULUmP1ESERfW1mlV78
-XzzESaJpIM/zAiBQkSTcl9VhcJreQqvjn5BnPZLP4ZHS4gPwJAGdsj5J4QIhAOVR
-B3WlRNTXR2WsJ5JdByezg9xzdXzULqmga0OE339a`,
-	},
-	{
-		kind:     PEMCipherAES192,
-		password: []byte("asdf"),
-		pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: AES-192-CBC,E2C9FB02BCA23ADE1829F8D8BC5F5369
-
-cqVslvHqDDM6qwU6YjezCRifXmKsrgEev7ng6Qs7UmDJOpHDgJQZI9fwMFUhIyn5
-FbCu1SHkLMW52Ld3CuEqMnzWMlhPrW8tFvUOrMWPYSisv7nNq88HobZEJcUNL2MM
-Y15XmHW6IJwPqhKyLHpWXyOCVEh4ODND2nV15PCoi18oTa475baxSk7+1qH7GuIs
-Rb7tshNTMqHbCpyo9Rn3UxeFIf9efdl8YLiMoIqc7J8E5e9VlbeQSdLMQOgDAQJG
-ReUtTw8exmKsY4gsSjhkg5uiw7/ZB1Ihto0qnfQJgjGc680qGkT1d6JfvOfeYAk6
-xn5RqS/h8rYAYm64KnepfC9vIujo4NqpaREDmaLdX5MJPQ+SlytITQvgUsUq3q/t
-Ss85xjQEZH3hzwjQqdJvmA4hYP6SUjxYpBM+02xZ1Xw=
------END RSA PRIVATE KEY-----`),
-		plainDER: `
-MIIBOwIBAAJBAMGcRrZiNNmtF20zyS6MQ7pdGx17aFDl+lTl+qnLuJRUCMUG05xs
-OmxmL/O1Qlf+bnqR8Bgg65SfKg21SYuLhiMCAwEAAQJBAL94uuHyO4wux2VC+qpj
-IzPykjdU7XRcDHbbvksf4xokSeUFjjD3PB0Qa83M94y89ZfdILIqS9x5EgSB4/lX
-qNkCIQD6cCIqLfzq/lYbZbQgAAjpBXeQVYsbvVtJrPrXJAlVVQIhAMXpDKMeFPMn
-J0g2rbx1gngx0qOa5r5iMU5w/noN4W2XAiBjf+WzCG5yFvazD+dOx3TC0A8+4x3P
-uZ3pWbaXf5PNuQIgAcdXarvhelH2w2piY1g3BPeFqhzBSCK/yLGxR82KIh8CIQDD
-+qGKsd09NhQ/G27y/DARzOYtml1NvdmCQAgsDIIOLA==`,
-	},
-	{
-		kind:     PEMCipherAES256,
-		password: []byte("asdf"),
-		pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: AES-256-CBC,8E7ED5CD731902CE938957A886A5FFBD
-
-4Mxr+KIzRVwoOP0wwq6caSkvW0iS+GE2h2Ov/u+n9ZTMwL83PRnmjfjzBgfRZLVf
-JFPXxUK26kMNpIdssNnqGOds+DhB+oSrsNKoxgxSl5OBoYv9eJTVYm7qOyAFIsjr
-DRKAcjYCmzfesr7PVTowwy0RtHmYwyXMGDlAzzZrEvaiySFFmMyKKvtoavwaFoc7
-Pz3RZScwIuubzTGJ1x8EzdffYOsdCa9Mtgpp3L136+23dOd6L/qK2EG2fzrJSHs/
-2XugkleBFSMKzEp9mxXKRfa++uidQvMZTFLDK9w5YjrRvMBo/l2BoZIsq0jAIE1N
-sv5Z/KwlX+3MDEpPQpUwGPlGGdLnjI3UZ+cjgqBcoMiNc6HfgbBgYJSU6aDSHuCk
-clCwByxWkBNgJ2GrkwNrF26v+bGJJJNR4SKouY1jQf0=
------END RSA PRIVATE KEY-----`),
-		plainDER: `
-MIIBOgIBAAJBAKy3GFkstoCHIEeUU/qO8207m8WSrjksR+p9B4tf1w5k+2O1V/GY
-AQ5WFCApItcOkQe/I0yZZJk/PmCqMzSxrc8CAwEAAQJAOCAz0F7AW9oNelVQSP8F
-Sfzx7O1yom+qWyAQQJF/gFR11gpf9xpVnnyu1WxIRnDUh1LZwUsjwlDYb7MB74id
-oQIhANPcOiLwOPT4sIUpRM5HG6BF1BI7L77VpyGVk8xNP7X/AiEA0LMHZtk4I+lJ
-nClgYp4Yh2JZ1Znbu7IoQMCEJCjwKDECIGd8Dzm5tViTkUW6Hs3Tlf73nNs65duF
-aRnSglss8I3pAiEAonEnKruawgD8RavDFR+fUgmQiPz4FnGGeVgfwpGG1JECIBYq
-PXHYtPqxQIbD2pScR5qum7iGUh11lEUPkmt+2uqS`,
-	},
-	{
-		// generated with:
-		// openssl genrsa -aes128 -passout pass:asdf -out server.orig.key 128
-		kind:     PEMCipherAES128,
-		password: []byte("asdf"),
-		pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: AES-128-CBC,74611ABC2571AF11B1BF9B69E62C89E7
-
-6ei/MlytjE0FFgZOGQ+jrwomKfpl8kdefeE0NSt/DMRrw8OacHAzBNi3pPEa0eX3
-eND9l7C9meCirWovjj9QWVHrXyugFuDIqgdhQ8iHTgCfF3lrmcttVrbIfMDw+smD
-hTP8O1mS/MHl92NE0nhv0w==
------END RSA PRIVATE KEY-----`),
-		plainDER: `
-MGMCAQACEQC6ssxmYuauuHGOCDAI54RdAgMBAAECEQCWIn6Yv2O+kBcDF7STctKB
-AgkA8SEfu/2i3g0CCQDGNlXbBHX7kQIIK3Ww5o0cYbECCQDCimPb0dYGsQIIeQ7A
-jryIst8=`,
-	},
-}
-
-const incompleteBlockPEM = `
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: AES-128-CBC,74611ABC2571AF11B1BF9B69E62C89E7
-
-6L8yXK2MTQUWBk4ZD6OvCiYp+mXyR1594TQ1K38MxGvDw5pwcDME2Lek8RrR5fd40P2XsL2Z4KKt
-ai+OP1BZUetfK6AW4MiqB2FDyIdOAJ8XeWuZy21Wtsh8wPD6yYOFM/w7WZL8weX3Y0TSeG/T
------END RSA PRIVATE KEY-----`
-
-func TestIncompleteBlock(t *testing.T) {
-	// incompleteBlockPEM contains ciphertext that is not a multiple of the
-	// block size. This previously panicked. See #11215.
-	block, _ := pem.Decode([]byte(incompleteBlockPEM))
-	_, err := DecryptPEMBlock(block, []byte("foo"))
-	if err == nil {
-		t.Fatal("Bad PEM data decrypted successfully")
-	}
-	const expectedSubstr = "block size"
-	if e := err.Error(); !strings.Contains(e, expectedSubstr) {
-		t.Fatalf("Expected error containing %q but got: %q", expectedSubstr, e)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/pkcs1.go b/third_party/gofrontend/libgo/go/crypto/x509/pkcs1.go
deleted file mode 100644
index acebe35..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/pkcs1.go
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-import (
-	"crypto/rsa"
-	"encoding/asn1"
-	"errors"
-	"math/big"
-)
-
-// pkcs1PrivateKey is a structure which mirrors the PKCS#1 ASN.1 for an RSA private key.
-type pkcs1PrivateKey struct {
-	Version int
-	N       *big.Int
-	E       int
-	D       *big.Int
-	P       *big.Int
-	Q       *big.Int
-	// We ignore these values, if present, because rsa will calculate them.
-	Dp   *big.Int `asn1:"optional"`
-	Dq   *big.Int `asn1:"optional"`
-	Qinv *big.Int `asn1:"optional"`
-
-	AdditionalPrimes []pkcs1AdditionalRSAPrime `asn1:"optional,omitempty"`
-}
-
-type pkcs1AdditionalRSAPrime struct {
-	Prime *big.Int
-
-	// We ignore these values because rsa will calculate them.
-	Exp   *big.Int
-	Coeff *big.Int
-}
-
-// ParsePKCS1PrivateKey returns an RSA private key from its ASN.1 PKCS#1 DER encoded form.
-func ParsePKCS1PrivateKey(der []byte) (key *rsa.PrivateKey, err error) {
-	var priv pkcs1PrivateKey
-	rest, err := asn1.Unmarshal(der, &priv)
-	if len(rest) > 0 {
-		err = asn1.SyntaxError{Msg: "trailing data"}
-		return
-	}
-	if err != nil {
-		return
-	}
-
-	if priv.Version > 1 {
-		return nil, errors.New("x509: unsupported private key version")
-	}
-
-	if priv.N.Sign() <= 0 || priv.D.Sign() <= 0 || priv.P.Sign() <= 0 || priv.Q.Sign() <= 0 {
-		return nil, errors.New("x509: private key contains zero or negative value")
-	}
-
-	key = new(rsa.PrivateKey)
-	key.PublicKey = rsa.PublicKey{
-		E: priv.E,
-		N: priv.N,
-	}
-
-	key.D = priv.D
-	key.Primes = make([]*big.Int, 2+len(priv.AdditionalPrimes))
-	key.Primes[0] = priv.P
-	key.Primes[1] = priv.Q
-	for i, a := range priv.AdditionalPrimes {
-		if a.Prime.Sign() <= 0 {
-			return nil, errors.New("x509: private key contains zero or negative prime")
-		}
-		key.Primes[i+2] = a.Prime
-		// We ignore the other two values because rsa will calculate
-		// them as needed.
-	}
-
-	err = key.Validate()
-	if err != nil {
-		return nil, err
-	}
-	key.Precompute()
-
-	return
-}
-
-// MarshalPKCS1PrivateKey converts a private key to ASN.1 DER encoded form.
-func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte {
-	key.Precompute()
-
-	version := 0
-	if len(key.Primes) > 2 {
-		version = 1
-	}
-
-	priv := pkcs1PrivateKey{
-		Version: version,
-		N:       key.N,
-		E:       key.PublicKey.E,
-		D:       key.D,
-		P:       key.Primes[0],
-		Q:       key.Primes[1],
-		Dp:      key.Precomputed.Dp,
-		Dq:      key.Precomputed.Dq,
-		Qinv:    key.Precomputed.Qinv,
-	}
-
-	priv.AdditionalPrimes = make([]pkcs1AdditionalRSAPrime, len(key.Precomputed.CRTValues))
-	for i, values := range key.Precomputed.CRTValues {
-		priv.AdditionalPrimes[i].Prime = key.Primes[2+i]
-		priv.AdditionalPrimes[i].Exp = values.Exp
-		priv.AdditionalPrimes[i].Coeff = values.Coeff
-	}
-
-	b, _ := asn1.Marshal(priv)
-	return b
-}
-
-// rsaPublicKey reflects the ASN.1 structure of a PKCS#1 public key.
-type rsaPublicKey struct {
-	N *big.Int
-	E int
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/pkcs8.go b/third_party/gofrontend/libgo/go/crypto/x509/pkcs8.go
deleted file mode 100644
index ba19989..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/pkcs8.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-import (
-	"crypto/x509/pkix"
-	"encoding/asn1"
-	"errors"
-	"fmt"
-)
-
-// pkcs8 reflects an ASN.1, PKCS#8 PrivateKey. See
-// ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-8/pkcs-8v1_2.asn
-// and RFC5208.
-type pkcs8 struct {
-	Version    int
-	Algo       pkix.AlgorithmIdentifier
-	PrivateKey []byte
-	// optional attributes omitted.
-}
-
-// ParsePKCS8PrivateKey parses an unencrypted, PKCS#8 private key. See
-// http://www.rsa.com/rsalabs/node.asp?id=2130 and RFC5208.
-func ParsePKCS8PrivateKey(der []byte) (key interface{}, err error) {
-	var privKey pkcs8
-	if _, err := asn1.Unmarshal(der, &privKey); err != nil {
-		return nil, err
-	}
-	switch {
-	case privKey.Algo.Algorithm.Equal(oidPublicKeyRSA):
-		key, err = ParsePKCS1PrivateKey(privKey.PrivateKey)
-		if err != nil {
-			return nil, errors.New("x509: failed to parse RSA private key embedded in PKCS#8: " + err.Error())
-		}
-		return key, nil
-
-	case privKey.Algo.Algorithm.Equal(oidPublicKeyECDSA):
-		bytes := privKey.Algo.Parameters.FullBytes
-		namedCurveOID := new(asn1.ObjectIdentifier)
-		if _, err := asn1.Unmarshal(bytes, namedCurveOID); err != nil {
-			namedCurveOID = nil
-		}
-		key, err = parseECPrivateKey(namedCurveOID, privKey.PrivateKey)
-		if err != nil {
-			return nil, errors.New("x509: failed to parse EC private key embedded in PKCS#8: " + err.Error())
-		}
-		return key, nil
-
-	default:
-		return nil, fmt.Errorf("x509: PKCS#8 wrapping contained private key with unknown algorithm: %v", privKey.Algo.Algorithm)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/pkcs8_test.go b/third_party/gofrontend/libgo/go/crypto/x509/pkcs8_test.go
deleted file mode 100644
index 4114efd..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/pkcs8_test.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-import (
-	"encoding/hex"
-	"testing"
-)
-
-var pkcs8RSAPrivateKeyHex = `30820278020100300d06092a864886f70d0101010500048202623082025e02010002818100cfb1b5bf9685ffa97b4f99df4ff122b70e59ac9b992f3bc2b3dde17d53c1a34928719b02e8fd17839499bfbd515bd6ef99c7a1c47a239718fe36bfd824c0d96060084b5f67f0273443007a24dfaf5634f7772c9346e10eb294c2306671a5a5e719ae24b4de467291bc571014b0e02dec04534d66a9bb171d644b66b091780e8d020301000102818100b595778383c4afdbab95d2bfed12b3f93bb0a73a7ad952f44d7185fd9ec6c34de8f03a48770f2009c8580bcd275e9632714e9a5e3f32f29dc55474b2329ff0ebc08b3ffcb35bc96e6516b483df80a4a59cceb71918cbabf91564e64a39d7e35dce21cb3031824fdbc845dba6458852ec16af5dddf51a8397a8797ae0337b1439024100ea0eb1b914158c70db39031dd8904d6f18f408c85fbbc592d7d20dee7986969efbda081fdf8bc40e1b1336d6b638110c836bfdc3f314560d2e49cd4fbde1e20b024100e32a4e793b574c9c4a94c8803db5152141e72d03de64e54ef2c8ed104988ca780cd11397bc359630d01b97ebd87067c5451ba777cf045ca23f5912f1031308c702406dfcdbbd5a57c9f85abc4edf9e9e29153507b07ce0a7ef6f52e60dcfebe1b8341babd8b789a837485da6c8d55b29bbb142ace3c24a1f5b54b454d01b51e2ad03024100bd6a2b60dee01e1b3bfcef6a2f09ed027c273cdbbaf6ba55a80f6dcc64e4509ee560f84b4f3e076bd03b11e42fe71a3fdd2dffe7e0902c8584f8cad877cdc945024100aa512fa4ada69881f1d8bb8ad6614f192b83200aef5edf4811313d5ef30a86cbd0a90f7b025c71ea06ec6b34db6306c86b1040670fd8654ad7291d066d06d031`
-
-// Generated using:
-//   openssl ecparam -genkey -name secp521r1 | openssl pkcs8 -topk8 -nocrypt
-var pkcs8ECPrivateKeyHex = `3081ed020100301006072a8648ce3d020106052b810400230481d53081d20201010441850d81618c5da1aec74c2eed608ba816038506975e6427237c2def150c96a3b13efbfa1f89f1be15cdf4d0ac26422e680e65a0ddd4ad3541ad76165fbf54d6e34ba18189038186000400da97bcedba1eb6d30aeb93c9f9a1454598fa47278df27d6f60ea73eb672d8dc528a9b67885b5b5dcef93c9824f7449ab512ee6a27e76142f56b94b474cfd697e810046c8ca70419365245c1d7d44d0db82c334073835d002232714548abbae6e5700f5ef315ee08b929d8581383dcf2d1c98c2f8a9fccbf79c9579f7b2fd8a90115ac2`
-
-func TestPKCS8(t *testing.T) {
-	derBytes, _ := hex.DecodeString(pkcs8RSAPrivateKeyHex)
-	if _, err := ParsePKCS8PrivateKey(derBytes); err != nil {
-		t.Errorf("failed to decode PKCS8 with RSA private key: %s", err)
-	}
-
-	derBytes, _ = hex.DecodeString(pkcs8ECPrivateKeyHex)
-	if _, err := ParsePKCS8PrivateKey(derBytes); err != nil {
-		t.Errorf("failed to decode PKCS8 with EC private key: %s", err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/pkix/pkix.go b/third_party/gofrontend/libgo/go/crypto/x509/pkix/pkix.go
deleted file mode 100644
index 5add4e5..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/pkix/pkix.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package pkix contains shared, low level structures used for ASN.1 parsing
-// and serialization of X.509 certificates, CRL and OCSP.
-package pkix
-
-import (
-	"encoding/asn1"
-	"math/big"
-	"time"
-)
-
-// AlgorithmIdentifier represents the ASN.1 structure of the same name. See RFC
-// 5280, section 4.1.1.2.
-type AlgorithmIdentifier struct {
-	Algorithm  asn1.ObjectIdentifier
-	Parameters asn1.RawValue `asn1:"optional"`
-}
-
-type RDNSequence []RelativeDistinguishedNameSET
-
-type RelativeDistinguishedNameSET []AttributeTypeAndValue
-
-// AttributeTypeAndValue mirrors the ASN.1 structure of the same name in
-// http://tools.ietf.org/html/rfc5280#section-4.1.2.4
-type AttributeTypeAndValue struct {
-	Type  asn1.ObjectIdentifier
-	Value interface{}
-}
-
-// AttributeTypeAndValueSET represents a set of ASN.1 sequences of
-// AttributeTypeAndValue sequences from RFC 2986 (PKCS #10).
-type AttributeTypeAndValueSET struct {
-	Type  asn1.ObjectIdentifier
-	Value [][]AttributeTypeAndValue `asn1:"set"`
-}
-
-// Extension represents the ASN.1 structure of the same name. See RFC
-// 5280, section 4.2.
-type Extension struct {
-	Id       asn1.ObjectIdentifier
-	Critical bool `asn1:"optional"`
-	Value    []byte
-}
-
-// Name represents an X.509 distinguished name. This only includes the common
-// elements of a DN. When parsing, all elements are stored in Names and
-// non-standard elements can be extracted from there. When marshaling, elements
-// in ExtraNames are appended and override other values with the same OID.
-type Name struct {
-	Country, Organization, OrganizationalUnit []string
-	Locality, Province                        []string
-	StreetAddress, PostalCode                 []string
-	SerialNumber, CommonName                  string
-
-	Names      []AttributeTypeAndValue
-	ExtraNames []AttributeTypeAndValue
-}
-
-func (n *Name) FillFromRDNSequence(rdns *RDNSequence) {
-	for _, rdn := range *rdns {
-		if len(rdn) == 0 {
-			continue
-		}
-		atv := rdn[0]
-		n.Names = append(n.Names, atv)
-		value, ok := atv.Value.(string)
-		if !ok {
-			continue
-		}
-
-		t := atv.Type
-		if len(t) == 4 && t[0] == 2 && t[1] == 5 && t[2] == 4 {
-			switch t[3] {
-			case 3:
-				n.CommonName = value
-			case 5:
-				n.SerialNumber = value
-			case 6:
-				n.Country = append(n.Country, value)
-			case 7:
-				n.Locality = append(n.Locality, value)
-			case 8:
-				n.Province = append(n.Province, value)
-			case 9:
-				n.StreetAddress = append(n.StreetAddress, value)
-			case 10:
-				n.Organization = append(n.Organization, value)
-			case 11:
-				n.OrganizationalUnit = append(n.OrganizationalUnit, value)
-			case 17:
-				n.PostalCode = append(n.PostalCode, value)
-			}
-		}
-	}
-}
-
-var (
-	oidCountry            = []int{2, 5, 4, 6}
-	oidOrganization       = []int{2, 5, 4, 10}
-	oidOrganizationalUnit = []int{2, 5, 4, 11}
-	oidCommonName         = []int{2, 5, 4, 3}
-	oidSerialNumber       = []int{2, 5, 4, 5}
-	oidLocality           = []int{2, 5, 4, 7}
-	oidProvince           = []int{2, 5, 4, 8}
-	oidStreetAddress      = []int{2, 5, 4, 9}
-	oidPostalCode         = []int{2, 5, 4, 17}
-)
-
-// appendRDNs appends a relativeDistinguishedNameSET to the given RDNSequence
-// and returns the new value. The relativeDistinguishedNameSET contains an
-// attributeTypeAndValue for each of the given values. See RFC 5280, A.1, and
-// search for AttributeTypeAndValue.
-func (n Name) appendRDNs(in RDNSequence, values []string, oid asn1.ObjectIdentifier) RDNSequence {
-	if len(values) == 0 || oidInAttributeTypeAndValue(oid, n.ExtraNames) {
-		return in
-	}
-
-	s := make([]AttributeTypeAndValue, len(values))
-	for i, value := range values {
-		s[i].Type = oid
-		s[i].Value = value
-	}
-
-	return append(in, s)
-}
-
-func (n Name) ToRDNSequence() (ret RDNSequence) {
-	ret = n.appendRDNs(ret, n.Country, oidCountry)
-	ret = n.appendRDNs(ret, n.Organization, oidOrganization)
-	ret = n.appendRDNs(ret, n.OrganizationalUnit, oidOrganizationalUnit)
-	ret = n.appendRDNs(ret, n.Locality, oidLocality)
-	ret = n.appendRDNs(ret, n.Province, oidProvince)
-	ret = n.appendRDNs(ret, n.StreetAddress, oidStreetAddress)
-	ret = n.appendRDNs(ret, n.PostalCode, oidPostalCode)
-	if len(n.CommonName) > 0 {
-		ret = n.appendRDNs(ret, []string{n.CommonName}, oidCommonName)
-	}
-	if len(n.SerialNumber) > 0 {
-		ret = n.appendRDNs(ret, []string{n.SerialNumber}, oidSerialNumber)
-	}
-	for _, atv := range n.ExtraNames {
-		ret = append(ret, []AttributeTypeAndValue{atv})
-	}
-
-	return ret
-}
-
-// oidInAttributeTypeAndValue returns whether a type with the given OID exists
-// in atv.
-func oidInAttributeTypeAndValue(oid asn1.ObjectIdentifier, atv []AttributeTypeAndValue) bool {
-	for _, a := range atv {
-		if a.Type.Equal(oid) {
-			return true
-		}
-	}
-	return false
-}
-
-// CertificateList represents the ASN.1 structure of the same name. See RFC
-// 5280, section 5.1. Use Certificate.CheckCRLSignature to verify the
-// signature.
-type CertificateList struct {
-	TBSCertList        TBSCertificateList
-	SignatureAlgorithm AlgorithmIdentifier
-	SignatureValue     asn1.BitString
-}
-
-// HasExpired reports whether now is past the expiry time of certList.
-func (certList *CertificateList) HasExpired(now time.Time) bool {
-	return now.After(certList.TBSCertList.NextUpdate)
-}
-
-// TBSCertificateList represents the ASN.1 structure of the same name. See RFC
-// 5280, section 5.1.
-type TBSCertificateList struct {
-	Raw                 asn1.RawContent
-	Version             int `asn1:"optional,default:1"`
-	Signature           AlgorithmIdentifier
-	Issuer              RDNSequence
-	ThisUpdate          time.Time
-	NextUpdate          time.Time            `asn1:"optional"`
-	RevokedCertificates []RevokedCertificate `asn1:"optional"`
-	Extensions          []Extension          `asn1:"tag:0,optional,explicit"`
-}
-
-// RevokedCertificate represents the ASN.1 structure of the same name. See RFC
-// 5280, section 5.1.
-type RevokedCertificate struct {
-	SerialNumber   *big.Int
-	RevocationTime time.Time
-	Extensions     []Extension `asn1:"optional"`
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/root.go b/third_party/gofrontend/libgo/go/crypto/x509/root.go
deleted file mode 100644
index 8aae14e..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/root.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-import "sync"
-
-var (
-	once        sync.Once
-	systemRoots *CertPool
-)
-
-func systemRootsPool() *CertPool {
-	once.Do(initSystemRoots)
-	return systemRoots
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/root_bsd.go b/third_party/gofrontend/libgo/go/crypto/x509/root_bsd.go
deleted file mode 100644
index 9317283..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/root_bsd.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build dragonfly freebsd netbsd openbsd
-
-package x509
-
-// Possible certificate files; stop after finding one.
-var certFiles = []string{
-	"/usr/local/share/certs/ca-root-nss.crt", // FreeBSD/DragonFly
-	"/etc/ssl/cert.pem",                      // OpenBSD
-	"/etc/openssl/certs/ca-certificates.crt", // NetBSD
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/root_cgo_darwin.go b/third_party/gofrontend/libgo/go/crypto/x509/root_cgo_darwin.go
deleted file mode 100644
index bf4a5cd..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/root_cgo_darwin.go
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo,!arm,!arm64,!ios
-
-package x509
-
-/*
-#cgo CFLAGS: -mmacosx-version-min=10.6 -D__MAC_OS_X_VERSION_MAX_ALLOWED=1060
-#cgo LDFLAGS: -framework CoreFoundation -framework Security
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <Security/Security.h>
-
-// FetchPEMRoots fetches the system's list of trusted X.509 root certificates.
-//
-// On success it returns 0 and fills pemRoots with a CFDataRef that contains the extracted root
-// certificates of the system. On failure, the function returns -1.
-//
-// Note: The CFDataRef returned in pemRoots must be released (using CFRelease) after
-// we've consumed its content.
-int FetchPEMRoots(CFDataRef *pemRoots) {
-	if (pemRoots == NULL) {
-		return -1;
-	}
-
-	CFArrayRef certs = NULL;
-	OSStatus err = SecTrustCopyAnchorCertificates(&certs);
-	if (err != noErr) {
-		return -1;
-	}
-
-	CFMutableDataRef combinedData = CFDataCreateMutable(kCFAllocatorDefault, 0);
-	int i, ncerts = CFArrayGetCount(certs);
-	for (i = 0; i < ncerts; i++) {
-		CFDataRef data = NULL;
-		SecCertificateRef cert = (SecCertificateRef)CFArrayGetValueAtIndex(certs, i);
-		if (cert == NULL) {
-			continue;
-		}
-
-		// Note: SecKeychainItemExport is deprecated as of 10.7 in favor of SecItemExport.
-		// Once we support weak imports via cgo we should prefer that, and fall back to this
-		// for older systems.
-		err = SecKeychainItemExport(cert, kSecFormatX509Cert, kSecItemPemArmour, NULL, &data);
-		if (err != noErr) {
-			continue;
-		}
-
-		if (data != NULL) {
-			CFDataAppendBytes(combinedData, CFDataGetBytePtr(data), CFDataGetLength(data));
-			CFRelease(data);
-		}
-	}
-
-	CFRelease(certs);
-
-	*pemRoots = combinedData;
-	return 0;
-}
-*/
-import "C"
-import "unsafe"
-
-func initSystemRoots() {
-	roots := NewCertPool()
-
-	var data C.CFDataRef = nil
-	err := C.FetchPEMRoots(&data)
-	if err == -1 {
-		return
-	}
-
-	defer C.CFRelease(C.CFTypeRef(data))
-	buf := C.GoBytes(unsafe.Pointer(C.CFDataGetBytePtr(data)), C.int(C.CFDataGetLength(data)))
-	roots.AppendCertsFromPEM(buf)
-	systemRoots = roots
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/root_darwin.go b/third_party/gofrontend/libgo/go/crypto/x509/root_darwin.go
deleted file mode 100644
index 78de56c..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/root_darwin.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:generate go run root_darwin_arm_gen.go -output root_darwin_armx.go
-
-package x509
-
-import "os/exec"
-
-func (c *Certificate) systemVerify(opts *VerifyOptions) (chains [][]*Certificate, err error) {
-	return nil, nil
-}
-
-func execSecurityRoots() (*CertPool, error) {
-	cmd := exec.Command("/usr/bin/security", "find-certificate", "-a", "-p", "/System/Library/Keychains/SystemRootCertificates.keychain")
-	data, err := cmd.Output()
-	if err != nil {
-		return nil, err
-	}
-
-	roots := NewCertPool()
-	roots.AppendCertsFromPEM(data)
-	return roots, nil
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/root_darwin_arm_gen.go b/third_party/gofrontend/libgo/go/crypto/x509/root_darwin_arm_gen.go
deleted file mode 100644
index 5817158..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/root_darwin_arm_gen.go
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// Generates root_darwin_armx.go.
-//
-// As of iOS 8, there is no API for querying the system trusted X.509 root
-// certificates. We could use SecTrustEvaluate to verify that a trust chain
-// exists for a certificate, but the x509 API requires returning the entire
-// chain.
-//
-// Apple publishes the list of trusted root certificates for iOS on
-// support.apple.com. So we parse the list and extract the certificates from
-// an OS X machine and embed them into the x509 package.
-package main
-
-import (
-	"bytes"
-	"crypto/x509"
-	"encoding/pem"
-	"flag"
-	"fmt"
-	"go/format"
-	"io/ioutil"
-	"log"
-	"math/big"
-	"net/http"
-	"os/exec"
-	"strings"
-)
-
-var output = flag.String("output", "root_darwin_armx.go", "file name to write")
-
-func main() {
-	certs, err := selectCerts()
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	buf := new(bytes.Buffer)
-
-	fmt.Fprintf(buf, "// Created by root_darwin_arm_gen --output %s; DO NOT EDIT\n", *output)
-	fmt.Fprintf(buf, "%s", header)
-
-	fmt.Fprintf(buf, "const systemRootsPEM = `\n")
-	for _, cert := range certs {
-		b := &pem.Block{
-			Type:  "CERTIFICATE",
-			Bytes: cert.Raw,
-		}
-		if err := pem.Encode(buf, b); err != nil {
-			log.Fatal(err)
-		}
-	}
-	fmt.Fprintf(buf, "`")
-
-	source, err := format.Source(buf.Bytes())
-	if err != nil {
-		log.Fatal("source format error:", err)
-	}
-	if err := ioutil.WriteFile(*output, source, 0644); err != nil {
-		log.Fatal(err)
-	}
-}
-
-func selectCerts() ([]*x509.Certificate, error) {
-	ids, err := fetchCertIDs()
-	if err != nil {
-		return nil, err
-	}
-
-	scerts, err := sysCerts()
-	if err != nil {
-		return nil, err
-	}
-
-	var certs []*x509.Certificate
-	for _, id := range ids {
-		sn, ok := big.NewInt(0).SetString(id.serialNumber, 0) // 0x prefix selects hex
-		if !ok {
-			return nil, fmt.Errorf("invalid serial number: %q", id.serialNumber)
-		}
-		ski, ok := big.NewInt(0).SetString(id.subjectKeyID, 0)
-		if !ok {
-			return nil, fmt.Errorf("invalid Subject Key ID: %q", id.subjectKeyID)
-		}
-
-		for _, cert := range scerts {
-			if sn.Cmp(cert.SerialNumber) != 0 {
-				continue
-			}
-			cski := big.NewInt(0).SetBytes(cert.SubjectKeyId)
-			if ski.Cmp(cski) != 0 {
-				continue
-			}
-			certs = append(certs, cert)
-			break
-		}
-	}
-	return certs, nil
-}
-
-func sysCerts() (certs []*x509.Certificate, err error) {
-	cmd := exec.Command("/usr/bin/security", "find-certificate", "-a", "-p", "/System/Library/Keychains/SystemRootCertificates.keychain")
-	data, err := cmd.Output()
-	if err != nil {
-		return nil, err
-	}
-	for len(data) > 0 {
-		var block *pem.Block
-		block, data = pem.Decode(data)
-		if block == nil {
-			break
-		}
-		if block.Type != "CERTIFICATE" || len(block.Headers) != 0 {
-			continue
-		}
-
-		cert, err := x509.ParseCertificate(block.Bytes)
-		if err != nil {
-			continue
-		}
-		certs = append(certs, cert)
-	}
-	return certs, nil
-}
-
-type certID struct {
-	serialNumber string
-	subjectKeyID string
-}
-
-// fetchCertIDs fetches IDs of iOS X509 certificates from apple.com.
-func fetchCertIDs() ([]certID, error) {
-	resp, err := http.Get("https://support.apple.com/en-us/HT204132")
-	if err != nil {
-		return nil, err
-	}
-	defer resp.Body.Close()
-	body, err := ioutil.ReadAll(resp.Body)
-	if err != nil {
-		return nil, err
-	}
-	text := string(body)
-	text = text[strings.Index(text, "<section id=trusted"):]
-	text = text[:strings.Index(text, "</section>")]
-
-	lines := strings.Split(text, "\n")
-	var ids []certID
-	var id certID
-	for i, ln := range lines {
-		if i == len(lines)-1 {
-			break
-		}
-		const sn = "Serial Number:"
-		if ln == sn {
-			id.serialNumber = "0x" + strings.Replace(strings.TrimSpace(lines[i+1]), ":", "", -1)
-			continue
-		}
-		if strings.HasPrefix(ln, sn) {
-			// extract hex value from parentheses.
-			id.serialNumber = ln[strings.Index(ln, "(")+1 : len(ln)-1]
-			continue
-		}
-		if strings.TrimSpace(ln) == "X509v3 Subject Key Identifier:" {
-			id.subjectKeyID = "0x" + strings.Replace(strings.TrimSpace(lines[i+1]), ":", "", -1)
-			ids = append(ids, id)
-			id = certID{}
-		}
-	}
-	return ids, nil
-}
-
-const header = `
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo
-// +build darwin
-// +build arm arm64
-
-package x509
-
-func initSystemRoots() {
-	systemRoots = NewCertPool()
-	systemRoots.AppendCertsFromPEM([]byte(systemRootsPEM))
-}
-`
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/root_darwin_armx.go b/third_party/gofrontend/libgo/go/crypto/x509/root_darwin_armx.go
deleted file mode 100644
index 37675b4..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/root_darwin_armx.go
+++ /dev/null
@@ -1,4907 +0,0 @@
-// Created by root_darwin_arm_gen --output root_darwin_armx.go; DO NOT EDIT
-
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo
-// +build darwin
-// +build arm arm64 ios
-
-package x509
-
-func initSystemRoots() {
-	systemRoots = NewCertPool()
-	systemRoots.AppendCertsFromPEM([]byte(systemRootsPEM))
-}
-
-const systemRootsPEM = `
------BEGIN CERTIFICATE-----
-MIIF8DCCA9igAwIBAgIPBuhGJy8fCo/RhFzjafbVMA0GCSqGSIb3DQEBBQUAMDgx
-CzAJBgNVBAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwKSXpl
-bnBlLmNvbTAeFw0wNzEyMTMxMzA4MjdaFw0zNzEyMTMwODI3MjVaMDgxCzAJBgNV
-BAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwKSXplbnBlLmNv
-bTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMnTesoPHqynhugWZWqx
-whtFMnGV2f4QW8yv56V5AY+Jw8ryVXH3d753lPNypCxE2J6SmxQ6oeckkAoKVo7F
-2CaU4dlI4S0+2gpy3aOZFdqBoof0e24md4lYrdbrDLJBenNubdt6eEHpCIgSfocu
-ZhFjbFT7PJ1ywLwu/8K33Q124zrX97RovqL144FuwUZvXY3gTcZUVYkaMzEKsVe5
-o4qYw+w7NMWVQWl+dcI8IMVhulFHoCCQk6GQS/NOfIVFVJrRBSZBsLVNHTO+xAPI
-JXzBcNs79AktVCdIrC/hxKw+yMuSTFM5NyPs0wH54AlETU1kwOENWocivK0bo/4m
-tRXzp/yEGensoYi0RGmEg/OJ0XQGqcwL1sLeJ4VQJsoXuMl6h1YsGgEebL4TrRCs
-tST1OJGh1kva8bvS3ke18byB9llrzxlT6Y0Vy0rLqW9E5RtBz+GGp8rQap+8TI0G
-M1qiheWQNaBiXBZO8OOi+gMatCxxs1gs3nsL2xoP694hHwZ3BgOwye+Z/MC5TwuG
-KP7Suerj2qXDR2kS4Nvw9hmL7Xtw1wLW7YcYKCwEJEx35EiKGsY7mtQPyvp10gFA
-Wo15v4vPS8+qFsGV5K1Mij4XkdSxYuWC5YAEpAN+jb/af6IPl08M0w3719Hlcn4c
-yHf/W5oPt64FRuXxqBbsR6QXAgMBAAGjgfYwgfMwgbAGA1UdEQSBqDCBpYEPaW5m
-b0BpemVucGUuY29tpIGRMIGOMUcwRQYDVQQKDD5JWkVOUEUgUy5BLiAtIENJRiBB
-MDEzMzcyNjAtUk1lcmMuVml0b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFDMEEG
-A1UECQw6QXZkYSBkZWwgTWVkaXRlcnJhbmVvIEV0b3JiaWRlYSAxNCAtIDAxMDEw
-IFZpdG9yaWEtR2FzdGVpejAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUHRxlDqjyJXu0kc/ksbHmvVV0bAUwDQYJKoZIhvcNAQEFBQAD
-ggIBAMeBRm8hGE+gBe/n1bqXUKJg7aWSFBpSm/nxiEqg3Hh10dUflU7F57dp5iL0
-+CmoKom+z892j+Mxc50m0xwbRxYpB2iEitL7sRskPtKYGCwkjq/2e+pEFhsqxPqg
-l+nqbFik73WrAGLRne0TNtsiC7bw0fRue0aHwp28vb5CO7dz0JoqPLRbEhYArxk5
-ja2DUBzIgU+9Ag89njWW7u/kwgN8KRwCfr00J16vU9adF79XbOnQgxCvv11N75B7
-XSus7Op9ACYXzAJcY9cZGKfsK8eKPlgOiofmg59OsjQerFQJTx0CCzl+gQgVuaBp
-E8gyK+OtbBPWg50jLbJtooiGfqgNASYJQNntKE6MkyQP2/EeTXp6WuKlWPHcj1+Z
-ggwuz7LdmMySlD/5CbOlliVbN/UShUHiGUzGigjB3Bh6Dx4/glmimj4/+eAJn/3B
-kUtdyXvWton83x18hqrNA/ILUpLxYm9/h+qrdslsUMIZgq+qHfUgKGgu1fxkN0/P
-pUTEvnK0jHS0bKf68r10OEMr3q/53NjgnZ/cPcqlY0S/kqJPTIAcuxrDmkoEVU3K
-7iYLHL8CxWTTnn7S05EcS6L1HOUXHA0MUqORH5zwIe0ClG+poEnK6EOMxPQ02nwi
-o8ZmPrgbBYhdurz3vOXcFD2nhqi2WVIhA16L4wTtSyoeo09Q
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
-RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
-bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
-IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
-MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
-LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
-YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
-A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
-K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
-sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
-MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
-XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
-HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
-4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
-j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
-U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
-zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
-u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
-bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
-fF6adulZkMV8gzURZVE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
-BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu
-IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw
-WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD
-ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y
-IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn
-IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+
-6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob
-jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw
-izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl
-+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY
-zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP
-pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF
-KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW
-ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB
-AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
-BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0
-ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW
-IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA
-A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0
-uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+
-FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7
-jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/
-u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D
-YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1
-puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa
-icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG
-DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x
-kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z
-Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE
-BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w
-MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
-IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC
-SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1
-ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv
-UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX
-4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9
-KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/
-gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb
-rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ
-51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F
-be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe
-KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F
-v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn
-fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7
-jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz
-ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
-ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL
-e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70
-jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz
-WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V
-SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j
-pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX
-X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok
-fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R
-K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU
-ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
-LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
-LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
-dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
-MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
-cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
-YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
-kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
-QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
-6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
-yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
-QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
-KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
-tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
-QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
-Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
-olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
-x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn
-MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
-ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg
-b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa
-MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB
-ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw
-IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B
-AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb
-unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d
-BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq
-7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3
-0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX
-roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG
-A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j
-aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p
-26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA
-BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud
-EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN
-BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
-aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB
-AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd
-p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi
-1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc
-XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0
-eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu
-tGWaIZDgqtCYvDi1czyL+Nw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
-MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
-GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
-YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
-MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
-BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
-GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
-BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
-3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
-YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
-rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
-ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
-oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
-MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
-QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
-b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
-AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
-GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
-Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
-G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
-l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
-smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
-gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
-BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
-MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
-YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
-RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
-UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
-2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
-Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
-+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
-DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
-nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
-/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
-PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
-QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
-SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
-IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
-RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
-zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
-BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
-ZQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDcDCCAligAwIBAgIBBTANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQGEwJVUzEY
-MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT
-A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMjAeFw0wNDEyMTMxNTAwMTBaFw0y
-OTEyMDUxNTAwMTBaMFsxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy
-bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRYwFAYDVQQDEw1Eb0Qg
-Um9vdCBDQSAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwCzB9o07
-rP8/PNZxvrh0IgfscEEV/KtA4weqwcPYn/7aTDq/P8jYKHtLNgHArEUlw9IOCo+F
-GGQQPRoTcCpvjtfcjZOzQQ84Ic2tq8I9KgXTVxE3Dc2MUfmT48xGSSGOFLTNyxQ+
-OM1yMe6rEvJl6jQuVl3/7mN1y226kTT8nvP0LRy+UMRC31mI/2qz+qhsPctWcXEF
-lrufgOWARVlnQbDrw61gpIB1BhecDvRD4JkOG/t/9bPMsoGCsf0ywbi+QaRktWA6
-WlEwjM7eQSwZR1xJEGS5dKmHQa99brrBuKG/ZTE6BGf5tbuOkooAY7ix5ow4X4P/
-UNU7ol1rshDMYwIDAQABoz8wPTAdBgNVHQ4EFgQUSXS7DF66ev4CVO97oMaVxgmA
-cJYwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
-ggEBAJiRjT+JyLv1wGlzKTs1rLqzCHY9cAmS6YREIQF9FHYb7lFsHY0VNy17MWn0
-mkS4r0bMNPojywMnGdKDIXUr5+AbmSbchECV6KjSzPZYXGbvP0qXEIIdugqi3VsG
-K52nZE7rLgE1pLQ/E61V5NVzqGmbEfGY8jEeb0DU+HifjpGgb3AEkGaqBivO4XqS
-tX3h4NGW56E6LcyxnR8FRO2HmdNNGnA5wQQM5X7Z8a/XIA7xInolpHOZzD+kByeW
-qKKV7YK5FtOeC4fCwfKI9WLfaN/HvGlR7bFc3FRUKQ8JOZqsA8HbDE2ubwp6Fknx
-v5HSOJTT9pUst2zJQraNypCNhdk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw
-PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz
-cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9
-MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz
-IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ
-ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR
-VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL
-kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd
-EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas
-H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0
-HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud
-DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4
-QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu
-Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/
-AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8
-yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR
-FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA
-ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB
-kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
-l7+ijrRU
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
-cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
-IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
-dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
-NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
-dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
-dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
-aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
-RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
-cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
-wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
-U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
-jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
-BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
-jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
-Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
-1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
-nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
-VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID9jCCAt6gAwIBAgIQZIKe/DcedF38l/+XyLH/QTANBgkqhkiG9w0BAQsFADCB
-lDELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8w
-HQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMUUwQwYDVQQDEzxTeW1hbnRl
-YyBDbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-IC0gRzYwHhcNMTExMDE4MDAwMDAwWhcNMzcxMjAxMjM1OTU5WjCBlDELMAkGA1UE
-BhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZT
-eW1hbnRlYyBUcnVzdCBOZXR3b3JrMUUwQwYDVQQDEzxTeW1hbnRlYyBDbGFzcyAy
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzYwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNzOkFyGOFyz9AYxe9GPo15gRn
-V2WYKaRPyVyPDzTS+NqoE2KquB5QZ3iwFkygOakVeq7t0qLA8JA3KRgmXOgNPLZs
-ST/B4NzZS7YUGQum05bh1gnjGSYc+R9lS/kaQxwAg9bQqkmi1NvmYji6UBRDbfkx
-+FYW2TgCkc/rbN27OU6Z4TBnRfHU8I3D3/7yOAchfQBeVkSz5GC9kSucq1sEcg+y
-KNlyqwUgQiWpWwNqIBDMMfAr2jUs0Pual07wgksr2F82owstr2MNHSV/oW5cYqGN
-KD6h/Bwg+AEvulWaEbAZ0shQeWsOagXXqgQ2sqPy4V93p3ec5R7c6d9qwWVdAgMB
-AAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
-BBSHjCCVyJhK0daABkqQNETfHE2/sDANBgkqhkiG9w0BAQsFAAOCAQEAgY6ypWaW
-tyGltu9vI1pf24HFQqV4wWn99DzX+VxrcHIa/FqXTQCAiIiCisNxDY7FiZss7Y0L
-0nJU9X3UXENX6fOupQIR9nYrgVfdfdp0MP1UR/bgFm6mtApI5ud1Bw8pGTnOefS2
-bMVfmdUfS/rfbSw8DVSAcPCIC4DPxmiiuB1w2XaM/O6lyc+tHc+ZJVdaYkXLFmu9
-Sc2lo4xpeSWuuExsi0BmSxY/zwIa3eFsawdhanYVKZl/G92IgMG/tY9zxaaWI4Sm
-KIYkM2oBLldzJbZev4/mHWGoQClnHYebHX+bn5nNMdZUvmK7OaxoEkiRIKXLsd3+
-b/xa5IJVWa8xqQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
-lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
-Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
-dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
-SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
-A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
-MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
-d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
-cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
-0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
-M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
-MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
-oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
-DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
-oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
-VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
-dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
-bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
-BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
-//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
-CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
-CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
-3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
-KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr
-MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl
-cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
-bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw
-CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h
-dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l
-cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h
-2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E
-lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV
-ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq
-299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t
-vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL
-dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
-AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF
-AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR
-zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3
-LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd
-7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw
-++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
-398znM/jra6O1I7mT1GvFpLgXPYHDw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
-MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
-bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2
-MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
-ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC
-206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci
-KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2
-JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9
-BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e
-Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B
-PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67
-Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq
-Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ
-o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3
-+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj
-YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj
-FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
-AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn
-xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2
-LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc
-obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8
-CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe
-IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA
-DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F
-AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX
-Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb
-AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl
-Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw
-RY8mkaKO/qk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
-VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0
-ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G
-CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y
-OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx
-FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp
-Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
-dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP
-kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc
-cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U
-fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7
-N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC
-xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1
-+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
-A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM
-Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG
-SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h
-mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk
-ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
-tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c
-2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t
-HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIHqTCCBZGgAwIBAgIQYwaGp8U3ZaVDkKhqWMzUMjANBgkqhkiG9w0BAQUFADCB
-jzELMAkGA1UEBhMCTFYxNTAzBgNVBAoTLFZBUyBMYXR2aWphcyBQYXN0cyAtIFZp
-ZW4ucmVnLk5yLjQwMDAzMDUyNzkwMSMwIQYDVQQLExpTZXJ0aWZpa2FjaWphcyBw
-YWthbHBvanVtaTEkMCIGA1UEAxMbVkFTIExhdHZpamFzIFBhc3RzIFNTSShSQ0Ep
-MB4XDTA2MDkxMzA5MjIxMFoXDTI0MDkxMzA5Mjc1N1owgY8xCzAJBgNVBAYTAkxW
-MTUwMwYDVQQKEyxWQVMgTGF0dmlqYXMgUGFzdHMgLSBWaWVuLnJlZy5Oci40MDAw
-MzA1Mjc5MDEjMCEGA1UECxMaU2VydGlmaWthY2lqYXMgcGFrYWxwb2p1bWkxJDAi
-BgNVBAMTG1ZBUyBMYXR2aWphcyBQYXN0cyBTU0koUkNBKTCCAiIwDQYJKoZIhvcN
-AQEBBQADggIPADCCAgoCggIBAJu4+f1hVS9PpKUUtS6OuSSPrPuxVD9A/0/F5YZo
-e1OT+zWCNahQLpRSoNuDPnXaFXCsCc/ugkmtNkm5tHGLtAChQgbKCApjl7YI/O60
-3Jh4GYLJ+H9kPqrJ/rGN67Bk9bzzxD46kOpOjj8bGbxqg8ORPGxV+wpSwOjhXXeF
-M8VJ3+xqv79sN/6OSaIVGM6LjmseOKMwb4iBfnJWRBrEejkP9sSPltSy6wBOXN67
-5zu35iQFk2tN5pFEv+6YG8eFGxFBeyI2p74+6Ho33BjekJ2PzbLXmj/iF39bDOHv
-P2Y9biTksM7DDIhslNo4JXxSOeNzFLMARWOaDEJAXgTG93JkzsluM7Pk020klTeT
-fvIAXRmLH/NDc6ifRdIGqey0Qrv67gzHTz9RH9Gv0KwYf4eBIv6p3QeWbXz4TtlN
-OlBp1UF+xdp02I5z5X6D4cMZgbe9v0COvi6aogyqTgIuuyrhCF0xA8msJ7Cv3NXI
-FH1AnVWJIfmQzNTJYEFzq+jN2DpVOQqCmf6b9fU8HJHLwPpGVK4h/CqsXHveepdx
-/WxrzUiapNuBfBg3L5B9YZS9F8lctlQWd8oJSqrpvE+UdQFaVryS0o+515feVnQB
-9xZxSbH1GEaZQe5i4bMsZXVpKXJDA/ibH/o49J7sQBCOrJfVsDO+nxjcLfdBeFRK
-YkTnAgMBAAGjggH9MIIB+TAOBgNVHQ8BAf8EBAMCAQYwGAYIKwYBBQUHAQMEDDAK
-MAgGBgQAjkYBATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTMw/Vm/3OsOFqW
-GyGJuIFMH8teJTAQBgkrBgEEAYI3FQEEAwIBADCCAYkGA1UdIASCAYAwggF8MIIB
-eAYLKwYBBAGBxFkBAQIwggFnMIIBOAYIKwYBBQUHAgIwggEqHoIBJgBTAGkAcwAg
-AGkAcgAgAHMAZQByAHQAaQBmAGkAawBhAHQAcwAsACAAawBvACAAaQB6AGQAZQB2
-AGkAcwAgAFYAQQBTACAATABhAHQAdgBpAGoAYQBzACAAUABhAHMAdABzACwAIABu
-AG8AZAByAG8AcwBpAG4AbwB0ACAAYQB0AGIAaQBsAHMAdABpAGIAdQAgAEUAbABl
-AGsAdAByAG8AbgBpAHMAawBvACAAZABvAGsAdQBtAGUAbgB0AHUAIABsAGkAawB1
-AG0AYQBtACAAdQBuACAARQBpAHIAbwBwAGEAcwAgAFAAYQByAGwAYQBtAGUAbgB0
-AGEAIABkAGkAcgBlAGsAdABpAHYAYQBpACAAMQA5ADkAOQAvADkAMwAvAEUASzAp
-BggrBgEFBQcCARYdaHR0cDovL3d3dy5lLW1lLmx2L3JlcG9zaXRvcnkwDQYJKoZI
-hvcNAQEFBQADggIBAB8oSjWQIWNoCi94r6MegiaXoz8nGdJLo0J6BhNlW8EEy+t9
-fO+U8vGJ9bffUgIhadLqljTloM+XuJxVDhCFoxReLAX4tTp28/l6uN62DCdp8suU
-kQsdudWOb5kvzfIZVjk6SFbwAf+Cdbay/dHU9fJjV0xNoX7MELoEae/0FPyzlx9F
-7m9KKH/Rxie8x6Opa3vtghNvq94P+3HrXBEaqSzQMJ/8NjdW75XpurcTtq6fAmGt
-nuxrBG82nw+Z98LJyEwouSjUIdeeVNXAzvSO5FWUe48kxjj8q3qkVnc9qEXvZJKk
-0Ep+u3OL9A1Sc7g6SF5DgNOpcHdi/8coHHMeQ+YnJFtJueY2pI79xS0veqV5EnrX
-IbIlbcgPosNhS+VI4le6n/KKId3bZPDaGd/OwJuAOcJ3d2MVU3KE+qSPBzeGIX1Q
-+j1qN9uRDjez/c4Lynth0Jx0nH04aG3pex3W8Sq07ztgUncF5gLCX4xbvPB9t3PH
-kWuyKrNjozTVq60lcUf/Gj56to2VdsPups0DCWzuRWeYz5lIdsHOinSaaFIBNCLI
-7eIUC4S9bhCMsXKbvugI11fVf+q0AT1O5OLoZ+eMfunnQhHvlUbIkda+JxeAGTSY
-58bfHvwhX56GPbx+8Jy9cp70R4JbcWfz+txUTKhc2FnH0AcOEzMnvPRp8Gsh
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET
-MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE
-AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw
-CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg
-YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE
-Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX
-mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD
-XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW
-S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp
-FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD
-AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu
-ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z
-ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv
-Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw
-DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6
-yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq
-EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
-CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB
-EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN
-PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDXTCCAkWgAwIBAgIDAOJCMA0GCSqGSIb3DQEBBQUAMFUxCzAJBgNVBAYTAkFU
-MRAwDgYDVQQKEwdBLVRydXN0MRkwFwYDVQQLExBBLVRydXN0LW5RdWFsLTAxMRkw
-FwYDVQQDExBBLVRydXN0LW5RdWFsLTAxMB4XDTA0MTEzMDIzMDAwMFoXDTE0MTEz
-MDIzMDAwMFowVTELMAkGA1UEBhMCQVQxEDAOBgNVBAoTB0EtVHJ1c3QxGTAXBgNV
-BAsTEEEtVHJ1c3QtblF1YWwtMDExGTAXBgNVBAMTEEEtVHJ1c3QtblF1YWwtMDEw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD/9RyAEZ6eHmhYzNJ328f0
-jmdSUFi6EqRqOxb3jHNPTIpK82CR6z5lmSnZQNUuCPD+htbNZffd2DKVB06NOyZ1
-2zcOMCgj4GtkZoqE0zPpPT3bpoE55nkZZe/qWEX/64wz/L/4EdkvKDSKG/UsP75M
-tmCVY5m2Eg73RVFRz4ccBIMpHel4lzEqSkdDtZOY5fnkrE333hx67nxq21vY8Eyf
-8O4fPQ5RtN8eohQCcPQ1z6ypU1R7N9jPRpnI+yzMOiwd3+QcKhHi1miCzo0pkOaB
-1CwmfsTyNl8qU0NJUL9Ta6cea7WThwTiWol2yD88cd2cy388xpbNkfrCPmZNGLoV
-AgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECE5ZzscCMocwMA4G
-A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEA69I9R1hU9Gbl9vV7W7AH
-QpUJAlFAvv2It/eY8p2ouQUPVaSZikaKtAYrCD/arzfXB43Qet+dM6CpHsn8ikYR
-vQKePjXv3Evf+C1bxwJAimcnZV6W+bNOTpdo8lXljxkmfN+Z5S+XzvK2ttUtP4Et
-YOVaxHw2mPMNbvDeY+foJkiBn3KYjGabMaR8moZqof5ofj4iS/WyamTZti6v/fKx
-n1vII+/uWkcxV5DT5+r9HLon0NYF0Vg317Wh+gWDV59VZo+dcwJDb+keYqMFYoqp
-77SGkZGu41S8NGYkQY3X9rNHRkDbLfpKYDmy6NanpOE1EHW1/sNSFAs43qZZKJEQ
-xg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB
-rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
-Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
-dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt
-Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa
-Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV
-BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l
-dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE
-AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B
-YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9
-hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l
-L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm
-SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM
-1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws
-6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
-DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw
-Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50
-aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH
-AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u
-7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0
-xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ
-rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim
-eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk
-USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
-dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
-A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
-cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
-qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
-JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
-+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
-s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
-HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
-70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
-V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
-qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
-5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
-C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
-OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
-FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
-KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
-Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
-8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
-MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
-0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
-u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
-u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
-YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
-GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
-RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
-KeC2uAloGRwYQw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU
-MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
-b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx
-MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB
-ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV
-BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV
-6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX
-GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP
-dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH
-1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF
-62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW
-BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
-AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL
-MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
-cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv
-b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6
-IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/
-iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
-GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh
-4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm
-XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEajCCA1KgAwIBAgIBATANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJKUDEN
-MAsGA1UECgwESlBLSTEpMCcGA1UECwwgUHJlZmVjdHVyYWwgQXNzb2NpYXRpb24g
-Rm9yIEpQS0kxETAPBgNVBAsMCEJyaWRnZUNBMB4XDTAzMTIyNzA1MDgxNVoXDTEz
-MTIyNjE0NTk1OVowWjELMAkGA1UEBhMCSlAxDTALBgNVBAoMBEpQS0kxKTAnBgNV
-BAsMIFByZWZlY3R1cmFsIEFzc29jaWF0aW9uIEZvciBKUEtJMREwDwYDVQQLDAhC
-cmlkZ2VDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANTnUmg7K3m8
-52vd77kwkq156euwoWm5no8E8kmaTSc7x2RABPpqNTlMKdZ6ttsyYrqREeDkcvPL
-yF7yf/I8+innasNtsytcTAy8xY8Avsbd4JkCGW9dyPjk9pzzc3yLQ64Rx2fujRn2
-agcEVdPCr/XpJygX8FD5bbhkZ0CVoiASBmlHOcC3YpFlfbT1QcpOSOb7o+VdKVEi
-MMfbBuU2IlYIaSr/R1nO7RPNtkqkFWJ1/nKjKHyzZje7j70qSxb+BTGcNgTHa1YA
-UrogKB+UpBftmb4ds+XlkEJ1dvwokiSbCDaWFKD+YD4B2s0bvjCbw8xuZFYGhNyR
-/2D5XfN1s2MCAwEAAaOCATkwggE1MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
-BTADAQH/MG0GA1UdHwRmMGQwYqBgoF6kXDBaMQswCQYDVQQGEwJKUDENMAsGA1UE
-CgwESlBLSTEpMCcGA1UECwwgUHJlZmVjdHVyYWwgQXNzb2NpYXRpb24gRm9yIEpQ
-S0kxETAPBgNVBAsMCEJyaWRnZUNBMIGDBgNVHREEfDB6pHgwdjELMAkGA1UEBhMC
-SlAxJzAlBgNVBAoMHuWFrOeahOWAi+S6uuiqjeiovOOCteODvOODk+OCuTEeMBwG
-A1UECwwV6YO96YGT5bqc55yM5Y2U6K2w5LyaMR4wHAYDVQQLDBXjg5bjg6rjg4Pj
-grjoqo3oqLzlsYAwHQYDVR0OBBYEFNQXMiCqQNkR2OaZmQgLtf8mR8p8MA0GCSqG
-SIb3DQEBBQUAA4IBAQATjJo4reTNPC5CsvAKu1RYT8PyXFVYHbKsEpGt4GR8pDCg
-HEGAiAhHSNrGh9CagZMXADvlG0gmMOnXowriQQixrtpkmx0TB8tNAlZptZWkZC+R
-8TnjOkHrk2nFAEC3ezbdK0R7MR4tJLDQCnhEWbg50rf0wZ/aF8uAaVeEtHXa6W0M
-Xq3dSe0XAcrLbX4zZHQTaWvdpLAIjl6DZ3SCieRMyoWUL+LXaLFdTP5WBCd+No58
-IounD9X4xxze2aeRVaiV/WnQ0OSPNS7n7YXy6xQdnaOU4KRW/Lne1EDf5IfWC/ih
-bVAmhZMbcrkWWcsR6aCPG+2mV3zTD6AUzuKPal8Y
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
-A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
-b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
-MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
-YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
-aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
-jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
-xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
-1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
-snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
-U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
-9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
-BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
-AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
-yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
-38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
-AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
-DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
-HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzELMAkG
-A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
-b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
-MDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
-YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
-aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
-jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
-xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
-1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
-snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
-U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
-9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQU
-YHtmGkUNl8qJUC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B
-AQQFAAOCAQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq7
-5bCdPTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q
-gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT2iHR
-rH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlDNPYPhyk7
-ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBgHcl5JLL2bP2o
-Zg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE
-SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg
-Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV
-BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl
-cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA
-vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu
-Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a
-0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1
-4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN
-eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD
-R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG
-A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu
-dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME
-Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3
-WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw
-HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ
-KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO
-Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX
-wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
-2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89
-9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0
-jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38
-aQNiuJkFBT1reBK9sG9l
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk
-MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH
-bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
-DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
-QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
-MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ
-FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw
-DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F
-uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX
-kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs
-ewv4n4Q=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
-TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
-MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
-IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
-dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
-li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
-rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
-WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
-F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
-xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
-Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
-dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
-ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
-IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
-c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
-ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
-Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
-KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
-KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
-y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
-dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
-VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
-MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
-fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
-7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
-cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
-mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
-xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
-SnQ2+Q==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
-KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
-BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
-YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1
-OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
-aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
-ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd
-AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC
-FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi
-1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq
-jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ
-wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/
-WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy
-NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC
-uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw
-IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6
-g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
-9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP
-BSeOE6Fuwg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw
-NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv
-b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD
-VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2
-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F
-VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1
-7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X
-Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+
-/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs
-81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm
-dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe
-Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu
-sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4
-pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs
-slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ
-arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD
-VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG
-9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl
-dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
-0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj
-TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed
-Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7
-Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI
-OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7
-vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW
-t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn
-HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx
-SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
-qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
-Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
-MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
-BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
-NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
-LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
-A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
-W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
-3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
-6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
-Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
-NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
-MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
-r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
-DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
-YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
-xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
-/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
-LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
-jVaMaA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDhDCCAmygAwIBAgIBCTANBgkqhkiG9w0BAQUFADAzMQswCQYDVQQGEwJDTjER
-MA8GA1UEChMIVW5pVHJ1c3QxETAPBgNVBAMTCFVDQSBSb290MB4XDTA0MDEwMTAw
-MDAwMFoXDTI5MTIzMTAwMDAwMFowMzELMAkGA1UEBhMCQ04xETAPBgNVBAoTCFVu
-aVRydXN0MREwDwYDVQQDEwhVQ0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBALNdB8qGJn1r4vs4CQ7MgsJqGgCiFV/W6dQBt1YDAVmP9ThpJHbC
-XivF9iu/r/tB/Q9a/KvXg3BNMJjRnrJ2u5LWu+kQKGkoNkTo8SzXWHwk1n8COvCB
-a2FgP/Qz3m3l6ihST/ypHWN8C7rqrsRoRuTej8GnsrZYWm0dLNmMOreIy4XU9+gD
-Xv2yTVDo1h//rgI/i0+WITyb1yXJHT/7mLFZ5PCpO6+zzYUs4mBGzG+OoOvwNMXx
-QhhgrhLtRnUc5dipllq+3lrWeGeWW5N3UPJuG96WUUqm1ktDdSFmjXfsAoR2XEQQ
-th1hbOSjIH23jboPkXXHjd+8AmCoKai9PUMCAwEAAaOBojCBnzALBgNVHQ8EBAMC
-AQYwDAYDVR0TBAUwAwEB/zBjBgNVHSUEXDBaBggrBgEFBQcDAQYIKwYBBQUHAwIG
-CCsGAQUFBwMDBggrBgEFBQcDBAYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEFBQcD
-BwYIKwYBBQUHAwgGCCsGAQUFBwMJMB0GA1UdDgQWBBTbHzXza0z/QjFkm827Wh4d
-SBC37jANBgkqhkiG9w0BAQUFAAOCAQEAOGy3iPGt+lg3dNHocN6cJ1nL5BXXoMNg
-14iABMUwTD3UGusGXllH5rxmy+AI/Og17GJ9ysDawXiv5UZv+4mCI4/211NmVaDe
-JRI7cTYWVRJ2+z34VFsxugAG+H1V5ad2g6pcSpemKijfvcZsCyOVjjN/Hl5AHxNU
-LJzltQ7dFyiuawHTUin1Ih+QOfTcYmjwPIZH7LgFRbu3DJaUxmfLI3HQjnQi1kHr
-A6i26r7EARK1s11AdgYg1GS4KUYGis4fk5oQ7vuqWrTcL9Ury/bXBYSYBZELhPc9
-+tb5evosFeo2gkO3t7jj83EB7UNDogVFwygFBzXjAaU4HoDU18PZ3g==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB
-ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly
-aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
-ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w
-NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G
-A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD
-VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX
-SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR
-VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2
-w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF
-mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg
-4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9
-4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw
-DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw
-EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx
-SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2
-ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8
-vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
-hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi
-Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ
-/L7fCg0=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDlDCCAnygAwIBAgIQWAsFbFMk27JQVxhf+eWmUDANBgkqhkiG9w0BAQUFADAn
-MQswCQYDVQQGEwJCRTEYMBYGA1UEAxMPQmVsZ2l1bSBSb290IENBMB4XDTAzMDEy
-NjIzMDAwMFoXDTE0MDEyNjIzMDAwMFowJzELMAkGA1UEBhMCQkUxGDAWBgNVBAMT
-D0JlbGdpdW0gUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AMihcekcRkJ5eHFvna6pqKsot03HIOswkVp19eLSz8hMFJhCWK3HEcVAQGpa+XQS
-J4fpnOVxTiIs0RIYqjBeoiG52bv/9nTrMQHnO35YD5EWTXaJqAFPrSJmcPpLHZXB
-MFjqvNll2Jq0iOtJRlLf0lMVdssUXRlJsW9q09P9vMIt7EU/CT9YvvzU7wCMgTVy
-v/cY6pZifSsofxVsY9LKyn0FrMhtB20yvmi4BUCuVJhWPmbxMOjvxKuTXgfeMo8S
-dKpbNCNUwOpszv42kqgJF+qhLc9s44Qd3ocuMws8dOIhUDiVLlzg5cYx+dtA+mqh
-pIqTm6chBocdJ9PEoclMsG8CAwEAAaOBuzCBuDAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGBWA4AQEBMC4wLAYIKwYBBQUHAgEW
-IGh0dHA6Ly9yZXBvc2l0b3J5LmVpZC5iZWxnaXVtLmJlMB0GA1UdDgQWBBQQ8AxW
-m2HqVzq2NZdtn925FI7b5jARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAU
-EPAMVpth6lc6tjWXbZ/duRSO2+YwDQYJKoZIhvcNAQEFBQADggEBAMhtIlGKYfgP
-lm7VILKB+MbcoxYA2s1q52sq+llIp0xJN9dzoWoBZV4yveeX09AuPHPTjHuD79ZC
-wT+oqV0PN7p20kC9zC0/00RBSZz9Wyn0AiMiW3Ebv1jZKE4tRfTa57VjRUQRDSp/
-M382SbTObqkCMa5c/ciJv0J71/Fg8teH9lcuen5qE4Ad3OPQYx49cTGxYNSeCMqr
-8JTHSHVUgfMbrXec6LKP24OsjzRr6L/D2fVDw2RV6xq9NoY2uiGMlxoh1OotO6y6
-7Kcdq765Sps1LxxcHVGnH1TtEpf/8m6HfUbJdNbv6z195lluBpQE5KJVhzgoaiJe
-4r50ErAEQyo=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
-dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
-MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
-cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
-Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
-ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
-MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
-yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
-VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
-nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
-KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
-XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
-vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
-Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
-N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
-nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF
-MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD
-bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw
-NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV
-BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn
-ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0
-3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z
-qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR
-p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8
-HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw
-ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea
-HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw
-Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh
-c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E
-RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt
-dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku
-Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp
-3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
-nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF
-CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na
-xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX
-KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk
-MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0
-YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg
-Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT
-AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp
-Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN
-BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr
-jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r
-0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f
-2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP
-ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF
-y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA
-tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL
-6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0
-uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL
-acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh
-k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q
-VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw
-FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O
-BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh
-b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R
-fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv
-/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI
-REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx
-srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv
-aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT
-woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n
-Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W
-t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N
-8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2
-9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5
-wSsSnqaeG8XmDtkx2Q==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCB
-lTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
-Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
-dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3Qt
-T2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAzNlowgZUxCzAJBgNV
-BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAc
-BgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3
-dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicP
-HxzfOpuCaDDASmEd8S8O+r5596Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLO
-KqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo
-5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+
-pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehb
-kkj7RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUC
-AwEAAaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
-FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov
-L2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDApBgNV
-HSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQwDQYJKoZIhvcN
-AQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw
-NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXB
-mMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU
-4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK5
-81OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCGhU3IfdeLA/5u1fedFqySLKAj5ZyR
-Uh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDjjCCAnagAwIBAgIIKv++n6Lw6YcwDQYJKoZIhvcNAQEFBQAwKDELMAkGA1UE
-BhMCQkUxGTAXBgNVBAMTEEJlbGdpdW0gUm9vdCBDQTIwHhcNMDcxMDA0MTAwMDAw
-WhcNMjExMjE1MDgwMDAwWjAoMQswCQYDVQQGEwJCRTEZMBcGA1UEAxMQQmVsZ2l1
-bSBSb290IENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMZzQh6S
-/3UPi790hqc/7bIYLS2X+an7mEoj39WN4IzGMhwWLQdC1i22bi+n9fzGhYJdld61
-IgDMqFNAn68KNaJ6x+HK92AQZw6nUHMXU5WfIp8MXW+2QbyM69odRr2nlL/zGsvU
-+40OHjPIltfsjFPekx40HopQcSZYtF3CiInaYNKJIT/e1wEYNm7hLHADBGXvmAYr
-XR5i3FVr/mZkIV/4L+HXmymvb82fqgxG0YjFnaKVn6w/Fa7yYd/vw2uaItgscf1Y
-HewApDgglVrH1Tdjuk+bqv5WRi5j2Qsj1Yr6tSPwiRuhFA0m2kHwOI8w7QUmecFL
-TqG4flVSOmlGhHUCAwEAAaOBuzCBuDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zBCBgNVHSAEOzA5MDcGBWA4CQEBMC4wLAYIKwYBBQUHAgEWIGh0dHA6
-Ly9yZXBvc2l0b3J5LmVpZC5iZWxnaXVtLmJlMB0GA1UdDgQWBBSFiuv0xbu+DlkD
-lN7WgAEV4xCcOTARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUhYrr9MW7
-vg5ZA5Te1oABFeMQnDkwDQYJKoZIhvcNAQEFBQADggEBAFHYhd27V2/MoGy1oyCc
-UwnzSgEMdL8rs5qauhjyC4isHLMzr87lEwEnkoRYmhC598wUkmt0FoqW6FHvv/pK
-JaeJtmMrXZRY0c8RcrYeuTlBFk0pvDVTC9rejg7NqZV3JcqUWumyaa7YwBO+mPyW
-nIR/VRPmPIfjvCCkpDZoa01gZhz5v6yAlGYuuUGK02XThIAC71AdXkbc98m6tTR8
-KvPG2F9fVJ3bTc0R5/0UAoNmXsimABKgX77OFP67H6dh96tK8QYUn8pJQsKpvO2F
-sauBQeYNxUJpU4c5nUwfAA4+Bw11V0SoU7Q2dmSZ3G7rPUZuFF1eR1ONeE3gJ7uO
-hXY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX
-DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
-ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
-b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291
-qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp
-uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU
-Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE
-pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp
-5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M
-UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN
-GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy
-5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv
-6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK
-eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6
-B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/
-BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov
-L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG
-SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS
-CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen
-5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897
-IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK
-gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL
-+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL
-vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm
-bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk
-N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC
-Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z
-ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk
-MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH
-bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
-DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
-QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
-MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc
-8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke
-hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI
-KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg
-515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO
-xwy8p2Fp8fc74SrL+SvzZpA3
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD
-VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
-IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
-MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
-aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx
-MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy
-cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG
-A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl
-BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI
-hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed
-KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7
-G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2
-zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4
-ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG
-HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2
-Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V
-yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e
-beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r
-6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
-wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog
-zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW
-BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr
-ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp
-ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk
-cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt
-YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC
-CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow
-KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI
-hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ
-UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz
-X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x
-fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz
-a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd
-Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd
-SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O
-AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso
-M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge
-v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
-09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF3zCCA8egAwIBAgIOGTMAAQACKBqaBLzyVUUwDQYJKoZIhvcNAQEFBQAwejEL
-MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
-BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEnMCUGA1UEAxMeVEMgVHJ1
-c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJMB4XDTA2MDMyMjE1NTgzNFoXDTMwMTIz
-MTIyNTk1OVowejELMAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVy
-IEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEnMCUG
-A1UEAxMeVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJMIICIjANBgkqhkiG
-9w0BAQEFAAOCAg8AMIICCgKCAgEAi9R3azRs5TbYalxeOO781R15Azt7g2JEgk6I
-7d6D/+7MUGIFBZWZdpj2ufJf2AaRksL2LWYXH/1TA+iojWOpbuHWG4y8mLOLO9Tk
-Lsp9hUkmW3m4GotAnn+7yT9jLM/RWny6KCJBElpN+Rd3/IX9wkngKhh/6aAsnPlE
-/AxoOUL1JwW+jhV6YJ3wO8c85j4WvK923mq3ouGrRkXrjGV90ZfzlxElq1nroCLZ
-gt2Y7X7i+qBhCkoy3iwX921E6oFHWZdXNwM53V6CItQzuPomCba8OYgvURVOm8M7
-3xOCiN1LNPIz1pDp81PcNXzAw9l8eLPNcD+NauCjgUjkKa1juPD8KGQ7mbN9/pqd
-iPaZIgiRRxaJNXhdd6HPv0nh/SSUK2k2e+gc5iqQilvVOzRZQtxtz7sPQRxVzfUN
-Wy4WIibvYR6X/OJTyM9bo8ep8boOhhLLE8oVx+zkNo3aXBM9ZdIOXXB03L+PemrB
-Lg/Txl4PK1lszGFs/sBhTtnmT0ayWuIZFHCE+CAA7QGnl37DvRJckiMXoKUdRRcV
-I5qSCLUiiI3cKyTr4LEXaNOvYb3ZhXj2jbp4yjeNY77nrB/fpUcJucglMVRGURFV
-DYlcjdrSGC1z8rjVJ/VIIjfRYvd7Dcg4i6FKsPzQ8eu3hmPn4A5zf/1yUbXpfeJV
-BWR4Z38CAwEAAaNjMGEwHwYDVR0jBBgwFoAUzdeQoW6jv9sw1toyJZAM5jkegGUw
-DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFM3XkKFu
-o7/bMNbaMiWQDOY5HoBlMA0GCSqGSIb3DQEBBQUAA4ICAQB+FojoEw42zG4qhQc4
-xlaJeuNHIWZMUAgxWlHQ/KZeFHXeTDvs8e3MfhEHSmHu6rOOOqQzxu2KQmZP8Tx7
-yaUFQZmx7Cxb7tyW0ohTS3g0uW7muw/FeqZ8Dhjfbw90TNGp8aHp2FRkzF6WeKJW
-GsFzshXGVwXf2vdIJIqOf2qp+U3pPmrOYCx9LZAI9mOPFdAtnIz/8f38DBZQVhT7
-upeG7rRJA1TuG1l/MDoCgoYhrv7wFfLfToPmmcW6NfcgkIw47XXP4S73BDD7Ua2O
-giRAyn0pXdXZ92Vk/KqfdLh9kl3ShCngE+qK99CrxK7vFcXCifJ7tjtJmGHzTnKR
-N4xJkunI7Cqg90lufA0kxmts8jgvynAF5X/fxisrgIDV2m/LQLvYG/AkyRDIRAJ+
-LtOYqqIN8SvQ2vqOHP9U6OFKbt2o1ni1N6WsZNUUI8cOpevhCTjXwHxgpV2Yj4wC
-1dxWqPNNWKkL1HxkdAEy8t8PSoqpAqKiHYR3wvHMl700GXRd4nQ+dSf3r7/ufA5t
-VIimVuImrTESPB5BeW0X6hNeH/Vcn0lZo7Ivo0LD+qh+v6WfSMlgYmIK371F3uNC
-tVGW/cT1Gpm4UqJEzS1hjBWPgdVdotSQPYxuQGHDWV3Y2eH2dEcieXR92sqjbzcV
-NvAsGnE8EXbfXRo+VGN4a2V+Hw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk
-MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0
-YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg
-Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT
-AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp
-Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN
-BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9
-m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih
-FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/
-TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F
-EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco
-kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu
-HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF
-vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo
-19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC
-L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW
-bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX
-JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw
-FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
-BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc
-K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf
-ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik
-Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB
-sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e
-3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR
-ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip
-mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH
-b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf
-rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms
-hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y
-zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6
-MBr1mmz0DlP5OlvRHA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB
-kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
-Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
-dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw
-IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG
-EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD
-VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu
-dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6
-E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ
-D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK
-4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq
-lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW
-bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB
-o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT
-MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js
-LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr
-BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB
-AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
-Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj
-j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH
-KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv
-2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3
-mfnGV/TJVTl4uix5yaaIK/QI
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEBDCCAuygAwIBAgIIGHqpqMKWIQwwDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE
-BhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTEy
-MDIwMTIyMTIxNVoXDTI3MDIwMTIyMTIxNVoweTEtMCsGA1UEAwwkRGV2ZWxvcGVy
-IElEIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSYwJAYDVQQLDB1BcHBsZSBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UE
-BhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCJdk8GW5pB7qUj
-KwKjX9dzP8A1sIuECj8GJH+nlT/rTw6Tr7QO0Mg+5W0Ysx/oiUe/1wkI5P9WmCkV
-55SduTWjCs20wOHiYPTK7Cl4RWlpYGtfipL8niPmOsIiszFPHLrytjRZQu6wqQID
-GJEEtrN4LjMfgEUNRW+7Dlpbfzrn2AjXCw4ybfuGNuRsq8QRinCEJqqfRNHxuMZ7
-lBebSPcLWBa6I8WfFTl+yl3DMl8P4FJ/QOq+rAhklVvJGpzlgMofakQcbD7EsCYf
-Hex7r16gaj1HqVgSMT8gdihtHRywwk4RaSaLy9bQEYLJTg/xVnTQ2QhLZniiq6yn
-4tJMh1nJAgMBAAGjgaYwgaMwHQYDVR0OBBYEFFcX7aLP3HyYoRDg/L6HLSzy4xdU
-MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01/
-CF4wLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybC5hcHBsZS5jb20vcm9vdC5j
-cmwwDgYDVR0PAQH/BAQDAgGGMBAGCiqGSIb3Y2QGAgYEAgUAMA0GCSqGSIb3DQEB
-CwUAA4IBAQBCOXRrodzGpI83KoyzHQpEvJUsf7xZuKxh+weQkjK51L87wVA5akR0
-ouxbH3Dlqt1LbBwjcS1f0cWTvu6binBlgp0W4xoQF4ktqM39DHhYSQwofzPuAHob
-tHastrW7T9+oG53IGZdKC1ZnL8I+trPEgzrwd210xC4jUe6apQNvYPSlSKcGwrta
-4h8fRkV+5Jf1JxC3ICJyb3LaxlB1xT0lj12jAOmfNoxIOY+zO+qQgC6VmmD0eM70
-DgpTPqL6T9geroSVjTK8Vk2J6XgY4KyaQrp6RhuEoonOFOiI0ViL9q5WxCwFKkWv
-C9lLqQIPNKyIx2FViUTJJ3MH7oLlTvVw
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx
-IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs
-cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v
-dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0
-MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl
-bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD
-DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r
-WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU
-Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs
-HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj
-z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf
-SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl
-AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG
-KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P
-AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j
-BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC
-VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX
-ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
-Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB
-ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd
-/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB
-A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn
-k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9
-iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv
-2G0xffX8oRAHh84vWdw+WNs=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICqDCCAi2gAwIBAgIQIW4zpcvTiKRvKQe0JzzE2DAKBggqhkjOPQQDAzCBlDEL
-MAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYD
-VQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMUUwQwYDVQQDEzxTeW1hbnRlYyBD
-bGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0g
-RzQwHhcNMTExMDA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBlDELMAkGA1UEBhMC
-VVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1h
-bnRlYyBUcnVzdCBOZXR3b3JrMUUwQwYDVQQDEzxTeW1hbnRlYyBDbGFzcyAxIFB1
-YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcq
-hkjOPQIBBgUrgQQAIgNiAATXZrUb266zYO5G6ohjdTsqlG3zXxL24w+etgoUU0hS
-yNw6s8tIICYSTvqJhNTfkeQpfSgB2dsYQ2mhH7XThhbcx39nI9/fMTGDAzVwsUu3
-yBe7UcvclBfb6gk7dhLeqrWjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
-BTADAQH/MB0GA1UdDgQWBBRlwI0l9Qy6l3eQP54u4Fr1ztXh5DAKBggqhkjOPQQD
-AwNpADBmAjEApa7jRlP4mDbjIvouKEkN7jB+M/PsP3FezFWJeJmssv3cHFwzjim5
-axfIEWi13IMHAjEAnMhE2mnCNsNUGRCFAtqdR+9B52wmnQk9922Q0QVEL7C8g5No
-8gxFSTm/mQQc0xCg
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL
-MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
-BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1
-c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx
-MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg
-R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD
-VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR
-JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T
-fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu
-jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z
-wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ
-fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD
-VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO
-BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G
-CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1
-7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn
-8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs
-ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
-ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/
-2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDtjCCAp6gAwIBAgIOBcAAAQACQdAGCk3OdRAwDQYJKoZIhvcNAQEFBQAwdjEL
-MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
-BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDQgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
-Q2VudGVyIENsYXNzIDQgQ0EgSUkwHhcNMDYwMzIzMTQxMDIzWhcNMjUxMjMxMjI1
-OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
-SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgNCBDQTElMCMGA1UEAxMc
-VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgNCBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBALXNTJytrlG7fEjFDSmGehSt2VA9CXIgDRS2Y8b+WJ7gIV7z
-jyIZ3E6RIM1viCmis8GsKnK6i1S4QF/yqvhDhsIwXMynXX/GCEnkDjkvjhjWkd0j
-FnmA22xIHbzB3ygQY9GB493fL3l1oht48pQB5hBiecugfQLANIJ7x8CtHUzXapZ2
-W78mhEj9h/aECqqSB5lIPGG8ToVYx5ct/YFKocabEvVCUNFkPologiJw3fX64yhC
-L04y87OjNopq1mJcrPoBbbTgci6VaLTxkwzGioLSHVPqfOA/QrcSWrjN2qUGZ8uh
-d32llvCSHmcOHUJG5vnt+0dTf1cERh9GX8eu4I8CAwEAAaNCMEAwDwYDVR0TAQH/
-BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFB/quz4lGwa9pd1iBX7G
-TFq/6A9DMA0GCSqGSIb3DQEBBQUAA4IBAQBYpCubTPfkpJKknGWYGWIi/HIy6QRd
-xMRwLVpG3kxHiiW5ot3u6hKvSI3vK2fbO8w0mCr3CEf/Iq978fTr4jgCMxh1KBue
-dmWsiANy8jhHHYz1nwqIUxAUu4DlDLNdjRfuHhkcho0UZ3iMksseIUn3f9MYv5x5
-+F0IebWqak2SNmy8eesOPXmK2PajVnBd3ttPedJ60pVchidlvqDTB4FAVd0Qy+BL
-iILAkH0457+W4Ze6mqtCD9Of2J4VMxHL94J59bXAQVaS4d9VA61Iz9PyLrHHLVZM
-ZHQqMc7cdalUR6SnQnIJ5+ECpkeyBM1CE+FhDOB4OiIgohxgQoaH96Xm
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU
-MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
-b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw
-MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD
-VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
-A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul
-CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n
-tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl
-dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch
-PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC
-+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O
-BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E
-BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl
-MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
-ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB
-IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X
-7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz
-43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
-eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl
-pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA
-WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
-MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
-bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2
-MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
-ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk
-hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym
-1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW
-OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb
-2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko
-O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU
-AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
-BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF
-Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb
-LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir
-oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C
-MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
-sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
-RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV
-UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
-Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y
-ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If
-xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV
-ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO
-DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ
-jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/
-CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi
-EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM
-fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY
-uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK
-chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t
-9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
-ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2
-SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd
-+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc
-fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa
-sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N
-cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N
-0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie
-4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI
-r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
-/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
-gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEuzCCA6OgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzET
-MBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwHhcNMDYwNDI1MjE0
-MDM2WhcNMzUwMjA5MjE0MDM2WjBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBw
-bGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
-FjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDkkakJH5HbHkdQ6wXtXnmELes2oldMVeyLGYne+Uts9QerIjAC6Bg+
-+FAJ039BqJj50cpmnCRrEdCju+QbKsMflZ56DKRHi1vUFjczy8QPTc4UadHJGXL1
-XQ7Vf1+b8iUDulWPTV0N8WQ1IxVLFVkds5T39pyez1C6wVhQZ48ItCD3y6wsIG9w
-tj8BMIy3Q88PnT3zK0koGsj+zrW5DtleHNbLPbU6rfQPDgCSC7EhFi501TwN22IW
-q6NxkkdTVcGvL0Gz+PvjcM3mo0xFfh9Ma1CWQYnEdGILEINBhzOKgbEwWOxaBDKM
-aLOPHd5lc/9nXmW8Sdh2nzMUZaF3lMktAgMBAAGjggF6MIIBdjAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUK9BpR5R2Cf70a40uQKb3
-R01/CF4wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01/CF4wggERBgNVHSAE
-ggEIMIIBBDCCAQAGCSqGSIb3Y2QFATCB8jAqBggrBgEFBQcCARYeaHR0cHM6Ly93
-d3cuYXBwbGUuY29tL2FwcGxlY2EvMIHDBggrBgEFBQcCAjCBthqBs1JlbGlhbmNl
-IG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0
-YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBj
-b25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZp
-Y2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMA0GCSqGSIb3DQEBBQUAA4IBAQBc
-NplMLXi37Yyb3PN3m/J20ncwT8EfhYOFG5k9RzfyqZtAjizUsZAS2L70c5vu0mQP
-y3lPNNiiPvl4/2vIB+x9OYOLUyDTOMSxv5pPCmv/K/xZpwUJfBdAVhEedNO3iyM7
-R6PVbyTi69G3cN8PReEnyvFteO3ntRcXqNx+IjXKJdXZD9Zr1KIkIxH3oayPc4Fg
-xhtbCS+SsvhESPBgOJ4V9T0mZyCKM2r3DYLP3uujL/lTaltkwGMzd/c6ByxW69oP
-IQ7aunMZT7XZNn/Bh1XZp5m5MkL72NVxnn6hUrcbvZNCJBIqxw8dtk2cXmPIS4AX
-UKqK1drk/NAJBzewdXUh
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC
-Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g
-Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0
-aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa
-Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg
-SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo
-aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp
-ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z
-7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//
-DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx
-zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8
-hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs
-4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u
-gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY
-NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E
-FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3
-j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG
-52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB
-echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
-ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI
-zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy
-wy39FCqQmbkHzJ8=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
-GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
-b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
-BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
-YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
-GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
-Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
-WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
-rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
-+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
-ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
-Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
-PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
-/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
-oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
-yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
-EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
-A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
-MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
-ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
-BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
-g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
-fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
-WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
-B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
-hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
-TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
-mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
-ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
-4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
-8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN
-AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp
-dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw
-MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw
-CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ
-MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB
-SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz
-ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH
-LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP
-PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL
-2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w
-ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC
-MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk
-AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0
-AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz
-AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz
-AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f
-BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
-FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY
-P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi
-CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g
-kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95
-HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS
-na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q
-qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z
-TbvGRNs2yyqcjg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICQzCCAcmgAwIBAgIILcX8iNLFS5UwCgYIKoZIzj0EAwMwZzEbMBkGA1UEAwwS
-QXBwbGUgUm9vdCBDQSAtIEczMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9u
-IEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwHhcN
-MTQwNDMwMTgxOTA2WhcNMzkwNDMwMTgxOTA2WjBnMRswGQYDVQQDDBJBcHBsZSBS
-b290IENBIC0gRzMxJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5MRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzB2MBAGByqGSM49
-AgEGBSuBBAAiA2IABJjpLz1AcqTtkyJygRMc3RCV8cWjTnHcFBbZDuWmBSp3ZHtf
-TjjTuxxEtX/1H7YyYl3J6YRbTzBPEVoA/VhYDKX1DyxNB0cTddqXl5dvMVztK517
-IDvYuVTZXpmkOlEKMaNCMEAwHQYDVR0OBBYEFLuw3qFYM4iapIqZ3r6966/ayySr
-MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gA
-MGUCMQCD6cHEFl4aXTQY2e3v9GwOAEZLuN+yRhHFD/3meoyhpmvOwgPUnPWTxnS4
-at+qIxUCMG1mihDK1A3UT82NQz60imOlM27jbdoXt2QfyFMm+YhidDkLF1vLUagM
-6BgD56KyKA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn
-MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
-ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo
-YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9
-MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy
-NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G
-A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA
-A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0
-Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s
-QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV
-eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795
-B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh
-z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T
-AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i
-ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w
-TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH
-MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD
-VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE
-VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
-bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B
-AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM
-bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi
-ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG
-VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c
-ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/
-AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF
-MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD
-bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha
-ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM
-HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03
-UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42
-tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R
-ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM
-lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp
-/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G
-A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G
-A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj
-dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy
-MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl
-cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js
-L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL
-BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni
-acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
-o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K
-zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8
-PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y
-Johw1+qRzT65ysCQblrGXnRl11z+o+I=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
-FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
-MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
-cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
-Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
-0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
-wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
-7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
-8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
-BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
-/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
-JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
-NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
-6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
-3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
-D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
-CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
-3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBBDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJLUjEN
-MAsGA1UECgwES0lTQTEuMCwGA1UECwwlS29yZWEgQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHkgQ2VudHJhbDEWMBQGA1UEAwwNS0lTQSBSb290Q0EgMTAeFw0wNTA4MjQw
-ODA1NDZaFw0yNTA4MjQwODA1NDZaMGQxCzAJBgNVBAYTAktSMQ0wCwYDVQQKDARL
-SVNBMS4wLAYDVQQLDCVLb3JlYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBDZW50
-cmFsMRYwFAYDVQQDDA1LSVNBIFJvb3RDQSAxMIIBIDANBgkqhkiG9w0BAQEFAAOC
-AQ0AMIIBCAKCAQEAvATk+hM58DSWIGtsaLv623f/J/es7C/n/fB/bW+MKs0lCVsk
-9KFo/CjsySXirO3eyDOE9bClCTqnsUdIxcxPjHmc+QZXfd3uOPbPFLKc6tPAXXdi
-8EcNuRpAU1xkcK8IWsD3z3X5bI1kKB4g/rcbGdNaZoNy4rCbvdMlFQ0yb2Q3lIVG
-yHK+d9VuHygvx2nt54OJM1jT3qC/QOhDUO7cTWu8peqmyGGO9cNkrwYV3CmLP3WM
-vHFE2/yttRcdbYmDz8Yzvb9Fov4Kn6MRXw+5H5wawkbMnChmn3AmPC7fqoD+jMUE
-CSVPzZNHPDfqAmeS/vwiJFys0izgXAEzisEZ2wIBA6MyMDAwHQYDVR0OBBYEFL+2
-J9gDWnZlTGEBQVYx5Yt7OtnMMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEF
-BQADggEBABOvUQveimpb5poKyLGQSk6hAp3MiNKrZr097LuxQpVqslxa/6FjZJap
-aBV/JV6K+KRzwYCKhQoOUugy50X4TmWAkZl0Q+VFnUkq8JSV3enhMNITbslOsXfl
-BM+tWh6UCVrXPAgcrnrpFDLBRa3SJkhyrKhB2vAhhzle3/xk/2F0KpzZm4tfwjeT
-2KM3LzuTa7IbB6d/CVDv0zq+IWuKkDsnSlFOa56ch534eJAx7REnxqhZvvwYC/uO
-fi5C4e3nCSG9uRPFVmf0JqZCQ5BEVLRxm3bkGhKsGigA35vB1fjbXKP4krG9tNT5
-UNkAAk/bg9ART6RCVmE6fhMy04Qfybo=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix
-RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
-dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p
-YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw
-NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK
-EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl
-cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
-c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz
-dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ
-fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns
-bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD
-75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP
-FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV
-HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp
-5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu
-b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA
-A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p
-6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
-TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7
-dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys
-Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI
-l7WdmplNsDz4SgCbZN2fOUvRJ9e4
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
-EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
-MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
-cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
-dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
-pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
-b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
-aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
-IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
-lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
-AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
-VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
-ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
-BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
-AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
-U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
-bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
-+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
-bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
-uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
-XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb
-MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
-GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp
-ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow
-fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV
-BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM
-cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S
-HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996
-CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk
-3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz
-6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV
-HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
-EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv
-Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw
-Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww
-DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0
-5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
-Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI
-gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ
-aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl
-izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF0zCCA7ugAwIBAgIVALhZFHE/V9+PMcAzPdLWGXojF7TrMA0GCSqGSIb3DQEB
-DQUAMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dp
-ZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIDIwHhcNMTExMDA2
-MDgzOTU2WhcNNDYxMDA2MDgzOTU2WjCBgDELMAkGA1UEBhMCUEwxIjAgBgNVBAoT
-GVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0
-d29yayBDQSAyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvfl4+ObV
-gAxknYYblmRnPyI6HnUBfe/7XGeMycxca6mR5rlC5SBLm9qbe7mZXdmbgEvXhEAr
-J9PoujC7Pgkap0mV7ytAJMKXx6fumyXvqAoAl4Vaqp3cKcniNQfrcE1K1sGzVrih
-QTib0fsxf4/gX+GxPw+OFklg1waNGPmqJhCrKtPQ0WeNG0a+RzDVLnLRxWPa52N5
-RH5LYySJhi40PylMUosqp8DikSiJucBb+R3Z5yet/5oCl8HGUJKbAiy9qbk0WQq/
-hEr/3/6zn+vZnuCYI+yma3cWKtvMrTscpIfcRnNeGWJoRVfkkIJCu0LW8GHgwaM9
-ZqNd9BjuiMmNF0UpmTJ1AjHuKSbIawLmtWJFfzcVWiNoidQ+3k4nsPBADLxNF8tN
-orMe0AZa3faTz1d1mfX6hhpneLO/lv403L3nUlbls+V1e9dBkQXcXWnjlQ1DufyD
-ljmVe2yAWk8TcsbXfSl6RLpSpCrVQUYJIP4ioLZbMI28iQzV13D4h1L92u+sUS4H
-s07+0AnacO+Y+lbmbdu1V0vc5SwlFcieLnhO+NqcnoYsylfzGuXIkosagpZ6w7xQ
-EmnYDlpGizrrJvojybawgb5CAKT41v4wLsfSRvbljnX98sy50IdbzAYQYLuDNbde
-Z95H7JlI8aShFf6tjGKOOVVPORa5sWOd/7cCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUtqFUOQLDoD+Oirz61PgcptE6Dv0wDgYDVR0PAQH/BAQD
-AgEGMA0GCSqGSIb3DQEBDQUAA4ICAQCdU8KBJdw1LK4K3VqbRjBWu9S0bEuG5gql
-0pKKmo3cj7TudvQDy+ubAXirKmu1uiNOMXy1LN0taWczbmNdORgS+KAoU0SHq2rE
-kpYfKqIcup3dJ/tSTbCPWujtjcNo45KgJgyHkLAD6mplKAjERnjgW7oO8DPcJ7Z+
-iD29kqSWfkGogAh71jYSvBAVmyS8q619EYkvMe340s9Tjuu0U6fnBMovpiLEEdzr
-mMkiXUFq3ApSBFu8LqB9x7aSuySg8zfRK0OozPFoeBp+b2OQe590yGvZC1X2eQM9
-g8dBQJL7dgs3JRc8rz76PFwbhvlKDD+KxF4OmPGt7s/g/SE1xzNhzKI3GEN8M+mu
-doKCB0VIO8lnbq2jheiWVs+8u/qry7dXJ40aL5nzIzM0jspTY9NXNFBPz0nBBbrF
-qId744aP+0OiEumsUewEdkzw+o+5MRPpCLckCfmgtwc2WFfPxLt+SWaVNQS2dzW4
-qVMpX5KF+FLEWk79BmE5+33QdkeSzOwrvYRu5ptFwX1isVMtnnWg58koUNflvKiq
-B3hquXS0YPOEjQPcrpHadEQNe0Kpd9YrfKHGbBNTIqkSmqX5TyhFNbCXT0ZlhcX0
-/WKiomr8NDAGft8M4HOBlslEKt4fguxscletKWSk8cYpjjVgU85r2QK+OTB14Pdc
-Y2rwQMEsjQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDQzCCAiugAwIBAgIQX/h7KCtU3I1CoxW1aMmt/zANBgkqhkiG9w0BAQUFADA1
-MRYwFAYDVQQKEw1DaXNjbyBTeXN0ZW1zMRswGQYDVQQDExJDaXNjbyBSb290IENB
-IDIwNDgwHhcNMDQwNTE0MjAxNzEyWhcNMjkwNTE0MjAyNTQyWjA1MRYwFAYDVQQK
-Ew1DaXNjbyBTeXN0ZW1zMRswGQYDVQQDExJDaXNjbyBSb290IENBIDIwNDgwggEg
-MA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQCwmrmrp68Kd6ficba0ZmKUeIhH
-xmJVhEAyv8CrLqUccda8bnuoqrpu0hWISEWdovyD0My5jOAmaHBKeN8hF570YQXJ
-FcjPFto1YYmUQ6iEqDGYeJu5Tm8sUxJszR2tKyS7McQr/4NEb7Y9JHcJ6r8qqB9q
-VvYgDxFUl4F1pyXOWWqCZe+36ufijXWLbvLdT6ZeYpzPEApk0E5tzivMW/VgpSdH
-jWn0f84bcN5wGyDWbs2mAag8EtKpP6BrXruOIIt6keO1aO6g58QBdKhTCytKmg9l
-Eg6CTY5j/e/rmxrbU6YTYK/CfdfHbBcl1HP7R2RQgYCUTOG/rksc35LtLgXfAgED
-o1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUJ/PI
-FR5umgIJFq0roIlgX9p7L6owEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEF
-BQADggEBAJ2dhISjQal8dwy3U8pORFBi71R803UXHOjgxkhLtv5MOhmBVrBW7hmW
-Yqpao2TB9k5UM8Z3/sUcuuVdJcr18JOagxEu5sv4dEX+5wW4q+ffy0vhN4TauYuX
-cB7w4ovXsNgOnbFp1iqRe6lJT37mjpXYgyc81WhJDtSd9i7rp77rMKSsH0T8lasz
-Bvt9YAretIpjsJyp8qS5UwGH0GikJ3+r/+n6yUA4iGe0OcaEb1fJU9u6ju7AQ7L4
-CYNu/2bPPu8Xs1gYJQk0XuPL1hS27PKSb3TkL4Eq1ZKR4OCXPDJoBYVL0fdX4lId
-kxpUnwVwwEpxYB5DC2Ae/qPOgRnhCzU=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
-HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
-ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
-MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
-b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
-aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
-Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
-nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
-HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
-Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
-dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
-HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
-BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
-CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
-sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
-4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
-8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
-pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
-mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB
-VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp
-bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R
-dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw
-MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy
-dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52
-ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM
-EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj
-lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ
-znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH
-2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1
-k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs
-2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD
-VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
-AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG
-KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+
-8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R
-FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
-mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE
-DNuxUCAKGkq6ahq97BvIxYSazQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
-rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
-Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
-MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
-BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
-Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
-LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
-MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
-ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
-gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
-YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
-b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
-9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
-zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
-OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
-HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
-2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
-oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
-t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
-KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
-m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
-MdRAGmI0Nj81Aa6sY6A=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFHjCCBAagAwIBAgIEAKA3oDANBgkqhkiG9w0BAQsFADCBtzELMAkGA1UEBhMC
-Q1oxOjA4BgNVBAMMMUkuQ0EgLSBRdWFsaWZpZWQgQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHksIDA5LzIwMDkxLTArBgNVBAoMJFBydm7DrSBjZXJ0aWZpa2HEjW7DrSBh
-dXRvcml0YSwgYS5zLjE9MDsGA1UECww0SS5DQSAtIEFjY3JlZGl0ZWQgUHJvdmlk
-ZXIgb2YgQ2VydGlmaWNhdGlvbiBTZXJ2aWNlczAeFw0wOTA5MDEwMDAwMDBaFw0x
-OTA5MDEwMDAwMDBaMIG3MQswCQYDVQQGEwJDWjE6MDgGA1UEAwwxSS5DQSAtIFF1
-YWxpZmllZCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSwgMDkvMjAwOTEtMCsGA1UE
-CgwkUHJ2bsOtIGNlcnRpZmlrYcSNbsOtIGF1dG9yaXRhLCBhLnMuMT0wOwYDVQQL
-DDRJLkNBIC0gQWNjcmVkaXRlZCBQcm92aWRlciBvZiBDZXJ0aWZpY2F0aW9uIFNl
-cnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtTaEy0KC8M9l
-4lSaWHMs4+sVV1LwzyJYiIQNeCrv1HHm/YpGIdY/Z640ceankjQvIX7m23BK4OSC
-6KO8kZYA3zopOz6GFCOKV2PvLukbc+c2imF6kLHEv6qNA8WxhPbR3xKwlHDwB2yh
-Wzo7V3QVgDRG83sugqQntKYC3LnlTGbJpNP+Az72gpO9AHUn/IBhFk4ksc8lYS2L
-9GCy9CsmdKSBP78p9w8Lx7vDLqkDgt1/zBrcUWmSSb7AE/BPEeMryQV1IdI6nlGn
-BhWkXOYf6GSdayJw86btuxC7viDKNrbp44HjQRaSxnp6O3eto1x4DfiYdw/YbJFe
-7EjkxSQBywIDAQABo4IBLjCCASowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
-BAMCAQYwgecGA1UdIASB3zCB3DCB2QYEVR0gADCB0DCBzQYIKwYBBQUHAgIwgcAa
-gb1UZW50byBjZXJ0aWZpa2F0IGplIHZ5ZGFuIGpha28ga3ZhbGlmaWtvdmFueSBz
-eXN0ZW1vdnkgY2VydGlmaWthdCBwb2RsZSB6YWtvbmEgYy4gMjI3LzIwMDAgU2Iu
-IHYgcGxhdG5lbSB6bmVuaS9UaGlzIGlzIHF1YWxpZmllZCBzeXN0ZW0gY2VydGlm
-aWNhdGUgYWNjb3JkaW5nIHRvIEN6ZWNoIEFjdCBOby4gMjI3LzIwMDAgQ29sbC4w
-HQYDVR0OBBYEFHnL0CPpOmdwkXRP01Hi4CD94Sj7MA0GCSqGSIb3DQEBCwUAA4IB
-AQB9laU214hYaBHPZftbDS/2dIGLWdmdSbj1OZbJ8LIPBMxYjPoEMqzAR74tw96T
-i6aWRa5WdOWaS6I/qibEKFZhJAVXX5mkx2ewGFLJ+0Go+eTxnjLOnhVF2V2s+57b
-m8c8j6/bS6Ij6DspcHEYpfjjh64hE2r0aSpZDjGzKFM6YpqsCJN8qYe2X1qmGMLQ
-wvNdjG+nPzCJOOuUEypIWt555ZDLXqS5F7ZjBjlfyDZjEfS2Es9Idok8alf563Mi
-9/o+Ba46wMYOkk3P1IlU0RqCajdbliioACKDztAqubONU1guZVzV8tuMASVzbJeL
-/GAB7ECTwe1RuKrLYtglMKI9
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
-MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
-Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
-MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
-U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
-cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
-pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
-OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
-Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
-Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
-HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
-Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
-+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
-Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
-Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
-26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
-AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
-FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
-ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
-LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
-BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
-Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
-dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
-cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
-YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
-dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
-bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
-YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
-TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
-9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
-jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
-FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
-ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
-ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
-EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
-L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
-yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
-O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
-um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
-NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW
-MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
-Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9
-MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
-U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
-cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
-pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
-OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
-Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
-Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
-HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
-Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
-+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
-Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
-Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
-26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
-AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
-VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul
-F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC
-ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w
-ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk
-aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0
-YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg
-c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93
-d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG
-CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF
-wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS
-Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst
-0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc
-pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl
-CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF
-P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK
-1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm
-KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
-JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ
-8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm
-fyWl8kgAwKQB2j8=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
-QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
-MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
-b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
-CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
-nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
-43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
-T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
-gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
-BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
-TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
-DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
-hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
-06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
-PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
-YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
-CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0
-MRMwEQYDVQQDEwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQG
-EwJJTDAeFw0wNDAzMjQxMTMyMThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMT
-CkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNpZ24xCzAJBgNVBAYTAklMMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49qROR+WCf4C9DklBKK
-8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTyP2Q2
-98CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb
-2CEJKHxNGGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxC
-ejVb7Us6eva1jsz/D3zkYDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7Kpi
-Xd3DTKaCQeQzC6zJMw9kglcq/QytNuEMrkvF7zuZ2SOzW120V+x0cAwqTwIDAQAB
-o4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2Zl
-ZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0PAQH/BAQD
-AgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRL
-AZs+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWd
-foPPbrxHbvUanlR2QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0M
-cXS6hMTXcpuEfDhOZAYnKuGntewImbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq
-8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb/627HOkthIDYIb6FUtnUdLlp
-hbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VGzT2ouvDzuFYk
-Res3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U
-AGegcQCCSA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB
-ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
-Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
-dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt
-TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1
-NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0
-IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD
-VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS
-Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB
-DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2
-N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH
-iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe
-YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1
-axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g
-yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD
-AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh
-ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V
-VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB
-BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y
-IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs
-QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4
-ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM
-YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb
-QErNaLly7HF27FSOH4UMAWr6pjisH8SE
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
-b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
-cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
-JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
-mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
-wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
-VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
-AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
-AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
-BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
-pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
-dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
-fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
-NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
-H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
-+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
-MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
-IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
-BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
-MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
-d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
-YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
-dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
-BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
-papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
-DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
-KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
-XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIETTCCAzWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBtMQswCQYDVQQGEwJDSDEO
-MAwGA1UEChMFYWRtaW4xETAPBgNVBAsTCFNlcnZpY2VzMSIwIAYDVQQLExlDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0aWVzMRcwFQYDVQQDEw5BZG1pbkNBLUNELVQwMTAe
-Fw0wNjAxMjUxMzM2MTlaFw0xNjAxMjUxMjM2MTlaMG0xCzAJBgNVBAYTAkNIMQ4w
-DAYDVQQKEwVhZG1pbjERMA8GA1UECxMIU2VydmljZXMxIjAgBgNVBAsTGUNlcnRp
-ZmljYXRpb24gQXV0aG9yaXRpZXMxFzAVBgNVBAMTDkFkbWluQ0EtQ0QtVDAxMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0jQlMZmpLDhV+GNR9TAoSNle
-JgQB4xAXJELQf5/ySMfoFA4MmjKqYXQkB6MGPuQKwR9XRRSPf61vqb8YPsdjRmgp
-byHBcUd5t0N8RX6wRZUnPMW+bCCo2VqAU4XFbnlc2gHKaam0wdTtbBTXEkv0ieIH
-fxCfFxXqSsSr60IkF/2/xbrAgV/QD5yHk6Ie8feAVWwi5UtaFqtu4LiFEh2QMyxs
-Oyz1OcvKzkM2g873tyiE7jzMgZP+Ww3tibk2F9+e6ZeiB37TLOmVtvgpmrws4fiI
-rFNXEYSWBVrUTbn81U47yWzOgf5fEHP07bRV5QOCzCm99qNimsbL6CG7nT78CQID
-AQABo4H3MIH0MBIGA1UdEwEB/wQIMAYBAf8CAQAwga4GA1UdIASBpjCBozCBoAYI
-YIV0AREDFQEwgZMwSAYIKwYBBQUHAgIwPBo6VGhpcyBpcyB0aGUgQWRtaW5DQS1D
-RC1UMDEgQ2VydGlmaWNhdGUgUHJhY3RpY2UgU3RhdGVtZW50LjBHBggrBgEFBQcC
-ARY7aHR0cDovL3d3dy5wa2kuYWRtaW4uY2gvcG9saWN5L0NQU18yXzE2Xzc1Nl8x
-XzE3XzNfMjFfMS5wZGYwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQqxGkKocZV
-xgNucM6GgbOkD6oZ2zANBgkqhkiG9w0BAQUFAAOCAQEAn356bbusjI5glGXRQ1DR
-v21qQf0S4s3GHyZm7cqdOkFleM70ArBT+kOP5Nm7rlSAFyVgEkmBdOg7s9tlXClU
-yeZFnp6UEYRUcijPN8D1VaNRK6PIUObpDBQT0C+kAfxG9z4v29T0SxT4sgAdC/xQ
-Fyv58Fp9bPn7owuKwKcyCH1XSyi/Bp4XFELlLOaigBZO/w+dPBz4FcJSdZjU+BaJ
-0E3nKAjHlShO5ouBSZnaJz3p+nkw2Wyo36s6GxCK0XbkSP45iniIG4FmwwZkonYF
-ypQntHbx2oL7tUQQY0PDo8bGBMcPy/G2j+dciqZRlsnfgMy10SCzQ9MUx92xUG2V
-eg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFVTCCBD2gAwIBAgIEO/OB0DANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQGEwJj
-aDEOMAwGA1UEChMFYWRtaW4xETAPBgNVBAsTCFNlcnZpY2VzMSIwIAYDVQQLExlD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzMRYwFAYDVQQDEw1BZG1pbi1Sb290LUNB
-MB4XDTAxMTExNTA4NTEwN1oXDTIxMTExMDA3NTEwN1owbDELMAkGA1UEBhMCY2gx
-DjAMBgNVBAoTBWFkbWluMREwDwYDVQQLEwhTZXJ2aWNlczEiMCAGA1UECxMZQ2Vy
-dGlmaWNhdGlvbiBBdXRob3JpdGllczEWMBQGA1UEAxMNQWRtaW4tUm9vdC1DQTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMvgr0QUIv5qF0nyXZ3PXAJi
-C4C5Wr+oVTN7oxIkXkxvO0GJToM9n7OVJjSmzBL0zJ2HXj0MDRcvhSY+KiZZc6Go
-vDvr5Ua481l7ILFeQAFtumeza+vvxeL5Nd0Maga2miiacLNAKXbAcUYRa0Ov5VZB
-++YcOYNNt/aisWbJqA2y8He+NsEgJzK5zNdayvYXQTZN+7tVgWOck16Da3+4FXdy
-fH1NCWtZlebtMKtERtkVAaVbiWW24CjZKAiVfggjsiLo3yVMPGj3budLx5D9hEEm
-vlyDOtcjebca+AcZglppWMX/iHIrx7740y0zd6cWEqiLIcZCrnpkr/KzwO135GkC
-AwEAAaOCAf0wggH5MA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIASBkTCBjjCBiwYI
-YIV0AREDAQAwfzArBggrBgEFBQcCAjAfGh1UaGlzIGlzIHRoZSBBZG1pbi1Sb290
-LUNBIENQUzBQBggrBgEFBQcCARZEaHR0cDovL3d3dy5pbmZvcm1hdGlrLmFkbWlu
-LmNoL1BLSS9saW5rcy9DUFNfMl8xNl83NTZfMV8xN18zXzFfMC5wZGYwfwYDVR0f
-BHgwdjB0oHKgcKRuMGwxFjAUBgNVBAMTDUFkbWluLVJvb3QtQ0ExIjAgBgNVBAsT
-GUNlcnRpZmljYXRpb24gQXV0aG9yaXRpZXMxETAPBgNVBAsTCFNlcnZpY2VzMQ4w
-DAYDVQQKEwVhZG1pbjELMAkGA1UEBhMCY2gwHQYDVR0OBBYEFIKf+iNzIPGXi7JM
-Tb5CxX9mzWToMIGZBgNVHSMEgZEwgY6AFIKf+iNzIPGXi7JMTb5CxX9mzWTooXCk
-bjBsMQswCQYDVQQGEwJjaDEOMAwGA1UEChMFYWRtaW4xETAPBgNVBAsTCFNlcnZp
-Y2VzMSIwIAYDVQQLExlDZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzMRYwFAYDVQQD
-Ew1BZG1pbi1Sb290LUNBggQ784HQMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B
-AQUFAAOCAQEAeE96XCYRpy6umkPKXDWCRn7INo96ZrWpMggcDORuofHIwdTkgOeM
-vWOxDN/yuT7CC3FAaUajbPRbDw0hRMcqKz0aC8CgwcyIyhw/rFK29mfNTG3EviP9
-QSsEbnelFnjpm1wjz4EaBiFjatwpUbI6+Zv3XbEt9QQXBn+c6DeFLe4xvC4B+MTr
-a440xTk59pSYux8OHhEvqIwHCkiijGqZhTS3KmGFeBopaR+dJVBRBMoXwzk4B3Hn
-0Zib1dEYFZa84vPJZyvxCbLOnPRDJgH6V2uQqbG+6DXVaf/wORVOvF/wzzv0viM/
-RWbEtJZdvo8N3sdtCULzifnxP/V0T9+4ZQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx
-ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
-b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD
-EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz
-aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w
-MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G
-A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh
-Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l
-dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh
-bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq
-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq
-eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe
-r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5
-3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd
-vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l
-mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC
-wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg
-hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0
-TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh
-biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg
-ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg
-dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6
-b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl
-c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0
-ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3
-dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu
-ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh
-bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo
-ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3
-Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u
-ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA
-A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ
-MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+
-NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR
-VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY
-83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3
-macqaJVmlaut74nLYKkGEsaUR+ko
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
-CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
-ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
-Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
-EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
-IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
-K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
-fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
-Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
-BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
-AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
-oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
-sycX
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFkjCCA3qgAwIBAgIBCDANBgkqhkiG9w0BAQUFADA6MQswCQYDVQQGEwJDTjER
-MA8GA1UEChMIVW5pVHJ1c3QxGDAWBgNVBAMTD1VDQSBHbG9iYWwgUm9vdDAeFw0w
-ODAxMDEwMDAwMDBaFw0zNzEyMzEwMDAwMDBaMDoxCzAJBgNVBAYTAkNOMREwDwYD
-VQQKEwhVbmlUcnVzdDEYMBYGA1UEAxMPVUNBIEdsb2JhbCBSb290MIICIjANBgkq
-hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA2rPlBlA/9nP3xDK/RqUlYjOHsGj+p9+I
-A2N9Apb964fJ7uIIu527u+RBj8cwiQ9tJMAEbBSUgU2gDXRm8/CFr/hkGd656YGT
-0CiFmUdCSiw8OCdKzP/5bBnXtfPvm65bNAbXj6ITBpyKhELVs6OQaG2BkO5NhOxM
-cE4t3iQ5zhkAQ5N4+QiGHUPR9HK8BcBn+sBR0smFBySuOR56zUHSNqth6iur8CBV
-mTxtLRwuLnWW2HKX4AzKaXPudSsVCeCObbvaE/9GqOgADKwHLx25urnRoPeZnnRc
-GQVmMc8+KlL+b5/zub35wYH1N9ouTIElXfbZlJrTNYsgKDdfUet9Ysepk9H50DTL
-qScmLCiQkjtVY7cXDlRzq6987DqrcDOsIfsiJrOGrCOp139tywgg8q9A9f9ER3Hd
-J90TKKHqdjn5EKCgTUCkJ7JZFStsLSS3JGN490MYeg9NEePorIdCjedYcaSrbqLA
-l3y74xNLytu7awj5abQEctXDRrl36v+6++nwOgw19o8PrgaEFt2UVdTvyie3AzzF
-HCYq9TyopZWbhvGKiWf4xwxmse1Bv4KmAGg6IjTuHuvlb4l0T2qqaqhXZ1LUIGHB
-zlPL/SR/XybfoQhplqCe/klD4tPq2sTxiDEhbhzhzfN1DiBEFsx9c3Q1RSw7gdQg
-7LYJjD5IskkCAwEAAaOBojCBnzALBgNVHQ8EBAMCAQYwDAYDVR0TBAUwAwEB/zBj
-BgNVHSUEXDBaBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEFBQcD
-BAYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEFBQcDBwYIKwYBBQUHAwgGCCsGAQUF
-BwMJMB0GA1UdDgQWBBTZw9P4gJJnzF3SOqLXcaK0xDiALTANBgkqhkiG9w0BAQUF
-AAOCAgEA0Ih5ygiq9ws0oE4Jwul+NUiJcIQjL1HDKy9e21NrW3UIKlS6Mg7VxnGF
-sZdJgPaE0PC6t3GUyHlrpsVE6EKirSUtVy/m1jEp+hmJVCl+t35HNmktbjK81HXa
-QnO4TuWDQHOyXd/URHOmYgvbqm4FjMh/Rk85hZCdvBtUKayl1/7lWFZXbSyZoUkh
-1WHGjGHhdSTBAd0tGzbDLxLMC9Z4i3WA6UG5iLHKPKkWxk4V43I29tSgQYWvimVw
-TbVEEFDs7d9t5tnGwBLxSzovc+k8qe4bqi81pZufTcU0hF8mFGmzI7GJchT46U1R
-IgP/SobEHOh7eQrbRyWBfvw0hKxZuFhD5D1DCVR0wtD92e9uWfdyYJl2b/Unp7uD
-pEqB7CmB9HdL4UISVdSGKhK28FWbAS7d9qjjGcPORy/AeGEYWsdl/J1GW1fcfA67
-loMQfFUYCQSu0feLKj6g5lDWMDbX54s4U+xJRODPpN/xU3uLWrb2EZBL1nXz/gLz
-Ka/wI3J9FO2pXd96gZ6bkiL8HvgBRUGXx2sBYb4zaPKgZYRmvOAqpGjTcezHCN6j
-w8k2SjTxF+KAryAhk5Qe5hXTVGLxtTgv48y5ZwSpuuXu+RBuyy5+E6+SFP7zJ3N7
-OPxzbbm5iPZujAv1/P8JDrMtXnt145Ik4ubhWD5LKAN1axibRww=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDdjCCAl6gAwIBAgIEOhsEBTANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJE
-SzEMMAoGA1UEChMDS01EMQ8wDQYDVQQLEwZLTUQtQ0ExIzAhBgNVBAMTGktNRC1D
-QSBLdmFsaWZpY2VyZXQgUGVyc29uMB4XDTAwMTEyMTIzMjQ1OVoXDTE1MTEyMjIz
-MjQ1OVowUTELMAkGA1UEBhMCREsxDDAKBgNVBAoTA0tNRDEPMA0GA1UECxMGS01E
-LUNBMSMwIQYDVQQDExpLTUQtQ0EgS3ZhbGlmaWNlcmV0IFBlcnNvbjCCASIwDQYJ
-KoZIhvcNAQEBBQADggEPADCCAQoCggEBANriF4Xd6yD7ZlBE317UBDObn+vRMVc6
-p3wNQODdEDJe2z1ncCz9NJvhoLGdOJhyg7VVPh0P2c+KZ9WI9mWOKZI2bp2WkLju
-jCcxbhTrurY3Wfc6gwLBqqFV8wWgaZKmvVWizjw9Kyi25f3yX4fOho6Qq2lvVbub
-tvVFXAd51GJ+/2Yed+a4Or2bz2RcqHS81B3pywsD4mgJR5xREv5jqPfwNP+V7bkc
-X+pfO4kVhZ/V+8MSPdQHgcV/iB3wP2mwgWyIBNc1reBidGTiz8unnWu55hcNfsvt
-LJbTs9OHhsR7naRuy+S402nDnD5vnONOFEsiHn46w+T0rtu7h6j4OvkCAwEAAaNW
-MFQwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUeWLqmhI42Jxj7DifDsW+
-DlQhKD0wHwYDVR0jBBgwFoAUeWLqmhI42Jxj7DifDsW+DlQhKD0wDQYJKoZIhvcN
-AQEFBQADggEBANML/P42OuJ9aUV/0fItuIyc1JhqWvSqn5bXj+9eyEegcp8bHLHY
-42D1O+z0lNipdjYPSdMJ0wZOEUhr+150SdDQ1P/zQL8AUaLEBkRt7ZdzXPVH3PER
-qnf9IrpYBknZKfCAoVchA6Rr9WU3Sd8bMoRfMLKg8c0M8G6EPwCTcOFriSkbtvNG
-zd8r8I+WfUYIN/p8DI9JT9qfjVODnYPRMUm6KPvq27TsrGruKrqyaV94kWc8co8A
-v3zFLeCtghvUiRBdx+8Q7m5t4CkuSr0WINrqjIPFW2QrM1r82y09Fd16RkqL4LOg
-Lh6vB5KnTApv62rWdw7zWwYnjY6/vXYY1Aw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw
-ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp
-dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290
-IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD
-VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy
-dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg
-MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx
-UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD
-1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH
-oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR
-HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/
-5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv
-idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL
-OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC
-NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f
-46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB
-UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth
-7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G
-A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED
-MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB
-bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x
-XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T
-PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0
-Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70
-WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL
-Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm
-7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S
-nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN
-vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB
-WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI
-fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb
-I+2ksx0WckNLIOFZfsLorSa/ovc=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4
-MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6
-ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD
-VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j
-b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq
-scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO
-xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H
-LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX
-uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD
-yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+
-JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q
-rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN
-BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L
-hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB
-QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+
-HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu
-Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg
-QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB
-BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
-MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA
-A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb
-laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56
-awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo
-JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw
-LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT
-VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk
-LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb
-UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/
-QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+
-naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls
-QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIQMDAwMDk3Mzc1NzM4NjAwMDANBgkqhkiG9w0BAQUFADBV
-MQswCQYDVQQGEwJGUjETMBEGA1UEChMKQ2VydGlOb21pczEcMBoGA1UECxMTQUMg
-UmFjaW5lIC0gUm9vdCBDQTETMBEGA1UEAxMKQ2VydGlOb21pczAeFw0wMDExMDkw
-MDAwMDBaFw0xMjExMDkwMDAwMDBaMFUxCzAJBgNVBAYTAkZSMRMwEQYDVQQKEwpD
-ZXJ0aU5vbWlzMRwwGgYDVQQLExNBQyBSYWNpbmUgLSBSb290IENBMRMwEQYDVQQD
-EwpDZXJ0aU5vbWlzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8SWb
-4mS5RXB3ENSIcfrEzCj/TRUQuT1tMCU0YUfXFSgcPdWglIzCv3kvh07QoB+8xMl+
-fQHvSSduAxnNewz0GBY9rApCPKlP6CcnJr74OSVZIiWt9wLfl4wwhNhZOiikIpZp
-EdOXWqRc84P5cUlN3Lwmr1sjCWmHfTSS4cAKxfDbFLfE61etosyoFZUTQbIhb1Bf
-JL5xRXAUZudQiU42n/yAoSUrN4FLUfPQNlOe1AB81pIgX8g2ojwxDjfgqSs1JmBF
-uLKJ45uVLEenQBPmQCGjL3maV86IRmR3a9UGlgvKAk0NBdh8mrQyQvcUlLBIQBCm
-l7wppt6maQHUNEPQSwIDAQABoz8wPTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQU+F4ho6ijFeb4tRG7/kIEXU2OgnowDQYJKoZIhvcNAQEF
-BQADggEBACe9FJayK6bXkJQrilBFMh75QPdFOks9PJuo86OMUlBDZGYFTCh9Arex
-N3KYCnAEzazYIALwr7eASJJDIQMu1Q+pkx/7ACde4kP47F27M2rm+v5HnGooCLz2
-s7Fe/WUycTQqgwF5lNp03m1ce/TvovgkEZeVN5wM/7+SsZLJGDigXGeq48j2g2hn
-8OckX9Ciyo0U3/1IVeigNBisiaOlsHSZOEPBZQRiZULob+NVbXVPo8nM1OyP3aHI
-LQex1yYcCr9m93nOiZyKkur3Uedf1yMTBe+fflnPFKGYnVqvTGXCKVdHzQBfpILA
-AuaC+5ykZhSiSMf8nmL2oPMcLO7YQw4=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
-KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
-BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
-YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1
-OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
-aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
-ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN
-8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/
-RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4
-hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5
-ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM
-EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1
-A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy
-WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
-1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30
-6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT
-91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
-e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
-TpPDpFQUWw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
-A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
-Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
-MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
-A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
-v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
-eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
-tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
-C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
-zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
-mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
-V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
-bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
-3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
-J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
-291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
-ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
-AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
-TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDoTCCAomgAwIBAgIQKTZHquOKrIZKI1byyrdhrzANBgkqhkiG9w0BAQUFADBO
-MQswCQYDVQQGEwJ1czEYMBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQ0wCwYDVQQL
-EwRGQkNBMRYwFAYDVQQDEw1Db21tb24gUG9saWN5MB4XDTA3MTAxNTE1NTgwMFoX
-DTI3MTAxNTE2MDgwMFowTjELMAkGA1UEBhMCdXMxGDAWBgNVBAoTD1UuUy4gR292
-ZXJubWVudDENMAsGA1UECxMERkJDQTEWMBQGA1UEAxMNQ29tbW9uIFBvbGljeTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJeNvTMn5K1b+3i9L0dHbsd4
-6ZOcpN7JHP0vGzk4rEcXwH53KQA7Ax9oD81Npe53uCxiazH2+nIJfTApBnznfKM9
-hBiKHa4skqgf6F5PjY7rPxr4nApnnbBnTfAu0DDew5SwoM8uCjR/VAnTNr2kSVdS
-c+md/uRIeUYbW40y5KVIZPMiDZKdCBW/YDyD90ciJSKtKXG3d+8XyaK2lF7IMJCk
-FEhcVlcLQUwF1CpMP64Sm1kRdXAHImktLNMxzJJ+zM2kfpRHqpwJCPZLr1LoakCR
-xVW9QLHIbVeGlRfmH3O+Ry4+i0wXubklHKVSFzYIWcBCvgortFZRPBtVyYyQd+sC
-AwEAAaN7MHkwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
-BBYEFC9Yl9ipBZilVh/72at17wI8NjTHMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJ
-KwYBBAGCNxUCBBYEFHa3YJbdFFYprHWF03BjwbxHhhyLMA0GCSqGSIb3DQEBBQUA
-A4IBAQBgrvNIFkBypgiIybxHLCRLXaCRc+1leJDwZ5B6pb8KrbYq+Zln34PFdx80
-CTj5fp5B4Ehg/uKqXYeI6oj9XEWyyWrafaStsU+/HA2fHprA1RRzOCuKeEBuMPdi
-4c2Z/FFpZ2wR3bgQo2jeJqVW/TZsN5hs++58PGxrcD/3SDcJjwtCga1GRrgLgwb0
-Gzigf0/NC++DiYeXHIowZ9z9VKEDfgHLhUyxCynDvux84T8PCVI8L6eaSP436REG
-WOE2QYrEtr+O3c5Ks7wawM36GpnScZv6z7zyxFSjiDV2zBssRm8MtNHDYXaSdBHq
-S4CNHIkRi+xb/xfJSPzn4AYR4oRe
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW
-MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1
-OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG
-A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G
-CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ
-JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD
-vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo
-D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/
-Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW
-RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK
-HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN
-nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM
-0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i
-UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9
-Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg
-TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
-AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL
-BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
-2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX
-UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl
-6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK
-9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ
-HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI
-wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY
-XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l
-IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo
-hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr
-so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
-MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
-MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
-BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
-Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
-5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
-3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
-vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
-8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
-DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
-MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
-zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
-3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
-FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
-Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
-ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJKUDEO
-MAwGA1UEChMFTEdQS0kxGjAYBgNVBAsTEUFwcGxpY2F0aW9uIENBIEcyMB4XDTA2
-MDMzMTE1MDAwMFoXDTE2MDMzMTE0NTk1OVowOTELMAkGA1UEBhMCSlAxDjAMBgNV
-BAoTBUxHUEtJMRowGAYDVQQLExFBcHBsaWNhdGlvbiBDQSBHMjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBALk1xhD422jbB8RATLAdHjbcw0H2z1UVbQh/
-XMZoVeXnV/GWUebhTXgPbkAVcDtl/hHf59PWWDU74Z8C/JRSRi6znmCbAp7JgtL2
-464JT4REtmKbAFFouDqt7GTRMkvplESDtA7OIYlrsDbAmMZLnMI+W2AqCTErLatM
-3rGg/VhWwoMdILzEhAmHe6iVl8YljoPgPpMN0cd9c6mo/BkAQC4iuHozQfV4/Vpx
-54LZSIhc7KiFhy1tgIlnGmm+EMBaju2IfT5vLDhrN85H2KIxMN5+U2Vsi4ZTQSBs
-vUilfq8AWlYSWIHR3IlZ+bXu+E2a2EQpi3mn9yKq6nxctBaIIA0CAwEAAaOBsjCB
-rzAdBgNVHQ4EFgQUf7hdjsQYa8Z9zC7prs405xdd4KEwDgYDVR0PAQH/BAQDAgEG
-MEwGA1UdHwRFMEMwQaA/oD2kOzA5MQswCQYDVQQGEwJKUDEOMAwGA1UEChMFTEdQ
-S0kxGjAYBgNVBAsTEUFwcGxpY2F0aW9uIENBIEcyMA8GA1UdEwEB/wQFMAMBAf8w
-HwYDVR0jBBgwFoAUf7hdjsQYa8Z9zC7prs405xdd4KEwDQYJKoZIhvcNAQEFBQAD
-ggEBADzYczZABkhKVBn1J0g5JaVuQue2zRvLOTS3m+xPKr535MqE/B3rmyJA1fT7
-aIdy/Eddag5SSuO1XUjGIpbmM21tq/bN18skWoyoRZ4+YYJ9lNUF8Bo1X3EvLlS1
-QQXvhg1S75yYG/EsTDrR84bTjD56L4ZFjoMyJlu/U8oOUVbcmsJaMBkNp57Vqpsg
-OWl4IfSXbdEOEUwu0xtasPmXeFwqj1Jl7kxCJcI3MA5tKzWUgwbor0U7BGanMLv5
-4CE7Y259RF06alPvERck/VSyWmxzViHJbC2XpEKzJ2EFIWNt6ii8TxpvQtyYq1XT
-HhvAkj+bweY7F1bixJhDJe62ywA=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICZzCCAdCgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJVUzEY
-MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT
-A1BLSTEcMBoGA1UEAxMTRG9EIENMQVNTIDMgUm9vdCBDQTAeFw0wMDA1MTkxMzEz
-MDBaFw0yMDA1MTQxMzEzMDBaMGExCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMu
-IEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRwwGgYDVQQD
-ExNEb0QgQ0xBU1MgMyBSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
-gQC1MP5kvurMbe2BLPd/6Rm6DmlqKOGpqcuVWB/x5pppU+CIP5HFUbljl6jmIYwT
-XjY8qFf6+HAsTGrLvzCnTBbkMlz4ErBR+BZXjS+0TfouqJToKmHUVw1Hzm4sL36Y
-Z8wACKu2lhY1woWR5VugCsdmUmLzYXWVF668KlYppeArUwIDAQABoy8wLTAdBgNV
-HQ4EFgQUbJyl8FyPbUGNxBc7kFfCD6PNbf4wDAYDVR0TBAUwAwEB/zANBgkqhkiG
-9w0BAQUFAAOBgQCvcUT5lyPMaGmMQwdBuoggsyIAQciYoFUczT9usZNcrfoYmrsc
-c2/9JEKPh59Rz76Gn+nXikhPCNlplKw/5g8tlw8ok3ZPYt//oM1h+KaGDDE0INx/
-L6j7Ob6V7jhZAmLB3mwVT+DfnbvkeXMk/WNklfdKqJkfSGWVx3u/eDLneg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFUjCCBDqgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJLUjEN
-MAsGA1UEChMES0lTQTEuMCwGA1UECxMlS29yZWEgQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHkgQ2VudHJhbDEWMBQGA1UEAxMNS0lTQSBSb290Q0EgMzAeFw0wNDExMTkw
-NjM5NTFaFw0xNDExMTkwNjM5NTFaMGQxCzAJBgNVBAYTAktSMQ0wCwYDVQQKEwRL
-SVNBMS4wLAYDVQQLEyVLb3JlYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBDZW50
-cmFsMRYwFAYDVQQDEw1LSVNBIFJvb3RDQSAzMIIBIDANBgkqhkiG9w0BAQEFAAOC
-AQ0AMIIBCAKCAQEA3rrtF2Wu0b1KPazbgHLMWOHn4ZPazDB6z+8Lri2nQ6u/p0LP
-CFYIpEcdffqG79gwlyY0YTyADvjU65/8IjAboW0+40zSVU4WQDfC9gdu2we1pYyW
-geKbXH6UYcjOhDyx+gDmctMJhXfp3F4hT7TkTvTiF6tQrxz/oTlYdVsSspa5jfBw
-YkhbVigqpYeRNrkeJPW5unu2UlFbF1pgBWycwubGjD756t08jP+J3kNwrB248XXN
-OMpTDUdoasY8GMq94bS+DvTQ49IT+rBRERHUQavo9DmO4TSETwuTqmo4/OXGeEeu
-dhf6oYA3BgAVCP1rI476cg2V1ktisWjC3TSbXQIBA6OCAg8wggILMB8GA1UdIwQY
-MBaAFI+B8NqmzXQ8vmb0FWtGpP4GKMyqMB0GA1UdDgQWBBSPgfDaps10PL5m9BVr
-RqT+BijMqjAOBgNVHQ8BAf8EBAMCAQYwggEuBgNVHSAEggElMIIBITCCAR0GBFUd
-IAAwggETMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LnJvb3RjYS5vci5rci9yY2Ev
-Y3BzLmh0bWwwgd4GCCsGAQUFBwICMIHRHoHOx3QAIMd4yZ3BHLKUACCs9cd4x3jJ
-ncEcx4WyyLLkACgAVABoAGkAcwAgAGMAZQByAHQAaQBmAGkAYwBhAHQAZQAgAGkA
-cwAgAGEAYwBjAHIAZQBkAGkAdABlAGQAIAB1AG4AZABlAHIAIABFAGwAZQBjAHQA
-cgBvAG4AaQBjACAAUwBpAGcAbgBhAHQAdQByAGUAIABBAGMAdAAgAG8AZgAgAHQA
-aABlACAAUgBlAHAAdQBiAGwAaQBjACAAbwBmACAASwBvAHIAZQBhACkwMwYDVR0R
-BCwwKqQoMCYxJDAiBgNVBAMMG+2VnOq1reygleuztOuztO2YuOynhO2dpeybkDAz
-BgNVHRIELDAqpCgwJjEkMCIGA1UEAwwb7ZWc6rWt7KCV67O067O07Zi47KeE7Z2l
-7JuQMA8GA1UdEwEB/wQFMAMBAf8wDAYDVR0kBAUwA4ABADANBgkqhkiG9w0BAQUF
-AAOCAQEAz9b3Dv2wjG4FFY6oXCuyWtEeV6ZeGKqCEQj8mbdbp+PI0qLT+SQ09+Pk
-rolUR9NpScmAwRHr4inH9gaLX7riXs+rw87P7pIl3J85Hg4D9N6QW6FwmVzHc07J
-pHVJeyWhn4KSjU3sYcUMMqfHODiAVToqgx2cZHm5Dac1Smjvj/8F2LpOVmHY+Epw
-mAiWk9hgxzrsX58dKzVPSBShmrtv7tIDhlPxEMcHVGJeNo7iHCsdF03m9VrvirqC
-6HfZKBF+N4dKlArJQOk1pTr7ZD7yXxZ683bXzu4/RB1Fql8RqlMcOh9SUWJUD6OQ
-Nc9Nb7rHviwJ8TX4Absk3TC8SA/u2Q==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
-A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
-Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
-MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
-A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
-RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
-gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
-KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
-QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
-XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
-DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
-LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
-RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
-jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
-6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
-mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
-Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
-WD9f
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
-A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
-d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
-dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
-RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
-MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
-VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
-L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
-Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
-A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
-ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
-Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
-BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
-R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
-hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
-VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
-IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
-MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz
-IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz
-MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj
-dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw
-EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp
-MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G
-CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9
-28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq
-VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q
-DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR
-5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL
-ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a
-Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl
-UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s
-+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5
-Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
-ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx
-hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV
-HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1
-+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN
-YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t
-L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy
-ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt
-IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV
-HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w
-DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW
-PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF
-5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1
-glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH
-FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2
-pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD
-xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG
-tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq
-jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De
-fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
-OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ
-d0jQ
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
-BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln
-biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF
-MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
-d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
-CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8
-76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+
-bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c
-6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE
-emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd
-MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt
-MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y
-MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y
-FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi
-aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
-gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB
-qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7
-lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn
-8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
-L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6
-45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO
-UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5
-O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC
-bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv
-GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a
-77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC
-hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3
-92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp
-Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w
-ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
-Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV
-BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X
-DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ
-BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4
-QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny
-gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw
-zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q
-130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2
-JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw
-DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw
-ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT
-AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj
-AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG
-9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h
-bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc
-fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu
-HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w
-t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
-WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd
-MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg
-Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL
-MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD
-VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg
-isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z
-NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI
-+MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R
-hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+
-mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD
-AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP
-Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s
-EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2
-mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC
-e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow
-dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw
-PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu
-MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx
-GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL
-MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf
-HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh
-gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW
-v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue
-Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr
-9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt
-6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7
-MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl
-Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58
-ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq
-hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p
-iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC
-dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL
-kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL
-hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
-OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
-mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
-MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
-eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
-BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
-MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
-BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
-+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
-hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
-5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
-JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
-DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
-huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
-HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
-AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
-zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
-kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
-AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
-SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
-spki4cErx5z481+oghLrGREt
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe
-MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
-ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
-Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw
-IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL
-SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
-AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH
-SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh
-ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X
-DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1
-TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ
-fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA
-sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU
-WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS
-nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH
-dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip
-NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC
-AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF
-MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
-ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB
-uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl
-PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP
-JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/
-gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2
-j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6
-5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB
-o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS
-/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z
-Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE
-W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D
-hNQ+IIX3Sj0rnP0qCglN6oH4EZw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEXzCCA0egAwIBAgIBATANBgkqhkiG9w0BAQUFADCB0DELMAkGA1UEBhMCRVMx
-SDBGBgNVBAoTP0laRU5QRSBTLkEuIC0gQ0lGIEEtMDEzMzcyNjAtUk1lcmMuVml0
-b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFCMEAGA1UEBxM5QXZkYSBkZWwgTWVk
-aXRlcnJhbmVvIEV0b3JiaWRlYSAzIC0gMDEwMTAgVml0b3JpYS1HYXN0ZWl6MRMw
-EQYDVQQDEwpJemVucGUuY29tMR4wHAYJKoZIhvcNAQkBFg9JbmZvQGl6ZW5wZS5j
-b20wHhcNMDMwMTMwMjMwMDAwWhcNMTgwMTMwMjMwMDAwWjCB0DELMAkGA1UEBhMC
-RVMxSDBGBgNVBAoTP0laRU5QRSBTLkEuIC0gQ0lGIEEtMDEzMzcyNjAtUk1lcmMu
-Vml0b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFCMEAGA1UEBxM5QXZkYSBkZWwg
-TWVkaXRlcnJhbmVvIEV0b3JiaWRlYSAzIC0gMDEwMTAgVml0b3JpYS1HYXN0ZWl6
-MRMwEQYDVQQDEwpJemVucGUuY29tMR4wHAYJKoZIhvcNAQkBFg9JbmZvQGl6ZW5w
-ZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1btoCXXhp3xIW
-D+Bxl8nUCxkyiazWfpt0e68t+Qt9+lZjKZSdEw2Omj4qvr+ovRmDXO3iWpWVOWDl
-3JHJjAzFCe8ZEBNDH+QNYwZHmPBaMYFOYFdbAFVHWvys152C308hcFJ6xWWGmjvl
-2eMiEl9P2nR2LWue368DCu+ak7j3gjAXaCOdP1a7Bfr+RW3X2SC5R4Xyp8iHlL5J
-PHJD/WBkLrezwzQPdACw8m9EG7q9kUwlNpL32mROujS3ZkT6mQTzJieLiE3X04s0
-uIUqVkk5MhjcHFf7al0N5CzjtTcnXYJKN2Z9EDVskk4olAdGi46eSoZXbjUOP5gk
-Ej6wVZAXAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
-MB0GA1UdDgQWBBTqVk/sPIOhFIh4gbIrBSLAB0FbQjANBgkqhkiG9w0BAQUFAAOC
-AQEAYp7mEzzhw6o5Hf5+T5kcI+t4BJyiIWy7vHlLs/G8dLYXO81aN/Mzg928eMTR
-TxxYZL8dd9uwsJ50TVfX6L0R4Dyw6wikh3fHRrat9ufXi63j5K91Ysr7aXqnF38d
-iAgHYkrwC3kuxHBb9C0KBz6h8Q45/KCyN7d37wWAq38yyhPDlaOvyoE6bdUuK5hT
-m5EYA5JmPyrhQ1moDOyueWBAjxzMEMj+OAY1H90cLv6wszsqerxRrdTOHBdv7MjB
-EIpvEEQkXUxVXAzFuuT6m2t91Lfnwfl/IvljHaVC7DlyyhRYHD6D4Rx+4QKp4tWL
-vpw6LkI+gKNJ/YdMCsRZQzEEFA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
-MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
-dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
-UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
-ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
-c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
-OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
-mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
-BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
-qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
-gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
-bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
-dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
-6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
-h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
-/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
-wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
-pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
-vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
-ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
-U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
-ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
-Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
-MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
-IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
-IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
-bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
-9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
-H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
-LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
-/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
-rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
-EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
-WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
-exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
-DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
-sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
-seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
-4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
-BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
-lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
-7M2CYfE45k+XmCpajQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx
-ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w
-MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD
-VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx
-FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu
-ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7
-gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH
-fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a
-ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT
-ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF
-MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk
-c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto
-dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt
-aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI
-hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk
-QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/
-h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
-nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR
-rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2
-9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
-b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
-cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA
-n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc
-biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp
-EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA
-bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu
-YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB
-AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW
-BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI
-QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I
-0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni
-lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9
-B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv
-ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
-IhNzbM8m9Yop5w==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
-MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
-V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
-WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
-LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
-AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
-K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
-RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
-rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
-3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
-hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
-MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
-XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
-lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
-aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
-YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE5zCCA8+gAwIBAgIBADANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCQ0Ex
-EDAOBgNVBAgTB09udGFyaW8xEDAOBgNVBAcTB1Rvcm9udG8xHTAbBgNVBAoTFEVj
-aG93b3J4IENvcnBvcmF0aW9uMR8wHQYDVQQLExZDZXJ0aWZpY2F0aW9uIFNlcnZp
-Y2VzMRowGAYDVQQDExFFY2hvd29yeCBSb290IENBMjAeFw0wNTEwMDYxMDQ5MTNa
-Fw0zMDEwMDcxMDQ5MTNaMIGNMQswCQYDVQQGEwJDQTEQMA4GA1UECBMHT250YXJp
-bzEQMA4GA1UEBxMHVG9yb250bzEdMBsGA1UEChMURWNob3dvcnggQ29ycG9yYXRp
-b24xHzAdBgNVBAsTFkNlcnRpZmljYXRpb24gU2VydmljZXMxGjAYBgNVBAMTEUVj
-aG93b3J4IFJvb3QgQ0EyMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEA
-utU/5BkV15UBf+s+JQruKQxr77s3rjp/RpOtmhHILIiO5gsEWP8MMrfrVEiidjI6
-Qh6ans0KAWc2Dw0/j4qKAQzOSyAZgjcdypNTBZ7muv212DA2Pu41rXqwMrlBrVi/
-KTghfdLlNRu6JrC5y8HarrnRFSKF1Thbzz921kLDRoCi+FVs5eVuK5LvIfkhNAqA
-byrTgO3T9zfZgk8upmEkANPDL1+8y7dGPB/d6lk0I5mv8PESKX02TlvwgRSIiTHR
-k8++iOPLBWlGp7ZfqTEXkPUZhgrQQvxcrwCUo6mk8TqgxCDP5FgPoHFiPLef5szP
-ZLBJDWp7GLyE1PmkQI6WiwIBA6OCAVAwggFMMA8GA1UdEwEB/wQFMAMBAf8wCwYD
-VR0PBAQDAgEGMB0GA1UdDgQWBBQ74YEboKs/OyGC1eISrq5QqxSlEzCBugYDVR0j
-BIGyMIGvgBQ74YEboKs/OyGC1eISrq5QqxSlE6GBk6SBkDCBjTELMAkGA1UEBhMC
-Q0ExEDAOBgNVBAgTB09udGFyaW8xEDAOBgNVBAcTB1Rvcm9udG8xHTAbBgNVBAoT
-FEVjaG93b3J4IENvcnBvcmF0aW9uMR8wHQYDVQQLExZDZXJ0aWZpY2F0aW9uIFNl
-cnZpY2VzMRowGAYDVQQDExFFY2hvd29yeCBSb290IENBMoIBADBQBgNVHSAESTBH
-MEUGCysGAQQB+REKAQMBMDYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuZWNob3dv
-cnguY29tL2NhL3Jvb3QyL2Nwcy5wZGYwDQYJKoZIhvcNAQEFBQADggEBAG+nrPi/
-0RpfEzrj02C6JGPUar4nbjIhcY6N7DWNeqBoUulBSIH/PYGNHYx7/lnJefiixPGE
-7TQ5xPgElxb9bK8zoAApO7U33OubqZ7M7DlHnFeCoOoIAZnG1kuwKwD5CXKB2a74
-HzcqNnFW0IsBFCYqrVh/rQgJOzDA8POGbH0DeD0xjwBBooAolkKT+7ZItJF1Pb56
-QpDL9G+16F7GkmnKlAIYT3QTS3yFGYChnJcd+6txUPhKi9sSOOmAIaKHnkH9Scz+
-A2cSi4A3wUYXVatuVNHpRb2lygfH3SuCX9MU8Ure3zBlSU1LALtMqI4JmcQmQpIq
-zIzvO2jHyu9PQqo=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL
-MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
-BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
-Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1
-OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
-SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc
-VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf
-tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg
-uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J
-XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK
-8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99
-5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud
-EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3
-kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
-dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6
-Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
-JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
-Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS
-GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt
-ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8
-au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV
-hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI
-dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
-gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
-MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
-UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
-NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
-dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
-dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
-38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
-KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
-DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
-qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
-JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
-PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
-BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
-jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
-eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
-ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
-vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
-qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
-IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
-i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
-O+7ETPTsJ3xCwnR8gooJybQDJbw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDOzCCAiOgAwIBAgIRANAeRlAAACmMAAAAAgAAAAIwDQYJKoZIhvcNAQEFBQAw
-PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
-Ew5EU1QgUm9vdCBDQSBYNDAeFw0wMDA5MTMwNjIyNTBaFw0yMDA5MTMwNjIyNTBa
-MD8xJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjEXMBUGA1UE
-AxMORFNUIFJvb3QgQ0EgWDQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQCthX3OFEYY8gSeIYur0O4ypOT68HnDrjLfIutL5PZHRwQGjzCPb9PFo/ihboJ8
-RvfGhBAqpQCo47zwYEhpWm1jB+L/OE/dBBiyn98krfU2NiBKSom2J58RBeAwHGEy
-cO+lewyjVvbDDLUy4CheY059vfMjPAftCRXjqSZIolQb9FdPcAoa90mFwB7rKniE
-J7vppdrUScSS0+eBrHSUPLdvwyn4RGp+lSwbWYcbg5EpSpE0GRJdchic0YDjvIoC
-YHpe7Rkj93PYRTQyU4bhC88ck8tMqbvRYqMRqR+vobbkrj5LLCOQCHV5WEoxWh+0
-E2SpIFe7RkV++MmpIAc0h1tZAgMBAAGjMjAwMA8GA1UdEwEB/wQFMAMBAf8wHQYD
-VR0OBBYEFPCD6nPIP1ubWzdf9UyPWvf0hki9MA0GCSqGSIb3DQEBBQUAA4IBAQCE
-G85wl5eEWd7adH6XW/ikGN5salvpq/Fix6yVTzE6CrhlP5LBdkf6kx1bSPL18M45
-g0rw2zA/MWOhJ3+S6U+BE0zPGCuu8YQaZibR7snm3HiHUaZNMu5c8D0x0bcMxDjY
-AVVcHCoNiL53Q4PLW27nbY6wwG0ffFKmgV3blxrYWfuUDgGpyPwHwkfVFvz9qjaV
-mf12VJffL6W8omBPtgteb6UaT/k1oJ7YI0ldGf+ngpVbRhD+LC3cUtT6GO/BEPZu
-8YTV/hbiDH5v3khVqMIeKT6o8IuXGG7F6a6vKwP1F1FwTXf4UC/ivhme7vdUH7B/
-Vv4AEbT8dNfEeFxrkDbh
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb
-MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
-GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0
-aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla
-MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
-BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD
-VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW
-fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt
-TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL
-fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW
-1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7
-kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G
-A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v
-ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo
-dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu
-Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/
-HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
-pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS
-jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+
-xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn
-dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
-GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
-MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
-Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
-iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
-/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
-jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
-HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
-sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
-gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
-KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
-AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
-URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
-H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
-I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
-iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
-f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID+TCCAuGgAwIBAgIQW1fXqEywr9nTb0ugMbTW4jANBgkqhkiG9w0BAQUFADB5
-MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl
-cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xKjAoBgNVBAMTIVZpc2EgSW5m
-b3JtYXRpb24gRGVsaXZlcnkgUm9vdCBDQTAeFw0wNTA2MjcxNzQyNDJaFw0yNTA2
-MjkxNzQyNDJaMHkxCzAJBgNVBAYTAlVTMQ0wCwYDVQQKEwRWSVNBMS8wLQYDVQQL
-EyZWaXNhIEludGVybmF0aW9uYWwgU2VydmljZSBBc3NvY2lhdGlvbjEqMCgGA1UE
-AxMhVmlzYSBJbmZvcm1hdGlvbiBEZWxpdmVyeSBSb290IENBMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyREA4R/QkkfpLx0cYjga/EhIPZpchH0MZsRZ
-FfP6C2ITtf/Wc+MtgD4yTK0yoiXvni3d+aCtEgK3GDvkdgYrgF76ROJFZwUQjQ9l
-x42gRT05DbXvWFoy7dTglCZ9z/Tt2Cnktv9oxKgmkeHY/CyfpCBg1S8xth2JlGMR
-0ug/GMO5zANuegZOv438p5Lt5So+du2Gl+RMFQqEPwqN5uJSqAe0VtmB4gWdQ8on
-Bj2ZAM2R73QW7UW0Igt2vA4JaSiNtaAG/Y/58VXWHGgbq7rDtNK1R30X0kJV0rGA
-ib3RSwB3LpG7bOjbIucV5mQgJoVjoA1e05w6g1x/KmNTmOGRVwIDAQABo30wezAP
-BgNVHRMBAf8EBTADAQH/MDkGA1UdIAQyMDAwLgYFZ4EDAgEwJTAVBggrBgEFBQcC
-ARYJMS4yLjMuNC41MAwGCCsGAQUFBwICMAAwDgYDVR0PAQH/BAQDAgEGMB0GA1Ud
-DgQWBBRPitp2/2d3I5qmgH1924h1hfeBejANBgkqhkiG9w0BAQUFAAOCAQEACUW1
-QdUHdDJydgDPmYt+telnG/Su+DPaf1cregzlN43bJaJosMP7NwjoJY/H2He4XLWb
-5rXEkl+xH1UyUwF7mtaUoxbGxEvt8hPZSTB4da2mzXgwKvXuHyzF5Qjy1hOB0/pS
-WaF9ARpVKJJ7TOJQdGKBsF2Ty4fSCLqZLgfxbqwMsd9sysXI3rDXjIhekqvbgeLz
-PqZr+pfgFhwCCLSMQWl5Ll3u7Qk9wR094DZ6jj6+JCVCRUS3HyabH4OlM0Vc2K+j
-INsF/64Or7GNtRf9HYEJvrPxHINxl3JVwhYj4ASeaO4KwhVbwtw94Tc/XrGcexDo
-c5lC3rAi4/UZqweYCw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
-HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
-ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
-MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
-VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
-ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
-dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
-OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
-8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
-Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
-hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
-6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
-DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
-AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
-bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
-ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
-qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
-iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
-0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
-sSi6
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
-MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
-U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
-NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
-ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
-ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
-DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
-8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
-+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
-X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
-K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
-1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
-A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
-zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
-YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
-bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
-DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
-L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
-eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
-xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
-VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
-WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL
-MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
-BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
-Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1
-OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
-SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc
-VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW
-Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q
-Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2
-1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq
-ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1
-Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud
-EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX
-XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
-dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6
-Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
-JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
-Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN
-irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8
-TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6
-g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB
-95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj
-S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
-MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
-R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
-MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
-Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
-AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
-ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
-7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
-kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
-mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
-KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
-6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
-4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
-oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
-UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
-AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE
-BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu
-IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow
-RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY
-U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
-MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv
-Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br
-YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF
-nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH
-6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt
-eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/
-c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ
-MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH
-HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf
-jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6
-5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB
-rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
-F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c
-wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
-cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB
-AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp
-WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9
-xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ
-2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ
-IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8
-aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X
-em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR
-dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/
-OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+
-hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy
-tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1
-MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
-czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG
-CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy
-MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl
-ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS
-b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy
-euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO
-bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw
-WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d
-MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE
-1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD
-VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/
-zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB
-BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF
-BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV
-v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG
-E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
-uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW
-iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v
-GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
-yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
-ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
-U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
-ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
-ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
-U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
-nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
-t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
-SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
-BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
-rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
-NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
-BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
-BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
-aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
-MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
-p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
-5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
-WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
-4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
-hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc
-MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp
-b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT
-AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs
-aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H
-j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K
-f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55
-IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw
-FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht
-QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm
-/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ
-k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ
-MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC
-seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
-ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ
-hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+
-eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U
-DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj
-B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
-rosot4LKGAfmt1t06SAZf7IbiVQ=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
-MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx
-MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV
-BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG
-29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk
-oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk
-3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL
-qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN
-nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw
-DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG
-MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX
-ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H
-DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO
-TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv
-kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w
-zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
-MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
-DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
-PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
-Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
-rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
-OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
-xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
-7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
-aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
-SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
-ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
-AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
-R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
-JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
-Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE
-SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw
-ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU
-REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr
-2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s
-2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU
-GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj
-dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r
-TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/
-BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB
-AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv
-c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl
-ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu
-MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg
-T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud
-HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD
-VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny
-bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
-MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ
-J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG
-SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom
-JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO
-inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y
-caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB
-mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ
-YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9
-BKNDLdr8C2LqL19iUw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6
-MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp
-dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX
-BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy
-MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp
-eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg
-/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl
-wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh
-AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2
-PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu
-AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR
-MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc
-HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/
-Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+
-f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO
-rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch
-6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3
-7CAFYd4=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE
-BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
-cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy
-MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
-Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
-thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
-cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
-L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
-NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
-X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
-m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
-Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
-EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
-KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
-6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
-OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
-VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD
-VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
-cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv
-ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl
-AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF
-661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9
-am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1
-ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481
-PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS
-3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k
-SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF
-3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM
-ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g
-StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz
-Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB
-jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
-MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
-IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
-MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
-FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
-bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
-dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
-H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
-uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
-mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
-a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
-E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
-WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
-VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
-Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
-cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
-IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
-AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
-YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
-6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
-Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
-c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
-mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
-MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
-ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
-MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
-LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
-KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
-RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
-WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
-Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
-AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
-eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
-zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
-WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
-/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
-MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
-ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
-cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
-WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
-Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
-IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
-UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
-TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
-BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
-kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
-AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
-HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
-sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
-I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
-J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
-VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
-03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
-EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
-ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
-NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
-EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
-AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
-E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
-/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
-DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
-GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
-tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
-AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
-FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
-WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
-9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
-gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
-2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
-LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
-4uJEvlz36hz1
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET
-MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb
-BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz
-MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx
-FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g
-Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2
-fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl
-LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV
-WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF
-TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb
-5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc
-CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri
-wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ
-wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG
-m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4
-F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng
-WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0
-2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
-AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/
-0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw
-F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS
-g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj
-qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN
-h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/
-ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V
-btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj
-Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ
-8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW
-gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFujCCBKKgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMCVVMx
-HTAbBgNVBAoTFEFwcGxlIENvbXB1dGVyLCBJbmMuMS0wKwYDVQQLEyRBcHBsZSBD
-b21wdXRlciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAnBgNVBAMTIEFwcGxlIFJv
-b3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA1MDIxMDAwMTgxNFoXDTI1MDIx
-MDAwMTgxNFowgYYxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBcHBsZSBDb21wdXRl
-ciwgSW5jLjEtMCsGA1UECxMkQXBwbGUgQ29tcHV0ZXIgQ2VydGlmaWNhdGUgQXV0
-aG9yaXR5MSkwJwYDVQQDEyBBcHBsZSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
-eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOSRqQkfkdseR1DrBe1e
-eYQt6zaiV0xV7IsZid75S2z1B6siMALoGD74UAnTf0GomPnRymacJGsR0KO75Bsq
-wx+VnnoMpEeLW9QWNzPLxA9NzhRp0ckZcvVdDtV/X5vyJQO6VY9NXQ3xZDUjFUsV
-WR2zlPf2nJ7PULrBWFBnjwi0IPfLrCwgb3C2PwEwjLdDzw+dPfMrSSgayP7OtbkO
-2V4c1ss9tTqt9A8OAJILsSEWLnTVPA3bYharo3GSR1NVwa8vQbP4++NwzeajTEV+
-H0xrUJZBicR0YgsQg0GHM4qBsTBY7FoEMoxos48d3mVz/2deZbxJ2HafMxRloXeU
-yS0CAwEAAaOCAi8wggIrMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
-MB0GA1UdDgQWBBQr0GlHlHYJ/vRrjS5ApvdHTX8IXjAfBgNVHSMEGDAWgBQr0GlH
-lHYJ/vRrjS5ApvdHTX8IXjCCASkGA1UdIASCASAwggEcMIIBGAYJKoZIhvdjZAUB
-MIIBCTBBBggrBgEFBQcCARY1aHR0cHM6Ly93d3cuYXBwbGUuY29tL2NlcnRpZmlj
-YXRlYXV0aG9yaXR5L3Rlcm1zLmh0bWwwgcMGCCsGAQUFBwICMIG2GoGzUmVsaWFu
-Y2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2Nl
-cHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5k
-IGNvbmRpdGlvbnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRp
-ZmljYXRpb24gcHJhY3RpY2Ugc3RhdGVtZW50cy4wRAYDVR0fBD0wOzA5oDegNYYz
-aHR0cHM6Ly93d3cuYXBwbGUuY29tL2NlcnRpZmljYXRlYXV0aG9yaXR5L3Jvb3Qu
-Y3JsMFUGCCsGAQUFBwEBBEkwRzBFBggrBgEFBQcwAoY5aHR0cHM6Ly93d3cuYXBw
-bGUuY29tL2NlcnRpZmljYXRlYXV0aG9yaXR5L2Nhc2lnbmVycy5odG1sMA0GCSqG
-SIb3DQEBBQUAA4IBAQCd2i0oWC99dgS5BNM+zrdmY06PL9T+S61yvaM5xlJNBZhS
-9YlRASR5vhoy9+VEi0tEBzmC1lrKtCBe2a4VXR2MHTK/ODFiSF3H4ZCx+CRA+F9Y
-m1FdV53B5f88zHIhbsTp6aF31ywXJsM/65roCwO66bNKcuszCVut5mIxauivL9Wv
-Hld2j383LS4CXN1jyfJxuCZA3xWNdUQ/eb3mHZnhQyw+rW++uaT+DjUZUWOxw961
-kj5ReAFziqQjyqSI8R5cH0EWLX6VCqrpiUGYGxrdyyC/R14MJsVVNU3GMIuZZxTH
-CR+6R8faAQmHJEKVvRNgGQrv6n8Obs3BREM6StXj
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx
-CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp
-ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa
-QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw
-NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft
-ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu
-QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq
-hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG
-qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL
-fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ
-Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4
-Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ
-54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b
-MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j
-ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej
-YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt
-A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF
-rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ
-pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
-AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB
-lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy
-YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50
-7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs
-YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6
-xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc
-unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/
-Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp
-ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42
-gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0
-jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+
-XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD
-W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/
-RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r
-MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk
-BYn8eNZcLCZDqQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd
-MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg
-Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL
-MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD
-VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0
-ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX
-l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB
-HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B
-5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3
-WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD
-AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP
-gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+
-DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu
-BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs
-h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk
-LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET
-MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk
-BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4
-Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl
-cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0
-aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY
-F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N
-8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe
-rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K
-/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu
-7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC
-28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6
-lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E
-nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB
-0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09
-5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj
-WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN
-jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
-KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s
-ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM
-OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q
-619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn
-2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj
-o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v
-nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG
-5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq
-pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb
-dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0
-BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT
-AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD
-QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP
-MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do
-0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ
-UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d
-RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ
-OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv
-JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C
-AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O
-BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ
-LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY
-MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ
-44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I
-Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw
-i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN
-9u6wWk5JRFRYX0KD
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
-GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
-b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
-BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
-YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
-V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
-4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
-H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
-8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
-vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
-mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
-btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
-T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
-WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
-c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
-4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
-VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
-CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
-aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
-aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
-dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
-czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
-A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
-TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
-Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
-7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
-d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
-+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
-4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
-t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
-DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
-k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
-zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
-Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
-mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
-4SVhM7JZG+Ju1zdXtg2pEto=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD
-TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2
-MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF
-Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB
-DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh
-IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6
-dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO
-V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC
-GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN
-v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB
-AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB
-Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO
-76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK
-OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH
-ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi
-yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL
-buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj
-2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
-MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
-YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
-R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
-9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
-fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
-iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
-1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
-bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
-MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
-ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
-uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
-Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
-tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
-PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
-hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
-5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDyzCCArOgAwIBAgIDAOJIMA0GCSqGSIb3DQEBBQUAMIGLMQswCQYDVQQGEwJB
-VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp
-bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRgwFgYDVQQLDA9BLVRydXN0LVF1
-YWwtMDIxGDAWBgNVBAMMD0EtVHJ1c3QtUXVhbC0wMjAeFw0wNDEyMDIyMzAwMDBa
-Fw0xNDEyMDIyMzAwMDBaMIGLMQswCQYDVQQGEwJBVDFIMEYGA1UECgw/QS1UcnVz
-dCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
-a2VociBHbWJIMRgwFgYDVQQLDA9BLVRydXN0LVF1YWwtMDIxGDAWBgNVBAMMD0Et
-VHJ1c3QtUXVhbC0wMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJaR
-q9eOsFm4Ab20Hq2Z/aH86gyWa48uSUjY6eQkguHYuszr3gdcSMYZggFHQgnhfLmf
-ro/27l5rqKhWiDhWs+b+yZ1PNDhRPJy+86ycHMg9XJqErveULBSyZDdgjhSwOyrN
-ibUir/fkf+4sKzP5jjytTKJXD/uCxY4fAd9TjMEVpN3umpIS0ijpYhclYDHvzzGU
-833z5Dwhq5D8bc9jp8YSAHFJ1xzIoO1jmn3jjyjdYPnY5harJtHQL73nDQnfbtTs
-5ThT9GQLulrMgLU4WeyAWWWEMWpfVZFMJOUkmoOEer6A8e5fIAeqdxdsC+JVqpZ4
-CAKel/Arrlj1gFA//jsCAwEAAaM2MDQwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4E
-CgQIQj0rJKbBRc4wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBG
-yxFjUA2bPkXUSC2SfJ29tmrbiLKal+g6a9M8Xwd+Ejo+oYkNP6F4GfeDtAXpm7xb
-9Ly8lhdbHcpRhzCUQHJ1tBCiGdLgmhSx7TXjhhanKOdDgkdsC1T+++piuuYL72TD
-gUy2Sb1GHlJ1Nc6rvB4fpxSDAOHqGpUq9LWsc3tFkXqRqmQVtqtR77npKIFBioc6
-2jTBwDMPX3hDJDR1DSPc6BnZliaNw2IHdiMQ0mBoYeRnFdq+TyDKsjmJOOQPLzzL
-/saaw6F891+gBjLFEFquDyR73lAPJS279R3csi8WWk4ZYUC/1V8H3Ktip/J6ac8e
-qhLCbmJ81Lo92JGHz/ot
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
-RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
-VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
-DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
-ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
-VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
-mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
-IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
-mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
-XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
-dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
-jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
-BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
-DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
-9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
-jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
-Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
-ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
-R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
-Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
-KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
-NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
-NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
-ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
-BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
-KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
-Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
-4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
-KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
-rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
-94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
-sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
-gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
-kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
-vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
-A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
-O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
-AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
-9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
-eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
-0vdXcDazv/wor3ElhVsT/h5/WrQ8
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICpzCCAi2gAwIBAgIQTHm1miicdjFk9YlE0JEC3jAKBggqhkjOPQQDAzCBlDEL
-MAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYD
-VQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMUUwQwYDVQQDEzxTeW1hbnRlYyBD
-bGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0g
-RzQwHhcNMTIxMDE4MDAwMDAwWhcNMzcxMjAxMjM1OTU5WjCBlDELMAkGA1UEBhMC
-VVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1h
-bnRlYyBUcnVzdCBOZXR3b3JrMUUwQwYDVQQDEzxTeW1hbnRlYyBDbGFzcyAzIFB1
-YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcq
-hkjOPQIBBgUrgQQAIgNiAARXz+qzOU0/oSHgbi84csaHl/OFC0fnD1HI0fSZm8pZ
-Zf9M+eoLtyXV0vbsMS0yYhLXdoan+jjJZdT+c+KEOfhMSWIT3brViKBfPchPsD+P
-oVAR5JNGrcNfy/GkapVW6MCjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
-BTADAQH/MB0GA1UdDgQWBBQknbzScfcdwiW+IvGJpSwVOzQeXjAKBggqhkjOPQQD
-AwNoADBlAjEAuWZoZdsF0Dh9DvPIdWG40CjEsUozUVj78jwQyK5HeHbKZiQXhj5Q
-Vm6lLZmIuL0kAjAD6qfnqDzqnWLGX1TamPR3vU+PGJyRXEdrQE0QHbPhicoLIsga
-xcX+i93B3294n5E=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
-ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
-MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
-LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
-RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
-+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
-PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
-xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
-Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
-hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
-EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
-FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
-nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
-eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
-hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
-Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
-vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
-+OkuE6N36B9K
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGHDCCBASgAwIBAgIES45gAzANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJE
-SzESMBAGA1UEChMJVFJVU1QyNDA4MSIwIAYDVQQDExlUUlVTVDI0MDggT0NFUyBQ
-cmltYXJ5IENBMB4XDTEwMDMwMzEyNDEzNFoXDTM3MTIwMzEzMTEzNFowRTELMAkG
-A1UEBhMCREsxEjAQBgNVBAoTCVRSVVNUMjQwODEiMCAGA1UEAxMZVFJVU1QyNDA4
-IE9DRVMgUHJpbWFyeSBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
-AJlJodr3U1Fa+v8HnyACHV81/wLevLS0KUk58VIABl6Wfs3LLNoj5soVAZv4LBi5
-gs7E8CZ9w0F2CopW8vzM8i5HLKE4eedPdnaFqHiBZ0q5aaaQArW+qKJx1rT/AaXt
-alMB63/yvJcYlXS2lpexk5H/zDBUXeEQyvfmK+slAySWT6wKxIPDwVapauFY9QaG
-+VBhCa5jBstWS7A5gQfEvYqn6csZ3jW472kW6OFNz6ftBcTwufomGJBMkonf4ZLr
-6t0AdRi9jflBPz3MNNRGxyjIuAmFqGocYFA/OODBRjvSHB2DygqQ8k+9tlpvzMRr
-kU7jq3RKL+83G1dJ3/LTjCLz4ryEMIC/OJ/gNZfE0qXddpPtzflIPtUFVffXdbFV
-1t6XZFhJ+wBHQCpJobq/BjqLWUA86upsDbfwnePtmIPRCemeXkY0qabC+2Qmd2Fe
-xyZphwTyMnbqy6FG1tB65dYf3mOqStmLa3RcHn9+2dwNfUkh0tjO2FXD7drWcU0O
-I9DW8oAypiPhm/QCjMU6j6t+0pzqJ/S0tdAo+BeiXK5hwk6aR+sRb608QfBbRAs3
-U/q8jSPByenggac2BtTN6cl+AA1Mfcgl8iXWNFVGegzd/VS9vINClJCe3FNVoUnR
-YCKkj+x0fqxvBLopOkJkmuZw/yhgMxljUi2qYYGn90OzAgMBAAGjggESMIIBDjAP
-BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjARBgNVHSAECjAIMAYGBFUd
-IAAwgZcGA1UdHwSBjzCBjDAsoCqgKIYmaHR0cDovL2NybC5vY2VzLnRydXN0MjQw
-OC5jb20vb2Nlcy5jcmwwXKBaoFikVjBUMQswCQYDVQQGEwJESzESMBAGA1UEChMJ
-VFJVU1QyNDA4MSIwIAYDVQQDExlUUlVTVDI0MDggT0NFUyBQcmltYXJ5IENBMQ0w
-CwYDVQQDEwRDUkwxMB8GA1UdIwQYMBaAFPZt+LFIs0FDAduGROUYBbdezAY3MB0G
-A1UdDgQWBBT2bfixSLNBQwHbhkTlGAW3XswGNzANBgkqhkiG9w0BAQsFAAOCAgEA
-VPAQGrT7dIjD3/sIbQW86f9CBPu0c7JKN6oUoRUtKqgJ2KCdcB5ANhCoyznHpu3m
-/dUfVUI5hc31CaPgZyY37hch1q4/c9INcELGZVE/FWfehkH+acpdNr7j8UoRZlkN
-15b/0UUBfGeiiJG/ugo4llfoPrp8bUmXEGggK3wyqIPcJatPtHwlb6ympfC2b/Ld
-v/0IdIOzIOm+A89Q0utx+1cOBq72OHy8gpGb6MfncVFMoL2fjP652Ypgtr8qN9Ka
-/XOazktiIf+2Pzp7hLi92hRc9QMYexrV/nnFSQoWdU8TqULFUoZ3zTEC3F/g2yj+
-FhbrgXHGo5/A4O74X+lpbY2XV47aSuw+DzcPt/EhMj2of7SA55WSgbjPMbmNX0rb
-oenSIte2HRFW5Tr2W+qqkc/StixgkKdyzGLoFx/xeTWdJkZKwyjqge2wJqws2upY
-EiThhC497+/mTiSuXd69eVUwKyqYp9SD2rTtNmF6TCghRM/dNsJOl+osxDVGcwvt
-WIVFF/Onlu5fu1NHXdqNEfzldKDUvCfii3L2iATTZyHwU9CALE+2eIA+PIaLgnM1
-1oCfUnYBkQurTrihvzz9PryCVkLxiqRmBVvUz+D4N5G/wvvKDS6t6cPCS+hqM482
-cbBsn0R9fFLO4El62S9eH1tqOzO20OAOK65yJIsOpSE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
-MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
-dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
-WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
-VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
-9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
-DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
-Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
-QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
-xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
-A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
-AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
-kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
-Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
-Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
-JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
-RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
-MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
-ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
-MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
-dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
-c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
-UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
-58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
-o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
-MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
-aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
-A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
-Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
-8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV
-BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
-c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt
-ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4
-MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg
-SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl
-a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h
-4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk
-tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s
-tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL
-dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4
-c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um
-TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z
-+kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O
-Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW
-OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW
-fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2
-l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
-/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw
-FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+
-8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI
-6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO
-TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME
-wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY
-Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn
-xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q
-DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q
-Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t
-hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4
-7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7
-QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS
-MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp
-bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw
-VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy
-YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy
-dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2
-ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe
-Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx
-GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls
-aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU
-QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh
-xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0
-aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr
-IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h
-gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK
-O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO
-fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw
-lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
-hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID
-AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/
-BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP
-NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t
-wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM
-7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh
-gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n
-oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs
-yZyQ2uypQjyttgI=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc
-UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
-c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS
-S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg
-SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx
-OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry
-b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC
-VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE
-sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F
-ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY
-KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG
-+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG
-HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P
-IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M
-733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk
-Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G
-CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW
-AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
-aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5
-mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa
-XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ
-qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEYDCCA0igAwIBAgICATAwDQYJKoZIhvcNAQELBQAwWTELMAkGA1UEBhMCVVMx
-GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDENMAsGA1UECxMERlBLSTEhMB8GA1UE
-AxMYRmVkZXJhbCBDb21tb24gUG9saWN5IENBMB4XDTEwMTIwMTE2NDUyN1oXDTMw
-MTIwMTE2NDUyN1owWTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD1UuUy4gR292ZXJu
-bWVudDENMAsGA1UECxMERlBLSTEhMB8GA1UEAxMYRmVkZXJhbCBDb21tb24gUG9s
-aWN5IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2HX7NRY0WkG/
-Wq9cMAQUHK14RLXqJup1YcfNNnn4fNi9KVFmWSHjeavUeL6wLbCh1bI1FiPQzB6+
-Duir3MPJ1hLXp3JoGDG4FyKyPn66CG3G/dFYLGmgA/Aqo/Y/ISU937cyxY4nsyOl
-4FKzXZbpsLjFxZ+7xaBugkC7xScFNknWJidpDDSPzyd6KgqjQV+NHQOGgxXgVcHF
-mCye7Bpy3EjBPvmE0oSCwRvDdDa3ucc2Mnr4MrbQNq4iGDGMUHMhnv6DOzCIJOPp
-wX7e7ZjHH5IQip9bYi+dpLzVhW86/clTpyBLqtsgqyFOHQ1O5piF5asRR12dP8Qj
-wOMUBm7+nQIDAQABo4IBMDCCASwwDwYDVR0TAQH/BAUwAwEB/zCB6QYIKwYBBQUH
-AQsEgdwwgdkwPwYIKwYBBQUHMAWGM2h0dHA6Ly9odHRwLmZwa2kuZ292L2ZjcGNh
-L2NhQ2VydHNJc3N1ZWRCeWZjcGNhLnA3YzCBlQYIKwYBBQUHMAWGgYhsZGFwOi8v
-bGRhcC5mcGtpLmdvdi9jbj1GZWRlcmFsJTIwQ29tbW9uJTIwUG9saWN5JTIwQ0Es
-b3U9RlBLSSxvPVUuUy4lMjBHb3Zlcm5tZW50LGM9VVM/Y0FDZXJ0aWZpY2F0ZTti
-aW5hcnksY3Jvc3NDZXJ0aWZpY2F0ZVBhaXI7YmluYXJ5MA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUrQx6dVzl85jEeZgOrCj9l/TnAvwwDQYJKoZIhvcNAQELBQAD
-ggEBAI9z2uF/gLGH9uwsz9GEYx728Yi3mvIRte9UrYpuGDco71wb5O9Qt2wmGCMi
-TR0mRyDpCZzicGJxqxHPkYnos/UqoEfAFMtOQsHdDA4b8Idb7OV316rgVNdF9IU+
-7LQd3nyKf1tNnJaK0KIyn9psMQz4pO9+c+iR3Ah6cFqgr2KBWfgAdKLI3VTKQVZH
-venAT+0g3eOlCd+uKML80cgX2BLHb94u6b2akfI8WpQukSKAiaGMWMyDeiYZdQKl
-Dn0KJnNR6obLB6jI/WNaNZvSr79PMUjBhHDbNXuaGQ/lj/RqDG8z2esccKIN47lQ
-A2EC/0rskqTcLe4qNJMHtyznGI8=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
-ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
-U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
-A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
-U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
-SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
-biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
-GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
-fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
-AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
-aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
-aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
-kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
-4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
-FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL
-MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
-BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1
-c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy
-MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl
-ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm
-BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF
-5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv
-DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v
-zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT
-yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj
-dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh
-MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB
-Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI
-4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz
-dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY
-aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G
-DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
-CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH
-LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDcTCCAlmgAwIBAgIVAOYJ/nrqAGiM4CS07SAbH+9StETRMA0GCSqGSIb3DQEB
-BQUAMFAxCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGlj
-emVuaW93YSBTLkEuMRcwFQYDVQQDDA5TWkFGSVIgUk9PVCBDQTAeFw0xMTEyMDYx
-MTEwNTdaFw0zMTEyMDYxMTEwNTdaMFAxCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L
-cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRcwFQYDVQQDDA5TWkFGSVIg
-Uk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKxHL49ZMTml
-6g3wpYwrvQKkvc0Kc6oJ5sxfgmp1qZfluwbv88BdocHSiXlY8NzrVYzuWBp7J/9K
-ULMAoWoTIzOQ6C9TNm4YbA9A1jdX1wYNL5Akylf8W5L/I4BXhT9KnlI6x+a7BVAm
-nr/Ttl+utT/Asms2fRfEsF2vZPMxH4UFqOAhFjxTkmJWf2Cu4nvRQJHcttB+cEAo
-ag/hERt/+tzo4URz6x6r19toYmxx4FjjBkUhWQw1X21re//Hof2+0YgiwYT84zLb
-eqDqCOMOXxvH480yGDkh/QoazWX3U75HQExT/iJlwnu7I1V6HXztKIwCBjsxffbH
-3jOshCJtywcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFFOSo33/gnbwM9TrkmdHYTMbaDsqMA0GCSqGSIb3DQEBBQUA
-A4IBAQA5UFWd5EL/pBviIMm1zD2JLUCpp0mJG7JkwznIOzawhGmFFaxGoxAhQBEg
-haP+E0KR66oAwVC6xe32QUVSHfWqWndzbODzLB8yj7WAR0cDM45ZngSBPBuFE3Wu
-GLJX9g100ETfIX+4YBR/4NR/uvTnpnd9ete7Whl0ZfY94yuu4xQqB5QFv+P7IXXV
-lTOjkjuGXEcyQAjQzbFaT9vIABSbeCXWBbjvOXukJy6WgAiclzGNSYprre8Ryydd
-fmjW9HIGwsIO03EldivvqEYL1Hv1w/Pur+6FUEOaL68PEIUovfgwIB2BAw+vZDuw
-cH0mX548PojGyg434cDjkSXa3mHF
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc
-UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
-c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS
-S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg
-SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3
-WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv
-bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU
-UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw
-bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe
-LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef
-J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh
-R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ
-Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX
-JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p
-zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S
-Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
-KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq
-ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
-Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz
-gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH
-uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS
-y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl
-MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh
-U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz
-MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N
-IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11
-bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE
-RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO
-zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5
-bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF
-MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1
-VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC
-OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G
-CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW
-tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ
-q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb
-EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+
-Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O
-VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICqDCCAi2gAwIBAgIQNBdlEkA7t1aALYDLeVWmHjAKBggqhkjOPQQDAzCBlDEL
-MAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYD
-VQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMUUwQwYDVQQDEzxTeW1hbnRlYyBD
-bGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0g
-RzQwHhcNMTExMDA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBlDELMAkGA1UEBhMC
-VVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1h
-bnRlYyBUcnVzdCBOZXR3b3JrMUUwQwYDVQQDEzxTeW1hbnRlYyBDbGFzcyAyIFB1
-YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcq
-hkjOPQIBBgUrgQQAIgNiAATR2UqOTA2ESlG6fO/TzPo6mrWnYxM9AeBJPvrBR8mS
-szrX/m+c95o6D/UOCgrDP8jnEhSO1dVtmCyzcTIK6yq99tdqIAtnRZzSsr9TImYJ
-XdsR8/EFM1ij4rjPfM2Cm72jQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
-BTADAQH/MB0GA1UdDgQWBBQ9MvM6qQyQhPmijGkGYVQvh3L+BTAKBggqhkjOPQQD
-AwNpADBmAjEAyKapr0F/tckRQhZoaUxcuCcYtpjxwH+QbYfTjEYX8D5P/OqwCMR6
-S7wIL8fip29lAjEA1lnehs5fDspU1cbQFQ78i5Ry1I4AWFPPfrFLDeVQhuuea9//
-KabYR9mglhjb8kWz
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
-MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
-Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow
-TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
-HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
-BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y
-ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E
-N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9
-tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX
-0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c
-/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X
-KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY
-zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS
-O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D
-34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP
-K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3
-AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv
-Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj
-QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
-cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS
-IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2
-HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa
-O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv
-033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u
-dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE
-kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41
-3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD
-u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq
-4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF9jCCA96gAwIBAgIQZWNxhdNvRcaPfzH5CYeSgjANBgkqhkiG9w0BAQwFADCB
-lDELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8w
-HQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMUUwQwYDVQQDEzxTeW1hbnRl
-YyBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-IC0gRzYwHhcNMTIxMDE4MDAwMDAwWhcNMzcxMjAxMjM1OTU5WjCBlDELMAkGA1UE
-BhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZT
-eW1hbnRlYyBUcnVzdCBOZXR3b3JrMUUwQwYDVQQDEzxTeW1hbnRlYyBDbGFzcyAz
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzYwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC3DrL6TbyachX7d1vb/UMPywv3
-YC6zK34Mu1PyzE5l8xm7/zUd99Opu0Attd141Kb5N+qFBXttt+YTSwZ8+3ZjjyAd
-LTgrBIXy6LDRX01KIclq2JTqHgJQpqqQB6BHIepm+QSg5oPwxPVeluInTWHDs8GM
-IrZmoQDRVin77cF/JMo9+lqUsITDx7pDHP1kDvEo+0dZ8ibhMblE+avd+76+LDfj
-rAsY0/wBovGkCjWCR0yrvYpe3xOF/CDMSFmvr0FvyyPNypOn3dVfyGQ7/wEDoApP
-LW49hL6vyDKyUymQFfewBZoKPPa5BpDJpeFdoDuw/qi2v/WJKFckOiGGceTciotB
-VeweMCRZ0cBZuHivqlp03iWAMJjtMERvIXAc2xJTDtamKGaTLB/MTzwbgcW59nhv
-0DI6CHLbaw5GF4WU87zvvPekXo7p6bVk5bdLRRIsTDe3YEMKTXEGAJQmNXQfu3o5
-XE475rgD4seTi4QsJUlF3X8jlGAfy+nN9quX92Hn+39igcjcCjBcGHzmzu/Hbh6H
-fLPpysh7avRo/IOlDFa0urKNSgrHl5fFiDAVPRAIVBVycmczM/R8t84AJ1NlziTx
-WmTnNi/yLgLCl99y6AIeoPc9tftoYAP6M6nmEm0G4amoXU48/tnnAGWsthlNe4N/
-NEfq4RhtsYsceavnnQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUOXEIAD7eyIbnkP/k/SEPziQZFvYwDQYJKoZIhvcN
-AQEMBQADggIBAFBriE1gSM5a4yLOZ3yEp80c/ekMA4w2rwqHDmquV64B0Da78v25
-c8FftaiuTKL6ScsHRhY2vePIVzh+OOS/JTNgxtw3nGO7XpgeGrKC8K6mdxGAREeh
-KcXwszrOmPC47NMOgAZ3IzBM/3lkYyJbd5NDS3Wz2ztuO0rd8ciutTeKlYg6EGhw
-OLlbcH7VQ8n8X0/l5ns27vAg7UdXEyYQXhQGDXt2B8LGLRb0rqdsD7yID08sAraj
-1yLmmUc12I2lT4ESOhF9s8wLdfMecKMbA+r6mujmLjY5zJnOOj8Mt674Q5mwk25v
-qtkPajGRu5zTtCj7g0x6c4JQZ9IOrO1gxbJdNZjPh34eWR0kvFa62qRa2MzmvB4Q
-jxuMjvPB27e+1LBbZY8WaPNWxSoZFk0PuGWHbSSDuGLc4EdhGoh7zk5//dzGDVqa
-pPO1TPbdMaboHREhMzAEYX0c4D5PjT+1ixIAWn2poQDUg+twuxj4pNIcgS23CBHI
-Jnu21OUPA0Zy1CVAHr5JXW2T8VyyO3VUaTqg7kwiuqya4gitRWMFSlI1dsQ09V4H
-Mq3cfCbRW4+t5OaqG3Wf61206MCpFXxOSgdy30bJ1JGSdVaw4e43NmUoxRXIK3bM
-bW8Zg/T92hXiQeczeUaDV/nxpbZt07zXU+fucW14qZen7iCcGRVyFT0E
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw
-CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
-ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
-RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV
-UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
-Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq
-hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf
-Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q
-RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD
-AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY
-JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv
-6pZjamVFkpUBtA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEUzCCAzugAwIBAgIDAOJDMA0GCSqGSIb3DQEBBQUAMIHPMQswCQYDVQQGEwJB
-VDGBizCBiAYDVQQKHoGAAEEALQBUAHIAdQBzAHQAIABHAGUAcwAuACAAZgD8AHIA
-IABTAGkAYwBoAGUAcgBoAGUAaQB0AHMAcwB5AHMAdABlAG0AZQAgAGkAbQAgAGUA
-bABlAGsAdAByAC4AIABEAGEAdABlAG4AdgBlAHIAawBlAGgAcgAgAEcAbQBiAEgx
-GDAWBgNVBAsTD0EtVHJ1c3QtUXVhbC0wMTEYMBYGA1UEAxMPQS1UcnVzdC1RdWFs
-LTAxMB4XDTA0MTEzMDIzMDAwMFoXDTE0MTEzMDIzMDAwMFowgc8xCzAJBgNVBAYT
-AkFUMYGLMIGIBgNVBAoegYAAQQAtAFQAcgB1AHMAdAAgAEcAZQBzAC4AIABmAPwA
-cgAgAFMAaQBjAGgAZQByAGgAZQBpAHQAcwBzAHkAcwB0AGUAbQBlACAAaQBtACAA
-ZQBsAGUAawB0AHIALgAgAEQAYQB0AGUAbgB2AGUAcgBrAGUAaAByACAARwBtAGIA
-SDEYMBYGA1UECxMPQS1UcnVzdC1RdWFsLTAxMRgwFgYDVQQDEw9BLVRydXN0LVF1
-YWwtMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmhgdxIbxTGEOH
-fXGiewI3NFldAWKFWfLofO+5I1UbvA5avt7IgsGXz/tI/f5HGUbascI0i7xG0tqV
-lA5ctQgLRqxgxHtgTkMcqsAEYdsz3LZsCdXO1QrvEBGLTSABdxiL/gSWJ6z77CSw
-x7Xg02HwxPV82cjGkSF3ENGJntuIAAnRDWn/ORHjFatNRymoMbHaOEZXSGhf7Y5F
-rrHEqGyi9E6sv784De/T1aTvskn8cWeUmDzv//omiG/a/V9KQex/61XN8OthUQVn
-X+u/liL2NKx74I2C/GgHX5B0WkPNqsSOgmlvJ/cKuT0PveUgVFDAA0oYBgcE1KDM
-lBbN0kmPAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECEs8jB2F
-6W+tMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAIUusmJzMJRiQ
-8TAHrJAOelfuWoTGcqdIv7Tys/fNl2yF2fjvHT8J01aKialFVpbVeQ2XKb1O2bHO
-QYAKgsdZ2jZ/sdL2UVFRTHmidLu6PdgWCBRhJYQELQophO9QVvfhAA0TwbESYqTz
-+nlI5Gr7CZe8f6HEmhJmCtUQsdQCufGglRh4T+tIGiNGcnyVEHZ93mSVepFr1VA2
-9CTRPteuGjA81jeAz9peYiFE1CXvxK9cJiv0BcALFLWmADCoRLzIRZhA+sAwYUmw
-M1rqVCPA3kBQvIC95tyQvNy2dG0Vs+O6PwLaNX/suSlElQ06X2l1VwMaYb4vZKFq
-N0bOhBXEVg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIJmzCCB4OgAwIBAgIBATANBgkqhkiG9w0BAQwFADCCAR4xPjA8BgNVBAMTNUF1
-dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s
-YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz
-dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0
-aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh
-IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ
-KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyMjE4MDgy
-MVoXDTMwMTIxNzIzNTk1OVowggEeMT4wPAYDVQQDEzVBdXRvcmlkYWQgZGUgQ2Vy
-dGlmaWNhY2lvbiBSYWl6IGRlbCBFc3RhZG8gVmVuZXpvbGFubzELMAkGA1UEBhMC
-VkUxEDAOBgNVBAcTB0NhcmFjYXMxGTAXBgNVBAgTEERpc3RyaXRvIENhcGl0YWwx
-NjA0BgNVBAoTLVNpc3RlbWEgTmFjaW9uYWwgZGUgQ2VydGlmaWNhY2lvbiBFbGVj
-dHJvbmljYTFDMEEGA1UECxM6U3VwZXJpbnRlbmRlbmNpYSBkZSBTZXJ2aWNpb3Mg
-ZGUgQ2VydGlmaWNhY2lvbiBFbGVjdHJvbmljYTElMCMGCSqGSIb3DQEJARYWYWNy
-YWl6QHN1c2NlcnRlLmdvYi52ZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
-ggIBAME77xNS8ZlW47RsBeEaaRZhJoZ4rw785UAFCuPZOAVMqNS1wMYqzy95q6Gk
-UO81ER/ugiQX/KMcq/4HBn83fwdYWxPZfwBfK7BP2p/JsFgzYeFP0BXOLmvoJIzl
-Jb6FW+1MPwGBjuaZGFImWZsSmGUclb51mRYMZETh9/J5CLThR1exStxHQptwSzra
-zNFpkQY/zmj7+YZNA9yDoroVFv6sybYOZ7OxNDo7zkSLo45I7gMwtxqWZ8VkJZkC
-8+p0dX6mkhUT0QAV64Zc9HsZiH/oLhEkXjhrgZ28cF73MXIqLx1fyM4kPH1yOJi/
-R72nMwL7D+Sd6mZgI035TxuHXc2/uOwXfKrrTjaJDz8Jp6DdessOkxIgkKXRjP+F
-K3ze3n4NUIRGhGRtyvEjK95/2g02t6PeYiYVGur6ruS49n0RAaSS0/LJb6XzaAAe
-0mmO2evnEqxIKwy2mZRNPfAVW1l3wCnWiUwryBU6OsbFcFFrQm+00wOicXvOTHBM
-aiCVAVZTb9RSLyi+LJ1llzJZO3pq3IRiiBj38Nooo+2ZNbMEciSgmig7YXaUcmud
-SVQvLSL+Yw+SqawyezwZuASbp7d/0rutQ59d81zlbMt3J7yB567rT2IqIydQ8qBW
-k+fmXzghX+/FidYsh/aK+zZ7Wy68kKHuzEw1Vqkat5DGs+VzAgMBAAGjggLeMIIC
-2jASBgNVHRMBAf8ECDAGAQH/AgECMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52
-ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0wMB0GA1UdDgQWBBStuyIdxuDS
-Aaj9dlBSk+2YwU2u0zCCAVAGA1UdIwSCAUcwggFDgBStuyIdxuDSAaj9dlBSk+2Y
-wU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRpZmlj
-YWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAw
-DgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYD
-VQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25p
-Y2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEgZGUgU2VydmljaW9zIGRlIENl
-cnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG9w0BCQEWFmFjcmFpekBz
-dXNjZXJ0ZS5nb2IudmWCAQEwDgYDVR0PAQH/BAQDAgEGMDcGA1UdEQQwMC6CD3N1
-c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0wMFQGA1Ud
-HwRNMEswJKAioCCGHmhodHA6Ly93d3cuc3VzY2VydGUuZ29iLnZlL2xjcjAjoCGg
-H4YdbGRhcDovL2FjcmFpei5zdXNjZXJ0ZS5nb2IudmUwNwYIKwYBBQUHAQEEKzAp
-MCcGCCsGAQUFBzABhhtoaHRwOi8vb2NzcC5zdXNjZXJ0ZS5nb2IudmUwQAYDVR0g
-BDkwNzA1BgVghl4BAjAsMCoGCCsGAQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRl
-LmdvYi52ZS9kcGMwDQYJKoZIhvcNAQEMBQADggIBAK4qy/zmZ9zBwfW3yOYtLcBT
-Oy4szJyPz7/RhNH3bPVH7HbDTGpi6JZ4YXdXMBeJE5qBF4a590Kgj8Rlnltt+Rbo
-OFQOU1UDqKuTdBsA//Zry5899fmn8jBUkg4nh09jhHHbLlaUScdz704Zz2+UVg7i
-s/r3Legxap60KzmdrmTAE9VKte1TQRgavQwVX5/2mO/J+SCas//UngI+h8SyOucq
-mjudYEgBrZaodUsagUfn/+AzFNrGLy+al+5nZeHb8JnCfLHWS0M9ZyhgoeO/czyn
-99+5G93VWNv4zfc4KiavHZKrkn8F9pg0ycIZh+OwPT/RE2zq4gTazBMlP3ACIe/p
-olkNaOEa8KvgzW96sjBZpMW49zFmyINYkcj+uaNCJrVGsXgdBmkuRGJNWFZ9r0cG
-woIaxViFBypsz045r1ESfYPlfDOavBhZ/giR/Xocm9CHkPRY2BApMMR0DUCyGETg
-Ql+L3kfdTKzuDjUp2DM9FqysQmaM81YDZufWkMhlZPfHwC7KbNougoLroa5Umeos
-bqAXWmk46SwIdWRPLLqbUpDTKooynZKpSYIkkotdgJoVZUUCY+RCO8jsVPEU6ece
-SxztNUm5UOta1OJPMwSAKRHOo3ilVb9c6lAixDdvV8MeNbqe6asM1mpCHWbJ/0rg
-5Ls9Cxx8hracyp0ev7b0
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGATCCA+mgAwIBAgIRAI9hcRW6eVgXjH0ROqzW264wDQYJKoZIhvcNAQELBQAw
-RTEfMB0GA1UEAxMWQ29tU2lnbiBHbG9iYWwgUm9vdCBDQTEVMBMGA1UEChMMQ29t
-U2lnbiBMdGQuMQswCQYDVQQGEwJJTDAeFw0xMTA3MTgxMDI0NTRaFw0zNjA3MTYx
-MDI0NTVaMEUxHzAdBgNVBAMTFkNvbVNpZ24gR2xvYmFsIFJvb3QgQ0ExFTATBgNV
-BAoTDENvbVNpZ24gTHRkLjELMAkGA1UEBhMCSUwwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQCyKClzKh3rm6n1nvigmV/VU1D4hSwYW2ro3VqpzpPo0Ph3
-3LguqjXd5juDwN4mpxTpD99d7Xu5X6KGTlMVtfN+bTbA4t3x7DU0Zqn0BE5XuOgs
-3GLH41Vmr5wox1bShVpM+IsjcN4E/hMnDtt/Bkb5s33xCG+ohz5dlq0gA9qfr/g4
-O9lkHZXTCeYrmVzd/il4x79CqNvGkdL3um+OKYl8rg1dPtD8UsytMaDgBAopKR+W
-igc16QJzCbvcinlETlrzP/Ny76BWPnAQgaYBULax/Q5thVU+N3sEOKp6uviTdD+X
-O6i96gARU4H0xxPFI75PK/YdHrHjfjQevXl4J37FJfPMSHAbgPBhHC+qn/014DOx
-46fEGXcdw2BFeIIIwbj2GH70VyJWmuk/xLMCHHpJ/nIF8w25BQtkPpkwESL6esaU
-b1CyB4Vgjyf16/0nRiCAKAyC/DY/Yh+rDWtXK8c6QkXD2XamrVJo43DVNFqGZzbf
-5bsUXqiVDOz71AxqqK+p4ek9374xPNMJ2rB5MLPAPycwI0bUuLHhLy6nAIFHLhut
-TNI+6Y/soYpi5JSaEjcY7pxI8WIkUAzr2r+6UoT0vAdyOt7nt1y8844a7szo/aKf
-woziHl2O1w6ZXUC30K+ptXVaOiW79pBDcbLZ9ZdbONhS7Ea3iH4HJNwktrBJLQID
-AQABo4HrMIHoMA8GA1UdEwEB/wQFMAMBAf8wgYQGA1UdHwR9MHswPKA6oDiGNmh0
-dHA6Ly9mZWRpci5jb21zaWduLmNvLmlsL2NybC9jb21zaWduZ2xvYmFscm9vdGNh
-LmNybDA7oDmgN4Y1aHR0cDovL2NybDEuY29tc2lnbi5jby5pbC9jcmwvY29tc2ln
-bmdsb2JhbHJvb3RjYS5jcmwwDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBQCRZPY
-DUhirGm6rgZbPvuqJpFQsTAfBgNVHSMEGDAWgBQCRZPYDUhirGm6rgZbPvuqJpFQ
-sTANBgkqhkiG9w0BAQsFAAOCAgEAk1V5V9701xsfy4mfX+tP9Ln5e9h3N+QMwUfj
-kr+k3e8iXOqADjTpUHeBkEee5tJq09ZLp/43F5tZ2eHdYq2ZEX7iWHCnOQet6Yw9
-SU1TahsrGDA6JJD9sdPFnNZooGsU1520e0zNB0dNWwxrWAmu4RsBxvEpWCJbvzQL
-dOfyX85RWwli81OiVMBc5XvJ1mxsIIqli45oRynKtsWP7E+b0ISJ1n+XFLdQo/Nm
-WA/5sDfT0F5YPzWdZymudMbXitimxC+n4oQE4mbQ4Zm718Iwg3pP9gMMcSc7Qc1J
-kJHPH9O7gVubkKHuSYj9T3Ym6c6egL1pb4pz/uT7cT26Fiopc/jdqbe2EAfoJZkv
-hlp/zdzOoXTWjiKNA5zmgWnZn943FuE9KMRyKtyi/ezJXCh8ypnqLIKxeFfZl69C
-BwJsPXUTuqj8Fic0s3aZmmr7C4jXycP+Q8V+akMEIoHAxcd960b4wVWKqOcI/kZS
-Q0cYqWOY1LNjznRt9lweWEfwDBL3FhrHOmD4++1N3FkkM4W+Q1b2WOL24clDMj+i
-2n9Iw0lc1llHMSMvA5D0vpsXZpOgcCVahfXczQKi9wQ3oZyonJeWx4/rXdMtagAB
-VBYGFuMEUEQtybI+eIbnp5peO2WAAblQI4eTy/jMVowe5tfMEXovV3sz9ULgmGb3
-DscLP1I=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICmDCCAgGgAwIBAgIBDjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJVUzEY
-MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNFQ0ExFDASBgNVBAMT
-C0VDQSBSb290IENBMB4XDTA0MDYxNDEwMjAwOVoXDTQwMDYxNDEwMjAwOVowSzEL
-MAkGA1UEBhMCVVMxGDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMD
-RUNBMRQwEgYDVQQDEwtFQ0EgUm9vdCBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
-gYkCgYEArkr2eXIS6oAKIpDkOlcQZdMGdncoygCEIU+ktqY3of5SVVXU7/it7kJ1
-EUzR4ii2vthQtbww9aAnpQxcEmXZk8eEyiGEPy+cCQMllBY+efOtKgjbQNDZ3lB9
-19qzUJwBl2BMxslU1XsJQw9SK10lPbQm4asa8E8e5zTUknZBWnECAwEAAaOBizCB
-iDAfBgNVHSMEGDAWgBT2uAQnDlYW2blj2f2hVGVBoAhILzAdBgNVHQ4EFgQU9rgE
-Jw5WFtm5Y9n9oVRlQaAISC8wDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
-Af8wJQYDVR0gBB4wHDAMBgpghkgBZQMCAQwBMAwGCmCGSAFlAwIBDAIwDQYJKoZI
-hvcNAQEFBQADgYEAHh0EQY2cZ209aBb5q0wW1ER0dc4OGzsLyqjHfaQ4TEaMmUwL
-AJRta/c4KVWLiwbODsvgJk+CaWmSL03gRW/ciVb/qDV7qh9Pyd1cOlanZTAnPog2
-i82yL3i2fK9DCC84uoxEQbgqK2jx9bIjFTwlAqITk9fGAm5mdT84IEwq1Gw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
-MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
-MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
-b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
-2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
-1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
-q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
-tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
-vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
-BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
-5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
-1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
-NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
-Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
-8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
-pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
-MrY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFSzCCAzOgAwIBAgIRALZLiAfiI+7IXBKtpg4GofIwDQYJKoZIhvcNAQELBQAw
-PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eTAeFw0xMjA5MjgwODU4NTFaFw0zNzEyMzExNTU5NTla
-MD8xCzAJBgNVBAYTAlRXMTAwLgYDVQQKDCdHb3Zlcm5tZW50IFJvb3QgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQC2/5c8gb4BWCQnr44BK9ZykjAyG1+bfNTUf+ihYHMwVxAA+lCWJP5Q5ow6ldFX
-eYTVZ1MMKoI+GFy4MCYa1l7GLbIEUQ7v3wxjR+vEEghRK5lxXtVpe+FdyXcdIOxW
-juVhYC386RyA3/pqg7sFtR4jEpyCygrzFB0g5AaPQySZn7YKk1pzGxY5vgW28Yyl
-ZJKPBeRcdvc5w88tvQ7Yy6gOMZvJRg9nU0MEj8iyyIOAX7ryD6uBNaIgIZfOD4k0
-eA/PH07p+4woPN405+2f0mb1xcoxeNLOUNFggmOd4Ez3B66DNJ1JSUPUfr0t4urH
-cWWACOQ2nnlwCjyHKenkkpTqBpIpJ3jmrdc96QoLXvTg1oadLXLLi2RW5vSueKWg
-OTNYPNyoj420ai39iHPplVBzBN8RiD5C1gJ0+yzEb7xs1uCAb9GGpTJXA9ZN9E4K
-mSJ2fkpAgvjJ5E7LUy3Hsbbi08J1J265DnGyNPy/HE7CPfg26QrMWJqhGIZO4uGq
-s3NZbl6dtMIIr69c/aQCb/+4DbvVq9dunxpPkUDwH0ZVbaCSw4nNt7H/HLPLo5wK
-4/7NqrwB7N1UypHdTxOHpPaY7/1J1lcqPKZc9mA3v9g+fk5oKiMyOr5u5CI9ByTP
-isubXVGzMNJxbc5Gim18SjNE2hIvNkvy6fFRCW3bapcOFwIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBTVZx3gnHosnMvFmOcdByYqhux0zTAOBgNV
-HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAJA75cJTQijq9TFOjj2Rnk0J
-89ixUuZPrAwxIbvx6pnMg/y2KOTshAcOD06Xu29oRo8OURWV+Do7H1+CDgxxDryR
-T64zLiNB9CZrTxOH+nj2LsIPkQWXqmrBap+8hJ4IKifd2ocXhuGzyl3tOKkpboTe
-Rmv8JxlQpRJ6jH1i/NrnzLyfSa8GuCcn8on3Fj0Y5r3e9YwSkZ/jBI3+BxQaWqw5
-ghvxOBnhY+OvbLamURfr+kvriyL2l/4QOl+UoEtTcT9a4RD4co+WgN2NApgAYT2N
-vC2xR8zaXeEgp4wxXPHj2rkKhkfIoT0Hozymc26Uke1uJDr5yTDRB6iBfSZ9fYTf
-hsmL5a4NHr6JSFEVg5iWL0rrczTXdM3Jb9DCuiv2mv6Z3WAUjhv5nDk8f0OJU+jl
-wqu+Iq0nOJt3KLejY2OngeepaUXrjnhWzAWEx/uttjB8YwWfLYwkf0uLkvw4Hp+g
-pVezbp3YZLhwmmBScMip0P/GnO0QYV7Ngw5u6E0CQUridgR51lQ/ipgyFKDdLZzn
-uoJxo4ZVKZnSKdt1OvfbQ/+2W/u3fjWAjg1srnm3Ni2XUqGwB5wH5Ss2zQOXlL0t
-DjQG/MAWifw3VOTWzz0TBPKR2ck2Lj7FWtClTILD/y58Jnb38/1FoqVuVa4uzM8s
-iTTa9g3nkagQ6hed8vbs
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
-VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
-cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
-BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
-VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
-0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
-ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
-A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
-aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
-flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
-MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
-Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow
-TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
-HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
-BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr
-6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV
-L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91
-1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx
-MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ
-QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB
-arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr
-Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi
-FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS
-P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN
-9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP
-AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz
-uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h
-9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
-A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t
-OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo
-+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7
-KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2
-DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us
-H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ
-I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7
-5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h
-3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz
-Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV
-BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
-MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy
-MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
-EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw
-ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk
-D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o
-OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A
-fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe
-IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n
-oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK
-/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj
-rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD
-3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE
-7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC
-yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd
-qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
-DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI
-hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
-xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA
-SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo
-HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB
-emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC
-AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb
-7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x
-DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk
-F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF
-a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT
-Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID9jCCAt6gAwIBAgIQJDJ18h0v0gkz97RqytDzmDANBgkqhkiG9w0BAQsFADCB
-lDELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8w
-HQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMUUwQwYDVQQDEzxTeW1hbnRl
-YyBDbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-IC0gRzYwHhcNMTExMDE4MDAwMDAwWhcNMzcxMjAxMjM1OTU5WjCBlDELMAkGA1UE
-BhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZT
-eW1hbnRlYyBUcnVzdCBOZXR3b3JrMUUwQwYDVQQDEzxTeW1hbnRlYyBDbGFzcyAx
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzYwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDHOddJZKmZgiJM6kXZBxbje/SD
-6Jlz+muxNuCad6BAwoGNAcfMjL2Pffd543pMA03Z+/2HOCgs3ZqLVAjbZ/sbjP4o
-ki++t7JIp4Gh2F6Iw8w5QEFa0dzl2hCfL9oBTf0uRnz5LicKaTfukaMbasxEvxvH
-w9QRslBglwm9LiL1QYRmn81ApqkAgMEflZKf3vNI79sdd2H8f9/ulqRy0LY+/3gn
-r8uSFWkI22MQ4uaXrG7crPaizh5HmbmJtxLmodTNWRFnw2+F2EJOKL5ZVVkElauP
-N4C/DfD8HzpkMViBeNfiNfYgPym4jxZuPkjctUwH4fIa6n4KedaovetdhitNAgMB
-AAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
-BBQzQejIORIVk0jyljIuWvXalF9TYDANBgkqhkiG9w0BAQsFAAOCAQEAFeNzV7EX
-tl9JaUSm9l56Z6zS3nVJq/4lVcc6yUQVEG6/MWvL2QeTfxyFYwDjMhLgzMv7OWyP
-4lPiPEAz2aSMR+atWPuJr+PehilWNCxFuBL6RIluLRQlKCQBZdbqUqwFblYSCT3Q
-dPTXvQbKqDqNVkL6jXI+dPEDct+HG14OelWWLDi3mIXNTTNEyZSPWjEwN0ujOhKz
-5zbRIWhLLTjmU64cJVYIVgNnhJ3Gw84kYsdMNs+wBkS39V8C3dlU6S+QTnrIToNA
-DJqXPDe/v+z28LSFdyjBC8hnghAXOKK3Buqbvzr46SMHv3TgmDgVVXjucgBcGaP0
-0jPg/73RVDkpDw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV
-BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
-MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy
-MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
-EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw
-ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe
-NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH
-PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I
-x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe
-QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR
-yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO
-QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912
-H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ
-QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD
-i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs
-nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1
-rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
-DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI
-hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
-tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf
-GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb
-lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka
-+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal
-TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i
-nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3
-gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr
-G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os
-zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x
-L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
-MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
-YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
-MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
-ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
-MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
-ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
-PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
-wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
-EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
-avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
-YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
-sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
-/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
-IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
-ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
-OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
-TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
-HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
-dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
-ReYNnyicsbkqWletNw+vHX/bvZ8=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGjCCAwKgAwIBAgIDAYagMA0GCSqGSIb3DQEBBQUAMIGjMQswCQYDVQQGEwJG
-STEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0ZXJpa2Vz
-a3VzIENBMSkwJwYDVQQLEyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBTZXJ2aWNl
-czEZMBcGA1UECxMQVmFybWVubmVwYWx2ZWx1dDEZMBcGA1UEAxMQVlJLIEdvdi4g
-Um9vdCBDQTAeFw0wMjEyMTgxMzUzMDBaFw0yMzEyMTgxMzUxMDhaMIGjMQswCQYD
-VQQGEwJGSTEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0
-ZXJpa2Vza3VzIENBMSkwJwYDVQQLEyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBT
-ZXJ2aWNlczEZMBcGA1UECxMQVmFybWVubmVwYWx2ZWx1dDEZMBcGA1UEAxMQVlJL
-IEdvdi4gUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALCF
-FdrIAzfQo0Y3bBseljDCWoUSZyPyu5/nioFgJ/gTqTy894aqqvTzJSm0/nWuHoGG
-igWyHWWyOOi0zCia+xc28ZPVec7Bg4shT8MNrUHfeJ1I4x9CRPw8bSEga60ihCRC
-jxdNwlAfZM0tOSJWiP2yY51U2kJpwMhP1xjiPshphJQ9LIDGfM6911Mf64i5psu7
-hVfvV3ZdDIvTXhJBnyHAOfQmbQj6OLOhd7HuFtjQaNq0mKWgZUZKa41+qk1guPjI
-DfxxPu45h4G02fhukO4/DmHXHSto5i7hQkQmeCxY8n0Wf2HASSQqiYe2XS8pGfim
-545SnkFLWg6quMJmQlMCAwEAAaNVMFMwDwYDVR0TAQH/BAUwAwEB/zARBglghkgB
-hvhCAQEEBAMCAAcwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBTb6eGb0tEkC/yr
-46Bn6q6cS3f0sDANBgkqhkiG9w0BAQUFAAOCAQEArX1ID1QRnljurw2bEi8hpM2b
-uoRH5sklVSPj3xhYKizbXvfNVPVRJHtiZ+GxH0mvNNDrsczZog1Sf0JLiGCXzyVy
-t08pLWKfT6HAVVdWDsRol5EfnGTCKTIB6dTI2riBmCguGMcs/OubUpbf9MiQGS0j
-8/G7cdqehSO9Gu8u5Hp5t8OdhkktY7ktdM9lDzJmid87Ie4pbzlj2RXBbvbfgD5Q
-eBmK3QOjFKU3p7UsfLYRh+cF8ry23tT/l4EohP7+bEaFEEGfTXWMB9SZZ291im/k
-UJL2mdUQuMSpe/cXjUu/15WfCdxEDx4yw8DP03kN5Mc7h/CQNIghYkmSBAQfvA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO
-TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy
-MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk
-ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn
-ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71
-9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO
-hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U
-tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o
-BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh
-SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww
-OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv
-cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA
-7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k
-/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm
-eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6
-u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy
-7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
-iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
-MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
-U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
-DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
-dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
-YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
-OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
-zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
-VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
-hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
-ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
-awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
-OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
-DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
-coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
-okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
-t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
-1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
-SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU
-MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
-b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1
-MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK
-EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh
-BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq
-xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G
-87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i
-2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U
-WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1
-0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G
-A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T
-AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr
-pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
-ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm
-aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv
-hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm
-hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
-dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3
-P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y
-iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no
-xqE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
-RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
-bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
-IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy
-MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
-LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
-YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
-A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
-K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
-sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
-MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
-XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
-HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
-4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA
-vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G
-CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA
-WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
-oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ
-h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18
-f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN
-B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy
-vUxFnmG6v4SBkgPR0ml8xQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFkjCCA3qgAwIBAgIIAeDltYNno+AwDQYJKoZIhvcNAQEMBQAwZzEbMBkGA1UE
-AwwSQXBwbGUgUm9vdCBDQSAtIEcyMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMw
-HhcNMTQwNDMwMTgxMDA5WhcNMzkwNDMwMTgxMDA5WjBnMRswGQYDVQQDDBJBcHBs
-ZSBSb290IENBIC0gRzIxJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzCCAiIwDQYJ
-KoZIhvcNAQEBBQADggIPADCCAgoCggIBANgREkhI2imKScUcx+xuM23+TfvgHN6s
-XuI2pyT5f1BrTM65MFQn5bPW7SXmMLYFN14UIhHF6Kob0vuy0gmVOKTvKkmMXT5x
-ZgM4+xb1hYjkWpIMBDLyyED7Ul+f9sDx47pFoFDVEovy3d6RhiPw9bZyLgHaC/Yu
-OQhfGaFjQQscp5TBhsRTL3b2CtcM0YM/GlMZ81fVJ3/8E7j4ko380yhDPLVoACVd
-J2LT3VXdRCCQgzWTxb+4Gftr49wIQuavbfqeQMpOhYV4SbHXw8EwOTKrfl+q04tv
-ny0aIWhwZ7Oj8ZhBbZF8+NfbqOdfIRqMM78xdLe40fTgIvS/cjTf94FNcX1RoeKz
-8NMoFnNvzcytN31O661A4T+B/fc9Cj6i8b0xlilZ3MIZgIxbdMYs0xBTJh0UT8TU
-gWY8h2czJxQI6bR3hDRSj4n4aJgXv8O7qhOTH11UL6jHfPsNFL4VPSQ08prcdUFm
-IrQB1guvkJ4M6mL4m1k8COKWNORj3rw31OsMiANDC1CvoDTdUE0V+1ok2Az6DGOe
-HwOx4e7hqkP0ZmUoNwIx7wHHHtHMn23KVDpA287PT0aLSmWaasZobNfMmRtHsHLD
-d4/E92GcdB/O/WuhwpyUgquUoue9G7q5cDmVF8Up8zlYNPXEpMZ7YLlmQ1A/bmH8
-DvmGqmAMQ0uVAgMBAAGjQjBAMB0GA1UdDgQWBBTEmRNsGAPCe8CjoA1/coB6HHcm
-jTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQwF
-AAOCAgEAUabz4vS4PZO/Lc4Pu1vhVRROTtHlznldgX/+tvCHM/jvlOV+3Gp5pxy+
-8JS3ptEwnMgNCnWefZKVfhidfsJxaXwU6s+DDuQUQp50DhDNqxq6EWGBeNjxtUVA
-eKuowM77fWM3aPbn+6/Gw0vsHzYmE1SGlHKy6gLti23kDKaQwFd1z4xCfVzmMX3z
-ybKSaUYOiPjjLUKyOKimGY3xn83uamW8GrAlvacp/fQ+onVJv57byfenHmOZ4VxG
-/5IFjPoeIPmGlFYl5bRXOJ3riGQUIUkhOb9iZqmxospvPyFgxYnURTbImHy99v6Z
-SYA7LNKmp4gDBDEZt7Y6YUX6yfIjyGNzv1aJMbDZfGKnexWoiIqrOEDCzBL/FePw
-N983csvMmOa/orz6JopxVtfnJBtIRD6e/J/JzBrsQzwBvDR4yGn1xuZW7AYJNpDr
-FEobXsmII9oDMJELuDY++ee1KG++P+w8j2Ud5cAeh6Squpj9kuNsJnfdBrRkBof0
-Tta6SqoWqPQFZ2aWuuJVecMsXUmPgEkrihLHdoBR37q9ZV0+N0djMenl9MU/S60E
-inpxLK8JQzcPqOMyT/RFtm2XNuyE9QoB6he7hY1Ck3DDUOUUi78/w0EP3SIEIwiK
-um1xRKtzCTrJ+VKACd+66eYWyi4uTLLT3OUEVLLUNIAytbwPF+E=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDtDCCApygAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJKUDEc
-MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEOMAwGA1UECxMFTVBIUFQxJjAk
-BgNVBAsTHU1QSFBUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTAyMDMxNDA3
-NTAyNloXDTEyMDMxMzE0NTk1OVowYzELMAkGA1UEBhMCSlAxHDAaBgNVBAoTE0ph
-cGFuZXNlIEdvdmVybm1lbnQxDjAMBgNVBAsTBU1QSFBUMSYwJAYDVQQLEx1NUEhQ
-VCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAI3GUWlK9G9FVm8DhpKu5t37oxZbj6lZcFvEZY07YrYojWO657ub
-z56WE7q/PI/6Sm7i7qYE+Vp80r6thJvfmn7SS3BENrRqiapSenhooYD12jIe3iZQ
-2SXqx7WgYwyBGdQwGaYTijzbRFpgc0K8o4a99fIoHhz9J8AKqXasddMCqfJRaH30
-YJ7HnOvRYGL6HBrGhJ7X4Rzijyk9a9+3VOBsYcnIlx9iODoiYhA6r0ojuIu8/JA1
-oTTZrS0MyU/SLdFdJze2O1wnqTULXQybzJz3ad6oC/F5a69c0m92akYd9nGBrPxj
-EhucaQynC/QoCLs3aciLgioAnEJqy7i3EgUCAwEAAaNzMHEwHwYDVR0jBBgwFoAU
-YML3pLoA0h93Yngl8Gb/UgAh73owHQYDVR0OBBYEFGDC96S6ANIfd2J4JfBm/1IA
-Ie96MAwGA1UdEwQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQE
-AwIABTANBgkqhkiG9w0BAQUFAAOCAQEANPR8DN66iWZBs/lSm1vOzhqRkXDLT6xL
-LvJtjPLqmE469szGyFSKzsof6y+/8YgZlOoeX1inF4ox/SH1ATnwdIIsPbXuRLjt
-axboXvBh5y2ffC3hmzJVvJ87tb6mVWQeL9VFUhNhAI0ib+9OIZVEYI/64MFkDk4e
-iWG5ts6oqIJH1V7dVZg6pQ1Tc0Ckhn6N1m1hD30S0/zoPn/20Wq6OCF3he8VJrRG
-dcW9BD/Bkesko1HKhMBDjHVrJ8cFwbnDSoo+Ki47eJWaz/cOzaSsaMVUsR5POava
-/abhhgHn/eOJdXiVslyK0DYscjsdB3aBUfwZlomxYOzG6CgjQPhJdw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID9zCCAt+gAwIBAgILMTI1MzcyODI4MjgwDQYJKoZIhvcNAQELBQAwWDELMAkG
-A1UEBhMCSlAxHDAaBgNVBAoTE0phcGFuZXNlIEdvdmVybm1lbnQxDTALBgNVBAsT
-BEdQS0kxHDAaBgNVBAMTE0FwcGxpY2F0aW9uQ0EyIFJvb3QwHhcNMTMwMzEyMTUw
-MDAwWhcNMzMwMzEyMTUwMDAwWjBYMQswCQYDVQQGEwJKUDEcMBoGA1UEChMTSmFw
-YW5lc2UgR292ZXJubWVudDENMAsGA1UECxMER1BLSTEcMBoGA1UEAxMTQXBwbGlj
-YXRpb25DQTIgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKaq
-rSVl1gAR1uh6dqr05rRL88zDUrSNrKZPtZJxb0a11a2LEiIXJc5F6BR6hZrkIxCo
-+rFnUOVtR+BqiRPjrq418fRCxQX3TZd+PCj8sCaRHoweOBqW3FhEl2LjMsjRFUFN
-dZh4vqtoqV7tR76kuo6hApfek3SZbWe0BSXulMjtqqS6MmxCEeu+yxcGkOGThchk
-KM4fR8fAXWDudjbcMztR63vPctgPeKgZggiQPhqYjY60zxU2pm7dt+JNQCBT2XYq
-0HisifBPizJtROouurCp64ndt295D6uBbrjmiykLWa+2SQ1RLKn9nShjZrhwlXOa
-2Po7M7xCQhsyrLEy+z0CAwEAAaOBwTCBvjAdBgNVHQ4EFgQUVqesqgIdsqw9kA6g
-by5Bxnbne9owDgYDVR0PAQH/BAQDAgEGMHwGA1UdEQR1MHOkcTBvMQswCQYDVQQG
-EwJKUDEYMBYGA1UECgwP5pel5pys5Zu95pS/5bqcMRswGQYDVQQLDBLmlL/lupzo
-qo3oqLzln7rnm6QxKTAnBgNVBAMMIOOCouODl+ODquOCseODvOOCt+ODp+ODs0NB
-MiBSb290MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAH+aCXWs
-B9FydC53VzDCBJzUgKaD56WgG5/+q/OAvdVKo6GPtkxgEefK4WCB10jBIFmlYTKL
-nZ6X02aD2mUuWD7b5S+lzYxzplG+WCigeVxpL0PfY7KJR8q73rk0EWOgDiUX5Yf0
-HbCwpc9BqHTG6FPVQvSCLVMJEWgmcZR1E02qdog8dLHW40xPYsNJTE5t8XB+w3+m
-Bcx4m+mB26jIx1ye/JKSLaaX8ji1bnOVDMA/zqaUMLX6BbfeniCq/BNkyYq6ZO/i
-Y+TYmK5rtT6mVbgzPixy+ywRAPtbFi+E0hOe+gXFwctyTiLdhMpLvNIthhoEdlkf
-SUJiOxMfFui61/0=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
-UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
-dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
-MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
-dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
-AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
-BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
-cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
-AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
-MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
-aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
-ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
-IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
-MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
-A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
-7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
-1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
-MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
-KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
-MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
-BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
-NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
-BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
-MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
-So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
-tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
-BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
-CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
-qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
-rD6ogRLQy7rQkgu2npaqBA+K
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO
-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y
-MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg
-TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS
-b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS
-M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC
-UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d
-Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p
-rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l
-pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb
-j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC
-KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS
-/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X
-cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH
-1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP
-px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
-/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7
-MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
-eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u
-2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS
-v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC
-wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy
-CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e
-vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6
-Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa
-Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL
-eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8
-FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc
-7uzXLg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
-MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
-IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
-IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
-RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
-U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
-IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
-ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
-QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
-rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
-NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
-QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
-txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
-BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
-AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
-tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
-IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
-6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
-xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
-Cm26OWMohpLzGITY+9HPBVZkVw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV
-BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC
-aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV
-BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1
-Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz
-MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+
-BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp
-em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
-ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY
-B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH
-D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF
-Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo
-q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D
-k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH
-fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut
-dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM
-ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8
-zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
-rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX
-U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6
-Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5
-XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF
-Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR
-HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY
-GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c
-77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3
-+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK
-vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6
-FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl
-yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P
-AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD
-y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d
-NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDtTCCAp2gAwIBAgIIBhDCeat3PfIwDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UE
-BhMCQ0gxEjAQBgNVBAoTCVN3aXNzU2lnbjEyMDAGA1UEAxMpU3dpc3NTaWduIENB
-IChSU0EgSUsgTWF5IDYgMTk5OSAxODowMDo1OCkxHzAdBgkqhkiG9w0BCQEWEGNh
-QFN3aXNzU2lnbi5jb20wHhcNMDAxMTI2MjMyNzQxWhcNMzExMTI2MjMyNzQxWjB2
-MQswCQYDVQQGEwJDSDESMBAGA1UEChMJU3dpc3NTaWduMTIwMAYDVQQDEylTd2lz
-c1NpZ24gQ0EgKFJTQSBJSyBNYXkgNiAxOTk5IDE4OjAwOjU4KTEfMB0GCSqGSIb3
-DQEJARYQY2FAU3dpc3NTaWduLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAKw5fjnmNneLQlUCQG8jQLwwfbrOZoUwNX8cbNqhxK03/xUloFVgAt+S
-Te2RxNXaCAXLBPn5ZST35TLV57aLmbHCtifv3YZqaaQGvjedltIBMJihJhZ+h3LY
-SKsUb+xEJ3x5ZUf8jP+Q1g57y1s8SnBFWN/ni5NkF1Y1y31VwOi9wiOf/VISL+uu
-SC4i1CP1Kbz3BDs6Hht1GpRYCbJ/K0bc9oJSpWpT5PGONsGIawqMbJuyoDghsXQ1
-pbn2e8K64BSscGZVZTNooSGgNiHmACNJBYXiWVWrwXPF4l6SddmC3Rj0aKXjgECc
-FkHLDQcsM5JsK2ZLryTDUsQFbxVP2ikCAwEAAaNHMEUwCwYDVR0PBAQDAgEGMAwG
-A1UdEwQFMAMBAf8wHQYDVR0OBBYEFJbXcc05KtT8iLGKq1N4ae+PR34WMAkGA1Ud
-IwQCMAAwDQYJKoZIhvcNAQEFBQADggEBAKMy6W8HvZdS1fBpEUzl6Lvw50bgE1Xc
-HU1JypSBG9mhdcXZo5AlPB4sCvx9Dmfwhyrdsshc0TP2V3Vh6eQqnEF5qB4lVziT
-Bko9mW6Ot+pPnwsy4SHpx3rw6jCYnOqfUcZjWqqqRrq/3P1waz+Mn4cLMVEg3Xaz
-qYov/khvSqS0JniwjRlo2H6f/1oVUKZvP+dUhpQepfZrOqMAWZW4otp6FolyQyeU
-NN6UCRNiUKl5vTijbKwUUwfER/1Vci3M1/O1QCfttQ4vRN4Buc0xqYtGL3cd5WiO
-vWzyhlTzAI6VUdNkQhhHJSAyTpj6dmXDRzrryoFGa2PjgESxz7XBaSI=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF
-MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL
-ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx
-MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc
-MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+
-AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH
-iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj
-vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA
-0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB
-OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/
-BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E
-FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01
-GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW
-zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4
-1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE
-f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F
-jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
-ZetX2fNXlrtIzYE=
------END CERTIFICATE-----
-`
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/root_linux.go b/third_party/gofrontend/libgo/go/crypto/x509/root_linux.go
deleted file mode 100644
index cfeca69..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/root_linux.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-// Possible certificate files; stop after finding one.
-var certFiles = []string{
-	"/etc/ssl/certs/ca-certificates.crt", // Debian/Ubuntu/Gentoo etc.
-	"/etc/pki/tls/certs/ca-bundle.crt",   // Fedora/RHEL
-	"/etc/ssl/ca-bundle.pem",             // OpenSUSE
-	"/etc/pki/tls/cacert.pem",            // OpenELEC
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/root_nacl.go b/third_party/gofrontend/libgo/go/crypto/x509/root_nacl.go
deleted file mode 100644
index 4413f64..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/root_nacl.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-// Possible certificate files; stop after finding one.
-var certFiles = []string{}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/root_nocgo_darwin.go b/third_party/gofrontend/libgo/go/crypto/x509/root_nocgo_darwin.go
deleted file mode 100644
index d00e257..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/root_nocgo_darwin.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !cgo
-
-package x509
-
-func initSystemRoots() {
-	systemRoots, _ = execSecurityRoots()
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/root_plan9.go b/third_party/gofrontend/libgo/go/crypto/x509/root_plan9.go
deleted file mode 100644
index 9965caa..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/root_plan9.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build plan9
-
-package x509
-
-import "io/ioutil"
-
-// Possible certificate files; stop after finding one.
-var certFiles = []string{
-	"/sys/lib/tls/ca.pem",
-}
-
-func (c *Certificate) systemVerify(opts *VerifyOptions) (chains [][]*Certificate, err error) {
-	return nil, nil
-}
-
-func initSystemRoots() {
-	roots := NewCertPool()
-	for _, file := range certFiles {
-		data, err := ioutil.ReadFile(file)
-		if err == nil {
-			roots.AppendCertsFromPEM(data)
-			systemRoots = roots
-			return
-		}
-	}
-
-	// All of the files failed to load. systemRoots will be nil which will
-	// trigger a specific error at verification time.
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/root_solaris.go b/third_party/gofrontend/libgo/go/crypto/x509/root_solaris.go
deleted file mode 100644
index e6d4e61..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/root_solaris.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-// Possible certificate files; stop after finding one.
-var certFiles = []string{
-	"/etc/certs/ca-certificates.crt",     // Solaris 11.2+
-	"/etc/ssl/certs/ca-certificates.crt", // Joyent SmartOS
-	"/etc/ssl/cacert.pem",                // OmniOS
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/root_unix.go b/third_party/gofrontend/libgo/go/crypto/x509/root_unix.go
deleted file mode 100644
index 8d3b2fb..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/root_unix.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package x509
-
-import "io/ioutil"
-
-// Possible directories with certificate files; stop after successfully
-// reading at least one file from a directory.
-var certDirectories = []string{
-	"/system/etc/security/cacerts", // Android
-}
-
-func (c *Certificate) systemVerify(opts *VerifyOptions) (chains [][]*Certificate, err error) {
-	return nil, nil
-}
-
-func initSystemRoots() {
-	roots := NewCertPool()
-	for _, file := range certFiles {
-		data, err := ioutil.ReadFile(file)
-		if err == nil {
-			roots.AppendCertsFromPEM(data)
-			systemRoots = roots
-			return
-		}
-	}
-
-	for _, directory := range certDirectories {
-		fis, err := ioutil.ReadDir(directory)
-		if err != nil {
-			continue
-		}
-		rootsAdded := false
-		for _, fi := range fis {
-			data, err := ioutil.ReadFile(directory + "/" + fi.Name())
-			if err == nil && roots.AppendCertsFromPEM(data) {
-				rootsAdded = true
-			}
-		}
-		if rootsAdded {
-			systemRoots = roots
-			return
-		}
-	}
-
-	// All of the files failed to load. systemRoots will be nil which will
-	// trigger a specific error at verification time.
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/root_windows.go b/third_party/gofrontend/libgo/go/crypto/x509/root_windows.go
deleted file mode 100644
index 81018b7..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/root_windows.go
+++ /dev/null
@@ -1,229 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-import (
-	"errors"
-	"syscall"
-	"unsafe"
-)
-
-// Creates a new *syscall.CertContext representing the leaf certificate in an in-memory
-// certificate store containing itself and all of the intermediate certificates specified
-// in the opts.Intermediates CertPool.
-//
-// A pointer to the in-memory store is available in the returned CertContext's Store field.
-// The store is automatically freed when the CertContext is freed using
-// syscall.CertFreeCertificateContext.
-func createStoreContext(leaf *Certificate, opts *VerifyOptions) (*syscall.CertContext, error) {
-	var storeCtx *syscall.CertContext
-
-	leafCtx, err := syscall.CertCreateCertificateContext(syscall.X509_ASN_ENCODING|syscall.PKCS_7_ASN_ENCODING, &leaf.Raw[0], uint32(len(leaf.Raw)))
-	if err != nil {
-		return nil, err
-	}
-	defer syscall.CertFreeCertificateContext(leafCtx)
-
-	handle, err := syscall.CertOpenStore(syscall.CERT_STORE_PROV_MEMORY, 0, 0, syscall.CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG, 0)
-	if err != nil {
-		return nil, err
-	}
-	defer syscall.CertCloseStore(handle, 0)
-
-	err = syscall.CertAddCertificateContextToStore(handle, leafCtx, syscall.CERT_STORE_ADD_ALWAYS, &storeCtx)
-	if err != nil {
-		return nil, err
-	}
-
-	if opts.Intermediates != nil {
-		for _, intermediate := range opts.Intermediates.certs {
-			ctx, err := syscall.CertCreateCertificateContext(syscall.X509_ASN_ENCODING|syscall.PKCS_7_ASN_ENCODING, &intermediate.Raw[0], uint32(len(intermediate.Raw)))
-			if err != nil {
-				return nil, err
-			}
-
-			err = syscall.CertAddCertificateContextToStore(handle, ctx, syscall.CERT_STORE_ADD_ALWAYS, nil)
-			syscall.CertFreeCertificateContext(ctx)
-			if err != nil {
-				return nil, err
-			}
-		}
-	}
-
-	return storeCtx, nil
-}
-
-// extractSimpleChain extracts the final certificate chain from a CertSimpleChain.
-func extractSimpleChain(simpleChain **syscall.CertSimpleChain, count int) (chain []*Certificate, err error) {
-	if simpleChain == nil || count == 0 {
-		return nil, errors.New("x509: invalid simple chain")
-	}
-
-	simpleChains := (*[1 << 20]*syscall.CertSimpleChain)(unsafe.Pointer(simpleChain))[:]
-	lastChain := simpleChains[count-1]
-	elements := (*[1 << 20]*syscall.CertChainElement)(unsafe.Pointer(lastChain.Elements))[:]
-	for i := 0; i < int(lastChain.NumElements); i++ {
-		// Copy the buf, since ParseCertificate does not create its own copy.
-		cert := elements[i].CertContext
-		encodedCert := (*[1 << 20]byte)(unsafe.Pointer(cert.EncodedCert))[:]
-		buf := make([]byte, cert.Length)
-		copy(buf, encodedCert[:])
-		parsedCert, err := ParseCertificate(buf)
-		if err != nil {
-			return nil, err
-		}
-		chain = append(chain, parsedCert)
-	}
-
-	return chain, nil
-}
-
-// checkChainTrustStatus checks the trust status of the certificate chain, translating
-// any errors it finds into Go errors in the process.
-func checkChainTrustStatus(c *Certificate, chainCtx *syscall.CertChainContext) error {
-	if chainCtx.TrustStatus.ErrorStatus != syscall.CERT_TRUST_NO_ERROR {
-		status := chainCtx.TrustStatus.ErrorStatus
-		switch status {
-		case syscall.CERT_TRUST_IS_NOT_TIME_VALID:
-			return CertificateInvalidError{c, Expired}
-		default:
-			return UnknownAuthorityError{c, nil, nil}
-		}
-	}
-	return nil
-}
-
-// checkChainSSLServerPolicy checks that the certificate chain in chainCtx is valid for
-// use as a certificate chain for a SSL/TLS server.
-func checkChainSSLServerPolicy(c *Certificate, chainCtx *syscall.CertChainContext, opts *VerifyOptions) error {
-	servernamep, err := syscall.UTF16PtrFromString(opts.DNSName)
-	if err != nil {
-		return err
-	}
-	sslPara := &syscall.SSLExtraCertChainPolicyPara{
-		AuthType:   syscall.AUTHTYPE_SERVER,
-		ServerName: servernamep,
-	}
-	sslPara.Size = uint32(unsafe.Sizeof(*sslPara))
-
-	para := &syscall.CertChainPolicyPara{
-		ExtraPolicyPara: uintptr(unsafe.Pointer(sslPara)),
-	}
-	para.Size = uint32(unsafe.Sizeof(*para))
-
-	status := syscall.CertChainPolicyStatus{}
-	err = syscall.CertVerifyCertificateChainPolicy(syscall.CERT_CHAIN_POLICY_SSL, chainCtx, para, &status)
-	if err != nil {
-		return err
-	}
-
-	// TODO(mkrautz): use the lChainIndex and lElementIndex fields
-	// of the CertChainPolicyStatus to provide proper context, instead
-	// using c.
-	if status.Error != 0 {
-		switch status.Error {
-		case syscall.CERT_E_EXPIRED:
-			return CertificateInvalidError{c, Expired}
-		case syscall.CERT_E_CN_NO_MATCH:
-			return HostnameError{c, opts.DNSName}
-		case syscall.CERT_E_UNTRUSTEDROOT:
-			return UnknownAuthorityError{c, nil, nil}
-		default:
-			return UnknownAuthorityError{c, nil, nil}
-		}
-	}
-
-	return nil
-}
-
-// systemVerify is like Verify, except that it uses CryptoAPI calls
-// to build certificate chains and verify them.
-func (c *Certificate) systemVerify(opts *VerifyOptions) (chains [][]*Certificate, err error) {
-	hasDNSName := opts != nil && len(opts.DNSName) > 0
-
-	storeCtx, err := createStoreContext(c, opts)
-	if err != nil {
-		return nil, err
-	}
-	defer syscall.CertFreeCertificateContext(storeCtx)
-
-	para := new(syscall.CertChainPara)
-	para.Size = uint32(unsafe.Sizeof(*para))
-
-	// If there's a DNSName set in opts, assume we're verifying
-	// a certificate from a TLS server.
-	if hasDNSName {
-		oids := []*byte{
-			&syscall.OID_PKIX_KP_SERVER_AUTH[0],
-			// Both IE and Chrome allow certificates with
-			// Server Gated Crypto as well. Some certificates
-			// in the wild require them.
-			&syscall.OID_SERVER_GATED_CRYPTO[0],
-			&syscall.OID_SGC_NETSCAPE[0],
-		}
-		para.RequestedUsage.Type = syscall.USAGE_MATCH_TYPE_OR
-		para.RequestedUsage.Usage.Length = uint32(len(oids))
-		para.RequestedUsage.Usage.UsageIdentifiers = &oids[0]
-	} else {
-		para.RequestedUsage.Type = syscall.USAGE_MATCH_TYPE_AND
-		para.RequestedUsage.Usage.Length = 0
-		para.RequestedUsage.Usage.UsageIdentifiers = nil
-	}
-
-	var verifyTime *syscall.Filetime
-	if opts != nil && !opts.CurrentTime.IsZero() {
-		ft := syscall.NsecToFiletime(opts.CurrentTime.UnixNano())
-		verifyTime = &ft
-	}
-
-	// CertGetCertificateChain will traverse Windows's root stores
-	// in an attempt to build a verified certificate chain.  Once
-	// it has found a verified chain, it stops. MSDN docs on
-	// CERT_CHAIN_CONTEXT:
-	//
-	//   When a CERT_CHAIN_CONTEXT is built, the first simple chain
-	//   begins with an end certificate and ends with a self-signed
-	//   certificate. If that self-signed certificate is not a root
-	//   or otherwise trusted certificate, an attempt is made to
-	//   build a new chain. CTLs are used to create the new chain
-	//   beginning with the self-signed certificate from the original
-	//   chain as the end certificate of the new chain. This process
-	//   continues building additional simple chains until the first
-	//   self-signed certificate is a trusted certificate or until
-	//   an additional simple chain cannot be built.
-	//
-	// The result is that we'll only get a single trusted chain to
-	// return to our caller.
-	var chainCtx *syscall.CertChainContext
-	err = syscall.CertGetCertificateChain(syscall.Handle(0), storeCtx, verifyTime, storeCtx.Store, para, 0, 0, &chainCtx)
-	if err != nil {
-		return nil, err
-	}
-	defer syscall.CertFreeCertificateChain(chainCtx)
-
-	err = checkChainTrustStatus(c, chainCtx)
-	if err != nil {
-		return nil, err
-	}
-
-	if hasDNSName {
-		err = checkChainSSLServerPolicy(c, chainCtx, opts)
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	chain, err := extractSimpleChain(chainCtx.Chains, int(chainCtx.ChainCount))
-	if err != nil {
-		return nil, err
-	}
-
-	chains = append(chains, chain)
-
-	return chains, nil
-}
-
-func initSystemRoots() {
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/sec1.go b/third_party/gofrontend/libgo/go/crypto/x509/sec1.go
deleted file mode 100644
index c4d7ab6..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/sec1.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-import (
-	"crypto/ecdsa"
-	"crypto/elliptic"
-	"encoding/asn1"
-	"errors"
-	"fmt"
-	"math/big"
-)
-
-const ecPrivKeyVersion = 1
-
-// ecPrivateKey reflects an ASN.1 Elliptic Curve Private Key Structure.
-// References:
-//   RFC5915
-//   SEC1 - http://www.secg.org/sec1-v2.pdf
-// Per RFC5915 the NamedCurveOID is marked as ASN.1 OPTIONAL, however in
-// most cases it is not.
-type ecPrivateKey struct {
-	Version       int
-	PrivateKey    []byte
-	NamedCurveOID asn1.ObjectIdentifier `asn1:"optional,explicit,tag:0"`
-	PublicKey     asn1.BitString        `asn1:"optional,explicit,tag:1"`
-}
-
-// ParseECPrivateKey parses an ASN.1 Elliptic Curve Private Key Structure.
-func ParseECPrivateKey(der []byte) (key *ecdsa.PrivateKey, err error) {
-	return parseECPrivateKey(nil, der)
-}
-
-// MarshalECPrivateKey marshals an EC private key into ASN.1, DER format.
-func MarshalECPrivateKey(key *ecdsa.PrivateKey) ([]byte, error) {
-	oid, ok := oidFromNamedCurve(key.Curve)
-	if !ok {
-		return nil, errors.New("x509: unknown elliptic curve")
-	}
-	return asn1.Marshal(ecPrivateKey{
-		Version:       1,
-		PrivateKey:    key.D.Bytes(),
-		NamedCurveOID: oid,
-		PublicKey:     asn1.BitString{Bytes: elliptic.Marshal(key.Curve, key.X, key.Y)},
-	})
-}
-
-// parseECPrivateKey parses an ASN.1 Elliptic Curve Private Key Structure.
-// The OID for the named curve may be provided from another source (such as
-// the PKCS8 container) - if it is provided then use this instead of the OID
-// that may exist in the EC private key structure.
-func parseECPrivateKey(namedCurveOID *asn1.ObjectIdentifier, der []byte) (key *ecdsa.PrivateKey, err error) {
-	var privKey ecPrivateKey
-	if _, err := asn1.Unmarshal(der, &privKey); err != nil {
-		return nil, errors.New("x509: failed to parse EC private key: " + err.Error())
-	}
-	if privKey.Version != ecPrivKeyVersion {
-		return nil, fmt.Errorf("x509: unknown EC private key version %d", privKey.Version)
-	}
-
-	var curve elliptic.Curve
-	if namedCurveOID != nil {
-		curve = namedCurveFromOID(*namedCurveOID)
-	} else {
-		curve = namedCurveFromOID(privKey.NamedCurveOID)
-	}
-	if curve == nil {
-		return nil, errors.New("x509: unknown elliptic curve")
-	}
-
-	k := new(big.Int).SetBytes(privKey.PrivateKey)
-	if k.Cmp(curve.Params().N) >= 0 {
-		return nil, errors.New("x509: invalid elliptic curve private key value")
-	}
-	priv := new(ecdsa.PrivateKey)
-	priv.Curve = curve
-	priv.D = k
-	priv.X, priv.Y = curve.ScalarBaseMult(privKey.PrivateKey)
-
-	return priv, nil
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/sec1_test.go b/third_party/gofrontend/libgo/go/crypto/x509/sec1_test.go
deleted file mode 100644
index 95f18e7..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/sec1_test.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-import (
-	"bytes"
-	"encoding/hex"
-	"testing"
-)
-
-// Generated using:
-//   openssl ecparam -genkey -name secp384r1 -outform PEM
-var ecPrivateKeyHex = `3081a40201010430bdb9839c08ee793d1157886a7a758a3c8b2a17a4df48f17ace57c72c56b4723cf21dcda21d4e1ad57ff034f19fcfd98ea00706052b81040022a16403620004feea808b5ee2429cfcce13c32160e1c960990bd050bb0fdf7222f3decd0a55008e32a6aa3c9062051c4cba92a7a3b178b24567412d43cdd2f882fa5addddd726fe3e208d2c26d733a773a597abb749714df7256ead5105fa6e7b3650de236b50`
-
-func TestParseECPrivateKey(t *testing.T) {
-	derBytes, _ := hex.DecodeString(ecPrivateKeyHex)
-	key, err := ParseECPrivateKey(derBytes)
-	if err != nil {
-		t.Errorf("failed to decode EC private key: %s", err)
-	}
-	serialized, err := MarshalECPrivateKey(key)
-	if err != nil {
-		t.Fatalf("failed to encode EC private key: %s", err)
-	}
-	if !bytes.Equal(serialized, derBytes) {
-		t.Fatalf("serialized key differs: got %x, want %x", serialized, derBytes)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/sha2_windows_test.go b/third_party/gofrontend/libgo/go/crypto/x509/sha2_windows_test.go
deleted file mode 100644
index 79dc685..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/sha2_windows_test.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-import "syscall"
-
-func init() {
-	v, err := syscall.GetVersion()
-	if err != nil {
-		return
-	}
-	if major := byte(v); major < 6 {
-		// Windows XP SP2 and Windows 2003 do not support SHA2.
-		// http://blogs.technet.com/b/pki/archive/2010/09/30/sha2-and-windows.aspx
-		supportSHA2 = false
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/verify.go b/third_party/gofrontend/libgo/go/crypto/x509/verify.go
deleted file mode 100644
index 21b870c..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/verify.go
+++ /dev/null
@@ -1,483 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-import (
-	"fmt"
-	"net"
-	"runtime"
-	"strings"
-	"time"
-	"unicode/utf8"
-)
-
-type InvalidReason int
-
-const (
-	// NotAuthorizedToSign results when a certificate is signed by another
-	// which isn't marked as a CA certificate.
-	NotAuthorizedToSign InvalidReason = iota
-	// Expired results when a certificate has expired, based on the time
-	// given in the VerifyOptions.
-	Expired
-	// CANotAuthorizedForThisName results when an intermediate or root
-	// certificate has a name constraint which doesn't include the name
-	// being checked.
-	CANotAuthorizedForThisName
-	// TooManyIntermediates results when a path length constraint is
-	// violated.
-	TooManyIntermediates
-	// IncompatibleUsage results when the certificate's key usage indicates
-	// that it may only be used for a different purpose.
-	IncompatibleUsage
-)
-
-// CertificateInvalidError results when an odd error occurs. Users of this
-// library probably want to handle all these errors uniformly.
-type CertificateInvalidError struct {
-	Cert   *Certificate
-	Reason InvalidReason
-}
-
-func (e CertificateInvalidError) Error() string {
-	switch e.Reason {
-	case NotAuthorizedToSign:
-		return "x509: certificate is not authorized to sign other certificates"
-	case Expired:
-		return "x509: certificate has expired or is not yet valid"
-	case CANotAuthorizedForThisName:
-		return "x509: a root or intermediate certificate is not authorized to sign in this domain"
-	case TooManyIntermediates:
-		return "x509: too many intermediates for path length constraint"
-	case IncompatibleUsage:
-		return "x509: certificate specifies an incompatible key usage"
-	}
-	return "x509: unknown error"
-}
-
-// HostnameError results when the set of authorized names doesn't match the
-// requested name.
-type HostnameError struct {
-	Certificate *Certificate
-	Host        string
-}
-
-func (h HostnameError) Error() string {
-	c := h.Certificate
-
-	var valid string
-	if ip := net.ParseIP(h.Host); ip != nil {
-		// Trying to validate an IP
-		if len(c.IPAddresses) == 0 {
-			return "x509: cannot validate certificate for " + h.Host + " because it doesn't contain any IP SANs"
-		}
-		for _, san := range c.IPAddresses {
-			if len(valid) > 0 {
-				valid += ", "
-			}
-			valid += san.String()
-		}
-	} else {
-		if len(c.DNSNames) > 0 {
-			valid = strings.Join(c.DNSNames, ", ")
-		} else {
-			valid = c.Subject.CommonName
-		}
-	}
-	return "x509: certificate is valid for " + valid + ", not " + h.Host
-}
-
-// UnknownAuthorityError results when the certificate issuer is unknown
-type UnknownAuthorityError struct {
-	cert *Certificate
-	// hintErr contains an error that may be helpful in determining why an
-	// authority wasn't found.
-	hintErr error
-	// hintCert contains a possible authority certificate that was rejected
-	// because of the error in hintErr.
-	hintCert *Certificate
-}
-
-func (e UnknownAuthorityError) Error() string {
-	s := "x509: certificate signed by unknown authority"
-	if e.hintErr != nil {
-		certName := e.hintCert.Subject.CommonName
-		if len(certName) == 0 {
-			if len(e.hintCert.Subject.Organization) > 0 {
-				certName = e.hintCert.Subject.Organization[0]
-			}
-			certName = "serial:" + e.hintCert.SerialNumber.String()
-		}
-		s += fmt.Sprintf(" (possibly because of %q while trying to verify candidate authority certificate %q)", e.hintErr, certName)
-	}
-	return s
-}
-
-// SystemRootsError results when we fail to load the system root certificates.
-type SystemRootsError struct{}
-
-func (SystemRootsError) Error() string {
-	return "x509: failed to load system roots and no roots provided"
-}
-
-// VerifyOptions contains parameters for Certificate.Verify. It's a structure
-// because other PKIX verification APIs have ended up needing many options.
-type VerifyOptions struct {
-	DNSName       string
-	Intermediates *CertPool
-	Roots         *CertPool // if nil, the system roots are used
-	CurrentTime   time.Time // if zero, the current time is used
-	// KeyUsage specifies which Extended Key Usage values are acceptable.
-	// An empty list means ExtKeyUsageServerAuth. Key usage is considered a
-	// constraint down the chain which mirrors Windows CryptoAPI behaviour,
-	// but not the spec. To accept any key usage, include ExtKeyUsageAny.
-	KeyUsages []ExtKeyUsage
-}
-
-const (
-	leafCertificate = iota
-	intermediateCertificate
-	rootCertificate
-)
-
-// isValid performs validity checks on the c.
-func (c *Certificate) isValid(certType int, currentChain []*Certificate, opts *VerifyOptions) error {
-	now := opts.CurrentTime
-	if now.IsZero() {
-		now = time.Now()
-	}
-	if now.Before(c.NotBefore) || now.After(c.NotAfter) {
-		return CertificateInvalidError{c, Expired}
-	}
-
-	if len(c.PermittedDNSDomains) > 0 {
-		ok := false
-		for _, domain := range c.PermittedDNSDomains {
-			if opts.DNSName == domain ||
-				(strings.HasSuffix(opts.DNSName, domain) &&
-					len(opts.DNSName) >= 1+len(domain) &&
-					opts.DNSName[len(opts.DNSName)-len(domain)-1] == '.') {
-				ok = true
-				break
-			}
-		}
-
-		if !ok {
-			return CertificateInvalidError{c, CANotAuthorizedForThisName}
-		}
-	}
-
-	// KeyUsage status flags are ignored. From Engineering Security, Peter
-	// Gutmann: A European government CA marked its signing certificates as
-	// being valid for encryption only, but no-one noticed. Another
-	// European CA marked its signature keys as not being valid for
-	// signatures. A different CA marked its own trusted root certificate
-	// as being invalid for certificate signing.  Another national CA
-	// distributed a certificate to be used to encrypt data for the
-	// country’s tax authority that was marked as only being usable for
-	// digital signatures but not for encryption. Yet another CA reversed
-	// the order of the bit flags in the keyUsage due to confusion over
-	// encoding endianness, essentially setting a random keyUsage in
-	// certificates that it issued. Another CA created a self-invalidating
-	// certificate by adding a certificate policy statement stipulating
-	// that the certificate had to be used strictly as specified in the
-	// keyUsage, and a keyUsage containing a flag indicating that the RSA
-	// encryption key could only be used for Diffie-Hellman key agreement.
-
-	if certType == intermediateCertificate && (!c.BasicConstraintsValid || !c.IsCA) {
-		return CertificateInvalidError{c, NotAuthorizedToSign}
-	}
-
-	if c.BasicConstraintsValid && c.MaxPathLen >= 0 {
-		numIntermediates := len(currentChain) - 1
-		if numIntermediates > c.MaxPathLen {
-			return CertificateInvalidError{c, TooManyIntermediates}
-		}
-	}
-
-	return nil
-}
-
-// Verify attempts to verify c by building one or more chains from c to a
-// certificate in opts.Roots, using certificates in opts.Intermediates if
-// needed. If successful, it returns one or more chains where the first
-// element of the chain is c and the last element is from opts.Roots.
-//
-// If opts.Roots is nil and system roots are unavailable the returned error
-// will be of type SystemRootsError.
-//
-// WARNING: this doesn't do any revocation checking.
-func (c *Certificate) Verify(opts VerifyOptions) (chains [][]*Certificate, err error) {
-	// Use Windows's own verification and chain building.
-	if opts.Roots == nil && runtime.GOOS == "windows" {
-		return c.systemVerify(&opts)
-	}
-
-	if len(c.UnhandledCriticalExtensions) > 0 {
-		return nil, UnhandledCriticalExtension{}
-	}
-
-	if opts.Roots == nil {
-		opts.Roots = systemRootsPool()
-		if opts.Roots == nil {
-			return nil, SystemRootsError{}
-		}
-	}
-
-	err = c.isValid(leafCertificate, nil, &opts)
-	if err != nil {
-		return
-	}
-
-	if len(opts.DNSName) > 0 {
-		err = c.VerifyHostname(opts.DNSName)
-		if err != nil {
-			return
-		}
-	}
-
-	candidateChains, err := c.buildChains(make(map[int][][]*Certificate), []*Certificate{c}, &opts)
-	if err != nil {
-		return
-	}
-
-	keyUsages := opts.KeyUsages
-	if len(keyUsages) == 0 {
-		keyUsages = []ExtKeyUsage{ExtKeyUsageServerAuth}
-	}
-
-	// If any key usage is acceptable then we're done.
-	for _, usage := range keyUsages {
-		if usage == ExtKeyUsageAny {
-			chains = candidateChains
-			return
-		}
-	}
-
-	for _, candidate := range candidateChains {
-		if checkChainForKeyUsage(candidate, keyUsages) {
-			chains = append(chains, candidate)
-		}
-	}
-
-	if len(chains) == 0 {
-		err = CertificateInvalidError{c, IncompatibleUsage}
-	}
-
-	return
-}
-
-func appendToFreshChain(chain []*Certificate, cert *Certificate) []*Certificate {
-	n := make([]*Certificate, len(chain)+1)
-	copy(n, chain)
-	n[len(chain)] = cert
-	return n
-}
-
-func (c *Certificate) buildChains(cache map[int][][]*Certificate, currentChain []*Certificate, opts *VerifyOptions) (chains [][]*Certificate, err error) {
-	possibleRoots, failedRoot, rootErr := opts.Roots.findVerifiedParents(c)
-	for _, rootNum := range possibleRoots {
-		root := opts.Roots.certs[rootNum]
-		err = root.isValid(rootCertificate, currentChain, opts)
-		if err != nil {
-			continue
-		}
-		chains = append(chains, appendToFreshChain(currentChain, root))
-	}
-
-	possibleIntermediates, failedIntermediate, intermediateErr := opts.Intermediates.findVerifiedParents(c)
-nextIntermediate:
-	for _, intermediateNum := range possibleIntermediates {
-		intermediate := opts.Intermediates.certs[intermediateNum]
-		for _, cert := range currentChain {
-			if cert == intermediate {
-				continue nextIntermediate
-			}
-		}
-		err = intermediate.isValid(intermediateCertificate, currentChain, opts)
-		if err != nil {
-			continue
-		}
-		var childChains [][]*Certificate
-		childChains, ok := cache[intermediateNum]
-		if !ok {
-			childChains, err = intermediate.buildChains(cache, appendToFreshChain(currentChain, intermediate), opts)
-			cache[intermediateNum] = childChains
-		}
-		chains = append(chains, childChains...)
-	}
-
-	if len(chains) > 0 {
-		err = nil
-	}
-
-	if len(chains) == 0 && err == nil {
-		hintErr := rootErr
-		hintCert := failedRoot
-		if hintErr == nil {
-			hintErr = intermediateErr
-			hintCert = failedIntermediate
-		}
-		err = UnknownAuthorityError{c, hintErr, hintCert}
-	}
-
-	return
-}
-
-func matchHostnames(pattern, host string) bool {
-	host = strings.TrimSuffix(host, ".")
-	pattern = strings.TrimSuffix(pattern, ".")
-
-	if len(pattern) == 0 || len(host) == 0 {
-		return false
-	}
-
-	patternParts := strings.Split(pattern, ".")
-	hostParts := strings.Split(host, ".")
-
-	if len(patternParts) != len(hostParts) {
-		return false
-	}
-
-	for i, patternPart := range patternParts {
-		if i == 0 && patternPart == "*" {
-			continue
-		}
-		if patternPart != hostParts[i] {
-			return false
-		}
-	}
-
-	return true
-}
-
-// toLowerCaseASCII returns a lower-case version of in. See RFC 6125 6.4.1. We use
-// an explicitly ASCII function to avoid any sharp corners resulting from
-// performing Unicode operations on DNS labels.
-func toLowerCaseASCII(in string) string {
-	// If the string is already lower-case then there's nothing to do.
-	isAlreadyLowerCase := true
-	for _, c := range in {
-		if c == utf8.RuneError {
-			// If we get a UTF-8 error then there might be
-			// upper-case ASCII bytes in the invalid sequence.
-			isAlreadyLowerCase = false
-			break
-		}
-		if 'A' <= c && c <= 'Z' {
-			isAlreadyLowerCase = false
-			break
-		}
-	}
-
-	if isAlreadyLowerCase {
-		return in
-	}
-
-	out := []byte(in)
-	for i, c := range out {
-		if 'A' <= c && c <= 'Z' {
-			out[i] += 'a' - 'A'
-		}
-	}
-	return string(out)
-}
-
-// VerifyHostname returns nil if c is a valid certificate for the named host.
-// Otherwise it returns an error describing the mismatch.
-func (c *Certificate) VerifyHostname(h string) error {
-	// IP addresses may be written in [ ].
-	candidateIP := h
-	if len(h) >= 3 && h[0] == '[' && h[len(h)-1] == ']' {
-		candidateIP = h[1 : len(h)-1]
-	}
-	if ip := net.ParseIP(candidateIP); ip != nil {
-		// We only match IP addresses against IP SANs.
-		// https://tools.ietf.org/html/rfc6125#appendix-B.2
-		for _, candidate := range c.IPAddresses {
-			if ip.Equal(candidate) {
-				return nil
-			}
-		}
-		return HostnameError{c, candidateIP}
-	}
-
-	lowered := toLowerCaseASCII(h)
-
-	if len(c.DNSNames) > 0 {
-		for _, match := range c.DNSNames {
-			if matchHostnames(toLowerCaseASCII(match), lowered) {
-				return nil
-			}
-		}
-		// If Subject Alt Name is given, we ignore the common name.
-	} else if matchHostnames(toLowerCaseASCII(c.Subject.CommonName), lowered) {
-		return nil
-	}
-
-	return HostnameError{c, h}
-}
-
-func checkChainForKeyUsage(chain []*Certificate, keyUsages []ExtKeyUsage) bool {
-	usages := make([]ExtKeyUsage, len(keyUsages))
-	copy(usages, keyUsages)
-
-	if len(chain) == 0 {
-		return false
-	}
-
-	usagesRemaining := len(usages)
-
-	// We walk down the list and cross out any usages that aren't supported
-	// by each certificate. If we cross out all the usages, then the chain
-	// is unacceptable.
-
-NextCert:
-	for i := len(chain) - 1; i >= 0; i-- {
-		cert := chain[i]
-		if len(cert.ExtKeyUsage) == 0 && len(cert.UnknownExtKeyUsage) == 0 {
-			// The certificate doesn't have any extended key usage specified.
-			continue
-		}
-
-		for _, usage := range cert.ExtKeyUsage {
-			if usage == ExtKeyUsageAny {
-				// The certificate is explicitly good for any usage.
-				continue NextCert
-			}
-		}
-
-		const invalidUsage ExtKeyUsage = -1
-
-	NextRequestedUsage:
-		for i, requestedUsage := range usages {
-			if requestedUsage == invalidUsage {
-				continue
-			}
-
-			for _, usage := range cert.ExtKeyUsage {
-				if requestedUsage == usage {
-					continue NextRequestedUsage
-				} else if requestedUsage == ExtKeyUsageServerAuth &&
-					(usage == ExtKeyUsageNetscapeServerGatedCrypto ||
-						usage == ExtKeyUsageMicrosoftServerGatedCrypto) {
-					// In order to support COMODO
-					// certificate chains, we have to
-					// accept Netscape or Microsoft SGC
-					// usages as equal to ServerAuth.
-					continue NextRequestedUsage
-				}
-			}
-
-			usages[i] = invalidUsage
-			usagesRemaining--
-			if usagesRemaining == 0 {
-				return false
-			}
-		}
-	}
-
-	return true
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/verify_test.go b/third_party/gofrontend/libgo/go/crypto/x509/verify_test.go
deleted file mode 100644
index 694c140..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/verify_test.go
+++ /dev/null
@@ -1,1134 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-import (
-	"crypto/x509/pkix"
-	"encoding/pem"
-	"errors"
-	"runtime"
-	"strings"
-	"testing"
-	"time"
-)
-
-var supportSHA2 = true
-
-type verifyTest struct {
-	leaf                 string
-	intermediates        []string
-	roots                []string
-	currentTime          int64
-	dnsName              string
-	systemSkip           bool
-	keyUsages            []ExtKeyUsage
-	testSystemRootsError bool
-	sha2                 bool
-
-	errorCallback  func(*testing.T, int, error) bool
-	expectedChains [][]string
-}
-
-var verifyTests = []verifyTest{
-	{
-		leaf:                 googleLeaf,
-		intermediates:        []string{giag2Intermediate},
-		currentTime:          1395785200,
-		dnsName:              "www.google.com",
-		testSystemRootsError: true,
-
-		// Without any roots specified we should get a system roots
-		// error.
-		errorCallback: expectSystemRootsError,
-	},
-	{
-		leaf:          googleLeaf,
-		intermediates: []string{giag2Intermediate},
-		roots:         []string{geoTrustRoot},
-		currentTime:   1395785200,
-		dnsName:       "www.google.com",
-
-		expectedChains: [][]string{
-			{"Google", "Google Internet Authority", "GeoTrust"},
-		},
-	},
-	{
-		leaf:          googleLeaf,
-		intermediates: []string{giag2Intermediate},
-		roots:         []string{geoTrustRoot},
-		currentTime:   1395785200,
-		dnsName:       "WwW.GooGLE.coM",
-
-		expectedChains: [][]string{
-			{"Google", "Google Internet Authority", "GeoTrust"},
-		},
-	},
-	{
-		leaf:          googleLeaf,
-		intermediates: []string{giag2Intermediate},
-		roots:         []string{geoTrustRoot},
-		currentTime:   1395785200,
-		dnsName:       "www.example.com",
-
-		errorCallback: expectHostnameError,
-	},
-	{
-		leaf:          googleLeaf,
-		intermediates: []string{giag2Intermediate},
-		roots:         []string{geoTrustRoot},
-		currentTime:   1,
-		dnsName:       "www.example.com",
-
-		errorCallback: expectExpired,
-	},
-	{
-		leaf:        googleLeaf,
-		roots:       []string{geoTrustRoot},
-		currentTime: 1395785200,
-		dnsName:     "www.google.com",
-
-		// Skip when using systemVerify, since Windows
-		// *will* find the missing intermediate cert.
-		systemSkip:    true,
-		errorCallback: expectAuthorityUnknown,
-	},
-	{
-		leaf:          googleLeaf,
-		intermediates: []string{geoTrustRoot, giag2Intermediate},
-		roots:         []string{geoTrustRoot},
-		currentTime:   1395785200,
-		dnsName:       "www.google.com",
-
-		expectedChains: [][]string{
-			{"Google", "Google Internet Authority", "GeoTrust"},
-			// TODO(agl): this is ok, but it would be nice if the
-			//            chain building didn't visit the same SPKI
-			//            twice.
-			{"Google", "Google Internet Authority", "GeoTrust", "GeoTrust"},
-		},
-		// CAPI doesn't build the chain with the duplicated GeoTrust
-		// entry so the results don't match. Thus we skip this test
-		// until that's fixed.
-		systemSkip: true,
-	},
-	{
-		leaf:          dnssecExpLeaf,
-		intermediates: []string{startComIntermediate},
-		roots:         []string{startComRoot},
-		currentTime:   1302726541,
-
-		expectedChains: [][]string{
-			{"dnssec-exp", "StartCom Class 1", "StartCom Certification Authority"},
-		},
-	},
-	{
-		leaf:          dnssecExpLeaf,
-		intermediates: []string{startComIntermediate, startComRoot},
-		roots:         []string{startComRoot},
-		currentTime:   1302726541,
-
-		// Skip when using systemVerify, since Windows
-		// can only return a single chain to us (for now).
-		systemSkip: true,
-		expectedChains: [][]string{
-			{"dnssec-exp", "StartCom Class 1", "StartCom Certification Authority"},
-			{"dnssec-exp", "StartCom Class 1", "StartCom Certification Authority", "StartCom Certification Authority"},
-		},
-	},
-	{
-		leaf:          googleLeafWithInvalidHash,
-		intermediates: []string{giag2Intermediate},
-		roots:         []string{geoTrustRoot},
-		currentTime:   1395785200,
-		dnsName:       "www.google.com",
-
-		// The specific error message may not occur when using system
-		// verification.
-		systemSkip:    true,
-		errorCallback: expectHashError,
-	},
-	{
-		// The default configuration should reject an S/MIME chain.
-		leaf:        smimeLeaf,
-		roots:       []string{smimeIntermediate},
-		currentTime: 1339436154,
-
-		// Key usage not implemented for Windows yet.
-		systemSkip:    true,
-		errorCallback: expectUsageError,
-	},
-	{
-		leaf:        smimeLeaf,
-		roots:       []string{smimeIntermediate},
-		currentTime: 1339436154,
-		keyUsages:   []ExtKeyUsage{ExtKeyUsageServerAuth},
-
-		// Key usage not implemented for Windows yet.
-		systemSkip:    true,
-		errorCallback: expectUsageError,
-	},
-	{
-		leaf:        smimeLeaf,
-		roots:       []string{smimeIntermediate},
-		currentTime: 1339436154,
-		keyUsages:   []ExtKeyUsage{ExtKeyUsageEmailProtection},
-
-		// Key usage not implemented for Windows yet.
-		systemSkip: true,
-		expectedChains: [][]string{
-			{"Ryan Hurst", "GlobalSign PersonalSign 2 CA - G2"},
-		},
-	},
-	{
-		leaf:          megaLeaf,
-		intermediates: []string{comodoIntermediate1},
-		roots:         []string{comodoRoot},
-		currentTime:   1360431182,
-
-		// CryptoAPI can find alternative validation paths so we don't
-		// perform this test with system validation.
-		systemSkip: true,
-		expectedChains: [][]string{
-			{"mega.co.nz", "EssentialSSL CA", "COMODO Certification Authority"},
-		},
-	},
-	{
-		// Check that a name constrained intermediate works even when
-		// it lists multiple constraints.
-		leaf:          nameConstraintsLeaf,
-		intermediates: []string{nameConstraintsIntermediate1, nameConstraintsIntermediate2},
-		roots:         []string{globalSignRoot},
-		currentTime:   1382387896,
-		dnsName:       "secure.iddl.vt.edu",
-
-		expectedChains: [][]string{
-			{
-				"Technology-enhanced Learning and Online Strategies",
-				"Virginia Tech Global Qualified Server CA",
-				"Trusted Root CA G2",
-				"GlobalSign Root CA",
-			},
-		},
-	},
-	{
-		// Check that SHA-384 intermediates (which are popping up)
-		// work.
-		leaf:          moipLeafCert,
-		intermediates: []string{comodoIntermediateSHA384, comodoRSAAuthority},
-		roots:         []string{addTrustRoot},
-		currentTime:   1397502195,
-		dnsName:       "api.moip.com.br",
-
-		// CryptoAPI can find alternative validation paths so we don't
-		// perform this test with system validation.
-		systemSkip: true,
-
-		sha2: true,
-		expectedChains: [][]string{
-			{
-				"api.moip.com.br",
-				"COMODO RSA Extended Validation Secure Server CA",
-				"COMODO RSA Certification Authority",
-				"AddTrust External CA Root",
-			},
-		},
-	},
-}
-
-func expectHostnameError(t *testing.T, i int, err error) (ok bool) {
-	if _, ok := err.(HostnameError); !ok {
-		t.Errorf("#%d: error was not a HostnameError: %s", i, err)
-		return false
-	}
-	return true
-}
-
-func expectExpired(t *testing.T, i int, err error) (ok bool) {
-	if inval, ok := err.(CertificateInvalidError); !ok || inval.Reason != Expired {
-		t.Errorf("#%d: error was not Expired: %s", i, err)
-		return false
-	}
-	return true
-}
-
-func expectUsageError(t *testing.T, i int, err error) (ok bool) {
-	if inval, ok := err.(CertificateInvalidError); !ok || inval.Reason != IncompatibleUsage {
-		t.Errorf("#%d: error was not IncompatibleUsage: %s", i, err)
-		return false
-	}
-	return true
-}
-
-func expectAuthorityUnknown(t *testing.T, i int, err error) (ok bool) {
-	if _, ok := err.(UnknownAuthorityError); !ok {
-		t.Errorf("#%d: error was not UnknownAuthorityError: %s", i, err)
-		return false
-	}
-	return true
-}
-
-func expectSystemRootsError(t *testing.T, i int, err error) bool {
-	if _, ok := err.(SystemRootsError); !ok {
-		t.Errorf("#%d: error was not SystemRootsError: %s", i, err)
-		return false
-	}
-	return true
-}
-
-func expectHashError(t *testing.T, i int, err error) bool {
-	if err == nil {
-		t.Errorf("#%d: no error resulted from invalid hash", i)
-		return false
-	}
-	if expected := "algorithm unimplemented"; !strings.Contains(err.Error(), expected) {
-		t.Errorf("#%d: error resulting from invalid hash didn't contain '%s', rather it was: %s", i, expected, err)
-		return false
-	}
-	return true
-}
-
-func certificateFromPEM(pemBytes string) (*Certificate, error) {
-	block, _ := pem.Decode([]byte(pemBytes))
-	if block == nil {
-		return nil, errors.New("failed to decode PEM")
-	}
-	return ParseCertificate(block.Bytes)
-}
-
-func testVerify(t *testing.T, useSystemRoots bool) {
-	for i, test := range verifyTests {
-		if useSystemRoots && test.systemSkip {
-			continue
-		}
-		if runtime.GOOS == "windows" && test.testSystemRootsError {
-			continue
-		}
-		if useSystemRoots && !supportSHA2 && test.sha2 {
-			continue
-		}
-
-		opts := VerifyOptions{
-			Intermediates: NewCertPool(),
-			DNSName:       test.dnsName,
-			CurrentTime:   time.Unix(test.currentTime, 0),
-			KeyUsages:     test.keyUsages,
-		}
-
-		if !useSystemRoots {
-			opts.Roots = NewCertPool()
-			for j, root := range test.roots {
-				ok := opts.Roots.AppendCertsFromPEM([]byte(root))
-				if !ok {
-					t.Errorf("#%d: failed to parse root #%d", i, j)
-					return
-				}
-			}
-		}
-
-		for j, intermediate := range test.intermediates {
-			ok := opts.Intermediates.AppendCertsFromPEM([]byte(intermediate))
-			if !ok {
-				t.Errorf("#%d: failed to parse intermediate #%d", i, j)
-				return
-			}
-		}
-
-		leaf, err := certificateFromPEM(test.leaf)
-		if err != nil {
-			t.Errorf("#%d: failed to parse leaf: %s", i, err)
-			return
-		}
-
-		var oldSystemRoots *CertPool
-		if test.testSystemRootsError {
-			oldSystemRoots = systemRootsPool()
-			systemRoots = nil
-			opts.Roots = nil
-		}
-
-		chains, err := leaf.Verify(opts)
-
-		if test.testSystemRootsError {
-			systemRoots = oldSystemRoots
-		}
-
-		if test.errorCallback == nil && err != nil {
-			t.Errorf("#%d: unexpected error: %s", i, err)
-		}
-		if test.errorCallback != nil {
-			if !test.errorCallback(t, i, err) {
-				return
-			}
-		}
-
-		if len(chains) != len(test.expectedChains) {
-			t.Errorf("#%d: wanted %d chains, got %d", i, len(test.expectedChains), len(chains))
-		}
-
-		// We check that each returned chain matches a chain from
-		// expectedChains but an entry in expectedChains can't match
-		// two chains.
-		seenChains := make([]bool, len(chains))
-	NextOutputChain:
-		for _, chain := range chains {
-		TryNextExpected:
-			for j, expectedChain := range test.expectedChains {
-				if seenChains[j] {
-					continue
-				}
-				if len(chain) != len(expectedChain) {
-					continue
-				}
-				for k, cert := range chain {
-					if strings.Index(nameToKey(&cert.Subject), expectedChain[k]) == -1 {
-						continue TryNextExpected
-					}
-				}
-				// we matched
-				seenChains[j] = true
-				continue NextOutputChain
-			}
-			t.Errorf("#%d: No expected chain matched %s", i, chainToDebugString(chain))
-		}
-	}
-}
-
-func TestGoVerify(t *testing.T) {
-	testVerify(t, false)
-}
-
-func TestSystemVerify(t *testing.T) {
-	if runtime.GOOS != "windows" {
-		t.Skipf("skipping verify test using system APIs on %q", runtime.GOOS)
-	}
-
-	testVerify(t, true)
-}
-
-func chainToDebugString(chain []*Certificate) string {
-	var chainStr string
-	for _, cert := range chain {
-		if len(chainStr) > 0 {
-			chainStr += " -> "
-		}
-		chainStr += nameToKey(&cert.Subject)
-	}
-	return chainStr
-}
-
-func nameToKey(name *pkix.Name) string {
-	return strings.Join(name.Country, ",") + "/" + strings.Join(name.Organization, ",") + "/" + strings.Join(name.OrganizationalUnit, ",") + "/" + name.CommonName
-}
-
-const geoTrustRoot = `-----BEGIN CERTIFICATE-----
-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
-MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
-YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
-R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
-9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
-fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
-iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
-1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
-bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
-MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
-ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
-uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
-Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
-tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
-PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
-hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
-5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
------END CERTIFICATE-----
-`
-
-const giag2Intermediate = `-----BEGIN CERTIFICATE-----
-MIIEBDCCAuygAwIBAgIDAjppMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
-MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
-YWwgQ0EwHhcNMTMwNDA1MTUxNTU1WhcNMTUwNDA0MTUxNTU1WjBJMQswCQYDVQQG
-EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy
-bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP
-VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv
-h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE
-ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ
-EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC
-DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB+zCB+DAfBgNVHSMEGDAWgBTAephojYn7
-qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wEgYD
-VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMwMTAvoC2g
-K4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9ndGdsb2JhbC5jcmwwPQYI
-KwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vZ3RnbG9iYWwtb2NzcC5n
-ZW90cnVzdC5jb20wFwYDVR0gBBAwDjAMBgorBgEEAdZ5AgUBMA0GCSqGSIb3DQEB
-BQUAA4IBAQA21waAESetKhSbOHezI6B1WLuxfoNCunLaHtiONgaX4PCVOzf9G0JY
-/iLIa704XtE7JW4S615ndkZAkNoUyHgN7ZVm2o6Gb4ChulYylYbc3GrKBIxbf/a/
-zG+FA1jDaFETzf3I93k9mTXwVqO94FntT0QJo544evZG0R0SnU++0ED8Vf4GXjza
-HFa9llF7b1cq26KqltyMdMKVvvBulRP/F/A8rLIQjcxz++iPAsbw+zOzlTvjwsto
-WHPbqCRiOwY1nQ2pM714A5AuTHhdUDqB1O6gyHA43LL5Z/qHQF1hwFGPa4NrzQU6
-yuGnBXj8ytqU0CwIPX4WecigUCAkVDNx
------END CERTIFICATE-----
-`
-
-const googleLeaf = `-----BEGIN CERTIFICATE-----
-MIIEdjCCA16gAwIBAgIIcR5k4dkoe04wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
-BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
-cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwMzEyMDkzODMwWhcNMTQwNjEwMDAwMDAw
-WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
-TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOd3d3
-Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4zYCe
-m0oUBhwE0EwBr65eBOcgcQO2PaSIAB2dEP/c1EMX2tOy0ov8rk83ePhJ+MWdT1z6
-jge9X4zQQI8ZyA9qIiwrKBZOi8DNUvrqNZC7fJAVRrb9aX/99uYOJCypIbpmWG1q
-fhbHjJewhwf8xYPj71eU4rLG80a+DapWmphtfq3h52lDQIBzLVf1yYbyrTaELaz4
-NXF7HXb5YkId/gxIsSzM0aFUVu2o8sJcLYAsJqwfFKBKOMxUcn545nlspf0mTcWZ
-0APlbwsKznNs4/xCDwIxxWjjqgHrYAFl6y07i1gzbAOqdNEyR24p+3JWI8WZBlBI
-dk2KGj0W1fIfsvyxAgMBAAGjggFBMIIBPTAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
-KwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYBBQUHAQEE
-XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0
-MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G
-A1UdDgQWBBTXD5Bx6iqT+dmEhbFL4OUoHyZn8zAMBgNVHRMBAf8EAjAAMB8GA1Ud
-IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMBcGA1UdIAQQMA4wDAYKKwYBBAHW
-eQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lB
-RzIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCR3RJtHzgDh33b/MI1ugiki+nl8Ikj
-5larbJRE/rcA5oite+QJyAr6SU1gJJ/rRrK3ItVEHr9L621BCM7GSdoNMjB9MMcf
-tJAW0kYGJ+wqKm53wG/JaOADTnnq2Mt/j6F2uvjgN/ouns1nRHufIvd370N0LeH+
-orKqTuAPzXK7imQk6+OycYABbqCtC/9qmwRd8wwn7sF97DtYfK8WuNHtFalCAwyi
-8LxJJYJCLWoMhZ+V8GZm+FOex5qkQAjnZrtNlbQJ8ro4r+rpKXtmMFFhfa+7L+PA
-Kom08eUK8skxAzfDDijZPh10VtJ66uBoiDPdT+uCBehcBIcmSTrKjFGX
------END CERTIFICATE-----
-`
-
-// googleLeafWithInvalidHash is the same as googleLeaf, but the signature
-// algorithm in the certificate contains a nonsense OID.
-const googleLeafWithInvalidHash = `-----BEGIN CERTIFICATE-----
-MIIEdjCCA16gAwIBAgIIcR5k4dkoe04wDQYJKoZIhvcNAWAFBQAwSTELMAkGA1UE
-BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
-cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwMzEyMDkzODMwWhcNMTQwNjEwMDAwMDAw
-WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
-TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOd3d3
-Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4zYCe
-m0oUBhwE0EwBr65eBOcgcQO2PaSIAB2dEP/c1EMX2tOy0ov8rk83ePhJ+MWdT1z6
-jge9X4zQQI8ZyA9qIiwrKBZOi8DNUvrqNZC7fJAVRrb9aX/99uYOJCypIbpmWG1q
-fhbHjJewhwf8xYPj71eU4rLG80a+DapWmphtfq3h52lDQIBzLVf1yYbyrTaELaz4
-NXF7HXb5YkId/gxIsSzM0aFUVu2o8sJcLYAsJqwfFKBKOMxUcn545nlspf0mTcWZ
-0APlbwsKznNs4/xCDwIxxWjjqgHrYAFl6y07i1gzbAOqdNEyR24p+3JWI8WZBlBI
-dk2KGj0W1fIfsvyxAgMBAAGjggFBMIIBPTAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
-KwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYBBQUHAQEE
-XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0
-MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G
-A1UdDgQWBBTXD5Bx6iqT+dmEhbFL4OUoHyZn8zAMBgNVHRMBAf8EAjAAMB8GA1Ud
-IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMBcGA1UdIAQQMA4wDAYKKwYBBAHW
-eQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lB
-RzIuY3JsMA0GCSqGSIb3DQFgBQUAA4IBAQCR3RJtHzgDh33b/MI1ugiki+nl8Ikj
-5larbJRE/rcA5oite+QJyAr6SU1gJJ/rRrK3ItVEHr9L621BCM7GSdoNMjB9MMcf
-tJAW0kYGJ+wqKm53wG/JaOADTnnq2Mt/j6F2uvjgN/ouns1nRHufIvd370N0LeH+
-orKqTuAPzXK7imQk6+OycYABbqCtC/9qmwRd8wwn7sF97DtYfK8WuNHtFalCAwyi
-8LxJJYJCLWoMhZ+V8GZm+FOex5qkQAjnZrtNlbQJ8ro4r+rpKXtmMFFhfa+7L+PA
-Kom08eUK8skxAzfDDijZPh10VtJ66uBoiDPdT+uCBehcBIcmSTrKjFGX
------END CERTIFICATE-----
-`
-
-const dnssecExpLeaf = `-----BEGIN CERTIFICATE-----
-MIIGzTCCBbWgAwIBAgIDAdD6MA0GCSqGSIb3DQEBBQUAMIGMMQswCQYDVQQGEwJJ
-TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0
-YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3Mg
-MSBQcmltYXJ5IEludGVybWVkaWF0ZSBTZXJ2ZXIgQ0EwHhcNMTAwNzA0MTQ1MjQ1
-WhcNMTEwNzA1MTA1NzA0WjCBwTEgMB4GA1UEDRMXMjIxMTM3LWxpOWE5dHhJRzZM
-NnNyVFMxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVQZXJzb25hIE5vdCBWYWxpZGF0
-ZWQxKTAnBgNVBAsTIFN0YXJ0Q29tIEZyZWUgQ2VydGlmaWNhdGUgTWVtYmVyMRsw
-GQYDVQQDExJ3d3cuZG5zc2VjLWV4cC5vcmcxKDAmBgkqhkiG9w0BCQEWGWhvc3Rt
-YXN0ZXJAZG5zc2VjLWV4cC5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQDEdF/22vaxrPbqpgVYMWi+alfpzBctpbfLBdPGuqOazJdCT0NbWcK8/+B4
-X6OlSOURNIlwLzhkmwVsWdVv6dVSaN7d4yI/fJkvgfDB9+au+iBJb6Pcz8ULBfe6
-D8HVvqKdORp6INzHz71z0sghxrQ0EAEkoWAZLh+kcn2ZHdcmZaBNUfjmGbyU6PRt
-RjdqoP+owIaC1aktBN7zl4uO7cRjlYFdusINrh2kPP02KAx2W84xjxX1uyj6oS6e
-7eBfvcwe8czW/N1rbE0CoR7h9+HnIrjnVG9RhBiZEiw3mUmF++Up26+4KTdRKbu3
-+BL4yMpfd66z0+zzqu+HkvyLpFn5AgMBAAGjggL/MIIC+zAJBgNVHRMEAjAAMAsG
-A1UdDwQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATAdBgNVHQ4EFgQUy04I5guM
-drzfh2JQaXhgV86+4jUwHwYDVR0jBBgwFoAU60I00Jiwq5/0G2sI98xkLu8OLEUw
-LQYDVR0RBCYwJIISd3d3LmRuc3NlYy1leHAub3Jngg5kbnNzZWMtZXhwLm9yZzCC
-AUIGA1UdIASCATkwggE1MIIBMQYLKwYBBAGBtTcBAgIwggEgMC4GCCsGAQUFBwIB
-FiJodHRwOi8vd3d3LnN0YXJ0c3NsLmNvbS9wb2xpY3kucGRmMDQGCCsGAQUFBwIB
-FihodHRwOi8vd3d3LnN0YXJ0c3NsLmNvbS9pbnRlcm1lZGlhdGUucGRmMIG3Bggr
-BgEFBQcCAjCBqjAUFg1TdGFydENvbSBMdGQuMAMCAQEagZFMaW1pdGVkIExpYWJp
-bGl0eSwgc2VlIHNlY3Rpb24gKkxlZ2FsIExpbWl0YXRpb25zKiBvZiB0aGUgU3Rh
-cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUG9saWN5IGF2YWlsYWJsZSBh
-dCBodHRwOi8vd3d3LnN0YXJ0c3NsLmNvbS9wb2xpY3kucGRmMGEGA1UdHwRaMFgw
-KqAooCaGJGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2NydDEtY3JsLmNybDAqoCig
-JoYkaHR0cDovL2NybC5zdGFydHNzbC5jb20vY3J0MS1jcmwuY3JsMIGOBggrBgEF
-BQcBAQSBgTB/MDkGCCsGAQUFBzABhi1odHRwOi8vb2NzcC5zdGFydHNzbC5jb20v
-c3ViL2NsYXNzMS9zZXJ2ZXIvY2EwQgYIKwYBBQUHMAKGNmh0dHA6Ly93d3cuc3Rh
-cnRzc2wuY29tL2NlcnRzL3N1Yi5jbGFzczEuc2VydmVyLmNhLmNydDAjBgNVHRIE
-HDAahhhodHRwOi8vd3d3LnN0YXJ0c3NsLmNvbS8wDQYJKoZIhvcNAQEFBQADggEB
-ACXj6SB59KRJPenn6gUdGEqcta97U769SATyiQ87i9er64qLwvIGLMa3o2Rcgl2Y
-kghUeyLdN/EXyFBYA8L8uvZREPoc7EZukpT/ZDLXy9i2S0jkOxvF2fD/XLbcjGjM
-iEYG1/6ASw0ri9C0k4oDDoJLCoeH9++yqF7SFCCMcDkJqiAGXNb4euDpa8vCCtEQ
-CSS+ObZbfkreRt3cNCf5LfCXe9OsTnCfc8Cuq81c0oLaG+SmaLUQNBuToq8e9/Zm
-+b+/a3RVjxmkV5OCcGVBxsXNDn54Q6wsdw0TBMcjwoEndzpLS7yWgFbbkq5ZiGpw
-Qibb2+CfKuQ+WFV1GkVQmVA=
------END CERTIFICATE-----`
-
-const startComIntermediate = `-----BEGIN CERTIFICATE-----
-MIIGNDCCBBygAwIBAgIBGDANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
-MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
-Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwHhcNMDcxMDI0MjA1NDE3WhcNMTcxMDI0MjA1NDE3WjCB
-jDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsT
-IlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcxODA2BgNVBAMTL1N0
-YXJ0Q29tIENsYXNzIDEgUHJpbWFyeSBJbnRlcm1lZGlhdGUgU2VydmVyIENBMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtonGrO8JUngHrJJj0PREGBiE
-gFYfka7hh/oyULTTRwbw5gdfcA4Q9x3AzhA2NIVaD5Ksg8asWFI/ujjo/OenJOJA
-pgh2wJJuniptTT9uYSAK21ne0n1jsz5G/vohURjXzTCm7QduO3CHtPn66+6CPAVv
-kvek3AowHpNz/gfK11+AnSJYUq4G2ouHI2mw5CrY6oPSvfNx23BaKA+vWjhwRRI/
-ME3NO68X5Q/LoKldSKqxYVDLNM08XMML6BDAjJvwAwNi/rJsPnIO7hxDKslIDlc5
-xDEhyBDBLIf+VJVSH1I8MRKbf+fAoKVZ1eKPPvDVqOHXcDGpxLPPr21TLwb0pwID
-AQABo4IBrTCCAakwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
-VR0OBBYEFOtCNNCYsKuf9BtrCPfMZC7vDixFMB8GA1UdIwQYMBaAFE4L7xqkQFul
-F2mHMMo0aEPQQa7yMGYGCCsGAQUFBwEBBFowWDAnBggrBgEFBQcwAYYbaHR0cDov
-L29jc3Auc3RhcnRzc2wuY29tL2NhMC0GCCsGAQUFBzAChiFodHRwOi8vd3d3LnN0
-YXJ0c3NsLmNvbS9zZnNjYS5jcnQwWwYDVR0fBFQwUjAnoCWgI4YhaHR0cDovL3d3
-dy5zdGFydHNzbC5jb20vc2ZzY2EuY3JsMCegJaAjhiFodHRwOi8vY3JsLnN0YXJ0
-c3NsLmNvbS9zZnNjYS5jcmwwgYAGA1UdIAR5MHcwdQYLKwYBBAGBtTcBAgEwZjAu
-BggrBgEFBQcCARYiaHR0cDovL3d3dy5zdGFydHNzbC5jb20vcG9saWN5LnBkZjA0
-BggrBgEFBQcCARYoaHR0cDovL3d3dy5zdGFydHNzbC5jb20vaW50ZXJtZWRpYXRl
-LnBkZjANBgkqhkiG9w0BAQUFAAOCAgEAIQlJPqWIbuALi0jaMU2P91ZXouHTYlfp
-tVbzhUV1O+VQHwSL5qBaPucAroXQ+/8gA2TLrQLhxpFy+KNN1t7ozD+hiqLjfDen
-xk+PNdb01m4Ge90h2c9W/8swIkn+iQTzheWq8ecf6HWQTd35RvdCNPdFWAwRDYSw
-xtpdPvkBnufh2lWVvnQce/xNFE+sflVHfXv0pQ1JHpXo9xLBzP92piVH0PN1Nb6X
-t1gW66pceG/sUzCv6gRNzKkC4/C2BBL2MLERPZBOVmTX3DxDX3M570uvh+v2/miI
-RHLq0gfGabDBoYvvF0nXYbFFSF87ICHpW7LM9NfpMfULFWE7epTj69m8f5SuauNi
-YpaoZHy4h/OZMn6SolK+u/hlz8nyMPyLwcKmltdfieFcNID1j0cHL7SRv7Gifl9L
-WtBbnySGBVFaaQNlQ0lxxeBvlDRr9hvYqbBMflPrj0jfyjO1SPo2ShpTpjMM0InN
-SRXNiTE8kMBy12VLUjWKRhFEuT2OKGWmPnmeXAhEKa2wNREuIU640ucQPl2Eg7PD
-wuTSxv0JS3QJ3fGz0xk+gA2iCxnwOOfFwq/iI9th4p1cbiCJSS4jarJiwUW0n6+L
-p/EiO/h94pDQehn7Skzj0n1fSoMD7SfWI55rjbRZotnvbIIp3XUZPD9MEI3vu3Un
-0q6Dp6jOW6c=
------END CERTIFICATE-----`
-
-const startComRoot = `-----BEGIN CERTIFICATE-----
-MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
-MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
-Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
-MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
-U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
-cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
-pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
-OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
-Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
-Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
-HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
-Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
-+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
-Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
-Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
-26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
-AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
-FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
-ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
-LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
-BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
-Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
-dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
-cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
-YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
-dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
-bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
-YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
-TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
-9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
-jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
-FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
-ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
-ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
-EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
-L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
-yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
-O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
-um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
-NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
------END CERTIFICATE-----`
-
-const startComRootSHA256 = `-----BEGIN CERTIFICATE-----
-MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW
-MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
-Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9
-MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
-U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
-cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
-pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
-OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
-Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
-Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
-HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
-Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
-+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
-Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
-Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
-26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
-AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
-VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul
-F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC
-ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w
-ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk
-aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0
-YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg
-c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93
-d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG
-CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF
-wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS
-Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst
-0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc
-pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl
-CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF
-P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK
-1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm
-KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
-JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ
-8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm
-fyWl8kgAwKQB2j8=
------END CERTIFICATE-----`
-
-const smimeLeaf = `-----BEGIN CERTIFICATE-----
-MIIFBjCCA+6gAwIBAgISESFvrjT8XcJTEe6rBlPptILlMA0GCSqGSIb3DQEBBQUA
-MFQxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSowKAYD
-VQQDEyFHbG9iYWxTaWduIFBlcnNvbmFsU2lnbiAyIENBIC0gRzIwHhcNMTIwMTIz
-MTYzNjU5WhcNMTUwMTIzMTYzNjU5WjCBlDELMAkGA1UEBhMCVVMxFjAUBgNVBAgT
-DU5ldyBIYW1zcGhpcmUxEzARBgNVBAcTClBvcnRzbW91dGgxGTAXBgNVBAoTEEds
-b2JhbFNpZ24sIEluYy4xEzARBgNVBAMTClJ5YW4gSHVyc3QxKDAmBgkqhkiG9w0B
-CQEWGXJ5YW4uaHVyc3RAZ2xvYmFsc2lnbi5jb20wggEiMA0GCSqGSIb3DQEBAQUA
-A4IBDwAwggEKAoIBAQC4ASSTvavmsFQAob60ukSSwOAL9nT/s99ltNUCAf5fPH5j
-NceMKxaQse2miOmRRIXaykcq1p/TbI70Ztce38r2mbOwqDHHPVi13GxJEyUXWgaR
-BteDMu5OGyWNG1kchVsGWpbstT0Z4v0md5m1BYFnxB20ebJyOR2lXDxsFK28nnKV
-+5eMj76U8BpPQ4SCH7yTMG6y0XXsB3cCrBKr2o3TOYgEKv+oNnbaoMt3UxMt9nSf
-9jyIshjqfnT5Aew3CUNMatO55g5FXXdIukAweg1YSb1ls05qW3sW00T3d7dQs9/7
-NuxCg/A2elmVJSoy8+MLR8JSFEf/aMgjO/TyLg/jAgMBAAGjggGPMIIBizAOBgNV
-HQ8BAf8EBAMCBaAwTQYDVR0gBEYwRDBCBgorBgEEAaAyASgKMDQwMgYIKwYBBQUH
-AgEWJmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMCQGA1Ud
-EQQdMBuBGXJ5YW4uaHVyc3RAZ2xvYmFsc2lnbi5jb20wCQYDVR0TBAIwADAdBgNV
-HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwQwYDVR0fBDwwOjA4oDagNIYyaHR0
-cDovL2NybC5nbG9iYWxzaWduLmNvbS9ncy9nc3BlcnNvbmFsc2lnbjJnMi5jcmww
-VQYIKwYBBQUHAQEESTBHMEUGCCsGAQUFBzAChjlodHRwOi8vc2VjdXJlLmdsb2Jh
-bHNpZ24uY29tL2NhY2VydC9nc3BlcnNvbmFsc2lnbjJnMi5jcnQwHQYDVR0OBBYE
-FFWiECe0/L72eVYqcWYnLV6SSjzhMB8GA1UdIwQYMBaAFD8V0m18L+cxnkMKBqiU
-bCw7xe5lMA0GCSqGSIb3DQEBBQUAA4IBAQAhQi6hLPeudmf3IBF4IDzCvRI0FaYd
-BKfprSk/H0PDea4vpsLbWpA0t0SaijiJYtxKjlM4bPd+2chb7ejatDdyrZIzmDVy
-q4c30/xMninGKokpYA11/Ve+i2dvjulu65qasrtQRGybAuuZ67lrp/K3OMFgjV5N
-C3AHYLzvNU4Dwc4QQ1BaMOg6KzYSrKbABRZajfrpC9uiePsv7mDIXLx/toBPxWNl
-a5vJm5DrZdn7uHdvBCE6kMykbOLN5pmEK0UIlwKh6Qi5XD0pzlVkEZliFkBMJgub
-d/eF7xeg7TKPWC5xyOFp9SdMolJM7LTC3wnSO3frBAev+q/nGs9Xxyvs
------END CERTIFICATE-----`
-
-const smimeIntermediate = `-----BEGIN CERTIFICATE-----
-MIIEFjCCAv6gAwIBAgILBAAAAAABL07hL1IwDQYJKoZIhvcNAQEFBQAwVzELMAkG
-A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
-b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xMTA0MTMxMDAw
-MDBaFw0xOTA0MTMxMDAwMDBaMFQxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
-YWxTaWduIG52LXNhMSowKAYDVQQDEyFHbG9iYWxTaWduIFBlcnNvbmFsU2lnbiAy
-IENBIC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBa0H5Nez4
-En3dIlFpX7e5E0YndxQ74xOBbz7kdBd+DLX0LOQMjVPU3DAgKL9ujhH+ZhHkURbH
-3X/94TQSUL/z2JjsaQvS0NqyZXHhM5eeuquzOJRzEQ8+odETzHg2G0Erv7yjSeww
-gkwDWDJnYUDlOjYTDUEG6+i+8Mn425reo4I0E277wD542kmVWeW7+oHv5dZo9e1Q
-yWwiKTEP6BEQVVSBgThXMG4traSSDRUt3T1eQTZx5EObpiBEBO4OTqiBTJfg4vEI
-YgkXzKLpnfszTB6YMDpR9/QS6p3ANB3kfAb+t6udSO3WCst0DGrwHDLBFGDR4UeY
-T5KGGnI7cWL7AgMBAAGjgeUwgeIwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQI
-MAYBAf8CAQAwHQYDVR0OBBYEFD8V0m18L+cxnkMKBqiUbCw7xe5lMEcGA1UdIARA
-MD4wPAYEVR0gADA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWdu
-LmNvbS9yZXBvc2l0b3J5LzAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vY3JsLmds
-b2JhbHNpZ24ubmV0L3Jvb3QuY3JsMB8GA1UdIwQYMBaAFGB7ZhpFDZfKiVAvfQTN
-NKj//P1LMA0GCSqGSIb3DQEBBQUAA4IBAQBDc3nMpMxJMQMcYUCB3+C73UpvwDE8
-eCOr7t2F/uaQKKcyqqstqLZc6vPwI/rcE9oDHugY5QEjQzIBIEaTnN6P0vege2IX
-eCOr7t2F/uaQKKcyqqstqLZc6vPwI/rcE9oDHugY5QEjQzIBIEaTnN6P0vege2IX
-YEvTWbWwGdPytDFPYIl3/6OqNSXSnZ7DxPcdLJq2uyiga8PB/TTIIHYkdM2+1DE0
-7y3rH/7TjwDVD7SLu5/SdOfKskuMPTjOEvz3K161mymW06klVhubCIWOro/Gx1Q2
-2FQOZ7/2k4uYoOdBTSlb8kTAuzZNgIE0rB2BIYCTz/P6zZIKW0ogbRSH
------END CERTIFICATE-----`
-
-var megaLeaf = `-----BEGIN CERTIFICATE-----
-MIIFOjCCBCKgAwIBAgIQWYE8Dup170kZ+k11Lg51OjANBgkqhkiG9w0BAQUFADBy
-MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD
-VQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEYMBYGA1UE
-AxMPRXNzZW50aWFsU1NMIENBMB4XDTEyMTIxNDAwMDAwMFoXDTE0MTIxNDIzNTk1
-OVowfzEhMB8GA1UECxMYRG9tYWluIENvbnRyb2wgVmFsaWRhdGVkMS4wLAYDVQQL
-EyVIb3N0ZWQgYnkgSW5zdHJhIENvcnBvcmF0aW9uIFB0eS4gTFREMRUwEwYDVQQL
-EwxFc3NlbnRpYWxTU0wxEzARBgNVBAMTCm1lZ2EuY28ubnowggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQDcxMCClae8BQIaJHBUIVttlLvhbK4XhXPk3RQ3
-G5XA6tLZMBQ33l3F9knYJ0YErXtr8IdfYoulRQFmKFMJl9GtWyg4cGQi2Rcr5VN5
-S5dA1vu4oyJBxE9fPELcK6Yz1vqaf+n6za+mYTiQYKggVdS8/s8hmNuXP9Zk1pIn
-+q0pGsf8NAcSHMJgLqPQrTDw+zae4V03DvcYfNKjuno88d2226ld7MAmQZ7uRNsI
-/CnkdelVs+akZsXf0szefSqMJlf08SY32t2jj4Ra7RApVYxOftD9nij/aLfuqOU6
-ow6IgIcIG2ZvXLZwK87c5fxL7UAsTTV+M1sVv8jA33V2oKLhAgMBAAGjggG9MIIB
-uTAfBgNVHSMEGDAWgBTay+qtWwhdzP/8JlTOSeVVxjj0+DAdBgNVHQ4EFgQUmP9l
-6zhyrZ06Qj4zogt+6LKFk4AwDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAw
-NAYDVR0lBC0wKwYIKwYBBQUHAwEGCCsGAQUFBwMCBgorBgEEAYI3CgMDBglghkgB
-hvhCBAEwTwYDVR0gBEgwRjA6BgsrBgEEAbIxAQICBzArMCkGCCsGAQUFBwIBFh1o
-dHRwczovL3NlY3VyZS5jb21vZG8uY29tL0NQUzAIBgZngQwBAgEwOwYDVR0fBDQw
-MjAwoC6gLIYqaHR0cDovL2NybC5jb21vZG9jYS5jb20vRXNzZW50aWFsU1NMQ0Eu
-Y3JsMG4GCCsGAQUFBwEBBGIwYDA4BggrBgEFBQcwAoYsaHR0cDovL2NydC5jb21v
-ZG9jYS5jb20vRXNzZW50aWFsU1NMQ0FfMi5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6
-Ly9vY3NwLmNvbW9kb2NhLmNvbTAlBgNVHREEHjAcggptZWdhLmNvLm56gg53d3cu
-bWVnYS5jby5uejANBgkqhkiG9w0BAQUFAAOCAQEAcYhrsPSvDuwihMOh0ZmRpbOE
-Gw6LqKgLNTmaYUPQhzi2cyIjhUhNvugXQQlP5f0lp5j8cixmArafg1dTn4kQGgD3
-ivtuhBTgKO1VYB/VRoAt6Lmswg3YqyiS7JiLDZxjoV7KoS5xdiaINfHDUaBBY4ZH
-j2BUlPniNBjCqXe/HndUTVUewlxbVps9FyCmH+C4o9DWzdGBzDpCkcmo5nM+cp7q
-ZhTIFTvZfo3zGuBoyu8BzuopCJcFRm3cRiXkpI7iOMUIixO1szkJS6WpL1sKdT73
-UXp08U0LBqoqG130FbzEJBBV3ixbvY6BWMHoCWuaoF12KJnC5kHt2RoWAAgMXA==
------END CERTIFICATE-----`
-
-var comodoIntermediate1 = `-----BEGIN CERTIFICATE-----
-MIIFAzCCA+ugAwIBAgIQGLLLuqME8aAPwfLzJkYqSjANBgkqhkiG9w0BAQUFADCB
-gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
-BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
-MDBaFw0xOTEyMzEyMzU5NTlaMHIxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVh
-dGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9E
-TyBDQSBMaW1pdGVkMRgwFgYDVQQDEw9Fc3NlbnRpYWxTU0wgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCt8AiwcsargxIxF3CJhakgEtSYau2A1NHf
-5I5ZLdOWIY120j8YC0YZYwvHIPPlC92AGvFaoL0dds23Izp0XmEbdaqb1IX04XiR
-0y3hr/yYLgbSeT1awB8hLRyuIVPGOqchfr7tZ291HRqfalsGs2rjsQuqag7nbWzD
-ypWMN84hHzWQfdvaGlyoiBSyD8gSIF/F03/o4Tjg27z5H6Gq1huQByH6RSRQXScq
-oChBRVt9vKCiL6qbfltTxfEFFld+Edc7tNkBdtzffRDPUanlOPJ7FAB1WfnwWdsX
-Pvev5gItpHnBXaIcw5rIp6gLSApqLn8tl2X2xQScRMiZln5+pN0vAgMBAAGjggGD
-MIIBfzAfBgNVHSMEGDAWgBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAdBgNVHQ4EFgQU
-2svqrVsIXcz//CZUzknlVcY49PgwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQI
-MAYBAf8CAQAwIAYDVR0lBBkwFwYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMD4GA1Ud
-IAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5jb21v
-ZG8uY29tL0NQUzBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9kb2Nh
-LmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBsBggrBgEFBQcB
-AQRgMF4wNgYIKwYBBQUHMAKGKmh0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NvbW9k
-b1VUTlNHQ0NBLmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2Eu
-Y29tMA0GCSqGSIb3DQEBBQUAA4IBAQAtlzR6QDLqcJcvgTtLeRJ3rvuq1xqo2l/z
-odueTZbLN3qo6u6bldudu+Ennv1F7Q5Slqz0J790qpL0pcRDAB8OtXj5isWMcL2a
-ejGjKdBZa0wztSz4iw+SY1dWrCRnilsvKcKxudokxeRiDn55w/65g+onO7wdQ7Vu
-F6r7yJiIatnyfKH2cboZT7g440LX8NqxwCPf3dfxp+0Jj1agq8MLy6SSgIGSH6lv
-+Wwz3D5XxqfyH8wqfOQsTEZf6/Nh9yvENZ+NWPU6g0QO2JOsTGvMd/QDzczc4BxL
-XSXaPV7Od4rhPsbXlM1wSTz/Dr0ISKvlUhQVnQ6cGodWaK2cCQBk
------END CERTIFICATE-----`
-
-var comodoRoot = `-----BEGIN CERTIFICATE-----
-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
-gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
-BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
-MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
-YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
-RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
-UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
-2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
-Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
-+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
-DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
-nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
-/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
-PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
-QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
-SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
-IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
-RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
-zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
-BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
-ZQ==
------END CERTIFICATE-----`
-
-var nameConstraintsLeaf = `-----BEGIN CERTIFICATE-----
-MIIHMTCCBRmgAwIBAgIIIZaV/3ezOJkwDQYJKoZIhvcNAQEFBQAwgcsxCzAJBgNV
-BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTETMBEGA1UEBxMKQmxhY2tzYnVyZzEj
-MCEGA1UECxMaR2xvYmFsIFF1YWxpZmllZCBTZXJ2ZXIgQ0ExPDA6BgNVBAoTM1Zp
-cmdpbmlhIFBvbHl0ZWNobmljIEluc3RpdHV0ZSBhbmQgU3RhdGUgVW5pdmVyc2l0
-eTExMC8GA1UEAxMoVmlyZ2luaWEgVGVjaCBHbG9iYWwgUXVhbGlmaWVkIFNlcnZl
-ciBDQTAeFw0xMzA5MTkxNDM2NTVaFw0xNTA5MTkxNDM2NTVaMIHNMQswCQYDVQQG
-EwJVUzERMA8GA1UECAwIVmlyZ2luaWExEzARBgNVBAcMCkJsYWNrc2J1cmcxPDA6
-BgNVBAoMM1ZpcmdpbmlhIFBvbHl0ZWNobmljIEluc3RpdHV0ZSBhbmQgU3RhdGUg
-VW5pdmVyc2l0eTE7MDkGA1UECwwyVGVjaG5vbG9neS1lbmhhbmNlZCBMZWFybmlu
-ZyBhbmQgT25saW5lIFN0cmF0ZWdpZXMxGzAZBgNVBAMMEnNlY3VyZS5pZGRsLnZ0
-LmVkdTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkOyPpsOK/6IuPG
-WnIBlVwlHzeYf+cUlggqkLq0b0+vZbiTXgio9/VCuNQ8opSoss7J7o3ygV9to+9Y
-YwJKVC5WDT/y5JWpQey0CWILymViJnpNSwnxBc8A+Q8w5NUGDd/UhtPx/U8/hqbd
-WPDYj2hbOqyq8UlRhfS5pwtnv6BbCTaY11I6FhCLK7zttISyTuWCf9p9o/ggiipP
-ii/5oh4dkl+r5SfuSp5GPNHlYO8lWqys5NAPoDD4fc/kuflcK7Exx7XJ+Oqu0W0/
-psjEY/tES1ZgDWU/ParcxxFpFmKHbD5DXsfPOObzkVWXIY6tGMutSlE1Froy/Nn0
-OZsAOrcCAwEAAaOCAhMwggIPMIG4BggrBgEFBQcBAQSBqzCBqDBYBggrBgEFBQcw
-AoZMaHR0cDovL3d3dy5wa2kudnQuZWR1L2dsb2JhbHF1YWxpZmllZHNlcnZlci9j
-YWNlcnQvZ2xvYmFscXVhbGlmaWVkc2VydmVyLmNydDBMBggrBgEFBQcwAYZAaHR0
-cDovL3Z0Y2EtcC5lcHJvdi5zZXRpLnZ0LmVkdTo4MDgwL2VqYmNhL3B1YmxpY3dl
-Yi9zdGF0dXMvb2NzcDAdBgNVHQ4EFgQUp7xbO6iHkvtZbPE4jmndmnAbSEcwDAYD
-VR0TAQH/BAIwADAfBgNVHSMEGDAWgBS8YmAn1eM1SBfpS6tFatDIqHdxjDBqBgNV
-HSAEYzBhMA4GDCsGAQQBtGgFAgICATAOBgwrBgEEAbRoBQICAQEwPwYMKwYBBAG0
-aAUCAgMBMC8wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucGtpLnZ0LmVkdS9nbG9i
-YWwvY3BzLzBKBgNVHR8EQzBBMD+gPaA7hjlodHRwOi8vd3d3LnBraS52dC5lZHUv
-Z2xvYmFscXVhbGlmaWVkc2VydmVyL2NybC9jYWNybC5jcmwwDgYDVR0PAQH/BAQD
-AgTwMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAdBgNVHREEFjAUghJz
-ZWN1cmUuaWRkbC52dC5lZHUwDQYJKoZIhvcNAQEFBQADggIBAEgoYo4aUtatY3gI
-OyyKp7QlIOaLbTJZywESHqy+L5EGDdJW2DJV+mcE0LDGvqa2/1Lo+AR1ntsZwfOi
-Y718JwgVVaX/RCd5+QKP25c5/x72xI8hb/L1bgS0ED9b0YAhd7Qm1K1ot82+6mqX
-DW6WiGeDr8Z07MQ3143qQe2rBlq+QI69DYzm2GOqAIAnUIWv7tCyLUm31b4DwmrJ
-TeudVreTKUbBNB1TWRFHEPkWhjjXKZnNGRO11wHXcyBu6YekIvVZ+vmx8ePee4jJ
-3GFOi7lMuWOeq57jTVL7KOKaKLVXBb6gqo5aq+Wwt8RUD5MakrCAEeQZj7DKaFmZ
-oQCO0Pxrsl3InCGvxnGzT+bFVO9nJ/BAMj7hknFdm9Jr6Bg5q33Z+gnf909AD9QF
-ESqUSykaHu2LVdJx2MaCH1CyKnRgMw5tEwE15EXpUjCm24m8FMOYC+rNtf18pgrz
-5D8Jhh+oxK9PjcBYqXNtnioIxiMCYcV0q5d4w4BYFEh71tk7/bYB0R55CsBUVPmp
-timWNOdRd57Tfpk3USaVsumWZAf9MP3wPiC7gb4d5tYEEAG5BuDT8ruFw838wU8G
-1VvAVutSiYBg7k3NYO7AUqZ+Ax4klQX3aM9lgonmJ78Qt94UPtbptrfZ4/lSqEf8
-GBUwDrQNTb+gsXsDkjd5lcYxNx6l
------END CERTIFICATE-----`
-
-var nameConstraintsIntermediate1 = `-----BEGIN CERTIFICATE-----
-MIINLjCCDBagAwIBAgIRIqpyf/YoGgvHc8HiDAxAI8owDQYJKoZIhvcNAQEFBQAw
-XDELMAkGA1UEBhMCQkUxFTATBgNVBAsTDFRydXN0ZWQgUm9vdDEZMBcGA1UEChMQ
-R2xvYmFsU2lnbiBudi1zYTEbMBkGA1UEAxMSVHJ1c3RlZCBSb290IENBIEcyMB4X
-DTEyMTIxMzAwMDAwMFoXDTE3MTIxMzAwMDAwMFowgcsxCzAJBgNVBAYTAlVTMREw
-DwYDVQQIEwhWaXJnaW5pYTETMBEGA1UEBxMKQmxhY2tzYnVyZzEjMCEGA1UECxMa
-R2xvYmFsIFF1YWxpZmllZCBTZXJ2ZXIgQ0ExPDA6BgNVBAoTM1ZpcmdpbmlhIFBv
-bHl0ZWNobmljIEluc3RpdHV0ZSBhbmQgU3RhdGUgVW5pdmVyc2l0eTExMC8GA1UE
-AxMoVmlyZ2luaWEgVGVjaCBHbG9iYWwgUXVhbGlmaWVkIFNlcnZlciBDQTCCAiIw
-DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALgIZhEaptBWADBqdJ45ueFGzMXa
-GHnzNxoxR1fQIaaRQNdCg4cw3A4dWKMeEgYLtsp65ai3Xfw62Qaus0+KJ3RhgV+r
-ihqK81NUzkls78fJlADVDI4fCTlothsrE1CTOMiy97jKHai5mVTiWxmcxpmjv7fm
-5Nhc+uHgh2hIz6npryq495mD51ZrUTIaqAQN6Pw/VHfAmR524vgriTOjtp1t4lA9
-pXGWjF/vkhAKFFheOQSQ00rngo2wHgCqMla64UTN0oz70AsCYNZ3jDLx0kOP0YmM
-R3Ih91VA63kLqPXA0R6yxmmhhxLZ5bcyAy1SLjr1N302MIxLM/pSy6aquEnbELhz
-qyp9yGgRyGJay96QH7c4RJY6gtcoPDbldDcHI9nXngdAL4DrZkJ9OkDkJLyqG66W
-ZTF5q4EIs6yMdrywz0x7QP+OXPJrjYpbeFs6tGZCFnWPFfmHCRJF8/unofYrheq+
-9J7Jx3U55S/k57NXbAM1RAJOuMTlfn9Etf9Dpoac9poI4Liav6rBoUQk3N3JWqnV
-HNx/NdCyJ1/6UbKMJUZsStAVglsi6lVPo289HHOE4f7iwl3SyekizVOp01wUin3y
-cnbZB/rXmZbwapSxTTSBf0EIOr9i4EGfnnhCAVA9U5uLrI5OEB69IY8PNX0071s3
-Z2a2fio5c8m3JkdrAgMBAAGjggh5MIIIdTAOBgNVHQ8BAf8EBAMCAQYwTAYDVR0g
-BEUwQzBBBgkrBgEEAaAyATwwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xv
-YmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wEgYDVR0TAQH/BAgwBgEB/wIBADCCBtAG
-A1UdHgSCBscwggbDoIIGvzASghAzZGJsYWNrc2J1cmcub3JnMBiCFmFjY2VsZXJh
-dGV2aXJnaW5pYS5jb20wGIIWYWNjZWxlcmF0ZXZpcmdpbmlhLm9yZzALgglhY3Zj
-cC5vcmcwCYIHYmV2Lm5ldDAJggdiZXYub3JnMAuCCWNsaWdzLm9yZzAMggpjbWl3
-ZWIub3JnMBeCFWVhc3Rlcm5icm9va3Ryb3V0Lm5ldDAXghVlYXN0ZXJuYnJvb2t0
-cm91dC5vcmcwEYIPZWNvcnJpZG9ycy5pbmZvMBOCEWVkZ2FycmVzZWFyY2gub3Jn
-MBKCEGdldC1lZHVjYXRlZC5jb20wE4IRZ2V0LWVkdWNhdGVkLmluZm8wEYIPZ2V0
-ZWR1Y2F0ZWQubmV0MBKCEGdldC1lZHVjYXRlZC5uZXQwEYIPZ2V0ZWR1Y2F0ZWQu
-b3JnMBKCEGdldC1lZHVjYXRlZC5vcmcwD4INaG9raWVjbHViLmNvbTAQgg5ob2tp
-ZXBob3RvLmNvbTAPgg1ob2tpZXNob3AuY29tMBGCD2hva2llc3BvcnRzLmNvbTAS
-ghBob2tpZXRpY2tldHMuY29tMBKCEGhvdGVscm9hbm9rZS5jb20wE4IRaHVtYW53
-aWxkbGlmZS5vcmcwF4IVaW5uYXR2aXJnaW5pYXRlY2guY29tMA+CDWlzY2hwMjAx
-MS5vcmcwD4INbGFuZHJlaGFiLm9yZzAggh5uYXRpb25hbHRpcmVyZXNlYXJjaGNl
-bnRlci5jb20wFYITbmV0d29ya3ZpcmdpbmlhLm5ldDAMggpwZHJjdnQuY29tMBiC
-FnBldGVkeWVyaXZlcmNvdXJzZS5jb20wDYILcmFkaW9pcS5vcmcwFYITcml2ZXJj
-b3Vyc2Vnb2xmLmNvbTALgglzZGltaS5vcmcwEIIOc292YW1vdGlvbi5jb20wHoIc
-c3VzdGFpbmFibGUtYmlvbWF0ZXJpYWxzLmNvbTAeghxzdXN0YWluYWJsZS1iaW9t
-YXRlcmlhbHMub3JnMBWCE3RoaXNpc3RoZWZ1dHVyZS5jb20wGIIWdGhpcy1pcy10
-aGUtZnV0dXJlLmNvbTAVghN0aGlzaXN0aGVmdXR1cmUubmV0MBiCFnRoaXMtaXMt
-dGhlLWZ1dHVyZS5uZXQwCoIIdmFkcy5vcmcwDIIKdmFsZWFmLm9yZzANggt2YXRl
-Y2guaW5mbzANggt2YXRlY2gubW9iaTAcghp2YXRlY2hsaWZlbG9uZ2xlYXJuaW5n
-LmNvbTAcghp2YXRlY2hsaWZlbG9uZ2xlYXJuaW5nLm5ldDAcghp2YXRlY2hsaWZl
-bG9uZ2xlYXJuaW5nLm9yZzAKggh2Y29tLmVkdTASghB2aXJnaW5pYXZpZXcubmV0
-MDSCMnZpcmdpbmlhcG9seXRlY2huaWNpbnN0aXR1dGVhbmRzdGF0ZXVuaXZlcnNp
-dHkuY29tMDWCM3ZpcmdpbmlhcG9seXRlY2huaWNpbnN0aXR1dGVhbmRzdGF0ZXVu
-aXZlcnNpdHkuaW5mbzA0gjJ2aXJnaW5pYXBvbHl0ZWNobmljaW5zdGl0dXRlYW5k
-c3RhdGV1bml2ZXJzaXR5Lm5ldDA0gjJ2aXJnaW5pYXBvbHl0ZWNobmljaW5zdGl0
-dXRlYW5kc3RhdGV1bml2ZXJzaXR5Lm9yZzAZghd2aXJnaW5pYXB1YmxpY3JhZGlv
-Lm9yZzASghB2aXJnaW5pYXRlY2guZWR1MBOCEXZpcmdpbmlhdGVjaC5tb2JpMByC
-GnZpcmdpbmlhdGVjaGZvdW5kYXRpb24ub3JnMAiCBnZ0LmVkdTALggl2dGFyYy5v
-cmcwDIIKdnQtYXJjLm9yZzALggl2dGNyYy5jb20wCoIIdnRpcC5vcmcwDIIKdnRs
-ZWFuLm9yZzAWghR2dGtub3dsZWRnZXdvcmtzLmNvbTAYghZ2dGxpZmVsb25nbGVh
-cm5pbmcuY29tMBiCFnZ0bGlmZWxvbmdsZWFybmluZy5uZXQwGIIWdnRsaWZlbG9u
-Z2xlYXJuaW5nLm9yZzATghF2dHNwb3J0c21lZGlhLmNvbTALggl2dHdlaS5jb20w
-D4INd2l3YXR3ZXJjLmNvbTAKggh3dnRmLm9yZzAIgQZ2dC5lZHUwd6R1MHMxCzAJ
-BgNVBAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTETMBEGA1UEBxMKQmxhY2tzYnVy
-ZzE8MDoGA1UEChMzVmlyZ2luaWEgUG9seXRlY2huaWMgSW5zdGl0dXRlIGFuZCBT
-dGF0ZSBVbml2ZXJzaXR5MCcGA1UdJQQgMB4GCCsGAQUFBwMCBggrBgEFBQcDAQYI
-KwYBBQUHAwkwPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2NybC5nbG9iYWxzaWdu
-LmNvbS9ncy90cnVzdHJvb3RnMi5jcmwwgYQGCCsGAQUFBwEBBHgwdjAzBggrBgEF
-BQcwAYYnaHR0cDovL29jc3AyLmdsb2JhbHNpZ24uY29tL3RydXN0cm9vdGcyMD8G
-CCsGAQUFBzAChjNodHRwOi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC90
-cnVzdHJvb3RnMi5jcnQwHQYDVR0OBBYEFLxiYCfV4zVIF+lLq0Vq0Miod3GMMB8G
-A1UdIwQYMBaAFBT25YsxtkWASkxt/MKHico2w5BiMA0GCSqGSIb3DQEBBQUAA4IB
-AQAyJm/lOB2Er4tHXhc/+fSufSzgjohJgYfMkvG4LknkvnZ1BjliefR8tTXX49d2
-SCDFWfGjqyJZwavavkl/4p3oXPG/nAMDMvxh4YAT+CfEK9HH+6ICV087kD4BLegi
-+aFJMj8MMdReWCzn5sLnSR1rdse2mo2arX3Uod14SW+PGrbUmTuWNyvRbz3fVmxp
-UdbGmj3laknO9YPsBGgHfv73pVVsTJkW4ZfY/7KdD/yaVv6ophpOB3coXfjl2+kd
-Z4ypn2zK+cx9IL/LSewqd/7W9cD55PCUy4X9OTbEmAccwiz3LB66mQoUGfdHdkoB
-jUY+v9vLQXmaVwI0AYL7g9LN
------END CERTIFICATE-----`
-
-var nameConstraintsIntermediate2 = `-----BEGIN CERTIFICATE-----
-MIIEXTCCA0WgAwIBAgILBAAAAAABNuk6OrMwDQYJKoZIhvcNAQEFBQAwVzELMAkG
-A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
-b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xMjA0MjUxMTAw
-MDBaFw0yNzA0MjUxMTAwMDBaMFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVz
-dGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRy
-dXN0ZWQgUm9vdCBDQSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AKyuvqrtcMr7g7EuNbu4sKwxM127UsCmx1RxbxxgcArGS7rjiefpBH/w4LYrymjf
-vcw1ueyMNoqLo9nJMz/ORXupb35NNfE667prQYHa+tTjl1IiKpB7QUwt3wXPuTMF
-Ja1tXtjKzkqJyuJlNuPKT76HcjgNqgV1s9qG44MD5I2JvI12du8zI1bgdQ+l/KsX
-kTfbGjUvhOLOlVNWVQDpL+YMIrGqgBYxy5TUNgrAcRtwpNdS2KkF5otSmMweVb5k
-hoUVv3u8UxQH/WWbNhHq1RrIlg/0rBUfi/ziShYFSB7U+aLx5DxPphTFBiDquQGp
-tB+FC4JvnukDStFihZCZ1R8CAwEAAaOCASMwggEfMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MEcGA1UdIARAMD4wPAYEVR0gADA0MDIGCCsGAQUFBwIB
-FiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzAdBgNVHQ4E
-FgQUFPblizG2RYBKTG38woeJyjbDkGIwMwYDVR0fBCwwKjAooCagJIYiaHR0cDov
-L2NybC5nbG9iYWxzaWduLm5ldC9yb290LmNybDA+BggrBgEFBQcBAQQyMDAwLgYI
-KwYBBQUHMAGGImh0dHA6Ly9vY3NwMi5nbG9iYWxzaWduLmNvbS9yb290cjEwHwYD
-VR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZIhvcNAQEFBQADggEB
-AL7IG0l+k4LkcpI+a/kvZsSRwSM4uA6zGX34e78A2oytr8RG8bJwVb8+AHMUD+Xe
-2kYdh/Uj/waQXfqR0OgxQXL9Ct4ZM+JlR1avsNKXWL5AwYXAXCOB3J5PW2XOck7H
-Zw0vRbGQhjWjQx+B4KOUFg1b3ov/z6Xkr3yaCfRQhXh7KC0Bc0RXPPG5Nv5lCW+z
-tbbg0zMm3kyfQITRusMSg6IBsDJqOnjaiaKQRcXiD0Sk43ZXb2bUKMxC7+Td3QL4
-RyHcWJbQ7YylLTS/x+jxWIcOQ0oO5/54t5PTQ14neYhOz9x4gUk2AYAW6d1vePwb
-hcC8roQwkHT7HvfYBoc74FM=
------END CERTIFICATE-----`
-
-var globalSignRoot = `-----BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
-A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
-b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
-MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
-YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
-aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
-jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
-xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
-1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
-snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
-U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
-9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
-BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
-AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
-yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
-38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
-AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
-DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
-HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
------END CERTIFICATE-----`
-
-var moipLeafCert = `-----BEGIN CERTIFICATE-----
-MIIGQDCCBSigAwIBAgIRAPe/cwh7CUWizo8mYSDavLIwDQYJKoZIhvcNAQELBQAw
-gZIxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
-BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTgwNgYD
-VQQDEy9DT01PRE8gUlNBIEV4dGVuZGVkIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZl
-ciBDQTAeFw0xMzA4MTUwMDAwMDBaFw0xNDA4MTUyMzU5NTlaMIIBQjEXMBUGA1UE
-BRMOMDg3MTg0MzEwMDAxMDgxEzARBgsrBgEEAYI3PAIBAxMCQlIxGjAYBgsrBgEE
-AYI3PAIBAhMJU2FvIFBhdWxvMR0wGwYDVQQPExRQcml2YXRlIE9yZ2FuaXphdGlv
-bjELMAkGA1UEBhMCQlIxETAPBgNVBBETCDAxNDUyMDAwMRIwEAYDVQQIEwlTYW8g
-UGF1bG8xEjAQBgNVBAcTCVNhbyBQYXVsbzEtMCsGA1UECRMkQXZlbmlkYSBCcmln
-YWRlaXJvIEZhcmlhIExpbWEgLCAyOTI3MR0wGwYDVQQKExRNb2lwIFBhZ2FtZW50
-b3MgUy5BLjENMAsGA1UECxMETU9JUDEYMBYGA1UECxMPU1NMIEJsaW5kYWRvIEVW
-MRgwFgYDVQQDEw9hcGkubW9pcC5jb20uYnIwggEiMA0GCSqGSIb3DQEBAQUAA4IB
-DwAwggEKAoIBAQDN0b9x6TrXXA9hPCF8/NjqGJ++2D4LO4ZiMFTjs0VwpXy2Y1Oe
-s74/HuiLGnAHxTmAtV7IpZMibiOcTxcnDYp9oEWkf+gR+hZvwFZwyOBC7wyb3SR3
-UvV0N1ZbEVRYpN9kuX/3vjDghjDmzzBwu8a/T+y5JTym5uiJlngVAWyh/RjtIvYi
-+NVkQMbyVlPGkoCe6c30pH8DKYuUCZU6DHjUsPTX3jAskqbhDSAnclX9iX0p2bmw
-KVBc+5Vh/2geyzDuquF0w+mNIYdU5h7uXvlmJnf3d2Cext5dxdL8/jezD3U0dAqI
-pYSKERbyxSkJWxdvRlhdpM9YXMJcpc88xNp1AgMBAAGjggHcMIIB2DAfBgNVHSME
-GDAWgBQ52v/KKBSKqHQTCLnkDqnS+n6daTAdBgNVHQ4EFgQU/lXuOa7DMExzZjRj
-LQWcMWGZY7swDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAwHQYDVR0lBBYw
-FAYIKwYBBQUHAwEGCCsGAQUFBwMCMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQUB
-MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5jb20vQ1BTMFYG
-A1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT
-QUV4dGVuZGVkVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNybDCBhwYIKwYBBQUH
-AQEEezB5MFEGCCsGAQUFBzAChkVodHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9DT01P
-RE9SU0FFeHRlbmRlZFZhbGlkYXRpb25TZWN1cmVTZXJ2ZXJDQS5jcnQwJAYIKwYB
-BQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTAvBgNVHREEKDAmgg9hcGku
-bW9pcC5jb20uYnKCE3d3dy5hcGkubW9pcC5jb20uYnIwDQYJKoZIhvcNAQELBQAD
-ggEBAFoTmPlaDcf+nudhjXHwud8g7/LRyA8ucb+3/vfmgbn7FUc1eprF5sJS1mA+
-pbiTyXw4IxcJq2KUj0Nw3IPOe9k84mzh+XMmdCKH+QK3NWkE9Udz+VpBOBc0dlqC
-1RH5umStYDmuZg/8/r652eeQ5kUDcJyADfpKWBgDPYaGtwzKVT4h3Aok9SLXRHx6
-z/gOaMjEDMarMCMw4VUIG1pvNraZrG5oTaALPaIXXpd8VqbQYPudYJ6fR5eY3FeW
-H/ofbYFdRcuD26MfBFWE9VGGral9Fgo8sEHffho+UWhgApuQV4/l5fMzxB5YBXyQ
-jhuy8PqqZS9OuLilTeLu4a8z2JI=
------END CERTIFICATE-----`
-
-var comodoIntermediateSHA384 = `-----BEGIN CERTIFICATE-----
-MIIGDjCCA/agAwIBAgIQBqdDgNTr/tQ1taP34Wq92DANBgkqhkiG9w0BAQwFADCB
-hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
-BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTIwMjEy
-MDAwMDAwWhcNMjcwMjExMjM1OTU5WjCBkjELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
-EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
-Q09NT0RPIENBIExpbWl0ZWQxODA2BgNVBAMTL0NPTU9ETyBSU0EgRXh0ZW5kZWQg
-VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAlVbeVLTf1QJJe9FbXKKyHo+cK2JMK40SKPMalaPGEP0p3uGf
-CzhAk9HvbpUQ/OGQF3cs7nU+e2PsYZJuTzurgElr3wDqAwB/L3XVKC/sVmePgIOj
-vdwDmZOLlJFWW6G4ajo/Br0OksxgnP214J9mMF/b5pTwlWqvyIqvgNnmiDkBfBzA
-xSr3e5Wg8narbZtyOTDr0VdVAZ1YEZ18bYSPSeidCfw8/QpKdhQhXBZzQCMZdMO6
-WAqmli7eNuWf0MLw4eDBYuPCGEUZUaoXHugjddTI0JYT/8ck0YwLJ66eetw6YWNg
-iJctXQUL5Tvrrs46R3N2qPos3cCHF+msMJn4HwIDAQABo4IBaTCCAWUwHwYDVR0j
-BBgwFoAUu69+Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFDna/8ooFIqodBMI
-ueQOqdL6fp1pMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMD4G
-A1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5j
-b21vZG8uY29tL0NQUzBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9k
-b2NhLmNvbS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggr
-BgEFBQcBAQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29t
-L0NPTU9ET1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz
-cC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIBAERCnUFRK0iIXZebeV4R
-AUpSGXtBLMeJPNBy3IX6WK/VJeQT+FhlZ58N/1eLqYVeyqZLsKeyLeCMIs37/3mk
-jCuN/gI9JN6pXV/kD0fQ22YlPodHDK4ixVAihNftSlka9pOlk7DgG4HyVsTIEFPk
-1Hax0VtpS3ey4E/EhOfUoFDuPPpE/NBXueEoU/1Tzdy5H3pAvTA/2GzS8+cHnx8i
-teoiccsq8FZ8/qyo0QYPFBRSTP5kKwxpKrgNUG4+BAe/eiCL+O5lCeHHSQgyPQ0o
-fkkdt0rvAucNgBfIXOBhYsvss2B5JdoaZXOcOBCgJjqwyBZ9kzEi7nQLiMBciUEA
-KKlHMd99SUWa9eanRRrSjhMQ34Ovmw2tfn6dNVA0BM7pINae253UqNpktNEvWS5e
-ojZh1CSggjMziqHRbO9haKPl0latxf1eYusVqHQSTC8xjOnB3xBLAer2VBvNfzu9
-XJ/B288ByvK6YBIhMe2pZLiySVgXbVrXzYxtvp5/4gJYp9vDLVj2dAZqmvZh+fYA
-tmnYOosxWd2R5nwnI4fdAw+PKowegwFOAWEMUnNt/AiiuSpm5HZNMaBWm9lTjaK2
-jwLI5jqmBNFI+8NKAnb9L9K8E7bobTQk+p0pisehKxTxlgBzuRPpwLk6R1YCcYAn
-pLwltum95OmYdBbxN4SBB7SC
------END CERTIFICATE-----`
-
-const comodoRSAAuthority = `-----BEGIN CERTIFICATE-----
-MIIFdDCCBFygAwIBAgIQJ2buVutJ846r13Ci/ITeIjANBgkqhkiG9w0BAQwFADBv
-MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
-ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF
-eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow
-gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
-BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD
-VQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkq
-hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkehUktIKVrGsDSTdxc9EZ3SZKzejfSNw
-AHG8U9/E+ioSj0t/EFa9n3Byt2F/yUsPF6c947AEYe7/EZfH9IY+Cvo+XPmT5jR6
-2RRr55yzhaCCenavcZDX7P0N+pxs+t+wgvQUfvm+xKYvT3+Zf7X8Z0NyvQwA1onr
-ayzT7Y+YHBSrfuXjbvzYqOSSJNpDa2K4Vf3qwbxstovzDo2a5JtsaZn4eEgwRdWt
-4Q08RWD8MpZRJ7xnw8outmvqRsfHIKCxH2XeSAi6pE6p8oNGN4Tr6MyBSENnTnIq
-m1y9TBsoilwie7SrmNnu4FGDwwlGTm0+mfqVF9p8M1dBPI1R7Qu2XK8sYxrfV8g/
-vOldxJuvRZnio1oktLqpVj3Pb6r/SVi+8Kj/9Lit6Tf7urj0Czr56ENCHonYhMsT
-8dm74YlguIwoVqwUHZwK53Hrzw7dPamWoUi9PPevtQ0iTMARgexWO/bTouJbt7IE
-IlKVgJNp6I5MZfGRAy1wdALqi2cVKWlSArvX31BqVUa/oKMoYX9w0MOiqiwhqkfO
-KJwGRXa/ghgntNWutMtQ5mv0TIZxMOmm3xaG4Nj/QN370EKIf6MzOi5cHkERgWPO
-GHFrK+ymircxXDpqR+DDeVnWIBqv8mqYqnK8V0rSS527EPywTEHl7R09XiidnMy/
-s1Hap0flhFMCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTvA73g
-JMtUGjAdBgNVHQ4EFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQD
-AgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1UdHwQ9
-MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4dGVy
-bmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6
-Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAGS/g/FfmoXQ
-zbihKVcN6Fr30ek+8nYEbvFScLsePP9NDXRqzIGCJdPDoCpdTPW6i6FtxFQJdcfj
-Jw5dhHk3QBN39bSsHNA7qxcS1u80GH4r6XnTq1dFDK8o+tDb5VCViLvfhVdpfZLY
-Uspzgb8c8+a4bmYRBbMelC1/kZWSWfFMzqORcUx8Rww7Cxn2obFshj5cqsQugsv5
-B5a6SE2Q8pTIqXOi6wZ7I53eovNNVZ96YUWYGGjHXkBrI/V5eu+MtWuLt29G9Hvx
-PUsE2JOAWVrgQSQdso8VYFhH2+9uRv0V9dlfmrPb2LjkQLPNlzmuhbsdjrzch5vR
-pu/xO28QOG8=
------END CERTIFICATE-----`
-
-const addTrustRoot = `-----BEGIN CERTIFICATE-----
-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
-MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
-IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
-MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
-FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
-bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
-dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
-H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
-uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
-mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
-a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
-E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
-WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
-VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
-Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
-cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
-IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
-AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
-YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
-6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
-Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
-c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
-mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
------END CERTIFICATE-----`
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/x509.go b/third_party/gofrontend/libgo/go/crypto/x509/x509.go
deleted file mode 100644
index be6c013..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/x509.go
+++ /dev/null
@@ -1,2028 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package x509 parses X.509-encoded keys and certificates.
-package x509
-
-import (
-	"bytes"
-	"crypto"
-	"crypto/dsa"
-	"crypto/ecdsa"
-	"crypto/elliptic"
-	"crypto/rsa"
-	_ "crypto/sha1"
-	_ "crypto/sha256"
-	_ "crypto/sha512"
-	"crypto/x509/pkix"
-	"encoding/asn1"
-	"encoding/pem"
-	"errors"
-	"io"
-	"math/big"
-	"net"
-	"strconv"
-	"time"
-)
-
-// pkixPublicKey reflects a PKIX public key structure. See SubjectPublicKeyInfo
-// in RFC 3280.
-type pkixPublicKey struct {
-	Algo      pkix.AlgorithmIdentifier
-	BitString asn1.BitString
-}
-
-// ParsePKIXPublicKey parses a DER encoded public key. These values are
-// typically found in PEM blocks with "BEGIN PUBLIC KEY".
-func ParsePKIXPublicKey(derBytes []byte) (pub interface{}, err error) {
-	var pki publicKeyInfo
-	if rest, err := asn1.Unmarshal(derBytes, &pki); err != nil {
-		return nil, err
-	} else if len(rest) != 0 {
-		return nil, errors.New("x509: trailing data after ASN.1 of public-key")
-	}
-	algo := getPublicKeyAlgorithmFromOID(pki.Algorithm.Algorithm)
-	if algo == UnknownPublicKeyAlgorithm {
-		return nil, errors.New("x509: unknown public key algorithm")
-	}
-	return parsePublicKey(algo, &pki)
-}
-
-func marshalPublicKey(pub interface{}) (publicKeyBytes []byte, publicKeyAlgorithm pkix.AlgorithmIdentifier, err error) {
-	switch pub := pub.(type) {
-	case *rsa.PublicKey:
-		publicKeyBytes, err = asn1.Marshal(rsaPublicKey{
-			N: pub.N,
-			E: pub.E,
-		})
-		publicKeyAlgorithm.Algorithm = oidPublicKeyRSA
-		// This is a NULL parameters value which is technically
-		// superfluous, but most other code includes it and, by
-		// doing this, we match their public key hashes.
-		publicKeyAlgorithm.Parameters = asn1.RawValue{
-			Tag: 5,
-		}
-	case *ecdsa.PublicKey:
-		publicKeyBytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y)
-		oid, ok := oidFromNamedCurve(pub.Curve)
-		if !ok {
-			return nil, pkix.AlgorithmIdentifier{}, errors.New("x509: unsupported elliptic curve")
-		}
-		publicKeyAlgorithm.Algorithm = oidPublicKeyECDSA
-		var paramBytes []byte
-		paramBytes, err = asn1.Marshal(oid)
-		if err != nil {
-			return
-		}
-		publicKeyAlgorithm.Parameters.FullBytes = paramBytes
-	default:
-		return nil, pkix.AlgorithmIdentifier{}, errors.New("x509: only RSA and ECDSA public keys supported")
-	}
-
-	return publicKeyBytes, publicKeyAlgorithm, nil
-}
-
-// MarshalPKIXPublicKey serialises a public key to DER-encoded PKIX format.
-func MarshalPKIXPublicKey(pub interface{}) ([]byte, error) {
-	var publicKeyBytes []byte
-	var publicKeyAlgorithm pkix.AlgorithmIdentifier
-	var err error
-
-	if publicKeyBytes, publicKeyAlgorithm, err = marshalPublicKey(pub); err != nil {
-		return nil, err
-	}
-
-	pkix := pkixPublicKey{
-		Algo: publicKeyAlgorithm,
-		BitString: asn1.BitString{
-			Bytes:     publicKeyBytes,
-			BitLength: 8 * len(publicKeyBytes),
-		},
-	}
-
-	ret, _ := asn1.Marshal(pkix)
-	return ret, nil
-}
-
-// These structures reflect the ASN.1 structure of X.509 certificates.:
-
-type certificate struct {
-	Raw                asn1.RawContent
-	TBSCertificate     tbsCertificate
-	SignatureAlgorithm pkix.AlgorithmIdentifier
-	SignatureValue     asn1.BitString
-}
-
-type tbsCertificate struct {
-	Raw                asn1.RawContent
-	Version            int `asn1:"optional,explicit,default:1,tag:0"`
-	SerialNumber       *big.Int
-	SignatureAlgorithm pkix.AlgorithmIdentifier
-	Issuer             asn1.RawValue
-	Validity           validity
-	Subject            asn1.RawValue
-	PublicKey          publicKeyInfo
-	UniqueId           asn1.BitString   `asn1:"optional,tag:1"`
-	SubjectUniqueId    asn1.BitString   `asn1:"optional,tag:2"`
-	Extensions         []pkix.Extension `asn1:"optional,explicit,tag:3"`
-}
-
-type dsaAlgorithmParameters struct {
-	P, Q, G *big.Int
-}
-
-type dsaSignature struct {
-	R, S *big.Int
-}
-
-type ecdsaSignature dsaSignature
-
-type validity struct {
-	NotBefore, NotAfter time.Time
-}
-
-type publicKeyInfo struct {
-	Raw       asn1.RawContent
-	Algorithm pkix.AlgorithmIdentifier
-	PublicKey asn1.BitString
-}
-
-// RFC 5280,  4.2.1.1
-type authKeyId struct {
-	Id []byte `asn1:"optional,tag:0"`
-}
-
-type SignatureAlgorithm int
-
-const (
-	UnknownSignatureAlgorithm SignatureAlgorithm = iota
-	MD2WithRSA
-	MD5WithRSA
-	SHA1WithRSA
-	SHA256WithRSA
-	SHA384WithRSA
-	SHA512WithRSA
-	DSAWithSHA1
-	DSAWithSHA256
-	ECDSAWithSHA1
-	ECDSAWithSHA256
-	ECDSAWithSHA384
-	ECDSAWithSHA512
-)
-
-type PublicKeyAlgorithm int
-
-const (
-	UnknownPublicKeyAlgorithm PublicKeyAlgorithm = iota
-	RSA
-	DSA
-	ECDSA
-)
-
-// OIDs for signature algorithms
-//
-// pkcs-1 OBJECT IDENTIFIER ::= {
-//    iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 }
-//
-//
-// RFC 3279 2.2.1 RSA Signature Algorithms
-//
-// md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 }
-//
-// md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 }
-//
-// sha-1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 }
-//
-// dsaWithSha1 OBJECT IDENTIFIER ::= {
-//    iso(1) member-body(2) us(840) x9-57(10040) x9cm(4) 3 }
-//
-// RFC 3279 2.2.3 ECDSA Signature Algorithm
-//
-// ecdsa-with-SHA1 OBJECT IDENTIFIER ::= {
-// 	  iso(1) member-body(2) us(840) ansi-x962(10045)
-//    signatures(4) ecdsa-with-SHA1(1)}
-//
-//
-// RFC 4055 5 PKCS #1 Version 1.5
-//
-// sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 }
-//
-// sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 }
-//
-// sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 }
-//
-//
-// RFC 5758 3.1 DSA Signature Algorithms
-//
-// dsaWithSha256 OBJECT IDENTIFIER ::= {
-//    joint-iso-ccitt(2) country(16) us(840) organization(1) gov(101)
-//    csor(3) algorithms(4) id-dsa-with-sha2(3) 2}
-//
-// RFC 5758 3.2 ECDSA Signature Algorithm
-//
-// ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2)
-//    us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 }
-//
-// ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2)
-//    us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 }
-//
-// ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2)
-//    us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 }
-
-var (
-	oidSignatureMD2WithRSA      = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 2}
-	oidSignatureMD5WithRSA      = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 4}
-	oidSignatureSHA1WithRSA     = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5}
-	oidSignatureSHA256WithRSA   = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 11}
-	oidSignatureSHA384WithRSA   = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 12}
-	oidSignatureSHA512WithRSA   = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 13}
-	oidSignatureDSAWithSHA1     = asn1.ObjectIdentifier{1, 2, 840, 10040, 4, 3}
-	oidSignatureDSAWithSHA256   = asn1.ObjectIdentifier{2, 16, 840, 1, 101, 4, 3, 2}
-	oidSignatureECDSAWithSHA1   = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 1}
-	oidSignatureECDSAWithSHA256 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 2}
-	oidSignatureECDSAWithSHA384 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 3}
-	oidSignatureECDSAWithSHA512 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 4}
-)
-
-var signatureAlgorithmDetails = []struct {
-	algo       SignatureAlgorithm
-	oid        asn1.ObjectIdentifier
-	pubKeyAlgo PublicKeyAlgorithm
-	hash       crypto.Hash
-}{
-	{MD2WithRSA, oidSignatureMD2WithRSA, RSA, crypto.Hash(0) /* no value for MD2 */},
-	{MD5WithRSA, oidSignatureMD5WithRSA, RSA, crypto.MD5},
-	{SHA1WithRSA, oidSignatureSHA1WithRSA, RSA, crypto.SHA1},
-	{SHA256WithRSA, oidSignatureSHA256WithRSA, RSA, crypto.SHA256},
-	{SHA384WithRSA, oidSignatureSHA384WithRSA, RSA, crypto.SHA384},
-	{SHA512WithRSA, oidSignatureSHA512WithRSA, RSA, crypto.SHA512},
-	{DSAWithSHA1, oidSignatureDSAWithSHA1, DSA, crypto.SHA1},
-	{DSAWithSHA256, oidSignatureDSAWithSHA256, DSA, crypto.SHA256},
-	{ECDSAWithSHA1, oidSignatureECDSAWithSHA1, ECDSA, crypto.SHA1},
-	{ECDSAWithSHA256, oidSignatureECDSAWithSHA256, ECDSA, crypto.SHA256},
-	{ECDSAWithSHA384, oidSignatureECDSAWithSHA384, ECDSA, crypto.SHA384},
-	{ECDSAWithSHA512, oidSignatureECDSAWithSHA512, ECDSA, crypto.SHA512},
-}
-
-func getSignatureAlgorithmFromOID(oid asn1.ObjectIdentifier) SignatureAlgorithm {
-	for _, details := range signatureAlgorithmDetails {
-		if oid.Equal(details.oid) {
-			return details.algo
-		}
-	}
-	return UnknownSignatureAlgorithm
-}
-
-// RFC 3279, 2.3 Public Key Algorithms
-//
-// pkcs-1 OBJECT IDENTIFIER ::== { iso(1) member-body(2) us(840)
-//    rsadsi(113549) pkcs(1) 1 }
-//
-// rsaEncryption OBJECT IDENTIFIER ::== { pkcs1-1 1 }
-//
-// id-dsa OBJECT IDENTIFIER ::== { iso(1) member-body(2) us(840)
-//    x9-57(10040) x9cm(4) 1 }
-//
-// RFC 5480, 2.1.1 Unrestricted Algorithm Identifier and Parameters
-//
-// id-ecPublicKey OBJECT IDENTIFIER ::= {
-//       iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 }
-var (
-	oidPublicKeyRSA   = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1}
-	oidPublicKeyDSA   = asn1.ObjectIdentifier{1, 2, 840, 10040, 4, 1}
-	oidPublicKeyECDSA = asn1.ObjectIdentifier{1, 2, 840, 10045, 2, 1}
-)
-
-func getPublicKeyAlgorithmFromOID(oid asn1.ObjectIdentifier) PublicKeyAlgorithm {
-	switch {
-	case oid.Equal(oidPublicKeyRSA):
-		return RSA
-	case oid.Equal(oidPublicKeyDSA):
-		return DSA
-	case oid.Equal(oidPublicKeyECDSA):
-		return ECDSA
-	}
-	return UnknownPublicKeyAlgorithm
-}
-
-// RFC 5480, 2.1.1.1. Named Curve
-//
-// secp224r1 OBJECT IDENTIFIER ::= {
-//   iso(1) identified-organization(3) certicom(132) curve(0) 33 }
-//
-// secp256r1 OBJECT IDENTIFIER ::= {
-//   iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3)
-//   prime(1) 7 }
-//
-// secp384r1 OBJECT IDENTIFIER ::= {
-//   iso(1) identified-organization(3) certicom(132) curve(0) 34 }
-//
-// secp521r1 OBJECT IDENTIFIER ::= {
-//   iso(1) identified-organization(3) certicom(132) curve(0) 35 }
-//
-// NB: secp256r1 is equivalent to prime256v1
-var (
-	oidNamedCurveP224 = asn1.ObjectIdentifier{1, 3, 132, 0, 33}
-	oidNamedCurveP256 = asn1.ObjectIdentifier{1, 2, 840, 10045, 3, 1, 7}
-	oidNamedCurveP384 = asn1.ObjectIdentifier{1, 3, 132, 0, 34}
-	oidNamedCurveP521 = asn1.ObjectIdentifier{1, 3, 132, 0, 35}
-)
-
-func namedCurveFromOID(oid asn1.ObjectIdentifier) elliptic.Curve {
-	switch {
-	case oid.Equal(oidNamedCurveP224):
-		return elliptic.P224()
-	case oid.Equal(oidNamedCurveP256):
-		return elliptic.P256()
-	case oid.Equal(oidNamedCurveP384):
-		return elliptic.P384()
-	case oid.Equal(oidNamedCurveP521):
-		return elliptic.P521()
-	}
-	return nil
-}
-
-func oidFromNamedCurve(curve elliptic.Curve) (asn1.ObjectIdentifier, bool) {
-	switch curve {
-	case elliptic.P224():
-		return oidNamedCurveP224, true
-	case elliptic.P256():
-		return oidNamedCurveP256, true
-	case elliptic.P384():
-		return oidNamedCurveP384, true
-	case elliptic.P521():
-		return oidNamedCurveP521, true
-	}
-
-	return nil, false
-}
-
-// KeyUsage represents the set of actions that are valid for a given key. It's
-// a bitmap of the KeyUsage* constants.
-type KeyUsage int
-
-const (
-	KeyUsageDigitalSignature KeyUsage = 1 << iota
-	KeyUsageContentCommitment
-	KeyUsageKeyEncipherment
-	KeyUsageDataEncipherment
-	KeyUsageKeyAgreement
-	KeyUsageCertSign
-	KeyUsageCRLSign
-	KeyUsageEncipherOnly
-	KeyUsageDecipherOnly
-)
-
-// RFC 5280, 4.2.1.12  Extended Key Usage
-//
-// anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 }
-//
-// id-kp OBJECT IDENTIFIER ::= { id-pkix 3 }
-//
-// id-kp-serverAuth             OBJECT IDENTIFIER ::= { id-kp 1 }
-// id-kp-clientAuth             OBJECT IDENTIFIER ::= { id-kp 2 }
-// id-kp-codeSigning            OBJECT IDENTIFIER ::= { id-kp 3 }
-// id-kp-emailProtection        OBJECT IDENTIFIER ::= { id-kp 4 }
-// id-kp-timeStamping           OBJECT IDENTIFIER ::= { id-kp 8 }
-// id-kp-OCSPSigning            OBJECT IDENTIFIER ::= { id-kp 9 }
-var (
-	oidExtKeyUsageAny                        = asn1.ObjectIdentifier{2, 5, 29, 37, 0}
-	oidExtKeyUsageServerAuth                 = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 1}
-	oidExtKeyUsageClientAuth                 = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 2}
-	oidExtKeyUsageCodeSigning                = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 3}
-	oidExtKeyUsageEmailProtection            = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 4}
-	oidExtKeyUsageIPSECEndSystem             = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 5}
-	oidExtKeyUsageIPSECTunnel                = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 6}
-	oidExtKeyUsageIPSECUser                  = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 7}
-	oidExtKeyUsageTimeStamping               = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 8}
-	oidExtKeyUsageOCSPSigning                = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 3, 9}
-	oidExtKeyUsageMicrosoftServerGatedCrypto = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 311, 10, 3, 3}
-	oidExtKeyUsageNetscapeServerGatedCrypto  = asn1.ObjectIdentifier{2, 16, 840, 1, 113730, 4, 1}
-)
-
-// ExtKeyUsage represents an extended set of actions that are valid for a given key.
-// Each of the ExtKeyUsage* constants define a unique action.
-type ExtKeyUsage int
-
-const (
-	ExtKeyUsageAny ExtKeyUsage = iota
-	ExtKeyUsageServerAuth
-	ExtKeyUsageClientAuth
-	ExtKeyUsageCodeSigning
-	ExtKeyUsageEmailProtection
-	ExtKeyUsageIPSECEndSystem
-	ExtKeyUsageIPSECTunnel
-	ExtKeyUsageIPSECUser
-	ExtKeyUsageTimeStamping
-	ExtKeyUsageOCSPSigning
-	ExtKeyUsageMicrosoftServerGatedCrypto
-	ExtKeyUsageNetscapeServerGatedCrypto
-)
-
-// extKeyUsageOIDs contains the mapping between an ExtKeyUsage and its OID.
-var extKeyUsageOIDs = []struct {
-	extKeyUsage ExtKeyUsage
-	oid         asn1.ObjectIdentifier
-}{
-	{ExtKeyUsageAny, oidExtKeyUsageAny},
-	{ExtKeyUsageServerAuth, oidExtKeyUsageServerAuth},
-	{ExtKeyUsageClientAuth, oidExtKeyUsageClientAuth},
-	{ExtKeyUsageCodeSigning, oidExtKeyUsageCodeSigning},
-	{ExtKeyUsageEmailProtection, oidExtKeyUsageEmailProtection},
-	{ExtKeyUsageIPSECEndSystem, oidExtKeyUsageIPSECEndSystem},
-	{ExtKeyUsageIPSECTunnel, oidExtKeyUsageIPSECTunnel},
-	{ExtKeyUsageIPSECUser, oidExtKeyUsageIPSECUser},
-	{ExtKeyUsageTimeStamping, oidExtKeyUsageTimeStamping},
-	{ExtKeyUsageOCSPSigning, oidExtKeyUsageOCSPSigning},
-	{ExtKeyUsageMicrosoftServerGatedCrypto, oidExtKeyUsageMicrosoftServerGatedCrypto},
-	{ExtKeyUsageNetscapeServerGatedCrypto, oidExtKeyUsageNetscapeServerGatedCrypto},
-}
-
-func extKeyUsageFromOID(oid asn1.ObjectIdentifier) (eku ExtKeyUsage, ok bool) {
-	for _, pair := range extKeyUsageOIDs {
-		if oid.Equal(pair.oid) {
-			return pair.extKeyUsage, true
-		}
-	}
-	return
-}
-
-func oidFromExtKeyUsage(eku ExtKeyUsage) (oid asn1.ObjectIdentifier, ok bool) {
-	for _, pair := range extKeyUsageOIDs {
-		if eku == pair.extKeyUsage {
-			return pair.oid, true
-		}
-	}
-	return
-}
-
-// A Certificate represents an X.509 certificate.
-type Certificate struct {
-	Raw                     []byte // Complete ASN.1 DER content (certificate, signature algorithm and signature).
-	RawTBSCertificate       []byte // Certificate part of raw ASN.1 DER content.
-	RawSubjectPublicKeyInfo []byte // DER encoded SubjectPublicKeyInfo.
-	RawSubject              []byte // DER encoded Subject
-	RawIssuer               []byte // DER encoded Issuer
-
-	Signature          []byte
-	SignatureAlgorithm SignatureAlgorithm
-
-	PublicKeyAlgorithm PublicKeyAlgorithm
-	PublicKey          interface{}
-
-	Version             int
-	SerialNumber        *big.Int
-	Issuer              pkix.Name
-	Subject             pkix.Name
-	NotBefore, NotAfter time.Time // Validity bounds.
-	KeyUsage            KeyUsage
-
-	// Extensions contains raw X.509 extensions. When parsing certificates,
-	// this can be used to extract non-critical extensions that are not
-	// parsed by this package. When marshaling certificates, the Extensions
-	// field is ignored, see ExtraExtensions.
-	Extensions []pkix.Extension
-
-	// ExtraExtensions contains extensions to be copied, raw, into any
-	// marshaled certificates. Values override any extensions that would
-	// otherwise be produced based on the other fields. The ExtraExtensions
-	// field is not populated when parsing certificates, see Extensions.
-	ExtraExtensions []pkix.Extension
-
-	// UnhandledCriticalExtensions contains a list of extension IDs that
-	// were not (fully) processed when parsing. Verify will fail if this
-	// slice is non-empty, unless verification is delegated to an OS
-	// library which understands all the critical extensions.
-	//
-	// Users can access these extensions using Extensions and can remove
-	// elements from this slice if they believe that they have been
-	// handled.
-	UnhandledCriticalExtensions []asn1.ObjectIdentifier
-
-	ExtKeyUsage        []ExtKeyUsage           // Sequence of extended key usages.
-	UnknownExtKeyUsage []asn1.ObjectIdentifier // Encountered extended key usages unknown to this package.
-
-	BasicConstraintsValid bool // if true then the next two fields are valid.
-	IsCA                  bool
-	MaxPathLen            int
-	// MaxPathLenZero indicates that BasicConstraintsValid==true and
-	// MaxPathLen==0 should be interpreted as an actual maximum path length
-	// of zero. Otherwise, that combination is interpreted as MaxPathLen
-	// not being set.
-	MaxPathLenZero bool
-
-	SubjectKeyId   []byte
-	AuthorityKeyId []byte
-
-	// RFC 5280, 4.2.2.1 (Authority Information Access)
-	OCSPServer            []string
-	IssuingCertificateURL []string
-
-	// Subject Alternate Name values
-	DNSNames       []string
-	EmailAddresses []string
-	IPAddresses    []net.IP
-
-	// Name constraints
-	PermittedDNSDomainsCritical bool // if true then the name constraints are marked critical.
-	PermittedDNSDomains         []string
-
-	// CRL Distribution Points
-	CRLDistributionPoints []string
-
-	PolicyIdentifiers []asn1.ObjectIdentifier
-}
-
-// ErrUnsupportedAlgorithm results from attempting to perform an operation that
-// involves algorithms that are not currently implemented.
-var ErrUnsupportedAlgorithm = errors.New("x509: cannot verify signature: algorithm unimplemented")
-
-// ConstraintViolationError results when a requested usage is not permitted by
-// a certificate. For example: checking a signature when the public key isn't a
-// certificate signing key.
-type ConstraintViolationError struct{}
-
-func (ConstraintViolationError) Error() string {
-	return "x509: invalid signature: parent certificate cannot sign this kind of certificate"
-}
-
-func (c *Certificate) Equal(other *Certificate) bool {
-	return bytes.Equal(c.Raw, other.Raw)
-}
-
-// Entrust have a broken root certificate (CN=Entrust.net Certification
-// Authority (2048)) which isn't marked as a CA certificate and is thus invalid
-// according to PKIX.
-// We recognise this certificate by its SubjectPublicKeyInfo and exempt it
-// from the Basic Constraints requirement.
-// See http://www.entrust.net/knowledge-base/technote.cfm?tn=7869
-//
-// TODO(agl): remove this hack once their reissued root is sufficiently
-// widespread.
-var entrustBrokenSPKI = []byte{
-	0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09,
-	0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
-	0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00,
-	0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01,
-	0x00, 0x97, 0xa3, 0x2d, 0x3c, 0x9e, 0xde, 0x05,
-	0xda, 0x13, 0xc2, 0x11, 0x8d, 0x9d, 0x8e, 0xe3,
-	0x7f, 0xc7, 0x4b, 0x7e, 0x5a, 0x9f, 0xb3, 0xff,
-	0x62, 0xab, 0x73, 0xc8, 0x28, 0x6b, 0xba, 0x10,
-	0x64, 0x82, 0x87, 0x13, 0xcd, 0x57, 0x18, 0xff,
-	0x28, 0xce, 0xc0, 0xe6, 0x0e, 0x06, 0x91, 0x50,
-	0x29, 0x83, 0xd1, 0xf2, 0xc3, 0x2a, 0xdb, 0xd8,
-	0xdb, 0x4e, 0x04, 0xcc, 0x00, 0xeb, 0x8b, 0xb6,
-	0x96, 0xdc, 0xbc, 0xaa, 0xfa, 0x52, 0x77, 0x04,
-	0xc1, 0xdb, 0x19, 0xe4, 0xae, 0x9c, 0xfd, 0x3c,
-	0x8b, 0x03, 0xef, 0x4d, 0xbc, 0x1a, 0x03, 0x65,
-	0xf9, 0xc1, 0xb1, 0x3f, 0x72, 0x86, 0xf2, 0x38,
-	0xaa, 0x19, 0xae, 0x10, 0x88, 0x78, 0x28, 0xda,
-	0x75, 0xc3, 0x3d, 0x02, 0x82, 0x02, 0x9c, 0xb9,
-	0xc1, 0x65, 0x77, 0x76, 0x24, 0x4c, 0x98, 0xf7,
-	0x6d, 0x31, 0x38, 0xfb, 0xdb, 0xfe, 0xdb, 0x37,
-	0x02, 0x76, 0xa1, 0x18, 0x97, 0xa6, 0xcc, 0xde,
-	0x20, 0x09, 0x49, 0x36, 0x24, 0x69, 0x42, 0xf6,
-	0xe4, 0x37, 0x62, 0xf1, 0x59, 0x6d, 0xa9, 0x3c,
-	0xed, 0x34, 0x9c, 0xa3, 0x8e, 0xdb, 0xdc, 0x3a,
-	0xd7, 0xf7, 0x0a, 0x6f, 0xef, 0x2e, 0xd8, 0xd5,
-	0x93, 0x5a, 0x7a, 0xed, 0x08, 0x49, 0x68, 0xe2,
-	0x41, 0xe3, 0x5a, 0x90, 0xc1, 0x86, 0x55, 0xfc,
-	0x51, 0x43, 0x9d, 0xe0, 0xb2, 0xc4, 0x67, 0xb4,
-	0xcb, 0x32, 0x31, 0x25, 0xf0, 0x54, 0x9f, 0x4b,
-	0xd1, 0x6f, 0xdb, 0xd4, 0xdd, 0xfc, 0xaf, 0x5e,
-	0x6c, 0x78, 0x90, 0x95, 0xde, 0xca, 0x3a, 0x48,
-	0xb9, 0x79, 0x3c, 0x9b, 0x19, 0xd6, 0x75, 0x05,
-	0xa0, 0xf9, 0x88, 0xd7, 0xc1, 0xe8, 0xa5, 0x09,
-	0xe4, 0x1a, 0x15, 0xdc, 0x87, 0x23, 0xaa, 0xb2,
-	0x75, 0x8c, 0x63, 0x25, 0x87, 0xd8, 0xf8, 0x3d,
-	0xa6, 0xc2, 0xcc, 0x66, 0xff, 0xa5, 0x66, 0x68,
-	0x55, 0x02, 0x03, 0x01, 0x00, 0x01,
-}
-
-// CheckSignatureFrom verifies that the signature on c is a valid signature
-// from parent.
-func (c *Certificate) CheckSignatureFrom(parent *Certificate) (err error) {
-	// RFC 5280, 4.2.1.9:
-	// "If the basic constraints extension is not present in a version 3
-	// certificate, or the extension is present but the cA boolean is not
-	// asserted, then the certified public key MUST NOT be used to verify
-	// certificate signatures."
-	// (except for Entrust, see comment above entrustBrokenSPKI)
-	if (parent.Version == 3 && !parent.BasicConstraintsValid ||
-		parent.BasicConstraintsValid && !parent.IsCA) &&
-		!bytes.Equal(c.RawSubjectPublicKeyInfo, entrustBrokenSPKI) {
-		return ConstraintViolationError{}
-	}
-
-	if parent.KeyUsage != 0 && parent.KeyUsage&KeyUsageCertSign == 0 {
-		return ConstraintViolationError{}
-	}
-
-	if parent.PublicKeyAlgorithm == UnknownPublicKeyAlgorithm {
-		return ErrUnsupportedAlgorithm
-	}
-
-	// TODO(agl): don't ignore the path length constraint.
-
-	return parent.CheckSignature(c.SignatureAlgorithm, c.RawTBSCertificate, c.Signature)
-}
-
-// CheckSignature verifies that signature is a valid signature over signed from
-// c's public key.
-func (c *Certificate) CheckSignature(algo SignatureAlgorithm, signed, signature []byte) (err error) {
-	return checkSignature(algo, signed, signature, c.PublicKey)
-}
-
-// CheckSignature verifies that signature is a valid signature over signed from
-// a crypto.PublicKey.
-func checkSignature(algo SignatureAlgorithm, signed, signature []byte, publicKey crypto.PublicKey) (err error) {
-	var hashType crypto.Hash
-
-	switch algo {
-	case SHA1WithRSA, DSAWithSHA1, ECDSAWithSHA1:
-		hashType = crypto.SHA1
-	case SHA256WithRSA, DSAWithSHA256, ECDSAWithSHA256:
-		hashType = crypto.SHA256
-	case SHA384WithRSA, ECDSAWithSHA384:
-		hashType = crypto.SHA384
-	case SHA512WithRSA, ECDSAWithSHA512:
-		hashType = crypto.SHA512
-	default:
-		return ErrUnsupportedAlgorithm
-	}
-
-	if !hashType.Available() {
-		return ErrUnsupportedAlgorithm
-	}
-	h := hashType.New()
-
-	h.Write(signed)
-	digest := h.Sum(nil)
-
-	switch pub := publicKey.(type) {
-	case *rsa.PublicKey:
-		return rsa.VerifyPKCS1v15(pub, hashType, digest, signature)
-	case *dsa.PublicKey:
-		dsaSig := new(dsaSignature)
-		if rest, err := asn1.Unmarshal(signature, dsaSig); err != nil {
-			return err
-		} else if len(rest) != 0 {
-			return errors.New("x509: trailing data after DSA signature")
-		}
-		if dsaSig.R.Sign() <= 0 || dsaSig.S.Sign() <= 0 {
-			return errors.New("x509: DSA signature contained zero or negative values")
-		}
-		if !dsa.Verify(pub, digest, dsaSig.R, dsaSig.S) {
-			return errors.New("x509: DSA verification failure")
-		}
-		return
-	case *ecdsa.PublicKey:
-		ecdsaSig := new(ecdsaSignature)
-		if rest, err := asn1.Unmarshal(signature, ecdsaSig); err != nil {
-			return err
-		} else if len(rest) != 0 {
-			return errors.New("x509: trailing data after ECDSA signature")
-		}
-		if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
-			return errors.New("x509: ECDSA signature contained zero or negative values")
-		}
-		if !ecdsa.Verify(pub, digest, ecdsaSig.R, ecdsaSig.S) {
-			return errors.New("x509: ECDSA verification failure")
-		}
-		return
-	}
-	return ErrUnsupportedAlgorithm
-}
-
-// CheckCRLSignature checks that the signature in crl is from c.
-func (c *Certificate) CheckCRLSignature(crl *pkix.CertificateList) (err error) {
-	algo := getSignatureAlgorithmFromOID(crl.SignatureAlgorithm.Algorithm)
-	return c.CheckSignature(algo, crl.TBSCertList.Raw, crl.SignatureValue.RightAlign())
-}
-
-type UnhandledCriticalExtension struct{}
-
-func (h UnhandledCriticalExtension) Error() string {
-	return "x509: unhandled critical extension"
-}
-
-type basicConstraints struct {
-	IsCA       bool `asn1:"optional"`
-	MaxPathLen int  `asn1:"optional,default:-1"`
-}
-
-// RFC 5280 4.2.1.4
-type policyInformation struct {
-	Policy asn1.ObjectIdentifier
-	// policyQualifiers omitted
-}
-
-// RFC 5280, 4.2.1.10
-type nameConstraints struct {
-	Permitted []generalSubtree `asn1:"optional,tag:0"`
-	Excluded  []generalSubtree `asn1:"optional,tag:1"`
-}
-
-type generalSubtree struct {
-	Name string `asn1:"tag:2,optional,ia5"`
-}
-
-// RFC 5280, 4.2.2.1
-type authorityInfoAccess struct {
-	Method   asn1.ObjectIdentifier
-	Location asn1.RawValue
-}
-
-// RFC 5280, 4.2.1.14
-type distributionPoint struct {
-	DistributionPoint distributionPointName `asn1:"optional,tag:0"`
-	Reason            asn1.BitString        `asn1:"optional,tag:1"`
-	CRLIssuer         asn1.RawValue         `asn1:"optional,tag:2"`
-}
-
-type distributionPointName struct {
-	FullName     asn1.RawValue    `asn1:"optional,tag:0"`
-	RelativeName pkix.RDNSequence `asn1:"optional,tag:1"`
-}
-
-func parsePublicKey(algo PublicKeyAlgorithm, keyData *publicKeyInfo) (interface{}, error) {
-	asn1Data := keyData.PublicKey.RightAlign()
-	switch algo {
-	case RSA:
-		p := new(rsaPublicKey)
-		rest, err := asn1.Unmarshal(asn1Data, p)
-		if err != nil {
-			return nil, err
-		}
-		if len(rest) != 0 {
-			return nil, errors.New("x509: trailing data after RSA public key")
-		}
-
-		if p.N.Sign() <= 0 {
-			return nil, errors.New("x509: RSA modulus is not a positive number")
-		}
-		if p.E <= 0 {
-			return nil, errors.New("x509: RSA public exponent is not a positive number")
-		}
-
-		pub := &rsa.PublicKey{
-			E: p.E,
-			N: p.N,
-		}
-		return pub, nil
-	case DSA:
-		var p *big.Int
-		rest, err := asn1.Unmarshal(asn1Data, &p)
-		if err != nil {
-			return nil, err
-		}
-		if len(rest) != 0 {
-			return nil, errors.New("x509: trailing data after DSA public key")
-		}
-		paramsData := keyData.Algorithm.Parameters.FullBytes
-		params := new(dsaAlgorithmParameters)
-		rest, err = asn1.Unmarshal(paramsData, params)
-		if err != nil {
-			return nil, err
-		}
-		if len(rest) != 0 {
-			return nil, errors.New("x509: trailing data after DSA parameters")
-		}
-		if p.Sign() <= 0 || params.P.Sign() <= 0 || params.Q.Sign() <= 0 || params.G.Sign() <= 0 {
-			return nil, errors.New("x509: zero or negative DSA parameter")
-		}
-		pub := &dsa.PublicKey{
-			Parameters: dsa.Parameters{
-				P: params.P,
-				Q: params.Q,
-				G: params.G,
-			},
-			Y: p,
-		}
-		return pub, nil
-	case ECDSA:
-		paramsData := keyData.Algorithm.Parameters.FullBytes
-		namedCurveOID := new(asn1.ObjectIdentifier)
-		rest, err := asn1.Unmarshal(paramsData, namedCurveOID)
-		if err != nil {
-			return nil, err
-		}
-		if len(rest) != 0 {
-			return nil, errors.New("x509: trailing data after ECDSA parameters")
-		}
-		namedCurve := namedCurveFromOID(*namedCurveOID)
-		if namedCurve == nil {
-			return nil, errors.New("x509: unsupported elliptic curve")
-		}
-		x, y := elliptic.Unmarshal(namedCurve, asn1Data)
-		if x == nil {
-			return nil, errors.New("x509: failed to unmarshal elliptic curve point")
-		}
-		pub := &ecdsa.PublicKey{
-			Curve: namedCurve,
-			X:     x,
-			Y:     y,
-		}
-		return pub, nil
-	default:
-		return nil, nil
-	}
-}
-
-func parseSANExtension(value []byte) (dnsNames, emailAddresses []string, ipAddresses []net.IP, err error) {
-	// RFC 5280, 4.2.1.6
-
-	// SubjectAltName ::= GeneralNames
-	//
-	// GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
-	//
-	// GeneralName ::= CHOICE {
-	//      otherName                       [0]     OtherName,
-	//      rfc822Name                      [1]     IA5String,
-	//      dNSName                         [2]     IA5String,
-	//      x400Address                     [3]     ORAddress,
-	//      directoryName                   [4]     Name,
-	//      ediPartyName                    [5]     EDIPartyName,
-	//      uniformResourceIdentifier       [6]     IA5String,
-	//      iPAddress                       [7]     OCTET STRING,
-	//      registeredID                    [8]     OBJECT IDENTIFIER }
-	var seq asn1.RawValue
-	var rest []byte
-	if rest, err = asn1.Unmarshal(value, &seq); err != nil {
-		return
-	} else if len(rest) != 0 {
-		err = errors.New("x509: trailing data after X.509 extension")
-		return
-	}
-	if !seq.IsCompound || seq.Tag != 16 || seq.Class != 0 {
-		err = asn1.StructuralError{Msg: "bad SAN sequence"}
-		return
-	}
-
-	rest = seq.Bytes
-	for len(rest) > 0 {
-		var v asn1.RawValue
-		rest, err = asn1.Unmarshal(rest, &v)
-		if err != nil {
-			return
-		}
-		switch v.Tag {
-		case 1:
-			emailAddresses = append(emailAddresses, string(v.Bytes))
-		case 2:
-			dnsNames = append(dnsNames, string(v.Bytes))
-		case 7:
-			switch len(v.Bytes) {
-			case net.IPv4len, net.IPv6len:
-				ipAddresses = append(ipAddresses, v.Bytes)
-			default:
-				err = errors.New("x509: certificate contained IP address of length " + strconv.Itoa(len(v.Bytes)))
-				return
-			}
-		}
-	}
-
-	return
-}
-
-func parseCertificate(in *certificate) (*Certificate, error) {
-	out := new(Certificate)
-	out.Raw = in.Raw
-	out.RawTBSCertificate = in.TBSCertificate.Raw
-	out.RawSubjectPublicKeyInfo = in.TBSCertificate.PublicKey.Raw
-	out.RawSubject = in.TBSCertificate.Subject.FullBytes
-	out.RawIssuer = in.TBSCertificate.Issuer.FullBytes
-
-	out.Signature = in.SignatureValue.RightAlign()
-	out.SignatureAlgorithm =
-		getSignatureAlgorithmFromOID(in.TBSCertificate.SignatureAlgorithm.Algorithm)
-
-	out.PublicKeyAlgorithm =
-		getPublicKeyAlgorithmFromOID(in.TBSCertificate.PublicKey.Algorithm.Algorithm)
-	var err error
-	out.PublicKey, err = parsePublicKey(out.PublicKeyAlgorithm, &in.TBSCertificate.PublicKey)
-	if err != nil {
-		return nil, err
-	}
-
-	if in.TBSCertificate.SerialNumber.Sign() < 0 {
-		return nil, errors.New("x509: negative serial number")
-	}
-
-	out.Version = in.TBSCertificate.Version + 1
-	out.SerialNumber = in.TBSCertificate.SerialNumber
-
-	var issuer, subject pkix.RDNSequence
-	if rest, err := asn1.Unmarshal(in.TBSCertificate.Subject.FullBytes, &subject); err != nil {
-		return nil, err
-	} else if len(rest) != 0 {
-		return nil, errors.New("x509: trailing data after X.509 subject")
-	}
-	if rest, err := asn1.Unmarshal(in.TBSCertificate.Issuer.FullBytes, &issuer); err != nil {
-		return nil, err
-	} else if len(rest) != 0 {
-		return nil, errors.New("x509: trailing data after X.509 subject")
-	}
-
-	out.Issuer.FillFromRDNSequence(&issuer)
-	out.Subject.FillFromRDNSequence(&subject)
-
-	out.NotBefore = in.TBSCertificate.Validity.NotBefore
-	out.NotAfter = in.TBSCertificate.Validity.NotAfter
-
-	for _, e := range in.TBSCertificate.Extensions {
-		out.Extensions = append(out.Extensions, e)
-		unhandled := false
-
-		if len(e.Id) == 4 && e.Id[0] == 2 && e.Id[1] == 5 && e.Id[2] == 29 {
-			switch e.Id[3] {
-			case 15:
-				// RFC 5280, 4.2.1.3
-				var usageBits asn1.BitString
-				if rest, err := asn1.Unmarshal(e.Value, &usageBits); err != nil {
-					return nil, err
-				} else if len(rest) != 0 {
-					return nil, errors.New("x509: trailing data after X.509 KeyUsage")
-				}
-
-				var usage int
-				for i := 0; i < 9; i++ {
-					if usageBits.At(i) != 0 {
-						usage |= 1 << uint(i)
-					}
-				}
-				out.KeyUsage = KeyUsage(usage)
-
-			case 19:
-				// RFC 5280, 4.2.1.9
-				var constraints basicConstraints
-				if rest, err := asn1.Unmarshal(e.Value, &constraints); err != nil {
-					return nil, err
-				} else if len(rest) != 0 {
-					return nil, errors.New("x509: trailing data after X.509 BasicConstraints")
-				}
-
-				out.BasicConstraintsValid = true
-				out.IsCA = constraints.IsCA
-				out.MaxPathLen = constraints.MaxPathLen
-				out.MaxPathLenZero = out.MaxPathLen == 0
-
-			case 17:
-				out.DNSNames, out.EmailAddresses, out.IPAddresses, err = parseSANExtension(e.Value)
-				if err != nil {
-					return nil, err
-				}
-
-				if len(out.DNSNames) == 0 && len(out.EmailAddresses) == 0 && len(out.IPAddresses) == 0 {
-					// If we didn't parse anything then we do the critical check, below.
-					unhandled = true
-				}
-
-			case 30:
-				// RFC 5280, 4.2.1.10
-
-				// NameConstraints ::= SEQUENCE {
-				//      permittedSubtrees       [0]     GeneralSubtrees OPTIONAL,
-				//      excludedSubtrees        [1]     GeneralSubtrees OPTIONAL }
-				//
-				// GeneralSubtrees ::= SEQUENCE SIZE (1..MAX) OF GeneralSubtree
-				//
-				// GeneralSubtree ::= SEQUENCE {
-				//      base                    GeneralName,
-				//      minimum         [0]     BaseDistance DEFAULT 0,
-				//      maximum         [1]     BaseDistance OPTIONAL }
-				//
-				// BaseDistance ::= INTEGER (0..MAX)
-
-				var constraints nameConstraints
-				if rest, err := asn1.Unmarshal(e.Value, &constraints); err != nil {
-					return nil, err
-				} else if len(rest) != 0 {
-					return nil, errors.New("x509: trailing data after X.509 NameConstraints")
-				}
-
-				if len(constraints.Excluded) > 0 && e.Critical {
-					return out, UnhandledCriticalExtension{}
-				}
-
-				for _, subtree := range constraints.Permitted {
-					if len(subtree.Name) == 0 {
-						if e.Critical {
-							return out, UnhandledCriticalExtension{}
-						}
-						continue
-					}
-					out.PermittedDNSDomains = append(out.PermittedDNSDomains, subtree.Name)
-				}
-
-			case 31:
-				// RFC 5280, 4.2.1.14
-
-				// CRLDistributionPoints ::= SEQUENCE SIZE (1..MAX) OF DistributionPoint
-				//
-				// DistributionPoint ::= SEQUENCE {
-				//     distributionPoint       [0]     DistributionPointName OPTIONAL,
-				//     reasons                 [1]     ReasonFlags OPTIONAL,
-				//     cRLIssuer               [2]     GeneralNames OPTIONAL }
-				//
-				// DistributionPointName ::= CHOICE {
-				//     fullName                [0]     GeneralNames,
-				//     nameRelativeToCRLIssuer [1]     RelativeDistinguishedName }
-
-				var cdp []distributionPoint
-				if rest, err := asn1.Unmarshal(e.Value, &cdp); err != nil {
-					return nil, err
-				} else if len(rest) != 0 {
-					return nil, errors.New("x509: trailing data after X.509 CRL distribution point")
-				}
-
-				for _, dp := range cdp {
-					var n asn1.RawValue
-					if _, err := asn1.Unmarshal(dp.DistributionPoint.FullName.Bytes, &n); err != nil {
-						return nil, err
-					}
-					// Trailing data after the fullName is
-					// allowed because other elements of
-					// the SEQUENCE can appear.
-
-					if n.Tag == 6 {
-						out.CRLDistributionPoints = append(out.CRLDistributionPoints, string(n.Bytes))
-					}
-				}
-
-			case 35:
-				// RFC 5280, 4.2.1.1
-				var a authKeyId
-				if rest, err := asn1.Unmarshal(e.Value, &a); err != nil {
-					return nil, err
-				} else if len(rest) != 0 {
-					return nil, errors.New("x509: trailing data after X.509 authority key-id")
-				}
-				out.AuthorityKeyId = a.Id
-
-			case 37:
-				// RFC 5280, 4.2.1.12.  Extended Key Usage
-
-				// id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 }
-				//
-				// ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId
-				//
-				// KeyPurposeId ::= OBJECT IDENTIFIER
-
-				var keyUsage []asn1.ObjectIdentifier
-				if rest, err := asn1.Unmarshal(e.Value, &keyUsage); err != nil {
-					return nil, err
-				} else if len(rest) != 0 {
-					return nil, errors.New("x509: trailing data after X.509 ExtendedKeyUsage")
-				}
-
-				for _, u := range keyUsage {
-					if extKeyUsage, ok := extKeyUsageFromOID(u); ok {
-						out.ExtKeyUsage = append(out.ExtKeyUsage, extKeyUsage)
-					} else {
-						out.UnknownExtKeyUsage = append(out.UnknownExtKeyUsage, u)
-					}
-				}
-
-			case 14:
-				// RFC 5280, 4.2.1.2
-				var keyid []byte
-				if rest, err := asn1.Unmarshal(e.Value, &keyid); err != nil {
-					return nil, err
-				} else if len(rest) != 0 {
-					return nil, errors.New("x509: trailing data after X.509 authority key-id")
-				}
-				out.SubjectKeyId = keyid
-
-			case 32:
-				// RFC 5280 4.2.1.4: Certificate Policies
-				var policies []policyInformation
-				if rest, err := asn1.Unmarshal(e.Value, &policies); err != nil {
-					return nil, err
-				} else if len(rest) != 0 {
-					return nil, errors.New("x509: trailing data after X.509 certificate policies")
-				}
-				out.PolicyIdentifiers = make([]asn1.ObjectIdentifier, len(policies))
-				for i, policy := range policies {
-					out.PolicyIdentifiers[i] = policy.Policy
-				}
-
-			default:
-				// Unknown extensions are recorded if critical.
-				unhandled = true
-			}
-		} else if e.Id.Equal(oidExtensionAuthorityInfoAccess) {
-			// RFC 5280 4.2.2.1: Authority Information Access
-			var aia []authorityInfoAccess
-			if rest, err := asn1.Unmarshal(e.Value, &aia); err != nil {
-				return nil, err
-			} else if len(rest) != 0 {
-				return nil, errors.New("x509: trailing data after X.509 authority information")
-			}
-
-			for _, v := range aia {
-				// GeneralName: uniformResourceIdentifier [6] IA5String
-				if v.Location.Tag != 6 {
-					continue
-				}
-				if v.Method.Equal(oidAuthorityInfoAccessOcsp) {
-					out.OCSPServer = append(out.OCSPServer, string(v.Location.Bytes))
-				} else if v.Method.Equal(oidAuthorityInfoAccessIssuers) {
-					out.IssuingCertificateURL = append(out.IssuingCertificateURL, string(v.Location.Bytes))
-				}
-			}
-		} else {
-			// Unknown extensions are recorded if critical.
-			unhandled = true
-		}
-
-		if e.Critical && unhandled {
-			out.UnhandledCriticalExtensions = append(out.UnhandledCriticalExtensions, e.Id)
-		}
-	}
-
-	return out, nil
-}
-
-// ParseCertificate parses a single certificate from the given ASN.1 DER data.
-func ParseCertificate(asn1Data []byte) (*Certificate, error) {
-	var cert certificate
-	rest, err := asn1.Unmarshal(asn1Data, &cert)
-	if err != nil {
-		return nil, err
-	}
-	if len(rest) > 0 {
-		return nil, asn1.SyntaxError{Msg: "trailing data"}
-	}
-
-	return parseCertificate(&cert)
-}
-
-// ParseCertificates parses one or more certificates from the given ASN.1 DER
-// data. The certificates must be concatenated with no intermediate padding.
-func ParseCertificates(asn1Data []byte) ([]*Certificate, error) {
-	var v []*certificate
-
-	for len(asn1Data) > 0 {
-		cert := new(certificate)
-		var err error
-		asn1Data, err = asn1.Unmarshal(asn1Data, cert)
-		if err != nil {
-			return nil, err
-		}
-		v = append(v, cert)
-	}
-
-	ret := make([]*Certificate, len(v))
-	for i, ci := range v {
-		cert, err := parseCertificate(ci)
-		if err != nil {
-			return nil, err
-		}
-		ret[i] = cert
-	}
-
-	return ret, nil
-}
-
-func reverseBitsInAByte(in byte) byte {
-	b1 := in>>4 | in<<4
-	b2 := b1>>2&0x33 | b1<<2&0xcc
-	b3 := b2>>1&0x55 | b2<<1&0xaa
-	return b3
-}
-
-// asn1BitLength returns the bit-length of bitString by considering the
-// most-significant bit in a byte to be the "first" bit. This convention
-// matches ASN.1, but differs from almost everything else.
-func asn1BitLength(bitString []byte) int {
-	bitLen := len(bitString) * 8
-
-	for i := range bitString {
-		b := bitString[len(bitString)-i-1]
-
-		for bit := uint(0); bit < 8; bit++ {
-			if (b>>bit)&1 == 1 {
-				return bitLen
-			}
-			bitLen--
-		}
-	}
-
-	return 0
-}
-
-var (
-	oidExtensionSubjectKeyId          = []int{2, 5, 29, 14}
-	oidExtensionKeyUsage              = []int{2, 5, 29, 15}
-	oidExtensionExtendedKeyUsage      = []int{2, 5, 29, 37}
-	oidExtensionAuthorityKeyId        = []int{2, 5, 29, 35}
-	oidExtensionBasicConstraints      = []int{2, 5, 29, 19}
-	oidExtensionSubjectAltName        = []int{2, 5, 29, 17}
-	oidExtensionCertificatePolicies   = []int{2, 5, 29, 32}
-	oidExtensionNameConstraints       = []int{2, 5, 29, 30}
-	oidExtensionCRLDistributionPoints = []int{2, 5, 29, 31}
-	oidExtensionAuthorityInfoAccess   = []int{1, 3, 6, 1, 5, 5, 7, 1, 1}
-)
-
-var (
-	oidAuthorityInfoAccessOcsp    = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 48, 1}
-	oidAuthorityInfoAccessIssuers = asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 7, 48, 2}
-)
-
-// oidNotInExtensions returns whether an extension with the given oid exists in
-// extensions.
-func oidInExtensions(oid asn1.ObjectIdentifier, extensions []pkix.Extension) bool {
-	for _, e := range extensions {
-		if e.Id.Equal(oid) {
-			return true
-		}
-	}
-	return false
-}
-
-// marshalSANs marshals a list of addresses into a the contents of an X.509
-// SubjectAlternativeName extension.
-func marshalSANs(dnsNames, emailAddresses []string, ipAddresses []net.IP) (derBytes []byte, err error) {
-	var rawValues []asn1.RawValue
-	for _, name := range dnsNames {
-		rawValues = append(rawValues, asn1.RawValue{Tag: 2, Class: 2, Bytes: []byte(name)})
-	}
-	for _, email := range emailAddresses {
-		rawValues = append(rawValues, asn1.RawValue{Tag: 1, Class: 2, Bytes: []byte(email)})
-	}
-	for _, rawIP := range ipAddresses {
-		// If possible, we always want to encode IPv4 addresses in 4 bytes.
-		ip := rawIP.To4()
-		if ip == nil {
-			ip = rawIP
-		}
-		rawValues = append(rawValues, asn1.RawValue{Tag: 7, Class: 2, Bytes: ip})
-	}
-	return asn1.Marshal(rawValues)
-}
-
-func buildExtensions(template *Certificate) (ret []pkix.Extension, err error) {
-	ret = make([]pkix.Extension, 10 /* maximum number of elements. */)
-	n := 0
-
-	if template.KeyUsage != 0 &&
-		!oidInExtensions(oidExtensionKeyUsage, template.ExtraExtensions) {
-		ret[n].Id = oidExtensionKeyUsage
-		ret[n].Critical = true
-
-		var a [2]byte
-		a[0] = reverseBitsInAByte(byte(template.KeyUsage))
-		a[1] = reverseBitsInAByte(byte(template.KeyUsage >> 8))
-
-		l := 1
-		if a[1] != 0 {
-			l = 2
-		}
-
-		bitString := a[:l]
-		ret[n].Value, err = asn1.Marshal(asn1.BitString{Bytes: bitString, BitLength: asn1BitLength(bitString)})
-		if err != nil {
-			return
-		}
-		n++
-	}
-
-	if (len(template.ExtKeyUsage) > 0 || len(template.UnknownExtKeyUsage) > 0) &&
-		!oidInExtensions(oidExtensionExtendedKeyUsage, template.ExtraExtensions) {
-		ret[n].Id = oidExtensionExtendedKeyUsage
-
-		var oids []asn1.ObjectIdentifier
-		for _, u := range template.ExtKeyUsage {
-			if oid, ok := oidFromExtKeyUsage(u); ok {
-				oids = append(oids, oid)
-			} else {
-				panic("internal error")
-			}
-		}
-
-		oids = append(oids, template.UnknownExtKeyUsage...)
-
-		ret[n].Value, err = asn1.Marshal(oids)
-		if err != nil {
-			return
-		}
-		n++
-	}
-
-	if template.BasicConstraintsValid && !oidInExtensions(oidExtensionBasicConstraints, template.ExtraExtensions) {
-		// Leaving MaxPathLen as zero indicates that no maximum path
-		// length is desired, unless MaxPathLenZero is set. A value of
-		// -1 causes encoding/asn1 to omit the value as desired.
-		maxPathLen := template.MaxPathLen
-		if maxPathLen == 0 && !template.MaxPathLenZero {
-			maxPathLen = -1
-		}
-		ret[n].Id = oidExtensionBasicConstraints
-		ret[n].Value, err = asn1.Marshal(basicConstraints{template.IsCA, maxPathLen})
-		ret[n].Critical = true
-		if err != nil {
-			return
-		}
-		n++
-	}
-
-	if len(template.SubjectKeyId) > 0 && !oidInExtensions(oidExtensionSubjectKeyId, template.ExtraExtensions) {
-		ret[n].Id = oidExtensionSubjectKeyId
-		ret[n].Value, err = asn1.Marshal(template.SubjectKeyId)
-		if err != nil {
-			return
-		}
-		n++
-	}
-
-	if len(template.AuthorityKeyId) > 0 && !oidInExtensions(oidExtensionAuthorityKeyId, template.ExtraExtensions) {
-		ret[n].Id = oidExtensionAuthorityKeyId
-		ret[n].Value, err = asn1.Marshal(authKeyId{template.AuthorityKeyId})
-		if err != nil {
-			return
-		}
-		n++
-	}
-
-	if (len(template.OCSPServer) > 0 || len(template.IssuingCertificateURL) > 0) &&
-		!oidInExtensions(oidExtensionAuthorityInfoAccess, template.ExtraExtensions) {
-		ret[n].Id = oidExtensionAuthorityInfoAccess
-		var aiaValues []authorityInfoAccess
-		for _, name := range template.OCSPServer {
-			aiaValues = append(aiaValues, authorityInfoAccess{
-				Method:   oidAuthorityInfoAccessOcsp,
-				Location: asn1.RawValue{Tag: 6, Class: 2, Bytes: []byte(name)},
-			})
-		}
-		for _, name := range template.IssuingCertificateURL {
-			aiaValues = append(aiaValues, authorityInfoAccess{
-				Method:   oidAuthorityInfoAccessIssuers,
-				Location: asn1.RawValue{Tag: 6, Class: 2, Bytes: []byte(name)},
-			})
-		}
-		ret[n].Value, err = asn1.Marshal(aiaValues)
-		if err != nil {
-			return
-		}
-		n++
-	}
-
-	if (len(template.DNSNames) > 0 || len(template.EmailAddresses) > 0 || len(template.IPAddresses) > 0) &&
-		!oidInExtensions(oidExtensionSubjectAltName, template.ExtraExtensions) {
-		ret[n].Id = oidExtensionSubjectAltName
-		ret[n].Value, err = marshalSANs(template.DNSNames, template.EmailAddresses, template.IPAddresses)
-		if err != nil {
-			return
-		}
-		n++
-	}
-
-	if len(template.PolicyIdentifiers) > 0 &&
-		!oidInExtensions(oidExtensionCertificatePolicies, template.ExtraExtensions) {
-		ret[n].Id = oidExtensionCertificatePolicies
-		policies := make([]policyInformation, len(template.PolicyIdentifiers))
-		for i, policy := range template.PolicyIdentifiers {
-			policies[i].Policy = policy
-		}
-		ret[n].Value, err = asn1.Marshal(policies)
-		if err != nil {
-			return
-		}
-		n++
-	}
-
-	if len(template.PermittedDNSDomains) > 0 &&
-		!oidInExtensions(oidExtensionNameConstraints, template.ExtraExtensions) {
-		ret[n].Id = oidExtensionNameConstraints
-		ret[n].Critical = template.PermittedDNSDomainsCritical
-
-		var out nameConstraints
-		out.Permitted = make([]generalSubtree, len(template.PermittedDNSDomains))
-		for i, permitted := range template.PermittedDNSDomains {
-			out.Permitted[i] = generalSubtree{Name: permitted}
-		}
-		ret[n].Value, err = asn1.Marshal(out)
-		if err != nil {
-			return
-		}
-		n++
-	}
-
-	if len(template.CRLDistributionPoints) > 0 &&
-		!oidInExtensions(oidExtensionCRLDistributionPoints, template.ExtraExtensions) {
-		ret[n].Id = oidExtensionCRLDistributionPoints
-
-		var crlDp []distributionPoint
-		for _, name := range template.CRLDistributionPoints {
-			rawFullName, _ := asn1.Marshal(asn1.RawValue{Tag: 6, Class: 2, Bytes: []byte(name)})
-
-			dp := distributionPoint{
-				DistributionPoint: distributionPointName{
-					FullName: asn1.RawValue{Tag: 0, Class: 2, IsCompound: true, Bytes: rawFullName},
-				},
-			}
-			crlDp = append(crlDp, dp)
-		}
-
-		ret[n].Value, err = asn1.Marshal(crlDp)
-		if err != nil {
-			return
-		}
-		n++
-	}
-
-	// Adding another extension here? Remember to update the maximum number
-	// of elements in the make() at the top of the function.
-
-	return append(ret[:n], template.ExtraExtensions...), nil
-}
-
-func subjectBytes(cert *Certificate) ([]byte, error) {
-	if len(cert.RawSubject) > 0 {
-		return cert.RawSubject, nil
-	}
-
-	return asn1.Marshal(cert.Subject.ToRDNSequence())
-}
-
-// signingParamsForPublicKey returns the parameters to use for signing with
-// priv. If requestedSigAlgo is not zero then it overrides the default
-// signature algorithm.
-func signingParamsForPublicKey(pub interface{}, requestedSigAlgo SignatureAlgorithm) (hashFunc crypto.Hash, sigAlgo pkix.AlgorithmIdentifier, err error) {
-	var pubType PublicKeyAlgorithm
-
-	switch pub := pub.(type) {
-	case *rsa.PublicKey:
-		pubType = RSA
-		hashFunc = crypto.SHA256
-		sigAlgo.Algorithm = oidSignatureSHA256WithRSA
-		sigAlgo.Parameters = asn1.RawValue{
-			Tag: 5,
-		}
-
-	case *ecdsa.PublicKey:
-		pubType = ECDSA
-
-		switch pub.Curve {
-		case elliptic.P224(), elliptic.P256():
-			hashFunc = crypto.SHA256
-			sigAlgo.Algorithm = oidSignatureECDSAWithSHA256
-		case elliptic.P384():
-			hashFunc = crypto.SHA384
-			sigAlgo.Algorithm = oidSignatureECDSAWithSHA384
-		case elliptic.P521():
-			hashFunc = crypto.SHA512
-			sigAlgo.Algorithm = oidSignatureECDSAWithSHA512
-		default:
-			err = errors.New("x509: unknown elliptic curve")
-		}
-
-	default:
-		err = errors.New("x509: only RSA and ECDSA keys supported")
-	}
-
-	if err != nil {
-		return
-	}
-
-	if requestedSigAlgo == 0 {
-		return
-	}
-
-	found := false
-	for _, details := range signatureAlgorithmDetails {
-		if details.algo == requestedSigAlgo {
-			if details.pubKeyAlgo != pubType {
-				err = errors.New("x509: requested SignatureAlgorithm does not match private key type")
-				return
-			}
-			sigAlgo.Algorithm, hashFunc = details.oid, details.hash
-			if hashFunc == 0 {
-				err = errors.New("x509: cannot sign with hash function requested")
-				return
-			}
-			found = true
-			break
-		}
-	}
-
-	if !found {
-		err = errors.New("x509: unknown SignatureAlgorithm")
-	}
-
-	return
-}
-
-// CreateCertificate creates a new certificate based on a template. The
-// following members of template are used: SerialNumber, Subject, NotBefore,
-// NotAfter, KeyUsage, ExtKeyUsage, UnknownExtKeyUsage, BasicConstraintsValid,
-// IsCA, MaxPathLen, SubjectKeyId, DNSNames, PermittedDNSDomainsCritical,
-// PermittedDNSDomains, SignatureAlgorithm.
-//
-// The certificate is signed by parent. If parent is equal to template then the
-// certificate is self-signed. The parameter pub is the public key of the
-// signee and priv is the private key of the signer.
-//
-// The returned slice is the certificate in DER encoding.
-//
-// All keys types that are implemented via crypto.Signer are supported (This
-// includes *rsa.PublicKey and *ecdsa.PublicKey.)
-func CreateCertificate(rand io.Reader, template, parent *Certificate, pub, priv interface{}) (cert []byte, err error) {
-	key, ok := priv.(crypto.Signer)
-	if !ok {
-		return nil, errors.New("x509: certificate private key does not implement crypto.Signer")
-	}
-
-	hashFunc, signatureAlgorithm, err := signingParamsForPublicKey(key.Public(), template.SignatureAlgorithm)
-	if err != nil {
-		return nil, err
-	}
-
-	publicKeyBytes, publicKeyAlgorithm, err := marshalPublicKey(pub)
-	if err != nil {
-		return nil, err
-	}
-
-	if len(parent.SubjectKeyId) > 0 {
-		template.AuthorityKeyId = parent.SubjectKeyId
-	}
-
-	extensions, err := buildExtensions(template)
-	if err != nil {
-		return
-	}
-
-	asn1Issuer, err := subjectBytes(parent)
-	if err != nil {
-		return
-	}
-
-	asn1Subject, err := subjectBytes(template)
-	if err != nil {
-		return
-	}
-
-	encodedPublicKey := asn1.BitString{BitLength: len(publicKeyBytes) * 8, Bytes: publicKeyBytes}
-	c := tbsCertificate{
-		Version:            2,
-		SerialNumber:       template.SerialNumber,
-		SignatureAlgorithm: signatureAlgorithm,
-		Issuer:             asn1.RawValue{FullBytes: asn1Issuer},
-		Validity:           validity{template.NotBefore.UTC(), template.NotAfter.UTC()},
-		Subject:            asn1.RawValue{FullBytes: asn1Subject},
-		PublicKey:          publicKeyInfo{nil, publicKeyAlgorithm, encodedPublicKey},
-		Extensions:         extensions,
-	}
-
-	tbsCertContents, err := asn1.Marshal(c)
-	if err != nil {
-		return
-	}
-
-	c.Raw = tbsCertContents
-
-	h := hashFunc.New()
-	h.Write(tbsCertContents)
-	digest := h.Sum(nil)
-
-	var signature []byte
-	signature, err = key.Sign(rand, digest, hashFunc)
-	if err != nil {
-		return
-	}
-
-	return asn1.Marshal(certificate{
-		nil,
-		c,
-		signatureAlgorithm,
-		asn1.BitString{Bytes: signature, BitLength: len(signature) * 8},
-	})
-}
-
-// pemCRLPrefix is the magic string that indicates that we have a PEM encoded
-// CRL.
-var pemCRLPrefix = []byte("-----BEGIN X509 CRL")
-
-// pemType is the type of a PEM encoded CRL.
-var pemType = "X509 CRL"
-
-// ParseCRL parses a CRL from the given bytes. It's often the case that PEM
-// encoded CRLs will appear where they should be DER encoded, so this function
-// will transparently handle PEM encoding as long as there isn't any leading
-// garbage.
-func ParseCRL(crlBytes []byte) (certList *pkix.CertificateList, err error) {
-	if bytes.HasPrefix(crlBytes, pemCRLPrefix) {
-		block, _ := pem.Decode(crlBytes)
-		if block != nil && block.Type == pemType {
-			crlBytes = block.Bytes
-		}
-	}
-	return ParseDERCRL(crlBytes)
-}
-
-// ParseDERCRL parses a DER encoded CRL from the given bytes.
-func ParseDERCRL(derBytes []byte) (certList *pkix.CertificateList, err error) {
-	certList = new(pkix.CertificateList)
-	if rest, err := asn1.Unmarshal(derBytes, certList); err != nil {
-		return nil, err
-	} else if len(rest) != 0 {
-		return nil, errors.New("x509: trailing data after CRL")
-	}
-	return certList, nil
-}
-
-// CreateCRL returns a DER encoded CRL, signed by this Certificate, that
-// contains the given list of revoked certificates.
-func (c *Certificate) CreateCRL(rand io.Reader, priv interface{}, revokedCerts []pkix.RevokedCertificate, now, expiry time.Time) (crlBytes []byte, err error) {
-	key, ok := priv.(crypto.Signer)
-	if !ok {
-		return nil, errors.New("x509: certificate private key does not implement crypto.Signer")
-	}
-
-	hashFunc, signatureAlgorithm, err := signingParamsForPublicKey(key.Public(), 0)
-	if err != nil {
-		return nil, err
-	}
-
-	tbsCertList := pkix.TBSCertificateList{
-		Version:             1,
-		Signature:           signatureAlgorithm,
-		Issuer:              c.Subject.ToRDNSequence(),
-		ThisUpdate:          now.UTC(),
-		NextUpdate:          expiry.UTC(),
-		RevokedCertificates: revokedCerts,
-	}
-
-	// Authority Key Id
-	if len(c.SubjectKeyId) > 0 {
-		var aki pkix.Extension
-		aki.Id = oidExtensionAuthorityKeyId
-		aki.Value, err = asn1.Marshal(authKeyId{Id: c.SubjectKeyId})
-		if err != nil {
-			return
-		}
-		tbsCertList.Extensions = append(tbsCertList.Extensions, aki)
-	}
-
-	tbsCertListContents, err := asn1.Marshal(tbsCertList)
-	if err != nil {
-		return
-	}
-
-	h := hashFunc.New()
-	h.Write(tbsCertListContents)
-	digest := h.Sum(nil)
-
-	var signature []byte
-	signature, err = key.Sign(rand, digest, hashFunc)
-	if err != nil {
-		return
-	}
-
-	return asn1.Marshal(pkix.CertificateList{
-		TBSCertList:        tbsCertList,
-		SignatureAlgorithm: signatureAlgorithm,
-		SignatureValue:     asn1.BitString{Bytes: signature, BitLength: len(signature) * 8},
-	})
-}
-
-// CertificateRequest represents a PKCS #10, certificate signature request.
-type CertificateRequest struct {
-	Raw                      []byte // Complete ASN.1 DER content (CSR, signature algorithm and signature).
-	RawTBSCertificateRequest []byte // Certificate request info part of raw ASN.1 DER content.
-	RawSubjectPublicKeyInfo  []byte // DER encoded SubjectPublicKeyInfo.
-	RawSubject               []byte // DER encoded Subject.
-
-	Version            int
-	Signature          []byte
-	SignatureAlgorithm SignatureAlgorithm
-
-	PublicKeyAlgorithm PublicKeyAlgorithm
-	PublicKey          interface{}
-
-	Subject pkix.Name
-
-	// Attributes is a collection of attributes providing
-	// additional information about the subject of the certificate.
-	// See RFC 2986 section 4.1.
-	Attributes []pkix.AttributeTypeAndValueSET
-
-	// Extensions contains raw X.509 extensions. When parsing CSRs, this
-	// can be used to extract extensions that are not parsed by this
-	// package.
-	Extensions []pkix.Extension
-
-	// ExtraExtensions contains extensions to be copied, raw, into any
-	// marshaled CSR. Values override any extensions that would otherwise
-	// be produced based on the other fields but are overridden by any
-	// extensions specified in Attributes.
-	//
-	// The ExtraExtensions field is not populated when parsing CSRs, see
-	// Extensions.
-	ExtraExtensions []pkix.Extension
-
-	// Subject Alternate Name values.
-	DNSNames       []string
-	EmailAddresses []string
-	IPAddresses    []net.IP
-}
-
-// These structures reflect the ASN.1 structure of X.509 certificate
-// signature requests (see RFC 2986):
-
-type tbsCertificateRequest struct {
-	Raw           asn1.RawContent
-	Version       int
-	Subject       asn1.RawValue
-	PublicKey     publicKeyInfo
-	RawAttributes []asn1.RawValue `asn1:"tag:0"`
-}
-
-type certificateRequest struct {
-	Raw                asn1.RawContent
-	TBSCSR             tbsCertificateRequest
-	SignatureAlgorithm pkix.AlgorithmIdentifier
-	SignatureValue     asn1.BitString
-}
-
-// oidExtensionRequest is a PKCS#9 OBJECT IDENTIFIER that indicates requested
-// extensions in a CSR.
-var oidExtensionRequest = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 9, 14}
-
-// newRawAttributes converts AttributeTypeAndValueSETs from a template
-// CertificateRequest's Attributes into tbsCertificateRequest RawAttributes.
-func newRawAttributes(attributes []pkix.AttributeTypeAndValueSET) ([]asn1.RawValue, error) {
-	var rawAttributes []asn1.RawValue
-	b, err := asn1.Marshal(attributes)
-	rest, err := asn1.Unmarshal(b, &rawAttributes)
-	if err != nil {
-		return nil, err
-	}
-	if len(rest) != 0 {
-		return nil, errors.New("x509: failed to unmarshall raw CSR Attributes")
-	}
-	return rawAttributes, nil
-}
-
-// parseRawAttributes Unmarshals RawAttributes intos AttributeTypeAndValueSETs.
-func parseRawAttributes(rawAttributes []asn1.RawValue) []pkix.AttributeTypeAndValueSET {
-	var attributes []pkix.AttributeTypeAndValueSET
-	for _, rawAttr := range rawAttributes {
-		var attr pkix.AttributeTypeAndValueSET
-		rest, err := asn1.Unmarshal(rawAttr.FullBytes, &attr)
-		// Ignore attributes that don't parse into pkix.AttributeTypeAndValueSET
-		// (i.e.: challengePassword or unstructuredName).
-		if err == nil && len(rest) == 0 {
-			attributes = append(attributes, attr)
-		}
-	}
-	return attributes
-}
-
-// CreateCertificateRequest creates a new certificate based on a template. The
-// following members of template are used: Subject, Attributes,
-// SignatureAlgorithm, Extensions, DNSNames, EmailAddresses, and IPAddresses.
-// The private key is the private key of the signer.
-//
-// The returned slice is the certificate request in DER encoding.
-//
-// All keys types that are implemented via crypto.Signer are supported (This
-// includes *rsa.PublicKey and *ecdsa.PublicKey.)
-func CreateCertificateRequest(rand io.Reader, template *CertificateRequest, priv interface{}) (csr []byte, err error) {
-	key, ok := priv.(crypto.Signer)
-	if !ok {
-		return nil, errors.New("x509: certificate private key does not implement crypto.Signer")
-	}
-
-	var hashFunc crypto.Hash
-	var sigAlgo pkix.AlgorithmIdentifier
-	hashFunc, sigAlgo, err = signingParamsForPublicKey(key.Public(), template.SignatureAlgorithm)
-	if err != nil {
-		return nil, err
-	}
-
-	var publicKeyBytes []byte
-	var publicKeyAlgorithm pkix.AlgorithmIdentifier
-	publicKeyBytes, publicKeyAlgorithm, err = marshalPublicKey(key.Public())
-	if err != nil {
-		return nil, err
-	}
-
-	var extensions []pkix.Extension
-
-	if (len(template.DNSNames) > 0 || len(template.EmailAddresses) > 0 || len(template.IPAddresses) > 0) &&
-		!oidInExtensions(oidExtensionSubjectAltName, template.ExtraExtensions) {
-		sanBytes, err := marshalSANs(template.DNSNames, template.EmailAddresses, template.IPAddresses)
-		if err != nil {
-			return nil, err
-		}
-
-		extensions = append(extensions, pkix.Extension{
-			Id:    oidExtensionSubjectAltName,
-			Value: sanBytes,
-		})
-	}
-
-	extensions = append(extensions, template.ExtraExtensions...)
-
-	var attributes []pkix.AttributeTypeAndValueSET
-	attributes = append(attributes, template.Attributes...)
-
-	if len(extensions) > 0 {
-		// specifiedExtensions contains all the extensions that we
-		// found specified via template.Attributes.
-		specifiedExtensions := make(map[string]bool)
-
-		for _, atvSet := range template.Attributes {
-			if !atvSet.Type.Equal(oidExtensionRequest) {
-				continue
-			}
-
-			for _, atvs := range atvSet.Value {
-				for _, atv := range atvs {
-					specifiedExtensions[atv.Type.String()] = true
-				}
-			}
-		}
-
-		atvs := make([]pkix.AttributeTypeAndValue, 0, len(extensions))
-		for _, e := range extensions {
-			if specifiedExtensions[e.Id.String()] {
-				// Attributes already contained a value for
-				// this extension and it takes priority.
-				continue
-			}
-
-			atvs = append(atvs, pkix.AttributeTypeAndValue{
-				// There is no place for the critical flag in a CSR.
-				Type:  e.Id,
-				Value: e.Value,
-			})
-		}
-
-		// Append the extensions to an existing attribute if possible.
-		appended := false
-		for _, atvSet := range attributes {
-			if !atvSet.Type.Equal(oidExtensionRequest) || len(atvSet.Value) == 0 {
-				continue
-			}
-
-			atvSet.Value[0] = append(atvSet.Value[0], atvs...)
-			appended = true
-			break
-		}
-
-		// Otherwise, add a new attribute for the extensions.
-		if !appended {
-			attributes = append(attributes, pkix.AttributeTypeAndValueSET{
-				Type: oidExtensionRequest,
-				Value: [][]pkix.AttributeTypeAndValue{
-					atvs,
-				},
-			})
-		}
-	}
-
-	asn1Subject := template.RawSubject
-	if len(asn1Subject) == 0 {
-		asn1Subject, err = asn1.Marshal(template.Subject.ToRDNSequence())
-		if err != nil {
-			return
-		}
-	}
-
-	rawAttributes, err := newRawAttributes(attributes)
-	if err != nil {
-		return
-	}
-
-	tbsCSR := tbsCertificateRequest{
-		Version: 0, // PKCS #10, RFC 2986
-		Subject: asn1.RawValue{FullBytes: asn1Subject},
-		PublicKey: publicKeyInfo{
-			Algorithm: publicKeyAlgorithm,
-			PublicKey: asn1.BitString{
-				Bytes:     publicKeyBytes,
-				BitLength: len(publicKeyBytes) * 8,
-			},
-		},
-		RawAttributes: rawAttributes,
-	}
-
-	tbsCSRContents, err := asn1.Marshal(tbsCSR)
-	if err != nil {
-		return
-	}
-	tbsCSR.Raw = tbsCSRContents
-
-	h := hashFunc.New()
-	h.Write(tbsCSRContents)
-	digest := h.Sum(nil)
-
-	var signature []byte
-	signature, err = key.Sign(rand, digest, hashFunc)
-	if err != nil {
-		return
-	}
-
-	return asn1.Marshal(certificateRequest{
-		TBSCSR:             tbsCSR,
-		SignatureAlgorithm: sigAlgo,
-		SignatureValue: asn1.BitString{
-			Bytes:     signature,
-			BitLength: len(signature) * 8,
-		},
-	})
-}
-
-// ParseCertificateRequest parses a single certificate request from the
-// given ASN.1 DER data.
-func ParseCertificateRequest(asn1Data []byte) (*CertificateRequest, error) {
-	var csr certificateRequest
-
-	rest, err := asn1.Unmarshal(asn1Data, &csr)
-	if err != nil {
-		return nil, err
-	} else if len(rest) != 0 {
-		return nil, asn1.SyntaxError{Msg: "trailing data"}
-	}
-
-	return parseCertificateRequest(&csr)
-}
-
-func parseCertificateRequest(in *certificateRequest) (*CertificateRequest, error) {
-	out := &CertificateRequest{
-		Raw: in.Raw,
-		RawTBSCertificateRequest: in.TBSCSR.Raw,
-		RawSubjectPublicKeyInfo:  in.TBSCSR.PublicKey.Raw,
-		RawSubject:               in.TBSCSR.Subject.FullBytes,
-
-		Signature:          in.SignatureValue.RightAlign(),
-		SignatureAlgorithm: getSignatureAlgorithmFromOID(in.SignatureAlgorithm.Algorithm),
-
-		PublicKeyAlgorithm: getPublicKeyAlgorithmFromOID(in.TBSCSR.PublicKey.Algorithm.Algorithm),
-
-		Version:    in.TBSCSR.Version,
-		Attributes: parseRawAttributes(in.TBSCSR.RawAttributes),
-	}
-
-	var err error
-	out.PublicKey, err = parsePublicKey(out.PublicKeyAlgorithm, &in.TBSCSR.PublicKey)
-	if err != nil {
-		return nil, err
-	}
-
-	var subject pkix.RDNSequence
-	if rest, err := asn1.Unmarshal(in.TBSCSR.Subject.FullBytes, &subject); err != nil {
-		return nil, err
-	} else if len(rest) != 0 {
-		return nil, errors.New("x509: trailing data after X.509 Subject")
-	}
-
-	out.Subject.FillFromRDNSequence(&subject)
-
-	var extensions []pkix.AttributeTypeAndValue
-
-	for _, atvSet := range out.Attributes {
-		if !atvSet.Type.Equal(oidExtensionRequest) {
-			continue
-		}
-
-		for _, atvs := range atvSet.Value {
-			extensions = append(extensions, atvs...)
-		}
-	}
-
-	out.Extensions = make([]pkix.Extension, 0, len(extensions))
-
-	for _, e := range extensions {
-		value, ok := e.Value.([]byte)
-		if !ok {
-			return nil, errors.New("x509: extension attribute contained non-OCTET STRING data")
-		}
-
-		out.Extensions = append(out.Extensions, pkix.Extension{
-			Id:    e.Type,
-			Value: value,
-		})
-
-		if len(e.Type) == 4 && e.Type[0] == 2 && e.Type[1] == 5 && e.Type[2] == 29 {
-			switch e.Type[3] {
-			case 17:
-				out.DNSNames, out.EmailAddresses, out.IPAddresses, err = parseSANExtension(value)
-				if err != nil {
-					return nil, err
-				}
-			}
-		}
-	}
-
-	return out, nil
-}
-
-// CheckSignature verifies that the signature on c is a valid signature
-func (c *CertificateRequest) CheckSignature() (err error) {
-	return checkSignature(c.SignatureAlgorithm, c.RawTBSCertificateRequest, c.Signature, c.PublicKey)
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/x509_test.go b/third_party/gofrontend/libgo/go/crypto/x509/x509_test.go
deleted file mode 100644
index f4f9fa2..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/x509_test.go
+++ /dev/null
@@ -1,1178 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package x509
-
-import (
-	"bytes"
-	"crypto/dsa"
-	"crypto/ecdsa"
-	"crypto/elliptic"
-	"crypto/rand"
-	"crypto/rsa"
-	_ "crypto/sha256"
-	_ "crypto/sha512"
-	"crypto/x509/pkix"
-	"encoding/asn1"
-	"encoding/base64"
-	"encoding/hex"
-	"encoding/pem"
-	"internal/testenv"
-	"math/big"
-	"net"
-	"os/exec"
-	"reflect"
-	"testing"
-	"time"
-)
-
-func TestParsePKCS1PrivateKey(t *testing.T) {
-	block, _ := pem.Decode([]byte(pemPrivateKey))
-	priv, err := ParsePKCS1PrivateKey(block.Bytes)
-	if err != nil {
-		t.Errorf("Failed to parse private key: %s", err)
-		return
-	}
-	if priv.PublicKey.N.Cmp(rsaPrivateKey.PublicKey.N) != 0 ||
-		priv.PublicKey.E != rsaPrivateKey.PublicKey.E ||
-		priv.D.Cmp(rsaPrivateKey.D) != 0 ||
-		priv.Primes[0].Cmp(rsaPrivateKey.Primes[0]) != 0 ||
-		priv.Primes[1].Cmp(rsaPrivateKey.Primes[1]) != 0 {
-		t.Errorf("got:%+v want:%+v", priv, rsaPrivateKey)
-	}
-
-	// This private key includes an invalid prime that
-	// rsa.PrivateKey.Validate should reject.
-	data := []byte("0\x16\x02\x00\x02\x02\u007f\x00\x02\x0200\x02\x0200\x02\x02\x00\x01\x02\x02\u007f\x00")
-	if _, err := ParsePKCS1PrivateKey(data); err == nil {
-		t.Errorf("parsing invalid private key did not result in an error")
-	}
-}
-
-func TestParsePKIXPublicKey(t *testing.T) {
-	block, _ := pem.Decode([]byte(pemPublicKey))
-	pub, err := ParsePKIXPublicKey(block.Bytes)
-	if err != nil {
-		t.Errorf("Failed to parse RSA public key: %s", err)
-		return
-	}
-	rsaPub, ok := pub.(*rsa.PublicKey)
-	if !ok {
-		t.Errorf("Value returned from ParsePKIXPublicKey was not an RSA public key")
-		return
-	}
-
-	pubBytes2, err := MarshalPKIXPublicKey(rsaPub)
-	if err != nil {
-		t.Errorf("Failed to marshal RSA public key for the second time: %s", err)
-		return
-	}
-	if !bytes.Equal(pubBytes2, block.Bytes) {
-		t.Errorf("Reserialization of public key didn't match. got %x, want %x", pubBytes2, block.Bytes)
-	}
-}
-
-var pemPublicKey = `-----BEGIN PUBLIC KEY-----
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3VoPN9PKUjKFLMwOge6+
-wnDi8sbETGIx2FKXGgqtAKpzmem53kRGEQg8WeqRmp12wgp74TGpkEXsGae7RS1k
-enJCnma4fii+noGH7R0qKgHvPrI2Bwa9hzsH8tHxpyM3qrXslOmD45EH9SxIDUBJ
-FehNdaPbLP1gFyahKMsdfxFJLUvbUycuZSJ2ZnIgeVxwm4qbSvZInL9Iu4FzuPtg
-fINKcbbovy1qq4KvPIrXzhbY3PWDc6btxCf3SE0JdE1MCPThntB62/bLMSQ7xdDR
-FF53oIpvxe/SCOymfWq/LW849Ytv3Xwod0+wzAP8STXG4HSELS4UedPYeHJJJYcZ
-+QIDAQAB
------END PUBLIC KEY-----
-`
-
-var pemPrivateKey = `-----BEGIN RSA PRIVATE KEY-----
-MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0
-fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu
-/ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWu
-RTUCIQDasvGASLqmjeffBNLTXV2A5g4t+kLVCpsEIZAycV5GswIhANEPLmax0ME/
-EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7A
-IU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlS
-tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
------END RSA PRIVATE KEY-----
-`
-
-func bigFromString(s string) *big.Int {
-	ret := new(big.Int)
-	ret.SetString(s, 10)
-	return ret
-}
-
-func fromBase10(base10 string) *big.Int {
-	i := new(big.Int)
-	i.SetString(base10, 10)
-	return i
-}
-
-func bigFromHexString(s string) *big.Int {
-	ret := new(big.Int)
-	ret.SetString(s, 16)
-	return ret
-}
-
-var rsaPrivateKey = &rsa.PrivateKey{
-	PublicKey: rsa.PublicKey{
-		N: bigFromString("9353930466774385905609975137998169297361893554149986716853295022578535724979677252958524466350471210367835187480748268864277464700638583474144061408845077"),
-		E: 65537,
-	},
-	D: bigFromString("7266398431328116344057699379749222532279343923819063639497049039389899328538543087657733766554155839834519529439851673014800261285757759040931985506583861"),
-	Primes: []*big.Int{
-		bigFromString("98920366548084643601728869055592650835572950932266967461790948584315647051443"),
-		bigFromString("94560208308847015747498523884063394671606671904944666360068158221458669711639"),
-	},
-}
-
-func TestMarshalRSAPrivateKey(t *testing.T) {
-	priv := &rsa.PrivateKey{
-		PublicKey: rsa.PublicKey{
-			N: fromBase10("16346378922382193400538269749936049106320265317511766357599732575277382844051791096569333808598921852351577762718529818072849191122419410612033592401403764925096136759934497687765453905884149505175426053037420486697072448609022753683683718057795566811401938833367954642951433473337066311978821180526439641496973296037000052546108507805269279414789035461158073156772151892452251106173507240488993608650881929629163465099476849643165682709047462010581308719577053905787496296934240246311806555924593059995202856826239801816771116902778517096212527979497399966526283516447337775509777558018145573127308919204297111496233"),
-			E: 3,
-		},
-		D: fromBase10("10897585948254795600358846499957366070880176878341177571733155050184921896034527397712889205732614568234385175145686545381899460748279607074689061600935843283397424506622998458510302603922766336783617368686090042765718290914099334449154829375179958369993407724946186243249568928237086215759259909861748642124071874879861299389874230489928271621259294894142840428407196932444474088857746123104978617098858619445675532587787023228852383149557470077802718705420275739737958953794088728369933811184572620857678792001136676902250566845618813972833750098806496641114644760255910789397593428910198080271317419213080834885003"),
-		Primes: []*big.Int{
-			fromBase10("1025363189502892836833747188838978207017355117492483312747347695538428729137306368764177201532277413433182799108299960196606011786562992097313508180436744488171474690412562218914213688661311117337381958560443"),
-			fromBase10("3467903426626310123395340254094941045497208049900750380025518552334536945536837294961497712862519984786362199788654739924501424784631315081391467293694361474867825728031147665777546570788493758372218019373"),
-			fromBase10("4597024781409332673052708605078359346966325141767460991205742124888960305710298765592730135879076084498363772408626791576005136245060321874472727132746643162385746062759369754202494417496879741537284589047"),
-		},
-	}
-
-	derBytes := MarshalPKCS1PrivateKey(priv)
-
-	priv2, err := ParsePKCS1PrivateKey(derBytes)
-	if err != nil {
-		t.Errorf("error parsing serialized key: %s", err)
-		return
-	}
-	if priv.PublicKey.N.Cmp(priv2.PublicKey.N) != 0 ||
-		priv.PublicKey.E != priv2.PublicKey.E ||
-		priv.D.Cmp(priv2.D) != 0 ||
-		len(priv2.Primes) != 3 ||
-		priv.Primes[0].Cmp(priv2.Primes[0]) != 0 ||
-		priv.Primes[1].Cmp(priv2.Primes[1]) != 0 ||
-		priv.Primes[2].Cmp(priv2.Primes[2]) != 0 {
-		t.Errorf("got:%+v want:%+v", priv, priv2)
-	}
-}
-
-type matchHostnamesTest struct {
-	pattern, host string
-	ok            bool
-}
-
-var matchHostnamesTests = []matchHostnamesTest{
-	{"a.b.c", "a.b.c", true},
-	{"a.b.c", "b.b.c", false},
-	{"", "b.b.c", false},
-	{"a.b.c", "", false},
-	{"example.com", "example.com", true},
-	{"example.com", "www.example.com", false},
-	{"*.example.com", "example.com", false},
-	{"*.example.com", "www.example.com", true},
-	{"*.example.com", "www.example.com.", true},
-	{"*.example.com", "xyz.www.example.com", false},
-	{"*.*.example.com", "xyz.www.example.com", false},
-	{"*.www.*.com", "xyz.www.example.com", false},
-	{"*bar.example.com", "foobar.example.com", false},
-	{"f*.example.com", "foobar.example.com", false},
-	{"", ".", false},
-	{".", "", false},
-	{".", ".", false},
-	{"example.com", "example.com.", true},
-	{"example.com.", "example.com", true},
-	{"example.com.", "example.com.", true},
-	{"*.com.", "example.com.", true},
-	{"*.com.", "example.com", true},
-	{"*.com", "example.com", true},
-	{"*.com", "example.com.", true},
-}
-
-func TestMatchHostnames(t *testing.T) {
-	for i, test := range matchHostnamesTests {
-		r := matchHostnames(test.pattern, test.host)
-		if r != test.ok {
-			t.Errorf("#%d mismatch got: %t want: %t when matching '%s' against '%s'", i, r, test.ok, test.host, test.pattern)
-		}
-	}
-}
-
-func TestMatchIP(t *testing.T) {
-	// Check that pattern matching is working.
-	c := &Certificate{
-		DNSNames: []string{"*.foo.bar.baz"},
-		Subject: pkix.Name{
-			CommonName: "*.foo.bar.baz",
-		},
-	}
-	err := c.VerifyHostname("quux.foo.bar.baz")
-	if err != nil {
-		t.Fatalf("VerifyHostname(quux.foo.bar.baz): %v", err)
-	}
-
-	// But check that if we change it to be matching against an IP address,
-	// it is rejected.
-	c = &Certificate{
-		DNSNames: []string{"*.2.3.4"},
-		Subject: pkix.Name{
-			CommonName: "*.2.3.4",
-		},
-	}
-	err = c.VerifyHostname("1.2.3.4")
-	if err == nil {
-		t.Fatalf("VerifyHostname(1.2.3.4) should have failed, did not")
-	}
-
-	c = &Certificate{
-		IPAddresses: []net.IP{net.ParseIP("127.0.0.1"), net.ParseIP("::1")},
-	}
-	err = c.VerifyHostname("127.0.0.1")
-	if err != nil {
-		t.Fatalf("VerifyHostname(127.0.0.1): %v", err)
-	}
-	err = c.VerifyHostname("::1")
-	if err != nil {
-		t.Fatalf("VerifyHostname(::1): %v", err)
-	}
-	err = c.VerifyHostname("[::1]")
-	if err != nil {
-		t.Fatalf("VerifyHostname([::1]): %v", err)
-	}
-}
-
-func TestCertificateParse(t *testing.T) {
-	s, _ := hex.DecodeString(certBytes)
-	certs, err := ParseCertificates(s)
-	if err != nil {
-		t.Error(err)
-	}
-	if len(certs) != 2 {
-		t.Errorf("Wrong number of certs: got %d want 2", len(certs))
-		return
-	}
-
-	err = certs[0].CheckSignatureFrom(certs[1])
-	if err != nil {
-		t.Error(err)
-	}
-
-	if err := certs[0].VerifyHostname("mail.google.com"); err != nil {
-		t.Error(err)
-	}
-
-	const expectedExtensions = 4
-	if n := len(certs[0].Extensions); n != expectedExtensions {
-		t.Errorf("want %d extensions, got %d", expectedExtensions, n)
-	}
-}
-
-var certBytes = "308203223082028ba00302010202106edf0d9499fd4533dd1297fc42a93be1300d06092a864886" +
-	"f70d0101050500304c310b3009060355040613025a4131253023060355040a131c546861777465" +
-	"20436f6e73756c74696e67202850747929204c74642e311630140603550403130d546861777465" +
-	"20534743204341301e170d3039303332353136343932395a170d3130303332353136343932395a" +
-	"3069310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630" +
-	"140603550407130d4d6f756e7461696e205669657731133011060355040a130a476f6f676c6520" +
-	"496e63311830160603550403130f6d61696c2e676f6f676c652e636f6d30819f300d06092a8648" +
-	"86f70d010101050003818d0030818902818100c5d6f892fccaf5614b064149e80a2c9581a218ef" +
-	"41ec35bd7a58125ae76f9ea54ddc893abbeb029f6b73616bf0ffd868791fba7af9c4aebf3706ba" +
-	"3eeaeed27435b4ddcfb157c05f351d66aa87fee0de072d66d773affbd36ab78bef090e0cc861a9" +
-	"03ac90dd98b51c9c41566c017f0beec3bff391051ffba0f5cc6850ad2a590203010001a381e730" +
-	"81e430280603551d250421301f06082b0601050507030106082b06010505070302060960864801" +
-	"86f842040130360603551d1f042f302d302ba029a0278625687474703a2f2f63726c2e74686177" +
-	"74652e636f6d2f54686177746553474343412e63726c307206082b060105050701010466306430" +
-	"2206082b060105050730018616687474703a2f2f6f6373702e7468617774652e636f6d303e0608" +
-	"2b060105050730028632687474703a2f2f7777772e7468617774652e636f6d2f7265706f736974" +
-	"6f72792f5468617774655f5347435f43412e637274300c0603551d130101ff04023000300d0609" +
-	"2a864886f70d01010505000381810062f1f3050ebc105e497c7aedf87e24d2f4a986bb3b837bd1" +
-	"9b91ebcad98b065992f6bd2b49b7d6d3cb2e427a99d606c7b1d46352527fac39e6a8b6726de5bf" +
-	"70212a52cba07634a5e332011bd1868e78eb5e3c93cf03072276786f207494feaa0ed9d53b2110" +
-	"a76571f90209cdae884385c882587030ee15f33d761e2e45a6bc308203233082028ca003020102" +
-	"020430000002300d06092a864886f70d0101050500305f310b3009060355040613025553311730" +
-	"15060355040a130e566572695369676e2c20496e632e31373035060355040b132e436c61737320" +
-	"33205075626c6963205072696d6172792043657274696669636174696f6e20417574686f726974" +
-	"79301e170d3034303531333030303030305a170d3134303531323233353935395a304c310b3009" +
-	"060355040613025a4131253023060355040a131c54686177746520436f6e73756c74696e672028" +
-	"50747929204c74642e311630140603550403130d5468617774652053474320434130819f300d06" +
-	"092a864886f70d010101050003818d0030818902818100d4d367d08d157faecd31fe7d1d91a13f" +
-	"0b713cacccc864fb63fc324b0794bd6f80ba2fe10493c033fc093323e90b742b71c403c6d2cde2" +
-	"2ff50963cdff48a500bfe0e7f388b72d32de9836e60aad007bc4644a3b847503f270927d0e62f5" +
-	"21ab693684317590f8bfc76c881b06957cc9e5a8de75a12c7a68dfd5ca1c875860190203010001" +
-	"a381fe3081fb30120603551d130101ff040830060101ff020100300b0603551d0f040403020106" +
-	"301106096086480186f842010104040302010630280603551d110421301fa41d301b3119301706" +
-	"035504031310507269766174654c6162656c332d313530310603551d1f042a30283026a024a022" +
-	"8620687474703a2f2f63726c2e766572697369676e2e636f6d2f706361332e63726c303206082b" +
-	"0601050507010104263024302206082b060105050730018616687474703a2f2f6f6373702e7468" +
-	"617774652e636f6d30340603551d25042d302b06082b0601050507030106082b06010505070302" +
-	"06096086480186f8420401060a6086480186f845010801300d06092a864886f70d010105050003" +
-	"81810055ac63eadea1ddd2905f9f0bce76be13518f93d9052bc81b774bad6950a1eededcfddb07" +
-	"e9e83994dcab72792f06bfab8170c4a8edea5334edef1e53d906c7562bd15cf4d18a8eb42bb137" +
-	"9048084225c53e8acb7feb6f04d16dc574a2f7a27c7b603c77cd0ece48027f012fb69b37e02a2a" +
-	"36dcd585d6ace53f546f961e05af"
-
-func TestCreateSelfSignedCertificate(t *testing.T) {
-	random := rand.Reader
-
-	block, _ := pem.Decode([]byte(pemPrivateKey))
-	rsaPriv, err := ParsePKCS1PrivateKey(block.Bytes)
-	if err != nil {
-		t.Fatalf("Failed to parse private key: %s", err)
-	}
-
-	ecdsaPriv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
-	if err != nil {
-		t.Fatalf("Failed to generate ECDSA key: %s", err)
-	}
-
-	tests := []struct {
-		name      string
-		pub, priv interface{}
-		checkSig  bool
-		sigAlgo   SignatureAlgorithm
-	}{
-		{"RSA/RSA", &rsaPriv.PublicKey, rsaPriv, true, SHA1WithRSA},
-		{"RSA/ECDSA", &rsaPriv.PublicKey, ecdsaPriv, false, ECDSAWithSHA384},
-		{"ECDSA/RSA", &ecdsaPriv.PublicKey, rsaPriv, false, SHA256WithRSA},
-		{"ECDSA/ECDSA", &ecdsaPriv.PublicKey, ecdsaPriv, true, ECDSAWithSHA1},
-	}
-
-	testExtKeyUsage := []ExtKeyUsage{ExtKeyUsageClientAuth, ExtKeyUsageServerAuth}
-	testUnknownExtKeyUsage := []asn1.ObjectIdentifier{[]int{1, 2, 3}, []int{2, 59, 1}}
-	extraExtensionData := []byte("extra extension")
-
-	for _, test := range tests {
-		commonName := "test.example.com"
-		template := Certificate{
-			SerialNumber: big.NewInt(1),
-			Subject: pkix.Name{
-				CommonName:   commonName,
-				Organization: []string{"Σ Acme Co"},
-				Country:      []string{"US"},
-				ExtraNames: []pkix.AttributeTypeAndValue{
-					{
-						Type:  []int{2, 5, 4, 42},
-						Value: "Gopher",
-					},
-					// This should override the Country, above.
-					{
-						Type:  []int{2, 5, 4, 6},
-						Value: "NL",
-					},
-				},
-			},
-			NotBefore: time.Unix(1000, 0),
-			NotAfter:  time.Unix(100000, 0),
-
-			SignatureAlgorithm: test.sigAlgo,
-
-			SubjectKeyId: []byte{1, 2, 3, 4},
-			KeyUsage:     KeyUsageCertSign,
-
-			ExtKeyUsage:        testExtKeyUsage,
-			UnknownExtKeyUsage: testUnknownExtKeyUsage,
-
-			BasicConstraintsValid: true,
-			IsCA: true,
-
-			OCSPServer:            []string{"http://ocsp.example.com"},
-			IssuingCertificateURL: []string{"http://crt.example.com/ca1.crt"},
-
-			DNSNames:       []string{"test.example.com"},
-			EmailAddresses: []string{"gopher@golang.org"},
-			IPAddresses:    []net.IP{net.IPv4(127, 0, 0, 1).To4(), net.ParseIP("2001:4860:0:2001::68")},
-
-			PolicyIdentifiers:   []asn1.ObjectIdentifier{[]int{1, 2, 3}},
-			PermittedDNSDomains: []string{".example.com", "example.com"},
-
-			CRLDistributionPoints: []string{"http://crl1.example.com/ca1.crl", "http://crl2.example.com/ca1.crl"},
-
-			ExtraExtensions: []pkix.Extension{
-				{
-					Id:    []int{1, 2, 3, 4},
-					Value: extraExtensionData,
-				},
-				// This extension should override the SubjectKeyId, above.
-				{
-					Id:       oidExtensionSubjectKeyId,
-					Critical: false,
-					Value:    []byte{0x04, 0x04, 4, 3, 2, 1},
-				},
-			},
-		}
-
-		derBytes, err := CreateCertificate(random, &template, &template, test.pub, test.priv)
-		if err != nil {
-			t.Errorf("%s: failed to create certificate: %s", test.name, err)
-			continue
-		}
-
-		cert, err := ParseCertificate(derBytes)
-		if err != nil {
-			t.Errorf("%s: failed to parse certificate: %s", test.name, err)
-			continue
-		}
-
-		if len(cert.PolicyIdentifiers) != 1 || !cert.PolicyIdentifiers[0].Equal(template.PolicyIdentifiers[0]) {
-			t.Errorf("%s: failed to parse policy identifiers: got:%#v want:%#v", test.name, cert.PolicyIdentifiers, template.PolicyIdentifiers)
-		}
-
-		if len(cert.PermittedDNSDomains) != 2 || cert.PermittedDNSDomains[0] != ".example.com" || cert.PermittedDNSDomains[1] != "example.com" {
-			t.Errorf("%s: failed to parse name constraints: %#v", test.name, cert.PermittedDNSDomains)
-		}
-
-		if cert.Subject.CommonName != commonName {
-			t.Errorf("%s: subject wasn't correctly copied from the template. Got %s, want %s", test.name, cert.Subject.CommonName, commonName)
-		}
-
-		if len(cert.Subject.Country) != 1 || cert.Subject.Country[0] != "NL" {
-			t.Errorf("%s: ExtraNames didn't override Country", test.name)
-		}
-
-		found := false
-		for _, atv := range cert.Subject.Names {
-			if atv.Type.Equal([]int{2, 5, 4, 42}) {
-				found = true
-				break
-			}
-		}
-		if !found {
-			t.Errorf("%s: Names didn't contain oid 2.5.4.42 from ExtraNames", test.name)
-		}
-
-		if cert.Issuer.CommonName != commonName {
-			t.Errorf("%s: issuer wasn't correctly copied from the template. Got %s, want %s", test.name, cert.Issuer.CommonName, commonName)
-		}
-
-		if cert.SignatureAlgorithm != test.sigAlgo {
-			t.Errorf("%s: SignatureAlgorithm wasn't copied from template. Got %v, want %v", test.name, cert.SignatureAlgorithm, test.sigAlgo)
-		}
-
-		if !reflect.DeepEqual(cert.ExtKeyUsage, testExtKeyUsage) {
-			t.Errorf("%s: extkeyusage wasn't correctly copied from the template. Got %v, want %v", test.name, cert.ExtKeyUsage, testExtKeyUsage)
-		}
-
-		if !reflect.DeepEqual(cert.UnknownExtKeyUsage, testUnknownExtKeyUsage) {
-			t.Errorf("%s: unknown extkeyusage wasn't correctly copied from the template. Got %v, want %v", test.name, cert.UnknownExtKeyUsage, testUnknownExtKeyUsage)
-		}
-
-		if !reflect.DeepEqual(cert.OCSPServer, template.OCSPServer) {
-			t.Errorf("%s: OCSP servers differ from template. Got %v, want %v", test.name, cert.OCSPServer, template.OCSPServer)
-		}
-
-		if !reflect.DeepEqual(cert.IssuingCertificateURL, template.IssuingCertificateURL) {
-			t.Errorf("%s: Issuing certificate URLs differ from template. Got %v, want %v", test.name, cert.IssuingCertificateURL, template.IssuingCertificateURL)
-		}
-
-		if !reflect.DeepEqual(cert.DNSNames, template.DNSNames) {
-			t.Errorf("%s: SAN DNS names differ from template. Got %v, want %v", test.name, cert.DNSNames, template.DNSNames)
-		}
-
-		if !reflect.DeepEqual(cert.EmailAddresses, template.EmailAddresses) {
-			t.Errorf("%s: SAN emails differ from template. Got %v, want %v", test.name, cert.EmailAddresses, template.EmailAddresses)
-		}
-
-		if !reflect.DeepEqual(cert.IPAddresses, template.IPAddresses) {
-			t.Errorf("%s: SAN IPs differ from template. Got %v, want %v", test.name, cert.IPAddresses, template.IPAddresses)
-		}
-
-		if !reflect.DeepEqual(cert.CRLDistributionPoints, template.CRLDistributionPoints) {
-			t.Errorf("%s: CRL distribution points differ from template. Got %v, want %v", test.name, cert.CRLDistributionPoints, template.CRLDistributionPoints)
-		}
-
-		if !bytes.Equal(cert.SubjectKeyId, []byte{4, 3, 2, 1}) {
-			t.Errorf("%s: ExtraExtensions didn't override SubjectKeyId", test.name)
-		}
-
-		if bytes.Index(derBytes, extraExtensionData) == -1 {
-			t.Errorf("%s: didn't find extra extension in DER output", test.name)
-		}
-
-		if test.checkSig {
-			err = cert.CheckSignatureFrom(cert)
-			if err != nil {
-				t.Errorf("%s: signature verification failed: %s", test.name, err)
-			}
-		}
-	}
-}
-
-func TestUnknownCriticalExtension(t *testing.T) {
-	priv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
-	if err != nil {
-		t.Fatalf("Failed to generate ECDSA key: %s", err)
-	}
-
-	oids := []asn1.ObjectIdentifier{
-		// This OID is in the PKIX arc, but unknown.
-		asn1.ObjectIdentifier{2, 5, 29, 999999},
-		// This is a nonsense, unassigned OID.
-		asn1.ObjectIdentifier{1, 2, 3, 4},
-	}
-
-	for _, oid := range oids {
-		template := Certificate{
-			SerialNumber: big.NewInt(1),
-			Subject: pkix.Name{
-				CommonName: "foo",
-			},
-			NotBefore: time.Unix(1000, 0),
-			NotAfter:  time.Now().AddDate(1, 0, 0),
-
-			BasicConstraintsValid: true,
-			IsCA: true,
-
-			KeyUsage:    KeyUsageCertSign,
-			ExtKeyUsage: []ExtKeyUsage{ExtKeyUsageServerAuth},
-
-			ExtraExtensions: []pkix.Extension{
-				{
-					Id:       oid,
-					Critical: true,
-					Value:    nil,
-				},
-			},
-		}
-
-		derBytes, err := CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv)
-		if err != nil {
-			t.Fatalf("failed to create certificate: %s", err)
-		}
-
-		cert, err := ParseCertificate(derBytes)
-		if err != nil {
-			t.Fatalf("Certificate with unknown critical extension was not parsed: %s", err)
-		}
-
-		roots := NewCertPool()
-		roots.AddCert(cert)
-
-		// Setting Roots ensures that Verify won't delegate to the OS
-		// library and thus the correct error should always be
-		// returned.
-		_, err = cert.Verify(VerifyOptions{Roots: roots})
-		if err == nil {
-			t.Fatal("Certificate with unknown critical extension was verified without error")
-		}
-		if _, ok := err.(UnhandledCriticalExtension); !ok {
-			t.Fatalf("Error was %#v, but wanted one of type UnhandledCriticalExtension", err)
-		}
-
-		cert.UnhandledCriticalExtensions = nil
-		if _, err = cert.Verify(VerifyOptions{Roots: roots}); err != nil {
-			t.Errorf("Certificate failed to verify after unhandled critical extensions were cleared: %s", err)
-		}
-	}
-}
-
-// Self-signed certificate using ECDSA with SHA1 & secp256r1
-var ecdsaSHA1CertPem = `
------BEGIN CERTIFICATE-----
-MIICDjCCAbUCCQDF6SfN0nsnrjAJBgcqhkjOPQQBMIGPMQswCQYDVQQGEwJVUzET
-MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEVMBMG
-A1UECgwMR29vZ2xlLCBJbmMuMRcwFQYDVQQDDA53d3cuZ29vZ2xlLmNvbTEjMCEG
-CSqGSIb3DQEJARYUZ29sYW5nLWRldkBnbWFpbC5jb20wHhcNMTIwNTIwMjAyMDUw
-WhcNMjIwNTE4MjAyMDUwWjCBjzELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlm
-b3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFTATBgNVBAoMDEdvb2dsZSwg
-SW5jLjEXMBUGA1UEAwwOd3d3Lmdvb2dsZS5jb20xIzAhBgkqhkiG9w0BCQEWFGdv
-bGFuZy1kZXZAZ21haWwuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/Wgn
-WQDo5+bz71T0327ERgd5SDDXFbXLpzIZDXTkjpe8QTEbsF+ezsQfrekrpDPC4Cd3
-P9LY0tG+aI8IyVKdUjAJBgcqhkjOPQQBA0gAMEUCIGlsqMcRqWVIWTD6wXwe6Jk2
-DKxL46r/FLgJYnzBEH99AiEA3fBouObsvV1R3oVkb4BQYnD4/4LeId6lAT43YvyV
-a/A=
------END CERTIFICATE-----
-`
-
-// Self-signed certificate using ECDSA with SHA256 & secp256r1
-var ecdsaSHA256p256CertPem = `
------BEGIN CERTIFICATE-----
-MIICDzCCAbYCCQDlsuMWvgQzhTAKBggqhkjOPQQDAjCBjzELMAkGA1UEBhMCVVMx
-EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFTAT
-BgNVBAoMDEdvb2dsZSwgSW5jLjEXMBUGA1UEAwwOd3d3Lmdvb2dsZS5jb20xIzAh
-BgkqhkiG9w0BCQEWFGdvbGFuZy1kZXZAZ21haWwuY29tMB4XDTEyMDUyMTAwMTkx
-NloXDTIyMDUxOTAwMTkxNlowgY8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxp
-Zm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRUwEwYDVQQKDAxHb29nbGUs
-IEluYy4xFzAVBgNVBAMMDnd3dy5nb29nbGUuY29tMSMwIQYJKoZIhvcNAQkBFhRn
-b2xhbmctZGV2QGdtYWlsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABPMt
-2ErhxAty5EJRu9yM+MTy+hUXm3pdW1ensAv382KoGExSXAFWP7pjJnNtHO+XSwVm
-YNtqjcAGFKpweoN//kQwCgYIKoZIzj0EAwIDRwAwRAIgIYSaUA/IB81gjbIw/hUV
-70twxJr5EcgOo0hLp3Jm+EYCIFDO3NNcgmURbJ1kfoS3N/0O+irUtoPw38YoNkqJ
-h5wi
------END CERTIFICATE-----
-`
-
-// Self-signed certificate using ECDSA with SHA256 & secp384r1
-var ecdsaSHA256p384CertPem = `
------BEGIN CERTIFICATE-----
-MIICSjCCAdECCQDje/no7mXkVzAKBggqhkjOPQQDAjCBjjELMAkGA1UEBhMCVVMx
-EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFDAS
-BgNVBAoMC0dvb2dsZSwgSW5jMRcwFQYDVQQDDA53d3cuZ29vZ2xlLmNvbTEjMCEG
-CSqGSIb3DQEJARYUZ29sYW5nLWRldkBnbWFpbC5jb20wHhcNMTIwNTIxMDYxMDM0
-WhcNMjIwNTE5MDYxMDM0WjCBjjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlm
-b3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFDASBgNVBAoMC0dvb2dsZSwg
-SW5jMRcwFQYDVQQDDA53d3cuZ29vZ2xlLmNvbTEjMCEGCSqGSIb3DQEJARYUZ29s
-YW5nLWRldkBnbWFpbC5jb20wdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARRuzRNIKRK
-jIktEmXanNmrTR/q/FaHXLhWRZ6nHWe26Fw7Rsrbk+VjGy4vfWtNn7xSFKrOu5ze
-qxKnmE0h5E480MNgrUiRkaGO2GMJJVmxx20aqkXOk59U8yGA4CghE6MwCgYIKoZI
-zj0EAwIDZwAwZAIwBZEN8gvmRmfeP/9C1PRLzODIY4JqWub2PLRT4mv9GU+yw3Gr
-PU9A3CHMdEcdw/MEAjBBO1lId8KOCh9UZunsSMfqXiVurpzmhWd6VYZ/32G+M+Mh
-3yILeYQzllt/g0rKVRk=
------END CERTIFICATE-----
-`
-
-// Self-signed certificate using ECDSA with SHA384 & secp521r1
-var ecdsaSHA384p521CertPem = `
------BEGIN CERTIFICATE-----
-MIICljCCAfcCCQDhp1AFD/ahKjAKBggqhkjOPQQDAzCBjjELMAkGA1UEBhMCVVMx
-EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFDAS
-BgNVBAoMC0dvb2dsZSwgSW5jMRcwFQYDVQQDDA53d3cuZ29vZ2xlLmNvbTEjMCEG
-CSqGSIb3DQEJARYUZ29sYW5nLWRldkBnbWFpbC5jb20wHhcNMTIwNTIxMTUwNDI5
-WhcNMjIwNTE5MTUwNDI5WjCBjjELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlm
-b3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFDASBgNVBAoMC0dvb2dsZSwg
-SW5jMRcwFQYDVQQDDA53d3cuZ29vZ2xlLmNvbTEjMCEGCSqGSIb3DQEJARYUZ29s
-YW5nLWRldkBnbWFpbC5jb20wgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABACqx9Rv
-IssRs1LWYcNN+WffwlHw4Tv3y8/LIAA9MF1ZScIonU9nRMxt4a2uGJVCPDw6JHpz
-PaYc0E9puLoE9AfKpwFr59Jkot7dBg55SKPEFkddoip/rvmN7NPAWjMBirOwjOkm
-8FPthvPhGPqsu9AvgVuHu3PosWiHGNrhh379pva8MzAKBggqhkjOPQQDAwOBjAAw
-gYgCQgEHNmswkUdPpHqrVxp9PvLVl+xxPuHBkT+75z9JizyxtqykHQo9Uh6SWCYH
-BF9KLolo01wMt8DjoYP5Fb3j5MH7xwJCAbWZzTOp4l4DPkIvAh4LeC4VWbwPPyqh
-kBg71w/iEcSY3wUKgHGcJJrObZw7wys91I5kENljqw/Samdr3ka+jBJa
------END CERTIFICATE-----
-`
-
-var ecdsaTests = []struct {
-	sigAlgo SignatureAlgorithm
-	pemCert string
-}{
-	{ECDSAWithSHA1, ecdsaSHA1CertPem},
-	{ECDSAWithSHA256, ecdsaSHA256p256CertPem},
-	{ECDSAWithSHA256, ecdsaSHA256p384CertPem},
-	{ECDSAWithSHA384, ecdsaSHA384p521CertPem},
-}
-
-func TestECDSA(t *testing.T) {
-	for i, test := range ecdsaTests {
-		pemBlock, _ := pem.Decode([]byte(test.pemCert))
-		cert, err := ParseCertificate(pemBlock.Bytes)
-		if err != nil {
-			t.Errorf("%d: failed to parse certificate: %s", i, err)
-			continue
-		}
-		if sa := cert.SignatureAlgorithm; sa != test.sigAlgo {
-			t.Errorf("%d: signature algorithm is %v, want %v", i, sa, test.sigAlgo)
-		}
-		if parsedKey, ok := cert.PublicKey.(*ecdsa.PublicKey); !ok {
-			t.Errorf("%d: wanted an ECDSA public key but found: %#v", i, parsedKey)
-		}
-		if pka := cert.PublicKeyAlgorithm; pka != ECDSA {
-			t.Errorf("%d: public key algorithm is %v, want ECDSA", i, pka)
-		}
-		if err = cert.CheckSignatureFrom(cert); err != nil {
-			t.Errorf("%d: certificate verification failed: %s", i, err)
-		}
-	}
-}
-
-// Self-signed certificate using DSA with SHA1
-var dsaCertPem = `-----BEGIN CERTIFICATE-----
-MIIEDTCCA82gAwIBAgIJALHPghaoxeDhMAkGByqGSM44BAMweTELMAkGA1UEBhMC
-VVMxCzAJBgNVBAgTAk5DMQ8wDQYDVQQHEwZOZXd0b24xFDASBgNVBAoTC0dvb2ds
-ZSwgSW5jMRIwEAYDVQQDEwlKb24gQWxsaWUxIjAgBgkqhkiG9w0BCQEWE2pvbmFs
-bGllQGdvb2dsZS5jb20wHhcNMTEwNTE0MDMwMTQ1WhcNMTEwNjEzMDMwMTQ1WjB5
-MQswCQYDVQQGEwJVUzELMAkGA1UECBMCTkMxDzANBgNVBAcTBk5ld3RvbjEUMBIG
-A1UEChMLR29vZ2xlLCBJbmMxEjAQBgNVBAMTCUpvbiBBbGxpZTEiMCAGCSqGSIb3
-DQEJARYTam9uYWxsaWVAZ29vZ2xlLmNvbTCCAbcwggEsBgcqhkjOOAQBMIIBHwKB
-gQC8hLUnQ7FpFYu4WXTj6DKvXvz8QrJkNJCVMTpKAT7uBpobk32S5RrPKXocd4gN
-8lyGB9ggS03EVlEwXvSmO0DH2MQtke2jl9j1HLydClMf4sbx5V6TV9IFw505U1iW
-jL7awRMgxge+FsudtJK254FjMFo03ZnOQ8ZJJ9E6AEDrlwIVAJpnBn9moyP11Ox5
-Asc/5dnjb6dPAoGBAJFHd4KVv1iTVCvEG6gGiYop5DJh28hUQcN9kul+2A0yPUSC
-X93oN00P8Vh3eYgSaCWZsha7zDG53MrVJ0Zf6v/X/CoZNhLldeNOepivTRAzn+Rz
-kKUYy5l1sxYLHQKF0UGNCXfFKZT0PCmgU+PWhYNBBMn6/cIh44vp85ideo5CA4GE
-AAKBgFmifCafzeRaohYKXJgMGSEaggCVCRq5xdyDCat+wbOkjC4mfG01/um3G8u5
-LxasjlWRKTR/tcAL7t0QuokVyQaYdVypZXNaMtx1db7YBuHjj3aP+8JOQRI9xz8c
-bp5NDJ5pISiFOv4p3GZfqZPcqckDt78AtkQrmnal2txhhjF6o4HeMIHbMB0GA1Ud
-DgQWBBQVyyr7hO11ZFFpWX50298Sa3V+rzCBqwYDVR0jBIGjMIGggBQVyyr7hO11
-ZFFpWX50298Sa3V+r6F9pHsweTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAk5DMQ8w
-DQYDVQQHEwZOZXd0b24xFDASBgNVBAoTC0dvb2dsZSwgSW5jMRIwEAYDVQQDEwlK
-b24gQWxsaWUxIjAgBgkqhkiG9w0BCQEWE2pvbmFsbGllQGdvb2dsZS5jb22CCQCx
-z4IWqMXg4TAMBgNVHRMEBTADAQH/MAkGByqGSM44BAMDLwAwLAIUPtn/5j8Q1jJI
-7ggOIsgrhgUdjGQCFCsmDq1H11q9+9Wp9IMeGrTSKHIM
------END CERTIFICATE-----
-`
-
-func TestParseCertificateWithDsaPublicKey(t *testing.T) {
-	expectedKey := &dsa.PublicKey{
-		Parameters: dsa.Parameters{
-			P: bigFromHexString("00BC84B52743B169158BB85974E3E832AF5EFCFC42B264349095313A4A013EEE069A1B937D92E51ACF297A1C77880DF25C8607D8204B4DC45651305EF4A63B40C7D8C42D91EDA397D8F51CBC9D0A531FE2C6F1E55E9357D205C39D395358968CBEDAC11320C607BE16CB9DB492B6E78163305A34DD99CE43C64927D13A0040EB97"),
-			Q: bigFromHexString("009A67067F66A323F5D4EC7902C73FE5D9E36FA74F"),
-			G: bigFromHexString("009147778295BF5893542BC41BA806898A29E43261DBC85441C37D92E97ED80D323D44825FDDE8374D0FF15877798812682599B216BBCC31B9DCCAD527465FEAFFD7FC2A193612E575E34E7A98AF4D10339FE47390A518CB9975B3160B1D0285D1418D0977C52994F43C29A053E3D685834104C9FAFDC221E38BE9F3989D7A8E42"),
-		},
-		Y: bigFromHexString("59A27C269FCDE45AA2160A5C980C19211A820095091AB9C5DC8309AB7EC1B3A48C2E267C6D35FEE9B71BCBB92F16AC8E559129347FB5C00BEEDD10BA8915C90698755CA965735A32DC7575BED806E1E38F768FFBC24E41123DC73F1C6E9E4D0C9E692128853AFE29DC665FA993DCA9C903B7BF00B6442B9A76A5DADC6186317A"),
-	}
-	pemBlock, _ := pem.Decode([]byte(dsaCertPem))
-	cert, err := ParseCertificate(pemBlock.Bytes)
-	if err != nil {
-		t.Fatalf("Failed to parse certificate: %s", err)
-	}
-	if cert.PublicKeyAlgorithm != DSA {
-		t.Errorf("Parsed key algorithm was not DSA")
-	}
-	parsedKey, ok := cert.PublicKey.(*dsa.PublicKey)
-	if !ok {
-		t.Fatalf("Parsed key was not a DSA key: %s", err)
-	}
-	if expectedKey.Y.Cmp(parsedKey.Y) != 0 ||
-		expectedKey.P.Cmp(parsedKey.P) != 0 ||
-		expectedKey.Q.Cmp(parsedKey.Q) != 0 ||
-		expectedKey.G.Cmp(parsedKey.G) != 0 {
-		t.Fatal("Parsed key differs from expected key")
-	}
-}
-
-func TestParseCertificateWithDSASignatureAlgorithm(t *testing.T) {
-	pemBlock, _ := pem.Decode([]byte(dsaCertPem))
-	cert, err := ParseCertificate(pemBlock.Bytes)
-	if err != nil {
-		t.Fatalf("Failed to parse certificate: %s", err)
-	}
-	if cert.SignatureAlgorithm != DSAWithSHA1 {
-		t.Errorf("Parsed signature algorithm was not DSAWithSHA1")
-	}
-}
-
-func TestVerifyCertificateWithDSASignature(t *testing.T) {
-	pemBlock, _ := pem.Decode([]byte(dsaCertPem))
-	cert, err := ParseCertificate(pemBlock.Bytes)
-	if err != nil {
-		t.Fatalf("Failed to parse certificate: %s", err)
-	}
-	// test cert is self-signed
-	if err = cert.CheckSignatureFrom(cert); err != nil {
-		t.Fatalf("DSA Certificate verification failed: %s", err)
-	}
-}
-
-const pemCertificate = `-----BEGIN CERTIFICATE-----
-MIIB5DCCAZCgAwIBAgIBATALBgkqhkiG9w0BAQUwLTEQMA4GA1UEChMHQWNtZSBDbzEZMBcGA1UE
-AxMQdGVzdC5leGFtcGxlLmNvbTAeFw03MDAxMDEwMDE2NDBaFw03MDAxMDIwMzQ2NDBaMC0xEDAO
-BgNVBAoTB0FjbWUgQ28xGTAXBgNVBAMTEHRlc3QuZXhhbXBsZS5jb20wWjALBgkqhkiG9w0BAQED
-SwAwSAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0fd7Ai2KW5ToIwzFo
-fvJcS/STa6HA5gQenRUCAwEAAaOBnjCBmzAOBgNVHQ8BAf8EBAMCAAQwDwYDVR0TAQH/BAUwAwEB
-/zANBgNVHQ4EBgQEAQIDBDAPBgNVHSMECDAGgAQBAgMEMBsGA1UdEQQUMBKCEHRlc3QuZXhhbXBs
-ZS5jb20wDwYDVR0gBAgwBjAEBgIqAzAqBgNVHR4EIzAhoB8wDoIMLmV4YW1wbGUuY29tMA2CC2V4
-YW1wbGUuY29tMAsGCSqGSIb3DQEBBQNBAHKZKoS1wEQOGhgklx4+/yFYQlnqwKXvar/ZecQvJwui
-0seMQnwBhwdBkHfVIU2Fu5VUMRyxlf0ZNaDXcpU581k=
------END CERTIFICATE-----`
-
-func TestCRLCreation(t *testing.T) {
-	block, _ := pem.Decode([]byte(pemPrivateKey))
-	priv, _ := ParsePKCS1PrivateKey(block.Bytes)
-	block, _ = pem.Decode([]byte(pemCertificate))
-	cert, _ := ParseCertificate(block.Bytes)
-
-	now := time.Unix(1000, 0)
-	expiry := time.Unix(10000, 0)
-
-	revokedCerts := []pkix.RevokedCertificate{
-		{
-			SerialNumber:   big.NewInt(1),
-			RevocationTime: now,
-		},
-		{
-			SerialNumber:   big.NewInt(42),
-			RevocationTime: now,
-		},
-	}
-
-	crlBytes, err := cert.CreateCRL(rand.Reader, priv, revokedCerts, now, expiry)
-	if err != nil {
-		t.Errorf("error creating CRL: %s", err)
-	}
-
-	_, err = ParseDERCRL(crlBytes)
-	if err != nil {
-		t.Errorf("error reparsing CRL: %s", err)
-	}
-}
-
-func fromBase64(in string) []byte {
-	out := make([]byte, base64.StdEncoding.DecodedLen(len(in)))
-	n, err := base64.StdEncoding.Decode(out, []byte(in))
-	if err != nil {
-		panic("failed to base64 decode")
-	}
-	return out[:n]
-}
-
-func TestParseDERCRL(t *testing.T) {
-	derBytes := fromBase64(derCRLBase64)
-	certList, err := ParseDERCRL(derBytes)
-	if err != nil {
-		t.Errorf("error parsing: %s", err)
-		return
-	}
-	numCerts := len(certList.TBSCertList.RevokedCertificates)
-	expected := 88
-	if numCerts != expected {
-		t.Errorf("bad number of revoked certificates. got: %d want: %d", numCerts, expected)
-	}
-
-	if certList.HasExpired(time.Unix(1302517272, 0)) {
-		t.Errorf("CRL has expired (but shouldn't have)")
-	}
-
-	// Can't check the signature here without a package cycle.
-}
-
-func TestCRLWithoutExpiry(t *testing.T) {
-	derBytes := fromBase64("MIHYMIGZMAkGByqGSM44BAMwEjEQMA4GA1UEAxMHQ2FybERTUxcNOTkwODI3MDcwMDAwWjBpMBMCAgDIFw05OTA4MjIwNzAwMDBaMBMCAgDJFw05OTA4MjIwNzAwMDBaMBMCAgDTFw05OTA4MjIwNzAwMDBaMBMCAgDSFw05OTA4MjIwNzAwMDBaMBMCAgDUFw05OTA4MjQwNzAwMDBaMAkGByqGSM44BAMDLwAwLAIUfmVSdjP+NHMX0feW+aDU2G1cfT0CFAJ6W7fVWxjBz4fvftok8yqDnDWh")
-	certList, err := ParseDERCRL(derBytes)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !certList.TBSCertList.NextUpdate.IsZero() {
-		t.Errorf("NextUpdate is not the zero value")
-	}
-}
-
-func TestParsePEMCRL(t *testing.T) {
-	pemBytes := fromBase64(pemCRLBase64)
-	certList, err := ParseCRL(pemBytes)
-	if err != nil {
-		t.Errorf("error parsing: %s", err)
-		return
-	}
-	numCerts := len(certList.TBSCertList.RevokedCertificates)
-	expected := 2
-	if numCerts != expected {
-		t.Errorf("bad number of revoked certificates. got: %d want: %d", numCerts, expected)
-	}
-
-	if certList.HasExpired(time.Unix(1302517272, 0)) {
-		t.Errorf("CRL has expired (but shouldn't have)")
-	}
-
-	// Can't check the signature here without a package cycle.
-}
-
-func TestImports(t *testing.T) {
-	testenv.MustHaveGoRun(t)
-
-	if err := exec.Command("go", "run", "x509_test_import.go").Run(); err != nil {
-		t.Errorf("failed to run x509_test_import.go: %s", err)
-	}
-}
-
-const derCRLBase64 = "MIINqzCCDJMCAQEwDQYJKoZIhvcNAQEFBQAwVjEZMBcGA1UEAxMQUEtJIEZJTk1FQ0NBTklDQTEVMBMGA1UEChMMRklOTUVDQ0FOSUNBMRUwEwYDVQQLEwxGSU5NRUNDQU5JQ0ExCzAJBgNVBAYTAklUFw0xMTA1MDQxNjU3NDJaFw0xMTA1MDQyMDU3NDJaMIIMBzAhAg4Ze1od49Lt1qIXBydAzhcNMDkwNzE2MDg0MzIyWjAAMCECDl0HSL9bcZ1Ci/UHJ0DPFw0wOTA3MTYwODQzMTNaMAAwIQIOESB9tVAmX3cY7QcnQNAXDTA5MDcxNjA4NDUyMlowADAhAg4S1tGAQ3mHt8uVBydA1RcNMDkwODA0MTUyNTIyWjAAMCECDlQ249Y7vtC25ScHJ0DWFw0wOTA4MDQxNTI1MzdaMAAwIQIOISMop3NkA4PfYwcnQNkXDTA5MDgwNDExMDAzNFowADAhAg56/BMoS29KEShTBydA2hcNMDkwODA0MTEwMTAzWjAAMCECDnBp/22HPH5CSWoHJ0DbFw0wOTA4MDQxMDU0NDlaMAAwIQIOV9IP+8CD8bK+XAcnQNwXDTA5MDgwNDEwNTcxN1owADAhAg4v5aRz0IxWqYiXBydA3RcNMDkwODA0MTA1NzQ1WjAAMCECDlOU34VzvZAybQwHJ0DeFw0wOTA4MDQxMDU4MjFaMAAwIAINO4CD9lluIxcwBydBAxcNMDkwNzIyMTUzMTU5WjAAMCECDgOllfO8Y1QA7/wHJ0ExFw0wOTA3MjQxMTQxNDNaMAAwIQIOJBX7jbiCdRdyjgcnQUQXDTA5MDkxNjA5MzAwOFowADAhAg5iYSAgmDrlH/RZBydBRRcNMDkwOTE2MDkzMDE3WjAAMCECDmu6k6srP3jcMaQHJ0FRFw0wOTA4MDQxMDU2NDBaMAAwIQIOX8aHlO0V+WVH4QcnQVMXDTA5MDgwNDEwNTcyOVowADAhAg5flK2rg3NnsRgDBydBzhcNMTEwMjAxMTUzMzQ2WjAAMCECDg35yJDL1jOPTgoHJ0HPFw0xMTAyMDExNTM0MjZaMAAwIQIOMyFJ6+e9iiGVBQcnQdAXDTA5MDkxODEzMjAwNVowADAhAg5Emb/Oykucmn8fBydB1xcNMDkwOTIxMTAxMDQ3WjAAMCECDjQKCncV+MnUavMHJ0HaFw0wOTA5MjIwODE1MjZaMAAwIQIOaxiFUt3dpd+tPwcnQfQXDTEwMDYxODA4NDI1MVowADAhAg5G7P8nO0tkrMt7BydB9RcNMTAwNjE4MDg0MjMwWjAAMCECDmTCC3SXhmDRst4HJ0H2Fw0wOTA5MjgxMjA3MjBaMAAwIQIOHoGhUr/pRwzTKgcnQfcXDTA5MDkyODEyMDcyNFowADAhAg50wrcrCiw8mQmPBydCBBcNMTAwMjE2MTMwMTA2WjAAMCECDifWmkvwyhEqwEcHJ0IFFw0xMDAyMTYxMzAxMjBaMAAwIQIOfgPmlW9fg+osNgcnQhwXDTEwMDQxMzA5NTIwMFowADAhAg4YHAGuA6LgCk7tBydCHRcNMTAwNDEzMDk1MTM4WjAAMCECDi1zH1bxkNJhokAHJ0IsFw0xMDA0MTMwOTU5MzBaMAAwIQIOMipNccsb/wo2fwcnQi0XDTEwMDQxMzA5NTkwMFowADAhAg46lCmvPl4GpP6ABydCShcNMTAwMTE5MDk1MjE3WjAAMCECDjaTcaj+wBpcGAsHJ0JLFw0xMDAxMTkwOTUyMzRaMAAwIQIOOMC13EOrBuxIOQcnQloXDTEwMDIwMTA5NDcwNVowADAhAg5KmZl+krz4RsmrBydCWxcNMTAwMjAxMDk0NjQwWjAAMCECDmLG3zQJ/fzdSsUHJ0JiFw0xMDAzMDEwOTUxNDBaMAAwIQIOP39ksgHdojf4owcnQmMXDTEwMDMwMTA5NTExN1owADAhAg4LDQzvWNRlD6v9BydCZBcNMTAwMzAxMDk0NjIyWjAAMCECDkmNfeclaFhIaaUHJ0JlFw0xMDAzMDEwOTQ2MDVaMAAwIQIOT/qWWfpH/m8NTwcnQpQXDTEwMDUxMTA5MTgyMVowADAhAg5m/ksYxvCEgJSvBydClRcNMTAwNTExMDkxODAxWjAAMCECDgvf3Ohq6JOPU9AHJ0KWFw0xMDA1MTEwOTIxMjNaMAAwIQIOKSPas10z4jNVIQcnQpcXDTEwMDUxMTA5MjEwMlowADAhAg4mCWmhoZ3lyKCDBydCohcNMTEwNDI4MTEwMjI1WjAAMCECDkeiyRsBMK0Gvr4HJ0KjFw0xMTA0MjgxMTAyMDdaMAAwIQIOa09b/nH2+55SSwcnQq4XDTExMDQwMTA4Mjk0NlowADAhAg5O7M7iq7gGplr1BydCrxcNMTEwNDAxMDgzMDE3WjAAMCECDjlT6mJxUjTvyogHJ0K1Fw0xMTAxMjcxNTQ4NTJaMAAwIQIODS/l4UUFLe21NAcnQrYXDTExMDEyNzE1NDgyOFowADAhAg5lPRA0XdOUF6lSBydDHhcNMTEwMTI4MTQzNTA1WjAAMCECDixKX4fFGGpENwgHJ0MfFw0xMTAxMjgxNDM1MzBaMAAwIQIORNBkqsPnpKTtbAcnQ08XDTEwMDkwOTA4NDg0MlowADAhAg5QL+EMM3lohedEBydDUBcNMTAwOTA5MDg0ODE5WjAAMCECDlhDnHK+HiTRAXcHJ0NUFw0xMDEwMTkxNjIxNDBaMAAwIQIOdBFqAzq/INz53gcnQ1UXDTEwMTAxOTE2MjA0NFowADAhAg4OjR7s8MgKles1BydDWhcNMTEwMTI3MTY1MzM2WjAAMCECDmfR/elHee+d0SoHJ0NbFw0xMTAxMjcxNjUzNTZaMAAwIQIOBTKv2ui+KFMI+wcnQ5YXDTEwMDkxNTEwMjE1N1owADAhAg49F3c/GSah+oRUBydDmxcNMTEwMTI3MTczMjMzWjAAMCECDggv4I61WwpKFMMHJ0OcFw0xMTAxMjcxNzMyNTVaMAAwIQIOXx/Y8sEvwS10LAcnQ6UXDTExMDEyODExMjkzN1owADAhAg5LSLbnVrSKaw/9BydDphcNMTEwMTI4MTEyOTIwWjAAMCECDmFFoCuhKUeACQQHJ0PfFw0xMTAxMTExMDE3MzdaMAAwIQIOQTDdFh2fSPF6AAcnQ+AXDTExMDExMTEwMTcxMFowADAhAg5B8AOXX61FpvbbBydD5RcNMTAxMDA2MTAxNDM2WjAAMCECDh41P2Gmi7PkwI4HJ0PmFw0xMDEwMDYxMDE2MjVaMAAwIQIOWUHGLQCd+Ale9gcnQ/0XDTExMDUwMjA3NTYxMFowADAhAg5Z2c9AYkikmgWOBydD/hcNMTEwNTAyMDc1NjM0WjAAMCECDmf/UD+/h8nf+74HJ0QVFw0xMTA0MTUwNzI4MzNaMAAwIQIOICvj4epy3MrqfwcnRBYXDTExMDQxNTA3Mjg1NlowADAhAg4bouRMfOYqgv4xBydEHxcNMTEwMzA4MTYyNDI1WjAAMCECDhebWHGoKiTp7pEHJ0QgFw0xMTAzMDgxNjI0NDhaMAAwIQIOX+qnxxAqJ8LtawcnRDcXDTExMDEzMTE1MTIyOFowADAhAg4j0fICqZ+wkOdqBydEOBcNMTEwMTMxMTUxMTQxWjAAMCECDhmXjsV4SUpWtAMHJ0RLFw0xMTAxMjgxMTI0MTJaMAAwIQIODno/w+zG43kkTwcnREwXDTExMDEyODExMjM1MlowADAhAg4b1gc88767Fr+LBydETxcNMTEwMTI4MTEwMjA4WjAAMCECDn+M3Pa1w2nyFeUHJ0RQFw0xMTAxMjgxMDU4NDVaMAAwIQIOaduoyIH61tqybAcnRJUXDTEwMTIxNTA5NDMyMlowADAhAg4nLqQPkyi3ESAKBydElhcNMTAxMjE1MDk0MzM2WjAAMCECDi504NIMH8578gQHJ0SbFw0xMTAyMTQxNDA1NDFaMAAwIQIOGuaM8PDaC5u1egcnRJwXDTExMDIxNDE0MDYwNFowADAhAg4ehYq/BXGnB5PWBydEnxcNMTEwMjA0MDgwOTUxWjAAMCECDkSD4eS4FxW5H20HJ0SgFw0xMTAyMDQwODA5MjVaMAAwIQIOOCcb6ilYObt1egcnRKEXDTExMDEyNjEwNDEyOVowADAhAg58tISWCCwFnKGnBydEohcNMTEwMjA0MDgxMzQyWjAAMCECDn5rjtabY/L/WL0HJ0TJFw0xMTAyMDQxMTAzNDFaMAAwDQYJKoZIhvcNAQEFBQADggEBAGnF2Gs0+LNiYCW1Ipm83OXQYP/bd5tFFRzyz3iepFqNfYs4D68/QihjFoRHQoXEB0OEe1tvaVnnPGnEOpi6krwekquMxo4H88B5SlyiFIqemCOIss0SxlCFs69LmfRYvPPvPEhoXtQ3ZThe0UvKG83GOklhvGl6OaiRf4Mt+m8zOT4Wox/j6aOBK6cw6qKCdmD+Yj1rrNqFGg1CnSWMoD6S6mwNgkzwdBUJZ22BwrzAAo4RHa2Uy3ef1FjwD0XtU5N3uDSxGGBEDvOe5z82rps3E22FpAA8eYl8kaXtmWqyvYU0epp4brGuTxCuBMCAsxt/OjIjeNNQbBGkwxgfYA0="
-
-const pemCRLBase64 = "LS0tLS1CRUdJTiBYNTA5IENSTC0tLS0tDQpNSUlCOWpDQ0FWOENBUUV3RFFZSktvWklodmNOQVFFRkJRQXdiREVhTUJnR0ExVUVDaE1SVWxOQklGTmxZM1Z5DQphWFI1SUVsdVl5NHhIakFjQmdOVkJBTVRGVkpUUVNCUWRXSnNhV01nVW05dmRDQkRRU0IyTVRFdU1Dd0dDU3FHDQpTSWIzRFFFSkFSWWZjbk5oYTJWdmJuSnZiM1J6YVdkdVFISnpZWE5sWTNWeWFYUjVMbU52YlJjTk1URXdNakl6DQpNVGt5T0RNd1doY05NVEV3T0RJeU1Ua3lPRE13V2pDQmpEQktBaEVBckRxb2g5RkhKSFhUN09QZ3V1bjQrQmNODQpNRGt4TVRBeU1UUXlOekE1V2pBbU1Bb0dBMVVkRlFRRENnRUpNQmdHQTFVZEdBUVJHQTh5TURBNU1URXdNakUwDQpNalExTlZvd1BnSVJBTEd6blowOTVQQjVhQU9MUGc1N2ZNTVhEVEF5TVRBeU16RTBOVEF4TkZvd0dqQVlCZ05WDQpIUmdFRVJnUE1qQXdNakV3TWpNeE5EVXdNVFJhb0RBd0xqQWZCZ05WSFNNRUdEQVdnQlQxVERGNlVRTS9MTmVMDQpsNWx2cUhHUXEzZzltekFMQmdOVkhSUUVCQUlDQUlRd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ1lFQUZVNUFzNk16DQpxNVBSc2lmYW9iUVBHaDFhSkx5QytNczVBZ2MwYld5QTNHQWR4dXI1U3BQWmVSV0NCamlQL01FSEJXSkNsQkhQDQpHUmNxNXlJZDNFakRrYUV5eFJhK2k2N0x6dmhJNmMyOUVlNks5cFNZd2ppLzdSVWhtbW5Qclh0VHhsTDBsckxyDQptUVFKNnhoRFJhNUczUUE0Q21VZHNITnZicnpnbUNZcHZWRT0NCi0tLS0tRU5EIFg1MDkgQ1JMLS0tLS0NCg0K"
-
-func TestCreateCertificateRequest(t *testing.T) {
-	random := rand.Reader
-
-	block, _ := pem.Decode([]byte(pemPrivateKey))
-	rsaPriv, err := ParsePKCS1PrivateKey(block.Bytes)
-	if err != nil {
-		t.Fatalf("Failed to parse private key: %s", err)
-	}
-
-	ecdsa256Priv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
-	if err != nil {
-		t.Fatalf("Failed to generate ECDSA key: %s", err)
-	}
-
-	ecdsa384Priv, err := ecdsa.GenerateKey(elliptic.P384(), rand.Reader)
-	if err != nil {
-		t.Fatalf("Failed to generate ECDSA key: %s", err)
-	}
-
-	ecdsa521Priv, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader)
-	if err != nil {
-		t.Fatalf("Failed to generate ECDSA key: %s", err)
-	}
-
-	tests := []struct {
-		name    string
-		priv    interface{}
-		sigAlgo SignatureAlgorithm
-	}{
-		{"RSA", rsaPriv, SHA1WithRSA},
-		{"ECDSA-256", ecdsa256Priv, ECDSAWithSHA1},
-		{"ECDSA-384", ecdsa384Priv, ECDSAWithSHA1},
-		{"ECDSA-521", ecdsa521Priv, ECDSAWithSHA1},
-	}
-
-	for _, test := range tests {
-		template := CertificateRequest{
-			Subject: pkix.Name{
-				CommonName:   "test.example.com",
-				Organization: []string{"Σ Acme Co"},
-			},
-			SignatureAlgorithm: test.sigAlgo,
-			DNSNames:           []string{"test.example.com"},
-			EmailAddresses:     []string{"gopher@golang.org"},
-			IPAddresses:        []net.IP{net.IPv4(127, 0, 0, 1).To4(), net.ParseIP("2001:4860:0:2001::68")},
-		}
-
-		derBytes, err := CreateCertificateRequest(random, &template, test.priv)
-		if err != nil {
-			t.Errorf("%s: failed to create certificate request: %s", test.name, err)
-			continue
-		}
-
-		out, err := ParseCertificateRequest(derBytes)
-		if err != nil {
-			t.Errorf("%s: failed to create certificate request: %s", test.name, err)
-			continue
-		}
-
-		err = out.CheckSignature()
-		if err != nil {
-			t.Errorf("%s: failed to check certificate request signature: %s", test.name, err)
-			continue
-		}
-
-		if out.Subject.CommonName != template.Subject.CommonName {
-			t.Errorf("%s: output subject common name and template subject common name don't match", test.name)
-		} else if len(out.Subject.Organization) != len(template.Subject.Organization) {
-			t.Errorf("%s: output subject organisation and template subject organisation don't match", test.name)
-		} else if len(out.DNSNames) != len(template.DNSNames) {
-			t.Errorf("%s: output DNS names and template DNS names don't match", test.name)
-		} else if len(out.EmailAddresses) != len(template.EmailAddresses) {
-			t.Errorf("%s: output email addresses and template email addresses don't match", test.name)
-		} else if len(out.IPAddresses) != len(template.IPAddresses) {
-			t.Errorf("%s: output IP addresses and template IP addresses names don't match", test.name)
-		}
-	}
-}
-
-func marshalAndParseCSR(t *testing.T, template *CertificateRequest) *CertificateRequest {
-	block, _ := pem.Decode([]byte(pemPrivateKey))
-	rsaPriv, err := ParsePKCS1PrivateKey(block.Bytes)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	derBytes, err := CreateCertificateRequest(rand.Reader, template, rsaPriv)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	csr, err := ParseCertificateRequest(derBytes)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	return csr
-}
-
-func TestCertificateRequestOverrides(t *testing.T) {
-	sanContents, err := marshalSANs([]string{"foo.example.com"}, nil, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	template := CertificateRequest{
-		Subject: pkix.Name{
-			CommonName:   "test.example.com",
-			Organization: []string{"Σ Acme Co"},
-		},
-		DNSNames: []string{"test.example.com"},
-
-		// An explicit extension should override the DNSNames from the
-		// template.
-		ExtraExtensions: []pkix.Extension{
-			{
-				Id:    oidExtensionSubjectAltName,
-				Value: sanContents,
-			},
-		},
-	}
-
-	csr := marshalAndParseCSR(t, &template)
-
-	if len(csr.DNSNames) != 1 || csr.DNSNames[0] != "foo.example.com" {
-		t.Errorf("Extension did not override template. Got %v\n", csr.DNSNames)
-	}
-
-	// If there is already an attribute with X.509 extensions then the
-	// extra extensions should be added to it rather than creating a CSR
-	// with two extension attributes.
-
-	template.Attributes = []pkix.AttributeTypeAndValueSET{
-		{
-			Type: oidExtensionRequest,
-			Value: [][]pkix.AttributeTypeAndValue{
-				{
-					{
-						Type:  oidExtensionAuthorityInfoAccess,
-						Value: []byte("foo"),
-					},
-				},
-			},
-		},
-	}
-
-	csr = marshalAndParseCSR(t, &template)
-	if l := len(csr.Attributes); l != 1 {
-		t.Errorf("incorrect number of attributes: %d\n", l)
-	}
-
-	if !csr.Attributes[0].Type.Equal(oidExtensionRequest) ||
-		len(csr.Attributes[0].Value) != 1 ||
-		len(csr.Attributes[0].Value[0]) != 2 {
-		t.Errorf("bad attributes: %#v\n", csr.Attributes)
-	}
-
-	sanContents2, err := marshalSANs([]string{"foo2.example.com"}, nil, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// Extensions in Attributes should override those in ExtraExtensions.
-	template.Attributes[0].Value[0] = append(template.Attributes[0].Value[0], pkix.AttributeTypeAndValue{
-		Type:  oidExtensionSubjectAltName,
-		Value: sanContents2,
-	})
-
-	csr = marshalAndParseCSR(t, &template)
-
-	if len(csr.DNSNames) != 1 || csr.DNSNames[0] != "foo2.example.com" {
-		t.Errorf("Attributes did not override ExtraExtensions. Got %v\n", csr.DNSNames)
-	}
-}
-
-func TestParseCertificateRequest(t *testing.T) {
-	for _, csrBase64 := range csrBase64Array {
-		csrBytes := fromBase64(csrBase64)
-		csr, err := ParseCertificateRequest(csrBytes)
-		if err != nil {
-			t.Fatalf("failed to parse CSR: %s", err)
-		}
-
-		if len(csr.EmailAddresses) != 1 || csr.EmailAddresses[0] != "gopher@golang.org" {
-			t.Errorf("incorrect email addresses found: %v", csr.EmailAddresses)
-		}
-
-		if len(csr.DNSNames) != 1 || csr.DNSNames[0] != "test.example.com" {
-			t.Errorf("incorrect DNS names found: %v", csr.DNSNames)
-		}
-
-		if len(csr.Subject.Country) != 1 || csr.Subject.Country[0] != "AU" {
-			t.Errorf("incorrect Subject name: %v", csr.Subject)
-		}
-
-		found := false
-		for _, e := range csr.Extensions {
-			if e.Id.Equal(oidExtensionBasicConstraints) {
-				found = true
-				break
-			}
-		}
-		if !found {
-			t.Errorf("basic constraints extension not found in CSR")
-		}
-	}
-}
-
-func TestMaxPathLen(t *testing.T) {
-	block, _ := pem.Decode([]byte(pemPrivateKey))
-	rsaPriv, err := ParsePKCS1PrivateKey(block.Bytes)
-	if err != nil {
-		t.Fatalf("Failed to parse private key: %s", err)
-	}
-
-	template := &Certificate{
-		SerialNumber: big.NewInt(1),
-		Subject: pkix.Name{
-			CommonName: "Σ Acme Co",
-		},
-		NotBefore: time.Unix(1000, 0),
-		NotAfter:  time.Unix(100000, 0),
-
-		BasicConstraintsValid: true,
-		IsCA: true,
-	}
-
-	serialiseAndParse := func(template *Certificate) *Certificate {
-		derBytes, err := CreateCertificate(rand.Reader, template, template, &rsaPriv.PublicKey, rsaPriv)
-		if err != nil {
-			t.Fatalf("failed to create certificate: %s", err)
-			return nil
-		}
-
-		cert, err := ParseCertificate(derBytes)
-		if err != nil {
-			t.Fatalf("failed to parse certificate: %s", err)
-			return nil
-		}
-
-		return cert
-	}
-
-	cert1 := serialiseAndParse(template)
-	if m := cert1.MaxPathLen; m != -1 {
-		t.Errorf("Omitting MaxPathLen didn't turn into -1, got %d", m)
-	}
-	if cert1.MaxPathLenZero {
-		t.Errorf("Omitting MaxPathLen resulted in MaxPathLenZero")
-	}
-
-	template.MaxPathLen = 1
-	cert2 := serialiseAndParse(template)
-	if m := cert2.MaxPathLen; m != 1 {
-		t.Errorf("Setting MaxPathLen didn't work. Got %d but set 1", m)
-	}
-	if cert2.MaxPathLenZero {
-		t.Errorf("Setting MaxPathLen resulted in MaxPathLenZero")
-	}
-
-	template.MaxPathLen = 0
-	template.MaxPathLenZero = true
-	cert3 := serialiseAndParse(template)
-	if m := cert3.MaxPathLen; m != 0 {
-		t.Errorf("Setting MaxPathLenZero didn't work, got %d", m)
-	}
-	if !cert3.MaxPathLenZero {
-		t.Errorf("Setting MaxPathLen to zero didn't result in MaxPathLenZero")
-	}
-}
-
-func TestASN1BitLength(t *testing.T) {
-	tests := []struct {
-		bytes  []byte
-		bitLen int
-	}{
-		{nil, 0},
-		{[]byte{0x00}, 0},
-		{[]byte{0x00, 0x00}, 0},
-		{[]byte{0xf0}, 4},
-		{[]byte{0x88}, 5},
-		{[]byte{0xff}, 8},
-		{[]byte{0xff, 0x80}, 9},
-		{[]byte{0xff, 0x81}, 16},
-	}
-
-	for i, test := range tests {
-		if got := asn1BitLength(test.bytes); got != test.bitLen {
-			t.Errorf("#%d: calculated bit-length of %d for %x, wanted %d", i, got, test.bytes, test.bitLen)
-		}
-	}
-}
-
-// These CSR was generated with OpenSSL:
-//  openssl req -out CSR.csr -new -sha256 -nodes -keyout privateKey.key -config openssl.cnf
-//
-// With openssl.cnf containing the following sections:
-//   [ v3_req ]
-//   basicConstraints = CA:FALSE
-//   keyUsage = nonRepudiation, digitalSignature, keyEncipherment
-//   subjectAltName = email:gopher@golang.org,DNS:test.example.com
-//   [ req_attributes ]
-//   challengePassword = ignored challenge
-//   unstructuredName  = ignored unstructured name
-var csrBase64Array = [...]string{
-	// Just [ v3_req ]
-	"MIIDHDCCAgQCAQAwfjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEUMBIGA1UEAwwLQ29tbW9uIE5hbWUxITAfBgkqhkiG9w0BCQEWEnRlc3RAZW1haWwuYWRkcmVzczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK1GY4YFx2ujlZEOJxQVYmsjUnLsd5nFVnNpLE4cV+77sgv9NPNlB8uhn3MXt5leD34rm/2BisCHOifPucYlSrszo2beuKhvwn4+2FxDmWtBEMu/QA16L5IvoOfYZm/gJTsPwKDqvaR0tTU67a9OtxwNTBMI56YKtmwd/o8d3hYv9cg+9ZGAZ/gKONcg/OWYx/XRh6bd0g8DMbCikpWgXKDsvvK1Nk+VtkDO1JxuBaj4Lz/p/MifTfnHoqHxWOWl4EaTs4Ychxsv34/rSj1KD1tJqorIv5Xv2aqv4sjxfbrYzX4kvS5SC1goIovLnhj5UjmQ3Qy8u65eow/LLWw+YFcCAwEAAaBZMFcGCSqGSIb3DQEJDjFKMEgwCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwLgYDVR0RBCcwJYERZ29waGVyQGdvbGFuZy5vcmeCEHRlc3QuZXhhbXBsZS5jb20wDQYJKoZIhvcNAQELBQADggEBAB6VPMRrchvNW61Tokyq3ZvO6/NoGIbuwUn54q6l5VZW0Ep5Nq8juhegSSnaJ0jrovmUgKDN9vEo2KxuAtwG6udS6Ami3zP+hRd4k9Q8djJPb78nrjzWiindLK5Fps9U5mMoi1ER8ViveyAOTfnZt/jsKUaRsscY2FzE9t9/o5moE6LTcHUS4Ap1eheR+J72WOnQYn3cifYaemsA9MJuLko+kQ6xseqttbh9zjqd9fiCSh/LNkzos9c+mg2yMADitaZinAh+HZi50ooEbjaT3erNq9O6RqwJlgD00g6MQdoz9bTAryCUhCQfkIaepmQ7BxS0pqWNW3MMwfDwx/Snz6g=",
-	// Both [ v3_req ] and [ req_attributes ]
-	"MIIDaTCCAlECAQAwfjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEUMBIGA1UEAwwLQ29tbW9uIE5hbWUxITAfBgkqhkiG9w0BCQEWEnRlc3RAZW1haWwuYWRkcmVzczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK1GY4YFx2ujlZEOJxQVYmsjUnLsd5nFVnNpLE4cV+77sgv9NPNlB8uhn3MXt5leD34rm/2BisCHOifPucYlSrszo2beuKhvwn4+2FxDmWtBEMu/QA16L5IvoOfYZm/gJTsPwKDqvaR0tTU67a9OtxwNTBMI56YKtmwd/o8d3hYv9cg+9ZGAZ/gKONcg/OWYx/XRh6bd0g8DMbCikpWgXKDsvvK1Nk+VtkDO1JxuBaj4Lz/p/MifTfnHoqHxWOWl4EaTs4Ychxsv34/rSj1KD1tJqorIv5Xv2aqv4sjxfbrYzX4kvS5SC1goIovLnhj5UjmQ3Qy8u65eow/LLWw+YFcCAwEAAaCBpTAgBgkqhkiG9w0BCQcxEwwRaWdub3JlZCBjaGFsbGVuZ2UwKAYJKoZIhvcNAQkCMRsMGWlnbm9yZWQgdW5zdHJ1Y3R1cmVkIG5hbWUwVwYJKoZIhvcNAQkOMUowSDAJBgNVHRMEAjAAMAsGA1UdDwQEAwIF4DAuBgNVHREEJzAlgRFnb3BoZXJAZ29sYW5nLm9yZ4IQdGVzdC5leGFtcGxlLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAgxe2N5O48EMsYE7o0rZBB0wi3Ov5/yYfnmmVI22Y3sP6VXbLDW0+UWIeSccOhzUCcZ/G4qcrfhhx6gTZTeA01nP7TdTJURvWAH5iFqj9sQ0qnLq6nEcVHij3sG6M5+BxAIVClQBk6lTCzgphc835Fjj6qSLuJ20XHdL5UfUbiJxx299CHgyBRL+hBUIPfz8p+ZgamyAuDLfnj54zzcRVyLlrmMLNPZNll1Q70RxoU6uWvLH8wB8vQe3Q/guSGubLyLRTUQVPh+dw1L4t8MKFWfX/48jwRM4gIRHFHPeAAE9D9YAoqdIvj/iFm/eQ++7DP8MDwOZWsXeB6jjwHuLmkQ==",
-}
diff --git a/third_party/gofrontend/libgo/go/crypto/x509/x509_test_import.go b/third_party/gofrontend/libgo/go/crypto/x509/x509_test_import.go
deleted file mode 100644
index 3fda7da..0000000
--- a/third_party/gofrontend/libgo/go/crypto/x509/x509_test_import.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// This file is run by the x509 tests to ensure that a program with minimal
-// imports can sign certificates without errors resulting from missing hash
-// functions.
-package main
-
-import (
-	"crypto/rand"
-	"crypto/x509"
-	"crypto/x509/pkix"
-	"encoding/pem"
-	"math/big"
-	"time"
-)
-
-func main() {
-	block, _ := pem.Decode([]byte(pemPrivateKey))
-	rsaPriv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
-	if err != nil {
-		panic("Failed to parse private key: " + err.Error())
-	}
-
-	template := x509.Certificate{
-		SerialNumber: big.NewInt(1),
-		Subject: pkix.Name{
-			CommonName:   "test",
-			Organization: []string{"Σ Acme Co"},
-		},
-		NotBefore: time.Unix(1000, 0),
-		NotAfter:  time.Unix(100000, 0),
-		KeyUsage:  x509.KeyUsageCertSign,
-	}
-
-	if _, err = x509.CreateCertificate(rand.Reader, &template, &template, &rsaPriv.PublicKey, rsaPriv); err != nil {
-		panic("failed to create certificate with basic imports: " + err.Error())
-	}
-}
-
-var pemPrivateKey = `-----BEGIN RSA PRIVATE KEY-----
-MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0
-fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu
-/ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWu
-RTUCIQDasvGASLqmjeffBNLTXV2A5g4t+kLVCpsEIZAycV5GswIhANEPLmax0ME/
-EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7A
-IU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlS
-tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
------END RSA PRIVATE KEY-----
-`
diff --git a/third_party/gofrontend/libgo/go/database/sql/convert.go b/third_party/gofrontend/libgo/go/database/sql/convert.go
deleted file mode 100644
index c0b38a2..0000000
--- a/third_party/gofrontend/libgo/go/database/sql/convert.go
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Type conversions for Scan.
-
-package sql
-
-import (
-	"database/sql/driver"
-	"errors"
-	"fmt"
-	"reflect"
-	"strconv"
-)
-
-var errNilPtr = errors.New("destination pointer is nil") // embedded in descriptive error
-
-// driverArgs converts arguments from callers of Stmt.Exec and
-// Stmt.Query into driver Values.
-//
-// The statement ds may be nil, if no statement is available.
-func driverArgs(ds *driverStmt, args []interface{}) ([]driver.Value, error) {
-	dargs := make([]driver.Value, len(args))
-	var si driver.Stmt
-	if ds != nil {
-		si = ds.si
-	}
-	cc, ok := si.(driver.ColumnConverter)
-
-	// Normal path, for a driver.Stmt that is not a ColumnConverter.
-	if !ok {
-		for n, arg := range args {
-			var err error
-			dargs[n], err = driver.DefaultParameterConverter.ConvertValue(arg)
-			if err != nil {
-				return nil, fmt.Errorf("sql: converting Exec argument #%d's type: %v", n, err)
-			}
-		}
-		return dargs, nil
-	}
-
-	// Let the Stmt convert its own arguments.
-	for n, arg := range args {
-		// First, see if the value itself knows how to convert
-		// itself to a driver type.  For example, a NullString
-		// struct changing into a string or nil.
-		if svi, ok := arg.(driver.Valuer); ok {
-			sv, err := svi.Value()
-			if err != nil {
-				return nil, fmt.Errorf("sql: argument index %d from Value: %v", n, err)
-			}
-			if !driver.IsValue(sv) {
-				return nil, fmt.Errorf("sql: argument index %d: non-subset type %T returned from Value", n, sv)
-			}
-			arg = sv
-		}
-
-		// Second, ask the column to sanity check itself. For
-		// example, drivers might use this to make sure that
-		// an int64 values being inserted into a 16-bit
-		// integer field is in range (before getting
-		// truncated), or that a nil can't go into a NOT NULL
-		// column before going across the network to get the
-		// same error.
-		var err error
-		ds.Lock()
-		dargs[n], err = cc.ColumnConverter(n).ConvertValue(arg)
-		ds.Unlock()
-		if err != nil {
-			return nil, fmt.Errorf("sql: converting argument #%d's type: %v", n, err)
-		}
-		if !driver.IsValue(dargs[n]) {
-			return nil, fmt.Errorf("sql: driver ColumnConverter error converted %T to unsupported type %T",
-				arg, dargs[n])
-		}
-	}
-
-	return dargs, nil
-}
-
-// convertAssign copies to dest the value in src, converting it if possible.
-// An error is returned if the copy would result in loss of information.
-// dest should be a pointer type.
-func convertAssign(dest, src interface{}) error {
-	// Common cases, without reflect.
-	switch s := src.(type) {
-	case string:
-		switch d := dest.(type) {
-		case *string:
-			if d == nil {
-				return errNilPtr
-			}
-			*d = s
-			return nil
-		case *[]byte:
-			if d == nil {
-				return errNilPtr
-			}
-			*d = []byte(s)
-			return nil
-		}
-	case []byte:
-		switch d := dest.(type) {
-		case *string:
-			if d == nil {
-				return errNilPtr
-			}
-			*d = string(s)
-			return nil
-		case *interface{}:
-			if d == nil {
-				return errNilPtr
-			}
-			*d = cloneBytes(s)
-			return nil
-		case *[]byte:
-			if d == nil {
-				return errNilPtr
-			}
-			*d = cloneBytes(s)
-			return nil
-		case *RawBytes:
-			if d == nil {
-				return errNilPtr
-			}
-			*d = s
-			return nil
-		}
-	case nil:
-		switch d := dest.(type) {
-		case *interface{}:
-			if d == nil {
-				return errNilPtr
-			}
-			*d = nil
-			return nil
-		case *[]byte:
-			if d == nil {
-				return errNilPtr
-			}
-			*d = nil
-			return nil
-		case *RawBytes:
-			if d == nil {
-				return errNilPtr
-			}
-			*d = nil
-			return nil
-		}
-	}
-
-	var sv reflect.Value
-
-	switch d := dest.(type) {
-	case *string:
-		sv = reflect.ValueOf(src)
-		switch sv.Kind() {
-		case reflect.Bool,
-			reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
-			reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
-			reflect.Float32, reflect.Float64:
-			*d = asString(src)
-			return nil
-		}
-	case *[]byte:
-		sv = reflect.ValueOf(src)
-		if b, ok := asBytes(nil, sv); ok {
-			*d = b
-			return nil
-		}
-	case *RawBytes:
-		sv = reflect.ValueOf(src)
-		if b, ok := asBytes([]byte(*d)[:0], sv); ok {
-			*d = RawBytes(b)
-			return nil
-		}
-	case *bool:
-		bv, err := driver.Bool.ConvertValue(src)
-		if err == nil {
-			*d = bv.(bool)
-		}
-		return err
-	case *interface{}:
-		*d = src
-		return nil
-	}
-
-	if scanner, ok := dest.(Scanner); ok {
-		return scanner.Scan(src)
-	}
-
-	dpv := reflect.ValueOf(dest)
-	if dpv.Kind() != reflect.Ptr {
-		return errors.New("destination not a pointer")
-	}
-	if dpv.IsNil() {
-		return errNilPtr
-	}
-
-	if !sv.IsValid() {
-		sv = reflect.ValueOf(src)
-	}
-
-	dv := reflect.Indirect(dpv)
-	if dv.Kind() == sv.Kind() {
-		dv.Set(sv)
-		return nil
-	}
-
-	switch dv.Kind() {
-	case reflect.Ptr:
-		if src == nil {
-			dv.Set(reflect.Zero(dv.Type()))
-			return nil
-		} else {
-			dv.Set(reflect.New(dv.Type().Elem()))
-			return convertAssign(dv.Interface(), src)
-		}
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		s := asString(src)
-		i64, err := strconv.ParseInt(s, 10, dv.Type().Bits())
-		if err != nil {
-			return fmt.Errorf("converting string %q to a %s: %v", s, dv.Kind(), err)
-		}
-		dv.SetInt(i64)
-		return nil
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
-		s := asString(src)
-		u64, err := strconv.ParseUint(s, 10, dv.Type().Bits())
-		if err != nil {
-			return fmt.Errorf("converting string %q to a %s: %v", s, dv.Kind(), err)
-		}
-		dv.SetUint(u64)
-		return nil
-	case reflect.Float32, reflect.Float64:
-		s := asString(src)
-		f64, err := strconv.ParseFloat(s, dv.Type().Bits())
-		if err != nil {
-			return fmt.Errorf("converting string %q to a %s: %v", s, dv.Kind(), err)
-		}
-		dv.SetFloat(f64)
-		return nil
-	}
-
-	return fmt.Errorf("unsupported driver -> Scan pair: %T -> %T", src, dest)
-}
-
-func cloneBytes(b []byte) []byte {
-	if b == nil {
-		return nil
-	} else {
-		c := make([]byte, len(b))
-		copy(c, b)
-		return c
-	}
-}
-
-func asString(src interface{}) string {
-	switch v := src.(type) {
-	case string:
-		return v
-	case []byte:
-		return string(v)
-	}
-	rv := reflect.ValueOf(src)
-	switch rv.Kind() {
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return strconv.FormatInt(rv.Int(), 10)
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
-		return strconv.FormatUint(rv.Uint(), 10)
-	case reflect.Float64:
-		return strconv.FormatFloat(rv.Float(), 'g', -1, 64)
-	case reflect.Float32:
-		return strconv.FormatFloat(rv.Float(), 'g', -1, 32)
-	case reflect.Bool:
-		return strconv.FormatBool(rv.Bool())
-	}
-	return fmt.Sprintf("%v", src)
-}
-
-func asBytes(buf []byte, rv reflect.Value) (b []byte, ok bool) {
-	switch rv.Kind() {
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return strconv.AppendInt(buf, rv.Int(), 10), true
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
-		return strconv.AppendUint(buf, rv.Uint(), 10), true
-	case reflect.Float32:
-		return strconv.AppendFloat(buf, rv.Float(), 'g', -1, 32), true
-	case reflect.Float64:
-		return strconv.AppendFloat(buf, rv.Float(), 'g', -1, 64), true
-	case reflect.Bool:
-		return strconv.AppendBool(buf, rv.Bool()), true
-	case reflect.String:
-		s := rv.String()
-		return append(buf, s...), true
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/database/sql/convert_test.go b/third_party/gofrontend/libgo/go/database/sql/convert_test.go
deleted file mode 100644
index 98af9fb..0000000
--- a/third_party/gofrontend/libgo/go/database/sql/convert_test.go
+++ /dev/null
@@ -1,348 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sql
-
-import (
-	"database/sql/driver"
-	"fmt"
-	"reflect"
-	"runtime"
-	"testing"
-	"time"
-)
-
-var someTime = time.Unix(123, 0)
-var answer int64 = 42
-
-type conversionTest struct {
-	s, d interface{} // source and destination
-
-	// following are used if they're non-zero
-	wantint   int64
-	wantuint  uint64
-	wantstr   string
-	wantbytes []byte
-	wantraw   RawBytes
-	wantf32   float32
-	wantf64   float64
-	wanttime  time.Time
-	wantbool  bool // used if d is of type *bool
-	wanterr   string
-	wantiface interface{}
-	wantptr   *int64 // if non-nil, *d's pointed value must be equal to *wantptr
-	wantnil   bool   // if true, *d must be *int64(nil)
-}
-
-// Target variables for scanning into.
-var (
-	scanstr    string
-	scanbytes  []byte
-	scanraw    RawBytes
-	scanint    int
-	scanint8   int8
-	scanint16  int16
-	scanint32  int32
-	scanuint8  uint8
-	scanuint16 uint16
-	scanbool   bool
-	scanf32    float32
-	scanf64    float64
-	scantime   time.Time
-	scanptr    *int64
-	scaniface  interface{}
-)
-
-var conversionTests = []conversionTest{
-	// Exact conversions (destination pointer type matches source type)
-	{s: "foo", d: &scanstr, wantstr: "foo"},
-	{s: 123, d: &scanint, wantint: 123},
-	{s: someTime, d: &scantime, wanttime: someTime},
-
-	// To strings
-	{s: "string", d: &scanstr, wantstr: "string"},
-	{s: []byte("byteslice"), d: &scanstr, wantstr: "byteslice"},
-	{s: 123, d: &scanstr, wantstr: "123"},
-	{s: int8(123), d: &scanstr, wantstr: "123"},
-	{s: int64(123), d: &scanstr, wantstr: "123"},
-	{s: uint8(123), d: &scanstr, wantstr: "123"},
-	{s: uint16(123), d: &scanstr, wantstr: "123"},
-	{s: uint32(123), d: &scanstr, wantstr: "123"},
-	{s: uint64(123), d: &scanstr, wantstr: "123"},
-	{s: 1.5, d: &scanstr, wantstr: "1.5"},
-
-	// To []byte
-	{s: nil, d: &scanbytes, wantbytes: nil},
-	{s: "string", d: &scanbytes, wantbytes: []byte("string")},
-	{s: []byte("byteslice"), d: &scanbytes, wantbytes: []byte("byteslice")},
-	{s: 123, d: &scanbytes, wantbytes: []byte("123")},
-	{s: int8(123), d: &scanbytes, wantbytes: []byte("123")},
-	{s: int64(123), d: &scanbytes, wantbytes: []byte("123")},
-	{s: uint8(123), d: &scanbytes, wantbytes: []byte("123")},
-	{s: uint16(123), d: &scanbytes, wantbytes: []byte("123")},
-	{s: uint32(123), d: &scanbytes, wantbytes: []byte("123")},
-	{s: uint64(123), d: &scanbytes, wantbytes: []byte("123")},
-	{s: 1.5, d: &scanbytes, wantbytes: []byte("1.5")},
-
-	// To RawBytes
-	{s: nil, d: &scanraw, wantraw: nil},
-	{s: []byte("byteslice"), d: &scanraw, wantraw: RawBytes("byteslice")},
-	{s: 123, d: &scanraw, wantraw: RawBytes("123")},
-	{s: int8(123), d: &scanraw, wantraw: RawBytes("123")},
-	{s: int64(123), d: &scanraw, wantraw: RawBytes("123")},
-	{s: uint8(123), d: &scanraw, wantraw: RawBytes("123")},
-	{s: uint16(123), d: &scanraw, wantraw: RawBytes("123")},
-	{s: uint32(123), d: &scanraw, wantraw: RawBytes("123")},
-	{s: uint64(123), d: &scanraw, wantraw: RawBytes("123")},
-	{s: 1.5, d: &scanraw, wantraw: RawBytes("1.5")},
-
-	// Strings to integers
-	{s: "255", d: &scanuint8, wantuint: 255},
-	{s: "256", d: &scanuint8, wanterr: `converting string "256" to a uint8: strconv.ParseUint: parsing "256": value out of range`},
-	{s: "256", d: &scanuint16, wantuint: 256},
-	{s: "-1", d: &scanint, wantint: -1},
-	{s: "foo", d: &scanint, wanterr: `converting string "foo" to a int: strconv.ParseInt: parsing "foo": invalid syntax`},
-
-	// True bools
-	{s: true, d: &scanbool, wantbool: true},
-	{s: "True", d: &scanbool, wantbool: true},
-	{s: "TRUE", d: &scanbool, wantbool: true},
-	{s: "1", d: &scanbool, wantbool: true},
-	{s: 1, d: &scanbool, wantbool: true},
-	{s: int64(1), d: &scanbool, wantbool: true},
-	{s: uint16(1), d: &scanbool, wantbool: true},
-
-	// False bools
-	{s: false, d: &scanbool, wantbool: false},
-	{s: "false", d: &scanbool, wantbool: false},
-	{s: "FALSE", d: &scanbool, wantbool: false},
-	{s: "0", d: &scanbool, wantbool: false},
-	{s: 0, d: &scanbool, wantbool: false},
-	{s: int64(0), d: &scanbool, wantbool: false},
-	{s: uint16(0), d: &scanbool, wantbool: false},
-
-	// Not bools
-	{s: "yup", d: &scanbool, wanterr: `sql/driver: couldn't convert "yup" into type bool`},
-	{s: 2, d: &scanbool, wanterr: `sql/driver: couldn't convert 2 into type bool`},
-
-	// Floats
-	{s: float64(1.5), d: &scanf64, wantf64: float64(1.5)},
-	{s: int64(1), d: &scanf64, wantf64: float64(1)},
-	{s: float64(1.5), d: &scanf32, wantf32: float32(1.5)},
-	{s: "1.5", d: &scanf32, wantf32: float32(1.5)},
-	{s: "1.5", d: &scanf64, wantf64: float64(1.5)},
-
-	// Pointers
-	{s: interface{}(nil), d: &scanptr, wantnil: true},
-	{s: int64(42), d: &scanptr, wantptr: &answer},
-
-	// To interface{}
-	{s: float64(1.5), d: &scaniface, wantiface: float64(1.5)},
-	{s: int64(1), d: &scaniface, wantiface: int64(1)},
-	{s: "str", d: &scaniface, wantiface: "str"},
-	{s: []byte("byteslice"), d: &scaniface, wantiface: []byte("byteslice")},
-	{s: true, d: &scaniface, wantiface: true},
-	{s: nil, d: &scaniface},
-	{s: []byte(nil), d: &scaniface, wantiface: []byte(nil)},
-}
-
-func intPtrValue(intptr interface{}) interface{} {
-	return reflect.Indirect(reflect.Indirect(reflect.ValueOf(intptr))).Int()
-}
-
-func intValue(intptr interface{}) int64 {
-	return reflect.Indirect(reflect.ValueOf(intptr)).Int()
-}
-
-func uintValue(intptr interface{}) uint64 {
-	return reflect.Indirect(reflect.ValueOf(intptr)).Uint()
-}
-
-func float64Value(ptr interface{}) float64 {
-	return *(ptr.(*float64))
-}
-
-func float32Value(ptr interface{}) float32 {
-	return *(ptr.(*float32))
-}
-
-func timeValue(ptr interface{}) time.Time {
-	return *(ptr.(*time.Time))
-}
-
-func TestConversions(t *testing.T) {
-	for n, ct := range conversionTests {
-		err := convertAssign(ct.d, ct.s)
-		errstr := ""
-		if err != nil {
-			errstr = err.Error()
-		}
-		errf := func(format string, args ...interface{}) {
-			base := fmt.Sprintf("convertAssign #%d: for %v (%T) -> %T, ", n, ct.s, ct.s, ct.d)
-			t.Errorf(base+format, args...)
-		}
-		if errstr != ct.wanterr {
-			errf("got error %q, want error %q", errstr, ct.wanterr)
-		}
-		if ct.wantstr != "" && ct.wantstr != scanstr {
-			errf("want string %q, got %q", ct.wantstr, scanstr)
-		}
-		if ct.wantint != 0 && ct.wantint != intValue(ct.d) {
-			errf("want int %d, got %d", ct.wantint, intValue(ct.d))
-		}
-		if ct.wantuint != 0 && ct.wantuint != uintValue(ct.d) {
-			errf("want uint %d, got %d", ct.wantuint, uintValue(ct.d))
-		}
-		if ct.wantf32 != 0 && ct.wantf32 != float32Value(ct.d) {
-			errf("want float32 %v, got %v", ct.wantf32, float32Value(ct.d))
-		}
-		if ct.wantf64 != 0 && ct.wantf64 != float64Value(ct.d) {
-			errf("want float32 %v, got %v", ct.wantf64, float64Value(ct.d))
-		}
-		if bp, boolTest := ct.d.(*bool); boolTest && *bp != ct.wantbool && ct.wanterr == "" {
-			errf("want bool %v, got %v", ct.wantbool, *bp)
-		}
-		if !ct.wanttime.IsZero() && !ct.wanttime.Equal(timeValue(ct.d)) {
-			errf("want time %v, got %v", ct.wanttime, timeValue(ct.d))
-		}
-		if ct.wantnil && *ct.d.(**int64) != nil {
-			errf("want nil, got %v", intPtrValue(ct.d))
-		}
-		if ct.wantptr != nil {
-			if *ct.d.(**int64) == nil {
-				errf("want pointer to %v, got nil", *ct.wantptr)
-			} else if *ct.wantptr != intPtrValue(ct.d) {
-				errf("want pointer to %v, got %v", *ct.wantptr, intPtrValue(ct.d))
-			}
-		}
-		if ifptr, ok := ct.d.(*interface{}); ok {
-			if !reflect.DeepEqual(ct.wantiface, scaniface) {
-				errf("want interface %#v, got %#v", ct.wantiface, scaniface)
-				continue
-			}
-			if srcBytes, ok := ct.s.([]byte); ok {
-				dstBytes := (*ifptr).([]byte)
-				if len(srcBytes) > 0 && &dstBytes[0] == &srcBytes[0] {
-					errf("copy into interface{} didn't copy []byte data")
-				}
-			}
-		}
-	}
-}
-
-func TestNullString(t *testing.T) {
-	var ns NullString
-	convertAssign(&ns, []byte("foo"))
-	if !ns.Valid {
-		t.Errorf("expecting not null")
-	}
-	if ns.String != "foo" {
-		t.Errorf("expecting foo; got %q", ns.String)
-	}
-	convertAssign(&ns, nil)
-	if ns.Valid {
-		t.Errorf("expecting null on nil")
-	}
-	if ns.String != "" {
-		t.Errorf("expecting blank on nil; got %q", ns.String)
-	}
-}
-
-type valueConverterTest struct {
-	c       driver.ValueConverter
-	in, out interface{}
-	err     string
-}
-
-var valueConverterTests = []valueConverterTest{
-	{driver.DefaultParameterConverter, NullString{"hi", true}, "hi", ""},
-	{driver.DefaultParameterConverter, NullString{"", false}, nil, ""},
-}
-
-func TestValueConverters(t *testing.T) {
-	for i, tt := range valueConverterTests {
-		out, err := tt.c.ConvertValue(tt.in)
-		goterr := ""
-		if err != nil {
-			goterr = err.Error()
-		}
-		if goterr != tt.err {
-			t.Errorf("test %d: %T(%T(%v)) error = %q; want error = %q",
-				i, tt.c, tt.in, tt.in, goterr, tt.err)
-		}
-		if tt.err != "" {
-			continue
-		}
-		if !reflect.DeepEqual(out, tt.out) {
-			t.Errorf("test %d: %T(%T(%v)) = %v (%T); want %v (%T)",
-				i, tt.c, tt.in, tt.in, out, out, tt.out, tt.out)
-		}
-	}
-}
-
-// Tests that assigning to RawBytes doesn't allocate (and also works).
-func TestRawBytesAllocs(t *testing.T) {
-	var tests = []struct {
-		name string
-		in   interface{}
-		want string
-	}{
-		{"uint64", uint64(12345678), "12345678"},
-		{"uint32", uint32(1234), "1234"},
-		{"uint16", uint16(12), "12"},
-		{"uint8", uint8(1), "1"},
-		{"uint", uint(123), "123"},
-		{"int", int(123), "123"},
-		{"int8", int8(1), "1"},
-		{"int16", int16(12), "12"},
-		{"int32", int32(1234), "1234"},
-		{"int64", int64(12345678), "12345678"},
-		{"float32", float32(1.5), "1.5"},
-		{"float64", float64(64), "64"},
-		{"bool", false, "false"},
-	}
-
-	buf := make(RawBytes, 10)
-	test := func(name string, in interface{}, want string) {
-		if err := convertAssign(&buf, in); err != nil {
-			t.Fatalf("%s: convertAssign = %v", name, err)
-		}
-		match := len(buf) == len(want)
-		if match {
-			for i, b := range buf {
-				if want[i] != b {
-					match = false
-					break
-				}
-			}
-		}
-		if !match {
-			t.Fatalf("%s: got %q (len %d); want %q (len %d)", name, buf, len(buf), want, len(want))
-		}
-	}
-
-	n := testing.AllocsPerRun(100, func() {
-		for _, tt := range tests {
-			test(tt.name, tt.in, tt.want)
-		}
-	})
-
-	// The numbers below are only valid for 64-bit interface word sizes,
-	// and gc. With 32-bit words there are more convT2E allocs, and
-	// with gccgo, only pointers currently go in interface data.
-	// So only care on amd64 gc for now.
-	measureAllocs := runtime.GOARCH == "amd64" && runtime.Compiler == "gc"
-
-	if n > 0.5 && measureAllocs {
-		t.Fatalf("allocs = %v; want 0", n)
-	}
-
-	// This one involves a convT2E allocation, string -> interface{}
-	n = testing.AllocsPerRun(100, func() {
-		test("string", "foo", "foo")
-	})
-	if n > 1.5 && measureAllocs {
-		t.Fatalf("allocs = %v; want max 1", n)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/database/sql/driver/driver.go b/third_party/gofrontend/libgo/go/database/sql/driver/driver.go
deleted file mode 100644
index eca25f2..0000000
--- a/third_party/gofrontend/libgo/go/database/sql/driver/driver.go
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package driver defines interfaces to be implemented by database
-// drivers as used by package sql.
-//
-// Most code should use package sql.
-package driver
-
-import "errors"
-
-// Value is a value that drivers must be able to handle.
-// It is either nil or an instance of one of these types:
-//
-//   int64
-//   float64
-//   bool
-//   []byte
-//   string   [*] everywhere except from Rows.Next.
-//   time.Time
-type Value interface{}
-
-// Driver is the interface that must be implemented by a database
-// driver.
-type Driver interface {
-	// Open returns a new connection to the database.
-	// The name is a string in a driver-specific format.
-	//
-	// Open may return a cached connection (one previously
-	// closed), but doing so is unnecessary; the sql package
-	// maintains a pool of idle connections for efficient re-use.
-	//
-	// The returned connection is only used by one goroutine at a
-	// time.
-	Open(name string) (Conn, error)
-}
-
-// ErrSkip may be returned by some optional interfaces' methods to
-// indicate at runtime that the fast path is unavailable and the sql
-// package should continue as if the optional interface was not
-// implemented. ErrSkip is only supported where explicitly
-// documented.
-var ErrSkip = errors.New("driver: skip fast-path; continue as if unimplemented")
-
-// ErrBadConn should be returned by a driver to signal to the sql
-// package that a driver.Conn is in a bad state (such as the server
-// having earlier closed the connection) and the sql package should
-// retry on a new connection.
-//
-// To prevent duplicate operations, ErrBadConn should NOT be returned
-// if there's a possibility that the database server might have
-// performed the operation. Even if the server sends back an error,
-// you shouldn't return ErrBadConn.
-var ErrBadConn = errors.New("driver: bad connection")
-
-// Execer is an optional interface that may be implemented by a Conn.
-//
-// If a Conn does not implement Execer, the sql package's DB.Exec will
-// first prepare a query, execute the statement, and then close the
-// statement.
-//
-// Exec may return ErrSkip.
-type Execer interface {
-	Exec(query string, args []Value) (Result, error)
-}
-
-// Queryer is an optional interface that may be implemented by a Conn.
-//
-// If a Conn does not implement Queryer, the sql package's DB.Query will
-// first prepare a query, execute the statement, and then close the
-// statement.
-//
-// Query may return ErrSkip.
-type Queryer interface {
-	Query(query string, args []Value) (Rows, error)
-}
-
-// Conn is a connection to a database. It is not used concurrently
-// by multiple goroutines.
-//
-// Conn is assumed to be stateful.
-type Conn interface {
-	// Prepare returns a prepared statement, bound to this connection.
-	Prepare(query string) (Stmt, error)
-
-	// Close invalidates and potentially stops any current
-	// prepared statements and transactions, marking this
-	// connection as no longer in use.
-	//
-	// Because the sql package maintains a free pool of
-	// connections and only calls Close when there's a surplus of
-	// idle connections, it shouldn't be necessary for drivers to
-	// do their own connection caching.
-	Close() error
-
-	// Begin starts and returns a new transaction.
-	Begin() (Tx, error)
-}
-
-// Result is the result of a query execution.
-type Result interface {
-	// LastInsertId returns the database's auto-generated ID
-	// after, for example, an INSERT into a table with primary
-	// key.
-	LastInsertId() (int64, error)
-
-	// RowsAffected returns the number of rows affected by the
-	// query.
-	RowsAffected() (int64, error)
-}
-
-// Stmt is a prepared statement. It is bound to a Conn and not
-// used by multiple goroutines concurrently.
-type Stmt interface {
-	// Close closes the statement.
-	//
-	// As of Go 1.1, a Stmt will not be closed if it's in use
-	// by any queries.
-	Close() error
-
-	// NumInput returns the number of placeholder parameters.
-	//
-	// If NumInput returns >= 0, the sql package will sanity check
-	// argument counts from callers and return errors to the caller
-	// before the statement's Exec or Query methods are called.
-	//
-	// NumInput may also return -1, if the driver doesn't know
-	// its number of placeholders. In that case, the sql package
-	// will not sanity check Exec or Query argument counts.
-	NumInput() int
-
-	// Exec executes a query that doesn't return rows, such
-	// as an INSERT or UPDATE.
-	Exec(args []Value) (Result, error)
-
-	// Query executes a query that may return rows, such as a
-	// SELECT.
-	Query(args []Value) (Rows, error)
-}
-
-// ColumnConverter may be optionally implemented by Stmt if the
-// statement is aware of its own columns' types and can convert from
-// any type to a driver Value.
-type ColumnConverter interface {
-	// ColumnConverter returns a ValueConverter for the provided
-	// column index.  If the type of a specific column isn't known
-	// or shouldn't be handled specially, DefaultValueConverter
-	// can be returned.
-	ColumnConverter(idx int) ValueConverter
-}
-
-// Rows is an iterator over an executed query's results.
-type Rows interface {
-	// Columns returns the names of the columns. The number of
-	// columns of the result is inferred from the length of the
-	// slice.  If a particular column name isn't known, an empty
-	// string should be returned for that entry.
-	Columns() []string
-
-	// Close closes the rows iterator.
-	Close() error
-
-	// Next is called to populate the next row of data into
-	// the provided slice. The provided slice will be the same
-	// size as the Columns() are wide.
-	//
-	// The dest slice may be populated only with
-	// a driver Value type, but excluding string.
-	// All string values must be converted to []byte.
-	//
-	// Next should return io.EOF when there are no more rows.
-	Next(dest []Value) error
-}
-
-// Tx is a transaction.
-type Tx interface {
-	Commit() error
-	Rollback() error
-}
-
-// RowsAffected implements Result for an INSERT or UPDATE operation
-// which mutates a number of rows.
-type RowsAffected int64
-
-var _ Result = RowsAffected(0)
-
-func (RowsAffected) LastInsertId() (int64, error) {
-	return 0, errors.New("no LastInsertId available")
-}
-
-func (v RowsAffected) RowsAffected() (int64, error) {
-	return int64(v), nil
-}
-
-// ResultNoRows is a pre-defined Result for drivers to return when a DDL
-// command (such as a CREATE TABLE) succeeds. It returns an error for both
-// LastInsertId and RowsAffected.
-var ResultNoRows noRows
-
-type noRows struct{}
-
-var _ Result = noRows{}
-
-func (noRows) LastInsertId() (int64, error) {
-	return 0, errors.New("no LastInsertId available after DDL statement")
-}
-
-func (noRows) RowsAffected() (int64, error) {
-	return 0, errors.New("no RowsAffected available after DDL statement")
-}
diff --git a/third_party/gofrontend/libgo/go/database/sql/driver/types.go b/third_party/gofrontend/libgo/go/database/sql/driver/types.go
deleted file mode 100644
index 3305354..0000000
--- a/third_party/gofrontend/libgo/go/database/sql/driver/types.go
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package driver
-
-import (
-	"fmt"
-	"reflect"
-	"strconv"
-	"time"
-)
-
-// ValueConverter is the interface providing the ConvertValue method.
-//
-// Various implementations of ValueConverter are provided by the
-// driver package to provide consistent implementations of conversions
-// between drivers.  The ValueConverters have several uses:
-//
-//  * converting from the Value types as provided by the sql package
-//    into a database table's specific column type and making sure it
-//    fits, such as making sure a particular int64 fits in a
-//    table's uint16 column.
-//
-//  * converting a value as given from the database into one of the
-//    driver Value types.
-//
-//  * by the sql package, for converting from a driver's Value type
-//    to a user's type in a scan.
-type ValueConverter interface {
-	// ConvertValue converts a value to a driver Value.
-	ConvertValue(v interface{}) (Value, error)
-}
-
-// Valuer is the interface providing the Value method.
-//
-// Types implementing Valuer interface are able to convert
-// themselves to a driver Value.
-type Valuer interface {
-	// Value returns a driver Value.
-	Value() (Value, error)
-}
-
-// Bool is a ValueConverter that converts input values to bools.
-//
-// The conversion rules are:
-//  - booleans are returned unchanged
-//  - for integer types,
-//       1 is true
-//       0 is false,
-//       other integers are an error
-//  - for strings and []byte, same rules as strconv.ParseBool
-//  - all other types are an error
-var Bool boolType
-
-type boolType struct{}
-
-var _ ValueConverter = boolType{}
-
-func (boolType) String() string { return "Bool" }
-
-func (boolType) ConvertValue(src interface{}) (Value, error) {
-	switch s := src.(type) {
-	case bool:
-		return s, nil
-	case string:
-		b, err := strconv.ParseBool(s)
-		if err != nil {
-			return nil, fmt.Errorf("sql/driver: couldn't convert %q into type bool", s)
-		}
-		return b, nil
-	case []byte:
-		b, err := strconv.ParseBool(string(s))
-		if err != nil {
-			return nil, fmt.Errorf("sql/driver: couldn't convert %q into type bool", s)
-		}
-		return b, nil
-	}
-
-	sv := reflect.ValueOf(src)
-	switch sv.Kind() {
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		iv := sv.Int()
-		if iv == 1 || iv == 0 {
-			return iv == 1, nil
-		}
-		return nil, fmt.Errorf("sql/driver: couldn't convert %d into type bool", iv)
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
-		uv := sv.Uint()
-		if uv == 1 || uv == 0 {
-			return uv == 1, nil
-		}
-		return nil, fmt.Errorf("sql/driver: couldn't convert %d into type bool", uv)
-	}
-
-	return nil, fmt.Errorf("sql/driver: couldn't convert %v (%T) into type bool", src, src)
-}
-
-// Int32 is a ValueConverter that converts input values to int64,
-// respecting the limits of an int32 value.
-var Int32 int32Type
-
-type int32Type struct{}
-
-var _ ValueConverter = int32Type{}
-
-func (int32Type) ConvertValue(v interface{}) (Value, error) {
-	rv := reflect.ValueOf(v)
-	switch rv.Kind() {
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		i64 := rv.Int()
-		if i64 > (1<<31)-1 || i64 < -(1<<31) {
-			return nil, fmt.Errorf("sql/driver: value %d overflows int32", v)
-		}
-		return i64, nil
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
-		u64 := rv.Uint()
-		if u64 > (1<<31)-1 {
-			return nil, fmt.Errorf("sql/driver: value %d overflows int32", v)
-		}
-		return int64(u64), nil
-	case reflect.String:
-		i, err := strconv.Atoi(rv.String())
-		if err != nil {
-			return nil, fmt.Errorf("sql/driver: value %q can't be converted to int32", v)
-		}
-		return int64(i), nil
-	}
-	return nil, fmt.Errorf("sql/driver: unsupported value %v (type %T) converting to int32", v, v)
-}
-
-// String is a ValueConverter that converts its input to a string.
-// If the value is already a string or []byte, it's unchanged.
-// If the value is of another type, conversion to string is done
-// with fmt.Sprintf("%v", v).
-var String stringType
-
-type stringType struct{}
-
-func (stringType) ConvertValue(v interface{}) (Value, error) {
-	switch v.(type) {
-	case string, []byte:
-		return v, nil
-	}
-	return fmt.Sprintf("%v", v), nil
-}
-
-// Null is a type that implements ValueConverter by allowing nil
-// values but otherwise delegating to another ValueConverter.
-type Null struct {
-	Converter ValueConverter
-}
-
-func (n Null) ConvertValue(v interface{}) (Value, error) {
-	if v == nil {
-		return nil, nil
-	}
-	return n.Converter.ConvertValue(v)
-}
-
-// NotNull is a type that implements ValueConverter by disallowing nil
-// values but otherwise delegating to another ValueConverter.
-type NotNull struct {
-	Converter ValueConverter
-}
-
-func (n NotNull) ConvertValue(v interface{}) (Value, error) {
-	if v == nil {
-		return nil, fmt.Errorf("nil value not allowed")
-	}
-	return n.Converter.ConvertValue(v)
-}
-
-// IsValue reports whether v is a valid Value parameter type.
-// Unlike IsScanValue, IsValue permits the string type.
-func IsValue(v interface{}) bool {
-	if IsScanValue(v) {
-		return true
-	}
-	if _, ok := v.(string); ok {
-		return true
-	}
-	return false
-}
-
-// IsScanValue reports whether v is a valid Value scan type.
-// Unlike IsValue, IsScanValue does not permit the string type.
-func IsScanValue(v interface{}) bool {
-	if v == nil {
-		return true
-	}
-	switch v.(type) {
-	case int64, float64, []byte, bool, time.Time:
-		return true
-	}
-	return false
-}
-
-// DefaultParameterConverter is the default implementation of
-// ValueConverter that's used when a Stmt doesn't implement
-// ColumnConverter.
-//
-// DefaultParameterConverter returns the given value directly if
-// IsValue(value).  Otherwise integer type are converted to
-// int64, floats to float64, and strings to []byte.  Other types are
-// an error.
-var DefaultParameterConverter defaultConverter
-
-type defaultConverter struct{}
-
-var _ ValueConverter = defaultConverter{}
-
-func (defaultConverter) ConvertValue(v interface{}) (Value, error) {
-	if IsValue(v) {
-		return v, nil
-	}
-
-	if svi, ok := v.(Valuer); ok {
-		sv, err := svi.Value()
-		if err != nil {
-			return nil, err
-		}
-		if !IsValue(sv) {
-			return nil, fmt.Errorf("non-Value type %T returned from Value", sv)
-		}
-		return sv, nil
-	}
-
-	rv := reflect.ValueOf(v)
-	switch rv.Kind() {
-	case reflect.Ptr:
-		// indirect pointers
-		if rv.IsNil() {
-			return nil, nil
-		} else {
-			return defaultConverter{}.ConvertValue(rv.Elem().Interface())
-		}
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return rv.Int(), nil
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32:
-		return int64(rv.Uint()), nil
-	case reflect.Uint64:
-		u64 := rv.Uint()
-		if u64 >= 1<<63 {
-			return nil, fmt.Errorf("uint64 values with high bit set are not supported")
-		}
-		return int64(u64), nil
-	case reflect.Float32, reflect.Float64:
-		return rv.Float(), nil
-	}
-	return nil, fmt.Errorf("unsupported type %T, a %s", v, rv.Kind())
-}
diff --git a/third_party/gofrontend/libgo/go/database/sql/driver/types_test.go b/third_party/gofrontend/libgo/go/database/sql/driver/types_test.go
deleted file mode 100644
index 1ce0ff0..0000000
--- a/third_party/gofrontend/libgo/go/database/sql/driver/types_test.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package driver
-
-import (
-	"reflect"
-	"testing"
-	"time"
-)
-
-type valueConverterTest struct {
-	c   ValueConverter
-	in  interface{}
-	out interface{}
-	err string
-}
-
-var now = time.Now()
-var answer int64 = 42
-
-var valueConverterTests = []valueConverterTest{
-	{Bool, "true", true, ""},
-	{Bool, "True", true, ""},
-	{Bool, []byte("t"), true, ""},
-	{Bool, true, true, ""},
-	{Bool, "1", true, ""},
-	{Bool, 1, true, ""},
-	{Bool, int64(1), true, ""},
-	{Bool, uint16(1), true, ""},
-	{Bool, "false", false, ""},
-	{Bool, false, false, ""},
-	{Bool, "0", false, ""},
-	{Bool, 0, false, ""},
-	{Bool, int64(0), false, ""},
-	{Bool, uint16(0), false, ""},
-	{c: Bool, in: "foo", err: "sql/driver: couldn't convert \"foo\" into type bool"},
-	{c: Bool, in: 2, err: "sql/driver: couldn't convert 2 into type bool"},
-	{DefaultParameterConverter, now, now, ""},
-	{DefaultParameterConverter, (*int64)(nil), nil, ""},
-	{DefaultParameterConverter, &answer, answer, ""},
-	{DefaultParameterConverter, &now, now, ""},
-}
-
-func TestValueConverters(t *testing.T) {
-	for i, tt := range valueConverterTests {
-		out, err := tt.c.ConvertValue(tt.in)
-		goterr := ""
-		if err != nil {
-			goterr = err.Error()
-		}
-		if goterr != tt.err {
-			t.Errorf("test %d: %T(%T(%v)) error = %q; want error = %q",
-				i, tt.c, tt.in, tt.in, goterr, tt.err)
-		}
-		if tt.err != "" {
-			continue
-		}
-		if !reflect.DeepEqual(out, tt.out) {
-			t.Errorf("test %d: %T(%T(%v)) = %v (%T); want %v (%T)",
-				i, tt.c, tt.in, tt.in, out, out, tt.out, tt.out)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/database/sql/fakedb_test.go b/third_party/gofrontend/libgo/go/database/sql/fakedb_test.go
deleted file mode 100644
index 8cbbb29..0000000
--- a/third_party/gofrontend/libgo/go/database/sql/fakedb_test.go
+++ /dev/null
@@ -1,834 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sql
-
-import (
-	"database/sql/driver"
-	"errors"
-	"fmt"
-	"io"
-	"log"
-	"sort"
-	"strconv"
-	"strings"
-	"sync"
-	"testing"
-	"time"
-)
-
-var _ = log.Printf
-
-// fakeDriver is a fake database that implements Go's driver.Driver
-// interface, just for testing.
-//
-// It speaks a query language that's semantically similar to but
-// syntactically different and simpler than SQL.  The syntax is as
-// follows:
-//
-//   WIPE
-//   CREATE|<tablename>|<col>=<type>,<col>=<type>,...
-//     where types are: "string", [u]int{8,16,32,64}, "bool"
-//   INSERT|<tablename>|col=val,col2=val2,col3=?
-//   SELECT|<tablename>|projectcol1,projectcol2|filtercol=?,filtercol2=?
-//
-// When opening a fakeDriver's database, it starts empty with no
-// tables.  All tables and data are stored in memory only.
-type fakeDriver struct {
-	mu         sync.Mutex // guards 3 following fields
-	openCount  int        // conn opens
-	closeCount int        // conn closes
-	waitCh     chan struct{}
-	waitingCh  chan struct{}
-	dbs        map[string]*fakeDB
-}
-
-type fakeDB struct {
-	name string
-
-	mu      sync.Mutex
-	free    []*fakeConn
-	tables  map[string]*table
-	badConn bool
-}
-
-type table struct {
-	mu      sync.Mutex
-	colname []string
-	coltype []string
-	rows    []*row
-}
-
-func (t *table) columnIndex(name string) int {
-	for n, nname := range t.colname {
-		if name == nname {
-			return n
-		}
-	}
-	return -1
-}
-
-type row struct {
-	cols []interface{} // must be same size as its table colname + coltype
-}
-
-func (r *row) clone() *row {
-	nrow := &row{cols: make([]interface{}, len(r.cols))}
-	copy(nrow.cols, r.cols)
-	return nrow
-}
-
-type fakeConn struct {
-	db *fakeDB // where to return ourselves to
-
-	currTx *fakeTx
-
-	// Stats for tests:
-	mu          sync.Mutex
-	stmtsMade   int
-	stmtsClosed int
-	numPrepare  int
-
-	// bad connection tests; see isBad()
-	bad       bool
-	stickyBad bool
-}
-
-func (c *fakeConn) incrStat(v *int) {
-	c.mu.Lock()
-	*v++
-	c.mu.Unlock()
-}
-
-type fakeTx struct {
-	c *fakeConn
-}
-
-type fakeStmt struct {
-	c *fakeConn
-	q string // just for debugging
-
-	cmd   string
-	table string
-
-	closed bool
-
-	colName      []string      // used by CREATE, INSERT, SELECT (selected columns)
-	colType      []string      // used by CREATE
-	colValue     []interface{} // used by INSERT (mix of strings and "?" for bound params)
-	placeholders int           // used by INSERT/SELECT: number of ? params
-
-	whereCol []string // used by SELECT (all placeholders)
-
-	placeholderConverter []driver.ValueConverter // used by INSERT
-}
-
-var fdriver driver.Driver = &fakeDriver{}
-
-func init() {
-	Register("test", fdriver)
-}
-
-func contains(list []string, y string) bool {
-	for _, x := range list {
-		if x == y {
-			return true
-		}
-	}
-	return false
-}
-
-type Dummy struct {
-	driver.Driver
-}
-
-func TestDrivers(t *testing.T) {
-	unregisterAllDrivers()
-	Register("test", fdriver)
-	Register("invalid", Dummy{})
-	all := Drivers()
-	if len(all) < 2 || !sort.StringsAreSorted(all) || !contains(all, "test") || !contains(all, "invalid") {
-		t.Fatalf("Drivers = %v, want sorted list with at least [invalid, test]", all)
-	}
-}
-
-// Supports dsn forms:
-//    <dbname>
-//    <dbname>;<opts>  (only currently supported option is `badConn`,
-//                      which causes driver.ErrBadConn to be returned on
-//                      every other conn.Begin())
-func (d *fakeDriver) Open(dsn string) (driver.Conn, error) {
-	parts := strings.Split(dsn, ";")
-	if len(parts) < 1 {
-		return nil, errors.New("fakedb: no database name")
-	}
-	name := parts[0]
-
-	db := d.getDB(name)
-
-	d.mu.Lock()
-	d.openCount++
-	d.mu.Unlock()
-	conn := &fakeConn{db: db}
-
-	if len(parts) >= 2 && parts[1] == "badConn" {
-		conn.bad = true
-	}
-	if d.waitCh != nil {
-		d.waitingCh <- struct{}{}
-		<-d.waitCh
-		d.waitCh = nil
-		d.waitingCh = nil
-	}
-	return conn, nil
-}
-
-func (d *fakeDriver) getDB(name string) *fakeDB {
-	d.mu.Lock()
-	defer d.mu.Unlock()
-	if d.dbs == nil {
-		d.dbs = make(map[string]*fakeDB)
-	}
-	db, ok := d.dbs[name]
-	if !ok {
-		db = &fakeDB{name: name}
-		d.dbs[name] = db
-	}
-	return db
-}
-
-func (db *fakeDB) wipe() {
-	db.mu.Lock()
-	defer db.mu.Unlock()
-	db.tables = nil
-}
-
-func (db *fakeDB) createTable(name string, columnNames, columnTypes []string) error {
-	db.mu.Lock()
-	defer db.mu.Unlock()
-	if db.tables == nil {
-		db.tables = make(map[string]*table)
-	}
-	if _, exist := db.tables[name]; exist {
-		return fmt.Errorf("table %q already exists", name)
-	}
-	if len(columnNames) != len(columnTypes) {
-		return fmt.Errorf("create table of %q len(names) != len(types): %d vs %d",
-			name, len(columnNames), len(columnTypes))
-	}
-	db.tables[name] = &table{colname: columnNames, coltype: columnTypes}
-	return nil
-}
-
-// must be called with db.mu lock held
-func (db *fakeDB) table(table string) (*table, bool) {
-	if db.tables == nil {
-		return nil, false
-	}
-	t, ok := db.tables[table]
-	return t, ok
-}
-
-func (db *fakeDB) columnType(table, column string) (typ string, ok bool) {
-	db.mu.Lock()
-	defer db.mu.Unlock()
-	t, ok := db.table(table)
-	if !ok {
-		return
-	}
-	for n, cname := range t.colname {
-		if cname == column {
-			return t.coltype[n], true
-		}
-	}
-	return "", false
-}
-
-func (c *fakeConn) isBad() bool {
-	if c.stickyBad {
-		return true
-	} else if c.bad {
-		// alternate between bad conn and not bad conn
-		c.db.badConn = !c.db.badConn
-		return c.db.badConn
-	} else {
-		return false
-	}
-}
-
-func (c *fakeConn) Begin() (driver.Tx, error) {
-	if c.isBad() {
-		return nil, driver.ErrBadConn
-	}
-	if c.currTx != nil {
-		return nil, errors.New("already in a transaction")
-	}
-	c.currTx = &fakeTx{c: c}
-	return c.currTx, nil
-}
-
-var hookPostCloseConn struct {
-	sync.Mutex
-	fn func(*fakeConn, error)
-}
-
-func setHookpostCloseConn(fn func(*fakeConn, error)) {
-	hookPostCloseConn.Lock()
-	defer hookPostCloseConn.Unlock()
-	hookPostCloseConn.fn = fn
-}
-
-var testStrictClose *testing.T
-
-// setStrictFakeConnClose sets the t to Errorf on when fakeConn.Close
-// fails to close. If nil, the check is disabled.
-func setStrictFakeConnClose(t *testing.T) {
-	testStrictClose = t
-}
-
-func (c *fakeConn) Close() (err error) {
-	drv := fdriver.(*fakeDriver)
-	defer func() {
-		if err != nil && testStrictClose != nil {
-			testStrictClose.Errorf("failed to close a test fakeConn: %v", err)
-		}
-		hookPostCloseConn.Lock()
-		fn := hookPostCloseConn.fn
-		hookPostCloseConn.Unlock()
-		if fn != nil {
-			fn(c, err)
-		}
-		if err == nil {
-			drv.mu.Lock()
-			drv.closeCount++
-			drv.mu.Unlock()
-		}
-	}()
-	if c.currTx != nil {
-		return errors.New("can't close fakeConn; in a Transaction")
-	}
-	if c.db == nil {
-		return errors.New("can't close fakeConn; already closed")
-	}
-	if c.stmtsMade > c.stmtsClosed {
-		return errors.New("can't close; dangling statement(s)")
-	}
-	c.db = nil
-	return nil
-}
-
-func checkSubsetTypes(args []driver.Value) error {
-	for n, arg := range args {
-		switch arg.(type) {
-		case int64, float64, bool, nil, []byte, string, time.Time:
-		default:
-			return fmt.Errorf("fakedb_test: invalid argument #%d: %v, type %T", n+1, arg, arg)
-		}
-	}
-	return nil
-}
-
-func (c *fakeConn) Exec(query string, args []driver.Value) (driver.Result, error) {
-	// This is an optional interface, but it's implemented here
-	// just to check that all the args are of the proper types.
-	// ErrSkip is returned so the caller acts as if we didn't
-	// implement this at all.
-	err := checkSubsetTypes(args)
-	if err != nil {
-		return nil, err
-	}
-	return nil, driver.ErrSkip
-}
-
-func (c *fakeConn) Query(query string, args []driver.Value) (driver.Rows, error) {
-	// This is an optional interface, but it's implemented here
-	// just to check that all the args are of the proper types.
-	// ErrSkip is returned so the caller acts as if we didn't
-	// implement this at all.
-	err := checkSubsetTypes(args)
-	if err != nil {
-		return nil, err
-	}
-	return nil, driver.ErrSkip
-}
-
-func errf(msg string, args ...interface{}) error {
-	return errors.New("fakedb: " + fmt.Sprintf(msg, args...))
-}
-
-// parts are table|selectCol1,selectCol2|whereCol=?,whereCol2=?
-// (note that where columns must always contain ? marks,
-//  just a limitation for fakedb)
-func (c *fakeConn) prepareSelect(stmt *fakeStmt, parts []string) (driver.Stmt, error) {
-	if len(parts) != 3 {
-		stmt.Close()
-		return nil, errf("invalid SELECT syntax with %d parts; want 3", len(parts))
-	}
-	stmt.table = parts[0]
-	stmt.colName = strings.Split(parts[1], ",")
-	for n, colspec := range strings.Split(parts[2], ",") {
-		if colspec == "" {
-			continue
-		}
-		nameVal := strings.Split(colspec, "=")
-		if len(nameVal) != 2 {
-			stmt.Close()
-			return nil, errf("SELECT on table %q has invalid column spec of %q (index %d)", stmt.table, colspec, n)
-		}
-		column, value := nameVal[0], nameVal[1]
-		_, ok := c.db.columnType(stmt.table, column)
-		if !ok {
-			stmt.Close()
-			return nil, errf("SELECT on table %q references non-existent column %q", stmt.table, column)
-		}
-		if value != "?" {
-			stmt.Close()
-			return nil, errf("SELECT on table %q has pre-bound value for where column %q; need a question mark",
-				stmt.table, column)
-		}
-		stmt.whereCol = append(stmt.whereCol, column)
-		stmt.placeholders++
-	}
-	return stmt, nil
-}
-
-// parts are table|col=type,col2=type2
-func (c *fakeConn) prepareCreate(stmt *fakeStmt, parts []string) (driver.Stmt, error) {
-	if len(parts) != 2 {
-		stmt.Close()
-		return nil, errf("invalid CREATE syntax with %d parts; want 2", len(parts))
-	}
-	stmt.table = parts[0]
-	for n, colspec := range strings.Split(parts[1], ",") {
-		nameType := strings.Split(colspec, "=")
-		if len(nameType) != 2 {
-			stmt.Close()
-			return nil, errf("CREATE table %q has invalid column spec of %q (index %d)", stmt.table, colspec, n)
-		}
-		stmt.colName = append(stmt.colName, nameType[0])
-		stmt.colType = append(stmt.colType, nameType[1])
-	}
-	return stmt, nil
-}
-
-// parts are table|col=?,col2=val
-func (c *fakeConn) prepareInsert(stmt *fakeStmt, parts []string) (driver.Stmt, error) {
-	if len(parts) != 2 {
-		stmt.Close()
-		return nil, errf("invalid INSERT syntax with %d parts; want 2", len(parts))
-	}
-	stmt.table = parts[0]
-	for n, colspec := range strings.Split(parts[1], ",") {
-		nameVal := strings.Split(colspec, "=")
-		if len(nameVal) != 2 {
-			stmt.Close()
-			return nil, errf("INSERT table %q has invalid column spec of %q (index %d)", stmt.table, colspec, n)
-		}
-		column, value := nameVal[0], nameVal[1]
-		ctype, ok := c.db.columnType(stmt.table, column)
-		if !ok {
-			stmt.Close()
-			return nil, errf("INSERT table %q references non-existent column %q", stmt.table, column)
-		}
-		stmt.colName = append(stmt.colName, column)
-
-		if value != "?" {
-			var subsetVal interface{}
-			// Convert to driver subset type
-			switch ctype {
-			case "string":
-				subsetVal = []byte(value)
-			case "blob":
-				subsetVal = []byte(value)
-			case "int32":
-				i, err := strconv.Atoi(value)
-				if err != nil {
-					stmt.Close()
-					return nil, errf("invalid conversion to int32 from %q", value)
-				}
-				subsetVal = int64(i) // int64 is a subset type, but not int32
-			default:
-				stmt.Close()
-				return nil, errf("unsupported conversion for pre-bound parameter %q to type %q", value, ctype)
-			}
-			stmt.colValue = append(stmt.colValue, subsetVal)
-		} else {
-			stmt.placeholders++
-			stmt.placeholderConverter = append(stmt.placeholderConverter, converterForType(ctype))
-			stmt.colValue = append(stmt.colValue, "?")
-		}
-	}
-	return stmt, nil
-}
-
-// hook to simulate broken connections
-var hookPrepareBadConn func() bool
-
-func (c *fakeConn) Prepare(query string) (driver.Stmt, error) {
-	c.numPrepare++
-	if c.db == nil {
-		panic("nil c.db; conn = " + fmt.Sprintf("%#v", c))
-	}
-
-	if c.stickyBad || (hookPrepareBadConn != nil && hookPrepareBadConn()) {
-		return nil, driver.ErrBadConn
-	}
-
-	parts := strings.Split(query, "|")
-	if len(parts) < 1 {
-		return nil, errf("empty query")
-	}
-	cmd := parts[0]
-	parts = parts[1:]
-	stmt := &fakeStmt{q: query, c: c, cmd: cmd}
-	c.incrStat(&c.stmtsMade)
-	switch cmd {
-	case "WIPE":
-		// Nothing
-	case "SELECT":
-		return c.prepareSelect(stmt, parts)
-	case "CREATE":
-		return c.prepareCreate(stmt, parts)
-	case "INSERT":
-		return c.prepareInsert(stmt, parts)
-	case "NOSERT":
-		// Do all the prep-work like for an INSERT but don't actually insert the row.
-		// Used for some of the concurrent tests.
-		return c.prepareInsert(stmt, parts)
-	default:
-		stmt.Close()
-		return nil, errf("unsupported command type %q", cmd)
-	}
-	return stmt, nil
-}
-
-func (s *fakeStmt) ColumnConverter(idx int) driver.ValueConverter {
-	if len(s.placeholderConverter) == 0 {
-		return driver.DefaultParameterConverter
-	}
-	return s.placeholderConverter[idx]
-}
-
-func (s *fakeStmt) Close() error {
-	if s.c == nil {
-		panic("nil conn in fakeStmt.Close")
-	}
-	if s.c.db == nil {
-		panic("in fakeStmt.Close, conn's db is nil (already closed)")
-	}
-	if !s.closed {
-		s.c.incrStat(&s.c.stmtsClosed)
-		s.closed = true
-	}
-	return nil
-}
-
-var errClosed = errors.New("fakedb: statement has been closed")
-
-// hook to simulate broken connections
-var hookExecBadConn func() bool
-
-func (s *fakeStmt) Exec(args []driver.Value) (driver.Result, error) {
-	if s.closed {
-		return nil, errClosed
-	}
-
-	if s.c.stickyBad || (hookExecBadConn != nil && hookExecBadConn()) {
-		return nil, driver.ErrBadConn
-	}
-
-	err := checkSubsetTypes(args)
-	if err != nil {
-		return nil, err
-	}
-
-	db := s.c.db
-	switch s.cmd {
-	case "WIPE":
-		db.wipe()
-		return driver.ResultNoRows, nil
-	case "CREATE":
-		if err := db.createTable(s.table, s.colName, s.colType); err != nil {
-			return nil, err
-		}
-		return driver.ResultNoRows, nil
-	case "INSERT":
-		return s.execInsert(args, true)
-	case "NOSERT":
-		// Do all the prep-work like for an INSERT but don't actually insert the row.
-		// Used for some of the concurrent tests.
-		return s.execInsert(args, false)
-	}
-	fmt.Printf("EXEC statement, cmd=%q: %#v\n", s.cmd, s)
-	return nil, fmt.Errorf("unimplemented statement Exec command type of %q", s.cmd)
-}
-
-// When doInsert is true, add the row to the table.
-// When doInsert is false do prep-work and error checking, but don't
-// actually add the row to the table.
-func (s *fakeStmt) execInsert(args []driver.Value, doInsert bool) (driver.Result, error) {
-	db := s.c.db
-	if len(args) != s.placeholders {
-		panic("error in pkg db; should only get here if size is correct")
-	}
-	db.mu.Lock()
-	t, ok := db.table(s.table)
-	db.mu.Unlock()
-	if !ok {
-		return nil, fmt.Errorf("fakedb: table %q doesn't exist", s.table)
-	}
-
-	t.mu.Lock()
-	defer t.mu.Unlock()
-
-	var cols []interface{}
-	if doInsert {
-		cols = make([]interface{}, len(t.colname))
-	}
-	argPos := 0
-	for n, colname := range s.colName {
-		colidx := t.columnIndex(colname)
-		if colidx == -1 {
-			return nil, fmt.Errorf("fakedb: column %q doesn't exist or dropped since prepared statement was created", colname)
-		}
-		var val interface{}
-		if strvalue, ok := s.colValue[n].(string); ok && strvalue == "?" {
-			val = args[argPos]
-			argPos++
-		} else {
-			val = s.colValue[n]
-		}
-		if doInsert {
-			cols[colidx] = val
-		}
-	}
-
-	if doInsert {
-		t.rows = append(t.rows, &row{cols: cols})
-	}
-	return driver.RowsAffected(1), nil
-}
-
-// hook to simulate broken connections
-var hookQueryBadConn func() bool
-
-func (s *fakeStmt) Query(args []driver.Value) (driver.Rows, error) {
-	if s.closed {
-		return nil, errClosed
-	}
-
-	if s.c.stickyBad || (hookQueryBadConn != nil && hookQueryBadConn()) {
-		return nil, driver.ErrBadConn
-	}
-
-	err := checkSubsetTypes(args)
-	if err != nil {
-		return nil, err
-	}
-
-	db := s.c.db
-	if len(args) != s.placeholders {
-		panic("error in pkg db; should only get here if size is correct")
-	}
-
-	db.mu.Lock()
-	t, ok := db.table(s.table)
-	db.mu.Unlock()
-	if !ok {
-		return nil, fmt.Errorf("fakedb: table %q doesn't exist", s.table)
-	}
-
-	if s.table == "magicquery" {
-		if len(s.whereCol) == 2 && s.whereCol[0] == "op" && s.whereCol[1] == "millis" {
-			if args[0] == "sleep" {
-				time.Sleep(time.Duration(args[1].(int64)) * time.Millisecond)
-			}
-		}
-	}
-
-	t.mu.Lock()
-	defer t.mu.Unlock()
-
-	colIdx := make(map[string]int) // select column name -> column index in table
-	for _, name := range s.colName {
-		idx := t.columnIndex(name)
-		if idx == -1 {
-			return nil, fmt.Errorf("fakedb: unknown column name %q", name)
-		}
-		colIdx[name] = idx
-	}
-
-	mrows := []*row{}
-rows:
-	for _, trow := range t.rows {
-		// Process the where clause, skipping non-match rows. This is lazy
-		// and just uses fmt.Sprintf("%v") to test equality.  Good enough
-		// for test code.
-		for widx, wcol := range s.whereCol {
-			idx := t.columnIndex(wcol)
-			if idx == -1 {
-				return nil, fmt.Errorf("db: invalid where clause column %q", wcol)
-			}
-			tcol := trow.cols[idx]
-			if bs, ok := tcol.([]byte); ok {
-				// lazy hack to avoid sprintf %v on a []byte
-				tcol = string(bs)
-			}
-			if fmt.Sprintf("%v", tcol) != fmt.Sprintf("%v", args[widx]) {
-				continue rows
-			}
-		}
-		mrow := &row{cols: make([]interface{}, len(s.colName))}
-		for seli, name := range s.colName {
-			mrow.cols[seli] = trow.cols[colIdx[name]]
-		}
-		mrows = append(mrows, mrow)
-	}
-
-	cursor := &rowsCursor{
-		pos:    -1,
-		rows:   mrows,
-		cols:   s.colName,
-		errPos: -1,
-	}
-	return cursor, nil
-}
-
-func (s *fakeStmt) NumInput() int {
-	return s.placeholders
-}
-
-func (tx *fakeTx) Commit() error {
-	tx.c.currTx = nil
-	return nil
-}
-
-func (tx *fakeTx) Rollback() error {
-	tx.c.currTx = nil
-	return nil
-}
-
-type rowsCursor struct {
-	cols   []string
-	pos    int
-	rows   []*row
-	closed bool
-
-	// errPos and err are for making Next return early with error.
-	errPos int
-	err    error
-
-	// a clone of slices to give out to clients, indexed by the
-	// the original slice's first byte address.  we clone them
-	// just so we're able to corrupt them on close.
-	bytesClone map[*byte][]byte
-}
-
-func (rc *rowsCursor) Close() error {
-	if !rc.closed {
-		for _, bs := range rc.bytesClone {
-			bs[0] = 255 // first byte corrupted
-		}
-	}
-	rc.closed = true
-	return nil
-}
-
-func (rc *rowsCursor) Columns() []string {
-	return rc.cols
-}
-
-var rowsCursorNextHook func(dest []driver.Value) error
-
-func (rc *rowsCursor) Next(dest []driver.Value) error {
-	if rowsCursorNextHook != nil {
-		return rowsCursorNextHook(dest)
-	}
-
-	if rc.closed {
-		return errors.New("fakedb: cursor is closed")
-	}
-	rc.pos++
-	if rc.pos == rc.errPos {
-		return rc.err
-	}
-	if rc.pos >= len(rc.rows) {
-		return io.EOF // per interface spec
-	}
-	for i, v := range rc.rows[rc.pos].cols {
-		// TODO(bradfitz): convert to subset types? naah, I
-		// think the subset types should only be input to
-		// driver, but the sql package should be able to handle
-		// a wider range of types coming out of drivers. all
-		// for ease of drivers, and to prevent drivers from
-		// messing up conversions or doing them differently.
-		dest[i] = v
-
-		if bs, ok := v.([]byte); ok {
-			if rc.bytesClone == nil {
-				rc.bytesClone = make(map[*byte][]byte)
-			}
-			clone, ok := rc.bytesClone[&bs[0]]
-			if !ok {
-				clone = make([]byte, len(bs))
-				copy(clone, bs)
-				rc.bytesClone[&bs[0]] = clone
-			}
-			dest[i] = clone
-		}
-	}
-	return nil
-}
-
-// fakeDriverString is like driver.String, but indirects pointers like
-// DefaultValueConverter.
-//
-// This could be surprising behavior to retroactively apply to
-// driver.String now that Go1 is out, but this is convenient for
-// our TestPointerParamsAndScans.
-//
-type fakeDriverString struct{}
-
-func (fakeDriverString) ConvertValue(v interface{}) (driver.Value, error) {
-	switch c := v.(type) {
-	case string, []byte:
-		return v, nil
-	case *string:
-		if c == nil {
-			return nil, nil
-		}
-		return *c, nil
-	}
-	return fmt.Sprintf("%v", v), nil
-}
-
-func converterForType(typ string) driver.ValueConverter {
-	switch typ {
-	case "bool":
-		return driver.Bool
-	case "nullbool":
-		return driver.Null{Converter: driver.Bool}
-	case "int32":
-		return driver.Int32
-	case "string":
-		return driver.NotNull{Converter: fakeDriverString{}}
-	case "nullstring":
-		return driver.Null{Converter: fakeDriverString{}}
-	case "int64":
-		// TODO(coopernurse): add type-specific converter
-		return driver.NotNull{Converter: driver.DefaultParameterConverter}
-	case "nullint64":
-		// TODO(coopernurse): add type-specific converter
-		return driver.Null{Converter: driver.DefaultParameterConverter}
-	case "float64":
-		// TODO(coopernurse): add type-specific converter
-		return driver.NotNull{Converter: driver.DefaultParameterConverter}
-	case "nullfloat64":
-		// TODO(coopernurse): add type-specific converter
-		return driver.Null{Converter: driver.DefaultParameterConverter}
-	case "datetime":
-		return driver.DefaultParameterConverter
-	}
-	panic("invalid fakedb column type of " + typ)
-}
diff --git a/third_party/gofrontend/libgo/go/database/sql/sql.go b/third_party/gofrontend/libgo/go/database/sql/sql.go
deleted file mode 100644
index aaa4ea2..0000000
--- a/third_party/gofrontend/libgo/go/database/sql/sql.go
+++ /dev/null
@@ -1,1817 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package sql provides a generic interface around SQL (or SQL-like)
-// databases.
-//
-// The sql package must be used in conjunction with a database driver.
-// See https://golang.org/s/sqldrivers for a list of drivers.
-//
-// For more usage examples, see the wiki page at
-// https://golang.org/s/sqlwiki.
-package sql
-
-import (
-	"database/sql/driver"
-	"errors"
-	"fmt"
-	"io"
-	"runtime"
-	"sort"
-	"sync"
-	"sync/atomic"
-)
-
-var (
-	driversMu sync.Mutex
-	drivers   = make(map[string]driver.Driver)
-)
-
-// Register makes a database driver available by the provided name.
-// If Register is called twice with the same name or if driver is nil,
-// it panics.
-func Register(name string, driver driver.Driver) {
-	driversMu.Lock()
-	defer driversMu.Unlock()
-	if driver == nil {
-		panic("sql: Register driver is nil")
-	}
-	if _, dup := drivers[name]; dup {
-		panic("sql: Register called twice for driver " + name)
-	}
-	drivers[name] = driver
-}
-
-func unregisterAllDrivers() {
-	driversMu.Lock()
-	defer driversMu.Unlock()
-	// For tests.
-	drivers = make(map[string]driver.Driver)
-}
-
-// Drivers returns a sorted list of the names of the registered drivers.
-func Drivers() []string {
-	driversMu.Lock()
-	defer driversMu.Unlock()
-	var list []string
-	for name := range drivers {
-		list = append(list, name)
-	}
-	sort.Strings(list)
-	return list
-}
-
-// RawBytes is a byte slice that holds a reference to memory owned by
-// the database itself. After a Scan into a RawBytes, the slice is only
-// valid until the next call to Next, Scan, or Close.
-type RawBytes []byte
-
-// NullString represents a string that may be null.
-// NullString implements the Scanner interface so
-// it can be used as a scan destination:
-//
-//  var s NullString
-//  err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s)
-//  ...
-//  if s.Valid {
-//     // use s.String
-//  } else {
-//     // NULL value
-//  }
-//
-type NullString struct {
-	String string
-	Valid  bool // Valid is true if String is not NULL
-}
-
-// Scan implements the Scanner interface.
-func (ns *NullString) Scan(value interface{}) error {
-	if value == nil {
-		ns.String, ns.Valid = "", false
-		return nil
-	}
-	ns.Valid = true
-	return convertAssign(&ns.String, value)
-}
-
-// Value implements the driver Valuer interface.
-func (ns NullString) Value() (driver.Value, error) {
-	if !ns.Valid {
-		return nil, nil
-	}
-	return ns.String, nil
-}
-
-// NullInt64 represents an int64 that may be null.
-// NullInt64 implements the Scanner interface so
-// it can be used as a scan destination, similar to NullString.
-type NullInt64 struct {
-	Int64 int64
-	Valid bool // Valid is true if Int64 is not NULL
-}
-
-// Scan implements the Scanner interface.
-func (n *NullInt64) Scan(value interface{}) error {
-	if value == nil {
-		n.Int64, n.Valid = 0, false
-		return nil
-	}
-	n.Valid = true
-	return convertAssign(&n.Int64, value)
-}
-
-// Value implements the driver Valuer interface.
-func (n NullInt64) Value() (driver.Value, error) {
-	if !n.Valid {
-		return nil, nil
-	}
-	return n.Int64, nil
-}
-
-// NullFloat64 represents a float64 that may be null.
-// NullFloat64 implements the Scanner interface so
-// it can be used as a scan destination, similar to NullString.
-type NullFloat64 struct {
-	Float64 float64
-	Valid   bool // Valid is true if Float64 is not NULL
-}
-
-// Scan implements the Scanner interface.
-func (n *NullFloat64) Scan(value interface{}) error {
-	if value == nil {
-		n.Float64, n.Valid = 0, false
-		return nil
-	}
-	n.Valid = true
-	return convertAssign(&n.Float64, value)
-}
-
-// Value implements the driver Valuer interface.
-func (n NullFloat64) Value() (driver.Value, error) {
-	if !n.Valid {
-		return nil, nil
-	}
-	return n.Float64, nil
-}
-
-// NullBool represents a bool that may be null.
-// NullBool implements the Scanner interface so
-// it can be used as a scan destination, similar to NullString.
-type NullBool struct {
-	Bool  bool
-	Valid bool // Valid is true if Bool is not NULL
-}
-
-// Scan implements the Scanner interface.
-func (n *NullBool) Scan(value interface{}) error {
-	if value == nil {
-		n.Bool, n.Valid = false, false
-		return nil
-	}
-	n.Valid = true
-	return convertAssign(&n.Bool, value)
-}
-
-// Value implements the driver Valuer interface.
-func (n NullBool) Value() (driver.Value, error) {
-	if !n.Valid {
-		return nil, nil
-	}
-	return n.Bool, nil
-}
-
-// Scanner is an interface used by Scan.
-type Scanner interface {
-	// Scan assigns a value from a database driver.
-	//
-	// The src value will be of one of the following restricted
-	// set of types:
-	//
-	//    int64
-	//    float64
-	//    bool
-	//    []byte
-	//    string
-	//    time.Time
-	//    nil - for NULL values
-	//
-	// An error should be returned if the value can not be stored
-	// without loss of information.
-	Scan(src interface{}) error
-}
-
-// ErrNoRows is returned by Scan when QueryRow doesn't return a
-// row. In such a case, QueryRow returns a placeholder *Row value that
-// defers this error until a Scan.
-var ErrNoRows = errors.New("sql: no rows in result set")
-
-// DB is a database handle representing a pool of zero or more
-// underlying connections. It's safe for concurrent use by multiple
-// goroutines.
-//
-// The sql package creates and frees connections automatically; it
-// also maintains a free pool of idle connections. If the database has
-// a concept of per-connection state, such state can only be reliably
-// observed within a transaction. Once DB.Begin is called, the
-// returned Tx is bound to a single connection. Once Commit or
-// Rollback is called on the transaction, that transaction's
-// connection is returned to DB's idle connection pool. The pool size
-// can be controlled with SetMaxIdleConns.
-type DB struct {
-	driver driver.Driver
-	dsn    string
-	// numClosed is an atomic counter which represents a total number of
-	// closed connections. Stmt.openStmt checks it before cleaning closed
-	// connections in Stmt.css.
-	numClosed uint64
-
-	mu           sync.Mutex // protects following fields
-	freeConn     []*driverConn
-	connRequests []chan connRequest
-	numOpen      int
-	pendingOpens int
-	// Used to signal the need for new connections
-	// a goroutine running connectionOpener() reads on this chan and
-	// maybeOpenNewConnections sends on the chan (one send per needed connection)
-	// It is closed during db.Close(). The close tells the connectionOpener
-	// goroutine to exit.
-	openerCh chan struct{}
-	closed   bool
-	dep      map[finalCloser]depSet
-	lastPut  map[*driverConn]string // stacktrace of last conn's put; debug only
-	maxIdle  int                    // zero means defaultMaxIdleConns; negative means 0
-	maxOpen  int                    // <= 0 means unlimited
-}
-
-// connReuseStrategy determines how (*DB).conn returns database connections.
-type connReuseStrategy uint8
-
-const (
-	// alwaysNewConn forces a new connection to the database.
-	alwaysNewConn connReuseStrategy = iota
-	// cachedOrNewConn returns a cached connection, if available, else waits
-	// for one to become available (if MaxOpenConns has been reached) or
-	// creates a new database connection.
-	cachedOrNewConn
-)
-
-// driverConn wraps a driver.Conn with a mutex, to
-// be held during all calls into the Conn. (including any calls onto
-// interfaces returned via that Conn, such as calls on Tx, Stmt,
-// Result, Rows)
-type driverConn struct {
-	db *DB
-
-	sync.Mutex  // guards following
-	ci          driver.Conn
-	closed      bool
-	finalClosed bool // ci.Close has been called
-	openStmt    map[driver.Stmt]bool
-
-	// guarded by db.mu
-	inUse      bool
-	onPut      []func() // code (with db.mu held) run when conn is next returned
-	dbmuClosed bool     // same as closed, but guarded by db.mu, for removeClosedStmtLocked
-}
-
-func (dc *driverConn) releaseConn(err error) {
-	dc.db.putConn(dc, err)
-}
-
-func (dc *driverConn) removeOpenStmt(si driver.Stmt) {
-	dc.Lock()
-	defer dc.Unlock()
-	delete(dc.openStmt, si)
-}
-
-func (dc *driverConn) prepareLocked(query string) (driver.Stmt, error) {
-	si, err := dc.ci.Prepare(query)
-	if err == nil {
-		// Track each driverConn's open statements, so we can close them
-		// before closing the conn.
-		//
-		// TODO(bradfitz): let drivers opt out of caring about
-		// stmt closes if the conn is about to close anyway? For now
-		// do the safe thing, in case stmts need to be closed.
-		//
-		// TODO(bradfitz): after Go 1.2, closing driver.Stmts
-		// should be moved to driverStmt, using unique
-		// *driverStmts everywhere (including from
-		// *Stmt.connStmt, instead of returning a
-		// driver.Stmt), using driverStmt as a pointer
-		// everywhere, and making it a finalCloser.
-		if dc.openStmt == nil {
-			dc.openStmt = make(map[driver.Stmt]bool)
-		}
-		dc.openStmt[si] = true
-	}
-	return si, err
-}
-
-// the dc.db's Mutex is held.
-func (dc *driverConn) closeDBLocked() func() error {
-	dc.Lock()
-	defer dc.Unlock()
-	if dc.closed {
-		return func() error { return errors.New("sql: duplicate driverConn close") }
-	}
-	dc.closed = true
-	return dc.db.removeDepLocked(dc, dc)
-}
-
-func (dc *driverConn) Close() error {
-	dc.Lock()
-	if dc.closed {
-		dc.Unlock()
-		return errors.New("sql: duplicate driverConn close")
-	}
-	dc.closed = true
-	dc.Unlock() // not defer; removeDep finalClose calls may need to lock
-
-	// And now updates that require holding dc.mu.Lock.
-	dc.db.mu.Lock()
-	dc.dbmuClosed = true
-	fn := dc.db.removeDepLocked(dc, dc)
-	dc.db.mu.Unlock()
-	return fn()
-}
-
-func (dc *driverConn) finalClose() error {
-	dc.Lock()
-
-	for si := range dc.openStmt {
-		si.Close()
-	}
-	dc.openStmt = nil
-
-	err := dc.ci.Close()
-	dc.ci = nil
-	dc.finalClosed = true
-	dc.Unlock()
-
-	dc.db.mu.Lock()
-	dc.db.numOpen--
-	dc.db.maybeOpenNewConnections()
-	dc.db.mu.Unlock()
-
-	atomic.AddUint64(&dc.db.numClosed, 1)
-	return err
-}
-
-// driverStmt associates a driver.Stmt with the
-// *driverConn from which it came, so the driverConn's lock can be
-// held during calls.
-type driverStmt struct {
-	sync.Locker // the *driverConn
-	si          driver.Stmt
-}
-
-func (ds *driverStmt) Close() error {
-	ds.Lock()
-	defer ds.Unlock()
-	return ds.si.Close()
-}
-
-// depSet is a finalCloser's outstanding dependencies
-type depSet map[interface{}]bool // set of true bools
-
-// The finalCloser interface is used by (*DB).addDep and related
-// dependency reference counting.
-type finalCloser interface {
-	// finalClose is called when the reference count of an object
-	// goes to zero. (*DB).mu is not held while calling it.
-	finalClose() error
-}
-
-// addDep notes that x now depends on dep, and x's finalClose won't be
-// called until all of x's dependencies are removed with removeDep.
-func (db *DB) addDep(x finalCloser, dep interface{}) {
-	//println(fmt.Sprintf("addDep(%T %p, %T %p)", x, x, dep, dep))
-	db.mu.Lock()
-	defer db.mu.Unlock()
-	db.addDepLocked(x, dep)
-}
-
-func (db *DB) addDepLocked(x finalCloser, dep interface{}) {
-	if db.dep == nil {
-		db.dep = make(map[finalCloser]depSet)
-	}
-	xdep := db.dep[x]
-	if xdep == nil {
-		xdep = make(depSet)
-		db.dep[x] = xdep
-	}
-	xdep[dep] = true
-}
-
-// removeDep notes that x no longer depends on dep.
-// If x still has dependencies, nil is returned.
-// If x no longer has any dependencies, its finalClose method will be
-// called and its error value will be returned.
-func (db *DB) removeDep(x finalCloser, dep interface{}) error {
-	db.mu.Lock()
-	fn := db.removeDepLocked(x, dep)
-	db.mu.Unlock()
-	return fn()
-}
-
-func (db *DB) removeDepLocked(x finalCloser, dep interface{}) func() error {
-	//println(fmt.Sprintf("removeDep(%T %p, %T %p)", x, x, dep, dep))
-
-	xdep, ok := db.dep[x]
-	if !ok {
-		panic(fmt.Sprintf("unpaired removeDep: no deps for %T", x))
-	}
-
-	l0 := len(xdep)
-	delete(xdep, dep)
-
-	switch len(xdep) {
-	case l0:
-		// Nothing removed. Shouldn't happen.
-		panic(fmt.Sprintf("unpaired removeDep: no %T dep on %T", dep, x))
-	case 0:
-		// No more dependencies.
-		delete(db.dep, x)
-		return x.finalClose
-	default:
-		// Dependencies remain.
-		return func() error { return nil }
-	}
-}
-
-// This is the size of the connectionOpener request chan (dn.openerCh).
-// This value should be larger than the maximum typical value
-// used for db.maxOpen. If maxOpen is significantly larger than
-// connectionRequestQueueSize then it is possible for ALL calls into the *DB
-// to block until the connectionOpener can satisfy the backlog of requests.
-var connectionRequestQueueSize = 1000000
-
-// Open opens a database specified by its database driver name and a
-// driver-specific data source name, usually consisting of at least a
-// database name and connection information.
-//
-// Most users will open a database via a driver-specific connection
-// helper function that returns a *DB. No database drivers are included
-// in the Go standard library. See https://golang.org/s/sqldrivers for
-// a list of third-party drivers.
-//
-// Open may just validate its arguments without creating a connection
-// to the database. To verify that the data source name is valid, call
-// Ping.
-//
-// The returned DB is safe for concurrent use by multiple goroutines
-// and maintains its own pool of idle connections. Thus, the Open
-// function should be called just once. It is rarely necessary to
-// close a DB.
-func Open(driverName, dataSourceName string) (*DB, error) {
-	driversMu.Lock()
-	driveri, ok := drivers[driverName]
-	driversMu.Unlock()
-	if !ok {
-		return nil, fmt.Errorf("sql: unknown driver %q (forgotten import?)", driverName)
-	}
-	db := &DB{
-		driver:   driveri,
-		dsn:      dataSourceName,
-		openerCh: make(chan struct{}, connectionRequestQueueSize),
-		lastPut:  make(map[*driverConn]string),
-	}
-	go db.connectionOpener()
-	return db, nil
-}
-
-// Ping verifies a connection to the database is still alive,
-// establishing a connection if necessary.
-func (db *DB) Ping() error {
-	// TODO(bradfitz): give drivers an optional hook to implement
-	// this in a more efficient or more reliable way, if they
-	// have one.
-	dc, err := db.conn(cachedOrNewConn)
-	if err != nil {
-		return err
-	}
-	db.putConn(dc, nil)
-	return nil
-}
-
-// Close closes the database, releasing any open resources.
-//
-// It is rare to Close a DB, as the DB handle is meant to be
-// long-lived and shared between many goroutines.
-func (db *DB) Close() error {
-	db.mu.Lock()
-	if db.closed { // Make DB.Close idempotent
-		db.mu.Unlock()
-		return nil
-	}
-	close(db.openerCh)
-	var err error
-	fns := make([]func() error, 0, len(db.freeConn))
-	for _, dc := range db.freeConn {
-		fns = append(fns, dc.closeDBLocked())
-	}
-	db.freeConn = nil
-	db.closed = true
-	for _, req := range db.connRequests {
-		close(req)
-	}
-	db.mu.Unlock()
-	for _, fn := range fns {
-		err1 := fn()
-		if err1 != nil {
-			err = err1
-		}
-	}
-	return err
-}
-
-const defaultMaxIdleConns = 2
-
-func (db *DB) maxIdleConnsLocked() int {
-	n := db.maxIdle
-	switch {
-	case n == 0:
-		// TODO(bradfitz): ask driver, if supported, for its default preference
-		return defaultMaxIdleConns
-	case n < 0:
-		return 0
-	default:
-		return n
-	}
-}
-
-// SetMaxIdleConns sets the maximum number of connections in the idle
-// connection pool.
-//
-// If MaxOpenConns is greater than 0 but less than the new MaxIdleConns
-// then the new MaxIdleConns will be reduced to match the MaxOpenConns limit
-//
-// If n <= 0, no idle connections are retained.
-func (db *DB) SetMaxIdleConns(n int) {
-	db.mu.Lock()
-	if n > 0 {
-		db.maxIdle = n
-	} else {
-		// No idle connections.
-		db.maxIdle = -1
-	}
-	// Make sure maxIdle doesn't exceed maxOpen
-	if db.maxOpen > 0 && db.maxIdleConnsLocked() > db.maxOpen {
-		db.maxIdle = db.maxOpen
-	}
-	var closing []*driverConn
-	idleCount := len(db.freeConn)
-	maxIdle := db.maxIdleConnsLocked()
-	if idleCount > maxIdle {
-		closing = db.freeConn[maxIdle:]
-		db.freeConn = db.freeConn[:maxIdle]
-	}
-	db.mu.Unlock()
-	for _, c := range closing {
-		c.Close()
-	}
-}
-
-// SetMaxOpenConns sets the maximum number of open connections to the database.
-//
-// If MaxIdleConns is greater than 0 and the new MaxOpenConns is less than
-// MaxIdleConns, then MaxIdleConns will be reduced to match the new
-// MaxOpenConns limit
-//
-// If n <= 0, then there is no limit on the number of open connections.
-// The default is 0 (unlimited).
-func (db *DB) SetMaxOpenConns(n int) {
-	db.mu.Lock()
-	db.maxOpen = n
-	if n < 0 {
-		db.maxOpen = 0
-	}
-	syncMaxIdle := db.maxOpen > 0 && db.maxIdleConnsLocked() > db.maxOpen
-	db.mu.Unlock()
-	if syncMaxIdle {
-		db.SetMaxIdleConns(n)
-	}
-}
-
-// DBStats contains database statistics.
-type DBStats struct {
-	// OpenConnections is the number of open connections to the database.
-	OpenConnections int
-}
-
-// Stats returns database statistics.
-func (db *DB) Stats() DBStats {
-	db.mu.Lock()
-	stats := DBStats{
-		OpenConnections: db.numOpen,
-	}
-	db.mu.Unlock()
-	return stats
-}
-
-// Assumes db.mu is locked.
-// If there are connRequests and the connection limit hasn't been reached,
-// then tell the connectionOpener to open new connections.
-func (db *DB) maybeOpenNewConnections() {
-	numRequests := len(db.connRequests) - db.pendingOpens
-	if db.maxOpen > 0 {
-		numCanOpen := db.maxOpen - (db.numOpen + db.pendingOpens)
-		if numRequests > numCanOpen {
-			numRequests = numCanOpen
-		}
-	}
-	for numRequests > 0 {
-		db.pendingOpens++
-		numRequests--
-		db.openerCh <- struct{}{}
-	}
-}
-
-// Runs in a separate goroutine, opens new connections when requested.
-func (db *DB) connectionOpener() {
-	for range db.openerCh {
-		db.openNewConnection()
-	}
-}
-
-// Open one new connection
-func (db *DB) openNewConnection() {
-	ci, err := db.driver.Open(db.dsn)
-	db.mu.Lock()
-	defer db.mu.Unlock()
-	if db.closed {
-		if err == nil {
-			ci.Close()
-		}
-		return
-	}
-	db.pendingOpens--
-	if err != nil {
-		db.putConnDBLocked(nil, err)
-		return
-	}
-	dc := &driverConn{
-		db: db,
-		ci: ci,
-	}
-	if db.putConnDBLocked(dc, err) {
-		db.addDepLocked(dc, dc)
-		db.numOpen++
-	} else {
-		ci.Close()
-	}
-}
-
-// connRequest represents one request for a new connection
-// When there are no idle connections available, DB.conn will create
-// a new connRequest and put it on the db.connRequests list.
-type connRequest struct {
-	conn *driverConn
-	err  error
-}
-
-var errDBClosed = errors.New("sql: database is closed")
-
-// conn returns a newly-opened or cached *driverConn.
-func (db *DB) conn(strategy connReuseStrategy) (*driverConn, error) {
-	db.mu.Lock()
-	if db.closed {
-		db.mu.Unlock()
-		return nil, errDBClosed
-	}
-
-	// Prefer a free connection, if possible.
-	numFree := len(db.freeConn)
-	if strategy == cachedOrNewConn && numFree > 0 {
-		conn := db.freeConn[0]
-		copy(db.freeConn, db.freeConn[1:])
-		db.freeConn = db.freeConn[:numFree-1]
-		conn.inUse = true
-		db.mu.Unlock()
-		return conn, nil
-	}
-
-	// Out of free connections or we were asked not to use one.  If we're not
-	// allowed to open any more connections, make a request and wait.
-	if db.maxOpen > 0 && db.numOpen >= db.maxOpen {
-		// Make the connRequest channel. It's buffered so that the
-		// connectionOpener doesn't block while waiting for the req to be read.
-		req := make(chan connRequest, 1)
-		db.connRequests = append(db.connRequests, req)
-		db.mu.Unlock()
-		ret := <-req
-		return ret.conn, ret.err
-	}
-
-	db.numOpen++ // optimistically
-	db.mu.Unlock()
-	ci, err := db.driver.Open(db.dsn)
-	if err != nil {
-		db.mu.Lock()
-		db.numOpen-- // correct for earlier optimism
-		db.mu.Unlock()
-		return nil, err
-	}
-	db.mu.Lock()
-	dc := &driverConn{
-		db: db,
-		ci: ci,
-	}
-	db.addDepLocked(dc, dc)
-	dc.inUse = true
-	db.mu.Unlock()
-	return dc, nil
-}
-
-var (
-	errConnClosed = errors.New("database/sql: internal sentinel error: conn is closed")
-	errConnBusy   = errors.New("database/sql: internal sentinel error: conn is busy")
-)
-
-// putConnHook is a hook for testing.
-var putConnHook func(*DB, *driverConn)
-
-// noteUnusedDriverStatement notes that si is no longer used and should
-// be closed whenever possible (when c is next not in use), unless c is
-// already closed.
-func (db *DB) noteUnusedDriverStatement(c *driverConn, si driver.Stmt) {
-	db.mu.Lock()
-	defer db.mu.Unlock()
-	if c.inUse {
-		c.onPut = append(c.onPut, func() {
-			si.Close()
-		})
-	} else {
-		c.Lock()
-		defer c.Unlock()
-		if !c.finalClosed {
-			si.Close()
-		}
-	}
-}
-
-// debugGetPut determines whether getConn & putConn calls' stack traces
-// are returned for more verbose crashes.
-const debugGetPut = false
-
-// putConn adds a connection to the db's free pool.
-// err is optionally the last error that occurred on this connection.
-func (db *DB) putConn(dc *driverConn, err error) {
-	db.mu.Lock()
-	if !dc.inUse {
-		if debugGetPut {
-			fmt.Printf("putConn(%v) DUPLICATE was: %s\n\nPREVIOUS was: %s", dc, stack(), db.lastPut[dc])
-		}
-		panic("sql: connection returned that was never out")
-	}
-	if debugGetPut {
-		db.lastPut[dc] = stack()
-	}
-	dc.inUse = false
-
-	for _, fn := range dc.onPut {
-		fn()
-	}
-	dc.onPut = nil
-
-	if err == driver.ErrBadConn {
-		// Don't reuse bad connections.
-		// Since the conn is considered bad and is being discarded, treat it
-		// as closed. Don't decrement the open count here, finalClose will
-		// take care of that.
-		db.maybeOpenNewConnections()
-		db.mu.Unlock()
-		dc.Close()
-		return
-	}
-	if putConnHook != nil {
-		putConnHook(db, dc)
-	}
-	added := db.putConnDBLocked(dc, nil)
-	db.mu.Unlock()
-
-	if !added {
-		dc.Close()
-	}
-}
-
-// Satisfy a connRequest or put the driverConn in the idle pool and return true
-// or return false.
-// putConnDBLocked will satisfy a connRequest if there is one, or it will
-// return the *driverConn to the freeConn list if err == nil and the idle
-// connection limit will not be exceeded.
-// If err != nil, the value of dc is ignored.
-// If err == nil, then dc must not equal nil.
-// If a connRequest was fulfilled or the *driverConn was placed in the
-// freeConn list, then true is returned, otherwise false is returned.
-func (db *DB) putConnDBLocked(dc *driverConn, err error) bool {
-	if db.maxOpen > 0 && db.numOpen > db.maxOpen {
-		return false
-	}
-	if c := len(db.connRequests); c > 0 {
-		req := db.connRequests[0]
-		// This copy is O(n) but in practice faster than a linked list.
-		// TODO: consider compacting it down less often and
-		// moving the base instead?
-		copy(db.connRequests, db.connRequests[1:])
-		db.connRequests = db.connRequests[:c-1]
-		if err == nil {
-			dc.inUse = true
-		}
-		req <- connRequest{
-			conn: dc,
-			err:  err,
-		}
-		return true
-	} else if err == nil && !db.closed && db.maxIdleConnsLocked() > len(db.freeConn) {
-		db.freeConn = append(db.freeConn, dc)
-		return true
-	}
-	return false
-}
-
-// maxBadConnRetries is the number of maximum retries if the driver returns
-// driver.ErrBadConn to signal a broken connection before forcing a new
-// connection to be opened.
-const maxBadConnRetries = 2
-
-// Prepare creates a prepared statement for later queries or executions.
-// Multiple queries or executions may be run concurrently from the
-// returned statement.
-// The caller must call the statement's Close method
-// when the statement is no longer needed.
-func (db *DB) Prepare(query string) (*Stmt, error) {
-	var stmt *Stmt
-	var err error
-	for i := 0; i < maxBadConnRetries; i++ {
-		stmt, err = db.prepare(query, cachedOrNewConn)
-		if err != driver.ErrBadConn {
-			break
-		}
-	}
-	if err == driver.ErrBadConn {
-		return db.prepare(query, alwaysNewConn)
-	}
-	return stmt, err
-}
-
-func (db *DB) prepare(query string, strategy connReuseStrategy) (*Stmt, error) {
-	// TODO: check if db.driver supports an optional
-	// driver.Preparer interface and call that instead, if so,
-	// otherwise we make a prepared statement that's bound
-	// to a connection, and to execute this prepared statement
-	// we either need to use this connection (if it's free), else
-	// get a new connection + re-prepare + execute on that one.
-	dc, err := db.conn(strategy)
-	if err != nil {
-		return nil, err
-	}
-	dc.Lock()
-	si, err := dc.prepareLocked(query)
-	dc.Unlock()
-	if err != nil {
-		db.putConn(dc, err)
-		return nil, err
-	}
-	stmt := &Stmt{
-		db:            db,
-		query:         query,
-		css:           []connStmt{{dc, si}},
-		lastNumClosed: atomic.LoadUint64(&db.numClosed),
-	}
-	db.addDep(stmt, stmt)
-	db.putConn(dc, nil)
-	return stmt, nil
-}
-
-// Exec executes a query without returning any rows.
-// The args are for any placeholder parameters in the query.
-func (db *DB) Exec(query string, args ...interface{}) (Result, error) {
-	var res Result
-	var err error
-	for i := 0; i < maxBadConnRetries; i++ {
-		res, err = db.exec(query, args, cachedOrNewConn)
-		if err != driver.ErrBadConn {
-			break
-		}
-	}
-	if err == driver.ErrBadConn {
-		return db.exec(query, args, alwaysNewConn)
-	}
-	return res, err
-}
-
-func (db *DB) exec(query string, args []interface{}, strategy connReuseStrategy) (res Result, err error) {
-	dc, err := db.conn(strategy)
-	if err != nil {
-		return nil, err
-	}
-	defer func() {
-		db.putConn(dc, err)
-	}()
-
-	if execer, ok := dc.ci.(driver.Execer); ok {
-		dargs, err := driverArgs(nil, args)
-		if err != nil {
-			return nil, err
-		}
-		dc.Lock()
-		resi, err := execer.Exec(query, dargs)
-		dc.Unlock()
-		if err != driver.ErrSkip {
-			if err != nil {
-				return nil, err
-			}
-			return driverResult{dc, resi}, nil
-		}
-	}
-
-	dc.Lock()
-	si, err := dc.ci.Prepare(query)
-	dc.Unlock()
-	if err != nil {
-		return nil, err
-	}
-	defer withLock(dc, func() { si.Close() })
-	return resultFromStatement(driverStmt{dc, si}, args...)
-}
-
-// Query executes a query that returns rows, typically a SELECT.
-// The args are for any placeholder parameters in the query.
-func (db *DB) Query(query string, args ...interface{}) (*Rows, error) {
-	var rows *Rows
-	var err error
-	for i := 0; i < maxBadConnRetries; i++ {
-		rows, err = db.query(query, args, cachedOrNewConn)
-		if err != driver.ErrBadConn {
-			break
-		}
-	}
-	if err == driver.ErrBadConn {
-		return db.query(query, args, alwaysNewConn)
-	}
-	return rows, err
-}
-
-func (db *DB) query(query string, args []interface{}, strategy connReuseStrategy) (*Rows, error) {
-	ci, err := db.conn(strategy)
-	if err != nil {
-		return nil, err
-	}
-
-	return db.queryConn(ci, ci.releaseConn, query, args)
-}
-
-// queryConn executes a query on the given connection.
-// The connection gets released by the releaseConn function.
-func (db *DB) queryConn(dc *driverConn, releaseConn func(error), query string, args []interface{}) (*Rows, error) {
-	if queryer, ok := dc.ci.(driver.Queryer); ok {
-		dargs, err := driverArgs(nil, args)
-		if err != nil {
-			releaseConn(err)
-			return nil, err
-		}
-		dc.Lock()
-		rowsi, err := queryer.Query(query, dargs)
-		dc.Unlock()
-		if err != driver.ErrSkip {
-			if err != nil {
-				releaseConn(err)
-				return nil, err
-			}
-			// Note: ownership of dc passes to the *Rows, to be freed
-			// with releaseConn.
-			rows := &Rows{
-				dc:          dc,
-				releaseConn: releaseConn,
-				rowsi:       rowsi,
-			}
-			return rows, nil
-		}
-	}
-
-	dc.Lock()
-	si, err := dc.ci.Prepare(query)
-	dc.Unlock()
-	if err != nil {
-		releaseConn(err)
-		return nil, err
-	}
-
-	ds := driverStmt{dc, si}
-	rowsi, err := rowsiFromStatement(ds, args...)
-	if err != nil {
-		dc.Lock()
-		si.Close()
-		dc.Unlock()
-		releaseConn(err)
-		return nil, err
-	}
-
-	// Note: ownership of ci passes to the *Rows, to be freed
-	// with releaseConn.
-	rows := &Rows{
-		dc:          dc,
-		releaseConn: releaseConn,
-		rowsi:       rowsi,
-		closeStmt:   si,
-	}
-	return rows, nil
-}
-
-// QueryRow executes a query that is expected to return at most one row.
-// QueryRow always return a non-nil value. Errors are deferred until
-// Row's Scan method is called.
-func (db *DB) QueryRow(query string, args ...interface{}) *Row {
-	rows, err := db.Query(query, args...)
-	return &Row{rows: rows, err: err}
-}
-
-// Begin starts a transaction. The isolation level is dependent on
-// the driver.
-func (db *DB) Begin() (*Tx, error) {
-	var tx *Tx
-	var err error
-	for i := 0; i < maxBadConnRetries; i++ {
-		tx, err = db.begin(cachedOrNewConn)
-		if err != driver.ErrBadConn {
-			break
-		}
-	}
-	if err == driver.ErrBadConn {
-		return db.begin(alwaysNewConn)
-	}
-	return tx, err
-}
-
-func (db *DB) begin(strategy connReuseStrategy) (tx *Tx, err error) {
-	dc, err := db.conn(strategy)
-	if err != nil {
-		return nil, err
-	}
-	dc.Lock()
-	txi, err := dc.ci.Begin()
-	dc.Unlock()
-	if err != nil {
-		db.putConn(dc, err)
-		return nil, err
-	}
-	return &Tx{
-		db:  db,
-		dc:  dc,
-		txi: txi,
-	}, nil
-}
-
-// Driver returns the database's underlying driver.
-func (db *DB) Driver() driver.Driver {
-	return db.driver
-}
-
-// Tx is an in-progress database transaction.
-//
-// A transaction must end with a call to Commit or Rollback.
-//
-// After a call to Commit or Rollback, all operations on the
-// transaction fail with ErrTxDone.
-//
-// The statements prepared for a transaction by calling
-// the transaction's Prepare or Stmt methods are closed
-// by the call to Commit or Rollback.
-type Tx struct {
-	db *DB
-
-	// dc is owned exclusively until Commit or Rollback, at which point
-	// it's returned with putConn.
-	dc  *driverConn
-	txi driver.Tx
-
-	// done transitions from false to true exactly once, on Commit
-	// or Rollback. once done, all operations fail with
-	// ErrTxDone.
-	done bool
-
-	// All Stmts prepared for this transaction.  These will be closed after the
-	// transaction has been committed or rolled back.
-	stmts struct {
-		sync.Mutex
-		v []*Stmt
-	}
-}
-
-var ErrTxDone = errors.New("sql: Transaction has already been committed or rolled back")
-
-func (tx *Tx) close() {
-	if tx.done {
-		panic("double close") // internal error
-	}
-	tx.done = true
-	tx.db.putConn(tx.dc, nil)
-	tx.dc = nil
-	tx.txi = nil
-}
-
-func (tx *Tx) grabConn() (*driverConn, error) {
-	if tx.done {
-		return nil, ErrTxDone
-	}
-	return tx.dc, nil
-}
-
-// Closes all Stmts prepared for this transaction.
-func (tx *Tx) closePrepared() {
-	tx.stmts.Lock()
-	for _, stmt := range tx.stmts.v {
-		stmt.Close()
-	}
-	tx.stmts.Unlock()
-}
-
-// Commit commits the transaction.
-func (tx *Tx) Commit() error {
-	if tx.done {
-		return ErrTxDone
-	}
-	defer tx.close()
-	tx.dc.Lock()
-	err := tx.txi.Commit()
-	tx.dc.Unlock()
-	if err != driver.ErrBadConn {
-		tx.closePrepared()
-	}
-	return err
-}
-
-// Rollback aborts the transaction.
-func (tx *Tx) Rollback() error {
-	if tx.done {
-		return ErrTxDone
-	}
-	defer tx.close()
-	tx.dc.Lock()
-	err := tx.txi.Rollback()
-	tx.dc.Unlock()
-	if err != driver.ErrBadConn {
-		tx.closePrepared()
-	}
-	return err
-}
-
-// Prepare creates a prepared statement for use within a transaction.
-//
-// The returned statement operates within the transaction and can no longer
-// be used once the transaction has been committed or rolled back.
-//
-// To use an existing prepared statement on this transaction, see Tx.Stmt.
-func (tx *Tx) Prepare(query string) (*Stmt, error) {
-	// TODO(bradfitz): We could be more efficient here and either
-	// provide a method to take an existing Stmt (created on
-	// perhaps a different Conn), and re-create it on this Conn if
-	// necessary. Or, better: keep a map in DB of query string to
-	// Stmts, and have Stmt.Execute do the right thing and
-	// re-prepare if the Conn in use doesn't have that prepared
-	// statement.  But we'll want to avoid caching the statement
-	// in the case where we only call conn.Prepare implicitly
-	// (such as in db.Exec or tx.Exec), but the caller package
-	// can't be holding a reference to the returned statement.
-	// Perhaps just looking at the reference count (by noting
-	// Stmt.Close) would be enough. We might also want a finalizer
-	// on Stmt to drop the reference count.
-	dc, err := tx.grabConn()
-	if err != nil {
-		return nil, err
-	}
-
-	dc.Lock()
-	si, err := dc.ci.Prepare(query)
-	dc.Unlock()
-	if err != nil {
-		return nil, err
-	}
-
-	stmt := &Stmt{
-		db: tx.db,
-		tx: tx,
-		txsi: &driverStmt{
-			Locker: dc,
-			si:     si,
-		},
-		query: query,
-	}
-	tx.stmts.Lock()
-	tx.stmts.v = append(tx.stmts.v, stmt)
-	tx.stmts.Unlock()
-	return stmt, nil
-}
-
-// Stmt returns a transaction-specific prepared statement from
-// an existing statement.
-//
-// Example:
-//  updateMoney, err := db.Prepare("UPDATE balance SET money=money+? WHERE id=?")
-//  ...
-//  tx, err := db.Begin()
-//  ...
-//  res, err := tx.Stmt(updateMoney).Exec(123.45, 98293203)
-//
-// The returned statement operates within the transaction and can no longer
-// be used once the transaction has been committed or rolled back.
-func (tx *Tx) Stmt(stmt *Stmt) *Stmt {
-	// TODO(bradfitz): optimize this. Currently this re-prepares
-	// each time.  This is fine for now to illustrate the API but
-	// we should really cache already-prepared statements
-	// per-Conn. See also the big comment in Tx.Prepare.
-
-	if tx.db != stmt.db {
-		return &Stmt{stickyErr: errors.New("sql: Tx.Stmt: statement from different database used")}
-	}
-	dc, err := tx.grabConn()
-	if err != nil {
-		return &Stmt{stickyErr: err}
-	}
-	dc.Lock()
-	si, err := dc.ci.Prepare(stmt.query)
-	dc.Unlock()
-	txs := &Stmt{
-		db: tx.db,
-		tx: tx,
-		txsi: &driverStmt{
-			Locker: dc,
-			si:     si,
-		},
-		query:     stmt.query,
-		stickyErr: err,
-	}
-	tx.stmts.Lock()
-	tx.stmts.v = append(tx.stmts.v, txs)
-	tx.stmts.Unlock()
-	return txs
-}
-
-// Exec executes a query that doesn't return rows.
-// For example: an INSERT and UPDATE.
-func (tx *Tx) Exec(query string, args ...interface{}) (Result, error) {
-	dc, err := tx.grabConn()
-	if err != nil {
-		return nil, err
-	}
-
-	if execer, ok := dc.ci.(driver.Execer); ok {
-		dargs, err := driverArgs(nil, args)
-		if err != nil {
-			return nil, err
-		}
-		dc.Lock()
-		resi, err := execer.Exec(query, dargs)
-		dc.Unlock()
-		if err == nil {
-			return driverResult{dc, resi}, nil
-		}
-		if err != driver.ErrSkip {
-			return nil, err
-		}
-	}
-
-	dc.Lock()
-	si, err := dc.ci.Prepare(query)
-	dc.Unlock()
-	if err != nil {
-		return nil, err
-	}
-	defer withLock(dc, func() { si.Close() })
-
-	return resultFromStatement(driverStmt{dc, si}, args...)
-}
-
-// Query executes a query that returns rows, typically a SELECT.
-func (tx *Tx) Query(query string, args ...interface{}) (*Rows, error) {
-	dc, err := tx.grabConn()
-	if err != nil {
-		return nil, err
-	}
-	releaseConn := func(error) {}
-	return tx.db.queryConn(dc, releaseConn, query, args)
-}
-
-// QueryRow executes a query that is expected to return at most one row.
-// QueryRow always return a non-nil value. Errors are deferred until
-// Row's Scan method is called.
-func (tx *Tx) QueryRow(query string, args ...interface{}) *Row {
-	rows, err := tx.Query(query, args...)
-	return &Row{rows: rows, err: err}
-}
-
-// connStmt is a prepared statement on a particular connection.
-type connStmt struct {
-	dc *driverConn
-	si driver.Stmt
-}
-
-// Stmt is a prepared statement.
-// A Stmt is safe for concurrent use by multiple goroutines.
-type Stmt struct {
-	// Immutable:
-	db        *DB    // where we came from
-	query     string // that created the Stmt
-	stickyErr error  // if non-nil, this error is returned for all operations
-
-	closemu sync.RWMutex // held exclusively during close, for read otherwise.
-
-	// If in a transaction, else both nil:
-	tx   *Tx
-	txsi *driverStmt
-
-	mu     sync.Mutex // protects the rest of the fields
-	closed bool
-
-	// css is a list of underlying driver statement interfaces
-	// that are valid on particular connections.  This is only
-	// used if tx == nil and one is found that has idle
-	// connections.  If tx != nil, txsi is always used.
-	css []connStmt
-
-	// lastNumClosed is copied from db.numClosed when Stmt is created
-	// without tx and closed connections in css are removed.
-	lastNumClosed uint64
-}
-
-// Exec executes a prepared statement with the given arguments and
-// returns a Result summarizing the effect of the statement.
-func (s *Stmt) Exec(args ...interface{}) (Result, error) {
-	s.closemu.RLock()
-	defer s.closemu.RUnlock()
-
-	var res Result
-	for i := 0; i < maxBadConnRetries; i++ {
-		dc, releaseConn, si, err := s.connStmt()
-		if err != nil {
-			if err == driver.ErrBadConn {
-				continue
-			}
-			return nil, err
-		}
-
-		res, err = resultFromStatement(driverStmt{dc, si}, args...)
-		releaseConn(err)
-		if err != driver.ErrBadConn {
-			return res, err
-		}
-	}
-	return nil, driver.ErrBadConn
-}
-
-func resultFromStatement(ds driverStmt, args ...interface{}) (Result, error) {
-	ds.Lock()
-	want := ds.si.NumInput()
-	ds.Unlock()
-
-	// -1 means the driver doesn't know how to count the number of
-	// placeholders, so we won't sanity check input here and instead let the
-	// driver deal with errors.
-	if want != -1 && len(args) != want {
-		return nil, fmt.Errorf("sql: expected %d arguments, got %d", want, len(args))
-	}
-
-	dargs, err := driverArgs(&ds, args)
-	if err != nil {
-		return nil, err
-	}
-
-	ds.Lock()
-	resi, err := ds.si.Exec(dargs)
-	ds.Unlock()
-	if err != nil {
-		return nil, err
-	}
-	return driverResult{ds.Locker, resi}, nil
-}
-
-// removeClosedStmtLocked removes closed conns in s.css.
-//
-// To avoid lock contention on DB.mu, we do it only when
-// s.db.numClosed - s.lastNum is large enough.
-func (s *Stmt) removeClosedStmtLocked() {
-	t := len(s.css)/2 + 1
-	if t > 10 {
-		t = 10
-	}
-	dbClosed := atomic.LoadUint64(&s.db.numClosed)
-	if dbClosed-s.lastNumClosed < uint64(t) {
-		return
-	}
-
-	s.db.mu.Lock()
-	for i := 0; i < len(s.css); i++ {
-		if s.css[i].dc.dbmuClosed {
-			s.css[i] = s.css[len(s.css)-1]
-			s.css = s.css[:len(s.css)-1]
-			i--
-		}
-	}
-	s.db.mu.Unlock()
-	s.lastNumClosed = dbClosed
-}
-
-// connStmt returns a free driver connection on which to execute the
-// statement, a function to call to release the connection, and a
-// statement bound to that connection.
-func (s *Stmt) connStmt() (ci *driverConn, releaseConn func(error), si driver.Stmt, err error) {
-	if err = s.stickyErr; err != nil {
-		return
-	}
-	s.mu.Lock()
-	if s.closed {
-		s.mu.Unlock()
-		err = errors.New("sql: statement is closed")
-		return
-	}
-
-	// In a transaction, we always use the connection that the
-	// transaction was created on.
-	if s.tx != nil {
-		s.mu.Unlock()
-		ci, err = s.tx.grabConn() // blocks, waiting for the connection.
-		if err != nil {
-			return
-		}
-		releaseConn = func(error) {}
-		return ci, releaseConn, s.txsi.si, nil
-	}
-
-	s.removeClosedStmtLocked()
-	s.mu.Unlock()
-
-	// TODO(bradfitz): or always wait for one? make configurable later?
-	dc, err := s.db.conn(cachedOrNewConn)
-	if err != nil {
-		return nil, nil, nil, err
-	}
-
-	s.mu.Lock()
-	for _, v := range s.css {
-		if v.dc == dc {
-			s.mu.Unlock()
-			return dc, dc.releaseConn, v.si, nil
-		}
-	}
-	s.mu.Unlock()
-
-	// No luck; we need to prepare the statement on this connection
-	dc.Lock()
-	si, err = dc.prepareLocked(s.query)
-	dc.Unlock()
-	if err != nil {
-		s.db.putConn(dc, err)
-		return nil, nil, nil, err
-	}
-	s.mu.Lock()
-	cs := connStmt{dc, si}
-	s.css = append(s.css, cs)
-	s.mu.Unlock()
-
-	return dc, dc.releaseConn, si, nil
-}
-
-// Query executes a prepared query statement with the given arguments
-// and returns the query results as a *Rows.
-func (s *Stmt) Query(args ...interface{}) (*Rows, error) {
-	s.closemu.RLock()
-	defer s.closemu.RUnlock()
-
-	var rowsi driver.Rows
-	for i := 0; i < maxBadConnRetries; i++ {
-		dc, releaseConn, si, err := s.connStmt()
-		if err != nil {
-			if err == driver.ErrBadConn {
-				continue
-			}
-			return nil, err
-		}
-
-		rowsi, err = rowsiFromStatement(driverStmt{dc, si}, args...)
-		if err == nil {
-			// Note: ownership of ci passes to the *Rows, to be freed
-			// with releaseConn.
-			rows := &Rows{
-				dc:    dc,
-				rowsi: rowsi,
-				// releaseConn set below
-			}
-			s.db.addDep(s, rows)
-			rows.releaseConn = func(err error) {
-				releaseConn(err)
-				s.db.removeDep(s, rows)
-			}
-			return rows, nil
-		}
-
-		releaseConn(err)
-		if err != driver.ErrBadConn {
-			return nil, err
-		}
-	}
-	return nil, driver.ErrBadConn
-}
-
-func rowsiFromStatement(ds driverStmt, args ...interface{}) (driver.Rows, error) {
-	ds.Lock()
-	want := ds.si.NumInput()
-	ds.Unlock()
-
-	// -1 means the driver doesn't know how to count the number of
-	// placeholders, so we won't sanity check input here and instead let the
-	// driver deal with errors.
-	if want != -1 && len(args) != want {
-		return nil, fmt.Errorf("sql: statement expects %d inputs; got %d", want, len(args))
-	}
-
-	dargs, err := driverArgs(&ds, args)
-	if err != nil {
-		return nil, err
-	}
-
-	ds.Lock()
-	rowsi, err := ds.si.Query(dargs)
-	ds.Unlock()
-	if err != nil {
-		return nil, err
-	}
-	return rowsi, nil
-}
-
-// QueryRow executes a prepared query statement with the given arguments.
-// If an error occurs during the execution of the statement, that error will
-// be returned by a call to Scan on the returned *Row, which is always non-nil.
-// If the query selects no rows, the *Row's Scan will return ErrNoRows.
-// Otherwise, the *Row's Scan scans the first selected row and discards
-// the rest.
-//
-// Example usage:
-//
-//  var name string
-//  err := nameByUseridStmt.QueryRow(id).Scan(&name)
-func (s *Stmt) QueryRow(args ...interface{}) *Row {
-	rows, err := s.Query(args...)
-	if err != nil {
-		return &Row{err: err}
-	}
-	return &Row{rows: rows}
-}
-
-// Close closes the statement.
-func (s *Stmt) Close() error {
-	s.closemu.Lock()
-	defer s.closemu.Unlock()
-
-	if s.stickyErr != nil {
-		return s.stickyErr
-	}
-	s.mu.Lock()
-	if s.closed {
-		s.mu.Unlock()
-		return nil
-	}
-	s.closed = true
-
-	if s.tx != nil {
-		s.txsi.Close()
-		s.mu.Unlock()
-		return nil
-	}
-	s.mu.Unlock()
-
-	return s.db.removeDep(s, s)
-}
-
-func (s *Stmt) finalClose() error {
-	s.mu.Lock()
-	defer s.mu.Unlock()
-	if s.css != nil {
-		for _, v := range s.css {
-			s.db.noteUnusedDriverStatement(v.dc, v.si)
-			v.dc.removeOpenStmt(v.si)
-		}
-		s.css = nil
-	}
-	return nil
-}
-
-// Rows is the result of a query. Its cursor starts before the first row
-// of the result set. Use Next to advance through the rows:
-//
-//     rows, err := db.Query("SELECT ...")
-//     ...
-//     defer rows.Close()
-//     for rows.Next() {
-//         var id int
-//         var name string
-//         err = rows.Scan(&id, &name)
-//         ...
-//     }
-//     err = rows.Err() // get any error encountered during iteration
-//     ...
-type Rows struct {
-	dc          *driverConn // owned; must call releaseConn when closed to release
-	releaseConn func(error)
-	rowsi       driver.Rows
-
-	closed    bool
-	lastcols  []driver.Value
-	lasterr   error       // non-nil only if closed is true
-	closeStmt driver.Stmt // if non-nil, statement to Close on close
-}
-
-// Next prepares the next result row for reading with the Scan method.  It
-// returns true on success, or false if there is no next result row or an error
-// happened while preparing it.  Err should be consulted to distinguish between
-// the two cases.
-//
-// Every call to Scan, even the first one, must be preceded by a call to Next.
-func (rs *Rows) Next() bool {
-	if rs.closed {
-		return false
-	}
-	if rs.lastcols == nil {
-		rs.lastcols = make([]driver.Value, len(rs.rowsi.Columns()))
-	}
-	rs.lasterr = rs.rowsi.Next(rs.lastcols)
-	if rs.lasterr != nil {
-		rs.Close()
-		return false
-	}
-	return true
-}
-
-// Err returns the error, if any, that was encountered during iteration.
-// Err may be called after an explicit or implicit Close.
-func (rs *Rows) Err() error {
-	if rs.lasterr == io.EOF {
-		return nil
-	}
-	return rs.lasterr
-}
-
-// Columns returns the column names.
-// Columns returns an error if the rows are closed, or if the rows
-// are from QueryRow and there was a deferred error.
-func (rs *Rows) Columns() ([]string, error) {
-	if rs.closed {
-		return nil, errors.New("sql: Rows are closed")
-	}
-	if rs.rowsi == nil {
-		return nil, errors.New("sql: no Rows available")
-	}
-	return rs.rowsi.Columns(), nil
-}
-
-// Scan copies the columns in the current row into the values pointed
-// at by dest.
-//
-// If an argument has type *[]byte, Scan saves in that argument a copy
-// of the corresponding data. The copy is owned by the caller and can
-// be modified and held indefinitely. The copy can be avoided by using
-// an argument of type *RawBytes instead; see the documentation for
-// RawBytes for restrictions on its use.
-//
-// If an argument has type *interface{}, Scan copies the value
-// provided by the underlying driver without conversion. If the value
-// is of type []byte, a copy is made and the caller owns the result.
-func (rs *Rows) Scan(dest ...interface{}) error {
-	if rs.closed {
-		return errors.New("sql: Rows are closed")
-	}
-	if rs.lastcols == nil {
-		return errors.New("sql: Scan called without calling Next")
-	}
-	if len(dest) != len(rs.lastcols) {
-		return fmt.Errorf("sql: expected %d destination arguments in Scan, not %d", len(rs.lastcols), len(dest))
-	}
-	for i, sv := range rs.lastcols {
-		err := convertAssign(dest[i], sv)
-		if err != nil {
-			return fmt.Errorf("sql: Scan error on column index %d: %v", i, err)
-		}
-	}
-	return nil
-}
-
-var rowsCloseHook func(*Rows, *error)
-
-// Close closes the Rows, preventing further enumeration. If Next returns
-// false, the Rows are closed automatically and it will suffice to check the
-// result of Err. Close is idempotent and does not affect the result of Err.
-func (rs *Rows) Close() error {
-	if rs.closed {
-		return nil
-	}
-	rs.closed = true
-	err := rs.rowsi.Close()
-	if fn := rowsCloseHook; fn != nil {
-		fn(rs, &err)
-	}
-	if rs.closeStmt != nil {
-		rs.closeStmt.Close()
-	}
-	rs.releaseConn(err)
-	return err
-}
-
-// Row is the result of calling QueryRow to select a single row.
-type Row struct {
-	// One of these two will be non-nil:
-	err  error // deferred error for easy chaining
-	rows *Rows
-}
-
-// Scan copies the columns from the matched row into the values
-// pointed at by dest.  If more than one row matches the query,
-// Scan uses the first row and discards the rest.  If no row matches
-// the query, Scan returns ErrNoRows.
-func (r *Row) Scan(dest ...interface{}) error {
-	if r.err != nil {
-		return r.err
-	}
-
-	// TODO(bradfitz): for now we need to defensively clone all
-	// []byte that the driver returned (not permitting
-	// *RawBytes in Rows.Scan), since we're about to close
-	// the Rows in our defer, when we return from this function.
-	// the contract with the driver.Next(...) interface is that it
-	// can return slices into read-only temporary memory that's
-	// only valid until the next Scan/Close.  But the TODO is that
-	// for a lot of drivers, this copy will be unnecessary.  We
-	// should provide an optional interface for drivers to
-	// implement to say, "don't worry, the []bytes that I return
-	// from Next will not be modified again." (for instance, if
-	// they were obtained from the network anyway) But for now we
-	// don't care.
-	defer r.rows.Close()
-	for _, dp := range dest {
-		if _, ok := dp.(*RawBytes); ok {
-			return errors.New("sql: RawBytes isn't allowed on Row.Scan")
-		}
-	}
-
-	if !r.rows.Next() {
-		if err := r.rows.Err(); err != nil {
-			return err
-		}
-		return ErrNoRows
-	}
-	err := r.rows.Scan(dest...)
-	if err != nil {
-		return err
-	}
-	// Make sure the query can be processed to completion with no errors.
-	if err := r.rows.Close(); err != nil {
-		return err
-	}
-
-	return nil
-}
-
-// A Result summarizes an executed SQL command.
-type Result interface {
-	// LastInsertId returns the integer generated by the database
-	// in response to a command. Typically this will be from an
-	// "auto increment" column when inserting a new row. Not all
-	// databases support this feature, and the syntax of such
-	// statements varies.
-	LastInsertId() (int64, error)
-
-	// RowsAffected returns the number of rows affected by an
-	// update, insert, or delete. Not every database or database
-	// driver may support this.
-	RowsAffected() (int64, error)
-}
-
-type driverResult struct {
-	sync.Locker // the *driverConn
-	resi        driver.Result
-}
-
-func (dr driverResult) LastInsertId() (int64, error) {
-	dr.Lock()
-	defer dr.Unlock()
-	return dr.resi.LastInsertId()
-}
-
-func (dr driverResult) RowsAffected() (int64, error) {
-	dr.Lock()
-	defer dr.Unlock()
-	return dr.resi.RowsAffected()
-}
-
-func stack() string {
-	var buf [2 << 10]byte
-	return string(buf[:runtime.Stack(buf[:], false)])
-}
-
-// withLock runs while holding lk.
-func withLock(lk sync.Locker, fn func()) {
-	lk.Lock()
-	fn()
-	lk.Unlock()
-}
diff --git a/third_party/gofrontend/libgo/go/database/sql/sql_test.go b/third_party/gofrontend/libgo/go/database/sql/sql_test.go
deleted file mode 100644
index 432a641..0000000
--- a/third_party/gofrontend/libgo/go/database/sql/sql_test.go
+++ /dev/null
@@ -1,2109 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sql
-
-import (
-	"database/sql/driver"
-	"errors"
-	"fmt"
-	"math/rand"
-	"reflect"
-	"runtime"
-	"strings"
-	"sync"
-	"testing"
-	"time"
-)
-
-func init() {
-	type dbConn struct {
-		db *DB
-		c  *driverConn
-	}
-	freedFrom := make(map[dbConn]string)
-	putConnHook = func(db *DB, c *driverConn) {
-		idx := -1
-		for i, v := range db.freeConn {
-			if v == c {
-				idx = i
-				break
-			}
-		}
-		if idx >= 0 {
-			// print before panic, as panic may get lost due to conflicting panic
-			// (all goroutines asleep) elsewhere, since we might not unlock
-			// the mutex in freeConn here.
-			println("double free of conn. conflicts are:\nA) " + freedFrom[dbConn{db, c}] + "\n\nand\nB) " + stack())
-			panic("double free of conn.")
-		}
-		freedFrom[dbConn{db, c}] = stack()
-	}
-}
-
-const fakeDBName = "foo"
-
-var chrisBirthday = time.Unix(123456789, 0)
-
-func newTestDB(t testing.TB, name string) *DB {
-	db, err := Open("test", fakeDBName)
-	if err != nil {
-		t.Fatalf("Open: %v", err)
-	}
-	if _, err := db.Exec("WIPE"); err != nil {
-		t.Fatalf("exec wipe: %v", err)
-	}
-	if name == "people" {
-		exec(t, db, "CREATE|people|name=string,age=int32,photo=blob,dead=bool,bdate=datetime")
-		exec(t, db, "INSERT|people|name=Alice,age=?,photo=APHOTO", 1)
-		exec(t, db, "INSERT|people|name=Bob,age=?,photo=BPHOTO", 2)
-		exec(t, db, "INSERT|people|name=Chris,age=?,photo=CPHOTO,bdate=?", 3, chrisBirthday)
-	}
-	if name == "magicquery" {
-		// Magic table name and column, known by fakedb_test.go.
-		exec(t, db, "CREATE|magicquery|op=string,millis=int32")
-		exec(t, db, "INSERT|magicquery|op=sleep,millis=10")
-	}
-	return db
-}
-
-func exec(t testing.TB, db *DB, query string, args ...interface{}) {
-	_, err := db.Exec(query, args...)
-	if err != nil {
-		t.Fatalf("Exec of %q: %v", query, err)
-	}
-}
-
-func closeDB(t testing.TB, db *DB) {
-	if e := recover(); e != nil {
-		fmt.Printf("Panic: %v\n", e)
-		panic(e)
-	}
-	defer setHookpostCloseConn(nil)
-	setHookpostCloseConn(func(_ *fakeConn, err error) {
-		if err != nil {
-			t.Errorf("Error closing fakeConn: %v", err)
-		}
-	})
-	for i, dc := range db.freeConn {
-		if n := len(dc.openStmt); n > 0 {
-			// Just a sanity check. This is legal in
-			// general, but if we make the tests clean up
-			// their statements first, then we can safely
-			// verify this is always zero here, and any
-			// other value is a leak.
-			t.Errorf("while closing db, freeConn %d/%d had %d open stmts; want 0", i, len(db.freeConn), n)
-		}
-	}
-	err := db.Close()
-	if err != nil {
-		t.Fatalf("error closing DB: %v", err)
-	}
-	db.mu.Lock()
-	count := db.numOpen
-	db.mu.Unlock()
-	if count != 0 {
-		t.Fatalf("%d connections still open after closing DB", db.numOpen)
-	}
-}
-
-// numPrepares assumes that db has exactly 1 idle conn and returns
-// its count of calls to Prepare
-func numPrepares(t *testing.T, db *DB) int {
-	if n := len(db.freeConn); n != 1 {
-		t.Fatalf("free conns = %d; want 1", n)
-	}
-	return db.freeConn[0].ci.(*fakeConn).numPrepare
-}
-
-func (db *DB) numDeps() int {
-	db.mu.Lock()
-	defer db.mu.Unlock()
-	return len(db.dep)
-}
-
-// Dependencies are closed via a goroutine, so this polls waiting for
-// numDeps to fall to want, waiting up to d.
-func (db *DB) numDepsPollUntil(want int, d time.Duration) int {
-	deadline := time.Now().Add(d)
-	for {
-		n := db.numDeps()
-		if n <= want || time.Now().After(deadline) {
-			return n
-		}
-		time.Sleep(50 * time.Millisecond)
-	}
-}
-
-func (db *DB) numFreeConns() int {
-	db.mu.Lock()
-	defer db.mu.Unlock()
-	return len(db.freeConn)
-}
-
-func (db *DB) dumpDeps(t *testing.T) {
-	for fc := range db.dep {
-		db.dumpDep(t, 0, fc, map[finalCloser]bool{})
-	}
-}
-
-func (db *DB) dumpDep(t *testing.T, depth int, dep finalCloser, seen map[finalCloser]bool) {
-	seen[dep] = true
-	indent := strings.Repeat("  ", depth)
-	ds := db.dep[dep]
-	for k := range ds {
-		t.Logf("%s%T (%p) waiting for -> %T (%p)", indent, dep, dep, k, k)
-		if fc, ok := k.(finalCloser); ok {
-			if !seen[fc] {
-				db.dumpDep(t, depth+1, fc, seen)
-			}
-		}
-	}
-}
-
-func TestQuery(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-	prepares0 := numPrepares(t, db)
-	rows, err := db.Query("SELECT|people|age,name|")
-	if err != nil {
-		t.Fatalf("Query: %v", err)
-	}
-	type row struct {
-		age  int
-		name string
-	}
-	got := []row{}
-	for rows.Next() {
-		var r row
-		err = rows.Scan(&r.age, &r.name)
-		if err != nil {
-			t.Fatalf("Scan: %v", err)
-		}
-		got = append(got, r)
-	}
-	err = rows.Err()
-	if err != nil {
-		t.Fatalf("Err: %v", err)
-	}
-	want := []row{
-		{age: 1, name: "Alice"},
-		{age: 2, name: "Bob"},
-		{age: 3, name: "Chris"},
-	}
-	if !reflect.DeepEqual(got, want) {
-		t.Errorf("mismatch.\n got: %#v\nwant: %#v", got, want)
-	}
-
-	// And verify that the final rows.Next() call, which hit EOF,
-	// also closed the rows connection.
-	if n := db.numFreeConns(); n != 1 {
-		t.Fatalf("free conns after query hitting EOF = %d; want 1", n)
-	}
-	if prepares := numPrepares(t, db) - prepares0; prepares != 1 {
-		t.Errorf("executed %d Prepare statements; want 1", prepares)
-	}
-}
-
-func TestByteOwnership(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-	rows, err := db.Query("SELECT|people|name,photo|")
-	if err != nil {
-		t.Fatalf("Query: %v", err)
-	}
-	type row struct {
-		name  []byte
-		photo RawBytes
-	}
-	got := []row{}
-	for rows.Next() {
-		var r row
-		err = rows.Scan(&r.name, &r.photo)
-		if err != nil {
-			t.Fatalf("Scan: %v", err)
-		}
-		got = append(got, r)
-	}
-	corruptMemory := []byte("\xffPHOTO")
-	want := []row{
-		{name: []byte("Alice"), photo: corruptMemory},
-		{name: []byte("Bob"), photo: corruptMemory},
-		{name: []byte("Chris"), photo: corruptMemory},
-	}
-	if !reflect.DeepEqual(got, want) {
-		t.Errorf("mismatch.\n got: %#v\nwant: %#v", got, want)
-	}
-
-	var photo RawBytes
-	err = db.QueryRow("SELECT|people|photo|name=?", "Alice").Scan(&photo)
-	if err == nil {
-		t.Error("want error scanning into RawBytes from QueryRow")
-	}
-}
-
-func TestRowsColumns(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-	rows, err := db.Query("SELECT|people|age,name|")
-	if err != nil {
-		t.Fatalf("Query: %v", err)
-	}
-	cols, err := rows.Columns()
-	if err != nil {
-		t.Fatalf("Columns: %v", err)
-	}
-	want := []string{"age", "name"}
-	if !reflect.DeepEqual(cols, want) {
-		t.Errorf("got %#v; want %#v", cols, want)
-	}
-	if err := rows.Close(); err != nil {
-		t.Errorf("error closing rows: %s", err)
-	}
-}
-
-func TestQueryRow(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-	var name string
-	var age int
-	var birthday time.Time
-
-	err := db.QueryRow("SELECT|people|age,name|age=?", 3).Scan(&age)
-	if err == nil || !strings.Contains(err.Error(), "expected 2 destination arguments") {
-		t.Errorf("expected error from wrong number of arguments; actually got: %v", err)
-	}
-
-	err = db.QueryRow("SELECT|people|bdate|age=?", 3).Scan(&birthday)
-	if err != nil || !birthday.Equal(chrisBirthday) {
-		t.Errorf("chris birthday = %v, err = %v; want %v", birthday, err, chrisBirthday)
-	}
-
-	err = db.QueryRow("SELECT|people|age,name|age=?", 2).Scan(&age, &name)
-	if err != nil {
-		t.Fatalf("age QueryRow+Scan: %v", err)
-	}
-	if name != "Bob" {
-		t.Errorf("expected name Bob, got %q", name)
-	}
-	if age != 2 {
-		t.Errorf("expected age 2, got %d", age)
-	}
-
-	err = db.QueryRow("SELECT|people|age,name|name=?", "Alice").Scan(&age, &name)
-	if err != nil {
-		t.Fatalf("name QueryRow+Scan: %v", err)
-	}
-	if name != "Alice" {
-		t.Errorf("expected name Alice, got %q", name)
-	}
-	if age != 1 {
-		t.Errorf("expected age 1, got %d", age)
-	}
-
-	var photo []byte
-	err = db.QueryRow("SELECT|people|photo|name=?", "Alice").Scan(&photo)
-	if err != nil {
-		t.Fatalf("photo QueryRow+Scan: %v", err)
-	}
-	want := []byte("APHOTO")
-	if !reflect.DeepEqual(photo, want) {
-		t.Errorf("photo = %q; want %q", photo, want)
-	}
-}
-
-func TestStatementErrorAfterClose(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-	stmt, err := db.Prepare("SELECT|people|age|name=?")
-	if err != nil {
-		t.Fatalf("Prepare: %v", err)
-	}
-	err = stmt.Close()
-	if err != nil {
-		t.Fatalf("Close: %v", err)
-	}
-	var name string
-	err = stmt.QueryRow("foo").Scan(&name)
-	if err == nil {
-		t.Errorf("expected error from QueryRow.Scan after Stmt.Close")
-	}
-}
-
-func TestStatementQueryRow(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-	stmt, err := db.Prepare("SELECT|people|age|name=?")
-	if err != nil {
-		t.Fatalf("Prepare: %v", err)
-	}
-	defer stmt.Close()
-	var age int
-	for n, tt := range []struct {
-		name string
-		want int
-	}{
-		{"Alice", 1},
-		{"Bob", 2},
-		{"Chris", 3},
-	} {
-		if err := stmt.QueryRow(tt.name).Scan(&age); err != nil {
-			t.Errorf("%d: on %q, QueryRow/Scan: %v", n, tt.name, err)
-		} else if age != tt.want {
-			t.Errorf("%d: age=%d, want %d", n, age, tt.want)
-		}
-	}
-}
-
-// golang.org/issue/3734
-func TestStatementQueryRowConcurrent(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-	stmt, err := db.Prepare("SELECT|people|age|name=?")
-	if err != nil {
-		t.Fatalf("Prepare: %v", err)
-	}
-	defer stmt.Close()
-
-	const n = 10
-	ch := make(chan error, n)
-	for i := 0; i < n; i++ {
-		go func() {
-			var age int
-			err := stmt.QueryRow("Alice").Scan(&age)
-			if err == nil && age != 1 {
-				err = fmt.Errorf("unexpected age %d", age)
-			}
-			ch <- err
-		}()
-	}
-	for i := 0; i < n; i++ {
-		if err := <-ch; err != nil {
-			t.Error(err)
-		}
-	}
-}
-
-// just a test of fakedb itself
-func TestBogusPreboundParameters(t *testing.T) {
-	db := newTestDB(t, "foo")
-	defer closeDB(t, db)
-	exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
-	_, err := db.Prepare("INSERT|t1|name=?,age=bogusconversion")
-	if err == nil {
-		t.Fatalf("expected error")
-	}
-	if err.Error() != `fakedb: invalid conversion to int32 from "bogusconversion"` {
-		t.Errorf("unexpected error: %v", err)
-	}
-}
-
-func TestExec(t *testing.T) {
-	db := newTestDB(t, "foo")
-	defer closeDB(t, db)
-	exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
-	stmt, err := db.Prepare("INSERT|t1|name=?,age=?")
-	if err != nil {
-		t.Errorf("Stmt, err = %v, %v", stmt, err)
-	}
-	defer stmt.Close()
-
-	type execTest struct {
-		args    []interface{}
-		wantErr string
-	}
-	execTests := []execTest{
-		// Okay:
-		{[]interface{}{"Brad", 31}, ""},
-		{[]interface{}{"Brad", int64(31)}, ""},
-		{[]interface{}{"Bob", "32"}, ""},
-		{[]interface{}{7, 9}, ""},
-
-		// Invalid conversions:
-		{[]interface{}{"Brad", int64(0xFFFFFFFF)}, "sql: converting argument #1's type: sql/driver: value 4294967295 overflows int32"},
-		{[]interface{}{"Brad", "strconv fail"}, "sql: converting argument #1's type: sql/driver: value \"strconv fail\" can't be converted to int32"},
-
-		// Wrong number of args:
-		{[]interface{}{}, "sql: expected 2 arguments, got 0"},
-		{[]interface{}{1, 2, 3}, "sql: expected 2 arguments, got 3"},
-	}
-	for n, et := range execTests {
-		_, err := stmt.Exec(et.args...)
-		errStr := ""
-		if err != nil {
-			errStr = err.Error()
-		}
-		if errStr != et.wantErr {
-			t.Errorf("stmt.Execute #%d: for %v, got error %q, want error %q",
-				n, et.args, errStr, et.wantErr)
-		}
-	}
-}
-
-func TestTxPrepare(t *testing.T) {
-	db := newTestDB(t, "")
-	defer closeDB(t, db)
-	exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
-	tx, err := db.Begin()
-	if err != nil {
-		t.Fatalf("Begin = %v", err)
-	}
-	stmt, err := tx.Prepare("INSERT|t1|name=?,age=?")
-	if err != nil {
-		t.Fatalf("Stmt, err = %v, %v", stmt, err)
-	}
-	defer stmt.Close()
-	_, err = stmt.Exec("Bobby", 7)
-	if err != nil {
-		t.Fatalf("Exec = %v", err)
-	}
-	err = tx.Commit()
-	if err != nil {
-		t.Fatalf("Commit = %v", err)
-	}
-	// Commit() should have closed the statement
-	if !stmt.closed {
-		t.Fatal("Stmt not closed after Commit")
-	}
-}
-
-func TestTxStmt(t *testing.T) {
-	db := newTestDB(t, "")
-	defer closeDB(t, db)
-	exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
-	stmt, err := db.Prepare("INSERT|t1|name=?,age=?")
-	if err != nil {
-		t.Fatalf("Stmt, err = %v, %v", stmt, err)
-	}
-	defer stmt.Close()
-	tx, err := db.Begin()
-	if err != nil {
-		t.Fatalf("Begin = %v", err)
-	}
-	txs := tx.Stmt(stmt)
-	defer txs.Close()
-	_, err = txs.Exec("Bobby", 7)
-	if err != nil {
-		t.Fatalf("Exec = %v", err)
-	}
-	err = tx.Commit()
-	if err != nil {
-		t.Fatalf("Commit = %v", err)
-	}
-	// Commit() should have closed the statement
-	if !txs.closed {
-		t.Fatal("Stmt not closed after Commit")
-	}
-}
-
-// Issue: https://golang.org/issue/2784
-// This test didn't fail before because we got lucky with the fakedb driver.
-// It was failing, and now not, in github.com/bradfitz/go-sql-test
-func TestTxQuery(t *testing.T) {
-	db := newTestDB(t, "")
-	defer closeDB(t, db)
-	exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
-	exec(t, db, "INSERT|t1|name=Alice")
-
-	tx, err := db.Begin()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer tx.Rollback()
-
-	r, err := tx.Query("SELECT|t1|name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer r.Close()
-
-	if !r.Next() {
-		if r.Err() != nil {
-			t.Fatal(r.Err())
-		}
-		t.Fatal("expected one row")
-	}
-
-	var x string
-	err = r.Scan(&x)
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func TestTxQueryInvalid(t *testing.T) {
-	db := newTestDB(t, "")
-	defer closeDB(t, db)
-
-	tx, err := db.Begin()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer tx.Rollback()
-
-	_, err = tx.Query("SELECT|t1|name|")
-	if err == nil {
-		t.Fatal("Error expected")
-	}
-}
-
-// Tests fix for issue 4433, that retries in Begin happen when
-// conn.Begin() returns ErrBadConn
-func TestTxErrBadConn(t *testing.T) {
-	db, err := Open("test", fakeDBName+";badConn")
-	if err != nil {
-		t.Fatalf("Open: %v", err)
-	}
-	if _, err := db.Exec("WIPE"); err != nil {
-		t.Fatalf("exec wipe: %v", err)
-	}
-	defer closeDB(t, db)
-	exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
-	stmt, err := db.Prepare("INSERT|t1|name=?,age=?")
-	if err != nil {
-		t.Fatalf("Stmt, err = %v, %v", stmt, err)
-	}
-	defer stmt.Close()
-	tx, err := db.Begin()
-	if err != nil {
-		t.Fatalf("Begin = %v", err)
-	}
-	txs := tx.Stmt(stmt)
-	defer txs.Close()
-	_, err = txs.Exec("Bobby", 7)
-	if err != nil {
-		t.Fatalf("Exec = %v", err)
-	}
-	err = tx.Commit()
-	if err != nil {
-		t.Fatalf("Commit = %v", err)
-	}
-}
-
-// Tests fix for issue 2542, that we release a lock when querying on
-// a closed connection.
-func TestIssue2542Deadlock(t *testing.T) {
-	db := newTestDB(t, "people")
-	closeDB(t, db)
-	for i := 0; i < 2; i++ {
-		_, err := db.Query("SELECT|people|age,name|")
-		if err == nil {
-			t.Fatalf("expected error")
-		}
-	}
-}
-
-// From golang.org/issue/3865
-func TestCloseStmtBeforeRows(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-
-	s, err := db.Prepare("SELECT|people|name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	r, err := s.Query()
-	if err != nil {
-		s.Close()
-		t.Fatal(err)
-	}
-
-	err = s.Close()
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	r.Close()
-}
-
-// Tests fix for issue 2788, that we bind nil to a []byte if the
-// value in the column is sql null
-func TestNullByteSlice(t *testing.T) {
-	db := newTestDB(t, "")
-	defer closeDB(t, db)
-	exec(t, db, "CREATE|t|id=int32,name=nullstring")
-	exec(t, db, "INSERT|t|id=10,name=?", nil)
-
-	var name []byte
-
-	err := db.QueryRow("SELECT|t|name|id=?", 10).Scan(&name)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if name != nil {
-		t.Fatalf("name []byte should be nil for null column value, got: %#v", name)
-	}
-
-	exec(t, db, "INSERT|t|id=11,name=?", "bob")
-	err = db.QueryRow("SELECT|t|name|id=?", 11).Scan(&name)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if string(name) != "bob" {
-		t.Fatalf("name []byte should be bob, got: %q", string(name))
-	}
-}
-
-func TestPointerParamsAndScans(t *testing.T) {
-	db := newTestDB(t, "")
-	defer closeDB(t, db)
-	exec(t, db, "CREATE|t|id=int32,name=nullstring")
-
-	bob := "bob"
-	var name *string
-
-	name = &bob
-	exec(t, db, "INSERT|t|id=10,name=?", name)
-	name = nil
-	exec(t, db, "INSERT|t|id=20,name=?", name)
-
-	err := db.QueryRow("SELECT|t|name|id=?", 10).Scan(&name)
-	if err != nil {
-		t.Fatalf("querying id 10: %v", err)
-	}
-	if name == nil {
-		t.Errorf("id 10's name = nil; want bob")
-	} else if *name != "bob" {
-		t.Errorf("id 10's name = %q; want bob", *name)
-	}
-
-	err = db.QueryRow("SELECT|t|name|id=?", 20).Scan(&name)
-	if err != nil {
-		t.Fatalf("querying id 20: %v", err)
-	}
-	if name != nil {
-		t.Errorf("id 20 = %q; want nil", *name)
-	}
-}
-
-func TestQueryRowClosingStmt(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-	var name string
-	var age int
-	err := db.QueryRow("SELECT|people|age,name|age=?", 3).Scan(&age, &name)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if len(db.freeConn) != 1 {
-		t.Fatalf("expected 1 free conn")
-	}
-	fakeConn := db.freeConn[0].ci.(*fakeConn)
-	if made, closed := fakeConn.stmtsMade, fakeConn.stmtsClosed; made != closed {
-		t.Errorf("statement close mismatch: made %d, closed %d", made, closed)
-	}
-}
-
-// Test issue 6651
-func TestIssue6651(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-
-	var v string
-
-	want := "error in rows.Next"
-	rowsCursorNextHook = func(dest []driver.Value) error {
-		return fmt.Errorf(want)
-	}
-	defer func() { rowsCursorNextHook = nil }()
-	err := db.QueryRow("SELECT|people|name|").Scan(&v)
-	if err == nil || err.Error() != want {
-		t.Errorf("error = %q; want %q", err, want)
-	}
-	rowsCursorNextHook = nil
-
-	want = "error in rows.Close"
-	rowsCloseHook = func(rows *Rows, err *error) {
-		*err = fmt.Errorf(want)
-	}
-	defer func() { rowsCloseHook = nil }()
-	err = db.QueryRow("SELECT|people|name|").Scan(&v)
-	if err == nil || err.Error() != want {
-		t.Errorf("error = %q; want %q", err, want)
-	}
-}
-
-type nullTestRow struct {
-	nullParam    interface{}
-	notNullParam interface{}
-	scanNullVal  interface{}
-}
-
-type nullTestSpec struct {
-	nullType    string
-	notNullType string
-	rows        [6]nullTestRow
-}
-
-func TestNullStringParam(t *testing.T) {
-	spec := nullTestSpec{"nullstring", "string", [6]nullTestRow{
-		{NullString{"aqua", true}, "", NullString{"aqua", true}},
-		{NullString{"brown", false}, "", NullString{"", false}},
-		{"chartreuse", "", NullString{"chartreuse", true}},
-		{NullString{"darkred", true}, "", NullString{"darkred", true}},
-		{NullString{"eel", false}, "", NullString{"", false}},
-		{"foo", NullString{"black", false}, nil},
-	}}
-	nullTestRun(t, spec)
-}
-
-func TestNullInt64Param(t *testing.T) {
-	spec := nullTestSpec{"nullint64", "int64", [6]nullTestRow{
-		{NullInt64{31, true}, 1, NullInt64{31, true}},
-		{NullInt64{-22, false}, 1, NullInt64{0, false}},
-		{22, 1, NullInt64{22, true}},
-		{NullInt64{33, true}, 1, NullInt64{33, true}},
-		{NullInt64{222, false}, 1, NullInt64{0, false}},
-		{0, NullInt64{31, false}, nil},
-	}}
-	nullTestRun(t, spec)
-}
-
-func TestNullFloat64Param(t *testing.T) {
-	spec := nullTestSpec{"nullfloat64", "float64", [6]nullTestRow{
-		{NullFloat64{31.2, true}, 1, NullFloat64{31.2, true}},
-		{NullFloat64{13.1, false}, 1, NullFloat64{0, false}},
-		{-22.9, 1, NullFloat64{-22.9, true}},
-		{NullFloat64{33.81, true}, 1, NullFloat64{33.81, true}},
-		{NullFloat64{222, false}, 1, NullFloat64{0, false}},
-		{10, NullFloat64{31.2, false}, nil},
-	}}
-	nullTestRun(t, spec)
-}
-
-func TestNullBoolParam(t *testing.T) {
-	spec := nullTestSpec{"nullbool", "bool", [6]nullTestRow{
-		{NullBool{false, true}, true, NullBool{false, true}},
-		{NullBool{true, false}, false, NullBool{false, false}},
-		{true, true, NullBool{true, true}},
-		{NullBool{true, true}, false, NullBool{true, true}},
-		{NullBool{true, false}, true, NullBool{false, false}},
-		{true, NullBool{true, false}, nil},
-	}}
-	nullTestRun(t, spec)
-}
-
-func nullTestRun(t *testing.T, spec nullTestSpec) {
-	db := newTestDB(t, "")
-	defer closeDB(t, db)
-	exec(t, db, fmt.Sprintf("CREATE|t|id=int32,name=string,nullf=%s,notnullf=%s", spec.nullType, spec.notNullType))
-
-	// Inserts with db.Exec:
-	exec(t, db, "INSERT|t|id=?,name=?,nullf=?,notnullf=?", 1, "alice", spec.rows[0].nullParam, spec.rows[0].notNullParam)
-	exec(t, db, "INSERT|t|id=?,name=?,nullf=?,notnullf=?", 2, "bob", spec.rows[1].nullParam, spec.rows[1].notNullParam)
-
-	// Inserts with a prepared statement:
-	stmt, err := db.Prepare("INSERT|t|id=?,name=?,nullf=?,notnullf=?")
-	if err != nil {
-		t.Fatalf("prepare: %v", err)
-	}
-	defer stmt.Close()
-	if _, err := stmt.Exec(3, "chris", spec.rows[2].nullParam, spec.rows[2].notNullParam); err != nil {
-		t.Errorf("exec insert chris: %v", err)
-	}
-	if _, err := stmt.Exec(4, "dave", spec.rows[3].nullParam, spec.rows[3].notNullParam); err != nil {
-		t.Errorf("exec insert dave: %v", err)
-	}
-	if _, err := stmt.Exec(5, "eleanor", spec.rows[4].nullParam, spec.rows[4].notNullParam); err != nil {
-		t.Errorf("exec insert eleanor: %v", err)
-	}
-
-	// Can't put null val into non-null col
-	if _, err := stmt.Exec(6, "bob", spec.rows[5].nullParam, spec.rows[5].notNullParam); err == nil {
-		t.Errorf("expected error inserting nil val with prepared statement Exec")
-	}
-
-	_, err = db.Exec("INSERT|t|id=?,name=?,nullf=?", 999, nil, nil)
-	if err == nil {
-		// TODO: this test fails, but it's just because
-		// fakeConn implements the optional Execer interface,
-		// so arguably this is the correct behavior.  But
-		// maybe I should flesh out the fakeConn.Exec
-		// implementation so this properly fails.
-		// t.Errorf("expected error inserting nil name with Exec")
-	}
-
-	paramtype := reflect.TypeOf(spec.rows[0].nullParam)
-	bindVal := reflect.New(paramtype).Interface()
-
-	for i := 0; i < 5; i++ {
-		id := i + 1
-		if err := db.QueryRow("SELECT|t|nullf|id=?", id).Scan(bindVal); err != nil {
-			t.Errorf("id=%d Scan: %v", id, err)
-		}
-		bindValDeref := reflect.ValueOf(bindVal).Elem().Interface()
-		if !reflect.DeepEqual(bindValDeref, spec.rows[i].scanNullVal) {
-			t.Errorf("id=%d got %#v, want %#v", id, bindValDeref, spec.rows[i].scanNullVal)
-		}
-	}
-}
-
-// golang.org/issue/4859
-func TestQueryRowNilScanDest(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-	var name *string // nil pointer
-	err := db.QueryRow("SELECT|people|name|").Scan(name)
-	want := "sql: Scan error on column index 0: destination pointer is nil"
-	if err == nil || err.Error() != want {
-		t.Errorf("error = %q; want %q", err.Error(), want)
-	}
-}
-
-func TestIssue4902(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-
-	driver := db.driver.(*fakeDriver)
-	opens0 := driver.openCount
-
-	var stmt *Stmt
-	var err error
-	for i := 0; i < 10; i++ {
-		stmt, err = db.Prepare("SELECT|people|name|")
-		if err != nil {
-			t.Fatal(err)
-		}
-		err = stmt.Close()
-		if err != nil {
-			t.Fatal(err)
-		}
-	}
-
-	opens := driver.openCount - opens0
-	if opens > 1 {
-		t.Errorf("opens = %d; want <= 1", opens)
-		t.Logf("db = %#v", db)
-		t.Logf("driver = %#v", driver)
-		t.Logf("stmt = %#v", stmt)
-	}
-}
-
-// Issue 3857
-// This used to deadlock.
-func TestSimultaneousQueries(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-
-	tx, err := db.Begin()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer tx.Rollback()
-
-	r1, err := tx.Query("SELECT|people|name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer r1.Close()
-
-	r2, err := tx.Query("SELECT|people|name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer r2.Close()
-}
-
-func TestMaxIdleConns(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-
-	tx, err := db.Begin()
-	if err != nil {
-		t.Fatal(err)
-	}
-	tx.Commit()
-	if got := len(db.freeConn); got != 1 {
-		t.Errorf("freeConns = %d; want 1", got)
-	}
-
-	db.SetMaxIdleConns(0)
-
-	if got := len(db.freeConn); got != 0 {
-		t.Errorf("freeConns after set to zero = %d; want 0", got)
-	}
-
-	tx, err = db.Begin()
-	if err != nil {
-		t.Fatal(err)
-	}
-	tx.Commit()
-	if got := len(db.freeConn); got != 0 {
-		t.Errorf("freeConns = %d; want 0", got)
-	}
-}
-
-func TestMaxOpenConns(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in short mode")
-	}
-	defer setHookpostCloseConn(nil)
-	setHookpostCloseConn(func(_ *fakeConn, err error) {
-		if err != nil {
-			t.Errorf("Error closing fakeConn: %v", err)
-		}
-	})
-
-	db := newTestDB(t, "magicquery")
-	defer closeDB(t, db)
-
-	driver := db.driver.(*fakeDriver)
-
-	// Force the number of open connections to 0 so we can get an accurate
-	// count for the test
-	db.SetMaxIdleConns(0)
-
-	if g, w := db.numFreeConns(), 0; g != w {
-		t.Errorf("free conns = %d; want %d", g, w)
-	}
-
-	if n := db.numDepsPollUntil(0, time.Second); n > 0 {
-		t.Errorf("number of dependencies = %d; expected 0", n)
-		db.dumpDeps(t)
-	}
-
-	driver.mu.Lock()
-	opens0 := driver.openCount
-	closes0 := driver.closeCount
-	driver.mu.Unlock()
-
-	db.SetMaxIdleConns(10)
-	db.SetMaxOpenConns(10)
-
-	stmt, err := db.Prepare("SELECT|magicquery|op|op=?,millis=?")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// Start 50 parallel slow queries.
-	const (
-		nquery      = 50
-		sleepMillis = 25
-		nbatch      = 2
-	)
-	var wg sync.WaitGroup
-	for batch := 0; batch < nbatch; batch++ {
-		for i := 0; i < nquery; i++ {
-			wg.Add(1)
-			go func() {
-				defer wg.Done()
-				var op string
-				if err := stmt.QueryRow("sleep", sleepMillis).Scan(&op); err != nil && err != ErrNoRows {
-					t.Error(err)
-				}
-			}()
-		}
-		// Sleep for twice the expected length of time for the
-		// batch of 50 queries above to finish before starting
-		// the next round.
-		time.Sleep(2 * sleepMillis * time.Millisecond)
-	}
-	wg.Wait()
-
-	if g, w := db.numFreeConns(), 10; g != w {
-		t.Errorf("free conns = %d; want %d", g, w)
-	}
-
-	if n := db.numDepsPollUntil(20, time.Second); n > 20 {
-		t.Errorf("number of dependencies = %d; expected <= 20", n)
-		db.dumpDeps(t)
-	}
-
-	driver.mu.Lock()
-	opens := driver.openCount - opens0
-	closes := driver.closeCount - closes0
-	driver.mu.Unlock()
-
-	if opens > 10 {
-		t.Logf("open calls = %d", opens)
-		t.Logf("close calls = %d", closes)
-		t.Errorf("db connections opened = %d; want <= 10", opens)
-		db.dumpDeps(t)
-	}
-
-	if err := stmt.Close(); err != nil {
-		t.Fatal(err)
-	}
-
-	if g, w := db.numFreeConns(), 10; g != w {
-		t.Errorf("free conns = %d; want %d", g, w)
-	}
-
-	if n := db.numDepsPollUntil(10, time.Second); n > 10 {
-		t.Errorf("number of dependencies = %d; expected <= 10", n)
-		db.dumpDeps(t)
-	}
-
-	db.SetMaxOpenConns(5)
-
-	if g, w := db.numFreeConns(), 5; g != w {
-		t.Errorf("free conns = %d; want %d", g, w)
-	}
-
-	if n := db.numDepsPollUntil(5, time.Second); n > 5 {
-		t.Errorf("number of dependencies = %d; expected 0", n)
-		db.dumpDeps(t)
-	}
-
-	db.SetMaxOpenConns(0)
-
-	if g, w := db.numFreeConns(), 5; g != w {
-		t.Errorf("free conns = %d; want %d", g, w)
-	}
-
-	if n := db.numDepsPollUntil(5, time.Second); n > 5 {
-		t.Errorf("number of dependencies = %d; expected 0", n)
-		db.dumpDeps(t)
-	}
-
-	db.SetMaxIdleConns(0)
-
-	if g, w := db.numFreeConns(), 0; g != w {
-		t.Errorf("free conns = %d; want %d", g, w)
-	}
-
-	if n := db.numDepsPollUntil(0, time.Second); n > 0 {
-		t.Errorf("number of dependencies = %d; expected 0", n)
-		db.dumpDeps(t)
-	}
-}
-
-// Issue 9453: tests that SetMaxOpenConns can be lowered at runtime
-// and affects the subsequent release of connections.
-func TestMaxOpenConnsOnBusy(t *testing.T) {
-	defer setHookpostCloseConn(nil)
-	setHookpostCloseConn(func(_ *fakeConn, err error) {
-		if err != nil {
-			t.Errorf("Error closing fakeConn: %v", err)
-		}
-	})
-
-	db := newTestDB(t, "magicquery")
-	defer closeDB(t, db)
-
-	db.SetMaxOpenConns(3)
-
-	conn0, err := db.conn(cachedOrNewConn)
-	if err != nil {
-		t.Fatalf("db open conn fail: %v", err)
-	}
-
-	conn1, err := db.conn(cachedOrNewConn)
-	if err != nil {
-		t.Fatalf("db open conn fail: %v", err)
-	}
-
-	conn2, err := db.conn(cachedOrNewConn)
-	if err != nil {
-		t.Fatalf("db open conn fail: %v", err)
-	}
-
-	if g, w := db.numOpen, 3; g != w {
-		t.Errorf("free conns = %d; want %d", g, w)
-	}
-
-	db.SetMaxOpenConns(2)
-	if g, w := db.numOpen, 3; g != w {
-		t.Errorf("free conns = %d; want %d", g, w)
-	}
-
-	conn0.releaseConn(nil)
-	conn1.releaseConn(nil)
-	if g, w := db.numOpen, 2; g != w {
-		t.Errorf("free conns = %d; want %d", g, w)
-	}
-
-	conn2.releaseConn(nil)
-	if g, w := db.numOpen, 2; g != w {
-		t.Errorf("free conns = %d; want %d", g, w)
-	}
-}
-
-func TestSingleOpenConn(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-
-	db.SetMaxOpenConns(1)
-
-	rows, err := db.Query("SELECT|people|name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err = rows.Close(); err != nil {
-		t.Fatal(err)
-	}
-	// shouldn't deadlock
-	rows, err = db.Query("SELECT|people|name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err = rows.Close(); err != nil {
-		t.Fatal(err)
-	}
-}
-
-func TestStats(t *testing.T) {
-	db := newTestDB(t, "people")
-	stats := db.Stats()
-	if got := stats.OpenConnections; got != 1 {
-		t.Errorf("stats.OpenConnections = %d; want 1", got)
-	}
-
-	tx, err := db.Begin()
-	if err != nil {
-		t.Fatal(err)
-	}
-	tx.Commit()
-
-	closeDB(t, db)
-	stats = db.Stats()
-	if got := stats.OpenConnections; got != 0 {
-		t.Errorf("stats.OpenConnections = %d; want 0", got)
-	}
-}
-
-// golang.org/issue/5323
-func TestStmtCloseDeps(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in short mode")
-	}
-	defer setHookpostCloseConn(nil)
-	setHookpostCloseConn(func(_ *fakeConn, err error) {
-		if err != nil {
-			t.Errorf("Error closing fakeConn: %v", err)
-		}
-	})
-
-	db := newTestDB(t, "magicquery")
-	defer closeDB(t, db)
-
-	driver := db.driver.(*fakeDriver)
-
-	driver.mu.Lock()
-	opens0 := driver.openCount
-	closes0 := driver.closeCount
-	driver.mu.Unlock()
-	openDelta0 := opens0 - closes0
-
-	stmt, err := db.Prepare("SELECT|magicquery|op|op=?,millis=?")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// Start 50 parallel slow queries.
-	const (
-		nquery      = 50
-		sleepMillis = 25
-		nbatch      = 2
-	)
-	var wg sync.WaitGroup
-	for batch := 0; batch < nbatch; batch++ {
-		for i := 0; i < nquery; i++ {
-			wg.Add(1)
-			go func() {
-				defer wg.Done()
-				var op string
-				if err := stmt.QueryRow("sleep", sleepMillis).Scan(&op); err != nil && err != ErrNoRows {
-					t.Error(err)
-				}
-			}()
-		}
-		// Sleep for twice the expected length of time for the
-		// batch of 50 queries above to finish before starting
-		// the next round.
-		time.Sleep(2 * sleepMillis * time.Millisecond)
-	}
-	wg.Wait()
-
-	if g, w := db.numFreeConns(), 2; g != w {
-		t.Errorf("free conns = %d; want %d", g, w)
-	}
-
-	if n := db.numDepsPollUntil(4, time.Second); n > 4 {
-		t.Errorf("number of dependencies = %d; expected <= 4", n)
-		db.dumpDeps(t)
-	}
-
-	driver.mu.Lock()
-	opens := driver.openCount - opens0
-	closes := driver.closeCount - closes0
-	openDelta := (driver.openCount - driver.closeCount) - openDelta0
-	driver.mu.Unlock()
-
-	if openDelta > 2 {
-		t.Logf("open calls = %d", opens)
-		t.Logf("close calls = %d", closes)
-		t.Logf("open delta = %d", openDelta)
-		t.Errorf("db connections opened = %d; want <= 2", openDelta)
-		db.dumpDeps(t)
-	}
-
-	if len(stmt.css) > nquery {
-		t.Errorf("len(stmt.css) = %d; want <= %d", len(stmt.css), nquery)
-	}
-
-	if err := stmt.Close(); err != nil {
-		t.Fatal(err)
-	}
-
-	if g, w := db.numFreeConns(), 2; g != w {
-		t.Errorf("free conns = %d; want %d", g, w)
-	}
-
-	if n := db.numDepsPollUntil(2, time.Second); n > 2 {
-		t.Errorf("number of dependencies = %d; expected <= 2", n)
-		db.dumpDeps(t)
-	}
-
-	db.SetMaxIdleConns(0)
-
-	if g, w := db.numFreeConns(), 0; g != w {
-		t.Errorf("free conns = %d; want %d", g, w)
-	}
-
-	if n := db.numDepsPollUntil(0, time.Second); n > 0 {
-		t.Errorf("number of dependencies = %d; expected 0", n)
-		db.dumpDeps(t)
-	}
-}
-
-// golang.org/issue/5046
-func TestCloseConnBeforeStmts(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-
-	defer setHookpostCloseConn(nil)
-	setHookpostCloseConn(func(_ *fakeConn, err error) {
-		if err != nil {
-			t.Errorf("Error closing fakeConn: %v; from %s", err, stack())
-			db.dumpDeps(t)
-			t.Errorf("DB = %#v", db)
-		}
-	})
-
-	stmt, err := db.Prepare("SELECT|people|name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	if len(db.freeConn) != 1 {
-		t.Fatalf("expected 1 freeConn; got %d", len(db.freeConn))
-	}
-	dc := db.freeConn[0]
-	if dc.closed {
-		t.Errorf("conn shouldn't be closed")
-	}
-
-	if n := len(dc.openStmt); n != 1 {
-		t.Errorf("driverConn num openStmt = %d; want 1", n)
-	}
-	err = db.Close()
-	if err != nil {
-		t.Errorf("db Close = %v", err)
-	}
-	if !dc.closed {
-		t.Errorf("after db.Close, driverConn should be closed")
-	}
-	if n := len(dc.openStmt); n != 0 {
-		t.Errorf("driverConn num openStmt = %d; want 0", n)
-	}
-
-	err = stmt.Close()
-	if err != nil {
-		t.Errorf("Stmt close = %v", err)
-	}
-
-	if !dc.closed {
-		t.Errorf("conn should be closed")
-	}
-	if dc.ci != nil {
-		t.Errorf("after Stmt Close, driverConn's Conn interface should be nil")
-	}
-}
-
-// golang.org/issue/5283: don't release the Rows' connection in Close
-// before calling Stmt.Close.
-func TestRowsCloseOrder(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-
-	db.SetMaxIdleConns(0)
-	setStrictFakeConnClose(t)
-	defer setStrictFakeConnClose(nil)
-
-	rows, err := db.Query("SELECT|people|age,name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-	err = rows.Close()
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func TestRowsImplicitClose(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-
-	rows, err := db.Query("SELECT|people|age,name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	want, fail := 2, errors.New("fail")
-	r := rows.rowsi.(*rowsCursor)
-	r.errPos, r.err = want, fail
-
-	got := 0
-	for rows.Next() {
-		got++
-	}
-	if got != want {
-		t.Errorf("got %d rows, want %d", got, want)
-	}
-	if err := rows.Err(); err != fail {
-		t.Errorf("got error %v, want %v", err, fail)
-	}
-	if !r.closed {
-		t.Errorf("r.closed is false, want true")
-	}
-}
-
-func TestStmtCloseOrder(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-
-	db.SetMaxIdleConns(0)
-	setStrictFakeConnClose(t)
-	defer setStrictFakeConnClose(nil)
-
-	_, err := db.Query("SELECT|non_existent|name|")
-	if err == nil {
-		t.Fatal("Quering non-existent table should fail")
-	}
-}
-
-// Test cases where there's more than maxBadConnRetries bad connections in the
-// pool (issue 8834)
-func TestManyErrBadConn(t *testing.T) {
-	manyErrBadConnSetup := func() *DB {
-		db := newTestDB(t, "people")
-
-		nconn := maxBadConnRetries + 1
-		db.SetMaxIdleConns(nconn)
-		db.SetMaxOpenConns(nconn)
-		// open enough connections
-		func() {
-			for i := 0; i < nconn; i++ {
-				rows, err := db.Query("SELECT|people|age,name|")
-				if err != nil {
-					t.Fatal(err)
-				}
-				defer rows.Close()
-			}
-		}()
-
-		if db.numOpen != nconn {
-			t.Fatalf("unexpected numOpen %d (was expecting %d)", db.numOpen, nconn)
-		} else if len(db.freeConn) != nconn {
-			t.Fatalf("unexpected len(db.freeConn) %d (was expecting %d)", len(db.freeConn), nconn)
-		}
-		for _, conn := range db.freeConn {
-			conn.ci.(*fakeConn).stickyBad = true
-		}
-		return db
-	}
-
-	// Query
-	db := manyErrBadConnSetup()
-	defer closeDB(t, db)
-	rows, err := db.Query("SELECT|people|age,name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err = rows.Close(); err != nil {
-		t.Fatal(err)
-	}
-
-	// Exec
-	db = manyErrBadConnSetup()
-	defer closeDB(t, db)
-	_, err = db.Exec("INSERT|people|name=Julia,age=19")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// Begin
-	db = manyErrBadConnSetup()
-	defer closeDB(t, db)
-	tx, err := db.Begin()
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err = tx.Rollback(); err != nil {
-		t.Fatal(err)
-	}
-
-	// Prepare
-	db = manyErrBadConnSetup()
-	defer closeDB(t, db)
-	stmt, err := db.Prepare("SELECT|people|age,name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err = stmt.Close(); err != nil {
-		t.Fatal(err)
-	}
-}
-
-// golang.org/issue/5718
-func TestErrBadConnReconnect(t *testing.T) {
-	db := newTestDB(t, "foo")
-	defer closeDB(t, db)
-	exec(t, db, "CREATE|t1|name=string,age=int32,dead=bool")
-
-	simulateBadConn := func(name string, hook *func() bool, op func() error) {
-		broken, retried := false, false
-		numOpen := db.numOpen
-
-		// simulate a broken connection on the first try
-		*hook = func() bool {
-			if !broken {
-				broken = true
-				return true
-			}
-			retried = true
-			return false
-		}
-
-		if err := op(); err != nil {
-			t.Errorf(name+": %v", err)
-			return
-		}
-
-		if !broken || !retried {
-			t.Error(name + ": Failed to simulate broken connection")
-		}
-		*hook = nil
-
-		if numOpen != db.numOpen {
-			t.Errorf(name+": leaked %d connection(s)!", db.numOpen-numOpen)
-			numOpen = db.numOpen
-		}
-	}
-
-	// db.Exec
-	dbExec := func() error {
-		_, err := db.Exec("INSERT|t1|name=?,age=?,dead=?", "Gordon", 3, true)
-		return err
-	}
-	simulateBadConn("db.Exec prepare", &hookPrepareBadConn, dbExec)
-	simulateBadConn("db.Exec exec", &hookExecBadConn, dbExec)
-
-	// db.Query
-	dbQuery := func() error {
-		rows, err := db.Query("SELECT|t1|age,name|")
-		if err == nil {
-			err = rows.Close()
-		}
-		return err
-	}
-	simulateBadConn("db.Query prepare", &hookPrepareBadConn, dbQuery)
-	simulateBadConn("db.Query query", &hookQueryBadConn, dbQuery)
-
-	// db.Prepare
-	simulateBadConn("db.Prepare", &hookPrepareBadConn, func() error {
-		stmt, err := db.Prepare("INSERT|t1|name=?,age=?,dead=?")
-		if err != nil {
-			return err
-		}
-		stmt.Close()
-		return nil
-	})
-
-	// Provide a way to force a re-prepare of a statement on next execution
-	forcePrepare := func(stmt *Stmt) {
-		stmt.css = nil
-	}
-
-	// stmt.Exec
-	stmt1, err := db.Prepare("INSERT|t1|name=?,age=?,dead=?")
-	if err != nil {
-		t.Fatalf("prepare: %v", err)
-	}
-	defer stmt1.Close()
-	// make sure we must prepare the stmt first
-	forcePrepare(stmt1)
-
-	stmtExec := func() error {
-		_, err := stmt1.Exec("Gopher", 3, false)
-		return err
-	}
-	simulateBadConn("stmt.Exec prepare", &hookPrepareBadConn, stmtExec)
-	simulateBadConn("stmt.Exec exec", &hookExecBadConn, stmtExec)
-
-	// stmt.Query
-	stmt2, err := db.Prepare("SELECT|t1|age,name|")
-	if err != nil {
-		t.Fatalf("prepare: %v", err)
-	}
-	defer stmt2.Close()
-	// make sure we must prepare the stmt first
-	forcePrepare(stmt2)
-
-	stmtQuery := func() error {
-		rows, err := stmt2.Query()
-		if err == nil {
-			err = rows.Close()
-		}
-		return err
-	}
-	simulateBadConn("stmt.Query prepare", &hookPrepareBadConn, stmtQuery)
-	simulateBadConn("stmt.Query exec", &hookQueryBadConn, stmtQuery)
-}
-
-type concurrentTest interface {
-	init(t testing.TB, db *DB)
-	finish(t testing.TB)
-	test(t testing.TB) error
-}
-
-type concurrentDBQueryTest struct {
-	db *DB
-}
-
-func (c *concurrentDBQueryTest) init(t testing.TB, db *DB) {
-	c.db = db
-}
-
-func (c *concurrentDBQueryTest) finish(t testing.TB) {
-	c.db = nil
-}
-
-func (c *concurrentDBQueryTest) test(t testing.TB) error {
-	rows, err := c.db.Query("SELECT|people|name|")
-	if err != nil {
-		t.Error(err)
-		return err
-	}
-	var name string
-	for rows.Next() {
-		rows.Scan(&name)
-	}
-	rows.Close()
-	return nil
-}
-
-type concurrentDBExecTest struct {
-	db *DB
-}
-
-func (c *concurrentDBExecTest) init(t testing.TB, db *DB) {
-	c.db = db
-}
-
-func (c *concurrentDBExecTest) finish(t testing.TB) {
-	c.db = nil
-}
-
-func (c *concurrentDBExecTest) test(t testing.TB) error {
-	_, err := c.db.Exec("NOSERT|people|name=Chris,age=?,photo=CPHOTO,bdate=?", 3, chrisBirthday)
-	if err != nil {
-		t.Error(err)
-		return err
-	}
-	return nil
-}
-
-type concurrentStmtQueryTest struct {
-	db   *DB
-	stmt *Stmt
-}
-
-func (c *concurrentStmtQueryTest) init(t testing.TB, db *DB) {
-	c.db = db
-	var err error
-	c.stmt, err = db.Prepare("SELECT|people|name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func (c *concurrentStmtQueryTest) finish(t testing.TB) {
-	if c.stmt != nil {
-		c.stmt.Close()
-		c.stmt = nil
-	}
-	c.db = nil
-}
-
-func (c *concurrentStmtQueryTest) test(t testing.TB) error {
-	rows, err := c.stmt.Query()
-	if err != nil {
-		t.Errorf("error on query:  %v", err)
-		return err
-	}
-
-	var name string
-	for rows.Next() {
-		rows.Scan(&name)
-	}
-	rows.Close()
-	return nil
-}
-
-type concurrentStmtExecTest struct {
-	db   *DB
-	stmt *Stmt
-}
-
-func (c *concurrentStmtExecTest) init(t testing.TB, db *DB) {
-	c.db = db
-	var err error
-	c.stmt, err = db.Prepare("NOSERT|people|name=Chris,age=?,photo=CPHOTO,bdate=?")
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func (c *concurrentStmtExecTest) finish(t testing.TB) {
-	if c.stmt != nil {
-		c.stmt.Close()
-		c.stmt = nil
-	}
-	c.db = nil
-}
-
-func (c *concurrentStmtExecTest) test(t testing.TB) error {
-	_, err := c.stmt.Exec(3, chrisBirthday)
-	if err != nil {
-		t.Errorf("error on exec:  %v", err)
-		return err
-	}
-	return nil
-}
-
-type concurrentTxQueryTest struct {
-	db *DB
-	tx *Tx
-}
-
-func (c *concurrentTxQueryTest) init(t testing.TB, db *DB) {
-	c.db = db
-	var err error
-	c.tx, err = c.db.Begin()
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func (c *concurrentTxQueryTest) finish(t testing.TB) {
-	if c.tx != nil {
-		c.tx.Rollback()
-		c.tx = nil
-	}
-	c.db = nil
-}
-
-func (c *concurrentTxQueryTest) test(t testing.TB) error {
-	rows, err := c.db.Query("SELECT|people|name|")
-	if err != nil {
-		t.Error(err)
-		return err
-	}
-	var name string
-	for rows.Next() {
-		rows.Scan(&name)
-	}
-	rows.Close()
-	return nil
-}
-
-type concurrentTxExecTest struct {
-	db *DB
-	tx *Tx
-}
-
-func (c *concurrentTxExecTest) init(t testing.TB, db *DB) {
-	c.db = db
-	var err error
-	c.tx, err = c.db.Begin()
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func (c *concurrentTxExecTest) finish(t testing.TB) {
-	if c.tx != nil {
-		c.tx.Rollback()
-		c.tx = nil
-	}
-	c.db = nil
-}
-
-func (c *concurrentTxExecTest) test(t testing.TB) error {
-	_, err := c.tx.Exec("NOSERT|people|name=Chris,age=?,photo=CPHOTO,bdate=?", 3, chrisBirthday)
-	if err != nil {
-		t.Error(err)
-		return err
-	}
-	return nil
-}
-
-type concurrentTxStmtQueryTest struct {
-	db   *DB
-	tx   *Tx
-	stmt *Stmt
-}
-
-func (c *concurrentTxStmtQueryTest) init(t testing.TB, db *DB) {
-	c.db = db
-	var err error
-	c.tx, err = c.db.Begin()
-	if err != nil {
-		t.Fatal(err)
-	}
-	c.stmt, err = c.tx.Prepare("SELECT|people|name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func (c *concurrentTxStmtQueryTest) finish(t testing.TB) {
-	if c.stmt != nil {
-		c.stmt.Close()
-		c.stmt = nil
-	}
-	if c.tx != nil {
-		c.tx.Rollback()
-		c.tx = nil
-	}
-	c.db = nil
-}
-
-func (c *concurrentTxStmtQueryTest) test(t testing.TB) error {
-	rows, err := c.stmt.Query()
-	if err != nil {
-		t.Errorf("error on query:  %v", err)
-		return err
-	}
-
-	var name string
-	for rows.Next() {
-		rows.Scan(&name)
-	}
-	rows.Close()
-	return nil
-}
-
-type concurrentTxStmtExecTest struct {
-	db   *DB
-	tx   *Tx
-	stmt *Stmt
-}
-
-func (c *concurrentTxStmtExecTest) init(t testing.TB, db *DB) {
-	c.db = db
-	var err error
-	c.tx, err = c.db.Begin()
-	if err != nil {
-		t.Fatal(err)
-	}
-	c.stmt, err = c.tx.Prepare("NOSERT|people|name=Chris,age=?,photo=CPHOTO,bdate=?")
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func (c *concurrentTxStmtExecTest) finish(t testing.TB) {
-	if c.stmt != nil {
-		c.stmt.Close()
-		c.stmt = nil
-	}
-	if c.tx != nil {
-		c.tx.Rollback()
-		c.tx = nil
-	}
-	c.db = nil
-}
-
-func (c *concurrentTxStmtExecTest) test(t testing.TB) error {
-	_, err := c.stmt.Exec(3, chrisBirthday)
-	if err != nil {
-		t.Errorf("error on exec:  %v", err)
-		return err
-	}
-	return nil
-}
-
-type concurrentRandomTest struct {
-	tests []concurrentTest
-}
-
-func (c *concurrentRandomTest) init(t testing.TB, db *DB) {
-	c.tests = []concurrentTest{
-		new(concurrentDBQueryTest),
-		new(concurrentDBExecTest),
-		new(concurrentStmtQueryTest),
-		new(concurrentStmtExecTest),
-		new(concurrentTxQueryTest),
-		new(concurrentTxExecTest),
-		new(concurrentTxStmtQueryTest),
-		new(concurrentTxStmtExecTest),
-	}
-	for _, ct := range c.tests {
-		ct.init(t, db)
-	}
-}
-
-func (c *concurrentRandomTest) finish(t testing.TB) {
-	for _, ct := range c.tests {
-		ct.finish(t)
-	}
-}
-
-func (c *concurrentRandomTest) test(t testing.TB) error {
-	ct := c.tests[rand.Intn(len(c.tests))]
-	return ct.test(t)
-}
-
-func doConcurrentTest(t testing.TB, ct concurrentTest) {
-	maxProcs, numReqs := 1, 500
-	if testing.Short() {
-		maxProcs, numReqs = 4, 50
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(maxProcs))
-
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-
-	ct.init(t, db)
-	defer ct.finish(t)
-
-	var wg sync.WaitGroup
-	wg.Add(numReqs)
-
-	reqs := make(chan bool)
-	defer close(reqs)
-
-	for i := 0; i < maxProcs*2; i++ {
-		go func() {
-			for range reqs {
-				err := ct.test(t)
-				if err != nil {
-					wg.Done()
-					continue
-				}
-				wg.Done()
-			}
-		}()
-	}
-
-	for i := 0; i < numReqs; i++ {
-		reqs <- true
-	}
-
-	wg.Wait()
-}
-
-func TestIssue6081(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-
-	drv := db.driver.(*fakeDriver)
-	drv.mu.Lock()
-	opens0 := drv.openCount
-	closes0 := drv.closeCount
-	drv.mu.Unlock()
-
-	stmt, err := db.Prepare("SELECT|people|name|")
-	if err != nil {
-		t.Fatal(err)
-	}
-	rowsCloseHook = func(rows *Rows, err *error) {
-		*err = driver.ErrBadConn
-	}
-	defer func() { rowsCloseHook = nil }()
-	for i := 0; i < 10; i++ {
-		rows, err := stmt.Query()
-		if err != nil {
-			t.Fatal(err)
-		}
-		rows.Close()
-	}
-	if n := len(stmt.css); n > 1 {
-		t.Errorf("len(css slice) = %d; want <= 1", n)
-	}
-	stmt.Close()
-	if n := len(stmt.css); n != 0 {
-		t.Errorf("len(css slice) after Close = %d; want 0", n)
-	}
-
-	drv.mu.Lock()
-	opens := drv.openCount - opens0
-	closes := drv.closeCount - closes0
-	drv.mu.Unlock()
-	if opens < 9 {
-		t.Errorf("opens = %d; want >= 9", opens)
-	}
-	if closes < 9 {
-		t.Errorf("closes = %d; want >= 9", closes)
-	}
-}
-
-func TestConcurrency(t *testing.T) {
-	doConcurrentTest(t, new(concurrentDBQueryTest))
-	doConcurrentTest(t, new(concurrentDBExecTest))
-	doConcurrentTest(t, new(concurrentStmtQueryTest))
-	doConcurrentTest(t, new(concurrentStmtExecTest))
-	doConcurrentTest(t, new(concurrentTxQueryTest))
-	doConcurrentTest(t, new(concurrentTxExecTest))
-	doConcurrentTest(t, new(concurrentTxStmtQueryTest))
-	doConcurrentTest(t, new(concurrentTxStmtExecTest))
-	doConcurrentTest(t, new(concurrentRandomTest))
-}
-
-func TestConnectionLeak(t *testing.T) {
-	db := newTestDB(t, "people")
-	defer closeDB(t, db)
-	// Start by opening defaultMaxIdleConns
-	rows := make([]*Rows, defaultMaxIdleConns)
-	// We need to SetMaxOpenConns > MaxIdleConns, so the DB can open
-	// a new connection and we can fill the idle queue with the released
-	// connections.
-	db.SetMaxOpenConns(len(rows) + 1)
-	for ii := range rows {
-		r, err := db.Query("SELECT|people|name|")
-		if err != nil {
-			t.Fatal(err)
-		}
-		r.Next()
-		if err := r.Err(); err != nil {
-			t.Fatal(err)
-		}
-		rows[ii] = r
-	}
-	// Now we have defaultMaxIdleConns busy connections. Open
-	// a new one, but wait until the busy connections are released
-	// before returning control to DB.
-	drv := db.driver.(*fakeDriver)
-	drv.waitCh = make(chan struct{}, 1)
-	drv.waitingCh = make(chan struct{}, 1)
-	var wg sync.WaitGroup
-	wg.Add(1)
-	go func() {
-		r, err := db.Query("SELECT|people|name|")
-		if err != nil {
-			t.Fatal(err)
-		}
-		r.Close()
-		wg.Done()
-	}()
-	// Wait until the goroutine we've just created has started waiting.
-	<-drv.waitingCh
-	// Now close the busy connections. This provides a connection for
-	// the blocked goroutine and then fills up the idle queue.
-	for _, v := range rows {
-		v.Close()
-	}
-	// At this point we give the new connection to DB. This connection is
-	// now useless, since the idle queue is full and there are no pending
-	// requests. DB should deal with this situation without leaking the
-	// connection.
-	drv.waitCh <- struct{}{}
-	wg.Wait()
-}
-
-func BenchmarkConcurrentDBExec(b *testing.B) {
-	b.ReportAllocs()
-	ct := new(concurrentDBExecTest)
-	for i := 0; i < b.N; i++ {
-		doConcurrentTest(b, ct)
-	}
-}
-
-func BenchmarkConcurrentStmtQuery(b *testing.B) {
-	b.ReportAllocs()
-	ct := new(concurrentStmtQueryTest)
-	for i := 0; i < b.N; i++ {
-		doConcurrentTest(b, ct)
-	}
-}
-
-func BenchmarkConcurrentStmtExec(b *testing.B) {
-	b.ReportAllocs()
-	ct := new(concurrentStmtExecTest)
-	for i := 0; i < b.N; i++ {
-		doConcurrentTest(b, ct)
-	}
-}
-
-func BenchmarkConcurrentTxQuery(b *testing.B) {
-	b.ReportAllocs()
-	ct := new(concurrentTxQueryTest)
-	for i := 0; i < b.N; i++ {
-		doConcurrentTest(b, ct)
-	}
-}
-
-func BenchmarkConcurrentTxExec(b *testing.B) {
-	b.ReportAllocs()
-	ct := new(concurrentTxExecTest)
-	for i := 0; i < b.N; i++ {
-		doConcurrentTest(b, ct)
-	}
-}
-
-func BenchmarkConcurrentTxStmtQuery(b *testing.B) {
-	b.ReportAllocs()
-	ct := new(concurrentTxStmtQueryTest)
-	for i := 0; i < b.N; i++ {
-		doConcurrentTest(b, ct)
-	}
-}
-
-func BenchmarkConcurrentTxStmtExec(b *testing.B) {
-	b.ReportAllocs()
-	ct := new(concurrentTxStmtExecTest)
-	for i := 0; i < b.N; i++ {
-		doConcurrentTest(b, ct)
-	}
-}
-
-func BenchmarkConcurrentRandom(b *testing.B) {
-	b.ReportAllocs()
-	ct := new(concurrentRandomTest)
-	for i := 0; i < b.N; i++ {
-		doConcurrentTest(b, ct)
-	}
-}
-
-func BenchmarkManyConcurrentQueries(b *testing.B) {
-	b.ReportAllocs()
-	// To see lock contention in Go 1.4, 16~ cores and 128~ goroutines are required.
-	const parallelism = 16
-
-	db := newTestDB(b, "magicquery")
-	defer closeDB(b, db)
-	db.SetMaxIdleConns(runtime.GOMAXPROCS(0) * parallelism)
-
-	stmt, err := db.Prepare("SELECT|magicquery|op|op=?,millis=?")
-	if err != nil {
-		b.Fatal(err)
-	}
-	defer stmt.Close()
-
-	b.SetParallelism(parallelism)
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			rows, err := stmt.Query("sleep", 1)
-			if err != nil {
-				b.Error(err)
-				return
-			}
-			rows.Close()
-		}
-	})
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/buf.go b/third_party/gofrontend/libgo/go/debug/dwarf/buf.go
deleted file mode 100644
index 2ade0bd..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/buf.go
+++ /dev/null
@@ -1,192 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Buffered reading and decoding of DWARF data streams.
-
-package dwarf
-
-import (
-	"encoding/binary"
-	"strconv"
-)
-
-// Data buffer being decoded.
-type buf struct {
-	dwarf  *Data
-	order  binary.ByteOrder
-	format dataFormat
-	name   string
-	off    Offset
-	data   []byte
-	err    error
-}
-
-// Data format, other than byte order.  This affects the handling of
-// certain field formats.
-type dataFormat interface {
-	// DWARF version number.  Zero means unknown.
-	version() int
-
-	// 64-bit DWARF format?
-	dwarf64() (dwarf64 bool, isKnown bool)
-
-	// Size of an address, in bytes.  Zero means unknown.
-	addrsize() int
-}
-
-// Some parts of DWARF have no data format, e.g., abbrevs.
-type unknownFormat struct{}
-
-func (u unknownFormat) version() int {
-	return 0
-}
-
-func (u unknownFormat) dwarf64() (bool, bool) {
-	return false, false
-}
-
-func (u unknownFormat) addrsize() int {
-	return 0
-}
-
-func makeBuf(d *Data, format dataFormat, name string, off Offset, data []byte) buf {
-	return buf{d, d.order, format, name, off, data, nil}
-}
-
-func (b *buf) uint8() uint8 {
-	if len(b.data) < 1 {
-		b.error("underflow")
-		return 0
-	}
-	val := b.data[0]
-	b.data = b.data[1:]
-	b.off++
-	return val
-}
-
-func (b *buf) bytes(n int) []byte {
-	if len(b.data) < n {
-		b.error("underflow")
-		return nil
-	}
-	data := b.data[0:n]
-	b.data = b.data[n:]
-	b.off += Offset(n)
-	return data
-}
-
-func (b *buf) skip(n int) { b.bytes(n) }
-
-func (b *buf) string() string {
-	for i := 0; i < len(b.data); i++ {
-		if b.data[i] == 0 {
-			s := string(b.data[0:i])
-			b.data = b.data[i+1:]
-			b.off += Offset(i + 1)
-			return s
-		}
-	}
-	b.error("underflow")
-	return ""
-}
-
-func (b *buf) uint16() uint16 {
-	a := b.bytes(2)
-	if a == nil {
-		return 0
-	}
-	return b.order.Uint16(a)
-}
-
-func (b *buf) uint32() uint32 {
-	a := b.bytes(4)
-	if a == nil {
-		return 0
-	}
-	return b.order.Uint32(a)
-}
-
-func (b *buf) uint64() uint64 {
-	a := b.bytes(8)
-	if a == nil {
-		return 0
-	}
-	return b.order.Uint64(a)
-}
-
-// Read a varint, which is 7 bits per byte, little endian.
-// the 0x80 bit means read another byte.
-func (b *buf) varint() (c uint64, bits uint) {
-	for i := 0; i < len(b.data); i++ {
-		byte := b.data[i]
-		c |= uint64(byte&0x7F) << bits
-		bits += 7
-		if byte&0x80 == 0 {
-			b.off += Offset(i + 1)
-			b.data = b.data[i+1:]
-			return c, bits
-		}
-	}
-	return 0, 0
-}
-
-// Unsigned int is just a varint.
-func (b *buf) uint() uint64 {
-	x, _ := b.varint()
-	return x
-}
-
-// Signed int is a sign-extended varint.
-func (b *buf) int() int64 {
-	ux, bits := b.varint()
-	x := int64(ux)
-	if x&(1<<(bits-1)) != 0 {
-		x |= -1 << bits
-	}
-	return x
-}
-
-// Address-sized uint.
-func (b *buf) addr() uint64 {
-	switch b.format.addrsize() {
-	case 1:
-		return uint64(b.uint8())
-	case 2:
-		return uint64(b.uint16())
-	case 4:
-		return uint64(b.uint32())
-	case 8:
-		return uint64(b.uint64())
-	}
-	b.error("unknown address size")
-	return 0
-}
-
-func (b *buf) unitLength() (length Offset, dwarf64 bool) {
-	length = Offset(b.uint32())
-	if length == 0xffffffff {
-		dwarf64 = true
-		length = Offset(b.uint64())
-	} else if length >= 0xfffffff0 {
-		b.error("unit length has reserved value")
-	}
-	return
-}
-
-func (b *buf) error(s string) {
-	if b.err == nil {
-		b.data = nil
-		b.err = DecodeError{b.name, b.off, s}
-	}
-}
-
-type DecodeError struct {
-	Name   string
-	Offset Offset
-	Err    string
-}
-
-func (e DecodeError) Error() string {
-	return "decoding dwarf section " + e.Name + " at offset 0x" + strconv.FormatInt(int64(e.Offset), 16) + ": " + e.Err
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/class_string.go b/third_party/gofrontend/libgo/go/debug/dwarf/class_string.go
deleted file mode 100644
index 0b1206b..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/class_string.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// generated by stringer -type=Class; DO NOT EDIT
-
-package dwarf
-
-import "fmt"
-
-const _Class_name = "ClassAddressClassBlockClassConstantClassExprLocClassFlagClassLinePtrClassLocListPtrClassMacPtrClassRangeListPtrClassReferenceClassReferenceSigClassStringClassReferenceAltClassStringAlt"
-
-var _Class_index = [...]uint8{0, 12, 22, 35, 47, 56, 68, 83, 94, 111, 125, 142, 153, 170, 184}
-
-func (i Class) String() string {
-	i -= 1
-	if i < 0 || i+1 >= Class(len(_Class_index)) {
-		return fmt.Sprintf("Class(%d)", i+1)
-	}
-	return _Class_name[_Class_index[i]:_Class_index[i+1]]
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/const.go b/third_party/gofrontend/libgo/go/debug/dwarf/const.go
deleted file mode 100644
index 2170db1..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/const.go
+++ /dev/null
@@ -1,482 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Constants
-
-package dwarf
-
-import "strconv"
-
-// An Attr identifies the attribute type in a DWARF Entry's Field.
-type Attr uint32
-
-const (
-	AttrSibling        Attr = 0x01
-	AttrLocation       Attr = 0x02
-	AttrName           Attr = 0x03
-	AttrOrdering       Attr = 0x09
-	AttrByteSize       Attr = 0x0B
-	AttrBitOffset      Attr = 0x0C
-	AttrBitSize        Attr = 0x0D
-	AttrStmtList       Attr = 0x10
-	AttrLowpc          Attr = 0x11
-	AttrHighpc         Attr = 0x12
-	AttrLanguage       Attr = 0x13
-	AttrDiscr          Attr = 0x15
-	AttrDiscrValue     Attr = 0x16
-	AttrVisibility     Attr = 0x17
-	AttrImport         Attr = 0x18
-	AttrStringLength   Attr = 0x19
-	AttrCommonRef      Attr = 0x1A
-	AttrCompDir        Attr = 0x1B
-	AttrConstValue     Attr = 0x1C
-	AttrContainingType Attr = 0x1D
-	AttrDefaultValue   Attr = 0x1E
-	AttrInline         Attr = 0x20
-	AttrIsOptional     Attr = 0x21
-	AttrLowerBound     Attr = 0x22
-	AttrProducer       Attr = 0x25
-	AttrPrototyped     Attr = 0x27
-	AttrReturnAddr     Attr = 0x2A
-	AttrStartScope     Attr = 0x2C
-	AttrStrideSize     Attr = 0x2E
-	AttrUpperBound     Attr = 0x2F
-	AttrAbstractOrigin Attr = 0x31
-	AttrAccessibility  Attr = 0x32
-	AttrAddrClass      Attr = 0x33
-	AttrArtificial     Attr = 0x34
-	AttrBaseTypes      Attr = 0x35
-	AttrCalling        Attr = 0x36
-	AttrCount          Attr = 0x37
-	AttrDataMemberLoc  Attr = 0x38
-	AttrDeclColumn     Attr = 0x39
-	AttrDeclFile       Attr = 0x3A
-	AttrDeclLine       Attr = 0x3B
-	AttrDeclaration    Attr = 0x3C
-	AttrDiscrList      Attr = 0x3D
-	AttrEncoding       Attr = 0x3E
-	AttrExternal       Attr = 0x3F
-	AttrFrameBase      Attr = 0x40
-	AttrFriend         Attr = 0x41
-	AttrIdentifierCase Attr = 0x42
-	AttrMacroInfo      Attr = 0x43
-	AttrNamelistItem   Attr = 0x44
-	AttrPriority       Attr = 0x45
-	AttrSegment        Attr = 0x46
-	AttrSpecification  Attr = 0x47
-	AttrStaticLink     Attr = 0x48
-	AttrType           Attr = 0x49
-	AttrUseLocation    Attr = 0x4A
-	AttrVarParam       Attr = 0x4B
-	AttrVirtuality     Attr = 0x4C
-	AttrVtableElemLoc  Attr = 0x4D
-	AttrAllocated      Attr = 0x4E
-	AttrAssociated     Attr = 0x4F
-	AttrDataLocation   Attr = 0x50
-	AttrStride         Attr = 0x51
-	AttrEntrypc        Attr = 0x52
-	AttrUseUTF8        Attr = 0x53
-	AttrExtension      Attr = 0x54
-	AttrRanges         Attr = 0x55
-	AttrTrampoline     Attr = 0x56
-	AttrCallColumn     Attr = 0x57
-	AttrCallFile       Attr = 0x58
-	AttrCallLine       Attr = 0x59
-	AttrDescription    Attr = 0x5A
-)
-
-var attrNames = [...]string{
-	AttrSibling:        "Sibling",
-	AttrLocation:       "Location",
-	AttrName:           "Name",
-	AttrOrdering:       "Ordering",
-	AttrByteSize:       "ByteSize",
-	AttrBitOffset:      "BitOffset",
-	AttrBitSize:        "BitSize",
-	AttrStmtList:       "StmtList",
-	AttrLowpc:          "Lowpc",
-	AttrHighpc:         "Highpc",
-	AttrLanguage:       "Language",
-	AttrDiscr:          "Discr",
-	AttrDiscrValue:     "DiscrValue",
-	AttrVisibility:     "Visibility",
-	AttrImport:         "Import",
-	AttrStringLength:   "StringLength",
-	AttrCommonRef:      "CommonRef",
-	AttrCompDir:        "CompDir",
-	AttrConstValue:     "ConstValue",
-	AttrContainingType: "ContainingType",
-	AttrDefaultValue:   "DefaultValue",
-	AttrInline:         "Inline",
-	AttrIsOptional:     "IsOptional",
-	AttrLowerBound:     "LowerBound",
-	AttrProducer:       "Producer",
-	AttrPrototyped:     "Prototyped",
-	AttrReturnAddr:     "ReturnAddr",
-	AttrStartScope:     "StartScope",
-	AttrStrideSize:     "StrideSize",
-	AttrUpperBound:     "UpperBound",
-	AttrAbstractOrigin: "AbstractOrigin",
-	AttrAccessibility:  "Accessibility",
-	AttrAddrClass:      "AddrClass",
-	AttrArtificial:     "Artificial",
-	AttrBaseTypes:      "BaseTypes",
-	AttrCalling:        "Calling",
-	AttrCount:          "Count",
-	AttrDataMemberLoc:  "DataMemberLoc",
-	AttrDeclColumn:     "DeclColumn",
-	AttrDeclFile:       "DeclFile",
-	AttrDeclLine:       "DeclLine",
-	AttrDeclaration:    "Declaration",
-	AttrDiscrList:      "DiscrList",
-	AttrEncoding:       "Encoding",
-	AttrExternal:       "External",
-	AttrFrameBase:      "FrameBase",
-	AttrFriend:         "Friend",
-	AttrIdentifierCase: "IdentifierCase",
-	AttrMacroInfo:      "MacroInfo",
-	AttrNamelistItem:   "NamelistItem",
-	AttrPriority:       "Priority",
-	AttrSegment:        "Segment",
-	AttrSpecification:  "Specification",
-	AttrStaticLink:     "StaticLink",
-	AttrType:           "Type",
-	AttrUseLocation:    "UseLocation",
-	AttrVarParam:       "VarParam",
-	AttrVirtuality:     "Virtuality",
-	AttrVtableElemLoc:  "VtableElemLoc",
-	AttrAllocated:      "Allocated",
-	AttrAssociated:     "Associated",
-	AttrDataLocation:   "DataLocation",
-	AttrStride:         "Stride",
-	AttrEntrypc:        "Entrypc",
-	AttrUseUTF8:        "UseUTF8",
-	AttrExtension:      "Extension",
-	AttrRanges:         "Ranges",
-	AttrTrampoline:     "Trampoline",
-	AttrCallColumn:     "CallColumn",
-	AttrCallFile:       "CallFile",
-	AttrCallLine:       "CallLine",
-	AttrDescription:    "Description",
-}
-
-func (a Attr) String() string {
-	if int(a) < len(attrNames) {
-		s := attrNames[a]
-		if s != "" {
-			return s
-		}
-	}
-	return strconv.Itoa(int(a))
-}
-
-func (a Attr) GoString() string {
-	if int(a) < len(attrNames) {
-		s := attrNames[a]
-		if s != "" {
-			return "dwarf.Attr" + s
-		}
-	}
-	return "dwarf.Attr(" + strconv.FormatInt(int64(a), 10) + ")"
-}
-
-// A format is a DWARF data encoding format.
-type format uint32
-
-const (
-	// value formats
-	formAddr        format = 0x01
-	formDwarfBlock2 format = 0x03
-	formDwarfBlock4 format = 0x04
-	formData2       format = 0x05
-	formData4       format = 0x06
-	formData8       format = 0x07
-	formString      format = 0x08
-	formDwarfBlock  format = 0x09
-	formDwarfBlock1 format = 0x0A
-	formData1       format = 0x0B
-	formFlag        format = 0x0C
-	formSdata       format = 0x0D
-	formStrp        format = 0x0E
-	formUdata       format = 0x0F
-	formRefAddr     format = 0x10
-	formRef1        format = 0x11
-	formRef2        format = 0x12
-	formRef4        format = 0x13
-	formRef8        format = 0x14
-	formRefUdata    format = 0x15
-	formIndirect    format = 0x16
-	// The following are new in DWARF 4.
-	formSecOffset   format = 0x17
-	formExprloc     format = 0x18
-	formFlagPresent format = 0x19
-	formRefSig8     format = 0x20
-	// Extensions for multi-file compression (.dwz)
-	// http://www.dwarfstd.org/ShowIssue.php?issue=120604.1
-	formGnuRefAlt  format = 0x1f20
-	formGnuStrpAlt format = 0x1f21
-)
-
-// A Tag is the classification (the type) of an Entry.
-type Tag uint32
-
-const (
-	TagArrayType              Tag = 0x01
-	TagClassType              Tag = 0x02
-	TagEntryPoint             Tag = 0x03
-	TagEnumerationType        Tag = 0x04
-	TagFormalParameter        Tag = 0x05
-	TagImportedDeclaration    Tag = 0x08
-	TagLabel                  Tag = 0x0A
-	TagLexDwarfBlock          Tag = 0x0B
-	TagMember                 Tag = 0x0D
-	TagPointerType            Tag = 0x0F
-	TagReferenceType          Tag = 0x10
-	TagCompileUnit            Tag = 0x11
-	TagStringType             Tag = 0x12
-	TagStructType             Tag = 0x13
-	TagSubroutineType         Tag = 0x15
-	TagTypedef                Tag = 0x16
-	TagUnionType              Tag = 0x17
-	TagUnspecifiedParameters  Tag = 0x18
-	TagVariant                Tag = 0x19
-	TagCommonDwarfBlock       Tag = 0x1A
-	TagCommonInclusion        Tag = 0x1B
-	TagInheritance            Tag = 0x1C
-	TagInlinedSubroutine      Tag = 0x1D
-	TagModule                 Tag = 0x1E
-	TagPtrToMemberType        Tag = 0x1F
-	TagSetType                Tag = 0x20
-	TagSubrangeType           Tag = 0x21
-	TagWithStmt               Tag = 0x22
-	TagAccessDeclaration      Tag = 0x23
-	TagBaseType               Tag = 0x24
-	TagCatchDwarfBlock        Tag = 0x25
-	TagConstType              Tag = 0x26
-	TagConstant               Tag = 0x27
-	TagEnumerator             Tag = 0x28
-	TagFileType               Tag = 0x29
-	TagFriend                 Tag = 0x2A
-	TagNamelist               Tag = 0x2B
-	TagNamelistItem           Tag = 0x2C
-	TagPackedType             Tag = 0x2D
-	TagSubprogram             Tag = 0x2E
-	TagTemplateTypeParameter  Tag = 0x2F
-	TagTemplateValueParameter Tag = 0x30
-	TagThrownType             Tag = 0x31
-	TagTryDwarfBlock          Tag = 0x32
-	TagVariantPart            Tag = 0x33
-	TagVariable               Tag = 0x34
-	TagVolatileType           Tag = 0x35
-	// The following are new in DWARF 3.
-	TagDwarfProcedure  Tag = 0x36
-	TagRestrictType    Tag = 0x37
-	TagInterfaceType   Tag = 0x38
-	TagNamespace       Tag = 0x39
-	TagImportedModule  Tag = 0x3A
-	TagUnspecifiedType Tag = 0x3B
-	TagPartialUnit     Tag = 0x3C
-	TagImportedUnit    Tag = 0x3D
-	TagMutableType     Tag = 0x3E // Later removed from DWARF.
-	TagCondition       Tag = 0x3F
-	TagSharedType      Tag = 0x40
-	// The following are new in DWARF 4.
-	TagTypeUnit            Tag = 0x41
-	TagRvalueReferenceType Tag = 0x42
-	TagTemplateAlias       Tag = 0x43
-)
-
-var tagNames = [...]string{
-	TagArrayType:              "ArrayType",
-	TagClassType:              "ClassType",
-	TagEntryPoint:             "EntryPoint",
-	TagEnumerationType:        "EnumerationType",
-	TagFormalParameter:        "FormalParameter",
-	TagImportedDeclaration:    "ImportedDeclaration",
-	TagLabel:                  "Label",
-	TagLexDwarfBlock:          "LexDwarfBlock",
-	TagMember:                 "Member",
-	TagPointerType:            "PointerType",
-	TagReferenceType:          "ReferenceType",
-	TagCompileUnit:            "CompileUnit",
-	TagStringType:             "StringType",
-	TagStructType:             "StructType",
-	TagSubroutineType:         "SubroutineType",
-	TagTypedef:                "Typedef",
-	TagUnionType:              "UnionType",
-	TagUnspecifiedParameters:  "UnspecifiedParameters",
-	TagVariant:                "Variant",
-	TagCommonDwarfBlock:       "CommonDwarfBlock",
-	TagCommonInclusion:        "CommonInclusion",
-	TagInheritance:            "Inheritance",
-	TagInlinedSubroutine:      "InlinedSubroutine",
-	TagModule:                 "Module",
-	TagPtrToMemberType:        "PtrToMemberType",
-	TagSetType:                "SetType",
-	TagSubrangeType:           "SubrangeType",
-	TagWithStmt:               "WithStmt",
-	TagAccessDeclaration:      "AccessDeclaration",
-	TagBaseType:               "BaseType",
-	TagCatchDwarfBlock:        "CatchDwarfBlock",
-	TagConstType:              "ConstType",
-	TagConstant:               "Constant",
-	TagEnumerator:             "Enumerator",
-	TagFileType:               "FileType",
-	TagFriend:                 "Friend",
-	TagNamelist:               "Namelist",
-	TagNamelistItem:           "NamelistItem",
-	TagPackedType:             "PackedType",
-	TagSubprogram:             "Subprogram",
-	TagTemplateTypeParameter:  "TemplateTypeParameter",
-	TagTemplateValueParameter: "TemplateValueParameter",
-	TagThrownType:             "ThrownType",
-	TagTryDwarfBlock:          "TryDwarfBlock",
-	TagVariantPart:            "VariantPart",
-	TagVariable:               "Variable",
-	TagVolatileType:           "VolatileType",
-	TagDwarfProcedure:         "DwarfProcedure",
-	TagRestrictType:           "RestrictType",
-	TagInterfaceType:          "InterfaceType",
-	TagNamespace:              "Namespace",
-	TagImportedModule:         "ImportedModule",
-	TagUnspecifiedType:        "UnspecifiedType",
-	TagPartialUnit:            "PartialUnit",
-	TagImportedUnit:           "ImportedUnit",
-	TagMutableType:            "MutableType",
-	TagCondition:              "Condition",
-	TagSharedType:             "SharedType",
-	TagTypeUnit:               "TypeUnit",
-	TagRvalueReferenceType:    "RvalueReferenceType",
-	TagTemplateAlias:          "TemplateAlias",
-}
-
-func (t Tag) String() string {
-	if int(t) < len(tagNames) {
-		s := tagNames[t]
-		if s != "" {
-			return s
-		}
-	}
-	return strconv.Itoa(int(t))
-}
-
-func (t Tag) GoString() string {
-	if int(t) < len(tagNames) {
-		s := tagNames[t]
-		if s != "" {
-			return "dwarf.Tag" + s
-		}
-	}
-	return "dwarf.Tag(" + strconv.FormatInt(int64(t), 10) + ")"
-}
-
-// Location expression operators.
-// The debug info encodes value locations like 8(R3)
-// as a sequence of these op codes.
-// This package does not implement full expressions;
-// the opPlusUconst operator is expected by the type parser.
-const (
-	opAddr       = 0x03 /* 1 op, const addr */
-	opDeref      = 0x06
-	opConst1u    = 0x08 /* 1 op, 1 byte const */
-	opConst1s    = 0x09 /*	" signed */
-	opConst2u    = 0x0A /* 1 op, 2 byte const  */
-	opConst2s    = 0x0B /*	" signed */
-	opConst4u    = 0x0C /* 1 op, 4 byte const */
-	opConst4s    = 0x0D /*	" signed */
-	opConst8u    = 0x0E /* 1 op, 8 byte const */
-	opConst8s    = 0x0F /*	" signed */
-	opConstu     = 0x10 /* 1 op, LEB128 const */
-	opConsts     = 0x11 /*	" signed */
-	opDup        = 0x12
-	opDrop       = 0x13
-	opOver       = 0x14
-	opPick       = 0x15 /* 1 op, 1 byte stack index */
-	opSwap       = 0x16
-	opRot        = 0x17
-	opXderef     = 0x18
-	opAbs        = 0x19
-	opAnd        = 0x1A
-	opDiv        = 0x1B
-	opMinus      = 0x1C
-	opMod        = 0x1D
-	opMul        = 0x1E
-	opNeg        = 0x1F
-	opNot        = 0x20
-	opOr         = 0x21
-	opPlus       = 0x22
-	opPlusUconst = 0x23 /* 1 op, ULEB128 addend */
-	opShl        = 0x24
-	opShr        = 0x25
-	opShra       = 0x26
-	opXor        = 0x27
-	opSkip       = 0x2F /* 1 op, signed 2-byte constant */
-	opBra        = 0x28 /* 1 op, signed 2-byte constant */
-	opEq         = 0x29
-	opGe         = 0x2A
-	opGt         = 0x2B
-	opLe         = 0x2C
-	opLt         = 0x2D
-	opNe         = 0x2E
-	opLit0       = 0x30
-	/* OpLitN = OpLit0 + N for N = 0..31 */
-	opReg0 = 0x50
-	/* OpRegN = OpReg0 + N for N = 0..31 */
-	opBreg0 = 0x70 /* 1 op, signed LEB128 constant */
-	/* OpBregN = OpBreg0 + N for N = 0..31 */
-	opRegx       = 0x90 /* 1 op, ULEB128 register */
-	opFbreg      = 0x91 /* 1 op, SLEB128 offset */
-	opBregx      = 0x92 /* 2 op, ULEB128 reg; SLEB128 off */
-	opPiece      = 0x93 /* 1 op, ULEB128 size of piece */
-	opDerefSize  = 0x94 /* 1-byte size of data retrieved */
-	opXderefSize = 0x95 /* 1-byte size of data retrieved */
-	opNop        = 0x96
-	/* next four new in Dwarf v3 */
-	opPushObjAddr = 0x97
-	opCall2       = 0x98 /* 2-byte offset of DIE */
-	opCall4       = 0x99 /* 4-byte offset of DIE */
-	opCallRef     = 0x9A /* 4- or 8- byte offset of DIE */
-	/* 0xE0-0xFF reserved for user-specific */
-)
-
-// Basic type encodings -- the value for AttrEncoding in a TagBaseType Entry.
-const (
-	encAddress        = 0x01
-	encBoolean        = 0x02
-	encComplexFloat   = 0x03
-	encFloat          = 0x04
-	encSigned         = 0x05
-	encSignedChar     = 0x06
-	encUnsigned       = 0x07
-	encUnsignedChar   = 0x08
-	encImaginaryFloat = 0x09
-)
-
-// Statement program standard opcode encodings.
-const (
-	lnsCopy           = 1
-	lnsAdvancePC      = 2
-	lnsAdvanceLine    = 3
-	lnsSetFile        = 4
-	lnsSetColumn      = 5
-	lnsNegateStmt     = 6
-	lnsSetBasicBlock  = 7
-	lnsConstAddPC     = 8
-	lnsFixedAdvancePC = 9
-
-	// DWARF 3
-	lnsSetPrologueEnd   = 10
-	lnsSetEpilogueBegin = 11
-	lnsSetISA           = 12
-)
-
-// Statement program extended opcode encodings.
-const (
-	lneEndSequence = 1
-	lneSetAddress  = 2
-	lneDefineFile  = 3
-
-	// DWARF 4
-	lneSetDiscriminator = 4
-)
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/entry.go b/third_party/gofrontend/libgo/go/debug/dwarf/entry.go
deleted file mode 100644
index d607e5b..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/entry.go
+++ /dev/null
@@ -1,633 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// DWARF debug information entry parser.
-// An entry is a sequence of data items of a given format.
-// The first word in the entry is an index into what DWARF
-// calls the ``abbreviation table.''  An abbreviation is really
-// just a type descriptor: it's an array of attribute tag/value format pairs.
-
-package dwarf
-
-import (
-	"errors"
-	"strconv"
-)
-
-// a single entry's description: a sequence of attributes
-type abbrev struct {
-	tag      Tag
-	children bool
-	field    []afield
-}
-
-type afield struct {
-	attr  Attr
-	fmt   format
-	class Class
-}
-
-// a map from entry format ids to their descriptions
-type abbrevTable map[uint32]abbrev
-
-// ParseAbbrev returns the abbreviation table that starts at byte off
-// in the .debug_abbrev section.
-func (d *Data) parseAbbrev(off uint32, vers int) (abbrevTable, error) {
-	if m, ok := d.abbrevCache[off]; ok {
-		return m, nil
-	}
-
-	data := d.abbrev
-	if off > uint32(len(data)) {
-		data = nil
-	} else {
-		data = data[off:]
-	}
-	b := makeBuf(d, unknownFormat{}, "abbrev", 0, data)
-
-	// Error handling is simplified by the buf getters
-	// returning an endless stream of 0s after an error.
-	m := make(abbrevTable)
-	for {
-		// Table ends with id == 0.
-		id := uint32(b.uint())
-		if id == 0 {
-			break
-		}
-
-		// Walk over attributes, counting.
-		n := 0
-		b1 := b // Read from copy of b.
-		b1.uint()
-		b1.uint8()
-		for {
-			tag := b1.uint()
-			fmt := b1.uint()
-			if tag == 0 && fmt == 0 {
-				break
-			}
-			n++
-		}
-		if b1.err != nil {
-			return nil, b1.err
-		}
-
-		// Walk over attributes again, this time writing them down.
-		var a abbrev
-		a.tag = Tag(b.uint())
-		a.children = b.uint8() != 0
-		a.field = make([]afield, n)
-		for i := range a.field {
-			a.field[i].attr = Attr(b.uint())
-			a.field[i].fmt = format(b.uint())
-			a.field[i].class = formToClass(a.field[i].fmt, a.field[i].attr, vers, &b)
-		}
-		b.uint()
-		b.uint()
-
-		m[id] = a
-	}
-	if b.err != nil {
-		return nil, b.err
-	}
-	d.abbrevCache[off] = m
-	return m, nil
-}
-
-// attrIsExprloc indicates attributes that allow exprloc values that
-// are encoded as block values in DWARF 2 and 3. See DWARF 4, Figure
-// 20.
-var attrIsExprloc = map[Attr]bool{
-	AttrLocation:      true,
-	AttrByteSize:      true,
-	AttrBitOffset:     true,
-	AttrBitSize:       true,
-	AttrStringLength:  true,
-	AttrLowerBound:    true,
-	AttrReturnAddr:    true,
-	AttrStrideSize:    true,
-	AttrUpperBound:    true,
-	AttrCount:         true,
-	AttrDataMemberLoc: true,
-	AttrFrameBase:     true,
-	AttrSegment:       true,
-	AttrStaticLink:    true,
-	AttrUseLocation:   true,
-	AttrVtableElemLoc: true,
-	AttrAllocated:     true,
-	AttrAssociated:    true,
-	AttrDataLocation:  true,
-	AttrStride:        true,
-}
-
-// attrPtrClass indicates the *ptr class of attributes that have
-// encoding formSecOffset in DWARF 4 or formData* in DWARF 2 and 3.
-var attrPtrClass = map[Attr]Class{
-	AttrLocation:      ClassLocListPtr,
-	AttrStmtList:      ClassLinePtr,
-	AttrStringLength:  ClassLocListPtr,
-	AttrReturnAddr:    ClassLocListPtr,
-	AttrStartScope:    ClassRangeListPtr,
-	AttrDataMemberLoc: ClassLocListPtr,
-	AttrFrameBase:     ClassLocListPtr,
-	AttrMacroInfo:     ClassMacPtr,
-	AttrSegment:       ClassLocListPtr,
-	AttrStaticLink:    ClassLocListPtr,
-	AttrUseLocation:   ClassLocListPtr,
-	AttrVtableElemLoc: ClassLocListPtr,
-	AttrRanges:        ClassRangeListPtr,
-}
-
-// formToClass returns the DWARF 4 Class for the given form. If the
-// DWARF version is less then 4, it will disambiguate some forms
-// depending on the attribute.
-func formToClass(form format, attr Attr, vers int, b *buf) Class {
-	switch form {
-	default:
-		b.error("cannot determine class of unknown attribute form")
-		return 0
-
-	case formAddr:
-		return ClassAddress
-
-	case formDwarfBlock1, formDwarfBlock2, formDwarfBlock4, formDwarfBlock:
-		// In DWARF 2 and 3, ClassExprLoc was encoded as a
-		// block. DWARF 4 distinguishes ClassBlock and
-		// ClassExprLoc, but there are no attributes that can
-		// be both, so we also promote ClassBlock values in
-		// DWARF 4 that should be ClassExprLoc in case
-		// producers get this wrong.
-		if attrIsExprloc[attr] {
-			return ClassExprLoc
-		}
-		return ClassBlock
-
-	case formData1, formData2, formData4, formData8, formSdata, formUdata:
-		// In DWARF 2 and 3, ClassPtr was encoded as a
-		// constant. Unlike ClassExprLoc/ClassBlock, some
-		// DWARF 4 attributes need to distinguish Class*Ptr
-		// from ClassConstant, so we only do this promotion
-		// for versions 2 and 3.
-		if class, ok := attrPtrClass[attr]; vers < 4 && ok {
-			return class
-		}
-		return ClassConstant
-
-	case formFlag, formFlagPresent:
-		return ClassFlag
-
-	case formRefAddr, formRef1, formRef2, formRef4, formRef8, formRefUdata:
-		return ClassReference
-
-	case formRefSig8:
-		return ClassReferenceSig
-
-	case formString, formStrp:
-		return ClassString
-
-	case formSecOffset:
-		// DWARF 4 defines four *ptr classes, but doesn't
-		// distinguish them in the encoding. Disambiguate
-		// these classes using the attribute.
-		if class, ok := attrPtrClass[attr]; ok {
-			return class
-		}
-		b.error("cannot determine class of unknown attribute with formSecOffset")
-		return 0
-
-	case formExprloc:
-		return ClassExprLoc
-
-	case formGnuRefAlt:
-		return ClassReferenceAlt
-
-	case formGnuStrpAlt:
-		return ClassStringAlt
-	}
-}
-
-// An entry is a sequence of attribute/value pairs.
-type Entry struct {
-	Offset   Offset // offset of Entry in DWARF info
-	Tag      Tag    // tag (kind of Entry)
-	Children bool   // whether Entry is followed by children
-	Field    []Field
-}
-
-// A Field is a single attribute/value pair in an Entry.
-//
-// A value can be one of several "attribute classes" defined by DWARF.
-// The Go types corresponding to each class are:
-//
-//    DWARF class       Go type        Class
-//    -----------       -------        -----
-//    address           uint64         ClassAddress
-//    block             []byte         ClassBlock
-//    constant          int64          ClassConstant
-//    flag              bool           ClassFlag
-//    reference
-//      to info         dwarf.Offset   ClassReference
-//      to type unit    uint64         ClassReferenceSig
-//    string            string         ClassString
-//    exprloc           []byte         ClassExprLoc
-//    lineptr           int64          ClassLinePtr
-//    loclistptr        int64          ClassLocListPtr
-//    macptr            int64          ClassMacPtr
-//    rangelistptr      int64          ClassRangeListPtr
-type Field struct {
-	Attr  Attr
-	Val   interface{}
-	Class Class
-}
-
-// A Class is the DWARF 4 class of an attibute value.
-//
-// In general, a given attribute's value may take on one of several
-// possible classes defined by DWARF, each of which leads to a
-// slightly different interpretation of the attribute.
-//
-// DWARF version 4 distinguishes attribute value classes more finely
-// than previous versions of DWARF. The reader will disambiguate
-// coarser classes from earlier versions of DWARF into the appropriate
-// DWARF 4 class. For example, DWARF 2 uses "constant" for constants
-// as well as all types of section offsets, but the reader will
-// canonicalize attributes in DWARF 2 files that refer to section
-// offsets to one of the Class*Ptr classes, even though these classes
-// were only defined in DWARF 3.
-type Class int
-
-const (
-	// ClassAddress represents values of type uint64 that are
-	// addresses on the target machine.
-	ClassAddress Class = 1 + iota
-
-	// ClassBlock represents values of type []byte whose
-	// interpretation depends on the attribute.
-	ClassBlock
-
-	// ClassConstant represents values of type int64 that are
-	// constants. The interpretation of this constant depends on
-	// the attribute.
-	ClassConstant
-
-	// ClassExprLoc represents values of type []byte that contain
-	// an encoded DWARF expression or location description.
-	ClassExprLoc
-
-	// ClassFlag represents values of type bool.
-	ClassFlag
-
-	// ClassLinePtr represents values that are an int64 offset
-	// into the "line" section.
-	ClassLinePtr
-
-	// ClassLocListPtr represents values that are an int64 offset
-	// into the "loclist" section.
-	ClassLocListPtr
-
-	// ClassMacPtr represents values that are an int64 offset into
-	// the "mac" section.
-	ClassMacPtr
-
-	// ClassMacPtr represents values that are an int64 offset into
-	// the "rangelist" section.
-	ClassRangeListPtr
-
-	// ClassReference represents values that are an Offset offset
-	// of an Entry in the info section (for use with Reader.Seek).
-	// The DWARF specification combines ClassReference and
-	// ClassReferenceSig into class "reference".
-	ClassReference
-
-	// ClassReferenceSig represents values that are a uint64 type
-	// signature referencing a type Entry.
-	ClassReferenceSig
-
-	// ClassString represents values that are strings. If the
-	// compilation unit specifies the AttrUseUTF8 flag (strongly
-	// recommended), the string value will be encoded in UTF-8.
-	// Otherwise, the encoding is unspecified.
-	ClassString
-
-	// ClassReferenceAlt represents values of type int64 that are
-	// an offset into the DWARF "info" section of an alternate
-	// object file.
-	ClassReferenceAlt
-
-	// ClassStringAlt represents values of type int64 that are an
-	// offset into the DWARF string section of an alternate object
-	// file.
-	ClassStringAlt
-)
-
-//go:generate stringer -type=Class
-
-func (i Class) GoString() string {
-	return "dwarf." + i.String()
-}
-
-// Val returns the value associated with attribute Attr in Entry,
-// or nil if there is no such attribute.
-//
-// A common idiom is to merge the check for nil return with
-// the check that the value has the expected dynamic type, as in:
-//	v, ok := e.Val(AttrSibling).(int64)
-//
-func (e *Entry) Val(a Attr) interface{} {
-	if f := e.AttrField(a); f != nil {
-		return f.Val
-	}
-	return nil
-}
-
-// AttrField returns the Field associated with attribute Attr in
-// Entry, or nil if there is no such attribute.
-func (e *Entry) AttrField(a Attr) *Field {
-	for i, f := range e.Field {
-		if f.Attr == a {
-			return &e.Field[i]
-		}
-	}
-	return nil
-}
-
-// An Offset represents the location of an Entry within the DWARF info.
-// (See Reader.Seek.)
-type Offset uint32
-
-// Entry reads a single entry from buf, decoding
-// according to the given abbreviation table.
-func (b *buf) entry(atab abbrevTable, ubase Offset) *Entry {
-	off := b.off
-	id := uint32(b.uint())
-	if id == 0 {
-		return &Entry{}
-	}
-	a, ok := atab[id]
-	if !ok {
-		b.error("unknown abbreviation table index")
-		return nil
-	}
-	e := &Entry{
-		Offset:   off,
-		Tag:      a.tag,
-		Children: a.children,
-		Field:    make([]Field, len(a.field)),
-	}
-	for i := range e.Field {
-		e.Field[i].Attr = a.field[i].attr
-		e.Field[i].Class = a.field[i].class
-		fmt := a.field[i].fmt
-		if fmt == formIndirect {
-			fmt = format(b.uint())
-		}
-		var val interface{}
-		switch fmt {
-		default:
-			b.error("unknown entry attr format 0x" + strconv.FormatInt(int64(fmt), 16))
-
-		// address
-		case formAddr:
-			val = b.addr()
-
-		// block
-		case formDwarfBlock1:
-			val = b.bytes(int(b.uint8()))
-		case formDwarfBlock2:
-			val = b.bytes(int(b.uint16()))
-		case formDwarfBlock4:
-			val = b.bytes(int(b.uint32()))
-		case formDwarfBlock:
-			val = b.bytes(int(b.uint()))
-
-		// constant
-		case formData1:
-			val = int64(b.uint8())
-		case formData2:
-			val = int64(b.uint16())
-		case formData4:
-			val = int64(b.uint32())
-		case formData8:
-			val = int64(b.uint64())
-		case formSdata:
-			val = int64(b.int())
-		case formUdata:
-			val = int64(b.uint())
-
-		// flag
-		case formFlag:
-			val = b.uint8() == 1
-		// New in DWARF 4.
-		case formFlagPresent:
-			// The attribute is implicitly indicated as present, and no value is
-			// encoded in the debugging information entry itself.
-			val = true
-
-		// reference to other entry
-		case formRefAddr:
-			vers := b.format.version()
-			if vers == 0 {
-				b.error("unknown version for DW_FORM_ref_addr")
-			} else if vers == 2 {
-				val = Offset(b.addr())
-			} else {
-				is64, known := b.format.dwarf64()
-				if !known {
-					b.error("unknown size for DW_FORM_ref_addr")
-				} else if is64 {
-					val = Offset(b.uint64())
-				} else {
-					val = Offset(b.uint32())
-				}
-			}
-		case formRef1:
-			val = Offset(b.uint8()) + ubase
-		case formRef2:
-			val = Offset(b.uint16()) + ubase
-		case formRef4:
-			val = Offset(b.uint32()) + ubase
-		case formRef8:
-			val = Offset(b.uint64()) + ubase
-		case formRefUdata:
-			val = Offset(b.uint()) + ubase
-
-		// string
-		case formString:
-			val = b.string()
-		case formStrp:
-			off := b.uint32() // offset into .debug_str
-			if b.err != nil {
-				return nil
-			}
-			b1 := makeBuf(b.dwarf, unknownFormat{}, "str", 0, b.dwarf.str)
-			b1.skip(int(off))
-			val = b1.string()
-			if b1.err != nil {
-				b.err = b1.err
-				return nil
-			}
-
-		// lineptr, loclistptr, macptr, rangelistptr
-		// New in DWARF 4, but clang can generate them with -gdwarf-2.
-		// Section reference, replacing use of formData4 and formData8.
-		case formSecOffset, formGnuRefAlt, formGnuStrpAlt:
-			is64, known := b.format.dwarf64()
-			if !known {
-				b.error("unknown size for form 0x" + strconv.FormatInt(int64(fmt), 16))
-			} else if is64 {
-				val = int64(b.uint64())
-			} else {
-				val = int64(b.uint32())
-			}
-
-		// exprloc
-		// New in DWARF 4.
-		case formExprloc:
-			val = b.bytes(int(b.uint()))
-
-		// reference
-		// New in DWARF 4.
-		case formRefSig8:
-			// 64-bit type signature.
-			val = b.uint64()
-		}
-		e.Field[i].Val = val
-	}
-	if b.err != nil {
-		return nil
-	}
-	return e
-}
-
-// A Reader allows reading Entry structures from a DWARF ``info'' section.
-// The Entry structures are arranged in a tree.  The Reader's Next function
-// return successive entries from a pre-order traversal of the tree.
-// If an entry has children, its Children field will be true, and the children
-// follow, terminated by an Entry with Tag 0.
-type Reader struct {
-	b            buf
-	d            *Data
-	err          error
-	unit         int
-	lastChildren bool   // .Children of last entry returned by Next
-	lastSibling  Offset // .Val(AttrSibling) of last entry returned by Next
-}
-
-// Reader returns a new Reader for Data.
-// The reader is positioned at byte offset 0 in the DWARF ``info'' section.
-func (d *Data) Reader() *Reader {
-	r := &Reader{d: d}
-	r.Seek(0)
-	return r
-}
-
-// AddressSize returns the size in bytes of addresses in the current compilation
-// unit.
-func (r *Reader) AddressSize() int {
-	return r.d.unit[r.unit].asize
-}
-
-// Seek positions the Reader at offset off in the encoded entry stream.
-// Offset 0 can be used to denote the first entry.
-func (r *Reader) Seek(off Offset) {
-	d := r.d
-	r.err = nil
-	r.lastChildren = false
-	if off == 0 {
-		if len(d.unit) == 0 {
-			return
-		}
-		u := &d.unit[0]
-		r.unit = 0
-		r.b = makeBuf(r.d, u, "info", u.off, u.data)
-		return
-	}
-
-	i := d.offsetToUnit(off)
-	if i == -1 {
-		r.err = errors.New("offset out of range")
-		return
-	}
-	u := &d.unit[i]
-	r.unit = i
-	r.b = makeBuf(r.d, u, "info", off, u.data[off-u.off:])
-}
-
-// maybeNextUnit advances to the next unit if this one is finished.
-func (r *Reader) maybeNextUnit() {
-	for len(r.b.data) == 0 && r.unit+1 < len(r.d.unit) {
-		r.unit++
-		u := &r.d.unit[r.unit]
-		r.b = makeBuf(r.d, u, "info", u.off, u.data)
-	}
-}
-
-// Next reads the next entry from the encoded entry stream.
-// It returns nil, nil when it reaches the end of the section.
-// It returns an error if the current offset is invalid or the data at the
-// offset cannot be decoded as a valid Entry.
-func (r *Reader) Next() (*Entry, error) {
-	if r.err != nil {
-		return nil, r.err
-	}
-	r.maybeNextUnit()
-	if len(r.b.data) == 0 {
-		return nil, nil
-	}
-	u := &r.d.unit[r.unit]
-	e := r.b.entry(u.atable, u.base)
-	if r.b.err != nil {
-		r.err = r.b.err
-		return nil, r.err
-	}
-	if e != nil {
-		r.lastChildren = e.Children
-		if r.lastChildren {
-			r.lastSibling, _ = e.Val(AttrSibling).(Offset)
-		}
-	} else {
-		r.lastChildren = false
-	}
-	return e, nil
-}
-
-// SkipChildren skips over the child entries associated with
-// the last Entry returned by Next.  If that Entry did not have
-// children or Next has not been called, SkipChildren is a no-op.
-func (r *Reader) SkipChildren() {
-	if r.err != nil || !r.lastChildren {
-		return
-	}
-
-	// If the last entry had a sibling attribute,
-	// that attribute gives the offset of the next
-	// sibling, so we can avoid decoding the
-	// child subtrees.
-	if r.lastSibling >= r.b.off {
-		r.Seek(r.lastSibling)
-		return
-	}
-
-	for {
-		e, err := r.Next()
-		if err != nil || e == nil || e.Tag == 0 {
-			break
-		}
-		if e.Children {
-			r.SkipChildren()
-		}
-	}
-}
-
-// clone returns a copy of the reader.  This is used by the typeReader
-// interface.
-func (r *Reader) clone() typeReader {
-	return r.d.Reader()
-}
-
-// offset returns the current buffer offset.  This is used by the
-// typeReader interface.
-func (r *Reader) offset() Offset {
-	return r.b.off
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/line.go b/third_party/gofrontend/libgo/go/debug/dwarf/line.go
deleted file mode 100644
index ca64bbd..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/line.go
+++ /dev/null
@@ -1,590 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package dwarf
-
-import (
-	"errors"
-	"fmt"
-	"io"
-	"path"
-)
-
-// A LineReader reads a sequence of LineEntry structures from a DWARF
-// "line" section for a single compilation unit. LineEntries occur in
-// order of increasing PC and each LineEntry gives metadata for the
-// instructions from that LineEntry's PC to just before the next
-// LineEntry's PC. The last entry will have its EndSequence field set.
-type LineReader struct {
-	buf buf
-
-	// Original .debug_line section data. Used by Seek.
-	section []byte
-
-	// Header information
-	version              uint16
-	minInstructionLength int
-	maxOpsPerInstruction int
-	defaultIsStmt        bool
-	lineBase             int
-	lineRange            int
-	opcodeBase           int
-	opcodeLengths        []int
-	directories          []string
-	fileEntries          []*LineFile
-
-	programOffset Offset // section offset of line number program
-	endOffset     Offset // section offset of byte following program
-
-	initialFileEntries int // initial length of fileEntries
-
-	// Current line number program state machine registers
-	state     LineEntry // public state
-	fileIndex int       // private state
-}
-
-// A LineEntry is a row in a DWARF line table.
-type LineEntry struct {
-	// Address is the program-counter value of a machine
-	// instruction generated by the compiler. This LineEntry
-	// applies to each instruction from Address to just before the
-	// Address of the next LineEntry.
-	Address uint64
-
-	// OpIndex is the index of an operation within a VLIW
-	// instruction. The index of the first operation is 0. For
-	// non-VLIW architectures, it will always be 0. Address and
-	// OpIndex together form an operation pointer that can
-	// reference any individual operation within the instruction
-	// stream.
-	OpIndex int
-
-	// File is the source file corresponding to these
-	// instructions.
-	File *LineFile
-
-	// Line is the source code line number corresponding to these
-	// instructions. Lines are numbered beginning at 1. It may be
-	// 0 if these instructions cannot be attributed to any source
-	// line.
-	Line int
-
-	// Column is the column number within the source line of these
-	// instructions. Columns are numbered beginning at 1. It may
-	// be 0 to indicate the "left edge" of the line.
-	Column int
-
-	// IsStmt indicates that Address is a recommended breakpoint
-	// location, such as the beginning of a line, statement, or a
-	// distinct subpart of a statement.
-	IsStmt bool
-
-	// BasicBlock indicates that Address is the beginning of a
-	// basic block.
-	BasicBlock bool
-
-	// PrologueEnd indicates that Address is one (of possibly
-	// many) PCs where execution should be suspended for a
-	// breakpoint on entry to the containing function.
-	//
-	// Added in DWARF 3.
-	PrologueEnd bool
-
-	// EpilogueBegin indicates that Address is one (of possibly
-	// many) PCs where execution should be suspended for a
-	// breakpoint on exit from this function.
-	//
-	// Added in DWARF 3.
-	EpilogueBegin bool
-
-	// ISA is the instruction set architecture for these
-	// instructions. Possible ISA values should be defined by the
-	// applicable ABI specification.
-	//
-	// Added in DWARF 3.
-	ISA int
-
-	// Discriminator is an arbitrary integer indicating the block
-	// to which these instructions belong. It serves to
-	// distinguish among multiple blocks that may all have with
-	// the same source file, line, and column. Where only one
-	// block exists for a given source position, it should be 0.
-	//
-	// Added in DWARF 3.
-	Discriminator int
-
-	// EndSequence indicates that Address is the first byte after
-	// the end of a sequence of target machine instructions. If it
-	// is set, only this and the Address field are meaningful. A
-	// line number table may contain information for multiple
-	// potentially disjoint instruction sequences. The last entry
-	// in a line table should always have EndSequence set.
-	EndSequence bool
-}
-
-// A LineFile is a source file referenced by a DWARF line table entry.
-type LineFile struct {
-	Name   string
-	Mtime  uint64 // Implementation defined modification time, or 0 if unknown
-	Length int    // File length, or 0 if unknown
-}
-
-// LineReader returns a new reader for the line table of compilation
-// unit cu, which must be an Entry with tag TagCompileUnit.
-//
-// If this compilation unit has no line table, it returns nil, nil.
-func (d *Data) LineReader(cu *Entry) (*LineReader, error) {
-	if d.line == nil {
-		// No line tables available.
-		return nil, nil
-	}
-
-	// Get line table information from cu.
-	off, ok := cu.Val(AttrStmtList).(int64)
-	if !ok {
-		// cu has no line table.
-		return nil, nil
-	}
-	if off > int64(len(d.line)) {
-		return nil, errors.New("AttrStmtList value out of range")
-	}
-	// AttrCompDir is optional if all file names are absolute. Use
-	// the empty string if it's not present.
-	compDir, _ := cu.Val(AttrCompDir).(string)
-
-	// Create the LineReader.
-	u := &d.unit[d.offsetToUnit(cu.Offset)]
-	buf := makeBuf(d, u, "line", Offset(off), d.line[off:])
-	// The compilation directory is implicitly directories[0].
-	r := LineReader{buf: buf, section: d.line, directories: []string{compDir}}
-
-	// Read the header.
-	if err := r.readHeader(); err != nil {
-		return nil, err
-	}
-
-	// Initialize line reader state.
-	r.Reset()
-
-	return &r, nil
-}
-
-// readHeader reads the line number program header from r.buf and sets
-// all of the header fields in r.
-func (r *LineReader) readHeader() error {
-	buf := &r.buf
-
-	// Read basic header fields [DWARF2 6.2.4].
-	hdrOffset := buf.off
-	unitLength, dwarf64 := buf.unitLength()
-	r.endOffset = buf.off + unitLength
-	if r.endOffset > buf.off+Offset(len(buf.data)) {
-		return DecodeError{"line", hdrOffset, fmt.Sprintf("line table end %d exceeds section size %d", r.endOffset, buf.off+Offset(len(buf.data)))}
-	}
-	r.version = buf.uint16()
-	if buf.err == nil && (r.version < 2 || r.version > 4) {
-		// DWARF goes to all this effort to make new opcodes
-		// backward-compatible, and then adds fields right in
-		// the middle of the header in new versions, so we're
-		// picky about only supporting known line table
-		// versions.
-		return DecodeError{"line", hdrOffset, fmt.Sprintf("unknown line table version %d", r.version)}
-	}
-	var headerLength Offset
-	if dwarf64 {
-		headerLength = Offset(buf.uint64())
-	} else {
-		headerLength = Offset(buf.uint32())
-	}
-	r.programOffset = buf.off + headerLength
-	r.minInstructionLength = int(buf.uint8())
-	if r.version >= 4 {
-		// [DWARF4 6.2.4]
-		r.maxOpsPerInstruction = int(buf.uint8())
-	} else {
-		r.maxOpsPerInstruction = 1
-	}
-	r.defaultIsStmt = buf.uint8() != 0
-	r.lineBase = int(int8(buf.uint8()))
-	r.lineRange = int(buf.uint8())
-
-	// Validate header.
-	if buf.err != nil {
-		return buf.err
-	}
-	if r.maxOpsPerInstruction == 0 {
-		return DecodeError{"line", hdrOffset, "invalid maximum operations per instruction: 0"}
-	}
-	if r.lineRange == 0 {
-		return DecodeError{"line", hdrOffset, "invalid line range: 0"}
-	}
-
-	// Read standard opcode length table. This table starts with opcode 1.
-	r.opcodeBase = int(buf.uint8())
-	r.opcodeLengths = make([]int, r.opcodeBase)
-	for i := 1; i < r.opcodeBase; i++ {
-		r.opcodeLengths[i] = int(buf.uint8())
-	}
-
-	// Validate opcode lengths.
-	if buf.err != nil {
-		return buf.err
-	}
-	for i, length := range r.opcodeLengths {
-		if known, ok := knownOpcodeLengths[i]; ok && known != length {
-			return DecodeError{"line", hdrOffset, fmt.Sprintf("opcode %d expected to have length %d, but has length %d", i, known, length)}
-		}
-	}
-
-	// Read include directories table. The caller already set
-	// directories[0] to the compilation directory.
-	for {
-		directory := buf.string()
-		if buf.err != nil {
-			return buf.err
-		}
-		if len(directory) == 0 {
-			break
-		}
-		if !path.IsAbs(directory) {
-			// Relative paths are implicitly relative to
-			// the compilation directory.
-			directory = path.Join(r.directories[0], directory)
-		}
-		r.directories = append(r.directories, directory)
-	}
-
-	// Read file name list. File numbering starts with 1, so leave
-	// the first entry nil.
-	r.fileEntries = make([]*LineFile, 1)
-	for {
-		if done, err := r.readFileEntry(); err != nil {
-			return err
-		} else if done {
-			break
-		}
-	}
-	r.initialFileEntries = len(r.fileEntries)
-
-	return buf.err
-}
-
-// readFileEntry reads a file entry from either the header or a
-// DW_LNE_define_file extended opcode and adds it to r.fileEntries. A
-// true return value indicates that there are no more entries to read.
-func (r *LineReader) readFileEntry() (bool, error) {
-	name := r.buf.string()
-	if r.buf.err != nil {
-		return false, r.buf.err
-	}
-	if len(name) == 0 {
-		return true, nil
-	}
-	off := r.buf.off
-	dirIndex := int(r.buf.uint())
-	if !path.IsAbs(name) {
-		if dirIndex >= len(r.directories) {
-			return false, DecodeError{"line", off, "directory index too large"}
-		}
-		name = path.Join(r.directories[dirIndex], name)
-	}
-	mtime := r.buf.uint()
-	length := int(r.buf.uint())
-
-	r.fileEntries = append(r.fileEntries, &LineFile{name, mtime, length})
-	return false, nil
-}
-
-// updateFile updates r.state.File after r.fileIndex has
-// changed or r.fileEntries has changed.
-func (r *LineReader) updateFile() {
-	if r.fileIndex < len(r.fileEntries) {
-		r.state.File = r.fileEntries[r.fileIndex]
-	} else {
-		r.state.File = nil
-	}
-}
-
-// Next sets *entry to the next row in this line table and moves to
-// the next row. If there are no more entries and the line table is
-// properly terminated, it returns io.EOF.
-//
-// Rows are always in order of increasing entry.Address, but
-// entry.Line may go forward or backward.
-func (r *LineReader) Next(entry *LineEntry) error {
-	if r.buf.err != nil {
-		return r.buf.err
-	}
-
-	// Execute opcodes until we reach an opcode that emits a line
-	// table entry.
-	for {
-		if len(r.buf.data) == 0 {
-			return io.EOF
-		}
-		emit := r.step(entry)
-		if r.buf.err != nil {
-			return r.buf.err
-		}
-		if emit {
-			return nil
-		}
-	}
-}
-
-// knownOpcodeLengths gives the opcode lengths (in varint arguments)
-// of known standard opcodes.
-var knownOpcodeLengths = map[int]int{
-	lnsCopy:             0,
-	lnsAdvancePC:        1,
-	lnsAdvanceLine:      1,
-	lnsSetFile:          1,
-	lnsNegateStmt:       0,
-	lnsSetBasicBlock:    0,
-	lnsConstAddPC:       0,
-	lnsSetPrologueEnd:   0,
-	lnsSetEpilogueBegin: 0,
-	lnsSetISA:           1,
-	// lnsFixedAdvancePC takes a uint8 rather than a varint; it's
-	// unclear what length the header is supposed to claim, so
-	// ignore it.
-}
-
-// step processes the next opcode and updates r.state. If the opcode
-// emits a row in the line table, this updates *entry and returns
-// true.
-func (r *LineReader) step(entry *LineEntry) bool {
-	opcode := int(r.buf.uint8())
-
-	if opcode >= r.opcodeBase {
-		// Special opcode [DWARF2 6.2.5.1, DWARF4 6.2.5.1]
-		adjustedOpcode := opcode - r.opcodeBase
-		r.advancePC(adjustedOpcode / r.lineRange)
-		lineDelta := r.lineBase + int(adjustedOpcode)%r.lineRange
-		r.state.Line += lineDelta
-		goto emit
-	}
-
-	switch opcode {
-	case 0:
-		// Extended opcode [DWARF2 6.2.5.3]
-		length := Offset(r.buf.uint())
-		startOff := r.buf.off
-		opcode := r.buf.uint8()
-
-		switch opcode {
-		case lneEndSequence:
-			r.state.EndSequence = true
-			*entry = r.state
-			r.resetState()
-
-		case lneSetAddress:
-			r.state.Address = r.buf.addr()
-
-		case lneDefineFile:
-			if done, err := r.readFileEntry(); err != nil {
-				r.buf.err = err
-				return false
-			} else if done {
-				r.buf.err = DecodeError{"line", startOff, "malformed DW_LNE_define_file operation"}
-				return false
-			}
-			r.updateFile()
-
-		case lneSetDiscriminator:
-			// [DWARF4 6.2.5.3]
-			r.state.Discriminator = int(r.buf.uint())
-		}
-
-		r.buf.skip(int(startOff + length - r.buf.off))
-
-		if opcode == lneEndSequence {
-			return true
-		}
-
-	// Standard opcodes [DWARF2 6.2.5.2]
-	case lnsCopy:
-		goto emit
-
-	case lnsAdvancePC:
-		r.advancePC(int(r.buf.uint()))
-
-	case lnsAdvanceLine:
-		r.state.Line += int(r.buf.int())
-
-	case lnsSetFile:
-		r.fileIndex = int(r.buf.uint())
-		r.updateFile()
-
-	case lnsSetColumn:
-		r.state.Column = int(r.buf.uint())
-
-	case lnsNegateStmt:
-		r.state.IsStmt = !r.state.IsStmt
-
-	case lnsSetBasicBlock:
-		r.state.BasicBlock = true
-
-	case lnsConstAddPC:
-		r.advancePC((255 - r.opcodeBase) / r.lineRange)
-
-	case lnsFixedAdvancePC:
-		r.state.Address += uint64(r.buf.uint16())
-
-	// DWARF3 standard opcodes [DWARF3 6.2.5.2]
-	case lnsSetPrologueEnd:
-		r.state.PrologueEnd = true
-
-	case lnsSetEpilogueBegin:
-		r.state.EpilogueBegin = true
-
-	case lnsSetISA:
-		r.state.ISA = int(r.buf.uint())
-
-	default:
-		// Unhandled standard opcode. Skip the number of
-		// arguments that the prologue says this opcode has.
-		for i := 0; i < r.opcodeLengths[opcode]; i++ {
-			r.buf.uint()
-		}
-	}
-	return false
-
-emit:
-	*entry = r.state
-	r.state.BasicBlock = false
-	r.state.PrologueEnd = false
-	r.state.EpilogueBegin = false
-	r.state.Discriminator = 0
-	return true
-}
-
-// advancePC advances "operation pointer" (the combination of Address
-// and OpIndex) in r.state by opAdvance steps.
-func (r *LineReader) advancePC(opAdvance int) {
-	opIndex := r.state.OpIndex + opAdvance
-	r.state.Address += uint64(r.minInstructionLength * (opIndex / r.maxOpsPerInstruction))
-	r.state.OpIndex = opIndex % r.maxOpsPerInstruction
-}
-
-// A LineReaderPos represents a position in a line table.
-type LineReaderPos struct {
-	// off is the current offset in the DWARF line section.
-	off Offset
-	// numFileEntries is the length of fileEntries.
-	numFileEntries int
-	// state and fileIndex are the statement machine state at
-	// offset off.
-	state     LineEntry
-	fileIndex int
-}
-
-// Tell returns the current position in the line table.
-func (r *LineReader) Tell() LineReaderPos {
-	return LineReaderPos{r.buf.off, len(r.fileEntries), r.state, r.fileIndex}
-}
-
-// Seek restores the line table reader to a position returned by Tell.
-//
-// The argument pos must have been returned by a call to Tell on this
-// line table.
-func (r *LineReader) Seek(pos LineReaderPos) {
-	r.buf.off = pos.off
-	r.buf.data = r.section[r.buf.off:r.endOffset]
-	r.fileEntries = r.fileEntries[:pos.numFileEntries]
-	r.state = pos.state
-	r.fileIndex = pos.fileIndex
-}
-
-// Reset repositions the line table reader at the beginning of the
-// line table.
-func (r *LineReader) Reset() {
-	// Reset buffer to the line number program offset.
-	r.buf.off = r.programOffset
-	r.buf.data = r.section[r.buf.off:r.endOffset]
-
-	// Reset file entries list.
-	r.fileEntries = r.fileEntries[:r.initialFileEntries]
-
-	// Reset line number program state.
-	r.resetState()
-}
-
-// resetState resets r.state to its default values
-func (r *LineReader) resetState() {
-	// Reset the state machine registers to the defaults given in
-	// [DWARF4 6.2.2].
-	r.state = LineEntry{
-		Address:       0,
-		OpIndex:       0,
-		File:          nil,
-		Line:          1,
-		Column:        0,
-		IsStmt:        r.defaultIsStmt,
-		BasicBlock:    false,
-		PrologueEnd:   false,
-		EpilogueBegin: false,
-		ISA:           0,
-		Discriminator: 0,
-	}
-	r.fileIndex = 1
-	r.updateFile()
-}
-
-// ErrUnknownPC is the error returned by LineReader.ScanPC when the
-// seek PC is not covered by any entry in the line table.
-var ErrUnknownPC = errors.New("ErrUnknownPC")
-
-// SeekPC sets *entry to the LineEntry that includes pc and positions
-// the reader on the next entry in the line table. If necessary, this
-// will seek backwards to find pc.
-//
-// If pc is not covered by any entry in this line table, SeekPC
-// returns ErrUnknownPC. In this case, *entry and the final seek
-// position are unspecified.
-//
-// Note that DWARF line tables only permit sequential, forward scans.
-// Hence, in the worst case, this takes time linear in the size of the
-// line table. If the caller wishes to do repeated fast PC lookups, it
-// should build an appropriate index of the line table.
-func (r *LineReader) SeekPC(pc uint64, entry *LineEntry) error {
-	if err := r.Next(entry); err != nil {
-		return err
-	}
-	if entry.Address > pc {
-		// We're too far. Start at the beginning of the table.
-		r.Reset()
-		if err := r.Next(entry); err != nil {
-			return err
-		}
-		if entry.Address > pc {
-			// The whole table starts after pc.
-			r.Reset()
-			return ErrUnknownPC
-		}
-	}
-
-	// Scan until we pass pc, then back up one.
-	for {
-		var next LineEntry
-		pos := r.Tell()
-		if err := r.Next(&next); err != nil {
-			if err == io.EOF {
-				return ErrUnknownPC
-			}
-			return err
-		}
-		if next.Address > pc {
-			if entry.EndSequence {
-				// pc is in a hole in the table.
-				return ErrUnknownPC
-			}
-			// entry is the desired entry. Back up the
-			// cursor to "next" and return success.
-			r.Seek(pos)
-			return nil
-		}
-		*entry = next
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/line_test.go b/third_party/gofrontend/libgo/go/debug/dwarf/line_test.go
deleted file mode 100644
index 4104b5d..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/line_test.go
+++ /dev/null
@@ -1,229 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package dwarf_test
-
-import (
-	. "debug/dwarf"
-	"io"
-	"testing"
-)
-
-var (
-	file1C = &LineFile{Name: "/home/austin/go.dev/src/debug/dwarf/testdata/line1.c"}
-	file1H = &LineFile{Name: "/home/austin/go.dev/src/debug/dwarf/testdata/line1.h"}
-	file2C = &LineFile{Name: "/home/austin/go.dev/src/debug/dwarf/testdata/line2.c"}
-)
-
-func TestLineELFGCC(t *testing.T) {
-	// Generated by:
-	//   # gcc --version | head -n1
-	//   gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
-	//   # gcc -g -o line-gcc.elf line*.c
-
-	// Line table based on readelf --debug-dump=rawline,decodedline
-	want := []LineEntry{
-		{Address: 0x40059d, File: file1H, Line: 2, IsStmt: true},
-		{Address: 0x4005a5, File: file1H, Line: 2, IsStmt: true},
-		{Address: 0x4005b4, File: file1H, Line: 5, IsStmt: true},
-		{Address: 0x4005bd, File: file1H, Line: 6, IsStmt: true, Discriminator: 2},
-		{Address: 0x4005c7, File: file1H, Line: 5, IsStmt: true, Discriminator: 2},
-		{Address: 0x4005cb, File: file1H, Line: 5, IsStmt: false, Discriminator: 1},
-		{Address: 0x4005d1, File: file1H, Line: 7, IsStmt: true},
-		{Address: 0x4005e7, File: file1C, Line: 6, IsStmt: true},
-		{Address: 0x4005eb, File: file1C, Line: 7, IsStmt: true},
-		{Address: 0x4005f5, File: file1C, Line: 8, IsStmt: true},
-		{Address: 0x4005ff, File: file1C, Line: 9, IsStmt: true},
-		{Address: 0x400601, EndSequence: true},
-
-		{Address: 0x400601, File: file2C, Line: 4, IsStmt: true},
-		{Address: 0x400605, File: file2C, Line: 5, IsStmt: true},
-		{Address: 0x40060f, File: file2C, Line: 6, IsStmt: true},
-		{Address: 0x400611, EndSequence: true},
-	}
-
-	testLineTable(t, want, elfData(t, "testdata/line-gcc.elf"))
-}
-
-func TestLineELFClang(t *testing.T) {
-	// Generated by:
-	//   # clang --version | head -n1
-	//   Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
-	//   # clang -g -o line-clang.elf line*.
-
-	want := []LineEntry{
-		{Address: 0x400530, File: file1C, Line: 6, IsStmt: true},
-		{Address: 0x400534, File: file1C, Line: 7, IsStmt: true, PrologueEnd: true},
-		{Address: 0x400539, File: file1C, Line: 8, IsStmt: true},
-		{Address: 0x400545, File: file1C, Line: 9, IsStmt: true},
-		{Address: 0x400550, File: file1H, Line: 2, IsStmt: true},
-		{Address: 0x400554, File: file1H, Line: 5, IsStmt: true, PrologueEnd: true},
-		{Address: 0x400568, File: file1H, Line: 6, IsStmt: true},
-		{Address: 0x400571, File: file1H, Line: 5, IsStmt: true},
-		{Address: 0x400581, File: file1H, Line: 7, IsStmt: true},
-		{Address: 0x400583, EndSequence: true},
-
-		{Address: 0x400590, File: file2C, Line: 4, IsStmt: true},
-		{Address: 0x4005a0, File: file2C, Line: 5, IsStmt: true, PrologueEnd: true},
-		{Address: 0x4005a7, File: file2C, Line: 6, IsStmt: true},
-		{Address: 0x4005b0, EndSequence: true},
-	}
-
-	testLineTable(t, want, elfData(t, "testdata/line-clang.elf"))
-}
-
-func TestLineSeek(t *testing.T) {
-	d := elfData(t, "testdata/line-gcc.elf")
-
-	// Get the line table for the first CU.
-	cu, err := d.Reader().Next()
-	if err != nil {
-		t.Fatal("d.Reader().Next:", err)
-	}
-	lr, err := d.LineReader(cu)
-	if err != nil {
-		t.Fatal("d.LineReader:", err)
-	}
-
-	// Read entries forward.
-	var line LineEntry
-	var posTable []LineReaderPos
-	var table []LineEntry
-	for {
-		posTable = append(posTable, lr.Tell())
-
-		err := lr.Next(&line)
-		if err != nil {
-			if err == io.EOF {
-				break
-			}
-			t.Fatal("lr.Next:", err)
-		}
-		table = append(table, line)
-	}
-
-	// Test that Reset returns to the first line.
-	lr.Reset()
-	if err := lr.Next(&line); err != nil {
-		t.Fatal("lr.Next after Reset failed:", err)
-	} else if line != table[0] {
-		t.Fatal("lr.Next after Reset returned", line, "instead of", table[0])
-	}
-
-	// Check that entries match when seeking backward.
-	for i := len(posTable) - 1; i >= 0; i-- {
-		lr.Seek(posTable[i])
-		err := lr.Next(&line)
-		if i == len(posTable)-1 {
-			if err != io.EOF {
-				t.Fatal("expected io.EOF after seek to end, got", err)
-			}
-		} else if err != nil {
-			t.Fatal("lr.Next after seek to", posTable[i], "failed:", err)
-		} else if line != table[i] {
-			t.Fatal("lr.Next after seek to", posTable[i], "returned", line, "instead of", table[i])
-		}
-	}
-
-	// Check that seeking to a PC returns the right line.
-	if err := lr.SeekPC(table[0].Address-1, &line); err != ErrUnknownPC {
-		t.Fatalf("lr.SeekPC to %#x returned %v instead of ErrUnknownPC", table[0].Address-1, err)
-	}
-	for i, testLine := range table {
-		if testLine.EndSequence {
-			if err := lr.SeekPC(testLine.Address, &line); err != ErrUnknownPC {
-				t.Fatalf("lr.SeekPC to %#x returned %v instead of ErrUnknownPC", testLine.Address, err)
-			}
-			continue
-		}
-
-		nextPC := table[i+1].Address
-		for pc := testLine.Address; pc < nextPC; pc++ {
-			if err := lr.SeekPC(pc, &line); err != nil {
-				t.Fatalf("lr.SeekPC to %#x failed: %v", pc, err)
-			} else if line != testLine {
-				t.Fatalf("lr.SeekPC to %#x returned %v instead of %v", pc, line, testLine)
-			}
-		}
-	}
-}
-
-func testLineTable(t *testing.T, want []LineEntry, d *Data) {
-	// Get line table from d.
-	var got []LineEntry
-	dr := d.Reader()
-	for {
-		ent, err := dr.Next()
-		if err != nil {
-			t.Fatal("dr.Next:", err)
-		} else if ent == nil {
-			break
-		}
-
-		if ent.Tag != TagCompileUnit {
-			dr.SkipChildren()
-			continue
-		}
-
-		// Decode CU's line table.
-		lr, err := d.LineReader(ent)
-		if err != nil {
-			t.Fatal("d.LineReader:", err)
-		} else if lr == nil {
-			continue
-		}
-
-		for {
-			var line LineEntry
-			err := lr.Next(&line)
-			if err != nil {
-				if err == io.EOF {
-					break
-				}
-				t.Fatal("lr.Next:", err)
-			}
-			got = append(got, line)
-		}
-	}
-
-	// Compare line tables.
-	if !compareLines(got, want) {
-		t.Log("Line tables do not match. Got:")
-		dumpLines(t, got)
-		t.Log("Want:")
-		dumpLines(t, want)
-		t.FailNow()
-	}
-}
-
-func compareLines(a, b []LineEntry) bool {
-	if len(a) != len(b) {
-		return false
-	}
-
-	for i := range a {
-		al, bl := a[i], b[i]
-		// If both are EndSequence, then the only other valid
-		// field is Address. Otherwise, test equality of all
-		// fields.
-		if al.EndSequence && bl.EndSequence && al.Address == bl.Address {
-			continue
-		}
-		if al.File.Name != bl.File.Name {
-			return false
-		}
-		al.File = nil
-		bl.File = nil
-		if al != bl {
-			return false
-		}
-	}
-	return true
-}
-
-func dumpLines(t *testing.T, lines []LineEntry) {
-	for _, l := range lines {
-		t.Logf("  %+v File:%+v", l, l.File)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/open.go b/third_party/gofrontend/libgo/go/debug/dwarf/open.go
deleted file mode 100644
index c1b3f37..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/open.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package dwarf provides access to DWARF debugging information loaded from
-// executable files, as defined in the DWARF 2.0 Standard at
-// http://dwarfstd.org/doc/dwarf-2.0.0.pdf
-package dwarf
-
-import "encoding/binary"
-
-// Data represents the DWARF debugging information
-// loaded from an executable file (for example, an ELF or Mach-O executable).
-type Data struct {
-	// raw data
-	abbrev   []byte
-	aranges  []byte
-	frame    []byte
-	info     []byte
-	line     []byte
-	pubnames []byte
-	ranges   []byte
-	str      []byte
-
-	// parsed data
-	abbrevCache map[uint32]abbrevTable
-	order       binary.ByteOrder
-	typeCache   map[Offset]Type
-	typeSigs    map[uint64]*typeUnit
-	unit        []unit
-}
-
-// New returns a new Data object initialized from the given parameters.
-// Rather than calling this function directly, clients should typically use
-// the DWARF method of the File type of the appropriate package debug/elf,
-// debug/macho, or debug/pe.
-//
-// The []byte arguments are the data from the corresponding debug section
-// in the object file; for example, for an ELF object, abbrev is the contents of
-// the ".debug_abbrev" section.
-func New(abbrev, aranges, frame, info, line, pubnames, ranges, str []byte) (*Data, error) {
-	d := &Data{
-		abbrev:      abbrev,
-		aranges:     aranges,
-		frame:       frame,
-		info:        info,
-		line:        line,
-		pubnames:    pubnames,
-		ranges:      ranges,
-		str:         str,
-		abbrevCache: make(map[uint32]abbrevTable),
-		typeCache:   make(map[Offset]Type),
-		typeSigs:    make(map[uint64]*typeUnit),
-	}
-
-	// Sniff .debug_info to figure out byte order.
-	// bytes 4:6 are the version, a tiny 16-bit number (1, 2, 3).
-	if len(d.info) < 6 {
-		return nil, DecodeError{"info", Offset(len(d.info)), "too short"}
-	}
-	x, y := d.info[4], d.info[5]
-	switch {
-	case x == 0 && y == 0:
-		return nil, DecodeError{"info", 4, "unsupported version 0"}
-	case x == 0:
-		d.order = binary.BigEndian
-	case y == 0:
-		d.order = binary.LittleEndian
-	default:
-		return nil, DecodeError{"info", 4, "cannot determine byte order"}
-	}
-
-	u, err := d.parseUnits()
-	if err != nil {
-		return nil, err
-	}
-	d.unit = u
-	return d, nil
-}
-
-// AddTypes will add one .debug_types section to the DWARF data.  A
-// typical object with DWARF version 4 debug info will have multiple
-// .debug_types sections.  The name is used for error reporting only,
-// and serves to distinguish one .debug_types section from another.
-func (d *Data) AddTypes(name string, types []byte) error {
-	return d.parseTypes(name, types)
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line-clang.elf b/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line-clang.elf
deleted file mode 100755
index b63cc78..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line-clang.elf
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line-gcc.elf b/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line-gcc.elf
deleted file mode 100755
index 50500a8..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line-gcc.elf
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line1.c b/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line1.c
deleted file mode 100644
index f358647..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include "line1.h"
-
-void f2();
-
-int main()
-{
-	f1();
-	f2();
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line1.h b/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line1.h
deleted file mode 100644
index 974d4c8..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line1.h
+++ /dev/null
@@ -1,7 +0,0 @@
-static void f1()
-{
-	char buf[10];
-	int i;
-	for(i = 0; i < 10; i++)
-		buf[i] = 1;
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line2.c b/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line2.c
deleted file mode 100644
index 38d8998..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/line2.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <stdio.h>
-
-void f2()
-{
-	printf("hello\n");
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/typedef.c b/third_party/gofrontend/libgo/go/debug/dwarf/testdata/typedef.c
deleted file mode 100644
index f05f015..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/typedef.c
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Linux ELF:
-gcc -gdwarf-2 -m64 -c typedef.c && gcc -gdwarf-2 -m64 -o typedef.elf typedef.o
-
-OS X Mach-O:
-gcc -gdwarf-2 -m64 -c typedef.c -o typedef.macho
-*/
-#include <complex.h>
-
-typedef volatile int* t_ptr_volatile_int;
-typedef const char *t_ptr_const_char;
-typedef long t_long;
-typedef unsigned short t_ushort;
-typedef int t_func_int_of_float_double(float, double);
-typedef int (*t_ptr_func_int_of_float_double)(float, double);
-typedef int (*t_ptr_func_int_of_float_complex)(float complex);
-typedef int (*t_ptr_func_int_of_double_complex)(double complex);
-typedef int (*t_ptr_func_int_of_long_double_complex)(long double complex);
-typedef int *t_func_ptr_int_of_char_schar_uchar(char, signed char, unsigned char);
-typedef void t_func_void_of_char(char);
-typedef void t_func_void_of_void(void);
-typedef void t_func_void_of_ptr_char_dots(char*, ...);
-typedef struct my_struct {
-	volatile int vi;
-	char x : 1;
-	int y : 4;
-	int z[0];
-	long long array[40];
-	int zz[0];
-} t_my_struct;
-typedef struct my_struct1 {
-	int zz [1];
-} t_my_struct1;
-typedef union my_union {
-	volatile int vi;
-	char x : 1;
-	int y : 4;
-	long long array[40];
-} t_my_union;
-typedef enum my_enum {
-	e1 = 1,
-	e2 = 2,
-	e3 = -5,
-	e4 = 1000000000000000LL,
-} t_my_enum;
-
-typedef struct list t_my_list;
-struct list {
-	short val;
-	t_my_list *next;
-};
-
-typedef struct tree {
-	struct tree *left, *right;
-	unsigned long long val;
-} t_my_tree;
-
-t_ptr_volatile_int *a2;
-t_ptr_const_char **a3a;
-t_long *a4;
-t_ushort *a5;
-t_func_int_of_float_double *a6;
-t_ptr_func_int_of_float_double *a7;
-t_func_ptr_int_of_char_schar_uchar *a8;
-t_func_void_of_char *a9;
-t_func_void_of_void *a10;
-t_func_void_of_ptr_char_dots *a11;
-t_my_struct *a12;
-t_my_struct1 *a12a;
-t_my_union *a12b;
-t_my_enum *a13;
-t_my_list *a14;
-t_my_tree *a15;
-t_ptr_func_int_of_float_complex *a16;
-t_ptr_func_int_of_double_complex *a17;
-t_ptr_func_int_of_long_double_complex *a18;
-
-int main()
-{
-	return 0;
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/typedef.elf b/third_party/gofrontend/libgo/go/debug/dwarf/testdata/typedef.elf
deleted file mode 100755
index b2062d2..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/typedef.elf
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/typedef.elf4 b/third_party/gofrontend/libgo/go/debug/dwarf/testdata/typedef.elf4
deleted file mode 100644
index 3d5a5a1..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/typedef.elf4
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/typedef.macho b/third_party/gofrontend/libgo/go/debug/dwarf/testdata/typedef.macho
deleted file mode 100644
index f75afcc..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/testdata/typedef.macho
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/type.go b/third_party/gofrontend/libgo/go/debug/dwarf/type.go
deleted file mode 100644
index a5daa1d..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/type.go
+++ /dev/null
@@ -1,706 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// DWARF type information structures.
-// The format is heavily biased toward C, but for simplicity
-// the String methods use a pseudo-Go syntax.
-
-package dwarf
-
-import "strconv"
-
-// A Type conventionally represents a pointer to any of the
-// specific Type structures (CharType, StructType, etc.).
-type Type interface {
-	Common() *CommonType
-	String() string
-	Size() int64
-}
-
-// A CommonType holds fields common to multiple types.
-// If a field is not known or not applicable for a given type,
-// the zero value is used.
-type CommonType struct {
-	ByteSize int64  // size of value of this type, in bytes
-	Name     string // name that can be used to refer to type
-}
-
-func (c *CommonType) Common() *CommonType { return c }
-
-func (c *CommonType) Size() int64 { return c.ByteSize }
-
-// Basic types
-
-// A BasicType holds fields common to all basic types.
-type BasicType struct {
-	CommonType
-	BitSize   int64
-	BitOffset int64
-}
-
-func (b *BasicType) Basic() *BasicType { return b }
-
-func (t *BasicType) String() string {
-	if t.Name != "" {
-		return t.Name
-	}
-	return "?"
-}
-
-// A CharType represents a signed character type.
-type CharType struct {
-	BasicType
-}
-
-// A UcharType represents an unsigned character type.
-type UcharType struct {
-	BasicType
-}
-
-// An IntType represents a signed integer type.
-type IntType struct {
-	BasicType
-}
-
-// A UintType represents an unsigned integer type.
-type UintType struct {
-	BasicType
-}
-
-// A FloatType represents a floating point type.
-type FloatType struct {
-	BasicType
-}
-
-// A ComplexType represents a complex floating point type.
-type ComplexType struct {
-	BasicType
-}
-
-// A BoolType represents a boolean type.
-type BoolType struct {
-	BasicType
-}
-
-// An AddrType represents a machine address type.
-type AddrType struct {
-	BasicType
-}
-
-// An UnspecifiedType represents an implicit, unknown, ambiguous or nonexistent type.
-type UnspecifiedType struct {
-	BasicType
-}
-
-// qualifiers
-
-// A QualType represents a type that has the C/C++ "const", "restrict", or "volatile" qualifier.
-type QualType struct {
-	CommonType
-	Qual string
-	Type Type
-}
-
-func (t *QualType) String() string { return t.Qual + " " + t.Type.String() }
-
-func (t *QualType) Size() int64 { return t.Type.Size() }
-
-// An ArrayType represents a fixed size array type.
-type ArrayType struct {
-	CommonType
-	Type          Type
-	StrideBitSize int64 // if > 0, number of bits to hold each element
-	Count         int64 // if == -1, an incomplete array, like char x[].
-}
-
-func (t *ArrayType) String() string {
-	return "[" + strconv.FormatInt(t.Count, 10) + "]" + t.Type.String()
-}
-
-func (t *ArrayType) Size() int64 {
-	if t.Count == -1 {
-		return 0
-	}
-	return t.Count * t.Type.Size()
-}
-
-// A VoidType represents the C void type.
-type VoidType struct {
-	CommonType
-}
-
-func (t *VoidType) String() string { return "void" }
-
-// A PtrType represents a pointer type.
-type PtrType struct {
-	CommonType
-	Type Type
-}
-
-func (t *PtrType) String() string { return "*" + t.Type.String() }
-
-// A StructType represents a struct, union, or C++ class type.
-type StructType struct {
-	CommonType
-	StructName string
-	Kind       string // "struct", "union", or "class".
-	Field      []*StructField
-	Incomplete bool // if true, struct, union, class is declared but not defined
-}
-
-// A StructField represents a field in a struct, union, or C++ class type.
-type StructField struct {
-	Name       string
-	Type       Type
-	ByteOffset int64
-	ByteSize   int64
-	BitOffset  int64 // within the ByteSize bytes at ByteOffset
-	BitSize    int64 // zero if not a bit field
-}
-
-func (t *StructType) String() string {
-	if t.StructName != "" {
-		return t.Kind + " " + t.StructName
-	}
-	return t.Defn()
-}
-
-func (t *StructType) Defn() string {
-	s := t.Kind
-	if t.StructName != "" {
-		s += " " + t.StructName
-	}
-	if t.Incomplete {
-		s += " /*incomplete*/"
-		return s
-	}
-	s += " {"
-	for i, f := range t.Field {
-		if i > 0 {
-			s += "; "
-		}
-		s += f.Name + " " + f.Type.String()
-		s += "@" + strconv.FormatInt(f.ByteOffset, 10)
-		if f.BitSize > 0 {
-			s += " : " + strconv.FormatInt(f.BitSize, 10)
-			s += "@" + strconv.FormatInt(f.BitOffset, 10)
-		}
-	}
-	s += "}"
-	return s
-}
-
-// An EnumType represents an enumerated type.
-// The only indication of its native integer type is its ByteSize
-// (inside CommonType).
-type EnumType struct {
-	CommonType
-	EnumName string
-	Val      []*EnumValue
-}
-
-// An EnumValue represents a single enumeration value.
-type EnumValue struct {
-	Name string
-	Val  int64
-}
-
-func (t *EnumType) String() string {
-	s := "enum"
-	if t.EnumName != "" {
-		s += " " + t.EnumName
-	}
-	s += " {"
-	for i, v := range t.Val {
-		if i > 0 {
-			s += "; "
-		}
-		s += v.Name + "=" + strconv.FormatInt(v.Val, 10)
-	}
-	s += "}"
-	return s
-}
-
-// A FuncType represents a function type.
-type FuncType struct {
-	CommonType
-	ReturnType Type
-	ParamType  []Type
-}
-
-func (t *FuncType) String() string {
-	s := "func("
-	for i, t := range t.ParamType {
-		if i > 0 {
-			s += ", "
-		}
-		s += t.String()
-	}
-	s += ")"
-	if t.ReturnType != nil {
-		s += " " + t.ReturnType.String()
-	}
-	return s
-}
-
-// A DotDotDotType represents the variadic ... function parameter.
-type DotDotDotType struct {
-	CommonType
-}
-
-func (t *DotDotDotType) String() string { return "..." }
-
-// A TypedefType represents a named type.
-type TypedefType struct {
-	CommonType
-	Type Type
-}
-
-func (t *TypedefType) String() string { return t.Name }
-
-func (t *TypedefType) Size() int64 { return t.Type.Size() }
-
-// typeReader is used to read from either the info section or the
-// types section.
-type typeReader interface {
-	Seek(Offset)
-	Next() (*Entry, error)
-	clone() typeReader
-	offset() Offset
-	// AddressSize returns the size in bytes of addresses in the current
-	// compilation unit.
-	AddressSize() int
-}
-
-// Type reads the type at off in the DWARF ``info'' section.
-func (d *Data) Type(off Offset) (Type, error) {
-	return d.readType("info", d.Reader(), off, d.typeCache)
-}
-
-// readType reads a type from r at off of name using and updating a
-// type cache.
-func (d *Data) readType(name string, r typeReader, off Offset, typeCache map[Offset]Type) (Type, error) {
-	if t, ok := typeCache[off]; ok {
-		return t, nil
-	}
-	r.Seek(off)
-	e, err := r.Next()
-	if err != nil {
-		return nil, err
-	}
-	addressSize := r.AddressSize()
-	if e == nil || e.Offset != off {
-		return nil, DecodeError{name, off, "no type at offset"}
-	}
-
-	// Parse type from Entry.
-	// Must always set typeCache[off] before calling
-	// d.Type recursively, to handle circular types correctly.
-	var typ Type
-
-	nextDepth := 0
-
-	// Get next child; set err if error happens.
-	next := func() *Entry {
-		if !e.Children {
-			return nil
-		}
-		// Only return direct children.
-		// Skip over composite entries that happen to be nested
-		// inside this one. Most DWARF generators wouldn't generate
-		// such a thing, but clang does.
-		// See golang.org/issue/6472.
-		for {
-			kid, err1 := r.Next()
-			if err1 != nil {
-				err = err1
-				return nil
-			}
-			if kid == nil {
-				err = DecodeError{name, r.offset(), "unexpected end of DWARF entries"}
-				return nil
-			}
-			if kid.Tag == 0 {
-				if nextDepth > 0 {
-					nextDepth--
-					continue
-				}
-				return nil
-			}
-			if kid.Children {
-				nextDepth++
-			}
-			if nextDepth > 0 {
-				continue
-			}
-			return kid
-		}
-	}
-
-	// Get Type referred to by Entry's AttrType field.
-	// Set err if error happens.  Not having a type is an error.
-	typeOf := func(e *Entry) Type {
-		tval := e.Val(AttrType)
-		var t Type
-		switch toff := tval.(type) {
-		case Offset:
-			if t, err = d.readType(name, r.clone(), toff, typeCache); err != nil {
-				return nil
-			}
-		case uint64:
-			if t, err = d.sigToType(toff); err != nil {
-				return nil
-			}
-		default:
-			// It appears that no Type means "void".
-			return new(VoidType)
-		}
-		return t
-	}
-
-	switch e.Tag {
-	case TagArrayType:
-		// Multi-dimensional array.  (DWARF v2 §5.4)
-		// Attributes:
-		//	AttrType:subtype [required]
-		//	AttrStrideSize: size in bits of each element of the array
-		//	AttrByteSize: size of entire array
-		// Children:
-		//	TagSubrangeType or TagEnumerationType giving one dimension.
-		//	dimensions are in left to right order.
-		t := new(ArrayType)
-		typ = t
-		typeCache[off] = t
-		if t.Type = typeOf(e); err != nil {
-			goto Error
-		}
-		t.StrideBitSize, _ = e.Val(AttrStrideSize).(int64)
-
-		// Accumulate dimensions,
-		var dims []int64
-		for kid := next(); kid != nil; kid = next() {
-			// TODO(rsc): Can also be TagEnumerationType
-			// but haven't seen that in the wild yet.
-			switch kid.Tag {
-			case TagSubrangeType:
-				count, ok := kid.Val(AttrCount).(int64)
-				if !ok {
-					// Old binaries may have an upper bound instead.
-					count, ok = kid.Val(AttrUpperBound).(int64)
-					if ok {
-						count++ // Length is one more than upper bound.
-					} else if len(dims) == 0 {
-						count = -1 // As in x[].
-					}
-				}
-				dims = append(dims, count)
-			case TagEnumerationType:
-				err = DecodeError{name, kid.Offset, "cannot handle enumeration type as array bound"}
-				goto Error
-			}
-		}
-		if len(dims) == 0 {
-			// LLVM generates this for x[].
-			dims = []int64{-1}
-		}
-
-		t.Count = dims[0]
-		for i := len(dims) - 1; i >= 1; i-- {
-			t.Type = &ArrayType{Type: t.Type, Count: dims[i]}
-		}
-
-	case TagBaseType:
-		// Basic type.  (DWARF v2 §5.1)
-		// Attributes:
-		//	AttrName: name of base type in programming language of the compilation unit [required]
-		//	AttrEncoding: encoding value for type (encFloat etc) [required]
-		//	AttrByteSize: size of type in bytes [required]
-		//	AttrBitOffset: for sub-byte types, size in bits
-		//	AttrBitSize: for sub-byte types, bit offset of high order bit in the AttrByteSize bytes
-		name, _ := e.Val(AttrName).(string)
-		enc, ok := e.Val(AttrEncoding).(int64)
-		if !ok {
-			err = DecodeError{name, e.Offset, "missing encoding attribute for " + name}
-			goto Error
-		}
-		switch enc {
-		default:
-			err = DecodeError{name, e.Offset, "unrecognized encoding attribute value"}
-			goto Error
-
-		case encAddress:
-			typ = new(AddrType)
-		case encBoolean:
-			typ = new(BoolType)
-		case encComplexFloat:
-			typ = new(ComplexType)
-			if name == "complex" {
-				// clang writes out 'complex' instead of 'complex float' or 'complex double'.
-				// clang also writes out a byte size that we can use to distinguish.
-				// See issue 8694.
-				switch byteSize, _ := e.Val(AttrByteSize).(int64); byteSize {
-				case 8:
-					name = "complex float"
-				case 16:
-					name = "complex double"
-				}
-			}
-		case encFloat:
-			typ = new(FloatType)
-		case encSigned:
-			typ = new(IntType)
-		case encUnsigned:
-			typ = new(UintType)
-		case encSignedChar:
-			typ = new(CharType)
-		case encUnsignedChar:
-			typ = new(UcharType)
-		}
-		typeCache[off] = typ
-		t := typ.(interface {
-			Basic() *BasicType
-		}).Basic()
-		t.Name = name
-		t.BitSize, _ = e.Val(AttrBitSize).(int64)
-		t.BitOffset, _ = e.Val(AttrBitOffset).(int64)
-
-	case TagClassType, TagStructType, TagUnionType:
-		// Structure, union, or class type.  (DWARF v2 §5.5)
-		// Attributes:
-		//	AttrName: name of struct, union, or class
-		//	AttrByteSize: byte size [required]
-		//	AttrDeclaration: if true, struct/union/class is incomplete
-		// Children:
-		//	TagMember to describe one member.
-		//		AttrName: name of member [required]
-		//		AttrType: type of member [required]
-		//		AttrByteSize: size in bytes
-		//		AttrBitOffset: bit offset within bytes for bit fields
-		//		AttrBitSize: bit size for bit fields
-		//		AttrDataMemberLoc: location within struct [required for struct, class]
-		// There is much more to handle C++, all ignored for now.
-		t := new(StructType)
-		typ = t
-		typeCache[off] = t
-		switch e.Tag {
-		case TagClassType:
-			t.Kind = "class"
-		case TagStructType:
-			t.Kind = "struct"
-		case TagUnionType:
-			t.Kind = "union"
-		}
-		t.StructName, _ = e.Val(AttrName).(string)
-		t.Incomplete = e.Val(AttrDeclaration) != nil
-		t.Field = make([]*StructField, 0, 8)
-		var lastFieldType *Type
-		var lastFieldBitOffset int64
-		for kid := next(); kid != nil; kid = next() {
-			if kid.Tag == TagMember {
-				f := new(StructField)
-				if f.Type = typeOf(kid); err != nil {
-					goto Error
-				}
-				switch loc := kid.Val(AttrDataMemberLoc).(type) {
-				case []byte:
-					// TODO: Should have original compilation
-					// unit here, not unknownFormat.
-					b := makeBuf(d, unknownFormat{}, "location", 0, loc)
-					if b.uint8() != opPlusUconst {
-						err = DecodeError{name, kid.Offset, "unexpected opcode"}
-						goto Error
-					}
-					f.ByteOffset = int64(b.uint())
-					if b.err != nil {
-						err = b.err
-						goto Error
-					}
-				case int64:
-					f.ByteOffset = loc
-				}
-
-				haveBitOffset := false
-				f.Name, _ = kid.Val(AttrName).(string)
-				f.ByteSize, _ = kid.Val(AttrByteSize).(int64)
-				f.BitOffset, haveBitOffset = kid.Val(AttrBitOffset).(int64)
-				f.BitSize, _ = kid.Val(AttrBitSize).(int64)
-				t.Field = append(t.Field, f)
-
-				bito := f.BitOffset
-				if !haveBitOffset {
-					bito = f.ByteOffset * 8
-				}
-				if bito == lastFieldBitOffset && t.Kind != "union" {
-					// Last field was zero width.  Fix array length.
-					// (DWARF writes out 0-length arrays as if they were 1-length arrays.)
-					zeroArray(lastFieldType)
-				}
-				lastFieldType = &f.Type
-				lastFieldBitOffset = bito
-			}
-		}
-		if t.Kind != "union" {
-			b, ok := e.Val(AttrByteSize).(int64)
-			if ok && b*8 == lastFieldBitOffset {
-				// Final field must be zero width.  Fix array length.
-				zeroArray(lastFieldType)
-			}
-		}
-
-	case TagConstType, TagVolatileType, TagRestrictType:
-		// Type modifier (DWARF v2 §5.2)
-		// Attributes:
-		//	AttrType: subtype
-		t := new(QualType)
-		typ = t
-		typeCache[off] = t
-		if t.Type = typeOf(e); err != nil {
-			goto Error
-		}
-		switch e.Tag {
-		case TagConstType:
-			t.Qual = "const"
-		case TagRestrictType:
-			t.Qual = "restrict"
-		case TagVolatileType:
-			t.Qual = "volatile"
-		}
-
-	case TagEnumerationType:
-		// Enumeration type (DWARF v2 §5.6)
-		// Attributes:
-		//	AttrName: enum name if any
-		//	AttrByteSize: bytes required to represent largest value
-		// Children:
-		//	TagEnumerator:
-		//		AttrName: name of constant
-		//		AttrConstValue: value of constant
-		t := new(EnumType)
-		typ = t
-		typeCache[off] = t
-		t.EnumName, _ = e.Val(AttrName).(string)
-		t.Val = make([]*EnumValue, 0, 8)
-		for kid := next(); kid != nil; kid = next() {
-			if kid.Tag == TagEnumerator {
-				f := new(EnumValue)
-				f.Name, _ = kid.Val(AttrName).(string)
-				f.Val, _ = kid.Val(AttrConstValue).(int64)
-				n := len(t.Val)
-				if n >= cap(t.Val) {
-					val := make([]*EnumValue, n, n*2)
-					copy(val, t.Val)
-					t.Val = val
-				}
-				t.Val = t.Val[0 : n+1]
-				t.Val[n] = f
-			}
-		}
-
-	case TagPointerType:
-		// Type modifier (DWARF v2 §5.2)
-		// Attributes:
-		//	AttrType: subtype [not required!  void* has no AttrType]
-		//	AttrAddrClass: address class [ignored]
-		t := new(PtrType)
-		typ = t
-		typeCache[off] = t
-		if e.Val(AttrType) == nil {
-			t.Type = &VoidType{}
-			break
-		}
-		t.Type = typeOf(e)
-
-	case TagSubroutineType:
-		// Subroutine type.  (DWARF v2 §5.7)
-		// Attributes:
-		//	AttrType: type of return value if any
-		//	AttrName: possible name of type [ignored]
-		//	AttrPrototyped: whether used ANSI C prototype [ignored]
-		// Children:
-		//	TagFormalParameter: typed parameter
-		//		AttrType: type of parameter
-		//	TagUnspecifiedParameter: final ...
-		t := new(FuncType)
-		typ = t
-		typeCache[off] = t
-		if t.ReturnType = typeOf(e); err != nil {
-			goto Error
-		}
-		t.ParamType = make([]Type, 0, 8)
-		for kid := next(); kid != nil; kid = next() {
-			var tkid Type
-			switch kid.Tag {
-			default:
-				continue
-			case TagFormalParameter:
-				if tkid = typeOf(kid); err != nil {
-					goto Error
-				}
-			case TagUnspecifiedParameters:
-				tkid = &DotDotDotType{}
-			}
-			t.ParamType = append(t.ParamType, tkid)
-		}
-
-	case TagTypedef:
-		// Typedef (DWARF v2 §5.3)
-		// Attributes:
-		//	AttrName: name [required]
-		//	AttrType: type definition [required]
-		t := new(TypedefType)
-		typ = t
-		typeCache[off] = t
-		t.Name, _ = e.Val(AttrName).(string)
-		t.Type = typeOf(e)
-
-	case TagUnspecifiedType:
-		// Unspecified type (DWARF v3 §5.2)
-		// Attributes:
-		//	AttrName: name
-		t := new(UnspecifiedType)
-		typ = t
-		typeCache[off] = t
-		t.Name, _ = e.Val(AttrName).(string)
-	}
-
-	if err != nil {
-		goto Error
-	}
-
-	{
-		b, ok := e.Val(AttrByteSize).(int64)
-		if !ok {
-			b = -1
-			switch t := typ.(type) {
-			case *TypedefType:
-				b = t.Type.Size()
-			case *PtrType:
-				b = int64(addressSize)
-			}
-		}
-		typ.Common().ByteSize = b
-	}
-	return typ, nil
-
-Error:
-	// If the parse fails, take the type out of the cache
-	// so that the next call with this offset doesn't hit
-	// the cache and return success.
-	delete(typeCache, off)
-	return nil, err
-}
-
-func zeroArray(t *Type) {
-	if t == nil {
-		return
-	}
-	at, ok := (*t).(*ArrayType)
-	if !ok || at.Type.Size() == 0 {
-		return
-	}
-	// Make a copy to avoid invalidating typeCache.
-	tt := *at
-	tt.Count = 0
-	*t = &tt
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/type_test.go b/third_party/gofrontend/libgo/go/debug/dwarf/type_test.go
deleted file mode 100644
index 2cb85e7..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/type_test.go
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package dwarf_test
-
-import (
-	. "debug/dwarf"
-	"debug/elf"
-	"debug/macho"
-	"testing"
-)
-
-var typedefTests = map[string]string{
-	"t_ptr_volatile_int":                    "*volatile int",
-	"t_ptr_const_char":                      "*const char",
-	"t_long":                                "long int",
-	"t_ushort":                              "short unsigned int",
-	"t_func_int_of_float_double":            "func(float, double) int",
-	"t_ptr_func_int_of_float_double":        "*func(float, double) int",
-	"t_ptr_func_int_of_float_complex":       "*func(complex float) int",
-	"t_ptr_func_int_of_double_complex":      "*func(complex double) int",
-	"t_ptr_func_int_of_long_double_complex": "*func(complex long double) int",
-	"t_func_ptr_int_of_char_schar_uchar":    "func(char, signed char, unsigned char) *int",
-	"t_func_void_of_char":                   "func(char) void",
-	"t_func_void_of_void":                   "func() void",
-	"t_func_void_of_ptr_char_dots":          "func(*char, ...) void",
-	"t_my_struct":                           "struct my_struct {vi volatile int@0; x char@4 : 1@7; y int@4 : 4@27; z [0]int@8; array [40]long long int@8; zz [0]int@328}",
-	"t_my_struct1":                          "struct my_struct1 {zz [1]int@0}",
-	"t_my_union":                            "union my_union {vi volatile int@0; x char@0 : 1@7; y int@0 : 4@28; array [40]long long int@0}",
-	"t_my_enum":                             "enum my_enum {e1=1; e2=2; e3=-5; e4=1000000000000000}",
-	"t_my_list":                             "struct list {val short int@0; next *t_my_list@8}",
-	"t_my_tree":                             "struct tree {left *struct tree@0; right *struct tree@8; val long long unsigned int@16}",
-}
-
-// As Apple converts gcc to a clang-based front end
-// they keep breaking the DWARF output.  This map lists the
-// conversion from real answer to Apple answer.
-var machoBug = map[string]string{
-	"func(*char, ...) void":                                 "func(*char) void",
-	"enum my_enum {e1=1; e2=2; e3=-5; e4=1000000000000000}": "enum my_enum {e1=1; e2=2; e3=-5; e4=-1530494976}",
-}
-
-func elfData(t *testing.T, name string) *Data {
-	f, err := elf.Open(name)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	d, err := f.DWARF()
-	if err != nil {
-		t.Fatal(err)
-	}
-	return d
-}
-
-func machoData(t *testing.T, name string) *Data {
-	f, err := macho.Open(name)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	d, err := f.DWARF()
-	if err != nil {
-		t.Fatal(err)
-	}
-	return d
-}
-
-func TestTypedefsELF(t *testing.T) { testTypedefs(t, elfData(t, "testdata/typedef.elf"), "elf") }
-
-func TestTypedefsMachO(t *testing.T) {
-	testTypedefs(t, machoData(t, "testdata/typedef.macho"), "macho")
-}
-
-func TestTypedefsELFDwarf4(t *testing.T) { testTypedefs(t, elfData(t, "testdata/typedef.elf4"), "elf") }
-
-func testTypedefs(t *testing.T, d *Data, kind string) {
-	r := d.Reader()
-	seen := make(map[string]bool)
-	for {
-		e, err := r.Next()
-		if err != nil {
-			t.Fatal("r.Next:", err)
-		}
-		if e == nil {
-			break
-		}
-		if e.Tag == TagTypedef {
-			typ, err := d.Type(e.Offset)
-			if err != nil {
-				t.Fatal("d.Type:", err)
-			}
-			t1 := typ.(*TypedefType)
-			var typstr string
-			if ts, ok := t1.Type.(*StructType); ok {
-				typstr = ts.Defn()
-			} else {
-				typstr = t1.Type.String()
-			}
-
-			if want, ok := typedefTests[t1.Name]; ok {
-				if seen[t1.Name] {
-					t.Errorf("multiple definitions for %s", t1.Name)
-				}
-				seen[t1.Name] = true
-				if typstr != want && (kind != "macho" || typstr != machoBug[want]) {
-					t.Errorf("%s:\n\thave %s\n\twant %s", t1.Name, typstr, want)
-				}
-			}
-		}
-		if e.Tag != TagCompileUnit {
-			r.SkipChildren()
-		}
-	}
-
-	for k := range typedefTests {
-		if !seen[k] {
-			t.Errorf("missing %s", k)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/typeunit.go b/third_party/gofrontend/libgo/go/debug/dwarf/typeunit.go
deleted file mode 100644
index 9cfb4a8..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/typeunit.go
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package dwarf
-
-import (
-	"fmt"
-	"strconv"
-)
-
-// Parse the type units stored in a DWARF4 .debug_types section.  Each
-// type unit defines a single primary type and an 8-byte signature.
-// Other sections may then use formRefSig8 to refer to the type.
-
-// The typeUnit format is a single type with a signature.  It holds
-// the same data as a compilation unit.
-type typeUnit struct {
-	unit
-	toff  Offset // Offset to signature type within data.
-	name  string // Name of .debug_type section.
-	cache Type   // Cache the type, nil to start.
-}
-
-// Parse a .debug_types section.
-func (d *Data) parseTypes(name string, types []byte) error {
-	b := makeBuf(d, unknownFormat{}, name, 0, types)
-	for len(b.data) > 0 {
-		base := b.off
-		n, dwarf64 := b.unitLength()
-		if n != Offset(uint32(n)) {
-			b.error("type unit length overflow")
-			return b.err
-		}
-		hdroff := b.off
-		vers := int(b.uint16())
-		if vers != 4 {
-			b.error("unsupported DWARF version " + strconv.Itoa(vers))
-			return b.err
-		}
-		var ao uint32
-		if !dwarf64 {
-			ao = b.uint32()
-		} else {
-			ao64 := b.uint64()
-			if ao64 != uint64(uint32(ao64)) {
-				b.error("type unit abbrev offset overflow")
-				return b.err
-			}
-			ao = uint32(ao64)
-		}
-		atable, err := d.parseAbbrev(ao, vers)
-		if err != nil {
-			return err
-		}
-		asize := b.uint8()
-		sig := b.uint64()
-
-		var toff uint32
-		if !dwarf64 {
-			toff = b.uint32()
-		} else {
-			to64 := b.uint64()
-			if to64 != uint64(uint32(to64)) {
-				b.error("type unit type offset overflow")
-				return b.err
-			}
-			toff = uint32(to64)
-		}
-
-		boff := b.off
-		d.typeSigs[sig] = &typeUnit{
-			unit: unit{
-				base:   base,
-				off:    boff,
-				data:   b.bytes(int(n - (b.off - hdroff))),
-				atable: atable,
-				asize:  int(asize),
-				vers:   int(vers),
-				is64:   dwarf64,
-			},
-			toff: Offset(toff),
-			name: name,
-		}
-		if b.err != nil {
-			return b.err
-		}
-	}
-	return nil
-}
-
-// Return the type for a type signature.
-func (d *Data) sigToType(sig uint64) (Type, error) {
-	tu := d.typeSigs[sig]
-	if tu == nil {
-		return nil, fmt.Errorf("no type unit with signature %v", sig)
-	}
-	if tu.cache != nil {
-		return tu.cache, nil
-	}
-
-	b := makeBuf(d, tu, tu.name, tu.off, tu.data)
-	r := &typeUnitReader{d: d, tu: tu, b: b}
-	t, err := d.readType(tu.name, r, Offset(tu.toff), make(map[Offset]Type))
-	if err != nil {
-		return nil, err
-	}
-
-	tu.cache = t
-	return t, nil
-}
-
-// typeUnitReader is a typeReader for a tagTypeUnit.
-type typeUnitReader struct {
-	d   *Data
-	tu  *typeUnit
-	b   buf
-	err error
-}
-
-// Seek to a new position in the type unit.
-func (tur *typeUnitReader) Seek(off Offset) {
-	tur.err = nil
-	doff := off - tur.tu.off
-	if doff < 0 || doff >= Offset(len(tur.tu.data)) {
-		tur.err = fmt.Errorf("%s: offset %d out of range; max %d", tur.tu.name, doff, len(tur.tu.data))
-		return
-	}
-	tur.b = makeBuf(tur.d, tur.tu, tur.tu.name, off, tur.tu.data[doff:])
-}
-
-// AddressSize returns the size in bytes of addresses in the current type unit.
-func (tur *typeUnitReader) AddressSize() int {
-	return tur.tu.unit.asize
-}
-
-// Next reads the next Entry from the type unit.
-func (tur *typeUnitReader) Next() (*Entry, error) {
-	if tur.err != nil {
-		return nil, tur.err
-	}
-	if len(tur.tu.data) == 0 {
-		return nil, nil
-	}
-	e := tur.b.entry(tur.tu.atable, tur.tu.base)
-	if tur.b.err != nil {
-		tur.err = tur.b.err
-		return nil, tur.err
-	}
-	return e, nil
-}
-
-// clone returns a new reader for the type unit.
-func (tur *typeUnitReader) clone() typeReader {
-	return &typeUnitReader{
-		d:  tur.d,
-		tu: tur.tu,
-		b:  makeBuf(tur.d, tur.tu, tur.tu.name, tur.tu.off, tur.tu.data),
-	}
-}
-
-// offset returns the current offset.
-func (tur *typeUnitReader) offset() Offset {
-	return tur.b.off
-}
diff --git a/third_party/gofrontend/libgo/go/debug/dwarf/unit.go b/third_party/gofrontend/libgo/go/debug/dwarf/unit.go
deleted file mode 100644
index ceb6cdb..0000000
--- a/third_party/gofrontend/libgo/go/debug/dwarf/unit.go
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package dwarf
-
-import (
-	"sort"
-	"strconv"
-)
-
-// DWARF debug info is split into a sequence of compilation units.
-// Each unit has its own abbreviation table and address size.
-
-type unit struct {
-	base   Offset // byte offset of header within the aggregate info
-	off    Offset // byte offset of data within the aggregate info
-	data   []byte
-	atable abbrevTable
-	asize  int
-	vers   int
-	is64   bool // True for 64-bit DWARF format
-}
-
-// Implement the dataFormat interface.
-
-func (u *unit) version() int {
-	return u.vers
-}
-
-func (u *unit) dwarf64() (bool, bool) {
-	return u.is64, true
-}
-
-func (u *unit) addrsize() int {
-	return u.asize
-}
-
-func (d *Data) parseUnits() ([]unit, error) {
-	// Count units.
-	nunit := 0
-	b := makeBuf(d, unknownFormat{}, "info", 0, d.info)
-	for len(b.data) > 0 {
-		len, _ := b.unitLength()
-		if len != Offset(uint32(len)) {
-			b.error("unit length overflow")
-			break
-		}
-		b.skip(int(len))
-		nunit++
-	}
-	if b.err != nil {
-		return nil, b.err
-	}
-
-	// Again, this time writing them down.
-	b = makeBuf(d, unknownFormat{}, "info", 0, d.info)
-	units := make([]unit, nunit)
-	for i := range units {
-		u := &units[i]
-		u.base = b.off
-		var n Offset
-		n, u.is64 = b.unitLength()
-		vers := b.uint16()
-		if vers != 2 && vers != 3 && vers != 4 {
-			b.error("unsupported DWARF version " + strconv.Itoa(int(vers)))
-			break
-		}
-		u.vers = int(vers)
-		atable, err := d.parseAbbrev(b.uint32(), u.vers)
-		if err != nil {
-			if b.err == nil {
-				b.err = err
-			}
-			break
-		}
-		u.atable = atable
-		u.asize = int(b.uint8())
-		u.off = b.off
-		u.data = b.bytes(int(n - (2 + 4 + 1)))
-	}
-	if b.err != nil {
-		return nil, b.err
-	}
-	return units, nil
-}
-
-// offsetToUnit returns the index of the unit containing offset off.
-// It returns -1 if no unit contains this offset.
-func (d *Data) offsetToUnit(off Offset) int {
-	// Find the unit after off
-	next := sort.Search(len(d.unit), func(i int) bool {
-		return d.unit[i].off > off
-	})
-	if next == 0 {
-		return -1
-	}
-	u := &d.unit[next-1]
-	if u.off <= off && off < u.off+Offset(len(u.data)) {
-		return next - 1
-	}
-	return -1
-}
diff --git a/third_party/gofrontend/libgo/go/debug/elf/elf.go b/third_party/gofrontend/libgo/go/debug/elf/elf.go
deleted file mode 100644
index c97ccaa..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/elf.go
+++ /dev/null
@@ -1,2017 +0,0 @@
-/*
- * ELF constants and data structures
- *
- * Derived from:
- * $FreeBSD: src/sys/sys/elf32.h,v 1.8.14.1 2005/12/30 22:13:58 marcel Exp $
- * $FreeBSD: src/sys/sys/elf64.h,v 1.10.14.1 2005/12/30 22:13:58 marcel Exp $
- * $FreeBSD: src/sys/sys/elf_common.h,v 1.15.8.1 2005/12/30 22:13:58 marcel Exp $
- * $FreeBSD: src/sys/alpha/include/elf.h,v 1.14 2003/09/25 01:10:22 peter Exp $
- * $FreeBSD: src/sys/amd64/include/elf.h,v 1.18 2004/08/03 08:21:48 dfr Exp $
- * $FreeBSD: src/sys/arm/include/elf.h,v 1.5.2.1 2006/06/30 21:42:52 cognet Exp $
- * $FreeBSD: src/sys/i386/include/elf.h,v 1.16 2004/08/02 19:12:17 dfr Exp $
- * $FreeBSD: src/sys/powerpc/include/elf.h,v 1.7 2004/11/02 09:47:01 ssouhlal Exp $
- * $FreeBSD: src/sys/sparc64/include/elf.h,v 1.12 2003/09/25 01:10:26 peter Exp $
- * "ELF for the ARM® 64-bit Architecture (AArch64)" (ARM IHI 0056B)
- *
- * Copyright (c) 1996-1998 John D. Polstra.  All rights reserved.
- * Copyright (c) 2001 David E. O'Brien
- * Portions Copyright 2009 The Go Authors.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
- */
-
-package elf
-
-import "strconv"
-
-/*
- * Constants
- */
-
-// Indexes into the Header.Ident array.
-const (
-	EI_CLASS      = 4  /* Class of machine. */
-	EI_DATA       = 5  /* Data format. */
-	EI_VERSION    = 6  /* ELF format version. */
-	EI_OSABI      = 7  /* Operating system / ABI identification */
-	EI_ABIVERSION = 8  /* ABI version */
-	EI_PAD        = 9  /* Start of padding (per SVR4 ABI). */
-	EI_NIDENT     = 16 /* Size of e_ident array. */
-)
-
-// Initial magic number for ELF files.
-const ELFMAG = "\177ELF"
-
-// Version is found in Header.Ident[EI_VERSION] and Header.Version.
-type Version byte
-
-const (
-	EV_NONE    Version = 0
-	EV_CURRENT Version = 1
-)
-
-var versionStrings = []intName{
-	{0, "EV_NONE"},
-	{1, "EV_CURRENT"},
-}
-
-func (i Version) String() string   { return stringName(uint32(i), versionStrings, false) }
-func (i Version) GoString() string { return stringName(uint32(i), versionStrings, true) }
-
-// Class is found in Header.Ident[EI_CLASS] and Header.Class.
-type Class byte
-
-const (
-	ELFCLASSNONE Class = 0 /* Unknown class. */
-	ELFCLASS32   Class = 1 /* 32-bit architecture. */
-	ELFCLASS64   Class = 2 /* 64-bit architecture. */
-)
-
-var classStrings = []intName{
-	{0, "ELFCLASSNONE"},
-	{1, "ELFCLASS32"},
-	{2, "ELFCLASS64"},
-}
-
-func (i Class) String() string   { return stringName(uint32(i), classStrings, false) }
-func (i Class) GoString() string { return stringName(uint32(i), classStrings, true) }
-
-// Data is found in Header.Ident[EI_DATA] and Header.Data.
-type Data byte
-
-const (
-	ELFDATANONE Data = 0 /* Unknown data format. */
-	ELFDATA2LSB Data = 1 /* 2's complement little-endian. */
-	ELFDATA2MSB Data = 2 /* 2's complement big-endian. */
-)
-
-var dataStrings = []intName{
-	{0, "ELFDATANONE"},
-	{1, "ELFDATA2LSB"},
-	{2, "ELFDATA2MSB"},
-}
-
-func (i Data) String() string   { return stringName(uint32(i), dataStrings, false) }
-func (i Data) GoString() string { return stringName(uint32(i), dataStrings, true) }
-
-// OSABI is found in Header.Ident[EI_OSABI] and Header.OSABI.
-type OSABI byte
-
-const (
-	ELFOSABI_NONE       OSABI = 0   /* UNIX System V ABI */
-	ELFOSABI_HPUX       OSABI = 1   /* HP-UX operating system */
-	ELFOSABI_NETBSD     OSABI = 2   /* NetBSD */
-	ELFOSABI_LINUX      OSABI = 3   /* GNU/Linux */
-	ELFOSABI_HURD       OSABI = 4   /* GNU/Hurd */
-	ELFOSABI_86OPEN     OSABI = 5   /* 86Open common IA32 ABI */
-	ELFOSABI_SOLARIS    OSABI = 6   /* Solaris */
-	ELFOSABI_AIX        OSABI = 7   /* AIX */
-	ELFOSABI_IRIX       OSABI = 8   /* IRIX */
-	ELFOSABI_FREEBSD    OSABI = 9   /* FreeBSD */
-	ELFOSABI_TRU64      OSABI = 10  /* TRU64 UNIX */
-	ELFOSABI_MODESTO    OSABI = 11  /* Novell Modesto */
-	ELFOSABI_OPENBSD    OSABI = 12  /* OpenBSD */
-	ELFOSABI_OPENVMS    OSABI = 13  /* Open VMS */
-	ELFOSABI_NSK        OSABI = 14  /* HP Non-Stop Kernel */
-	ELFOSABI_ARM        OSABI = 97  /* ARM */
-	ELFOSABI_STANDALONE OSABI = 255 /* Standalone (embedded) application */
-)
-
-var osabiStrings = []intName{
-	{0, "ELFOSABI_NONE"},
-	{1, "ELFOSABI_HPUX"},
-	{2, "ELFOSABI_NETBSD"},
-	{3, "ELFOSABI_LINUX"},
-	{4, "ELFOSABI_HURD"},
-	{5, "ELFOSABI_86OPEN"},
-	{6, "ELFOSABI_SOLARIS"},
-	{7, "ELFOSABI_AIX"},
-	{8, "ELFOSABI_IRIX"},
-	{9, "ELFOSABI_FREEBSD"},
-	{10, "ELFOSABI_TRU64"},
-	{11, "ELFOSABI_MODESTO"},
-	{12, "ELFOSABI_OPENBSD"},
-	{13, "ELFOSABI_OPENVMS"},
-	{14, "ELFOSABI_NSK"},
-	{97, "ELFOSABI_ARM"},
-	{255, "ELFOSABI_STANDALONE"},
-}
-
-func (i OSABI) String() string   { return stringName(uint32(i), osabiStrings, false) }
-func (i OSABI) GoString() string { return stringName(uint32(i), osabiStrings, true) }
-
-// Type is found in Header.Type.
-type Type uint16
-
-const (
-	ET_NONE   Type = 0      /* Unknown type. */
-	ET_REL    Type = 1      /* Relocatable. */
-	ET_EXEC   Type = 2      /* Executable. */
-	ET_DYN    Type = 3      /* Shared object. */
-	ET_CORE   Type = 4      /* Core file. */
-	ET_LOOS   Type = 0xfe00 /* First operating system specific. */
-	ET_HIOS   Type = 0xfeff /* Last operating system-specific. */
-	ET_LOPROC Type = 0xff00 /* First processor-specific. */
-	ET_HIPROC Type = 0xffff /* Last processor-specific. */
-)
-
-var typeStrings = []intName{
-	{0, "ET_NONE"},
-	{1, "ET_REL"},
-	{2, "ET_EXEC"},
-	{3, "ET_DYN"},
-	{4, "ET_CORE"},
-	{0xfe00, "ET_LOOS"},
-	{0xfeff, "ET_HIOS"},
-	{0xff00, "ET_LOPROC"},
-	{0xffff, "ET_HIPROC"},
-}
-
-func (i Type) String() string   { return stringName(uint32(i), typeStrings, false) }
-func (i Type) GoString() string { return stringName(uint32(i), typeStrings, true) }
-
-// Machine is found in Header.Machine.
-type Machine uint16
-
-const (
-	EM_NONE        Machine = 0   /* Unknown machine. */
-	EM_M32         Machine = 1   /* AT&T WE32100. */
-	EM_SPARC       Machine = 2   /* Sun SPARC. */
-	EM_386         Machine = 3   /* Intel i386. */
-	EM_68K         Machine = 4   /* Motorola 68000. */
-	EM_88K         Machine = 5   /* Motorola 88000. */
-	EM_860         Machine = 7   /* Intel i860. */
-	EM_MIPS        Machine = 8   /* MIPS R3000 Big-Endian only. */
-	EM_S370        Machine = 9   /* IBM System/370. */
-	EM_MIPS_RS3_LE Machine = 10  /* MIPS R3000 Little-Endian. */
-	EM_PARISC      Machine = 15  /* HP PA-RISC. */
-	EM_VPP500      Machine = 17  /* Fujitsu VPP500. */
-	EM_SPARC32PLUS Machine = 18  /* SPARC v8plus. */
-	EM_960         Machine = 19  /* Intel 80960. */
-	EM_PPC         Machine = 20  /* PowerPC 32-bit. */
-	EM_PPC64       Machine = 21  /* PowerPC 64-bit. */
-	EM_S390        Machine = 22  /* IBM System/390. */
-	EM_V800        Machine = 36  /* NEC V800. */
-	EM_FR20        Machine = 37  /* Fujitsu FR20. */
-	EM_RH32        Machine = 38  /* TRW RH-32. */
-	EM_RCE         Machine = 39  /* Motorola RCE. */
-	EM_ARM         Machine = 40  /* ARM. */
-	EM_SH          Machine = 42  /* Hitachi SH. */
-	EM_SPARCV9     Machine = 43  /* SPARC v9 64-bit. */
-	EM_TRICORE     Machine = 44  /* Siemens TriCore embedded processor. */
-	EM_ARC         Machine = 45  /* Argonaut RISC Core. */
-	EM_H8_300      Machine = 46  /* Hitachi H8/300. */
-	EM_H8_300H     Machine = 47  /* Hitachi H8/300H. */
-	EM_H8S         Machine = 48  /* Hitachi H8S. */
-	EM_H8_500      Machine = 49  /* Hitachi H8/500. */
-	EM_IA_64       Machine = 50  /* Intel IA-64 Processor. */
-	EM_MIPS_X      Machine = 51  /* Stanford MIPS-X. */
-	EM_COLDFIRE    Machine = 52  /* Motorola ColdFire. */
-	EM_68HC12      Machine = 53  /* Motorola M68HC12. */
-	EM_MMA         Machine = 54  /* Fujitsu MMA. */
-	EM_PCP         Machine = 55  /* Siemens PCP. */
-	EM_NCPU        Machine = 56  /* Sony nCPU. */
-	EM_NDR1        Machine = 57  /* Denso NDR1 microprocessor. */
-	EM_STARCORE    Machine = 58  /* Motorola Star*Core processor. */
-	EM_ME16        Machine = 59  /* Toyota ME16 processor. */
-	EM_ST100       Machine = 60  /* STMicroelectronics ST100 processor. */
-	EM_TINYJ       Machine = 61  /* Advanced Logic Corp. TinyJ processor. */
-	EM_X86_64      Machine = 62  /* Advanced Micro Devices x86-64 */
-	EM_AARCH64     Machine = 183 /* ARM 64-bit Architecture (AArch64) */
-
-	/* Non-standard or deprecated. */
-	EM_486         Machine = 6      /* Intel i486. */
-	EM_MIPS_RS4_BE Machine = 10     /* MIPS R4000 Big-Endian */
-	EM_ALPHA_STD   Machine = 41     /* Digital Alpha (standard value). */
-	EM_ALPHA       Machine = 0x9026 /* Alpha (written in the absence of an ABI) */
-)
-
-var machineStrings = []intName{
-	{0, "EM_NONE"},
-	{1, "EM_M32"},
-	{2, "EM_SPARC"},
-	{3, "EM_386"},
-	{4, "EM_68K"},
-	{5, "EM_88K"},
-	{7, "EM_860"},
-	{8, "EM_MIPS"},
-	{9, "EM_S370"},
-	{10, "EM_MIPS_RS3_LE"},
-	{15, "EM_PARISC"},
-	{17, "EM_VPP500"},
-	{18, "EM_SPARC32PLUS"},
-	{19, "EM_960"},
-	{20, "EM_PPC"},
-	{21, "EM_PPC64"},
-	{22, "EM_S390"},
-	{36, "EM_V800"},
-	{37, "EM_FR20"},
-	{38, "EM_RH32"},
-	{39, "EM_RCE"},
-	{40, "EM_ARM"},
-	{42, "EM_SH"},
-	{43, "EM_SPARCV9"},
-	{44, "EM_TRICORE"},
-	{45, "EM_ARC"},
-	{46, "EM_H8_300"},
-	{47, "EM_H8_300H"},
-	{48, "EM_H8S"},
-	{49, "EM_H8_500"},
-	{50, "EM_IA_64"},
-	{51, "EM_MIPS_X"},
-	{52, "EM_COLDFIRE"},
-	{53, "EM_68HC12"},
-	{54, "EM_MMA"},
-	{55, "EM_PCP"},
-	{56, "EM_NCPU"},
-	{57, "EM_NDR1"},
-	{58, "EM_STARCORE"},
-	{59, "EM_ME16"},
-	{60, "EM_ST100"},
-	{61, "EM_TINYJ"},
-	{62, "EM_X86_64"},
-
-	/* Non-standard or deprecated. */
-	{6, "EM_486"},
-	{10, "EM_MIPS_RS4_BE"},
-	{41, "EM_ALPHA_STD"},
-	{0x9026, "EM_ALPHA"},
-}
-
-func (i Machine) String() string   { return stringName(uint32(i), machineStrings, false) }
-func (i Machine) GoString() string { return stringName(uint32(i), machineStrings, true) }
-
-// Special section indices.
-type SectionIndex int
-
-const (
-	SHN_UNDEF     SectionIndex = 0      /* Undefined, missing, irrelevant. */
-	SHN_LORESERVE SectionIndex = 0xff00 /* First of reserved range. */
-	SHN_LOPROC    SectionIndex = 0xff00 /* First processor-specific. */
-	SHN_HIPROC    SectionIndex = 0xff1f /* Last processor-specific. */
-	SHN_LOOS      SectionIndex = 0xff20 /* First operating system-specific. */
-	SHN_HIOS      SectionIndex = 0xff3f /* Last operating system-specific. */
-	SHN_ABS       SectionIndex = 0xfff1 /* Absolute values. */
-	SHN_COMMON    SectionIndex = 0xfff2 /* Common data. */
-	SHN_XINDEX    SectionIndex = 0xffff /* Escape; index stored elsewhere. */
-	SHN_HIRESERVE SectionIndex = 0xffff /* Last of reserved range. */
-)
-
-var shnStrings = []intName{
-	{0, "SHN_UNDEF"},
-	{0xff00, "SHN_LOPROC"},
-	{0xff20, "SHN_LOOS"},
-	{0xfff1, "SHN_ABS"},
-	{0xfff2, "SHN_COMMON"},
-	{0xffff, "SHN_XINDEX"},
-}
-
-func (i SectionIndex) String() string   { return stringName(uint32(i), shnStrings, false) }
-func (i SectionIndex) GoString() string { return stringName(uint32(i), shnStrings, true) }
-
-// Section type.
-type SectionType uint32
-
-const (
-	SHT_NULL           SectionType = 0          /* inactive */
-	SHT_PROGBITS       SectionType = 1          /* program defined information */
-	SHT_SYMTAB         SectionType = 2          /* symbol table section */
-	SHT_STRTAB         SectionType = 3          /* string table section */
-	SHT_RELA           SectionType = 4          /* relocation section with addends */
-	SHT_HASH           SectionType = 5          /* symbol hash table section */
-	SHT_DYNAMIC        SectionType = 6          /* dynamic section */
-	SHT_NOTE           SectionType = 7          /* note section */
-	SHT_NOBITS         SectionType = 8          /* no space section */
-	SHT_REL            SectionType = 9          /* relocation section - no addends */
-	SHT_SHLIB          SectionType = 10         /* reserved - purpose unknown */
-	SHT_DYNSYM         SectionType = 11         /* dynamic symbol table section */
-	SHT_INIT_ARRAY     SectionType = 14         /* Initialization function pointers. */
-	SHT_FINI_ARRAY     SectionType = 15         /* Termination function pointers. */
-	SHT_PREINIT_ARRAY  SectionType = 16         /* Pre-initialization function ptrs. */
-	SHT_GROUP          SectionType = 17         /* Section group. */
-	SHT_SYMTAB_SHNDX   SectionType = 18         /* Section indexes (see SHN_XINDEX). */
-	SHT_LOOS           SectionType = 0x60000000 /* First of OS specific semantics */
-	SHT_GNU_ATTRIBUTES SectionType = 0x6ffffff5 /* GNU object attributes */
-	SHT_GNU_HASH       SectionType = 0x6ffffff6 /* GNU hash table */
-	SHT_GNU_LIBLIST    SectionType = 0x6ffffff7 /* GNU prelink library list */
-	SHT_GNU_VERDEF     SectionType = 0x6ffffffd /* GNU version definition section */
-	SHT_GNU_VERNEED    SectionType = 0x6ffffffe /* GNU version needs section */
-	SHT_GNU_VERSYM     SectionType = 0x6fffffff /* GNU version symbol table */
-	SHT_HIOS           SectionType = 0x6fffffff /* Last of OS specific semantics */
-	SHT_LOPROC         SectionType = 0x70000000 /* reserved range for processor */
-	SHT_HIPROC         SectionType = 0x7fffffff /* specific section header types */
-	SHT_LOUSER         SectionType = 0x80000000 /* reserved range for application */
-	SHT_HIUSER         SectionType = 0xffffffff /* specific indexes */
-)
-
-var shtStrings = []intName{
-	{0, "SHT_NULL"},
-	{1, "SHT_PROGBITS"},
-	{2, "SHT_SYMTAB"},
-	{3, "SHT_STRTAB"},
-	{4, "SHT_RELA"},
-	{5, "SHT_HASH"},
-	{6, "SHT_DYNAMIC"},
-	{7, "SHT_NOTE"},
-	{8, "SHT_NOBITS"},
-	{9, "SHT_REL"},
-	{10, "SHT_SHLIB"},
-	{11, "SHT_DYNSYM"},
-	{14, "SHT_INIT_ARRAY"},
-	{15, "SHT_FINI_ARRAY"},
-	{16, "SHT_PREINIT_ARRAY"},
-	{17, "SHT_GROUP"},
-	{18, "SHT_SYMTAB_SHNDX"},
-	{0x60000000, "SHT_LOOS"},
-	{0x6ffffff5, "SHT_GNU_ATTRIBUTES"},
-	{0x6ffffff6, "SHT_GNU_HASH"},
-	{0x6ffffff7, "SHT_GNU_LIBLIST"},
-	{0x6ffffffd, "SHT_GNU_VERDEF"},
-	{0x6ffffffe, "SHT_GNU_VERNEED"},
-	{0x6fffffff, "SHT_GNU_VERSYM"},
-	{0x70000000, "SHT_LOPROC"},
-	{0x7fffffff, "SHT_HIPROC"},
-	{0x80000000, "SHT_LOUSER"},
-	{0xffffffff, "SHT_HIUSER"},
-}
-
-func (i SectionType) String() string   { return stringName(uint32(i), shtStrings, false) }
-func (i SectionType) GoString() string { return stringName(uint32(i), shtStrings, true) }
-
-// Section flags.
-type SectionFlag uint32
-
-const (
-	SHF_WRITE            SectionFlag = 0x1        /* Section contains writable data. */
-	SHF_ALLOC            SectionFlag = 0x2        /* Section occupies memory. */
-	SHF_EXECINSTR        SectionFlag = 0x4        /* Section contains instructions. */
-	SHF_MERGE            SectionFlag = 0x10       /* Section may be merged. */
-	SHF_STRINGS          SectionFlag = 0x20       /* Section contains strings. */
-	SHF_INFO_LINK        SectionFlag = 0x40       /* sh_info holds section index. */
-	SHF_LINK_ORDER       SectionFlag = 0x80       /* Special ordering requirements. */
-	SHF_OS_NONCONFORMING SectionFlag = 0x100      /* OS-specific processing required. */
-	SHF_GROUP            SectionFlag = 0x200      /* Member of section group. */
-	SHF_TLS              SectionFlag = 0x400      /* Section contains TLS data. */
-	SHF_MASKOS           SectionFlag = 0x0ff00000 /* OS-specific semantics. */
-	SHF_MASKPROC         SectionFlag = 0xf0000000 /* Processor-specific semantics. */
-)
-
-var shfStrings = []intName{
-	{0x1, "SHF_WRITE"},
-	{0x2, "SHF_ALLOC"},
-	{0x4, "SHF_EXECINSTR"},
-	{0x10, "SHF_MERGE"},
-	{0x20, "SHF_STRINGS"},
-	{0x40, "SHF_INFO_LINK"},
-	{0x80, "SHF_LINK_ORDER"},
-	{0x100, "SHF_OS_NONCONFORMING"},
-	{0x200, "SHF_GROUP"},
-	{0x400, "SHF_TLS"},
-}
-
-func (i SectionFlag) String() string   { return flagName(uint32(i), shfStrings, false) }
-func (i SectionFlag) GoString() string { return flagName(uint32(i), shfStrings, true) }
-
-// Prog.Type
-type ProgType int
-
-const (
-	PT_NULL    ProgType = 0          /* Unused entry. */
-	PT_LOAD    ProgType = 1          /* Loadable segment. */
-	PT_DYNAMIC ProgType = 2          /* Dynamic linking information segment. */
-	PT_INTERP  ProgType = 3          /* Pathname of interpreter. */
-	PT_NOTE    ProgType = 4          /* Auxiliary information. */
-	PT_SHLIB   ProgType = 5          /* Reserved (not used). */
-	PT_PHDR    ProgType = 6          /* Location of program header itself. */
-	PT_TLS     ProgType = 7          /* Thread local storage segment */
-	PT_LOOS    ProgType = 0x60000000 /* First OS-specific. */
-	PT_HIOS    ProgType = 0x6fffffff /* Last OS-specific. */
-	PT_LOPROC  ProgType = 0x70000000 /* First processor-specific type. */
-	PT_HIPROC  ProgType = 0x7fffffff /* Last processor-specific type. */
-)
-
-var ptStrings = []intName{
-	{0, "PT_NULL"},
-	{1, "PT_LOAD"},
-	{2, "PT_DYNAMIC"},
-	{3, "PT_INTERP"},
-	{4, "PT_NOTE"},
-	{5, "PT_SHLIB"},
-	{6, "PT_PHDR"},
-	{7, "PT_TLS"},
-	{0x60000000, "PT_LOOS"},
-	{0x6fffffff, "PT_HIOS"},
-	{0x70000000, "PT_LOPROC"},
-	{0x7fffffff, "PT_HIPROC"},
-}
-
-func (i ProgType) String() string   { return stringName(uint32(i), ptStrings, false) }
-func (i ProgType) GoString() string { return stringName(uint32(i), ptStrings, true) }
-
-// Prog.Flag
-type ProgFlag uint32
-
-const (
-	PF_X        ProgFlag = 0x1        /* Executable. */
-	PF_W        ProgFlag = 0x2        /* Writable. */
-	PF_R        ProgFlag = 0x4        /* Readable. */
-	PF_MASKOS   ProgFlag = 0x0ff00000 /* Operating system-specific. */
-	PF_MASKPROC ProgFlag = 0xf0000000 /* Processor-specific. */
-)
-
-var pfStrings = []intName{
-	{0x1, "PF_X"},
-	{0x2, "PF_W"},
-	{0x4, "PF_R"},
-}
-
-func (i ProgFlag) String() string   { return flagName(uint32(i), pfStrings, false) }
-func (i ProgFlag) GoString() string { return flagName(uint32(i), pfStrings, true) }
-
-// Dyn.Tag
-type DynTag int
-
-const (
-	DT_NULL         DynTag = 0  /* Terminating entry. */
-	DT_NEEDED       DynTag = 1  /* String table offset of a needed shared library. */
-	DT_PLTRELSZ     DynTag = 2  /* Total size in bytes of PLT relocations. */
-	DT_PLTGOT       DynTag = 3  /* Processor-dependent address. */
-	DT_HASH         DynTag = 4  /* Address of symbol hash table. */
-	DT_STRTAB       DynTag = 5  /* Address of string table. */
-	DT_SYMTAB       DynTag = 6  /* Address of symbol table. */
-	DT_RELA         DynTag = 7  /* Address of ElfNN_Rela relocations. */
-	DT_RELASZ       DynTag = 8  /* Total size of ElfNN_Rela relocations. */
-	DT_RELAENT      DynTag = 9  /* Size of each ElfNN_Rela relocation entry. */
-	DT_STRSZ        DynTag = 10 /* Size of string table. */
-	DT_SYMENT       DynTag = 11 /* Size of each symbol table entry. */
-	DT_INIT         DynTag = 12 /* Address of initialization function. */
-	DT_FINI         DynTag = 13 /* Address of finalization function. */
-	DT_SONAME       DynTag = 14 /* String table offset of shared object name. */
-	DT_RPATH        DynTag = 15 /* String table offset of library path. [sup] */
-	DT_SYMBOLIC     DynTag = 16 /* Indicates "symbolic" linking. [sup] */
-	DT_REL          DynTag = 17 /* Address of ElfNN_Rel relocations. */
-	DT_RELSZ        DynTag = 18 /* Total size of ElfNN_Rel relocations. */
-	DT_RELENT       DynTag = 19 /* Size of each ElfNN_Rel relocation. */
-	DT_PLTREL       DynTag = 20 /* Type of relocation used for PLT. */
-	DT_DEBUG        DynTag = 21 /* Reserved (not used). */
-	DT_TEXTREL      DynTag = 22 /* Indicates there may be relocations in non-writable segments. [sup] */
-	DT_JMPREL       DynTag = 23 /* Address of PLT relocations. */
-	DT_BIND_NOW     DynTag = 24 /* [sup] */
-	DT_INIT_ARRAY   DynTag = 25 /* Address of the array of pointers to initialization functions */
-	DT_FINI_ARRAY   DynTag = 26 /* Address of the array of pointers to termination functions */
-	DT_INIT_ARRAYSZ DynTag = 27 /* Size in bytes of the array of initialization functions. */
-	DT_FINI_ARRAYSZ DynTag = 28 /* Size in bytes of the array of termination functions. */
-	DT_RUNPATH      DynTag = 29 /* String table offset of a null-terminated library search path string. */
-	DT_FLAGS        DynTag = 30 /* Object specific flag values. */
-	DT_ENCODING     DynTag = 32 /* Values greater than or equal to DT_ENCODING
-	   and less than DT_LOOS follow the rules for
-	   the interpretation of the d_un union
-	   as follows: even == 'd_ptr', even == 'd_val'
-	   or none */
-	DT_PREINIT_ARRAY   DynTag = 32         /* Address of the array of pointers to pre-initialization functions. */
-	DT_PREINIT_ARRAYSZ DynTag = 33         /* Size in bytes of the array of pre-initialization functions. */
-	DT_LOOS            DynTag = 0x6000000d /* First OS-specific */
-	DT_HIOS            DynTag = 0x6ffff000 /* Last OS-specific */
-	DT_VERSYM          DynTag = 0x6ffffff0
-	DT_VERNEED         DynTag = 0x6ffffffe
-	DT_VERNEEDNUM      DynTag = 0x6fffffff
-	DT_LOPROC          DynTag = 0x70000000 /* First processor-specific type. */
-	DT_HIPROC          DynTag = 0x7fffffff /* Last processor-specific type. */
-)
-
-var dtStrings = []intName{
-	{0, "DT_NULL"},
-	{1, "DT_NEEDED"},
-	{2, "DT_PLTRELSZ"},
-	{3, "DT_PLTGOT"},
-	{4, "DT_HASH"},
-	{5, "DT_STRTAB"},
-	{6, "DT_SYMTAB"},
-	{7, "DT_RELA"},
-	{8, "DT_RELASZ"},
-	{9, "DT_RELAENT"},
-	{10, "DT_STRSZ"},
-	{11, "DT_SYMENT"},
-	{12, "DT_INIT"},
-	{13, "DT_FINI"},
-	{14, "DT_SONAME"},
-	{15, "DT_RPATH"},
-	{16, "DT_SYMBOLIC"},
-	{17, "DT_REL"},
-	{18, "DT_RELSZ"},
-	{19, "DT_RELENT"},
-	{20, "DT_PLTREL"},
-	{21, "DT_DEBUG"},
-	{22, "DT_TEXTREL"},
-	{23, "DT_JMPREL"},
-	{24, "DT_BIND_NOW"},
-	{25, "DT_INIT_ARRAY"},
-	{26, "DT_FINI_ARRAY"},
-	{27, "DT_INIT_ARRAYSZ"},
-	{28, "DT_FINI_ARRAYSZ"},
-	{29, "DT_RUNPATH"},
-	{30, "DT_FLAGS"},
-	{32, "DT_ENCODING"},
-	{32, "DT_PREINIT_ARRAY"},
-	{33, "DT_PREINIT_ARRAYSZ"},
-	{0x6000000d, "DT_LOOS"},
-	{0x6ffff000, "DT_HIOS"},
-	{0x6ffffff0, "DT_VERSYM"},
-	{0x6ffffffe, "DT_VERNEED"},
-	{0x6fffffff, "DT_VERNEEDNUM"},
-	{0x70000000, "DT_LOPROC"},
-	{0x7fffffff, "DT_HIPROC"},
-}
-
-func (i DynTag) String() string   { return stringName(uint32(i), dtStrings, false) }
-func (i DynTag) GoString() string { return stringName(uint32(i), dtStrings, true) }
-
-// DT_FLAGS values.
-type DynFlag int
-
-const (
-	DF_ORIGIN DynFlag = 0x0001 /* Indicates that the object being loaded may
-	   make reference to the
-	   $ORIGIN substitution string */
-	DF_SYMBOLIC DynFlag = 0x0002 /* Indicates "symbolic" linking. */
-	DF_TEXTREL  DynFlag = 0x0004 /* Indicates there may be relocations in non-writable segments. */
-	DF_BIND_NOW DynFlag = 0x0008 /* Indicates that the dynamic linker should
-	   process all relocations for the object
-	   containing this entry before transferring
-	   control to the program. */
-	DF_STATIC_TLS DynFlag = 0x0010 /* Indicates that the shared object or
-	   executable contains code using a static
-	   thread-local storage scheme. */
-)
-
-var dflagStrings = []intName{
-	{0x0001, "DF_ORIGIN"},
-	{0x0002, "DF_SYMBOLIC"},
-	{0x0004, "DF_TEXTREL"},
-	{0x0008, "DF_BIND_NOW"},
-	{0x0010, "DF_STATIC_TLS"},
-}
-
-func (i DynFlag) String() string   { return flagName(uint32(i), dflagStrings, false) }
-func (i DynFlag) GoString() string { return flagName(uint32(i), dflagStrings, true) }
-
-// NType values; used in core files.
-type NType int
-
-const (
-	NT_PRSTATUS NType = 1 /* Process status. */
-	NT_FPREGSET NType = 2 /* Floating point registers. */
-	NT_PRPSINFO NType = 3 /* Process state info. */
-)
-
-var ntypeStrings = []intName{
-	{1, "NT_PRSTATUS"},
-	{2, "NT_FPREGSET"},
-	{3, "NT_PRPSINFO"},
-}
-
-func (i NType) String() string   { return stringName(uint32(i), ntypeStrings, false) }
-func (i NType) GoString() string { return stringName(uint32(i), ntypeStrings, true) }
-
-/* Symbol Binding - ELFNN_ST_BIND - st_info */
-type SymBind int
-
-const (
-	STB_LOCAL  SymBind = 0  /* Local symbol */
-	STB_GLOBAL SymBind = 1  /* Global symbol */
-	STB_WEAK   SymBind = 2  /* like global - lower precedence */
-	STB_LOOS   SymBind = 10 /* Reserved range for operating system */
-	STB_HIOS   SymBind = 12 /*   specific semantics. */
-	STB_LOPROC SymBind = 13 /* reserved range for processor */
-	STB_HIPROC SymBind = 15 /*   specific semantics. */
-)
-
-var stbStrings = []intName{
-	{0, "STB_LOCAL"},
-	{1, "STB_GLOBAL"},
-	{2, "STB_WEAK"},
-	{10, "STB_LOOS"},
-	{12, "STB_HIOS"},
-	{13, "STB_LOPROC"},
-	{15, "STB_HIPROC"},
-}
-
-func (i SymBind) String() string   { return stringName(uint32(i), stbStrings, false) }
-func (i SymBind) GoString() string { return stringName(uint32(i), stbStrings, true) }
-
-/* Symbol type - ELFNN_ST_TYPE - st_info */
-type SymType int
-
-const (
-	STT_NOTYPE  SymType = 0  /* Unspecified type. */
-	STT_OBJECT  SymType = 1  /* Data object. */
-	STT_FUNC    SymType = 2  /* Function. */
-	STT_SECTION SymType = 3  /* Section. */
-	STT_FILE    SymType = 4  /* Source file. */
-	STT_COMMON  SymType = 5  /* Uninitialized common block. */
-	STT_TLS     SymType = 6  /* TLS object. */
-	STT_LOOS    SymType = 10 /* Reserved range for operating system */
-	STT_HIOS    SymType = 12 /*   specific semantics. */
-	STT_LOPROC  SymType = 13 /* reserved range for processor */
-	STT_HIPROC  SymType = 15 /*   specific semantics. */
-)
-
-var sttStrings = []intName{
-	{0, "STT_NOTYPE"},
-	{1, "STT_OBJECT"},
-	{2, "STT_FUNC"},
-	{3, "STT_SECTION"},
-	{4, "STT_FILE"},
-	{5, "STT_COMMON"},
-	{6, "STT_TLS"},
-	{10, "STT_LOOS"},
-	{12, "STT_HIOS"},
-	{13, "STT_LOPROC"},
-	{15, "STT_HIPROC"},
-}
-
-func (i SymType) String() string   { return stringName(uint32(i), sttStrings, false) }
-func (i SymType) GoString() string { return stringName(uint32(i), sttStrings, true) }
-
-/* Symbol visibility - ELFNN_ST_VISIBILITY - st_other */
-type SymVis int
-
-const (
-	STV_DEFAULT   SymVis = 0x0 /* Default visibility (see binding). */
-	STV_INTERNAL  SymVis = 0x1 /* Special meaning in relocatable objects. */
-	STV_HIDDEN    SymVis = 0x2 /* Not visible. */
-	STV_PROTECTED SymVis = 0x3 /* Visible but not preemptible. */
-)
-
-var stvStrings = []intName{
-	{0x0, "STV_DEFAULT"},
-	{0x1, "STV_INTERNAL"},
-	{0x2, "STV_HIDDEN"},
-	{0x3, "STV_PROTECTED"},
-}
-
-func (i SymVis) String() string   { return stringName(uint32(i), stvStrings, false) }
-func (i SymVis) GoString() string { return stringName(uint32(i), stvStrings, true) }
-
-/*
- * Relocation types.
- */
-
-// Relocation types for x86-64.
-type R_X86_64 int
-
-const (
-	R_X86_64_NONE     R_X86_64 = 0  /* No relocation. */
-	R_X86_64_64       R_X86_64 = 1  /* Add 64 bit symbol value. */
-	R_X86_64_PC32     R_X86_64 = 2  /* PC-relative 32 bit signed sym value. */
-	R_X86_64_GOT32    R_X86_64 = 3  /* PC-relative 32 bit GOT offset. */
-	R_X86_64_PLT32    R_X86_64 = 4  /* PC-relative 32 bit PLT offset. */
-	R_X86_64_COPY     R_X86_64 = 5  /* Copy data from shared object. */
-	R_X86_64_GLOB_DAT R_X86_64 = 6  /* Set GOT entry to data address. */
-	R_X86_64_JMP_SLOT R_X86_64 = 7  /* Set GOT entry to code address. */
-	R_X86_64_RELATIVE R_X86_64 = 8  /* Add load address of shared object. */
-	R_X86_64_GOTPCREL R_X86_64 = 9  /* Add 32 bit signed pcrel offset to GOT. */
-	R_X86_64_32       R_X86_64 = 10 /* Add 32 bit zero extended symbol value */
-	R_X86_64_32S      R_X86_64 = 11 /* Add 32 bit sign extended symbol value */
-	R_X86_64_16       R_X86_64 = 12 /* Add 16 bit zero extended symbol value */
-	R_X86_64_PC16     R_X86_64 = 13 /* Add 16 bit signed extended pc relative symbol value */
-	R_X86_64_8        R_X86_64 = 14 /* Add 8 bit zero extended symbol value */
-	R_X86_64_PC8      R_X86_64 = 15 /* Add 8 bit signed extended pc relative symbol value */
-	R_X86_64_DTPMOD64 R_X86_64 = 16 /* ID of module containing symbol */
-	R_X86_64_DTPOFF64 R_X86_64 = 17 /* Offset in TLS block */
-	R_X86_64_TPOFF64  R_X86_64 = 18 /* Offset in static TLS block */
-	R_X86_64_TLSGD    R_X86_64 = 19 /* PC relative offset to GD GOT entry */
-	R_X86_64_TLSLD    R_X86_64 = 20 /* PC relative offset to LD GOT entry */
-	R_X86_64_DTPOFF32 R_X86_64 = 21 /* Offset in TLS block */
-	R_X86_64_GOTTPOFF R_X86_64 = 22 /* PC relative offset to IE GOT entry */
-	R_X86_64_TPOFF32  R_X86_64 = 23 /* Offset in static TLS block */
-)
-
-var rx86_64Strings = []intName{
-	{0, "R_X86_64_NONE"},
-	{1, "R_X86_64_64"},
-	{2, "R_X86_64_PC32"},
-	{3, "R_X86_64_GOT32"},
-	{4, "R_X86_64_PLT32"},
-	{5, "R_X86_64_COPY"},
-	{6, "R_X86_64_GLOB_DAT"},
-	{7, "R_X86_64_JMP_SLOT"},
-	{8, "R_X86_64_RELATIVE"},
-	{9, "R_X86_64_GOTPCREL"},
-	{10, "R_X86_64_32"},
-	{11, "R_X86_64_32S"},
-	{12, "R_X86_64_16"},
-	{13, "R_X86_64_PC16"},
-	{14, "R_X86_64_8"},
-	{15, "R_X86_64_PC8"},
-	{16, "R_X86_64_DTPMOD64"},
-	{17, "R_X86_64_DTPOFF64"},
-	{18, "R_X86_64_TPOFF64"},
-	{19, "R_X86_64_TLSGD"},
-	{20, "R_X86_64_TLSLD"},
-	{21, "R_X86_64_DTPOFF32"},
-	{22, "R_X86_64_GOTTPOFF"},
-	{23, "R_X86_64_TPOFF32"},
-}
-
-func (i R_X86_64) String() string   { return stringName(uint32(i), rx86_64Strings, false) }
-func (i R_X86_64) GoString() string { return stringName(uint32(i), rx86_64Strings, true) }
-
-// Relocation types for AArch64 (aka arm64)
-type R_AARCH64 int
-
-const (
-	R_AARCH64_NONE                            R_AARCH64 = 0
-	R_AARCH64_P32_ABS32                       R_AARCH64 = 1
-	R_AARCH64_P32_ABS16                       R_AARCH64 = 2
-	R_AARCH64_P32_PREL32                      R_AARCH64 = 3
-	R_AARCH64_P32_PREL16                      R_AARCH64 = 4
-	R_AARCH64_P32_MOVW_UABS_G0                R_AARCH64 = 5
-	R_AARCH64_P32_MOVW_UABS_G0_NC             R_AARCH64 = 6
-	R_AARCH64_P32_MOVW_UABS_G1                R_AARCH64 = 7
-	R_AARCH64_P32_MOVW_SABS_G0                R_AARCH64 = 8
-	R_AARCH64_P32_LD_PREL_LO19                R_AARCH64 = 9
-	R_AARCH64_P32_ADR_PREL_LO21               R_AARCH64 = 10
-	R_AARCH64_P32_ADR_PREL_PG_HI21            R_AARCH64 = 11
-	R_AARCH64_P32_ADD_ABS_LO12_NC             R_AARCH64 = 12
-	R_AARCH64_P32_LDST8_ABS_LO12_NC           R_AARCH64 = 13
-	R_AARCH64_P32_LDST16_ABS_LO12_NC          R_AARCH64 = 14
-	R_AARCH64_P32_LDST32_ABS_LO12_NC          R_AARCH64 = 15
-	R_AARCH64_P32_LDST64_ABS_LO12_NC          R_AARCH64 = 16
-	R_AARCH64_P32_LDST128_ABS_LO12_NC         R_AARCH64 = 17
-	R_AARCH64_P32_TSTBR14                     R_AARCH64 = 18
-	R_AARCH64_P32_CONDBR19                    R_AARCH64 = 19
-	R_AARCH64_P32_JUMP26                      R_AARCH64 = 20
-	R_AARCH64_P32_CALL26                      R_AARCH64 = 21
-	R_AARCH64_P32_GOT_LD_PREL19               R_AARCH64 = 25
-	R_AARCH64_P32_ADR_GOT_PAGE                R_AARCH64 = 26
-	R_AARCH64_P32_LD32_GOT_LO12_NC            R_AARCH64 = 27
-	R_AARCH64_P32_TLSGD_ADR_PAGE21            R_AARCH64 = 81
-	R_AARCH64_P32_TLSGD_ADD_LO12_NC           R_AARCH64 = 82
-	R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21   R_AARCH64 = 103
-	R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC R_AARCH64 = 104
-	R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19    R_AARCH64 = 105
-	R_AARCH64_P32_TLSLE_MOVW_TPREL_G1         R_AARCH64 = 106
-	R_AARCH64_P32_TLSLE_MOVW_TPREL_G0         R_AARCH64 = 107
-	R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC      R_AARCH64 = 108
-	R_AARCH64_P32_TLSLE_ADD_TPREL_HI12        R_AARCH64 = 109
-	R_AARCH64_P32_TLSLE_ADD_TPREL_LO12        R_AARCH64 = 110
-	R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC     R_AARCH64 = 111
-	R_AARCH64_P32_TLSDESC_LD_PREL19           R_AARCH64 = 122
-	R_AARCH64_P32_TLSDESC_ADR_PREL21          R_AARCH64 = 123
-	R_AARCH64_P32_TLSDESC_ADR_PAGE21          R_AARCH64 = 124
-	R_AARCH64_P32_TLSDESC_LD32_LO12_NC        R_AARCH64 = 125
-	R_AARCH64_P32_TLSDESC_ADD_LO12_NC         R_AARCH64 = 126
-	R_AARCH64_P32_TLSDESC_CALL                R_AARCH64 = 127
-	R_AARCH64_P32_COPY                        R_AARCH64 = 180
-	R_AARCH64_P32_GLOB_DAT                    R_AARCH64 = 181
-	R_AARCH64_P32_JUMP_SLOT                   R_AARCH64 = 182
-	R_AARCH64_P32_RELATIVE                    R_AARCH64 = 183
-	R_AARCH64_P32_TLS_DTPMOD                  R_AARCH64 = 184
-	R_AARCH64_P32_TLS_DTPREL                  R_AARCH64 = 185
-	R_AARCH64_P32_TLS_TPREL                   R_AARCH64 = 186
-	R_AARCH64_P32_TLSDESC                     R_AARCH64 = 187
-	R_AARCH64_P32_IRELATIVE                   R_AARCH64 = 188
-	R_AARCH64_NULL                            R_AARCH64 = 256
-	R_AARCH64_ABS64                           R_AARCH64 = 257
-	R_AARCH64_ABS32                           R_AARCH64 = 258
-	R_AARCH64_ABS16                           R_AARCH64 = 259
-	R_AARCH64_PREL64                          R_AARCH64 = 260
-	R_AARCH64_PREL32                          R_AARCH64 = 261
-	R_AARCH64_PREL16                          R_AARCH64 = 262
-	R_AARCH64_MOVW_UABS_G0                    R_AARCH64 = 263
-	R_AARCH64_MOVW_UABS_G0_NC                 R_AARCH64 = 264
-	R_AARCH64_MOVW_UABS_G1                    R_AARCH64 = 265
-	R_AARCH64_MOVW_UABS_G1_NC                 R_AARCH64 = 266
-	R_AARCH64_MOVW_UABS_G2                    R_AARCH64 = 267
-	R_AARCH64_MOVW_UABS_G2_NC                 R_AARCH64 = 268
-	R_AARCH64_MOVW_UABS_G3                    R_AARCH64 = 269
-	R_AARCH64_MOVW_SABS_G0                    R_AARCH64 = 270
-	R_AARCH64_MOVW_SABS_G1                    R_AARCH64 = 271
-	R_AARCH64_MOVW_SABS_G2                    R_AARCH64 = 272
-	R_AARCH64_LD_PREL_LO19                    R_AARCH64 = 273
-	R_AARCH64_ADR_PREL_LO21                   R_AARCH64 = 274
-	R_AARCH64_ADR_PREL_PG_HI21                R_AARCH64 = 275
-	R_AARCH64_ADR_PREL_PG_HI21_NC             R_AARCH64 = 276
-	R_AARCH64_ADD_ABS_LO12_NC                 R_AARCH64 = 277
-	R_AARCH64_LDST8_ABS_LO12_NC               R_AARCH64 = 278
-	R_AARCH64_TSTBR14                         R_AARCH64 = 279
-	R_AARCH64_CONDBR19                        R_AARCH64 = 280
-	R_AARCH64_JUMP26                          R_AARCH64 = 282
-	R_AARCH64_CALL26                          R_AARCH64 = 283
-	R_AARCH64_LDST16_ABS_LO12_NC              R_AARCH64 = 284
-	R_AARCH64_LDST32_ABS_LO12_NC              R_AARCH64 = 285
-	R_AARCH64_LDST64_ABS_LO12_NC              R_AARCH64 = 286
-	R_AARCH64_LDST128_ABS_LO12_NC             R_AARCH64 = 299
-	R_AARCH64_GOT_LD_PREL19                   R_AARCH64 = 309
-	R_AARCH64_ADR_GOT_PAGE                    R_AARCH64 = 311
-	R_AARCH64_LD64_GOT_LO12_NC                R_AARCH64 = 312
-	R_AARCH64_TLSGD_ADR_PAGE21                R_AARCH64 = 513
-	R_AARCH64_TLSGD_ADD_LO12_NC               R_AARCH64 = 514
-	R_AARCH64_TLSIE_MOVW_GOTTPREL_G1          R_AARCH64 = 539
-	R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC       R_AARCH64 = 540
-	R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21       R_AARCH64 = 541
-	R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC     R_AARCH64 = 542
-	R_AARCH64_TLSIE_LD_GOTTPREL_PREL19        R_AARCH64 = 543
-	R_AARCH64_TLSLE_MOVW_TPREL_G2             R_AARCH64 = 544
-	R_AARCH64_TLSLE_MOVW_TPREL_G1             R_AARCH64 = 545
-	R_AARCH64_TLSLE_MOVW_TPREL_G1_NC          R_AARCH64 = 546
-	R_AARCH64_TLSLE_MOVW_TPREL_G0             R_AARCH64 = 547
-	R_AARCH64_TLSLE_MOVW_TPREL_G0_NC          R_AARCH64 = 548
-	R_AARCH64_TLSLE_ADD_TPREL_HI12            R_AARCH64 = 549
-	R_AARCH64_TLSLE_ADD_TPREL_LO12            R_AARCH64 = 550
-	R_AARCH64_TLSLE_ADD_TPREL_LO12_NC         R_AARCH64 = 551
-	R_AARCH64_TLSDESC_LD_PREL19               R_AARCH64 = 560
-	R_AARCH64_TLSDESC_ADR_PREL21              R_AARCH64 = 561
-	R_AARCH64_TLSDESC_ADR_PAGE21              R_AARCH64 = 562
-	R_AARCH64_TLSDESC_LD64_LO12_NC            R_AARCH64 = 563
-	R_AARCH64_TLSDESC_ADD_LO12_NC             R_AARCH64 = 564
-	R_AARCH64_TLSDESC_OFF_G1                  R_AARCH64 = 565
-	R_AARCH64_TLSDESC_OFF_G0_NC               R_AARCH64 = 566
-	R_AARCH64_TLSDESC_LDR                     R_AARCH64 = 567
-	R_AARCH64_TLSDESC_ADD                     R_AARCH64 = 568
-	R_AARCH64_TLSDESC_CALL                    R_AARCH64 = 569
-	R_AARCH64_COPY                            R_AARCH64 = 1024
-	R_AARCH64_GLOB_DAT                        R_AARCH64 = 1025
-	R_AARCH64_JUMP_SLOT                       R_AARCH64 = 1026
-	R_AARCH64_RELATIVE                        R_AARCH64 = 1027
-	R_AARCH64_TLS_DTPMOD64                    R_AARCH64 = 1028
-	R_AARCH64_TLS_DTPREL64                    R_AARCH64 = 1029
-	R_AARCH64_TLS_TPREL64                     R_AARCH64 = 1030
-	R_AARCH64_TLSDESC                         R_AARCH64 = 1031
-	R_AARCH64_IRELATIVE                       R_AARCH64 = 1032
-)
-
-var raarch64Strings = []intName{
-	{0, "R_AARCH64_NONE"},
-	{1, "R_AARCH64_P32_ABS32"},
-	{2, "R_AARCH64_P32_ABS16"},
-	{3, "R_AARCH64_P32_PREL32"},
-	{4, "R_AARCH64_P32_PREL16"},
-	{5, "R_AARCH64_P32_MOVW_UABS_G0"},
-	{6, "R_AARCH64_P32_MOVW_UABS_G0_NC"},
-	{7, "R_AARCH64_P32_MOVW_UABS_G1"},
-	{8, "R_AARCH64_P32_MOVW_SABS_G0"},
-	{9, "R_AARCH64_P32_LD_PREL_LO19"},
-	{10, "R_AARCH64_P32_ADR_PREL_LO21"},
-	{11, "R_AARCH64_P32_ADR_PREL_PG_HI21"},
-	{12, "R_AARCH64_P32_ADD_ABS_LO12_NC"},
-	{13, "R_AARCH64_P32_LDST8_ABS_LO12_NC"},
-	{14, "R_AARCH64_P32_LDST16_ABS_LO12_NC"},
-	{15, "R_AARCH64_P32_LDST32_ABS_LO12_NC"},
-	{16, "R_AARCH64_P32_LDST64_ABS_LO12_NC"},
-	{17, "R_AARCH64_P32_LDST128_ABS_LO12_NC"},
-	{18, "R_AARCH64_P32_TSTBR14"},
-	{19, "R_AARCH64_P32_CONDBR19"},
-	{20, "R_AARCH64_P32_JUMP26"},
-	{21, "R_AARCH64_P32_CALL26"},
-	{25, "R_AARCH64_P32_GOT_LD_PREL19"},
-	{26, "R_AARCH64_P32_ADR_GOT_PAGE"},
-	{27, "R_AARCH64_P32_LD32_GOT_LO12_NC"},
-	{81, "R_AARCH64_P32_TLSGD_ADR_PAGE21"},
-	{82, "R_AARCH64_P32_TLSGD_ADD_LO12_NC"},
-	{103, "R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21"},
-	{104, "R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC"},
-	{105, "R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19"},
-	{106, "R_AARCH64_P32_TLSLE_MOVW_TPREL_G1"},
-	{107, "R_AARCH64_P32_TLSLE_MOVW_TPREL_G0"},
-	{108, "R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC"},
-	{109, "R_AARCH64_P32_TLSLE_ADD_TPREL_HI12"},
-	{110, "R_AARCH64_P32_TLSLE_ADD_TPREL_LO12"},
-	{111, "R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC"},
-	{122, "R_AARCH64_P32_TLSDESC_LD_PREL19"},
-	{123, "R_AARCH64_P32_TLSDESC_ADR_PREL21"},
-	{124, "R_AARCH64_P32_TLSDESC_ADR_PAGE21"},
-	{125, "R_AARCH64_P32_TLSDESC_LD32_LO12_NC"},
-	{126, "R_AARCH64_P32_TLSDESC_ADD_LO12_NC"},
-	{127, "R_AARCH64_P32_TLSDESC_CALL"},
-	{180, "R_AARCH64_P32_COPY"},
-	{181, "R_AARCH64_P32_GLOB_DAT"},
-	{182, "R_AARCH64_P32_JUMP_SLOT"},
-	{183, "R_AARCH64_P32_RELATIVE"},
-	{184, "R_AARCH64_P32_TLS_DTPMOD"},
-	{185, "R_AARCH64_P32_TLS_DTPREL"},
-	{186, "R_AARCH64_P32_TLS_TPREL"},
-	{187, "R_AARCH64_P32_TLSDESC"},
-	{188, "R_AARCH64_P32_IRELATIVE"},
-	{256, "R_AARCH64_NULL"},
-	{257, "R_AARCH64_ABS64"},
-	{258, "R_AARCH64_ABS32"},
-	{259, "R_AARCH64_ABS16"},
-	{260, "R_AARCH64_PREL64"},
-	{261, "R_AARCH64_PREL32"},
-	{262, "R_AARCH64_PREL16"},
-	{263, "R_AARCH64_MOVW_UABS_G0"},
-	{264, "R_AARCH64_MOVW_UABS_G0_NC"},
-	{265, "R_AARCH64_MOVW_UABS_G1"},
-	{266, "R_AARCH64_MOVW_UABS_G1_NC"},
-	{267, "R_AARCH64_MOVW_UABS_G2"},
-	{268, "R_AARCH64_MOVW_UABS_G2_NC"},
-	{269, "R_AARCH64_MOVW_UABS_G3"},
-	{270, "R_AARCH64_MOVW_SABS_G0"},
-	{271, "R_AARCH64_MOVW_SABS_G1"},
-	{272, "R_AARCH64_MOVW_SABS_G2"},
-	{273, "R_AARCH64_LD_PREL_LO19"},
-	{274, "R_AARCH64_ADR_PREL_LO21"},
-	{275, "R_AARCH64_ADR_PREL_PG_HI21"},
-	{276, "R_AARCH64_ADR_PREL_PG_HI21_NC"},
-	{277, "R_AARCH64_ADD_ABS_LO12_NC"},
-	{278, "R_AARCH64_LDST8_ABS_LO12_NC"},
-	{279, "R_AARCH64_TSTBR14"},
-	{280, "R_AARCH64_CONDBR19"},
-	{282, "R_AARCH64_JUMP26"},
-	{283, "R_AARCH64_CALL26"},
-	{284, "R_AARCH64_LDST16_ABS_LO12_NC"},
-	{285, "R_AARCH64_LDST32_ABS_LO12_NC"},
-	{286, "R_AARCH64_LDST64_ABS_LO12_NC"},
-	{299, "R_AARCH64_LDST128_ABS_LO12_NC"},
-	{309, "R_AARCH64_GOT_LD_PREL19"},
-	{311, "R_AARCH64_ADR_GOT_PAGE"},
-	{312, "R_AARCH64_LD64_GOT_LO12_NC"},
-	{513, "R_AARCH64_TLSGD_ADR_PAGE21"},
-	{514, "R_AARCH64_TLSGD_ADD_LO12_NC"},
-	{539, "R_AARCH64_TLSIE_MOVW_GOTTPREL_G1"},
-	{540, "R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC"},
-	{541, "R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21"},
-	{542, "R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC"},
-	{543, "R_AARCH64_TLSIE_LD_GOTTPREL_PREL19"},
-	{544, "R_AARCH64_TLSLE_MOVW_TPREL_G2"},
-	{545, "R_AARCH64_TLSLE_MOVW_TPREL_G1"},
-	{546, "R_AARCH64_TLSLE_MOVW_TPREL_G1_NC"},
-	{547, "R_AARCH64_TLSLE_MOVW_TPREL_G0"},
-	{548, "R_AARCH64_TLSLE_MOVW_TPREL_G0_NC"},
-	{549, "R_AARCH64_TLSLE_ADD_TPREL_HI12"},
-	{550, "R_AARCH64_TLSLE_ADD_TPREL_LO12"},
-	{551, "R_AARCH64_TLSLE_ADD_TPREL_LO12_NC"},
-	{560, "R_AARCH64_TLSDESC_LD_PREL19"},
-	{561, "R_AARCH64_TLSDESC_ADR_PREL21"},
-	{562, "R_AARCH64_TLSDESC_ADR_PAGE21"},
-	{563, "R_AARCH64_TLSDESC_LD64_LO12_NC"},
-	{564, "R_AARCH64_TLSDESC_ADD_LO12_NC"},
-	{565, "R_AARCH64_TLSDESC_OFF_G1"},
-	{566, "R_AARCH64_TLSDESC_OFF_G0_NC"},
-	{567, "R_AARCH64_TLSDESC_LDR"},
-	{568, "R_AARCH64_TLSDESC_ADD"},
-	{569, "R_AARCH64_TLSDESC_CALL"},
-	{1024, "R_AARCH64_COPY"},
-	{1025, "R_AARCH64_GLOB_DAT"},
-	{1026, "R_AARCH64_JUMP_SLOT"},
-	{1027, "R_AARCH64_RELATIVE"},
-	{1028, "R_AARCH64_TLS_DTPMOD64"},
-	{1029, "R_AARCH64_TLS_DTPREL64"},
-	{1030, "R_AARCH64_TLS_TPREL64"},
-	{1031, "R_AARCH64_TLSDESC"},
-	{1032, "R_AARCH64_IRELATIVE"},
-}
-
-func (i R_AARCH64) String() string   { return stringName(uint32(i), raarch64Strings, false) }
-func (i R_AARCH64) GoString() string { return stringName(uint32(i), raarch64Strings, true) }
-
-// Relocation types for Alpha.
-type R_ALPHA int
-
-const (
-	R_ALPHA_NONE           R_ALPHA = 0  /* No reloc */
-	R_ALPHA_REFLONG        R_ALPHA = 1  /* Direct 32 bit */
-	R_ALPHA_REFQUAD        R_ALPHA = 2  /* Direct 64 bit */
-	R_ALPHA_GPREL32        R_ALPHA = 3  /* GP relative 32 bit */
-	R_ALPHA_LITERAL        R_ALPHA = 4  /* GP relative 16 bit w/optimization */
-	R_ALPHA_LITUSE         R_ALPHA = 5  /* Optimization hint for LITERAL */
-	R_ALPHA_GPDISP         R_ALPHA = 6  /* Add displacement to GP */
-	R_ALPHA_BRADDR         R_ALPHA = 7  /* PC+4 relative 23 bit shifted */
-	R_ALPHA_HINT           R_ALPHA = 8  /* PC+4 relative 16 bit shifted */
-	R_ALPHA_SREL16         R_ALPHA = 9  /* PC relative 16 bit */
-	R_ALPHA_SREL32         R_ALPHA = 10 /* PC relative 32 bit */
-	R_ALPHA_SREL64         R_ALPHA = 11 /* PC relative 64 bit */
-	R_ALPHA_OP_PUSH        R_ALPHA = 12 /* OP stack push */
-	R_ALPHA_OP_STORE       R_ALPHA = 13 /* OP stack pop and store */
-	R_ALPHA_OP_PSUB        R_ALPHA = 14 /* OP stack subtract */
-	R_ALPHA_OP_PRSHIFT     R_ALPHA = 15 /* OP stack right shift */
-	R_ALPHA_GPVALUE        R_ALPHA = 16
-	R_ALPHA_GPRELHIGH      R_ALPHA = 17
-	R_ALPHA_GPRELLOW       R_ALPHA = 18
-	R_ALPHA_IMMED_GP_16    R_ALPHA = 19
-	R_ALPHA_IMMED_GP_HI32  R_ALPHA = 20
-	R_ALPHA_IMMED_SCN_HI32 R_ALPHA = 21
-	R_ALPHA_IMMED_BR_HI32  R_ALPHA = 22
-	R_ALPHA_IMMED_LO32     R_ALPHA = 23
-	R_ALPHA_COPY           R_ALPHA = 24 /* Copy symbol at runtime */
-	R_ALPHA_GLOB_DAT       R_ALPHA = 25 /* Create GOT entry */
-	R_ALPHA_JMP_SLOT       R_ALPHA = 26 /* Create PLT entry */
-	R_ALPHA_RELATIVE       R_ALPHA = 27 /* Adjust by program base */
-)
-
-var ralphaStrings = []intName{
-	{0, "R_ALPHA_NONE"},
-	{1, "R_ALPHA_REFLONG"},
-	{2, "R_ALPHA_REFQUAD"},
-	{3, "R_ALPHA_GPREL32"},
-	{4, "R_ALPHA_LITERAL"},
-	{5, "R_ALPHA_LITUSE"},
-	{6, "R_ALPHA_GPDISP"},
-	{7, "R_ALPHA_BRADDR"},
-	{8, "R_ALPHA_HINT"},
-	{9, "R_ALPHA_SREL16"},
-	{10, "R_ALPHA_SREL32"},
-	{11, "R_ALPHA_SREL64"},
-	{12, "R_ALPHA_OP_PUSH"},
-	{13, "R_ALPHA_OP_STORE"},
-	{14, "R_ALPHA_OP_PSUB"},
-	{15, "R_ALPHA_OP_PRSHIFT"},
-	{16, "R_ALPHA_GPVALUE"},
-	{17, "R_ALPHA_GPRELHIGH"},
-	{18, "R_ALPHA_GPRELLOW"},
-	{19, "R_ALPHA_IMMED_GP_16"},
-	{20, "R_ALPHA_IMMED_GP_HI32"},
-	{21, "R_ALPHA_IMMED_SCN_HI32"},
-	{22, "R_ALPHA_IMMED_BR_HI32"},
-	{23, "R_ALPHA_IMMED_LO32"},
-	{24, "R_ALPHA_COPY"},
-	{25, "R_ALPHA_GLOB_DAT"},
-	{26, "R_ALPHA_JMP_SLOT"},
-	{27, "R_ALPHA_RELATIVE"},
-}
-
-func (i R_ALPHA) String() string   { return stringName(uint32(i), ralphaStrings, false) }
-func (i R_ALPHA) GoString() string { return stringName(uint32(i), ralphaStrings, true) }
-
-// Relocation types for ARM.
-type R_ARM int
-
-const (
-	R_ARM_NONE          R_ARM = 0 /* No relocation. */
-	R_ARM_PC24          R_ARM = 1
-	R_ARM_ABS32         R_ARM = 2
-	R_ARM_REL32         R_ARM = 3
-	R_ARM_PC13          R_ARM = 4
-	R_ARM_ABS16         R_ARM = 5
-	R_ARM_ABS12         R_ARM = 6
-	R_ARM_THM_ABS5      R_ARM = 7
-	R_ARM_ABS8          R_ARM = 8
-	R_ARM_SBREL32       R_ARM = 9
-	R_ARM_THM_PC22      R_ARM = 10
-	R_ARM_THM_PC8       R_ARM = 11
-	R_ARM_AMP_VCALL9    R_ARM = 12
-	R_ARM_SWI24         R_ARM = 13
-	R_ARM_THM_SWI8      R_ARM = 14
-	R_ARM_XPC25         R_ARM = 15
-	R_ARM_THM_XPC22     R_ARM = 16
-	R_ARM_COPY          R_ARM = 20 /* Copy data from shared object. */
-	R_ARM_GLOB_DAT      R_ARM = 21 /* Set GOT entry to data address. */
-	R_ARM_JUMP_SLOT     R_ARM = 22 /* Set GOT entry to code address. */
-	R_ARM_RELATIVE      R_ARM = 23 /* Add load address of shared object. */
-	R_ARM_GOTOFF        R_ARM = 24 /* Add GOT-relative symbol address. */
-	R_ARM_GOTPC         R_ARM = 25 /* Add PC-relative GOT table address. */
-	R_ARM_GOT32         R_ARM = 26 /* Add PC-relative GOT offset. */
-	R_ARM_PLT32         R_ARM = 27 /* Add PC-relative PLT offset. */
-	R_ARM_GNU_VTENTRY   R_ARM = 100
-	R_ARM_GNU_VTINHERIT R_ARM = 101
-	R_ARM_RSBREL32      R_ARM = 250
-	R_ARM_THM_RPC22     R_ARM = 251
-	R_ARM_RREL32        R_ARM = 252
-	R_ARM_RABS32        R_ARM = 253
-	R_ARM_RPC24         R_ARM = 254
-	R_ARM_RBASE         R_ARM = 255
-)
-
-var rarmStrings = []intName{
-	{0, "R_ARM_NONE"},
-	{1, "R_ARM_PC24"},
-	{2, "R_ARM_ABS32"},
-	{3, "R_ARM_REL32"},
-	{4, "R_ARM_PC13"},
-	{5, "R_ARM_ABS16"},
-	{6, "R_ARM_ABS12"},
-	{7, "R_ARM_THM_ABS5"},
-	{8, "R_ARM_ABS8"},
-	{9, "R_ARM_SBREL32"},
-	{10, "R_ARM_THM_PC22"},
-	{11, "R_ARM_THM_PC8"},
-	{12, "R_ARM_AMP_VCALL9"},
-	{13, "R_ARM_SWI24"},
-	{14, "R_ARM_THM_SWI8"},
-	{15, "R_ARM_XPC25"},
-	{16, "R_ARM_THM_XPC22"},
-	{20, "R_ARM_COPY"},
-	{21, "R_ARM_GLOB_DAT"},
-	{22, "R_ARM_JUMP_SLOT"},
-	{23, "R_ARM_RELATIVE"},
-	{24, "R_ARM_GOTOFF"},
-	{25, "R_ARM_GOTPC"},
-	{26, "R_ARM_GOT32"},
-	{27, "R_ARM_PLT32"},
-	{100, "R_ARM_GNU_VTENTRY"},
-	{101, "R_ARM_GNU_VTINHERIT"},
-	{250, "R_ARM_RSBREL32"},
-	{251, "R_ARM_THM_RPC22"},
-	{252, "R_ARM_RREL32"},
-	{253, "R_ARM_RABS32"},
-	{254, "R_ARM_RPC24"},
-	{255, "R_ARM_RBASE"},
-}
-
-func (i R_ARM) String() string   { return stringName(uint32(i), rarmStrings, false) }
-func (i R_ARM) GoString() string { return stringName(uint32(i), rarmStrings, true) }
-
-// Relocation types for 386.
-type R_386 int
-
-const (
-	R_386_NONE         R_386 = 0  /* No relocation. */
-	R_386_32           R_386 = 1  /* Add symbol value. */
-	R_386_PC32         R_386 = 2  /* Add PC-relative symbol value. */
-	R_386_GOT32        R_386 = 3  /* Add PC-relative GOT offset. */
-	R_386_PLT32        R_386 = 4  /* Add PC-relative PLT offset. */
-	R_386_COPY         R_386 = 5  /* Copy data from shared object. */
-	R_386_GLOB_DAT     R_386 = 6  /* Set GOT entry to data address. */
-	R_386_JMP_SLOT     R_386 = 7  /* Set GOT entry to code address. */
-	R_386_RELATIVE     R_386 = 8  /* Add load address of shared object. */
-	R_386_GOTOFF       R_386 = 9  /* Add GOT-relative symbol address. */
-	R_386_GOTPC        R_386 = 10 /* Add PC-relative GOT table address. */
-	R_386_TLS_TPOFF    R_386 = 14 /* Negative offset in static TLS block */
-	R_386_TLS_IE       R_386 = 15 /* Absolute address of GOT for -ve static TLS */
-	R_386_TLS_GOTIE    R_386 = 16 /* GOT entry for negative static TLS block */
-	R_386_TLS_LE       R_386 = 17 /* Negative offset relative to static TLS */
-	R_386_TLS_GD       R_386 = 18 /* 32 bit offset to GOT (index,off) pair */
-	R_386_TLS_LDM      R_386 = 19 /* 32 bit offset to GOT (index,zero) pair */
-	R_386_TLS_GD_32    R_386 = 24 /* 32 bit offset to GOT (index,off) pair */
-	R_386_TLS_GD_PUSH  R_386 = 25 /* pushl instruction for Sun ABI GD sequence */
-	R_386_TLS_GD_CALL  R_386 = 26 /* call instruction for Sun ABI GD sequence */
-	R_386_TLS_GD_POP   R_386 = 27 /* popl instruction for Sun ABI GD sequence */
-	R_386_TLS_LDM_32   R_386 = 28 /* 32 bit offset to GOT (index,zero) pair */
-	R_386_TLS_LDM_PUSH R_386 = 29 /* pushl instruction for Sun ABI LD sequence */
-	R_386_TLS_LDM_CALL R_386 = 30 /* call instruction for Sun ABI LD sequence */
-	R_386_TLS_LDM_POP  R_386 = 31 /* popl instruction for Sun ABI LD sequence */
-	R_386_TLS_LDO_32   R_386 = 32 /* 32 bit offset from start of TLS block */
-	R_386_TLS_IE_32    R_386 = 33 /* 32 bit offset to GOT static TLS offset entry */
-	R_386_TLS_LE_32    R_386 = 34 /* 32 bit offset within static TLS block */
-	R_386_TLS_DTPMOD32 R_386 = 35 /* GOT entry containing TLS index */
-	R_386_TLS_DTPOFF32 R_386 = 36 /* GOT entry containing TLS offset */
-	R_386_TLS_TPOFF32  R_386 = 37 /* GOT entry of -ve static TLS offset */
-)
-
-var r386Strings = []intName{
-	{0, "R_386_NONE"},
-	{1, "R_386_32"},
-	{2, "R_386_PC32"},
-	{3, "R_386_GOT32"},
-	{4, "R_386_PLT32"},
-	{5, "R_386_COPY"},
-	{6, "R_386_GLOB_DAT"},
-	{7, "R_386_JMP_SLOT"},
-	{8, "R_386_RELATIVE"},
-	{9, "R_386_GOTOFF"},
-	{10, "R_386_GOTPC"},
-	{14, "R_386_TLS_TPOFF"},
-	{15, "R_386_TLS_IE"},
-	{16, "R_386_TLS_GOTIE"},
-	{17, "R_386_TLS_LE"},
-	{18, "R_386_TLS_GD"},
-	{19, "R_386_TLS_LDM"},
-	{24, "R_386_TLS_GD_32"},
-	{25, "R_386_TLS_GD_PUSH"},
-	{26, "R_386_TLS_GD_CALL"},
-	{27, "R_386_TLS_GD_POP"},
-	{28, "R_386_TLS_LDM_32"},
-	{29, "R_386_TLS_LDM_PUSH"},
-	{30, "R_386_TLS_LDM_CALL"},
-	{31, "R_386_TLS_LDM_POP"},
-	{32, "R_386_TLS_LDO_32"},
-	{33, "R_386_TLS_IE_32"},
-	{34, "R_386_TLS_LE_32"},
-	{35, "R_386_TLS_DTPMOD32"},
-	{36, "R_386_TLS_DTPOFF32"},
-	{37, "R_386_TLS_TPOFF32"},
-}
-
-func (i R_386) String() string   { return stringName(uint32(i), r386Strings, false) }
-func (i R_386) GoString() string { return stringName(uint32(i), r386Strings, true) }
-
-// Relocation types for PowerPC.
-type R_PPC int
-
-const (
-	R_PPC_NONE            R_PPC = 0 /* No relocation. */
-	R_PPC_ADDR32          R_PPC = 1
-	R_PPC_ADDR24          R_PPC = 2
-	R_PPC_ADDR16          R_PPC = 3
-	R_PPC_ADDR16_LO       R_PPC = 4
-	R_PPC_ADDR16_HI       R_PPC = 5
-	R_PPC_ADDR16_HA       R_PPC = 6
-	R_PPC_ADDR14          R_PPC = 7
-	R_PPC_ADDR14_BRTAKEN  R_PPC = 8
-	R_PPC_ADDR14_BRNTAKEN R_PPC = 9
-	R_PPC_REL24           R_PPC = 10
-	R_PPC_REL14           R_PPC = 11
-	R_PPC_REL14_BRTAKEN   R_PPC = 12
-	R_PPC_REL14_BRNTAKEN  R_PPC = 13
-	R_PPC_GOT16           R_PPC = 14
-	R_PPC_GOT16_LO        R_PPC = 15
-	R_PPC_GOT16_HI        R_PPC = 16
-	R_PPC_GOT16_HA        R_PPC = 17
-	R_PPC_PLTREL24        R_PPC = 18
-	R_PPC_COPY            R_PPC = 19
-	R_PPC_GLOB_DAT        R_PPC = 20
-	R_PPC_JMP_SLOT        R_PPC = 21
-	R_PPC_RELATIVE        R_PPC = 22
-	R_PPC_LOCAL24PC       R_PPC = 23
-	R_PPC_UADDR32         R_PPC = 24
-	R_PPC_UADDR16         R_PPC = 25
-	R_PPC_REL32           R_PPC = 26
-	R_PPC_PLT32           R_PPC = 27
-	R_PPC_PLTREL32        R_PPC = 28
-	R_PPC_PLT16_LO        R_PPC = 29
-	R_PPC_PLT16_HI        R_PPC = 30
-	R_PPC_PLT16_HA        R_PPC = 31
-	R_PPC_SDAREL16        R_PPC = 32
-	R_PPC_SECTOFF         R_PPC = 33
-	R_PPC_SECTOFF_LO      R_PPC = 34
-	R_PPC_SECTOFF_HI      R_PPC = 35
-	R_PPC_SECTOFF_HA      R_PPC = 36
-	R_PPC_TLS             R_PPC = 67
-	R_PPC_DTPMOD32        R_PPC = 68
-	R_PPC_TPREL16         R_PPC = 69
-	R_PPC_TPREL16_LO      R_PPC = 70
-	R_PPC_TPREL16_HI      R_PPC = 71
-	R_PPC_TPREL16_HA      R_PPC = 72
-	R_PPC_TPREL32         R_PPC = 73
-	R_PPC_DTPREL16        R_PPC = 74
-	R_PPC_DTPREL16_LO     R_PPC = 75
-	R_PPC_DTPREL16_HI     R_PPC = 76
-	R_PPC_DTPREL16_HA     R_PPC = 77
-	R_PPC_DTPREL32        R_PPC = 78
-	R_PPC_GOT_TLSGD16     R_PPC = 79
-	R_PPC_GOT_TLSGD16_LO  R_PPC = 80
-	R_PPC_GOT_TLSGD16_HI  R_PPC = 81
-	R_PPC_GOT_TLSGD16_HA  R_PPC = 82
-	R_PPC_GOT_TLSLD16     R_PPC = 83
-	R_PPC_GOT_TLSLD16_LO  R_PPC = 84
-	R_PPC_GOT_TLSLD16_HI  R_PPC = 85
-	R_PPC_GOT_TLSLD16_HA  R_PPC = 86
-	R_PPC_GOT_TPREL16     R_PPC = 87
-	R_PPC_GOT_TPREL16_LO  R_PPC = 88
-	R_PPC_GOT_TPREL16_HI  R_PPC = 89
-	R_PPC_GOT_TPREL16_HA  R_PPC = 90
-	R_PPC_EMB_NADDR32     R_PPC = 101
-	R_PPC_EMB_NADDR16     R_PPC = 102
-	R_PPC_EMB_NADDR16_LO  R_PPC = 103
-	R_PPC_EMB_NADDR16_HI  R_PPC = 104
-	R_PPC_EMB_NADDR16_HA  R_PPC = 105
-	R_PPC_EMB_SDAI16      R_PPC = 106
-	R_PPC_EMB_SDA2I16     R_PPC = 107
-	R_PPC_EMB_SDA2REL     R_PPC = 108
-	R_PPC_EMB_SDA21       R_PPC = 109
-	R_PPC_EMB_MRKREF      R_PPC = 110
-	R_PPC_EMB_RELSEC16    R_PPC = 111
-	R_PPC_EMB_RELST_LO    R_PPC = 112
-	R_PPC_EMB_RELST_HI    R_PPC = 113
-	R_PPC_EMB_RELST_HA    R_PPC = 114
-	R_PPC_EMB_BIT_FLD     R_PPC = 115
-	R_PPC_EMB_RELSDA      R_PPC = 116
-)
-
-var rppcStrings = []intName{
-	{0, "R_PPC_NONE"},
-	{1, "R_PPC_ADDR32"},
-	{2, "R_PPC_ADDR24"},
-	{3, "R_PPC_ADDR16"},
-	{4, "R_PPC_ADDR16_LO"},
-	{5, "R_PPC_ADDR16_HI"},
-	{6, "R_PPC_ADDR16_HA"},
-	{7, "R_PPC_ADDR14"},
-	{8, "R_PPC_ADDR14_BRTAKEN"},
-	{9, "R_PPC_ADDR14_BRNTAKEN"},
-	{10, "R_PPC_REL24"},
-	{11, "R_PPC_REL14"},
-	{12, "R_PPC_REL14_BRTAKEN"},
-	{13, "R_PPC_REL14_BRNTAKEN"},
-	{14, "R_PPC_GOT16"},
-	{15, "R_PPC_GOT16_LO"},
-	{16, "R_PPC_GOT16_HI"},
-	{17, "R_PPC_GOT16_HA"},
-	{18, "R_PPC_PLTREL24"},
-	{19, "R_PPC_COPY"},
-	{20, "R_PPC_GLOB_DAT"},
-	{21, "R_PPC_JMP_SLOT"},
-	{22, "R_PPC_RELATIVE"},
-	{23, "R_PPC_LOCAL24PC"},
-	{24, "R_PPC_UADDR32"},
-	{25, "R_PPC_UADDR16"},
-	{26, "R_PPC_REL32"},
-	{27, "R_PPC_PLT32"},
-	{28, "R_PPC_PLTREL32"},
-	{29, "R_PPC_PLT16_LO"},
-	{30, "R_PPC_PLT16_HI"},
-	{31, "R_PPC_PLT16_HA"},
-	{32, "R_PPC_SDAREL16"},
-	{33, "R_PPC_SECTOFF"},
-	{34, "R_PPC_SECTOFF_LO"},
-	{35, "R_PPC_SECTOFF_HI"},
-	{36, "R_PPC_SECTOFF_HA"},
-
-	{67, "R_PPC_TLS"},
-	{68, "R_PPC_DTPMOD32"},
-	{69, "R_PPC_TPREL16"},
-	{70, "R_PPC_TPREL16_LO"},
-	{71, "R_PPC_TPREL16_HI"},
-	{72, "R_PPC_TPREL16_HA"},
-	{73, "R_PPC_TPREL32"},
-	{74, "R_PPC_DTPREL16"},
-	{75, "R_PPC_DTPREL16_LO"},
-	{76, "R_PPC_DTPREL16_HI"},
-	{77, "R_PPC_DTPREL16_HA"},
-	{78, "R_PPC_DTPREL32"},
-	{79, "R_PPC_GOT_TLSGD16"},
-	{80, "R_PPC_GOT_TLSGD16_LO"},
-	{81, "R_PPC_GOT_TLSGD16_HI"},
-	{82, "R_PPC_GOT_TLSGD16_HA"},
-	{83, "R_PPC_GOT_TLSLD16"},
-	{84, "R_PPC_GOT_TLSLD16_LO"},
-	{85, "R_PPC_GOT_TLSLD16_HI"},
-	{86, "R_PPC_GOT_TLSLD16_HA"},
-	{87, "R_PPC_GOT_TPREL16"},
-	{88, "R_PPC_GOT_TPREL16_LO"},
-	{89, "R_PPC_GOT_TPREL16_HI"},
-	{90, "R_PPC_GOT_TPREL16_HA"},
-
-	{101, "R_PPC_EMB_NADDR32"},
-	{102, "R_PPC_EMB_NADDR16"},
-	{103, "R_PPC_EMB_NADDR16_LO"},
-	{104, "R_PPC_EMB_NADDR16_HI"},
-	{105, "R_PPC_EMB_NADDR16_HA"},
-	{106, "R_PPC_EMB_SDAI16"},
-	{107, "R_PPC_EMB_SDA2I16"},
-	{108, "R_PPC_EMB_SDA2REL"},
-	{109, "R_PPC_EMB_SDA21"},
-	{110, "R_PPC_EMB_MRKREF"},
-	{111, "R_PPC_EMB_RELSEC16"},
-	{112, "R_PPC_EMB_RELST_LO"},
-	{113, "R_PPC_EMB_RELST_HI"},
-	{114, "R_PPC_EMB_RELST_HA"},
-	{115, "R_PPC_EMB_BIT_FLD"},
-	{116, "R_PPC_EMB_RELSDA"},
-}
-
-func (i R_PPC) String() string   { return stringName(uint32(i), rppcStrings, false) }
-func (i R_PPC) GoString() string { return stringName(uint32(i), rppcStrings, true) }
-
-// Relocation types for 64-bit PowerPC or Power Architecture processors.
-type R_PPC64 int
-
-const (
-	R_PPC64_NONE               R_PPC64 = 0
-	R_PPC64_ADDR32             R_PPC64 = 1
-	R_PPC64_ADDR24             R_PPC64 = 2
-	R_PPC64_ADDR16             R_PPC64 = 3
-	R_PPC64_ADDR16_LO          R_PPC64 = 4
-	R_PPC64_ADDR16_HI          R_PPC64 = 5
-	R_PPC64_ADDR16_HA          R_PPC64 = 6
-	R_PPC64_ADDR14             R_PPC64 = 7
-	R_PPC64_ADDR14_BRTAKEN     R_PPC64 = 8
-	R_PPC64_ADDR14_BRNTAKEN    R_PPC64 = 9
-	R_PPC64_REL24              R_PPC64 = 10
-	R_PPC64_REL14              R_PPC64 = 11
-	R_PPC64_REL14_BRTAKEN      R_PPC64 = 12
-	R_PPC64_REL14_BRNTAKEN     R_PPC64 = 13
-	R_PPC64_GOT16              R_PPC64 = 14
-	R_PPC64_GOT16_LO           R_PPC64 = 15
-	R_PPC64_GOT16_HI           R_PPC64 = 16
-	R_PPC64_GOT16_HA           R_PPC64 = 17
-	R_PPC64_JMP_SLOT           R_PPC64 = 21
-	R_PPC64_REL32              R_PPC64 = 26
-	R_PPC64_ADDR64             R_PPC64 = 38
-	R_PPC64_ADDR16_HIGHER      R_PPC64 = 39
-	R_PPC64_ADDR16_HIGHERA     R_PPC64 = 40
-	R_PPC64_ADDR16_HIGHEST     R_PPC64 = 41
-	R_PPC64_ADDR16_HIGHESTA    R_PPC64 = 42
-	R_PPC64_REL64              R_PPC64 = 44
-	R_PPC64_TOC16              R_PPC64 = 47
-	R_PPC64_TOC16_LO           R_PPC64 = 48
-	R_PPC64_TOC16_HI           R_PPC64 = 49
-	R_PPC64_TOC16_HA           R_PPC64 = 50
-	R_PPC64_TOC                R_PPC64 = 51
-	R_PPC64_ADDR16_DS          R_PPC64 = 56
-	R_PPC64_ADDR16_LO_DS       R_PPC64 = 57
-	R_PPC64_GOT16_DS           R_PPC64 = 58
-	R_PPC64_GOT16_LO_DS        R_PPC64 = 59
-	R_PPC64_TOC16_DS           R_PPC64 = 63
-	R_PPC64_TOC16_LO_DS        R_PPC64 = 64
-	R_PPC64_TLS                R_PPC64 = 67
-	R_PPC64_DTPMOD64           R_PPC64 = 68
-	R_PPC64_TPREL16            R_PPC64 = 69
-	R_PPC64_TPREL16_LO         R_PPC64 = 70
-	R_PPC64_TPREL16_HI         R_PPC64 = 71
-	R_PPC64_TPREL16_HA         R_PPC64 = 72
-	R_PPC64_TPREL64            R_PPC64 = 73
-	R_PPC64_DTPREL16           R_PPC64 = 74
-	R_PPC64_DTPREL16_LO        R_PPC64 = 75
-	R_PPC64_DTPREL16_HI        R_PPC64 = 76
-	R_PPC64_DTPREL16_HA        R_PPC64 = 77
-	R_PPC64_DTPREL64           R_PPC64 = 78
-	R_PPC64_GOT_TLSGD16        R_PPC64 = 79
-	R_PPC64_GOT_TLSGD16_LO     R_PPC64 = 80
-	R_PPC64_GOT_TLSGD16_HI     R_PPC64 = 81
-	R_PPC64_GOT_TLSGD16_HA     R_PPC64 = 82
-	R_PPC64_GOT_TLSLD16        R_PPC64 = 83
-	R_PPC64_GOT_TLSLD16_LO     R_PPC64 = 84
-	R_PPC64_GOT_TLSLD16_HI     R_PPC64 = 85
-	R_PPC64_GOT_TLSLD16_HA     R_PPC64 = 86
-	R_PPC64_GOT_TPREL16_DS     R_PPC64 = 87
-	R_PPC64_GOT_TPREL16_LO_DS  R_PPC64 = 88
-	R_PPC64_GOT_TPREL16_HI     R_PPC64 = 89
-	R_PPC64_GOT_TPREL16_HA     R_PPC64 = 90
-	R_PPC64_GOT_DTPREL16_DS    R_PPC64 = 91
-	R_PPC64_GOT_DTPREL16_LO_DS R_PPC64 = 92
-	R_PPC64_GOT_DTPREL16_HI    R_PPC64 = 93
-	R_PPC64_GOT_DTPREL16_HA    R_PPC64 = 94
-	R_PPC64_TPREL16_DS         R_PPC64 = 95
-	R_PPC64_TPREL16_LO_DS      R_PPC64 = 96
-	R_PPC64_TPREL16_HIGHER     R_PPC64 = 97
-	R_PPC64_TPREL16_HIGHERA    R_PPC64 = 98
-	R_PPC64_TPREL16_HIGHEST    R_PPC64 = 99
-	R_PPC64_TPREL16_HIGHESTA   R_PPC64 = 100
-	R_PPC64_DTPREL16_DS        R_PPC64 = 101
-	R_PPC64_DTPREL16_LO_DS     R_PPC64 = 102
-	R_PPC64_DTPREL16_HIGHER    R_PPC64 = 103
-	R_PPC64_DTPREL16_HIGHERA   R_PPC64 = 104
-	R_PPC64_DTPREL16_HIGHEST   R_PPC64 = 105
-	R_PPC64_DTPREL16_HIGHESTA  R_PPC64 = 106
-	R_PPC64_TLSGD              R_PPC64 = 107
-	R_PPC64_TLSLD              R_PPC64 = 108
-	R_PPC64_REL16              R_PPC64 = 249
-	R_PPC64_REL16_LO           R_PPC64 = 250
-	R_PPC64_REL16_HI           R_PPC64 = 251
-	R_PPC64_REL16_HA           R_PPC64 = 252
-)
-
-var rppc64Strings = []intName{
-	{0, "R_PPC64_NONE"},
-	{1, "R_PPC64_ADDR32"},
-	{2, "R_PPC64_ADDR24"},
-	{3, "R_PPC64_ADDR16"},
-	{4, "R_PPC64_ADDR16_LO"},
-	{5, "R_PPC64_ADDR16_HI"},
-	{6, "R_PPC64_ADDR16_HA"},
-	{7, "R_PPC64_ADDR14"},
-	{8, "R_PPC64_ADDR14_BRTAKEN"},
-	{9, "R_PPC64_ADDR14_BRNTAKEN"},
-	{10, "R_PPC64_REL24"},
-	{11, "R_PPC64_REL14"},
-	{12, "R_PPC64_REL14_BRTAKEN"},
-	{13, "R_PPC64_REL14_BRNTAKEN"},
-	{14, "R_PPC64_GOT16"},
-	{15, "R_PPC64_GOT16_LO"},
-	{16, "R_PPC64_GOT16_HI"},
-	{17, "R_PPC64_GOT16_HA"},
-	{21, "R_PPC64_JMP_SLOT"},
-	{26, "R_PPC64_REL32"},
-	{38, "R_PPC64_ADDR64"},
-	{39, "R_PPC64_ADDR16_HIGHER"},
-	{40, "R_PPC64_ADDR16_HIGHERA"},
-	{41, "R_PPC64_ADDR16_HIGHEST"},
-	{42, "R_PPC64_ADDR16_HIGHESTA"},
-	{44, "R_PPC64_REL64"},
-	{47, "R_PPC64_TOC16"},
-	{48, "R_PPC64_TOC16_LO"},
-	{49, "R_PPC64_TOC16_HI"},
-	{50, "R_PPC64_TOC16_HA"},
-	{51, "R_PPC64_TOC"},
-	{56, "R_PPC64_ADDR16_DS"},
-	{57, "R_PPC64_ADDR16_LO_DS"},
-	{58, "R_PPC64_GOT16_DS"},
-	{59, "R_PPC64_GOT16_LO_DS"},
-	{63, "R_PPC64_TOC16_DS"},
-	{64, "R_PPC64_TOC16_LO_DS"},
-	{67, "R_PPC64_TLS"},
-	{68, "R_PPC64_DTPMOD64"},
-	{69, "R_PPC64_TPREL16"},
-	{70, "R_PPC64_TPREL16_LO"},
-	{71, "R_PPC64_TPREL16_HI"},
-	{72, "R_PPC64_TPREL16_HA"},
-	{73, "R_PPC64_TPREL64"},
-	{74, "R_PPC64_DTPREL16"},
-	{75, "R_PPC64_DTPREL16_LO"},
-	{76, "R_PPC64_DTPREL16_HI"},
-	{77, "R_PPC64_DTPREL16_HA"},
-	{78, "R_PPC64_DTPREL64"},
-	{79, "R_PPC64_GOT_TLSGD16"},
-	{80, "R_PPC64_GOT_TLSGD16_LO"},
-	{81, "R_PPC64_GOT_TLSGD16_HI"},
-	{82, "R_PPC64_GOT_TLSGD16_HA"},
-	{83, "R_PPC64_GOT_TLSLD16"},
-	{84, "R_PPC64_GOT_TLSLD16_LO"},
-	{85, "R_PPC64_GOT_TLSLD16_HI"},
-	{86, "R_PPC64_GOT_TLSLD16_HA"},
-	{87, "R_PPC64_GOT_TPREL16_DS"},
-	{88, "R_PPC64_GOT_TPREL16_LO_DS"},
-	{89, "R_PPC64_GOT_TPREL16_HI"},
-	{90, "R_PPC64_GOT_TPREL16_HA"},
-	{91, "R_PPC64_GOT_DTPREL16_DS"},
-	{92, "R_PPC64_GOT_DTPREL16_LO_DS"},
-	{93, "R_PPC64_GOT_DTPREL16_HI"},
-	{94, "R_PPC64_GOT_DTPREL16_HA"},
-	{95, "R_PPC64_TPREL16_DS"},
-	{96, "R_PPC64_TPREL16_LO_DS"},
-	{97, "R_PPC64_TPREL16_HIGHER"},
-	{98, "R_PPC64_TPREL16_HIGHERA"},
-	{99, "R_PPC64_TPREL16_HIGHEST"},
-	{100, "R_PPC64_TPREL16_HIGHESTA"},
-	{101, "R_PPC64_DTPREL16_DS"},
-	{102, "R_PPC64_DTPREL16_LO_DS"},
-	{103, "R_PPC64_DTPREL16_HIGHER"},
-	{104, "R_PPC64_DTPREL16_HIGHERA"},
-	{105, "R_PPC64_DTPREL16_HIGHEST"},
-	{106, "R_PPC64_DTPREL16_HIGHESTA"},
-	{107, "R_PPC64_TLSGD"},
-	{108, "R_PPC64_TLSLD"},
-	{249, "R_PPC64_REL16"},
-	{250, "R_PPC64_REL16_LO"},
-	{251, "R_PPC64_REL16_HI"},
-	{252, "R_PPC64_REL16_HA"},
-}
-
-func (i R_PPC64) String() string   { return stringName(uint32(i), rppc64Strings, false) }
-func (i R_PPC64) GoString() string { return stringName(uint32(i), rppc64Strings, true) }
-
-// Relocation types for s390
-type R_390 int
-
-const (
-	R_390_NONE     R_390 = 0
-	R_390_8        R_390 = 1
-	R_390_12       R_390 = 2
-	R_390_16       R_390 = 3
-	R_390_32       R_390 = 4
-	R_390_PC32     R_390 = 5
-	R_390_GOT12    R_390 = 6
-	R_390_GOT32    R_390 = 7
-	R_390_PLT32    R_390 = 8
-	R_390_COPY     R_390 = 9
-	R_390_GLOB_DAT R_390 = 10
-	R_390_JMP_SLOT R_390 = 11
-	R_390_RELATIVE R_390 = 12
-	R_390_GOTOFF   R_390 = 13
-	R_390_GOTPC    R_390 = 14
-	R_390_GOT16    R_390 = 15
-	R_390_PC16     R_390 = 16
-	R_390_PC16DBL  R_390 = 17
-	R_390_PLT16DBL R_390 = 18
-	R_390_PC32DBL  R_390 = 19
-	R_390_PLT32DBL R_390 = 20
-	R_390_GOTPCDBL R_390 = 21
-	R_390_64       R_390 = 22
-	R_390_PC64     R_390 = 23
-	R_390_GOT64    R_390 = 24
-	R_390_PLT64    R_390 = 25
-	R_390_GOTENT   R_390 = 26
-)
-
-var r390Strings = []intName{
-	{0, "R_390_NONE"},
-	{1, "R_390_8"},
-	{2, "R_390_12"},
-	{3, "R_390_16"},
-	{4, "R_390_32"},
-	{5, "R_390_PC32"},
-	{6, "R_390_GOT12"},
-	{7, "R_390_GOT32"},
-	{8, "R_390_PLT32"},
-	{9, "R_390_COPY"},
-	{10, "R_390_GLOB_DAT"},
-	{11, "R_390_JMP_SLOT"},
-	{12, "R_390_RELATIVE"},
-	{13, "R_390_GOTOFF"},
-	{14, "R_390_GOTPC"},
-	{15, "R_390_GOT16"},
-	{16, "R_390_PC16"},
-	{17, "R_390_PC16DBL"},
-	{18, "R_390_PLT16DBL"},
-	{19, "R_390_PC32DBL"},
-	{20, "R_390_PLT32DBL"},
-	{21, "R_390_GOTPCDBL"},
-	{22, "R_390_64"},
-	{23, "R_390_PC64"},
-	{24, "R_390_GOT64"},
-	{25, "R_390_PLT64"},
-	{26, "R_390_GOTENT"},
-}
-
-func (i R_390) String() string   { return stringName(uint32(i), r390Strings, false) }
-func (i R_390) GoString() string { return stringName(uint32(i), r390Strings, true) }
-
-// Relocation types for SPARC.
-type R_SPARC int
-
-const (
-	R_SPARC_NONE     R_SPARC = 0
-	R_SPARC_8        R_SPARC = 1
-	R_SPARC_16       R_SPARC = 2
-	R_SPARC_32       R_SPARC = 3
-	R_SPARC_DISP8    R_SPARC = 4
-	R_SPARC_DISP16   R_SPARC = 5
-	R_SPARC_DISP32   R_SPARC = 6
-	R_SPARC_WDISP30  R_SPARC = 7
-	R_SPARC_WDISP22  R_SPARC = 8
-	R_SPARC_HI22     R_SPARC = 9
-	R_SPARC_22       R_SPARC = 10
-	R_SPARC_13       R_SPARC = 11
-	R_SPARC_LO10     R_SPARC = 12
-	R_SPARC_GOT10    R_SPARC = 13
-	R_SPARC_GOT13    R_SPARC = 14
-	R_SPARC_GOT22    R_SPARC = 15
-	R_SPARC_PC10     R_SPARC = 16
-	R_SPARC_PC22     R_SPARC = 17
-	R_SPARC_WPLT30   R_SPARC = 18
-	R_SPARC_COPY     R_SPARC = 19
-	R_SPARC_GLOB_DAT R_SPARC = 20
-	R_SPARC_JMP_SLOT R_SPARC = 21
-	R_SPARC_RELATIVE R_SPARC = 22
-	R_SPARC_UA32     R_SPARC = 23
-	R_SPARC_PLT32    R_SPARC = 24
-	R_SPARC_HIPLT22  R_SPARC = 25
-	R_SPARC_LOPLT10  R_SPARC = 26
-	R_SPARC_PCPLT32  R_SPARC = 27
-	R_SPARC_PCPLT22  R_SPARC = 28
-	R_SPARC_PCPLT10  R_SPARC = 29
-	R_SPARC_10       R_SPARC = 30
-	R_SPARC_11       R_SPARC = 31
-	R_SPARC_64       R_SPARC = 32
-	R_SPARC_OLO10    R_SPARC = 33
-	R_SPARC_HH22     R_SPARC = 34
-	R_SPARC_HM10     R_SPARC = 35
-	R_SPARC_LM22     R_SPARC = 36
-	R_SPARC_PC_HH22  R_SPARC = 37
-	R_SPARC_PC_HM10  R_SPARC = 38
-	R_SPARC_PC_LM22  R_SPARC = 39
-	R_SPARC_WDISP16  R_SPARC = 40
-	R_SPARC_WDISP19  R_SPARC = 41
-	R_SPARC_GLOB_JMP R_SPARC = 42
-	R_SPARC_7        R_SPARC = 43
-	R_SPARC_5        R_SPARC = 44
-	R_SPARC_6        R_SPARC = 45
-	R_SPARC_DISP64   R_SPARC = 46
-	R_SPARC_PLT64    R_SPARC = 47
-	R_SPARC_HIX22    R_SPARC = 48
-	R_SPARC_LOX10    R_SPARC = 49
-	R_SPARC_H44      R_SPARC = 50
-	R_SPARC_M44      R_SPARC = 51
-	R_SPARC_L44      R_SPARC = 52
-	R_SPARC_REGISTER R_SPARC = 53
-	R_SPARC_UA64     R_SPARC = 54
-	R_SPARC_UA16     R_SPARC = 55
-)
-
-var rsparcStrings = []intName{
-	{0, "R_SPARC_NONE"},
-	{1, "R_SPARC_8"},
-	{2, "R_SPARC_16"},
-	{3, "R_SPARC_32"},
-	{4, "R_SPARC_DISP8"},
-	{5, "R_SPARC_DISP16"},
-	{6, "R_SPARC_DISP32"},
-	{7, "R_SPARC_WDISP30"},
-	{8, "R_SPARC_WDISP22"},
-	{9, "R_SPARC_HI22"},
-	{10, "R_SPARC_22"},
-	{11, "R_SPARC_13"},
-	{12, "R_SPARC_LO10"},
-	{13, "R_SPARC_GOT10"},
-	{14, "R_SPARC_GOT13"},
-	{15, "R_SPARC_GOT22"},
-	{16, "R_SPARC_PC10"},
-	{17, "R_SPARC_PC22"},
-	{18, "R_SPARC_WPLT30"},
-	{19, "R_SPARC_COPY"},
-	{20, "R_SPARC_GLOB_DAT"},
-	{21, "R_SPARC_JMP_SLOT"},
-	{22, "R_SPARC_RELATIVE"},
-	{23, "R_SPARC_UA32"},
-	{24, "R_SPARC_PLT32"},
-	{25, "R_SPARC_HIPLT22"},
-	{26, "R_SPARC_LOPLT10"},
-	{27, "R_SPARC_PCPLT32"},
-	{28, "R_SPARC_PCPLT22"},
-	{29, "R_SPARC_PCPLT10"},
-	{30, "R_SPARC_10"},
-	{31, "R_SPARC_11"},
-	{32, "R_SPARC_64"},
-	{33, "R_SPARC_OLO10"},
-	{34, "R_SPARC_HH22"},
-	{35, "R_SPARC_HM10"},
-	{36, "R_SPARC_LM22"},
-	{37, "R_SPARC_PC_HH22"},
-	{38, "R_SPARC_PC_HM10"},
-	{39, "R_SPARC_PC_LM22"},
-	{40, "R_SPARC_WDISP16"},
-	{41, "R_SPARC_WDISP19"},
-	{42, "R_SPARC_GLOB_JMP"},
-	{43, "R_SPARC_7"},
-	{44, "R_SPARC_5"},
-	{45, "R_SPARC_6"},
-	{46, "R_SPARC_DISP64"},
-	{47, "R_SPARC_PLT64"},
-	{48, "R_SPARC_HIX22"},
-	{49, "R_SPARC_LOX10"},
-	{50, "R_SPARC_H44"},
-	{51, "R_SPARC_M44"},
-	{52, "R_SPARC_L44"},
-	{53, "R_SPARC_REGISTER"},
-	{54, "R_SPARC_UA64"},
-	{55, "R_SPARC_UA16"},
-}
-
-func (i R_SPARC) String() string   { return stringName(uint32(i), rsparcStrings, false) }
-func (i R_SPARC) GoString() string { return stringName(uint32(i), rsparcStrings, true) }
-
-// Magic number for the elf trampoline, chosen wisely to be an immediate value.
-const ARM_MAGIC_TRAMP_NUMBER = 0x5c000003
-
-// ELF32 File header.
-type Header32 struct {
-	Ident     [EI_NIDENT]byte /* File identification. */
-	Type      uint16          /* File type. */
-	Machine   uint16          /* Machine architecture. */
-	Version   uint32          /* ELF format version. */
-	Entry     uint32          /* Entry point. */
-	Phoff     uint32          /* Program header file offset. */
-	Shoff     uint32          /* Section header file offset. */
-	Flags     uint32          /* Architecture-specific flags. */
-	Ehsize    uint16          /* Size of ELF header in bytes. */
-	Phentsize uint16          /* Size of program header entry. */
-	Phnum     uint16          /* Number of program header entries. */
-	Shentsize uint16          /* Size of section header entry. */
-	Shnum     uint16          /* Number of section header entries. */
-	Shstrndx  uint16          /* Section name strings section. */
-}
-
-// ELF32 Section header.
-type Section32 struct {
-	Name      uint32 /* Section name (index into the section header string table). */
-	Type      uint32 /* Section type. */
-	Flags     uint32 /* Section flags. */
-	Addr      uint32 /* Address in memory image. */
-	Off       uint32 /* Offset in file. */
-	Size      uint32 /* Size in bytes. */
-	Link      uint32 /* Index of a related section. */
-	Info      uint32 /* Depends on section type. */
-	Addralign uint32 /* Alignment in bytes. */
-	Entsize   uint32 /* Size of each entry in section. */
-}
-
-// ELF32 Program header.
-type Prog32 struct {
-	Type   uint32 /* Entry type. */
-	Off    uint32 /* File offset of contents. */
-	Vaddr  uint32 /* Virtual address in memory image. */
-	Paddr  uint32 /* Physical address (not used). */
-	Filesz uint32 /* Size of contents in file. */
-	Memsz  uint32 /* Size of contents in memory. */
-	Flags  uint32 /* Access permission flags. */
-	Align  uint32 /* Alignment in memory and file. */
-}
-
-// ELF32 Dynamic structure.  The ".dynamic" section contains an array of them.
-type Dyn32 struct {
-	Tag int32  /* Entry type. */
-	Val uint32 /* Integer/Address value. */
-}
-
-/*
- * Relocation entries.
- */
-
-// ELF32 Relocations that don't need an addend field.
-type Rel32 struct {
-	Off  uint32 /* Location to be relocated. */
-	Info uint32 /* Relocation type and symbol index. */
-}
-
-// ELF32 Relocations that need an addend field.
-type Rela32 struct {
-	Off    uint32 /* Location to be relocated. */
-	Info   uint32 /* Relocation type and symbol index. */
-	Addend int32  /* Addend. */
-}
-
-func R_SYM32(info uint32) uint32      { return uint32(info >> 8) }
-func R_TYPE32(info uint32) uint32     { return uint32(info & 0xff) }
-func R_INFO32(sym, typ uint32) uint32 { return sym<<8 | typ }
-
-// ELF32 Symbol.
-type Sym32 struct {
-	Name  uint32
-	Value uint32
-	Size  uint32
-	Info  uint8
-	Other uint8
-	Shndx uint16
-}
-
-const Sym32Size = 16
-
-func ST_BIND(info uint8) SymBind { return SymBind(info >> 4) }
-func ST_TYPE(info uint8) SymType { return SymType(info & 0xF) }
-func ST_INFO(bind SymBind, typ SymType) uint8 {
-	return uint8(bind)<<4 | uint8(typ)&0xf
-}
-func ST_VISIBILITY(other uint8) SymVis { return SymVis(other & 3) }
-
-/*
- * ELF64
- */
-
-// ELF64 file header.
-type Header64 struct {
-	Ident     [EI_NIDENT]byte /* File identification. */
-	Type      uint16          /* File type. */
-	Machine   uint16          /* Machine architecture. */
-	Version   uint32          /* ELF format version. */
-	Entry     uint64          /* Entry point. */
-	Phoff     uint64          /* Program header file offset. */
-	Shoff     uint64          /* Section header file offset. */
-	Flags     uint32          /* Architecture-specific flags. */
-	Ehsize    uint16          /* Size of ELF header in bytes. */
-	Phentsize uint16          /* Size of program header entry. */
-	Phnum     uint16          /* Number of program header entries. */
-	Shentsize uint16          /* Size of section header entry. */
-	Shnum     uint16          /* Number of section header entries. */
-	Shstrndx  uint16          /* Section name strings section. */
-}
-
-// ELF64 Section header.
-type Section64 struct {
-	Name      uint32 /* Section name (index into the section header string table). */
-	Type      uint32 /* Section type. */
-	Flags     uint64 /* Section flags. */
-	Addr      uint64 /* Address in memory image. */
-	Off       uint64 /* Offset in file. */
-	Size      uint64 /* Size in bytes. */
-	Link      uint32 /* Index of a related section. */
-	Info      uint32 /* Depends on section type. */
-	Addralign uint64 /* Alignment in bytes. */
-	Entsize   uint64 /* Size of each entry in section. */
-}
-
-// ELF64 Program header.
-type Prog64 struct {
-	Type   uint32 /* Entry type. */
-	Flags  uint32 /* Access permission flags. */
-	Off    uint64 /* File offset of contents. */
-	Vaddr  uint64 /* Virtual address in memory image. */
-	Paddr  uint64 /* Physical address (not used). */
-	Filesz uint64 /* Size of contents in file. */
-	Memsz  uint64 /* Size of contents in memory. */
-	Align  uint64 /* Alignment in memory and file. */
-}
-
-// ELF64 Dynamic structure.  The ".dynamic" section contains an array of them.
-type Dyn64 struct {
-	Tag int64  /* Entry type. */
-	Val uint64 /* Integer/address value */
-}
-
-/*
- * Relocation entries.
- */
-
-/* ELF64 relocations that don't need an addend field. */
-type Rel64 struct {
-	Off  uint64 /* Location to be relocated. */
-	Info uint64 /* Relocation type and symbol index. */
-}
-
-/* ELF64 relocations that need an addend field. */
-type Rela64 struct {
-	Off    uint64 /* Location to be relocated. */
-	Info   uint64 /* Relocation type and symbol index. */
-	Addend int64  /* Addend. */
-}
-
-func R_SYM64(info uint64) uint32    { return uint32(info >> 32) }
-func R_TYPE64(info uint64) uint32   { return uint32(info) }
-func R_INFO(sym, typ uint32) uint64 { return uint64(sym)<<32 | uint64(typ) }
-
-// ELF64 symbol table entries.
-type Sym64 struct {
-	Name  uint32 /* String table index of name. */
-	Info  uint8  /* Type and binding information. */
-	Other uint8  /* Reserved (not used). */
-	Shndx uint16 /* Section index of symbol. */
-	Value uint64 /* Symbol value. */
-	Size  uint64 /* Size of associated object. */
-}
-
-const Sym64Size = 24
-
-type intName struct {
-	i uint32
-	s string
-}
-
-func stringName(i uint32, names []intName, goSyntax bool) string {
-	for _, n := range names {
-		if n.i == i {
-			if goSyntax {
-				return "elf." + n.s
-			}
-			return n.s
-		}
-	}
-
-	// second pass - look for smaller to add with.
-	// assume sorted already
-	for j := len(names) - 1; j >= 0; j-- {
-		n := names[j]
-		if n.i < i {
-			s := n.s
-			if goSyntax {
-				s = "elf." + s
-			}
-			return s + "+" + strconv.FormatUint(uint64(i-n.i), 10)
-		}
-	}
-
-	return strconv.FormatUint(uint64(i), 10)
-}
-
-func flagName(i uint32, names []intName, goSyntax bool) string {
-	s := ""
-	for _, n := range names {
-		if n.i&i == n.i {
-			if len(s) > 0 {
-				s += "+"
-			}
-			if goSyntax {
-				s += "elf."
-			}
-			s += n.s
-			i -= n.i
-		}
-	}
-	if len(s) == 0 {
-		return "0x" + strconv.FormatUint(uint64(i), 16)
-	}
-	if i != 0 {
-		s += "+0x" + strconv.FormatUint(uint64(i), 16)
-	}
-	return s
-}
diff --git a/third_party/gofrontend/libgo/go/debug/elf/elf_test.go b/third_party/gofrontend/libgo/go/debug/elf/elf_test.go
deleted file mode 100644
index e3c51bb..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/elf_test.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package elf
-
-import (
-	"fmt"
-	"testing"
-)
-
-type nameTest struct {
-	val interface{}
-	str string
-}
-
-var nameTests = []nameTest{
-	{ELFOSABI_LINUX, "ELFOSABI_LINUX"},
-	{ET_EXEC, "ET_EXEC"},
-	{EM_860, "EM_860"},
-	{SHN_LOPROC, "SHN_LOPROC"},
-	{SHT_PROGBITS, "SHT_PROGBITS"},
-	{SHF_MERGE + SHF_TLS, "SHF_MERGE+SHF_TLS"},
-	{PT_LOAD, "PT_LOAD"},
-	{PF_W + PF_R + 0x50, "PF_W+PF_R+0x50"},
-	{DT_SYMBOLIC, "DT_SYMBOLIC"},
-	{DF_BIND_NOW, "DF_BIND_NOW"},
-	{NT_FPREGSET, "NT_FPREGSET"},
-	{STB_GLOBAL, "STB_GLOBAL"},
-	{STT_COMMON, "STT_COMMON"},
-	{STV_HIDDEN, "STV_HIDDEN"},
-	{R_X86_64_PC32, "R_X86_64_PC32"},
-	{R_ALPHA_OP_PUSH, "R_ALPHA_OP_PUSH"},
-	{R_ARM_THM_ABS5, "R_ARM_THM_ABS5"},
-	{R_386_GOT32, "R_386_GOT32"},
-	{R_PPC_GOT16_HI, "R_PPC_GOT16_HI"},
-	{R_SPARC_GOT22, "R_SPARC_GOT22"},
-	{ET_LOOS + 5, "ET_LOOS+5"},
-	{ProgFlag(0x50), "0x50"},
-}
-
-func TestNames(t *testing.T) {
-	for i, tt := range nameTests {
-		s := fmt.Sprint(tt.val)
-		if s != tt.str {
-			t.Errorf("#%d: Sprint(%d) = %q, want %q", i, tt.val, s, tt.str)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/debug/elf/file.go b/third_party/gofrontend/libgo/go/debug/elf/file.go
deleted file mode 100644
index 370c5e6..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/file.go
+++ /dev/null
@@ -1,1107 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package elf implements access to ELF object files.
-package elf
-
-import (
-	"bytes"
-	"debug/dwarf"
-	"encoding/binary"
-	"errors"
-	"fmt"
-	"io"
-	"os"
-	"strings"
-)
-
-// TODO: error reporting detail
-
-/*
- * Internal ELF representation
- */
-
-// A FileHeader represents an ELF file header.
-type FileHeader struct {
-	Class      Class
-	Data       Data
-	Version    Version
-	OSABI      OSABI
-	ABIVersion uint8
-	ByteOrder  binary.ByteOrder
-	Type       Type
-	Machine    Machine
-	Entry      uint64
-}
-
-// A File represents an open ELF file.
-type File struct {
-	FileHeader
-	Sections  []*Section
-	Progs     []*Prog
-	closer    io.Closer
-	gnuNeed   []verneed
-	gnuVersym []byte
-}
-
-// A SectionHeader represents a single ELF section header.
-type SectionHeader struct {
-	Name      string
-	Type      SectionType
-	Flags     SectionFlag
-	Addr      uint64
-	Offset    uint64
-	Size      uint64
-	Link      uint32
-	Info      uint32
-	Addralign uint64
-	Entsize   uint64
-}
-
-// A Section represents a single section in an ELF file.
-type Section struct {
-	SectionHeader
-
-	// Embed ReaderAt for ReadAt method.
-	// Do not embed SectionReader directly
-	// to avoid having Read and Seek.
-	// If a client wants Read and Seek it must use
-	// Open() to avoid fighting over the seek offset
-	// with other clients.
-	io.ReaderAt
-	sr *io.SectionReader
-}
-
-// Data reads and returns the contents of the ELF section.
-func (s *Section) Data() ([]byte, error) {
-	dat := make([]byte, s.sr.Size())
-	n, err := s.sr.ReadAt(dat, 0)
-	if n == len(dat) {
-		err = nil
-	}
-	return dat[0:n], err
-}
-
-// stringTable reads and returns the string table given by the
-// specified link value.
-func (f *File) stringTable(link uint32) ([]byte, error) {
-	if link <= 0 || link >= uint32(len(f.Sections)) {
-		return nil, errors.New("section has invalid string table link")
-	}
-	return f.Sections[link].Data()
-}
-
-// Open returns a new ReadSeeker reading the ELF section.
-func (s *Section) Open() io.ReadSeeker { return io.NewSectionReader(s.sr, 0, 1<<63-1) }
-
-// A ProgHeader represents a single ELF program header.
-type ProgHeader struct {
-	Type   ProgType
-	Flags  ProgFlag
-	Off    uint64
-	Vaddr  uint64
-	Paddr  uint64
-	Filesz uint64
-	Memsz  uint64
-	Align  uint64
-}
-
-// A Prog represents a single ELF program header in an ELF binary.
-type Prog struct {
-	ProgHeader
-
-	// Embed ReaderAt for ReadAt method.
-	// Do not embed SectionReader directly
-	// to avoid having Read and Seek.
-	// If a client wants Read and Seek it must use
-	// Open() to avoid fighting over the seek offset
-	// with other clients.
-	io.ReaderAt
-	sr *io.SectionReader
-}
-
-// Open returns a new ReadSeeker reading the ELF program body.
-func (p *Prog) Open() io.ReadSeeker { return io.NewSectionReader(p.sr, 0, 1<<63-1) }
-
-// A Symbol represents an entry in an ELF symbol table section.
-type Symbol struct {
-	Name        string
-	Info, Other byte
-	Section     SectionIndex
-	Value, Size uint64
-}
-
-/*
- * ELF reader
- */
-
-type FormatError struct {
-	off int64
-	msg string
-	val interface{}
-}
-
-func (e *FormatError) Error() string {
-	msg := e.msg
-	if e.val != nil {
-		msg += fmt.Sprintf(" '%v' ", e.val)
-	}
-	msg += fmt.Sprintf("in record at byte %#x", e.off)
-	return msg
-}
-
-// Open opens the named file using os.Open and prepares it for use as an ELF binary.
-func Open(name string) (*File, error) {
-	f, err := os.Open(name)
-	if err != nil {
-		return nil, err
-	}
-	ff, err := NewFile(f)
-	if err != nil {
-		f.Close()
-		return nil, err
-	}
-	ff.closer = f
-	return ff, nil
-}
-
-// Close closes the File.
-// If the File was created using NewFile directly instead of Open,
-// Close has no effect.
-func (f *File) Close() error {
-	var err error
-	if f.closer != nil {
-		err = f.closer.Close()
-		f.closer = nil
-	}
-	return err
-}
-
-// SectionByType returns the first section in f with the
-// given type, or nil if there is no such section.
-func (f *File) SectionByType(typ SectionType) *Section {
-	for _, s := range f.Sections {
-		if s.Type == typ {
-			return s
-		}
-	}
-	return nil
-}
-
-// NewFile creates a new File for accessing an ELF binary in an underlying reader.
-// The ELF binary is expected to start at position 0 in the ReaderAt.
-func NewFile(r io.ReaderAt) (*File, error) {
-	sr := io.NewSectionReader(r, 0, 1<<63-1)
-	// Read and decode ELF identifier
-	var ident [16]uint8
-	if _, err := r.ReadAt(ident[0:], 0); err != nil {
-		return nil, err
-	}
-	if ident[0] != '\x7f' || ident[1] != 'E' || ident[2] != 'L' || ident[3] != 'F' {
-		return nil, &FormatError{0, "bad magic number", ident[0:4]}
-	}
-
-	f := new(File)
-	f.Class = Class(ident[EI_CLASS])
-	switch f.Class {
-	case ELFCLASS32:
-	case ELFCLASS64:
-		// ok
-	default:
-		return nil, &FormatError{0, "unknown ELF class", f.Class}
-	}
-
-	f.Data = Data(ident[EI_DATA])
-	switch f.Data {
-	case ELFDATA2LSB:
-		f.ByteOrder = binary.LittleEndian
-	case ELFDATA2MSB:
-		f.ByteOrder = binary.BigEndian
-	default:
-		return nil, &FormatError{0, "unknown ELF data encoding", f.Data}
-	}
-
-	f.Version = Version(ident[EI_VERSION])
-	if f.Version != EV_CURRENT {
-		return nil, &FormatError{0, "unknown ELF version", f.Version}
-	}
-
-	f.OSABI = OSABI(ident[EI_OSABI])
-	f.ABIVersion = ident[EI_ABIVERSION]
-
-	// Read ELF file header
-	var phoff int64
-	var phentsize, phnum int
-	var shoff int64
-	var shentsize, shnum, shstrndx int
-	shstrndx = -1
-	switch f.Class {
-	case ELFCLASS32:
-		hdr := new(Header32)
-		sr.Seek(0, os.SEEK_SET)
-		if err := binary.Read(sr, f.ByteOrder, hdr); err != nil {
-			return nil, err
-		}
-		f.Type = Type(hdr.Type)
-		f.Machine = Machine(hdr.Machine)
-		f.Entry = uint64(hdr.Entry)
-		if v := Version(hdr.Version); v != f.Version {
-			return nil, &FormatError{0, "mismatched ELF version", v}
-		}
-		phoff = int64(hdr.Phoff)
-		phentsize = int(hdr.Phentsize)
-		phnum = int(hdr.Phnum)
-		shoff = int64(hdr.Shoff)
-		shentsize = int(hdr.Shentsize)
-		shnum = int(hdr.Shnum)
-		shstrndx = int(hdr.Shstrndx)
-	case ELFCLASS64:
-		hdr := new(Header64)
-		sr.Seek(0, os.SEEK_SET)
-		if err := binary.Read(sr, f.ByteOrder, hdr); err != nil {
-			return nil, err
-		}
-		f.Type = Type(hdr.Type)
-		f.Machine = Machine(hdr.Machine)
-		f.Entry = uint64(hdr.Entry)
-		if v := Version(hdr.Version); v != f.Version {
-			return nil, &FormatError{0, "mismatched ELF version", v}
-		}
-		phoff = int64(hdr.Phoff)
-		phentsize = int(hdr.Phentsize)
-		phnum = int(hdr.Phnum)
-		shoff = int64(hdr.Shoff)
-		shentsize = int(hdr.Shentsize)
-		shnum = int(hdr.Shnum)
-		shstrndx = int(hdr.Shstrndx)
-	}
-
-	if shnum > 0 && shoff > 0 && (shstrndx < 0 || shstrndx >= shnum) {
-		return nil, &FormatError{0, "invalid ELF shstrndx", shstrndx}
-	}
-
-	// Read program headers
-	f.Progs = make([]*Prog, phnum)
-	for i := 0; i < phnum; i++ {
-		off := phoff + int64(i)*int64(phentsize)
-		sr.Seek(off, os.SEEK_SET)
-		p := new(Prog)
-		switch f.Class {
-		case ELFCLASS32:
-			ph := new(Prog32)
-			if err := binary.Read(sr, f.ByteOrder, ph); err != nil {
-				return nil, err
-			}
-			p.ProgHeader = ProgHeader{
-				Type:   ProgType(ph.Type),
-				Flags:  ProgFlag(ph.Flags),
-				Off:    uint64(ph.Off),
-				Vaddr:  uint64(ph.Vaddr),
-				Paddr:  uint64(ph.Paddr),
-				Filesz: uint64(ph.Filesz),
-				Memsz:  uint64(ph.Memsz),
-				Align:  uint64(ph.Align),
-			}
-		case ELFCLASS64:
-			ph := new(Prog64)
-			if err := binary.Read(sr, f.ByteOrder, ph); err != nil {
-				return nil, err
-			}
-			p.ProgHeader = ProgHeader{
-				Type:   ProgType(ph.Type),
-				Flags:  ProgFlag(ph.Flags),
-				Off:    uint64(ph.Off),
-				Vaddr:  uint64(ph.Vaddr),
-				Paddr:  uint64(ph.Paddr),
-				Filesz: uint64(ph.Filesz),
-				Memsz:  uint64(ph.Memsz),
-				Align:  uint64(ph.Align),
-			}
-		}
-		p.sr = io.NewSectionReader(r, int64(p.Off), int64(p.Filesz))
-		p.ReaderAt = p.sr
-		f.Progs[i] = p
-	}
-
-	// Read section headers
-	f.Sections = make([]*Section, shnum)
-	names := make([]uint32, shnum)
-	for i := 0; i < shnum; i++ {
-		off := shoff + int64(i)*int64(shentsize)
-		sr.Seek(off, os.SEEK_SET)
-		s := new(Section)
-		switch f.Class {
-		case ELFCLASS32:
-			sh := new(Section32)
-			if err := binary.Read(sr, f.ByteOrder, sh); err != nil {
-				return nil, err
-			}
-			names[i] = sh.Name
-			s.SectionHeader = SectionHeader{
-				Type:      SectionType(sh.Type),
-				Flags:     SectionFlag(sh.Flags),
-				Addr:      uint64(sh.Addr),
-				Offset:    uint64(sh.Off),
-				Size:      uint64(sh.Size),
-				Link:      uint32(sh.Link),
-				Info:      uint32(sh.Info),
-				Addralign: uint64(sh.Addralign),
-				Entsize:   uint64(sh.Entsize),
-			}
-		case ELFCLASS64:
-			sh := new(Section64)
-			if err := binary.Read(sr, f.ByteOrder, sh); err != nil {
-				return nil, err
-			}
-			names[i] = sh.Name
-			s.SectionHeader = SectionHeader{
-				Type:      SectionType(sh.Type),
-				Flags:     SectionFlag(sh.Flags),
-				Offset:    uint64(sh.Off),
-				Size:      uint64(sh.Size),
-				Addr:      uint64(sh.Addr),
-				Link:      uint32(sh.Link),
-				Info:      uint32(sh.Info),
-				Addralign: uint64(sh.Addralign),
-				Entsize:   uint64(sh.Entsize),
-			}
-		}
-		s.sr = io.NewSectionReader(r, int64(s.Offset), int64(s.Size))
-		s.ReaderAt = s.sr
-		f.Sections[i] = s
-	}
-
-	if len(f.Sections) == 0 {
-		return f, nil
-	}
-
-	// Load section header string table.
-	shstrtab, err := f.Sections[shstrndx].Data()
-	if err != nil {
-		return nil, err
-	}
-	for i, s := range f.Sections {
-		var ok bool
-		s.Name, ok = getString(shstrtab, int(names[i]))
-		if !ok {
-			return nil, &FormatError{shoff + int64(i*shentsize), "bad section name index", names[i]}
-		}
-	}
-
-	return f, nil
-}
-
-// getSymbols returns a slice of Symbols from parsing the symbol table
-// with the given type, along with the associated string table.
-func (f *File) getSymbols(typ SectionType) ([]Symbol, []byte, error) {
-	switch f.Class {
-	case ELFCLASS64:
-		return f.getSymbols64(typ)
-
-	case ELFCLASS32:
-		return f.getSymbols32(typ)
-	}
-
-	return nil, nil, errors.New("not implemented")
-}
-
-// ErrNoSymbols is returned by File.Symbols and File.DynamicSymbols
-// if there is no such section in the File.
-var ErrNoSymbols = errors.New("no symbol section")
-
-func (f *File) getSymbols32(typ SectionType) ([]Symbol, []byte, error) {
-	symtabSection := f.SectionByType(typ)
-	if symtabSection == nil {
-		return nil, nil, ErrNoSymbols
-	}
-
-	data, err := symtabSection.Data()
-	if err != nil {
-		return nil, nil, errors.New("cannot load symbol section")
-	}
-	symtab := bytes.NewReader(data)
-	if symtab.Len()%Sym32Size != 0 {
-		return nil, nil, errors.New("length of symbol section is not a multiple of SymSize")
-	}
-
-	strdata, err := f.stringTable(symtabSection.Link)
-	if err != nil {
-		return nil, nil, errors.New("cannot load string table section")
-	}
-
-	// The first entry is all zeros.
-	var skip [Sym32Size]byte
-	symtab.Read(skip[:])
-
-	symbols := make([]Symbol, symtab.Len()/Sym32Size)
-
-	i := 0
-	var sym Sym32
-	for symtab.Len() > 0 {
-		binary.Read(symtab, f.ByteOrder, &sym)
-		str, _ := getString(strdata, int(sym.Name))
-		symbols[i].Name = str
-		symbols[i].Info = sym.Info
-		symbols[i].Other = sym.Other
-		symbols[i].Section = SectionIndex(sym.Shndx)
-		symbols[i].Value = uint64(sym.Value)
-		symbols[i].Size = uint64(sym.Size)
-		i++
-	}
-
-	return symbols, strdata, nil
-}
-
-func (f *File) getSymbols64(typ SectionType) ([]Symbol, []byte, error) {
-	symtabSection := f.SectionByType(typ)
-	if symtabSection == nil {
-		return nil, nil, ErrNoSymbols
-	}
-
-	data, err := symtabSection.Data()
-	if err != nil {
-		return nil, nil, errors.New("cannot load symbol section")
-	}
-	symtab := bytes.NewReader(data)
-	if symtab.Len()%Sym64Size != 0 {
-		return nil, nil, errors.New("length of symbol section is not a multiple of Sym64Size")
-	}
-
-	strdata, err := f.stringTable(symtabSection.Link)
-	if err != nil {
-		return nil, nil, errors.New("cannot load string table section")
-	}
-
-	// The first entry is all zeros.
-	var skip [Sym64Size]byte
-	symtab.Read(skip[:])
-
-	symbols := make([]Symbol, symtab.Len()/Sym64Size)
-
-	i := 0
-	var sym Sym64
-	for symtab.Len() > 0 {
-		binary.Read(symtab, f.ByteOrder, &sym)
-		str, _ := getString(strdata, int(sym.Name))
-		symbols[i].Name = str
-		symbols[i].Info = sym.Info
-		symbols[i].Other = sym.Other
-		symbols[i].Section = SectionIndex(sym.Shndx)
-		symbols[i].Value = sym.Value
-		symbols[i].Size = sym.Size
-		i++
-	}
-
-	return symbols, strdata, nil
-}
-
-// getString extracts a string from an ELF string table.
-func getString(section []byte, start int) (string, bool) {
-	if start < 0 || start >= len(section) {
-		return "", false
-	}
-
-	for end := start; end < len(section); end++ {
-		if section[end] == 0 {
-			return string(section[start:end]), true
-		}
-	}
-	return "", false
-}
-
-// Section returns a section with the given name, or nil if no such
-// section exists.
-func (f *File) Section(name string) *Section {
-	for _, s := range f.Sections {
-		if s.Name == name {
-			return s
-		}
-	}
-	return nil
-}
-
-// applyRelocations applies relocations to dst. rels is a relocations section
-// in RELA format.
-func (f *File) applyRelocations(dst []byte, rels []byte) error {
-	switch {
-	case f.Class == ELFCLASS64 && f.Machine == EM_X86_64:
-		return f.applyRelocationsAMD64(dst, rels)
-	case f.Class == ELFCLASS32 && f.Machine == EM_386:
-		return f.applyRelocations386(dst, rels)
-	case f.Class == ELFCLASS32 && f.Machine == EM_ARM:
-		return f.applyRelocationsARM(dst, rels)
-	case f.Class == ELFCLASS64 && f.Machine == EM_AARCH64:
-		return f.applyRelocationsARM64(dst, rels)
-	case f.Class == ELFCLASS32 && f.Machine == EM_PPC:
-		return f.applyRelocationsPPC(dst, rels)
-	case f.Class == ELFCLASS64 && f.Machine == EM_PPC64:
-		return f.applyRelocationsPPC64(dst, rels)
-	case f.Class == ELFCLASS64 && f.Machine == EM_S390:
-		return f.applyRelocationsS390x(dst, rels)
-	default:
-		return errors.New("applyRelocations: not implemented")
-	}
-}
-
-func (f *File) applyRelocationsAMD64(dst []byte, rels []byte) error {
-	// 24 is the size of Rela64.
-	if len(rels)%24 != 0 {
-		return errors.New("length of relocation section is not a multiple of 24")
-	}
-
-	symbols, _, err := f.getSymbols(SHT_SYMTAB)
-	if err != nil {
-		return err
-	}
-
-	b := bytes.NewReader(rels)
-	var rela Rela64
-
-	for b.Len() > 0 {
-		binary.Read(b, f.ByteOrder, &rela)
-		symNo := rela.Info >> 32
-		t := R_X86_64(rela.Info & 0xffff)
-
-		if symNo == 0 || symNo > uint64(len(symbols)) {
-			continue
-		}
-		sym := &symbols[symNo-1]
-		if SymType(sym.Info&0xf) != STT_SECTION {
-			// We don't handle non-section relocations for now.
-			continue
-		}
-
-		// There are relocations, so this must be a normal
-		// object file, and we only look at section symbols,
-		// so we assume that the symbol value is 0.
-
-		switch t {
-		case R_X86_64_64:
-			if rela.Off+8 >= uint64(len(dst)) || rela.Addend < 0 {
-				continue
-			}
-			f.ByteOrder.PutUint64(dst[rela.Off:rela.Off+8], uint64(rela.Addend))
-		case R_X86_64_32:
-			if rela.Off+4 >= uint64(len(dst)) || rela.Addend < 0 {
-				continue
-			}
-			f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], uint32(rela.Addend))
-		}
-	}
-
-	return nil
-}
-
-func (f *File) applyRelocations386(dst []byte, rels []byte) error {
-	// 8 is the size of Rel32.
-	if len(rels)%8 != 0 {
-		return errors.New("length of relocation section is not a multiple of 8")
-	}
-
-	symbols, _, err := f.getSymbols(SHT_SYMTAB)
-	if err != nil {
-		return err
-	}
-
-	b := bytes.NewReader(rels)
-	var rel Rel32
-
-	for b.Len() > 0 {
-		binary.Read(b, f.ByteOrder, &rel)
-		symNo := rel.Info >> 8
-		t := R_386(rel.Info & 0xff)
-
-		if symNo == 0 || symNo > uint32(len(symbols)) {
-			continue
-		}
-		sym := &symbols[symNo-1]
-
-		if t == R_386_32 {
-			if rel.Off+4 >= uint32(len(dst)) {
-				continue
-			}
-			val := f.ByteOrder.Uint32(dst[rel.Off : rel.Off+4])
-			val += uint32(sym.Value)
-			f.ByteOrder.PutUint32(dst[rel.Off:rel.Off+4], val)
-		}
-	}
-
-	return nil
-}
-
-func (f *File) applyRelocationsARM(dst []byte, rels []byte) error {
-	// 8 is the size of Rel32.
-	if len(rels)%8 != 0 {
-		return errors.New("length of relocation section is not a multiple of 8")
-	}
-
-	symbols, _, err := f.getSymbols(SHT_SYMTAB)
-	if err != nil {
-		return err
-	}
-
-	b := bytes.NewReader(rels)
-	var rel Rel32
-
-	for b.Len() > 0 {
-		binary.Read(b, f.ByteOrder, &rel)
-		symNo := rel.Info >> 8
-		t := R_ARM(rel.Info & 0xff)
-
-		if symNo == 0 || symNo > uint32(len(symbols)) {
-			continue
-		}
-		sym := &symbols[symNo-1]
-
-		switch t {
-		case R_ARM_ABS32:
-			if rel.Off+4 >= uint32(len(dst)) {
-				continue
-			}
-			val := f.ByteOrder.Uint32(dst[rel.Off : rel.Off+4])
-			val += uint32(sym.Value)
-			f.ByteOrder.PutUint32(dst[rel.Off:rel.Off+4], val)
-		}
-	}
-
-	return nil
-}
-
-func (f *File) applyRelocationsARM64(dst []byte, rels []byte) error {
-	// 24 is the size of Rela64.
-	if len(rels)%24 != 0 {
-		return errors.New("length of relocation section is not a multiple of 24")
-	}
-
-	symbols, _, err := f.getSymbols(SHT_SYMTAB)
-	if err != nil {
-		return err
-	}
-
-	b := bytes.NewReader(rels)
-	var rela Rela64
-
-	for b.Len() > 0 {
-		binary.Read(b, f.ByteOrder, &rela)
-		symNo := rela.Info >> 32
-		t := R_AARCH64(rela.Info & 0xffff)
-
-		if symNo == 0 || symNo > uint64(len(symbols)) {
-			continue
-		}
-		sym := &symbols[symNo-1]
-		if SymType(sym.Info&0xf) != STT_SECTION {
-			// We don't handle non-section relocations for now.
-			continue
-		}
-
-		// There are relocations, so this must be a normal
-		// object file, and we only look at section symbols,
-		// so we assume that the symbol value is 0.
-
-		switch t {
-		case R_AARCH64_ABS64:
-			if rela.Off+8 >= uint64(len(dst)) || rela.Addend < 0 {
-				continue
-			}
-			f.ByteOrder.PutUint64(dst[rela.Off:rela.Off+8], uint64(rela.Addend))
-		case R_AARCH64_ABS32:
-			if rela.Off+4 >= uint64(len(dst)) || rela.Addend < 0 {
-				continue
-			}
-			f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], uint32(rela.Addend))
-		}
-	}
-
-	return nil
-}
-
-func (f *File) applyRelocationsPPC(dst []byte, rels []byte) error {
-	// 12 is the size of Rela32.
-	if len(rels)%12 != 0 {
-		return errors.New("length of relocation section is not a multiple of 12")
-	}
-
-	symbols, _, err := f.getSymbols(SHT_SYMTAB)
-	if err != nil {
-		return err
-	}
-
-	b := bytes.NewReader(rels)
-	var rela Rela32
-
-	for b.Len() > 0 {
-		binary.Read(b, f.ByteOrder, &rela)
-		symNo := rela.Info >> 8
-		t := R_PPC(rela.Info & 0xff)
-
-		if symNo == 0 || symNo > uint32(len(symbols)) {
-			continue
-		}
-		sym := &symbols[symNo-1]
-		if SymType(sym.Info&0xf) != STT_SECTION {
-			// We don't handle non-section relocations for now.
-			continue
-		}
-
-		switch t {
-		case R_PPC_ADDR32:
-			if rela.Off+4 >= uint32(len(dst)) || rela.Addend < 0 {
-				continue
-			}
-			f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], uint32(rela.Addend))
-		}
-	}
-
-	return nil
-}
-
-func (f *File) applyRelocationsPPC64(dst []byte, rels []byte) error {
-	// 24 is the size of Rela64.
-	if len(rels)%24 != 0 {
-		return errors.New("length of relocation section is not a multiple of 24")
-	}
-
-	symbols, _, err := f.getSymbols(SHT_SYMTAB)
-	if err != nil {
-		return err
-	}
-
-	b := bytes.NewReader(rels)
-	var rela Rela64
-
-	for b.Len() > 0 {
-		binary.Read(b, f.ByteOrder, &rela)
-		symNo := rela.Info >> 32
-		t := R_PPC64(rela.Info & 0xffff)
-
-		if symNo == 0 || symNo > uint64(len(symbols)) {
-			continue
-		}
-		sym := &symbols[symNo-1]
-		if SymType(sym.Info&0xf) != STT_SECTION {
-			// We don't handle non-section relocations for now.
-			continue
-		}
-
-		switch t {
-		case R_PPC64_ADDR64:
-			if rela.Off+8 >= uint64(len(dst)) || rela.Addend < 0 {
-				continue
-			}
-			f.ByteOrder.PutUint64(dst[rela.Off:rela.Off+8], uint64(rela.Addend))
-		case R_PPC64_ADDR32:
-			if rela.Off+4 >= uint64(len(dst)) || rela.Addend < 0 {
-				continue
-			}
-			f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], uint32(rela.Addend))
-		}
-	}
-
-	return nil
-}
-
-func (f *File) applyRelocationsS390x(dst []byte, rels []byte) error {
-	// 24 is the size of Rela64.
-	if len(rels)%24 != 0 {
-		return errors.New("length of relocation section is not a multiple of 24")
-	}
-
-	symbols, _, err := f.getSymbols(SHT_SYMTAB)
-	if err != nil {
-		return err
-	}
-
-	b := bytes.NewBuffer(rels)
-	var rela Rela64
-
-	for b.Len() > 0 {
-		binary.Read(b, f.ByteOrder, &rela)
-		symNo := rela.Info >> 32
-		t := R_390(rela.Info & 0xffff)
-
-		if symNo == 0 || symNo > uint64(len(symbols)) {
-			continue
-		}
-		sym := &symbols[symNo-1]
-
-		switch t {
-		case R_390_64:
-			if rela.Off+8 >= uint64(len(dst)) || rela.Addend < 0 {
-				continue
-			}
-			f.ByteOrder.PutUint64(dst[rela.Off:rela.Off+8], uint64(rela.Addend)+uint64(sym.Value))
-		case R_390_32:
-			if rela.Off+4 >= uint64(len(dst)) || rela.Addend < 0 {
-				continue
-			}
-			f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], uint32(rela.Addend)+uint32(sym.Value))
-		}
-	}
-
-	return nil
-}
-
-func (f *File) DWARF() (*dwarf.Data, error) {
-	// sectionData gets the data for s, checks its size, and
-	// applies any applicable relations.
-	sectionData := func(i int, s *Section) ([]byte, error) {
-		b, err := s.Data()
-		if err != nil && uint64(len(b)) < s.Size {
-			return nil, err
-		}
-
-		for _, r := range f.Sections {
-			if r.Type != SHT_RELA && r.Type != SHT_REL {
-				continue
-			}
-			if int(r.Info) != i {
-				continue
-			}
-			rd, err := r.Data()
-			if err != nil {
-				return nil, err
-			}
-			err = f.applyRelocations(b, rd)
-			if err != nil {
-				return nil, err
-			}
-		}
-		return b, nil
-	}
-
-	// There are many other DWARF sections, but these
-	// are the ones the debug/dwarf package uses.
-	// Don't bother loading others.
-	var dat = map[string][]byte{"abbrev": nil, "info": nil, "str": nil, "line": nil, "ranges": nil}
-	for i, s := range f.Sections {
-		if !strings.HasPrefix(s.Name, ".debug_") {
-			continue
-		}
-		if _, ok := dat[s.Name[7:]]; !ok {
-			continue
-		}
-		b, err := sectionData(i, s)
-		if err != nil {
-			return nil, err
-		}
-		dat[s.Name[7:]] = b
-	}
-
-	d, err := dwarf.New(dat["abbrev"], nil, nil, dat["info"], dat["line"], nil, dat["ranges"], dat["str"])
-	if err != nil {
-		return nil, err
-	}
-
-	// Look for DWARF4 .debug_types sections.
-	for i, s := range f.Sections {
-		if s.Name == ".debug_types" {
-			b, err := sectionData(i, s)
-			if err != nil {
-				return nil, err
-			}
-
-			err = d.AddTypes(fmt.Sprintf("types-%d", i), b)
-			if err != nil {
-				return nil, err
-			}
-		}
-	}
-
-	return d, nil
-}
-
-// Symbols returns the symbol table for f. The symbols will be listed in the order
-// they appear in f.
-//
-// For compatibility with Go 1.0, Symbols omits the null symbol at index 0.
-// After retrieving the symbols as symtab, an externally supplied index x
-// corresponds to symtab[x-1], not symtab[x].
-func (f *File) Symbols() ([]Symbol, error) {
-	sym, _, err := f.getSymbols(SHT_SYMTAB)
-	return sym, err
-}
-
-// DynamicSymbols returns the dynamic symbol table for f. The symbols
-// will be listed in the order they appear in f.
-//
-// For compatibility with Symbols, DynamicSymbols omits the null symbol at index 0.
-// After retrieving the symbols as symtab, an externally supplied index x
-// corresponds to symtab[x-1], not symtab[x].
-func (f *File) DynamicSymbols() ([]Symbol, error) {
-	sym, _, err := f.getSymbols(SHT_DYNSYM)
-	return sym, err
-}
-
-type ImportedSymbol struct {
-	Name    string
-	Version string
-	Library string
-}
-
-// ImportedSymbols returns the names of all symbols
-// referred to by the binary f that are expected to be
-// satisfied by other libraries at dynamic load time.
-// It does not return weak symbols.
-func (f *File) ImportedSymbols() ([]ImportedSymbol, error) {
-	sym, str, err := f.getSymbols(SHT_DYNSYM)
-	if err != nil {
-		return nil, err
-	}
-	f.gnuVersionInit(str)
-	var all []ImportedSymbol
-	for i, s := range sym {
-		if ST_BIND(s.Info) == STB_GLOBAL && s.Section == SHN_UNDEF {
-			all = append(all, ImportedSymbol{Name: s.Name})
-			f.gnuVersion(i, &all[len(all)-1])
-		}
-	}
-	return all, nil
-}
-
-type verneed struct {
-	File string
-	Name string
-}
-
-// gnuVersionInit parses the GNU version tables
-// for use by calls to gnuVersion.
-func (f *File) gnuVersionInit(str []byte) {
-	// Accumulate verneed information.
-	vn := f.SectionByType(SHT_GNU_VERNEED)
-	if vn == nil {
-		return
-	}
-	d, _ := vn.Data()
-
-	var need []verneed
-	i := 0
-	for {
-		if i+16 > len(d) {
-			break
-		}
-		vers := f.ByteOrder.Uint16(d[i : i+2])
-		if vers != 1 {
-			break
-		}
-		cnt := f.ByteOrder.Uint16(d[i+2 : i+4])
-		fileoff := f.ByteOrder.Uint32(d[i+4 : i+8])
-		aux := f.ByteOrder.Uint32(d[i+8 : i+12])
-		next := f.ByteOrder.Uint32(d[i+12 : i+16])
-		file, _ := getString(str, int(fileoff))
-
-		var name string
-		j := i + int(aux)
-		for c := 0; c < int(cnt); c++ {
-			if j+16 > len(d) {
-				break
-			}
-			// hash := f.ByteOrder.Uint32(d[j:j+4])
-			// flags := f.ByteOrder.Uint16(d[j+4:j+6])
-			other := f.ByteOrder.Uint16(d[j+6 : j+8])
-			nameoff := f.ByteOrder.Uint32(d[j+8 : j+12])
-			next := f.ByteOrder.Uint32(d[j+12 : j+16])
-			name, _ = getString(str, int(nameoff))
-			ndx := int(other)
-			if ndx >= len(need) {
-				a := make([]verneed, 2*(ndx+1))
-				copy(a, need)
-				need = a
-			}
-
-			need[ndx] = verneed{file, name}
-			if next == 0 {
-				break
-			}
-			j += int(next)
-		}
-
-		if next == 0 {
-			break
-		}
-		i += int(next)
-	}
-
-	// Versym parallels symbol table, indexing into verneed.
-	vs := f.SectionByType(SHT_GNU_VERSYM)
-	if vs == nil {
-		return
-	}
-	d, _ = vs.Data()
-
-	f.gnuNeed = need
-	f.gnuVersym = d
-}
-
-// gnuVersion adds Library and Version information to sym,
-// which came from offset i of the symbol table.
-func (f *File) gnuVersion(i int, sym *ImportedSymbol) {
-	// Each entry is two bytes.
-	i = (i + 1) * 2
-	if i >= len(f.gnuVersym) {
-		return
-	}
-	j := int(f.ByteOrder.Uint16(f.gnuVersym[i:]))
-	if j < 2 || j >= len(f.gnuNeed) {
-		return
-	}
-	n := &f.gnuNeed[j]
-	sym.Library = n.File
-	sym.Version = n.Name
-}
-
-// ImportedLibraries returns the names of all libraries
-// referred to by the binary f that are expected to be
-// linked with the binary at dynamic link time.
-func (f *File) ImportedLibraries() ([]string, error) {
-	return f.DynString(DT_NEEDED)
-}
-
-// DynString returns the strings listed for the given tag in the file's dynamic
-// section.
-//
-// The tag must be one that takes string values: DT_NEEDED, DT_SONAME, DT_RPATH, or
-// DT_RUNPATH.
-func (f *File) DynString(tag DynTag) ([]string, error) {
-	switch tag {
-	case DT_NEEDED, DT_SONAME, DT_RPATH, DT_RUNPATH:
-	default:
-		return nil, fmt.Errorf("non-string-valued tag %v", tag)
-	}
-	ds := f.SectionByType(SHT_DYNAMIC)
-	if ds == nil {
-		// not dynamic, so no libraries
-		return nil, nil
-	}
-	d, err := ds.Data()
-	if err != nil {
-		return nil, err
-	}
-	str, err := f.stringTable(ds.Link)
-	if err != nil {
-		return nil, err
-	}
-	var all []string
-	for len(d) > 0 {
-		var t DynTag
-		var v uint64
-		switch f.Class {
-		case ELFCLASS32:
-			t = DynTag(f.ByteOrder.Uint32(d[0:4]))
-			v = uint64(f.ByteOrder.Uint32(d[4:8]))
-			d = d[8:]
-		case ELFCLASS64:
-			t = DynTag(f.ByteOrder.Uint64(d[0:8]))
-			v = f.ByteOrder.Uint64(d[8:16])
-			d = d[16:]
-		}
-		if t == tag {
-			s, ok := getString(str, int(v))
-			if ok {
-				all = append(all, s)
-			}
-		}
-	}
-	return all, nil
-}
diff --git a/third_party/gofrontend/libgo/go/debug/elf/file_test.go b/third_party/gofrontend/libgo/go/debug/elf/file_test.go
deleted file mode 100644
index 1ad4314..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/file_test.go
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package elf
-
-import (
-	"bytes"
-	"compress/gzip"
-	"debug/dwarf"
-	"encoding/binary"
-	"io"
-	"net"
-	"os"
-	"path"
-	"reflect"
-	"runtime"
-	"testing"
-)
-
-type fileTest struct {
-	file     string
-	hdr      FileHeader
-	sections []SectionHeader
-	progs    []ProgHeader
-	needed   []string
-}
-
-var fileTests = []fileTest{
-	{
-		"testdata/gcc-386-freebsd-exec",
-		FileHeader{ELFCLASS32, ELFDATA2LSB, EV_CURRENT, ELFOSABI_FREEBSD, 0, binary.LittleEndian, ET_EXEC, EM_386, 0x80483cc},
-		[]SectionHeader{
-			{"", SHT_NULL, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
-			{".interp", SHT_PROGBITS, SHF_ALLOC, 0x80480d4, 0xd4, 0x15, 0x0, 0x0, 0x1, 0x0},
-			{".hash", SHT_HASH, SHF_ALLOC, 0x80480ec, 0xec, 0x90, 0x3, 0x0, 0x4, 0x4},
-			{".dynsym", SHT_DYNSYM, SHF_ALLOC, 0x804817c, 0x17c, 0x110, 0x4, 0x1, 0x4, 0x10},
-			{".dynstr", SHT_STRTAB, SHF_ALLOC, 0x804828c, 0x28c, 0xbb, 0x0, 0x0, 0x1, 0x0},
-			{".rel.plt", SHT_REL, SHF_ALLOC, 0x8048348, 0x348, 0x20, 0x3, 0x7, 0x4, 0x8},
-			{".init", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR, 0x8048368, 0x368, 0x11, 0x0, 0x0, 0x4, 0x0},
-			{".plt", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR, 0x804837c, 0x37c, 0x50, 0x0, 0x0, 0x4, 0x4},
-			{".text", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR, 0x80483cc, 0x3cc, 0x180, 0x0, 0x0, 0x4, 0x0},
-			{".fini", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR, 0x804854c, 0x54c, 0xc, 0x0, 0x0, 0x4, 0x0},
-			{".rodata", SHT_PROGBITS, SHF_ALLOC, 0x8048558, 0x558, 0xa3, 0x0, 0x0, 0x1, 0x0},
-			{".data", SHT_PROGBITS, SHF_WRITE + SHF_ALLOC, 0x80495fc, 0x5fc, 0xc, 0x0, 0x0, 0x4, 0x0},
-			{".eh_frame", SHT_PROGBITS, SHF_ALLOC, 0x8049608, 0x608, 0x4, 0x0, 0x0, 0x4, 0x0},
-			{".dynamic", SHT_DYNAMIC, SHF_WRITE + SHF_ALLOC, 0x804960c, 0x60c, 0x98, 0x4, 0x0, 0x4, 0x8},
-			{".ctors", SHT_PROGBITS, SHF_WRITE + SHF_ALLOC, 0x80496a4, 0x6a4, 0x8, 0x0, 0x0, 0x4, 0x0},
-			{".dtors", SHT_PROGBITS, SHF_WRITE + SHF_ALLOC, 0x80496ac, 0x6ac, 0x8, 0x0, 0x0, 0x4, 0x0},
-			{".jcr", SHT_PROGBITS, SHF_WRITE + SHF_ALLOC, 0x80496b4, 0x6b4, 0x4, 0x0, 0x0, 0x4, 0x0},
-			{".got", SHT_PROGBITS, SHF_WRITE + SHF_ALLOC, 0x80496b8, 0x6b8, 0x1c, 0x0, 0x0, 0x4, 0x4},
-			{".bss", SHT_NOBITS, SHF_WRITE + SHF_ALLOC, 0x80496d4, 0x6d4, 0x20, 0x0, 0x0, 0x4, 0x0},
-			{".comment", SHT_PROGBITS, 0x0, 0x0, 0x6d4, 0x12d, 0x0, 0x0, 0x1, 0x0},
-			{".debug_aranges", SHT_PROGBITS, 0x0, 0x0, 0x801, 0x20, 0x0, 0x0, 0x1, 0x0},
-			{".debug_pubnames", SHT_PROGBITS, 0x0, 0x0, 0x821, 0x1b, 0x0, 0x0, 0x1, 0x0},
-			{".debug_info", SHT_PROGBITS, 0x0, 0x0, 0x83c, 0x11d, 0x0, 0x0, 0x1, 0x0},
-			{".debug_abbrev", SHT_PROGBITS, 0x0, 0x0, 0x959, 0x41, 0x0, 0x0, 0x1, 0x0},
-			{".debug_line", SHT_PROGBITS, 0x0, 0x0, 0x99a, 0x35, 0x0, 0x0, 0x1, 0x0},
-			{".debug_frame", SHT_PROGBITS, 0x0, 0x0, 0x9d0, 0x30, 0x0, 0x0, 0x4, 0x0},
-			{".debug_str", SHT_PROGBITS, 0x0, 0x0, 0xa00, 0xd, 0x0, 0x0, 0x1, 0x0},
-			{".shstrtab", SHT_STRTAB, 0x0, 0x0, 0xa0d, 0xf8, 0x0, 0x0, 0x1, 0x0},
-			{".symtab", SHT_SYMTAB, 0x0, 0x0, 0xfb8, 0x4b0, 0x1d, 0x38, 0x4, 0x10},
-			{".strtab", SHT_STRTAB, 0x0, 0x0, 0x1468, 0x206, 0x0, 0x0, 0x1, 0x0},
-		},
-		[]ProgHeader{
-			{PT_PHDR, PF_R + PF_X, 0x34, 0x8048034, 0x8048034, 0xa0, 0xa0, 0x4},
-			{PT_INTERP, PF_R, 0xd4, 0x80480d4, 0x80480d4, 0x15, 0x15, 0x1},
-			{PT_LOAD, PF_R + PF_X, 0x0, 0x8048000, 0x8048000, 0x5fb, 0x5fb, 0x1000},
-			{PT_LOAD, PF_R + PF_W, 0x5fc, 0x80495fc, 0x80495fc, 0xd8, 0xf8, 0x1000},
-			{PT_DYNAMIC, PF_R + PF_W, 0x60c, 0x804960c, 0x804960c, 0x98, 0x98, 0x4},
-		},
-		[]string{"libc.so.6"},
-	},
-	{
-		"testdata/gcc-amd64-linux-exec",
-		FileHeader{ELFCLASS64, ELFDATA2LSB, EV_CURRENT, ELFOSABI_NONE, 0, binary.LittleEndian, ET_EXEC, EM_X86_64, 0x4003e0},
-		[]SectionHeader{
-			{"", SHT_NULL, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
-			{".interp", SHT_PROGBITS, SHF_ALLOC, 0x400200, 0x200, 0x1c, 0x0, 0x0, 0x1, 0x0},
-			{".note.ABI-tag", SHT_NOTE, SHF_ALLOC, 0x40021c, 0x21c, 0x20, 0x0, 0x0, 0x4, 0x0},
-			{".hash", SHT_HASH, SHF_ALLOC, 0x400240, 0x240, 0x24, 0x5, 0x0, 0x8, 0x4},
-			{".gnu.hash", SHT_LOOS + 268435446, SHF_ALLOC, 0x400268, 0x268, 0x1c, 0x5, 0x0, 0x8, 0x0},
-			{".dynsym", SHT_DYNSYM, SHF_ALLOC, 0x400288, 0x288, 0x60, 0x6, 0x1, 0x8, 0x18},
-			{".dynstr", SHT_STRTAB, SHF_ALLOC, 0x4002e8, 0x2e8, 0x3d, 0x0, 0x0, 0x1, 0x0},
-			{".gnu.version", SHT_HIOS, SHF_ALLOC, 0x400326, 0x326, 0x8, 0x5, 0x0, 0x2, 0x2},
-			{".gnu.version_r", SHT_LOOS + 268435454, SHF_ALLOC, 0x400330, 0x330, 0x20, 0x6, 0x1, 0x8, 0x0},
-			{".rela.dyn", SHT_RELA, SHF_ALLOC, 0x400350, 0x350, 0x18, 0x5, 0x0, 0x8, 0x18},
-			{".rela.plt", SHT_RELA, SHF_ALLOC, 0x400368, 0x368, 0x30, 0x5, 0xc, 0x8, 0x18},
-			{".init", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR, 0x400398, 0x398, 0x18, 0x0, 0x0, 0x4, 0x0},
-			{".plt", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR, 0x4003b0, 0x3b0, 0x30, 0x0, 0x0, 0x4, 0x10},
-			{".text", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR, 0x4003e0, 0x3e0, 0x1b4, 0x0, 0x0, 0x10, 0x0},
-			{".fini", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR, 0x400594, 0x594, 0xe, 0x0, 0x0, 0x4, 0x0},
-			{".rodata", SHT_PROGBITS, SHF_ALLOC, 0x4005a4, 0x5a4, 0x11, 0x0, 0x0, 0x4, 0x0},
-			{".eh_frame_hdr", SHT_PROGBITS, SHF_ALLOC, 0x4005b8, 0x5b8, 0x24, 0x0, 0x0, 0x4, 0x0},
-			{".eh_frame", SHT_PROGBITS, SHF_ALLOC, 0x4005e0, 0x5e0, 0xa4, 0x0, 0x0, 0x8, 0x0},
-			{".ctors", SHT_PROGBITS, SHF_WRITE + SHF_ALLOC, 0x600688, 0x688, 0x10, 0x0, 0x0, 0x8, 0x0},
-			{".dtors", SHT_PROGBITS, SHF_WRITE + SHF_ALLOC, 0x600698, 0x698, 0x10, 0x0, 0x0, 0x8, 0x0},
-			{".jcr", SHT_PROGBITS, SHF_WRITE + SHF_ALLOC, 0x6006a8, 0x6a8, 0x8, 0x0, 0x0, 0x8, 0x0},
-			{".dynamic", SHT_DYNAMIC, SHF_WRITE + SHF_ALLOC, 0x6006b0, 0x6b0, 0x1a0, 0x6, 0x0, 0x8, 0x10},
-			{".got", SHT_PROGBITS, SHF_WRITE + SHF_ALLOC, 0x600850, 0x850, 0x8, 0x0, 0x0, 0x8, 0x8},
-			{".got.plt", SHT_PROGBITS, SHF_WRITE + SHF_ALLOC, 0x600858, 0x858, 0x28, 0x0, 0x0, 0x8, 0x8},
-			{".data", SHT_PROGBITS, SHF_WRITE + SHF_ALLOC, 0x600880, 0x880, 0x18, 0x0, 0x0, 0x8, 0x0},
-			{".bss", SHT_NOBITS, SHF_WRITE + SHF_ALLOC, 0x600898, 0x898, 0x8, 0x0, 0x0, 0x4, 0x0},
-			{".comment", SHT_PROGBITS, 0x0, 0x0, 0x898, 0x126, 0x0, 0x0, 0x1, 0x0},
-			{".debug_aranges", SHT_PROGBITS, 0x0, 0x0, 0x9c0, 0x90, 0x0, 0x0, 0x10, 0x0},
-			{".debug_pubnames", SHT_PROGBITS, 0x0, 0x0, 0xa50, 0x25, 0x0, 0x0, 0x1, 0x0},
-			{".debug_info", SHT_PROGBITS, 0x0, 0x0, 0xa75, 0x1a7, 0x0, 0x0, 0x1, 0x0},
-			{".debug_abbrev", SHT_PROGBITS, 0x0, 0x0, 0xc1c, 0x6f, 0x0, 0x0, 0x1, 0x0},
-			{".debug_line", SHT_PROGBITS, 0x0, 0x0, 0xc8b, 0x13f, 0x0, 0x0, 0x1, 0x0},
-			{".debug_str", SHT_PROGBITS, SHF_MERGE + SHF_STRINGS, 0x0, 0xdca, 0xb1, 0x0, 0x0, 0x1, 0x1},
-			{".debug_ranges", SHT_PROGBITS, 0x0, 0x0, 0xe80, 0x90, 0x0, 0x0, 0x10, 0x0},
-			{".shstrtab", SHT_STRTAB, 0x0, 0x0, 0xf10, 0x149, 0x0, 0x0, 0x1, 0x0},
-			{".symtab", SHT_SYMTAB, 0x0, 0x0, 0x19a0, 0x6f0, 0x24, 0x39, 0x8, 0x18},
-			{".strtab", SHT_STRTAB, 0x0, 0x0, 0x2090, 0x1fc, 0x0, 0x0, 0x1, 0x0},
-		},
-		[]ProgHeader{
-			{PT_PHDR, PF_R + PF_X, 0x40, 0x400040, 0x400040, 0x1c0, 0x1c0, 0x8},
-			{PT_INTERP, PF_R, 0x200, 0x400200, 0x400200, 0x1c, 0x1c, 1},
-			{PT_LOAD, PF_R + PF_X, 0x0, 0x400000, 0x400000, 0x684, 0x684, 0x200000},
-			{PT_LOAD, PF_R + PF_W, 0x688, 0x600688, 0x600688, 0x210, 0x218, 0x200000},
-			{PT_DYNAMIC, PF_R + PF_W, 0x6b0, 0x6006b0, 0x6006b0, 0x1a0, 0x1a0, 0x8},
-			{PT_NOTE, PF_R, 0x21c, 0x40021c, 0x40021c, 0x20, 0x20, 0x4},
-			{PT_LOOS + 0x474E550, PF_R, 0x5b8, 0x4005b8, 0x4005b8, 0x24, 0x24, 0x4},
-			{PT_LOOS + 0x474E551, PF_R + PF_W, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8},
-		},
-		[]string{"libc.so.6"},
-	},
-	{
-		"testdata/hello-world-core.gz",
-		FileHeader{ELFCLASS64, ELFDATA2LSB, EV_CURRENT, ELFOSABI_NONE, 0x0, binary.LittleEndian, ET_CORE, EM_X86_64, 0x0},
-		[]SectionHeader{},
-		[]ProgHeader{
-			{Type: PT_NOTE, Flags: 0x0, Off: 0x3f8, Vaddr: 0x0, Paddr: 0x0, Filesz: 0x8ac, Memsz: 0x0, Align: 0x0},
-			{Type: PT_LOAD, Flags: PF_X + PF_R, Off: 0x1000, Vaddr: 0x400000, Paddr: 0x0, Filesz: 0x0, Memsz: 0x1000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_R, Off: 0x1000, Vaddr: 0x401000, Paddr: 0x0, Filesz: 0x1000, Memsz: 0x1000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_W + PF_R, Off: 0x2000, Vaddr: 0x402000, Paddr: 0x0, Filesz: 0x1000, Memsz: 0x1000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_X + PF_R, Off: 0x3000, Vaddr: 0x7f54078b8000, Paddr: 0x0, Filesz: 0x0, Memsz: 0x1b5000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: 0x0, Off: 0x3000, Vaddr: 0x7f5407a6d000, Paddr: 0x0, Filesz: 0x0, Memsz: 0x1ff000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_R, Off: 0x3000, Vaddr: 0x7f5407c6c000, Paddr: 0x0, Filesz: 0x4000, Memsz: 0x4000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_W + PF_R, Off: 0x7000, Vaddr: 0x7f5407c70000, Paddr: 0x0, Filesz: 0x2000, Memsz: 0x2000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_W + PF_R, Off: 0x9000, Vaddr: 0x7f5407c72000, Paddr: 0x0, Filesz: 0x5000, Memsz: 0x5000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_X + PF_R, Off: 0xe000, Vaddr: 0x7f5407c77000, Paddr: 0x0, Filesz: 0x0, Memsz: 0x22000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_W + PF_R, Off: 0xe000, Vaddr: 0x7f5407e81000, Paddr: 0x0, Filesz: 0x3000, Memsz: 0x3000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_W + PF_R, Off: 0x11000, Vaddr: 0x7f5407e96000, Paddr: 0x0, Filesz: 0x3000, Memsz: 0x3000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_R, Off: 0x14000, Vaddr: 0x7f5407e99000, Paddr: 0x0, Filesz: 0x1000, Memsz: 0x1000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_W + PF_R, Off: 0x15000, Vaddr: 0x7f5407e9a000, Paddr: 0x0, Filesz: 0x2000, Memsz: 0x2000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_W + PF_R, Off: 0x17000, Vaddr: 0x7fff79972000, Paddr: 0x0, Filesz: 0x23000, Memsz: 0x23000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_X + PF_R, Off: 0x3a000, Vaddr: 0x7fff799f8000, Paddr: 0x0, Filesz: 0x1000, Memsz: 0x1000, Align: 0x1000},
-			{Type: PT_LOAD, Flags: PF_X + PF_R, Off: 0x3b000, Vaddr: 0xffffffffff600000, Paddr: 0x0, Filesz: 0x1000, Memsz: 0x1000, Align: 0x1000},
-		},
-		nil,
-	},
-}
-
-func TestOpen(t *testing.T) {
-	for i := range fileTests {
-		tt := &fileTests[i]
-
-		var f *File
-		var err error
-		if path.Ext(tt.file) == ".gz" {
-			var r io.ReaderAt
-			if r, err = decompress(tt.file); err == nil {
-				f, err = NewFile(r)
-			}
-		} else {
-			f, err = Open(tt.file)
-		}
-		if err != nil {
-			t.Errorf("cannot open file %s: %v", tt.file, err)
-			continue
-		}
-		defer f.Close()
-		if !reflect.DeepEqual(f.FileHeader, tt.hdr) {
-			t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.FileHeader, tt.hdr)
-			continue
-		}
-		for i, s := range f.Sections {
-			if i >= len(tt.sections) {
-				break
-			}
-			sh := &tt.sections[i]
-			if !reflect.DeepEqual(&s.SectionHeader, sh) {
-				t.Errorf("open %s, section %d:\n\thave %#v\n\twant %#v\n", tt.file, i, &s.SectionHeader, sh)
-			}
-		}
-		for i, p := range f.Progs {
-			if i >= len(tt.progs) {
-				break
-			}
-			ph := &tt.progs[i]
-			if !reflect.DeepEqual(&p.ProgHeader, ph) {
-				t.Errorf("open %s, program %d:\n\thave %#v\n\twant %#v\n", tt.file, i, &p.ProgHeader, ph)
-			}
-		}
-		tn := len(tt.sections)
-		fn := len(f.Sections)
-		if tn != fn {
-			t.Errorf("open %s: len(Sections) = %d, want %d", tt.file, fn, tn)
-		}
-		tn = len(tt.progs)
-		fn = len(f.Progs)
-		if tn != fn {
-			t.Errorf("open %s: len(Progs) = %d, want %d", tt.file, fn, tn)
-		}
-		tl := tt.needed
-		fl, err := f.ImportedLibraries()
-		if err != nil {
-			t.Error(err)
-		}
-		if !reflect.DeepEqual(tl, fl) {
-			t.Errorf("open %s: DT_NEEDED = %v, want %v", tt.file, tl, fl)
-		}
-	}
-}
-
-// elf.NewFile requires io.ReaderAt, which compress/gzip cannot
-// provide. Decompress the file to a bytes.Reader.
-func decompress(gz string) (io.ReaderAt, error) {
-	in, err := os.Open(gz)
-	if err != nil {
-		return nil, err
-	}
-	defer in.Close()
-	r, err := gzip.NewReader(in)
-	if err != nil {
-		return nil, err
-	}
-	var out bytes.Buffer
-	_, err = io.Copy(&out, r)
-	return bytes.NewReader(out.Bytes()), err
-}
-
-type relocationTestEntry struct {
-	entryNumber int
-	entry       *dwarf.Entry
-}
-
-type relocationTest struct {
-	file    string
-	entries []relocationTestEntry
-}
-
-var relocationTests = []relocationTest{
-	{
-		"testdata/go-relocation-test-gcc441-x86-64.obj",
-		[]relocationTestEntry{
-			{0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{{Attr: dwarf.AttrProducer, Val: "GNU C 4.4.1", Class: dwarf.ClassString}, {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrName, Val: "go-relocation-test.c", Class: dwarf.ClassString}, {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, {Attr: dwarf.AttrHighpc, Val: uint64(0x6), Class: dwarf.ClassAddress}, {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}}}},
-		},
-	},
-	{
-		"testdata/go-relocation-test-gcc441-x86.obj",
-		[]relocationTestEntry{
-			{0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{{Attr: dwarf.AttrProducer, Val: "GNU C 4.4.1", Class: dwarf.ClassString}, {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrName, Val: "t.c", Class: dwarf.ClassString}, {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, {Attr: dwarf.AttrHighpc, Val: uint64(0x5), Class: dwarf.ClassAddress}, {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}}}},
-		},
-	},
-	{
-		"testdata/go-relocation-test-gcc424-x86-64.obj",
-		[]relocationTestEntry{
-			{0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{{Attr: dwarf.AttrProducer, Val: "GNU C 4.2.4 (Ubuntu 4.2.4-1ubuntu4)", Class: dwarf.ClassString}, {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc424.c", Class: dwarf.ClassString}, {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, {Attr: dwarf.AttrHighpc, Val: uint64(0x6), Class: dwarf.ClassAddress}, {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}}}},
-		},
-	},
-	{
-		"testdata/go-relocation-test-gcc482-aarch64.obj",
-		[]relocationTestEntry{
-			{0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{{Attr: dwarf.AttrProducer, Val: "GNU C 4.8.2 -g -fstack-protector", Class: dwarf.ClassString}, {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc482.c", Class: dwarf.ClassString}, {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, {Attr: dwarf.AttrHighpc, Val: int64(0x24), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}}}},
-		},
-	},
-	{
-		"testdata/go-relocation-test-gcc492-arm.obj",
-		[]relocationTestEntry{
-			{0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{{Attr: dwarf.AttrProducer, Val: "GNU C 4.9.2 20141224 (prerelease) -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -mtls-dialect=gnu -g", Class: dwarf.ClassString}, {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc492.c", Class: dwarf.ClassString}, {Attr: dwarf.AttrCompDir, Val: "/root/go/src/debug/elf/testdata", Class: dwarf.ClassString}, {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, {Attr: dwarf.AttrHighpc, Val: int64(0x28), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}}}},
-		},
-	},
-	{
-		"testdata/go-relocation-test-clang-arm.obj",
-		[]relocationTestEntry{
-			{0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{dwarf.Field{Attr: dwarf.AttrProducer, Val: "Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)", Class: dwarf.ClassString}, dwarf.Field{Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, dwarf.Field{Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, dwarf.Field{Attr: dwarf.AttrStmtList, Val: int64(0x0), Class: dwarf.ClassLinePtr}, dwarf.Field{Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, dwarf.Field{Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, dwarf.Field{Attr: dwarf.AttrHighpc, Val: int64(48), Class: dwarf.ClassConstant}}}},
-		},
-	},
-	{
-		"testdata/go-relocation-test-gcc5-ppc.obj",
-		[]relocationTestEntry{
-			{0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{dwarf.Field{Attr: dwarf.AttrProducer, Val: "GNU C11 5.0.0 20150116 (experimental) -Asystem=linux -Asystem=unix -Asystem=posix -g", Class: dwarf.ClassString}, dwarf.Field{Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, dwarf.Field{Attr: dwarf.AttrName, Val: "go-relocation-test-gcc5-ppc.c", Class: dwarf.ClassString}, dwarf.Field{Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, dwarf.Field{Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, dwarf.Field{Attr: dwarf.AttrHighpc, Val: int64(0x44), Class: dwarf.ClassConstant}, dwarf.Field{Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}}}},
-		},
-	},
-	{
-		"testdata/go-relocation-test-gcc482-ppc64le.obj",
-		[]relocationTestEntry{
-			{0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{dwarf.Field{Attr: dwarf.AttrProducer, Val: "GNU C 4.8.2 -Asystem=linux -Asystem=unix -Asystem=posix -msecure-plt -mtune=power8 -mcpu=power7 -gdwarf-2 -fstack-protector", Class: dwarf.ClassString}, dwarf.Field{Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, dwarf.Field{Attr: dwarf.AttrName, Val: "go-relocation-test-gcc482-ppc64le.c", Class: dwarf.ClassString}, dwarf.Field{Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, dwarf.Field{Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, dwarf.Field{Attr: dwarf.AttrHighpc, Val: uint64(0x24), Class: dwarf.ClassAddress}, dwarf.Field{Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}}}},
-		},
-	},
-	{
-		"testdata/go-relocation-test-clang-x86.obj",
-		[]relocationTestEntry{
-			{0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{{Attr: dwarf.AttrProducer, Val: "clang version google3-trunk (trunk r209387)", Class: dwarf.ClassString}, {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrName, Val: "go-relocation-test-clang.c", Class: dwarf.ClassString}, {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}}}},
-		},
-	},
-	{
-		"testdata/gcc-amd64-openbsd-debug-with-rela.obj",
-		[]relocationTestEntry{
-			{203, &dwarf.Entry{Offset: 0xc62, Tag: dwarf.TagMember, Children: false, Field: []dwarf.Field{{Attr: dwarf.AttrName, Val: "it_interval", Class: dwarf.ClassString}, {Attr: dwarf.AttrDeclFile, Val: int64(7), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrDeclLine, Val: int64(236), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrType, Val: dwarf.Offset(0xb7f), Class: dwarf.ClassReference}, {Attr: dwarf.AttrDataMemberLoc, Val: []byte{0x23, 0x0}, Class: dwarf.ClassExprLoc}}}},
-			{204, &dwarf.Entry{Offset: 0xc70, Tag: dwarf.TagMember, Children: false, Field: []dwarf.Field{{Attr: dwarf.AttrName, Val: "it_value", Class: dwarf.ClassString}, {Attr: dwarf.AttrDeclFile, Val: int64(7), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrDeclLine, Val: int64(237), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrType, Val: dwarf.Offset(0xb7f), Class: dwarf.ClassReference}, {Attr: dwarf.AttrDataMemberLoc, Val: []byte{0x23, 0x10}, Class: dwarf.ClassExprLoc}}}},
-		},
-	},
-}
-
-func TestDWARFRelocations(t *testing.T) {
-	for i, test := range relocationTests {
-		f, err := Open(test.file)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-		dwarf, err := f.DWARF()
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-		for _, testEntry := range test.entries {
-			reader := dwarf.Reader()
-			for j := 0; j < testEntry.entryNumber; j++ {
-				entry, err := reader.Next()
-				if entry == nil || err != nil {
-					t.Errorf("Failed to skip to entry %d: %v", testEntry.entryNumber, err)
-					continue
-				}
-			}
-			entry, err := reader.Next()
-			if err != nil {
-				t.Error(err)
-				continue
-			}
-			if !reflect.DeepEqual(testEntry.entry, entry) {
-				t.Errorf("#%d/%d: mismatch: got:%#v want:%#v", i, testEntry.entryNumber, entry, testEntry.entry)
-				continue
-			}
-		}
-	}
-}
-
-func TestNoSectionOverlaps(t *testing.T) {
-	// Ensure 6l outputs sections without overlaps.
-	if runtime.GOOS != "linux" && runtime.GOOS != "freebsd" {
-		return // not ELF
-	}
-	_ = net.ResolveIPAddr // force dynamic linkage
-	f, err := Open(os.Args[0])
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	for i, si := range f.Sections {
-		sih := si.SectionHeader
-		if sih.Type == SHT_NOBITS {
-			continue
-		}
-		for j, sj := range f.Sections {
-			sjh := sj.SectionHeader
-			if i == j || sjh.Type == SHT_NOBITS || sih.Offset == sjh.Offset && sih.Size == 0 {
-				continue
-			}
-			if sih.Offset >= sjh.Offset && sih.Offset < sjh.Offset+sjh.Size {
-				t.Errorf("ld produced ELF with section %s within %s: 0x%x <= 0x%x..0x%x < 0x%x",
-					sih.Name, sjh.Name, sjh.Offset, sih.Offset, sih.Offset+sih.Size, sjh.Offset+sjh.Size)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/debug/elf/symbols_test.go b/third_party/gofrontend/libgo/go/debug/elf/symbols_test.go
deleted file mode 100644
index 1b79520..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/symbols_test.go
+++ /dev/null
@@ -1,834 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package elf
-
-import (
-	"io"
-	"path"
-	"reflect"
-	"testing"
-)
-
-// TODO: remove duplicate code
-func TestSymbols(t *testing.T) {
-	do := func(file string, ts []Symbol, getfunc func(*File) ([]Symbol, error)) {
-		var f *File
-		var err error
-		if path.Ext(file) == ".gz" {
-			var r io.ReaderAt
-			if r, err = decompress(file); err == nil {
-				f, err = NewFile(r)
-			}
-		} else {
-			f, err = Open(file)
-		}
-		if err != nil {
-			t.Errorf("TestSymbols: cannot open file %s: %v", file, err)
-			return
-		}
-		defer f.Close()
-		fs, err := getfunc(f)
-		if err != nil && err != ErrNoSymbols {
-			t.Error(err)
-			return
-		} else if err == ErrNoSymbols {
-			fs = []Symbol{}
-		}
-		if !reflect.DeepEqual(ts, fs) {
-			t.Errorf("%s: Symbols = %v, want %v", file, ts, fs)
-		}
-	}
-	for file, ts := range symbolsGolden {
-		do(file, ts, (*File).Symbols)
-	}
-	for file, ts := range dynamicSymbolsGolden {
-		do(file, ts, (*File).DynamicSymbols)
-	}
-}
-
-// golden symbol table data generated by testdata/getgoldsym.c
-
-var symbolsGolden = map[string][]Symbol{
-	"testdata/gcc-amd64-linux-exec": {
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x1,
-			Value:   0x400200,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x2,
-			Value:   0x40021C,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x3,
-			Value:   0x400240,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x4,
-			Value:   0x400268,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x5,
-			Value:   0x400288,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x6,
-			Value:   0x4002E8,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x7,
-			Value:   0x400326,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x8,
-			Value:   0x400330,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x9,
-			Value:   0x400350,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0xA,
-			Value:   0x400368,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0xB,
-			Value:   0x400398,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0xC,
-			Value:   0x4003B0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0xD,
-			Value:   0x4003E0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0xE,
-			Value:   0x400594,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0xF,
-			Value:   0x4005A4,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x10,
-			Value:   0x4005B8,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x11,
-			Value:   0x4005E0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x12,
-			Value:   0x600688,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x13,
-			Value:   0x600698,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x14,
-			Value:   0x6006A8,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x15,
-			Value:   0x6006B0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x16,
-			Value:   0x600850,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x17,
-			Value:   0x600858,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x18,
-			Value:   0x600880,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x19,
-			Value:   0x600898,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x1A,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x1B,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x1C,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x1D,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x1E,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x1F,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x20,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x21,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "init.c",
-			Info:    0x4,
-			Other:   0x0,
-			Section: 0xFFF1,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "initfini.c",
-			Info:    0x4,
-			Other:   0x0,
-			Section: 0xFFF1,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "call_gmon_start",
-			Info:    0x2,
-			Other:   0x0,
-			Section: 0xD,
-			Value:   0x40040C,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "crtstuff.c",
-			Info:    0x4,
-			Other:   0x0,
-			Section: 0xFFF1,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__CTOR_LIST__",
-			Info:    0x1,
-			Other:   0x0,
-			Section: 0x12,
-			Value:   0x600688,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__DTOR_LIST__",
-			Info:    0x1,
-			Other:   0x0,
-			Section: 0x13,
-			Value:   0x600698,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__JCR_LIST__",
-			Info:    0x1,
-			Other:   0x0,
-			Section: 0x14,
-			Value:   0x6006A8,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__do_global_dtors_aux",
-			Info:    0x2,
-			Other:   0x0,
-			Section: 0xD,
-			Value:   0x400430,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "completed.6183",
-			Info:    0x1,
-			Other:   0x0,
-			Section: 0x19,
-			Value:   0x600898,
-			Size:    0x1,
-		},
-		Symbol{
-			Name:    "p.6181",
-			Info:    0x1,
-			Other:   0x0,
-			Section: 0x18,
-			Value:   0x600890,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "frame_dummy",
-			Info:    0x2,
-			Other:   0x0,
-			Section: 0xD,
-			Value:   0x400470,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "crtstuff.c",
-			Info:    0x4,
-			Other:   0x0,
-			Section: 0xFFF1,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__CTOR_END__",
-			Info:    0x1,
-			Other:   0x0,
-			Section: 0x12,
-			Value:   0x600690,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__DTOR_END__",
-			Info:    0x1,
-			Other:   0x0,
-			Section: 0x13,
-			Value:   0x6006A0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__FRAME_END__",
-			Info:    0x1,
-			Other:   0x0,
-			Section: 0x11,
-			Value:   0x400680,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__JCR_END__",
-			Info:    0x1,
-			Other:   0x0,
-			Section: 0x14,
-			Value:   0x6006A8,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__do_global_ctors_aux",
-			Info:    0x2,
-			Other:   0x0,
-			Section: 0xD,
-			Value:   0x400560,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "initfini.c",
-			Info:    0x4,
-			Other:   0x0,
-			Section: 0xFFF1,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "hello.c",
-			Info:    0x4,
-			Other:   0x0,
-			Section: 0xFFF1,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "_GLOBAL_OFFSET_TABLE_",
-			Info:    0x1,
-			Other:   0x2,
-			Section: 0x17,
-			Value:   0x600858,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__init_array_end",
-			Info:    0x0,
-			Other:   0x2,
-			Section: 0x12,
-			Value:   0x600684,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__init_array_start",
-			Info:    0x0,
-			Other:   0x2,
-			Section: 0x12,
-			Value:   0x600684,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "_DYNAMIC",
-			Info:    0x1,
-			Other:   0x2,
-			Section: 0x15,
-			Value:   0x6006B0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "data_start",
-			Info:    0x20,
-			Other:   0x0,
-			Section: 0x18,
-			Value:   0x600880,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__libc_csu_fini",
-			Info:    0x12,
-			Other:   0x0,
-			Section: 0xD,
-			Value:   0x4004C0,
-			Size:    0x2,
-		},
-		Symbol{
-			Name:    "_start",
-			Info:    0x12,
-			Other:   0x0,
-			Section: 0xD,
-			Value:   0x4003E0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__gmon_start__",
-			Info:    0x20,
-			Other:   0x0,
-			Section: 0x0,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "_Jv_RegisterClasses",
-			Info:    0x20,
-			Other:   0x0,
-			Section: 0x0,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "puts@@GLIBC_2.2.5",
-			Info:    0x12,
-			Other:   0x0,
-			Section: 0x0,
-			Value:   0x0,
-			Size:    0x18C,
-		},
-		Symbol{
-			Name:    "_fini",
-			Info:    0x12,
-			Other:   0x0,
-			Section: 0xE,
-			Value:   0x400594,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__libc_start_main@@GLIBC_2.2.5",
-			Info:    0x12,
-			Other:   0x0,
-			Section: 0x0,
-			Value:   0x0,
-			Size:    0x1C2,
-		},
-		Symbol{
-			Name:    "_IO_stdin_used",
-			Info:    0x11,
-			Other:   0x0,
-			Section: 0xF,
-			Value:   0x4005A4,
-			Size:    0x4,
-		},
-		Symbol{
-			Name:    "__data_start",
-			Info:    0x10,
-			Other:   0x0,
-			Section: 0x18,
-			Value:   0x600880,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__dso_handle",
-			Info:    0x11,
-			Other:   0x2,
-			Section: 0x18,
-			Value:   0x600888,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "__libc_csu_init",
-			Info:    0x12,
-			Other:   0x0,
-			Section: 0xD,
-			Value:   0x4004D0,
-			Size:    0x89,
-		},
-		Symbol{
-			Name:    "__bss_start",
-			Info:    0x10,
-			Other:   0x0,
-			Section: 0xFFF1,
-			Value:   0x600898,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "_end",
-			Info:    0x10,
-			Other:   0x0,
-			Section: 0xFFF1,
-			Value:   0x6008A0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "_edata",
-			Info:    0x10,
-			Other:   0x0,
-			Section: 0xFFF1,
-			Value:   0x600898,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "main",
-			Info:    0x12,
-			Other:   0x0,
-			Section: 0xD,
-			Value:   0x400498,
-			Size:    0x1B,
-		},
-		Symbol{
-			Name:    "_init",
-			Info:    0x12,
-			Other:   0x0,
-			Section: 0xB,
-			Value:   0x400398,
-			Size:    0x0,
-		},
-	},
-	"testdata/go-relocation-test-clang-x86.obj": {
-		Symbol{
-			Name:    "go-relocation-test-clang.c",
-			Info:    0x4,
-			Other:   0x0,
-			Section: 0xFFF1,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    ".Linfo_string0",
-			Info:    0x0,
-			Other:   0x0,
-			Section: 0xC,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    ".Linfo_string1",
-			Info:    0x0,
-			Other:   0x0,
-			Section: 0xC,
-			Value:   0x2C,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    ".Linfo_string2",
-			Info:    0x0,
-			Other:   0x0,
-			Section: 0xC,
-			Value:   0x47,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    ".Linfo_string3",
-			Info:    0x0,
-			Other:   0x0,
-			Section: 0xC,
-			Value:   0x4C,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    ".Linfo_string4",
-			Info:    0x0,
-			Other:   0x0,
-			Section: 0xC,
-			Value:   0x4E,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x1,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x2,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x3,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x4,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x6,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x7,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x8,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0xA,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0xC,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0xD,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0xE,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0xF,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "",
-			Info:    0x3,
-			Other:   0x0,
-			Section: 0x10,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "v",
-			Info:    0x11,
-			Other:   0x0,
-			Section: 0xFFF2,
-			Value:   0x4,
-			Size:    0x4,
-		},
-	},
-	"testdata/hello-world-core.gz": {},
-}
-
-var dynamicSymbolsGolden = map[string][]Symbol{
-	"testdata/gcc-amd64-linux-exec": {
-		Symbol{
-			Name:    "__gmon_start__",
-			Info:    0x20,
-			Other:   0x0,
-			Section: 0x0,
-			Value:   0x0,
-			Size:    0x0,
-		},
-		Symbol{
-			Name:    "puts",
-			Info:    0x12,
-			Other:   0x0,
-			Section: 0x0,
-			Value:   0x0,
-			Size:    0x18C,
-		},
-		Symbol{
-			Name:    "__libc_start_main",
-			Info:    0x12,
-			Other:   0x0,
-			Section: 0x0,
-			Value:   0x0,
-			Size:    0x1C2,
-		},
-	},
-	"testdata/go-relocation-test-clang-x86.obj": {},
-	"testdata/hello-world-core.gz":              {},
-}
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/gcc-386-freebsd-exec b/third_party/gofrontend/libgo/go/debug/elf/testdata/gcc-386-freebsd-exec
deleted file mode 100755
index 7af9c58..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/gcc-386-freebsd-exec
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/gcc-amd64-linux-exec b/third_party/gofrontend/libgo/go/debug/elf/testdata/gcc-amd64-linux-exec
deleted file mode 100755
index c6cb1de..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/gcc-amd64-linux-exec
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/gcc-amd64-openbsd-debug-with-rela.obj b/third_party/gofrontend/libgo/go/debug/elf/testdata/gcc-amd64-openbsd-debug-with-rela.obj
deleted file mode 100644
index f62b1ea..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/gcc-amd64-openbsd-debug-with-rela.obj
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-clang-arm.obj b/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-clang-arm.obj
deleted file mode 100644
index 1cc7e4b..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-clang-arm.obj
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-clang-x86.obj b/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-clang-x86.obj
deleted file mode 100644
index e909cf4..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-clang-x86.obj
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc424-x86-64.obj b/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc424-x86-64.obj
deleted file mode 100644
index a7c6d6e..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc424-x86-64.obj
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc441-x86-64.obj b/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc441-x86-64.obj
deleted file mode 100644
index 2d37ab6..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc441-x86-64.obj
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc441-x86.obj b/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc441-x86.obj
deleted file mode 100644
index 0d59fe3..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc441-x86.obj
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc482-aarch64.obj b/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc482-aarch64.obj
deleted file mode 100644
index 849e264..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc482-aarch64.obj
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc482-ppc64le.obj b/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc482-ppc64le.obj
deleted file mode 100644
index dad7445..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc482-ppc64le.obj
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc492-arm.obj b/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc492-arm.obj
deleted file mode 100644
index ed45be2..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc492-arm.obj
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc5-ppc.obj b/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc5-ppc.obj
deleted file mode 100644
index f4165af..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/go-relocation-test-gcc5-ppc.obj
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/hello-world-core.gz b/third_party/gofrontend/libgo/go/debug/elf/testdata/hello-world-core.gz
deleted file mode 100644
index 806af6e..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/hello-world-core.gz
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/elf/testdata/hello.c b/third_party/gofrontend/libgo/go/debug/elf/testdata/hello.c
deleted file mode 100644
index 34d9ee7..0000000
--- a/third_party/gofrontend/libgo/go/debug/elf/testdata/hello.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-void
-main(int argc, char *argv[])
-{
-	printf("hello, world\n");
-}
diff --git a/third_party/gofrontend/libgo/go/debug/gosym/pclinetest.h b/third_party/gofrontend/libgo/go/debug/gosym/pclinetest.h
deleted file mode 100644
index a6c40e7..0000000
--- a/third_party/gofrontend/libgo/go/debug/gosym/pclinetest.h
+++ /dev/null
@@ -1,7 +0,0 @@
-// Empty include file to generate z symbols
-
-
-
-
-
-// EOF
diff --git a/third_party/gofrontend/libgo/go/debug/gosym/pclinetest.s b/third_party/gofrontend/libgo/go/debug/gosym/pclinetest.s
deleted file mode 100644
index 519656b..0000000
--- a/third_party/gofrontend/libgo/go/debug/gosym/pclinetest.s
+++ /dev/null
@@ -1,89 +0,0 @@
-TEXT linefrompc(SB),7,$0	// Each byte stores its line delta
-BYTE $2;
-BYTE $1;
-BYTE $1; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1;
-BYTE $1;
-BYTE $1; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-BYTE $1; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-#include "pclinetest.h"
-BYTE $2;
-#include "pclinetest.h"
-BYTE $2;
-
-TEXT pcfromline(SB),7,$0	// Each record stores its line delta, then n, then n more bytes
-BYTE $31; BYTE $0;
-BYTE $1; BYTE $1; BYTE $0;
-BYTE $1; BYTE $0;
-
-BYTE $2; BYTE $4; BYTE $0; BYTE $0; BYTE $0; BYTE $0;
-
-
-#include "pclinetest.h"
-BYTE $4; BYTE $0;
-
-
-BYTE $3; BYTE $3; BYTE $0; BYTE $0; BYTE $0;
-#include "pclinetest.h"
-
-
-BYTE $4; BYTE $3; BYTE $0; BYTE $0; BYTE $0;
-
-TEXT main(SB),7,$0
-	// Prevent GC of our test symbols
-	CALL linefrompc(SB)
-	CALL pcfromline(SB)
-
-// Keep the linker happy
-TEXT runtime·morestack(SB),7,$0
-	RET
-
-TEXT runtime·morestack00(SB),7,$0
-	RET
-
-TEXT runtime·morestack10(SB),7,$0
-	RET
-
-TEXT runtime·morestack01(SB),7,$0
-	RET
-
-TEXT runtime·morestack11(SB),7,$0
-	RET
-
-TEXT runtime·morestack8(SB),7,$0
-	RET
-
-TEXT runtime·morestack16(SB),7,$0
-	RET
-
-TEXT runtime·morestack24(SB),7,$0
-	RET
-
-TEXT runtime·morestack32(SB),7,$0
-	RET
-
-TEXT runtime·morestack40(SB),7,$0
-	RET
-
-TEXT runtime·morestack48(SB),7,$0
-	RET
-
-TEXT runtime·morestack8(SB),7,$0
-	RET
-
diff --git a/third_party/gofrontend/libgo/go/debug/gosym/pclntab.go b/third_party/gofrontend/libgo/go/debug/gosym/pclntab.go
deleted file mode 100644
index 6620aef..0000000
--- a/third_party/gofrontend/libgo/go/debug/gosym/pclntab.go
+++ /dev/null
@@ -1,453 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
- * Line tables
- */
-
-package gosym
-
-import (
-	"encoding/binary"
-	"sync"
-)
-
-// A LineTable is a data structure mapping program counters to line numbers.
-//
-// In Go 1.1 and earlier, each function (represented by a Func) had its own LineTable,
-// and the line number corresponded to a numbering of all source lines in the
-// program, across all files. That absolute line number would then have to be
-// converted separately to a file name and line number within the file.
-//
-// In Go 1.2, the format of the data changed so that there is a single LineTable
-// for the entire program, shared by all Funcs, and there are no absolute line
-// numbers, just line numbers within specific files.
-//
-// For the most part, LineTable's methods should be treated as an internal
-// detail of the package; callers should use the methods on Table instead.
-type LineTable struct {
-	Data []byte
-	PC   uint64
-	Line int
-
-	// Go 1.2 state
-	mu       sync.Mutex
-	go12     int // is this in Go 1.2 format? -1 no, 0 unknown, 1 yes
-	binary   binary.ByteOrder
-	quantum  uint32
-	ptrsize  uint32
-	functab  []byte
-	nfunctab uint32
-	filetab  []byte
-	nfiletab uint32
-	fileMap  map[string]uint32
-}
-
-// NOTE(rsc): This is wrong for GOARCH=arm, which uses a quantum of 4,
-// but we have no idea whether we're using arm or not. This only
-// matters in the old (pre-Go 1.2) symbol table format, so it's not worth
-// fixing.
-const oldQuantum = 1
-
-func (t *LineTable) parse(targetPC uint64, targetLine int) (b []byte, pc uint64, line int) {
-	// The PC/line table can be thought of as a sequence of
-	//  <pc update>* <line update>
-	// batches.  Each update batch results in a (pc, line) pair,
-	// where line applies to every PC from pc up to but not
-	// including the pc of the next pair.
-	//
-	// Here we process each update individually, which simplifies
-	// the code, but makes the corner cases more confusing.
-	b, pc, line = t.Data, t.PC, t.Line
-	for pc <= targetPC && line != targetLine && len(b) > 0 {
-		code := b[0]
-		b = b[1:]
-		switch {
-		case code == 0:
-			if len(b) < 4 {
-				b = b[0:0]
-				break
-			}
-			val := binary.BigEndian.Uint32(b)
-			b = b[4:]
-			line += int(val)
-		case code <= 64:
-			line += int(code)
-		case code <= 128:
-			line -= int(code - 64)
-		default:
-			pc += oldQuantum * uint64(code-128)
-			continue
-		}
-		pc += oldQuantum
-	}
-	return b, pc, line
-}
-
-func (t *LineTable) slice(pc uint64) *LineTable {
-	data, pc, line := t.parse(pc, -1)
-	return &LineTable{Data: data, PC: pc, Line: line}
-}
-
-// PCToLine returns the line number for the given program counter.
-// Callers should use Table's PCToLine method instead.
-func (t *LineTable) PCToLine(pc uint64) int {
-	if t.isGo12() {
-		return t.go12PCToLine(pc)
-	}
-	_, _, line := t.parse(pc, -1)
-	return line
-}
-
-// LineToPC returns the program counter for the given line number,
-// considering only program counters before maxpc.
-// Callers should use Table's LineToPC method instead.
-func (t *LineTable) LineToPC(line int, maxpc uint64) uint64 {
-	if t.isGo12() {
-		return 0
-	}
-	_, pc, line1 := t.parse(maxpc, line)
-	if line1 != line {
-		return 0
-	}
-	// Subtract quantum from PC to account for post-line increment
-	return pc - oldQuantum
-}
-
-// NewLineTable returns a new PC/line table
-// corresponding to the encoded data.
-// Text must be the start address of the
-// corresponding text segment.
-func NewLineTable(data []byte, text uint64) *LineTable {
-	return &LineTable{Data: data, PC: text, Line: 0}
-}
-
-// Go 1.2 symbol table format.
-// See golang.org/s/go12symtab.
-//
-// A general note about the methods here: rather than try to avoid
-// index out of bounds errors, we trust Go to detect them, and then
-// we recover from the panics and treat them as indicative of a malformed
-// or incomplete table.
-//
-// The methods called by symtab.go, which begin with "go12" prefixes,
-// are expected to have that recovery logic.
-
-// isGo12 reports whether this is a Go 1.2 (or later) symbol table.
-func (t *LineTable) isGo12() bool {
-	t.go12Init()
-	return t.go12 == 1
-}
-
-const go12magic = 0xfffffffb
-
-// uintptr returns the pointer-sized value encoded at b.
-// The pointer size is dictated by the table being read.
-func (t *LineTable) uintptr(b []byte) uint64 {
-	if t.ptrsize == 4 {
-		return uint64(t.binary.Uint32(b))
-	}
-	return t.binary.Uint64(b)
-}
-
-// go12init initializes the Go 1.2 metadata if t is a Go 1.2 symbol table.
-func (t *LineTable) go12Init() {
-	t.mu.Lock()
-	defer t.mu.Unlock()
-	if t.go12 != 0 {
-		return
-	}
-
-	defer func() {
-		// If we panic parsing, assume it's not a Go 1.2 symbol table.
-		recover()
-	}()
-
-	// Check header: 4-byte magic, two zeros, pc quantum, pointer size.
-	t.go12 = -1 // not Go 1.2 until proven otherwise
-	if len(t.Data) < 16 || t.Data[4] != 0 || t.Data[5] != 0 ||
-		(t.Data[6] != 1 && t.Data[6] != 4) || // pc quantum
-		(t.Data[7] != 4 && t.Data[7] != 8) { // pointer size
-		return
-	}
-
-	switch uint32(go12magic) {
-	case binary.LittleEndian.Uint32(t.Data):
-		t.binary = binary.LittleEndian
-	case binary.BigEndian.Uint32(t.Data):
-		t.binary = binary.BigEndian
-	default:
-		return
-	}
-
-	t.quantum = uint32(t.Data[6])
-	t.ptrsize = uint32(t.Data[7])
-
-	t.nfunctab = uint32(t.uintptr(t.Data[8:]))
-	t.functab = t.Data[8+t.ptrsize:]
-	functabsize := t.nfunctab*2*t.ptrsize + t.ptrsize
-	fileoff := t.binary.Uint32(t.functab[functabsize:])
-	t.functab = t.functab[:functabsize]
-	t.filetab = t.Data[fileoff:]
-	t.nfiletab = t.binary.Uint32(t.filetab)
-	t.filetab = t.filetab[:t.nfiletab*4]
-
-	t.go12 = 1 // so far so good
-}
-
-// go12Funcs returns a slice of Funcs derived from the Go 1.2 pcln table.
-func (t *LineTable) go12Funcs() []Func {
-	// Assume it is malformed and return nil on error.
-	defer func() {
-		recover()
-	}()
-
-	n := len(t.functab) / int(t.ptrsize) / 2
-	funcs := make([]Func, n)
-	for i := range funcs {
-		f := &funcs[i]
-		f.Entry = uint64(t.uintptr(t.functab[2*i*int(t.ptrsize):]))
-		f.End = uint64(t.uintptr(t.functab[(2*i+2)*int(t.ptrsize):]))
-		info := t.Data[t.uintptr(t.functab[(2*i+1)*int(t.ptrsize):]):]
-		f.LineTable = t
-		f.FrameSize = int(t.binary.Uint32(info[t.ptrsize+2*4:]))
-		f.Sym = &Sym{
-			Value:  f.Entry,
-			Type:   'T',
-			Name:   t.string(t.binary.Uint32(info[t.ptrsize:])),
-			GoType: 0,
-			Func:   f,
-		}
-	}
-	return funcs
-}
-
-// findFunc returns the func corresponding to the given program counter.
-func (t *LineTable) findFunc(pc uint64) []byte {
-	if pc < t.uintptr(t.functab) || pc >= t.uintptr(t.functab[len(t.functab)-int(t.ptrsize):]) {
-		return nil
-	}
-
-	// The function table is a list of 2*nfunctab+1 uintptrs,
-	// alternating program counters and offsets to func structures.
-	f := t.functab
-	nf := t.nfunctab
-	for nf > 0 {
-		m := nf / 2
-		fm := f[2*t.ptrsize*m:]
-		if t.uintptr(fm) <= pc && pc < t.uintptr(fm[2*t.ptrsize:]) {
-			return t.Data[t.uintptr(fm[t.ptrsize:]):]
-		} else if pc < t.uintptr(fm) {
-			nf = m
-		} else {
-			f = f[(m+1)*2*t.ptrsize:]
-			nf -= m + 1
-		}
-	}
-	return nil
-}
-
-// readvarint reads, removes, and returns a varint from *pp.
-func (t *LineTable) readvarint(pp *[]byte) uint32 {
-	var v, shift uint32
-	p := *pp
-	for shift = 0; ; shift += 7 {
-		b := p[0]
-		p = p[1:]
-		v |= (uint32(b) & 0x7F) << shift
-		if b&0x80 == 0 {
-			break
-		}
-	}
-	*pp = p
-	return v
-}
-
-// string returns a Go string found at off.
-func (t *LineTable) string(off uint32) string {
-	for i := off; ; i++ {
-		if t.Data[i] == 0 {
-			return string(t.Data[off:i])
-		}
-	}
-}
-
-// step advances to the next pc, value pair in the encoded table.
-func (t *LineTable) step(p *[]byte, pc *uint64, val *int32, first bool) bool {
-	uvdelta := t.readvarint(p)
-	if uvdelta == 0 && !first {
-		return false
-	}
-	if uvdelta&1 != 0 {
-		uvdelta = ^(uvdelta >> 1)
-	} else {
-		uvdelta >>= 1
-	}
-	vdelta := int32(uvdelta)
-	pcdelta := t.readvarint(p) * t.quantum
-	*pc += uint64(pcdelta)
-	*val += vdelta
-	return true
-}
-
-// pcvalue reports the value associated with the target pc.
-// off is the offset to the beginning of the pc-value table,
-// and entry is the start PC for the corresponding function.
-func (t *LineTable) pcvalue(off uint32, entry, targetpc uint64) int32 {
-	if off == 0 {
-		return -1
-	}
-	p := t.Data[off:]
-
-	val := int32(-1)
-	pc := entry
-	for t.step(&p, &pc, &val, pc == entry) {
-		if targetpc < pc {
-			return val
-		}
-	}
-	return -1
-}
-
-// findFileLine scans one function in the binary looking for a
-// program counter in the given file on the given line.
-// It does so by running the pc-value tables mapping program counter
-// to file number. Since most functions come from a single file, these
-// are usually short and quick to scan. If a file match is found, then the
-// code goes to the expense of looking for a simultaneous line number match.
-func (t *LineTable) findFileLine(entry uint64, filetab, linetab uint32, filenum, line int32) uint64 {
-	if filetab == 0 || linetab == 0 {
-		return 0
-	}
-
-	fp := t.Data[filetab:]
-	fl := t.Data[linetab:]
-	fileVal := int32(-1)
-	filePC := entry
-	lineVal := int32(-1)
-	linePC := entry
-	fileStartPC := filePC
-	for t.step(&fp, &filePC, &fileVal, filePC == entry) {
-		if fileVal == filenum && fileStartPC < filePC {
-			// fileVal is in effect starting at fileStartPC up to
-			// but not including filePC, and it's the file we want.
-			// Run the PC table looking for a matching line number
-			// or until we reach filePC.
-			lineStartPC := linePC
-			for linePC < filePC && t.step(&fl, &linePC, &lineVal, linePC == entry) {
-				// lineVal is in effect until linePC, and lineStartPC < filePC.
-				if lineVal == line {
-					if fileStartPC <= lineStartPC {
-						return lineStartPC
-					}
-					if fileStartPC < linePC {
-						return fileStartPC
-					}
-				}
-				lineStartPC = linePC
-			}
-		}
-		fileStartPC = filePC
-	}
-	return 0
-}
-
-// go12PCToLine maps program counter to line number for the Go 1.2 pcln table.
-func (t *LineTable) go12PCToLine(pc uint64) (line int) {
-	defer func() {
-		if recover() != nil {
-			line = -1
-		}
-	}()
-
-	f := t.findFunc(pc)
-	if f == nil {
-		return -1
-	}
-	entry := t.uintptr(f)
-	linetab := t.binary.Uint32(f[t.ptrsize+5*4:])
-	return int(t.pcvalue(linetab, entry, pc))
-}
-
-// go12PCToFile maps program counter to file name for the Go 1.2 pcln table.
-func (t *LineTable) go12PCToFile(pc uint64) (file string) {
-	defer func() {
-		if recover() != nil {
-			file = ""
-		}
-	}()
-
-	f := t.findFunc(pc)
-	if f == nil {
-		return ""
-	}
-	entry := t.uintptr(f)
-	filetab := t.binary.Uint32(f[t.ptrsize+4*4:])
-	fno := t.pcvalue(filetab, entry, pc)
-	if fno <= 0 {
-		return ""
-	}
-	return t.string(t.binary.Uint32(t.filetab[4*fno:]))
-}
-
-// go12LineToPC maps a (file, line) pair to a program counter for the Go 1.2 pcln table.
-func (t *LineTable) go12LineToPC(file string, line int) (pc uint64) {
-	defer func() {
-		if recover() != nil {
-			pc = 0
-		}
-	}()
-
-	t.initFileMap()
-	filenum := t.fileMap[file]
-	if filenum == 0 {
-		return 0
-	}
-
-	// Scan all functions.
-	// If this turns out to be a bottleneck, we could build a map[int32][]int32
-	// mapping file number to a list of functions with code from that file.
-	for i := uint32(0); i < t.nfunctab; i++ {
-		f := t.Data[t.uintptr(t.functab[2*t.ptrsize*i+t.ptrsize:]):]
-		entry := t.uintptr(f)
-		filetab := t.binary.Uint32(f[t.ptrsize+4*4:])
-		linetab := t.binary.Uint32(f[t.ptrsize+5*4:])
-		pc := t.findFileLine(entry, filetab, linetab, int32(filenum), int32(line))
-		if pc != 0 {
-			return pc
-		}
-	}
-	return 0
-}
-
-// initFileMap initializes the map from file name to file number.
-func (t *LineTable) initFileMap() {
-	t.mu.Lock()
-	defer t.mu.Unlock()
-
-	if t.fileMap != nil {
-		return
-	}
-	m := make(map[string]uint32)
-
-	for i := uint32(1); i < t.nfiletab; i++ {
-		s := t.string(t.binary.Uint32(t.filetab[4*i:]))
-		m[s] = i
-	}
-	t.fileMap = m
-}
-
-// go12MapFiles adds to m a key for every file in the Go 1.2 LineTable.
-// Every key maps to obj. That's not a very interesting map, but it provides
-// a way for callers to obtain the list of files in the program.
-func (t *LineTable) go12MapFiles(m map[string]*Obj, obj *Obj) {
-	defer func() {
-		recover()
-	}()
-
-	t.initFileMap()
-	for file := range t.fileMap {
-		m[file] = obj
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/debug/gosym/pclntab_test.go b/third_party/gofrontend/libgo/go/debug/gosym/pclntab_test.go
deleted file mode 100644
index 53f3e95..0000000
--- a/third_party/gofrontend/libgo/go/debug/gosym/pclntab_test.go
+++ /dev/null
@@ -1,278 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gosym
-
-import (
-	"debug/elf"
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-var (
-	pclineTempDir    string
-	pclinetestBinary string
-)
-
-func dotest(self bool) bool {
-	// For now, only works on amd64 platforms.
-	if runtime.GOARCH != "amd64" {
-		return false
-	}
-	// Self test reads test binary; only works on Linux.
-	if self && runtime.GOOS != "linux" {
-		return false
-	}
-	if pclinetestBinary != "" {
-		return true
-	}
-	var err error
-	pclineTempDir, err = ioutil.TempDir("", "pclinetest")
-	if err != nil {
-		panic(err)
-	}
-	if strings.Contains(pclineTempDir, " ") {
-		panic("unexpected space in tempdir")
-	}
-	// This command builds pclinetest from pclinetest.asm;
-	// the resulting binary looks like it was built from pclinetest.s,
-	// but we have renamed it to keep it away from the go tool.
-	pclinetestBinary = filepath.Join(pclineTempDir, "pclinetest")
-	cmd := exec.Command("go", "tool", "asm", "-o", pclinetestBinary+".o", "pclinetest.asm")
-	cmd.Stdout = os.Stdout
-	cmd.Stderr = os.Stderr
-	if err := cmd.Run(); err != nil {
-		panic(err)
-	}
-	cmd = exec.Command("go", "tool", "link", "-H", "linux", "-E", "main",
-		"-o", pclinetestBinary, pclinetestBinary+".o")
-	cmd.Stdout = os.Stdout
-	cmd.Stderr = os.Stderr
-	if err := cmd.Run(); err != nil {
-		panic(err)
-	}
-	return true
-}
-
-func endtest() {
-	if pclineTempDir != "" {
-		os.RemoveAll(pclineTempDir)
-		pclineTempDir = ""
-		pclinetestBinary = ""
-	}
-}
-
-func getTable(t *testing.T) *Table {
-	f, tab := crack(os.Args[0], t)
-	f.Close()
-	return tab
-}
-
-func crack(file string, t *testing.T) (*elf.File, *Table) {
-	// Open self
-	f, err := elf.Open(file)
-	if err != nil {
-		t.Fatal(err)
-	}
-	return parse(file, f, t)
-}
-
-func parse(file string, f *elf.File, t *testing.T) (*elf.File, *Table) {
-	s := f.Section(".gosymtab")
-	if s == nil {
-		t.Skip("no .gosymtab section")
-	}
-	symdat, err := s.Data()
-	if err != nil {
-		f.Close()
-		t.Fatalf("reading %s gosymtab: %v", file, err)
-	}
-	pclndat, err := f.Section(".gopclntab").Data()
-	if err != nil {
-		f.Close()
-		t.Fatalf("reading %s gopclntab: %v", file, err)
-	}
-
-	pcln := NewLineTable(pclndat, f.Section(".text").Addr)
-	tab, err := NewTable(symdat, pcln)
-	if err != nil {
-		f.Close()
-		t.Fatalf("parsing %s gosymtab: %v", file, err)
-	}
-
-	return f, tab
-}
-
-var goarch = os.Getenv("O")
-
-func TestLineFromAline(t *testing.T) {
-	if !dotest(true) {
-		return
-	}
-	defer endtest()
-
-	tab := getTable(t)
-	if tab.go12line != nil {
-		// aline's don't exist in the Go 1.2 table.
-		t.Skip("not relevant to Go 1.2 symbol table")
-	}
-
-	// Find the sym package
-	pkg := tab.LookupFunc("debug/gosym.TestLineFromAline").Obj
-	if pkg == nil {
-		t.Fatalf("nil pkg")
-	}
-
-	// Walk every absolute line and ensure that we hit every
-	// source line monotonically
-	lastline := make(map[string]int)
-	final := -1
-	for i := 0; i < 10000; i++ {
-		path, line := pkg.lineFromAline(i)
-		// Check for end of object
-		if path == "" {
-			if final == -1 {
-				final = i - 1
-			}
-			continue
-		} else if final != -1 {
-			t.Fatalf("reached end of package at absolute line %d, but absolute line %d mapped to %s:%d", final, i, path, line)
-		}
-		// It's okay to see files multiple times (e.g., sys.a)
-		if line == 1 {
-			lastline[path] = 1
-			continue
-		}
-		// Check that the is the next line in path
-		ll, ok := lastline[path]
-		if !ok {
-			t.Errorf("file %s starts on line %d", path, line)
-		} else if line != ll+1 {
-			t.Fatalf("expected next line of file %s to be %d, got %d", path, ll+1, line)
-		}
-		lastline[path] = line
-	}
-	if final == -1 {
-		t.Errorf("never reached end of object")
-	}
-}
-
-func TestLineAline(t *testing.T) {
-	if !dotest(true) {
-		return
-	}
-	defer endtest()
-
-	tab := getTable(t)
-	if tab.go12line != nil {
-		// aline's don't exist in the Go 1.2 table.
-		t.Skip("not relevant to Go 1.2 symbol table")
-	}
-
-	for _, o := range tab.Files {
-		// A source file can appear multiple times in a
-		// object.  alineFromLine will always return alines in
-		// the first file, so track which lines we've seen.
-		found := make(map[string]int)
-		for i := 0; i < 1000; i++ {
-			path, line := o.lineFromAline(i)
-			if path == "" {
-				break
-			}
-
-			// cgo files are full of 'Z' symbols, which we don't handle
-			if len(path) > 4 && path[len(path)-4:] == ".cgo" {
-				continue
-			}
-
-			if minline, ok := found[path]; path != "" && ok {
-				if minline >= line {
-					// We've already covered this file
-					continue
-				}
-			}
-			found[path] = line
-
-			a, err := o.alineFromLine(path, line)
-			if err != nil {
-				t.Errorf("absolute line %d in object %s maps to %s:%d, but mapping that back gives error %s", i, o.Paths[0].Name, path, line, err)
-			} else if a != i {
-				t.Errorf("absolute line %d in object %s maps to %s:%d, which maps back to absolute line %d\n", i, o.Paths[0].Name, path, line, a)
-			}
-		}
-	}
-}
-
-func TestPCLine(t *testing.T) {
-	if !dotest(false) {
-		return
-	}
-	defer endtest()
-
-	f, tab := crack(pclinetestBinary, t)
-	text := f.Section(".text")
-	textdat, err := text.Data()
-	if err != nil {
-		t.Fatalf("reading .text: %v", err)
-	}
-
-	// Test PCToLine
-	sym := tab.LookupFunc("linefrompc")
-	wantLine := 0
-	for pc := sym.Entry; pc < sym.End; pc++ {
-		off := pc - text.Addr // TODO(rsc): should not need off; bug in 8g
-		if textdat[off] == 255 {
-			break
-		}
-		wantLine += int(textdat[off])
-		t.Logf("off is %d %#x (max %d)", off, textdat[off], sym.End-pc)
-		file, line, fn := tab.PCToLine(pc)
-		if fn == nil {
-			t.Errorf("failed to get line of PC %#x", pc)
-		} else if !strings.HasSuffix(file, "pclinetest.asm") || line != wantLine || fn != sym {
-			t.Errorf("PCToLine(%#x) = %s:%d (%s), want %s:%d (%s)", pc, file, line, fn.Name, "pclinetest.asm", wantLine, sym.Name)
-		}
-	}
-
-	// Test LineToPC
-	sym = tab.LookupFunc("pcfromline")
-	lookupline := -1
-	wantLine = 0
-	off := uint64(0) // TODO(rsc): should not need off; bug in 8g
-	for pc := sym.Value; pc < sym.End; pc += 2 + uint64(textdat[off]) {
-		file, line, fn := tab.PCToLine(pc)
-		off = pc - text.Addr
-		if textdat[off] == 255 {
-			break
-		}
-		wantLine += int(textdat[off])
-		if line != wantLine {
-			t.Errorf("expected line %d at PC %#x in pcfromline, got %d", wantLine, pc, line)
-			off = pc + 1 - text.Addr
-			continue
-		}
-		if lookupline == -1 {
-			lookupline = line
-		}
-		for ; lookupline <= line; lookupline++ {
-			pc2, fn2, err := tab.LineToPC(file, lookupline)
-			if lookupline != line {
-				// Should be nothing on this line
-				if err == nil {
-					t.Errorf("expected no PC at line %d, got %#x (%s)", lookupline, pc2, fn2.Name)
-				}
-			} else if err != nil {
-				t.Errorf("failed to get PC of line %d: %s", lookupline, err)
-			} else if pc != pc2 {
-				t.Errorf("expected PC %#x (%s) at line %d, got PC %#x (%s)", pc, fn.Name, line, pc2, fn2.Name)
-			}
-		}
-		off = pc + 1 - text.Addr
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/debug/gosym/symtab.go b/third_party/gofrontend/libgo/go/debug/gosym/symtab.go
deleted file mode 100644
index 46f0783..0000000
--- a/third_party/gofrontend/libgo/go/debug/gosym/symtab.go
+++ /dev/null
@@ -1,710 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package gosym implements access to the Go symbol
-// and line number tables embedded in Go binaries generated
-// by the gc compilers.
-package gosym
-
-// The table format is a variant of the format used in Plan 9's a.out
-// format, documented at http://plan9.bell-labs.com/magic/man2html/6/a.out.
-// The best reference for the differences between the Plan 9 format
-// and the Go format is the runtime source, specifically ../../runtime/symtab.c.
-
-import (
-	"bytes"
-	"encoding/binary"
-	"fmt"
-	"strconv"
-	"strings"
-)
-
-/*
- * Symbols
- */
-
-// A Sym represents a single symbol table entry.
-type Sym struct {
-	Value  uint64
-	Type   byte
-	Name   string
-	GoType uint64
-	// If this symbol is a function symbol, the corresponding Func
-	Func *Func
-}
-
-// Static reports whether this symbol is static (not visible outside its file).
-func (s *Sym) Static() bool { return s.Type >= 'a' }
-
-// PackageName returns the package part of the symbol name,
-// or the empty string if there is none.
-func (s *Sym) PackageName() string {
-	if i := strings.Index(s.Name, "."); i != -1 {
-		return s.Name[0:i]
-	}
-	return ""
-}
-
-// ReceiverName returns the receiver type name of this symbol,
-// or the empty string if there is none.
-func (s *Sym) ReceiverName() string {
-	l := strings.Index(s.Name, ".")
-	r := strings.LastIndex(s.Name, ".")
-	if l == -1 || r == -1 || l == r {
-		return ""
-	}
-	return s.Name[l+1 : r]
-}
-
-// BaseName returns the symbol name without the package or receiver name.
-func (s *Sym) BaseName() string {
-	if i := strings.LastIndex(s.Name, "."); i != -1 {
-		return s.Name[i+1:]
-	}
-	return s.Name
-}
-
-// A Func collects information about a single function.
-type Func struct {
-	Entry uint64
-	*Sym
-	End       uint64
-	Params    []*Sym
-	Locals    []*Sym
-	FrameSize int
-	LineTable *LineTable
-	Obj       *Obj
-}
-
-// An Obj represents a collection of functions in a symbol table.
-//
-// The exact method of division of a binary into separate Objs is an internal detail
-// of the symbol table format.
-//
-// In early versions of Go each source file became a different Obj.
-//
-// In Go 1 and Go 1.1, each package produced one Obj for all Go sources
-// and one Obj per C source file.
-//
-// In Go 1.2, there is a single Obj for the entire program.
-type Obj struct {
-	// Funcs is a list of functions in the Obj.
-	Funcs []Func
-
-	// In Go 1.1 and earlier, Paths is a list of symbols corresponding
-	// to the source file names that produced the Obj.
-	// In Go 1.2, Paths is nil.
-	// Use the keys of Table.Files to obtain a list of source files.
-	Paths []Sym // meta
-}
-
-/*
- * Symbol tables
- */
-
-// Table represents a Go symbol table.  It stores all of the
-// symbols decoded from the program and provides methods to translate
-// between symbols, names, and addresses.
-type Table struct {
-	Syms  []Sym
-	Funcs []Func
-	Files map[string]*Obj // nil for Go 1.2 and later binaries
-	Objs  []Obj           // nil for Go 1.2 and later binaries
-
-	go12line *LineTable // Go 1.2 line number table
-}
-
-type sym struct {
-	value  uint64
-	gotype uint64
-	typ    byte
-	name   []byte
-}
-
-var (
-	littleEndianSymtab    = []byte{0xFD, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00}
-	bigEndianSymtab       = []byte{0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00}
-	oldLittleEndianSymtab = []byte{0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x00}
-)
-
-func walksymtab(data []byte, fn func(sym) error) error {
-	if len(data) == 0 { // missing symtab is okay
-		return nil
-	}
-	var order binary.ByteOrder = binary.BigEndian
-	newTable := false
-	switch {
-	case bytes.HasPrefix(data, oldLittleEndianSymtab):
-		// Same as Go 1.0, but little endian.
-		// Format was used during interim development between Go 1.0 and Go 1.1.
-		// Should not be widespread, but easy to support.
-		data = data[6:]
-		order = binary.LittleEndian
-	case bytes.HasPrefix(data, bigEndianSymtab):
-		newTable = true
-	case bytes.HasPrefix(data, littleEndianSymtab):
-		newTable = true
-		order = binary.LittleEndian
-	}
-	var ptrsz int
-	if newTable {
-		if len(data) < 8 {
-			return &DecodingError{len(data), "unexpected EOF", nil}
-		}
-		ptrsz = int(data[7])
-		if ptrsz != 4 && ptrsz != 8 {
-			return &DecodingError{7, "invalid pointer size", ptrsz}
-		}
-		data = data[8:]
-	}
-	var s sym
-	p := data
-	for len(p) >= 4 {
-		var typ byte
-		if newTable {
-			// Symbol type, value, Go type.
-			typ = p[0] & 0x3F
-			wideValue := p[0]&0x40 != 0
-			goType := p[0]&0x80 != 0
-			if typ < 26 {
-				typ += 'A'
-			} else {
-				typ += 'a' - 26
-			}
-			s.typ = typ
-			p = p[1:]
-			if wideValue {
-				if len(p) < ptrsz {
-					return &DecodingError{len(data), "unexpected EOF", nil}
-				}
-				// fixed-width value
-				if ptrsz == 8 {
-					s.value = order.Uint64(p[0:8])
-					p = p[8:]
-				} else {
-					s.value = uint64(order.Uint32(p[0:4]))
-					p = p[4:]
-				}
-			} else {
-				// varint value
-				s.value = 0
-				shift := uint(0)
-				for len(p) > 0 && p[0]&0x80 != 0 {
-					s.value |= uint64(p[0]&0x7F) << shift
-					shift += 7
-					p = p[1:]
-				}
-				if len(p) == 0 {
-					return &DecodingError{len(data), "unexpected EOF", nil}
-				}
-				s.value |= uint64(p[0]) << shift
-				p = p[1:]
-			}
-			if goType {
-				if len(p) < ptrsz {
-					return &DecodingError{len(data), "unexpected EOF", nil}
-				}
-				// fixed-width go type
-				if ptrsz == 8 {
-					s.gotype = order.Uint64(p[0:8])
-					p = p[8:]
-				} else {
-					s.gotype = uint64(order.Uint32(p[0:4]))
-					p = p[4:]
-				}
-			}
-		} else {
-			// Value, symbol type.
-			s.value = uint64(order.Uint32(p[0:4]))
-			if len(p) < 5 {
-				return &DecodingError{len(data), "unexpected EOF", nil}
-			}
-			typ = p[4]
-			if typ&0x80 == 0 {
-				return &DecodingError{len(data) - len(p) + 4, "bad symbol type", typ}
-			}
-			typ &^= 0x80
-			s.typ = typ
-			p = p[5:]
-		}
-
-		// Name.
-		var i int
-		var nnul int
-		for i = 0; i < len(p); i++ {
-			if p[i] == 0 {
-				nnul = 1
-				break
-			}
-		}
-		switch typ {
-		case 'z', 'Z':
-			p = p[i+nnul:]
-			for i = 0; i+2 <= len(p); i += 2 {
-				if p[i] == 0 && p[i+1] == 0 {
-					nnul = 2
-					break
-				}
-			}
-		}
-		if len(p) < i+nnul {
-			return &DecodingError{len(data), "unexpected EOF", nil}
-		}
-		s.name = p[0:i]
-		i += nnul
-		p = p[i:]
-
-		if !newTable {
-			if len(p) < 4 {
-				return &DecodingError{len(data), "unexpected EOF", nil}
-			}
-			// Go type.
-			s.gotype = uint64(order.Uint32(p[:4]))
-			p = p[4:]
-		}
-		fn(s)
-	}
-	return nil
-}
-
-// NewTable decodes the Go symbol table in data,
-// returning an in-memory representation.
-func NewTable(symtab []byte, pcln *LineTable) (*Table, error) {
-	var n int
-	err := walksymtab(symtab, func(s sym) error {
-		n++
-		return nil
-	})
-	if err != nil {
-		return nil, err
-	}
-
-	var t Table
-	if pcln.isGo12() {
-		t.go12line = pcln
-	}
-	fname := make(map[uint16]string)
-	t.Syms = make([]Sym, 0, n)
-	nf := 0
-	nz := 0
-	lasttyp := uint8(0)
-	err = walksymtab(symtab, func(s sym) error {
-		n := len(t.Syms)
-		t.Syms = t.Syms[0 : n+1]
-		ts := &t.Syms[n]
-		ts.Type = s.typ
-		ts.Value = uint64(s.value)
-		ts.GoType = uint64(s.gotype)
-		switch s.typ {
-		default:
-			// rewrite name to use . instead of · (c2 b7)
-			w := 0
-			b := s.name
-			for i := 0; i < len(b); i++ {
-				if b[i] == 0xc2 && i+1 < len(b) && b[i+1] == 0xb7 {
-					i++
-					b[i] = '.'
-				}
-				b[w] = b[i]
-				w++
-			}
-			ts.Name = string(s.name[0:w])
-		case 'z', 'Z':
-			if lasttyp != 'z' && lasttyp != 'Z' {
-				nz++
-			}
-			for i := 0; i < len(s.name); i += 2 {
-				eltIdx := binary.BigEndian.Uint16(s.name[i : i+2])
-				elt, ok := fname[eltIdx]
-				if !ok {
-					return &DecodingError{-1, "bad filename code", eltIdx}
-				}
-				if n := len(ts.Name); n > 0 && ts.Name[n-1] != '/' {
-					ts.Name += "/"
-				}
-				ts.Name += elt
-			}
-		}
-		switch s.typ {
-		case 'T', 't', 'L', 'l':
-			nf++
-		case 'f':
-			fname[uint16(s.value)] = ts.Name
-		}
-		lasttyp = s.typ
-		return nil
-	})
-	if err != nil {
-		return nil, err
-	}
-
-	t.Funcs = make([]Func, 0, nf)
-	t.Files = make(map[string]*Obj)
-
-	var obj *Obj
-	if t.go12line != nil {
-		// Put all functions into one Obj.
-		t.Objs = make([]Obj, 1)
-		obj = &t.Objs[0]
-		t.go12line.go12MapFiles(t.Files, obj)
-	} else {
-		t.Objs = make([]Obj, 0, nz)
-	}
-
-	// Count text symbols and attach frame sizes, parameters, and
-	// locals to them.  Also, find object file boundaries.
-	lastf := 0
-	for i := 0; i < len(t.Syms); i++ {
-		sym := &t.Syms[i]
-		switch sym.Type {
-		case 'Z', 'z': // path symbol
-			if t.go12line != nil {
-				// Go 1.2 binaries have the file information elsewhere. Ignore.
-				break
-			}
-			// Finish the current object
-			if obj != nil {
-				obj.Funcs = t.Funcs[lastf:]
-			}
-			lastf = len(t.Funcs)
-
-			// Start new object
-			n := len(t.Objs)
-			t.Objs = t.Objs[0 : n+1]
-			obj = &t.Objs[n]
-
-			// Count & copy path symbols
-			var end int
-			for end = i + 1; end < len(t.Syms); end++ {
-				if c := t.Syms[end].Type; c != 'Z' && c != 'z' {
-					break
-				}
-			}
-			obj.Paths = t.Syms[i:end]
-			i = end - 1 // loop will i++
-
-			// Record file names
-			depth := 0
-			for j := range obj.Paths {
-				s := &obj.Paths[j]
-				if s.Name == "" {
-					depth--
-				} else {
-					if depth == 0 {
-						t.Files[s.Name] = obj
-					}
-					depth++
-				}
-			}
-
-		case 'T', 't', 'L', 'l': // text symbol
-			if n := len(t.Funcs); n > 0 {
-				t.Funcs[n-1].End = sym.Value
-			}
-			if sym.Name == "runtime.etext" || sym.Name == "etext" {
-				continue
-			}
-
-			// Count parameter and local (auto) syms
-			var np, na int
-			var end int
-		countloop:
-			for end = i + 1; end < len(t.Syms); end++ {
-				switch t.Syms[end].Type {
-				case 'T', 't', 'L', 'l', 'Z', 'z':
-					break countloop
-				case 'p':
-					np++
-				case 'a':
-					na++
-				}
-			}
-
-			// Fill in the function symbol
-			n := len(t.Funcs)
-			t.Funcs = t.Funcs[0 : n+1]
-			fn := &t.Funcs[n]
-			sym.Func = fn
-			fn.Params = make([]*Sym, 0, np)
-			fn.Locals = make([]*Sym, 0, na)
-			fn.Sym = sym
-			fn.Entry = sym.Value
-			fn.Obj = obj
-			if t.go12line != nil {
-				// All functions share the same line table.
-				// It knows how to narrow down to a specific
-				// function quickly.
-				fn.LineTable = t.go12line
-			} else if pcln != nil {
-				fn.LineTable = pcln.slice(fn.Entry)
-				pcln = fn.LineTable
-			}
-			for j := i; j < end; j++ {
-				s := &t.Syms[j]
-				switch s.Type {
-				case 'm':
-					fn.FrameSize = int(s.Value)
-				case 'p':
-					n := len(fn.Params)
-					fn.Params = fn.Params[0 : n+1]
-					fn.Params[n] = s
-				case 'a':
-					n := len(fn.Locals)
-					fn.Locals = fn.Locals[0 : n+1]
-					fn.Locals[n] = s
-				}
-			}
-			i = end - 1 // loop will i++
-		}
-	}
-
-	if t.go12line != nil && nf == 0 {
-		t.Funcs = t.go12line.go12Funcs()
-	}
-	if obj != nil {
-		obj.Funcs = t.Funcs[lastf:]
-	}
-	return &t, nil
-}
-
-// PCToFunc returns the function containing the program counter pc,
-// or nil if there is no such function.
-func (t *Table) PCToFunc(pc uint64) *Func {
-	funcs := t.Funcs
-	for len(funcs) > 0 {
-		m := len(funcs) / 2
-		fn := &funcs[m]
-		switch {
-		case pc < fn.Entry:
-			funcs = funcs[0:m]
-		case fn.Entry <= pc && pc < fn.End:
-			return fn
-		default:
-			funcs = funcs[m+1:]
-		}
-	}
-	return nil
-}
-
-// PCToLine looks up line number information for a program counter.
-// If there is no information, it returns fn == nil.
-func (t *Table) PCToLine(pc uint64) (file string, line int, fn *Func) {
-	if fn = t.PCToFunc(pc); fn == nil {
-		return
-	}
-	if t.go12line != nil {
-		file = t.go12line.go12PCToFile(pc)
-		line = t.go12line.go12PCToLine(pc)
-	} else {
-		file, line = fn.Obj.lineFromAline(fn.LineTable.PCToLine(pc))
-	}
-	return
-}
-
-// LineToPC looks up the first program counter on the given line in
-// the named file.  It returns UnknownPathError or UnknownLineError if
-// there is an error looking up this line.
-func (t *Table) LineToPC(file string, line int) (pc uint64, fn *Func, err error) {
-	obj, ok := t.Files[file]
-	if !ok {
-		return 0, nil, UnknownFileError(file)
-	}
-
-	if t.go12line != nil {
-		pc := t.go12line.go12LineToPC(file, line)
-		if pc == 0 {
-			return 0, nil, &UnknownLineError{file, line}
-		}
-		return pc, t.PCToFunc(pc), nil
-	}
-
-	abs, err := obj.alineFromLine(file, line)
-	if err != nil {
-		return
-	}
-	for i := range obj.Funcs {
-		f := &obj.Funcs[i]
-		pc := f.LineTable.LineToPC(abs, f.End)
-		if pc != 0 {
-			return pc, f, nil
-		}
-	}
-	return 0, nil, &UnknownLineError{file, line}
-}
-
-// LookupSym returns the text, data, or bss symbol with the given name,
-// or nil if no such symbol is found.
-func (t *Table) LookupSym(name string) *Sym {
-	// TODO(austin) Maybe make a map
-	for i := range t.Syms {
-		s := &t.Syms[i]
-		switch s.Type {
-		case 'T', 't', 'L', 'l', 'D', 'd', 'B', 'b':
-			if s.Name == name {
-				return s
-			}
-		}
-	}
-	return nil
-}
-
-// LookupFunc returns the text, data, or bss symbol with the given name,
-// or nil if no such symbol is found.
-func (t *Table) LookupFunc(name string) *Func {
-	for i := range t.Funcs {
-		f := &t.Funcs[i]
-		if f.Sym.Name == name {
-			return f
-		}
-	}
-	return nil
-}
-
-// SymByAddr returns the text, data, or bss symbol starting at the given address.
-func (t *Table) SymByAddr(addr uint64) *Sym {
-	for i := range t.Syms {
-		s := &t.Syms[i]
-		switch s.Type {
-		case 'T', 't', 'L', 'l', 'D', 'd', 'B', 'b':
-			if s.Value == addr {
-				return s
-			}
-		}
-	}
-	return nil
-}
-
-/*
- * Object files
- */
-
-// This is legacy code for Go 1.1 and earlier, which used the
-// Plan 9 format for pc-line tables. This code was never quite
-// correct. It's probably very close, and it's usually correct, but
-// we never quite found all the corner cases.
-//
-// Go 1.2 and later use a simpler format, documented at golang.org/s/go12symtab.
-
-func (o *Obj) lineFromAline(aline int) (string, int) {
-	type stackEnt struct {
-		path   string
-		start  int
-		offset int
-		prev   *stackEnt
-	}
-
-	noPath := &stackEnt{"", 0, 0, nil}
-	tos := noPath
-
-pathloop:
-	for _, s := range o.Paths {
-		val := int(s.Value)
-		switch {
-		case val > aline:
-			break pathloop
-
-		case val == 1:
-			// Start a new stack
-			tos = &stackEnt{s.Name, val, 0, noPath}
-
-		case s.Name == "":
-			// Pop
-			if tos == noPath {
-				return "<malformed symbol table>", 0
-			}
-			tos.prev.offset += val - tos.start
-			tos = tos.prev
-
-		default:
-			// Push
-			tos = &stackEnt{s.Name, val, 0, tos}
-		}
-	}
-
-	if tos == noPath {
-		return "", 0
-	}
-	return tos.path, aline - tos.start - tos.offset + 1
-}
-
-func (o *Obj) alineFromLine(path string, line int) (int, error) {
-	if line < 1 {
-		return 0, &UnknownLineError{path, line}
-	}
-
-	for i, s := range o.Paths {
-		// Find this path
-		if s.Name != path {
-			continue
-		}
-
-		// Find this line at this stack level
-		depth := 0
-		var incstart int
-		line += int(s.Value)
-	pathloop:
-		for _, s := range o.Paths[i:] {
-			val := int(s.Value)
-			switch {
-			case depth == 1 && val >= line:
-				return line - 1, nil
-
-			case s.Name == "":
-				depth--
-				if depth == 0 {
-					break pathloop
-				} else if depth == 1 {
-					line += val - incstart
-				}
-
-			default:
-				if depth == 1 {
-					incstart = val
-				}
-				depth++
-			}
-		}
-		return 0, &UnknownLineError{path, line}
-	}
-	return 0, UnknownFileError(path)
-}
-
-/*
- * Errors
- */
-
-// UnknownFileError represents a failure to find the specific file in
-// the symbol table.
-type UnknownFileError string
-
-func (e UnknownFileError) Error() string { return "unknown file: " + string(e) }
-
-// UnknownLineError represents a failure to map a line to a program
-// counter, either because the line is beyond the bounds of the file
-// or because there is no code on the given line.
-type UnknownLineError struct {
-	File string
-	Line int
-}
-
-func (e *UnknownLineError) Error() string {
-	return "no code at " + e.File + ":" + strconv.Itoa(e.Line)
-}
-
-// DecodingError represents an error during the decoding of
-// the symbol table.
-type DecodingError struct {
-	off int
-	msg string
-	val interface{}
-}
-
-func (e *DecodingError) Error() string {
-	msg := e.msg
-	if e.val != nil {
-		msg += fmt.Sprintf(" '%v'", e.val)
-	}
-	msg += fmt.Sprintf(" at byte %#x", e.off)
-	return msg
-}
diff --git a/third_party/gofrontend/libgo/go/debug/macho/fat.go b/third_party/gofrontend/libgo/go/debug/macho/fat.go
deleted file mode 100644
index 93b8315..0000000
--- a/third_party/gofrontend/libgo/go/debug/macho/fat.go
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package macho
-
-import (
-	"encoding/binary"
-	"fmt"
-	"io"
-	"os"
-)
-
-// A FatFile is a Mach-O universal binary that contains at least one architecture.
-type FatFile struct {
-	Magic  uint32
-	Arches []FatArch
-	closer io.Closer
-}
-
-// A FatArchHeader represents a fat header for a specific image architecture.
-type FatArchHeader struct {
-	Cpu    Cpu
-	SubCpu uint32
-	Offset uint32
-	Size   uint32
-	Align  uint32
-}
-
-const fatArchHeaderSize = 5 * 4
-
-// A FatArch is a Mach-O File inside a FatFile.
-type FatArch struct {
-	FatArchHeader
-	*File
-}
-
-// ErrNotFat is returned from NewFatFile or OpenFat when the file is not a
-// universal binary but may be a thin binary, based on its magic number.
-var ErrNotFat = &FormatError{0, "not a fat Mach-O file", nil}
-
-// NewFatFile creates a new FatFile for accessing all the Mach-O images in a
-// universal binary. The Mach-O binary is expected to start at position 0 in
-// the ReaderAt.
-func NewFatFile(r io.ReaderAt) (*FatFile, error) {
-	var ff FatFile
-	sr := io.NewSectionReader(r, 0, 1<<63-1)
-
-	// Read the fat_header struct, which is always in big endian.
-	// Start with the magic number.
-	err := binary.Read(sr, binary.BigEndian, &ff.Magic)
-	if err != nil {
-		return nil, &FormatError{0, "error reading magic number", nil}
-	} else if ff.Magic != MagicFat {
-		// See if this is a Mach-O file via its magic number. The magic
-		// must be converted to little endian first though.
-		var buf [4]byte
-		binary.BigEndian.PutUint32(buf[:], ff.Magic)
-		leMagic := binary.LittleEndian.Uint32(buf[:])
-		if leMagic == Magic32 || leMagic == Magic64 {
-			return nil, ErrNotFat
-		} else {
-			return nil, &FormatError{0, "invalid magic number", nil}
-		}
-	}
-	offset := int64(4)
-
-	// Read the number of FatArchHeaders that come after the fat_header.
-	var narch uint32
-	err = binary.Read(sr, binary.BigEndian, &narch)
-	if err != nil {
-		return nil, &FormatError{offset, "invalid fat_header", nil}
-	}
-	offset += 4
-
-	if narch < 1 {
-		return nil, &FormatError{offset, "file contains no images", nil}
-	}
-
-	// Combine the Cpu and SubCpu (both uint32) into a uint64 to make sure
-	// there are not duplicate architectures.
-	seenArches := make(map[uint64]bool, narch)
-	// Make sure that all images are for the same MH_ type.
-	var machoType Type
-
-	// Following the fat_header comes narch fat_arch structs that index
-	// Mach-O images further in the file.
-	ff.Arches = make([]FatArch, narch)
-	for i := uint32(0); i < narch; i++ {
-		fa := &ff.Arches[i]
-		err = binary.Read(sr, binary.BigEndian, &fa.FatArchHeader)
-		if err != nil {
-			return nil, &FormatError{offset, "invalid fat_arch header", nil}
-		}
-		offset += fatArchHeaderSize
-
-		fr := io.NewSectionReader(r, int64(fa.Offset), int64(fa.Size))
-		fa.File, err = NewFile(fr)
-		if err != nil {
-			return nil, err
-		}
-
-		// Make sure the architecture for this image is not duplicate.
-		seenArch := (uint64(fa.Cpu) << 32) | uint64(fa.SubCpu)
-		if o, k := seenArches[seenArch]; o || k {
-			return nil, &FormatError{offset, fmt.Sprintf("duplicate architecture cpu=%v, subcpu=%#x", fa.Cpu, fa.SubCpu), nil}
-		}
-		seenArches[seenArch] = true
-
-		// Make sure the Mach-O type matches that of the first image.
-		if i == 0 {
-			machoType = fa.Type
-		} else {
-			if fa.Type != machoType {
-				return nil, &FormatError{offset, fmt.Sprintf("Mach-O type for architecture #%d (type=%#x) does not match first (type=%#x)", i, fa.Type, machoType), nil}
-			}
-		}
-	}
-
-	return &ff, nil
-}
-
-// OpenFat opens the named file using os.Open and prepares it for use as a Mach-O
-// universal binary.
-func OpenFat(name string) (ff *FatFile, err error) {
-	f, err := os.Open(name)
-	if err != nil {
-		return nil, err
-	}
-	ff, err = NewFatFile(f)
-	if err != nil {
-		f.Close()
-		return nil, err
-	}
-	ff.closer = f
-	return
-}
-
-func (ff *FatFile) Close() error {
-	var err error
-	if ff.closer != nil {
-		err = ff.closer.Close()
-		ff.closer = nil
-	}
-	return err
-}
diff --git a/third_party/gofrontend/libgo/go/debug/macho/file.go b/third_party/gofrontend/libgo/go/debug/macho/file.go
deleted file mode 100644
index a7599aa..0000000
--- a/third_party/gofrontend/libgo/go/debug/macho/file.go
+++ /dev/null
@@ -1,524 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package macho implements access to Mach-O object files.
-package macho
-
-// High level access to low level data structures.
-
-import (
-	"bytes"
-	"debug/dwarf"
-	"encoding/binary"
-	"fmt"
-	"io"
-	"os"
-)
-
-// A File represents an open Mach-O file.
-type File struct {
-	FileHeader
-	ByteOrder binary.ByteOrder
-	Loads     []Load
-	Sections  []*Section
-
-	Symtab   *Symtab
-	Dysymtab *Dysymtab
-
-	closer io.Closer
-}
-
-// A Load represents any Mach-O load command.
-type Load interface {
-	Raw() []byte
-}
-
-// A LoadBytes is the uninterpreted bytes of a Mach-O load command.
-type LoadBytes []byte
-
-func (b LoadBytes) Raw() []byte { return b }
-
-// A SegmentHeader is the header for a Mach-O 32-bit or 64-bit load segment command.
-type SegmentHeader struct {
-	Cmd     LoadCmd
-	Len     uint32
-	Name    string
-	Addr    uint64
-	Memsz   uint64
-	Offset  uint64
-	Filesz  uint64
-	Maxprot uint32
-	Prot    uint32
-	Nsect   uint32
-	Flag    uint32
-}
-
-// A Segment represents a Mach-O 32-bit or 64-bit load segment command.
-type Segment struct {
-	LoadBytes
-	SegmentHeader
-
-	// Embed ReaderAt for ReadAt method.
-	// Do not embed SectionReader directly
-	// to avoid having Read and Seek.
-	// If a client wants Read and Seek it must use
-	// Open() to avoid fighting over the seek offset
-	// with other clients.
-	io.ReaderAt
-	sr *io.SectionReader
-}
-
-// Data reads and returns the contents of the segment.
-func (s *Segment) Data() ([]byte, error) {
-	dat := make([]byte, s.sr.Size())
-	n, err := s.sr.ReadAt(dat, 0)
-	if n == len(dat) {
-		err = nil
-	}
-	return dat[0:n], err
-}
-
-// Open returns a new ReadSeeker reading the segment.
-func (s *Segment) Open() io.ReadSeeker { return io.NewSectionReader(s.sr, 0, 1<<63-1) }
-
-type SectionHeader struct {
-	Name   string
-	Seg    string
-	Addr   uint64
-	Size   uint64
-	Offset uint32
-	Align  uint32
-	Reloff uint32
-	Nreloc uint32
-	Flags  uint32
-}
-
-type Section struct {
-	SectionHeader
-
-	// Embed ReaderAt for ReadAt method.
-	// Do not embed SectionReader directly
-	// to avoid having Read and Seek.
-	// If a client wants Read and Seek it must use
-	// Open() to avoid fighting over the seek offset
-	// with other clients.
-	io.ReaderAt
-	sr *io.SectionReader
-}
-
-// Data reads and returns the contents of the Mach-O section.
-func (s *Section) Data() ([]byte, error) {
-	dat := make([]byte, s.sr.Size())
-	n, err := s.sr.ReadAt(dat, 0)
-	if n == len(dat) {
-		err = nil
-	}
-	return dat[0:n], err
-}
-
-// Open returns a new ReadSeeker reading the Mach-O section.
-func (s *Section) Open() io.ReadSeeker { return io.NewSectionReader(s.sr, 0, 1<<63-1) }
-
-// A Dylib represents a Mach-O load dynamic library command.
-type Dylib struct {
-	LoadBytes
-	Name           string
-	Time           uint32
-	CurrentVersion uint32
-	CompatVersion  uint32
-}
-
-// A Symtab represents a Mach-O symbol table command.
-type Symtab struct {
-	LoadBytes
-	SymtabCmd
-	Syms []Symbol
-}
-
-// A Dysymtab represents a Mach-O dynamic symbol table command.
-type Dysymtab struct {
-	LoadBytes
-	DysymtabCmd
-	IndirectSyms []uint32 // indices into Symtab.Syms
-}
-
-/*
- * Mach-O reader
- */
-
-// FormatError is returned by some operations if the data does
-// not have the correct format for an object file.
-type FormatError struct {
-	off int64
-	msg string
-	val interface{}
-}
-
-func (e *FormatError) Error() string {
-	msg := e.msg
-	if e.val != nil {
-		msg += fmt.Sprintf(" '%v'", e.val)
-	}
-	msg += fmt.Sprintf(" in record at byte %#x", e.off)
-	return msg
-}
-
-// Open opens the named file using os.Open and prepares it for use as a Mach-O binary.
-func Open(name string) (*File, error) {
-	f, err := os.Open(name)
-	if err != nil {
-		return nil, err
-	}
-	ff, err := NewFile(f)
-	if err != nil {
-		f.Close()
-		return nil, err
-	}
-	ff.closer = f
-	return ff, nil
-}
-
-// Close closes the File.
-// If the File was created using NewFile directly instead of Open,
-// Close has no effect.
-func (f *File) Close() error {
-	var err error
-	if f.closer != nil {
-		err = f.closer.Close()
-		f.closer = nil
-	}
-	return err
-}
-
-// NewFile creates a new File for accessing a Mach-O binary in an underlying reader.
-// The Mach-O binary is expected to start at position 0 in the ReaderAt.
-func NewFile(r io.ReaderAt) (*File, error) {
-	f := new(File)
-	sr := io.NewSectionReader(r, 0, 1<<63-1)
-
-	// Read and decode Mach magic to determine byte order, size.
-	// Magic32 and Magic64 differ only in the bottom bit.
-	var ident [4]byte
-	if _, err := r.ReadAt(ident[0:], 0); err != nil {
-		return nil, err
-	}
-	be := binary.BigEndian.Uint32(ident[0:])
-	le := binary.LittleEndian.Uint32(ident[0:])
-	switch Magic32 &^ 1 {
-	case be &^ 1:
-		f.ByteOrder = binary.BigEndian
-		f.Magic = be
-	case le &^ 1:
-		f.ByteOrder = binary.LittleEndian
-		f.Magic = le
-	default:
-		return nil, &FormatError{0, "invalid magic number", nil}
-	}
-
-	// Read entire file header.
-	if err := binary.Read(sr, f.ByteOrder, &f.FileHeader); err != nil {
-		return nil, err
-	}
-
-	// Then load commands.
-	offset := int64(fileHeaderSize32)
-	if f.Magic == Magic64 {
-		offset = fileHeaderSize64
-	}
-	dat := make([]byte, f.Cmdsz)
-	if _, err := r.ReadAt(dat, offset); err != nil {
-		return nil, err
-	}
-	f.Loads = make([]Load, f.Ncmd)
-	bo := f.ByteOrder
-	for i := range f.Loads {
-		// Each load command begins with uint32 command and length.
-		if len(dat) < 8 {
-			return nil, &FormatError{offset, "command block too small", nil}
-		}
-		cmd, siz := LoadCmd(bo.Uint32(dat[0:4])), bo.Uint32(dat[4:8])
-		if siz < 8 || siz > uint32(len(dat)) {
-			return nil, &FormatError{offset, "invalid command block size", nil}
-		}
-		var cmddat []byte
-		cmddat, dat = dat[0:siz], dat[siz:]
-		offset += int64(siz)
-		var s *Segment
-		switch cmd {
-		default:
-			f.Loads[i] = LoadBytes(cmddat)
-
-		case LoadCmdDylib:
-			var hdr DylibCmd
-			b := bytes.NewReader(cmddat)
-			if err := binary.Read(b, bo, &hdr); err != nil {
-				return nil, err
-			}
-			l := new(Dylib)
-			if hdr.Name >= uint32(len(cmddat)) {
-				return nil, &FormatError{offset, "invalid name in dynamic library command", hdr.Name}
-			}
-			l.Name = cstring(cmddat[hdr.Name:])
-			l.Time = hdr.Time
-			l.CurrentVersion = hdr.CurrentVersion
-			l.CompatVersion = hdr.CompatVersion
-			l.LoadBytes = LoadBytes(cmddat)
-			f.Loads[i] = l
-
-		case LoadCmdSymtab:
-			var hdr SymtabCmd
-			b := bytes.NewReader(cmddat)
-			if err := binary.Read(b, bo, &hdr); err != nil {
-				return nil, err
-			}
-			strtab := make([]byte, hdr.Strsize)
-			if _, err := r.ReadAt(strtab, int64(hdr.Stroff)); err != nil {
-				return nil, err
-			}
-			var symsz int
-			if f.Magic == Magic64 {
-				symsz = 16
-			} else {
-				symsz = 12
-			}
-			symdat := make([]byte, int(hdr.Nsyms)*symsz)
-			if _, err := r.ReadAt(symdat, int64(hdr.Symoff)); err != nil {
-				return nil, err
-			}
-			st, err := f.parseSymtab(symdat, strtab, cmddat, &hdr, offset)
-			if err != nil {
-				return nil, err
-			}
-			f.Loads[i] = st
-			f.Symtab = st
-
-		case LoadCmdDysymtab:
-			var hdr DysymtabCmd
-			b := bytes.NewReader(cmddat)
-			if err := binary.Read(b, bo, &hdr); err != nil {
-				return nil, err
-			}
-			dat := make([]byte, hdr.Nindirectsyms*4)
-			if _, err := r.ReadAt(dat, int64(hdr.Indirectsymoff)); err != nil {
-				return nil, err
-			}
-			x := make([]uint32, hdr.Nindirectsyms)
-			if err := binary.Read(bytes.NewReader(dat), bo, x); err != nil {
-				return nil, err
-			}
-			st := new(Dysymtab)
-			st.LoadBytes = LoadBytes(cmddat)
-			st.DysymtabCmd = hdr
-			st.IndirectSyms = x
-			f.Loads[i] = st
-			f.Dysymtab = st
-
-		case LoadCmdSegment:
-			var seg32 Segment32
-			b := bytes.NewReader(cmddat)
-			if err := binary.Read(b, bo, &seg32); err != nil {
-				return nil, err
-			}
-			s = new(Segment)
-			s.LoadBytes = cmddat
-			s.Cmd = cmd
-			s.Len = siz
-			s.Name = cstring(seg32.Name[0:])
-			s.Addr = uint64(seg32.Addr)
-			s.Memsz = uint64(seg32.Memsz)
-			s.Offset = uint64(seg32.Offset)
-			s.Filesz = uint64(seg32.Filesz)
-			s.Maxprot = seg32.Maxprot
-			s.Prot = seg32.Prot
-			s.Nsect = seg32.Nsect
-			s.Flag = seg32.Flag
-			f.Loads[i] = s
-			for i := 0; i < int(s.Nsect); i++ {
-				var sh32 Section32
-				if err := binary.Read(b, bo, &sh32); err != nil {
-					return nil, err
-				}
-				sh := new(Section)
-				sh.Name = cstring(sh32.Name[0:])
-				sh.Seg = cstring(sh32.Seg[0:])
-				sh.Addr = uint64(sh32.Addr)
-				sh.Size = uint64(sh32.Size)
-				sh.Offset = sh32.Offset
-				sh.Align = sh32.Align
-				sh.Reloff = sh32.Reloff
-				sh.Nreloc = sh32.Nreloc
-				sh.Flags = sh32.Flags
-				f.pushSection(sh, r)
-			}
-
-		case LoadCmdSegment64:
-			var seg64 Segment64
-			b := bytes.NewReader(cmddat)
-			if err := binary.Read(b, bo, &seg64); err != nil {
-				return nil, err
-			}
-			s = new(Segment)
-			s.LoadBytes = cmddat
-			s.Cmd = cmd
-			s.Len = siz
-			s.Name = cstring(seg64.Name[0:])
-			s.Addr = seg64.Addr
-			s.Memsz = seg64.Memsz
-			s.Offset = seg64.Offset
-			s.Filesz = seg64.Filesz
-			s.Maxprot = seg64.Maxprot
-			s.Prot = seg64.Prot
-			s.Nsect = seg64.Nsect
-			s.Flag = seg64.Flag
-			f.Loads[i] = s
-			for i := 0; i < int(s.Nsect); i++ {
-				var sh64 Section64
-				if err := binary.Read(b, bo, &sh64); err != nil {
-					return nil, err
-				}
-				sh := new(Section)
-				sh.Name = cstring(sh64.Name[0:])
-				sh.Seg = cstring(sh64.Seg[0:])
-				sh.Addr = sh64.Addr
-				sh.Size = sh64.Size
-				sh.Offset = sh64.Offset
-				sh.Align = sh64.Align
-				sh.Reloff = sh64.Reloff
-				sh.Nreloc = sh64.Nreloc
-				sh.Flags = sh64.Flags
-				f.pushSection(sh, r)
-			}
-		}
-		if s != nil {
-			s.sr = io.NewSectionReader(r, int64(s.Offset), int64(s.Filesz))
-			s.ReaderAt = s.sr
-		}
-	}
-	return f, nil
-}
-
-func (f *File) parseSymtab(symdat, strtab, cmddat []byte, hdr *SymtabCmd, offset int64) (*Symtab, error) {
-	bo := f.ByteOrder
-	symtab := make([]Symbol, hdr.Nsyms)
-	b := bytes.NewReader(symdat)
-	for i := range symtab {
-		var n Nlist64
-		if f.Magic == Magic64 {
-			if err := binary.Read(b, bo, &n); err != nil {
-				return nil, err
-			}
-		} else {
-			var n32 Nlist32
-			if err := binary.Read(b, bo, &n32); err != nil {
-				return nil, err
-			}
-			n.Name = n32.Name
-			n.Type = n32.Type
-			n.Sect = n32.Sect
-			n.Desc = n32.Desc
-			n.Value = uint64(n32.Value)
-		}
-		sym := &symtab[i]
-		if n.Name >= uint32(len(strtab)) {
-			return nil, &FormatError{offset, "invalid name in symbol table", n.Name}
-		}
-		sym.Name = cstring(strtab[n.Name:])
-		sym.Type = n.Type
-		sym.Sect = n.Sect
-		sym.Desc = n.Desc
-		sym.Value = n.Value
-	}
-	st := new(Symtab)
-	st.LoadBytes = LoadBytes(cmddat)
-	st.Syms = symtab
-	return st, nil
-}
-
-func (f *File) pushSection(sh *Section, r io.ReaderAt) {
-	f.Sections = append(f.Sections, sh)
-	sh.sr = io.NewSectionReader(r, int64(sh.Offset), int64(sh.Size))
-	sh.ReaderAt = sh.sr
-}
-
-func cstring(b []byte) string {
-	var i int
-	for i = 0; i < len(b) && b[i] != 0; i++ {
-	}
-	return string(b[0:i])
-}
-
-// Segment returns the first Segment with the given name, or nil if no such segment exists.
-func (f *File) Segment(name string) *Segment {
-	for _, l := range f.Loads {
-		if s, ok := l.(*Segment); ok && s.Name == name {
-			return s
-		}
-	}
-	return nil
-}
-
-// Section returns the first section with the given name, or nil if no such
-// section exists.
-func (f *File) Section(name string) *Section {
-	for _, s := range f.Sections {
-		if s.Name == name {
-			return s
-		}
-	}
-	return nil
-}
-
-// DWARF returns the DWARF debug information for the Mach-O file.
-func (f *File) DWARF() (*dwarf.Data, error) {
-	// There are many other DWARF sections, but these
-	// are the ones the debug/dwarf package uses.
-	// Don't bother loading others.
-	var names = [...]string{"abbrev", "info", "line", "str"}
-	var dat [len(names)][]byte
-	for i, name := range names {
-		name = "__debug_" + name
-		s := f.Section(name)
-		if s == nil {
-			continue
-		}
-		b, err := s.Data()
-		if err != nil && uint64(len(b)) < s.Size {
-			return nil, err
-		}
-		dat[i] = b
-	}
-
-	abbrev, info, line, str := dat[0], dat[1], dat[2], dat[3]
-	return dwarf.New(abbrev, nil, nil, info, line, nil, nil, str)
-}
-
-// ImportedSymbols returns the names of all symbols
-// referred to by the binary f that are expected to be
-// satisfied by other libraries at dynamic load time.
-func (f *File) ImportedSymbols() ([]string, error) {
-	if f.Dysymtab == nil || f.Symtab == nil {
-		return nil, &FormatError{0, "missing symbol table", nil}
-	}
-
-	st := f.Symtab
-	dt := f.Dysymtab
-	var all []string
-	for _, s := range st.Syms[dt.Iundefsym : dt.Iundefsym+dt.Nundefsym] {
-		all = append(all, s.Name)
-	}
-	return all, nil
-}
-
-// ImportedLibraries returns the paths of all libraries
-// referred to by the binary f that are expected to be
-// linked with the binary at dynamic link time.
-func (f *File) ImportedLibraries() ([]string, error) {
-	var all []string
-	for _, l := range f.Loads {
-		if lib, ok := l.(*Dylib); ok {
-			all = append(all, lib.Name)
-		}
-	}
-	return all, nil
-}
diff --git a/third_party/gofrontend/libgo/go/debug/macho/file_test.go b/third_party/gofrontend/libgo/go/debug/macho/file_test.go
deleted file mode 100644
index 4797780..0000000
--- a/third_party/gofrontend/libgo/go/debug/macho/file_test.go
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package macho
-
-import (
-	"reflect"
-	"testing"
-)
-
-type fileTest struct {
-	file     string
-	hdr      FileHeader
-	segments []*SegmentHeader
-	sections []*SectionHeader
-}
-
-var fileTests = []fileTest{
-	{
-		"testdata/gcc-386-darwin-exec",
-		FileHeader{0xfeedface, Cpu386, 0x3, 0x2, 0xc, 0x3c0, 0x85},
-		[]*SegmentHeader{
-			{LoadCmdSegment, 0x38, "__PAGEZERO", 0x0, 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
-			{LoadCmdSegment, 0xc0, "__TEXT", 0x1000, 0x1000, 0x0, 0x1000, 0x7, 0x5, 0x2, 0x0},
-			{LoadCmdSegment, 0xc0, "__DATA", 0x2000, 0x1000, 0x1000, 0x1000, 0x7, 0x3, 0x2, 0x0},
-			{LoadCmdSegment, 0x7c, "__IMPORT", 0x3000, 0x1000, 0x2000, 0x1000, 0x7, 0x7, 0x1, 0x0},
-			{LoadCmdSegment, 0x38, "__LINKEDIT", 0x4000, 0x1000, 0x3000, 0x12c, 0x7, 0x1, 0x0, 0x0},
-			nil,
-			nil,
-			nil,
-			nil,
-			nil,
-			nil,
-			nil,
-		},
-		[]*SectionHeader{
-			{"__text", "__TEXT", 0x1f68, 0x88, 0xf68, 0x2, 0x0, 0x0, 0x80000400},
-			{"__cstring", "__TEXT", 0x1ff0, 0xd, 0xff0, 0x0, 0x0, 0x0, 0x2},
-			{"__data", "__DATA", 0x2000, 0x14, 0x1000, 0x2, 0x0, 0x0, 0x0},
-			{"__dyld", "__DATA", 0x2014, 0x1c, 0x1014, 0x2, 0x0, 0x0, 0x0},
-			{"__jump_table", "__IMPORT", 0x3000, 0xa, 0x2000, 0x6, 0x0, 0x0, 0x4000008},
-		},
-	},
-	{
-		"testdata/gcc-amd64-darwin-exec",
-		FileHeader{0xfeedfacf, CpuAmd64, 0x80000003, 0x2, 0xb, 0x568, 0x85},
-		[]*SegmentHeader{
-			{LoadCmdSegment64, 0x48, "__PAGEZERO", 0x0, 0x100000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
-			{LoadCmdSegment64, 0x1d8, "__TEXT", 0x100000000, 0x1000, 0x0, 0x1000, 0x7, 0x5, 0x5, 0x0},
-			{LoadCmdSegment64, 0x138, "__DATA", 0x100001000, 0x1000, 0x1000, 0x1000, 0x7, 0x3, 0x3, 0x0},
-			{LoadCmdSegment64, 0x48, "__LINKEDIT", 0x100002000, 0x1000, 0x2000, 0x140, 0x7, 0x1, 0x0, 0x0},
-			nil,
-			nil,
-			nil,
-			nil,
-			nil,
-			nil,
-			nil,
-		},
-		[]*SectionHeader{
-			{"__text", "__TEXT", 0x100000f14, 0x6d, 0xf14, 0x2, 0x0, 0x0, 0x80000400},
-			{"__symbol_stub1", "__TEXT", 0x100000f81, 0xc, 0xf81, 0x0, 0x0, 0x0, 0x80000408},
-			{"__stub_helper", "__TEXT", 0x100000f90, 0x18, 0xf90, 0x2, 0x0, 0x0, 0x0},
-			{"__cstring", "__TEXT", 0x100000fa8, 0xd, 0xfa8, 0x0, 0x0, 0x0, 0x2},
-			{"__eh_frame", "__TEXT", 0x100000fb8, 0x48, 0xfb8, 0x3, 0x0, 0x0, 0x6000000b},
-			{"__data", "__DATA", 0x100001000, 0x1c, 0x1000, 0x3, 0x0, 0x0, 0x0},
-			{"__dyld", "__DATA", 0x100001020, 0x38, 0x1020, 0x3, 0x0, 0x0, 0x0},
-			{"__la_symbol_ptr", "__DATA", 0x100001058, 0x10, 0x1058, 0x2, 0x0, 0x0, 0x7},
-		},
-	},
-	{
-		"testdata/gcc-amd64-darwin-exec-debug",
-		FileHeader{0xfeedfacf, CpuAmd64, 0x80000003, 0xa, 0x4, 0x5a0, 0},
-		[]*SegmentHeader{
-			nil,
-			{LoadCmdSegment64, 0x1d8, "__TEXT", 0x100000000, 0x1000, 0x0, 0x0, 0x7, 0x5, 0x5, 0x0},
-			{LoadCmdSegment64, 0x138, "__DATA", 0x100001000, 0x1000, 0x0, 0x0, 0x7, 0x3, 0x3, 0x0},
-			{LoadCmdSegment64, 0x278, "__DWARF", 0x100002000, 0x1000, 0x1000, 0x1bc, 0x7, 0x3, 0x7, 0x0},
-		},
-		[]*SectionHeader{
-			{"__text", "__TEXT", 0x100000f14, 0x0, 0x0, 0x2, 0x0, 0x0, 0x80000400},
-			{"__symbol_stub1", "__TEXT", 0x100000f81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80000408},
-			{"__stub_helper", "__TEXT", 0x100000f90, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0},
-			{"__cstring", "__TEXT", 0x100000fa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2},
-			{"__eh_frame", "__TEXT", 0x100000fb8, 0x0, 0x0, 0x3, 0x0, 0x0, 0x6000000b},
-			{"__data", "__DATA", 0x100001000, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0},
-			{"__dyld", "__DATA", 0x100001020, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0},
-			{"__la_symbol_ptr", "__DATA", 0x100001058, 0x0, 0x0, 0x2, 0x0, 0x0, 0x7},
-			{"__debug_abbrev", "__DWARF", 0x100002000, 0x36, 0x1000, 0x0, 0x0, 0x0, 0x0},
-			{"__debug_aranges", "__DWARF", 0x100002036, 0x30, 0x1036, 0x0, 0x0, 0x0, 0x0},
-			{"__debug_frame", "__DWARF", 0x100002066, 0x40, 0x1066, 0x0, 0x0, 0x0, 0x0},
-			{"__debug_info", "__DWARF", 0x1000020a6, 0x54, 0x10a6, 0x0, 0x0, 0x0, 0x0},
-			{"__debug_line", "__DWARF", 0x1000020fa, 0x47, 0x10fa, 0x0, 0x0, 0x0, 0x0},
-			{"__debug_pubnames", "__DWARF", 0x100002141, 0x1b, 0x1141, 0x0, 0x0, 0x0, 0x0},
-			{"__debug_str", "__DWARF", 0x10000215c, 0x60, 0x115c, 0x0, 0x0, 0x0, 0x0},
-		},
-	},
-}
-
-func TestOpen(t *testing.T) {
-	for i := range fileTests {
-		tt := &fileTests[i]
-
-		f, err := Open(tt.file)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-		if !reflect.DeepEqual(f.FileHeader, tt.hdr) {
-			t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.FileHeader, tt.hdr)
-			continue
-		}
-		for i, l := range f.Loads {
-			if i >= len(tt.segments) {
-				break
-			}
-			sh := tt.segments[i]
-			s, ok := l.(*Segment)
-			if sh == nil {
-				if ok {
-					t.Errorf("open %s, section %d: skipping %#v\n", tt.file, i, &s.SegmentHeader)
-				}
-				continue
-			}
-			if !ok {
-				t.Errorf("open %s, section %d: not *Segment\n", tt.file, i)
-				continue
-			}
-			have := &s.SegmentHeader
-			want := sh
-			if !reflect.DeepEqual(have, want) {
-				t.Errorf("open %s, segment %d:\n\thave %#v\n\twant %#v\n", tt.file, i, have, want)
-			}
-		}
-		tn := len(tt.segments)
-		fn := len(f.Loads)
-		if tn != fn {
-			t.Errorf("open %s: len(Loads) = %d, want %d", tt.file, fn, tn)
-		}
-
-		for i, sh := range f.Sections {
-			if i >= len(tt.sections) {
-				break
-			}
-			have := &sh.SectionHeader
-			want := tt.sections[i]
-			if !reflect.DeepEqual(have, want) {
-				t.Errorf("open %s, section %d:\n\thave %#v\n\twant %#v\n", tt.file, i, have, want)
-			}
-		}
-		tn = len(tt.sections)
-		fn = len(f.Sections)
-		if tn != fn {
-			t.Errorf("open %s: len(Sections) = %d, want %d", tt.file, fn, tn)
-		}
-
-	}
-}
-
-func TestOpenFailure(t *testing.T) {
-	filename := "file.go"    // not a Mach-O file
-	_, err := Open(filename) // don't crash
-	if err == nil {
-		t.Errorf("open %s: succeeded unexpectedly", filename)
-	}
-}
-
-func TestOpenFat(t *testing.T) {
-	ff, err := OpenFat("testdata/fat-gcc-386-amd64-darwin-exec")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	if ff.Magic != MagicFat {
-		t.Errorf("OpenFat: got magic number %#x, want %#x", ff.Magic, MagicFat)
-	}
-	if len(ff.Arches) != 2 {
-		t.Errorf("OpenFat: got %d architectures, want 2", len(ff.Arches))
-	}
-
-	for i := range ff.Arches {
-		arch := &ff.Arches[i]
-		ftArch := &fileTests[i]
-
-		if arch.Cpu != ftArch.hdr.Cpu || arch.SubCpu != ftArch.hdr.SubCpu {
-			t.Errorf("OpenFat: architecture #%d got cpu=%#x subtype=%#x, expected cpu=%#x, subtype=%#x", i, arch.Cpu, arch.SubCpu, ftArch.hdr.Cpu, ftArch.hdr.SubCpu)
-		}
-
-		if !reflect.DeepEqual(arch.FileHeader, ftArch.hdr) {
-			t.Errorf("OpenFat header:\n\tgot %#v\n\twant %#v\n", arch.FileHeader, ftArch.hdr)
-		}
-	}
-}
-
-func TestOpenFatFailure(t *testing.T) {
-	filename := "file.go" // not a Mach-O file
-	if _, err := OpenFat(filename); err == nil {
-		t.Errorf("OpenFat %s: succeeded unexpectedly", filename)
-	}
-
-	filename = "testdata/gcc-386-darwin-exec" // not a fat Mach-O
-	ff, err := OpenFat(filename)
-	if err != ErrNotFat {
-		t.Errorf("OpenFat %s: got %v, want ErrNotFat", filename, err)
-	}
-	if ff != nil {
-		t.Errorf("OpenFat %s: got %v, want nil", filename, ff)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/debug/macho/macho.go b/third_party/gofrontend/libgo/go/debug/macho/macho.go
deleted file mode 100644
index d9678c8..0000000
--- a/third_party/gofrontend/libgo/go/debug/macho/macho.go
+++ /dev/null
@@ -1,316 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Mach-O header data structures
-// http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html
-
-package macho
-
-import "strconv"
-
-// A FileHeader represents a Mach-O file header.
-type FileHeader struct {
-	Magic  uint32
-	Cpu    Cpu
-	SubCpu uint32
-	Type   Type
-	Ncmd   uint32
-	Cmdsz  uint32
-	Flags  uint32
-}
-
-const (
-	fileHeaderSize32 = 7 * 4
-	fileHeaderSize64 = 8 * 4
-)
-
-const (
-	Magic32  uint32 = 0xfeedface
-	Magic64  uint32 = 0xfeedfacf
-	MagicFat uint32 = 0xcafebabe
-)
-
-// A Type is the Mach-O file type, e.g. an object file, executable, or dynamic library.
-type Type uint32
-
-const (
-	TypeObj    Type = 1
-	TypeExec   Type = 2
-	TypeDylib  Type = 6
-	TypeBundle Type = 8
-)
-
-// A Cpu is a Mach-O cpu type.
-type Cpu uint32
-
-const cpuArch64 = 0x01000000
-
-const (
-	Cpu386   Cpu = 7
-	CpuAmd64 Cpu = Cpu386 | cpuArch64
-	CpuArm   Cpu = 12
-	CpuPpc   Cpu = 18
-	CpuPpc64 Cpu = CpuPpc | cpuArch64
-)
-
-var cpuStrings = []intName{
-	{uint32(Cpu386), "Cpu386"},
-	{uint32(CpuAmd64), "CpuAmd64"},
-	{uint32(CpuArm), "CpuArm"},
-	{uint32(CpuPpc), "CpuPpc"},
-	{uint32(CpuPpc64), "CpuPpc64"},
-}
-
-func (i Cpu) String() string   { return stringName(uint32(i), cpuStrings, false) }
-func (i Cpu) GoString() string { return stringName(uint32(i), cpuStrings, true) }
-
-// A LoadCmd is a Mach-O load command.
-type LoadCmd uint32
-
-const (
-	LoadCmdSegment    LoadCmd = 1
-	LoadCmdSymtab     LoadCmd = 2
-	LoadCmdThread     LoadCmd = 4
-	LoadCmdUnixThread LoadCmd = 5 // thread+stack
-	LoadCmdDysymtab   LoadCmd = 11
-	LoadCmdDylib      LoadCmd = 12
-	LoadCmdDylinker   LoadCmd = 15
-	LoadCmdSegment64  LoadCmd = 25
-)
-
-var cmdStrings = []intName{
-	{uint32(LoadCmdSegment), "LoadCmdSegment"},
-	{uint32(LoadCmdThread), "LoadCmdThread"},
-	{uint32(LoadCmdUnixThread), "LoadCmdUnixThread"},
-	{uint32(LoadCmdDylib), "LoadCmdDylib"},
-	{uint32(LoadCmdSegment64), "LoadCmdSegment64"},
-}
-
-func (i LoadCmd) String() string   { return stringName(uint32(i), cmdStrings, false) }
-func (i LoadCmd) GoString() string { return stringName(uint32(i), cmdStrings, true) }
-
-// A Segment64 is a 64-bit Mach-O segment load command.
-type Segment64 struct {
-	Cmd     LoadCmd
-	Len     uint32
-	Name    [16]byte
-	Addr    uint64
-	Memsz   uint64
-	Offset  uint64
-	Filesz  uint64
-	Maxprot uint32
-	Prot    uint32
-	Nsect   uint32
-	Flag    uint32
-}
-
-// A Segment32 is a 32-bit Mach-O segment load command.
-type Segment32 struct {
-	Cmd     LoadCmd
-	Len     uint32
-	Name    [16]byte
-	Addr    uint32
-	Memsz   uint32
-	Offset  uint32
-	Filesz  uint32
-	Maxprot uint32
-	Prot    uint32
-	Nsect   uint32
-	Flag    uint32
-}
-
-// A DylibCmd is a Mach-O load dynamic library command.
-type DylibCmd struct {
-	Cmd            LoadCmd
-	Len            uint32
-	Name           uint32
-	Time           uint32
-	CurrentVersion uint32
-	CompatVersion  uint32
-}
-
-// A Section32 is a 32-bit Mach-O section header.
-type Section32 struct {
-	Name     [16]byte
-	Seg      [16]byte
-	Addr     uint32
-	Size     uint32
-	Offset   uint32
-	Align    uint32
-	Reloff   uint32
-	Nreloc   uint32
-	Flags    uint32
-	Reserve1 uint32
-	Reserve2 uint32
-}
-
-// A Section32 is a 64-bit Mach-O section header.
-type Section64 struct {
-	Name     [16]byte
-	Seg      [16]byte
-	Addr     uint64
-	Size     uint64
-	Offset   uint32
-	Align    uint32
-	Reloff   uint32
-	Nreloc   uint32
-	Flags    uint32
-	Reserve1 uint32
-	Reserve2 uint32
-	Reserve3 uint32
-}
-
-// A SymtabCmd is a Mach-O symbol table command.
-type SymtabCmd struct {
-	Cmd     LoadCmd
-	Len     uint32
-	Symoff  uint32
-	Nsyms   uint32
-	Stroff  uint32
-	Strsize uint32
-}
-
-// A DysymtabCmd is a Mach-O dynamic symbol table command.
-type DysymtabCmd struct {
-	Cmd            LoadCmd
-	Len            uint32
-	Ilocalsym      uint32
-	Nlocalsym      uint32
-	Iextdefsym     uint32
-	Nextdefsym     uint32
-	Iundefsym      uint32
-	Nundefsym      uint32
-	Tocoffset      uint32
-	Ntoc           uint32
-	Modtaboff      uint32
-	Nmodtab        uint32
-	Extrefsymoff   uint32
-	Nextrefsyms    uint32
-	Indirectsymoff uint32
-	Nindirectsyms  uint32
-	Extreloff      uint32
-	Nextrel        uint32
-	Locreloff      uint32
-	Nlocrel        uint32
-}
-
-// An Nlist32 is a Mach-O 32-bit symbol table entry.
-type Nlist32 struct {
-	Name  uint32
-	Type  uint8
-	Sect  uint8
-	Desc  uint16
-	Value uint32
-}
-
-// An Nlist64 is a Mach-O 64-bit symbol table entry.
-type Nlist64 struct {
-	Name  uint32
-	Type  uint8
-	Sect  uint8
-	Desc  uint16
-	Value uint64
-}
-
-// A Symbol is a Mach-O 32-bit or 64-bit symbol table entry.
-type Symbol struct {
-	Name  string
-	Type  uint8
-	Sect  uint8
-	Desc  uint16
-	Value uint64
-}
-
-// A Thread is a Mach-O thread state command.
-type Thread struct {
-	Cmd  LoadCmd
-	Len  uint32
-	Type uint32
-	Data []uint32
-}
-
-// Regs386 is the Mach-O 386 register structure.
-type Regs386 struct {
-	AX    uint32
-	BX    uint32
-	CX    uint32
-	DX    uint32
-	DI    uint32
-	SI    uint32
-	BP    uint32
-	SP    uint32
-	SS    uint32
-	FLAGS uint32
-	IP    uint32
-	CS    uint32
-	DS    uint32
-	ES    uint32
-	FS    uint32
-	GS    uint32
-}
-
-// RegsAMD64 is the Mach-O AMD64 register structure.
-type RegsAMD64 struct {
-	AX    uint64
-	BX    uint64
-	CX    uint64
-	DX    uint64
-	DI    uint64
-	SI    uint64
-	BP    uint64
-	SP    uint64
-	R8    uint64
-	R9    uint64
-	R10   uint64
-	R11   uint64
-	R12   uint64
-	R13   uint64
-	R14   uint64
-	R15   uint64
-	IP    uint64
-	FLAGS uint64
-	CS    uint64
-	FS    uint64
-	GS    uint64
-}
-
-type intName struct {
-	i uint32
-	s string
-}
-
-func stringName(i uint32, names []intName, goSyntax bool) string {
-	for _, n := range names {
-		if n.i == i {
-			if goSyntax {
-				return "macho." + n.s
-			}
-			return n.s
-		}
-	}
-	return strconv.FormatUint(uint64(i), 10)
-}
-
-func flagName(i uint32, names []intName, goSyntax bool) string {
-	s := ""
-	for _, n := range names {
-		if n.i&i == n.i {
-			if len(s) > 0 {
-				s += "+"
-			}
-			if goSyntax {
-				s += "macho."
-			}
-			s += n.s
-			i -= n.i
-		}
-	}
-	if len(s) == 0 {
-		return "0x" + strconv.FormatUint(uint64(i), 16)
-	}
-	if i != 0 {
-		s += "+0x" + strconv.FormatUint(uint64(i), 16)
-	}
-	return s
-}
diff --git a/third_party/gofrontend/libgo/go/debug/macho/testdata/fat-gcc-386-amd64-darwin-exec b/third_party/gofrontend/libgo/go/debug/macho/testdata/fat-gcc-386-amd64-darwin-exec
deleted file mode 100644
index 7efd193..0000000
--- a/third_party/gofrontend/libgo/go/debug/macho/testdata/fat-gcc-386-amd64-darwin-exec
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/macho/testdata/gcc-386-darwin-exec b/third_party/gofrontend/libgo/go/debug/macho/testdata/gcc-386-darwin-exec
deleted file mode 100755
index 03ba1ba..0000000
--- a/third_party/gofrontend/libgo/go/debug/macho/testdata/gcc-386-darwin-exec
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/macho/testdata/gcc-amd64-darwin-exec b/third_party/gofrontend/libgo/go/debug/macho/testdata/gcc-amd64-darwin-exec
deleted file mode 100755
index 5155a5a..0000000
--- a/third_party/gofrontend/libgo/go/debug/macho/testdata/gcc-amd64-darwin-exec
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/macho/testdata/gcc-amd64-darwin-exec-debug b/third_party/gofrontend/libgo/go/debug/macho/testdata/gcc-amd64-darwin-exec-debug
deleted file mode 100644
index a47d3ae..0000000
--- a/third_party/gofrontend/libgo/go/debug/macho/testdata/gcc-amd64-darwin-exec-debug
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/macho/testdata/hello.c b/third_party/gofrontend/libgo/go/debug/macho/testdata/hello.c
deleted file mode 100644
index a689d36..0000000
--- a/third_party/gofrontend/libgo/go/debug/macho/testdata/hello.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int
-main(void)
-{
-	printf("hello, world\n");
-	return 0;
-}
diff --git a/third_party/gofrontend/libgo/go/debug/pe/file.go b/third_party/gofrontend/libgo/go/debug/pe/file.go
deleted file mode 100644
index 3df4ae7..0000000
--- a/third_party/gofrontend/libgo/go/debug/pe/file.go
+++ /dev/null
@@ -1,397 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package pe implements access to PE (Microsoft Windows Portable Executable) files.
-package pe
-
-import (
-	"debug/dwarf"
-	"encoding/binary"
-	"errors"
-	"fmt"
-	"io"
-	"os"
-	"strconv"
-)
-
-// A File represents an open PE file.
-type File struct {
-	FileHeader
-	OptionalHeader interface{} // of type *OptionalHeader32 or *OptionalHeader64
-	Sections       []*Section
-	Symbols        []*Symbol
-
-	closer io.Closer
-}
-
-type SectionHeader struct {
-	Name                 string
-	VirtualSize          uint32
-	VirtualAddress       uint32
-	Size                 uint32
-	Offset               uint32
-	PointerToRelocations uint32
-	PointerToLineNumbers uint32
-	NumberOfRelocations  uint16
-	NumberOfLineNumbers  uint16
-	Characteristics      uint32
-}
-
-type Section struct {
-	SectionHeader
-
-	// Embed ReaderAt for ReadAt method.
-	// Do not embed SectionReader directly
-	// to avoid having Read and Seek.
-	// If a client wants Read and Seek it must use
-	// Open() to avoid fighting over the seek offset
-	// with other clients.
-	io.ReaderAt
-	sr *io.SectionReader
-}
-
-type Symbol struct {
-	Name          string
-	Value         uint32
-	SectionNumber int16
-	Type          uint16
-	StorageClass  uint8
-}
-
-type ImportDirectory struct {
-	OriginalFirstThunk uint32
-	TimeDateStamp      uint32
-	ForwarderChain     uint32
-	Name               uint32
-	FirstThunk         uint32
-
-	dll string
-}
-
-// Data reads and returns the contents of the PE section.
-func (s *Section) Data() ([]byte, error) {
-	dat := make([]byte, s.sr.Size())
-	n, err := s.sr.ReadAt(dat, 0)
-	if n == len(dat) {
-		err = nil
-	}
-	return dat[0:n], err
-}
-
-// Open returns a new ReadSeeker reading the PE section.
-func (s *Section) Open() io.ReadSeeker { return io.NewSectionReader(s.sr, 0, 1<<63-1) }
-
-type FormatError struct {
-	off int64
-	msg string
-	val interface{}
-}
-
-func (e *FormatError) Error() string {
-	msg := e.msg
-	if e.val != nil {
-		msg += fmt.Sprintf(" '%v'", e.val)
-	}
-	msg += fmt.Sprintf(" in record at byte %#x", e.off)
-	return msg
-}
-
-// Open opens the named file using os.Open and prepares it for use as a PE binary.
-func Open(name string) (*File, error) {
-	f, err := os.Open(name)
-	if err != nil {
-		return nil, err
-	}
-	ff, err := NewFile(f)
-	if err != nil {
-		f.Close()
-		return nil, err
-	}
-	ff.closer = f
-	return ff, nil
-}
-
-// Close closes the File.
-// If the File was created using NewFile directly instead of Open,
-// Close has no effect.
-func (f *File) Close() error {
-	var err error
-	if f.closer != nil {
-		err = f.closer.Close()
-		f.closer = nil
-	}
-	return err
-}
-
-var (
-	sizeofOptionalHeader32 = uint16(binary.Size(OptionalHeader32{}))
-	sizeofOptionalHeader64 = uint16(binary.Size(OptionalHeader64{}))
-)
-
-// NewFile creates a new File for accessing a PE binary in an underlying reader.
-func NewFile(r io.ReaderAt) (*File, error) {
-	f := new(File)
-	sr := io.NewSectionReader(r, 0, 1<<63-1)
-
-	var dosheader [96]byte
-	if _, err := r.ReadAt(dosheader[0:], 0); err != nil {
-		return nil, err
-	}
-	var base int64
-	if dosheader[0] == 'M' && dosheader[1] == 'Z' {
-		signoff := int64(binary.LittleEndian.Uint32(dosheader[0x3c:]))
-		var sign [4]byte
-		r.ReadAt(sign[:], signoff)
-		if !(sign[0] == 'P' && sign[1] == 'E' && sign[2] == 0 && sign[3] == 0) {
-			return nil, errors.New("Invalid PE File Format.")
-		}
-		base = signoff + 4
-	} else {
-		base = int64(0)
-	}
-	sr.Seek(base, os.SEEK_SET)
-	if err := binary.Read(sr, binary.LittleEndian, &f.FileHeader); err != nil {
-		return nil, err
-	}
-	if f.FileHeader.Machine != IMAGE_FILE_MACHINE_UNKNOWN && f.FileHeader.Machine != IMAGE_FILE_MACHINE_AMD64 && f.FileHeader.Machine != IMAGE_FILE_MACHINE_I386 {
-		return nil, errors.New("Invalid PE File Format.")
-	}
-
-	var ss []byte
-	if f.FileHeader.NumberOfSymbols > 0 {
-		// Get COFF string table, which is located at the end of the COFF symbol table.
-		sr.Seek(int64(f.FileHeader.PointerToSymbolTable+COFFSymbolSize*f.FileHeader.NumberOfSymbols), os.SEEK_SET)
-		var l uint32
-		if err := binary.Read(sr, binary.LittleEndian, &l); err != nil {
-			return nil, err
-		}
-		ss = make([]byte, l)
-		if _, err := r.ReadAt(ss, int64(f.FileHeader.PointerToSymbolTable+COFFSymbolSize*f.FileHeader.NumberOfSymbols)); err != nil {
-			return nil, err
-		}
-
-		// Process COFF symbol table.
-		sr.Seek(int64(f.FileHeader.PointerToSymbolTable), os.SEEK_SET)
-		aux := uint8(0)
-		for i := 0; i < int(f.FileHeader.NumberOfSymbols); i++ {
-			cs := new(COFFSymbol)
-			if err := binary.Read(sr, binary.LittleEndian, cs); err != nil {
-				return nil, err
-			}
-			if aux > 0 {
-				aux--
-				continue
-			}
-			var name string
-			if cs.Name[0] == 0 && cs.Name[1] == 0 && cs.Name[2] == 0 && cs.Name[3] == 0 {
-				si := int(binary.LittleEndian.Uint32(cs.Name[4:]))
-				name, _ = getString(ss, si)
-			} else {
-				name = cstring(cs.Name[:])
-			}
-			aux = cs.NumberOfAuxSymbols
-			s := &Symbol{
-				Name:          name,
-				Value:         cs.Value,
-				SectionNumber: cs.SectionNumber,
-				Type:          cs.Type,
-				StorageClass:  cs.StorageClass,
-			}
-			f.Symbols = append(f.Symbols, s)
-		}
-	}
-
-	// Read optional header.
-	sr.Seek(base, os.SEEK_SET)
-	if err := binary.Read(sr, binary.LittleEndian, &f.FileHeader); err != nil {
-		return nil, err
-	}
-	var oh32 OptionalHeader32
-	var oh64 OptionalHeader64
-	switch f.FileHeader.SizeOfOptionalHeader {
-	case sizeofOptionalHeader32:
-		if err := binary.Read(sr, binary.LittleEndian, &oh32); err != nil {
-			return nil, err
-		}
-		if oh32.Magic != 0x10b { // PE32
-			return nil, fmt.Errorf("pe32 optional header has unexpected Magic of 0x%x", oh32.Magic)
-		}
-		f.OptionalHeader = &oh32
-	case sizeofOptionalHeader64:
-		if err := binary.Read(sr, binary.LittleEndian, &oh64); err != nil {
-			return nil, err
-		}
-		if oh64.Magic != 0x20b { // PE32+
-			return nil, fmt.Errorf("pe32+ optional header has unexpected Magic of 0x%x", oh64.Magic)
-		}
-		f.OptionalHeader = &oh64
-	}
-
-	// Process sections.
-	f.Sections = make([]*Section, f.FileHeader.NumberOfSections)
-	for i := 0; i < int(f.FileHeader.NumberOfSections); i++ {
-		sh := new(SectionHeader32)
-		if err := binary.Read(sr, binary.LittleEndian, sh); err != nil {
-			return nil, err
-		}
-		var name string
-		if sh.Name[0] == '\x2F' {
-			si, _ := strconv.Atoi(cstring(sh.Name[1:]))
-			name, _ = getString(ss, si)
-		} else {
-			name = cstring(sh.Name[0:])
-		}
-		s := new(Section)
-		s.SectionHeader = SectionHeader{
-			Name:                 name,
-			VirtualSize:          sh.VirtualSize,
-			VirtualAddress:       sh.VirtualAddress,
-			Size:                 sh.SizeOfRawData,
-			Offset:               sh.PointerToRawData,
-			PointerToRelocations: sh.PointerToRelocations,
-			PointerToLineNumbers: sh.PointerToLineNumbers,
-			NumberOfRelocations:  sh.NumberOfRelocations,
-			NumberOfLineNumbers:  sh.NumberOfLineNumbers,
-			Characteristics:      sh.Characteristics,
-		}
-		s.sr = io.NewSectionReader(r, int64(s.SectionHeader.Offset), int64(s.SectionHeader.Size))
-		s.ReaderAt = s.sr
-		f.Sections[i] = s
-	}
-	return f, nil
-}
-
-func cstring(b []byte) string {
-	var i int
-	for i = 0; i < len(b) && b[i] != 0; i++ {
-	}
-	return string(b[0:i])
-}
-
-// getString extracts a string from symbol string table.
-func getString(section []byte, start int) (string, bool) {
-	if start < 0 || start >= len(section) {
-		return "", false
-	}
-
-	for end := start; end < len(section); end++ {
-		if section[end] == 0 {
-			return string(section[start:end]), true
-		}
-	}
-	return "", false
-}
-
-// Section returns the first section with the given name, or nil if no such
-// section exists.
-func (f *File) Section(name string) *Section {
-	for _, s := range f.Sections {
-		if s.Name == name {
-			return s
-		}
-	}
-	return nil
-}
-
-func (f *File) DWARF() (*dwarf.Data, error) {
-	// There are many other DWARF sections, but these
-	// are the ones the debug/dwarf package uses.
-	// Don't bother loading others.
-	var names = [...]string{"abbrev", "info", "line", "str"}
-	var dat [len(names)][]byte
-	for i, name := range names {
-		name = ".debug_" + name
-		s := f.Section(name)
-		if s == nil {
-			continue
-		}
-		b, err := s.Data()
-		if err != nil && uint32(len(b)) < s.Size {
-			return nil, err
-		}
-		if 0 < s.VirtualSize && s.VirtualSize < s.Size {
-			b = b[:s.VirtualSize]
-		}
-		dat[i] = b
-	}
-
-	abbrev, info, line, str := dat[0], dat[1], dat[2], dat[3]
-	return dwarf.New(abbrev, nil, nil, info, line, nil, nil, str)
-}
-
-// ImportedSymbols returns the names of all symbols
-// referred to by the binary f that are expected to be
-// satisfied by other libraries at dynamic load time.
-// It does not return weak symbols.
-func (f *File) ImportedSymbols() ([]string, error) {
-	pe64 := f.Machine == IMAGE_FILE_MACHINE_AMD64
-	ds := f.Section(".idata")
-	if ds == nil {
-		// not dynamic, so no libraries
-		return nil, nil
-	}
-	d, err := ds.Data()
-	if err != nil {
-		return nil, err
-	}
-	var ida []ImportDirectory
-	for len(d) > 0 {
-		var dt ImportDirectory
-		dt.OriginalFirstThunk = binary.LittleEndian.Uint32(d[0:4])
-		dt.Name = binary.LittleEndian.Uint32(d[12:16])
-		dt.FirstThunk = binary.LittleEndian.Uint32(d[16:20])
-		d = d[20:]
-		if dt.OriginalFirstThunk == 0 {
-			break
-		}
-		ida = append(ida, dt)
-	}
-	names, _ := ds.Data()
-	var all []string
-	for _, dt := range ida {
-		dt.dll, _ = getString(names, int(dt.Name-ds.VirtualAddress))
-		d, _ = ds.Data()
-		// seek to OriginalFirstThunk
-		d = d[dt.OriginalFirstThunk-ds.VirtualAddress:]
-		for len(d) > 0 {
-			if pe64 { // 64bit
-				va := binary.LittleEndian.Uint64(d[0:8])
-				d = d[8:]
-				if va == 0 {
-					break
-				}
-				if va&0x8000000000000000 > 0 { // is Ordinal
-					// TODO add dynimport ordinal support.
-				} else {
-					fn, _ := getString(names, int(uint32(va)-ds.VirtualAddress+2))
-					all = append(all, fn+":"+dt.dll)
-				}
-			} else { // 32bit
-				va := binary.LittleEndian.Uint32(d[0:4])
-				d = d[4:]
-				if va == 0 {
-					break
-				}
-				if va&0x80000000 > 0 { // is Ordinal
-					// TODO add dynimport ordinal support.
-					//ord := va&0x0000FFFF
-				} else {
-					fn, _ := getString(names, int(va-ds.VirtualAddress+2))
-					all = append(all, fn+":"+dt.dll)
-				}
-			}
-		}
-	}
-
-	return all, nil
-}
-
-// ImportedLibraries returns the names of all libraries
-// referred to by the binary f that are expected to be
-// linked with the binary at dynamic link time.
-func (f *File) ImportedLibraries() ([]string, error) {
-	// TODO
-	// cgo -dynimport don't use this for windows PE, so just return.
-	return nil, nil
-}
diff --git a/third_party/gofrontend/libgo/go/debug/pe/file_test.go b/third_party/gofrontend/libgo/go/debug/pe/file_test.go
deleted file mode 100644
index 316a569..0000000
--- a/third_party/gofrontend/libgo/go/debug/pe/file_test.go
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pe
-
-import (
-	"debug/dwarf"
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"reflect"
-	"runtime"
-	"testing"
-)
-
-type fileTest struct {
-	file           string
-	hdr            FileHeader
-	opthdr         interface{}
-	sections       []*SectionHeader
-	symbols        []*Symbol
-	hasNoDwarfInfo bool
-}
-
-var fileTests = []fileTest{
-	{
-		file: "testdata/gcc-386-mingw-obj",
-		hdr:  FileHeader{0x014c, 0x000c, 0x0, 0x64a, 0x1e, 0x0, 0x104},
-		sections: []*SectionHeader{
-			{".text", 0, 0, 36, 500, 1440, 0, 3, 0, 0x60300020},
-			{".data", 0, 0, 0, 0, 0, 0, 0, 0, 3224371264},
-			{".bss", 0, 0, 0, 0, 0, 0, 0, 0, 3224371328},
-			{".debug_abbrev", 0, 0, 137, 536, 0, 0, 0, 0, 0x42100000},
-			{".debug_info", 0, 0, 418, 673, 1470, 0, 7, 0, 1108344832},
-			{".debug_line", 0, 0, 128, 1091, 1540, 0, 1, 0, 1108344832},
-			{".rdata", 0, 0, 16, 1219, 0, 0, 0, 0, 1076887616},
-			{".debug_frame", 0, 0, 52, 1235, 1550, 0, 2, 0, 1110441984},
-			{".debug_loc", 0, 0, 56, 1287, 0, 0, 0, 0, 1108344832},
-			{".debug_pubnames", 0, 0, 27, 1343, 1570, 0, 1, 0, 1108344832},
-			{".debug_pubtypes", 0, 0, 38, 1370, 1580, 0, 1, 0, 1108344832},
-			{".debug_aranges", 0, 0, 32, 1408, 1590, 0, 2, 0, 1108344832},
-		},
-		symbols: []*Symbol{
-			{".file", 0x0, -2, 0x0, 0x67},
-			{"_main", 0x0, 1, 0x20, 0x2},
-			{".text", 0x0, 1, 0x0, 0x3},
-			{".data", 0x0, 2, 0x0, 0x3},
-			{".bss", 0x0, 3, 0x0, 0x3},
-			{".debug_abbrev", 0x0, 4, 0x0, 0x3},
-			{".debug_info", 0x0, 5, 0x0, 0x3},
-			{".debug_line", 0x0, 6, 0x0, 0x3},
-			{".rdata", 0x0, 7, 0x0, 0x3},
-			{".debug_frame", 0x0, 8, 0x0, 0x3},
-			{".debug_loc", 0x0, 9, 0x0, 0x3},
-			{".debug_pubnames", 0x0, 10, 0x0, 0x3},
-			{".debug_pubtypes", 0x0, 11, 0x0, 0x3},
-			{".debug_aranges", 0x0, 12, 0x0, 0x3},
-			{"___main", 0x0, 0, 0x20, 0x2},
-			{"_puts", 0x0, 0, 0x20, 0x2},
-		},
-	},
-	{
-		file: "testdata/gcc-386-mingw-exec",
-		hdr:  FileHeader{0x014c, 0x000f, 0x4c6a1b60, 0x3c00, 0x282, 0xe0, 0x107},
-		opthdr: &OptionalHeader32{
-			0x10b, 0x2, 0x38, 0xe00, 0x1a00, 0x200, 0x1160, 0x1000, 0x2000, 0x400000, 0x1000, 0x200, 0x4, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x10000, 0x400, 0x14abb, 0x3, 0x0, 0x200000, 0x1000, 0x100000, 0x1000, 0x0, 0x10,
-			[16]DataDirectory{
-				{0x0, 0x0},
-				{0x5000, 0x3c8},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x7000, 0x18},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x0, 0x0},
-			},
-		},
-		sections: []*SectionHeader{
-			{".text", 0xcd8, 0x1000, 0xe00, 0x400, 0x0, 0x0, 0x0, 0x0, 0x60500060},
-			{".data", 0x10, 0x2000, 0x200, 0x1200, 0x0, 0x0, 0x0, 0x0, 0xc0300040},
-			{".rdata", 0x120, 0x3000, 0x200, 0x1400, 0x0, 0x0, 0x0, 0x0, 0x40300040},
-			{".bss", 0xdc, 0x4000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0400080},
-			{".idata", 0x3c8, 0x5000, 0x400, 0x1600, 0x0, 0x0, 0x0, 0x0, 0xc0300040},
-			{".CRT", 0x18, 0x6000, 0x200, 0x1a00, 0x0, 0x0, 0x0, 0x0, 0xc0300040},
-			{".tls", 0x20, 0x7000, 0x200, 0x1c00, 0x0, 0x0, 0x0, 0x0, 0xc0300040},
-			{".debug_aranges", 0x20, 0x8000, 0x200, 0x1e00, 0x0, 0x0, 0x0, 0x0, 0x42100000},
-			{".debug_pubnames", 0x51, 0x9000, 0x200, 0x2000, 0x0, 0x0, 0x0, 0x0, 0x42100000},
-			{".debug_pubtypes", 0x91, 0xa000, 0x200, 0x2200, 0x0, 0x0, 0x0, 0x0, 0x42100000},
-			{".debug_info", 0xe22, 0xb000, 0x1000, 0x2400, 0x0, 0x0, 0x0, 0x0, 0x42100000},
-			{".debug_abbrev", 0x157, 0xc000, 0x200, 0x3400, 0x0, 0x0, 0x0, 0x0, 0x42100000},
-			{".debug_line", 0x144, 0xd000, 0x200, 0x3600, 0x0, 0x0, 0x0, 0x0, 0x42100000},
-			{".debug_frame", 0x34, 0xe000, 0x200, 0x3800, 0x0, 0x0, 0x0, 0x0, 0x42300000},
-			{".debug_loc", 0x38, 0xf000, 0x200, 0x3a00, 0x0, 0x0, 0x0, 0x0, 0x42100000},
-		},
-	},
-	{
-		file: "testdata/gcc-amd64-mingw-obj",
-		hdr:  FileHeader{0x8664, 0x6, 0x0, 0x198, 0x12, 0x0, 0x4},
-		sections: []*SectionHeader{
-			{".text", 0x0, 0x0, 0x30, 0x104, 0x15c, 0x0, 0x3, 0x0, 0x60500020},
-			{".data", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0500040},
-			{".bss", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0500080},
-			{".rdata", 0x0, 0x0, 0x10, 0x134, 0x0, 0x0, 0x0, 0x0, 0x40500040},
-			{".xdata", 0x0, 0x0, 0xc, 0x144, 0x0, 0x0, 0x0, 0x0, 0x40300040},
-			{".pdata", 0x0, 0x0, 0xc, 0x150, 0x17a, 0x0, 0x3, 0x0, 0x40300040},
-		},
-		symbols: []*Symbol{
-			{".file", 0x0, -2, 0x0, 0x67},
-			{"main", 0x0, 1, 0x20, 0x2},
-			{".text", 0x0, 1, 0x0, 0x3},
-			{".data", 0x0, 2, 0x0, 0x3},
-			{".bss", 0x0, 3, 0x0, 0x3},
-			{".rdata", 0x0, 4, 0x0, 0x3},
-			{".xdata", 0x0, 5, 0x0, 0x3},
-			{".pdata", 0x0, 6, 0x0, 0x3},
-			{"__main", 0x0, 0, 0x20, 0x2},
-			{"puts", 0x0, 0, 0x20, 0x2},
-		},
-		hasNoDwarfInfo: true,
-	},
-	{
-		file: "testdata/gcc-amd64-mingw-exec",
-		hdr:  FileHeader{0x8664, 0x11, 0x53e4364f, 0x39600, 0x6fc, 0xf0, 0x27},
-		opthdr: &OptionalHeader64{
-			0x20b, 0x2, 0x16, 0x6a00, 0x2400, 0x1600, 0x14e0, 0x1000, 0x400000, 0x1000, 0x200, 0x4, 0x0, 0x0, 0x0, 0x5, 0x2, 0x0, 0x45000, 0x600, 0x46f19, 0x3, 0x0, 0x200000, 0x1000, 0x100000, 0x1000, 0x0, 0x10,
-			[16]DataDirectory{
-				{0x0, 0x0},
-				{0xe000, 0x990},
-				{0x0, 0x0},
-				{0xa000, 0x498},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x10000, 0x28},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0xe254, 0x218},
-				{0x0, 0x0},
-				{0x0, 0x0},
-				{0x0, 0x0},
-			}},
-		sections: []*SectionHeader{
-			{".text", 0x6860, 0x1000, 0x6a00, 0x600, 0x0, 0x0, 0x0, 0x0, 0x60500020},
-			{".data", 0xe0, 0x8000, 0x200, 0x7000, 0x0, 0x0, 0x0, 0x0, 0xc0500040},
-			{".rdata", 0x6b0, 0x9000, 0x800, 0x7200, 0x0, 0x0, 0x0, 0x0, 0x40600040},
-			{".pdata", 0x498, 0xa000, 0x600, 0x7a00, 0x0, 0x0, 0x0, 0x0, 0x40300040},
-			{".xdata", 0x488, 0xb000, 0x600, 0x8000, 0x0, 0x0, 0x0, 0x0, 0x40300040},
-			{".bss", 0x1410, 0xc000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0600080},
-			{".idata", 0x990, 0xe000, 0xa00, 0x8600, 0x0, 0x0, 0x0, 0x0, 0xc0300040},
-			{".CRT", 0x68, 0xf000, 0x200, 0x9000, 0x0, 0x0, 0x0, 0x0, 0xc0400040},
-			{".tls", 0x48, 0x10000, 0x200, 0x9200, 0x0, 0x0, 0x0, 0x0, 0xc0600040},
-			{".debug_aranges", 0x600, 0x11000, 0x600, 0x9400, 0x0, 0x0, 0x0, 0x0, 0x42500040},
-			{".debug_info", 0x1316e, 0x12000, 0x13200, 0x9a00, 0x0, 0x0, 0x0, 0x0, 0x42100040},
-			{".debug_abbrev", 0x2ccb, 0x26000, 0x2e00, 0x1cc00, 0x0, 0x0, 0x0, 0x0, 0x42100040},
-			{".debug_line", 0x3c4d, 0x29000, 0x3e00, 0x1fa00, 0x0, 0x0, 0x0, 0x0, 0x42100040},
-			{".debug_frame", 0x18b8, 0x2d000, 0x1a00, 0x23800, 0x0, 0x0, 0x0, 0x0, 0x42400040},
-			{".debug_str", 0x396, 0x2f000, 0x400, 0x25200, 0x0, 0x0, 0x0, 0x0, 0x42100040},
-			{".debug_loc", 0x13240, 0x30000, 0x13400, 0x25600, 0x0, 0x0, 0x0, 0x0, 0x42100040},
-			{".debug_ranges", 0xa70, 0x44000, 0xc00, 0x38a00, 0x0, 0x0, 0x0, 0x0, 0x42100040},
-		},
-	},
-}
-
-func isOptHdrEq(a, b interface{}) bool {
-	switch va := a.(type) {
-	case *OptionalHeader32:
-		vb, ok := b.(*OptionalHeader32)
-		if !ok {
-			return false
-		}
-		return *vb == *va
-	case *OptionalHeader64:
-		vb, ok := b.(*OptionalHeader64)
-		if !ok {
-			return false
-		}
-		return *vb == *va
-	case nil:
-		return b == nil
-	}
-	return false
-}
-
-func TestOpen(t *testing.T) {
-	for i := range fileTests {
-		tt := &fileTests[i]
-
-		f, err := Open(tt.file)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-		if !reflect.DeepEqual(f.FileHeader, tt.hdr) {
-			t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.FileHeader, tt.hdr)
-			continue
-		}
-		if !isOptHdrEq(tt.opthdr, f.OptionalHeader) {
-			t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.OptionalHeader, tt.opthdr)
-			continue
-		}
-
-		for i, sh := range f.Sections {
-			if i >= len(tt.sections) {
-				break
-			}
-			have := &sh.SectionHeader
-			want := tt.sections[i]
-			if !reflect.DeepEqual(have, want) {
-				t.Errorf("open %s, section %d:\n\thave %#v\n\twant %#v\n", tt.file, i, have, want)
-			}
-		}
-		tn := len(tt.sections)
-		fn := len(f.Sections)
-		if tn != fn {
-			t.Errorf("open %s: len(Sections) = %d, want %d", tt.file, fn, tn)
-		}
-		for i, have := range f.Symbols {
-			if i >= len(tt.symbols) {
-				break
-			}
-			want := tt.symbols[i]
-			if !reflect.DeepEqual(have, want) {
-				t.Errorf("open %s, symbol %d:\n\thave %#v\n\twant %#v\n", tt.file, i, have, want)
-			}
-		}
-		if !tt.hasNoDwarfInfo {
-			_, err = f.DWARF()
-			if err != nil {
-				t.Errorf("fetching %s dwarf details failed: %v", tt.file, err)
-			}
-		}
-	}
-}
-
-func TestOpenFailure(t *testing.T) {
-	filename := "file.go"    // not a PE file
-	_, err := Open(filename) // don't crash
-	if err == nil {
-		t.Errorf("open %s: succeeded unexpectedly", filename)
-	}
-}
-
-func TestDWARF(t *testing.T) {
-	if runtime.GOOS != "windows" {
-		t.Skip("skipping windows only test")
-	}
-
-	tmpdir, err := ioutil.TempDir("", "TestDWARF")
-	if err != nil {
-		t.Fatal("TempDir failed: ", err)
-	}
-	defer os.RemoveAll(tmpdir)
-
-	prog := `
-package main
-func main() {
-}
-`
-	src := filepath.Join(tmpdir, "a.go")
-	exe := filepath.Join(tmpdir, "a.exe")
-	err = ioutil.WriteFile(src, []byte(prog), 0644)
-	output, err := exec.Command("go", "build", "-o", exe, src).CombinedOutput()
-	if err != nil {
-		t.Fatalf("building test executable failed: %s %s", err, output)
-	}
-
-	f, err := Open(exe)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer f.Close()
-
-	d, err := f.DWARF()
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// look for main.main
-	r := d.Reader()
-	for {
-		e, err := r.Next()
-		if err != nil {
-			t.Fatal("r.Next:", err)
-		}
-		if e == nil {
-			break
-		}
-		if e.Tag == dwarf.TagSubprogram {
-			for _, f := range e.Field {
-				if f.Attr == dwarf.AttrName && e.Val(dwarf.AttrName) == "main.main" {
-					return
-				}
-			}
-		}
-	}
-	t.Fatal("main.main not found")
-}
diff --git a/third_party/gofrontend/libgo/go/debug/pe/pe.go b/third_party/gofrontend/libgo/go/debug/pe/pe.go
deleted file mode 100644
index 8e90b1b..0000000
--- a/third_party/gofrontend/libgo/go/debug/pe/pe.go
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pe
-
-type FileHeader struct {
-	Machine              uint16
-	NumberOfSections     uint16
-	TimeDateStamp        uint32
-	PointerToSymbolTable uint32
-	NumberOfSymbols      uint32
-	SizeOfOptionalHeader uint16
-	Characteristics      uint16
-}
-
-type DataDirectory struct {
-	VirtualAddress uint32
-	Size           uint32
-}
-
-type OptionalHeader32 struct {
-	Magic                       uint16
-	MajorLinkerVersion          uint8
-	MinorLinkerVersion          uint8
-	SizeOfCode                  uint32
-	SizeOfInitializedData       uint32
-	SizeOfUninitializedData     uint32
-	AddressOfEntryPoint         uint32
-	BaseOfCode                  uint32
-	BaseOfData                  uint32
-	ImageBase                   uint32
-	SectionAlignment            uint32
-	FileAlignment               uint32
-	MajorOperatingSystemVersion uint16
-	MinorOperatingSystemVersion uint16
-	MajorImageVersion           uint16
-	MinorImageVersion           uint16
-	MajorSubsystemVersion       uint16
-	MinorSubsystemVersion       uint16
-	Win32VersionValue           uint32
-	SizeOfImage                 uint32
-	SizeOfHeaders               uint32
-	CheckSum                    uint32
-	Subsystem                   uint16
-	DllCharacteristics          uint16
-	SizeOfStackReserve          uint32
-	SizeOfStackCommit           uint32
-	SizeOfHeapReserve           uint32
-	SizeOfHeapCommit            uint32
-	LoaderFlags                 uint32
-	NumberOfRvaAndSizes         uint32
-	DataDirectory               [16]DataDirectory
-}
-
-type OptionalHeader64 struct {
-	Magic                       uint16
-	MajorLinkerVersion          uint8
-	MinorLinkerVersion          uint8
-	SizeOfCode                  uint32
-	SizeOfInitializedData       uint32
-	SizeOfUninitializedData     uint32
-	AddressOfEntryPoint         uint32
-	BaseOfCode                  uint32
-	ImageBase                   uint64
-	SectionAlignment            uint32
-	FileAlignment               uint32
-	MajorOperatingSystemVersion uint16
-	MinorOperatingSystemVersion uint16
-	MajorImageVersion           uint16
-	MinorImageVersion           uint16
-	MajorSubsystemVersion       uint16
-	MinorSubsystemVersion       uint16
-	Win32VersionValue           uint32
-	SizeOfImage                 uint32
-	SizeOfHeaders               uint32
-	CheckSum                    uint32
-	Subsystem                   uint16
-	DllCharacteristics          uint16
-	SizeOfStackReserve          uint64
-	SizeOfStackCommit           uint64
-	SizeOfHeapReserve           uint64
-	SizeOfHeapCommit            uint64
-	LoaderFlags                 uint32
-	NumberOfRvaAndSizes         uint32
-	DataDirectory               [16]DataDirectory
-}
-
-type SectionHeader32 struct {
-	Name                 [8]uint8
-	VirtualSize          uint32
-	VirtualAddress       uint32
-	SizeOfRawData        uint32
-	PointerToRawData     uint32
-	PointerToRelocations uint32
-	PointerToLineNumbers uint32
-	NumberOfRelocations  uint16
-	NumberOfLineNumbers  uint16
-	Characteristics      uint32
-}
-
-const COFFSymbolSize = 18
-
-type COFFSymbol struct {
-	Name               [8]uint8
-	Value              uint32
-	SectionNumber      int16
-	Type               uint16
-	StorageClass       uint8
-	NumberOfAuxSymbols uint8
-}
-
-const (
-	IMAGE_FILE_MACHINE_UNKNOWN   = 0x0
-	IMAGE_FILE_MACHINE_AM33      = 0x1d3
-	IMAGE_FILE_MACHINE_AMD64     = 0x8664
-	IMAGE_FILE_MACHINE_ARM       = 0x1c0
-	IMAGE_FILE_MACHINE_EBC       = 0xebc
-	IMAGE_FILE_MACHINE_I386      = 0x14c
-	IMAGE_FILE_MACHINE_IA64      = 0x200
-	IMAGE_FILE_MACHINE_M32R      = 0x9041
-	IMAGE_FILE_MACHINE_MIPS16    = 0x266
-	IMAGE_FILE_MACHINE_MIPSFPU   = 0x366
-	IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466
-	IMAGE_FILE_MACHINE_POWERPC   = 0x1f0
-	IMAGE_FILE_MACHINE_POWERPCFP = 0x1f1
-	IMAGE_FILE_MACHINE_R4000     = 0x166
-	IMAGE_FILE_MACHINE_SH3       = 0x1a2
-	IMAGE_FILE_MACHINE_SH3DSP    = 0x1a3
-	IMAGE_FILE_MACHINE_SH4       = 0x1a6
-	IMAGE_FILE_MACHINE_SH5       = 0x1a8
-	IMAGE_FILE_MACHINE_THUMB     = 0x1c2
-	IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169
-)
diff --git a/third_party/gofrontend/libgo/go/debug/pe/testdata/gcc-386-mingw-exec b/third_party/gofrontend/libgo/go/debug/pe/testdata/gcc-386-mingw-exec
deleted file mode 100644
index 4b808d0..0000000
--- a/third_party/gofrontend/libgo/go/debug/pe/testdata/gcc-386-mingw-exec
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/pe/testdata/gcc-386-mingw-obj b/third_party/gofrontend/libgo/go/debug/pe/testdata/gcc-386-mingw-obj
deleted file mode 100644
index 0c84d89..0000000
--- a/third_party/gofrontend/libgo/go/debug/pe/testdata/gcc-386-mingw-obj
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/pe/testdata/gcc-amd64-mingw-exec b/third_party/gofrontend/libgo/go/debug/pe/testdata/gcc-amd64-mingw-exec
deleted file mode 100644
index ce6feb6..0000000
--- a/third_party/gofrontend/libgo/go/debug/pe/testdata/gcc-amd64-mingw-exec
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/pe/testdata/gcc-amd64-mingw-obj b/third_party/gofrontend/libgo/go/debug/pe/testdata/gcc-amd64-mingw-obj
deleted file mode 100644
index 48ae792..0000000
--- a/third_party/gofrontend/libgo/go/debug/pe/testdata/gcc-amd64-mingw-obj
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/pe/testdata/hello.c b/third_party/gofrontend/libgo/go/debug/pe/testdata/hello.c
deleted file mode 100644
index a689d36..0000000
--- a/third_party/gofrontend/libgo/go/debug/pe/testdata/hello.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int
-main(void)
-{
-	printf("hello, world\n");
-	return 0;
-}
diff --git a/third_party/gofrontend/libgo/go/debug/plan9obj/file.go b/third_party/gofrontend/libgo/go/debug/plan9obj/file.go
deleted file mode 100644
index b11ed86..0000000
--- a/third_party/gofrontend/libgo/go/debug/plan9obj/file.go
+++ /dev/null
@@ -1,328 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package plan9obj implements access to Plan 9 a.out object files.
-package plan9obj
-
-import (
-	"encoding/binary"
-	"errors"
-	"fmt"
-	"io"
-	"os"
-)
-
-// A FileHeader represents a Plan 9 a.out file header.
-type FileHeader struct {
-	Magic       uint32
-	Bss         uint32
-	Entry       uint64
-	PtrSize     int
-	LoadAddress uint64
-	HdrSize     uint64
-}
-
-// A File represents an open Plan 9 a.out file.
-type File struct {
-	FileHeader
-	Sections []*Section
-	closer   io.Closer
-}
-
-// A SectionHeader represents a single Plan 9 a.out section header.
-// This structure doesn't exist on-disk, but eases navigation
-// through the object file.
-type SectionHeader struct {
-	Name   string
-	Size   uint32
-	Offset uint32
-}
-
-// A Section represents a single section in a Plan 9 a.out file.
-type Section struct {
-	SectionHeader
-
-	// Embed ReaderAt for ReadAt method.
-	// Do not embed SectionReader directly
-	// to avoid having Read and Seek.
-	// If a client wants Read and Seek it must use
-	// Open() to avoid fighting over the seek offset
-	// with other clients.
-	io.ReaderAt
-	sr *io.SectionReader
-}
-
-// Data reads and returns the contents of the Plan 9 a.out section.
-func (s *Section) Data() ([]byte, error) {
-	dat := make([]byte, s.sr.Size())
-	n, err := s.sr.ReadAt(dat, 0)
-	if n == len(dat) {
-		err = nil
-	}
-	return dat[0:n], err
-}
-
-// Open returns a new ReadSeeker reading the Plan 9 a.out section.
-func (s *Section) Open() io.ReadSeeker { return io.NewSectionReader(s.sr, 0, 1<<63-1) }
-
-// A Symbol represents an entry in a Plan 9 a.out symbol table section.
-type Sym struct {
-	Value uint64
-	Type  rune
-	Name  string
-}
-
-/*
- * Plan 9 a.out reader
- */
-
-// formatError is returned by some operations if the data does
-// not have the correct format for an object file.
-type formatError struct {
-	off int
-	msg string
-	val interface{}
-}
-
-func (e *formatError) Error() string {
-	msg := e.msg
-	if e.val != nil {
-		msg += fmt.Sprintf(" '%v'", e.val)
-	}
-	msg += fmt.Sprintf(" in record at byte %#x", e.off)
-	return msg
-}
-
-// Open opens the named file using os.Open and prepares it for use as a Plan 9 a.out binary.
-func Open(name string) (*File, error) {
-	f, err := os.Open(name)
-	if err != nil {
-		return nil, err
-	}
-	ff, err := NewFile(f)
-	if err != nil {
-		f.Close()
-		return nil, err
-	}
-	ff.closer = f
-	return ff, nil
-}
-
-// Close closes the File.
-// If the File was created using NewFile directly instead of Open,
-// Close has no effect.
-func (f *File) Close() error {
-	var err error
-	if f.closer != nil {
-		err = f.closer.Close()
-		f.closer = nil
-	}
-	return err
-}
-
-func parseMagic(magic []byte) (uint32, error) {
-	m := binary.BigEndian.Uint32(magic)
-	switch m {
-	case Magic386, MagicAMD64, MagicARM:
-		return m, nil
-	}
-	return 0, &formatError{0, "bad magic number", magic}
-}
-
-// NewFile creates a new File for accessing a Plan 9 binary in an underlying reader.
-// The Plan 9 binary is expected to start at position 0 in the ReaderAt.
-func NewFile(r io.ReaderAt) (*File, error) {
-	sr := io.NewSectionReader(r, 0, 1<<63-1)
-	// Read and decode Plan 9 magic
-	var magic [4]byte
-	if _, err := r.ReadAt(magic[:], 0); err != nil {
-		return nil, err
-	}
-	_, err := parseMagic(magic[:])
-	if err != nil {
-		return nil, err
-	}
-
-	ph := new(prog)
-	if err := binary.Read(sr, binary.BigEndian, ph); err != nil {
-		return nil, err
-	}
-
-	f := &File{FileHeader: FileHeader{
-		Magic:       ph.Magic,
-		Bss:         ph.Bss,
-		Entry:       uint64(ph.Entry),
-		PtrSize:     4,
-		LoadAddress: 0x1000,
-		HdrSize:     4 * 8,
-	}}
-
-	if ph.Magic&Magic64 != 0 {
-		if err := binary.Read(sr, binary.BigEndian, &f.Entry); err != nil {
-			return nil, err
-		}
-		f.PtrSize = 8
-		f.LoadAddress = 0x200000
-		f.HdrSize += 8
-	}
-
-	var sects = []struct {
-		name string
-		size uint32
-	}{
-		{"text", ph.Text},
-		{"data", ph.Data},
-		{"syms", ph.Syms},
-		{"spsz", ph.Spsz},
-		{"pcsz", ph.Pcsz},
-	}
-
-	f.Sections = make([]*Section, 5)
-
-	off := uint32(f.HdrSize)
-
-	for i, sect := range sects {
-		s := new(Section)
-		s.SectionHeader = SectionHeader{
-			Name:   sect.name,
-			Size:   sect.size,
-			Offset: off,
-		}
-		off += sect.size
-		s.sr = io.NewSectionReader(r, int64(s.Offset), int64(s.Size))
-		s.ReaderAt = s.sr
-		f.Sections[i] = s
-	}
-
-	return f, nil
-}
-
-func walksymtab(data []byte, ptrsz int, fn func(sym) error) error {
-	var order binary.ByteOrder = binary.BigEndian
-	var s sym
-	p := data
-	for len(p) >= 4 {
-		// Symbol type, value.
-		if len(p) < ptrsz {
-			return &formatError{len(data), "unexpected EOF", nil}
-		}
-		// fixed-width value
-		if ptrsz == 8 {
-			s.value = order.Uint64(p[0:8])
-			p = p[8:]
-		} else {
-			s.value = uint64(order.Uint32(p[0:4]))
-			p = p[4:]
-		}
-
-		var typ byte
-		typ = p[0] & 0x7F
-		s.typ = typ
-		p = p[1:]
-
-		// Name.
-		var i int
-		var nnul int
-		for i = 0; i < len(p); i++ {
-			if p[i] == 0 {
-				nnul = 1
-				break
-			}
-		}
-		switch typ {
-		case 'z', 'Z':
-			p = p[i+nnul:]
-			for i = 0; i+2 <= len(p); i += 2 {
-				if p[i] == 0 && p[i+1] == 0 {
-					nnul = 2
-					break
-				}
-			}
-		}
-		if len(p) < i+nnul {
-			return &formatError{len(data), "unexpected EOF", nil}
-		}
-		s.name = p[0:i]
-		i += nnul
-		p = p[i:]
-
-		fn(s)
-	}
-	return nil
-}
-
-// NewTable decodes the Go symbol table in data,
-// returning an in-memory representation.
-func newTable(symtab []byte, ptrsz int) ([]Sym, error) {
-	var n int
-	err := walksymtab(symtab, ptrsz, func(s sym) error {
-		n++
-		return nil
-	})
-	if err != nil {
-		return nil, err
-	}
-
-	fname := make(map[uint16]string)
-	syms := make([]Sym, 0, n)
-	err = walksymtab(symtab, ptrsz, func(s sym) error {
-		n := len(syms)
-		syms = syms[0 : n+1]
-		ts := &syms[n]
-		ts.Type = rune(s.typ)
-		ts.Value = s.value
-		switch s.typ {
-		default:
-			ts.Name = string(s.name[:])
-		case 'z', 'Z':
-			for i := 0; i < len(s.name); i += 2 {
-				eltIdx := binary.BigEndian.Uint16(s.name[i : i+2])
-				elt, ok := fname[eltIdx]
-				if !ok {
-					return &formatError{-1, "bad filename code", eltIdx}
-				}
-				if n := len(ts.Name); n > 0 && ts.Name[n-1] != '/' {
-					ts.Name += "/"
-				}
-				ts.Name += elt
-			}
-		}
-		switch s.typ {
-		case 'f':
-			fname[uint16(s.value)] = ts.Name
-		}
-		return nil
-	})
-	if err != nil {
-		return nil, err
-	}
-
-	return syms, nil
-}
-
-// Symbols returns the symbol table for f.
-func (f *File) Symbols() ([]Sym, error) {
-	symtabSection := f.Section("syms")
-	if symtabSection == nil {
-		return nil, errors.New("no symbol section")
-	}
-
-	symtab, err := symtabSection.Data()
-	if err != nil {
-		return nil, errors.New("cannot load symbol section")
-	}
-
-	return newTable(symtab, f.PtrSize)
-}
-
-// Section returns a section with the given name, or nil if no such
-// section exists.
-func (f *File) Section(name string) *Section {
-	for _, s := range f.Sections {
-		if s.Name == name {
-			return s
-		}
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/debug/plan9obj/file_test.go b/third_party/gofrontend/libgo/go/debug/plan9obj/file_test.go
deleted file mode 100644
index cfd7a61..0000000
--- a/third_party/gofrontend/libgo/go/debug/plan9obj/file_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package plan9obj
-
-import (
-	"reflect"
-	"testing"
-)
-
-type fileTest struct {
-	file     string
-	hdr      FileHeader
-	sections []*SectionHeader
-}
-
-var fileTests = []fileTest{
-	{
-		"testdata/386-plan9-exec",
-		FileHeader{Magic386, 0x324, 0x14, 4, 0x1000, 32},
-		[]*SectionHeader{
-			{"text", 0x4c5f, 0x20},
-			{"data", 0x94c, 0x4c7f},
-			{"syms", 0x2c2b, 0x55cb},
-			{"spsz", 0x0, 0x81f6},
-			{"pcsz", 0xf7a, 0x81f6},
-		},
-	},
-	{
-		"testdata/amd64-plan9-exec",
-		FileHeader{MagicAMD64, 0x618, 0x13, 8, 0x200000, 40},
-		[]*SectionHeader{
-			{"text", 0x4213, 0x28},
-			{"data", 0xa80, 0x423b},
-			{"syms", 0x2c8c, 0x4cbb},
-			{"spsz", 0x0, 0x7947},
-			{"pcsz", 0xca0, 0x7947},
-		},
-	},
-}
-
-func TestOpen(t *testing.T) {
-	for i := range fileTests {
-		tt := &fileTests[i]
-
-		f, err := Open(tt.file)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-		if !reflect.DeepEqual(f.FileHeader, tt.hdr) {
-			t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.FileHeader, tt.hdr)
-			continue
-		}
-
-		for i, sh := range f.Sections {
-			if i >= len(tt.sections) {
-				break
-			}
-			have := &sh.SectionHeader
-			want := tt.sections[i]
-			if !reflect.DeepEqual(have, want) {
-				t.Errorf("open %s, section %d:\n\thave %#v\n\twant %#v\n", tt.file, i, have, want)
-			}
-		}
-		tn := len(tt.sections)
-		fn := len(f.Sections)
-		if tn != fn {
-			t.Errorf("open %s: len(Sections) = %d, want %d", tt.file, fn, tn)
-		}
-	}
-}
-
-func TestOpenFailure(t *testing.T) {
-	filename := "file.go"    // not a Plan 9 a.out file
-	_, err := Open(filename) // don't crash
-	if err == nil {
-		t.Errorf("open %s: succeeded unexpectedly", filename)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/debug/plan9obj/plan9obj.go b/third_party/gofrontend/libgo/go/debug/plan9obj/plan9obj.go
deleted file mode 100644
index af98585..0000000
--- a/third_party/gofrontend/libgo/go/debug/plan9obj/plan9obj.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
- * Plan 9 a.out constants and data structures
- */
-
-package plan9obj
-
-// Plan 9 Program header.
-type prog struct {
-	Magic uint32 /* magic number */
-	Text  uint32 /* size of text segment */
-	Data  uint32 /* size of initialized data */
-	Bss   uint32 /* size of uninitialized data */
-	Syms  uint32 /* size of symbol table */
-	Entry uint32 /* entry point */
-	Spsz  uint32 /* size of pc/sp offset table */
-	Pcsz  uint32 /* size of pc/line number table */
-}
-
-// Plan 9 symbol table entries.
-type sym struct {
-	value uint64
-	typ   byte
-	name  []byte
-}
-
-const (
-	Magic64 = 0x8000 // 64-bit expanded header
-
-	Magic386   = (4*11+0)*11 + 7
-	MagicAMD64 = (4*26+0)*26 + 7 + Magic64
-	MagicARM   = (4*20+0)*20 + 7
-)
diff --git a/third_party/gofrontend/libgo/go/debug/plan9obj/testdata/386-plan9-exec b/third_party/gofrontend/libgo/go/debug/plan9obj/testdata/386-plan9-exec
deleted file mode 100644
index 748e83f..0000000
--- a/third_party/gofrontend/libgo/go/debug/plan9obj/testdata/386-plan9-exec
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/plan9obj/testdata/amd64-plan9-exec b/third_party/gofrontend/libgo/go/debug/plan9obj/testdata/amd64-plan9-exec
deleted file mode 100644
index 3e257dd..0000000
--- a/third_party/gofrontend/libgo/go/debug/plan9obj/testdata/amd64-plan9-exec
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/debug/plan9obj/testdata/hello.c b/third_party/gofrontend/libgo/go/debug/plan9obj/testdata/hello.c
deleted file mode 100644
index c0d633e..0000000
--- a/third_party/gofrontend/libgo/go/debug/plan9obj/testdata/hello.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <u.h>
-#include <libc.h>
-
-void
-main(void)
-{
-	print("hello, world\n");
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/ascii85/ascii85.go b/third_party/gofrontend/libgo/go/encoding/ascii85/ascii85.go
deleted file mode 100644
index 4d71938..0000000
--- a/third_party/gofrontend/libgo/go/encoding/ascii85/ascii85.go
+++ /dev/null
@@ -1,310 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package ascii85 implements the ascii85 data encoding
-// as used in the btoa tool and Adobe's PostScript and PDF document formats.
-package ascii85
-
-import (
-	"io"
-	"strconv"
-)
-
-/*
- * Encoder
- */
-
-// Encode encodes src into at most MaxEncodedLen(len(src))
-// bytes of dst, returning the actual number of bytes written.
-//
-// The encoding handles 4-byte chunks, using a special encoding
-// for the last fragment, so Encode is not appropriate for use on
-// individual blocks of a large data stream.  Use NewEncoder() instead.
-//
-// Often, ascii85-encoded data is wrapped in <~ and ~> symbols.
-// Encode does not add these.
-func Encode(dst, src []byte) int {
-	if len(src) == 0 {
-		return 0
-	}
-
-	n := 0
-	for len(src) > 0 {
-		dst[0] = 0
-		dst[1] = 0
-		dst[2] = 0
-		dst[3] = 0
-		dst[4] = 0
-
-		// Unpack 4 bytes into uint32 to repack into base 85 5-byte.
-		var v uint32
-		switch len(src) {
-		default:
-			v |= uint32(src[3])
-			fallthrough
-		case 3:
-			v |= uint32(src[2]) << 8
-			fallthrough
-		case 2:
-			v |= uint32(src[1]) << 16
-			fallthrough
-		case 1:
-			v |= uint32(src[0]) << 24
-		}
-
-		// Special case: zero (!!!!!) shortens to z.
-		if v == 0 && len(src) >= 4 {
-			dst[0] = 'z'
-			dst = dst[1:]
-			src = src[4:]
-			n++
-			continue
-		}
-
-		// Otherwise, 5 base 85 digits starting at !.
-		for i := 4; i >= 0; i-- {
-			dst[i] = '!' + byte(v%85)
-			v /= 85
-		}
-
-		// If src was short, discard the low destination bytes.
-		m := 5
-		if len(src) < 4 {
-			m -= 4 - len(src)
-			src = nil
-		} else {
-			src = src[4:]
-		}
-		dst = dst[m:]
-		n += m
-	}
-	return n
-}
-
-// MaxEncodedLen returns the maximum length of an encoding of n source bytes.
-func MaxEncodedLen(n int) int { return (n + 3) / 4 * 5 }
-
-// NewEncoder returns a new ascii85 stream encoder.  Data written to
-// the returned writer will be encoded and then written to w.
-// Ascii85 encodings operate in 32-bit blocks; when finished
-// writing, the caller must Close the returned encoder to flush any
-// trailing partial block.
-func NewEncoder(w io.Writer) io.WriteCloser { return &encoder{w: w} }
-
-type encoder struct {
-	err  error
-	w    io.Writer
-	buf  [4]byte    // buffered data waiting to be encoded
-	nbuf int        // number of bytes in buf
-	out  [1024]byte // output buffer
-}
-
-func (e *encoder) Write(p []byte) (n int, err error) {
-	if e.err != nil {
-		return 0, e.err
-	}
-
-	// Leading fringe.
-	if e.nbuf > 0 {
-		var i int
-		for i = 0; i < len(p) && e.nbuf < 4; i++ {
-			e.buf[e.nbuf] = p[i]
-			e.nbuf++
-		}
-		n += i
-		p = p[i:]
-		if e.nbuf < 4 {
-			return
-		}
-		nout := Encode(e.out[0:], e.buf[0:])
-		if _, e.err = e.w.Write(e.out[0:nout]); e.err != nil {
-			return n, e.err
-		}
-		e.nbuf = 0
-	}
-
-	// Large interior chunks.
-	for len(p) >= 4 {
-		nn := len(e.out) / 5 * 4
-		if nn > len(p) {
-			nn = len(p)
-		}
-		nn -= nn % 4
-		if nn > 0 {
-			nout := Encode(e.out[0:], p[0:nn])
-			if _, e.err = e.w.Write(e.out[0:nout]); e.err != nil {
-				return n, e.err
-			}
-		}
-		n += nn
-		p = p[nn:]
-	}
-
-	// Trailing fringe.
-	for i := 0; i < len(p); i++ {
-		e.buf[i] = p[i]
-	}
-	e.nbuf = len(p)
-	n += len(p)
-	return
-}
-
-// Close flushes any pending output from the encoder.
-// It is an error to call Write after calling Close.
-func (e *encoder) Close() error {
-	// If there's anything left in the buffer, flush it out
-	if e.err == nil && e.nbuf > 0 {
-		nout := Encode(e.out[0:], e.buf[0:e.nbuf])
-		e.nbuf = 0
-		_, e.err = e.w.Write(e.out[0:nout])
-	}
-	return e.err
-}
-
-/*
- * Decoder
- */
-
-type CorruptInputError int64
-
-func (e CorruptInputError) Error() string {
-	return "illegal ascii85 data at input byte " + strconv.FormatInt(int64(e), 10)
-}
-
-// Decode decodes src into dst, returning both the number
-// of bytes written to dst and the number consumed from src.
-// If src contains invalid ascii85 data, Decode will return the
-// number of bytes successfully written and a CorruptInputError.
-// Decode ignores space and control characters in src.
-// Often, ascii85-encoded data is wrapped in <~ and ~> symbols.
-// Decode expects these to have been stripped by the caller.
-//
-// If flush is true, Decode assumes that src represents the
-// end of the input stream and processes it completely rather
-// than wait for the completion of another 32-bit block.
-//
-// NewDecoder wraps an io.Reader interface around Decode.
-//
-func Decode(dst, src []byte, flush bool) (ndst, nsrc int, err error) {
-	var v uint32
-	var nb int
-	for i, b := range src {
-		if len(dst)-ndst < 4 {
-			return
-		}
-		switch {
-		case b <= ' ':
-			continue
-		case b == 'z' && nb == 0:
-			nb = 5
-			v = 0
-		case '!' <= b && b <= 'u':
-			v = v*85 + uint32(b-'!')
-			nb++
-		default:
-			return 0, 0, CorruptInputError(i)
-		}
-		if nb == 5 {
-			nsrc = i + 1
-			dst[ndst] = byte(v >> 24)
-			dst[ndst+1] = byte(v >> 16)
-			dst[ndst+2] = byte(v >> 8)
-			dst[ndst+3] = byte(v)
-			ndst += 4
-			nb = 0
-			v = 0
-		}
-	}
-	if flush {
-		nsrc = len(src)
-		if nb > 0 {
-			// The number of output bytes in the last fragment
-			// is the number of leftover input bytes - 1:
-			// the extra byte provides enough bits to cover
-			// the inefficiency of the encoding for the block.
-			if nb == 1 {
-				return 0, 0, CorruptInputError(len(src))
-			}
-			for i := nb; i < 5; i++ {
-				// The short encoding truncated the output value.
-				// We have to assume the worst case values (digit 84)
-				// in order to ensure that the top bits are correct.
-				v = v*85 + 84
-			}
-			for i := 0; i < nb-1; i++ {
-				dst[ndst] = byte(v >> 24)
-				v <<= 8
-				ndst++
-			}
-		}
-	}
-	return
-}
-
-// NewDecoder constructs a new ascii85 stream decoder.
-func NewDecoder(r io.Reader) io.Reader { return &decoder{r: r} }
-
-type decoder struct {
-	err     error
-	readErr error
-	r       io.Reader
-	buf     [1024]byte // leftover input
-	nbuf    int
-	out     []byte // leftover decoded output
-	outbuf  [1024]byte
-}
-
-func (d *decoder) Read(p []byte) (n int, err error) {
-	if len(p) == 0 {
-		return 0, nil
-	}
-	if d.err != nil {
-		return 0, d.err
-	}
-
-	for {
-		// Copy leftover output from last decode.
-		if len(d.out) > 0 {
-			n = copy(p, d.out)
-			d.out = d.out[n:]
-			return
-		}
-
-		// Decode leftover input from last read.
-		var nn, nsrc, ndst int
-		if d.nbuf > 0 {
-			ndst, nsrc, d.err = Decode(d.outbuf[0:], d.buf[0:d.nbuf], d.readErr != nil)
-			if ndst > 0 {
-				d.out = d.outbuf[0:ndst]
-				d.nbuf = copy(d.buf[0:], d.buf[nsrc:d.nbuf])
-				continue // copy out and return
-			}
-			if ndst == 0 && d.err == nil {
-				// Special case: input buffer is mostly filled with non-data bytes.
-				// Filter out such bytes to make room for more input.
-				off := 0
-				for i := 0; i < d.nbuf; i++ {
-					if d.buf[i] > ' ' {
-						d.buf[off] = d.buf[i]
-						off++
-					}
-				}
-				d.nbuf = off
-			}
-		}
-
-		// Out of input, out of decoded output.  Check errors.
-		if d.err != nil {
-			return 0, d.err
-		}
-		if d.readErr != nil {
-			d.err = d.readErr
-			return 0, d.err
-		}
-
-		// Read more data.
-		nn, d.readErr = d.r.Read(d.buf[d.nbuf:])
-		d.nbuf += nn
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/ascii85/ascii85_test.go b/third_party/gofrontend/libgo/go/encoding/ascii85/ascii85_test.go
deleted file mode 100644
index aad199b..0000000
--- a/third_party/gofrontend/libgo/go/encoding/ascii85/ascii85_test.go
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ascii85
-
-import (
-	"bytes"
-	"io"
-	"io/ioutil"
-	"strings"
-	"testing"
-)
-
-type testpair struct {
-	decoded, encoded string
-}
-
-var pairs = []testpair{
-	// Encode returns 0 when len(src) is 0
-	{
-		"",
-		"",
-	},
-	// Wikipedia example
-	{
-		"Man is distinguished, not only by his reason, but by this singular passion from " +
-			"other animals, which is a lust of the mind, that by a perseverance of delight in " +
-			"the continued and indefatigable generation of knowledge, exceeds the short " +
-			"vehemence of any carnal pleasure.",
-		"9jqo^BlbD-BleB1DJ+*+F(f,q/0JhKF<GL>Cj@.4Gp$d7F!,L7@<6@)/0JDEF<G%<+EV:2F!,\n" +
-			"O<DJ+*.@<*K0@<6L(Df-\\0Ec5e;DffZ(EZee.Bl.9pF\"AGXBPCsi+DGm>@3BB/F*&OCAfu2/AKY\n" +
-			"i(DIb:@FD,*)+C]U=@3BN#EcYf8ATD3s@q?d$AftVqCh[NqF<G:8+EV:.+Cf>-FD5W8ARlolDIa\n" +
-			"l(DId<j@<?3r@:F%a+D58'ATD4$Bl@l3De:,-DJs`8ARoFb/0JMK@qB4^F!,R<AKZ&-DfTqBG%G\n" +
-			">uD.RTpAKYo'+CT/5+Cei#DII?(E,9)oF*2M7/c\n",
-	},
-	// Special case when shortening !!!!! to z.
-	{
-		"\000\000\000\000",
-		"z",
-	},
-}
-
-var bigtest = pairs[len(pairs)-1]
-
-func testEqual(t *testing.T, msg string, args ...interface{}) bool {
-	if args[len(args)-2] != args[len(args)-1] {
-		t.Errorf(msg, args...)
-		return false
-	}
-	return true
-}
-
-func strip85(s string) string {
-	t := make([]byte, len(s))
-	w := 0
-	for r := 0; r < len(s); r++ {
-		c := s[r]
-		if c > ' ' {
-			t[w] = c
-			w++
-		}
-	}
-	return string(t[0:w])
-}
-
-func TestEncode(t *testing.T) {
-	for _, p := range pairs {
-		buf := make([]byte, MaxEncodedLen(len(p.decoded)))
-		n := Encode(buf, []byte(p.decoded))
-		buf = buf[0:n]
-		testEqual(t, "Encode(%q) = %q, want %q", p.decoded, strip85(string(buf)), strip85(p.encoded))
-	}
-}
-
-func TestEncoder(t *testing.T) {
-	for _, p := range pairs {
-		bb := &bytes.Buffer{}
-		encoder := NewEncoder(bb)
-		encoder.Write([]byte(p.decoded))
-		encoder.Close()
-		testEqual(t, "Encode(%q) = %q, want %q", p.decoded, strip85(bb.String()), strip85(p.encoded))
-	}
-}
-
-func TestEncoderBuffering(t *testing.T) {
-	input := []byte(bigtest.decoded)
-	for bs := 1; bs <= 12; bs++ {
-		bb := &bytes.Buffer{}
-		encoder := NewEncoder(bb)
-		for pos := 0; pos < len(input); pos += bs {
-			end := pos + bs
-			if end > len(input) {
-				end = len(input)
-			}
-			n, err := encoder.Write(input[pos:end])
-			testEqual(t, "Write(%q) gave error %v, want %v", input[pos:end], err, error(nil))
-			testEqual(t, "Write(%q) gave length %v, want %v", input[pos:end], n, end-pos)
-		}
-		err := encoder.Close()
-		testEqual(t, "Close gave error %v, want %v", err, error(nil))
-		testEqual(t, "Encoding/%d of %q = %q, want %q", bs, bigtest.decoded, strip85(bb.String()), strip85(bigtest.encoded))
-	}
-}
-
-func TestDecode(t *testing.T) {
-	for _, p := range pairs {
-		dbuf := make([]byte, 4*len(p.encoded))
-		ndst, nsrc, err := Decode(dbuf, []byte(p.encoded), true)
-		testEqual(t, "Decode(%q) = error %v, want %v", p.encoded, err, error(nil))
-		testEqual(t, "Decode(%q) = nsrc %v, want %v", p.encoded, nsrc, len(p.encoded))
-		testEqual(t, "Decode(%q) = ndst %v, want %v", p.encoded, ndst, len(p.decoded))
-		testEqual(t, "Decode(%q) = %q, want %q", p.encoded, string(dbuf[0:ndst]), p.decoded)
-	}
-}
-
-func TestDecoder(t *testing.T) {
-	for _, p := range pairs {
-		decoder := NewDecoder(strings.NewReader(p.encoded))
-		dbuf, err := ioutil.ReadAll(decoder)
-		if err != nil {
-			t.Fatal("Read failed", err)
-		}
-		testEqual(t, "Read from %q = length %v, want %v", p.encoded, len(dbuf), len(p.decoded))
-		testEqual(t, "Decoding of %q = %q, want %q", p.encoded, string(dbuf), p.decoded)
-		if err != nil {
-			testEqual(t, "Read from %q = %v, want %v", p.encoded, err, io.EOF)
-		}
-	}
-}
-
-func TestDecoderBuffering(t *testing.T) {
-	for bs := 1; bs <= 12; bs++ {
-		decoder := NewDecoder(strings.NewReader(bigtest.encoded))
-		buf := make([]byte, len(bigtest.decoded)+12)
-		var total int
-		for total = 0; total < len(bigtest.decoded); {
-			n, err := decoder.Read(buf[total : total+bs])
-			testEqual(t, "Read from %q at pos %d = %d, %v, want _, %v", bigtest.encoded, total, n, err, error(nil))
-			total += n
-		}
-		testEqual(t, "Decoding/%d of %q = %q, want %q", bs, bigtest.encoded, string(buf[0:total]), bigtest.decoded)
-	}
-}
-
-func TestDecodeCorrupt(t *testing.T) {
-	type corrupt struct {
-		e string
-		p int
-	}
-	examples := []corrupt{
-		{"v", 0},
-		{"!z!!!!!!!!!", 1},
-	}
-
-	for _, e := range examples {
-		dbuf := make([]byte, 4*len(e.e))
-		_, _, err := Decode(dbuf, []byte(e.e), true)
-		switch err := err.(type) {
-		case CorruptInputError:
-			testEqual(t, "Corruption in %q at offset %v, want %v", e.e, int(err), e.p)
-		default:
-			t.Error("Decoder failed to detect corruption in", e)
-		}
-	}
-}
-
-func TestBig(t *testing.T) {
-	n := 3*1000 + 1
-	raw := make([]byte, n)
-	const alpha = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
-	for i := 0; i < n; i++ {
-		raw[i] = alpha[i%len(alpha)]
-	}
-	encoded := new(bytes.Buffer)
-	w := NewEncoder(encoded)
-	nn, err := w.Write(raw)
-	if nn != n || err != nil {
-		t.Fatalf("Encoder.Write(raw) = %d, %v want %d, nil", nn, err, n)
-	}
-	err = w.Close()
-	if err != nil {
-		t.Fatalf("Encoder.Close() = %v want nil", err)
-	}
-	decoded, err := ioutil.ReadAll(NewDecoder(encoded))
-	if err != nil {
-		t.Fatalf("io.ReadAll(NewDecoder(...)): %v", err)
-	}
-
-	if !bytes.Equal(raw, decoded) {
-		var i int
-		for i = 0; i < len(decoded) && i < len(raw); i++ {
-			if decoded[i] != raw[i] {
-				break
-			}
-		}
-		t.Errorf("Decode(Encode(%d-byte string)) failed at offset %d", n, i)
-	}
-}
-
-func TestDecoderInternalWhitespace(t *testing.T) {
-	s := strings.Repeat(" ", 2048) + "z"
-	decoded, err := ioutil.ReadAll(NewDecoder(strings.NewReader(s)))
-	if err != nil {
-		t.Errorf("Decode gave error %v", err)
-	}
-	if want := []byte("\000\000\000\000"); !bytes.Equal(want, decoded) {
-		t.Errorf("Decode failed: got %v, want %v", decoded, want)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/asn1/asn1.go b/third_party/gofrontend/libgo/go/encoding/asn1/asn1.go
deleted file mode 100644
index 2ac411a..0000000
--- a/third_party/gofrontend/libgo/go/encoding/asn1/asn1.go
+++ /dev/null
@@ -1,962 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package asn1 implements parsing of DER-encoded ASN.1 data structures,
-// as defined in ITU-T Rec X.690.
-//
-// See also ``A Layman's Guide to a Subset of ASN.1, BER, and DER,''
-// http://luca.ntop.org/Teaching/Appunti/asn1.html.
-package asn1
-
-// ASN.1 is a syntax for specifying abstract objects and BER, DER, PER, XER etc
-// are different encoding formats for those objects. Here, we'll be dealing
-// with DER, the Distinguished Encoding Rules. DER is used in X.509 because
-// it's fast to parse and, unlike BER, has a unique encoding for every object.
-// When calculating hashes over objects, it's important that the resulting
-// bytes be the same at both ends and DER removes this margin of error.
-//
-// ASN.1 is very complex and this package doesn't attempt to implement
-// everything by any means.
-
-import (
-	"errors"
-	"fmt"
-	"math/big"
-	"reflect"
-	"strconv"
-	"time"
-	"unicode/utf8"
-)
-
-// A StructuralError suggests that the ASN.1 data is valid, but the Go type
-// which is receiving it doesn't match.
-type StructuralError struct {
-	Msg string
-}
-
-func (e StructuralError) Error() string { return "asn1: structure error: " + e.Msg }
-
-// A SyntaxError suggests that the ASN.1 data is invalid.
-type SyntaxError struct {
-	Msg string
-}
-
-func (e SyntaxError) Error() string { return "asn1: syntax error: " + e.Msg }
-
-// We start by dealing with each of the primitive types in turn.
-
-// BOOLEAN
-
-func parseBool(bytes []byte) (ret bool, err error) {
-	if len(bytes) != 1 {
-		err = SyntaxError{"invalid boolean"}
-		return
-	}
-
-	// DER demands that "If the encoding represents the boolean value TRUE,
-	// its single contents octet shall have all eight bits set to one."
-	// Thus only 0 and 255 are valid encoded values.
-	switch bytes[0] {
-	case 0:
-		ret = false
-	case 0xff:
-		ret = true
-	default:
-		err = SyntaxError{"invalid boolean"}
-	}
-
-	return
-}
-
-// INTEGER
-
-// parseInt64 treats the given bytes as a big-endian, signed integer and
-// returns the result.
-func parseInt64(bytes []byte) (ret int64, err error) {
-	if len(bytes) > 8 {
-		// We'll overflow an int64 in this case.
-		err = StructuralError{"integer too large"}
-		return
-	}
-	for bytesRead := 0; bytesRead < len(bytes); bytesRead++ {
-		ret <<= 8
-		ret |= int64(bytes[bytesRead])
-	}
-
-	// Shift up and down in order to sign extend the result.
-	ret <<= 64 - uint8(len(bytes))*8
-	ret >>= 64 - uint8(len(bytes))*8
-	return
-}
-
-// parseInt treats the given bytes as a big-endian, signed integer and returns
-// the result.
-func parseInt32(bytes []byte) (int32, error) {
-	ret64, err := parseInt64(bytes)
-	if err != nil {
-		return 0, err
-	}
-	if ret64 != int64(int32(ret64)) {
-		return 0, StructuralError{"integer too large"}
-	}
-	return int32(ret64), nil
-}
-
-var bigOne = big.NewInt(1)
-
-// parseBigInt treats the given bytes as a big-endian, signed integer and returns
-// the result.
-func parseBigInt(bytes []byte) *big.Int {
-	ret := new(big.Int)
-	if len(bytes) > 0 && bytes[0]&0x80 == 0x80 {
-		// This is a negative number.
-		notBytes := make([]byte, len(bytes))
-		for i := range notBytes {
-			notBytes[i] = ^bytes[i]
-		}
-		ret.SetBytes(notBytes)
-		ret.Add(ret, bigOne)
-		ret.Neg(ret)
-		return ret
-	}
-	ret.SetBytes(bytes)
-	return ret
-}
-
-// BIT STRING
-
-// BitString is the structure to use when you want an ASN.1 BIT STRING type. A
-// bit string is padded up to the nearest byte in memory and the number of
-// valid bits is recorded. Padding bits will be zero.
-type BitString struct {
-	Bytes     []byte // bits packed into bytes.
-	BitLength int    // length in bits.
-}
-
-// At returns the bit at the given index. If the index is out of range it
-// returns false.
-func (b BitString) At(i int) int {
-	if i < 0 || i >= b.BitLength {
-		return 0
-	}
-	x := i / 8
-	y := 7 - uint(i%8)
-	return int(b.Bytes[x]>>y) & 1
-}
-
-// RightAlign returns a slice where the padding bits are at the beginning. The
-// slice may share memory with the BitString.
-func (b BitString) RightAlign() []byte {
-	shift := uint(8 - (b.BitLength % 8))
-	if shift == 8 || len(b.Bytes) == 0 {
-		return b.Bytes
-	}
-
-	a := make([]byte, len(b.Bytes))
-	a[0] = b.Bytes[0] >> shift
-	for i := 1; i < len(b.Bytes); i++ {
-		a[i] = b.Bytes[i-1] << (8 - shift)
-		a[i] |= b.Bytes[i] >> shift
-	}
-
-	return a
-}
-
-// parseBitString parses an ASN.1 bit string from the given byte slice and returns it.
-func parseBitString(bytes []byte) (ret BitString, err error) {
-	if len(bytes) == 0 {
-		err = SyntaxError{"zero length BIT STRING"}
-		return
-	}
-	paddingBits := int(bytes[0])
-	if paddingBits > 7 ||
-		len(bytes) == 1 && paddingBits > 0 ||
-		bytes[len(bytes)-1]&((1<<bytes[0])-1) != 0 {
-		err = SyntaxError{"invalid padding bits in BIT STRING"}
-		return
-	}
-	ret.BitLength = (len(bytes)-1)*8 - paddingBits
-	ret.Bytes = bytes[1:]
-	return
-}
-
-// OBJECT IDENTIFIER
-
-// An ObjectIdentifier represents an ASN.1 OBJECT IDENTIFIER.
-type ObjectIdentifier []int
-
-// Equal reports whether oi and other represent the same identifier.
-func (oi ObjectIdentifier) Equal(other ObjectIdentifier) bool {
-	if len(oi) != len(other) {
-		return false
-	}
-	for i := 0; i < len(oi); i++ {
-		if oi[i] != other[i] {
-			return false
-		}
-	}
-
-	return true
-}
-
-func (oi ObjectIdentifier) String() string {
-	var s string
-
-	for i, v := range oi {
-		if i > 0 {
-			s += "."
-		}
-		s += strconv.Itoa(v)
-	}
-
-	return s
-}
-
-// parseObjectIdentifier parses an OBJECT IDENTIFIER from the given bytes and
-// returns it. An object identifier is a sequence of variable length integers
-// that are assigned in a hierarchy.
-func parseObjectIdentifier(bytes []byte) (s []int, err error) {
-	if len(bytes) == 0 {
-		err = SyntaxError{"zero length OBJECT IDENTIFIER"}
-		return
-	}
-
-	// In the worst case, we get two elements from the first byte (which is
-	// encoded differently) and then every varint is a single byte long.
-	s = make([]int, len(bytes)+1)
-
-	// The first varint is 40*value1 + value2:
-	// According to this packing, value1 can take the values 0, 1 and 2 only.
-	// When value1 = 0 or value1 = 1, then value2 is <= 39. When value1 = 2,
-	// then there are no restrictions on value2.
-	v, offset, err := parseBase128Int(bytes, 0)
-	if err != nil {
-		return
-	}
-	if v < 80 {
-		s[0] = v / 40
-		s[1] = v % 40
-	} else {
-		s[0] = 2
-		s[1] = v - 80
-	}
-
-	i := 2
-	for ; offset < len(bytes); i++ {
-		v, offset, err = parseBase128Int(bytes, offset)
-		if err != nil {
-			return
-		}
-		s[i] = v
-	}
-	s = s[0:i]
-	return
-}
-
-// ENUMERATED
-
-// An Enumerated is represented as a plain int.
-type Enumerated int
-
-// FLAG
-
-// A Flag accepts any data and is set to true if present.
-type Flag bool
-
-// parseBase128Int parses a base-128 encoded int from the given offset in the
-// given byte slice. It returns the value and the new offset.
-func parseBase128Int(bytes []byte, initOffset int) (ret, offset int, err error) {
-	offset = initOffset
-	for shifted := 0; offset < len(bytes); shifted++ {
-		if shifted > 4 {
-			err = StructuralError{"base 128 integer too large"}
-			return
-		}
-		ret <<= 7
-		b := bytes[offset]
-		ret |= int(b & 0x7f)
-		offset++
-		if b&0x80 == 0 {
-			return
-		}
-	}
-	err = SyntaxError{"truncated base 128 integer"}
-	return
-}
-
-// UTCTime
-
-func parseUTCTime(bytes []byte) (ret time.Time, err error) {
-	s := string(bytes)
-
-	formatStr := "0601021504Z0700"
-	ret, err = time.Parse(formatStr, s)
-	if err != nil {
-		formatStr = "060102150405Z0700"
-		ret, err = time.Parse(formatStr, s)
-	}
-	if err != nil {
-		return
-	}
-
-	if serialized := ret.Format(formatStr); serialized != s {
-		err = fmt.Errorf("asn1: time did not serialize back to the original value and may be invalid: given %q, but serialized as %q", s, serialized)
-		return
-	}
-
-	if ret.Year() >= 2050 {
-		// UTCTime only encodes times prior to 2050. See https://tools.ietf.org/html/rfc5280#section-4.1.2.5.1
-		ret = ret.AddDate(-100, 0, 0)
-	}
-
-	return
-}
-
-// parseGeneralizedTime parses the GeneralizedTime from the given byte slice
-// and returns the resulting time.
-func parseGeneralizedTime(bytes []byte) (ret time.Time, err error) {
-	const formatStr = "20060102150405Z0700"
-	s := string(bytes)
-
-	if ret, err = time.Parse(formatStr, s); err != nil {
-		return
-	}
-
-	if serialized := ret.Format(formatStr); serialized != s {
-		err = fmt.Errorf("asn1: time did not serialize back to the original value and may be invalid: given %q, but serialized as %q", s, serialized)
-	}
-
-	return
-}
-
-// PrintableString
-
-// parsePrintableString parses a ASN.1 PrintableString from the given byte
-// array and returns it.
-func parsePrintableString(bytes []byte) (ret string, err error) {
-	for _, b := range bytes {
-		if !isPrintable(b) {
-			err = SyntaxError{"PrintableString contains invalid character"}
-			return
-		}
-	}
-	ret = string(bytes)
-	return
-}
-
-// isPrintable reports whether the given b is in the ASN.1 PrintableString set.
-func isPrintable(b byte) bool {
-	return 'a' <= b && b <= 'z' ||
-		'A' <= b && b <= 'Z' ||
-		'0' <= b && b <= '9' ||
-		'\'' <= b && b <= ')' ||
-		'+' <= b && b <= '/' ||
-		b == ' ' ||
-		b == ':' ||
-		b == '=' ||
-		b == '?' ||
-		// This is technically not allowed in a PrintableString.
-		// However, x509 certificates with wildcard strings don't
-		// always use the correct string type so we permit it.
-		b == '*'
-}
-
-// IA5String
-
-// parseIA5String parses a ASN.1 IA5String (ASCII string) from the given
-// byte slice and returns it.
-func parseIA5String(bytes []byte) (ret string, err error) {
-	for _, b := range bytes {
-		if b >= 0x80 {
-			err = SyntaxError{"IA5String contains invalid character"}
-			return
-		}
-	}
-	ret = string(bytes)
-	return
-}
-
-// T61String
-
-// parseT61String parses a ASN.1 T61String (8-bit clean string) from the given
-// byte slice and returns it.
-func parseT61String(bytes []byte) (ret string, err error) {
-	return string(bytes), nil
-}
-
-// UTF8String
-
-// parseUTF8String parses a ASN.1 UTF8String (raw UTF-8) from the given byte
-// array and returns it.
-func parseUTF8String(bytes []byte) (ret string, err error) {
-	if !utf8.Valid(bytes) {
-		return "", errors.New("asn1: invalid UTF-8 string")
-	}
-	return string(bytes), nil
-}
-
-// A RawValue represents an undecoded ASN.1 object.
-type RawValue struct {
-	Class, Tag int
-	IsCompound bool
-	Bytes      []byte
-	FullBytes  []byte // includes the tag and length
-}
-
-// RawContent is used to signal that the undecoded, DER data needs to be
-// preserved for a struct. To use it, the first field of the struct must have
-// this type. It's an error for any of the other fields to have this type.
-type RawContent []byte
-
-// Tagging
-
-// parseTagAndLength parses an ASN.1 tag and length pair from the given offset
-// into a byte slice. It returns the parsed data and the new offset. SET and
-// SET OF (tag 17) are mapped to SEQUENCE and SEQUENCE OF (tag 16) since we
-// don't distinguish between ordered and unordered objects in this code.
-func parseTagAndLength(bytes []byte, initOffset int) (ret tagAndLength, offset int, err error) {
-	offset = initOffset
-	// parseTagAndLength should not be called without at least a single
-	// byte to read. Thus this check is for robustness:
-	if offset >= len(bytes) {
-		err = errors.New("asn1: internal error in parseTagAndLength")
-		return
-	}
-	b := bytes[offset]
-	offset++
-	ret.class = int(b >> 6)
-	ret.isCompound = b&0x20 == 0x20
-	ret.tag = int(b & 0x1f)
-
-	// If the bottom five bits are set, then the tag number is actually base 128
-	// encoded afterwards
-	if ret.tag == 0x1f {
-		ret.tag, offset, err = parseBase128Int(bytes, offset)
-		if err != nil {
-			return
-		}
-	}
-	if offset >= len(bytes) {
-		err = SyntaxError{"truncated tag or length"}
-		return
-	}
-	b = bytes[offset]
-	offset++
-	if b&0x80 == 0 {
-		// The length is encoded in the bottom 7 bits.
-		ret.length = int(b & 0x7f)
-	} else {
-		// Bottom 7 bits give the number of length bytes to follow.
-		numBytes := int(b & 0x7f)
-		if numBytes == 0 {
-			err = SyntaxError{"indefinite length found (not DER)"}
-			return
-		}
-		ret.length = 0
-		for i := 0; i < numBytes; i++ {
-			if offset >= len(bytes) {
-				err = SyntaxError{"truncated tag or length"}
-				return
-			}
-			b = bytes[offset]
-			offset++
-			if ret.length >= 1<<23 {
-				// We can't shift ret.length up without
-				// overflowing.
-				err = StructuralError{"length too large"}
-				return
-			}
-			ret.length <<= 8
-			ret.length |= int(b)
-			if ret.length == 0 {
-				// DER requires that lengths be minimal.
-				err = StructuralError{"superfluous leading zeros in length"}
-				return
-			}
-		}
-	}
-
-	return
-}
-
-// parseSequenceOf is used for SEQUENCE OF and SET OF values. It tries to parse
-// a number of ASN.1 values from the given byte slice and returns them as a
-// slice of Go values of the given type.
-func parseSequenceOf(bytes []byte, sliceType reflect.Type, elemType reflect.Type) (ret reflect.Value, err error) {
-	expectedTag, compoundType, ok := getUniversalType(elemType)
-	if !ok {
-		err = StructuralError{"unknown Go type for slice"}
-		return
-	}
-
-	// First we iterate over the input and count the number of elements,
-	// checking that the types are correct in each case.
-	numElements := 0
-	for offset := 0; offset < len(bytes); {
-		var t tagAndLength
-		t, offset, err = parseTagAndLength(bytes, offset)
-		if err != nil {
-			return
-		}
-		switch t.tag {
-		case tagIA5String, tagGeneralString, tagT61String, tagUTF8String:
-			// We pretend that various other string types are
-			// PRINTABLE STRINGs so that a sequence of them can be
-			// parsed into a []string.
-			t.tag = tagPrintableString
-		case tagGeneralizedTime, tagUTCTime:
-			// Likewise, both time types are treated the same.
-			t.tag = tagUTCTime
-		}
-
-		if t.class != classUniversal || t.isCompound != compoundType || t.tag != expectedTag {
-			err = StructuralError{"sequence tag mismatch"}
-			return
-		}
-		if invalidLength(offset, t.length, len(bytes)) {
-			err = SyntaxError{"truncated sequence"}
-			return
-		}
-		offset += t.length
-		numElements++
-	}
-	ret = reflect.MakeSlice(sliceType, numElements, numElements)
-	params := fieldParameters{}
-	offset := 0
-	for i := 0; i < numElements; i++ {
-		offset, err = parseField(ret.Index(i), bytes, offset, params)
-		if err != nil {
-			return
-		}
-	}
-	return
-}
-
-var (
-	bitStringType        = reflect.TypeOf(BitString{})
-	objectIdentifierType = reflect.TypeOf(ObjectIdentifier{})
-	enumeratedType       = reflect.TypeOf(Enumerated(0))
-	flagType             = reflect.TypeOf(Flag(false))
-	timeType             = reflect.TypeOf(time.Time{})
-	rawValueType         = reflect.TypeOf(RawValue{})
-	rawContentsType      = reflect.TypeOf(RawContent(nil))
-	bigIntType           = reflect.TypeOf(new(big.Int))
-)
-
-// invalidLength returns true iff offset + length > sliceLength, or if the
-// addition would overflow.
-func invalidLength(offset, length, sliceLength int) bool {
-	return offset+length < offset || offset+length > sliceLength
-}
-
-// parseField is the main parsing function. Given a byte slice and an offset
-// into the array, it will try to parse a suitable ASN.1 value out and store it
-// in the given Value.
-func parseField(v reflect.Value, bytes []byte, initOffset int, params fieldParameters) (offset int, err error) {
-	offset = initOffset
-	fieldType := v.Type()
-
-	// If we have run out of data, it may be that there are optional elements at the end.
-	if offset == len(bytes) {
-		if !setDefaultValue(v, params) {
-			err = SyntaxError{"sequence truncated"}
-		}
-		return
-	}
-
-	// Deal with raw values.
-	if fieldType == rawValueType {
-		var t tagAndLength
-		t, offset, err = parseTagAndLength(bytes, offset)
-		if err != nil {
-			return
-		}
-		if invalidLength(offset, t.length, len(bytes)) {
-			err = SyntaxError{"data truncated"}
-			return
-		}
-		result := RawValue{t.class, t.tag, t.isCompound, bytes[offset : offset+t.length], bytes[initOffset : offset+t.length]}
-		offset += t.length
-		v.Set(reflect.ValueOf(result))
-		return
-	}
-
-	// Deal with the ANY type.
-	if ifaceType := fieldType; ifaceType.Kind() == reflect.Interface && ifaceType.NumMethod() == 0 {
-		var t tagAndLength
-		t, offset, err = parseTagAndLength(bytes, offset)
-		if err != nil {
-			return
-		}
-		if invalidLength(offset, t.length, len(bytes)) {
-			err = SyntaxError{"data truncated"}
-			return
-		}
-		var result interface{}
-		if !t.isCompound && t.class == classUniversal {
-			innerBytes := bytes[offset : offset+t.length]
-			switch t.tag {
-			case tagPrintableString:
-				result, err = parsePrintableString(innerBytes)
-			case tagIA5String:
-				result, err = parseIA5String(innerBytes)
-			case tagT61String:
-				result, err = parseT61String(innerBytes)
-			case tagUTF8String:
-				result, err = parseUTF8String(innerBytes)
-			case tagInteger:
-				result, err = parseInt64(innerBytes)
-			case tagBitString:
-				result, err = parseBitString(innerBytes)
-			case tagOID:
-				result, err = parseObjectIdentifier(innerBytes)
-			case tagUTCTime:
-				result, err = parseUTCTime(innerBytes)
-			case tagGeneralizedTime:
-				result, err = parseGeneralizedTime(innerBytes)
-			case tagOctetString:
-				result = innerBytes
-			default:
-				// If we don't know how to handle the type, we just leave Value as nil.
-			}
-		}
-		offset += t.length
-		if err != nil {
-			return
-		}
-		if result != nil {
-			v.Set(reflect.ValueOf(result))
-		}
-		return
-	}
-	universalTag, compoundType, ok1 := getUniversalType(fieldType)
-	if !ok1 {
-		err = StructuralError{fmt.Sprintf("unknown Go type: %v", fieldType)}
-		return
-	}
-
-	t, offset, err := parseTagAndLength(bytes, offset)
-	if err != nil {
-		return
-	}
-	if params.explicit {
-		expectedClass := classContextSpecific
-		if params.application {
-			expectedClass = classApplication
-		}
-		if offset == len(bytes) {
-			err = StructuralError{"explicit tag has no child"}
-			return
-		}
-		if t.class == expectedClass && t.tag == *params.tag && (t.length == 0 || t.isCompound) {
-			if t.length > 0 {
-				t, offset, err = parseTagAndLength(bytes, offset)
-				if err != nil {
-					return
-				}
-			} else {
-				if fieldType != flagType {
-					err = StructuralError{"zero length explicit tag was not an asn1.Flag"}
-					return
-				}
-				v.SetBool(true)
-				return
-			}
-		} else {
-			// The tags didn't match, it might be an optional element.
-			ok := setDefaultValue(v, params)
-			if ok {
-				offset = initOffset
-			} else {
-				err = StructuralError{"explicitly tagged member didn't match"}
-			}
-			return
-		}
-	}
-
-	// Special case for strings: all the ASN.1 string types map to the Go
-	// type string. getUniversalType returns the tag for PrintableString
-	// when it sees a string, so if we see a different string type on the
-	// wire, we change the universal type to match.
-	if universalTag == tagPrintableString {
-		if t.class == classUniversal {
-			switch t.tag {
-			case tagIA5String, tagGeneralString, tagT61String, tagUTF8String:
-				universalTag = t.tag
-			}
-		} else if params.stringType != 0 {
-			universalTag = params.stringType
-		}
-	}
-
-	// Special case for time: UTCTime and GeneralizedTime both map to the
-	// Go type time.Time.
-	if universalTag == tagUTCTime && t.tag == tagGeneralizedTime && t.class == classUniversal {
-		universalTag = tagGeneralizedTime
-	}
-
-	if params.set {
-		universalTag = tagSet
-	}
-
-	expectedClass := classUniversal
-	expectedTag := universalTag
-
-	if !params.explicit && params.tag != nil {
-		expectedClass = classContextSpecific
-		expectedTag = *params.tag
-	}
-
-	if !params.explicit && params.application && params.tag != nil {
-		expectedClass = classApplication
-		expectedTag = *params.tag
-	}
-
-	// We have unwrapped any explicit tagging at this point.
-	if t.class != expectedClass || t.tag != expectedTag || t.isCompound != compoundType {
-		// Tags don't match. Again, it could be an optional element.
-		ok := setDefaultValue(v, params)
-		if ok {
-			offset = initOffset
-		} else {
-			err = StructuralError{fmt.Sprintf("tags don't match (%d vs %+v) %+v %s @%d", expectedTag, t, params, fieldType.Name(), offset)}
-		}
-		return
-	}
-	if invalidLength(offset, t.length, len(bytes)) {
-		err = SyntaxError{"data truncated"}
-		return
-	}
-	innerBytes := bytes[offset : offset+t.length]
-	offset += t.length
-
-	// We deal with the structures defined in this package first.
-	switch fieldType {
-	case objectIdentifierType:
-		newSlice, err1 := parseObjectIdentifier(innerBytes)
-		v.Set(reflect.MakeSlice(v.Type(), len(newSlice), len(newSlice)))
-		if err1 == nil {
-			reflect.Copy(v, reflect.ValueOf(newSlice))
-		}
-		err = err1
-		return
-	case bitStringType:
-		bs, err1 := parseBitString(innerBytes)
-		if err1 == nil {
-			v.Set(reflect.ValueOf(bs))
-		}
-		err = err1
-		return
-	case timeType:
-		var time time.Time
-		var err1 error
-		if universalTag == tagUTCTime {
-			time, err1 = parseUTCTime(innerBytes)
-		} else {
-			time, err1 = parseGeneralizedTime(innerBytes)
-		}
-		if err1 == nil {
-			v.Set(reflect.ValueOf(time))
-		}
-		err = err1
-		return
-	case enumeratedType:
-		parsedInt, err1 := parseInt32(innerBytes)
-		if err1 == nil {
-			v.SetInt(int64(parsedInt))
-		}
-		err = err1
-		return
-	case flagType:
-		v.SetBool(true)
-		return
-	case bigIntType:
-		parsedInt := parseBigInt(innerBytes)
-		v.Set(reflect.ValueOf(parsedInt))
-		return
-	}
-	switch val := v; val.Kind() {
-	case reflect.Bool:
-		parsedBool, err1 := parseBool(innerBytes)
-		if err1 == nil {
-			val.SetBool(parsedBool)
-		}
-		err = err1
-		return
-	case reflect.Int, reflect.Int32, reflect.Int64:
-		if val.Type().Size() == 4 {
-			parsedInt, err1 := parseInt32(innerBytes)
-			if err1 == nil {
-				val.SetInt(int64(parsedInt))
-			}
-			err = err1
-		} else {
-			parsedInt, err1 := parseInt64(innerBytes)
-			if err1 == nil {
-				val.SetInt(parsedInt)
-			}
-			err = err1
-		}
-		return
-	// TODO(dfc) Add support for the remaining integer types
-	case reflect.Struct:
-		structType := fieldType
-
-		if structType.NumField() > 0 &&
-			structType.Field(0).Type == rawContentsType {
-			bytes := bytes[initOffset:offset]
-			val.Field(0).Set(reflect.ValueOf(RawContent(bytes)))
-		}
-
-		innerOffset := 0
-		for i := 0; i < structType.NumField(); i++ {
-			field := structType.Field(i)
-			if i == 0 && field.Type == rawContentsType {
-				continue
-			}
-			innerOffset, err = parseField(val.Field(i), innerBytes, innerOffset, parseFieldParameters(field.Tag.Get("asn1")))
-			if err != nil {
-				return
-			}
-		}
-		// We allow extra bytes at the end of the SEQUENCE because
-		// adding elements to the end has been used in X.509 as the
-		// version numbers have increased.
-		return
-	case reflect.Slice:
-		sliceType := fieldType
-		if sliceType.Elem().Kind() == reflect.Uint8 {
-			val.Set(reflect.MakeSlice(sliceType, len(innerBytes), len(innerBytes)))
-			reflect.Copy(val, reflect.ValueOf(innerBytes))
-			return
-		}
-		newSlice, err1 := parseSequenceOf(innerBytes, sliceType, sliceType.Elem())
-		if err1 == nil {
-			val.Set(newSlice)
-		}
-		err = err1
-		return
-	case reflect.String:
-		var v string
-		switch universalTag {
-		case tagPrintableString:
-			v, err = parsePrintableString(innerBytes)
-		case tagIA5String:
-			v, err = parseIA5String(innerBytes)
-		case tagT61String:
-			v, err = parseT61String(innerBytes)
-		case tagUTF8String:
-			v, err = parseUTF8String(innerBytes)
-		case tagGeneralString:
-			// GeneralString is specified in ISO-2022/ECMA-35,
-			// A brief review suggests that it includes structures
-			// that allow the encoding to change midstring and
-			// such. We give up and pass it as an 8-bit string.
-			v, err = parseT61String(innerBytes)
-		default:
-			err = SyntaxError{fmt.Sprintf("internal error: unknown string type %d", universalTag)}
-		}
-		if err == nil {
-			val.SetString(v)
-		}
-		return
-	}
-	err = StructuralError{"unsupported: " + v.Type().String()}
-	return
-}
-
-// canHaveDefaultValue reports whether k is a Kind that we will set a default
-// value for. (A signed integer, essentially.)
-func canHaveDefaultValue(k reflect.Kind) bool {
-	switch k {
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return true
-	}
-
-	return false
-}
-
-// setDefaultValue is used to install a default value, from a tag string, into
-// a Value. It is successful if the field was optional, even if a default value
-// wasn't provided or it failed to install it into the Value.
-func setDefaultValue(v reflect.Value, params fieldParameters) (ok bool) {
-	if !params.optional {
-		return
-	}
-	ok = true
-	if params.defaultValue == nil {
-		return
-	}
-	if canHaveDefaultValue(v.Kind()) {
-		v.SetInt(*params.defaultValue)
-	}
-	return
-}
-
-// Unmarshal parses the DER-encoded ASN.1 data structure b
-// and uses the reflect package to fill in an arbitrary value pointed at by val.
-// Because Unmarshal uses the reflect package, the structs
-// being written to must use upper case field names.
-//
-// An ASN.1 INTEGER can be written to an int, int32, int64,
-// or *big.Int (from the math/big package).
-// If the encoded value does not fit in the Go type,
-// Unmarshal returns a parse error.
-//
-// An ASN.1 BIT STRING can be written to a BitString.
-//
-// An ASN.1 OCTET STRING can be written to a []byte.
-//
-// An ASN.1 OBJECT IDENTIFIER can be written to an
-// ObjectIdentifier.
-//
-// An ASN.1 ENUMERATED can be written to an Enumerated.
-//
-// An ASN.1 UTCTIME or GENERALIZEDTIME can be written to a time.Time.
-//
-// An ASN.1 PrintableString or IA5String can be written to a string.
-//
-// Any of the above ASN.1 values can be written to an interface{}.
-// The value stored in the interface has the corresponding Go type.
-// For integers, that type is int64.
-//
-// An ASN.1 SEQUENCE OF x or SET OF x can be written
-// to a slice if an x can be written to the slice's element type.
-//
-// An ASN.1 SEQUENCE or SET can be written to a struct
-// if each of the elements in the sequence can be
-// written to the corresponding element in the struct.
-//
-// The following tags on struct fields have special meaning to Unmarshal:
-//
-//	application	specifies that a APPLICATION tag is used
-//	default:x	sets the default value for optional integer fields
-//	explicit	specifies that an additional, explicit tag wraps the implicit one
-//	optional	marks the field as ASN.1 OPTIONAL
-//	set		causes a SET, rather than a SEQUENCE type to be expected
-//	tag:x		specifies the ASN.1 tag number; implies ASN.1 CONTEXT SPECIFIC
-//
-// If the type of the first field of a structure is RawContent then the raw
-// ASN1 contents of the struct will be stored in it.
-//
-// If the type name of a slice element ends with "SET" then it's treated as if
-// the "set" tag was set on it. This can be used with nested slices where a
-// struct tag cannot be given.
-//
-// Other ASN.1 types are not supported; if it encounters them,
-// Unmarshal returns a parse error.
-func Unmarshal(b []byte, val interface{}) (rest []byte, err error) {
-	return UnmarshalWithParams(b, val, "")
-}
-
-// UnmarshalWithParams allows field parameters to be specified for the
-// top-level element. The form of the params is the same as the field tags.
-func UnmarshalWithParams(b []byte, val interface{}, params string) (rest []byte, err error) {
-	v := reflect.ValueOf(val).Elem()
-	offset, err := parseField(v, b, 0, parseFieldParameters(params))
-	if err != nil {
-		return nil, err
-	}
-	return b[offset:], nil
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/asn1/asn1_test.go b/third_party/gofrontend/libgo/go/encoding/asn1/asn1_test.go
deleted file mode 100644
index 893d080..0000000
--- a/third_party/gofrontend/libgo/go/encoding/asn1/asn1_test.go
+++ /dev/null
@@ -1,942 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package asn1
-
-import (
-	"bytes"
-	"fmt"
-	"math/big"
-	"reflect"
-	"strings"
-	"testing"
-	"time"
-)
-
-type boolTest struct {
-	in  []byte
-	ok  bool
-	out bool
-}
-
-var boolTestData = []boolTest{
-	{[]byte{0x00}, true, false},
-	{[]byte{0xff}, true, true},
-	{[]byte{0x00, 0x00}, false, false},
-	{[]byte{0xff, 0xff}, false, false},
-	{[]byte{0x01}, false, false},
-}
-
-func TestParseBool(t *testing.T) {
-	for i, test := range boolTestData {
-		ret, err := parseBool(test.in)
-		if (err == nil) != test.ok {
-			t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
-		}
-		if test.ok && ret != test.out {
-			t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
-		}
-	}
-}
-
-type int64Test struct {
-	in  []byte
-	ok  bool
-	out int64
-}
-
-var int64TestData = []int64Test{
-	{[]byte{0x00}, true, 0},
-	{[]byte{0x7f}, true, 127},
-	{[]byte{0x00, 0x80}, true, 128},
-	{[]byte{0x01, 0x00}, true, 256},
-	{[]byte{0x80}, true, -128},
-	{[]byte{0xff, 0x7f}, true, -129},
-	{[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, true, -1},
-	{[]byte{0xff}, true, -1},
-	{[]byte{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, true, -9223372036854775808},
-	{[]byte{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, false, 0},
-}
-
-func TestParseInt64(t *testing.T) {
-	for i, test := range int64TestData {
-		ret, err := parseInt64(test.in)
-		if (err == nil) != test.ok {
-			t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
-		}
-		if test.ok && ret != test.out {
-			t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
-		}
-	}
-}
-
-type int32Test struct {
-	in  []byte
-	ok  bool
-	out int32
-}
-
-var int32TestData = []int32Test{
-	{[]byte{0x00}, true, 0},
-	{[]byte{0x7f}, true, 127},
-	{[]byte{0x00, 0x80}, true, 128},
-	{[]byte{0x01, 0x00}, true, 256},
-	{[]byte{0x80}, true, -128},
-	{[]byte{0xff, 0x7f}, true, -129},
-	{[]byte{0xff, 0xff, 0xff, 0xff}, true, -1},
-	{[]byte{0xff}, true, -1},
-	{[]byte{0x80, 0x00, 0x00, 0x00}, true, -2147483648},
-	{[]byte{0x80, 0x00, 0x00, 0x00, 0x00}, false, 0},
-}
-
-func TestParseInt32(t *testing.T) {
-	for i, test := range int32TestData {
-		ret, err := parseInt32(test.in)
-		if (err == nil) != test.ok {
-			t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
-		}
-		if test.ok && int32(ret) != test.out {
-			t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
-		}
-	}
-}
-
-var bigIntTests = []struct {
-	in     []byte
-	base10 string
-}{
-	{[]byte{0xff}, "-1"},
-	{[]byte{0x00}, "0"},
-	{[]byte{0x01}, "1"},
-	{[]byte{0x00, 0xff}, "255"},
-	{[]byte{0xff, 0x00}, "-256"},
-	{[]byte{0x01, 0x00}, "256"},
-}
-
-func TestParseBigInt(t *testing.T) {
-	for i, test := range bigIntTests {
-		ret := parseBigInt(test.in)
-		if ret.String() != test.base10 {
-			t.Errorf("#%d: bad result from %x, got %s want %s", i, test.in, ret.String(), test.base10)
-		}
-		fw := newForkableWriter()
-		marshalBigInt(fw, ret)
-		result := fw.Bytes()
-		if !bytes.Equal(result, test.in) {
-			t.Errorf("#%d: got %x from marshaling %s, want %x", i, result, ret, test.in)
-		}
-	}
-}
-
-type bitStringTest struct {
-	in        []byte
-	ok        bool
-	out       []byte
-	bitLength int
-}
-
-var bitStringTestData = []bitStringTest{
-	{[]byte{}, false, []byte{}, 0},
-	{[]byte{0x00}, true, []byte{}, 0},
-	{[]byte{0x07, 0x00}, true, []byte{0x00}, 1},
-	{[]byte{0x07, 0x01}, false, []byte{}, 0},
-	{[]byte{0x07, 0x40}, false, []byte{}, 0},
-	{[]byte{0x08, 0x00}, false, []byte{}, 0},
-}
-
-func TestBitString(t *testing.T) {
-	for i, test := range bitStringTestData {
-		ret, err := parseBitString(test.in)
-		if (err == nil) != test.ok {
-			t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
-		}
-		if err == nil {
-			if test.bitLength != ret.BitLength || !bytes.Equal(ret.Bytes, test.out) {
-				t.Errorf("#%d: Bad result: %v (expected %v %v)", i, ret, test.out, test.bitLength)
-			}
-		}
-	}
-}
-
-func TestBitStringAt(t *testing.T) {
-	bs := BitString{[]byte{0x82, 0x40}, 16}
-	if bs.At(0) != 1 {
-		t.Error("#1: Failed")
-	}
-	if bs.At(1) != 0 {
-		t.Error("#2: Failed")
-	}
-	if bs.At(6) != 1 {
-		t.Error("#3: Failed")
-	}
-	if bs.At(9) != 1 {
-		t.Error("#4: Failed")
-	}
-	if bs.At(-1) != 0 {
-		t.Error("#5: Failed")
-	}
-	if bs.At(17) != 0 {
-		t.Error("#6: Failed")
-	}
-}
-
-type bitStringRightAlignTest struct {
-	in    []byte
-	inlen int
-	out   []byte
-}
-
-var bitStringRightAlignTests = []bitStringRightAlignTest{
-	{[]byte{0x80}, 1, []byte{0x01}},
-	{[]byte{0x80, 0x80}, 9, []byte{0x01, 0x01}},
-	{[]byte{}, 0, []byte{}},
-	{[]byte{0xce}, 8, []byte{0xce}},
-	{[]byte{0xce, 0x47}, 16, []byte{0xce, 0x47}},
-	{[]byte{0x34, 0x50}, 12, []byte{0x03, 0x45}},
-}
-
-func TestBitStringRightAlign(t *testing.T) {
-	for i, test := range bitStringRightAlignTests {
-		bs := BitString{test.in, test.inlen}
-		out := bs.RightAlign()
-		if !bytes.Equal(out, test.out) {
-			t.Errorf("#%d got: %x want: %x", i, out, test.out)
-		}
-	}
-}
-
-type objectIdentifierTest struct {
-	in  []byte
-	ok  bool
-	out []int
-}
-
-var objectIdentifierTestData = []objectIdentifierTest{
-	{[]byte{}, false, []int{}},
-	{[]byte{85}, true, []int{2, 5}},
-	{[]byte{85, 0x02}, true, []int{2, 5, 2}},
-	{[]byte{85, 0x02, 0xc0, 0x00}, true, []int{2, 5, 2, 0x2000}},
-	{[]byte{0x81, 0x34, 0x03}, true, []int{2, 100, 3}},
-	{[]byte{85, 0x02, 0xc0, 0x80, 0x80, 0x80, 0x80}, false, []int{}},
-}
-
-func TestObjectIdentifier(t *testing.T) {
-	for i, test := range objectIdentifierTestData {
-		ret, err := parseObjectIdentifier(test.in)
-		if (err == nil) != test.ok {
-			t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
-		}
-		if err == nil {
-			if !reflect.DeepEqual(test.out, ret) {
-				t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
-			}
-		}
-	}
-
-	if s := ObjectIdentifier([]int{1, 2, 3, 4}).String(); s != "1.2.3.4" {
-		t.Errorf("bad ObjectIdentifier.String(). Got %s, want 1.2.3.4", s)
-	}
-}
-
-type timeTest struct {
-	in  string
-	ok  bool
-	out time.Time
-}
-
-var utcTestData = []timeTest{
-	{"910506164540-0700", true, time.Date(1991, 05, 06, 16, 45, 40, 0, time.FixedZone("", -7*60*60))},
-	{"910506164540+0730", true, time.Date(1991, 05, 06, 16, 45, 40, 0, time.FixedZone("", 7*60*60+30*60))},
-	{"910506234540Z", true, time.Date(1991, 05, 06, 23, 45, 40, 0, time.UTC)},
-	{"9105062345Z", true, time.Date(1991, 05, 06, 23, 45, 0, 0, time.UTC)},
-	{"5105062345Z", true, time.Date(1951, 05, 06, 23, 45, 0, 0, time.UTC)},
-	{"a10506234540Z", false, time.Time{}},
-	{"91a506234540Z", false, time.Time{}},
-	{"9105a6234540Z", false, time.Time{}},
-	{"910506a34540Z", false, time.Time{}},
-	{"910506334a40Z", false, time.Time{}},
-	{"91050633444aZ", false, time.Time{}},
-	{"910506334461Z", false, time.Time{}},
-	{"910506334400Za", false, time.Time{}},
-	/* These are invalid times. However, the time package normalises times
-	 * and they were accepted in some versions. See #11134. */
-	{"000100000000Z", false, time.Time{}},
-	{"101302030405Z", false, time.Time{}},
-	{"100002030405Z", false, time.Time{}},
-	{"100100030405Z", false, time.Time{}},
-	{"100132030405Z", false, time.Time{}},
-	{"100231030405Z", false, time.Time{}},
-	{"100102240405Z", false, time.Time{}},
-	{"100102036005Z", false, time.Time{}},
-	{"100102030460Z", false, time.Time{}},
-	{"-100102030410Z", false, time.Time{}},
-	{"10-0102030410Z", false, time.Time{}},
-	{"10-0002030410Z", false, time.Time{}},
-	{"1001-02030410Z", false, time.Time{}},
-	{"100102-030410Z", false, time.Time{}},
-	{"10010203-0410Z", false, time.Time{}},
-	{"1001020304-10Z", false, time.Time{}},
-}
-
-func TestUTCTime(t *testing.T) {
-	for i, test := range utcTestData {
-		ret, err := parseUTCTime([]byte(test.in))
-		if err != nil {
-			if test.ok {
-				t.Errorf("#%d: parseUTCTime(%q) = error %v", i, test.in, err)
-			}
-			continue
-		}
-		if !test.ok {
-			t.Errorf("#%d: parseUTCTime(%q) succeeded, should have failed", i, test.in)
-			continue
-		}
-		const format = "Jan _2 15:04:05 -0700 2006" // ignore zone name, just offset
-		have := ret.Format(format)
-		want := test.out.Format(format)
-		if have != want {
-			t.Errorf("#%d: parseUTCTime(%q) = %s, want %s", i, test.in, have, want)
-		}
-	}
-}
-
-var generalizedTimeTestData = []timeTest{
-	{"20100102030405Z", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.UTC)},
-	{"20100102030405", false, time.Time{}},
-	{"20100102030405+0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", 6*60*60+7*60))},
-	{"20100102030405-0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", -6*60*60-7*60))},
-	/* These are invalid times. However, the time package normalises times
-	 * and they were accepted in some versions. See #11134. */
-	{"00000100000000Z", false, time.Time{}},
-	{"20101302030405Z", false, time.Time{}},
-	{"20100002030405Z", false, time.Time{}},
-	{"20100100030405Z", false, time.Time{}},
-	{"20100132030405Z", false, time.Time{}},
-	{"20100231030405Z", false, time.Time{}},
-	{"20100102240405Z", false, time.Time{}},
-	{"20100102036005Z", false, time.Time{}},
-	{"20100102030460Z", false, time.Time{}},
-	{"-20100102030410Z", false, time.Time{}},
-	{"2010-0102030410Z", false, time.Time{}},
-	{"2010-0002030410Z", false, time.Time{}},
-	{"201001-02030410Z", false, time.Time{}},
-	{"20100102-030410Z", false, time.Time{}},
-	{"2010010203-0410Z", false, time.Time{}},
-	{"201001020304-10Z", false, time.Time{}},
-}
-
-func TestGeneralizedTime(t *testing.T) {
-	for i, test := range generalizedTimeTestData {
-		ret, err := parseGeneralizedTime([]byte(test.in))
-		if (err == nil) != test.ok {
-			t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
-		}
-		if err == nil {
-			if !reflect.DeepEqual(test.out, ret) {
-				t.Errorf("#%d: Bad result: %q → %v (expected %v)", i, test.in, ret, test.out)
-			}
-		}
-	}
-}
-
-type tagAndLengthTest struct {
-	in  []byte
-	ok  bool
-	out tagAndLength
-}
-
-var tagAndLengthData = []tagAndLengthTest{
-	{[]byte{0x80, 0x01}, true, tagAndLength{2, 0, 1, false}},
-	{[]byte{0xa0, 0x01}, true, tagAndLength{2, 0, 1, true}},
-	{[]byte{0x02, 0x00}, true, tagAndLength{0, 2, 0, false}},
-	{[]byte{0xfe, 0x00}, true, tagAndLength{3, 30, 0, true}},
-	{[]byte{0x1f, 0x01, 0x00}, true, tagAndLength{0, 1, 0, false}},
-	{[]byte{0x1f, 0x81, 0x00, 0x00}, true, tagAndLength{0, 128, 0, false}},
-	{[]byte{0x1f, 0x81, 0x80, 0x01, 0x00}, true, tagAndLength{0, 0x4001, 0, false}},
-	{[]byte{0x00, 0x81, 0x01}, true, tagAndLength{0, 0, 1, false}},
-	{[]byte{0x00, 0x82, 0x01, 0x00}, true, tagAndLength{0, 0, 256, false}},
-	{[]byte{0x00, 0x83, 0x01, 0x00}, false, tagAndLength{}},
-	{[]byte{0x1f, 0x85}, false, tagAndLength{}},
-	{[]byte{0x30, 0x80}, false, tagAndLength{}},
-	// Superfluous zeros in the length should be an error.
-	{[]byte{0xa0, 0x82, 0x00, 0x01}, false, tagAndLength{}},
-	// Lengths up to the maximum size of an int should work.
-	{[]byte{0xa0, 0x84, 0x7f, 0xff, 0xff, 0xff}, true, tagAndLength{2, 0, 0x7fffffff, true}},
-	// Lengths that would overflow an int should be rejected.
-	{[]byte{0xa0, 0x84, 0x80, 0x00, 0x00, 0x00}, false, tagAndLength{}},
-}
-
-func TestParseTagAndLength(t *testing.T) {
-	for i, test := range tagAndLengthData {
-		tagAndLength, _, err := parseTagAndLength(test.in, 0)
-		if (err == nil) != test.ok {
-			t.Errorf("#%d: Incorrect error result (did pass? %v, expected: %v)", i, err == nil, test.ok)
-		}
-		if err == nil && !reflect.DeepEqual(test.out, tagAndLength) {
-			t.Errorf("#%d: Bad result: %v (expected %v)", i, tagAndLength, test.out)
-		}
-	}
-}
-
-type parseFieldParametersTest struct {
-	in  string
-	out fieldParameters
-}
-
-func newInt(n int) *int { return &n }
-
-func newInt64(n int64) *int64 { return &n }
-
-func newString(s string) *string { return &s }
-
-func newBool(b bool) *bool { return &b }
-
-var parseFieldParametersTestData []parseFieldParametersTest = []parseFieldParametersTest{
-	{"", fieldParameters{}},
-	{"ia5", fieldParameters{stringType: tagIA5String}},
-	{"generalized", fieldParameters{timeType: tagGeneralizedTime}},
-	{"utc", fieldParameters{timeType: tagUTCTime}},
-	{"printable", fieldParameters{stringType: tagPrintableString}},
-	{"optional", fieldParameters{optional: true}},
-	{"explicit", fieldParameters{explicit: true, tag: new(int)}},
-	{"application", fieldParameters{application: true, tag: new(int)}},
-	{"optional,explicit", fieldParameters{optional: true, explicit: true, tag: new(int)}},
-	{"default:42", fieldParameters{defaultValue: newInt64(42)}},
-	{"tag:17", fieldParameters{tag: newInt(17)}},
-	{"optional,explicit,default:42,tag:17", fieldParameters{optional: true, explicit: true, defaultValue: newInt64(42), tag: newInt(17)}},
-	{"optional,explicit,default:42,tag:17,rubbish1", fieldParameters{true, true, false, newInt64(42), newInt(17), 0, 0, false, false}},
-	{"set", fieldParameters{set: true}},
-}
-
-func TestParseFieldParameters(t *testing.T) {
-	for i, test := range parseFieldParametersTestData {
-		f := parseFieldParameters(test.in)
-		if !reflect.DeepEqual(f, test.out) {
-			t.Errorf("#%d: Bad result: %v (expected %v)", i, f, test.out)
-		}
-	}
-}
-
-type TestObjectIdentifierStruct struct {
-	OID ObjectIdentifier
-}
-
-type TestContextSpecificTags struct {
-	A int `asn1:"tag:1"`
-}
-
-type TestContextSpecificTags2 struct {
-	A int `asn1:"explicit,tag:1"`
-	B int
-}
-
-type TestContextSpecificTags3 struct {
-	S string `asn1:"tag:1,utf8"`
-}
-
-type TestElementsAfterString struct {
-	S    string
-	A, B int
-}
-
-type TestBigInt struct {
-	X *big.Int
-}
-
-type TestSet struct {
-	Ints []int `asn1:"set"`
-}
-
-var unmarshalTestData = []struct {
-	in  []byte
-	out interface{}
-}{
-	{[]byte{0x02, 0x01, 0x42}, newInt(0x42)},
-	{[]byte{0x30, 0x08, 0x06, 0x06, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d}, &TestObjectIdentifierStruct{[]int{1, 2, 840, 113549}}},
-	{[]byte{0x03, 0x04, 0x06, 0x6e, 0x5d, 0xc0}, &BitString{[]byte{110, 93, 192}, 18}},
-	{[]byte{0x30, 0x09, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x03}, &[]int{1, 2, 3}},
-	{[]byte{0x02, 0x01, 0x10}, newInt(16)},
-	{[]byte{0x13, 0x04, 't', 'e', 's', 't'}, newString("test")},
-	{[]byte{0x16, 0x04, 't', 'e', 's', 't'}, newString("test")},
-	{[]byte{0x16, 0x04, 't', 'e', 's', 't'}, &RawValue{0, 22, false, []byte("test"), []byte("\x16\x04test")}},
-	{[]byte{0x04, 0x04, 1, 2, 3, 4}, &RawValue{0, 4, false, []byte{1, 2, 3, 4}, []byte{4, 4, 1, 2, 3, 4}}},
-	{[]byte{0x30, 0x03, 0x81, 0x01, 0x01}, &TestContextSpecificTags{1}},
-	{[]byte{0x30, 0x08, 0xa1, 0x03, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02}, &TestContextSpecificTags2{1, 2}},
-	{[]byte{0x30, 0x03, 0x81, 0x01, '@'}, &TestContextSpecificTags3{"@"}},
-	{[]byte{0x01, 0x01, 0x00}, newBool(false)},
-	{[]byte{0x01, 0x01, 0xff}, newBool(true)},
-	{[]byte{0x30, 0x0b, 0x13, 0x03, 0x66, 0x6f, 0x6f, 0x02, 0x01, 0x22, 0x02, 0x01, 0x33}, &TestElementsAfterString{"foo", 0x22, 0x33}},
-	{[]byte{0x30, 0x05, 0x02, 0x03, 0x12, 0x34, 0x56}, &TestBigInt{big.NewInt(0x123456)}},
-	{[]byte{0x30, 0x0b, 0x31, 0x09, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x03}, &TestSet{Ints: []int{1, 2, 3}}},
-}
-
-func TestUnmarshal(t *testing.T) {
-	for i, test := range unmarshalTestData {
-		pv := reflect.New(reflect.TypeOf(test.out).Elem())
-		val := pv.Interface()
-		_, err := Unmarshal(test.in, val)
-		if err != nil {
-			t.Errorf("Unmarshal failed at index %d %v", i, err)
-		}
-		if !reflect.DeepEqual(val, test.out) {
-			t.Errorf("#%d:\nhave %#v\nwant %#v", i, val, test.out)
-		}
-	}
-}
-
-type Certificate struct {
-	TBSCertificate     TBSCertificate
-	SignatureAlgorithm AlgorithmIdentifier
-	SignatureValue     BitString
-}
-
-type TBSCertificate struct {
-	Version            int `asn1:"optional,explicit,default:0,tag:0"`
-	SerialNumber       RawValue
-	SignatureAlgorithm AlgorithmIdentifier
-	Issuer             RDNSequence
-	Validity           Validity
-	Subject            RDNSequence
-	PublicKey          PublicKeyInfo
-}
-
-type AlgorithmIdentifier struct {
-	Algorithm ObjectIdentifier
-}
-
-type RDNSequence []RelativeDistinguishedNameSET
-
-type RelativeDistinguishedNameSET []AttributeTypeAndValue
-
-type AttributeTypeAndValue struct {
-	Type  ObjectIdentifier
-	Value interface{}
-}
-
-type Validity struct {
-	NotBefore, NotAfter time.Time
-}
-
-type PublicKeyInfo struct {
-	Algorithm AlgorithmIdentifier
-	PublicKey BitString
-}
-
-func TestCertificate(t *testing.T) {
-	// This is a minimal, self-signed certificate that should parse correctly.
-	var cert Certificate
-	if _, err := Unmarshal(derEncodedSelfSignedCertBytes, &cert); err != nil {
-		t.Errorf("Unmarshal failed: %v", err)
-	}
-	if !reflect.DeepEqual(cert, derEncodedSelfSignedCert) {
-		t.Errorf("Bad result:\ngot: %+v\nwant: %+v", cert, derEncodedSelfSignedCert)
-	}
-}
-
-func TestCertificateWithNUL(t *testing.T) {
-	// This is the paypal NUL-hack certificate. It should fail to parse because
-	// NUL isn't a permitted character in a PrintableString.
-
-	var cert Certificate
-	if _, err := Unmarshal(derEncodedPaypalNULCertBytes, &cert); err == nil {
-		t.Error("Unmarshal succeeded, should not have")
-	}
-}
-
-type rawStructTest struct {
-	Raw RawContent
-	A   int
-}
-
-func TestRawStructs(t *testing.T) {
-	var s rawStructTest
-	input := []byte{0x30, 0x03, 0x02, 0x01, 0x50}
-
-	rest, err := Unmarshal(input, &s)
-	if len(rest) != 0 {
-		t.Errorf("incomplete parse: %x", rest)
-		return
-	}
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	if s.A != 0x50 {
-		t.Errorf("bad value for A: got %d want %d", s.A, 0x50)
-	}
-	if !bytes.Equal([]byte(s.Raw), input) {
-		t.Errorf("bad value for Raw: got %x want %x", s.Raw, input)
-	}
-}
-
-type oiEqualTest struct {
-	first  ObjectIdentifier
-	second ObjectIdentifier
-	same   bool
-}
-
-var oiEqualTests = []oiEqualTest{
-	{
-		ObjectIdentifier{1, 2, 3},
-		ObjectIdentifier{1, 2, 3},
-		true,
-	},
-	{
-		ObjectIdentifier{1},
-		ObjectIdentifier{1, 2, 3},
-		false,
-	},
-	{
-		ObjectIdentifier{1, 2, 3},
-		ObjectIdentifier{10, 11, 12},
-		false,
-	},
-}
-
-func TestObjectIdentifierEqual(t *testing.T) {
-	for _, o := range oiEqualTests {
-		if s := o.first.Equal(o.second); s != o.same {
-			t.Errorf("ObjectIdentifier.Equal: got: %t want: %t", s, o.same)
-		}
-	}
-}
-
-var derEncodedSelfSignedCert = Certificate{
-	TBSCertificate: TBSCertificate{
-		Version:            0,
-		SerialNumber:       RawValue{Class: 0, Tag: 2, IsCompound: false, Bytes: []uint8{0x0, 0x8c, 0xc3, 0x37, 0x92, 0x10, 0xec, 0x2c, 0x98}, FullBytes: []byte{2, 9, 0x0, 0x8c, 0xc3, 0x37, 0x92, 0x10, 0xec, 0x2c, 0x98}},
-		SignatureAlgorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5}},
-		Issuer: RDNSequence{
-			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 6}, Value: "XX"}},
-			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 8}, Value: "Some-State"}},
-			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 7}, Value: "City"}},
-			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 10}, Value: "Internet Widgits Pty Ltd"}},
-			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 3}, Value: "false.example.com"}},
-			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{1, 2, 840, 113549, 1, 9, 1}, Value: "false@example.com"}},
-		},
-		Validity: Validity{
-			NotBefore: time.Date(2009, 10, 8, 00, 25, 53, 0, time.UTC),
-			NotAfter:  time.Date(2010, 10, 8, 00, 25, 53, 0, time.UTC),
-		},
-		Subject: RDNSequence{
-			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 6}, Value: "XX"}},
-			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 8}, Value: "Some-State"}},
-			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 7}, Value: "City"}},
-			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 10}, Value: "Internet Widgits Pty Ltd"}},
-			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 3}, Value: "false.example.com"}},
-			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{1, 2, 840, 113549, 1, 9, 1}, Value: "false@example.com"}},
-		},
-		PublicKey: PublicKeyInfo{
-			Algorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1}},
-			PublicKey: BitString{
-				Bytes: []uint8{
-					0x30, 0x48, 0x2, 0x41, 0x0, 0xcd, 0xb7,
-					0x63, 0x9c, 0x32, 0x78, 0xf0, 0x6, 0xaa, 0x27, 0x7f, 0x6e, 0xaf, 0x42,
-					0x90, 0x2b, 0x59, 0x2d, 0x8c, 0xbc, 0xbe, 0x38, 0xa1, 0xc9, 0x2b, 0xa4,
-					0x69, 0x5a, 0x33, 0x1b, 0x1d, 0xea, 0xde, 0xad, 0xd8, 0xe9, 0xa5, 0xc2,
-					0x7e, 0x8c, 0x4c, 0x2f, 0xd0, 0xa8, 0x88, 0x96, 0x57, 0x72, 0x2a, 0x4f,
-					0x2a, 0xf7, 0x58, 0x9c, 0xf2, 0xc7, 0x70, 0x45, 0xdc, 0x8f, 0xde, 0xec,
-					0x35, 0x7d, 0x2, 0x3, 0x1, 0x0, 0x1,
-				},
-				BitLength: 592,
-			},
-		},
-	},
-	SignatureAlgorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5}},
-	SignatureValue: BitString{
-		Bytes: []uint8{
-			0xa6, 0x7b, 0x6, 0xec, 0x5e, 0xce,
-			0x92, 0x77, 0x2c, 0xa4, 0x13, 0xcb, 0xa3, 0xca, 0x12, 0x56, 0x8f, 0xdc, 0x6c,
-			0x7b, 0x45, 0x11, 0xcd, 0x40, 0xa7, 0xf6, 0x59, 0x98, 0x4, 0x2, 0xdf, 0x2b,
-			0x99, 0x8b, 0xb9, 0xa4, 0xa8, 0xcb, 0xeb, 0x34, 0xc0, 0xf0, 0xa7, 0x8c, 0xf8,
-			0xd9, 0x1e, 0xde, 0x14, 0xa5, 0xed, 0x76, 0xbf, 0x11, 0x6f, 0xe3, 0x60, 0xaa,
-			0xfa, 0x88, 0x21, 0x49, 0x4, 0x35,
-		},
-		BitLength: 512,
-	},
-}
-
-var derEncodedSelfSignedCertBytes = []byte{
-	0x30, 0x82, 0x02, 0x18, 0x30,
-	0x82, 0x01, 0xc2, 0x02, 0x09, 0x00, 0x8c, 0xc3, 0x37, 0x92, 0x10, 0xec, 0x2c,
-	0x98, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
-	0x05, 0x05, 0x00, 0x30, 0x81, 0x92, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
-	0x04, 0x06, 0x13, 0x02, 0x58, 0x58, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55,
-	0x04, 0x08, 0x13, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74,
-	0x65, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x04, 0x43,
-	0x69, 0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,
-	0x18, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64,
-	0x67, 0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x31,
-	0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x66, 0x61, 0x6c,
-	0x73, 0x65, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f,
-	0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
-	0x01, 0x09, 0x01, 0x16, 0x11, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x40, 0x65, 0x78,
-	0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d,
-	0x30, 0x39, 0x31, 0x30, 0x30, 0x38, 0x30, 0x30, 0x32, 0x35, 0x35, 0x33, 0x5a,
-	0x17, 0x0d, 0x31, 0x30, 0x31, 0x30, 0x30, 0x38, 0x30, 0x30, 0x32, 0x35, 0x35,
-	0x33, 0x5a, 0x30, 0x81, 0x92, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
-	0x06, 0x13, 0x02, 0x58, 0x58, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04,
-	0x08, 0x13, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74, 0x65,
-	0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x04, 0x43, 0x69,
-	0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18,
-	0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 0x67,
-	0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x1a,
-	0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x66, 0x61, 0x6c, 0x73,
-	0x65, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d,
-	0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
-	0x09, 0x01, 0x16, 0x11, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x40, 0x65, 0x78, 0x61,
-	0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x5c, 0x30, 0x0d, 0x06,
-	0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,
-	0x4b, 0x00, 0x30, 0x48, 0x02, 0x41, 0x00, 0xcd, 0xb7, 0x63, 0x9c, 0x32, 0x78,
-	0xf0, 0x06, 0xaa, 0x27, 0x7f, 0x6e, 0xaf, 0x42, 0x90, 0x2b, 0x59, 0x2d, 0x8c,
-	0xbc, 0xbe, 0x38, 0xa1, 0xc9, 0x2b, 0xa4, 0x69, 0x5a, 0x33, 0x1b, 0x1d, 0xea,
-	0xde, 0xad, 0xd8, 0xe9, 0xa5, 0xc2, 0x7e, 0x8c, 0x4c, 0x2f, 0xd0, 0xa8, 0x88,
-	0x96, 0x57, 0x72, 0x2a, 0x4f, 0x2a, 0xf7, 0x58, 0x9c, 0xf2, 0xc7, 0x70, 0x45,
-	0xdc, 0x8f, 0xde, 0xec, 0x35, 0x7d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d,
-	0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,
-	0x03, 0x41, 0x00, 0xa6, 0x7b, 0x06, 0xec, 0x5e, 0xce, 0x92, 0x77, 0x2c, 0xa4,
-	0x13, 0xcb, 0xa3, 0xca, 0x12, 0x56, 0x8f, 0xdc, 0x6c, 0x7b, 0x45, 0x11, 0xcd,
-	0x40, 0xa7, 0xf6, 0x59, 0x98, 0x04, 0x02, 0xdf, 0x2b, 0x99, 0x8b, 0xb9, 0xa4,
-	0xa8, 0xcb, 0xeb, 0x34, 0xc0, 0xf0, 0xa7, 0x8c, 0xf8, 0xd9, 0x1e, 0xde, 0x14,
-	0xa5, 0xed, 0x76, 0xbf, 0x11, 0x6f, 0xe3, 0x60, 0xaa, 0xfa, 0x88, 0x21, 0x49,
-	0x04, 0x35,
-}
-
-var derEncodedPaypalNULCertBytes = []byte{
-	0x30, 0x82, 0x06, 0x44, 0x30,
-	0x82, 0x05, 0xad, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x00, 0xf0, 0x9b,
-	0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
-	0x05, 0x00, 0x30, 0x82, 0x01, 0x12, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
-	0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55,
-	0x04, 0x08, 0x13, 0x09, 0x42, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x6f, 0x6e, 0x61,
-	0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x09, 0x42, 0x61,
-	0x72, 0x63, 0x65, 0x6c, 0x6f, 0x6e, 0x61, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03,
-	0x55, 0x04, 0x0a, 0x13, 0x20, 0x49, 0x50, 0x53, 0x20, 0x43, 0x65, 0x72, 0x74,
-	0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74,
-	0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x73, 0x2e, 0x6c, 0x2e, 0x31, 0x2e,
-	0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x14, 0x25, 0x67, 0x65, 0x6e, 0x65,
-	0x72, 0x61, 0x6c, 0x40, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d,
-	0x20, 0x43, 0x2e, 0x49, 0x2e, 0x46, 0x2e, 0x20, 0x20, 0x42, 0x2d, 0x42, 0x36,
-	0x32, 0x32, 0x31, 0x30, 0x36, 0x39, 0x35, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03,
-	0x55, 0x04, 0x0b, 0x13, 0x25, 0x69, 0x70, 0x73, 0x43, 0x41, 0x20, 0x43, 0x4c,
-	0x41, 0x53, 0x45, 0x41, 0x31, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
-	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,
-	0x69, 0x74, 0x79, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
-	0x25, 0x69, 0x70, 0x73, 0x43, 0x41, 0x20, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41,
-	0x31, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31,
-	0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09,
-	0x01, 0x16, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x40, 0x69, 0x70,
-	0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39,
-	0x30, 0x32, 0x32, 0x34, 0x32, 0x33, 0x30, 0x34, 0x31, 0x37, 0x5a, 0x17, 0x0d,
-	0x31, 0x31, 0x30, 0x32, 0x32, 0x34, 0x32, 0x33, 0x30, 0x34, 0x31, 0x37, 0x5a,
-	0x30, 0x81, 0x94, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
-	0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13,
-	0x0a, 0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x31, 0x16,
-	0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0d, 0x53, 0x61, 0x6e, 0x20,
-	0x46, 0x72, 0x61, 0x6e, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x31, 0x11, 0x30, 0x0f,
-	0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69,
-	0x74, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0b,
-	0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x31, 0x2f,
-	0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x26, 0x77, 0x77, 0x77, 0x2e,
-	0x70, 0x61, 0x79, 0x70, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x73, 0x73,
-	0x6c, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
-	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x63, 0x63, 0x30, 0x81, 0x9f, 0x30, 0x0d,
-	0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,
-	0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xd2, 0x69,
-	0xfa, 0x6f, 0x3a, 0x00, 0xb4, 0x21, 0x1b, 0xc8, 0xb1, 0x02, 0xd7, 0x3f, 0x19,
-	0xb2, 0xc4, 0x6d, 0xb4, 0x54, 0xf8, 0x8b, 0x8a, 0xcc, 0xdb, 0x72, 0xc2, 0x9e,
-	0x3c, 0x60, 0xb9, 0xc6, 0x91, 0x3d, 0x82, 0xb7, 0x7d, 0x99, 0xff, 0xd1, 0x29,
-	0x84, 0xc1, 0x73, 0x53, 0x9c, 0x82, 0xdd, 0xfc, 0x24, 0x8c, 0x77, 0xd5, 0x41,
-	0xf3, 0xe8, 0x1e, 0x42, 0xa1, 0xad, 0x2d, 0x9e, 0xff, 0x5b, 0x10, 0x26, 0xce,
-	0x9d, 0x57, 0x17, 0x73, 0x16, 0x23, 0x38, 0xc8, 0xd6, 0xf1, 0xba, 0xa3, 0x96,
-	0x5b, 0x16, 0x67, 0x4a, 0x4f, 0x73, 0x97, 0x3a, 0x4d, 0x14, 0xa4, 0xf4, 0xe2,
-	0x3f, 0x8b, 0x05, 0x83, 0x42, 0xd1, 0xd0, 0xdc, 0x2f, 0x7a, 0xe5, 0xb6, 0x10,
-	0xb2, 0x11, 0xc0, 0xdc, 0x21, 0x2a, 0x90, 0xff, 0xae, 0x97, 0x71, 0x5a, 0x49,
-	0x81, 0xac, 0x40, 0xf3, 0x3b, 0xb8, 0x59, 0xb2, 0x4f, 0x02, 0x03, 0x01, 0x00,
-	0x01, 0xa3, 0x82, 0x03, 0x21, 0x30, 0x82, 0x03, 0x1d, 0x30, 0x09, 0x06, 0x03,
-	0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86,
-	0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x06, 0x40,
-	0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x03, 0xf8,
-	0x30, 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08,
-	0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x30, 0x1d, 0x06, 0x03, 0x55,
-	0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x61, 0x8f, 0x61, 0x34, 0x43, 0x55, 0x14,
-	0x7f, 0x27, 0x09, 0xce, 0x4c, 0x8b, 0xea, 0x9b, 0x7b, 0x19, 0x25, 0xbc, 0x6e,
-	0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14,
-	0x0e, 0x07, 0x60, 0xd4, 0x39, 0xc9, 0x1b, 0x5b, 0x5d, 0x90, 0x7b, 0x23, 0xc8,
-	0xd2, 0x34, 0x9d, 0x4a, 0x9a, 0x46, 0x39, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d,
-	0x11, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x1d, 0x12, 0x04,
-	0x15, 0x30, 0x13, 0x81, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x40,
-	0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x72, 0x06, 0x09,
-	0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x0d, 0x04, 0x65, 0x16, 0x63,
-	0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
-	0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e,
-	0x4f, 0x54, 0x20, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x45, 0x44, 0x2e,
-	0x20, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x20, 0x53, 0x65, 0x72, 0x76,
-	0x65, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
-	0x65, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x68,
-	0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70,
-	0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x2f, 0x06, 0x09, 0x60,
-	0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x02, 0x04, 0x22, 0x16, 0x20, 0x68,
-	0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70,
-	0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61,
-	0x32, 0x30, 0x30, 0x32, 0x2f, 0x30, 0x43, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01,
-	0x86, 0xf8, 0x42, 0x01, 0x04, 0x04, 0x36, 0x16, 0x34, 0x68, 0x74, 0x74, 0x70,
-	0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61,
-	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30,
-	0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x43, 0x4c,
-	0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x46, 0x06, 0x09,
-	0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x03, 0x04, 0x39, 0x16, 0x37,
-	0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69,
-	0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63,
-	0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x68, 0x74,
-	0x6d, 0x6c, 0x3f, 0x30, 0x43, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8,
-	0x42, 0x01, 0x07, 0x04, 0x36, 0x16, 0x34, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a,
-	0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63,
-	0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f,
-	0x72, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41,
-	0x31, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3f, 0x30, 0x41, 0x06, 0x09, 0x60, 0x86,
-	0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x08, 0x04, 0x34, 0x16, 0x32, 0x68, 0x74,
-	0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73,
-	0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32,
-	0x30, 0x30, 0x32, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x4c, 0x41,
-	0x53, 0x45, 0x41, 0x31, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x30, 0x81, 0x83, 0x06,
-	0x03, 0x55, 0x1d, 0x1f, 0x04, 0x7c, 0x30, 0x7a, 0x30, 0x39, 0xa0, 0x37, 0xa0,
-	0x35, 0x86, 0x33, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
-	0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70,
-	0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61,
-	0x32, 0x30, 0x30, 0x32, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63,
-	0x72, 0x6c, 0x30, 0x3d, 0xa0, 0x3b, 0xa0, 0x39, 0x86, 0x37, 0x68, 0x74, 0x74,
-	0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x62, 0x61, 0x63, 0x6b, 0x2e, 0x69,
-	0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63,
-	0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30,
-	0x30, 0x32, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63, 0x72, 0x6c,
-	0x30, 0x32, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04,
-	0x26, 0x30, 0x24, 0x30, 0x22, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07,
-	0x30, 0x01, 0x86, 0x16, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63,
-	0x73, 0x70, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
-	0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
-	0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x68, 0xee, 0x79, 0x97, 0x97, 0xdd, 0x3b,
-	0xef, 0x16, 0x6a, 0x06, 0xf2, 0x14, 0x9a, 0x6e, 0xcd, 0x9e, 0x12, 0xf7, 0xaa,
-	0x83, 0x10, 0xbd, 0xd1, 0x7c, 0x98, 0xfa, 0xc7, 0xae, 0xd4, 0x0e, 0x2c, 0x9e,
-	0x38, 0x05, 0x9d, 0x52, 0x60, 0xa9, 0x99, 0x0a, 0x81, 0xb4, 0x98, 0x90, 0x1d,
-	0xae, 0xbb, 0x4a, 0xd7, 0xb9, 0xdc, 0x88, 0x9e, 0x37, 0x78, 0x41, 0x5b, 0xf7,
-	0x82, 0xa5, 0xf2, 0xba, 0x41, 0x25, 0x5a, 0x90, 0x1a, 0x1e, 0x45, 0x38, 0xa1,
-	0x52, 0x58, 0x75, 0x94, 0x26, 0x44, 0xfb, 0x20, 0x07, 0xba, 0x44, 0xcc, 0xe5,
-	0x4a, 0x2d, 0x72, 0x3f, 0x98, 0x47, 0xf6, 0x26, 0xdc, 0x05, 0x46, 0x05, 0x07,
-	0x63, 0x21, 0xab, 0x46, 0x9b, 0x9c, 0x78, 0xd5, 0x54, 0x5b, 0x3d, 0x0c, 0x1e,
-	0xc8, 0x64, 0x8c, 0xb5, 0x50, 0x23, 0x82, 0x6f, 0xdb, 0xb8, 0x22, 0x1c, 0x43,
-	0x96, 0x07, 0xa8, 0xbb,
-}
-
-var stringSliceTestData = [][]string{
-	{"foo", "bar"},
-	{"foo", "\\bar"},
-	{"foo", "\"bar\""},
-	{"foo", "åäö"},
-}
-
-func TestStringSlice(t *testing.T) {
-	for _, test := range stringSliceTestData {
-		bs, err := Marshal(test)
-		if err != nil {
-			t.Error(err)
-		}
-
-		var res []string
-		_, err = Unmarshal(bs, &res)
-		if err != nil {
-			t.Error(err)
-		}
-
-		if fmt.Sprintf("%v", res) != fmt.Sprintf("%v", test) {
-			t.Errorf("incorrect marshal/unmarshal; %v != %v", res, test)
-		}
-	}
-}
-
-type explicitTaggedTimeTest struct {
-	Time time.Time `asn1:"explicit,tag:0"`
-}
-
-var explicitTaggedTimeTestData = []struct {
-	in  []byte
-	out explicitTaggedTimeTest
-}{
-	{[]byte{0x30, 0x11, 0xa0, 0xf, 0x17, 0xd, '9', '1', '0', '5', '0', '6', '1', '6', '4', '5', '4', '0', 'Z'},
-		explicitTaggedTimeTest{time.Date(1991, 05, 06, 16, 45, 40, 0, time.UTC)}},
-	{[]byte{0x30, 0x17, 0xa0, 0xf, 0x18, 0x13, '2', '0', '1', '0', '0', '1', '0', '2', '0', '3', '0', '4', '0', '5', '+', '0', '6', '0', '7'},
-		explicitTaggedTimeTest{time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", 6*60*60+7*60))}},
-}
-
-func TestExplicitTaggedTime(t *testing.T) {
-	// Test that a time.Time will match either tagUTCTime or
-	// tagGeneralizedTime.
-	for i, test := range explicitTaggedTimeTestData {
-		var got explicitTaggedTimeTest
-		_, err := Unmarshal(test.in, &got)
-		if err != nil {
-			t.Errorf("Unmarshal failed at index %d %v", i, err)
-		}
-		if !got.Time.Equal(test.out.Time) {
-			t.Errorf("#%d: got %v, want %v", i, got.Time, test.out.Time)
-		}
-	}
-}
-
-type implicitTaggedTimeTest struct {
-	Time time.Time `asn1:"tag:24"`
-}
-
-func TestImplicitTaggedTime(t *testing.T) {
-	// An implicitly tagged time value, that happens to have an implicit
-	// tag equal to a GENERALIZEDTIME, should still be parsed as a UTCTime.
-	// (There's no "timeType" in fieldParameters to determine what type of
-	// time should be expected when implicitly tagged.)
-	der := []byte{0x30, 0x0f, 0x80 | 24, 0xd, '9', '1', '0', '5', '0', '6', '1', '6', '4', '5', '4', '0', 'Z'}
-	var result implicitTaggedTimeTest
-	if _, err := Unmarshal(der, &result); err != nil {
-		t.Fatalf("Error while parsing: %s", err)
-	}
-	if expected := time.Date(1991, 05, 06, 16, 45, 40, 0, time.UTC); !result.Time.Equal(expected) {
-		t.Errorf("Wrong result. Got %v, want %v", result.Time, expected)
-	}
-}
-
-type truncatedExplicitTagTest struct {
-	Test int `asn1:"explicit,tag:0"`
-}
-
-func TestTruncatedExplicitTag(t *testing.T) {
-	// This crashed Unmarshal in the past. See #11154.
-	der := []byte{
-		0x30, // SEQUENCE
-		0x02, // two bytes long
-		0xa0, // context-specific, tag 0
-		0x30, // 48 bytes long
-	}
-
-	var result truncatedExplicitTagTest
-	if _, err := Unmarshal(der, &result); err == nil {
-		t.Error("Unmarshal returned without error")
-	}
-}
-
-type invalidUTF8Test struct {
-	Str string `asn1:"utf8"`
-}
-
-func TestUnmarshalInvalidUTF8(t *testing.T) {
-	data := []byte("0\x05\f\x03a\xc9c")
-	var result invalidUTF8Test
-	_, err := Unmarshal(data, &result)
-
-	const expectedSubstring = "UTF"
-	if err == nil {
-		t.Fatal("Successfully unmarshaled invalid UTF-8 data")
-	} else if !strings.Contains(err.Error(), expectedSubstring) {
-		t.Fatalf("Expected error to mention %q but error was %q", expectedSubstring, err.Error())
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/asn1/common.go b/third_party/gofrontend/libgo/go/encoding/asn1/common.go
deleted file mode 100644
index ab85e04..0000000
--- a/third_party/gofrontend/libgo/go/encoding/asn1/common.go
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package asn1
-
-import (
-	"reflect"
-	"strconv"
-	"strings"
-)
-
-// ASN.1 objects have metadata preceding them:
-//   the tag: the type of the object
-//   a flag denoting if this object is compound or not
-//   the class type: the namespace of the tag
-//   the length of the object, in bytes
-
-// Here are some standard tags and classes
-
-const (
-	tagBoolean         = 1
-	tagInteger         = 2
-	tagBitString       = 3
-	tagOctetString     = 4
-	tagOID             = 6
-	tagEnum            = 10
-	tagUTF8String      = 12
-	tagSequence        = 16
-	tagSet             = 17
-	tagPrintableString = 19
-	tagT61String       = 20
-	tagIA5String       = 22
-	tagUTCTime         = 23
-	tagGeneralizedTime = 24
-	tagGeneralString   = 27
-)
-
-const (
-	classUniversal       = 0
-	classApplication     = 1
-	classContextSpecific = 2
-	classPrivate         = 3
-)
-
-type tagAndLength struct {
-	class, tag, length int
-	isCompound         bool
-}
-
-// ASN.1 has IMPLICIT and EXPLICIT tags, which can be translated as "instead
-// of" and "in addition to". When not specified, every primitive type has a
-// default tag in the UNIVERSAL class.
-//
-// For example: a BIT STRING is tagged [UNIVERSAL 3] by default (although ASN.1
-// doesn't actually have a UNIVERSAL keyword). However, by saying [IMPLICIT
-// CONTEXT-SPECIFIC 42], that means that the tag is replaced by another.
-//
-// On the other hand, if it said [EXPLICIT CONTEXT-SPECIFIC 10], then an
-// /additional/ tag would wrap the default tag. This explicit tag will have the
-// compound flag set.
-//
-// (This is used in order to remove ambiguity with optional elements.)
-//
-// You can layer EXPLICIT and IMPLICIT tags to an arbitrary depth, however we
-// don't support that here. We support a single layer of EXPLICIT or IMPLICIT
-// tagging with tag strings on the fields of a structure.
-
-// fieldParameters is the parsed representation of tag string from a structure field.
-type fieldParameters struct {
-	optional     bool   // true iff the field is OPTIONAL
-	explicit     bool   // true iff an EXPLICIT tag is in use.
-	application  bool   // true iff an APPLICATION tag is in use.
-	defaultValue *int64 // a default value for INTEGER typed fields (maybe nil).
-	tag          *int   // the EXPLICIT or IMPLICIT tag (maybe nil).
-	stringType   int    // the string tag to use when marshaling.
-	timeType     int    // the time tag to use when marshaling.
-	set          bool   // true iff this should be encoded as a SET
-	omitEmpty    bool   // true iff this should be omitted if empty when marshaling.
-
-	// Invariants:
-	//   if explicit is set, tag is non-nil.
-}
-
-// Given a tag string with the format specified in the package comment,
-// parseFieldParameters will parse it into a fieldParameters structure,
-// ignoring unknown parts of the string.
-func parseFieldParameters(str string) (ret fieldParameters) {
-	for _, part := range strings.Split(str, ",") {
-		switch {
-		case part == "optional":
-			ret.optional = true
-		case part == "explicit":
-			ret.explicit = true
-			if ret.tag == nil {
-				ret.tag = new(int)
-			}
-		case part == "generalized":
-			ret.timeType = tagGeneralizedTime
-		case part == "utc":
-			ret.timeType = tagUTCTime
-		case part == "ia5":
-			ret.stringType = tagIA5String
-		case part == "printable":
-			ret.stringType = tagPrintableString
-		case part == "utf8":
-			ret.stringType = tagUTF8String
-		case strings.HasPrefix(part, "default:"):
-			i, err := strconv.ParseInt(part[8:], 10, 64)
-			if err == nil {
-				ret.defaultValue = new(int64)
-				*ret.defaultValue = i
-			}
-		case strings.HasPrefix(part, "tag:"):
-			i, err := strconv.Atoi(part[4:])
-			if err == nil {
-				ret.tag = new(int)
-				*ret.tag = i
-			}
-		case part == "set":
-			ret.set = true
-		case part == "application":
-			ret.application = true
-			if ret.tag == nil {
-				ret.tag = new(int)
-			}
-		case part == "omitempty":
-			ret.omitEmpty = true
-		}
-	}
-	return
-}
-
-// Given a reflected Go type, getUniversalType returns the default tag number
-// and expected compound flag.
-func getUniversalType(t reflect.Type) (tagNumber int, isCompound, ok bool) {
-	switch t {
-	case objectIdentifierType:
-		return tagOID, false, true
-	case bitStringType:
-		return tagBitString, false, true
-	case timeType:
-		return tagUTCTime, false, true
-	case enumeratedType:
-		return tagEnum, false, true
-	case bigIntType:
-		return tagInteger, false, true
-	}
-	switch t.Kind() {
-	case reflect.Bool:
-		return tagBoolean, false, true
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return tagInteger, false, true
-	case reflect.Struct:
-		return tagSequence, true, true
-	case reflect.Slice:
-		if t.Elem().Kind() == reflect.Uint8 {
-			return tagOctetString, false, true
-		}
-		if strings.HasSuffix(t.Name(), "SET") {
-			return tagSet, true, true
-		}
-		return tagSequence, true, true
-	case reflect.String:
-		return tagPrintableString, false, true
-	}
-	return 0, false, false
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/asn1/marshal.go b/third_party/gofrontend/libgo/go/encoding/asn1/marshal.go
deleted file mode 100644
index 67a019d..0000000
--- a/third_party/gofrontend/libgo/go/encoding/asn1/marshal.go
+++ /dev/null
@@ -1,652 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package asn1
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"math/big"
-	"reflect"
-	"time"
-	"unicode/utf8"
-)
-
-// A forkableWriter is an in-memory buffer that can be
-// 'forked' to create new forkableWriters that bracket the
-// original.  After
-//    pre, post := w.fork()
-// the overall sequence of bytes represented is logically w+pre+post.
-type forkableWriter struct {
-	*bytes.Buffer
-	pre, post *forkableWriter
-}
-
-func newForkableWriter() *forkableWriter {
-	return &forkableWriter{new(bytes.Buffer), nil, nil}
-}
-
-func (f *forkableWriter) fork() (pre, post *forkableWriter) {
-	if f.pre != nil || f.post != nil {
-		panic("have already forked")
-	}
-	f.pre = newForkableWriter()
-	f.post = newForkableWriter()
-	return f.pre, f.post
-}
-
-func (f *forkableWriter) Len() (l int) {
-	l += f.Buffer.Len()
-	if f.pre != nil {
-		l += f.pre.Len()
-	}
-	if f.post != nil {
-		l += f.post.Len()
-	}
-	return
-}
-
-func (f *forkableWriter) writeTo(out io.Writer) (n int, err error) {
-	n, err = out.Write(f.Bytes())
-	if err != nil {
-		return
-	}
-
-	var nn int
-
-	if f.pre != nil {
-		nn, err = f.pre.writeTo(out)
-		n += nn
-		if err != nil {
-			return
-		}
-	}
-
-	if f.post != nil {
-		nn, err = f.post.writeTo(out)
-		n += nn
-	}
-	return
-}
-
-func marshalBase128Int(out *forkableWriter, n int64) (err error) {
-	if n == 0 {
-		err = out.WriteByte(0)
-		return
-	}
-
-	l := 0
-	for i := n; i > 0; i >>= 7 {
-		l++
-	}
-
-	for i := l - 1; i >= 0; i-- {
-		o := byte(n >> uint(i*7))
-		o &= 0x7f
-		if i != 0 {
-			o |= 0x80
-		}
-		err = out.WriteByte(o)
-		if err != nil {
-			return
-		}
-	}
-
-	return nil
-}
-
-func marshalInt64(out *forkableWriter, i int64) (err error) {
-	n := int64Length(i)
-
-	for ; n > 0; n-- {
-		err = out.WriteByte(byte(i >> uint((n-1)*8)))
-		if err != nil {
-			return
-		}
-	}
-
-	return nil
-}
-
-func int64Length(i int64) (numBytes int) {
-	numBytes = 1
-
-	for i > 127 {
-		numBytes++
-		i >>= 8
-	}
-
-	for i < -128 {
-		numBytes++
-		i >>= 8
-	}
-
-	return
-}
-
-func marshalBigInt(out *forkableWriter, n *big.Int) (err error) {
-	if n.Sign() < 0 {
-		// A negative number has to be converted to two's-complement
-		// form. So we'll subtract 1 and invert. If the
-		// most-significant-bit isn't set then we'll need to pad the
-		// beginning with 0xff in order to keep the number negative.
-		nMinus1 := new(big.Int).Neg(n)
-		nMinus1.Sub(nMinus1, bigOne)
-		bytes := nMinus1.Bytes()
-		for i := range bytes {
-			bytes[i] ^= 0xff
-		}
-		if len(bytes) == 0 || bytes[0]&0x80 == 0 {
-			err = out.WriteByte(0xff)
-			if err != nil {
-				return
-			}
-		}
-		_, err = out.Write(bytes)
-	} else if n.Sign() == 0 {
-		// Zero is written as a single 0 zero rather than no bytes.
-		err = out.WriteByte(0x00)
-	} else {
-		bytes := n.Bytes()
-		if len(bytes) > 0 && bytes[0]&0x80 != 0 {
-			// We'll have to pad this with 0x00 in order to stop it
-			// looking like a negative number.
-			err = out.WriteByte(0)
-			if err != nil {
-				return
-			}
-		}
-		_, err = out.Write(bytes)
-	}
-	return
-}
-
-func marshalLength(out *forkableWriter, i int) (err error) {
-	n := lengthLength(i)
-
-	for ; n > 0; n-- {
-		err = out.WriteByte(byte(i >> uint((n-1)*8)))
-		if err != nil {
-			return
-		}
-	}
-
-	return nil
-}
-
-func lengthLength(i int) (numBytes int) {
-	numBytes = 1
-	for i > 255 {
-		numBytes++
-		i >>= 8
-	}
-	return
-}
-
-func marshalTagAndLength(out *forkableWriter, t tagAndLength) (err error) {
-	b := uint8(t.class) << 6
-	if t.isCompound {
-		b |= 0x20
-	}
-	if t.tag >= 31 {
-		b |= 0x1f
-		err = out.WriteByte(b)
-		if err != nil {
-			return
-		}
-		err = marshalBase128Int(out, int64(t.tag))
-		if err != nil {
-			return
-		}
-	} else {
-		b |= uint8(t.tag)
-		err = out.WriteByte(b)
-		if err != nil {
-			return
-		}
-	}
-
-	if t.length >= 128 {
-		l := lengthLength(t.length)
-		err = out.WriteByte(0x80 | byte(l))
-		if err != nil {
-			return
-		}
-		err = marshalLength(out, t.length)
-		if err != nil {
-			return
-		}
-	} else {
-		err = out.WriteByte(byte(t.length))
-		if err != nil {
-			return
-		}
-	}
-
-	return nil
-}
-
-func marshalBitString(out *forkableWriter, b BitString) (err error) {
-	paddingBits := byte((8 - b.BitLength%8) % 8)
-	err = out.WriteByte(paddingBits)
-	if err != nil {
-		return
-	}
-	_, err = out.Write(b.Bytes)
-	return
-}
-
-func marshalObjectIdentifier(out *forkableWriter, oid []int) (err error) {
-	if len(oid) < 2 || oid[0] > 2 || (oid[0] < 2 && oid[1] >= 40) {
-		return StructuralError{"invalid object identifier"}
-	}
-
-	err = marshalBase128Int(out, int64(oid[0]*40+oid[1]))
-	if err != nil {
-		return
-	}
-	for i := 2; i < len(oid); i++ {
-		err = marshalBase128Int(out, int64(oid[i]))
-		if err != nil {
-			return
-		}
-	}
-
-	return
-}
-
-func marshalPrintableString(out *forkableWriter, s string) (err error) {
-	b := []byte(s)
-	for _, c := range b {
-		if !isPrintable(c) {
-			return StructuralError{"PrintableString contains invalid character"}
-		}
-	}
-
-	_, err = out.Write(b)
-	return
-}
-
-func marshalIA5String(out *forkableWriter, s string) (err error) {
-	b := []byte(s)
-	for _, c := range b {
-		if c > 127 {
-			return StructuralError{"IA5String contains invalid character"}
-		}
-	}
-
-	_, err = out.Write(b)
-	return
-}
-
-func marshalUTF8String(out *forkableWriter, s string) (err error) {
-	_, err = out.Write([]byte(s))
-	return
-}
-
-func marshalTwoDigits(out *forkableWriter, v int) (err error) {
-	err = out.WriteByte(byte('0' + (v/10)%10))
-	if err != nil {
-		return
-	}
-	return out.WriteByte(byte('0' + v%10))
-}
-
-func marshalFourDigits(out *forkableWriter, v int) (err error) {
-	var bytes [4]byte
-	for i := range bytes {
-		bytes[3-i] = '0' + byte(v%10)
-		v /= 10
-	}
-	_, err = out.Write(bytes[:])
-	return
-}
-
-func outsideUTCRange(t time.Time) bool {
-	year := t.Year()
-	return year < 1950 || year >= 2050
-}
-
-func marshalUTCTime(out *forkableWriter, t time.Time) (err error) {
-	year := t.Year()
-
-	switch {
-	case 1950 <= year && year < 2000:
-		err = marshalTwoDigits(out, int(year-1900))
-	case 2000 <= year && year < 2050:
-		err = marshalTwoDigits(out, int(year-2000))
-	default:
-		return StructuralError{"cannot represent time as UTCTime"}
-	}
-	if err != nil {
-		return
-	}
-
-	return marshalTimeCommon(out, t)
-}
-
-func marshalGeneralizedTime(out *forkableWriter, t time.Time) (err error) {
-	year := t.Year()
-	if year < 0 || year > 9999 {
-		return StructuralError{"cannot represent time as GeneralizedTime"}
-	}
-	if err = marshalFourDigits(out, year); err != nil {
-		return
-	}
-
-	return marshalTimeCommon(out, t)
-}
-
-func marshalTimeCommon(out *forkableWriter, t time.Time) (err error) {
-	_, month, day := t.Date()
-
-	err = marshalTwoDigits(out, int(month))
-	if err != nil {
-		return
-	}
-
-	err = marshalTwoDigits(out, day)
-	if err != nil {
-		return
-	}
-
-	hour, min, sec := t.Clock()
-
-	err = marshalTwoDigits(out, hour)
-	if err != nil {
-		return
-	}
-
-	err = marshalTwoDigits(out, min)
-	if err != nil {
-		return
-	}
-
-	err = marshalTwoDigits(out, sec)
-	if err != nil {
-		return
-	}
-
-	_, offset := t.Zone()
-
-	switch {
-	case offset/60 == 0:
-		err = out.WriteByte('Z')
-		return
-	case offset > 0:
-		err = out.WriteByte('+')
-	case offset < 0:
-		err = out.WriteByte('-')
-	}
-
-	if err != nil {
-		return
-	}
-
-	offsetMinutes := offset / 60
-	if offsetMinutes < 0 {
-		offsetMinutes = -offsetMinutes
-	}
-
-	err = marshalTwoDigits(out, offsetMinutes/60)
-	if err != nil {
-		return
-	}
-
-	err = marshalTwoDigits(out, offsetMinutes%60)
-	return
-}
-
-func stripTagAndLength(in []byte) []byte {
-	_, offset, err := parseTagAndLength(in, 0)
-	if err != nil {
-		return in
-	}
-	return in[offset:]
-}
-
-func marshalBody(out *forkableWriter, value reflect.Value, params fieldParameters) (err error) {
-	switch value.Type() {
-	case flagType:
-		return nil
-	case timeType:
-		t := value.Interface().(time.Time)
-		if params.timeType == tagGeneralizedTime || outsideUTCRange(t) {
-			return marshalGeneralizedTime(out, t)
-		} else {
-			return marshalUTCTime(out, t)
-		}
-	case bitStringType:
-		return marshalBitString(out, value.Interface().(BitString))
-	case objectIdentifierType:
-		return marshalObjectIdentifier(out, value.Interface().(ObjectIdentifier))
-	case bigIntType:
-		return marshalBigInt(out, value.Interface().(*big.Int))
-	}
-
-	switch v := value; v.Kind() {
-	case reflect.Bool:
-		if v.Bool() {
-			return out.WriteByte(255)
-		} else {
-			return out.WriteByte(0)
-		}
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return marshalInt64(out, int64(v.Int()))
-	case reflect.Struct:
-		t := v.Type()
-
-		startingField := 0
-
-		// If the first element of the structure is a non-empty
-		// RawContents, then we don't bother serializing the rest.
-		if t.NumField() > 0 && t.Field(0).Type == rawContentsType {
-			s := v.Field(0)
-			if s.Len() > 0 {
-				bytes := make([]byte, s.Len())
-				for i := 0; i < s.Len(); i++ {
-					bytes[i] = uint8(s.Index(i).Uint())
-				}
-				/* The RawContents will contain the tag and
-				 * length fields but we'll also be writing
-				 * those ourselves, so we strip them out of
-				 * bytes */
-				_, err = out.Write(stripTagAndLength(bytes))
-				return
-			} else {
-				startingField = 1
-			}
-		}
-
-		for i := startingField; i < t.NumField(); i++ {
-			var pre *forkableWriter
-			pre, out = out.fork()
-			err = marshalField(pre, v.Field(i), parseFieldParameters(t.Field(i).Tag.Get("asn1")))
-			if err != nil {
-				return
-			}
-		}
-		return
-	case reflect.Slice:
-		sliceType := v.Type()
-		if sliceType.Elem().Kind() == reflect.Uint8 {
-			bytes := make([]byte, v.Len())
-			for i := 0; i < v.Len(); i++ {
-				bytes[i] = uint8(v.Index(i).Uint())
-			}
-			_, err = out.Write(bytes)
-			return
-		}
-
-		var fp fieldParameters
-		for i := 0; i < v.Len(); i++ {
-			var pre *forkableWriter
-			pre, out = out.fork()
-			err = marshalField(pre, v.Index(i), fp)
-			if err != nil {
-				return
-			}
-		}
-		return
-	case reflect.String:
-		switch params.stringType {
-		case tagIA5String:
-			return marshalIA5String(out, v.String())
-		case tagPrintableString:
-			return marshalPrintableString(out, v.String())
-		default:
-			return marshalUTF8String(out, v.String())
-		}
-	}
-
-	return StructuralError{"unknown Go type"}
-}
-
-func marshalField(out *forkableWriter, v reflect.Value, params fieldParameters) (err error) {
-	// If the field is an interface{} then recurse into it.
-	if v.Kind() == reflect.Interface && v.Type().NumMethod() == 0 {
-		return marshalField(out, v.Elem(), params)
-	}
-
-	if v.Kind() == reflect.Slice && v.Len() == 0 && params.omitEmpty {
-		return
-	}
-
-	if params.optional && params.defaultValue != nil && canHaveDefaultValue(v.Kind()) {
-		defaultValue := reflect.New(v.Type()).Elem()
-		defaultValue.SetInt(*params.defaultValue)
-
-		if reflect.DeepEqual(v.Interface(), defaultValue.Interface()) {
-			return
-		}
-	}
-
-	// If no default value is given then the zero value for the type is
-	// assumed to be the default value. This isn't obviously the correct
-	// behaviour, but it's what Go has traditionally done.
-	if params.optional && params.defaultValue == nil {
-		if reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface()) {
-			return
-		}
-	}
-
-	if v.Type() == rawValueType {
-		rv := v.Interface().(RawValue)
-		if len(rv.FullBytes) != 0 {
-			_, err = out.Write(rv.FullBytes)
-		} else {
-			err = marshalTagAndLength(out, tagAndLength{rv.Class, rv.Tag, len(rv.Bytes), rv.IsCompound})
-			if err != nil {
-				return
-			}
-			_, err = out.Write(rv.Bytes)
-		}
-		return
-	}
-
-	tag, isCompound, ok := getUniversalType(v.Type())
-	if !ok {
-		err = StructuralError{fmt.Sprintf("unknown Go type: %v", v.Type())}
-		return
-	}
-	class := classUniversal
-
-	if params.timeType != 0 && tag != tagUTCTime {
-		return StructuralError{"explicit time type given to non-time member"}
-	}
-
-	if params.stringType != 0 && tag != tagPrintableString {
-		return StructuralError{"explicit string type given to non-string member"}
-	}
-
-	switch tag {
-	case tagPrintableString:
-		if params.stringType == 0 {
-			// This is a string without an explicit string type. We'll use
-			// a PrintableString if the character set in the string is
-			// sufficiently limited, otherwise we'll use a UTF8String.
-			for _, r := range v.String() {
-				if r >= utf8.RuneSelf || !isPrintable(byte(r)) {
-					if !utf8.ValidString(v.String()) {
-						return errors.New("asn1: string not valid UTF-8")
-					}
-					tag = tagUTF8String
-					break
-				}
-			}
-		} else {
-			tag = params.stringType
-		}
-	case tagUTCTime:
-		if params.timeType == tagGeneralizedTime || outsideUTCRange(v.Interface().(time.Time)) {
-			tag = tagGeneralizedTime
-		}
-	}
-
-	if params.set {
-		if tag != tagSequence {
-			return StructuralError{"non sequence tagged as set"}
-		}
-		tag = tagSet
-	}
-
-	tags, body := out.fork()
-
-	err = marshalBody(body, v, params)
-	if err != nil {
-		return
-	}
-
-	bodyLen := body.Len()
-
-	var explicitTag *forkableWriter
-	if params.explicit {
-		explicitTag, tags = tags.fork()
-	}
-
-	if !params.explicit && params.tag != nil {
-		// implicit tag.
-		tag = *params.tag
-		class = classContextSpecific
-	}
-
-	err = marshalTagAndLength(tags, tagAndLength{class, tag, bodyLen, isCompound})
-	if err != nil {
-		return
-	}
-
-	if params.explicit {
-		err = marshalTagAndLength(explicitTag, tagAndLength{
-			class:      classContextSpecific,
-			tag:        *params.tag,
-			length:     bodyLen + tags.Len(),
-			isCompound: true,
-		})
-	}
-
-	return nil
-}
-
-// Marshal returns the ASN.1 encoding of val.
-//
-// In addition to the struct tags recognised by Unmarshal, the following can be
-// used:
-//
-//	ia5:		causes strings to be marshaled as ASN.1, IA5 strings
-//	omitempty:	causes empty slices to be skipped
-//	printable:	causes strings to be marshaled as ASN.1, PrintableString strings.
-//	utf8:		causes strings to be marshaled as ASN.1, UTF8 strings
-func Marshal(val interface{}) ([]byte, error) {
-	var out bytes.Buffer
-	v := reflect.ValueOf(val)
-	f := newForkableWriter()
-	err := marshalField(f, v, fieldParameters{})
-	if err != nil {
-		return nil, err
-	}
-	_, err = f.writeTo(&out)
-	return out.Bytes(), nil
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/asn1/marshal_test.go b/third_party/gofrontend/libgo/go/encoding/asn1/marshal_test.go
deleted file mode 100644
index cdca8aa..0000000
--- a/third_party/gofrontend/libgo/go/encoding/asn1/marshal_test.go
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package asn1
-
-import (
-	"bytes"
-	"encoding/hex"
-	"math/big"
-	"testing"
-	"time"
-)
-
-type intStruct struct {
-	A int
-}
-
-type twoIntStruct struct {
-	A int
-	B int
-}
-
-type bigIntStruct struct {
-	A *big.Int
-}
-
-type nestedStruct struct {
-	A intStruct
-}
-
-type rawContentsStruct struct {
-	Raw RawContent
-	A   int
-}
-
-type implicitTagTest struct {
-	A int `asn1:"implicit,tag:5"`
-}
-
-type explicitTagTest struct {
-	A int `asn1:"explicit,tag:5"`
-}
-
-type flagTest struct {
-	A Flag `asn1:"tag:0,optional"`
-}
-
-type generalizedTimeTest struct {
-	A time.Time `asn1:"generalized"`
-}
-
-type ia5StringTest struct {
-	A string `asn1:"ia5"`
-}
-
-type printableStringTest struct {
-	A string `asn1:"printable"`
-}
-
-type optionalRawValueTest struct {
-	A RawValue `asn1:"optional"`
-}
-
-type omitEmptyTest struct {
-	A []string `asn1:"omitempty"`
-}
-
-type defaultTest struct {
-	A int `asn1:"optional,default:1"`
-}
-
-type testSET []int
-
-var PST = time.FixedZone("PST", -8*60*60)
-
-type marshalTest struct {
-	in  interface{}
-	out string // hex encoded
-}
-
-func farFuture() time.Time {
-	t, err := time.Parse(time.RFC3339, "2100-04-05T12:01:01Z")
-	if err != nil {
-		panic(err)
-	}
-	return t
-}
-
-var marshalTests = []marshalTest{
-	{10, "02010a"},
-	{127, "02017f"},
-	{128, "02020080"},
-	{-128, "020180"},
-	{-129, "0202ff7f"},
-	{intStruct{64}, "3003020140"},
-	{bigIntStruct{big.NewInt(0x123456)}, "30050203123456"},
-	{twoIntStruct{64, 65}, "3006020140020141"},
-	{nestedStruct{intStruct{127}}, "3005300302017f"},
-	{[]byte{1, 2, 3}, "0403010203"},
-	{implicitTagTest{64}, "3003850140"},
-	{explicitTagTest{64}, "3005a503020140"},
-	{flagTest{true}, "30028000"},
-	{flagTest{false}, "3000"},
-	{time.Unix(0, 0).UTC(), "170d3730303130313030303030305a"},
-	{time.Unix(1258325776, 0).UTC(), "170d3039313131353232353631365a"},
-	{time.Unix(1258325776, 0).In(PST), "17113039313131353134353631362d30383030"},
-	{farFuture(), "180f32313030303430353132303130315a"},
-	{generalizedTimeTest{time.Unix(1258325776, 0).UTC()}, "3011180f32303039313131353232353631365a"},
-	{BitString{[]byte{0x80}, 1}, "03020780"},
-	{BitString{[]byte{0x81, 0xf0}, 12}, "03030481f0"},
-	{ObjectIdentifier([]int{1, 2, 3, 4}), "06032a0304"},
-	{ObjectIdentifier([]int{1, 2, 840, 133549, 1, 1, 5}), "06092a864888932d010105"},
-	{ObjectIdentifier([]int{2, 100, 3}), "0603813403"},
-	{"test", "130474657374"},
-	{
-		"" +
-			"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
-			"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
-			"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
-			"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // This is 127 times 'x'
-		"137f" +
-			"7878787878787878787878787878787878787878787878787878787878787878" +
-			"7878787878787878787878787878787878787878787878787878787878787878" +
-			"7878787878787878787878787878787878787878787878787878787878787878" +
-			"78787878787878787878787878787878787878787878787878787878787878",
-	},
-	{
-		"" +
-			"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
-			"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
-			"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +
-			"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // This is 128 times 'x'
-		"138180" +
-			"7878787878787878787878787878787878787878787878787878787878787878" +
-			"7878787878787878787878787878787878787878787878787878787878787878" +
-			"7878787878787878787878787878787878787878787878787878787878787878" +
-			"7878787878787878787878787878787878787878787878787878787878787878",
-	},
-	{ia5StringTest{"test"}, "3006160474657374"},
-	{optionalRawValueTest{}, "3000"},
-	{printableStringTest{"test"}, "3006130474657374"},
-	{printableStringTest{"test*"}, "30071305746573742a"},
-	{rawContentsStruct{nil, 64}, "3003020140"},
-	{rawContentsStruct{[]byte{0x30, 3, 1, 2, 3}, 64}, "3003010203"},
-	{RawValue{Tag: 1, Class: 2, IsCompound: false, Bytes: []byte{1, 2, 3}}, "8103010203"},
-	{testSET([]int{10}), "310302010a"},
-	{omitEmptyTest{[]string{}}, "3000"},
-	{omitEmptyTest{[]string{"1"}}, "30053003130131"},
-	{"Σ", "0c02cea3"},
-	{defaultTest{0}, "3003020100"},
-	{defaultTest{1}, "3000"},
-	{defaultTest{2}, "3003020102"},
-}
-
-func TestMarshal(t *testing.T) {
-	for i, test := range marshalTests {
-		data, err := Marshal(test.in)
-		if err != nil {
-			t.Errorf("#%d failed: %s", i, err)
-		}
-		out, _ := hex.DecodeString(test.out)
-		if !bytes.Equal(out, data) {
-			t.Errorf("#%d got: %x want %x\n\t%q\n\t%q", i, data, out, data, out)
-
-		}
-	}
-}
-
-func TestInvalidUTF8(t *testing.T) {
-	_, err := Marshal(string([]byte{0xff, 0xff}))
-	if err == nil {
-		t.Errorf("invalid UTF8 string was accepted")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/base32/base32.go b/third_party/gofrontend/libgo/go/encoding/base32/base32.go
deleted file mode 100644
index 5a9e869..0000000
--- a/third_party/gofrontend/libgo/go/encoding/base32/base32.go
+++ /dev/null
@@ -1,426 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package base32 implements base32 encoding as specified by RFC 4648.
-package base32
-
-import (
-	"bytes"
-	"io"
-	"strconv"
-	"strings"
-)
-
-/*
- * Encodings
- */
-
-// An Encoding is a radix 32 encoding/decoding scheme, defined by a
-// 32-character alphabet.  The most common is the "base32" encoding
-// introduced for SASL GSSAPI and standardized in RFC 4648.
-// The alternate "base32hex" encoding is used in DNSSEC.
-type Encoding struct {
-	encode    string
-	decodeMap [256]byte
-}
-
-const encodeStd = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
-const encodeHex = "0123456789ABCDEFGHIJKLMNOPQRSTUV"
-
-// NewEncoding returns a new Encoding defined by the given alphabet,
-// which must be a 32-byte string.
-func NewEncoding(encoder string) *Encoding {
-	e := new(Encoding)
-	e.encode = encoder
-	for i := 0; i < len(e.decodeMap); i++ {
-		e.decodeMap[i] = 0xFF
-	}
-	for i := 0; i < len(encoder); i++ {
-		e.decodeMap[encoder[i]] = byte(i)
-	}
-	return e
-}
-
-// StdEncoding is the standard base32 encoding, as defined in
-// RFC 4648.
-var StdEncoding = NewEncoding(encodeStd)
-
-// HexEncoding is the ``Extended Hex Alphabet'' defined in RFC 4648.
-// It is typically used in DNS.
-var HexEncoding = NewEncoding(encodeHex)
-
-var removeNewlinesMapper = func(r rune) rune {
-	if r == '\r' || r == '\n' {
-		return -1
-	}
-	return r
-}
-
-/*
- * Encoder
- */
-
-// Encode encodes src using the encoding enc, writing
-// EncodedLen(len(src)) bytes to dst.
-//
-// The encoding pads the output to a multiple of 8 bytes,
-// so Encode is not appropriate for use on individual blocks
-// of a large data stream.  Use NewEncoder() instead.
-func (enc *Encoding) Encode(dst, src []byte) {
-	if len(src) == 0 {
-		return
-	}
-
-	for len(src) > 0 {
-		var b0, b1, b2, b3, b4, b5, b6, b7 byte
-
-		// Unpack 8x 5-bit source blocks into a 5 byte
-		// destination quantum
-		switch len(src) {
-		default:
-			b7 = src[4] & 0x1F
-			b6 = src[4] >> 5
-			fallthrough
-		case 4:
-			b6 |= (src[3] << 3) & 0x1F
-			b5 = (src[3] >> 2) & 0x1F
-			b4 = src[3] >> 7
-			fallthrough
-		case 3:
-			b4 |= (src[2] << 1) & 0x1F
-			b3 = (src[2] >> 4) & 0x1F
-			fallthrough
-		case 2:
-			b3 |= (src[1] << 4) & 0x1F
-			b2 = (src[1] >> 1) & 0x1F
-			b1 = (src[1] >> 6) & 0x1F
-			fallthrough
-		case 1:
-			b1 |= (src[0] << 2) & 0x1F
-			b0 = src[0] >> 3
-		}
-
-		// Encode 5-bit blocks using the base32 alphabet
-		dst[0] = enc.encode[b0]
-		dst[1] = enc.encode[b1]
-		dst[2] = enc.encode[b2]
-		dst[3] = enc.encode[b3]
-		dst[4] = enc.encode[b4]
-		dst[5] = enc.encode[b5]
-		dst[6] = enc.encode[b6]
-		dst[7] = enc.encode[b7]
-
-		// Pad the final quantum
-		if len(src) < 5 {
-			dst[7] = '='
-			if len(src) < 4 {
-				dst[6] = '='
-				dst[5] = '='
-				if len(src) < 3 {
-					dst[4] = '='
-					if len(src) < 2 {
-						dst[3] = '='
-						dst[2] = '='
-					}
-				}
-			}
-			break
-		}
-		src = src[5:]
-		dst = dst[8:]
-	}
-}
-
-// EncodeToString returns the base32 encoding of src.
-func (enc *Encoding) EncodeToString(src []byte) string {
-	buf := make([]byte, enc.EncodedLen(len(src)))
-	enc.Encode(buf, src)
-	return string(buf)
-}
-
-type encoder struct {
-	err  error
-	enc  *Encoding
-	w    io.Writer
-	buf  [5]byte    // buffered data waiting to be encoded
-	nbuf int        // number of bytes in buf
-	out  [1024]byte // output buffer
-}
-
-func (e *encoder) Write(p []byte) (n int, err error) {
-	if e.err != nil {
-		return 0, e.err
-	}
-
-	// Leading fringe.
-	if e.nbuf > 0 {
-		var i int
-		for i = 0; i < len(p) && e.nbuf < 5; i++ {
-			e.buf[e.nbuf] = p[i]
-			e.nbuf++
-		}
-		n += i
-		p = p[i:]
-		if e.nbuf < 5 {
-			return
-		}
-		e.enc.Encode(e.out[0:], e.buf[0:])
-		if _, e.err = e.w.Write(e.out[0:8]); e.err != nil {
-			return n, e.err
-		}
-		e.nbuf = 0
-	}
-
-	// Large interior chunks.
-	for len(p) >= 5 {
-		nn := len(e.out) / 8 * 5
-		if nn > len(p) {
-			nn = len(p)
-			nn -= nn % 5
-		}
-		e.enc.Encode(e.out[0:], p[0:nn])
-		if _, e.err = e.w.Write(e.out[0 : nn/5*8]); e.err != nil {
-			return n, e.err
-		}
-		n += nn
-		p = p[nn:]
-	}
-
-	// Trailing fringe.
-	for i := 0; i < len(p); i++ {
-		e.buf[i] = p[i]
-	}
-	e.nbuf = len(p)
-	n += len(p)
-	return
-}
-
-// Close flushes any pending output from the encoder.
-// It is an error to call Write after calling Close.
-func (e *encoder) Close() error {
-	// If there's anything left in the buffer, flush it out
-	if e.err == nil && e.nbuf > 0 {
-		e.enc.Encode(e.out[0:], e.buf[0:e.nbuf])
-		e.nbuf = 0
-		_, e.err = e.w.Write(e.out[0:8])
-	}
-	return e.err
-}
-
-// NewEncoder returns a new base32 stream encoder.  Data written to
-// the returned writer will be encoded using enc and then written to w.
-// Base32 encodings operate in 5-byte blocks; when finished
-// writing, the caller must Close the returned encoder to flush any
-// partially written blocks.
-func NewEncoder(enc *Encoding, w io.Writer) io.WriteCloser {
-	return &encoder{enc: enc, w: w}
-}
-
-// EncodedLen returns the length in bytes of the base32 encoding
-// of an input buffer of length n.
-func (enc *Encoding) EncodedLen(n int) int { return (n + 4) / 5 * 8 }
-
-/*
- * Decoder
- */
-
-type CorruptInputError int64
-
-func (e CorruptInputError) Error() string {
-	return "illegal base32 data at input byte " + strconv.FormatInt(int64(e), 10)
-}
-
-// decode is like Decode but returns an additional 'end' value, which
-// indicates if end-of-message padding was encountered and thus any
-// additional data is an error. This method assumes that src has been
-// stripped of all supported whitespace ('\r' and '\n').
-func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
-	olen := len(src)
-	for len(src) > 0 && !end {
-		// Decode quantum using the base32 alphabet
-		var dbuf [8]byte
-		dlen := 8
-
-		for j := 0; j < 8; {
-			if len(src) == 0 {
-				return n, false, CorruptInputError(olen - len(src) - j)
-			}
-			in := src[0]
-			src = src[1:]
-			if in == '=' && j >= 2 && len(src) < 8 {
-				// We've reached the end and there's padding
-				if len(src)+j < 8-1 {
-					// not enough padding
-					return n, false, CorruptInputError(olen)
-				}
-				for k := 0; k < 8-1-j; k++ {
-					if len(src) > k && src[k] != '=' {
-						// incorrect padding
-						return n, false, CorruptInputError(olen - len(src) + k - 1)
-					}
-				}
-				dlen, end = j, true
-				// 7, 5 and 2 are not valid padding lengths, and so 1, 3 and 6 are not
-				// valid dlen values. See RFC 4648 Section 6 "Base 32 Encoding" listing
-				// the five valid padding lengths, and Section 9 "Illustrations and
-				// Examples" for an illustration for how the 1st, 3rd and 6th base32
-				// src bytes do not yield enough information to decode a dst byte.
-				if dlen == 1 || dlen == 3 || dlen == 6 {
-					return n, false, CorruptInputError(olen - len(src) - 1)
-				}
-				break
-			}
-			dbuf[j] = enc.decodeMap[in]
-			if dbuf[j] == 0xFF {
-				return n, false, CorruptInputError(olen - len(src) - 1)
-			}
-			j++
-		}
-
-		// Pack 8x 5-bit source blocks into 5 byte destination
-		// quantum
-		switch dlen {
-		case 8:
-			dst[4] = dbuf[6]<<5 | dbuf[7]
-			fallthrough
-		case 7:
-			dst[3] = dbuf[4]<<7 | dbuf[5]<<2 | dbuf[6]>>3
-			fallthrough
-		case 5:
-			dst[2] = dbuf[3]<<4 | dbuf[4]>>1
-			fallthrough
-		case 4:
-			dst[1] = dbuf[1]<<6 | dbuf[2]<<1 | dbuf[3]>>4
-			fallthrough
-		case 2:
-			dst[0] = dbuf[0]<<3 | dbuf[1]>>2
-		}
-		dst = dst[5:]
-		switch dlen {
-		case 2:
-			n += 1
-		case 4:
-			n += 2
-		case 5:
-			n += 3
-		case 7:
-			n += 4
-		case 8:
-			n += 5
-		}
-	}
-	return n, end, nil
-}
-
-// Decode decodes src using the encoding enc.  It writes at most
-// DecodedLen(len(src)) bytes to dst and returns the number of bytes
-// written.  If src contains invalid base32 data, it will return the
-// number of bytes successfully written and CorruptInputError.
-// New line characters (\r and \n) are ignored.
-func (enc *Encoding) Decode(dst, src []byte) (n int, err error) {
-	src = bytes.Map(removeNewlinesMapper, src)
-	n, _, err = enc.decode(dst, src)
-	return
-}
-
-// DecodeString returns the bytes represented by the base32 string s.
-func (enc *Encoding) DecodeString(s string) ([]byte, error) {
-	s = strings.Map(removeNewlinesMapper, s)
-	dbuf := make([]byte, enc.DecodedLen(len(s)))
-	n, _, err := enc.decode(dbuf, []byte(s))
-	return dbuf[:n], err
-}
-
-type decoder struct {
-	err    error
-	enc    *Encoding
-	r      io.Reader
-	end    bool       // saw end of message
-	buf    [1024]byte // leftover input
-	nbuf   int
-	out    []byte // leftover decoded output
-	outbuf [1024 / 8 * 5]byte
-}
-
-func (d *decoder) Read(p []byte) (n int, err error) {
-	if d.err != nil {
-		return 0, d.err
-	}
-
-	// Use leftover decoded output from last read.
-	if len(d.out) > 0 {
-		n = copy(p, d.out)
-		d.out = d.out[n:]
-		return n, nil
-	}
-
-	// Read a chunk.
-	nn := len(p) / 5 * 8
-	if nn < 8 {
-		nn = 8
-	}
-	if nn > len(d.buf) {
-		nn = len(d.buf)
-	}
-	nn, d.err = io.ReadAtLeast(d.r, d.buf[d.nbuf:nn], 8-d.nbuf)
-	d.nbuf += nn
-	if d.nbuf < 8 {
-		return 0, d.err
-	}
-
-	// Decode chunk into p, or d.out and then p if p is too small.
-	nr := d.nbuf / 8 * 8
-	nw := d.nbuf / 8 * 5
-	if nw > len(p) {
-		nw, d.end, d.err = d.enc.decode(d.outbuf[0:], d.buf[0:nr])
-		d.out = d.outbuf[0:nw]
-		n = copy(p, d.out)
-		d.out = d.out[n:]
-	} else {
-		n, d.end, d.err = d.enc.decode(p, d.buf[0:nr])
-	}
-	d.nbuf -= nr
-	for i := 0; i < d.nbuf; i++ {
-		d.buf[i] = d.buf[i+nr]
-	}
-
-	if d.err == nil {
-		d.err = err
-	}
-	return n, d.err
-}
-
-type newlineFilteringReader struct {
-	wrapped io.Reader
-}
-
-func (r *newlineFilteringReader) Read(p []byte) (int, error) {
-	n, err := r.wrapped.Read(p)
-	for n > 0 {
-		offset := 0
-		for i, b := range p[0:n] {
-			if b != '\r' && b != '\n' {
-				if i != offset {
-					p[offset] = b
-				}
-				offset++
-			}
-		}
-		if offset > 0 {
-			return offset, err
-		}
-		// Previous buffer entirely whitespace, read again
-		n, err = r.wrapped.Read(p)
-	}
-	return n, err
-}
-
-// NewDecoder constructs a new base32 stream decoder.
-func NewDecoder(enc *Encoding, r io.Reader) io.Reader {
-	return &decoder{enc: enc, r: &newlineFilteringReader{r}}
-}
-
-// DecodedLen returns the maximum length in bytes of the decoded data
-// corresponding to n bytes of base32-encoded data.
-func (enc *Encoding) DecodedLen(n int) int { return n / 8 * 5 }
diff --git a/third_party/gofrontend/libgo/go/encoding/base32/base32_test.go b/third_party/gofrontend/libgo/go/encoding/base32/base32_test.go
deleted file mode 100644
index 5a68f06..0000000
--- a/third_party/gofrontend/libgo/go/encoding/base32/base32_test.go
+++ /dev/null
@@ -1,302 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package base32
-
-import (
-	"bytes"
-	"io"
-	"io/ioutil"
-	"strings"
-	"testing"
-)
-
-type testpair struct {
-	decoded, encoded string
-}
-
-var pairs = []testpair{
-	// RFC 4648 examples
-	{"", ""},
-	{"f", "MY======"},
-	{"fo", "MZXQ===="},
-	{"foo", "MZXW6==="},
-	{"foob", "MZXW6YQ="},
-	{"fooba", "MZXW6YTB"},
-	{"foobar", "MZXW6YTBOI======"},
-
-	// Wikipedia examples, converted to base32
-	{"sure.", "ON2XEZJO"},
-	{"sure", "ON2XEZI="},
-	{"sur", "ON2XE==="},
-	{"su", "ON2Q===="},
-	{"leasure.", "NRSWC43VOJSS4==="},
-	{"easure.", "MVQXG5LSMUXA===="},
-	{"asure.", "MFZXK4TFFY======"},
-	{"sure.", "ON2XEZJO"},
-}
-
-var bigtest = testpair{
-	"Twas brillig, and the slithy toves",
-	"KR3WC4ZAMJZGS3DMNFTSYIDBNZSCA5DIMUQHG3DJORUHSIDUN53GK4Y=",
-}
-
-func testEqual(t *testing.T, msg string, args ...interface{}) bool {
-	if args[len(args)-2] != args[len(args)-1] {
-		t.Errorf(msg, args...)
-		return false
-	}
-	return true
-}
-
-func TestEncode(t *testing.T) {
-	for _, p := range pairs {
-		got := StdEncoding.EncodeToString([]byte(p.decoded))
-		testEqual(t, "Encode(%q) = %q, want %q", p.decoded, got, p.encoded)
-	}
-}
-
-func TestEncoder(t *testing.T) {
-	for _, p := range pairs {
-		bb := &bytes.Buffer{}
-		encoder := NewEncoder(StdEncoding, bb)
-		encoder.Write([]byte(p.decoded))
-		encoder.Close()
-		testEqual(t, "Encode(%q) = %q, want %q", p.decoded, bb.String(), p.encoded)
-	}
-}
-
-func TestEncoderBuffering(t *testing.T) {
-	input := []byte(bigtest.decoded)
-	for bs := 1; bs <= 12; bs++ {
-		bb := &bytes.Buffer{}
-		encoder := NewEncoder(StdEncoding, bb)
-		for pos := 0; pos < len(input); pos += bs {
-			end := pos + bs
-			if end > len(input) {
-				end = len(input)
-			}
-			n, err := encoder.Write(input[pos:end])
-			testEqual(t, "Write(%q) gave error %v, want %v", input[pos:end], err, error(nil))
-			testEqual(t, "Write(%q) gave length %v, want %v", input[pos:end], n, end-pos)
-		}
-		err := encoder.Close()
-		testEqual(t, "Close gave error %v, want %v", err, error(nil))
-		testEqual(t, "Encoding/%d of %q = %q, want %q", bs, bigtest.decoded, bb.String(), bigtest.encoded)
-	}
-}
-
-func TestDecode(t *testing.T) {
-	for _, p := range pairs {
-		dbuf := make([]byte, StdEncoding.DecodedLen(len(p.encoded)))
-		count, end, err := StdEncoding.decode(dbuf, []byte(p.encoded))
-		testEqual(t, "Decode(%q) = error %v, want %v", p.encoded, err, error(nil))
-		testEqual(t, "Decode(%q) = length %v, want %v", p.encoded, count, len(p.decoded))
-		if len(p.encoded) > 0 {
-			testEqual(t, "Decode(%q) = end %v, want %v", p.encoded, end, (p.encoded[len(p.encoded)-1] == '='))
-		}
-		testEqual(t, "Decode(%q) = %q, want %q", p.encoded,
-			string(dbuf[0:count]),
-			p.decoded)
-
-		dbuf, err = StdEncoding.DecodeString(p.encoded)
-		testEqual(t, "DecodeString(%q) = error %v, want %v", p.encoded, err, error(nil))
-		testEqual(t, "DecodeString(%q) = %q, want %q", p.encoded, string(dbuf), p.decoded)
-	}
-}
-
-func TestDecoder(t *testing.T) {
-	for _, p := range pairs {
-		decoder := NewDecoder(StdEncoding, strings.NewReader(p.encoded))
-		dbuf := make([]byte, StdEncoding.DecodedLen(len(p.encoded)))
-		count, err := decoder.Read(dbuf)
-		if err != nil && err != io.EOF {
-			t.Fatal("Read failed", err)
-		}
-		testEqual(t, "Read from %q = length %v, want %v", p.encoded, count, len(p.decoded))
-		testEqual(t, "Decoding of %q = %q, want %q", p.encoded, string(dbuf[0:count]), p.decoded)
-		if err != io.EOF {
-			count, err = decoder.Read(dbuf)
-		}
-		testEqual(t, "Read from %q = %v, want %v", p.encoded, err, io.EOF)
-	}
-}
-
-func TestDecoderBuffering(t *testing.T) {
-	for bs := 1; bs <= 12; bs++ {
-		decoder := NewDecoder(StdEncoding, strings.NewReader(bigtest.encoded))
-		buf := make([]byte, len(bigtest.decoded)+12)
-		var total int
-		for total = 0; total < len(bigtest.decoded); {
-			n, err := decoder.Read(buf[total : total+bs])
-			testEqual(t, "Read from %q at pos %d = %d, %v, want _, %v", bigtest.encoded, total, n, err, error(nil))
-			total += n
-		}
-		testEqual(t, "Decoding/%d of %q = %q, want %q", bs, bigtest.encoded, string(buf[0:total]), bigtest.decoded)
-	}
-}
-
-func TestDecodeCorrupt(t *testing.T) {
-	testCases := []struct {
-		input  string
-		offset int // -1 means no corruption.
-	}{
-		{"", -1},
-		{"!!!!", 0},
-		{"x===", 0},
-		{"AA=A====", 2},
-		{"AAA=AAAA", 3},
-		{"MMMMMMMMM", 8},
-		{"MMMMMM", 0},
-		{"A=", 1},
-		{"AA=", 3},
-		{"AA==", 4},
-		{"AA===", 5},
-		{"AAAA=", 5},
-		{"AAAA==", 6},
-		{"AAAAA=", 6},
-		{"AAAAA==", 7},
-		{"A=======", 1},
-		{"AA======", -1},
-		{"AAA=====", 3},
-		{"AAAA====", -1},
-		{"AAAAA===", -1},
-		{"AAAAAA==", 6},
-		{"AAAAAAA=", -1},
-		{"AAAAAAAA", -1},
-	}
-	for _, tc := range testCases {
-		dbuf := make([]byte, StdEncoding.DecodedLen(len(tc.input)))
-		_, err := StdEncoding.Decode(dbuf, []byte(tc.input))
-		if tc.offset == -1 {
-			if err != nil {
-				t.Error("Decoder wrongly detected coruption in", tc.input)
-			}
-			continue
-		}
-		switch err := err.(type) {
-		case CorruptInputError:
-			testEqual(t, "Corruption in %q at offset %v, want %v", tc.input, int(err), tc.offset)
-		default:
-			t.Error("Decoder failed to detect corruption in", tc)
-		}
-	}
-}
-
-func TestBig(t *testing.T) {
-	n := 3*1000 + 1
-	raw := make([]byte, n)
-	const alpha = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
-	for i := 0; i < n; i++ {
-		raw[i] = alpha[i%len(alpha)]
-	}
-	encoded := new(bytes.Buffer)
-	w := NewEncoder(StdEncoding, encoded)
-	nn, err := w.Write(raw)
-	if nn != n || err != nil {
-		t.Fatalf("Encoder.Write(raw) = %d, %v want %d, nil", nn, err, n)
-	}
-	err = w.Close()
-	if err != nil {
-		t.Fatalf("Encoder.Close() = %v want nil", err)
-	}
-	decoded, err := ioutil.ReadAll(NewDecoder(StdEncoding, encoded))
-	if err != nil {
-		t.Fatalf("ioutil.ReadAll(NewDecoder(...)): %v", err)
-	}
-
-	if !bytes.Equal(raw, decoded) {
-		var i int
-		for i = 0; i < len(decoded) && i < len(raw); i++ {
-			if decoded[i] != raw[i] {
-				break
-			}
-		}
-		t.Errorf("Decode(Encode(%d-byte string)) failed at offset %d", n, i)
-	}
-}
-
-func testStringEncoding(t *testing.T, expected string, examples []string) {
-	for _, e := range examples {
-		buf, err := StdEncoding.DecodeString(e)
-		if err != nil {
-			t.Errorf("Decode(%q) failed: %v", e, err)
-			continue
-		}
-		if s := string(buf); s != expected {
-			t.Errorf("Decode(%q) = %q, want %q", e, s, expected)
-		}
-	}
-}
-
-func TestNewLineCharacters(t *testing.T) {
-	// Each of these should decode to the string "sure", without errors.
-	examples := []string{
-		"ON2XEZI=",
-		"ON2XEZI=\r",
-		"ON2XEZI=\n",
-		"ON2XEZI=\r\n",
-		"ON2XEZ\r\nI=",
-		"ON2X\rEZ\nI=",
-		"ON2X\nEZ\rI=",
-		"ON2XEZ\nI=",
-		"ON2XEZI\n=",
-	}
-	testStringEncoding(t, "sure", examples)
-
-	// Each of these should decode to the string "foobar", without errors.
-	examples = []string{
-		"MZXW6YTBOI======",
-		"MZXW6YTBOI=\r\n=====",
-	}
-	testStringEncoding(t, "foobar", examples)
-}
-
-func TestDecoderIssue4779(t *testing.T) {
-	encoded := `JRXXEZLNEBUXA43VNUQGI33MN5ZCA43JOQQGC3LFOQWCAY3PNZZWKY3UMV2HK4
-RAMFSGS4DJONUWG2LOM4QGK3DJOQWCA43FMQQGI3YKMVUXK43NN5SCA5DFNVYG64RANFXGG2LENFSH
-K3TUEB2XIIDMMFRG64TFEBSXIIDEN5WG64TFEBWWCZ3OMEQGC3DJOF2WCLRAKV2CAZLONFWQUYLEEB
-WWS3TJNUQHMZLONFQW2LBAOF2WS4ZANZXXG5DSOVSCAZLYMVZGG2LUMF2GS33OEB2WY3DBNVRW6IDM
-MFRG64TJOMQG42LTNEQHK5AKMFWGS4LVNFYCAZLYEBSWCIDDN5WW233EN4QGG33OONSXC5LBOQXCAR
-DVNFZSAYLVORSSA2LSOVZGKIDEN5WG64RANFXAU4TFOBZGK2DFNZSGK4TJOQQGS3RAOZXWY5LQORQX
-IZJAOZSWY2LUEBSXG43FEBRWS3DMOVWSAZDPNRXXEZJAMV2SAZTVM5UWC5BANZ2WY3DBBJYGC4TJMF
-2HK4ROEBCXQY3FOB2GK5LSEBZWS3TUEBXWGY3BMVRWC5BAMN2XA2LEMF2GC5BANZXW4IDQOJXWSZDF
-NZ2CYIDTOVXHIIDJNYFGG5LMOBQSA4LVNEQG6ZTGNFRWSYJAMRSXGZLSOVXHIIDNN5WGY2LUEBQW42
-LNEBUWIIDFON2CA3DBMJXXE5LNFY==
-====`
-	encodedShort := strings.Replace(encoded, "\n", "", -1)
-
-	dec := NewDecoder(StdEncoding, strings.NewReader(encoded))
-	res1, err := ioutil.ReadAll(dec)
-	if err != nil {
-		t.Errorf("ReadAll failed: %v", err)
-	}
-
-	dec = NewDecoder(StdEncoding, strings.NewReader(encodedShort))
-	var res2 []byte
-	res2, err = ioutil.ReadAll(dec)
-	if err != nil {
-		t.Errorf("ReadAll failed: %v", err)
-	}
-
-	if !bytes.Equal(res1, res2) {
-		t.Error("Decoded results not equal")
-	}
-}
-
-func BenchmarkEncodeToString(b *testing.B) {
-	data := make([]byte, 8192)
-	b.SetBytes(int64(len(data)))
-	for i := 0; i < b.N; i++ {
-		StdEncoding.EncodeToString(data)
-	}
-}
-
-func BenchmarkDecodeString(b *testing.B) {
-	data := StdEncoding.EncodeToString(make([]byte, 8192))
-	b.SetBytes(int64(len(data)))
-	for i := 0; i < b.N; i++ {
-		StdEncoding.DecodeString(data)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/base64/base64.go b/third_party/gofrontend/libgo/go/encoding/base64/base64.go
deleted file mode 100644
index 3302fb4..0000000
--- a/third_party/gofrontend/libgo/go/encoding/base64/base64.go
+++ /dev/null
@@ -1,448 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package base64 implements base64 encoding as specified by RFC 4648.
-package base64
-
-import (
-	"io"
-	"strconv"
-)
-
-/*
- * Encodings
- */
-
-// An Encoding is a radix 64 encoding/decoding scheme, defined by a
-// 64-character alphabet.  The most common encoding is the "base64"
-// encoding defined in RFC 4648 and used in MIME (RFC 2045) and PEM
-// (RFC 1421).  RFC 4648 also defines an alternate encoding, which is
-// the standard encoding with - and _ substituted for + and /.
-type Encoding struct {
-	encode    [64]byte
-	decodeMap [256]byte
-	padChar   rune
-}
-
-const (
-	StdPadding rune = '=' // Standard padding character
-	NoPadding  rune = -1  // No padding
-)
-
-const encodeStd = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
-const encodeURL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
-
-// NewEncoding returns a new padded Encoding defined by the given alphabet,
-// which must be a 64-byte string.
-// The resulting Encoding uses the default padding character ('='),
-// which may be changed or disabled via WithPadding.
-func NewEncoding(encoder string) *Encoding {
-	if len(encoder) != 64 {
-		panic("encoding alphabet is not 64-bytes long")
-	}
-
-	e := new(Encoding)
-	e.padChar = StdPadding
-	copy(e.encode[:], encoder)
-
-	for i := 0; i < len(e.decodeMap); i++ {
-		e.decodeMap[i] = 0xFF
-	}
-	for i := 0; i < len(encoder); i++ {
-		e.decodeMap[encoder[i]] = byte(i)
-	}
-	return e
-}
-
-// WithPadding creates a new encoding identical to enc except
-// with a specified padding character, or NoPadding to disable padding.
-func (enc Encoding) WithPadding(padding rune) *Encoding {
-	enc.padChar = padding
-	return &enc
-}
-
-// StdEncoding is the standard base64 encoding, as defined in
-// RFC 4648.
-var StdEncoding = NewEncoding(encodeStd)
-
-// URLEncoding is the alternate base64 encoding defined in RFC 4648.
-// It is typically used in URLs and file names.
-var URLEncoding = NewEncoding(encodeURL)
-
-// RawStdEncoding is the standard raw, unpadded base64 encoding,
-// as defined in RFC 4648 section 3.2.
-// This is the same as StdEncoding but omits padding characters.
-var RawStdEncoding = StdEncoding.WithPadding(NoPadding)
-
-// URLEncoding is the unpadded alternate base64 encoding defined in RFC 4648.
-// It is typically used in URLs and file names.
-// This is the same as URLEncoding but omits padding characters.
-var RawURLEncoding = URLEncoding.WithPadding(NoPadding)
-
-/*
- * Encoder
- */
-
-// Encode encodes src using the encoding enc, writing
-// EncodedLen(len(src)) bytes to dst.
-//
-// The encoding pads the output to a multiple of 4 bytes,
-// so Encode is not appropriate for use on individual blocks
-// of a large data stream.  Use NewEncoder() instead.
-func (enc *Encoding) Encode(dst, src []byte) {
-	if len(src) == 0 {
-		return
-	}
-
-	di, si := 0, 0
-	n := (len(src) / 3) * 3
-	for si < n {
-		// Convert 3x 8bit source bytes into 4 bytes
-		val := uint(src[si+0])<<16 | uint(src[si+1])<<8 | uint(src[si+2])
-
-		dst[di+0] = enc.encode[val>>18&0x3F]
-		dst[di+1] = enc.encode[val>>12&0x3F]
-		dst[di+2] = enc.encode[val>>6&0x3F]
-		dst[di+3] = enc.encode[val&0x3F]
-
-		si += 3
-		di += 4
-	}
-
-	remain := len(src) - si
-	if remain == 0 {
-		return
-	}
-	// Add the remaining small block
-	val := uint(src[si+0]) << 16
-	if remain == 2 {
-		val |= uint(src[si+1]) << 8
-	}
-
-	dst[di+0] = enc.encode[val>>18&0x3F]
-	dst[di+1] = enc.encode[val>>12&0x3F]
-
-	switch remain {
-	case 2:
-		dst[di+2] = enc.encode[val>>6&0x3F]
-		if enc.padChar != NoPadding {
-			dst[di+3] = byte(enc.padChar)
-		}
-	case 1:
-		if enc.padChar != NoPadding {
-			dst[di+2] = byte(enc.padChar)
-			dst[di+3] = byte(enc.padChar)
-		}
-	}
-}
-
-// EncodeToString returns the base64 encoding of src.
-func (enc *Encoding) EncodeToString(src []byte) string {
-	buf := make([]byte, enc.EncodedLen(len(src)))
-	enc.Encode(buf, src)
-	return string(buf)
-}
-
-type encoder struct {
-	err  error
-	enc  *Encoding
-	w    io.Writer
-	buf  [3]byte    // buffered data waiting to be encoded
-	nbuf int        // number of bytes in buf
-	out  [1024]byte // output buffer
-}
-
-func (e *encoder) Write(p []byte) (n int, err error) {
-	if e.err != nil {
-		return 0, e.err
-	}
-
-	// Leading fringe.
-	if e.nbuf > 0 {
-		var i int
-		for i = 0; i < len(p) && e.nbuf < 3; i++ {
-			e.buf[e.nbuf] = p[i]
-			e.nbuf++
-		}
-		n += i
-		p = p[i:]
-		if e.nbuf < 3 {
-			return
-		}
-		e.enc.Encode(e.out[:], e.buf[:])
-		if _, e.err = e.w.Write(e.out[:4]); e.err != nil {
-			return n, e.err
-		}
-		e.nbuf = 0
-	}
-
-	// Large interior chunks.
-	for len(p) >= 3 {
-		nn := len(e.out) / 4 * 3
-		if nn > len(p) {
-			nn = len(p)
-			nn -= nn % 3
-		}
-		e.enc.Encode(e.out[:], p[:nn])
-		if _, e.err = e.w.Write(e.out[0 : nn/3*4]); e.err != nil {
-			return n, e.err
-		}
-		n += nn
-		p = p[nn:]
-	}
-
-	// Trailing fringe.
-	for i := 0; i < len(p); i++ {
-		e.buf[i] = p[i]
-	}
-	e.nbuf = len(p)
-	n += len(p)
-	return
-}
-
-// Close flushes any pending output from the encoder.
-// It is an error to call Write after calling Close.
-func (e *encoder) Close() error {
-	// If there's anything left in the buffer, flush it out
-	if e.err == nil && e.nbuf > 0 {
-		e.enc.Encode(e.out[:], e.buf[:e.nbuf])
-		_, e.err = e.w.Write(e.out[:e.enc.EncodedLen(e.nbuf)])
-		e.nbuf = 0
-	}
-	return e.err
-}
-
-// NewEncoder returns a new base64 stream encoder.  Data written to
-// the returned writer will be encoded using enc and then written to w.
-// Base64 encodings operate in 4-byte blocks; when finished
-// writing, the caller must Close the returned encoder to flush any
-// partially written blocks.
-func NewEncoder(enc *Encoding, w io.Writer) io.WriteCloser {
-	return &encoder{enc: enc, w: w}
-}
-
-// EncodedLen returns the length in bytes of the base64 encoding
-// of an input buffer of length n.
-func (enc *Encoding) EncodedLen(n int) int {
-	if enc.padChar == NoPadding {
-		return (n*8 + 5) / 6 // minimum # chars at 6 bits per char
-	}
-	return (n + 2) / 3 * 4 // minimum # 4-char quanta, 3 bytes each
-}
-
-/*
- * Decoder
- */
-
-type CorruptInputError int64
-
-func (e CorruptInputError) Error() string {
-	return "illegal base64 data at input byte " + strconv.FormatInt(int64(e), 10)
-}
-
-// decode is like Decode but returns an additional 'end' value, which
-// indicates if end-of-message padding or a partial quantum was encountered
-// and thus any additional data is an error.
-func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
-	si := 0
-
-	// skip over newlines
-	for si < len(src) && (src[si] == '\n' || src[si] == '\r') {
-		si++
-	}
-
-	for si < len(src) && !end {
-		// Decode quantum using the base64 alphabet
-		var dbuf [4]byte
-		dinc, dlen := 3, 4
-
-		for j := range dbuf {
-			if len(src) == si {
-				if enc.padChar != NoPadding || j < 2 {
-					return n, false, CorruptInputError(si - j)
-				}
-				dinc, dlen, end = j-1, j, true
-				break
-			}
-			in := src[si]
-
-			si++
-			// skip over newlines
-			for si < len(src) && (src[si] == '\n' || src[si] == '\r') {
-				si++
-			}
-
-			if rune(in) == enc.padChar {
-				// We've reached the end and there's padding
-				switch j {
-				case 0, 1:
-					// incorrect padding
-					return n, false, CorruptInputError(si - 1)
-				case 2:
-					// "==" is expected, the first "=" is already consumed.
-					if si == len(src) {
-						// not enough padding
-						return n, false, CorruptInputError(len(src))
-					}
-					if rune(src[si]) != enc.padChar {
-						// incorrect padding
-						return n, false, CorruptInputError(si - 1)
-					}
-
-					si++
-					// skip over newlines
-					for si < len(src) && (src[si] == '\n' || src[si] == '\r') {
-						si++
-					}
-				}
-				if si < len(src) {
-					// trailing garbage
-					err = CorruptInputError(si)
-				}
-				dinc, dlen, end = 3, j, true
-				break
-			}
-			dbuf[j] = enc.decodeMap[in]
-			if dbuf[j] == 0xFF {
-				return n, false, CorruptInputError(si - 1)
-			}
-		}
-
-		// Convert 4x 6bit source bytes into 3 bytes
-		val := uint(dbuf[0])<<18 | uint(dbuf[1])<<12 | uint(dbuf[2])<<6 | uint(dbuf[3])
-		switch dlen {
-		case 4:
-			dst[2] = byte(val >> 0)
-			fallthrough
-		case 3:
-			dst[1] = byte(val >> 8)
-			fallthrough
-		case 2:
-			dst[0] = byte(val >> 16)
-		}
-		dst = dst[dinc:]
-		n += dlen - 1
-	}
-
-	return n, end, err
-}
-
-// Decode decodes src using the encoding enc.  It writes at most
-// DecodedLen(len(src)) bytes to dst and returns the number of bytes
-// written.  If src contains invalid base64 data, it will return the
-// number of bytes successfully written and CorruptInputError.
-// New line characters (\r and \n) are ignored.
-func (enc *Encoding) Decode(dst, src []byte) (n int, err error) {
-	n, _, err = enc.decode(dst, src)
-	return
-}
-
-// DecodeString returns the bytes represented by the base64 string s.
-func (enc *Encoding) DecodeString(s string) ([]byte, error) {
-	dbuf := make([]byte, enc.DecodedLen(len(s)))
-	n, _, err := enc.decode(dbuf, []byte(s))
-	return dbuf[:n], err
-}
-
-type decoder struct {
-	err    error
-	enc    *Encoding
-	r      io.Reader
-	end    bool       // saw end of message
-	buf    [1024]byte // leftover input
-	nbuf   int
-	out    []byte // leftover decoded output
-	outbuf [1024 / 4 * 3]byte
-}
-
-func (d *decoder) Read(p []byte) (n int, err error) {
-	if d.err != nil {
-		return 0, d.err
-	}
-
-	// Use leftover decoded output from last read.
-	if len(d.out) > 0 {
-		n = copy(p, d.out)
-		d.out = d.out[n:]
-		return n, nil
-	}
-
-	// This code assumes that d.r strips supported whitespace ('\r' and '\n').
-
-	// Read a chunk.
-	nn := len(p) / 3 * 4
-	if nn < 4 {
-		nn = 4
-	}
-	if nn > len(d.buf) {
-		nn = len(d.buf)
-	}
-	nn, d.err = io.ReadAtLeast(d.r, d.buf[d.nbuf:nn], 4-d.nbuf)
-	d.nbuf += nn
-	if d.err != nil || d.nbuf < 4 {
-		return 0, d.err
-	}
-
-	// Decode chunk into p, or d.out and then p if p is too small.
-	nr := d.nbuf / 4 * 4
-	nw := d.nbuf / 4 * 3
-	if nw > len(p) {
-		nw, d.end, d.err = d.enc.decode(d.outbuf[:], d.buf[:nr])
-		d.out = d.outbuf[:nw]
-		n = copy(p, d.out)
-		d.out = d.out[n:]
-	} else {
-		n, d.end, d.err = d.enc.decode(p, d.buf[:nr])
-	}
-	d.nbuf -= nr
-	for i := 0; i < d.nbuf; i++ {
-		d.buf[i] = d.buf[i+nr]
-	}
-
-	if d.err == nil {
-		d.err = err
-	}
-	return n, d.err
-}
-
-type newlineFilteringReader struct {
-	wrapped io.Reader
-}
-
-func (r *newlineFilteringReader) Read(p []byte) (int, error) {
-	n, err := r.wrapped.Read(p)
-	for n > 0 {
-		offset := 0
-		for i, b := range p[:n] {
-			if b != '\r' && b != '\n' {
-				if i != offset {
-					p[offset] = b
-				}
-				offset++
-			}
-		}
-		if offset > 0 {
-			return offset, err
-		}
-		// Previous buffer entirely whitespace, read again
-		n, err = r.wrapped.Read(p)
-	}
-	return n, err
-}
-
-// NewDecoder constructs a new base64 stream decoder.
-func NewDecoder(enc *Encoding, r io.Reader) io.Reader {
-	return &decoder{enc: enc, r: &newlineFilteringReader{r}}
-}
-
-// DecodedLen returns the maximum length in bytes of the decoded data
-// corresponding to n bytes of base64-encoded data.
-func (enc *Encoding) DecodedLen(n int) int {
-	if enc.padChar == NoPadding {
-		// Unpadded data may end with partial block of 2-3 characters.
-		return (n*6 + 7) / 8
-	}
-	// Padded base64 should always be a multiple of 4 characters in length.
-	return n / 4 * 3
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/base64/base64_test.go b/third_party/gofrontend/libgo/go/encoding/base64/base64_test.go
deleted file mode 100644
index d144b96..0000000
--- a/third_party/gofrontend/libgo/go/encoding/base64/base64_test.go
+++ /dev/null
@@ -1,408 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package base64
-
-import (
-	"bytes"
-	"errors"
-	"io"
-	"io/ioutil"
-	"reflect"
-	"strings"
-	"testing"
-	"time"
-)
-
-type testpair struct {
-	decoded, encoded string
-}
-
-var pairs = []testpair{
-	// RFC 3548 examples
-	{"\x14\xfb\x9c\x03\xd9\x7e", "FPucA9l+"},
-	{"\x14\xfb\x9c\x03\xd9", "FPucA9k="},
-	{"\x14\xfb\x9c\x03", "FPucAw=="},
-
-	// RFC 4648 examples
-	{"", ""},
-	{"f", "Zg=="},
-	{"fo", "Zm8="},
-	{"foo", "Zm9v"},
-	{"foob", "Zm9vYg=="},
-	{"fooba", "Zm9vYmE="},
-	{"foobar", "Zm9vYmFy"},
-
-	// Wikipedia examples
-	{"sure.", "c3VyZS4="},
-	{"sure", "c3VyZQ=="},
-	{"sur", "c3Vy"},
-	{"su", "c3U="},
-	{"leasure.", "bGVhc3VyZS4="},
-	{"easure.", "ZWFzdXJlLg=="},
-	{"asure.", "YXN1cmUu"},
-	{"sure.", "c3VyZS4="},
-}
-
-// Do nothing to a reference base64 string (leave in standard format)
-func stdRef(ref string) string {
-	return ref
-}
-
-// Convert a reference string to URL-encoding
-func urlRef(ref string) string {
-	ref = strings.Replace(ref, "+", "-", -1)
-	ref = strings.Replace(ref, "/", "_", -1)
-	return ref
-}
-
-// Convert a reference string to raw, unpadded format
-func rawRef(ref string) string {
-	return strings.TrimRight(ref, "=")
-}
-
-// Both URL and unpadding conversions
-func rawUrlRef(ref string) string {
-	return rawRef(urlRef(ref))
-}
-
-// A nonstandard encoding with a funny padding character, for testing
-var funnyEncoding = NewEncoding(encodeStd).WithPadding(rune('@'))
-
-func funnyRef(ref string) string {
-	return strings.Replace(ref, "=", "@", -1)
-}
-
-type encodingTest struct {
-	enc  *Encoding           // Encoding to test
-	conv func(string) string // Reference string converter
-}
-
-var encodingTests = []encodingTest{
-	encodingTest{StdEncoding, stdRef},
-	encodingTest{URLEncoding, urlRef},
-	encodingTest{RawStdEncoding, rawRef},
-	encodingTest{RawURLEncoding, rawUrlRef},
-	encodingTest{funnyEncoding, funnyRef},
-}
-
-var bigtest = testpair{
-	"Twas brillig, and the slithy toves",
-	"VHdhcyBicmlsbGlnLCBhbmQgdGhlIHNsaXRoeSB0b3Zlcw==",
-}
-
-func testEqual(t *testing.T, msg string, args ...interface{}) bool {
-	if args[len(args)-2] != args[len(args)-1] {
-		t.Errorf(msg, args...)
-		return false
-	}
-	return true
-}
-
-func TestEncode(t *testing.T) {
-	for _, p := range pairs {
-		for _, tt := range encodingTests {
-			got := tt.enc.EncodeToString([]byte(p.decoded))
-			testEqual(t, "Encode(%q) = %q, want %q", p.decoded,
-				got, tt.conv(p.encoded))
-		}
-	}
-}
-
-func TestEncoder(t *testing.T) {
-	for _, p := range pairs {
-		bb := &bytes.Buffer{}
-		encoder := NewEncoder(StdEncoding, bb)
-		encoder.Write([]byte(p.decoded))
-		encoder.Close()
-		testEqual(t, "Encode(%q) = %q, want %q", p.decoded, bb.String(), p.encoded)
-	}
-}
-
-func TestEncoderBuffering(t *testing.T) {
-	input := []byte(bigtest.decoded)
-	for bs := 1; bs <= 12; bs++ {
-		bb := &bytes.Buffer{}
-		encoder := NewEncoder(StdEncoding, bb)
-		for pos := 0; pos < len(input); pos += bs {
-			end := pos + bs
-			if end > len(input) {
-				end = len(input)
-			}
-			n, err := encoder.Write(input[pos:end])
-			testEqual(t, "Write(%q) gave error %v, want %v", input[pos:end], err, error(nil))
-			testEqual(t, "Write(%q) gave length %v, want %v", input[pos:end], n, end-pos)
-		}
-		err := encoder.Close()
-		testEqual(t, "Close gave error %v, want %v", err, error(nil))
-		testEqual(t, "Encoding/%d of %q = %q, want %q", bs, bigtest.decoded, bb.String(), bigtest.encoded)
-	}
-}
-
-func TestDecode(t *testing.T) {
-	for _, p := range pairs {
-		for _, tt := range encodingTests {
-			encoded := tt.conv(p.encoded)
-			dbuf := make([]byte, tt.enc.DecodedLen(len(encoded)))
-			count, end, err := tt.enc.decode(dbuf, []byte(encoded))
-			testEqual(t, "Decode(%q) = error %v, want %v", encoded, err, error(nil))
-			testEqual(t, "Decode(%q) = length %v, want %v", encoded, count, len(p.decoded))
-			if len(encoded) > 0 {
-				testEqual(t, "Decode(%q) = end %v, want %v", encoded, end, len(p.decoded)%3 != 0)
-			}
-			testEqual(t, "Decode(%q) = %q, want %q", encoded, string(dbuf[0:count]), p.decoded)
-
-			dbuf, err = tt.enc.DecodeString(encoded)
-			testEqual(t, "DecodeString(%q) = error %v, want %v", encoded, err, error(nil))
-			testEqual(t, "DecodeString(%q) = %q, want %q", string(dbuf), p.decoded)
-		}
-	}
-}
-
-func TestDecoder(t *testing.T) {
-	for _, p := range pairs {
-		decoder := NewDecoder(StdEncoding, strings.NewReader(p.encoded))
-		dbuf := make([]byte, StdEncoding.DecodedLen(len(p.encoded)))
-		count, err := decoder.Read(dbuf)
-		if err != nil && err != io.EOF {
-			t.Fatal("Read failed", err)
-		}
-		testEqual(t, "Read from %q = length %v, want %v", p.encoded, count, len(p.decoded))
-		testEqual(t, "Decoding of %q = %q, want %q", p.encoded, string(dbuf[0:count]), p.decoded)
-		if err != io.EOF {
-			count, err = decoder.Read(dbuf)
-		}
-		testEqual(t, "Read from %q = %v, want %v", p.encoded, err, io.EOF)
-	}
-}
-
-func TestDecoderBuffering(t *testing.T) {
-	for bs := 1; bs <= 12; bs++ {
-		decoder := NewDecoder(StdEncoding, strings.NewReader(bigtest.encoded))
-		buf := make([]byte, len(bigtest.decoded)+12)
-		var total int
-		for total = 0; total < len(bigtest.decoded); {
-			n, err := decoder.Read(buf[total : total+bs])
-			testEqual(t, "Read from %q at pos %d = %d, %v, want _, %v", bigtest.encoded, total, n, err, error(nil))
-			total += n
-		}
-		testEqual(t, "Decoding/%d of %q = %q, want %q", bs, bigtest.encoded, string(buf[0:total]), bigtest.decoded)
-	}
-}
-
-func TestDecodeCorrupt(t *testing.T) {
-	testCases := []struct {
-		input  string
-		offset int // -1 means no corruption.
-	}{
-		{"", -1},
-		{"!!!!", 0},
-		{"====", 0},
-		{"x===", 1},
-		{"=AAA", 0},
-		{"A=AA", 1},
-		{"AA=A", 2},
-		{"AA==A", 4},
-		{"AAA=AAAA", 4},
-		{"AAAAA", 4},
-		{"AAAAAA", 4},
-		{"A=", 1},
-		{"A==", 1},
-		{"AA=", 3},
-		{"AA==", -1},
-		{"AAA=", -1},
-		{"AAAA", -1},
-		{"AAAAAA=", 7},
-		{"YWJjZA=====", 8},
-	}
-	for _, tc := range testCases {
-		dbuf := make([]byte, StdEncoding.DecodedLen(len(tc.input)))
-		_, err := StdEncoding.Decode(dbuf, []byte(tc.input))
-		if tc.offset == -1 {
-			if err != nil {
-				t.Error("Decoder wrongly detected coruption in", tc.input)
-			}
-			continue
-		}
-		switch err := err.(type) {
-		case CorruptInputError:
-			testEqual(t, "Corruption in %q at offset %v, want %v", tc.input, int(err), tc.offset)
-		default:
-			t.Error("Decoder failed to detect corruption in", tc)
-		}
-	}
-}
-
-func TestBig(t *testing.T) {
-	n := 3*1000 + 1
-	raw := make([]byte, n)
-	const alpha = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
-	for i := 0; i < n; i++ {
-		raw[i] = alpha[i%len(alpha)]
-	}
-	encoded := new(bytes.Buffer)
-	w := NewEncoder(StdEncoding, encoded)
-	nn, err := w.Write(raw)
-	if nn != n || err != nil {
-		t.Fatalf("Encoder.Write(raw) = %d, %v want %d, nil", nn, err, n)
-	}
-	err = w.Close()
-	if err != nil {
-		t.Fatalf("Encoder.Close() = %v want nil", err)
-	}
-	decoded, err := ioutil.ReadAll(NewDecoder(StdEncoding, encoded))
-	if err != nil {
-		t.Fatalf("ioutil.ReadAll(NewDecoder(...)): %v", err)
-	}
-
-	if !bytes.Equal(raw, decoded) {
-		var i int
-		for i = 0; i < len(decoded) && i < len(raw); i++ {
-			if decoded[i] != raw[i] {
-				break
-			}
-		}
-		t.Errorf("Decode(Encode(%d-byte string)) failed at offset %d", n, i)
-	}
-}
-
-func TestNewLineCharacters(t *testing.T) {
-	// Each of these should decode to the string "sure", without errors.
-	const expected = "sure"
-	examples := []string{
-		"c3VyZQ==",
-		"c3VyZQ==\r",
-		"c3VyZQ==\n",
-		"c3VyZQ==\r\n",
-		"c3VyZ\r\nQ==",
-		"c3V\ryZ\nQ==",
-		"c3V\nyZ\rQ==",
-		"c3VyZ\nQ==",
-		"c3VyZQ\n==",
-		"c3VyZQ=\n=",
-		"c3VyZQ=\r\n\r\n=",
-	}
-	for _, e := range examples {
-		buf, err := StdEncoding.DecodeString(e)
-		if err != nil {
-			t.Errorf("Decode(%q) failed: %v", e, err)
-			continue
-		}
-		if s := string(buf); s != expected {
-			t.Errorf("Decode(%q) = %q, want %q", e, s, expected)
-		}
-	}
-}
-
-type nextRead struct {
-	n   int   // bytes to return
-	err error // error to return
-}
-
-// faultInjectReader returns data from source, rate-limited
-// and with the errors as written to nextc.
-type faultInjectReader struct {
-	source string
-	nextc  <-chan nextRead
-}
-
-func (r *faultInjectReader) Read(p []byte) (int, error) {
-	nr := <-r.nextc
-	if len(p) > nr.n {
-		p = p[:nr.n]
-	}
-	n := copy(p, r.source)
-	r.source = r.source[n:]
-	return n, nr.err
-}
-
-// tests that we don't ignore errors from our underlying reader
-func TestDecoderIssue3577(t *testing.T) {
-	next := make(chan nextRead, 10)
-	wantErr := errors.New("my error")
-	next <- nextRead{5, nil}
-	next <- nextRead{10, wantErr}
-	next <- nextRead{0, wantErr}
-	d := NewDecoder(StdEncoding, &faultInjectReader{
-		source: "VHdhcyBicmlsbGlnLCBhbmQgdGhlIHNsaXRoeSB0b3Zlcw==", // twas brillig...
-		nextc:  next,
-	})
-	errc := make(chan error)
-	go func() {
-		_, err := ioutil.ReadAll(d)
-		errc <- err
-	}()
-	select {
-	case err := <-errc:
-		if err != wantErr {
-			t.Errorf("got error %v; want %v", err, wantErr)
-		}
-	case <-time.After(5 * time.Second):
-		t.Errorf("timeout; Decoder blocked without returning an error")
-	}
-}
-
-func TestDecoderIssue4779(t *testing.T) {
-	encoded := `CP/EAT8AAAEF
-AQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAAB
-BAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHx
-Y3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm
-9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS
-0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0
-pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkJ+Tj
-1kiy1jCJJDnAcCTykpKkuQ6p/jN6FgmxlNduXawwAzaGH+V6jn/R/wCt71zdn+N/qL3kVYFNYB4N
-ji6PDVjWpKp9TSXnvTf8bFNjg3qOEa2n6VlLpj/rT/pf567DpX1i6L1hs9Py67X8mqdtg/rUWbbf
-+gkp0kkkklKSSSSUpJJJJT//0PVUkkklKVLq3WMDpGI7KzrNjADtYNXvI/Mqr/Pd/q9W3vaxjnvM
-NaCXE9gNSvGPrf8AWS3qmba5jjsJhoB0DAf0NDf6sevf+/lf8Hj0JJATfWT6/dV6oXU1uOLQeKKn
-EQP+Hubtfe/+R7Mf/g7f5xcocp++Z11JMCJPgFBxOg7/AOuqDx8I/ikpkXkmSdU8mJIJA/O8EMAy
-j+mSARB/17pKVXYWHXjsj7yIex0PadzXMO1zT5KHoNA3HT8ietoGhgjsfA+CSnvvqh/jJtqsrwOv
-2b6NGNzXfTYexzJ+nU7/ALkf4P8Awv6P9KvTQQ4AgyDqCF85Pho3CTB7eHwXoH+LT65uZbX9X+o2
-bqbPb06551Y4
-`
-	encodedShort := strings.Replace(encoded, "\n", "", -1)
-
-	dec := NewDecoder(StdEncoding, strings.NewReader(encoded))
-	res1, err := ioutil.ReadAll(dec)
-	if err != nil {
-		t.Errorf("ReadAll failed: %v", err)
-	}
-
-	dec = NewDecoder(StdEncoding, strings.NewReader(encodedShort))
-	var res2 []byte
-	res2, err = ioutil.ReadAll(dec)
-	if err != nil {
-		t.Errorf("ReadAll failed: %v", err)
-	}
-
-	if !bytes.Equal(res1, res2) {
-		t.Error("Decoded results not equal")
-	}
-}
-
-func TestDecoderIssue7733(t *testing.T) {
-	s, err := StdEncoding.DecodeString("YWJjZA=====")
-	want := CorruptInputError(8)
-	if !reflect.DeepEqual(want, err) {
-		t.Errorf("Error = %v; want CorruptInputError(8)", err)
-	}
-	if string(s) != "abcd" {
-		t.Errorf("DecodeString = %q; want abcd", s)
-	}
-}
-
-func BenchmarkEncodeToString(b *testing.B) {
-	data := make([]byte, 8192)
-	b.SetBytes(int64(len(data)))
-	for i := 0; i < b.N; i++ {
-		StdEncoding.EncodeToString(data)
-	}
-}
-
-func BenchmarkDecodeString(b *testing.B) {
-	data := StdEncoding.EncodeToString(make([]byte, 8192))
-	b.SetBytes(int64(len(data)))
-	for i := 0; i < b.N; i++ {
-		StdEncoding.DecodeString(data)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/binary/binary.go b/third_party/gofrontend/libgo/go/encoding/binary/binary.go
deleted file mode 100644
index 2bbe07c..0000000
--- a/third_party/gofrontend/libgo/go/encoding/binary/binary.go
+++ /dev/null
@@ -1,618 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package binary implements simple translation between numbers and byte
-// sequences and encoding and decoding of varints.
-//
-// Numbers are translated by reading and writing fixed-size values.
-// A fixed-size value is either a fixed-size arithmetic
-// type (int8, uint8, int16, float32, complex64, ...)
-// or an array or struct containing only fixed-size values.
-//
-// The varint functions encode and decode single integer values using
-// a variable-length encoding; smaller values require fewer bytes.
-// For a specification, see
-// https://developers.google.com/protocol-buffers/docs/encoding.
-//
-// This package favors simplicity over efficiency. Clients that require
-// high-performance serialization, especially for large data structures,
-// should look at more advanced solutions such as the encoding/gob
-// package or protocol buffers.
-package binary
-
-import (
-	"errors"
-	"io"
-	"math"
-	"reflect"
-)
-
-// A ByteOrder specifies how to convert byte sequences into
-// 16-, 32-, or 64-bit unsigned integers.
-type ByteOrder interface {
-	Uint16([]byte) uint16
-	Uint32([]byte) uint32
-	Uint64([]byte) uint64
-	PutUint16([]byte, uint16)
-	PutUint32([]byte, uint32)
-	PutUint64([]byte, uint64)
-	String() string
-}
-
-// LittleEndian is the little-endian implementation of ByteOrder.
-var LittleEndian littleEndian
-
-// BigEndian is the big-endian implementation of ByteOrder.
-var BigEndian bigEndian
-
-type littleEndian struct{}
-
-func (littleEndian) Uint16(b []byte) uint16 { return uint16(b[0]) | uint16(b[1])<<8 }
-
-func (littleEndian) PutUint16(b []byte, v uint16) {
-	b[0] = byte(v)
-	b[1] = byte(v >> 8)
-}
-
-func (littleEndian) Uint32(b []byte) uint32 {
-	return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
-}
-
-func (littleEndian) PutUint32(b []byte, v uint32) {
-	b[0] = byte(v)
-	b[1] = byte(v >> 8)
-	b[2] = byte(v >> 16)
-	b[3] = byte(v >> 24)
-}
-
-func (littleEndian) Uint64(b []byte) uint64 {
-	return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
-		uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
-}
-
-func (littleEndian) PutUint64(b []byte, v uint64) {
-	b[0] = byte(v)
-	b[1] = byte(v >> 8)
-	b[2] = byte(v >> 16)
-	b[3] = byte(v >> 24)
-	b[4] = byte(v >> 32)
-	b[5] = byte(v >> 40)
-	b[6] = byte(v >> 48)
-	b[7] = byte(v >> 56)
-}
-
-func (littleEndian) String() string { return "LittleEndian" }
-
-func (littleEndian) GoString() string { return "binary.LittleEndian" }
-
-type bigEndian struct{}
-
-func (bigEndian) Uint16(b []byte) uint16 { return uint16(b[1]) | uint16(b[0])<<8 }
-
-func (bigEndian) PutUint16(b []byte, v uint16) {
-	b[0] = byte(v >> 8)
-	b[1] = byte(v)
-}
-
-func (bigEndian) Uint32(b []byte) uint32 {
-	return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
-}
-
-func (bigEndian) PutUint32(b []byte, v uint32) {
-	b[0] = byte(v >> 24)
-	b[1] = byte(v >> 16)
-	b[2] = byte(v >> 8)
-	b[3] = byte(v)
-}
-
-func (bigEndian) Uint64(b []byte) uint64 {
-	return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
-		uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
-}
-
-func (bigEndian) PutUint64(b []byte, v uint64) {
-	b[0] = byte(v >> 56)
-	b[1] = byte(v >> 48)
-	b[2] = byte(v >> 40)
-	b[3] = byte(v >> 32)
-	b[4] = byte(v >> 24)
-	b[5] = byte(v >> 16)
-	b[6] = byte(v >> 8)
-	b[7] = byte(v)
-}
-
-func (bigEndian) String() string { return "BigEndian" }
-
-func (bigEndian) GoString() string { return "binary.BigEndian" }
-
-// Read reads structured binary data from r into data.
-// Data must be a pointer to a fixed-size value or a slice
-// of fixed-size values.
-// Bytes read from r are decoded using the specified byte order
-// and written to successive fields of the data.
-// When reading into structs, the field data for fields with
-// blank (_) field names is skipped; i.e., blank field names
-// may be used for padding.
-// When reading into a struct, all non-blank fields must be exported.
-func Read(r io.Reader, order ByteOrder, data interface{}) error {
-	// Fast path for basic types and slices.
-	if n := intDataSize(data); n != 0 {
-		var b [8]byte
-		var bs []byte
-		if n > len(b) {
-			bs = make([]byte, n)
-		} else {
-			bs = b[:n]
-		}
-		if _, err := io.ReadFull(r, bs); err != nil {
-			return err
-		}
-		switch data := data.(type) {
-		case *int8:
-			*data = int8(b[0])
-		case *uint8:
-			*data = b[0]
-		case *int16:
-			*data = int16(order.Uint16(bs))
-		case *uint16:
-			*data = order.Uint16(bs)
-		case *int32:
-			*data = int32(order.Uint32(bs))
-		case *uint32:
-			*data = order.Uint32(bs)
-		case *int64:
-			*data = int64(order.Uint64(bs))
-		case *uint64:
-			*data = order.Uint64(bs)
-		case []int8:
-			for i, x := range bs { // Easier to loop over the input for 8-bit values.
-				data[i] = int8(x)
-			}
-		case []uint8:
-			copy(data, bs)
-		case []int16:
-			for i := range data {
-				data[i] = int16(order.Uint16(bs[2*i:]))
-			}
-		case []uint16:
-			for i := range data {
-				data[i] = order.Uint16(bs[2*i:])
-			}
-		case []int32:
-			for i := range data {
-				data[i] = int32(order.Uint32(bs[4*i:]))
-			}
-		case []uint32:
-			for i := range data {
-				data[i] = order.Uint32(bs[4*i:])
-			}
-		case []int64:
-			for i := range data {
-				data[i] = int64(order.Uint64(bs[8*i:]))
-			}
-		case []uint64:
-			for i := range data {
-				data[i] = order.Uint64(bs[8*i:])
-			}
-		}
-		return nil
-	}
-
-	// Fallback to reflect-based decoding.
-	v := reflect.ValueOf(data)
-	size := -1
-	switch v.Kind() {
-	case reflect.Ptr:
-		v = v.Elem()
-		size = dataSize(v)
-	case reflect.Slice:
-		size = dataSize(v)
-	}
-	if size < 0 {
-		return errors.New("binary.Read: invalid type " + reflect.TypeOf(data).String())
-	}
-	d := &decoder{order: order, buf: make([]byte, size)}
-	if _, err := io.ReadFull(r, d.buf); err != nil {
-		return err
-	}
-	d.value(v)
-	return nil
-}
-
-// Write writes the binary representation of data into w.
-// Data must be a fixed-size value or a slice of fixed-size
-// values, or a pointer to such data.
-// Bytes written to w are encoded using the specified byte order
-// and read from successive fields of the data.
-// When writing structs, zero values are written for fields
-// with blank (_) field names.
-func Write(w io.Writer, order ByteOrder, data interface{}) error {
-	// Fast path for basic types and slices.
-	if n := intDataSize(data); n != 0 {
-		var b [8]byte
-		var bs []byte
-		if n > len(b) {
-			bs = make([]byte, n)
-		} else {
-			bs = b[:n]
-		}
-		switch v := data.(type) {
-		case *int8:
-			b[0] = byte(*v)
-		case int8:
-			b[0] = byte(v)
-		case []int8:
-			for i, x := range v {
-				bs[i] = byte(x)
-			}
-		case *uint8:
-			b[0] = *v
-		case uint8:
-			b[0] = byte(v)
-		case []uint8:
-			bs = v
-		case *int16:
-			order.PutUint16(bs, uint16(*v))
-		case int16:
-			order.PutUint16(bs, uint16(v))
-		case []int16:
-			for i, x := range v {
-				order.PutUint16(bs[2*i:], uint16(x))
-			}
-		case *uint16:
-			order.PutUint16(bs, *v)
-		case uint16:
-			order.PutUint16(bs, v)
-		case []uint16:
-			for i, x := range v {
-				order.PutUint16(bs[2*i:], x)
-			}
-		case *int32:
-			order.PutUint32(bs, uint32(*v))
-		case int32:
-			order.PutUint32(bs, uint32(v))
-		case []int32:
-			for i, x := range v {
-				order.PutUint32(bs[4*i:], uint32(x))
-			}
-		case *uint32:
-			order.PutUint32(bs, *v)
-		case uint32:
-			order.PutUint32(bs, v)
-		case []uint32:
-			for i, x := range v {
-				order.PutUint32(bs[4*i:], x)
-			}
-		case *int64:
-			order.PutUint64(bs, uint64(*v))
-		case int64:
-			order.PutUint64(bs, uint64(v))
-		case []int64:
-			for i, x := range v {
-				order.PutUint64(bs[8*i:], uint64(x))
-			}
-		case *uint64:
-			order.PutUint64(bs, *v)
-		case uint64:
-			order.PutUint64(bs, v)
-		case []uint64:
-			for i, x := range v {
-				order.PutUint64(bs[8*i:], x)
-			}
-		}
-		_, err := w.Write(bs)
-		return err
-	}
-
-	// Fallback to reflect-based encoding.
-	v := reflect.Indirect(reflect.ValueOf(data))
-	size := dataSize(v)
-	if size < 0 {
-		return errors.New("binary.Write: invalid type " + reflect.TypeOf(data).String())
-	}
-	buf := make([]byte, size)
-	e := &encoder{order: order, buf: buf}
-	e.value(v)
-	_, err := w.Write(buf)
-	return err
-}
-
-// Size returns how many bytes Write would generate to encode the value v, which
-// must be a fixed-size value or a slice of fixed-size values, or a pointer to such data.
-// If v is neither of these, Size returns -1.
-func Size(v interface{}) int {
-	return dataSize(reflect.Indirect(reflect.ValueOf(v)))
-}
-
-// dataSize returns the number of bytes the actual data represented by v occupies in memory.
-// For compound structures, it sums the sizes of the elements. Thus, for instance, for a slice
-// it returns the length of the slice times the element size and does not count the memory
-// occupied by the header. If the type of v is not acceptable, dataSize returns -1.
-func dataSize(v reflect.Value) int {
-	if v.Kind() == reflect.Slice {
-		if s := sizeof(v.Type().Elem()); s >= 0 {
-			return s * v.Len()
-		}
-		return -1
-	}
-	return sizeof(v.Type())
-}
-
-// sizeof returns the size >= 0 of variables for the given type or -1 if the type is not acceptable.
-func sizeof(t reflect.Type) int {
-	switch t.Kind() {
-	case reflect.Array:
-		if s := sizeof(t.Elem()); s >= 0 {
-			return s * t.Len()
-		}
-
-	case reflect.Struct:
-		sum := 0
-		for i, n := 0, t.NumField(); i < n; i++ {
-			s := sizeof(t.Field(i).Type)
-			if s < 0 {
-				return -1
-			}
-			sum += s
-		}
-		return sum
-
-	case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
-		reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
-		reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128:
-		return int(t.Size())
-	}
-
-	return -1
-}
-
-type coder struct {
-	order ByteOrder
-	buf   []byte
-}
-
-type decoder coder
-type encoder coder
-
-func (d *decoder) uint8() uint8 {
-	x := d.buf[0]
-	d.buf = d.buf[1:]
-	return x
-}
-
-func (e *encoder) uint8(x uint8) {
-	e.buf[0] = x
-	e.buf = e.buf[1:]
-}
-
-func (d *decoder) uint16() uint16 {
-	x := d.order.Uint16(d.buf[0:2])
-	d.buf = d.buf[2:]
-	return x
-}
-
-func (e *encoder) uint16(x uint16) {
-	e.order.PutUint16(e.buf[0:2], x)
-	e.buf = e.buf[2:]
-}
-
-func (d *decoder) uint32() uint32 {
-	x := d.order.Uint32(d.buf[0:4])
-	d.buf = d.buf[4:]
-	return x
-}
-
-func (e *encoder) uint32(x uint32) {
-	e.order.PutUint32(e.buf[0:4], x)
-	e.buf = e.buf[4:]
-}
-
-func (d *decoder) uint64() uint64 {
-	x := d.order.Uint64(d.buf[0:8])
-	d.buf = d.buf[8:]
-	return x
-}
-
-func (e *encoder) uint64(x uint64) {
-	e.order.PutUint64(e.buf[0:8], x)
-	e.buf = e.buf[8:]
-}
-
-func (d *decoder) int8() int8 { return int8(d.uint8()) }
-
-func (e *encoder) int8(x int8) { e.uint8(uint8(x)) }
-
-func (d *decoder) int16() int16 { return int16(d.uint16()) }
-
-func (e *encoder) int16(x int16) { e.uint16(uint16(x)) }
-
-func (d *decoder) int32() int32 { return int32(d.uint32()) }
-
-func (e *encoder) int32(x int32) { e.uint32(uint32(x)) }
-
-func (d *decoder) int64() int64 { return int64(d.uint64()) }
-
-func (e *encoder) int64(x int64) { e.uint64(uint64(x)) }
-
-func (d *decoder) value(v reflect.Value) {
-	switch v.Kind() {
-	case reflect.Array:
-		l := v.Len()
-		for i := 0; i < l; i++ {
-			d.value(v.Index(i))
-		}
-
-	case reflect.Struct:
-		t := v.Type()
-		l := v.NumField()
-		for i := 0; i < l; i++ {
-			// Note: Calling v.CanSet() below is an optimization.
-			// It would be sufficient to check the field name,
-			// but creating the StructField info for each field is
-			// costly (run "go test -bench=ReadStruct" and compare
-			// results when making changes to this code).
-			if v := v.Field(i); v.CanSet() || t.Field(i).Name != "_" {
-				d.value(v)
-			} else {
-				d.skip(v)
-			}
-		}
-
-	case reflect.Slice:
-		l := v.Len()
-		for i := 0; i < l; i++ {
-			d.value(v.Index(i))
-		}
-
-	case reflect.Int8:
-		v.SetInt(int64(d.int8()))
-	case reflect.Int16:
-		v.SetInt(int64(d.int16()))
-	case reflect.Int32:
-		v.SetInt(int64(d.int32()))
-	case reflect.Int64:
-		v.SetInt(d.int64())
-
-	case reflect.Uint8:
-		v.SetUint(uint64(d.uint8()))
-	case reflect.Uint16:
-		v.SetUint(uint64(d.uint16()))
-	case reflect.Uint32:
-		v.SetUint(uint64(d.uint32()))
-	case reflect.Uint64:
-		v.SetUint(d.uint64())
-
-	case reflect.Float32:
-		v.SetFloat(float64(math.Float32frombits(d.uint32())))
-	case reflect.Float64:
-		v.SetFloat(math.Float64frombits(d.uint64()))
-
-	case reflect.Complex64:
-		v.SetComplex(complex(
-			float64(math.Float32frombits(d.uint32())),
-			float64(math.Float32frombits(d.uint32())),
-		))
-	case reflect.Complex128:
-		v.SetComplex(complex(
-			math.Float64frombits(d.uint64()),
-			math.Float64frombits(d.uint64()),
-		))
-	}
-}
-
-func (e *encoder) value(v reflect.Value) {
-	switch v.Kind() {
-	case reflect.Array:
-		l := v.Len()
-		for i := 0; i < l; i++ {
-			e.value(v.Index(i))
-		}
-
-	case reflect.Struct:
-		t := v.Type()
-		l := v.NumField()
-		for i := 0; i < l; i++ {
-			// see comment for corresponding code in decoder.value()
-			if v := v.Field(i); v.CanSet() || t.Field(i).Name != "_" {
-				e.value(v)
-			} else {
-				e.skip(v)
-			}
-		}
-
-	case reflect.Slice:
-		l := v.Len()
-		for i := 0; i < l; i++ {
-			e.value(v.Index(i))
-		}
-
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		switch v.Type().Kind() {
-		case reflect.Int8:
-			e.int8(int8(v.Int()))
-		case reflect.Int16:
-			e.int16(int16(v.Int()))
-		case reflect.Int32:
-			e.int32(int32(v.Int()))
-		case reflect.Int64:
-			e.int64(v.Int())
-		}
-
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		switch v.Type().Kind() {
-		case reflect.Uint8:
-			e.uint8(uint8(v.Uint()))
-		case reflect.Uint16:
-			e.uint16(uint16(v.Uint()))
-		case reflect.Uint32:
-			e.uint32(uint32(v.Uint()))
-		case reflect.Uint64:
-			e.uint64(v.Uint())
-		}
-
-	case reflect.Float32, reflect.Float64:
-		switch v.Type().Kind() {
-		case reflect.Float32:
-			e.uint32(math.Float32bits(float32(v.Float())))
-		case reflect.Float64:
-			e.uint64(math.Float64bits(v.Float()))
-		}
-
-	case reflect.Complex64, reflect.Complex128:
-		switch v.Type().Kind() {
-		case reflect.Complex64:
-			x := v.Complex()
-			e.uint32(math.Float32bits(float32(real(x))))
-			e.uint32(math.Float32bits(float32(imag(x))))
-		case reflect.Complex128:
-			x := v.Complex()
-			e.uint64(math.Float64bits(real(x)))
-			e.uint64(math.Float64bits(imag(x)))
-		}
-	}
-}
-
-func (d *decoder) skip(v reflect.Value) {
-	d.buf = d.buf[dataSize(v):]
-}
-
-func (e *encoder) skip(v reflect.Value) {
-	n := dataSize(v)
-	for i := range e.buf[0:n] {
-		e.buf[i] = 0
-	}
-	e.buf = e.buf[n:]
-}
-
-// intDataSize returns the size of the data required to represent the data when encoded.
-// It returns zero if the type cannot be implemented by the fast path in Read or Write.
-func intDataSize(data interface{}) int {
-	switch data := data.(type) {
-	case int8, uint8, *int8, *uint8:
-		return 1
-	case []int8:
-		return len(data)
-	case []uint8:
-		return len(data)
-	case int16, uint16, *int16, *uint16:
-		return 2
-	case []int16:
-		return 2 * len(data)
-	case []uint16:
-		return 2 * len(data)
-	case int32, uint32, *int32, *uint32:
-		return 4
-	case []int32:
-		return 4 * len(data)
-	case []uint32:
-		return 4 * len(data)
-	case int64, uint64, *int64, *uint64:
-		return 8
-	case []int64:
-		return 8 * len(data)
-	case []uint64:
-		return 8 * len(data)
-	}
-	return 0
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/binary/binary_test.go b/third_party/gofrontend/libgo/go/encoding/binary/binary_test.go
deleted file mode 100644
index 8ee595f..0000000
--- a/third_party/gofrontend/libgo/go/encoding/binary/binary_test.go
+++ /dev/null
@@ -1,416 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package binary
-
-import (
-	"bytes"
-	"io"
-	"math"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-type Struct struct {
-	Int8       int8
-	Int16      int16
-	Int32      int32
-	Int64      int64
-	Uint8      uint8
-	Uint16     uint16
-	Uint32     uint32
-	Uint64     uint64
-	Float32    float32
-	Float64    float64
-	Complex64  complex64
-	Complex128 complex128
-	Array      [4]uint8
-}
-
-type T struct {
-	Int     int
-	Uint    uint
-	Uintptr uintptr
-	Array   [4]int
-}
-
-var s = Struct{
-	0x01,
-	0x0203,
-	0x04050607,
-	0x08090a0b0c0d0e0f,
-	0x10,
-	0x1112,
-	0x13141516,
-	0x1718191a1b1c1d1e,
-
-	math.Float32frombits(0x1f202122),
-	math.Float64frombits(0x232425262728292a),
-	complex(
-		math.Float32frombits(0x2b2c2d2e),
-		math.Float32frombits(0x2f303132),
-	),
-	complex(
-		math.Float64frombits(0x333435363738393a),
-		math.Float64frombits(0x3b3c3d3e3f404142),
-	),
-
-	[4]uint8{0x43, 0x44, 0x45, 0x46},
-}
-
-var big = []byte{
-	1,
-	2, 3,
-	4, 5, 6, 7,
-	8, 9, 10, 11, 12, 13, 14, 15,
-	16,
-	17, 18,
-	19, 20, 21, 22,
-	23, 24, 25, 26, 27, 28, 29, 30,
-
-	31, 32, 33, 34,
-	35, 36, 37, 38, 39, 40, 41, 42,
-	43, 44, 45, 46, 47, 48, 49, 50,
-	51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
-
-	67, 68, 69, 70,
-}
-
-var little = []byte{
-	1,
-	3, 2,
-	7, 6, 5, 4,
-	15, 14, 13, 12, 11, 10, 9, 8,
-	16,
-	18, 17,
-	22, 21, 20, 19,
-	30, 29, 28, 27, 26, 25, 24, 23,
-
-	34, 33, 32, 31,
-	42, 41, 40, 39, 38, 37, 36, 35,
-	46, 45, 44, 43, 50, 49, 48, 47,
-	58, 57, 56, 55, 54, 53, 52, 51, 66, 65, 64, 63, 62, 61, 60, 59,
-
-	67, 68, 69, 70,
-}
-
-var src = []byte{1, 2, 3, 4, 5, 6, 7, 8}
-var res = []int32{0x01020304, 0x05060708}
-
-func checkResult(t *testing.T, dir string, order ByteOrder, err error, have, want interface{}) {
-	if err != nil {
-		t.Errorf("%v %v: %v", dir, order, err)
-		return
-	}
-	if !reflect.DeepEqual(have, want) {
-		t.Errorf("%v %v:\n\thave %+v\n\twant %+v", dir, order, have, want)
-	}
-}
-
-func testRead(t *testing.T, order ByteOrder, b []byte, s1 interface{}) {
-	var s2 Struct
-	err := Read(bytes.NewReader(b), order, &s2)
-	checkResult(t, "Read", order, err, s2, s1)
-}
-
-func testWrite(t *testing.T, order ByteOrder, b []byte, s1 interface{}) {
-	buf := new(bytes.Buffer)
-	err := Write(buf, order, s1)
-	checkResult(t, "Write", order, err, buf.Bytes(), b)
-}
-
-func TestLittleEndianRead(t *testing.T)     { testRead(t, LittleEndian, little, s) }
-func TestLittleEndianWrite(t *testing.T)    { testWrite(t, LittleEndian, little, s) }
-func TestLittleEndianPtrWrite(t *testing.T) { testWrite(t, LittleEndian, little, &s) }
-
-func TestBigEndianRead(t *testing.T)     { testRead(t, BigEndian, big, s) }
-func TestBigEndianWrite(t *testing.T)    { testWrite(t, BigEndian, big, s) }
-func TestBigEndianPtrWrite(t *testing.T) { testWrite(t, BigEndian, big, &s) }
-
-func TestReadSlice(t *testing.T) {
-	slice := make([]int32, 2)
-	err := Read(bytes.NewReader(src), BigEndian, slice)
-	checkResult(t, "ReadSlice", BigEndian, err, slice, res)
-}
-
-func TestWriteSlice(t *testing.T) {
-	buf := new(bytes.Buffer)
-	err := Write(buf, BigEndian, res)
-	checkResult(t, "WriteSlice", BigEndian, err, buf.Bytes(), src)
-}
-
-// Addresses of arrays are easier to manipulate with reflection than are slices.
-var intArrays = []interface{}{
-	&[100]int8{},
-	&[100]int16{},
-	&[100]int32{},
-	&[100]int64{},
-	&[100]uint8{},
-	&[100]uint16{},
-	&[100]uint32{},
-	&[100]uint64{},
-}
-
-func TestSliceRoundTrip(t *testing.T) {
-	buf := new(bytes.Buffer)
-	for _, array := range intArrays {
-		src := reflect.ValueOf(array).Elem()
-		unsigned := false
-		switch src.Index(0).Kind() {
-		case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
-			unsigned = true
-		}
-		for i := 0; i < src.Len(); i++ {
-			if unsigned {
-				src.Index(i).SetUint(uint64(i * 0x07654321))
-			} else {
-				src.Index(i).SetInt(int64(i * 0x07654321))
-			}
-		}
-		buf.Reset()
-		srcSlice := src.Slice(0, src.Len())
-		err := Write(buf, BigEndian, srcSlice.Interface())
-		if err != nil {
-			t.Fatal(err)
-		}
-		dst := reflect.New(src.Type()).Elem()
-		dstSlice := dst.Slice(0, dst.Len())
-		err = Read(buf, BigEndian, dstSlice.Interface())
-		if err != nil {
-			t.Fatal(err)
-		}
-		if !reflect.DeepEqual(src.Interface(), dst.Interface()) {
-			t.Fatal(src)
-		}
-	}
-}
-
-func TestWriteT(t *testing.T) {
-	buf := new(bytes.Buffer)
-	ts := T{}
-	if err := Write(buf, BigEndian, ts); err == nil {
-		t.Errorf("WriteT: have err == nil, want non-nil")
-	}
-
-	tv := reflect.Indirect(reflect.ValueOf(ts))
-	for i, n := 0, tv.NumField(); i < n; i++ {
-		typ := tv.Field(i).Type().String()
-		if typ == "[4]int" {
-			typ = "int" // the problem is int, not the [4]
-		}
-		if err := Write(buf, BigEndian, tv.Field(i).Interface()); err == nil {
-			t.Errorf("WriteT.%v: have err == nil, want non-nil", tv.Field(i).Type())
-		} else if !strings.Contains(err.Error(), typ) {
-			t.Errorf("WriteT: have err == %q, want it to mention %s", err, typ)
-		}
-	}
-}
-
-type BlankFields struct {
-	A uint32
-	_ int32
-	B float64
-	_ [4]int16
-	C byte
-	_ [7]byte
-	_ struct {
-		f [8]float32
-	}
-}
-
-type BlankFieldsProbe struct {
-	A  uint32
-	P0 int32
-	B  float64
-	P1 [4]int16
-	C  byte
-	P2 [7]byte
-	P3 struct {
-		F [8]float32
-	}
-}
-
-func TestBlankFields(t *testing.T) {
-	buf := new(bytes.Buffer)
-	b1 := BlankFields{A: 1234567890, B: 2.718281828, C: 42}
-	if err := Write(buf, LittleEndian, &b1); err != nil {
-		t.Error(err)
-	}
-
-	// zero values must have been written for blank fields
-	var p BlankFieldsProbe
-	if err := Read(buf, LittleEndian, &p); err != nil {
-		t.Error(err)
-	}
-
-	// quick test: only check first value of slices
-	if p.P0 != 0 || p.P1[0] != 0 || p.P2[0] != 0 || p.P3.F[0] != 0 {
-		t.Errorf("non-zero values for originally blank fields: %#v", p)
-	}
-
-	// write p and see if we can probe only some fields
-	if err := Write(buf, LittleEndian, &p); err != nil {
-		t.Error(err)
-	}
-
-	// read should ignore blank fields in b2
-	var b2 BlankFields
-	if err := Read(buf, LittleEndian, &b2); err != nil {
-		t.Error(err)
-	}
-	if b1.A != b2.A || b1.B != b2.B || b1.C != b2.C {
-		t.Errorf("%#v != %#v", b1, b2)
-	}
-}
-
-// An attempt to read into a struct with an unexported field will
-// panic.  This is probably not the best choice, but at this point
-// anything else would be an API change.
-
-type Unexported struct {
-	a int32
-}
-
-func TestUnexportedRead(t *testing.T) {
-	var buf bytes.Buffer
-	u1 := Unexported{a: 1}
-	if err := Write(&buf, LittleEndian, &u1); err != nil {
-		t.Fatal(err)
-	}
-
-	defer func() {
-		if recover() == nil {
-			t.Fatal("did not panic")
-		}
-	}()
-	var u2 Unexported
-	Read(&buf, LittleEndian, &u2)
-}
-
-func TestReadErrorMsg(t *testing.T) {
-	var buf bytes.Buffer
-	read := func(data interface{}) {
-		err := Read(&buf, LittleEndian, data)
-		want := "binary.Read: invalid type " + reflect.TypeOf(data).String()
-		if err == nil {
-			t.Errorf("%T: got no error; want %q", data, want)
-			return
-		}
-		if got := err.Error(); got != want {
-			t.Errorf("%T: got %q; want %q", data, got, want)
-		}
-	}
-	read(0)
-	s := new(struct{})
-	read(&s)
-	p := &s
-	read(&p)
-}
-
-type byteSliceReader struct {
-	remain []byte
-}
-
-func (br *byteSliceReader) Read(p []byte) (int, error) {
-	n := copy(p, br.remain)
-	br.remain = br.remain[n:]
-	return n, nil
-}
-
-func BenchmarkReadSlice1000Int32s(b *testing.B) {
-	bsr := &byteSliceReader{}
-	slice := make([]int32, 1000)
-	buf := make([]byte, len(slice)*4)
-	b.SetBytes(int64(len(buf)))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		bsr.remain = buf
-		Read(bsr, BigEndian, slice)
-	}
-}
-
-func BenchmarkReadStruct(b *testing.B) {
-	bsr := &byteSliceReader{}
-	var buf bytes.Buffer
-	Write(&buf, BigEndian, &s)
-	b.SetBytes(int64(dataSize(reflect.ValueOf(s))))
-	t := s
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		bsr.remain = buf.Bytes()
-		Read(bsr, BigEndian, &t)
-	}
-	b.StopTimer()
-	if !reflect.DeepEqual(s, t) {
-		b.Fatal("no match")
-	}
-}
-
-func BenchmarkReadInts(b *testing.B) {
-	var ls Struct
-	bsr := &byteSliceReader{}
-	var r io.Reader = bsr
-	b.SetBytes(2 * (1 + 2 + 4 + 8))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		bsr.remain = big
-		Read(r, BigEndian, &ls.Int8)
-		Read(r, BigEndian, &ls.Int16)
-		Read(r, BigEndian, &ls.Int32)
-		Read(r, BigEndian, &ls.Int64)
-		Read(r, BigEndian, &ls.Uint8)
-		Read(r, BigEndian, &ls.Uint16)
-		Read(r, BigEndian, &ls.Uint32)
-		Read(r, BigEndian, &ls.Uint64)
-	}
-
-	want := s
-	want.Float32 = 0
-	want.Float64 = 0
-	want.Complex64 = 0
-	want.Complex128 = 0
-	for i := range want.Array {
-		want.Array[i] = 0
-	}
-	b.StopTimer()
-	if !reflect.DeepEqual(ls, want) {
-		panic("no match")
-	}
-}
-
-func BenchmarkWriteInts(b *testing.B) {
-	buf := new(bytes.Buffer)
-	var w io.Writer = buf
-	b.SetBytes(2 * (1 + 2 + 4 + 8))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		Write(w, BigEndian, s.Int8)
-		Write(w, BigEndian, s.Int16)
-		Write(w, BigEndian, s.Int32)
-		Write(w, BigEndian, s.Int64)
-		Write(w, BigEndian, s.Uint8)
-		Write(w, BigEndian, s.Uint16)
-		Write(w, BigEndian, s.Uint32)
-		Write(w, BigEndian, s.Uint64)
-	}
-	b.StopTimer()
-	if !bytes.Equal(buf.Bytes(), big[:30]) {
-		b.Fatalf("first half doesn't match: %x %x", buf.Bytes(), big[:30])
-	}
-}
-
-func BenchmarkWriteSlice1000Int32s(b *testing.B) {
-	slice := make([]int32, 1000)
-	buf := new(bytes.Buffer)
-	var w io.Writer = buf
-	b.SetBytes(4 * 1000)
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		Write(w, BigEndian, slice)
-	}
-	b.StopTimer()
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/binary/varint.go b/third_party/gofrontend/libgo/go/encoding/binary/varint.go
deleted file mode 100644
index 3a2dfa3..0000000
--- a/third_party/gofrontend/libgo/go/encoding/binary/varint.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package binary
-
-// This file implements "varint" encoding of 64-bit integers.
-// The encoding is:
-// - unsigned integers are serialized 7 bits at a time, starting with the
-//   least significant bits
-// - the most significant bit (msb) in each output byte indicates if there
-//   is a continuation byte (msb = 1)
-// - signed integers are mapped to unsigned integers using "zig-zag"
-//   encoding: Positive values x are written as 2*x + 0, negative values
-//   are written as 2*(^x) + 1; that is, negative numbers are complemented
-//   and whether to complement is encoded in bit 0.
-//
-// Design note:
-// At most 10 bytes are needed for 64-bit values. The encoding could
-// be more dense: a full 64-bit value needs an extra byte just to hold bit 63.
-// Instead, the msb of the previous byte could be used to hold bit 63 since we
-// know there can't be more than 64 bits. This is a trivial improvement and
-// would reduce the maximum encoding length to 9 bytes. However, it breaks the
-// invariant that the msb is always the "continuation bit" and thus makes the
-// format incompatible with a varint encoding for larger numbers (say 128-bit).
-
-import (
-	"errors"
-	"io"
-)
-
-// MaxVarintLenN is the maximum length of a varint-encoded N-bit integer.
-const (
-	MaxVarintLen16 = 3
-	MaxVarintLen32 = 5
-	MaxVarintLen64 = 10
-)
-
-// PutUvarint encodes a uint64 into buf and returns the number of bytes written.
-// If the buffer is too small, PutUvarint will panic.
-func PutUvarint(buf []byte, x uint64) int {
-	i := 0
-	for x >= 0x80 {
-		buf[i] = byte(x) | 0x80
-		x >>= 7
-		i++
-	}
-	buf[i] = byte(x)
-	return i + 1
-}
-
-// Uvarint decodes a uint64 from buf and returns that value and the
-// number of bytes read (> 0). If an error occurred, the value is 0
-// and the number of bytes n is <= 0 meaning:
-//
-//	n == 0: buf too small
-//	n  < 0: value larger than 64 bits (overflow)
-//              and -n is the number of bytes read
-//
-func Uvarint(buf []byte) (uint64, int) {
-	var x uint64
-	var s uint
-	for i, b := range buf {
-		if b < 0x80 {
-			if i > 9 || i == 9 && b > 1 {
-				return 0, -(i + 1) // overflow
-			}
-			return x | uint64(b)<<s, i + 1
-		}
-		x |= uint64(b&0x7f) << s
-		s += 7
-	}
-	return 0, 0
-}
-
-// PutVarint encodes an int64 into buf and returns the number of bytes written.
-// If the buffer is too small, PutVarint will panic.
-func PutVarint(buf []byte, x int64) int {
-	ux := uint64(x) << 1
-	if x < 0 {
-		ux = ^ux
-	}
-	return PutUvarint(buf, ux)
-}
-
-// Varint decodes an int64 from buf and returns that value and the
-// number of bytes read (> 0). If an error occurred, the value is 0
-// and the number of bytes n is <= 0 with the following meaning:
-//
-//	n == 0: buf too small
-//	n  < 0: value larger than 64 bits (overflow)
-//              and -n is the number of bytes read
-//
-func Varint(buf []byte) (int64, int) {
-	ux, n := Uvarint(buf) // ok to continue in presence of error
-	x := int64(ux >> 1)
-	if ux&1 != 0 {
-		x = ^x
-	}
-	return x, n
-}
-
-var overflow = errors.New("binary: varint overflows a 64-bit integer")
-
-// ReadUvarint reads an encoded unsigned integer from r and returns it as a uint64.
-func ReadUvarint(r io.ByteReader) (uint64, error) {
-	var x uint64
-	var s uint
-	for i := 0; ; i++ {
-		b, err := r.ReadByte()
-		if err != nil {
-			return x, err
-		}
-		if b < 0x80 {
-			if i > 9 || i == 9 && b > 1 {
-				return x, overflow
-			}
-			return x | uint64(b)<<s, nil
-		}
-		x |= uint64(b&0x7f) << s
-		s += 7
-	}
-}
-
-// ReadVarint reads an encoded signed integer from r and returns it as an int64.
-func ReadVarint(r io.ByteReader) (int64, error) {
-	ux, err := ReadUvarint(r) // ok to continue in presence of error
-	x := int64(ux >> 1)
-	if ux&1 != 0 {
-		x = ^x
-	}
-	return x, err
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/binary/varint_test.go b/third_party/gofrontend/libgo/go/encoding/binary/varint_test.go
deleted file mode 100644
index ca411ec..0000000
--- a/third_party/gofrontend/libgo/go/encoding/binary/varint_test.go
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package binary
-
-import (
-	"bytes"
-	"io"
-	"testing"
-)
-
-func testConstant(t *testing.T, w uint, max int) {
-	buf := make([]byte, MaxVarintLen64)
-	n := PutUvarint(buf, 1<<w-1)
-	if n != max {
-		t.Errorf("MaxVarintLen%d = %d; want %d", w, max, n)
-	}
-}
-
-func TestConstants(t *testing.T) {
-	testConstant(t, 16, MaxVarintLen16)
-	testConstant(t, 32, MaxVarintLen32)
-	testConstant(t, 64, MaxVarintLen64)
-}
-
-func testVarint(t *testing.T, x int64) {
-	buf := make([]byte, MaxVarintLen64)
-	n := PutVarint(buf, x)
-	y, m := Varint(buf[0:n])
-	if x != y {
-		t.Errorf("Varint(%d): got %d", x, y)
-	}
-	if n != m {
-		t.Errorf("Varint(%d): got n = %d; want %d", x, m, n)
-	}
-
-	y, err := ReadVarint(bytes.NewReader(buf))
-	if err != nil {
-		t.Errorf("ReadVarint(%d): %s", x, err)
-	}
-	if x != y {
-		t.Errorf("ReadVarint(%d): got %d", x, y)
-	}
-}
-
-func testUvarint(t *testing.T, x uint64) {
-	buf := make([]byte, MaxVarintLen64)
-	n := PutUvarint(buf, x)
-	y, m := Uvarint(buf[0:n])
-	if x != y {
-		t.Errorf("Uvarint(%d): got %d", x, y)
-	}
-	if n != m {
-		t.Errorf("Uvarint(%d): got n = %d; want %d", x, m, n)
-	}
-
-	y, err := ReadUvarint(bytes.NewReader(buf))
-	if err != nil {
-		t.Errorf("ReadUvarint(%d): %s", x, err)
-	}
-	if x != y {
-		t.Errorf("ReadUvarint(%d): got %d", x, y)
-	}
-}
-
-var tests = []int64{
-	-1 << 63,
-	-1<<63 + 1,
-	-1,
-	0,
-	1,
-	2,
-	10,
-	20,
-	63,
-	64,
-	65,
-	127,
-	128,
-	129,
-	255,
-	256,
-	257,
-	1<<63 - 1,
-}
-
-func TestVarint(t *testing.T) {
-	for _, x := range tests {
-		testVarint(t, x)
-		testVarint(t, -x)
-	}
-	for x := int64(0x7); x != 0; x <<= 1 {
-		testVarint(t, x)
-		testVarint(t, -x)
-	}
-}
-
-func TestUvarint(t *testing.T) {
-	for _, x := range tests {
-		testUvarint(t, uint64(x))
-	}
-	for x := uint64(0x7); x != 0; x <<= 1 {
-		testUvarint(t, x)
-	}
-}
-
-func TestBufferTooSmall(t *testing.T) {
-	buf := []byte{0x80, 0x80, 0x80, 0x80}
-	for i := 0; i <= len(buf); i++ {
-		buf := buf[0:i]
-		x, n := Uvarint(buf)
-		if x != 0 || n != 0 {
-			t.Errorf("Uvarint(%v): got x = %d, n = %d", buf, x, n)
-		}
-
-		x, err := ReadUvarint(bytes.NewReader(buf))
-		if x != 0 || err != io.EOF {
-			t.Errorf("ReadUvarint(%v): got x = %d, err = %s", buf, x, err)
-		}
-	}
-}
-
-func testOverflow(t *testing.T, buf []byte, n0 int, err0 error) {
-	x, n := Uvarint(buf)
-	if x != 0 || n != n0 {
-		t.Errorf("Uvarint(%v): got x = %d, n = %d; want 0, %d", buf, x, n, n0)
-	}
-
-	x, err := ReadUvarint(bytes.NewReader(buf))
-	if x != 0 || err != err0 {
-		t.Errorf("ReadUvarint(%v): got x = %d, err = %s; want 0, %s", buf, x, err, err0)
-	}
-}
-
-func TestOverflow(t *testing.T) {
-	testOverflow(t, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x2}, -10, overflow)
-	testOverflow(t, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x1, 0, 0}, -13, overflow)
-}
-
-func TestNonCanonicalZero(t *testing.T) {
-	buf := []byte{0x80, 0x80, 0x80, 0}
-	x, n := Uvarint(buf)
-	if x != 0 || n != 4 {
-		t.Errorf("Uvarint(%v): got x = %d, n = %d; want 0, 4", buf, x, n)
-
-	}
-}
-
-func BenchmarkPutUvarint32(b *testing.B) {
-	buf := make([]byte, MaxVarintLen32)
-	b.SetBytes(4)
-	for i := 0; i < b.N; i++ {
-		for j := uint(0); j < MaxVarintLen32; j++ {
-			PutUvarint(buf, 1<<(j*7))
-		}
-	}
-}
-
-func BenchmarkPutUvarint64(b *testing.B) {
-	buf := make([]byte, MaxVarintLen64)
-	b.SetBytes(8)
-	for i := 0; i < b.N; i++ {
-		for j := uint(0); j < MaxVarintLen64; j++ {
-			PutUvarint(buf, 1<<(j*7))
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/csv/example_test.go b/third_party/gofrontend/libgo/go/encoding/csv/example_test.go
deleted file mode 100644
index e3c3bd5..0000000
--- a/third_party/gofrontend/libgo/go/encoding/csv/example_test.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package csv_test
-
-import (
-	"encoding/csv"
-	"fmt"
-	"io"
-	"log"
-	"os"
-	"strings"
-)
-
-func ExampleReader() {
-	in := `first_name,last_name,username
-"Rob","Pike",rob
-Ken,Thompson,ken
-"Robert","Griesemer","gri"
-`
-	r := csv.NewReader(strings.NewReader(in))
-
-	for {
-		record, err := r.Read()
-		if err == io.EOF {
-			break
-		}
-		if err != nil {
-			log.Fatal(err)
-		}
-
-		fmt.Println(record)
-	}
-	// Output:
-	// [first_name last_name username]
-	// [Rob Pike rob]
-	// [Ken Thompson ken]
-	// [Robert Griesemer gri]
-}
-
-// This example shows how csv.Reader can be configured to handle other
-// types of CSV files.
-func ExampleReader_options() {
-	in := `first_name;last_name;username
-"Rob";"Pike";rob
-# lines beginning with a # character are ignored
-Ken;Thompson;ken
-"Robert";"Griesemer";"gri"
-`
-	r := csv.NewReader(strings.NewReader(in))
-	r.Comma = ';'
-	r.Comment = '#'
-
-	records, err := r.ReadAll()
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	fmt.Print(records)
-	// Output:
-	// [[first_name last_name username] [Rob Pike rob] [Ken Thompson ken] [Robert Griesemer gri]]
-}
-
-func ExampleReader_ReadAll() {
-	in := `first_name,last_name,username
-"Rob","Pike",rob
-Ken,Thompson,ken
-"Robert","Griesemer","gri"
-`
-	r := csv.NewReader(strings.NewReader(in))
-
-	records, err := r.ReadAll()
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	fmt.Print(records)
-	// Output:
-	// [[first_name last_name username] [Rob Pike rob] [Ken Thompson ken] [Robert Griesemer gri]]
-}
-
-func ExampleWriter() {
-	records := [][]string{
-		{"first_name", "last_name", "username"},
-		{"Rob", "Pike", "rob"},
-		{"Ken", "Thompson", "ken"},
-		{"Robert", "Griesemer", "gri"},
-	}
-
-	w := csv.NewWriter(os.Stdout)
-
-	for _, record := range records {
-		if err := w.Write(record); err != nil {
-			log.Fatalln("error writing record to csv:", err)
-		}
-	}
-
-	// Write any buffered data to the underlying writer (standard output).
-	w.Flush()
-
-	if err := w.Error(); err != nil {
-		log.Fatal(err)
-	}
-	// Output:
-	// first_name,last_name,username
-	// Rob,Pike,rob
-	// Ken,Thompson,ken
-	// Robert,Griesemer,gri
-}
-
-func ExampleWriter_WriteAll() {
-	records := [][]string{
-		{"first_name", "last_name", "username"},
-		{"Rob", "Pike", "rob"},
-		{"Ken", "Thompson", "ken"},
-		{"Robert", "Griesemer", "gri"},
-	}
-
-	w := csv.NewWriter(os.Stdout)
-	w.WriteAll(records) // calls Flush internally
-
-	if err := w.Error(); err != nil {
-		log.Fatalln("error writing csv:", err)
-	}
-	// Output:
-	// first_name,last_name,username
-	// Rob,Pike,rob
-	// Ken,Thompson,ken
-	// Robert,Griesemer,gri
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/csv/reader.go b/third_party/gofrontend/libgo/go/encoding/csv/reader.go
deleted file mode 100644
index 37bf80c..0000000
--- a/third_party/gofrontend/libgo/go/encoding/csv/reader.go
+++ /dev/null
@@ -1,342 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package csv reads and writes comma-separated values (CSV) files.
-//
-// A csv file contains zero or more records of one or more fields per record.
-// Each record is separated by the newline character. The final record may
-// optionally be followed by a newline character.
-//
-//	field1,field2,field3
-//
-// White space is considered part of a field.
-//
-// Carriage returns before newline characters are silently removed.
-//
-// Blank lines are ignored.  A line with only whitespace characters (excluding
-// the ending newline character) is not considered a blank line.
-//
-// Fields which start and stop with the quote character " are called
-// quoted-fields.  The beginning and ending quote are not part of the
-// field.
-//
-// The source:
-//
-//	normal string,"quoted-field"
-//
-// results in the fields
-//
-//	{`normal string`, `quoted-field`}
-//
-// Within a quoted-field a quote character followed by a second quote
-// character is considered a single quote.
-//
-//	"the ""word"" is true","a ""quoted-field"""
-//
-// results in
-//
-//	{`the "word" is true`, `a "quoted-field"`}
-//
-// Newlines and commas may be included in a quoted-field
-//
-//	"Multi-line
-//	field","comma is ,"
-//
-// results in
-//
-//	{`Multi-line
-//	field`, `comma is ,`}
-package csv
-
-import (
-	"bufio"
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"unicode"
-)
-
-// A ParseError is returned for parsing errors.
-// The first line is 1.  The first column is 0.
-type ParseError struct {
-	Line   int   // Line where the error occurred
-	Column int   // Column (rune index) where the error occurred
-	Err    error // The actual error
-}
-
-func (e *ParseError) Error() string {
-	return fmt.Sprintf("line %d, column %d: %s", e.Line, e.Column, e.Err)
-}
-
-// These are the errors that can be returned in ParseError.Error
-var (
-	ErrTrailingComma = errors.New("extra delimiter at end of line") // no longer used
-	ErrBareQuote     = errors.New("bare \" in non-quoted-field")
-	ErrQuote         = errors.New("extraneous \" in field")
-	ErrFieldCount    = errors.New("wrong number of fields in line")
-)
-
-// A Reader reads records from a CSV-encoded file.
-//
-// As returned by NewReader, a Reader expects input conforming to RFC 4180.
-// The exported fields can be changed to customize the details before the
-// first call to Read or ReadAll.
-//
-// Comma is the field delimiter.  It defaults to ','.
-//
-// Comment, if not 0, is the comment character. Lines beginning with the
-// Comment character are ignored.
-//
-// If FieldsPerRecord is positive, Read requires each record to
-// have the given number of fields.  If FieldsPerRecord is 0, Read sets it to
-// the number of fields in the first record, so that future records must
-// have the same field count.  If FieldsPerRecord is negative, no check is
-// made and records may have a variable number of fields.
-//
-// If LazyQuotes is true, a quote may appear in an unquoted field and a
-// non-doubled quote may appear in a quoted field.
-//
-// If TrimLeadingSpace is true, leading white space in a field is ignored.
-type Reader struct {
-	Comma            rune // field delimiter (set to ',' by NewReader)
-	Comment          rune // comment character for start of line
-	FieldsPerRecord  int  // number of expected fields per record
-	LazyQuotes       bool // allow lazy quotes
-	TrailingComma    bool // ignored; here for backwards compatibility
-	TrimLeadingSpace bool // trim leading space
-	line             int
-	column           int
-	r                *bufio.Reader
-	field            bytes.Buffer
-}
-
-// NewReader returns a new Reader that reads from r.
-func NewReader(r io.Reader) *Reader {
-	return &Reader{
-		Comma: ',',
-		r:     bufio.NewReader(r),
-	}
-}
-
-// error creates a new ParseError based on err.
-func (r *Reader) error(err error) error {
-	return &ParseError{
-		Line:   r.line,
-		Column: r.column,
-		Err:    err,
-	}
-}
-
-// Read reads one record from r.  The record is a slice of strings with each
-// string representing one field.
-func (r *Reader) Read() (record []string, err error) {
-	for {
-		record, err = r.parseRecord()
-		if record != nil {
-			break
-		}
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	if r.FieldsPerRecord > 0 {
-		if len(record) != r.FieldsPerRecord {
-			r.column = 0 // report at start of record
-			return record, r.error(ErrFieldCount)
-		}
-	} else if r.FieldsPerRecord == 0 {
-		r.FieldsPerRecord = len(record)
-	}
-	return record, nil
-}
-
-// ReadAll reads all the remaining records from r.
-// Each record is a slice of fields.
-// A successful call returns err == nil, not err == EOF. Because ReadAll is
-// defined to read until EOF, it does not treat end of file as an error to be
-// reported.
-func (r *Reader) ReadAll() (records [][]string, err error) {
-	for {
-		record, err := r.Read()
-		if err == io.EOF {
-			return records, nil
-		}
-		if err != nil {
-			return nil, err
-		}
-		records = append(records, record)
-	}
-}
-
-// readRune reads one rune from r, folding \r\n to \n and keeping track
-// of how far into the line we have read.  r.column will point to the start
-// of this rune, not the end of this rune.
-func (r *Reader) readRune() (rune, error) {
-	r1, _, err := r.r.ReadRune()
-
-	// Handle \r\n here.  We make the simplifying assumption that
-	// anytime \r is followed by \n that it can be folded to \n.
-	// We will not detect files which contain both \r\n and bare \n.
-	if r1 == '\r' {
-		r1, _, err = r.r.ReadRune()
-		if err == nil {
-			if r1 != '\n' {
-				r.r.UnreadRune()
-				r1 = '\r'
-			}
-		}
-	}
-	r.column++
-	return r1, err
-}
-
-// skip reads runes up to and including the rune delim or until error.
-func (r *Reader) skip(delim rune) error {
-	for {
-		r1, err := r.readRune()
-		if err != nil {
-			return err
-		}
-		if r1 == delim {
-			return nil
-		}
-	}
-}
-
-// parseRecord reads and parses a single csv record from r.
-func (r *Reader) parseRecord() (fields []string, err error) {
-	// Each record starts on a new line.  We increment our line
-	// number (lines start at 1, not 0) and set column to -1
-	// so as we increment in readRune it points to the character we read.
-	r.line++
-	r.column = -1
-
-	// Peek at the first rune.  If it is an error we are done.
-	// If we support comments and it is the comment character
-	// then skip to the end of line.
-
-	r1, _, err := r.r.ReadRune()
-	if err != nil {
-		return nil, err
-	}
-
-	if r.Comment != 0 && r1 == r.Comment {
-		return nil, r.skip('\n')
-	}
-	r.r.UnreadRune()
-
-	// At this point we have at least one field.
-	for {
-		haveField, delim, err := r.parseField()
-		if haveField {
-			// If FieldsPerRecord is greater then 0 we can assume the final
-			// length of fields to be equal to FieldsPerRecord.
-			if r.FieldsPerRecord > 0 && fields == nil {
-				fields = make([]string, 0, r.FieldsPerRecord)
-			}
-			fields = append(fields, r.field.String())
-		}
-		if delim == '\n' || err == io.EOF {
-			return fields, err
-		} else if err != nil {
-			return nil, err
-		}
-	}
-}
-
-// parseField parses the next field in the record.  The read field is
-// located in r.field.  Delim is the first character not part of the field
-// (r.Comma or '\n').
-func (r *Reader) parseField() (haveField bool, delim rune, err error) {
-	r.field.Reset()
-
-	r1, err := r.readRune()
-	for err == nil && r.TrimLeadingSpace && r1 != '\n' && unicode.IsSpace(r1) {
-		r1, err = r.readRune()
-	}
-
-	if err == io.EOF && r.column != 0 {
-		return true, 0, err
-	}
-	if err != nil {
-		return false, 0, err
-	}
-
-	switch r1 {
-	case r.Comma:
-		// will check below
-
-	case '\n':
-		// We are a trailing empty field or a blank line
-		if r.column == 0 {
-			return false, r1, nil
-		}
-		return true, r1, nil
-
-	case '"':
-		// quoted field
-	Quoted:
-		for {
-			r1, err = r.readRune()
-			if err != nil {
-				if err == io.EOF {
-					if r.LazyQuotes {
-						return true, 0, err
-					}
-					return false, 0, r.error(ErrQuote)
-				}
-				return false, 0, err
-			}
-			switch r1 {
-			case '"':
-				r1, err = r.readRune()
-				if err != nil || r1 == r.Comma {
-					break Quoted
-				}
-				if r1 == '\n' {
-					return true, r1, nil
-				}
-				if r1 != '"' {
-					if !r.LazyQuotes {
-						r.column--
-						return false, 0, r.error(ErrQuote)
-					}
-					// accept the bare quote
-					r.field.WriteRune('"')
-				}
-			case '\n':
-				r.line++
-				r.column = -1
-			}
-			r.field.WriteRune(r1)
-		}
-
-	default:
-		// unquoted field
-		for {
-			r.field.WriteRune(r1)
-			r1, err = r.readRune()
-			if err != nil || r1 == r.Comma {
-				break
-			}
-			if r1 == '\n' {
-				return true, r1, nil
-			}
-			if !r.LazyQuotes && r1 == '"' {
-				return false, 0, r.error(ErrBareQuote)
-			}
-		}
-	}
-
-	if err != nil {
-		if err == io.EOF {
-			return true, 0, err
-		}
-		return false, 0, err
-	}
-
-	return true, r1, nil
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/csv/reader_test.go b/third_party/gofrontend/libgo/go/encoding/csv/reader_test.go
deleted file mode 100644
index be1002d..0000000
--- a/third_party/gofrontend/libgo/go/encoding/csv/reader_test.go
+++ /dev/null
@@ -1,315 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package csv
-
-import (
-	"reflect"
-	"strings"
-	"testing"
-)
-
-var readTests = []struct {
-	Name               string
-	Input              string
-	Output             [][]string
-	UseFieldsPerRecord bool // false (default) means FieldsPerRecord is -1
-
-	// These fields are copied into the Reader
-	Comma            rune
-	Comment          rune
-	FieldsPerRecord  int
-	LazyQuotes       bool
-	TrailingComma    bool
-	TrimLeadingSpace bool
-
-	Error  string
-	Line   int // Expected error line if != 0
-	Column int // Expected error column if line != 0
-}{
-	{
-		Name:   "Simple",
-		Input:  "a,b,c\n",
-		Output: [][]string{{"a", "b", "c"}},
-	},
-	{
-		Name:   "CRLF",
-		Input:  "a,b\r\nc,d\r\n",
-		Output: [][]string{{"a", "b"}, {"c", "d"}},
-	},
-	{
-		Name:   "BareCR",
-		Input:  "a,b\rc,d\r\n",
-		Output: [][]string{{"a", "b\rc", "d"}},
-	},
-	{
-		Name:               "RFC4180test",
-		UseFieldsPerRecord: true,
-		Input: `#field1,field2,field3
-"aaa","bb
-b","ccc"
-"a,a","b""bb","ccc"
-zzz,yyy,xxx
-`,
-		Output: [][]string{
-			{"#field1", "field2", "field3"},
-			{"aaa", "bb\nb", "ccc"},
-			{"a,a", `b"bb`, "ccc"},
-			{"zzz", "yyy", "xxx"},
-		},
-	},
-	{
-		Name:   "NoEOLTest",
-		Input:  "a,b,c",
-		Output: [][]string{{"a", "b", "c"}},
-	},
-	{
-		Name:   "Semicolon",
-		Comma:  ';',
-		Input:  "a;b;c\n",
-		Output: [][]string{{"a", "b", "c"}},
-	},
-	{
-		Name: "MultiLine",
-		Input: `"two
-line","one line","three
-line
-field"`,
-		Output: [][]string{{"two\nline", "one line", "three\nline\nfield"}},
-	},
-	{
-		Name:  "BlankLine",
-		Input: "a,b,c\n\nd,e,f\n\n",
-		Output: [][]string{
-			{"a", "b", "c"},
-			{"d", "e", "f"},
-		},
-	},
-	{
-		Name:               "BlankLineFieldCount",
-		Input:              "a,b,c\n\nd,e,f\n\n",
-		UseFieldsPerRecord: true,
-		Output: [][]string{
-			{"a", "b", "c"},
-			{"d", "e", "f"},
-		},
-	},
-	{
-		Name:             "TrimSpace",
-		Input:            " a,  b,   c\n",
-		TrimLeadingSpace: true,
-		Output:           [][]string{{"a", "b", "c"}},
-	},
-	{
-		Name:   "LeadingSpace",
-		Input:  " a,  b,   c\n",
-		Output: [][]string{{" a", "  b", "   c"}},
-	},
-	{
-		Name:    "Comment",
-		Comment: '#',
-		Input:   "#1,2,3\na,b,c\n#comment",
-		Output:  [][]string{{"a", "b", "c"}},
-	},
-	{
-		Name:   "NoComment",
-		Input:  "#1,2,3\na,b,c",
-		Output: [][]string{{"#1", "2", "3"}, {"a", "b", "c"}},
-	},
-	{
-		Name:       "LazyQuotes",
-		LazyQuotes: true,
-		Input:      `a "word","1"2",a","b`,
-		Output:     [][]string{{`a "word"`, `1"2`, `a"`, `b`}},
-	},
-	{
-		Name:       "BareQuotes",
-		LazyQuotes: true,
-		Input:      `a "word","1"2",a"`,
-		Output:     [][]string{{`a "word"`, `1"2`, `a"`}},
-	},
-	{
-		Name:       "BareDoubleQuotes",
-		LazyQuotes: true,
-		Input:      `a""b,c`,
-		Output:     [][]string{{`a""b`, `c`}},
-	},
-	{
-		Name:  "BadDoubleQuotes",
-		Input: `a""b,c`,
-		Error: `bare " in non-quoted-field`, Line: 1, Column: 1,
-	},
-	{
-		Name:             "TrimQuote",
-		Input:            ` "a"," b",c`,
-		TrimLeadingSpace: true,
-		Output:           [][]string{{"a", " b", "c"}},
-	},
-	{
-		Name:  "BadBareQuote",
-		Input: `a "word","b"`,
-		Error: `bare " in non-quoted-field`, Line: 1, Column: 2,
-	},
-	{
-		Name:  "BadTrailingQuote",
-		Input: `"a word",b"`,
-		Error: `bare " in non-quoted-field`, Line: 1, Column: 10,
-	},
-	{
-		Name:  "ExtraneousQuote",
-		Input: `"a "word","b"`,
-		Error: `extraneous " in field`, Line: 1, Column: 3,
-	},
-	{
-		Name:               "BadFieldCount",
-		UseFieldsPerRecord: true,
-		Input:              "a,b,c\nd,e",
-		Error:              "wrong number of fields", Line: 2,
-	},
-	{
-		Name:               "BadFieldCount1",
-		UseFieldsPerRecord: true,
-		FieldsPerRecord:    2,
-		Input:              `a,b,c`,
-		Error:              "wrong number of fields", Line: 1,
-	},
-	{
-		Name:   "FieldCount",
-		Input:  "a,b,c\nd,e",
-		Output: [][]string{{"a", "b", "c"}, {"d", "e"}},
-	},
-	{
-		Name:   "TrailingCommaEOF",
-		Input:  "a,b,c,",
-		Output: [][]string{{"a", "b", "c", ""}},
-	},
-	{
-		Name:   "TrailingCommaEOL",
-		Input:  "a,b,c,\n",
-		Output: [][]string{{"a", "b", "c", ""}},
-	},
-	{
-		Name:             "TrailingCommaSpaceEOF",
-		TrimLeadingSpace: true,
-		Input:            "a,b,c, ",
-		Output:           [][]string{{"a", "b", "c", ""}},
-	},
-	{
-		Name:             "TrailingCommaSpaceEOL",
-		TrimLeadingSpace: true,
-		Input:            "a,b,c, \n",
-		Output:           [][]string{{"a", "b", "c", ""}},
-	},
-	{
-		Name:             "TrailingCommaLine3",
-		TrimLeadingSpace: true,
-		Input:            "a,b,c\nd,e,f\ng,hi,",
-		Output:           [][]string{{"a", "b", "c"}, {"d", "e", "f"}, {"g", "hi", ""}},
-	},
-	{
-		Name:   "NotTrailingComma3",
-		Input:  "a,b,c, \n",
-		Output: [][]string{{"a", "b", "c", " "}},
-	},
-	{
-		Name:          "CommaFieldTest",
-		TrailingComma: true,
-		Input: `x,y,z,w
-x,y,z,
-x,y,,
-x,,,
-,,,
-"x","y","z","w"
-"x","y","z",""
-"x","y","",""
-"x","","",""
-"","","",""
-`,
-		Output: [][]string{
-			{"x", "y", "z", "w"},
-			{"x", "y", "z", ""},
-			{"x", "y", "", ""},
-			{"x", "", "", ""},
-			{"", "", "", ""},
-			{"x", "y", "z", "w"},
-			{"x", "y", "z", ""},
-			{"x", "y", "", ""},
-			{"x", "", "", ""},
-			{"", "", "", ""},
-		},
-	},
-	{
-		Name:             "TrailingCommaIneffective1",
-		TrailingComma:    true,
-		TrimLeadingSpace: true,
-		Input:            "a,b,\nc,d,e",
-		Output: [][]string{
-			{"a", "b", ""},
-			{"c", "d", "e"},
-		},
-	},
-	{
-		Name:             "TrailingCommaIneffective2",
-		TrailingComma:    false,
-		TrimLeadingSpace: true,
-		Input:            "a,b,\nc,d,e",
-		Output: [][]string{
-			{"a", "b", ""},
-			{"c", "d", "e"},
-		},
-	},
-}
-
-func TestRead(t *testing.T) {
-	for _, tt := range readTests {
-		r := NewReader(strings.NewReader(tt.Input))
-		r.Comment = tt.Comment
-		if tt.UseFieldsPerRecord {
-			r.FieldsPerRecord = tt.FieldsPerRecord
-		} else {
-			r.FieldsPerRecord = -1
-		}
-		r.LazyQuotes = tt.LazyQuotes
-		r.TrailingComma = tt.TrailingComma
-		r.TrimLeadingSpace = tt.TrimLeadingSpace
-		if tt.Comma != 0 {
-			r.Comma = tt.Comma
-		}
-		out, err := r.ReadAll()
-		perr, _ := err.(*ParseError)
-		if tt.Error != "" {
-			if err == nil || !strings.Contains(err.Error(), tt.Error) {
-				t.Errorf("%s: error %v, want error %q", tt.Name, err, tt.Error)
-			} else if tt.Line != 0 && (tt.Line != perr.Line || tt.Column != perr.Column) {
-				t.Errorf("%s: error at %d:%d expected %d:%d", tt.Name, perr.Line, perr.Column, tt.Line, tt.Column)
-			}
-		} else if err != nil {
-			t.Errorf("%s: unexpected error %v", tt.Name, err)
-		} else if !reflect.DeepEqual(out, tt.Output) {
-			t.Errorf("%s: out=%q want %q", tt.Name, out, tt.Output)
-		}
-	}
-}
-
-func BenchmarkRead(b *testing.B) {
-	data := `x,y,z,w
-x,y,z,
-x,y,,
-x,,,
-,,,
-"x","y","z","w"
-"x","y","z",""
-"x","y","",""
-"x","","",""
-"","","",""
-`
-
-	for i := 0; i < b.N; i++ {
-		_, err := NewReader(strings.NewReader(data)).ReadAll()
-
-		if err != nil {
-			b.Fatalf("could not read data: %s", err)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/csv/writer.go b/third_party/gofrontend/libgo/go/encoding/csv/writer.go
deleted file mode 100644
index 353d91f..0000000
--- a/third_party/gofrontend/libgo/go/encoding/csv/writer.go
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package csv
-
-import (
-	"bufio"
-	"io"
-	"strings"
-	"unicode"
-	"unicode/utf8"
-)
-
-// A Writer writes records to a CSV encoded file.
-//
-// As returned by NewWriter, a Writer writes records terminated by a
-// newline and uses ',' as the field delimiter.  The exported fields can be
-// changed to customize the details before the first call to Write or WriteAll.
-//
-// Comma is the field delimiter.
-//
-// If UseCRLF is true, the Writer ends each record with \r\n instead of \n.
-type Writer struct {
-	Comma   rune // Field delimiter (set to ',' by NewWriter)
-	UseCRLF bool // True to use \r\n as the line terminator
-	w       *bufio.Writer
-}
-
-// NewWriter returns a new Writer that writes to w.
-func NewWriter(w io.Writer) *Writer {
-	return &Writer{
-		Comma: ',',
-		w:     bufio.NewWriter(w),
-	}
-}
-
-// Writer writes a single CSV record to w along with any necessary quoting.
-// A record is a slice of strings with each string being one field.
-func (w *Writer) Write(record []string) (err error) {
-	for n, field := range record {
-		if n > 0 {
-			if _, err = w.w.WriteRune(w.Comma); err != nil {
-				return
-			}
-		}
-
-		// If we don't have to have a quoted field then just
-		// write out the field and continue to the next field.
-		if !w.fieldNeedsQuotes(field) {
-			if _, err = w.w.WriteString(field); err != nil {
-				return
-			}
-			continue
-		}
-		if err = w.w.WriteByte('"'); err != nil {
-			return
-		}
-
-		for _, r1 := range field {
-			switch r1 {
-			case '"':
-				_, err = w.w.WriteString(`""`)
-			case '\r':
-				if !w.UseCRLF {
-					err = w.w.WriteByte('\r')
-				}
-			case '\n':
-				if w.UseCRLF {
-					_, err = w.w.WriteString("\r\n")
-				} else {
-					err = w.w.WriteByte('\n')
-				}
-			default:
-				_, err = w.w.WriteRune(r1)
-			}
-			if err != nil {
-				return
-			}
-		}
-
-		if err = w.w.WriteByte('"'); err != nil {
-			return
-		}
-	}
-	if w.UseCRLF {
-		_, err = w.w.WriteString("\r\n")
-	} else {
-		err = w.w.WriteByte('\n')
-	}
-	return
-}
-
-// Flush writes any buffered data to the underlying io.Writer.
-// To check if an error occurred during the Flush, call Error.
-func (w *Writer) Flush() {
-	w.w.Flush()
-}
-
-// Error reports any error that has occurred during a previous Write or Flush.
-func (w *Writer) Error() error {
-	_, err := w.w.Write(nil)
-	return err
-}
-
-// WriteAll writes multiple CSV records to w using Write and then calls Flush.
-func (w *Writer) WriteAll(records [][]string) (err error) {
-	for _, record := range records {
-		err = w.Write(record)
-		if err != nil {
-			return err
-		}
-	}
-	return w.w.Flush()
-}
-
-// fieldNeedsQuotes reports whether our field must be enclosed in quotes.
-// Fields with a Comma, fields with a quote or newline, and
-// fields which start with a space must be enclosed in quotes.
-// We used to quote empty strings, but we do not anymore (as of Go 1.4).
-// The two representations should be equivalent, but Postgres distinguishes
-// quoted vs non-quoted empty string during database imports, and it has
-// an option to force the quoted behavior for non-quoted CSV but it has
-// no option to force the non-quoted behavior for quoted CSV, making
-// CSV with quoted empty strings strictly less useful.
-// Not quoting the empty string also makes this package match the behavior
-// of Microsoft Excel and Google Drive.
-// For Postgres, quote the data terminating string `\.`.
-func (w *Writer) fieldNeedsQuotes(field string) bool {
-	if field == "" {
-		return false
-	}
-	if field == `\.` || strings.IndexRune(field, w.Comma) >= 0 || strings.IndexAny(field, "\"\r\n") >= 0 {
-		return true
-	}
-
-	r1, _ := utf8.DecodeRuneInString(field)
-	return unicode.IsSpace(r1)
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/csv/writer_test.go b/third_party/gofrontend/libgo/go/encoding/csv/writer_test.go
deleted file mode 100644
index 8ddca0a..0000000
--- a/third_party/gofrontend/libgo/go/encoding/csv/writer_test.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package csv
-
-import (
-	"bytes"
-	"errors"
-	"testing"
-)
-
-var writeTests = []struct {
-	Input   [][]string
-	Output  string
-	UseCRLF bool
-}{
-	{Input: [][]string{{"abc"}}, Output: "abc\n"},
-	{Input: [][]string{{"abc"}}, Output: "abc\r\n", UseCRLF: true},
-	{Input: [][]string{{`"abc"`}}, Output: `"""abc"""` + "\n"},
-	{Input: [][]string{{`a"b`}}, Output: `"a""b"` + "\n"},
-	{Input: [][]string{{`"a"b"`}}, Output: `"""a""b"""` + "\n"},
-	{Input: [][]string{{" abc"}}, Output: `" abc"` + "\n"},
-	{Input: [][]string{{"abc,def"}}, Output: `"abc,def"` + "\n"},
-	{Input: [][]string{{"abc", "def"}}, Output: "abc,def\n"},
-	{Input: [][]string{{"abc"}, {"def"}}, Output: "abc\ndef\n"},
-	{Input: [][]string{{"abc\ndef"}}, Output: "\"abc\ndef\"\n"},
-	{Input: [][]string{{"abc\ndef"}}, Output: "\"abc\r\ndef\"\r\n", UseCRLF: true},
-	{Input: [][]string{{"abc\rdef"}}, Output: "\"abcdef\"\r\n", UseCRLF: true},
-	{Input: [][]string{{"abc\rdef"}}, Output: "\"abc\rdef\"\n", UseCRLF: false},
-	{Input: [][]string{{""}}, Output: "\n"},
-	{Input: [][]string{{"", ""}}, Output: ",\n"},
-	{Input: [][]string{{"", "", ""}}, Output: ",,\n"},
-	{Input: [][]string{{"", "", "a"}}, Output: ",,a\n"},
-	{Input: [][]string{{"", "a", ""}}, Output: ",a,\n"},
-	{Input: [][]string{{"", "a", "a"}}, Output: ",a,a\n"},
-	{Input: [][]string{{"a", "", ""}}, Output: "a,,\n"},
-	{Input: [][]string{{"a", "", "a"}}, Output: "a,,a\n"},
-	{Input: [][]string{{"a", "a", ""}}, Output: "a,a,\n"},
-	{Input: [][]string{{"a", "a", "a"}}, Output: "a,a,a\n"},
-	{Input: [][]string{{`\.`}}, Output: "\"\\.\"\n"},
-}
-
-func TestWrite(t *testing.T) {
-	for n, tt := range writeTests {
-		b := &bytes.Buffer{}
-		f := NewWriter(b)
-		f.UseCRLF = tt.UseCRLF
-		err := f.WriteAll(tt.Input)
-		if err != nil {
-			t.Errorf("Unexpected error: %s\n", err)
-		}
-		out := b.String()
-		if out != tt.Output {
-			t.Errorf("#%d: out=%q want %q", n, out, tt.Output)
-		}
-	}
-}
-
-type errorWriter struct{}
-
-func (e errorWriter) Write(b []byte) (int, error) {
-	return 0, errors.New("Test")
-}
-
-func TestError(t *testing.T) {
-	b := &bytes.Buffer{}
-	f := NewWriter(b)
-	f.Write([]string{"abc"})
-	f.Flush()
-	err := f.Error()
-
-	if err != nil {
-		t.Errorf("Unexpected error: %s\n", err)
-	}
-
-	f = NewWriter(errorWriter{})
-	f.Write([]string{"abc"})
-	f.Flush()
-	err = f.Error()
-
-	if err == nil {
-		t.Error("Error should not be nil")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/encoding.go b/third_party/gofrontend/libgo/go/encoding/encoding.go
deleted file mode 100644
index 6d21807..0000000
--- a/third_party/gofrontend/libgo/go/encoding/encoding.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package encoding defines interfaces shared by other packages that
-// convert data to and from byte-level and textual representations.
-// Packages that check for these interfaces include encoding/gob,
-// encoding/json, and encoding/xml. As a result, implementing an
-// interface once can make a type useful in multiple encodings.
-// Standard types that implement these interfaces include time.Time and net.IP.
-// The interfaces come in pairs that produce and consume encoded data.
-package encoding
-
-// BinaryMarshaler is the interface implemented by an object that can
-// marshal itself into a binary form.
-//
-// MarshalBinary encodes the receiver into a binary form and returns the result.
-type BinaryMarshaler interface {
-	MarshalBinary() (data []byte, err error)
-}
-
-// BinaryUnmarshaler is the interface implemented by an object that can
-// unmarshal a binary representation of itself.
-//
-// UnmarshalBinary must be able to decode the form generated by MarshalBinary.
-// UnmarshalBinary must copy the data if it wishes to retain the data
-// after returning.
-type BinaryUnmarshaler interface {
-	UnmarshalBinary(data []byte) error
-}
-
-// TextMarshaler is the interface implemented by an object that can
-// marshal itself into a textual form.
-//
-// MarshalText encodes the receiver into UTF-8-encoded text and returns the result.
-type TextMarshaler interface {
-	MarshalText() (text []byte, err error)
-}
-
-// TextUnmarshaler is the interface implemented by an object that can
-// unmarshal a textual representation of itself.
-//
-// UnmarshalText must be able to decode the form generated by MarshalText.
-// UnmarshalText must copy the text if it wishes to retain the text
-// after returning.
-type TextUnmarshaler interface {
-	UnmarshalText(text []byte) error
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/codec_test.go b/third_party/gofrontend/libgo/go/encoding/gob/codec_test.go
deleted file mode 100644
index c2583bf..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/codec_test.go
+++ /dev/null
@@ -1,1494 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gob
-
-import (
-	"bytes"
-	"errors"
-	"flag"
-	"math"
-	"math/rand"
-	"reflect"
-	"strings"
-	"testing"
-	"time"
-)
-
-var doFuzzTests = flag.Bool("gob.fuzz", false, "run the fuzz tests, which are large and very slow")
-
-// Guarantee encoding format by comparing some encodings to hand-written values
-type EncodeT struct {
-	x uint64
-	b []byte
-}
-
-var encodeT = []EncodeT{
-	{0x00, []byte{0x00}},
-	{0x0F, []byte{0x0F}},
-	{0xFF, []byte{0xFF, 0xFF}},
-	{0xFFFF, []byte{0xFE, 0xFF, 0xFF}},
-	{0xFFFFFF, []byte{0xFD, 0xFF, 0xFF, 0xFF}},
-	{0xFFFFFFFF, []byte{0xFC, 0xFF, 0xFF, 0xFF, 0xFF}},
-	{0xFFFFFFFFFF, []byte{0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}},
-	{0xFFFFFFFFFFFF, []byte{0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}},
-	{0xFFFFFFFFFFFFFF, []byte{0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}},
-	{0xFFFFFFFFFFFFFFFF, []byte{0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}},
-	{0x1111, []byte{0xFE, 0x11, 0x11}},
-	{0x1111111111111111, []byte{0xF8, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}},
-	{0x8888888888888888, []byte{0xF8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88}},
-	{1 << 63, []byte{0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
-}
-
-// testError is meant to be used as a deferred function to turn a panic(gobError) into a
-// plain test.Error call.
-func testError(t *testing.T) {
-	if e := recover(); e != nil {
-		t.Error(e.(gobError).err) // Will re-panic if not one of our errors, such as a runtime error.
-	}
-	return
-}
-
-func newDecBuffer(data []byte) *decBuffer {
-	return &decBuffer{
-		data: data,
-	}
-}
-
-// Test basic encode/decode routines for unsigned integers
-func TestUintCodec(t *testing.T) {
-	defer testError(t)
-	b := new(encBuffer)
-	encState := newEncoderState(b)
-	for _, tt := range encodeT {
-		b.Reset()
-		encState.encodeUint(tt.x)
-		if !bytes.Equal(tt.b, b.Bytes()) {
-			t.Errorf("encodeUint: %#x encode: expected % x got % x", tt.x, tt.b, b.Bytes())
-		}
-	}
-	for u := uint64(0); ; u = (u + 1) * 7 {
-		b.Reset()
-		encState.encodeUint(u)
-		decState := newDecodeState(newDecBuffer(b.Bytes()))
-		v := decState.decodeUint()
-		if u != v {
-			t.Errorf("Encode/Decode: sent %#x received %#x", u, v)
-		}
-		if u&(1<<63) != 0 {
-			break
-		}
-	}
-}
-
-func verifyInt(i int64, t *testing.T) {
-	defer testError(t)
-	var b = new(encBuffer)
-	encState := newEncoderState(b)
-	encState.encodeInt(i)
-	decState := newDecodeState(newDecBuffer(b.Bytes()))
-	decState.buf = make([]byte, 8)
-	j := decState.decodeInt()
-	if i != j {
-		t.Errorf("Encode/Decode: sent %#x received %#x", uint64(i), uint64(j))
-	}
-}
-
-// Test basic encode/decode routines for signed integers
-func TestIntCodec(t *testing.T) {
-	for u := uint64(0); ; u = (u + 1) * 7 {
-		// Do positive and negative values
-		i := int64(u)
-		verifyInt(i, t)
-		verifyInt(-i, t)
-		verifyInt(^i, t)
-		if u&(1<<63) != 0 {
-			break
-		}
-	}
-	verifyInt(-1<<63, t) // a tricky case
-}
-
-// The result of encoding a true boolean with field number 7
-var boolResult = []byte{0x07, 0x01}
-
-// The result of encoding a number 17 with field number 7
-var signedResult = []byte{0x07, 2 * 17}
-var unsignedResult = []byte{0x07, 17}
-var floatResult = []byte{0x07, 0xFE, 0x31, 0x40}
-
-// The result of encoding a number 17+19i with field number 7
-var complexResult = []byte{0x07, 0xFE, 0x31, 0x40, 0xFE, 0x33, 0x40}
-
-// The result of encoding "hello" with field number 7
-var bytesResult = []byte{0x07, 0x05, 'h', 'e', 'l', 'l', 'o'}
-
-func newDecodeState(buf *decBuffer) *decoderState {
-	d := new(decoderState)
-	d.b = buf
-	d.buf = make([]byte, uint64Size)
-	return d
-}
-
-func newEncoderState(b *encBuffer) *encoderState {
-	b.Reset()
-	state := &encoderState{enc: nil, b: b}
-	state.fieldnum = -1
-	return state
-}
-
-// Test instruction execution for encoding.
-// Do not run the machine yet; instead do individual instructions crafted by hand.
-func TestScalarEncInstructions(t *testing.T) {
-	var b = new(encBuffer)
-
-	// bool
-	{
-		var data bool = true
-		instr := &encInstr{encBool, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(boolResult, b.Bytes()) {
-			t.Errorf("bool enc instructions: expected % x got % x", boolResult, b.Bytes())
-		}
-	}
-
-	// int
-	{
-		b.Reset()
-		var data int = 17
-		instr := &encInstr{encInt, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(signedResult, b.Bytes()) {
-			t.Errorf("int enc instructions: expected % x got % x", signedResult, b.Bytes())
-		}
-	}
-
-	// uint
-	{
-		b.Reset()
-		var data uint = 17
-		instr := &encInstr{encUint, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(unsignedResult, b.Bytes()) {
-			t.Errorf("uint enc instructions: expected % x got % x", unsignedResult, b.Bytes())
-		}
-	}
-
-	// int8
-	{
-		b.Reset()
-		var data int8 = 17
-		instr := &encInstr{encInt, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(signedResult, b.Bytes()) {
-			t.Errorf("int8 enc instructions: expected % x got % x", signedResult, b.Bytes())
-		}
-	}
-
-	// uint8
-	{
-		b.Reset()
-		var data uint8 = 17
-		instr := &encInstr{encUint, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(unsignedResult, b.Bytes()) {
-			t.Errorf("uint8 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
-		}
-	}
-
-	// int16
-	{
-		b.Reset()
-		var data int16 = 17
-		instr := &encInstr{encInt, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(signedResult, b.Bytes()) {
-			t.Errorf("int16 enc instructions: expected % x got % x", signedResult, b.Bytes())
-		}
-	}
-
-	// uint16
-	{
-		b.Reset()
-		var data uint16 = 17
-		instr := &encInstr{encUint, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(unsignedResult, b.Bytes()) {
-			t.Errorf("uint16 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
-		}
-	}
-
-	// int32
-	{
-		b.Reset()
-		var data int32 = 17
-		instr := &encInstr{encInt, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(signedResult, b.Bytes()) {
-			t.Errorf("int32 enc instructions: expected % x got % x", signedResult, b.Bytes())
-		}
-	}
-
-	// uint32
-	{
-		b.Reset()
-		var data uint32 = 17
-		instr := &encInstr{encUint, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(unsignedResult, b.Bytes()) {
-			t.Errorf("uint32 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
-		}
-	}
-
-	// int64
-	{
-		b.Reset()
-		var data int64 = 17
-		instr := &encInstr{encInt, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(signedResult, b.Bytes()) {
-			t.Errorf("int64 enc instructions: expected % x got % x", signedResult, b.Bytes())
-		}
-	}
-
-	// uint64
-	{
-		b.Reset()
-		var data uint64 = 17
-		instr := &encInstr{encUint, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(unsignedResult, b.Bytes()) {
-			t.Errorf("uint64 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
-		}
-	}
-
-	// float32
-	{
-		b.Reset()
-		var data float32 = 17
-		instr := &encInstr{encFloat, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(floatResult, b.Bytes()) {
-			t.Errorf("float32 enc instructions: expected % x got % x", floatResult, b.Bytes())
-		}
-	}
-
-	// float64
-	{
-		b.Reset()
-		var data float64 = 17
-		instr := &encInstr{encFloat, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(floatResult, b.Bytes()) {
-			t.Errorf("float64 enc instructions: expected % x got % x", floatResult, b.Bytes())
-		}
-	}
-
-	// bytes == []uint8
-	{
-		b.Reset()
-		data := []byte("hello")
-		instr := &encInstr{encUint8Array, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(bytesResult, b.Bytes()) {
-			t.Errorf("bytes enc instructions: expected % x got % x", bytesResult, b.Bytes())
-		}
-	}
-
-	// string
-	{
-		b.Reset()
-		var data string = "hello"
-		instr := &encInstr{encString, 6, nil, 0}
-		state := newEncoderState(b)
-		instr.op(instr, state, reflect.ValueOf(data))
-		if !bytes.Equal(bytesResult, b.Bytes()) {
-			t.Errorf("string enc instructions: expected % x got % x", bytesResult, b.Bytes())
-		}
-	}
-}
-
-func execDec(typ string, instr *decInstr, state *decoderState, t *testing.T, value reflect.Value) {
-	defer testError(t)
-	v := int(state.decodeUint())
-	if v+state.fieldnum != 6 {
-		t.Fatalf("decoding field number %d, got %d", 6, v+state.fieldnum)
-	}
-	instr.op(instr, state, value.Elem())
-	state.fieldnum = 6
-}
-
-func newDecodeStateFromData(data []byte) *decoderState {
-	b := newDecBuffer(data)
-	state := newDecodeState(b)
-	state.fieldnum = -1
-	return state
-}
-
-// Test instruction execution for decoding.
-// Do not run the machine yet; instead do individual instructions crafted by hand.
-func TestScalarDecInstructions(t *testing.T) {
-	ovfl := errors.New("overflow")
-
-	// bool
-	{
-		var data bool
-		instr := &decInstr{decBool, 6, nil, ovfl}
-		state := newDecodeStateFromData(boolResult)
-		execDec("bool", instr, state, t, reflect.ValueOf(&data))
-		if data != true {
-			t.Errorf("bool a = %v not true", data)
-		}
-	}
-	// int
-	{
-		var data int
-		instr := &decInstr{decOpTable[reflect.Int], 6, nil, ovfl}
-		state := newDecodeStateFromData(signedResult)
-		execDec("int", instr, state, t, reflect.ValueOf(&data))
-		if data != 17 {
-			t.Errorf("int a = %v not 17", data)
-		}
-	}
-
-	// uint
-	{
-		var data uint
-		instr := &decInstr{decOpTable[reflect.Uint], 6, nil, ovfl}
-		state := newDecodeStateFromData(unsignedResult)
-		execDec("uint", instr, state, t, reflect.ValueOf(&data))
-		if data != 17 {
-			t.Errorf("uint a = %v not 17", data)
-		}
-	}
-
-	// int8
-	{
-		var data int8
-		instr := &decInstr{decInt8, 6, nil, ovfl}
-		state := newDecodeStateFromData(signedResult)
-		execDec("int8", instr, state, t, reflect.ValueOf(&data))
-		if data != 17 {
-			t.Errorf("int8 a = %v not 17", data)
-		}
-	}
-
-	// uint8
-	{
-		var data uint8
-		instr := &decInstr{decUint8, 6, nil, ovfl}
-		state := newDecodeStateFromData(unsignedResult)
-		execDec("uint8", instr, state, t, reflect.ValueOf(&data))
-		if data != 17 {
-			t.Errorf("uint8 a = %v not 17", data)
-		}
-	}
-
-	// int16
-	{
-		var data int16
-		instr := &decInstr{decInt16, 6, nil, ovfl}
-		state := newDecodeStateFromData(signedResult)
-		execDec("int16", instr, state, t, reflect.ValueOf(&data))
-		if data != 17 {
-			t.Errorf("int16 a = %v not 17", data)
-		}
-	}
-
-	// uint16
-	{
-		var data uint16
-		instr := &decInstr{decUint16, 6, nil, ovfl}
-		state := newDecodeStateFromData(unsignedResult)
-		execDec("uint16", instr, state, t, reflect.ValueOf(&data))
-		if data != 17 {
-			t.Errorf("uint16 a = %v not 17", data)
-		}
-	}
-
-	// int32
-	{
-		var data int32
-		instr := &decInstr{decInt32, 6, nil, ovfl}
-		state := newDecodeStateFromData(signedResult)
-		execDec("int32", instr, state, t, reflect.ValueOf(&data))
-		if data != 17 {
-			t.Errorf("int32 a = %v not 17", data)
-		}
-	}
-
-	// uint32
-	{
-		var data uint32
-		instr := &decInstr{decUint32, 6, nil, ovfl}
-		state := newDecodeStateFromData(unsignedResult)
-		execDec("uint32", instr, state, t, reflect.ValueOf(&data))
-		if data != 17 {
-			t.Errorf("uint32 a = %v not 17", data)
-		}
-	}
-
-	// uintptr
-	{
-		var data uintptr
-		instr := &decInstr{decOpTable[reflect.Uintptr], 6, nil, ovfl}
-		state := newDecodeStateFromData(unsignedResult)
-		execDec("uintptr", instr, state, t, reflect.ValueOf(&data))
-		if data != 17 {
-			t.Errorf("uintptr a = %v not 17", data)
-		}
-	}
-
-	// int64
-	{
-		var data int64
-		instr := &decInstr{decInt64, 6, nil, ovfl}
-		state := newDecodeStateFromData(signedResult)
-		execDec("int64", instr, state, t, reflect.ValueOf(&data))
-		if data != 17 {
-			t.Errorf("int64 a = %v not 17", data)
-		}
-	}
-
-	// uint64
-	{
-		var data uint64
-		instr := &decInstr{decUint64, 6, nil, ovfl}
-		state := newDecodeStateFromData(unsignedResult)
-		execDec("uint64", instr, state, t, reflect.ValueOf(&data))
-		if data != 17 {
-			t.Errorf("uint64 a = %v not 17", data)
-		}
-	}
-
-	// float32
-	{
-		var data float32
-		instr := &decInstr{decFloat32, 6, nil, ovfl}
-		state := newDecodeStateFromData(floatResult)
-		execDec("float32", instr, state, t, reflect.ValueOf(&data))
-		if data != 17 {
-			t.Errorf("float32 a = %v not 17", data)
-		}
-	}
-
-	// float64
-	{
-		var data float64
-		instr := &decInstr{decFloat64, 6, nil, ovfl}
-		state := newDecodeStateFromData(floatResult)
-		execDec("float64", instr, state, t, reflect.ValueOf(&data))
-		if data != 17 {
-			t.Errorf("float64 a = %v not 17", data)
-		}
-	}
-
-	// complex64
-	{
-		var data complex64
-		instr := &decInstr{decOpTable[reflect.Complex64], 6, nil, ovfl}
-		state := newDecodeStateFromData(complexResult)
-		execDec("complex", instr, state, t, reflect.ValueOf(&data))
-		if data != 17+19i {
-			t.Errorf("complex a = %v not 17+19i", data)
-		}
-	}
-
-	// complex128
-	{
-		var data complex128
-		instr := &decInstr{decOpTable[reflect.Complex128], 6, nil, ovfl}
-		state := newDecodeStateFromData(complexResult)
-		execDec("complex", instr, state, t, reflect.ValueOf(&data))
-		if data != 17+19i {
-			t.Errorf("complex a = %v not 17+19i", data)
-		}
-	}
-
-	// bytes == []uint8
-	{
-		var data []byte
-		instr := &decInstr{decUint8Slice, 6, nil, ovfl}
-		state := newDecodeStateFromData(bytesResult)
-		execDec("bytes", instr, state, t, reflect.ValueOf(&data))
-		if string(data) != "hello" {
-			t.Errorf(`bytes a = %q not "hello"`, string(data))
-		}
-	}
-
-	// string
-	{
-		var data string
-		instr := &decInstr{decString, 6, nil, ovfl}
-		state := newDecodeStateFromData(bytesResult)
-		execDec("bytes", instr, state, t, reflect.ValueOf(&data))
-		if data != "hello" {
-			t.Errorf(`bytes a = %q not "hello"`, data)
-		}
-	}
-}
-
-func TestEndToEnd(t *testing.T) {
-	type T2 struct {
-		T string
-	}
-	s1 := "string1"
-	s2 := "string2"
-	type T1 struct {
-		A, B, C  int
-		M        map[string]*float64
-		EmptyMap map[string]int // to check that we receive a non-nil map.
-		N        *[3]float64
-		Strs     *[2]string
-		Int64s   *[]int64
-		RI       complex64
-		S        string
-		Y        []byte
-		T        *T2
-	}
-	pi := 3.14159
-	e := 2.71828
-	t1 := &T1{
-		A:        17,
-		B:        18,
-		C:        -5,
-		M:        map[string]*float64{"pi": &pi, "e": &e},
-		EmptyMap: make(map[string]int),
-		N:        &[3]float64{1.5, 2.5, 3.5},
-		Strs:     &[2]string{s1, s2},
-		Int64s:   &[]int64{77, 89, 123412342134},
-		RI:       17 - 23i,
-		S:        "Now is the time",
-		Y:        []byte("hello, sailor"),
-		T:        &T2{"this is T2"},
-	}
-	b := new(bytes.Buffer)
-	err := NewEncoder(b).Encode(t1)
-	if err != nil {
-		t.Error("encode:", err)
-	}
-	var _t1 T1
-	err = NewDecoder(b).Decode(&_t1)
-	if err != nil {
-		t.Fatal("decode:", err)
-	}
-	if !reflect.DeepEqual(t1, &_t1) {
-		t.Errorf("encode expected %v got %v", *t1, _t1)
-	}
-	// Be absolutely sure the received map is non-nil.
-	if t1.EmptyMap == nil {
-		t.Errorf("nil map sent")
-	}
-	if _t1.EmptyMap == nil {
-		t.Errorf("nil map received")
-	}
-}
-
-func TestOverflow(t *testing.T) {
-	type inputT struct {
-		Maxi int64
-		Mini int64
-		Maxu uint64
-		Maxf float64
-		Minf float64
-		Maxc complex128
-		Minc complex128
-	}
-	var it inputT
-	var err error
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	dec := NewDecoder(b)
-
-	// int8
-	b.Reset()
-	it = inputT{
-		Maxi: math.MaxInt8 + 1,
-	}
-	type outi8 struct {
-		Maxi int8
-		Mini int8
-	}
-	var o1 outi8
-	enc.Encode(it)
-	err = dec.Decode(&o1)
-	if err == nil || err.Error() != `value for "Maxi" out of range` {
-		t.Error("wrong overflow error for int8:", err)
-	}
-	it = inputT{
-		Mini: math.MinInt8 - 1,
-	}
-	b.Reset()
-	enc.Encode(it)
-	err = dec.Decode(&o1)
-	if err == nil || err.Error() != `value for "Mini" out of range` {
-		t.Error("wrong underflow error for int8:", err)
-	}
-
-	// int16
-	b.Reset()
-	it = inputT{
-		Maxi: math.MaxInt16 + 1,
-	}
-	type outi16 struct {
-		Maxi int16
-		Mini int16
-	}
-	var o2 outi16
-	enc.Encode(it)
-	err = dec.Decode(&o2)
-	if err == nil || err.Error() != `value for "Maxi" out of range` {
-		t.Error("wrong overflow error for int16:", err)
-	}
-	it = inputT{
-		Mini: math.MinInt16 - 1,
-	}
-	b.Reset()
-	enc.Encode(it)
-	err = dec.Decode(&o2)
-	if err == nil || err.Error() != `value for "Mini" out of range` {
-		t.Error("wrong underflow error for int16:", err)
-	}
-
-	// int32
-	b.Reset()
-	it = inputT{
-		Maxi: math.MaxInt32 + 1,
-	}
-	type outi32 struct {
-		Maxi int32
-		Mini int32
-	}
-	var o3 outi32
-	enc.Encode(it)
-	err = dec.Decode(&o3)
-	if err == nil || err.Error() != `value for "Maxi" out of range` {
-		t.Error("wrong overflow error for int32:", err)
-	}
-	it = inputT{
-		Mini: math.MinInt32 - 1,
-	}
-	b.Reset()
-	enc.Encode(it)
-	err = dec.Decode(&o3)
-	if err == nil || err.Error() != `value for "Mini" out of range` {
-		t.Error("wrong underflow error for int32:", err)
-	}
-
-	// uint8
-	b.Reset()
-	it = inputT{
-		Maxu: math.MaxUint8 + 1,
-	}
-	type outu8 struct {
-		Maxu uint8
-	}
-	var o4 outu8
-	enc.Encode(it)
-	err = dec.Decode(&o4)
-	if err == nil || err.Error() != `value for "Maxu" out of range` {
-		t.Error("wrong overflow error for uint8:", err)
-	}
-
-	// uint16
-	b.Reset()
-	it = inputT{
-		Maxu: math.MaxUint16 + 1,
-	}
-	type outu16 struct {
-		Maxu uint16
-	}
-	var o5 outu16
-	enc.Encode(it)
-	err = dec.Decode(&o5)
-	if err == nil || err.Error() != `value for "Maxu" out of range` {
-		t.Error("wrong overflow error for uint16:", err)
-	}
-
-	// uint32
-	b.Reset()
-	it = inputT{
-		Maxu: math.MaxUint32 + 1,
-	}
-	type outu32 struct {
-		Maxu uint32
-	}
-	var o6 outu32
-	enc.Encode(it)
-	err = dec.Decode(&o6)
-	if err == nil || err.Error() != `value for "Maxu" out of range` {
-		t.Error("wrong overflow error for uint32:", err)
-	}
-
-	// float32
-	b.Reset()
-	it = inputT{
-		Maxf: math.MaxFloat32 * 2,
-	}
-	type outf32 struct {
-		Maxf float32
-		Minf float32
-	}
-	var o7 outf32
-	enc.Encode(it)
-	err = dec.Decode(&o7)
-	if err == nil || err.Error() != `value for "Maxf" out of range` {
-		t.Error("wrong overflow error for float32:", err)
-	}
-
-	// complex64
-	b.Reset()
-	it = inputT{
-		Maxc: complex(math.MaxFloat32*2, math.MaxFloat32*2),
-	}
-	type outc64 struct {
-		Maxc complex64
-		Minc complex64
-	}
-	var o8 outc64
-	enc.Encode(it)
-	err = dec.Decode(&o8)
-	if err == nil || err.Error() != `value for "Maxc" out of range` {
-		t.Error("wrong overflow error for complex64:", err)
-	}
-}
-
-func TestNesting(t *testing.T) {
-	type RT struct {
-		A    string
-		Next *RT
-	}
-	rt := new(RT)
-	rt.A = "level1"
-	rt.Next = new(RT)
-	rt.Next.A = "level2"
-	b := new(bytes.Buffer)
-	NewEncoder(b).Encode(rt)
-	var drt RT
-	dec := NewDecoder(b)
-	err := dec.Decode(&drt)
-	if err != nil {
-		t.Fatal("decoder error:", err)
-	}
-	if drt.A != rt.A {
-		t.Errorf("nesting: encode expected %v got %v", *rt, drt)
-	}
-	if drt.Next == nil {
-		t.Errorf("nesting: recursion failed")
-	}
-	if drt.Next.A != rt.Next.A {
-		t.Errorf("nesting: encode expected %v got %v", *rt.Next, *drt.Next)
-	}
-}
-
-// These three structures have the same data with different indirections
-type T0 struct {
-	A int
-	B int
-	C int
-	D int
-}
-type T1 struct {
-	A int
-	B *int
-	C **int
-	D ***int
-}
-type T2 struct {
-	A ***int
-	B **int
-	C *int
-	D int
-}
-
-func TestAutoIndirection(t *testing.T) {
-	// First transfer t1 into t0
-	var t1 T1
-	t1.A = 17
-	t1.B = new(int)
-	*t1.B = 177
-	t1.C = new(*int)
-	*t1.C = new(int)
-	**t1.C = 1777
-	t1.D = new(**int)
-	*t1.D = new(*int)
-	**t1.D = new(int)
-	***t1.D = 17777
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	enc.Encode(t1)
-	dec := NewDecoder(b)
-	var t0 T0
-	dec.Decode(&t0)
-	if t0.A != 17 || t0.B != 177 || t0.C != 1777 || t0.D != 17777 {
-		t.Errorf("t1->t0: expected {17 177 1777 17777}; got %v", t0)
-	}
-
-	// Now transfer t2 into t0
-	var t2 T2
-	t2.D = 17777
-	t2.C = new(int)
-	*t2.C = 1777
-	t2.B = new(*int)
-	*t2.B = new(int)
-	**t2.B = 177
-	t2.A = new(**int)
-	*t2.A = new(*int)
-	**t2.A = new(int)
-	***t2.A = 17
-	b.Reset()
-	enc.Encode(t2)
-	t0 = T0{}
-	dec.Decode(&t0)
-	if t0.A != 17 || t0.B != 177 || t0.C != 1777 || t0.D != 17777 {
-		t.Errorf("t2->t0 expected {17 177 1777 17777}; got %v", t0)
-	}
-
-	// Now transfer t0 into t1
-	t0 = T0{17, 177, 1777, 17777}
-	b.Reset()
-	enc.Encode(t0)
-	t1 = T1{}
-	dec.Decode(&t1)
-	if t1.A != 17 || *t1.B != 177 || **t1.C != 1777 || ***t1.D != 17777 {
-		t.Errorf("t0->t1 expected {17 177 1777 17777}; got {%d %d %d %d}", t1.A, *t1.B, **t1.C, ***t1.D)
-	}
-
-	// Now transfer t0 into t2
-	b.Reset()
-	enc.Encode(t0)
-	t2 = T2{}
-	dec.Decode(&t2)
-	if ***t2.A != 17 || **t2.B != 177 || *t2.C != 1777 || t2.D != 17777 {
-		t.Errorf("t0->t2 expected {17 177 1777 17777}; got {%d %d %d %d}", ***t2.A, **t2.B, *t2.C, t2.D)
-	}
-
-	// Now do t2 again but without pre-allocated pointers.
-	b.Reset()
-	enc.Encode(t0)
-	***t2.A = 0
-	**t2.B = 0
-	*t2.C = 0
-	t2.D = 0
-	dec.Decode(&t2)
-	if ***t2.A != 17 || **t2.B != 177 || *t2.C != 1777 || t2.D != 17777 {
-		t.Errorf("t0->t2 expected {17 177 1777 17777}; got {%d %d %d %d}", ***t2.A, **t2.B, *t2.C, t2.D)
-	}
-}
-
-type RT0 struct {
-	A int
-	B string
-	C float64
-}
-type RT1 struct {
-	C      float64
-	B      string
-	A      int
-	NotSet string
-}
-
-func TestReorderedFields(t *testing.T) {
-	var rt0 RT0
-	rt0.A = 17
-	rt0.B = "hello"
-	rt0.C = 3.14159
-	b := new(bytes.Buffer)
-	NewEncoder(b).Encode(rt0)
-	dec := NewDecoder(b)
-	var rt1 RT1
-	// Wire type is RT0, local type is RT1.
-	err := dec.Decode(&rt1)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if rt0.A != rt1.A || rt0.B != rt1.B || rt0.C != rt1.C {
-		t.Errorf("rt1->rt0: expected %v; got %v", rt0, rt1)
-	}
-}
-
-// Like an RT0 but with fields we'll ignore on the decode side.
-type IT0 struct {
-	A        int64
-	B        string
-	Ignore_d []int
-	Ignore_e [3]float64
-	Ignore_f bool
-	Ignore_g string
-	Ignore_h []byte
-	Ignore_i *RT1
-	Ignore_m map[string]int
-	C        float64
-}
-
-func TestIgnoredFields(t *testing.T) {
-	var it0 IT0
-	it0.A = 17
-	it0.B = "hello"
-	it0.C = 3.14159
-	it0.Ignore_d = []int{1, 2, 3}
-	it0.Ignore_e[0] = 1.0
-	it0.Ignore_e[1] = 2.0
-	it0.Ignore_e[2] = 3.0
-	it0.Ignore_f = true
-	it0.Ignore_g = "pay no attention"
-	it0.Ignore_h = []byte("to the curtain")
-	it0.Ignore_i = &RT1{3.1, "hi", 7, "hello"}
-	it0.Ignore_m = map[string]int{"one": 1, "two": 2}
-
-	b := new(bytes.Buffer)
-	NewEncoder(b).Encode(it0)
-	dec := NewDecoder(b)
-	var rt1 RT1
-	// Wire type is IT0, local type is RT1.
-	err := dec.Decode(&rt1)
-	if err != nil {
-		t.Error("error: ", err)
-	}
-	if int(it0.A) != rt1.A || it0.B != rt1.B || it0.C != rt1.C {
-		t.Errorf("rt0->rt1: expected %v; got %v", it0, rt1)
-	}
-}
-
-func TestBadRecursiveType(t *testing.T) {
-	type Rec ***Rec
-	var rec Rec
-	b := new(bytes.Buffer)
-	err := NewEncoder(b).Encode(&rec)
-	if err == nil {
-		t.Error("expected error; got none")
-	} else if strings.Index(err.Error(), "recursive") < 0 {
-		t.Error("expected recursive type error; got", err)
-	}
-	// Can't test decode easily because we can't encode one, so we can't pass one to a Decoder.
-}
-
-type Indirect struct {
-	A ***[3]int
-	S ***[]int
-	M ****map[string]int
-}
-
-type Direct struct {
-	A [3]int
-	S []int
-	M map[string]int
-}
-
-func TestIndirectSliceMapArray(t *testing.T) {
-	// Marshal indirect, unmarshal to direct.
-	i := new(Indirect)
-	i.A = new(**[3]int)
-	*i.A = new(*[3]int)
-	**i.A = new([3]int)
-	***i.A = [3]int{1, 2, 3}
-	i.S = new(**[]int)
-	*i.S = new(*[]int)
-	**i.S = new([]int)
-	***i.S = []int{4, 5, 6}
-	i.M = new(***map[string]int)
-	*i.M = new(**map[string]int)
-	**i.M = new(*map[string]int)
-	***i.M = new(map[string]int)
-	****i.M = map[string]int{"one": 1, "two": 2, "three": 3}
-	b := new(bytes.Buffer)
-	NewEncoder(b).Encode(i)
-	dec := NewDecoder(b)
-	var d Direct
-	err := dec.Decode(&d)
-	if err != nil {
-		t.Error("error: ", err)
-	}
-	if len(d.A) != 3 || d.A[0] != 1 || d.A[1] != 2 || d.A[2] != 3 {
-		t.Errorf("indirect to direct: d.A is %v not %v", d.A, ***i.A)
-	}
-	if len(d.S) != 3 || d.S[0] != 4 || d.S[1] != 5 || d.S[2] != 6 {
-		t.Errorf("indirect to direct: d.S is %v not %v", d.S, ***i.S)
-	}
-	if len(d.M) != 3 || d.M["one"] != 1 || d.M["two"] != 2 || d.M["three"] != 3 {
-		t.Errorf("indirect to direct: d.M is %v not %v", d.M, ***i.M)
-	}
-	// Marshal direct, unmarshal to indirect.
-	d.A = [3]int{11, 22, 33}
-	d.S = []int{44, 55, 66}
-	d.M = map[string]int{"four": 4, "five": 5, "six": 6}
-	i = new(Indirect)
-	b.Reset()
-	NewEncoder(b).Encode(d)
-	dec = NewDecoder(b)
-	err = dec.Decode(&i)
-	if err != nil {
-		t.Fatal("error: ", err)
-	}
-	if len(***i.A) != 3 || (***i.A)[0] != 11 || (***i.A)[1] != 22 || (***i.A)[2] != 33 {
-		t.Errorf("direct to indirect: ***i.A is %v not %v", ***i.A, d.A)
-	}
-	if len(***i.S) != 3 || (***i.S)[0] != 44 || (***i.S)[1] != 55 || (***i.S)[2] != 66 {
-		t.Errorf("direct to indirect: ***i.S is %v not %v", ***i.S, ***i.S)
-	}
-	if len(****i.M) != 3 || (****i.M)["four"] != 4 || (****i.M)["five"] != 5 || (****i.M)["six"] != 6 {
-		t.Errorf("direct to indirect: ****i.M is %v not %v", ****i.M, d.M)
-	}
-}
-
-// An interface with several implementations
-type Squarer interface {
-	Square() int
-}
-
-type Int int
-
-func (i Int) Square() int {
-	return int(i * i)
-}
-
-type Float float64
-
-func (f Float) Square() int {
-	return int(f * f)
-}
-
-type Vector []int
-
-func (v Vector) Square() int {
-	sum := 0
-	for _, x := range v {
-		sum += x * x
-	}
-	return sum
-}
-
-type Point struct {
-	X, Y int
-}
-
-func (p Point) Square() int {
-	return p.X*p.X + p.Y*p.Y
-}
-
-// A struct with interfaces in it.
-type InterfaceItem struct {
-	I             int
-	Sq1, Sq2, Sq3 Squarer
-	F             float64
-	Sq            []Squarer
-}
-
-// The same struct without interfaces
-type NoInterfaceItem struct {
-	I int
-	F float64
-}
-
-func TestInterface(t *testing.T) {
-	iVal := Int(3)
-	fVal := Float(5)
-	// Sending a Vector will require that the receiver define a type in the middle of
-	// receiving the value for item2.
-	vVal := Vector{1, 2, 3}
-	b := new(bytes.Buffer)
-	item1 := &InterfaceItem{1, iVal, fVal, vVal, 11.5, []Squarer{iVal, fVal, nil, vVal}}
-	// Register the types.
-	Register(Int(0))
-	Register(Float(0))
-	Register(Vector{})
-	err := NewEncoder(b).Encode(item1)
-	if err != nil {
-		t.Error("expected no encode error; got", err)
-	}
-
-	item2 := InterfaceItem{}
-	err = NewDecoder(b).Decode(&item2)
-	if err != nil {
-		t.Fatal("decode:", err)
-	}
-	if item2.I != item1.I {
-		t.Error("normal int did not decode correctly")
-	}
-	if item2.Sq1 == nil || item2.Sq1.Square() != iVal.Square() {
-		t.Error("Int did not decode correctly")
-	}
-	if item2.Sq2 == nil || item2.Sq2.Square() != fVal.Square() {
-		t.Error("Float did not decode correctly")
-	}
-	if item2.Sq3 == nil || item2.Sq3.Square() != vVal.Square() {
-		t.Error("Vector did not decode correctly")
-	}
-	if item2.F != item1.F {
-		t.Error("normal float did not decode correctly")
-	}
-	// Now check that we received a slice of Squarers correctly, including a nil element
-	if len(item1.Sq) != len(item2.Sq) {
-		t.Fatalf("[]Squarer length wrong: got %d; expected %d", len(item2.Sq), len(item1.Sq))
-	}
-	for i, v1 := range item1.Sq {
-		v2 := item2.Sq[i]
-		if v1 == nil || v2 == nil {
-			if v1 != nil || v2 != nil {
-				t.Errorf("item %d inconsistent nils", i)
-			}
-		} else if v1.Square() != v2.Square() {
-			t.Errorf("item %d inconsistent values: %v %v", i, v1, v2)
-		}
-	}
-}
-
-// A struct with all basic types, stored in interfaces.
-type BasicInterfaceItem struct {
-	Int, Int8, Int16, Int32, Int64      interface{}
-	Uint, Uint8, Uint16, Uint32, Uint64 interface{}
-	Float32, Float64                    interface{}
-	Complex64, Complex128               interface{}
-	Bool                                interface{}
-	String                              interface{}
-	Bytes                               interface{}
-}
-
-func TestInterfaceBasic(t *testing.T) {
-	b := new(bytes.Buffer)
-	item1 := &BasicInterfaceItem{
-		int(1), int8(1), int16(1), int32(1), int64(1),
-		uint(1), uint8(1), uint16(1), uint32(1), uint64(1),
-		float32(1), 1.0,
-		complex64(1i), complex128(1i),
-		true,
-		"hello",
-		[]byte("sailor"),
-	}
-	err := NewEncoder(b).Encode(item1)
-	if err != nil {
-		t.Error("expected no encode error; got", err)
-	}
-
-	item2 := &BasicInterfaceItem{}
-	err = NewDecoder(b).Decode(&item2)
-	if err != nil {
-		t.Fatal("decode:", err)
-	}
-	if !reflect.DeepEqual(item1, item2) {
-		t.Errorf("encode expected %v got %v", item1, item2)
-	}
-	// Hand check a couple for correct types.
-	if v, ok := item2.Bool.(bool); !ok || !v {
-		t.Error("boolean should be true")
-	}
-	if v, ok := item2.String.(string); !ok || v != item1.String.(string) {
-		t.Errorf("string should be %v is %v", item1.String, v)
-	}
-}
-
-type String string
-
-type PtrInterfaceItem struct {
-	Str1 interface{} // basic
-	Str2 interface{} // derived
-}
-
-// We'll send pointers; should receive values.
-// Also check that we can register T but send *T.
-func TestInterfacePointer(t *testing.T) {
-	b := new(bytes.Buffer)
-	str1 := "howdy"
-	str2 := String("kiddo")
-	item1 := &PtrInterfaceItem{
-		&str1,
-		&str2,
-	}
-	// Register the type.
-	Register(str2)
-	err := NewEncoder(b).Encode(item1)
-	if err != nil {
-		t.Error("expected no encode error; got", err)
-	}
-
-	item2 := &PtrInterfaceItem{}
-	err = NewDecoder(b).Decode(&item2)
-	if err != nil {
-		t.Fatal("decode:", err)
-	}
-	// Hand test for correct types and values.
-	if v, ok := item2.Str1.(string); !ok || v != str1 {
-		t.Errorf("basic string failed: %q should be %q", v, str1)
-	}
-	if v, ok := item2.Str2.(String); !ok || v != str2 {
-		t.Errorf("derived type String failed: %q should be %q", v, str2)
-	}
-}
-
-func TestIgnoreInterface(t *testing.T) {
-	iVal := Int(3)
-	fVal := Float(5)
-	// Sending a Point will require that the receiver define a type in the middle of
-	// receiving the value for item2.
-	pVal := Point{2, 3}
-	b := new(bytes.Buffer)
-	item1 := &InterfaceItem{1, iVal, fVal, pVal, 11.5, nil}
-	// Register the types.
-	Register(Int(0))
-	Register(Float(0))
-	Register(Point{})
-	err := NewEncoder(b).Encode(item1)
-	if err != nil {
-		t.Error("expected no encode error; got", err)
-	}
-
-	item2 := NoInterfaceItem{}
-	err = NewDecoder(b).Decode(&item2)
-	if err != nil {
-		t.Fatal("decode:", err)
-	}
-	if item2.I != item1.I {
-		t.Error("normal int did not decode correctly")
-	}
-	if item2.F != item2.F {
-		t.Error("normal float did not decode correctly")
-	}
-}
-
-type U struct {
-	A int
-	B string
-	c float64
-	D uint
-}
-
-func TestUnexportedFields(t *testing.T) {
-	var u0 U
-	u0.A = 17
-	u0.B = "hello"
-	u0.c = 3.14159
-	u0.D = 23
-	b := new(bytes.Buffer)
-	NewEncoder(b).Encode(u0)
-	dec := NewDecoder(b)
-	var u1 U
-	u1.c = 1234.
-	err := dec.Decode(&u1)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if u0.A != u0.A || u0.B != u1.B || u0.D != u1.D {
-		t.Errorf("u1->u0: expected %v; got %v", u0, u1)
-	}
-	if u1.c != 1234. {
-		t.Error("u1.c modified")
-	}
-}
-
-var singletons = []interface{}{
-	true,
-	7,
-	3.2,
-	"hello",
-	[3]int{11, 22, 33},
-	[]float32{0.5, 0.25, 0.125},
-	map[string]int{"one": 1, "two": 2},
-}
-
-func TestDebugSingleton(t *testing.T) {
-	if debugFunc == nil {
-		return
-	}
-	b := new(bytes.Buffer)
-	// Accumulate a number of values and print them out all at once.
-	for _, x := range singletons {
-		err := NewEncoder(b).Encode(x)
-		if err != nil {
-			t.Fatal("encode:", err)
-		}
-	}
-	debugFunc(b)
-}
-
-// A type that won't be defined in the gob until we send it in an interface value.
-type OnTheFly struct {
-	A int
-}
-
-type DT struct {
-	//	X OnTheFly
-	A     int
-	B     string
-	C     float64
-	I     interface{}
-	J     interface{}
-	I_nil interface{}
-	M     map[string]int
-	T     [3]int
-	S     []string
-}
-
-func newDT() DT {
-	var dt DT
-	dt.A = 17
-	dt.B = "hello"
-	dt.C = 3.14159
-	dt.I = 271828
-	dt.J = OnTheFly{3}
-	dt.I_nil = nil
-	dt.M = map[string]int{"one": 1, "two": 2}
-	dt.T = [3]int{11, 22, 33}
-	dt.S = []string{"hi", "joe"}
-	return dt
-}
-
-func TestDebugStruct(t *testing.T) {
-	if debugFunc == nil {
-		return
-	}
-	Register(OnTheFly{})
-	dt := newDT()
-	b := new(bytes.Buffer)
-	err := NewEncoder(b).Encode(dt)
-	if err != nil {
-		t.Fatal("encode:", err)
-	}
-	debugBuffer := bytes.NewBuffer(b.Bytes())
-	dt2 := &DT{}
-	err = NewDecoder(b).Decode(&dt2)
-	if err != nil {
-		t.Error("decode:", err)
-	}
-	debugFunc(debugBuffer)
-}
-
-func encFuzzDec(rng *rand.Rand, in interface{}) error {
-	buf := new(bytes.Buffer)
-	enc := NewEncoder(buf)
-	if err := enc.Encode(&in); err != nil {
-		return err
-	}
-
-	b := buf.Bytes()
-	for i, bi := range b {
-		if rng.Intn(10) < 3 {
-			b[i] = bi + uint8(rng.Intn(256))
-		}
-	}
-
-	dec := NewDecoder(buf)
-	var e interface{}
-	if err := dec.Decode(&e); err != nil {
-		return err
-	}
-	return nil
-}
-
-// This does some "fuzz testing" by attempting to decode a sequence of random bytes.
-func TestFuzz(t *testing.T) {
-	if !*doFuzzTests {
-		t.Logf("disabled; run with -gob.fuzz to enable")
-		return
-	}
-
-	// all possible inputs
-	input := []interface{}{
-		new(int),
-		new(float32),
-		new(float64),
-		new(complex128),
-		&ByteStruct{255},
-		&ArrayStruct{},
-		&StringStruct{"hello"},
-		&GobTest1{0, &StringStruct{"hello"}},
-	}
-	testFuzz(t, time.Now().UnixNano(), 100, input...)
-}
-
-func TestFuzzRegressions(t *testing.T) {
-	if !*doFuzzTests {
-		t.Logf("disabled; run with -gob.fuzz to enable")
-		return
-	}
-
-	// An instance triggering a type name of length ~102 GB.
-	testFuzz(t, 1328492090837718000, 100, new(float32))
-	// An instance triggering a type name of 1.6 GB.
-	// Note: can take several minutes to run.
-	testFuzz(t, 1330522872628565000, 100, new(int))
-}
-
-func testFuzz(t *testing.T, seed int64, n int, input ...interface{}) {
-	for _, e := range input {
-		t.Logf("seed=%d n=%d e=%T", seed, n, e)
-		rng := rand.New(rand.NewSource(seed))
-		for i := 0; i < n; i++ {
-			encFuzzDec(rng, e)
-		}
-	}
-}
-
-// TestFuzzOneByte tries to decode corrupted input sequences
-// and checks that no panic occurs.
-func TestFuzzOneByte(t *testing.T) {
-	buf := new(bytes.Buffer)
-	Register(OnTheFly{})
-	dt := newDT()
-	if err := NewEncoder(buf).Encode(dt); err != nil {
-		t.Fatal(err)
-	}
-	s := buf.String()
-
-	indices := make([]int, 0, len(s))
-	for i := 0; i < len(s); i++ {
-		switch i {
-		case 14, 167, 231, 265: // a slice length, corruptions are not handled yet.
-			continue
-		}
-		indices = append(indices, i)
-	}
-	if testing.Short() {
-		indices = []int{1, 111, 178} // known fixed panics
-	}
-	for _, i := range indices {
-		for j := 0; j < 256; j += 3 {
-			b := []byte(s)
-			b[i] ^= byte(j)
-			var e DT
-			func() {
-				defer func() {
-					if p := recover(); p != nil {
-						t.Errorf("crash for b[%d] ^= 0x%x", i, j)
-						panic(p)
-					}
-				}()
-				err := NewDecoder(bytes.NewReader(b)).Decode(&e)
-				_ = err
-			}()
-		}
-	}
-}
-
-// Don't crash, just give error with invalid type id.
-// Issue 9649.
-func TestErrorInvalidTypeId(t *testing.T) {
-	data := []byte{0x01, 0x00, 0x01, 0x00}
-	d := NewDecoder(bytes.NewReader(data))
-	// When running d.Decode(&foo) the first time the decoder stops
-	// after []byte{0x01, 0x00} and reports an errBadType. Running
-	// d.Decode(&foo) again on exactly the same input sequence should
-	// give another errBadType, but instead caused a panic because
-	// decoderMap wasn't cleaned up properly after the first error.
-	for i := 0; i < 2; i++ {
-		var foo struct{}
-		err := d.Decode(&foo)
-		if err != errBadType {
-			t.Fatal("decode: expected %s, got %s", errBadType, err)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/debug.go b/third_party/gofrontend/libgo/go/encoding/gob/debug.go
deleted file mode 100644
index 536bbdb..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/debug.go
+++ /dev/null
@@ -1,705 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Delete the next line to include in the gob package.
-// +build ignore
-
-package gob
-
-// This file is not normally included in the gob package.  Used only for debugging the package itself.
-// Except for reading uints, it is an implementation of a reader that is independent of
-// the one implemented by Decoder.
-// To enable the Debug function, delete the +build ignore line above and do
-//	go install
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"os"
-	"strings"
-	"sync"
-)
-
-var dumpBytes = false // If true, print the remaining bytes in the input buffer at each item.
-
-// Init installs the debugging facility. If this file is not compiled in the
-// package, the tests in codec_test.go are no-ops.
-func init() {
-	debugFunc = Debug
-}
-
-var (
-	blanks = bytes.Repeat([]byte{' '}, 3*10)
-	empty  = []byte(": <empty>\n")
-	tabs   = strings.Repeat("\t", 100)
-)
-
-// tab indents itself when printed.
-type tab int
-
-func (t tab) String() string {
-	n := int(t)
-	if n > len(tabs) {
-		n = len(tabs)
-	}
-	return tabs[0:n]
-}
-
-func (t tab) print() {
-	fmt.Fprint(os.Stderr, t)
-}
-
-// A peekReader wraps an io.Reader, allowing one to peek ahead to see
-// what's coming without stealing the data from the client of the Reader.
-type peekReader struct {
-	r    io.Reader
-	data []byte // read-ahead data
-}
-
-// newPeekReader returns a peekReader that wraps r.
-func newPeekReader(r io.Reader) *peekReader {
-	return &peekReader{r: r}
-}
-
-// Read is the usual method. It will first take data that has been read ahead.
-func (p *peekReader) Read(b []byte) (n int, err error) {
-	if len(p.data) == 0 {
-		return p.r.Read(b)
-	}
-	// Satisfy what's possible from the read-ahead data.
-	n = copy(b, p.data)
-	// Move data down to beginning of slice, to avoid endless growth
-	copy(p.data, p.data[n:])
-	p.data = p.data[:len(p.data)-n]
-	return
-}
-
-// peek returns as many bytes as possible from the unread
-// portion of the stream, up to the length of b.
-func (p *peekReader) peek(b []byte) (n int, err error) {
-	if len(p.data) > 0 {
-		n = copy(b, p.data)
-		if n == len(b) {
-			return
-		}
-		b = b[n:]
-	}
-	if len(b) == 0 {
-		return
-	}
-	m, e := io.ReadFull(p.r, b)
-	if m > 0 {
-		p.data = append(p.data, b[:m]...)
-	}
-	n += m
-	if e == io.ErrUnexpectedEOF {
-		// That means m > 0 but we reached EOF. If we got data
-		// we won't complain about not being able to peek enough.
-		if n > 0 {
-			e = nil
-		} else {
-			e = io.EOF
-		}
-	}
-	return n, e
-}
-
-type debugger struct {
-	mutex          sync.Mutex
-	remain         int  // the number of bytes known to remain in the input
-	remainingKnown bool // the value of 'remain' is valid
-	r              *peekReader
-	wireType       map[typeId]*wireType
-	tmp            []byte // scratch space for decoding uints.
-}
-
-// dump prints the next nBytes of the input.
-// It arranges to print the output aligned from call to
-// call, to make it easy to see what has been consumed.
-func (deb *debugger) dump(format string, args ...interface{}) {
-	if !dumpBytes {
-		return
-	}
-	fmt.Fprintf(os.Stderr, format+" ", args...)
-	if !deb.remainingKnown {
-		return
-	}
-	if deb.remain < 0 {
-		fmt.Fprintf(os.Stderr, "remaining byte count is negative! %d\n", deb.remain)
-		return
-	}
-	data := make([]byte, deb.remain)
-	n, _ := deb.r.peek(data)
-	if n == 0 {
-		os.Stderr.Write(empty)
-		return
-	}
-	b := new(bytes.Buffer)
-	fmt.Fprintf(b, "[%d]{\n", deb.remain)
-	// Blanks until first byte
-	lineLength := 0
-	if n := len(data); n%10 != 0 {
-		lineLength = 10 - n%10
-		fmt.Fprintf(b, "\t%s", blanks[:lineLength*3])
-	}
-	// 10 bytes per line
-	for len(data) > 0 {
-		if lineLength == 0 {
-			fmt.Fprint(b, "\t")
-		}
-		m := 10 - lineLength
-		lineLength = 0
-		if m > len(data) {
-			m = len(data)
-		}
-		fmt.Fprintf(b, "% x\n", data[:m])
-		data = data[m:]
-	}
-	fmt.Fprint(b, "}\n")
-	os.Stderr.Write(b.Bytes())
-}
-
-// Debug prints a human-readable representation of the gob data read from r.
-// It is a no-op unless debugging was enabled when the package was built.
-func Debug(r io.Reader) {
-	err := debug(r)
-	if err != nil {
-		fmt.Fprintf(os.Stderr, "gob debug: %s\n", err)
-	}
-}
-
-// debug implements Debug, but catches panics and returns
-// them as errors to be printed by Debug.
-func debug(r io.Reader) (err error) {
-	defer catchError(&err)
-	fmt.Fprintln(os.Stderr, "Start of debugging")
-	deb := &debugger{
-		r:        newPeekReader(r),
-		wireType: make(map[typeId]*wireType),
-		tmp:      make([]byte, 16),
-	}
-	if b, ok := r.(*bytes.Buffer); ok {
-		deb.remain = b.Len()
-		deb.remainingKnown = true
-	}
-	deb.gobStream()
-	return
-}
-
-// note that we've consumed some bytes
-func (deb *debugger) consumed(n int) {
-	if deb.remainingKnown {
-		deb.remain -= n
-	}
-}
-
-// int64 decodes and returns the next integer, which must be present.
-// Don't call this if you could be at EOF.
-func (deb *debugger) int64() int64 {
-	return toInt(deb.uint64())
-}
-
-// uint64 returns and decodes the next unsigned integer, which must be present.
-// Don't call this if you could be at EOF.
-// TODO: handle errors better.
-func (deb *debugger) uint64() uint64 {
-	n, w, err := decodeUintReader(deb.r, deb.tmp)
-	if err != nil {
-		errorf("debug: read error: %s", err)
-	}
-	deb.consumed(w)
-	return n
-}
-
-// GobStream:
-//	DelimitedMessage* (until EOF)
-func (deb *debugger) gobStream() {
-	// Make sure we're single-threaded through here.
-	deb.mutex.Lock()
-	defer deb.mutex.Unlock()
-
-	for deb.delimitedMessage(0) {
-	}
-}
-
-// DelimitedMessage:
-//	uint(lengthOfMessage) Message
-func (deb *debugger) delimitedMessage(indent tab) bool {
-	for {
-		n := deb.loadBlock(true)
-		if n < 0 {
-			return false
-		}
-		deb.dump("Delimited message of length %d", n)
-		deb.message(indent)
-	}
-	return true
-}
-
-// loadBlock preps us to read a message
-// of the length specified next in the input. It returns
-// the length of the block. The argument tells whether
-// an EOF is acceptable now.  If it is and one is found,
-// the return value is negative.
-func (deb *debugger) loadBlock(eofOK bool) int {
-	n64, w, err := decodeUintReader(deb.r, deb.tmp) // deb.uint64 will error at EOF
-	if err != nil {
-		if eofOK && err == io.EOF {
-			return -1
-		}
-		errorf("debug: unexpected error: %s", err)
-	}
-	deb.consumed(w)
-	n := int(n64)
-	if n < 0 {
-		errorf("huge value for message length: %d", n64)
-	}
-	return int(n)
-}
-
-// Message:
-//	TypeSequence TypedValue
-// TypeSequence
-//	(TypeDefinition DelimitedTypeDefinition*)?
-// DelimitedTypeDefinition:
-//	uint(lengthOfTypeDefinition) TypeDefinition
-// TypedValue:
-//	int(typeId) Value
-func (deb *debugger) message(indent tab) bool {
-	for {
-		// Convert the uint64 to a signed integer typeId
-		uid := deb.int64()
-		id := typeId(uid)
-		deb.dump("type id=%d", id)
-		if id < 0 {
-			deb.typeDefinition(indent, -id)
-			n := deb.loadBlock(false)
-			deb.dump("Message of length %d", n)
-			continue
-		} else {
-			deb.value(indent, id)
-			break
-		}
-	}
-	return true
-}
-
-// Helper methods to make it easy to scan a type descriptor.
-
-// common returns the CommonType at the input point.
-func (deb *debugger) common() CommonType {
-	fieldNum := -1
-	name := ""
-	id := typeId(0)
-	for {
-		delta := deb.delta(-1)
-		if delta == 0 {
-			break
-		}
-		fieldNum += delta
-		switch fieldNum {
-		case 0:
-			name = deb.string()
-		case 1:
-			// Id typeId
-			id = deb.typeId()
-		default:
-			errorf("corrupted CommonType, delta is %d fieldNum is %d", delta, fieldNum)
-		}
-	}
-	return CommonType{name, id}
-}
-
-// uint returns the unsigned int at the input point, as a uint (not uint64).
-func (deb *debugger) uint() uint {
-	return uint(deb.uint64())
-}
-
-// int returns the signed int at the input point, as an int (not int64).
-func (deb *debugger) int() int {
-	return int(deb.int64())
-}
-
-// typeId returns the type id at the input point.
-func (deb *debugger) typeId() typeId {
-	return typeId(deb.int64())
-}
-
-// string returns the string at the input point.
-func (deb *debugger) string() string {
-	x := int(deb.uint64())
-	b := make([]byte, x)
-	nb, _ := deb.r.Read(b)
-	if nb != x {
-		errorf("corrupted type")
-	}
-	deb.consumed(nb)
-	return string(b)
-}
-
-// delta returns the field delta at the input point.  The expect argument,
-// if non-negative, identifies what the value should be.
-func (deb *debugger) delta(expect int) int {
-	delta := int(deb.uint64())
-	if delta < 0 || (expect >= 0 && delta != expect) {
-		errorf("decode: corrupted type: delta %d expected %d", delta, expect)
-	}
-	return delta
-}
-
-// TypeDefinition:
-//	[int(-typeId) (already read)] encodingOfWireType
-func (deb *debugger) typeDefinition(indent tab, id typeId) {
-	deb.dump("type definition for id %d", id)
-	// Encoding is of a wireType. Decode the structure as usual
-	fieldNum := -1
-	wire := new(wireType)
-	// A wireType defines a single field.
-	delta := deb.delta(-1)
-	fieldNum += delta
-	switch fieldNum {
-	case 0: // array type, one field of {{Common}, elem, length}
-		// Field number 0 is CommonType
-		deb.delta(1)
-		com := deb.common()
-		// Field number 1 is type Id of elem
-		deb.delta(1)
-		id := deb.typeId()
-		// Field number 3 is length
-		deb.delta(1)
-		length := deb.int()
-		wire.ArrayT = &arrayType{com, id, length}
-
-	case 1: // slice type, one field of {{Common}, elem}
-		// Field number 0 is CommonType
-		deb.delta(1)
-		com := deb.common()
-		// Field number 1 is type Id of elem
-		deb.delta(1)
-		id := deb.typeId()
-		wire.SliceT = &sliceType{com, id}
-
-	case 2: // struct type, one field of {{Common}, []fieldType}
-		// Field number 0 is CommonType
-		deb.delta(1)
-		com := deb.common()
-		// Field number 1 is slice of FieldType
-		deb.delta(1)
-		numField := int(deb.uint())
-		field := make([]*fieldType, numField)
-		for i := 0; i < numField; i++ {
-			field[i] = new(fieldType)
-			deb.delta(1) // field 0 of fieldType: name
-			field[i].Name = deb.string()
-			deb.delta(1) // field 1 of fieldType: id
-			field[i].Id = deb.typeId()
-			deb.delta(0) // end of fieldType
-		}
-		wire.StructT = &structType{com, field}
-
-	case 3: // map type, one field of {{Common}, key, elem}
-		// Field number 0 is CommonType
-		deb.delta(1)
-		com := deb.common()
-		// Field number 1 is type Id of key
-		deb.delta(1)
-		keyId := deb.typeId()
-		// Field number 2 is type Id of elem
-		deb.delta(1)
-		elemId := deb.typeId()
-		wire.MapT = &mapType{com, keyId, elemId}
-	case 4: // GobEncoder type, one field of {{Common}}
-		// Field number 0 is CommonType
-		deb.delta(1)
-		com := deb.common()
-		wire.GobEncoderT = &gobEncoderType{com}
-	case 5: // BinaryMarshaler type, one field of {{Common}}
-		// Field number 0 is CommonType
-		deb.delta(1)
-		com := deb.common()
-		wire.BinaryMarshalerT = &gobEncoderType{com}
-	case 6: // TextMarshaler type, one field of {{Common}}
-		// Field number 0 is CommonType
-		deb.delta(1)
-		com := deb.common()
-		wire.TextMarshalerT = &gobEncoderType{com}
-	default:
-		errorf("bad field in type %d", fieldNum)
-	}
-	deb.printWireType(indent, wire)
-	deb.delta(0) // end inner type (arrayType, etc.)
-	deb.delta(0) // end wireType
-	// Remember we've seen this type.
-	deb.wireType[id] = wire
-}
-
-// Value:
-//	SingletonValue | StructValue
-func (deb *debugger) value(indent tab, id typeId) {
-	wire, ok := deb.wireType[id]
-	if ok && wire.StructT != nil {
-		deb.structValue(indent, id)
-	} else {
-		deb.singletonValue(indent, id)
-	}
-}
-
-// SingletonValue:
-//	uint(0) FieldValue
-func (deb *debugger) singletonValue(indent tab, id typeId) {
-	deb.dump("Singleton value")
-	// is it a builtin type?
-	wire := deb.wireType[id]
-	_, ok := builtinIdToType[id]
-	if !ok && wire == nil {
-		errorf("type id %d not defined", id)
-	}
-	m := deb.uint64()
-	if m != 0 {
-		errorf("expected zero; got %d", m)
-	}
-	deb.fieldValue(indent, id)
-}
-
-// InterfaceValue:
-//	NilInterfaceValue | NonNilInterfaceValue
-func (deb *debugger) interfaceValue(indent tab) {
-	deb.dump("Start of interface value")
-	if nameLen := deb.uint64(); nameLen == 0 {
-		deb.nilInterfaceValue(indent)
-	} else {
-		deb.nonNilInterfaceValue(indent, int(nameLen))
-	}
-}
-
-// NilInterfaceValue:
-//	uint(0) [already read]
-func (deb *debugger) nilInterfaceValue(indent tab) int {
-	fmt.Fprintf(os.Stderr, "%snil interface\n", indent)
-	return 0
-}
-
-// NonNilInterfaceValue:
-//	ConcreteTypeName TypeSequence InterfaceContents
-// ConcreteTypeName:
-//	uint(lengthOfName) [already read=n] name
-// InterfaceContents:
-//	int(concreteTypeId) DelimitedValue
-// DelimitedValue:
-//	uint(length) Value
-func (deb *debugger) nonNilInterfaceValue(indent tab, nameLen int) {
-	// ConcreteTypeName
-	b := make([]byte, nameLen)
-	deb.r.Read(b) // TODO: CHECK THESE READS!!
-	deb.consumed(nameLen)
-	name := string(b)
-
-	for {
-		id := deb.typeId()
-		if id < 0 {
-			deb.typeDefinition(indent, -id)
-			n := deb.loadBlock(false)
-			deb.dump("Nested message of length %d", n)
-		} else {
-			// DelimitedValue
-			x := deb.uint64() // in case we want to ignore the value; we don't.
-			fmt.Fprintf(os.Stderr, "%sinterface value, type %q id=%d; valueLength %d\n", indent, name, id, x)
-			deb.value(indent, id)
-			break
-		}
-	}
-}
-
-// printCommonType prints a common type; used by printWireType.
-func (deb *debugger) printCommonType(indent tab, kind string, common *CommonType) {
-	indent.print()
-	fmt.Fprintf(os.Stderr, "%s %q id=%d\n", kind, common.Name, common.Id)
-}
-
-// printWireType prints the contents of a wireType.
-func (deb *debugger) printWireType(indent tab, wire *wireType) {
-	fmt.Fprintf(os.Stderr, "%stype definition {\n", indent)
-	indent++
-	switch {
-	case wire.ArrayT != nil:
-		deb.printCommonType(indent, "array", &wire.ArrayT.CommonType)
-		fmt.Fprintf(os.Stderr, "%slen %d\n", indent+1, wire.ArrayT.Len)
-		fmt.Fprintf(os.Stderr, "%selemid %d\n", indent+1, wire.ArrayT.Elem)
-	case wire.MapT != nil:
-		deb.printCommonType(indent, "map", &wire.MapT.CommonType)
-		fmt.Fprintf(os.Stderr, "%skey id=%d\n", indent+1, wire.MapT.Key)
-		fmt.Fprintf(os.Stderr, "%selem id=%d\n", indent+1, wire.MapT.Elem)
-	case wire.SliceT != nil:
-		deb.printCommonType(indent, "slice", &wire.SliceT.CommonType)
-		fmt.Fprintf(os.Stderr, "%selem id=%d\n", indent+1, wire.SliceT.Elem)
-	case wire.StructT != nil:
-		deb.printCommonType(indent, "struct", &wire.StructT.CommonType)
-		for i, field := range wire.StructT.Field {
-			fmt.Fprintf(os.Stderr, "%sfield %d:\t%s\tid=%d\n", indent+1, i, field.Name, field.Id)
-		}
-	case wire.GobEncoderT != nil:
-		deb.printCommonType(indent, "GobEncoder", &wire.GobEncoderT.CommonType)
-	}
-	indent--
-	fmt.Fprintf(os.Stderr, "%s}\n", indent)
-}
-
-// fieldValue prints a value of any type, such as a struct field.
-// FieldValue:
-//	builtinValue | ArrayValue | MapValue | SliceValue | StructValue | InterfaceValue
-func (deb *debugger) fieldValue(indent tab, id typeId) {
-	_, ok := builtinIdToType[id]
-	if ok {
-		if id == tInterface {
-			deb.interfaceValue(indent)
-		} else {
-			deb.printBuiltin(indent, id)
-		}
-		return
-	}
-	wire, ok := deb.wireType[id]
-	if !ok {
-		errorf("type id %d not defined", id)
-	}
-	switch {
-	case wire.ArrayT != nil:
-		deb.arrayValue(indent, wire)
-	case wire.MapT != nil:
-		deb.mapValue(indent, wire)
-	case wire.SliceT != nil:
-		deb.sliceValue(indent, wire)
-	case wire.StructT != nil:
-		deb.structValue(indent, id)
-	case wire.GobEncoderT != nil:
-		deb.gobEncoderValue(indent, id)
-	default:
-		panic("bad wire type for field")
-	}
-}
-
-// printBuiltin prints a value not of a fundamental type, that is,
-// one whose type is known to gobs at bootstrap time.
-func (deb *debugger) printBuiltin(indent tab, id typeId) {
-	switch id {
-	case tBool:
-		x := deb.int64()
-		if x == 0 {
-			fmt.Fprintf(os.Stderr, "%sfalse\n", indent)
-		} else {
-			fmt.Fprintf(os.Stderr, "%strue\n", indent)
-		}
-	case tInt:
-		x := deb.int64()
-		fmt.Fprintf(os.Stderr, "%s%d\n", indent, x)
-	case tUint:
-		x := deb.int64()
-		fmt.Fprintf(os.Stderr, "%s%d\n", indent, x)
-	case tFloat:
-		x := deb.uint64()
-		fmt.Fprintf(os.Stderr, "%s%g\n", indent, float64FromBits(x))
-	case tComplex:
-		r := deb.uint64()
-		i := deb.uint64()
-		fmt.Fprintf(os.Stderr, "%s%g+%gi\n", indent, float64FromBits(r), float64FromBits(i))
-	case tBytes:
-		x := int(deb.uint64())
-		b := make([]byte, x)
-		deb.r.Read(b)
-		deb.consumed(x)
-		fmt.Fprintf(os.Stderr, "%s{% x}=%q\n", indent, b, b)
-	case tString:
-		x := int(deb.uint64())
-		b := make([]byte, x)
-		deb.r.Read(b)
-		deb.consumed(x)
-		fmt.Fprintf(os.Stderr, "%s%q\n", indent, b)
-	default:
-		panic("unknown builtin")
-	}
-}
-
-// ArrayValue:
-//	uint(n) FieldValue*n
-func (deb *debugger) arrayValue(indent tab, wire *wireType) {
-	elemId := wire.ArrayT.Elem
-	u := deb.uint64()
-	length := int(u)
-	for i := 0; i < length; i++ {
-		deb.fieldValue(indent, elemId)
-	}
-	if length != wire.ArrayT.Len {
-		fmt.Fprintf(os.Stderr, "%s(wrong length for array: %d should be %d)\n", indent, length, wire.ArrayT.Len)
-	}
-}
-
-// MapValue:
-//	uint(n) (FieldValue FieldValue)*n  [n (key, value) pairs]
-func (deb *debugger) mapValue(indent tab, wire *wireType) {
-	keyId := wire.MapT.Key
-	elemId := wire.MapT.Elem
-	u := deb.uint64()
-	length := int(u)
-	for i := 0; i < length; i++ {
-		deb.fieldValue(indent+1, keyId)
-		deb.fieldValue(indent+1, elemId)
-	}
-}
-
-// SliceValue:
-//	uint(n) (n FieldValue)
-func (deb *debugger) sliceValue(indent tab, wire *wireType) {
-	elemId := wire.SliceT.Elem
-	u := deb.uint64()
-	length := int(u)
-	deb.dump("Start of slice of length %d", length)
-
-	for i := 0; i < length; i++ {
-		deb.fieldValue(indent, elemId)
-	}
-}
-
-// StructValue:
-//	(uint(fieldDelta) FieldValue)*
-func (deb *debugger) structValue(indent tab, id typeId) {
-	deb.dump("Start of struct value of %q id=%d\n<<\n", id.name(), id)
-	fmt.Fprintf(os.Stderr, "%s%s struct {\n", indent, id.name())
-	wire, ok := deb.wireType[id]
-	if !ok {
-		errorf("type id %d not defined", id)
-	}
-	strct := wire.StructT
-	fieldNum := -1
-	indent++
-	for {
-		delta := deb.uint64()
-		if delta == 0 { // struct terminator is zero delta fieldnum
-			break
-		}
-		fieldNum += int(delta)
-		if fieldNum < 0 || fieldNum >= len(strct.Field) {
-			deb.dump("field number out of range: prevField=%d delta=%d", fieldNum-int(delta), delta)
-			break
-		}
-		fmt.Fprintf(os.Stderr, "%sfield %d:\t%s\n", indent, fieldNum, wire.StructT.Field[fieldNum].Name)
-		deb.fieldValue(indent+1, strct.Field[fieldNum].Id)
-	}
-	indent--
-	fmt.Fprintf(os.Stderr, "%s} // end %s struct\n", indent, id.name())
-	deb.dump(">> End of struct value of type %d %q", id, id.name())
-}
-
-// GobEncoderValue:
-//	uint(n) byte*n
-func (deb *debugger) gobEncoderValue(indent tab, id typeId) {
-	len := deb.uint64()
-	deb.dump("GobEncoder value of %q id=%d, length %d\n", id.name(), id, len)
-	fmt.Fprintf(os.Stderr, "%s%s (implements GobEncoder)\n", indent, id.name())
-	data := make([]byte, len)
-	_, err := deb.r.Read(data)
-	if err != nil {
-		errorf("gobEncoder data read: %s", err)
-	}
-	fmt.Fprintf(os.Stderr, "%s[% .2x]\n", indent+1, data)
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/dec_helpers.go b/third_party/gofrontend/libgo/go/encoding/gob/dec_helpers.go
deleted file mode 100644
index a1b6766..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/dec_helpers.go
+++ /dev/null
@@ -1,468 +0,0 @@
-// Created by decgen --output dec_helpers.go; DO NOT EDIT
-
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gob
-
-import (
-	"math"
-	"reflect"
-)
-
-var decArrayHelper = map[reflect.Kind]decHelper{
-	reflect.Bool:       decBoolArray,
-	reflect.Complex64:  decComplex64Array,
-	reflect.Complex128: decComplex128Array,
-	reflect.Float32:    decFloat32Array,
-	reflect.Float64:    decFloat64Array,
-	reflect.Int:        decIntArray,
-	reflect.Int16:      decInt16Array,
-	reflect.Int32:      decInt32Array,
-	reflect.Int64:      decInt64Array,
-	reflect.Int8:       decInt8Array,
-	reflect.String:     decStringArray,
-	reflect.Uint:       decUintArray,
-	reflect.Uint16:     decUint16Array,
-	reflect.Uint32:     decUint32Array,
-	reflect.Uint64:     decUint64Array,
-	reflect.Uintptr:    decUintptrArray,
-}
-
-var decSliceHelper = map[reflect.Kind]decHelper{
-	reflect.Bool:       decBoolSlice,
-	reflect.Complex64:  decComplex64Slice,
-	reflect.Complex128: decComplex128Slice,
-	reflect.Float32:    decFloat32Slice,
-	reflect.Float64:    decFloat64Slice,
-	reflect.Int:        decIntSlice,
-	reflect.Int16:      decInt16Slice,
-	reflect.Int32:      decInt32Slice,
-	reflect.Int64:      decInt64Slice,
-	reflect.Int8:       decInt8Slice,
-	reflect.String:     decStringSlice,
-	reflect.Uint:       decUintSlice,
-	reflect.Uint16:     decUint16Slice,
-	reflect.Uint32:     decUint32Slice,
-	reflect.Uint64:     decUint64Slice,
-	reflect.Uintptr:    decUintptrSlice,
-}
-
-func decBoolArray(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decBoolSlice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decBoolSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]bool)
-	if !ok {
-		// It is kind bool but not type bool. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding bool array or slice: length exceeds input size (%d elements)", length)
-		}
-		slice[i] = state.decodeUint() != 0
-	}
-	return true
-}
-
-func decComplex64Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decComplex64Slice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decComplex64Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]complex64)
-	if !ok {
-		// It is kind complex64 but not type complex64. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding complex64 array or slice: length exceeds input size (%d elements)", length)
-		}
-		real := float32FromBits(state.decodeUint(), ovfl)
-		imag := float32FromBits(state.decodeUint(), ovfl)
-		slice[i] = complex(float32(real), float32(imag))
-	}
-	return true
-}
-
-func decComplex128Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decComplex128Slice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decComplex128Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]complex128)
-	if !ok {
-		// It is kind complex128 but not type complex128. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding complex128 array or slice: length exceeds input size (%d elements)", length)
-		}
-		real := float64FromBits(state.decodeUint())
-		imag := float64FromBits(state.decodeUint())
-		slice[i] = complex(real, imag)
-	}
-	return true
-}
-
-func decFloat32Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decFloat32Slice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decFloat32Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]float32)
-	if !ok {
-		// It is kind float32 but not type float32. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding float32 array or slice: length exceeds input size (%d elements)", length)
-		}
-		slice[i] = float32(float32FromBits(state.decodeUint(), ovfl))
-	}
-	return true
-}
-
-func decFloat64Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decFloat64Slice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decFloat64Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]float64)
-	if !ok {
-		// It is kind float64 but not type float64. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding float64 array or slice: length exceeds input size (%d elements)", length)
-		}
-		slice[i] = float64FromBits(state.decodeUint())
-	}
-	return true
-}
-
-func decIntArray(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decIntSlice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decIntSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]int)
-	if !ok {
-		// It is kind int but not type int. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding int array or slice: length exceeds input size (%d elements)", length)
-		}
-		x := state.decodeInt()
-		// MinInt and MaxInt
-		if x < ^int64(^uint(0)>>1) || int64(^uint(0)>>1) < x {
-			error_(ovfl)
-		}
-		slice[i] = int(x)
-	}
-	return true
-}
-
-func decInt16Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decInt16Slice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decInt16Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]int16)
-	if !ok {
-		// It is kind int16 but not type int16. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding int16 array or slice: length exceeds input size (%d elements)", length)
-		}
-		x := state.decodeInt()
-		if x < math.MinInt16 || math.MaxInt16 < x {
-			error_(ovfl)
-		}
-		slice[i] = int16(x)
-	}
-	return true
-}
-
-func decInt32Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decInt32Slice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decInt32Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]int32)
-	if !ok {
-		// It is kind int32 but not type int32. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding int32 array or slice: length exceeds input size (%d elements)", length)
-		}
-		x := state.decodeInt()
-		if x < math.MinInt32 || math.MaxInt32 < x {
-			error_(ovfl)
-		}
-		slice[i] = int32(x)
-	}
-	return true
-}
-
-func decInt64Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decInt64Slice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decInt64Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]int64)
-	if !ok {
-		// It is kind int64 but not type int64. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding int64 array or slice: length exceeds input size (%d elements)", length)
-		}
-		slice[i] = state.decodeInt()
-	}
-	return true
-}
-
-func decInt8Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decInt8Slice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decInt8Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]int8)
-	if !ok {
-		// It is kind int8 but not type int8. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding int8 array or slice: length exceeds input size (%d elements)", length)
-		}
-		x := state.decodeInt()
-		if x < math.MinInt8 || math.MaxInt8 < x {
-			error_(ovfl)
-		}
-		slice[i] = int8(x)
-	}
-	return true
-}
-
-func decStringArray(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decStringSlice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decStringSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]string)
-	if !ok {
-		// It is kind string but not type string. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding string array or slice: length exceeds input size (%d elements)", length)
-		}
-		u := state.decodeUint()
-		n := int(u)
-		if n < 0 || uint64(n) != u || n > state.b.Len() {
-			errorf("length of string exceeds input size (%d bytes)", u)
-		}
-		if n > state.b.Len() {
-			errorf("string data too long for buffer: %d", n)
-		}
-		// Read the data.
-		data := make([]byte, n)
-		if _, err := state.b.Read(data); err != nil {
-			errorf("error decoding string: %s", err)
-		}
-		slice[i] = string(data)
-	}
-	return true
-}
-
-func decUintArray(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decUintSlice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decUintSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]uint)
-	if !ok {
-		// It is kind uint but not type uint. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding uint array or slice: length exceeds input size (%d elements)", length)
-		}
-		x := state.decodeUint()
-		/*TODO if math.MaxUint32 < x {
-			error_(ovfl)
-		}*/
-		slice[i] = uint(x)
-	}
-	return true
-}
-
-func decUint16Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decUint16Slice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decUint16Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]uint16)
-	if !ok {
-		// It is kind uint16 but not type uint16. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding uint16 array or slice: length exceeds input size (%d elements)", length)
-		}
-		x := state.decodeUint()
-		if math.MaxUint16 < x {
-			error_(ovfl)
-		}
-		slice[i] = uint16(x)
-	}
-	return true
-}
-
-func decUint32Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decUint32Slice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decUint32Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]uint32)
-	if !ok {
-		// It is kind uint32 but not type uint32. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding uint32 array or slice: length exceeds input size (%d elements)", length)
-		}
-		x := state.decodeUint()
-		if math.MaxUint32 < x {
-			error_(ovfl)
-		}
-		slice[i] = uint32(x)
-	}
-	return true
-}
-
-func decUint64Array(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decUint64Slice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decUint64Slice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]uint64)
-	if !ok {
-		// It is kind uint64 but not type uint64. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding uint64 array or slice: length exceeds input size (%d elements)", length)
-		}
-		slice[i] = state.decodeUint()
-	}
-	return true
-}
-
-func decUintptrArray(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return decUintptrSlice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-
-func decUintptrSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]uintptr)
-	if !ok {
-		// It is kind uintptr but not type uintptr. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding uintptr array or slice: length exceeds input size (%d elements)", length)
-		}
-		x := state.decodeUint()
-		if uint64(^uintptr(0)) < x {
-			error_(ovfl)
-		}
-		slice[i] = uintptr(x)
-	}
-	return true
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/decgen.go b/third_party/gofrontend/libgo/go/encoding/gob/decgen.go
deleted file mode 100644
index da41a89..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/decgen.go
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// encgen writes the helper functions for encoding. Intended to be
-// used with go generate; see the invocation in encode.go.
-
-// TODO: We could do more by being unsafe. Add a -unsafe flag?
-
-package main
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"go/format"
-	"log"
-	"os"
-)
-
-var output = flag.String("output", "dec_helpers.go", "file name to write")
-
-type Type struct {
-	lower   string
-	upper   string
-	decoder string
-}
-
-var types = []Type{
-	{
-		"bool",
-		"Bool",
-		`slice[i] = state.decodeUint() != 0`,
-	},
-	{
-		"complex64",
-		"Complex64",
-		`real := float32FromBits(state.decodeUint(), ovfl)
-		imag := float32FromBits(state.decodeUint(), ovfl)
-		slice[i] = complex(float32(real), float32(imag))`,
-	},
-	{
-		"complex128",
-		"Complex128",
-		`real := float64FromBits(state.decodeUint())
-		imag := float64FromBits(state.decodeUint())
-		slice[i] = complex(real, imag)`,
-	},
-	{
-		"float32",
-		"Float32",
-		`slice[i] = float32(float32FromBits(state.decodeUint(), ovfl))`,
-	},
-	{
-		"float64",
-		"Float64",
-		`slice[i] = float64FromBits(state.decodeUint())`,
-	},
-	{
-		"int",
-		"Int",
-		`x := state.decodeInt()
-		// MinInt and MaxInt
-		if x < ^int64(^uint(0)>>1) || int64(^uint(0)>>1) < x {
-			error_(ovfl)
-		}
-		slice[i] = int(x)`,
-	},
-	{
-		"int16",
-		"Int16",
-		`x := state.decodeInt()
-		if x < math.MinInt16 || math.MaxInt16 < x {
-			error_(ovfl)
-		}
-		slice[i] = int16(x)`,
-	},
-	{
-		"int32",
-		"Int32",
-		`x := state.decodeInt()
-		if x < math.MinInt32 || math.MaxInt32 < x {
-			error_(ovfl)
-		}
-		slice[i] = int32(x)`,
-	},
-	{
-		"int64",
-		"Int64",
-		`slice[i] = state.decodeInt()`,
-	},
-	{
-		"int8",
-		"Int8",
-		`x := state.decodeInt()
-		if x < math.MinInt8 || math.MaxInt8 < x {
-			error_(ovfl)
-		}
-		slice[i] = int8(x)`,
-	},
-	{
-		"string",
-		"String",
-		`u := state.decodeUint()
-		n := int(u)
-		if n < 0 || uint64(n) != u || n > state.b.Len() {
-			errorf("length of string exceeds input size (%d bytes)", u)
-		}
-		if n > state.b.Len() {
-			errorf("string data too long for buffer: %d", n)
-		}
-		// Read the data.
-		data := make([]byte, n)
-		if _, err := state.b.Read(data); err != nil {
-			errorf("error decoding string: %s", err)
-		}
-		slice[i] = string(data)`,
-	},
-	{
-		"uint",
-		"Uint",
-		`x := state.decodeUint()
-		/*TODO if math.MaxUint32 < x {
-			error_(ovfl)
-		}*/
-		slice[i] = uint(x)`,
-	},
-	{
-		"uint16",
-		"Uint16",
-		`x := state.decodeUint()
-		if math.MaxUint16 < x {
-			error_(ovfl)
-		}
-		slice[i] = uint16(x)`,
-	},
-	{
-		"uint32",
-		"Uint32",
-		`x := state.decodeUint()
-		if math.MaxUint32 < x {
-			error_(ovfl)
-		}
-		slice[i] = uint32(x)`,
-	},
-	{
-		"uint64",
-		"Uint64",
-		`slice[i] = state.decodeUint()`,
-	},
-	{
-		"uintptr",
-		"Uintptr",
-		`x := state.decodeUint()
-		if uint64(^uintptr(0)) < x {
-			error_(ovfl)
-		}
-		slice[i] = uintptr(x)`,
-	},
-	// uint8 Handled separately.
-}
-
-func main() {
-	log.SetFlags(0)
-	log.SetPrefix("decgen: ")
-	flag.Parse()
-	if flag.NArg() != 0 {
-		log.Fatal("usage: decgen [--output filename]")
-	}
-	var b bytes.Buffer
-	fmt.Fprintf(&b, "// Created by decgen --output %s; DO NOT EDIT\n", *output)
-	fmt.Fprint(&b, header)
-	printMaps(&b, "Array")
-	fmt.Fprint(&b, "\n")
-	printMaps(&b, "Slice")
-	for _, t := range types {
-		fmt.Fprintf(&b, arrayHelper, t.lower, t.upper)
-		fmt.Fprintf(&b, sliceHelper, t.lower, t.upper, t.decoder)
-	}
-	source, err := format.Source(b.Bytes())
-	if err != nil {
-		log.Fatal("source format error:", err)
-	}
-	fd, err := os.Create(*output)
-	_, err = fd.Write(source)
-	if err != nil {
-		log.Fatal(err)
-	}
-}
-
-func printMaps(b *bytes.Buffer, upperClass string) {
-	fmt.Fprintf(b, "var dec%sHelper = map[reflect.Kind]decHelper{\n", upperClass)
-	for _, t := range types {
-		fmt.Fprintf(b, "reflect.%s: dec%s%s,\n", t.upper, t.upper, upperClass)
-	}
-	fmt.Fprintf(b, "}\n")
-}
-
-const header = `
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gob
-
-import (
-	"math"
-	"reflect"
-)
-
-`
-
-const arrayHelper = `
-func dec%[2]sArray(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return dec%[2]sSlice(state, v.Slice(0, v.Len()), length, ovfl)
-}
-`
-
-const sliceHelper = `
-func dec%[2]sSlice(state *decoderState, v reflect.Value, length int, ovfl error) bool {
-	slice, ok := v.Interface().([]%[1]s)
-	if !ok {
-		// It is kind %[1]s but not type %[1]s. TODO: We can handle this unsafely.
-		return false
-	}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding %[1]s array or slice: length exceeds input size (%%d elements)", length)
-		}
-		%[3]s
-	}
-	return true
-}
-`
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/decode.go b/third_party/gofrontend/libgo/go/encoding/gob/decode.go
deleted file mode 100644
index e913f15..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/decode.go
+++ /dev/null
@@ -1,1248 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:generate go run decgen.go -output dec_helpers.go
-
-package gob
-
-import (
-	"encoding"
-	"errors"
-	"io"
-	"math"
-	"reflect"
-)
-
-var (
-	errBadUint = errors.New("gob: encoded unsigned integer out of range")
-	errBadType = errors.New("gob: unknown type id or corrupted data")
-	errRange   = errors.New("gob: bad data: field numbers out of bounds")
-)
-
-type decHelper func(state *decoderState, v reflect.Value, length int, ovfl error) bool
-
-// decoderState is the execution state of an instance of the decoder. A new state
-// is created for nested objects.
-type decoderState struct {
-	dec *Decoder
-	// The buffer is stored with an extra indirection because it may be replaced
-	// if we load a type during decode (when reading an interface value).
-	b        *decBuffer
-	fieldnum int // the last field number read.
-	buf      []byte
-	next     *decoderState // for free list
-}
-
-// decBuffer is an extremely simple, fast implementation of a read-only byte buffer.
-// It is initialized by calling Size and then copying the data into the slice returned by Bytes().
-type decBuffer struct {
-	data   []byte
-	offset int // Read offset.
-}
-
-func (d *decBuffer) Read(p []byte) (int, error) {
-	n := copy(p, d.data[d.offset:])
-	if n == 0 && len(p) != 0 {
-		return 0, io.EOF
-	}
-	d.offset += n
-	return n, nil
-}
-
-func (d *decBuffer) Drop(n int) {
-	if n > d.Len() {
-		panic("drop")
-	}
-	d.offset += n
-}
-
-// Size grows the buffer to exactly n bytes, so d.Bytes() will
-// return a slice of length n. Existing data is first discarded.
-func (d *decBuffer) Size(n int) {
-	d.Reset()
-	if cap(d.data) < n {
-		d.data = make([]byte, n)
-	} else {
-		d.data = d.data[0:n]
-	}
-}
-
-func (d *decBuffer) ReadByte() (byte, error) {
-	if d.offset >= len(d.data) {
-		return 0, io.EOF
-	}
-	c := d.data[d.offset]
-	d.offset++
-	return c, nil
-}
-
-func (d *decBuffer) Len() int {
-	return len(d.data) - d.offset
-}
-
-func (d *decBuffer) Bytes() []byte {
-	return d.data[d.offset:]
-}
-
-func (d *decBuffer) Reset() {
-	d.data = d.data[0:0]
-	d.offset = 0
-}
-
-// We pass the bytes.Buffer separately for easier testing of the infrastructure
-// without requiring a full Decoder.
-func (dec *Decoder) newDecoderState(buf *decBuffer) *decoderState {
-	d := dec.freeList
-	if d == nil {
-		d = new(decoderState)
-		d.dec = dec
-		d.buf = make([]byte, uint64Size)
-	} else {
-		dec.freeList = d.next
-	}
-	d.b = buf
-	return d
-}
-
-func (dec *Decoder) freeDecoderState(d *decoderState) {
-	d.next = dec.freeList
-	dec.freeList = d
-}
-
-func overflow(name string) error {
-	return errors.New(`value for "` + name + `" out of range`)
-}
-
-// decodeUintReader reads an encoded unsigned integer from an io.Reader.
-// Used only by the Decoder to read the message length.
-func decodeUintReader(r io.Reader, buf []byte) (x uint64, width int, err error) {
-	width = 1
-	n, err := io.ReadFull(r, buf[0:width])
-	if n == 0 {
-		return
-	}
-	b := buf[0]
-	if b <= 0x7f {
-		return uint64(b), width, nil
-	}
-	n = -int(int8(b))
-	if n > uint64Size {
-		err = errBadUint
-		return
-	}
-	width, err = io.ReadFull(r, buf[0:n])
-	if err != nil {
-		if err == io.EOF {
-			err = io.ErrUnexpectedEOF
-		}
-		return
-	}
-	// Could check that the high byte is zero but it's not worth it.
-	for _, b := range buf[0:width] {
-		x = x<<8 | uint64(b)
-	}
-	width++ // +1 for length byte
-	return
-}
-
-// decodeUint reads an encoded unsigned integer from state.r.
-// Does not check for overflow.
-func (state *decoderState) decodeUint() (x uint64) {
-	b, err := state.b.ReadByte()
-	if err != nil {
-		error_(err)
-	}
-	if b <= 0x7f {
-		return uint64(b)
-	}
-	n := -int(int8(b))
-	if n > uint64Size {
-		error_(errBadUint)
-	}
-	width, err := state.b.Read(state.buf[0:n])
-	if err != nil {
-		error_(err)
-	}
-	// Don't need to check error; it's safe to loop regardless.
-	// Could check that the high byte is zero but it's not worth it.
-	for _, b := range state.buf[0:width] {
-		x = x<<8 | uint64(b)
-	}
-	return x
-}
-
-// decodeInt reads an encoded signed integer from state.r.
-// Does not check for overflow.
-func (state *decoderState) decodeInt() int64 {
-	x := state.decodeUint()
-	if x&1 != 0 {
-		return ^int64(x >> 1)
-	}
-	return int64(x >> 1)
-}
-
-// getLength decodes the next uint and makes sure it is a possible
-// size for a data item that follows, which means it must fit in a
-// non-negative int and fit in the buffer.
-func (state *decoderState) getLength() (int, bool) {
-	n := int(state.decodeUint())
-	if n < 0 || state.b.Len() < n || tooBig <= n {
-		return 0, false
-	}
-	return n, true
-}
-
-// decOp is the signature of a decoding operator for a given type.
-type decOp func(i *decInstr, state *decoderState, v reflect.Value)
-
-// The 'instructions' of the decoding machine
-type decInstr struct {
-	op    decOp
-	field int   // field number of the wire type
-	index []int // field access indices for destination type
-	ovfl  error // error message for overflow/underflow (for arrays, of the elements)
-}
-
-// ignoreUint discards a uint value with no destination.
-func ignoreUint(i *decInstr, state *decoderState, v reflect.Value) {
-	state.decodeUint()
-}
-
-// ignoreTwoUints discards a uint value with no destination. It's used to skip
-// complex values.
-func ignoreTwoUints(i *decInstr, state *decoderState, v reflect.Value) {
-	state.decodeUint()
-	state.decodeUint()
-}
-
-// Since the encoder writes no zeros, if we arrive at a decoder we have
-// a value to extract and store.  The field number has already been read
-// (it's how we knew to call this decoder).
-// Each decoder is responsible for handling any indirections associated
-// with the data structure.  If any pointer so reached is nil, allocation must
-// be done.
-
-// decAlloc takes a value and returns a settable value that can
-// be assigned to. If the value is a pointer, decAlloc guarantees it points to storage.
-// The callers to the individual decoders are expected to have used decAlloc.
-// The individual decoders don't need to it.
-func decAlloc(v reflect.Value) reflect.Value {
-	for v.Kind() == reflect.Ptr {
-		if v.IsNil() {
-			v.Set(reflect.New(v.Type().Elem()))
-		}
-		v = v.Elem()
-	}
-	return v
-}
-
-// decBool decodes a uint and stores it as a boolean in value.
-func decBool(i *decInstr, state *decoderState, value reflect.Value) {
-	value.SetBool(state.decodeUint() != 0)
-}
-
-// decInt8 decodes an integer and stores it as an int8 in value.
-func decInt8(i *decInstr, state *decoderState, value reflect.Value) {
-	v := state.decodeInt()
-	if v < math.MinInt8 || math.MaxInt8 < v {
-		error_(i.ovfl)
-	}
-	value.SetInt(v)
-}
-
-// decUint8 decodes an unsigned integer and stores it as a uint8 in value.
-func decUint8(i *decInstr, state *decoderState, value reflect.Value) {
-	v := state.decodeUint()
-	if math.MaxUint8 < v {
-		error_(i.ovfl)
-	}
-	value.SetUint(v)
-}
-
-// decInt16 decodes an integer and stores it as an int16 in value.
-func decInt16(i *decInstr, state *decoderState, value reflect.Value) {
-	v := state.decodeInt()
-	if v < math.MinInt16 || math.MaxInt16 < v {
-		error_(i.ovfl)
-	}
-	value.SetInt(v)
-}
-
-// decUint16 decodes an unsigned integer and stores it as a uint16 in value.
-func decUint16(i *decInstr, state *decoderState, value reflect.Value) {
-	v := state.decodeUint()
-	if math.MaxUint16 < v {
-		error_(i.ovfl)
-	}
-	value.SetUint(v)
-}
-
-// decInt32 decodes an integer and stores it as an int32 in value.
-func decInt32(i *decInstr, state *decoderState, value reflect.Value) {
-	v := state.decodeInt()
-	if v < math.MinInt32 || math.MaxInt32 < v {
-		error_(i.ovfl)
-	}
-	value.SetInt(v)
-}
-
-// decUint32 decodes an unsigned integer and stores it as a uint32 in value.
-func decUint32(i *decInstr, state *decoderState, value reflect.Value) {
-	v := state.decodeUint()
-	if math.MaxUint32 < v {
-		error_(i.ovfl)
-	}
-	value.SetUint(v)
-}
-
-// decInt64 decodes an integer and stores it as an int64 in value.
-func decInt64(i *decInstr, state *decoderState, value reflect.Value) {
-	v := state.decodeInt()
-	value.SetInt(v)
-}
-
-// decUint64 decodes an unsigned integer and stores it as a uint64 in value.
-func decUint64(i *decInstr, state *decoderState, value reflect.Value) {
-	v := state.decodeUint()
-	value.SetUint(v)
-}
-
-// Floating-point numbers are transmitted as uint64s holding the bits
-// of the underlying representation.  They are sent byte-reversed, with
-// the exponent end coming out first, so integer floating point numbers
-// (for example) transmit more compactly.  This routine does the
-// unswizzling.
-func float64FromBits(u uint64) float64 {
-	var v uint64
-	for i := 0; i < 8; i++ {
-		v <<= 8
-		v |= u & 0xFF
-		u >>= 8
-	}
-	return math.Float64frombits(v)
-}
-
-// float32FromBits decodes an unsigned integer, treats it as a 32-bit floating-point
-// number, and returns it. It's a helper function for float32 and complex64.
-// It returns a float64 because that's what reflection needs, but its return
-// value is known to be accurately representable in a float32.
-func float32FromBits(u uint64, ovfl error) float64 {
-	v := float64FromBits(u)
-	av := v
-	if av < 0 {
-		av = -av
-	}
-	// +Inf is OK in both 32- and 64-bit floats.  Underflow is always OK.
-	if math.MaxFloat32 < av && av <= math.MaxFloat64 {
-		error_(ovfl)
-	}
-	return v
-}
-
-// decFloat32 decodes an unsigned integer, treats it as a 32-bit floating-point
-// number, and stores it in value.
-func decFloat32(i *decInstr, state *decoderState, value reflect.Value) {
-	value.SetFloat(float32FromBits(state.decodeUint(), i.ovfl))
-}
-
-// decFloat64 decodes an unsigned integer, treats it as a 64-bit floating-point
-// number, and stores it in value.
-func decFloat64(i *decInstr, state *decoderState, value reflect.Value) {
-	value.SetFloat(float64FromBits(state.decodeUint()))
-}
-
-// decComplex64 decodes a pair of unsigned integers, treats them as a
-// pair of floating point numbers, and stores them as a complex64 in value.
-// The real part comes first.
-func decComplex64(i *decInstr, state *decoderState, value reflect.Value) {
-	real := float32FromBits(state.decodeUint(), i.ovfl)
-	imag := float32FromBits(state.decodeUint(), i.ovfl)
-	value.SetComplex(complex(real, imag))
-}
-
-// decComplex128 decodes a pair of unsigned integers, treats them as a
-// pair of floating point numbers, and stores them as a complex128 in value.
-// The real part comes first.
-func decComplex128(i *decInstr, state *decoderState, value reflect.Value) {
-	real := float64FromBits(state.decodeUint())
-	imag := float64FromBits(state.decodeUint())
-	value.SetComplex(complex(real, imag))
-}
-
-// decUint8Slice decodes a byte slice and stores in value a slice header
-// describing the data.
-// uint8 slices are encoded as an unsigned count followed by the raw bytes.
-func decUint8Slice(i *decInstr, state *decoderState, value reflect.Value) {
-	n, ok := state.getLength()
-	if !ok {
-		errorf("bad %s slice length: %d", value.Type(), n)
-	}
-	if value.Cap() < n {
-		value.Set(reflect.MakeSlice(value.Type(), n, n))
-	} else {
-		value.Set(value.Slice(0, n))
-	}
-	if _, err := state.b.Read(value.Bytes()); err != nil {
-		errorf("error decoding []byte: %s", err)
-	}
-}
-
-// decString decodes byte array and stores in value a string header
-// describing the data.
-// Strings are encoded as an unsigned count followed by the raw bytes.
-func decString(i *decInstr, state *decoderState, value reflect.Value) {
-	n, ok := state.getLength()
-	if !ok {
-		errorf("bad %s slice length: %d", value.Type(), n)
-	}
-	// Read the data.
-	data := make([]byte, n)
-	if _, err := state.b.Read(data); err != nil {
-		errorf("error decoding string: %s", err)
-	}
-	value.SetString(string(data))
-}
-
-// ignoreUint8Array skips over the data for a byte slice value with no destination.
-func ignoreUint8Array(i *decInstr, state *decoderState, value reflect.Value) {
-	n, ok := state.getLength()
-	if !ok {
-		errorf("slice length too large")
-	}
-	b := make([]byte, n)
-	state.b.Read(b)
-}
-
-// Execution engine
-
-// The encoder engine is an array of instructions indexed by field number of the incoming
-// decoder.  It is executed with random access according to field number.
-type decEngine struct {
-	instr    []decInstr
-	numInstr int // the number of active instructions
-}
-
-// decodeSingle decodes a top-level value that is not a struct and stores it in value.
-// Such values are preceded by a zero, making them have the memory layout of a
-// struct field (although with an illegal field number).
-func (dec *Decoder) decodeSingle(engine *decEngine, ut *userTypeInfo, value reflect.Value) {
-	state := dec.newDecoderState(&dec.buf)
-	defer dec.freeDecoderState(state)
-	state.fieldnum = singletonField
-	if state.decodeUint() != 0 {
-		errorf("decode: corrupted data: non-zero delta for singleton")
-	}
-	instr := &engine.instr[singletonField]
-	instr.op(instr, state, value)
-}
-
-// decodeStruct decodes a top-level struct and stores it in value.
-// Indir is for the value, not the type.  At the time of the call it may
-// differ from ut.indir, which was computed when the engine was built.
-// This state cannot arise for decodeSingle, which is called directly
-// from the user's value, not from the innards of an engine.
-func (dec *Decoder) decodeStruct(engine *decEngine, ut *userTypeInfo, value reflect.Value) {
-	state := dec.newDecoderState(&dec.buf)
-	defer dec.freeDecoderState(state)
-	state.fieldnum = -1
-	for state.b.Len() > 0 {
-		delta := int(state.decodeUint())
-		if delta < 0 {
-			errorf("decode: corrupted data: negative delta")
-		}
-		if delta == 0 { // struct terminator is zero delta fieldnum
-			break
-		}
-		fieldnum := state.fieldnum + delta
-		if fieldnum >= len(engine.instr) {
-			error_(errRange)
-			break
-		}
-		instr := &engine.instr[fieldnum]
-		var field reflect.Value
-		if instr.index != nil {
-			// Otherwise the field is unknown to us and instr.op is an ignore op.
-			field = value.FieldByIndex(instr.index)
-			if field.Kind() == reflect.Ptr {
-				field = decAlloc(field)
-			}
-		}
-		instr.op(instr, state, field)
-		state.fieldnum = fieldnum
-	}
-}
-
-var noValue reflect.Value
-
-// ignoreStruct discards the data for a struct with no destination.
-func (dec *Decoder) ignoreStruct(engine *decEngine) {
-	state := dec.newDecoderState(&dec.buf)
-	defer dec.freeDecoderState(state)
-	state.fieldnum = -1
-	for state.b.Len() > 0 {
-		delta := int(state.decodeUint())
-		if delta < 0 {
-			errorf("ignore decode: corrupted data: negative delta")
-		}
-		if delta == 0 { // struct terminator is zero delta fieldnum
-			break
-		}
-		fieldnum := state.fieldnum + delta
-		if fieldnum >= len(engine.instr) {
-			error_(errRange)
-		}
-		instr := &engine.instr[fieldnum]
-		instr.op(instr, state, noValue)
-		state.fieldnum = fieldnum
-	}
-}
-
-// ignoreSingle discards the data for a top-level non-struct value with no
-// destination. It's used when calling Decode with a nil value.
-func (dec *Decoder) ignoreSingle(engine *decEngine) {
-	state := dec.newDecoderState(&dec.buf)
-	defer dec.freeDecoderState(state)
-	state.fieldnum = singletonField
-	delta := int(state.decodeUint())
-	if delta != 0 {
-		errorf("decode: corrupted data: non-zero delta for singleton")
-	}
-	instr := &engine.instr[singletonField]
-	instr.op(instr, state, noValue)
-}
-
-// decodeArrayHelper does the work for decoding arrays and slices.
-func (dec *Decoder) decodeArrayHelper(state *decoderState, value reflect.Value, elemOp decOp, length int, ovfl error, helper decHelper) {
-	if helper != nil && helper(state, value, length, ovfl) {
-		return
-	}
-	instr := &decInstr{elemOp, 0, nil, ovfl}
-	isPtr := value.Type().Elem().Kind() == reflect.Ptr
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding array or slice: length exceeds input size (%d elements)", length)
-		}
-		v := value.Index(i)
-		if isPtr {
-			v = decAlloc(v)
-		}
-		elemOp(instr, state, v)
-	}
-}
-
-// decodeArray decodes an array and stores it in value.
-// The length is an unsigned integer preceding the elements.  Even though the length is redundant
-// (it's part of the type), it's a useful check and is included in the encoding.
-func (dec *Decoder) decodeArray(atyp reflect.Type, state *decoderState, value reflect.Value, elemOp decOp, length int, ovfl error, helper decHelper) {
-	if n := state.decodeUint(); n != uint64(length) {
-		errorf("length mismatch in decodeArray")
-	}
-	dec.decodeArrayHelper(state, value, elemOp, length, ovfl, helper)
-}
-
-// decodeIntoValue is a helper for map decoding.
-func decodeIntoValue(state *decoderState, op decOp, isPtr bool, value reflect.Value, ovfl error) reflect.Value {
-	instr := &decInstr{op, 0, nil, ovfl}
-	v := value
-	if isPtr {
-		v = decAlloc(value)
-	}
-	op(instr, state, v)
-	return value
-}
-
-// decodeMap decodes a map and stores it in value.
-// Maps are encoded as a length followed by key:value pairs.
-// Because the internals of maps are not visible to us, we must
-// use reflection rather than pointer magic.
-func (dec *Decoder) decodeMap(mtyp reflect.Type, state *decoderState, value reflect.Value, keyOp, elemOp decOp, ovfl error) {
-	if value.IsNil() {
-		// Allocate map.
-		value.Set(reflect.MakeMap(mtyp))
-	}
-	n := int(state.decodeUint())
-	keyIsPtr := mtyp.Key().Kind() == reflect.Ptr
-	elemIsPtr := mtyp.Elem().Kind() == reflect.Ptr
-	for i := 0; i < n; i++ {
-		key := decodeIntoValue(state, keyOp, keyIsPtr, allocValue(mtyp.Key()), ovfl)
-		elem := decodeIntoValue(state, elemOp, elemIsPtr, allocValue(mtyp.Elem()), ovfl)
-		value.SetMapIndex(key, elem)
-	}
-}
-
-// ignoreArrayHelper does the work for discarding arrays and slices.
-func (dec *Decoder) ignoreArrayHelper(state *decoderState, elemOp decOp, length int) {
-	instr := &decInstr{elemOp, 0, nil, errors.New("no error")}
-	for i := 0; i < length; i++ {
-		if state.b.Len() == 0 {
-			errorf("decoding array or slice: length exceeds input size (%d elements)", length)
-		}
-		elemOp(instr, state, noValue)
-	}
-}
-
-// ignoreArray discards the data for an array value with no destination.
-func (dec *Decoder) ignoreArray(state *decoderState, elemOp decOp, length int) {
-	if n := state.decodeUint(); n != uint64(length) {
-		errorf("length mismatch in ignoreArray")
-	}
-	dec.ignoreArrayHelper(state, elemOp, length)
-}
-
-// ignoreMap discards the data for a map value with no destination.
-func (dec *Decoder) ignoreMap(state *decoderState, keyOp, elemOp decOp) {
-	n := int(state.decodeUint())
-	keyInstr := &decInstr{keyOp, 0, nil, errors.New("no error")}
-	elemInstr := &decInstr{elemOp, 0, nil, errors.New("no error")}
-	for i := 0; i < n; i++ {
-		keyOp(keyInstr, state, noValue)
-		elemOp(elemInstr, state, noValue)
-	}
-}
-
-// decodeSlice decodes a slice and stores it in value.
-// Slices are encoded as an unsigned length followed by the elements.
-func (dec *Decoder) decodeSlice(state *decoderState, value reflect.Value, elemOp decOp, ovfl error, helper decHelper) {
-	u := state.decodeUint()
-	typ := value.Type()
-	size := uint64(typ.Elem().Size())
-	nBytes := u * size
-	n := int(u)
-	// Take care with overflow in this calculation.
-	if n < 0 || uint64(n) != u || nBytes > tooBig || (size > 0 && nBytes/size != u) {
-		// We don't check n against buffer length here because if it's a slice
-		// of interfaces, there will be buffer reloads.
-		errorf("%s slice too big: %d elements of %d bytes", typ.Elem(), u, size)
-	}
-	if value.Cap() < n {
-		value.Set(reflect.MakeSlice(typ, n, n))
-	} else {
-		value.Set(value.Slice(0, n))
-	}
-	dec.decodeArrayHelper(state, value, elemOp, n, ovfl, helper)
-}
-
-// ignoreSlice skips over the data for a slice value with no destination.
-func (dec *Decoder) ignoreSlice(state *decoderState, elemOp decOp) {
-	dec.ignoreArrayHelper(state, elemOp, int(state.decodeUint()))
-}
-
-// decodeInterface decodes an interface value and stores it in value.
-// Interfaces are encoded as the name of a concrete type followed by a value.
-// If the name is empty, the value is nil and no value is sent.
-func (dec *Decoder) decodeInterface(ityp reflect.Type, state *decoderState, value reflect.Value) {
-	// Read the name of the concrete type.
-	nr := state.decodeUint()
-	if nr < 0 || nr > 1<<31 { // zero is permissible for anonymous types
-		errorf("invalid type name length %d", nr)
-	}
-	if nr > uint64(state.b.Len()) {
-		errorf("invalid type name length %d: exceeds input size", nr)
-	}
-	b := make([]byte, nr)
-	state.b.Read(b)
-	name := string(b)
-	// Allocate the destination interface value.
-	if name == "" {
-		// Copy the nil interface value to the target.
-		value.Set(reflect.Zero(value.Type()))
-		return
-	}
-	if len(name) > 1024 {
-		errorf("name too long (%d bytes): %.20q...", len(name), name)
-	}
-	// The concrete type must be registered.
-	registerLock.RLock()
-	typ, ok := nameToConcreteType[name]
-	registerLock.RUnlock()
-	if !ok {
-		errorf("name not registered for interface: %q", name)
-	}
-	// Read the type id of the concrete value.
-	concreteId := dec.decodeTypeSequence(true)
-	if concreteId < 0 {
-		error_(dec.err)
-	}
-	// Byte count of value is next; we don't care what it is (it's there
-	// in case we want to ignore the value by skipping it completely).
-	state.decodeUint()
-	// Read the concrete value.
-	v := allocValue(typ)
-	dec.decodeValue(concreteId, v)
-	if dec.err != nil {
-		error_(dec.err)
-	}
-	// Assign the concrete value to the interface.
-	// Tread carefully; it might not satisfy the interface.
-	if !typ.AssignableTo(ityp) {
-		errorf("%s is not assignable to type %s", typ, ityp)
-	}
-	// Copy the interface value to the target.
-	value.Set(v)
-}
-
-// ignoreInterface discards the data for an interface value with no destination.
-func (dec *Decoder) ignoreInterface(state *decoderState) {
-	// Read the name of the concrete type.
-	n, ok := state.getLength()
-	if !ok {
-		errorf("bad interface encoding: name too large for buffer")
-	}
-	b := make([]byte, n)
-	_, err := state.b.Read(b)
-	if err != nil {
-		error_(err)
-	}
-	id := dec.decodeTypeSequence(true)
-	if id < 0 {
-		error_(dec.err)
-	}
-	// At this point, the decoder buffer contains a delimited value. Just toss it.
-	n, ok = state.getLength()
-	if !ok {
-		errorf("bad interface encoding: data length too large for buffer")
-	}
-	state.b.Drop(n)
-}
-
-// decodeGobDecoder decodes something implementing the GobDecoder interface.
-// The data is encoded as a byte slice.
-func (dec *Decoder) decodeGobDecoder(ut *userTypeInfo, state *decoderState, value reflect.Value) {
-	// Read the bytes for the value.
-	n, ok := state.getLength()
-	if !ok {
-		errorf("GobDecoder: length too large for buffer")
-	}
-	b := make([]byte, n)
-	_, err := state.b.Read(b)
-	if err != nil {
-		error_(err)
-	}
-	// We know it's one of these.
-	switch ut.externalDec {
-	case xGob:
-		err = value.Interface().(GobDecoder).GobDecode(b)
-	case xBinary:
-		err = value.Interface().(encoding.BinaryUnmarshaler).UnmarshalBinary(b)
-	case xText:
-		err = value.Interface().(encoding.TextUnmarshaler).UnmarshalText(b)
-	}
-	if err != nil {
-		error_(err)
-	}
-}
-
-// ignoreGobDecoder discards the data for a GobDecoder value with no destination.
-func (dec *Decoder) ignoreGobDecoder(state *decoderState) {
-	// Read the bytes for the value.
-	n, ok := state.getLength()
-	if !ok {
-		errorf("GobDecoder: length too large for buffer")
-	}
-	b := make([]byte, n)
-	_, err := state.b.Read(b)
-	if err != nil {
-		error_(err)
-	}
-}
-
-// Index by Go types.
-var decOpTable = [...]decOp{
-	reflect.Bool:       decBool,
-	reflect.Int8:       decInt8,
-	reflect.Int16:      decInt16,
-	reflect.Int32:      decInt32,
-	reflect.Int64:      decInt64,
-	reflect.Uint8:      decUint8,
-	reflect.Uint16:     decUint16,
-	reflect.Uint32:     decUint32,
-	reflect.Uint64:     decUint64,
-	reflect.Float32:    decFloat32,
-	reflect.Float64:    decFloat64,
-	reflect.Complex64:  decComplex64,
-	reflect.Complex128: decComplex128,
-	reflect.String:     decString,
-}
-
-// Indexed by gob types.  tComplex will be added during type.init().
-var decIgnoreOpMap = map[typeId]decOp{
-	tBool:    ignoreUint,
-	tInt:     ignoreUint,
-	tUint:    ignoreUint,
-	tFloat:   ignoreUint,
-	tBytes:   ignoreUint8Array,
-	tString:  ignoreUint8Array,
-	tComplex: ignoreTwoUints,
-}
-
-// decOpFor returns the decoding op for the base type under rt and
-// the indirection count to reach it.
-func (dec *Decoder) decOpFor(wireId typeId, rt reflect.Type, name string, inProgress map[reflect.Type]*decOp) *decOp {
-	ut := userType(rt)
-	// If the type implements GobEncoder, we handle it without further processing.
-	if ut.externalDec != 0 {
-		return dec.gobDecodeOpFor(ut)
-	}
-
-	// If this type is already in progress, it's a recursive type (e.g. map[string]*T).
-	// Return the pointer to the op we're already building.
-	if opPtr := inProgress[rt]; opPtr != nil {
-		return opPtr
-	}
-	typ := ut.base
-	var op decOp
-	k := typ.Kind()
-	if int(k) < len(decOpTable) {
-		op = decOpTable[k]
-	}
-	if op == nil {
-		inProgress[rt] = &op
-		// Special cases
-		switch t := typ; t.Kind() {
-		case reflect.Array:
-			name = "element of " + name
-			elemId := dec.wireType[wireId].ArrayT.Elem
-			elemOp := dec.decOpFor(elemId, t.Elem(), name, inProgress)
-			ovfl := overflow(name)
-			helper := decArrayHelper[t.Elem().Kind()]
-			op = func(i *decInstr, state *decoderState, value reflect.Value) {
-				state.dec.decodeArray(t, state, value, *elemOp, t.Len(), ovfl, helper)
-			}
-
-		case reflect.Map:
-			keyId := dec.wireType[wireId].MapT.Key
-			elemId := dec.wireType[wireId].MapT.Elem
-			keyOp := dec.decOpFor(keyId, t.Key(), "key of "+name, inProgress)
-			elemOp := dec.decOpFor(elemId, t.Elem(), "element of "+name, inProgress)
-			ovfl := overflow(name)
-			op = func(i *decInstr, state *decoderState, value reflect.Value) {
-				state.dec.decodeMap(t, state, value, *keyOp, *elemOp, ovfl)
-			}
-
-		case reflect.Slice:
-			name = "element of " + name
-			if t.Elem().Kind() == reflect.Uint8 {
-				op = decUint8Slice
-				break
-			}
-			var elemId typeId
-			if tt, ok := builtinIdToType[wireId]; ok {
-				elemId = tt.(*sliceType).Elem
-			} else {
-				elemId = dec.wireType[wireId].SliceT.Elem
-			}
-			elemOp := dec.decOpFor(elemId, t.Elem(), name, inProgress)
-			ovfl := overflow(name)
-			helper := decSliceHelper[t.Elem().Kind()]
-			op = func(i *decInstr, state *decoderState, value reflect.Value) {
-				state.dec.decodeSlice(state, value, *elemOp, ovfl, helper)
-			}
-
-		case reflect.Struct:
-			// Generate a closure that calls out to the engine for the nested type.
-			ut := userType(typ)
-			enginePtr, err := dec.getDecEnginePtr(wireId, ut)
-			if err != nil {
-				error_(err)
-			}
-			op = func(i *decInstr, state *decoderState, value reflect.Value) {
-				// indirect through enginePtr to delay evaluation for recursive structs.
-				dec.decodeStruct(*enginePtr, ut, value)
-			}
-		case reflect.Interface:
-			op = func(i *decInstr, state *decoderState, value reflect.Value) {
-				state.dec.decodeInterface(t, state, value)
-			}
-		}
-	}
-	if op == nil {
-		errorf("decode can't handle type %s", rt)
-	}
-	return &op
-}
-
-// decIgnoreOpFor returns the decoding op for a field that has no destination.
-func (dec *Decoder) decIgnoreOpFor(wireId typeId, inProgress map[typeId]*decOp) *decOp {
-	// If this type is already in progress, it's a recursive type (e.g. map[string]*T).
-	// Return the pointer to the op we're already building.
-	if opPtr := inProgress[wireId]; opPtr != nil {
-		return opPtr
-	}
-	op, ok := decIgnoreOpMap[wireId]
-	if !ok {
-		inProgress[wireId] = &op
-		if wireId == tInterface {
-			// Special case because it's a method: the ignored item might
-			// define types and we need to record their state in the decoder.
-			op = func(i *decInstr, state *decoderState, value reflect.Value) {
-				state.dec.ignoreInterface(state)
-			}
-			return &op
-		}
-		// Special cases
-		wire := dec.wireType[wireId]
-		switch {
-		case wire == nil:
-			errorf("bad data: undefined type %s", wireId.string())
-		case wire.ArrayT != nil:
-			elemId := wire.ArrayT.Elem
-			elemOp := dec.decIgnoreOpFor(elemId, inProgress)
-			op = func(i *decInstr, state *decoderState, value reflect.Value) {
-				state.dec.ignoreArray(state, *elemOp, wire.ArrayT.Len)
-			}
-
-		case wire.MapT != nil:
-			keyId := dec.wireType[wireId].MapT.Key
-			elemId := dec.wireType[wireId].MapT.Elem
-			keyOp := dec.decIgnoreOpFor(keyId, inProgress)
-			elemOp := dec.decIgnoreOpFor(elemId, inProgress)
-			op = func(i *decInstr, state *decoderState, value reflect.Value) {
-				state.dec.ignoreMap(state, *keyOp, *elemOp)
-			}
-
-		case wire.SliceT != nil:
-			elemId := wire.SliceT.Elem
-			elemOp := dec.decIgnoreOpFor(elemId, inProgress)
-			op = func(i *decInstr, state *decoderState, value reflect.Value) {
-				state.dec.ignoreSlice(state, *elemOp)
-			}
-
-		case wire.StructT != nil:
-			// Generate a closure that calls out to the engine for the nested type.
-			enginePtr, err := dec.getIgnoreEnginePtr(wireId)
-			if err != nil {
-				error_(err)
-			}
-			op = func(i *decInstr, state *decoderState, value reflect.Value) {
-				// indirect through enginePtr to delay evaluation for recursive structs
-				state.dec.ignoreStruct(*enginePtr)
-			}
-
-		case wire.GobEncoderT != nil, wire.BinaryMarshalerT != nil, wire.TextMarshalerT != nil:
-			op = func(i *decInstr, state *decoderState, value reflect.Value) {
-				state.dec.ignoreGobDecoder(state)
-			}
-		}
-	}
-	if op == nil {
-		errorf("bad data: ignore can't handle type %s", wireId.string())
-	}
-	return &op
-}
-
-// gobDecodeOpFor returns the op for a type that is known to implement
-// GobDecoder.
-func (dec *Decoder) gobDecodeOpFor(ut *userTypeInfo) *decOp {
-	rcvrType := ut.user
-	if ut.decIndir == -1 {
-		rcvrType = reflect.PtrTo(rcvrType)
-	} else if ut.decIndir > 0 {
-		for i := int8(0); i < ut.decIndir; i++ {
-			rcvrType = rcvrType.Elem()
-		}
-	}
-	var op decOp
-	op = func(i *decInstr, state *decoderState, value reflect.Value) {
-		// We now have the base type. We need its address if the receiver is a pointer.
-		if value.Kind() != reflect.Ptr && rcvrType.Kind() == reflect.Ptr {
-			value = value.Addr()
-		}
-		state.dec.decodeGobDecoder(ut, state, value)
-	}
-	return &op
-}
-
-// compatibleType asks: Are these two gob Types compatible?
-// Answers the question for basic types, arrays, maps and slices, plus
-// GobEncoder/Decoder pairs.
-// Structs are considered ok; fields will be checked later.
-func (dec *Decoder) compatibleType(fr reflect.Type, fw typeId, inProgress map[reflect.Type]typeId) bool {
-	if rhs, ok := inProgress[fr]; ok {
-		return rhs == fw
-	}
-	inProgress[fr] = fw
-	ut := userType(fr)
-	wire, ok := dec.wireType[fw]
-	// If wire was encoded with an encoding method, fr must have that method.
-	// And if not, it must not.
-	// At most one of the booleans in ut is set.
-	// We could possibly relax this constraint in the future in order to
-	// choose the decoding method using the data in the wireType.
-	// The parentheses look odd but are correct.
-	if (ut.externalDec == xGob) != (ok && wire.GobEncoderT != nil) ||
-		(ut.externalDec == xBinary) != (ok && wire.BinaryMarshalerT != nil) ||
-		(ut.externalDec == xText) != (ok && wire.TextMarshalerT != nil) {
-		return false
-	}
-	if ut.externalDec != 0 { // This test trumps all others.
-		return true
-	}
-	switch t := ut.base; t.Kind() {
-	default:
-		// chan, etc: cannot handle.
-		return false
-	case reflect.Bool:
-		return fw == tBool
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return fw == tInt
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		return fw == tUint
-	case reflect.Float32, reflect.Float64:
-		return fw == tFloat
-	case reflect.Complex64, reflect.Complex128:
-		return fw == tComplex
-	case reflect.String:
-		return fw == tString
-	case reflect.Interface:
-		return fw == tInterface
-	case reflect.Array:
-		if !ok || wire.ArrayT == nil {
-			return false
-		}
-		array := wire.ArrayT
-		return t.Len() == array.Len && dec.compatibleType(t.Elem(), array.Elem, inProgress)
-	case reflect.Map:
-		if !ok || wire.MapT == nil {
-			return false
-		}
-		MapType := wire.MapT
-		return dec.compatibleType(t.Key(), MapType.Key, inProgress) && dec.compatibleType(t.Elem(), MapType.Elem, inProgress)
-	case reflect.Slice:
-		// Is it an array of bytes?
-		if t.Elem().Kind() == reflect.Uint8 {
-			return fw == tBytes
-		}
-		// Extract and compare element types.
-		var sw *sliceType
-		if tt, ok := builtinIdToType[fw]; ok {
-			sw, _ = tt.(*sliceType)
-		} else if wire != nil {
-			sw = wire.SliceT
-		}
-		elem := userType(t.Elem()).base
-		return sw != nil && dec.compatibleType(elem, sw.Elem, inProgress)
-	case reflect.Struct:
-		return true
-	}
-}
-
-// typeString returns a human-readable description of the type identified by remoteId.
-func (dec *Decoder) typeString(remoteId typeId) string {
-	if t := idToType[remoteId]; t != nil {
-		// globally known type.
-		return t.string()
-	}
-	return dec.wireType[remoteId].string()
-}
-
-// compileSingle compiles the decoder engine for a non-struct top-level value, including
-// GobDecoders.
-func (dec *Decoder) compileSingle(remoteId typeId, ut *userTypeInfo) (engine *decEngine, err error) {
-	rt := ut.user
-	engine = new(decEngine)
-	engine.instr = make([]decInstr, 1) // one item
-	name := rt.String()                // best we can do
-	if !dec.compatibleType(rt, remoteId, make(map[reflect.Type]typeId)) {
-		remoteType := dec.typeString(remoteId)
-		// Common confusing case: local interface type, remote concrete type.
-		if ut.base.Kind() == reflect.Interface && remoteId != tInterface {
-			return nil, errors.New("gob: local interface type " + name + " can only be decoded from remote interface type; received concrete type " + remoteType)
-		}
-		return nil, errors.New("gob: decoding into local type " + name + ", received remote type " + remoteType)
-	}
-	op := dec.decOpFor(remoteId, rt, name, make(map[reflect.Type]*decOp))
-	ovfl := errors.New(`value for "` + name + `" out of range`)
-	engine.instr[singletonField] = decInstr{*op, singletonField, nil, ovfl}
-	engine.numInstr = 1
-	return
-}
-
-// compileIgnoreSingle compiles the decoder engine for a non-struct top-level value that will be discarded.
-func (dec *Decoder) compileIgnoreSingle(remoteId typeId) (engine *decEngine, err error) {
-	engine = new(decEngine)
-	engine.instr = make([]decInstr, 1) // one item
-	op := dec.decIgnoreOpFor(remoteId, make(map[typeId]*decOp))
-	ovfl := overflow(dec.typeString(remoteId))
-	engine.instr[0] = decInstr{*op, 0, nil, ovfl}
-	engine.numInstr = 1
-	return
-}
-
-// compileDec compiles the decoder engine for a value.  If the value is not a struct,
-// it calls out to compileSingle.
-func (dec *Decoder) compileDec(remoteId typeId, ut *userTypeInfo) (engine *decEngine, err error) {
-	defer catchError(&err)
-	rt := ut.base
-	srt := rt
-	if srt.Kind() != reflect.Struct || ut.externalDec != 0 {
-		return dec.compileSingle(remoteId, ut)
-	}
-	var wireStruct *structType
-	// Builtin types can come from global pool; the rest must be defined by the decoder.
-	// Also we know we're decoding a struct now, so the client must have sent one.
-	if t, ok := builtinIdToType[remoteId]; ok {
-		wireStruct, _ = t.(*structType)
-	} else {
-		wire := dec.wireType[remoteId]
-		if wire == nil {
-			error_(errBadType)
-		}
-		wireStruct = wire.StructT
-	}
-	if wireStruct == nil {
-		errorf("type mismatch in decoder: want struct type %s; got non-struct", rt)
-	}
-	engine = new(decEngine)
-	engine.instr = make([]decInstr, len(wireStruct.Field))
-	seen := make(map[reflect.Type]*decOp)
-	// Loop over the fields of the wire type.
-	for fieldnum := 0; fieldnum < len(wireStruct.Field); fieldnum++ {
-		wireField := wireStruct.Field[fieldnum]
-		if wireField.Name == "" {
-			errorf("empty name for remote field of type %s", wireStruct.Name)
-		}
-		ovfl := overflow(wireField.Name)
-		// Find the field of the local type with the same name.
-		localField, present := srt.FieldByName(wireField.Name)
-		// TODO(r): anonymous names
-		if !present || !isExported(wireField.Name) {
-			op := dec.decIgnoreOpFor(wireField.Id, make(map[typeId]*decOp))
-			engine.instr[fieldnum] = decInstr{*op, fieldnum, nil, ovfl}
-			continue
-		}
-		if !dec.compatibleType(localField.Type, wireField.Id, make(map[reflect.Type]typeId)) {
-			errorf("wrong type (%s) for received field %s.%s", localField.Type, wireStruct.Name, wireField.Name)
-		}
-		op := dec.decOpFor(wireField.Id, localField.Type, localField.Name, seen)
-		engine.instr[fieldnum] = decInstr{*op, fieldnum, localField.Index, ovfl}
-		engine.numInstr++
-	}
-	return
-}
-
-// getDecEnginePtr returns the engine for the specified type.
-func (dec *Decoder) getDecEnginePtr(remoteId typeId, ut *userTypeInfo) (enginePtr **decEngine, err error) {
-	rt := ut.user
-	decoderMap, ok := dec.decoderCache[rt]
-	if !ok {
-		decoderMap = make(map[typeId]**decEngine)
-		dec.decoderCache[rt] = decoderMap
-	}
-	if enginePtr, ok = decoderMap[remoteId]; !ok {
-		// To handle recursive types, mark this engine as underway before compiling.
-		enginePtr = new(*decEngine)
-		decoderMap[remoteId] = enginePtr
-		*enginePtr, err = dec.compileDec(remoteId, ut)
-		if err != nil {
-			delete(decoderMap, remoteId)
-		}
-	}
-	return
-}
-
-// emptyStruct is the type we compile into when ignoring a struct value.
-type emptyStruct struct{}
-
-var emptyStructType = reflect.TypeOf(emptyStruct{})
-
-// getIgnoreEnginePtr returns the engine for the specified type when the value is to be discarded.
-func (dec *Decoder) getIgnoreEnginePtr(wireId typeId) (enginePtr **decEngine, err error) {
-	var ok bool
-	if enginePtr, ok = dec.ignorerCache[wireId]; !ok {
-		// To handle recursive types, mark this engine as underway before compiling.
-		enginePtr = new(*decEngine)
-		dec.ignorerCache[wireId] = enginePtr
-		wire := dec.wireType[wireId]
-		if wire != nil && wire.StructT != nil {
-			*enginePtr, err = dec.compileDec(wireId, userType(emptyStructType))
-		} else {
-			*enginePtr, err = dec.compileIgnoreSingle(wireId)
-		}
-		if err != nil {
-			delete(dec.ignorerCache, wireId)
-		}
-	}
-	return
-}
-
-// decodeValue decodes the data stream representing a value and stores it in value.
-func (dec *Decoder) decodeValue(wireId typeId, value reflect.Value) {
-	defer catchError(&dec.err)
-	// If the value is nil, it means we should just ignore this item.
-	if !value.IsValid() {
-		dec.decodeIgnoredValue(wireId)
-		return
-	}
-	// Dereference down to the underlying type.
-	ut := userType(value.Type())
-	base := ut.base
-	var enginePtr **decEngine
-	enginePtr, dec.err = dec.getDecEnginePtr(wireId, ut)
-	if dec.err != nil {
-		return
-	}
-	value = decAlloc(value)
-	engine := *enginePtr
-	if st := base; st.Kind() == reflect.Struct && ut.externalDec == 0 {
-		wt := dec.wireType[wireId]
-		if engine.numInstr == 0 && st.NumField() > 0 &&
-			wt != nil && len(wt.StructT.Field) > 0 {
-			name := base.Name()
-			errorf("type mismatch: no fields matched compiling decoder for %s", name)
-		}
-		dec.decodeStruct(engine, ut, value)
-	} else {
-		dec.decodeSingle(engine, ut, value)
-	}
-}
-
-// decodeIgnoredValue decodes the data stream representing a value of the specified type and discards it.
-func (dec *Decoder) decodeIgnoredValue(wireId typeId) {
-	var enginePtr **decEngine
-	enginePtr, dec.err = dec.getIgnoreEnginePtr(wireId)
-	if dec.err != nil {
-		return
-	}
-	wire := dec.wireType[wireId]
-	if wire != nil && wire.StructT != nil {
-		dec.ignoreStruct(*enginePtr)
-	} else {
-		dec.ignoreSingle(*enginePtr)
-	}
-}
-
-func init() {
-	var iop, uop decOp
-	switch reflect.TypeOf(int(0)).Bits() {
-	case 32:
-		iop = decInt32
-		uop = decUint32
-	case 64:
-		iop = decInt64
-		uop = decUint64
-	default:
-		panic("gob: unknown size of int/uint")
-	}
-	decOpTable[reflect.Int] = iop
-	decOpTable[reflect.Uint] = uop
-
-	// Finally uintptr
-	switch reflect.TypeOf(uintptr(0)).Bits() {
-	case 32:
-		uop = decUint32
-	case 64:
-		uop = decUint64
-	default:
-		panic("gob: unknown size of uintptr")
-	}
-	decOpTable[reflect.Uintptr] = uop
-}
-
-// Gob depends on being able to take the address
-// of zeroed Values it creates, so use this wrapper instead
-// of the standard reflect.Zero.
-// Each call allocates once.
-func allocValue(t reflect.Type) reflect.Value {
-	return reflect.New(t).Elem()
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/decoder.go b/third_party/gofrontend/libgo/go/encoding/gob/decoder.go
deleted file mode 100644
index c453e9b..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/decoder.go
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gob
-
-import (
-	"bufio"
-	"errors"
-	"io"
-	"reflect"
-	"sync"
-)
-
-// tooBig provides a sanity check for sizes; used in several places.
-// Upper limit of 1GB, allowing room to grow a little without overflow.
-// TODO: make this adjustable?
-const tooBig = 1 << 30
-
-// A Decoder manages the receipt of type and data information read from the
-// remote side of a connection.
-type Decoder struct {
-	mutex        sync.Mutex                              // each item must be received atomically
-	r            io.Reader                               // source of the data
-	buf          decBuffer                               // buffer for more efficient i/o from r
-	wireType     map[typeId]*wireType                    // map from remote ID to local description
-	decoderCache map[reflect.Type]map[typeId]**decEngine // cache of compiled engines
-	ignorerCache map[typeId]**decEngine                  // ditto for ignored objects
-	freeList     *decoderState                           // list of free decoderStates; avoids reallocation
-	countBuf     []byte                                  // used for decoding integers while parsing messages
-	err          error
-}
-
-// NewDecoder returns a new decoder that reads from the io.Reader.
-// If r does not also implement io.ByteReader, it will be wrapped in a
-// bufio.Reader.
-func NewDecoder(r io.Reader) *Decoder {
-	dec := new(Decoder)
-	// We use the ability to read bytes as a plausible surrogate for buffering.
-	if _, ok := r.(io.ByteReader); !ok {
-		r = bufio.NewReader(r)
-	}
-	dec.r = r
-	dec.wireType = make(map[typeId]*wireType)
-	dec.decoderCache = make(map[reflect.Type]map[typeId]**decEngine)
-	dec.ignorerCache = make(map[typeId]**decEngine)
-	dec.countBuf = make([]byte, 9) // counts may be uint64s (unlikely!), require 9 bytes
-
-	return dec
-}
-
-// recvType loads the definition of a type.
-func (dec *Decoder) recvType(id typeId) {
-	// Have we already seen this type?  That's an error
-	if id < firstUserId || dec.wireType[id] != nil {
-		dec.err = errors.New("gob: duplicate type received")
-		return
-	}
-
-	// Type:
-	wire := new(wireType)
-	dec.decodeValue(tWireType, reflect.ValueOf(wire))
-	if dec.err != nil {
-		return
-	}
-	// Remember we've seen this type.
-	dec.wireType[id] = wire
-}
-
-var errBadCount = errors.New("invalid message length")
-
-// recvMessage reads the next count-delimited item from the input. It is the converse
-// of Encoder.writeMessage. It returns false on EOF or other error reading the message.
-func (dec *Decoder) recvMessage() bool {
-	// Read a count.
-	nbytes, _, err := decodeUintReader(dec.r, dec.countBuf)
-	if err != nil {
-		dec.err = err
-		return false
-	}
-	if nbytes >= tooBig {
-		dec.err = errBadCount
-		return false
-	}
-	dec.readMessage(int(nbytes))
-	return dec.err == nil
-}
-
-// readMessage reads the next nbytes bytes from the input.
-func (dec *Decoder) readMessage(nbytes int) {
-	if dec.buf.Len() != 0 {
-		// The buffer should always be empty now.
-		panic("non-empty decoder buffer")
-	}
-	// Read the data
-	dec.buf.Size(nbytes)
-	_, dec.err = io.ReadFull(dec.r, dec.buf.Bytes())
-	if dec.err != nil {
-		if dec.err == io.EOF {
-			dec.err = io.ErrUnexpectedEOF
-		}
-	}
-}
-
-// toInt turns an encoded uint64 into an int, according to the marshaling rules.
-func toInt(x uint64) int64 {
-	i := int64(x >> 1)
-	if x&1 != 0 {
-		i = ^i
-	}
-	return i
-}
-
-func (dec *Decoder) nextInt() int64 {
-	n, _, err := decodeUintReader(&dec.buf, dec.countBuf)
-	if err != nil {
-		dec.err = err
-	}
-	return toInt(n)
-}
-
-func (dec *Decoder) nextUint() uint64 {
-	n, _, err := decodeUintReader(&dec.buf, dec.countBuf)
-	if err != nil {
-		dec.err = err
-	}
-	return n
-}
-
-// decodeTypeSequence parses:
-// TypeSequence
-//	(TypeDefinition DelimitedTypeDefinition*)?
-// and returns the type id of the next value.  It returns -1 at
-// EOF.  Upon return, the remainder of dec.buf is the value to be
-// decoded.  If this is an interface value, it can be ignored by
-// resetting that buffer.
-func (dec *Decoder) decodeTypeSequence(isInterface bool) typeId {
-	for dec.err == nil {
-		if dec.buf.Len() == 0 {
-			if !dec.recvMessage() {
-				break
-			}
-		}
-		// Receive a type id.
-		id := typeId(dec.nextInt())
-		if id >= 0 {
-			// Value follows.
-			return id
-		}
-		// Type definition for (-id) follows.
-		dec.recvType(-id)
-		// When decoding an interface, after a type there may be a
-		// DelimitedValue still in the buffer.  Skip its count.
-		// (Alternatively, the buffer is empty and the byte count
-		// will be absorbed by recvMessage.)
-		if dec.buf.Len() > 0 {
-			if !isInterface {
-				dec.err = errors.New("extra data in buffer")
-				break
-			}
-			dec.nextUint()
-		}
-	}
-	return -1
-}
-
-// Decode reads the next value from the input stream and stores
-// it in the data represented by the empty interface value.
-// If e is nil, the value will be discarded. Otherwise,
-// the value underlying e must be a pointer to the
-// correct type for the next data item received.
-// If the input is at EOF, Decode returns io.EOF and
-// does not modify e.
-func (dec *Decoder) Decode(e interface{}) error {
-	if e == nil {
-		return dec.DecodeValue(reflect.Value{})
-	}
-	value := reflect.ValueOf(e)
-	// If e represents a value as opposed to a pointer, the answer won't
-	// get back to the caller.  Make sure it's a pointer.
-	if value.Type().Kind() != reflect.Ptr {
-		dec.err = errors.New("gob: attempt to decode into a non-pointer")
-		return dec.err
-	}
-	return dec.DecodeValue(value)
-}
-
-// DecodeValue reads the next value from the input stream.
-// If v is the zero reflect.Value (v.Kind() == Invalid), DecodeValue discards the value.
-// Otherwise, it stores the value into v.  In that case, v must represent
-// a non-nil pointer to data or be an assignable reflect.Value (v.CanSet())
-// If the input is at EOF, DecodeValue returns io.EOF and
-// does not modify v.
-func (dec *Decoder) DecodeValue(v reflect.Value) error {
-	if v.IsValid() {
-		if v.Kind() == reflect.Ptr && !v.IsNil() {
-			// That's okay, we'll store through the pointer.
-		} else if !v.CanSet() {
-			return errors.New("gob: DecodeValue of unassignable value")
-		}
-	}
-	// Make sure we're single-threaded through here.
-	dec.mutex.Lock()
-	defer dec.mutex.Unlock()
-
-	dec.buf.Reset() // In case data lingers from previous invocation.
-	dec.err = nil
-	id := dec.decodeTypeSequence(false)
-	if dec.err == nil {
-		dec.decodeValue(id, v)
-	}
-	return dec.err
-}
-
-// If debug.go is compiled into the program , debugFunc prints a human-readable
-// representation of the gob data read from r by calling that file's Debug function.
-// Otherwise it is nil.
-var debugFunc func(io.Reader)
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/doc.go b/third_party/gofrontend/libgo/go/encoding/gob/doc.go
deleted file mode 100644
index 4d3d007..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/doc.go
+++ /dev/null
@@ -1,386 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package gob manages streams of gobs - binary values exchanged between an
-Encoder (transmitter) and a Decoder (receiver).  A typical use is transporting
-arguments and results of remote procedure calls (RPCs) such as those provided by
-package "net/rpc".
-
-The implementation compiles a custom codec for each data type in the stream and
-is most efficient when a single Encoder is used to transmit a stream of values,
-amortizing the cost of compilation.
-
-Basics
-
-A stream of gobs is self-describing.  Each data item in the stream is preceded by
-a specification of its type, expressed in terms of a small set of predefined
-types.  Pointers are not transmitted, but the things they point to are
-transmitted; that is, the values are flattened.  Recursive types work fine, but
-recursive values (data with cycles) are problematic.  This may change.
-
-To use gobs, create an Encoder and present it with a series of data items as
-values or addresses that can be dereferenced to values.  The Encoder makes sure
-all type information is sent before it is needed.  At the receive side, a
-Decoder retrieves values from the encoded stream and unpacks them into local
-variables.
-
-Types and Values
-
-The source and destination values/types need not correspond exactly.  For structs,
-fields (identified by name) that are in the source but absent from the receiving
-variable will be ignored.  Fields that are in the receiving variable but missing
-from the transmitted type or value will be ignored in the destination.  If a field
-with the same name is present in both, their types must be compatible. Both the
-receiver and transmitter will do all necessary indirection and dereferencing to
-convert between gobs and actual Go values.  For instance, a gob type that is
-schematically,
-
-	struct { A, B int }
-
-can be sent from or received into any of these Go types:
-
-	struct { A, B int }	// the same
-	*struct { A, B int }	// extra indirection of the struct
-	struct { *A, **B int }	// extra indirection of the fields
-	struct { A, B int64 }	// different concrete value type; see below
-
-It may also be received into any of these:
-
-	struct { A, B int }	// the same
-	struct { B, A int }	// ordering doesn't matter; matching is by name
-	struct { A, B, C int }	// extra field (C) ignored
-	struct { B int }	// missing field (A) ignored; data will be dropped
-	struct { B, C int }	// missing field (A) ignored; extra field (C) ignored.
-
-Attempting to receive into these types will draw a decode error:
-
-	struct { A int; B uint }	// change of signedness for B
-	struct { A int; B float }	// change of type for B
-	struct { }			// no field names in common
-	struct { C, D int }		// no field names in common
-
-Integers are transmitted two ways: arbitrary precision signed integers or
-arbitrary precision unsigned integers.  There is no int8, int16 etc.
-discrimination in the gob format; there are only signed and unsigned integers.  As
-described below, the transmitter sends the value in a variable-length encoding;
-the receiver accepts the value and stores it in the destination variable.
-Floating-point numbers are always sent using IEEE-754 64-bit precision (see
-below).
-
-Signed integers may be received into any signed integer variable: int, int16, etc.;
-unsigned integers may be received into any unsigned integer variable; and floating
-point values may be received into any floating point variable.  However,
-the destination variable must be able to represent the value or the decode
-operation will fail.
-
-Structs, arrays and slices are also supported. Structs encode and decode only
-exported fields. Strings and arrays of bytes are supported with a special,
-efficient representation (see below). When a slice is decoded, if the existing
-slice has capacity the slice will be extended in place; if not, a new array is
-allocated. Regardless, the length of the resulting slice reports the number of
-elements decoded.
-
-Functions and channels will not be sent in a gob. Attempting to encode such a value
-at the top level will fail. A struct field of chan or func type is treated exactly
-like an unexported field and is ignored.
-
-Gob can encode a value of any type implementing the GobEncoder or
-encoding.BinaryMarshaler interfaces by calling the corresponding method,
-in that order of preference.
-
-Gob can decode a value of any type implementing the GobDecoder or
-encoding.BinaryUnmarshaler interfaces by calling the corresponding method,
-again in that order of preference.
-
-Encoding Details
-
-This section documents the encoding, details that are not important for most
-users. Details are presented bottom-up.
-
-An unsigned integer is sent one of two ways.  If it is less than 128, it is sent
-as a byte with that value.  Otherwise it is sent as a minimal-length big-endian
-(high byte first) byte stream holding the value, preceded by one byte holding the
-byte count, negated.  Thus 0 is transmitted as (00), 7 is transmitted as (07) and
-256 is transmitted as (FE 01 00).
-
-A boolean is encoded within an unsigned integer: 0 for false, 1 for true.
-
-A signed integer, i, is encoded within an unsigned integer, u.  Within u, bits 1
-upward contain the value; bit 0 says whether they should be complemented upon
-receipt.  The encode algorithm looks like this:
-
-	var u uint
-	if i < 0 {
-		u = (^uint(i) << 1) | 1 // complement i, bit 0 is 1
-	} else {
-		u = (uint(i) << 1) // do not complement i, bit 0 is 0
-	}
-	encodeUnsigned(u)
-
-The low bit is therefore analogous to a sign bit, but making it the complement bit
-instead guarantees that the largest negative integer is not a special case.  For
-example, -129=^128=(^256>>1) encodes as (FE 01 01).
-
-Floating-point numbers are always sent as a representation of a float64 value.
-That value is converted to a uint64 using math.Float64bits.  The uint64 is then
-byte-reversed and sent as a regular unsigned integer.  The byte-reversal means the
-exponent and high-precision part of the mantissa go first.  Since the low bits are
-often zero, this can save encoding bytes.  For instance, 17.0 is encoded in only
-three bytes (FE 31 40).
-
-Strings and slices of bytes are sent as an unsigned count followed by that many
-uninterpreted bytes of the value.
-
-All other slices and arrays are sent as an unsigned count followed by that many
-elements using the standard gob encoding for their type, recursively.
-
-Maps are sent as an unsigned count followed by that many key, element
-pairs. Empty but non-nil maps are sent, so if the receiver has not allocated
-one already, one will always be allocated on receipt unless the transmitted map
-is nil and not at the top level.
-
-Structs are sent as a sequence of (field number, field value) pairs.  The field
-value is sent using the standard gob encoding for its type, recursively.  If a
-field has the zero value for its type, it is omitted from the transmission.  The
-field number is defined by the type of the encoded struct: the first field of the
-encoded type is field 0, the second is field 1, etc.  When encoding a value, the
-field numbers are delta encoded for efficiency and the fields are always sent in
-order of increasing field number; the deltas are therefore unsigned.  The
-initialization for the delta encoding sets the field number to -1, so an unsigned
-integer field 0 with value 7 is transmitted as unsigned delta = 1, unsigned value
-= 7 or (01 07).  Finally, after all the fields have been sent a terminating mark
-denotes the end of the struct.  That mark is a delta=0 value, which has
-representation (00).
-
-Interface types are not checked for compatibility; all interface types are
-treated, for transmission, as members of a single "interface" type, analogous to
-int or []byte - in effect they're all treated as interface{}.  Interface values
-are transmitted as a string identifying the concrete type being sent (a name
-that must be pre-defined by calling Register), followed by a byte count of the
-length of the following data (so the value can be skipped if it cannot be
-stored), followed by the usual encoding of concrete (dynamic) value stored in
-the interface value.  (A nil interface value is identified by the empty string
-and transmits no value.) Upon receipt, the decoder verifies that the unpacked
-concrete item satisfies the interface of the receiving variable.
-
-The representation of types is described below.  When a type is defined on a given
-connection between an Encoder and Decoder, it is assigned a signed integer type
-id.  When Encoder.Encode(v) is called, it makes sure there is an id assigned for
-the type of v and all its elements and then it sends the pair (typeid, encoded-v)
-where typeid is the type id of the encoded type of v and encoded-v is the gob
-encoding of the value v.
-
-To define a type, the encoder chooses an unused, positive type id and sends the
-pair (-type id, encoded-type) where encoded-type is the gob encoding of a wireType
-description, constructed from these types:
-
-	type wireType struct {
-		ArrayT  *ArrayType
-		SliceT  *SliceType
-		StructT *StructType
-		MapT    *MapType
-	}
-	type arrayType struct {
-		CommonType
-		Elem typeId
-		Len  int
-	}
-	type CommonType struct {
-		Name string // the name of the struct type
-		Id  int    // the id of the type, repeated so it's inside the type
-	}
-	type sliceType struct {
-		CommonType
-		Elem typeId
-	}
-	type structType struct {
-		CommonType
-		Field []*fieldType // the fields of the struct.
-	}
-	type fieldType struct {
-		Name string // the name of the field.
-		Id   int    // the type id of the field, which must be already defined
-	}
-	type mapType struct {
-		CommonType
-		Key  typeId
-		Elem typeId
-	}
-
-If there are nested type ids, the types for all inner type ids must be defined
-before the top-level type id is used to describe an encoded-v.
-
-For simplicity in setup, the connection is defined to understand these types a
-priori, as well as the basic gob types int, uint, etc.  Their ids are:
-
-	bool        1
-	int         2
-	uint        3
-	float       4
-	[]byte      5
-	string      6
-	complex     7
-	interface   8
-	// gap for reserved ids.
-	WireType    16
-	ArrayType   17
-	CommonType  18
-	SliceType   19
-	StructType  20
-	FieldType   21
-	// 22 is slice of fieldType.
-	MapType     23
-
-Finally, each message created by a call to Encode is preceded by an encoded
-unsigned integer count of the number of bytes remaining in the message.  After
-the initial type name, interface values are wrapped the same way; in effect, the
-interface value acts like a recursive invocation of Encode.
-
-In summary, a gob stream looks like
-
-	(byteCount (-type id, encoding of a wireType)* (type id, encoding of a value))*
-
-where * signifies zero or more repetitions and the type id of a value must
-be predefined or be defined before the value in the stream.
-
-See "Gobs of data" for a design discussion of the gob wire format:
-https://blog.golang.org/gobs-of-data
-*/
-package gob
-
-/*
-Grammar:
-
-Tokens starting with a lower case letter are terminals; int(n)
-and uint(n) represent the signed/unsigned encodings of the value n.
-
-GobStream:
-	DelimitedMessage*
-DelimitedMessage:
-	uint(lengthOfMessage) Message
-Message:
-	TypeSequence TypedValue
-TypeSequence
-	(TypeDefinition DelimitedTypeDefinition*)?
-DelimitedTypeDefinition:
-	uint(lengthOfTypeDefinition) TypeDefinition
-TypedValue:
-	int(typeId) Value
-TypeDefinition:
-	int(-typeId) encodingOfWireType
-Value:
-	SingletonValue | StructValue
-SingletonValue:
-	uint(0) FieldValue
-FieldValue:
-	builtinValue | ArrayValue | MapValue | SliceValue | StructValue | InterfaceValue
-InterfaceValue:
-	NilInterfaceValue | NonNilInterfaceValue
-NilInterfaceValue:
-	uint(0)
-NonNilInterfaceValue:
-	ConcreteTypeName TypeSequence InterfaceContents
-ConcreteTypeName:
-	uint(lengthOfName) [already read=n] name
-InterfaceContents:
-	int(concreteTypeId) DelimitedValue
-DelimitedValue:
-	uint(length) Value
-ArrayValue:
-	uint(n) FieldValue*n [n elements]
-MapValue:
-	uint(n) (FieldValue FieldValue)*n  [n (key, value) pairs]
-SliceValue:
-	uint(n) FieldValue*n [n elements]
-StructValue:
-	(uint(fieldDelta) FieldValue)*
-*/
-
-/*
-For implementers and the curious, here is an encoded example.  Given
-	type Point struct {X, Y int}
-and the value
-	p := Point{22, 33}
-the bytes transmitted that encode p will be:
-	1f ff 81 03 01 01 05 50 6f 69 6e 74 01 ff 82 00
-	01 02 01 01 58 01 04 00 01 01 59 01 04 00 00 00
-	07 ff 82 01 2c 01 42 00
-They are determined as follows.
-
-Since this is the first transmission of type Point, the type descriptor
-for Point itself must be sent before the value.  This is the first type
-we've sent on this Encoder, so it has type id 65 (0 through 64 are
-reserved).
-
-	1f	// This item (a type descriptor) is 31 bytes long.
-	ff 81	// The negative of the id for the type we're defining, -65.
-		// This is one byte (indicated by FF = -1) followed by
-		// ^-65<<1 | 1.  The low 1 bit signals to complement the
-		// rest upon receipt.
-
-	// Now we send a type descriptor, which is itself a struct (wireType).
-	// The type of wireType itself is known (it's built in, as is the type of
-	// all its components), so we just need to send a *value* of type wireType
-	// that represents type "Point".
-	// Here starts the encoding of that value.
-	// Set the field number implicitly to -1; this is done at the beginning
-	// of every struct, including nested structs.
-	03	// Add 3 to field number; now 2 (wireType.structType; this is a struct).
-		// structType starts with an embedded CommonType, which appears
-		// as a regular structure here too.
-	01	// add 1 to field number (now 0); start of embedded CommonType.
-	01	// add 1 to field number (now 0, the name of the type)
-	05	// string is (unsigned) 5 bytes long
-	50 6f 69 6e 74	// wireType.structType.CommonType.name = "Point"
-	01	// add 1 to field number (now 1, the id of the type)
-	ff 82	// wireType.structType.CommonType._id = 65
-	00	// end of embedded wiretype.structType.CommonType struct
-	01	// add 1 to field number (now 1, the field array in wireType.structType)
-	02	// There are two fields in the type (len(structType.field))
-	01	// Start of first field structure; add 1 to get field number 0: field[0].name
-	01	// 1 byte
-	58	// structType.field[0].name = "X"
-	01	// Add 1 to get field number 1: field[0].id
-	04	// structType.field[0].typeId is 2 (signed int).
-	00	// End of structType.field[0]; start structType.field[1]; set field number to -1.
-	01	// Add 1 to get field number 0: field[1].name
-	01	// 1 byte
-	59	// structType.field[1].name = "Y"
-	01	// Add 1 to get field number 1: field[1].id
-	04	// struct.Type.field[1].typeId is 2 (signed int).
-	00	// End of structType.field[1]; end of structType.field.
-	00	// end of wireType.structType structure
-	00	// end of wireType structure
-
-Now we can send the Point value.  Again the field number resets to -1:
-
-	07	// this value is 7 bytes long
-	ff 82	// the type number, 65 (1 byte (-FF) followed by 65<<1)
-	01	// add one to field number, yielding field 0
-	2c	// encoding of signed "22" (0x22 = 44 = 22<<1); Point.x = 22
-	01	// add one to field number, yielding field 1
-	42	// encoding of signed "33" (0x42 = 66 = 33<<1); Point.y = 33
-	00	// end of structure
-
-The type encoding is long and fairly intricate but we send it only once.
-If p is transmitted a second time, the type is already known so the
-output will be just:
-
-	07 ff 82 01 2c 01 42 00
-
-A single non-struct value at top level is transmitted like a field with
-delta tag 0.  For instance, a signed integer with value 3 presented as
-the argument to Encode will emit:
-
-	03 04 00 06
-
-Which represents:
-
-	03	// this value is 3 bytes long
-	04	// the type number, 2, represents an integer
-	00	// tag delta 0
-	06	// value 3
-
-*/
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/dump.go b/third_party/gofrontend/libgo/go/encoding/gob/dump.go
deleted file mode 100644
index 17238c9..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/dump.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package main
-
-// Need to compile package gob with debug.go to build this program.
-// See comments in debug.go for how to do this.
-
-import (
-	"encoding/gob"
-	"fmt"
-	"os"
-)
-
-func main() {
-	var err error
-	file := os.Stdin
-	if len(os.Args) > 1 {
-		file, err = os.Open(os.Args[1])
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "dump: %s\n", err)
-			os.Exit(1)
-		}
-	}
-	gob.Debug(file)
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/enc_helpers.go b/third_party/gofrontend/libgo/go/encoding/gob/enc_helpers.go
deleted file mode 100644
index 804e539..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/enc_helpers.go
+++ /dev/null
@@ -1,414 +0,0 @@
-// Created by encgen --output enc_helpers.go; DO NOT EDIT
-
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gob
-
-import (
-	"reflect"
-)
-
-var encArrayHelper = map[reflect.Kind]encHelper{
-	reflect.Bool:       encBoolArray,
-	reflect.Complex64:  encComplex64Array,
-	reflect.Complex128: encComplex128Array,
-	reflect.Float32:    encFloat32Array,
-	reflect.Float64:    encFloat64Array,
-	reflect.Int:        encIntArray,
-	reflect.Int16:      encInt16Array,
-	reflect.Int32:      encInt32Array,
-	reflect.Int64:      encInt64Array,
-	reflect.Int8:       encInt8Array,
-	reflect.String:     encStringArray,
-	reflect.Uint:       encUintArray,
-	reflect.Uint16:     encUint16Array,
-	reflect.Uint32:     encUint32Array,
-	reflect.Uint64:     encUint64Array,
-	reflect.Uintptr:    encUintptrArray,
-}
-
-var encSliceHelper = map[reflect.Kind]encHelper{
-	reflect.Bool:       encBoolSlice,
-	reflect.Complex64:  encComplex64Slice,
-	reflect.Complex128: encComplex128Slice,
-	reflect.Float32:    encFloat32Slice,
-	reflect.Float64:    encFloat64Slice,
-	reflect.Int:        encIntSlice,
-	reflect.Int16:      encInt16Slice,
-	reflect.Int32:      encInt32Slice,
-	reflect.Int64:      encInt64Slice,
-	reflect.Int8:       encInt8Slice,
-	reflect.String:     encStringSlice,
-	reflect.Uint:       encUintSlice,
-	reflect.Uint16:     encUint16Slice,
-	reflect.Uint32:     encUint32Slice,
-	reflect.Uint64:     encUint64Slice,
-	reflect.Uintptr:    encUintptrSlice,
-}
-
-func encBoolArray(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encBoolSlice(state, v.Slice(0, v.Len()))
-}
-
-func encBoolSlice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]bool)
-	if !ok {
-		// It is kind bool but not type bool. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != false || state.sendZero {
-			if x {
-				state.encodeUint(1)
-			} else {
-				state.encodeUint(0)
-			}
-		}
-	}
-	return true
-}
-
-func encComplex64Array(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encComplex64Slice(state, v.Slice(0, v.Len()))
-}
-
-func encComplex64Slice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]complex64)
-	if !ok {
-		// It is kind complex64 but not type complex64. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0+0i || state.sendZero {
-			rpart := floatBits(float64(real(x)))
-			ipart := floatBits(float64(imag(x)))
-			state.encodeUint(rpart)
-			state.encodeUint(ipart)
-		}
-	}
-	return true
-}
-
-func encComplex128Array(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encComplex128Slice(state, v.Slice(0, v.Len()))
-}
-
-func encComplex128Slice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]complex128)
-	if !ok {
-		// It is kind complex128 but not type complex128. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0+0i || state.sendZero {
-			rpart := floatBits(real(x))
-			ipart := floatBits(imag(x))
-			state.encodeUint(rpart)
-			state.encodeUint(ipart)
-		}
-	}
-	return true
-}
-
-func encFloat32Array(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encFloat32Slice(state, v.Slice(0, v.Len()))
-}
-
-func encFloat32Slice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]float32)
-	if !ok {
-		// It is kind float32 but not type float32. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0 || state.sendZero {
-			bits := floatBits(float64(x))
-			state.encodeUint(bits)
-		}
-	}
-	return true
-}
-
-func encFloat64Array(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encFloat64Slice(state, v.Slice(0, v.Len()))
-}
-
-func encFloat64Slice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]float64)
-	if !ok {
-		// It is kind float64 but not type float64. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0 || state.sendZero {
-			bits := floatBits(x)
-			state.encodeUint(bits)
-		}
-	}
-	return true
-}
-
-func encIntArray(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encIntSlice(state, v.Slice(0, v.Len()))
-}
-
-func encIntSlice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]int)
-	if !ok {
-		// It is kind int but not type int. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0 || state.sendZero {
-			state.encodeInt(int64(x))
-		}
-	}
-	return true
-}
-
-func encInt16Array(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encInt16Slice(state, v.Slice(0, v.Len()))
-}
-
-func encInt16Slice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]int16)
-	if !ok {
-		// It is kind int16 but not type int16. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0 || state.sendZero {
-			state.encodeInt(int64(x))
-		}
-	}
-	return true
-}
-
-func encInt32Array(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encInt32Slice(state, v.Slice(0, v.Len()))
-}
-
-func encInt32Slice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]int32)
-	if !ok {
-		// It is kind int32 but not type int32. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0 || state.sendZero {
-			state.encodeInt(int64(x))
-		}
-	}
-	return true
-}
-
-func encInt64Array(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encInt64Slice(state, v.Slice(0, v.Len()))
-}
-
-func encInt64Slice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]int64)
-	if !ok {
-		// It is kind int64 but not type int64. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0 || state.sendZero {
-			state.encodeInt(x)
-		}
-	}
-	return true
-}
-
-func encInt8Array(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encInt8Slice(state, v.Slice(0, v.Len()))
-}
-
-func encInt8Slice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]int8)
-	if !ok {
-		// It is kind int8 but not type int8. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0 || state.sendZero {
-			state.encodeInt(int64(x))
-		}
-	}
-	return true
-}
-
-func encStringArray(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encStringSlice(state, v.Slice(0, v.Len()))
-}
-
-func encStringSlice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]string)
-	if !ok {
-		// It is kind string but not type string. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != "" || state.sendZero {
-			state.encodeUint(uint64(len(x)))
-			state.b.WriteString(x)
-		}
-	}
-	return true
-}
-
-func encUintArray(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encUintSlice(state, v.Slice(0, v.Len()))
-}
-
-func encUintSlice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]uint)
-	if !ok {
-		// It is kind uint but not type uint. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0 || state.sendZero {
-			state.encodeUint(uint64(x))
-		}
-	}
-	return true
-}
-
-func encUint16Array(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encUint16Slice(state, v.Slice(0, v.Len()))
-}
-
-func encUint16Slice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]uint16)
-	if !ok {
-		// It is kind uint16 but not type uint16. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0 || state.sendZero {
-			state.encodeUint(uint64(x))
-		}
-	}
-	return true
-}
-
-func encUint32Array(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encUint32Slice(state, v.Slice(0, v.Len()))
-}
-
-func encUint32Slice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]uint32)
-	if !ok {
-		// It is kind uint32 but not type uint32. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0 || state.sendZero {
-			state.encodeUint(uint64(x))
-		}
-	}
-	return true
-}
-
-func encUint64Array(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encUint64Slice(state, v.Slice(0, v.Len()))
-}
-
-func encUint64Slice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]uint64)
-	if !ok {
-		// It is kind uint64 but not type uint64. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0 || state.sendZero {
-			state.encodeUint(x)
-		}
-	}
-	return true
-}
-
-func encUintptrArray(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return encUintptrSlice(state, v.Slice(0, v.Len()))
-}
-
-func encUintptrSlice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]uintptr)
-	if !ok {
-		// It is kind uintptr but not type uintptr. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != 0 || state.sendZero {
-			state.encodeUint(uint64(x))
-		}
-	}
-	return true
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/encgen.go b/third_party/gofrontend/libgo/go/encoding/gob/encgen.go
deleted file mode 100644
index efdd928..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/encgen.go
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// encgen writes the helper functions for encoding. Intended to be
-// used with go generate; see the invocation in encode.go.
-
-// TODO: We could do more by being unsafe. Add a -unsafe flag?
-
-package main
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"go/format"
-	"log"
-	"os"
-)
-
-var output = flag.String("output", "enc_helpers.go", "file name to write")
-
-type Type struct {
-	lower   string
-	upper   string
-	zero    string
-	encoder string
-}
-
-var types = []Type{
-	{
-		"bool",
-		"Bool",
-		"false",
-		`if x {
-			state.encodeUint(1)
-		} else {
-			state.encodeUint(0)
-		}`,
-	},
-	{
-		"complex64",
-		"Complex64",
-		"0+0i",
-		`rpart := floatBits(float64(real(x)))
-		ipart := floatBits(float64(imag(x)))
-		state.encodeUint(rpart)
-		state.encodeUint(ipart)`,
-	},
-	{
-		"complex128",
-		"Complex128",
-		"0+0i",
-		`rpart := floatBits(real(x))
-		ipart := floatBits(imag(x))
-		state.encodeUint(rpart)
-		state.encodeUint(ipart)`,
-	},
-	{
-		"float32",
-		"Float32",
-		"0",
-		`bits := floatBits(float64(x))
-		state.encodeUint(bits)`,
-	},
-	{
-		"float64",
-		"Float64",
-		"0",
-		`bits := floatBits(x)
-		state.encodeUint(bits)`,
-	},
-	{
-		"int",
-		"Int",
-		"0",
-		`state.encodeInt(int64(x))`,
-	},
-	{
-		"int16",
-		"Int16",
-		"0",
-		`state.encodeInt(int64(x))`,
-	},
-	{
-		"int32",
-		"Int32",
-		"0",
-		`state.encodeInt(int64(x))`,
-	},
-	{
-		"int64",
-		"Int64",
-		"0",
-		`state.encodeInt(x)`,
-	},
-	{
-		"int8",
-		"Int8",
-		"0",
-		`state.encodeInt(int64(x))`,
-	},
-	{
-		"string",
-		"String",
-		`""`,
-		`state.encodeUint(uint64(len(x)))
-		state.b.WriteString(x)`,
-	},
-	{
-		"uint",
-		"Uint",
-		"0",
-		`state.encodeUint(uint64(x))`,
-	},
-	{
-		"uint16",
-		"Uint16",
-		"0",
-		`state.encodeUint(uint64(x))`,
-	},
-	{
-		"uint32",
-		"Uint32",
-		"0",
-		`state.encodeUint(uint64(x))`,
-	},
-	{
-		"uint64",
-		"Uint64",
-		"0",
-		`state.encodeUint(x)`,
-	},
-	{
-		"uintptr",
-		"Uintptr",
-		"0",
-		`state.encodeUint(uint64(x))`,
-	},
-	// uint8 Handled separately.
-}
-
-func main() {
-	log.SetFlags(0)
-	log.SetPrefix("encgen: ")
-	flag.Parse()
-	if flag.NArg() != 0 {
-		log.Fatal("usage: encgen [--output filename]")
-	}
-	var b bytes.Buffer
-	fmt.Fprintf(&b, "// Created by encgen --output %s; DO NOT EDIT\n", *output)
-	fmt.Fprint(&b, header)
-	printMaps(&b, "Array")
-	fmt.Fprint(&b, "\n")
-	printMaps(&b, "Slice")
-	for _, t := range types {
-		fmt.Fprintf(&b, arrayHelper, t.lower, t.upper)
-		fmt.Fprintf(&b, sliceHelper, t.lower, t.upper, t.zero, t.encoder)
-	}
-	source, err := format.Source(b.Bytes())
-	if err != nil {
-		log.Fatal("source format error:", err)
-	}
-	fd, err := os.Create(*output)
-	_, err = fd.Write(source)
-	if err != nil {
-		log.Fatal(err)
-	}
-}
-
-func printMaps(b *bytes.Buffer, upperClass string) {
-	fmt.Fprintf(b, "var enc%sHelper = map[reflect.Kind]encHelper{\n", upperClass)
-	for _, t := range types {
-		fmt.Fprintf(b, "reflect.%s: enc%s%s,\n", t.upper, t.upper, upperClass)
-	}
-	fmt.Fprintf(b, "}\n")
-}
-
-const header = `
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gob
-
-import (
-	"reflect"
-)
-
-`
-
-const arrayHelper = `
-func enc%[2]sArray(state *encoderState, v reflect.Value) bool {
-	// Can only slice if it is addressable.
-	if !v.CanAddr() {
-		return false
-	}
-	return enc%[2]sSlice(state, v.Slice(0, v.Len()))
-}
-`
-
-const sliceHelper = `
-func enc%[2]sSlice(state *encoderState, v reflect.Value) bool {
-	slice, ok := v.Interface().([]%[1]s)
-	if !ok {
-		// It is kind %[1]s but not type %[1]s. TODO: We can handle this unsafely.
-		return false
-	}
-	for _, x := range slice {
-		if x != %[3]s || state.sendZero {
-			%[4]s
-		}
-	}
-	return true
-}
-`
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/encode.go b/third_party/gofrontend/libgo/go/encoding/gob/encode.go
deleted file mode 100644
index f66279f..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/encode.go
+++ /dev/null
@@ -1,696 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:generate go run encgen.go -output enc_helpers.go
-
-package gob
-
-import (
-	"encoding"
-	"math"
-	"reflect"
-)
-
-const uint64Size = 8
-
-type encHelper func(state *encoderState, v reflect.Value) bool
-
-// encoderState is the global execution state of an instance of the encoder.
-// Field numbers are delta encoded and always increase. The field
-// number is initialized to -1 so 0 comes out as delta(1). A delta of
-// 0 terminates the structure.
-type encoderState struct {
-	enc      *Encoder
-	b        *encBuffer
-	sendZero bool                 // encoding an array element or map key/value pair; send zero values
-	fieldnum int                  // the last field number written.
-	buf      [1 + uint64Size]byte // buffer used by the encoder; here to avoid allocation.
-	next     *encoderState        // for free list
-}
-
-// encBuffer is an extremely simple, fast implementation of a write-only byte buffer.
-// It never returns a non-nil error, but Write returns an error value so it matches io.Writer.
-type encBuffer struct {
-	data    []byte
-	scratch [64]byte
-}
-
-func (e *encBuffer) WriteByte(c byte) {
-	e.data = append(e.data, c)
-}
-
-func (e *encBuffer) Write(p []byte) (int, error) {
-	e.data = append(e.data, p...)
-	return len(p), nil
-}
-
-func (e *encBuffer) WriteString(s string) {
-	e.data = append(e.data, s...)
-}
-
-func (e *encBuffer) Len() int {
-	return len(e.data)
-}
-
-func (e *encBuffer) Bytes() []byte {
-	return e.data
-}
-
-func (e *encBuffer) Reset() {
-	e.data = e.data[0:0]
-}
-
-func (enc *Encoder) newEncoderState(b *encBuffer) *encoderState {
-	e := enc.freeList
-	if e == nil {
-		e = new(encoderState)
-		e.enc = enc
-	} else {
-		enc.freeList = e.next
-	}
-	e.sendZero = false
-	e.fieldnum = 0
-	e.b = b
-	if len(b.data) == 0 {
-		b.data = b.scratch[0:0]
-	}
-	return e
-}
-
-func (enc *Encoder) freeEncoderState(e *encoderState) {
-	e.next = enc.freeList
-	enc.freeList = e
-}
-
-// Unsigned integers have a two-state encoding.  If the number is less
-// than 128 (0 through 0x7F), its value is written directly.
-// Otherwise the value is written in big-endian byte order preceded
-// by the byte length, negated.
-
-// encodeUint writes an encoded unsigned integer to state.b.
-func (state *encoderState) encodeUint(x uint64) {
-	if x <= 0x7F {
-		state.b.WriteByte(uint8(x))
-		return
-	}
-	i := uint64Size
-	for x > 0 {
-		state.buf[i] = uint8(x)
-		x >>= 8
-		i--
-	}
-	state.buf[i] = uint8(i - uint64Size) // = loop count, negated
-	state.b.Write(state.buf[i : uint64Size+1])
-}
-
-// encodeInt writes an encoded signed integer to state.w.
-// The low bit of the encoding says whether to bit complement the (other bits of the)
-// uint to recover the int.
-func (state *encoderState) encodeInt(i int64) {
-	var x uint64
-	if i < 0 {
-		x = uint64(^i<<1) | 1
-	} else {
-		x = uint64(i << 1)
-	}
-	state.encodeUint(uint64(x))
-}
-
-// encOp is the signature of an encoding operator for a given type.
-type encOp func(i *encInstr, state *encoderState, v reflect.Value)
-
-// The 'instructions' of the encoding machine
-type encInstr struct {
-	op    encOp
-	field int   // field number in input
-	index []int // struct index
-	indir int   // how many pointer indirections to reach the value in the struct
-}
-
-// update emits a field number and updates the state to record its value for delta encoding.
-// If the instruction pointer is nil, it does nothing
-func (state *encoderState) update(instr *encInstr) {
-	if instr != nil {
-		state.encodeUint(uint64(instr.field - state.fieldnum))
-		state.fieldnum = instr.field
-	}
-}
-
-// Each encoder for a composite is responsible for handling any
-// indirections associated with the elements of the data structure.
-// If any pointer so reached is nil, no bytes are written.  If the
-// data item is zero, no bytes are written.  Single values - ints,
-// strings etc. - are indirected before calling their encoders.
-// Otherwise, the output (for a scalar) is the field number, as an
-// encoded integer, followed by the field data in its appropriate
-// format.
-
-// encIndirect dereferences pv indir times and returns the result.
-func encIndirect(pv reflect.Value, indir int) reflect.Value {
-	for ; indir > 0; indir-- {
-		if pv.IsNil() {
-			break
-		}
-		pv = pv.Elem()
-	}
-	return pv
-}
-
-// encBool encodes the bool referenced by v as an unsigned 0 or 1.
-func encBool(i *encInstr, state *encoderState, v reflect.Value) {
-	b := v.Bool()
-	if b || state.sendZero {
-		state.update(i)
-		if b {
-			state.encodeUint(1)
-		} else {
-			state.encodeUint(0)
-		}
-	}
-}
-
-// encInt encodes the signed integer (int int8 int16 int32 int64) referenced by v.
-func encInt(i *encInstr, state *encoderState, v reflect.Value) {
-	value := v.Int()
-	if value != 0 || state.sendZero {
-		state.update(i)
-		state.encodeInt(value)
-	}
-}
-
-// encUint encodes the unsigned integer (uint uint8 uint16 uint32 uint64 uintptr) referenced by v.
-func encUint(i *encInstr, state *encoderState, v reflect.Value) {
-	value := v.Uint()
-	if value != 0 || state.sendZero {
-		state.update(i)
-		state.encodeUint(value)
-	}
-}
-
-// floatBits returns a uint64 holding the bits of a floating-point number.
-// Floating-point numbers are transmitted as uint64s holding the bits
-// of the underlying representation.  They are sent byte-reversed, with
-// the exponent end coming out first, so integer floating point numbers
-// (for example) transmit more compactly.  This routine does the
-// swizzling.
-func floatBits(f float64) uint64 {
-	u := math.Float64bits(f)
-	var v uint64
-	for i := 0; i < 8; i++ {
-		v <<= 8
-		v |= u & 0xFF
-		u >>= 8
-	}
-	return v
-}
-
-// encFloat encodes the floating point value (float32 float64) referenced by v.
-func encFloat(i *encInstr, state *encoderState, v reflect.Value) {
-	f := v.Float()
-	if f != 0 || state.sendZero {
-		bits := floatBits(f)
-		state.update(i)
-		state.encodeUint(bits)
-	}
-}
-
-// encComplex encodes the complex value (complex64 complex128) referenced by v.
-// Complex numbers are just a pair of floating-point numbers, real part first.
-func encComplex(i *encInstr, state *encoderState, v reflect.Value) {
-	c := v.Complex()
-	if c != 0+0i || state.sendZero {
-		rpart := floatBits(real(c))
-		ipart := floatBits(imag(c))
-		state.update(i)
-		state.encodeUint(rpart)
-		state.encodeUint(ipart)
-	}
-}
-
-// encUint8Array encodes the byte array referenced by v.
-// Byte arrays are encoded as an unsigned count followed by the raw bytes.
-func encUint8Array(i *encInstr, state *encoderState, v reflect.Value) {
-	b := v.Bytes()
-	if len(b) > 0 || state.sendZero {
-		state.update(i)
-		state.encodeUint(uint64(len(b)))
-		state.b.Write(b)
-	}
-}
-
-// encString encodes the string referenced by v.
-// Strings are encoded as an unsigned count followed by the raw bytes.
-func encString(i *encInstr, state *encoderState, v reflect.Value) {
-	s := v.String()
-	if len(s) > 0 || state.sendZero {
-		state.update(i)
-		state.encodeUint(uint64(len(s)))
-		state.b.WriteString(s)
-	}
-}
-
-// encStructTerminator encodes the end of an encoded struct
-// as delta field number of 0.
-func encStructTerminator(i *encInstr, state *encoderState, v reflect.Value) {
-	state.encodeUint(0)
-}
-
-// Execution engine
-
-// encEngine an array of instructions indexed by field number of the encoding
-// data, typically a struct.  It is executed top to bottom, walking the struct.
-type encEngine struct {
-	instr []encInstr
-}
-
-const singletonField = 0
-
-// valid reports whether the value is valid and a non-nil pointer.
-// (Slices, maps, and chans take care of themselves.)
-func valid(v reflect.Value) bool {
-	switch v.Kind() {
-	case reflect.Invalid:
-		return false
-	case reflect.Ptr:
-		return !v.IsNil()
-	}
-	return true
-}
-
-// encodeSingle encodes a single top-level non-struct value.
-func (enc *Encoder) encodeSingle(b *encBuffer, engine *encEngine, value reflect.Value) {
-	state := enc.newEncoderState(b)
-	defer enc.freeEncoderState(state)
-	state.fieldnum = singletonField
-	// There is no surrounding struct to frame the transmission, so we must
-	// generate data even if the item is zero.  To do this, set sendZero.
-	state.sendZero = true
-	instr := &engine.instr[singletonField]
-	if instr.indir > 0 {
-		value = encIndirect(value, instr.indir)
-	}
-	if valid(value) {
-		instr.op(instr, state, value)
-	}
-}
-
-// encodeStruct encodes a single struct value.
-func (enc *Encoder) encodeStruct(b *encBuffer, engine *encEngine, value reflect.Value) {
-	if !valid(value) {
-		return
-	}
-	state := enc.newEncoderState(b)
-	defer enc.freeEncoderState(state)
-	state.fieldnum = -1
-	for i := 0; i < len(engine.instr); i++ {
-		instr := &engine.instr[i]
-		if i >= value.NumField() {
-			// encStructTerminator
-			instr.op(instr, state, reflect.Value{})
-			break
-		}
-		field := value.FieldByIndex(instr.index)
-		if instr.indir > 0 {
-			field = encIndirect(field, instr.indir)
-			// TODO: Is field guaranteed valid? If so we could avoid this check.
-			if !valid(field) {
-				continue
-			}
-		}
-		instr.op(instr, state, field)
-	}
-}
-
-// encodeArray encodes an array.
-func (enc *Encoder) encodeArray(b *encBuffer, value reflect.Value, op encOp, elemIndir int, length int, helper encHelper) {
-	state := enc.newEncoderState(b)
-	defer enc.freeEncoderState(state)
-	state.fieldnum = -1
-	state.sendZero = true
-	state.encodeUint(uint64(length))
-	if helper != nil && helper(state, value) {
-		return
-	}
-	for i := 0; i < length; i++ {
-		elem := value.Index(i)
-		if elemIndir > 0 {
-			elem = encIndirect(elem, elemIndir)
-			// TODO: Is elem guaranteed valid? If so we could avoid this check.
-			if !valid(elem) {
-				errorf("encodeArray: nil element")
-			}
-		}
-		op(nil, state, elem)
-	}
-}
-
-// encodeReflectValue is a helper for maps. It encodes the value v.
-func encodeReflectValue(state *encoderState, v reflect.Value, op encOp, indir int) {
-	for i := 0; i < indir && v.IsValid(); i++ {
-		v = reflect.Indirect(v)
-	}
-	if !v.IsValid() {
-		errorf("encodeReflectValue: nil element")
-	}
-	op(nil, state, v)
-}
-
-// encodeMap encodes a map as unsigned count followed by key:value pairs.
-func (enc *Encoder) encodeMap(b *encBuffer, mv reflect.Value, keyOp, elemOp encOp, keyIndir, elemIndir int) {
-	state := enc.newEncoderState(b)
-	state.fieldnum = -1
-	state.sendZero = true
-	keys := mv.MapKeys()
-	state.encodeUint(uint64(len(keys)))
-	for _, key := range keys {
-		encodeReflectValue(state, key, keyOp, keyIndir)
-		encodeReflectValue(state, mv.MapIndex(key), elemOp, elemIndir)
-	}
-	enc.freeEncoderState(state)
-}
-
-// encodeInterface encodes the interface value iv.
-// To send an interface, we send a string identifying the concrete type, followed
-// by the type identifier (which might require defining that type right now), followed
-// by the concrete value.  A nil value gets sent as the empty string for the name,
-// followed by no value.
-func (enc *Encoder) encodeInterface(b *encBuffer, iv reflect.Value) {
-	// Gobs can encode nil interface values but not typed interface
-	// values holding nil pointers, since nil pointers point to no value.
-	elem := iv.Elem()
-	if elem.Kind() == reflect.Ptr && elem.IsNil() {
-		errorf("gob: cannot encode nil pointer of type %s inside interface", iv.Elem().Type())
-	}
-	state := enc.newEncoderState(b)
-	state.fieldnum = -1
-	state.sendZero = true
-	if iv.IsNil() {
-		state.encodeUint(0)
-		return
-	}
-
-	ut := userType(iv.Elem().Type())
-	registerLock.RLock()
-	name, ok := concreteTypeToName[ut.base]
-	registerLock.RUnlock()
-	if !ok {
-		errorf("type not registered for interface: %s", ut.base)
-	}
-	// Send the name.
-	state.encodeUint(uint64(len(name)))
-	state.b.WriteString(name)
-	// Define the type id if necessary.
-	enc.sendTypeDescriptor(enc.writer(), state, ut)
-	// Send the type id.
-	enc.sendTypeId(state, ut)
-	// Encode the value into a new buffer.  Any nested type definitions
-	// should be written to b, before the encoded value.
-	enc.pushWriter(b)
-	data := new(encBuffer)
-	data.Write(spaceForLength)
-	enc.encode(data, elem, ut)
-	if enc.err != nil {
-		error_(enc.err)
-	}
-	enc.popWriter()
-	enc.writeMessage(b, data)
-	if enc.err != nil {
-		error_(enc.err)
-	}
-	enc.freeEncoderState(state)
-}
-
-// isZero reports whether the value is the zero of its type.
-func isZero(val reflect.Value) bool {
-	switch val.Kind() {
-	case reflect.Array:
-		for i := 0; i < val.Len(); i++ {
-			if !isZero(val.Index(i)) {
-				return false
-			}
-		}
-		return true
-	case reflect.Map, reflect.Slice, reflect.String:
-		return val.Len() == 0
-	case reflect.Bool:
-		return !val.Bool()
-	case reflect.Complex64, reflect.Complex128:
-		return val.Complex() == 0
-	case reflect.Chan, reflect.Func, reflect.Interface, reflect.Ptr:
-		return val.IsNil()
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return val.Int() == 0
-	case reflect.Float32, reflect.Float64:
-		return val.Float() == 0
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		return val.Uint() == 0
-	case reflect.Struct:
-		for i := 0; i < val.NumField(); i++ {
-			if !isZero(val.Field(i)) {
-				return false
-			}
-		}
-		return true
-	}
-	panic("unknown type in isZero " + val.Type().String())
-}
-
-// encGobEncoder encodes a value that implements the GobEncoder interface.
-// The data is sent as a byte array.
-func (enc *Encoder) encodeGobEncoder(b *encBuffer, ut *userTypeInfo, v reflect.Value) {
-	// TODO: should we catch panics from the called method?
-
-	var data []byte
-	var err error
-	// We know it's one of these.
-	switch ut.externalEnc {
-	case xGob:
-		data, err = v.Interface().(GobEncoder).GobEncode()
-	case xBinary:
-		data, err = v.Interface().(encoding.BinaryMarshaler).MarshalBinary()
-	case xText:
-		data, err = v.Interface().(encoding.TextMarshaler).MarshalText()
-	}
-	if err != nil {
-		error_(err)
-	}
-	state := enc.newEncoderState(b)
-	state.fieldnum = -1
-	state.encodeUint(uint64(len(data)))
-	state.b.Write(data)
-	enc.freeEncoderState(state)
-}
-
-var encOpTable = [...]encOp{
-	reflect.Bool:       encBool,
-	reflect.Int:        encInt,
-	reflect.Int8:       encInt,
-	reflect.Int16:      encInt,
-	reflect.Int32:      encInt,
-	reflect.Int64:      encInt,
-	reflect.Uint:       encUint,
-	reflect.Uint8:      encUint,
-	reflect.Uint16:     encUint,
-	reflect.Uint32:     encUint,
-	reflect.Uint64:     encUint,
-	reflect.Uintptr:    encUint,
-	reflect.Float32:    encFloat,
-	reflect.Float64:    encFloat,
-	reflect.Complex64:  encComplex,
-	reflect.Complex128: encComplex,
-	reflect.String:     encString,
-}
-
-// encOpFor returns (a pointer to) the encoding op for the base type under rt and
-// the indirection count to reach it.
-func encOpFor(rt reflect.Type, inProgress map[reflect.Type]*encOp, building map[*typeInfo]bool) (*encOp, int) {
-	ut := userType(rt)
-	// If the type implements GobEncoder, we handle it without further processing.
-	if ut.externalEnc != 0 {
-		return gobEncodeOpFor(ut)
-	}
-	// If this type is already in progress, it's a recursive type (e.g. map[string]*T).
-	// Return the pointer to the op we're already building.
-	if opPtr := inProgress[rt]; opPtr != nil {
-		return opPtr, ut.indir
-	}
-	typ := ut.base
-	indir := ut.indir
-	k := typ.Kind()
-	var op encOp
-	if int(k) < len(encOpTable) {
-		op = encOpTable[k]
-	}
-	if op == nil {
-		inProgress[rt] = &op
-		// Special cases
-		switch t := typ; t.Kind() {
-		case reflect.Slice:
-			if t.Elem().Kind() == reflect.Uint8 {
-				op = encUint8Array
-				break
-			}
-			// Slices have a header; we decode it to find the underlying array.
-			elemOp, elemIndir := encOpFor(t.Elem(), inProgress, building)
-			helper := encSliceHelper[t.Elem().Kind()]
-			op = func(i *encInstr, state *encoderState, slice reflect.Value) {
-				if !state.sendZero && slice.Len() == 0 {
-					return
-				}
-				state.update(i)
-				state.enc.encodeArray(state.b, slice, *elemOp, elemIndir, slice.Len(), helper)
-			}
-		case reflect.Array:
-			// True arrays have size in the type.
-			elemOp, elemIndir := encOpFor(t.Elem(), inProgress, building)
-			helper := encArrayHelper[t.Elem().Kind()]
-			op = func(i *encInstr, state *encoderState, array reflect.Value) {
-				state.update(i)
-				state.enc.encodeArray(state.b, array, *elemOp, elemIndir, array.Len(), helper)
-			}
-		case reflect.Map:
-			keyOp, keyIndir := encOpFor(t.Key(), inProgress, building)
-			elemOp, elemIndir := encOpFor(t.Elem(), inProgress, building)
-			op = func(i *encInstr, state *encoderState, mv reflect.Value) {
-				// We send zero-length (but non-nil) maps because the
-				// receiver might want to use the map.  (Maps don't use append.)
-				if !state.sendZero && mv.IsNil() {
-					return
-				}
-				state.update(i)
-				state.enc.encodeMap(state.b, mv, *keyOp, *elemOp, keyIndir, elemIndir)
-			}
-		case reflect.Struct:
-			// Generate a closure that calls out to the engine for the nested type.
-			getEncEngine(userType(typ), building)
-			info := mustGetTypeInfo(typ)
-			op = func(i *encInstr, state *encoderState, sv reflect.Value) {
-				state.update(i)
-				// indirect through info to delay evaluation for recursive structs
-				enc := info.encoder.Load().(*encEngine)
-				state.enc.encodeStruct(state.b, enc, sv)
-			}
-		case reflect.Interface:
-			op = func(i *encInstr, state *encoderState, iv reflect.Value) {
-				if !state.sendZero && (!iv.IsValid() || iv.IsNil()) {
-					return
-				}
-				state.update(i)
-				state.enc.encodeInterface(state.b, iv)
-			}
-		}
-	}
-	if op == nil {
-		errorf("can't happen: encode type %s", rt)
-	}
-	return &op, indir
-}
-
-// gobEncodeOpFor returns the op for a type that is known to implement GobEncoder.
-func gobEncodeOpFor(ut *userTypeInfo) (*encOp, int) {
-	rt := ut.user
-	if ut.encIndir == -1 {
-		rt = reflect.PtrTo(rt)
-	} else if ut.encIndir > 0 {
-		for i := int8(0); i < ut.encIndir; i++ {
-			rt = rt.Elem()
-		}
-	}
-	var op encOp
-	op = func(i *encInstr, state *encoderState, v reflect.Value) {
-		if ut.encIndir == -1 {
-			// Need to climb up one level to turn value into pointer.
-			if !v.CanAddr() {
-				errorf("unaddressable value of type %s", rt)
-			}
-			v = v.Addr()
-		}
-		if !state.sendZero && isZero(v) {
-			return
-		}
-		state.update(i)
-		state.enc.encodeGobEncoder(state.b, ut, v)
-	}
-	return &op, int(ut.encIndir) // encIndir: op will get called with p == address of receiver.
-}
-
-// compileEnc returns the engine to compile the type.
-func compileEnc(ut *userTypeInfo, building map[*typeInfo]bool) *encEngine {
-	srt := ut.base
-	engine := new(encEngine)
-	seen := make(map[reflect.Type]*encOp)
-	rt := ut.base
-	if ut.externalEnc != 0 {
-		rt = ut.user
-	}
-	if ut.externalEnc == 0 && srt.Kind() == reflect.Struct {
-		for fieldNum, wireFieldNum := 0, 0; fieldNum < srt.NumField(); fieldNum++ {
-			f := srt.Field(fieldNum)
-			if !isSent(&f) {
-				continue
-			}
-			op, indir := encOpFor(f.Type, seen, building)
-			engine.instr = append(engine.instr, encInstr{*op, wireFieldNum, f.Index, indir})
-			wireFieldNum++
-		}
-		if srt.NumField() > 0 && len(engine.instr) == 0 {
-			errorf("type %s has no exported fields", rt)
-		}
-		engine.instr = append(engine.instr, encInstr{encStructTerminator, 0, nil, 0})
-	} else {
-		engine.instr = make([]encInstr, 1)
-		op, indir := encOpFor(rt, seen, building)
-		engine.instr[0] = encInstr{*op, singletonField, nil, indir}
-	}
-	return engine
-}
-
-// getEncEngine returns the engine to compile the type.
-func getEncEngine(ut *userTypeInfo, building map[*typeInfo]bool) *encEngine {
-	info, err := getTypeInfo(ut)
-	if err != nil {
-		error_(err)
-	}
-	enc, ok := info.encoder.Load().(*encEngine)
-	if !ok {
-		enc = buildEncEngine(info, ut, building)
-	}
-	return enc
-}
-
-func buildEncEngine(info *typeInfo, ut *userTypeInfo, building map[*typeInfo]bool) *encEngine {
-	// Check for recursive types.
-	if building != nil && building[info] {
-		return nil
-	}
-	info.encInit.Lock()
-	defer info.encInit.Unlock()
-	enc, ok := info.encoder.Load().(*encEngine)
-	if !ok {
-		if building == nil {
-			building = make(map[*typeInfo]bool)
-		}
-		building[info] = true
-		enc = compileEnc(ut, building)
-		info.encoder.Store(enc)
-	}
-	return enc
-}
-
-func (enc *Encoder) encode(b *encBuffer, value reflect.Value, ut *userTypeInfo) {
-	defer catchError(&enc.err)
-	engine := getEncEngine(ut, nil)
-	indir := ut.indir
-	if ut.externalEnc != 0 {
-		indir = int(ut.encIndir)
-	}
-	for i := 0; i < indir; i++ {
-		value = reflect.Indirect(value)
-	}
-	if ut.externalEnc == 0 && value.Type().Kind() == reflect.Struct {
-		enc.encodeStruct(b, engine, value)
-	} else {
-		enc.encodeSingle(b, engine, value)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/encoder.go b/third_party/gofrontend/libgo/go/encoding/gob/encoder.go
deleted file mode 100644
index 62d0f42..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/encoder.go
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gob
-
-import (
-	"errors"
-	"io"
-	"reflect"
-	"sync"
-)
-
-// An Encoder manages the transmission of type and data information to the
-// other side of a connection.
-type Encoder struct {
-	mutex      sync.Mutex              // each item must be sent atomically
-	w          []io.Writer             // where to send the data
-	sent       map[reflect.Type]typeId // which types we've already sent
-	countState *encoderState           // stage for writing counts
-	freeList   *encoderState           // list of free encoderStates; avoids reallocation
-	byteBuf    encBuffer               // buffer for top-level encoderState
-	err        error
-}
-
-// Before we encode a message, we reserve space at the head of the
-// buffer in which to encode its length. This means we can use the
-// buffer to assemble the message without another allocation.
-const maxLength = 9 // Maximum size of an encoded length.
-var spaceForLength = make([]byte, maxLength)
-
-// NewEncoder returns a new encoder that will transmit on the io.Writer.
-func NewEncoder(w io.Writer) *Encoder {
-	enc := new(Encoder)
-	enc.w = []io.Writer{w}
-	enc.sent = make(map[reflect.Type]typeId)
-	enc.countState = enc.newEncoderState(new(encBuffer))
-	return enc
-}
-
-// writer() returns the innermost writer the encoder is using
-func (enc *Encoder) writer() io.Writer {
-	return enc.w[len(enc.w)-1]
-}
-
-// pushWriter adds a writer to the encoder.
-func (enc *Encoder) pushWriter(w io.Writer) {
-	enc.w = append(enc.w, w)
-}
-
-// popWriter pops the innermost writer.
-func (enc *Encoder) popWriter() {
-	enc.w = enc.w[0 : len(enc.w)-1]
-}
-
-func (enc *Encoder) setError(err error) {
-	if enc.err == nil { // remember the first.
-		enc.err = err
-	}
-}
-
-// writeMessage sends the data item preceded by a unsigned count of its length.
-func (enc *Encoder) writeMessage(w io.Writer, b *encBuffer) {
-	// Space has been reserved for the length at the head of the message.
-	// This is a little dirty: we grab the slice from the bytes.Buffer and massage
-	// it by hand.
-	message := b.Bytes()
-	messageLen := len(message) - maxLength
-	// Length cannot be bigger than the decoder can handle.
-	if messageLen >= tooBig {
-		enc.setError(errors.New("gob: encoder: message too big"))
-		return
-	}
-	// Encode the length.
-	enc.countState.b.Reset()
-	enc.countState.encodeUint(uint64(messageLen))
-	// Copy the length to be a prefix of the message.
-	offset := maxLength - enc.countState.b.Len()
-	copy(message[offset:], enc.countState.b.Bytes())
-	// Write the data.
-	_, err := w.Write(message[offset:])
-	// Drain the buffer and restore the space at the front for the count of the next message.
-	b.Reset()
-	b.Write(spaceForLength)
-	if err != nil {
-		enc.setError(err)
-	}
-}
-
-// sendActualType sends the requested type, without further investigation, unless
-// it's been sent before.
-func (enc *Encoder) sendActualType(w io.Writer, state *encoderState, ut *userTypeInfo, actual reflect.Type) (sent bool) {
-	if _, alreadySent := enc.sent[actual]; alreadySent {
-		return false
-	}
-	info, err := getTypeInfo(ut)
-	if err != nil {
-		enc.setError(err)
-		return
-	}
-	// Send the pair (-id, type)
-	// Id:
-	state.encodeInt(-int64(info.id))
-	// Type:
-	enc.encode(state.b, reflect.ValueOf(info.wire), wireTypeUserInfo)
-	enc.writeMessage(w, state.b)
-	if enc.err != nil {
-		return
-	}
-
-	// Remember we've sent this type, both what the user gave us and the base type.
-	enc.sent[ut.base] = info.id
-	if ut.user != ut.base {
-		enc.sent[ut.user] = info.id
-	}
-	// Now send the inner types
-	switch st := actual; st.Kind() {
-	case reflect.Struct:
-		for i := 0; i < st.NumField(); i++ {
-			if isExported(st.Field(i).Name) {
-				enc.sendType(w, state, st.Field(i).Type)
-			}
-		}
-	case reflect.Array, reflect.Slice:
-		enc.sendType(w, state, st.Elem())
-	case reflect.Map:
-		enc.sendType(w, state, st.Key())
-		enc.sendType(w, state, st.Elem())
-	}
-	return true
-}
-
-// sendType sends the type info to the other side, if necessary.
-func (enc *Encoder) sendType(w io.Writer, state *encoderState, origt reflect.Type) (sent bool) {
-	ut := userType(origt)
-	if ut.externalEnc != 0 {
-		// The rules are different: regardless of the underlying type's representation,
-		// we need to tell the other side that the base type is a GobEncoder.
-		return enc.sendActualType(w, state, ut, ut.base)
-	}
-
-	// It's a concrete value, so drill down to the base type.
-	switch rt := ut.base; rt.Kind() {
-	default:
-		// Basic types and interfaces do not need to be described.
-		return
-	case reflect.Slice:
-		// If it's []uint8, don't send; it's considered basic.
-		if rt.Elem().Kind() == reflect.Uint8 {
-			return
-		}
-		// Otherwise we do send.
-		break
-	case reflect.Array:
-		// arrays must be sent so we know their lengths and element types.
-		break
-	case reflect.Map:
-		// maps must be sent so we know their lengths and key/value types.
-		break
-	case reflect.Struct:
-		// structs must be sent so we know their fields.
-		break
-	case reflect.Chan, reflect.Func:
-		// If we get here, it's a field of a struct; ignore it.
-		return
-	}
-
-	return enc.sendActualType(w, state, ut, ut.base)
-}
-
-// Encode transmits the data item represented by the empty interface value,
-// guaranteeing that all necessary type information has been transmitted first.
-func (enc *Encoder) Encode(e interface{}) error {
-	return enc.EncodeValue(reflect.ValueOf(e))
-}
-
-// sendTypeDescriptor makes sure the remote side knows about this type.
-// It will send a descriptor if this is the first time the type has been
-// sent.
-func (enc *Encoder) sendTypeDescriptor(w io.Writer, state *encoderState, ut *userTypeInfo) {
-	// Make sure the type is known to the other side.
-	// First, have we already sent this type?
-	rt := ut.base
-	if ut.externalEnc != 0 {
-		rt = ut.user
-	}
-	if _, alreadySent := enc.sent[rt]; !alreadySent {
-		// No, so send it.
-		sent := enc.sendType(w, state, rt)
-		if enc.err != nil {
-			return
-		}
-		// If the type info has still not been transmitted, it means we have
-		// a singleton basic type (int, []byte etc.) at top level.  We don't
-		// need to send the type info but we do need to update enc.sent.
-		if !sent {
-			info, err := getTypeInfo(ut)
-			if err != nil {
-				enc.setError(err)
-				return
-			}
-			enc.sent[rt] = info.id
-		}
-	}
-}
-
-// sendTypeId sends the id, which must have already been defined.
-func (enc *Encoder) sendTypeId(state *encoderState, ut *userTypeInfo) {
-	// Identify the type of this top-level value.
-	state.encodeInt(int64(enc.sent[ut.base]))
-}
-
-// EncodeValue transmits the data item represented by the reflection value,
-// guaranteeing that all necessary type information has been transmitted first.
-func (enc *Encoder) EncodeValue(value reflect.Value) error {
-	// Gobs contain values. They cannot represent nil pointers, which
-	// have no value to encode.
-	if value.Kind() == reflect.Ptr && value.IsNil() {
-		panic("gob: cannot encode nil pointer of type " + value.Type().String())
-	}
-
-	// Make sure we're single-threaded through here, so multiple
-	// goroutines can share an encoder.
-	enc.mutex.Lock()
-	defer enc.mutex.Unlock()
-
-	// Remove any nested writers remaining due to previous errors.
-	enc.w = enc.w[0:1]
-
-	ut, err := validUserType(value.Type())
-	if err != nil {
-		return err
-	}
-
-	enc.err = nil
-	enc.byteBuf.Reset()
-	enc.byteBuf.Write(spaceForLength)
-	state := enc.newEncoderState(&enc.byteBuf)
-
-	enc.sendTypeDescriptor(enc.writer(), state, ut)
-	enc.sendTypeId(state, ut)
-	if enc.err != nil {
-		return enc.err
-	}
-
-	// Encode the object.
-	enc.encode(state.b, value, ut)
-	if enc.err == nil {
-		enc.writeMessage(enc.writer(), state.b)
-	}
-
-	enc.freeEncoderState(state)
-	return enc.err
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/encoder_test.go b/third_party/gofrontend/libgo/go/encoding/gob/encoder_test.go
deleted file mode 100644
index dc65734..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/encoder_test.go
+++ /dev/null
@@ -1,1020 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gob
-
-import (
-	"bytes"
-	"encoding/hex"
-	"fmt"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-// Test basic operations in a safe manner.
-func TestBasicEncoderDecoder(t *testing.T) {
-	var values = []interface{}{
-		true,
-		int(123),
-		int8(123),
-		int16(-12345),
-		int32(123456),
-		int64(-1234567),
-		uint(123),
-		uint8(123),
-		uint16(12345),
-		uint32(123456),
-		uint64(1234567),
-		uintptr(12345678),
-		float32(1.2345),
-		float64(1.2345678),
-		complex64(1.2345 + 2.3456i),
-		complex128(1.2345678 + 2.3456789i),
-		[]byte("hello"),
-		string("hello"),
-	}
-	for _, value := range values {
-		b := new(bytes.Buffer)
-		enc := NewEncoder(b)
-		err := enc.Encode(value)
-		if err != nil {
-			t.Error("encoder fail:", err)
-		}
-		dec := NewDecoder(b)
-		result := reflect.New(reflect.TypeOf(value))
-		err = dec.Decode(result.Interface())
-		if err != nil {
-			t.Fatalf("error decoding %T: %v:", reflect.TypeOf(value), err)
-		}
-		if !reflect.DeepEqual(value, result.Elem().Interface()) {
-			t.Fatalf("%T: expected %v got %v", value, value, result.Elem().Interface())
-		}
-	}
-}
-
-type ET0 struct {
-	A int
-	B string
-}
-
-type ET2 struct {
-	X string
-}
-
-type ET1 struct {
-	A    int
-	Et2  *ET2
-	Next *ET1
-}
-
-// Like ET1 but with a different name for a field
-type ET3 struct {
-	A             int
-	Et2           *ET2
-	DifferentNext *ET1
-}
-
-// Like ET1 but with a different type for a field
-type ET4 struct {
-	A    int
-	Et2  float64
-	Next int
-}
-
-func TestEncoderDecoder(t *testing.T) {
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	et0 := new(ET0)
-	et0.A = 7
-	et0.B = "gobs of fun"
-	err := enc.Encode(et0)
-	if err != nil {
-		t.Error("encoder fail:", err)
-	}
-	//fmt.Printf("% x %q\n", b, b)
-	//Debug(b)
-	dec := NewDecoder(b)
-	newEt0 := new(ET0)
-	err = dec.Decode(newEt0)
-	if err != nil {
-		t.Fatal("error decoding ET0:", err)
-	}
-
-	if !reflect.DeepEqual(et0, newEt0) {
-		t.Fatalf("invalid data for et0: expected %+v; got %+v", *et0, *newEt0)
-	}
-	if b.Len() != 0 {
-		t.Error("not at eof;", b.Len(), "bytes left")
-	}
-	//	t.FailNow()
-
-	b = new(bytes.Buffer)
-	enc = NewEncoder(b)
-	et1 := new(ET1)
-	et1.A = 7
-	et1.Et2 = new(ET2)
-	err = enc.Encode(et1)
-	if err != nil {
-		t.Error("encoder fail:", err)
-	}
-	dec = NewDecoder(b)
-	newEt1 := new(ET1)
-	err = dec.Decode(newEt1)
-	if err != nil {
-		t.Fatal("error decoding ET1:", err)
-	}
-
-	if !reflect.DeepEqual(et1, newEt1) {
-		t.Fatalf("invalid data for et1: expected %+v; got %+v", *et1, *newEt1)
-	}
-	if b.Len() != 0 {
-		t.Error("not at eof;", b.Len(), "bytes left")
-	}
-
-	enc.Encode(et1)
-	newEt1 = new(ET1)
-	err = dec.Decode(newEt1)
-	if err != nil {
-		t.Fatal("round 2: error decoding ET1:", err)
-	}
-	if !reflect.DeepEqual(et1, newEt1) {
-		t.Fatalf("round 2: invalid data for et1: expected %+v; got %+v", *et1, *newEt1)
-	}
-	if b.Len() != 0 {
-		t.Error("round 2: not at eof;", b.Len(), "bytes left")
-	}
-
-	// Now test with a running encoder/decoder pair that we recognize a type mismatch.
-	err = enc.Encode(et1)
-	if err != nil {
-		t.Error("round 3: encoder fail:", err)
-	}
-	newEt2 := new(ET2)
-	err = dec.Decode(newEt2)
-	if err == nil {
-		t.Fatal("round 3: expected `bad type' error decoding ET2")
-	}
-}
-
-// Run one value through the encoder/decoder, but use the wrong type.
-// Input is always an ET1; we compare it to whatever is under 'e'.
-func badTypeCheck(e interface{}, shouldFail bool, msg string, t *testing.T) {
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	et1 := new(ET1)
-	et1.A = 7
-	et1.Et2 = new(ET2)
-	err := enc.Encode(et1)
-	if err != nil {
-		t.Error("encoder fail:", err)
-	}
-	dec := NewDecoder(b)
-	err = dec.Decode(e)
-	if shouldFail && err == nil {
-		t.Error("expected error for", msg)
-	}
-	if !shouldFail && err != nil {
-		t.Error("unexpected error for", msg, err)
-	}
-}
-
-// Test that we recognize a bad type the first time.
-func TestWrongTypeDecoder(t *testing.T) {
-	badTypeCheck(new(ET2), true, "no fields in common", t)
-	badTypeCheck(new(ET3), false, "different name of field", t)
-	badTypeCheck(new(ET4), true, "different type of field", t)
-}
-
-// Types not supported at top level by the Encoder.
-var unsupportedValues = []interface{}{
-	make(chan int),
-	func(a int) bool { return true },
-}
-
-func TestUnsupported(t *testing.T) {
-	var b bytes.Buffer
-	enc := NewEncoder(&b)
-	for _, v := range unsupportedValues {
-		err := enc.Encode(v)
-		if err == nil {
-			t.Errorf("expected error for %T; got none", v)
-		}
-	}
-}
-
-func encAndDec(in, out interface{}) error {
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	err := enc.Encode(in)
-	if err != nil {
-		return err
-	}
-	dec := NewDecoder(b)
-	err = dec.Decode(out)
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-func TestTypeToPtrType(t *testing.T) {
-	// Encode a T, decode a *T
-	type Type0 struct {
-		A int
-	}
-	t0 := Type0{7}
-	t0p := new(Type0)
-	if err := encAndDec(t0, t0p); err != nil {
-		t.Error(err)
-	}
-}
-
-func TestPtrTypeToType(t *testing.T) {
-	// Encode a *T, decode a T
-	type Type1 struct {
-		A uint
-	}
-	t1p := &Type1{17}
-	var t1 Type1
-	if err := encAndDec(t1, t1p); err != nil {
-		t.Error(err)
-	}
-}
-
-func TestTypeToPtrPtrPtrPtrType(t *testing.T) {
-	type Type2 struct {
-		A ****float64
-	}
-	t2 := Type2{}
-	t2.A = new(***float64)
-	*t2.A = new(**float64)
-	**t2.A = new(*float64)
-	***t2.A = new(float64)
-	****t2.A = 27.4
-	t2pppp := new(***Type2)
-	if err := encAndDec(t2, t2pppp); err != nil {
-		t.Fatal(err)
-	}
-	if ****(****t2pppp).A != ****t2.A {
-		t.Errorf("wrong value after decode: %g not %g", ****(****t2pppp).A, ****t2.A)
-	}
-}
-
-func TestSlice(t *testing.T) {
-	type Type3 struct {
-		A []string
-	}
-	t3p := &Type3{[]string{"hello", "world"}}
-	var t3 Type3
-	if err := encAndDec(t3, t3p); err != nil {
-		t.Error(err)
-	}
-}
-
-func TestValueError(t *testing.T) {
-	// Encode a *T, decode a T
-	type Type4 struct {
-		A int
-	}
-	t4p := &Type4{3}
-	var t4 Type4 // note: not a pointer.
-	if err := encAndDec(t4p, t4); err == nil || strings.Index(err.Error(), "pointer") < 0 {
-		t.Error("expected error about pointer; got", err)
-	}
-}
-
-func TestArray(t *testing.T) {
-	type Type5 struct {
-		A [3]string
-		B [3]byte
-	}
-	type Type6 struct {
-		A [2]string // can't hold t5.a
-	}
-	t5 := Type5{[3]string{"hello", ",", "world"}, [3]byte{1, 2, 3}}
-	var t5p Type5
-	if err := encAndDec(t5, &t5p); err != nil {
-		t.Error(err)
-	}
-	var t6 Type6
-	if err := encAndDec(t5, &t6); err == nil {
-		t.Error("should fail with mismatched array sizes")
-	}
-}
-
-func TestRecursiveMapType(t *testing.T) {
-	type recursiveMap map[string]recursiveMap
-	r1 := recursiveMap{"A": recursiveMap{"B": nil, "C": nil}, "D": nil}
-	r2 := make(recursiveMap)
-	if err := encAndDec(r1, &r2); err != nil {
-		t.Error(err)
-	}
-}
-
-func TestRecursiveSliceType(t *testing.T) {
-	type recursiveSlice []recursiveSlice
-	r1 := recursiveSlice{0: recursiveSlice{0: nil}, 1: nil}
-	r2 := make(recursiveSlice, 0)
-	if err := encAndDec(r1, &r2); err != nil {
-		t.Error(err)
-	}
-}
-
-// Regression test for bug: must send zero values inside arrays
-func TestDefaultsInArray(t *testing.T) {
-	type Type7 struct {
-		B []bool
-		I []int
-		S []string
-		F []float64
-	}
-	t7 := Type7{
-		[]bool{false, false, true},
-		[]int{0, 0, 1},
-		[]string{"hi", "", "there"},
-		[]float64{0, 0, 1},
-	}
-	var t7p Type7
-	if err := encAndDec(t7, &t7p); err != nil {
-		t.Error(err)
-	}
-}
-
-var testInt int
-var testFloat32 float32
-var testString string
-var testSlice []string
-var testMap map[string]int
-var testArray [7]int
-
-type SingleTest struct {
-	in  interface{}
-	out interface{}
-	err string
-}
-
-var singleTests = []SingleTest{
-	{17, &testInt, ""},
-	{float32(17.5), &testFloat32, ""},
-	{"bike shed", &testString, ""},
-	{[]string{"bike", "shed", "paint", "color"}, &testSlice, ""},
-	{map[string]int{"seven": 7, "twelve": 12}, &testMap, ""},
-	{[7]int{4, 55, 0, 0, 0, 0, 0}, &testArray, ""}, // case that once triggered a bug
-	{[7]int{4, 55, 1, 44, 22, 66, 1234}, &testArray, ""},
-
-	// Decode errors
-	{172, &testFloat32, "type"},
-}
-
-func TestSingletons(t *testing.T) {
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	dec := NewDecoder(b)
-	for _, test := range singleTests {
-		b.Reset()
-		err := enc.Encode(test.in)
-		if err != nil {
-			t.Errorf("error encoding %v: %s", test.in, err)
-			continue
-		}
-		err = dec.Decode(test.out)
-		switch {
-		case err != nil && test.err == "":
-			t.Errorf("error decoding %v: %s", test.in, err)
-			continue
-		case err == nil && test.err != "":
-			t.Errorf("expected error decoding %v: %s", test.in, test.err)
-			continue
-		case err != nil && test.err != "":
-			if strings.Index(err.Error(), test.err) < 0 {
-				t.Errorf("wrong error decoding %v: wanted %s, got %v", test.in, test.err, err)
-			}
-			continue
-		}
-		// Get rid of the pointer in the rhs
-		val := reflect.ValueOf(test.out).Elem().Interface()
-		if !reflect.DeepEqual(test.in, val) {
-			t.Errorf("decoding singleton: expected %v got %v", test.in, val)
-		}
-	}
-}
-
-func TestStructNonStruct(t *testing.T) {
-	type Struct struct {
-		A string
-	}
-	type NonStruct string
-	s := Struct{"hello"}
-	var sp Struct
-	if err := encAndDec(s, &sp); err != nil {
-		t.Error(err)
-	}
-	var ns NonStruct
-	if err := encAndDec(s, &ns); err == nil {
-		t.Error("should get error for struct/non-struct")
-	} else if strings.Index(err.Error(), "type") < 0 {
-		t.Error("for struct/non-struct expected type error; got", err)
-	}
-	// Now try the other way
-	var nsp NonStruct
-	if err := encAndDec(ns, &nsp); err != nil {
-		t.Error(err)
-	}
-	if err := encAndDec(ns, &s); err == nil {
-		t.Error("should get error for non-struct/struct")
-	} else if strings.Index(err.Error(), "type") < 0 {
-		t.Error("for non-struct/struct expected type error; got", err)
-	}
-}
-
-type interfaceIndirectTestI interface {
-	F() bool
-}
-
-type interfaceIndirectTestT struct{}
-
-func (this *interfaceIndirectTestT) F() bool {
-	return true
-}
-
-// A version of a bug reported on golang-nuts.  Also tests top-level
-// slice of interfaces.  The issue was registering *T caused T to be
-// stored as the concrete type.
-func TestInterfaceIndirect(t *testing.T) {
-	Register(&interfaceIndirectTestT{})
-	b := new(bytes.Buffer)
-	w := []interfaceIndirectTestI{&interfaceIndirectTestT{}}
-	err := NewEncoder(b).Encode(w)
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-
-	var r []interfaceIndirectTestI
-	err = NewDecoder(b).Decode(&r)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-}
-
-// Now follow various tests that decode into things that can't represent the
-// encoded value, all of which should be legal.
-
-// Also, when the ignored object contains an interface value, it may define
-// types. Make sure that skipping the value still defines the types by using
-// the encoder/decoder pair to send a value afterwards.  If an interface
-// is sent, its type in the test is always NewType0, so this checks that the
-// encoder and decoder don't skew with respect to type definitions.
-
-type Struct0 struct {
-	I interface{}
-}
-
-type NewType0 struct {
-	S string
-}
-
-type ignoreTest struct {
-	in, out interface{}
-}
-
-var ignoreTests = []ignoreTest{
-	// Decode normal struct into an empty struct
-	{&struct{ A int }{23}, &struct{}{}},
-	// Decode normal struct into a nil.
-	{&struct{ A int }{23}, nil},
-	// Decode singleton string into a nil.
-	{"hello, world", nil},
-	// Decode singleton slice into a nil.
-	{[]int{1, 2, 3, 4}, nil},
-	// Decode struct containing an interface into a nil.
-	{&Struct0{&NewType0{"value0"}}, nil},
-	// Decode singleton slice of interfaces into a nil.
-	{[]interface{}{"hi", &NewType0{"value1"}, 23}, nil},
-}
-
-func TestDecodeIntoNothing(t *testing.T) {
-	Register(new(NewType0))
-	for i, test := range ignoreTests {
-		b := new(bytes.Buffer)
-		enc := NewEncoder(b)
-		err := enc.Encode(test.in)
-		if err != nil {
-			t.Errorf("%d: encode error %s:", i, err)
-			continue
-		}
-		dec := NewDecoder(b)
-		err = dec.Decode(test.out)
-		if err != nil {
-			t.Errorf("%d: decode error: %s", i, err)
-			continue
-		}
-		// Now see if the encoder and decoder are in a consistent state.
-		str := fmt.Sprintf("Value %d", i)
-		err = enc.Encode(&NewType0{str})
-		if err != nil {
-			t.Fatalf("%d: NewType0 encode error: %s", i, err)
-		}
-		ns := new(NewType0)
-		err = dec.Decode(ns)
-		if err != nil {
-			t.Fatalf("%d: NewType0 decode error: %s", i, err)
-		}
-		if ns.S != str {
-			t.Fatalf("%d: expected %q got %q", i, str, ns.S)
-		}
-	}
-}
-
-func TestIgnoreRecursiveType(t *testing.T) {
-	// It's hard to build a self-contained test for this because
-	// we can't build compatible types in one package with
-	// different items so something is ignored. Here is
-	// some data that represents, according to debug.go:
-	// type definition {
-	//	slice "recursiveSlice" id=106
-	//		elem id=106
-	// }
-	data := []byte{
-		0x1d, 0xff, 0xd3, 0x02, 0x01, 0x01, 0x0e, 0x72,
-		0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65,
-		0x53, 0x6c, 0x69, 0x63, 0x65, 0x01, 0xff, 0xd4,
-		0x00, 0x01, 0xff, 0xd4, 0x00, 0x00, 0x07, 0xff,
-		0xd4, 0x00, 0x02, 0x01, 0x00, 0x00,
-	}
-	dec := NewDecoder(bytes.NewReader(data))
-	// Issue 10415: This caused infinite recursion.
-	err := dec.Decode(nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-// Another bug from golang-nuts, involving nested interfaces.
-type Bug0Outer struct {
-	Bug0Field interface{}
-}
-
-type Bug0Inner struct {
-	A int
-}
-
-func TestNestedInterfaces(t *testing.T) {
-	var buf bytes.Buffer
-	e := NewEncoder(&buf)
-	d := NewDecoder(&buf)
-	Register(new(Bug0Outer))
-	Register(new(Bug0Inner))
-	f := &Bug0Outer{&Bug0Outer{&Bug0Inner{7}}}
-	var v interface{} = f
-	err := e.Encode(&v)
-	if err != nil {
-		t.Fatal("Encode:", err)
-	}
-	err = d.Decode(&v)
-	if err != nil {
-		t.Fatal("Decode:", err)
-	}
-	// Make sure it decoded correctly.
-	outer1, ok := v.(*Bug0Outer)
-	if !ok {
-		t.Fatalf("v not Bug0Outer: %T", v)
-	}
-	outer2, ok := outer1.Bug0Field.(*Bug0Outer)
-	if !ok {
-		t.Fatalf("v.Bug0Field not Bug0Outer: %T", outer1.Bug0Field)
-	}
-	inner, ok := outer2.Bug0Field.(*Bug0Inner)
-	if !ok {
-		t.Fatalf("v.Bug0Field.Bug0Field not Bug0Inner: %T", outer2.Bug0Field)
-	}
-	if inner.A != 7 {
-		t.Fatalf("final value %d; expected %d", inner.A, 7)
-	}
-}
-
-// The bugs keep coming. We forgot to send map subtypes before the map.
-
-type Bug1Elem struct {
-	Name string
-	Id   int
-}
-
-type Bug1StructMap map[string]Bug1Elem
-
-func bug1EncDec(in Bug1StructMap, out *Bug1StructMap) error {
-	return nil
-}
-
-func TestMapBug1(t *testing.T) {
-	in := make(Bug1StructMap)
-	in["val1"] = Bug1Elem{"elem1", 1}
-	in["val2"] = Bug1Elem{"elem2", 2}
-
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	err := enc.Encode(in)
-	if err != nil {
-		t.Fatal("encode:", err)
-	}
-	dec := NewDecoder(b)
-	out := make(Bug1StructMap)
-	err = dec.Decode(&out)
-	if err != nil {
-		t.Fatal("decode:", err)
-	}
-	if !reflect.DeepEqual(in, out) {
-		t.Errorf("mismatch: %v %v", in, out)
-	}
-}
-
-func TestGobMapInterfaceEncode(t *testing.T) {
-	m := map[string]interface{}{
-		"up": uintptr(0),
-		"i0": []int{-1},
-		"i1": []int8{-1},
-		"i2": []int16{-1},
-		"i3": []int32{-1},
-		"i4": []int64{-1},
-		"u0": []uint{1},
-		"u1": []uint8{1},
-		"u2": []uint16{1},
-		"u3": []uint32{1},
-		"u4": []uint64{1},
-		"f0": []float32{1},
-		"f1": []float64{1},
-		"c0": []complex64{complex(2, -2)},
-		"c1": []complex128{complex(2, float64(-2))},
-		"us": []uintptr{0},
-		"bo": []bool{false},
-		"st": []string{"s"},
-	}
-	enc := NewEncoder(new(bytes.Buffer))
-	err := enc.Encode(m)
-	if err != nil {
-		t.Errorf("encode map: %s", err)
-	}
-}
-
-func TestSliceReusesMemory(t *testing.T) {
-	buf := new(bytes.Buffer)
-	// Bytes
-	{
-		x := []byte("abcd")
-		enc := NewEncoder(buf)
-		err := enc.Encode(x)
-		if err != nil {
-			t.Errorf("bytes: encode: %s", err)
-		}
-		// Decode into y, which is big enough.
-		y := []byte("ABCDE")
-		addr := &y[0]
-		dec := NewDecoder(buf)
-		err = dec.Decode(&y)
-		if err != nil {
-			t.Fatal("bytes: decode:", err)
-		}
-		if !bytes.Equal(x, y) {
-			t.Errorf("bytes: expected %q got %q\n", x, y)
-		}
-		if addr != &y[0] {
-			t.Errorf("bytes: unnecessary reallocation")
-		}
-	}
-	// general slice
-	{
-		x := []rune("abcd")
-		enc := NewEncoder(buf)
-		err := enc.Encode(x)
-		if err != nil {
-			t.Errorf("ints: encode: %s", err)
-		}
-		// Decode into y, which is big enough.
-		y := []rune("ABCDE")
-		addr := &y[0]
-		dec := NewDecoder(buf)
-		err = dec.Decode(&y)
-		if err != nil {
-			t.Fatal("ints: decode:", err)
-		}
-		if !reflect.DeepEqual(x, y) {
-			t.Errorf("ints: expected %q got %q\n", x, y)
-		}
-		if addr != &y[0] {
-			t.Errorf("ints: unnecessary reallocation")
-		}
-	}
-}
-
-// Used to crash: negative count in recvMessage.
-func TestBadCount(t *testing.T) {
-	b := []byte{0xfb, 0xa5, 0x82, 0x2f, 0xca, 0x1}
-	if err := NewDecoder(bytes.NewReader(b)).Decode(nil); err == nil {
-		t.Error("expected error from bad count")
-	} else if err.Error() != errBadCount.Error() {
-		t.Error("expected bad count error; got", err)
-	}
-}
-
-// Verify that sequential Decoders built on a single input will
-// succeed if the input implements ReadByte and there is no
-// type information in the stream.
-func TestSequentialDecoder(t *testing.T) {
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	const count = 10
-	for i := 0; i < count; i++ {
-		s := fmt.Sprintf("%d", i)
-		if err := enc.Encode(s); err != nil {
-			t.Error("encoder fail:", err)
-		}
-	}
-	for i := 0; i < count; i++ {
-		dec := NewDecoder(b)
-		var s string
-		if err := dec.Decode(&s); err != nil {
-			t.Fatal("decoder fail:", err)
-		}
-		if s != fmt.Sprintf("%d", i) {
-			t.Fatalf("decode expected %d got %s", i, s)
-		}
-	}
-}
-
-// Should be able to have unrepresentable fields (chan, func, *chan etc.); we just ignore them.
-type Bug2 struct {
-	A   int
-	C   chan int
-	CP  *chan int
-	F   func()
-	FPP **func()
-}
-
-func TestChanFuncIgnored(t *testing.T) {
-	c := make(chan int)
-	f := func() {}
-	fp := &f
-	b0 := Bug2{23, c, &c, f, &fp}
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-	if err := enc.Encode(b0); err != nil {
-		t.Fatal("error encoding:", err)
-	}
-	var b1 Bug2
-	err := NewDecoder(&buf).Decode(&b1)
-	if err != nil {
-		t.Fatal("decode:", err)
-	}
-	if b1.A != b0.A {
-		t.Fatalf("got %d want %d", b1.A, b0.A)
-	}
-	if b1.C != nil || b1.CP != nil || b1.F != nil || b1.FPP != nil {
-		t.Fatal("unexpected value for chan or func")
-	}
-}
-
-func TestSliceIncompatibility(t *testing.T) {
-	var in = []byte{1, 2, 3}
-	var out []int
-	if err := encAndDec(in, &out); err == nil {
-		t.Error("expected compatibility error")
-	}
-}
-
-// Mutually recursive slices of structs caused problems.
-type Bug3 struct {
-	Num      int
-	Children []*Bug3
-}
-
-func TestGobPtrSlices(t *testing.T) {
-	in := []*Bug3{
-		{1, nil},
-		{2, nil},
-	}
-	b := new(bytes.Buffer)
-	err := NewEncoder(b).Encode(&in)
-	if err != nil {
-		t.Fatal("encode:", err)
-	}
-
-	var out []*Bug3
-	err = NewDecoder(b).Decode(&out)
-	if err != nil {
-		t.Fatal("decode:", err)
-	}
-	if !reflect.DeepEqual(in, out) {
-		t.Fatalf("got %v; wanted %v", out, in)
-	}
-}
-
-// getDecEnginePtr cached engine for ut.base instead of ut.user so we passed
-// a *map and then tried to reuse its engine to decode the inner map.
-func TestPtrToMapOfMap(t *testing.T) {
-	Register(make(map[string]interface{}))
-	subdata := make(map[string]interface{})
-	subdata["bar"] = "baz"
-	data := make(map[string]interface{})
-	data["foo"] = subdata
-
-	b := new(bytes.Buffer)
-	err := NewEncoder(b).Encode(data)
-	if err != nil {
-		t.Fatal("encode:", err)
-	}
-	var newData map[string]interface{}
-	err = NewDecoder(b).Decode(&newData)
-	if err != nil {
-		t.Fatal("decode:", err)
-	}
-	if !reflect.DeepEqual(data, newData) {
-		t.Fatalf("expected %v got %v", data, newData)
-	}
-}
-
-// A top-level nil pointer generates a panic with a helpful string-valued message.
-func TestTopLevelNilPointer(t *testing.T) {
-	errMsg := topLevelNilPanic(t)
-	if errMsg == "" {
-		t.Fatal("top-level nil pointer did not panic")
-	}
-	if !strings.Contains(errMsg, "nil pointer") {
-		t.Fatal("expected nil pointer error, got:", errMsg)
-	}
-}
-
-func topLevelNilPanic(t *testing.T) (panicErr string) {
-	defer func() {
-		e := recover()
-		if err, ok := e.(string); ok {
-			panicErr = err
-		}
-	}()
-	var ip *int
-	buf := new(bytes.Buffer)
-	if err := NewEncoder(buf).Encode(ip); err != nil {
-		t.Fatal("error in encode:", err)
-	}
-	return
-}
-
-func TestNilPointerInsideInterface(t *testing.T) {
-	var ip *int
-	si := struct {
-		I interface{}
-	}{
-		I: ip,
-	}
-	buf := new(bytes.Buffer)
-	err := NewEncoder(buf).Encode(si)
-	if err == nil {
-		t.Fatal("expected error, got none")
-	}
-	errMsg := err.Error()
-	if !strings.Contains(errMsg, "nil pointer") || !strings.Contains(errMsg, "interface") {
-		t.Fatal("expected error about nil pointer and interface, got:", errMsg)
-	}
-}
-
-type Bug4Public struct {
-	Name   string
-	Secret Bug4Secret
-}
-
-type Bug4Secret struct {
-	a int // error: no exported fields.
-}
-
-// Test that a failed compilation doesn't leave around an executable encoder.
-// Issue 3273.
-func TestMutipleEncodingsOfBadType(t *testing.T) {
-	x := Bug4Public{
-		Name:   "name",
-		Secret: Bug4Secret{1},
-	}
-	buf := new(bytes.Buffer)
-	enc := NewEncoder(buf)
-	err := enc.Encode(x)
-	if err == nil {
-		t.Fatal("first encoding: expected error")
-	}
-	buf.Reset()
-	enc = NewEncoder(buf)
-	err = enc.Encode(x)
-	if err == nil {
-		t.Fatal("second encoding: expected error")
-	}
-	if !strings.Contains(err.Error(), "no exported fields") {
-		t.Errorf("expected error about no exported fields; got %v", err)
-	}
-}
-
-// There was an error check comparing the length of the input with the
-// length of the slice being decoded. It was wrong because the next
-// thing in the input might be a type definition, which would lead to
-// an incorrect length check.  This test reproduces the corner case.
-
-type Z struct {
-}
-
-func Test29ElementSlice(t *testing.T) {
-	Register(Z{})
-	src := make([]interface{}, 100) // Size needs to be bigger than size of type definition.
-	for i := range src {
-		src[i] = Z{}
-	}
-	buf := new(bytes.Buffer)
-	err := NewEncoder(buf).Encode(src)
-	if err != nil {
-		t.Fatalf("encode: %v", err)
-		return
-	}
-
-	var dst []interface{}
-	err = NewDecoder(buf).Decode(&dst)
-	if err != nil {
-		t.Errorf("decode: %v", err)
-		return
-	}
-}
-
-// Don't crash, just give error when allocating a huge slice.
-// Issue 8084.
-func TestErrorForHugeSlice(t *testing.T) {
-	// Encode an int slice.
-	buf := new(bytes.Buffer)
-	slice := []int{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
-	err := NewEncoder(buf).Encode(slice)
-	if err != nil {
-		t.Fatal("encode:", err)
-	}
-	// Reach into the buffer and smash the count to make the encoded slice very long.
-	buf.Bytes()[buf.Len()-len(slice)-1] = 0xfa
-	// Decode and see error.
-	err = NewDecoder(buf).Decode(&slice)
-	if err == nil {
-		t.Fatal("decode: no error")
-	}
-	if !strings.Contains(err.Error(), "slice too big") {
-		t.Fatalf("decode: expected slice too big error, got %s", err.Error())
-	}
-}
-
-type badDataTest struct {
-	input string      // The input encoded as a hex string.
-	error string      // A substring of the error that should result.
-	data  interface{} // What to decode into.
-}
-
-var badDataTests = []badDataTest{
-	{"", "EOF", nil},
-	{"7F6869", "unexpected EOF", nil},
-	{"036e6f77206973207468652074696d6520666f7220616c6c20676f6f64206d656e", "unknown type id", new(ET2)},
-	{"0424666f6f", "field numbers out of bounds", new(ET2)}, // Issue 6323.
-	{"05100028557b02027f8302", "interface encoding", nil},   // Issue 10270.
-	// Issue 10273.
-	{"130a00fb5dad0bf8ff020263e70002fa28020202a89859", "slice length too large", nil},
-	{"0f1000fb285d003316020735ff023a65c5", "interface encoding", nil},
-	{"03fffb0616fffc00f902ff02ff03bf005d02885802a311a8120228022c028ee7", "GobDecoder", nil},
-	// Issue 10491.
-	{"10fe010f020102fe01100001fe010e000016fe010d030102fe010e00010101015801fe01100000000bfe011000f85555555555555555", "length exceeds input size", nil},
-}
-
-// TestBadData tests that various problems caused by malformed input
-// are caught as errors and do not cause panics.
-func TestBadData(t *testing.T) {
-	for i, test := range badDataTests {
-		data, err := hex.DecodeString(test.input)
-		if err != nil {
-			t.Fatalf("#%d: hex error: %s", i, err)
-		}
-		d := NewDecoder(bytes.NewReader(data))
-		err = d.Decode(test.data)
-		if err == nil {
-			t.Errorf("decode: no error")
-			continue
-		}
-		if !strings.Contains(err.Error(), test.error) {
-			t.Errorf("#%d: decode: expected %q error, got %s", i, test.error, err.Error())
-		}
-	}
-}
-
-// TestHugeWriteFails tests that enormous messages trigger an error.
-func TestHugeWriteFails(t *testing.T) {
-	if testing.Short() {
-		// Requires allocating a monster, so don't do this from all.bash.
-		t.Skip("skipping huge allocation in short mode")
-	}
-	huge := make([]byte, tooBig)
-	huge[0] = 7 // Make sure it's not all zeros.
-	buf := new(bytes.Buffer)
-	err := NewEncoder(buf).Encode(huge)
-	if err == nil {
-		t.Fatalf("expected error for huge slice")
-	}
-	if !strings.Contains(err.Error(), "message too big") {
-		t.Fatalf("expected 'too big' error; got %s\n", err.Error())
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/error.go b/third_party/gofrontend/libgo/go/encoding/gob/error.go
deleted file mode 100644
index 92cc0c6..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/error.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gob
-
-import "fmt"
-
-// Errors in decoding and encoding are handled using panic and recover.
-// Panics caused by user error (that is, everything except run-time panics
-// such as "index out of bounds" errors) do not leave the file that caused
-// them, but are instead turned into plain error returns.  Encoding and
-// decoding functions and methods that do not return an error either use
-// panic to report an error or are guaranteed error-free.
-
-// A gobError is used to distinguish errors (panics) generated in this package.
-type gobError struct {
-	err error
-}
-
-// errorf is like error_ but takes Printf-style arguments to construct an error.
-// It always prefixes the message with "gob: ".
-func errorf(format string, args ...interface{}) {
-	error_(fmt.Errorf("gob: "+format, args...))
-}
-
-// error wraps the argument error and uses it as the argument to panic.
-func error_(err error) {
-	panic(gobError{err})
-}
-
-// catchError is meant to be used as a deferred function to turn a panic(gobError) into a
-// plain error.  It overwrites the error return of the function that deferred its call.
-func catchError(err *error) {
-	if e := recover(); e != nil {
-		ge, ok := e.(gobError)
-		if !ok {
-			panic(e)
-		}
-		*err = ge.err
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/gobencdec_test.go b/third_party/gofrontend/libgo/go/encoding/gob/gobencdec_test.go
deleted file mode 100644
index eb76b48..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/gobencdec_test.go
+++ /dev/null
@@ -1,798 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests of the GobEncoder/GobDecoder support.
-
-package gob
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"net"
-	"strings"
-	"testing"
-	"time"
-)
-
-// Types that implement the GobEncoder/Decoder interfaces.
-
-type ByteStruct struct {
-	a byte // not an exported field
-}
-
-type StringStruct struct {
-	s string // not an exported field
-}
-
-type ArrayStruct struct {
-	a [8192]byte // not an exported field
-}
-
-type Gobber int
-
-type ValueGobber string // encodes with a value, decodes with a pointer.
-
-type BinaryGobber int
-
-type BinaryValueGobber string
-
-type TextGobber int
-
-type TextValueGobber string
-
-// The relevant methods
-
-func (g *ByteStruct) GobEncode() ([]byte, error) {
-	b := make([]byte, 3)
-	b[0] = g.a
-	b[1] = g.a + 1
-	b[2] = g.a + 2
-	return b, nil
-}
-
-func (g *ByteStruct) GobDecode(data []byte) error {
-	if g == nil {
-		return errors.New("NIL RECEIVER")
-	}
-	// Expect N sequential-valued bytes.
-	if len(data) == 0 {
-		return io.EOF
-	}
-	g.a = data[0]
-	for i, c := range data {
-		if c != g.a+byte(i) {
-			return errors.New("invalid data sequence")
-		}
-	}
-	return nil
-}
-
-func (g *StringStruct) GobEncode() ([]byte, error) {
-	return []byte(g.s), nil
-}
-
-func (g *StringStruct) GobDecode(data []byte) error {
-	// Expect N sequential-valued bytes.
-	if len(data) == 0 {
-		return io.EOF
-	}
-	a := data[0]
-	for i, c := range data {
-		if c != a+byte(i) {
-			return errors.New("invalid data sequence")
-		}
-	}
-	g.s = string(data)
-	return nil
-}
-
-func (a *ArrayStruct) GobEncode() ([]byte, error) {
-	return a.a[:], nil
-}
-
-func (a *ArrayStruct) GobDecode(data []byte) error {
-	if len(data) != len(a.a) {
-		return errors.New("wrong length in array decode")
-	}
-	copy(a.a[:], data)
-	return nil
-}
-
-func (g *Gobber) GobEncode() ([]byte, error) {
-	return []byte(fmt.Sprintf("VALUE=%d", *g)), nil
-}
-
-func (g *Gobber) GobDecode(data []byte) error {
-	_, err := fmt.Sscanf(string(data), "VALUE=%d", (*int)(g))
-	return err
-}
-
-func (g *BinaryGobber) MarshalBinary() ([]byte, error) {
-	return []byte(fmt.Sprintf("VALUE=%d", *g)), nil
-}
-
-func (g *BinaryGobber) UnmarshalBinary(data []byte) error {
-	_, err := fmt.Sscanf(string(data), "VALUE=%d", (*int)(g))
-	return err
-}
-
-func (g *TextGobber) MarshalText() ([]byte, error) {
-	return []byte(fmt.Sprintf("VALUE=%d", *g)), nil
-}
-
-func (g *TextGobber) UnmarshalText(data []byte) error {
-	_, err := fmt.Sscanf(string(data), "VALUE=%d", (*int)(g))
-	return err
-}
-
-func (v ValueGobber) GobEncode() ([]byte, error) {
-	return []byte(fmt.Sprintf("VALUE=%s", v)), nil
-}
-
-func (v *ValueGobber) GobDecode(data []byte) error {
-	_, err := fmt.Sscanf(string(data), "VALUE=%s", (*string)(v))
-	return err
-}
-
-func (v BinaryValueGobber) MarshalBinary() ([]byte, error) {
-	return []byte(fmt.Sprintf("VALUE=%s", v)), nil
-}
-
-func (v *BinaryValueGobber) UnmarshalBinary(data []byte) error {
-	_, err := fmt.Sscanf(string(data), "VALUE=%s", (*string)(v))
-	return err
-}
-
-func (v TextValueGobber) MarshalText() ([]byte, error) {
-	return []byte(fmt.Sprintf("VALUE=%s", v)), nil
-}
-
-func (v *TextValueGobber) UnmarshalText(data []byte) error {
-	_, err := fmt.Sscanf(string(data), "VALUE=%s", (*string)(v))
-	return err
-}
-
-// Structs that include GobEncodable fields.
-
-type GobTest0 struct {
-	X int // guarantee we have  something in common with GobTest*
-	G *ByteStruct
-}
-
-type GobTest1 struct {
-	X int // guarantee we have  something in common with GobTest*
-	G *StringStruct
-}
-
-type GobTest2 struct {
-	X int    // guarantee we have  something in common with GobTest*
-	G string // not a GobEncoder - should give us errors
-}
-
-type GobTest3 struct {
-	X int // guarantee we have  something in common with GobTest*
-	G *Gobber
-	B *BinaryGobber
-	T *TextGobber
-}
-
-type GobTest4 struct {
-	X  int // guarantee we have  something in common with GobTest*
-	V  ValueGobber
-	BV BinaryValueGobber
-	TV TextValueGobber
-}
-
-type GobTest5 struct {
-	X  int // guarantee we have  something in common with GobTest*
-	V  *ValueGobber
-	BV *BinaryValueGobber
-	TV *TextValueGobber
-}
-
-type GobTest6 struct {
-	X  int // guarantee we have  something in common with GobTest*
-	V  ValueGobber
-	W  *ValueGobber
-	BV BinaryValueGobber
-	BW *BinaryValueGobber
-	TV TextValueGobber
-	TW *TextValueGobber
-}
-
-type GobTest7 struct {
-	X  int // guarantee we have  something in common with GobTest*
-	V  *ValueGobber
-	W  ValueGobber
-	BV *BinaryValueGobber
-	BW BinaryValueGobber
-	TV *TextValueGobber
-	TW TextValueGobber
-}
-
-type GobTestIgnoreEncoder struct {
-	X int // guarantee we have  something in common with GobTest*
-}
-
-type GobTestValueEncDec struct {
-	X int          // guarantee we have  something in common with GobTest*
-	G StringStruct // not a pointer.
-}
-
-type GobTestIndirectEncDec struct {
-	X int             // guarantee we have  something in common with GobTest*
-	G ***StringStruct // indirections to the receiver.
-}
-
-type GobTestArrayEncDec struct {
-	X int         // guarantee we have  something in common with GobTest*
-	A ArrayStruct // not a pointer.
-}
-
-type GobTestIndirectArrayEncDec struct {
-	X int            // guarantee we have  something in common with GobTest*
-	A ***ArrayStruct // indirections to a large receiver.
-}
-
-func TestGobEncoderField(t *testing.T) {
-	b := new(bytes.Buffer)
-	// First a field that's a structure.
-	enc := NewEncoder(b)
-	err := enc.Encode(GobTest0{17, &ByteStruct{'A'}})
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := new(GobTest0)
-	err = dec.Decode(x)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if x.G.a != 'A' {
-		t.Errorf("expected 'A' got %c", x.G.a)
-	}
-	// Now a field that's not a structure.
-	b.Reset()
-	gobber := Gobber(23)
-	bgobber := BinaryGobber(24)
-	tgobber := TextGobber(25)
-	err = enc.Encode(GobTest3{17, &gobber, &bgobber, &tgobber})
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	y := new(GobTest3)
-	err = dec.Decode(y)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if *y.G != 23 || *y.B != 24 || *y.T != 25 {
-		t.Errorf("expected '23 got %d", *y.G)
-	}
-}
-
-// Even though the field is a value, we can still take its address
-// and should be able to call the methods.
-func TestGobEncoderValueField(t *testing.T) {
-	b := new(bytes.Buffer)
-	// First a field that's a structure.
-	enc := NewEncoder(b)
-	err := enc.Encode(&GobTestValueEncDec{17, StringStruct{"HIJKL"}})
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := new(GobTestValueEncDec)
-	err = dec.Decode(x)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if x.G.s != "HIJKL" {
-		t.Errorf("expected `HIJKL` got %s", x.G.s)
-	}
-}
-
-// GobEncode/Decode should work even if the value is
-// more indirect than the receiver.
-func TestGobEncoderIndirectField(t *testing.T) {
-	b := new(bytes.Buffer)
-	// First a field that's a structure.
-	enc := NewEncoder(b)
-	s := &StringStruct{"HIJKL"}
-	sp := &s
-	err := enc.Encode(GobTestIndirectEncDec{17, &sp})
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := new(GobTestIndirectEncDec)
-	err = dec.Decode(x)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if (***x.G).s != "HIJKL" {
-		t.Errorf("expected `HIJKL` got %s", (***x.G).s)
-	}
-}
-
-// Test with a large field with methods.
-func TestGobEncoderArrayField(t *testing.T) {
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	var a GobTestArrayEncDec
-	a.X = 17
-	for i := range a.A.a {
-		a.A.a[i] = byte(i)
-	}
-	err := enc.Encode(&a)
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := new(GobTestArrayEncDec)
-	err = dec.Decode(x)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	for i, v := range x.A.a {
-		if v != byte(i) {
-			t.Errorf("expected %x got %x", byte(i), v)
-			break
-		}
-	}
-}
-
-// Test an indirection to a large field with methods.
-func TestGobEncoderIndirectArrayField(t *testing.T) {
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	var a GobTestIndirectArrayEncDec
-	a.X = 17
-	var array ArrayStruct
-	ap := &array
-	app := &ap
-	a.A = &app
-	for i := range array.a {
-		array.a[i] = byte(i)
-	}
-	err := enc.Encode(a)
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := new(GobTestIndirectArrayEncDec)
-	err = dec.Decode(x)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	for i, v := range (***x.A).a {
-		if v != byte(i) {
-			t.Errorf("expected %x got %x", byte(i), v)
-			break
-		}
-	}
-}
-
-// As long as the fields have the same name and implement the
-// interface, we can cross-connect them.  Not sure it's useful
-// and may even be bad but it works and it's hard to prevent
-// without exposing the contents of the object, which would
-// defeat the purpose.
-func TestGobEncoderFieldsOfDifferentType(t *testing.T) {
-	// first, string in field to byte in field
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	err := enc.Encode(GobTest1{17, &StringStruct{"ABC"}})
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := new(GobTest0)
-	err = dec.Decode(x)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if x.G.a != 'A' {
-		t.Errorf("expected 'A' got %c", x.G.a)
-	}
-	// now the other direction, byte in field to string in field
-	b.Reset()
-	err = enc.Encode(GobTest0{17, &ByteStruct{'X'}})
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	y := new(GobTest1)
-	err = dec.Decode(y)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if y.G.s != "XYZ" {
-		t.Fatalf("expected `XYZ` got %q", y.G.s)
-	}
-}
-
-// Test that we can encode a value and decode into a pointer.
-func TestGobEncoderValueEncoder(t *testing.T) {
-	// first, string in field to byte in field
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	err := enc.Encode(GobTest4{17, ValueGobber("hello"), BinaryValueGobber("Καλημέρα"), TextValueGobber("こんにちは")})
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := new(GobTest5)
-	err = dec.Decode(x)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if *x.V != "hello" || *x.BV != "Καλημέρα" || *x.TV != "こんにちは" {
-		t.Errorf("expected `hello` got %s", *x.V)
-	}
-}
-
-// Test that we can use a value then a pointer type of a GobEncoder
-// in the same encoded value.  Bug 4647.
-func TestGobEncoderValueThenPointer(t *testing.T) {
-	v := ValueGobber("forty-two")
-	w := ValueGobber("six-by-nine")
-	bv := BinaryValueGobber("1nanocentury")
-	bw := BinaryValueGobber("πseconds")
-	tv := TextValueGobber("gravitationalacceleration")
-	tw := TextValueGobber("π²ft/s²")
-
-	// this was a bug: encoding a GobEncoder by value before a GobEncoder
-	// pointer would cause duplicate type definitions to be sent.
-
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	if err := enc.Encode(GobTest6{42, v, &w, bv, &bw, tv, &tw}); err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := new(GobTest6)
-	if err := dec.Decode(x); err != nil {
-		t.Fatal("decode error:", err)
-	}
-
-	if got, want := x.V, v; got != want {
-		t.Errorf("v = %q, want %q", got, want)
-	}
-	if got, want := x.W, w; got == nil {
-		t.Errorf("w = nil, want %q", want)
-	} else if *got != want {
-		t.Errorf("w = %q, want %q", *got, want)
-	}
-
-	if got, want := x.BV, bv; got != want {
-		t.Errorf("bv = %q, want %q", got, want)
-	}
-	if got, want := x.BW, bw; got == nil {
-		t.Errorf("bw = nil, want %q", want)
-	} else if *got != want {
-		t.Errorf("bw = %q, want %q", *got, want)
-	}
-
-	if got, want := x.TV, tv; got != want {
-		t.Errorf("tv = %q, want %q", got, want)
-	}
-	if got, want := x.TW, tw; got == nil {
-		t.Errorf("tw = nil, want %q", want)
-	} else if *got != want {
-		t.Errorf("tw = %q, want %q", *got, want)
-	}
-}
-
-// Test that we can use a pointer then a value type of a GobEncoder
-// in the same encoded value.
-func TestGobEncoderPointerThenValue(t *testing.T) {
-	v := ValueGobber("forty-two")
-	w := ValueGobber("six-by-nine")
-	bv := BinaryValueGobber("1nanocentury")
-	bw := BinaryValueGobber("πseconds")
-	tv := TextValueGobber("gravitationalacceleration")
-	tw := TextValueGobber("π²ft/s²")
-
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	if err := enc.Encode(GobTest7{42, &v, w, &bv, bw, &tv, tw}); err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := new(GobTest7)
-	if err := dec.Decode(x); err != nil {
-		t.Fatal("decode error:", err)
-	}
-
-	if got, want := x.V, v; got == nil {
-		t.Errorf("v = nil, want %q", want)
-	} else if *got != want {
-		t.Errorf("v = %q, want %q", *got, want)
-	}
-	if got, want := x.W, w; got != want {
-		t.Errorf("w = %q, want %q", got, want)
-	}
-
-	if got, want := x.BV, bv; got == nil {
-		t.Errorf("bv = nil, want %q", want)
-	} else if *got != want {
-		t.Errorf("bv = %q, want %q", *got, want)
-	}
-	if got, want := x.BW, bw; got != want {
-		t.Errorf("bw = %q, want %q", got, want)
-	}
-
-	if got, want := x.TV, tv; got == nil {
-		t.Errorf("tv = nil, want %q", want)
-	} else if *got != want {
-		t.Errorf("tv = %q, want %q", *got, want)
-	}
-	if got, want := x.TW, tw; got != want {
-		t.Errorf("tw = %q, want %q", got, want)
-	}
-}
-
-func TestGobEncoderFieldTypeError(t *testing.T) {
-	// GobEncoder to non-decoder: error
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	err := enc.Encode(GobTest1{17, &StringStruct{"ABC"}})
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := &GobTest2{}
-	err = dec.Decode(x)
-	if err == nil {
-		t.Fatal("expected decode error for mismatched fields (encoder to non-decoder)")
-	}
-	if strings.Index(err.Error(), "type") < 0 {
-		t.Fatal("expected type error; got", err)
-	}
-	// Non-encoder to GobDecoder: error
-	b.Reset()
-	err = enc.Encode(GobTest2{17, "ABC"})
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	y := &GobTest1{}
-	err = dec.Decode(y)
-	if err == nil {
-		t.Fatal("expected decode error for mismatched fields (non-encoder to decoder)")
-	}
-	if strings.Index(err.Error(), "type") < 0 {
-		t.Fatal("expected type error; got", err)
-	}
-}
-
-// Even though ByteStruct is a struct, it's treated as a singleton at the top level.
-func TestGobEncoderStructSingleton(t *testing.T) {
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	err := enc.Encode(&ByteStruct{'A'})
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := new(ByteStruct)
-	err = dec.Decode(x)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if x.a != 'A' {
-		t.Errorf("expected 'A' got %c", x.a)
-	}
-}
-
-func TestGobEncoderNonStructSingleton(t *testing.T) {
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	var g Gobber = 1234
-	err := enc.Encode(&g)
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	var x Gobber
-	err = dec.Decode(&x)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if x != 1234 {
-		t.Errorf("expected 1234 got %d", x)
-	}
-}
-
-func TestGobEncoderIgnoreStructField(t *testing.T) {
-	b := new(bytes.Buffer)
-	// First a field that's a structure.
-	enc := NewEncoder(b)
-	err := enc.Encode(GobTest0{17, &ByteStruct{'A'}})
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := new(GobTestIgnoreEncoder)
-	err = dec.Decode(x)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if x.X != 17 {
-		t.Errorf("expected 17 got %c", x.X)
-	}
-}
-
-func TestGobEncoderIgnoreNonStructField(t *testing.T) {
-	b := new(bytes.Buffer)
-	// First a field that's a structure.
-	enc := NewEncoder(b)
-	gobber := Gobber(23)
-	bgobber := BinaryGobber(24)
-	tgobber := TextGobber(25)
-	err := enc.Encode(GobTest3{17, &gobber, &bgobber, &tgobber})
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := new(GobTestIgnoreEncoder)
-	err = dec.Decode(x)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if x.X != 17 {
-		t.Errorf("expected 17 got %c", x.X)
-	}
-}
-
-func TestGobEncoderIgnoreNilEncoder(t *testing.T) {
-	b := new(bytes.Buffer)
-	// First a field that's a structure.
-	enc := NewEncoder(b)
-	err := enc.Encode(GobTest0{X: 18}) // G is nil
-	if err != nil {
-		t.Fatal("encode error:", err)
-	}
-	dec := NewDecoder(b)
-	x := new(GobTest0)
-	err = dec.Decode(x)
-	if err != nil {
-		t.Fatal("decode error:", err)
-	}
-	if x.X != 18 {
-		t.Errorf("expected x.X = 18, got %v", x.X)
-	}
-	if x.G != nil {
-		t.Errorf("expected x.G = nil, got %v", x.G)
-	}
-}
-
-type gobDecoderBug0 struct {
-	foo, bar string
-}
-
-func (br *gobDecoderBug0) String() string {
-	return br.foo + "-" + br.bar
-}
-
-func (br *gobDecoderBug0) GobEncode() ([]byte, error) {
-	return []byte(br.String()), nil
-}
-
-func (br *gobDecoderBug0) GobDecode(b []byte) error {
-	br.foo = "foo"
-	br.bar = "bar"
-	return nil
-}
-
-// This was a bug: the receiver has a different indirection level
-// than the variable.
-func TestGobEncoderExtraIndirect(t *testing.T) {
-	gdb := &gobDecoderBug0{"foo", "bar"}
-	buf := new(bytes.Buffer)
-	e := NewEncoder(buf)
-	if err := e.Encode(gdb); err != nil {
-		t.Fatalf("encode: %v", err)
-	}
-	d := NewDecoder(buf)
-	var got *gobDecoderBug0
-	if err := d.Decode(&got); err != nil {
-		t.Fatalf("decode: %v", err)
-	}
-	if got.foo != gdb.foo || got.bar != gdb.bar {
-		t.Errorf("got = %q, want %q", got, gdb)
-	}
-}
-
-// Another bug: this caused a crash with the new Go1 Time type.
-// We throw in a gob-encoding array, to test another case of isZero,
-// and a struct containing an nil interface, to test a third.
-type isZeroBug struct {
-	T time.Time
-	S string
-	I int
-	A isZeroBugArray
-	F isZeroBugInterface
-}
-
-type isZeroBugArray [2]uint8
-
-// Receiver is value, not pointer, to test isZero of array.
-func (a isZeroBugArray) GobEncode() (b []byte, e error) {
-	b = append(b, a[:]...)
-	return b, nil
-}
-
-func (a *isZeroBugArray) GobDecode(data []byte) error {
-	if len(data) != len(a) {
-		return io.EOF
-	}
-	a[0] = data[0]
-	a[1] = data[1]
-	return nil
-}
-
-type isZeroBugInterface struct {
-	I interface{}
-}
-
-func (i isZeroBugInterface) GobEncode() (b []byte, e error) {
-	return []byte{}, nil
-}
-
-func (i *isZeroBugInterface) GobDecode(data []byte) error {
-	return nil
-}
-
-func TestGobEncodeIsZero(t *testing.T) {
-	x := isZeroBug{time.Now(), "hello", -55, isZeroBugArray{1, 2}, isZeroBugInterface{}}
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	err := enc.Encode(x)
-	if err != nil {
-		t.Fatal("encode:", err)
-	}
-	var y isZeroBug
-	dec := NewDecoder(b)
-	err = dec.Decode(&y)
-	if err != nil {
-		t.Fatal("decode:", err)
-	}
-	if x != y {
-		t.Fatalf("%v != %v", x, y)
-	}
-}
-
-func TestGobEncodePtrError(t *testing.T) {
-	var err error
-	b := new(bytes.Buffer)
-	enc := NewEncoder(b)
-	err = enc.Encode(&err)
-	if err != nil {
-		t.Fatal("encode:", err)
-	}
-	dec := NewDecoder(b)
-	err2 := fmt.Errorf("foo")
-	err = dec.Decode(&err2)
-	if err != nil {
-		t.Fatal("decode:", err)
-	}
-	if err2 != nil {
-		t.Fatalf("expected nil, got %v", err2)
-	}
-}
-
-func TestNetIP(t *testing.T) {
-	// Encoding of net.IP{1,2,3,4} in Go 1.1.
-	enc := []byte{0x07, 0x0a, 0x00, 0x04, 0x01, 0x02, 0x03, 0x04}
-
-	var ip net.IP
-	err := NewDecoder(bytes.NewReader(enc)).Decode(&ip)
-	if err != nil {
-		t.Fatalf("decode: %v", err)
-	}
-	if ip.String() != "1.2.3.4" {
-		t.Errorf("decoded to %v, want 1.2.3.4", ip.String())
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/timing_test.go b/third_party/gofrontend/libgo/go/encoding/gob/timing_test.go
deleted file mode 100644
index 940e5ad..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/timing_test.go
+++ /dev/null
@@ -1,325 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gob
-
-import (
-	"bytes"
-	"io"
-	"os"
-	"runtime"
-	"testing"
-)
-
-type Bench struct {
-	A int
-	B float64
-	C string
-	D []byte
-}
-
-func benchmarkEndToEnd(b *testing.B, ctor func() interface{}, pipe func() (r io.Reader, w io.Writer, err error)) {
-	b.RunParallel(func(pb *testing.PB) {
-		r, w, err := pipe()
-		if err != nil {
-			b.Fatal("can't get pipe:", err)
-		}
-		v := ctor()
-		enc := NewEncoder(w)
-		dec := NewDecoder(r)
-		for pb.Next() {
-			if err := enc.Encode(v); err != nil {
-				b.Fatal("encode error:", err)
-			}
-			if err := dec.Decode(v); err != nil {
-				b.Fatal("decode error:", err)
-			}
-		}
-	})
-}
-
-func BenchmarkEndToEndPipe(b *testing.B) {
-	benchmarkEndToEnd(b, func() interface{} {
-		return &Bench{7, 3.2, "now is the time", bytes.Repeat([]byte("for all good men"), 100)}
-	}, func() (r io.Reader, w io.Writer, err error) {
-		r, w, err = os.Pipe()
-		return
-	})
-}
-
-func BenchmarkEndToEndByteBuffer(b *testing.B) {
-	benchmarkEndToEnd(b, func() interface{} {
-		return &Bench{7, 3.2, "now is the time", bytes.Repeat([]byte("for all good men"), 100)}
-	}, func() (r io.Reader, w io.Writer, err error) {
-		var buf bytes.Buffer
-		return &buf, &buf, nil
-	})
-}
-
-func BenchmarkEndToEndSliceByteBuffer(b *testing.B) {
-	benchmarkEndToEnd(b, func() interface{} {
-		v := &Bench{7, 3.2, "now is the time", nil}
-		Register(v)
-		arr := make([]interface{}, 100)
-		for i := range arr {
-			arr[i] = v
-		}
-		return &arr
-	}, func() (r io.Reader, w io.Writer, err error) {
-		var buf bytes.Buffer
-		return &buf, &buf, nil
-	})
-}
-
-func TestCountEncodeMallocs(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping malloc count in short mode")
-	}
-	if runtime.GOMAXPROCS(0) > 1 {
-		t.Skip("skipping; GOMAXPROCS>1")
-	}
-
-	const N = 1000
-
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-	bench := &Bench{7, 3.2, "now is the time", []byte("for all good men")}
-
-	allocs := testing.AllocsPerRun(N, func() {
-		err := enc.Encode(bench)
-		if err != nil {
-			t.Fatal("encode:", err)
-		}
-	})
-	if allocs != 0 {
-		t.Fatalf("mallocs per encode of type Bench: %v; wanted 0\n", allocs)
-	}
-}
-
-func TestCountDecodeMallocs(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping malloc count in short mode")
-	}
-	if runtime.GOMAXPROCS(0) > 1 {
-		t.Skip("skipping; GOMAXPROCS>1")
-	}
-
-	const N = 1000
-
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-	bench := &Bench{7, 3.2, "now is the time", []byte("for all good men")}
-
-	// Fill the buffer with enough to decode
-	testing.AllocsPerRun(N, func() {
-		err := enc.Encode(bench)
-		if err != nil {
-			t.Fatal("encode:", err)
-		}
-	})
-
-	dec := NewDecoder(&buf)
-	allocs := testing.AllocsPerRun(N, func() {
-		*bench = Bench{}
-		err := dec.Decode(&bench)
-		if err != nil {
-			t.Fatal("decode:", err)
-		}
-	})
-	if allocs != 4 {
-		t.Fatalf("mallocs per decode of type Bench: %v; wanted 4\n", allocs)
-	}
-}
-
-func BenchmarkEncodeComplex128Slice(b *testing.B) {
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-	a := make([]complex128, 1000)
-	for i := range a {
-		a[i] = 1.2 + 3.4i
-	}
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		err := enc.Encode(a)
-		if err != nil {
-			b.Fatal(err)
-		}
-	}
-}
-
-func BenchmarkEncodeFloat64Slice(b *testing.B) {
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-	a := make([]float64, 1000)
-	for i := range a {
-		a[i] = 1.23e4
-	}
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		err := enc.Encode(a)
-		if err != nil {
-			b.Fatal(err)
-		}
-	}
-}
-
-func BenchmarkEncodeInt32Slice(b *testing.B) {
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-	a := make([]int32, 1000)
-	for i := range a {
-		a[i] = 1234
-	}
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		err := enc.Encode(a)
-		if err != nil {
-			b.Fatal(err)
-		}
-	}
-}
-
-func BenchmarkEncodeStringSlice(b *testing.B) {
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-	a := make([]string, 1000)
-	for i := range a {
-		a[i] = "now is the time"
-	}
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		err := enc.Encode(a)
-		if err != nil {
-			b.Fatal(err)
-		}
-	}
-}
-
-// benchmarkBuf is a read buffer we can reset
-type benchmarkBuf struct {
-	offset int
-	data   []byte
-}
-
-func (b *benchmarkBuf) Read(p []byte) (n int, err error) {
-	n = copy(p, b.data[b.offset:])
-	if n == 0 {
-		return 0, io.EOF
-	}
-	b.offset += n
-	return
-}
-
-func (b *benchmarkBuf) ReadByte() (c byte, err error) {
-	if b.offset >= len(b.data) {
-		return 0, io.EOF
-	}
-	c = b.data[b.offset]
-	b.offset++
-	return
-}
-
-func (b *benchmarkBuf) reset() {
-	b.offset = 0
-}
-
-func BenchmarkDecodeComplex128Slice(b *testing.B) {
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-	a := make([]complex128, 1000)
-	for i := range a {
-		a[i] = 1.2 + 3.4i
-	}
-	err := enc.Encode(a)
-	if err != nil {
-		b.Fatal(err)
-	}
-	x := make([]complex128, 1000)
-	bbuf := benchmarkBuf{data: buf.Bytes()}
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		bbuf.reset()
-		dec := NewDecoder(&bbuf)
-		err := dec.Decode(&x)
-		if err != nil {
-			b.Fatal(i, err)
-		}
-	}
-}
-
-func BenchmarkDecodeFloat64Slice(b *testing.B) {
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-	a := make([]float64, 1000)
-	for i := range a {
-		a[i] = 1.23e4
-	}
-	err := enc.Encode(a)
-	if err != nil {
-		b.Fatal(err)
-	}
-	x := make([]float64, 1000)
-	bbuf := benchmarkBuf{data: buf.Bytes()}
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		bbuf.reset()
-		dec := NewDecoder(&bbuf)
-		err := dec.Decode(&x)
-		if err != nil {
-			b.Fatal(i, err)
-		}
-	}
-}
-
-func BenchmarkDecodeInt32Slice(b *testing.B) {
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-	a := make([]int32, 1000)
-	for i := range a {
-		a[i] = 1234
-	}
-	err := enc.Encode(a)
-	if err != nil {
-		b.Fatal(err)
-	}
-	x := make([]int32, 1000)
-	bbuf := benchmarkBuf{data: buf.Bytes()}
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		bbuf.reset()
-		dec := NewDecoder(&bbuf)
-		err := dec.Decode(&x)
-		if err != nil {
-			b.Fatal(i, err)
-		}
-	}
-}
-
-func BenchmarkDecodeStringSlice(b *testing.B) {
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-	a := make([]string, 1000)
-	for i := range a {
-		a[i] = "now is the time"
-	}
-	err := enc.Encode(a)
-	if err != nil {
-		b.Fatal(err)
-	}
-	x := make([]string, 1000)
-	bbuf := benchmarkBuf{data: buf.Bytes()}
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		bbuf.reset()
-		dec := NewDecoder(&bbuf)
-		err := dec.Decode(&x)
-		if err != nil {
-			b.Fatal(i, err)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/type.go b/third_party/gofrontend/libgo/go/encoding/gob/type.go
deleted file mode 100644
index a49b71a..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/type.go
+++ /dev/null
@@ -1,923 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gob
-
-import (
-	"encoding"
-	"errors"
-	"fmt"
-	"os"
-	"reflect"
-	"sync"
-	"sync/atomic"
-	"unicode"
-	"unicode/utf8"
-)
-
-// userTypeInfo stores the information associated with a type the user has handed
-// to the package.  It's computed once and stored in a map keyed by reflection
-// type.
-type userTypeInfo struct {
-	user        reflect.Type // the type the user handed us
-	base        reflect.Type // the base type after all indirections
-	indir       int          // number of indirections to reach the base type
-	externalEnc int          // xGob, xBinary, or xText
-	externalDec int          // xGob, xBinary or xText
-	encIndir    int8         // number of indirections to reach the receiver type; may be negative
-	decIndir    int8         // number of indirections to reach the receiver type; may be negative
-}
-
-// externalEncoding bits
-const (
-	xGob    = 1 + iota // GobEncoder or GobDecoder
-	xBinary            // encoding.BinaryMarshaler or encoding.BinaryUnmarshaler
-	xText              // encoding.TextMarshaler or encoding.TextUnmarshaler
-)
-
-var (
-	// Protected by an RWMutex because we read it a lot and write
-	// it only when we see a new type, typically when compiling.
-	userTypeLock  sync.RWMutex
-	userTypeCache = make(map[reflect.Type]*userTypeInfo)
-)
-
-// validType returns, and saves, the information associated with user-provided type rt.
-// If the user type is not valid, err will be non-nil.  To be used when the error handler
-// is not set up.
-func validUserType(rt reflect.Type) (ut *userTypeInfo, err error) {
-	userTypeLock.RLock()
-	ut = userTypeCache[rt]
-	userTypeLock.RUnlock()
-	if ut != nil {
-		return
-	}
-	// Now set the value under the write lock.
-	userTypeLock.Lock()
-	defer userTypeLock.Unlock()
-	if ut = userTypeCache[rt]; ut != nil {
-		// Lost the race; not a problem.
-		return
-	}
-	ut = new(userTypeInfo)
-	ut.base = rt
-	ut.user = rt
-	// A type that is just a cycle of pointers (such as type T *T) cannot
-	// be represented in gobs, which need some concrete data.  We use a
-	// cycle detection algorithm from Knuth, Vol 2, Section 3.1, Ex 6,
-	// pp 539-540.  As we step through indirections, run another type at
-	// half speed. If they meet up, there's a cycle.
-	slowpoke := ut.base // walks half as fast as ut.base
-	for {
-		pt := ut.base
-		if pt.Kind() != reflect.Ptr {
-			break
-		}
-		ut.base = pt.Elem()
-		if ut.base == slowpoke { // ut.base lapped slowpoke
-			// recursive pointer type.
-			return nil, errors.New("can't represent recursive pointer type " + ut.base.String())
-		}
-		if ut.indir%2 == 0 {
-			slowpoke = slowpoke.Elem()
-		}
-		ut.indir++
-	}
-
-	if ok, indir := implementsInterface(ut.user, gobEncoderInterfaceType); ok {
-		ut.externalEnc, ut.encIndir = xGob, indir
-	} else if ok, indir := implementsInterface(ut.user, binaryMarshalerInterfaceType); ok {
-		ut.externalEnc, ut.encIndir = xBinary, indir
-	}
-
-	// NOTE(rsc): Would like to allow MarshalText here, but results in incompatibility
-	// with older encodings for net.IP. See golang.org/issue/6760.
-	// } else if ok, indir := implementsInterface(ut.user, textMarshalerInterfaceType); ok {
-	// 	ut.externalEnc, ut.encIndir = xText, indir
-	// }
-
-	if ok, indir := implementsInterface(ut.user, gobDecoderInterfaceType); ok {
-		ut.externalDec, ut.decIndir = xGob, indir
-	} else if ok, indir := implementsInterface(ut.user, binaryUnmarshalerInterfaceType); ok {
-		ut.externalDec, ut.decIndir = xBinary, indir
-	}
-
-	// See note above.
-	// } else if ok, indir := implementsInterface(ut.user, textUnmarshalerInterfaceType); ok {
-	// 	ut.externalDec, ut.decIndir = xText, indir
-	// }
-
-	userTypeCache[rt] = ut
-	return
-}
-
-var (
-	gobEncoderInterfaceType        = reflect.TypeOf((*GobEncoder)(nil)).Elem()
-	gobDecoderInterfaceType        = reflect.TypeOf((*GobDecoder)(nil)).Elem()
-	binaryMarshalerInterfaceType   = reflect.TypeOf((*encoding.BinaryMarshaler)(nil)).Elem()
-	binaryUnmarshalerInterfaceType = reflect.TypeOf((*encoding.BinaryUnmarshaler)(nil)).Elem()
-	textMarshalerInterfaceType     = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
-	textUnmarshalerInterfaceType   = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
-)
-
-// implementsInterface reports whether the type implements the
-// gobEncoder/gobDecoder interface.
-// It also returns the number of indirections required to get to the
-// implementation.
-func implementsInterface(typ, gobEncDecType reflect.Type) (success bool, indir int8) {
-	if typ == nil {
-		return
-	}
-	rt := typ
-	// The type might be a pointer and we need to keep
-	// dereferencing to the base type until we find an implementation.
-	for {
-		if rt.Implements(gobEncDecType) {
-			return true, indir
-		}
-		if p := rt; p.Kind() == reflect.Ptr {
-			indir++
-			if indir > 100 { // insane number of indirections
-				return false, 0
-			}
-			rt = p.Elem()
-			continue
-		}
-		break
-	}
-	// No luck yet, but if this is a base type (non-pointer), the pointer might satisfy.
-	if typ.Kind() != reflect.Ptr {
-		// Not a pointer, but does the pointer work?
-		if reflect.PtrTo(typ).Implements(gobEncDecType) {
-			return true, -1
-		}
-	}
-	return false, 0
-}
-
-// userType returns, and saves, the information associated with user-provided type rt.
-// If the user type is not valid, it calls error.
-func userType(rt reflect.Type) *userTypeInfo {
-	ut, err := validUserType(rt)
-	if err != nil {
-		error_(err)
-	}
-	return ut
-}
-
-// A typeId represents a gob Type as an integer that can be passed on the wire.
-// Internally, typeIds are used as keys to a map to recover the underlying type info.
-type typeId int32
-
-var nextId typeId       // incremented for each new type we build
-var typeLock sync.Mutex // set while building a type
-const firstUserId = 64  // lowest id number granted to user
-
-type gobType interface {
-	id() typeId
-	setId(id typeId)
-	name() string
-	string() string // not public; only for debugging
-	safeString(seen map[typeId]bool) string
-}
-
-var types = make(map[reflect.Type]gobType)
-var idToType = make(map[typeId]gobType)
-var builtinIdToType map[typeId]gobType // set in init() after builtins are established
-
-func setTypeId(typ gobType) {
-	// When building recursive types, someone may get there before us.
-	if typ.id() != 0 {
-		return
-	}
-	nextId++
-	typ.setId(nextId)
-	idToType[nextId] = typ
-}
-
-func (t typeId) gobType() gobType {
-	if t == 0 {
-		return nil
-	}
-	return idToType[t]
-}
-
-// string returns the string representation of the type associated with the typeId.
-func (t typeId) string() string {
-	if t.gobType() == nil {
-		return "<nil>"
-	}
-	return t.gobType().string()
-}
-
-// Name returns the name of the type associated with the typeId.
-func (t typeId) name() string {
-	if t.gobType() == nil {
-		return "<nil>"
-	}
-	return t.gobType().name()
-}
-
-// CommonType holds elements of all types.
-// It is a historical artifact, kept for binary compatibility and exported
-// only for the benefit of the package's encoding of type descriptors. It is
-// not intended for direct use by clients.
-type CommonType struct {
-	Name string
-	Id   typeId
-}
-
-func (t *CommonType) id() typeId { return t.Id }
-
-func (t *CommonType) setId(id typeId) { t.Id = id }
-
-func (t *CommonType) string() string { return t.Name }
-
-func (t *CommonType) safeString(seen map[typeId]bool) string {
-	return t.Name
-}
-
-func (t *CommonType) name() string { return t.Name }
-
-// Create and check predefined types
-// The string for tBytes is "bytes" not "[]byte" to signify its specialness.
-
-var (
-	// Primordial types, needed during initialization.
-	// Always passed as pointers so the interface{} type
-	// goes through without losing its interfaceness.
-	tBool      = bootstrapType("bool", (*bool)(nil), 1)
-	tInt       = bootstrapType("int", (*int)(nil), 2)
-	tUint      = bootstrapType("uint", (*uint)(nil), 3)
-	tFloat     = bootstrapType("float", (*float64)(nil), 4)
-	tBytes     = bootstrapType("bytes", (*[]byte)(nil), 5)
-	tString    = bootstrapType("string", (*string)(nil), 6)
-	tComplex   = bootstrapType("complex", (*complex128)(nil), 7)
-	tInterface = bootstrapType("interface", (*interface{})(nil), 8)
-	// Reserve some Ids for compatible expansion
-	tReserved7 = bootstrapType("_reserved1", (*struct{ r7 int })(nil), 9)
-	tReserved6 = bootstrapType("_reserved1", (*struct{ r6 int })(nil), 10)
-	tReserved5 = bootstrapType("_reserved1", (*struct{ r5 int })(nil), 11)
-	tReserved4 = bootstrapType("_reserved1", (*struct{ r4 int })(nil), 12)
-	tReserved3 = bootstrapType("_reserved1", (*struct{ r3 int })(nil), 13)
-	tReserved2 = bootstrapType("_reserved1", (*struct{ r2 int })(nil), 14)
-	tReserved1 = bootstrapType("_reserved1", (*struct{ r1 int })(nil), 15)
-)
-
-// Predefined because it's needed by the Decoder
-var tWireType = mustGetTypeInfo(reflect.TypeOf(wireType{})).id
-var wireTypeUserInfo *userTypeInfo // userTypeInfo of (*wireType)
-
-func init() {
-	// Some magic numbers to make sure there are no surprises.
-	checkId(16, tWireType)
-	checkId(17, mustGetTypeInfo(reflect.TypeOf(arrayType{})).id)
-	checkId(18, mustGetTypeInfo(reflect.TypeOf(CommonType{})).id)
-	checkId(19, mustGetTypeInfo(reflect.TypeOf(sliceType{})).id)
-	checkId(20, mustGetTypeInfo(reflect.TypeOf(structType{})).id)
-	checkId(21, mustGetTypeInfo(reflect.TypeOf(fieldType{})).id)
-	checkId(23, mustGetTypeInfo(reflect.TypeOf(mapType{})).id)
-
-	builtinIdToType = make(map[typeId]gobType)
-	for k, v := range idToType {
-		builtinIdToType[k] = v
-	}
-
-	// Move the id space upwards to allow for growth in the predefined world
-	// without breaking existing files.
-	if nextId > firstUserId {
-		panic(fmt.Sprintln("nextId too large:", nextId))
-	}
-	nextId = firstUserId
-	registerBasics()
-	wireTypeUserInfo = userType(reflect.TypeOf((*wireType)(nil)))
-}
-
-// Array type
-type arrayType struct {
-	CommonType
-	Elem typeId
-	Len  int
-}
-
-func newArrayType(name string) *arrayType {
-	a := &arrayType{CommonType{Name: name}, 0, 0}
-	return a
-}
-
-func (a *arrayType) init(elem gobType, len int) {
-	// Set our type id before evaluating the element's, in case it's our own.
-	setTypeId(a)
-	a.Elem = elem.id()
-	a.Len = len
-}
-
-func (a *arrayType) safeString(seen map[typeId]bool) string {
-	if seen[a.Id] {
-		return a.Name
-	}
-	seen[a.Id] = true
-	return fmt.Sprintf("[%d]%s", a.Len, a.Elem.gobType().safeString(seen))
-}
-
-func (a *arrayType) string() string { return a.safeString(make(map[typeId]bool)) }
-
-// GobEncoder type (something that implements the GobEncoder interface)
-type gobEncoderType struct {
-	CommonType
-}
-
-func newGobEncoderType(name string) *gobEncoderType {
-	g := &gobEncoderType{CommonType{Name: name}}
-	setTypeId(g)
-	return g
-}
-
-func (g *gobEncoderType) safeString(seen map[typeId]bool) string {
-	return g.Name
-}
-
-func (g *gobEncoderType) string() string { return g.Name }
-
-// Map type
-type mapType struct {
-	CommonType
-	Key  typeId
-	Elem typeId
-}
-
-func newMapType(name string) *mapType {
-	m := &mapType{CommonType{Name: name}, 0, 0}
-	return m
-}
-
-func (m *mapType) init(key, elem gobType) {
-	// Set our type id before evaluating the element's, in case it's our own.
-	setTypeId(m)
-	m.Key = key.id()
-	m.Elem = elem.id()
-}
-
-func (m *mapType) safeString(seen map[typeId]bool) string {
-	if seen[m.Id] {
-		return m.Name
-	}
-	seen[m.Id] = true
-	key := m.Key.gobType().safeString(seen)
-	elem := m.Elem.gobType().safeString(seen)
-	return fmt.Sprintf("map[%s]%s", key, elem)
-}
-
-func (m *mapType) string() string { return m.safeString(make(map[typeId]bool)) }
-
-// Slice type
-type sliceType struct {
-	CommonType
-	Elem typeId
-}
-
-func newSliceType(name string) *sliceType {
-	s := &sliceType{CommonType{Name: name}, 0}
-	return s
-}
-
-func (s *sliceType) init(elem gobType) {
-	// Set our type id before evaluating the element's, in case it's our own.
-	setTypeId(s)
-	// See the comments about ids in newTypeObject. Only slices and
-	// structs have mutual recursion.
-	if elem.id() == 0 {
-		setTypeId(elem)
-	}
-	s.Elem = elem.id()
-}
-
-func (s *sliceType) safeString(seen map[typeId]bool) string {
-	if seen[s.Id] {
-		return s.Name
-	}
-	seen[s.Id] = true
-	return fmt.Sprintf("[]%s", s.Elem.gobType().safeString(seen))
-}
-
-func (s *sliceType) string() string { return s.safeString(make(map[typeId]bool)) }
-
-// Struct type
-type fieldType struct {
-	Name string
-	Id   typeId
-}
-
-type structType struct {
-	CommonType
-	Field []*fieldType
-}
-
-func (s *structType) safeString(seen map[typeId]bool) string {
-	if s == nil {
-		return "<nil>"
-	}
-	if _, ok := seen[s.Id]; ok {
-		return s.Name
-	}
-	seen[s.Id] = true
-	str := s.Name + " = struct { "
-	for _, f := range s.Field {
-		str += fmt.Sprintf("%s %s; ", f.Name, f.Id.gobType().safeString(seen))
-	}
-	str += "}"
-	return str
-}
-
-func (s *structType) string() string { return s.safeString(make(map[typeId]bool)) }
-
-func newStructType(name string) *structType {
-	s := &structType{CommonType{Name: name}, nil}
-	// For historical reasons we set the id here rather than init.
-	// See the comment in newTypeObject for details.
-	setTypeId(s)
-	return s
-}
-
-// newTypeObject allocates a gobType for the reflection type rt.
-// Unless ut represents a GobEncoder, rt should be the base type
-// of ut.
-// This is only called from the encoding side. The decoding side
-// works through typeIds and userTypeInfos alone.
-func newTypeObject(name string, ut *userTypeInfo, rt reflect.Type) (gobType, error) {
-	// Does this type implement GobEncoder?
-	if ut.externalEnc != 0 {
-		return newGobEncoderType(name), nil
-	}
-	var err error
-	var type0, type1 gobType
-	defer func() {
-		if err != nil {
-			delete(types, rt)
-		}
-	}()
-	// Install the top-level type before the subtypes (e.g. struct before
-	// fields) so recursive types can be constructed safely.
-	switch t := rt; t.Kind() {
-	// All basic types are easy: they are predefined.
-	case reflect.Bool:
-		return tBool.gobType(), nil
-
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return tInt.gobType(), nil
-
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		return tUint.gobType(), nil
-
-	case reflect.Float32, reflect.Float64:
-		return tFloat.gobType(), nil
-
-	case reflect.Complex64, reflect.Complex128:
-		return tComplex.gobType(), nil
-
-	case reflect.String:
-		return tString.gobType(), nil
-
-	case reflect.Interface:
-		return tInterface.gobType(), nil
-
-	case reflect.Array:
-		at := newArrayType(name)
-		types[rt] = at
-		type0, err = getBaseType("", t.Elem())
-		if err != nil {
-			return nil, err
-		}
-		// Historical aside:
-		// For arrays, maps, and slices, we set the type id after the elements
-		// are constructed. This is to retain the order of type id allocation after
-		// a fix made to handle recursive types, which changed the order in
-		// which types are built.  Delaying the setting in this way preserves
-		// type ids while allowing recursive types to be described. Structs,
-		// done below, were already handling recursion correctly so they
-		// assign the top-level id before those of the field.
-		at.init(type0, t.Len())
-		return at, nil
-
-	case reflect.Map:
-		mt := newMapType(name)
-		types[rt] = mt
-		type0, err = getBaseType("", t.Key())
-		if err != nil {
-			return nil, err
-		}
-		type1, err = getBaseType("", t.Elem())
-		if err != nil {
-			return nil, err
-		}
-		mt.init(type0, type1)
-		return mt, nil
-
-	case reflect.Slice:
-		// []byte == []uint8 is a special case
-		if t.Elem().Kind() == reflect.Uint8 {
-			return tBytes.gobType(), nil
-		}
-		st := newSliceType(name)
-		types[rt] = st
-		type0, err = getBaseType(t.Elem().Name(), t.Elem())
-		if err != nil {
-			return nil, err
-		}
-		st.init(type0)
-		return st, nil
-
-	case reflect.Struct:
-		st := newStructType(name)
-		types[rt] = st
-		idToType[st.id()] = st
-		for i := 0; i < t.NumField(); i++ {
-			f := t.Field(i)
-			if !isSent(&f) {
-				continue
-			}
-			typ := userType(f.Type).base
-			tname := typ.Name()
-			if tname == "" {
-				t := userType(f.Type).base
-				tname = t.String()
-			}
-			gt, err := getBaseType(tname, f.Type)
-			if err != nil {
-				return nil, err
-			}
-			// Some mutually recursive types can cause us to be here while
-			// still defining the element. Fix the element type id here.
-			// We could do this more neatly by setting the id at the start of
-			// building every type, but that would break binary compatibility.
-			if gt.id() == 0 {
-				setTypeId(gt)
-			}
-			st.Field = append(st.Field, &fieldType{f.Name, gt.id()})
-		}
-		return st, nil
-
-	default:
-		return nil, errors.New("gob NewTypeObject can't handle type: " + rt.String())
-	}
-}
-
-// isExported reports whether this is an exported - upper case - name.
-func isExported(name string) bool {
-	rune, _ := utf8.DecodeRuneInString(name)
-	return unicode.IsUpper(rune)
-}
-
-// isSent reports whether this struct field is to be transmitted.
-// It will be transmitted only if it is exported and not a chan or func field
-// or pointer to chan or func.
-func isSent(field *reflect.StructField) bool {
-	if !isExported(field.Name) {
-		return false
-	}
-	// If the field is a chan or func or pointer thereto, don't send it.
-	// That is, treat it like an unexported field.
-	typ := field.Type
-	for typ.Kind() == reflect.Ptr {
-		typ = typ.Elem()
-	}
-	if typ.Kind() == reflect.Chan || typ.Kind() == reflect.Func {
-		return false
-	}
-	return true
-}
-
-// getBaseType returns the Gob type describing the given reflect.Type's base type.
-// typeLock must be held.
-func getBaseType(name string, rt reflect.Type) (gobType, error) {
-	ut := userType(rt)
-	return getType(name, ut, ut.base)
-}
-
-// getType returns the Gob type describing the given reflect.Type.
-// Should be called only when handling GobEncoders/Decoders,
-// which may be pointers.  All other types are handled through the
-// base type, never a pointer.
-// typeLock must be held.
-func getType(name string, ut *userTypeInfo, rt reflect.Type) (gobType, error) {
-	typ, present := types[rt]
-	if present {
-		return typ, nil
-	}
-	typ, err := newTypeObject(name, ut, rt)
-	if err == nil {
-		types[rt] = typ
-	}
-	return typ, err
-}
-
-func checkId(want, got typeId) {
-	if want != got {
-		fmt.Fprintf(os.Stderr, "checkId: %d should be %d\n", int(got), int(want))
-		panic("bootstrap type wrong id: " + got.name() + " " + got.string() + " not " + want.string())
-	}
-}
-
-// used for building the basic types; called only from init().  the incoming
-// interface always refers to a pointer.
-func bootstrapType(name string, e interface{}, expect typeId) typeId {
-	rt := reflect.TypeOf(e).Elem()
-	_, present := types[rt]
-	if present {
-		panic("bootstrap type already present: " + name + ", " + rt.String())
-	}
-	typ := &CommonType{Name: name}
-	types[rt] = typ
-	setTypeId(typ)
-	checkId(expect, nextId)
-	userType(rt) // might as well cache it now
-	return nextId
-}
-
-// Representation of the information we send and receive about this type.
-// Each value we send is preceded by its type definition: an encoded int.
-// However, the very first time we send the value, we first send the pair
-// (-id, wireType).
-// For bootstrapping purposes, we assume that the recipient knows how
-// to decode a wireType; it is exactly the wireType struct here, interpreted
-// using the gob rules for sending a structure, except that we assume the
-// ids for wireType and structType etc. are known.  The relevant pieces
-// are built in encode.go's init() function.
-// To maintain binary compatibility, if you extend this type, always put
-// the new fields last.
-type wireType struct {
-	ArrayT           *arrayType
-	SliceT           *sliceType
-	StructT          *structType
-	MapT             *mapType
-	GobEncoderT      *gobEncoderType
-	BinaryMarshalerT *gobEncoderType
-	TextMarshalerT   *gobEncoderType
-}
-
-func (w *wireType) string() string {
-	const unknown = "unknown type"
-	if w == nil {
-		return unknown
-	}
-	switch {
-	case w.ArrayT != nil:
-		return w.ArrayT.Name
-	case w.SliceT != nil:
-		return w.SliceT.Name
-	case w.StructT != nil:
-		return w.StructT.Name
-	case w.MapT != nil:
-		return w.MapT.Name
-	case w.GobEncoderT != nil:
-		return w.GobEncoderT.Name
-	case w.BinaryMarshalerT != nil:
-		return w.BinaryMarshalerT.Name
-	case w.TextMarshalerT != nil:
-		return w.TextMarshalerT.Name
-	}
-	return unknown
-}
-
-type typeInfo struct {
-	id      typeId
-	encInit sync.Mutex   // protects creation of encoder
-	encoder atomic.Value // *encEngine
-	wire    *wireType
-}
-
-// typeInfoMap is an atomic pointer to map[reflect.Type]*typeInfo.
-// It's updated copy-on-write. Readers just do an atomic load
-// to get the current version of the map. Writers make a full copy of
-// the map and atomically update the pointer to point to the new map.
-// Under heavy read contention, this is significantly faster than a map
-// protected by a mutex.
-var typeInfoMap atomic.Value
-
-func lookupTypeInfo(rt reflect.Type) *typeInfo {
-	m, _ := typeInfoMap.Load().(map[reflect.Type]*typeInfo)
-	return m[rt]
-}
-
-func getTypeInfo(ut *userTypeInfo) (*typeInfo, error) {
-	rt := ut.base
-	if ut.externalEnc != 0 {
-		// We want the user type, not the base type.
-		rt = ut.user
-	}
-	if info := lookupTypeInfo(rt); info != nil {
-		return info, nil
-	}
-	return buildTypeInfo(ut, rt)
-}
-
-// buildTypeInfo constructs the type information for the type
-// and stores it in the type info map.
-func buildTypeInfo(ut *userTypeInfo, rt reflect.Type) (*typeInfo, error) {
-	typeLock.Lock()
-	defer typeLock.Unlock()
-
-	if info := lookupTypeInfo(rt); info != nil {
-		return info, nil
-	}
-
-	gt, err := getBaseType(rt.Name(), rt)
-	if err != nil {
-		return nil, err
-	}
-	info := &typeInfo{id: gt.id()}
-
-	if ut.externalEnc != 0 {
-		userType, err := getType(rt.Name(), ut, rt)
-		if err != nil {
-			return nil, err
-		}
-		gt := userType.id().gobType().(*gobEncoderType)
-		switch ut.externalEnc {
-		case xGob:
-			info.wire = &wireType{GobEncoderT: gt}
-		case xBinary:
-			info.wire = &wireType{BinaryMarshalerT: gt}
-		case xText:
-			info.wire = &wireType{TextMarshalerT: gt}
-		}
-		rt = ut.user
-	} else {
-		t := info.id.gobType()
-		switch typ := rt; typ.Kind() {
-		case reflect.Array:
-			info.wire = &wireType{ArrayT: t.(*arrayType)}
-		case reflect.Map:
-			info.wire = &wireType{MapT: t.(*mapType)}
-		case reflect.Slice:
-			// []byte == []uint8 is a special case handled separately
-			if typ.Elem().Kind() != reflect.Uint8 {
-				info.wire = &wireType{SliceT: t.(*sliceType)}
-			}
-		case reflect.Struct:
-			info.wire = &wireType{StructT: t.(*structType)}
-		}
-	}
-
-	// Create new map with old contents plus new entry.
-	newm := make(map[reflect.Type]*typeInfo)
-	m, _ := typeInfoMap.Load().(map[reflect.Type]*typeInfo)
-	for k, v := range m {
-		newm[k] = v
-	}
-	newm[rt] = info
-	typeInfoMap.Store(newm)
-	return info, nil
-}
-
-// Called only when a panic is acceptable and unexpected.
-func mustGetTypeInfo(rt reflect.Type) *typeInfo {
-	t, err := getTypeInfo(userType(rt))
-	if err != nil {
-		panic("getTypeInfo: " + err.Error())
-	}
-	return t
-}
-
-// GobEncoder is the interface describing data that provides its own
-// representation for encoding values for transmission to a GobDecoder.
-// A type that implements GobEncoder and GobDecoder has complete
-// control over the representation of its data and may therefore
-// contain things such as private fields, channels, and functions,
-// which are not usually transmissible in gob streams.
-//
-// Note: Since gobs can be stored permanently, It is good design
-// to guarantee the encoding used by a GobEncoder is stable as the
-// software evolves.  For instance, it might make sense for GobEncode
-// to include a version number in the encoding.
-type GobEncoder interface {
-	// GobEncode returns a byte slice representing the encoding of the
-	// receiver for transmission to a GobDecoder, usually of the same
-	// concrete type.
-	GobEncode() ([]byte, error)
-}
-
-// GobDecoder is the interface describing data that provides its own
-// routine for decoding transmitted values sent by a GobEncoder.
-type GobDecoder interface {
-	// GobDecode overwrites the receiver, which must be a pointer,
-	// with the value represented by the byte slice, which was written
-	// by GobEncode, usually for the same concrete type.
-	GobDecode([]byte) error
-}
-
-var (
-	registerLock       sync.RWMutex
-	nameToConcreteType = make(map[string]reflect.Type)
-	concreteTypeToName = make(map[reflect.Type]string)
-)
-
-// RegisterName is like Register but uses the provided name rather than the
-// type's default.
-func RegisterName(name string, value interface{}) {
-	if name == "" {
-		// reserved for nil
-		panic("attempt to register empty name")
-	}
-	registerLock.Lock()
-	defer registerLock.Unlock()
-	ut := userType(reflect.TypeOf(value))
-	// Check for incompatible duplicates. The name must refer to the
-	// same user type, and vice versa.
-	if t, ok := nameToConcreteType[name]; ok && t != ut.user {
-		panic(fmt.Sprintf("gob: registering duplicate types for %q: %s != %s", name, t, ut.user))
-	}
-	if n, ok := concreteTypeToName[ut.base]; ok && n != name {
-		panic(fmt.Sprintf("gob: registering duplicate names for %s: %q != %q", ut.user, n, name))
-	}
-	// Store the name and type provided by the user....
-	nameToConcreteType[name] = reflect.TypeOf(value)
-	// but the flattened type in the type table, since that's what decode needs.
-	concreteTypeToName[ut.base] = name
-}
-
-// Register records a type, identified by a value for that type, under its
-// internal type name.  That name will identify the concrete type of a value
-// sent or received as an interface variable.  Only types that will be
-// transferred as implementations of interface values need to be registered.
-// Expecting to be used only during initialization, it panics if the mapping
-// between types and names is not a bijection.
-func Register(value interface{}) {
-	// Default to printed representation for unnamed types
-	rt := reflect.TypeOf(value)
-	name := rt.String()
-
-	// But for named types (or pointers to them), qualify with import path (but see inner comment).
-	// Dereference one pointer looking for a named type.
-	star := ""
-	if rt.Name() == "" {
-		if pt := rt; pt.Kind() == reflect.Ptr {
-			star = "*"
-			// NOTE: The following line should be rt = pt.Elem() to implement
-			// what the comment above claims, but fixing it would break compatibility
-			// with existing gobs.
-			//
-			// Given package p imported as "full/p" with these definitions:
-			//     package p
-			//     type T1 struct { ... }
-			// this table shows the intended and actual strings used by gob to
-			// name the types:
-			//
-			// Type      Correct string     Actual string
-			//
-			// T1        full/p.T1          full/p.T1
-			// *T1       *full/p.T1         *p.T1
-			//
-			// The missing full path cannot be fixed without breaking existing gob decoders.
-			rt = pt
-		}
-	}
-	if rt.Name() != "" {
-		if rt.PkgPath() == "" {
-			name = star + rt.Name()
-		} else {
-			name = star + rt.PkgPath() + "." + rt.Name()
-		}
-	}
-
-	RegisterName(name, value)
-}
-
-func registerBasics() {
-	Register(int(0))
-	Register(int8(0))
-	Register(int16(0))
-	Register(int32(0))
-	Register(int64(0))
-	Register(uint(0))
-	Register(uint8(0))
-	Register(uint16(0))
-	Register(uint32(0))
-	Register(uint64(0))
-	Register(float32(0))
-	Register(float64(0))
-	Register(complex64(0i))
-	Register(complex128(0i))
-	Register(uintptr(0))
-	Register(false)
-	Register("")
-	Register([]byte(nil))
-	Register([]int(nil))
-	Register([]int8(nil))
-	Register([]int16(nil))
-	Register([]int32(nil))
-	Register([]int64(nil))
-	Register([]uint(nil))
-	Register([]uint8(nil))
-	Register([]uint16(nil))
-	Register([]uint32(nil))
-	Register([]uint64(nil))
-	Register([]float32(nil))
-	Register([]float64(nil))
-	Register([]complex64(nil))
-	Register([]complex128(nil))
-	Register([]uintptr(nil))
-	Register([]bool(nil))
-	Register([]string(nil))
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/gob/type_test.go b/third_party/gofrontend/libgo/go/encoding/gob/type_test.go
deleted file mode 100644
index e230d22..0000000
--- a/third_party/gofrontend/libgo/go/encoding/gob/type_test.go
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gob
-
-import (
-	"bytes"
-	"reflect"
-	"testing"
-)
-
-type typeT struct {
-	id  typeId
-	str string
-}
-
-var basicTypes = []typeT{
-	{tBool, "bool"},
-	{tInt, "int"},
-	{tUint, "uint"},
-	{tFloat, "float"},
-	{tBytes, "bytes"},
-	{tString, "string"},
-}
-
-func getTypeUnlocked(name string, rt reflect.Type) gobType {
-	typeLock.Lock()
-	defer typeLock.Unlock()
-	t, err := getBaseType(name, rt)
-	if err != nil {
-		panic("getTypeUnlocked: " + err.Error())
-	}
-	return t
-}
-
-// Sanity checks
-func TestBasic(t *testing.T) {
-	for _, tt := range basicTypes {
-		if tt.id.string() != tt.str {
-			t.Errorf("checkType: expected %q got %s", tt.str, tt.id.string())
-		}
-		if tt.id == 0 {
-			t.Errorf("id for %q is zero", tt.str)
-		}
-	}
-}
-
-// Reregister some basic types to check registration is idempotent.
-func TestReregistration(t *testing.T) {
-	newtyp := getTypeUnlocked("int", reflect.TypeOf(int(0)))
-	if newtyp != tInt.gobType() {
-		t.Errorf("reregistration of %s got new type", newtyp.string())
-	}
-	newtyp = getTypeUnlocked("uint", reflect.TypeOf(uint(0)))
-	if newtyp != tUint.gobType() {
-		t.Errorf("reregistration of %s got new type", newtyp.string())
-	}
-	newtyp = getTypeUnlocked("string", reflect.TypeOf("hello"))
-	if newtyp != tString.gobType() {
-		t.Errorf("reregistration of %s got new type", newtyp.string())
-	}
-}
-
-func TestArrayType(t *testing.T) {
-	var a3 [3]int
-	a3int := getTypeUnlocked("foo", reflect.TypeOf(a3))
-	newa3int := getTypeUnlocked("bar", reflect.TypeOf(a3))
-	if a3int != newa3int {
-		t.Errorf("second registration of [3]int creates new type")
-	}
-	var a4 [4]int
-	a4int := getTypeUnlocked("goo", reflect.TypeOf(a4))
-	if a3int == a4int {
-		t.Errorf("registration of [3]int creates same type as [4]int")
-	}
-	var b3 [3]bool
-	a3bool := getTypeUnlocked("", reflect.TypeOf(b3))
-	if a3int == a3bool {
-		t.Errorf("registration of [3]bool creates same type as [3]int")
-	}
-	str := a3bool.string()
-	expected := "[3]bool"
-	if str != expected {
-		t.Errorf("array printed as %q; expected %q", str, expected)
-	}
-}
-
-func TestSliceType(t *testing.T) {
-	var s []int
-	sint := getTypeUnlocked("slice", reflect.TypeOf(s))
-	var news []int
-	newsint := getTypeUnlocked("slice1", reflect.TypeOf(news))
-	if sint != newsint {
-		t.Errorf("second registration of []int creates new type")
-	}
-	var b []bool
-	sbool := getTypeUnlocked("", reflect.TypeOf(b))
-	if sbool == sint {
-		t.Errorf("registration of []bool creates same type as []int")
-	}
-	str := sbool.string()
-	expected := "[]bool"
-	if str != expected {
-		t.Errorf("slice printed as %q; expected %q", str, expected)
-	}
-}
-
-func TestMapType(t *testing.T) {
-	var m map[string]int
-	mapStringInt := getTypeUnlocked("map", reflect.TypeOf(m))
-	var newm map[string]int
-	newMapStringInt := getTypeUnlocked("map1", reflect.TypeOf(newm))
-	if mapStringInt != newMapStringInt {
-		t.Errorf("second registration of map[string]int creates new type")
-	}
-	var b map[string]bool
-	mapStringBool := getTypeUnlocked("", reflect.TypeOf(b))
-	if mapStringBool == mapStringInt {
-		t.Errorf("registration of map[string]bool creates same type as map[string]int")
-	}
-	str := mapStringBool.string()
-	expected := "map[string]bool"
-	if str != expected {
-		t.Errorf("map printed as %q; expected %q", str, expected)
-	}
-}
-
-type Bar struct {
-	X string
-}
-
-// This structure has pointers and refers to itself, making it a good test case.
-type Foo struct {
-	A int
-	B int32 // will become int
-	C string
-	D []byte
-	E *float64    // will become float64
-	F ****float64 // will become float64
-	G *Bar
-	H *Bar // should not interpolate the definition of Bar again
-	I *Foo // will not explode
-}
-
-func TestStructType(t *testing.T) {
-	sstruct := getTypeUnlocked("Foo", reflect.TypeOf(Foo{}))
-	str := sstruct.string()
-	// If we can print it correctly, we built it correctly.
-	expected := "Foo = struct { A int; B int; C string; D bytes; E float; F float; G Bar = struct { X string; }; H Bar; I Foo; }"
-	if str != expected {
-		t.Errorf("struct printed as %q; expected %q", str, expected)
-	}
-}
-
-// Should be OK to register the same type multiple times, as long as they're
-// at the same level of indirection.
-func TestRegistration(t *testing.T) {
-	type T struct{ a int }
-	Register(new(T))
-	Register(new(T))
-}
-
-type N1 struct{}
-type N2 struct{}
-
-// See comment in type.go/Register.
-func TestRegistrationNaming(t *testing.T) {
-	testCases := []struct {
-		t    interface{}
-		name string
-	}{
-		{&N1{}, "*gob.N1"},
-		{N2{}, "encoding/gob.N2"},
-	}
-
-	for _, tc := range testCases {
-		Register(tc.t)
-
-		tct := reflect.TypeOf(tc.t)
-		registerLock.RLock()
-		ct := nameToConcreteType[tc.name]
-		registerLock.RUnlock()
-		if ct != tct {
-			t.Errorf("nameToConcreteType[%q] = %v, want %v", tc.name, ct, tct)
-		}
-		// concreteTypeToName is keyed off the base type.
-		if tct.Kind() == reflect.Ptr {
-			tct = tct.Elem()
-		}
-		if n := concreteTypeToName[tct]; n != tc.name {
-			t.Errorf("concreteTypeToName[%v] got %v, want %v", tct, n, tc.name)
-		}
-	}
-}
-
-func TestStressParallel(t *testing.T) {
-	type T2 struct{ A int }
-	c := make(chan bool)
-	const N = 10
-	for i := 0; i < N; i++ {
-		go func() {
-			p := new(T2)
-			Register(p)
-			b := new(bytes.Buffer)
-			enc := NewEncoder(b)
-			err := enc.Encode(p)
-			if err != nil {
-				t.Error("encoder fail:", err)
-			}
-			dec := NewDecoder(b)
-			err = dec.Decode(p)
-			if err != nil {
-				t.Error("decoder fail:", err)
-			}
-			c <- true
-		}()
-	}
-	for i := 0; i < N; i++ {
-		<-c
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/hex/hex.go b/third_party/gofrontend/libgo/go/encoding/hex/hex.go
deleted file mode 100644
index d1fc702..0000000
--- a/third_party/gofrontend/libgo/go/encoding/hex/hex.go
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package hex implements hexadecimal encoding and decoding.
-package hex
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-)
-
-const hextable = "0123456789abcdef"
-
-// EncodedLen returns the length of an encoding of n source bytes.
-func EncodedLen(n int) int { return n * 2 }
-
-// Encode encodes src into EncodedLen(len(src))
-// bytes of dst.  As a convenience, it returns the number
-// of bytes written to dst, but this value is always EncodedLen(len(src)).
-// Encode implements hexadecimal encoding.
-func Encode(dst, src []byte) int {
-	for i, v := range src {
-		dst[i*2] = hextable[v>>4]
-		dst[i*2+1] = hextable[v&0x0f]
-	}
-
-	return len(src) * 2
-}
-
-// ErrLength results from decoding an odd length slice.
-var ErrLength = errors.New("encoding/hex: odd length hex string")
-
-// InvalidByteError values describe errors resulting from an invalid byte in a hex string.
-type InvalidByteError byte
-
-func (e InvalidByteError) Error() string {
-	return fmt.Sprintf("encoding/hex: invalid byte: %#U", rune(e))
-}
-
-func DecodedLen(x int) int { return x / 2 }
-
-// Decode decodes src into DecodedLen(len(src)) bytes, returning the actual
-// number of bytes written to dst.
-//
-// If Decode encounters invalid input, it returns an error describing the failure.
-func Decode(dst, src []byte) (int, error) {
-	if len(src)%2 == 1 {
-		return 0, ErrLength
-	}
-
-	for i := 0; i < len(src)/2; i++ {
-		a, ok := fromHexChar(src[i*2])
-		if !ok {
-			return 0, InvalidByteError(src[i*2])
-		}
-		b, ok := fromHexChar(src[i*2+1])
-		if !ok {
-			return 0, InvalidByteError(src[i*2+1])
-		}
-		dst[i] = (a << 4) | b
-	}
-
-	return len(src) / 2, nil
-}
-
-// fromHexChar converts a hex character into its value and a success flag.
-func fromHexChar(c byte) (byte, bool) {
-	switch {
-	case '0' <= c && c <= '9':
-		return c - '0', true
-	case 'a' <= c && c <= 'f':
-		return c - 'a' + 10, true
-	case 'A' <= c && c <= 'F':
-		return c - 'A' + 10, true
-	}
-
-	return 0, false
-}
-
-// EncodeToString returns the hexadecimal encoding of src.
-func EncodeToString(src []byte) string {
-	dst := make([]byte, EncodedLen(len(src)))
-	Encode(dst, src)
-	return string(dst)
-}
-
-// DecodeString returns the bytes represented by the hexadecimal string s.
-func DecodeString(s string) ([]byte, error) {
-	src := []byte(s)
-	dst := make([]byte, DecodedLen(len(src)))
-	_, err := Decode(dst, src)
-	if err != nil {
-		return nil, err
-	}
-	return dst, nil
-}
-
-// Dump returns a string that contains a hex dump of the given data. The format
-// of the hex dump matches the output of `hexdump -C` on the command line.
-func Dump(data []byte) string {
-	var buf bytes.Buffer
-	dumper := Dumper(&buf)
-	dumper.Write(data)
-	dumper.Close()
-	return string(buf.Bytes())
-}
-
-// Dumper returns a WriteCloser that writes a hex dump of all written data to
-// w. The format of the dump matches the output of `hexdump -C` on the command
-// line.
-func Dumper(w io.Writer) io.WriteCloser {
-	return &dumper{w: w}
-}
-
-type dumper struct {
-	w          io.Writer
-	rightChars [18]byte
-	buf        [14]byte
-	used       int  // number of bytes in the current line
-	n          uint // number of bytes, total
-}
-
-func toChar(b byte) byte {
-	if b < 32 || b > 126 {
-		return '.'
-	}
-	return b
-}
-
-func (h *dumper) Write(data []byte) (n int, err error) {
-	// Output lines look like:
-	// 00000010  2e 2f 30 31 32 33 34 35  36 37 38 39 3a 3b 3c 3d  |./0123456789:;<=|
-	// ^ offset                          ^ extra space              ^ ASCII of line.
-	for i := range data {
-		if h.used == 0 {
-			// At the beginning of a line we print the current
-			// offset in hex.
-			h.buf[0] = byte(h.n >> 24)
-			h.buf[1] = byte(h.n >> 16)
-			h.buf[2] = byte(h.n >> 8)
-			h.buf[3] = byte(h.n)
-			Encode(h.buf[4:], h.buf[:4])
-			h.buf[12] = ' '
-			h.buf[13] = ' '
-			_, err = h.w.Write(h.buf[4:])
-			if err != nil {
-				return
-			}
-		}
-		Encode(h.buf[:], data[i:i+1])
-		h.buf[2] = ' '
-		l := 3
-		if h.used == 7 {
-			// There's an additional space after the 8th byte.
-			h.buf[3] = ' '
-			l = 4
-		} else if h.used == 15 {
-			// At the end of the line there's an extra space and
-			// the bar for the right column.
-			h.buf[3] = ' '
-			h.buf[4] = '|'
-			l = 5
-		}
-		_, err = h.w.Write(h.buf[:l])
-		if err != nil {
-			return
-		}
-		n++
-		h.rightChars[h.used] = toChar(data[i])
-		h.used++
-		h.n++
-		if h.used == 16 {
-			h.rightChars[16] = '|'
-			h.rightChars[17] = '\n'
-			_, err = h.w.Write(h.rightChars[:])
-			if err != nil {
-				return
-			}
-			h.used = 0
-		}
-	}
-	return
-}
-
-func (h *dumper) Close() (err error) {
-	// See the comments in Write() for the details of this format.
-	if h.used == 0 {
-		return
-	}
-	h.buf[0] = ' '
-	h.buf[1] = ' '
-	h.buf[2] = ' '
-	h.buf[3] = ' '
-	h.buf[4] = '|'
-	nBytes := h.used
-	for h.used < 16 {
-		l := 3
-		if h.used == 7 {
-			l = 4
-		} else if h.used == 15 {
-			l = 5
-		}
-		_, err = h.w.Write(h.buf[:l])
-		if err != nil {
-			return
-		}
-		h.used++
-	}
-	h.rightChars[nBytes] = '|'
-	h.rightChars[nBytes+1] = '\n'
-	_, err = h.w.Write(h.rightChars[:nBytes+2])
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/hex/hex_test.go b/third_party/gofrontend/libgo/go/encoding/hex/hex_test.go
deleted file mode 100644
index b969636..0000000
--- a/third_party/gofrontend/libgo/go/encoding/hex/hex_test.go
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package hex
-
-import (
-	"bytes"
-	"testing"
-)
-
-type encDecTest struct {
-	enc string
-	dec []byte
-}
-
-var encDecTests = []encDecTest{
-	{"", []byte{}},
-	{"0001020304050607", []byte{0, 1, 2, 3, 4, 5, 6, 7}},
-	{"08090a0b0c0d0e0f", []byte{8, 9, 10, 11, 12, 13, 14, 15}},
-	{"f0f1f2f3f4f5f6f7", []byte{0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7}},
-	{"f8f9fafbfcfdfeff", []byte{0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff}},
-	{"67", []byte{'g'}},
-	{"e3a1", []byte{0xe3, 0xa1}},
-}
-
-func TestEncode(t *testing.T) {
-	for i, test := range encDecTests {
-		dst := make([]byte, EncodedLen(len(test.dec)))
-		n := Encode(dst, test.dec)
-		if n != len(dst) {
-			t.Errorf("#%d: bad return value: got: %d want: %d", i, n, len(dst))
-		}
-		if string(dst) != test.enc {
-			t.Errorf("#%d: got: %#v want: %#v", i, dst, test.enc)
-		}
-	}
-}
-
-func TestDecode(t *testing.T) {
-	// Case for decoding uppercase hex characters, since
-	// Encode always uses lowercase.
-	decTests := append(encDecTests, encDecTest{"F8F9FAFBFCFDFEFF", []byte{0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff}})
-	for i, test := range decTests {
-		dst := make([]byte, DecodedLen(len(test.enc)))
-		n, err := Decode(dst, []byte(test.enc))
-		if err != nil {
-			t.Errorf("#%d: bad return value: got:%d want:%d", i, n, len(dst))
-		} else if !bytes.Equal(dst, test.dec) {
-			t.Errorf("#%d: got: %#v want: %#v", i, dst, test.dec)
-		}
-	}
-}
-
-func TestEncodeToString(t *testing.T) {
-	for i, test := range encDecTests {
-		s := EncodeToString(test.dec)
-		if s != test.enc {
-			t.Errorf("#%d got:%s want:%s", i, s, test.enc)
-		}
-	}
-}
-
-func TestDecodeString(t *testing.T) {
-	for i, test := range encDecTests {
-		dst, err := DecodeString(test.enc)
-		if err != nil {
-			t.Errorf("#%d: unexpected err value: %s", i, err)
-			continue
-		}
-		if !bytes.Equal(dst, test.dec) {
-			t.Errorf("#%d: got: %#v want: #%v", i, dst, test.dec)
-		}
-	}
-}
-
-type errTest struct {
-	in  string
-	err string
-}
-
-var errTests = []errTest{
-	{"0", "encoding/hex: odd length hex string"},
-	{"0g", "encoding/hex: invalid byte: U+0067 'g'"},
-	{"00gg", "encoding/hex: invalid byte: U+0067 'g'"},
-	{"0\x01", "encoding/hex: invalid byte: U+0001"},
-}
-
-func TestInvalidErr(t *testing.T) {
-	for i, test := range errTests {
-		dst := make([]byte, DecodedLen(len(test.in)))
-		_, err := Decode(dst, []byte(test.in))
-		if err == nil {
-			t.Errorf("#%d: expected error; got none", i)
-		} else if err.Error() != test.err {
-			t.Errorf("#%d: got: %v want: %v", i, err, test.err)
-		}
-	}
-}
-
-func TestInvalidStringErr(t *testing.T) {
-	for i, test := range errTests {
-		_, err := DecodeString(test.in)
-		if err == nil {
-			t.Errorf("#%d: expected error; got none", i)
-		} else if err.Error() != test.err {
-			t.Errorf("#%d: got: %v want: %v", i, err, test.err)
-		}
-	}
-}
-
-func TestDumper(t *testing.T) {
-	var in [40]byte
-	for i := range in {
-		in[i] = byte(i + 30)
-	}
-
-	for stride := 1; stride < len(in); stride++ {
-		var out bytes.Buffer
-		dumper := Dumper(&out)
-		done := 0
-		for done < len(in) {
-			todo := done + stride
-			if todo > len(in) {
-				todo = len(in)
-			}
-			dumper.Write(in[done:todo])
-			done = todo
-		}
-
-		dumper.Close()
-		if !bytes.Equal(out.Bytes(), expectedHexDump) {
-			t.Errorf("stride: %d failed. got:\n%s\nwant:\n%s", stride, out.Bytes(), expectedHexDump)
-		}
-	}
-}
-
-func TestDump(t *testing.T) {
-	var in [40]byte
-	for i := range in {
-		in[i] = byte(i + 30)
-	}
-
-	out := []byte(Dump(in[:]))
-	if !bytes.Equal(out, expectedHexDump) {
-		t.Errorf("got:\n%s\nwant:\n%s", out, expectedHexDump)
-	}
-}
-
-var expectedHexDump = []byte(`00000000  1e 1f 20 21 22 23 24 25  26 27 28 29 2a 2b 2c 2d  |.. !"#$%&'()*+,-|
-00000010  2e 2f 30 31 32 33 34 35  36 37 38 39 3a 3b 3c 3d  |./0123456789:;<=|
-00000020  3e 3f 40 41 42 43 44 45                           |>?@ABCDE|
-`)
diff --git a/third_party/gofrontend/libgo/go/encoding/json/bench_test.go b/third_party/gofrontend/libgo/go/encoding/json/bench_test.go
deleted file mode 100644
index ed89d11..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/bench_test.go
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Large data benchmark.
-// The JSON data is a summary of agl's changes in the
-// go, webkit, and chromium open source projects.
-// We benchmark converting between the JSON form
-// and in-memory data structures.
-
-package json
-
-import (
-	"bytes"
-	"compress/gzip"
-	"io/ioutil"
-	"os"
-	"strings"
-	"testing"
-)
-
-type codeResponse struct {
-	Tree     *codeNode `json:"tree"`
-	Username string    `json:"username"`
-}
-
-type codeNode struct {
-	Name     string      `json:"name"`
-	Kids     []*codeNode `json:"kids"`
-	CLWeight float64     `json:"cl_weight"`
-	Touches  int         `json:"touches"`
-	MinT     int64       `json:"min_t"`
-	MaxT     int64       `json:"max_t"`
-	MeanT    int64       `json:"mean_t"`
-}
-
-var codeJSON []byte
-var codeStruct codeResponse
-
-func codeInit() {
-	f, err := os.Open("testdata/code.json.gz")
-	if err != nil {
-		panic(err)
-	}
-	defer f.Close()
-	gz, err := gzip.NewReader(f)
-	if err != nil {
-		panic(err)
-	}
-	data, err := ioutil.ReadAll(gz)
-	if err != nil {
-		panic(err)
-	}
-
-	codeJSON = data
-
-	if err := Unmarshal(codeJSON, &codeStruct); err != nil {
-		panic("unmarshal code.json: " + err.Error())
-	}
-
-	if data, err = Marshal(&codeStruct); err != nil {
-		panic("marshal code.json: " + err.Error())
-	}
-
-	if !bytes.Equal(data, codeJSON) {
-		println("different lengths", len(data), len(codeJSON))
-		for i := 0; i < len(data) && i < len(codeJSON); i++ {
-			if data[i] != codeJSON[i] {
-				println("re-marshal: changed at byte", i)
-				println("orig: ", string(codeJSON[i-10:i+10]))
-				println("new: ", string(data[i-10:i+10]))
-				break
-			}
-		}
-		panic("re-marshal code.json: different result")
-	}
-}
-
-func BenchmarkCodeEncoder(b *testing.B) {
-	if codeJSON == nil {
-		b.StopTimer()
-		codeInit()
-		b.StartTimer()
-	}
-	enc := NewEncoder(ioutil.Discard)
-	for i := 0; i < b.N; i++ {
-		if err := enc.Encode(&codeStruct); err != nil {
-			b.Fatal("Encode:", err)
-		}
-	}
-	b.SetBytes(int64(len(codeJSON)))
-}
-
-func BenchmarkCodeMarshal(b *testing.B) {
-	if codeJSON == nil {
-		b.StopTimer()
-		codeInit()
-		b.StartTimer()
-	}
-	for i := 0; i < b.N; i++ {
-		if _, err := Marshal(&codeStruct); err != nil {
-			b.Fatal("Marshal:", err)
-		}
-	}
-	b.SetBytes(int64(len(codeJSON)))
-}
-
-func BenchmarkCodeDecoder(b *testing.B) {
-	if codeJSON == nil {
-		b.StopTimer()
-		codeInit()
-		b.StartTimer()
-	}
-	var buf bytes.Buffer
-	dec := NewDecoder(&buf)
-	var r codeResponse
-	for i := 0; i < b.N; i++ {
-		buf.Write(codeJSON)
-		// hide EOF
-		buf.WriteByte('\n')
-		buf.WriteByte('\n')
-		buf.WriteByte('\n')
-		if err := dec.Decode(&r); err != nil {
-			b.Fatal("Decode:", err)
-		}
-	}
-	b.SetBytes(int64(len(codeJSON)))
-}
-
-func BenchmarkDecoderStream(b *testing.B) {
-	b.StopTimer()
-	var buf bytes.Buffer
-	dec := NewDecoder(&buf)
-	buf.WriteString(`"` + strings.Repeat("x", 1000000) + `"` + "\n\n\n")
-	var x interface{}
-	if err := dec.Decode(&x); err != nil {
-		b.Fatal("Decode:", err)
-	}
-	ones := strings.Repeat(" 1\n", 300000) + "\n\n\n"
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		if i%300000 == 0 {
-			buf.WriteString(ones)
-		}
-		x = nil
-		if err := dec.Decode(&x); err != nil || x != 1.0 {
-			b.Fatalf("Decode: %v after %d", err, i)
-		}
-	}
-}
-
-func BenchmarkCodeUnmarshal(b *testing.B) {
-	if codeJSON == nil {
-		b.StopTimer()
-		codeInit()
-		b.StartTimer()
-	}
-	for i := 0; i < b.N; i++ {
-		var r codeResponse
-		if err := Unmarshal(codeJSON, &r); err != nil {
-			b.Fatal("Unmmarshal:", err)
-		}
-	}
-	b.SetBytes(int64(len(codeJSON)))
-}
-
-func BenchmarkCodeUnmarshalReuse(b *testing.B) {
-	if codeJSON == nil {
-		b.StopTimer()
-		codeInit()
-		b.StartTimer()
-	}
-	var r codeResponse
-	for i := 0; i < b.N; i++ {
-		if err := Unmarshal(codeJSON, &r); err != nil {
-			b.Fatal("Unmmarshal:", err)
-		}
-	}
-}
-
-func BenchmarkUnmarshalString(b *testing.B) {
-	data := []byte(`"hello, world"`)
-	var s string
-
-	for i := 0; i < b.N; i++ {
-		if err := Unmarshal(data, &s); err != nil {
-			b.Fatal("Unmarshal:", err)
-		}
-	}
-}
-
-func BenchmarkUnmarshalFloat64(b *testing.B) {
-	var f float64
-	data := []byte(`3.14`)
-
-	for i := 0; i < b.N; i++ {
-		if err := Unmarshal(data, &f); err != nil {
-			b.Fatal("Unmarshal:", err)
-		}
-	}
-}
-
-func BenchmarkUnmarshalInt64(b *testing.B) {
-	var x int64
-	data := []byte(`3`)
-
-	for i := 0; i < b.N; i++ {
-		if err := Unmarshal(data, &x); err != nil {
-			b.Fatal("Unmarshal:", err)
-		}
-	}
-}
-
-func BenchmarkIssue10335(b *testing.B) {
-	b.ReportAllocs()
-	var s struct{}
-	j := []byte(`{"a":{ }}`)
-	for n := 0; n < b.N; n++ {
-		if err := Unmarshal(j, &s); err != nil {
-			b.Fatal(err)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/decode.go b/third_party/gofrontend/libgo/go/encoding/json/decode.go
deleted file mode 100644
index 530e852..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/decode.go
+++ /dev/null
@@ -1,1093 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Represents JSON data structure using native Go types: booleans, floats,
-// strings, arrays, and maps.
-
-package json
-
-import (
-	"bytes"
-	"encoding"
-	"encoding/base64"
-	"errors"
-	"fmt"
-	"reflect"
-	"runtime"
-	"strconv"
-	"unicode"
-	"unicode/utf16"
-	"unicode/utf8"
-)
-
-// Unmarshal parses the JSON-encoded data and stores the result
-// in the value pointed to by v.
-//
-// Unmarshal uses the inverse of the encodings that
-// Marshal uses, allocating maps, slices, and pointers as necessary,
-// with the following additional rules:
-//
-// To unmarshal JSON into a pointer, Unmarshal first handles the case of
-// the JSON being the JSON literal null.  In that case, Unmarshal sets
-// the pointer to nil.  Otherwise, Unmarshal unmarshals the JSON into
-// the value pointed at by the pointer.  If the pointer is nil, Unmarshal
-// allocates a new value for it to point to.
-//
-// To unmarshal JSON into a struct, Unmarshal matches incoming object
-// keys to the keys used by Marshal (either the struct field name or its tag),
-// preferring an exact match but also accepting a case-insensitive match.
-//
-// To unmarshal JSON into an interface value,
-// Unmarshal stores one of these in the interface value:
-//
-//	bool, for JSON booleans
-//	float64, for JSON numbers
-//	string, for JSON strings
-//	[]interface{}, for JSON arrays
-//	map[string]interface{}, for JSON objects
-//	nil for JSON null
-//
-// To unmarshal a JSON array into a slice, Unmarshal resets the slice to nil
-// and then appends each element to the slice.
-//
-// To unmarshal a JSON object into a map, Unmarshal replaces the map
-// with an empty map and then adds key-value pairs from the object to
-// the map.
-//
-// If a JSON value is not appropriate for a given target type,
-// or if a JSON number overflows the target type, Unmarshal
-// skips that field and completes the unmarshalling as best it can.
-// If no more serious errors are encountered, Unmarshal returns
-// an UnmarshalTypeError describing the earliest such error.
-//
-// The JSON null value unmarshals into an interface, map, pointer, or slice
-// by setting that Go value to nil. Because null is often used in JSON to mean
-// ``not present,'' unmarshaling a JSON null into any other Go type has no effect
-// on the value and produces no error.
-//
-// When unmarshaling quoted strings, invalid UTF-8 or
-// invalid UTF-16 surrogate pairs are not treated as an error.
-// Instead, they are replaced by the Unicode replacement
-// character U+FFFD.
-//
-func Unmarshal(data []byte, v interface{}) error {
-	// Check for well-formedness.
-	// Avoids filling out half a data structure
-	// before discovering a JSON syntax error.
-	var d decodeState
-	err := checkValid(data, &d.scan)
-	if err != nil {
-		return err
-	}
-
-	d.init(data)
-	return d.unmarshal(v)
-}
-
-// Unmarshaler is the interface implemented by objects
-// that can unmarshal a JSON description of themselves.
-// The input can be assumed to be a valid encoding of
-// a JSON value. UnmarshalJSON must copy the JSON data
-// if it wishes to retain the data after returning.
-type Unmarshaler interface {
-	UnmarshalJSON([]byte) error
-}
-
-// An UnmarshalTypeError describes a JSON value that was
-// not appropriate for a value of a specific Go type.
-type UnmarshalTypeError struct {
-	Value  string       // description of JSON value - "bool", "array", "number -5"
-	Type   reflect.Type // type of Go value it could not be assigned to
-	Offset int64        // error occurred after reading Offset bytes
-}
-
-func (e *UnmarshalTypeError) Error() string {
-	return "json: cannot unmarshal " + e.Value + " into Go value of type " + e.Type.String()
-}
-
-// An UnmarshalFieldError describes a JSON object key that
-// led to an unexported (and therefore unwritable) struct field.
-// (No longer used; kept for compatibility.)
-type UnmarshalFieldError struct {
-	Key   string
-	Type  reflect.Type
-	Field reflect.StructField
-}
-
-func (e *UnmarshalFieldError) Error() string {
-	return "json: cannot unmarshal object key " + strconv.Quote(e.Key) + " into unexported field " + e.Field.Name + " of type " + e.Type.String()
-}
-
-// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal.
-// (The argument to Unmarshal must be a non-nil pointer.)
-type InvalidUnmarshalError struct {
-	Type reflect.Type
-}
-
-func (e *InvalidUnmarshalError) Error() string {
-	if e.Type == nil {
-		return "json: Unmarshal(nil)"
-	}
-
-	if e.Type.Kind() != reflect.Ptr {
-		return "json: Unmarshal(non-pointer " + e.Type.String() + ")"
-	}
-	return "json: Unmarshal(nil " + e.Type.String() + ")"
-}
-
-func (d *decodeState) unmarshal(v interface{}) (err error) {
-	defer func() {
-		if r := recover(); r != nil {
-			if _, ok := r.(runtime.Error); ok {
-				panic(r)
-			}
-			err = r.(error)
-		}
-	}()
-
-	rv := reflect.ValueOf(v)
-	if rv.Kind() != reflect.Ptr || rv.IsNil() {
-		return &InvalidUnmarshalError{reflect.TypeOf(v)}
-	}
-
-	d.scan.reset()
-	// We decode rv not rv.Elem because the Unmarshaler interface
-	// test must be applied at the top level of the value.
-	d.value(rv)
-	return d.savedError
-}
-
-// A Number represents a JSON number literal.
-type Number string
-
-// String returns the literal text of the number.
-func (n Number) String() string { return string(n) }
-
-// Float64 returns the number as a float64.
-func (n Number) Float64() (float64, error) {
-	return strconv.ParseFloat(string(n), 64)
-}
-
-// Int64 returns the number as an int64.
-func (n Number) Int64() (int64, error) {
-	return strconv.ParseInt(string(n), 10, 64)
-}
-
-// decodeState represents the state while decoding a JSON value.
-type decodeState struct {
-	data       []byte
-	off        int // read offset in data
-	scan       scanner
-	nextscan   scanner // for calls to nextValue
-	savedError error
-	useNumber  bool
-}
-
-// errPhase is used for errors that should not happen unless
-// there is a bug in the JSON decoder or something is editing
-// the data slice while the decoder executes.
-var errPhase = errors.New("JSON decoder out of sync - data changing underfoot?")
-
-func (d *decodeState) init(data []byte) *decodeState {
-	d.data = data
-	d.off = 0
-	d.savedError = nil
-	return d
-}
-
-// error aborts the decoding by panicking with err.
-func (d *decodeState) error(err error) {
-	panic(err)
-}
-
-// saveError saves the first err it is called with,
-// for reporting at the end of the unmarshal.
-func (d *decodeState) saveError(err error) {
-	if d.savedError == nil {
-		d.savedError = err
-	}
-}
-
-// next cuts off and returns the next full JSON value in d.data[d.off:].
-// The next value is known to be an object or array, not a literal.
-func (d *decodeState) next() []byte {
-	c := d.data[d.off]
-	item, rest, err := nextValue(d.data[d.off:], &d.nextscan)
-	if err != nil {
-		d.error(err)
-	}
-	d.off = len(d.data) - len(rest)
-
-	// Our scanner has seen the opening brace/bracket
-	// and thinks we're still in the middle of the object.
-	// invent a closing brace/bracket to get it out.
-	if c == '{' {
-		d.scan.step(&d.scan, '}')
-	} else {
-		d.scan.step(&d.scan, ']')
-	}
-
-	return item
-}
-
-// scanWhile processes bytes in d.data[d.off:] until it
-// receives a scan code not equal to op.
-// It updates d.off and returns the new scan code.
-func (d *decodeState) scanWhile(op int) int {
-	var newOp int
-	for {
-		if d.off >= len(d.data) {
-			newOp = d.scan.eof()
-			d.off = len(d.data) + 1 // mark processed EOF with len+1
-		} else {
-			c := int(d.data[d.off])
-			d.off++
-			newOp = d.scan.step(&d.scan, c)
-		}
-		if newOp != op {
-			break
-		}
-	}
-	return newOp
-}
-
-// value decodes a JSON value from d.data[d.off:] into the value.
-// it updates d.off to point past the decoded value.
-func (d *decodeState) value(v reflect.Value) {
-	if !v.IsValid() {
-		_, rest, err := nextValue(d.data[d.off:], &d.nextscan)
-		if err != nil {
-			d.error(err)
-		}
-		d.off = len(d.data) - len(rest)
-
-		// d.scan thinks we're still at the beginning of the item.
-		// Feed in an empty string - the shortest, simplest value -
-		// so that it knows we got to the end of the value.
-		if d.scan.redo {
-			// rewind.
-			d.scan.redo = false
-			d.scan.step = stateBeginValue
-		}
-		d.scan.step(&d.scan, '"')
-		d.scan.step(&d.scan, '"')
-
-		n := len(d.scan.parseState)
-		if n > 0 && d.scan.parseState[n-1] == parseObjectKey {
-			// d.scan thinks we just read an object key; finish the object
-			d.scan.step(&d.scan, ':')
-			d.scan.step(&d.scan, '"')
-			d.scan.step(&d.scan, '"')
-			d.scan.step(&d.scan, '}')
-		}
-
-		return
-	}
-
-	switch op := d.scanWhile(scanSkipSpace); op {
-	default:
-		d.error(errPhase)
-
-	case scanBeginArray:
-		d.array(v)
-
-	case scanBeginObject:
-		d.object(v)
-
-	case scanBeginLiteral:
-		d.literal(v)
-	}
-}
-
-type unquotedValue struct{}
-
-// valueQuoted is like value but decodes a
-// quoted string literal or literal null into an interface value.
-// If it finds anything other than a quoted string literal or null,
-// valueQuoted returns unquotedValue{}.
-func (d *decodeState) valueQuoted() interface{} {
-	switch op := d.scanWhile(scanSkipSpace); op {
-	default:
-		d.error(errPhase)
-
-	case scanBeginArray:
-		d.array(reflect.Value{})
-
-	case scanBeginObject:
-		d.object(reflect.Value{})
-
-	case scanBeginLiteral:
-		switch v := d.literalInterface().(type) {
-		case nil, string:
-			return v
-		}
-	}
-	return unquotedValue{}
-}
-
-// indirect walks down v allocating pointers as needed,
-// until it gets to a non-pointer.
-// if it encounters an Unmarshaler, indirect stops and returns that.
-// if decodingNull is true, indirect stops at the last pointer so it can be set to nil.
-func (d *decodeState) indirect(v reflect.Value, decodingNull bool) (Unmarshaler, encoding.TextUnmarshaler, reflect.Value) {
-	// If v is a named type and is addressable,
-	// start with its address, so that if the type has pointer methods,
-	// we find them.
-	if v.Kind() != reflect.Ptr && v.Type().Name() != "" && v.CanAddr() {
-		v = v.Addr()
-	}
-	for {
-		// Load value from interface, but only if the result will be
-		// usefully addressable.
-		if v.Kind() == reflect.Interface && !v.IsNil() {
-			e := v.Elem()
-			if e.Kind() == reflect.Ptr && !e.IsNil() && (!decodingNull || e.Elem().Kind() == reflect.Ptr) {
-				v = e
-				continue
-			}
-		}
-
-		if v.Kind() != reflect.Ptr {
-			break
-		}
-
-		if v.Elem().Kind() != reflect.Ptr && decodingNull && v.CanSet() {
-			break
-		}
-		if v.IsNil() {
-			v.Set(reflect.New(v.Type().Elem()))
-		}
-		if v.Type().NumMethod() > 0 {
-			if u, ok := v.Interface().(Unmarshaler); ok {
-				return u, nil, reflect.Value{}
-			}
-			if u, ok := v.Interface().(encoding.TextUnmarshaler); ok {
-				return nil, u, reflect.Value{}
-			}
-		}
-		v = v.Elem()
-	}
-	return nil, nil, v
-}
-
-// array consumes an array from d.data[d.off-1:], decoding into the value v.
-// the first byte of the array ('[') has been read already.
-func (d *decodeState) array(v reflect.Value) {
-	// Check for unmarshaler.
-	u, ut, pv := d.indirect(v, false)
-	if u != nil {
-		d.off--
-		err := u.UnmarshalJSON(d.next())
-		if err != nil {
-			d.error(err)
-		}
-		return
-	}
-	if ut != nil {
-		d.saveError(&UnmarshalTypeError{"array", v.Type(), int64(d.off)})
-		d.off--
-		d.next()
-		return
-	}
-
-	v = pv
-
-	// Check type of target.
-	switch v.Kind() {
-	case reflect.Interface:
-		if v.NumMethod() == 0 {
-			// Decoding into nil interface?  Switch to non-reflect code.
-			v.Set(reflect.ValueOf(d.arrayInterface()))
-			return
-		}
-		// Otherwise it's invalid.
-		fallthrough
-	default:
-		d.saveError(&UnmarshalTypeError{"array", v.Type(), int64(d.off)})
-		d.off--
-		d.next()
-		return
-	case reflect.Array:
-	case reflect.Slice:
-		break
-	}
-
-	i := 0
-	for {
-		// Look ahead for ] - can only happen on first iteration.
-		op := d.scanWhile(scanSkipSpace)
-		if op == scanEndArray {
-			break
-		}
-
-		// Back up so d.value can have the byte we just read.
-		d.off--
-		d.scan.undo(op)
-
-		// Get element of array, growing if necessary.
-		if v.Kind() == reflect.Slice {
-			// Grow slice if necessary
-			if i >= v.Cap() {
-				newcap := v.Cap() + v.Cap()/2
-				if newcap < 4 {
-					newcap = 4
-				}
-				newv := reflect.MakeSlice(v.Type(), v.Len(), newcap)
-				reflect.Copy(newv, v)
-				v.Set(newv)
-			}
-			if i >= v.Len() {
-				v.SetLen(i + 1)
-			}
-		}
-
-		if i < v.Len() {
-			// Decode into element.
-			d.value(v.Index(i))
-		} else {
-			// Ran out of fixed array: skip.
-			d.value(reflect.Value{})
-		}
-		i++
-
-		// Next token must be , or ].
-		op = d.scanWhile(scanSkipSpace)
-		if op == scanEndArray {
-			break
-		}
-		if op != scanArrayValue {
-			d.error(errPhase)
-		}
-	}
-
-	if i < v.Len() {
-		if v.Kind() == reflect.Array {
-			// Array.  Zero the rest.
-			z := reflect.Zero(v.Type().Elem())
-			for ; i < v.Len(); i++ {
-				v.Index(i).Set(z)
-			}
-		} else {
-			v.SetLen(i)
-		}
-	}
-	if i == 0 && v.Kind() == reflect.Slice {
-		v.Set(reflect.MakeSlice(v.Type(), 0, 0))
-	}
-}
-
-var nullLiteral = []byte("null")
-
-// object consumes an object from d.data[d.off-1:], decoding into the value v.
-// the first byte ('{') of the object has been read already.
-func (d *decodeState) object(v reflect.Value) {
-	// Check for unmarshaler.
-	u, ut, pv := d.indirect(v, false)
-	if u != nil {
-		d.off--
-		err := u.UnmarshalJSON(d.next())
-		if err != nil {
-			d.error(err)
-		}
-		return
-	}
-	if ut != nil {
-		d.saveError(&UnmarshalTypeError{"object", v.Type(), int64(d.off)})
-		d.off--
-		d.next() // skip over { } in input
-		return
-	}
-	v = pv
-
-	// Decoding into nil interface?  Switch to non-reflect code.
-	if v.Kind() == reflect.Interface && v.NumMethod() == 0 {
-		v.Set(reflect.ValueOf(d.objectInterface()))
-		return
-	}
-
-	// Check type of target: struct or map[string]T
-	switch v.Kind() {
-	case reflect.Map:
-		// map must have string kind
-		t := v.Type()
-		if t.Key().Kind() != reflect.String {
-			d.saveError(&UnmarshalTypeError{"object", v.Type(), int64(d.off)})
-			d.off--
-			d.next() // skip over { } in input
-			return
-		}
-		if v.IsNil() {
-			v.Set(reflect.MakeMap(t))
-		}
-	case reflect.Struct:
-
-	default:
-		d.saveError(&UnmarshalTypeError{"object", v.Type(), int64(d.off)})
-		d.off--
-		d.next() // skip over { } in input
-		return
-	}
-
-	var mapElem reflect.Value
-
-	for {
-		// Read opening " of string key or closing }.
-		op := d.scanWhile(scanSkipSpace)
-		if op == scanEndObject {
-			// closing } - can only happen on first iteration.
-			break
-		}
-		if op != scanBeginLiteral {
-			d.error(errPhase)
-		}
-
-		// Read key.
-		start := d.off - 1
-		op = d.scanWhile(scanContinue)
-		item := d.data[start : d.off-1]
-		key, ok := unquoteBytes(item)
-		if !ok {
-			d.error(errPhase)
-		}
-
-		// Figure out field corresponding to key.
-		var subv reflect.Value
-		destring := false // whether the value is wrapped in a string to be decoded first
-
-		if v.Kind() == reflect.Map {
-			elemType := v.Type().Elem()
-			if !mapElem.IsValid() {
-				mapElem = reflect.New(elemType).Elem()
-			} else {
-				mapElem.Set(reflect.Zero(elemType))
-			}
-			subv = mapElem
-		} else {
-			var f *field
-			fields := cachedTypeFields(v.Type())
-			for i := range fields {
-				ff := &fields[i]
-				if bytes.Equal(ff.nameBytes, key) {
-					f = ff
-					break
-				}
-				if f == nil && ff.equalFold(ff.nameBytes, key) {
-					f = ff
-				}
-			}
-			if f != nil {
-				subv = v
-				destring = f.quoted
-				for _, i := range f.index {
-					if subv.Kind() == reflect.Ptr {
-						if subv.IsNil() {
-							subv.Set(reflect.New(subv.Type().Elem()))
-						}
-						subv = subv.Elem()
-					}
-					subv = subv.Field(i)
-				}
-			}
-		}
-
-		// Read : before value.
-		if op == scanSkipSpace {
-			op = d.scanWhile(scanSkipSpace)
-		}
-		if op != scanObjectKey {
-			d.error(errPhase)
-		}
-
-		// Read value.
-		if destring {
-			switch qv := d.valueQuoted().(type) {
-			case nil:
-				d.literalStore(nullLiteral, subv, false)
-			case string:
-				d.literalStore([]byte(qv), subv, true)
-			default:
-				d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal unquoted value into %v", subv.Type()))
-			}
-		} else {
-			d.value(subv)
-		}
-
-		// Write value back to map;
-		// if using struct, subv points into struct already.
-		if v.Kind() == reflect.Map {
-			kv := reflect.ValueOf(key).Convert(v.Type().Key())
-			v.SetMapIndex(kv, subv)
-		}
-
-		// Next token must be , or }.
-		op = d.scanWhile(scanSkipSpace)
-		if op == scanEndObject {
-			break
-		}
-		if op != scanObjectValue {
-			d.error(errPhase)
-		}
-	}
-}
-
-// literal consumes a literal from d.data[d.off-1:], decoding into the value v.
-// The first byte of the literal has been read already
-// (that's how the caller knows it's a literal).
-func (d *decodeState) literal(v reflect.Value) {
-	// All bytes inside literal return scanContinue op code.
-	start := d.off - 1
-	op := d.scanWhile(scanContinue)
-
-	// Scan read one byte too far; back up.
-	d.off--
-	d.scan.undo(op)
-
-	d.literalStore(d.data[start:d.off], v, false)
-}
-
-// convertNumber converts the number literal s to a float64 or a Number
-// depending on the setting of d.useNumber.
-func (d *decodeState) convertNumber(s string) (interface{}, error) {
-	if d.useNumber {
-		return Number(s), nil
-	}
-	f, err := strconv.ParseFloat(s, 64)
-	if err != nil {
-		return nil, &UnmarshalTypeError{"number " + s, reflect.TypeOf(0.0), int64(d.off)}
-	}
-	return f, nil
-}
-
-var numberType = reflect.TypeOf(Number(""))
-
-// literalStore decodes a literal stored in item into v.
-//
-// fromQuoted indicates whether this literal came from unwrapping a
-// string from the ",string" struct tag option. this is used only to
-// produce more helpful error messages.
-func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool) {
-	// Check for unmarshaler.
-	if len(item) == 0 {
-		//Empty string given
-		d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
-		return
-	}
-	wantptr := item[0] == 'n' // null
-	u, ut, pv := d.indirect(v, wantptr)
-	if u != nil {
-		err := u.UnmarshalJSON(item)
-		if err != nil {
-			d.error(err)
-		}
-		return
-	}
-	if ut != nil {
-		if item[0] != '"' {
-			if fromQuoted {
-				d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
-			} else {
-				d.saveError(&UnmarshalTypeError{"string", v.Type(), int64(d.off)})
-			}
-			return
-		}
-		s, ok := unquoteBytes(item)
-		if !ok {
-			if fromQuoted {
-				d.error(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
-			} else {
-				d.error(errPhase)
-			}
-		}
-		err := ut.UnmarshalText(s)
-		if err != nil {
-			d.error(err)
-		}
-		return
-	}
-
-	v = pv
-
-	switch c := item[0]; c {
-	case 'n': // null
-		switch v.Kind() {
-		case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice:
-			v.Set(reflect.Zero(v.Type()))
-			// otherwise, ignore null for primitives/string
-		}
-	case 't', 'f': // true, false
-		value := c == 't'
-		switch v.Kind() {
-		default:
-			if fromQuoted {
-				d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
-			} else {
-				d.saveError(&UnmarshalTypeError{"bool", v.Type(), int64(d.off)})
-			}
-		case reflect.Bool:
-			v.SetBool(value)
-		case reflect.Interface:
-			if v.NumMethod() == 0 {
-				v.Set(reflect.ValueOf(value))
-			} else {
-				d.saveError(&UnmarshalTypeError{"bool", v.Type(), int64(d.off)})
-			}
-		}
-
-	case '"': // string
-		s, ok := unquoteBytes(item)
-		if !ok {
-			if fromQuoted {
-				d.error(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
-			} else {
-				d.error(errPhase)
-			}
-		}
-		switch v.Kind() {
-		default:
-			d.saveError(&UnmarshalTypeError{"string", v.Type(), int64(d.off)})
-		case reflect.Slice:
-			if v.Type().Elem().Kind() != reflect.Uint8 {
-				d.saveError(&UnmarshalTypeError{"string", v.Type(), int64(d.off)})
-				break
-			}
-			b := make([]byte, base64.StdEncoding.DecodedLen(len(s)))
-			n, err := base64.StdEncoding.Decode(b, s)
-			if err != nil {
-				d.saveError(err)
-				break
-			}
-			v.Set(reflect.ValueOf(b[0:n]))
-		case reflect.String:
-			v.SetString(string(s))
-		case reflect.Interface:
-			if v.NumMethod() == 0 {
-				v.Set(reflect.ValueOf(string(s)))
-			} else {
-				d.saveError(&UnmarshalTypeError{"string", v.Type(), int64(d.off)})
-			}
-		}
-
-	default: // number
-		if c != '-' && (c < '0' || c > '9') {
-			if fromQuoted {
-				d.error(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
-			} else {
-				d.error(errPhase)
-			}
-		}
-		s := string(item)
-		switch v.Kind() {
-		default:
-			if v.Kind() == reflect.String && v.Type() == numberType {
-				v.SetString(s)
-				break
-			}
-			if fromQuoted {
-				d.error(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
-			} else {
-				d.error(&UnmarshalTypeError{"number", v.Type(), int64(d.off)})
-			}
-		case reflect.Interface:
-			n, err := d.convertNumber(s)
-			if err != nil {
-				d.saveError(err)
-				break
-			}
-			if v.NumMethod() != 0 {
-				d.saveError(&UnmarshalTypeError{"number", v.Type(), int64(d.off)})
-				break
-			}
-			v.Set(reflect.ValueOf(n))
-
-		case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-			n, err := strconv.ParseInt(s, 10, 64)
-			if err != nil || v.OverflowInt(n) {
-				d.saveError(&UnmarshalTypeError{"number " + s, v.Type(), int64(d.off)})
-				break
-			}
-			v.SetInt(n)
-
-		case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-			n, err := strconv.ParseUint(s, 10, 64)
-			if err != nil || v.OverflowUint(n) {
-				d.saveError(&UnmarshalTypeError{"number " + s, v.Type(), int64(d.off)})
-				break
-			}
-			v.SetUint(n)
-
-		case reflect.Float32, reflect.Float64:
-			n, err := strconv.ParseFloat(s, v.Type().Bits())
-			if err != nil || v.OverflowFloat(n) {
-				d.saveError(&UnmarshalTypeError{"number " + s, v.Type(), int64(d.off)})
-				break
-			}
-			v.SetFloat(n)
-		}
-	}
-}
-
-// The xxxInterface routines build up a value to be stored
-// in an empty interface.  They are not strictly necessary,
-// but they avoid the weight of reflection in this common case.
-
-// valueInterface is like value but returns interface{}
-func (d *decodeState) valueInterface() interface{} {
-	switch d.scanWhile(scanSkipSpace) {
-	default:
-		d.error(errPhase)
-		panic("unreachable")
-	case scanBeginArray:
-		return d.arrayInterface()
-	case scanBeginObject:
-		return d.objectInterface()
-	case scanBeginLiteral:
-		return d.literalInterface()
-	}
-}
-
-// arrayInterface is like array but returns []interface{}.
-func (d *decodeState) arrayInterface() []interface{} {
-	var v = make([]interface{}, 0)
-	for {
-		// Look ahead for ] - can only happen on first iteration.
-		op := d.scanWhile(scanSkipSpace)
-		if op == scanEndArray {
-			break
-		}
-
-		// Back up so d.value can have the byte we just read.
-		d.off--
-		d.scan.undo(op)
-
-		v = append(v, d.valueInterface())
-
-		// Next token must be , or ].
-		op = d.scanWhile(scanSkipSpace)
-		if op == scanEndArray {
-			break
-		}
-		if op != scanArrayValue {
-			d.error(errPhase)
-		}
-	}
-	return v
-}
-
-// objectInterface is like object but returns map[string]interface{}.
-func (d *decodeState) objectInterface() map[string]interface{} {
-	m := make(map[string]interface{})
-	for {
-		// Read opening " of string key or closing }.
-		op := d.scanWhile(scanSkipSpace)
-		if op == scanEndObject {
-			// closing } - can only happen on first iteration.
-			break
-		}
-		if op != scanBeginLiteral {
-			d.error(errPhase)
-		}
-
-		// Read string key.
-		start := d.off - 1
-		op = d.scanWhile(scanContinue)
-		item := d.data[start : d.off-1]
-		key, ok := unquote(item)
-		if !ok {
-			d.error(errPhase)
-		}
-
-		// Read : before value.
-		if op == scanSkipSpace {
-			op = d.scanWhile(scanSkipSpace)
-		}
-		if op != scanObjectKey {
-			d.error(errPhase)
-		}
-
-		// Read value.
-		m[key] = d.valueInterface()
-
-		// Next token must be , or }.
-		op = d.scanWhile(scanSkipSpace)
-		if op == scanEndObject {
-			break
-		}
-		if op != scanObjectValue {
-			d.error(errPhase)
-		}
-	}
-	return m
-}
-
-// literalInterface is like literal but returns an interface value.
-func (d *decodeState) literalInterface() interface{} {
-	// All bytes inside literal return scanContinue op code.
-	start := d.off - 1
-	op := d.scanWhile(scanContinue)
-
-	// Scan read one byte too far; back up.
-	d.off--
-	d.scan.undo(op)
-	item := d.data[start:d.off]
-
-	switch c := item[0]; c {
-	case 'n': // null
-		return nil
-
-	case 't', 'f': // true, false
-		return c == 't'
-
-	case '"': // string
-		s, ok := unquote(item)
-		if !ok {
-			d.error(errPhase)
-		}
-		return s
-
-	default: // number
-		if c != '-' && (c < '0' || c > '9') {
-			d.error(errPhase)
-		}
-		n, err := d.convertNumber(string(item))
-		if err != nil {
-			d.saveError(err)
-		}
-		return n
-	}
-}
-
-// getu4 decodes \uXXXX from the beginning of s, returning the hex value,
-// or it returns -1.
-func getu4(s []byte) rune {
-	if len(s) < 6 || s[0] != '\\' || s[1] != 'u' {
-		return -1
-	}
-	r, err := strconv.ParseUint(string(s[2:6]), 16, 64)
-	if err != nil {
-		return -1
-	}
-	return rune(r)
-}
-
-// unquote converts a quoted JSON string literal s into an actual string t.
-// The rules are different than for Go, so cannot use strconv.Unquote.
-func unquote(s []byte) (t string, ok bool) {
-	s, ok = unquoteBytes(s)
-	t = string(s)
-	return
-}
-
-func unquoteBytes(s []byte) (t []byte, ok bool) {
-	if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' {
-		return
-	}
-	s = s[1 : len(s)-1]
-
-	// Check for unusual characters. If there are none,
-	// then no unquoting is needed, so return a slice of the
-	// original bytes.
-	r := 0
-	for r < len(s) {
-		c := s[r]
-		if c == '\\' || c == '"' || c < ' ' {
-			break
-		}
-		if c < utf8.RuneSelf {
-			r++
-			continue
-		}
-		rr, size := utf8.DecodeRune(s[r:])
-		if rr == utf8.RuneError && size == 1 {
-			break
-		}
-		r += size
-	}
-	if r == len(s) {
-		return s, true
-	}
-
-	b := make([]byte, len(s)+2*utf8.UTFMax)
-	w := copy(b, s[0:r])
-	for r < len(s) {
-		// Out of room?  Can only happen if s is full of
-		// malformed UTF-8 and we're replacing each
-		// byte with RuneError.
-		if w >= len(b)-2*utf8.UTFMax {
-			nb := make([]byte, (len(b)+utf8.UTFMax)*2)
-			copy(nb, b[0:w])
-			b = nb
-		}
-		switch c := s[r]; {
-		case c == '\\':
-			r++
-			if r >= len(s) {
-				return
-			}
-			switch s[r] {
-			default:
-				return
-			case '"', '\\', '/', '\'':
-				b[w] = s[r]
-				r++
-				w++
-			case 'b':
-				b[w] = '\b'
-				r++
-				w++
-			case 'f':
-				b[w] = '\f'
-				r++
-				w++
-			case 'n':
-				b[w] = '\n'
-				r++
-				w++
-			case 'r':
-				b[w] = '\r'
-				r++
-				w++
-			case 't':
-				b[w] = '\t'
-				r++
-				w++
-			case 'u':
-				r--
-				rr := getu4(s[r:])
-				if rr < 0 {
-					return
-				}
-				r += 6
-				if utf16.IsSurrogate(rr) {
-					rr1 := getu4(s[r:])
-					if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar {
-						// A valid pair; consume.
-						r += 6
-						w += utf8.EncodeRune(b[w:], dec)
-						break
-					}
-					// Invalid surrogate; fall back to replacement rune.
-					rr = unicode.ReplacementChar
-				}
-				w += utf8.EncodeRune(b[w:], rr)
-			}
-
-		// Quote, control characters are invalid.
-		case c == '"', c < ' ':
-			return
-
-		// ASCII
-		case c < utf8.RuneSelf:
-			b[w] = c
-			r++
-			w++
-
-		// Coerce to well-formed UTF-8.
-		default:
-			rr, size := utf8.DecodeRune(s[r:])
-			r += size
-			w += utf8.EncodeRune(b[w:], rr)
-		}
-	}
-	return b[0:w], true
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/decode_test.go b/third_party/gofrontend/libgo/go/encoding/json/decode_test.go
deleted file mode 100644
index 51b15ef..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/decode_test.go
+++ /dev/null
@@ -1,1465 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
-	"bytes"
-	"encoding"
-	"fmt"
-	"image"
-	"net"
-	"reflect"
-	"strings"
-	"testing"
-	"time"
-)
-
-type T struct {
-	X string
-	Y int
-	Z int `json:"-"`
-}
-
-type U struct {
-	Alphabet string `json:"alpha"`
-}
-
-type V struct {
-	F1 interface{}
-	F2 int32
-	F3 Number
-}
-
-// ifaceNumAsFloat64/ifaceNumAsNumber are used to test unmarshaling with and
-// without UseNumber
-var ifaceNumAsFloat64 = map[string]interface{}{
-	"k1": float64(1),
-	"k2": "s",
-	"k3": []interface{}{float64(1), float64(2.0), float64(3e-3)},
-	"k4": map[string]interface{}{"kk1": "s", "kk2": float64(2)},
-}
-
-var ifaceNumAsNumber = map[string]interface{}{
-	"k1": Number("1"),
-	"k2": "s",
-	"k3": []interface{}{Number("1"), Number("2.0"), Number("3e-3")},
-	"k4": map[string]interface{}{"kk1": "s", "kk2": Number("2")},
-}
-
-type tx struct {
-	x int
-}
-
-// A type that can unmarshal itself.
-
-type unmarshaler struct {
-	T bool
-}
-
-func (u *unmarshaler) UnmarshalJSON(b []byte) error {
-	*u = unmarshaler{true} // All we need to see that UnmarshalJSON is called.
-	return nil
-}
-
-type ustruct struct {
-	M unmarshaler
-}
-
-type unmarshalerText struct {
-	T bool
-}
-
-// needed for re-marshaling tests
-func (u *unmarshalerText) MarshalText() ([]byte, error) {
-	return []byte(""), nil
-}
-
-func (u *unmarshalerText) UnmarshalText(b []byte) error {
-	*u = unmarshalerText{true} // All we need to see that UnmarshalText is called.
-	return nil
-}
-
-var _ encoding.TextUnmarshaler = (*unmarshalerText)(nil)
-
-type ustructText struct {
-	M unmarshalerText
-}
-
-var (
-	um0, um1 unmarshaler // target2 of unmarshaling
-	ump      = &um1
-	umtrue   = unmarshaler{true}
-	umslice  = []unmarshaler{{true}}
-	umslicep = new([]unmarshaler)
-	umstruct = ustruct{unmarshaler{true}}
-
-	um0T, um1T unmarshalerText // target2 of unmarshaling
-	umpT       = &um1T
-	umtrueT    = unmarshalerText{true}
-	umsliceT   = []unmarshalerText{{true}}
-	umslicepT  = new([]unmarshalerText)
-	umstructT  = ustructText{unmarshalerText{true}}
-)
-
-// Test data structures for anonymous fields.
-
-type Point struct {
-	Z int
-}
-
-type Top struct {
-	Level0 int
-	Embed0
-	*Embed0a
-	*Embed0b `json:"e,omitempty"` // treated as named
-	Embed0c  `json:"-"`           // ignored
-	Loop
-	Embed0p // has Point with X, Y, used
-	Embed0q // has Point with Z, used
-	embed   // contains exported field
-}
-
-type Embed0 struct {
-	Level1a int // overridden by Embed0a's Level1a with json tag
-	Level1b int // used because Embed0a's Level1b is renamed
-	Level1c int // used because Embed0a's Level1c is ignored
-	Level1d int // annihilated by Embed0a's Level1d
-	Level1e int `json:"x"` // annihilated by Embed0a.Level1e
-}
-
-type Embed0a struct {
-	Level1a int `json:"Level1a,omitempty"`
-	Level1b int `json:"LEVEL1B,omitempty"`
-	Level1c int `json:"-"`
-	Level1d int // annihilated by Embed0's Level1d
-	Level1f int `json:"x"` // annihilated by Embed0's Level1e
-}
-
-type Embed0b Embed0
-
-type Embed0c Embed0
-
-type Embed0p struct {
-	image.Point
-}
-
-type Embed0q struct {
-	Point
-}
-
-type embed struct {
-	Q int
-}
-
-type Loop struct {
-	Loop1 int `json:",omitempty"`
-	Loop2 int `json:",omitempty"`
-	*Loop
-}
-
-// From reflect test:
-// The X in S6 and S7 annihilate, but they also block the X in S8.S9.
-type S5 struct {
-	S6
-	S7
-	S8
-}
-
-type S6 struct {
-	X int
-}
-
-type S7 S6
-
-type S8 struct {
-	S9
-}
-
-type S9 struct {
-	X int
-	Y int
-}
-
-// From reflect test:
-// The X in S11.S6 and S12.S6 annihilate, but they also block the X in S13.S8.S9.
-type S10 struct {
-	S11
-	S12
-	S13
-}
-
-type S11 struct {
-	S6
-}
-
-type S12 struct {
-	S6
-}
-
-type S13 struct {
-	S8
-}
-
-type unmarshalTest struct {
-	in        string
-	ptr       interface{}
-	out       interface{}
-	err       error
-	useNumber bool
-}
-
-type Ambig struct {
-	// Given "hello", the first match should win.
-	First  int `json:"HELLO"`
-	Second int `json:"Hello"`
-}
-
-type XYZ struct {
-	X interface{}
-	Y interface{}
-	Z interface{}
-}
-
-func sliceAddr(x []int) *[]int                 { return &x }
-func mapAddr(x map[string]int) *map[string]int { return &x }
-
-var unmarshalTests = []unmarshalTest{
-	// basic types
-	{in: `true`, ptr: new(bool), out: true},
-	{in: `1`, ptr: new(int), out: 1},
-	{in: `1.2`, ptr: new(float64), out: 1.2},
-	{in: `-5`, ptr: new(int16), out: int16(-5)},
-	{in: `2`, ptr: new(Number), out: Number("2"), useNumber: true},
-	{in: `2`, ptr: new(Number), out: Number("2")},
-	{in: `2`, ptr: new(interface{}), out: float64(2.0)},
-	{in: `2`, ptr: new(interface{}), out: Number("2"), useNumber: true},
-	{in: `"a\u1234"`, ptr: new(string), out: "a\u1234"},
-	{in: `"http:\/\/"`, ptr: new(string), out: "http://"},
-	{in: `"g-clef: \uD834\uDD1E"`, ptr: new(string), out: "g-clef: \U0001D11E"},
-	{in: `"invalid: \uD834x\uDD1E"`, ptr: new(string), out: "invalid: \uFFFDx\uFFFD"},
-	{in: "null", ptr: new(interface{}), out: nil},
-	{in: `{"X": [1,2,3], "Y": 4}`, ptr: new(T), out: T{Y: 4}, err: &UnmarshalTypeError{"array", reflect.TypeOf(""), 7}},
-	{in: `{"x": 1}`, ptr: new(tx), out: tx{}},
-	{in: `{"F1":1,"F2":2,"F3":3}`, ptr: new(V), out: V{F1: float64(1), F2: int32(2), F3: Number("3")}},
-	{in: `{"F1":1,"F2":2,"F3":3}`, ptr: new(V), out: V{F1: Number("1"), F2: int32(2), F3: Number("3")}, useNumber: true},
-	{in: `{"k1":1,"k2":"s","k3":[1,2.0,3e-3],"k4":{"kk1":"s","kk2":2}}`, ptr: new(interface{}), out: ifaceNumAsFloat64},
-	{in: `{"k1":1,"k2":"s","k3":[1,2.0,3e-3],"k4":{"kk1":"s","kk2":2}}`, ptr: new(interface{}), out: ifaceNumAsNumber, useNumber: true},
-
-	// raw values with whitespace
-	{in: "\n true ", ptr: new(bool), out: true},
-	{in: "\t 1 ", ptr: new(int), out: 1},
-	{in: "\r 1.2 ", ptr: new(float64), out: 1.2},
-	{in: "\t -5 \n", ptr: new(int16), out: int16(-5)},
-	{in: "\t \"a\\u1234\" \n", ptr: new(string), out: "a\u1234"},
-
-	// Z has a "-" tag.
-	{in: `{"Y": 1, "Z": 2}`, ptr: new(T), out: T{Y: 1}},
-
-	{in: `{"alpha": "abc", "alphabet": "xyz"}`, ptr: new(U), out: U{Alphabet: "abc"}},
-	{in: `{"alpha": "abc"}`, ptr: new(U), out: U{Alphabet: "abc"}},
-	{in: `{"alphabet": "xyz"}`, ptr: new(U), out: U{}},
-
-	// syntax errors
-	{in: `{"X": "foo", "Y"}`, err: &SyntaxError{"invalid character '}' after object key", 17}},
-	{in: `[1, 2, 3+]`, err: &SyntaxError{"invalid character '+' after array element", 9}},
-	{in: `{"X":12x}`, err: &SyntaxError{"invalid character 'x' after object key:value pair", 8}, useNumber: true},
-
-	// raw value errors
-	{in: "\x01 42", err: &SyntaxError{"invalid character '\\x01' looking for beginning of value", 1}},
-	{in: " 42 \x01", err: &SyntaxError{"invalid character '\\x01' after top-level value", 5}},
-	{in: "\x01 true", err: &SyntaxError{"invalid character '\\x01' looking for beginning of value", 1}},
-	{in: " false \x01", err: &SyntaxError{"invalid character '\\x01' after top-level value", 8}},
-	{in: "\x01 1.2", err: &SyntaxError{"invalid character '\\x01' looking for beginning of value", 1}},
-	{in: " 3.4 \x01", err: &SyntaxError{"invalid character '\\x01' after top-level value", 6}},
-	{in: "\x01 \"string\"", err: &SyntaxError{"invalid character '\\x01' looking for beginning of value", 1}},
-	{in: " \"string\" \x01", err: &SyntaxError{"invalid character '\\x01' after top-level value", 11}},
-
-	// array tests
-	{in: `[1, 2, 3]`, ptr: new([3]int), out: [3]int{1, 2, 3}},
-	{in: `[1, 2, 3]`, ptr: new([1]int), out: [1]int{1}},
-	{in: `[1, 2, 3]`, ptr: new([5]int), out: [5]int{1, 2, 3, 0, 0}},
-
-	// empty array to interface test
-	{in: `[]`, ptr: new([]interface{}), out: []interface{}{}},
-	{in: `null`, ptr: new([]interface{}), out: []interface{}(nil)},
-	{in: `{"T":[]}`, ptr: new(map[string]interface{}), out: map[string]interface{}{"T": []interface{}{}}},
-	{in: `{"T":null}`, ptr: new(map[string]interface{}), out: map[string]interface{}{"T": interface{}(nil)}},
-
-	// composite tests
-	{in: allValueIndent, ptr: new(All), out: allValue},
-	{in: allValueCompact, ptr: new(All), out: allValue},
-	{in: allValueIndent, ptr: new(*All), out: &allValue},
-	{in: allValueCompact, ptr: new(*All), out: &allValue},
-	{in: pallValueIndent, ptr: new(All), out: pallValue},
-	{in: pallValueCompact, ptr: new(All), out: pallValue},
-	{in: pallValueIndent, ptr: new(*All), out: &pallValue},
-	{in: pallValueCompact, ptr: new(*All), out: &pallValue},
-
-	// unmarshal interface test
-	{in: `{"T":false}`, ptr: &um0, out: umtrue}, // use "false" so test will fail if custom unmarshaler is not called
-	{in: `{"T":false}`, ptr: &ump, out: &umtrue},
-	{in: `[{"T":false}]`, ptr: &umslice, out: umslice},
-	{in: `[{"T":false}]`, ptr: &umslicep, out: &umslice},
-	{in: `{"M":{"T":false}}`, ptr: &umstruct, out: umstruct},
-
-	// UnmarshalText interface test
-	{in: `"X"`, ptr: &um0T, out: umtrueT}, // use "false" so test will fail if custom unmarshaler is not called
-	{in: `"X"`, ptr: &umpT, out: &umtrueT},
-	{in: `["X"]`, ptr: &umsliceT, out: umsliceT},
-	{in: `["X"]`, ptr: &umslicepT, out: &umsliceT},
-	{in: `{"M":"X"}`, ptr: &umstructT, out: umstructT},
-
-	// Overwriting of data.
-	// This is different from package xml, but it's what we've always done.
-	// Now documented and tested.
-	{in: `[2]`, ptr: sliceAddr([]int{1}), out: []int{2}},
-	{in: `{"key": 2}`, ptr: mapAddr(map[string]int{"old": 0, "key": 1}), out: map[string]int{"key": 2}},
-
-	{
-		in: `{
-			"Level0": 1,
-			"Level1b": 2,
-			"Level1c": 3,
-			"x": 4,
-			"Level1a": 5,
-			"LEVEL1B": 6,
-			"e": {
-				"Level1a": 8,
-				"Level1b": 9,
-				"Level1c": 10,
-				"Level1d": 11,
-				"x": 12
-			},
-			"Loop1": 13,
-			"Loop2": 14,
-			"X": 15,
-			"Y": 16,
-			"Z": 17,
-			"Q": 18
-		}`,
-		ptr: new(Top),
-		out: Top{
-			Level0: 1,
-			Embed0: Embed0{
-				Level1b: 2,
-				Level1c: 3,
-			},
-			Embed0a: &Embed0a{
-				Level1a: 5,
-				Level1b: 6,
-			},
-			Embed0b: &Embed0b{
-				Level1a: 8,
-				Level1b: 9,
-				Level1c: 10,
-				Level1d: 11,
-				Level1e: 12,
-			},
-			Loop: Loop{
-				Loop1: 13,
-				Loop2: 14,
-			},
-			Embed0p: Embed0p{
-				Point: image.Point{X: 15, Y: 16},
-			},
-			Embed0q: Embed0q{
-				Point: Point{Z: 17},
-			},
-			embed: embed{
-				Q: 18,
-			},
-		},
-	},
-	{
-		in:  `{"hello": 1}`,
-		ptr: new(Ambig),
-		out: Ambig{First: 1},
-	},
-
-	{
-		in:  `{"X": 1,"Y":2}`,
-		ptr: new(S5),
-		out: S5{S8: S8{S9: S9{Y: 2}}},
-	},
-	{
-		in:  `{"X": 1,"Y":2}`,
-		ptr: new(S10),
-		out: S10{S13: S13{S8: S8{S9: S9{Y: 2}}}},
-	},
-
-	// invalid UTF-8 is coerced to valid UTF-8.
-	{
-		in:  "\"hello\xffworld\"",
-		ptr: new(string),
-		out: "hello\ufffdworld",
-	},
-	{
-		in:  "\"hello\xc2\xc2world\"",
-		ptr: new(string),
-		out: "hello\ufffd\ufffdworld",
-	},
-	{
-		in:  "\"hello\xc2\xffworld\"",
-		ptr: new(string),
-		out: "hello\ufffd\ufffdworld",
-	},
-	{
-		in:  "\"hello\\ud800world\"",
-		ptr: new(string),
-		out: "hello\ufffdworld",
-	},
-	{
-		in:  "\"hello\\ud800\\ud800world\"",
-		ptr: new(string),
-		out: "hello\ufffd\ufffdworld",
-	},
-	{
-		in:  "\"hello\\ud800\\ud800world\"",
-		ptr: new(string),
-		out: "hello\ufffd\ufffdworld",
-	},
-	{
-		in:  "\"hello\xed\xa0\x80\xed\xb0\x80world\"",
-		ptr: new(string),
-		out: "hello\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdworld",
-	},
-
-	// issue 8305
-	{
-		in:  `{"2009-11-10T23:00:00Z": "hello world"}`,
-		ptr: &map[time.Time]string{},
-		err: &UnmarshalTypeError{"object", reflect.TypeOf(map[time.Time]string{}), 1},
-	},
-}
-
-func TestMarshal(t *testing.T) {
-	b, err := Marshal(allValue)
-	if err != nil {
-		t.Fatalf("Marshal allValue: %v", err)
-	}
-	if string(b) != allValueCompact {
-		t.Errorf("Marshal allValueCompact")
-		diff(t, b, []byte(allValueCompact))
-		return
-	}
-
-	b, err = Marshal(pallValue)
-	if err != nil {
-		t.Fatalf("Marshal pallValue: %v", err)
-	}
-	if string(b) != pallValueCompact {
-		t.Errorf("Marshal pallValueCompact")
-		diff(t, b, []byte(pallValueCompact))
-		return
-	}
-}
-
-var badUTF8 = []struct {
-	in, out string
-}{
-	{"hello\xffworld", `"hello\ufffdworld"`},
-	{"", `""`},
-	{"\xff", `"\ufffd"`},
-	{"\xff\xff", `"\ufffd\ufffd"`},
-	{"a\xffb", `"a\ufffdb"`},
-	{"\xe6\x97\xa5\xe6\x9c\xac\xff\xaa\x9e", `"日本\ufffd\ufffd\ufffd"`},
-}
-
-func TestMarshalBadUTF8(t *testing.T) {
-	for _, tt := range badUTF8 {
-		b, err := Marshal(tt.in)
-		if string(b) != tt.out || err != nil {
-			t.Errorf("Marshal(%q) = %#q, %v, want %#q, nil", tt.in, b, err, tt.out)
-		}
-	}
-}
-
-func TestMarshalNumberZeroVal(t *testing.T) {
-	var n Number
-	out, err := Marshal(n)
-	if err != nil {
-		t.Fatal(err)
-	}
-	outStr := string(out)
-	if outStr != "0" {
-		t.Fatalf("Invalid zero val for Number: %q", outStr)
-	}
-}
-
-func TestMarshalEmbeds(t *testing.T) {
-	top := &Top{
-		Level0: 1,
-		Embed0: Embed0{
-			Level1b: 2,
-			Level1c: 3,
-		},
-		Embed0a: &Embed0a{
-			Level1a: 5,
-			Level1b: 6,
-		},
-		Embed0b: &Embed0b{
-			Level1a: 8,
-			Level1b: 9,
-			Level1c: 10,
-			Level1d: 11,
-			Level1e: 12,
-		},
-		Loop: Loop{
-			Loop1: 13,
-			Loop2: 14,
-		},
-		Embed0p: Embed0p{
-			Point: image.Point{X: 15, Y: 16},
-		},
-		Embed0q: Embed0q{
-			Point: Point{Z: 17},
-		},
-		embed: embed{
-			Q: 18,
-		},
-	}
-	b, err := Marshal(top)
-	if err != nil {
-		t.Fatal(err)
-	}
-	want := "{\"Level0\":1,\"Level1b\":2,\"Level1c\":3,\"Level1a\":5,\"LEVEL1B\":6,\"e\":{\"Level1a\":8,\"Level1b\":9,\"Level1c\":10,\"Level1d\":11,\"x\":12},\"Loop1\":13,\"Loop2\":14,\"X\":15,\"Y\":16,\"Z\":17,\"Q\":18}"
-	if string(b) != want {
-		t.Errorf("Wrong marshal result.\n got: %q\nwant: %q", b, want)
-	}
-}
-
-func TestUnmarshal(t *testing.T) {
-	for i, tt := range unmarshalTests {
-		var scan scanner
-		in := []byte(tt.in)
-		if err := checkValid(in, &scan); err != nil {
-			if !reflect.DeepEqual(err, tt.err) {
-				t.Errorf("#%d: checkValid: %#v", i, err)
-				continue
-			}
-		}
-		if tt.ptr == nil {
-			continue
-		}
-
-		// v = new(right-type)
-		v := reflect.New(reflect.TypeOf(tt.ptr).Elem())
-		dec := NewDecoder(bytes.NewReader(in))
-		if tt.useNumber {
-			dec.UseNumber()
-		}
-		if err := dec.Decode(v.Interface()); !reflect.DeepEqual(err, tt.err) {
-			t.Errorf("#%d: %v, want %v", i, err, tt.err)
-			continue
-		} else if err != nil {
-			continue
-		}
-		if !reflect.DeepEqual(v.Elem().Interface(), tt.out) {
-			t.Errorf("#%d: mismatch\nhave: %#+v\nwant: %#+v", i, v.Elem().Interface(), tt.out)
-			data, _ := Marshal(v.Elem().Interface())
-			println(string(data))
-			data, _ = Marshal(tt.out)
-			println(string(data))
-			continue
-		}
-
-		// Check round trip.
-		if tt.err == nil {
-			enc, err := Marshal(v.Interface())
-			if err != nil {
-				t.Errorf("#%d: error re-marshaling: %v", i, err)
-				continue
-			}
-			vv := reflect.New(reflect.TypeOf(tt.ptr).Elem())
-			dec = NewDecoder(bytes.NewReader(enc))
-			if tt.useNumber {
-				dec.UseNumber()
-			}
-			if err := dec.Decode(vv.Interface()); err != nil {
-				t.Errorf("#%d: error re-unmarshaling %#q: %v", i, enc, err)
-				continue
-			}
-			if !reflect.DeepEqual(v.Elem().Interface(), vv.Elem().Interface()) {
-				t.Errorf("#%d: mismatch\nhave: %#+v\nwant: %#+v", i, v.Elem().Interface(), vv.Elem().Interface())
-				t.Errorf("     In: %q", strings.Map(noSpace, string(in)))
-				t.Errorf("Marshal: %q", strings.Map(noSpace, string(enc)))
-				continue
-			}
-		}
-	}
-}
-
-func TestUnmarshalMarshal(t *testing.T) {
-	initBig()
-	var v interface{}
-	if err := Unmarshal(jsonBig, &v); err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	b, err := Marshal(v)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	if !bytes.Equal(jsonBig, b) {
-		t.Errorf("Marshal jsonBig")
-		diff(t, b, jsonBig)
-		return
-	}
-}
-
-var numberTests = []struct {
-	in       string
-	i        int64
-	intErr   string
-	f        float64
-	floatErr string
-}{
-	{in: "-1.23e1", intErr: "strconv.ParseInt: parsing \"-1.23e1\": invalid syntax", f: -1.23e1},
-	{in: "-12", i: -12, f: -12.0},
-	{in: "1e1000", intErr: "strconv.ParseInt: parsing \"1e1000\": invalid syntax", floatErr: "strconv.ParseFloat: parsing \"1e1000\": value out of range"},
-}
-
-// Independent of Decode, basic coverage of the accessors in Number
-func TestNumberAccessors(t *testing.T) {
-	for _, tt := range numberTests {
-		n := Number(tt.in)
-		if s := n.String(); s != tt.in {
-			t.Errorf("Number(%q).String() is %q", tt.in, s)
-		}
-		if i, err := n.Int64(); err == nil && tt.intErr == "" && i != tt.i {
-			t.Errorf("Number(%q).Int64() is %d", tt.in, i)
-		} else if (err == nil && tt.intErr != "") || (err != nil && err.Error() != tt.intErr) {
-			t.Errorf("Number(%q).Int64() wanted error %q but got: %v", tt.in, tt.intErr, err)
-		}
-		if f, err := n.Float64(); err == nil && tt.floatErr == "" && f != tt.f {
-			t.Errorf("Number(%q).Float64() is %g", tt.in, f)
-		} else if (err == nil && tt.floatErr != "") || (err != nil && err.Error() != tt.floatErr) {
-			t.Errorf("Number(%q).Float64() wanted error %q but got: %v", tt.in, tt.floatErr, err)
-		}
-	}
-}
-
-func TestLargeByteSlice(t *testing.T) {
-	s0 := make([]byte, 2000)
-	for i := range s0 {
-		s0[i] = byte(i)
-	}
-	b, err := Marshal(s0)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	var s1 []byte
-	if err := Unmarshal(b, &s1); err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if !bytes.Equal(s0, s1) {
-		t.Errorf("Marshal large byte slice")
-		diff(t, s0, s1)
-	}
-}
-
-type Xint struct {
-	X int
-}
-
-func TestUnmarshalInterface(t *testing.T) {
-	var xint Xint
-	var i interface{} = &xint
-	if err := Unmarshal([]byte(`{"X":1}`), &i); err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if xint.X != 1 {
-		t.Fatalf("Did not write to xint")
-	}
-}
-
-func TestUnmarshalPtrPtr(t *testing.T) {
-	var xint Xint
-	pxint := &xint
-	if err := Unmarshal([]byte(`{"X":1}`), &pxint); err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if xint.X != 1 {
-		t.Fatalf("Did not write to xint")
-	}
-}
-
-func TestEscape(t *testing.T) {
-	const input = `"foobar"<html>` + " [\u2028 \u2029]"
-	const expected = `"\"foobar\"\u003chtml\u003e [\u2028 \u2029]"`
-	b, err := Marshal(input)
-	if err != nil {
-		t.Fatalf("Marshal error: %v", err)
-	}
-	if s := string(b); s != expected {
-		t.Errorf("Encoding of [%s]:\n got [%s]\nwant [%s]", input, s, expected)
-	}
-}
-
-// WrongString is a struct that's misusing the ,string modifier.
-type WrongString struct {
-	Message string `json:"result,string"`
-}
-
-type wrongStringTest struct {
-	in, err string
-}
-
-var wrongStringTests = []wrongStringTest{
-	{`{"result":"x"}`, `json: invalid use of ,string struct tag, trying to unmarshal "x" into string`},
-	{`{"result":"foo"}`, `json: invalid use of ,string struct tag, trying to unmarshal "foo" into string`},
-	{`{"result":"123"}`, `json: invalid use of ,string struct tag, trying to unmarshal "123" into string`},
-	{`{"result":123}`, `json: invalid use of ,string struct tag, trying to unmarshal unquoted value into string`},
-}
-
-// If people misuse the ,string modifier, the error message should be
-// helpful, telling the user that they're doing it wrong.
-func TestErrorMessageFromMisusedString(t *testing.T) {
-	for n, tt := range wrongStringTests {
-		r := strings.NewReader(tt.in)
-		var s WrongString
-		err := NewDecoder(r).Decode(&s)
-		got := fmt.Sprintf("%v", err)
-		if got != tt.err {
-			t.Errorf("%d. got err = %q, want %q", n, got, tt.err)
-		}
-	}
-}
-
-func noSpace(c rune) rune {
-	if isSpace(c) {
-		return -1
-	}
-	return c
-}
-
-type All struct {
-	Bool    bool
-	Int     int
-	Int8    int8
-	Int16   int16
-	Int32   int32
-	Int64   int64
-	Uint    uint
-	Uint8   uint8
-	Uint16  uint16
-	Uint32  uint32
-	Uint64  uint64
-	Uintptr uintptr
-	Float32 float32
-	Float64 float64
-
-	Foo  string `json:"bar"`
-	Foo2 string `json:"bar2,dummyopt"`
-
-	IntStr int64 `json:",string"`
-
-	PBool    *bool
-	PInt     *int
-	PInt8    *int8
-	PInt16   *int16
-	PInt32   *int32
-	PInt64   *int64
-	PUint    *uint
-	PUint8   *uint8
-	PUint16  *uint16
-	PUint32  *uint32
-	PUint64  *uint64
-	PUintptr *uintptr
-	PFloat32 *float32
-	PFloat64 *float64
-
-	String  string
-	PString *string
-
-	Map   map[string]Small
-	MapP  map[string]*Small
-	PMap  *map[string]Small
-	PMapP *map[string]*Small
-
-	EmptyMap map[string]Small
-	NilMap   map[string]Small
-
-	Slice   []Small
-	SliceP  []*Small
-	PSlice  *[]Small
-	PSliceP *[]*Small
-
-	EmptySlice []Small
-	NilSlice   []Small
-
-	StringSlice []string
-	ByteSlice   []byte
-
-	Small   Small
-	PSmall  *Small
-	PPSmall **Small
-
-	Interface  interface{}
-	PInterface *interface{}
-
-	unexported int
-}
-
-type Small struct {
-	Tag string
-}
-
-var allValue = All{
-	Bool:    true,
-	Int:     2,
-	Int8:    3,
-	Int16:   4,
-	Int32:   5,
-	Int64:   6,
-	Uint:    7,
-	Uint8:   8,
-	Uint16:  9,
-	Uint32:  10,
-	Uint64:  11,
-	Uintptr: 12,
-	Float32: 14.1,
-	Float64: 15.1,
-	Foo:     "foo",
-	Foo2:    "foo2",
-	IntStr:  42,
-	String:  "16",
-	Map: map[string]Small{
-		"17": {Tag: "tag17"},
-		"18": {Tag: "tag18"},
-	},
-	MapP: map[string]*Small{
-		"19": {Tag: "tag19"},
-		"20": nil,
-	},
-	EmptyMap:    map[string]Small{},
-	Slice:       []Small{{Tag: "tag20"}, {Tag: "tag21"}},
-	SliceP:      []*Small{{Tag: "tag22"}, nil, {Tag: "tag23"}},
-	EmptySlice:  []Small{},
-	StringSlice: []string{"str24", "str25", "str26"},
-	ByteSlice:   []byte{27, 28, 29},
-	Small:       Small{Tag: "tag30"},
-	PSmall:      &Small{Tag: "tag31"},
-	Interface:   5.2,
-}
-
-var pallValue = All{
-	PBool:      &allValue.Bool,
-	PInt:       &allValue.Int,
-	PInt8:      &allValue.Int8,
-	PInt16:     &allValue.Int16,
-	PInt32:     &allValue.Int32,
-	PInt64:     &allValue.Int64,
-	PUint:      &allValue.Uint,
-	PUint8:     &allValue.Uint8,
-	PUint16:    &allValue.Uint16,
-	PUint32:    &allValue.Uint32,
-	PUint64:    &allValue.Uint64,
-	PUintptr:   &allValue.Uintptr,
-	PFloat32:   &allValue.Float32,
-	PFloat64:   &allValue.Float64,
-	PString:    &allValue.String,
-	PMap:       &allValue.Map,
-	PMapP:      &allValue.MapP,
-	PSlice:     &allValue.Slice,
-	PSliceP:    &allValue.SliceP,
-	PPSmall:    &allValue.PSmall,
-	PInterface: &allValue.Interface,
-}
-
-var allValueIndent = `{
-	"Bool": true,
-	"Int": 2,
-	"Int8": 3,
-	"Int16": 4,
-	"Int32": 5,
-	"Int64": 6,
-	"Uint": 7,
-	"Uint8": 8,
-	"Uint16": 9,
-	"Uint32": 10,
-	"Uint64": 11,
-	"Uintptr": 12,
-	"Float32": 14.1,
-	"Float64": 15.1,
-	"bar": "foo",
-	"bar2": "foo2",
-	"IntStr": "42",
-	"PBool": null,
-	"PInt": null,
-	"PInt8": null,
-	"PInt16": null,
-	"PInt32": null,
-	"PInt64": null,
-	"PUint": null,
-	"PUint8": null,
-	"PUint16": null,
-	"PUint32": null,
-	"PUint64": null,
-	"PUintptr": null,
-	"PFloat32": null,
-	"PFloat64": null,
-	"String": "16",
-	"PString": null,
-	"Map": {
-		"17": {
-			"Tag": "tag17"
-		},
-		"18": {
-			"Tag": "tag18"
-		}
-	},
-	"MapP": {
-		"19": {
-			"Tag": "tag19"
-		},
-		"20": null
-	},
-	"PMap": null,
-	"PMapP": null,
-	"EmptyMap": {},
-	"NilMap": null,
-	"Slice": [
-		{
-			"Tag": "tag20"
-		},
-		{
-			"Tag": "tag21"
-		}
-	],
-	"SliceP": [
-		{
-			"Tag": "tag22"
-		},
-		null,
-		{
-			"Tag": "tag23"
-		}
-	],
-	"PSlice": null,
-	"PSliceP": null,
-	"EmptySlice": [],
-	"NilSlice": null,
-	"StringSlice": [
-		"str24",
-		"str25",
-		"str26"
-	],
-	"ByteSlice": "Gxwd",
-	"Small": {
-		"Tag": "tag30"
-	},
-	"PSmall": {
-		"Tag": "tag31"
-	},
-	"PPSmall": null,
-	"Interface": 5.2,
-	"PInterface": null
-}`
-
-var allValueCompact = strings.Map(noSpace, allValueIndent)
-
-var pallValueIndent = `{
-	"Bool": false,
-	"Int": 0,
-	"Int8": 0,
-	"Int16": 0,
-	"Int32": 0,
-	"Int64": 0,
-	"Uint": 0,
-	"Uint8": 0,
-	"Uint16": 0,
-	"Uint32": 0,
-	"Uint64": 0,
-	"Uintptr": 0,
-	"Float32": 0,
-	"Float64": 0,
-	"bar": "",
-	"bar2": "",
-        "IntStr": "0",
-	"PBool": true,
-	"PInt": 2,
-	"PInt8": 3,
-	"PInt16": 4,
-	"PInt32": 5,
-	"PInt64": 6,
-	"PUint": 7,
-	"PUint8": 8,
-	"PUint16": 9,
-	"PUint32": 10,
-	"PUint64": 11,
-	"PUintptr": 12,
-	"PFloat32": 14.1,
-	"PFloat64": 15.1,
-	"String": "",
-	"PString": "16",
-	"Map": null,
-	"MapP": null,
-	"PMap": {
-		"17": {
-			"Tag": "tag17"
-		},
-		"18": {
-			"Tag": "tag18"
-		}
-	},
-	"PMapP": {
-		"19": {
-			"Tag": "tag19"
-		},
-		"20": null
-	},
-	"EmptyMap": null,
-	"NilMap": null,
-	"Slice": null,
-	"SliceP": null,
-	"PSlice": [
-		{
-			"Tag": "tag20"
-		},
-		{
-			"Tag": "tag21"
-		}
-	],
-	"PSliceP": [
-		{
-			"Tag": "tag22"
-		},
-		null,
-		{
-			"Tag": "tag23"
-		}
-	],
-	"EmptySlice": null,
-	"NilSlice": null,
-	"StringSlice": null,
-	"ByteSlice": null,
-	"Small": {
-		"Tag": ""
-	},
-	"PSmall": null,
-	"PPSmall": {
-		"Tag": "tag31"
-	},
-	"Interface": null,
-	"PInterface": 5.2
-}`
-
-var pallValueCompact = strings.Map(noSpace, pallValueIndent)
-
-func TestRefUnmarshal(t *testing.T) {
-	type S struct {
-		// Ref is defined in encode_test.go.
-		R0 Ref
-		R1 *Ref
-		R2 RefText
-		R3 *RefText
-	}
-	want := S{
-		R0: 12,
-		R1: new(Ref),
-		R2: 13,
-		R3: new(RefText),
-	}
-	*want.R1 = 12
-	*want.R3 = 13
-
-	var got S
-	if err := Unmarshal([]byte(`{"R0":"ref","R1":"ref","R2":"ref","R3":"ref"}`), &got); err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if !reflect.DeepEqual(got, want) {
-		t.Errorf("got %+v, want %+v", got, want)
-	}
-}
-
-// Test that the empty string doesn't panic decoding when ,string is specified
-// Issue 3450
-func TestEmptyString(t *testing.T) {
-	type T2 struct {
-		Number1 int `json:",string"`
-		Number2 int `json:",string"`
-	}
-	data := `{"Number1":"1", "Number2":""}`
-	dec := NewDecoder(strings.NewReader(data))
-	var t2 T2
-	err := dec.Decode(&t2)
-	if err == nil {
-		t.Fatal("Decode: did not return error")
-	}
-	if t2.Number1 != 1 {
-		t.Fatal("Decode: did not set Number1")
-	}
-}
-
-// Test that a null for ,string is not replaced with the previous quoted string (issue 7046).
-// It should also not be an error (issue 2540, issue 8587).
-func TestNullString(t *testing.T) {
-	type T struct {
-		A int  `json:",string"`
-		B int  `json:",string"`
-		C *int `json:",string"`
-	}
-	data := []byte(`{"A": "1", "B": null, "C": null}`)
-	var s T
-	s.B = 1
-	s.C = new(int)
-	*s.C = 2
-	err := Unmarshal(data, &s)
-	if err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if s.B != 1 || s.C != nil {
-		t.Fatalf("after Unmarshal, s.B=%d, s.C=%p, want 1, nil", s.B, s.C)
-	}
-}
-
-func intp(x int) *int {
-	p := new(int)
-	*p = x
-	return p
-}
-
-func intpp(x *int) **int {
-	pp := new(*int)
-	*pp = x
-	return pp
-}
-
-var interfaceSetTests = []struct {
-	pre  interface{}
-	json string
-	post interface{}
-}{
-	{"foo", `"bar"`, "bar"},
-	{"foo", `2`, 2.0},
-	{"foo", `true`, true},
-	{"foo", `null`, nil},
-
-	{nil, `null`, nil},
-	{new(int), `null`, nil},
-	{(*int)(nil), `null`, nil},
-	{new(*int), `null`, new(*int)},
-	{(**int)(nil), `null`, nil},
-	{intp(1), `null`, nil},
-	{intpp(nil), `null`, intpp(nil)},
-	{intpp(intp(1)), `null`, intpp(nil)},
-}
-
-func TestInterfaceSet(t *testing.T) {
-	for _, tt := range interfaceSetTests {
-		b := struct{ X interface{} }{tt.pre}
-		blob := `{"X":` + tt.json + `}`
-		if err := Unmarshal([]byte(blob), &b); err != nil {
-			t.Errorf("Unmarshal %#q: %v", blob, err)
-			continue
-		}
-		if !reflect.DeepEqual(b.X, tt.post) {
-			t.Errorf("Unmarshal %#q into %#v: X=%#v, want %#v", blob, tt.pre, b.X, tt.post)
-		}
-	}
-}
-
-// JSON null values should be ignored for primitives and string values instead of resulting in an error.
-// Issue 2540
-func TestUnmarshalNulls(t *testing.T) {
-	jsonData := []byte(`{
-		"Bool"    : null,
-		"Int"     : null,
-		"Int8"    : null,
-		"Int16"   : null,
-		"Int32"   : null,
-		"Int64"   : null,
-		"Uint"    : null,
-		"Uint8"   : null,
-		"Uint16"  : null,
-		"Uint32"  : null,
-		"Uint64"  : null,
-		"Float32" : null,
-		"Float64" : null,
-		"String"  : null}`)
-
-	nulls := All{
-		Bool:    true,
-		Int:     2,
-		Int8:    3,
-		Int16:   4,
-		Int32:   5,
-		Int64:   6,
-		Uint:    7,
-		Uint8:   8,
-		Uint16:  9,
-		Uint32:  10,
-		Uint64:  11,
-		Float32: 12.1,
-		Float64: 13.1,
-		String:  "14"}
-
-	err := Unmarshal(jsonData, &nulls)
-	if err != nil {
-		t.Errorf("Unmarshal of null values failed: %v", err)
-	}
-	if !nulls.Bool || nulls.Int != 2 || nulls.Int8 != 3 || nulls.Int16 != 4 || nulls.Int32 != 5 || nulls.Int64 != 6 ||
-		nulls.Uint != 7 || nulls.Uint8 != 8 || nulls.Uint16 != 9 || nulls.Uint32 != 10 || nulls.Uint64 != 11 ||
-		nulls.Float32 != 12.1 || nulls.Float64 != 13.1 || nulls.String != "14" {
-
-		t.Errorf("Unmarshal of null values affected primitives")
-	}
-}
-
-func TestStringKind(t *testing.T) {
-	type stringKind string
-
-	var m1, m2 map[stringKind]int
-	m1 = map[stringKind]int{
-		"foo": 42,
-	}
-
-	data, err := Marshal(m1)
-	if err != nil {
-		t.Errorf("Unexpected error marshalling: %v", err)
-	}
-
-	err = Unmarshal(data, &m2)
-	if err != nil {
-		t.Errorf("Unexpected error unmarshalling: %v", err)
-	}
-
-	if !reflect.DeepEqual(m1, m2) {
-		t.Error("Items should be equal after encoding and then decoding")
-	}
-}
-
-// Custom types with []byte as underlying type could not be marshalled
-// and then unmarshalled.
-// Issue 8962.
-func TestByteKind(t *testing.T) {
-	type byteKind []byte
-
-	a := byteKind("hello")
-
-	data, err := Marshal(a)
-	if err != nil {
-		t.Error(err)
-	}
-	var b byteKind
-	err = Unmarshal(data, &b)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !reflect.DeepEqual(a, b) {
-		t.Errorf("expected %v == %v", a, b)
-	}
-}
-
-var decodeTypeErrorTests = []struct {
-	dest interface{}
-	src  string
-}{
-	{new(string), `{"user": "name"}`}, // issue 4628.
-	{new(error), `{}`},                // issue 4222
-	{new(error), `[]`},
-	{new(error), `""`},
-	{new(error), `123`},
-	{new(error), `true`},
-}
-
-func TestUnmarshalTypeError(t *testing.T) {
-	for _, item := range decodeTypeErrorTests {
-		err := Unmarshal([]byte(item.src), item.dest)
-		if _, ok := err.(*UnmarshalTypeError); !ok {
-			t.Errorf("expected type error for Unmarshal(%q, type %T): got %T",
-				item.src, item.dest, err)
-		}
-	}
-}
-
-var unmarshalSyntaxTests = []string{
-	"tru",
-	"fals",
-	"nul",
-	"123e",
-	`"hello`,
-	`[1,2,3`,
-	`{"key":1`,
-	`{"key":1,`,
-}
-
-func TestUnmarshalSyntax(t *testing.T) {
-	var x interface{}
-	for _, src := range unmarshalSyntaxTests {
-		err := Unmarshal([]byte(src), &x)
-		if _, ok := err.(*SyntaxError); !ok {
-			t.Errorf("expected syntax error for Unmarshal(%q): got %T", src, err)
-		}
-	}
-}
-
-// Test handling of unexported fields that should be ignored.
-// Issue 4660
-type unexportedFields struct {
-	Name string
-	m    map[string]interface{} `json:"-"`
-	m2   map[string]interface{} `json:"abcd"`
-}
-
-func TestUnmarshalUnexported(t *testing.T) {
-	input := `{"Name": "Bob", "m": {"x": 123}, "m2": {"y": 456}, "abcd": {"z": 789}}`
-	want := &unexportedFields{Name: "Bob"}
-
-	out := &unexportedFields{}
-	err := Unmarshal([]byte(input), out)
-	if err != nil {
-		t.Errorf("got error %v, expected nil", err)
-	}
-	if !reflect.DeepEqual(out, want) {
-		t.Errorf("got %q, want %q", out, want)
-	}
-}
-
-// Time3339 is a time.Time which encodes to and from JSON
-// as an RFC 3339 time in UTC.
-type Time3339 time.Time
-
-func (t *Time3339) UnmarshalJSON(b []byte) error {
-	if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
-		return fmt.Errorf("types: failed to unmarshal non-string value %q as an RFC 3339 time", b)
-	}
-	tm, err := time.Parse(time.RFC3339, string(b[1:len(b)-1]))
-	if err != nil {
-		return err
-	}
-	*t = Time3339(tm)
-	return nil
-}
-
-func TestUnmarshalJSONLiteralError(t *testing.T) {
-	var t3 Time3339
-	err := Unmarshal([]byte(`"0000-00-00T00:00:00Z"`), &t3)
-	if err == nil {
-		t.Fatalf("expected error; got time %v", time.Time(t3))
-	}
-	if !strings.Contains(err.Error(), "range") {
-		t.Errorf("got err = %v; want out of range error", err)
-	}
-}
-
-// Test that extra object elements in an array do not result in a
-// "data changing underfoot" error.
-// Issue 3717
-func TestSkipArrayObjects(t *testing.T) {
-	json := `[{}]`
-	var dest [0]interface{}
-
-	err := Unmarshal([]byte(json), &dest)
-	if err != nil {
-		t.Errorf("got error %q, want nil", err)
-	}
-}
-
-// Test semantics of pre-filled struct fields and pre-filled map fields.
-// Issue 4900.
-func TestPrefilled(t *testing.T) {
-	ptrToMap := func(m map[string]interface{}) *map[string]interface{} { return &m }
-
-	// Values here change, cannot reuse table across runs.
-	var prefillTests = []struct {
-		in  string
-		ptr interface{}
-		out interface{}
-	}{
-		{
-			in:  `{"X": 1, "Y": 2}`,
-			ptr: &XYZ{X: float32(3), Y: int16(4), Z: 1.5},
-			out: &XYZ{X: float64(1), Y: float64(2), Z: 1.5},
-		},
-		{
-			in:  `{"X": 1, "Y": 2}`,
-			ptr: ptrToMap(map[string]interface{}{"X": float32(3), "Y": int16(4), "Z": 1.5}),
-			out: ptrToMap(map[string]interface{}{"X": float64(1), "Y": float64(2), "Z": 1.5}),
-		},
-	}
-
-	for _, tt := range prefillTests {
-		ptrstr := fmt.Sprintf("%v", tt.ptr)
-		err := Unmarshal([]byte(tt.in), tt.ptr) // tt.ptr edited here
-		if err != nil {
-			t.Errorf("Unmarshal: %v", err)
-		}
-		if !reflect.DeepEqual(tt.ptr, tt.out) {
-			t.Errorf("Unmarshal(%#q, %s): have %v, want %v", tt.in, ptrstr, tt.ptr, tt.out)
-		}
-	}
-}
-
-var invalidUnmarshalTests = []struct {
-	v    interface{}
-	want string
-}{
-	{nil, "json: Unmarshal(nil)"},
-	{struct{}{}, "json: Unmarshal(non-pointer struct {})"},
-	{(*int)(nil), "json: Unmarshal(nil *int)"},
-}
-
-func TestInvalidUnmarshal(t *testing.T) {
-	buf := []byte(`{"a":"1"}`)
-	for _, tt := range invalidUnmarshalTests {
-		err := Unmarshal(buf, tt.v)
-		if err == nil {
-			t.Errorf("Unmarshal expecting error, got nil")
-			continue
-		}
-		if got := err.Error(); got != tt.want {
-			t.Errorf("Unmarshal = %q; want %q", got, tt.want)
-		}
-	}
-}
-
-var invalidUnmarshalTextTests = []struct {
-	v    interface{}
-	want string
-}{
-	{nil, "json: Unmarshal(nil)"},
-	{struct{}{}, "json: Unmarshal(non-pointer struct {})"},
-	{(*int)(nil), "json: Unmarshal(nil *int)"},
-	{new(net.IP), "json: cannot unmarshal string into Go value of type *net.IP"},
-}
-
-func TestInvalidUnmarshalText(t *testing.T) {
-	buf := []byte(`123`)
-	for _, tt := range invalidUnmarshalTextTests {
-		err := Unmarshal(buf, tt.v)
-		if err == nil {
-			t.Errorf("Unmarshal expecting error, got nil")
-			continue
-		}
-		if got := err.Error(); got != tt.want {
-			t.Errorf("Unmarshal = %q; want %q", got, tt.want)
-		}
-	}
-}
-
-// Test that string option is ignored for invalid types.
-// Issue 9812.
-func TestInvalidStringOption(t *testing.T) {
-	num := 0
-	item := struct {
-		T time.Time         `json:",string"`
-		M map[string]string `json:",string"`
-		S []string          `json:",string"`
-		A [1]string         `json:",string"`
-		I interface{}       `json:",string"`
-		P *int              `json:",string"`
-	}{M: make(map[string]string), S: make([]string, 0), I: num, P: &num}
-
-	data, err := Marshal(item)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-
-	err = Unmarshal(data, &item)
-	if err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/encode.go b/third_party/gofrontend/libgo/go/encoding/json/encode.go
deleted file mode 100644
index e829a93..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/encode.go
+++ /dev/null
@@ -1,1194 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package json implements encoding and decoding of JSON objects as defined in
-// RFC 4627. The mapping between JSON objects and Go values is described
-// in the documentation for the Marshal and Unmarshal functions.
-//
-// See "JSON and Go" for an introduction to this package:
-// https://golang.org/doc/articles/json_and_go.html
-package json
-
-import (
-	"bytes"
-	"encoding"
-	"encoding/base64"
-	"math"
-	"reflect"
-	"runtime"
-	"sort"
-	"strconv"
-	"strings"
-	"sync"
-	"unicode"
-	"unicode/utf8"
-)
-
-// Marshal returns the JSON encoding of v.
-//
-// Marshal traverses the value v recursively.
-// If an encountered value implements the Marshaler interface
-// and is not a nil pointer, Marshal calls its MarshalJSON method
-// to produce JSON.  The nil pointer exception is not strictly necessary
-// but mimics a similar, necessary exception in the behavior of
-// UnmarshalJSON.
-//
-// Otherwise, Marshal uses the following type-dependent default encodings:
-//
-// Boolean values encode as JSON booleans.
-//
-// Floating point, integer, and Number values encode as JSON numbers.
-//
-// String values encode as JSON strings coerced to valid UTF-8,
-// replacing invalid bytes with the Unicode replacement rune.
-// The angle brackets "<" and ">" are escaped to "\u003c" and "\u003e"
-// to keep some browsers from misinterpreting JSON output as HTML.
-// Ampersand "&" is also escaped to "\u0026" for the same reason.
-//
-// Array and slice values encode as JSON arrays, except that
-// []byte encodes as a base64-encoded string, and a nil slice
-// encodes as the null JSON object.
-//
-// Struct values encode as JSON objects. Each exported struct field
-// becomes a member of the object unless
-//   - the field's tag is "-", or
-//   - the field is empty and its tag specifies the "omitempty" option.
-// The empty values are false, 0, any
-// nil pointer or interface value, and any array, slice, map, or string of
-// length zero. The object's default key string is the struct field name
-// but can be specified in the struct field's tag value. The "json" key in
-// the struct field's tag value is the key name, followed by an optional comma
-// and options. Examples:
-//
-//   // Field is ignored by this package.
-//   Field int `json:"-"`
-//
-//   // Field appears in JSON as key "myName".
-//   Field int `json:"myName"`
-//
-//   // Field appears in JSON as key "myName" and
-//   // the field is omitted from the object if its value is empty,
-//   // as defined above.
-//   Field int `json:"myName,omitempty"`
-//
-//   // Field appears in JSON as key "Field" (the default), but
-//   // the field is skipped if empty.
-//   // Note the leading comma.
-//   Field int `json:",omitempty"`
-//
-// The "string" option signals that a field is stored as JSON inside a
-// JSON-encoded string. It applies only to fields of string, floating point,
-// integer, or boolean types. This extra level of encoding is sometimes used
-// when communicating with JavaScript programs:
-//
-//    Int64String int64 `json:",string"`
-//
-// The key name will be used if it's a non-empty string consisting of
-// only Unicode letters, digits, dollar signs, percent signs, hyphens,
-// underscores and slashes.
-//
-// Anonymous struct fields are usually marshaled as if their inner exported fields
-// were fields in the outer struct, subject to the usual Go visibility rules amended
-// as described in the next paragraph.
-// An anonymous struct field with a name given in its JSON tag is treated as
-// having that name, rather than being anonymous.
-// An anonymous struct field of interface type is treated the same as having
-// that type as its name, rather than being anonymous.
-//
-// The Go visibility rules for struct fields are amended for JSON when
-// deciding which field to marshal or unmarshal. If there are
-// multiple fields at the same level, and that level is the least
-// nested (and would therefore be the nesting level selected by the
-// usual Go rules), the following extra rules apply:
-//
-// 1) Of those fields, if any are JSON-tagged, only tagged fields are considered,
-// even if there are multiple untagged fields that would otherwise conflict.
-// 2) If there is exactly one field (tagged or not according to the first rule), that is selected.
-// 3) Otherwise there are multiple fields, and all are ignored; no error occurs.
-//
-// Handling of anonymous struct fields is new in Go 1.1.
-// Prior to Go 1.1, anonymous struct fields were ignored. To force ignoring of
-// an anonymous struct field in both current and earlier versions, give the field
-// a JSON tag of "-".
-//
-// Map values encode as JSON objects.
-// The map's key type must be string; the map keys are used as JSON object
-// keys, subject to the UTF-8 coercion described for string values above.
-//
-// Pointer values encode as the value pointed to.
-// A nil pointer encodes as the null JSON object.
-//
-// Interface values encode as the value contained in the interface.
-// A nil interface value encodes as the null JSON object.
-//
-// Channel, complex, and function values cannot be encoded in JSON.
-// Attempting to encode such a value causes Marshal to return
-// an UnsupportedTypeError.
-//
-// JSON cannot represent cyclic data structures and Marshal does not
-// handle them.  Passing cyclic structures to Marshal will result in
-// an infinite recursion.
-//
-func Marshal(v interface{}) ([]byte, error) {
-	e := &encodeState{}
-	err := e.marshal(v)
-	if err != nil {
-		return nil, err
-	}
-	return e.Bytes(), nil
-}
-
-// MarshalIndent is like Marshal but applies Indent to format the output.
-func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {
-	b, err := Marshal(v)
-	if err != nil {
-		return nil, err
-	}
-	var buf bytes.Buffer
-	err = Indent(&buf, b, prefix, indent)
-	if err != nil {
-		return nil, err
-	}
-	return buf.Bytes(), nil
-}
-
-// HTMLEscape appends to dst the JSON-encoded src with <, >, &, U+2028 and U+2029
-// characters inside string literals changed to \u003c, \u003e, \u0026, \u2028, \u2029
-// so that the JSON will be safe to embed inside HTML <script> tags.
-// For historical reasons, web browsers don't honor standard HTML
-// escaping within <script> tags, so an alternative JSON encoding must
-// be used.
-func HTMLEscape(dst *bytes.Buffer, src []byte) {
-	// The characters can only appear in string literals,
-	// so just scan the string one byte at a time.
-	start := 0
-	for i, c := range src {
-		if c == '<' || c == '>' || c == '&' {
-			if start < i {
-				dst.Write(src[start:i])
-			}
-			dst.WriteString(`\u00`)
-			dst.WriteByte(hex[c>>4])
-			dst.WriteByte(hex[c&0xF])
-			start = i + 1
-		}
-		// Convert U+2028 and U+2029 (E2 80 A8 and E2 80 A9).
-		if c == 0xE2 && i+2 < len(src) && src[i+1] == 0x80 && src[i+2]&^1 == 0xA8 {
-			if start < i {
-				dst.Write(src[start:i])
-			}
-			dst.WriteString(`\u202`)
-			dst.WriteByte(hex[src[i+2]&0xF])
-			start = i + 3
-		}
-	}
-	if start < len(src) {
-		dst.Write(src[start:])
-	}
-}
-
-// Marshaler is the interface implemented by objects that
-// can marshal themselves into valid JSON.
-type Marshaler interface {
-	MarshalJSON() ([]byte, error)
-}
-
-// An UnsupportedTypeError is returned by Marshal when attempting
-// to encode an unsupported value type.
-type UnsupportedTypeError struct {
-	Type reflect.Type
-}
-
-func (e *UnsupportedTypeError) Error() string {
-	return "json: unsupported type: " + e.Type.String()
-}
-
-type UnsupportedValueError struct {
-	Value reflect.Value
-	Str   string
-}
-
-func (e *UnsupportedValueError) Error() string {
-	return "json: unsupported value: " + e.Str
-}
-
-// Before Go 1.2, an InvalidUTF8Error was returned by Marshal when
-// attempting to encode a string value with invalid UTF-8 sequences.
-// As of Go 1.2, Marshal instead coerces the string to valid UTF-8 by
-// replacing invalid bytes with the Unicode replacement rune U+FFFD.
-// This error is no longer generated but is kept for backwards compatibility
-// with programs that might mention it.
-type InvalidUTF8Error struct {
-	S string // the whole string value that caused the error
-}
-
-func (e *InvalidUTF8Error) Error() string {
-	return "json: invalid UTF-8 in string: " + strconv.Quote(e.S)
-}
-
-type MarshalerError struct {
-	Type reflect.Type
-	Err  error
-}
-
-func (e *MarshalerError) Error() string {
-	return "json: error calling MarshalJSON for type " + e.Type.String() + ": " + e.Err.Error()
-}
-
-var hex = "0123456789abcdef"
-
-// An encodeState encodes JSON into a bytes.Buffer.
-type encodeState struct {
-	bytes.Buffer // accumulated output
-	scratch      [64]byte
-}
-
-var encodeStatePool sync.Pool
-
-func newEncodeState() *encodeState {
-	if v := encodeStatePool.Get(); v != nil {
-		e := v.(*encodeState)
-		e.Reset()
-		return e
-	}
-	return new(encodeState)
-}
-
-func (e *encodeState) marshal(v interface{}) (err error) {
-	defer func() {
-		if r := recover(); r != nil {
-			if _, ok := r.(runtime.Error); ok {
-				panic(r)
-			}
-			if s, ok := r.(string); ok {
-				panic(s)
-			}
-			err = r.(error)
-		}
-	}()
-	e.reflectValue(reflect.ValueOf(v))
-	return nil
-}
-
-func (e *encodeState) error(err error) {
-	panic(err)
-}
-
-func isEmptyValue(v reflect.Value) bool {
-	switch v.Kind() {
-	case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
-		return v.Len() == 0
-	case reflect.Bool:
-		return !v.Bool()
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return v.Int() == 0
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		return v.Uint() == 0
-	case reflect.Float32, reflect.Float64:
-		return v.Float() == 0
-	case reflect.Interface, reflect.Ptr:
-		return v.IsNil()
-	}
-	return false
-}
-
-func (e *encodeState) reflectValue(v reflect.Value) {
-	valueEncoder(v)(e, v, false)
-}
-
-type encoderFunc func(e *encodeState, v reflect.Value, quoted bool)
-
-var encoderCache struct {
-	sync.RWMutex
-	m map[reflect.Type]encoderFunc
-}
-
-func valueEncoder(v reflect.Value) encoderFunc {
-	if !v.IsValid() {
-		return invalidValueEncoder
-	}
-	return typeEncoder(v.Type())
-}
-
-func typeEncoder(t reflect.Type) encoderFunc {
-	encoderCache.RLock()
-	f := encoderCache.m[t]
-	encoderCache.RUnlock()
-	if f != nil {
-		return f
-	}
-
-	// To deal with recursive types, populate the map with an
-	// indirect func before we build it. This type waits on the
-	// real func (f) to be ready and then calls it.  This indirect
-	// func is only used for recursive types.
-	encoderCache.Lock()
-	if encoderCache.m == nil {
-		encoderCache.m = make(map[reflect.Type]encoderFunc)
-	}
-	var wg sync.WaitGroup
-	wg.Add(1)
-	encoderCache.m[t] = func(e *encodeState, v reflect.Value, quoted bool) {
-		wg.Wait()
-		f(e, v, quoted)
-	}
-	encoderCache.Unlock()
-
-	// Compute fields without lock.
-	// Might duplicate effort but won't hold other computations back.
-	f = newTypeEncoder(t, true)
-	wg.Done()
-	encoderCache.Lock()
-	encoderCache.m[t] = f
-	encoderCache.Unlock()
-	return f
-}
-
-var (
-	marshalerType     = reflect.TypeOf(new(Marshaler)).Elem()
-	textMarshalerType = reflect.TypeOf(new(encoding.TextMarshaler)).Elem()
-)
-
-// newTypeEncoder constructs an encoderFunc for a type.
-// The returned encoder only checks CanAddr when allowAddr is true.
-func newTypeEncoder(t reflect.Type, allowAddr bool) encoderFunc {
-	if t.Implements(marshalerType) {
-		return marshalerEncoder
-	}
-	if t.Kind() != reflect.Ptr && allowAddr {
-		if reflect.PtrTo(t).Implements(marshalerType) {
-			return newCondAddrEncoder(addrMarshalerEncoder, newTypeEncoder(t, false))
-		}
-	}
-
-	if t.Implements(textMarshalerType) {
-		return textMarshalerEncoder
-	}
-	if t.Kind() != reflect.Ptr && allowAddr {
-		if reflect.PtrTo(t).Implements(textMarshalerType) {
-			return newCondAddrEncoder(addrTextMarshalerEncoder, newTypeEncoder(t, false))
-		}
-	}
-
-	switch t.Kind() {
-	case reflect.Bool:
-		return boolEncoder
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return intEncoder
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		return uintEncoder
-	case reflect.Float32:
-		return float32Encoder
-	case reflect.Float64:
-		return float64Encoder
-	case reflect.String:
-		return stringEncoder
-	case reflect.Interface:
-		return interfaceEncoder
-	case reflect.Struct:
-		return newStructEncoder(t)
-	case reflect.Map:
-		return newMapEncoder(t)
-	case reflect.Slice:
-		return newSliceEncoder(t)
-	case reflect.Array:
-		return newArrayEncoder(t)
-	case reflect.Ptr:
-		return newPtrEncoder(t)
-	default:
-		return unsupportedTypeEncoder
-	}
-}
-
-func invalidValueEncoder(e *encodeState, v reflect.Value, quoted bool) {
-	e.WriteString("null")
-}
-
-func marshalerEncoder(e *encodeState, v reflect.Value, quoted bool) {
-	if v.Kind() == reflect.Ptr && v.IsNil() {
-		e.WriteString("null")
-		return
-	}
-	m := v.Interface().(Marshaler)
-	b, err := m.MarshalJSON()
-	if err == nil {
-		// copy JSON into buffer, checking validity.
-		err = compact(&e.Buffer, b, true)
-	}
-	if err != nil {
-		e.error(&MarshalerError{v.Type(), err})
-	}
-}
-
-func addrMarshalerEncoder(e *encodeState, v reflect.Value, quoted bool) {
-	va := v.Addr()
-	if va.IsNil() {
-		e.WriteString("null")
-		return
-	}
-	m := va.Interface().(Marshaler)
-	b, err := m.MarshalJSON()
-	if err == nil {
-		// copy JSON into buffer, checking validity.
-		err = compact(&e.Buffer, b, true)
-	}
-	if err != nil {
-		e.error(&MarshalerError{v.Type(), err})
-	}
-}
-
-func textMarshalerEncoder(e *encodeState, v reflect.Value, quoted bool) {
-	if v.Kind() == reflect.Ptr && v.IsNil() {
-		e.WriteString("null")
-		return
-	}
-	m := v.Interface().(encoding.TextMarshaler)
-	b, err := m.MarshalText()
-	if err == nil {
-		_, err = e.stringBytes(b)
-	}
-	if err != nil {
-		e.error(&MarshalerError{v.Type(), err})
-	}
-}
-
-func addrTextMarshalerEncoder(e *encodeState, v reflect.Value, quoted bool) {
-	va := v.Addr()
-	if va.IsNil() {
-		e.WriteString("null")
-		return
-	}
-	m := va.Interface().(encoding.TextMarshaler)
-	b, err := m.MarshalText()
-	if err == nil {
-		_, err = e.stringBytes(b)
-	}
-	if err != nil {
-		e.error(&MarshalerError{v.Type(), err})
-	}
-}
-
-func boolEncoder(e *encodeState, v reflect.Value, quoted bool) {
-	if quoted {
-		e.WriteByte('"')
-	}
-	if v.Bool() {
-		e.WriteString("true")
-	} else {
-		e.WriteString("false")
-	}
-	if quoted {
-		e.WriteByte('"')
-	}
-}
-
-func intEncoder(e *encodeState, v reflect.Value, quoted bool) {
-	b := strconv.AppendInt(e.scratch[:0], v.Int(), 10)
-	if quoted {
-		e.WriteByte('"')
-	}
-	e.Write(b)
-	if quoted {
-		e.WriteByte('"')
-	}
-}
-
-func uintEncoder(e *encodeState, v reflect.Value, quoted bool) {
-	b := strconv.AppendUint(e.scratch[:0], v.Uint(), 10)
-	if quoted {
-		e.WriteByte('"')
-	}
-	e.Write(b)
-	if quoted {
-		e.WriteByte('"')
-	}
-}
-
-type floatEncoder int // number of bits
-
-func (bits floatEncoder) encode(e *encodeState, v reflect.Value, quoted bool) {
-	f := v.Float()
-	if math.IsInf(f, 0) || math.IsNaN(f) {
-		e.error(&UnsupportedValueError{v, strconv.FormatFloat(f, 'g', -1, int(bits))})
-	}
-	b := strconv.AppendFloat(e.scratch[:0], f, 'g', -1, int(bits))
-	if quoted {
-		e.WriteByte('"')
-	}
-	e.Write(b)
-	if quoted {
-		e.WriteByte('"')
-	}
-}
-
-var (
-	float32Encoder = (floatEncoder(32)).encode
-	float64Encoder = (floatEncoder(64)).encode
-)
-
-func stringEncoder(e *encodeState, v reflect.Value, quoted bool) {
-	if v.Type() == numberType {
-		numStr := v.String()
-		if numStr == "" {
-			numStr = "0" // Number's zero-val
-		}
-		e.WriteString(numStr)
-		return
-	}
-	if quoted {
-		sb, err := Marshal(v.String())
-		if err != nil {
-			e.error(err)
-		}
-		e.string(string(sb))
-	} else {
-		e.string(v.String())
-	}
-}
-
-func interfaceEncoder(e *encodeState, v reflect.Value, quoted bool) {
-	if v.IsNil() {
-		e.WriteString("null")
-		return
-	}
-	e.reflectValue(v.Elem())
-}
-
-func unsupportedTypeEncoder(e *encodeState, v reflect.Value, quoted bool) {
-	e.error(&UnsupportedTypeError{v.Type()})
-}
-
-type structEncoder struct {
-	fields    []field
-	fieldEncs []encoderFunc
-}
-
-func (se *structEncoder) encode(e *encodeState, v reflect.Value, quoted bool) {
-	e.WriteByte('{')
-	first := true
-	for i, f := range se.fields {
-		fv := fieldByIndex(v, f.index)
-		if !fv.IsValid() || f.omitEmpty && isEmptyValue(fv) {
-			continue
-		}
-		if first {
-			first = false
-		} else {
-			e.WriteByte(',')
-		}
-		e.string(f.name)
-		e.WriteByte(':')
-		se.fieldEncs[i](e, fv, f.quoted)
-	}
-	e.WriteByte('}')
-}
-
-func newStructEncoder(t reflect.Type) encoderFunc {
-	fields := cachedTypeFields(t)
-	se := &structEncoder{
-		fields:    fields,
-		fieldEncs: make([]encoderFunc, len(fields)),
-	}
-	for i, f := range fields {
-		se.fieldEncs[i] = typeEncoder(typeByIndex(t, f.index))
-	}
-	return se.encode
-}
-
-type mapEncoder struct {
-	elemEnc encoderFunc
-}
-
-func (me *mapEncoder) encode(e *encodeState, v reflect.Value, _ bool) {
-	if v.IsNil() {
-		e.WriteString("null")
-		return
-	}
-	e.WriteByte('{')
-	var sv stringValues = v.MapKeys()
-	sort.Sort(sv)
-	for i, k := range sv {
-		if i > 0 {
-			e.WriteByte(',')
-		}
-		e.string(k.String())
-		e.WriteByte(':')
-		me.elemEnc(e, v.MapIndex(k), false)
-	}
-	e.WriteByte('}')
-}
-
-func newMapEncoder(t reflect.Type) encoderFunc {
-	if t.Key().Kind() != reflect.String {
-		return unsupportedTypeEncoder
-	}
-	me := &mapEncoder{typeEncoder(t.Elem())}
-	return me.encode
-}
-
-func encodeByteSlice(e *encodeState, v reflect.Value, _ bool) {
-	if v.IsNil() {
-		e.WriteString("null")
-		return
-	}
-	s := v.Bytes()
-	e.WriteByte('"')
-	if len(s) < 1024 {
-		// for small buffers, using Encode directly is much faster.
-		dst := make([]byte, base64.StdEncoding.EncodedLen(len(s)))
-		base64.StdEncoding.Encode(dst, s)
-		e.Write(dst)
-	} else {
-		// for large buffers, avoid unnecessary extra temporary
-		// buffer space.
-		enc := base64.NewEncoder(base64.StdEncoding, e)
-		enc.Write(s)
-		enc.Close()
-	}
-	e.WriteByte('"')
-}
-
-// sliceEncoder just wraps an arrayEncoder, checking to make sure the value isn't nil.
-type sliceEncoder struct {
-	arrayEnc encoderFunc
-}
-
-func (se *sliceEncoder) encode(e *encodeState, v reflect.Value, _ bool) {
-	if v.IsNil() {
-		e.WriteString("null")
-		return
-	}
-	se.arrayEnc(e, v, false)
-}
-
-func newSliceEncoder(t reflect.Type) encoderFunc {
-	// Byte slices get special treatment; arrays don't.
-	if t.Elem().Kind() == reflect.Uint8 {
-		return encodeByteSlice
-	}
-	enc := &sliceEncoder{newArrayEncoder(t)}
-	return enc.encode
-}
-
-type arrayEncoder struct {
-	elemEnc encoderFunc
-}
-
-func (ae *arrayEncoder) encode(e *encodeState, v reflect.Value, _ bool) {
-	e.WriteByte('[')
-	n := v.Len()
-	for i := 0; i < n; i++ {
-		if i > 0 {
-			e.WriteByte(',')
-		}
-		ae.elemEnc(e, v.Index(i), false)
-	}
-	e.WriteByte(']')
-}
-
-func newArrayEncoder(t reflect.Type) encoderFunc {
-	enc := &arrayEncoder{typeEncoder(t.Elem())}
-	return enc.encode
-}
-
-type ptrEncoder struct {
-	elemEnc encoderFunc
-}
-
-func (pe *ptrEncoder) encode(e *encodeState, v reflect.Value, quoted bool) {
-	if v.IsNil() {
-		e.WriteString("null")
-		return
-	}
-	pe.elemEnc(e, v.Elem(), quoted)
-}
-
-func newPtrEncoder(t reflect.Type) encoderFunc {
-	enc := &ptrEncoder{typeEncoder(t.Elem())}
-	return enc.encode
-}
-
-type condAddrEncoder struct {
-	canAddrEnc, elseEnc encoderFunc
-}
-
-func (ce *condAddrEncoder) encode(e *encodeState, v reflect.Value, quoted bool) {
-	if v.CanAddr() {
-		ce.canAddrEnc(e, v, quoted)
-	} else {
-		ce.elseEnc(e, v, quoted)
-	}
-}
-
-// newCondAddrEncoder returns an encoder that checks whether its value
-// CanAddr and delegates to canAddrEnc if so, else to elseEnc.
-func newCondAddrEncoder(canAddrEnc, elseEnc encoderFunc) encoderFunc {
-	enc := &condAddrEncoder{canAddrEnc: canAddrEnc, elseEnc: elseEnc}
-	return enc.encode
-}
-
-func isValidTag(s string) bool {
-	if s == "" {
-		return false
-	}
-	for _, c := range s {
-		switch {
-		case strings.ContainsRune("!#$%&()*+-./:<=>?@[]^_{|}~ ", c):
-			// Backslash and quote chars are reserved, but
-			// otherwise any punctuation chars are allowed
-			// in a tag name.
-		default:
-			if !unicode.IsLetter(c) && !unicode.IsDigit(c) {
-				return false
-			}
-		}
-	}
-	return true
-}
-
-func fieldByIndex(v reflect.Value, index []int) reflect.Value {
-	for _, i := range index {
-		if v.Kind() == reflect.Ptr {
-			if v.IsNil() {
-				return reflect.Value{}
-			}
-			v = v.Elem()
-		}
-		v = v.Field(i)
-	}
-	return v
-}
-
-func typeByIndex(t reflect.Type, index []int) reflect.Type {
-	for _, i := range index {
-		if t.Kind() == reflect.Ptr {
-			t = t.Elem()
-		}
-		t = t.Field(i).Type
-	}
-	return t
-}
-
-// stringValues is a slice of reflect.Value holding *reflect.StringValue.
-// It implements the methods to sort by string.
-type stringValues []reflect.Value
-
-func (sv stringValues) Len() int           { return len(sv) }
-func (sv stringValues) Swap(i, j int)      { sv[i], sv[j] = sv[j], sv[i] }
-func (sv stringValues) Less(i, j int) bool { return sv.get(i) < sv.get(j) }
-func (sv stringValues) get(i int) string   { return sv[i].String() }
-
-// NOTE: keep in sync with stringBytes below.
-func (e *encodeState) string(s string) (int, error) {
-	len0 := e.Len()
-	e.WriteByte('"')
-	start := 0
-	for i := 0; i < len(s); {
-		if b := s[i]; b < utf8.RuneSelf {
-			if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' {
-				i++
-				continue
-			}
-			if start < i {
-				e.WriteString(s[start:i])
-			}
-			switch b {
-			case '\\', '"':
-				e.WriteByte('\\')
-				e.WriteByte(b)
-			case '\n':
-				e.WriteByte('\\')
-				e.WriteByte('n')
-			case '\r':
-				e.WriteByte('\\')
-				e.WriteByte('r')
-			case '\t':
-				e.WriteByte('\\')
-				e.WriteByte('t')
-			default:
-				// This encodes bytes < 0x20 except for \n and \r,
-				// as well as <, > and &. The latter are escaped because they
-				// can lead to security holes when user-controlled strings
-				// are rendered into JSON and served to some browsers.
-				e.WriteString(`\u00`)
-				e.WriteByte(hex[b>>4])
-				e.WriteByte(hex[b&0xF])
-			}
-			i++
-			start = i
-			continue
-		}
-		c, size := utf8.DecodeRuneInString(s[i:])
-		if c == utf8.RuneError && size == 1 {
-			if start < i {
-				e.WriteString(s[start:i])
-			}
-			e.WriteString(`\ufffd`)
-			i += size
-			start = i
-			continue
-		}
-		// U+2028 is LINE SEPARATOR.
-		// U+2029 is PARAGRAPH SEPARATOR.
-		// They are both technically valid characters in JSON strings,
-		// but don't work in JSONP, which has to be evaluated as JavaScript,
-		// and can lead to security holes there. It is valid JSON to
-		// escape them, so we do so unconditionally.
-		// See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion.
-		if c == '\u2028' || c == '\u2029' {
-			if start < i {
-				e.WriteString(s[start:i])
-			}
-			e.WriteString(`\u202`)
-			e.WriteByte(hex[c&0xF])
-			i += size
-			start = i
-			continue
-		}
-		i += size
-	}
-	if start < len(s) {
-		e.WriteString(s[start:])
-	}
-	e.WriteByte('"')
-	return e.Len() - len0, nil
-}
-
-// NOTE: keep in sync with string above.
-func (e *encodeState) stringBytes(s []byte) (int, error) {
-	len0 := e.Len()
-	e.WriteByte('"')
-	start := 0
-	for i := 0; i < len(s); {
-		if b := s[i]; b < utf8.RuneSelf {
-			if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' {
-				i++
-				continue
-			}
-			if start < i {
-				e.Write(s[start:i])
-			}
-			switch b {
-			case '\\', '"':
-				e.WriteByte('\\')
-				e.WriteByte(b)
-			case '\n':
-				e.WriteByte('\\')
-				e.WriteByte('n')
-			case '\r':
-				e.WriteByte('\\')
-				e.WriteByte('r')
-			case '\t':
-				e.WriteByte('\\')
-				e.WriteByte('t')
-			default:
-				// This encodes bytes < 0x20 except for \n and \r,
-				// as well as <, >, and &. The latter are escaped because they
-				// can lead to security holes when user-controlled strings
-				// are rendered into JSON and served to some browsers.
-				e.WriteString(`\u00`)
-				e.WriteByte(hex[b>>4])
-				e.WriteByte(hex[b&0xF])
-			}
-			i++
-			start = i
-			continue
-		}
-		c, size := utf8.DecodeRune(s[i:])
-		if c == utf8.RuneError && size == 1 {
-			if start < i {
-				e.Write(s[start:i])
-			}
-			e.WriteString(`\ufffd`)
-			i += size
-			start = i
-			continue
-		}
-		// U+2028 is LINE SEPARATOR.
-		// U+2029 is PARAGRAPH SEPARATOR.
-		// They are both technically valid characters in JSON strings,
-		// but don't work in JSONP, which has to be evaluated as JavaScript,
-		// and can lead to security holes there. It is valid JSON to
-		// escape them, so we do so unconditionally.
-		// See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion.
-		if c == '\u2028' || c == '\u2029' {
-			if start < i {
-				e.Write(s[start:i])
-			}
-			e.WriteString(`\u202`)
-			e.WriteByte(hex[c&0xF])
-			i += size
-			start = i
-			continue
-		}
-		i += size
-	}
-	if start < len(s) {
-		e.Write(s[start:])
-	}
-	e.WriteByte('"')
-	return e.Len() - len0, nil
-}
-
-// A field represents a single field found in a struct.
-type field struct {
-	name      string
-	nameBytes []byte                 // []byte(name)
-	equalFold func(s, t []byte) bool // bytes.EqualFold or equivalent
-
-	tag       bool
-	index     []int
-	typ       reflect.Type
-	omitEmpty bool
-	quoted    bool
-}
-
-func fillField(f field) field {
-	f.nameBytes = []byte(f.name)
-	f.equalFold = foldFunc(f.nameBytes)
-	return f
-}
-
-// byName sorts field by name, breaking ties with depth,
-// then breaking ties with "name came from json tag", then
-// breaking ties with index sequence.
-type byName []field
-
-func (x byName) Len() int { return len(x) }
-
-func (x byName) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
-
-func (x byName) Less(i, j int) bool {
-	if x[i].name != x[j].name {
-		return x[i].name < x[j].name
-	}
-	if len(x[i].index) != len(x[j].index) {
-		return len(x[i].index) < len(x[j].index)
-	}
-	if x[i].tag != x[j].tag {
-		return x[i].tag
-	}
-	return byIndex(x).Less(i, j)
-}
-
-// byIndex sorts field by index sequence.
-type byIndex []field
-
-func (x byIndex) Len() int { return len(x) }
-
-func (x byIndex) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
-
-func (x byIndex) Less(i, j int) bool {
-	for k, xik := range x[i].index {
-		if k >= len(x[j].index) {
-			return false
-		}
-		if xik != x[j].index[k] {
-			return xik < x[j].index[k]
-		}
-	}
-	return len(x[i].index) < len(x[j].index)
-}
-
-// typeFields returns a list of fields that JSON should recognize for the given type.
-// The algorithm is breadth-first search over the set of structs to include - the top struct
-// and then any reachable anonymous structs.
-func typeFields(t reflect.Type) []field {
-	// Anonymous fields to explore at the current level and the next.
-	current := []field{}
-	next := []field{{typ: t}}
-
-	// Count of queued names for current level and the next.
-	count := map[reflect.Type]int{}
-	nextCount := map[reflect.Type]int{}
-
-	// Types already visited at an earlier level.
-	visited := map[reflect.Type]bool{}
-
-	// Fields found.
-	var fields []field
-
-	for len(next) > 0 {
-		current, next = next, current[:0]
-		count, nextCount = nextCount, map[reflect.Type]int{}
-
-		for _, f := range current {
-			if visited[f.typ] {
-				continue
-			}
-			visited[f.typ] = true
-
-			// Scan f.typ for fields to include.
-			for i := 0; i < f.typ.NumField(); i++ {
-				sf := f.typ.Field(i)
-				if sf.PkgPath != "" && !sf.Anonymous { // unexported
-					continue
-				}
-				tag := sf.Tag.Get("json")
-				if tag == "-" {
-					continue
-				}
-				name, opts := parseTag(tag)
-				if !isValidTag(name) {
-					name = ""
-				}
-				index := make([]int, len(f.index)+1)
-				copy(index, f.index)
-				index[len(f.index)] = i
-
-				ft := sf.Type
-				if ft.Name() == "" && ft.Kind() == reflect.Ptr {
-					// Follow pointer.
-					ft = ft.Elem()
-				}
-
-				// Only strings, floats, integers, and booleans can be quoted.
-				quoted := false
-				if opts.Contains("string") {
-					switch ft.Kind() {
-					case reflect.Bool,
-						reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
-						reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
-						reflect.Float32, reflect.Float64,
-						reflect.String:
-						quoted = true
-					}
-				}
-
-				// Record found field and index sequence.
-				if name != "" || !sf.Anonymous || ft.Kind() != reflect.Struct {
-					tagged := name != ""
-					if name == "" {
-						name = sf.Name
-					}
-					fields = append(fields, fillField(field{
-						name:      name,
-						tag:       tagged,
-						index:     index,
-						typ:       ft,
-						omitEmpty: opts.Contains("omitempty"),
-						quoted:    quoted,
-					}))
-					if count[f.typ] > 1 {
-						// If there were multiple instances, add a second,
-						// so that the annihilation code will see a duplicate.
-						// It only cares about the distinction between 1 or 2,
-						// so don't bother generating any more copies.
-						fields = append(fields, fields[len(fields)-1])
-					}
-					continue
-				}
-
-				// Record new anonymous struct to explore in next round.
-				nextCount[ft]++
-				if nextCount[ft] == 1 {
-					next = append(next, fillField(field{name: ft.Name(), index: index, typ: ft}))
-				}
-			}
-		}
-	}
-
-	sort.Sort(byName(fields))
-
-	// Delete all fields that are hidden by the Go rules for embedded fields,
-	// except that fields with JSON tags are promoted.
-
-	// The fields are sorted in primary order of name, secondary order
-	// of field index length. Loop over names; for each name, delete
-	// hidden fields by choosing the one dominant field that survives.
-	out := fields[:0]
-	for advance, i := 0, 0; i < len(fields); i += advance {
-		// One iteration per name.
-		// Find the sequence of fields with the name of this first field.
-		fi := fields[i]
-		name := fi.name
-		for advance = 1; i+advance < len(fields); advance++ {
-			fj := fields[i+advance]
-			if fj.name != name {
-				break
-			}
-		}
-		if advance == 1 { // Only one field with this name
-			out = append(out, fi)
-			continue
-		}
-		dominant, ok := dominantField(fields[i : i+advance])
-		if ok {
-			out = append(out, dominant)
-		}
-	}
-
-	fields = out
-	sort.Sort(byIndex(fields))
-
-	return fields
-}
-
-// dominantField looks through the fields, all of which are known to
-// have the same name, to find the single field that dominates the
-// others using Go's embedding rules, modified by the presence of
-// JSON tags. If there are multiple top-level fields, the boolean
-// will be false: This condition is an error in Go and we skip all
-// the fields.
-func dominantField(fields []field) (field, bool) {
-	// The fields are sorted in increasing index-length order. The winner
-	// must therefore be one with the shortest index length. Drop all
-	// longer entries, which is easy: just truncate the slice.
-	length := len(fields[0].index)
-	tagged := -1 // Index of first tagged field.
-	for i, f := range fields {
-		if len(f.index) > length {
-			fields = fields[:i]
-			break
-		}
-		if f.tag {
-			if tagged >= 0 {
-				// Multiple tagged fields at the same level: conflict.
-				// Return no field.
-				return field{}, false
-			}
-			tagged = i
-		}
-	}
-	if tagged >= 0 {
-		return fields[tagged], true
-	}
-	// All remaining fields have the same length. If there's more than one,
-	// we have a conflict (two fields named "X" at the same level) and we
-	// return no field.
-	if len(fields) > 1 {
-		return field{}, false
-	}
-	return fields[0], true
-}
-
-var fieldCache struct {
-	sync.RWMutex
-	m map[reflect.Type][]field
-}
-
-// cachedTypeFields is like typeFields but uses a cache to avoid repeated work.
-func cachedTypeFields(t reflect.Type) []field {
-	fieldCache.RLock()
-	f := fieldCache.m[t]
-	fieldCache.RUnlock()
-	if f != nil {
-		return f
-	}
-
-	// Compute fields without lock.
-	// Might duplicate effort but won't hold other computations back.
-	f = typeFields(t)
-	if f == nil {
-		f = []field{}
-	}
-
-	fieldCache.Lock()
-	if fieldCache.m == nil {
-		fieldCache.m = map[reflect.Type][]field{}
-	}
-	fieldCache.m[t] = f
-	fieldCache.Unlock()
-	return f
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/encode_test.go b/third_party/gofrontend/libgo/go/encoding/json/encode_test.go
deleted file mode 100644
index 7abfa85..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/encode_test.go
+++ /dev/null
@@ -1,532 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
-	"bytes"
-	"math"
-	"reflect"
-	"testing"
-	"unicode"
-)
-
-type Optionals struct {
-	Sr string `json:"sr"`
-	So string `json:"so,omitempty"`
-	Sw string `json:"-"`
-
-	Ir int `json:"omitempty"` // actually named omitempty, not an option
-	Io int `json:"io,omitempty"`
-
-	Slr []string `json:"slr,random"`
-	Slo []string `json:"slo,omitempty"`
-
-	Mr map[string]interface{} `json:"mr"`
-	Mo map[string]interface{} `json:",omitempty"`
-
-	Fr float64 `json:"fr"`
-	Fo float64 `json:"fo,omitempty"`
-
-	Br bool `json:"br"`
-	Bo bool `json:"bo,omitempty"`
-
-	Ur uint `json:"ur"`
-	Uo uint `json:"uo,omitempty"`
-
-	Str struct{} `json:"str"`
-	Sto struct{} `json:"sto,omitempty"`
-}
-
-var optionalsExpected = `{
- "sr": "",
- "omitempty": 0,
- "slr": null,
- "mr": {},
- "fr": 0,
- "br": false,
- "ur": 0,
- "str": {},
- "sto": {}
-}`
-
-func TestOmitEmpty(t *testing.T) {
-	var o Optionals
-	o.Sw = "something"
-	o.Mr = map[string]interface{}{}
-	o.Mo = map[string]interface{}{}
-
-	got, err := MarshalIndent(&o, "", " ")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if got := string(got); got != optionalsExpected {
-		t.Errorf(" got: %s\nwant: %s\n", got, optionalsExpected)
-	}
-}
-
-type StringTag struct {
-	BoolStr bool   `json:",string"`
-	IntStr  int64  `json:",string"`
-	StrStr  string `json:",string"`
-}
-
-var stringTagExpected = `{
- "BoolStr": "true",
- "IntStr": "42",
- "StrStr": "\"xzbit\""
-}`
-
-func TestStringTag(t *testing.T) {
-	var s StringTag
-	s.BoolStr = true
-	s.IntStr = 42
-	s.StrStr = "xzbit"
-	got, err := MarshalIndent(&s, "", " ")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if got := string(got); got != stringTagExpected {
-		t.Fatalf(" got: %s\nwant: %s\n", got, stringTagExpected)
-	}
-
-	// Verify that it round-trips.
-	var s2 StringTag
-	err = NewDecoder(bytes.NewReader(got)).Decode(&s2)
-	if err != nil {
-		t.Fatalf("Decode: %v", err)
-	}
-	if !reflect.DeepEqual(s, s2) {
-		t.Fatalf("decode didn't match.\nsource: %#v\nEncoded as:\n%s\ndecode: %#v", s, string(got), s2)
-	}
-}
-
-// byte slices are special even if they're renamed types.
-type renamedByte byte
-type renamedByteSlice []byte
-type renamedRenamedByteSlice []renamedByte
-
-func TestEncodeRenamedByteSlice(t *testing.T) {
-	s := renamedByteSlice("abc")
-	result, err := Marshal(s)
-	if err != nil {
-		t.Fatal(err)
-	}
-	expect := `"YWJj"`
-	if string(result) != expect {
-		t.Errorf(" got %s want %s", result, expect)
-	}
-	r := renamedRenamedByteSlice("abc")
-	result, err = Marshal(r)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if string(result) != expect {
-		t.Errorf(" got %s want %s", result, expect)
-	}
-}
-
-var unsupportedValues = []interface{}{
-	math.NaN(),
-	math.Inf(-1),
-	math.Inf(1),
-}
-
-func TestUnsupportedValues(t *testing.T) {
-	for _, v := range unsupportedValues {
-		if _, err := Marshal(v); err != nil {
-			if _, ok := err.(*UnsupportedValueError); !ok {
-				t.Errorf("for %v, got %T want UnsupportedValueError", v, err)
-			}
-		} else {
-			t.Errorf("for %v, expected error", v)
-		}
-	}
-}
-
-// Ref has Marshaler and Unmarshaler methods with pointer receiver.
-type Ref int
-
-func (*Ref) MarshalJSON() ([]byte, error) {
-	return []byte(`"ref"`), nil
-}
-
-func (r *Ref) UnmarshalJSON([]byte) error {
-	*r = 12
-	return nil
-}
-
-// Val has Marshaler methods with value receiver.
-type Val int
-
-func (Val) MarshalJSON() ([]byte, error) {
-	return []byte(`"val"`), nil
-}
-
-// RefText has Marshaler and Unmarshaler methods with pointer receiver.
-type RefText int
-
-func (*RefText) MarshalText() ([]byte, error) {
-	return []byte(`"ref"`), nil
-}
-
-func (r *RefText) UnmarshalText([]byte) error {
-	*r = 13
-	return nil
-}
-
-// ValText has Marshaler methods with value receiver.
-type ValText int
-
-func (ValText) MarshalText() ([]byte, error) {
-	return []byte(`"val"`), nil
-}
-
-func TestRefValMarshal(t *testing.T) {
-	var s = struct {
-		R0 Ref
-		R1 *Ref
-		R2 RefText
-		R3 *RefText
-		V0 Val
-		V1 *Val
-		V2 ValText
-		V3 *ValText
-	}{
-		R0: 12,
-		R1: new(Ref),
-		R2: 14,
-		R3: new(RefText),
-		V0: 13,
-		V1: new(Val),
-		V2: 15,
-		V3: new(ValText),
-	}
-	const want = `{"R0":"ref","R1":"ref","R2":"\"ref\"","R3":"\"ref\"","V0":"val","V1":"val","V2":"\"val\"","V3":"\"val\""}`
-	b, err := Marshal(&s)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	if got := string(b); got != want {
-		t.Errorf("got %q, want %q", got, want)
-	}
-}
-
-// C implements Marshaler and returns unescaped JSON.
-type C int
-
-func (C) MarshalJSON() ([]byte, error) {
-	return []byte(`"<&>"`), nil
-}
-
-// CText implements Marshaler and returns unescaped text.
-type CText int
-
-func (CText) MarshalText() ([]byte, error) {
-	return []byte(`"<&>"`), nil
-}
-
-func TestMarshalerEscaping(t *testing.T) {
-	var c C
-	want := `"\u003c\u0026\u003e"`
-	b, err := Marshal(c)
-	if err != nil {
-		t.Fatalf("Marshal(c): %v", err)
-	}
-	if got := string(b); got != want {
-		t.Errorf("Marshal(c) = %#q, want %#q", got, want)
-	}
-
-	var ct CText
-	want = `"\"\u003c\u0026\u003e\""`
-	b, err = Marshal(ct)
-	if err != nil {
-		t.Fatalf("Marshal(ct): %v", err)
-	}
-	if got := string(b); got != want {
-		t.Errorf("Marshal(ct) = %#q, want %#q", got, want)
-	}
-}
-
-type IntType int
-
-type MyStruct struct {
-	IntType
-}
-
-func TestAnonymousNonstruct(t *testing.T) {
-	var i IntType = 11
-	a := MyStruct{i}
-	const want = `{"IntType":11}`
-
-	b, err := Marshal(a)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	if got := string(b); got != want {
-		t.Errorf("got %q, want %q", got, want)
-	}
-}
-
-type BugA struct {
-	S string
-}
-
-type BugB struct {
-	BugA
-	S string
-}
-
-type BugC struct {
-	S string
-}
-
-// Legal Go: We never use the repeated embedded field (S).
-type BugX struct {
-	A int
-	BugA
-	BugB
-}
-
-// Issue 5245.
-func TestEmbeddedBug(t *testing.T) {
-	v := BugB{
-		BugA{"A"},
-		"B",
-	}
-	b, err := Marshal(v)
-	if err != nil {
-		t.Fatal("Marshal:", err)
-	}
-	want := `{"S":"B"}`
-	got := string(b)
-	if got != want {
-		t.Fatalf("Marshal: got %s want %s", got, want)
-	}
-	// Now check that the duplicate field, S, does not appear.
-	x := BugX{
-		A: 23,
-	}
-	b, err = Marshal(x)
-	if err != nil {
-		t.Fatal("Marshal:", err)
-	}
-	want = `{"A":23}`
-	got = string(b)
-	if got != want {
-		t.Fatalf("Marshal: got %s want %s", got, want)
-	}
-}
-
-type BugD struct { // Same as BugA after tagging.
-	XXX string `json:"S"`
-}
-
-// BugD's tagged S field should dominate BugA's.
-type BugY struct {
-	BugA
-	BugD
-}
-
-// Test that a field with a tag dominates untagged fields.
-func TestTaggedFieldDominates(t *testing.T) {
-	v := BugY{
-		BugA{"BugA"},
-		BugD{"BugD"},
-	}
-	b, err := Marshal(v)
-	if err != nil {
-		t.Fatal("Marshal:", err)
-	}
-	want := `{"S":"BugD"}`
-	got := string(b)
-	if got != want {
-		t.Fatalf("Marshal: got %s want %s", got, want)
-	}
-}
-
-// There are no tags here, so S should not appear.
-type BugZ struct {
-	BugA
-	BugC
-	BugY // Contains a tagged S field through BugD; should not dominate.
-}
-
-func TestDuplicatedFieldDisappears(t *testing.T) {
-	v := BugZ{
-		BugA{"BugA"},
-		BugC{"BugC"},
-		BugY{
-			BugA{"nested BugA"},
-			BugD{"nested BugD"},
-		},
-	}
-	b, err := Marshal(v)
-	if err != nil {
-		t.Fatal("Marshal:", err)
-	}
-	want := `{}`
-	got := string(b)
-	if got != want {
-		t.Fatalf("Marshal: got %s want %s", got, want)
-	}
-}
-
-func TestStringBytes(t *testing.T) {
-	// Test that encodeState.stringBytes and encodeState.string use the same encoding.
-	es := &encodeState{}
-	var r []rune
-	for i := '\u0000'; i <= unicode.MaxRune; i++ {
-		r = append(r, i)
-	}
-	s := string(r) + "\xff\xff\xffhello" // some invalid UTF-8 too
-	_, err := es.string(s)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	esBytes := &encodeState{}
-	_, err = esBytes.stringBytes([]byte(s))
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	enc := es.Buffer.String()
-	encBytes := esBytes.Buffer.String()
-	if enc != encBytes {
-		i := 0
-		for i < len(enc) && i < len(encBytes) && enc[i] == encBytes[i] {
-			i++
-		}
-		enc = enc[i:]
-		encBytes = encBytes[i:]
-		i = 0
-		for i < len(enc) && i < len(encBytes) && enc[len(enc)-i-1] == encBytes[len(encBytes)-i-1] {
-			i++
-		}
-		enc = enc[:len(enc)-i]
-		encBytes = encBytes[:len(encBytes)-i]
-
-		if len(enc) > 20 {
-			enc = enc[:20] + "..."
-		}
-		if len(encBytes) > 20 {
-			encBytes = encBytes[:20] + "..."
-		}
-
-		t.Errorf("encodings differ at %#q vs %#q", enc, encBytes)
-	}
-}
-
-func TestIssue6458(t *testing.T) {
-	type Foo struct {
-		M RawMessage
-	}
-	x := Foo{RawMessage(`"foo"`)}
-
-	b, err := Marshal(&x)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if want := `{"M":"foo"}`; string(b) != want {
-		t.Errorf("Marshal(&x) = %#q; want %#q", b, want)
-	}
-
-	b, err = Marshal(x)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	if want := `{"M":"ImZvbyI="}`; string(b) != want {
-		t.Errorf("Marshal(x) = %#q; want %#q", b, want)
-	}
-}
-
-func TestHTMLEscape(t *testing.T) {
-	var b, want bytes.Buffer
-	m := `{"M":"<html>foo &` + "\xe2\x80\xa8 \xe2\x80\xa9" + `</html>"}`
-	want.Write([]byte(`{"M":"\u003chtml\u003efoo \u0026\u2028 \u2029\u003c/html\u003e"}`))
-	HTMLEscape(&b, []byte(m))
-	if !bytes.Equal(b.Bytes(), want.Bytes()) {
-		t.Errorf("HTMLEscape(&b, []byte(m)) = %s; want %s", b.Bytes(), want.Bytes())
-	}
-}
-
-// golang.org/issue/8582
-func TestEncodePointerString(t *testing.T) {
-	type stringPointer struct {
-		N *int64 `json:"n,string"`
-	}
-	var n int64 = 42
-	b, err := Marshal(stringPointer{N: &n})
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	if got, want := string(b), `{"n":"42"}`; got != want {
-		t.Errorf("Marshal = %s, want %s", got, want)
-	}
-	var back stringPointer
-	err = Unmarshal(b, &back)
-	if err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if back.N == nil {
-		t.Fatalf("Unmarshalled nil N field")
-	}
-	if *back.N != 42 {
-		t.Fatalf("*N = %d; want 42", *back.N)
-	}
-}
-
-var encodeStringTests = []struct {
-	in  string
-	out string
-}{
-	{"\x00", `"\u0000"`},
-	{"\x01", `"\u0001"`},
-	{"\x02", `"\u0002"`},
-	{"\x03", `"\u0003"`},
-	{"\x04", `"\u0004"`},
-	{"\x05", `"\u0005"`},
-	{"\x06", `"\u0006"`},
-	{"\x07", `"\u0007"`},
-	{"\x08", `"\u0008"`},
-	{"\x09", `"\t"`},
-	{"\x0a", `"\n"`},
-	{"\x0b", `"\u000b"`},
-	{"\x0c", `"\u000c"`},
-	{"\x0d", `"\r"`},
-	{"\x0e", `"\u000e"`},
-	{"\x0f", `"\u000f"`},
-	{"\x10", `"\u0010"`},
-	{"\x11", `"\u0011"`},
-	{"\x12", `"\u0012"`},
-	{"\x13", `"\u0013"`},
-	{"\x14", `"\u0014"`},
-	{"\x15", `"\u0015"`},
-	{"\x16", `"\u0016"`},
-	{"\x17", `"\u0017"`},
-	{"\x18", `"\u0018"`},
-	{"\x19", `"\u0019"`},
-	{"\x1a", `"\u001a"`},
-	{"\x1b", `"\u001b"`},
-	{"\x1c", `"\u001c"`},
-	{"\x1d", `"\u001d"`},
-	{"\x1e", `"\u001e"`},
-	{"\x1f", `"\u001f"`},
-}
-
-func TestEncodeString(t *testing.T) {
-	for _, tt := range encodeStringTests {
-		b, err := Marshal(tt.in)
-		if err != nil {
-			t.Errorf("Marshal(%q): %v", tt.in, err)
-			continue
-		}
-		out := string(b)
-		if out != tt.out {
-			t.Errorf("Marshal(%q) = %#q, want %#q", tt.in, out, tt.out)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/fold.go b/third_party/gofrontend/libgo/go/encoding/json/fold.go
deleted file mode 100644
index 9e17012..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/fold.go
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
-	"bytes"
-	"unicode/utf8"
-)
-
-const (
-	caseMask     = ^byte(0x20) // Mask to ignore case in ASCII.
-	kelvin       = '\u212a'
-	smallLongEss = '\u017f'
-)
-
-// foldFunc returns one of four different case folding equivalence
-// functions, from most general (and slow) to fastest:
-//
-// 1) bytes.EqualFold, if the key s contains any non-ASCII UTF-8
-// 2) equalFoldRight, if s contains special folding ASCII ('k', 'K', 's', 'S')
-// 3) asciiEqualFold, no special, but includes non-letters (including _)
-// 4) simpleLetterEqualFold, no specials, no non-letters.
-//
-// The letters S and K are special because they map to 3 runes, not just 2:
-//  * S maps to s and to U+017F 'ſ' Latin small letter long s
-//  * k maps to K and to U+212A 'K' Kelvin sign
-// See https://play.golang.org/p/tTxjOc0OGo
-//
-// The returned function is specialized for matching against s and
-// should only be given s. It's not curried for performance reasons.
-func foldFunc(s []byte) func(s, t []byte) bool {
-	nonLetter := false
-	special := false // special letter
-	for _, b := range s {
-		if b >= utf8.RuneSelf {
-			return bytes.EqualFold
-		}
-		upper := b & caseMask
-		if upper < 'A' || upper > 'Z' {
-			nonLetter = true
-		} else if upper == 'K' || upper == 'S' {
-			// See above for why these letters are special.
-			special = true
-		}
-	}
-	if special {
-		return equalFoldRight
-	}
-	if nonLetter {
-		return asciiEqualFold
-	}
-	return simpleLetterEqualFold
-}
-
-// equalFoldRight is a specialization of bytes.EqualFold when s is
-// known to be all ASCII (including punctuation), but contains an 's',
-// 'S', 'k', or 'K', requiring a Unicode fold on the bytes in t.
-// See comments on foldFunc.
-func equalFoldRight(s, t []byte) bool {
-	for _, sb := range s {
-		if len(t) == 0 {
-			return false
-		}
-		tb := t[0]
-		if tb < utf8.RuneSelf {
-			if sb != tb {
-				sbUpper := sb & caseMask
-				if 'A' <= sbUpper && sbUpper <= 'Z' {
-					if sbUpper != tb&caseMask {
-						return false
-					}
-				} else {
-					return false
-				}
-			}
-			t = t[1:]
-			continue
-		}
-		// sb is ASCII and t is not. t must be either kelvin
-		// sign or long s; sb must be s, S, k, or K.
-		tr, size := utf8.DecodeRune(t)
-		switch sb {
-		case 's', 'S':
-			if tr != smallLongEss {
-				return false
-			}
-		case 'k', 'K':
-			if tr != kelvin {
-				return false
-			}
-		default:
-			return false
-		}
-		t = t[size:]
-
-	}
-	if len(t) > 0 {
-		return false
-	}
-	return true
-}
-
-// asciiEqualFold is a specialization of bytes.EqualFold for use when
-// s is all ASCII (but may contain non-letters) and contains no
-// special-folding letters.
-// See comments on foldFunc.
-func asciiEqualFold(s, t []byte) bool {
-	if len(s) != len(t) {
-		return false
-	}
-	for i, sb := range s {
-		tb := t[i]
-		if sb == tb {
-			continue
-		}
-		if ('a' <= sb && sb <= 'z') || ('A' <= sb && sb <= 'Z') {
-			if sb&caseMask != tb&caseMask {
-				return false
-			}
-		} else {
-			return false
-		}
-	}
-	return true
-}
-
-// simpleLetterEqualFold is a specialization of bytes.EqualFold for
-// use when s is all ASCII letters (no underscores, etc) and also
-// doesn't contain 'k', 'K', 's', or 'S'.
-// See comments on foldFunc.
-func simpleLetterEqualFold(s, t []byte) bool {
-	if len(s) != len(t) {
-		return false
-	}
-	for i, b := range s {
-		if b&caseMask != t[i]&caseMask {
-			return false
-		}
-	}
-	return true
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/fold_test.go b/third_party/gofrontend/libgo/go/encoding/json/fold_test.go
deleted file mode 100644
index 9fb9464..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/fold_test.go
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
-	"bytes"
-	"strings"
-	"testing"
-	"unicode/utf8"
-)
-
-var foldTests = []struct {
-	fn   func(s, t []byte) bool
-	s, t string
-	want bool
-}{
-	{equalFoldRight, "", "", true},
-	{equalFoldRight, "a", "a", true},
-	{equalFoldRight, "", "a", false},
-	{equalFoldRight, "a", "", false},
-	{equalFoldRight, "a", "A", true},
-	{equalFoldRight, "AB", "ab", true},
-	{equalFoldRight, "AB", "ac", false},
-	{equalFoldRight, "sbkKc", "ſbKKc", true},
-	{equalFoldRight, "SbKkc", "ſbKKc", true},
-	{equalFoldRight, "SbKkc", "ſbKK", false},
-	{equalFoldRight, "e", "é", false},
-	{equalFoldRight, "s", "S", true},
-
-	{simpleLetterEqualFold, "", "", true},
-	{simpleLetterEqualFold, "abc", "abc", true},
-	{simpleLetterEqualFold, "abc", "ABC", true},
-	{simpleLetterEqualFold, "abc", "ABCD", false},
-	{simpleLetterEqualFold, "abc", "xxx", false},
-
-	{asciiEqualFold, "a_B", "A_b", true},
-	{asciiEqualFold, "aa@", "aa`", false}, // verify 0x40 and 0x60 aren't case-equivalent
-}
-
-func TestFold(t *testing.T) {
-	for i, tt := range foldTests {
-		if got := tt.fn([]byte(tt.s), []byte(tt.t)); got != tt.want {
-			t.Errorf("%d. %q, %q = %v; want %v", i, tt.s, tt.t, got, tt.want)
-		}
-		truth := strings.EqualFold(tt.s, tt.t)
-		if truth != tt.want {
-			t.Errorf("strings.EqualFold doesn't agree with case %d", i)
-		}
-	}
-}
-
-func TestFoldAgainstUnicode(t *testing.T) {
-	const bufSize = 5
-	buf1 := make([]byte, 0, bufSize)
-	buf2 := make([]byte, 0, bufSize)
-	var runes []rune
-	for i := 0x20; i <= 0x7f; i++ {
-		runes = append(runes, rune(i))
-	}
-	runes = append(runes, kelvin, smallLongEss)
-
-	funcs := []struct {
-		name   string
-		fold   func(s, t []byte) bool
-		letter bool // must be ASCII letter
-		simple bool // must be simple ASCII letter (not 'S' or 'K')
-	}{
-		{
-			name: "equalFoldRight",
-			fold: equalFoldRight,
-		},
-		{
-			name:   "asciiEqualFold",
-			fold:   asciiEqualFold,
-			simple: true,
-		},
-		{
-			name:   "simpleLetterEqualFold",
-			fold:   simpleLetterEqualFold,
-			simple: true,
-			letter: true,
-		},
-	}
-
-	for _, ff := range funcs {
-		for _, r := range runes {
-			if r >= utf8.RuneSelf {
-				continue
-			}
-			if ff.letter && !isASCIILetter(byte(r)) {
-				continue
-			}
-			if ff.simple && (r == 's' || r == 'S' || r == 'k' || r == 'K') {
-				continue
-			}
-			for _, r2 := range runes {
-				buf1 := append(buf1[:0], 'x')
-				buf2 := append(buf2[:0], 'x')
-				buf1 = buf1[:1+utf8.EncodeRune(buf1[1:bufSize], r)]
-				buf2 = buf2[:1+utf8.EncodeRune(buf2[1:bufSize], r2)]
-				buf1 = append(buf1, 'x')
-				buf2 = append(buf2, 'x')
-				want := bytes.EqualFold(buf1, buf2)
-				if got := ff.fold(buf1, buf2); got != want {
-					t.Errorf("%s(%q, %q) = %v; want %v", ff.name, buf1, buf2, got, want)
-				}
-			}
-		}
-	}
-}
-
-func isASCIILetter(b byte) bool {
-	return ('A' <= b && b <= 'Z') || ('a' <= b && b <= 'z')
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/indent.go b/third_party/gofrontend/libgo/go/encoding/json/indent.go
deleted file mode 100644
index e1bacaf..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/indent.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import "bytes"
-
-// Compact appends to dst the JSON-encoded src with
-// insignificant space characters elided.
-func Compact(dst *bytes.Buffer, src []byte) error {
-	return compact(dst, src, false)
-}
-
-func compact(dst *bytes.Buffer, src []byte, escape bool) error {
-	origLen := dst.Len()
-	var scan scanner
-	scan.reset()
-	start := 0
-	for i, c := range src {
-		if escape && (c == '<' || c == '>' || c == '&') {
-			if start < i {
-				dst.Write(src[start:i])
-			}
-			dst.WriteString(`\u00`)
-			dst.WriteByte(hex[c>>4])
-			dst.WriteByte(hex[c&0xF])
-			start = i + 1
-		}
-		// Convert U+2028 and U+2029 (E2 80 A8 and E2 80 A9).
-		if c == 0xE2 && i+2 < len(src) && src[i+1] == 0x80 && src[i+2]&^1 == 0xA8 {
-			if start < i {
-				dst.Write(src[start:i])
-			}
-			dst.WriteString(`\u202`)
-			dst.WriteByte(hex[src[i+2]&0xF])
-			start = i + 3
-		}
-		v := scan.step(&scan, int(c))
-		if v >= scanSkipSpace {
-			if v == scanError {
-				break
-			}
-			if start < i {
-				dst.Write(src[start:i])
-			}
-			start = i + 1
-		}
-	}
-	if scan.eof() == scanError {
-		dst.Truncate(origLen)
-		return scan.err
-	}
-	if start < len(src) {
-		dst.Write(src[start:])
-	}
-	return nil
-}
-
-func newline(dst *bytes.Buffer, prefix, indent string, depth int) {
-	dst.WriteByte('\n')
-	dst.WriteString(prefix)
-	for i := 0; i < depth; i++ {
-		dst.WriteString(indent)
-	}
-}
-
-// Indent appends to dst an indented form of the JSON-encoded src.
-// Each element in a JSON object or array begins on a new,
-// indented line beginning with prefix followed by one or more
-// copies of indent according to the indentation nesting.
-// The data appended to dst does not begin with the prefix nor
-// any indentation, and has no trailing newline, to make it
-// easier to embed inside other formatted JSON data.
-func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error {
-	origLen := dst.Len()
-	var scan scanner
-	scan.reset()
-	needIndent := false
-	depth := 0
-	for _, c := range src {
-		scan.bytes++
-		v := scan.step(&scan, int(c))
-		if v == scanSkipSpace {
-			continue
-		}
-		if v == scanError {
-			break
-		}
-		if needIndent && v != scanEndObject && v != scanEndArray {
-			needIndent = false
-			depth++
-			newline(dst, prefix, indent, depth)
-		}
-
-		// Emit semantically uninteresting bytes
-		// (in particular, punctuation in strings) unmodified.
-		if v == scanContinue {
-			dst.WriteByte(c)
-			continue
-		}
-
-		// Add spacing around real punctuation.
-		switch c {
-		case '{', '[':
-			// delay indent so that empty object and array are formatted as {} and [].
-			needIndent = true
-			dst.WriteByte(c)
-
-		case ',':
-			dst.WriteByte(c)
-			newline(dst, prefix, indent, depth)
-
-		case ':':
-			dst.WriteByte(c)
-			dst.WriteByte(' ')
-
-		case '}', ']':
-			if needIndent {
-				// suppress indent in empty object/array
-				needIndent = false
-			} else {
-				depth--
-				newline(dst, prefix, indent, depth)
-			}
-			dst.WriteByte(c)
-
-		default:
-			dst.WriteByte(c)
-		}
-	}
-	if scan.eof() == scanError {
-		dst.Truncate(origLen)
-		return scan.err
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/scanner.go b/third_party/gofrontend/libgo/go/encoding/json/scanner.go
deleted file mode 100644
index 38d0b08..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/scanner.go
+++ /dev/null
@@ -1,630 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-// JSON value parser state machine.
-// Just about at the limit of what is reasonable to write by hand.
-// Some parts are a bit tedious, but overall it nicely factors out the
-// otherwise common code from the multiple scanning functions
-// in this package (Compact, Indent, checkValid, nextValue, etc).
-//
-// This file starts with two simple examples using the scanner
-// before diving into the scanner itself.
-
-import "strconv"
-
-// checkValid verifies that data is valid JSON-encoded data.
-// scan is passed in for use by checkValid to avoid an allocation.
-func checkValid(data []byte, scan *scanner) error {
-	scan.reset()
-	for _, c := range data {
-		scan.bytes++
-		if scan.step(scan, int(c)) == scanError {
-			return scan.err
-		}
-	}
-	if scan.eof() == scanError {
-		return scan.err
-	}
-	return nil
-}
-
-// nextValue splits data after the next whole JSON value,
-// returning that value and the bytes that follow it as separate slices.
-// scan is passed in for use by nextValue to avoid an allocation.
-func nextValue(data []byte, scan *scanner) (value, rest []byte, err error) {
-	scan.reset()
-	for i, c := range data {
-		v := scan.step(scan, int(c))
-		if v >= scanEndObject {
-			switch v {
-			// probe the scanner with a space to determine whether we will
-			// get scanEnd on the next character. Otherwise, if the next character
-			// is not a space, scanEndTop allocates a needless error.
-			case scanEndObject, scanEndArray:
-				if scan.step(scan, ' ') == scanEnd {
-					return data[:i+1], data[i+1:], nil
-				}
-			case scanError:
-				return nil, nil, scan.err
-			case scanEnd:
-				return data[0:i], data[i:], nil
-			}
-		}
-	}
-	if scan.eof() == scanError {
-		return nil, nil, scan.err
-	}
-	return data, nil, nil
-}
-
-// A SyntaxError is a description of a JSON syntax error.
-type SyntaxError struct {
-	msg    string // description of error
-	Offset int64  // error occurred after reading Offset bytes
-}
-
-func (e *SyntaxError) Error() string { return e.msg }
-
-// A scanner is a JSON scanning state machine.
-// Callers call scan.reset() and then pass bytes in one at a time
-// by calling scan.step(&scan, c) for each byte.
-// The return value, referred to as an opcode, tells the
-// caller about significant parsing events like beginning
-// and ending literals, objects, and arrays, so that the
-// caller can follow along if it wishes.
-// The return value scanEnd indicates that a single top-level
-// JSON value has been completed, *before* the byte that
-// just got passed in.  (The indication must be delayed in order
-// to recognize the end of numbers: is 123 a whole value or
-// the beginning of 12345e+6?).
-type scanner struct {
-	// The step is a func to be called to execute the next transition.
-	// Also tried using an integer constant and a single func
-	// with a switch, but using the func directly was 10% faster
-	// on a 64-bit Mac Mini, and it's nicer to read.
-	step func(*scanner, int) int
-
-	// Reached end of top-level value.
-	endTop bool
-
-	// Stack of what we're in the middle of - array values, object keys, object values.
-	parseState []int
-
-	// Error that happened, if any.
-	err error
-
-	// 1-byte redo (see undo method)
-	redo      bool
-	redoCode  int
-	redoState func(*scanner, int) int
-
-	// total bytes consumed, updated by decoder.Decode
-	bytes int64
-}
-
-// These values are returned by the state transition functions
-// assigned to scanner.state and the method scanner.eof.
-// They give details about the current state of the scan that
-// callers might be interested to know about.
-// It is okay to ignore the return value of any particular
-// call to scanner.state: if one call returns scanError,
-// every subsequent call will return scanError too.
-const (
-	// Continue.
-	scanContinue     = iota // uninteresting byte
-	scanBeginLiteral        // end implied by next result != scanContinue
-	scanBeginObject         // begin object
-	scanObjectKey           // just finished object key (string)
-	scanObjectValue         // just finished non-last object value
-	scanEndObject           // end object (implies scanObjectValue if possible)
-	scanBeginArray          // begin array
-	scanArrayValue          // just finished array value
-	scanEndArray            // end array (implies scanArrayValue if possible)
-	scanSkipSpace           // space byte; can skip; known to be last "continue" result
-
-	// Stop.
-	scanEnd   // top-level value ended *before* this byte; known to be first "stop" result
-	scanError // hit an error, scanner.err.
-)
-
-// These values are stored in the parseState stack.
-// They give the current state of a composite value
-// being scanned.  If the parser is inside a nested value
-// the parseState describes the nested state, outermost at entry 0.
-const (
-	parseObjectKey   = iota // parsing object key (before colon)
-	parseObjectValue        // parsing object value (after colon)
-	parseArrayValue         // parsing array value
-)
-
-// reset prepares the scanner for use.
-// It must be called before calling s.step.
-func (s *scanner) reset() {
-	s.step = stateBeginValue
-	s.parseState = s.parseState[0:0]
-	s.err = nil
-	s.redo = false
-	s.endTop = false
-}
-
-// eof tells the scanner that the end of input has been reached.
-// It returns a scan status just as s.step does.
-func (s *scanner) eof() int {
-	if s.err != nil {
-		return scanError
-	}
-	if s.endTop {
-		return scanEnd
-	}
-	s.step(s, ' ')
-	if s.endTop {
-		return scanEnd
-	}
-	if s.err == nil {
-		s.err = &SyntaxError{"unexpected end of JSON input", s.bytes}
-	}
-	return scanError
-}
-
-// pushParseState pushes a new parse state p onto the parse stack.
-func (s *scanner) pushParseState(p int) {
-	s.parseState = append(s.parseState, p)
-}
-
-// popParseState pops a parse state (already obtained) off the stack
-// and updates s.step accordingly.
-func (s *scanner) popParseState() {
-	n := len(s.parseState) - 1
-	s.parseState = s.parseState[0:n]
-	s.redo = false
-	if n == 0 {
-		s.step = stateEndTop
-		s.endTop = true
-	} else {
-		s.step = stateEndValue
-	}
-}
-
-func isSpace(c rune) bool {
-	return c == ' ' || c == '\t' || c == '\r' || c == '\n'
-}
-
-// stateBeginValueOrEmpty is the state after reading `[`.
-func stateBeginValueOrEmpty(s *scanner, c int) int {
-	if c <= ' ' && isSpace(rune(c)) {
-		return scanSkipSpace
-	}
-	if c == ']' {
-		return stateEndValue(s, c)
-	}
-	return stateBeginValue(s, c)
-}
-
-// stateBeginValue is the state at the beginning of the input.
-func stateBeginValue(s *scanner, c int) int {
-	if c <= ' ' && isSpace(rune(c)) {
-		return scanSkipSpace
-	}
-	switch c {
-	case '{':
-		s.step = stateBeginStringOrEmpty
-		s.pushParseState(parseObjectKey)
-		return scanBeginObject
-	case '[':
-		s.step = stateBeginValueOrEmpty
-		s.pushParseState(parseArrayValue)
-		return scanBeginArray
-	case '"':
-		s.step = stateInString
-		return scanBeginLiteral
-	case '-':
-		s.step = stateNeg
-		return scanBeginLiteral
-	case '0': // beginning of 0.123
-		s.step = state0
-		return scanBeginLiteral
-	case 't': // beginning of true
-		s.step = stateT
-		return scanBeginLiteral
-	case 'f': // beginning of false
-		s.step = stateF
-		return scanBeginLiteral
-	case 'n': // beginning of null
-		s.step = stateN
-		return scanBeginLiteral
-	}
-	if '1' <= c && c <= '9' { // beginning of 1234.5
-		s.step = state1
-		return scanBeginLiteral
-	}
-	return s.error(c, "looking for beginning of value")
-}
-
-// stateBeginStringOrEmpty is the state after reading `{`.
-func stateBeginStringOrEmpty(s *scanner, c int) int {
-	if c <= ' ' && isSpace(rune(c)) {
-		return scanSkipSpace
-	}
-	if c == '}' {
-		n := len(s.parseState)
-		s.parseState[n-1] = parseObjectValue
-		return stateEndValue(s, c)
-	}
-	return stateBeginString(s, c)
-}
-
-// stateBeginString is the state after reading `{"key": value,`.
-func stateBeginString(s *scanner, c int) int {
-	if c <= ' ' && isSpace(rune(c)) {
-		return scanSkipSpace
-	}
-	if c == '"' {
-		s.step = stateInString
-		return scanBeginLiteral
-	}
-	return s.error(c, "looking for beginning of object key string")
-}
-
-// stateEndValue is the state after completing a value,
-// such as after reading `{}` or `true` or `["x"`.
-func stateEndValue(s *scanner, c int) int {
-	n := len(s.parseState)
-	if n == 0 {
-		// Completed top-level before the current byte.
-		s.step = stateEndTop
-		s.endTop = true
-		return stateEndTop(s, c)
-	}
-	if c <= ' ' && isSpace(rune(c)) {
-		s.step = stateEndValue
-		return scanSkipSpace
-	}
-	ps := s.parseState[n-1]
-	switch ps {
-	case parseObjectKey:
-		if c == ':' {
-			s.parseState[n-1] = parseObjectValue
-			s.step = stateBeginValue
-			return scanObjectKey
-		}
-		return s.error(c, "after object key")
-	case parseObjectValue:
-		if c == ',' {
-			s.parseState[n-1] = parseObjectKey
-			s.step = stateBeginString
-			return scanObjectValue
-		}
-		if c == '}' {
-			s.popParseState()
-			return scanEndObject
-		}
-		return s.error(c, "after object key:value pair")
-	case parseArrayValue:
-		if c == ',' {
-			s.step = stateBeginValue
-			return scanArrayValue
-		}
-		if c == ']' {
-			s.popParseState()
-			return scanEndArray
-		}
-		return s.error(c, "after array element")
-	}
-	return s.error(c, "")
-}
-
-// stateEndTop is the state after finishing the top-level value,
-// such as after reading `{}` or `[1,2,3]`.
-// Only space characters should be seen now.
-func stateEndTop(s *scanner, c int) int {
-	if c != ' ' && c != '\t' && c != '\r' && c != '\n' {
-		// Complain about non-space byte on next call.
-		s.error(c, "after top-level value")
-	}
-	return scanEnd
-}
-
-// stateInString is the state after reading `"`.
-func stateInString(s *scanner, c int) int {
-	if c == '"' {
-		s.step = stateEndValue
-		return scanContinue
-	}
-	if c == '\\' {
-		s.step = stateInStringEsc
-		return scanContinue
-	}
-	if c < 0x20 {
-		return s.error(c, "in string literal")
-	}
-	return scanContinue
-}
-
-// stateInStringEsc is the state after reading `"\` during a quoted string.
-func stateInStringEsc(s *scanner, c int) int {
-	switch c {
-	case 'b', 'f', 'n', 'r', 't', '\\', '/', '"':
-		s.step = stateInString
-		return scanContinue
-	}
-	if c == 'u' {
-		s.step = stateInStringEscU
-		return scanContinue
-	}
-	return s.error(c, "in string escape code")
-}
-
-// stateInStringEscU is the state after reading `"\u` during a quoted string.
-func stateInStringEscU(s *scanner, c int) int {
-	if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
-		s.step = stateInStringEscU1
-		return scanContinue
-	}
-	// numbers
-	return s.error(c, "in \\u hexadecimal character escape")
-}
-
-// stateInStringEscU1 is the state after reading `"\u1` during a quoted string.
-func stateInStringEscU1(s *scanner, c int) int {
-	if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
-		s.step = stateInStringEscU12
-		return scanContinue
-	}
-	// numbers
-	return s.error(c, "in \\u hexadecimal character escape")
-}
-
-// stateInStringEscU12 is the state after reading `"\u12` during a quoted string.
-func stateInStringEscU12(s *scanner, c int) int {
-	if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
-		s.step = stateInStringEscU123
-		return scanContinue
-	}
-	// numbers
-	return s.error(c, "in \\u hexadecimal character escape")
-}
-
-// stateInStringEscU123 is the state after reading `"\u123` during a quoted string.
-func stateInStringEscU123(s *scanner, c int) int {
-	if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' {
-		s.step = stateInString
-		return scanContinue
-	}
-	// numbers
-	return s.error(c, "in \\u hexadecimal character escape")
-}
-
-// stateNeg is the state after reading `-` during a number.
-func stateNeg(s *scanner, c int) int {
-	if c == '0' {
-		s.step = state0
-		return scanContinue
-	}
-	if '1' <= c && c <= '9' {
-		s.step = state1
-		return scanContinue
-	}
-	return s.error(c, "in numeric literal")
-}
-
-// state1 is the state after reading a non-zero integer during a number,
-// such as after reading `1` or `100` but not `0`.
-func state1(s *scanner, c int) int {
-	if '0' <= c && c <= '9' {
-		s.step = state1
-		return scanContinue
-	}
-	return state0(s, c)
-}
-
-// state0 is the state after reading `0` during a number.
-func state0(s *scanner, c int) int {
-	if c == '.' {
-		s.step = stateDot
-		return scanContinue
-	}
-	if c == 'e' || c == 'E' {
-		s.step = stateE
-		return scanContinue
-	}
-	return stateEndValue(s, c)
-}
-
-// stateDot is the state after reading the integer and decimal point in a number,
-// such as after reading `1.`.
-func stateDot(s *scanner, c int) int {
-	if '0' <= c && c <= '9' {
-		s.step = stateDot0
-		return scanContinue
-	}
-	return s.error(c, "after decimal point in numeric literal")
-}
-
-// stateDot0 is the state after reading the integer, decimal point, and subsequent
-// digits of a number, such as after reading `3.14`.
-func stateDot0(s *scanner, c int) int {
-	if '0' <= c && c <= '9' {
-		s.step = stateDot0
-		return scanContinue
-	}
-	if c == 'e' || c == 'E' {
-		s.step = stateE
-		return scanContinue
-	}
-	return stateEndValue(s, c)
-}
-
-// stateE is the state after reading the mantissa and e in a number,
-// such as after reading `314e` or `0.314e`.
-func stateE(s *scanner, c int) int {
-	if c == '+' {
-		s.step = stateESign
-		return scanContinue
-	}
-	if c == '-' {
-		s.step = stateESign
-		return scanContinue
-	}
-	return stateESign(s, c)
-}
-
-// stateESign is the state after reading the mantissa, e, and sign in a number,
-// such as after reading `314e-` or `0.314e+`.
-func stateESign(s *scanner, c int) int {
-	if '0' <= c && c <= '9' {
-		s.step = stateE0
-		return scanContinue
-	}
-	return s.error(c, "in exponent of numeric literal")
-}
-
-// stateE0 is the state after reading the mantissa, e, optional sign,
-// and at least one digit of the exponent in a number,
-// such as after reading `314e-2` or `0.314e+1` or `3.14e0`.
-func stateE0(s *scanner, c int) int {
-	if '0' <= c && c <= '9' {
-		s.step = stateE0
-		return scanContinue
-	}
-	return stateEndValue(s, c)
-}
-
-// stateT is the state after reading `t`.
-func stateT(s *scanner, c int) int {
-	if c == 'r' {
-		s.step = stateTr
-		return scanContinue
-	}
-	return s.error(c, "in literal true (expecting 'r')")
-}
-
-// stateTr is the state after reading `tr`.
-func stateTr(s *scanner, c int) int {
-	if c == 'u' {
-		s.step = stateTru
-		return scanContinue
-	}
-	return s.error(c, "in literal true (expecting 'u')")
-}
-
-// stateTru is the state after reading `tru`.
-func stateTru(s *scanner, c int) int {
-	if c == 'e' {
-		s.step = stateEndValue
-		return scanContinue
-	}
-	return s.error(c, "in literal true (expecting 'e')")
-}
-
-// stateF is the state after reading `f`.
-func stateF(s *scanner, c int) int {
-	if c == 'a' {
-		s.step = stateFa
-		return scanContinue
-	}
-	return s.error(c, "in literal false (expecting 'a')")
-}
-
-// stateFa is the state after reading `fa`.
-func stateFa(s *scanner, c int) int {
-	if c == 'l' {
-		s.step = stateFal
-		return scanContinue
-	}
-	return s.error(c, "in literal false (expecting 'l')")
-}
-
-// stateFal is the state after reading `fal`.
-func stateFal(s *scanner, c int) int {
-	if c == 's' {
-		s.step = stateFals
-		return scanContinue
-	}
-	return s.error(c, "in literal false (expecting 's')")
-}
-
-// stateFals is the state after reading `fals`.
-func stateFals(s *scanner, c int) int {
-	if c == 'e' {
-		s.step = stateEndValue
-		return scanContinue
-	}
-	return s.error(c, "in literal false (expecting 'e')")
-}
-
-// stateN is the state after reading `n`.
-func stateN(s *scanner, c int) int {
-	if c == 'u' {
-		s.step = stateNu
-		return scanContinue
-	}
-	return s.error(c, "in literal null (expecting 'u')")
-}
-
-// stateNu is the state after reading `nu`.
-func stateNu(s *scanner, c int) int {
-	if c == 'l' {
-		s.step = stateNul
-		return scanContinue
-	}
-	return s.error(c, "in literal null (expecting 'l')")
-}
-
-// stateNul is the state after reading `nul`.
-func stateNul(s *scanner, c int) int {
-	if c == 'l' {
-		s.step = stateEndValue
-		return scanContinue
-	}
-	return s.error(c, "in literal null (expecting 'l')")
-}
-
-// stateError is the state after reaching a syntax error,
-// such as after reading `[1}` or `5.1.2`.
-func stateError(s *scanner, c int) int {
-	return scanError
-}
-
-// error records an error and switches to the error state.
-func (s *scanner) error(c int, context string) int {
-	s.step = stateError
-	s.err = &SyntaxError{"invalid character " + quoteChar(c) + " " + context, s.bytes}
-	return scanError
-}
-
-// quoteChar formats c as a quoted character literal
-func quoteChar(c int) string {
-	// special cases - different from quoted strings
-	if c == '\'' {
-		return `'\''`
-	}
-	if c == '"' {
-		return `'"'`
-	}
-
-	// use quoted string with different quotation marks
-	s := strconv.Quote(string(c))
-	return "'" + s[1:len(s)-1] + "'"
-}
-
-// undo causes the scanner to return scanCode from the next state transition.
-// This gives callers a simple 1-byte undo mechanism.
-func (s *scanner) undo(scanCode int) {
-	if s.redo {
-		panic("json: invalid use of scanner")
-	}
-	s.redoCode = scanCode
-	s.redoState = s.step
-	s.step = stateRedo
-	s.redo = true
-}
-
-// stateRedo helps implement the scanner's 1-byte undo.
-func stateRedo(s *scanner, c int) int {
-	s.redo = false
-	s.step = s.redoState
-	return s.redoCode
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/scanner_test.go b/third_party/gofrontend/libgo/go/encoding/json/scanner_test.go
deleted file mode 100644
index 66383ef..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/scanner_test.go
+++ /dev/null
@@ -1,316 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
-	"bytes"
-	"math"
-	"math/rand"
-	"reflect"
-	"testing"
-)
-
-// Tests of simple examples.
-
-type example struct {
-	compact string
-	indent  string
-}
-
-var examples = []example{
-	{`1`, `1`},
-	{`{}`, `{}`},
-	{`[]`, `[]`},
-	{`{"":2}`, "{\n\t\"\": 2\n}"},
-	{`[3]`, "[\n\t3\n]"},
-	{`[1,2,3]`, "[\n\t1,\n\t2,\n\t3\n]"},
-	{`{"x":1}`, "{\n\t\"x\": 1\n}"},
-	{ex1, ex1i},
-}
-
-var ex1 = `[true,false,null,"x",1,1.5,0,-5e+2]`
-
-var ex1i = `[
-	true,
-	false,
-	null,
-	"x",
-	1,
-	1.5,
-	0,
-	-5e+2
-]`
-
-func TestCompact(t *testing.T) {
-	var buf bytes.Buffer
-	for _, tt := range examples {
-		buf.Reset()
-		if err := Compact(&buf, []byte(tt.compact)); err != nil {
-			t.Errorf("Compact(%#q): %v", tt.compact, err)
-		} else if s := buf.String(); s != tt.compact {
-			t.Errorf("Compact(%#q) = %#q, want original", tt.compact, s)
-		}
-
-		buf.Reset()
-		if err := Compact(&buf, []byte(tt.indent)); err != nil {
-			t.Errorf("Compact(%#q): %v", tt.indent, err)
-			continue
-		} else if s := buf.String(); s != tt.compact {
-			t.Errorf("Compact(%#q) = %#q, want %#q", tt.indent, s, tt.compact)
-		}
-	}
-}
-
-func TestCompactSeparators(t *testing.T) {
-	// U+2028 and U+2029 should be escaped inside strings.
-	// They should not appear outside strings.
-	tests := []struct {
-		in, compact string
-	}{
-		{"{\"\u2028\": 1}", `{"\u2028":1}`},
-		{"{\"\u2029\" :2}", `{"\u2029":2}`},
-	}
-	for _, tt := range tests {
-		var buf bytes.Buffer
-		if err := Compact(&buf, []byte(tt.in)); err != nil {
-			t.Errorf("Compact(%q): %v", tt.in, err)
-		} else if s := buf.String(); s != tt.compact {
-			t.Errorf("Compact(%q) = %q, want %q", tt.in, s, tt.compact)
-		}
-	}
-}
-
-func TestIndent(t *testing.T) {
-	var buf bytes.Buffer
-	for _, tt := range examples {
-		buf.Reset()
-		if err := Indent(&buf, []byte(tt.indent), "", "\t"); err != nil {
-			t.Errorf("Indent(%#q): %v", tt.indent, err)
-		} else if s := buf.String(); s != tt.indent {
-			t.Errorf("Indent(%#q) = %#q, want original", tt.indent, s)
-		}
-
-		buf.Reset()
-		if err := Indent(&buf, []byte(tt.compact), "", "\t"); err != nil {
-			t.Errorf("Indent(%#q): %v", tt.compact, err)
-			continue
-		} else if s := buf.String(); s != tt.indent {
-			t.Errorf("Indent(%#q) = %#q, want %#q", tt.compact, s, tt.indent)
-		}
-	}
-}
-
-// Tests of a large random structure.
-
-func TestCompactBig(t *testing.T) {
-	initBig()
-	var buf bytes.Buffer
-	if err := Compact(&buf, jsonBig); err != nil {
-		t.Fatalf("Compact: %v", err)
-	}
-	b := buf.Bytes()
-	if !bytes.Equal(b, jsonBig) {
-		t.Error("Compact(jsonBig) != jsonBig")
-		diff(t, b, jsonBig)
-		return
-	}
-}
-
-func TestIndentBig(t *testing.T) {
-	initBig()
-	var buf bytes.Buffer
-	if err := Indent(&buf, jsonBig, "", "\t"); err != nil {
-		t.Fatalf("Indent1: %v", err)
-	}
-	b := buf.Bytes()
-	if len(b) == len(jsonBig) {
-		// jsonBig is compact (no unnecessary spaces);
-		// indenting should make it bigger
-		t.Fatalf("Indent(jsonBig) did not get bigger")
-	}
-
-	// should be idempotent
-	var buf1 bytes.Buffer
-	if err := Indent(&buf1, b, "", "\t"); err != nil {
-		t.Fatalf("Indent2: %v", err)
-	}
-	b1 := buf1.Bytes()
-	if !bytes.Equal(b1, b) {
-		t.Error("Indent(Indent(jsonBig)) != Indent(jsonBig)")
-		diff(t, b1, b)
-		return
-	}
-
-	// should get back to original
-	buf1.Reset()
-	if err := Compact(&buf1, b); err != nil {
-		t.Fatalf("Compact: %v", err)
-	}
-	b1 = buf1.Bytes()
-	if !bytes.Equal(b1, jsonBig) {
-		t.Error("Compact(Indent(jsonBig)) != jsonBig")
-		diff(t, b1, jsonBig)
-		return
-	}
-}
-
-type indentErrorTest struct {
-	in  string
-	err error
-}
-
-var indentErrorTests = []indentErrorTest{
-	{`{"X": "foo", "Y"}`, &SyntaxError{"invalid character '}' after object key", 17}},
-	{`{"X": "foo" "Y": "bar"}`, &SyntaxError{"invalid character '\"' after object key:value pair", 13}},
-}
-
-func TestIndentErrors(t *testing.T) {
-	for i, tt := range indentErrorTests {
-		slice := make([]uint8, 0)
-		buf := bytes.NewBuffer(slice)
-		if err := Indent(buf, []uint8(tt.in), "", ""); err != nil {
-			if !reflect.DeepEqual(err, tt.err) {
-				t.Errorf("#%d: Indent: %#v", i, err)
-				continue
-			}
-		}
-	}
-}
-
-func TestNextValueBig(t *testing.T) {
-	initBig()
-	var scan scanner
-	item, rest, err := nextValue(jsonBig, &scan)
-	if err != nil {
-		t.Fatalf("nextValue: %s", err)
-	}
-	if len(item) != len(jsonBig) || &item[0] != &jsonBig[0] {
-		t.Errorf("invalid item: %d %d", len(item), len(jsonBig))
-	}
-	if len(rest) != 0 {
-		t.Errorf("invalid rest: %d", len(rest))
-	}
-
-	item, rest, err = nextValue(append(jsonBig, "HELLO WORLD"...), &scan)
-	if err != nil {
-		t.Fatalf("nextValue extra: %s", err)
-	}
-	if len(item) != len(jsonBig) {
-		t.Errorf("invalid item: %d %d", len(item), len(jsonBig))
-	}
-	if string(rest) != "HELLO WORLD" {
-		t.Errorf("invalid rest: %d", len(rest))
-	}
-}
-
-var benchScan scanner
-
-func BenchmarkSkipValue(b *testing.B) {
-	initBig()
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		nextValue(jsonBig, &benchScan)
-	}
-	b.SetBytes(int64(len(jsonBig)))
-}
-
-func diff(t *testing.T, a, b []byte) {
-	for i := 0; ; i++ {
-		if i >= len(a) || i >= len(b) || a[i] != b[i] {
-			j := i - 10
-			if j < 0 {
-				j = 0
-			}
-			t.Errorf("diverge at %d: «%s» vs «%s»", i, trim(a[j:]), trim(b[j:]))
-			return
-		}
-	}
-}
-
-func trim(b []byte) []byte {
-	if len(b) > 20 {
-		return b[0:20]
-	}
-	return b
-}
-
-// Generate a random JSON object.
-
-var jsonBig []byte
-
-func initBig() {
-	n := 10000
-	if testing.Short() {
-		n = 100
-	}
-	b, err := Marshal(genValue(n))
-	if err != nil {
-		panic(err)
-	}
-	jsonBig = b
-}
-
-func genValue(n int) interface{} {
-	if n > 1 {
-		switch rand.Intn(2) {
-		case 0:
-			return genArray(n)
-		case 1:
-			return genMap(n)
-		}
-	}
-	switch rand.Intn(3) {
-	case 0:
-		return rand.Intn(2) == 0
-	case 1:
-		return rand.NormFloat64()
-	case 2:
-		return genString(30)
-	}
-	panic("unreachable")
-}
-
-func genString(stddev float64) string {
-	n := int(math.Abs(rand.NormFloat64()*stddev + stddev/2))
-	c := make([]rune, n)
-	for i := range c {
-		f := math.Abs(rand.NormFloat64()*64 + 32)
-		if f > 0x10ffff {
-			f = 0x10ffff
-		}
-		c[i] = rune(f)
-	}
-	return string(c)
-}
-
-func genArray(n int) []interface{} {
-	f := int(math.Abs(rand.NormFloat64()) * math.Min(10, float64(n/2)))
-	if f > n {
-		f = n
-	}
-	if f < 1 {
-		f = 1
-	}
-	x := make([]interface{}, f)
-	for i := range x {
-		x[i] = genValue(((i+1)*n)/f - (i*n)/f)
-	}
-	return x
-}
-
-func genMap(n int) map[string]interface{} {
-	f := int(math.Abs(rand.NormFloat64()) * math.Min(10, float64(n/2)))
-	if f > n {
-		f = n
-	}
-	if n > 0 && f == 0 {
-		f = 1
-	}
-	x := make(map[string]interface{})
-	for i := 0; i < f; i++ {
-		x[genString(10)] = genValue(((i+1)*n)/f - (i*n)/f)
-	}
-	return x
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/stream.go b/third_party/gofrontend/libgo/go/encoding/json/stream.go
deleted file mode 100644
index dc53bce..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/stream.go
+++ /dev/null
@@ -1,480 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
-	"bytes"
-	"errors"
-	"io"
-)
-
-// A Decoder reads and decodes JSON objects from an input stream.
-type Decoder struct {
-	r     io.Reader
-	buf   []byte
-	d     decodeState
-	scanp int // start of unread data in buf
-	scan  scanner
-	err   error
-
-	tokenState int
-	tokenStack []int
-}
-
-// NewDecoder returns a new decoder that reads from r.
-//
-// The decoder introduces its own buffering and may
-// read data from r beyond the JSON values requested.
-func NewDecoder(r io.Reader) *Decoder {
-	return &Decoder{r: r}
-}
-
-// UseNumber causes the Decoder to unmarshal a number into an interface{} as a
-// Number instead of as a float64.
-func (dec *Decoder) UseNumber() { dec.d.useNumber = true }
-
-// Decode reads the next JSON-encoded value from its
-// input and stores it in the value pointed to by v.
-//
-// See the documentation for Unmarshal for details about
-// the conversion of JSON into a Go value.
-func (dec *Decoder) Decode(v interface{}) error {
-	if dec.err != nil {
-		return dec.err
-	}
-
-	if err := dec.tokenPrepareForDecode(); err != nil {
-		return err
-	}
-
-	if !dec.tokenValueAllowed() {
-		return &SyntaxError{msg: "not at beginning of value"}
-	}
-
-	// Read whole value into buffer.
-	n, err := dec.readValue()
-	if err != nil {
-		return err
-	}
-	dec.d.init(dec.buf[dec.scanp : dec.scanp+n])
-	dec.scanp += n
-
-	// Don't save err from unmarshal into dec.err:
-	// the connection is still usable since we read a complete JSON
-	// object from it before the error happened.
-	err = dec.d.unmarshal(v)
-
-	// fixup token streaming state
-	dec.tokenValueEnd()
-
-	return err
-}
-
-// Buffered returns a reader of the data remaining in the Decoder's
-// buffer. The reader is valid until the next call to Decode.
-func (dec *Decoder) Buffered() io.Reader {
-	return bytes.NewReader(dec.buf[dec.scanp:])
-}
-
-// readValue reads a JSON value into dec.buf.
-// It returns the length of the encoding.
-func (dec *Decoder) readValue() (int, error) {
-	dec.scan.reset()
-
-	scanp := dec.scanp
-	var err error
-Input:
-	for {
-		// Look in the buffer for a new value.
-		for i, c := range dec.buf[scanp:] {
-			dec.scan.bytes++
-			v := dec.scan.step(&dec.scan, int(c))
-			if v == scanEnd {
-				scanp += i
-				break Input
-			}
-			// scanEnd is delayed one byte.
-			// We might block trying to get that byte from src,
-			// so instead invent a space byte.
-			if (v == scanEndObject || v == scanEndArray) && dec.scan.step(&dec.scan, ' ') == scanEnd {
-				scanp += i + 1
-				break Input
-			}
-			if v == scanError {
-				dec.err = dec.scan.err
-				return 0, dec.scan.err
-			}
-		}
-		scanp = len(dec.buf)
-
-		// Did the last read have an error?
-		// Delayed until now to allow buffer scan.
-		if err != nil {
-			if err == io.EOF {
-				if dec.scan.step(&dec.scan, ' ') == scanEnd {
-					break Input
-				}
-				if nonSpace(dec.buf) {
-					err = io.ErrUnexpectedEOF
-				}
-			}
-			dec.err = err
-			return 0, err
-		}
-
-		n := scanp - dec.scanp
-		err = dec.refill()
-		scanp = dec.scanp + n
-	}
-	return scanp - dec.scanp, nil
-}
-
-func (dec *Decoder) refill() error {
-	// Make room to read more into the buffer.
-	// First slide down data already consumed.
-	if dec.scanp > 0 {
-		n := copy(dec.buf, dec.buf[dec.scanp:])
-		dec.buf = dec.buf[:n]
-		dec.scanp = 0
-	}
-
-	// Grow buffer if not large enough.
-	const minRead = 512
-	if cap(dec.buf)-len(dec.buf) < minRead {
-		newBuf := make([]byte, len(dec.buf), 2*cap(dec.buf)+minRead)
-		copy(newBuf, dec.buf)
-		dec.buf = newBuf
-	}
-
-	// Read.  Delay error for next iteration (after scan).
-	n, err := dec.r.Read(dec.buf[len(dec.buf):cap(dec.buf)])
-	dec.buf = dec.buf[0 : len(dec.buf)+n]
-
-	return err
-}
-
-func nonSpace(b []byte) bool {
-	for _, c := range b {
-		if !isSpace(rune(c)) {
-			return true
-		}
-	}
-	return false
-}
-
-// An Encoder writes JSON objects to an output stream.
-type Encoder struct {
-	w   io.Writer
-	err error
-}
-
-// NewEncoder returns a new encoder that writes to w.
-func NewEncoder(w io.Writer) *Encoder {
-	return &Encoder{w: w}
-}
-
-// Encode writes the JSON encoding of v to the stream,
-// followed by a newline character.
-//
-// See the documentation for Marshal for details about the
-// conversion of Go values to JSON.
-func (enc *Encoder) Encode(v interface{}) error {
-	if enc.err != nil {
-		return enc.err
-	}
-	e := newEncodeState()
-	err := e.marshal(v)
-	if err != nil {
-		return err
-	}
-
-	// Terminate each value with a newline.
-	// This makes the output look a little nicer
-	// when debugging, and some kind of space
-	// is required if the encoded value was a number,
-	// so that the reader knows there aren't more
-	// digits coming.
-	e.WriteByte('\n')
-
-	if _, err = enc.w.Write(e.Bytes()); err != nil {
-		enc.err = err
-	}
-	encodeStatePool.Put(e)
-	return err
-}
-
-// RawMessage is a raw encoded JSON object.
-// It implements Marshaler and Unmarshaler and can
-// be used to delay JSON decoding or precompute a JSON encoding.
-type RawMessage []byte
-
-// MarshalJSON returns *m as the JSON encoding of m.
-func (m *RawMessage) MarshalJSON() ([]byte, error) {
-	return *m, nil
-}
-
-// UnmarshalJSON sets *m to a copy of data.
-func (m *RawMessage) UnmarshalJSON(data []byte) error {
-	if m == nil {
-		return errors.New("json.RawMessage: UnmarshalJSON on nil pointer")
-	}
-	*m = append((*m)[0:0], data...)
-	return nil
-}
-
-var _ Marshaler = (*RawMessage)(nil)
-var _ Unmarshaler = (*RawMessage)(nil)
-
-// A Token holds a value of one of these types:
-//
-//	Delim, for the four JSON delimiters [ ] { }
-//	bool, for JSON booleans
-//	float64, for JSON numbers
-//	Number, for JSON numbers
-//	string, for JSON string literals
-//	nil, for JSON null
-//
-type Token interface{}
-
-const (
-	tokenTopValue = iota
-	tokenArrayStart
-	tokenArrayValue
-	tokenArrayComma
-	tokenObjectStart
-	tokenObjectKey
-	tokenObjectColon
-	tokenObjectValue
-	tokenObjectComma
-)
-
-// advance tokenstate from a separator state to a value state
-func (dec *Decoder) tokenPrepareForDecode() error {
-	// Note: Not calling peek before switch, to avoid
-	// putting peek into the standard Decode path.
-	// peek is only called when using the Token API.
-	switch dec.tokenState {
-	case tokenArrayComma:
-		c, err := dec.peek()
-		if err != nil {
-			return err
-		}
-		if c != ',' {
-			return &SyntaxError{"expected comma after array element", 0}
-		}
-		dec.scanp++
-		dec.tokenState = tokenArrayValue
-	case tokenObjectColon:
-		c, err := dec.peek()
-		if err != nil {
-			return err
-		}
-		if c != ':' {
-			return &SyntaxError{"expected colon after object key", 0}
-		}
-		dec.scanp++
-		dec.tokenState = tokenObjectValue
-	}
-	return nil
-}
-
-func (dec *Decoder) tokenValueAllowed() bool {
-	switch dec.tokenState {
-	case tokenTopValue, tokenArrayStart, tokenArrayValue, tokenObjectValue:
-		return true
-	}
-	return false
-}
-
-func (dec *Decoder) tokenValueEnd() {
-	switch dec.tokenState {
-	case tokenArrayStart, tokenArrayValue:
-		dec.tokenState = tokenArrayComma
-	case tokenObjectValue:
-		dec.tokenState = tokenObjectComma
-	}
-}
-
-// A Delim is a JSON array or object delimiter, one of [ ] { or }.
-type Delim rune
-
-func (d Delim) String() string {
-	return string(d)
-}
-
-// Token returns the next JSON token in the input stream.
-// At the end of the input stream, Token returns nil, io.EOF.
-//
-// Token guarantees that the delimiters [ ] { } it returns are
-// properly nested and matched: if Token encounters an unexpected
-// delimiter in the input, it will return an error.
-//
-// The input stream consists of basic JSON values—bool, string,
-// number, and null—along with delimiters [ ] { } of type Delim
-// to mark the start and end of arrays and objects.
-// Commas and colons are elided.
-func (dec *Decoder) Token() (Token, error) {
-	for {
-		c, err := dec.peek()
-		if err != nil {
-			return nil, err
-		}
-		switch c {
-		case '[':
-			if !dec.tokenValueAllowed() {
-				return dec.tokenError(c)
-			}
-			dec.scanp++
-			dec.tokenStack = append(dec.tokenStack, dec.tokenState)
-			dec.tokenState = tokenArrayStart
-			return Delim('['), nil
-
-		case ']':
-			if dec.tokenState != tokenArrayStart && dec.tokenState != tokenArrayComma {
-				return dec.tokenError(c)
-			}
-			dec.scanp++
-			dec.tokenState = dec.tokenStack[len(dec.tokenStack)-1]
-			dec.tokenStack = dec.tokenStack[:len(dec.tokenStack)-1]
-			dec.tokenValueEnd()
-			return Delim(']'), nil
-
-		case '{':
-			if !dec.tokenValueAllowed() {
-				return dec.tokenError(c)
-			}
-			dec.scanp++
-			dec.tokenStack = append(dec.tokenStack, dec.tokenState)
-			dec.tokenState = tokenObjectStart
-			return Delim('{'), nil
-
-		case '}':
-			if dec.tokenState != tokenObjectStart && dec.tokenState != tokenObjectComma {
-				return dec.tokenError(c)
-			}
-			dec.scanp++
-			dec.tokenState = dec.tokenStack[len(dec.tokenStack)-1]
-			dec.tokenStack = dec.tokenStack[:len(dec.tokenStack)-1]
-			dec.tokenValueEnd()
-			return Delim('}'), nil
-
-		case ':':
-			if dec.tokenState != tokenObjectColon {
-				return dec.tokenError(c)
-			}
-			dec.scanp++
-			dec.tokenState = tokenObjectValue
-			continue
-
-		case ',':
-			if dec.tokenState == tokenArrayComma {
-				dec.scanp++
-				dec.tokenState = tokenArrayValue
-				continue
-			}
-			if dec.tokenState == tokenObjectComma {
-				dec.scanp++
-				dec.tokenState = tokenObjectKey
-				continue
-			}
-			return dec.tokenError(c)
-
-		case '"':
-			if dec.tokenState == tokenObjectStart || dec.tokenState == tokenObjectKey {
-				var x string
-				old := dec.tokenState
-				dec.tokenState = tokenTopValue
-				err := dec.Decode(&x)
-				dec.tokenState = old
-				if err != nil {
-					clearOffset(err)
-					return nil, err
-				}
-				dec.tokenState = tokenObjectColon
-				return x, nil
-			}
-			fallthrough
-
-		default:
-			if !dec.tokenValueAllowed() {
-				return dec.tokenError(c)
-			}
-			var x interface{}
-			if err := dec.Decode(&x); err != nil {
-				clearOffset(err)
-				return nil, err
-			}
-			return x, nil
-		}
-	}
-}
-
-func clearOffset(err error) {
-	if s, ok := err.(*SyntaxError); ok {
-		s.Offset = 0
-	}
-}
-
-func (dec *Decoder) tokenError(c byte) (Token, error) {
-	var context string
-	switch dec.tokenState {
-	case tokenTopValue:
-		context = " looking for beginning of value"
-	case tokenArrayStart, tokenArrayValue, tokenObjectValue:
-		context = " looking for beginning of value"
-	case tokenArrayComma:
-		context = " after array element"
-	case tokenObjectKey:
-		context = " looking for beginning of object key string"
-	case tokenObjectColon:
-		context = " after object key"
-	case tokenObjectComma:
-		context = " after object key:value pair"
-	}
-	return nil, &SyntaxError{"invalid character " + quoteChar(int(c)) + " " + context, 0}
-}
-
-// More reports whether there is another element in the
-// current array or object being parsed.
-func (dec *Decoder) More() bool {
-	c, err := dec.peek()
-	return err == nil && c != ']' && c != '}'
-}
-
-func (dec *Decoder) peek() (byte, error) {
-	var err error
-	for {
-		for i := dec.scanp; i < len(dec.buf); i++ {
-			c := dec.buf[i]
-			if isSpace(rune(c)) {
-				continue
-			}
-			dec.scanp = i
-			return c, nil
-		}
-		// buffer has been scanned, now report any error
-		if err != nil {
-			return 0, err
-		}
-		err = dec.refill()
-	}
-}
-
-/*
-TODO
-
-// EncodeToken writes the given JSON token to the stream.
-// It returns an error if the delimiters [ ] { } are not properly used.
-//
-// EncodeToken does not call Flush, because usually it is part of
-// a larger operation such as Encode, and those will call Flush when finished.
-// Callers that create an Encoder and then invoke EncodeToken directly,
-// without using Encode, need to call Flush when finished to ensure that
-// the JSON is written to the underlying writer.
-func (e *Encoder) EncodeToken(t Token) error  {
-	...
-}
-
-*/
diff --git a/third_party/gofrontend/libgo/go/encoding/json/stream_test.go b/third_party/gofrontend/libgo/go/encoding/json/stream_test.go
deleted file mode 100644
index c2e3040..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/stream_test.go
+++ /dev/null
@@ -1,354 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
-	"bytes"
-	"io"
-	"io/ioutil"
-	"log"
-	"net"
-	"net/http"
-	"net/http/httptest"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-// Test values for the stream test.
-// One of each JSON kind.
-var streamTest = []interface{}{
-	0.1,
-	"hello",
-	nil,
-	true,
-	false,
-	[]interface{}{"a", "b", "c"},
-	map[string]interface{}{"K": "Kelvin", "ß": "long s"},
-	3.14, // another value to make sure something can follow map
-}
-
-var streamEncoded = `0.1
-"hello"
-null
-true
-false
-["a","b","c"]
-{"ß":"long s","K":"Kelvin"}
-3.14
-`
-
-func TestEncoder(t *testing.T) {
-	for i := 0; i <= len(streamTest); i++ {
-		var buf bytes.Buffer
-		enc := NewEncoder(&buf)
-		for j, v := range streamTest[0:i] {
-			if err := enc.Encode(v); err != nil {
-				t.Fatalf("encode #%d: %v", j, err)
-			}
-		}
-		if have, want := buf.String(), nlines(streamEncoded, i); have != want {
-			t.Errorf("encoding %d items: mismatch", i)
-			diff(t, []byte(have), []byte(want))
-			break
-		}
-	}
-}
-
-func TestDecoder(t *testing.T) {
-	for i := 0; i <= len(streamTest); i++ {
-		// Use stream without newlines as input,
-		// just to stress the decoder even more.
-		// Our test input does not include back-to-back numbers.
-		// Otherwise stripping the newlines would
-		// merge two adjacent JSON values.
-		var buf bytes.Buffer
-		for _, c := range nlines(streamEncoded, i) {
-			if c != '\n' {
-				buf.WriteRune(c)
-			}
-		}
-		out := make([]interface{}, i)
-		dec := NewDecoder(&buf)
-		for j := range out {
-			if err := dec.Decode(&out[j]); err != nil {
-				t.Fatalf("decode #%d/%d: %v", j, i, err)
-			}
-		}
-		if !reflect.DeepEqual(out, streamTest[0:i]) {
-			t.Errorf("decoding %d items: mismatch", i)
-			for j := range out {
-				if !reflect.DeepEqual(out[j], streamTest[j]) {
-					t.Errorf("#%d: have %v want %v", j, out[j], streamTest[j])
-				}
-			}
-			break
-		}
-	}
-}
-
-func TestDecoderBuffered(t *testing.T) {
-	r := strings.NewReader(`{"Name": "Gopher"} extra `)
-	var m struct {
-		Name string
-	}
-	d := NewDecoder(r)
-	err := d.Decode(&m)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if m.Name != "Gopher" {
-		t.Errorf("Name = %q; want Gopher", m.Name)
-	}
-	rest, err := ioutil.ReadAll(d.Buffered())
-	if err != nil {
-		t.Fatal(err)
-	}
-	if g, w := string(rest), " extra "; g != w {
-		t.Errorf("Remaining = %q; want %q", g, w)
-	}
-}
-
-func nlines(s string, n int) string {
-	if n <= 0 {
-		return ""
-	}
-	for i, c := range s {
-		if c == '\n' {
-			if n--; n == 0 {
-				return s[0 : i+1]
-			}
-		}
-	}
-	return s
-}
-
-func TestRawMessage(t *testing.T) {
-	// TODO(rsc): Should not need the * in *RawMessage
-	var data struct {
-		X  float64
-		Id *RawMessage
-		Y  float32
-	}
-	const raw = `["\u0056",null]`
-	const msg = `{"X":0.1,"Id":["\u0056",null],"Y":0.2}`
-	err := Unmarshal([]byte(msg), &data)
-	if err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if string([]byte(*data.Id)) != raw {
-		t.Fatalf("Raw mismatch: have %#q want %#q", []byte(*data.Id), raw)
-	}
-	b, err := Marshal(&data)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	if string(b) != msg {
-		t.Fatalf("Marshal: have %#q want %#q", b, msg)
-	}
-}
-
-func TestNullRawMessage(t *testing.T) {
-	// TODO(rsc): Should not need the * in *RawMessage
-	var data struct {
-		X  float64
-		Id *RawMessage
-		Y  float32
-	}
-	data.Id = new(RawMessage)
-	const msg = `{"X":0.1,"Id":null,"Y":0.2}`
-	err := Unmarshal([]byte(msg), &data)
-	if err != nil {
-		t.Fatalf("Unmarshal: %v", err)
-	}
-	if data.Id != nil {
-		t.Fatalf("Raw mismatch: have non-nil, want nil")
-	}
-	b, err := Marshal(&data)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	if string(b) != msg {
-		t.Fatalf("Marshal: have %#q want %#q", b, msg)
-	}
-}
-
-var blockingTests = []string{
-	`{"x": 1}`,
-	`[1, 2, 3]`,
-}
-
-func TestBlocking(t *testing.T) {
-	for _, enc := range blockingTests {
-		r, w := net.Pipe()
-		go w.Write([]byte(enc))
-		var val interface{}
-
-		// If Decode reads beyond what w.Write writes above,
-		// it will block, and the test will deadlock.
-		if err := NewDecoder(r).Decode(&val); err != nil {
-			t.Errorf("decoding %s: %v", enc, err)
-		}
-		r.Close()
-		w.Close()
-	}
-}
-
-func BenchmarkEncoderEncode(b *testing.B) {
-	b.ReportAllocs()
-	type T struct {
-		X, Y string
-	}
-	v := &T{"foo", "bar"}
-	for i := 0; i < b.N; i++ {
-		if err := NewEncoder(ioutil.Discard).Encode(v); err != nil {
-			b.Fatal(err)
-		}
-	}
-}
-
-type tokenStreamCase struct {
-	json      string
-	expTokens []interface{}
-}
-
-type decodeThis struct {
-	v interface{}
-}
-
-var tokenStreamCases []tokenStreamCase = []tokenStreamCase{
-	// streaming token cases
-	{json: `10`, expTokens: []interface{}{float64(10)}},
-	{json: ` [10] `, expTokens: []interface{}{
-		Delim('['), float64(10), Delim(']')}},
-	{json: ` [false,10,"b"] `, expTokens: []interface{}{
-		Delim('['), false, float64(10), "b", Delim(']')}},
-	{json: `{ "a": 1 }`, expTokens: []interface{}{
-		Delim('{'), "a", float64(1), Delim('}')}},
-	{json: `{"a": 1, "b":"3"}`, expTokens: []interface{}{
-		Delim('{'), "a", float64(1), "b", "3", Delim('}')}},
-	{json: ` [{"a": 1},{"a": 2}] `, expTokens: []interface{}{
-		Delim('['),
-		Delim('{'), "a", float64(1), Delim('}'),
-		Delim('{'), "a", float64(2), Delim('}'),
-		Delim(']')}},
-	{json: `{"obj": {"a": 1}}`, expTokens: []interface{}{
-		Delim('{'), "obj", Delim('{'), "a", float64(1), Delim('}'),
-		Delim('}')}},
-	{json: `{"obj": [{"a": 1}]}`, expTokens: []interface{}{
-		Delim('{'), "obj", Delim('['),
-		Delim('{'), "a", float64(1), Delim('}'),
-		Delim(']'), Delim('}')}},
-
-	// streaming tokens with intermittent Decode()
-	{json: `{ "a": 1 }`, expTokens: []interface{}{
-		Delim('{'), "a",
-		decodeThis{float64(1)},
-		Delim('}')}},
-	{json: ` [ { "a" : 1 } ] `, expTokens: []interface{}{
-		Delim('['),
-		decodeThis{map[string]interface{}{"a": float64(1)}},
-		Delim(']')}},
-	{json: ` [{"a": 1},{"a": 2}] `, expTokens: []interface{}{
-		Delim('['),
-		decodeThis{map[string]interface{}{"a": float64(1)}},
-		decodeThis{map[string]interface{}{"a": float64(2)}},
-		Delim(']')}},
-	{json: `{ "obj" : [ { "a" : 1 } ] }`, expTokens: []interface{}{
-		Delim('{'), "obj", Delim('['),
-		decodeThis{map[string]interface{}{"a": float64(1)}},
-		Delim(']'), Delim('}')}},
-
-	{json: `{"obj": {"a": 1}}`, expTokens: []interface{}{
-		Delim('{'), "obj",
-		decodeThis{map[string]interface{}{"a": float64(1)}},
-		Delim('}')}},
-	{json: `{"obj": [{"a": 1}]}`, expTokens: []interface{}{
-		Delim('{'), "obj",
-		decodeThis{[]interface{}{
-			map[string]interface{}{"a": float64(1)},
-		}},
-		Delim('}')}},
-	{json: ` [{"a": 1} {"a": 2}] `, expTokens: []interface{}{
-		Delim('['),
-		decodeThis{map[string]interface{}{"a": float64(1)}},
-		decodeThis{&SyntaxError{"expected comma after array element", 0}},
-	}},
-	{json: `{ "a" 1 }`, expTokens: []interface{}{
-		Delim('{'), "a",
-		decodeThis{&SyntaxError{"expected colon after object key", 0}},
-	}},
-}
-
-func TestDecodeInStream(t *testing.T) {
-
-	for ci, tcase := range tokenStreamCases {
-
-		dec := NewDecoder(strings.NewReader(tcase.json))
-		for i, etk := range tcase.expTokens {
-
-			var tk interface{}
-			var err error
-
-			if dt, ok := etk.(decodeThis); ok {
-				etk = dt.v
-				err = dec.Decode(&tk)
-			} else {
-				tk, err = dec.Token()
-			}
-			if experr, ok := etk.(error); ok {
-				if err == nil || err.Error() != experr.Error() {
-					t.Errorf("case %v: Expected error %v in %q, but was %v", ci, experr, tcase.json, err)
-				}
-				break
-			} else if err == io.EOF {
-				t.Errorf("case %v: Unexpected EOF in %q", ci, tcase.json)
-				break
-			} else if err != nil {
-				t.Errorf("case %v: Unexpected error '%v' in %q", ci, err, tcase.json)
-				break
-			}
-			if !reflect.DeepEqual(tk, etk) {
-				t.Errorf(`case %v: %q @ %v expected %T(%v) was %T(%v)`, ci, tcase.json, i, etk, etk, tk, tk)
-				break
-			}
-		}
-	}
-
-}
-
-// Test from golang.org/issue/11893
-func TestHTTPDecoding(t *testing.T) {
-	const raw = `{ "foo": "bar" }`
-
-	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		w.Write([]byte(raw))
-	}))
-	defer ts.Close()
-	res, err := http.Get(ts.URL)
-	if err != nil {
-		log.Fatalf("GET failed: %v", err)
-	}
-	defer res.Body.Close()
-
-	foo := struct {
-		Foo string
-	}{}
-
-	d := NewDecoder(res.Body)
-	err = d.Decode(&foo)
-	if err != nil {
-		t.Fatalf("Decode: %v", err)
-	}
-	if foo.Foo != "bar" {
-		t.Errorf("decoded %q; want \"bar\"", foo.Foo)
-	}
-
-	// make sure we get the EOF the second time
-	err = d.Decode(&foo)
-	if err != io.EOF {
-		t.Errorf("err = %v; want io.EOF", err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/tagkey_test.go b/third_party/gofrontend/libgo/go/encoding/json/tagkey_test.go
deleted file mode 100644
index 85bb4ba..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/tagkey_test.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
-	"testing"
-)
-
-type basicLatin2xTag struct {
-	V string `json:"$%-/"`
-}
-
-type basicLatin3xTag struct {
-	V string `json:"0123456789"`
-}
-
-type basicLatin4xTag struct {
-	V string `json:"ABCDEFGHIJKLMO"`
-}
-
-type basicLatin5xTag struct {
-	V string `json:"PQRSTUVWXYZ_"`
-}
-
-type basicLatin6xTag struct {
-	V string `json:"abcdefghijklmno"`
-}
-
-type basicLatin7xTag struct {
-	V string `json:"pqrstuvwxyz"`
-}
-
-type miscPlaneTag struct {
-	V string `json:"色は匂へど"`
-}
-
-type percentSlashTag struct {
-	V string `json:"text/html%"` // https://golang.org/issue/2718
-}
-
-type punctuationTag struct {
-	V string `json:"!#$%&()*+-./:<=>?@[]^_{|}~"` // https://golang.org/issue/3546
-}
-
-type emptyTag struct {
-	W string
-}
-
-type misnamedTag struct {
-	X string `jsom:"Misnamed"`
-}
-
-type badFormatTag struct {
-	Y string `:"BadFormat"`
-}
-
-type badCodeTag struct {
-	Z string `json:" !\"#&'()*+,."`
-}
-
-type spaceTag struct {
-	Q string `json:"With space"`
-}
-
-type unicodeTag struct {
-	W string `json:"Ελλάδα"`
-}
-
-var structTagObjectKeyTests = []struct {
-	raw   interface{}
-	value string
-	key   string
-}{
-	{basicLatin2xTag{"2x"}, "2x", "$%-/"},
-	{basicLatin3xTag{"3x"}, "3x", "0123456789"},
-	{basicLatin4xTag{"4x"}, "4x", "ABCDEFGHIJKLMO"},
-	{basicLatin5xTag{"5x"}, "5x", "PQRSTUVWXYZ_"},
-	{basicLatin6xTag{"6x"}, "6x", "abcdefghijklmno"},
-	{basicLatin7xTag{"7x"}, "7x", "pqrstuvwxyz"},
-	{miscPlaneTag{"いろはにほへと"}, "いろはにほへと", "色は匂へど"},
-	{emptyTag{"Pour Moi"}, "Pour Moi", "W"},
-	{misnamedTag{"Animal Kingdom"}, "Animal Kingdom", "X"},
-	{badFormatTag{"Orfevre"}, "Orfevre", "Y"},
-	{badCodeTag{"Reliable Man"}, "Reliable Man", "Z"},
-	{percentSlashTag{"brut"}, "brut", "text/html%"},
-	{punctuationTag{"Union Rags"}, "Union Rags", "!#$%&()*+-./:<=>?@[]^_{|}~"},
-	{spaceTag{"Perreddu"}, "Perreddu", "With space"},
-	{unicodeTag{"Loukanikos"}, "Loukanikos", "Ελλάδα"},
-}
-
-func TestStructTagObjectKey(t *testing.T) {
-	for _, tt := range structTagObjectKeyTests {
-		b, err := Marshal(tt.raw)
-		if err != nil {
-			t.Fatalf("Marshal(%#q) failed: %v", tt.raw, err)
-		}
-		var f interface{}
-		err = Unmarshal(b, &f)
-		if err != nil {
-			t.Fatalf("Unmarshal(%#q) failed: %v", b, err)
-		}
-		for i, v := range f.(map[string]interface{}) {
-			switch i {
-			case tt.key:
-				if s, ok := v.(string); !ok || s != tt.value {
-					t.Fatalf("Unexpected value: %#q, want %v", s, tt.value)
-				}
-			default:
-				t.Fatalf("Unexpected key: %#q, from %#q", i, b)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/tags.go b/third_party/gofrontend/libgo/go/encoding/json/tags.go
deleted file mode 100644
index c38fd51..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/tags.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
-	"strings"
-)
-
-// tagOptions is the string following a comma in a struct field's "json"
-// tag, or the empty string. It does not include the leading comma.
-type tagOptions string
-
-// parseTag splits a struct field's json tag into its name and
-// comma-separated options.
-func parseTag(tag string) (string, tagOptions) {
-	if idx := strings.Index(tag, ","); idx != -1 {
-		return tag[:idx], tagOptions(tag[idx+1:])
-	}
-	return tag, tagOptions("")
-}
-
-// Contains reports whether a comma-separated list of options
-// contains a particular substr flag. substr must be surrounded by a
-// string boundary or commas.
-func (o tagOptions) Contains(optionName string) bool {
-	if len(o) == 0 {
-		return false
-	}
-	s := string(o)
-	for s != "" {
-		var next string
-		i := strings.Index(s, ",")
-		if i >= 0 {
-			s, next = s[:i], s[i+1:]
-		}
-		if s == optionName {
-			return true
-		}
-		s = next
-	}
-	return false
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/tags_test.go b/third_party/gofrontend/libgo/go/encoding/json/tags_test.go
deleted file mode 100644
index 91fb188..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/tags_test.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package json
-
-import (
-	"testing"
-)
-
-func TestTagParsing(t *testing.T) {
-	name, opts := parseTag("field,foobar,foo")
-	if name != "field" {
-		t.Fatalf("name = %q, want field", name)
-	}
-	for _, tt := range []struct {
-		opt  string
-		want bool
-	}{
-		{"foobar", true},
-		{"foo", true},
-		{"bar", false},
-	} {
-		if opts.Contains(tt.opt) != tt.want {
-			t.Errorf("Contains(%q) = %v", tt.opt, !tt.want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/json/testdata/code.json.gz b/third_party/gofrontend/libgo/go/encoding/json/testdata/code.json.gz
deleted file mode 100644
index 0e2895b..0000000
--- a/third_party/gofrontend/libgo/go/encoding/json/testdata/code.json.gz
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/encoding/pem/pem.go b/third_party/gofrontend/libgo/go/encoding/pem/pem.go
deleted file mode 100644
index 506196b..0000000
--- a/third_party/gofrontend/libgo/go/encoding/pem/pem.go
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package pem implements the PEM data encoding, which originated in Privacy
-// Enhanced Mail. The most common use of PEM encoding today is in TLS keys and
-// certificates. See RFC 1421.
-package pem
-
-import (
-	"bytes"
-	"encoding/base64"
-	"errors"
-	"io"
-	"sort"
-	"strings"
-)
-
-// A Block represents a PEM encoded structure.
-//
-// The encoded form is:
-//    -----BEGIN Type-----
-//    Headers
-//    base64-encoded Bytes
-//    -----END Type-----
-// where Headers is a possibly empty sequence of Key: Value lines.
-type Block struct {
-	Type    string            // The type, taken from the preamble (i.e. "RSA PRIVATE KEY").
-	Headers map[string]string // Optional headers.
-	Bytes   []byte            // The decoded bytes of the contents. Typically a DER encoded ASN.1 structure.
-}
-
-// getLine results the first \r\n or \n delineated line from the given byte
-// array. The line does not include trailing whitespace or the trailing new
-// line bytes. The remainder of the byte array (also not including the new line
-// bytes) is also returned and this will always be smaller than the original
-// argument.
-func getLine(data []byte) (line, rest []byte) {
-	i := bytes.Index(data, []byte{'\n'})
-	var j int
-	if i < 0 {
-		i = len(data)
-		j = i
-	} else {
-		j = i + 1
-		if i > 0 && data[i-1] == '\r' {
-			i--
-		}
-	}
-	return bytes.TrimRight(data[0:i], " \t"), data[j:]
-}
-
-// removeWhitespace returns a copy of its input with all spaces, tab and
-// newline characters removed.
-func removeWhitespace(data []byte) []byte {
-	result := make([]byte, len(data))
-	n := 0
-
-	for _, b := range data {
-		if b == ' ' || b == '\t' || b == '\r' || b == '\n' {
-			continue
-		}
-		result[n] = b
-		n++
-	}
-
-	return result[0:n]
-}
-
-var pemStart = []byte("\n-----BEGIN ")
-var pemEnd = []byte("\n-----END ")
-var pemEndOfLine = []byte("-----")
-
-// Decode will find the next PEM formatted block (certificate, private key
-// etc) in the input. It returns that block and the remainder of the input. If
-// no PEM data is found, p is nil and the whole of the input is returned in
-// rest.
-func Decode(data []byte) (p *Block, rest []byte) {
-	// pemStart begins with a newline. However, at the very beginning of
-	// the byte array, we'll accept the start string without it.
-	rest = data
-	if bytes.HasPrefix(data, pemStart[1:]) {
-		rest = rest[len(pemStart)-1 : len(data)]
-	} else if i := bytes.Index(data, pemStart); i >= 0 {
-		rest = rest[i+len(pemStart) : len(data)]
-	} else {
-		return nil, data
-	}
-
-	typeLine, rest := getLine(rest)
-	if !bytes.HasSuffix(typeLine, pemEndOfLine) {
-		return decodeError(data, rest)
-	}
-	typeLine = typeLine[0 : len(typeLine)-len(pemEndOfLine)]
-
-	p = &Block{
-		Headers: make(map[string]string),
-		Type:    string(typeLine),
-	}
-
-	for {
-		// This loop terminates because getLine's second result is
-		// always smaller than its argument.
-		if len(rest) == 0 {
-			return nil, data
-		}
-		line, next := getLine(rest)
-
-		i := bytes.Index(line, []byte{':'})
-		if i == -1 {
-			break
-		}
-
-		// TODO(agl): need to cope with values that spread across lines.
-		key, val := line[:i], line[i+1:]
-		key = bytes.TrimSpace(key)
-		val = bytes.TrimSpace(val)
-		p.Headers[string(key)] = string(val)
-		rest = next
-	}
-
-	var endIndex int
-	// If there were no headers, the END line might occur
-	// immediately, without a leading newline.
-	if len(p.Headers) == 0 && bytes.HasPrefix(rest, pemEnd[1:]) {
-		endIndex = 0
-	} else {
-		endIndex = bytes.Index(rest, pemEnd)
-	}
-
-	if endIndex < 0 {
-		return decodeError(data, rest)
-	}
-
-	base64Data := removeWhitespace(rest[:endIndex])
-	p.Bytes = make([]byte, base64.StdEncoding.DecodedLen(len(base64Data)))
-	n, err := base64.StdEncoding.Decode(p.Bytes, base64Data)
-	if err != nil {
-		return decodeError(data, rest)
-	}
-	p.Bytes = p.Bytes[:n]
-
-	// the -1 is because we might have only matched pemEnd without the
-	// leading newline if the PEM block was empty.
-	_, rest = getLine(rest[endIndex+len(pemEnd)-1:])
-
-	return
-}
-
-func decodeError(data, rest []byte) (*Block, []byte) {
-	// If we get here then we have rejected a likely looking, but
-	// ultimately invalid PEM block. We need to start over from a new
-	// position.  We have consumed the preamble line and will have consumed
-	// any lines which could be header lines. However, a valid preamble
-	// line is not a valid header line, therefore we cannot have consumed
-	// the preamble line for the any subsequent block. Thus, we will always
-	// find any valid block, no matter what bytes precede it.
-	//
-	// For example, if the input is
-	//
-	//    -----BEGIN MALFORMED BLOCK-----
-	//    junk that may look like header lines
-	//   or data lines, but no END line
-	//
-	//    -----BEGIN ACTUAL BLOCK-----
-	//    realdata
-	//    -----END ACTUAL BLOCK-----
-	//
-	// we've failed to parse using the first BEGIN line
-	// and now will try again, using the second BEGIN line.
-	p, rest := Decode(rest)
-	if p == nil {
-		rest = data
-	}
-	return p, rest
-}
-
-const pemLineLength = 64
-
-type lineBreaker struct {
-	line [pemLineLength]byte
-	used int
-	out  io.Writer
-}
-
-var nl = []byte{'\n'}
-
-func (l *lineBreaker) Write(b []byte) (n int, err error) {
-	if l.used+len(b) < pemLineLength {
-		copy(l.line[l.used:], b)
-		l.used += len(b)
-		return len(b), nil
-	}
-
-	n, err = l.out.Write(l.line[0:l.used])
-	if err != nil {
-		return
-	}
-	excess := pemLineLength - l.used
-	l.used = 0
-
-	n, err = l.out.Write(b[0:excess])
-	if err != nil {
-		return
-	}
-
-	n, err = l.out.Write(nl)
-	if err != nil {
-		return
-	}
-
-	return l.Write(b[excess:])
-}
-
-func (l *lineBreaker) Close() (err error) {
-	if l.used > 0 {
-		_, err = l.out.Write(l.line[0:l.used])
-		if err != nil {
-			return
-		}
-		_, err = l.out.Write(nl)
-	}
-
-	return
-}
-
-func writeHeader(out io.Writer, k, v string) error {
-	_, err := out.Write([]byte(k + ": " + v + "\n"))
-	return err
-}
-
-func Encode(out io.Writer, b *Block) error {
-	if _, err := out.Write(pemStart[1:]); err != nil {
-		return err
-	}
-	if _, err := out.Write([]byte(b.Type + "-----\n")); err != nil {
-		return err
-	}
-
-	if len(b.Headers) > 0 {
-		const procType = "Proc-Type"
-		h := make([]string, 0, len(b.Headers))
-		hasProcType := false
-		for k := range b.Headers {
-			if k == procType {
-				hasProcType = true
-				continue
-			}
-			h = append(h, k)
-		}
-		// The Proc-Type header must be written first.
-		// See RFC 1421, section 4.6.1.1
-		if hasProcType {
-			if err := writeHeader(out, procType, b.Headers[procType]); err != nil {
-				return err
-			}
-		}
-		// For consistency of output, write other headers sorted by key.
-		sort.Strings(h)
-		for _, k := range h {
-			if strings.Contains(k, ":") {
-				return errors.New("pem: cannot encode a header key that contains a colon")
-			}
-			if err := writeHeader(out, k, b.Headers[k]); err != nil {
-				return err
-			}
-		}
-		if _, err := out.Write(nl); err != nil {
-			return err
-		}
-	}
-
-	var breaker lineBreaker
-	breaker.out = out
-
-	b64 := base64.NewEncoder(base64.StdEncoding, &breaker)
-	if _, err := b64.Write(b.Bytes); err != nil {
-		return err
-	}
-	b64.Close()
-	breaker.Close()
-
-	if _, err := out.Write(pemEnd[1:]); err != nil {
-		return err
-	}
-	_, err := out.Write([]byte(b.Type + "-----\n"))
-	return err
-}
-
-func EncodeToMemory(b *Block) []byte {
-	var buf bytes.Buffer
-	Encode(&buf, b)
-	return buf.Bytes()
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/pem/pem_test.go b/third_party/gofrontend/libgo/go/encoding/pem/pem_test.go
deleted file mode 100644
index ab656c6..0000000
--- a/third_party/gofrontend/libgo/go/encoding/pem/pem_test.go
+++ /dev/null
@@ -1,514 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pem
-
-import (
-	"bytes"
-	"io/ioutil"
-	"reflect"
-	"strings"
-	"testing"
-	"testing/quick"
-)
-
-type GetLineTest struct {
-	in, out1, out2 string
-}
-
-var getLineTests = []GetLineTest{
-	{"abc", "abc", ""},
-	{"abc\r", "abc\r", ""},
-	{"abc\n", "abc", ""},
-	{"abc\r\n", "abc", ""},
-	{"abc\nd", "abc", "d"},
-	{"abc\r\nd", "abc", "d"},
-	{"\nabc", "", "abc"},
-	{"\r\nabc", "", "abc"},
-}
-
-func TestGetLine(t *testing.T) {
-	for i, test := range getLineTests {
-		x, y := getLine([]byte(test.in))
-		if string(x) != test.out1 || string(y) != test.out2 {
-			t.Errorf("#%d got:%+v,%+v want:%s,%s", i, x, y, test.out1, test.out2)
-		}
-	}
-}
-
-func TestDecode(t *testing.T) {
-	result, remainder := Decode([]byte(pemData))
-	if !reflect.DeepEqual(result, certificate) {
-		t.Errorf("#0 got:%#v want:%#v", result, certificate)
-	}
-	result, remainder = Decode(remainder)
-	if !reflect.DeepEqual(result, privateKey) {
-		t.Errorf("#1 got:%#v want:%#v", result, privateKey)
-	}
-
-	isEmpty := func(block *Block) bool {
-		return block != nil && block.Type == "EMPTY" && len(block.Headers) == 0 && len(block.Bytes) == 0
-	}
-	result, remainder = Decode(remainder)
-	if !isEmpty(result) {
-		t.Errorf("#2 should be empty but got:%#v", result)
-	}
-	result, remainder = Decode(remainder)
-	if !isEmpty(result) {
-		t.Errorf("#3 should be empty but got:%#v", result)
-	}
-	result, remainder = Decode(remainder)
-	if !isEmpty(result) {
-		t.Errorf("#4 should be empty but got:%#v", result)
-	}
-
-	result, remainder = Decode(remainder)
-	if result == nil || result.Type != "HEADERS" || len(result.Headers) != 1 {
-		t.Errorf("#5 expected single header block but got :%v", result)
-	}
-
-	if len(remainder) != 0 {
-		t.Errorf("expected nothing remaining of pemData, but found %s", string(remainder))
-	}
-
-	result, _ = Decode([]byte(pemPrivateKey2))
-	if !reflect.DeepEqual(result, privateKey2) {
-		t.Errorf("#2 got:%#v want:%#v", result, privateKey2)
-	}
-}
-
-func TestEncode(t *testing.T) {
-	r := EncodeToMemory(privateKey2)
-	if string(r) != pemPrivateKey2 {
-		t.Errorf("got:%s want:%s", r, pemPrivateKey2)
-	}
-}
-
-type lineBreakerTest struct {
-	in, out string
-}
-
-const sixtyFourCharString = "0123456789012345678901234567890123456789012345678901234567890123"
-
-var lineBreakerTests = []lineBreakerTest{
-	{"", ""},
-	{"a", "a\n"},
-	{"ab", "ab\n"},
-	{sixtyFourCharString, sixtyFourCharString + "\n"},
-	{sixtyFourCharString + "X", sixtyFourCharString + "\nX\n"},
-	{sixtyFourCharString + sixtyFourCharString, sixtyFourCharString + "\n" + sixtyFourCharString + "\n"},
-}
-
-func TestLineBreaker(t *testing.T) {
-	for i, test := range lineBreakerTests {
-		buf := new(bytes.Buffer)
-		var breaker lineBreaker
-		breaker.out = buf
-		_, err := breaker.Write([]byte(test.in))
-		if err != nil {
-			t.Errorf("#%d: error from Write: %s", i, err)
-			continue
-		}
-		err = breaker.Close()
-		if err != nil {
-			t.Errorf("#%d: error from Close: %s", i, err)
-			continue
-		}
-
-		if string(buf.Bytes()) != test.out {
-			t.Errorf("#%d: got:%s want:%s", i, string(buf.Bytes()), test.out)
-		}
-	}
-
-	for i, test := range lineBreakerTests {
-		buf := new(bytes.Buffer)
-		var breaker lineBreaker
-		breaker.out = buf
-
-		for i := 0; i < len(test.in); i++ {
-			_, err := breaker.Write([]byte(test.in[i : i+1]))
-			if err != nil {
-				t.Errorf("#%d: error from Write (byte by byte): %s", i, err)
-				continue
-			}
-		}
-		err := breaker.Close()
-		if err != nil {
-			t.Errorf("#%d: error from Close (byte by byte): %s", i, err)
-			continue
-		}
-
-		if string(buf.Bytes()) != test.out {
-			t.Errorf("#%d: (byte by byte) got:%s want:%s", i, string(buf.Bytes()), test.out)
-		}
-	}
-}
-
-func TestFuzz(t *testing.T) {
-	testRoundtrip := func(block Block) bool {
-		for key := range block.Headers {
-			if strings.Contains(key, ":") {
-				// Keys with colons cannot be encoded.
-				return true
-			}
-		}
-
-		var buf bytes.Buffer
-		err := Encode(&buf, &block)
-		decoded, rest := Decode(buf.Bytes())
-
-		switch {
-		case err != nil:
-			t.Errorf("Encode of %#v resulted in error: %s", &block, err)
-		case !reflect.DeepEqual(&block, decoded):
-			t.Errorf("Encode of %#v decoded as %#v", &block, decoded)
-		case len(rest) != 0:
-			t.Errorf("Encode of %#v decoded correctly, but with %x left over", block, rest)
-		default:
-			return true
-		}
-		return false
-	}
-
-	// Explicitly test the empty block.
-	if !testRoundtrip(Block{
-		Type:    "EMPTY",
-		Headers: make(map[string]string),
-		Bytes:   []byte{},
-	}) {
-		return
-	}
-
-	quick.Check(testRoundtrip, nil)
-}
-
-func BenchmarkEncode(b *testing.B) {
-	data := &Block{Bytes: make([]byte, 65536)}
-	b.SetBytes(int64(len(data.Bytes)))
-	for i := 0; i < b.N; i++ {
-		Encode(ioutil.Discard, data)
-	}
-}
-
-func BenchmarkDecode(b *testing.B) {
-	block := &Block{Bytes: make([]byte, 65536)}
-	data := EncodeToMemory(block)
-	b.SetBytes(int64(len(data)))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		Decode(data)
-	}
-}
-
-var pemData = `verify return:0
------BEGIN CERTIFICATE-----
-sdlfkjskldfj
-  -----BEGIN CERTIFICATE-----
----
-Certificate chain
- 0 s:/C=AU/ST=Somewhere/L=Someplace/O=Foo Bar/CN=foo.example.com
-   i:/C=ZA/O=CA Inc./CN=CA Inc
------BEGIN CERTIFICATE-----
-testing
------BEGIN CERTIFICATE-----
------BEGIN CERTIFICATE----- 
-MIID6TCCA1ICAQEwDQYJKoZIhvcNAQEFBQAwgYsxCzAJBgNVBAYTAlVTMRMwEQYD
-VQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQK
-EwtHb29nbGUgSW5jLjEMMAoGA1UECxMDRW5nMQwwCgYDVQQDEwNhZ2wxHTAbBgkq 
-hkiG9w0BCQEWDmFnbEBnb29nbGUuY29tMB4XDTA5MDkwOTIyMDU0M1oXDTEwMDkw  
-OTIyMDU0M1owajELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAf  	  
-BgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEjMCEGA1UEAxMaZXVyb3Bh		  
-LnNmby5jb3JwLmdvb2dsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQC6pgYt7/EibBDumASF+S0qvqdL/f+nouJw2T1Qc8GmXF/iiUcrsgzh/Fd8
-pDhz/T96Qg9IyR4ztuc2MXrmPra+zAuSf5bevFReSqvpIt8Duv0HbDbcqs/XKPfB
-uMDe+of7a9GCywvAZ4ZUJcp0thqD9fKTTjUWOBzHY1uNE4RitrhmJCrbBGXbJ249
-bvgmb7jgdInH2PU7PT55hujvOoIsQW2osXBFRur4pF1wmVh4W4lTLD6pjfIMUcML
-ICHEXEN73PDic8KS3EtNYCwoIld+tpIBjE1QOb1KOyuJBNW6Esw9ALZn7stWdYcE
-qAwvv20egN2tEXqj7Q4/1ccyPZc3PQgC3FJ8Be2mtllM+80qf4dAaQ/fWvCtOrQ5
-pnfe9juQvCo8Y0VGlFcrSys/MzSg9LJ/24jZVgzQved/Qupsp89wVidwIzjt+WdS
-fyWfH0/v1aQLvu5cMYuW//C0W2nlYziL5blETntM8My2ybNARy3ICHxCBv2RNtPI
-WQVm+E9/W5rwh2IJR4DHn2LHwUVmT/hHNTdBLl5Uhwr4Wc7JhE7AVqb14pVNz1lr
-5jxsp//ncIwftb7mZQ3DF03Yna+jJhpzx8CQoeLT6aQCHyzmH68MrHHT4MALPyUs
-Pomjn71GNTtDeWAXibjCgdL6iHACCF6Htbl0zGlG0OAK+bdn0QIDAQABMA0GCSqG
-SIb3DQEBBQUAA4GBAOKnQDtqBV24vVqvesL5dnmyFpFPXBn3WdFfwD6DzEb21UVG
-5krmJiu+ViipORJPGMkgoL6BjU21XI95VQbun5P8vvg8Z+FnFsvRFY3e1CCzAVQY
-ZsUkLw2I7zI/dNlWdB8Xp7v+3w9sX5N3J/WuJ1KOO5m26kRlHQo7EzT3974g
------END CERTIFICATE-----   
- 1 s:/C=ZA/O=Ca Inc./CN=CA Inc
-
------BEGIN RSA PRIVATE KEY-----   	
-Proc-Type: 4,ENCRYPTED	  
-DEK-Info: DES-EDE3-CBC,80C7C7A09690757A  	
-  	
-eQp5ZkH6CyHBz7BZfUPxyLCCmftsBJ7HlqGb8Ld21cSwnzWZ4/SIlhyrUtsfw7VR
-2TTwA+odo9ex7GdxOTaH8oZFumIRoiEjHsk8U7Bhntp+ekkPP79xunnN7hb7hkhr   
-yGDQZgA7s2cQHQ71v3gwT2BACAft26jCjbM1wgNzBnJ8M0Rzn68YWqaPtdBu8qb/
-zVR5JB1mnqvTSbFsfF5yMc6o2WQ9jJCl6KypnMl+BpL+dlvdjYVK4l9lYsB1Hs3d
-+zDBbWxos818zzhS8/y6eIfiSG27cqrbhURbmgiSfDXjncK4m/pLcQ7mmBL6mFOr
-3Pj4jepzgOiFRL6MKE//h62fZvI1ErYr8VunHEykgKNhChDvb1RO6LEfqKBu+Ivw
-TB6fBhW3TCLMnVPYVoYwA+fHNTmZZm8BEonlIMfI+KktjWUg4Oia+NI6vKcPpFox
-hSnlGgCtvfEaq5/H4kHJp95eOpnFsLviw2seHNkz/LxJMRP1X428+DpYW/QD/0JU
-tJSuC/q9FUHL6RI3u/Asrv8pCb4+D7i1jW/AMIdJTtycOGsbPxQA7yHMWujHmeb1
-BTiHcL3s3KrJu1vDVrshvxfnz71KTeNnZH8UbOqT5i7fPGyXtY1XJddcbI/Q6tXf
-wHFsZc20TzSdsVLBtwksUacpbDogcEVMctnNrB8FIrB3vZEv9Q0Z1VeY7nmTpF+6
-a+z2P7acL7j6A6Pr3+q8P9CPiPC7zFonVzuVPyB8GchGR2hytyiOVpuD9+k8hcuw
-ZWAaUoVtWIQ52aKS0p19G99hhb+IVANC4akkdHV4SP8i7MVNZhfUmg==
------END RSA PRIVATE KEY-----
-
-
------BEGIN EMPTY-----
------END EMPTY-----
-
------BEGIN EMPTY-----
-
------END EMPTY-----
-
------BEGIN EMPTY-----
-
-
------END EMPTY-----
-
-# This shouldn't be recognised because of the missing newline after the
-headers.
------BEGIN HEADERS-----
-Header: 1
------END HEADERS-----
-
-# This should be valid, however.
------BEGIN HEADERS-----
-Header: 1
-
------END HEADERS-----`
-
-var certificate = &Block{Type: "CERTIFICATE",
-	Headers: map[string]string{},
-	Bytes: []uint8{0x30, 0x82, 0x3, 0xe9, 0x30, 0x82, 0x3, 0x52, 0x2, 0x1,
-		0x1, 0x30, 0xd, 0x6, 0x9, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0xd,
-		0x1, 0x1, 0x5, 0x5, 0x0, 0x30, 0x81, 0x8b, 0x31, 0xb, 0x30,
-		0x9, 0x6, 0x3, 0x55, 0x4, 0x6, 0x13, 0x2, 0x55, 0x53, 0x31,
-		0x13, 0x30, 0x11, 0x6, 0x3, 0x55, 0x4, 0x8, 0x13, 0xa, 0x43,
-		0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x31,
-		0x16, 0x30, 0x14, 0x6, 0x3, 0x55, 0x4, 0x7, 0x13, 0xd, 0x53,
-		0x61, 0x6e, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x69, 0x73,
-		0x63, 0x6f, 0x31, 0x14, 0x30, 0x12, 0x6, 0x3, 0x55, 0x4, 0xa,
-		0x13, 0xb, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x49,
-		0x6e, 0x63, 0x2e, 0x31, 0xc, 0x30, 0xa, 0x6, 0x3, 0x55, 0x4,
-		0xb, 0x13, 0x3, 0x45, 0x6e, 0x67, 0x31, 0xc, 0x30, 0xa, 0x6,
-		0x3, 0x55, 0x4, 0x3, 0x13, 0x3, 0x61, 0x67, 0x6c, 0x31, 0x1d,
-		0x30, 0x1b, 0x6, 0x9, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0xd, 0x1,
-		0x9, 0x1, 0x16, 0xe, 0x61, 0x67, 0x6c, 0x40, 0x67, 0x6f, 0x6f,
-		0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17,
-		0xd, 0x30, 0x39, 0x30, 0x39, 0x30, 0x39, 0x32, 0x32, 0x30,
-		0x35, 0x34, 0x33, 0x5a, 0x17, 0xd, 0x31, 0x30, 0x30, 0x39,
-		0x30, 0x39, 0x32, 0x32, 0x30, 0x35, 0x34, 0x33, 0x5a, 0x30,
-		0x6a, 0x31, 0xb, 0x30, 0x9, 0x6, 0x3, 0x55, 0x4, 0x6, 0x13,
-		0x2, 0x41, 0x55, 0x31, 0x13, 0x30, 0x11, 0x6, 0x3, 0x55, 0x4,
-		0x8, 0x13, 0xa, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61,
-		0x74, 0x65, 0x31, 0x21, 0x30, 0x1f, 0x6, 0x3, 0x55, 0x4, 0xa,
-		0x13, 0x18, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
-		0x20, 0x57, 0x69, 0x64, 0x67, 0x69, 0x74, 0x73, 0x20, 0x50,
-		0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x23, 0x30, 0x21,
-		0x6, 0x3, 0x55, 0x4, 0x3, 0x13, 0x1a, 0x65, 0x75, 0x72, 0x6f,
-		0x70, 0x61, 0x2e, 0x73, 0x66, 0x6f, 0x2e, 0x63, 0x6f, 0x72,
-		0x70, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
-		0x6f, 0x6d, 0x30, 0x82, 0x2, 0x22, 0x30, 0xd, 0x6, 0x9, 0x2a,
-		0x86, 0x48, 0x86, 0xf7, 0xd, 0x1, 0x1, 0x1, 0x5, 0x0, 0x3,
-		0x82, 0x2, 0xf, 0x0, 0x30, 0x82, 0x2, 0xa, 0x2, 0x82, 0x2, 0x1,
-		0x0, 0xba, 0xa6, 0x6, 0x2d, 0xef, 0xf1, 0x22, 0x6c, 0x10, 0xee,
-		0x98, 0x4, 0x85, 0xf9, 0x2d, 0x2a, 0xbe, 0xa7, 0x4b, 0xfd,
-		0xff, 0xa7, 0xa2, 0xe2, 0x70, 0xd9, 0x3d, 0x50, 0x73, 0xc1,
-		0xa6, 0x5c, 0x5f, 0xe2, 0x89, 0x47, 0x2b, 0xb2, 0xc, 0xe1,
-		0xfc, 0x57, 0x7c, 0xa4, 0x38, 0x73, 0xfd, 0x3f, 0x7a, 0x42,
-		0xf, 0x48, 0xc9, 0x1e, 0x33, 0xb6, 0xe7, 0x36, 0x31, 0x7a,
-		0xe6, 0x3e, 0xb6, 0xbe, 0xcc, 0xb, 0x92, 0x7f, 0x96, 0xde,
-		0xbc, 0x54, 0x5e, 0x4a, 0xab, 0xe9, 0x22, 0xdf, 0x3, 0xba,
-		0xfd, 0x7, 0x6c, 0x36, 0xdc, 0xaa, 0xcf, 0xd7, 0x28, 0xf7,
-		0xc1, 0xb8, 0xc0, 0xde, 0xfa, 0x87, 0xfb, 0x6b, 0xd1, 0x82,
-		0xcb, 0xb, 0xc0, 0x67, 0x86, 0x54, 0x25, 0xca, 0x74, 0xb6,
-		0x1a, 0x83, 0xf5, 0xf2, 0x93, 0x4e, 0x35, 0x16, 0x38, 0x1c,
-		0xc7, 0x63, 0x5b, 0x8d, 0x13, 0x84, 0x62, 0xb6, 0xb8, 0x66,
-		0x24, 0x2a, 0xdb, 0x4, 0x65, 0xdb, 0x27, 0x6e, 0x3d, 0x6e,
-		0xf8, 0x26, 0x6f, 0xb8, 0xe0, 0x74, 0x89, 0xc7, 0xd8, 0xf5,
-		0x3b, 0x3d, 0x3e, 0x79, 0x86, 0xe8, 0xef, 0x3a, 0x82, 0x2c,
-		0x41, 0x6d, 0xa8, 0xb1, 0x70, 0x45, 0x46, 0xea, 0xf8, 0xa4,
-		0x5d, 0x70, 0x99, 0x58, 0x78, 0x5b, 0x89, 0x53, 0x2c, 0x3e,
-		0xa9, 0x8d, 0xf2, 0xc, 0x51, 0xc3, 0xb, 0x20, 0x21, 0xc4, 0x5c,
-		0x43, 0x7b, 0xdc, 0xf0, 0xe2, 0x73, 0xc2, 0x92, 0xdc, 0x4b,
-		0x4d, 0x60, 0x2c, 0x28, 0x22, 0x57, 0x7e, 0xb6, 0x92, 0x1,
-		0x8c, 0x4d, 0x50, 0x39, 0xbd, 0x4a, 0x3b, 0x2b, 0x89, 0x4,
-		0xd5, 0xba, 0x12, 0xcc, 0x3d, 0x0, 0xb6, 0x67, 0xee, 0xcb,
-		0x56, 0x75, 0x87, 0x4, 0xa8, 0xc, 0x2f, 0xbf, 0x6d, 0x1e, 0x80,
-		0xdd, 0xad, 0x11, 0x7a, 0xa3, 0xed, 0xe, 0x3f, 0xd5, 0xc7,
-		0x32, 0x3d, 0x97, 0x37, 0x3d, 0x8, 0x2, 0xdc, 0x52, 0x7c, 0x5,
-		0xed, 0xa6, 0xb6, 0x59, 0x4c, 0xfb, 0xcd, 0x2a, 0x7f, 0x87,
-		0x40, 0x69, 0xf, 0xdf, 0x5a, 0xf0, 0xad, 0x3a, 0xb4, 0x39,
-		0xa6, 0x77, 0xde, 0xf6, 0x3b, 0x90, 0xbc, 0x2a, 0x3c, 0x63,
-		0x45, 0x46, 0x94, 0x57, 0x2b, 0x4b, 0x2b, 0x3f, 0x33, 0x34,
-		0xa0, 0xf4, 0xb2, 0x7f, 0xdb, 0x88, 0xd9, 0x56, 0xc, 0xd0,
-		0xbd, 0xe7, 0x7f, 0x42, 0xea, 0x6c, 0xa7, 0xcf, 0x70, 0x56,
-		0x27, 0x70, 0x23, 0x38, 0xed, 0xf9, 0x67, 0x52, 0x7f, 0x25,
-		0x9f, 0x1f, 0x4f, 0xef, 0xd5, 0xa4, 0xb, 0xbe, 0xee, 0x5c,
-		0x31, 0x8b, 0x96, 0xff, 0xf0, 0xb4, 0x5b, 0x69, 0xe5, 0x63,
-		0x38, 0x8b, 0xe5, 0xb9, 0x44, 0x4e, 0x7b, 0x4c, 0xf0, 0xcc,
-		0xb6, 0xc9, 0xb3, 0x40, 0x47, 0x2d, 0xc8, 0x8, 0x7c, 0x42, 0x6,
-		0xfd, 0x91, 0x36, 0xd3, 0xc8, 0x59, 0x5, 0x66, 0xf8, 0x4f,
-		0x7f, 0x5b, 0x9a, 0xf0, 0x87, 0x62, 0x9, 0x47, 0x80, 0xc7,
-		0x9f, 0x62, 0xc7, 0xc1, 0x45, 0x66, 0x4f, 0xf8, 0x47, 0x35,
-		0x37, 0x41, 0x2e, 0x5e, 0x54, 0x87, 0xa, 0xf8, 0x59, 0xce,
-		0xc9, 0x84, 0x4e, 0xc0, 0x56, 0xa6, 0xf5, 0xe2, 0x95, 0x4d,
-		0xcf, 0x59, 0x6b, 0xe6, 0x3c, 0x6c, 0xa7, 0xff, 0xe7, 0x70,
-		0x8c, 0x1f, 0xb5, 0xbe, 0xe6, 0x65, 0xd, 0xc3, 0x17, 0x4d,
-		0xd8, 0x9d, 0xaf, 0xa3, 0x26, 0x1a, 0x73, 0xc7, 0xc0, 0x90,
-		0xa1, 0xe2, 0xd3, 0xe9, 0xa4, 0x2, 0x1f, 0x2c, 0xe6, 0x1f,
-		0xaf, 0xc, 0xac, 0x71, 0xd3, 0xe0, 0xc0, 0xb, 0x3f, 0x25, 0x2c,
-		0x3e, 0x89, 0xa3, 0x9f, 0xbd, 0x46, 0x35, 0x3b, 0x43, 0x79,
-		0x60, 0x17, 0x89, 0xb8, 0xc2, 0x81, 0xd2, 0xfa, 0x88, 0x70,
-		0x2, 0x8, 0x5e, 0x87, 0xb5, 0xb9, 0x74, 0xcc, 0x69, 0x46, 0xd0,
-		0xe0, 0xa, 0xf9, 0xb7, 0x67, 0xd1, 0x2, 0x3, 0x1, 0x0, 0x1,
-		0x30, 0xd, 0x6, 0x9, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0xd, 0x1,
-		0x1, 0x5, 0x5, 0x0, 0x3, 0x81, 0x81, 0x0, 0xe2, 0xa7, 0x40,
-		0x3b, 0x6a, 0x5, 0x5d, 0xb8, 0xbd, 0x5a, 0xaf, 0x7a, 0xc2,
-		0xf9, 0x76, 0x79, 0xb2, 0x16, 0x91, 0x4f, 0x5c, 0x19, 0xf7,
-		0x59, 0xd1, 0x5f, 0xc0, 0x3e, 0x83, 0xcc, 0x46, 0xf6, 0xd5,
-		0x45, 0x46, 0xe6, 0x4a, 0xe6, 0x26, 0x2b, 0xbe, 0x56, 0x28,
-		0xa9, 0x39, 0x12, 0x4f, 0x18, 0xc9, 0x20, 0xa0, 0xbe, 0x81,
-		0x8d, 0x4d, 0xb5, 0x5c, 0x8f, 0x79, 0x55, 0x6, 0xee, 0x9f,
-		0x93, 0xfc, 0xbe, 0xf8, 0x3c, 0x67, 0xe1, 0x67, 0x16, 0xcb,
-		0xd1, 0x15, 0x8d, 0xde, 0xd4, 0x20, 0xb3, 0x1, 0x54, 0x18,
-		0x66, 0xc5, 0x24, 0x2f, 0xd, 0x88, 0xef, 0x32, 0x3f, 0x74,
-		0xd9, 0x56, 0x74, 0x1f, 0x17, 0xa7, 0xbb, 0xfe, 0xdf, 0xf,
-		0x6c, 0x5f, 0x93, 0x77, 0x27, 0xf5, 0xae, 0x27, 0x52, 0x8e,
-		0x3b, 0x99, 0xb6, 0xea, 0x44, 0x65, 0x1d, 0xa, 0x3b, 0x13,
-		0x34, 0xf7, 0xf7, 0xbe, 0x20,
-	},
-}
-
-var privateKey = &Block{Type: "RSA PRIVATE KEY",
-	Headers: map[string]string{"DEK-Info": "DES-EDE3-CBC,80C7C7A09690757A", "Proc-Type": "4,ENCRYPTED"},
-	Bytes: []uint8{0x79, 0xa, 0x79, 0x66, 0x41, 0xfa, 0xb,
-		0x21, 0xc1, 0xcf, 0xb0, 0x59, 0x7d, 0x43, 0xf1, 0xc8, 0xb0,
-		0x82, 0x99, 0xfb, 0x6c, 0x4, 0x9e, 0xc7, 0x96, 0xa1, 0x9b,
-		0xf0, 0xb7, 0x76, 0xd5, 0xc4, 0xb0, 0x9f, 0x35, 0x99, 0xe3,
-		0xf4, 0x88, 0x96, 0x1c, 0xab, 0x52, 0xdb, 0x1f, 0xc3, 0xb5,
-		0x51, 0xd9, 0x34, 0xf0, 0x3, 0xea, 0x1d, 0xa3, 0xd7, 0xb1,
-		0xec, 0x67, 0x71, 0x39, 0x36, 0x87, 0xf2, 0x86, 0x45, 0xba,
-		0x62, 0x11, 0xa2, 0x21, 0x23, 0x1e, 0xc9, 0x3c, 0x53, 0xb0,
-		0x61, 0x9e, 0xda, 0x7e, 0x7a, 0x49, 0xf, 0x3f, 0xbf, 0x71,
-		0xba, 0x79, 0xcd, 0xee, 0x16, 0xfb, 0x86, 0x48, 0x6b, 0xc8,
-		0x60, 0xd0, 0x66, 0x0, 0x3b, 0xb3, 0x67, 0x10, 0x1d, 0xe,
-		0xf5, 0xbf, 0x78, 0x30, 0x4f, 0x60, 0x40, 0x8, 0x7, 0xed,
-		0xdb, 0xa8, 0xc2, 0x8d, 0xb3, 0x35, 0xc2, 0x3, 0x73, 0x6,
-		0x72, 0x7c, 0x33, 0x44, 0x73, 0x9f, 0xaf, 0x18, 0x5a, 0xa6,
-		0x8f, 0xb5, 0xd0, 0x6e, 0xf2, 0xa6, 0xff, 0xcd, 0x54, 0x79,
-		0x24, 0x1d, 0x66, 0x9e, 0xab, 0xd3, 0x49, 0xb1, 0x6c, 0x7c,
-		0x5e, 0x72, 0x31, 0xce, 0xa8, 0xd9, 0x64, 0x3d, 0x8c, 0x90,
-		0xa5, 0xe8, 0xac, 0xa9, 0x9c, 0xc9, 0x7e, 0x6, 0x92, 0xfe,
-		0x76, 0x5b, 0xdd, 0x8d, 0x85, 0x4a, 0xe2, 0x5f, 0x65, 0x62,
-		0xc0, 0x75, 0x1e, 0xcd, 0xdd, 0xfb, 0x30, 0xc1, 0x6d, 0x6c,
-		0x68, 0xb3, 0xcd, 0x7c, 0xcf, 0x38, 0x52, 0xf3, 0xfc, 0xba,
-		0x78, 0x87, 0xe2, 0x48, 0x6d, 0xbb, 0x72, 0xaa, 0xdb, 0x85,
-		0x44, 0x5b, 0x9a, 0x8, 0x92, 0x7c, 0x35, 0xe3, 0x9d, 0xc2,
-		0xb8, 0x9b, 0xfa, 0x4b, 0x71, 0xe, 0xe6, 0x98, 0x12, 0xfa,
-		0x98, 0x53, 0xab, 0xdc, 0xf8, 0xf8, 0x8d, 0xea, 0x73, 0x80,
-		0xe8, 0x85, 0x44, 0xbe, 0x8c, 0x28, 0x4f, 0xff, 0x87, 0xad,
-		0x9f, 0x66, 0xf2, 0x35, 0x12, 0xb6, 0x2b, 0xf1, 0x5b, 0xa7,
-		0x1c, 0x4c, 0xa4, 0x80, 0xa3, 0x61, 0xa, 0x10, 0xef, 0x6f,
-		0x54, 0x4e, 0xe8, 0xb1, 0x1f, 0xa8, 0xa0, 0x6e, 0xf8, 0x8b,
-		0xf0, 0x4c, 0x1e, 0x9f, 0x6, 0x15, 0xb7, 0x4c, 0x22, 0xcc,
-		0x9d, 0x53, 0xd8, 0x56, 0x86, 0x30, 0x3, 0xe7, 0xc7, 0x35,
-		0x39, 0x99, 0x66, 0x6f, 0x1, 0x12, 0x89, 0xe5, 0x20, 0xc7,
-		0xc8, 0xf8, 0xa9, 0x2d, 0x8d, 0x65, 0x20, 0xe0, 0xe8, 0x9a,
-		0xf8, 0xd2, 0x3a, 0xbc, 0xa7, 0xf, 0xa4, 0x5a, 0x31, 0x85,
-		0x29, 0xe5, 0x1a, 0x0, 0xad, 0xbd, 0xf1, 0x1a, 0xab, 0x9f,
-		0xc7, 0xe2, 0x41, 0xc9, 0xa7, 0xde, 0x5e, 0x3a, 0x99, 0xc5,
-		0xb0, 0xbb, 0xe2, 0xc3, 0x6b, 0x1e, 0x1c, 0xd9, 0x33, 0xfc,
-		0xbc, 0x49, 0x31, 0x13, 0xf5, 0x5f, 0x8d, 0xbc, 0xf8, 0x3a,
-		0x58, 0x5b, 0xf4, 0x3, 0xff, 0x42, 0x54, 0xb4, 0x94, 0xae,
-		0xb, 0xfa, 0xbd, 0x15, 0x41, 0xcb, 0xe9, 0x12, 0x37, 0xbb,
-		0xf0, 0x2c, 0xae, 0xff, 0x29, 0x9, 0xbe, 0x3e, 0xf, 0xb8,
-		0xb5, 0x8d, 0x6f, 0xc0, 0x30, 0x87, 0x49, 0x4e, 0xdc, 0x9c,
-		0x38, 0x6b, 0x1b, 0x3f, 0x14, 0x0, 0xef, 0x21, 0xcc, 0x5a,
-		0xe8, 0xc7, 0x99, 0xe6, 0xf5, 0x5, 0x38, 0x87, 0x70, 0xbd,
-		0xec, 0xdc, 0xaa, 0xc9, 0xbb, 0x5b, 0xc3, 0x56, 0xbb, 0x21,
-		0xbf, 0x17, 0xe7, 0xcf, 0xbd, 0x4a, 0x4d, 0xe3, 0x67, 0x64,
-		0x7f, 0x14, 0x6c, 0xea, 0x93, 0xe6, 0x2e, 0xdf, 0x3c, 0x6c,
-		0x97, 0xb5, 0x8d, 0x57, 0x25, 0xd7, 0x5c, 0x6c, 0x8f, 0xd0,
-		0xea, 0xd5, 0xdf, 0xc0, 0x71, 0x6c, 0x65, 0xcd, 0xb4, 0x4f,
-		0x34, 0x9d, 0xb1, 0x52, 0xc1, 0xb7, 0x9, 0x2c, 0x51, 0xa7,
-		0x29, 0x6c, 0x3a, 0x20, 0x70, 0x45, 0x4c, 0x72, 0xd9, 0xcd,
-		0xac, 0x1f, 0x5, 0x22, 0xb0, 0x77, 0xbd, 0x91, 0x2f, 0xf5,
-		0xd, 0x19, 0xd5, 0x57, 0x98, 0xee, 0x79, 0x93, 0xa4, 0x5f,
-		0xba, 0x6b, 0xec, 0xf6, 0x3f, 0xb6, 0x9c, 0x2f, 0xb8, 0xfa,
-		0x3, 0xa3, 0xeb, 0xdf, 0xea, 0xbc, 0x3f, 0xd0, 0x8f, 0x88,
-		0xf0, 0xbb, 0xcc, 0x5a, 0x27, 0x57, 0x3b, 0x95, 0x3f, 0x20,
-		0x7c, 0x19, 0xc8, 0x46, 0x47, 0x68, 0x72, 0xb7, 0x28, 0x8e,
-		0x56, 0x9b, 0x83, 0xf7, 0xe9, 0x3c, 0x85, 0xcb, 0xb0, 0x65,
-		0x60, 0x1a, 0x52, 0x85, 0x6d, 0x58, 0x84, 0x39, 0xd9, 0xa2,
-		0x92, 0xd2, 0x9d, 0x7d, 0x1b, 0xdf, 0x61, 0x85, 0xbf, 0x88,
-		0x54, 0x3, 0x42, 0xe1, 0xa9, 0x24, 0x74, 0x75, 0x78, 0x48,
-		0xff, 0x22, 0xec, 0xc5, 0x4d, 0x66, 0x17, 0xd4, 0x9a,
-	},
-}
-
-var privateKey2 = &Block{
-	Type: "RSA PRIVATE KEY",
-	Headers: map[string]string{
-		"Proc-Type":      "4,ENCRYPTED",
-		"DEK-Info":       "AES-128-CBC,BFCD243FEDBB40A4AA6DDAA1335473A4",
-		"Content-Domain": "RFC822",
-	},
-	Bytes: []uint8{
-		0xa8, 0x35, 0xcc, 0x2b, 0xb9, 0xcb, 0x21, 0xab, 0xc0,
-		0x9d, 0x76, 0x61, 0x0, 0xf4, 0x81, 0xad, 0x69, 0xd2,
-		0xc0, 0x42, 0x41, 0x3b, 0xe4, 0x3c, 0xaf, 0x59, 0x5e,
-		0x6d, 0x2a, 0x3c, 0x9c, 0xa1, 0xa4, 0x5e, 0x68, 0x37,
-		0xc4, 0x8c, 0x70, 0x1c, 0xa9, 0x18, 0xe6, 0xc2, 0x2b,
-		0x8a, 0x91, 0xdc, 0x2d, 0x1f, 0x8, 0x23, 0x39, 0xf1,
-		0x4b, 0x8b, 0x1b, 0x2f, 0x46, 0xb, 0xb2, 0x26, 0xba,
-		0x4f, 0x40, 0x80, 0x39, 0xc4, 0xb1, 0xcb, 0x3b, 0xb4,
-		0x65, 0x3f, 0x1b, 0xb2, 0xf7, 0x8, 0xd2, 0xc6, 0xd5,
-		0xa8, 0x9f, 0x23, 0x69, 0xb6, 0x3d, 0xf9, 0xac, 0x1c,
-		0xb3, 0x13, 0x87, 0x64, 0x4, 0x37, 0xdb, 0x40, 0xc8,
-		0x82, 0xc, 0xd0, 0xf8, 0x21, 0x7c, 0xdc, 0xbd, 0x9, 0x4,
-		0x20, 0x16, 0xb0, 0x97, 0xe2, 0x6d, 0x56, 0x1d, 0xe3,
-		0xec, 0xf0, 0xfc, 0xe2, 0x56, 0xad, 0xa4, 0x3, 0x70,
-		0x6d, 0x63, 0x3c, 0x1, 0xbe, 0x3e, 0x28, 0x38, 0x6f,
-		0xc0, 0xe6, 0xfd, 0x85, 0xd1, 0x53, 0xa8, 0x9b, 0xcb,
-		0xd4, 0x4, 0xb1, 0x73, 0xb9, 0x73, 0x32, 0xd6, 0x7a,
-		0xc6, 0x29, 0x25, 0xa5, 0xda, 0x17, 0x93, 0x7a, 0x10,
-		0xe8, 0x41, 0xfb, 0xa5, 0x17, 0x20, 0xf8, 0x4e, 0xe9,
-		0xe3, 0x8f, 0x51, 0x20, 0x13, 0xbb, 0xde, 0xb7, 0x93,
-		0xae, 0x13, 0x8a, 0xf6, 0x9, 0xf4, 0xa6, 0x41, 0xe0,
-		0x2b, 0x51, 0x1a, 0x30, 0x38, 0xd, 0xb1, 0x3b, 0x67,
-		0x87, 0x64, 0xf5, 0xca, 0x32, 0x67, 0xd1, 0xc8, 0xa5,
-		0x3d, 0x23, 0x72, 0xc4, 0x6, 0xaf, 0x8f, 0x7b, 0x26,
-		0xac, 0x3c, 0x75, 0x91, 0xa1, 0x0, 0x13, 0xc6, 0x5c,
-		0x49, 0xd5, 0x3c, 0xe7, 0xb2, 0xb2, 0x99, 0xe0, 0xd5,
-		0x25, 0xfa, 0xe2, 0x12, 0x80, 0x37, 0x85, 0xcf, 0x92,
-		0xca, 0x1b, 0x9f, 0xf3, 0x4e, 0xd8, 0x80, 0xef, 0x3c,
-		0xce, 0xcd, 0xf5, 0x90, 0x9e, 0xf9, 0xa7, 0xb2, 0xc,
-		0x49, 0x4, 0xf1, 0x9, 0x8f, 0xea, 0x63, 0xd2, 0x70,
-		0xbb, 0x86, 0xbf, 0x34, 0xab, 0xb2, 0x3, 0xb1, 0x59,
-		0x33, 0x16, 0x17, 0xb0, 0xdb, 0x77, 0x38, 0xf4, 0xb4,
-		0x94, 0xb, 0x25, 0x16, 0x7e, 0x22, 0xd4, 0xf9, 0x22,
-		0xb9, 0x78, 0xa3, 0x4, 0x84, 0x4, 0xd2, 0xda, 0x84,
-		0x2d, 0x63, 0xdd, 0xf8, 0x50, 0x6a, 0xf6, 0xe3, 0xf5,
-		0x65, 0x40, 0x7c, 0xa9,
-	},
-}
-
-var pemPrivateKey2 = `-----BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-Content-Domain: RFC822
-DEK-Info: AES-128-CBC,BFCD243FEDBB40A4AA6DDAA1335473A4
-
-qDXMK7nLIavAnXZhAPSBrWnSwEJBO+Q8r1lebSo8nKGkXmg3xIxwHKkY5sIripHc
-LR8IIznxS4sbL0YLsia6T0CAOcSxyzu0ZT8bsvcI0sbVqJ8jabY9+awcsxOHZAQ3
-20DIggzQ+CF83L0JBCAWsJfibVYd4+zw/OJWraQDcG1jPAG+Pig4b8Dm/YXRU6ib
-y9QEsXO5czLWesYpJaXaF5N6EOhB+6UXIPhO6eOPUSATu963k64TivYJ9KZB4CtR
-GjA4DbE7Z4dk9coyZ9HIpT0jcsQGr497Jqw8dZGhABPGXEnVPOeyspng1SX64hKA
-N4XPksobn/NO2IDvPM7N9ZCe+aeyDEkE8QmP6mPScLuGvzSrsgOxWTMWF7Dbdzj0
-tJQLJRZ+ItT5Irl4owSEBNLahC1j3fhQavbj9WVAfKk=
------END RSA PRIVATE KEY-----
-`
diff --git a/third_party/gofrontend/libgo/go/encoding/xml/atom_test.go b/third_party/gofrontend/libgo/go/encoding/xml/atom_test.go
deleted file mode 100644
index a712843..0000000
--- a/third_party/gofrontend/libgo/go/encoding/xml/atom_test.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package xml
-
-import "time"
-
-var atomValue = &Feed{
-	XMLName: Name{"http://www.w3.org/2005/Atom", "feed"},
-	Title:   "Example Feed",
-	Link:    []Link{{Href: "http://example.org/"}},
-	Updated: ParseTime("2003-12-13T18:30:02Z"),
-	Author:  Person{Name: "John Doe"},
-	Id:      "urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6",
-
-	Entry: []Entry{
-		{
-			Title:   "Atom-Powered Robots Run Amok",
-			Link:    []Link{{Href: "http://example.org/2003/12/13/atom03"}},
-			Id:      "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a",
-			Updated: ParseTime("2003-12-13T18:30:02Z"),
-			Summary: NewText("Some text."),
-		},
-	},
-}
-
-var atomXml = `` +
-	`<feed xmlns="http://www.w3.org/2005/Atom" updated="2003-12-13T18:30:02Z">` +
-	`<title>Example Feed</title>` +
-	`<id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>` +
-	`<link href="http://example.org/"></link>` +
-	`<author><name>John Doe</name><uri></uri><email></email></author>` +
-	`<entry>` +
-	`<title>Atom-Powered Robots Run Amok</title>` +
-	`<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>` +
-	`<link href="http://example.org/2003/12/13/atom03"></link>` +
-	`<updated>2003-12-13T18:30:02Z</updated>` +
-	`<author><name></name><uri></uri><email></email></author>` +
-	`<summary>Some text.</summary>` +
-	`</entry>` +
-	`</feed>`
-
-func ParseTime(str string) time.Time {
-	t, err := time.Parse(time.RFC3339, str)
-	if err != nil {
-		panic(err)
-	}
-	return t
-}
-
-func NewText(text string) Text {
-	return Text{
-		Body: text,
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/xml/marshal.go b/third_party/gofrontend/libgo/go/encoding/xml/marshal.go
deleted file mode 100644
index 86d1422..0000000
--- a/third_party/gofrontend/libgo/go/encoding/xml/marshal.go
+++ /dev/null
@@ -1,989 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package xml
-
-import (
-	"bufio"
-	"bytes"
-	"encoding"
-	"fmt"
-	"io"
-	"reflect"
-	"strconv"
-	"strings"
-)
-
-const (
-	// A generic XML header suitable for use with the output of Marshal.
-	// This is not automatically added to any output of this package,
-	// it is provided as a convenience.
-	Header = `<?xml version="1.0" encoding="UTF-8"?>` + "\n"
-)
-
-// Marshal returns the XML encoding of v.
-//
-// Marshal handles an array or slice by marshalling each of the elements.
-// Marshal handles a pointer by marshalling the value it points at or, if the
-// pointer is nil, by writing nothing.  Marshal handles an interface value by
-// marshalling the value it contains or, if the interface value is nil, by
-// writing nothing.  Marshal handles all other data by writing one or more XML
-// elements containing the data.
-//
-// The name for the XML elements is taken from, in order of preference:
-//     - the tag on the XMLName field, if the data is a struct
-//     - the value of the XMLName field of type xml.Name
-//     - the tag of the struct field used to obtain the data
-//     - the name of the struct field used to obtain the data
-//     - the name of the marshalled type
-//
-// The XML element for a struct contains marshalled elements for each of the
-// exported fields of the struct, with these exceptions:
-//     - the XMLName field, described above, is omitted.
-//     - a field with tag "-" is omitted.
-//     - a field with tag "name,attr" becomes an attribute with
-//       the given name in the XML element.
-//     - a field with tag ",attr" becomes an attribute with the
-//       field name in the XML element.
-//     - a field with tag ",chardata" is written as character data,
-//       not as an XML element.
-//     - a field with tag ",innerxml" is written verbatim, not subject
-//       to the usual marshalling procedure.
-//     - a field with tag ",comment" is written as an XML comment, not
-//       subject to the usual marshalling procedure. It must not contain
-//       the "--" string within it.
-//     - a field with a tag including the "omitempty" option is omitted
-//       if the field value is empty. The empty values are false, 0, any
-//       nil pointer or interface value, and any array, slice, map, or
-//       string of length zero.
-//     - an anonymous struct field is handled as if the fields of its
-//       value were part of the outer struct.
-//
-// If a field uses a tag "a>b>c", then the element c will be nested inside
-// parent elements a and b.  Fields that appear next to each other that name
-// the same parent will be enclosed in one XML element.
-//
-// See MarshalIndent for an example.
-//
-// Marshal will return an error if asked to marshal a channel, function, or map.
-func Marshal(v interface{}) ([]byte, error) {
-	var b bytes.Buffer
-	if err := NewEncoder(&b).Encode(v); err != nil {
-		return nil, err
-	}
-	return b.Bytes(), nil
-}
-
-// Marshaler is the interface implemented by objects that can marshal
-// themselves into valid XML elements.
-//
-// MarshalXML encodes the receiver as zero or more XML elements.
-// By convention, arrays or slices are typically encoded as a sequence
-// of elements, one per entry.
-// Using start as the element tag is not required, but doing so
-// will enable Unmarshal to match the XML elements to the correct
-// struct field.
-// One common implementation strategy is to construct a separate
-// value with a layout corresponding to the desired XML and then
-// to encode it using e.EncodeElement.
-// Another common strategy is to use repeated calls to e.EncodeToken
-// to generate the XML output one token at a time.
-// The sequence of encoded tokens must make up zero or more valid
-// XML elements.
-type Marshaler interface {
-	MarshalXML(e *Encoder, start StartElement) error
-}
-
-// MarshalerAttr is the interface implemented by objects that can marshal
-// themselves into valid XML attributes.
-//
-// MarshalXMLAttr returns an XML attribute with the encoded value of the receiver.
-// Using name as the attribute name is not required, but doing so
-// will enable Unmarshal to match the attribute to the correct
-// struct field.
-// If MarshalXMLAttr returns the zero attribute Attr{}, no attribute
-// will be generated in the output.
-// MarshalXMLAttr is used only for struct fields with the
-// "attr" option in the field tag.
-type MarshalerAttr interface {
-	MarshalXMLAttr(name Name) (Attr, error)
-}
-
-// MarshalIndent works like Marshal, but each XML element begins on a new
-// indented line that starts with prefix and is followed by one or more
-// copies of indent according to the nesting depth.
-func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {
-	var b bytes.Buffer
-	enc := NewEncoder(&b)
-	enc.Indent(prefix, indent)
-	if err := enc.Encode(v); err != nil {
-		return nil, err
-	}
-	return b.Bytes(), nil
-}
-
-// An Encoder writes XML data to an output stream.
-type Encoder struct {
-	p printer
-}
-
-// NewEncoder returns a new encoder that writes to w.
-func NewEncoder(w io.Writer) *Encoder {
-	e := &Encoder{printer{Writer: bufio.NewWriter(w)}}
-	e.p.encoder = e
-	return e
-}
-
-// Indent sets the encoder to generate XML in which each element
-// begins on a new indented line that starts with prefix and is followed by
-// one or more copies of indent according to the nesting depth.
-func (enc *Encoder) Indent(prefix, indent string) {
-	enc.p.prefix = prefix
-	enc.p.indent = indent
-}
-
-// Encode writes the XML encoding of v to the stream.
-//
-// See the documentation for Marshal for details about the conversion
-// of Go values to XML.
-//
-// Encode calls Flush before returning.
-func (enc *Encoder) Encode(v interface{}) error {
-	err := enc.p.marshalValue(reflect.ValueOf(v), nil, nil)
-	if err != nil {
-		return err
-	}
-	return enc.p.Flush()
-}
-
-// EncodeElement writes the XML encoding of v to the stream,
-// using start as the outermost tag in the encoding.
-//
-// See the documentation for Marshal for details about the conversion
-// of Go values to XML.
-//
-// EncodeElement calls Flush before returning.
-func (enc *Encoder) EncodeElement(v interface{}, start StartElement) error {
-	err := enc.p.marshalValue(reflect.ValueOf(v), nil, &start)
-	if err != nil {
-		return err
-	}
-	return enc.p.Flush()
-}
-
-var (
-	begComment   = []byte("<!--")
-	endComment   = []byte("-->")
-	endProcInst  = []byte("?>")
-	endDirective = []byte(">")
-)
-
-// EncodeToken writes the given XML token to the stream.
-// It returns an error if StartElement and EndElement tokens are not properly matched.
-//
-// EncodeToken does not call Flush, because usually it is part of a larger operation
-// such as Encode or EncodeElement (or a custom Marshaler's MarshalXML invoked
-// during those), and those will call Flush when finished.
-// Callers that create an Encoder and then invoke EncodeToken directly, without
-// using Encode or EncodeElement, need to call Flush when finished to ensure
-// that the XML is written to the underlying writer.
-//
-// EncodeToken allows writing a ProcInst with Target set to "xml" only as the first token
-// in the stream.
-func (enc *Encoder) EncodeToken(t Token) error {
-
-	p := &enc.p
-	switch t := t.(type) {
-	case StartElement:
-		if err := p.writeStart(&t); err != nil {
-			return err
-		}
-	case EndElement:
-		if err := p.writeEnd(t.Name); err != nil {
-			return err
-		}
-	case CharData:
-		escapeText(p, t, false)
-	case Comment:
-		if bytes.Contains(t, endComment) {
-			return fmt.Errorf("xml: EncodeToken of Comment containing --> marker")
-		}
-		p.WriteString("<!--")
-		p.Write(t)
-		p.WriteString("-->")
-		return p.cachedWriteError()
-	case ProcInst:
-		// First token to be encoded which is also a ProcInst with target of xml
-		// is the xml declaration.  The only ProcInst where target of xml is allowed.
-		if t.Target == "xml" && p.Buffered() != 0 {
-			return fmt.Errorf("xml: EncodeToken of ProcInst xml target only valid for xml declaration, first token encoded")
-		}
-		if !isNameString(t.Target) {
-			return fmt.Errorf("xml: EncodeToken of ProcInst with invalid Target")
-		}
-		if bytes.Contains(t.Inst, endProcInst) {
-			return fmt.Errorf("xml: EncodeToken of ProcInst containing ?> marker")
-		}
-		p.WriteString("<?")
-		p.WriteString(t.Target)
-		if len(t.Inst) > 0 {
-			p.WriteByte(' ')
-			p.Write(t.Inst)
-		}
-		p.WriteString("?>")
-	case Directive:
-		if !isValidDirective(t) {
-			return fmt.Errorf("xml: EncodeToken of Directive containing wrong < or > markers")
-		}
-		p.WriteString("<!")
-		p.Write(t)
-		p.WriteString(">")
-	default:
-		return fmt.Errorf("xml: EncodeToken of invalid token type")
-
-	}
-	return p.cachedWriteError()
-}
-
-// isValidDirective reports whether dir is a valid directive text,
-// meaning angle brackets are matched, ignoring comments and strings.
-func isValidDirective(dir Directive) bool {
-	var (
-		depth     int
-		inquote   uint8
-		incomment bool
-	)
-	for i, c := range dir {
-		switch {
-		case incomment:
-			if c == '>' {
-				if n := 1 + i - len(endComment); n >= 0 && bytes.Equal(dir[n:i+1], endComment) {
-					incomment = false
-				}
-			}
-			// Just ignore anything in comment
-		case inquote != 0:
-			if c == inquote {
-				inquote = 0
-			}
-			// Just ignore anything within quotes
-		case c == '\'' || c == '"':
-			inquote = c
-		case c == '<':
-			if i+len(begComment) < len(dir) && bytes.Equal(dir[i:i+len(begComment)], begComment) {
-				incomment = true
-			} else {
-				depth++
-			}
-		case c == '>':
-			if depth == 0 {
-				return false
-			}
-			depth--
-		}
-	}
-	return depth == 0 && inquote == 0 && !incomment
-}
-
-// Flush flushes any buffered XML to the underlying writer.
-// See the EncodeToken documentation for details about when it is necessary.
-func (enc *Encoder) Flush() error {
-	return enc.p.Flush()
-}
-
-type printer struct {
-	*bufio.Writer
-	encoder    *Encoder
-	seq        int
-	indent     string
-	prefix     string
-	depth      int
-	indentedIn bool
-	putNewline bool
-	attrNS     map[string]string // map prefix -> name space
-	attrPrefix map[string]string // map name space -> prefix
-	prefixes   []string
-	tags       []Name
-}
-
-// createAttrPrefix finds the name space prefix attribute to use for the given name space,
-// defining a new prefix if necessary. It returns the prefix.
-func (p *printer) createAttrPrefix(url string) string {
-	if prefix := p.attrPrefix[url]; prefix != "" {
-		return prefix
-	}
-
-	// The "http://www.w3.org/XML/1998/namespace" name space is predefined as "xml"
-	// and must be referred to that way.
-	// (The "http://www.w3.org/2000/xmlns/" name space is also predefined as "xmlns",
-	// but users should not be trying to use that one directly - that's our job.)
-	if url == xmlURL {
-		return "xml"
-	}
-
-	// Need to define a new name space.
-	if p.attrPrefix == nil {
-		p.attrPrefix = make(map[string]string)
-		p.attrNS = make(map[string]string)
-	}
-
-	// Pick a name. We try to use the final element of the path
-	// but fall back to _.
-	prefix := strings.TrimRight(url, "/")
-	if i := strings.LastIndex(prefix, "/"); i >= 0 {
-		prefix = prefix[i+1:]
-	}
-	if prefix == "" || !isName([]byte(prefix)) || strings.Contains(prefix, ":") {
-		prefix = "_"
-	}
-	if strings.HasPrefix(prefix, "xml") {
-		// xmlanything is reserved.
-		prefix = "_" + prefix
-	}
-	if p.attrNS[prefix] != "" {
-		// Name is taken. Find a better one.
-		for p.seq++; ; p.seq++ {
-			if id := prefix + "_" + strconv.Itoa(p.seq); p.attrNS[id] == "" {
-				prefix = id
-				break
-			}
-		}
-	}
-
-	p.attrPrefix[url] = prefix
-	p.attrNS[prefix] = url
-
-	p.WriteString(`xmlns:`)
-	p.WriteString(prefix)
-	p.WriteString(`="`)
-	EscapeText(p, []byte(url))
-	p.WriteString(`" `)
-
-	p.prefixes = append(p.prefixes, prefix)
-
-	return prefix
-}
-
-// deleteAttrPrefix removes an attribute name space prefix.
-func (p *printer) deleteAttrPrefix(prefix string) {
-	delete(p.attrPrefix, p.attrNS[prefix])
-	delete(p.attrNS, prefix)
-}
-
-func (p *printer) markPrefix() {
-	p.prefixes = append(p.prefixes, "")
-}
-
-func (p *printer) popPrefix() {
-	for len(p.prefixes) > 0 {
-		prefix := p.prefixes[len(p.prefixes)-1]
-		p.prefixes = p.prefixes[:len(p.prefixes)-1]
-		if prefix == "" {
-			break
-		}
-		p.deleteAttrPrefix(prefix)
-	}
-}
-
-var (
-	marshalerType     = reflect.TypeOf((*Marshaler)(nil)).Elem()
-	marshalerAttrType = reflect.TypeOf((*MarshalerAttr)(nil)).Elem()
-	textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
-)
-
-// marshalValue writes one or more XML elements representing val.
-// If val was obtained from a struct field, finfo must have its details.
-func (p *printer) marshalValue(val reflect.Value, finfo *fieldInfo, startTemplate *StartElement) error {
-	if startTemplate != nil && startTemplate.Name.Local == "" {
-		return fmt.Errorf("xml: EncodeElement of StartElement with missing name")
-	}
-
-	if !val.IsValid() {
-		return nil
-	}
-	if finfo != nil && finfo.flags&fOmitEmpty != 0 && isEmptyValue(val) {
-		return nil
-	}
-
-	// Drill into interfaces and pointers.
-	// This can turn into an infinite loop given a cyclic chain,
-	// but it matches the Go 1 behavior.
-	for val.Kind() == reflect.Interface || val.Kind() == reflect.Ptr {
-		if val.IsNil() {
-			return nil
-		}
-		val = val.Elem()
-	}
-
-	kind := val.Kind()
-	typ := val.Type()
-
-	// Check for marshaler.
-	if val.CanInterface() && typ.Implements(marshalerType) {
-		return p.marshalInterface(val.Interface().(Marshaler), defaultStart(typ, finfo, startTemplate))
-	}
-	if val.CanAddr() {
-		pv := val.Addr()
-		if pv.CanInterface() && pv.Type().Implements(marshalerType) {
-			return p.marshalInterface(pv.Interface().(Marshaler), defaultStart(pv.Type(), finfo, startTemplate))
-		}
-	}
-
-	// Check for text marshaler.
-	if val.CanInterface() && typ.Implements(textMarshalerType) {
-		return p.marshalTextInterface(val.Interface().(encoding.TextMarshaler), defaultStart(typ, finfo, startTemplate))
-	}
-	if val.CanAddr() {
-		pv := val.Addr()
-		if pv.CanInterface() && pv.Type().Implements(textMarshalerType) {
-			return p.marshalTextInterface(pv.Interface().(encoding.TextMarshaler), defaultStart(pv.Type(), finfo, startTemplate))
-		}
-	}
-
-	// Slices and arrays iterate over the elements. They do not have an enclosing tag.
-	if (kind == reflect.Slice || kind == reflect.Array) && typ.Elem().Kind() != reflect.Uint8 {
-		for i, n := 0, val.Len(); i < n; i++ {
-			if err := p.marshalValue(val.Index(i), finfo, startTemplate); err != nil {
-				return err
-			}
-		}
-		return nil
-	}
-
-	tinfo, err := getTypeInfo(typ)
-	if err != nil {
-		return err
-	}
-
-	// Create start element.
-	// Precedence for the XML element name is:
-	// 0. startTemplate
-	// 1. XMLName field in underlying struct;
-	// 2. field name/tag in the struct field; and
-	// 3. type name
-	var start StartElement
-
-	if startTemplate != nil {
-		start.Name = startTemplate.Name
-		start.Attr = append(start.Attr, startTemplate.Attr...)
-	} else if tinfo.xmlname != nil {
-		xmlname := tinfo.xmlname
-		if xmlname.name != "" {
-			start.Name.Space, start.Name.Local = xmlname.xmlns, xmlname.name
-		} else if v, ok := xmlname.value(val).Interface().(Name); ok && v.Local != "" {
-			start.Name = v
-		}
-	}
-	if start.Name.Local == "" && finfo != nil {
-		start.Name.Space, start.Name.Local = finfo.xmlns, finfo.name
-	}
-	if start.Name.Local == "" {
-		name := typ.Name()
-		if name == "" {
-			return &UnsupportedTypeError{typ}
-		}
-		start.Name.Local = name
-	}
-
-	// Attributes
-	for i := range tinfo.fields {
-		finfo := &tinfo.fields[i]
-		if finfo.flags&fAttr == 0 {
-			continue
-		}
-		fv := finfo.value(val)
-		name := Name{Space: finfo.xmlns, Local: finfo.name}
-
-		if finfo.flags&fOmitEmpty != 0 && isEmptyValue(fv) {
-			continue
-		}
-
-		if fv.Kind() == reflect.Interface && fv.IsNil() {
-			continue
-		}
-
-		if fv.CanInterface() && fv.Type().Implements(marshalerAttrType) {
-			attr, err := fv.Interface().(MarshalerAttr).MarshalXMLAttr(name)
-			if err != nil {
-				return err
-			}
-			if attr.Name.Local != "" {
-				start.Attr = append(start.Attr, attr)
-			}
-			continue
-		}
-
-		if fv.CanAddr() {
-			pv := fv.Addr()
-			if pv.CanInterface() && pv.Type().Implements(marshalerAttrType) {
-				attr, err := pv.Interface().(MarshalerAttr).MarshalXMLAttr(name)
-				if err != nil {
-					return err
-				}
-				if attr.Name.Local != "" {
-					start.Attr = append(start.Attr, attr)
-				}
-				continue
-			}
-		}
-
-		if fv.CanInterface() && fv.Type().Implements(textMarshalerType) {
-			text, err := fv.Interface().(encoding.TextMarshaler).MarshalText()
-			if err != nil {
-				return err
-			}
-			start.Attr = append(start.Attr, Attr{name, string(text)})
-			continue
-		}
-
-		if fv.CanAddr() {
-			pv := fv.Addr()
-			if pv.CanInterface() && pv.Type().Implements(textMarshalerType) {
-				text, err := pv.Interface().(encoding.TextMarshaler).MarshalText()
-				if err != nil {
-					return err
-				}
-				start.Attr = append(start.Attr, Attr{name, string(text)})
-				continue
-			}
-		}
-
-		// Dereference or skip nil pointer, interface values.
-		switch fv.Kind() {
-		case reflect.Ptr, reflect.Interface:
-			if fv.IsNil() {
-				continue
-			}
-			fv = fv.Elem()
-		}
-
-		s, b, err := p.marshalSimple(fv.Type(), fv)
-		if err != nil {
-			return err
-		}
-		if b != nil {
-			s = string(b)
-		}
-		start.Attr = append(start.Attr, Attr{name, s})
-	}
-
-	if err := p.writeStart(&start); err != nil {
-		return err
-	}
-
-	if val.Kind() == reflect.Struct {
-		err = p.marshalStruct(tinfo, val)
-	} else {
-		s, b, err1 := p.marshalSimple(typ, val)
-		if err1 != nil {
-			err = err1
-		} else if b != nil {
-			EscapeText(p, b)
-		} else {
-			p.EscapeString(s)
-		}
-	}
-	if err != nil {
-		return err
-	}
-
-	if err := p.writeEnd(start.Name); err != nil {
-		return err
-	}
-
-	return p.cachedWriteError()
-}
-
-// defaultStart returns the default start element to use,
-// given the reflect type, field info, and start template.
-func defaultStart(typ reflect.Type, finfo *fieldInfo, startTemplate *StartElement) StartElement {
-	var start StartElement
-	// Precedence for the XML element name is as above,
-	// except that we do not look inside structs for the first field.
-	if startTemplate != nil {
-		start.Name = startTemplate.Name
-		start.Attr = append(start.Attr, startTemplate.Attr...)
-	} else if finfo != nil && finfo.name != "" {
-		start.Name.Local = finfo.name
-		start.Name.Space = finfo.xmlns
-	} else if typ.Name() != "" {
-		start.Name.Local = typ.Name()
-	} else {
-		// Must be a pointer to a named type,
-		// since it has the Marshaler methods.
-		start.Name.Local = typ.Elem().Name()
-	}
-	return start
-}
-
-// marshalInterface marshals a Marshaler interface value.
-func (p *printer) marshalInterface(val Marshaler, start StartElement) error {
-	// Push a marker onto the tag stack so that MarshalXML
-	// cannot close the XML tags that it did not open.
-	p.tags = append(p.tags, Name{})
-	n := len(p.tags)
-
-	err := val.MarshalXML(p.encoder, start)
-	if err != nil {
-		return err
-	}
-
-	// Make sure MarshalXML closed all its tags. p.tags[n-1] is the mark.
-	if len(p.tags) > n {
-		return fmt.Errorf("xml: %s.MarshalXML wrote invalid XML: <%s> not closed", receiverType(val), p.tags[len(p.tags)-1].Local)
-	}
-	p.tags = p.tags[:n-1]
-	return nil
-}
-
-// marshalTextInterface marshals a TextMarshaler interface value.
-func (p *printer) marshalTextInterface(val encoding.TextMarshaler, start StartElement) error {
-	if err := p.writeStart(&start); err != nil {
-		return err
-	}
-	text, err := val.MarshalText()
-	if err != nil {
-		return err
-	}
-	EscapeText(p, text)
-	return p.writeEnd(start.Name)
-}
-
-// writeStart writes the given start element.
-func (p *printer) writeStart(start *StartElement) error {
-	if start.Name.Local == "" {
-		return fmt.Errorf("xml: start tag with no name")
-	}
-
-	p.tags = append(p.tags, start.Name)
-	p.markPrefix()
-
-	p.writeIndent(1)
-	p.WriteByte('<')
-	p.WriteString(start.Name.Local)
-
-	if start.Name.Space != "" {
-		p.WriteString(` xmlns="`)
-		p.EscapeString(start.Name.Space)
-		p.WriteByte('"')
-	}
-
-	// Attributes
-	for _, attr := range start.Attr {
-		name := attr.Name
-		if name.Local == "" {
-			continue
-		}
-		p.WriteByte(' ')
-		if name.Space != "" {
-			p.WriteString(p.createAttrPrefix(name.Space))
-			p.WriteByte(':')
-		}
-		p.WriteString(name.Local)
-		p.WriteString(`="`)
-		p.EscapeString(attr.Value)
-		p.WriteByte('"')
-	}
-	p.WriteByte('>')
-	return nil
-}
-
-func (p *printer) writeEnd(name Name) error {
-	if name.Local == "" {
-		return fmt.Errorf("xml: end tag with no name")
-	}
-	if len(p.tags) == 0 || p.tags[len(p.tags)-1].Local == "" {
-		return fmt.Errorf("xml: end tag </%s> without start tag", name.Local)
-	}
-	if top := p.tags[len(p.tags)-1]; top != name {
-		if top.Local != name.Local {
-			return fmt.Errorf("xml: end tag </%s> does not match start tag <%s>", name.Local, top.Local)
-		}
-		return fmt.Errorf("xml: end tag </%s> in namespace %s does not match start tag <%s> in namespace %s", name.Local, name.Space, top.Local, top.Space)
-	}
-	p.tags = p.tags[:len(p.tags)-1]
-
-	p.writeIndent(-1)
-	p.WriteByte('<')
-	p.WriteByte('/')
-	p.WriteString(name.Local)
-	p.WriteByte('>')
-	p.popPrefix()
-	return nil
-}
-
-func (p *printer) marshalSimple(typ reflect.Type, val reflect.Value) (string, []byte, error) {
-	switch val.Kind() {
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return strconv.FormatInt(val.Int(), 10), nil, nil
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		return strconv.FormatUint(val.Uint(), 10), nil, nil
-	case reflect.Float32, reflect.Float64:
-		return strconv.FormatFloat(val.Float(), 'g', -1, val.Type().Bits()), nil, nil
-	case reflect.String:
-		return val.String(), nil, nil
-	case reflect.Bool:
-		return strconv.FormatBool(val.Bool()), nil, nil
-	case reflect.Array:
-		if typ.Elem().Kind() != reflect.Uint8 {
-			break
-		}
-		// [...]byte
-		var bytes []byte
-		if val.CanAddr() {
-			bytes = val.Slice(0, val.Len()).Bytes()
-		} else {
-			bytes = make([]byte, val.Len())
-			reflect.Copy(reflect.ValueOf(bytes), val)
-		}
-		return "", bytes, nil
-	case reflect.Slice:
-		if typ.Elem().Kind() != reflect.Uint8 {
-			break
-		}
-		// []byte
-		return "", val.Bytes(), nil
-	}
-	return "", nil, &UnsupportedTypeError{typ}
-}
-
-var ddBytes = []byte("--")
-
-func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error {
-	s := parentStack{p: p}
-	for i := range tinfo.fields {
-		finfo := &tinfo.fields[i]
-		if finfo.flags&fAttr != 0 {
-			continue
-		}
-		vf := finfo.value(val)
-
-		// Dereference or skip nil pointer, interface values.
-		switch vf.Kind() {
-		case reflect.Ptr, reflect.Interface:
-			if !vf.IsNil() {
-				vf = vf.Elem()
-			}
-		}
-
-		switch finfo.flags & fMode {
-		case fCharData:
-			if err := s.trim(finfo.parents); err != nil {
-				return err
-			}
-			if vf.CanInterface() && vf.Type().Implements(textMarshalerType) {
-				data, err := vf.Interface().(encoding.TextMarshaler).MarshalText()
-				if err != nil {
-					return err
-				}
-				Escape(p, data)
-				continue
-			}
-			if vf.CanAddr() {
-				pv := vf.Addr()
-				if pv.CanInterface() && pv.Type().Implements(textMarshalerType) {
-					data, err := pv.Interface().(encoding.TextMarshaler).MarshalText()
-					if err != nil {
-						return err
-					}
-					Escape(p, data)
-					continue
-				}
-			}
-			var scratch [64]byte
-			switch vf.Kind() {
-			case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-				Escape(p, strconv.AppendInt(scratch[:0], vf.Int(), 10))
-			case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-				Escape(p, strconv.AppendUint(scratch[:0], vf.Uint(), 10))
-			case reflect.Float32, reflect.Float64:
-				Escape(p, strconv.AppendFloat(scratch[:0], vf.Float(), 'g', -1, vf.Type().Bits()))
-			case reflect.Bool:
-				Escape(p, strconv.AppendBool(scratch[:0], vf.Bool()))
-			case reflect.String:
-				if err := EscapeText(p, []byte(vf.String())); err != nil {
-					return err
-				}
-			case reflect.Slice:
-				if elem, ok := vf.Interface().([]byte); ok {
-					if err := EscapeText(p, elem); err != nil {
-						return err
-					}
-				}
-			}
-			continue
-
-		case fComment:
-			if err := s.trim(finfo.parents); err != nil {
-				return err
-			}
-			k := vf.Kind()
-			if !(k == reflect.String || k == reflect.Slice && vf.Type().Elem().Kind() == reflect.Uint8) {
-				return fmt.Errorf("xml: bad type for comment field of %s", val.Type())
-			}
-			if vf.Len() == 0 {
-				continue
-			}
-			p.writeIndent(0)
-			p.WriteString("<!--")
-			dashDash := false
-			dashLast := false
-			switch k {
-			case reflect.String:
-				s := vf.String()
-				dashDash = strings.Index(s, "--") >= 0
-				dashLast = s[len(s)-1] == '-'
-				if !dashDash {
-					p.WriteString(s)
-				}
-			case reflect.Slice:
-				b := vf.Bytes()
-				dashDash = bytes.Index(b, ddBytes) >= 0
-				dashLast = b[len(b)-1] == '-'
-				if !dashDash {
-					p.Write(b)
-				}
-			default:
-				panic("can't happen")
-			}
-			if dashDash {
-				return fmt.Errorf(`xml: comments must not contain "--"`)
-			}
-			if dashLast {
-				// "--->" is invalid grammar. Make it "- -->"
-				p.WriteByte(' ')
-			}
-			p.WriteString("-->")
-			continue
-
-		case fInnerXml:
-			iface := vf.Interface()
-			switch raw := iface.(type) {
-			case []byte:
-				p.Write(raw)
-				continue
-			case string:
-				p.WriteString(raw)
-				continue
-			}
-
-		case fElement, fElement | fAny:
-			if err := s.trim(finfo.parents); err != nil {
-				return err
-			}
-			if len(finfo.parents) > len(s.stack) {
-				if vf.Kind() != reflect.Ptr && vf.Kind() != reflect.Interface || !vf.IsNil() {
-					if err := s.push(finfo.parents[len(s.stack):]); err != nil {
-						return err
-					}
-				}
-			}
-		}
-		if err := p.marshalValue(vf, finfo, nil); err != nil {
-			return err
-		}
-	}
-	s.trim(nil)
-	return p.cachedWriteError()
-}
-
-// return the bufio Writer's cached write error
-func (p *printer) cachedWriteError() error {
-	_, err := p.Write(nil)
-	return err
-}
-
-func (p *printer) writeIndent(depthDelta int) {
-	if len(p.prefix) == 0 && len(p.indent) == 0 {
-		return
-	}
-	if depthDelta < 0 {
-		p.depth--
-		if p.indentedIn {
-			p.indentedIn = false
-			return
-		}
-		p.indentedIn = false
-	}
-	if p.putNewline {
-		p.WriteByte('\n')
-	} else {
-		p.putNewline = true
-	}
-	if len(p.prefix) > 0 {
-		p.WriteString(p.prefix)
-	}
-	if len(p.indent) > 0 {
-		for i := 0; i < p.depth; i++ {
-			p.WriteString(p.indent)
-		}
-	}
-	if depthDelta > 0 {
-		p.depth++
-		p.indentedIn = true
-	}
-}
-
-type parentStack struct {
-	p     *printer
-	stack []string
-}
-
-// trim updates the XML context to match the longest common prefix of the stack
-// and the given parents.  A closing tag will be written for every parent
-// popped.  Passing a zero slice or nil will close all the elements.
-func (s *parentStack) trim(parents []string) error {
-	split := 0
-	for ; split < len(parents) && split < len(s.stack); split++ {
-		if parents[split] != s.stack[split] {
-			break
-		}
-	}
-	for i := len(s.stack) - 1; i >= split; i-- {
-		if err := s.p.writeEnd(Name{Local: s.stack[i]}); err != nil {
-			return err
-		}
-	}
-	s.stack = s.stack[:split]
-	return nil
-}
-
-// push adds parent elements to the stack and writes open tags.
-func (s *parentStack) push(parents []string) error {
-	for i := 0; i < len(parents); i++ {
-		if err := s.p.writeStart(&StartElement{Name: Name{Local: parents[i]}}); err != nil {
-			return err
-		}
-	}
-	s.stack = append(s.stack, parents...)
-	return nil
-}
-
-// A MarshalXMLError is returned when Marshal encounters a type
-// that cannot be converted into XML.
-type UnsupportedTypeError struct {
-	Type reflect.Type
-}
-
-func (e *UnsupportedTypeError) Error() string {
-	return "xml: unsupported type: " + e.Type.String()
-}
-
-func isEmptyValue(v reflect.Value) bool {
-	switch v.Kind() {
-	case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
-		return v.Len() == 0
-	case reflect.Bool:
-		return !v.Bool()
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return v.Int() == 0
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		return v.Uint() == 0
-	case reflect.Float32, reflect.Float64:
-		return v.Float() == 0
-	case reflect.Interface, reflect.Ptr:
-		return v.IsNil()
-	}
-	return false
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/xml/marshal_test.go b/third_party/gofrontend/libgo/go/encoding/xml/marshal_test.go
deleted file mode 100644
index ef6c20e..0000000
--- a/third_party/gofrontend/libgo/go/encoding/xml/marshal_test.go
+++ /dev/null
@@ -1,1776 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package xml
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"reflect"
-	"strconv"
-	"strings"
-	"sync"
-	"testing"
-	"time"
-)
-
-type DriveType int
-
-const (
-	HyperDrive DriveType = iota
-	ImprobabilityDrive
-)
-
-type Passenger struct {
-	Name   []string `xml:"name"`
-	Weight float32  `xml:"weight"`
-}
-
-type Ship struct {
-	XMLName struct{} `xml:"spaceship"`
-
-	Name      string       `xml:"name,attr"`
-	Pilot     string       `xml:"pilot,attr"`
-	Drive     DriveType    `xml:"drive"`
-	Age       uint         `xml:"age"`
-	Passenger []*Passenger `xml:"passenger"`
-	secret    string
-}
-
-type NamedType string
-
-type Port struct {
-	XMLName struct{} `xml:"port"`
-	Type    string   `xml:"type,attr,omitempty"`
-	Comment string   `xml:",comment"`
-	Number  string   `xml:",chardata"`
-}
-
-type Domain struct {
-	XMLName struct{} `xml:"domain"`
-	Country string   `xml:",attr,omitempty"`
-	Name    []byte   `xml:",chardata"`
-	Comment []byte   `xml:",comment"`
-}
-
-type Book struct {
-	XMLName struct{} `xml:"book"`
-	Title   string   `xml:",chardata"`
-}
-
-type Event struct {
-	XMLName struct{} `xml:"event"`
-	Year    int      `xml:",chardata"`
-}
-
-type Movie struct {
-	XMLName struct{} `xml:"movie"`
-	Length  uint     `xml:",chardata"`
-}
-
-type Pi struct {
-	XMLName       struct{} `xml:"pi"`
-	Approximation float32  `xml:",chardata"`
-}
-
-type Universe struct {
-	XMLName struct{} `xml:"universe"`
-	Visible float64  `xml:",chardata"`
-}
-
-type Particle struct {
-	XMLName struct{} `xml:"particle"`
-	HasMass bool     `xml:",chardata"`
-}
-
-type Departure struct {
-	XMLName struct{}  `xml:"departure"`
-	When    time.Time `xml:",chardata"`
-}
-
-type SecretAgent struct {
-	XMLName   struct{} `xml:"agent"`
-	Handle    string   `xml:"handle,attr"`
-	Identity  string
-	Obfuscate string `xml:",innerxml"`
-}
-
-type NestedItems struct {
-	XMLName struct{} `xml:"result"`
-	Items   []string `xml:">item"`
-	Item1   []string `xml:"Items>item1"`
-}
-
-type NestedOrder struct {
-	XMLName struct{} `xml:"result"`
-	Field1  string   `xml:"parent>c"`
-	Field2  string   `xml:"parent>b"`
-	Field3  string   `xml:"parent>a"`
-}
-
-type MixedNested struct {
-	XMLName struct{} `xml:"result"`
-	A       string   `xml:"parent1>a"`
-	B       string   `xml:"b"`
-	C       string   `xml:"parent1>parent2>c"`
-	D       string   `xml:"parent1>d"`
-}
-
-type NilTest struct {
-	A interface{} `xml:"parent1>parent2>a"`
-	B interface{} `xml:"parent1>b"`
-	C interface{} `xml:"parent1>parent2>c"`
-}
-
-type Service struct {
-	XMLName struct{} `xml:"service"`
-	Domain  *Domain  `xml:"host>domain"`
-	Port    *Port    `xml:"host>port"`
-	Extra1  interface{}
-	Extra2  interface{} `xml:"host>extra2"`
-}
-
-var nilStruct *Ship
-
-type EmbedA struct {
-	EmbedC
-	EmbedB EmbedB
-	FieldA string
-	embedD
-}
-
-type EmbedB struct {
-	FieldB string
-	*EmbedC
-}
-
-type EmbedC struct {
-	FieldA1 string `xml:"FieldA>A1"`
-	FieldA2 string `xml:"FieldA>A2"`
-	FieldB  string
-	FieldC  string
-}
-
-type embedD struct {
-	fieldD string
-	FieldE string // Promoted and visible when embedD is embedded.
-}
-
-type NameCasing struct {
-	XMLName struct{} `xml:"casing"`
-	Xy      string
-	XY      string
-	XyA     string `xml:"Xy,attr"`
-	XYA     string `xml:"XY,attr"`
-}
-
-type NamePrecedence struct {
-	XMLName     Name              `xml:"Parent"`
-	FromTag     XMLNameWithoutTag `xml:"InTag"`
-	FromNameVal XMLNameWithoutTag
-	FromNameTag XMLNameWithTag
-	InFieldName string
-}
-
-type XMLNameWithTag struct {
-	XMLName Name   `xml:"InXMLNameTag"`
-	Value   string `xml:",chardata"`
-}
-
-type XMLNameWithoutTag struct {
-	XMLName Name
-	Value   string `xml:",chardata"`
-}
-
-type NameInField struct {
-	Foo Name `xml:"ns foo"`
-}
-
-type AttrTest struct {
-	Int   int     `xml:",attr"`
-	Named int     `xml:"int,attr"`
-	Float float64 `xml:",attr"`
-	Uint8 uint8   `xml:",attr"`
-	Bool  bool    `xml:",attr"`
-	Str   string  `xml:",attr"`
-	Bytes []byte  `xml:",attr"`
-}
-
-type OmitAttrTest struct {
-	Int   int     `xml:",attr,omitempty"`
-	Named int     `xml:"int,attr,omitempty"`
-	Float float64 `xml:",attr,omitempty"`
-	Uint8 uint8   `xml:",attr,omitempty"`
-	Bool  bool    `xml:",attr,omitempty"`
-	Str   string  `xml:",attr,omitempty"`
-	Bytes []byte  `xml:",attr,omitempty"`
-}
-
-type OmitFieldTest struct {
-	Int   int           `xml:",omitempty"`
-	Named int           `xml:"int,omitempty"`
-	Float float64       `xml:",omitempty"`
-	Uint8 uint8         `xml:",omitempty"`
-	Bool  bool          `xml:",omitempty"`
-	Str   string        `xml:",omitempty"`
-	Bytes []byte        `xml:",omitempty"`
-	Ptr   *PresenceTest `xml:",omitempty"`
-}
-
-type AnyTest struct {
-	XMLName  struct{}  `xml:"a"`
-	Nested   string    `xml:"nested>value"`
-	AnyField AnyHolder `xml:",any"`
-}
-
-type AnyOmitTest struct {
-	XMLName  struct{}   `xml:"a"`
-	Nested   string     `xml:"nested>value"`
-	AnyField *AnyHolder `xml:",any,omitempty"`
-}
-
-type AnySliceTest struct {
-	XMLName  struct{}    `xml:"a"`
-	Nested   string      `xml:"nested>value"`
-	AnyField []AnyHolder `xml:",any"`
-}
-
-type AnyHolder struct {
-	XMLName Name
-	XML     string `xml:",innerxml"`
-}
-
-type RecurseA struct {
-	A string
-	B *RecurseB
-}
-
-type RecurseB struct {
-	A *RecurseA
-	B string
-}
-
-type PresenceTest struct {
-	Exists *struct{}
-}
-
-type IgnoreTest struct {
-	PublicSecret string `xml:"-"`
-}
-
-type MyBytes []byte
-
-type Data struct {
-	Bytes  []byte
-	Attr   []byte `xml:",attr"`
-	Custom MyBytes
-}
-
-type Plain struct {
-	V interface{}
-}
-
-type MyInt int
-
-type EmbedInt struct {
-	MyInt
-}
-
-type Strings struct {
-	X []string `xml:"A>B,omitempty"`
-}
-
-type PointerFieldsTest struct {
-	XMLName  Name    `xml:"dummy"`
-	Name     *string `xml:"name,attr"`
-	Age      *uint   `xml:"age,attr"`
-	Empty    *string `xml:"empty,attr"`
-	Contents *string `xml:",chardata"`
-}
-
-type ChardataEmptyTest struct {
-	XMLName  Name    `xml:"test"`
-	Contents *string `xml:",chardata"`
-}
-
-type MyMarshalerTest struct {
-}
-
-var _ Marshaler = (*MyMarshalerTest)(nil)
-
-func (m *MyMarshalerTest) MarshalXML(e *Encoder, start StartElement) error {
-	e.EncodeToken(start)
-	e.EncodeToken(CharData([]byte("hello world")))
-	e.EncodeToken(EndElement{start.Name})
-	return nil
-}
-
-type MyMarshalerAttrTest struct {
-}
-
-var _ MarshalerAttr = (*MyMarshalerAttrTest)(nil)
-
-func (m *MyMarshalerAttrTest) MarshalXMLAttr(name Name) (Attr, error) {
-	return Attr{name, "hello world"}, nil
-}
-
-type MarshalerStruct struct {
-	Foo MyMarshalerAttrTest `xml:",attr"`
-}
-
-type InnerStruct struct {
-	XMLName Name `xml:"testns outer"`
-}
-
-type OuterStruct struct {
-	InnerStruct
-	IntAttr int `xml:"int,attr"`
-}
-
-type OuterNamedStruct struct {
-	InnerStruct
-	XMLName Name `xml:"outerns test"`
-	IntAttr int  `xml:"int,attr"`
-}
-
-type OuterNamedOrderedStruct struct {
-	XMLName Name `xml:"outerns test"`
-	InnerStruct
-	IntAttr int `xml:"int,attr"`
-}
-
-type OuterOuterStruct struct {
-	OuterStruct
-}
-
-type NestedAndChardata struct {
-	AB       []string `xml:"A>B"`
-	Chardata string   `xml:",chardata"`
-}
-
-type NestedAndComment struct {
-	AB      []string `xml:"A>B"`
-	Comment string   `xml:",comment"`
-}
-
-func ifaceptr(x interface{}) interface{} {
-	return &x
-}
-
-var (
-	nameAttr     = "Sarah"
-	ageAttr      = uint(12)
-	contentsAttr = "lorem ipsum"
-)
-
-// Unless explicitly stated as such (or *Plain), all of the
-// tests below are two-way tests. When introducing new tests,
-// please try to make them two-way as well to ensure that
-// marshalling and unmarshalling are as symmetrical as feasible.
-var marshalTests = []struct {
-	Value         interface{}
-	ExpectXML     string
-	MarshalOnly   bool
-	UnmarshalOnly bool
-}{
-	// Test nil marshals to nothing
-	{Value: nil, ExpectXML: ``, MarshalOnly: true},
-	{Value: nilStruct, ExpectXML: ``, MarshalOnly: true},
-
-	// Test value types
-	{Value: &Plain{true}, ExpectXML: `<Plain><V>true</V></Plain>`},
-	{Value: &Plain{false}, ExpectXML: `<Plain><V>false</V></Plain>`},
-	{Value: &Plain{int(42)}, ExpectXML: `<Plain><V>42</V></Plain>`},
-	{Value: &Plain{int8(42)}, ExpectXML: `<Plain><V>42</V></Plain>`},
-	{Value: &Plain{int16(42)}, ExpectXML: `<Plain><V>42</V></Plain>`},
-	{Value: &Plain{int32(42)}, ExpectXML: `<Plain><V>42</V></Plain>`},
-	{Value: &Plain{uint(42)}, ExpectXML: `<Plain><V>42</V></Plain>`},
-	{Value: &Plain{uint8(42)}, ExpectXML: `<Plain><V>42</V></Plain>`},
-	{Value: &Plain{uint16(42)}, ExpectXML: `<Plain><V>42</V></Plain>`},
-	{Value: &Plain{uint32(42)}, ExpectXML: `<Plain><V>42</V></Plain>`},
-	{Value: &Plain{float32(1.25)}, ExpectXML: `<Plain><V>1.25</V></Plain>`},
-	{Value: &Plain{float64(1.25)}, ExpectXML: `<Plain><V>1.25</V></Plain>`},
-	{Value: &Plain{uintptr(0xFFDD)}, ExpectXML: `<Plain><V>65501</V></Plain>`},
-	{Value: &Plain{"gopher"}, ExpectXML: `<Plain><V>gopher</V></Plain>`},
-	{Value: &Plain{[]byte("gopher")}, ExpectXML: `<Plain><V>gopher</V></Plain>`},
-	{Value: &Plain{"</>"}, ExpectXML: `<Plain><V>&lt;/&gt;</V></Plain>`},
-	{Value: &Plain{[]byte("</>")}, ExpectXML: `<Plain><V>&lt;/&gt;</V></Plain>`},
-	{Value: &Plain{[3]byte{'<', '/', '>'}}, ExpectXML: `<Plain><V>&lt;/&gt;</V></Plain>`},
-	{Value: &Plain{NamedType("potato")}, ExpectXML: `<Plain><V>potato</V></Plain>`},
-	{Value: &Plain{[]int{1, 2, 3}}, ExpectXML: `<Plain><V>1</V><V>2</V><V>3</V></Plain>`},
-	{Value: &Plain{[3]int{1, 2, 3}}, ExpectXML: `<Plain><V>1</V><V>2</V><V>3</V></Plain>`},
-	{Value: ifaceptr(true), MarshalOnly: true, ExpectXML: `<bool>true</bool>`},
-
-	// Test time.
-	{
-		Value:     &Plain{time.Unix(1e9, 123456789).UTC()},
-		ExpectXML: `<Plain><V>2001-09-09T01:46:40.123456789Z</V></Plain>`,
-	},
-
-	// A pointer to struct{} may be used to test for an element's presence.
-	{
-		Value:     &PresenceTest{new(struct{})},
-		ExpectXML: `<PresenceTest><Exists></Exists></PresenceTest>`,
-	},
-	{
-		Value:     &PresenceTest{},
-		ExpectXML: `<PresenceTest></PresenceTest>`,
-	},
-
-	// A pointer to struct{} may be used to test for an element's presence.
-	{
-		Value:     &PresenceTest{new(struct{})},
-		ExpectXML: `<PresenceTest><Exists></Exists></PresenceTest>`,
-	},
-	{
-		Value:     &PresenceTest{},
-		ExpectXML: `<PresenceTest></PresenceTest>`,
-	},
-
-	// A []byte field is only nil if the element was not found.
-	{
-		Value:         &Data{},
-		ExpectXML:     `<Data></Data>`,
-		UnmarshalOnly: true,
-	},
-	{
-		Value:         &Data{Bytes: []byte{}, Custom: MyBytes{}, Attr: []byte{}},
-		ExpectXML:     `<Data Attr=""><Bytes></Bytes><Custom></Custom></Data>`,
-		UnmarshalOnly: true,
-	},
-
-	// Check that []byte works, including named []byte types.
-	{
-		Value:     &Data{Bytes: []byte("ab"), Custom: MyBytes("cd"), Attr: []byte{'v'}},
-		ExpectXML: `<Data Attr="v"><Bytes>ab</Bytes><Custom>cd</Custom></Data>`,
-	},
-
-	// Test innerxml
-	{
-		Value: &SecretAgent{
-			Handle:    "007",
-			Identity:  "James Bond",
-			Obfuscate: "<redacted/>",
-		},
-		ExpectXML:   `<agent handle="007"><Identity>James Bond</Identity><redacted/></agent>`,
-		MarshalOnly: true,
-	},
-	{
-		Value: &SecretAgent{
-			Handle:    "007",
-			Identity:  "James Bond",
-			Obfuscate: "<Identity>James Bond</Identity><redacted/>",
-		},
-		ExpectXML:     `<agent handle="007"><Identity>James Bond</Identity><redacted/></agent>`,
-		UnmarshalOnly: true,
-	},
-
-	// Test structs
-	{Value: &Port{Type: "ssl", Number: "443"}, ExpectXML: `<port type="ssl">443</port>`},
-	{Value: &Port{Number: "443"}, ExpectXML: `<port>443</port>`},
-	{Value: &Port{Type: "<unix>"}, ExpectXML: `<port type="&lt;unix&gt;"></port>`},
-	{Value: &Port{Number: "443", Comment: "https"}, ExpectXML: `<port><!--https-->443</port>`},
-	{Value: &Port{Number: "443", Comment: "add space-"}, ExpectXML: `<port><!--add space- -->443</port>`, MarshalOnly: true},
-	{Value: &Domain{Name: []byte("google.com&friends")}, ExpectXML: `<domain>google.com&amp;friends</domain>`},
-	{Value: &Domain{Name: []byte("google.com"), Comment: []byte(" &friends ")}, ExpectXML: `<domain>google.com<!-- &friends --></domain>`},
-	{Value: &Book{Title: "Pride & Prejudice"}, ExpectXML: `<book>Pride &amp; Prejudice</book>`},
-	{Value: &Event{Year: -3114}, ExpectXML: `<event>-3114</event>`},
-	{Value: &Movie{Length: 13440}, ExpectXML: `<movie>13440</movie>`},
-	{Value: &Pi{Approximation: 3.14159265}, ExpectXML: `<pi>3.1415927</pi>`},
-	{Value: &Universe{Visible: 9.3e13}, ExpectXML: `<universe>9.3e+13</universe>`},
-	{Value: &Particle{HasMass: true}, ExpectXML: `<particle>true</particle>`},
-	{Value: &Departure{When: ParseTime("2013-01-09T00:15:00-09:00")}, ExpectXML: `<departure>2013-01-09T00:15:00-09:00</departure>`},
-	{Value: atomValue, ExpectXML: atomXml},
-	{
-		Value: &Ship{
-			Name:  "Heart of Gold",
-			Pilot: "Computer",
-			Age:   1,
-			Drive: ImprobabilityDrive,
-			Passenger: []*Passenger{
-				{
-					Name:   []string{"Zaphod", "Beeblebrox"},
-					Weight: 7.25,
-				},
-				{
-					Name:   []string{"Trisha", "McMillen"},
-					Weight: 5.5,
-				},
-				{
-					Name:   []string{"Ford", "Prefect"},
-					Weight: 7,
-				},
-				{
-					Name:   []string{"Arthur", "Dent"},
-					Weight: 6.75,
-				},
-			},
-		},
-		ExpectXML: `<spaceship name="Heart of Gold" pilot="Computer">` +
-			`<drive>` + strconv.Itoa(int(ImprobabilityDrive)) + `</drive>` +
-			`<age>1</age>` +
-			`<passenger>` +
-			`<name>Zaphod</name>` +
-			`<name>Beeblebrox</name>` +
-			`<weight>7.25</weight>` +
-			`</passenger>` +
-			`<passenger>` +
-			`<name>Trisha</name>` +
-			`<name>McMillen</name>` +
-			`<weight>5.5</weight>` +
-			`</passenger>` +
-			`<passenger>` +
-			`<name>Ford</name>` +
-			`<name>Prefect</name>` +
-			`<weight>7</weight>` +
-			`</passenger>` +
-			`<passenger>` +
-			`<name>Arthur</name>` +
-			`<name>Dent</name>` +
-			`<weight>6.75</weight>` +
-			`</passenger>` +
-			`</spaceship>`,
-	},
-
-	// Test a>b
-	{
-		Value: &NestedItems{Items: nil, Item1: nil},
-		ExpectXML: `<result>` +
-			`<Items>` +
-			`</Items>` +
-			`</result>`,
-	},
-	{
-		Value: &NestedItems{Items: []string{}, Item1: []string{}},
-		ExpectXML: `<result>` +
-			`<Items>` +
-			`</Items>` +
-			`</result>`,
-		MarshalOnly: true,
-	},
-	{
-		Value: &NestedItems{Items: nil, Item1: []string{"A"}},
-		ExpectXML: `<result>` +
-			`<Items>` +
-			`<item1>A</item1>` +
-			`</Items>` +
-			`</result>`,
-	},
-	{
-		Value: &NestedItems{Items: []string{"A", "B"}, Item1: nil},
-		ExpectXML: `<result>` +
-			`<Items>` +
-			`<item>A</item>` +
-			`<item>B</item>` +
-			`</Items>` +
-			`</result>`,
-	},
-	{
-		Value: &NestedItems{Items: []string{"A", "B"}, Item1: []string{"C"}},
-		ExpectXML: `<result>` +
-			`<Items>` +
-			`<item>A</item>` +
-			`<item>B</item>` +
-			`<item1>C</item1>` +
-			`</Items>` +
-			`</result>`,
-	},
-	{
-		Value: &NestedOrder{Field1: "C", Field2: "B", Field3: "A"},
-		ExpectXML: `<result>` +
-			`<parent>` +
-			`<c>C</c>` +
-			`<b>B</b>` +
-			`<a>A</a>` +
-			`</parent>` +
-			`</result>`,
-	},
-	{
-		Value: &NilTest{A: "A", B: nil, C: "C"},
-		ExpectXML: `<NilTest>` +
-			`<parent1>` +
-			`<parent2><a>A</a></parent2>` +
-			`<parent2><c>C</c></parent2>` +
-			`</parent1>` +
-			`</NilTest>`,
-		MarshalOnly: true, // Uses interface{}
-	},
-	{
-		Value: &MixedNested{A: "A", B: "B", C: "C", D: "D"},
-		ExpectXML: `<result>` +
-			`<parent1><a>A</a></parent1>` +
-			`<b>B</b>` +
-			`<parent1>` +
-			`<parent2><c>C</c></parent2>` +
-			`<d>D</d>` +
-			`</parent1>` +
-			`</result>`,
-	},
-	{
-		Value:     &Service{Port: &Port{Number: "80"}},
-		ExpectXML: `<service><host><port>80</port></host></service>`,
-	},
-	{
-		Value:     &Service{},
-		ExpectXML: `<service></service>`,
-	},
-	{
-		Value: &Service{Port: &Port{Number: "80"}, Extra1: "A", Extra2: "B"},
-		ExpectXML: `<service>` +
-			`<host><port>80</port></host>` +
-			`<Extra1>A</Extra1>` +
-			`<host><extra2>B</extra2></host>` +
-			`</service>`,
-		MarshalOnly: true,
-	},
-	{
-		Value: &Service{Port: &Port{Number: "80"}, Extra2: "example"},
-		ExpectXML: `<service>` +
-			`<host><port>80</port></host>` +
-			`<host><extra2>example</extra2></host>` +
-			`</service>`,
-		MarshalOnly: true,
-	},
-	{
-		Value: &struct {
-			XMLName struct{} `xml:"space top"`
-			A       string   `xml:"x>a"`
-			B       string   `xml:"x>b"`
-			C       string   `xml:"space x>c"`
-			C1      string   `xml:"space1 x>c"`
-			D1      string   `xml:"space1 x>d"`
-		}{
-			A:  "a",
-			B:  "b",
-			C:  "c",
-			C1: "c1",
-			D1: "d1",
-		},
-		ExpectXML: `<top xmlns="space">` +
-			`<x><a>a</a><b>b</b><c xmlns="space">c</c>` +
-			`<c xmlns="space1">c1</c>` +
-			`<d xmlns="space1">d1</d>` +
-			`</x>` +
-			`</top>`,
-	},
-	{
-		Value: &struct {
-			XMLName Name
-			A       string `xml:"x>a"`
-			B       string `xml:"x>b"`
-			C       string `xml:"space x>c"`
-			C1      string `xml:"space1 x>c"`
-			D1      string `xml:"space1 x>d"`
-		}{
-			XMLName: Name{
-				Space: "space0",
-				Local: "top",
-			},
-			A:  "a",
-			B:  "b",
-			C:  "c",
-			C1: "c1",
-			D1: "d1",
-		},
-		ExpectXML: `<top xmlns="space0">` +
-			`<x><a>a</a><b>b</b>` +
-			`<c xmlns="space">c</c>` +
-			`<c xmlns="space1">c1</c>` +
-			`<d xmlns="space1">d1</d>` +
-			`</x>` +
-			`</top>`,
-	},
-	{
-		Value: &struct {
-			XMLName struct{} `xml:"top"`
-			B       string   `xml:"space x>b"`
-			B1      string   `xml:"space1 x>b"`
-		}{
-			B:  "b",
-			B1: "b1",
-		},
-		ExpectXML: `<top>` +
-			`<x><b xmlns="space">b</b>` +
-			`<b xmlns="space1">b1</b></x>` +
-			`</top>`,
-	},
-
-	// Test struct embedding
-	{
-		Value: &EmbedA{
-			EmbedC: EmbedC{
-				FieldA1: "", // Shadowed by A.A
-				FieldA2: "", // Shadowed by A.A
-				FieldB:  "A.C.B",
-				FieldC:  "A.C.C",
-			},
-			EmbedB: EmbedB{
-				FieldB: "A.B.B",
-				EmbedC: &EmbedC{
-					FieldA1: "A.B.C.A1",
-					FieldA2: "A.B.C.A2",
-					FieldB:  "", // Shadowed by A.B.B
-					FieldC:  "A.B.C.C",
-				},
-			},
-			FieldA: "A.A",
-			embedD: embedD{
-				FieldE: "A.D.E",
-			},
-		},
-		ExpectXML: `<EmbedA>` +
-			`<FieldB>A.C.B</FieldB>` +
-			`<FieldC>A.C.C</FieldC>` +
-			`<EmbedB>` +
-			`<FieldB>A.B.B</FieldB>` +
-			`<FieldA>` +
-			`<A1>A.B.C.A1</A1>` +
-			`<A2>A.B.C.A2</A2>` +
-			`</FieldA>` +
-			`<FieldC>A.B.C.C</FieldC>` +
-			`</EmbedB>` +
-			`<FieldA>A.A</FieldA>` +
-			`<FieldE>A.D.E</FieldE>` +
-			`</EmbedA>`,
-	},
-
-	// Test that name casing matters
-	{
-		Value:     &NameCasing{Xy: "mixed", XY: "upper", XyA: "mixedA", XYA: "upperA"},
-		ExpectXML: `<casing Xy="mixedA" XY="upperA"><Xy>mixed</Xy><XY>upper</XY></casing>`,
-	},
-
-	// Test the order in which the XML element name is chosen
-	{
-		Value: &NamePrecedence{
-			FromTag:     XMLNameWithoutTag{Value: "A"},
-			FromNameVal: XMLNameWithoutTag{XMLName: Name{Local: "InXMLName"}, Value: "B"},
-			FromNameTag: XMLNameWithTag{Value: "C"},
-			InFieldName: "D",
-		},
-		ExpectXML: `<Parent>` +
-			`<InTag>A</InTag>` +
-			`<InXMLName>B</InXMLName>` +
-			`<InXMLNameTag>C</InXMLNameTag>` +
-			`<InFieldName>D</InFieldName>` +
-			`</Parent>`,
-		MarshalOnly: true,
-	},
-	{
-		Value: &NamePrecedence{
-			XMLName:     Name{Local: "Parent"},
-			FromTag:     XMLNameWithoutTag{XMLName: Name{Local: "InTag"}, Value: "A"},
-			FromNameVal: XMLNameWithoutTag{XMLName: Name{Local: "FromNameVal"}, Value: "B"},
-			FromNameTag: XMLNameWithTag{XMLName: Name{Local: "InXMLNameTag"}, Value: "C"},
-			InFieldName: "D",
-		},
-		ExpectXML: `<Parent>` +
-			`<InTag>A</InTag>` +
-			`<FromNameVal>B</FromNameVal>` +
-			`<InXMLNameTag>C</InXMLNameTag>` +
-			`<InFieldName>D</InFieldName>` +
-			`</Parent>`,
-		UnmarshalOnly: true,
-	},
-
-	// xml.Name works in a plain field as well.
-	{
-		Value:     &NameInField{Name{Space: "ns", Local: "foo"}},
-		ExpectXML: `<NameInField><foo xmlns="ns"></foo></NameInField>`,
-	},
-	{
-		Value:         &NameInField{Name{Space: "ns", Local: "foo"}},
-		ExpectXML:     `<NameInField><foo xmlns="ns"><ignore></ignore></foo></NameInField>`,
-		UnmarshalOnly: true,
-	},
-
-	// Marshaling zero xml.Name uses the tag or field name.
-	{
-		Value:       &NameInField{},
-		ExpectXML:   `<NameInField><foo xmlns="ns"></foo></NameInField>`,
-		MarshalOnly: true,
-	},
-
-	// Test attributes
-	{
-		Value: &AttrTest{
-			Int:   8,
-			Named: 9,
-			Float: 23.5,
-			Uint8: 255,
-			Bool:  true,
-			Str:   "str",
-			Bytes: []byte("byt"),
-		},
-		ExpectXML: `<AttrTest Int="8" int="9" Float="23.5" Uint8="255"` +
-			` Bool="true" Str="str" Bytes="byt"></AttrTest>`,
-	},
-	{
-		Value: &AttrTest{Bytes: []byte{}},
-		ExpectXML: `<AttrTest Int="0" int="0" Float="0" Uint8="0"` +
-			` Bool="false" Str="" Bytes=""></AttrTest>`,
-	},
-	{
-		Value: &OmitAttrTest{
-			Int:   8,
-			Named: 9,
-			Float: 23.5,
-			Uint8: 255,
-			Bool:  true,
-			Str:   "str",
-			Bytes: []byte("byt"),
-		},
-		ExpectXML: `<OmitAttrTest Int="8" int="9" Float="23.5" Uint8="255"` +
-			` Bool="true" Str="str" Bytes="byt"></OmitAttrTest>`,
-	},
-	{
-		Value:     &OmitAttrTest{},
-		ExpectXML: `<OmitAttrTest></OmitAttrTest>`,
-	},
-
-	// pointer fields
-	{
-		Value:       &PointerFieldsTest{Name: &nameAttr, Age: &ageAttr, Contents: &contentsAttr},
-		ExpectXML:   `<dummy name="Sarah" age="12">lorem ipsum</dummy>`,
-		MarshalOnly: true,
-	},
-
-	// empty chardata pointer field
-	{
-		Value:       &ChardataEmptyTest{},
-		ExpectXML:   `<test></test>`,
-		MarshalOnly: true,
-	},
-
-	// omitempty on fields
-	{
-		Value: &OmitFieldTest{
-			Int:   8,
-			Named: 9,
-			Float: 23.5,
-			Uint8: 255,
-			Bool:  true,
-			Str:   "str",
-			Bytes: []byte("byt"),
-			Ptr:   &PresenceTest{},
-		},
-		ExpectXML: `<OmitFieldTest>` +
-			`<Int>8</Int>` +
-			`<int>9</int>` +
-			`<Float>23.5</Float>` +
-			`<Uint8>255</Uint8>` +
-			`<Bool>true</Bool>` +
-			`<Str>str</Str>` +
-			`<Bytes>byt</Bytes>` +
-			`<Ptr></Ptr>` +
-			`</OmitFieldTest>`,
-	},
-	{
-		Value:     &OmitFieldTest{},
-		ExpectXML: `<OmitFieldTest></OmitFieldTest>`,
-	},
-
-	// Test ",any"
-	{
-		ExpectXML: `<a><nested><value>known</value></nested><other><sub>unknown</sub></other></a>`,
-		Value: &AnyTest{
-			Nested: "known",
-			AnyField: AnyHolder{
-				XMLName: Name{Local: "other"},
-				XML:     "<sub>unknown</sub>",
-			},
-		},
-	},
-	{
-		Value: &AnyTest{Nested: "known",
-			AnyField: AnyHolder{
-				XML:     "<unknown/>",
-				XMLName: Name{Local: "AnyField"},
-			},
-		},
-		ExpectXML: `<a><nested><value>known</value></nested><AnyField><unknown/></AnyField></a>`,
-	},
-	{
-		ExpectXML: `<a><nested><value>b</value></nested></a>`,
-		Value: &AnyOmitTest{
-			Nested: "b",
-		},
-	},
-	{
-		ExpectXML: `<a><nested><value>b</value></nested><c><d>e</d></c><g xmlns="f"><h>i</h></g></a>`,
-		Value: &AnySliceTest{
-			Nested: "b",
-			AnyField: []AnyHolder{
-				{
-					XMLName: Name{Local: "c"},
-					XML:     "<d>e</d>",
-				},
-				{
-					XMLName: Name{Space: "f", Local: "g"},
-					XML:     "<h>i</h>",
-				},
-			},
-		},
-	},
-	{
-		ExpectXML: `<a><nested><value>b</value></nested></a>`,
-		Value: &AnySliceTest{
-			Nested: "b",
-		},
-	},
-
-	// Test recursive types.
-	{
-		Value: &RecurseA{
-			A: "a1",
-			B: &RecurseB{
-				A: &RecurseA{"a2", nil},
-				B: "b1",
-			},
-		},
-		ExpectXML: `<RecurseA><A>a1</A><B><A><A>a2</A></A><B>b1</B></B></RecurseA>`,
-	},
-
-	// Test ignoring fields via "-" tag
-	{
-		ExpectXML: `<IgnoreTest></IgnoreTest>`,
-		Value:     &IgnoreTest{},
-	},
-	{
-		ExpectXML:   `<IgnoreTest></IgnoreTest>`,
-		Value:       &IgnoreTest{PublicSecret: "can't tell"},
-		MarshalOnly: true,
-	},
-	{
-		ExpectXML:     `<IgnoreTest><PublicSecret>ignore me</PublicSecret></IgnoreTest>`,
-		Value:         &IgnoreTest{},
-		UnmarshalOnly: true,
-	},
-
-	// Test escaping.
-	{
-		ExpectXML: `<a><nested><value>dquote: &#34;; squote: &#39;; ampersand: &amp;; less: &lt;; greater: &gt;;</value></nested><empty></empty></a>`,
-		Value: &AnyTest{
-			Nested:   `dquote: "; squote: '; ampersand: &; less: <; greater: >;`,
-			AnyField: AnyHolder{XMLName: Name{Local: "empty"}},
-		},
-	},
-	{
-		ExpectXML: `<a><nested><value>newline: &#xA;; cr: &#xD;; tab: &#x9;;</value></nested><AnyField></AnyField></a>`,
-		Value: &AnyTest{
-			Nested:   "newline: \n; cr: \r; tab: \t;",
-			AnyField: AnyHolder{XMLName: Name{Local: "AnyField"}},
-		},
-	},
-	{
-		ExpectXML: "<a><nested><value>1\r2\r\n3\n\r4\n5</value></nested></a>",
-		Value: &AnyTest{
-			Nested: "1\n2\n3\n\n4\n5",
-		},
-		UnmarshalOnly: true,
-	},
-	{
-		ExpectXML: `<EmbedInt><MyInt>42</MyInt></EmbedInt>`,
-		Value: &EmbedInt{
-			MyInt: 42,
-		},
-	},
-	// Test omitempty with parent chain; see golang.org/issue/4168.
-	{
-		ExpectXML: `<Strings><A></A></Strings>`,
-		Value:     &Strings{},
-	},
-	// Custom marshalers.
-	{
-		ExpectXML: `<MyMarshalerTest>hello world</MyMarshalerTest>`,
-		Value:     &MyMarshalerTest{},
-	},
-	{
-		ExpectXML: `<MarshalerStruct Foo="hello world"></MarshalerStruct>`,
-		Value:     &MarshalerStruct{},
-	},
-	{
-		ExpectXML: `<outer xmlns="testns" int="10"></outer>`,
-		Value:     &OuterStruct{IntAttr: 10},
-	},
-	{
-		ExpectXML: `<test xmlns="outerns" int="10"></test>`,
-		Value:     &OuterNamedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10},
-	},
-	{
-		ExpectXML: `<test xmlns="outerns" int="10"></test>`,
-		Value:     &OuterNamedOrderedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10},
-	},
-	{
-		ExpectXML: `<outer xmlns="testns" int="10"></outer>`,
-		Value:     &OuterOuterStruct{OuterStruct{IntAttr: 10}},
-	},
-	{
-		ExpectXML: `<NestedAndChardata><A><B></B><B></B></A>test</NestedAndChardata>`,
-		Value:     &NestedAndChardata{AB: make([]string, 2), Chardata: "test"},
-	},
-	{
-		ExpectXML: `<NestedAndComment><A><B></B><B></B></A><!--test--></NestedAndComment>`,
-		Value:     &NestedAndComment{AB: make([]string, 2), Comment: "test"},
-	},
-}
-
-func TestMarshal(t *testing.T) {
-	for idx, test := range marshalTests {
-		if test.UnmarshalOnly {
-			continue
-		}
-		data, err := Marshal(test.Value)
-		if err != nil {
-			t.Errorf("#%d: marshal(%#v): %s", idx, test.Value, err)
-			continue
-		}
-		if got, want := string(data), test.ExpectXML; got != want {
-			if strings.Contains(want, "\n") {
-				t.Errorf("#%d: marshal(%#v):\nHAVE:\n%s\nWANT:\n%s", idx, test.Value, got, want)
-			} else {
-				t.Errorf("#%d: marshal(%#v):\nhave %#q\nwant %#q", idx, test.Value, got, want)
-			}
-		}
-	}
-}
-
-type AttrParent struct {
-	X string `xml:"X>Y,attr"`
-}
-
-type BadAttr struct {
-	Name []string `xml:"name,attr"`
-}
-
-var marshalErrorTests = []struct {
-	Value interface{}
-	Err   string
-	Kind  reflect.Kind
-}{
-	{
-		Value: make(chan bool),
-		Err:   "xml: unsupported type: chan bool",
-		Kind:  reflect.Chan,
-	},
-	{
-		Value: map[string]string{
-			"question": "What do you get when you multiply six by nine?",
-			"answer":   "42",
-		},
-		Err:  "xml: unsupported type: map[string]string",
-		Kind: reflect.Map,
-	},
-	{
-		Value: map[*Ship]bool{nil: false},
-		Err:   "xml: unsupported type: map[*xml.Ship]bool",
-		Kind:  reflect.Map,
-	},
-	{
-		Value: &Domain{Comment: []byte("f--bar")},
-		Err:   `xml: comments must not contain "--"`,
-	},
-	// Reject parent chain with attr, never worked; see golang.org/issue/5033.
-	{
-		Value: &AttrParent{},
-		Err:   `xml: X>Y chain not valid with attr flag`,
-	},
-	{
-		Value: BadAttr{[]string{"X", "Y"}},
-		Err:   `xml: unsupported type: []string`,
-	},
-}
-
-var marshalIndentTests = []struct {
-	Value     interface{}
-	Prefix    string
-	Indent    string
-	ExpectXML string
-}{
-	{
-		Value: &SecretAgent{
-			Handle:    "007",
-			Identity:  "James Bond",
-			Obfuscate: "<redacted/>",
-		},
-		Prefix:    "",
-		Indent:    "\t",
-		ExpectXML: fmt.Sprintf("<agent handle=\"007\">\n\t<Identity>James Bond</Identity><redacted/>\n</agent>"),
-	},
-}
-
-func TestMarshalErrors(t *testing.T) {
-	for idx, test := range marshalErrorTests {
-		data, err := Marshal(test.Value)
-		if err == nil {
-			t.Errorf("#%d: marshal(%#v) = [success] %q, want error %v", idx, test.Value, data, test.Err)
-			continue
-		}
-		if err.Error() != test.Err {
-			t.Errorf("#%d: marshal(%#v) = [error] %v, want %v", idx, test.Value, err, test.Err)
-		}
-		if test.Kind != reflect.Invalid {
-			if kind := err.(*UnsupportedTypeError).Type.Kind(); kind != test.Kind {
-				t.Errorf("#%d: marshal(%#v) = [error kind] %s, want %s", idx, test.Value, kind, test.Kind)
-			}
-		}
-	}
-}
-
-// Do invertibility testing on the various structures that we test
-func TestUnmarshal(t *testing.T) {
-	for i, test := range marshalTests {
-		if test.MarshalOnly {
-			continue
-		}
-		if _, ok := test.Value.(*Plain); ok {
-			continue
-		}
-		if test.ExpectXML == `<top>`+
-			`<x><b xmlns="space">b</b>`+
-			`<b xmlns="space1">b1</b></x>`+
-			`</top>` {
-			// TODO(rogpeppe): re-enable this test in
-			// https://go-review.googlesource.com/#/c/5910/
-			continue
-		}
-
-		vt := reflect.TypeOf(test.Value)
-		dest := reflect.New(vt.Elem()).Interface()
-		err := Unmarshal([]byte(test.ExpectXML), dest)
-
-		switch fix := dest.(type) {
-		case *Feed:
-			fix.Author.InnerXML = ""
-			for i := range fix.Entry {
-				fix.Entry[i].Author.InnerXML = ""
-			}
-		}
-
-		if err != nil {
-			t.Errorf("#%d: unexpected error: %#v", i, err)
-		} else if got, want := dest, test.Value; !reflect.DeepEqual(got, want) {
-			t.Errorf("#%d: unmarshal(%q):\nhave %#v\nwant %#v", i, test.ExpectXML, got, want)
-		}
-	}
-}
-
-func TestMarshalIndent(t *testing.T) {
-	for i, test := range marshalIndentTests {
-		data, err := MarshalIndent(test.Value, test.Prefix, test.Indent)
-		if err != nil {
-			t.Errorf("#%d: Error: %s", i, err)
-			continue
-		}
-		if got, want := string(data), test.ExpectXML; got != want {
-			t.Errorf("#%d: MarshalIndent:\nGot:%s\nWant:\n%s", i, got, want)
-		}
-	}
-}
-
-type limitedBytesWriter struct {
-	w      io.Writer
-	remain int // until writes fail
-}
-
-func (lw *limitedBytesWriter) Write(p []byte) (n int, err error) {
-	if lw.remain <= 0 {
-		println("error")
-		return 0, errors.New("write limit hit")
-	}
-	if len(p) > lw.remain {
-		p = p[:lw.remain]
-		n, _ = lw.w.Write(p)
-		lw.remain = 0
-		return n, errors.New("write limit hit")
-	}
-	n, err = lw.w.Write(p)
-	lw.remain -= n
-	return n, err
-}
-
-func TestMarshalWriteErrors(t *testing.T) {
-	var buf bytes.Buffer
-	const writeCap = 1024
-	w := &limitedBytesWriter{&buf, writeCap}
-	enc := NewEncoder(w)
-	var err error
-	var i int
-	const n = 4000
-	for i = 1; i <= n; i++ {
-		err = enc.Encode(&Passenger{
-			Name:   []string{"Alice", "Bob"},
-			Weight: 5,
-		})
-		if err != nil {
-			break
-		}
-	}
-	if err == nil {
-		t.Error("expected an error")
-	}
-	if i == n {
-		t.Errorf("expected to fail before the end")
-	}
-	if buf.Len() != writeCap {
-		t.Errorf("buf.Len() = %d; want %d", buf.Len(), writeCap)
-	}
-}
-
-func TestMarshalWriteIOErrors(t *testing.T) {
-	enc := NewEncoder(errWriter{})
-
-	expectErr := "unwritable"
-	err := enc.Encode(&Passenger{})
-	if err == nil || err.Error() != expectErr {
-		t.Errorf("EscapeTest = [error] %v, want %v", err, expectErr)
-	}
-}
-
-func TestMarshalFlush(t *testing.T) {
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-	if err := enc.EncodeToken(CharData("hello world")); err != nil {
-		t.Fatalf("enc.EncodeToken: %v", err)
-	}
-	if buf.Len() > 0 {
-		t.Fatalf("enc.EncodeToken caused actual write: %q", buf.Bytes())
-	}
-	if err := enc.Flush(); err != nil {
-		t.Fatalf("enc.Flush: %v", err)
-	}
-	if buf.String() != "hello world" {
-		t.Fatalf("after enc.Flush, buf.String() = %q, want %q", buf.String(), "hello world")
-	}
-}
-
-func BenchmarkMarshal(b *testing.B) {
-	b.ReportAllocs()
-	for i := 0; i < b.N; i++ {
-		Marshal(atomValue)
-	}
-}
-
-func BenchmarkUnmarshal(b *testing.B) {
-	b.ReportAllocs()
-	xml := []byte(atomXml)
-	for i := 0; i < b.N; i++ {
-		Unmarshal(xml, &Feed{})
-	}
-}
-
-// golang.org/issue/6556
-func TestStructPointerMarshal(t *testing.T) {
-	type A struct {
-		XMLName string `xml:"a"`
-		B       []interface{}
-	}
-	type C struct {
-		XMLName Name
-		Value   string `xml:"value"`
-	}
-
-	a := new(A)
-	a.B = append(a.B, &C{
-		XMLName: Name{Local: "c"},
-		Value:   "x",
-	})
-
-	b, err := Marshal(a)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if x := string(b); x != "<a><c><value>x</value></c></a>" {
-		t.Fatal(x)
-	}
-	var v A
-	err = Unmarshal(b, &v)
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-var encodeTokenTests = []struct {
-	desc string
-	toks []Token
-	want string
-	err  string
-}{{
-	desc: "start element with name space",
-	toks: []Token{
-		StartElement{Name{"space", "local"}, nil},
-	},
-	want: `<local xmlns="space">`,
-}, {
-	desc: "start element with no name",
-	toks: []Token{
-		StartElement{Name{"space", ""}, nil},
-	},
-	err: "xml: start tag with no name",
-}, {
-	desc: "end element with no name",
-	toks: []Token{
-		EndElement{Name{"space", ""}},
-	},
-	err: "xml: end tag with no name",
-}, {
-	desc: "char data",
-	toks: []Token{
-		CharData("foo"),
-	},
-	want: `foo`,
-}, {
-	desc: "char data with escaped chars",
-	toks: []Token{
-		CharData(" \t\n"),
-	},
-	want: " &#x9;\n",
-}, {
-	desc: "comment",
-	toks: []Token{
-		Comment("foo"),
-	},
-	want: `<!--foo-->`,
-}, {
-	desc: "comment with invalid content",
-	toks: []Token{
-		Comment("foo-->"),
-	},
-	err: "xml: EncodeToken of Comment containing --> marker",
-}, {
-	desc: "proc instruction",
-	toks: []Token{
-		ProcInst{"Target", []byte("Instruction")},
-	},
-	want: `<?Target Instruction?>`,
-}, {
-	desc: "proc instruction with empty target",
-	toks: []Token{
-		ProcInst{"", []byte("Instruction")},
-	},
-	err: "xml: EncodeToken of ProcInst with invalid Target",
-}, {
-	desc: "proc instruction with bad content",
-	toks: []Token{
-		ProcInst{"", []byte("Instruction?>")},
-	},
-	err: "xml: EncodeToken of ProcInst with invalid Target",
-}, {
-	desc: "directive",
-	toks: []Token{
-		Directive("foo"),
-	},
-	want: `<!foo>`,
-}, {
-	desc: "more complex directive",
-	toks: []Token{
-		Directive("DOCTYPE doc [ <!ELEMENT doc '>'> <!-- com>ment --> ]"),
-	},
-	want: `<!DOCTYPE doc [ <!ELEMENT doc '>'> <!-- com>ment --> ]>`,
-}, {
-	desc: "directive instruction with bad name",
-	toks: []Token{
-		Directive("foo>"),
-	},
-	err: "xml: EncodeToken of Directive containing wrong < or > markers",
-}, {
-	desc: "end tag without start tag",
-	toks: []Token{
-		EndElement{Name{"foo", "bar"}},
-	},
-	err: "xml: end tag </bar> without start tag",
-}, {
-	desc: "mismatching end tag local name",
-	toks: []Token{
-		StartElement{Name{"", "foo"}, nil},
-		EndElement{Name{"", "bar"}},
-	},
-	err:  "xml: end tag </bar> does not match start tag <foo>",
-	want: `<foo>`,
-}, {
-	desc: "mismatching end tag namespace",
-	toks: []Token{
-		StartElement{Name{"space", "foo"}, nil},
-		EndElement{Name{"another", "foo"}},
-	},
-	err:  "xml: end tag </foo> in namespace another does not match start tag <foo> in namespace space",
-	want: `<foo xmlns="space">`,
-}, {
-	desc: "start element with explicit namespace",
-	toks: []Token{
-		StartElement{Name{"space", "local"}, []Attr{
-			{Name{"xmlns", "x"}, "space"},
-			{Name{"space", "foo"}, "value"},
-		}},
-	},
-	want: `<local xmlns="space" xmlns:_xmlns="xmlns" _xmlns:x="space" xmlns:space="space" space:foo="value">`,
-}, {
-	desc: "start element with explicit namespace and colliding prefix",
-	toks: []Token{
-		StartElement{Name{"space", "local"}, []Attr{
-			{Name{"xmlns", "x"}, "space"},
-			{Name{"space", "foo"}, "value"},
-			{Name{"x", "bar"}, "other"},
-		}},
-	},
-	want: `<local xmlns="space" xmlns:_xmlns="xmlns" _xmlns:x="space" xmlns:space="space" space:foo="value" xmlns:x="x" x:bar="other">`,
-}, {
-	desc: "start element using previously defined namespace",
-	toks: []Token{
-		StartElement{Name{"", "local"}, []Attr{
-			{Name{"xmlns", "x"}, "space"},
-		}},
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{"space", "x"}, "y"},
-		}},
-	},
-	want: `<local xmlns:_xmlns="xmlns" _xmlns:x="space"><foo xmlns="space" xmlns:space="space" space:x="y">`,
-}, {
-	desc: "nested name space with same prefix",
-	toks: []Token{
-		StartElement{Name{"", "foo"}, []Attr{
-			{Name{"xmlns", "x"}, "space1"},
-		}},
-		StartElement{Name{"", "foo"}, []Attr{
-			{Name{"xmlns", "x"}, "space2"},
-		}},
-		StartElement{Name{"", "foo"}, []Attr{
-			{Name{"space1", "a"}, "space1 value"},
-			{Name{"space2", "b"}, "space2 value"},
-		}},
-		EndElement{Name{"", "foo"}},
-		EndElement{Name{"", "foo"}},
-		StartElement{Name{"", "foo"}, []Attr{
-			{Name{"space1", "a"}, "space1 value"},
-			{Name{"space2", "b"}, "space2 value"},
-		}},
-	},
-	want: `<foo xmlns:_xmlns="xmlns" _xmlns:x="space1"><foo _xmlns:x="space2"><foo xmlns:space1="space1" space1:a="space1 value" xmlns:space2="space2" space2:b="space2 value"></foo></foo><foo xmlns:space1="space1" space1:a="space1 value" xmlns:space2="space2" space2:b="space2 value">`,
-}, {
-	desc: "start element defining several prefixes for the same name space",
-	toks: []Token{
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{"xmlns", "a"}, "space"},
-			{Name{"xmlns", "b"}, "space"},
-			{Name{"space", "x"}, "value"},
-		}},
-	},
-	want: `<foo xmlns="space" xmlns:_xmlns="xmlns" _xmlns:a="space" _xmlns:b="space" xmlns:space="space" space:x="value">`,
-}, {
-	desc: "nested element redefines name space",
-	toks: []Token{
-		StartElement{Name{"", "foo"}, []Attr{
-			{Name{"xmlns", "x"}, "space"},
-		}},
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{"xmlns", "y"}, "space"},
-			{Name{"space", "a"}, "value"},
-		}},
-	},
-	want: `<foo xmlns:_xmlns="xmlns" _xmlns:x="space"><foo xmlns="space" _xmlns:y="space" xmlns:space="space" space:a="value">`,
-}, {
-	desc: "nested element creates alias for default name space",
-	toks: []Token{
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{"", "xmlns"}, "space"},
-		}},
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{"xmlns", "y"}, "space"},
-			{Name{"space", "a"}, "value"},
-		}},
-	},
-	want: `<foo xmlns="space" xmlns="space"><foo xmlns="space" xmlns:_xmlns="xmlns" _xmlns:y="space" xmlns:space="space" space:a="value">`,
-}, {
-	desc: "nested element defines default name space with existing prefix",
-	toks: []Token{
-		StartElement{Name{"", "foo"}, []Attr{
-			{Name{"xmlns", "x"}, "space"},
-		}},
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{"", "xmlns"}, "space"},
-			{Name{"space", "a"}, "value"},
-		}},
-	},
-	want: `<foo xmlns:_xmlns="xmlns" _xmlns:x="space"><foo xmlns="space" xmlns="space" xmlns:space="space" space:a="value">`,
-}, {
-	desc: "nested element uses empty attribute name space when default ns defined",
-	toks: []Token{
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{"", "xmlns"}, "space"},
-		}},
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{"", "attr"}, "value"},
-		}},
-	},
-	want: `<foo xmlns="space" xmlns="space"><foo xmlns="space" attr="value">`,
-}, {
-	desc: "redefine xmlns",
-	toks: []Token{
-		StartElement{Name{"", "foo"}, []Attr{
-			{Name{"foo", "xmlns"}, "space"},
-		}},
-	},
-	want: `<foo xmlns:foo="foo" foo:xmlns="space">`,
-}, {
-	desc: "xmlns with explicit name space #1",
-	toks: []Token{
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{"xml", "xmlns"}, "space"},
-		}},
-	},
-	want: `<foo xmlns="space" xmlns:_xml="xml" _xml:xmlns="space">`,
-}, {
-	desc: "xmlns with explicit name space #2",
-	toks: []Token{
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{xmlURL, "xmlns"}, "space"},
-		}},
-	},
-	want: `<foo xmlns="space" xml:xmlns="space">`,
-}, {
-	desc: "empty name space declaration is ignored",
-	toks: []Token{
-		StartElement{Name{"", "foo"}, []Attr{
-			{Name{"xmlns", "foo"}, ""},
-		}},
-	},
-	want: `<foo xmlns:_xmlns="xmlns" _xmlns:foo="">`,
-}, {
-	desc: "attribute with no name is ignored",
-	toks: []Token{
-		StartElement{Name{"", "foo"}, []Attr{
-			{Name{"", ""}, "value"},
-		}},
-	},
-	want: `<foo>`,
-}, {
-	desc: "namespace URL with non-valid name",
-	toks: []Token{
-		StartElement{Name{"/34", "foo"}, []Attr{
-			{Name{"/34", "x"}, "value"},
-		}},
-	},
-	want: `<foo xmlns="/34" xmlns:_="/34" _:x="value">`,
-}, {
-	desc: "nested element resets default namespace to empty",
-	toks: []Token{
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{"", "xmlns"}, "space"},
-		}},
-		StartElement{Name{"", "foo"}, []Attr{
-			{Name{"", "xmlns"}, ""},
-			{Name{"", "x"}, "value"},
-			{Name{"space", "x"}, "value"},
-		}},
-	},
-	want: `<foo xmlns="space" xmlns="space"><foo xmlns="" x="value" xmlns:space="space" space:x="value">`,
-}, {
-	desc: "nested element requires empty default name space",
-	toks: []Token{
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{"", "xmlns"}, "space"},
-		}},
-		StartElement{Name{"", "foo"}, nil},
-	},
-	want: `<foo xmlns="space" xmlns="space"><foo>`,
-}, {
-	desc: "attribute uses name space from xmlns",
-	toks: []Token{
-		StartElement{Name{"some/space", "foo"}, []Attr{
-			{Name{"", "attr"}, "value"},
-			{Name{"some/space", "other"}, "other value"},
-		}},
-	},
-	want: `<foo xmlns="some/space" attr="value" xmlns:space="some/space" space:other="other value">`,
-}, {
-	desc: "default name space should not be used by attributes",
-	toks: []Token{
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{"", "xmlns"}, "space"},
-			{Name{"xmlns", "bar"}, "space"},
-			{Name{"space", "baz"}, "foo"},
-		}},
-		StartElement{Name{"space", "baz"}, nil},
-		EndElement{Name{"space", "baz"}},
-		EndElement{Name{"space", "foo"}},
-	},
-	want: `<foo xmlns="space" xmlns="space" xmlns:_xmlns="xmlns" _xmlns:bar="space" xmlns:space="space" space:baz="foo"><baz xmlns="space"></baz></foo>`,
-}, {
-	desc: "default name space not used by attributes, not explicitly defined",
-	toks: []Token{
-		StartElement{Name{"space", "foo"}, []Attr{
-			{Name{"", "xmlns"}, "space"},
-			{Name{"space", "baz"}, "foo"},
-		}},
-		StartElement{Name{"space", "baz"}, nil},
-		EndElement{Name{"space", "baz"}},
-		EndElement{Name{"space", "foo"}},
-	},
-	want: `<foo xmlns="space" xmlns="space" xmlns:space="space" space:baz="foo"><baz xmlns="space"></baz></foo>`,
-}, {
-	desc: "impossible xmlns declaration",
-	toks: []Token{
-		StartElement{Name{"", "foo"}, []Attr{
-			{Name{"", "xmlns"}, "space"},
-		}},
-		StartElement{Name{"space", "bar"}, []Attr{
-			{Name{"space", "attr"}, "value"},
-		}},
-	},
-	want: `<foo xmlns="space"><bar xmlns="space" xmlns:space="space" space:attr="value">`,
-}}
-
-func TestEncodeToken(t *testing.T) {
-loop:
-	for i, tt := range encodeTokenTests {
-		var buf bytes.Buffer
-		enc := NewEncoder(&buf)
-		var err error
-		for j, tok := range tt.toks {
-			err = enc.EncodeToken(tok)
-			if err != nil && j < len(tt.toks)-1 {
-				t.Errorf("#%d %s token #%d: %v", i, tt.desc, j, err)
-				continue loop
-			}
-		}
-		errorf := func(f string, a ...interface{}) {
-			t.Errorf("#%d %s token #%d:%s", i, tt.desc, len(tt.toks)-1, fmt.Sprintf(f, a...))
-		}
-		switch {
-		case tt.err != "" && err == nil:
-			errorf(" expected error; got none")
-			continue
-		case tt.err == "" && err != nil:
-			errorf(" got error: %v", err)
-			continue
-		case tt.err != "" && err != nil && tt.err != err.Error():
-			errorf(" error mismatch; got %v, want %v", err, tt.err)
-			continue
-		}
-		if err := enc.Flush(); err != nil {
-			errorf(" %v", err)
-			continue
-		}
-		if got := buf.String(); got != tt.want {
-			errorf("\ngot  %v\nwant %v", got, tt.want)
-			continue
-		}
-	}
-}
-
-func TestProcInstEncodeToken(t *testing.T) {
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-
-	if err := enc.EncodeToken(ProcInst{"xml", []byte("Instruction")}); err != nil {
-		t.Fatalf("enc.EncodeToken: expected to be able to encode xml target ProcInst as first token, %s", err)
-	}
-
-	if err := enc.EncodeToken(ProcInst{"Target", []byte("Instruction")}); err != nil {
-		t.Fatalf("enc.EncodeToken: expected to be able to add non-xml target ProcInst")
-	}
-
-	if err := enc.EncodeToken(ProcInst{"xml", []byte("Instruction")}); err == nil {
-		t.Fatalf("enc.EncodeToken: expected to not be allowed to encode xml target ProcInst when not first token")
-	}
-}
-
-func TestDecodeEncode(t *testing.T) {
-	var in, out bytes.Buffer
-	in.WriteString(`<?xml version="1.0" encoding="UTF-8"?>
-<?Target Instruction?>
-<root>
-</root>	
-`)
-	dec := NewDecoder(&in)
-	enc := NewEncoder(&out)
-	for tok, err := dec.Token(); err == nil; tok, err = dec.Token() {
-		err = enc.EncodeToken(tok)
-		if err != nil {
-			t.Fatalf("enc.EncodeToken: Unable to encode token (%#v), %v", tok, err)
-		}
-	}
-}
-
-// Issue 9796. Used to fail with GORACE="halt_on_error=1" -race.
-func TestRace9796(t *testing.T) {
-	type A struct{}
-	type B struct {
-		C []A `xml:"X>Y"`
-	}
-	var wg sync.WaitGroup
-	for i := 0; i < 2; i++ {
-		wg.Add(1)
-		go func() {
-			Marshal(B{[]A{A{}}})
-			wg.Done()
-		}()
-	}
-	wg.Wait()
-}
-
-func TestIsValidDirective(t *testing.T) {
-	testOK := []string{
-		"<>",
-		"< < > >",
-		"<!DOCTYPE '<' '>' '>' <!--nothing-->>",
-		"<!DOCTYPE doc [ <!ELEMENT doc ANY> <!ELEMENT doc ANY> ]>",
-		"<!DOCTYPE doc [ <!ELEMENT doc \"ANY> '<' <!E\" LEMENT '>' doc ANY> ]>",
-		"<!DOCTYPE doc <!-- just>>>> a < comment --> [ <!ITEM anything> ] >",
-	}
-	testKO := []string{
-		"<",
-		">",
-		"<!--",
-		"-->",
-		"< > > < < >",
-		"<!dummy <!-- > -->",
-		"<!DOCTYPE doc '>",
-		"<!DOCTYPE doc '>'",
-		"<!DOCTYPE doc <!--comment>",
-	}
-	for _, s := range testOK {
-		if !isValidDirective(Directive(s)) {
-			t.Errorf("Directive %q is expected to be valid", s)
-		}
-	}
-	for _, s := range testKO {
-		if isValidDirective(Directive(s)) {
-			t.Errorf("Directive %q is expected to be invalid", s)
-		}
-	}
-}
-
-// Issue 11719. EncodeToken used to silently eat tokens with an invalid type.
-func TestSimpleUseOfEncodeToken(t *testing.T) {
-	var buf bytes.Buffer
-	enc := NewEncoder(&buf)
-	if err := enc.EncodeToken(&StartElement{Name: Name{"", "object1"}}); err == nil {
-		t.Errorf("enc.EncodeToken: pointer type should be rejected")
-	}
-	if err := enc.EncodeToken(&EndElement{Name: Name{"", "object1"}}); err == nil {
-		t.Errorf("enc.EncodeToken: pointer type should be rejected")
-	}
-	if err := enc.EncodeToken(StartElement{Name: Name{"", "object2"}}); err != nil {
-		t.Errorf("enc.EncodeToken: StartElement %s", err)
-	}
-	if err := enc.EncodeToken(EndElement{Name: Name{"", "object2"}}); err != nil {
-		t.Errorf("enc.EncodeToken: EndElement %s", err)
-	}
-	if err := enc.EncodeToken(Universe{}); err == nil {
-		t.Errorf("enc.EncodeToken: invalid type not caught")
-	}
-	if err := enc.Flush(); err != nil {
-		t.Errorf("enc.Flush: %s", err)
-	}
-	if buf.Len() == 0 {
-		t.Errorf("enc.EncodeToken: empty buffer")
-	}
-	want := "<object2></object2>"
-	if buf.String() != want {
-		t.Errorf("enc.EncodeToken: expected %q; got %q", want, buf.String())
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/xml/read.go b/third_party/gofrontend/libgo/go/encoding/xml/read.go
deleted file mode 100644
index 75b9f2b..0000000
--- a/third_party/gofrontend/libgo/go/encoding/xml/read.go
+++ /dev/null
@@ -1,692 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package xml
-
-import (
-	"bytes"
-	"encoding"
-	"errors"
-	"fmt"
-	"reflect"
-	"strconv"
-	"strings"
-)
-
-// BUG(rsc): Mapping between XML elements and data structures is inherently flawed:
-// an XML element is an order-dependent collection of anonymous
-// values, while a data structure is an order-independent collection
-// of named values.
-// See package json for a textual representation more suitable
-// to data structures.
-
-// Unmarshal parses the XML-encoded data and stores the result in
-// the value pointed to by v, which must be an arbitrary struct,
-// slice, or string. Well-formed data that does not fit into v is
-// discarded.
-//
-// Because Unmarshal uses the reflect package, it can only assign
-// to exported (upper case) fields.  Unmarshal uses a case-sensitive
-// comparison to match XML element names to tag values and struct
-// field names.
-//
-// Unmarshal maps an XML element to a struct using the following rules.
-// In the rules, the tag of a field refers to the value associated with the
-// key 'xml' in the struct field's tag (see the example above).
-//
-//   * If the struct has a field of type []byte or string with tag
-//      ",innerxml", Unmarshal accumulates the raw XML nested inside the
-//      element in that field.  The rest of the rules still apply.
-//
-//   * If the struct has a field named XMLName of type xml.Name,
-//      Unmarshal records the element name in that field.
-//
-//   * If the XMLName field has an associated tag of the form
-//      "name" or "namespace-URL name", the XML element must have
-//      the given name (and, optionally, name space) or else Unmarshal
-//      returns an error.
-//
-//   * If the XML element has an attribute whose name matches a
-//      struct field name with an associated tag containing ",attr" or
-//      the explicit name in a struct field tag of the form "name,attr",
-//      Unmarshal records the attribute value in that field.
-//
-//   * If the XML element contains character data, that data is
-//      accumulated in the first struct field that has tag ",chardata".
-//      The struct field may have type []byte or string.
-//      If there is no such field, the character data is discarded.
-//
-//   * If the XML element contains comments, they are accumulated in
-//      the first struct field that has tag ",comment".  The struct
-//      field may have type []byte or string.  If there is no such
-//      field, the comments are discarded.
-//
-//   * If the XML element contains a sub-element whose name matches
-//      the prefix of a tag formatted as "a" or "a>b>c", unmarshal
-//      will descend into the XML structure looking for elements with the
-//      given names, and will map the innermost elements to that struct
-//      field. A tag starting with ">" is equivalent to one starting
-//      with the field name followed by ">".
-//
-//   * If the XML element contains a sub-element whose name matches
-//      a struct field's XMLName tag and the struct field has no
-//      explicit name tag as per the previous rule, unmarshal maps
-//      the sub-element to that struct field.
-//
-//   * If the XML element contains a sub-element whose name matches a
-//      field without any mode flags (",attr", ",chardata", etc), Unmarshal
-//      maps the sub-element to that struct field.
-//
-//   * If the XML element contains a sub-element that hasn't matched any
-//      of the above rules and the struct has a field with tag ",any",
-//      unmarshal maps the sub-element to that struct field.
-//
-//   * An anonymous struct field is handled as if the fields of its
-//      value were part of the outer struct.
-//
-//   * A struct field with tag "-" is never unmarshalled into.
-//
-// Unmarshal maps an XML element to a string or []byte by saving the
-// concatenation of that element's character data in the string or
-// []byte. The saved []byte is never nil.
-//
-// Unmarshal maps an attribute value to a string or []byte by saving
-// the value in the string or slice.
-//
-// Unmarshal maps an XML element to a slice by extending the length of
-// the slice and mapping the element to the newly created value.
-//
-// Unmarshal maps an XML element or attribute value to a bool by
-// setting it to the boolean value represented by the string.
-//
-// Unmarshal maps an XML element or attribute value to an integer or
-// floating-point field by setting the field to the result of
-// interpreting the string value in decimal.  There is no check for
-// overflow.
-//
-// Unmarshal maps an XML element to an xml.Name by recording the
-// element name.
-//
-// Unmarshal maps an XML element to a pointer by setting the pointer
-// to a freshly allocated value and then mapping the element to that value.
-//
-func Unmarshal(data []byte, v interface{}) error {
-	return NewDecoder(bytes.NewReader(data)).Decode(v)
-}
-
-// Decode works like xml.Unmarshal, except it reads the decoder
-// stream to find the start element.
-func (d *Decoder) Decode(v interface{}) error {
-	return d.DecodeElement(v, nil)
-}
-
-// DecodeElement works like xml.Unmarshal except that it takes
-// a pointer to the start XML element to decode into v.
-// It is useful when a client reads some raw XML tokens itself
-// but also wants to defer to Unmarshal for some elements.
-func (d *Decoder) DecodeElement(v interface{}, start *StartElement) error {
-	val := reflect.ValueOf(v)
-	if val.Kind() != reflect.Ptr {
-		return errors.New("non-pointer passed to Unmarshal")
-	}
-	return d.unmarshal(val.Elem(), start)
-}
-
-// An UnmarshalError represents an error in the unmarshalling process.
-type UnmarshalError string
-
-func (e UnmarshalError) Error() string { return string(e) }
-
-// Unmarshaler is the interface implemented by objects that can unmarshal
-// an XML element description of themselves.
-//
-// UnmarshalXML decodes a single XML element
-// beginning with the given start element.
-// If it returns an error, the outer call to Unmarshal stops and
-// returns that error.
-// UnmarshalXML must consume exactly one XML element.
-// One common implementation strategy is to unmarshal into
-// a separate value with a layout matching the expected XML
-// using d.DecodeElement,  and then to copy the data from
-// that value into the receiver.
-// Another common strategy is to use d.Token to process the
-// XML object one token at a time.
-// UnmarshalXML may not use d.RawToken.
-type Unmarshaler interface {
-	UnmarshalXML(d *Decoder, start StartElement) error
-}
-
-// UnmarshalerAttr is the interface implemented by objects that can unmarshal
-// an XML attribute description of themselves.
-//
-// UnmarshalXMLAttr decodes a single XML attribute.
-// If it returns an error, the outer call to Unmarshal stops and
-// returns that error.
-// UnmarshalXMLAttr is used only for struct fields with the
-// "attr" option in the field tag.
-type UnmarshalerAttr interface {
-	UnmarshalXMLAttr(attr Attr) error
-}
-
-// receiverType returns the receiver type to use in an expression like "%s.MethodName".
-func receiverType(val interface{}) string {
-	t := reflect.TypeOf(val)
-	if t.Name() != "" {
-		return t.String()
-	}
-	return "(" + t.String() + ")"
-}
-
-// unmarshalInterface unmarshals a single XML element into val.
-// start is the opening tag of the element.
-func (p *Decoder) unmarshalInterface(val Unmarshaler, start *StartElement) error {
-	// Record that decoder must stop at end tag corresponding to start.
-	p.pushEOF()
-
-	p.unmarshalDepth++
-	err := val.UnmarshalXML(p, *start)
-	p.unmarshalDepth--
-	if err != nil {
-		p.popEOF()
-		return err
-	}
-
-	if !p.popEOF() {
-		return fmt.Errorf("xml: %s.UnmarshalXML did not consume entire <%s> element", receiverType(val), start.Name.Local)
-	}
-
-	return nil
-}
-
-// unmarshalTextInterface unmarshals a single XML element into val.
-// The chardata contained in the element (but not its children)
-// is passed to the text unmarshaler.
-func (p *Decoder) unmarshalTextInterface(val encoding.TextUnmarshaler, start *StartElement) error {
-	var buf []byte
-	depth := 1
-	for depth > 0 {
-		t, err := p.Token()
-		if err != nil {
-			return err
-		}
-		switch t := t.(type) {
-		case CharData:
-			if depth == 1 {
-				buf = append(buf, t...)
-			}
-		case StartElement:
-			depth++
-		case EndElement:
-			depth--
-		}
-	}
-	return val.UnmarshalText(buf)
-}
-
-// unmarshalAttr unmarshals a single XML attribute into val.
-func (p *Decoder) unmarshalAttr(val reflect.Value, attr Attr) error {
-	if val.Kind() == reflect.Ptr {
-		if val.IsNil() {
-			val.Set(reflect.New(val.Type().Elem()))
-		}
-		val = val.Elem()
-	}
-
-	if val.CanInterface() && val.Type().Implements(unmarshalerAttrType) {
-		// This is an unmarshaler with a non-pointer receiver,
-		// so it's likely to be incorrect, but we do what we're told.
-		return val.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr)
-	}
-	if val.CanAddr() {
-		pv := val.Addr()
-		if pv.CanInterface() && pv.Type().Implements(unmarshalerAttrType) {
-			return pv.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr)
-		}
-	}
-
-	// Not an UnmarshalerAttr; try encoding.TextUnmarshaler.
-	if val.CanInterface() && val.Type().Implements(textUnmarshalerType) {
-		// This is an unmarshaler with a non-pointer receiver,
-		// so it's likely to be incorrect, but we do what we're told.
-		return val.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value))
-	}
-	if val.CanAddr() {
-		pv := val.Addr()
-		if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) {
-			return pv.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value))
-		}
-	}
-
-	copyValue(val, []byte(attr.Value))
-	return nil
-}
-
-var (
-	unmarshalerType     = reflect.TypeOf((*Unmarshaler)(nil)).Elem()
-	unmarshalerAttrType = reflect.TypeOf((*UnmarshalerAttr)(nil)).Elem()
-	textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
-)
-
-// Unmarshal a single XML element into val.
-func (p *Decoder) unmarshal(val reflect.Value, start *StartElement) error {
-	// Find start element if we need it.
-	if start == nil {
-		for {
-			tok, err := p.Token()
-			if err != nil {
-				return err
-			}
-			if t, ok := tok.(StartElement); ok {
-				start = &t
-				break
-			}
-		}
-	}
-
-	// Load value from interface, but only if the result will be
-	// usefully addressable.
-	if val.Kind() == reflect.Interface && !val.IsNil() {
-		e := val.Elem()
-		if e.Kind() == reflect.Ptr && !e.IsNil() {
-			val = e
-		}
-	}
-
-	if val.Kind() == reflect.Ptr {
-		if val.IsNil() {
-			val.Set(reflect.New(val.Type().Elem()))
-		}
-		val = val.Elem()
-	}
-
-	if val.CanInterface() && val.Type().Implements(unmarshalerType) {
-		// This is an unmarshaler with a non-pointer receiver,
-		// so it's likely to be incorrect, but we do what we're told.
-		return p.unmarshalInterface(val.Interface().(Unmarshaler), start)
-	}
-
-	if val.CanAddr() {
-		pv := val.Addr()
-		if pv.CanInterface() && pv.Type().Implements(unmarshalerType) {
-			return p.unmarshalInterface(pv.Interface().(Unmarshaler), start)
-		}
-	}
-
-	if val.CanInterface() && val.Type().Implements(textUnmarshalerType) {
-		return p.unmarshalTextInterface(val.Interface().(encoding.TextUnmarshaler), start)
-	}
-
-	if val.CanAddr() {
-		pv := val.Addr()
-		if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) {
-			return p.unmarshalTextInterface(pv.Interface().(encoding.TextUnmarshaler), start)
-		}
-	}
-
-	var (
-		data         []byte
-		saveData     reflect.Value
-		comment      []byte
-		saveComment  reflect.Value
-		saveXML      reflect.Value
-		saveXMLIndex int
-		saveXMLData  []byte
-		saveAny      reflect.Value
-		sv           reflect.Value
-		tinfo        *typeInfo
-		err          error
-	)
-
-	switch v := val; v.Kind() {
-	default:
-		return errors.New("unknown type " + v.Type().String())
-
-	case reflect.Interface:
-		// TODO: For now, simply ignore the field. In the near
-		//       future we may choose to unmarshal the start
-		//       element on it, if not nil.
-		return p.Skip()
-
-	case reflect.Slice:
-		typ := v.Type()
-		if typ.Elem().Kind() == reflect.Uint8 {
-			// []byte
-			saveData = v
-			break
-		}
-
-		// Slice of element values.
-		// Grow slice.
-		n := v.Len()
-		if n >= v.Cap() {
-			ncap := 2 * n
-			if ncap < 4 {
-				ncap = 4
-			}
-			new := reflect.MakeSlice(typ, n, ncap)
-			reflect.Copy(new, v)
-			v.Set(new)
-		}
-		v.SetLen(n + 1)
-
-		// Recur to read element into slice.
-		if err := p.unmarshal(v.Index(n), start); err != nil {
-			v.SetLen(n)
-			return err
-		}
-		return nil
-
-	case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.String:
-		saveData = v
-
-	case reflect.Struct:
-		typ := v.Type()
-		if typ == nameType {
-			v.Set(reflect.ValueOf(start.Name))
-			break
-		}
-
-		sv = v
-		tinfo, err = getTypeInfo(typ)
-		if err != nil {
-			return err
-		}
-
-		// Validate and assign element name.
-		if tinfo.xmlname != nil {
-			finfo := tinfo.xmlname
-			if finfo.name != "" && finfo.name != start.Name.Local {
-				return UnmarshalError("expected element type <" + finfo.name + "> but have <" + start.Name.Local + ">")
-			}
-			if finfo.xmlns != "" && finfo.xmlns != start.Name.Space {
-				e := "expected element <" + finfo.name + "> in name space " + finfo.xmlns + " but have "
-				if start.Name.Space == "" {
-					e += "no name space"
-				} else {
-					e += start.Name.Space
-				}
-				return UnmarshalError(e)
-			}
-			fv := finfo.value(sv)
-			if _, ok := fv.Interface().(Name); ok {
-				fv.Set(reflect.ValueOf(start.Name))
-			}
-		}
-
-		// Assign attributes.
-		// Also, determine whether we need to save character data or comments.
-		for i := range tinfo.fields {
-			finfo := &tinfo.fields[i]
-			switch finfo.flags & fMode {
-			case fAttr:
-				strv := finfo.value(sv)
-				// Look for attribute.
-				for _, a := range start.Attr {
-					if a.Name.Local == finfo.name && (finfo.xmlns == "" || finfo.xmlns == a.Name.Space) {
-						if err := p.unmarshalAttr(strv, a); err != nil {
-							return err
-						}
-						break
-					}
-				}
-
-			case fCharData:
-				if !saveData.IsValid() {
-					saveData = finfo.value(sv)
-				}
-
-			case fComment:
-				if !saveComment.IsValid() {
-					saveComment = finfo.value(sv)
-				}
-
-			case fAny, fAny | fElement:
-				if !saveAny.IsValid() {
-					saveAny = finfo.value(sv)
-				}
-
-			case fInnerXml:
-				if !saveXML.IsValid() {
-					saveXML = finfo.value(sv)
-					if p.saved == nil {
-						saveXMLIndex = 0
-						p.saved = new(bytes.Buffer)
-					} else {
-						saveXMLIndex = p.savedOffset()
-					}
-				}
-			}
-		}
-	}
-
-	// Find end element.
-	// Process sub-elements along the way.
-Loop:
-	for {
-		var savedOffset int
-		if saveXML.IsValid() {
-			savedOffset = p.savedOffset()
-		}
-		tok, err := p.Token()
-		if err != nil {
-			return err
-		}
-		switch t := tok.(type) {
-		case StartElement:
-			consumed := false
-			if sv.IsValid() {
-				consumed, err = p.unmarshalPath(tinfo, sv, nil, &t)
-				if err != nil {
-					return err
-				}
-				if !consumed && saveAny.IsValid() {
-					consumed = true
-					if err := p.unmarshal(saveAny, &t); err != nil {
-						return err
-					}
-				}
-			}
-			if !consumed {
-				if err := p.Skip(); err != nil {
-					return err
-				}
-			}
-
-		case EndElement:
-			if saveXML.IsValid() {
-				saveXMLData = p.saved.Bytes()[saveXMLIndex:savedOffset]
-				if saveXMLIndex == 0 {
-					p.saved = nil
-				}
-			}
-			break Loop
-
-		case CharData:
-			if saveData.IsValid() {
-				data = append(data, t...)
-			}
-
-		case Comment:
-			if saveComment.IsValid() {
-				comment = append(comment, t...)
-			}
-		}
-	}
-
-	if saveData.IsValid() && saveData.CanInterface() && saveData.Type().Implements(textUnmarshalerType) {
-		if err := saveData.Interface().(encoding.TextUnmarshaler).UnmarshalText(data); err != nil {
-			return err
-		}
-		saveData = reflect.Value{}
-	}
-
-	if saveData.IsValid() && saveData.CanAddr() {
-		pv := saveData.Addr()
-		if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) {
-			if err := pv.Interface().(encoding.TextUnmarshaler).UnmarshalText(data); err != nil {
-				return err
-			}
-			saveData = reflect.Value{}
-		}
-	}
-
-	if err := copyValue(saveData, data); err != nil {
-		return err
-	}
-
-	switch t := saveComment; t.Kind() {
-	case reflect.String:
-		t.SetString(string(comment))
-	case reflect.Slice:
-		t.Set(reflect.ValueOf(comment))
-	}
-
-	switch t := saveXML; t.Kind() {
-	case reflect.String:
-		t.SetString(string(saveXMLData))
-	case reflect.Slice:
-		t.Set(reflect.ValueOf(saveXMLData))
-	}
-
-	return nil
-}
-
-func copyValue(dst reflect.Value, src []byte) (err error) {
-	dst0 := dst
-
-	if dst.Kind() == reflect.Ptr {
-		if dst.IsNil() {
-			dst.Set(reflect.New(dst.Type().Elem()))
-		}
-		dst = dst.Elem()
-	}
-
-	// Save accumulated data.
-	switch dst.Kind() {
-	case reflect.Invalid:
-		// Probably a comment.
-	default:
-		return errors.New("cannot unmarshal into " + dst0.Type().String())
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		itmp, err := strconv.ParseInt(string(src), 10, dst.Type().Bits())
-		if err != nil {
-			return err
-		}
-		dst.SetInt(itmp)
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		utmp, err := strconv.ParseUint(string(src), 10, dst.Type().Bits())
-		if err != nil {
-			return err
-		}
-		dst.SetUint(utmp)
-	case reflect.Float32, reflect.Float64:
-		ftmp, err := strconv.ParseFloat(string(src), dst.Type().Bits())
-		if err != nil {
-			return err
-		}
-		dst.SetFloat(ftmp)
-	case reflect.Bool:
-		value, err := strconv.ParseBool(strings.TrimSpace(string(src)))
-		if err != nil {
-			return err
-		}
-		dst.SetBool(value)
-	case reflect.String:
-		dst.SetString(string(src))
-	case reflect.Slice:
-		if len(src) == 0 {
-			// non-nil to flag presence
-			src = []byte{}
-		}
-		dst.SetBytes(src)
-	}
-	return nil
-}
-
-// unmarshalPath walks down an XML structure looking for wanted
-// paths, and calls unmarshal on them.
-// The consumed result tells whether XML elements have been consumed
-// from the Decoder until start's matching end element, or if it's
-// still untouched because start is uninteresting for sv's fields.
-func (p *Decoder) unmarshalPath(tinfo *typeInfo, sv reflect.Value, parents []string, start *StartElement) (consumed bool, err error) {
-	recurse := false
-Loop:
-	for i := range tinfo.fields {
-		finfo := &tinfo.fields[i]
-		if finfo.flags&fElement == 0 || len(finfo.parents) < len(parents) || finfo.xmlns != "" && finfo.xmlns != start.Name.Space {
-			continue
-		}
-		for j := range parents {
-			if parents[j] != finfo.parents[j] {
-				continue Loop
-			}
-		}
-		if len(finfo.parents) == len(parents) && finfo.name == start.Name.Local {
-			// It's a perfect match, unmarshal the field.
-			return true, p.unmarshal(finfo.value(sv), start)
-		}
-		if len(finfo.parents) > len(parents) && finfo.parents[len(parents)] == start.Name.Local {
-			// It's a prefix for the field. Break and recurse
-			// since it's not ok for one field path to be itself
-			// the prefix for another field path.
-			recurse = true
-
-			// We can reuse the same slice as long as we
-			// don't try to append to it.
-			parents = finfo.parents[:len(parents)+1]
-			break
-		}
-	}
-	if !recurse {
-		// We have no business with this element.
-		return false, nil
-	}
-	// The element is not a perfect match for any field, but one
-	// or more fields have the path to this element as a parent
-	// prefix. Recurse and attempt to match these.
-	for {
-		var tok Token
-		tok, err = p.Token()
-		if err != nil {
-			return true, err
-		}
-		switch t := tok.(type) {
-		case StartElement:
-			consumed2, err := p.unmarshalPath(tinfo, sv, parents, &t)
-			if err != nil {
-				return true, err
-			}
-			if !consumed2 {
-				if err := p.Skip(); err != nil {
-					return true, err
-				}
-			}
-		case EndElement:
-			return true, nil
-		}
-	}
-}
-
-// Skip reads tokens until it has consumed the end element
-// matching the most recent start element already consumed.
-// It recurs if it encounters a start element, so it can be used to
-// skip nested structures.
-// It returns nil if it finds an end element matching the start
-// element; otherwise it returns an error describing the problem.
-func (d *Decoder) Skip() error {
-	for {
-		tok, err := d.Token()
-		if err != nil {
-			return err
-		}
-		switch tok.(type) {
-		case StartElement:
-			if err := d.Skip(); err != nil {
-				return err
-			}
-		case EndElement:
-			return nil
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/xml/read_test.go b/third_party/gofrontend/libgo/go/encoding/xml/read_test.go
deleted file mode 100644
index 7d004dc..0000000
--- a/third_party/gofrontend/libgo/go/encoding/xml/read_test.go
+++ /dev/null
@@ -1,714 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package xml
-
-import (
-	"io"
-	"reflect"
-	"strings"
-	"testing"
-	"time"
-)
-
-// Stripped down Atom feed data structures.
-
-func TestUnmarshalFeed(t *testing.T) {
-	var f Feed
-	if err := Unmarshal([]byte(atomFeedString), &f); err != nil {
-		t.Fatalf("Unmarshal: %s", err)
-	}
-	if !reflect.DeepEqual(f, atomFeed) {
-		t.Fatalf("have %#v\nwant %#v", f, atomFeed)
-	}
-}
-
-// hget http://codereview.appspot.com/rss/mine/rsc
-const atomFeedString = `
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-us" updated="2009-10-04T01:35:58+00:00"><title>Code Review - My issues</title><link href="http://codereview.appspot.com/" rel="alternate"></link><link href="http://codereview.appspot.com/rss/mine/rsc" rel="self"></link><id>http://codereview.appspot.com/</id><author><name>rietveld&lt;&gt;</name></author><entry><title>rietveld: an attempt at pubsubhubbub
-</title><link href="http://codereview.appspot.com/126085" rel="alternate"></link><updated>2009-10-04T01:35:58+00:00</updated><author><name>email-address-removed</name></author><id>urn:md5:134d9179c41f806be79b3a5f7877d19a</id><summary type="html">
-  An attempt at adding pubsubhubbub support to Rietveld.
-http://code.google.com/p/pubsubhubbub
-http://code.google.com/p/rietveld/issues/detail?id=155
-
-The server side of the protocol is trivial:
-  1. add a &amp;lt;link rel=&amp;quot;hub&amp;quot; href=&amp;quot;hub-server&amp;quot;&amp;gt; tag to all
-     feeds that will be pubsubhubbubbed.
-  2. every time one of those feeds changes, tell the hub
-     with a simple POST request.
-
-I have tested this by adding debug prints to a local hub
-server and checking that the server got the right publish
-requests.
-
-I can&amp;#39;t quite get the server to work, but I think the bug
-is not in my code.  I think that the server expects to be
-able to grab the feed and see the feed&amp;#39;s actual URL in
-the link rel=&amp;quot;self&amp;quot;, but the default value for that drops
-the :port from the URL, and I cannot for the life of me
-figure out how to get the Atom generator deep inside
-django not to do that, or even where it is doing that,
-or even what code is running to generate the Atom feed.
-(I thought I knew but I added some assert False statements
-and it kept running!)
-
-Ignoring that particular problem, I would appreciate
-feedback on the right way to get the two values at
-the top of feeds.py marked NOTE(rsc).
-
-
-</summary></entry><entry><title>rietveld: correct tab handling
-</title><link href="http://codereview.appspot.com/124106" rel="alternate"></link><updated>2009-10-03T23:02:17+00:00</updated><author><name>email-address-removed</name></author><id>urn:md5:0a2a4f19bb815101f0ba2904aed7c35a</id><summary type="html">
-  This fixes the buggy tab rendering that can be seen at
-http://codereview.appspot.com/116075/diff/1/2
-
-The fundamental problem was that the tab code was
-not being told what column the text began in, so it
-didn&amp;#39;t know where to put the tab stops.  Another problem
-was that some of the code assumed that string byte
-offsets were the same as column offsets, which is only
-true if there are no tabs.
-
-In the process of fixing this, I cleaned up the arguments
-to Fold and ExpandTabs and renamed them Break and
-_ExpandTabs so that I could be sure that I found all the
-call sites.  I also wanted to verify that ExpandTabs was
-not being used from outside intra_region_diff.py.
-
-
-</summary></entry></feed> 	   `
-
-type Feed struct {
-	XMLName Name      `xml:"http://www.w3.org/2005/Atom feed"`
-	Title   string    `xml:"title"`
-	Id      string    `xml:"id"`
-	Link    []Link    `xml:"link"`
-	Updated time.Time `xml:"updated,attr"`
-	Author  Person    `xml:"author"`
-	Entry   []Entry   `xml:"entry"`
-}
-
-type Entry struct {
-	Title   string    `xml:"title"`
-	Id      string    `xml:"id"`
-	Link    []Link    `xml:"link"`
-	Updated time.Time `xml:"updated"`
-	Author  Person    `xml:"author"`
-	Summary Text      `xml:"summary"`
-}
-
-type Link struct {
-	Rel  string `xml:"rel,attr,omitempty"`
-	Href string `xml:"href,attr"`
-}
-
-type Person struct {
-	Name     string `xml:"name"`
-	URI      string `xml:"uri"`
-	Email    string `xml:"email"`
-	InnerXML string `xml:",innerxml"`
-}
-
-type Text struct {
-	Type string `xml:"type,attr,omitempty"`
-	Body string `xml:",chardata"`
-}
-
-var atomFeed = Feed{
-	XMLName: Name{"http://www.w3.org/2005/Atom", "feed"},
-	Title:   "Code Review - My issues",
-	Link: []Link{
-		{Rel: "alternate", Href: "http://codereview.appspot.com/"},
-		{Rel: "self", Href: "http://codereview.appspot.com/rss/mine/rsc"},
-	},
-	Id:      "http://codereview.appspot.com/",
-	Updated: ParseTime("2009-10-04T01:35:58+00:00"),
-	Author: Person{
-		Name:     "rietveld<>",
-		InnerXML: "<name>rietveld&lt;&gt;</name>",
-	},
-	Entry: []Entry{
-		{
-			Title: "rietveld: an attempt at pubsubhubbub\n",
-			Link: []Link{
-				{Rel: "alternate", Href: "http://codereview.appspot.com/126085"},
-			},
-			Updated: ParseTime("2009-10-04T01:35:58+00:00"),
-			Author: Person{
-				Name:     "email-address-removed",
-				InnerXML: "<name>email-address-removed</name>",
-			},
-			Id: "urn:md5:134d9179c41f806be79b3a5f7877d19a",
-			Summary: Text{
-				Type: "html",
-				Body: `
-  An attempt at adding pubsubhubbub support to Rietveld.
-http://code.google.com/p/pubsubhubbub
-http://code.google.com/p/rietveld/issues/detail?id=155
-
-The server side of the protocol is trivial:
-  1. add a &lt;link rel=&quot;hub&quot; href=&quot;hub-server&quot;&gt; tag to all
-     feeds that will be pubsubhubbubbed.
-  2. every time one of those feeds changes, tell the hub
-     with a simple POST request.
-
-I have tested this by adding debug prints to a local hub
-server and checking that the server got the right publish
-requests.
-
-I can&#39;t quite get the server to work, but I think the bug
-is not in my code.  I think that the server expects to be
-able to grab the feed and see the feed&#39;s actual URL in
-the link rel=&quot;self&quot;, but the default value for that drops
-the :port from the URL, and I cannot for the life of me
-figure out how to get the Atom generator deep inside
-django not to do that, or even where it is doing that,
-or even what code is running to generate the Atom feed.
-(I thought I knew but I added some assert False statements
-and it kept running!)
-
-Ignoring that particular problem, I would appreciate
-feedback on the right way to get the two values at
-the top of feeds.py marked NOTE(rsc).
-
-
-`,
-			},
-		},
-		{
-			Title: "rietveld: correct tab handling\n",
-			Link: []Link{
-				{Rel: "alternate", Href: "http://codereview.appspot.com/124106"},
-			},
-			Updated: ParseTime("2009-10-03T23:02:17+00:00"),
-			Author: Person{
-				Name:     "email-address-removed",
-				InnerXML: "<name>email-address-removed</name>",
-			},
-			Id: "urn:md5:0a2a4f19bb815101f0ba2904aed7c35a",
-			Summary: Text{
-				Type: "html",
-				Body: `
-  This fixes the buggy tab rendering that can be seen at
-http://codereview.appspot.com/116075/diff/1/2
-
-The fundamental problem was that the tab code was
-not being told what column the text began in, so it
-didn&#39;t know where to put the tab stops.  Another problem
-was that some of the code assumed that string byte
-offsets were the same as column offsets, which is only
-true if there are no tabs.
-
-In the process of fixing this, I cleaned up the arguments
-to Fold and ExpandTabs and renamed them Break and
-_ExpandTabs so that I could be sure that I found all the
-call sites.  I also wanted to verify that ExpandTabs was
-not being used from outside intra_region_diff.py.
-
-
-`,
-			},
-		},
-	},
-}
-
-const pathTestString = `
-<Result>
-    <Before>1</Before>
-    <Items>
-        <Item1>
-            <Value>A</Value>
-        </Item1>
-        <Item2>
-            <Value>B</Value>
-        </Item2>
-        <Item1>
-            <Value>C</Value>
-            <Value>D</Value>
-        </Item1>
-        <_>
-            <Value>E</Value>
-        </_>
-    </Items>
-    <After>2</After>
-</Result>
-`
-
-type PathTestItem struct {
-	Value string
-}
-
-type PathTestA struct {
-	Items         []PathTestItem `xml:">Item1"`
-	Before, After string
-}
-
-type PathTestB struct {
-	Other         []PathTestItem `xml:"Items>Item1"`
-	Before, After string
-}
-
-type PathTestC struct {
-	Values1       []string `xml:"Items>Item1>Value"`
-	Values2       []string `xml:"Items>Item2>Value"`
-	Before, After string
-}
-
-type PathTestSet struct {
-	Item1 []PathTestItem
-}
-
-type PathTestD struct {
-	Other         PathTestSet `xml:"Items"`
-	Before, After string
-}
-
-type PathTestE struct {
-	Underline     string `xml:"Items>_>Value"`
-	Before, After string
-}
-
-var pathTests = []interface{}{
-	&PathTestA{Items: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"},
-	&PathTestB{Other: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"},
-	&PathTestC{Values1: []string{"A", "C", "D"}, Values2: []string{"B"}, Before: "1", After: "2"},
-	&PathTestD{Other: PathTestSet{Item1: []PathTestItem{{"A"}, {"D"}}}, Before: "1", After: "2"},
-	&PathTestE{Underline: "E", Before: "1", After: "2"},
-}
-
-func TestUnmarshalPaths(t *testing.T) {
-	for _, pt := range pathTests {
-		v := reflect.New(reflect.TypeOf(pt).Elem()).Interface()
-		if err := Unmarshal([]byte(pathTestString), v); err != nil {
-			t.Fatalf("Unmarshal: %s", err)
-		}
-		if !reflect.DeepEqual(v, pt) {
-			t.Fatalf("have %#v\nwant %#v", v, pt)
-		}
-	}
-}
-
-type BadPathTestA struct {
-	First  string `xml:"items>item1"`
-	Other  string `xml:"items>item2"`
-	Second string `xml:"items"`
-}
-
-type BadPathTestB struct {
-	Other  string `xml:"items>item2>value"`
-	First  string `xml:"items>item1"`
-	Second string `xml:"items>item1>value"`
-}
-
-type BadPathTestC struct {
-	First  string
-	Second string `xml:"First"`
-}
-
-type BadPathTestD struct {
-	BadPathEmbeddedA
-	BadPathEmbeddedB
-}
-
-type BadPathEmbeddedA struct {
-	First string
-}
-
-type BadPathEmbeddedB struct {
-	Second string `xml:"First"`
-}
-
-var badPathTests = []struct {
-	v, e interface{}
-}{
-	{&BadPathTestA{}, &TagPathError{reflect.TypeOf(BadPathTestA{}), "First", "items>item1", "Second", "items"}},
-	{&BadPathTestB{}, &TagPathError{reflect.TypeOf(BadPathTestB{}), "First", "items>item1", "Second", "items>item1>value"}},
-	{&BadPathTestC{}, &TagPathError{reflect.TypeOf(BadPathTestC{}), "First", "", "Second", "First"}},
-	{&BadPathTestD{}, &TagPathError{reflect.TypeOf(BadPathTestD{}), "First", "", "Second", "First"}},
-}
-
-func TestUnmarshalBadPaths(t *testing.T) {
-	for _, tt := range badPathTests {
-		err := Unmarshal([]byte(pathTestString), tt.v)
-		if !reflect.DeepEqual(err, tt.e) {
-			t.Fatalf("Unmarshal with %#v didn't fail properly:\nhave %#v,\nwant %#v", tt.v, err, tt.e)
-		}
-	}
-}
-
-const OK = "OK"
-const withoutNameTypeData = `
-<?xml version="1.0" charset="utf-8"?>
-<Test3 Attr="OK" />`
-
-type TestThree struct {
-	XMLName Name   `xml:"Test3"`
-	Attr    string `xml:",attr"`
-}
-
-func TestUnmarshalWithoutNameType(t *testing.T) {
-	var x TestThree
-	if err := Unmarshal([]byte(withoutNameTypeData), &x); err != nil {
-		t.Fatalf("Unmarshal: %s", err)
-	}
-	if x.Attr != OK {
-		t.Fatalf("have %v\nwant %v", x.Attr, OK)
-	}
-}
-
-func TestUnmarshalAttr(t *testing.T) {
-	type ParamVal struct {
-		Int int `xml:"int,attr"`
-	}
-
-	type ParamPtr struct {
-		Int *int `xml:"int,attr"`
-	}
-
-	type ParamStringPtr struct {
-		Int *string `xml:"int,attr"`
-	}
-
-	x := []byte(`<Param int="1" />`)
-
-	p1 := &ParamPtr{}
-	if err := Unmarshal(x, p1); err != nil {
-		t.Fatalf("Unmarshal: %s", err)
-	}
-	if p1.Int == nil {
-		t.Fatalf("Unmarshal failed in to *int field")
-	} else if *p1.Int != 1 {
-		t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p1.Int, 1)
-	}
-
-	p2 := &ParamVal{}
-	if err := Unmarshal(x, p2); err != nil {
-		t.Fatalf("Unmarshal: %s", err)
-	}
-	if p2.Int != 1 {
-		t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p2.Int, 1)
-	}
-
-	p3 := &ParamStringPtr{}
-	if err := Unmarshal(x, p3); err != nil {
-		t.Fatalf("Unmarshal: %s", err)
-	}
-	if p3.Int == nil {
-		t.Fatalf("Unmarshal failed in to *string field")
-	} else if *p3.Int != "1" {
-		t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p3.Int, 1)
-	}
-}
-
-type Tables struct {
-	HTable string `xml:"http://www.w3.org/TR/html4/ table"`
-	FTable string `xml:"http://www.w3schools.com/furniture table"`
-}
-
-var tables = []struct {
-	xml string
-	tab Tables
-	ns  string
-}{
-	{
-		xml: `<Tables>` +
-			`<table xmlns="http://www.w3.org/TR/html4/">hello</table>` +
-			`<table xmlns="http://www.w3schools.com/furniture">world</table>` +
-			`</Tables>`,
-		tab: Tables{"hello", "world"},
-	},
-	{
-		xml: `<Tables>` +
-			`<table xmlns="http://www.w3schools.com/furniture">world</table>` +
-			`<table xmlns="http://www.w3.org/TR/html4/">hello</table>` +
-			`</Tables>`,
-		tab: Tables{"hello", "world"},
-	},
-	{
-		xml: `<Tables xmlns:f="http://www.w3schools.com/furniture" xmlns:h="http://www.w3.org/TR/html4/">` +
-			`<f:table>world</f:table>` +
-			`<h:table>hello</h:table>` +
-			`</Tables>`,
-		tab: Tables{"hello", "world"},
-	},
-	{
-		xml: `<Tables>` +
-			`<table>bogus</table>` +
-			`</Tables>`,
-		tab: Tables{},
-	},
-	{
-		xml: `<Tables>` +
-			`<table>only</table>` +
-			`</Tables>`,
-		tab: Tables{HTable: "only"},
-		ns:  "http://www.w3.org/TR/html4/",
-	},
-	{
-		xml: `<Tables>` +
-			`<table>only</table>` +
-			`</Tables>`,
-		tab: Tables{FTable: "only"},
-		ns:  "http://www.w3schools.com/furniture",
-	},
-	{
-		xml: `<Tables>` +
-			`<table>only</table>` +
-			`</Tables>`,
-		tab: Tables{},
-		ns:  "something else entirely",
-	},
-}
-
-func TestUnmarshalNS(t *testing.T) {
-	for i, tt := range tables {
-		var dst Tables
-		var err error
-		if tt.ns != "" {
-			d := NewDecoder(strings.NewReader(tt.xml))
-			d.DefaultSpace = tt.ns
-			err = d.Decode(&dst)
-		} else {
-			err = Unmarshal([]byte(tt.xml), &dst)
-		}
-		if err != nil {
-			t.Errorf("#%d: Unmarshal: %v", i, err)
-			continue
-		}
-		want := tt.tab
-		if dst != want {
-			t.Errorf("#%d: dst=%+v, want %+v", i, dst, want)
-		}
-	}
-}
-
-func TestMarshalNS(t *testing.T) {
-	dst := Tables{"hello", "world"}
-	data, err := Marshal(&dst)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	want := `<Tables><table xmlns="http://www.w3.org/TR/html4/">hello</table><table xmlns="http://www.w3schools.com/furniture">world</table></Tables>`
-	str := string(data)
-	if str != want {
-		t.Errorf("have: %q\nwant: %q\n", str, want)
-	}
-}
-
-type TableAttrs struct {
-	TAttr TAttr
-}
-
-type TAttr struct {
-	HTable string `xml:"http://www.w3.org/TR/html4/ table,attr"`
-	FTable string `xml:"http://www.w3schools.com/furniture table,attr"`
-	Lang   string `xml:"http://www.w3.org/XML/1998/namespace lang,attr,omitempty"`
-	Other1 string `xml:"http://golang.org/xml/ other,attr,omitempty"`
-	Other2 string `xml:"http://golang.org/xmlfoo/ other,attr,omitempty"`
-	Other3 string `xml:"http://golang.org/json/ other,attr,omitempty"`
-	Other4 string `xml:"http://golang.org/2/json/ other,attr,omitempty"`
-}
-
-var tableAttrs = []struct {
-	xml string
-	tab TableAttrs
-	ns  string
-}{
-	{
-		xml: `<TableAttrs xmlns:f="http://www.w3schools.com/furniture" xmlns:h="http://www.w3.org/TR/html4/"><TAttr ` +
-			`h:table="hello" f:table="world" ` +
-			`/></TableAttrs>`,
-		tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}},
-	},
-	{
-		xml: `<TableAttrs><TAttr xmlns:f="http://www.w3schools.com/furniture" xmlns:h="http://www.w3.org/TR/html4/" ` +
-			`h:table="hello" f:table="world" ` +
-			`/></TableAttrs>`,
-		tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}},
-	},
-	{
-		xml: `<TableAttrs><TAttr ` +
-			`h:table="hello" f:table="world" xmlns:f="http://www.w3schools.com/furniture" xmlns:h="http://www.w3.org/TR/html4/" ` +
-			`/></TableAttrs>`,
-		tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}},
-	},
-	{
-		// Default space does not apply to attribute names.
-		xml: `<TableAttrs xmlns="http://www.w3schools.com/furniture" xmlns:h="http://www.w3.org/TR/html4/"><TAttr ` +
-			`h:table="hello" table="world" ` +
-			`/></TableAttrs>`,
-		tab: TableAttrs{TAttr{HTable: "hello", FTable: ""}},
-	},
-	{
-		// Default space does not apply to attribute names.
-		xml: `<TableAttrs xmlns:f="http://www.w3schools.com/furniture"><TAttr xmlns="http://www.w3.org/TR/html4/" ` +
-			`table="hello" f:table="world" ` +
-			`/></TableAttrs>`,
-		tab: TableAttrs{TAttr{HTable: "", FTable: "world"}},
-	},
-	{
-		xml: `<TableAttrs><TAttr ` +
-			`table="bogus" ` +
-			`/></TableAttrs>`,
-		tab: TableAttrs{},
-	},
-	{
-		// Default space does not apply to attribute names.
-		xml: `<TableAttrs xmlns:h="http://www.w3.org/TR/html4/"><TAttr ` +
-			`h:table="hello" table="world" ` +
-			`/></TableAttrs>`,
-		tab: TableAttrs{TAttr{HTable: "hello", FTable: ""}},
-		ns:  "http://www.w3schools.com/furniture",
-	},
-	{
-		// Default space does not apply to attribute names.
-		xml: `<TableAttrs xmlns:f="http://www.w3schools.com/furniture"><TAttr ` +
-			`table="hello" f:table="world" ` +
-			`/></TableAttrs>`,
-		tab: TableAttrs{TAttr{HTable: "", FTable: "world"}},
-		ns:  "http://www.w3.org/TR/html4/",
-	},
-	{
-		xml: `<TableAttrs><TAttr ` +
-			`table="bogus" ` +
-			`/></TableAttrs>`,
-		tab: TableAttrs{},
-		ns:  "something else entirely",
-	},
-}
-
-func TestUnmarshalNSAttr(t *testing.T) {
-	for i, tt := range tableAttrs {
-		var dst TableAttrs
-		var err error
-		if tt.ns != "" {
-			d := NewDecoder(strings.NewReader(tt.xml))
-			d.DefaultSpace = tt.ns
-			err = d.Decode(&dst)
-		} else {
-			err = Unmarshal([]byte(tt.xml), &dst)
-		}
-		if err != nil {
-			t.Errorf("#%d: Unmarshal: %v", i, err)
-			continue
-		}
-		want := tt.tab
-		if dst != want {
-			t.Errorf("#%d: dst=%+v, want %+v", i, dst, want)
-		}
-	}
-}
-
-func TestMarshalNSAttr(t *testing.T) {
-	src := TableAttrs{TAttr{"hello", "world", "en_US", "other1", "other2", "other3", "other4"}}
-	data, err := Marshal(&src)
-	if err != nil {
-		t.Fatalf("Marshal: %v", err)
-	}
-	want := `<TableAttrs><TAttr xmlns:html4="http://www.w3.org/TR/html4/" html4:table="hello" xmlns:furniture="http://www.w3schools.com/furniture" furniture:table="world" xml:lang="en_US" xmlns:_xml="http://golang.org/xml/" _xml:other="other1" xmlns:_xmlfoo="http://golang.org/xmlfoo/" _xmlfoo:other="other2" xmlns:json="http://golang.org/json/" json:other="other3" xmlns:json_1="http://golang.org/2/json/" json_1:other="other4"></TAttr></TableAttrs>`
-	str := string(data)
-	if str != want {
-		t.Errorf("Marshal:\nhave: %#q\nwant: %#q\n", str, want)
-	}
-
-	var dst TableAttrs
-	if err := Unmarshal(data, &dst); err != nil {
-		t.Errorf("Unmarshal: %v", err)
-	}
-
-	if dst != src {
-		t.Errorf("Unmarshal = %q, want %q", dst, src)
-	}
-}
-
-type MyCharData struct {
-	body string
-}
-
-func (m *MyCharData) UnmarshalXML(d *Decoder, start StartElement) error {
-	for {
-		t, err := d.Token()
-		if err == io.EOF { // found end of element
-			break
-		}
-		if err != nil {
-			return err
-		}
-		if char, ok := t.(CharData); ok {
-			m.body += string(char)
-		}
-	}
-	return nil
-}
-
-var _ Unmarshaler = (*MyCharData)(nil)
-
-func (m *MyCharData) UnmarshalXMLAttr(attr Attr) error {
-	panic("must not call")
-}
-
-type MyAttr struct {
-	attr string
-}
-
-func (m *MyAttr) UnmarshalXMLAttr(attr Attr) error {
-	m.attr = attr.Value
-	return nil
-}
-
-var _ UnmarshalerAttr = (*MyAttr)(nil)
-
-type MyStruct struct {
-	Data *MyCharData
-	Attr *MyAttr `xml:",attr"`
-
-	Data2 MyCharData
-	Attr2 MyAttr `xml:",attr"`
-}
-
-func TestUnmarshaler(t *testing.T) {
-	xml := `<?xml version="1.0" encoding="utf-8"?>
-		<MyStruct Attr="attr1" Attr2="attr2">
-		<Data>hello <!-- comment -->world</Data>
-		<Data2>howdy <!-- comment -->world</Data2>
-		</MyStruct>
-	`
-
-	var m MyStruct
-	if err := Unmarshal([]byte(xml), &m); err != nil {
-		t.Fatal(err)
-	}
-
-	if m.Data == nil || m.Attr == nil || m.Data.body != "hello world" || m.Attr.attr != "attr1" || m.Data2.body != "howdy world" || m.Attr2.attr != "attr2" {
-		t.Errorf("m=%#+v\n", m)
-	}
-}
-
-type Pea struct {
-	Cotelydon string
-}
-
-type Pod struct {
-	Pea interface{} `xml:"Pea"`
-}
-
-// https://golang.org/issue/6836
-func TestUnmarshalIntoInterface(t *testing.T) {
-	pod := new(Pod)
-	pod.Pea = new(Pea)
-	xml := `<Pod><Pea><Cotelydon>Green stuff</Cotelydon></Pea></Pod>`
-	err := Unmarshal([]byte(xml), pod)
-	if err != nil {
-		t.Fatalf("failed to unmarshal %q: %v", xml, err)
-	}
-	pea, ok := pod.Pea.(*Pea)
-	if !ok {
-		t.Fatalf("unmarshalled into wrong type: have %T want *Pea", pod.Pea)
-	}
-	have, want := pea.Cotelydon, "Green stuff"
-	if have != want {
-		t.Errorf("failed to unmarshal into interface, have %q want %q", have, want)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/xml/typeinfo.go b/third_party/gofrontend/libgo/go/encoding/xml/typeinfo.go
deleted file mode 100644
index 6766b88..0000000
--- a/third_party/gofrontend/libgo/go/encoding/xml/typeinfo.go
+++ /dev/null
@@ -1,363 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package xml
-
-import (
-	"fmt"
-	"reflect"
-	"strings"
-	"sync"
-)
-
-// typeInfo holds details for the xml representation of a type.
-type typeInfo struct {
-	xmlname *fieldInfo
-	fields  []fieldInfo
-}
-
-// fieldInfo holds details for the xml representation of a single field.
-type fieldInfo struct {
-	idx     []int
-	name    string
-	xmlns   string
-	flags   fieldFlags
-	parents []string
-}
-
-type fieldFlags int
-
-const (
-	fElement fieldFlags = 1 << iota
-	fAttr
-	fCharData
-	fInnerXml
-	fComment
-	fAny
-
-	fOmitEmpty
-
-	fMode = fElement | fAttr | fCharData | fInnerXml | fComment | fAny
-)
-
-var tinfoMap = make(map[reflect.Type]*typeInfo)
-var tinfoLock sync.RWMutex
-
-var nameType = reflect.TypeOf(Name{})
-
-// getTypeInfo returns the typeInfo structure with details necessary
-// for marshalling and unmarshalling typ.
-func getTypeInfo(typ reflect.Type) (*typeInfo, error) {
-	tinfoLock.RLock()
-	tinfo, ok := tinfoMap[typ]
-	tinfoLock.RUnlock()
-	if ok {
-		return tinfo, nil
-	}
-	tinfo = &typeInfo{}
-	if typ.Kind() == reflect.Struct && typ != nameType {
-		n := typ.NumField()
-		for i := 0; i < n; i++ {
-			f := typ.Field(i)
-			if (f.PkgPath != "" && !f.Anonymous) || f.Tag.Get("xml") == "-" {
-				continue // Private field
-			}
-
-			// For embedded structs, embed its fields.
-			if f.Anonymous {
-				t := f.Type
-				if t.Kind() == reflect.Ptr {
-					t = t.Elem()
-				}
-				if t.Kind() == reflect.Struct {
-					inner, err := getTypeInfo(t)
-					if err != nil {
-						return nil, err
-					}
-					if tinfo.xmlname == nil {
-						tinfo.xmlname = inner.xmlname
-					}
-					for _, finfo := range inner.fields {
-						finfo.idx = append([]int{i}, finfo.idx...)
-						if err := addFieldInfo(typ, tinfo, &finfo); err != nil {
-							return nil, err
-						}
-					}
-					continue
-				}
-			}
-
-			finfo, err := structFieldInfo(typ, &f)
-			if err != nil {
-				return nil, err
-			}
-
-			if f.Name == "XMLName" {
-				tinfo.xmlname = finfo
-				continue
-			}
-
-			// Add the field if it doesn't conflict with other fields.
-			if err := addFieldInfo(typ, tinfo, finfo); err != nil {
-				return nil, err
-			}
-		}
-	}
-	tinfoLock.Lock()
-	tinfoMap[typ] = tinfo
-	tinfoLock.Unlock()
-	return tinfo, nil
-}
-
-// structFieldInfo builds and returns a fieldInfo for f.
-func structFieldInfo(typ reflect.Type, f *reflect.StructField) (*fieldInfo, error) {
-	finfo := &fieldInfo{idx: f.Index}
-
-	// Split the tag from the xml namespace if necessary.
-	tag := f.Tag.Get("xml")
-	if i := strings.Index(tag, " "); i >= 0 {
-		finfo.xmlns, tag = tag[:i], tag[i+1:]
-	}
-
-	// Parse flags.
-	tokens := strings.Split(tag, ",")
-	if len(tokens) == 1 {
-		finfo.flags = fElement
-	} else {
-		tag = tokens[0]
-		for _, flag := range tokens[1:] {
-			switch flag {
-			case "attr":
-				finfo.flags |= fAttr
-			case "chardata":
-				finfo.flags |= fCharData
-			case "innerxml":
-				finfo.flags |= fInnerXml
-			case "comment":
-				finfo.flags |= fComment
-			case "any":
-				finfo.flags |= fAny
-			case "omitempty":
-				finfo.flags |= fOmitEmpty
-			}
-		}
-
-		// Validate the flags used.
-		valid := true
-		switch mode := finfo.flags & fMode; mode {
-		case 0:
-			finfo.flags |= fElement
-		case fAttr, fCharData, fInnerXml, fComment, fAny:
-			if f.Name == "XMLName" || tag != "" && mode != fAttr {
-				valid = false
-			}
-		default:
-			// This will also catch multiple modes in a single field.
-			valid = false
-		}
-		if finfo.flags&fMode == fAny {
-			finfo.flags |= fElement
-		}
-		if finfo.flags&fOmitEmpty != 0 && finfo.flags&(fElement|fAttr) == 0 {
-			valid = false
-		}
-		if !valid {
-			return nil, fmt.Errorf("xml: invalid tag in field %s of type %s: %q",
-				f.Name, typ, f.Tag.Get("xml"))
-		}
-	}
-
-	// Use of xmlns without a name is not allowed.
-	if finfo.xmlns != "" && tag == "" {
-		return nil, fmt.Errorf("xml: namespace without name in field %s of type %s: %q",
-			f.Name, typ, f.Tag.Get("xml"))
-	}
-
-	if f.Name == "XMLName" {
-		// The XMLName field records the XML element name. Don't
-		// process it as usual because its name should default to
-		// empty rather than to the field name.
-		finfo.name = tag
-		return finfo, nil
-	}
-
-	if tag == "" {
-		// If the name part of the tag is completely empty, get
-		// default from XMLName of underlying struct if feasible,
-		// or field name otherwise.
-		if xmlname := lookupXMLName(f.Type); xmlname != nil {
-			finfo.xmlns, finfo.name = xmlname.xmlns, xmlname.name
-		} else {
-			finfo.name = f.Name
-		}
-		return finfo, nil
-	}
-
-	// Prepare field name and parents.
-	parents := strings.Split(tag, ">")
-	if parents[0] == "" {
-		parents[0] = f.Name
-	}
-	if parents[len(parents)-1] == "" {
-		return nil, fmt.Errorf("xml: trailing '>' in field %s of type %s", f.Name, typ)
-	}
-	finfo.name = parents[len(parents)-1]
-	if len(parents) > 1 {
-		if (finfo.flags & fElement) == 0 {
-			return nil, fmt.Errorf("xml: %s chain not valid with %s flag", tag, strings.Join(tokens[1:], ","))
-		}
-		finfo.parents = parents[:len(parents)-1]
-	}
-
-	// If the field type has an XMLName field, the names must match
-	// so that the behavior of both marshalling and unmarshalling
-	// is straightforward and unambiguous.
-	if finfo.flags&fElement != 0 {
-		ftyp := f.Type
-		xmlname := lookupXMLName(ftyp)
-		if xmlname != nil && xmlname.name != finfo.name {
-			return nil, fmt.Errorf("xml: name %q in tag of %s.%s conflicts with name %q in %s.XMLName",
-				finfo.name, typ, f.Name, xmlname.name, ftyp)
-		}
-	}
-	return finfo, nil
-}
-
-// lookupXMLName returns the fieldInfo for typ's XMLName field
-// in case it exists and has a valid xml field tag, otherwise
-// it returns nil.
-func lookupXMLName(typ reflect.Type) (xmlname *fieldInfo) {
-	for typ.Kind() == reflect.Ptr {
-		typ = typ.Elem()
-	}
-	if typ.Kind() != reflect.Struct {
-		return nil
-	}
-	for i, n := 0, typ.NumField(); i < n; i++ {
-		f := typ.Field(i)
-		if f.Name != "XMLName" {
-			continue
-		}
-		finfo, err := structFieldInfo(typ, &f)
-		if finfo.name != "" && err == nil {
-			return finfo
-		}
-		// Also consider errors as a non-existent field tag
-		// and let getTypeInfo itself report the error.
-		break
-	}
-	return nil
-}
-
-func min(a, b int) int {
-	if a <= b {
-		return a
-	}
-	return b
-}
-
-// addFieldInfo adds finfo to tinfo.fields if there are no
-// conflicts, or if conflicts arise from previous fields that were
-// obtained from deeper embedded structures than finfo. In the latter
-// case, the conflicting entries are dropped.
-// A conflict occurs when the path (parent + name) to a field is
-// itself a prefix of another path, or when two paths match exactly.
-// It is okay for field paths to share a common, shorter prefix.
-func addFieldInfo(typ reflect.Type, tinfo *typeInfo, newf *fieldInfo) error {
-	var conflicts []int
-Loop:
-	// First, figure all conflicts. Most working code will have none.
-	for i := range tinfo.fields {
-		oldf := &tinfo.fields[i]
-		if oldf.flags&fMode != newf.flags&fMode {
-			continue
-		}
-		if oldf.xmlns != "" && newf.xmlns != "" && oldf.xmlns != newf.xmlns {
-			continue
-		}
-		minl := min(len(newf.parents), len(oldf.parents))
-		for p := 0; p < minl; p++ {
-			if oldf.parents[p] != newf.parents[p] {
-				continue Loop
-			}
-		}
-		if len(oldf.parents) > len(newf.parents) {
-			if oldf.parents[len(newf.parents)] == newf.name {
-				conflicts = append(conflicts, i)
-			}
-		} else if len(oldf.parents) < len(newf.parents) {
-			if newf.parents[len(oldf.parents)] == oldf.name {
-				conflicts = append(conflicts, i)
-			}
-		} else {
-			if newf.name == oldf.name {
-				conflicts = append(conflicts, i)
-			}
-		}
-	}
-	// Without conflicts, add the new field and return.
-	if conflicts == nil {
-		tinfo.fields = append(tinfo.fields, *newf)
-		return nil
-	}
-
-	// If any conflict is shallower, ignore the new field.
-	// This matches the Go field resolution on embedding.
-	for _, i := range conflicts {
-		if len(tinfo.fields[i].idx) < len(newf.idx) {
-			return nil
-		}
-	}
-
-	// Otherwise, if any of them is at the same depth level, it's an error.
-	for _, i := range conflicts {
-		oldf := &tinfo.fields[i]
-		if len(oldf.idx) == len(newf.idx) {
-			f1 := typ.FieldByIndex(oldf.idx)
-			f2 := typ.FieldByIndex(newf.idx)
-			return &TagPathError{typ, f1.Name, f1.Tag.Get("xml"), f2.Name, f2.Tag.Get("xml")}
-		}
-	}
-
-	// Otherwise, the new field is shallower, and thus takes precedence,
-	// so drop the conflicting fields from tinfo and append the new one.
-	for c := len(conflicts) - 1; c >= 0; c-- {
-		i := conflicts[c]
-		copy(tinfo.fields[i:], tinfo.fields[i+1:])
-		tinfo.fields = tinfo.fields[:len(tinfo.fields)-1]
-	}
-	tinfo.fields = append(tinfo.fields, *newf)
-	return nil
-}
-
-// A TagPathError represents an error in the unmarshalling process
-// caused by the use of field tags with conflicting paths.
-type TagPathError struct {
-	Struct       reflect.Type
-	Field1, Tag1 string
-	Field2, Tag2 string
-}
-
-func (e *TagPathError) Error() string {
-	return fmt.Sprintf("%s field %q with tag %q conflicts with field %q with tag %q", e.Struct, e.Field1, e.Tag1, e.Field2, e.Tag2)
-}
-
-// value returns v's field value corresponding to finfo.
-// It's equivalent to v.FieldByIndex(finfo.idx), but initializes
-// and dereferences pointers as necessary.
-func (finfo *fieldInfo) value(v reflect.Value) reflect.Value {
-	for i, x := range finfo.idx {
-		if i > 0 {
-			t := v.Type()
-			if t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Struct {
-				if v.IsNil() {
-					v.Set(reflect.New(v.Type().Elem()))
-				}
-				v = v.Elem()
-			}
-		}
-		v = v.Field(x)
-	}
-	return v
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/xml/xml.go b/third_party/gofrontend/libgo/go/encoding/xml/xml.go
deleted file mode 100644
index 0a21c93..0000000
--- a/third_party/gofrontend/libgo/go/encoding/xml/xml.go
+++ /dev/null
@@ -1,1965 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package xml implements a simple XML 1.0 parser that
-// understands XML name spaces.
-package xml
-
-// References:
-//    Annotated XML spec: http://www.xml.com/axml/testaxml.htm
-//    XML name spaces: http://www.w3.org/TR/REC-xml-names/
-
-// TODO(rsc):
-//	Test error handling.
-
-import (
-	"bufio"
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"strconv"
-	"strings"
-	"unicode"
-	"unicode/utf8"
-)
-
-// A SyntaxError represents a syntax error in the XML input stream.
-type SyntaxError struct {
-	Msg  string
-	Line int
-}
-
-func (e *SyntaxError) Error() string {
-	return "XML syntax error on line " + strconv.Itoa(e.Line) + ": " + e.Msg
-}
-
-// A Name represents an XML name (Local) annotated
-// with a name space identifier (Space).
-// In tokens returned by Decoder.Token, the Space identifier
-// is given as a canonical URL, not the short prefix used
-// in the document being parsed.
-type Name struct {
-	Space, Local string
-}
-
-// An Attr represents an attribute in an XML element (Name=Value).
-type Attr struct {
-	Name  Name
-	Value string
-}
-
-// A Token is an interface holding one of the token types:
-// StartElement, EndElement, CharData, Comment, ProcInst, or Directive.
-type Token interface{}
-
-// A StartElement represents an XML start element.
-type StartElement struct {
-	Name Name
-	Attr []Attr
-}
-
-func (e StartElement) Copy() StartElement {
-	attrs := make([]Attr, len(e.Attr))
-	copy(attrs, e.Attr)
-	e.Attr = attrs
-	return e
-}
-
-// End returns the corresponding XML end element.
-func (e StartElement) End() EndElement {
-	return EndElement{e.Name}
-}
-
-// An EndElement represents an XML end element.
-type EndElement struct {
-	Name Name
-}
-
-// A CharData represents XML character data (raw text),
-// in which XML escape sequences have been replaced by
-// the characters they represent.
-type CharData []byte
-
-func makeCopy(b []byte) []byte {
-	b1 := make([]byte, len(b))
-	copy(b1, b)
-	return b1
-}
-
-func (c CharData) Copy() CharData { return CharData(makeCopy(c)) }
-
-// A Comment represents an XML comment of the form <!--comment-->.
-// The bytes do not include the <!-- and --> comment markers.
-type Comment []byte
-
-func (c Comment) Copy() Comment { return Comment(makeCopy(c)) }
-
-// A ProcInst represents an XML processing instruction of the form <?target inst?>
-type ProcInst struct {
-	Target string
-	Inst   []byte
-}
-
-func (p ProcInst) Copy() ProcInst {
-	p.Inst = makeCopy(p.Inst)
-	return p
-}
-
-// A Directive represents an XML directive of the form <!text>.
-// The bytes do not include the <! and > markers.
-type Directive []byte
-
-func (d Directive) Copy() Directive { return Directive(makeCopy(d)) }
-
-// CopyToken returns a copy of a Token.
-func CopyToken(t Token) Token {
-	switch v := t.(type) {
-	case CharData:
-		return v.Copy()
-	case Comment:
-		return v.Copy()
-	case Directive:
-		return v.Copy()
-	case ProcInst:
-		return v.Copy()
-	case StartElement:
-		return v.Copy()
-	}
-	return t
-}
-
-// A Decoder represents an XML parser reading a particular input stream.
-// The parser assumes that its input is encoded in UTF-8.
-type Decoder struct {
-	// Strict defaults to true, enforcing the requirements
-	// of the XML specification.
-	// If set to false, the parser allows input containing common
-	// mistakes:
-	//	* If an element is missing an end tag, the parser invents
-	//	  end tags as necessary to keep the return values from Token
-	//	  properly balanced.
-	//	* In attribute values and character data, unknown or malformed
-	//	  character entities (sequences beginning with &) are left alone.
-	//
-	// Setting:
-	//
-	//	d.Strict = false;
-	//	d.AutoClose = HTMLAutoClose;
-	//	d.Entity = HTMLEntity
-	//
-	// creates a parser that can handle typical HTML.
-	//
-	// Strict mode does not enforce the requirements of the XML name spaces TR.
-	// In particular it does not reject name space tags using undefined prefixes.
-	// Such tags are recorded with the unknown prefix as the name space URL.
-	Strict bool
-
-	// When Strict == false, AutoClose indicates a set of elements to
-	// consider closed immediately after they are opened, regardless
-	// of whether an end element is present.
-	AutoClose []string
-
-	// Entity can be used to map non-standard entity names to string replacements.
-	// The parser behaves as if these standard mappings are present in the map,
-	// regardless of the actual map content:
-	//
-	//	"lt": "<",
-	//	"gt": ">",
-	//	"amp": "&",
-	//	"apos": "'",
-	//	"quot": `"`,
-	Entity map[string]string
-
-	// CharsetReader, if non-nil, defines a function to generate
-	// charset-conversion readers, converting from the provided
-	// non-UTF-8 charset into UTF-8. If CharsetReader is nil or
-	// returns an error, parsing stops with an error. One of the
-	// the CharsetReader's result values must be non-nil.
-	CharsetReader func(charset string, input io.Reader) (io.Reader, error)
-
-	// DefaultSpace sets the default name space used for unadorned tags,
-	// as if the entire XML stream were wrapped in an element containing
-	// the attribute xmlns="DefaultSpace".
-	DefaultSpace string
-
-	r              io.ByteReader
-	buf            bytes.Buffer
-	saved          *bytes.Buffer
-	stk            *stack
-	free           *stack
-	needClose      bool
-	toClose        Name
-	nextToken      Token
-	nextByte       int
-	ns             map[string]string
-	err            error
-	line           int
-	offset         int64
-	unmarshalDepth int
-}
-
-// NewDecoder creates a new XML parser reading from r.
-// If r does not implement io.ByteReader, NewDecoder will
-// do its own buffering.
-func NewDecoder(r io.Reader) *Decoder {
-	d := &Decoder{
-		ns:       make(map[string]string),
-		nextByte: -1,
-		line:     1,
-		Strict:   true,
-	}
-	d.switchToReader(r)
-	return d
-}
-
-// Token returns the next XML token in the input stream.
-// At the end of the input stream, Token returns nil, io.EOF.
-//
-// Slices of bytes in the returned token data refer to the
-// parser's internal buffer and remain valid only until the next
-// call to Token.  To acquire a copy of the bytes, call CopyToken
-// or the token's Copy method.
-//
-// Token expands self-closing elements such as <br/>
-// into separate start and end elements returned by successive calls.
-//
-// Token guarantees that the StartElement and EndElement
-// tokens it returns are properly nested and matched:
-// if Token encounters an unexpected end element,
-// it will return an error.
-//
-// Token implements XML name spaces as described by
-// http://www.w3.org/TR/REC-xml-names/.  Each of the
-// Name structures contained in the Token has the Space
-// set to the URL identifying its name space when known.
-// If Token encounters an unrecognized name space prefix,
-// it uses the prefix as the Space rather than report an error.
-func (d *Decoder) Token() (t Token, err error) {
-	if d.stk != nil && d.stk.kind == stkEOF {
-		err = io.EOF
-		return
-	}
-	if d.nextToken != nil {
-		t = d.nextToken
-		d.nextToken = nil
-	} else if t, err = d.rawToken(); err != nil {
-		return
-	}
-
-	if !d.Strict {
-		if t1, ok := d.autoClose(t); ok {
-			d.nextToken = t
-			t = t1
-		}
-	}
-	switch t1 := t.(type) {
-	case StartElement:
-		// In XML name spaces, the translations listed in the
-		// attributes apply to the element name and
-		// to the other attribute names, so process
-		// the translations first.
-		for _, a := range t1.Attr {
-			if a.Name.Space == "xmlns" {
-				v, ok := d.ns[a.Name.Local]
-				d.pushNs(a.Name.Local, v, ok)
-				d.ns[a.Name.Local] = a.Value
-			}
-			if a.Name.Space == "" && a.Name.Local == "xmlns" {
-				// Default space for untagged names
-				v, ok := d.ns[""]
-				d.pushNs("", v, ok)
-				d.ns[""] = a.Value
-			}
-		}
-
-		d.translate(&t1.Name, true)
-		for i := range t1.Attr {
-			d.translate(&t1.Attr[i].Name, false)
-		}
-		d.pushElement(t1.Name)
-		t = t1
-
-	case EndElement:
-		d.translate(&t1.Name, true)
-		if !d.popElement(&t1) {
-			return nil, d.err
-		}
-		t = t1
-	}
-	return
-}
-
-const xmlURL = "http://www.w3.org/XML/1998/namespace"
-
-// Apply name space translation to name n.
-// The default name space (for Space=="")
-// applies only to element names, not to attribute names.
-func (d *Decoder) translate(n *Name, isElementName bool) {
-	switch {
-	case n.Space == "xmlns":
-		return
-	case n.Space == "" && !isElementName:
-		return
-	case n.Space == "xml":
-		n.Space = xmlURL
-	case n.Space == "" && n.Local == "xmlns":
-		return
-	}
-	if v, ok := d.ns[n.Space]; ok {
-		n.Space = v
-	} else if n.Space == "" {
-		n.Space = d.DefaultSpace
-	}
-}
-
-func (d *Decoder) switchToReader(r io.Reader) {
-	// Get efficient byte at a time reader.
-	// Assume that if reader has its own
-	// ReadByte, it's efficient enough.
-	// Otherwise, use bufio.
-	if rb, ok := r.(io.ByteReader); ok {
-		d.r = rb
-	} else {
-		d.r = bufio.NewReader(r)
-	}
-}
-
-// Parsing state - stack holds old name space translations
-// and the current set of open elements.  The translations to pop when
-// ending a given tag are *below* it on the stack, which is
-// more work but forced on us by XML.
-type stack struct {
-	next *stack
-	kind int
-	name Name
-	ok   bool
-}
-
-const (
-	stkStart = iota
-	stkNs
-	stkEOF
-)
-
-func (d *Decoder) push(kind int) *stack {
-	s := d.free
-	if s != nil {
-		d.free = s.next
-	} else {
-		s = new(stack)
-	}
-	s.next = d.stk
-	s.kind = kind
-	d.stk = s
-	return s
-}
-
-func (d *Decoder) pop() *stack {
-	s := d.stk
-	if s != nil {
-		d.stk = s.next
-		s.next = d.free
-		d.free = s
-	}
-	return s
-}
-
-// Record that after the current element is finished
-// (that element is already pushed on the stack)
-// Token should return EOF until popEOF is called.
-func (d *Decoder) pushEOF() {
-	// Walk down stack to find Start.
-	// It might not be the top, because there might be stkNs
-	// entries above it.
-	start := d.stk
-	for start.kind != stkStart {
-		start = start.next
-	}
-	// The stkNs entries below a start are associated with that
-	// element too; skip over them.
-	for start.next != nil && start.next.kind == stkNs {
-		start = start.next
-	}
-	s := d.free
-	if s != nil {
-		d.free = s.next
-	} else {
-		s = new(stack)
-	}
-	s.kind = stkEOF
-	s.next = start.next
-	start.next = s
-}
-
-// Undo a pushEOF.
-// The element must have been finished, so the EOF should be at the top of the stack.
-func (d *Decoder) popEOF() bool {
-	if d.stk == nil || d.stk.kind != stkEOF {
-		return false
-	}
-	d.pop()
-	return true
-}
-
-// Record that we are starting an element with the given name.
-func (d *Decoder) pushElement(name Name) {
-	s := d.push(stkStart)
-	s.name = name
-}
-
-// Record that we are changing the value of ns[local].
-// The old value is url, ok.
-func (d *Decoder) pushNs(local string, url string, ok bool) {
-	s := d.push(stkNs)
-	s.name.Local = local
-	s.name.Space = url
-	s.ok = ok
-}
-
-// Creates a SyntaxError with the current line number.
-func (d *Decoder) syntaxError(msg string) error {
-	return &SyntaxError{Msg: msg, Line: d.line}
-}
-
-// Record that we are ending an element with the given name.
-// The name must match the record at the top of the stack,
-// which must be a pushElement record.
-// After popping the element, apply any undo records from
-// the stack to restore the name translations that existed
-// before we saw this element.
-func (d *Decoder) popElement(t *EndElement) bool {
-	s := d.pop()
-	name := t.Name
-	switch {
-	case s == nil || s.kind != stkStart:
-		d.err = d.syntaxError("unexpected end element </" + name.Local + ">")
-		return false
-	case s.name.Local != name.Local:
-		if !d.Strict {
-			d.needClose = true
-			d.toClose = t.Name
-			t.Name = s.name
-			return true
-		}
-		d.err = d.syntaxError("element <" + s.name.Local + "> closed by </" + name.Local + ">")
-		return false
-	case s.name.Space != name.Space:
-		d.err = d.syntaxError("element <" + s.name.Local + "> in space " + s.name.Space +
-			"closed by </" + name.Local + "> in space " + name.Space)
-		return false
-	}
-
-	// Pop stack until a Start or EOF is on the top, undoing the
-	// translations that were associated with the element we just closed.
-	for d.stk != nil && d.stk.kind != stkStart && d.stk.kind != stkEOF {
-		s := d.pop()
-		if s.ok {
-			d.ns[s.name.Local] = s.name.Space
-		} else {
-			delete(d.ns, s.name.Local)
-		}
-	}
-
-	return true
-}
-
-// If the top element on the stack is autoclosing and
-// t is not the end tag, invent the end tag.
-func (d *Decoder) autoClose(t Token) (Token, bool) {
-	if d.stk == nil || d.stk.kind != stkStart {
-		return nil, false
-	}
-	name := strings.ToLower(d.stk.name.Local)
-	for _, s := range d.AutoClose {
-		if strings.ToLower(s) == name {
-			// This one should be auto closed if t doesn't close it.
-			et, ok := t.(EndElement)
-			if !ok || et.Name.Local != name {
-				return EndElement{d.stk.name}, true
-			}
-			break
-		}
-	}
-	return nil, false
-}
-
-var errRawToken = errors.New("xml: cannot use RawToken from UnmarshalXML method")
-
-// RawToken is like Token but does not verify that
-// start and end elements match and does not translate
-// name space prefixes to their corresponding URLs.
-func (d *Decoder) RawToken() (Token, error) {
-	if d.unmarshalDepth > 0 {
-		return nil, errRawToken
-	}
-	return d.rawToken()
-}
-
-func (d *Decoder) rawToken() (Token, error) {
-	if d.err != nil {
-		return nil, d.err
-	}
-	if d.needClose {
-		// The last element we read was self-closing and
-		// we returned just the StartElement half.
-		// Return the EndElement half now.
-		d.needClose = false
-		return EndElement{d.toClose}, nil
-	}
-
-	b, ok := d.getc()
-	if !ok {
-		return nil, d.err
-	}
-
-	if b != '<' {
-		// Text section.
-		d.ungetc(b)
-		data := d.text(-1, false)
-		if data == nil {
-			return nil, d.err
-		}
-		return CharData(data), nil
-	}
-
-	if b, ok = d.mustgetc(); !ok {
-		return nil, d.err
-	}
-	switch b {
-	case '/':
-		// </: End element
-		var name Name
-		if name, ok = d.nsname(); !ok {
-			if d.err == nil {
-				d.err = d.syntaxError("expected element name after </")
-			}
-			return nil, d.err
-		}
-		d.space()
-		if b, ok = d.mustgetc(); !ok {
-			return nil, d.err
-		}
-		if b != '>' {
-			d.err = d.syntaxError("invalid characters between </" + name.Local + " and >")
-			return nil, d.err
-		}
-		return EndElement{name}, nil
-
-	case '?':
-		// <?: Processing instruction.
-		var target string
-		if target, ok = d.name(); !ok {
-			if d.err == nil {
-				d.err = d.syntaxError("expected target name after <?")
-			}
-			return nil, d.err
-		}
-		d.space()
-		d.buf.Reset()
-		var b0 byte
-		for {
-			if b, ok = d.mustgetc(); !ok {
-				return nil, d.err
-			}
-			d.buf.WriteByte(b)
-			if b0 == '?' && b == '>' {
-				break
-			}
-			b0 = b
-		}
-		data := d.buf.Bytes()
-		data = data[0 : len(data)-2] // chop ?>
-
-		if target == "xml" {
-			content := string(data)
-			ver := procInst("version", content)
-			if ver != "" && ver != "1.0" {
-				d.err = fmt.Errorf("xml: unsupported version %q; only version 1.0 is supported", ver)
-				return nil, d.err
-			}
-			enc := procInst("encoding", content)
-			if enc != "" && enc != "utf-8" && enc != "UTF-8" {
-				if d.CharsetReader == nil {
-					d.err = fmt.Errorf("xml: encoding %q declared but Decoder.CharsetReader is nil", enc)
-					return nil, d.err
-				}
-				newr, err := d.CharsetReader(enc, d.r.(io.Reader))
-				if err != nil {
-					d.err = fmt.Errorf("xml: opening charset %q: %v", enc, err)
-					return nil, d.err
-				}
-				if newr == nil {
-					panic("CharsetReader returned a nil Reader for charset " + enc)
-				}
-				d.switchToReader(newr)
-			}
-		}
-		return ProcInst{target, data}, nil
-
-	case '!':
-		// <!: Maybe comment, maybe CDATA.
-		if b, ok = d.mustgetc(); !ok {
-			return nil, d.err
-		}
-		switch b {
-		case '-': // <!-
-			// Probably <!-- for a comment.
-			if b, ok = d.mustgetc(); !ok {
-				return nil, d.err
-			}
-			if b != '-' {
-				d.err = d.syntaxError("invalid sequence <!- not part of <!--")
-				return nil, d.err
-			}
-			// Look for terminator.
-			d.buf.Reset()
-			var b0, b1 byte
-			for {
-				if b, ok = d.mustgetc(); !ok {
-					return nil, d.err
-				}
-				d.buf.WriteByte(b)
-				if b0 == '-' && b1 == '-' && b == '>' {
-					break
-				}
-				b0, b1 = b1, b
-			}
-			data := d.buf.Bytes()
-			data = data[0 : len(data)-3] // chop -->
-			return Comment(data), nil
-
-		case '[': // <![
-			// Probably <![CDATA[.
-			for i := 0; i < 6; i++ {
-				if b, ok = d.mustgetc(); !ok {
-					return nil, d.err
-				}
-				if b != "CDATA["[i] {
-					d.err = d.syntaxError("invalid <![ sequence")
-					return nil, d.err
-				}
-			}
-			// Have <![CDATA[.  Read text until ]]>.
-			data := d.text(-1, true)
-			if data == nil {
-				return nil, d.err
-			}
-			return CharData(data), nil
-		}
-
-		// Probably a directive: <!DOCTYPE ...>, <!ENTITY ...>, etc.
-		// We don't care, but accumulate for caller. Quoted angle
-		// brackets do not count for nesting.
-		d.buf.Reset()
-		d.buf.WriteByte(b)
-		inquote := uint8(0)
-		depth := 0
-		for {
-			if b, ok = d.mustgetc(); !ok {
-				return nil, d.err
-			}
-			if inquote == 0 && b == '>' && depth == 0 {
-				break
-			}
-		HandleB:
-			d.buf.WriteByte(b)
-			switch {
-			case b == inquote:
-				inquote = 0
-
-			case inquote != 0:
-				// in quotes, no special action
-
-			case b == '\'' || b == '"':
-				inquote = b
-
-			case b == '>' && inquote == 0:
-				depth--
-
-			case b == '<' && inquote == 0:
-				// Look for <!-- to begin comment.
-				s := "!--"
-				for i := 0; i < len(s); i++ {
-					if b, ok = d.mustgetc(); !ok {
-						return nil, d.err
-					}
-					if b != s[i] {
-						for j := 0; j < i; j++ {
-							d.buf.WriteByte(s[j])
-						}
-						depth++
-						goto HandleB
-					}
-				}
-
-				// Remove < that was written above.
-				d.buf.Truncate(d.buf.Len() - 1)
-
-				// Look for terminator.
-				var b0, b1 byte
-				for {
-					if b, ok = d.mustgetc(); !ok {
-						return nil, d.err
-					}
-					if b0 == '-' && b1 == '-' && b == '>' {
-						break
-					}
-					b0, b1 = b1, b
-				}
-			}
-		}
-		return Directive(d.buf.Bytes()), nil
-	}
-
-	// Must be an open element like <a href="foo">
-	d.ungetc(b)
-
-	var (
-		name  Name
-		empty bool
-		attr  []Attr
-	)
-	if name, ok = d.nsname(); !ok {
-		if d.err == nil {
-			d.err = d.syntaxError("expected element name after <")
-		}
-		return nil, d.err
-	}
-
-	attr = []Attr{}
-	for {
-		d.space()
-		if b, ok = d.mustgetc(); !ok {
-			return nil, d.err
-		}
-		if b == '/' {
-			empty = true
-			if b, ok = d.mustgetc(); !ok {
-				return nil, d.err
-			}
-			if b != '>' {
-				d.err = d.syntaxError("expected /> in element")
-				return nil, d.err
-			}
-			break
-		}
-		if b == '>' {
-			break
-		}
-		d.ungetc(b)
-
-		n := len(attr)
-		if n >= cap(attr) {
-			nCap := 2 * cap(attr)
-			if nCap == 0 {
-				nCap = 4
-			}
-			nattr := make([]Attr, n, nCap)
-			copy(nattr, attr)
-			attr = nattr
-		}
-		attr = attr[0 : n+1]
-		a := &attr[n]
-		if a.Name, ok = d.nsname(); !ok {
-			if d.err == nil {
-				d.err = d.syntaxError("expected attribute name in element")
-			}
-			return nil, d.err
-		}
-		d.space()
-		if b, ok = d.mustgetc(); !ok {
-			return nil, d.err
-		}
-		if b != '=' {
-			if d.Strict {
-				d.err = d.syntaxError("attribute name without = in element")
-				return nil, d.err
-			} else {
-				d.ungetc(b)
-				a.Value = a.Name.Local
-			}
-		} else {
-			d.space()
-			data := d.attrval()
-			if data == nil {
-				return nil, d.err
-			}
-			a.Value = string(data)
-		}
-	}
-	if empty {
-		d.needClose = true
-		d.toClose = name
-	}
-	return StartElement{name, attr}, nil
-}
-
-func (d *Decoder) attrval() []byte {
-	b, ok := d.mustgetc()
-	if !ok {
-		return nil
-	}
-	// Handle quoted attribute values
-	if b == '"' || b == '\'' {
-		return d.text(int(b), false)
-	}
-	// Handle unquoted attribute values for strict parsers
-	if d.Strict {
-		d.err = d.syntaxError("unquoted or missing attribute value in element")
-		return nil
-	}
-	// Handle unquoted attribute values for unstrict parsers
-	d.ungetc(b)
-	d.buf.Reset()
-	for {
-		b, ok = d.mustgetc()
-		if !ok {
-			return nil
-		}
-		// http://www.w3.org/TR/REC-html40/intro/sgmltut.html#h-3.2.2
-		if 'a' <= b && b <= 'z' || 'A' <= b && b <= 'Z' ||
-			'0' <= b && b <= '9' || b == '_' || b == ':' || b == '-' {
-			d.buf.WriteByte(b)
-		} else {
-			d.ungetc(b)
-			break
-		}
-	}
-	return d.buf.Bytes()
-}
-
-// Skip spaces if any
-func (d *Decoder) space() {
-	for {
-		b, ok := d.getc()
-		if !ok {
-			return
-		}
-		switch b {
-		case ' ', '\r', '\n', '\t':
-		default:
-			d.ungetc(b)
-			return
-		}
-	}
-}
-
-// Read a single byte.
-// If there is no byte to read, return ok==false
-// and leave the error in d.err.
-// Maintain line number.
-func (d *Decoder) getc() (b byte, ok bool) {
-	if d.err != nil {
-		return 0, false
-	}
-	if d.nextByte >= 0 {
-		b = byte(d.nextByte)
-		d.nextByte = -1
-	} else {
-		b, d.err = d.r.ReadByte()
-		if d.err != nil {
-			return 0, false
-		}
-		if d.saved != nil {
-			d.saved.WriteByte(b)
-		}
-	}
-	if b == '\n' {
-		d.line++
-	}
-	d.offset++
-	return b, true
-}
-
-// InputOffset returns the input stream byte offset of the current decoder position.
-// The offset gives the location of the end of the most recently returned token
-// and the beginning of the next token.
-func (d *Decoder) InputOffset() int64 {
-	return d.offset
-}
-
-// Return saved offset.
-// If we did ungetc (nextByte >= 0), have to back up one.
-func (d *Decoder) savedOffset() int {
-	n := d.saved.Len()
-	if d.nextByte >= 0 {
-		n--
-	}
-	return n
-}
-
-// Must read a single byte.
-// If there is no byte to read,
-// set d.err to SyntaxError("unexpected EOF")
-// and return ok==false
-func (d *Decoder) mustgetc() (b byte, ok bool) {
-	if b, ok = d.getc(); !ok {
-		if d.err == io.EOF {
-			d.err = d.syntaxError("unexpected EOF")
-		}
-	}
-	return
-}
-
-// Unread a single byte.
-func (d *Decoder) ungetc(b byte) {
-	if b == '\n' {
-		d.line--
-	}
-	d.nextByte = int(b)
-	d.offset--
-}
-
-var entity = map[string]int{
-	"lt":   '<',
-	"gt":   '>',
-	"amp":  '&',
-	"apos": '\'',
-	"quot": '"',
-}
-
-// Read plain text section (XML calls it character data).
-// If quote >= 0, we are in a quoted string and need to find the matching quote.
-// If cdata == true, we are in a <![CDATA[ section and need to find ]]>.
-// On failure return nil and leave the error in d.err.
-func (d *Decoder) text(quote int, cdata bool) []byte {
-	var b0, b1 byte
-	var trunc int
-	d.buf.Reset()
-Input:
-	for {
-		b, ok := d.getc()
-		if !ok {
-			if cdata {
-				if d.err == io.EOF {
-					d.err = d.syntaxError("unexpected EOF in CDATA section")
-				}
-				return nil
-			}
-			break Input
-		}
-
-		// <![CDATA[ section ends with ]]>.
-		// It is an error for ]]> to appear in ordinary text.
-		if b0 == ']' && b1 == ']' && b == '>' {
-			if cdata {
-				trunc = 2
-				break Input
-			}
-			d.err = d.syntaxError("unescaped ]]> not in CDATA section")
-			return nil
-		}
-
-		// Stop reading text if we see a <.
-		if b == '<' && !cdata {
-			if quote >= 0 {
-				d.err = d.syntaxError("unescaped < inside quoted string")
-				return nil
-			}
-			d.ungetc('<')
-			break Input
-		}
-		if quote >= 0 && b == byte(quote) {
-			break Input
-		}
-		if b == '&' && !cdata {
-			// Read escaped character expression up to semicolon.
-			// XML in all its glory allows a document to define and use
-			// its own character names with <!ENTITY ...> directives.
-			// Parsers are required to recognize lt, gt, amp, apos, and quot
-			// even if they have not been declared.
-			before := d.buf.Len()
-			d.buf.WriteByte('&')
-			var ok bool
-			var text string
-			var haveText bool
-			if b, ok = d.mustgetc(); !ok {
-				return nil
-			}
-			if b == '#' {
-				d.buf.WriteByte(b)
-				if b, ok = d.mustgetc(); !ok {
-					return nil
-				}
-				base := 10
-				if b == 'x' {
-					base = 16
-					d.buf.WriteByte(b)
-					if b, ok = d.mustgetc(); !ok {
-						return nil
-					}
-				}
-				start := d.buf.Len()
-				for '0' <= b && b <= '9' ||
-					base == 16 && 'a' <= b && b <= 'f' ||
-					base == 16 && 'A' <= b && b <= 'F' {
-					d.buf.WriteByte(b)
-					if b, ok = d.mustgetc(); !ok {
-						return nil
-					}
-				}
-				if b != ';' {
-					d.ungetc(b)
-				} else {
-					s := string(d.buf.Bytes()[start:])
-					d.buf.WriteByte(';')
-					n, err := strconv.ParseUint(s, base, 64)
-					if err == nil && n <= unicode.MaxRune {
-						text = string(n)
-						haveText = true
-					}
-				}
-			} else {
-				d.ungetc(b)
-				if !d.readName() {
-					if d.err != nil {
-						return nil
-					}
-					ok = false
-				}
-				if b, ok = d.mustgetc(); !ok {
-					return nil
-				}
-				if b != ';' {
-					d.ungetc(b)
-				} else {
-					name := d.buf.Bytes()[before+1:]
-					d.buf.WriteByte(';')
-					if isName(name) {
-						s := string(name)
-						if r, ok := entity[s]; ok {
-							text = string(r)
-							haveText = true
-						} else if d.Entity != nil {
-							text, haveText = d.Entity[s]
-						}
-					}
-				}
-			}
-
-			if haveText {
-				d.buf.Truncate(before)
-				d.buf.Write([]byte(text))
-				b0, b1 = 0, 0
-				continue Input
-			}
-			if !d.Strict {
-				b0, b1 = 0, 0
-				continue Input
-			}
-			ent := string(d.buf.Bytes()[before:])
-			if ent[len(ent)-1] != ';' {
-				ent += " (no semicolon)"
-			}
-			d.err = d.syntaxError("invalid character entity " + ent)
-			return nil
-		}
-
-		// We must rewrite unescaped \r and \r\n into \n.
-		if b == '\r' {
-			d.buf.WriteByte('\n')
-		} else if b1 == '\r' && b == '\n' {
-			// Skip \r\n--we already wrote \n.
-		} else {
-			d.buf.WriteByte(b)
-		}
-
-		b0, b1 = b1, b
-	}
-	data := d.buf.Bytes()
-	data = data[0 : len(data)-trunc]
-
-	// Inspect each rune for being a disallowed character.
-	buf := data
-	for len(buf) > 0 {
-		r, size := utf8.DecodeRune(buf)
-		if r == utf8.RuneError && size == 1 {
-			d.err = d.syntaxError("invalid UTF-8")
-			return nil
-		}
-		buf = buf[size:]
-		if !isInCharacterRange(r) {
-			d.err = d.syntaxError(fmt.Sprintf("illegal character code %U", r))
-			return nil
-		}
-	}
-
-	return data
-}
-
-// Decide whether the given rune is in the XML Character Range, per
-// the Char production of http://www.xml.com/axml/testaxml.htm,
-// Section 2.2 Characters.
-func isInCharacterRange(r rune) (inrange bool) {
-	return r == 0x09 ||
-		r == 0x0A ||
-		r == 0x0D ||
-		r >= 0x20 && r <= 0xDF77 ||
-		r >= 0xE000 && r <= 0xFFFD ||
-		r >= 0x10000 && r <= 0x10FFFF
-}
-
-// Get name space name: name with a : stuck in the middle.
-// The part before the : is the name space identifier.
-func (d *Decoder) nsname() (name Name, ok bool) {
-	s, ok := d.name()
-	if !ok {
-		return
-	}
-	i := strings.Index(s, ":")
-	if i < 0 {
-		name.Local = s
-	} else {
-		name.Space = s[0:i]
-		name.Local = s[i+1:]
-	}
-	return name, true
-}
-
-// Get name: /first(first|second)*/
-// Do not set d.err if the name is missing (unless unexpected EOF is received):
-// let the caller provide better context.
-func (d *Decoder) name() (s string, ok bool) {
-	d.buf.Reset()
-	if !d.readName() {
-		return "", false
-	}
-
-	// Now we check the characters.
-	b := d.buf.Bytes()
-	if !isName(b) {
-		d.err = d.syntaxError("invalid XML name: " + string(b))
-		return "", false
-	}
-	return string(b), true
-}
-
-// Read a name and append its bytes to d.buf.
-// The name is delimited by any single-byte character not valid in names.
-// All multi-byte characters are accepted; the caller must check their validity.
-func (d *Decoder) readName() (ok bool) {
-	var b byte
-	if b, ok = d.mustgetc(); !ok {
-		return
-	}
-	if b < utf8.RuneSelf && !isNameByte(b) {
-		d.ungetc(b)
-		return false
-	}
-	d.buf.WriteByte(b)
-
-	for {
-		if b, ok = d.mustgetc(); !ok {
-			return
-		}
-		if b < utf8.RuneSelf && !isNameByte(b) {
-			d.ungetc(b)
-			break
-		}
-		d.buf.WriteByte(b)
-	}
-	return true
-}
-
-func isNameByte(c byte) bool {
-	return 'A' <= c && c <= 'Z' ||
-		'a' <= c && c <= 'z' ||
-		'0' <= c && c <= '9' ||
-		c == '_' || c == ':' || c == '.' || c == '-'
-}
-
-func isName(s []byte) bool {
-	if len(s) == 0 {
-		return false
-	}
-	c, n := utf8.DecodeRune(s)
-	if c == utf8.RuneError && n == 1 {
-		return false
-	}
-	if !unicode.Is(first, c) {
-		return false
-	}
-	for n < len(s) {
-		s = s[n:]
-		c, n = utf8.DecodeRune(s)
-		if c == utf8.RuneError && n == 1 {
-			return false
-		}
-		if !unicode.Is(first, c) && !unicode.Is(second, c) {
-			return false
-		}
-	}
-	return true
-}
-
-func isNameString(s string) bool {
-	if len(s) == 0 {
-		return false
-	}
-	c, n := utf8.DecodeRuneInString(s)
-	if c == utf8.RuneError && n == 1 {
-		return false
-	}
-	if !unicode.Is(first, c) {
-		return false
-	}
-	for n < len(s) {
-		s = s[n:]
-		c, n = utf8.DecodeRuneInString(s)
-		if c == utf8.RuneError && n == 1 {
-			return false
-		}
-		if !unicode.Is(first, c) && !unicode.Is(second, c) {
-			return false
-		}
-	}
-	return true
-}
-
-// These tables were generated by cut and paste from Appendix B of
-// the XML spec at http://www.xml.com/axml/testaxml.htm
-// and then reformatting.  First corresponds to (Letter | '_' | ':')
-// and second corresponds to NameChar.
-
-var first = &unicode.RangeTable{
-	R16: []unicode.Range16{
-		{0x003A, 0x003A, 1},
-		{0x0041, 0x005A, 1},
-		{0x005F, 0x005F, 1},
-		{0x0061, 0x007A, 1},
-		{0x00C0, 0x00D6, 1},
-		{0x00D8, 0x00F6, 1},
-		{0x00F8, 0x00FF, 1},
-		{0x0100, 0x0131, 1},
-		{0x0134, 0x013E, 1},
-		{0x0141, 0x0148, 1},
-		{0x014A, 0x017E, 1},
-		{0x0180, 0x01C3, 1},
-		{0x01CD, 0x01F0, 1},
-		{0x01F4, 0x01F5, 1},
-		{0x01FA, 0x0217, 1},
-		{0x0250, 0x02A8, 1},
-		{0x02BB, 0x02C1, 1},
-		{0x0386, 0x0386, 1},
-		{0x0388, 0x038A, 1},
-		{0x038C, 0x038C, 1},
-		{0x038E, 0x03A1, 1},
-		{0x03A3, 0x03CE, 1},
-		{0x03D0, 0x03D6, 1},
-		{0x03DA, 0x03E0, 2},
-		{0x03E2, 0x03F3, 1},
-		{0x0401, 0x040C, 1},
-		{0x040E, 0x044F, 1},
-		{0x0451, 0x045C, 1},
-		{0x045E, 0x0481, 1},
-		{0x0490, 0x04C4, 1},
-		{0x04C7, 0x04C8, 1},
-		{0x04CB, 0x04CC, 1},
-		{0x04D0, 0x04EB, 1},
-		{0x04EE, 0x04F5, 1},
-		{0x04F8, 0x04F9, 1},
-		{0x0531, 0x0556, 1},
-		{0x0559, 0x0559, 1},
-		{0x0561, 0x0586, 1},
-		{0x05D0, 0x05EA, 1},
-		{0x05F0, 0x05F2, 1},
-		{0x0621, 0x063A, 1},
-		{0x0641, 0x064A, 1},
-		{0x0671, 0x06B7, 1},
-		{0x06BA, 0x06BE, 1},
-		{0x06C0, 0x06CE, 1},
-		{0x06D0, 0x06D3, 1},
-		{0x06D5, 0x06D5, 1},
-		{0x06E5, 0x06E6, 1},
-		{0x0905, 0x0939, 1},
-		{0x093D, 0x093D, 1},
-		{0x0958, 0x0961, 1},
-		{0x0985, 0x098C, 1},
-		{0x098F, 0x0990, 1},
-		{0x0993, 0x09A8, 1},
-		{0x09AA, 0x09B0, 1},
-		{0x09B2, 0x09B2, 1},
-		{0x09B6, 0x09B9, 1},
-		{0x09DC, 0x09DD, 1},
-		{0x09DF, 0x09E1, 1},
-		{0x09F0, 0x09F1, 1},
-		{0x0A05, 0x0A0A, 1},
-		{0x0A0F, 0x0A10, 1},
-		{0x0A13, 0x0A28, 1},
-		{0x0A2A, 0x0A30, 1},
-		{0x0A32, 0x0A33, 1},
-		{0x0A35, 0x0A36, 1},
-		{0x0A38, 0x0A39, 1},
-		{0x0A59, 0x0A5C, 1},
-		{0x0A5E, 0x0A5E, 1},
-		{0x0A72, 0x0A74, 1},
-		{0x0A85, 0x0A8B, 1},
-		{0x0A8D, 0x0A8D, 1},
-		{0x0A8F, 0x0A91, 1},
-		{0x0A93, 0x0AA8, 1},
-		{0x0AAA, 0x0AB0, 1},
-		{0x0AB2, 0x0AB3, 1},
-		{0x0AB5, 0x0AB9, 1},
-		{0x0ABD, 0x0AE0, 0x23},
-		{0x0B05, 0x0B0C, 1},
-		{0x0B0F, 0x0B10, 1},
-		{0x0B13, 0x0B28, 1},
-		{0x0B2A, 0x0B30, 1},
-		{0x0B32, 0x0B33, 1},
-		{0x0B36, 0x0B39, 1},
-		{0x0B3D, 0x0B3D, 1},
-		{0x0B5C, 0x0B5D, 1},
-		{0x0B5F, 0x0B61, 1},
-		{0x0B85, 0x0B8A, 1},
-		{0x0B8E, 0x0B90, 1},
-		{0x0B92, 0x0B95, 1},
-		{0x0B99, 0x0B9A, 1},
-		{0x0B9C, 0x0B9C, 1},
-		{0x0B9E, 0x0B9F, 1},
-		{0x0BA3, 0x0BA4, 1},
-		{0x0BA8, 0x0BAA, 1},
-		{0x0BAE, 0x0BB5, 1},
-		{0x0BB7, 0x0BB9, 1},
-		{0x0C05, 0x0C0C, 1},
-		{0x0C0E, 0x0C10, 1},
-		{0x0C12, 0x0C28, 1},
-		{0x0C2A, 0x0C33, 1},
-		{0x0C35, 0x0C39, 1},
-		{0x0C60, 0x0C61, 1},
-		{0x0C85, 0x0C8C, 1},
-		{0x0C8E, 0x0C90, 1},
-		{0x0C92, 0x0CA8, 1},
-		{0x0CAA, 0x0CB3, 1},
-		{0x0CB5, 0x0CB9, 1},
-		{0x0CDE, 0x0CDE, 1},
-		{0x0CE0, 0x0CE1, 1},
-		{0x0D05, 0x0D0C, 1},
-		{0x0D0E, 0x0D10, 1},
-		{0x0D12, 0x0D28, 1},
-		{0x0D2A, 0x0D39, 1},
-		{0x0D60, 0x0D61, 1},
-		{0x0E01, 0x0E2E, 1},
-		{0x0E30, 0x0E30, 1},
-		{0x0E32, 0x0E33, 1},
-		{0x0E40, 0x0E45, 1},
-		{0x0E81, 0x0E82, 1},
-		{0x0E84, 0x0E84, 1},
-		{0x0E87, 0x0E88, 1},
-		{0x0E8A, 0x0E8D, 3},
-		{0x0E94, 0x0E97, 1},
-		{0x0E99, 0x0E9F, 1},
-		{0x0EA1, 0x0EA3, 1},
-		{0x0EA5, 0x0EA7, 2},
-		{0x0EAA, 0x0EAB, 1},
-		{0x0EAD, 0x0EAE, 1},
-		{0x0EB0, 0x0EB0, 1},
-		{0x0EB2, 0x0EB3, 1},
-		{0x0EBD, 0x0EBD, 1},
-		{0x0EC0, 0x0EC4, 1},
-		{0x0F40, 0x0F47, 1},
-		{0x0F49, 0x0F69, 1},
-		{0x10A0, 0x10C5, 1},
-		{0x10D0, 0x10F6, 1},
-		{0x1100, 0x1100, 1},
-		{0x1102, 0x1103, 1},
-		{0x1105, 0x1107, 1},
-		{0x1109, 0x1109, 1},
-		{0x110B, 0x110C, 1},
-		{0x110E, 0x1112, 1},
-		{0x113C, 0x1140, 2},
-		{0x114C, 0x1150, 2},
-		{0x1154, 0x1155, 1},
-		{0x1159, 0x1159, 1},
-		{0x115F, 0x1161, 1},
-		{0x1163, 0x1169, 2},
-		{0x116D, 0x116E, 1},
-		{0x1172, 0x1173, 1},
-		{0x1175, 0x119E, 0x119E - 0x1175},
-		{0x11A8, 0x11AB, 0x11AB - 0x11A8},
-		{0x11AE, 0x11AF, 1},
-		{0x11B7, 0x11B8, 1},
-		{0x11BA, 0x11BA, 1},
-		{0x11BC, 0x11C2, 1},
-		{0x11EB, 0x11F0, 0x11F0 - 0x11EB},
-		{0x11F9, 0x11F9, 1},
-		{0x1E00, 0x1E9B, 1},
-		{0x1EA0, 0x1EF9, 1},
-		{0x1F00, 0x1F15, 1},
-		{0x1F18, 0x1F1D, 1},
-		{0x1F20, 0x1F45, 1},
-		{0x1F48, 0x1F4D, 1},
-		{0x1F50, 0x1F57, 1},
-		{0x1F59, 0x1F5B, 0x1F5B - 0x1F59},
-		{0x1F5D, 0x1F5D, 1},
-		{0x1F5F, 0x1F7D, 1},
-		{0x1F80, 0x1FB4, 1},
-		{0x1FB6, 0x1FBC, 1},
-		{0x1FBE, 0x1FBE, 1},
-		{0x1FC2, 0x1FC4, 1},
-		{0x1FC6, 0x1FCC, 1},
-		{0x1FD0, 0x1FD3, 1},
-		{0x1FD6, 0x1FDB, 1},
-		{0x1FE0, 0x1FEC, 1},
-		{0x1FF2, 0x1FF4, 1},
-		{0x1FF6, 0x1FFC, 1},
-		{0x2126, 0x2126, 1},
-		{0x212A, 0x212B, 1},
-		{0x212E, 0x212E, 1},
-		{0x2180, 0x2182, 1},
-		{0x3007, 0x3007, 1},
-		{0x3021, 0x3029, 1},
-		{0x3041, 0x3094, 1},
-		{0x30A1, 0x30FA, 1},
-		{0x3105, 0x312C, 1},
-		{0x4E00, 0x9FA5, 1},
-		{0xAC00, 0xD7A3, 1},
-	},
-}
-
-var second = &unicode.RangeTable{
-	R16: []unicode.Range16{
-		{0x002D, 0x002E, 1},
-		{0x0030, 0x0039, 1},
-		{0x00B7, 0x00B7, 1},
-		{0x02D0, 0x02D1, 1},
-		{0x0300, 0x0345, 1},
-		{0x0360, 0x0361, 1},
-		{0x0387, 0x0387, 1},
-		{0x0483, 0x0486, 1},
-		{0x0591, 0x05A1, 1},
-		{0x05A3, 0x05B9, 1},
-		{0x05BB, 0x05BD, 1},
-		{0x05BF, 0x05BF, 1},
-		{0x05C1, 0x05C2, 1},
-		{0x05C4, 0x0640, 0x0640 - 0x05C4},
-		{0x064B, 0x0652, 1},
-		{0x0660, 0x0669, 1},
-		{0x0670, 0x0670, 1},
-		{0x06D6, 0x06DC, 1},
-		{0x06DD, 0x06DF, 1},
-		{0x06E0, 0x06E4, 1},
-		{0x06E7, 0x06E8, 1},
-		{0x06EA, 0x06ED, 1},
-		{0x06F0, 0x06F9, 1},
-		{0x0901, 0x0903, 1},
-		{0x093C, 0x093C, 1},
-		{0x093E, 0x094C, 1},
-		{0x094D, 0x094D, 1},
-		{0x0951, 0x0954, 1},
-		{0x0962, 0x0963, 1},
-		{0x0966, 0x096F, 1},
-		{0x0981, 0x0983, 1},
-		{0x09BC, 0x09BC, 1},
-		{0x09BE, 0x09BF, 1},
-		{0x09C0, 0x09C4, 1},
-		{0x09C7, 0x09C8, 1},
-		{0x09CB, 0x09CD, 1},
-		{0x09D7, 0x09D7, 1},
-		{0x09E2, 0x09E3, 1},
-		{0x09E6, 0x09EF, 1},
-		{0x0A02, 0x0A3C, 0x3A},
-		{0x0A3E, 0x0A3F, 1},
-		{0x0A40, 0x0A42, 1},
-		{0x0A47, 0x0A48, 1},
-		{0x0A4B, 0x0A4D, 1},
-		{0x0A66, 0x0A6F, 1},
-		{0x0A70, 0x0A71, 1},
-		{0x0A81, 0x0A83, 1},
-		{0x0ABC, 0x0ABC, 1},
-		{0x0ABE, 0x0AC5, 1},
-		{0x0AC7, 0x0AC9, 1},
-		{0x0ACB, 0x0ACD, 1},
-		{0x0AE6, 0x0AEF, 1},
-		{0x0B01, 0x0B03, 1},
-		{0x0B3C, 0x0B3C, 1},
-		{0x0B3E, 0x0B43, 1},
-		{0x0B47, 0x0B48, 1},
-		{0x0B4B, 0x0B4D, 1},
-		{0x0B56, 0x0B57, 1},
-		{0x0B66, 0x0B6F, 1},
-		{0x0B82, 0x0B83, 1},
-		{0x0BBE, 0x0BC2, 1},
-		{0x0BC6, 0x0BC8, 1},
-		{0x0BCA, 0x0BCD, 1},
-		{0x0BD7, 0x0BD7, 1},
-		{0x0BE7, 0x0BEF, 1},
-		{0x0C01, 0x0C03, 1},
-		{0x0C3E, 0x0C44, 1},
-		{0x0C46, 0x0C48, 1},
-		{0x0C4A, 0x0C4D, 1},
-		{0x0C55, 0x0C56, 1},
-		{0x0C66, 0x0C6F, 1},
-		{0x0C82, 0x0C83, 1},
-		{0x0CBE, 0x0CC4, 1},
-		{0x0CC6, 0x0CC8, 1},
-		{0x0CCA, 0x0CCD, 1},
-		{0x0CD5, 0x0CD6, 1},
-		{0x0CE6, 0x0CEF, 1},
-		{0x0D02, 0x0D03, 1},
-		{0x0D3E, 0x0D43, 1},
-		{0x0D46, 0x0D48, 1},
-		{0x0D4A, 0x0D4D, 1},
-		{0x0D57, 0x0D57, 1},
-		{0x0D66, 0x0D6F, 1},
-		{0x0E31, 0x0E31, 1},
-		{0x0E34, 0x0E3A, 1},
-		{0x0E46, 0x0E46, 1},
-		{0x0E47, 0x0E4E, 1},
-		{0x0E50, 0x0E59, 1},
-		{0x0EB1, 0x0EB1, 1},
-		{0x0EB4, 0x0EB9, 1},
-		{0x0EBB, 0x0EBC, 1},
-		{0x0EC6, 0x0EC6, 1},
-		{0x0EC8, 0x0ECD, 1},
-		{0x0ED0, 0x0ED9, 1},
-		{0x0F18, 0x0F19, 1},
-		{0x0F20, 0x0F29, 1},
-		{0x0F35, 0x0F39, 2},
-		{0x0F3E, 0x0F3F, 1},
-		{0x0F71, 0x0F84, 1},
-		{0x0F86, 0x0F8B, 1},
-		{0x0F90, 0x0F95, 1},
-		{0x0F97, 0x0F97, 1},
-		{0x0F99, 0x0FAD, 1},
-		{0x0FB1, 0x0FB7, 1},
-		{0x0FB9, 0x0FB9, 1},
-		{0x20D0, 0x20DC, 1},
-		{0x20E1, 0x3005, 0x3005 - 0x20E1},
-		{0x302A, 0x302F, 1},
-		{0x3031, 0x3035, 1},
-		{0x3099, 0x309A, 1},
-		{0x309D, 0x309E, 1},
-		{0x30FC, 0x30FE, 1},
-	},
-}
-
-// HTMLEntity is an entity map containing translations for the
-// standard HTML entity characters.
-var HTMLEntity = htmlEntity
-
-var htmlEntity = map[string]string{
-	/*
-		hget http://www.w3.org/TR/html4/sgml/entities.html |
-		ssam '
-			,y /\&gt;/ x/\&lt;(.|\n)+/ s/\n/ /g
-			,x v/^\&lt;!ENTITY/d
-			,s/\&lt;!ENTITY ([^ ]+) .*U\+([0-9A-F][0-9A-F][0-9A-F][0-9A-F]) .+/	"\1": "\\u\2",/g
-		'
-	*/
-	"nbsp":     "\u00A0",
-	"iexcl":    "\u00A1",
-	"cent":     "\u00A2",
-	"pound":    "\u00A3",
-	"curren":   "\u00A4",
-	"yen":      "\u00A5",
-	"brvbar":   "\u00A6",
-	"sect":     "\u00A7",
-	"uml":      "\u00A8",
-	"copy":     "\u00A9",
-	"ordf":     "\u00AA",
-	"laquo":    "\u00AB",
-	"not":      "\u00AC",
-	"shy":      "\u00AD",
-	"reg":      "\u00AE",
-	"macr":     "\u00AF",
-	"deg":      "\u00B0",
-	"plusmn":   "\u00B1",
-	"sup2":     "\u00B2",
-	"sup3":     "\u00B3",
-	"acute":    "\u00B4",
-	"micro":    "\u00B5",
-	"para":     "\u00B6",
-	"middot":   "\u00B7",
-	"cedil":    "\u00B8",
-	"sup1":     "\u00B9",
-	"ordm":     "\u00BA",
-	"raquo":    "\u00BB",
-	"frac14":   "\u00BC",
-	"frac12":   "\u00BD",
-	"frac34":   "\u00BE",
-	"iquest":   "\u00BF",
-	"Agrave":   "\u00C0",
-	"Aacute":   "\u00C1",
-	"Acirc":    "\u00C2",
-	"Atilde":   "\u00C3",
-	"Auml":     "\u00C4",
-	"Aring":    "\u00C5",
-	"AElig":    "\u00C6",
-	"Ccedil":   "\u00C7",
-	"Egrave":   "\u00C8",
-	"Eacute":   "\u00C9",
-	"Ecirc":    "\u00CA",
-	"Euml":     "\u00CB",
-	"Igrave":   "\u00CC",
-	"Iacute":   "\u00CD",
-	"Icirc":    "\u00CE",
-	"Iuml":     "\u00CF",
-	"ETH":      "\u00D0",
-	"Ntilde":   "\u00D1",
-	"Ograve":   "\u00D2",
-	"Oacute":   "\u00D3",
-	"Ocirc":    "\u00D4",
-	"Otilde":   "\u00D5",
-	"Ouml":     "\u00D6",
-	"times":    "\u00D7",
-	"Oslash":   "\u00D8",
-	"Ugrave":   "\u00D9",
-	"Uacute":   "\u00DA",
-	"Ucirc":    "\u00DB",
-	"Uuml":     "\u00DC",
-	"Yacute":   "\u00DD",
-	"THORN":    "\u00DE",
-	"szlig":    "\u00DF",
-	"agrave":   "\u00E0",
-	"aacute":   "\u00E1",
-	"acirc":    "\u00E2",
-	"atilde":   "\u00E3",
-	"auml":     "\u00E4",
-	"aring":    "\u00E5",
-	"aelig":    "\u00E6",
-	"ccedil":   "\u00E7",
-	"egrave":   "\u00E8",
-	"eacute":   "\u00E9",
-	"ecirc":    "\u00EA",
-	"euml":     "\u00EB",
-	"igrave":   "\u00EC",
-	"iacute":   "\u00ED",
-	"icirc":    "\u00EE",
-	"iuml":     "\u00EF",
-	"eth":      "\u00F0",
-	"ntilde":   "\u00F1",
-	"ograve":   "\u00F2",
-	"oacute":   "\u00F3",
-	"ocirc":    "\u00F4",
-	"otilde":   "\u00F5",
-	"ouml":     "\u00F6",
-	"divide":   "\u00F7",
-	"oslash":   "\u00F8",
-	"ugrave":   "\u00F9",
-	"uacute":   "\u00FA",
-	"ucirc":    "\u00FB",
-	"uuml":     "\u00FC",
-	"yacute":   "\u00FD",
-	"thorn":    "\u00FE",
-	"yuml":     "\u00FF",
-	"fnof":     "\u0192",
-	"Alpha":    "\u0391",
-	"Beta":     "\u0392",
-	"Gamma":    "\u0393",
-	"Delta":    "\u0394",
-	"Epsilon":  "\u0395",
-	"Zeta":     "\u0396",
-	"Eta":      "\u0397",
-	"Theta":    "\u0398",
-	"Iota":     "\u0399",
-	"Kappa":    "\u039A",
-	"Lambda":   "\u039B",
-	"Mu":       "\u039C",
-	"Nu":       "\u039D",
-	"Xi":       "\u039E",
-	"Omicron":  "\u039F",
-	"Pi":       "\u03A0",
-	"Rho":      "\u03A1",
-	"Sigma":    "\u03A3",
-	"Tau":      "\u03A4",
-	"Upsilon":  "\u03A5",
-	"Phi":      "\u03A6",
-	"Chi":      "\u03A7",
-	"Psi":      "\u03A8",
-	"Omega":    "\u03A9",
-	"alpha":    "\u03B1",
-	"beta":     "\u03B2",
-	"gamma":    "\u03B3",
-	"delta":    "\u03B4",
-	"epsilon":  "\u03B5",
-	"zeta":     "\u03B6",
-	"eta":      "\u03B7",
-	"theta":    "\u03B8",
-	"iota":     "\u03B9",
-	"kappa":    "\u03BA",
-	"lambda":   "\u03BB",
-	"mu":       "\u03BC",
-	"nu":       "\u03BD",
-	"xi":       "\u03BE",
-	"omicron":  "\u03BF",
-	"pi":       "\u03C0",
-	"rho":      "\u03C1",
-	"sigmaf":   "\u03C2",
-	"sigma":    "\u03C3",
-	"tau":      "\u03C4",
-	"upsilon":  "\u03C5",
-	"phi":      "\u03C6",
-	"chi":      "\u03C7",
-	"psi":      "\u03C8",
-	"omega":    "\u03C9",
-	"thetasym": "\u03D1",
-	"upsih":    "\u03D2",
-	"piv":      "\u03D6",
-	"bull":     "\u2022",
-	"hellip":   "\u2026",
-	"prime":    "\u2032",
-	"Prime":    "\u2033",
-	"oline":    "\u203E",
-	"frasl":    "\u2044",
-	"weierp":   "\u2118",
-	"image":    "\u2111",
-	"real":     "\u211C",
-	"trade":    "\u2122",
-	"alefsym":  "\u2135",
-	"larr":     "\u2190",
-	"uarr":     "\u2191",
-	"rarr":     "\u2192",
-	"darr":     "\u2193",
-	"harr":     "\u2194",
-	"crarr":    "\u21B5",
-	"lArr":     "\u21D0",
-	"uArr":     "\u21D1",
-	"rArr":     "\u21D2",
-	"dArr":     "\u21D3",
-	"hArr":     "\u21D4",
-	"forall":   "\u2200",
-	"part":     "\u2202",
-	"exist":    "\u2203",
-	"empty":    "\u2205",
-	"nabla":    "\u2207",
-	"isin":     "\u2208",
-	"notin":    "\u2209",
-	"ni":       "\u220B",
-	"prod":     "\u220F",
-	"sum":      "\u2211",
-	"minus":    "\u2212",
-	"lowast":   "\u2217",
-	"radic":    "\u221A",
-	"prop":     "\u221D",
-	"infin":    "\u221E",
-	"ang":      "\u2220",
-	"and":      "\u2227",
-	"or":       "\u2228",
-	"cap":      "\u2229",
-	"cup":      "\u222A",
-	"int":      "\u222B",
-	"there4":   "\u2234",
-	"sim":      "\u223C",
-	"cong":     "\u2245",
-	"asymp":    "\u2248",
-	"ne":       "\u2260",
-	"equiv":    "\u2261",
-	"le":       "\u2264",
-	"ge":       "\u2265",
-	"sub":      "\u2282",
-	"sup":      "\u2283",
-	"nsub":     "\u2284",
-	"sube":     "\u2286",
-	"supe":     "\u2287",
-	"oplus":    "\u2295",
-	"otimes":   "\u2297",
-	"perp":     "\u22A5",
-	"sdot":     "\u22C5",
-	"lceil":    "\u2308",
-	"rceil":    "\u2309",
-	"lfloor":   "\u230A",
-	"rfloor":   "\u230B",
-	"lang":     "\u2329",
-	"rang":     "\u232A",
-	"loz":      "\u25CA",
-	"spades":   "\u2660",
-	"clubs":    "\u2663",
-	"hearts":   "\u2665",
-	"diams":    "\u2666",
-	"quot":     "\u0022",
-	"amp":      "\u0026",
-	"lt":       "\u003C",
-	"gt":       "\u003E",
-	"OElig":    "\u0152",
-	"oelig":    "\u0153",
-	"Scaron":   "\u0160",
-	"scaron":   "\u0161",
-	"Yuml":     "\u0178",
-	"circ":     "\u02C6",
-	"tilde":    "\u02DC",
-	"ensp":     "\u2002",
-	"emsp":     "\u2003",
-	"thinsp":   "\u2009",
-	"zwnj":     "\u200C",
-	"zwj":      "\u200D",
-	"lrm":      "\u200E",
-	"rlm":      "\u200F",
-	"ndash":    "\u2013",
-	"mdash":    "\u2014",
-	"lsquo":    "\u2018",
-	"rsquo":    "\u2019",
-	"sbquo":    "\u201A",
-	"ldquo":    "\u201C",
-	"rdquo":    "\u201D",
-	"bdquo":    "\u201E",
-	"dagger":   "\u2020",
-	"Dagger":   "\u2021",
-	"permil":   "\u2030",
-	"lsaquo":   "\u2039",
-	"rsaquo":   "\u203A",
-	"euro":     "\u20AC",
-}
-
-// HTMLAutoClose is the set of HTML elements that
-// should be considered to close automatically.
-var HTMLAutoClose = htmlAutoClose
-
-var htmlAutoClose = []string{
-	/*
-		hget http://www.w3.org/TR/html4/loose.dtd |
-		9 sed -n 's/<!ELEMENT ([^ ]*) +- O EMPTY.+/	"\1",/p' | tr A-Z a-z
-	*/
-	"basefont",
-	"br",
-	"area",
-	"link",
-	"img",
-	"param",
-	"hr",
-	"input",
-	"col",
-	"frame",
-	"isindex",
-	"base",
-	"meta",
-}
-
-var (
-	esc_quot = []byte("&#34;") // shorter than "&quot;"
-	esc_apos = []byte("&#39;") // shorter than "&apos;"
-	esc_amp  = []byte("&amp;")
-	esc_lt   = []byte("&lt;")
-	esc_gt   = []byte("&gt;")
-	esc_tab  = []byte("&#x9;")
-	esc_nl   = []byte("&#xA;")
-	esc_cr   = []byte("&#xD;")
-	esc_fffd = []byte("\uFFFD") // Unicode replacement character
-)
-
-// EscapeText writes to w the properly escaped XML equivalent
-// of the plain text data s.
-func EscapeText(w io.Writer, s []byte) error {
-	return escapeText(w, s, true)
-}
-
-// escapeText writes to w the properly escaped XML equivalent
-// of the plain text data s. If escapeNewline is true, newline
-// characters will be escaped.
-func escapeText(w io.Writer, s []byte, escapeNewline bool) error {
-	var esc []byte
-	last := 0
-	for i := 0; i < len(s); {
-		r, width := utf8.DecodeRune(s[i:])
-		i += width
-		switch r {
-		case '"':
-			esc = esc_quot
-		case '\'':
-			esc = esc_apos
-		case '&':
-			esc = esc_amp
-		case '<':
-			esc = esc_lt
-		case '>':
-			esc = esc_gt
-		case '\t':
-			esc = esc_tab
-		case '\n':
-			if !escapeNewline {
-				continue
-			}
-			esc = esc_nl
-		case '\r':
-			esc = esc_cr
-		default:
-			if !isInCharacterRange(r) || (r == 0xFFFD && width == 1) {
-				esc = esc_fffd
-				break
-			}
-			continue
-		}
-		if _, err := w.Write(s[last : i-width]); err != nil {
-			return err
-		}
-		if _, err := w.Write(esc); err != nil {
-			return err
-		}
-		last = i
-	}
-	if _, err := w.Write(s[last:]); err != nil {
-		return err
-	}
-	return nil
-}
-
-// EscapeString writes to p the properly escaped XML equivalent
-// of the plain text data s.
-func (p *printer) EscapeString(s string) {
-	var esc []byte
-	last := 0
-	for i := 0; i < len(s); {
-		r, width := utf8.DecodeRuneInString(s[i:])
-		i += width
-		switch r {
-		case '"':
-			esc = esc_quot
-		case '\'':
-			esc = esc_apos
-		case '&':
-			esc = esc_amp
-		case '<':
-			esc = esc_lt
-		case '>':
-			esc = esc_gt
-		case '\t':
-			esc = esc_tab
-		case '\n':
-			esc = esc_nl
-		case '\r':
-			esc = esc_cr
-		default:
-			if !isInCharacterRange(r) || (r == 0xFFFD && width == 1) {
-				esc = esc_fffd
-				break
-			}
-			continue
-		}
-		p.WriteString(s[last : i-width])
-		p.Write(esc)
-		last = i
-	}
-	p.WriteString(s[last:])
-}
-
-// Escape is like EscapeText but omits the error return value.
-// It is provided for backwards compatibility with Go 1.0.
-// Code targeting Go 1.1 or later should use EscapeText.
-func Escape(w io.Writer, s []byte) {
-	EscapeText(w, s)
-}
-
-// procInst parses the `param="..."` or `param='...'`
-// value out of the provided string, returning "" if not found.
-func procInst(param, s string) string {
-	// TODO: this parsing is somewhat lame and not exact.
-	// It works for all actual cases, though.
-	param = param + "="
-	idx := strings.Index(s, param)
-	if idx == -1 {
-		return ""
-	}
-	v := s[idx+len(param):]
-	if v == "" {
-		return ""
-	}
-	if v[0] != '\'' && v[0] != '"' {
-		return ""
-	}
-	idx = strings.IndexRune(v[1:], rune(v[0]))
-	if idx == -1 {
-		return ""
-	}
-	return v[1 : idx+1]
-}
diff --git a/third_party/gofrontend/libgo/go/encoding/xml/xml_test.go b/third_party/gofrontend/libgo/go/encoding/xml/xml_test.go
deleted file mode 100644
index 312a7c9..0000000
--- a/third_party/gofrontend/libgo/go/encoding/xml/xml_test.go
+++ /dev/null
@@ -1,752 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package xml
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"reflect"
-	"strings"
-	"testing"
-	"unicode/utf8"
-)
-
-const testInput = `
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<body xmlns:foo="ns1" xmlns="ns2" xmlns:tag="ns3" ` +
-	"\r\n\t" + `  >
-  <hello lang="en">World &lt;&gt;&apos;&quot; &#x767d;&#40300;翔</hello>
-  <query>&何; &is-it;</query>
-  <goodbye />
-  <outer foo:attr="value" xmlns:tag="ns4">
-    <inner/>
-  </outer>
-  <tag:name>
-    <![CDATA[Some text here.]]>
-  </tag:name>
-</body><!-- missing final newline -->`
-
-var testEntity = map[string]string{"何": "What", "is-it": "is it?"}
-
-var rawTokens = []Token{
-	CharData("\n"),
-	ProcInst{"xml", []byte(`version="1.0" encoding="UTF-8"`)},
-	CharData("\n"),
-	Directive(`DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"`),
-	CharData("\n"),
-	StartElement{Name{"", "body"}, []Attr{{Name{"xmlns", "foo"}, "ns1"}, {Name{"", "xmlns"}, "ns2"}, {Name{"xmlns", "tag"}, "ns3"}}},
-	CharData("\n  "),
-	StartElement{Name{"", "hello"}, []Attr{{Name{"", "lang"}, "en"}}},
-	CharData("World <>'\" 白鵬翔"),
-	EndElement{Name{"", "hello"}},
-	CharData("\n  "),
-	StartElement{Name{"", "query"}, []Attr{}},
-	CharData("What is it?"),
-	EndElement{Name{"", "query"}},
-	CharData("\n  "),
-	StartElement{Name{"", "goodbye"}, []Attr{}},
-	EndElement{Name{"", "goodbye"}},
-	CharData("\n  "),
-	StartElement{Name{"", "outer"}, []Attr{{Name{"foo", "attr"}, "value"}, {Name{"xmlns", "tag"}, "ns4"}}},
-	CharData("\n    "),
-	StartElement{Name{"", "inner"}, []Attr{}},
-	EndElement{Name{"", "inner"}},
-	CharData("\n  "),
-	EndElement{Name{"", "outer"}},
-	CharData("\n  "),
-	StartElement{Name{"tag", "name"}, []Attr{}},
-	CharData("\n    "),
-	CharData("Some text here."),
-	CharData("\n  "),
-	EndElement{Name{"tag", "name"}},
-	CharData("\n"),
-	EndElement{Name{"", "body"}},
-	Comment(" missing final newline "),
-}
-
-var cookedTokens = []Token{
-	CharData("\n"),
-	ProcInst{"xml", []byte(`version="1.0" encoding="UTF-8"`)},
-	CharData("\n"),
-	Directive(`DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"`),
-	CharData("\n"),
-	StartElement{Name{"ns2", "body"}, []Attr{{Name{"xmlns", "foo"}, "ns1"}, {Name{"", "xmlns"}, "ns2"}, {Name{"xmlns", "tag"}, "ns3"}}},
-	CharData("\n  "),
-	StartElement{Name{"ns2", "hello"}, []Attr{{Name{"", "lang"}, "en"}}},
-	CharData("World <>'\" 白鵬翔"),
-	EndElement{Name{"ns2", "hello"}},
-	CharData("\n  "),
-	StartElement{Name{"ns2", "query"}, []Attr{}},
-	CharData("What is it?"),
-	EndElement{Name{"ns2", "query"}},
-	CharData("\n  "),
-	StartElement{Name{"ns2", "goodbye"}, []Attr{}},
-	EndElement{Name{"ns2", "goodbye"}},
-	CharData("\n  "),
-	StartElement{Name{"ns2", "outer"}, []Attr{{Name{"ns1", "attr"}, "value"}, {Name{"xmlns", "tag"}, "ns4"}}},
-	CharData("\n    "),
-	StartElement{Name{"ns2", "inner"}, []Attr{}},
-	EndElement{Name{"ns2", "inner"}},
-	CharData("\n  "),
-	EndElement{Name{"ns2", "outer"}},
-	CharData("\n  "),
-	StartElement{Name{"ns3", "name"}, []Attr{}},
-	CharData("\n    "),
-	CharData("Some text here."),
-	CharData("\n  "),
-	EndElement{Name{"ns3", "name"}},
-	CharData("\n"),
-	EndElement{Name{"ns2", "body"}},
-	Comment(" missing final newline "),
-}
-
-const testInputAltEncoding = `
-<?xml version="1.0" encoding="x-testing-uppercase"?>
-<TAG>VALUE</TAG>`
-
-var rawTokensAltEncoding = []Token{
-	CharData("\n"),
-	ProcInst{"xml", []byte(`version="1.0" encoding="x-testing-uppercase"`)},
-	CharData("\n"),
-	StartElement{Name{"", "tag"}, []Attr{}},
-	CharData("value"),
-	EndElement{Name{"", "tag"}},
-}
-
-var xmlInput = []string{
-	// unexpected EOF cases
-	"<",
-	"<t",
-	"<t ",
-	"<t/",
-	"<!",
-	"<!-",
-	"<!--",
-	"<!--c-",
-	"<!--c--",
-	"<!d",
-	"<t></",
-	"<t></t",
-	"<?",
-	"<?p",
-	"<t a",
-	"<t a=",
-	"<t a='",
-	"<t a=''",
-	"<t/><![",
-	"<t/><![C",
-	"<t/><![CDATA[d",
-	"<t/><![CDATA[d]",
-	"<t/><![CDATA[d]]",
-
-	// other Syntax errors
-	"<>",
-	"<t/a",
-	"<0 />",
-	"<?0 >",
-	//	"<!0 >",	// let the Token() caller handle
-	"</0>",
-	"<t 0=''>",
-	"<t a='&'>",
-	"<t a='<'>",
-	"<t>&nbspc;</t>",
-	"<t a>",
-	"<t a=>",
-	"<t a=v>",
-	//	"<![CDATA[d]]>",	// let the Token() caller handle
-	"<t></e>",
-	"<t></>",
-	"<t></t!",
-	"<t>cdata]]></t>",
-}
-
-func TestRawToken(t *testing.T) {
-	d := NewDecoder(strings.NewReader(testInput))
-	d.Entity = testEntity
-	testRawToken(t, d, testInput, rawTokens)
-}
-
-const nonStrictInput = `
-<tag>non&entity</tag>
-<tag>&unknown;entity</tag>
-<tag>&#123</tag>
-<tag>&#zzz;</tag>
-<tag>&なまえ3;</tag>
-<tag>&lt-gt;</tag>
-<tag>&;</tag>
-<tag>&0a;</tag>
-`
-
-var nonStringEntity = map[string]string{"": "oops!", "0a": "oops!"}
-
-var nonStrictTokens = []Token{
-	CharData("\n"),
-	StartElement{Name{"", "tag"}, []Attr{}},
-	CharData("non&entity"),
-	EndElement{Name{"", "tag"}},
-	CharData("\n"),
-	StartElement{Name{"", "tag"}, []Attr{}},
-	CharData("&unknown;entity"),
-	EndElement{Name{"", "tag"}},
-	CharData("\n"),
-	StartElement{Name{"", "tag"}, []Attr{}},
-	CharData("&#123"),
-	EndElement{Name{"", "tag"}},
-	CharData("\n"),
-	StartElement{Name{"", "tag"}, []Attr{}},
-	CharData("&#zzz;"),
-	EndElement{Name{"", "tag"}},
-	CharData("\n"),
-	StartElement{Name{"", "tag"}, []Attr{}},
-	CharData("&なまえ3;"),
-	EndElement{Name{"", "tag"}},
-	CharData("\n"),
-	StartElement{Name{"", "tag"}, []Attr{}},
-	CharData("&lt-gt;"),
-	EndElement{Name{"", "tag"}},
-	CharData("\n"),
-	StartElement{Name{"", "tag"}, []Attr{}},
-	CharData("&;"),
-	EndElement{Name{"", "tag"}},
-	CharData("\n"),
-	StartElement{Name{"", "tag"}, []Attr{}},
-	CharData("&0a;"),
-	EndElement{Name{"", "tag"}},
-	CharData("\n"),
-}
-
-func TestNonStrictRawToken(t *testing.T) {
-	d := NewDecoder(strings.NewReader(nonStrictInput))
-	d.Strict = false
-	testRawToken(t, d, nonStrictInput, nonStrictTokens)
-}
-
-type downCaser struct {
-	t *testing.T
-	r io.ByteReader
-}
-
-func (d *downCaser) ReadByte() (c byte, err error) {
-	c, err = d.r.ReadByte()
-	if c >= 'A' && c <= 'Z' {
-		c += 'a' - 'A'
-	}
-	return
-}
-
-func (d *downCaser) Read(p []byte) (int, error) {
-	d.t.Fatalf("unexpected Read call on downCaser reader")
-	panic("unreachable")
-}
-
-func TestRawTokenAltEncoding(t *testing.T) {
-	d := NewDecoder(strings.NewReader(testInputAltEncoding))
-	d.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) {
-		if charset != "x-testing-uppercase" {
-			t.Fatalf("unexpected charset %q", charset)
-		}
-		return &downCaser{t, input.(io.ByteReader)}, nil
-	}
-	testRawToken(t, d, testInputAltEncoding, rawTokensAltEncoding)
-}
-
-func TestRawTokenAltEncodingNoConverter(t *testing.T) {
-	d := NewDecoder(strings.NewReader(testInputAltEncoding))
-	token, err := d.RawToken()
-	if token == nil {
-		t.Fatalf("expected a token on first RawToken call")
-	}
-	if err != nil {
-		t.Fatal(err)
-	}
-	token, err = d.RawToken()
-	if token != nil {
-		t.Errorf("expected a nil token; got %#v", token)
-	}
-	if err == nil {
-		t.Fatalf("expected an error on second RawToken call")
-	}
-	const encoding = "x-testing-uppercase"
-	if !strings.Contains(err.Error(), encoding) {
-		t.Errorf("expected error to contain %q; got error: %v",
-			encoding, err)
-	}
-}
-
-func testRawToken(t *testing.T, d *Decoder, raw string, rawTokens []Token) {
-	lastEnd := int64(0)
-	for i, want := range rawTokens {
-		start := d.InputOffset()
-		have, err := d.RawToken()
-		end := d.InputOffset()
-		if err != nil {
-			t.Fatalf("token %d: unexpected error: %s", i, err)
-		}
-		if !reflect.DeepEqual(have, want) {
-			var shave, swant string
-			if _, ok := have.(CharData); ok {
-				shave = fmt.Sprintf("CharData(%q)", have)
-			} else {
-				shave = fmt.Sprintf("%#v", have)
-			}
-			if _, ok := want.(CharData); ok {
-				swant = fmt.Sprintf("CharData(%q)", want)
-			} else {
-				swant = fmt.Sprintf("%#v", want)
-			}
-			t.Errorf("token %d = %s, want %s", i, shave, swant)
-		}
-
-		// Check that InputOffset returned actual token.
-		switch {
-		case start < lastEnd:
-			t.Errorf("token %d: position [%d,%d) for %T is before previous token", i, start, end, have)
-		case start >= end:
-			// Special case: EndElement can be synthesized.
-			if start == end && end == lastEnd {
-				break
-			}
-			t.Errorf("token %d: position [%d,%d) for %T is empty", i, start, end, have)
-		case end > int64(len(raw)):
-			t.Errorf("token %d: position [%d,%d) for %T extends beyond input", i, start, end, have)
-		default:
-			text := raw[start:end]
-			if strings.ContainsAny(text, "<>") && (!strings.HasPrefix(text, "<") || !strings.HasSuffix(text, ">")) {
-				t.Errorf("token %d: misaligned raw token %#q for %T", i, text, have)
-			}
-		}
-		lastEnd = end
-	}
-}
-
-// Ensure that directives (specifically !DOCTYPE) include the complete
-// text of any nested directives, noting that < and > do not change
-// nesting depth if they are in single or double quotes.
-
-var nestedDirectivesInput = `
-<!DOCTYPE [<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">]>
-<!DOCTYPE [<!ENTITY xlt ">">]>
-<!DOCTYPE [<!ENTITY xlt "<">]>
-<!DOCTYPE [<!ENTITY xlt '>'>]>
-<!DOCTYPE [<!ENTITY xlt '<'>]>
-<!DOCTYPE [<!ENTITY xlt '">'>]>
-<!DOCTYPE [<!ENTITY xlt "'<">]>
-`
-
-var nestedDirectivesTokens = []Token{
-	CharData("\n"),
-	Directive(`DOCTYPE [<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">]`),
-	CharData("\n"),
-	Directive(`DOCTYPE [<!ENTITY xlt ">">]`),
-	CharData("\n"),
-	Directive(`DOCTYPE [<!ENTITY xlt "<">]`),
-	CharData("\n"),
-	Directive(`DOCTYPE [<!ENTITY xlt '>'>]`),
-	CharData("\n"),
-	Directive(`DOCTYPE [<!ENTITY xlt '<'>]`),
-	CharData("\n"),
-	Directive(`DOCTYPE [<!ENTITY xlt '">'>]`),
-	CharData("\n"),
-	Directive(`DOCTYPE [<!ENTITY xlt "'<">]`),
-	CharData("\n"),
-}
-
-func TestNestedDirectives(t *testing.T) {
-	d := NewDecoder(strings.NewReader(nestedDirectivesInput))
-
-	for i, want := range nestedDirectivesTokens {
-		have, err := d.Token()
-		if err != nil {
-			t.Fatalf("token %d: unexpected error: %s", i, err)
-		}
-		if !reflect.DeepEqual(have, want) {
-			t.Errorf("token %d = %#v want %#v", i, have, want)
-		}
-	}
-}
-
-func TestToken(t *testing.T) {
-	d := NewDecoder(strings.NewReader(testInput))
-	d.Entity = testEntity
-
-	for i, want := range cookedTokens {
-		have, err := d.Token()
-		if err != nil {
-			t.Fatalf("token %d: unexpected error: %s", i, err)
-		}
-		if !reflect.DeepEqual(have, want) {
-			t.Errorf("token %d = %#v want %#v", i, have, want)
-		}
-	}
-}
-
-func TestSyntax(t *testing.T) {
-	for i := range xmlInput {
-		d := NewDecoder(strings.NewReader(xmlInput[i]))
-		var err error
-		for _, err = d.Token(); err == nil; _, err = d.Token() {
-		}
-		if _, ok := err.(*SyntaxError); !ok {
-			t.Fatalf(`xmlInput "%s": expected SyntaxError not received`, xmlInput[i])
-		}
-	}
-}
-
-type allScalars struct {
-	True1     bool
-	True2     bool
-	False1    bool
-	False2    bool
-	Int       int
-	Int8      int8
-	Int16     int16
-	Int32     int32
-	Int64     int64
-	Uint      int
-	Uint8     uint8
-	Uint16    uint16
-	Uint32    uint32
-	Uint64    uint64
-	Uintptr   uintptr
-	Float32   float32
-	Float64   float64
-	String    string
-	PtrString *string
-}
-
-var all = allScalars{
-	True1:     true,
-	True2:     true,
-	False1:    false,
-	False2:    false,
-	Int:       1,
-	Int8:      -2,
-	Int16:     3,
-	Int32:     -4,
-	Int64:     5,
-	Uint:      6,
-	Uint8:     7,
-	Uint16:    8,
-	Uint32:    9,
-	Uint64:    10,
-	Uintptr:   11,
-	Float32:   13.0,
-	Float64:   14.0,
-	String:    "15",
-	PtrString: &sixteen,
-}
-
-var sixteen = "16"
-
-const testScalarsInput = `<allscalars>
-	<True1>true</True1>
-	<True2>1</True2>
-	<False1>false</False1>
-	<False2>0</False2>
-	<Int>1</Int>
-	<Int8>-2</Int8>
-	<Int16>3</Int16>
-	<Int32>-4</Int32>
-	<Int64>5</Int64>
-	<Uint>6</Uint>
-	<Uint8>7</Uint8>
-	<Uint16>8</Uint16>
-	<Uint32>9</Uint32>
-	<Uint64>10</Uint64>
-	<Uintptr>11</Uintptr>
-	<Float>12.0</Float>
-	<Float32>13.0</Float32>
-	<Float64>14.0</Float64>
-	<String>15</String>
-	<PtrString>16</PtrString>
-</allscalars>`
-
-func TestAllScalars(t *testing.T) {
-	var a allScalars
-	err := Unmarshal([]byte(testScalarsInput), &a)
-
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !reflect.DeepEqual(a, all) {
-		t.Errorf("have %+v want %+v", a, all)
-	}
-}
-
-type item struct {
-	Field_a string
-}
-
-func TestIssue569(t *testing.T) {
-	data := `<item><Field_a>abcd</Field_a></item>`
-	var i item
-	err := Unmarshal([]byte(data), &i)
-
-	if err != nil || i.Field_a != "abcd" {
-		t.Fatal("Expecting abcd")
-	}
-}
-
-func TestUnquotedAttrs(t *testing.T) {
-	data := "<tag attr=azAZ09:-_\t>"
-	d := NewDecoder(strings.NewReader(data))
-	d.Strict = false
-	token, err := d.Token()
-	if _, ok := err.(*SyntaxError); ok {
-		t.Errorf("Unexpected error: %v", err)
-	}
-	if token.(StartElement).Name.Local != "tag" {
-		t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local)
-	}
-	attr := token.(StartElement).Attr[0]
-	if attr.Value != "azAZ09:-_" {
-		t.Errorf("Unexpected attribute value: %v", attr.Value)
-	}
-	if attr.Name.Local != "attr" {
-		t.Errorf("Unexpected attribute name: %v", attr.Name.Local)
-	}
-}
-
-func TestValuelessAttrs(t *testing.T) {
-	tests := [][3]string{
-		{"<p nowrap>", "p", "nowrap"},
-		{"<p nowrap >", "p", "nowrap"},
-		{"<input checked/>", "input", "checked"},
-		{"<input checked />", "input", "checked"},
-	}
-	for _, test := range tests {
-		d := NewDecoder(strings.NewReader(test[0]))
-		d.Strict = false
-		token, err := d.Token()
-		if _, ok := err.(*SyntaxError); ok {
-			t.Errorf("Unexpected error: %v", err)
-		}
-		if token.(StartElement).Name.Local != test[1] {
-			t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local)
-		}
-		attr := token.(StartElement).Attr[0]
-		if attr.Value != test[2] {
-			t.Errorf("Unexpected attribute value: %v", attr.Value)
-		}
-		if attr.Name.Local != test[2] {
-			t.Errorf("Unexpected attribute name: %v", attr.Name.Local)
-		}
-	}
-}
-
-func TestCopyTokenCharData(t *testing.T) {
-	data := []byte("same data")
-	var tok1 Token = CharData(data)
-	tok2 := CopyToken(tok1)
-	if !reflect.DeepEqual(tok1, tok2) {
-		t.Error("CopyToken(CharData) != CharData")
-	}
-	data[1] = 'o'
-	if reflect.DeepEqual(tok1, tok2) {
-		t.Error("CopyToken(CharData) uses same buffer.")
-	}
-}
-
-func TestCopyTokenStartElement(t *testing.T) {
-	elt := StartElement{Name{"", "hello"}, []Attr{{Name{"", "lang"}, "en"}}}
-	var tok1 Token = elt
-	tok2 := CopyToken(tok1)
-	if tok1.(StartElement).Attr[0].Value != "en" {
-		t.Error("CopyToken overwrote Attr[0]")
-	}
-	if !reflect.DeepEqual(tok1, tok2) {
-		t.Error("CopyToken(StartElement) != StartElement")
-	}
-	tok1.(StartElement).Attr[0] = Attr{Name{"", "lang"}, "de"}
-	if reflect.DeepEqual(tok1, tok2) {
-		t.Error("CopyToken(CharData) uses same buffer.")
-	}
-}
-
-func TestSyntaxErrorLineNum(t *testing.T) {
-	testInput := "<P>Foo<P>\n\n<P>Bar</>\n"
-	d := NewDecoder(strings.NewReader(testInput))
-	var err error
-	for _, err = d.Token(); err == nil; _, err = d.Token() {
-	}
-	synerr, ok := err.(*SyntaxError)
-	if !ok {
-		t.Error("Expected SyntaxError.")
-	}
-	if synerr.Line != 3 {
-		t.Error("SyntaxError didn't have correct line number.")
-	}
-}
-
-func TestTrailingRawToken(t *testing.T) {
-	input := `<FOO></FOO>  `
-	d := NewDecoder(strings.NewReader(input))
-	var err error
-	for _, err = d.RawToken(); err == nil; _, err = d.RawToken() {
-	}
-	if err != io.EOF {
-		t.Fatalf("d.RawToken() = _, %v, want _, io.EOF", err)
-	}
-}
-
-func TestTrailingToken(t *testing.T) {
-	input := `<FOO></FOO>  `
-	d := NewDecoder(strings.NewReader(input))
-	var err error
-	for _, err = d.Token(); err == nil; _, err = d.Token() {
-	}
-	if err != io.EOF {
-		t.Fatalf("d.Token() = _, %v, want _, io.EOF", err)
-	}
-}
-
-func TestEntityInsideCDATA(t *testing.T) {
-	input := `<test><![CDATA[ &val=foo ]]></test>`
-	d := NewDecoder(strings.NewReader(input))
-	var err error
-	for _, err = d.Token(); err == nil; _, err = d.Token() {
-	}
-	if err != io.EOF {
-		t.Fatalf("d.Token() = _, %v, want _, io.EOF", err)
-	}
-}
-
-var characterTests = []struct {
-	in  string
-	err string
-}{
-	{"\x12<doc/>", "illegal character code U+0012"},
-	{"<?xml version=\"1.0\"?>\x0b<doc/>", "illegal character code U+000B"},
-	{"\xef\xbf\xbe<doc/>", "illegal character code U+FFFE"},
-	{"<?xml version=\"1.0\"?><doc>\r\n<hiya/>\x07<toots/></doc>", "illegal character code U+0007"},
-	{"<?xml version=\"1.0\"?><doc \x12='value'>what's up</doc>", "expected attribute name in element"},
-	{"<doc>&abc\x01;</doc>", "invalid character entity &abc (no semicolon)"},
-	{"<doc>&\x01;</doc>", "invalid character entity & (no semicolon)"},
-	{"<doc>&\xef\xbf\xbe;</doc>", "invalid character entity &\uFFFE;"},
-	{"<doc>&hello;</doc>", "invalid character entity &hello;"},
-}
-
-func TestDisallowedCharacters(t *testing.T) {
-
-	for i, tt := range characterTests {
-		d := NewDecoder(strings.NewReader(tt.in))
-		var err error
-
-		for err == nil {
-			_, err = d.Token()
-		}
-		synerr, ok := err.(*SyntaxError)
-		if !ok {
-			t.Fatalf("input %d d.Token() = _, %v, want _, *SyntaxError", i, err)
-		}
-		if synerr.Msg != tt.err {
-			t.Fatalf("input %d synerr.Msg wrong: want %q, got %q", i, tt.err, synerr.Msg)
-		}
-	}
-}
-
-type procInstEncodingTest struct {
-	expect, got string
-}
-
-var procInstTests = []struct {
-	input  string
-	expect [2]string
-}{
-	{`version="1.0" encoding="utf-8"`, [2]string{"1.0", "utf-8"}},
-	{`version="1.0" encoding='utf-8'`, [2]string{"1.0", "utf-8"}},
-	{`version="1.0" encoding='utf-8' `, [2]string{"1.0", "utf-8"}},
-	{`version="1.0" encoding=utf-8`, [2]string{"1.0", ""}},
-	{`encoding="FOO" `, [2]string{"", "FOO"}},
-}
-
-func TestProcInstEncoding(t *testing.T) {
-	for _, test := range procInstTests {
-		if got := procInst("version", test.input); got != test.expect[0] {
-			t.Errorf("procInst(version, %q) = %q; want %q", test.input, got, test.expect[0])
-		}
-		if got := procInst("encoding", test.input); got != test.expect[1] {
-			t.Errorf("procInst(encoding, %q) = %q; want %q", test.input, got, test.expect[1])
-		}
-	}
-}
-
-// Ensure that directives with comments include the complete
-// text of any nested directives.
-
-var directivesWithCommentsInput = `
-<!DOCTYPE [<!-- a comment --><!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">]>
-<!DOCTYPE [<!ENTITY go "Golang"><!-- a comment-->]>
-<!DOCTYPE <!-> <!> <!----> <!-->--> <!--->--> [<!ENTITY go "Golang"><!-- a comment-->]>
-`
-
-var directivesWithCommentsTokens = []Token{
-	CharData("\n"),
-	Directive(`DOCTYPE [<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">]`),
-	CharData("\n"),
-	Directive(`DOCTYPE [<!ENTITY go "Golang">]`),
-	CharData("\n"),
-	Directive(`DOCTYPE <!-> <!>    [<!ENTITY go "Golang">]`),
-	CharData("\n"),
-}
-
-func TestDirectivesWithComments(t *testing.T) {
-	d := NewDecoder(strings.NewReader(directivesWithCommentsInput))
-
-	for i, want := range directivesWithCommentsTokens {
-		have, err := d.Token()
-		if err != nil {
-			t.Fatalf("token %d: unexpected error: %s", i, err)
-		}
-		if !reflect.DeepEqual(have, want) {
-			t.Errorf("token %d = %#v want %#v", i, have, want)
-		}
-	}
-}
-
-// Writer whose Write method always returns an error.
-type errWriter struct{}
-
-func (errWriter) Write(p []byte) (n int, err error) { return 0, fmt.Errorf("unwritable") }
-
-func TestEscapeTextIOErrors(t *testing.T) {
-	expectErr := "unwritable"
-	err := EscapeText(errWriter{}, []byte{'A'})
-
-	if err == nil || err.Error() != expectErr {
-		t.Errorf("have %v, want %v", err, expectErr)
-	}
-}
-
-func TestEscapeTextInvalidChar(t *testing.T) {
-	input := []byte("A \x00 terminated string.")
-	expected := "A \uFFFD terminated string."
-
-	buff := new(bytes.Buffer)
-	if err := EscapeText(buff, input); err != nil {
-		t.Fatalf("have %v, want nil", err)
-	}
-	text := buff.String()
-
-	if text != expected {
-		t.Errorf("have %v, want %v", text, expected)
-	}
-}
-
-func TestIssue5880(t *testing.T) {
-	type T []byte
-	data, err := Marshal(T{192, 168, 0, 1})
-	if err != nil {
-		t.Errorf("Marshal error: %v", err)
-	}
-	if !utf8.Valid(data) {
-		t.Errorf("Marshal generated invalid UTF-8: %x", data)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/errors/errors.go b/third_party/gofrontend/libgo/go/errors/errors.go
deleted file mode 100644
index 3085a79..0000000
--- a/third_party/gofrontend/libgo/go/errors/errors.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package errors implements functions to manipulate errors.
-package errors
-
-// New returns an error that formats as the given text.
-func New(text string) error {
-	return &errorString{text}
-}
-
-// errorString is a trivial implementation of error.
-type errorString struct {
-	s string
-}
-
-func (e *errorString) Error() string {
-	return e.s
-}
diff --git a/third_party/gofrontend/libgo/go/errors/errors_test.go b/third_party/gofrontend/libgo/go/errors/errors_test.go
deleted file mode 100644
index 63c05d7..0000000
--- a/third_party/gofrontend/libgo/go/errors/errors_test.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package errors_test
-
-import (
-	"errors"
-	"fmt"
-	"testing"
-)
-
-func TestNewEqual(t *testing.T) {
-	// Different allocations should not be equal.
-	if errors.New("abc") == errors.New("abc") {
-		t.Errorf(`New("abc") == New("abc")`)
-	}
-	if errors.New("abc") == errors.New("xyz") {
-		t.Errorf(`New("abc") == New("xyz")`)
-	}
-
-	// Same allocation should be equal to itself (not crash).
-	err := errors.New("jkl")
-	if err != err {
-		t.Errorf(`err != err`)
-	}
-}
-
-func TestErrorMethod(t *testing.T) {
-	err := errors.New("abc")
-	if err.Error() != "abc" {
-		t.Errorf(`New("abc").Error() = %q, want %q`, err.Error(), "abc")
-	}
-}
-
-func ExampleNew() {
-	err := errors.New("emit macho dwarf: elf header corrupted")
-	if err != nil {
-		fmt.Print(err)
-	}
-	// Output: emit macho dwarf: elf header corrupted
-}
-
-// The fmt package's Errorf function lets us use the package's formatting
-// features to create descriptive error messages.
-func ExampleNew_errorf() {
-	const name, id = "bimmler", 17
-	err := fmt.Errorf("user %q (id %d) not found", name, id)
-	if err != nil {
-		fmt.Print(err)
-	}
-	// Output: user "bimmler" (id 17) not found
-}
diff --git a/third_party/gofrontend/libgo/go/exp/README b/third_party/gofrontend/libgo/go/exp/README
deleted file mode 100644
index e602e3a..0000000
--- a/third_party/gofrontend/libgo/go/exp/README
+++ /dev/null
@@ -1,3 +0,0 @@
-This directory tree contains experimental packages and
-unfinished code that is subject to even more change than the
-rest of the Go tree.
diff --git a/third_party/gofrontend/libgo/go/exp/proxy/direct.go b/third_party/gofrontend/libgo/go/exp/proxy/direct.go
deleted file mode 100644
index 4c5ad88..0000000
--- a/third_party/gofrontend/libgo/go/exp/proxy/direct.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package proxy
-
-import (
-	"net"
-)
-
-type direct struct{}
-
-// Direct is a direct proxy: one that makes network connections directly.
-var Direct = direct{}
-
-func (direct) Dial(network, addr string) (net.Conn, error) {
-	return net.Dial(network, addr)
-}
diff --git a/third_party/gofrontend/libgo/go/exp/proxy/per_host.go b/third_party/gofrontend/libgo/go/exp/proxy/per_host.go
deleted file mode 100644
index 0c627e9..0000000
--- a/third_party/gofrontend/libgo/go/exp/proxy/per_host.go
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package proxy
-
-import (
-	"net"
-	"strings"
-)
-
-// A PerHost directs connections to a default Dailer unless the hostname
-// requested matches one of a number of exceptions.
-type PerHost struct {
-	def, bypass Dialer
-
-	bypassNetworks []*net.IPNet
-	bypassIPs      []net.IP
-	bypassZones    []string
-	bypassHosts    []string
-}
-
-// NewPerHost returns a PerHost Dialer that directs connections to either
-// defaultDialer or bypass, depending on whether the connection matches one of
-// the configured rules.
-func NewPerHost(defaultDialer, bypass Dialer) *PerHost {
-	return &PerHost{
-		def:    defaultDialer,
-		bypass: bypass,
-	}
-}
-
-// Dial connects to the address addr on the network net through either
-// defaultDialer or bypass.
-func (p *PerHost) Dial(network, addr string) (c net.Conn, err error) {
-	host, _, err := net.SplitHostPort(addr)
-	if err != nil {
-		return nil, err
-	}
-
-	return p.dialerForRequest(host).Dial(network, addr)
-}
-
-func (p *PerHost) dialerForRequest(host string) Dialer {
-	if ip := net.ParseIP(host); ip != nil {
-		for _, net := range p.bypassNetworks {
-			if net.Contains(ip) {
-				return p.bypass
-			}
-		}
-		for _, bypassIP := range p.bypassIPs {
-			if bypassIP.Equal(ip) {
-				return p.bypass
-			}
-		}
-		return p.def
-	}
-
-	for _, zone := range p.bypassZones {
-		if strings.HasSuffix(host, zone) {
-			return p.bypass
-		}
-		if host == zone[1:] {
-			// For a zone "example.com", we match "example.com"
-			// too.
-			return p.bypass
-		}
-	}
-	for _, bypassHost := range p.bypassHosts {
-		if bypassHost == host {
-			return p.bypass
-		}
-	}
-	return p.def
-}
-
-// AddFromString parses a string that contains comma-separated values
-// specifying hosts that should use the bypass proxy. Each value is either an
-// IP address, a CIDR range, a zone (*.example.com) or a hostname
-// (localhost). A best effort is made to parse the string and errors are
-// ignored.
-func (p *PerHost) AddFromString(s string) {
-	hosts := strings.Split(s, ",")
-	for _, host := range hosts {
-		host = strings.TrimSpace(host)
-		if len(host) == 0 {
-			continue
-		}
-		if strings.Contains(host, "/") {
-			// We assume that it's a CIDR address like 127.0.0.0/8
-			if _, net, err := net.ParseCIDR(host); err == nil {
-				p.AddNetwork(net)
-			}
-			continue
-		}
-		if ip := net.ParseIP(host); ip != nil {
-			p.AddIP(ip)
-			continue
-		}
-		if strings.HasPrefix(host, "*.") {
-			p.AddZone(host[1:])
-			continue
-		}
-		p.AddHost(host)
-	}
-}
-
-// AddIP specifies an IP address that will use the bypass proxy. Note that
-// this will only take effect if a literal IP address is dialed. A connection
-// to a named host will never match an IP.
-func (p *PerHost) AddIP(ip net.IP) {
-	p.bypassIPs = append(p.bypassIPs, ip)
-}
-
-// AddIP specifies an IP range that will use the bypass proxy. Note that this
-// will only take effect if a literal IP address is dialed. A connection to a
-// named host will never match.
-func (p *PerHost) AddNetwork(net *net.IPNet) {
-	p.bypassNetworks = append(p.bypassNetworks, net)
-}
-
-// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of
-// "example.com" matches "example.com" and all of its subdomains.
-func (p *PerHost) AddZone(zone string) {
-	if strings.HasSuffix(zone, ".") {
-		zone = zone[:len(zone)-1]
-	}
-	if !strings.HasPrefix(zone, ".") {
-		zone = "." + zone
-	}
-	p.bypassZones = append(p.bypassZones, zone)
-}
-
-// AddHost specifies a hostname that will use the bypass proxy.
-func (p *PerHost) AddHost(host string) {
-	if strings.HasSuffix(host, ".") {
-		host = host[:len(host)-1]
-	}
-	p.bypassHosts = append(p.bypassHosts, host)
-}
diff --git a/third_party/gofrontend/libgo/go/exp/proxy/per_host_test.go b/third_party/gofrontend/libgo/go/exp/proxy/per_host_test.go
deleted file mode 100644
index a7d8095..0000000
--- a/third_party/gofrontend/libgo/go/exp/proxy/per_host_test.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package proxy
-
-import (
-	"errors"
-	"net"
-	"reflect"
-	"testing"
-)
-
-type recordingProxy struct {
-	addrs []string
-}
-
-func (r *recordingProxy) Dial(network, addr string) (net.Conn, error) {
-	r.addrs = append(r.addrs, addr)
-	return nil, errors.New("recordingProxy")
-}
-
-func TestPerHost(t *testing.T) {
-	var def, bypass recordingProxy
-	perHost := NewPerHost(&def, &bypass)
-	perHost.AddFromString("localhost,*.zone,127.0.0.1,10.0.0.1/8,1000::/16")
-
-	expectedDef := []string{
-		"example.com:123",
-		"1.2.3.4:123",
-		"[1001::]:123",
-	}
-	expectedBypass := []string{
-		"localhost:123",
-		"zone:123",
-		"foo.zone:123",
-		"127.0.0.1:123",
-		"10.1.2.3:123",
-		"[1000::]:123",
-	}
-
-	for _, addr := range expectedDef {
-		perHost.Dial("tcp", addr)
-	}
-	for _, addr := range expectedBypass {
-		perHost.Dial("tcp", addr)
-	}
-
-	if !reflect.DeepEqual(expectedDef, def.addrs) {
-		t.Errorf("Hosts which went to the default proxy didn't match. Got %v, want %v", def.addrs, expectedDef)
-	}
-	if !reflect.DeepEqual(expectedBypass, bypass.addrs) {
-		t.Errorf("Hosts which went to the bypass proxy didn't match. Got %v, want %v", bypass.addrs, expectedBypass)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/exp/proxy/proxy.go b/third_party/gofrontend/libgo/go/exp/proxy/proxy.go
deleted file mode 100644
index b6cfd45..0000000
--- a/third_party/gofrontend/libgo/go/exp/proxy/proxy.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package proxy provides support for a variety of protocols to proxy network
-// data.
-package proxy
-
-import (
-	"errors"
-	"net"
-	"net/url"
-	"os"
-)
-
-// A Dialer is a means to establish a connection.
-type Dialer interface {
-	// Dial connects to the given address via the proxy.
-	Dial(network, addr string) (c net.Conn, err error)
-}
-
-// Auth contains authentication parameters that specific Dialers may require.
-type Auth struct {
-	User, Password string
-}
-
-// DefaultDialer returns the dialer specified by the proxy related variables in
-// the environment.
-func FromEnvironment() Dialer {
-	allProxy := os.Getenv("all_proxy")
-	if len(allProxy) == 0 {
-		return Direct
-	}
-
-	proxyURL, err := url.Parse(allProxy)
-	if err != nil {
-		return Direct
-	}
-	proxy, err := FromURL(proxyURL, Direct)
-	if err != nil {
-		return Direct
-	}
-
-	noProxy := os.Getenv("no_proxy")
-	if len(noProxy) == 0 {
-		return proxy
-	}
-
-	perHost := NewPerHost(proxy, Direct)
-	perHost.AddFromString(noProxy)
-	return perHost
-}
-
-// proxySchemes is a map from URL schemes to a function that creates a Dialer
-// from a URL with such a scheme.
-var proxySchemes map[string]func(*url.URL, Dialer) (Dialer, error)
-
-// RegisterDialerType takes a URL scheme and a function to generate Dialers from
-// a URL with that scheme and a forwarding Dialer. Registered schemes are used
-// by FromURL.
-func RegisterDialerType(scheme string, f func(*url.URL, Dialer) (Dialer, error)) {
-	if proxySchemes == nil {
-		proxySchemes = make(map[string]func(*url.URL, Dialer) (Dialer, error))
-	}
-	proxySchemes[scheme] = f
-}
-
-// FromURL returns a Dialer given a URL specification and an underlying
-// Dialer for it to make network requests.
-func FromURL(u *url.URL, forward Dialer) (Dialer, error) {
-	var auth *Auth
-	if u.User != nil {
-		auth = new(Auth)
-		auth.User = u.User.Username()
-		if p, ok := u.User.Password(); ok {
-			auth.Password = p
-		}
-	}
-
-	switch u.Scheme {
-	case "socks5":
-		return SOCKS5("tcp", u.Host, auth, forward)
-	}
-
-	// If the scheme doesn't match any of the built-in schemes, see if it
-	// was registered by another package.
-	if proxySchemes != nil {
-		if f, ok := proxySchemes[u.Scheme]; ok {
-			return f(u, forward)
-		}
-	}
-
-	return nil, errors.New("proxy: unknown scheme: " + u.Scheme)
-}
diff --git a/third_party/gofrontend/libgo/go/exp/proxy/proxy_test.go b/third_party/gofrontend/libgo/go/exp/proxy/proxy_test.go
deleted file mode 100644
index 4078bc7..0000000
--- a/third_party/gofrontend/libgo/go/exp/proxy/proxy_test.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package proxy
-
-import (
-	"net"
-	"net/url"
-	"testing"
-)
-
-type testDialer struct {
-	network, addr string
-}
-
-func (t *testDialer) Dial(network, addr string) (net.Conn, error) {
-	t.network = network
-	t.addr = addr
-	return nil, t
-}
-
-func (t *testDialer) Error() string {
-	return "testDialer " + t.network + " " + t.addr
-}
-
-func TestFromURL(t *testing.T) {
-	u, err := url.Parse("socks5://user:password@1.2.3.4:5678")
-	if err != nil {
-		t.Fatalf("failed to parse URL: %s", err)
-	}
-
-	tp := &testDialer{}
-	proxy, err := FromURL(u, tp)
-	if err != nil {
-		t.Fatalf("FromURL failed: %s", err)
-	}
-
-	conn, err := proxy.Dial("tcp", "example.com:80")
-	if conn != nil {
-		t.Error("Dial unexpected didn't return an error")
-	}
-	if tp, ok := err.(*testDialer); ok {
-		if tp.network != "tcp" || tp.addr != "1.2.3.4:5678" {
-			t.Errorf("Dialer connected to wrong host. Wanted 1.2.3.4:5678, got: %v", tp)
-		}
-	} else {
-		t.Errorf("Unexpected error from Dial: %s", err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/exp/proxy/socks5.go b/third_party/gofrontend/libgo/go/exp/proxy/socks5.go
deleted file mode 100644
index 62fa5c9..0000000
--- a/third_party/gofrontend/libgo/go/exp/proxy/socks5.go
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package proxy
-
-import (
-	"errors"
-	"io"
-	"net"
-	"strconv"
-)
-
-// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given address
-// with an optional username and password. See RFC 1928.
-func SOCKS5(network, addr string, auth *Auth, forward Dialer) (Dialer, error) {
-	s := &socks5{
-		network: network,
-		addr:    addr,
-		forward: forward,
-	}
-	if auth != nil {
-		s.user = auth.User
-		s.password = auth.Password
-	}
-
-	return s, nil
-}
-
-type socks5 struct {
-	user, password string
-	network, addr  string
-	forward        Dialer
-}
-
-const socks5Version = 5
-
-const (
-	socks5AuthNone     = 0
-	socks5AuthPassword = 2
-)
-
-const socks5Connect = 1
-
-const (
-	socks5IP4    = 1
-	socks5Domain = 3
-	socks5IP6    = 4
-)
-
-var socks5Errors = []string{
-	"",
-	"general failure",
-	"connection forbidden",
-	"network unreachable",
-	"host unreachable",
-	"connection refused",
-	"TTL expired",
-	"command not supported",
-	"address type not supported",
-}
-
-// Dial connects to the address addr on the network net via the SOCKS5 proxy.
-func (s *socks5) Dial(network, addr string) (net.Conn, error) {
-	switch network {
-	case "tcp", "tcp6", "tcp4":
-		break
-	default:
-		return nil, errors.New("proxy: no support for SOCKS5 proxy connections of type " + network)
-	}
-
-	conn, err := s.forward.Dial(s.network, s.addr)
-	if err != nil {
-		return nil, err
-	}
-	closeConn := &conn
-	defer func() {
-		if closeConn != nil {
-			(*closeConn).Close()
-		}
-	}()
-
-	host, portStr, err := net.SplitHostPort(addr)
-	if err != nil {
-		return nil, err
-	}
-
-	port, err := strconv.Atoi(portStr)
-	if err != nil {
-		return nil, errors.New("proxy: failed to parse port number: " + portStr)
-	}
-	if port < 1 || port > 0xffff {
-		return nil, errors.New("proxy: port number out of range: " + portStr)
-	}
-
-	// the size here is just an estimate
-	buf := make([]byte, 0, 6+len(host))
-
-	buf = append(buf, socks5Version)
-	if len(s.user) > 0 && len(s.user) < 256 && len(s.password) < 256 {
-		buf = append(buf, 2 /* num auth methods */, socks5AuthNone, socks5AuthPassword)
-	} else {
-		buf = append(buf, 1 /* num auth methods */, socks5AuthNone)
-	}
-
-	if _, err = conn.Write(buf); err != nil {
-		return nil, errors.New("proxy: failed to write greeting to SOCKS5 proxy at " + s.addr + ": " + err.Error())
-	}
-
-	if _, err = io.ReadFull(conn, buf[:2]); err != nil {
-		return nil, errors.New("proxy: failed to read greeting from SOCKS5 proxy at " + s.addr + ": " + err.Error())
-	}
-	if buf[0] != 5 {
-		return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " has unexpected version " + strconv.Itoa(int(buf[0])))
-	}
-	if buf[1] == 0xff {
-		return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " requires authentication")
-	}
-
-	if buf[1] == socks5AuthPassword {
-		buf = buf[:0]
-		buf = append(buf, socks5Version)
-		buf = append(buf, uint8(len(s.user)))
-		buf = append(buf, s.user...)
-		buf = append(buf, uint8(len(s.password)))
-		buf = append(buf, s.password...)
-
-		if _, err = conn.Write(buf); err != nil {
-			return nil, errors.New("proxy: failed to write authentication request to SOCKS5 proxy at " + s.addr + ": " + err.Error())
-		}
-
-		if _, err = io.ReadFull(conn, buf[:2]); err != nil {
-			return nil, errors.New("proxy: failed to read authentication reply from SOCKS5 proxy at " + s.addr + ": " + err.Error())
-		}
-
-		if buf[1] != 0 {
-			return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password")
-		}
-	}
-
-	buf = buf[:0]
-	buf = append(buf, socks5Version, socks5Connect, 0 /* reserved */)
-
-	if ip := net.ParseIP(host); ip != nil {
-		if len(ip) == 4 {
-			buf = append(buf, socks5IP4)
-		} else {
-			buf = append(buf, socks5IP6)
-		}
-		buf = append(buf, []byte(ip)...)
-	} else {
-		buf = append(buf, socks5Domain)
-		buf = append(buf, byte(len(host)))
-		buf = append(buf, host...)
-	}
-	buf = append(buf, byte(port>>8), byte(port))
-
-	if _, err = conn.Write(buf); err != nil {
-		return nil, errors.New("proxy: failed to write connect request to SOCKS5 proxy at " + s.addr + ": " + err.Error())
-	}
-
-	if _, err = io.ReadFull(conn, buf[:4]); err != nil {
-		return nil, errors.New("proxy: failed to read connect reply from SOCKS5 proxy at " + s.addr + ": " + err.Error())
-	}
-
-	failure := "unknown error"
-	if int(buf[1]) < len(socks5Errors) {
-		failure = socks5Errors[buf[1]]
-	}
-
-	if len(failure) > 0 {
-		return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure)
-	}
-
-	bytesToDiscard := 0
-	switch buf[3] {
-	case socks5IP4:
-		bytesToDiscard = 4
-	case socks5IP6:
-		bytesToDiscard = 16
-	case socks5Domain:
-		_, err := io.ReadFull(conn, buf[:1])
-		if err != nil {
-			return nil, errors.New("proxy: failed to read domain length from SOCKS5 proxy at " + s.addr + ": " + err.Error())
-		}
-		bytesToDiscard = int(buf[0])
-	default:
-		return nil, errors.New("proxy: got unknown address type " + strconv.Itoa(int(buf[3])) + " from SOCKS5 proxy at " + s.addr)
-	}
-
-	if cap(buf) < bytesToDiscard {
-		buf = make([]byte, bytesToDiscard)
-	} else {
-		buf = buf[:bytesToDiscard]
-	}
-	if _, err = io.ReadFull(conn, buf); err != nil {
-		return nil, errors.New("proxy: failed to read address from SOCKS5 proxy at " + s.addr + ": " + err.Error())
-	}
-
-	// Also need to discard the port number
-	if _, err = io.ReadFull(conn, buf[:2]); err != nil {
-		return nil, errors.New("proxy: failed to read port from SOCKS5 proxy at " + s.addr + ": " + err.Error())
-	}
-
-	closeConn = nil
-	return conn, nil
-}
diff --git a/third_party/gofrontend/libgo/go/exp/terminal/terminal.go b/third_party/gofrontend/libgo/go/exp/terminal/terminal.go
deleted file mode 100644
index c1ed0c0..0000000
--- a/third_party/gofrontend/libgo/go/exp/terminal/terminal.go
+++ /dev/null
@@ -1,520 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package terminal
-
-import (
-	"io"
-	"sync"
-)
-
-// EscapeCodes contains escape sequences that can be written to the terminal in
-// order to achieve different styles of text.
-type EscapeCodes struct {
-	// Foreground colors
-	Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte
-
-	// Reset all attributes
-	Reset []byte
-}
-
-var vt100EscapeCodes = EscapeCodes{
-	Black:   []byte{keyEscape, '[', '3', '0', 'm'},
-	Red:     []byte{keyEscape, '[', '3', '1', 'm'},
-	Green:   []byte{keyEscape, '[', '3', '2', 'm'},
-	Yellow:  []byte{keyEscape, '[', '3', '3', 'm'},
-	Blue:    []byte{keyEscape, '[', '3', '4', 'm'},
-	Magenta: []byte{keyEscape, '[', '3', '5', 'm'},
-	Cyan:    []byte{keyEscape, '[', '3', '6', 'm'},
-	White:   []byte{keyEscape, '[', '3', '7', 'm'},
-
-	Reset: []byte{keyEscape, '[', '0', 'm'},
-}
-
-// Terminal contains the state for running a VT100 terminal that is capable of
-// reading lines of input.
-type Terminal struct {
-	// AutoCompleteCallback, if non-null, is called for each keypress
-	// with the full input line and the current position of the cursor.
-	// If it returns a nil newLine, the key press is processed normally.
-	// Otherwise it returns a replacement line and the new cursor position.
-	AutoCompleteCallback func(line []byte, pos, key int) (newLine []byte, newPos int)
-
-	// Escape contains a pointer to the escape codes for this terminal.
-	// It's always a valid pointer, although the escape codes themselves
-	// may be empty if the terminal doesn't support them.
-	Escape *EscapeCodes
-
-	// lock protects the terminal and the state in this object from
-	// concurrent processing of a key press and a Write() call.
-	lock sync.Mutex
-
-	c      io.ReadWriter
-	prompt string
-
-	// line is the current line being entered.
-	line []byte
-	// pos is the logical position of the cursor in line
-	pos int
-	// echo is true if local echo is enabled
-	echo bool
-
-	// cursorX contains the current X value of the cursor where the left
-	// edge is 0. cursorY contains the row number where the first row of
-	// the current line is 0.
-	cursorX, cursorY int
-	// maxLine is the greatest value of cursorY so far.
-	maxLine int
-
-	termWidth, termHeight int
-
-	// outBuf contains the terminal data to be sent.
-	outBuf []byte
-	// remainder contains the remainder of any partial key sequences after
-	// a read. It aliases into inBuf.
-	remainder []byte
-	inBuf     [256]byte
-}
-
-// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is
-// a local terminal, that terminal must first have been put into raw mode.
-// prompt is a string that is written at the start of each input line (i.e.
-// "> ").
-func NewTerminal(c io.ReadWriter, prompt string) *Terminal {
-	return &Terminal{
-		Escape:     &vt100EscapeCodes,
-		c:          c,
-		prompt:     prompt,
-		termWidth:  80,
-		termHeight: 24,
-		echo:       true,
-	}
-}
-
-const (
-	keyCtrlD     = 4
-	keyEnter     = '\r'
-	keyEscape    = 27
-	keyBackspace = 127
-	keyUnknown   = 256 + iota
-	keyUp
-	keyDown
-	keyLeft
-	keyRight
-	keyAltLeft
-	keyAltRight
-)
-
-// bytesToKey tries to parse a key sequence from b. If successful, it returns
-// the key and the remainder of the input. Otherwise it returns -1.
-func bytesToKey(b []byte) (int, []byte) {
-	if len(b) == 0 {
-		return -1, nil
-	}
-
-	if b[0] != keyEscape {
-		return int(b[0]), b[1:]
-	}
-
-	if len(b) >= 3 && b[0] == keyEscape && b[1] == '[' {
-		switch b[2] {
-		case 'A':
-			return keyUp, b[3:]
-		case 'B':
-			return keyDown, b[3:]
-		case 'C':
-			return keyRight, b[3:]
-		case 'D':
-			return keyLeft, b[3:]
-		}
-	}
-
-	if len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' {
-		switch b[5] {
-		case 'C':
-			return keyAltRight, b[6:]
-		case 'D':
-			return keyAltLeft, b[6:]
-		}
-	}
-
-	// If we get here then we have a key that we don't recognise, or a
-	// partial sequence. It's not clear how one should find the end of a
-	// sequence without knowing them all, but it seems that [a-zA-Z] only
-	// appears at the end of a sequence.
-	for i, c := range b[0:] {
-		if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' {
-			return keyUnknown, b[i+1:]
-		}
-	}
-
-	return -1, b
-}
-
-// queue appends data to the end of t.outBuf
-func (t *Terminal) queue(data []byte) {
-	t.outBuf = append(t.outBuf, data...)
-}
-
-var eraseUnderCursor = []byte{' ', keyEscape, '[', 'D'}
-var space = []byte{' '}
-
-func isPrintable(key int) bool {
-	return key >= 32 && key < 127
-}
-
-// moveCursorToPos appends data to t.outBuf which will move the cursor to the
-// given, logical position in the text.
-func (t *Terminal) moveCursorToPos(pos int) {
-	if !t.echo {
-		return
-	}
-
-	x := len(t.prompt) + pos
-	y := x / t.termWidth
-	x = x % t.termWidth
-
-	up := 0
-	if y < t.cursorY {
-		up = t.cursorY - y
-	}
-
-	down := 0
-	if y > t.cursorY {
-		down = y - t.cursorY
-	}
-
-	left := 0
-	if x < t.cursorX {
-		left = t.cursorX - x
-	}
-
-	right := 0
-	if x > t.cursorX {
-		right = x - t.cursorX
-	}
-
-	t.cursorX = x
-	t.cursorY = y
-	t.move(up, down, left, right)
-}
-
-func (t *Terminal) move(up, down, left, right int) {
-	movement := make([]byte, 3*(up+down+left+right))
-	m := movement
-	for i := 0; i < up; i++ {
-		m[0] = keyEscape
-		m[1] = '['
-		m[2] = 'A'
-		m = m[3:]
-	}
-	for i := 0; i < down; i++ {
-		m[0] = keyEscape
-		m[1] = '['
-		m[2] = 'B'
-		m = m[3:]
-	}
-	for i := 0; i < left; i++ {
-		m[0] = keyEscape
-		m[1] = '['
-		m[2] = 'D'
-		m = m[3:]
-	}
-	for i := 0; i < right; i++ {
-		m[0] = keyEscape
-		m[1] = '['
-		m[2] = 'C'
-		m = m[3:]
-	}
-
-	t.queue(movement)
-}
-
-func (t *Terminal) clearLineToRight() {
-	op := []byte{keyEscape, '[', 'K'}
-	t.queue(op)
-}
-
-const maxLineLength = 4096
-
-// handleKey processes the given key and, optionally, returns a line of text
-// that the user has entered.
-func (t *Terminal) handleKey(key int) (line string, ok bool) {
-	switch key {
-	case keyBackspace:
-		if t.pos == 0 {
-			return
-		}
-		t.pos--
-		t.moveCursorToPos(t.pos)
-
-		copy(t.line[t.pos:], t.line[1+t.pos:])
-		t.line = t.line[:len(t.line)-1]
-		if t.echo {
-			t.writeLine(t.line[t.pos:])
-		}
-		t.queue(eraseUnderCursor)
-		t.moveCursorToPos(t.pos)
-	case keyAltLeft:
-		// move left by a word.
-		if t.pos == 0 {
-			return
-		}
-		t.pos--
-		for t.pos > 0 {
-			if t.line[t.pos] != ' ' {
-				break
-			}
-			t.pos--
-		}
-		for t.pos > 0 {
-			if t.line[t.pos] == ' ' {
-				t.pos++
-				break
-			}
-			t.pos--
-		}
-		t.moveCursorToPos(t.pos)
-	case keyAltRight:
-		// move right by a word.
-		for t.pos < len(t.line) {
-			if t.line[t.pos] == ' ' {
-				break
-			}
-			t.pos++
-		}
-		for t.pos < len(t.line) {
-			if t.line[t.pos] != ' ' {
-				break
-			}
-			t.pos++
-		}
-		t.moveCursorToPos(t.pos)
-	case keyLeft:
-		if t.pos == 0 {
-			return
-		}
-		t.pos--
-		t.moveCursorToPos(t.pos)
-	case keyRight:
-		if t.pos == len(t.line) {
-			return
-		}
-		t.pos++
-		t.moveCursorToPos(t.pos)
-	case keyEnter:
-		t.moveCursorToPos(len(t.line))
-		t.queue([]byte("\r\n"))
-		line = string(t.line)
-		ok = true
-		t.line = t.line[:0]
-		t.pos = 0
-		t.cursorX = 0
-		t.cursorY = 0
-		t.maxLine = 0
-	default:
-		if t.AutoCompleteCallback != nil {
-			t.lock.Unlock()
-			newLine, newPos := t.AutoCompleteCallback(t.line, t.pos, key)
-			t.lock.Lock()
-
-			if newLine != nil {
-				if t.echo {
-					t.moveCursorToPos(0)
-					t.writeLine(newLine)
-					for i := len(newLine); i < len(t.line); i++ {
-						t.writeLine(space)
-					}
-					t.moveCursorToPos(newPos)
-				}
-				t.line = newLine
-				t.pos = newPos
-				return
-			}
-		}
-		if !isPrintable(key) {
-			return
-		}
-		if len(t.line) == maxLineLength {
-			return
-		}
-		if len(t.line) == cap(t.line) {
-			newLine := make([]byte, len(t.line), 2*(1+len(t.line)))
-			copy(newLine, t.line)
-			t.line = newLine
-		}
-		t.line = t.line[:len(t.line)+1]
-		copy(t.line[t.pos+1:], t.line[t.pos:])
-		t.line[t.pos] = byte(key)
-		if t.echo {
-			t.writeLine(t.line[t.pos:])
-		}
-		t.pos++
-		t.moveCursorToPos(t.pos)
-	}
-	return
-}
-
-func (t *Terminal) writeLine(line []byte) {
-	for len(line) != 0 {
-		remainingOnLine := t.termWidth - t.cursorX
-		todo := len(line)
-		if todo > remainingOnLine {
-			todo = remainingOnLine
-		}
-		t.queue(line[:todo])
-		t.cursorX += todo
-		line = line[todo:]
-
-		if t.cursorX == t.termWidth {
-			t.cursorX = 0
-			t.cursorY++
-			if t.cursorY > t.maxLine {
-				t.maxLine = t.cursorY
-			}
-		}
-	}
-}
-
-func (t *Terminal) Write(buf []byte) (n int, err error) {
-	t.lock.Lock()
-	defer t.lock.Unlock()
-
-	if t.cursorX == 0 && t.cursorY == 0 {
-		// This is the easy case: there's nothing on the screen that we
-		// have to move out of the way.
-		return t.c.Write(buf)
-	}
-
-	// We have a prompt and possibly user input on the screen. We
-	// have to clear it first.
-	t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */)
-	t.cursorX = 0
-	t.clearLineToRight()
-
-	for t.cursorY > 0 {
-		t.move(1 /* up */, 0, 0, 0)
-		t.cursorY--
-		t.clearLineToRight()
-	}
-
-	if _, err = t.c.Write(t.outBuf); err != nil {
-		return
-	}
-	t.outBuf = t.outBuf[:0]
-
-	if n, err = t.c.Write(buf); err != nil {
-		return
-	}
-
-	t.queue([]byte(t.prompt))
-	chars := len(t.prompt)
-	if t.echo {
-		t.queue(t.line)
-		chars += len(t.line)
-	}
-	t.cursorX = chars % t.termWidth
-	t.cursorY = chars / t.termWidth
-	t.moveCursorToPos(t.pos)
-
-	if _, err = t.c.Write(t.outBuf); err != nil {
-		return
-	}
-	t.outBuf = t.outBuf[:0]
-	return
-}
-
-// ReadPassword temporarily changes the prompt and reads a password, without
-// echo, from the terminal.
-func (t *Terminal) ReadPassword(prompt string) (line string, err error) {
-	t.lock.Lock()
-	defer t.lock.Unlock()
-
-	oldPrompt := t.prompt
-	t.prompt = prompt
-	t.echo = false
-
-	line, err = t.readLine()
-
-	t.prompt = oldPrompt
-	t.echo = true
-
-	return
-}
-
-// ReadLine returns a line of input from the terminal.
-func (t *Terminal) ReadLine() (line string, err error) {
-	t.lock.Lock()
-	defer t.lock.Unlock()
-
-	return t.readLine()
-}
-
-func (t *Terminal) readLine() (line string, err error) {
-	// t.lock must be held at this point
-
-	if t.cursorX == 0 && t.cursorY == 0 {
-		t.writeLine([]byte(t.prompt))
-		t.c.Write(t.outBuf)
-		t.outBuf = t.outBuf[:0]
-	}
-
-	for {
-		rest := t.remainder
-		lineOk := false
-		for !lineOk {
-			var key int
-			key, rest = bytesToKey(rest)
-			if key < 0 {
-				break
-			}
-			if key == keyCtrlD {
-				return "", io.EOF
-			}
-			line, lineOk = t.handleKey(key)
-		}
-		if len(rest) > 0 {
-			n := copy(t.inBuf[:], rest)
-			t.remainder = t.inBuf[:n]
-		} else {
-			t.remainder = nil
-		}
-		t.c.Write(t.outBuf)
-		t.outBuf = t.outBuf[:0]
-		if lineOk {
-			return
-		}
-
-		// t.remainder is a slice at the beginning of t.inBuf
-		// containing a partial key sequence
-		readBuf := t.inBuf[len(t.remainder):]
-		var n int
-
-		t.lock.Unlock()
-		n, err = t.c.Read(readBuf)
-		t.lock.Lock()
-
-		if err != nil {
-			return
-		}
-
-		t.remainder = t.inBuf[:n+len(t.remainder)]
-	}
-	panic("unreachable")
-}
-
-// SetPrompt sets the prompt to be used when reading subsequent lines.
-func (t *Terminal) SetPrompt(prompt string) {
-	t.lock.Lock()
-	defer t.lock.Unlock()
-
-	t.prompt = prompt
-}
-
-func (t *Terminal) SetSize(width, height int) {
-	t.lock.Lock()
-	defer t.lock.Unlock()
-
-	t.termWidth, t.termHeight = width, height
-}
diff --git a/third_party/gofrontend/libgo/go/exp/terminal/terminal_test.go b/third_party/gofrontend/libgo/go/exp/terminal/terminal_test.go
deleted file mode 100644
index a219721..0000000
--- a/third_party/gofrontend/libgo/go/exp/terminal/terminal_test.go
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package terminal
-
-import (
-	"io"
-	"testing"
-)
-
-type MockTerminal struct {
-	toSend       []byte
-	bytesPerRead int
-	received     []byte
-}
-
-func (c *MockTerminal) Read(data []byte) (n int, err error) {
-	n = len(data)
-	if n == 0 {
-		return
-	}
-	if n > len(c.toSend) {
-		n = len(c.toSend)
-	}
-	if n == 0 {
-		return 0, io.EOF
-	}
-	if c.bytesPerRead > 0 && n > c.bytesPerRead {
-		n = c.bytesPerRead
-	}
-	copy(data, c.toSend[:n])
-	c.toSend = c.toSend[n:]
-	return
-}
-
-func (c *MockTerminal) Write(data []byte) (n int, err error) {
-	c.received = append(c.received, data...)
-	return len(data), nil
-}
-
-func TestClose(t *testing.T) {
-	c := &MockTerminal{}
-	ss := NewTerminal(c, "> ")
-	line, err := ss.ReadLine()
-	if line != "" {
-		t.Errorf("Expected empty line but got: %s", line)
-	}
-	if err != io.EOF {
-		t.Errorf("Error should have been EOF but got: %s", err)
-	}
-}
-
-var keyPressTests = []struct {
-	in   string
-	line string
-	err  error
-}{
-	{
-		"",
-		"",
-		io.EOF,
-	},
-	{
-		"\r",
-		"",
-		nil,
-	},
-	{
-		"foo\r",
-		"foo",
-		nil,
-	},
-	{
-		"a\x1b[Cb\r", // right
-		"ab",
-		nil,
-	},
-	{
-		"a\x1b[Db\r", // left
-		"ba",
-		nil,
-	},
-	{
-		"a\177b\r", // backspace
-		"b",
-		nil,
-	},
-}
-
-func TestKeyPresses(t *testing.T) {
-	for i, test := range keyPressTests {
-		for j := 0; j < len(test.in); j++ {
-			c := &MockTerminal{
-				toSend:       []byte(test.in),
-				bytesPerRead: j,
-			}
-			ss := NewTerminal(c, "> ")
-			line, err := ss.ReadLine()
-			if line != test.line {
-				t.Errorf("Line resulting from test %d (%d bytes per read) was '%s', expected '%s'", i, j, line, test.line)
-				break
-			}
-			if err != test.err {
-				t.Errorf("Error resulting from test %d (%d bytes per read) was '%v', expected '%v'", i, j, err, test.err)
-				break
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/exp/terminal/util.go b/third_party/gofrontend/libgo/go/exp/terminal/util.go
deleted file mode 100644
index 211f41d..0000000
--- a/third_party/gofrontend/libgo/go/exp/terminal/util.go
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build linux
-
-// Package terminal provides support functions for dealing with terminals, as
-// commonly found on UNIX systems.
-//
-// Putting a terminal into raw mode is the most common requirement:
-//
-// 	oldState, err := terminal.MakeRaw(0)
-// 	if err != nil {
-// 	        panic(err)
-// 	}
-// 	defer terminal.Restore(0, oldState)
-package terminal
-
-import (
-	"io"
-	"syscall"
-	"unsafe"
-)
-
-// State contains the state of a terminal.
-type State struct {
-	termios syscall.Termios
-}
-
-// IsTerminal returns true if the given file descriptor is a terminal.
-func IsTerminal(fd int) bool {
-	var termios syscall.Termios
-	err := syscall.Tcgetattr(fd, &termios)
-	return err == nil
-}
-
-// MakeRaw put the terminal connected to the given file descriptor into raw
-// mode and returns the previous state of the terminal so that it can be
-// restored.
-func MakeRaw(fd int) (*State, error) {
-	var oldState State
-	if err := syscall.Tcgetattr(fd, &oldState.termios); err != nil {
-		return nil, err
-	}
-
-	newState := oldState.termios
-	newState.Iflag &^= syscall.ISTRIP | syscall.INLCR | syscall.ICRNL | syscall.IGNCR | syscall.IXON | syscall.IXOFF
-	newState.Lflag &^= syscall.ECHO | syscall.ICANON | syscall.ISIG
-	if err := syscall.Tcsetattr(fd, syscall.TCSANOW, &newState); err != nil {
-		return nil, err
-	}
-
-	return &oldState, nil
-}
-
-// Restore restores the terminal connected to the given file descriptor to a
-// previous state.
-func Restore(fd int, state *State) error {
-	err := syscall.Tcsetattr(fd, syscall.TCSANOW, &state.termios)
-	return err
-}
-
-//extern ioctl
-func ioctl(int, int, unsafe.Pointer) int
-
-// GetSize returns the dimensions of the given terminal.
-func GetSize(fd int) (width, height int, err error) {
-	var dimensions [4]uint16
-
-	if ioctl(fd, syscall.TIOCGWINSZ, unsafe.Pointer(&dimensions)) < 0 {
-		return -1, -1, syscall.GetErrno()
-	}
-	return int(dimensions[1]), int(dimensions[0]), nil
-}
-
-// ReadPassword reads a line of input from a terminal without local echo.  This
-// is commonly used for inputting passwords and other sensitive data. The slice
-// returned does not include the \n.
-func ReadPassword(fd int) ([]byte, error) {
-	var oldState syscall.Termios
-	if err := syscall.Tcgetattr(fd, &oldState); err != nil {
-		return nil, err
-	}
-
-	newState := oldState
-	newState.Lflag &^= syscall.ECHO
-	if err := syscall.Tcsetattr(fd, syscall.TCSANOW, &newState); err != nil {
-		return nil, err
-	}
-
-	defer func() {
-		syscall.Tcsetattr(fd, syscall.TCSANOW, &oldState)
-	}()
-
-	var buf [16]byte
-	var ret []byte
-	for {
-		n, err := syscall.Read(fd, buf[:])
-		if err != nil {
-			return nil, err
-		}
-		if n == 0 {
-			if len(ret) == 0 {
-				return nil, io.EOF
-			}
-			break
-		}
-		if buf[n-1] == '\n' {
-			n--
-		}
-		ret = append(ret, buf[:n]...)
-		if n < len(buf) {
-			break
-		}
-	}
-
-	return ret, nil
-}
diff --git a/third_party/gofrontend/libgo/go/expvar/expvar.go b/third_party/gofrontend/libgo/go/expvar/expvar.go
deleted file mode 100644
index 24c2d6b..0000000
--- a/third_party/gofrontend/libgo/go/expvar/expvar.go
+++ /dev/null
@@ -1,333 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package expvar provides a standardized interface to public variables, such
-// as operation counters in servers. It exposes these variables via HTTP at
-// /debug/vars in JSON format.
-//
-// Operations to set or modify these public variables are atomic.
-//
-// In addition to adding the HTTP handler, this package registers the
-// following variables:
-//
-//	cmdline   os.Args
-//	memstats  runtime.Memstats
-//
-// The package is sometimes only imported for the side effect of
-// registering its HTTP handler and the above variables.  To use it
-// this way, link this package into your program:
-//	import _ "expvar"
-//
-package expvar
-
-import (
-	"bytes"
-	"encoding/json"
-	"fmt"
-	"log"
-	"math"
-	"net/http"
-	"os"
-	"runtime"
-	"sort"
-	"strconv"
-	"sync"
-	"sync/atomic"
-)
-
-// Var is an abstract type for all exported variables.
-type Var interface {
-	String() string
-}
-
-// Int is a 64-bit integer variable that satisfies the Var interface.
-type Int struct {
-	i int64
-}
-
-func (v *Int) String() string {
-	return strconv.FormatInt(atomic.LoadInt64(&v.i), 10)
-}
-
-func (v *Int) Add(delta int64) {
-	atomic.AddInt64(&v.i, delta)
-}
-
-func (v *Int) Set(value int64) {
-	atomic.StoreInt64(&v.i, value)
-}
-
-// Float is a 64-bit float variable that satisfies the Var interface.
-type Float struct {
-	f uint64
-}
-
-func (v *Float) String() string {
-	return strconv.FormatFloat(
-		math.Float64frombits(atomic.LoadUint64(&v.f)), 'g', -1, 64)
-}
-
-// Add adds delta to v.
-func (v *Float) Add(delta float64) {
-	for {
-		cur := atomic.LoadUint64(&v.f)
-		curVal := math.Float64frombits(cur)
-		nxtVal := curVal + delta
-		nxt := math.Float64bits(nxtVal)
-		if atomic.CompareAndSwapUint64(&v.f, cur, nxt) {
-			return
-		}
-	}
-}
-
-// Set sets v to value.
-func (v *Float) Set(value float64) {
-	atomic.StoreUint64(&v.f, math.Float64bits(value))
-}
-
-// Map is a string-to-Var map variable that satisfies the Var interface.
-type Map struct {
-	mu   sync.RWMutex
-	m    map[string]Var
-	keys []string // sorted
-}
-
-// KeyValue represents a single entry in a Map.
-type KeyValue struct {
-	Key   string
-	Value Var
-}
-
-func (v *Map) String() string {
-	v.mu.RLock()
-	defer v.mu.RUnlock()
-	var b bytes.Buffer
-	fmt.Fprintf(&b, "{")
-	first := true
-	v.doLocked(func(kv KeyValue) {
-		if !first {
-			fmt.Fprintf(&b, ", ")
-		}
-		fmt.Fprintf(&b, "%q: %v", kv.Key, kv.Value)
-		first = false
-	})
-	fmt.Fprintf(&b, "}")
-	return b.String()
-}
-
-func (v *Map) Init() *Map {
-	v.m = make(map[string]Var)
-	return v
-}
-
-// updateKeys updates the sorted list of keys in v.keys.
-// must be called with v.mu held.
-func (v *Map) updateKeys() {
-	if len(v.m) == len(v.keys) {
-		// No new key.
-		return
-	}
-	v.keys = v.keys[:0]
-	for k := range v.m {
-		v.keys = append(v.keys, k)
-	}
-	sort.Strings(v.keys)
-}
-
-func (v *Map) Get(key string) Var {
-	v.mu.RLock()
-	defer v.mu.RUnlock()
-	return v.m[key]
-}
-
-func (v *Map) Set(key string, av Var) {
-	v.mu.Lock()
-	defer v.mu.Unlock()
-	v.m[key] = av
-	v.updateKeys()
-}
-
-func (v *Map) Add(key string, delta int64) {
-	v.mu.RLock()
-	av, ok := v.m[key]
-	v.mu.RUnlock()
-	if !ok {
-		// check again under the write lock
-		v.mu.Lock()
-		av, ok = v.m[key]
-		if !ok {
-			av = new(Int)
-			v.m[key] = av
-			v.updateKeys()
-		}
-		v.mu.Unlock()
-	}
-
-	// Add to Int; ignore otherwise.
-	if iv, ok := av.(*Int); ok {
-		iv.Add(delta)
-	}
-}
-
-// AddFloat adds delta to the *Float value stored under the given map key.
-func (v *Map) AddFloat(key string, delta float64) {
-	v.mu.RLock()
-	av, ok := v.m[key]
-	v.mu.RUnlock()
-	if !ok {
-		// check again under the write lock
-		v.mu.Lock()
-		av, ok = v.m[key]
-		if !ok {
-			av = new(Float)
-			v.m[key] = av
-			v.updateKeys()
-		}
-		v.mu.Unlock()
-	}
-
-	// Add to Float; ignore otherwise.
-	if iv, ok := av.(*Float); ok {
-		iv.Add(delta)
-	}
-}
-
-// Do calls f for each entry in the map.
-// The map is locked during the iteration,
-// but existing entries may be concurrently updated.
-func (v *Map) Do(f func(KeyValue)) {
-	v.mu.RLock()
-	defer v.mu.RUnlock()
-	v.doLocked(f)
-}
-
-// doLocked calls f for each entry in the map.
-// v.mu must be held for reads.
-func (v *Map) doLocked(f func(KeyValue)) {
-	for _, k := range v.keys {
-		f(KeyValue{k, v.m[k]})
-	}
-}
-
-// String is a string variable, and satisfies the Var interface.
-type String struct {
-	mu sync.RWMutex
-	s  string
-}
-
-func (v *String) String() string {
-	v.mu.RLock()
-	defer v.mu.RUnlock()
-	return strconv.Quote(v.s)
-}
-
-func (v *String) Set(value string) {
-	v.mu.Lock()
-	defer v.mu.Unlock()
-	v.s = value
-}
-
-// Func implements Var by calling the function
-// and formatting the returned value using JSON.
-type Func func() interface{}
-
-func (f Func) String() string {
-	v, _ := json.Marshal(f())
-	return string(v)
-}
-
-// All published variables.
-var (
-	mutex   sync.RWMutex
-	vars    = make(map[string]Var)
-	varKeys []string // sorted
-)
-
-// Publish declares a named exported variable. This should be called from a
-// package's init function when it creates its Vars. If the name is already
-// registered then this will log.Panic.
-func Publish(name string, v Var) {
-	mutex.Lock()
-	defer mutex.Unlock()
-	if _, existing := vars[name]; existing {
-		log.Panicln("Reuse of exported var name:", name)
-	}
-	vars[name] = v
-	varKeys = append(varKeys, name)
-	sort.Strings(varKeys)
-}
-
-// Get retrieves a named exported variable.
-func Get(name string) Var {
-	mutex.RLock()
-	defer mutex.RUnlock()
-	return vars[name]
-}
-
-// Convenience functions for creating new exported variables.
-
-func NewInt(name string) *Int {
-	v := new(Int)
-	Publish(name, v)
-	return v
-}
-
-func NewFloat(name string) *Float {
-	v := new(Float)
-	Publish(name, v)
-	return v
-}
-
-func NewMap(name string) *Map {
-	v := new(Map).Init()
-	Publish(name, v)
-	return v
-}
-
-func NewString(name string) *String {
-	v := new(String)
-	Publish(name, v)
-	return v
-}
-
-// Do calls f for each exported variable.
-// The global variable map is locked during the iteration,
-// but existing entries may be concurrently updated.
-func Do(f func(KeyValue)) {
-	mutex.RLock()
-	defer mutex.RUnlock()
-	for _, k := range varKeys {
-		f(KeyValue{k, vars[k]})
-	}
-}
-
-func expvarHandler(w http.ResponseWriter, r *http.Request) {
-	w.Header().Set("Content-Type", "application/json; charset=utf-8")
-	fmt.Fprintf(w, "{\n")
-	first := true
-	Do(func(kv KeyValue) {
-		if !first {
-			fmt.Fprintf(w, ",\n")
-		}
-		first = false
-		fmt.Fprintf(w, "%q: %s", kv.Key, kv.Value)
-	})
-	fmt.Fprintf(w, "\n}\n")
-}
-
-func cmdline() interface{} {
-	return os.Args
-}
-
-func memstats() interface{} {
-	stats := new(runtime.MemStats)
-	runtime.ReadMemStats(stats)
-	return *stats
-}
-
-func init() {
-	http.HandleFunc("/debug/vars", expvarHandler)
-	Publish("cmdline", Func(cmdline))
-	Publish("memstats", Func(memstats))
-}
diff --git a/third_party/gofrontend/libgo/go/expvar/expvar_test.go b/third_party/gofrontend/libgo/go/expvar/expvar_test.go
deleted file mode 100644
index 8bc633e..0000000
--- a/third_party/gofrontend/libgo/go/expvar/expvar_test.go
+++ /dev/null
@@ -1,390 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package expvar
-
-import (
-	"bytes"
-	"encoding/json"
-	"math"
-	"net"
-	"net/http/httptest"
-	"runtime"
-	"strconv"
-	"sync"
-	"sync/atomic"
-	"testing"
-)
-
-// RemoveAll removes all exported variables.
-// This is for tests only.
-func RemoveAll() {
-	mutex.Lock()
-	defer mutex.Unlock()
-	vars = make(map[string]Var)
-	varKeys = nil
-}
-
-func TestInt(t *testing.T) {
-	RemoveAll()
-	reqs := NewInt("requests")
-	if reqs.i != 0 {
-		t.Errorf("reqs.i = %v, want 0", reqs.i)
-	}
-	if reqs != Get("requests").(*Int) {
-		t.Errorf("Get() failed.")
-	}
-
-	reqs.Add(1)
-	reqs.Add(3)
-	if reqs.i != 4 {
-		t.Errorf("reqs.i = %v, want 4", reqs.i)
-	}
-
-	if s := reqs.String(); s != "4" {
-		t.Errorf("reqs.String() = %q, want \"4\"", s)
-	}
-
-	reqs.Set(-2)
-	if reqs.i != -2 {
-		t.Errorf("reqs.i = %v, want -2", reqs.i)
-	}
-}
-
-func BenchmarkIntAdd(b *testing.B) {
-	var v Int
-
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			v.Add(1)
-		}
-	})
-}
-
-func BenchmarkIntSet(b *testing.B) {
-	var v Int
-
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			v.Set(1)
-		}
-	})
-}
-
-func (v *Float) val() float64 {
-	return math.Float64frombits(atomic.LoadUint64(&v.f))
-}
-
-func TestFloat(t *testing.T) {
-	RemoveAll()
-	reqs := NewFloat("requests-float")
-	if reqs.f != 0.0 {
-		t.Errorf("reqs.f = %v, want 0", reqs.f)
-	}
-	if reqs != Get("requests-float").(*Float) {
-		t.Errorf("Get() failed.")
-	}
-
-	reqs.Add(1.5)
-	reqs.Add(1.25)
-	if v := reqs.val(); v != 2.75 {
-		t.Errorf("reqs.val() = %v, want 2.75", v)
-	}
-
-	if s := reqs.String(); s != "2.75" {
-		t.Errorf("reqs.String() = %q, want \"4.64\"", s)
-	}
-
-	reqs.Add(-2)
-	if v := reqs.val(); v != 0.75 {
-		t.Errorf("reqs.val() = %v, want 0.75", v)
-	}
-}
-
-func BenchmarkFloatAdd(b *testing.B) {
-	var f Float
-
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			f.Add(1.0)
-		}
-	})
-}
-
-func BenchmarkFloatSet(b *testing.B) {
-	var f Float
-
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			f.Set(1.0)
-		}
-	})
-}
-
-func TestString(t *testing.T) {
-	RemoveAll()
-	name := NewString("my-name")
-	if name.s != "" {
-		t.Errorf("name.s = %q, want \"\"", name.s)
-	}
-
-	name.Set("Mike")
-	if name.s != "Mike" {
-		t.Errorf("name.s = %q, want \"Mike\"", name.s)
-	}
-
-	if s := name.String(); s != "\"Mike\"" {
-		t.Errorf("reqs.String() = %q, want \"\"Mike\"\"", s)
-	}
-}
-
-func BenchmarkStringSet(b *testing.B) {
-	var s String
-
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			s.Set("red")
-		}
-	})
-}
-
-func TestMapCounter(t *testing.T) {
-	RemoveAll()
-	colors := NewMap("bike-shed-colors")
-
-	colors.Add("red", 1)
-	colors.Add("red", 2)
-	colors.Add("blue", 4)
-	colors.AddFloat(`green "midori"`, 4.125)
-	if x := colors.m["red"].(*Int).i; x != 3 {
-		t.Errorf("colors.m[\"red\"] = %v, want 3", x)
-	}
-	if x := colors.m["blue"].(*Int).i; x != 4 {
-		t.Errorf("colors.m[\"blue\"] = %v, want 4", x)
-	}
-	if x := colors.m[`green "midori"`].(*Float).val(); x != 4.125 {
-		t.Errorf("colors.m[`green \"midori\"] = %v, want 4.125", x)
-	}
-
-	// colors.String() should be '{"red":3, "blue":4}',
-	// though the order of red and blue could vary.
-	s := colors.String()
-	var j interface{}
-	err := json.Unmarshal([]byte(s), &j)
-	if err != nil {
-		t.Errorf("colors.String() isn't valid JSON: %v", err)
-	}
-	m, ok := j.(map[string]interface{})
-	if !ok {
-		t.Error("colors.String() didn't produce a map.")
-	}
-	red := m["red"]
-	x, ok := red.(float64)
-	if !ok {
-		t.Error("red.Kind() is not a number.")
-	}
-	if x != 3 {
-		t.Errorf("red = %v, want 3", x)
-	}
-}
-
-func BenchmarkMapSet(b *testing.B) {
-	m := new(Map).Init()
-
-	v := new(Int)
-
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			m.Set("red", v)
-		}
-	})
-}
-
-func BenchmarkMapAddSame(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		m := new(Map).Init()
-		m.Add("red", 1)
-		m.Add("red", 1)
-		m.Add("red", 1)
-		m.Add("red", 1)
-	}
-}
-
-func BenchmarkMapAddDifferent(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		m := new(Map).Init()
-		m.Add("red", 1)
-		m.Add("blue", 1)
-		m.Add("green", 1)
-		m.Add("yellow", 1)
-	}
-}
-
-func TestFunc(t *testing.T) {
-	RemoveAll()
-	var x interface{} = []string{"a", "b"}
-	f := Func(func() interface{} { return x })
-	if s, exp := f.String(), `["a","b"]`; s != exp {
-		t.Errorf(`f.String() = %q, want %q`, s, exp)
-	}
-
-	x = 17
-	if s, exp := f.String(), `17`; s != exp {
-		t.Errorf(`f.String() = %q, want %q`, s, exp)
-	}
-}
-
-func TestHandler(t *testing.T) {
-	RemoveAll()
-	m := NewMap("map1")
-	m.Add("a", 1)
-	m.Add("z", 2)
-	m2 := NewMap("map2")
-	for i := 0; i < 9; i++ {
-		m2.Add(strconv.Itoa(i), int64(i))
-	}
-	rr := httptest.NewRecorder()
-	rr.Body = new(bytes.Buffer)
-	expvarHandler(rr, nil)
-	want := `{
-"map1": {"a": 1, "z": 2},
-"map2": {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8}
-}
-`
-	if got := rr.Body.String(); got != want {
-		t.Errorf("HTTP handler wrote:\n%s\nWant:\n%s", got, want)
-	}
-}
-
-func BenchmarkRealworldExpvarUsage(b *testing.B) {
-	var (
-		bytesSent Int
-		bytesRead Int
-	)
-
-	// The benchmark creates GOMAXPROCS client/server pairs.
-	// Each pair creates 4 goroutines: client reader/writer and server reader/writer.
-	// The benchmark stresses concurrent reading and writing to the same connection.
-	// Such pattern is used in net/http and net/rpc.
-
-	b.StopTimer()
-
-	P := runtime.GOMAXPROCS(0)
-	N := b.N / P
-	W := 1000
-
-	// Setup P client/server connections.
-	clients := make([]net.Conn, P)
-	servers := make([]net.Conn, P)
-	ln, err := net.Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		b.Fatalf("Listen failed: %v", err)
-	}
-	defer ln.Close()
-	done := make(chan bool)
-	go func() {
-		for p := 0; p < P; p++ {
-			s, err := ln.Accept()
-			if err != nil {
-				b.Errorf("Accept failed: %v", err)
-				return
-			}
-			servers[p] = s
-		}
-		done <- true
-	}()
-	for p := 0; p < P; p++ {
-		c, err := net.Dial("tcp", ln.Addr().String())
-		if err != nil {
-			b.Fatalf("Dial failed: %v", err)
-		}
-		clients[p] = c
-	}
-	<-done
-
-	b.StartTimer()
-
-	var wg sync.WaitGroup
-	wg.Add(4 * P)
-	for p := 0; p < P; p++ {
-		// Client writer.
-		go func(c net.Conn) {
-			defer wg.Done()
-			var buf [1]byte
-			for i := 0; i < N; i++ {
-				v := byte(i)
-				for w := 0; w < W; w++ {
-					v *= v
-				}
-				buf[0] = v
-				n, err := c.Write(buf[:])
-				if err != nil {
-					b.Errorf("Write failed: %v", err)
-					return
-				}
-
-				bytesSent.Add(int64(n))
-			}
-		}(clients[p])
-
-		// Pipe between server reader and server writer.
-		pipe := make(chan byte, 128)
-
-		// Server reader.
-		go func(s net.Conn) {
-			defer wg.Done()
-			var buf [1]byte
-			for i := 0; i < N; i++ {
-				n, err := s.Read(buf[:])
-
-				if err != nil {
-					b.Errorf("Read failed: %v", err)
-					return
-				}
-
-				bytesRead.Add(int64(n))
-				pipe <- buf[0]
-			}
-		}(servers[p])
-
-		// Server writer.
-		go func(s net.Conn) {
-			defer wg.Done()
-			var buf [1]byte
-			for i := 0; i < N; i++ {
-				v := <-pipe
-				for w := 0; w < W; w++ {
-					v *= v
-				}
-				buf[0] = v
-				n, err := s.Write(buf[:])
-				if err != nil {
-					b.Errorf("Write failed: %v", err)
-					return
-				}
-
-				bytesSent.Add(int64(n))
-			}
-			s.Close()
-		}(servers[p])
-
-		// Client reader.
-		go func(c net.Conn) {
-			defer wg.Done()
-			var buf [1]byte
-			for i := 0; i < N; i++ {
-				n, err := c.Read(buf[:])
-
-				if err != nil {
-					b.Errorf("Read failed: %v", err)
-					return
-				}
-
-				bytesRead.Add(int64(n))
-			}
-			c.Close()
-		}(clients[p])
-	}
-	wg.Wait()
-}
diff --git a/third_party/gofrontend/libgo/go/flag/example_test.go b/third_party/gofrontend/libgo/go/flag/example_test.go
deleted file mode 100644
index 04a0d20..0000000
--- a/third_party/gofrontend/libgo/go/flag/example_test.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// These examples demonstrate more intricate uses of the flag package.
-package flag_test
-
-import (
-	"errors"
-	"flag"
-	"fmt"
-	"strings"
-	"time"
-)
-
-// Example 1: A single string flag called "species" with default value "gopher".
-var species = flag.String("species", "gopher", "the species we are studying")
-
-// Example 2: Two flags sharing a variable, so we can have a shorthand.
-// The order of initialization is undefined, so make sure both use the
-// same default value. They must be set up with an init function.
-var gopherType string
-
-func init() {
-	const (
-		defaultGopher = "pocket"
-		usage         = "the variety of gopher"
-	)
-	flag.StringVar(&gopherType, "gopher_type", defaultGopher, usage)
-	flag.StringVar(&gopherType, "g", defaultGopher, usage+" (shorthand)")
-}
-
-// Example 3: A user-defined flag type, a slice of durations.
-type interval []time.Duration
-
-// String is the method to format the flag's value, part of the flag.Value interface.
-// The String method's output will be used in diagnostics.
-func (i *interval) String() string {
-	return fmt.Sprint(*i)
-}
-
-// Set is the method to set the flag value, part of the flag.Value interface.
-// Set's argument is a string to be parsed to set the flag.
-// It's a comma-separated list, so we split it.
-func (i *interval) Set(value string) error {
-	// If we wanted to allow the flag to be set multiple times,
-	// accumulating values, we would delete this if statement.
-	// That would permit usages such as
-	//	-deltaT 10s -deltaT 15s
-	// and other combinations.
-	if len(*i) > 0 {
-		return errors.New("interval flag already set")
-	}
-	for _, dt := range strings.Split(value, ",") {
-		duration, err := time.ParseDuration(dt)
-		if err != nil {
-			return err
-		}
-		*i = append(*i, duration)
-	}
-	return nil
-}
-
-// Define a flag to accumulate durations. Because it has a special type,
-// we need to use the Var function and therefore create the flag during
-// init.
-
-var intervalFlag interval
-
-func init() {
-	// Tie the command-line flag to the intervalFlag variable and
-	// set a usage message.
-	flag.Var(&intervalFlag, "deltaT", "comma-separated list of intervals to use between events")
-}
-
-func Example() {
-	// All the interesting pieces are with the variables declared above, but
-	// to enable the flag package to see the flags defined there, one must
-	// execute, typically at the start of main (not init!):
-	//	flag.Parse()
-	// We don't run it here because this is not a main function and
-	// the testing suite has already parsed the flags.
-}
diff --git a/third_party/gofrontend/libgo/go/flag/export_test.go b/third_party/gofrontend/libgo/go/flag/export_test.go
deleted file mode 100644
index 56cda58..0000000
--- a/third_party/gofrontend/libgo/go/flag/export_test.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flag
-
-import "os"
-
-// Additional routines compiled into the package only during testing.
-
-// ResetForTesting clears all flag state and sets the usage function as directed.
-// After calling ResetForTesting, parse errors in flag handling will not
-// exit the program.
-func ResetForTesting(usage func()) {
-	CommandLine = NewFlagSet(os.Args[0], ContinueOnError)
-	Usage = usage
-}
diff --git a/third_party/gofrontend/libgo/go/flag/flag.go b/third_party/gofrontend/libgo/go/flag/flag.go
deleted file mode 100644
index 3abc80e..0000000
--- a/third_party/gofrontend/libgo/go/flag/flag.go
+++ /dev/null
@@ -1,957 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-	Package flag implements command-line flag parsing.
-
-	Usage:
-
-	Define flags using flag.String(), Bool(), Int(), etc.
-
-	This declares an integer flag, -flagname, stored in the pointer ip, with type *int.
-		import "flag"
-		var ip = flag.Int("flagname", 1234, "help message for flagname")
-	If you like, you can bind the flag to a variable using the Var() functions.
-		var flagvar int
-		func init() {
-			flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
-		}
-	Or you can create custom flags that satisfy the Value interface (with
-	pointer receivers) and couple them to flag parsing by
-		flag.Var(&flagVal, "name", "help message for flagname")
-	For such flags, the default value is just the initial value of the variable.
-
-	After all flags are defined, call
-		flag.Parse()
-	to parse the command line into the defined flags.
-
-	Flags may then be used directly. If you're using the flags themselves,
-	they are all pointers; if you bind to variables, they're values.
-		fmt.Println("ip has value ", *ip)
-		fmt.Println("flagvar has value ", flagvar)
-
-	After parsing, the arguments following the flags are available as the
-	slice flag.Args() or individually as flag.Arg(i).
-	The arguments are indexed from 0 through flag.NArg()-1.
-
-	Command line flag syntax:
-		-flag
-		-flag=x
-		-flag x  // non-boolean flags only
-	One or two minus signs may be used; they are equivalent.
-	The last form is not permitted for boolean flags because the
-	meaning of the command
-		cmd -x *
-	will change if there is a file called 0, false, etc.  You must
-	use the -flag=false form to turn off a boolean flag.
-
-	Flag parsing stops just before the first non-flag argument
-	("-" is a non-flag argument) or after the terminator "--".
-
-	Integer flags accept 1234, 0664, 0x1234 and may be negative.
-	Boolean flags may be:
-		1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
-	Duration flags accept any input valid for time.ParseDuration.
-
-	The default set of command-line flags is controlled by
-	top-level functions.  The FlagSet type allows one to define
-	independent sets of flags, such as to implement subcommands
-	in a command-line interface. The methods of FlagSet are
-	analogous to the top-level functions for the command-line
-	flag set.
-*/
-package flag
-
-import (
-	"errors"
-	"fmt"
-	"io"
-	"os"
-	"sort"
-	"strconv"
-	"time"
-)
-
-// ErrHelp is the error returned if the -help or -h flag is invoked
-// but no such flag is defined.
-var ErrHelp = errors.New("flag: help requested")
-
-// -- bool Value
-type boolValue bool
-
-func newBoolValue(val bool, p *bool) *boolValue {
-	*p = val
-	return (*boolValue)(p)
-}
-
-func (b *boolValue) Set(s string) error {
-	v, err := strconv.ParseBool(s)
-	*b = boolValue(v)
-	return err
-}
-
-func (b *boolValue) Get() interface{} { return bool(*b) }
-
-func (b *boolValue) String() string { return fmt.Sprintf("%v", *b) }
-
-func (b *boolValue) IsBoolFlag() bool { return true }
-
-// optional interface to indicate boolean flags that can be
-// supplied without "=value" text
-type boolFlag interface {
-	Value
-	IsBoolFlag() bool
-}
-
-// -- int Value
-type intValue int
-
-func newIntValue(val int, p *int) *intValue {
-	*p = val
-	return (*intValue)(p)
-}
-
-func (i *intValue) Set(s string) error {
-	v, err := strconv.ParseInt(s, 0, 64)
-	*i = intValue(v)
-	return err
-}
-
-func (i *intValue) Get() interface{} { return int(*i) }
-
-func (i *intValue) String() string { return fmt.Sprintf("%v", *i) }
-
-// -- int64 Value
-type int64Value int64
-
-func newInt64Value(val int64, p *int64) *int64Value {
-	*p = val
-	return (*int64Value)(p)
-}
-
-func (i *int64Value) Set(s string) error {
-	v, err := strconv.ParseInt(s, 0, 64)
-	*i = int64Value(v)
-	return err
-}
-
-func (i *int64Value) Get() interface{} { return int64(*i) }
-
-func (i *int64Value) String() string { return fmt.Sprintf("%v", *i) }
-
-// -- uint Value
-type uintValue uint
-
-func newUintValue(val uint, p *uint) *uintValue {
-	*p = val
-	return (*uintValue)(p)
-}
-
-func (i *uintValue) Set(s string) error {
-	v, err := strconv.ParseUint(s, 0, 64)
-	*i = uintValue(v)
-	return err
-}
-
-func (i *uintValue) Get() interface{} { return uint(*i) }
-
-func (i *uintValue) String() string { return fmt.Sprintf("%v", *i) }
-
-// -- uint64 Value
-type uint64Value uint64
-
-func newUint64Value(val uint64, p *uint64) *uint64Value {
-	*p = val
-	return (*uint64Value)(p)
-}
-
-func (i *uint64Value) Set(s string) error {
-	v, err := strconv.ParseUint(s, 0, 64)
-	*i = uint64Value(v)
-	return err
-}
-
-func (i *uint64Value) Get() interface{} { return uint64(*i) }
-
-func (i *uint64Value) String() string { return fmt.Sprintf("%v", *i) }
-
-// -- string Value
-type stringValue string
-
-func newStringValue(val string, p *string) *stringValue {
-	*p = val
-	return (*stringValue)(p)
-}
-
-func (s *stringValue) Set(val string) error {
-	*s = stringValue(val)
-	return nil
-}
-
-func (s *stringValue) Get() interface{} { return string(*s) }
-
-func (s *stringValue) String() string { return fmt.Sprintf("%s", *s) }
-
-// -- float64 Value
-type float64Value float64
-
-func newFloat64Value(val float64, p *float64) *float64Value {
-	*p = val
-	return (*float64Value)(p)
-}
-
-func (f *float64Value) Set(s string) error {
-	v, err := strconv.ParseFloat(s, 64)
-	*f = float64Value(v)
-	return err
-}
-
-func (f *float64Value) Get() interface{} { return float64(*f) }
-
-func (f *float64Value) String() string { return fmt.Sprintf("%v", *f) }
-
-// -- time.Duration Value
-type durationValue time.Duration
-
-func newDurationValue(val time.Duration, p *time.Duration) *durationValue {
-	*p = val
-	return (*durationValue)(p)
-}
-
-func (d *durationValue) Set(s string) error {
-	v, err := time.ParseDuration(s)
-	*d = durationValue(v)
-	return err
-}
-
-func (d *durationValue) Get() interface{} { return time.Duration(*d) }
-
-func (d *durationValue) String() string { return (*time.Duration)(d).String() }
-
-// Value is the interface to the dynamic value stored in a flag.
-// (The default value is represented as a string.)
-//
-// If a Value has an IsBoolFlag() bool method returning true,
-// the command-line parser makes -name equivalent to -name=true
-// rather than using the next command-line argument.
-//
-// Set is called once, in command line order, for each flag present.
-type Value interface {
-	String() string
-	Set(string) error
-}
-
-// Getter is an interface that allows the contents of a Value to be retrieved.
-// It wraps the Value interface, rather than being part of it, because it
-// appeared after Go 1 and its compatibility rules. All Value types provided
-// by this package satisfy the Getter interface.
-type Getter interface {
-	Value
-	Get() interface{}
-}
-
-// ErrorHandling defines how FlagSet.Parse behaves if the parse fails.
-type ErrorHandling int
-
-// These constants cause FlagSet.Parse to behave as described if the parse fails.
-const (
-	ContinueOnError ErrorHandling = iota // Return a descriptive error.
-	ExitOnError                          // Call os.Exit(2).
-	PanicOnError                         // Call panic with a descriptive error.
-)
-
-// A FlagSet represents a set of defined flags.  The zero value of a FlagSet
-// has no name and has ContinueOnError error handling.
-type FlagSet struct {
-	// Usage is the function called when an error occurs while parsing flags.
-	// The field is a function (not a method) that may be changed to point to
-	// a custom error handler.
-	Usage func()
-
-	name          string
-	parsed        bool
-	actual        map[string]*Flag
-	formal        map[string]*Flag
-	args          []string // arguments after flags
-	errorHandling ErrorHandling
-	output        io.Writer // nil means stderr; use out() accessor
-}
-
-// A Flag represents the state of a flag.
-type Flag struct {
-	Name     string // name as it appears on command line
-	Usage    string // help message
-	Value    Value  // value as set
-	DefValue string // default value (as text); for usage message
-}
-
-// sortFlags returns the flags as a slice in lexicographical sorted order.
-func sortFlags(flags map[string]*Flag) []*Flag {
-	list := make(sort.StringSlice, len(flags))
-	i := 0
-	for _, f := range flags {
-		list[i] = f.Name
-		i++
-	}
-	list.Sort()
-	result := make([]*Flag, len(list))
-	for i, name := range list {
-		result[i] = flags[name]
-	}
-	return result
-}
-
-func (f *FlagSet) out() io.Writer {
-	if f.output == nil {
-		return os.Stderr
-	}
-	return f.output
-}
-
-// SetOutput sets the destination for usage and error messages.
-// If output is nil, os.Stderr is used.
-func (f *FlagSet) SetOutput(output io.Writer) {
-	f.output = output
-}
-
-// VisitAll visits the flags in lexicographical order, calling fn for each.
-// It visits all flags, even those not set.
-func (f *FlagSet) VisitAll(fn func(*Flag)) {
-	for _, flag := range sortFlags(f.formal) {
-		fn(flag)
-	}
-}
-
-// VisitAll visits the command-line flags in lexicographical order, calling
-// fn for each.  It visits all flags, even those not set.
-func VisitAll(fn func(*Flag)) {
-	CommandLine.VisitAll(fn)
-}
-
-// Visit visits the flags in lexicographical order, calling fn for each.
-// It visits only those flags that have been set.
-func (f *FlagSet) Visit(fn func(*Flag)) {
-	for _, flag := range sortFlags(f.actual) {
-		fn(flag)
-	}
-}
-
-// Visit visits the command-line flags in lexicographical order, calling fn
-// for each.  It visits only those flags that have been set.
-func Visit(fn func(*Flag)) {
-	CommandLine.Visit(fn)
-}
-
-// Lookup returns the Flag structure of the named flag, returning nil if none exists.
-func (f *FlagSet) Lookup(name string) *Flag {
-	return f.formal[name]
-}
-
-// Lookup returns the Flag structure of the named command-line flag,
-// returning nil if none exists.
-func Lookup(name string) *Flag {
-	return CommandLine.formal[name]
-}
-
-// Set sets the value of the named flag.
-func (f *FlagSet) Set(name, value string) error {
-	flag, ok := f.formal[name]
-	if !ok {
-		return fmt.Errorf("no such flag -%v", name)
-	}
-	err := flag.Value.Set(value)
-	if err != nil {
-		return err
-	}
-	if f.actual == nil {
-		f.actual = make(map[string]*Flag)
-	}
-	f.actual[name] = flag
-	return nil
-}
-
-// Set sets the value of the named command-line flag.
-func Set(name, value string) error {
-	return CommandLine.Set(name, value)
-}
-
-// isZeroValue guesses whether the string represents the zero
-// value for a flag. It is not accurate but in practice works OK.
-func isZeroValue(value string) bool {
-	switch value {
-	case "false":
-		return true
-	case "":
-		return true
-	case "0":
-		return true
-	}
-	return false
-}
-
-// UnquoteUsage extracts a back-quoted name from the usage
-// string for a flag and returns it and the un-quoted usage.
-// Given "a `name` to show" it returns ("name", "a name to show").
-// If there are no back quotes, the name is an educated guess of the
-// type of the flag's value, or the empty string if the flag is boolean.
-func UnquoteUsage(flag *Flag) (name string, usage string) {
-	// Look for a back-quoted name, but avoid the strings package.
-	usage = flag.Usage
-	for i := 0; i < len(usage); i++ {
-		if usage[i] == '`' {
-			for j := i + 1; j < len(usage); j++ {
-				if usage[j] == '`' {
-					name = usage[i+1 : j]
-					usage = usage[:i] + name + usage[j+1:]
-					return name, usage
-				}
-			}
-			break // Only one back quote; use type name.
-		}
-	}
-	// No explicit name, so use type if we can find one.
-	name = "value"
-	switch flag.Value.(type) {
-	case boolFlag:
-		name = ""
-	case *durationValue:
-		name = "duration"
-	case *float64Value:
-		name = "float"
-	case *intValue, *int64Value:
-		name = "int"
-	case *stringValue:
-		name = "string"
-	case *uintValue, *uint64Value:
-		name = "uint"
-	}
-	return
-}
-
-// PrintDefaults prints to standard error the default values of all
-// defined command-line flags in the set. See the documentation for
-// the global function PrintDefaults for more information.
-func (f *FlagSet) PrintDefaults() {
-	f.VisitAll(func(flag *Flag) {
-		s := fmt.Sprintf("  -%s", flag.Name) // Two spaces before -; see next two comments.
-		name, usage := UnquoteUsage(flag)
-		if len(name) > 0 {
-			s += " " + name
-		}
-		// Boolean flags of one ASCII letter are so common we
-		// treat them specially, putting their usage on the same line.
-		if len(s) <= 4 { // space, space, '-', 'x'.
-			s += "\t"
-		} else {
-			// Four spaces before the tab triggers good alignment
-			// for both 4- and 8-space tab stops.
-			s += "\n    \t"
-		}
-		s += usage
-		if !isZeroValue(flag.DefValue) {
-			if _, ok := flag.Value.(*stringValue); ok {
-				// put quotes on the value
-				s += fmt.Sprintf(" (default %q)", flag.DefValue)
-			} else {
-				s += fmt.Sprintf(" (default %v)", flag.DefValue)
-			}
-		}
-		fmt.Fprint(f.out(), s, "\n")
-	})
-}
-
-// PrintDefaults prints, to standard error unless configured otherwise,
-// a usage message showing the default settings of all defined
-// command-line flags.
-// For an integer valued flag x, the default output has the form
-//	-x int
-//		usage-message-for-x (default 7)
-// The usage message will appear on a separate line for anything but
-// a bool flag with a one-byte name. For bool flags, the type is
-// omitted and if the flag name is one byte the usage message appears
-// on the same line. The parenthetical default is omitted if the
-// default is the zero value for the type. The listed type, here int,
-// can be changed by placing a back-quoted name in the flag's usage
-// string; the first such item in the message is taken to be a parameter
-// name to show in the message and the back quotes are stripped from
-// the message when displayed. For instance, given
-//	flag.String("I", "", "search `directory` for include files")
-// the output will be
-//	-I directory
-//		search directory for include files.
-func PrintDefaults() {
-	CommandLine.PrintDefaults()
-}
-
-// defaultUsage is the default function to print a usage message.
-func defaultUsage(f *FlagSet) {
-	if f.name == "" {
-		fmt.Fprintf(f.out(), "Usage:\n")
-	} else {
-		fmt.Fprintf(f.out(), "Usage of %s:\n", f.name)
-	}
-	f.PrintDefaults()
-}
-
-// NOTE: Usage is not just defaultUsage(CommandLine)
-// because it serves (via godoc flag Usage) as the example
-// for how to write your own usage function.
-
-// Usage prints to standard error a usage message documenting all defined command-line flags.
-// It is called when an error occurs while parsing flags.
-// The function is a variable that may be changed to point to a custom function.
-// By default it prints a simple header and calls PrintDefaults; for details about the
-// format of the output and how to control it, see the documentation for PrintDefaults.
-var Usage = func() {
-	fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
-	PrintDefaults()
-}
-
-// NFlag returns the number of flags that have been set.
-func (f *FlagSet) NFlag() int { return len(f.actual) }
-
-// NFlag returns the number of command-line flags that have been set.
-func NFlag() int { return len(CommandLine.actual) }
-
-// Arg returns the i'th argument.  Arg(0) is the first remaining argument
-// after flags have been processed. Arg returns an empty string if the
-// requested element does not exist.
-func (f *FlagSet) Arg(i int) string {
-	if i < 0 || i >= len(f.args) {
-		return ""
-	}
-	return f.args[i]
-}
-
-// Arg returns the i'th command-line argument.  Arg(0) is the first remaining argument
-// after flags have been processed. Arg returns an empty string if the
-// requested element does not exist.
-func Arg(i int) string {
-	return CommandLine.Arg(i)
-}
-
-// NArg is the number of arguments remaining after flags have been processed.
-func (f *FlagSet) NArg() int { return len(f.args) }
-
-// NArg is the number of arguments remaining after flags have been processed.
-func NArg() int { return len(CommandLine.args) }
-
-// Args returns the non-flag arguments.
-func (f *FlagSet) Args() []string { return f.args }
-
-// Args returns the non-flag command-line arguments.
-func Args() []string { return CommandLine.args }
-
-// BoolVar defines a bool flag with specified name, default value, and usage string.
-// The argument p points to a bool variable in which to store the value of the flag.
-func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string) {
-	f.Var(newBoolValue(value, p), name, usage)
-}
-
-// BoolVar defines a bool flag with specified name, default value, and usage string.
-// The argument p points to a bool variable in which to store the value of the flag.
-func BoolVar(p *bool, name string, value bool, usage string) {
-	CommandLine.Var(newBoolValue(value, p), name, usage)
-}
-
-// Bool defines a bool flag with specified name, default value, and usage string.
-// The return value is the address of a bool variable that stores the value of the flag.
-func (f *FlagSet) Bool(name string, value bool, usage string) *bool {
-	p := new(bool)
-	f.BoolVar(p, name, value, usage)
-	return p
-}
-
-// Bool defines a bool flag with specified name, default value, and usage string.
-// The return value is the address of a bool variable that stores the value of the flag.
-func Bool(name string, value bool, usage string) *bool {
-	return CommandLine.Bool(name, value, usage)
-}
-
-// IntVar defines an int flag with specified name, default value, and usage string.
-// The argument p points to an int variable in which to store the value of the flag.
-func (f *FlagSet) IntVar(p *int, name string, value int, usage string) {
-	f.Var(newIntValue(value, p), name, usage)
-}
-
-// IntVar defines an int flag with specified name, default value, and usage string.
-// The argument p points to an int variable in which to store the value of the flag.
-func IntVar(p *int, name string, value int, usage string) {
-	CommandLine.Var(newIntValue(value, p), name, usage)
-}
-
-// Int defines an int flag with specified name, default value, and usage string.
-// The return value is the address of an int variable that stores the value of the flag.
-func (f *FlagSet) Int(name string, value int, usage string) *int {
-	p := new(int)
-	f.IntVar(p, name, value, usage)
-	return p
-}
-
-// Int defines an int flag with specified name, default value, and usage string.
-// The return value is the address of an int variable that stores the value of the flag.
-func Int(name string, value int, usage string) *int {
-	return CommandLine.Int(name, value, usage)
-}
-
-// Int64Var defines an int64 flag with specified name, default value, and usage string.
-// The argument p points to an int64 variable in which to store the value of the flag.
-func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string) {
-	f.Var(newInt64Value(value, p), name, usage)
-}
-
-// Int64Var defines an int64 flag with specified name, default value, and usage string.
-// The argument p points to an int64 variable in which to store the value of the flag.
-func Int64Var(p *int64, name string, value int64, usage string) {
-	CommandLine.Var(newInt64Value(value, p), name, usage)
-}
-
-// Int64 defines an int64 flag with specified name, default value, and usage string.
-// The return value is the address of an int64 variable that stores the value of the flag.
-func (f *FlagSet) Int64(name string, value int64, usage string) *int64 {
-	p := new(int64)
-	f.Int64Var(p, name, value, usage)
-	return p
-}
-
-// Int64 defines an int64 flag with specified name, default value, and usage string.
-// The return value is the address of an int64 variable that stores the value of the flag.
-func Int64(name string, value int64, usage string) *int64 {
-	return CommandLine.Int64(name, value, usage)
-}
-
-// UintVar defines a uint flag with specified name, default value, and usage string.
-// The argument p points to a uint variable in which to store the value of the flag.
-func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string) {
-	f.Var(newUintValue(value, p), name, usage)
-}
-
-// UintVar defines a uint flag with specified name, default value, and usage string.
-// The argument p points to a uint  variable in which to store the value of the flag.
-func UintVar(p *uint, name string, value uint, usage string) {
-	CommandLine.Var(newUintValue(value, p), name, usage)
-}
-
-// Uint defines a uint flag with specified name, default value, and usage string.
-// The return value is the address of a uint  variable that stores the value of the flag.
-func (f *FlagSet) Uint(name string, value uint, usage string) *uint {
-	p := new(uint)
-	f.UintVar(p, name, value, usage)
-	return p
-}
-
-// Uint defines a uint flag with specified name, default value, and usage string.
-// The return value is the address of a uint  variable that stores the value of the flag.
-func Uint(name string, value uint, usage string) *uint {
-	return CommandLine.Uint(name, value, usage)
-}
-
-// Uint64Var defines a uint64 flag with specified name, default value, and usage string.
-// The argument p points to a uint64 variable in which to store the value of the flag.
-func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string) {
-	f.Var(newUint64Value(value, p), name, usage)
-}
-
-// Uint64Var defines a uint64 flag with specified name, default value, and usage string.
-// The argument p points to a uint64 variable in which to store the value of the flag.
-func Uint64Var(p *uint64, name string, value uint64, usage string) {
-	CommandLine.Var(newUint64Value(value, p), name, usage)
-}
-
-// Uint64 defines a uint64 flag with specified name, default value, and usage string.
-// The return value is the address of a uint64 variable that stores the value of the flag.
-func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64 {
-	p := new(uint64)
-	f.Uint64Var(p, name, value, usage)
-	return p
-}
-
-// Uint64 defines a uint64 flag with specified name, default value, and usage string.
-// The return value is the address of a uint64 variable that stores the value of the flag.
-func Uint64(name string, value uint64, usage string) *uint64 {
-	return CommandLine.Uint64(name, value, usage)
-}
-
-// StringVar defines a string flag with specified name, default value, and usage string.
-// The argument p points to a string variable in which to store the value of the flag.
-func (f *FlagSet) StringVar(p *string, name string, value string, usage string) {
-	f.Var(newStringValue(value, p), name, usage)
-}
-
-// StringVar defines a string flag with specified name, default value, and usage string.
-// The argument p points to a string variable in which to store the value of the flag.
-func StringVar(p *string, name string, value string, usage string) {
-	CommandLine.Var(newStringValue(value, p), name, usage)
-}
-
-// String defines a string flag with specified name, default value, and usage string.
-// The return value is the address of a string variable that stores the value of the flag.
-func (f *FlagSet) String(name string, value string, usage string) *string {
-	p := new(string)
-	f.StringVar(p, name, value, usage)
-	return p
-}
-
-// String defines a string flag with specified name, default value, and usage string.
-// The return value is the address of a string variable that stores the value of the flag.
-func String(name string, value string, usage string) *string {
-	return CommandLine.String(name, value, usage)
-}
-
-// Float64Var defines a float64 flag with specified name, default value, and usage string.
-// The argument p points to a float64 variable in which to store the value of the flag.
-func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string) {
-	f.Var(newFloat64Value(value, p), name, usage)
-}
-
-// Float64Var defines a float64 flag with specified name, default value, and usage string.
-// The argument p points to a float64 variable in which to store the value of the flag.
-func Float64Var(p *float64, name string, value float64, usage string) {
-	CommandLine.Var(newFloat64Value(value, p), name, usage)
-}
-
-// Float64 defines a float64 flag with specified name, default value, and usage string.
-// The return value is the address of a float64 variable that stores the value of the flag.
-func (f *FlagSet) Float64(name string, value float64, usage string) *float64 {
-	p := new(float64)
-	f.Float64Var(p, name, value, usage)
-	return p
-}
-
-// Float64 defines a float64 flag with specified name, default value, and usage string.
-// The return value is the address of a float64 variable that stores the value of the flag.
-func Float64(name string, value float64, usage string) *float64 {
-	return CommandLine.Float64(name, value, usage)
-}
-
-// DurationVar defines a time.Duration flag with specified name, default value, and usage string.
-// The argument p points to a time.Duration variable in which to store the value of the flag.
-// The flag accepts a value acceptable to time.ParseDuration.
-func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
-	f.Var(newDurationValue(value, p), name, usage)
-}
-
-// DurationVar defines a time.Duration flag with specified name, default value, and usage string.
-// The argument p points to a time.Duration variable in which to store the value of the flag.
-// The flag accepts a value acceptable to time.ParseDuration.
-func DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
-	CommandLine.Var(newDurationValue(value, p), name, usage)
-}
-
-// Duration defines a time.Duration flag with specified name, default value, and usage string.
-// The return value is the address of a time.Duration variable that stores the value of the flag.
-// The flag accepts a value acceptable to time.ParseDuration.
-func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration {
-	p := new(time.Duration)
-	f.DurationVar(p, name, value, usage)
-	return p
-}
-
-// Duration defines a time.Duration flag with specified name, default value, and usage string.
-// The return value is the address of a time.Duration variable that stores the value of the flag.
-// The flag accepts a value acceptable to time.ParseDuration.
-func Duration(name string, value time.Duration, usage string) *time.Duration {
-	return CommandLine.Duration(name, value, usage)
-}
-
-// Var defines a flag with the specified name and usage string. The type and
-// value of the flag are represented by the first argument, of type Value, which
-// typically holds a user-defined implementation of Value. For instance, the
-// caller could create a flag that turns a comma-separated string into a slice
-// of strings by giving the slice the methods of Value; in particular, Set would
-// decompose the comma-separated string into the slice.
-func (f *FlagSet) Var(value Value, name string, usage string) {
-	// Remember the default value as a string; it won't change.
-	flag := &Flag{name, usage, value, value.String()}
-	_, alreadythere := f.formal[name]
-	if alreadythere {
-		var msg string
-		if f.name == "" {
-			msg = fmt.Sprintf("flag redefined: %s", name)
-		} else {
-			msg = fmt.Sprintf("%s flag redefined: %s", f.name, name)
-		}
-		fmt.Fprintln(f.out(), msg)
-		panic(msg) // Happens only if flags are declared with identical names
-	}
-	if f.formal == nil {
-		f.formal = make(map[string]*Flag)
-	}
-	f.formal[name] = flag
-}
-
-// Var defines a flag with the specified name and usage string. The type and
-// value of the flag are represented by the first argument, of type Value, which
-// typically holds a user-defined implementation of Value. For instance, the
-// caller could create a flag that turns a comma-separated string into a slice
-// of strings by giving the slice the methods of Value; in particular, Set would
-// decompose the comma-separated string into the slice.
-func Var(value Value, name string, usage string) {
-	CommandLine.Var(value, name, usage)
-}
-
-// failf prints to standard error a formatted error and usage message and
-// returns the error.
-func (f *FlagSet) failf(format string, a ...interface{}) error {
-	err := fmt.Errorf(format, a...)
-	fmt.Fprintln(f.out(), err)
-	f.usage()
-	return err
-}
-
-// usage calls the Usage method for the flag set if one is specified,
-// or the appropriate default usage function otherwise.
-func (f *FlagSet) usage() {
-	if f.Usage == nil {
-		if f == CommandLine {
-			Usage()
-		} else {
-			defaultUsage(f)
-		}
-	} else {
-		f.Usage()
-	}
-}
-
-// parseOne parses one flag. It reports whether a flag was seen.
-func (f *FlagSet) parseOne() (bool, error) {
-	if len(f.args) == 0 {
-		return false, nil
-	}
-	s := f.args[0]
-	if len(s) == 0 || s[0] != '-' || len(s) == 1 {
-		return false, nil
-	}
-	numMinuses := 1
-	if s[1] == '-' {
-		numMinuses++
-		if len(s) == 2 { // "--" terminates the flags
-			f.args = f.args[1:]
-			return false, nil
-		}
-	}
-	name := s[numMinuses:]
-	if len(name) == 0 || name[0] == '-' || name[0] == '=' {
-		return false, f.failf("bad flag syntax: %s", s)
-	}
-
-	// it's a flag. does it have an argument?
-	f.args = f.args[1:]
-	hasValue := false
-	value := ""
-	for i := 1; i < len(name); i++ { // equals cannot be first
-		if name[i] == '=' {
-			value = name[i+1:]
-			hasValue = true
-			name = name[0:i]
-			break
-		}
-	}
-	m := f.formal
-	flag, alreadythere := m[name] // BUG
-	if !alreadythere {
-		if name == "help" || name == "h" { // special case for nice help message.
-			f.usage()
-			return false, ErrHelp
-		}
-		return false, f.failf("flag provided but not defined: -%s", name)
-	}
-
-	if fv, ok := flag.Value.(boolFlag); ok && fv.IsBoolFlag() { // special case: doesn't need an arg
-		if hasValue {
-			if err := fv.Set(value); err != nil {
-				return false, f.failf("invalid boolean value %q for -%s: %v", value, name, err)
-			}
-		} else {
-			if err := fv.Set("true"); err != nil {
-				return false, f.failf("invalid boolean flag %s: %v", name, err)
-			}
-		}
-	} else {
-		// It must have a value, which might be the next argument.
-		if !hasValue && len(f.args) > 0 {
-			// value is the next arg
-			hasValue = true
-			value, f.args = f.args[0], f.args[1:]
-		}
-		if !hasValue {
-			return false, f.failf("flag needs an argument: -%s", name)
-		}
-		if err := flag.Value.Set(value); err != nil {
-			return false, f.failf("invalid value %q for flag -%s: %v", value, name, err)
-		}
-	}
-	if f.actual == nil {
-		f.actual = make(map[string]*Flag)
-	}
-	f.actual[name] = flag
-	return true, nil
-}
-
-// Parse parses flag definitions from the argument list, which should not
-// include the command name.  Must be called after all flags in the FlagSet
-// are defined and before flags are accessed by the program.
-// The return value will be ErrHelp if -help or -h were set but not defined.
-func (f *FlagSet) Parse(arguments []string) error {
-	f.parsed = true
-	f.args = arguments
-	for {
-		seen, err := f.parseOne()
-		if seen {
-			continue
-		}
-		if err == nil {
-			break
-		}
-		switch f.errorHandling {
-		case ContinueOnError:
-			return err
-		case ExitOnError:
-			os.Exit(2)
-		case PanicOnError:
-			panic(err)
-		}
-	}
-	return nil
-}
-
-// Parsed reports whether f.Parse has been called.
-func (f *FlagSet) Parsed() bool {
-	return f.parsed
-}
-
-// Parse parses the command-line flags from os.Args[1:].  Must be called
-// after all flags are defined and before flags are accessed by the program.
-func Parse() {
-	// Ignore errors; CommandLine is set for ExitOnError.
-	CommandLine.Parse(os.Args[1:])
-}
-
-// Parsed reports whether the command-line flags have been parsed.
-func Parsed() bool {
-	return CommandLine.Parsed()
-}
-
-// CommandLine is the default set of command-line flags, parsed from os.Args.
-// The top-level functions such as BoolVar, Arg, and so on are wrappers for the
-// methods of CommandLine.
-var CommandLine = NewFlagSet(os.Args[0], ExitOnError)
-
-// NewFlagSet returns a new, empty flag set with the specified name and
-// error handling property.
-func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
-	f := &FlagSet{
-		name:          name,
-		errorHandling: errorHandling,
-	}
-	return f
-}
-
-// Init sets the name and error handling property for a flag set.
-// By default, the zero FlagSet uses an empty name and the
-// ContinueOnError error handling policy.
-func (f *FlagSet) Init(name string, errorHandling ErrorHandling) {
-	f.name = name
-	f.errorHandling = errorHandling
-}
diff --git a/third_party/gofrontend/libgo/go/flag/flag_test.go b/third_party/gofrontend/libgo/go/flag/flag_test.go
deleted file mode 100644
index e2319ec..0000000
--- a/third_party/gofrontend/libgo/go/flag/flag_test.go
+++ /dev/null
@@ -1,417 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package flag_test
-
-import (
-	"bytes"
-	. "flag"
-	"fmt"
-	"os"
-	"sort"
-	"strings"
-	"testing"
-	"time"
-)
-
-func boolString(s string) string {
-	if s == "0" {
-		return "false"
-	}
-	return "true"
-}
-
-func TestEverything(t *testing.T) {
-	ResetForTesting(nil)
-	Bool("test_bool", false, "bool value")
-	Int("test_int", 0, "int value")
-	Int64("test_int64", 0, "int64 value")
-	Uint("test_uint", 0, "uint value")
-	Uint64("test_uint64", 0, "uint64 value")
-	String("test_string", "0", "string value")
-	Float64("test_float64", 0, "float64 value")
-	Duration("test_duration", 0, "time.Duration value")
-
-	m := make(map[string]*Flag)
-	desired := "0"
-	visitor := func(f *Flag) {
-		if len(f.Name) > 5 && f.Name[0:5] == "test_" {
-			m[f.Name] = f
-			ok := false
-			switch {
-			case f.Value.String() == desired:
-				ok = true
-			case f.Name == "test_bool" && f.Value.String() == boolString(desired):
-				ok = true
-			case f.Name == "test_duration" && f.Value.String() == desired+"s":
-				ok = true
-			}
-			if !ok {
-				t.Error("Visit: bad value", f.Value.String(), "for", f.Name)
-			}
-		}
-	}
-	VisitAll(visitor)
-	if len(m) != 8 {
-		t.Error("VisitAll misses some flags")
-		for k, v := range m {
-			t.Log(k, *v)
-		}
-	}
-	m = make(map[string]*Flag)
-	Visit(visitor)
-	if len(m) != 0 {
-		t.Errorf("Visit sees unset flags")
-		for k, v := range m {
-			t.Log(k, *v)
-		}
-	}
-	// Now set all flags
-	Set("test_bool", "true")
-	Set("test_int", "1")
-	Set("test_int64", "1")
-	Set("test_uint", "1")
-	Set("test_uint64", "1")
-	Set("test_string", "1")
-	Set("test_float64", "1")
-	Set("test_duration", "1s")
-	desired = "1"
-	Visit(visitor)
-	if len(m) != 8 {
-		t.Error("Visit fails after set")
-		for k, v := range m {
-			t.Log(k, *v)
-		}
-	}
-	// Now test they're visited in sort order.
-	var flagNames []string
-	Visit(func(f *Flag) { flagNames = append(flagNames, f.Name) })
-	if !sort.StringsAreSorted(flagNames) {
-		t.Errorf("flag names not sorted: %v", flagNames)
-	}
-}
-
-func TestGet(t *testing.T) {
-	ResetForTesting(nil)
-	Bool("test_bool", true, "bool value")
-	Int("test_int", 1, "int value")
-	Int64("test_int64", 2, "int64 value")
-	Uint("test_uint", 3, "uint value")
-	Uint64("test_uint64", 4, "uint64 value")
-	String("test_string", "5", "string value")
-	Float64("test_float64", 6, "float64 value")
-	Duration("test_duration", 7, "time.Duration value")
-
-	visitor := func(f *Flag) {
-		if len(f.Name) > 5 && f.Name[0:5] == "test_" {
-			g, ok := f.Value.(Getter)
-			if !ok {
-				t.Errorf("Visit: value does not satisfy Getter: %T", f.Value)
-				return
-			}
-			switch f.Name {
-			case "test_bool":
-				ok = g.Get() == true
-			case "test_int":
-				ok = g.Get() == int(1)
-			case "test_int64":
-				ok = g.Get() == int64(2)
-			case "test_uint":
-				ok = g.Get() == uint(3)
-			case "test_uint64":
-				ok = g.Get() == uint64(4)
-			case "test_string":
-				ok = g.Get() == "5"
-			case "test_float64":
-				ok = g.Get() == float64(6)
-			case "test_duration":
-				ok = g.Get() == time.Duration(7)
-			}
-			if !ok {
-				t.Errorf("Visit: bad value %T(%v) for %s", g.Get(), g.Get(), f.Name)
-			}
-		}
-	}
-	VisitAll(visitor)
-}
-
-func TestUsage(t *testing.T) {
-	called := false
-	ResetForTesting(func() { called = true })
-	if CommandLine.Parse([]string{"-x"}) == nil {
-		t.Error("parse did not fail for unknown flag")
-	}
-	if !called {
-		t.Error("did not call Usage for unknown flag")
-	}
-}
-
-func testParse(f *FlagSet, t *testing.T) {
-	if f.Parsed() {
-		t.Error("f.Parse() = true before Parse")
-	}
-	boolFlag := f.Bool("bool", false, "bool value")
-	bool2Flag := f.Bool("bool2", false, "bool2 value")
-	intFlag := f.Int("int", 0, "int value")
-	int64Flag := f.Int64("int64", 0, "int64 value")
-	uintFlag := f.Uint("uint", 0, "uint value")
-	uint64Flag := f.Uint64("uint64", 0, "uint64 value")
-	stringFlag := f.String("string", "0", "string value")
-	float64Flag := f.Float64("float64", 0, "float64 value")
-	durationFlag := f.Duration("duration", 5*time.Second, "time.Duration value")
-	extra := "one-extra-argument"
-	args := []string{
-		"-bool",
-		"-bool2=true",
-		"--int", "22",
-		"--int64", "0x23",
-		"-uint", "24",
-		"--uint64", "25",
-		"-string", "hello",
-		"-float64", "2718e28",
-		"-duration", "2m",
-		extra,
-	}
-	if err := f.Parse(args); err != nil {
-		t.Fatal(err)
-	}
-	if !f.Parsed() {
-		t.Error("f.Parse() = false after Parse")
-	}
-	if *boolFlag != true {
-		t.Error("bool flag should be true, is ", *boolFlag)
-	}
-	if *bool2Flag != true {
-		t.Error("bool2 flag should be true, is ", *bool2Flag)
-	}
-	if *intFlag != 22 {
-		t.Error("int flag should be 22, is ", *intFlag)
-	}
-	if *int64Flag != 0x23 {
-		t.Error("int64 flag should be 0x23, is ", *int64Flag)
-	}
-	if *uintFlag != 24 {
-		t.Error("uint flag should be 24, is ", *uintFlag)
-	}
-	if *uint64Flag != 25 {
-		t.Error("uint64 flag should be 25, is ", *uint64Flag)
-	}
-	if *stringFlag != "hello" {
-		t.Error("string flag should be `hello`, is ", *stringFlag)
-	}
-	if *float64Flag != 2718e28 {
-		t.Error("float64 flag should be 2718e28, is ", *float64Flag)
-	}
-	if *durationFlag != 2*time.Minute {
-		t.Error("duration flag should be 2m, is ", *durationFlag)
-	}
-	if len(f.Args()) != 1 {
-		t.Error("expected one argument, got", len(f.Args()))
-	} else if f.Args()[0] != extra {
-		t.Errorf("expected argument %q got %q", extra, f.Args()[0])
-	}
-}
-
-func TestParse(t *testing.T) {
-	ResetForTesting(func() { t.Error("bad parse") })
-	testParse(CommandLine, t)
-}
-
-func TestFlagSetParse(t *testing.T) {
-	testParse(NewFlagSet("test", ContinueOnError), t)
-}
-
-// Declare a user-defined flag type.
-type flagVar []string
-
-func (f *flagVar) String() string {
-	return fmt.Sprint([]string(*f))
-}
-
-func (f *flagVar) Set(value string) error {
-	*f = append(*f, value)
-	return nil
-}
-
-func TestUserDefined(t *testing.T) {
-	var flags FlagSet
-	flags.Init("test", ContinueOnError)
-	var v flagVar
-	flags.Var(&v, "v", "usage")
-	if err := flags.Parse([]string{"-v", "1", "-v", "2", "-v=3"}); err != nil {
-		t.Error(err)
-	}
-	if len(v) != 3 {
-		t.Fatal("expected 3 args; got ", len(v))
-	}
-	expect := "[1 2 3]"
-	if v.String() != expect {
-		t.Errorf("expected value %q got %q", expect, v.String())
-	}
-}
-
-func TestUserDefinedForCommandLine(t *testing.T) {
-	const help = "HELP"
-	var result string
-	ResetForTesting(func() { result = help })
-	Usage()
-	if result != help {
-		t.Fatalf("got %q; expected %q", result, help)
-	}
-}
-
-// Declare a user-defined boolean flag type.
-type boolFlagVar struct {
-	count int
-}
-
-func (b *boolFlagVar) String() string {
-	return fmt.Sprintf("%d", b.count)
-}
-
-func (b *boolFlagVar) Set(value string) error {
-	if value == "true" {
-		b.count++
-	}
-	return nil
-}
-
-func (b *boolFlagVar) IsBoolFlag() bool {
-	return b.count < 4
-}
-
-func TestUserDefinedBool(t *testing.T) {
-	var flags FlagSet
-	flags.Init("test", ContinueOnError)
-	var b boolFlagVar
-	var err error
-	flags.Var(&b, "b", "usage")
-	if err = flags.Parse([]string{"-b", "-b", "-b", "-b=true", "-b=false", "-b", "barg", "-b"}); err != nil {
-		if b.count < 4 {
-			t.Error(err)
-		}
-	}
-
-	if b.count != 4 {
-		t.Errorf("want: %d; got: %d", 4, b.count)
-	}
-
-	if err == nil {
-		t.Error("expected error; got none")
-	}
-}
-
-func TestSetOutput(t *testing.T) {
-	var flags FlagSet
-	var buf bytes.Buffer
-	flags.SetOutput(&buf)
-	flags.Init("test", ContinueOnError)
-	flags.Parse([]string{"-unknown"})
-	if out := buf.String(); !strings.Contains(out, "-unknown") {
-		t.Logf("expected output mentioning unknown; got %q", out)
-	}
-}
-
-// This tests that one can reset the flags. This still works but not well, and is
-// superseded by FlagSet.
-func TestChangingArgs(t *testing.T) {
-	ResetForTesting(func() { t.Fatal("bad parse") })
-	oldArgs := os.Args
-	defer func() { os.Args = oldArgs }()
-	os.Args = []string{"cmd", "-before", "subcmd", "-after", "args"}
-	before := Bool("before", false, "")
-	if err := CommandLine.Parse(os.Args[1:]); err != nil {
-		t.Fatal(err)
-	}
-	cmd := Arg(0)
-	os.Args = Args()
-	after := Bool("after", false, "")
-	Parse()
-	args := Args()
-
-	if !*before || cmd != "subcmd" || !*after || len(args) != 1 || args[0] != "args" {
-		t.Fatalf("expected true subcmd true [args] got %v %v %v %v", *before, cmd, *after, args)
-	}
-}
-
-// Test that -help invokes the usage message and returns ErrHelp.
-func TestHelp(t *testing.T) {
-	var helpCalled = false
-	fs := NewFlagSet("help test", ContinueOnError)
-	fs.Usage = func() { helpCalled = true }
-	var flag bool
-	fs.BoolVar(&flag, "flag", false, "regular flag")
-	// Regular flag invocation should work
-	err := fs.Parse([]string{"-flag=true"})
-	if err != nil {
-		t.Fatal("expected no error; got ", err)
-	}
-	if !flag {
-		t.Error("flag was not set by -flag")
-	}
-	if helpCalled {
-		t.Error("help called for regular flag")
-		helpCalled = false // reset for next test
-	}
-	// Help flag should work as expected.
-	err = fs.Parse([]string{"-help"})
-	if err == nil {
-		t.Fatal("error expected")
-	}
-	if err != ErrHelp {
-		t.Fatal("expected ErrHelp; got ", err)
-	}
-	if !helpCalled {
-		t.Fatal("help was not called")
-	}
-	// If we define a help flag, that should override.
-	var help bool
-	fs.BoolVar(&help, "help", false, "help flag")
-	helpCalled = false
-	err = fs.Parse([]string{"-help"})
-	if err != nil {
-		t.Fatal("expected no error for defined -help; got ", err)
-	}
-	if helpCalled {
-		t.Fatal("help was called; should not have been for defined help flag")
-	}
-}
-
-const defaultOutput = `  -A	for bootstrapping, allow 'any' type
-  -Alongflagname
-    	disable bounds checking
-  -C	a boolean defaulting to true (default true)
-  -D path
-    	set relative path for local imports
-  -F number
-    	a non-zero number (default 2.7)
-  -G float
-    	a float that defaults to zero
-  -N int
-    	a non-zero int (default 27)
-  -Z int
-    	an int that defaults to zero
-  -maxT timeout
-    	set timeout for dial
-`
-
-func TestPrintDefaults(t *testing.T) {
-	fs := NewFlagSet("print defaults test", ContinueOnError)
-	var buf bytes.Buffer
-	fs.SetOutput(&buf)
-	fs.Bool("A", false, "for bootstrapping, allow 'any' type")
-	fs.Bool("Alongflagname", false, "disable bounds checking")
-	fs.Bool("C", true, "a boolean defaulting to true")
-	fs.String("D", "", "set relative `path` for local imports")
-	fs.Float64("F", 2.7, "a non-zero `number`")
-	fs.Float64("G", 0, "a float that defaults to zero")
-	fs.Int("N", 27, "a non-zero int")
-	fs.Int("Z", 0, "an int that defaults to zero")
-	fs.Duration("maxT", 0, "set `timeout` for dial")
-	fs.PrintDefaults()
-	got := buf.String()
-	if got != defaultOutput {
-		t.Errorf("got %q want %q\n", got, defaultOutput)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/fmt/doc.go b/third_party/gofrontend/libgo/go/fmt/doc.go
deleted file mode 100644
index ef91368..0000000
--- a/third_party/gofrontend/libgo/go/fmt/doc.go
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-	Package fmt implements formatted I/O with functions analogous
-	to C's printf and scanf.  The format 'verbs' are derived from C's but
-	are simpler.
-
-
-	Printing
-
-	The verbs:
-
-	General:
-		%v	the value in a default format
-			when printing structs, the plus flag (%+v) adds field names
-		%#v	a Go-syntax representation of the value
-		%T	a Go-syntax representation of the type of the value
-		%%	a literal percent sign; consumes no value
-
-	Boolean:
-		%t	the word true or false
-	Integer:
-		%b	base 2
-		%c	the character represented by the corresponding Unicode code point
-		%d	base 10
-		%o	base 8
-		%q	a single-quoted character literal safely escaped with Go syntax.
-		%x	base 16, with lower-case letters for a-f
-		%X	base 16, with upper-case letters for A-F
-		%U	Unicode format: U+1234; same as "U+%04X"
-	Floating-point and complex constituents:
-		%b	decimalless scientific notation with exponent a power of two,
-			in the manner of strconv.FormatFloat with the 'b' format,
-			e.g. -123456p-78
-		%e	scientific notation, e.g. -1234.456e+78
-		%E	scientific notation, e.g. -1234.456E+78
-		%f	decimal point but no exponent, e.g. 123.456
-		%F	synonym for %f
-		%g	%e for large exponents, %f otherwise
-		%G	%E for large exponents, %F otherwise
-	String and slice of bytes (treated equivalently with these verbs):
-		%s	the uninterpreted bytes of the string or slice
-		%q	a double-quoted string safely escaped with Go syntax
-		%x	base 16, lower-case, two characters per byte
-		%X	base 16, upper-case, two characters per byte
-	Pointer:
-		%p	base 16 notation, with leading 0x
-
-	There is no 'u' flag.  Integers are printed unsigned if they have unsigned type.
-	Similarly, there is no need to specify the size of the operand (int8, int64).
-
-	The default format for %v is:
-		bool:                    %t
-		int, int8 etc.:          %d
-		uint, uint8 etc.:        %d, %x if printed with %#v
-		float32, complex64, etc: %g
-		string:                  %s
-		chan:                    %p
-		pointer:                 %p
-	For compound objects, the elements are printed using these rules, recursively,
-	laid out like this:
-		struct:             {field0 field1 ...}
-		array, slice:       [elem0  elem1 ...]
-		maps:               map[key1:value1 key2:value2]
-		pointer to above:   &{}, &[], &map[]
-
-	Width is specified by an optional decimal number immediately preceding the verb.
-	If absent, the width is whatever is necessary to represent the value.
-	Precision is specified after the (optional) width by a period followed by a
-	decimal number. If no period is present, a default precision is used.
-	A period with no following number specifies a precision of zero.
-	Examples:
-		%f     default width, default precision
-		%9f    width 9, default precision
-		%.2f   default width, precision 2
-		%9.2f  width 9, precision 2
-		%9.f   width 9, precision 0
-
-	Width and precision are measured in units of Unicode code points,
-	that is, runes. (This differs from C's printf where the
-	units are always measured in bytes.) Either or both of the flags
-	may be replaced with the character '*', causing their values to be
-	obtained from the next operand, which must be of type int.
-
-	For most values, width is the minimum number of runes to output,
-	padding the formatted form with spaces if necessary.
-
-	For strings, byte slices and byte arrays, however, precision
-	limits the length of the input to be formatted (not the size of
-	the output), truncating if necessary. Normally it is measured in
-	runes, but for these types when formatted with the %x or %X format
-	it is measured in bytes.
-
-	For floating-point values, width sets the minimum width of the field and
-	precision sets the number of places after the decimal, if appropriate,
-	except that for %g/%G it sets the total number of digits. For example,
-	given 123.45 the format %6.2f prints 123.45 while %.4g prints 123.5.
-	The default precision for %e and %f is 6; for %g it is the smallest
-	number of digits necessary to identify the value uniquely.
-
-	For complex numbers, the width and precision apply to the two
-	components independently and the result is parenthesized, so %f applied
-	to 1.2+3.4i produces (1.200000+3.400000i).
-
-	Other flags:
-		+	always print a sign for numeric values;
-			guarantee ASCII-only output for %q (%+q)
-		-	pad with spaces on the right rather than the left (left-justify the field)
-		#	alternate format: add leading 0 for octal (%#o), 0x for hex (%#x);
-			0X for hex (%#X); suppress 0x for %p (%#p);
-			for %q, print a raw (backquoted) string if strconv.CanBackquote
-			returns true;
-			write e.g. U+0078 'x' if the character is printable for %U (%#U).
-		' '	(space) leave a space for elided sign in numbers (% d);
-			put spaces between bytes printing strings or slices in hex (% x, % X)
-		0	pad with leading zeros rather than spaces;
-			for numbers, this moves the padding after the sign
-
-	Flags are ignored by verbs that do not expect them.
-	For example there is no alternate decimal format, so %#d and %d
-	behave identically.
-
-	For each Printf-like function, there is also a Print function
-	that takes no format and is equivalent to saying %v for every
-	operand.  Another variant Println inserts blanks between
-	operands and appends a newline.
-
-	Regardless of the verb, if an operand is an interface value,
-	the internal concrete value is used, not the interface itself.
-	Thus:
-		var i interface{} = 23
-		fmt.Printf("%v\n", i)
-	will print 23.
-
-	Except when printed using the verbs %T and %p, special
-	formatting considerations apply for operands that implement
-	certain interfaces. In order of application:
-
-	1. If the operand is a reflect.Value, the concrete value it
-	holds is printed as if it was the operand.
-
-	2. If an operand implements the Formatter interface, it will
-	be invoked. Formatter provides fine control of formatting.
-
-	3. If the %v verb is used with the # flag (%#v) and the operand
-	implements the GoStringer interface, that will be invoked.
-
-	If the format (which is implicitly %v for Println etc.) is valid
-	for a string (%s %q %v %x %X), the following two rules apply:
-
-	4. If an operand implements the error interface, the Error method
-	will be invoked to convert the object to a string, which will then
-	be formatted as required by the verb (if any).
-
-	5. If an operand implements method String() string, that method
-	will be invoked to convert the object to a string, which will then
-	be formatted as required by the verb (if any).
-
-	For compound operands such as slices and structs, the format
-	applies to the elements of each operand, recursively, not to the
-	operand as a whole. Thus %q will quote each element of a slice
-	of strings, and %6.2f will control formatting for each element
-	of a floating-point array.
-
-	However, when printing a byte slice with a string-like verb
-	(%s %q %x %X), it is treated identically to a string, as a single item.
-
-	To avoid recursion in cases such as
-		type X string
-		func (x X) String() string { return Sprintf("<%s>", x) }
-	convert the value before recurring:
-		func (x X) String() string { return Sprintf("<%s>", string(x)) }
-	Infinite recursion can also be triggered by self-referential data
-	structures, such as a slice that contains itself as an element, if
-	that type has a String method. Such pathologies are rare, however,
-	and the package does not protect against them.
-
-	Explicit argument indexes:
-
-	In Printf, Sprintf, and Fprintf, the default behavior is for each
-	formatting verb to format successive arguments passed in the call.
-	However, the notation [n] immediately before the verb indicates that the
-	nth one-indexed argument is to be formatted instead. The same notation
-	before a '*' for a width or precision selects the argument index holding
-	the value. After processing a bracketed expression [n], subsequent verbs
-	will use arguments n+1, n+2, etc. unless otherwise directed.
-
-	For example,
-		fmt.Sprintf("%[2]d %[1]d\n", 11, 22)
-	will yield "22 11", while
-		fmt.Sprintf("%[3]*.[2]*[1]f", 12.0, 2, 6),
-	equivalent to
-		fmt.Sprintf("%6.2f", 12.0),
-	will yield " 12.00". Because an explicit index affects subsequent verbs,
-	this notation can be used to print the same values multiple times
-	by resetting the index for the first argument to be repeated:
-		fmt.Sprintf("%d %d %#[1]x %#x", 16, 17)
-	will yield "16 17 0x10 0x11".
-
-	Format errors:
-
-	If an invalid argument is given for a verb, such as providing
-	a string to %d, the generated string will contain a
-	description of the problem, as in these examples:
-
-		Wrong type or unknown verb: %!verb(type=value)
-			Printf("%d", hi):          %!d(string=hi)
-		Too many arguments: %!(EXTRA type=value)
-			Printf("hi", "guys"):      hi%!(EXTRA string=guys)
-		Too few arguments: %!verb(MISSING)
-			Printf("hi%d"):            hi %!d(MISSING)
-		Non-int for width or precision: %!(BADWIDTH) or %!(BADPREC)
-			Printf("%*s", 4.5, "hi"):  %!(BADWIDTH)hi
-			Printf("%.*s", 4.5, "hi"): %!(BADPREC)hi
-		Invalid or invalid use of argument index: %!(BADINDEX)
-			Printf("%*[2]d", 7):       %!d(BADINDEX)
-			Printf("%.[2]d", 7):       %!d(BADINDEX)
-
-	All errors begin with the string "%!" followed sometimes
-	by a single character (the verb) and end with a parenthesized
-	description.
-
-	If an Error or String method triggers a panic when called by a
-	print routine, the fmt package reformats the error message
-	from the panic, decorating it with an indication that it came
-	through the fmt package.  For example, if a String method
-	calls panic("bad"), the resulting formatted message will look
-	like
-		%!s(PANIC=bad)
-
-	The %!s just shows the print verb in use when the failure
-	occurred. If the panic is caused by a nil receiver to an Error
-	or String method, however, the output is the undecorated
-	string, "<nil>".
-
-	Scanning
-
-	An analogous set of functions scans formatted text to yield
-	values.  Scan, Scanf and Scanln read from os.Stdin; Fscan,
-	Fscanf and Fscanln read from a specified io.Reader; Sscan,
-	Sscanf and Sscanln read from an argument string.
-
-	Scan, Fscan, Sscan treat newlines in the input as spaces.
-
-	Scanln, Fscanln and Sscanln stop scanning at a newline and
-	require that the items be followed by a newline or EOF.
-
-	Scanf, Fscanf and Sscanf require that (after skipping spaces)
-	newlines in the format are matched by newlines in the input
-	and vice versa.  This behavior differs from the corresponding
-	routines in C, which uniformly treat newlines as spaces.
-
-	When scanning with Scanf, Fscanf, and Sscanf, all non-empty
-	runs of space characters (except newline) are equivalent
-	to a single space in both the format and the input.  With
-	that proviso, text in the format string must match the input
-	text; scanning stops if it does not, with the return value
-	of the function indicating the number of arguments scanned.
-
-	Scanf, Fscanf, and Sscanf parse the arguments according to a
-	format string, analogous to that of Printf.  For example, %x
-	will scan an integer as a hexadecimal number, and %v will scan
-	the default representation format for the value.
-
-	The formats behave analogously to those of Printf with the
-	following exceptions:
-
-		%p is not implemented
-		%T is not implemented
-		%e %E %f %F %g %G are all equivalent and scan any floating point or complex value
-		%s and %v on strings scan a space-delimited token
-		Flags # and + are not implemented.
-
-	The familiar base-setting prefixes 0 (octal) and 0x
-	(hexadecimal) are accepted when scanning integers without
-	a format or with the %v verb.
-
-	Width is interpreted in the input text but there is no
-	syntax for scanning with a precision (no %5.2f, just %5f).
-	If width is provided, it applies after leading spaces are
-	trimmed and specifies the maximum number of runes to read
-	to satisfy the verb. For example,
-	   Sscanf(" 1234567 ", "%5s%d", &s, &i)
-	will set s to "12345" and i to 67 while
-	   Sscanf(" 12 34 567 ", "%5s%d", &s, &i)
-	will set s to "12" and i to 34.
-
-	In all the scanning functions, a carriage return followed
-	immediately by a newline is treated as a plain newline
-	(\r\n means the same as \n).
-
-	In all the scanning functions, if an operand implements method
-	Scan (that is, it implements the Scanner interface) that
-	method will be used to scan the text for that operand.  Also,
-	if the number of arguments scanned is less than the number of
-	arguments provided, an error is returned.
-
-	All arguments to be scanned must be either pointers to basic
-	types or implementations of the Scanner interface.
-
-	Note: Fscan etc. can read one character (rune) past the input
-	they return, which means that a loop calling a scan routine
-	may skip some of the input.  This is usually a problem only
-	when there is no space between input values.  If the reader
-	provided to Fscan implements ReadRune, that method will be used
-	to read characters.  If the reader also implements UnreadRune,
-	that method will be used to save the character and successive
-	calls will not lose data.  To attach ReadRune and UnreadRune
-	methods to a reader without that capability, use
-	bufio.NewReader.
-*/
-package fmt
diff --git a/third_party/gofrontend/libgo/go/fmt/export_test.go b/third_party/gofrontend/libgo/go/fmt/export_test.go
deleted file mode 100644
index 89d57ee..0000000
--- a/third_party/gofrontend/libgo/go/fmt/export_test.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package fmt
-
-var IsSpace = isSpace
diff --git a/third_party/gofrontend/libgo/go/fmt/fmt_test.go b/third_party/gofrontend/libgo/go/fmt/fmt_test.go
deleted file mode 100644
index 8f3587b..0000000
--- a/third_party/gofrontend/libgo/go/fmt/fmt_test.go
+++ /dev/null
@@ -1,1394 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package fmt_test
-
-import (
-	"bytes"
-	. "fmt"
-	"io"
-	"math"
-	"reflect"
-	"runtime"
-	"strings"
-	"testing"
-	"time"
-	"unicode"
-)
-
-type (
-	renamedBool       bool
-	renamedInt        int
-	renamedInt8       int8
-	renamedInt16      int16
-	renamedInt32      int32
-	renamedInt64      int64
-	renamedUint       uint
-	renamedUint8      uint8
-	renamedUint16     uint16
-	renamedUint32     uint32
-	renamedUint64     uint64
-	renamedUintptr    uintptr
-	renamedString     string
-	renamedBytes      []byte
-	renamedFloat32    float32
-	renamedFloat64    float64
-	renamedComplex64  complex64
-	renamedComplex128 complex128
-)
-
-func TestFmtInterface(t *testing.T) {
-	var i1 interface{}
-	i1 = "abc"
-	s := Sprintf("%s", i1)
-	if s != "abc" {
-		t.Errorf(`Sprintf("%%s", empty("abc")) = %q want %q`, s, "abc")
-	}
-}
-
-const b32 uint32 = 1<<32 - 1
-const b64 uint64 = 1<<64 - 1
-
-var array = [5]int{1, 2, 3, 4, 5}
-var iarray = [4]interface{}{1, "hello", 2.5, nil}
-var slice = array[:]
-var islice = iarray[:]
-
-type A struct {
-	i int
-	j uint
-	s string
-	x []int
-}
-
-type I int
-
-func (i I) String() string { return Sprintf("<%d>", int(i)) }
-
-type B struct {
-	I I
-	j int
-}
-
-type C struct {
-	i int
-	B
-}
-
-type F int
-
-func (f F) Format(s State, c rune) {
-	Fprintf(s, "<%c=F(%d)>", c, int(f))
-}
-
-type G int
-
-func (g G) GoString() string {
-	return Sprintf("GoString(%d)", int(g))
-}
-
-type S struct {
-	F F // a struct field that Formats
-	G G // a struct field that GoStrings
-}
-
-type SI struct {
-	I interface{}
-}
-
-// P is a type with a String method with pointer receiver for testing %p.
-type P int
-
-var pValue P
-
-func (p *P) String() string {
-	return "String(p)"
-}
-
-var barray = [5]renamedUint8{1, 2, 3, 4, 5}
-var bslice = barray[:]
-
-type byteStringer byte
-
-func (byteStringer) String() string { return "X" }
-
-var byteStringerSlice = []byteStringer{97, 98, 99, 100}
-
-type byteFormatter byte
-
-func (byteFormatter) Format(f State, _ rune) {
-	Fprint(f, "X")
-}
-
-var byteFormatterSlice = []byteFormatter{97, 98, 99, 100}
-
-var b byte
-
-var fmtTests = []struct {
-	fmt string
-	val interface{}
-	out string
-}{
-	{"%d", 12345, "12345"},
-	{"%v", 12345, "12345"},
-	{"%t", true, "true"},
-
-	// basic string
-	{"%s", "abc", "abc"},
-	{"%q", "abc", `"abc"`},
-	{"%x", "abc", "616263"},
-	{"%x", "\xff\xf0\x0f\xff", "fff00fff"},
-	{"%X", "\xff\xf0\x0f\xff", "FFF00FFF"},
-	{"%x", "xyz", "78797a"},
-	{"%X", "xyz", "78797A"},
-	{"% x", "xyz", "78 79 7a"},
-	{"% X", "xyz", "78 79 7A"},
-	{"%#x", "xyz", "0x78797a"},
-	{"%#X", "xyz", "0X78797A"},
-	{"%# x", "xyz", "0x78 0x79 0x7a"},
-	{"%# X", "xyz", "0X78 0X79 0X7A"},
-
-	// basic bytes
-	{"%s", []byte("abc"), "abc"},
-	{"%q", []byte("abc"), `"abc"`},
-	{"%x", []byte("abc"), "616263"},
-	{"%x", []byte("\xff\xf0\x0f\xff"), "fff00fff"},
-	{"%X", []byte("\xff\xf0\x0f\xff"), "FFF00FFF"},
-	{"%x", []byte("xyz"), "78797a"},
-	{"%X", []byte("xyz"), "78797A"},
-	{"% x", []byte("xyz"), "78 79 7a"},
-	{"% X", []byte("xyz"), "78 79 7A"},
-	{"%#x", []byte("xyz"), "0x78797a"},
-	{"%#X", []byte("xyz"), "0X78797A"},
-	{"%# x", []byte("xyz"), "0x78 0x79 0x7a"},
-	{"%# X", []byte("xyz"), "0X78 0X79 0X7A"},
-
-	// escaped strings
-	{"%#q", `abc`, "`abc`"},
-	{"%#q", `"`, "`\"`"},
-	{"1 %#q", `\n`, "1 `\\n`"},
-	{"2 %#q", "\n", `2 "\n"`},
-	{"%q", `"`, `"\""`},
-	{"%q", "\a\b\f\r\n\t\v", `"\a\b\f\r\n\t\v"`},
-	{"%q", "abc\xffdef", `"abc\xffdef"`},
-	{"%q", "\u263a", `"☺"`},
-	{"%+q", "\u263a", `"\u263a"`},
-	{"%q", "\U0010ffff", `"\U0010ffff"`},
-
-	// escaped characters
-	{"%q", 'x', `'x'`},
-	{"%q", 0, `'\x00'`},
-	{"%q", '\n', `'\n'`},
-	{"%q", '\u0e00', `'\u0e00'`},         // not a printable rune.
-	{"%q", '\U000c2345', `'\U000c2345'`}, // not a printable rune.
-	{"%q", int64(0x7FFFFFFF), `%!q(int64=2147483647)`},
-	{"%q", uint64(0xFFFFFFFF), `%!q(uint64=4294967295)`},
-	{"%q", '"', `'"'`},
-	{"%q", '\'', `'\''`},
-	{"%q", "\u263a", `"☺"`},
-	{"%+q", "\u263a", `"\u263a"`},
-
-	// width
-	{"%5s", "abc", "  abc"},
-	{"%2s", "\u263a", " ☺"},
-	{"%-5s", "abc", "abc  "},
-	{"%-8q", "abc", `"abc"   `},
-	{"%05s", "abc", "00abc"},
-	{"%08q", "abc", `000"abc"`},
-	{"%5s", "abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz"},
-	{"%.5s", "abcdefghijklmnopqrstuvwxyz", "abcde"},
-	{"%.5s", "日本語日本語", "日本語日本"},
-	{"%.5s", []byte("日本語日本語"), "日本語日本"},
-	{"%.5q", "abcdefghijklmnopqrstuvwxyz", `"abcde"`},
-	{"%.5x", "abcdefghijklmnopqrstuvwxyz", `6162636465`},
-	{"%.5q", []byte("abcdefghijklmnopqrstuvwxyz"), `"abcde"`},
-	{"%.5x", []byte("abcdefghijklmnopqrstuvwxyz"), `6162636465`},
-	{"%.3q", "日本語日本語", `"日本語"`},
-	{"%.3q", []byte("日本語日本語"), `"日本語"`},
-	{"%.1q", "日本語", `"日"`},
-	{"%.1q", []byte("日本語"), `"日"`},
-	{"%.1x", "日本語", `e6`},
-	{"%.1X", []byte("日本語"), `E6`},
-	{"%10.1q", "日本語日本語", `       "日"`},
-	{"%3c", '⌘', "  ⌘"},
-	{"%5q", '\u2026', `  '…'`},
-	{"%10v", nil, "     <nil>"},
-	{"%-10v", nil, "<nil>     "},
-
-	// integers
-	{"%d", 12345, "12345"},
-	{"%d", -12345, "-12345"},
-	{"%10d", 12345, "     12345"},
-	{"%10d", -12345, "    -12345"},
-	{"%+10d", 12345, "    +12345"},
-	{"%010d", 12345, "0000012345"},
-	{"%010d", -12345, "-000012345"},
-	{"%-10d", 12345, "12345     "},
-	{"%010.3d", 1, "       001"},
-	{"%010.3d", -1, "      -001"},
-	{"%+d", 12345, "+12345"},
-	{"%+d", -12345, "-12345"},
-	{"%+d", 0, "+0"},
-	{"% d", 0, " 0"},
-	{"% d", 12345, " 12345"},
-	{"%.0d", 0, ""},
-	{"%.d", 0, ""},
-
-	// unicode format
-	{"%U", 0x1, "U+0001"},
-	{"%U", uint(0x1), "U+0001"},
-	{"%.8U", 0x2, "U+00000002"},
-	{"%U", 0x1234, "U+1234"},
-	{"%U", 0x12345, "U+12345"},
-	{"%10.6U", 0xABC, "  U+000ABC"},
-	{"%-10.6U", 0xABC, "U+000ABC  "},
-	{"%U", '\n', `U+000A`},
-	{"%#U", '\n', `U+000A`},
-	{"%U", 'x', `U+0078`},
-	{"%#U", 'x', `U+0078 'x'`},
-	{"%U", '\u263a', `U+263A`},
-	{"%#U", '\u263a', `U+263A '☺'`},
-
-	// floats
-	{"%+.3e", 0.0, "+0.000e+00"},
-	{"%+.3e", 1.0, "+1.000e+00"},
-	{"%+.3f", -1.0, "-1.000"},
-	{"%+.3F", -1.0, "-1.000"},
-	{"%+.3F", float32(-1.0), "-1.000"},
-	{"%+07.2f", 1.0, "+001.00"},
-	{"%+07.2f", -1.0, "-001.00"},
-	{"%+10.2f", +1.0, "     +1.00"},
-	{"%+10.2f", -1.0, "     -1.00"},
-	{"% .3E", -1.0, "-1.000E+00"},
-	{"% .3e", 1.0, " 1.000e+00"},
-	{"%+.3g", 0.0, "+0"},
-	{"%+.3g", 1.0, "+1"},
-	{"%+.3g", -1.0, "-1"},
-	{"% .3g", -1.0, "-1"},
-	{"% .3g", 1.0, " 1"},
-	{"%b", float32(1.0), "8388608p-23"},
-	{"%b", 1.0, "4503599627370496p-52"},
-
-	// complex values
-	{"%+.3e", 0i, "(+0.000e+00+0.000e+00i)"},
-	{"%+.3f", 0i, "(+0.000+0.000i)"},
-	{"%+.3g", 0i, "(+0+0i)"},
-	{"%+.3e", 1 + 2i, "(+1.000e+00+2.000e+00i)"},
-	{"%+.3f", 1 + 2i, "(+1.000+2.000i)"},
-	{"%+.3g", 1 + 2i, "(+1+2i)"},
-	{"%.3e", 0i, "(0.000e+00+0.000e+00i)"},
-	{"%.3f", 0i, "(0.000+0.000i)"},
-	{"%.3F", 0i, "(0.000+0.000i)"},
-	{"%.3F", complex64(0i), "(0.000+0.000i)"},
-	{"%.3g", 0i, "(0+0i)"},
-	{"%.3e", 1 + 2i, "(1.000e+00+2.000e+00i)"},
-	{"%.3f", 1 + 2i, "(1.000+2.000i)"},
-	{"%.3g", 1 + 2i, "(1+2i)"},
-	{"%.3e", -1 - 2i, "(-1.000e+00-2.000e+00i)"},
-	{"%.3f", -1 - 2i, "(-1.000-2.000i)"},
-	{"%.3g", -1 - 2i, "(-1-2i)"},
-	{"% .3E", -1 - 2i, "(-1.000E+00-2.000E+00i)"},
-	{"%+.3g", complex64(1 + 2i), "(+1+2i)"},
-	{"%+.3g", complex128(1 + 2i), "(+1+2i)"},
-	{"%b", complex64(1 + 2i), "(8388608p-23+8388608p-22i)"},
-	{"%b", 1 + 2i, "(4503599627370496p-52+4503599627370496p-51i)"},
-
-	// erroneous formats
-	{"", 2, "%!(EXTRA int=2)"},
-	{"%d", "hello", "%!d(string=hello)"},
-
-	// old test/fmt_test.go
-	{"%d", 1234, "1234"},
-	{"%d", -1234, "-1234"},
-	{"%d", uint(1234), "1234"},
-	{"%d", uint32(b32), "4294967295"},
-	{"%d", uint64(b64), "18446744073709551615"},
-	{"%o", 01234, "1234"},
-	{"%#o", 01234, "01234"},
-	{"%o", uint32(b32), "37777777777"},
-	{"%o", uint64(b64), "1777777777777777777777"},
-	{"%x", 0x1234abcd, "1234abcd"},
-	{"%#x", 0x1234abcd, "0x1234abcd"},
-	{"%x", b32 - 0x1234567, "fedcba98"},
-	{"%X", 0x1234abcd, "1234ABCD"},
-	{"%X", b32 - 0x1234567, "FEDCBA98"},
-	{"%#X", 0, "0X0"},
-	{"%x", b64, "ffffffffffffffff"},
-	{"%b", 7, "111"},
-	{"%b", b64, "1111111111111111111111111111111111111111111111111111111111111111"},
-	{"%b", -6, "-110"},
-	{"%e", 1.0, "1.000000e+00"},
-	{"%e", 1234.5678e3, "1.234568e+06"},
-	{"%e", 1234.5678e-8, "1.234568e-05"},
-	{"%e", -7.0, "-7.000000e+00"},
-	{"%e", -1e-9, "-1.000000e-09"},
-	{"%f", 1234.5678e3, "1234567.800000"},
-	{"%f", 1234.5678e-8, "0.000012"},
-	{"%f", -7.0, "-7.000000"},
-	{"%f", -1e-9, "-0.000000"},
-	{"%g", 1234.5678e3, "1.2345678e+06"},
-	{"%g", float32(1234.5678e3), "1.2345678e+06"},
-	{"%g", 1234.5678e-8, "1.2345678e-05"},
-	{"%g", -7.0, "-7"},
-	{"%g", -1e-9, "-1e-09"},
-	{"%g", float32(-1e-9), "-1e-09"},
-	{"%E", 1.0, "1.000000E+00"},
-	{"%E", 1234.5678e3, "1.234568E+06"},
-	{"%E", 1234.5678e-8, "1.234568E-05"},
-	{"%E", -7.0, "-7.000000E+00"},
-	{"%E", -1e-9, "-1.000000E-09"},
-	{"%G", 1234.5678e3, "1.2345678E+06"},
-	{"%G", float32(1234.5678e3), "1.2345678E+06"},
-	{"%G", 1234.5678e-8, "1.2345678E-05"},
-	{"%G", -7.0, "-7"},
-	{"%G", -1e-9, "-1E-09"},
-	{"%G", float32(-1e-9), "-1E-09"},
-	{"%c", 'x', "x"},
-	{"%c", 0xe4, "ä"},
-	{"%c", 0x672c, "本"},
-	{"%c", '日', "日"},
-	{"%20.8d", 1234, "            00001234"},
-	{"%20.8d", -1234, "           -00001234"},
-	{"%20d", 1234, "                1234"},
-	{"%-20.8d", 1234, "00001234            "},
-	{"%-20.8d", -1234, "-00001234           "},
-	{"%-#20.8x", 0x1234abc, "0x01234abc          "},
-	{"%-#20.8X", 0x1234abc, "0X01234ABC          "},
-	{"%-#20.8o", 01234, "00001234            "},
-	{"%.20b", 7, "00000000000000000111"},
-	{"%20.5s", "qwertyuiop", "               qwert"},
-	{"%.5s", "qwertyuiop", "qwert"},
-	{"%-20.5s", "qwertyuiop", "qwert               "},
-	{"%20c", 'x', "                   x"},
-	{"%-20c", 'x', "x                   "},
-	{"%20.6e", 1.2345e3, "        1.234500e+03"},
-	{"%20.6e", 1.2345e-3, "        1.234500e-03"},
-	{"%20e", 1.2345e3, "        1.234500e+03"},
-	{"%20e", 1.2345e-3, "        1.234500e-03"},
-	{"%20.8e", 1.2345e3, "      1.23450000e+03"},
-	{"%20f", 1.23456789e3, "         1234.567890"},
-	{"%20f", 1.23456789e-3, "            0.001235"},
-	{"%20f", 12345678901.23456789, "  12345678901.234568"},
-	{"%-20f", 1.23456789e3, "1234.567890         "},
-	{"%20.8f", 1.23456789e3, "       1234.56789000"},
-	{"%20.8f", 1.23456789e-3, "          0.00123457"},
-	{"%g", 1.23456789e3, "1234.56789"},
-	{"%g", 1.23456789e-3, "0.00123456789"},
-	{"%g", 1.23456789e20, "1.23456789e+20"},
-	{"%20e", math.Inf(1), "                +Inf"},
-	{"%-20f", math.Inf(-1), "-Inf                "},
-	{"%20g", math.NaN(), "                 NaN"},
-
-	// arrays
-	{"%v", array, "[1 2 3 4 5]"},
-	{"%v", iarray, "[1 hello 2.5 <nil>]"},
-	{"%v", barray, "[1 2 3 4 5]"},
-	{"%v", &array, "&[1 2 3 4 5]"},
-	{"%v", &iarray, "&[1 hello 2.5 <nil>]"},
-	{"%v", &barray, "&[1 2 3 4 5]"},
-
-	// slices
-	{"%v", slice, "[1 2 3 4 5]"},
-	{"%v", islice, "[1 hello 2.5 <nil>]"},
-	{"%v", bslice, "[1 2 3 4 5]"},
-	{"%v", &slice, "&[1 2 3 4 5]"},
-	{"%v", &islice, "&[1 hello 2.5 <nil>]"},
-	{"%v", &bslice, "&[1 2 3 4 5]"},
-	{"%v", []byte{1}, "[1]"},
-	{"%v", []byte{}, "[]"},
-
-	// complexes with %v
-	{"%v", 1 + 2i, "(1+2i)"},
-	{"%v", complex64(1 + 2i), "(1+2i)"},
-	{"%v", complex128(1 + 2i), "(1+2i)"},
-
-	// structs
-	{"%v", A{1, 2, "a", []int{1, 2}}, `{1 2 a [1 2]}`},
-	{"%+v", A{1, 2, "a", []int{1, 2}}, `{i:1 j:2 s:a x:[1 2]}`},
-
-	// +v on structs with Stringable items
-	{"%+v", B{1, 2}, `{I:<1> j:2}`},
-	{"%+v", C{1, B{2, 3}}, `{i:1 B:{I:<2> j:3}}`},
-
-	// other formats on Stringable items
-	{"%s", I(23), `<23>`},
-	{"%q", I(23), `"<23>"`},
-	{"%x", I(23), `3c32333e`},
-	{"%#x", I(23), `0x3c32333e`},
-	{"%# x", I(23), `0x3c 0x32 0x33 0x3e`},
-	{"%d", I(23), `23`}, // Stringer applies only to string formats.
-
-	// go syntax
-	{"%#v", A{1, 2, "a", []int{1, 2}}, `fmt_test.A{i:1, j:0x2, s:"a", x:[]int{1, 2}}`},
-	{"%#v", &b, "(*uint8)(0xPTR)"},
-	{"%#v", TestFmtInterface, "(func(*testing.T))(0xPTR)"},
-	{"%#v", make(chan int), "(chan int)(0xPTR)"},
-	{"%#v", uint64(1<<64 - 1), "0xffffffffffffffff"},
-	{"%#v", 1000000000, "1000000000"},
-	{"%#v", map[string]int{"a": 1}, `map[string]int{"a":1}`},
-	{"%#v", map[string]B{"a": {1, 2}}, `map[string]fmt_test.B{"a":fmt_test.B{I:1, j:2}}`},
-	{"%#v", []string{"a", "b"}, `[]string{"a", "b"}`},
-	{"%#v", SI{}, `fmt_test.SI{I:interface {}(nil)}`},
-	{"%#v", []int(nil), `[]int(nil)`},
-	{"%#v", []int{}, `[]int{}`},
-	{"%#v", array, `[5]int{1, 2, 3, 4, 5}`},
-	{"%#v", &array, `&[5]int{1, 2, 3, 4, 5}`},
-	{"%#v", iarray, `[4]interface {}{1, "hello", 2.5, interface {}(nil)}`},
-	{"%#v", &iarray, `&[4]interface {}{1, "hello", 2.5, interface {}(nil)}`},
-	{"%#v", map[int]byte(nil), `map[int]uint8(nil)`},
-	{"%#v", map[int]byte{}, `map[int]uint8{}`},
-	{"%#v", "foo", `"foo"`},
-	{"%#v", barray, `[5]fmt_test.renamedUint8{0x1, 0x2, 0x3, 0x4, 0x5}`},
-	{"%#v", bslice, `[]fmt_test.renamedUint8{0x1, 0x2, 0x3, 0x4, 0x5}`},
-	{"%#v", []byte(nil), "[]byte(nil)"},
-	{"%#v", []int32(nil), "[]int32(nil)"},
-
-	// slices with other formats
-	{"%#x", []int{1, 2, 15}, `[0x1 0x2 0xf]`},
-	{"%x", []int{1, 2, 15}, `[1 2 f]`},
-	{"%d", []int{1, 2, 15}, `[1 2 15]`},
-	{"%d", []byte{1, 2, 15}, `[1 2 15]`},
-	{"%q", []string{"a", "b"}, `["a" "b"]`},
-	{"% 02x", []byte{1}, "01"},
-	{"% 02x", []byte{1, 2, 3}, "01 02 03"},
-	// Padding with byte slices.
-	{"%x", []byte{}, ""},
-	{"%02x", []byte{}, "00"},
-	{"% 02x", []byte{}, "00"},
-	{"%08x", []byte{0xab}, "000000ab"},
-	{"% 08x", []byte{0xab}, "000000ab"},
-	{"%08x", []byte{0xab, 0xcd}, "0000abcd"},
-	{"% 08x", []byte{0xab, 0xcd}, "000ab cd"},
-	{"%8x", []byte{0xab}, "      ab"},
-	{"% 8x", []byte{0xab}, "      ab"},
-	{"%8x", []byte{0xab, 0xcd}, "    abcd"},
-	{"% 8x", []byte{0xab, 0xcd}, "   ab cd"},
-	// Same for strings
-	{"%x", "", ""},
-	{"%02x", "", "00"},
-	{"% 02x", "", "00"},
-	{"%08x", "\xab", "000000ab"},
-	{"% 08x", "\xab", "000000ab"},
-	{"%08x", "\xab\xcd", "0000abcd"},
-	{"% 08x", "\xab\xcd", "000ab cd"},
-	{"%8x", "\xab", "      ab"},
-	{"% 8x", "\xab", "      ab"},
-	{"%8x", "\xab\xcd", "    abcd"},
-	{"% 8x", "\xab\xcd", "   ab cd"},
-
-	// renamings
-	{"%v", renamedBool(true), "true"},
-	{"%d", renamedBool(true), "%!d(fmt_test.renamedBool=true)"},
-	{"%o", renamedInt(8), "10"},
-	{"%d", renamedInt8(-9), "-9"},
-	{"%v", renamedInt16(10), "10"},
-	{"%v", renamedInt32(-11), "-11"},
-	{"%X", renamedInt64(255), "FF"},
-	{"%v", renamedUint(13), "13"},
-	{"%o", renamedUint8(14), "16"},
-	{"%X", renamedUint16(15), "F"},
-	{"%d", renamedUint32(16), "16"},
-	{"%X", renamedUint64(17), "11"},
-	{"%o", renamedUintptr(18), "22"},
-	{"%x", renamedString("thing"), "7468696e67"},
-	{"%d", renamedBytes([]byte{1, 2, 15}), `[1 2 15]`},
-	{"%q", renamedBytes([]byte("hello")), `"hello"`},
-	{"%x", []renamedUint8{'a', 'b', 'c'}, "616263"},
-	{"%s", []renamedUint8{'h', 'e', 'l', 'l', 'o'}, "hello"},
-	{"%q", []renamedUint8{'h', 'e', 'l', 'l', 'o'}, `"hello"`},
-	{"%v", renamedFloat32(22), "22"},
-	{"%v", renamedFloat64(33), "33"},
-	{"%v", renamedComplex64(3 + 4i), "(3+4i)"},
-	{"%v", renamedComplex128(4 - 3i), "(4-3i)"},
-
-	// Formatter
-	{"%x", F(1), "<x=F(1)>"},
-	{"%x", G(2), "2"},
-	{"%+v", S{F(4), G(5)}, "{F:<v=F(4)> G:5}"},
-
-	// GoStringer
-	{"%#v", G(6), "GoString(6)"},
-	{"%#v", S{F(7), G(8)}, "fmt_test.S{F:<v=F(7)>, G:GoString(8)}"},
-
-	// %T
-	{"%T", (4 - 3i), "complex128"},
-	{"%T", renamedComplex128(4 - 3i), "fmt_test.renamedComplex128"},
-	{"%T", intVal, "int"},
-	{"%6T", &intVal, "  *int"},
-	{"%10T", nil, "     <nil>"},
-	{"%-10T", nil, "<nil>     "},
-
-	// %p
-	{"p0=%p", new(int), "p0=0xPTR"},
-	{"p1=%s", &pValue, "p1=String(p)"}, // String method...
-	{"p2=%p", &pValue, "p2=0xPTR"},     // ... not called with %p
-	{"p3=%p", (*int)(nil), "p3=0x0"},
-	{"p4=%#p", new(int), "p4=PTR"},
-
-	// %p on non-pointers
-	{"%p", make(chan int), "0xPTR"},
-	{"%p", make(map[int]int), "0xPTR"},
-	{"%p", make([]int, 1), "0xPTR"},
-	{"%p", 27, "%!p(int=27)"}, // not a pointer at all
-
-	// %q on pointers
-	{"%q", (*int)(nil), "%!q(*int=<nil>)"},
-	{"%q", new(int), "%!q(*int=0xPTR)"},
-
-	// %v on pointers formats 0 as <nil>
-	{"%v", (*int)(nil), "<nil>"},
-	{"%v", new(int), "0xPTR"},
-
-	// %d etc. pointers use specified base.
-	{"%d", new(int), "PTR_d"},
-	{"%o", new(int), "PTR_o"},
-	{"%x", new(int), "PTR_x"},
-
-	// %d on Stringer should give integer if possible
-	{"%s", time.Time{}.Month(), "January"},
-	{"%d", time.Time{}.Month(), "1"},
-
-	// erroneous things
-	{"%s %", "hello", "hello %!(NOVERB)"},
-	{"%s %.2", "hello", "hello %!(NOVERB)"},
-	{"%d", "hello", "%!d(string=hello)"},
-	{"no args", "hello", "no args%!(EXTRA string=hello)"},
-	{"%s", nil, "%!s(<nil>)"},
-	{"%T", nil, "<nil>"},
-	{"%-1", 100, "%!(NOVERB)%!(EXTRA int=100)"},
-	{"%017091901790959340919092959340919017929593813360", 0, "%!(NOVERB)%!(EXTRA int=0)"},
-	{"%184467440737095516170v", 0, "%!(NOVERB)%!(EXTRA int=0)"},
-
-	// The "<nil>" show up because maps are printed by
-	// first obtaining a list of keys and then looking up
-	// each key.  Since NaNs can be map keys but cannot
-	// be fetched directly, the lookup fails and returns a
-	// zero reflect.Value, which formats as <nil>.
-	// This test is just to check that it shows the two NaNs at all.
-	{"%v", map[float64]int{math.NaN(): 1, math.NaN(): 2}, "map[NaN:<nil> NaN:<nil>]"},
-
-	// Used to crash because nByte didn't allow for a sign.
-	{"%b", int64(-1 << 63), zeroFill("-1", 63, "")},
-
-	// Used to panic.
-	{"%0100d", 1, zeroFill("", 100, "1")},
-	{"%0100d", -1, zeroFill("-", 99, "1")},
-	{"%0.100f", 1.0, zeroFill("1.", 100, "")},
-	{"%0.100f", -1.0, zeroFill("-1.", 100, "")},
-
-	// Used to panic: integer function didn't look at f.prec, f.unicode, f.width or sign.
-	{"%#.80x", 42, "0x0000000000000000000000000000000000000000000000000000000000000000000000000000002a"},
-	{"%.80U", 42, "U+0000000000000000000000000000000000000000000000000000000000000000000000000000002A"},
-	{"%#.80U", '日', "U+000000000000000000000000000000000000000000000000000000000000000000000000000065E5 '日'"},
-	{"%.65d", -44, "-00000000000000000000000000000000000000000000000000000000000000044"},
-	{"%+.65d", 44, "+00000000000000000000000000000000000000000000000000000000000000044"},
-	{"% .65d", 44, " 00000000000000000000000000000000000000000000000000000000000000044"},
-	{"%  +.65d", 44, "+00000000000000000000000000000000000000000000000000000000000000044"},
-
-	// Comparison of padding rules with C printf.
-	/*
-		C program:
-		#include <stdio.h>
-
-		char *format[] = {
-			"[%.2f]",
-			"[% .2f]",
-			"[%+.2f]",
-			"[%7.2f]",
-			"[% 7.2f]",
-			"[%+7.2f]",
-			"[%07.2f]",
-			"[% 07.2f]",
-			"[%+07.2f]",
-		};
-
-		int main(void) {
-			int i;
-			for(i = 0; i < 9; i++) {
-				printf("%s: ", format[i]);
-				printf(format[i], 1.0);
-				printf(" ");
-				printf(format[i], -1.0);
-				printf("\n");
-			}
-		}
-
-		Output:
-			[%.2f]: [1.00] [-1.00]
-			[% .2f]: [ 1.00] [-1.00]
-			[%+.2f]: [+1.00] [-1.00]
-			[%7.2f]: [   1.00] [  -1.00]
-			[% 7.2f]: [   1.00] [  -1.00]
-			[%+7.2f]: [  +1.00] [  -1.00]
-			[%07.2f]: [0001.00] [-001.00]
-			[% 07.2f]: [ 001.00] [-001.00]
-			[%+07.2f]: [+001.00] [-001.00]
-	*/
-	{"%.2f", 1.0, "1.00"},
-	{"%.2f", -1.0, "-1.00"},
-	{"% .2f", 1.0, " 1.00"},
-	{"% .2f", -1.0, "-1.00"},
-	{"%+.2f", 1.0, "+1.00"},
-	{"%+.2f", -1.0, "-1.00"},
-	{"%7.2f", 1.0, "   1.00"},
-	{"%7.2f", -1.0, "  -1.00"},
-	{"% 7.2f", 1.0, "   1.00"},
-	{"% 7.2f", -1.0, "  -1.00"},
-	{"%+7.2f", 1.0, "  +1.00"},
-	{"%+7.2f", -1.0, "  -1.00"},
-	{"%07.2f", 1.0, "0001.00"},
-	{"%07.2f", -1.0, "-001.00"},
-	{"% 07.2f", 1.0, " 001.00"},
-	{"% 07.2f", -1.0, "-001.00"},
-	{"%+07.2f", 1.0, "+001.00"},
-	{"%+07.2f", -1.0, "-001.00"},
-
-	// Complex numbers: exhaustively tested in TestComplexFormatting.
-	{"%7.2f", 1 + 2i, "(   1.00  +2.00i)"},
-	{"%+07.2f", -1 - 2i, "(-001.00-002.00i)"},
-	// Zero padding does not apply to infinities.
-	{"%020f", math.Inf(-1), "                -Inf"},
-	{"%020f", math.Inf(+1), "                +Inf"},
-	{"% 020f", math.Inf(-1), "                -Inf"},
-	{"% 020f", math.Inf(+1), "                 Inf"},
-	{"%+020f", math.Inf(-1), "                -Inf"},
-	{"%+020f", math.Inf(+1), "                +Inf"},
-	{"%20f", -1.0, "           -1.000000"},
-	// Make sure we can handle very large widths.
-	{"%0100f", -1.0, zeroFill("-", 99, "1.000000")},
-
-	// Complex fmt used to leave the plus flag set for future entries in the array
-	// causing +2+0i and +3+0i instead of 2+0i and 3+0i.
-	{"%v", []complex64{1, 2, 3}, "[(1+0i) (2+0i) (3+0i)]"},
-	{"%v", []complex128{1, 2, 3}, "[(1+0i) (2+0i) (3+0i)]"},
-
-	// Incomplete format specification caused crash.
-	{"%.", 3, "%!.(int=3)"},
-
-	// Used to panic with out-of-bounds for very large numeric representations.
-	// nByte is set to handle one bit per uint64 in %b format, with a negative number.
-	// See issue 6777.
-	{"%#064x", 1, zeroFill("0x", 64, "1")},
-	{"%#064x", -1, zeroFill("-0x", 63, "1")},
-	{"%#064b", 1, zeroFill("", 64, "1")},
-	{"%#064b", -1, zeroFill("-", 63, "1")},
-	{"%#064o", 1, zeroFill("", 64, "1")},
-	{"%#064o", -1, zeroFill("-", 63, "1")},
-	{"%#064d", 1, zeroFill("", 64, "1")},
-	{"%#064d", -1, zeroFill("-", 63, "1")},
-	// Test that we handle the crossover above the size of uint64
-	{"%#072x", 1, zeroFill("0x", 72, "1")},
-	{"%#072x", -1, zeroFill("-0x", 71, "1")},
-	{"%#072b", 1, zeroFill("", 72, "1")},
-	{"%#072b", -1, zeroFill("-", 71, "1")},
-	{"%#072o", 1, zeroFill("", 72, "1")},
-	{"%#072o", -1, zeroFill("-", 71, "1")},
-	{"%#072d", 1, zeroFill("", 72, "1")},
-	{"%#072d", -1, zeroFill("-", 71, "1")},
-
-	// Padding for complex numbers. Has been bad, then fixed, then bad again.
-	{"%+10.2f", +104.66 + 440.51i, "(   +104.66   +440.51i)"},
-	{"%+10.2f", -104.66 + 440.51i, "(   -104.66   +440.51i)"},
-	{"%+10.2f", +104.66 - 440.51i, "(   +104.66   -440.51i)"},
-	{"%+10.2f", -104.66 - 440.51i, "(   -104.66   -440.51i)"},
-	{"%+010.2f", +104.66 + 440.51i, "(+000104.66+000440.51i)"},
-	{"%+010.2f", -104.66 + 440.51i, "(-000104.66+000440.51i)"},
-	{"%+010.2f", +104.66 - 440.51i, "(+000104.66-000440.51i)"},
-	{"%+010.2f", -104.66 - 440.51i, "(-000104.66-000440.51i)"},
-
-	// []T where type T is a byte with a Stringer method.
-	{"%v", byteStringerSlice, "[X X X X]"},
-	{"%s", byteStringerSlice, "abcd"},
-	{"%q", byteStringerSlice, "\"abcd\""},
-	{"%x", byteStringerSlice, "61626364"},
-	{"%#v", byteStringerSlice, "[]fmt_test.byteStringer{0x61, 0x62, 0x63, 0x64}"},
-
-	// And the same for Formatter.
-	{"%v", byteFormatterSlice, "[X X X X]"},
-	{"%s", byteFormatterSlice, "abcd"},
-	{"%q", byteFormatterSlice, "\"abcd\""},
-	{"%x", byteFormatterSlice, "61626364"},
-	// This next case seems wrong, but the docs say the Formatter wins here.
-	{"%#v", byteFormatterSlice, "[]fmt_test.byteFormatter{X, X, X, X}"},
-
-	// reflect.Value handled specially in Go 1.5, making it possible to
-	// see inside non-exported fields (which cannot be accessed with Interface()).
-	// Issue 8965.
-	{"%v", reflect.ValueOf(A{}).Field(0).String(), "<int Value>"}, // Equivalent to the old way.
-	{"%v", reflect.ValueOf(A{}).Field(0), "0"},                    // Sees inside the field.
-
-	// verbs apply to the extracted value too.
-	{"%s", reflect.ValueOf("hello"), "hello"},
-	{"%q", reflect.ValueOf("hello"), `"hello"`},
-	{"%#04x", reflect.ValueOf(256), "0x0100"},
-
-	// invalid reflect.Value doesn't crash.
-	{"%v", reflect.Value{}, "<invalid reflect.Value>"},
-}
-
-// zeroFill generates zero-filled strings of the specified width. The length
-// of the suffix (but not the prefix) is compensated for in the width calculation.
-func zeroFill(prefix string, width int, suffix string) string {
-	return prefix + strings.Repeat("0", width-len(suffix)) + suffix
-}
-
-func TestSprintf(t *testing.T) {
-	for _, tt := range fmtTests {
-		s := Sprintf(tt.fmt, tt.val)
-		if i := strings.Index(tt.out, "PTR"); i >= 0 {
-			pattern := "PTR"
-			chars := "0123456789abcdefABCDEF"
-			switch {
-			case strings.HasPrefix(tt.out[i:], "PTR_d"):
-				pattern = "PTR_d"
-				chars = chars[:10]
-			case strings.HasPrefix(tt.out[i:], "PTR_o"):
-				pattern = "PTR_o"
-				chars = chars[:8]
-			case strings.HasPrefix(tt.out[i:], "PTR_x"):
-				pattern = "PTR_x"
-			}
-			j := i
-			for ; j < len(s); j++ {
-				c := s[j]
-				if !strings.ContainsRune(chars, rune(c)) {
-					break
-				}
-			}
-			s = s[0:i] + pattern + s[j:]
-		}
-		if s != tt.out {
-			if _, ok := tt.val.(string); ok {
-				// Don't requote the already-quoted strings.
-				// It's too confusing to read the errors.
-				t.Errorf("Sprintf(%q, %q) = <%s> want <%s>", tt.fmt, tt.val, s, tt.out)
-			} else {
-				t.Errorf("Sprintf(%q, %v) = %q want %q", tt.fmt, tt.val, s, tt.out)
-			}
-		}
-	}
-}
-
-// TestComplexFormatting checks that a complex always formats to the same
-// thing as if done by hand with two singleton prints.
-func TestComplexFormatting(t *testing.T) {
-	var yesNo = []bool{true, false}
-	var values = []float64{1, 0, -1, math.Inf(1), math.Inf(-1), math.NaN()}
-	for _, plus := range yesNo {
-		for _, zero := range yesNo {
-			for _, space := range yesNo {
-				for _, char := range "fFeEgG" {
-					realFmt := "%"
-					if zero {
-						realFmt += "0"
-					}
-					if space {
-						realFmt += " "
-					}
-					if plus {
-						realFmt += "+"
-					}
-					realFmt += "10.2"
-					realFmt += string(char)
-					// Imaginary part always has a sign, so force + and ignore space.
-					imagFmt := "%"
-					if zero {
-						imagFmt += "0"
-					}
-					imagFmt += "+"
-					imagFmt += "10.2"
-					imagFmt += string(char)
-					for _, realValue := range values {
-						for _, imagValue := range values {
-							one := Sprintf(realFmt, complex(realValue, imagValue))
-							two := Sprintf("("+realFmt+imagFmt+"i)", realValue, imagValue)
-							if one != two {
-								t.Error(f, one, two)
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-}
-
-type SE []interface{} // slice of empty; notational compactness.
-
-var reorderTests = []struct {
-	fmt string
-	val SE
-	out string
-}{
-	{"%[1]d", SE{1}, "1"},
-	{"%[2]d", SE{2, 1}, "1"},
-	{"%[2]d %[1]d", SE{1, 2}, "2 1"},
-	{"%[2]*[1]d", SE{2, 5}, "    2"},
-	{"%6.2f", SE{12.0}, " 12.00"}, // Explicit version of next line.
-	{"%[3]*.[2]*[1]f", SE{12.0, 2, 6}, " 12.00"},
-	{"%[1]*.[2]*[3]f", SE{6, 2, 12.0}, " 12.00"},
-	{"%10f", SE{12.0}, " 12.000000"},
-	{"%[1]*[3]f", SE{10, 99, 12.0}, " 12.000000"},
-	{"%.6f", SE{12.0}, "12.000000"}, // Explicit version of next line.
-	{"%.[1]*[3]f", SE{6, 99, 12.0}, "12.000000"},
-	{"%6.f", SE{12.0}, "    12"}, //  // Explicit version of next line; empty precision means zero.
-	{"%[1]*.[3]f", SE{6, 3, 12.0}, "    12"},
-	// An actual use! Print the same arguments twice.
-	{"%d %d %d %#[1]o %#o %#o", SE{11, 12, 13}, "11 12 13 013 014 015"},
-
-	// Erroneous cases.
-	{"%[d", SE{2, 1}, "%!d(BADINDEX)"},
-	{"%]d", SE{2, 1}, "%!](int=2)d%!(EXTRA int=1)"},
-	{"%[]d", SE{2, 1}, "%!d(BADINDEX)"},
-	{"%[-3]d", SE{2, 1}, "%!d(BADINDEX)"},
-	{"%[99]d", SE{2, 1}, "%!d(BADINDEX)"},
-	{"%[3]", SE{2, 1}, "%!(NOVERB)"},
-	{"%[1].2d", SE{5, 6}, "%!d(BADINDEX)"},
-	{"%[1]2d", SE{2, 1}, "%!d(BADINDEX)"},
-	{"%3.[2]d", SE{7}, "%!d(BADINDEX)"},
-	{"%.[2]d", SE{7}, "%!d(BADINDEX)"},
-	{"%d %d %d %#[1]o %#o %#o %#o", SE{11, 12, 13}, "11 12 13 013 014 015 %!o(MISSING)"},
-	{"%[5]d %[2]d %d", SE{1, 2, 3}, "%!d(BADINDEX) 2 3"},
-	{"%d %[3]d %d", SE{1, 2}, "1 %!d(BADINDEX) 2"}, // Erroneous index does not affect sequence.
-	{"%.[]", SE{}, "%!](BADINDEX)"},                // Issue 10675
-	{"%.-3d", SE{42}, "%!-(int=42)3d"},             // TODO: Should this set return better error messages?
-	{"%2147483648d", SE{42}, "%!(NOVERB)%!(EXTRA int=42)"},
-	{"%-2147483648d", SE{42}, "%!(NOVERB)%!(EXTRA int=42)"},
-	{"%.2147483648d", SE{42}, "%!(NOVERB)%!(EXTRA int=42)"},
-}
-
-func TestReorder(t *testing.T) {
-	for _, tt := range reorderTests {
-		s := Sprintf(tt.fmt, tt.val...)
-		if s != tt.out {
-			t.Errorf("Sprintf(%q, %v) = <%s> want <%s>", tt.fmt, tt.val, s, tt.out)
-		} else {
-		}
-	}
-}
-
-func BenchmarkSprintfEmpty(b *testing.B) {
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			Sprintf("")
-		}
-	})
-}
-
-func BenchmarkSprintfString(b *testing.B) {
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			Sprintf("%s", "hello")
-		}
-	})
-}
-
-func BenchmarkSprintfInt(b *testing.B) {
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			Sprintf("%d", 5)
-		}
-	})
-}
-
-func BenchmarkSprintfIntInt(b *testing.B) {
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			Sprintf("%d %d", 5, 6)
-		}
-	})
-}
-
-func BenchmarkSprintfPrefixedInt(b *testing.B) {
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			Sprintf("This is some meaningless prefix text that needs to be scanned %d", 6)
-		}
-	})
-}
-
-func BenchmarkSprintfFloat(b *testing.B) {
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			Sprintf("%g", 5.23184)
-		}
-	})
-}
-
-func BenchmarkManyArgs(b *testing.B) {
-	b.RunParallel(func(pb *testing.PB) {
-		var buf bytes.Buffer
-		for pb.Next() {
-			buf.Reset()
-			Fprintf(&buf, "%2d/%2d/%2d %d:%d:%d %s %s\n", 3, 4, 5, 11, 12, 13, "hello", "world")
-		}
-	})
-}
-
-func BenchmarkFprintInt(b *testing.B) {
-	var buf bytes.Buffer
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		Fprint(&buf, 123456)
-	}
-}
-
-func BenchmarkFprintfBytes(b *testing.B) {
-	data := []byte(string("0123456789"))
-	var buf bytes.Buffer
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		Fprintf(&buf, "%s", data)
-	}
-}
-
-func BenchmarkFprintIntNoAlloc(b *testing.B) {
-	var x interface{} = 123456
-	var buf bytes.Buffer
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		Fprint(&buf, x)
-	}
-}
-
-var mallocBuf bytes.Buffer
-var mallocPointer *int // A pointer so we know the interface value won't allocate.
-
-// gccgo numbers are different because gccgo does not have escape
-// analysis yet.
-var mallocTest = []struct {
-	count int
-	desc  string
-	fn    func()
-}{
-	{5, `Sprintf("")`, func() { Sprintf("") }},
-	{5, `Sprintf("xxx")`, func() { Sprintf("xxx") }},
-	{5, `Sprintf("%x")`, func() { Sprintf("%x", 7) }},
-	{5, `Sprintf("%s")`, func() { Sprintf("%s", "hello") }},
-	{5, `Sprintf("%x %x")`, func() { Sprintf("%x %x", 7, 112) }},
-	{20, `Sprintf("%g")`, func() { Sprintf("%g", float32(3.14159)) }}, // TODO: Can this be 1?
-	{5, `Fprintf(buf, "%s")`, func() { mallocBuf.Reset(); Fprintf(&mallocBuf, "%s", "hello") }},
-	// If the interface value doesn't need to allocate, amortized allocation overhead should be zero.
-	{5, `Fprintf(buf, "%x %x %x")`, func() {
-		mallocBuf.Reset()
-		Fprintf(&mallocBuf, "%x %x %x", mallocPointer, mallocPointer, mallocPointer)
-	}},
-}
-
-var _ bytes.Buffer
-
-func TestCountMallocs(t *testing.T) {
-	switch {
-	case testing.Short():
-		t.Skip("skipping malloc count in short mode")
-	case runtime.GOMAXPROCS(0) > 1:
-		t.Skip("skipping; GOMAXPROCS>1")
-	case raceenabled:
-		t.Skip("skipping malloc count under race detector")
-	}
-	for _, mt := range mallocTest {
-		mallocs := testing.AllocsPerRun(100, mt.fn)
-		if got, max := mallocs, float64(mt.count); got > max {
-			t.Errorf("%s: got %v allocs, want <=%v", mt.desc, got, max)
-		}
-	}
-}
-
-type flagPrinter struct{}
-
-func (flagPrinter) Format(f State, c rune) {
-	s := "%"
-	for i := 0; i < 128; i++ {
-		if f.Flag(i) {
-			s += string(i)
-		}
-	}
-	if w, ok := f.Width(); ok {
-		s += Sprintf("%d", w)
-	}
-	if p, ok := f.Precision(); ok {
-		s += Sprintf(".%d", p)
-	}
-	s += string(c)
-	io.WriteString(f, "["+s+"]")
-}
-
-var flagtests = []struct {
-	in  string
-	out string
-}{
-	{"%a", "[%a]"},
-	{"%-a", "[%-a]"},
-	{"%+a", "[%+a]"},
-	{"%#a", "[%#a]"},
-	{"% a", "[% a]"},
-	{"%0a", "[%0a]"},
-	{"%1.2a", "[%1.2a]"},
-	{"%-1.2a", "[%-1.2a]"},
-	{"%+1.2a", "[%+1.2a]"},
-	{"%-+1.2a", "[%+-1.2a]"},
-	{"%-+1.2abc", "[%+-1.2a]bc"},
-	{"%-1.2abc", "[%-1.2a]bc"},
-}
-
-func TestFlagParser(t *testing.T) {
-	var flagprinter flagPrinter
-	for _, tt := range flagtests {
-		s := Sprintf(tt.in, &flagprinter)
-		if s != tt.out {
-			t.Errorf("Sprintf(%q, &flagprinter) => %q, want %q", tt.in, s, tt.out)
-		}
-	}
-}
-
-func TestStructPrinter(t *testing.T) {
-	type T struct {
-		a string
-		b string
-		c int
-	}
-	var s T
-	s.a = "abc"
-	s.b = "def"
-	s.c = 123
-	var tests = []struct {
-		fmt string
-		out string
-	}{
-		{"%v", "{abc def 123}"},
-		{"%+v", "{a:abc b:def c:123}"},
-		{"%#v", `fmt_test.T{a:"abc", b:"def", c:123}`},
-	}
-	for _, tt := range tests {
-		out := Sprintf(tt.fmt, s)
-		if out != tt.out {
-			t.Errorf("Sprintf(%q, s) = %#q, want %#q", tt.fmt, out, tt.out)
-		}
-		// The same but with a pointer.
-		out = Sprintf(tt.fmt, &s)
-		if out != "&"+tt.out {
-			t.Errorf("Sprintf(%q, &s) = %#q, want %#q", tt.fmt, out, "&"+tt.out)
-		}
-	}
-}
-
-func TestSlicePrinter(t *testing.T) {
-	slice := []int{}
-	s := Sprint(slice)
-	if s != "[]" {
-		t.Errorf("empty slice printed as %q not %q", s, "[]")
-	}
-	slice = []int{1, 2, 3}
-	s = Sprint(slice)
-	if s != "[1 2 3]" {
-		t.Errorf("slice: got %q expected %q", s, "[1 2 3]")
-	}
-	s = Sprint(&slice)
-	if s != "&[1 2 3]" {
-		t.Errorf("&slice: got %q expected %q", s, "&[1 2 3]")
-	}
-}
-
-// presentInMap checks map printing using substrings so we don't depend on the
-// print order.
-func presentInMap(s string, a []string, t *testing.T) {
-	for i := 0; i < len(a); i++ {
-		loc := strings.Index(s, a[i])
-		if loc < 0 {
-			t.Errorf("map print: expected to find %q in %q", a[i], s)
-		}
-		// make sure the match ends here
-		loc += len(a[i])
-		if loc >= len(s) || (s[loc] != ' ' && s[loc] != ']') {
-			t.Errorf("map print: %q not properly terminated in %q", a[i], s)
-		}
-	}
-}
-
-func TestMapPrinter(t *testing.T) {
-	m0 := make(map[int]string)
-	s := Sprint(m0)
-	if s != "map[]" {
-		t.Errorf("empty map printed as %q not %q", s, "map[]")
-	}
-	m1 := map[int]string{1: "one", 2: "two", 3: "three"}
-	a := []string{"1:one", "2:two", "3:three"}
-	presentInMap(Sprintf("%v", m1), a, t)
-	presentInMap(Sprint(m1), a, t)
-	// Pointer to map prints the same but with initial &.
-	if !strings.HasPrefix(Sprint(&m1), "&") {
-		t.Errorf("no initial & for address of map")
-	}
-	presentInMap(Sprintf("%v", &m1), a, t)
-	presentInMap(Sprint(&m1), a, t)
-}
-
-func TestEmptyMap(t *testing.T) {
-	const emptyMapStr = "map[]"
-	var m map[string]int
-	s := Sprint(m)
-	if s != emptyMapStr {
-		t.Errorf("nil map printed as %q not %q", s, emptyMapStr)
-	}
-	m = make(map[string]int)
-	s = Sprint(m)
-	if s != emptyMapStr {
-		t.Errorf("empty map printed as %q not %q", s, emptyMapStr)
-	}
-}
-
-// TestBlank checks that Sprint (and hence Print, Fprint) puts spaces in the
-// right places, that is, between arg pairs in which neither is a string.
-func TestBlank(t *testing.T) {
-	got := Sprint("<", 1, ">:", 1, 2, 3, "!")
-	expect := "<1>:1 2 3!"
-	if got != expect {
-		t.Errorf("got %q expected %q", got, expect)
-	}
-}
-
-// TestBlankln checks that Sprintln (and hence Println, Fprintln) puts spaces in
-// the right places, that is, between all arg pairs.
-func TestBlankln(t *testing.T) {
-	got := Sprintln("<", 1, ">:", 1, 2, 3, "!")
-	expect := "< 1 >: 1 2 3 !\n"
-	if got != expect {
-		t.Errorf("got %q expected %q", got, expect)
-	}
-}
-
-// TestFormatterPrintln checks Formatter with Sprint, Sprintln, Sprintf.
-func TestFormatterPrintln(t *testing.T) {
-	f := F(1)
-	expect := "<v=F(1)>\n"
-	s := Sprint(f, "\n")
-	if s != expect {
-		t.Errorf("Sprint wrong with Formatter: expected %q got %q", expect, s)
-	}
-	s = Sprintln(f)
-	if s != expect {
-		t.Errorf("Sprintln wrong with Formatter: expected %q got %q", expect, s)
-	}
-	s = Sprintf("%v\n", f)
-	if s != expect {
-		t.Errorf("Sprintf wrong with Formatter: expected %q got %q", expect, s)
-	}
-}
-
-func args(a ...interface{}) []interface{} { return a }
-
-var startests = []struct {
-	fmt string
-	in  []interface{}
-	out string
-}{
-	{"%*d", args(4, 42), "  42"},
-	{"%-*d", args(4, 42), "42  "},
-	{"%*d", args(-4, 42), "42  "},
-	{"%-*d", args(-4, 42), "42  "},
-	{"%.*d", args(4, 42), "0042"},
-	{"%*.*d", args(8, 4, 42), "    0042"},
-	{"%0*d", args(4, 42), "0042"},
-
-	// erroneous
-	{"%*d", args(nil, 42), "%!(BADWIDTH)42"},
-	{"%*d", args(int(1e7), 42), "%!(BADWIDTH)42"},
-	{"%*d", args(int(-1e7), 42), "%!(BADWIDTH)42"},
-	{"%.*d", args(nil, 42), "%!(BADPREC)42"},
-	{"%.*d", args(-1, 42), "%!(BADPREC)42"},
-	{"%.*d", args(int(1e7), 42), "%!(BADPREC)42"},
-	{"%*d", args(5, "foo"), "%!d(string=  foo)"},
-	{"%*% %d", args(20, 5), "% 5"},
-	{"%*", args(4), "%!(NOVERB)"},
-	{"%*d", args(int32(4), 42), "%!(BADWIDTH)42"},
-}
-
-func TestWidthAndPrecision(t *testing.T) {
-	for _, tt := range startests {
-		s := Sprintf(tt.fmt, tt.in...)
-		if s != tt.out {
-			t.Errorf("%q: got %q expected %q", tt.fmt, s, tt.out)
-		}
-	}
-}
-
-// Panic is a type that panics in String.
-type Panic struct {
-	message interface{}
-}
-
-// Value receiver.
-func (p Panic) GoString() string {
-	panic(p.message)
-}
-
-// Value receiver.
-func (p Panic) String() string {
-	panic(p.message)
-}
-
-// PanicF is a type that panics in Format.
-type PanicF struct {
-	message interface{}
-}
-
-// Value receiver.
-func (p PanicF) Format(f State, c rune) {
-	panic(p.message)
-}
-
-var panictests = []struct {
-	fmt string
-	in  interface{}
-	out string
-}{
-	// String
-	{"%s", (*Panic)(nil), "<nil>"}, // nil pointer special case
-	{"%s", Panic{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"},
-	{"%s", Panic{3}, "%!s(PANIC=3)"},
-	// GoString
-	{"%#v", (*Panic)(nil), "<nil>"}, // nil pointer special case
-	{"%#v", Panic{io.ErrUnexpectedEOF}, "%!v(PANIC=unexpected EOF)"},
-	{"%#v", Panic{3}, "%!v(PANIC=3)"},
-	// Format
-	{"%s", (*PanicF)(nil), "<nil>"}, // nil pointer special case
-	{"%s", PanicF{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"},
-	{"%s", PanicF{3}, "%!s(PANIC=3)"},
-}
-
-func TestPanics(t *testing.T) {
-	for i, tt := range panictests {
-		s := Sprintf(tt.fmt, tt.in)
-		if s != tt.out {
-			t.Errorf("%d: %q: got %q expected %q", i, tt.fmt, s, tt.out)
-		}
-	}
-}
-
-// recurCount tests that erroneous String routine doesn't cause fatal recursion.
-var recurCount = 0
-
-type Recur struct {
-	i      int
-	failed *bool
-}
-
-func (r *Recur) String() string {
-	if recurCount++; recurCount > 10 {
-		*r.failed = true
-		return "FAIL"
-	}
-	// This will call badVerb. Before the fix, that would cause us to recur into
-	// this routine to print %!p(value). Now we don't call the user's method
-	// during an error.
-	return Sprintf("recur@%p value: %d", r, r.i)
-}
-
-func TestBadVerbRecursion(t *testing.T) {
-	failed := false
-	r := &Recur{3, &failed}
-	Sprintf("recur@%p value: %d\n", &r, r.i)
-	if failed {
-		t.Error("fail with pointer")
-	}
-	failed = false
-	r = &Recur{4, &failed}
-	Sprintf("recur@%p, value: %d\n", r, r.i)
-	if failed {
-		t.Error("fail with value")
-	}
-}
-
-func TestIsSpace(t *testing.T) {
-	// This tests the internal isSpace function.
-	// IsSpace = isSpace is defined in export_test.go.
-	for i := rune(0); i <= unicode.MaxRune; i++ {
-		if IsSpace(i) != unicode.IsSpace(i) {
-			t.Errorf("isSpace(%U) = %v, want %v", i, IsSpace(i), unicode.IsSpace(i))
-		}
-	}
-}
-
-func TestNilDoesNotBecomeTyped(t *testing.T) {
-	type A struct{}
-	type B struct{}
-	var a *A = nil
-	var b B = B{}
-	got := Sprintf("%s %s %s %s %s", nil, a, nil, b, nil) // go vet should complain about this line.
-	const expect = "%!s(<nil>) %!s(*fmt_test.A=<nil>) %!s(<nil>) {} %!s(<nil>)"
-	if got != expect {
-		t.Errorf("expected:\n\t%q\ngot:\n\t%q", expect, got)
-	}
-}
-
-var formatterFlagTests = []struct {
-	in  string
-	val interface{}
-	out string
-}{
-	// scalar values with the (unused by fmt) 'a' verb.
-	{"%a", flagPrinter{}, "[%a]"},
-	{"%-a", flagPrinter{}, "[%-a]"},
-	{"%+a", flagPrinter{}, "[%+a]"},
-	{"%#a", flagPrinter{}, "[%#a]"},
-	{"% a", flagPrinter{}, "[% a]"},
-	{"%0a", flagPrinter{}, "[%0a]"},
-	{"%1.2a", flagPrinter{}, "[%1.2a]"},
-	{"%-1.2a", flagPrinter{}, "[%-1.2a]"},
-	{"%+1.2a", flagPrinter{}, "[%+1.2a]"},
-	{"%-+1.2a", flagPrinter{}, "[%+-1.2a]"},
-	{"%-+1.2abc", flagPrinter{}, "[%+-1.2a]bc"},
-	{"%-1.2abc", flagPrinter{}, "[%-1.2a]bc"},
-
-	// composite values with the 'a' verb
-	{"%a", [1]flagPrinter{}, "[[%a]]"},
-	{"%-a", [1]flagPrinter{}, "[[%-a]]"},
-	{"%+a", [1]flagPrinter{}, "[[%+a]]"},
-	{"%#a", [1]flagPrinter{}, "[[%#a]]"},
-	{"% a", [1]flagPrinter{}, "[[% a]]"},
-	{"%0a", [1]flagPrinter{}, "[[%0a]]"},
-	{"%1.2a", [1]flagPrinter{}, "[[%1.2a]]"},
-	{"%-1.2a", [1]flagPrinter{}, "[[%-1.2a]]"},
-	{"%+1.2a", [1]flagPrinter{}, "[[%+1.2a]]"},
-	{"%-+1.2a", [1]flagPrinter{}, "[[%+-1.2a]]"},
-	{"%-+1.2abc", [1]flagPrinter{}, "[[%+-1.2a]]bc"},
-	{"%-1.2abc", [1]flagPrinter{}, "[[%-1.2a]]bc"},
-
-	// simple values with the 'v' verb
-	{"%v", flagPrinter{}, "[%v]"},
-	{"%-v", flagPrinter{}, "[%-v]"},
-	{"%+v", flagPrinter{}, "[%+v]"},
-	{"%#v", flagPrinter{}, "[%#v]"},
-	{"% v", flagPrinter{}, "[% v]"},
-	{"%0v", flagPrinter{}, "[%0v]"},
-	{"%1.2v", flagPrinter{}, "[%1.2v]"},
-	{"%-1.2v", flagPrinter{}, "[%-1.2v]"},
-	{"%+1.2v", flagPrinter{}, "[%+1.2v]"},
-	{"%-+1.2v", flagPrinter{}, "[%+-1.2v]"},
-	{"%-+1.2vbc", flagPrinter{}, "[%+-1.2v]bc"},
-	{"%-1.2vbc", flagPrinter{}, "[%-1.2v]bc"},
-
-	// composite values with the 'v' verb.
-	{"%v", [1]flagPrinter{}, "[[%v]]"},
-	{"%-v", [1]flagPrinter{}, "[[%-v]]"},
-	{"%+v", [1]flagPrinter{}, "[[%+v]]"},
-	{"%#v", [1]flagPrinter{}, "[1]fmt_test.flagPrinter{[%#v]}"},
-	{"% v", [1]flagPrinter{}, "[[% v]]"},
-	{"%0v", [1]flagPrinter{}, "[[%0v]]"},
-	{"%1.2v", [1]flagPrinter{}, "[[%1.2v]]"},
-	{"%-1.2v", [1]flagPrinter{}, "[[%-1.2v]]"},
-	{"%+1.2v", [1]flagPrinter{}, "[[%+1.2v]]"},
-	{"%-+1.2v", [1]flagPrinter{}, "[[%+-1.2v]]"},
-	{"%-+1.2vbc", [1]flagPrinter{}, "[[%+-1.2v]]bc"},
-	{"%-1.2vbc", [1]flagPrinter{}, "[[%-1.2v]]bc"},
-}
-
-func TestFormatterFlags(t *testing.T) {
-	for _, tt := range formatterFlagTests {
-		s := Sprintf(tt.in, tt.val)
-		if s != tt.out {
-			t.Errorf("Sprintf(%q, %T) = %q, want %q", tt.in, tt.val, s, tt.out)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/fmt/format.go b/third_party/gofrontend/libgo/go/fmt/format.go
deleted file mode 100644
index 517b18f..0000000
--- a/third_party/gofrontend/libgo/go/fmt/format.go
+++ /dev/null
@@ -1,535 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package fmt
-
-import (
-	"math"
-	"strconv"
-	"unicode/utf8"
-)
-
-const (
-	// %b of an int64, plus a sign.
-	// Hex can add 0x and we handle it specially.
-	nByte = 65
-
-	ldigits = "0123456789abcdef"
-	udigits = "0123456789ABCDEF"
-)
-
-const (
-	signed   = true
-	unsigned = false
-)
-
-var padZeroBytes = make([]byte, nByte)
-var padSpaceBytes = make([]byte, nByte)
-
-func init() {
-	for i := 0; i < nByte; i++ {
-		padZeroBytes[i] = '0'
-		padSpaceBytes[i] = ' '
-	}
-}
-
-// flags placed in a separate struct for easy clearing.
-type fmtFlags struct {
-	widPresent  bool
-	precPresent bool
-	minus       bool
-	plus        bool
-	sharp       bool
-	space       bool
-	unicode     bool
-	uniQuote    bool // Use 'x'= prefix for %U if printable.
-	zero        bool
-
-	// For the formats %+v %#v, we set the plusV/sharpV flags
-	// and clear the plus/sharp flags since %+v and %#v are in effect
-	// different, flagless formats set at the top level.
-	plusV  bool
-	sharpV bool
-}
-
-// A fmt is the raw formatter used by Printf etc.
-// It prints into a buffer that must be set up separately.
-type fmt struct {
-	intbuf [nByte]byte
-	buf    *buffer
-	// width, precision
-	wid  int
-	prec int
-	fmtFlags
-}
-
-func (f *fmt) clearflags() {
-	f.fmtFlags = fmtFlags{}
-}
-
-func (f *fmt) init(buf *buffer) {
-	f.buf = buf
-	f.clearflags()
-}
-
-// computePadding computes left and right padding widths (only one will be non-zero).
-func (f *fmt) computePadding(width int) (padding []byte, leftWidth, rightWidth int) {
-	left := !f.minus
-	w := f.wid
-	if w < 0 {
-		left = false
-		w = -w
-	}
-	w -= width
-	if w > 0 {
-		if left && f.zero {
-			return padZeroBytes, w, 0
-		}
-		if left {
-			return padSpaceBytes, w, 0
-		} else {
-			// can't be zero padding on the right
-			return padSpaceBytes, 0, w
-		}
-	}
-	return
-}
-
-// writePadding generates n bytes of padding.
-func (f *fmt) writePadding(n int, padding []byte) {
-	for n > 0 {
-		m := n
-		if m > nByte {
-			m = nByte
-		}
-		f.buf.Write(padding[0:m])
-		n -= m
-	}
-}
-
-// pad appends b to f.buf, padded on left (w > 0) or right (w < 0 or f.minus).
-func (f *fmt) pad(b []byte) {
-	if !f.widPresent || f.wid == 0 {
-		f.buf.Write(b)
-		return
-	}
-	padding, left, right := f.computePadding(utf8.RuneCount(b))
-	if left > 0 {
-		f.writePadding(left, padding)
-	}
-	f.buf.Write(b)
-	if right > 0 {
-		f.writePadding(right, padding)
-	}
-}
-
-// padString appends s to buf, padded on left (w > 0) or right (w < 0 or f.minus).
-func (f *fmt) padString(s string) {
-	if !f.widPresent || f.wid == 0 {
-		f.buf.WriteString(s)
-		return
-	}
-	padding, left, right := f.computePadding(utf8.RuneCountInString(s))
-	if left > 0 {
-		f.writePadding(left, padding)
-	}
-	f.buf.WriteString(s)
-	if right > 0 {
-		f.writePadding(right, padding)
-	}
-}
-
-var (
-	trueBytes  = []byte("true")
-	falseBytes = []byte("false")
-)
-
-// fmt_boolean formats a boolean.
-func (f *fmt) fmt_boolean(v bool) {
-	if v {
-		f.pad(trueBytes)
-	} else {
-		f.pad(falseBytes)
-	}
-}
-
-// integer; interprets prec but not wid.  Once formatted, result is sent to pad()
-// and then flags are cleared.
-func (f *fmt) integer(a int64, base uint64, signedness bool, digits string) {
-	// precision of 0 and value of 0 means "print nothing"
-	if f.precPresent && f.prec == 0 && a == 0 {
-		return
-	}
-
-	negative := signedness == signed && a < 0
-	if negative {
-		a = -a
-	}
-
-	var buf []byte = f.intbuf[0:]
-	if f.widPresent || f.precPresent || f.plus || f.space {
-		width := f.wid + f.prec // Only one will be set, both are positive; this provides the maximum.
-		if base == 16 && f.sharp {
-			// Also adds "0x".
-			width += 2
-		}
-		if f.unicode {
-			// Also adds "U+".
-			width += 2
-			if f.uniQuote {
-				// Also adds " 'x'".
-				width += 1 + 1 + utf8.UTFMax + 1
-			}
-		}
-		if negative || f.plus || f.space {
-			width++
-		}
-		if width > nByte {
-			// We're going to need a bigger boat.
-			buf = make([]byte, width)
-		}
-	}
-
-	// two ways to ask for extra leading zero digits: %.3d or %03d.
-	// apparently the first cancels the second.
-	prec := 0
-	if f.precPresent {
-		prec = f.prec
-		f.zero = false
-	} else if f.zero && f.widPresent && !f.minus && f.wid > 0 {
-		prec = f.wid
-		if negative || f.plus || f.space {
-			prec-- // leave room for sign
-		}
-	}
-
-	// format a into buf, ending at buf[i].  (printing is easier right-to-left.)
-	// a is made into unsigned ua.  we could make things
-	// marginally faster by splitting the 32-bit case out into a separate
-	// block but it's not worth the duplication, so ua has 64 bits.
-	i := len(buf)
-	ua := uint64(a)
-	// use constants for the division and modulo for more efficient code.
-	// switch cases ordered by popularity.
-	switch base {
-	case 10:
-		for ua >= 10 {
-			i--
-			next := ua / 10
-			buf[i] = byte('0' + ua - next*10)
-			ua = next
-		}
-	case 16:
-		for ua >= 16 {
-			i--
-			buf[i] = digits[ua&0xF]
-			ua >>= 4
-		}
-	case 8:
-		for ua >= 8 {
-			i--
-			buf[i] = byte('0' + ua&7)
-			ua >>= 3
-		}
-	case 2:
-		for ua >= 2 {
-			i--
-			buf[i] = byte('0' + ua&1)
-			ua >>= 1
-		}
-	default:
-		panic("fmt: unknown base; can't happen")
-	}
-	i--
-	buf[i] = digits[ua]
-	for i > 0 && prec > len(buf)-i {
-		i--
-		buf[i] = '0'
-	}
-
-	// Various prefixes: 0x, -, etc.
-	if f.sharp {
-		switch base {
-		case 8:
-			if buf[i] != '0' {
-				i--
-				buf[i] = '0'
-			}
-		case 16:
-			i--
-			buf[i] = 'x' + digits[10] - 'a'
-			i--
-			buf[i] = '0'
-		}
-	}
-	if f.unicode {
-		i--
-		buf[i] = '+'
-		i--
-		buf[i] = 'U'
-	}
-
-	if negative {
-		i--
-		buf[i] = '-'
-	} else if f.plus {
-		i--
-		buf[i] = '+'
-	} else if f.space {
-		i--
-		buf[i] = ' '
-	}
-
-	// If we want a quoted char for %#U, move the data up to make room.
-	if f.unicode && f.uniQuote && a >= 0 && a <= utf8.MaxRune && strconv.IsPrint(rune(a)) {
-		runeWidth := utf8.RuneLen(rune(a))
-		width := 1 + 1 + runeWidth + 1 // space, quote, rune, quote
-		copy(buf[i-width:], buf[i:])   // guaranteed to have enough room.
-		i -= width
-		// Now put " 'x'" at the end.
-		j := len(buf) - width
-		buf[j] = ' '
-		j++
-		buf[j] = '\''
-		j++
-		utf8.EncodeRune(buf[j:], rune(a))
-		j += runeWidth
-		buf[j] = '\''
-	}
-
-	f.pad(buf[i:])
-}
-
-// truncate truncates the string to the specified precision, if present.
-func (f *fmt) truncate(s string) string {
-	if f.precPresent && f.prec < utf8.RuneCountInString(s) {
-		n := f.prec
-		for i := range s {
-			if n == 0 {
-				s = s[:i]
-				break
-			}
-			n--
-		}
-	}
-	return s
-}
-
-// fmt_s formats a string.
-func (f *fmt) fmt_s(s string) {
-	s = f.truncate(s)
-	f.padString(s)
-}
-
-// fmt_sbx formats a string or byte slice as a hexadecimal encoding of its bytes.
-func (f *fmt) fmt_sbx(s string, b []byte, digits string) {
-	n := len(b)
-	if b == nil {
-		n = len(s)
-	}
-	x := digits[10] - 'a' + 'x'
-	// TODO: Avoid buffer by pre-padding.
-	var buf []byte
-	for i := 0; i < n; i++ {
-		if i > 0 && f.space {
-			buf = append(buf, ' ')
-		}
-		if f.sharp && (f.space || i == 0) {
-			buf = append(buf, '0', x)
-		}
-		var c byte
-		if b == nil {
-			c = s[i]
-		} else {
-			c = b[i]
-		}
-		buf = append(buf, digits[c>>4], digits[c&0xF])
-	}
-	f.pad(buf)
-}
-
-// fmt_sx formats a string as a hexadecimal encoding of its bytes.
-func (f *fmt) fmt_sx(s, digits string) {
-	if f.precPresent && f.prec < len(s) {
-		s = s[:f.prec]
-	}
-	f.fmt_sbx(s, nil, digits)
-}
-
-// fmt_bx formats a byte slice as a hexadecimal encoding of its bytes.
-func (f *fmt) fmt_bx(b []byte, digits string) {
-	if f.precPresent && f.prec < len(b) {
-		b = b[:f.prec]
-	}
-	f.fmt_sbx("", b, digits)
-}
-
-// fmt_q formats a string as a double-quoted, escaped Go string constant.
-func (f *fmt) fmt_q(s string) {
-	s = f.truncate(s)
-	var quoted string
-	if f.sharp && strconv.CanBackquote(s) {
-		quoted = "`" + s + "`"
-	} else {
-		if f.plus {
-			quoted = strconv.QuoteToASCII(s)
-		} else {
-			quoted = strconv.Quote(s)
-		}
-	}
-	f.padString(quoted)
-}
-
-// fmt_qc formats the integer as a single-quoted, escaped Go character constant.
-// If the character is not valid Unicode, it will print '\ufffd'.
-func (f *fmt) fmt_qc(c int64) {
-	var quoted []byte
-	if f.plus {
-		quoted = strconv.AppendQuoteRuneToASCII(f.intbuf[0:0], rune(c))
-	} else {
-		quoted = strconv.AppendQuoteRune(f.intbuf[0:0], rune(c))
-	}
-	f.pad(quoted)
-}
-
-// floating-point
-
-func doPrec(f *fmt, def int) int {
-	if f.precPresent {
-		return f.prec
-	}
-	return def
-}
-
-// formatFloat formats a float64; it is an efficient equivalent to  f.pad(strconv.FormatFloat()...).
-func (f *fmt) formatFloat(v float64, verb byte, prec, n int) {
-	// Format number, reserving space for leading + sign if needed.
-	num := strconv.AppendFloat(f.intbuf[0:1], v, verb, prec, n)
-	if num[1] == '-' || num[1] == '+' {
-		num = num[1:]
-	} else {
-		num[0] = '+'
-	}
-	// Special handling for infinity, which doesn't look like a number so shouldn't be padded with zeros.
-	if math.IsInf(v, 0) {
-		if f.zero {
-			defer func() { f.zero = true }()
-			f.zero = false
-		}
-	}
-	// num is now a signed version of the number.
-	// If we're zero padding, want the sign before the leading zeros.
-	// Achieve this by writing the sign out and then padding the unsigned number.
-	if f.zero && f.widPresent && f.wid > len(num) {
-		if f.space && v >= 0 {
-			f.buf.WriteByte(' ') // This is what C does: even with zero, f.space means space.
-			f.wid--
-		} else if f.plus || v < 0 {
-			f.buf.WriteByte(num[0])
-			f.wid--
-		}
-		f.pad(num[1:])
-		return
-	}
-	// f.space says to replace a leading + with a space.
-	if f.space && num[0] == '+' {
-		num[0] = ' '
-		f.pad(num)
-		return
-	}
-	// Now we know the sign is attached directly to the number, if present at all.
-	// We want a sign if asked for, if it's negative, or if it's infinity (+Inf vs. -Inf).
-	if f.plus || num[0] == '-' || math.IsInf(v, 0) {
-		f.pad(num)
-		return
-	}
-	// No sign to show and the number is positive; just print the unsigned number.
-	f.pad(num[1:])
-}
-
-// fmt_e64 formats a float64 in the form -1.23e+12.
-func (f *fmt) fmt_e64(v float64) { f.formatFloat(v, 'e', doPrec(f, 6), 64) }
-
-// fmt_E64 formats a float64 in the form -1.23E+12.
-func (f *fmt) fmt_E64(v float64) { f.formatFloat(v, 'E', doPrec(f, 6), 64) }
-
-// fmt_f64 formats a float64 in the form -1.23.
-func (f *fmt) fmt_f64(v float64) { f.formatFloat(v, 'f', doPrec(f, 6), 64) }
-
-// fmt_g64 formats a float64 in the 'f' or 'e' form according to size.
-func (f *fmt) fmt_g64(v float64) { f.formatFloat(v, 'g', doPrec(f, -1), 64) }
-
-// fmt_G64 formats a float64 in the 'f' or 'E' form according to size.
-func (f *fmt) fmt_G64(v float64) { f.formatFloat(v, 'G', doPrec(f, -1), 64) }
-
-// fmt_fb64 formats a float64 in the form -123p3 (exponent is power of 2).
-func (f *fmt) fmt_fb64(v float64) { f.formatFloat(v, 'b', 0, 64) }
-
-// float32
-// cannot defer to float64 versions
-// because it will get rounding wrong in corner cases.
-
-// fmt_e32 formats a float32 in the form -1.23e+12.
-func (f *fmt) fmt_e32(v float32) { f.formatFloat(float64(v), 'e', doPrec(f, 6), 32) }
-
-// fmt_E32 formats a float32 in the form -1.23E+12.
-func (f *fmt) fmt_E32(v float32) { f.formatFloat(float64(v), 'E', doPrec(f, 6), 32) }
-
-// fmt_f32 formats a float32 in the form -1.23.
-func (f *fmt) fmt_f32(v float32) { f.formatFloat(float64(v), 'f', doPrec(f, 6), 32) }
-
-// fmt_g32 formats a float32 in the 'f' or 'e' form according to size.
-func (f *fmt) fmt_g32(v float32) { f.formatFloat(float64(v), 'g', doPrec(f, -1), 32) }
-
-// fmt_G32 formats a float32 in the 'f' or 'E' form according to size.
-func (f *fmt) fmt_G32(v float32) { f.formatFloat(float64(v), 'G', doPrec(f, -1), 32) }
-
-// fmt_fb32 formats a float32 in the form -123p3 (exponent is power of 2).
-func (f *fmt) fmt_fb32(v float32) { f.formatFloat(float64(v), 'b', 0, 32) }
-
-// fmt_c64 formats a complex64 according to the verb.
-func (f *fmt) fmt_c64(v complex64, verb rune) {
-	f.fmt_complex(float64(real(v)), float64(imag(v)), 32, verb)
-}
-
-// fmt_c128 formats a complex128 according to the verb.
-func (f *fmt) fmt_c128(v complex128, verb rune) {
-	f.fmt_complex(real(v), imag(v), 64, verb)
-}
-
-// fmt_complex formats a complex number as (r+ji).
-func (f *fmt) fmt_complex(r, j float64, size int, verb rune) {
-	f.buf.WriteByte('(')
-	oldPlus := f.plus
-	oldSpace := f.space
-	oldWid := f.wid
-	for i := 0; ; i++ {
-		switch verb {
-		case 'b':
-			f.formatFloat(r, 'b', 0, size)
-		case 'e':
-			f.formatFloat(r, 'e', doPrec(f, 6), size)
-		case 'E':
-			f.formatFloat(r, 'E', doPrec(f, 6), size)
-		case 'f', 'F':
-			f.formatFloat(r, 'f', doPrec(f, 6), size)
-		case 'g':
-			f.formatFloat(r, 'g', doPrec(f, -1), size)
-		case 'G':
-			f.formatFloat(r, 'G', doPrec(f, -1), size)
-		}
-		if i != 0 {
-			break
-		}
-		// Imaginary part always has a sign.
-		f.plus = true
-		f.space = false
-		f.wid = oldWid
-		r = j
-	}
-	f.space = oldSpace
-	f.plus = oldPlus
-	f.wid = oldWid
-	f.buf.Write(irparenBytes)
-}
diff --git a/third_party/gofrontend/libgo/go/fmt/norace_test.go b/third_party/gofrontend/libgo/go/fmt/norace_test.go
deleted file mode 100644
index 1267cc3..0000000
--- a/third_party/gofrontend/libgo/go/fmt/norace_test.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !race
-
-package fmt_test
-
-const raceenabled = false
diff --git a/third_party/gofrontend/libgo/go/fmt/print.go b/third_party/gofrontend/libgo/go/fmt/print.go
deleted file mode 100644
index 8d3e97c..0000000
--- a/third_party/gofrontend/libgo/go/fmt/print.go
+++ /dev/null
@@ -1,1259 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package fmt
-
-import (
-	"errors"
-	"io"
-	"os"
-	"reflect"
-	"sync"
-	"unicode/utf8"
-)
-
-// Some constants in the form of bytes, to avoid string overhead.
-// Needlessly fastidious, I suppose.
-var (
-	commaSpaceBytes  = []byte(", ")
-	nilAngleBytes    = []byte("<nil>")
-	nilParenBytes    = []byte("(nil)")
-	nilBytes         = []byte("nil")
-	mapBytes         = []byte("map[")
-	percentBangBytes = []byte("%!")
-	missingBytes     = []byte("(MISSING)")
-	badIndexBytes    = []byte("(BADINDEX)")
-	panicBytes       = []byte("(PANIC=")
-	extraBytes       = []byte("%!(EXTRA ")
-	irparenBytes     = []byte("i)")
-	bytesBytes       = []byte("[]byte{")
-	badWidthBytes    = []byte("%!(BADWIDTH)")
-	badPrecBytes     = []byte("%!(BADPREC)")
-	noVerbBytes      = []byte("%!(NOVERB)")
-)
-
-// State represents the printer state passed to custom formatters.
-// It provides access to the io.Writer interface plus information about
-// the flags and options for the operand's format specifier.
-type State interface {
-	// Write is the function to call to emit formatted output to be printed.
-	Write(b []byte) (ret int, err error)
-	// Width returns the value of the width option and whether it has been set.
-	Width() (wid int, ok bool)
-	// Precision returns the value of the precision option and whether it has been set.
-	Precision() (prec int, ok bool)
-
-	// Flag reports whether the flag c, a character, has been set.
-	Flag(c int) bool
-}
-
-// Formatter is the interface implemented by values with a custom formatter.
-// The implementation of Format may call Sprint(f) or Fprint(f) etc.
-// to generate its output.
-type Formatter interface {
-	Format(f State, c rune)
-}
-
-// Stringer is implemented by any value that has a String method,
-// which defines the ``native'' format for that value.
-// The String method is used to print values passed as an operand
-// to any format that accepts a string or to an unformatted printer
-// such as Print.
-type Stringer interface {
-	String() string
-}
-
-// GoStringer is implemented by any value that has a GoString method,
-// which defines the Go syntax for that value.
-// The GoString method is used to print values passed as an operand
-// to a %#v format.
-type GoStringer interface {
-	GoString() string
-}
-
-// Use simple []byte instead of bytes.Buffer to avoid large dependency.
-type buffer []byte
-
-func (b *buffer) Write(p []byte) (n int, err error) {
-	*b = append(*b, p...)
-	return len(p), nil
-}
-
-func (b *buffer) WriteString(s string) (n int, err error) {
-	*b = append(*b, s...)
-	return len(s), nil
-}
-
-func (b *buffer) WriteByte(c byte) error {
-	*b = append(*b, c)
-	return nil
-}
-
-func (bp *buffer) WriteRune(r rune) error {
-	if r < utf8.RuneSelf {
-		*bp = append(*bp, byte(r))
-		return nil
-	}
-
-	b := *bp
-	n := len(b)
-	for n+utf8.UTFMax > cap(b) {
-		b = append(b, 0)
-	}
-	w := utf8.EncodeRune(b[n:n+utf8.UTFMax], r)
-	*bp = b[:n+w]
-	return nil
-}
-
-type pp struct {
-	n         int
-	panicking bool
-	erroring  bool // printing an error condition
-	buf       buffer
-	// arg holds the current item, as an interface{}.
-	arg interface{}
-	// value holds the current item, as a reflect.Value, and will be
-	// the zero Value if the item has not been reflected.
-	value reflect.Value
-	// reordered records whether the format string used argument reordering.
-	reordered bool
-	// goodArgNum records whether the most recent reordering directive was valid.
-	goodArgNum bool
-	runeBuf    [utf8.UTFMax]byte
-	fmt        fmt
-}
-
-var ppFree = sync.Pool{
-	New: func() interface{} { return new(pp) },
-}
-
-// newPrinter allocates a new pp struct or grabs a cached one.
-func newPrinter() *pp {
-	p := ppFree.Get().(*pp)
-	p.panicking = false
-	p.erroring = false
-	p.fmt.init(&p.buf)
-	return p
-}
-
-// free saves used pp structs in ppFree; avoids an allocation per invocation.
-func (p *pp) free() {
-	// Don't hold on to pp structs with large buffers.
-	if cap(p.buf) > 1024 {
-		return
-	}
-	p.buf = p.buf[:0]
-	p.arg = nil
-	p.value = reflect.Value{}
-	ppFree.Put(p)
-}
-
-func (p *pp) Width() (wid int, ok bool) { return p.fmt.wid, p.fmt.widPresent }
-
-func (p *pp) Precision() (prec int, ok bool) { return p.fmt.prec, p.fmt.precPresent }
-
-func (p *pp) Flag(b int) bool {
-	switch b {
-	case '-':
-		return p.fmt.minus
-	case '+':
-		return p.fmt.plus
-	case '#':
-		return p.fmt.sharp
-	case ' ':
-		return p.fmt.space
-	case '0':
-		return p.fmt.zero
-	}
-	return false
-}
-
-func (p *pp) add(c rune) {
-	p.buf.WriteRune(c)
-}
-
-// Implement Write so we can call Fprintf on a pp (through State), for
-// recursive use in custom verbs.
-func (p *pp) Write(b []byte) (ret int, err error) {
-	return p.buf.Write(b)
-}
-
-// These routines end in 'f' and take a format string.
-
-// Fprintf formats according to a format specifier and writes to w.
-// It returns the number of bytes written and any write error encountered.
-func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {
-	p := newPrinter()
-	p.doPrintf(format, a)
-	n, err = w.Write(p.buf)
-	p.free()
-	return
-}
-
-// Printf formats according to a format specifier and writes to standard output.
-// It returns the number of bytes written and any write error encountered.
-func Printf(format string, a ...interface{}) (n int, err error) {
-	return Fprintf(os.Stdout, format, a...)
-}
-
-// Sprintf formats according to a format specifier and returns the resulting string.
-func Sprintf(format string, a ...interface{}) string {
-	p := newPrinter()
-	p.doPrintf(format, a)
-	s := string(p.buf)
-	p.free()
-	return s
-}
-
-// Errorf formats according to a format specifier and returns the string
-// as a value that satisfies error.
-func Errorf(format string, a ...interface{}) error {
-	return errors.New(Sprintf(format, a...))
-}
-
-// These routines do not take a format string
-
-// Fprint formats using the default formats for its operands and writes to w.
-// Spaces are added between operands when neither is a string.
-// It returns the number of bytes written and any write error encountered.
-func Fprint(w io.Writer, a ...interface{}) (n int, err error) {
-	p := newPrinter()
-	p.doPrint(a, false, false)
-	n, err = w.Write(p.buf)
-	p.free()
-	return
-}
-
-// Print formats using the default formats for its operands and writes to standard output.
-// Spaces are added between operands when neither is a string.
-// It returns the number of bytes written and any write error encountered.
-func Print(a ...interface{}) (n int, err error) {
-	return Fprint(os.Stdout, a...)
-}
-
-// Sprint formats using the default formats for its operands and returns the resulting string.
-// Spaces are added between operands when neither is a string.
-func Sprint(a ...interface{}) string {
-	p := newPrinter()
-	p.doPrint(a, false, false)
-	s := string(p.buf)
-	p.free()
-	return s
-}
-
-// These routines end in 'ln', do not take a format string,
-// always add spaces between operands, and add a newline
-// after the last operand.
-
-// Fprintln formats using the default formats for its operands and writes to w.
-// Spaces are always added between operands and a newline is appended.
-// It returns the number of bytes written and any write error encountered.
-func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
-	p := newPrinter()
-	p.doPrint(a, true, true)
-	n, err = w.Write(p.buf)
-	p.free()
-	return
-}
-
-// Println formats using the default formats for its operands and writes to standard output.
-// Spaces are always added between operands and a newline is appended.
-// It returns the number of bytes written and any write error encountered.
-func Println(a ...interface{}) (n int, err error) {
-	return Fprintln(os.Stdout, a...)
-}
-
-// Sprintln formats using the default formats for its operands and returns the resulting string.
-// Spaces are always added between operands and a newline is appended.
-func Sprintln(a ...interface{}) string {
-	p := newPrinter()
-	p.doPrint(a, true, true)
-	s := string(p.buf)
-	p.free()
-	return s
-}
-
-// getField gets the i'th field of the struct value.
-// If the field is itself is an interface, return a value for
-// the thing inside the interface, not the interface itself.
-func getField(v reflect.Value, i int) reflect.Value {
-	val := v.Field(i)
-	if val.Kind() == reflect.Interface && !val.IsNil() {
-		val = val.Elem()
-	}
-	return val
-}
-
-// tooLarge reports whether the magnitude of the integer is
-// too large to be used as a formatting width or precision.
-func tooLarge(x int) bool {
-	const max int = 1e6
-	return x > max || x < -max
-}
-
-// parsenum converts ASCII to integer.  num is 0 (and isnum is false) if no number present.
-func parsenum(s string, start, end int) (num int, isnum bool, newi int) {
-	if start >= end {
-		return 0, false, end
-	}
-	for newi = start; newi < end && '0' <= s[newi] && s[newi] <= '9'; newi++ {
-		if tooLarge(num) {
-			return 0, false, end // Overflow; crazy long number most likely.
-		}
-		num = num*10 + int(s[newi]-'0')
-		isnum = true
-	}
-	return
-}
-
-func (p *pp) unknownType(v reflect.Value) {
-	if !v.IsValid() {
-		p.buf.Write(nilAngleBytes)
-		return
-	}
-	p.buf.WriteByte('?')
-	p.buf.WriteString(v.Type().String())
-	p.buf.WriteByte('?')
-}
-
-func (p *pp) badVerb(verb rune) {
-	p.erroring = true
-	p.add('%')
-	p.add('!')
-	p.add(verb)
-	p.add('(')
-	switch {
-	case p.arg != nil:
-		p.buf.WriteString(reflect.TypeOf(p.arg).String())
-		p.add('=')
-		p.printArg(p.arg, 'v', 0)
-	case p.value.IsValid():
-		p.buf.WriteString(p.value.Type().String())
-		p.add('=')
-		p.printValue(p.value, 'v', 0)
-	default:
-		p.buf.Write(nilAngleBytes)
-	}
-	p.add(')')
-	p.erroring = false
-}
-
-func (p *pp) fmtBool(v bool, verb rune) {
-	switch verb {
-	case 't', 'v':
-		p.fmt.fmt_boolean(v)
-	default:
-		p.badVerb(verb)
-	}
-}
-
-// fmtC formats a rune for the 'c' format.
-func (p *pp) fmtC(c int64) {
-	r := rune(c) // Check for overflow.
-	if int64(r) != c {
-		r = utf8.RuneError
-	}
-	w := utf8.EncodeRune(p.runeBuf[0:utf8.UTFMax], r)
-	p.fmt.pad(p.runeBuf[0:w])
-}
-
-func (p *pp) fmtInt64(v int64, verb rune) {
-	switch verb {
-	case 'b':
-		p.fmt.integer(v, 2, signed, ldigits)
-	case 'c':
-		p.fmtC(v)
-	case 'd', 'v':
-		p.fmt.integer(v, 10, signed, ldigits)
-	case 'o':
-		p.fmt.integer(v, 8, signed, ldigits)
-	case 'q':
-		if 0 <= v && v <= utf8.MaxRune {
-			p.fmt.fmt_qc(v)
-		} else {
-			p.badVerb(verb)
-		}
-	case 'x':
-		p.fmt.integer(v, 16, signed, ldigits)
-	case 'U':
-		p.fmtUnicode(v)
-	case 'X':
-		p.fmt.integer(v, 16, signed, udigits)
-	default:
-		p.badVerb(verb)
-	}
-}
-
-// fmt0x64 formats a uint64 in hexadecimal and prefixes it with 0x or
-// not, as requested, by temporarily setting the sharp flag.
-func (p *pp) fmt0x64(v uint64, leading0x bool) {
-	sharp := p.fmt.sharp
-	p.fmt.sharp = leading0x
-	p.fmt.integer(int64(v), 16, unsigned, ldigits)
-	p.fmt.sharp = sharp
-}
-
-// fmtUnicode formats a uint64 in U+1234 form by
-// temporarily turning on the unicode flag and tweaking the precision.
-func (p *pp) fmtUnicode(v int64) {
-	precPresent := p.fmt.precPresent
-	sharp := p.fmt.sharp
-	p.fmt.sharp = false
-	prec := p.fmt.prec
-	if !precPresent {
-		// If prec is already set, leave it alone; otherwise 4 is minimum.
-		p.fmt.prec = 4
-		p.fmt.precPresent = true
-	}
-	p.fmt.unicode = true // turn on U+
-	p.fmt.uniQuote = sharp
-	p.fmt.integer(int64(v), 16, unsigned, udigits)
-	p.fmt.unicode = false
-	p.fmt.uniQuote = false
-	p.fmt.prec = prec
-	p.fmt.precPresent = precPresent
-	p.fmt.sharp = sharp
-}
-
-func (p *pp) fmtUint64(v uint64, verb rune) {
-	switch verb {
-	case 'b':
-		p.fmt.integer(int64(v), 2, unsigned, ldigits)
-	case 'c':
-		p.fmtC(int64(v))
-	case 'd':
-		p.fmt.integer(int64(v), 10, unsigned, ldigits)
-	case 'v':
-		if p.fmt.sharpV {
-			p.fmt0x64(v, true)
-		} else {
-			p.fmt.integer(int64(v), 10, unsigned, ldigits)
-		}
-	case 'o':
-		p.fmt.integer(int64(v), 8, unsigned, ldigits)
-	case 'q':
-		if 0 <= v && v <= utf8.MaxRune {
-			p.fmt.fmt_qc(int64(v))
-		} else {
-			p.badVerb(verb)
-		}
-	case 'x':
-		p.fmt.integer(int64(v), 16, unsigned, ldigits)
-	case 'X':
-		p.fmt.integer(int64(v), 16, unsigned, udigits)
-	case 'U':
-		p.fmtUnicode(int64(v))
-	default:
-		p.badVerb(verb)
-	}
-}
-
-func (p *pp) fmtFloat32(v float32, verb rune) {
-	switch verb {
-	case 'b':
-		p.fmt.fmt_fb32(v)
-	case 'e':
-		p.fmt.fmt_e32(v)
-	case 'E':
-		p.fmt.fmt_E32(v)
-	case 'f', 'F':
-		p.fmt.fmt_f32(v)
-	case 'g', 'v':
-		p.fmt.fmt_g32(v)
-	case 'G':
-		p.fmt.fmt_G32(v)
-	default:
-		p.badVerb(verb)
-	}
-}
-
-func (p *pp) fmtFloat64(v float64, verb rune) {
-	switch verb {
-	case 'b':
-		p.fmt.fmt_fb64(v)
-	case 'e':
-		p.fmt.fmt_e64(v)
-	case 'E':
-		p.fmt.fmt_E64(v)
-	case 'f', 'F':
-		p.fmt.fmt_f64(v)
-	case 'g', 'v':
-		p.fmt.fmt_g64(v)
-	case 'G':
-		p.fmt.fmt_G64(v)
-	default:
-		p.badVerb(verb)
-	}
-}
-
-func (p *pp) fmtComplex64(v complex64, verb rune) {
-	switch verb {
-	case 'b', 'e', 'E', 'f', 'F', 'g', 'G':
-		p.fmt.fmt_c64(v, verb)
-	case 'v':
-		p.fmt.fmt_c64(v, 'g')
-	default:
-		p.badVerb(verb)
-	}
-}
-
-func (p *pp) fmtComplex128(v complex128, verb rune) {
-	switch verb {
-	case 'b', 'e', 'E', 'f', 'F', 'g', 'G':
-		p.fmt.fmt_c128(v, verb)
-	case 'v':
-		p.fmt.fmt_c128(v, 'g')
-	default:
-		p.badVerb(verb)
-	}
-}
-
-func (p *pp) fmtString(v string, verb rune) {
-	switch verb {
-	case 'v':
-		if p.fmt.sharpV {
-			p.fmt.fmt_q(v)
-		} else {
-			p.fmt.fmt_s(v)
-		}
-	case 's':
-		p.fmt.fmt_s(v)
-	case 'x':
-		p.fmt.fmt_sx(v, ldigits)
-	case 'X':
-		p.fmt.fmt_sx(v, udigits)
-	case 'q':
-		p.fmt.fmt_q(v)
-	default:
-		p.badVerb(verb)
-	}
-}
-
-func (p *pp) fmtBytes(v []byte, verb rune, typ reflect.Type, depth int) {
-	if verb == 'v' || verb == 'd' {
-		if p.fmt.sharpV {
-			if v == nil {
-				if typ == nil {
-					p.buf.WriteString("[]byte(nil)")
-				} else {
-					p.buf.WriteString(typ.String())
-					p.buf.Write(nilParenBytes)
-				}
-				return
-			}
-			if typ == nil {
-				p.buf.Write(bytesBytes)
-			} else {
-				p.buf.WriteString(typ.String())
-				p.buf.WriteByte('{')
-			}
-		} else {
-			p.buf.WriteByte('[')
-		}
-		for i, c := range v {
-			if i > 0 {
-				if p.fmt.sharpV {
-					p.buf.Write(commaSpaceBytes)
-				} else {
-					p.buf.WriteByte(' ')
-				}
-			}
-			p.printArg(c, 'v', depth+1)
-		}
-		if p.fmt.sharpV {
-			p.buf.WriteByte('}')
-		} else {
-			p.buf.WriteByte(']')
-		}
-		return
-	}
-	switch verb {
-	case 's':
-		p.fmt.fmt_s(string(v))
-	case 'x':
-		p.fmt.fmt_bx(v, ldigits)
-	case 'X':
-		p.fmt.fmt_bx(v, udigits)
-	case 'q':
-		p.fmt.fmt_q(string(v))
-	default:
-		p.badVerb(verb)
-	}
-}
-
-func (p *pp) fmtPointer(value reflect.Value, verb rune) {
-	use0x64 := true
-	switch verb {
-	case 'p', 'v':
-		// ok
-	case 'b', 'd', 'o', 'x', 'X':
-		use0x64 = false
-		// ok
-	default:
-		p.badVerb(verb)
-		return
-	}
-
-	var u uintptr
-	switch value.Kind() {
-	case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer:
-		u = value.Pointer()
-	default:
-		p.badVerb(verb)
-		return
-	}
-
-	if p.fmt.sharpV {
-		p.add('(')
-		p.buf.WriteString(value.Type().String())
-		p.add(')')
-		p.add('(')
-		if u == 0 {
-			p.buf.Write(nilBytes)
-		} else {
-			p.fmt0x64(uint64(u), true)
-		}
-		p.add(')')
-	} else if verb == 'v' && u == 0 {
-		p.buf.Write(nilAngleBytes)
-	} else {
-		if use0x64 {
-			p.fmt0x64(uint64(u), !p.fmt.sharp)
-		} else {
-			p.fmtUint64(uint64(u), verb)
-		}
-	}
-}
-
-var (
-	intBits     = reflect.TypeOf(0).Bits()
-	uintptrBits = reflect.TypeOf(uintptr(0)).Bits()
-)
-
-func (p *pp) catchPanic(arg interface{}, verb rune) {
-	if err := recover(); err != nil {
-		// If it's a nil pointer, just say "<nil>". The likeliest causes are a
-		// Stringer that fails to guard against nil or a nil pointer for a
-		// value receiver, and in either case, "<nil>" is a nice result.
-		if v := reflect.ValueOf(arg); v.Kind() == reflect.Ptr && v.IsNil() {
-			p.buf.Write(nilAngleBytes)
-			return
-		}
-		// Otherwise print a concise panic message. Most of the time the panic
-		// value will print itself nicely.
-		if p.panicking {
-			// Nested panics; the recursion in printArg cannot succeed.
-			panic(err)
-		}
-		p.fmt.clearflags() // We are done, and for this output we want default behavior.
-		p.buf.Write(percentBangBytes)
-		p.add(verb)
-		p.buf.Write(panicBytes)
-		p.panicking = true
-		p.printArg(err, 'v', 0)
-		p.panicking = false
-		p.buf.WriteByte(')')
-	}
-}
-
-// clearSpecialFlags pushes %#v back into the regular flags and returns their old state.
-func (p *pp) clearSpecialFlags() (plusV, sharpV bool) {
-	plusV = p.fmt.plusV
-	if plusV {
-		p.fmt.plus = true
-		p.fmt.plusV = false
-	}
-	sharpV = p.fmt.sharpV
-	if sharpV {
-		p.fmt.sharp = true
-		p.fmt.sharpV = false
-	}
-	return
-}
-
-// restoreSpecialFlags, whose argument should be a call to clearSpecialFlags,
-// restores the setting of the plusV and sharpV flags.
-func (p *pp) restoreSpecialFlags(plusV, sharpV bool) {
-	if plusV {
-		p.fmt.plus = false
-		p.fmt.plusV = true
-	}
-	if sharpV {
-		p.fmt.sharp = false
-		p.fmt.sharpV = true
-	}
-}
-
-func (p *pp) handleMethods(verb rune, depth int) (handled bool) {
-	if p.erroring {
-		return
-	}
-	// Is it a Formatter?
-	if formatter, ok := p.arg.(Formatter); ok {
-		handled = true
-		defer p.restoreSpecialFlags(p.clearSpecialFlags())
-		defer p.catchPanic(p.arg, verb)
-		formatter.Format(p, verb)
-		return
-	}
-
-	// If we're doing Go syntax and the argument knows how to supply it, take care of it now.
-	if p.fmt.sharpV {
-		if stringer, ok := p.arg.(GoStringer); ok {
-			handled = true
-			defer p.catchPanic(p.arg, verb)
-			// Print the result of GoString unadorned.
-			p.fmt.fmt_s(stringer.GoString())
-			return
-		}
-	} else {
-		// If a string is acceptable according to the format, see if
-		// the value satisfies one of the string-valued interfaces.
-		// Println etc. set verb to %v, which is "stringable".
-		switch verb {
-		case 'v', 's', 'x', 'X', 'q':
-			// Is it an error or Stringer?
-			// The duplication in the bodies is necessary:
-			// setting handled and deferring catchPanic
-			// must happen before calling the method.
-			switch v := p.arg.(type) {
-			case error:
-				handled = true
-				defer p.catchPanic(p.arg, verb)
-				p.printArg(v.Error(), verb, depth)
-				return
-
-			case Stringer:
-				handled = true
-				defer p.catchPanic(p.arg, verb)
-				p.printArg(v.String(), verb, depth)
-				return
-			}
-		}
-	}
-	return false
-}
-
-func (p *pp) printArg(arg interface{}, verb rune, depth int) (wasString bool) {
-	p.arg = arg
-	p.value = reflect.Value{}
-
-	if arg == nil {
-		if verb == 'T' || verb == 'v' {
-			p.fmt.pad(nilAngleBytes)
-		} else {
-			p.badVerb(verb)
-		}
-		return false
-	}
-
-	// Special processing considerations.
-	// %T (the value's type) and %p (its address) are special; we always do them first.
-	switch verb {
-	case 'T':
-		p.printArg(reflect.TypeOf(arg).String(), 's', 0)
-		return false
-	case 'p':
-		p.fmtPointer(reflect.ValueOf(arg), verb)
-		return false
-	}
-
-	// Some types can be done without reflection.
-	switch f := arg.(type) {
-	case bool:
-		p.fmtBool(f, verb)
-	case float32:
-		p.fmtFloat32(f, verb)
-	case float64:
-		p.fmtFloat64(f, verb)
-	case complex64:
-		p.fmtComplex64(f, verb)
-	case complex128:
-		p.fmtComplex128(f, verb)
-	case int:
-		p.fmtInt64(int64(f), verb)
-	case int8:
-		p.fmtInt64(int64(f), verb)
-	case int16:
-		p.fmtInt64(int64(f), verb)
-	case int32:
-		p.fmtInt64(int64(f), verb)
-	case int64:
-		p.fmtInt64(f, verb)
-	case uint:
-		p.fmtUint64(uint64(f), verb)
-	case uint8:
-		p.fmtUint64(uint64(f), verb)
-	case uint16:
-		p.fmtUint64(uint64(f), verb)
-	case uint32:
-		p.fmtUint64(uint64(f), verb)
-	case uint64:
-		p.fmtUint64(f, verb)
-	case uintptr:
-		p.fmtUint64(uint64(f), verb)
-	case string:
-		p.fmtString(f, verb)
-		wasString = verb == 's' || verb == 'v'
-	case []byte:
-		p.fmtBytes(f, verb, nil, depth)
-		wasString = verb == 's'
-	case reflect.Value:
-		return p.printReflectValue(f, verb, depth)
-	default:
-		// If the type is not simple, it might have methods.
-		if handled := p.handleMethods(verb, depth); handled {
-			return false
-		}
-		// Need to use reflection
-		return p.printReflectValue(reflect.ValueOf(arg), verb, depth)
-	}
-	p.arg = nil
-	return
-}
-
-// printValue is like printArg but starts with a reflect value, not an interface{} value.
-func (p *pp) printValue(value reflect.Value, verb rune, depth int) (wasString bool) {
-	if !value.IsValid() {
-		if verb == 'T' || verb == 'v' {
-			p.buf.Write(nilAngleBytes)
-		} else {
-			p.badVerb(verb)
-		}
-		return false
-	}
-
-	// Special processing considerations.
-	// %T (the value's type) and %p (its address) are special; we always do them first.
-	switch verb {
-	case 'T':
-		p.printArg(value.Type().String(), 's', 0)
-		return false
-	case 'p':
-		p.fmtPointer(value, verb)
-		return false
-	}
-
-	// Handle values with special methods.
-	// Call always, even when arg == nil, because handleMethods clears p.fmt.plus for us.
-	p.arg = nil // Make sure it's cleared, for safety.
-	if value.CanInterface() {
-		p.arg = value.Interface()
-	}
-	if handled := p.handleMethods(verb, depth); handled {
-		return false
-	}
-
-	return p.printReflectValue(value, verb, depth)
-}
-
-var byteType = reflect.TypeOf(byte(0))
-
-// printReflectValue is the fallback for both printArg and printValue.
-// It uses reflect to print the value.
-func (p *pp) printReflectValue(value reflect.Value, verb rune, depth int) (wasString bool) {
-	oldValue := p.value
-	p.value = value
-BigSwitch:
-	switch f := value; f.Kind() {
-	case reflect.Invalid:
-		p.buf.WriteString("<invalid reflect.Value>")
-	case reflect.Bool:
-		p.fmtBool(f.Bool(), verb)
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		p.fmtInt64(f.Int(), verb)
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		p.fmtUint64(f.Uint(), verb)
-	case reflect.Float32, reflect.Float64:
-		if f.Type().Size() == 4 {
-			p.fmtFloat32(float32(f.Float()), verb)
-		} else {
-			p.fmtFloat64(f.Float(), verb)
-		}
-	case reflect.Complex64, reflect.Complex128:
-		if f.Type().Size() == 8 {
-			p.fmtComplex64(complex64(f.Complex()), verb)
-		} else {
-			p.fmtComplex128(f.Complex(), verb)
-		}
-	case reflect.String:
-		p.fmtString(f.String(), verb)
-	case reflect.Map:
-		if p.fmt.sharpV {
-			p.buf.WriteString(f.Type().String())
-			if f.IsNil() {
-				p.buf.WriteString("(nil)")
-				break
-			}
-			p.buf.WriteByte('{')
-		} else {
-			p.buf.Write(mapBytes)
-		}
-		keys := f.MapKeys()
-		for i, key := range keys {
-			if i > 0 {
-				if p.fmt.sharpV {
-					p.buf.Write(commaSpaceBytes)
-				} else {
-					p.buf.WriteByte(' ')
-				}
-			}
-			p.printValue(key, verb, depth+1)
-			p.buf.WriteByte(':')
-			p.printValue(f.MapIndex(key), verb, depth+1)
-		}
-		if p.fmt.sharpV {
-			p.buf.WriteByte('}')
-		} else {
-			p.buf.WriteByte(']')
-		}
-	case reflect.Struct:
-		if p.fmt.sharpV {
-			p.buf.WriteString(value.Type().String())
-		}
-		p.add('{')
-		v := f
-		t := v.Type()
-		for i := 0; i < v.NumField(); i++ {
-			if i > 0 {
-				if p.fmt.sharpV {
-					p.buf.Write(commaSpaceBytes)
-				} else {
-					p.buf.WriteByte(' ')
-				}
-			}
-			if p.fmt.plusV || p.fmt.sharpV {
-				if f := t.Field(i); f.Name != "" {
-					p.buf.WriteString(f.Name)
-					p.buf.WriteByte(':')
-				}
-			}
-			p.printValue(getField(v, i), verb, depth+1)
-		}
-		p.buf.WriteByte('}')
-	case reflect.Interface:
-		value := f.Elem()
-		if !value.IsValid() {
-			if p.fmt.sharpV {
-				p.buf.WriteString(f.Type().String())
-				p.buf.Write(nilParenBytes)
-			} else {
-				p.buf.Write(nilAngleBytes)
-			}
-		} else {
-			wasString = p.printValue(value, verb, depth+1)
-		}
-	case reflect.Array, reflect.Slice:
-		// Byte slices are special:
-		// - Handle []byte (== []uint8) with fmtBytes.
-		// - Handle []T, where T is a named byte type, with fmtBytes only
-		//   for the s, q, an x verbs. For other verbs, T might be a
-		//   Stringer, so we use printValue to print each element.
-		if typ := f.Type(); typ.Elem().Kind() == reflect.Uint8 && (typ.Elem() == byteType || verb == 's' || verb == 'q' || verb == 'x') {
-			var bytes []byte
-			if f.Kind() == reflect.Slice {
-				bytes = f.Bytes()
-			} else if f.CanAddr() {
-				bytes = f.Slice(0, f.Len()).Bytes()
-			} else {
-				// We have an array, but we cannot Slice() a non-addressable array,
-				// so we build a slice by hand. This is a rare case but it would be nice
-				// if reflection could help a little more.
-				bytes = make([]byte, f.Len())
-				for i := range bytes {
-					bytes[i] = byte(f.Index(i).Uint())
-				}
-			}
-			p.fmtBytes(bytes, verb, typ, depth)
-			wasString = verb == 's'
-			break
-		}
-		if p.fmt.sharpV {
-			p.buf.WriteString(value.Type().String())
-			if f.Kind() == reflect.Slice && f.IsNil() {
-				p.buf.WriteString("(nil)")
-				break
-			}
-			p.buf.WriteByte('{')
-		} else {
-			p.buf.WriteByte('[')
-		}
-		for i := 0; i < f.Len(); i++ {
-			if i > 0 {
-				if p.fmt.sharpV {
-					p.buf.Write(commaSpaceBytes)
-				} else {
-					p.buf.WriteByte(' ')
-				}
-			}
-			p.printValue(f.Index(i), verb, depth+1)
-		}
-		if p.fmt.sharpV {
-			p.buf.WriteByte('}')
-		} else {
-			p.buf.WriteByte(']')
-		}
-	case reflect.Ptr:
-		v := f.Pointer()
-		// pointer to array or slice or struct?  ok at top level
-		// but not embedded (avoid loops)
-		if v != 0 && depth == 0 {
-			switch a := f.Elem(); a.Kind() {
-			case reflect.Array, reflect.Slice:
-				p.buf.WriteByte('&')
-				p.printValue(a, verb, depth+1)
-				break BigSwitch
-			case reflect.Struct:
-				p.buf.WriteByte('&')
-				p.printValue(a, verb, depth+1)
-				break BigSwitch
-			case reflect.Map:
-				p.buf.WriteByte('&')
-				p.printValue(a, verb, depth+1)
-				break BigSwitch
-			}
-		}
-		fallthrough
-	case reflect.Chan, reflect.Func, reflect.UnsafePointer:
-		p.fmtPointer(value, verb)
-	default:
-		p.unknownType(f)
-	}
-	p.value = oldValue
-	return wasString
-}
-
-// intFromArg gets the argNumth element of a. On return, isInt reports whether the argument has type int.
-func intFromArg(a []interface{}, argNum int) (num int, isInt bool, newArgNum int) {
-	newArgNum = argNum
-	if argNum < len(a) {
-		num, isInt = a[argNum].(int)
-		newArgNum = argNum + 1
-		if tooLarge(num) {
-			num = 0
-			isInt = false
-		}
-	}
-	return
-}
-
-// parseArgNumber returns the value of the bracketed number, minus 1
-// (explicit argument numbers are one-indexed but we want zero-indexed).
-// The opening bracket is known to be present at format[0].
-// The returned values are the index, the number of bytes to consume
-// up to the closing paren, if present, and whether the number parsed
-// ok. The bytes to consume will be 1 if no closing paren is present.
-func parseArgNumber(format string) (index int, wid int, ok bool) {
-	// There must be at least 3 bytes: [n].
-	if len(format) < 3 {
-		return 0, 1, false
-	}
-
-	// Find closing bracket.
-	for i := 1; i < len(format); i++ {
-		if format[i] == ']' {
-			width, ok, newi := parsenum(format, 1, i)
-			if !ok || newi != i {
-				return 0, i + 1, false
-			}
-			return width - 1, i + 1, true // arg numbers are one-indexed and skip paren.
-		}
-	}
-	return 0, 1, false
-}
-
-// argNumber returns the next argument to evaluate, which is either the value of the passed-in
-// argNum or the value of the bracketed integer that begins format[i:]. It also returns
-// the new value of i, that is, the index of the next byte of the format to process.
-func (p *pp) argNumber(argNum int, format string, i int, numArgs int) (newArgNum, newi int, found bool) {
-	if len(format) <= i || format[i] != '[' {
-		return argNum, i, false
-	}
-	p.reordered = true
-	index, wid, ok := parseArgNumber(format[i:])
-	if ok && 0 <= index && index < numArgs {
-		return index, i + wid, true
-	}
-	p.goodArgNum = false
-	return argNum, i + wid, ok
-}
-
-func (p *pp) doPrintf(format string, a []interface{}) {
-	end := len(format)
-	argNum := 0         // we process one argument per non-trivial format
-	afterIndex := false // previous item in format was an index like [3].
-	p.reordered = false
-	for i := 0; i < end; {
-		p.goodArgNum = true
-		lasti := i
-		for i < end && format[i] != '%' {
-			i++
-		}
-		if i > lasti {
-			p.buf.WriteString(format[lasti:i])
-		}
-		if i >= end {
-			// done processing format string
-			break
-		}
-
-		// Process one verb
-		i++
-
-		// Do we have flags?
-		p.fmt.clearflags()
-	F:
-		for ; i < end; i++ {
-			switch format[i] {
-			case '#':
-				p.fmt.sharp = true
-			case '0':
-				p.fmt.zero = true
-			case '+':
-				p.fmt.plus = true
-			case '-':
-				p.fmt.minus = true
-			case ' ':
-				p.fmt.space = true
-			default:
-				break F
-			}
-		}
-
-		// Do we have an explicit argument index?
-		argNum, i, afterIndex = p.argNumber(argNum, format, i, len(a))
-
-		// Do we have width?
-		if i < end && format[i] == '*' {
-			i++
-			p.fmt.wid, p.fmt.widPresent, argNum = intFromArg(a, argNum)
-
-			if !p.fmt.widPresent {
-				p.buf.Write(badWidthBytes)
-			}
-
-			// We have a negative width, so take its value and ensure
-			// that the minus flag is set
-			if p.fmt.wid < 0 {
-				p.fmt.wid = -p.fmt.wid
-				p.fmt.minus = true
-			}
-			afterIndex = false
-		} else {
-			p.fmt.wid, p.fmt.widPresent, i = parsenum(format, i, end)
-			if afterIndex && p.fmt.widPresent { // "%[3]2d"
-				p.goodArgNum = false
-			}
-		}
-
-		// Do we have precision?
-		if i+1 < end && format[i] == '.' {
-			i++
-			if afterIndex { // "%[3].2d"
-				p.goodArgNum = false
-			}
-			argNum, i, afterIndex = p.argNumber(argNum, format, i, len(a))
-			if i < end && format[i] == '*' {
-				i++
-				p.fmt.prec, p.fmt.precPresent, argNum = intFromArg(a, argNum)
-				// Negative precision arguments don't make sense
-				if p.fmt.prec < 0 {
-					p.fmt.prec = 0
-					p.fmt.precPresent = false
-				}
-				if !p.fmt.precPresent {
-					p.buf.Write(badPrecBytes)
-				}
-				afterIndex = false
-			} else {
-				p.fmt.prec, p.fmt.precPresent, i = parsenum(format, i, end)
-				if !p.fmt.precPresent {
-					p.fmt.prec = 0
-					p.fmt.precPresent = true
-				}
-			}
-		}
-
-		if !afterIndex {
-			argNum, i, afterIndex = p.argNumber(argNum, format, i, len(a))
-		}
-
-		if i >= end {
-			p.buf.Write(noVerbBytes)
-			continue
-		}
-		c, w := utf8.DecodeRuneInString(format[i:])
-		i += w
-		// percent is special - absorbs no operand
-		if c == '%' {
-			p.buf.WriteByte('%') // We ignore width and prec.
-			continue
-		}
-		if !p.goodArgNum {
-			p.buf.Write(percentBangBytes)
-			p.add(c)
-			p.buf.Write(badIndexBytes)
-			continue
-		} else if argNum >= len(a) { // out of operands
-			p.buf.Write(percentBangBytes)
-			p.add(c)
-			p.buf.Write(missingBytes)
-			continue
-		}
-		arg := a[argNum]
-		argNum++
-
-		if c == 'v' {
-			if p.fmt.sharp {
-				// Go syntax. Set the flag in the fmt and clear the sharp flag.
-				p.fmt.sharp = false
-				p.fmt.sharpV = true
-			}
-			if p.fmt.plus {
-				// Struct-field syntax. Set the flag in the fmt and clear the plus flag.
-				p.fmt.plus = false
-				p.fmt.plusV = true
-			}
-		}
-		p.printArg(arg, c, 0)
-	}
-
-	// Check for extra arguments unless the call accessed the arguments
-	// out of order, in which case it's too expensive to detect if they've all
-	// been used and arguably OK if they're not.
-	if !p.reordered && argNum < len(a) {
-		p.buf.Write(extraBytes)
-		for ; argNum < len(a); argNum++ {
-			arg := a[argNum]
-			if arg != nil {
-				p.buf.WriteString(reflect.TypeOf(arg).String())
-				p.buf.WriteByte('=')
-			}
-			p.printArg(arg, 'v', 0)
-			if argNum+1 < len(a) {
-				p.buf.Write(commaSpaceBytes)
-			}
-		}
-		p.buf.WriteByte(')')
-	}
-}
-
-func (p *pp) doPrint(a []interface{}, addspace, addnewline bool) {
-	prevString := false
-	for argNum := 0; argNum < len(a); argNum++ {
-		p.fmt.clearflags()
-		// always add spaces if we're doing Println
-		arg := a[argNum]
-		if argNum > 0 {
-			isString := arg != nil && reflect.TypeOf(arg).Kind() == reflect.String
-			if addspace || !isString && !prevString {
-				p.buf.WriteByte(' ')
-			}
-		}
-		prevString = p.printArg(arg, 'v', 0)
-	}
-	if addnewline {
-		p.buf.WriteByte('\n')
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/fmt/race_test.go b/third_party/gofrontend/libgo/go/fmt/race_test.go
deleted file mode 100644
index ae3147a..0000000
--- a/third_party/gofrontend/libgo/go/fmt/race_test.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build race
-
-package fmt_test
-
-const raceenabled = true
diff --git a/third_party/gofrontend/libgo/go/fmt/scan.go b/third_party/gofrontend/libgo/go/fmt/scan.go
deleted file mode 100644
index e3e0fd0..0000000
--- a/third_party/gofrontend/libgo/go/fmt/scan.go
+++ /dev/null
@@ -1,1195 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package fmt
-
-import (
-	"errors"
-	"io"
-	"math"
-	"os"
-	"reflect"
-	"strconv"
-	"sync"
-	"unicode/utf8"
-)
-
-// runeUnreader is the interface to something that can unread runes.
-// If the object provided to Scan does not satisfy this interface,
-// a local buffer will be used to back up the input, but its contents
-// will be lost when Scan returns.
-type runeUnreader interface {
-	UnreadRune() error
-}
-
-// ScanState represents the scanner state passed to custom scanners.
-// Scanners may do rune-at-a-time scanning or ask the ScanState
-// to discover the next space-delimited token.
-type ScanState interface {
-	// ReadRune reads the next rune (Unicode code point) from the input.
-	// If invoked during Scanln, Fscanln, or Sscanln, ReadRune() will
-	// return EOF after returning the first '\n' or when reading beyond
-	// the specified width.
-	ReadRune() (r rune, size int, err error)
-	// UnreadRune causes the next call to ReadRune to return the same rune.
-	UnreadRune() error
-	// SkipSpace skips space in the input. Newlines are treated appropriately
-	// for the operation being performed; see the package documentation
-	// for more information.
-	SkipSpace()
-	// Token skips space in the input if skipSpace is true, then returns the
-	// run of Unicode code points c satisfying f(c).  If f is nil,
-	// !unicode.IsSpace(c) is used; that is, the token will hold non-space
-	// characters.  Newlines are treated appropriately for the operation being
-	// performed; see the package documentation for more information.
-	// The returned slice points to shared data that may be overwritten
-	// by the next call to Token, a call to a Scan function using the ScanState
-	// as input, or when the calling Scan method returns.
-	Token(skipSpace bool, f func(rune) bool) (token []byte, err error)
-	// Width returns the value of the width option and whether it has been set.
-	// The unit is Unicode code points.
-	Width() (wid int, ok bool)
-	// Because ReadRune is implemented by the interface, Read should never be
-	// called by the scanning routines and a valid implementation of
-	// ScanState may choose always to return an error from Read.
-	Read(buf []byte) (n int, err error)
-}
-
-// Scanner is implemented by any value that has a Scan method, which scans
-// the input for the representation of a value and stores the result in the
-// receiver, which must be a pointer to be useful.  The Scan method is called
-// for any argument to Scan, Scanf, or Scanln that implements it.
-type Scanner interface {
-	Scan(state ScanState, verb rune) error
-}
-
-// Scan scans text read from standard input, storing successive
-// space-separated values into successive arguments.  Newlines count
-// as space.  It returns the number of items successfully scanned.
-// If that is less than the number of arguments, err will report why.
-func Scan(a ...interface{}) (n int, err error) {
-	return Fscan(os.Stdin, a...)
-}
-
-// Scanln is similar to Scan, but stops scanning at a newline and
-// after the final item there must be a newline or EOF.
-func Scanln(a ...interface{}) (n int, err error) {
-	return Fscanln(os.Stdin, a...)
-}
-
-// Scanf scans text read from standard input, storing successive
-// space-separated values into successive arguments as determined by
-// the format.  It returns the number of items successfully scanned.
-// If that is less than the number of arguments, err will report why.
-// Newlines in the input must match newlines in the format.
-// The one exception: the verb %c always scans the next rune in the
-// input, even if it is a space (or tab etc.) or newline.
-func Scanf(format string, a ...interface{}) (n int, err error) {
-	return Fscanf(os.Stdin, format, a...)
-}
-
-type stringReader string
-
-func (r *stringReader) Read(b []byte) (n int, err error) {
-	n = copy(b, *r)
-	*r = (*r)[n:]
-	if n == 0 {
-		err = io.EOF
-	}
-	return
-}
-
-// Sscan scans the argument string, storing successive space-separated
-// values into successive arguments.  Newlines count as space.  It
-// returns the number of items successfully scanned.  If that is less
-// than the number of arguments, err will report why.
-func Sscan(str string, a ...interface{}) (n int, err error) {
-	return Fscan((*stringReader)(&str), a...)
-}
-
-// Sscanln is similar to Sscan, but stops scanning at a newline and
-// after the final item there must be a newline or EOF.
-func Sscanln(str string, a ...interface{}) (n int, err error) {
-	return Fscanln((*stringReader)(&str), a...)
-}
-
-// Sscanf scans the argument string, storing successive space-separated
-// values into successive arguments as determined by the format.  It
-// returns the number of items successfully parsed.
-// Newlines in the input must match newlines in the format.
-func Sscanf(str string, format string, a ...interface{}) (n int, err error) {
-	return Fscanf((*stringReader)(&str), format, a...)
-}
-
-// Fscan scans text read from r, storing successive space-separated
-// values into successive arguments.  Newlines count as space.  It
-// returns the number of items successfully scanned.  If that is less
-// than the number of arguments, err will report why.
-func Fscan(r io.Reader, a ...interface{}) (n int, err error) {
-	s, old := newScanState(r, true, false)
-	n, err = s.doScan(a)
-	s.free(old)
-	return
-}
-
-// Fscanln is similar to Fscan, but stops scanning at a newline and
-// after the final item there must be a newline or EOF.
-func Fscanln(r io.Reader, a ...interface{}) (n int, err error) {
-	s, old := newScanState(r, false, true)
-	n, err = s.doScan(a)
-	s.free(old)
-	return
-}
-
-// Fscanf scans text read from r, storing successive space-separated
-// values into successive arguments as determined by the format.  It
-// returns the number of items successfully parsed.
-// Newlines in the input must match newlines in the format.
-func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error) {
-	s, old := newScanState(r, false, false)
-	n, err = s.doScanf(format, a)
-	s.free(old)
-	return
-}
-
-// scanError represents an error generated by the scanning software.
-// It's used as a unique signature to identify such errors when recovering.
-type scanError struct {
-	err error
-}
-
-const eof = -1
-
-// ss is the internal implementation of ScanState.
-type ss struct {
-	rr       io.RuneReader // where to read input
-	buf      buffer        // token accumulator
-	peekRune rune          // one-rune lookahead
-	prevRune rune          // last rune returned by ReadRune
-	count    int           // runes consumed so far.
-	atEOF    bool          // already read EOF
-	ssave
-}
-
-// ssave holds the parts of ss that need to be
-// saved and restored on recursive scans.
-type ssave struct {
-	validSave bool // is or was a part of an actual ss.
-	nlIsEnd   bool // whether newline terminates scan
-	nlIsSpace bool // whether newline counts as white space
-	argLimit  int  // max value of ss.count for this arg; argLimit <= limit
-	limit     int  // max value of ss.count.
-	maxWid    int  // width of this arg.
-}
-
-// The Read method is only in ScanState so that ScanState
-// satisfies io.Reader. It will never be called when used as
-// intended, so there is no need to make it actually work.
-func (s *ss) Read(buf []byte) (n int, err error) {
-	return 0, errors.New("ScanState's Read should not be called. Use ReadRune")
-}
-
-func (s *ss) ReadRune() (r rune, size int, err error) {
-	if s.peekRune >= 0 {
-		s.count++
-		r = s.peekRune
-		size = utf8.RuneLen(r)
-		s.prevRune = r
-		s.peekRune = -1
-		return
-	}
-	if s.atEOF || s.nlIsEnd && s.prevRune == '\n' || s.count >= s.argLimit {
-		err = io.EOF
-		return
-	}
-
-	r, size, err = s.rr.ReadRune()
-	if err == nil {
-		s.count++
-		s.prevRune = r
-	} else if err == io.EOF {
-		s.atEOF = true
-	}
-	return
-}
-
-func (s *ss) Width() (wid int, ok bool) {
-	if s.maxWid == hugeWid {
-		return 0, false
-	}
-	return s.maxWid, true
-}
-
-// The public method returns an error; this private one panics.
-// If getRune reaches EOF, the return value is EOF (-1).
-func (s *ss) getRune() (r rune) {
-	r, _, err := s.ReadRune()
-	if err != nil {
-		if err == io.EOF {
-			return eof
-		}
-		s.error(err)
-	}
-	return
-}
-
-// mustReadRune turns io.EOF into a panic(io.ErrUnexpectedEOF).
-// It is called in cases such as string scanning where an EOF is a
-// syntax error.
-func (s *ss) mustReadRune() (r rune) {
-	r = s.getRune()
-	if r == eof {
-		s.error(io.ErrUnexpectedEOF)
-	}
-	return
-}
-
-func (s *ss) UnreadRune() error {
-	if u, ok := s.rr.(runeUnreader); ok {
-		u.UnreadRune()
-	} else {
-		s.peekRune = s.prevRune
-	}
-	s.prevRune = -1
-	s.count--
-	return nil
-}
-
-func (s *ss) error(err error) {
-	panic(scanError{err})
-}
-
-func (s *ss) errorString(err string) {
-	panic(scanError{errors.New(err)})
-}
-
-func (s *ss) Token(skipSpace bool, f func(rune) bool) (tok []byte, err error) {
-	defer func() {
-		if e := recover(); e != nil {
-			if se, ok := e.(scanError); ok {
-				err = se.err
-			} else {
-				panic(e)
-			}
-		}
-	}()
-	if f == nil {
-		f = notSpace
-	}
-	s.buf = s.buf[:0]
-	tok = s.token(skipSpace, f)
-	return
-}
-
-// space is a copy of the unicode.White_Space ranges,
-// to avoid depending on package unicode.
-var space = [][2]uint16{
-	{0x0009, 0x000d},
-	{0x0020, 0x0020},
-	{0x0085, 0x0085},
-	{0x00a0, 0x00a0},
-	{0x1680, 0x1680},
-	{0x2000, 0x200a},
-	{0x2028, 0x2029},
-	{0x202f, 0x202f},
-	{0x205f, 0x205f},
-	{0x3000, 0x3000},
-}
-
-func isSpace(r rune) bool {
-	if r >= 1<<16 {
-		return false
-	}
-	rx := uint16(r)
-	for _, rng := range space {
-		if rx < rng[0] {
-			return false
-		}
-		if rx <= rng[1] {
-			return true
-		}
-	}
-	return false
-}
-
-// notSpace is the default scanning function used in Token.
-func notSpace(r rune) bool {
-	return !isSpace(r)
-}
-
-// SkipSpace provides Scan methods the ability to skip space and newline
-// characters in keeping with the current scanning mode set by format strings
-// and Scan/Scanln.
-func (s *ss) SkipSpace() {
-	s.skipSpace(false)
-}
-
-// readRune is a structure to enable reading UTF-8 encoded code points
-// from an io.Reader.  It is used if the Reader given to the scanner does
-// not already implement io.RuneReader.
-type readRune struct {
-	reader  io.Reader
-	buf     [utf8.UTFMax]byte // used only inside ReadRune
-	pending int               // number of bytes in pendBuf; only >0 for bad UTF-8
-	pendBuf [utf8.UTFMax]byte // bytes left over
-}
-
-// readByte returns the next byte from the input, which may be
-// left over from a previous read if the UTF-8 was ill-formed.
-func (r *readRune) readByte() (b byte, err error) {
-	if r.pending > 0 {
-		b = r.pendBuf[0]
-		copy(r.pendBuf[0:], r.pendBuf[1:])
-		r.pending--
-		return
-	}
-	n, err := io.ReadFull(r.reader, r.pendBuf[0:1])
-	if n != 1 {
-		return 0, err
-	}
-	return r.pendBuf[0], err
-}
-
-// unread saves the bytes for the next read.
-func (r *readRune) unread(buf []byte) {
-	copy(r.pendBuf[r.pending:], buf)
-	r.pending += len(buf)
-}
-
-// ReadRune returns the next UTF-8 encoded code point from the
-// io.Reader inside r.
-func (r *readRune) ReadRune() (rr rune, size int, err error) {
-	r.buf[0], err = r.readByte()
-	if err != nil {
-		return 0, 0, err
-	}
-	if r.buf[0] < utf8.RuneSelf { // fast check for common ASCII case
-		rr = rune(r.buf[0])
-		size = 1 // Known to be 1.
-		return
-	}
-	var n int
-	for n = 1; !utf8.FullRune(r.buf[0:n]); n++ {
-		r.buf[n], err = r.readByte()
-		if err != nil {
-			if err == io.EOF {
-				err = nil
-				break
-			}
-			return
-		}
-	}
-	rr, size = utf8.DecodeRune(r.buf[0:n])
-	if size < n { // an error
-		r.unread(r.buf[size:n])
-	}
-	return
-}
-
-var ssFree = sync.Pool{
-	New: func() interface{} { return new(ss) },
-}
-
-// newScanState allocates a new ss struct or grab a cached one.
-func newScanState(r io.Reader, nlIsSpace, nlIsEnd bool) (s *ss, old ssave) {
-	s = ssFree.Get().(*ss)
-	if rr, ok := r.(io.RuneReader); ok {
-		s.rr = rr
-	} else {
-		s.rr = &readRune{reader: r}
-	}
-	s.nlIsSpace = nlIsSpace
-	s.nlIsEnd = nlIsEnd
-	s.prevRune = -1
-	s.peekRune = -1
-	s.atEOF = false
-	s.limit = hugeWid
-	s.argLimit = hugeWid
-	s.maxWid = hugeWid
-	s.validSave = true
-	s.count = 0
-	return
-}
-
-// free saves used ss structs in ssFree; avoid an allocation per invocation.
-func (s *ss) free(old ssave) {
-	// If it was used recursively, just restore the old state.
-	if old.validSave {
-		s.ssave = old
-		return
-	}
-	// Don't hold on to ss structs with large buffers.
-	if cap(s.buf) > 1024 {
-		return
-	}
-	s.buf = s.buf[:0]
-	s.rr = nil
-	ssFree.Put(s)
-}
-
-// skipSpace skips spaces and maybe newlines.
-func (s *ss) skipSpace(stopAtNewline bool) {
-	for {
-		r := s.getRune()
-		if r == eof {
-			return
-		}
-		if r == '\r' && s.peek("\n") {
-			continue
-		}
-		if r == '\n' {
-			if stopAtNewline {
-				break
-			}
-			if s.nlIsSpace {
-				continue
-			}
-			s.errorString("unexpected newline")
-			return
-		}
-		if !isSpace(r) {
-			s.UnreadRune()
-			break
-		}
-	}
-}
-
-// token returns the next space-delimited string from the input.  It
-// skips white space.  For Scanln, it stops at newlines.  For Scan,
-// newlines are treated as spaces.
-func (s *ss) token(skipSpace bool, f func(rune) bool) []byte {
-	if skipSpace {
-		s.skipSpace(false)
-	}
-	// read until white space or newline
-	for {
-		r := s.getRune()
-		if r == eof {
-			break
-		}
-		if !f(r) {
-			s.UnreadRune()
-			break
-		}
-		s.buf.WriteRune(r)
-	}
-	return s.buf
-}
-
-var complexError = errors.New("syntax error scanning complex number")
-var boolError = errors.New("syntax error scanning boolean")
-
-func indexRune(s string, r rune) int {
-	for i, c := range s {
-		if c == r {
-			return i
-		}
-	}
-	return -1
-}
-
-// consume reads the next rune in the input and reports whether it is in the ok string.
-// If accept is true, it puts the character into the input token.
-func (s *ss) consume(ok string, accept bool) bool {
-	r := s.getRune()
-	if r == eof {
-		return false
-	}
-	if indexRune(ok, r) >= 0 {
-		if accept {
-			s.buf.WriteRune(r)
-		}
-		return true
-	}
-	if r != eof && accept {
-		s.UnreadRune()
-	}
-	return false
-}
-
-// peek reports whether the next character is in the ok string, without consuming it.
-func (s *ss) peek(ok string) bool {
-	r := s.getRune()
-	if r != eof {
-		s.UnreadRune()
-	}
-	return indexRune(ok, r) >= 0
-}
-
-func (s *ss) notEOF() {
-	// Guarantee there is data to be read.
-	if r := s.getRune(); r == eof {
-		panic(io.EOF)
-	}
-	s.UnreadRune()
-}
-
-// accept checks the next rune in the input.  If it's a byte (sic) in the string, it puts it in the
-// buffer and returns true. Otherwise it return false.
-func (s *ss) accept(ok string) bool {
-	return s.consume(ok, true)
-}
-
-// okVerb verifies that the verb is present in the list, setting s.err appropriately if not.
-func (s *ss) okVerb(verb rune, okVerbs, typ string) bool {
-	for _, v := range okVerbs {
-		if v == verb {
-			return true
-		}
-	}
-	s.errorString("bad verb %" + string(verb) + " for " + typ)
-	return false
-}
-
-// scanBool returns the value of the boolean represented by the next token.
-func (s *ss) scanBool(verb rune) bool {
-	s.skipSpace(false)
-	s.notEOF()
-	if !s.okVerb(verb, "tv", "boolean") {
-		return false
-	}
-	// Syntax-checking a boolean is annoying.  We're not fastidious about case.
-	switch s.getRune() {
-	case '0':
-		return false
-	case '1':
-		return true
-	case 't', 'T':
-		if s.accept("rR") && (!s.accept("uU") || !s.accept("eE")) {
-			s.error(boolError)
-		}
-		return true
-	case 'f', 'F':
-		if s.accept("aA") && (!s.accept("lL") || !s.accept("sS") || !s.accept("eE")) {
-			s.error(boolError)
-		}
-		return false
-	}
-	return false
-}
-
-// Numerical elements
-const (
-	binaryDigits      = "01"
-	octalDigits       = "01234567"
-	decimalDigits     = "0123456789"
-	hexadecimalDigits = "0123456789aAbBcCdDeEfF"
-	sign              = "+-"
-	period            = "."
-	exponent          = "eEp"
-)
-
-// getBase returns the numeric base represented by the verb and its digit string.
-func (s *ss) getBase(verb rune) (base int, digits string) {
-	s.okVerb(verb, "bdoUxXv", "integer") // sets s.err
-	base = 10
-	digits = decimalDigits
-	switch verb {
-	case 'b':
-		base = 2
-		digits = binaryDigits
-	case 'o':
-		base = 8
-		digits = octalDigits
-	case 'x', 'X', 'U':
-		base = 16
-		digits = hexadecimalDigits
-	}
-	return
-}
-
-// scanNumber returns the numerical string with specified digits starting here.
-func (s *ss) scanNumber(digits string, haveDigits bool) string {
-	if !haveDigits {
-		s.notEOF()
-		if !s.accept(digits) {
-			s.errorString("expected integer")
-		}
-	}
-	for s.accept(digits) {
-	}
-	return string(s.buf)
-}
-
-// scanRune returns the next rune value in the input.
-func (s *ss) scanRune(bitSize int) int64 {
-	s.notEOF()
-	r := int64(s.getRune())
-	n := uint(bitSize)
-	x := (r << (64 - n)) >> (64 - n)
-	if x != r {
-		s.errorString("overflow on character value " + string(r))
-	}
-	return r
-}
-
-// scanBasePrefix reports whether the integer begins with a 0 or 0x,
-// and returns the base, digit string, and whether a zero was found.
-// It is called only if the verb is %v.
-func (s *ss) scanBasePrefix() (base int, digits string, found bool) {
-	if !s.peek("0") {
-		return 10, decimalDigits, false
-	}
-	s.accept("0")
-	found = true // We've put a digit into the token buffer.
-	// Special cases for '0' && '0x'
-	base, digits = 8, octalDigits
-	if s.peek("xX") {
-		s.consume("xX", false)
-		base, digits = 16, hexadecimalDigits
-	}
-	return
-}
-
-// scanInt returns the value of the integer represented by the next
-// token, checking for overflow.  Any error is stored in s.err.
-func (s *ss) scanInt(verb rune, bitSize int) int64 {
-	if verb == 'c' {
-		return s.scanRune(bitSize)
-	}
-	s.skipSpace(false)
-	s.notEOF()
-	base, digits := s.getBase(verb)
-	haveDigits := false
-	if verb == 'U' {
-		if !s.consume("U", false) || !s.consume("+", false) {
-			s.errorString("bad unicode format ")
-		}
-	} else {
-		s.accept(sign) // If there's a sign, it will be left in the token buffer.
-		if verb == 'v' {
-			base, digits, haveDigits = s.scanBasePrefix()
-		}
-	}
-	tok := s.scanNumber(digits, haveDigits)
-	i, err := strconv.ParseInt(tok, base, 64)
-	if err != nil {
-		s.error(err)
-	}
-	n := uint(bitSize)
-	x := (i << (64 - n)) >> (64 - n)
-	if x != i {
-		s.errorString("integer overflow on token " + tok)
-	}
-	return i
-}
-
-// scanUint returns the value of the unsigned integer represented
-// by the next token, checking for overflow.  Any error is stored in s.err.
-func (s *ss) scanUint(verb rune, bitSize int) uint64 {
-	if verb == 'c' {
-		return uint64(s.scanRune(bitSize))
-	}
-	s.skipSpace(false)
-	s.notEOF()
-	base, digits := s.getBase(verb)
-	haveDigits := false
-	if verb == 'U' {
-		if !s.consume("U", false) || !s.consume("+", false) {
-			s.errorString("bad unicode format ")
-		}
-	} else if verb == 'v' {
-		base, digits, haveDigits = s.scanBasePrefix()
-	}
-	tok := s.scanNumber(digits, haveDigits)
-	i, err := strconv.ParseUint(tok, base, 64)
-	if err != nil {
-		s.error(err)
-	}
-	n := uint(bitSize)
-	x := (i << (64 - n)) >> (64 - n)
-	if x != i {
-		s.errorString("unsigned integer overflow on token " + tok)
-	}
-	return i
-}
-
-// floatToken returns the floating-point number starting here, no longer than swid
-// if the width is specified. It's not rigorous about syntax because it doesn't check that
-// we have at least some digits, but Atof will do that.
-func (s *ss) floatToken() string {
-	s.buf = s.buf[:0]
-	// NaN?
-	if s.accept("nN") && s.accept("aA") && s.accept("nN") {
-		return string(s.buf)
-	}
-	// leading sign?
-	s.accept(sign)
-	// Inf?
-	if s.accept("iI") && s.accept("nN") && s.accept("fF") {
-		return string(s.buf)
-	}
-	// digits?
-	for s.accept(decimalDigits) {
-	}
-	// decimal point?
-	if s.accept(period) {
-		// fraction?
-		for s.accept(decimalDigits) {
-		}
-	}
-	// exponent?
-	if s.accept(exponent) {
-		// leading sign?
-		s.accept(sign)
-		// digits?
-		for s.accept(decimalDigits) {
-		}
-	}
-	return string(s.buf)
-}
-
-// complexTokens returns the real and imaginary parts of the complex number starting here.
-// The number might be parenthesized and has the format (N+Ni) where N is a floating-point
-// number and there are no spaces within.
-func (s *ss) complexTokens() (real, imag string) {
-	// TODO: accept N and Ni independently?
-	parens := s.accept("(")
-	real = s.floatToken()
-	s.buf = s.buf[:0]
-	// Must now have a sign.
-	if !s.accept("+-") {
-		s.error(complexError)
-	}
-	// Sign is now in buffer
-	imagSign := string(s.buf)
-	imag = s.floatToken()
-	if !s.accept("i") {
-		s.error(complexError)
-	}
-	if parens && !s.accept(")") {
-		s.error(complexError)
-	}
-	return real, imagSign + imag
-}
-
-// convertFloat converts the string to a float64value.
-func (s *ss) convertFloat(str string, n int) float64 {
-	if p := indexRune(str, 'p'); p >= 0 {
-		// Atof doesn't handle power-of-2 exponents,
-		// but they're easy to evaluate.
-		f, err := strconv.ParseFloat(str[:p], n)
-		if err != nil {
-			// Put full string into error.
-			if e, ok := err.(*strconv.NumError); ok {
-				e.Num = str
-			}
-			s.error(err)
-		}
-		m, err := strconv.Atoi(str[p+1:])
-		if err != nil {
-			// Put full string into error.
-			if e, ok := err.(*strconv.NumError); ok {
-				e.Num = str
-			}
-			s.error(err)
-		}
-		return math.Ldexp(f, m)
-	}
-	f, err := strconv.ParseFloat(str, n)
-	if err != nil {
-		s.error(err)
-	}
-	return f
-}
-
-// convertComplex converts the next token to a complex128 value.
-// The atof argument is a type-specific reader for the underlying type.
-// If we're reading complex64, atof will parse float32s and convert them
-// to float64's to avoid reproducing this code for each complex type.
-func (s *ss) scanComplex(verb rune, n int) complex128 {
-	if !s.okVerb(verb, floatVerbs, "complex") {
-		return 0
-	}
-	s.skipSpace(false)
-	s.notEOF()
-	sreal, simag := s.complexTokens()
-	real := s.convertFloat(sreal, n/2)
-	imag := s.convertFloat(simag, n/2)
-	return complex(real, imag)
-}
-
-// convertString returns the string represented by the next input characters.
-// The format of the input is determined by the verb.
-func (s *ss) convertString(verb rune) (str string) {
-	if !s.okVerb(verb, "svqx", "string") {
-		return ""
-	}
-	s.skipSpace(false)
-	s.notEOF()
-	switch verb {
-	case 'q':
-		str = s.quotedString()
-	case 'x':
-		str = s.hexString()
-	default:
-		str = string(s.token(true, notSpace)) // %s and %v just return the next word
-	}
-	return
-}
-
-// quotedString returns the double- or back-quoted string represented by the next input characters.
-func (s *ss) quotedString() string {
-	s.notEOF()
-	quote := s.getRune()
-	switch quote {
-	case '`':
-		// Back-quoted: Anything goes until EOF or back quote.
-		for {
-			r := s.mustReadRune()
-			if r == quote {
-				break
-			}
-			s.buf.WriteRune(r)
-		}
-		return string(s.buf)
-	case '"':
-		// Double-quoted: Include the quotes and let strconv.Unquote do the backslash escapes.
-		s.buf.WriteRune(quote)
-		for {
-			r := s.mustReadRune()
-			s.buf.WriteRune(r)
-			if r == '\\' {
-				// In a legal backslash escape, no matter how long, only the character
-				// immediately after the escape can itself be a backslash or quote.
-				// Thus we only need to protect the first character after the backslash.
-				s.buf.WriteRune(s.mustReadRune())
-			} else if r == '"' {
-				break
-			}
-		}
-		result, err := strconv.Unquote(string(s.buf))
-		if err != nil {
-			s.error(err)
-		}
-		return result
-	default:
-		s.errorString("expected quoted string")
-	}
-	return ""
-}
-
-// hexDigit returns the value of the hexadecimal digit.
-func hexDigit(d rune) (int, bool) {
-	digit := int(d)
-	switch digit {
-	case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
-		return digit - '0', true
-	case 'a', 'b', 'c', 'd', 'e', 'f':
-		return 10 + digit - 'a', true
-	case 'A', 'B', 'C', 'D', 'E', 'F':
-		return 10 + digit - 'A', true
-	}
-	return -1, false
-}
-
-// hexByte returns the next hex-encoded (two-character) byte from the input.
-// It returns ok==false if the next bytes in the input do not encode a hex byte.
-// If the first byte is hex and the second is not, processing stops.
-func (s *ss) hexByte() (b byte, ok bool) {
-	rune1 := s.getRune()
-	if rune1 == eof {
-		return
-	}
-	value1, ok := hexDigit(rune1)
-	if !ok {
-		s.UnreadRune()
-		return
-	}
-	value2, ok := hexDigit(s.mustReadRune())
-	if !ok {
-		s.errorString("illegal hex digit")
-		return
-	}
-	return byte(value1<<4 | value2), true
-}
-
-// hexString returns the space-delimited hexpair-encoded string.
-func (s *ss) hexString() string {
-	s.notEOF()
-	for {
-		b, ok := s.hexByte()
-		if !ok {
-			break
-		}
-		s.buf.WriteByte(b)
-	}
-	if len(s.buf) == 0 {
-		s.errorString("no hex data for %x string")
-		return ""
-	}
-	return string(s.buf)
-}
-
-const floatVerbs = "beEfFgGv"
-
-const hugeWid = 1 << 30
-
-// scanOne scans a single value, deriving the scanner from the type of the argument.
-func (s *ss) scanOne(verb rune, arg interface{}) {
-	s.buf = s.buf[:0]
-	var err error
-	// If the parameter has its own Scan method, use that.
-	if v, ok := arg.(Scanner); ok {
-		err = v.Scan(s, verb)
-		if err != nil {
-			if err == io.EOF {
-				err = io.ErrUnexpectedEOF
-			}
-			s.error(err)
-		}
-		return
-	}
-
-	switch v := arg.(type) {
-	case *bool:
-		*v = s.scanBool(verb)
-	case *complex64:
-		*v = complex64(s.scanComplex(verb, 64))
-	case *complex128:
-		*v = s.scanComplex(verb, 128)
-	case *int:
-		*v = int(s.scanInt(verb, intBits))
-	case *int8:
-		*v = int8(s.scanInt(verb, 8))
-	case *int16:
-		*v = int16(s.scanInt(verb, 16))
-	case *int32:
-		*v = int32(s.scanInt(verb, 32))
-	case *int64:
-		*v = s.scanInt(verb, 64)
-	case *uint:
-		*v = uint(s.scanUint(verb, intBits))
-	case *uint8:
-		*v = uint8(s.scanUint(verb, 8))
-	case *uint16:
-		*v = uint16(s.scanUint(verb, 16))
-	case *uint32:
-		*v = uint32(s.scanUint(verb, 32))
-	case *uint64:
-		*v = s.scanUint(verb, 64)
-	case *uintptr:
-		*v = uintptr(s.scanUint(verb, uintptrBits))
-	// Floats are tricky because you want to scan in the precision of the result, not
-	// scan in high precision and convert, in order to preserve the correct error condition.
-	case *float32:
-		if s.okVerb(verb, floatVerbs, "float32") {
-			s.skipSpace(false)
-			s.notEOF()
-			*v = float32(s.convertFloat(s.floatToken(), 32))
-		}
-	case *float64:
-		if s.okVerb(verb, floatVerbs, "float64") {
-			s.skipSpace(false)
-			s.notEOF()
-			*v = s.convertFloat(s.floatToken(), 64)
-		}
-	case *string:
-		*v = s.convertString(verb)
-	case *[]byte:
-		// We scan to string and convert so we get a copy of the data.
-		// If we scanned to bytes, the slice would point at the buffer.
-		*v = []byte(s.convertString(verb))
-	default:
-		val := reflect.ValueOf(v)
-		ptr := val
-		if ptr.Kind() != reflect.Ptr {
-			s.errorString("type not a pointer: " + val.Type().String())
-			return
-		}
-		switch v := ptr.Elem(); v.Kind() {
-		case reflect.Bool:
-			v.SetBool(s.scanBool(verb))
-		case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-			v.SetInt(s.scanInt(verb, v.Type().Bits()))
-		case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-			v.SetUint(s.scanUint(verb, v.Type().Bits()))
-		case reflect.String:
-			v.SetString(s.convertString(verb))
-		case reflect.Slice:
-			// For now, can only handle (renamed) []byte.
-			typ := v.Type()
-			if typ.Elem().Kind() != reflect.Uint8 {
-				s.errorString("can't scan type: " + val.Type().String())
-			}
-			str := s.convertString(verb)
-			v.Set(reflect.MakeSlice(typ, len(str), len(str)))
-			for i := 0; i < len(str); i++ {
-				v.Index(i).SetUint(uint64(str[i]))
-			}
-		case reflect.Float32, reflect.Float64:
-			s.skipSpace(false)
-			s.notEOF()
-			v.SetFloat(s.convertFloat(s.floatToken(), v.Type().Bits()))
-		case reflect.Complex64, reflect.Complex128:
-			v.SetComplex(s.scanComplex(verb, v.Type().Bits()))
-		default:
-			s.errorString("can't scan type: " + val.Type().String())
-		}
-	}
-}
-
-// errorHandler turns local panics into error returns.
-func errorHandler(errp *error) {
-	if e := recover(); e != nil {
-		if se, ok := e.(scanError); ok { // catch local error
-			*errp = se.err
-		} else if eof, ok := e.(error); ok && eof == io.EOF { // out of input
-			*errp = eof
-		} else {
-			panic(e)
-		}
-	}
-}
-
-// doScan does the real work for scanning without a format string.
-func (s *ss) doScan(a []interface{}) (numProcessed int, err error) {
-	defer errorHandler(&err)
-	for _, arg := range a {
-		s.scanOne('v', arg)
-		numProcessed++
-	}
-	// Check for newline (or EOF) if required (Scanln etc.).
-	if s.nlIsEnd {
-		for {
-			r := s.getRune()
-			if r == '\n' || r == eof {
-				break
-			}
-			if !isSpace(r) {
-				s.errorString("expected newline")
-				break
-			}
-		}
-	}
-	return
-}
-
-// advance determines whether the next characters in the input match
-// those of the format. It returns the number of bytes (sic) consumed
-// in the format. All runs of space characters in either input or
-// format behave as a single space. Newlines are special, though:
-// newlines in the format must match those in the input and vice versa.
-// This routine also handles the %% case. If the return value is zero,
-// either format starts with a % (with no following %) or the input
-// is empty. If it is negative, the input did not match the string.
-func (s *ss) advance(format string) (i int) {
-	for i < len(format) {
-		fmtc, w := utf8.DecodeRuneInString(format[i:])
-		if fmtc == '%' {
-			// %% acts like a real percent
-			nextc, _ := utf8.DecodeRuneInString(format[i+w:]) // will not match % if string is empty
-			if nextc != '%' {
-				return
-			}
-			i += w // skip the first %
-		}
-		sawSpace := false
-		wasNewline := false
-		// Skip spaces in format but absorb at most one newline.
-		for isSpace(fmtc) && i < len(format) {
-			if fmtc == '\n' {
-				if wasNewline { // Already saw one; stop here.
-					break
-				}
-				wasNewline = true
-			}
-			sawSpace = true
-			i += w
-			fmtc, w = utf8.DecodeRuneInString(format[i:])
-		}
-		if sawSpace {
-			// There was space in the format, so there should be space
-			// in the input.
-			inputc := s.getRune()
-			if inputc == eof {
-				return
-			}
-			if !isSpace(inputc) {
-				// Space in format but not in input.
-				s.errorString("expected space in input to match format")
-			}
-			// Skip spaces but stop at newline.
-			for inputc != '\n' && isSpace(inputc) {
-				inputc = s.getRune()
-			}
-			if inputc == '\n' {
-				if !wasNewline {
-					s.errorString("newline in input does not match format")
-				}
-				// We've reached a newline, stop now; don't read further.
-				return
-			}
-			s.UnreadRune()
-			if wasNewline {
-				s.errorString("newline in format does not match input")
-			}
-			continue
-		}
-		inputc := s.mustReadRune()
-		if fmtc != inputc {
-			s.UnreadRune()
-			return -1
-		}
-		i += w
-	}
-	return
-}
-
-// doScanf does the real work when scanning with a format string.
-//  At the moment, it handles only pointers to basic types.
-func (s *ss) doScanf(format string, a []interface{}) (numProcessed int, err error) {
-	defer errorHandler(&err)
-	end := len(format) - 1
-	// We process one item per non-trivial format
-	for i := 0; i <= end; {
-		w := s.advance(format[i:])
-		if w > 0 {
-			i += w
-			continue
-		}
-		// Either we failed to advance, we have a percent character, or we ran out of input.
-		if format[i] != '%' {
-			// Can't advance format.  Why not?
-			if w < 0 {
-				s.errorString("input does not match format")
-			}
-			// Otherwise at EOF; "too many operands" error handled below
-			break
-		}
-		i++ // % is one byte
-
-		// do we have 20 (width)?
-		var widPresent bool
-		s.maxWid, widPresent, i = parsenum(format, i, end)
-		if !widPresent {
-			s.maxWid = hugeWid
-		}
-
-		c, w := utf8.DecodeRuneInString(format[i:])
-		i += w
-
-		if c != 'c' {
-			s.SkipSpace()
-		}
-		s.argLimit = s.limit
-		if f := s.count + s.maxWid; f < s.argLimit {
-			s.argLimit = f
-		}
-
-		if numProcessed >= len(a) { // out of operands
-			s.errorString("too few operands for format %" + format[i-w:])
-			break
-		}
-		arg := a[numProcessed]
-
-		s.scanOne(c, arg)
-		numProcessed++
-		s.argLimit = s.limit
-	}
-	if numProcessed < len(a) {
-		s.errorString("too many operands")
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/fmt/scan_test.go b/third_party/gofrontend/libgo/go/fmt/scan_test.go
deleted file mode 100644
index 334c4a6..0000000
--- a/third_party/gofrontend/libgo/go/fmt/scan_test.go
+++ /dev/null
@@ -1,1161 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package fmt_test
-
-import (
-	"bufio"
-	"bytes"
-	"errors"
-	. "fmt"
-	"io"
-	"math"
-	"reflect"
-	"regexp"
-	"strings"
-	"testing"
-	"unicode/utf8"
-)
-
-type ScanTest struct {
-	text string
-	in   interface{}
-	out  interface{}
-}
-
-type ScanfTest struct {
-	format string
-	text   string
-	in     interface{}
-	out    interface{}
-}
-
-type ScanfMultiTest struct {
-	format string
-	text   string
-	in     []interface{}
-	out    []interface{}
-	err    string
-}
-
-var (
-	boolVal              bool
-	intVal               int
-	int8Val              int8
-	int16Val             int16
-	int32Val             int32
-	int64Val             int64
-	uintVal              uint
-	uint8Val             uint8
-	uint16Val            uint16
-	uint32Val            uint32
-	uint64Val            uint64
-	float32Val           float32
-	float64Val           float64
-	stringVal            string
-	bytesVal             []byte
-	runeVal              rune
-	complex64Val         complex64
-	complex128Val        complex128
-	renamedBoolVal       renamedBool
-	renamedIntVal        renamedInt
-	renamedInt8Val       renamedInt8
-	renamedInt16Val      renamedInt16
-	renamedInt32Val      renamedInt32
-	renamedInt64Val      renamedInt64
-	renamedUintVal       renamedUint
-	renamedUint8Val      renamedUint8
-	renamedUint16Val     renamedUint16
-	renamedUint32Val     renamedUint32
-	renamedUint64Val     renamedUint64
-	renamedUintptrVal    renamedUintptr
-	renamedStringVal     renamedString
-	renamedBytesVal      renamedBytes
-	renamedFloat32Val    renamedFloat32
-	renamedFloat64Val    renamedFloat64
-	renamedComplex64Val  renamedComplex64
-	renamedComplex128Val renamedComplex128
-)
-
-type FloatTest struct {
-	text string
-	in   float64
-	out  float64
-}
-
-// Xs accepts any non-empty run of the verb character
-type Xs string
-
-func (x *Xs) Scan(state ScanState, verb rune) error {
-	tok, err := state.Token(true, func(r rune) bool { return r == verb })
-	if err != nil {
-		return err
-	}
-	s := string(tok)
-	if !regexp.MustCompile("^" + string(verb) + "+$").MatchString(s) {
-		return errors.New("syntax error for xs")
-	}
-	*x = Xs(s)
-	return nil
-}
-
-var xVal Xs
-
-// IntString accepts an integer followed immediately by a string.
-// It tests the embedding of a scan within a scan.
-type IntString struct {
-	i int
-	s string
-}
-
-func (s *IntString) Scan(state ScanState, verb rune) error {
-	if _, err := Fscan(state, &s.i); err != nil {
-		return err
-	}
-
-	tok, err := state.Token(true, nil)
-	if err != nil {
-		return err
-	}
-	s.s = string(tok)
-	return nil
-}
-
-var intStringVal IntString
-
-// myStringReader implements Read but not ReadRune, allowing us to test our readRune wrapper
-// type that creates something that can read runes given only Read().
-type myStringReader struct {
-	r *strings.Reader
-}
-
-func (s *myStringReader) Read(p []byte) (n int, err error) {
-	return s.r.Read(p)
-}
-
-func newReader(s string) *myStringReader {
-	return &myStringReader{strings.NewReader(s)}
-}
-
-var scanTests = []ScanTest{
-	// Basic types
-	{"T\n", &boolVal, true},  // boolean test vals toggle to be sure they are written
-	{"F\n", &boolVal, false}, // restored to zero value
-	{"21\n", &intVal, 21},
-	{"0\n", &intVal, 0},
-	{"000\n", &intVal, 0},
-	{"0x10\n", &intVal, 0x10},
-	{"-0x10\n", &intVal, -0x10},
-	{"0377\n", &intVal, 0377},
-	{"-0377\n", &intVal, -0377},
-	{"0\n", &uintVal, uint(0)},
-	{"000\n", &uintVal, uint(0)},
-	{"0x10\n", &uintVal, uint(0x10)},
-	{"0377\n", &uintVal, uint(0377)},
-	{"22\n", &int8Val, int8(22)},
-	{"23\n", &int16Val, int16(23)},
-	{"24\n", &int32Val, int32(24)},
-	{"25\n", &int64Val, int64(25)},
-	{"127\n", &int8Val, int8(127)},
-	{"-21\n", &intVal, -21},
-	{"-22\n", &int8Val, int8(-22)},
-	{"-23\n", &int16Val, int16(-23)},
-	{"-24\n", &int32Val, int32(-24)},
-	{"-25\n", &int64Val, int64(-25)},
-	{"-128\n", &int8Val, int8(-128)},
-	{"+21\n", &intVal, +21},
-	{"+22\n", &int8Val, int8(+22)},
-	{"+23\n", &int16Val, int16(+23)},
-	{"+24\n", &int32Val, int32(+24)},
-	{"+25\n", &int64Val, int64(+25)},
-	{"+127\n", &int8Val, int8(+127)},
-	{"26\n", &uintVal, uint(26)},
-	{"27\n", &uint8Val, uint8(27)},
-	{"28\n", &uint16Val, uint16(28)},
-	{"29\n", &uint32Val, uint32(29)},
-	{"30\n", &uint64Val, uint64(30)},
-	{"255\n", &uint8Val, uint8(255)},
-	{"32767\n", &int16Val, int16(32767)},
-	{"2.3\n", &float64Val, 2.3},
-	{"2.3e1\n", &float32Val, float32(2.3e1)},
-	{"2.3e2\n", &float64Val, 2.3e2},
-	{"2.3p2\n", &float64Val, 2.3 * 4},
-	{"2.3p+2\n", &float64Val, 2.3 * 4},
-	{"2.3p+66\n", &float64Val, 2.3 * (1 << 32) * (1 << 32) * 4},
-	{"2.3p-66\n", &float64Val, 2.3 / ((1 << 32) * (1 << 32) * 4)},
-	{"2.35\n", &stringVal, "2.35"},
-	{"2345678\n", &bytesVal, []byte("2345678")},
-	{"(3.4e1-2i)\n", &complex128Val, 3.4e1 - 2i},
-	{"-3.45e1-3i\n", &complex64Val, complex64(-3.45e1 - 3i)},
-	{"-.45e1-1e2i\n", &complex128Val, complex128(-.45e1 - 100i)},
-	{"hello\n", &stringVal, "hello"},
-
-	// Carriage-return followed by newline. (We treat \r\n as \n always.)
-	{"hello\r\n", &stringVal, "hello"},
-	{"27\r\n", &uint8Val, uint8(27)},
-
-	// Renamed types
-	{"true\n", &renamedBoolVal, renamedBool(true)},
-	{"F\n", &renamedBoolVal, renamedBool(false)},
-	{"101\n", &renamedIntVal, renamedInt(101)},
-	{"102\n", &renamedIntVal, renamedInt(102)},
-	{"103\n", &renamedUintVal, renamedUint(103)},
-	{"104\n", &renamedUintVal, renamedUint(104)},
-	{"105\n", &renamedInt8Val, renamedInt8(105)},
-	{"106\n", &renamedInt16Val, renamedInt16(106)},
-	{"107\n", &renamedInt32Val, renamedInt32(107)},
-	{"108\n", &renamedInt64Val, renamedInt64(108)},
-	{"109\n", &renamedUint8Val, renamedUint8(109)},
-	{"110\n", &renamedUint16Val, renamedUint16(110)},
-	{"111\n", &renamedUint32Val, renamedUint32(111)},
-	{"112\n", &renamedUint64Val, renamedUint64(112)},
-	{"113\n", &renamedUintptrVal, renamedUintptr(113)},
-	{"114\n", &renamedStringVal, renamedString("114")},
-	{"115\n", &renamedBytesVal, renamedBytes([]byte("115"))},
-
-	// Custom scanners.
-	{"  vvv ", &xVal, Xs("vvv")},
-	{" 1234hello", &intStringVal, IntString{1234, "hello"}},
-
-	// Fixed bugs
-	{"2147483648\n", &int64Val, int64(2147483648)}, // was: integer overflow
-}
-
-var scanfTests = []ScanfTest{
-	{"%v", "TRUE\n", &boolVal, true},
-	{"%t", "false\n", &boolVal, false},
-	{"%v", "-71\n", &intVal, -71},
-	{"%v", "0377\n", &intVal, 0377},
-	{"%v", "0x44\n", &intVal, 0x44},
-	{"%d", "72\n", &intVal, 72},
-	{"%c", "a\n", &runeVal, 'a'},
-	{"%c", "\u5072\n", &runeVal, '\u5072'},
-	{"%c", "\u1234\n", &runeVal, '\u1234'},
-	{"%d", "73\n", &int8Val, int8(73)},
-	{"%d", "+74\n", &int16Val, int16(74)},
-	{"%d", "75\n", &int32Val, int32(75)},
-	{"%d", "76\n", &int64Val, int64(76)},
-	{"%b", "1001001\n", &intVal, 73},
-	{"%o", "075\n", &intVal, 075},
-	{"%x", "a75\n", &intVal, 0xa75},
-	{"%v", "71\n", &uintVal, uint(71)},
-	{"%d", "72\n", &uintVal, uint(72)},
-	{"%d", "73\n", &uint8Val, uint8(73)},
-	{"%d", "74\n", &uint16Val, uint16(74)},
-	{"%d", "75\n", &uint32Val, uint32(75)},
-	{"%d", "76\n", &uint64Val, uint64(76)},
-	{"%b", "1001001\n", &uintVal, uint(73)},
-	{"%o", "075\n", &uintVal, uint(075)},
-	{"%x", "a75\n", &uintVal, uint(0xa75)},
-	{"%x", "A75\n", &uintVal, uint(0xa75)},
-	{"%U", "U+1234\n", &intVal, int(0x1234)},
-	{"%U", "U+4567\n", &uintVal, uint(0x4567)},
-
-	// Strings
-	{"%s", "using-%s\n", &stringVal, "using-%s"},
-	{"%x", "7573696e672d2578\n", &stringVal, "using-%x"},
-	{"%q", `"quoted\twith\\do\u0075bl\x65s"` + "\n", &stringVal, "quoted\twith\\doubles"},
-	{"%q", "`quoted with backs`\n", &stringVal, "quoted with backs"},
-
-	// Byte slices
-	{"%s", "bytes-%s\n", &bytesVal, []byte("bytes-%s")},
-	{"%x", "62797465732d2578\n", &bytesVal, []byte("bytes-%x")},
-	{"%q", `"bytes\rwith\vdo\u0075bl\x65s"` + "\n", &bytesVal, []byte("bytes\rwith\vdoubles")},
-	{"%q", "`bytes with backs`\n", &bytesVal, []byte("bytes with backs")},
-
-	// Renamed types
-	{"%v\n", "true\n", &renamedBoolVal, renamedBool(true)},
-	{"%t\n", "F\n", &renamedBoolVal, renamedBool(false)},
-	{"%v", "101\n", &renamedIntVal, renamedInt(101)},
-	{"%c", "\u0101\n", &renamedIntVal, renamedInt('\u0101')},
-	{"%o", "0146\n", &renamedIntVal, renamedInt(102)},
-	{"%v", "103\n", &renamedUintVal, renamedUint(103)},
-	{"%d", "104\n", &renamedUintVal, renamedUint(104)},
-	{"%d", "105\n", &renamedInt8Val, renamedInt8(105)},
-	{"%d", "106\n", &renamedInt16Val, renamedInt16(106)},
-	{"%d", "107\n", &renamedInt32Val, renamedInt32(107)},
-	{"%d", "108\n", &renamedInt64Val, renamedInt64(108)},
-	{"%x", "6D\n", &renamedUint8Val, renamedUint8(109)},
-	{"%o", "0156\n", &renamedUint16Val, renamedUint16(110)},
-	{"%d", "111\n", &renamedUint32Val, renamedUint32(111)},
-	{"%d", "112\n", &renamedUint64Val, renamedUint64(112)},
-	{"%d", "113\n", &renamedUintptrVal, renamedUintptr(113)},
-	{"%s", "114\n", &renamedStringVal, renamedString("114")},
-	{"%q", "\"1155\"\n", &renamedBytesVal, renamedBytes([]byte("1155"))},
-	{"%g", "116e1\n", &renamedFloat32Val, renamedFloat32(116e1)},
-	{"%g", "-11.7e+1", &renamedFloat64Val, renamedFloat64(-11.7e+1)},
-	{"%g", "11+6e1i\n", &renamedComplex64Val, renamedComplex64(11 + 6e1i)},
-	{"%g", "-11.+7e+1i", &renamedComplex128Val, renamedComplex128(-11. + 7e+1i)},
-
-	// Interesting formats
-	{"here is\tthe value:%d", "here is   the\tvalue:118\n", &intVal, 118},
-	{"%% %%:%d", "% %:119\n", &intVal, 119},
-
-	// Corner cases
-	{"%x", "FFFFFFFF\n", &uint32Val, uint32(0xFFFFFFFF)},
-
-	// Custom scanner.
-	{"%s", "  sss ", &xVal, Xs("sss")},
-	{"%2s", "sssss", &xVal, Xs("ss")},
-
-	// Fixed bugs
-	{"%d\n", "27\n", &intVal, 27},      // ok
-	{"%d\n", "28 \n", &intVal, 28},     // was: "unexpected newline"
-	{"%v", "0", &intVal, 0},            // was: "EOF"; 0 was taken as base prefix and not counted.
-	{"%v", "0", &uintVal, uint(0)},     // was: "EOF"; 0 was taken as base prefix and not counted.
-	{"%c", " ", &uintVal, uint(' ')},   // %c must accept a blank.
-	{"%c", "\t", &uintVal, uint('\t')}, // %c must accept any space.
-	{"%c", "\n", &uintVal, uint('\n')}, // %c must accept any space.
-}
-
-var overflowTests = []ScanTest{
-	{"128", &int8Val, 0},
-	{"32768", &int16Val, 0},
-	{"-129", &int8Val, 0},
-	{"-32769", &int16Val, 0},
-	{"256", &uint8Val, 0},
-	{"65536", &uint16Val, 0},
-	{"1e100", &float32Val, 0},
-	{"1e500", &float64Val, 0},
-	{"(1e100+0i)", &complex64Val, 0},
-	{"(1+1e100i)", &complex64Val, 0},
-	{"(1-1e500i)", &complex128Val, 0},
-}
-
-var truth bool
-var i, j, k int
-var f float64
-var s, t string
-var c complex128
-var x, y Xs
-var z IntString
-var r1, r2, r3 rune
-
-var multiTests = []ScanfMultiTest{
-	{"", "", []interface{}{}, []interface{}{}, ""},
-	{"%d", "23", args(&i), args(23), ""},
-	{"%2s%3s", "22333", args(&s, &t), args("22", "333"), ""},
-	{"%2d%3d", "44555", args(&i, &j), args(44, 555), ""},
-	{"%2d.%3d", "66.777", args(&i, &j), args(66, 777), ""},
-	{"%d, %d", "23, 18", args(&i, &j), args(23, 18), ""},
-	{"%3d22%3d", "33322333", args(&i, &j), args(333, 333), ""},
-	{"%6vX=%3fY", "3+2iX=2.5Y", args(&c, &f), args((3 + 2i), 2.5), ""},
-	{"%d%s", "123abc", args(&i, &s), args(123, "abc"), ""},
-	{"%c%c%c", "2\u50c2X", args(&r1, &r2, &r3), args('2', '\u50c2', 'X'), ""},
-	{"%5s%d", " 1234567 ", args(&s, &i), args("12345", 67), ""},
-	{"%5s%d", " 12 34 567 ", args(&s, &i), args("12", 34), ""},
-
-	// Custom scanners.
-	{"%e%f", "eefffff", args(&x, &y), args(Xs("ee"), Xs("fffff")), ""},
-	{"%4v%s", "12abcd", args(&z, &s), args(IntString{12, "ab"}, "cd"), ""},
-
-	// Errors
-	{"%t", "23 18", args(&i), nil, "bad verb"},
-	{"%d %d %d", "23 18", args(&i, &j), args(23, 18), "too few operands"},
-	{"%d %d", "23 18 27", args(&i, &j, &k), args(23, 18), "too many operands"},
-	{"%c", "\u0100", args(&int8Val), nil, "overflow"},
-	{"X%d", "10X", args(&intVal), nil, "input does not match format"},
-
-	// Bad UTF-8: should see every byte.
-	{"%c%c%c", "\xc2X\xc2", args(&r1, &r2, &r3), args(utf8.RuneError, 'X', utf8.RuneError), ""},
-
-	// Fixed bugs
-	{"%v%v", "FALSE23", args(&truth, &i), args(false, 23), ""},
-}
-
-func testScan(name string, t *testing.T, scan func(r io.Reader, a ...interface{}) (int, error)) {
-	for _, test := range scanTests {
-		var r io.Reader
-		if name == "StringReader" {
-			r = strings.NewReader(test.text)
-		} else {
-			r = newReader(test.text)
-		}
-		n, err := scan(r, test.in)
-		if err != nil {
-			m := ""
-			if n > 0 {
-				m = Sprintf(" (%d fields ok)", n)
-			}
-			t.Errorf("%s got error scanning %q: %s%s", name, test.text, err, m)
-			continue
-		}
-		if n != 1 {
-			t.Errorf("%s count error on entry %q: got %d", name, test.text, n)
-			continue
-		}
-		// The incoming value may be a pointer
-		v := reflect.ValueOf(test.in)
-		if p := v; p.Kind() == reflect.Ptr {
-			v = p.Elem()
-		}
-		val := v.Interface()
-		if !reflect.DeepEqual(val, test.out) {
-			t.Errorf("%s scanning %q: expected %#v got %#v, type %T", name, test.text, test.out, val, val)
-		}
-	}
-}
-
-func TestScan(t *testing.T) {
-	testScan("StringReader", t, Fscan)
-}
-
-func TestMyReaderScan(t *testing.T) {
-	testScan("myStringReader", t, Fscan)
-}
-
-func TestScanln(t *testing.T) {
-	testScan("StringReader", t, Fscanln)
-}
-
-func TestMyReaderScanln(t *testing.T) {
-	testScan("myStringReader", t, Fscanln)
-}
-
-func TestScanf(t *testing.T) {
-	for _, test := range scanfTests {
-		n, err := Sscanf(test.text, test.format, test.in)
-		if err != nil {
-			t.Errorf("got error scanning (%q, %q): %s", test.format, test.text, err)
-			continue
-		}
-		if n != 1 {
-			t.Errorf("count error on entry (%q, %q): got %d", test.format, test.text, n)
-			continue
-		}
-		// The incoming value may be a pointer
-		v := reflect.ValueOf(test.in)
-		if p := v; p.Kind() == reflect.Ptr {
-			v = p.Elem()
-		}
-		val := v.Interface()
-		if !reflect.DeepEqual(val, test.out) {
-			t.Errorf("scanning (%q, %q): expected %#v got %#v, type %T", test.format, test.text, test.out, val, val)
-		}
-	}
-}
-
-func TestScanOverflow(t *testing.T) {
-	// different machines and different types report errors with different strings.
-	re := regexp.MustCompile("overflow|too large|out of range|not representable")
-	for _, test := range overflowTests {
-		_, err := Sscan(test.text, test.in)
-		if err == nil {
-			t.Errorf("expected overflow scanning %q", test.text)
-			continue
-		}
-		if !re.MatchString(err.Error()) {
-			t.Errorf("expected overflow error scanning %q: %s", test.text, err)
-		}
-	}
-}
-
-func verifyNaN(str string, t *testing.T) {
-	var f float64
-	var f32 float32
-	var f64 float64
-	text := str + " " + str + " " + str
-	n, err := Fscan(strings.NewReader(text), &f, &f32, &f64)
-	if err != nil {
-		t.Errorf("got error scanning %q: %s", text, err)
-	}
-	if n != 3 {
-		t.Errorf("count error scanning %q: got %d", text, n)
-	}
-	if !math.IsNaN(float64(f)) || !math.IsNaN(float64(f32)) || !math.IsNaN(f64) {
-		t.Errorf("didn't get NaNs scanning %q: got %g %g %g", text, f, f32, f64)
-	}
-}
-
-func TestNaN(t *testing.T) {
-	for _, s := range []string{"nan", "NAN", "NaN"} {
-		verifyNaN(s, t)
-	}
-}
-
-func verifyInf(str string, t *testing.T) {
-	var f float64
-	var f32 float32
-	var f64 float64
-	text := str + " " + str + " " + str
-	n, err := Fscan(strings.NewReader(text), &f, &f32, &f64)
-	if err != nil {
-		t.Errorf("got error scanning %q: %s", text, err)
-	}
-	if n != 3 {
-		t.Errorf("count error scanning %q: got %d", text, n)
-	}
-	sign := 1
-	if str[0] == '-' {
-		sign = -1
-	}
-	if !math.IsInf(float64(f), sign) || !math.IsInf(float64(f32), sign) || !math.IsInf(f64, sign) {
-		t.Errorf("didn't get right Infs scanning %q: got %g %g %g", text, f, f32, f64)
-	}
-}
-
-func TestInf(t *testing.T) {
-	for _, s := range []string{"inf", "+inf", "-inf", "INF", "-INF", "+INF", "Inf", "-Inf", "+Inf"} {
-		verifyInf(s, t)
-	}
-}
-
-func testScanfMulti(name string, t *testing.T) {
-	sliceType := reflect.TypeOf(make([]interface{}, 1))
-	for _, test := range multiTests {
-		var r io.Reader
-		if name == "StringReader" {
-			r = strings.NewReader(test.text)
-		} else {
-			r = newReader(test.text)
-		}
-		n, err := Fscanf(r, test.format, test.in...)
-		if err != nil {
-			if test.err == "" {
-				t.Errorf("got error scanning (%q, %q): %q", test.format, test.text, err)
-			} else if strings.Index(err.Error(), test.err) < 0 {
-				t.Errorf("got wrong error scanning (%q, %q): %q; expected %q", test.format, test.text, err, test.err)
-			}
-			continue
-		}
-		if test.err != "" {
-			t.Errorf("expected error %q error scanning (%q, %q)", test.err, test.format, test.text)
-		}
-		if n != len(test.out) {
-			t.Errorf("count error on entry (%q, %q): expected %d got %d", test.format, test.text, len(test.out), n)
-			continue
-		}
-		// Convert the slice of pointers into a slice of values
-		resultVal := reflect.MakeSlice(sliceType, n, n)
-		for i := 0; i < n; i++ {
-			v := reflect.ValueOf(test.in[i]).Elem()
-			resultVal.Index(i).Set(v)
-		}
-		result := resultVal.Interface()
-		if !reflect.DeepEqual(result, test.out) {
-			t.Errorf("scanning (%q, %q): expected %#v got %#v", test.format, test.text, test.out, result)
-		}
-	}
-}
-
-func TestScanfMulti(t *testing.T) {
-	testScanfMulti("StringReader", t)
-}
-
-func TestMyReaderScanfMulti(t *testing.T) {
-	testScanfMulti("myStringReader", t)
-}
-
-func TestScanMultiple(t *testing.T) {
-	var a int
-	var s string
-	n, err := Sscan("123abc", &a, &s)
-	if n != 2 {
-		t.Errorf("Sscan count error: expected 2: got %d", n)
-	}
-	if err != nil {
-		t.Errorf("Sscan expected no error; got %s", err)
-	}
-	if a != 123 || s != "abc" {
-		t.Errorf("Sscan wrong values: got (%d %q) expected (123 \"abc\")", a, s)
-	}
-	n, err = Sscan("asdf", &s, &a)
-	if n != 1 {
-		t.Errorf("Sscan count error: expected 1: got %d", n)
-	}
-	if err == nil {
-		t.Errorf("Sscan expected error; got none: %s", err)
-	}
-	if s != "asdf" {
-		t.Errorf("Sscan wrong values: got %q expected \"asdf\"", s)
-	}
-}
-
-// Empty strings are not valid input when scanning a string.
-func TestScanEmpty(t *testing.T) {
-	var s1, s2 string
-	n, err := Sscan("abc", &s1, &s2)
-	if n != 1 {
-		t.Errorf("Sscan count error: expected 1: got %d", n)
-	}
-	if err == nil {
-		t.Error("Sscan <one item> expected error; got none")
-	}
-	if s1 != "abc" {
-		t.Errorf("Sscan wrong values: got %q expected \"abc\"", s1)
-	}
-	n, err = Sscan("", &s1, &s2)
-	if n != 0 {
-		t.Errorf("Sscan count error: expected 0: got %d", n)
-	}
-	if err == nil {
-		t.Error("Sscan <empty> expected error; got none")
-	}
-	// Quoted empty string is OK.
-	n, err = Sscanf(`""`, "%q", &s1)
-	if n != 1 {
-		t.Errorf("Sscanf count error: expected 1: got %d", n)
-	}
-	if err != nil {
-		t.Errorf("Sscanf <empty> expected no error with quoted string; got %s", err)
-	}
-}
-
-func TestScanNotPointer(t *testing.T) {
-	r := strings.NewReader("1")
-	var a int
-	_, err := Fscan(r, a)
-	if err == nil {
-		t.Error("expected error scanning non-pointer")
-	} else if strings.Index(err.Error(), "pointer") < 0 {
-		t.Errorf("expected pointer error scanning non-pointer, got: %s", err)
-	}
-}
-
-func TestScanlnNoNewline(t *testing.T) {
-	var a int
-	_, err := Sscanln("1 x\n", &a)
-	if err == nil {
-		t.Error("expected error scanning string missing newline")
-	} else if strings.Index(err.Error(), "newline") < 0 {
-		t.Errorf("expected newline error scanning string missing newline, got: %s", err)
-	}
-}
-
-func TestScanlnWithMiddleNewline(t *testing.T) {
-	r := strings.NewReader("123\n456\n")
-	var a, b int
-	_, err := Fscanln(r, &a, &b)
-	if err == nil {
-		t.Error("expected error scanning string with extra newline")
-	} else if strings.Index(err.Error(), "newline") < 0 {
-		t.Errorf("expected newline error scanning string with extra newline, got: %s", err)
-	}
-}
-
-// eofCounter is a special Reader that counts reads at end of file.
-type eofCounter struct {
-	reader   *strings.Reader
-	eofCount int
-}
-
-func (ec *eofCounter) Read(b []byte) (n int, err error) {
-	n, err = ec.reader.Read(b)
-	if n == 0 {
-		ec.eofCount++
-	}
-	return
-}
-
-// TestEOF verifies that when we scan, we see at most EOF once per call to a
-// Scan function, and then only when it's really an EOF.
-func TestEOF(t *testing.T) {
-	ec := &eofCounter{strings.NewReader("123\n"), 0}
-	var a int
-	n, err := Fscanln(ec, &a)
-	if err != nil {
-		t.Error("unexpected error", err)
-	}
-	if n != 1 {
-		t.Error("expected to scan one item, got", n)
-	}
-	if ec.eofCount != 0 {
-		t.Error("expected zero EOFs", ec.eofCount)
-		ec.eofCount = 0 // reset for next test
-	}
-	n, err = Fscanln(ec, &a)
-	if err == nil {
-		t.Error("expected error scanning empty string")
-	}
-	if n != 0 {
-		t.Error("expected to scan zero items, got", n)
-	}
-	if ec.eofCount != 1 {
-		t.Error("expected one EOF, got", ec.eofCount)
-	}
-}
-
-// TestEOFAtEndOfInput verifies that we see an EOF error if we run out of input.
-// This was a buglet: we used to get "expected integer".
-func TestEOFAtEndOfInput(t *testing.T) {
-	var i, j int
-	n, err := Sscanf("23", "%d %d", &i, &j)
-	if n != 1 || i != 23 {
-		t.Errorf("Sscanf expected one value of 23; got %d %d", n, i)
-	}
-	if err != io.EOF {
-		t.Errorf("Sscanf expected EOF; got %q", err)
-	}
-	n, err = Sscan("234", &i, &j)
-	if n != 1 || i != 234 {
-		t.Errorf("Sscan expected one value of 234; got %d %d", n, i)
-	}
-	if err != io.EOF {
-		t.Errorf("Sscan expected EOF; got %q", err)
-	}
-	// Trailing space is tougher.
-	n, err = Sscan("234 ", &i, &j)
-	if n != 1 || i != 234 {
-		t.Errorf("Sscan expected one value of 234; got %d %d", n, i)
-	}
-	if err != io.EOF {
-		t.Errorf("Sscan expected EOF; got %q", err)
-	}
-}
-
-var eofTests = []struct {
-	format string
-	v      interface{}
-}{
-	{"%s", &stringVal},
-	{"%q", &stringVal},
-	{"%x", &stringVal},
-	{"%v", &stringVal},
-	{"%v", &bytesVal},
-	{"%v", &intVal},
-	{"%v", &uintVal},
-	{"%v", &boolVal},
-	{"%v", &float32Val},
-	{"%v", &complex64Val},
-	{"%v", &renamedStringVal},
-	{"%v", &renamedBytesVal},
-	{"%v", &renamedIntVal},
-	{"%v", &renamedUintVal},
-	{"%v", &renamedBoolVal},
-	{"%v", &renamedFloat32Val},
-	{"%v", &renamedComplex64Val},
-}
-
-func TestEOFAllTypes(t *testing.T) {
-	for i, test := range eofTests {
-		if _, err := Sscanf("", test.format, test.v); err != io.EOF {
-			t.Errorf("#%d: %s %T not eof on empty string: %s", i, test.format, test.v, err)
-		}
-		if _, err := Sscanf("   ", test.format, test.v); err != io.EOF {
-			t.Errorf("#%d: %s %T not eof on trailing blanks: %s", i, test.format, test.v, err)
-		}
-	}
-}
-
-// TestUnreadRuneWithBufio verifies that, at least when using bufio, successive
-// calls to Fscan do not lose runes.
-func TestUnreadRuneWithBufio(t *testing.T) {
-	r := bufio.NewReader(strings.NewReader("123αb"))
-	var i int
-	var a string
-	n, err := Fscanf(r, "%d", &i)
-	if n != 1 || err != nil {
-		t.Errorf("reading int expected one item, no errors; got %d %q", n, err)
-	}
-	if i != 123 {
-		t.Errorf("expected 123; got %d", i)
-	}
-	n, err = Fscanf(r, "%s", &a)
-	if n != 1 || err != nil {
-		t.Errorf("reading string expected one item, no errors; got %d %q", n, err)
-	}
-	if a != "αb" {
-		t.Errorf("expected αb; got %q", a)
-	}
-}
-
-type TwoLines string
-
-// Scan attempts to read two lines into the object.  Scanln should prevent this
-// because it stops at newline; Scan and Scanf should be fine.
-func (t *TwoLines) Scan(state ScanState, verb rune) error {
-	chars := make([]rune, 0, 100)
-	for nlCount := 0; nlCount < 2; {
-		c, _, err := state.ReadRune()
-		if err != nil {
-			return err
-		}
-		chars = append(chars, c)
-		if c == '\n' {
-			nlCount++
-		}
-	}
-	*t = TwoLines(string(chars))
-	return nil
-}
-
-func TestMultiLine(t *testing.T) {
-	input := "abc\ndef\n"
-	// Sscan should work
-	var tscan TwoLines
-	n, err := Sscan(input, &tscan)
-	if n != 1 {
-		t.Errorf("Sscan: expected 1 item; got %d", n)
-	}
-	if err != nil {
-		t.Errorf("Sscan: expected no error; got %s", err)
-	}
-	if string(tscan) != input {
-		t.Errorf("Sscan: expected %q; got %q", input, tscan)
-	}
-	// Sscanf should work
-	var tscanf TwoLines
-	n, err = Sscanf(input, "%s", &tscanf)
-	if n != 1 {
-		t.Errorf("Sscanf: expected 1 item; got %d", n)
-	}
-	if err != nil {
-		t.Errorf("Sscanf: expected no error; got %s", err)
-	}
-	if string(tscanf) != input {
-		t.Errorf("Sscanf: expected %q; got %q", input, tscanf)
-	}
-	// Sscanln should not work
-	var tscanln TwoLines
-	n, err = Sscanln(input, &tscanln)
-	if n != 0 {
-		t.Errorf("Sscanln: expected 0 items; got %d: %q", n, tscanln)
-	}
-	if err == nil {
-		t.Error("Sscanln: expected error; got none")
-	} else if err != io.ErrUnexpectedEOF {
-		t.Errorf("Sscanln: expected io.ErrUnexpectedEOF (ha!); got %s", err)
-	}
-}
-
-// simpleReader is a strings.Reader that implements only Read, not ReadRune.
-// Good for testing readahead.
-type simpleReader struct {
-	sr *strings.Reader
-}
-
-func (s *simpleReader) Read(b []byte) (n int, err error) {
-	return s.sr.Read(b)
-}
-
-// TestLineByLineFscanf tests that Fscanf does not read past newline. Issue
-// 3481.
-func TestLineByLineFscanf(t *testing.T) {
-	r := &simpleReader{strings.NewReader("1\n2\n")}
-	var i, j int
-	n, err := Fscanf(r, "%v\n", &i)
-	if n != 1 || err != nil {
-		t.Fatalf("first read: %d %q", n, err)
-	}
-	n, err = Fscanf(r, "%v\n", &j)
-	if n != 1 || err != nil {
-		t.Fatalf("second read: %d %q", n, err)
-	}
-	if i != 1 || j != 2 {
-		t.Errorf("wrong values; wanted 1 2 got %d %d", i, j)
-	}
-}
-
-// TestScanStateCount verifies the correct byte count is returned. Issue 8512.
-
-// runeScanner implements the Scanner interface for TestScanStateCount.
-type runeScanner struct {
-	rune rune
-	size int
-}
-
-func (rs *runeScanner) Scan(state ScanState, verb rune) error {
-	r, size, err := state.ReadRune()
-	rs.rune = r
-	rs.size = size
-	return err
-}
-
-func TestScanStateCount(t *testing.T) {
-	var a, b, c runeScanner
-	n, err := Sscanf("12➂", "%c%c%c", &a, &b, &c)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if n != 3 {
-		t.Fatalf("expected 3 items consumed, got %d", n)
-	}
-	if a.rune != '1' || b.rune != '2' || c.rune != '➂' {
-		t.Errorf("bad scan rune: %q %q %q should be '1' '2' '➂'", a.rune, b.rune, c.rune)
-	}
-	if a.size != 1 || b.size != 1 || c.size != 3 {
-		t.Errorf("bad scan size: %q %q %q should be 1 1 3", a.size, b.size, c.size)
-	}
-}
-
-// RecursiveInt accepts a string matching %d.%d.%d....
-// and parses it into a linked list.
-// It allows us to benchmark recursive descent style scanners.
-type RecursiveInt struct {
-	i    int
-	next *RecursiveInt
-}
-
-func (r *RecursiveInt) Scan(state ScanState, verb rune) (err error) {
-	_, err = Fscan(state, &r.i)
-	if err != nil {
-		return
-	}
-	next := new(RecursiveInt)
-	_, err = Fscanf(state, ".%v", next)
-	if err != nil {
-		if err == io.ErrUnexpectedEOF {
-			err = nil
-		}
-		return
-	}
-	r.next = next
-	return
-}
-
-// scanInts performs the same scanning task as RecursiveInt.Scan
-// but without recurring through scanner, so we can compare
-// performance more directly.
-func scanInts(r *RecursiveInt, b *bytes.Buffer) (err error) {
-	r.next = nil
-	_, err = Fscan(b, &r.i)
-	if err != nil {
-		return
-	}
-	c, _, err := b.ReadRune()
-	if err != nil {
-		if err == io.EOF {
-			err = nil
-		}
-		return
-	}
-	if c != '.' {
-		return
-	}
-	next := new(RecursiveInt)
-	err = scanInts(next, b)
-	if err == nil {
-		r.next = next
-	}
-	return
-}
-
-func makeInts(n int) []byte {
-	var buf bytes.Buffer
-	Fprintf(&buf, "1")
-	for i := 1; i < n; i++ {
-		Fprintf(&buf, ".%d", i+1)
-	}
-	return buf.Bytes()
-}
-
-func TestScanInts(t *testing.T) {
-	testScanInts(t, scanInts)
-	testScanInts(t, func(r *RecursiveInt, b *bytes.Buffer) (err error) {
-		_, err = Fscan(b, r)
-		return
-	})
-}
-
-// 800 is small enough to not overflow the stack when using gccgo on a
-// platform that does not support split stack.
-const intCount = 800
-
-func testScanInts(t *testing.T, scan func(*RecursiveInt, *bytes.Buffer) error) {
-	r := new(RecursiveInt)
-	ints := makeInts(intCount)
-	buf := bytes.NewBuffer(ints)
-	err := scan(r, buf)
-	if err != nil {
-		t.Error("unexpected error", err)
-	}
-	i := 1
-	for ; r != nil; r = r.next {
-		if r.i != i {
-			t.Fatalf("bad scan: expected %d got %d", i, r.i)
-		}
-		i++
-	}
-	if i-1 != intCount {
-		t.Fatalf("bad scan count: expected %d got %d", intCount, i-1)
-	}
-}
-
-func BenchmarkScanInts(b *testing.B) {
-	b.ResetTimer()
-	ints := makeInts(intCount)
-	var r RecursiveInt
-	for i := b.N - 1; i >= 0; i-- {
-		buf := bytes.NewBuffer(ints)
-		b.StartTimer()
-		scanInts(&r, buf)
-		b.StopTimer()
-	}
-}
-
-func BenchmarkScanRecursiveInt(b *testing.B) {
-	b.ResetTimer()
-	ints := makeInts(intCount)
-	var r RecursiveInt
-	for i := b.N - 1; i >= 0; i-- {
-		buf := bytes.NewBuffer(ints)
-		b.StartTimer()
-		Fscan(buf, &r)
-		b.StopTimer()
-	}
-}
-
-// Issue 9124.
-// %x on bytes couldn't handle non-space bytes terminating the scan.
-func TestHexBytes(t *testing.T) {
-	var a, b []byte
-	n, err := Sscanf("00010203", "%x", &a)
-	if n != 1 || err != nil {
-		t.Errorf("simple: got count, err = %d, %v; expected 1, nil", n, err)
-	}
-	check := func(msg string, x []byte) {
-		if len(x) != 4 {
-			t.Errorf("%s: bad length %d", msg, len(x))
-		}
-		for i, b := range x {
-			if int(b) != i {
-				t.Errorf("%s: bad x[%d] = %x", msg, i, x[i])
-			}
-		}
-	}
-	check("simple", a)
-	a = nil
-
-	n, err = Sscanf("00010203 00010203", "%x %x", &a, &b)
-	if n != 2 || err != nil {
-		t.Errorf("simple pair: got count, err = %d, %v; expected 2, nil", n, err)
-	}
-	check("simple pair a", a)
-	check("simple pair b", b)
-	a = nil
-	b = nil
-
-	n, err = Sscanf("00010203:", "%x", &a)
-	if n != 1 || err != nil {
-		t.Errorf("colon: got count, err = %d, %v; expected 1, nil", n, err)
-	}
-	check("colon", a)
-	a = nil
-
-	n, err = Sscanf("00010203:00010203", "%x:%x", &a, &b)
-	if n != 2 || err != nil {
-		t.Errorf("colon pair: got count, err = %d, %v; expected 2, nil", n, err)
-	}
-	check("colon pair a", a)
-	check("colon pair b", b)
-	a = nil
-	b = nil
-
-	// This one fails because there is a hex byte after the data,
-	// that is, an odd number of hex input bytes.
-	n, err = Sscanf("000102034:", "%x", &a)
-	if n != 0 || err == nil {
-		t.Errorf("odd count: got count, err = %d, %v; expected 0, error", n, err)
-	}
-}
-
-func TestScanNewlinesAreSpaces(t *testing.T) {
-	var a, b int
-	var tests = []struct {
-		name  string
-		text  string
-		count int
-	}{
-		{"newlines", "1\n2\n", 2},
-		{"no final newline", "1\n2", 2},
-		{"newlines with spaces ", "1  \n  2  \n", 2},
-		{"no final newline with spaces", "1  \n  2", 2},
-	}
-	for _, test := range tests {
-		n, err := Sscan(test.text, &a, &b)
-		if n != test.count {
-			t.Errorf("%s: expected to scan %d item(s), scanned %d", test.name, test.count, n)
-		}
-		if err != nil {
-			t.Errorf("%s: unexpected error: %s", test.name, err)
-		}
-	}
-}
-
-func TestScanlnNewlinesTerminate(t *testing.T) {
-	var a, b int
-	var tests = []struct {
-		name  string
-		text  string
-		count int
-		ok    bool
-	}{
-		{"one line one item", "1\n", 1, false},
-		{"one line two items with spaces ", "   1 2    \n", 2, true},
-		{"one line two items no newline", "   1 2", 2, true},
-		{"two lines two items", "1\n2\n", 1, false},
-	}
-	for _, test := range tests {
-		n, err := Sscanln(test.text, &a, &b)
-		if n != test.count {
-			t.Errorf("%s: expected to scan %d item(s), scanned %d", test.name, test.count, n)
-		}
-		if test.ok && err != nil {
-			t.Errorf("%s: unexpected error: %s", test.name, err)
-		}
-		if !test.ok && err == nil {
-			t.Errorf("%s: expected error; got none", test.name)
-		}
-	}
-}
-
-func TestScanfNewlineMatchFormat(t *testing.T) {
-	var a, b int
-	var tests = []struct {
-		name   string
-		text   string
-		format string
-		count  int
-		ok     bool
-	}{
-		{"newline in both", "1\n2", "%d\n%d\n", 2, true},
-		{"newline in input", "1\n2", "%d %d", 1, false},
-		{"space-newline in input", "1 \n2", "%d %d", 1, false},
-		{"newline in format", "1 2", "%d\n%d", 1, false},
-		{"space-newline in format", "1 2", "%d \n%d", 1, false},
-		{"space-newline in both", "1 \n2", "%d \n%d", 2, true},
-		{"extra space in format", "1\n2", "%d\n %d", 2, true},
-		{"two extra spaces in format", "1\n2", "%d \n %d", 2, true},
-	}
-	for _, test := range tests {
-		n, err := Sscanf(test.text, test.format, &a, &b)
-		if n != test.count {
-			t.Errorf("%s: expected to scan %d item(s), scanned %d", test.name, test.count, n)
-		}
-		if test.ok && err != nil {
-			t.Errorf("%s: unexpected error: %s", test.name, err)
-		}
-		if !test.ok && err == nil {
-			t.Errorf("%s: expected error; got none", test.name)
-		}
-	}
-}
-
-// Test for issue 12090: Was unreading at EOF, double-scanning a byte.
-
-type hexBytes [2]byte
-
-func (h *hexBytes) Scan(ss ScanState, verb rune) error {
-	var b []byte
-	_, err := Fscanf(ss, "%4x", &b)
-	if err != nil {
-		panic(err) // Really shouldn't happen.
-	}
-	copy((*h)[:], b)
-	return err
-}
-
-func TestHexByte(t *testing.T) {
-	var h hexBytes
-	n, err := Sscanln("0123\n", &h)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if n != 1 {
-		t.Fatalf("expected 1 item; scanned %d", n)
-	}
-	if h[0] != 0x01 || h[1] != 0x23 {
-		t.Fatalf("expected 0123 got %x", h)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/fmt/stringer_test.go b/third_party/gofrontend/libgo/go/fmt/stringer_test.go
deleted file mode 100644
index 0ca3f52..0000000
--- a/third_party/gofrontend/libgo/go/fmt/stringer_test.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package fmt_test
-
-import (
-	. "fmt"
-	"testing"
-)
-
-type TI int
-type TI8 int8
-type TI16 int16
-type TI32 int32
-type TI64 int64
-type TU uint
-type TU8 uint8
-type TU16 uint16
-type TU32 uint32
-type TU64 uint64
-type TUI uintptr
-type TF float64
-type TF32 float32
-type TF64 float64
-type TB bool
-type TS string
-
-func (v TI) String() string   { return Sprintf("I: %d", int(v)) }
-func (v TI8) String() string  { return Sprintf("I8: %d", int8(v)) }
-func (v TI16) String() string { return Sprintf("I16: %d", int16(v)) }
-func (v TI32) String() string { return Sprintf("I32: %d", int32(v)) }
-func (v TI64) String() string { return Sprintf("I64: %d", int64(v)) }
-func (v TU) String() string   { return Sprintf("U: %d", uint(v)) }
-func (v TU8) String() string  { return Sprintf("U8: %d", uint8(v)) }
-func (v TU16) String() string { return Sprintf("U16: %d", uint16(v)) }
-func (v TU32) String() string { return Sprintf("U32: %d", uint32(v)) }
-func (v TU64) String() string { return Sprintf("U64: %d", uint64(v)) }
-func (v TUI) String() string  { return Sprintf("UI: %d", uintptr(v)) }
-func (v TF) String() string   { return Sprintf("F: %f", float64(v)) }
-func (v TF32) String() string { return Sprintf("F32: %f", float32(v)) }
-func (v TF64) String() string { return Sprintf("F64: %f", float64(v)) }
-func (v TB) String() string   { return Sprintf("B: %t", bool(v)) }
-func (v TS) String() string   { return Sprintf("S: %q", string(v)) }
-
-func check(t *testing.T, got, want string) {
-	if got != want {
-		t.Error(got, "!=", want)
-	}
-}
-
-func TestStringer(t *testing.T) {
-	s := Sprintf("%v %v %v %v %v", TI(0), TI8(1), TI16(2), TI32(3), TI64(4))
-	check(t, s, "I: 0 I8: 1 I16: 2 I32: 3 I64: 4")
-	s = Sprintf("%v %v %v %v %v %v", TU(5), TU8(6), TU16(7), TU32(8), TU64(9), TUI(10))
-	check(t, s, "U: 5 U8: 6 U16: 7 U32: 8 U64: 9 UI: 10")
-	s = Sprintf("%v %v %v", TF(1.0), TF32(2.0), TF64(3.0))
-	check(t, s, "F: 1.000000 F32: 2.000000 F64: 3.000000")
-	s = Sprintf("%v %v", TB(true), TS("x"))
-	check(t, s, "B: true S: \"x\"")
-}
diff --git a/third_party/gofrontend/libgo/go/go/ast/ast.go b/third_party/gofrontend/libgo/go/go/ast/ast.go
deleted file mode 100644
index 5ab4283..0000000
--- a/third_party/gofrontend/libgo/go/go/ast/ast.go
+++ /dev/null
@@ -1,999 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package ast declares the types used to represent syntax trees for Go
-// packages.
-//
-package ast
-
-import (
-	"go/token"
-	"strings"
-	"unicode"
-	"unicode/utf8"
-)
-
-// ----------------------------------------------------------------------------
-// Interfaces
-//
-// There are 3 main classes of nodes: Expressions and type nodes,
-// statement nodes, and declaration nodes. The node names usually
-// match the corresponding Go spec production names to which they
-// correspond. The node fields correspond to the individual parts
-// of the respective productions.
-//
-// All nodes contain position information marking the beginning of
-// the corresponding source text segment; it is accessible via the
-// Pos accessor method. Nodes may contain additional position info
-// for language constructs where comments may be found between parts
-// of the construct (typically any larger, parenthesized subpart).
-// That position information is needed to properly position comments
-// when printing the construct.
-
-// All node types implement the Node interface.
-type Node interface {
-	Pos() token.Pos // position of first character belonging to the node
-	End() token.Pos // position of first character immediately after the node
-}
-
-// All expression nodes implement the Expr interface.
-type Expr interface {
-	Node
-	exprNode()
-}
-
-// All statement nodes implement the Stmt interface.
-type Stmt interface {
-	Node
-	stmtNode()
-}
-
-// All declaration nodes implement the Decl interface.
-type Decl interface {
-	Node
-	declNode()
-}
-
-// ----------------------------------------------------------------------------
-// Comments
-
-// A Comment node represents a single //-style or /*-style comment.
-type Comment struct {
-	Slash token.Pos // position of "/" starting the comment
-	Text  string    // comment text (excluding '\n' for //-style comments)
-}
-
-func (c *Comment) Pos() token.Pos { return c.Slash }
-func (c *Comment) End() token.Pos { return token.Pos(int(c.Slash) + len(c.Text)) }
-
-// A CommentGroup represents a sequence of comments
-// with no other tokens and no empty lines between.
-//
-type CommentGroup struct {
-	List []*Comment // len(List) > 0
-}
-
-func (g *CommentGroup) Pos() token.Pos { return g.List[0].Pos() }
-func (g *CommentGroup) End() token.Pos { return g.List[len(g.List)-1].End() }
-
-func isWhitespace(ch byte) bool { return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' }
-
-func stripTrailingWhitespace(s string) string {
-	i := len(s)
-	for i > 0 && isWhitespace(s[i-1]) {
-		i--
-	}
-	return s[0:i]
-}
-
-// Text returns the text of the comment.
-// Comment markers (//, /*, and */), the first space of a line comment, and
-// leading and trailing empty lines are removed. Multiple empty lines are
-// reduced to one, and trailing space on lines is trimmed. Unless the result
-// is empty, it is newline-terminated.
-//
-func (g *CommentGroup) Text() string {
-	if g == nil {
-		return ""
-	}
-	comments := make([]string, len(g.List))
-	for i, c := range g.List {
-		comments[i] = string(c.Text)
-	}
-
-	lines := make([]string, 0, 10) // most comments are less than 10 lines
-	for _, c := range comments {
-		// Remove comment markers.
-		// The parser has given us exactly the comment text.
-		switch c[1] {
-		case '/':
-			//-style comment (no newline at the end)
-			c = c[2:]
-			// strip first space - required for Example tests
-			if len(c) > 0 && c[0] == ' ' {
-				c = c[1:]
-			}
-		case '*':
-			/*-style comment */
-			c = c[2 : len(c)-2]
-		}
-
-		// Split on newlines.
-		cl := strings.Split(c, "\n")
-
-		// Walk lines, stripping trailing white space and adding to list.
-		for _, l := range cl {
-			lines = append(lines, stripTrailingWhitespace(l))
-		}
-	}
-
-	// Remove leading blank lines; convert runs of
-	// interior blank lines to a single blank line.
-	n := 0
-	for _, line := range lines {
-		if line != "" || n > 0 && lines[n-1] != "" {
-			lines[n] = line
-			n++
-		}
-	}
-	lines = lines[0:n]
-
-	// Add final "" entry to get trailing newline from Join.
-	if n > 0 && lines[n-1] != "" {
-		lines = append(lines, "")
-	}
-
-	return strings.Join(lines, "\n")
-}
-
-// ----------------------------------------------------------------------------
-// Expressions and types
-
-// A Field represents a Field declaration list in a struct type,
-// a method list in an interface type, or a parameter/result declaration
-// in a signature.
-//
-type Field struct {
-	Doc     *CommentGroup // associated documentation; or nil
-	Names   []*Ident      // field/method/parameter names; or nil if anonymous field
-	Type    Expr          // field/method/parameter type
-	Tag     *BasicLit     // field tag; or nil
-	Comment *CommentGroup // line comments; or nil
-}
-
-func (f *Field) Pos() token.Pos {
-	if len(f.Names) > 0 {
-		return f.Names[0].Pos()
-	}
-	return f.Type.Pos()
-}
-
-func (f *Field) End() token.Pos {
-	if f.Tag != nil {
-		return f.Tag.End()
-	}
-	return f.Type.End()
-}
-
-// A FieldList represents a list of Fields, enclosed by parentheses or braces.
-type FieldList struct {
-	Opening token.Pos // position of opening parenthesis/brace, if any
-	List    []*Field  // field list; or nil
-	Closing token.Pos // position of closing parenthesis/brace, if any
-}
-
-func (f *FieldList) Pos() token.Pos {
-	if f.Opening.IsValid() {
-		return f.Opening
-	}
-	// the list should not be empty in this case;
-	// be conservative and guard against bad ASTs
-	if len(f.List) > 0 {
-		return f.List[0].Pos()
-	}
-	return token.NoPos
-}
-
-func (f *FieldList) End() token.Pos {
-	if f.Closing.IsValid() {
-		return f.Closing + 1
-	}
-	// the list should not be empty in this case;
-	// be conservative and guard against bad ASTs
-	if n := len(f.List); n > 0 {
-		return f.List[n-1].End()
-	}
-	return token.NoPos
-}
-
-// NumFields returns the number of (named and anonymous fields) in a FieldList.
-func (f *FieldList) NumFields() int {
-	n := 0
-	if f != nil {
-		for _, g := range f.List {
-			m := len(g.Names)
-			if m == 0 {
-				m = 1 // anonymous field
-			}
-			n += m
-		}
-	}
-	return n
-}
-
-// An expression is represented by a tree consisting of one
-// or more of the following concrete expression nodes.
-//
-type (
-	// A BadExpr node is a placeholder for expressions containing
-	// syntax errors for which no correct expression nodes can be
-	// created.
-	//
-	BadExpr struct {
-		From, To token.Pos // position range of bad expression
-	}
-
-	// An Ident node represents an identifier.
-	Ident struct {
-		NamePos token.Pos // identifier position
-		Name    string    // identifier name
-		Obj     *Object   // denoted object; or nil
-	}
-
-	// An Ellipsis node stands for the "..." type in a
-	// parameter list or the "..." length in an array type.
-	//
-	Ellipsis struct {
-		Ellipsis token.Pos // position of "..."
-		Elt      Expr      // ellipsis element type (parameter lists only); or nil
-	}
-
-	// A BasicLit node represents a literal of basic type.
-	BasicLit struct {
-		ValuePos token.Pos   // literal position
-		Kind     token.Token // token.INT, token.FLOAT, token.IMAG, token.CHAR, or token.STRING
-		Value    string      // literal string; e.g. 42, 0x7f, 3.14, 1e-9, 2.4i, 'a', '\x7f', "foo" or `\m\n\o`
-	}
-
-	// A FuncLit node represents a function literal.
-	FuncLit struct {
-		Type *FuncType  // function type
-		Body *BlockStmt // function body
-	}
-
-	// A CompositeLit node represents a composite literal.
-	CompositeLit struct {
-		Type   Expr      // literal type; or nil
-		Lbrace token.Pos // position of "{"
-		Elts   []Expr    // list of composite elements; or nil
-		Rbrace token.Pos // position of "}"
-	}
-
-	// A ParenExpr node represents a parenthesized expression.
-	ParenExpr struct {
-		Lparen token.Pos // position of "("
-		X      Expr      // parenthesized expression
-		Rparen token.Pos // position of ")"
-	}
-
-	// A SelectorExpr node represents an expression followed by a selector.
-	SelectorExpr struct {
-		X   Expr   // expression
-		Sel *Ident // field selector
-	}
-
-	// An IndexExpr node represents an expression followed by an index.
-	IndexExpr struct {
-		X      Expr      // expression
-		Lbrack token.Pos // position of "["
-		Index  Expr      // index expression
-		Rbrack token.Pos // position of "]"
-	}
-
-	// An SliceExpr node represents an expression followed by slice indices.
-	SliceExpr struct {
-		X      Expr      // expression
-		Lbrack token.Pos // position of "["
-		Low    Expr      // begin of slice range; or nil
-		High   Expr      // end of slice range; or nil
-		Max    Expr      // maximum capacity of slice; or nil
-		Slice3 bool      // true if 3-index slice (2 colons present)
-		Rbrack token.Pos // position of "]"
-	}
-
-	// A TypeAssertExpr node represents an expression followed by a
-	// type assertion.
-	//
-	TypeAssertExpr struct {
-		X      Expr      // expression
-		Lparen token.Pos // position of "("
-		Type   Expr      // asserted type; nil means type switch X.(type)
-		Rparen token.Pos // position of ")"
-	}
-
-	// A CallExpr node represents an expression followed by an argument list.
-	CallExpr struct {
-		Fun      Expr      // function expression
-		Lparen   token.Pos // position of "("
-		Args     []Expr    // function arguments; or nil
-		Ellipsis token.Pos // position of "...", if any
-		Rparen   token.Pos // position of ")"
-	}
-
-	// A StarExpr node represents an expression of the form "*" Expression.
-	// Semantically it could be a unary "*" expression, or a pointer type.
-	//
-	StarExpr struct {
-		Star token.Pos // position of "*"
-		X    Expr      // operand
-	}
-
-	// A UnaryExpr node represents a unary expression.
-	// Unary "*" expressions are represented via StarExpr nodes.
-	//
-	UnaryExpr struct {
-		OpPos token.Pos   // position of Op
-		Op    token.Token // operator
-		X     Expr        // operand
-	}
-
-	// A BinaryExpr node represents a binary expression.
-	BinaryExpr struct {
-		X     Expr        // left operand
-		OpPos token.Pos   // position of Op
-		Op    token.Token // operator
-		Y     Expr        // right operand
-	}
-
-	// A KeyValueExpr node represents (key : value) pairs
-	// in composite literals.
-	//
-	KeyValueExpr struct {
-		Key   Expr
-		Colon token.Pos // position of ":"
-		Value Expr
-	}
-)
-
-// The direction of a channel type is indicated by one
-// of the following constants.
-//
-type ChanDir int
-
-const (
-	SEND ChanDir = 1 << iota
-	RECV
-)
-
-// A type is represented by a tree consisting of one
-// or more of the following type-specific expression
-// nodes.
-//
-type (
-	// An ArrayType node represents an array or slice type.
-	ArrayType struct {
-		Lbrack token.Pos // position of "["
-		Len    Expr      // Ellipsis node for [...]T array types, nil for slice types
-		Elt    Expr      // element type
-	}
-
-	// A StructType node represents a struct type.
-	StructType struct {
-		Struct     token.Pos  // position of "struct" keyword
-		Fields     *FieldList // list of field declarations
-		Incomplete bool       // true if (source) fields are missing in the Fields list
-	}
-
-	// Pointer types are represented via StarExpr nodes.
-
-	// A FuncType node represents a function type.
-	FuncType struct {
-		Func    token.Pos  // position of "func" keyword (token.NoPos if there is no "func")
-		Params  *FieldList // (incoming) parameters; non-nil
-		Results *FieldList // (outgoing) results; or nil
-	}
-
-	// An InterfaceType node represents an interface type.
-	InterfaceType struct {
-		Interface  token.Pos  // position of "interface" keyword
-		Methods    *FieldList // list of methods
-		Incomplete bool       // true if (source) methods are missing in the Methods list
-	}
-
-	// A MapType node represents a map type.
-	MapType struct {
-		Map   token.Pos // position of "map" keyword
-		Key   Expr
-		Value Expr
-	}
-
-	// A ChanType node represents a channel type.
-	ChanType struct {
-		Begin token.Pos // position of "chan" keyword or "<-" (whichever comes first)
-		Arrow token.Pos // position of "<-" (token.NoPos if there is no "<-")
-		Dir   ChanDir   // channel direction
-		Value Expr      // value type
-	}
-)
-
-// Pos and End implementations for expression/type nodes.
-//
-func (x *BadExpr) Pos() token.Pos  { return x.From }
-func (x *Ident) Pos() token.Pos    { return x.NamePos }
-func (x *Ellipsis) Pos() token.Pos { return x.Ellipsis }
-func (x *BasicLit) Pos() token.Pos { return x.ValuePos }
-func (x *FuncLit) Pos() token.Pos  { return x.Type.Pos() }
-func (x *CompositeLit) Pos() token.Pos {
-	if x.Type != nil {
-		return x.Type.Pos()
-	}
-	return x.Lbrace
-}
-func (x *ParenExpr) Pos() token.Pos      { return x.Lparen }
-func (x *SelectorExpr) Pos() token.Pos   { return x.X.Pos() }
-func (x *IndexExpr) Pos() token.Pos      { return x.X.Pos() }
-func (x *SliceExpr) Pos() token.Pos      { return x.X.Pos() }
-func (x *TypeAssertExpr) Pos() token.Pos { return x.X.Pos() }
-func (x *CallExpr) Pos() token.Pos       { return x.Fun.Pos() }
-func (x *StarExpr) Pos() token.Pos       { return x.Star }
-func (x *UnaryExpr) Pos() token.Pos      { return x.OpPos }
-func (x *BinaryExpr) Pos() token.Pos     { return x.X.Pos() }
-func (x *KeyValueExpr) Pos() token.Pos   { return x.Key.Pos() }
-func (x *ArrayType) Pos() token.Pos      { return x.Lbrack }
-func (x *StructType) Pos() token.Pos     { return x.Struct }
-func (x *FuncType) Pos() token.Pos {
-	if x.Func.IsValid() || x.Params == nil { // see issue 3870
-		return x.Func
-	}
-	return x.Params.Pos() // interface method declarations have no "func" keyword
-}
-func (x *InterfaceType) Pos() token.Pos { return x.Interface }
-func (x *MapType) Pos() token.Pos       { return x.Map }
-func (x *ChanType) Pos() token.Pos      { return x.Begin }
-
-func (x *BadExpr) End() token.Pos { return x.To }
-func (x *Ident) End() token.Pos   { return token.Pos(int(x.NamePos) + len(x.Name)) }
-func (x *Ellipsis) End() token.Pos {
-	if x.Elt != nil {
-		return x.Elt.End()
-	}
-	return x.Ellipsis + 3 // len("...")
-}
-func (x *BasicLit) End() token.Pos       { return token.Pos(int(x.ValuePos) + len(x.Value)) }
-func (x *FuncLit) End() token.Pos        { return x.Body.End() }
-func (x *CompositeLit) End() token.Pos   { return x.Rbrace + 1 }
-func (x *ParenExpr) End() token.Pos      { return x.Rparen + 1 }
-func (x *SelectorExpr) End() token.Pos   { return x.Sel.End() }
-func (x *IndexExpr) End() token.Pos      { return x.Rbrack + 1 }
-func (x *SliceExpr) End() token.Pos      { return x.Rbrack + 1 }
-func (x *TypeAssertExpr) End() token.Pos { return x.Rparen + 1 }
-func (x *CallExpr) End() token.Pos       { return x.Rparen + 1 }
-func (x *StarExpr) End() token.Pos       { return x.X.End() }
-func (x *UnaryExpr) End() token.Pos      { return x.X.End() }
-func (x *BinaryExpr) End() token.Pos     { return x.Y.End() }
-func (x *KeyValueExpr) End() token.Pos   { return x.Value.End() }
-func (x *ArrayType) End() token.Pos      { return x.Elt.End() }
-func (x *StructType) End() token.Pos     { return x.Fields.End() }
-func (x *FuncType) End() token.Pos {
-	if x.Results != nil {
-		return x.Results.End()
-	}
-	return x.Params.End()
-}
-func (x *InterfaceType) End() token.Pos { return x.Methods.End() }
-func (x *MapType) End() token.Pos       { return x.Value.End() }
-func (x *ChanType) End() token.Pos      { return x.Value.End() }
-
-// exprNode() ensures that only expression/type nodes can be
-// assigned to an Expr.
-//
-func (*BadExpr) exprNode()        {}
-func (*Ident) exprNode()          {}
-func (*Ellipsis) exprNode()       {}
-func (*BasicLit) exprNode()       {}
-func (*FuncLit) exprNode()        {}
-func (*CompositeLit) exprNode()   {}
-func (*ParenExpr) exprNode()      {}
-func (*SelectorExpr) exprNode()   {}
-func (*IndexExpr) exprNode()      {}
-func (*SliceExpr) exprNode()      {}
-func (*TypeAssertExpr) exprNode() {}
-func (*CallExpr) exprNode()       {}
-func (*StarExpr) exprNode()       {}
-func (*UnaryExpr) exprNode()      {}
-func (*BinaryExpr) exprNode()     {}
-func (*KeyValueExpr) exprNode()   {}
-
-func (*ArrayType) exprNode()     {}
-func (*StructType) exprNode()    {}
-func (*FuncType) exprNode()      {}
-func (*InterfaceType) exprNode() {}
-func (*MapType) exprNode()       {}
-func (*ChanType) exprNode()      {}
-
-// ----------------------------------------------------------------------------
-// Convenience functions for Idents
-
-// NewIdent creates a new Ident without position.
-// Useful for ASTs generated by code other than the Go parser.
-//
-func NewIdent(name string) *Ident { return &Ident{token.NoPos, name, nil} }
-
-// IsExported reports whether name is an exported Go symbol
-// (that is, whether it begins with an upper-case letter).
-//
-func IsExported(name string) bool {
-	ch, _ := utf8.DecodeRuneInString(name)
-	return unicode.IsUpper(ch)
-}
-
-// IsExported reports whether id is an exported Go symbol
-// (that is, whether it begins with an uppercase letter).
-//
-func (id *Ident) IsExported() bool { return IsExported(id.Name) }
-
-func (id *Ident) String() string {
-	if id != nil {
-		return id.Name
-	}
-	return "<nil>"
-}
-
-// ----------------------------------------------------------------------------
-// Statements
-
-// A statement is represented by a tree consisting of one
-// or more of the following concrete statement nodes.
-//
-type (
-	// A BadStmt node is a placeholder for statements containing
-	// syntax errors for which no correct statement nodes can be
-	// created.
-	//
-	BadStmt struct {
-		From, To token.Pos // position range of bad statement
-	}
-
-	// A DeclStmt node represents a declaration in a statement list.
-	DeclStmt struct {
-		Decl Decl // *GenDecl with CONST, TYPE, or VAR token
-	}
-
-	// An EmptyStmt node represents an empty statement.
-	// The "position" of the empty statement is the position
-	// of the immediately following (explicit or implicit) semicolon.
-	//
-	EmptyStmt struct {
-		Semicolon token.Pos // position of following ";"
-		Implicit  bool      // if set, ";" was omitted in the source
-	}
-
-	// A LabeledStmt node represents a labeled statement.
-	LabeledStmt struct {
-		Label *Ident
-		Colon token.Pos // position of ":"
-		Stmt  Stmt
-	}
-
-	// An ExprStmt node represents a (stand-alone) expression
-	// in a statement list.
-	//
-	ExprStmt struct {
-		X Expr // expression
-	}
-
-	// A SendStmt node represents a send statement.
-	SendStmt struct {
-		Chan  Expr
-		Arrow token.Pos // position of "<-"
-		Value Expr
-	}
-
-	// An IncDecStmt node represents an increment or decrement statement.
-	IncDecStmt struct {
-		X      Expr
-		TokPos token.Pos   // position of Tok
-		Tok    token.Token // INC or DEC
-	}
-
-	// An AssignStmt node represents an assignment or
-	// a short variable declaration.
-	//
-	AssignStmt struct {
-		Lhs    []Expr
-		TokPos token.Pos   // position of Tok
-		Tok    token.Token // assignment token, DEFINE
-		Rhs    []Expr
-	}
-
-	// A GoStmt node represents a go statement.
-	GoStmt struct {
-		Go   token.Pos // position of "go" keyword
-		Call *CallExpr
-	}
-
-	// A DeferStmt node represents a defer statement.
-	DeferStmt struct {
-		Defer token.Pos // position of "defer" keyword
-		Call  *CallExpr
-	}
-
-	// A ReturnStmt node represents a return statement.
-	ReturnStmt struct {
-		Return  token.Pos // position of "return" keyword
-		Results []Expr    // result expressions; or nil
-	}
-
-	// A BranchStmt node represents a break, continue, goto,
-	// or fallthrough statement.
-	//
-	BranchStmt struct {
-		TokPos token.Pos   // position of Tok
-		Tok    token.Token // keyword token (BREAK, CONTINUE, GOTO, FALLTHROUGH)
-		Label  *Ident      // label name; or nil
-	}
-
-	// A BlockStmt node represents a braced statement list.
-	BlockStmt struct {
-		Lbrace token.Pos // position of "{"
-		List   []Stmt
-		Rbrace token.Pos // position of "}"
-	}
-
-	// An IfStmt node represents an if statement.
-	IfStmt struct {
-		If   token.Pos // position of "if" keyword
-		Init Stmt      // initialization statement; or nil
-		Cond Expr      // condition
-		Body *BlockStmt
-		Else Stmt // else branch; or nil
-	}
-
-	// A CaseClause represents a case of an expression or type switch statement.
-	CaseClause struct {
-		Case  token.Pos // position of "case" or "default" keyword
-		List  []Expr    // list of expressions or types; nil means default case
-		Colon token.Pos // position of ":"
-		Body  []Stmt    // statement list; or nil
-	}
-
-	// A SwitchStmt node represents an expression switch statement.
-	SwitchStmt struct {
-		Switch token.Pos  // position of "switch" keyword
-		Init   Stmt       // initialization statement; or nil
-		Tag    Expr       // tag expression; or nil
-		Body   *BlockStmt // CaseClauses only
-	}
-
-	// An TypeSwitchStmt node represents a type switch statement.
-	TypeSwitchStmt struct {
-		Switch token.Pos  // position of "switch" keyword
-		Init   Stmt       // initialization statement; or nil
-		Assign Stmt       // x := y.(type) or y.(type)
-		Body   *BlockStmt // CaseClauses only
-	}
-
-	// A CommClause node represents a case of a select statement.
-	CommClause struct {
-		Case  token.Pos // position of "case" or "default" keyword
-		Comm  Stmt      // send or receive statement; nil means default case
-		Colon token.Pos // position of ":"
-		Body  []Stmt    // statement list; or nil
-	}
-
-	// An SelectStmt node represents a select statement.
-	SelectStmt struct {
-		Select token.Pos  // position of "select" keyword
-		Body   *BlockStmt // CommClauses only
-	}
-
-	// A ForStmt represents a for statement.
-	ForStmt struct {
-		For  token.Pos // position of "for" keyword
-		Init Stmt      // initialization statement; or nil
-		Cond Expr      // condition; or nil
-		Post Stmt      // post iteration statement; or nil
-		Body *BlockStmt
-	}
-
-	// A RangeStmt represents a for statement with a range clause.
-	RangeStmt struct {
-		For        token.Pos   // position of "for" keyword
-		Key, Value Expr        // Key, Value may be nil
-		TokPos     token.Pos   // position of Tok; invalid if Key == nil
-		Tok        token.Token // ILLEGAL if Key == nil, ASSIGN, DEFINE
-		X          Expr        // value to range over
-		Body       *BlockStmt
-	}
-)
-
-// Pos and End implementations for statement nodes.
-//
-func (s *BadStmt) Pos() token.Pos        { return s.From }
-func (s *DeclStmt) Pos() token.Pos       { return s.Decl.Pos() }
-func (s *EmptyStmt) Pos() token.Pos      { return s.Semicolon }
-func (s *LabeledStmt) Pos() token.Pos    { return s.Label.Pos() }
-func (s *ExprStmt) Pos() token.Pos       { return s.X.Pos() }
-func (s *SendStmt) Pos() token.Pos       { return s.Chan.Pos() }
-func (s *IncDecStmt) Pos() token.Pos     { return s.X.Pos() }
-func (s *AssignStmt) Pos() token.Pos     { return s.Lhs[0].Pos() }
-func (s *GoStmt) Pos() token.Pos         { return s.Go }
-func (s *DeferStmt) Pos() token.Pos      { return s.Defer }
-func (s *ReturnStmt) Pos() token.Pos     { return s.Return }
-func (s *BranchStmt) Pos() token.Pos     { return s.TokPos }
-func (s *BlockStmt) Pos() token.Pos      { return s.Lbrace }
-func (s *IfStmt) Pos() token.Pos         { return s.If }
-func (s *CaseClause) Pos() token.Pos     { return s.Case }
-func (s *SwitchStmt) Pos() token.Pos     { return s.Switch }
-func (s *TypeSwitchStmt) Pos() token.Pos { return s.Switch }
-func (s *CommClause) Pos() token.Pos     { return s.Case }
-func (s *SelectStmt) Pos() token.Pos     { return s.Select }
-func (s *ForStmt) Pos() token.Pos        { return s.For }
-func (s *RangeStmt) Pos() token.Pos      { return s.For }
-
-func (s *BadStmt) End() token.Pos  { return s.To }
-func (s *DeclStmt) End() token.Pos { return s.Decl.End() }
-func (s *EmptyStmt) End() token.Pos {
-	if s.Implicit {
-		return s.Semicolon
-	}
-	return s.Semicolon + 1 /* len(";") */
-}
-func (s *LabeledStmt) End() token.Pos { return s.Stmt.End() }
-func (s *ExprStmt) End() token.Pos    { return s.X.End() }
-func (s *SendStmt) End() token.Pos    { return s.Value.End() }
-func (s *IncDecStmt) End() token.Pos {
-	return s.TokPos + 2 /* len("++") */
-}
-func (s *AssignStmt) End() token.Pos { return s.Rhs[len(s.Rhs)-1].End() }
-func (s *GoStmt) End() token.Pos     { return s.Call.End() }
-func (s *DeferStmt) End() token.Pos  { return s.Call.End() }
-func (s *ReturnStmt) End() token.Pos {
-	if n := len(s.Results); n > 0 {
-		return s.Results[n-1].End()
-	}
-	return s.Return + 6 // len("return")
-}
-func (s *BranchStmt) End() token.Pos {
-	if s.Label != nil {
-		return s.Label.End()
-	}
-	return token.Pos(int(s.TokPos) + len(s.Tok.String()))
-}
-func (s *BlockStmt) End() token.Pos { return s.Rbrace + 1 }
-func (s *IfStmt) End() token.Pos {
-	if s.Else != nil {
-		return s.Else.End()
-	}
-	return s.Body.End()
-}
-func (s *CaseClause) End() token.Pos {
-	if n := len(s.Body); n > 0 {
-		return s.Body[n-1].End()
-	}
-	return s.Colon + 1
-}
-func (s *SwitchStmt) End() token.Pos     { return s.Body.End() }
-func (s *TypeSwitchStmt) End() token.Pos { return s.Body.End() }
-func (s *CommClause) End() token.Pos {
-	if n := len(s.Body); n > 0 {
-		return s.Body[n-1].End()
-	}
-	return s.Colon + 1
-}
-func (s *SelectStmt) End() token.Pos { return s.Body.End() }
-func (s *ForStmt) End() token.Pos    { return s.Body.End() }
-func (s *RangeStmt) End() token.Pos  { return s.Body.End() }
-
-// stmtNode() ensures that only statement nodes can be
-// assigned to a Stmt.
-//
-func (*BadStmt) stmtNode()        {}
-func (*DeclStmt) stmtNode()       {}
-func (*EmptyStmt) stmtNode()      {}
-func (*LabeledStmt) stmtNode()    {}
-func (*ExprStmt) stmtNode()       {}
-func (*SendStmt) stmtNode()       {}
-func (*IncDecStmt) stmtNode()     {}
-func (*AssignStmt) stmtNode()     {}
-func (*GoStmt) stmtNode()         {}
-func (*DeferStmt) stmtNode()      {}
-func (*ReturnStmt) stmtNode()     {}
-func (*BranchStmt) stmtNode()     {}
-func (*BlockStmt) stmtNode()      {}
-func (*IfStmt) stmtNode()         {}
-func (*CaseClause) stmtNode()     {}
-func (*SwitchStmt) stmtNode()     {}
-func (*TypeSwitchStmt) stmtNode() {}
-func (*CommClause) stmtNode()     {}
-func (*SelectStmt) stmtNode()     {}
-func (*ForStmt) stmtNode()        {}
-func (*RangeStmt) stmtNode()      {}
-
-// ----------------------------------------------------------------------------
-// Declarations
-
-// A Spec node represents a single (non-parenthesized) import,
-// constant, type, or variable declaration.
-//
-type (
-	// The Spec type stands for any of *ImportSpec, *ValueSpec, and *TypeSpec.
-	Spec interface {
-		Node
-		specNode()
-	}
-
-	// An ImportSpec node represents a single package import.
-	ImportSpec struct {
-		Doc     *CommentGroup // associated documentation; or nil
-		Name    *Ident        // local package name (including "."); or nil
-		Path    *BasicLit     // import path
-		Comment *CommentGroup // line comments; or nil
-		EndPos  token.Pos     // end of spec (overrides Path.Pos if nonzero)
-	}
-
-	// A ValueSpec node represents a constant or variable declaration
-	// (ConstSpec or VarSpec production).
-	//
-	ValueSpec struct {
-		Doc     *CommentGroup // associated documentation; or nil
-		Names   []*Ident      // value names (len(Names) > 0)
-		Type    Expr          // value type; or nil
-		Values  []Expr        // initial values; or nil
-		Comment *CommentGroup // line comments; or nil
-	}
-
-	// A TypeSpec node represents a type declaration (TypeSpec production).
-	TypeSpec struct {
-		Doc     *CommentGroup // associated documentation; or nil
-		Name    *Ident        // type name
-		Type    Expr          // *Ident, *ParenExpr, *SelectorExpr, *StarExpr, or any of the *XxxTypes
-		Comment *CommentGroup // line comments; or nil
-	}
-)
-
-// Pos and End implementations for spec nodes.
-//
-func (s *ImportSpec) Pos() token.Pos {
-	if s.Name != nil {
-		return s.Name.Pos()
-	}
-	return s.Path.Pos()
-}
-func (s *ValueSpec) Pos() token.Pos { return s.Names[0].Pos() }
-func (s *TypeSpec) Pos() token.Pos  { return s.Name.Pos() }
-
-func (s *ImportSpec) End() token.Pos {
-	if s.EndPos != 0 {
-		return s.EndPos
-	}
-	return s.Path.End()
-}
-
-func (s *ValueSpec) End() token.Pos {
-	if n := len(s.Values); n > 0 {
-		return s.Values[n-1].End()
-	}
-	if s.Type != nil {
-		return s.Type.End()
-	}
-	return s.Names[len(s.Names)-1].End()
-}
-func (s *TypeSpec) End() token.Pos { return s.Type.End() }
-
-// specNode() ensures that only spec nodes can be
-// assigned to a Spec.
-//
-func (*ImportSpec) specNode() {}
-func (*ValueSpec) specNode()  {}
-func (*TypeSpec) specNode()   {}
-
-// A declaration is represented by one of the following declaration nodes.
-//
-type (
-	// A BadDecl node is a placeholder for declarations containing
-	// syntax errors for which no correct declaration nodes can be
-	// created.
-	//
-	BadDecl struct {
-		From, To token.Pos // position range of bad declaration
-	}
-
-	// A GenDecl node (generic declaration node) represents an import,
-	// constant, type or variable declaration. A valid Lparen position
-	// (Lparen.Line > 0) indicates a parenthesized declaration.
-	//
-	// Relationship between Tok value and Specs element type:
-	//
-	//	token.IMPORT  *ImportSpec
-	//	token.CONST   *ValueSpec
-	//	token.TYPE    *TypeSpec
-	//	token.VAR     *ValueSpec
-	//
-	GenDecl struct {
-		Doc    *CommentGroup // associated documentation; or nil
-		TokPos token.Pos     // position of Tok
-		Tok    token.Token   // IMPORT, CONST, TYPE, VAR
-		Lparen token.Pos     // position of '(', if any
-		Specs  []Spec
-		Rparen token.Pos // position of ')', if any
-	}
-
-	// A FuncDecl node represents a function declaration.
-	FuncDecl struct {
-		Doc  *CommentGroup // associated documentation; or nil
-		Recv *FieldList    // receiver (methods); or nil (functions)
-		Name *Ident        // function/method name
-		Type *FuncType     // function signature: parameters, results, and position of "func" keyword
-		Body *BlockStmt    // function body; or nil (forward declaration)
-	}
-)
-
-// Pos and End implementations for declaration nodes.
-//
-func (d *BadDecl) Pos() token.Pos  { return d.From }
-func (d *GenDecl) Pos() token.Pos  { return d.TokPos }
-func (d *FuncDecl) Pos() token.Pos { return d.Type.Pos() }
-
-func (d *BadDecl) End() token.Pos { return d.To }
-func (d *GenDecl) End() token.Pos {
-	if d.Rparen.IsValid() {
-		return d.Rparen + 1
-	}
-	return d.Specs[0].End()
-}
-func (d *FuncDecl) End() token.Pos {
-	if d.Body != nil {
-		return d.Body.End()
-	}
-	return d.Type.End()
-}
-
-// declNode() ensures that only declaration nodes can be
-// assigned to a Decl.
-//
-func (*BadDecl) declNode()  {}
-func (*GenDecl) declNode()  {}
-func (*FuncDecl) declNode() {}
-
-// ----------------------------------------------------------------------------
-// Files and packages
-
-// A File node represents a Go source file.
-//
-// The Comments list contains all comments in the source file in order of
-// appearance, including the comments that are pointed to from other nodes
-// via Doc and Comment fields.
-//
-type File struct {
-	Doc        *CommentGroup   // associated documentation; or nil
-	Package    token.Pos       // position of "package" keyword
-	Name       *Ident          // package name
-	Decls      []Decl          // top-level declarations; or nil
-	Scope      *Scope          // package scope (this file only)
-	Imports    []*ImportSpec   // imports in this file
-	Unresolved []*Ident        // unresolved identifiers in this file
-	Comments   []*CommentGroup // list of all comments in the source file
-}
-
-func (f *File) Pos() token.Pos { return f.Package }
-func (f *File) End() token.Pos {
-	if n := len(f.Decls); n > 0 {
-		return f.Decls[n-1].End()
-	}
-	return f.Name.End()
-}
-
-// A Package node represents a set of source files
-// collectively building a Go package.
-//
-type Package struct {
-	Name    string             // package name
-	Scope   *Scope             // package scope across all files
-	Imports map[string]*Object // map of package id -> package object
-	Files   map[string]*File   // Go source files by filename
-}
-
-func (p *Package) Pos() token.Pos { return token.NoPos }
-func (p *Package) End() token.Pos { return token.NoPos }
diff --git a/third_party/gofrontend/libgo/go/go/ast/ast_test.go b/third_party/gofrontend/libgo/go/go/ast/ast_test.go
deleted file mode 100644
index 1a6a283..0000000
--- a/third_party/gofrontend/libgo/go/go/ast/ast_test.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ast
-
-import (
-	"testing"
-)
-
-var comments = []struct {
-	list []string
-	text string
-}{
-	{[]string{"//"}, ""},
-	{[]string{"//   "}, ""},
-	{[]string{"//", "//", "//   "}, ""},
-	{[]string{"// foo   "}, "foo\n"},
-	{[]string{"//", "//", "// foo"}, "foo\n"},
-	{[]string{"// foo  bar  "}, "foo  bar\n"},
-	{[]string{"// foo", "// bar"}, "foo\nbar\n"},
-	{[]string{"// foo", "//", "//", "//", "// bar"}, "foo\n\nbar\n"},
-	{[]string{"// foo", "/* bar */"}, "foo\n bar\n"},
-	{[]string{"//", "//", "//", "// foo", "//", "//", "//"}, "foo\n"},
-
-	{[]string{"/**/"}, ""},
-	{[]string{"/*   */"}, ""},
-	{[]string{"/**/", "/**/", "/*   */"}, ""},
-	{[]string{"/* Foo   */"}, " Foo\n"},
-	{[]string{"/* Foo  Bar  */"}, " Foo  Bar\n"},
-	{[]string{"/* Foo*/", "/* Bar*/"}, " Foo\n Bar\n"},
-	{[]string{"/* Foo*/", "/**/", "/**/", "/**/", "// Bar"}, " Foo\n\nBar\n"},
-	{[]string{"/* Foo*/", "/*\n*/", "//", "/*\n*/", "// Bar"}, " Foo\n\nBar\n"},
-	{[]string{"/* Foo*/", "// Bar"}, " Foo\nBar\n"},
-	{[]string{"/* Foo\n Bar*/"}, " Foo\n Bar\n"},
-}
-
-func TestCommentText(t *testing.T) {
-	for i, c := range comments {
-		list := make([]*Comment, len(c.list))
-		for i, s := range c.list {
-			list[i] = &Comment{Text: s}
-		}
-
-		text := (&CommentGroup{list}).Text()
-		if text != c.text {
-			t.Errorf("case %d: got %q; expected %q", i, text, c.text)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/ast/commentmap.go b/third_party/gofrontend/libgo/go/go/ast/commentmap.go
deleted file mode 100644
index ac999d6..0000000
--- a/third_party/gofrontend/libgo/go/go/ast/commentmap.go
+++ /dev/null
@@ -1,332 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ast
-
-import (
-	"bytes"
-	"fmt"
-	"go/token"
-	"sort"
-)
-
-type byPos []*CommentGroup
-
-func (a byPos) Len() int           { return len(a) }
-func (a byPos) Less(i, j int) bool { return a[i].Pos() < a[j].Pos() }
-func (a byPos) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-
-// sortComments sorts the list of comment groups in source order.
-//
-func sortComments(list []*CommentGroup) {
-	// TODO(gri): Does it make sense to check for sorted-ness
-	//            first (because we know that sorted-ness is
-	//            very likely)?
-	if orderedList := byPos(list); !sort.IsSorted(orderedList) {
-		sort.Sort(orderedList)
-	}
-}
-
-// A CommentMap maps an AST node to a list of comment groups
-// associated with it. See NewCommentMap for a description of
-// the association.
-//
-type CommentMap map[Node][]*CommentGroup
-
-func (cmap CommentMap) addComment(n Node, c *CommentGroup) {
-	list := cmap[n]
-	if len(list) == 0 {
-		list = []*CommentGroup{c}
-	} else {
-		list = append(list, c)
-	}
-	cmap[n] = list
-}
-
-type byInterval []Node
-
-func (a byInterval) Len() int { return len(a) }
-func (a byInterval) Less(i, j int) bool {
-	pi, pj := a[i].Pos(), a[j].Pos()
-	return pi < pj || pi == pj && a[i].End() > a[j].End()
-}
-func (a byInterval) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
-
-// nodeList returns the list of nodes of the AST n in source order.
-//
-func nodeList(n Node) []Node {
-	var list []Node
-	Inspect(n, func(n Node) bool {
-		// don't collect comments
-		switch n.(type) {
-		case nil, *CommentGroup, *Comment:
-			return false
-		}
-		list = append(list, n)
-		return true
-	})
-	// Note: The current implementation assumes that Inspect traverses the
-	//       AST in depth-first and thus _source_ order. If AST traversal
-	//       does not follow source order, the sorting call below will be
-	//       required.
-	// sort.Sort(byInterval(list))
-	return list
-}
-
-// A commentListReader helps iterating through a list of comment groups.
-//
-type commentListReader struct {
-	fset     *token.FileSet
-	list     []*CommentGroup
-	index    int
-	comment  *CommentGroup  // comment group at current index
-	pos, end token.Position // source interval of comment group at current index
-}
-
-func (r *commentListReader) eol() bool {
-	return r.index >= len(r.list)
-}
-
-func (r *commentListReader) next() {
-	if !r.eol() {
-		r.comment = r.list[r.index]
-		r.pos = r.fset.Position(r.comment.Pos())
-		r.end = r.fset.Position(r.comment.End())
-		r.index++
-	}
-}
-
-// A nodeStack keeps track of nested nodes.
-// A node lower on the stack lexically contains the nodes higher on the stack.
-//
-type nodeStack []Node
-
-// push pops all nodes that appear lexically before n
-// and then pushes n on the stack.
-//
-func (s *nodeStack) push(n Node) {
-	s.pop(n.Pos())
-	*s = append((*s), n)
-}
-
-// pop pops all nodes that appear lexically before pos
-// (i.e., whose lexical extent has ended before or at pos).
-// It returns the last node popped.
-//
-func (s *nodeStack) pop(pos token.Pos) (top Node) {
-	i := len(*s)
-	for i > 0 && (*s)[i-1].End() <= pos {
-		top = (*s)[i-1]
-		i--
-	}
-	*s = (*s)[0:i]
-	return top
-}
-
-// NewCommentMap creates a new comment map by associating comment groups
-// of the comments list with the nodes of the AST specified by node.
-//
-// A comment group g is associated with a node n if:
-//
-//   - g starts on the same line as n ends
-//   - g starts on the line immediately following n, and there is
-//     at least one empty line after g and before the next node
-//   - g starts before n and is not associated to the node before n
-//     via the previous rules
-//
-// NewCommentMap tries to associate a comment group to the "largest"
-// node possible: For instance, if the comment is a line comment
-// trailing an assignment, the comment is associated with the entire
-// assignment rather than just the last operand in the assignment.
-//
-func NewCommentMap(fset *token.FileSet, node Node, comments []*CommentGroup) CommentMap {
-	if len(comments) == 0 {
-		return nil // no comments to map
-	}
-
-	cmap := make(CommentMap)
-
-	// set up comment reader r
-	tmp := make([]*CommentGroup, len(comments))
-	copy(tmp, comments) // don't change incoming comments
-	sortComments(tmp)
-	r := commentListReader{fset: fset, list: tmp} // !r.eol() because len(comments) > 0
-	r.next()
-
-	// create node list in lexical order
-	nodes := nodeList(node)
-	nodes = append(nodes, nil) // append sentinel
-
-	// set up iteration variables
-	var (
-		p     Node           // previous node
-		pend  token.Position // end of p
-		pg    Node           // previous node group (enclosing nodes of "importance")
-		pgend token.Position // end of pg
-		stack nodeStack      // stack of node groups
-	)
-
-	for _, q := range nodes {
-		var qpos token.Position
-		if q != nil {
-			qpos = fset.Position(q.Pos()) // current node position
-		} else {
-			// set fake sentinel position to infinity so that
-			// all comments get processed before the sentinel
-			const infinity = 1 << 30
-			qpos.Offset = infinity
-			qpos.Line = infinity
-		}
-
-		// process comments before current node
-		for r.end.Offset <= qpos.Offset {
-			// determine recent node group
-			if top := stack.pop(r.comment.Pos()); top != nil {
-				pg = top
-				pgend = fset.Position(pg.End())
-			}
-			// Try to associate a comment first with a node group
-			// (i.e., a node of "importance" such as a declaration);
-			// if that fails, try to associate it with the most recent
-			// node.
-			// TODO(gri) try to simplify the logic below
-			var assoc Node
-			switch {
-			case pg != nil &&
-				(pgend.Line == r.pos.Line ||
-					pgend.Line+1 == r.pos.Line && r.end.Line+1 < qpos.Line):
-				// 1) comment starts on same line as previous node group ends, or
-				// 2) comment starts on the line immediately after the
-				//    previous node group and there is an empty line before
-				//    the current node
-				// => associate comment with previous node group
-				assoc = pg
-			case p != nil &&
-				(pend.Line == r.pos.Line ||
-					pend.Line+1 == r.pos.Line && r.end.Line+1 < qpos.Line ||
-					q == nil):
-				// same rules apply as above for p rather than pg,
-				// but also associate with p if we are at the end (q == nil)
-				assoc = p
-			default:
-				// otherwise, associate comment with current node
-				if q == nil {
-					// we can only reach here if there was no p
-					// which would imply that there were no nodes
-					panic("internal error: no comments should be associated with sentinel")
-				}
-				assoc = q
-			}
-			cmap.addComment(assoc, r.comment)
-			if r.eol() {
-				return cmap
-			}
-			r.next()
-		}
-
-		// update previous node
-		p = q
-		pend = fset.Position(p.End())
-
-		// update previous node group if we see an "important" node
-		switch q.(type) {
-		case *File, *Field, Decl, Spec, Stmt:
-			stack.push(q)
-		}
-	}
-
-	return cmap
-}
-
-// Update replaces an old node in the comment map with the new node
-// and returns the new node. Comments that were associated with the
-// old node are associated with the new node.
-//
-func (cmap CommentMap) Update(old, new Node) Node {
-	if list := cmap[old]; len(list) > 0 {
-		delete(cmap, old)
-		cmap[new] = append(cmap[new], list...)
-	}
-	return new
-}
-
-// Filter returns a new comment map consisting of only those
-// entries of cmap for which a corresponding node exists in
-// the AST specified by node.
-//
-func (cmap CommentMap) Filter(node Node) CommentMap {
-	umap := make(CommentMap)
-	Inspect(node, func(n Node) bool {
-		if g := cmap[n]; len(g) > 0 {
-			umap[n] = g
-		}
-		return true
-	})
-	return umap
-}
-
-// Comments returns the list of comment groups in the comment map.
-// The result is sorted is source order.
-//
-func (cmap CommentMap) Comments() []*CommentGroup {
-	list := make([]*CommentGroup, 0, len(cmap))
-	for _, e := range cmap {
-		list = append(list, e...)
-	}
-	sortComments(list)
-	return list
-}
-
-func summary(list []*CommentGroup) string {
-	const maxLen = 40
-	var buf bytes.Buffer
-
-	// collect comments text
-loop:
-	for _, group := range list {
-		// Note: CommentGroup.Text() does too much work for what we
-		//       need and would only replace this innermost loop.
-		//       Just do it explicitly.
-		for _, comment := range group.List {
-			if buf.Len() >= maxLen {
-				break loop
-			}
-			buf.WriteString(comment.Text)
-		}
-	}
-
-	// truncate if too long
-	if buf.Len() > maxLen {
-		buf.Truncate(maxLen - 3)
-		buf.WriteString("...")
-	}
-
-	// replace any invisibles with blanks
-	bytes := buf.Bytes()
-	for i, b := range bytes {
-		switch b {
-		case '\t', '\n', '\r':
-			bytes[i] = ' '
-		}
-	}
-
-	return string(bytes)
-}
-
-func (cmap CommentMap) String() string {
-	var buf bytes.Buffer
-	fmt.Fprintln(&buf, "CommentMap {")
-	for node, comment := range cmap {
-		// print name of identifiers; print node type for other nodes
-		var s string
-		if ident, ok := node.(*Ident); ok {
-			s = ident.Name
-		} else {
-			s = fmt.Sprintf("%T", node)
-		}
-		fmt.Fprintf(&buf, "\t%p  %20s:  %s\n", node, s, summary(comment))
-	}
-	fmt.Fprintln(&buf, "}")
-	return buf.String()
-}
diff --git a/third_party/gofrontend/libgo/go/go/ast/commentmap_test.go b/third_party/gofrontend/libgo/go/go/ast/commentmap_test.go
deleted file mode 100644
index e372eab..0000000
--- a/third_party/gofrontend/libgo/go/go/ast/commentmap_test.go
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// To avoid a cyclic dependency with go/parser, this file is in a separate package.
-
-package ast_test
-
-import (
-	"bytes"
-	"fmt"
-	. "go/ast"
-	"go/parser"
-	"go/token"
-	"sort"
-	"testing"
-)
-
-const src = `
-// the very first comment
-
-// package p
-package p /* the name is p */
-
-// imports
-import (
-	"bytes"     // bytes
-	"fmt"       // fmt
-	"go/ast"
-	"go/parser"
-)
-
-// T
-type T struct {
-	a, b, c int // associated with a, b, c
-	// associated with x, y
-	x, y float64    // float values
-	z    complex128 // complex value
-}
-// also associated with T
-
-// x
-var x = 0 // x = 0
-// also associated with x
-
-// f1
-func f1() {
-	/* associated with s1 */
-	s1()
-	// also associated with s1
-	
-	// associated with s2
-	
-	// also associated with s2
-	s2() // line comment for s2
-}
-// associated with f1
-// also associated with f1
-
-// associated with f2
-
-// f2
-func f2() {
-}
-
-func f3() {
-	i := 1 /* 1 */ + 2 // addition
-	_ = i
-}
-
-// the very last comment
-`
-
-// res maps a key of the form "line number: node type"
-// to the associated comments' text.
-//
-var res = map[string]string{
-	" 5: *ast.File":       "the very first comment\npackage p\n",
-	" 5: *ast.Ident":      " the name is p\n",
-	" 8: *ast.GenDecl":    "imports\n",
-	" 9: *ast.ImportSpec": "bytes\n",
-	"10: *ast.ImportSpec": "fmt\n",
-	"16: *ast.GenDecl":    "T\nalso associated with T\n",
-	"17: *ast.Field":      "associated with a, b, c\n",
-	"19: *ast.Field":      "associated with x, y\nfloat values\n",
-	"20: *ast.Field":      "complex value\n",
-	"25: *ast.GenDecl":    "x\nx = 0\nalso associated with x\n",
-	"29: *ast.FuncDecl":   "f1\nassociated with f1\nalso associated with f1\n",
-	"31: *ast.ExprStmt":   " associated with s1\nalso associated with s1\n",
-	"37: *ast.ExprStmt":   "associated with s2\nalso associated with s2\nline comment for s2\n",
-	"45: *ast.FuncDecl":   "associated with f2\nf2\n",
-	"49: *ast.AssignStmt": "addition\n",
-	"49: *ast.BasicLit":   " 1\n",
-	"50: *ast.Ident":      "the very last comment\n",
-}
-
-func ctext(list []*CommentGroup) string {
-	var buf bytes.Buffer
-	for _, g := range list {
-		buf.WriteString(g.Text())
-	}
-	return buf.String()
-}
-
-func TestCommentMap(t *testing.T) {
-	fset := token.NewFileSet()
-	f, err := parser.ParseFile(fset, "", src, parser.ParseComments)
-	if err != nil {
-		t.Fatal(err)
-	}
-	cmap := NewCommentMap(fset, f, f.Comments)
-
-	// very correct association of comments
-	for n, list := range cmap {
-		key := fmt.Sprintf("%2d: %T", fset.Position(n.Pos()).Line, n)
-		got := ctext(list)
-		want := res[key]
-		if got != want {
-			t.Errorf("%s: got %q; want %q", key, got, want)
-		}
-	}
-
-	// verify that no comments got lost
-	if n := len(cmap.Comments()); n != len(f.Comments) {
-		t.Errorf("got %d comment groups in map; want %d", n, len(f.Comments))
-	}
-
-	// support code to update test:
-	// set genMap to true to generate res map
-	const genMap = false
-	if genMap {
-		out := make([]string, 0, len(cmap))
-		for n, list := range cmap {
-			out = append(out, fmt.Sprintf("\t\"%2d: %T\":\t%q,", fset.Position(n.Pos()).Line, n, ctext(list)))
-		}
-		sort.Strings(out)
-		for _, s := range out {
-			fmt.Println(s)
-		}
-	}
-}
-
-// TODO(gri): add tests for Filter.
diff --git a/third_party/gofrontend/libgo/go/go/ast/filter.go b/third_party/gofrontend/libgo/go/go/ast/filter.go
deleted file mode 100644
index bb57116..0000000
--- a/third_party/gofrontend/libgo/go/go/ast/filter.go
+++ /dev/null
@@ -1,465 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ast
-
-import (
-	"go/token"
-	"sort"
-)
-
-// ----------------------------------------------------------------------------
-// Export filtering
-
-// exportFilter is a special filter function to extract exported nodes.
-func exportFilter(name string) bool {
-	return IsExported(name)
-}
-
-// FileExports trims the AST for a Go source file in place such that
-// only exported nodes remain: all top-level identifiers which are not exported
-// and their associated information (such as type, initial value, or function
-// body) are removed. Non-exported fields and methods of exported types are
-// stripped. The File.Comments list is not changed.
-//
-// FileExports reports whether there are exported declarations.
-//
-func FileExports(src *File) bool {
-	return filterFile(src, exportFilter, true)
-}
-
-// PackageExports trims the AST for a Go package in place such that
-// only exported nodes remain. The pkg.Files list is not changed, so that
-// file names and top-level package comments don't get lost.
-//
-// PackageExports reports whether there are exported declarations;
-// it returns false otherwise.
-//
-func PackageExports(pkg *Package) bool {
-	return filterPackage(pkg, exportFilter, true)
-}
-
-// ----------------------------------------------------------------------------
-// General filtering
-
-type Filter func(string) bool
-
-func filterIdentList(list []*Ident, f Filter) []*Ident {
-	j := 0
-	for _, x := range list {
-		if f(x.Name) {
-			list[j] = x
-			j++
-		}
-	}
-	return list[0:j]
-}
-
-// fieldName assumes that x is the type of an anonymous field and
-// returns the corresponding field name. If x is not an acceptable
-// anonymous field, the result is nil.
-//
-func fieldName(x Expr) *Ident {
-	switch t := x.(type) {
-	case *Ident:
-		return t
-	case *SelectorExpr:
-		if _, ok := t.X.(*Ident); ok {
-			return t.Sel
-		}
-	case *StarExpr:
-		return fieldName(t.X)
-	}
-	return nil
-}
-
-func filterFieldList(fields *FieldList, filter Filter, export bool) (removedFields bool) {
-	if fields == nil {
-		return false
-	}
-	list := fields.List
-	j := 0
-	for _, f := range list {
-		keepField := false
-		if len(f.Names) == 0 {
-			// anonymous field
-			name := fieldName(f.Type)
-			keepField = name != nil && filter(name.Name)
-		} else {
-			n := len(f.Names)
-			f.Names = filterIdentList(f.Names, filter)
-			if len(f.Names) < n {
-				removedFields = true
-			}
-			keepField = len(f.Names) > 0
-		}
-		if keepField {
-			if export {
-				filterType(f.Type, filter, export)
-			}
-			list[j] = f
-			j++
-		}
-	}
-	if j < len(list) {
-		removedFields = true
-	}
-	fields.List = list[0:j]
-	return
-}
-
-func filterParamList(fields *FieldList, filter Filter, export bool) bool {
-	if fields == nil {
-		return false
-	}
-	var b bool
-	for _, f := range fields.List {
-		if filterType(f.Type, filter, export) {
-			b = true
-		}
-	}
-	return b
-}
-
-func filterType(typ Expr, f Filter, export bool) bool {
-	switch t := typ.(type) {
-	case *Ident:
-		return f(t.Name)
-	case *ParenExpr:
-		return filterType(t.X, f, export)
-	case *ArrayType:
-		return filterType(t.Elt, f, export)
-	case *StructType:
-		if filterFieldList(t.Fields, f, export) {
-			t.Incomplete = true
-		}
-		return len(t.Fields.List) > 0
-	case *FuncType:
-		b1 := filterParamList(t.Params, f, export)
-		b2 := filterParamList(t.Results, f, export)
-		return b1 || b2
-	case *InterfaceType:
-		if filterFieldList(t.Methods, f, export) {
-			t.Incomplete = true
-		}
-		return len(t.Methods.List) > 0
-	case *MapType:
-		b1 := filterType(t.Key, f, export)
-		b2 := filterType(t.Value, f, export)
-		return b1 || b2
-	case *ChanType:
-		return filterType(t.Value, f, export)
-	}
-	return false
-}
-
-func filterSpec(spec Spec, f Filter, export bool) bool {
-	switch s := spec.(type) {
-	case *ValueSpec:
-		s.Names = filterIdentList(s.Names, f)
-		if len(s.Names) > 0 {
-			if export {
-				filterType(s.Type, f, export)
-			}
-			return true
-		}
-	case *TypeSpec:
-		if f(s.Name.Name) {
-			if export {
-				filterType(s.Type, f, export)
-			}
-			return true
-		}
-		if !export {
-			// For general filtering (not just exports),
-			// filter type even if name is not filtered
-			// out.
-			// If the type contains filtered elements,
-			// keep the declaration.
-			return filterType(s.Type, f, export)
-		}
-	}
-	return false
-}
-
-func filterSpecList(list []Spec, f Filter, export bool) []Spec {
-	j := 0
-	for _, s := range list {
-		if filterSpec(s, f, export) {
-			list[j] = s
-			j++
-		}
-	}
-	return list[0:j]
-}
-
-// FilterDecl trims the AST for a Go declaration in place by removing
-// all names (including struct field and interface method names, but
-// not from parameter lists) that don't pass through the filter f.
-//
-// FilterDecl reports whether there are any declared names left after
-// filtering.
-//
-func FilterDecl(decl Decl, f Filter) bool {
-	return filterDecl(decl, f, false)
-}
-
-func filterDecl(decl Decl, f Filter, export bool) bool {
-	switch d := decl.(type) {
-	case *GenDecl:
-		d.Specs = filterSpecList(d.Specs, f, export)
-		return len(d.Specs) > 0
-	case *FuncDecl:
-		return f(d.Name.Name)
-	}
-	return false
-}
-
-// FilterFile trims the AST for a Go file in place by removing all
-// names from top-level declarations (including struct field and
-// interface method names, but not from parameter lists) that don't
-// pass through the filter f. If the declaration is empty afterwards,
-// the declaration is removed from the AST. Import declarations are
-// always removed. The File.Comments list is not changed.
-//
-// FilterFile reports whether there are any top-level declarations
-// left after filtering.
-//
-func FilterFile(src *File, f Filter) bool {
-	return filterFile(src, f, false)
-}
-
-func filterFile(src *File, f Filter, export bool) bool {
-	j := 0
-	for _, d := range src.Decls {
-		if filterDecl(d, f, export) {
-			src.Decls[j] = d
-			j++
-		}
-	}
-	src.Decls = src.Decls[0:j]
-	return j > 0
-}
-
-// FilterPackage trims the AST for a Go package in place by removing
-// all names from top-level declarations (including struct field and
-// interface method names, but not from parameter lists) that don't
-// pass through the filter f. If the declaration is empty afterwards,
-// the declaration is removed from the AST. The pkg.Files list is not
-// changed, so that file names and top-level package comments don't get
-// lost.
-//
-// FilterPackage reports whether there are any top-level declarations
-// left after filtering.
-//
-func FilterPackage(pkg *Package, f Filter) bool {
-	return filterPackage(pkg, f, false)
-}
-
-func filterPackage(pkg *Package, f Filter, export bool) bool {
-	hasDecls := false
-	for _, src := range pkg.Files {
-		if filterFile(src, f, export) {
-			hasDecls = true
-		}
-	}
-	return hasDecls
-}
-
-// ----------------------------------------------------------------------------
-// Merging of package files
-
-// The MergeMode flags control the behavior of MergePackageFiles.
-type MergeMode uint
-
-const (
-	// If set, duplicate function declarations are excluded.
-	FilterFuncDuplicates MergeMode = 1 << iota
-	// If set, comments that are not associated with a specific
-	// AST node (as Doc or Comment) are excluded.
-	FilterUnassociatedComments
-	// If set, duplicate import declarations are excluded.
-	FilterImportDuplicates
-)
-
-// nameOf returns the function (foo) or method name (foo.bar) for
-// the given function declaration. If the AST is incorrect for the
-// receiver, it assumes a function instead.
-//
-func nameOf(f *FuncDecl) string {
-	if r := f.Recv; r != nil && len(r.List) == 1 {
-		// looks like a correct receiver declaration
-		t := r.List[0].Type
-		// dereference pointer receiver types
-		if p, _ := t.(*StarExpr); p != nil {
-			t = p.X
-		}
-		// the receiver type must be a type name
-		if p, _ := t.(*Ident); p != nil {
-			return p.Name + "." + f.Name.Name
-		}
-		// otherwise assume a function instead
-	}
-	return f.Name.Name
-}
-
-// separator is an empty //-style comment that is interspersed between
-// different comment groups when they are concatenated into a single group
-//
-var separator = &Comment{token.NoPos, "//"}
-
-// MergePackageFiles creates a file AST by merging the ASTs of the
-// files belonging to a package. The mode flags control merging behavior.
-//
-func MergePackageFiles(pkg *Package, mode MergeMode) *File {
-	// Count the number of package docs, comments and declarations across
-	// all package files. Also, compute sorted list of filenames, so that
-	// subsequent iterations can always iterate in the same order.
-	ndocs := 0
-	ncomments := 0
-	ndecls := 0
-	filenames := make([]string, len(pkg.Files))
-	i := 0
-	for filename, f := range pkg.Files {
-		filenames[i] = filename
-		i++
-		if f.Doc != nil {
-			ndocs += len(f.Doc.List) + 1 // +1 for separator
-		}
-		ncomments += len(f.Comments)
-		ndecls += len(f.Decls)
-	}
-	sort.Strings(filenames)
-
-	// Collect package comments from all package files into a single
-	// CommentGroup - the collected package documentation. In general
-	// there should be only one file with a package comment; but it's
-	// better to collect extra comments than drop them on the floor.
-	var doc *CommentGroup
-	var pos token.Pos
-	if ndocs > 0 {
-		list := make([]*Comment, ndocs-1) // -1: no separator before first group
-		i := 0
-		for _, filename := range filenames {
-			f := pkg.Files[filename]
-			if f.Doc != nil {
-				if i > 0 {
-					// not the first group - add separator
-					list[i] = separator
-					i++
-				}
-				for _, c := range f.Doc.List {
-					list[i] = c
-					i++
-				}
-				if f.Package > pos {
-					// Keep the maximum package clause position as
-					// position for the package clause of the merged
-					// files.
-					pos = f.Package
-				}
-			}
-		}
-		doc = &CommentGroup{list}
-	}
-
-	// Collect declarations from all package files.
-	var decls []Decl
-	if ndecls > 0 {
-		decls = make([]Decl, ndecls)
-		funcs := make(map[string]int) // map of func name -> decls index
-		i := 0                        // current index
-		n := 0                        // number of filtered entries
-		for _, filename := range filenames {
-			f := pkg.Files[filename]
-			for _, d := range f.Decls {
-				if mode&FilterFuncDuplicates != 0 {
-					// A language entity may be declared multiple
-					// times in different package files; only at
-					// build time declarations must be unique.
-					// For now, exclude multiple declarations of
-					// functions - keep the one with documentation.
-					//
-					// TODO(gri): Expand this filtering to other
-					//            entities (const, type, vars) if
-					//            multiple declarations are common.
-					if f, isFun := d.(*FuncDecl); isFun {
-						name := nameOf(f)
-						if j, exists := funcs[name]; exists {
-							// function declared already
-							if decls[j] != nil && decls[j].(*FuncDecl).Doc == nil {
-								// existing declaration has no documentation;
-								// ignore the existing declaration
-								decls[j] = nil
-							} else {
-								// ignore the new declaration
-								d = nil
-							}
-							n++ // filtered an entry
-						} else {
-							funcs[name] = i
-						}
-					}
-				}
-				decls[i] = d
-				i++
-			}
-		}
-
-		// Eliminate nil entries from the decls list if entries were
-		// filtered. We do this using a 2nd pass in order to not disturb
-		// the original declaration order in the source (otherwise, this
-		// would also invalidate the monotonically increasing position
-		// info within a single file).
-		if n > 0 {
-			i = 0
-			for _, d := range decls {
-				if d != nil {
-					decls[i] = d
-					i++
-				}
-			}
-			decls = decls[0:i]
-		}
-	}
-
-	// Collect import specs from all package files.
-	var imports []*ImportSpec
-	if mode&FilterImportDuplicates != 0 {
-		seen := make(map[string]bool)
-		for _, filename := range filenames {
-			f := pkg.Files[filename]
-			for _, imp := range f.Imports {
-				if path := imp.Path.Value; !seen[path] {
-					// TODO: consider handling cases where:
-					// - 2 imports exist with the same import path but
-					//   have different local names (one should probably
-					//   keep both of them)
-					// - 2 imports exist but only one has a comment
-					// - 2 imports exist and they both have (possibly
-					//   different) comments
-					imports = append(imports, imp)
-					seen[path] = true
-				}
-			}
-		}
-	} else {
-		for _, f := range pkg.Files {
-			imports = append(imports, f.Imports...)
-		}
-	}
-
-	// Collect comments from all package files.
-	var comments []*CommentGroup
-	if mode&FilterUnassociatedComments == 0 {
-		comments = make([]*CommentGroup, ncomments)
-		i := 0
-		for _, f := range pkg.Files {
-			i += copy(comments[i:], f.Comments)
-		}
-	}
-
-	// TODO(gri) need to compute unresolved identifiers!
-	return &File{doc, pos, NewIdent(pkg.Name), decls, pkg.Scope, imports, nil, comments}
-}
diff --git a/third_party/gofrontend/libgo/go/go/ast/filter_test.go b/third_party/gofrontend/libgo/go/go/ast/filter_test.go
deleted file mode 100644
index 9fd86cb..0000000
--- a/third_party/gofrontend/libgo/go/go/ast/filter_test.go
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// To avoid a cyclic dependency with go/parser, this file is in a separate package.
-
-package ast_test
-
-import (
-	"bytes"
-	"go/ast"
-	"go/format"
-	"go/parser"
-	"go/token"
-	"testing"
-)
-
-const input = `package p
-
-type t1 struct{}
-type t2 struct{}
-
-func f1() {}
-func f1() {}
-func f2() {}
-
-func (*t1) f1() {}
-func (t1) f1() {}
-func (t1) f2() {}
-
-func (t2) f1() {}
-func (t2) f2() {}
-func (x *t2) f2() {}
-`
-
-// Calling ast.MergePackageFiles with ast.FilterFuncDuplicates
-// keeps a duplicate entry with attached documentation in favor
-// of one without, and it favors duplicate entries appearing
-// later in the source over ones appearing earlier. This is why
-// (*t2).f2 is kept and t2.f2 is eliminated in this test case.
-//
-const golden = `package p
-
-type t1 struct{}
-type t2 struct{}
-
-func f1() {}
-func f2() {}
-
-func (t1) f1() {}
-func (t1) f2() {}
-
-func (t2) f1() {}
-
-func (x *t2) f2() {}
-`
-
-func TestFilterDuplicates(t *testing.T) {
-	// parse input
-	fset := token.NewFileSet()
-	file, err := parser.ParseFile(fset, "", input, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// create package
-	files := map[string]*ast.File{"": file}
-	pkg, err := ast.NewPackage(fset, files, nil, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// filter
-	merged := ast.MergePackageFiles(pkg, ast.FilterFuncDuplicates)
-
-	// pretty-print
-	var buf bytes.Buffer
-	if err := format.Node(&buf, fset, merged); err != nil {
-		t.Fatal(err)
-	}
-	output := buf.String()
-
-	if output != golden {
-		t.Errorf("incorrect output:\n%s", output)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/ast/import.go b/third_party/gofrontend/libgo/go/go/ast/import.go
deleted file mode 100644
index d2770d1..0000000
--- a/third_party/gofrontend/libgo/go/go/ast/import.go
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ast
-
-import (
-	"go/token"
-	"sort"
-	"strconv"
-)
-
-// SortImports sorts runs of consecutive import lines in import blocks in f.
-// It also removes duplicate imports when it is possible to do so without data loss.
-func SortImports(fset *token.FileSet, f *File) {
-	for _, d := range f.Decls {
-		d, ok := d.(*GenDecl)
-		if !ok || d.Tok != token.IMPORT {
-			// Not an import declaration, so we're done.
-			// Imports are always first.
-			break
-		}
-
-		if !d.Lparen.IsValid() {
-			// Not a block: sorted by default.
-			continue
-		}
-
-		// Identify and sort runs of specs on successive lines.
-		i := 0
-		specs := d.Specs[:0]
-		for j, s := range d.Specs {
-			if j > i && fset.Position(s.Pos()).Line > 1+fset.Position(d.Specs[j-1].End()).Line {
-				// j begins a new run.  End this one.
-				specs = append(specs, sortSpecs(fset, f, d.Specs[i:j])...)
-				i = j
-			}
-		}
-		specs = append(specs, sortSpecs(fset, f, d.Specs[i:])...)
-		d.Specs = specs
-
-		// Deduping can leave a blank line before the rparen; clean that up.
-		if len(d.Specs) > 0 {
-			lastSpec := d.Specs[len(d.Specs)-1]
-			lastLine := fset.Position(lastSpec.Pos()).Line
-			if rParenLine := fset.Position(d.Rparen).Line; rParenLine > lastLine+1 {
-				fset.File(d.Rparen).MergeLine(rParenLine - 1)
-			}
-		}
-	}
-}
-
-func importPath(s Spec) string {
-	t, err := strconv.Unquote(s.(*ImportSpec).Path.Value)
-	if err == nil {
-		return t
-	}
-	return ""
-}
-
-func importName(s Spec) string {
-	n := s.(*ImportSpec).Name
-	if n == nil {
-		return ""
-	}
-	return n.Name
-}
-
-func importComment(s Spec) string {
-	c := s.(*ImportSpec).Comment
-	if c == nil {
-		return ""
-	}
-	return c.Text()
-}
-
-// collapse indicates whether prev may be removed, leaving only next.
-func collapse(prev, next Spec) bool {
-	if importPath(next) != importPath(prev) || importName(next) != importName(prev) {
-		return false
-	}
-	return prev.(*ImportSpec).Comment == nil
-}
-
-type posSpan struct {
-	Start token.Pos
-	End   token.Pos
-}
-
-func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec {
-	// Can't short-circuit here even if specs are already sorted,
-	// since they might yet need deduplication.
-	// A lone import, however, may be safely ignored.
-	if len(specs) <= 1 {
-		return specs
-	}
-
-	// Record positions for specs.
-	pos := make([]posSpan, len(specs))
-	for i, s := range specs {
-		pos[i] = posSpan{s.Pos(), s.End()}
-	}
-
-	// Identify comments in this range.
-	// Any comment from pos[0].Start to the final line counts.
-	lastLine := fset.Position(pos[len(pos)-1].End).Line
-	cstart := len(f.Comments)
-	cend := len(f.Comments)
-	for i, g := range f.Comments {
-		if g.Pos() < pos[0].Start {
-			continue
-		}
-		if i < cstart {
-			cstart = i
-		}
-		if fset.Position(g.End()).Line > lastLine {
-			cend = i
-			break
-		}
-	}
-	comments := f.Comments[cstart:cend]
-
-	// Assign each comment to the import spec preceding it.
-	importComment := map[*ImportSpec][]*CommentGroup{}
-	specIndex := 0
-	for _, g := range comments {
-		for specIndex+1 < len(specs) && pos[specIndex+1].Start <= g.Pos() {
-			specIndex++
-		}
-		s := specs[specIndex].(*ImportSpec)
-		importComment[s] = append(importComment[s], g)
-	}
-
-	// Sort the import specs by import path.
-	// Remove duplicates, when possible without data loss.
-	// Reassign the import paths to have the same position sequence.
-	// Reassign each comment to abut the end of its spec.
-	// Sort the comments by new position.
-	sort.Sort(byImportSpec(specs))
-
-	// Dedup. Thanks to our sorting, we can just consider
-	// adjacent pairs of imports.
-	deduped := specs[:0]
-	for i, s := range specs {
-		if i == len(specs)-1 || !collapse(s, specs[i+1]) {
-			deduped = append(deduped, s)
-		} else {
-			p := s.Pos()
-			fset.File(p).MergeLine(fset.Position(p).Line)
-		}
-	}
-	specs = deduped
-
-	// Fix up comment positions
-	for i, s := range specs {
-		s := s.(*ImportSpec)
-		if s.Name != nil {
-			s.Name.NamePos = pos[i].Start
-		}
-		s.Path.ValuePos = pos[i].Start
-		s.EndPos = pos[i].End
-		for _, g := range importComment[s] {
-			for _, c := range g.List {
-				c.Slash = pos[i].End
-			}
-		}
-	}
-
-	sort.Sort(byCommentPos(comments))
-
-	return specs
-}
-
-type byImportSpec []Spec // slice of *ImportSpec
-
-func (x byImportSpec) Len() int      { return len(x) }
-func (x byImportSpec) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
-func (x byImportSpec) Less(i, j int) bool {
-	ipath := importPath(x[i])
-	jpath := importPath(x[j])
-	if ipath != jpath {
-		return ipath < jpath
-	}
-	iname := importName(x[i])
-	jname := importName(x[j])
-	if iname != jname {
-		return iname < jname
-	}
-	return importComment(x[i]) < importComment(x[j])
-}
-
-type byCommentPos []*CommentGroup
-
-func (x byCommentPos) Len() int           { return len(x) }
-func (x byCommentPos) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }
-func (x byCommentPos) Less(i, j int) bool { return x[i].Pos() < x[j].Pos() }
diff --git a/third_party/gofrontend/libgo/go/go/ast/print.go b/third_party/gofrontend/libgo/go/go/ast/print.go
deleted file mode 100644
index f15dc11..0000000
--- a/third_party/gofrontend/libgo/go/go/ast/print.go
+++ /dev/null
@@ -1,251 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains printing support for ASTs.
-
-package ast
-
-import (
-	"fmt"
-	"go/token"
-	"io"
-	"os"
-	"reflect"
-)
-
-// A FieldFilter may be provided to Fprint to control the output.
-type FieldFilter func(name string, value reflect.Value) bool
-
-// NotNilFilter returns true for field values that are not nil;
-// it returns false otherwise.
-func NotNilFilter(_ string, v reflect.Value) bool {
-	switch v.Kind() {
-	case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
-		return !v.IsNil()
-	}
-	return true
-}
-
-// Fprint prints the (sub-)tree starting at AST node x to w.
-// If fset != nil, position information is interpreted relative
-// to that file set. Otherwise positions are printed as integer
-// values (file set specific offsets).
-//
-// A non-nil FieldFilter f may be provided to control the output:
-// struct fields for which f(fieldname, fieldvalue) is true are
-// printed; all others are filtered from the output. Unexported
-// struct fields are never printed.
-//
-func Fprint(w io.Writer, fset *token.FileSet, x interface{}, f FieldFilter) (err error) {
-	// setup printer
-	p := printer{
-		output: w,
-		fset:   fset,
-		filter: f,
-		ptrmap: make(map[interface{}]int),
-		last:   '\n', // force printing of line number on first line
-	}
-
-	// install error handler
-	defer func() {
-		if e := recover(); e != nil {
-			err = e.(localError).err // re-panics if it's not a localError
-		}
-	}()
-
-	// print x
-	if x == nil {
-		p.printf("nil\n")
-		return
-	}
-	p.print(reflect.ValueOf(x))
-	p.printf("\n")
-
-	return
-}
-
-// Print prints x to standard output, skipping nil fields.
-// Print(fset, x) is the same as Fprint(os.Stdout, fset, x, NotNilFilter).
-func Print(fset *token.FileSet, x interface{}) error {
-	return Fprint(os.Stdout, fset, x, NotNilFilter)
-}
-
-type printer struct {
-	output io.Writer
-	fset   *token.FileSet
-	filter FieldFilter
-	ptrmap map[interface{}]int // *T -> line number
-	indent int                 // current indentation level
-	last   byte                // the last byte processed by Write
-	line   int                 // current line number
-}
-
-var indent = []byte(".  ")
-
-func (p *printer) Write(data []byte) (n int, err error) {
-	var m int
-	for i, b := range data {
-		// invariant: data[0:n] has been written
-		if b == '\n' {
-			m, err = p.output.Write(data[n : i+1])
-			n += m
-			if err != nil {
-				return
-			}
-			p.line++
-		} else if p.last == '\n' {
-			_, err = fmt.Fprintf(p.output, "%6d  ", p.line)
-			if err != nil {
-				return
-			}
-			for j := p.indent; j > 0; j-- {
-				_, err = p.output.Write(indent)
-				if err != nil {
-					return
-				}
-			}
-		}
-		p.last = b
-	}
-	if len(data) > n {
-		m, err = p.output.Write(data[n:])
-		n += m
-	}
-	return
-}
-
-// localError wraps locally caught errors so we can distinguish
-// them from genuine panics which we don't want to return as errors.
-type localError struct {
-	err error
-}
-
-// printf is a convenience wrapper that takes care of print errors.
-func (p *printer) printf(format string, args ...interface{}) {
-	if _, err := fmt.Fprintf(p, format, args...); err != nil {
-		panic(localError{err})
-	}
-}
-
-// Implementation note: Print is written for AST nodes but could be
-// used to print arbitrary data structures; such a version should
-// probably be in a different package.
-//
-// Note: This code detects (some) cycles created via pointers but
-// not cycles that are created via slices or maps containing the
-// same slice or map. Code for general data structures probably
-// should catch those as well.
-
-func (p *printer) print(x reflect.Value) {
-	if !NotNilFilter("", x) {
-		p.printf("nil")
-		return
-	}
-
-	switch x.Kind() {
-	case reflect.Interface:
-		p.print(x.Elem())
-
-	case reflect.Map:
-		p.printf("%s (len = %d) {", x.Type(), x.Len())
-		if x.Len() > 0 {
-			p.indent++
-			p.printf("\n")
-			for _, key := range x.MapKeys() {
-				p.print(key)
-				p.printf(": ")
-				p.print(x.MapIndex(key))
-				p.printf("\n")
-			}
-			p.indent--
-		}
-		p.printf("}")
-
-	case reflect.Ptr:
-		p.printf("*")
-		// type-checked ASTs may contain cycles - use ptrmap
-		// to keep track of objects that have been printed
-		// already and print the respective line number instead
-		ptr := x.Interface()
-		if line, exists := p.ptrmap[ptr]; exists {
-			p.printf("(obj @ %d)", line)
-		} else {
-			p.ptrmap[ptr] = p.line
-			p.print(x.Elem())
-		}
-
-	case reflect.Array:
-		p.printf("%s {", x.Type())
-		if x.Len() > 0 {
-			p.indent++
-			p.printf("\n")
-			for i, n := 0, x.Len(); i < n; i++ {
-				p.printf("%d: ", i)
-				p.print(x.Index(i))
-				p.printf("\n")
-			}
-			p.indent--
-		}
-		p.printf("}")
-
-	case reflect.Slice:
-		if s, ok := x.Interface().([]byte); ok {
-			p.printf("%#q", s)
-			return
-		}
-		p.printf("%s (len = %d) {", x.Type(), x.Len())
-		if x.Len() > 0 {
-			p.indent++
-			p.printf("\n")
-			for i, n := 0, x.Len(); i < n; i++ {
-				p.printf("%d: ", i)
-				p.print(x.Index(i))
-				p.printf("\n")
-			}
-			p.indent--
-		}
-		p.printf("}")
-
-	case reflect.Struct:
-		t := x.Type()
-		p.printf("%s {", t)
-		p.indent++
-		first := true
-		for i, n := 0, t.NumField(); i < n; i++ {
-			// exclude non-exported fields because their
-			// values cannot be accessed via reflection
-			if name := t.Field(i).Name; IsExported(name) {
-				value := x.Field(i)
-				if p.filter == nil || p.filter(name, value) {
-					if first {
-						p.printf("\n")
-						first = false
-					}
-					p.printf("%s: ", name)
-					p.print(value)
-					p.printf("\n")
-				}
-			}
-		}
-		p.indent--
-		p.printf("}")
-
-	default:
-		v := x.Interface()
-		switch v := v.(type) {
-		case string:
-			// print strings in quotes
-			p.printf("%q", v)
-			return
-		case token.Pos:
-			// position values can be printed nicely if we have a file set
-			if p.fset != nil {
-				p.printf("%s", p.fset.Position(v))
-				return
-			}
-		}
-		// default
-		p.printf("%v", v)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/ast/print_test.go b/third_party/gofrontend/libgo/go/go/ast/print_test.go
deleted file mode 100644
index 210f164..0000000
--- a/third_party/gofrontend/libgo/go/go/ast/print_test.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ast
-
-import (
-	"bytes"
-	"strings"
-	"testing"
-)
-
-var tests = []struct {
-	x interface{} // x is printed as s
-	s string
-}{
-	// basic types
-	{nil, "0  nil"},
-	{true, "0  true"},
-	{42, "0  42"},
-	{3.14, "0  3.14"},
-	{1 + 2.718i, "0  (1+2.718i)"},
-	{"foobar", "0  \"foobar\""},
-
-	// maps
-	{map[Expr]string{}, `0  map[ast.Expr]string (len = 0) {}`},
-	{map[string]int{"a": 1},
-		`0  map[string]int (len = 1) {
-		1  .  "a": 1
-		2  }`},
-
-	// pointers
-	{new(int), "0  *0"},
-
-	// arrays
-	{[0]int{}, `0  [0]int {}`},
-	{[3]int{1, 2, 3},
-		`0  [3]int {
-		1  .  0: 1
-		2  .  1: 2
-		3  .  2: 3
-		4  }`},
-	{[...]int{42},
-		`0  [1]int {
-		1  .  0: 42
-		2  }`},
-
-	// slices
-	{[]int{}, `0  []int (len = 0) {}`},
-	{[]int{1, 2, 3},
-		`0  []int (len = 3) {
-		1  .  0: 1
-		2  .  1: 2
-		3  .  2: 3
-		4  }`},
-
-	// structs
-	{struct{}{}, `0  struct {} {}`},
-	{struct{ x int }{007}, `0  struct { x int } {}`},
-	{struct{ X, y int }{42, 991},
-		`0  struct { X int; y int } {
-		1  .  X: 42
-		2  }`},
-	{struct{ X, Y int }{42, 991},
-		`0  struct { X int; Y int } {
-		1  .  X: 42
-		2  .  Y: 991
-		3  }`},
-}
-
-// Split s into lines, trim whitespace from all lines, and return
-// the concatenated non-empty lines.
-func trim(s string) string {
-	lines := strings.Split(s, "\n")
-	i := 0
-	for _, line := range lines {
-		line = strings.TrimSpace(line)
-		if line != "" {
-			lines[i] = line
-			i++
-		}
-	}
-	return strings.Join(lines[0:i], "\n")
-}
-
-func TestPrint(t *testing.T) {
-	var buf bytes.Buffer
-	for _, test := range tests {
-		buf.Reset()
-		if err := Fprint(&buf, nil, test.x, nil); err != nil {
-			t.Errorf("Fprint failed: %s", err)
-		}
-		if s, ts := trim(buf.String()), trim(test.s); s != ts {
-			t.Errorf("got:\n%s\nexpected:\n%s\n", s, ts)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/ast/resolve.go b/third_party/gofrontend/libgo/go/go/ast/resolve.go
deleted file mode 100644
index 0406bfc..0000000
--- a/third_party/gofrontend/libgo/go/go/ast/resolve.go
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements NewPackage.
-
-package ast
-
-import (
-	"fmt"
-	"go/scanner"
-	"go/token"
-	"strconv"
-)
-
-type pkgBuilder struct {
-	fset   *token.FileSet
-	errors scanner.ErrorList
-}
-
-func (p *pkgBuilder) error(pos token.Pos, msg string) {
-	p.errors.Add(p.fset.Position(pos), msg)
-}
-
-func (p *pkgBuilder) errorf(pos token.Pos, format string, args ...interface{}) {
-	p.error(pos, fmt.Sprintf(format, args...))
-}
-
-func (p *pkgBuilder) declare(scope, altScope *Scope, obj *Object) {
-	alt := scope.Insert(obj)
-	if alt == nil && altScope != nil {
-		// see if there is a conflicting declaration in altScope
-		alt = altScope.Lookup(obj.Name)
-	}
-	if alt != nil {
-		prevDecl := ""
-		if pos := alt.Pos(); pos.IsValid() {
-			prevDecl = fmt.Sprintf("\n\tprevious declaration at %s", p.fset.Position(pos))
-		}
-		p.error(obj.Pos(), fmt.Sprintf("%s redeclared in this block%s", obj.Name, prevDecl))
-	}
-}
-
-func resolve(scope *Scope, ident *Ident) bool {
-	for ; scope != nil; scope = scope.Outer {
-		if obj := scope.Lookup(ident.Name); obj != nil {
-			ident.Obj = obj
-			return true
-		}
-	}
-	return false
-}
-
-// An Importer resolves import paths to package Objects.
-// The imports map records the packages already imported,
-// indexed by package id (canonical import path).
-// An Importer must determine the canonical import path and
-// check the map to see if it is already present in the imports map.
-// If so, the Importer can return the map entry.  Otherwise, the
-// Importer should load the package data for the given path into
-// a new *Object (pkg), record pkg in the imports map, and then
-// return pkg.
-type Importer func(imports map[string]*Object, path string) (pkg *Object, err error)
-
-// NewPackage creates a new Package node from a set of File nodes. It resolves
-// unresolved identifiers across files and updates each file's Unresolved list
-// accordingly. If a non-nil importer and universe scope are provided, they are
-// used to resolve identifiers not declared in any of the package files. Any
-// remaining unresolved identifiers are reported as undeclared. If the files
-// belong to different packages, one package name is selected and files with
-// different package names are reported and then ignored.
-// The result is a package node and a scanner.ErrorList if there were errors.
-//
-func NewPackage(fset *token.FileSet, files map[string]*File, importer Importer, universe *Scope) (*Package, error) {
-	var p pkgBuilder
-	p.fset = fset
-
-	// complete package scope
-	pkgName := ""
-	pkgScope := NewScope(universe)
-	for _, file := range files {
-		// package names must match
-		switch name := file.Name.Name; {
-		case pkgName == "":
-			pkgName = name
-		case name != pkgName:
-			p.errorf(file.Package, "package %s; expected %s", name, pkgName)
-			continue // ignore this file
-		}
-
-		// collect top-level file objects in package scope
-		for _, obj := range file.Scope.Objects {
-			p.declare(pkgScope, nil, obj)
-		}
-	}
-
-	// package global mapping of imported package ids to package objects
-	imports := make(map[string]*Object)
-
-	// complete file scopes with imports and resolve identifiers
-	for _, file := range files {
-		// ignore file if it belongs to a different package
-		// (error has already been reported)
-		if file.Name.Name != pkgName {
-			continue
-		}
-
-		// build file scope by processing all imports
-		importErrors := false
-		fileScope := NewScope(pkgScope)
-		for _, spec := range file.Imports {
-			if importer == nil {
-				importErrors = true
-				continue
-			}
-			path, _ := strconv.Unquote(spec.Path.Value)
-			pkg, err := importer(imports, path)
-			if err != nil {
-				p.errorf(spec.Path.Pos(), "could not import %s (%s)", path, err)
-				importErrors = true
-				continue
-			}
-			// TODO(gri) If a local package name != "." is provided,
-			// global identifier resolution could proceed even if the
-			// import failed. Consider adjusting the logic here a bit.
-
-			// local name overrides imported package name
-			name := pkg.Name
-			if spec.Name != nil {
-				name = spec.Name.Name
-			}
-
-			// add import to file scope
-			if name == "." {
-				// merge imported scope with file scope
-				for _, obj := range pkg.Data.(*Scope).Objects {
-					p.declare(fileScope, pkgScope, obj)
-				}
-			} else if name != "_" {
-				// declare imported package object in file scope
-				// (do not re-use pkg in the file scope but create
-				// a new object instead; the Decl field is different
-				// for different files)
-				obj := NewObj(Pkg, name)
-				obj.Decl = spec
-				obj.Data = pkg.Data
-				p.declare(fileScope, pkgScope, obj)
-			}
-		}
-
-		// resolve identifiers
-		if importErrors {
-			// don't use the universe scope without correct imports
-			// (objects in the universe may be shadowed by imports;
-			// with missing imports, identifiers might get resolved
-			// incorrectly to universe objects)
-			pkgScope.Outer = nil
-		}
-		i := 0
-		for _, ident := range file.Unresolved {
-			if !resolve(fileScope, ident) {
-				p.errorf(ident.Pos(), "undeclared name: %s", ident.Name)
-				file.Unresolved[i] = ident
-				i++
-			}
-
-		}
-		file.Unresolved = file.Unresolved[0:i]
-		pkgScope.Outer = universe // reset universe scope
-	}
-
-	p.errors.Sort()
-	return &Package{pkgName, pkgScope, imports, files}, p.errors.Err()
-}
diff --git a/third_party/gofrontend/libgo/go/go/ast/scope.go b/third_party/gofrontend/libgo/go/go/ast/scope.go
deleted file mode 100644
index 1ce5e2e..0000000
--- a/third_party/gofrontend/libgo/go/go/ast/scope.go
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements scopes and the objects they contain.
-
-package ast
-
-import (
-	"bytes"
-	"fmt"
-	"go/token"
-)
-
-// A Scope maintains the set of named language entities declared
-// in the scope and a link to the immediately surrounding (outer)
-// scope.
-//
-type Scope struct {
-	Outer   *Scope
-	Objects map[string]*Object
-}
-
-// NewScope creates a new scope nested in the outer scope.
-func NewScope(outer *Scope) *Scope {
-	const n = 4 // initial scope capacity
-	return &Scope{outer, make(map[string]*Object, n)}
-}
-
-// Lookup returns the object with the given name if it is
-// found in scope s, otherwise it returns nil. Outer scopes
-// are ignored.
-//
-func (s *Scope) Lookup(name string) *Object {
-	return s.Objects[name]
-}
-
-// Insert attempts to insert a named object obj into the scope s.
-// If the scope already contains an object alt with the same name,
-// Insert leaves the scope unchanged and returns alt. Otherwise
-// it inserts obj and returns nil.
-//
-func (s *Scope) Insert(obj *Object) (alt *Object) {
-	if alt = s.Objects[obj.Name]; alt == nil {
-		s.Objects[obj.Name] = obj
-	}
-	return
-}
-
-// Debugging support
-func (s *Scope) String() string {
-	var buf bytes.Buffer
-	fmt.Fprintf(&buf, "scope %p {", s)
-	if s != nil && len(s.Objects) > 0 {
-		fmt.Fprintln(&buf)
-		for _, obj := range s.Objects {
-			fmt.Fprintf(&buf, "\t%s %s\n", obj.Kind, obj.Name)
-		}
-	}
-	fmt.Fprintf(&buf, "}\n")
-	return buf.String()
-}
-
-// ----------------------------------------------------------------------------
-// Objects
-
-// An Object describes a named language entity such as a package,
-// constant, type, variable, function (incl. methods), or label.
-//
-// The Data fields contains object-specific data:
-//
-//	Kind    Data type         Data value
-//	Pkg	*types.Package    package scope
-//	Con     int               iota for the respective declaration
-//	Con     != nil            constant value
-//	Typ     *Scope            (used as method scope during type checking - transient)
-//
-type Object struct {
-	Kind ObjKind
-	Name string      // declared name
-	Decl interface{} // corresponding Field, XxxSpec, FuncDecl, LabeledStmt, AssignStmt, Scope; or nil
-	Data interface{} // object-specific data; or nil
-	Type interface{} // placeholder for type information; may be nil
-}
-
-// NewObj creates a new object of a given kind and name.
-func NewObj(kind ObjKind, name string) *Object {
-	return &Object{Kind: kind, Name: name}
-}
-
-// Pos computes the source position of the declaration of an object name.
-// The result may be an invalid position if it cannot be computed
-// (obj.Decl may be nil or not correct).
-func (obj *Object) Pos() token.Pos {
-	name := obj.Name
-	switch d := obj.Decl.(type) {
-	case *Field:
-		for _, n := range d.Names {
-			if n.Name == name {
-				return n.Pos()
-			}
-		}
-	case *ImportSpec:
-		if d.Name != nil && d.Name.Name == name {
-			return d.Name.Pos()
-		}
-		return d.Path.Pos()
-	case *ValueSpec:
-		for _, n := range d.Names {
-			if n.Name == name {
-				return n.Pos()
-			}
-		}
-	case *TypeSpec:
-		if d.Name.Name == name {
-			return d.Name.Pos()
-		}
-	case *FuncDecl:
-		if d.Name.Name == name {
-			return d.Name.Pos()
-		}
-	case *LabeledStmt:
-		if d.Label.Name == name {
-			return d.Label.Pos()
-		}
-	case *AssignStmt:
-		for _, x := range d.Lhs {
-			if ident, isIdent := x.(*Ident); isIdent && ident.Name == name {
-				return ident.Pos()
-			}
-		}
-	case *Scope:
-		// predeclared object - nothing to do for now
-	}
-	return token.NoPos
-}
-
-// ObjKind describes what an object represents.
-type ObjKind int
-
-// The list of possible Object kinds.
-const (
-	Bad ObjKind = iota // for error handling
-	Pkg                // package
-	Con                // constant
-	Typ                // type
-	Var                // variable
-	Fun                // function or method
-	Lbl                // label
-)
-
-var objKindStrings = [...]string{
-	Bad: "bad",
-	Pkg: "package",
-	Con: "const",
-	Typ: "type",
-	Var: "var",
-	Fun: "func",
-	Lbl: "label",
-}
-
-func (kind ObjKind) String() string { return objKindStrings[kind] }
diff --git a/third_party/gofrontend/libgo/go/go/ast/walk.go b/third_party/gofrontend/libgo/go/go/ast/walk.go
deleted file mode 100644
index 8ca2195..0000000
--- a/third_party/gofrontend/libgo/go/go/ast/walk.go
+++ /dev/null
@@ -1,386 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ast
-
-import "fmt"
-
-// A Visitor's Visit method is invoked for each node encountered by Walk.
-// If the result visitor w is not nil, Walk visits each of the children
-// of node with the visitor w, followed by a call of w.Visit(nil).
-type Visitor interface {
-	Visit(node Node) (w Visitor)
-}
-
-// Helper functions for common node lists. They may be empty.
-
-func walkIdentList(v Visitor, list []*Ident) {
-	for _, x := range list {
-		Walk(v, x)
-	}
-}
-
-func walkExprList(v Visitor, list []Expr) {
-	for _, x := range list {
-		Walk(v, x)
-	}
-}
-
-func walkStmtList(v Visitor, list []Stmt) {
-	for _, x := range list {
-		Walk(v, x)
-	}
-}
-
-func walkDeclList(v Visitor, list []Decl) {
-	for _, x := range list {
-		Walk(v, x)
-	}
-}
-
-// TODO(gri): Investigate if providing a closure to Walk leads to
-//            simpler use (and may help eliminate Inspect in turn).
-
-// Walk traverses an AST in depth-first order: It starts by calling
-// v.Visit(node); node must not be nil. If the visitor w returned by
-// v.Visit(node) is not nil, Walk is invoked recursively with visitor
-// w for each of the non-nil children of node, followed by a call of
-// w.Visit(nil).
-//
-func Walk(v Visitor, node Node) {
-	if v = v.Visit(node); v == nil {
-		return
-	}
-
-	// walk children
-	// (the order of the cases matches the order
-	// of the corresponding node types in ast.go)
-	switch n := node.(type) {
-	// Comments and fields
-	case *Comment:
-		// nothing to do
-
-	case *CommentGroup:
-		for _, c := range n.List {
-			Walk(v, c)
-		}
-
-	case *Field:
-		if n.Doc != nil {
-			Walk(v, n.Doc)
-		}
-		walkIdentList(v, n.Names)
-		Walk(v, n.Type)
-		if n.Tag != nil {
-			Walk(v, n.Tag)
-		}
-		if n.Comment != nil {
-			Walk(v, n.Comment)
-		}
-
-	case *FieldList:
-		for _, f := range n.List {
-			Walk(v, f)
-		}
-
-	// Expressions
-	case *BadExpr, *Ident, *BasicLit:
-		// nothing to do
-
-	case *Ellipsis:
-		if n.Elt != nil {
-			Walk(v, n.Elt)
-		}
-
-	case *FuncLit:
-		Walk(v, n.Type)
-		Walk(v, n.Body)
-
-	case *CompositeLit:
-		if n.Type != nil {
-			Walk(v, n.Type)
-		}
-		walkExprList(v, n.Elts)
-
-	case *ParenExpr:
-		Walk(v, n.X)
-
-	case *SelectorExpr:
-		Walk(v, n.X)
-		Walk(v, n.Sel)
-
-	case *IndexExpr:
-		Walk(v, n.X)
-		Walk(v, n.Index)
-
-	case *SliceExpr:
-		Walk(v, n.X)
-		if n.Low != nil {
-			Walk(v, n.Low)
-		}
-		if n.High != nil {
-			Walk(v, n.High)
-		}
-		if n.Max != nil {
-			Walk(v, n.Max)
-		}
-
-	case *TypeAssertExpr:
-		Walk(v, n.X)
-		if n.Type != nil {
-			Walk(v, n.Type)
-		}
-
-	case *CallExpr:
-		Walk(v, n.Fun)
-		walkExprList(v, n.Args)
-
-	case *StarExpr:
-		Walk(v, n.X)
-
-	case *UnaryExpr:
-		Walk(v, n.X)
-
-	case *BinaryExpr:
-		Walk(v, n.X)
-		Walk(v, n.Y)
-
-	case *KeyValueExpr:
-		Walk(v, n.Key)
-		Walk(v, n.Value)
-
-	// Types
-	case *ArrayType:
-		if n.Len != nil {
-			Walk(v, n.Len)
-		}
-		Walk(v, n.Elt)
-
-	case *StructType:
-		Walk(v, n.Fields)
-
-	case *FuncType:
-		if n.Params != nil {
-			Walk(v, n.Params)
-		}
-		if n.Results != nil {
-			Walk(v, n.Results)
-		}
-
-	case *InterfaceType:
-		Walk(v, n.Methods)
-
-	case *MapType:
-		Walk(v, n.Key)
-		Walk(v, n.Value)
-
-	case *ChanType:
-		Walk(v, n.Value)
-
-	// Statements
-	case *BadStmt:
-		// nothing to do
-
-	case *DeclStmt:
-		Walk(v, n.Decl)
-
-	case *EmptyStmt:
-		// nothing to do
-
-	case *LabeledStmt:
-		Walk(v, n.Label)
-		Walk(v, n.Stmt)
-
-	case *ExprStmt:
-		Walk(v, n.X)
-
-	case *SendStmt:
-		Walk(v, n.Chan)
-		Walk(v, n.Value)
-
-	case *IncDecStmt:
-		Walk(v, n.X)
-
-	case *AssignStmt:
-		walkExprList(v, n.Lhs)
-		walkExprList(v, n.Rhs)
-
-	case *GoStmt:
-		Walk(v, n.Call)
-
-	case *DeferStmt:
-		Walk(v, n.Call)
-
-	case *ReturnStmt:
-		walkExprList(v, n.Results)
-
-	case *BranchStmt:
-		if n.Label != nil {
-			Walk(v, n.Label)
-		}
-
-	case *BlockStmt:
-		walkStmtList(v, n.List)
-
-	case *IfStmt:
-		if n.Init != nil {
-			Walk(v, n.Init)
-		}
-		Walk(v, n.Cond)
-		Walk(v, n.Body)
-		if n.Else != nil {
-			Walk(v, n.Else)
-		}
-
-	case *CaseClause:
-		walkExprList(v, n.List)
-		walkStmtList(v, n.Body)
-
-	case *SwitchStmt:
-		if n.Init != nil {
-			Walk(v, n.Init)
-		}
-		if n.Tag != nil {
-			Walk(v, n.Tag)
-		}
-		Walk(v, n.Body)
-
-	case *TypeSwitchStmt:
-		if n.Init != nil {
-			Walk(v, n.Init)
-		}
-		Walk(v, n.Assign)
-		Walk(v, n.Body)
-
-	case *CommClause:
-		if n.Comm != nil {
-			Walk(v, n.Comm)
-		}
-		walkStmtList(v, n.Body)
-
-	case *SelectStmt:
-		Walk(v, n.Body)
-
-	case *ForStmt:
-		if n.Init != nil {
-			Walk(v, n.Init)
-		}
-		if n.Cond != nil {
-			Walk(v, n.Cond)
-		}
-		if n.Post != nil {
-			Walk(v, n.Post)
-		}
-		Walk(v, n.Body)
-
-	case *RangeStmt:
-		if n.Key != nil {
-			Walk(v, n.Key)
-		}
-		if n.Value != nil {
-			Walk(v, n.Value)
-		}
-		Walk(v, n.X)
-		Walk(v, n.Body)
-
-	// Declarations
-	case *ImportSpec:
-		if n.Doc != nil {
-			Walk(v, n.Doc)
-		}
-		if n.Name != nil {
-			Walk(v, n.Name)
-		}
-		Walk(v, n.Path)
-		if n.Comment != nil {
-			Walk(v, n.Comment)
-		}
-
-	case *ValueSpec:
-		if n.Doc != nil {
-			Walk(v, n.Doc)
-		}
-		walkIdentList(v, n.Names)
-		if n.Type != nil {
-			Walk(v, n.Type)
-		}
-		walkExprList(v, n.Values)
-		if n.Comment != nil {
-			Walk(v, n.Comment)
-		}
-
-	case *TypeSpec:
-		if n.Doc != nil {
-			Walk(v, n.Doc)
-		}
-		Walk(v, n.Name)
-		Walk(v, n.Type)
-		if n.Comment != nil {
-			Walk(v, n.Comment)
-		}
-
-	case *BadDecl:
-		// nothing to do
-
-	case *GenDecl:
-		if n.Doc != nil {
-			Walk(v, n.Doc)
-		}
-		for _, s := range n.Specs {
-			Walk(v, s)
-		}
-
-	case *FuncDecl:
-		if n.Doc != nil {
-			Walk(v, n.Doc)
-		}
-		if n.Recv != nil {
-			Walk(v, n.Recv)
-		}
-		Walk(v, n.Name)
-		Walk(v, n.Type)
-		if n.Body != nil {
-			Walk(v, n.Body)
-		}
-
-	// Files and packages
-	case *File:
-		if n.Doc != nil {
-			Walk(v, n.Doc)
-		}
-		Walk(v, n.Name)
-		walkDeclList(v, n.Decls)
-		// don't walk n.Comments - they have been
-		// visited already through the individual
-		// nodes
-
-	case *Package:
-		for _, f := range n.Files {
-			Walk(v, f)
-		}
-
-	default:
-		panic(fmt.Sprintf("ast.Walk: unexpected node type %T", n))
-	}
-
-	v.Visit(nil)
-}
-
-type inspector func(Node) bool
-
-func (f inspector) Visit(node Node) Visitor {
-	if f(node) {
-		return f
-	}
-	return nil
-}
-
-// Inspect traverses an AST in depth-first order: It starts by calling
-// f(node); node must not be nil. If f returns true, Inspect invokes f
-// recursively for each of the non-nil children of node, followed by a
-// call of f(nil).
-//
-func Inspect(node Node, f func(Node) bool) {
-	Walk(inspector(f), node)
-}
diff --git a/third_party/gofrontend/libgo/go/go/build/build.go b/third_party/gofrontend/libgo/go/go/build/build.go
deleted file mode 100644
index 42f1165..0000000
--- a/third_party/gofrontend/libgo/go/go/build/build.go
+++ /dev/null
@@ -1,1419 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package build
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"go/ast"
-	"go/doc"
-	"go/parser"
-	"go/token"
-	"io"
-	"io/ioutil"
-	"log"
-	"os"
-	pathpkg "path"
-	"path/filepath"
-	"runtime"
-	"sort"
-	"strconv"
-	"strings"
-	"unicode"
-	"unicode/utf8"
-)
-
-// A Context specifies the supporting context for a build.
-type Context struct {
-	GOARCH      string // target architecture
-	GOOS        string // target operating system
-	GOROOT      string // Go root
-	GOPATH      string // Go path
-	CgoEnabled  bool   // whether cgo can be used
-	UseAllFiles bool   // use files regardless of +build lines, file names
-	Compiler    string // compiler to assume when computing target paths
-
-	// The build and release tags specify build constraints
-	// that should be considered satisfied when processing +build lines.
-	// Clients creating a new context may customize BuildTags, which
-	// defaults to empty, but it is usually an error to customize ReleaseTags,
-	// which defaults to the list of Go releases the current release is compatible with.
-	// In addition to the BuildTags and ReleaseTags, build constraints
-	// consider the values of GOARCH and GOOS as satisfied tags.
-	BuildTags   []string
-	ReleaseTags []string
-
-	// The install suffix specifies a suffix to use in the name of the installation
-	// directory. By default it is empty, but custom builds that need to keep
-	// their outputs separate can set InstallSuffix to do so. For example, when
-	// using the race detector, the go command uses InstallSuffix = "race", so
-	// that on a Linux/386 system, packages are written to a directory named
-	// "linux_386_race" instead of the usual "linux_386".
-	InstallSuffix string
-
-	// By default, Import uses the operating system's file system calls
-	// to read directories and files.  To read from other sources,
-	// callers can set the following functions.  They all have default
-	// behaviors that use the local file system, so clients need only set
-	// the functions whose behaviors they wish to change.
-
-	// JoinPath joins the sequence of path fragments into a single path.
-	// If JoinPath is nil, Import uses filepath.Join.
-	JoinPath func(elem ...string) string
-
-	// SplitPathList splits the path list into a slice of individual paths.
-	// If SplitPathList is nil, Import uses filepath.SplitList.
-	SplitPathList func(list string) []string
-
-	// IsAbsPath reports whether path is an absolute path.
-	// If IsAbsPath is nil, Import uses filepath.IsAbs.
-	IsAbsPath func(path string) bool
-
-	// IsDir reports whether the path names a directory.
-	// If IsDir is nil, Import calls os.Stat and uses the result's IsDir method.
-	IsDir func(path string) bool
-
-	// HasSubdir reports whether dir is a subdirectory of
-	// (perhaps multiple levels below) root.
-	// If so, HasSubdir sets rel to a slash-separated path that
-	// can be joined to root to produce a path equivalent to dir.
-	// If HasSubdir is nil, Import uses an implementation built on
-	// filepath.EvalSymlinks.
-	HasSubdir func(root, dir string) (rel string, ok bool)
-
-	// ReadDir returns a slice of os.FileInfo, sorted by Name,
-	// describing the content of the named directory.
-	// If ReadDir is nil, Import uses ioutil.ReadDir.
-	ReadDir func(dir string) (fi []os.FileInfo, err error)
-
-	// OpenFile opens a file (not a directory) for reading.
-	// If OpenFile is nil, Import uses os.Open.
-	OpenFile func(path string) (r io.ReadCloser, err error)
-}
-
-// joinPath calls ctxt.JoinPath (if not nil) or else filepath.Join.
-func (ctxt *Context) joinPath(elem ...string) string {
-	if f := ctxt.JoinPath; f != nil {
-		return f(elem...)
-	}
-	return filepath.Join(elem...)
-}
-
-// splitPathList calls ctxt.SplitPathList (if not nil) or else filepath.SplitList.
-func (ctxt *Context) splitPathList(s string) []string {
-	if f := ctxt.SplitPathList; f != nil {
-		return f(s)
-	}
-	return filepath.SplitList(s)
-}
-
-// isAbsPath calls ctxt.IsAbsSPath (if not nil) or else filepath.IsAbs.
-func (ctxt *Context) isAbsPath(path string) bool {
-	if f := ctxt.IsAbsPath; f != nil {
-		return f(path)
-	}
-	return filepath.IsAbs(path)
-}
-
-// isDir calls ctxt.IsDir (if not nil) or else uses os.Stat.
-func (ctxt *Context) isDir(path string) bool {
-	if f := ctxt.IsDir; f != nil {
-		return f(path)
-	}
-	fi, err := os.Stat(path)
-	return err == nil && fi.IsDir()
-}
-
-// hasSubdir calls ctxt.HasSubdir (if not nil) or else uses
-// the local file system to answer the question.
-func (ctxt *Context) hasSubdir(root, dir string) (rel string, ok bool) {
-	if f := ctxt.HasSubdir; f != nil {
-		return f(root, dir)
-	}
-
-	// Try using paths we received.
-	if rel, ok = hasSubdir(root, dir); ok {
-		return
-	}
-
-	// Try expanding symlinks and comparing
-	// expanded against unexpanded and
-	// expanded against expanded.
-	rootSym, _ := filepath.EvalSymlinks(root)
-	dirSym, _ := filepath.EvalSymlinks(dir)
-
-	if rel, ok = hasSubdir(rootSym, dir); ok {
-		return
-	}
-	if rel, ok = hasSubdir(root, dirSym); ok {
-		return
-	}
-	return hasSubdir(rootSym, dirSym)
-}
-
-func hasSubdir(root, dir string) (rel string, ok bool) {
-	const sep = string(filepath.Separator)
-	root = filepath.Clean(root)
-	if !strings.HasSuffix(root, sep) {
-		root += sep
-	}
-	dir = filepath.Clean(dir)
-	if !strings.HasPrefix(dir, root) {
-		return "", false
-	}
-	return filepath.ToSlash(dir[len(root):]), true
-}
-
-// readDir calls ctxt.ReadDir (if not nil) or else ioutil.ReadDir.
-func (ctxt *Context) readDir(path string) ([]os.FileInfo, error) {
-	if f := ctxt.ReadDir; f != nil {
-		return f(path)
-	}
-	return ioutil.ReadDir(path)
-}
-
-// openFile calls ctxt.OpenFile (if not nil) or else os.Open.
-func (ctxt *Context) openFile(path string) (io.ReadCloser, error) {
-	if fn := ctxt.OpenFile; fn != nil {
-		return fn(path)
-	}
-
-	f, err := os.Open(path)
-	if err != nil {
-		return nil, err // nil interface
-	}
-	return f, nil
-}
-
-// isFile determines whether path is a file by trying to open it.
-// It reuses openFile instead of adding another function to the
-// list in Context.
-func (ctxt *Context) isFile(path string) bool {
-	f, err := ctxt.openFile(path)
-	if err != nil {
-		return false
-	}
-	f.Close()
-	return true
-}
-
-// gopath returns the list of Go path directories.
-func (ctxt *Context) gopath() []string {
-	var all []string
-	for _, p := range ctxt.splitPathList(ctxt.GOPATH) {
-		if p == "" || p == ctxt.GOROOT {
-			// Empty paths are uninteresting.
-			// If the path is the GOROOT, ignore it.
-			// People sometimes set GOPATH=$GOROOT.
-			// Do not get confused by this common mistake.
-			continue
-		}
-		if strings.HasPrefix(p, "~") {
-			// Path segments starting with ~ on Unix are almost always
-			// users who have incorrectly quoted ~ while setting GOPATH,
-			// preventing it from expanding to $HOME.
-			// The situation is made more confusing by the fact that
-			// bash allows quoted ~ in $PATH (most shells do not).
-			// Do not get confused by this, and do not try to use the path.
-			// It does not exist, and printing errors about it confuses
-			// those users even more, because they think "sure ~ exists!".
-			// The go command diagnoses this situation and prints a
-			// useful error.
-			// On Windows, ~ is used in short names, such as c:\progra~1
-			// for c:\program files.
-			continue
-		}
-		all = append(all, p)
-	}
-	return all
-}
-
-// SrcDirs returns a list of package source root directories.
-// It draws from the current Go root and Go path but omits directories
-// that do not exist.
-func (ctxt *Context) SrcDirs() []string {
-	var all []string
-	if ctxt.GOROOT != "" {
-		dir := ctxt.joinPath(ctxt.GOROOT, "src")
-		if ctxt.isDir(dir) {
-			all = append(all, dir)
-		}
-	}
-	for _, p := range ctxt.gopath() {
-		dir := ctxt.joinPath(p, "src")
-		if ctxt.isDir(dir) {
-			all = append(all, dir)
-		}
-	}
-	return all
-}
-
-// Default is the default Context for builds.
-// It uses the GOARCH, GOOS, GOROOT, and GOPATH environment variables
-// if set, or else the compiled code's GOARCH, GOOS, and GOROOT.
-var Default Context = defaultContext()
-
-// Also known to cmd/dist/build.go.
-var cgoEnabled = map[string]bool{
-	"darwin/386":      true,
-	"darwin/amd64":    true,
-	"darwin/arm":      true,
-	"darwin/arm64":    true,
-	"dragonfly/amd64": true,
-	"freebsd/386":     true,
-	"freebsd/amd64":   true,
-	"freebsd/arm":     true,
-	"linux/386":       true,
-	"linux/alpha":     true,
-	"linux/amd64":     true,
-	"linux/arm":       true,
-	"linux/arm64":     true,
-	"linux/ppc":       true,
-	"linux/ppc64":     true,
-	"linux/ppc64le":   true,
-	"linux/s390":      true,
-	"linux/s390x":     true,
-	"android/386":     true,
-	"android/amd64":   true,
-	"android/arm":     true,
-	"netbsd/386":      true,
-	"netbsd/amd64":    true,
-	"netbsd/arm":      true,
-	"openbsd/386":     true,
-	"openbsd/amd64":   true,
-	"solaris/amd64":   true,
-	"windows/386":     true,
-	"windows/amd64":   true,
-}
-
-func defaultContext() Context {
-	var c Context
-
-	c.GOARCH = envOr("GOARCH", runtime.GOARCH)
-	c.GOOS = envOr("GOOS", runtime.GOOS)
-	c.GOROOT = runtime.GOROOT()
-	c.GOPATH = envOr("GOPATH", "")
-	c.Compiler = runtime.Compiler
-
-	// Each major Go release in the Go 1.x series should add a tag here.
-	// Old tags should not be removed. That is, the go1.x tag is present
-	// in all releases >= Go 1.x. Code that requires Go 1.x or later should
-	// say "+build go1.x", and code that should only be built before Go 1.x
-	// (perhaps it is the stub to use in that case) should say "+build !go1.x".
-	c.ReleaseTags = []string{"go1.1", "go1.2", "go1.3", "go1.4", "go1.5"}
-
-	switch os.Getenv("CGO_ENABLED") {
-	case "1":
-		c.CgoEnabled = true
-	case "0":
-		c.CgoEnabled = false
-	default:
-		// cgo must be explicitly enabled for cross compilation builds
-		if runtime.GOARCH == c.GOARCH && runtime.GOOS == c.GOOS {
-			c.CgoEnabled = cgoEnabled[c.GOOS+"/"+c.GOARCH]
-			break
-		}
-		c.CgoEnabled = false
-	}
-
-	return c
-}
-
-func envOr(name, def string) string {
-	s := os.Getenv(name)
-	if s == "" {
-		return def
-	}
-	return s
-}
-
-// An ImportMode controls the behavior of the Import method.
-type ImportMode uint
-
-const (
-	// If FindOnly is set, Import stops after locating the directory
-	// that should contain the sources for a package.  It does not
-	// read any files in the directory.
-	FindOnly ImportMode = 1 << iota
-
-	// If AllowBinary is set, Import can be satisfied by a compiled
-	// package object without corresponding sources.
-	AllowBinary
-
-	// If ImportComment is set, parse import comments on package statements.
-	// Import returns an error if it finds a comment it cannot understand
-	// or finds conflicting comments in multiple source files.
-	// See golang.org/s/go14customimport for more information.
-	ImportComment
-)
-
-// A Package describes the Go package found in a directory.
-type Package struct {
-	Dir           string   // directory containing package sources
-	Name          string   // package name
-	ImportComment string   // path in import comment on package statement
-	Doc           string   // documentation synopsis
-	ImportPath    string   // import path of package ("" if unknown)
-	Root          string   // root of Go tree where this package lives
-	SrcRoot       string   // package source root directory ("" if unknown)
-	PkgRoot       string   // package install root directory ("" if unknown)
-	PkgTargetRoot string   // architecture dependent install root directory ("" if unknown)
-	BinDir        string   // command install directory ("" if unknown)
-	Goroot        bool     // package found in Go root
-	PkgObj        string   // installed .a file
-	AllTags       []string // tags that can influence file selection in this directory
-	ConflictDir   string   // this directory shadows Dir in $GOPATH
-
-	// Source files
-	GoFiles        []string // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
-	CgoFiles       []string // .go source files that import "C"
-	IgnoredGoFiles []string // .go source files ignored for this build
-	CFiles         []string // .c source files
-	CXXFiles       []string // .cc, .cpp and .cxx source files
-	MFiles         []string // .m (Objective-C) source files
-	HFiles         []string // .h, .hh, .hpp and .hxx source files
-	SFiles         []string // .s source files
-	SwigFiles      []string // .swig files
-	SwigCXXFiles   []string // .swigcxx files
-	SysoFiles      []string // .syso system object files to add to archive
-
-	// Cgo directives
-	CgoCFLAGS    []string // Cgo CFLAGS directives
-	CgoCPPFLAGS  []string // Cgo CPPFLAGS directives
-	CgoCXXFLAGS  []string // Cgo CXXFLAGS directives
-	CgoLDFLAGS   []string // Cgo LDFLAGS directives
-	CgoPkgConfig []string // Cgo pkg-config directives
-
-	// Dependency information
-	Imports   []string                    // imports from GoFiles, CgoFiles
-	ImportPos map[string][]token.Position // line information for Imports
-
-	// Test information
-	TestGoFiles    []string                    // _test.go files in package
-	TestImports    []string                    // imports from TestGoFiles
-	TestImportPos  map[string][]token.Position // line information for TestImports
-	XTestGoFiles   []string                    // _test.go files outside package
-	XTestImports   []string                    // imports from XTestGoFiles
-	XTestImportPos map[string][]token.Position // line information for XTestImports
-}
-
-// IsCommand reports whether the package is considered a
-// command to be installed (not just a library).
-// Packages named "main" are treated as commands.
-func (p *Package) IsCommand() bool {
-	return p.Name == "main"
-}
-
-// ImportDir is like Import but processes the Go package found in
-// the named directory.
-func (ctxt *Context) ImportDir(dir string, mode ImportMode) (*Package, error) {
-	return ctxt.Import(".", dir, mode)
-}
-
-// NoGoError is the error used by Import to describe a directory
-// containing no buildable Go source files. (It may still contain
-// test files, files hidden by build tags, and so on.)
-type NoGoError struct {
-	Dir string
-}
-
-func (e *NoGoError) Error() string {
-	return "no buildable Go source files in " + e.Dir
-}
-
-// MultiplePackageError describes a directory containing
-// multiple buildable Go source files for multiple packages.
-type MultiplePackageError struct {
-	Dir      string   // directory containing files
-	Packages []string // package names found
-	Files    []string // corresponding files: Files[i] declares package Packages[i]
-}
-
-func (e *MultiplePackageError) Error() string {
-	// Error string limited to two entries for compatibility.
-	return fmt.Sprintf("found packages %s (%s) and %s (%s) in %s", e.Packages[0], e.Files[0], e.Packages[1], e.Files[1], e.Dir)
-}
-
-func nameExt(name string) string {
-	i := strings.LastIndex(name, ".")
-	if i < 0 {
-		return ""
-	}
-	return name[i:]
-}
-
-// Import returns details about the Go package named by the import path,
-// interpreting local import paths relative to the srcDir directory.
-// If the path is a local import path naming a package that can be imported
-// using a standard import path, the returned package will set p.ImportPath
-// to that path.
-//
-// In the directory containing the package, .go, .c, .h, and .s files are
-// considered part of the package except for:
-//
-//	- .go files in package documentation
-//	- files starting with _ or . (likely editor temporary files)
-//	- files with build constraints not satisfied by the context
-//
-// If an error occurs, Import returns a non-nil error and a non-nil
-// *Package containing partial information.
-//
-func (ctxt *Context) Import(path string, srcDir string, mode ImportMode) (*Package, error) {
-	p := &Package{
-		ImportPath: path,
-	}
-	if path == "" {
-		return p, fmt.Errorf("import %q: invalid import path", path)
-	}
-
-	var pkgtargetroot string
-	var pkga string
-	var pkgerr error
-	suffix := ""
-	if ctxt.InstallSuffix != "" {
-		suffix = "_" + ctxt.InstallSuffix
-	}
-	switch ctxt.Compiler {
-	case "gccgo":
-		pkgtargetroot = "pkg/gccgo_" + ctxt.GOOS + "_" + ctxt.GOARCH + suffix
-		dir, elem := pathpkg.Split(p.ImportPath)
-		pkga = pkgtargetroot + "/" + dir + "lib" + elem + ".a"
-	case "gc":
-		pkgtargetroot = "pkg/" + ctxt.GOOS + "_" + ctxt.GOARCH + suffix
-		pkga = pkgtargetroot + "/" + p.ImportPath + ".a"
-	default:
-		// Save error for end of function.
-		pkgerr = fmt.Errorf("import %q: unknown compiler %q", path, ctxt.Compiler)
-	}
-
-	binaryOnly := false
-	if IsLocalImport(path) {
-		pkga = "" // local imports have no installed path
-		if srcDir == "" {
-			return p, fmt.Errorf("import %q: import relative to unknown directory", path)
-		}
-		if !ctxt.isAbsPath(path) {
-			p.Dir = ctxt.joinPath(srcDir, path)
-		}
-		// Determine canonical import path, if any.
-		// Exclude results where the import path would include /testdata/.
-		inTestdata := func(sub string) bool {
-			return strings.Contains(sub, "/testdata/") || strings.HasSuffix(sub, "/testdata") || strings.HasPrefix(sub, "testdata/") || sub == "testdata"
-		}
-		if ctxt.GOROOT != "" {
-			root := ctxt.joinPath(ctxt.GOROOT, "src")
-			if sub, ok := ctxt.hasSubdir(root, p.Dir); ok && !inTestdata(sub) {
-				p.Goroot = true
-				p.ImportPath = sub
-				p.Root = ctxt.GOROOT
-				goto Found
-			}
-		}
-		all := ctxt.gopath()
-		for i, root := range all {
-			rootsrc := ctxt.joinPath(root, "src")
-			if sub, ok := ctxt.hasSubdir(rootsrc, p.Dir); ok && !inTestdata(sub) {
-				// We found a potential import path for dir,
-				// but check that using it wouldn't find something
-				// else first.
-				if ctxt.GOROOT != "" {
-					if dir := ctxt.joinPath(ctxt.GOROOT, "src", sub); ctxt.isDir(dir) {
-						p.ConflictDir = dir
-						goto Found
-					}
-				}
-				for _, earlyRoot := range all[:i] {
-					if dir := ctxt.joinPath(earlyRoot, "src", sub); ctxt.isDir(dir) {
-						p.ConflictDir = dir
-						goto Found
-					}
-				}
-
-				// sub would not name some other directory instead of this one.
-				// Record it.
-				p.ImportPath = sub
-				p.Root = root
-				goto Found
-			}
-		}
-		// It's okay that we didn't find a root containing dir.
-		// Keep going with the information we have.
-	} else {
-		if strings.HasPrefix(path, "/") {
-			return p, fmt.Errorf("import %q: cannot import absolute path", path)
-		}
-
-		// tried records the location of unsuccessful package lookups
-		var tried struct {
-			goroot string
-			gopath []string
-		}
-
-		// Determine directory from import path.
-		if ctxt.GOROOT != "" {
-			dir := ctxt.joinPath(ctxt.GOROOT, "src", path)
-			isDir := ctxt.isDir(dir)
-			binaryOnly = !isDir && mode&AllowBinary != 0 && pkga != "" && ctxt.isFile(ctxt.joinPath(ctxt.GOROOT, pkga))
-			if isDir || binaryOnly {
-				p.Dir = dir
-				p.Goroot = true
-				p.Root = ctxt.GOROOT
-				goto Found
-			}
-			tried.goroot = dir
-		}
-		for _, root := range ctxt.gopath() {
-			dir := ctxt.joinPath(root, "src", path)
-			isDir := ctxt.isDir(dir)
-			binaryOnly = !isDir && mode&AllowBinary != 0 && pkga != "" && ctxt.isFile(ctxt.joinPath(root, pkga))
-			if isDir || binaryOnly {
-				p.Dir = dir
-				p.Root = root
-				goto Found
-			}
-			tried.gopath = append(tried.gopath, dir)
-		}
-
-		// package was not found
-		var paths []string
-		if tried.goroot != "" {
-			paths = append(paths, fmt.Sprintf("\t%s (from $GOROOT)", tried.goroot))
-		} else {
-			paths = append(paths, "\t($GOROOT not set)")
-		}
-		var i int
-		var format = "\t%s (from $GOPATH)"
-		for ; i < len(tried.gopath); i++ {
-			if i > 0 {
-				format = "\t%s"
-			}
-			paths = append(paths, fmt.Sprintf(format, tried.gopath[i]))
-		}
-		if i == 0 {
-			paths = append(paths, "\t($GOPATH not set)")
-		}
-		return p, fmt.Errorf("cannot find package %q in any of:\n%s", path, strings.Join(paths, "\n"))
-	}
-
-Found:
-	if p.Root != "" {
-		p.SrcRoot = ctxt.joinPath(p.Root, "src")
-		p.PkgRoot = ctxt.joinPath(p.Root, "pkg")
-		p.BinDir = ctxt.joinPath(p.Root, "bin")
-		if pkga != "" {
-			p.PkgTargetRoot = ctxt.joinPath(p.Root, pkgtargetroot)
-			p.PkgObj = ctxt.joinPath(p.Root, pkga)
-		}
-	}
-
-	if mode&FindOnly != 0 {
-		return p, pkgerr
-	}
-	if binaryOnly && (mode&AllowBinary) != 0 {
-		return p, pkgerr
-	}
-
-	dirs, err := ctxt.readDir(p.Dir)
-	if err != nil {
-		return p, err
-	}
-
-	var Sfiles []string // files with ".S" (capital S)
-	var firstFile, firstCommentFile string
-	imported := make(map[string][]token.Position)
-	testImported := make(map[string][]token.Position)
-	xTestImported := make(map[string][]token.Position)
-	allTags := make(map[string]bool)
-	fset := token.NewFileSet()
-	for _, d := range dirs {
-		if d.IsDir() {
-			continue
-		}
-
-		name := d.Name()
-		ext := nameExt(name)
-
-		match, data, filename, err := ctxt.matchFile(p.Dir, name, true, allTags)
-		if err != nil {
-			return p, err
-		}
-		if !match {
-			if ext == ".go" {
-				p.IgnoredGoFiles = append(p.IgnoredGoFiles, name)
-			}
-			continue
-		}
-
-		// Going to save the file.  For non-Go files, can stop here.
-		switch ext {
-		case ".c":
-			p.CFiles = append(p.CFiles, name)
-			continue
-		case ".cc", ".cpp", ".cxx":
-			p.CXXFiles = append(p.CXXFiles, name)
-			continue
-		case ".m":
-			p.MFiles = append(p.MFiles, name)
-			continue
-		case ".h", ".hh", ".hpp", ".hxx":
-			p.HFiles = append(p.HFiles, name)
-			continue
-		case ".s":
-			p.SFiles = append(p.SFiles, name)
-			continue
-		case ".S":
-			Sfiles = append(Sfiles, name)
-			continue
-		case ".swig":
-			p.SwigFiles = append(p.SwigFiles, name)
-			continue
-		case ".swigcxx":
-			p.SwigCXXFiles = append(p.SwigCXXFiles, name)
-			continue
-		case ".syso":
-			// binary objects to add to package archive
-			// Likely of the form foo_windows.syso, but
-			// the name was vetted above with goodOSArchFile.
-			p.SysoFiles = append(p.SysoFiles, name)
-			continue
-		}
-
-		pf, err := parser.ParseFile(fset, filename, data, parser.ImportsOnly|parser.ParseComments)
-		if err != nil {
-			return p, err
-		}
-
-		pkg := pf.Name.Name
-		if pkg == "documentation" {
-			p.IgnoredGoFiles = append(p.IgnoredGoFiles, name)
-			continue
-		}
-
-		isTest := strings.HasSuffix(name, "_test.go")
-		isXTest := false
-		if isTest && strings.HasSuffix(pkg, "_test") {
-			isXTest = true
-			pkg = pkg[:len(pkg)-len("_test")]
-		}
-
-		if p.Name == "" {
-			p.Name = pkg
-			firstFile = name
-		} else if pkg != p.Name {
-			return p, &MultiplePackageError{
-				Dir:      p.Dir,
-				Packages: []string{p.Name, pkg},
-				Files:    []string{firstFile, name},
-			}
-		}
-		if pf.Doc != nil && p.Doc == "" {
-			p.Doc = doc.Synopsis(pf.Doc.Text())
-		}
-
-		if mode&ImportComment != 0 {
-			qcom, line := findImportComment(data)
-			if line != 0 {
-				com, err := strconv.Unquote(qcom)
-				if err != nil {
-					return p, fmt.Errorf("%s:%d: cannot parse import comment", filename, line)
-				}
-				if p.ImportComment == "" {
-					p.ImportComment = com
-					firstCommentFile = name
-				} else if p.ImportComment != com {
-					return p, fmt.Errorf("found import comments %q (%s) and %q (%s) in %s", p.ImportComment, firstCommentFile, com, name, p.Dir)
-				}
-			}
-		}
-
-		// Record imports and information about cgo.
-		isCgo := false
-		for _, decl := range pf.Decls {
-			d, ok := decl.(*ast.GenDecl)
-			if !ok {
-				continue
-			}
-			for _, dspec := range d.Specs {
-				spec, ok := dspec.(*ast.ImportSpec)
-				if !ok {
-					continue
-				}
-				quoted := spec.Path.Value
-				path, err := strconv.Unquote(quoted)
-				if err != nil {
-					log.Panicf("%s: parser returned invalid quoted string: <%s>", filename, quoted)
-				}
-				if isXTest {
-					xTestImported[path] = append(xTestImported[path], fset.Position(spec.Pos()))
-				} else if isTest {
-					testImported[path] = append(testImported[path], fset.Position(spec.Pos()))
-				} else {
-					imported[path] = append(imported[path], fset.Position(spec.Pos()))
-				}
-				if path == "C" {
-					if isTest {
-						return p, fmt.Errorf("use of cgo in test %s not supported", filename)
-					}
-					cg := spec.Doc
-					if cg == nil && len(d.Specs) == 1 {
-						cg = d.Doc
-					}
-					if cg != nil {
-						if err := ctxt.saveCgo(filename, p, cg); err != nil {
-							return p, err
-						}
-					}
-					isCgo = true
-				}
-			}
-		}
-		if isCgo {
-			allTags["cgo"] = true
-			if ctxt.CgoEnabled {
-				p.CgoFiles = append(p.CgoFiles, name)
-			} else {
-				p.IgnoredGoFiles = append(p.IgnoredGoFiles, name)
-			}
-		} else if isXTest {
-			p.XTestGoFiles = append(p.XTestGoFiles, name)
-		} else if isTest {
-			p.TestGoFiles = append(p.TestGoFiles, name)
-		} else {
-			p.GoFiles = append(p.GoFiles, name)
-		}
-	}
-	if len(p.GoFiles)+len(p.CgoFiles)+len(p.TestGoFiles)+len(p.XTestGoFiles) == 0 {
-		return p, &NoGoError{p.Dir}
-	}
-
-	for tag := range allTags {
-		p.AllTags = append(p.AllTags, tag)
-	}
-	sort.Strings(p.AllTags)
-
-	p.Imports, p.ImportPos = cleanImports(imported)
-	p.TestImports, p.TestImportPos = cleanImports(testImported)
-	p.XTestImports, p.XTestImportPos = cleanImports(xTestImported)
-
-	// add the .S files only if we are using cgo
-	// (which means gcc will compile them).
-	// The standard assemblers expect .s files.
-	if len(p.CgoFiles) > 0 {
-		p.SFiles = append(p.SFiles, Sfiles...)
-		sort.Strings(p.SFiles)
-	}
-
-	return p, pkgerr
-}
-
-func findImportComment(data []byte) (s string, line int) {
-	// expect keyword package
-	word, data := parseWord(data)
-	if string(word) != "package" {
-		return "", 0
-	}
-
-	// expect package name
-	_, data = parseWord(data)
-
-	// now ready for import comment, a // or /* */ comment
-	// beginning and ending on the current line.
-	for len(data) > 0 && (data[0] == ' ' || data[0] == '\t' || data[0] == '\r') {
-		data = data[1:]
-	}
-
-	var comment []byte
-	switch {
-	case bytes.HasPrefix(data, slashSlash):
-		i := bytes.Index(data, newline)
-		if i < 0 {
-			i = len(data)
-		}
-		comment = data[2:i]
-	case bytes.HasPrefix(data, slashStar):
-		data = data[2:]
-		i := bytes.Index(data, starSlash)
-		if i < 0 {
-			// malformed comment
-			return "", 0
-		}
-		comment = data[:i]
-		if bytes.Contains(comment, newline) {
-			return "", 0
-		}
-	}
-	comment = bytes.TrimSpace(comment)
-
-	// split comment into `import`, `"pkg"`
-	word, arg := parseWord(comment)
-	if string(word) != "import" {
-		return "", 0
-	}
-
-	line = 1 + bytes.Count(data[:cap(data)-cap(arg)], newline)
-	return strings.TrimSpace(string(arg)), line
-}
-
-var (
-	slashSlash = []byte("//")
-	slashStar  = []byte("/*")
-	starSlash  = []byte("*/")
-	newline    = []byte("\n")
-)
-
-// skipSpaceOrComment returns data with any leading spaces or comments removed.
-func skipSpaceOrComment(data []byte) []byte {
-	for len(data) > 0 {
-		switch data[0] {
-		case ' ', '\t', '\r', '\n':
-			data = data[1:]
-			continue
-		case '/':
-			if bytes.HasPrefix(data, slashSlash) {
-				i := bytes.Index(data, newline)
-				if i < 0 {
-					return nil
-				}
-				data = data[i+1:]
-				continue
-			}
-			if bytes.HasPrefix(data, slashStar) {
-				data = data[2:]
-				i := bytes.Index(data, starSlash)
-				if i < 0 {
-					return nil
-				}
-				data = data[i+2:]
-				continue
-			}
-		}
-		break
-	}
-	return data
-}
-
-// parseWord skips any leading spaces or comments in data
-// and then parses the beginning of data as an identifier or keyword,
-// returning that word and what remains after the word.
-func parseWord(data []byte) (word, rest []byte) {
-	data = skipSpaceOrComment(data)
-
-	// Parse past leading word characters.
-	rest = data
-	for {
-		r, size := utf8.DecodeRune(rest)
-		if unicode.IsLetter(r) || '0' <= r && r <= '9' || r == '_' {
-			rest = rest[size:]
-			continue
-		}
-		break
-	}
-
-	word = data[:len(data)-len(rest)]
-	if len(word) == 0 {
-		return nil, nil
-	}
-
-	return word, rest
-}
-
-// MatchFile reports whether the file with the given name in the given directory
-// matches the context and would be included in a Package created by ImportDir
-// of that directory.
-//
-// MatchFile considers the name of the file and may use ctxt.OpenFile to
-// read some or all of the file's content.
-func (ctxt *Context) MatchFile(dir, name string) (match bool, err error) {
-	match, _, _, err = ctxt.matchFile(dir, name, false, nil)
-	return
-}
-
-// matchFile determines whether the file with the given name in the given directory
-// should be included in the package being constructed.
-// It returns the data read from the file.
-// If returnImports is true and name denotes a Go program, matchFile reads
-// until the end of the imports (and returns that data) even though it only
-// considers text until the first non-comment.
-// If allTags is non-nil, matchFile records any encountered build tag
-// by setting allTags[tag] = true.
-func (ctxt *Context) matchFile(dir, name string, returnImports bool, allTags map[string]bool) (match bool, data []byte, filename string, err error) {
-	if strings.HasPrefix(name, "_") ||
-		strings.HasPrefix(name, ".") {
-		return
-	}
-
-	i := strings.LastIndex(name, ".")
-	if i < 0 {
-		i = len(name)
-	}
-	ext := name[i:]
-
-	if !ctxt.goodOSArchFile(name, allTags) && !ctxt.UseAllFiles {
-		return
-	}
-
-	switch ext {
-	case ".go", ".c", ".cc", ".cxx", ".cpp", ".m", ".s", ".h", ".hh", ".hpp", ".hxx", ".S", ".swig", ".swigcxx":
-		// tentatively okay - read to make sure
-	case ".syso":
-		// binary, no reading
-		match = true
-		return
-	default:
-		// skip
-		return
-	}
-
-	filename = ctxt.joinPath(dir, name)
-	f, err := ctxt.openFile(filename)
-	if err != nil {
-		return
-	}
-
-	if strings.HasSuffix(filename, ".go") {
-		data, err = readImports(f, false, nil)
-	} else {
-		data, err = readComments(f)
-	}
-	f.Close()
-	if err != nil {
-		err = fmt.Errorf("read %s: %v", filename, err)
-		return
-	}
-
-	// Look for +build comments to accept or reject the file.
-	if !ctxt.shouldBuild(data, allTags) && !ctxt.UseAllFiles {
-		return
-	}
-
-	match = true
-	return
-}
-
-func cleanImports(m map[string][]token.Position) ([]string, map[string][]token.Position) {
-	all := make([]string, 0, len(m))
-	for path := range m {
-		all = append(all, path)
-	}
-	sort.Strings(all)
-	return all, m
-}
-
-// Import is shorthand for Default.Import.
-func Import(path, srcDir string, mode ImportMode) (*Package, error) {
-	return Default.Import(path, srcDir, mode)
-}
-
-// ImportDir is shorthand for Default.ImportDir.
-func ImportDir(dir string, mode ImportMode) (*Package, error) {
-	return Default.ImportDir(dir, mode)
-}
-
-var slashslash = []byte("//")
-
-// shouldBuild reports whether it is okay to use this file,
-// The rule is that in the file's leading run of // comments
-// and blank lines, which must be followed by a blank line
-// (to avoid including a Go package clause doc comment),
-// lines beginning with '// +build' are taken as build directives.
-//
-// The file is accepted only if each such line lists something
-// matching the file.  For example:
-//
-//	// +build windows linux
-//
-// marks the file as applicable only on Windows and Linux.
-//
-func (ctxt *Context) shouldBuild(content []byte, allTags map[string]bool) bool {
-	// Pass 1. Identify leading run of // comments and blank lines,
-	// which must be followed by a blank line.
-	end := 0
-	p := content
-	for len(p) > 0 {
-		line := p
-		if i := bytes.IndexByte(line, '\n'); i >= 0 {
-			line, p = line[:i], p[i+1:]
-		} else {
-			p = p[len(p):]
-		}
-		line = bytes.TrimSpace(line)
-		if len(line) == 0 { // Blank line
-			end = len(content) - len(p)
-			continue
-		}
-		if !bytes.HasPrefix(line, slashslash) { // Not comment line
-			break
-		}
-	}
-	content = content[:end]
-
-	// Pass 2.  Process each line in the run.
-	p = content
-	allok := true
-	for len(p) > 0 {
-		line := p
-		if i := bytes.IndexByte(line, '\n'); i >= 0 {
-			line, p = line[:i], p[i+1:]
-		} else {
-			p = p[len(p):]
-		}
-		line = bytes.TrimSpace(line)
-		if bytes.HasPrefix(line, slashslash) {
-			line = bytes.TrimSpace(line[len(slashslash):])
-			if len(line) > 0 && line[0] == '+' {
-				// Looks like a comment +line.
-				f := strings.Fields(string(line))
-				if f[0] == "+build" {
-					ok := false
-					for _, tok := range f[1:] {
-						if ctxt.match(tok, allTags) {
-							ok = true
-						}
-					}
-					if !ok {
-						allok = false
-					}
-				}
-			}
-		}
-	}
-
-	return allok
-}
-
-// saveCgo saves the information from the #cgo lines in the import "C" comment.
-// These lines set CFLAGS, CPPFLAGS, CXXFLAGS and LDFLAGS and pkg-config directives
-// that affect the way cgo's C code is built.
-func (ctxt *Context) saveCgo(filename string, di *Package, cg *ast.CommentGroup) error {
-	text := cg.Text()
-	for _, line := range strings.Split(text, "\n") {
-		orig := line
-
-		// Line is
-		//	#cgo [GOOS/GOARCH...] LDFLAGS: stuff
-		//
-		line = strings.TrimSpace(line)
-		if len(line) < 5 || line[:4] != "#cgo" || (line[4] != ' ' && line[4] != '\t') {
-			continue
-		}
-
-		// Split at colon.
-		line = strings.TrimSpace(line[4:])
-		i := strings.Index(line, ":")
-		if i < 0 {
-			return fmt.Errorf("%s: invalid #cgo line: %s", filename, orig)
-		}
-		line, argstr := line[:i], line[i+1:]
-
-		// Parse GOOS/GOARCH stuff.
-		f := strings.Fields(line)
-		if len(f) < 1 {
-			return fmt.Errorf("%s: invalid #cgo line: %s", filename, orig)
-		}
-
-		cond, verb := f[:len(f)-1], f[len(f)-1]
-		if len(cond) > 0 {
-			ok := false
-			for _, c := range cond {
-				if ctxt.match(c, nil) {
-					ok = true
-					break
-				}
-			}
-			if !ok {
-				continue
-			}
-		}
-
-		args, err := splitQuoted(argstr)
-		if err != nil {
-			return fmt.Errorf("%s: invalid #cgo line: %s", filename, orig)
-		}
-		for i, arg := range args {
-			arg = expandSrcDir(arg, di.Dir)
-			if !safeCgoName(arg) {
-				return fmt.Errorf("%s: malformed #cgo argument: %s", filename, arg)
-			}
-			args[i] = arg
-		}
-
-		switch verb {
-		case "CFLAGS":
-			di.CgoCFLAGS = append(di.CgoCFLAGS, args...)
-		case "CPPFLAGS":
-			di.CgoCPPFLAGS = append(di.CgoCPPFLAGS, args...)
-		case "CXXFLAGS":
-			di.CgoCXXFLAGS = append(di.CgoCXXFLAGS, args...)
-		case "LDFLAGS":
-			di.CgoLDFLAGS = append(di.CgoLDFLAGS, args...)
-		case "pkg-config":
-			di.CgoPkgConfig = append(di.CgoPkgConfig, args...)
-		default:
-			return fmt.Errorf("%s: invalid #cgo verb: %s", filename, orig)
-		}
-	}
-	return nil
-}
-
-func expandSrcDir(str string, srcdir string) string {
-	// "\" delimited paths cause safeCgoName to fail
-	// so convert native paths with a different delimeter
-	// to "/" before starting (eg: on windows)
-	srcdir = filepath.ToSlash(srcdir)
-	return strings.Replace(str, "${SRCDIR}", srcdir, -1)
-}
-
-// NOTE: $ is not safe for the shell, but it is allowed here because of linker options like -Wl,$ORIGIN.
-// We never pass these arguments to a shell (just to programs we construct argv for), so this should be okay.
-// See golang.org/issue/6038.
-var safeBytes = []byte("+-.,/0123456789=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz:$")
-
-func safeCgoName(s string) bool {
-	if s == "" {
-		return false
-	}
-	for i := 0; i < len(s); i++ {
-		if c := s[i]; c < 0x80 && bytes.IndexByte(safeBytes, c) < 0 {
-			return false
-		}
-	}
-	return true
-}
-
-// splitQuoted splits the string s around each instance of one or more consecutive
-// white space characters while taking into account quotes and escaping, and
-// returns an array of substrings of s or an empty list if s contains only white space.
-// Single quotes and double quotes are recognized to prevent splitting within the
-// quoted region, and are removed from the resulting substrings. If a quote in s
-// isn't closed err will be set and r will have the unclosed argument as the
-// last element.  The backslash is used for escaping.
-//
-// For example, the following string:
-//
-//     a b:"c d" 'e''f'  "g\""
-//
-// Would be parsed as:
-//
-//     []string{"a", "b:c d", "ef", `g"`}
-//
-func splitQuoted(s string) (r []string, err error) {
-	var args []string
-	arg := make([]rune, len(s))
-	escaped := false
-	quoted := false
-	quote := '\x00'
-	i := 0
-	for _, rune := range s {
-		switch {
-		case escaped:
-			escaped = false
-		case rune == '\\':
-			escaped = true
-			continue
-		case quote != '\x00':
-			if rune == quote {
-				quote = '\x00'
-				continue
-			}
-		case rune == '"' || rune == '\'':
-			quoted = true
-			quote = rune
-			continue
-		case unicode.IsSpace(rune):
-			if quoted || i > 0 {
-				quoted = false
-				args = append(args, string(arg[:i]))
-				i = 0
-			}
-			continue
-		}
-		arg[i] = rune
-		i++
-	}
-	if quoted || i > 0 {
-		args = append(args, string(arg[:i]))
-	}
-	if quote != 0 {
-		err = errors.New("unclosed quote")
-	} else if escaped {
-		err = errors.New("unfinished escaping")
-	}
-	return args, err
-}
-
-// match reports whether the name is one of:
-//
-//	$GOOS
-//	$GOARCH
-//	cgo (if cgo is enabled)
-//	!cgo (if cgo is disabled)
-//	ctxt.Compiler
-//	!ctxt.Compiler
-//	tag (if tag is listed in ctxt.BuildTags or ctxt.ReleaseTags)
-//	!tag (if tag is not listed in ctxt.BuildTags or ctxt.ReleaseTags)
-//	a comma-separated list of any of these
-//
-func (ctxt *Context) match(name string, allTags map[string]bool) bool {
-	if name == "" {
-		if allTags != nil {
-			allTags[name] = true
-		}
-		return false
-	}
-	if i := strings.Index(name, ","); i >= 0 {
-		// comma-separated list
-		ok1 := ctxt.match(name[:i], allTags)
-		ok2 := ctxt.match(name[i+1:], allTags)
-		return ok1 && ok2
-	}
-	if strings.HasPrefix(name, "!!") { // bad syntax, reject always
-		return false
-	}
-	if strings.HasPrefix(name, "!") { // negation
-		return len(name) > 1 && !ctxt.match(name[1:], allTags)
-	}
-
-	if allTags != nil {
-		allTags[name] = true
-	}
-
-	// Tags must be letters, digits, underscores or dots.
-	// Unlike in Go identifiers, all digits are fine (e.g., "386").
-	for _, c := range name {
-		if !unicode.IsLetter(c) && !unicode.IsDigit(c) && c != '_' && c != '.' {
-			return false
-		}
-	}
-
-	// special tags
-	if ctxt.CgoEnabled && name == "cgo" {
-		return true
-	}
-	if name == ctxt.GOOS || name == ctxt.GOARCH || name == ctxt.Compiler {
-		return true
-	}
-	if ctxt.GOOS == "android" && name == "linux" {
-		return true
-	}
-
-	// other tags
-	for _, tag := range ctxt.BuildTags {
-		if tag == name {
-			return true
-		}
-	}
-	for _, tag := range ctxt.ReleaseTags {
-		if tag == name {
-			return true
-		}
-	}
-
-	return false
-}
-
-// goodOSArchFile returns false if the name contains a $GOOS or $GOARCH
-// suffix which does not match the current system.
-// The recognized name formats are:
-//
-//     name_$(GOOS).*
-//     name_$(GOARCH).*
-//     name_$(GOOS)_$(GOARCH).*
-//     name_$(GOOS)_test.*
-//     name_$(GOARCH)_test.*
-//     name_$(GOOS)_$(GOARCH)_test.*
-//
-// An exception: if GOOS=android, then files with GOOS=linux are also matched.
-func (ctxt *Context) goodOSArchFile(name string, allTags map[string]bool) bool {
-	if dot := strings.Index(name, "."); dot != -1 {
-		name = name[:dot]
-	}
-
-	// Before Go 1.4, a file called "linux.go" would be equivalent to having a
-	// build tag "linux" in that file. For Go 1.4 and beyond, we require this
-	// auto-tagging to apply only to files with a non-empty prefix, so
-	// "foo_linux.go" is tagged but "linux.go" is not. This allows new operating
-	// systems, such as android, to arrive without breaking existing code with
-	// innocuous source code in "android.go". The easiest fix: cut everything
-	// in the name before the initial _.
-	i := strings.Index(name, "_")
-	if i < 0 {
-		return true
-	}
-	name = name[i:] // ignore everything before first _
-
-	l := strings.Split(name, "_")
-	if n := len(l); n > 0 && l[n-1] == "test" {
-		l = l[:n-1]
-	}
-	n := len(l)
-	if n >= 2 && knownOS[l[n-2]] && knownArch[l[n-1]] {
-		if allTags != nil {
-			allTags[l[n-2]] = true
-			allTags[l[n-1]] = true
-		}
-		if l[n-1] != ctxt.GOARCH {
-			return false
-		}
-		if ctxt.GOOS == "android" && l[n-2] == "linux" {
-			return true
-		}
-		return l[n-2] == ctxt.GOOS
-	}
-	if n >= 1 && knownOS[l[n-1]] {
-		if allTags != nil {
-			allTags[l[n-1]] = true
-		}
-		if ctxt.GOOS == "android" && l[n-1] == "linux" {
-			return true
-		}
-		return l[n-1] == ctxt.GOOS
-	}
-	if n >= 1 && knownArch[l[n-1]] {
-		if allTags != nil {
-			allTags[l[n-1]] = true
-		}
-		return l[n-1] == ctxt.GOARCH
-	}
-	return true
-}
-
-var knownOS = make(map[string]bool)
-var knownArch = make(map[string]bool)
-
-func init() {
-	for _, v := range strings.Fields(goosList) {
-		knownOS[v] = true
-	}
-	for _, v := range strings.Fields(goarchList) {
-		knownArch[v] = true
-	}
-}
-
-func getToolDir() string {
-	if runtime.Compiler == "gccgo" {
-		return runtime.GCCGOTOOLDIR
-	} else {
-		return filepath.Join(runtime.GOROOT(), "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH)
-	}
-}
-
-var ToolDir = getToolDir()
-
-// IsLocalImport reports whether the import path is
-// a local import path, like ".", "..", "./foo", or "../foo".
-func IsLocalImport(path string) bool {
-	return path == "." || path == ".." ||
-		strings.HasPrefix(path, "./") || strings.HasPrefix(path, "../")
-}
-
-// ArchChar returns "?" and an error.
-// In earlier versions of Go, the returned string was used to derive
-// the compiler and linker tool names, the default object file suffix,
-// and the default linker output name. As of Go 1.5, those strings
-// no longer vary by architecture; they are compile, link, .o, and a.out, respectively.
-func ArchChar(goarch string) (string, error) {
-	return "?", errors.New("architecture letter no longer used")
-}
diff --git a/third_party/gofrontend/libgo/go/go/build/build_test.go b/third_party/gofrontend/libgo/go/go/build/build_test.go
deleted file mode 100644
index 2709ca3..0000000
--- a/third_party/gofrontend/libgo/go/go/build/build_test.go
+++ /dev/null
@@ -1,279 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package build
-
-import (
-	"io"
-	"os"
-	"path/filepath"
-	"reflect"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-func TestMatch(t *testing.T) {
-	ctxt := Default
-	what := "default"
-	match := func(tag string, want map[string]bool) {
-		m := make(map[string]bool)
-		if !ctxt.match(tag, m) {
-			t.Errorf("%s context should match %s, does not", what, tag)
-		}
-		if !reflect.DeepEqual(m, want) {
-			t.Errorf("%s tags = %v, want %v", tag, m, want)
-		}
-	}
-	nomatch := func(tag string, want map[string]bool) {
-		m := make(map[string]bool)
-		if ctxt.match(tag, m) {
-			t.Errorf("%s context should NOT match %s, does", what, tag)
-		}
-		if !reflect.DeepEqual(m, want) {
-			t.Errorf("%s tags = %v, want %v", tag, m, want)
-		}
-	}
-
-	match(runtime.GOOS+","+runtime.GOARCH, map[string]bool{runtime.GOOS: true, runtime.GOARCH: true})
-	match(runtime.GOOS+","+runtime.GOARCH+",!foo", map[string]bool{runtime.GOOS: true, runtime.GOARCH: true, "foo": true})
-	nomatch(runtime.GOOS+","+runtime.GOARCH+",foo", map[string]bool{runtime.GOOS: true, runtime.GOARCH: true, "foo": true})
-
-	what = "modified"
-	ctxt.BuildTags = []string{"foo"}
-	match(runtime.GOOS+","+runtime.GOARCH, map[string]bool{runtime.GOOS: true, runtime.GOARCH: true})
-	match(runtime.GOOS+","+runtime.GOARCH+",foo", map[string]bool{runtime.GOOS: true, runtime.GOARCH: true, "foo": true})
-	nomatch(runtime.GOOS+","+runtime.GOARCH+",!foo", map[string]bool{runtime.GOOS: true, runtime.GOARCH: true, "foo": true})
-	match(runtime.GOOS+","+runtime.GOARCH+",!bar", map[string]bool{runtime.GOOS: true, runtime.GOARCH: true, "bar": true})
-	nomatch(runtime.GOOS+","+runtime.GOARCH+",bar", map[string]bool{runtime.GOOS: true, runtime.GOARCH: true, "bar": true})
-	nomatch("!", map[string]bool{})
-}
-
-func TestDotSlashImport(t *testing.T) {
-	p, err := ImportDir("testdata/other", 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if len(p.Imports) != 1 || p.Imports[0] != "./file" {
-		t.Fatalf("testdata/other: Imports=%v, want [./file]", p.Imports)
-	}
-
-	p1, err := Import("./file", "testdata/other", 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if p1.Name != "file" {
-		t.Fatalf("./file: Name=%q, want %q", p1.Name, "file")
-	}
-	dir := filepath.Clean("testdata/other/file") // Clean to use \ on Windows
-	if p1.Dir != dir {
-		t.Fatalf("./file: Dir=%q, want %q", p1.Name, dir)
-	}
-}
-
-func TestEmptyImport(t *testing.T) {
-	p, err := Import("", Default.GOROOT, FindOnly)
-	if err == nil {
-		t.Fatal(`Import("") returned nil error.`)
-	}
-	if p == nil {
-		t.Fatal(`Import("") returned nil package.`)
-	}
-	if p.ImportPath != "" {
-		t.Fatalf("ImportPath=%q, want %q.", p.ImportPath, "")
-	}
-}
-
-func TestEmptyFolderImport(t *testing.T) {
-	_, err := Import(".", "testdata/empty", 0)
-	if _, ok := err.(*NoGoError); !ok {
-		t.Fatal(`Import("testdata/empty") did not return NoGoError.`)
-	}
-}
-
-func TestMultiplePackageImport(t *testing.T) {
-	_, err := Import(".", "testdata/multi", 0)
-	mpe, ok := err.(*MultiplePackageError)
-	if !ok {
-		t.Fatal(`Import("testdata/multi") did not return MultiplePackageError.`)
-	}
-	want := &MultiplePackageError{
-		Dir:      filepath.FromSlash("testdata/multi"),
-		Packages: []string{"main", "test_package"},
-		Files:    []string{"file.go", "file_appengine.go"},
-	}
-	if !reflect.DeepEqual(mpe, want) {
-		t.Errorf("got %#v; want %#v", mpe, want)
-	}
-}
-
-func TestLocalDirectory(t *testing.T) {
-	t.Skip("does not work with gccgo")
-	if runtime.GOOS == "darwin" {
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			t.Skipf("skipping on %s/%s, no valid GOROOT", runtime.GOOS, runtime.GOARCH)
-		}
-	}
-
-	cwd, err := os.Getwd()
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	p, err := ImportDir(cwd, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if p.ImportPath != "go/build" {
-		t.Fatalf("ImportPath=%q, want %q", p.ImportPath, "go/build")
-	}
-}
-
-func TestShouldBuild(t *testing.T) {
-	const file1 = "// +build tag1\n\n" +
-		"package main\n"
-	want1 := map[string]bool{"tag1": true}
-
-	const file2 = "// +build cgo\n\n" +
-		"// This package implements parsing of tags like\n" +
-		"// +build tag1\n" +
-		"package build"
-	want2 := map[string]bool{"cgo": true}
-
-	const file3 = "// Copyright The Go Authors.\n\n" +
-		"package build\n\n" +
-		"// shouldBuild checks tags given by lines of the form\n" +
-		"// +build tag\n" +
-		"func shouldBuild(content []byte)\n"
-	want3 := map[string]bool{}
-
-	ctx := &Context{BuildTags: []string{"tag1"}}
-	m := map[string]bool{}
-	if !ctx.shouldBuild([]byte(file1), m) {
-		t.Errorf("shouldBuild(file1) = false, want true")
-	}
-	if !reflect.DeepEqual(m, want1) {
-		t.Errorf("shoudBuild(file1) tags = %v, want %v", m, want1)
-	}
-
-	m = map[string]bool{}
-	if ctx.shouldBuild([]byte(file2), m) {
-		t.Errorf("shouldBuild(file2) = true, want fakse")
-	}
-	if !reflect.DeepEqual(m, want2) {
-		t.Errorf("shoudBuild(file2) tags = %v, want %v", m, want2)
-	}
-
-	m = map[string]bool{}
-	ctx = &Context{BuildTags: nil}
-	if !ctx.shouldBuild([]byte(file3), m) {
-		t.Errorf("shouldBuild(file3) = false, want true")
-	}
-	if !reflect.DeepEqual(m, want3) {
-		t.Errorf("shoudBuild(file3) tags = %v, want %v", m, want3)
-	}
-}
-
-type readNopCloser struct {
-	io.Reader
-}
-
-func (r readNopCloser) Close() error {
-	return nil
-}
-
-var (
-	ctxtP9      = Context{GOARCH: "arm", GOOS: "plan9"}
-	ctxtAndroid = Context{GOARCH: "arm", GOOS: "android"}
-)
-
-var matchFileTests = []struct {
-	ctxt  Context
-	name  string
-	data  string
-	match bool
-}{
-	{ctxtP9, "foo_arm.go", "", true},
-	{ctxtP9, "foo1_arm.go", "// +build linux\n\npackage main\n", false},
-	{ctxtP9, "foo_darwin.go", "", false},
-	{ctxtP9, "foo.go", "", true},
-	{ctxtP9, "foo1.go", "// +build linux\n\npackage main\n", false},
-	{ctxtP9, "foo.badsuffix", "", false},
-	{ctxtAndroid, "foo_linux.go", "", true},
-	{ctxtAndroid, "foo_android.go", "", true},
-	{ctxtAndroid, "foo_plan9.go", "", false},
-	{ctxtAndroid, "android.go", "", true},
-	{ctxtAndroid, "plan9.go", "", true},
-	{ctxtAndroid, "plan9_test.go", "", true},
-	{ctxtAndroid, "arm.s", "", true},
-	{ctxtAndroid, "amd64.s", "", true},
-}
-
-func TestMatchFile(t *testing.T) {
-	for _, tt := range matchFileTests {
-		ctxt := tt.ctxt
-		ctxt.OpenFile = func(path string) (r io.ReadCloser, err error) {
-			if path != "x+"+tt.name {
-				t.Fatalf("OpenFile asked for %q, expected %q", path, "x+"+tt.name)
-			}
-			return &readNopCloser{strings.NewReader(tt.data)}, nil
-		}
-		ctxt.JoinPath = func(elem ...string) string {
-			return strings.Join(elem, "+")
-		}
-		match, err := ctxt.MatchFile("x", tt.name)
-		if match != tt.match || err != nil {
-			t.Fatalf("MatchFile(%q) = %v, %v, want %v, nil", tt.name, match, err, tt.match)
-		}
-	}
-}
-
-func TestImportCmd(t *testing.T) {
-	t.Skip("does not work with gccgo")
-	if runtime.GOOS == "darwin" {
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			t.Skipf("skipping on %s/%s, no valid GOROOT", runtime.GOOS, runtime.GOARCH)
-		}
-	}
-
-	p, err := Import("cmd/internal/objfile", "", 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !strings.HasSuffix(filepath.ToSlash(p.Dir), "src/cmd/internal/objfile") {
-		t.Fatalf("Import cmd/internal/objfile returned Dir=%q, want %q", filepath.ToSlash(p.Dir), ".../src/cmd/internal/objfile")
-	}
-}
-
-var (
-	expandSrcDirPath = filepath.Join(string(filepath.Separator)+"projects", "src", "add")
-)
-
-var expandSrcDirTests = []struct {
-	input, expected string
-}{
-	{"-L ${SRCDIR}/libs -ladd", "-L /projects/src/add/libs -ladd"},
-	{"${SRCDIR}/add_linux_386.a -pthread -lstdc++", "/projects/src/add/add_linux_386.a -pthread -lstdc++"},
-	{"Nothing to expand here!", "Nothing to expand here!"},
-	{"$", "$"},
-	{"$$", "$$"},
-	{"${", "${"},
-	{"$}", "$}"},
-	{"$FOO ${BAR}", "$FOO ${BAR}"},
-	{"Find me the $SRCDIRECTORY.", "Find me the $SRCDIRECTORY."},
-	{"$SRCDIR is missing braces", "$SRCDIR is missing braces"},
-}
-
-func TestExpandSrcDir(t *testing.T) {
-	for _, test := range expandSrcDirTests {
-		output := expandSrcDir(test.input, expandSrcDirPath)
-		if output != test.expected {
-			t.Errorf("%q expands to %q with SRCDIR=%q when %q is expected", test.input, output, expandSrcDirPath, test.expected)
-		} else {
-			t.Logf("%q expands to %q with SRCDIR=%q", test.input, output, expandSrcDirPath)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/build/deps_test.go b/third_party/gofrontend/libgo/go/go/build/deps_test.go
deleted file mode 100644
index 68969bb..0000000
--- a/third_party/gofrontend/libgo/go/go/build/deps_test.go
+++ /dev/null
@@ -1,520 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file exercises the import parser but also checks that
-// some low-level packages do not have new dependencies added.
-
-package build
-
-import (
-	"bytes"
-	"fmt"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"runtime"
-	"sort"
-	"strconv"
-	"strings"
-	"testing"
-)
-
-// pkgDeps defines the expected dependencies between packages in
-// the Go source tree.  It is a statement of policy.
-// Changes should not be made to this map without prior discussion.
-//
-// The map contains two kinds of entries:
-// 1) Lower-case keys are standard import paths and list the
-// allowed imports in that package.
-// 2) Upper-case keys define aliases for package sets, which can then
-// be used as dependencies by other rules.
-//
-// DO NOT CHANGE THIS DATA TO FIX BUILDS.
-//
-var pkgDeps = map[string][]string{
-	// L0 is the lowest level, core, nearly unavoidable packages.
-	"errors":      {},
-	"io":          {"errors", "sync"},
-	"runtime":     {"unsafe"},
-	"sync":        {"runtime", "sync/atomic", "unsafe"},
-	"sync/atomic": {"unsafe"},
-	"unsafe":      {},
-
-	"L0": {
-		"errors",
-		"io",
-		"runtime",
-		"sync",
-		"sync/atomic",
-		"unsafe",
-	},
-
-	// L1 adds simple functions and strings processing,
-	// but not Unicode tables.
-	"math":          {"unsafe"},
-	"math/cmplx":    {"math"},
-	"math/rand":     {"L0", "math"},
-	"sort":          {},
-	"strconv":       {"L0", "unicode/utf8", "math"},
-	"unicode/utf16": {},
-	"unicode/utf8":  {},
-
-	"L1": {
-		"L0",
-		"math",
-		"math/cmplx",
-		"math/rand",
-		"sort",
-		"strconv",
-		"unicode/utf16",
-		"unicode/utf8",
-	},
-
-	// L2 adds Unicode and strings processing.
-	"bufio":   {"L0", "unicode/utf8", "bytes"},
-	"bytes":   {"L0", "unicode", "unicode/utf8"},
-	"path":    {"L0", "unicode/utf8", "strings"},
-	"strings": {"L0", "unicode", "unicode/utf8"},
-	"unicode": {},
-
-	"L2": {
-		"L1",
-		"bufio",
-		"bytes",
-		"path",
-		"strings",
-		"unicode",
-	},
-
-	// L3 adds reflection and some basic utility packages
-	// and interface definitions, but nothing that makes
-	// system calls.
-	"crypto":              {"L2", "hash"},          // interfaces
-	"crypto/cipher":       {"L2", "crypto/subtle"}, // interfaces
-	"crypto/subtle":       {},
-	"encoding/base32":     {"L2"},
-	"encoding/base64":     {"L2"},
-	"encoding/binary":     {"L2", "reflect"},
-	"hash":                {"L2"}, // interfaces
-	"hash/adler32":        {"L2", "hash"},
-	"hash/crc32":          {"L2", "hash"},
-	"hash/crc64":          {"L2", "hash"},
-	"hash/fnv":            {"L2", "hash"},
-	"image":               {"L2", "image/color"}, // interfaces
-	"image/color":         {"L2"},                // interfaces
-	"image/color/palette": {"L2", "image/color"},
-	"reflect":             {"L2"},
-
-	"L3": {
-		"L2",
-		"crypto",
-		"crypto/cipher",
-		"crypto/subtle",
-		"encoding/base32",
-		"encoding/base64",
-		"encoding/binary",
-		"hash",
-		"hash/adler32",
-		"hash/crc32",
-		"hash/crc64",
-		"hash/fnv",
-		"image",
-		"image/color",
-		"image/color/palette",
-		"reflect",
-	},
-
-	// End of linear dependency definitions.
-
-	// Operating system access.
-	"syscall":                           {"L0", "unicode/utf16"},
-	"internal/syscall/unix":             {"L0", "syscall"},
-	"internal/syscall/windows":          {"L0", "syscall"},
-	"internal/syscall/windows/registry": {"L0", "syscall", "unicode/utf16"},
-	"time":          {"L0", "syscall", "internal/syscall/windows/registry"},
-	"os":            {"L1", "os", "syscall", "time", "internal/syscall/windows"},
-	"path/filepath": {"L2", "os", "syscall"},
-	"io/ioutil":     {"L2", "os", "path/filepath", "time"},
-	"os/exec":       {"L2", "os", "path/filepath", "syscall"},
-	"os/signal":     {"L2", "os", "syscall"},
-
-	// OS enables basic operating system functionality,
-	// but not direct use of package syscall, nor os/signal.
-	"OS": {
-		"io/ioutil",
-		"os",
-		"os/exec",
-		"path/filepath",
-		"time",
-	},
-
-	// Formatted I/O: few dependencies (L1) but we must add reflect.
-	"fmt": {"L1", "os", "reflect"},
-	"log": {"L1", "os", "fmt", "time"},
-
-	// Packages used by testing must be low-level (L2+fmt).
-	"regexp":         {"L2", "regexp/syntax"},
-	"regexp/syntax":  {"L2"},
-	"runtime/debug":  {"L2", "fmt", "io/ioutil", "os", "time"},
-	"runtime/pprof":  {"L2", "fmt", "text/tabwriter"},
-	"runtime/trace":  {"L0"},
-	"text/tabwriter": {"L2"},
-
-	"testing":          {"L2", "flag", "fmt", "os", "runtime/pprof", "runtime/trace", "time"},
-	"testing/iotest":   {"L2", "log"},
-	"testing/quick":    {"L2", "flag", "fmt", "reflect"},
-	"internal/testenv": {"L2", "os", "testing"},
-
-	// L4 is defined as L3+fmt+log+time, because in general once
-	// you're using L3 packages, use of fmt, log, or time is not a big deal.
-	"L4": {
-		"L3",
-		"fmt",
-		"log",
-		"time",
-	},
-
-	// Go parser.
-	"go/ast":     {"L4", "OS", "go/scanner", "go/token"},
-	"go/doc":     {"L4", "go/ast", "go/token", "regexp", "text/template"},
-	"go/parser":  {"L4", "OS", "go/ast", "go/scanner", "go/token"},
-	"go/printer": {"L4", "OS", "go/ast", "go/scanner", "go/token", "text/tabwriter"},
-	"go/scanner": {"L4", "OS", "go/token"},
-	"go/token":   {"L4"},
-
-	"GOPARSER": {
-		"go/ast",
-		"go/doc",
-		"go/parser",
-		"go/printer",
-		"go/scanner",
-		"go/token",
-	},
-
-	"go/format":       {"L4", "GOPARSER", "internal/format"},
-	"internal/format": {"L4", "GOPARSER"},
-
-	// Go type checking.
-	"go/constant":               {"L4", "go/token", "math/big"},
-	"go/importer":               {"L4", "go/internal/gcimporter", "go/internal/gccgoimporter", "go/types"},
-	"go/internal/gcimporter":    {"L4", "OS", "go/build", "go/constant", "go/token", "go/types", "text/scanner"},
-	"go/internal/gccgoimporter": {"L4", "OS", "debug/elf", "go/constant", "go/token", "go/types", "text/scanner"},
-	"go/types":                  {"L4", "GOPARSER", "container/heap", "go/constant"},
-
-	// One of a kind.
-	"archive/tar":              {"L4", "OS", "syscall"},
-	"archive/zip":              {"L4", "OS", "compress/flate"},
-	"container/heap":           {"sort"},
-	"compress/bzip2":           {"L4"},
-	"compress/flate":           {"L4"},
-	"compress/gzip":            {"L4", "compress/flate"},
-	"compress/lzw":             {"L4"},
-	"compress/zlib":            {"L4", "compress/flate"},
-	"database/sql":             {"L4", "container/list", "database/sql/driver"},
-	"database/sql/driver":      {"L4", "time"},
-	"debug/dwarf":              {"L4"},
-	"debug/elf":                {"L4", "OS", "debug/dwarf"},
-	"debug/gosym":              {"L4"},
-	"debug/macho":              {"L4", "OS", "debug/dwarf"},
-	"debug/pe":                 {"L4", "OS", "debug/dwarf"},
-	"debug/plan9obj":           {"L4", "OS"},
-	"encoding":                 {"L4"},
-	"encoding/ascii85":         {"L4"},
-	"encoding/asn1":            {"L4", "math/big"},
-	"encoding/csv":             {"L4"},
-	"encoding/gob":             {"L4", "OS", "encoding"},
-	"encoding/hex":             {"L4"},
-	"encoding/json":            {"L4", "encoding"},
-	"encoding/pem":             {"L4"},
-	"encoding/xml":             {"L4", "encoding"},
-	"flag":                     {"L4", "OS"},
-	"go/build":                 {"L4", "OS", "GOPARSER"},
-	"html":                     {"L4"},
-	"image/draw":               {"L4", "image/internal/imageutil"},
-	"image/gif":                {"L4", "compress/lzw", "image/color/palette", "image/draw"},
-	"image/internal/imageutil": {"L4"},
-	"image/jpeg":               {"L4", "image/internal/imageutil"},
-	"image/png":                {"L4", "compress/zlib"},
-	"index/suffixarray":        {"L4", "regexp"},
-	"internal/singleflight":    {"sync"},
-	"internal/trace":           {"L4", "OS"},
-	"math/big":                 {"L4"},
-	"mime":                     {"L4", "OS", "syscall", "internal/syscall/windows/registry"},
-	"mime/quotedprintable":     {"L4"},
-	"net/internal/socktest":    {"L4", "OS", "syscall"},
-	"net/url":                  {"L4"},
-	"text/scanner":             {"L4", "OS"},
-	"text/template/parse":      {"L4"},
-
-	"html/template": {
-		"L4", "OS", "encoding/json", "html", "text/template",
-		"text/template/parse",
-	},
-	"text/template": {
-		"L4", "OS", "net/url", "text/template/parse",
-	},
-
-	// Cgo.
-	"runtime/cgo": {"L0", "C"},
-	"CGO":         {"C", "runtime/cgo"},
-
-	// Fake entry to satisfy the pseudo-import "C"
-	// that shows up in programs that use cgo.
-	"C": {},
-
-	// Race detector uses cgo.
-	"runtime/race": {"C"},
-
-	// Plan 9 alone needs io/ioutil and os.
-	"os/user": {"L4", "CGO", "io/ioutil", "os", "syscall"},
-
-	// Basic networking.
-	// Because net must be used by any package that wants to
-	// do networking portably, it must have a small dependency set: just L1+basic os.
-	"net": {"L1", "CGO", "os", "syscall", "time", "internal/syscall/windows", "internal/singleflight"},
-
-	// NET enables use of basic network-related packages.
-	"NET": {
-		"net",
-		"mime",
-		"net/textproto",
-		"net/url",
-	},
-
-	// Uses of networking.
-	"log/syslog":    {"L4", "OS", "net"},
-	"net/mail":      {"L4", "NET", "OS", "mime"},
-	"net/textproto": {"L4", "OS", "net"},
-
-	// Core crypto.
-	"crypto/aes":    {"L3"},
-	"crypto/des":    {"L3"},
-	"crypto/hmac":   {"L3"},
-	"crypto/md5":    {"L3"},
-	"crypto/rc4":    {"L3"},
-	"crypto/sha1":   {"L3"},
-	"crypto/sha256": {"L3"},
-	"crypto/sha512": {"L3"},
-
-	"CRYPTO": {
-		"crypto/aes",
-		"crypto/des",
-		"crypto/hmac",
-		"crypto/md5",
-		"crypto/rc4",
-		"crypto/sha1",
-		"crypto/sha256",
-		"crypto/sha512",
-	},
-
-	// Random byte, number generation.
-	// This would be part of core crypto except that it imports
-	// math/big, which imports fmt.
-	"crypto/rand": {"L4", "CRYPTO", "OS", "math/big", "syscall", "internal/syscall/unix"},
-
-	// Mathematical crypto: dependencies on fmt (L4) and math/big.
-	// We could avoid some of the fmt, but math/big imports fmt anyway.
-	"crypto/dsa":      {"L4", "CRYPTO", "math/big"},
-	"crypto/ecdsa":    {"L4", "CRYPTO", "crypto/elliptic", "math/big", "encoding/asn1"},
-	"crypto/elliptic": {"L4", "CRYPTO", "math/big"},
-	"crypto/rsa":      {"L4", "CRYPTO", "crypto/rand", "math/big"},
-
-	"CRYPTO-MATH": {
-		"CRYPTO",
-		"crypto/dsa",
-		"crypto/ecdsa",
-		"crypto/elliptic",
-		"crypto/rand",
-		"crypto/rsa",
-		"encoding/asn1",
-		"math/big",
-	},
-
-	// SSL/TLS.
-	"crypto/tls": {
-		"L4", "CRYPTO-MATH", "CGO", "OS",
-		"container/list", "crypto/x509", "encoding/pem", "net", "syscall",
-	},
-	"crypto/x509": {
-		"L4", "CRYPTO-MATH", "OS", "CGO",
-		"crypto/x509/pkix", "encoding/pem", "encoding/hex", "net", "syscall",
-	},
-	"crypto/x509/pkix": {"L4", "CRYPTO-MATH"},
-
-	// Simple net+crypto-aware packages.
-	"mime/multipart": {"L4", "OS", "mime", "crypto/rand", "net/textproto", "mime/quotedprintable"},
-	"net/smtp":       {"L4", "CRYPTO", "NET", "crypto/tls"},
-
-	// HTTP, kingpin of dependencies.
-	"net/http": {
-		"L4", "NET", "OS",
-		"compress/gzip", "crypto/tls", "mime/multipart", "runtime/debug",
-		"net/http/internal",
-	},
-	"net/http/internal": {"L4"},
-
-	// HTTP-using packages.
-	"expvar":             {"L4", "OS", "encoding/json", "net/http"},
-	"net/http/cgi":       {"L4", "NET", "OS", "crypto/tls", "net/http", "regexp"},
-	"net/http/cookiejar": {"L4", "NET", "net/http"},
-	"net/http/fcgi":      {"L4", "NET", "OS", "net/http", "net/http/cgi"},
-	"net/http/httptest":  {"L4", "NET", "OS", "crypto/tls", "flag", "net/http"},
-	"net/http/httputil":  {"L4", "NET", "OS", "net/http", "net/http/internal"},
-	"net/http/pprof":     {"L4", "OS", "html/template", "net/http", "runtime/pprof", "runtime/trace"},
-	"net/rpc":            {"L4", "NET", "encoding/gob", "html/template", "net/http"},
-	"net/rpc/jsonrpc":    {"L4", "NET", "encoding/json", "net/rpc"},
-}
-
-// isMacro reports whether p is a package dependency macro
-// (uppercase name).
-func isMacro(p string) bool {
-	return 'A' <= p[0] && p[0] <= 'Z'
-}
-
-func allowed(pkg string) map[string]bool {
-	m := map[string]bool{}
-	var allow func(string)
-	allow = func(p string) {
-		if m[p] {
-			return
-		}
-		m[p] = true // set even for macros, to avoid loop on cycle
-
-		// Upper-case names are macro-expanded.
-		if isMacro(p) {
-			for _, pp := range pkgDeps[p] {
-				allow(pp)
-			}
-		}
-	}
-	for _, pp := range pkgDeps[pkg] {
-		allow(pp)
-	}
-	return m
-}
-
-var bools = []bool{false, true}
-var geese = []string{"android", "darwin", "dragonfly", "freebsd", "linux", "nacl", "netbsd", "openbsd", "plan9", "solaris", "windows"}
-var goarches = []string{"386", "amd64", "arm", "arm64"}
-
-type osPkg struct {
-	goos, pkg string
-}
-
-// allowedErrors are the operating systems and packages known to contain errors
-// (currently just "no Go source files")
-var allowedErrors = map[osPkg]bool{
-	osPkg{"windows", "log/syslog"}: true,
-	osPkg{"plan9", "log/syslog"}:   true,
-}
-
-// listStdPkgs returns the same list of packages as "go list std".
-func listStdPkgs(goroot string) ([]string, error) {
-	// Based on cmd/go's matchPackages function.
-	var pkgs []string
-
-	src := filepath.Join(goroot, "src") + string(filepath.Separator)
-	walkFn := func(path string, fi os.FileInfo, err error) error {
-		if err != nil || !fi.IsDir() || path == src {
-			return nil
-		}
-
-		base := filepath.Base(path)
-		if strings.HasPrefix(base, ".") || strings.HasPrefix(base, "_") || base == "testdata" {
-			return filepath.SkipDir
-		}
-
-		name := filepath.ToSlash(path[len(src):])
-		if name == "builtin" || name == "cmd" || strings.Contains(name, ".") {
-			return filepath.SkipDir
-		}
-
-		pkgs = append(pkgs, name)
-		return nil
-	}
-	if err := filepath.Walk(src, walkFn); err != nil {
-		return nil, err
-	}
-	return pkgs, nil
-}
-
-func TestDependencies(t *testing.T) {
-	iOS := runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64")
-	if runtime.GOOS == "nacl" || iOS {
-		// Tests run in a limited file system and we do not
-		// provide access to every source file.
-		t.Skipf("skipping on %s/%s, missing full GOROOT", runtime.GOOS, runtime.GOARCH)
-	}
-
-	ctxt := Default
-	all, err := listStdPkgs(ctxt.GOROOT)
-	if err != nil {
-		t.Fatal(err)
-	}
-	sort.Strings(all)
-
-	test := func(mustImport bool) {
-		for _, pkg := range all {
-			imports, err := findImports(pkg)
-			if err != nil {
-				t.Error(err)
-				continue
-			}
-			ok := allowed(pkg)
-			var bad []string
-			for _, imp := range imports {
-				if !ok[imp] {
-					bad = append(bad, imp)
-				}
-			}
-			if bad != nil {
-				t.Errorf("unexpected dependency: %s imports %v", pkg, bad)
-			}
-		}
-	}
-	test(true)
-}
-
-var buildIgnore = []byte("\n// +build ignore")
-
-func findImports(pkg string) ([]string, error) {
-	dir := filepath.Join(Default.GOROOT, "src", pkg)
-	files, err := ioutil.ReadDir(dir)
-	if err != nil {
-		return nil, err
-	}
-	var imports []string
-	var haveImport = map[string]bool{}
-	for _, file := range files {
-		name := file.Name()
-		if !strings.HasSuffix(name, ".go") || strings.HasSuffix(name, "_test.go") {
-			continue
-		}
-		f, err := os.Open(filepath.Join(dir, name))
-		if err != nil {
-			return nil, err
-		}
-		var imp []string
-		data, err := readImports(f, false, &imp)
-		f.Close()
-		if err != nil {
-			return nil, fmt.Errorf("reading %v: %v", name, err)
-		}
-		if bytes.Contains(data, buildIgnore) {
-			continue
-		}
-		for _, quoted := range imp {
-			path, err := strconv.Unquote(quoted)
-			if err != nil {
-				continue
-			}
-			if !haveImport[path] {
-				haveImport[path] = true
-				imports = append(imports, path)
-			}
-		}
-	}
-	sort.Strings(imports)
-	return imports, nil
-}
diff --git a/third_party/gofrontend/libgo/go/go/build/doc.go b/third_party/gofrontend/libgo/go/go/build/doc.go
deleted file mode 100644
index 233f8b9..0000000
--- a/third_party/gofrontend/libgo/go/go/build/doc.go
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package build gathers information about Go packages.
-//
-// Go Path
-//
-// The Go path is a list of directory trees containing Go source code.
-// It is consulted to resolve imports that cannot be found in the standard
-// Go tree.  The default path is the value of the GOPATH environment
-// variable, interpreted as a path list appropriate to the operating system
-// (on Unix, the variable is a colon-separated string;
-// on Windows, a semicolon-separated string;
-// on Plan 9, a list).
-//
-// Each directory listed in the Go path must have a prescribed structure:
-//
-// The src/ directory holds source code.  The path below 'src' determines
-// the import path or executable name.
-//
-// The pkg/ directory holds installed package objects.
-// As in the Go tree, each target operating system and
-// architecture pair has its own subdirectory of pkg
-// (pkg/GOOS_GOARCH).
-//
-// If DIR is a directory listed in the Go path, a package with
-// source in DIR/src/foo/bar can be imported as "foo/bar" and
-// has its compiled form installed to "DIR/pkg/GOOS_GOARCH/foo/bar.a"
-// (or, for gccgo, "DIR/pkg/gccgo/foo/libbar.a").
-//
-// The bin/ directory holds compiled commands.
-// Each command is named for its source directory, but only
-// using the final element, not the entire path.  That is, the
-// command with source in DIR/src/foo/quux is installed into
-// DIR/bin/quux, not DIR/bin/foo/quux.  The foo/ is stripped
-// so that you can add DIR/bin to your PATH to get at the
-// installed commands.
-//
-// Here's an example directory layout:
-//
-//	GOPATH=/home/user/gocode
-//
-//	/home/user/gocode/
-//	    src/
-//	        foo/
-//	            bar/               (go code in package bar)
-//	                x.go
-//	            quux/              (go code in package main)
-//	                y.go
-//	    bin/
-//	        quux                   (installed command)
-//	    pkg/
-//	        linux_amd64/
-//	            foo/
-//	                bar.a          (installed package object)
-//
-// Build Constraints
-//
-// A build constraint, also known as a build tag, is a line comment that begins
-//
-//	// +build
-//
-// that lists the conditions under which a file should be included in the package.
-// Constraints may appear in any kind of source file (not just Go), but
-// they must appear near the top of the file, preceded
-// only by blank lines and other line comments. These rules mean that in Go
-// files a build constraint must appear before the package clause.
-//
-// To distinguish build constraints from package documentation, a series of
-// build constraints must be followed by a blank line.
-//
-// A build constraint is evaluated as the OR of space-separated options;
-// each option evaluates as the AND of its comma-separated terms;
-// and each term is an alphanumeric word or, preceded by !, its negation.
-// That is, the build constraint:
-//
-//	// +build linux,386 darwin,!cgo
-//
-// corresponds to the boolean formula:
-//
-//	(linux AND 386) OR (darwin AND (NOT cgo))
-//
-// A file may have multiple build constraints. The overall constraint is the AND
-// of the individual constraints. That is, the build constraints:
-//
-//	// +build linux darwin
-//	// +build 386
-//
-// corresponds to the boolean formula:
-//
-//	(linux OR darwin) AND 386
-//
-// During a particular build, the following words are satisfied:
-//
-//	- the target operating system, as spelled by runtime.GOOS
-//	- the target architecture, as spelled by runtime.GOARCH
-//	- the compiler being used, either "gc" or "gccgo"
-//	- "cgo", if ctxt.CgoEnabled is true
-//	- "go1.1", from Go version 1.1 onward
-//	- "go1.2", from Go version 1.2 onward
-//	- "go1.3", from Go version 1.3 onward
-//	- "go1.4", from Go version 1.4 onward
-//	- "go1.5", from Go version 1.5 onward
-//	- any additional words listed in ctxt.BuildTags
-//
-// If a file's name, after stripping the extension and a possible _test suffix,
-// matches any of the following patterns:
-//	*_GOOS
-// 	*_GOARCH
-// 	*_GOOS_GOARCH
-// (example: source_windows_amd64.go) where GOOS and GOARCH represent
-// any known operating system and architecture values respectively, then
-// the file is considered to have an implicit build constraint requiring
-// those terms (in addition to any explicit constraints in the file).
-//
-// To keep a file from being considered for the build:
-//
-//	// +build ignore
-//
-// (any other unsatisfied word will work as well, but ``ignore'' is conventional.)
-//
-// To build a file only when using cgo, and only on Linux and OS X:
-//
-//	// +build linux,cgo darwin,cgo
-//
-// Such a file is usually paired with another file implementing the
-// default functionality for other systems, which in this case would
-// carry the constraint:
-//
-//	// +build !linux,!darwin !cgo
-//
-// Naming a file dns_windows.go will cause it to be included only when
-// building the package for Windows; similarly, math_386.s will be included
-// only when building the package for 32-bit x86.
-//
-// Using GOOS=android matches build tags and files as for GOOS=linux
-// in addition to android tags and files.
-//
-package build
diff --git a/third_party/gofrontend/libgo/go/go/build/read.go b/third_party/gofrontend/libgo/go/go/build/read.go
deleted file mode 100644
index 1049ac5..0000000
--- a/third_party/gofrontend/libgo/go/go/build/read.go
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package build
-
-import (
-	"bufio"
-	"errors"
-	"io"
-)
-
-type importReader struct {
-	b    *bufio.Reader
-	buf  []byte
-	peek byte
-	err  error
-	eof  bool
-	nerr int
-}
-
-func isIdent(c byte) bool {
-	return 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' || c == '_' || c >= 0x80
-}
-
-var (
-	errSyntax = errors.New("syntax error")
-	errNUL    = errors.New("unexpected NUL in input")
-)
-
-// syntaxError records a syntax error, but only if an I/O error has not already been recorded.
-func (r *importReader) syntaxError() {
-	if r.err == nil {
-		r.err = errSyntax
-	}
-}
-
-// readByte reads the next byte from the input, saves it in buf, and returns it.
-// If an error occurs, readByte records the error in r.err and returns 0.
-func (r *importReader) readByte() byte {
-	c, err := r.b.ReadByte()
-	if err == nil {
-		r.buf = append(r.buf, c)
-		if c == 0 {
-			err = errNUL
-		}
-	}
-	if err != nil {
-		if err == io.EOF {
-			r.eof = true
-		} else if r.err == nil {
-			r.err = err
-		}
-		c = 0
-	}
-	return c
-}
-
-// peekByte returns the next byte from the input reader but does not advance beyond it.
-// If skipSpace is set, peekByte skips leading spaces and comments.
-func (r *importReader) peekByte(skipSpace bool) byte {
-	if r.err != nil {
-		if r.nerr++; r.nerr > 10000 {
-			panic("go/build: import reader looping")
-		}
-		return 0
-	}
-
-	// Use r.peek as first input byte.
-	// Don't just return r.peek here: it might have been left by peekByte(false)
-	// and this might be peekByte(true).
-	c := r.peek
-	if c == 0 {
-		c = r.readByte()
-	}
-	for r.err == nil && !r.eof {
-		if skipSpace {
-			// For the purposes of this reader, semicolons are never necessary to
-			// understand the input and are treated as spaces.
-			switch c {
-			case ' ', '\f', '\t', '\r', '\n', ';':
-				c = r.readByte()
-				continue
-
-			case '/':
-				c = r.readByte()
-				if c == '/' {
-					for c != '\n' && r.err == nil && !r.eof {
-						c = r.readByte()
-					}
-				} else if c == '*' {
-					var c1 byte
-					for (c != '*' || c1 != '/') && r.err == nil {
-						if r.eof {
-							r.syntaxError()
-						}
-						c, c1 = c1, r.readByte()
-					}
-				} else {
-					r.syntaxError()
-				}
-				c = r.readByte()
-				continue
-			}
-		}
-		break
-	}
-	r.peek = c
-	return r.peek
-}
-
-// nextByte is like peekByte but advances beyond the returned byte.
-func (r *importReader) nextByte(skipSpace bool) byte {
-	c := r.peekByte(skipSpace)
-	r.peek = 0
-	return c
-}
-
-// readKeyword reads the given keyword from the input.
-// If the keyword is not present, readKeyword records a syntax error.
-func (r *importReader) readKeyword(kw string) {
-	r.peekByte(true)
-	for i := 0; i < len(kw); i++ {
-		if r.nextByte(false) != kw[i] {
-			r.syntaxError()
-			return
-		}
-	}
-	if isIdent(r.peekByte(false)) {
-		r.syntaxError()
-	}
-}
-
-// readIdent reads an identifier from the input.
-// If an identifier is not present, readIdent records a syntax error.
-func (r *importReader) readIdent() {
-	c := r.peekByte(true)
-	if !isIdent(c) {
-		r.syntaxError()
-		return
-	}
-	for isIdent(r.peekByte(false)) {
-		r.peek = 0
-	}
-}
-
-// readString reads a quoted string literal from the input.
-// If an identifier is not present, readString records a syntax error.
-func (r *importReader) readString(save *[]string) {
-	switch r.nextByte(true) {
-	case '`':
-		start := len(r.buf) - 1
-		for r.err == nil {
-			if r.nextByte(false) == '`' {
-				if save != nil {
-					*save = append(*save, string(r.buf[start:]))
-				}
-				break
-			}
-			if r.eof {
-				r.syntaxError()
-			}
-		}
-	case '"':
-		start := len(r.buf) - 1
-		for r.err == nil {
-			c := r.nextByte(false)
-			if c == '"' {
-				if save != nil {
-					*save = append(*save, string(r.buf[start:]))
-				}
-				break
-			}
-			if r.eof || c == '\n' {
-				r.syntaxError()
-			}
-			if c == '\\' {
-				r.nextByte(false)
-			}
-		}
-	default:
-		r.syntaxError()
-	}
-}
-
-// readImport reads an import clause - optional identifier followed by quoted string -
-// from the input.
-func (r *importReader) readImport(imports *[]string) {
-	c := r.peekByte(true)
-	if c == '.' {
-		r.peek = 0
-	} else if isIdent(c) {
-		r.readIdent()
-	}
-	r.readString(imports)
-}
-
-// readComments is like ioutil.ReadAll, except that it only reads the leading
-// block of comments in the file.
-func readComments(f io.Reader) ([]byte, error) {
-	r := &importReader{b: bufio.NewReader(f)}
-	r.peekByte(true)
-	if r.err == nil && !r.eof {
-		// Didn't reach EOF, so must have found a non-space byte. Remove it.
-		r.buf = r.buf[:len(r.buf)-1]
-	}
-	return r.buf, r.err
-}
-
-// readImports is like ioutil.ReadAll, except that it expects a Go file as input
-// and stops reading the input once the imports have completed.
-func readImports(f io.Reader, reportSyntaxError bool, imports *[]string) ([]byte, error) {
-	r := &importReader{b: bufio.NewReader(f)}
-
-	r.readKeyword("package")
-	r.readIdent()
-	for r.peekByte(true) == 'i' {
-		r.readKeyword("import")
-		if r.peekByte(true) == '(' {
-			r.nextByte(false)
-			for r.peekByte(true) != ')' && r.err == nil {
-				r.readImport(imports)
-			}
-			r.nextByte(false)
-		} else {
-			r.readImport(imports)
-		}
-	}
-
-	// If we stopped successfully before EOF, we read a byte that told us we were done.
-	// Return all but that last byte, which would cause a syntax error if we let it through.
-	if r.err == nil && !r.eof {
-		return r.buf[:len(r.buf)-1], nil
-	}
-
-	// If we stopped for a syntax error, consume the whole file so that
-	// we are sure we don't change the errors that go/parser returns.
-	if r.err == errSyntax && !reportSyntaxError {
-		r.err = nil
-		for r.err == nil && !r.eof {
-			r.readByte()
-		}
-	}
-
-	return r.buf, r.err
-}
diff --git a/third_party/gofrontend/libgo/go/go/build/read_test.go b/third_party/gofrontend/libgo/go/go/build/read_test.go
deleted file mode 100644
index 326960b..0000000
--- a/third_party/gofrontend/libgo/go/go/build/read_test.go
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package build
-
-import (
-	"io"
-	"strings"
-	"testing"
-)
-
-const quote = "`"
-
-type readTest struct {
-	// Test input contains ℙ where readImports should stop.
-	in  string
-	err string
-}
-
-var readImportsTests = []readTest{
-	{
-		`package p`,
-		"",
-	},
-	{
-		`package p; import "x"`,
-		"",
-	},
-	{
-		`package p; import . "x"`,
-		"",
-	},
-	{
-		`package p; import "x";ℙvar x = 1`,
-		"",
-	},
-	{
-		`package p
-		
-		// comment
-		
-		import "x"
-		import _ "x"
-		import a "x"
-		
-		/* comment */
-		
-		import (
-			"x" /* comment */
-			_ "x"
-			a "x" // comment
-			` + quote + `x` + quote + `
-			_ /*comment*/ ` + quote + `x` + quote + `
-			a ` + quote + `x` + quote + `
-		)
-		import (
-		)
-		import ()
-		import()import()import()
-		import();import();import()
-		
-		ℙvar x = 1
-		`,
-		"",
-	},
-}
-
-var readCommentsTests = []readTest{
-	{
-		`ℙpackage p`,
-		"",
-	},
-	{
-		`ℙpackage p; import "x"`,
-		"",
-	},
-	{
-		`ℙpackage p; import . "x"`,
-		"",
-	},
-	{
-		`// foo
-
-		/* bar */
-
-		/* quux */ // baz
-		
-		/*/ zot */
-
-		// asdf
-		ℙHello, world`,
-		"",
-	},
-}
-
-func testRead(t *testing.T, tests []readTest, read func(io.Reader) ([]byte, error)) {
-	for i, tt := range tests {
-		var in, testOut string
-		j := strings.Index(tt.in, "ℙ")
-		if j < 0 {
-			in = tt.in
-			testOut = tt.in
-		} else {
-			in = tt.in[:j] + tt.in[j+len("ℙ"):]
-			testOut = tt.in[:j]
-		}
-		r := strings.NewReader(in)
-		buf, err := read(r)
-		if err != nil {
-			if tt.err == "" {
-				t.Errorf("#%d: err=%q, expected success (%q)", i, err, string(buf))
-				continue
-			}
-			if !strings.Contains(err.Error(), tt.err) {
-				t.Errorf("#%d: err=%q, expected %q", i, err, tt.err)
-				continue
-			}
-			continue
-		}
-		if err == nil && tt.err != "" {
-			t.Errorf("#%d: success, expected %q", i, tt.err)
-			continue
-		}
-
-		out := string(buf)
-		if out != testOut {
-			t.Errorf("#%d: wrong output:\nhave %q\nwant %q\n", i, out, testOut)
-		}
-	}
-}
-
-func TestReadImports(t *testing.T) {
-	testRead(t, readImportsTests, func(r io.Reader) ([]byte, error) { return readImports(r, true, nil) })
-}
-
-func TestReadComments(t *testing.T) {
-	testRead(t, readCommentsTests, readComments)
-}
-
-var readFailuresTests = []readTest{
-	{
-		`package`,
-		"syntax error",
-	},
-	{
-		"package p\n\x00\nimport `math`\n",
-		"unexpected NUL in input",
-	},
-	{
-		`package p; import`,
-		"syntax error",
-	},
-	{
-		`package p; import "`,
-		"syntax error",
-	},
-	{
-		"package p; import ` \n\n",
-		"syntax error",
-	},
-	{
-		`package p; import "x`,
-		"syntax error",
-	},
-	{
-		`package p; import _`,
-		"syntax error",
-	},
-	{
-		`package p; import _ "`,
-		"syntax error",
-	},
-	{
-		`package p; import _ "x`,
-		"syntax error",
-	},
-	{
-		`package p; import .`,
-		"syntax error",
-	},
-	{
-		`package p; import . "`,
-		"syntax error",
-	},
-	{
-		`package p; import . "x`,
-		"syntax error",
-	},
-	{
-		`package p; import (`,
-		"syntax error",
-	},
-	{
-		`package p; import ("`,
-		"syntax error",
-	},
-	{
-		`package p; import ("x`,
-		"syntax error",
-	},
-	{
-		`package p; import ("x"`,
-		"syntax error",
-	},
-}
-
-func TestReadFailures(t *testing.T) {
-	// Errors should be reported (true arg to readImports).
-	testRead(t, readFailuresTests, func(r io.Reader) ([]byte, error) { return readImports(r, true, nil) })
-}
-
-func TestReadFailuresIgnored(t *testing.T) {
-	// Syntax errors should not be reported (false arg to readImports).
-	// Instead, entire file should be the output and no error.
-	// Convert tests not to return syntax errors.
-	tests := make([]readTest, len(readFailuresTests))
-	copy(tests, readFailuresTests)
-	for i := range tests {
-		tt := &tests[i]
-		if !strings.Contains(tt.err, "NUL") {
-			tt.err = ""
-		}
-	}
-	testRead(t, tests, func(r io.Reader) ([]byte, error) { return readImports(r, false, nil) })
-}
diff --git a/third_party/gofrontend/libgo/go/go/build/syslist.go b/third_party/gofrontend/libgo/go/go/build/syslist.go
deleted file mode 100644
index d800a78..0000000
--- a/third_party/gofrontend/libgo/go/go/build/syslist.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package build
-
-const goosList = "android darwin dragonfly freebsd linux nacl netbsd openbsd plan9 solaris windows "
-const goarchList = "386 amd64 amd64p32 arm armbe arm64 arm64be alpha m68k ppc64 ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le mipso32 mipsn32 mipsn64 mipso64 ppc s390 s390x sparc sparc64 "
diff --git a/third_party/gofrontend/libgo/go/go/build/syslist_test.go b/third_party/gofrontend/libgo/go/go/build/syslist_test.go
deleted file mode 100644
index 3be2928..0000000
--- a/third_party/gofrontend/libgo/go/go/build/syslist_test.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package build
-
-import (
-	"runtime"
-	"testing"
-)
-
-var (
-	thisOS    = runtime.GOOS
-	thisArch  = runtime.GOARCH
-	otherOS   = anotherOS()
-	otherArch = anotherArch()
-)
-
-func anotherOS() string {
-	if thisOS != "darwin" {
-		return "darwin"
-	}
-	return "linux"
-}
-
-func anotherArch() string {
-	if thisArch != "amd64" {
-		return "amd64"
-	}
-	return "386"
-}
-
-type GoodFileTest struct {
-	name   string
-	result bool
-}
-
-var tests = []GoodFileTest{
-	{"file.go", true},
-	{"file.c", true},
-	{"file_foo.go", true},
-	{"file_" + thisArch + ".go", true},
-	{"file_" + otherArch + ".go", false},
-	{"file_" + thisOS + ".go", true},
-	{"file_" + otherOS + ".go", false},
-	{"file_" + thisOS + "_" + thisArch + ".go", true},
-	{"file_" + otherOS + "_" + thisArch + ".go", false},
-	{"file_" + thisOS + "_" + otherArch + ".go", false},
-	{"file_" + otherOS + "_" + otherArch + ".go", false},
-	{"file_foo_" + thisArch + ".go", true},
-	{"file_foo_" + otherArch + ".go", false},
-	{"file_" + thisOS + ".c", true},
-	{"file_" + otherOS + ".c", false},
-}
-
-func TestGoodOSArch(t *testing.T) {
-	for _, test := range tests {
-		if Default.goodOSArchFile(test.name, make(map[string]bool)) != test.result {
-			t.Fatalf("goodOSArchFile(%q) != %v", test.name, test.result)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/build/testdata/empty/dummy b/third_party/gofrontend/libgo/go/go/build/testdata/empty/dummy
deleted file mode 100644
index e69de29..0000000
--- a/third_party/gofrontend/libgo/go/go/build/testdata/empty/dummy
+++ /dev/null
diff --git a/third_party/gofrontend/libgo/go/go/build/testdata/multi/file.go b/third_party/gofrontend/libgo/go/go/build/testdata/multi/file.go
deleted file mode 100644
index ee946eb..0000000
--- a/third_party/gofrontend/libgo/go/go/build/testdata/multi/file.go
+++ /dev/null
@@ -1,5 +0,0 @@
-// Test data - not compiled.
-
-package main
-
-func main() {}
diff --git a/third_party/gofrontend/libgo/go/go/build/testdata/multi/file_appengine.go b/third_party/gofrontend/libgo/go/go/build/testdata/multi/file_appengine.go
deleted file mode 100644
index 4ea31e7..0000000
--- a/third_party/gofrontend/libgo/go/go/build/testdata/multi/file_appengine.go
+++ /dev/null
@@ -1,5 +0,0 @@
-// Test data - not compiled.
-
-package test_package
-
-func init() {}
diff --git a/third_party/gofrontend/libgo/go/go/build/testdata/other/file/file.go b/third_party/gofrontend/libgo/go/go/build/testdata/other/file/file.go
deleted file mode 100644
index bbfd3e9..0000000
--- a/third_party/gofrontend/libgo/go/go/build/testdata/other/file/file.go
+++ /dev/null
@@ -1,5 +0,0 @@
-// Test data - not compiled.
-
-package file
-
-func F() {}
diff --git a/third_party/gofrontend/libgo/go/go/build/testdata/other/main.go b/third_party/gofrontend/libgo/go/go/build/testdata/other/main.go
deleted file mode 100644
index e090435..0000000
--- a/third_party/gofrontend/libgo/go/go/build/testdata/other/main.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Test data - not compiled.
-
-package main
-
-import (
-	"./file"
-)
-
-func main() {
-	file.F()
-}
diff --git a/third_party/gofrontend/libgo/go/go/constant/go13.go b/third_party/gofrontend/libgo/go/go/constant/go13.go
deleted file mode 100644
index a4a838a..0000000
--- a/third_party/gofrontend/libgo/go/go/constant/go13.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.4
-
-package constant
-
-import (
-	"math"
-	"math/big"
-)
-
-func ratToFloat32(x *big.Rat) (float32, bool) {
-	// Before 1.4, there's no Rat.Float32.
-	// Emulate it, albeit at the cost of
-	// imprecision in corner cases.
-	x64, exact := x.Float64()
-	x32 := float32(x64)
-	if math.IsInf(float64(x32), 0) {
-		exact = false
-	}
-	return x32, exact
-}
diff --git a/third_party/gofrontend/libgo/go/go/constant/go14.go b/third_party/gofrontend/libgo/go/go/constant/go14.go
deleted file mode 100644
index 2ab6da0..0000000
--- a/third_party/gofrontend/libgo/go/go/constant/go14.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.4
-
-package constant
-
-import "math/big"
-
-func ratToFloat32(x *big.Rat) (float32, bool) {
-	return x.Float32()
-}
diff --git a/third_party/gofrontend/libgo/go/go/constant/value.go b/third_party/gofrontend/libgo/go/go/constant/value.go
deleted file mode 100644
index 79a80af..0000000
--- a/third_party/gofrontend/libgo/go/go/constant/value.go
+++ /dev/null
@@ -1,925 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package constant implements Values representing untyped
-// Go constants and the corresponding operations. Values
-// and operations may have arbitrary or unlimited precision.
-//
-// A special Unknown value may be used when a value
-// is unknown due to an error. Operations on unknown
-// values produce unknown values unless specified
-// otherwise.
-//
-package constant // import "go/constant"
-
-import (
-	"fmt"
-	"go/token"
-	"math/big"
-	"strconv"
-)
-
-// Kind specifies the kind of value represented by a Value.
-type Kind int
-
-// Implementation note: Kinds must be enumerated in
-// order of increasing "complexity" (used by match).
-
-const (
-	// unknown values
-	Unknown Kind = iota
-
-	// non-numeric values
-	Bool
-	String
-
-	// numeric values
-	Int
-	Float
-	Complex
-)
-
-// A Value represents a mathematically exact value of a given Kind.
-type Value interface {
-	// Kind returns the value kind; it is always the smallest
-	// kind in which the value can be represented exactly.
-	Kind() Kind
-
-	// String returns a human-readable form of the value.
-	String() string
-
-	// Prevent external implementations.
-	implementsValue()
-}
-
-// ----------------------------------------------------------------------------
-// Implementations
-
-type (
-	unknownVal struct{}
-	boolVal    bool
-	stringVal  string
-	int64Val   int64
-	intVal     struct{ val *big.Int }
-	floatVal   struct{ val *big.Rat }
-	complexVal struct{ re, im *big.Rat }
-)
-
-func (unknownVal) Kind() Kind { return Unknown }
-func (boolVal) Kind() Kind    { return Bool }
-func (stringVal) Kind() Kind  { return String }
-func (int64Val) Kind() Kind   { return Int }
-func (intVal) Kind() Kind     { return Int }
-func (floatVal) Kind() Kind   { return Float }
-func (complexVal) Kind() Kind { return Complex }
-
-func (unknownVal) String() string   { return "unknown" }
-func (x boolVal) String() string    { return fmt.Sprintf("%v", bool(x)) }
-func (x stringVal) String() string  { return strconv.Quote(string(x)) }
-func (x int64Val) String() string   { return strconv.FormatInt(int64(x), 10) }
-func (x intVal) String() string     { return x.val.String() }
-func (x floatVal) String() string   { return x.val.String() }
-func (x complexVal) String() string { return fmt.Sprintf("(%s + %si)", x.re, x.im) }
-
-func (unknownVal) implementsValue() {}
-func (boolVal) implementsValue()    {}
-func (stringVal) implementsValue()  {}
-func (int64Val) implementsValue()   {}
-func (intVal) implementsValue()     {}
-func (floatVal) implementsValue()   {}
-func (complexVal) implementsValue() {}
-
-// int64 bounds
-var (
-	minInt64 = big.NewInt(-1 << 63)
-	maxInt64 = big.NewInt(1<<63 - 1)
-)
-
-func normInt(x *big.Int) Value {
-	if minInt64.Cmp(x) <= 0 && x.Cmp(maxInt64) <= 0 {
-		return int64Val(x.Int64())
-	}
-	return intVal{x}
-}
-
-func normFloat(x *big.Rat) Value {
-	if x.IsInt() {
-		return normInt(x.Num())
-	}
-	return floatVal{x}
-}
-
-func normComplex(re, im *big.Rat) Value {
-	if im.Sign() == 0 {
-		return normFloat(re)
-	}
-	return complexVal{re, im}
-}
-
-// ----------------------------------------------------------------------------
-// Factories
-
-// MakeUnknown returns the Unknown value.
-func MakeUnknown() Value { return unknownVal{} }
-
-// MakeBool returns the Bool value for x.
-func MakeBool(b bool) Value { return boolVal(b) }
-
-// MakeString returns the String value for x.
-func MakeString(s string) Value { return stringVal(s) }
-
-// MakeInt64 returns the Int value for x.
-func MakeInt64(x int64) Value { return int64Val(x) }
-
-// MakeUint64 returns the Int value for x.
-func MakeUint64(x uint64) Value { return normInt(new(big.Int).SetUint64(x)) }
-
-// MakeFloat64 returns the numeric value for x.
-// If x is not finite, the result is unknown.
-func MakeFloat64(x float64) Value {
-	if f := new(big.Rat).SetFloat64(x); f != nil {
-		return normFloat(f)
-	}
-	return unknownVal{}
-}
-
-// MakeFromLiteral returns the corresponding integer, floating-point,
-// imaginary, character, or string value for a Go literal string.
-// If prec > 0, prec specifies an upper limit for the precision of
-// a numeric value. If the literal string is invalid, the result is
-// nil.
-// BUG(gri) Only prec == 0 is supported at the moment.
-func MakeFromLiteral(lit string, tok token.Token, prec uint) Value {
-	if prec != 0 {
-		panic("limited precision not supported")
-	}
-	switch tok {
-	case token.INT:
-		if x, err := strconv.ParseInt(lit, 0, 64); err == nil {
-			return int64Val(x)
-		}
-		if x, ok := new(big.Int).SetString(lit, 0); ok {
-			return intVal{x}
-		}
-
-	case token.FLOAT:
-		if x, ok := new(big.Rat).SetString(lit); ok {
-			return normFloat(x)
-		}
-
-	case token.IMAG:
-		if n := len(lit); n > 0 && lit[n-1] == 'i' {
-			if im, ok := new(big.Rat).SetString(lit[0 : n-1]); ok {
-				return normComplex(big.NewRat(0, 1), im)
-			}
-		}
-
-	case token.CHAR:
-		if n := len(lit); n >= 2 {
-			if code, _, _, err := strconv.UnquoteChar(lit[1:n-1], '\''); err == nil {
-				return int64Val(code)
-			}
-		}
-
-	case token.STRING:
-		if s, err := strconv.Unquote(lit); err == nil {
-			return stringVal(s)
-		}
-	}
-
-	return nil
-}
-
-// ----------------------------------------------------------------------------
-// Accessors
-//
-// For unknown arguments the result is the zero value for the respective
-// accessor type, except for Sign, where the result is 1.
-
-// BoolVal returns the Go boolean value of x, which must be a Bool or an Unknown.
-// If x is Unknown, the result is false.
-func BoolVal(x Value) bool {
-	switch x := x.(type) {
-	case boolVal:
-		return bool(x)
-	case unknownVal:
-		return false
-	}
-	panic(fmt.Sprintf("%v not a Bool", x))
-}
-
-// StringVal returns the Go string value of x, which must be a String or an Unknown.
-// If x is Unknown, the result is "".
-func StringVal(x Value) string {
-	switch x := x.(type) {
-	case stringVal:
-		return string(x)
-	case unknownVal:
-		return ""
-	}
-	panic(fmt.Sprintf("%v not a String", x))
-}
-
-// Int64Val returns the Go int64 value of x and whether the result is exact;
-// x must be an Int or an Unknown. If the result is not exact, its value is undefined.
-// If x is Unknown, the result is (0, false).
-func Int64Val(x Value) (int64, bool) {
-	switch x := x.(type) {
-	case int64Val:
-		return int64(x), true
-	case intVal:
-		return x.val.Int64(), x.val.BitLen() <= 63
-	case unknownVal:
-		return 0, false
-	}
-	panic(fmt.Sprintf("%v not an Int", x))
-}
-
-// Uint64Val returns the Go uint64 value of x and whether the result is exact;
-// x must be an Int or an Unknown. If the result is not exact, its value is undefined.
-// If x is Unknown, the result is (0, false).
-func Uint64Val(x Value) (uint64, bool) {
-	switch x := x.(type) {
-	case int64Val:
-		return uint64(x), x >= 0
-	case intVal:
-		return x.val.Uint64(), x.val.Sign() >= 0 && x.val.BitLen() <= 64
-	case unknownVal:
-		return 0, false
-	}
-	panic(fmt.Sprintf("%v not an Int", x))
-}
-
-// Float32Val is like Float64Val but for float32 instead of float64.
-func Float32Val(x Value) (float32, bool) {
-	switch x := x.(type) {
-	case int64Val:
-		f := float32(x)
-		return f, int64Val(f) == x
-	case intVal:
-		return ratToFloat32(new(big.Rat).SetFrac(x.val, int1))
-	case floatVal:
-		return ratToFloat32(x.val)
-	case unknownVal:
-		return 0, false
-	}
-	panic(fmt.Sprintf("%v not a Float", x))
-}
-
-// Float64Val returns the nearest Go float64 value of x and whether the result is exact;
-// x must be numeric but not Complex, or Unknown. For values too small (too close to 0)
-// to represent as float64, Float64Val silently underflows to 0. The result sign always
-// matches the sign of x, even for 0.
-// If x is Unknown, the result is (0, false).
-func Float64Val(x Value) (float64, bool) {
-	switch x := x.(type) {
-	case int64Val:
-		f := float64(int64(x))
-		return f, int64Val(f) == x
-	case intVal:
-		return new(big.Rat).SetFrac(x.val, int1).Float64()
-	case floatVal:
-		return x.val.Float64()
-	case unknownVal:
-		return 0, false
-	}
-	panic(fmt.Sprintf("%v not a Float", x))
-}
-
-// BitLen returns the number of bits required to represent
-// the absolute value x in binary representation; x must be an Int or an Unknown.
-// If x is Unknown, the result is 0.
-func BitLen(x Value) int {
-	switch x := x.(type) {
-	case int64Val:
-		return new(big.Int).SetInt64(int64(x)).BitLen()
-	case intVal:
-		return x.val.BitLen()
-	case unknownVal:
-		return 0
-	}
-	panic(fmt.Sprintf("%v not an Int", x))
-}
-
-// Sign returns -1, 0, or 1 depending on whether x < 0, x == 0, or x > 0;
-// x must be numeric or Unknown. For complex values x, the sign is 0 if x == 0,
-// otherwise it is != 0. If x is Unknown, the result is 1.
-func Sign(x Value) int {
-	switch x := x.(type) {
-	case int64Val:
-		switch {
-		case x < 0:
-			return -1
-		case x > 0:
-			return 1
-		}
-		return 0
-	case intVal:
-		return x.val.Sign()
-	case floatVal:
-		return x.val.Sign()
-	case complexVal:
-		return x.re.Sign() | x.im.Sign()
-	case unknownVal:
-		return 1 // avoid spurious division by zero errors
-	}
-	panic(fmt.Sprintf("%v not numeric", x))
-}
-
-// ----------------------------------------------------------------------------
-// Support for serializing/deserializing integers
-
-const (
-	// Compute the size of a Word in bytes.
-	_m       = ^big.Word(0)
-	_log     = _m>>8&1 + _m>>16&1 + _m>>32&1
-	wordSize = 1 << _log
-)
-
-// Bytes returns the bytes for the absolute value of x in little-
-// endian binary representation; x must be an Int.
-func Bytes(x Value) []byte {
-	var val *big.Int
-	switch x := x.(type) {
-	case int64Val:
-		val = new(big.Int).SetInt64(int64(x))
-	case intVal:
-		val = x.val
-	default:
-		panic(fmt.Sprintf("%v not an Int", x))
-	}
-
-	words := val.Bits()
-	bytes := make([]byte, len(words)*wordSize)
-
-	i := 0
-	for _, w := range words {
-		for j := 0; j < wordSize; j++ {
-			bytes[i] = byte(w)
-			w >>= 8
-			i++
-		}
-	}
-	// remove leading 0's
-	for i > 0 && bytes[i-1] == 0 {
-		i--
-	}
-
-	return bytes[:i]
-}
-
-// MakeFromBytes returns the Int value given the bytes of its little-endian
-// binary representation. An empty byte slice argument represents 0.
-func MakeFromBytes(bytes []byte) Value {
-	words := make([]big.Word, (len(bytes)+(wordSize-1))/wordSize)
-
-	i := 0
-	var w big.Word
-	var s uint
-	for _, b := range bytes {
-		w |= big.Word(b) << s
-		if s += 8; s == wordSize*8 {
-			words[i] = w
-			i++
-			w = 0
-			s = 0
-		}
-	}
-	// store last word
-	if i < len(words) {
-		words[i] = w
-		i++
-	}
-	// remove leading 0's
-	for i > 0 && words[i-1] == 0 {
-		i--
-	}
-
-	return normInt(new(big.Int).SetBits(words[:i]))
-}
-
-// ----------------------------------------------------------------------------
-// Support for disassembling fractions
-
-// Num returns the numerator of x; x must be Int, Float, or Unknown.
-// If x is Unknown, the result is Unknown, otherwise it is an Int
-// with the same sign as x.
-func Num(x Value) Value {
-	switch x := x.(type) {
-	case unknownVal, int64Val, intVal:
-		return x
-	case floatVal:
-		return normInt(x.val.Num())
-	}
-	panic(fmt.Sprintf("%v not Int or Float", x))
-}
-
-// Denom returns the denominator of x; x must be Int, Float, or Unknown.
-// If x is Unknown, the result is Unknown, otherwise it is an Int >= 1.
-func Denom(x Value) Value {
-	switch x := x.(type) {
-	case unknownVal:
-		return x
-	case int64Val, intVal:
-		return int64Val(1)
-	case floatVal:
-		return normInt(x.val.Denom())
-	}
-	panic(fmt.Sprintf("%v not Int or Float", x))
-}
-
-// ----------------------------------------------------------------------------
-// Support for assembling/disassembling complex numbers
-
-// MakeImag returns the numeric value x*i (possibly 0);
-// x must be Int, Float, or Unknown.
-// If x is Unknown, the result is Unknown.
-func MakeImag(x Value) Value {
-	var im *big.Rat
-	switch x := x.(type) {
-	case unknownVal:
-		return x
-	case int64Val:
-		im = big.NewRat(int64(x), 1)
-	case intVal:
-		im = new(big.Rat).SetFrac(x.val, int1)
-	case floatVal:
-		im = x.val
-	default:
-		panic(fmt.Sprintf("%v not Int or Float", x))
-	}
-	return normComplex(rat0, im)
-}
-
-// Real returns the real part of x, which must be a numeric or unknown value.
-// If x is Unknown, the result is Unknown.
-func Real(x Value) Value {
-	switch x := x.(type) {
-	case unknownVal, int64Val, intVal, floatVal:
-		return x
-	case complexVal:
-		return normFloat(x.re)
-	}
-	panic(fmt.Sprintf("%v not numeric", x))
-}
-
-// Imag returns the imaginary part of x, which must be a numeric or unknown value.
-// If x is Unknown, the result is Unknown.
-func Imag(x Value) Value {
-	switch x := x.(type) {
-	case unknownVal:
-		return x
-	case int64Val, intVal, floatVal:
-		return int64Val(0)
-	case complexVal:
-		return normFloat(x.im)
-	}
-	panic(fmt.Sprintf("%v not numeric", x))
-}
-
-// ----------------------------------------------------------------------------
-// Operations
-
-// is32bit reports whether x can be represented using 32 bits.
-func is32bit(x int64) bool {
-	const s = 32
-	return -1<<(s-1) <= x && x <= 1<<(s-1)-1
-}
-
-// is63bit reports whether x can be represented using 63 bits.
-func is63bit(x int64) bool {
-	const s = 63
-	return -1<<(s-1) <= x && x <= 1<<(s-1)-1
-}
-
-// UnaryOp returns the result of the unary expression op y.
-// The operation must be defined for the operand.
-// If prec > 0 it specifies the ^ (xor) result size in bits.
-// If y is Unknown, the result is Unknown.
-//
-func UnaryOp(op token.Token, y Value, prec uint) Value {
-	switch op {
-	case token.ADD:
-		switch y.(type) {
-		case unknownVal, int64Val, intVal, floatVal, complexVal:
-			return y
-		}
-
-	case token.SUB:
-		switch y := y.(type) {
-		case unknownVal:
-			return y
-		case int64Val:
-			if z := -y; z != y {
-				return z // no overflow
-			}
-			return normInt(new(big.Int).Neg(big.NewInt(int64(y))))
-		case intVal:
-			return normInt(new(big.Int).Neg(y.val))
-		case floatVal:
-			return normFloat(new(big.Rat).Neg(y.val))
-		case complexVal:
-			return normComplex(new(big.Rat).Neg(y.re), new(big.Rat).Neg(y.im))
-		}
-
-	case token.XOR:
-		var z big.Int
-		switch y := y.(type) {
-		case unknownVal:
-			return y
-		case int64Val:
-			z.Not(big.NewInt(int64(y)))
-		case intVal:
-			z.Not(y.val)
-		default:
-			goto Error
-		}
-		// For unsigned types, the result will be negative and
-		// thus "too large": We must limit the result precision
-		// to the type's precision.
-		if prec > 0 {
-			z.AndNot(&z, new(big.Int).Lsh(big.NewInt(-1), prec)) // z &^= (-1)<<prec
-		}
-		return normInt(&z)
-
-	case token.NOT:
-		switch y := y.(type) {
-		case unknownVal:
-			return y
-		case boolVal:
-			return !y
-		}
-	}
-
-Error:
-	panic(fmt.Sprintf("invalid unary operation %s%v", op, y))
-}
-
-var (
-	int1 = big.NewInt(1)
-	rat0 = big.NewRat(0, 1)
-)
-
-func ord(x Value) int {
-	switch x.(type) {
-	default:
-		return 0
-	case boolVal, stringVal:
-		return 1
-	case int64Val:
-		return 2
-	case intVal:
-		return 3
-	case floatVal:
-		return 4
-	case complexVal:
-		return 5
-	}
-}
-
-// match returns the matching representation (same type) with the
-// smallest complexity for two values x and y. If one of them is
-// numeric, both of them must be numeric. If one of them is Unknown,
-// both results are Unknown.
-//
-func match(x, y Value) (_, _ Value) {
-	if ord(x) > ord(y) {
-		y, x = match(y, x)
-		return x, y
-	}
-	// ord(x) <= ord(y)
-
-	switch x := x.(type) {
-	case unknownVal:
-		return x, x
-
-	case boolVal, stringVal, complexVal:
-		return x, y
-
-	case int64Val:
-		switch y := y.(type) {
-		case int64Val:
-			return x, y
-		case intVal:
-			return intVal{big.NewInt(int64(x))}, y
-		case floatVal:
-			return floatVal{big.NewRat(int64(x), 1)}, y
-		case complexVal:
-			return complexVal{big.NewRat(int64(x), 1), rat0}, y
-		}
-
-	case intVal:
-		switch y := y.(type) {
-		case intVal:
-			return x, y
-		case floatVal:
-			return floatVal{new(big.Rat).SetFrac(x.val, int1)}, y
-		case complexVal:
-			return complexVal{new(big.Rat).SetFrac(x.val, int1), rat0}, y
-		}
-
-	case floatVal:
-		switch y := y.(type) {
-		case floatVal:
-			return x, y
-		case complexVal:
-			return complexVal{x.val, rat0}, y
-		}
-	}
-
-	panic("unreachable")
-}
-
-// BinaryOp returns the result of the binary expression x op y.
-// The operation must be defined for the operands. If one of the
-// operands is Unknown, the result is Unknown.
-// To force integer division of Int operands, use op == token.QUO_ASSIGN
-// instead of token.QUO; the result is guaranteed to be Int in this case.
-// Division by zero leads to a run-time panic.
-//
-func BinaryOp(x Value, op token.Token, y Value) Value {
-	x, y = match(x, y)
-
-	switch x := x.(type) {
-	case unknownVal:
-		return x
-
-	case boolVal:
-		y := y.(boolVal)
-		switch op {
-		case token.LAND:
-			return x && y
-		case token.LOR:
-			return x || y
-		}
-
-	case int64Val:
-		a := int64(x)
-		b := int64(y.(int64Val))
-		var c int64
-		switch op {
-		case token.ADD:
-			if !is63bit(a) || !is63bit(b) {
-				return normInt(new(big.Int).Add(big.NewInt(a), big.NewInt(b)))
-			}
-			c = a + b
-		case token.SUB:
-			if !is63bit(a) || !is63bit(b) {
-				return normInt(new(big.Int).Sub(big.NewInt(a), big.NewInt(b)))
-			}
-			c = a - b
-		case token.MUL:
-			if !is32bit(a) || !is32bit(b) {
-				return normInt(new(big.Int).Mul(big.NewInt(a), big.NewInt(b)))
-			}
-			c = a * b
-		case token.QUO:
-			return normFloat(new(big.Rat).SetFrac(big.NewInt(a), big.NewInt(b)))
-		case token.QUO_ASSIGN: // force integer division
-			c = a / b
-		case token.REM:
-			c = a % b
-		case token.AND:
-			c = a & b
-		case token.OR:
-			c = a | b
-		case token.XOR:
-			c = a ^ b
-		case token.AND_NOT:
-			c = a &^ b
-		default:
-			goto Error
-		}
-		return int64Val(c)
-
-	case intVal:
-		a := x.val
-		b := y.(intVal).val
-		var c big.Int
-		switch op {
-		case token.ADD:
-			c.Add(a, b)
-		case token.SUB:
-			c.Sub(a, b)
-		case token.MUL:
-			c.Mul(a, b)
-		case token.QUO:
-			return normFloat(new(big.Rat).SetFrac(a, b))
-		case token.QUO_ASSIGN: // force integer division
-			c.Quo(a, b)
-		case token.REM:
-			c.Rem(a, b)
-		case token.AND:
-			c.And(a, b)
-		case token.OR:
-			c.Or(a, b)
-		case token.XOR:
-			c.Xor(a, b)
-		case token.AND_NOT:
-			c.AndNot(a, b)
-		default:
-			goto Error
-		}
-		return normInt(&c)
-
-	case floatVal:
-		a := x.val
-		b := y.(floatVal).val
-		var c big.Rat
-		switch op {
-		case token.ADD:
-			c.Add(a, b)
-		case token.SUB:
-			c.Sub(a, b)
-		case token.MUL:
-			c.Mul(a, b)
-		case token.QUO:
-			c.Quo(a, b)
-		default:
-			goto Error
-		}
-		return normFloat(&c)
-
-	case complexVal:
-		y := y.(complexVal)
-		a, b := x.re, x.im
-		c, d := y.re, y.im
-		var re, im big.Rat
-		switch op {
-		case token.ADD:
-			// (a+c) + i(b+d)
-			re.Add(a, c)
-			im.Add(b, d)
-		case token.SUB:
-			// (a-c) + i(b-d)
-			re.Sub(a, c)
-			im.Sub(b, d)
-		case token.MUL:
-			// (ac-bd) + i(bc+ad)
-			var ac, bd, bc, ad big.Rat
-			ac.Mul(a, c)
-			bd.Mul(b, d)
-			bc.Mul(b, c)
-			ad.Mul(a, d)
-			re.Sub(&ac, &bd)
-			im.Add(&bc, &ad)
-		case token.QUO:
-			// (ac+bd)/s + i(bc-ad)/s, with s = cc + dd
-			var ac, bd, bc, ad, s, cc, dd big.Rat
-			ac.Mul(a, c)
-			bd.Mul(b, d)
-			bc.Mul(b, c)
-			ad.Mul(a, d)
-			cc.Mul(c, c)
-			dd.Mul(d, d)
-			s.Add(&cc, &dd)
-			re.Add(&ac, &bd)
-			re.Quo(&re, &s)
-			im.Sub(&bc, &ad)
-			im.Quo(&im, &s)
-		default:
-			goto Error
-		}
-		return normComplex(&re, &im)
-
-	case stringVal:
-		if op == token.ADD {
-			return x + y.(stringVal)
-		}
-	}
-
-Error:
-	panic(fmt.Sprintf("invalid binary operation %v %s %v", x, op, y))
-}
-
-// Shift returns the result of the shift expression x op s
-// with op == token.SHL or token.SHR (<< or >>). x must be
-// an Int or an Unknown. If x is Unknown, the result is x.
-//
-func Shift(x Value, op token.Token, s uint) Value {
-	switch x := x.(type) {
-	case unknownVal:
-		return x
-
-	case int64Val:
-		if s == 0 {
-			return x
-		}
-		switch op {
-		case token.SHL:
-			z := big.NewInt(int64(x))
-			return normInt(z.Lsh(z, s))
-		case token.SHR:
-			return x >> s
-		}
-
-	case intVal:
-		if s == 0 {
-			return x
-		}
-		var z big.Int
-		switch op {
-		case token.SHL:
-			return normInt(z.Lsh(x.val, s))
-		case token.SHR:
-			return normInt(z.Rsh(x.val, s))
-		}
-	}
-
-	panic(fmt.Sprintf("invalid shift %v %s %d", x, op, s))
-}
-
-func cmpZero(x int, op token.Token) bool {
-	switch op {
-	case token.EQL:
-		return x == 0
-	case token.NEQ:
-		return x != 0
-	case token.LSS:
-		return x < 0
-	case token.LEQ:
-		return x <= 0
-	case token.GTR:
-		return x > 0
-	case token.GEQ:
-		return x >= 0
-	}
-	panic("unreachable")
-}
-
-// Compare returns the result of the comparison x op y.
-// The comparison must be defined for the operands.
-// If one of the operands is Unknown, the result is
-// false.
-//
-func Compare(x Value, op token.Token, y Value) bool {
-	x, y = match(x, y)
-
-	switch x := x.(type) {
-	case unknownVal:
-		return false
-
-	case boolVal:
-		y := y.(boolVal)
-		switch op {
-		case token.EQL:
-			return x == y
-		case token.NEQ:
-			return x != y
-		}
-
-	case int64Val:
-		y := y.(int64Val)
-		switch op {
-		case token.EQL:
-			return x == y
-		case token.NEQ:
-			return x != y
-		case token.LSS:
-			return x < y
-		case token.LEQ:
-			return x <= y
-		case token.GTR:
-			return x > y
-		case token.GEQ:
-			return x >= y
-		}
-
-	case intVal:
-		return cmpZero(x.val.Cmp(y.(intVal).val), op)
-
-	case floatVal:
-		return cmpZero(x.val.Cmp(y.(floatVal).val), op)
-
-	case complexVal:
-		y := y.(complexVal)
-		re := x.re.Cmp(y.re)
-		im := x.im.Cmp(y.im)
-		switch op {
-		case token.EQL:
-			return re == 0 && im == 0
-		case token.NEQ:
-			return re != 0 || im != 0
-		}
-
-	case stringVal:
-		y := y.(stringVal)
-		switch op {
-		case token.EQL:
-			return x == y
-		case token.NEQ:
-			return x != y
-		case token.LSS:
-			return x < y
-		case token.LEQ:
-			return x <= y
-		case token.GTR:
-			return x > y
-		case token.GEQ:
-			return x >= y
-		}
-	}
-
-	panic(fmt.Sprintf("invalid comparison %v %s %v", x, op, y))
-}
diff --git a/third_party/gofrontend/libgo/go/go/constant/value_test.go b/third_party/gofrontend/libgo/go/go/constant/value_test.go
deleted file mode 100644
index 08cdd5e..0000000
--- a/third_party/gofrontend/libgo/go/go/constant/value_test.go
+++ /dev/null
@@ -1,375 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package constant
-
-import (
-	"go/token"
-	"strings"
-	"testing"
-)
-
-// TODO(gri) expand this test framework
-
-var opTests = []string{
-	// unary operations
-	`+ 0 = 0`,
-	`+ ? = ?`,
-	`- 1 = -1`,
-	`- ? = ?`,
-	`^ 0 = -1`,
-	`^ ? = ?`,
-
-	`! true = false`,
-	`! false = true`,
-	`! ? = ?`,
-
-	// etc.
-
-	// binary operations
-	`"" + "" = ""`,
-	`"foo" + "" = "foo"`,
-	`"" + "bar" = "bar"`,
-	`"foo" + "bar" = "foobar"`,
-
-	`0 + 0 = 0`,
-	`0 + 0.1 = 0.1`,
-	`0 + 0.1i = 0.1i`,
-	`0.1 + 0.9 = 1`,
-	`1e100 + 1e100 = 2e100`,
-	`? + 0 = ?`,
-	`0 + ? = ?`,
-
-	`0 - 0 = 0`,
-	`0 - 0.1 = -0.1`,
-	`0 - 0.1i = -0.1i`,
-	`1e100 - 1e100 = 0`,
-	`? - 0 = ?`,
-	`0 - ? = ?`,
-
-	`0 * 0 = 0`,
-	`1 * 0.1 = 0.1`,
-	`1 * 0.1i = 0.1i`,
-	`1i * 1i = -1`,
-	`? * 0 = ?`,
-	`0 * ? = ?`,
-
-	`0 / 0 = "division_by_zero"`,
-	`10 / 2 = 5`,
-	`5 / 3 = 5/3`,
-	`5i / 3i = 5/3`,
-	`? / 0 = ?`,
-	`0 / ? = ?`,
-
-	`0 % 0 = "runtime_error:_integer_divide_by_zero"`, // TODO(gri) should be the same as for /
-	`10 % 3 = 1`,
-	`? % 0 = ?`,
-	`0 % ? = ?`,
-
-	`0 & 0 = 0`,
-	`12345 & 0 = 0`,
-	`0xff & 0xf = 0xf`,
-	`? & 0 = ?`,
-	`0 & ? = ?`,
-
-	`0 | 0 = 0`,
-	`12345 | 0 = 12345`,
-	`0xb | 0xa0 = 0xab`,
-	`? | 0 = ?`,
-	`0 | ? = ?`,
-
-	`0 ^ 0 = 0`,
-	`1 ^ -1 = -2`,
-	`? ^ 0 = ?`,
-	`0 ^ ? = ?`,
-
-	`0 &^ 0 = 0`,
-	`0xf &^ 1 = 0xe`,
-	`1 &^ 0xf = 0`,
-	// etc.
-
-	// shifts
-	`0 << 0 = 0`,
-	`1 << 10 = 1024`,
-	`0 >> 0 = 0`,
-	`1024 >> 10 == 1`,
-	`? << 0 == ?`,
-	`? >> 10 == ?`,
-	// etc.
-
-	// comparisons
-	`false == false = true`,
-	`false == true = false`,
-	`true == false = false`,
-	`true == true = true`,
-
-	`false != false = false`,
-	`false != true = true`,
-	`true != false = true`,
-	`true != true = false`,
-
-	`"foo" == "bar" = false`,
-	`"foo" != "bar" = true`,
-	`"foo" < "bar" = false`,
-	`"foo" <= "bar" = false`,
-	`"foo" > "bar" = true`,
-	`"foo" >= "bar" = true`,
-
-	`0 == 0 = true`,
-	`0 != 0 = false`,
-	`0 < 10 = true`,
-	`10 <= 10 = true`,
-	`0 > 10 = false`,
-	`10 >= 10 = true`,
-
-	`1/123456789 == 1/123456789 == true`,
-	`1/123456789 != 1/123456789 == false`,
-	`1/123456789 < 1/123456788 == true`,
-	`1/123456788 <= 1/123456789 == false`,
-	`0.11 > 0.11 = false`,
-	`0.11 >= 0.11 = true`,
-
-	`? == 0 = false`,
-	`? != 0 = false`,
-	`? < 10 = false`,
-	`? <= 10 = false`,
-	`? > 10 = false`,
-	`? >= 10 = false`,
-
-	`0 == ? = false`,
-	`0 != ? = false`,
-	`0 < ? = false`,
-	`10 <= ? = false`,
-	`0 > ? = false`,
-	`10 >= ? = false`,
-
-	// etc.
-}
-
-func TestOps(t *testing.T) {
-	for _, test := range opTests {
-		a := strings.Split(test, " ")
-		i := 0 // operator index
-
-		var x, x0 Value
-		switch len(a) {
-		case 4:
-			// unary operation
-		case 5:
-			// binary operation
-			x, x0 = val(a[0]), val(a[0])
-			i = 1
-		default:
-			t.Errorf("invalid test case: %s", test)
-			continue
-		}
-
-		op, ok := optab[a[i]]
-		if !ok {
-			panic("missing optab entry for " + a[i])
-		}
-
-		y, y0 := val(a[i+1]), val(a[i+1])
-
-		got := doOp(x, op, y)
-		want := val(a[i+3])
-		if !eql(got, want) {
-			t.Errorf("%s: got %s; want %s", test, got, want)
-		}
-		if x0 != nil && !eql(x, x0) {
-			t.Errorf("%s: x changed to %s", test, x)
-		}
-		if !eql(y, y0) {
-			t.Errorf("%s: y changed to %s", test, y)
-		}
-	}
-}
-
-func eql(x, y Value) bool {
-	_, ux := x.(unknownVal)
-	_, uy := y.(unknownVal)
-	if ux || uy {
-		return ux == uy
-	}
-	return Compare(x, token.EQL, y)
-}
-
-// ----------------------------------------------------------------------------
-// Support functions
-
-func val(lit string) Value {
-	if len(lit) == 0 {
-		return MakeUnknown()
-	}
-
-	switch lit {
-	case "?":
-		return MakeUnknown()
-	case "true":
-		return MakeBool(true)
-	case "false":
-		return MakeBool(false)
-	}
-
-	tok := token.INT
-	switch first, last := lit[0], lit[len(lit)-1]; {
-	case first == '"' || first == '`':
-		tok = token.STRING
-		lit = strings.Replace(lit, "_", " ", -1)
-	case first == '\'':
-		tok = token.CHAR
-	case last == 'i':
-		tok = token.IMAG
-	default:
-		if !strings.HasPrefix(lit, "0x") && strings.ContainsAny(lit, "./Ee") {
-			tok = token.FLOAT
-		}
-	}
-
-	return MakeFromLiteral(lit, tok, 0)
-}
-
-var optab = map[string]token.Token{
-	"!": token.NOT,
-
-	"+": token.ADD,
-	"-": token.SUB,
-	"*": token.MUL,
-	"/": token.QUO,
-	"%": token.REM,
-
-	"<<": token.SHL,
-	">>": token.SHR,
-
-	"&":  token.AND,
-	"|":  token.OR,
-	"^":  token.XOR,
-	"&^": token.AND_NOT,
-
-	"==": token.EQL,
-	"!=": token.NEQ,
-	"<":  token.LSS,
-	"<=": token.LEQ,
-	">":  token.GTR,
-	">=": token.GEQ,
-}
-
-func panicHandler(v *Value) {
-	switch p := recover().(type) {
-	case nil:
-		// nothing to do
-	case string:
-		*v = MakeString(p)
-	case error:
-		*v = MakeString(p.Error())
-	default:
-		panic(p)
-	}
-}
-
-func doOp(x Value, op token.Token, y Value) (z Value) {
-	defer panicHandler(&z)
-
-	if x == nil {
-		return UnaryOp(op, y, 0)
-	}
-
-	switch op {
-	case token.EQL, token.NEQ, token.LSS, token.LEQ, token.GTR, token.GEQ:
-		return MakeBool(Compare(x, op, y))
-	case token.SHL, token.SHR:
-		s, _ := Int64Val(y)
-		return Shift(x, op, uint(s))
-	default:
-		return BinaryOp(x, op, y)
-	}
-}
-
-// ----------------------------------------------------------------------------
-// Other tests
-
-var fracTests = []string{
-	"0 0 1",
-	"1 1 1",
-	"-1 -1 1",
-	"1.2 6 5",
-	"-0.991 -991 1000",
-	"1e100 1e100 1",
-}
-
-func TestFractions(t *testing.T) {
-	for _, test := range fracTests {
-		a := strings.Split(test, " ")
-		if len(a) != 3 {
-			t.Errorf("invalid test case: %s", test)
-			continue
-		}
-
-		x := val(a[0])
-		n := val(a[1])
-		d := val(a[2])
-
-		if got := Num(x); !eql(got, n) {
-			t.Errorf("%s: got num = %s; want %s", test, got, n)
-		}
-
-		if got := Denom(x); !eql(got, d) {
-			t.Errorf("%s: got denom = %s; want %s", test, got, d)
-		}
-	}
-}
-
-var bytesTests = []string{
-	"0",
-	"1",
-	"123456789",
-	"123456789012345678901234567890123456789012345678901234567890",
-}
-
-func TestBytes(t *testing.T) {
-	for _, test := range bytesTests {
-		x := val(test)
-		bytes := Bytes(x)
-
-		// special case 0
-		if Sign(x) == 0 && len(bytes) != 0 {
-			t.Errorf("%s: got %v; want empty byte slice", test, bytes)
-		}
-
-		if n := len(bytes); n > 0 && bytes[n-1] == 0 {
-			t.Errorf("%s: got %v; want no leading 0 byte", test, bytes)
-		}
-
-		if got := MakeFromBytes(bytes); !eql(got, x) {
-			t.Errorf("%s: got %s; want %s (bytes = %v)", test, got, x, bytes)
-		}
-	}
-}
-
-func TestUnknown(t *testing.T) {
-	u := MakeUnknown()
-	var values = []Value{
-		u,
-		MakeBool(false), // token.ADD ok below, operation is never considered
-		MakeString(""),
-		MakeInt64(1),
-		MakeFromLiteral("-1234567890123456789012345678901234567890", token.INT, 0),
-		MakeFloat64(1.2),
-		MakeImag(MakeFloat64(1.2)),
-	}
-	for _, val := range values {
-		x, y := val, u
-		for i := range [2]int{} {
-			if i == 1 {
-				x, y = y, x
-			}
-			if got := BinaryOp(x, token.ADD, y); got.Kind() != Unknown {
-				t.Errorf("%s + %s: got %s; want %s", x, y, got, u)
-			}
-			if got := Compare(x, token.EQL, y); got {
-				t.Errorf("%s == %s: got true; want false", x, y)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/comment.go b/third_party/gofrontend/libgo/go/go/doc/comment.go
deleted file mode 100644
index f414ca4..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/comment.go
+++ /dev/null
@@ -1,480 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Godoc comment extraction and comment -> HTML formatting.
-
-package doc
-
-import (
-	"io"
-	"regexp"
-	"strings"
-	"text/template" // for HTMLEscape
-	"unicode"
-	"unicode/utf8"
-)
-
-var (
-	ldquo = []byte("&ldquo;")
-	rdquo = []byte("&rdquo;")
-)
-
-// Escape comment text for HTML. If nice is set,
-// also turn `` into &ldquo; and '' into &rdquo;.
-func commentEscape(w io.Writer, text string, nice bool) {
-	last := 0
-	if nice {
-		for i := 0; i < len(text)-1; i++ {
-			ch := text[i]
-			if ch == text[i+1] && (ch == '`' || ch == '\'') {
-				template.HTMLEscape(w, []byte(text[last:i]))
-				last = i + 2
-				switch ch {
-				case '`':
-					w.Write(ldquo)
-				case '\'':
-					w.Write(rdquo)
-				}
-				i++ // loop will add one more
-			}
-		}
-	}
-	template.HTMLEscape(w, []byte(text[last:]))
-}
-
-const (
-	// Regexp for Go identifiers
-	identRx = `[\pL_][\pL_0-9]*`
-
-	// Regexp for URLs
-	protocol = `https?|ftp|file|gopher|mailto|news|nntp|telnet|wais|prospero`
-	hostPart = `[a-zA-Z0-9_@\-]+`
-	filePart = `[a-zA-Z0-9_?%#~&/\-+=()]+` // parentheses may not be matching; see pairedParensPrefixLen
-	urlRx    = `(` + protocol + `)://` +   // http://
-		hostPart + `([.:]` + hostPart + `)*/?` + // //www.google.com:8080/
-		filePart + `([:.,]` + filePart + `)*`
-)
-
-var matchRx = regexp.MustCompile(`(` + urlRx + `)|(` + identRx + `)`)
-
-var (
-	html_a      = []byte(`<a href="`)
-	html_aq     = []byte(`">`)
-	html_enda   = []byte("</a>")
-	html_i      = []byte("<i>")
-	html_endi   = []byte("</i>")
-	html_p      = []byte("<p>\n")
-	html_endp   = []byte("</p>\n")
-	html_pre    = []byte("<pre>")
-	html_endpre = []byte("</pre>\n")
-	html_h      = []byte(`<h3 id="`)
-	html_hq     = []byte(`">`)
-	html_endh   = []byte("</h3>\n")
-)
-
-// pairedParensPrefixLen returns the length of the longest prefix of s containing paired parentheses.
-func pairedParensPrefixLen(s string) int {
-	parens := 0
-	l := len(s)
-	for i, ch := range s {
-		switch ch {
-		case '(':
-			if parens == 0 {
-				l = i
-			}
-			parens++
-		case ')':
-			parens--
-			if parens == 0 {
-				l = len(s)
-			} else if parens < 0 {
-				return i
-			}
-		}
-	}
-	return l
-}
-
-// Emphasize and escape a line of text for HTML. URLs are converted into links;
-// if the URL also appears in the words map, the link is taken from the map (if
-// the corresponding map value is the empty string, the URL is not converted
-// into a link). Go identifiers that appear in the words map are italicized; if
-// the corresponding map value is not the empty string, it is considered a URL
-// and the word is converted into a link. If nice is set, the remaining text's
-// appearance is improved where it makes sense (e.g., `` is turned into &ldquo;
-// and '' into &rdquo;).
-func emphasize(w io.Writer, line string, words map[string]string, nice bool) {
-	for {
-		m := matchRx.FindStringSubmatchIndex(line)
-		if m == nil {
-			break
-		}
-		// m >= 6 (two parenthesized sub-regexps in matchRx, 1st one is urlRx)
-
-		// write text before match
-		commentEscape(w, line[0:m[0]], nice)
-
-		// adjust match if necessary
-		match := line[m[0]:m[1]]
-		if n := pairedParensPrefixLen(match); n < len(match) {
-			// match contains unpaired parentheses (rare);
-			// redo matching with shortened line for correct indices
-			m = matchRx.FindStringSubmatchIndex(line[:m[0]+n])
-			match = match[:n]
-		}
-
-		// analyze match
-		url := ""
-		italics := false
-		if words != nil {
-			url, italics = words[match]
-		}
-		if m[2] >= 0 {
-			// match against first parenthesized sub-regexp; must be match against urlRx
-			if !italics {
-				// no alternative URL in words list, use match instead
-				url = match
-			}
-			italics = false // don't italicize URLs
-		}
-
-		// write match
-		if len(url) > 0 {
-			w.Write(html_a)
-			template.HTMLEscape(w, []byte(url))
-			w.Write(html_aq)
-		}
-		if italics {
-			w.Write(html_i)
-		}
-		commentEscape(w, match, nice)
-		if italics {
-			w.Write(html_endi)
-		}
-		if len(url) > 0 {
-			w.Write(html_enda)
-		}
-
-		// advance
-		line = line[m[1]:]
-	}
-	commentEscape(w, line, nice)
-}
-
-func indentLen(s string) int {
-	i := 0
-	for i < len(s) && (s[i] == ' ' || s[i] == '\t') {
-		i++
-	}
-	return i
-}
-
-func isBlank(s string) bool {
-	return len(s) == 0 || (len(s) == 1 && s[0] == '\n')
-}
-
-func commonPrefix(a, b string) string {
-	i := 0
-	for i < len(a) && i < len(b) && a[i] == b[i] {
-		i++
-	}
-	return a[0:i]
-}
-
-func unindent(block []string) {
-	if len(block) == 0 {
-		return
-	}
-
-	// compute maximum common white prefix
-	prefix := block[0][0:indentLen(block[0])]
-	for _, line := range block {
-		if !isBlank(line) {
-			prefix = commonPrefix(prefix, line[0:indentLen(line)])
-		}
-	}
-	n := len(prefix)
-
-	// remove
-	for i, line := range block {
-		if !isBlank(line) {
-			block[i] = line[n:]
-		}
-	}
-}
-
-// heading returns the trimmed line if it passes as a section heading;
-// otherwise it returns the empty string.
-func heading(line string) string {
-	line = strings.TrimSpace(line)
-	if len(line) == 0 {
-		return ""
-	}
-
-	// a heading must start with an uppercase letter
-	r, _ := utf8.DecodeRuneInString(line)
-	if !unicode.IsLetter(r) || !unicode.IsUpper(r) {
-		return ""
-	}
-
-	// it must end in a letter or digit:
-	r, _ = utf8.DecodeLastRuneInString(line)
-	if !unicode.IsLetter(r) && !unicode.IsDigit(r) {
-		return ""
-	}
-
-	// exclude lines with illegal characters
-	if strings.IndexAny(line, ",.;:!?+*/=()[]{}_^°&§~%#@<\">\\") >= 0 {
-		return ""
-	}
-
-	// allow "'" for possessive "'s" only
-	for b := line; ; {
-		i := strings.IndexRune(b, '\'')
-		if i < 0 {
-			break
-		}
-		if i+1 >= len(b) || b[i+1] != 's' || (i+2 < len(b) && b[i+2] != ' ') {
-			return "" // not followed by "s "
-		}
-		b = b[i+2:]
-	}
-
-	return line
-}
-
-type op int
-
-const (
-	opPara op = iota
-	opHead
-	opPre
-)
-
-type block struct {
-	op    op
-	lines []string
-}
-
-var nonAlphaNumRx = regexp.MustCompile(`[^a-zA-Z0-9]`)
-
-func anchorID(line string) string {
-	// Add a "hdr-" prefix to avoid conflicting with IDs used for package symbols.
-	return "hdr-" + nonAlphaNumRx.ReplaceAllString(line, "_")
-}
-
-// ToHTML converts comment text to formatted HTML.
-// The comment was prepared by DocReader,
-// so it is known not to have leading, trailing blank lines
-// nor to have trailing spaces at the end of lines.
-// The comment markers have already been removed.
-//
-// Each span of unindented non-blank lines is converted into
-// a single paragraph. There is one exception to the rule: a span that
-// consists of a single line, is followed by another paragraph span,
-// begins with a capital letter, and contains no punctuation
-// is formatted as a heading.
-//
-// A span of indented lines is converted into a <pre> block,
-// with the common indent prefix removed.
-//
-// URLs in the comment text are converted into links; if the URL also appears
-// in the words map, the link is taken from the map (if the corresponding map
-// value is the empty string, the URL is not converted into a link).
-//
-// Go identifiers that appear in the words map are italicized; if the corresponding
-// map value is not the empty string, it is considered a URL and the word is converted
-// into a link.
-func ToHTML(w io.Writer, text string, words map[string]string) {
-	for _, b := range blocks(text) {
-		switch b.op {
-		case opPara:
-			w.Write(html_p)
-			for _, line := range b.lines {
-				emphasize(w, line, words, true)
-			}
-			w.Write(html_endp)
-		case opHead:
-			w.Write(html_h)
-			id := ""
-			for _, line := range b.lines {
-				if id == "" {
-					id = anchorID(line)
-					w.Write([]byte(id))
-					w.Write(html_hq)
-				}
-				commentEscape(w, line, true)
-			}
-			if id == "" {
-				w.Write(html_hq)
-			}
-			w.Write(html_endh)
-		case opPre:
-			w.Write(html_pre)
-			for _, line := range b.lines {
-				emphasize(w, line, nil, false)
-			}
-			w.Write(html_endpre)
-		}
-	}
-}
-
-func blocks(text string) []block {
-	var (
-		out  []block
-		para []string
-
-		lastWasBlank   = false
-		lastWasHeading = false
-	)
-
-	close := func() {
-		if para != nil {
-			out = append(out, block{opPara, para})
-			para = nil
-		}
-	}
-
-	lines := strings.SplitAfter(text, "\n")
-	unindent(lines)
-	for i := 0; i < len(lines); {
-		line := lines[i]
-		if isBlank(line) {
-			// close paragraph
-			close()
-			i++
-			lastWasBlank = true
-			continue
-		}
-		if indentLen(line) > 0 {
-			// close paragraph
-			close()
-
-			// count indented or blank lines
-			j := i + 1
-			for j < len(lines) && (isBlank(lines[j]) || indentLen(lines[j]) > 0) {
-				j++
-			}
-			// but not trailing blank lines
-			for j > i && isBlank(lines[j-1]) {
-				j--
-			}
-			pre := lines[i:j]
-			i = j
-
-			unindent(pre)
-
-			// put those lines in a pre block
-			out = append(out, block{opPre, pre})
-			lastWasHeading = false
-			continue
-		}
-
-		if lastWasBlank && !lastWasHeading && i+2 < len(lines) &&
-			isBlank(lines[i+1]) && !isBlank(lines[i+2]) && indentLen(lines[i+2]) == 0 {
-			// current line is non-blank, surrounded by blank lines
-			// and the next non-blank line is not indented: this
-			// might be a heading.
-			if head := heading(line); head != "" {
-				close()
-				out = append(out, block{opHead, []string{head}})
-				i += 2
-				lastWasHeading = true
-				continue
-			}
-		}
-
-		// open paragraph
-		lastWasBlank = false
-		lastWasHeading = false
-		para = append(para, lines[i])
-		i++
-	}
-	close()
-
-	return out
-}
-
-// ToText prepares comment text for presentation in textual output.
-// It wraps paragraphs of text to width or fewer Unicode code points
-// and then prefixes each line with the indent.  In preformatted sections
-// (such as program text), it prefixes each non-blank line with preIndent.
-func ToText(w io.Writer, text string, indent, preIndent string, width int) {
-	l := lineWrapper{
-		out:    w,
-		width:  width,
-		indent: indent,
-	}
-	for _, b := range blocks(text) {
-		switch b.op {
-		case opPara:
-			// l.write will add leading newline if required
-			for _, line := range b.lines {
-				l.write(line)
-			}
-			l.flush()
-		case opHead:
-			w.Write(nl)
-			for _, line := range b.lines {
-				l.write(line + "\n")
-			}
-			l.flush()
-		case opPre:
-			w.Write(nl)
-			for _, line := range b.lines {
-				if isBlank(line) {
-					w.Write([]byte("\n"))
-				} else {
-					w.Write([]byte(preIndent))
-					w.Write([]byte(line))
-				}
-			}
-		}
-	}
-}
-
-type lineWrapper struct {
-	out       io.Writer
-	printed   bool
-	width     int
-	indent    string
-	n         int
-	pendSpace int
-}
-
-var nl = []byte("\n")
-var space = []byte(" ")
-
-func (l *lineWrapper) write(text string) {
-	if l.n == 0 && l.printed {
-		l.out.Write(nl) // blank line before new paragraph
-	}
-	l.printed = true
-
-	for _, f := range strings.Fields(text) {
-		w := utf8.RuneCountInString(f)
-		// wrap if line is too long
-		if l.n > 0 && l.n+l.pendSpace+w > l.width {
-			l.out.Write(nl)
-			l.n = 0
-			l.pendSpace = 0
-		}
-		if l.n == 0 {
-			l.out.Write([]byte(l.indent))
-		}
-		l.out.Write(space[:l.pendSpace])
-		l.out.Write([]byte(f))
-		l.n += l.pendSpace + w
-		l.pendSpace = 1
-	}
-}
-
-func (l *lineWrapper) flush() {
-	if l.n == 0 {
-		return
-	}
-	l.out.Write(nl)
-	l.pendSpace = 0
-	l.n = 0
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/comment_test.go b/third_party/gofrontend/libgo/go/go/doc/comment_test.go
deleted file mode 100644
index ad65c2a..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/comment_test.go
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package doc
-
-import (
-	"bytes"
-	"reflect"
-	"testing"
-)
-
-var headingTests = []struct {
-	line string
-	ok   bool
-}{
-	{"Section", true},
-	{"A typical usage", true},
-	{"ΔΛΞ is Greek", true},
-	{"Foo 42", true},
-	{"", false},
-	{"section", false},
-	{"A typical usage:", false},
-	{"This code:", false},
-	{"δ is Greek", false},
-	{"Foo §", false},
-	{"Fermat's Last Sentence", true},
-	{"Fermat's", true},
-	{"'sX", false},
-	{"Ted 'Too' Bar", false},
-	{"Use n+m", false},
-	{"Scanning:", false},
-	{"N:M", false},
-}
-
-func TestIsHeading(t *testing.T) {
-	for _, tt := range headingTests {
-		if h := heading(tt.line); (len(h) > 0) != tt.ok {
-			t.Errorf("isHeading(%q) = %v, want %v", tt.line, h, tt.ok)
-		}
-	}
-}
-
-var blocksTests = []struct {
-	in   string
-	out  []block
-	text string
-}{
-	{
-		in: `Para 1.
-Para 1 line 2.
-
-Para 2.
-
-Section
-
-Para 3.
-
-	pre
-	pre1
-
-Para 4.
-
-	pre
-	pre1
-
-	pre2
-
-Para 5.
-
-
-	pre
-
-
-	pre1
-	pre2
-
-Para 6.
-	pre
-	pre2
-`,
-		out: []block{
-			{opPara, []string{"Para 1.\n", "Para 1 line 2.\n"}},
-			{opPara, []string{"Para 2.\n"}},
-			{opHead, []string{"Section"}},
-			{opPara, []string{"Para 3.\n"}},
-			{opPre, []string{"pre\n", "pre1\n"}},
-			{opPara, []string{"Para 4.\n"}},
-			{opPre, []string{"pre\n", "pre1\n", "\n", "pre2\n"}},
-			{opPara, []string{"Para 5.\n"}},
-			{opPre, []string{"pre\n", "\n", "\n", "pre1\n", "pre2\n"}},
-			{opPara, []string{"Para 6.\n"}},
-			{opPre, []string{"pre\n", "pre2\n"}},
-		},
-		text: `.   Para 1. Para 1 line 2.
-
-.   Para 2.
-
-
-.   Section
-
-.   Para 3.
-
-$	pre
-$	pre1
-
-.   Para 4.
-
-$	pre
-$	pre1
-
-$	pre2
-
-.   Para 5.
-
-$	pre
-
-
-$	pre1
-$	pre2
-
-.   Para 6.
-
-$	pre
-$	pre2
-`,
-	},
-}
-
-func TestBlocks(t *testing.T) {
-	for i, tt := range blocksTests {
-		b := blocks(tt.in)
-		if !reflect.DeepEqual(b, tt.out) {
-			t.Errorf("#%d: mismatch\nhave: %v\nwant: %v", i, b, tt.out)
-		}
-	}
-}
-
-func TestToText(t *testing.T) {
-	var buf bytes.Buffer
-	for i, tt := range blocksTests {
-		ToText(&buf, tt.in, ".   ", "$\t", 40)
-		if have := buf.String(); have != tt.text {
-			t.Errorf("#%d: mismatch\nhave: %s\nwant: %s\nhave vs want:\n%q\n%q", i, have, tt.text, have, tt.text)
-		}
-		buf.Reset()
-	}
-}
-
-var emphasizeTests = []struct {
-	in, out string
-}{
-	{"http://www.google.com/", `<a href="http://www.google.com/">http://www.google.com/</a>`},
-	{"https://www.google.com/", `<a href="https://www.google.com/">https://www.google.com/</a>`},
-	{"http://www.google.com/path.", `<a href="http://www.google.com/path">http://www.google.com/path</a>.`},
-	{"http://en.wikipedia.org/wiki/Camellia_(cipher)", `<a href="http://en.wikipedia.org/wiki/Camellia_(cipher)">http://en.wikipedia.org/wiki/Camellia_(cipher)</a>`},
-	{"(http://www.google.com/)", `(<a href="http://www.google.com/">http://www.google.com/</a>)`},
-	{"http://gmail.com)", `<a href="http://gmail.com">http://gmail.com</a>)`},
-	{"((http://gmail.com))", `((<a href="http://gmail.com">http://gmail.com</a>))`},
-	{"http://gmail.com ((http://gmail.com)) ()", `<a href="http://gmail.com">http://gmail.com</a> ((<a href="http://gmail.com">http://gmail.com</a>)) ()`},
-	{"Foo bar http://example.com/ quux!", `Foo bar <a href="http://example.com/">http://example.com/</a> quux!`},
-	{"Hello http://example.com/%2f/ /world.", `Hello <a href="http://example.com/%2f/">http://example.com/%2f/</a> /world.`},
-	{"Lorem http: ipsum //host/path", "Lorem http: ipsum //host/path"},
-	{"javascript://is/not/linked", "javascript://is/not/linked"},
-}
-
-func TestEmphasize(t *testing.T) {
-	for i, tt := range emphasizeTests {
-		var buf bytes.Buffer
-		emphasize(&buf, tt.in, nil, true)
-		out := buf.String()
-		if out != tt.out {
-			t.Errorf("#%d: mismatch\nhave: %v\nwant: %v", i, out, tt.out)
-		}
-	}
-}
-
-var pairedParensPrefixLenTests = []struct {
-	in, out string
-}{
-	{"", ""},
-	{"foo", "foo"},
-	{"()", "()"},
-	{"foo()", "foo()"},
-	{"foo()()()", "foo()()()"},
-	{"foo()((()()))", "foo()((()()))"},
-	{"foo()((()()))bar", "foo()((()()))bar"},
-	{"foo)", "foo"},
-	{"foo))", "foo"},
-	{"foo)))))", "foo"},
-	{"(foo", ""},
-	{"((foo", ""},
-	{"(((((foo", ""},
-	{"(foo)", "(foo)"},
-	{"((((foo))))", "((((foo))))"},
-	{"foo()())", "foo()()"},
-	{"foo((()())", "foo"},
-	{"foo((()())) (() foo ", "foo((()())) "},
-}
-
-func TestPairedParensPrefixLen(t *testing.T) {
-	for i, tt := range pairedParensPrefixLenTests {
-		if out := tt.in[:pairedParensPrefixLen(tt.in)]; out != tt.out {
-			t.Errorf("#%d: mismatch\nhave: %q\nwant: %q", i, out, tt.out)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/doc.go b/third_party/gofrontend/libgo/go/go/doc/doc.go
deleted file mode 100644
index 3c3e28d..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/doc.go
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package doc extracts source code documentation from a Go AST.
-package doc
-
-import (
-	"go/ast"
-	"go/token"
-)
-
-// Package is the documentation for an entire package.
-type Package struct {
-	Doc        string
-	Name       string
-	ImportPath string
-	Imports    []string
-	Filenames  []string
-	Notes      map[string][]*Note
-
-	// Deprecated: For backward compatibility Bugs is still populated,
-	// but all new code should use Notes instead.
-	Bugs []string
-
-	// declarations
-	Consts []*Value
-	Types  []*Type
-	Vars   []*Value
-	Funcs  []*Func
-}
-
-// Value is the documentation for a (possibly grouped) var or const declaration.
-type Value struct {
-	Doc   string
-	Names []string // var or const names in declaration order
-	Decl  *ast.GenDecl
-
-	order int
-}
-
-// Type is the documentation for a type declaration.
-type Type struct {
-	Doc  string
-	Name string
-	Decl *ast.GenDecl
-
-	// associated declarations
-	Consts  []*Value // sorted list of constants of (mostly) this type
-	Vars    []*Value // sorted list of variables of (mostly) this type
-	Funcs   []*Func  // sorted list of functions returning this type
-	Methods []*Func  // sorted list of methods (including embedded ones) of this type
-}
-
-// Func is the documentation for a func declaration.
-type Func struct {
-	Doc  string
-	Name string
-	Decl *ast.FuncDecl
-
-	// methods
-	// (for functions, these fields have the respective zero value)
-	Recv  string // actual   receiver "T" or "*T"
-	Orig  string // original receiver "T" or "*T"
-	Level int    // embedding level; 0 means not embedded
-}
-
-// A Note represents a marked comment starting with "MARKER(uid): note body".
-// Any note with a marker of 2 or more upper case [A-Z] letters and a uid of
-// at least one character is recognized. The ":" following the uid is optional.
-// Notes are collected in the Package.Notes map indexed by the notes marker.
-type Note struct {
-	Pos, End token.Pos // position range of the comment containing the marker
-	UID      string    // uid found with the marker
-	Body     string    // note body text
-}
-
-// Mode values control the operation of New.
-type Mode int
-
-const (
-	// extract documentation for all package-level declarations,
-	// not just exported ones
-	AllDecls Mode = 1 << iota
-
-	// show all embedded methods, not just the ones of
-	// invisible (unexported) anonymous fields
-	AllMethods
-)
-
-// New computes the package documentation for the given package AST.
-// New takes ownership of the AST pkg and may edit or overwrite it.
-//
-func New(pkg *ast.Package, importPath string, mode Mode) *Package {
-	var r reader
-	r.readPackage(pkg, mode)
-	r.computeMethodSets()
-	r.cleanupTypes()
-	return &Package{
-		Doc:        r.doc,
-		Name:       pkg.Name,
-		ImportPath: importPath,
-		Imports:    sortedKeys(r.imports),
-		Filenames:  r.filenames,
-		Notes:      r.notes,
-		Bugs:       noteBodies(r.notes["BUG"]),
-		Consts:     sortedValues(r.values, token.CONST),
-		Types:      sortedTypes(r.types, mode&AllMethods != 0),
-		Vars:       sortedValues(r.values, token.VAR),
-		Funcs:      sortedFuncs(r.funcs, true),
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/doc_test.go b/third_party/gofrontend/libgo/go/go/doc/doc_test.go
deleted file mode 100644
index ad8ba53..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/doc_test.go
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package doc
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"go/parser"
-	"go/printer"
-	"go/token"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"regexp"
-	"strings"
-	"testing"
-	"text/template"
-)
-
-var update = flag.Bool("update", false, "update golden (.out) files")
-var files = flag.String("files", "", "consider only Go test files matching this regular expression")
-
-const dataDir = "testdata"
-
-var templateTxt = readTemplate("template.txt")
-
-func readTemplate(filename string) *template.Template {
-	t := template.New(filename)
-	t.Funcs(template.FuncMap{
-		"node":     nodeFmt,
-		"synopsis": synopsisFmt,
-		"indent":   indentFmt,
-	})
-	return template.Must(t.ParseFiles(filepath.Join(dataDir, filename)))
-}
-
-func nodeFmt(node interface{}, fset *token.FileSet) string {
-	var buf bytes.Buffer
-	printer.Fprint(&buf, fset, node)
-	return strings.Replace(strings.TrimSpace(buf.String()), "\n", "\n\t", -1)
-}
-
-func synopsisFmt(s string) string {
-	const n = 64
-	if len(s) > n {
-		// cut off excess text and go back to a word boundary
-		s = s[0:n]
-		if i := strings.LastIndexAny(s, "\t\n "); i >= 0 {
-			s = s[0:i]
-		}
-		s = strings.TrimSpace(s) + " ..."
-	}
-	return "// " + strings.Replace(s, "\n", " ", -1)
-}
-
-func indentFmt(indent, s string) string {
-	end := ""
-	if strings.HasSuffix(s, "\n") {
-		end = "\n"
-		s = s[:len(s)-1]
-	}
-	return indent + strings.Replace(s, "\n", "\n"+indent, -1) + end
-}
-
-func isGoFile(fi os.FileInfo) bool {
-	name := fi.Name()
-	return !fi.IsDir() &&
-		len(name) > 0 && name[0] != '.' && // ignore .files
-		filepath.Ext(name) == ".go"
-}
-
-type bundle struct {
-	*Package
-	FSet *token.FileSet
-}
-
-func test(t *testing.T, mode Mode) {
-	// determine file filter
-	filter := isGoFile
-	if *files != "" {
-		rx, err := regexp.Compile(*files)
-		if err != nil {
-			t.Fatal(err)
-		}
-		filter = func(fi os.FileInfo) bool {
-			return isGoFile(fi) && rx.MatchString(fi.Name())
-		}
-	}
-
-	// get packages
-	fset := token.NewFileSet()
-	pkgs, err := parser.ParseDir(fset, dataDir, filter, parser.ParseComments)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// test packages
-	for _, pkg := range pkgs {
-		importpath := dataDir + "/" + pkg.Name
-		doc := New(pkg, importpath, mode)
-
-		// golden files always use / in filenames - canonicalize them
-		for i, filename := range doc.Filenames {
-			doc.Filenames[i] = filepath.ToSlash(filename)
-		}
-
-		// print documentation
-		var buf bytes.Buffer
-		if err := templateTxt.Execute(&buf, bundle{doc, fset}); err != nil {
-			t.Error(err)
-			continue
-		}
-		got := buf.Bytes()
-
-		// update golden file if necessary
-		golden := filepath.Join(dataDir, fmt.Sprintf("%s.%d.golden", pkg.Name, mode))
-		if *update {
-			err := ioutil.WriteFile(golden, got, 0644)
-			if err != nil {
-				t.Error(err)
-			}
-			continue
-		}
-
-		// get golden file
-		want, err := ioutil.ReadFile(golden)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-
-		// compare
-		if !bytes.Equal(got, want) {
-			t.Errorf("package %s\n\tgot:\n%s\n\twant:\n%s", pkg.Name, got, want)
-		}
-	}
-}
-
-func Test(t *testing.T) {
-	test(t, 0)
-	test(t, AllDecls)
-	test(t, AllMethods)
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/example.go b/third_party/gofrontend/libgo/go/go/doc/example.go
deleted file mode 100644
index c414e54..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/example.go
+++ /dev/null
@@ -1,355 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Extract example functions from file ASTs.
-
-package doc
-
-import (
-	"go/ast"
-	"go/token"
-	"path"
-	"regexp"
-	"sort"
-	"strconv"
-	"strings"
-	"unicode"
-	"unicode/utf8"
-)
-
-// An Example represents an example function found in a source files.
-type Example struct {
-	Name        string // name of the item being exemplified
-	Doc         string // example function doc string
-	Code        ast.Node
-	Play        *ast.File // a whole program version of the example
-	Comments    []*ast.CommentGroup
-	Output      string // expected output
-	EmptyOutput bool   // expect empty output
-	Order       int    // original source code order
-}
-
-// Examples returns the examples found in the files, sorted by Name field.
-// The Order fields record the order in which the examples were encountered.
-//
-// Playable Examples must be in a package whose name ends in "_test".
-// An Example is "playable" (the Play field is non-nil) in either of these
-// circumstances:
-//   - The example function is self-contained: the function references only
-//     identifiers from other packages (or predeclared identifiers, such as
-//     "int") and the test file does not include a dot import.
-//   - The entire test file is the example: the file contains exactly one
-//     example function, zero test or benchmark functions, and at least one
-//     top-level function, type, variable, or constant declaration other
-//     than the example function.
-func Examples(files ...*ast.File) []*Example {
-	var list []*Example
-	for _, file := range files {
-		hasTests := false // file contains tests or benchmarks
-		numDecl := 0      // number of non-import declarations in the file
-		var flist []*Example
-		for _, decl := range file.Decls {
-			if g, ok := decl.(*ast.GenDecl); ok && g.Tok != token.IMPORT {
-				numDecl++
-				continue
-			}
-			f, ok := decl.(*ast.FuncDecl)
-			if !ok {
-				continue
-			}
-			numDecl++
-			name := f.Name.Name
-			if isTest(name, "Test") || isTest(name, "Benchmark") {
-				hasTests = true
-				continue
-			}
-			if !isTest(name, "Example") {
-				continue
-			}
-			var doc string
-			if f.Doc != nil {
-				doc = f.Doc.Text()
-			}
-			output, hasOutput := exampleOutput(f.Body, file.Comments)
-			flist = append(flist, &Example{
-				Name:        name[len("Example"):],
-				Doc:         doc,
-				Code:        f.Body,
-				Play:        playExample(file, f.Body),
-				Comments:    file.Comments,
-				Output:      output,
-				EmptyOutput: output == "" && hasOutput,
-				Order:       len(flist),
-			})
-		}
-		if !hasTests && numDecl > 1 && len(flist) == 1 {
-			// If this file only has one example function, some
-			// other top-level declarations, and no tests or
-			// benchmarks, use the whole file as the example.
-			flist[0].Code = file
-			flist[0].Play = playExampleFile(file)
-		}
-		list = append(list, flist...)
-	}
-	sort.Sort(exampleByName(list))
-	return list
-}
-
-var outputPrefix = regexp.MustCompile(`(?i)^[[:space:]]*output:`)
-
-// Extracts the expected output and whether there was a valid output comment
-func exampleOutput(b *ast.BlockStmt, comments []*ast.CommentGroup) (output string, ok bool) {
-	if _, last := lastComment(b, comments); last != nil {
-		// test that it begins with the correct prefix
-		text := last.Text()
-		if loc := outputPrefix.FindStringIndex(text); loc != nil {
-			text = text[loc[1]:]
-			// Strip zero or more spaces followed by \n or a single space.
-			text = strings.TrimLeft(text, " ")
-			if len(text) > 0 && text[0] == '\n' {
-				text = text[1:]
-			}
-			return text, true
-		}
-	}
-	return "", false // no suitable comment found
-}
-
-// isTest tells whether name looks like a test, example, or benchmark.
-// It is a Test (say) if there is a character after Test that is not a
-// lower-case letter. (We don't want Testiness.)
-func isTest(name, prefix string) bool {
-	if !strings.HasPrefix(name, prefix) {
-		return false
-	}
-	if len(name) == len(prefix) { // "Test" is ok
-		return true
-	}
-	rune, _ := utf8.DecodeRuneInString(name[len(prefix):])
-	return !unicode.IsLower(rune)
-}
-
-type exampleByName []*Example
-
-func (s exampleByName) Len() int           { return len(s) }
-func (s exampleByName) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
-func (s exampleByName) Less(i, j int) bool { return s[i].Name < s[j].Name }
-
-// playExample synthesizes a new *ast.File based on the provided
-// file with the provided function body as the body of main.
-func playExample(file *ast.File, body *ast.BlockStmt) *ast.File {
-	if !strings.HasSuffix(file.Name.Name, "_test") {
-		// We don't support examples that are part of the
-		// greater package (yet).
-		return nil
-	}
-
-	// Find top-level declarations in the file.
-	topDecls := make(map[*ast.Object]bool)
-	for _, decl := range file.Decls {
-		switch d := decl.(type) {
-		case *ast.FuncDecl:
-			topDecls[d.Name.Obj] = true
-		case *ast.GenDecl:
-			for _, spec := range d.Specs {
-				switch s := spec.(type) {
-				case *ast.TypeSpec:
-					topDecls[s.Name.Obj] = true
-				case *ast.ValueSpec:
-					for _, id := range s.Names {
-						topDecls[id.Obj] = true
-					}
-				}
-			}
-		}
-	}
-
-	// Find unresolved identifiers and uses of top-level declarations.
-	unresolved := make(map[string]bool)
-	usesTopDecl := false
-	var inspectFunc func(ast.Node) bool
-	inspectFunc = func(n ast.Node) bool {
-		// For selector expressions, only inspect the left hand side.
-		// (For an expression like fmt.Println, only add "fmt" to the
-		// set of unresolved names, not "Println".)
-		if e, ok := n.(*ast.SelectorExpr); ok {
-			ast.Inspect(e.X, inspectFunc)
-			return false
-		}
-		// For key value expressions, only inspect the value
-		// as the key should be resolved by the type of the
-		// composite literal.
-		if e, ok := n.(*ast.KeyValueExpr); ok {
-			ast.Inspect(e.Value, inspectFunc)
-			return false
-		}
-		if id, ok := n.(*ast.Ident); ok {
-			if id.Obj == nil {
-				unresolved[id.Name] = true
-			} else if topDecls[id.Obj] {
-				usesTopDecl = true
-			}
-		}
-		return true
-	}
-	ast.Inspect(body, inspectFunc)
-	if usesTopDecl {
-		// We don't support examples that are not self-contained (yet).
-		return nil
-	}
-
-	// Remove predeclared identifiers from unresolved list.
-	for n := range unresolved {
-		if predeclaredTypes[n] || predeclaredConstants[n] || predeclaredFuncs[n] {
-			delete(unresolved, n)
-		}
-	}
-
-	// Use unresolved identifiers to determine the imports used by this
-	// example. The heuristic assumes package names match base import
-	// paths for imports w/o renames (should be good enough most of the time).
-	namedImports := make(map[string]string) // [name]path
-	var blankImports []ast.Spec             // _ imports
-	for _, s := range file.Imports {
-		p, err := strconv.Unquote(s.Path.Value)
-		if err != nil {
-			continue
-		}
-		n := path.Base(p)
-		if s.Name != nil {
-			n = s.Name.Name
-			switch n {
-			case "_":
-				blankImports = append(blankImports, s)
-				continue
-			case ".":
-				// We can't resolve dot imports (yet).
-				return nil
-			}
-		}
-		if unresolved[n] {
-			namedImports[n] = p
-			delete(unresolved, n)
-		}
-	}
-
-	// If there are other unresolved identifiers, give up because this
-	// synthesized file is not going to build.
-	if len(unresolved) > 0 {
-		return nil
-	}
-
-	// Include documentation belonging to blank imports.
-	var comments []*ast.CommentGroup
-	for _, s := range blankImports {
-		if c := s.(*ast.ImportSpec).Doc; c != nil {
-			comments = append(comments, c)
-		}
-	}
-
-	// Include comments that are inside the function body.
-	for _, c := range file.Comments {
-		if body.Pos() <= c.Pos() && c.End() <= body.End() {
-			comments = append(comments, c)
-		}
-	}
-
-	// Strip "Output:" comment and adjust body end position.
-	body, comments = stripOutputComment(body, comments)
-
-	// Synthesize import declaration.
-	importDecl := &ast.GenDecl{
-		Tok:    token.IMPORT,
-		Lparen: 1, // Need non-zero Lparen and Rparen so that printer
-		Rparen: 1, // treats this as a factored import.
-	}
-	for n, p := range namedImports {
-		s := &ast.ImportSpec{Path: &ast.BasicLit{Value: strconv.Quote(p)}}
-		if path.Base(p) != n {
-			s.Name = ast.NewIdent(n)
-		}
-		importDecl.Specs = append(importDecl.Specs, s)
-	}
-	importDecl.Specs = append(importDecl.Specs, blankImports...)
-
-	// Synthesize main function.
-	funcDecl := &ast.FuncDecl{
-		Name: ast.NewIdent("main"),
-		Type: &ast.FuncType{Params: &ast.FieldList{}}, // FuncType.Params must be non-nil
-		Body: body,
-	}
-
-	// Synthesize file.
-	return &ast.File{
-		Name:     ast.NewIdent("main"),
-		Decls:    []ast.Decl{importDecl, funcDecl},
-		Comments: comments,
-	}
-}
-
-// playExampleFile takes a whole file example and synthesizes a new *ast.File
-// such that the example is function main in package main.
-func playExampleFile(file *ast.File) *ast.File {
-	// Strip copyright comment if present.
-	comments := file.Comments
-	if len(comments) > 0 && strings.HasPrefix(comments[0].Text(), "Copyright") {
-		comments = comments[1:]
-	}
-
-	// Copy declaration slice, rewriting the ExampleX function to main.
-	var decls []ast.Decl
-	for _, d := range file.Decls {
-		if f, ok := d.(*ast.FuncDecl); ok && isTest(f.Name.Name, "Example") {
-			// Copy the FuncDecl, as it may be used elsewhere.
-			newF := *f
-			newF.Name = ast.NewIdent("main")
-			newF.Body, comments = stripOutputComment(f.Body, comments)
-			d = &newF
-		}
-		decls = append(decls, d)
-	}
-
-	// Copy the File, as it may be used elsewhere.
-	f := *file
-	f.Name = ast.NewIdent("main")
-	f.Decls = decls
-	f.Comments = comments
-	return &f
-}
-
-// stripOutputComment finds and removes an "Output:" comment from body
-// and comments, and adjusts the body block's end position.
-func stripOutputComment(body *ast.BlockStmt, comments []*ast.CommentGroup) (*ast.BlockStmt, []*ast.CommentGroup) {
-	// Do nothing if no "Output:" comment found.
-	i, last := lastComment(body, comments)
-	if last == nil || !outputPrefix.MatchString(last.Text()) {
-		return body, comments
-	}
-
-	// Copy body and comments, as the originals may be used elsewhere.
-	newBody := &ast.BlockStmt{
-		Lbrace: body.Lbrace,
-		List:   body.List,
-		Rbrace: last.Pos(),
-	}
-	newComments := make([]*ast.CommentGroup, len(comments)-1)
-	copy(newComments, comments[:i])
-	copy(newComments[i:], comments[i+1:])
-	return newBody, newComments
-}
-
-// lastComment returns the last comment inside the provided block.
-func lastComment(b *ast.BlockStmt, c []*ast.CommentGroup) (i int, last *ast.CommentGroup) {
-	pos, end := b.Pos(), b.End()
-	for j, cg := range c {
-		if cg.Pos() < pos {
-			continue
-		}
-		if cg.End() > end {
-			break
-		}
-		i, last = j, cg
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/example_test.go b/third_party/gofrontend/libgo/go/go/doc/example_test.go
deleted file mode 100644
index e154ea8..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/example_test.go
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package doc_test
-
-import (
-	"bytes"
-	"go/doc"
-	"go/format"
-	"go/parser"
-	"go/token"
-	"strings"
-	"testing"
-)
-
-const exampleTestFile = `
-package foo_test
-
-import (
-	"flag"
-	"fmt"
-	"log"
-	"os/exec"
-)
-
-func ExampleHello() {
-	fmt.Println("Hello, world!")
-	// Output: Hello, world!
-}
-
-func ExampleImport() {
-	out, err := exec.Command("date").Output()
-	if err != nil {
-		log.Fatal(err)
-	}
-	fmt.Printf("The date is %s\n", out)
-}
-
-func ExampleKeyValue() {
-	v := struct {
-		a string
-		b int
-	}{
-		a: "A",
-		b: 1,
-	}
-	fmt.Print(v)
-	// Output: a: "A", b: 1
-}
-
-func ExampleKeyValueImport() {
-	f := flag.Flag{
-		Name: "play",
-	}
-	fmt.Print(f)
-	// Output: Name: "play"
-}
-
-var keyValueTopDecl = struct {
-	a string
-	b int
-}{
-	a: "B",
-	b: 2,
-}
-
-func ExampleKeyValueTopDecl() {
-	fmt.Print(keyValueTopDecl)
-}
-`
-
-var exampleTestCases = []struct {
-	Name, Play, Output string
-}{
-	{
-		Name:   "Hello",
-		Play:   exampleHelloPlay,
-		Output: "Hello, world!\n",
-	},
-	{
-		Name: "Import",
-		Play: exampleImportPlay,
-	},
-	{
-		Name:   "KeyValue",
-		Play:   exampleKeyValuePlay,
-		Output: "a: \"A\", b: 1\n",
-	},
-	{
-		Name:   "KeyValueImport",
-		Play:   exampleKeyValueImportPlay,
-		Output: "Name: \"play\"\n",
-	},
-	{
-		Name: "KeyValueTopDecl",
-		Play: "<nil>",
-	},
-}
-
-const exampleHelloPlay = `package main
-
-import (
-	"fmt"
-)
-
-func main() {
-	fmt.Println("Hello, world!")
-}
-`
-const exampleImportPlay = `package main
-
-import (
-	"fmt"
-	"log"
-	"os/exec"
-)
-
-func main() {
-	out, err := exec.Command("date").Output()
-	if err != nil {
-		log.Fatal(err)
-	}
-	fmt.Printf("The date is %s\n", out)
-}
-`
-
-const exampleKeyValuePlay = `package main
-
-import (
-	"fmt"
-)
-
-func main() {
-	v := struct {
-		a string
-		b int
-	}{
-		a: "A",
-		b: 1,
-	}
-	fmt.Print(v)
-}
-`
-
-const exampleKeyValueImportPlay = `package main
-
-import (
-	"flag"
-	"fmt"
-)
-
-func main() {
-	f := flag.Flag{
-		Name: "play",
-	}
-	fmt.Print(f)
-}
-`
-
-func TestExamples(t *testing.T) {
-	fset := token.NewFileSet()
-	file, err := parser.ParseFile(fset, "test.go", strings.NewReader(exampleTestFile), parser.ParseComments)
-	if err != nil {
-		t.Fatal(err)
-	}
-	for i, e := range doc.Examples(file) {
-		c := exampleTestCases[i]
-		if e.Name != c.Name {
-			t.Errorf("got Name == %q, want %q", e.Name, c.Name)
-		}
-		if w := c.Play; w != "" {
-			var g string // hah
-			if e.Play == nil {
-				g = "<nil>"
-			} else {
-				var buf bytes.Buffer
-				if err := format.Node(&buf, fset, e.Play); err != nil {
-					t.Fatal(err)
-				}
-				g = buf.String()
-			}
-			if g != w {
-				t.Errorf("%s: got Play == %q, want %q", c.Name, g, w)
-			}
-		}
-		if g, w := e.Output, c.Output; g != w {
-			t.Errorf("%s: got Output == %q, want %q", c.Name, g, w)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/exports.go b/third_party/gofrontend/libgo/go/go/doc/exports.go
deleted file mode 100644
index 4a12b1e..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/exports.go
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements export filtering of an AST.
-
-package doc
-
-import (
-	"go/ast"
-	"go/token"
-)
-
-// filterIdentList removes unexported names from list in place
-// and returns the resulting list.
-//
-func filterIdentList(list []*ast.Ident) []*ast.Ident {
-	j := 0
-	for _, x := range list {
-		if ast.IsExported(x.Name) {
-			list[j] = x
-			j++
-		}
-	}
-	return list[0:j]
-}
-
-// hasExportedName reports whether list contains any exported names.
-//
-func hasExportedName(list []*ast.Ident) bool {
-	for _, x := range list {
-		if x.IsExported() {
-			return true
-		}
-	}
-	return false
-}
-
-// removeErrorField removes anonymous fields named "error" from an interface.
-// This is called when "error" has been determined to be a local name,
-// not the predeclared type.
-//
-func removeErrorField(ityp *ast.InterfaceType) {
-	list := ityp.Methods.List // we know that ityp.Methods != nil
-	j := 0
-	for _, field := range list {
-		keepField := true
-		if n := len(field.Names); n == 0 {
-			// anonymous field
-			if fname, _ := baseTypeName(field.Type); fname == "error" {
-				keepField = false
-			}
-		}
-		if keepField {
-			list[j] = field
-			j++
-		}
-	}
-	if j < len(list) {
-		ityp.Incomplete = true
-	}
-	ityp.Methods.List = list[0:j]
-}
-
-// filterFieldList removes unexported fields (field names) from the field list
-// in place and reports whether fields were removed. Anonymous fields are
-// recorded with the parent type. filterType is called with the types of
-// all remaining fields.
-//
-func (r *reader) filterFieldList(parent *namedType, fields *ast.FieldList, ityp *ast.InterfaceType) (removedFields bool) {
-	if fields == nil {
-		return
-	}
-	list := fields.List
-	j := 0
-	for _, field := range list {
-		keepField := false
-		if n := len(field.Names); n == 0 {
-			// anonymous field
-			fname := r.recordAnonymousField(parent, field.Type)
-			if ast.IsExported(fname) {
-				keepField = true
-			} else if ityp != nil && fname == "error" {
-				// possibly the predeclared error interface; keep
-				// it for now but remember this interface so that
-				// it can be fixed if error is also defined locally
-				keepField = true
-				r.remember(ityp)
-			}
-		} else {
-			field.Names = filterIdentList(field.Names)
-			if len(field.Names) < n {
-				removedFields = true
-			}
-			if len(field.Names) > 0 {
-				keepField = true
-			}
-		}
-		if keepField {
-			r.filterType(nil, field.Type)
-			list[j] = field
-			j++
-		}
-	}
-	if j < len(list) {
-		removedFields = true
-	}
-	fields.List = list[0:j]
-	return
-}
-
-// filterParamList applies filterType to each parameter type in fields.
-//
-func (r *reader) filterParamList(fields *ast.FieldList) {
-	if fields != nil {
-		for _, f := range fields.List {
-			r.filterType(nil, f.Type)
-		}
-	}
-}
-
-// filterType strips any unexported struct fields or method types from typ
-// in place. If fields (or methods) have been removed, the corresponding
-// struct or interface type has the Incomplete field set to true.
-//
-func (r *reader) filterType(parent *namedType, typ ast.Expr) {
-	switch t := typ.(type) {
-	case *ast.Ident:
-		// nothing to do
-	case *ast.ParenExpr:
-		r.filterType(nil, t.X)
-	case *ast.ArrayType:
-		r.filterType(nil, t.Elt)
-	case *ast.StructType:
-		if r.filterFieldList(parent, t.Fields, nil) {
-			t.Incomplete = true
-		}
-	case *ast.FuncType:
-		r.filterParamList(t.Params)
-		r.filterParamList(t.Results)
-	case *ast.InterfaceType:
-		if r.filterFieldList(parent, t.Methods, t) {
-			t.Incomplete = true
-		}
-	case *ast.MapType:
-		r.filterType(nil, t.Key)
-		r.filterType(nil, t.Value)
-	case *ast.ChanType:
-		r.filterType(nil, t.Value)
-	}
-}
-
-func (r *reader) filterSpec(spec ast.Spec, tok token.Token) bool {
-	switch s := spec.(type) {
-	case *ast.ImportSpec:
-		// always keep imports so we can collect them
-		return true
-	case *ast.ValueSpec:
-		s.Names = filterIdentList(s.Names)
-		if len(s.Names) > 0 {
-			r.filterType(nil, s.Type)
-			return true
-		}
-	case *ast.TypeSpec:
-		if name := s.Name.Name; ast.IsExported(name) {
-			r.filterType(r.lookupType(s.Name.Name), s.Type)
-			return true
-		} else if name == "error" {
-			// special case: remember that error is declared locally
-			r.errorDecl = true
-		}
-	}
-	return false
-}
-
-// copyConstType returns a copy of typ with position pos.
-// typ must be a valid constant type.
-// In practice, only (possibly qualified) identifiers are possible.
-//
-func copyConstType(typ ast.Expr, pos token.Pos) ast.Expr {
-	switch typ := typ.(type) {
-	case *ast.Ident:
-		return &ast.Ident{Name: typ.Name, NamePos: pos}
-	case *ast.SelectorExpr:
-		if id, ok := typ.X.(*ast.Ident); ok {
-			// presumably a qualified identifier
-			return &ast.SelectorExpr{
-				Sel: ast.NewIdent(typ.Sel.Name),
-				X:   &ast.Ident{Name: id.Name, NamePos: pos},
-			}
-		}
-	}
-	return nil // shouldn't happen, but be conservative and don't panic
-}
-
-func (r *reader) filterSpecList(list []ast.Spec, tok token.Token) []ast.Spec {
-	if tok == token.CONST {
-		// Propagate any type information that would get lost otherwise
-		// when unexported constants are filtered.
-		var prevType ast.Expr
-		for _, spec := range list {
-			spec := spec.(*ast.ValueSpec)
-			if spec.Type == nil && prevType != nil {
-				// provide current spec with an explicit type
-				spec.Type = copyConstType(prevType, spec.Pos())
-			}
-			if hasExportedName(spec.Names) {
-				// exported names are preserved so there's no need to propagate the type
-				prevType = nil
-			} else {
-				prevType = spec.Type
-			}
-		}
-	}
-
-	j := 0
-	for _, s := range list {
-		if r.filterSpec(s, tok) {
-			list[j] = s
-			j++
-		}
-	}
-	return list[0:j]
-}
-
-func (r *reader) filterDecl(decl ast.Decl) bool {
-	switch d := decl.(type) {
-	case *ast.GenDecl:
-		d.Specs = r.filterSpecList(d.Specs, d.Tok)
-		return len(d.Specs) > 0
-	case *ast.FuncDecl:
-		// ok to filter these methods early because any
-		// conflicting method will be filtered here, too -
-		// thus, removing these methods early will not lead
-		// to the false removal of possible conflicts
-		return ast.IsExported(d.Name.Name)
-	}
-	return false
-}
-
-// fileExports removes unexported declarations from src in place.
-//
-func (r *reader) fileExports(src *ast.File) {
-	j := 0
-	for _, d := range src.Decls {
-		if r.filterDecl(d) {
-			src.Decls[j] = d
-			j++
-		}
-	}
-	src.Decls = src.Decls[0:j]
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/filter.go b/third_party/gofrontend/libgo/go/go/doc/filter.go
deleted file mode 100644
index a6f243f..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/filter.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package doc
-
-import "go/ast"
-
-type Filter func(string) bool
-
-func matchFields(fields *ast.FieldList, f Filter) bool {
-	if fields != nil {
-		for _, field := range fields.List {
-			for _, name := range field.Names {
-				if f(name.Name) {
-					return true
-				}
-			}
-		}
-	}
-	return false
-}
-
-func matchDecl(d *ast.GenDecl, f Filter) bool {
-	for _, d := range d.Specs {
-		switch v := d.(type) {
-		case *ast.ValueSpec:
-			for _, name := range v.Names {
-				if f(name.Name) {
-					return true
-				}
-			}
-		case *ast.TypeSpec:
-			if f(v.Name.Name) {
-				return true
-			}
-			switch t := v.Type.(type) {
-			case *ast.StructType:
-				if matchFields(t.Fields, f) {
-					return true
-				}
-			case *ast.InterfaceType:
-				if matchFields(t.Methods, f) {
-					return true
-				}
-			}
-		}
-	}
-	return false
-}
-
-func filterValues(a []*Value, f Filter) []*Value {
-	w := 0
-	for _, vd := range a {
-		if matchDecl(vd.Decl, f) {
-			a[w] = vd
-			w++
-		}
-	}
-	return a[0:w]
-}
-
-func filterFuncs(a []*Func, f Filter) []*Func {
-	w := 0
-	for _, fd := range a {
-		if f(fd.Name) {
-			a[w] = fd
-			w++
-		}
-	}
-	return a[0:w]
-}
-
-func filterTypes(a []*Type, f Filter) []*Type {
-	w := 0
-	for _, td := range a {
-		n := 0 // number of matches
-		if matchDecl(td.Decl, f) {
-			n = 1
-		} else {
-			// type name doesn't match, but we may have matching consts, vars, factories or methods
-			td.Consts = filterValues(td.Consts, f)
-			td.Vars = filterValues(td.Vars, f)
-			td.Funcs = filterFuncs(td.Funcs, f)
-			td.Methods = filterFuncs(td.Methods, f)
-			n += len(td.Consts) + len(td.Vars) + len(td.Funcs) + len(td.Methods)
-		}
-		if n > 0 {
-			a[w] = td
-			w++
-		}
-	}
-	return a[0:w]
-}
-
-// Filter eliminates documentation for names that don't pass through the filter f.
-// TODO(gri): Recognize "Type.Method" as a name.
-//
-func (p *Package) Filter(f Filter) {
-	p.Consts = filterValues(p.Consts, f)
-	p.Vars = filterValues(p.Vars, f)
-	p.Types = filterTypes(p.Types, f)
-	p.Funcs = filterFuncs(p.Funcs, f)
-	p.Doc = "" // don't show top-level package doc
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/headscan.go b/third_party/gofrontend/libgo/go/go/doc/headscan.go
deleted file mode 100644
index 1ccaa15..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/headscan.go
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-/*
-	The headscan command extracts comment headings from package files;
-	it is used to detect false positives which may require an adjustment
-	to the comment formatting heuristics in comment.go.
-
-	Usage: headscan [-root root_directory]
-
-	By default, the $GOROOT/src directory is scanned.
-*/
-package main
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"go/doc"
-	"go/parser"
-	"go/token"
-	"os"
-	"path/filepath"
-	"regexp"
-	"runtime"
-	"strings"
-)
-
-var (
-	root    = flag.String("root", filepath.Join(runtime.GOROOT(), "src"), "root of filesystem tree to scan")
-	verbose = flag.Bool("v", false, "verbose mode")
-)
-
-// ToHTML in comment.go assigns a (possibly blank) ID to each heading
-var html_h = regexp.MustCompile(`<h3 id="[^"]*">`)
-
-const html_endh = "</h3>\n"
-
-func isGoFile(fi os.FileInfo) bool {
-	return strings.HasSuffix(fi.Name(), ".go") &&
-		!strings.HasSuffix(fi.Name(), "_test.go")
-}
-
-func appendHeadings(list []string, comment string) []string {
-	var buf bytes.Buffer
-	doc.ToHTML(&buf, comment, nil)
-	for s := buf.String(); ; {
-		loc := html_h.FindStringIndex(s)
-		if len(loc) == 0 {
-			break
-		}
-		i := loc[1]
-		j := strings.Index(s, html_endh)
-		if j < 0 {
-			list = append(list, s[i:]) // incorrect HTML
-			break
-		}
-		list = append(list, s[i:j])
-		s = s[j+len(html_endh):]
-	}
-	return list
-}
-
-func main() {
-	flag.Parse()
-	fset := token.NewFileSet()
-	nheadings := 0
-	err := filepath.Walk(*root, func(path string, fi os.FileInfo, err error) error {
-		if !fi.IsDir() {
-			return nil
-		}
-		pkgs, err := parser.ParseDir(fset, path, isGoFile, parser.ParseComments)
-		if err != nil {
-			if *verbose {
-				fmt.Fprintln(os.Stderr, err)
-			}
-			return nil
-		}
-		for _, pkg := range pkgs {
-			d := doc.New(pkg, path, doc.Mode(0))
-			list := appendHeadings(nil, d.Doc)
-			for _, d := range d.Consts {
-				list = appendHeadings(list, d.Doc)
-			}
-			for _, d := range d.Types {
-				list = appendHeadings(list, d.Doc)
-			}
-			for _, d := range d.Vars {
-				list = appendHeadings(list, d.Doc)
-			}
-			for _, d := range d.Funcs {
-				list = appendHeadings(list, d.Doc)
-			}
-			if len(list) > 0 {
-				// directories may contain multiple packages;
-				// print path and package name
-				fmt.Printf("%s (package %s)\n", path, pkg.Name)
-				for _, h := range list {
-					fmt.Printf("\t%s\n", h)
-				}
-				nheadings += len(list)
-			}
-		}
-		return nil
-	})
-	if err != nil {
-		fmt.Fprintln(os.Stderr, err)
-		os.Exit(1)
-	}
-	fmt.Println(nheadings, "headings found")
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/reader.go b/third_party/gofrontend/libgo/go/go/doc/reader.go
deleted file mode 100644
index ed82c47..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/reader.go
+++ /dev/null
@@ -1,853 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package doc
-
-import (
-	"go/ast"
-	"go/token"
-	"regexp"
-	"sort"
-	"strconv"
-)
-
-// ----------------------------------------------------------------------------
-// function/method sets
-//
-// Internally, we treat functions like methods and collect them in method sets.
-
-// A methodSet describes a set of methods. Entries where Decl == nil are conflict
-// entries (more then one method with the same name at the same embedding level).
-//
-type methodSet map[string]*Func
-
-// recvString returns a string representation of recv of the
-// form "T", "*T", or "BADRECV" (if not a proper receiver type).
-//
-func recvString(recv ast.Expr) string {
-	switch t := recv.(type) {
-	case *ast.Ident:
-		return t.Name
-	case *ast.StarExpr:
-		return "*" + recvString(t.X)
-	}
-	return "BADRECV"
-}
-
-// set creates the corresponding Func for f and adds it to mset.
-// If there are multiple f's with the same name, set keeps the first
-// one with documentation; conflicts are ignored.
-//
-func (mset methodSet) set(f *ast.FuncDecl) {
-	name := f.Name.Name
-	if g := mset[name]; g != nil && g.Doc != "" {
-		// A function with the same name has already been registered;
-		// since it has documentation, assume f is simply another
-		// implementation and ignore it. This does not happen if the
-		// caller is using go/build.ScanDir to determine the list of
-		// files implementing a package.
-		return
-	}
-	// function doesn't exist or has no documentation; use f
-	recv := ""
-	if f.Recv != nil {
-		var typ ast.Expr
-		// be careful in case of incorrect ASTs
-		if list := f.Recv.List; len(list) == 1 {
-			typ = list[0].Type
-		}
-		recv = recvString(typ)
-	}
-	mset[name] = &Func{
-		Doc:  f.Doc.Text(),
-		Name: name,
-		Decl: f,
-		Recv: recv,
-		Orig: recv,
-	}
-	f.Doc = nil // doc consumed - remove from AST
-}
-
-// add adds method m to the method set; m is ignored if the method set
-// already contains a method with the same name at the same or a higher
-// level then m.
-//
-func (mset methodSet) add(m *Func) {
-	old := mset[m.Name]
-	if old == nil || m.Level < old.Level {
-		mset[m.Name] = m
-		return
-	}
-	if old != nil && m.Level == old.Level {
-		// conflict - mark it using a method with nil Decl
-		mset[m.Name] = &Func{
-			Name:  m.Name,
-			Level: m.Level,
-		}
-	}
-}
-
-// ----------------------------------------------------------------------------
-// Named types
-
-// baseTypeName returns the name of the base type of x (or "")
-// and whether the type is imported or not.
-//
-func baseTypeName(x ast.Expr) (name string, imported bool) {
-	switch t := x.(type) {
-	case *ast.Ident:
-		return t.Name, false
-	case *ast.SelectorExpr:
-		if _, ok := t.X.(*ast.Ident); ok {
-			// only possible for qualified type names;
-			// assume type is imported
-			return t.Sel.Name, true
-		}
-	case *ast.StarExpr:
-		return baseTypeName(t.X)
-	}
-	return
-}
-
-// An embeddedSet describes a set of embedded types.
-type embeddedSet map[*namedType]bool
-
-// A namedType represents a named unqualified (package local, or possibly
-// predeclared) type. The namedType for a type name is always found via
-// reader.lookupType.
-//
-type namedType struct {
-	doc  string       // doc comment for type
-	name string       // type name
-	decl *ast.GenDecl // nil if declaration hasn't been seen yet
-
-	isEmbedded bool        // true if this type is embedded
-	isStruct   bool        // true if this type is a struct
-	embedded   embeddedSet // true if the embedded type is a pointer
-
-	// associated declarations
-	values  []*Value // consts and vars
-	funcs   methodSet
-	methods methodSet
-}
-
-// ----------------------------------------------------------------------------
-// AST reader
-
-// reader accumulates documentation for a single package.
-// It modifies the AST: Comments (declaration documentation)
-// that have been collected by the reader are set to nil
-// in the respective AST nodes so that they are not printed
-// twice (once when printing the documentation and once when
-// printing the corresponding AST node).
-//
-type reader struct {
-	mode Mode
-
-	// package properties
-	doc       string // package documentation, if any
-	filenames []string
-	notes     map[string][]*Note
-
-	// declarations
-	imports map[string]int
-	values  []*Value // consts and vars
-	types   map[string]*namedType
-	funcs   methodSet
-
-	// support for package-local error type declarations
-	errorDecl bool                 // if set, type "error" was declared locally
-	fixlist   []*ast.InterfaceType // list of interfaces containing anonymous field "error"
-}
-
-func (r *reader) isVisible(name string) bool {
-	return r.mode&AllDecls != 0 || ast.IsExported(name)
-}
-
-// lookupType returns the base type with the given name.
-// If the base type has not been encountered yet, a new
-// type with the given name but no associated declaration
-// is added to the type map.
-//
-func (r *reader) lookupType(name string) *namedType {
-	if name == "" || name == "_" {
-		return nil // no type docs for anonymous types
-	}
-	if typ, found := r.types[name]; found {
-		return typ
-	}
-	// type not found - add one without declaration
-	typ := &namedType{
-		name:     name,
-		embedded: make(embeddedSet),
-		funcs:    make(methodSet),
-		methods:  make(methodSet),
-	}
-	r.types[name] = typ
-	return typ
-}
-
-// recordAnonymousField registers fieldType as the type of an
-// anonymous field in the parent type. If the field is imported
-// (qualified name) or the parent is nil, the field is ignored.
-// The function returns the field name.
-//
-func (r *reader) recordAnonymousField(parent *namedType, fieldType ast.Expr) (fname string) {
-	fname, imp := baseTypeName(fieldType)
-	if parent == nil || imp {
-		return
-	}
-	if ftype := r.lookupType(fname); ftype != nil {
-		ftype.isEmbedded = true
-		_, ptr := fieldType.(*ast.StarExpr)
-		parent.embedded[ftype] = ptr
-	}
-	return
-}
-
-func (r *reader) readDoc(comment *ast.CommentGroup) {
-	// By convention there should be only one package comment
-	// but collect all of them if there are more then one.
-	text := comment.Text()
-	if r.doc == "" {
-		r.doc = text
-		return
-	}
-	r.doc += "\n" + text
-}
-
-func (r *reader) remember(typ *ast.InterfaceType) {
-	r.fixlist = append(r.fixlist, typ)
-}
-
-func specNames(specs []ast.Spec) []string {
-	names := make([]string, 0, len(specs)) // reasonable estimate
-	for _, s := range specs {
-		// s guaranteed to be an *ast.ValueSpec by readValue
-		for _, ident := range s.(*ast.ValueSpec).Names {
-			names = append(names, ident.Name)
-		}
-	}
-	return names
-}
-
-// readValue processes a const or var declaration.
-//
-func (r *reader) readValue(decl *ast.GenDecl) {
-	// determine if decl should be associated with a type
-	// Heuristic: For each typed entry, determine the type name, if any.
-	//            If there is exactly one type name that is sufficiently
-	//            frequent, associate the decl with the respective type.
-	domName := ""
-	domFreq := 0
-	prev := ""
-	n := 0
-	for _, spec := range decl.Specs {
-		s, ok := spec.(*ast.ValueSpec)
-		if !ok {
-			continue // should not happen, but be conservative
-		}
-		name := ""
-		switch {
-		case s.Type != nil:
-			// a type is present; determine its name
-			if n, imp := baseTypeName(s.Type); !imp {
-				name = n
-			}
-		case decl.Tok == token.CONST:
-			// no type is present but we have a constant declaration;
-			// use the previous type name (w/o more type information
-			// we cannot handle the case of unnamed variables with
-			// initializer expressions except for some trivial cases)
-			name = prev
-		}
-		if name != "" {
-			// entry has a named type
-			if domName != "" && domName != name {
-				// more than one type name - do not associate
-				// with any type
-				domName = ""
-				break
-			}
-			domName = name
-			domFreq++
-		}
-		prev = name
-		n++
-	}
-
-	// nothing to do w/o a legal declaration
-	if n == 0 {
-		return
-	}
-
-	// determine values list with which to associate the Value for this decl
-	values := &r.values
-	const threshold = 0.75
-	if domName != "" && r.isVisible(domName) && domFreq >= int(float64(len(decl.Specs))*threshold) {
-		// typed entries are sufficiently frequent
-		if typ := r.lookupType(domName); typ != nil {
-			values = &typ.values // associate with that type
-		}
-	}
-
-	*values = append(*values, &Value{
-		Doc:   decl.Doc.Text(),
-		Names: specNames(decl.Specs),
-		Decl:  decl,
-		order: len(*values),
-	})
-	decl.Doc = nil // doc consumed - remove from AST
-}
-
-// fields returns a struct's fields or an interface's methods.
-//
-func fields(typ ast.Expr) (list []*ast.Field, isStruct bool) {
-	var fields *ast.FieldList
-	switch t := typ.(type) {
-	case *ast.StructType:
-		fields = t.Fields
-		isStruct = true
-	case *ast.InterfaceType:
-		fields = t.Methods
-	}
-	if fields != nil {
-		list = fields.List
-	}
-	return
-}
-
-// readType processes a type declaration.
-//
-func (r *reader) readType(decl *ast.GenDecl, spec *ast.TypeSpec) {
-	typ := r.lookupType(spec.Name.Name)
-	if typ == nil {
-		return // no name or blank name - ignore the type
-	}
-
-	// A type should be added at most once, so typ.decl
-	// should be nil - if it is not, simply overwrite it.
-	typ.decl = decl
-
-	// compute documentation
-	doc := spec.Doc
-	spec.Doc = nil // doc consumed - remove from AST
-	if doc == nil {
-		// no doc associated with the spec, use the declaration doc, if any
-		doc = decl.Doc
-	}
-	decl.Doc = nil // doc consumed - remove from AST
-	typ.doc = doc.Text()
-
-	// record anonymous fields (they may contribute methods)
-	// (some fields may have been recorded already when filtering
-	// exports, but that's ok)
-	var list []*ast.Field
-	list, typ.isStruct = fields(spec.Type)
-	for _, field := range list {
-		if len(field.Names) == 0 {
-			r.recordAnonymousField(typ, field.Type)
-		}
-	}
-}
-
-// readFunc processes a func or method declaration.
-//
-func (r *reader) readFunc(fun *ast.FuncDecl) {
-	// strip function body
-	fun.Body = nil
-
-	// associate methods with the receiver type, if any
-	if fun.Recv != nil {
-		// method
-		recvTypeName, imp := baseTypeName(fun.Recv.List[0].Type)
-		if imp {
-			// should not happen (incorrect AST);
-			// don't show this method
-			return
-		}
-		if typ := r.lookupType(recvTypeName); typ != nil {
-			typ.methods.set(fun)
-		}
-		// otherwise ignore the method
-		// TODO(gri): There may be exported methods of non-exported types
-		// that can be called because of exported values (consts, vars, or
-		// function results) of that type. Could determine if that is the
-		// case and then show those methods in an appropriate section.
-		return
-	}
-
-	// associate factory functions with the first visible result type, if any
-	if fun.Type.Results.NumFields() >= 1 {
-		res := fun.Type.Results.List[0]
-		if len(res.Names) <= 1 {
-			// exactly one (named or anonymous) result associated
-			// with the first type in result signature (there may
-			// be more than one result)
-			if n, imp := baseTypeName(res.Type); !imp && r.isVisible(n) {
-				if typ := r.lookupType(n); typ != nil {
-					// associate function with typ
-					typ.funcs.set(fun)
-					return
-				}
-			}
-		}
-	}
-
-	// just an ordinary function
-	r.funcs.set(fun)
-}
-
-var (
-	noteMarker    = `([A-Z][A-Z]+)\(([^)]+)\):?`                    // MARKER(uid), MARKER at least 2 chars, uid at least 1 char
-	noteMarkerRx  = regexp.MustCompile(`^[ \t]*` + noteMarker)      // MARKER(uid) at text start
-	noteCommentRx = regexp.MustCompile(`^/[/*][ \t]*` + noteMarker) // MARKER(uid) at comment start
-)
-
-// readNote collects a single note from a sequence of comments.
-//
-func (r *reader) readNote(list []*ast.Comment) {
-	text := (&ast.CommentGroup{List: list}).Text()
-	if m := noteMarkerRx.FindStringSubmatchIndex(text); m != nil {
-		// The note body starts after the marker.
-		// We remove any formatting so that we don't
-		// get spurious line breaks/indentation when
-		// showing the TODO body.
-		body := clean(text[m[1]:], keepNL)
-		if body != "" {
-			marker := text[m[2]:m[3]]
-			r.notes[marker] = append(r.notes[marker], &Note{
-				Pos:  list[0].Pos(),
-				End:  list[len(list)-1].End(),
-				UID:  text[m[4]:m[5]],
-				Body: body,
-			})
-		}
-	}
-}
-
-// readNotes extracts notes from comments.
-// A note must start at the beginning of a comment with "MARKER(uid):"
-// and is followed by the note body (e.g., "// BUG(gri): fix this").
-// The note ends at the end of the comment group or at the start of
-// another note in the same comment group, whichever comes first.
-//
-func (r *reader) readNotes(comments []*ast.CommentGroup) {
-	for _, group := range comments {
-		i := -1 // comment index of most recent note start, valid if >= 0
-		list := group.List
-		for j, c := range list {
-			if noteCommentRx.MatchString(c.Text) {
-				if i >= 0 {
-					r.readNote(list[i:j])
-				}
-				i = j
-			}
-		}
-		if i >= 0 {
-			r.readNote(list[i:])
-		}
-	}
-}
-
-// readFile adds the AST for a source file to the reader.
-//
-func (r *reader) readFile(src *ast.File) {
-	// add package documentation
-	if src.Doc != nil {
-		r.readDoc(src.Doc)
-		src.Doc = nil // doc consumed - remove from AST
-	}
-
-	// add all declarations
-	for _, decl := range src.Decls {
-		switch d := decl.(type) {
-		case *ast.GenDecl:
-			switch d.Tok {
-			case token.IMPORT:
-				// imports are handled individually
-				for _, spec := range d.Specs {
-					if s, ok := spec.(*ast.ImportSpec); ok {
-						if import_, err := strconv.Unquote(s.Path.Value); err == nil {
-							r.imports[import_] = 1
-						}
-					}
-				}
-			case token.CONST, token.VAR:
-				// constants and variables are always handled as a group
-				r.readValue(d)
-			case token.TYPE:
-				// types are handled individually
-				if len(d.Specs) == 1 && !d.Lparen.IsValid() {
-					// common case: single declaration w/o parentheses
-					// (if a single declaration is parenthesized,
-					// create a new fake declaration below, so that
-					// go/doc type declarations always appear w/o
-					// parentheses)
-					if s, ok := d.Specs[0].(*ast.TypeSpec); ok {
-						r.readType(d, s)
-					}
-					break
-				}
-				for _, spec := range d.Specs {
-					if s, ok := spec.(*ast.TypeSpec); ok {
-						// use an individual (possibly fake) declaration
-						// for each type; this also ensures that each type
-						// gets to (re-)use the declaration documentation
-						// if there's none associated with the spec itself
-						fake := &ast.GenDecl{
-							Doc: d.Doc,
-							// don't use the existing TokPos because it
-							// will lead to the wrong selection range for
-							// the fake declaration if there are more
-							// than one type in the group (this affects
-							// src/cmd/godoc/godoc.go's posLink_urlFunc)
-							TokPos: s.Pos(),
-							Tok:    token.TYPE,
-							Specs:  []ast.Spec{s},
-						}
-						r.readType(fake, s)
-					}
-				}
-			}
-		case *ast.FuncDecl:
-			r.readFunc(d)
-		}
-	}
-
-	// collect MARKER(...): annotations
-	r.readNotes(src.Comments)
-	src.Comments = nil // consumed unassociated comments - remove from AST
-}
-
-func (r *reader) readPackage(pkg *ast.Package, mode Mode) {
-	// initialize reader
-	r.filenames = make([]string, len(pkg.Files))
-	r.imports = make(map[string]int)
-	r.mode = mode
-	r.types = make(map[string]*namedType)
-	r.funcs = make(methodSet)
-	r.notes = make(map[string][]*Note)
-
-	// sort package files before reading them so that the
-	// result does not depend on map iteration order
-	i := 0
-	for filename := range pkg.Files {
-		r.filenames[i] = filename
-		i++
-	}
-	sort.Strings(r.filenames)
-
-	// process files in sorted order
-	for _, filename := range r.filenames {
-		f := pkg.Files[filename]
-		if mode&AllDecls == 0 {
-			r.fileExports(f)
-		}
-		r.readFile(f)
-	}
-}
-
-// ----------------------------------------------------------------------------
-// Types
-
-func customizeRecv(f *Func, recvTypeName string, embeddedIsPtr bool, level int) *Func {
-	if f == nil || f.Decl == nil || f.Decl.Recv == nil || len(f.Decl.Recv.List) != 1 {
-		return f // shouldn't happen, but be safe
-	}
-
-	// copy existing receiver field and set new type
-	newField := *f.Decl.Recv.List[0]
-	origPos := newField.Type.Pos()
-	_, origRecvIsPtr := newField.Type.(*ast.StarExpr)
-	newIdent := &ast.Ident{NamePos: origPos, Name: recvTypeName}
-	var typ ast.Expr = newIdent
-	if !embeddedIsPtr && origRecvIsPtr {
-		newIdent.NamePos++ // '*' is one character
-		typ = &ast.StarExpr{Star: origPos, X: newIdent}
-	}
-	newField.Type = typ
-
-	// copy existing receiver field list and set new receiver field
-	newFieldList := *f.Decl.Recv
-	newFieldList.List = []*ast.Field{&newField}
-
-	// copy existing function declaration and set new receiver field list
-	newFuncDecl := *f.Decl
-	newFuncDecl.Recv = &newFieldList
-
-	// copy existing function documentation and set new declaration
-	newF := *f
-	newF.Decl = &newFuncDecl
-	newF.Recv = recvString(typ)
-	// the Orig field never changes
-	newF.Level = level
-
-	return &newF
-}
-
-// collectEmbeddedMethods collects the embedded methods of typ in mset.
-//
-func (r *reader) collectEmbeddedMethods(mset methodSet, typ *namedType, recvTypeName string, embeddedIsPtr bool, level int, visited embeddedSet) {
-	visited[typ] = true
-	for embedded, isPtr := range typ.embedded {
-		// Once an embedded type is embedded as a pointer type
-		// all embedded types in those types are treated like
-		// pointer types for the purpose of the receiver type
-		// computation; i.e., embeddedIsPtr is sticky for this
-		// embedding hierarchy.
-		thisEmbeddedIsPtr := embeddedIsPtr || isPtr
-		for _, m := range embedded.methods {
-			// only top-level methods are embedded
-			if m.Level == 0 {
-				mset.add(customizeRecv(m, recvTypeName, thisEmbeddedIsPtr, level))
-			}
-		}
-		if !visited[embedded] {
-			r.collectEmbeddedMethods(mset, embedded, recvTypeName, thisEmbeddedIsPtr, level+1, visited)
-		}
-	}
-	delete(visited, typ)
-}
-
-// computeMethodSets determines the actual method sets for each type encountered.
-//
-func (r *reader) computeMethodSets() {
-	for _, t := range r.types {
-		// collect embedded methods for t
-		if t.isStruct {
-			// struct
-			r.collectEmbeddedMethods(t.methods, t, t.name, false, 1, make(embeddedSet))
-		} else {
-			// interface
-			// TODO(gri) fix this
-		}
-	}
-
-	// if error was declared locally, don't treat it as exported field anymore
-	if r.errorDecl {
-		for _, ityp := range r.fixlist {
-			removeErrorField(ityp)
-		}
-	}
-}
-
-// cleanupTypes removes the association of functions and methods with
-// types that have no declaration. Instead, these functions and methods
-// are shown at the package level. It also removes types with missing
-// declarations or which are not visible.
-//
-func (r *reader) cleanupTypes() {
-	for _, t := range r.types {
-		visible := r.isVisible(t.name)
-		if t.decl == nil && (predeclaredTypes[t.name] || t.isEmbedded && visible) {
-			// t.name is a predeclared type (and was not redeclared in this package),
-			// or it was embedded somewhere but its declaration is missing (because
-			// the AST is incomplete): move any associated values, funcs, and methods
-			// back to the top-level so that they are not lost.
-			// 1) move values
-			r.values = append(r.values, t.values...)
-			// 2) move factory functions
-			for name, f := range t.funcs {
-				// in a correct AST, package-level function names
-				// are all different - no need to check for conflicts
-				r.funcs[name] = f
-			}
-			// 3) move methods
-			for name, m := range t.methods {
-				// don't overwrite functions with the same name - drop them
-				if _, found := r.funcs[name]; !found {
-					r.funcs[name] = m
-				}
-			}
-		}
-		// remove types w/o declaration or which are not visible
-		if t.decl == nil || !visible {
-			delete(r.types, t.name)
-		}
-	}
-}
-
-// ----------------------------------------------------------------------------
-// Sorting
-
-type data struct {
-	n    int
-	swap func(i, j int)
-	less func(i, j int) bool
-}
-
-func (d *data) Len() int           { return d.n }
-func (d *data) Swap(i, j int)      { d.swap(i, j) }
-func (d *data) Less(i, j int) bool { return d.less(i, j) }
-
-// sortBy is a helper function for sorting
-func sortBy(less func(i, j int) bool, swap func(i, j int), n int) {
-	sort.Sort(&data{n, swap, less})
-}
-
-func sortedKeys(m map[string]int) []string {
-	list := make([]string, len(m))
-	i := 0
-	for key := range m {
-		list[i] = key
-		i++
-	}
-	sort.Strings(list)
-	return list
-}
-
-// sortingName returns the name to use when sorting d into place.
-//
-func sortingName(d *ast.GenDecl) string {
-	if len(d.Specs) == 1 {
-		if s, ok := d.Specs[0].(*ast.ValueSpec); ok {
-			return s.Names[0].Name
-		}
-	}
-	return ""
-}
-
-func sortedValues(m []*Value, tok token.Token) []*Value {
-	list := make([]*Value, len(m)) // big enough in any case
-	i := 0
-	for _, val := range m {
-		if val.Decl.Tok == tok {
-			list[i] = val
-			i++
-		}
-	}
-	list = list[0:i]
-
-	sortBy(
-		func(i, j int) bool {
-			if ni, nj := sortingName(list[i].Decl), sortingName(list[j].Decl); ni != nj {
-				return ni < nj
-			}
-			return list[i].order < list[j].order
-		},
-		func(i, j int) { list[i], list[j] = list[j], list[i] },
-		len(list),
-	)
-
-	return list
-}
-
-func sortedTypes(m map[string]*namedType, allMethods bool) []*Type {
-	list := make([]*Type, len(m))
-	i := 0
-	for _, t := range m {
-		list[i] = &Type{
-			Doc:     t.doc,
-			Name:    t.name,
-			Decl:    t.decl,
-			Consts:  sortedValues(t.values, token.CONST),
-			Vars:    sortedValues(t.values, token.VAR),
-			Funcs:   sortedFuncs(t.funcs, true),
-			Methods: sortedFuncs(t.methods, allMethods),
-		}
-		i++
-	}
-
-	sortBy(
-		func(i, j int) bool { return list[i].Name < list[j].Name },
-		func(i, j int) { list[i], list[j] = list[j], list[i] },
-		len(list),
-	)
-
-	return list
-}
-
-func removeStar(s string) string {
-	if len(s) > 0 && s[0] == '*' {
-		return s[1:]
-	}
-	return s
-}
-
-func sortedFuncs(m methodSet, allMethods bool) []*Func {
-	list := make([]*Func, len(m))
-	i := 0
-	for _, m := range m {
-		// determine which methods to include
-		switch {
-		case m.Decl == nil:
-			// exclude conflict entry
-		case allMethods, m.Level == 0, !ast.IsExported(removeStar(m.Orig)):
-			// forced inclusion, method not embedded, or method
-			// embedded but original receiver type not exported
-			list[i] = m
-			i++
-		}
-	}
-	list = list[0:i]
-	sortBy(
-		func(i, j int) bool { return list[i].Name < list[j].Name },
-		func(i, j int) { list[i], list[j] = list[j], list[i] },
-		len(list),
-	)
-	return list
-}
-
-// noteBodies returns a list of note body strings given a list of notes.
-// This is only used to populate the deprecated Package.Bugs field.
-//
-func noteBodies(notes []*Note) []string {
-	var list []string
-	for _, n := range notes {
-		list = append(list, n.Body)
-	}
-	return list
-}
-
-// ----------------------------------------------------------------------------
-// Predeclared identifiers
-
-var predeclaredTypes = map[string]bool{
-	"bool":       true,
-	"byte":       true,
-	"complex64":  true,
-	"complex128": true,
-	"error":      true,
-	"float32":    true,
-	"float64":    true,
-	"int":        true,
-	"int8":       true,
-	"int16":      true,
-	"int32":      true,
-	"int64":      true,
-	"rune":       true,
-	"string":     true,
-	"uint":       true,
-	"uint8":      true,
-	"uint16":     true,
-	"uint32":     true,
-	"uint64":     true,
-	"uintptr":    true,
-}
-
-var predeclaredFuncs = map[string]bool{
-	"append":  true,
-	"cap":     true,
-	"close":   true,
-	"complex": true,
-	"copy":    true,
-	"delete":  true,
-	"imag":    true,
-	"len":     true,
-	"make":    true,
-	"new":     true,
-	"panic":   true,
-	"print":   true,
-	"println": true,
-	"real":    true,
-	"recover": true,
-}
-
-var predeclaredConstants = map[string]bool{
-	"false": true,
-	"iota":  true,
-	"nil":   true,
-	"true":  true,
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/synopsis.go b/third_party/gofrontend/libgo/go/go/doc/synopsis.go
deleted file mode 100644
index c90080b..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/synopsis.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package doc
-
-import (
-	"strings"
-	"unicode"
-)
-
-// firstSentenceLen returns the length of the first sentence in s.
-// The sentence ends after the first period followed by space and
-// not preceded by exactly one uppercase letter.
-//
-func firstSentenceLen(s string) int {
-	var ppp, pp, p rune
-	for i, q := range s {
-		if q == '\n' || q == '\r' || q == '\t' {
-			q = ' '
-		}
-		if q == ' ' && p == '.' && (!unicode.IsUpper(pp) || unicode.IsUpper(ppp)) {
-			return i
-		}
-		if p == '。' || p == '.' {
-			return i
-		}
-		ppp, pp, p = pp, p, q
-	}
-	return len(s)
-}
-
-const (
-	keepNL = 1 << iota
-)
-
-// clean replaces each sequence of space, \n, \r, or \t characters
-// with a single space and removes any trailing and leading spaces.
-// If the keepNL flag is set, newline characters are passed through
-// instead of being change to spaces.
-func clean(s string, flags int) string {
-	var b []byte
-	p := byte(' ')
-	for i := 0; i < len(s); i++ {
-		q := s[i]
-		if (flags&keepNL) == 0 && q == '\n' || q == '\r' || q == '\t' {
-			q = ' '
-		}
-		if q != ' ' || p != ' ' {
-			b = append(b, q)
-			p = q
-		}
-	}
-	// remove trailing blank, if any
-	if n := len(b); n > 0 && p == ' ' {
-		b = b[0 : n-1]
-	}
-	return string(b)
-}
-
-// Synopsis returns a cleaned version of the first sentence in s.
-// That sentence ends after the first period followed by space and
-// not preceded by exactly one uppercase letter. The result string
-// has no \n, \r, or \t characters and uses only single spaces between
-// words. If s starts with any of the IllegalPrefixes, the result
-// is the empty string.
-//
-func Synopsis(s string) string {
-	s = clean(s[0:firstSentenceLen(s)], 0)
-	for _, prefix := range IllegalPrefixes {
-		if strings.HasPrefix(strings.ToLower(s), prefix) {
-			return ""
-		}
-	}
-	return s
-}
-
-var IllegalPrefixes = []string{
-	"copyright",
-	"all rights",
-	"author",
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/synopsis_test.go b/third_party/gofrontend/libgo/go/go/doc/synopsis_test.go
deleted file mode 100644
index 59b253c..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/synopsis_test.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package doc
-
-import "testing"
-
-var tests = []struct {
-	txt string
-	fsl int
-	syn string
-}{
-	{"", 0, ""},
-	{"foo", 3, "foo"},
-	{"foo.", 4, "foo."},
-	{"foo.bar", 7, "foo.bar"},
-	{"  foo.  ", 6, "foo."},
-	{"  foo\t  bar.\n", 12, "foo bar."},
-	{"  foo\t  bar.\n", 12, "foo bar."},
-	{"a  b\n\nc\r\rd\t\t", 12, "a b c d"},
-	{"a  b\n\nc\r\rd\t\t  . BLA", 15, "a b c d ."},
-	{"Package poems by T.S.Eliot. To rhyme...", 27, "Package poems by T.S.Eliot."},
-	{"Package poems by T. S. Eliot. To rhyme...", 29, "Package poems by T. S. Eliot."},
-	{"foo implements the foo ABI. The foo ABI is...", 27, "foo implements the foo ABI."},
-	{"Package\nfoo. ..", 12, "Package foo."},
-	{"P . Q.", 3, "P ."},
-	{"P. Q.   ", 8, "P. Q."},
-	{"Package Καλημέρα κόσμε.", 36, "Package Καλημέρα κόσμε."},
-	{"Package こんにちは 世界\n", 31, "Package こんにちは 世界"},
-	{"Package こんにちは。世界", 26, "Package こんにちは。"},
-	{"Package 안녕.世界", 17, "Package 안녕."},
-	{"Package foo does bar.", 21, "Package foo does bar."},
-	{"Copyright 2012 Google, Inc. Package foo does bar.", 27, ""},
-	{"All Rights reserved. Package foo does bar.", 20, ""},
-	{"All rights reserved. Package foo does bar.", 20, ""},
-	{"Authors: foo@bar.com. Package foo does bar.", 21, ""},
-}
-
-func TestSynopsis(t *testing.T) {
-	for _, e := range tests {
-		fsl := firstSentenceLen(e.txt)
-		if fsl != e.fsl {
-			t.Errorf("got fsl = %d; want %d for %q\n", fsl, e.fsl, e.txt)
-		}
-		syn := Synopsis(e.txt)
-		if syn != e.syn {
-			t.Errorf("got syn = %q; want %q for %q\n", syn, e.syn, e.txt)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/a.0.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/a.0.golden
deleted file mode 100644
index 7e680b8..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/a.0.golden
+++ /dev/null
@@ -1,52 +0,0 @@
-// comment 0  comment 1 
-PACKAGE a
-
-IMPORTPATH
-	testdata/a
-
-FILENAMES
-	testdata/a0.go
-	testdata/a1.go
-
-BUGS .Bugs is now deprecated, please use .Notes instead
-	bug0
-
-	bug1
-
-
-BUGS
-BUG(uid)	bug0
-
-BUG(uid)	bug1
-
-
-NOTES
-NOTE(uid)	
-
-NOTE(foo)	1 of 4 - this is the first line of note 1
-	- note 1 continues on this 2nd line
-	- note 1 continues on this 3rd line
-
-NOTE(foo)	2 of 4
-
-NOTE(bar)	3 of 4
-
-NOTE(bar)	4 of 4
-	- this is the last line of note 4
-
-NOTE(bam)	This note which contains a (parenthesized) subphrase
-	 must appear in its entirety.
-
-NOTE(xxx)	The ':' after the marker and uid is optional.
-
-
-SECBUGS
-SECBUG(uid)	sec hole 0
-	need to fix asap
-
-
-TODOS
-TODO(uid)	todo0
-
-TODO(uid)	todo1
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/a.1.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/a.1.golden
deleted file mode 100644
index 7e680b8..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/a.1.golden
+++ /dev/null
@@ -1,52 +0,0 @@
-// comment 0  comment 1 
-PACKAGE a
-
-IMPORTPATH
-	testdata/a
-
-FILENAMES
-	testdata/a0.go
-	testdata/a1.go
-
-BUGS .Bugs is now deprecated, please use .Notes instead
-	bug0
-
-	bug1
-
-
-BUGS
-BUG(uid)	bug0
-
-BUG(uid)	bug1
-
-
-NOTES
-NOTE(uid)	
-
-NOTE(foo)	1 of 4 - this is the first line of note 1
-	- note 1 continues on this 2nd line
-	- note 1 continues on this 3rd line
-
-NOTE(foo)	2 of 4
-
-NOTE(bar)	3 of 4
-
-NOTE(bar)	4 of 4
-	- this is the last line of note 4
-
-NOTE(bam)	This note which contains a (parenthesized) subphrase
-	 must appear in its entirety.
-
-NOTE(xxx)	The ':' after the marker and uid is optional.
-
-
-SECBUGS
-SECBUG(uid)	sec hole 0
-	need to fix asap
-
-
-TODOS
-TODO(uid)	todo0
-
-TODO(uid)	todo1
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/a.2.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/a.2.golden
deleted file mode 100644
index 7e680b8..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/a.2.golden
+++ /dev/null
@@ -1,52 +0,0 @@
-// comment 0  comment 1 
-PACKAGE a
-
-IMPORTPATH
-	testdata/a
-
-FILENAMES
-	testdata/a0.go
-	testdata/a1.go
-
-BUGS .Bugs is now deprecated, please use .Notes instead
-	bug0
-
-	bug1
-
-
-BUGS
-BUG(uid)	bug0
-
-BUG(uid)	bug1
-
-
-NOTES
-NOTE(uid)	
-
-NOTE(foo)	1 of 4 - this is the first line of note 1
-	- note 1 continues on this 2nd line
-	- note 1 continues on this 3rd line
-
-NOTE(foo)	2 of 4
-
-NOTE(bar)	3 of 4
-
-NOTE(bar)	4 of 4
-	- this is the last line of note 4
-
-NOTE(bam)	This note which contains a (parenthesized) subphrase
-	 must appear in its entirety.
-
-NOTE(xxx)	The ':' after the marker and uid is optional.
-
-
-SECBUGS
-SECBUG(uid)	sec hole 0
-	need to fix asap
-
-
-TODOS
-TODO(uid)	todo0
-
-TODO(uid)	todo1
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/a0.go b/third_party/gofrontend/libgo/go/go/doc/testdata/a0.go
deleted file mode 100644
index 2420c8a..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/a0.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// comment 0
-package a
-
-//BUG(uid): bug0
-
-//TODO(uid): todo0
-
-// A note with some spaces after it, should be ignored (watch out for
-// emacs modes that remove trailing whitespace).
-//NOTE(uid):
-
-// SECBUG(uid): sec hole 0
-// need to fix asap
-
-// Multiple notes may be in the same comment group and should be
-// recognized individually. Notes may start in the middle of a
-// comment group as long as they start at the beginning of an
-// individual comment.
-//
-// NOTE(foo): 1 of 4 - this is the first line of note 1
-// - note 1 continues on this 2nd line
-// - note 1 continues on this 3rd line
-// NOTE(foo): 2 of 4
-// NOTE(bar): 3 of 4
-/* NOTE(bar): 4 of 4 */
-// - this is the last line of note 4
-//
-//
-
-// NOTE(bam): This note which contains a (parenthesized) subphrase
-//            must appear in its entirety.
-
-// NOTE(xxx) The ':' after the marker and uid is optional.
-
-// NOTE(): NO uid - should not show up.
-// NOTE()  NO uid - should not show up.
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/a1.go b/third_party/gofrontend/libgo/go/go/doc/testdata/a1.go
deleted file mode 100644
index 9fad1e0..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/a1.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// comment 1
-package a
-
-//BUG(uid): bug1
-
-//TODO(uid): todo1
-
-//TODO(): ignored
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/b.0.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/b.0.golden
deleted file mode 100644
index 9d93392..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/b.0.golden
+++ /dev/null
@@ -1,71 +0,0 @@
-// 
-PACKAGE b
-
-IMPORTPATH
-	testdata/b
-
-IMPORTS
-	a
-
-FILENAMES
-	testdata/b.go
-
-CONSTANTS
-	// 
-	const (
-		C1	notExported	= iota
-		C2
-	
-		C4
-		C5
-	)
-
-	// 
-	const C notExported = 0
-
-	// 
-	const Pi = 3.14	// Pi
-
-
-VARIABLES
-	// 
-	var (
-		U1, U2, U4, U5	notExported
-	
-		U7	notExported	= 7
-	)
-
-	// 
-	var MaxInt int	// MaxInt
-
-	// 
-	var V notExported
-
-	// 
-	var V1, V2, V4, V5 notExported
-
-
-FUNCTIONS
-	// 
-	func F(x int) int
-
-	// 
-	func F1() notExported
-
-	// Always under the package functions list. 
-	func NotAFactory() int
-
-	// Associated with uint type if AllDecls is set. 
-	func UintFactory() uint
-
-
-TYPES
-	// 
-	type T struct{}	// T
-
-	// 
-	var V T	// v
-
-	// 
-	func (x *T) M()
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/b.1.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/b.1.golden
deleted file mode 100644
index 66c47b5..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/b.1.golden
+++ /dev/null
@@ -1,83 +0,0 @@
-// 
-PACKAGE b
-
-IMPORTPATH
-	testdata/b
-
-IMPORTS
-	a
-
-FILENAMES
-	testdata/b.go
-
-CONSTANTS
-	// 
-	const Pi = 3.14	// Pi
-
-
-VARIABLES
-	// 
-	var MaxInt int	// MaxInt
-
-
-FUNCTIONS
-	// 
-	func F(x int) int
-
-	// Always under the package functions list. 
-	func NotAFactory() int
-
-
-TYPES
-	// 
-	type T struct{}	// T
-
-	// 
-	var V T	// v
-
-	// 
-	func (x *T) M()
-
-	// 
-	type notExported int
-
-	// 
-	const (
-		C1	notExported	= iota
-		C2
-		c3
-		C4
-		C5
-	)
-
-	// 
-	const C notExported = 0
-
-	// 
-	var (
-		U1, U2, u3, U4, U5	notExported
-		u6			notExported
-		U7			notExported	= 7
-	)
-
-	// 
-	var V notExported
-
-	// 
-	var V1, V2, v3, V4, V5 notExported
-
-	// 
-	func F1() notExported
-
-	// 
-	func f2() notExported
-
-	// Should only appear if AllDecls is set. 
-	type uint struct{}	// overrides a predeclared type uint
-
-	// Associated with uint type if AllDecls is set. 
-	func UintFactory() uint
-
-	// Associated with uint type if AllDecls is set. 
-	func uintFactory() uint
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/b.2.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/b.2.golden
deleted file mode 100644
index 9d93392..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/b.2.golden
+++ /dev/null
@@ -1,71 +0,0 @@
-// 
-PACKAGE b
-
-IMPORTPATH
-	testdata/b
-
-IMPORTS
-	a
-
-FILENAMES
-	testdata/b.go
-
-CONSTANTS
-	// 
-	const (
-		C1	notExported	= iota
-		C2
-	
-		C4
-		C5
-	)
-
-	// 
-	const C notExported = 0
-
-	// 
-	const Pi = 3.14	// Pi
-
-
-VARIABLES
-	// 
-	var (
-		U1, U2, U4, U5	notExported
-	
-		U7	notExported	= 7
-	)
-
-	// 
-	var MaxInt int	// MaxInt
-
-	// 
-	var V notExported
-
-	// 
-	var V1, V2, V4, V5 notExported
-
-
-FUNCTIONS
-	// 
-	func F(x int) int
-
-	// 
-	func F1() notExported
-
-	// Always under the package functions list. 
-	func NotAFactory() int
-
-	// Associated with uint type if AllDecls is set. 
-	func UintFactory() uint
-
-
-TYPES
-	// 
-	type T struct{}	// T
-
-	// 
-	var V T	// v
-
-	// 
-	func (x *T) M()
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/b.go b/third_party/gofrontend/libgo/go/go/doc/testdata/b.go
deleted file mode 100644
index e50663b..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/b.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package b
-
-import "a"
-
-// ----------------------------------------------------------------------------
-// Basic declarations
-
-const Pi = 3.14   // Pi
-var MaxInt int    // MaxInt
-type T struct{}   // T
-var V T           // v
-func F(x int) int {} // F
-func (x *T) M()   {} // M
-
-// Corner cases: association with (presumed) predeclared types
-
-// Always under the package functions list.
-func NotAFactory() int {}
-
-// Associated with uint type if AllDecls is set.
-func UintFactory() uint {}
-
-// Associated with uint type if AllDecls is set.
-func uintFactory() uint {}
-
-// Should only appear if AllDecls is set.
-type uint struct{} // overrides a predeclared type uint
-
-// ----------------------------------------------------------------------------
-// Exported declarations associated with non-exported types must always be shown.
-
-type notExported int
-
-const C notExported = 0
-
-const (
-	C1 notExported = iota
-	C2
-	c3
-	C4
-	C5
-)
-
-var V notExported
-var V1, V2, v3, V4, V5 notExported
-
-var (
-	U1, U2, u3, U4, U5 notExported
-	u6                 notExported
-	U7                 notExported = 7
-)
-
-func F1() notExported {}
-func f2() notExported {}
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/benchmark.go b/third_party/gofrontend/libgo/go/go/doc/testdata/benchmark.go
deleted file mode 100644
index 905e496..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/benchmark.go
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package testing
-
-import (
-	"flag"
-	"fmt"
-	"os"
-	"runtime"
-	"time"
-)
-
-var matchBenchmarks = flag.String("test.bench", "", "regular expression to select benchmarks to run")
-var benchTime = flag.Duration("test.benchtime", 1*time.Second, "approximate run time for each benchmark")
-
-// An internal type but exported because it is cross-package; part of the implementation
-// of go test.
-type InternalBenchmark struct {
-	Name string
-	F    func(b *B)
-}
-
-// B is a type passed to Benchmark functions to manage benchmark
-// timing and to specify the number of iterations to run.
-type B struct {
-	common
-	N         int
-	benchmark InternalBenchmark
-	bytes     int64
-	timerOn   bool
-	result    BenchmarkResult
-}
-
-// StartTimer starts timing a test.  This function is called automatically
-// before a benchmark starts, but it can also used to resume timing after
-// a call to StopTimer.
-func (b *B) StartTimer() {
-	if !b.timerOn {
-		b.start = time.Now()
-		b.timerOn = true
-	}
-}
-
-// StopTimer stops timing a test.  This can be used to pause the timer
-// while performing complex initialization that you don't
-// want to measure.
-func (b *B) StopTimer() {
-	if b.timerOn {
-		b.duration += time.Now().Sub(b.start)
-		b.timerOn = false
-	}
-}
-
-// ResetTimer sets the elapsed benchmark time to zero.
-// It does not affect whether the timer is running.
-func (b *B) ResetTimer() {
-	if b.timerOn {
-		b.start = time.Now()
-	}
-	b.duration = 0
-}
-
-// SetBytes records the number of bytes processed in a single operation.
-// If this is called, the benchmark will report ns/op and MB/s.
-func (b *B) SetBytes(n int64) { b.bytes = n }
-
-func (b *B) nsPerOp() int64 {
-	if b.N <= 0 {
-		return 0
-	}
-	return b.duration.Nanoseconds() / int64(b.N)
-}
-
-// runN runs a single benchmark for the specified number of iterations.
-func (b *B) runN(n int) {
-	// Try to get a comparable environment for each run
-	// by clearing garbage from previous runs.
-	runtime.GC()
-	b.N = n
-	b.ResetTimer()
-	b.StartTimer()
-	b.benchmark.F(b)
-	b.StopTimer()
-}
-
-func min(x, y int) int {
-	if x > y {
-		return y
-	}
-	return x
-}
-
-func max(x, y int) int {
-	if x < y {
-		return y
-	}
-	return x
-}
-
-// roundDown10 rounds a number down to the nearest power of 10.
-func roundDown10(n int) int {
-	var tens = 0
-	// tens = floor(log_10(n))
-	for n > 10 {
-		n = n / 10
-		tens++
-	}
-	// result = 10^tens
-	result := 1
-	for i := 0; i < tens; i++ {
-		result *= 10
-	}
-	return result
-}
-
-// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX].
-func roundUp(n int) int {
-	base := roundDown10(n)
-	if n < (2 * base) {
-		return 2 * base
-	}
-	if n < (5 * base) {
-		return 5 * base
-	}
-	return 10 * base
-}
-
-// run times the benchmark function in a separate goroutine.
-func (b *B) run() BenchmarkResult {
-	go b.launch()
-	<-b.signal
-	return b.result
-}
-
-// launch launches the benchmark function.  It gradually increases the number
-// of benchmark iterations until the benchmark runs for a second in order
-// to get a reasonable measurement.  It prints timing information in this form
-//		testing.BenchmarkHello	100000		19 ns/op
-// launch is run by the fun function as a separate goroutine.
-func (b *B) launch() {
-	// Run the benchmark for a single iteration in case it's expensive.
-	n := 1
-
-	// Signal that we're done whether we return normally
-	// or by FailNow's runtime.Goexit.
-	defer func() {
-		b.signal <- b
-	}()
-
-	b.runN(n)
-	// Run the benchmark for at least the specified amount of time.
-	d := *benchTime
-	for !b.failed && b.duration < d && n < 1e9 {
-		last := n
-		// Predict iterations/sec.
-		if b.nsPerOp() == 0 {
-			n = 1e9
-		} else {
-			n = int(d.Nanoseconds() / b.nsPerOp())
-		}
-		// Run more iterations than we think we'll need for a second (1.5x).
-		// Don't grow too fast in case we had timing errors previously.
-		// Be sure to run at least one more than last time.
-		n = max(min(n+n/2, 100*last), last+1)
-		// Round up to something easy to read.
-		n = roundUp(n)
-		b.runN(n)
-	}
-	b.result = BenchmarkResult{b.N, b.duration, b.bytes}
-}
-
-// The results of a benchmark run.
-type BenchmarkResult struct {
-	N     int           // The number of iterations.
-	T     time.Duration // The total time taken.
-	Bytes int64         // Bytes processed in one iteration.
-}
-
-func (r BenchmarkResult) NsPerOp() int64 {
-	if r.N <= 0 {
-		return 0
-	}
-	return r.T.Nanoseconds() / int64(r.N)
-}
-
-func (r BenchmarkResult) mbPerSec() float64 {
-	if r.Bytes <= 0 || r.T <= 0 || r.N <= 0 {
-		return 0
-	}
-	return (float64(r.Bytes) * float64(r.N) / 1e6) / r.T.Seconds()
-}
-
-func (r BenchmarkResult) String() string {
-	mbs := r.mbPerSec()
-	mb := ""
-	if mbs != 0 {
-		mb = fmt.Sprintf("\t%7.2f MB/s", mbs)
-	}
-	nsop := r.NsPerOp()
-	ns := fmt.Sprintf("%10d ns/op", nsop)
-	if r.N > 0 && nsop < 100 {
-		// The format specifiers here make sure that
-		// the ones digits line up for all three possible formats.
-		if nsop < 10 {
-			ns = fmt.Sprintf("%13.2f ns/op", float64(r.T.Nanoseconds())/float64(r.N))
-		} else {
-			ns = fmt.Sprintf("%12.1f ns/op", float64(r.T.Nanoseconds())/float64(r.N))
-		}
-	}
-	return fmt.Sprintf("%8d\t%s%s", r.N, ns, mb)
-}
-
-// An internal function but exported because it is cross-package; part of the implementation
-// of go test.
-func RunBenchmarks(matchString func(pat, str string) (bool, error), benchmarks []InternalBenchmark) {
-	// If no flag was specified, don't run benchmarks.
-	if len(*matchBenchmarks) == 0 {
-		return
-	}
-	for _, Benchmark := range benchmarks {
-		matched, err := matchString(*matchBenchmarks, Benchmark.Name)
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "testing: invalid regexp for -test.bench: %s\n", err)
-			os.Exit(1)
-		}
-		if !matched {
-			continue
-		}
-		for _, procs := range cpuList {
-			runtime.GOMAXPROCS(procs)
-			b := &B{
-				common: common{
-					signal: make(chan interface{}),
-				},
-				benchmark: Benchmark,
-			}
-			benchName := Benchmark.Name
-			if procs != 1 {
-				benchName = fmt.Sprintf("%s-%d", Benchmark.Name, procs)
-			}
-			fmt.Printf("%s\t", benchName)
-			r := b.run()
-			if b.failed {
-				// The output could be very long here, but probably isn't.
-				// We print it all, regardless, because we don't want to trim the reason
-				// the benchmark failed.
-				fmt.Printf("--- FAIL: %s\n%s", benchName, b.output)
-				continue
-			}
-			fmt.Printf("%v\n", r)
-			// Unlike with tests, we ignore the -chatty flag and always print output for
-			// benchmarks since the output generation time will skew the results.
-			if len(b.output) > 0 {
-				b.trimOutput()
-				fmt.Printf("--- BENCH: %s\n%s", benchName, b.output)
-			}
-			if p := runtime.GOMAXPROCS(-1); p != procs {
-				fmt.Fprintf(os.Stderr, "testing: %s left GOMAXPROCS set to %d\n", benchName, p)
-			}
-		}
-	}
-}
-
-// trimOutput shortens the output from a benchmark, which can be very long.
-func (b *B) trimOutput() {
-	// The output is likely to appear multiple times because the benchmark
-	// is run multiple times, but at least it will be seen. This is not a big deal
-	// because benchmarks rarely print, but just in case, we trim it if it's too long.
-	const maxNewlines = 10
-	for nlCount, j := 0, 0; j < len(b.output); j++ {
-		if b.output[j] == '\n' {
-			nlCount++
-			if nlCount >= maxNewlines {
-				b.output = append(b.output[:j], "\n\t... [output truncated]\n"...)
-				break
-			}
-		}
-	}
-}
-
-// Benchmark benchmarks a single function. Useful for creating
-// custom benchmarks that do not use go test.
-func Benchmark(f func(b *B)) BenchmarkResult {
-	b := &B{
-		common: common{
-			signal: make(chan interface{}),
-		},
-		benchmark: InternalBenchmark{"", f},
-	}
-	return b.run()
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/blank.0.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/blank.0.golden
deleted file mode 100644
index c2987cf..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/blank.0.golden
+++ /dev/null
@@ -1,55 +0,0 @@
-// Package blank is a go/doc test for the handling of _. See issue ...
-PACKAGE blank
-
-IMPORTPATH
-	testdata/blank
-
-IMPORTS
-	os
-
-FILENAMES
-	testdata/blank.go
-
-CONSTANTS
-	// T constants counting from unexported constants. 
-	const (
-		C1	T
-		C2
-	
-		C3
-	
-		C4	int
-	)
-
-	// Constants with an imported type that needs to be propagated. 
-	const (
-		Default		os.FileMode	= 0644
-		Useless				= 0312
-		WideOpen			= 0777
-	)
-
-	// Package constants. 
-	const (
-		I1	int
-		I2
-	)
-
-
-TYPES
-	// S has a padding field. 
-	type S struct {
-		H	uint32
-	
-		A	uint8
-		// contains filtered or unexported fields
-	}
-
-	// 
-	type T int
-
-	// T constants counting from a blank constant. 
-	const (
-		T1	T
-		T2
-	)
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/blank.1.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/blank.1.golden
deleted file mode 100644
index ee5054a..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/blank.1.golden
+++ /dev/null
@@ -1,75 +0,0 @@
-// Package blank is a go/doc test for the handling of _. See issue ...
-PACKAGE blank
-
-IMPORTPATH
-	testdata/blank
-
-IMPORTS
-	os
-
-FILENAMES
-	testdata/blank.go
-
-CONSTANTS
-	// T constants counting from unexported constants. 
-	const (
-		tweedledee	T	= iota
-		tweedledum
-		C1
-		C2
-		alice
-		C3
-		redQueen	int	= iota
-		C4
-	)
-
-	// Package constants. 
-	const (
-		_	int	= iota
-		I1
-		I2
-	)
-
-	// Constants with an imported type that needs to be propagated. 
-	const (
-		zero		os.FileMode	= 0
-		Default				= 0644
-		Useless				= 0312
-		WideOpen			= 0777
-	)
-
-	// Unexported constants counting from blank iota. See issue 9615. 
-	const (
-		_	= iota
-		one	= iota + 1
-	)
-
-
-VARIABLES
-	// 
-	var _ = T(55)
-
-
-FUNCTIONS
-	// 
-	func _()
-
-
-TYPES
-	// S has a padding field. 
-	type S struct {
-		H	uint32
-		_	uint8
-		A	uint8
-	}
-
-	// 
-	type T int
-
-	// T constants counting from a blank constant. 
-	const (
-		_	T	= iota
-		T1
-		T2
-	)
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/blank.2.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/blank.2.golden
deleted file mode 100644
index c2987cf..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/blank.2.golden
+++ /dev/null
@@ -1,55 +0,0 @@
-// Package blank is a go/doc test for the handling of _. See issue ...
-PACKAGE blank
-
-IMPORTPATH
-	testdata/blank
-
-IMPORTS
-	os
-
-FILENAMES
-	testdata/blank.go
-
-CONSTANTS
-	// T constants counting from unexported constants. 
-	const (
-		C1	T
-		C2
-	
-		C3
-	
-		C4	int
-	)
-
-	// Constants with an imported type that needs to be propagated. 
-	const (
-		Default		os.FileMode	= 0644
-		Useless				= 0312
-		WideOpen			= 0777
-	)
-
-	// Package constants. 
-	const (
-		I1	int
-		I2
-	)
-
-
-TYPES
-	// S has a padding field. 
-	type S struct {
-		H	uint32
-	
-		A	uint8
-		// contains filtered or unexported fields
-	}
-
-	// 
-	type T int
-
-	// T constants counting from a blank constant. 
-	const (
-		T1	T
-		T2
-	)
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/blank.go b/third_party/gofrontend/libgo/go/go/doc/testdata/blank.go
deleted file mode 100644
index 419a78f..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/blank.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package blank is a go/doc test for the handling of _.
-// See issue 5397.
-package blank
-
-import "os"
-
-type T int
-
-// T constants counting from a blank constant.
-const (
-	_ T = iota
-	T1
-	T2
-)
-
-// T constants counting from unexported constants.
-const (
-	tweedledee T = iota
-	tweedledum
-	C1
-	C2
-	alice
-	C3
-	redQueen int = iota
-	C4
-)
-
-// Constants with an imported type that needs to be propagated.
-const (
-	zero     os.FileMode = 0
-	Default              = 0644
-	Useless              = 0312
-	WideOpen             = 0777
-)
-
-// Package constants.
-const (
-	_ int = iota
-	I1
-	I2
-)
-
-// Unexported constants counting from blank iota.
-// See issue 9615.
-const (
-	_   = iota
-	one = iota + 1
-)
-
-// Blanks not in doc output:
-
-// S has a padding field.
-type S struct {
-	H uint32
-	_ uint8
-	A uint8
-}
-
-func _() {}
-
-type _ T
-
-var _ = T(55)
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/bugpara.0.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/bugpara.0.golden
deleted file mode 100644
index 5804859..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/bugpara.0.golden
+++ /dev/null
@@ -1,20 +0,0 @@
-// 
-PACKAGE bugpara
-
-IMPORTPATH
-	testdata/bugpara
-
-FILENAMES
-	testdata/bugpara.go
-
-BUGS .Bugs is now deprecated, please use .Notes instead
-	Sometimes bugs have multiple paragraphs.
-	
-	Like this one.
-
-
-BUGS
-BUG(rsc)	Sometimes bugs have multiple paragraphs.
-	
-	Like this one.
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/bugpara.1.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/bugpara.1.golden
deleted file mode 100644
index 5804859..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/bugpara.1.golden
+++ /dev/null
@@ -1,20 +0,0 @@
-// 
-PACKAGE bugpara
-
-IMPORTPATH
-	testdata/bugpara
-
-FILENAMES
-	testdata/bugpara.go
-
-BUGS .Bugs is now deprecated, please use .Notes instead
-	Sometimes bugs have multiple paragraphs.
-	
-	Like this one.
-
-
-BUGS
-BUG(rsc)	Sometimes bugs have multiple paragraphs.
-	
-	Like this one.
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/bugpara.2.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/bugpara.2.golden
deleted file mode 100644
index 5804859..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/bugpara.2.golden
+++ /dev/null
@@ -1,20 +0,0 @@
-// 
-PACKAGE bugpara
-
-IMPORTPATH
-	testdata/bugpara
-
-FILENAMES
-	testdata/bugpara.go
-
-BUGS .Bugs is now deprecated, please use .Notes instead
-	Sometimes bugs have multiple paragraphs.
-	
-	Like this one.
-
-
-BUGS
-BUG(rsc)	Sometimes bugs have multiple paragraphs.
-	
-	Like this one.
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/bugpara.go b/third_party/gofrontend/libgo/go/go/doc/testdata/bugpara.go
deleted file mode 100644
index f5345a7..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/bugpara.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package bugpara
-
-// BUG(rsc): Sometimes bugs have multiple paragraphs.
-//
-// Like this one.
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/c.0.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/c.0.golden
deleted file mode 100644
index e21959b..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/c.0.golden
+++ /dev/null
@@ -1,48 +0,0 @@
-// 
-PACKAGE c
-
-IMPORTPATH
-	testdata/c
-
-IMPORTS
-	a
-
-FILENAMES
-	testdata/c.go
-
-TYPES
-	// A (should see this) 
-	type A struct{}
-
-	// B (should see this) 
-	type B struct{}
-
-	// C (should see this) 
-	type C struct{}
-
-	// D (should see this) 
-	type D struct{}
-
-	// E1 (should see this) 
-	type E1 struct{}
-
-	// E (should see this for E2 and E3) 
-	type E2 struct{}
-
-	// E (should see this for E2 and E3) 
-	type E3 struct{}
-
-	// E4 (should see this) 
-	type E4 struct{}
-
-	// 
-	type T1 struct{}
-
-	// 
-	func (t1 *T1) M()
-
-	// T2 must not show methods of local T1 
-	type T2 struct {
-		a.T1	// not the same as locally declared T1
-	}
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/c.1.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/c.1.golden
deleted file mode 100644
index e21959b..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/c.1.golden
+++ /dev/null
@@ -1,48 +0,0 @@
-// 
-PACKAGE c
-
-IMPORTPATH
-	testdata/c
-
-IMPORTS
-	a
-
-FILENAMES
-	testdata/c.go
-
-TYPES
-	// A (should see this) 
-	type A struct{}
-
-	// B (should see this) 
-	type B struct{}
-
-	// C (should see this) 
-	type C struct{}
-
-	// D (should see this) 
-	type D struct{}
-
-	// E1 (should see this) 
-	type E1 struct{}
-
-	// E (should see this for E2 and E3) 
-	type E2 struct{}
-
-	// E (should see this for E2 and E3) 
-	type E3 struct{}
-
-	// E4 (should see this) 
-	type E4 struct{}
-
-	// 
-	type T1 struct{}
-
-	// 
-	func (t1 *T1) M()
-
-	// T2 must not show methods of local T1 
-	type T2 struct {
-		a.T1	// not the same as locally declared T1
-	}
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/c.2.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/c.2.golden
deleted file mode 100644
index e21959b..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/c.2.golden
+++ /dev/null
@@ -1,48 +0,0 @@
-// 
-PACKAGE c
-
-IMPORTPATH
-	testdata/c
-
-IMPORTS
-	a
-
-FILENAMES
-	testdata/c.go
-
-TYPES
-	// A (should see this) 
-	type A struct{}
-
-	// B (should see this) 
-	type B struct{}
-
-	// C (should see this) 
-	type C struct{}
-
-	// D (should see this) 
-	type D struct{}
-
-	// E1 (should see this) 
-	type E1 struct{}
-
-	// E (should see this for E2 and E3) 
-	type E2 struct{}
-
-	// E (should see this for E2 and E3) 
-	type E3 struct{}
-
-	// E4 (should see this) 
-	type E4 struct{}
-
-	// 
-	type T1 struct{}
-
-	// 
-	func (t1 *T1) M()
-
-	// T2 must not show methods of local T1 
-	type T2 struct {
-		a.T1	// not the same as locally declared T1
-	}
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/c.go b/third_party/gofrontend/libgo/go/go/doc/testdata/c.go
deleted file mode 100644
index e0f3919..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/c.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package c
-
-import "a"
-
-// ----------------------------------------------------------------------------
-// Test that empty declarations don't cause problems
-
-const ()
-
-type ()
-
-var ()
-
-// ----------------------------------------------------------------------------
-// Test that types with documentation on both, the Decl and the Spec node
-// are handled correctly.
-
-// A (should see this)
-type A struct{}
-
-// B (should see this)
-type (
-	B struct{}
-)
-
-type (
-	// C (should see this)
-	C struct{}
-)
-
-// D (should not see this)
-type (
-	// D (should see this)
-	D struct{}
-)
-
-// E (should see this for E2 and E3)
-type (
-	// E1 (should see this)
-	E1 struct{}
-	E2 struct{}
-	E3 struct{}
-	// E4 (should see this)
-	E4 struct{}
-)
-
-// ----------------------------------------------------------------------------
-// Test that local and imported types are different when
-// handling anonymous fields.
-
-type T1 struct{}
-
-func (t1 *T1) M() {}
-
-// T2 must not show methods of local T1
-type T2 struct {
-	a.T1 // not the same as locally declared T1
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/d.0.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/d.0.golden
deleted file mode 100644
index c005199..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/d.0.golden
+++ /dev/null
@@ -1,104 +0,0 @@
-// 
-PACKAGE d
-
-IMPORTPATH
-	testdata/d
-
-FILENAMES
-	testdata/d1.go
-	testdata/d2.go
-
-CONSTANTS
-	// CBx constants should appear before CAx constants. 
-	const (
-		CB2	= iota	// before CB1
-		CB1		// before CB0
-		CB0		// at end
-	)
-
-	// CAx constants should appear after CBx constants. 
-	const (
-		CA2	= iota	// before CA1
-		CA1		// before CA0
-		CA0		// at end
-	)
-
-	// C0 should be first. 
-	const C0 = 0
-
-	// C1 should be second. 
-	const C1 = 1
-
-	// C2 should be third. 
-	const C2 = 2
-
-	// 
-	const (
-		// Single const declarations inside ()'s are considered ungrouped
-		// and show up in sorted order.
-		Cungrouped = 0
-	)
-
-
-VARIABLES
-	// VBx variables should appear before VAx variables. 
-	var (
-		VB2	int	// before VB1
-		VB1	int	// before VB0
-		VB0	int	// at end
-	)
-
-	// VAx variables should appear after VBx variables. 
-	var (
-		VA2	int	// before VA1
-		VA1	int	// before VA0
-		VA0	int	// at end
-	)
-
-	// V0 should be first. 
-	var V0 uintptr
-
-	// V1 should be second. 
-	var V1 uint
-
-	// V2 should be third. 
-	var V2 int
-
-	// 
-	var (
-		// Single var declarations inside ()'s are considered ungrouped
-		// and show up in sorted order.
-		Vungrouped = 0
-	)
-
-
-FUNCTIONS
-	// F0 should be first. 
-	func F0()
-
-	// F1 should be second. 
-	func F1()
-
-	// F2 should be third. 
-	func F2()
-
-
-TYPES
-	// T0 should be first. 
-	type T0 struct{}
-
-	// T1 should be second. 
-	type T1 struct{}
-
-	// T2 should be third. 
-	type T2 struct{}
-
-	// TG0 should be first. 
-	type TG0 struct{}
-
-	// TG1 should be second. 
-	type TG1 struct{}
-
-	// TG2 should be third. 
-	type TG2 struct{}
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/d.1.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/d.1.golden
deleted file mode 100644
index c005199..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/d.1.golden
+++ /dev/null
@@ -1,104 +0,0 @@
-// 
-PACKAGE d
-
-IMPORTPATH
-	testdata/d
-
-FILENAMES
-	testdata/d1.go
-	testdata/d2.go
-
-CONSTANTS
-	// CBx constants should appear before CAx constants. 
-	const (
-		CB2	= iota	// before CB1
-		CB1		// before CB0
-		CB0		// at end
-	)
-
-	// CAx constants should appear after CBx constants. 
-	const (
-		CA2	= iota	// before CA1
-		CA1		// before CA0
-		CA0		// at end
-	)
-
-	// C0 should be first. 
-	const C0 = 0
-
-	// C1 should be second. 
-	const C1 = 1
-
-	// C2 should be third. 
-	const C2 = 2
-
-	// 
-	const (
-		// Single const declarations inside ()'s are considered ungrouped
-		// and show up in sorted order.
-		Cungrouped = 0
-	)
-
-
-VARIABLES
-	// VBx variables should appear before VAx variables. 
-	var (
-		VB2	int	// before VB1
-		VB1	int	// before VB0
-		VB0	int	// at end
-	)
-
-	// VAx variables should appear after VBx variables. 
-	var (
-		VA2	int	// before VA1
-		VA1	int	// before VA0
-		VA0	int	// at end
-	)
-
-	// V0 should be first. 
-	var V0 uintptr
-
-	// V1 should be second. 
-	var V1 uint
-
-	// V2 should be third. 
-	var V2 int
-
-	// 
-	var (
-		// Single var declarations inside ()'s are considered ungrouped
-		// and show up in sorted order.
-		Vungrouped = 0
-	)
-
-
-FUNCTIONS
-	// F0 should be first. 
-	func F0()
-
-	// F1 should be second. 
-	func F1()
-
-	// F2 should be third. 
-	func F2()
-
-
-TYPES
-	// T0 should be first. 
-	type T0 struct{}
-
-	// T1 should be second. 
-	type T1 struct{}
-
-	// T2 should be third. 
-	type T2 struct{}
-
-	// TG0 should be first. 
-	type TG0 struct{}
-
-	// TG1 should be second. 
-	type TG1 struct{}
-
-	// TG2 should be third. 
-	type TG2 struct{}
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/d.2.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/d.2.golden
deleted file mode 100644
index c005199..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/d.2.golden
+++ /dev/null
@@ -1,104 +0,0 @@
-// 
-PACKAGE d
-
-IMPORTPATH
-	testdata/d
-
-FILENAMES
-	testdata/d1.go
-	testdata/d2.go
-
-CONSTANTS
-	// CBx constants should appear before CAx constants. 
-	const (
-		CB2	= iota	// before CB1
-		CB1		// before CB0
-		CB0		// at end
-	)
-
-	// CAx constants should appear after CBx constants. 
-	const (
-		CA2	= iota	// before CA1
-		CA1		// before CA0
-		CA0		// at end
-	)
-
-	// C0 should be first. 
-	const C0 = 0
-
-	// C1 should be second. 
-	const C1 = 1
-
-	// C2 should be third. 
-	const C2 = 2
-
-	// 
-	const (
-		// Single const declarations inside ()'s are considered ungrouped
-		// and show up in sorted order.
-		Cungrouped = 0
-	)
-
-
-VARIABLES
-	// VBx variables should appear before VAx variables. 
-	var (
-		VB2	int	// before VB1
-		VB1	int	// before VB0
-		VB0	int	// at end
-	)
-
-	// VAx variables should appear after VBx variables. 
-	var (
-		VA2	int	// before VA1
-		VA1	int	// before VA0
-		VA0	int	// at end
-	)
-
-	// V0 should be first. 
-	var V0 uintptr
-
-	// V1 should be second. 
-	var V1 uint
-
-	// V2 should be third. 
-	var V2 int
-
-	// 
-	var (
-		// Single var declarations inside ()'s are considered ungrouped
-		// and show up in sorted order.
-		Vungrouped = 0
-	)
-
-
-FUNCTIONS
-	// F0 should be first. 
-	func F0()
-
-	// F1 should be second. 
-	func F1()
-
-	// F2 should be third. 
-	func F2()
-
-
-TYPES
-	// T0 should be first. 
-	type T0 struct{}
-
-	// T1 should be second. 
-	type T1 struct{}
-
-	// T2 should be third. 
-	type T2 struct{}
-
-	// TG0 should be first. 
-	type TG0 struct{}
-
-	// TG1 should be second. 
-	type TG1 struct{}
-
-	// TG2 should be third. 
-	type TG2 struct{}
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/d1.go b/third_party/gofrontend/libgo/go/go/doc/testdata/d1.go
deleted file mode 100644
index ebd6941..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/d1.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test cases for sort order of declarations.
-
-package d
-
-// C2 should be third.
-const C2 = 2
-
-// V2 should be third.
-var V2 int
-
-// CBx constants should appear before CAx constants.
-const (
-	CB2 = iota // before CB1
-	CB1        // before CB0
-	CB0        // at end
-)
-
-// VBx variables should appear before VAx variables.
-var (
-	VB2 int // before VB1
-	VB1 int // before VB0
-	VB0 int // at end
-)
-
-const (
-	// Single const declarations inside ()'s are considered ungrouped
-	// and show up in sorted order.
-	Cungrouped = 0
-)
-
-var (
-	// Single var declarations inside ()'s are considered ungrouped
-	// and show up in sorted order.
-	Vungrouped = 0
-)
-
-// T2 should be third.
-type T2 struct{}
-
-// Grouped types are sorted nevertheless.
-type (
-	// TG2 should be third.
-	TG2 struct{}
-
-	// TG1 should be second.
-	TG1 struct{}
-
-	// TG0 should be first.
-	TG0 struct{}
-)
-
-// F2 should be third.
-func F2() {}
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/d2.go b/third_party/gofrontend/libgo/go/go/doc/testdata/d2.go
deleted file mode 100644
index 2f56f4f..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/d2.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test cases for sort order of declarations.
-
-package d
-
-// C1 should be second.
-const C1 = 1
-
-// C0 should be first.
-const C0 = 0
-
-// V1 should be second.
-var V1 uint
-
-// V0 should be first.
-var V0 uintptr
-
-// CAx constants should appear after CBx constants.
-const (
-	CA2 = iota // before CA1
-	CA1        // before CA0
-	CA0        // at end
-)
-
-// VAx variables should appear after VBx variables.
-var (
-	VA2 int // before VA1
-	VA1 int // before VA0
-	VA0 int // at end
-)
-
-// T1 should be second.
-type T1 struct{}
-
-// T0 should be first.
-type T0 struct{}
-
-// F1 should be second.
-func F1() {}
-
-// F0 should be first.
-func F0() {}
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/e.0.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/e.0.golden
deleted file mode 100644
index 6987e58..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/e.0.golden
+++ /dev/null
@@ -1,109 +0,0 @@
-// The package e is a go/doc test for embedded methods. 
-PACKAGE e
-
-IMPORTPATH
-	testdata/e
-
-FILENAMES
-	testdata/e.go
-
-TYPES
-	// T1 has no embedded (level 1) M method due to conflict. 
-	type T1 struct {
-		// contains filtered or unexported fields
-	}
-
-	// T2 has only M as top-level method. 
-	type T2 struct {
-		// contains filtered or unexported fields
-	}
-
-	// T2.M should appear as method of T2. 
-	func (T2) M()
-
-	// T3 has only M as top-level method. 
-	type T3 struct {
-		// contains filtered or unexported fields
-	}
-
-	// T3.M should appear as method of T3. 
-	func (T3) M()
-
-	// 
-	type T4 struct{}
-
-	// T4.M should appear as method of T5 only if AllMethods is set. 
-	func (*T4) M()
-
-	// 
-	type T5 struct {
-		T4
-	}
-
-	// 
-	type U1 struct {
-		*U1
-	}
-
-	// U1.M should appear as method of U1. 
-	func (*U1) M()
-
-	// 
-	type U2 struct {
-		*U3
-	}
-
-	// U2.M should appear as method of U2 and as method of U3 only if ...
-	func (*U2) M()
-
-	// 
-	type U3 struct {
-		*U2
-	}
-
-	// U3.N should appear as method of U3 and as method of U2 only if ...
-	func (*U3) N()
-
-	// 
-	type U4 struct {
-		// contains filtered or unexported fields
-	}
-
-	// U4.M should appear as method of U4. 
-	func (*U4) M()
-
-	// 
-	type V1 struct {
-		*V2
-		*V5
-	}
-
-	// 
-	type V2 struct {
-		*V3
-	}
-
-	// 
-	type V3 struct {
-		*V4
-	}
-
-	// 
-	type V4 struct {
-		*V5
-	}
-
-	// V4.M should appear as method of V2 and V3 if AllMethods is set. 
-	func (*V4) M()
-
-	// 
-	type V5 struct {
-		*V6
-	}
-
-	// 
-	type V6 struct{}
-
-	// V6.M should appear as method of V1 and V5 if AllMethods is set. 
-	func (*V6) M()
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/e.1.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/e.1.golden
deleted file mode 100644
index cbe22e0..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/e.1.golden
+++ /dev/null
@@ -1,144 +0,0 @@
-// The package e is a go/doc test for embedded methods. 
-PACKAGE e
-
-IMPORTPATH
-	testdata/e
-
-FILENAMES
-	testdata/e.go
-
-TYPES
-	// T1 has no embedded (level 1) M method due to conflict. 
-	type T1 struct {
-		t1
-		t2
-	}
-
-	// T2 has only M as top-level method. 
-	type T2 struct {
-		t1
-	}
-
-	// T2.M should appear as method of T2. 
-	func (T2) M()
-
-	// T3 has only M as top-level method. 
-	type T3 struct {
-		t1e
-		t2e
-	}
-
-	// T3.M should appear as method of T3. 
-	func (T3) M()
-
-	// 
-	type T4 struct{}
-
-	// T4.M should appear as method of T5 only if AllMethods is set. 
-	func (*T4) M()
-
-	// 
-	type T5 struct {
-		T4
-	}
-
-	// 
-	type U1 struct {
-		*U1
-	}
-
-	// U1.M should appear as method of U1. 
-	func (*U1) M()
-
-	// 
-	type U2 struct {
-		*U3
-	}
-
-	// U2.M should appear as method of U2 and as method of U3 only if ...
-	func (*U2) M()
-
-	// 
-	type U3 struct {
-		*U2
-	}
-
-	// U3.N should appear as method of U3 and as method of U2 only if ...
-	func (*U3) N()
-
-	// 
-	type U4 struct {
-		*u5
-	}
-
-	// U4.M should appear as method of U4. 
-	func (*U4) M()
-
-	// 
-	type V1 struct {
-		*V2
-		*V5
-	}
-
-	// 
-	type V2 struct {
-		*V3
-	}
-
-	// 
-	type V3 struct {
-		*V4
-	}
-
-	// 
-	type V4 struct {
-		*V5
-	}
-
-	// V4.M should appear as method of V2 and V3 if AllMethods is set. 
-	func (*V4) M()
-
-	// 
-	type V5 struct {
-		*V6
-	}
-
-	// 
-	type V6 struct{}
-
-	// V6.M should appear as method of V1 and V5 if AllMethods is set. 
-	func (*V6) M()
-
-	// 
-	type t1 struct{}
-
-	// t1.M should not appear as method in a Tx type. 
-	func (t1) M()
-
-	// 
-	type t1e struct {
-		t1
-	}
-
-	// t1.M should not appear as method in a Tx type. 
-	func (t1e) M()
-
-	// 
-	type t2 struct{}
-
-	// t2.M should not appear as method in a Tx type. 
-	func (t2) M()
-
-	// 
-	type t2e struct {
-		t2
-	}
-
-	// t2.M should not appear as method in a Tx type. 
-	func (t2e) M()
-
-	// 
-	type u5 struct {
-		*U4
-	}
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/e.2.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/e.2.golden
deleted file mode 100644
index e7b05e8..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/e.2.golden
+++ /dev/null
@@ -1,130 +0,0 @@
-// The package e is a go/doc test for embedded methods. 
-PACKAGE e
-
-IMPORTPATH
-	testdata/e
-
-FILENAMES
-	testdata/e.go
-
-TYPES
-	// T1 has no embedded (level 1) M method due to conflict. 
-	type T1 struct {
-		// contains filtered or unexported fields
-	}
-
-	// T2 has only M as top-level method. 
-	type T2 struct {
-		// contains filtered or unexported fields
-	}
-
-	// T2.M should appear as method of T2. 
-	func (T2) M()
-
-	// T3 has only M as top-level method. 
-	type T3 struct {
-		// contains filtered or unexported fields
-	}
-
-	// T3.M should appear as method of T3. 
-	func (T3) M()
-
-	// 
-	type T4 struct{}
-
-	// T4.M should appear as method of T5 only if AllMethods is set. 
-	func (*T4) M()
-
-	// 
-	type T5 struct {
-		T4
-	}
-
-	// T4.M should appear as method of T5 only if AllMethods is set. 
-	func (*T5) M()
-
-	// 
-	type U1 struct {
-		*U1
-	}
-
-	// U1.M should appear as method of U1. 
-	func (*U1) M()
-
-	// 
-	type U2 struct {
-		*U3
-	}
-
-	// U2.M should appear as method of U2 and as method of U3 only if ...
-	func (*U2) M()
-
-	// U3.N should appear as method of U3 and as method of U2 only if ...
-	func (U2) N()
-
-	// 
-	type U3 struct {
-		*U2
-	}
-
-	// U2.M should appear as method of U2 and as method of U3 only if ...
-	func (U3) M()
-
-	// U3.N should appear as method of U3 and as method of U2 only if ...
-	func (*U3) N()
-
-	// 
-	type U4 struct {
-		// contains filtered or unexported fields
-	}
-
-	// U4.M should appear as method of U4. 
-	func (*U4) M()
-
-	// 
-	type V1 struct {
-		*V2
-		*V5
-	}
-
-	// V6.M should appear as method of V1 and V5 if AllMethods is set. 
-	func (V1) M()
-
-	// 
-	type V2 struct {
-		*V3
-	}
-
-	// V4.M should appear as method of V2 and V3 if AllMethods is set. 
-	func (V2) M()
-
-	// 
-	type V3 struct {
-		*V4
-	}
-
-	// V4.M should appear as method of V2 and V3 if AllMethods is set. 
-	func (V3) M()
-
-	// 
-	type V4 struct {
-		*V5
-	}
-
-	// V4.M should appear as method of V2 and V3 if AllMethods is set. 
-	func (*V4) M()
-
-	// 
-	type V5 struct {
-		*V6
-	}
-
-	// V6.M should appear as method of V1 and V5 if AllMethods is set. 
-	func (V5) M()
-
-	// 
-	type V6 struct{}
-
-	// V6.M should appear as method of V1 and V5 if AllMethods is set. 
-	func (*V6) M()
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/e.go b/third_party/gofrontend/libgo/go/go/doc/testdata/e.go
deleted file mode 100644
index ec432e3..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/e.go
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The package e is a go/doc test for embedded methods.
-package e
-
-// ----------------------------------------------------------------------------
-// Conflicting methods M must not show up.
-
-type t1 struct{}
-
-// t1.M should not appear as method in a Tx type.
-func (t1) M() {}
-
-type t2 struct{}
-
-// t2.M should not appear as method in a Tx type.
-func (t2) M() {}
-
-// T1 has no embedded (level 1) M method due to conflict.
-type T1 struct {
-	t1
-	t2
-}
-
-// ----------------------------------------------------------------------------
-// Higher-level method M wins over lower-level method M.
-
-// T2 has only M as top-level method.
-type T2 struct {
-	t1
-}
-
-// T2.M should appear as method of T2.
-func (T2) M() {}
-
-// ----------------------------------------------------------------------------
-// Higher-level method M wins over lower-level conflicting methods M.
-
-type t1e struct {
-	t1
-}
-
-type t2e struct {
-	t2
-}
-
-// T3 has only M as top-level method.
-type T3 struct {
-	t1e
-	t2e
-}
-
-// T3.M should appear as method of T3.
-func (T3) M() {}
-
-// ----------------------------------------------------------------------------
-// Don't show conflicting methods M embedded via an exported and non-exported
-// type.
-
-// T1 has no embedded (level 1) M method due to conflict.
-type T4 struct {
-	t2
-	T2
-}
-
-// ----------------------------------------------------------------------------
-// Don't show embedded methods of exported anonymous fields unless AllMethods
-// is set.
-
-type T4 struct{}
-
-// T4.M should appear as method of T5 only if AllMethods is set.
-func (*T4) M() {}
-
-type T5 struct {
-	T4
-}
-
-// ----------------------------------------------------------------------------
-// Recursive type declarations must not lead to endless recursion.
-
-type U1 struct {
-	*U1
-}
-
-// U1.M should appear as method of U1.
-func (*U1) M() {}
-
-type U2 struct {
-	*U3
-}
-
-// U2.M should appear as method of U2 and as method of U3 only if AllMethods is set.
-func (*U2) M() {}
-
-type U3 struct {
-	*U2
-}
-
-// U3.N should appear as method of U3 and as method of U2 only if AllMethods is set.
-func (*U3) N() {}
-
-type U4 struct {
-	*u5
-}
-
-// U4.M should appear as method of U4.
-func (*U4) M() {}
-
-type u5 struct {
-	*U4
-}
-
-// ----------------------------------------------------------------------------
-// A higher-level embedded type (and its methods) wins over the same type (and
-// its methods) embedded at a lower level.
-
-type V1 struct {
-	*V2
-	*V5
-}
-
-type V2 struct {
-	*V3
-}
-
-type V3 struct {
-	*V4
-}
-
-type V4 struct {
-	*V5
-}
-
-type V5 struct {
-	*V6
-}
-
-type V6 struct{}
-
-// V4.M should appear as method of V2 and V3 if AllMethods is set.
-func (*V4) M() {}
-
-// V6.M should appear as method of V1 and V5 if AllMethods is set.
-func (*V6) M() {}
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/error1.0.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/error1.0.golden
deleted file mode 100644
index 6c6fe5d..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/error1.0.golden
+++ /dev/null
@@ -1,30 +0,0 @@
-// 
-PACKAGE error1
-
-IMPORTPATH
-	testdata/error1
-
-FILENAMES
-	testdata/error1.go
-
-TYPES
-	// 
-	type I0 interface {
-		// When embedded, the predeclared error interface
-		// must remain visible in interface types.
-		error
-	}
-
-	// 
-	type S0 struct {
-		// contains filtered or unexported fields
-	}
-
-	// 
-	type T0 struct {
-		ExportedField interface {
-			// error should be visible
-			error
-		}
-	}
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/error1.1.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/error1.1.golden
deleted file mode 100644
index a8dc2e7..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/error1.1.golden
+++ /dev/null
@@ -1,32 +0,0 @@
-// 
-PACKAGE error1
-
-IMPORTPATH
-	testdata/error1
-
-FILENAMES
-	testdata/error1.go
-
-TYPES
-	// 
-	type I0 interface {
-		// When embedded, the predeclared error interface
-		// must remain visible in interface types.
-		error
-	}
-
-	// 
-	type S0 struct {
-		// In struct types, an embedded error must only be visible
-		// if AllDecls is set.
-		error
-	}
-
-	// 
-	type T0 struct {
-		ExportedField interface {
-			// error should be visible
-			error
-		}
-	}
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/error1.2.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/error1.2.golden
deleted file mode 100644
index 6c6fe5d..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/error1.2.golden
+++ /dev/null
@@ -1,30 +0,0 @@
-// 
-PACKAGE error1
-
-IMPORTPATH
-	testdata/error1
-
-FILENAMES
-	testdata/error1.go
-
-TYPES
-	// 
-	type I0 interface {
-		// When embedded, the predeclared error interface
-		// must remain visible in interface types.
-		error
-	}
-
-	// 
-	type S0 struct {
-		// contains filtered or unexported fields
-	}
-
-	// 
-	type T0 struct {
-		ExportedField interface {
-			// error should be visible
-			error
-		}
-	}
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/error1.go b/third_party/gofrontend/libgo/go/go/doc/testdata/error1.go
deleted file mode 100644
index 3c777a7..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/error1.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package error1
-
-type I0 interface {
-	// When embedded, the predeclared error interface
-	// must remain visible in interface types.
-	error
-}
-
-type T0 struct {
-	ExportedField interface {
-		// error should be visible
-		error
-	}
-}
-
-type S0 struct {
-	// In struct types, an embedded error must only be visible
-	// if AllDecls is set.
-	error
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/error2.0.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/error2.0.golden
deleted file mode 100644
index dedfe41..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/error2.0.golden
+++ /dev/null
@@ -1,27 +0,0 @@
-// 
-PACKAGE error2
-
-IMPORTPATH
-	testdata/error2
-
-FILENAMES
-	testdata/error2.go
-
-TYPES
-	// 
-	type I0 interface {
-		// contains filtered or unexported methods
-	}
-
-	// 
-	type S0 struct {
-		// contains filtered or unexported fields
-	}
-
-	// 
-	type T0 struct {
-		ExportedField interface {
-			// contains filtered or unexported methods
-		}
-	}
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/error2.1.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/error2.1.golden
deleted file mode 100644
index dbcc1b0..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/error2.1.golden
+++ /dev/null
@@ -1,37 +0,0 @@
-// 
-PACKAGE error2
-
-IMPORTPATH
-	testdata/error2
-
-FILENAMES
-	testdata/error2.go
-
-TYPES
-	// 
-	type I0 interface {
-		// When embedded, the locally-declared error interface
-		// is only visible if all declarations are shown.
-		error
-	}
-
-	// 
-	type S0 struct {
-		// In struct types, an embedded error must only be visible
-		// if AllDecls is set.
-		error
-	}
-
-	// 
-	type T0 struct {
-		ExportedField interface {
-			// error should not be visible
-			error
-		}
-	}
-
-	// This error declaration shadows the predeclared error type. 
-	type error interface {
-		Error() string
-	}
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/error2.2.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/error2.2.golden
deleted file mode 100644
index dedfe41..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/error2.2.golden
+++ /dev/null
@@ -1,27 +0,0 @@
-// 
-PACKAGE error2
-
-IMPORTPATH
-	testdata/error2
-
-FILENAMES
-	testdata/error2.go
-
-TYPES
-	// 
-	type I0 interface {
-		// contains filtered or unexported methods
-	}
-
-	// 
-	type S0 struct {
-		// contains filtered or unexported fields
-	}
-
-	// 
-	type T0 struct {
-		ExportedField interface {
-			// contains filtered or unexported methods
-		}
-	}
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/error2.go b/third_party/gofrontend/libgo/go/go/doc/testdata/error2.go
deleted file mode 100644
index 6ee96c2..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/error2.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package error2
-
-type I0 interface {
-	// When embedded, the locally-declared error interface
-	// is only visible if all declarations are shown.
-	error
-}
-
-type T0 struct {
-	ExportedField interface {
-		// error should not be visible
-		error
-	}
-}
-
-type S0 struct {
-	// In struct types, an embedded error must only be visible
-	// if AllDecls is set.
-	error
-}
-
-// This error declaration shadows the predeclared error type.
-type error interface {
-	Error() string
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/example.go b/third_party/gofrontend/libgo/go/go/doc/testdata/example.go
deleted file mode 100644
index fdeda13..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/example.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package testing
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"os"
-	"strings"
-	"time"
-)
-
-type InternalExample struct {
-	Name   string
-	F      func()
-	Output string
-}
-
-func RunExamples(examples []InternalExample) (ok bool) {
-	ok = true
-
-	var eg InternalExample
-
-	stdout, stderr := os.Stdout, os.Stderr
-	defer func() {
-		os.Stdout, os.Stderr = stdout, stderr
-		if e := recover(); e != nil {
-			fmt.Printf("--- FAIL: %s\npanic: %v\n", eg.Name, e)
-			os.Exit(1)
-		}
-	}()
-
-	for _, eg = range examples {
-		if *chatty {
-			fmt.Printf("=== RUN: %s\n", eg.Name)
-		}
-
-		// capture stdout and stderr
-		r, w, err := os.Pipe()
-		if err != nil {
-			fmt.Fprintln(os.Stderr, err)
-			os.Exit(1)
-		}
-		os.Stdout, os.Stderr = w, w
-		outC := make(chan string)
-		go func() {
-			buf := new(bytes.Buffer)
-			_, err := io.Copy(buf, r)
-			if err != nil {
-				fmt.Fprintf(stderr, "testing: copying pipe: %v\n", err)
-				os.Exit(1)
-			}
-			outC <- buf.String()
-		}()
-
-		// run example
-		t0 := time.Now()
-		eg.F()
-		dt := time.Now().Sub(t0)
-
-		// close pipe, restore stdout/stderr, get output
-		w.Close()
-		os.Stdout, os.Stderr = stdout, stderr
-		out := <-outC
-
-		// report any errors
-		tstr := fmt.Sprintf("(%.2f seconds)", dt.Seconds())
-		if g, e := strings.TrimSpace(out), strings.TrimSpace(eg.Output); g != e {
-			fmt.Printf("--- FAIL: %s %s\ngot:\n%s\nwant:\n%s\n",
-				eg.Name, tstr, g, e)
-			ok = false
-		} else if *chatty {
-			fmt.Printf("--- PASS: %s %s\n", eg.Name, tstr)
-		}
-	}
-
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/f.0.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/f.0.golden
deleted file mode 100644
index 8175901..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/f.0.golden
+++ /dev/null
@@ -1,13 +0,0 @@
-// The package f is a go/doc test for functions and factory ...
-PACKAGE f
-
-IMPORTPATH
-	testdata/f
-
-FILENAMES
-	testdata/f.go
-
-FUNCTIONS
-	// Exported must always be visible. Was issue 2824. 
-	func Exported() private
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/f.1.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/f.1.golden
deleted file mode 100644
index ba68e88..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/f.1.golden
+++ /dev/null
@@ -1,16 +0,0 @@
-// The package f is a go/doc test for functions and factory ...
-PACKAGE f
-
-IMPORTPATH
-	testdata/f
-
-FILENAMES
-	testdata/f.go
-
-TYPES
-	// 
-	type private struct{}
-
-	// Exported must always be visible. Was issue 2824. 
-	func Exported() private
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/f.2.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/f.2.golden
deleted file mode 100644
index 8175901..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/f.2.golden
+++ /dev/null
@@ -1,13 +0,0 @@
-// The package f is a go/doc test for functions and factory ...
-PACKAGE f
-
-IMPORTPATH
-	testdata/f
-
-FILENAMES
-	testdata/f.go
-
-FUNCTIONS
-	// Exported must always be visible. Was issue 2824. 
-	func Exported() private
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/f.go b/third_party/gofrontend/libgo/go/go/doc/testdata/f.go
deleted file mode 100644
index 7e9add9..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/f.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The package f is a go/doc test for functions and factory methods.
-package f
-
-// ----------------------------------------------------------------------------
-// Factory functions for non-exported types must not get lost.
-
-type private struct{}
-
-// Exported must always be visible. Was issue 2824.
-func Exported() private {}
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/template.txt b/third_party/gofrontend/libgo/go/go/doc/testdata/template.txt
deleted file mode 100644
index 1b07382..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/template.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-{{synopsis .Doc}}
-PACKAGE {{.Name}}
-
-IMPORTPATH
-	{{.ImportPath}}
-
-{{with .Imports}}IMPORTS
-{{range .}}	{{.}}
-{{end}}
-{{end}}{{/*
-
-*/}}FILENAMES
-{{range .Filenames}}	{{.}}
-{{end}}{{/*
-
-*/}}{{with .Consts}}
-CONSTANTS
-{{range .}}	{{synopsis .Doc}}
-	{{node .Decl $.FSet}}
-
-{{end}}{{end}}{{/*
-
-*/}}{{with .Vars}}
-VARIABLES
-{{range .}}	{{synopsis .Doc}}
-	{{node .Decl $.FSet}}
-
-{{end}}{{end}}{{/*
-
-*/}}{{with .Funcs}}
-FUNCTIONS
-{{range .}}	{{synopsis .Doc}}
-	{{node .Decl $.FSet}}
-
-{{end}}{{end}}{{/*
-
-*/}}{{with .Types}}
-TYPES
-{{range .}}	{{synopsis .Doc}}
-	{{node .Decl $.FSet}}
-
-{{range .Consts}}	{{synopsis .Doc}}
-	{{node .Decl $.FSet}}
-
-{{end}}{{/*
-
-*/}}{{range .Vars}}	{{synopsis .Doc}}
-	{{node .Decl $.FSet}}
-
-{{end}}{{/*
-
-*/}}{{range .Funcs}}	{{synopsis .Doc}}
-	{{node .Decl $.FSet}}
-
-{{end}}{{/*
-
-*/}}{{range .Methods}}	{{synopsis .Doc}}
-	{{node .Decl $.FSet}}
-
-{{end}}{{end}}{{end}}{{/*
-
-*/}}{{with .Bugs}}
-BUGS .Bugs is now deprecated, please use .Notes instead
-{{range .}}{{indent "\t" .}}
-{{end}}{{end}}{{with .Notes}}{{range $marker, $content := .}}
-{{$marker}}S
-{{range $content}}{{$marker}}({{.UID}}){{indent "\t" .Body}}
-{{end}}{{end}}{{end}}
\ No newline at end of file
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/testing.0.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/testing.0.golden
deleted file mode 100644
index f8348f1..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/testing.0.golden
+++ /dev/null
@@ -1,156 +0,0 @@
-// Package testing provides support for automated testing of Go ...
-PACKAGE testing
-
-IMPORTPATH
-	testdata/testing
-
-IMPORTS
-	bytes
-	flag
-	fmt
-	io
-	os
-	runtime
-	runtime/pprof
-	strconv
-	strings
-	time
-
-FILENAMES
-	testdata/benchmark.go
-	testdata/example.go
-	testdata/testing.go
-
-FUNCTIONS
-	// An internal function but exported because it is cross-package; ...
-	func Main(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample)
-
-	// An internal function but exported because it is cross-package; ...
-	func RunBenchmarks(matchString func(pat, str string) (bool, error), benchmarks []InternalBenchmark)
-
-	// 
-	func RunExamples(examples []InternalExample) (ok bool)
-
-	// 
-	func RunTests(matchString func(pat, str string) (bool, error), tests []InternalTest) (ok bool)
-
-	// Short reports whether the -test.short flag is set. 
-	func Short() bool
-
-
-TYPES
-	// B is a type passed to Benchmark functions to manage benchmark ...
-	type B struct {
-		N int
-		// contains filtered or unexported fields
-	}
-
-	// Error is equivalent to Log() followed by Fail(). 
-	func (c *B) Error(args ...interface{})
-
-	// Errorf is equivalent to Logf() followed by Fail(). 
-	func (c *B) Errorf(format string, args ...interface{})
-
-	// Fail marks the function as having failed but continues ...
-	func (c *B) Fail()
-
-	// FailNow marks the function as having failed and stops its ...
-	func (c *B) FailNow()
-
-	// Failed reports whether the function has failed. 
-	func (c *B) Failed() bool
-
-	// Fatal is equivalent to Log() followed by FailNow(). 
-	func (c *B) Fatal(args ...interface{})
-
-	// Fatalf is equivalent to Logf() followed by FailNow(). 
-	func (c *B) Fatalf(format string, args ...interface{})
-
-	// Log formats its arguments using default formatting, analogous ...
-	func (c *B) Log(args ...interface{})
-
-	// Logf formats its arguments according to the format, analogous ...
-	func (c *B) Logf(format string, args ...interface{})
-
-	// ResetTimer sets the elapsed benchmark time to zero. It does not ...
-	func (b *B) ResetTimer()
-
-	// SetBytes records the number of bytes processed in a single ...
-	func (b *B) SetBytes(n int64)
-
-	// StartTimer starts timing a test.  This function is called ...
-	func (b *B) StartTimer()
-
-	// StopTimer stops timing a test.  This can be used to pause the ...
-	func (b *B) StopTimer()
-
-	// The results of a benchmark run. 
-	type BenchmarkResult struct {
-		N	int		// The number of iterations.
-		T	time.Duration	// The total time taken.
-		Bytes	int64		// Bytes processed in one iteration.
-	}
-
-	// Benchmark benchmarks a single function. Useful for creating ...
-	func Benchmark(f func(b *B)) BenchmarkResult
-
-	// 
-	func (r BenchmarkResult) NsPerOp() int64
-
-	// 
-	func (r BenchmarkResult) String() string
-
-	// An internal type but exported because it is cross-package; part ...
-	type InternalBenchmark struct {
-		Name	string
-		F	func(b *B)
-	}
-
-	// 
-	type InternalExample struct {
-		Name	string
-		F	func()
-		Output	string
-	}
-
-	// An internal type but exported because it is cross-package; part ...
-	type InternalTest struct {
-		Name	string
-		F	func(*T)
-	}
-
-	// T is a type passed to Test functions to manage test state and ...
-	type T struct {
-		// contains filtered or unexported fields
-	}
-
-	// Error is equivalent to Log() followed by Fail(). 
-	func (c *T) Error(args ...interface{})
-
-	// Errorf is equivalent to Logf() followed by Fail(). 
-	func (c *T) Errorf(format string, args ...interface{})
-
-	// Fail marks the function as having failed but continues ...
-	func (c *T) Fail()
-
-	// FailNow marks the function as having failed and stops its ...
-	func (c *T) FailNow()
-
-	// Failed reports whether the function has failed. 
-	func (c *T) Failed() bool
-
-	// Fatal is equivalent to Log() followed by FailNow(). 
-	func (c *T) Fatal(args ...interface{})
-
-	// Fatalf is equivalent to Logf() followed by FailNow(). 
-	func (c *T) Fatalf(format string, args ...interface{})
-
-	// Log formats its arguments using default formatting, analogous ...
-	func (c *T) Log(args ...interface{})
-
-	// Logf formats its arguments according to the format, analogous ...
-	func (c *T) Logf(format string, args ...interface{})
-
-	// Parallel signals that this test is to be run in parallel with ...
-	func (t *T) Parallel()
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/testing.1.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/testing.1.golden
deleted file mode 100644
index 282bb10..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/testing.1.golden
+++ /dev/null
@@ -1,298 +0,0 @@
-// Package testing provides support for automated testing of Go ...
-PACKAGE testing
-
-IMPORTPATH
-	testdata/testing
-
-IMPORTS
-	bytes
-	flag
-	fmt
-	io
-	os
-	runtime
-	runtime/pprof
-	strconv
-	strings
-	time
-
-FILENAMES
-	testdata/benchmark.go
-	testdata/example.go
-	testdata/testing.go
-
-VARIABLES
-	// 
-	var (
-		// The short flag requests that tests run more quickly, but its functionality
-		// is provided by test writers themselves.  The testing package is just its
-		// home.  The all.bash installation script sets it to make installation more
-		// efficient, but by default the flag is off so a plain "go test" will do a
-		// full test of the package.
-		short	= flag.Bool("test.short", false, "run smaller test suite to save time")
-	
-		// Report as tests are run; default is silent for success.
-		chatty		= flag.Bool("test.v", false, "verbose: print additional output")
-		match		= flag.String("test.run", "", "regular expression to select tests to run")
-		memProfile	= flag.String("test.memprofile", "", "write a memory profile to the named file after execution")
-		memProfileRate	= flag.Int("test.memprofilerate", 0, "if >=0, sets runtime.MemProfileRate")
-		cpuProfile	= flag.String("test.cpuprofile", "", "write a cpu profile to the named file during execution")
-		timeout		= flag.Duration("test.timeout", 0, "if positive, sets an aggregate time limit for all tests")
-		cpuListStr	= flag.String("test.cpu", "", "comma-separated list of number of CPUs to use for each test")
-		parallel	= flag.Int("test.parallel", runtime.GOMAXPROCS(0), "maximum test parallelism")
-	
-		cpuList	[]int
-	)
-
-	// 
-	var benchTime = flag.Duration("test.benchtime", 1*time.Second, "approximate run time for each benchmark")
-
-	// 
-	var matchBenchmarks = flag.String("test.bench", "", "regular expression to select benchmarks to run")
-
-	// 
-	var timer *time.Timer
-
-
-FUNCTIONS
-	// An internal function but exported because it is cross-package; ...
-	func Main(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample)
-
-	// An internal function but exported because it is cross-package; ...
-	func RunBenchmarks(matchString func(pat, str string) (bool, error), benchmarks []InternalBenchmark)
-
-	// 
-	func RunExamples(examples []InternalExample) (ok bool)
-
-	// 
-	func RunTests(matchString func(pat, str string) (bool, error), tests []InternalTest) (ok bool)
-
-	// Short reports whether the -test.short flag is set. 
-	func Short() bool
-
-	// after runs after all testing. 
-	func after()
-
-	// alarm is called if the timeout expires. 
-	func alarm()
-
-	// before runs before all testing. 
-	func before()
-
-	// decorate inserts the final newline if needed and indentation ...
-	func decorate(s string, addFileLine bool) string
-
-	// 
-	func max(x, y int) int
-
-	// 
-	func min(x, y int) int
-
-	// 
-	func parseCpuList()
-
-	// roundDown10 rounds a number down to the nearest power of 10. 
-	func roundDown10(n int) int
-
-	// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX]. 
-	func roundUp(n int) int
-
-	// startAlarm starts an alarm if requested. 
-	func startAlarm()
-
-	// stopAlarm turns off the alarm. 
-	func stopAlarm()
-
-	// 
-	func tRunner(t *T, test *InternalTest)
-
-
-TYPES
-	// B is a type passed to Benchmark functions to manage benchmark ...
-	type B struct {
-		common
-		N		int
-		benchmark	InternalBenchmark
-		bytes		int64
-		timerOn		bool
-		result		BenchmarkResult
-	}
-
-	// Error is equivalent to Log() followed by Fail(). 
-	func (c *B) Error(args ...interface{})
-
-	// Errorf is equivalent to Logf() followed by Fail(). 
-	func (c *B) Errorf(format string, args ...interface{})
-
-	// Fail marks the function as having failed but continues ...
-	func (c *B) Fail()
-
-	// FailNow marks the function as having failed and stops its ...
-	func (c *B) FailNow()
-
-	// Failed reports whether the function has failed. 
-	func (c *B) Failed() bool
-
-	// Fatal is equivalent to Log() followed by FailNow(). 
-	func (c *B) Fatal(args ...interface{})
-
-	// Fatalf is equivalent to Logf() followed by FailNow(). 
-	func (c *B) Fatalf(format string, args ...interface{})
-
-	// Log formats its arguments using default formatting, analogous ...
-	func (c *B) Log(args ...interface{})
-
-	// Logf formats its arguments according to the format, analogous ...
-	func (c *B) Logf(format string, args ...interface{})
-
-	// ResetTimer sets the elapsed benchmark time to zero. It does not ...
-	func (b *B) ResetTimer()
-
-	// SetBytes records the number of bytes processed in a single ...
-	func (b *B) SetBytes(n int64)
-
-	// StartTimer starts timing a test.  This function is called ...
-	func (b *B) StartTimer()
-
-	// StopTimer stops timing a test.  This can be used to pause the ...
-	func (b *B) StopTimer()
-
-	// launch launches the benchmark function.  It gradually increases ...
-	func (b *B) launch()
-
-	// log generates the output. It's always at the same stack depth. 
-	func (c *B) log(s string)
-
-	// 
-	func (b *B) nsPerOp() int64
-
-	// run times the benchmark function in a separate goroutine. 
-	func (b *B) run() BenchmarkResult
-
-	// runN runs a single benchmark for the specified number of ...
-	func (b *B) runN(n int)
-
-	// trimOutput shortens the output from a benchmark, which can be ...
-	func (b *B) trimOutput()
-
-	// The results of a benchmark run. 
-	type BenchmarkResult struct {
-		N	int		// The number of iterations.
-		T	time.Duration	// The total time taken.
-		Bytes	int64		// Bytes processed in one iteration.
-	}
-
-	// Benchmark benchmarks a single function. Useful for creating ...
-	func Benchmark(f func(b *B)) BenchmarkResult
-
-	// 
-	func (r BenchmarkResult) NsPerOp() int64
-
-	// 
-	func (r BenchmarkResult) String() string
-
-	// 
-	func (r BenchmarkResult) mbPerSec() float64
-
-	// An internal type but exported because it is cross-package; part ...
-	type InternalBenchmark struct {
-		Name	string
-		F	func(b *B)
-	}
-
-	// 
-	type InternalExample struct {
-		Name	string
-		F	func()
-		Output	string
-	}
-
-	// An internal type but exported because it is cross-package; part ...
-	type InternalTest struct {
-		Name	string
-		F	func(*T)
-	}
-
-	// T is a type passed to Test functions to manage test state and ...
-	type T struct {
-		common
-		name		string		// Name of test.
-		startParallel	chan bool	// Parallel tests will wait on this.
-	}
-
-	// Error is equivalent to Log() followed by Fail(). 
-	func (c *T) Error(args ...interface{})
-
-	// Errorf is equivalent to Logf() followed by Fail(). 
-	func (c *T) Errorf(format string, args ...interface{})
-
-	// Fail marks the function as having failed but continues ...
-	func (c *T) Fail()
-
-	// FailNow marks the function as having failed and stops its ...
-	func (c *T) FailNow()
-
-	// Failed reports whether the function has failed. 
-	func (c *T) Failed() bool
-
-	// Fatal is equivalent to Log() followed by FailNow(). 
-	func (c *T) Fatal(args ...interface{})
-
-	// Fatalf is equivalent to Logf() followed by FailNow(). 
-	func (c *T) Fatalf(format string, args ...interface{})
-
-	// Log formats its arguments using default formatting, analogous ...
-	func (c *T) Log(args ...interface{})
-
-	// Logf formats its arguments according to the format, analogous ...
-	func (c *T) Logf(format string, args ...interface{})
-
-	// Parallel signals that this test is to be run in parallel with ...
-	func (t *T) Parallel()
-
-	// log generates the output. It's always at the same stack depth. 
-	func (c *T) log(s string)
-
-	// 
-	func (t *T) report()
-
-	// common holds the elements common between T and B and captures ...
-	type common struct {
-		output		[]byte		// Output generated by test or benchmark.
-		failed		bool		// Test or benchmark has failed.
-		start		time.Time	// Time test or benchmark started
-		duration	time.Duration
-		self		interface{}		// To be sent on signal channel when done.
-		signal		chan interface{}	// Output for serial tests.
-	}
-
-	// Error is equivalent to Log() followed by Fail(). 
-	func (c *common) Error(args ...interface{})
-
-	// Errorf is equivalent to Logf() followed by Fail(). 
-	func (c *common) Errorf(format string, args ...interface{})
-
-	// Fail marks the function as having failed but continues ...
-	func (c *common) Fail()
-
-	// FailNow marks the function as having failed and stops its ...
-	func (c *common) FailNow()
-
-	// Failed reports whether the function has failed. 
-	func (c *common) Failed() bool
-
-	// Fatal is equivalent to Log() followed by FailNow(). 
-	func (c *common) Fatal(args ...interface{})
-
-	// Fatalf is equivalent to Logf() followed by FailNow(). 
-	func (c *common) Fatalf(format string, args ...interface{})
-
-	// Log formats its arguments using default formatting, analogous ...
-	func (c *common) Log(args ...interface{})
-
-	// Logf formats its arguments according to the format, analogous ...
-	func (c *common) Logf(format string, args ...interface{})
-
-	// log generates the output. It's always at the same stack depth. 
-	func (c *common) log(s string)
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/testing.2.golden b/third_party/gofrontend/libgo/go/go/doc/testdata/testing.2.golden
deleted file mode 100644
index f8348f1..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/testing.2.golden
+++ /dev/null
@@ -1,156 +0,0 @@
-// Package testing provides support for automated testing of Go ...
-PACKAGE testing
-
-IMPORTPATH
-	testdata/testing
-
-IMPORTS
-	bytes
-	flag
-	fmt
-	io
-	os
-	runtime
-	runtime/pprof
-	strconv
-	strings
-	time
-
-FILENAMES
-	testdata/benchmark.go
-	testdata/example.go
-	testdata/testing.go
-
-FUNCTIONS
-	// An internal function but exported because it is cross-package; ...
-	func Main(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample)
-
-	// An internal function but exported because it is cross-package; ...
-	func RunBenchmarks(matchString func(pat, str string) (bool, error), benchmarks []InternalBenchmark)
-
-	// 
-	func RunExamples(examples []InternalExample) (ok bool)
-
-	// 
-	func RunTests(matchString func(pat, str string) (bool, error), tests []InternalTest) (ok bool)
-
-	// Short reports whether the -test.short flag is set. 
-	func Short() bool
-
-
-TYPES
-	// B is a type passed to Benchmark functions to manage benchmark ...
-	type B struct {
-		N int
-		// contains filtered or unexported fields
-	}
-
-	// Error is equivalent to Log() followed by Fail(). 
-	func (c *B) Error(args ...interface{})
-
-	// Errorf is equivalent to Logf() followed by Fail(). 
-	func (c *B) Errorf(format string, args ...interface{})
-
-	// Fail marks the function as having failed but continues ...
-	func (c *B) Fail()
-
-	// FailNow marks the function as having failed and stops its ...
-	func (c *B) FailNow()
-
-	// Failed reports whether the function has failed. 
-	func (c *B) Failed() bool
-
-	// Fatal is equivalent to Log() followed by FailNow(). 
-	func (c *B) Fatal(args ...interface{})
-
-	// Fatalf is equivalent to Logf() followed by FailNow(). 
-	func (c *B) Fatalf(format string, args ...interface{})
-
-	// Log formats its arguments using default formatting, analogous ...
-	func (c *B) Log(args ...interface{})
-
-	// Logf formats its arguments according to the format, analogous ...
-	func (c *B) Logf(format string, args ...interface{})
-
-	// ResetTimer sets the elapsed benchmark time to zero. It does not ...
-	func (b *B) ResetTimer()
-
-	// SetBytes records the number of bytes processed in a single ...
-	func (b *B) SetBytes(n int64)
-
-	// StartTimer starts timing a test.  This function is called ...
-	func (b *B) StartTimer()
-
-	// StopTimer stops timing a test.  This can be used to pause the ...
-	func (b *B) StopTimer()
-
-	// The results of a benchmark run. 
-	type BenchmarkResult struct {
-		N	int		// The number of iterations.
-		T	time.Duration	// The total time taken.
-		Bytes	int64		// Bytes processed in one iteration.
-	}
-
-	// Benchmark benchmarks a single function. Useful for creating ...
-	func Benchmark(f func(b *B)) BenchmarkResult
-
-	// 
-	func (r BenchmarkResult) NsPerOp() int64
-
-	// 
-	func (r BenchmarkResult) String() string
-
-	// An internal type but exported because it is cross-package; part ...
-	type InternalBenchmark struct {
-		Name	string
-		F	func(b *B)
-	}
-
-	// 
-	type InternalExample struct {
-		Name	string
-		F	func()
-		Output	string
-	}
-
-	// An internal type but exported because it is cross-package; part ...
-	type InternalTest struct {
-		Name	string
-		F	func(*T)
-	}
-
-	// T is a type passed to Test functions to manage test state and ...
-	type T struct {
-		// contains filtered or unexported fields
-	}
-
-	// Error is equivalent to Log() followed by Fail(). 
-	func (c *T) Error(args ...interface{})
-
-	// Errorf is equivalent to Logf() followed by Fail(). 
-	func (c *T) Errorf(format string, args ...interface{})
-
-	// Fail marks the function as having failed but continues ...
-	func (c *T) Fail()
-
-	// FailNow marks the function as having failed and stops its ...
-	func (c *T) FailNow()
-
-	// Failed reports whether the function has failed. 
-	func (c *T) Failed() bool
-
-	// Fatal is equivalent to Log() followed by FailNow(). 
-	func (c *T) Fatal(args ...interface{})
-
-	// Fatalf is equivalent to Logf() followed by FailNow(). 
-	func (c *T) Fatalf(format string, args ...interface{})
-
-	// Log formats its arguments using default formatting, analogous ...
-	func (c *T) Log(args ...interface{})
-
-	// Logf formats its arguments according to the format, analogous ...
-	func (c *T) Logf(format string, args ...interface{})
-
-	// Parallel signals that this test is to be run in parallel with ...
-	func (t *T) Parallel()
-
diff --git a/third_party/gofrontend/libgo/go/go/doc/testdata/testing.go b/third_party/gofrontend/libgo/go/go/doc/testdata/testing.go
deleted file mode 100644
index 93ed494..0000000
--- a/third_party/gofrontend/libgo/go/go/doc/testdata/testing.go
+++ /dev/null
@@ -1,404 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package testing provides support for automated testing of Go packages.
-// It is intended to be used in concert with the ``go test'' utility, which automates
-// execution of any function of the form
-//     func TestXxx(*testing.T)
-// where Xxx can be any alphanumeric string (but the first letter must not be in
-// [a-z]) and serves to identify the test routine.
-// These TestXxx routines should be declared within the package they are testing.
-//
-// Functions of the form
-//     func BenchmarkXxx(*testing.B)
-// are considered benchmarks, and are executed by go test when the -test.bench
-// flag is provided.
-//
-// A sample benchmark function looks like this:
-//     func BenchmarkHello(b *testing.B) {
-//         for i := 0; i < b.N; i++ {
-//             fmt.Sprintf("hello")
-//         }
-//     }
-// The benchmark package will vary b.N until the benchmark function lasts
-// long enough to be timed reliably.  The output
-//     testing.BenchmarkHello    10000000    282 ns/op
-// means that the loop ran 10000000 times at a speed of 282 ns per loop.
-//
-// If a benchmark needs some expensive setup before running, the timer
-// may be stopped:
-//     func BenchmarkBigLen(b *testing.B) {
-//         b.StopTimer()
-//         big := NewBig()
-//         b.StartTimer()
-//         for i := 0; i < b.N; i++ {
-//             big.Len()
-//         }
-//     }
-package testing
-
-import (
-	"flag"
-	"fmt"
-	"os"
-	"runtime"
-	"runtime/pprof"
-	"strconv"
-	"strings"
-	"time"
-)
-
-var (
-	// The short flag requests that tests run more quickly, but its functionality
-	// is provided by test writers themselves.  The testing package is just its
-	// home.  The all.bash installation script sets it to make installation more
-	// efficient, but by default the flag is off so a plain "go test" will do a
-	// full test of the package.
-	short = flag.Bool("test.short", false, "run smaller test suite to save time")
-
-	// Report as tests are run; default is silent for success.
-	chatty         = flag.Bool("test.v", false, "verbose: print additional output")
-	match          = flag.String("test.run", "", "regular expression to select tests to run")
-	memProfile     = flag.String("test.memprofile", "", "write a memory profile to the named file after execution")
-	memProfileRate = flag.Int("test.memprofilerate", 0, "if >=0, sets runtime.MemProfileRate")
-	cpuProfile     = flag.String("test.cpuprofile", "", "write a cpu profile to the named file during execution")
-	timeout        = flag.Duration("test.timeout", 0, "if positive, sets an aggregate time limit for all tests")
-	cpuListStr     = flag.String("test.cpu", "", "comma-separated list of number of CPUs to use for each test")
-	parallel       = flag.Int("test.parallel", runtime.GOMAXPROCS(0), "maximum test parallelism")
-
-	cpuList []int
-)
-
-// common holds the elements common between T and B and
-// captures common methods such as Errorf.
-type common struct {
-	output   []byte    // Output generated by test or benchmark.
-	failed   bool      // Test or benchmark has failed.
-	start    time.Time // Time test or benchmark started
-	duration time.Duration
-	self     interface{}      // To be sent on signal channel when done.
-	signal   chan interface{} // Output for serial tests.
-}
-
-// Short reports whether the -test.short flag is set.
-func Short() bool {
-	return *short
-}
-
-// decorate inserts the final newline if needed and indentation tabs for formatting.
-// If addFileLine is true, it also prefixes the string with the file and line of the call site.
-func decorate(s string, addFileLine bool) string {
-	if addFileLine {
-		_, file, line, ok := runtime.Caller(3) // decorate + log + public function.
-		if ok {
-			// Truncate file name at last file name separator.
-			if index := strings.LastIndex(file, "/"); index >= 0 {
-				file = file[index+1:]
-			} else if index = strings.LastIndex(file, "\\"); index >= 0 {
-				file = file[index+1:]
-			}
-		} else {
-			file = "???"
-			line = 1
-		}
-		s = fmt.Sprintf("%s:%d: %s", file, line, s)
-	}
-	s = "\t" + s // Every line is indented at least one tab.
-	n := len(s)
-	if n > 0 && s[n-1] != '\n' {
-		s += "\n"
-		n++
-	}
-	for i := 0; i < n-1; i++ { // -1 to avoid final newline
-		if s[i] == '\n' {
-			// Second and subsequent lines are indented an extra tab.
-			return s[0:i+1] + "\t" + decorate(s[i+1:n], false)
-		}
-	}
-	return s
-}
-
-// T is a type passed to Test functions to manage test state and support formatted test logs.
-// Logs are accumulated during execution and dumped to standard error when done.
-type T struct {
-	common
-	name          string    // Name of test.
-	startParallel chan bool // Parallel tests will wait on this.
-}
-
-// Fail marks the function as having failed but continues execution.
-func (c *common) Fail() { c.failed = true }
-
-// Failed reports whether the function has failed.
-func (c *common) Failed() bool { return c.failed }
-
-// FailNow marks the function as having failed and stops its execution.
-// Execution will continue at the next Test.
-func (c *common) FailNow() {
-	c.Fail()
-
-	// Calling runtime.Goexit will exit the goroutine, which
-	// will run the deferred functions in this goroutine,
-	// which will eventually run the deferred lines in tRunner,
-	// which will signal to the test loop that this test is done.
-	//
-	// A previous version of this code said:
-	//
-	//	c.duration = ...
-	//	c.signal <- c.self
-	//	runtime.Goexit()
-	//
-	// This previous version duplicated code (those lines are in
-	// tRunner no matter what), but worse the goroutine teardown
-	// implicit in runtime.Goexit was not guaranteed to complete
-	// before the test exited.  If a test deferred an important cleanup
-	// function (like removing temporary files), there was no guarantee
-	// it would run on a test failure.  Because we send on c.signal during
-	// a top-of-stack deferred function now, we know that the send
-	// only happens after any other stacked defers have completed.
-	runtime.Goexit()
-}
-
-// log generates the output. It's always at the same stack depth.
-func (c *common) log(s string) {
-	c.output = append(c.output, decorate(s, true)...)
-}
-
-// Log formats its arguments using default formatting, analogous to Println(),
-// and records the text in the error log.
-func (c *common) Log(args ...interface{}) { c.log(fmt.Sprintln(args...)) }
-
-// Logf formats its arguments according to the format, analogous to Printf(),
-// and records the text in the error log.
-func (c *common) Logf(format string, args ...interface{}) { c.log(fmt.Sprintf(format, args...)) }
-
-// Error is equivalent to Log() followed by Fail().
-func (c *common) Error(args ...interface{}) {
-	c.log(fmt.Sprintln(args...))
-	c.Fail()
-}
-
-// Errorf is equivalent to Logf() followed by Fail().
-func (c *common) Errorf(format string, args ...interface{}) {
-	c.log(fmt.Sprintf(format, args...))
-	c.Fail()
-}
-
-// Fatal is equivalent to Log() followed by FailNow().
-func (c *common) Fatal(args ...interface{}) {
-	c.log(fmt.Sprintln(args...))
-	c.FailNow()
-}
-
-// Fatalf is equivalent to Logf() followed by FailNow().
-func (c *common) Fatalf(format string, args ...interface{}) {
-	c.log(fmt.Sprintf(format, args...))
-	c.FailNow()
-}
-
-// Parallel signals that this test is to be run in parallel with (and only with)
-// other parallel tests in this CPU group.
-func (t *T) Parallel() {
-	t.signal <- (*T)(nil) // Release main testing loop
-	<-t.startParallel     // Wait for serial tests to finish
-}
-
-// An internal type but exported because it is cross-package; part of the implementation
-// of go test.
-type InternalTest struct {
-	Name string
-	F    func(*T)
-}
-
-func tRunner(t *T, test *InternalTest) {
-	t.start = time.Now()
-
-	// When this goroutine is done, either because test.F(t)
-	// returned normally or because a test failure triggered
-	// a call to runtime.Goexit, record the duration and send
-	// a signal saying that the test is done.
-	defer func() {
-		t.duration = time.Now().Sub(t.start)
-		t.signal <- t
-	}()
-
-	test.F(t)
-}
-
-// An internal function but exported because it is cross-package; part of the implementation
-// of go test.
-func Main(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) {
-	flag.Parse()
-	parseCpuList()
-
-	before()
-	startAlarm()
-	testOk := RunTests(matchString, tests)
-	exampleOk := RunExamples(examples)
-	if !testOk || !exampleOk {
-		fmt.Println("FAIL")
-		os.Exit(1)
-	}
-	fmt.Println("PASS")
-	stopAlarm()
-	RunBenchmarks(matchString, benchmarks)
-	after()
-}
-
-func (t *T) report() {
-	tstr := fmt.Sprintf("(%.2f seconds)", t.duration.Seconds())
-	format := "--- %s: %s %s\n%s"
-	if t.failed {
-		fmt.Printf(format, "FAIL", t.name, tstr, t.output)
-	} else if *chatty {
-		fmt.Printf(format, "PASS", t.name, tstr, t.output)
-	}
-}
-
-func RunTests(matchString func(pat, str string) (bool, error), tests []InternalTest) (ok bool) {
-	ok = true
-	if len(tests) == 0 {
-		fmt.Fprintln(os.Stderr, "testing: warning: no tests to run")
-		return
-	}
-	for _, procs := range cpuList {
-		runtime.GOMAXPROCS(procs)
-		// We build a new channel tree for each run of the loop.
-		// collector merges in one channel all the upstream signals from parallel tests.
-		// If all tests pump to the same channel, a bug can occur where a test
-		// kicks off a goroutine that Fails, yet the test still delivers a completion signal,
-		// which skews the counting.
-		var collector = make(chan interface{})
-
-		numParallel := 0
-		startParallel := make(chan bool)
-
-		for i := 0; i < len(tests); i++ {
-			matched, err := matchString(*match, tests[i].Name)
-			if err != nil {
-				fmt.Fprintf(os.Stderr, "testing: invalid regexp for -test.run: %s\n", err)
-				os.Exit(1)
-			}
-			if !matched {
-				continue
-			}
-			testName := tests[i].Name
-			if procs != 1 {
-				testName = fmt.Sprintf("%s-%d", tests[i].Name, procs)
-			}
-			t := &T{
-				common: common{
-					signal: make(chan interface{}),
-				},
-				name:          testName,
-				startParallel: startParallel,
-			}
-			t.self = t
-			if *chatty {
-				fmt.Printf("=== RUN %s\n", t.name)
-			}
-			go tRunner(t, &tests[i])
-			out := (<-t.signal).(*T)
-			if out == nil { // Parallel run.
-				go func() {
-					collector <- <-t.signal
-				}()
-				numParallel++
-				continue
-			}
-			t.report()
-			ok = ok && !out.failed
-		}
-
-		running := 0
-		for numParallel+running > 0 {
-			if running < *parallel && numParallel > 0 {
-				startParallel <- true
-				running++
-				numParallel--
-				continue
-			}
-			t := (<-collector).(*T)
-			t.report()
-			ok = ok && !t.failed
-			running--
-		}
-	}
-	return
-}
-
-// before runs before all testing.
-func before() {
-	if *memProfileRate > 0 {
-		runtime.MemProfileRate = *memProfileRate
-	}
-	if *cpuProfile != "" {
-		f, err := os.Create(*cpuProfile)
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "testing: %s", err)
-			return
-		}
-		if err := pprof.StartCPUProfile(f); err != nil {
-			fmt.Fprintf(os.Stderr, "testing: can't start cpu profile: %s", err)
-			f.Close()
-			return
-		}
-		// Could save f so after can call f.Close; not worth the effort.
-	}
-
-}
-
-// after runs after all testing.
-func after() {
-	if *cpuProfile != "" {
-		pprof.StopCPUProfile() // flushes profile to disk
-	}
-	if *memProfile != "" {
-		f, err := os.Create(*memProfile)
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "testing: %s", err)
-			return
-		}
-		if err = pprof.WriteHeapProfile(f); err != nil {
-			fmt.Fprintf(os.Stderr, "testing: can't write %s: %s", *memProfile, err)
-		}
-		f.Close()
-	}
-}
-
-var timer *time.Timer
-
-// startAlarm starts an alarm if requested.
-func startAlarm() {
-	if *timeout > 0 {
-		timer = time.AfterFunc(*timeout, alarm)
-	}
-}
-
-// stopAlarm turns off the alarm.
-func stopAlarm() {
-	if *timeout > 0 {
-		timer.Stop()
-	}
-}
-
-// alarm is called if the timeout expires.
-func alarm() {
-	panic("test timed out")
-}
-
-func parseCpuList() {
-	if len(*cpuListStr) == 0 {
-		cpuList = append(cpuList, runtime.GOMAXPROCS(-1))
-	} else {
-		for _, val := range strings.Split(*cpuListStr, ",") {
-			cpu, err := strconv.Atoi(val)
-			if err != nil || cpu <= 0 {
-				fmt.Fprintf(os.Stderr, "testing: invalid value %q for -test.cpu", val)
-				os.Exit(1)
-			}
-			cpuList = append(cpuList, cpu)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/format/format.go b/third_party/gofrontend/libgo/go/go/format/format.go
deleted file mode 100644
index 1adfd7d..0000000
--- a/third_party/gofrontend/libgo/go/go/format/format.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package format implements standard formatting of Go source.
-package format
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/printer"
-	"go/token"
-	"internal/format"
-	"io"
-)
-
-var config = printer.Config{Mode: printer.UseSpaces | printer.TabIndent, Tabwidth: 8}
-
-const parserMode = parser.ParseComments
-
-// Node formats node in canonical gofmt style and writes the result to dst.
-//
-// The node type must be *ast.File, *printer.CommentedNode, []ast.Decl,
-// []ast.Stmt, or assignment-compatible to ast.Expr, ast.Decl, ast.Spec,
-// or ast.Stmt. Node does not modify node. Imports are not sorted for
-// nodes representing partial source files (i.e., if the node is not an
-// *ast.File or a *printer.CommentedNode not wrapping an *ast.File).
-//
-// The function may return early (before the entire result is written)
-// and return a formatting error, for instance due to an incorrect AST.
-//
-func Node(dst io.Writer, fset *token.FileSet, node interface{}) error {
-	// Determine if we have a complete source file (file != nil).
-	var file *ast.File
-	var cnode *printer.CommentedNode
-	switch n := node.(type) {
-	case *ast.File:
-		file = n
-	case *printer.CommentedNode:
-		if f, ok := n.Node.(*ast.File); ok {
-			file = f
-			cnode = n
-		}
-	}
-
-	// Sort imports if necessary.
-	if file != nil && hasUnsortedImports(file) {
-		// Make a copy of the AST because ast.SortImports is destructive.
-		// TODO(gri) Do this more efficiently.
-		var buf bytes.Buffer
-		err := config.Fprint(&buf, fset, file)
-		if err != nil {
-			return err
-		}
-		file, err = parser.ParseFile(fset, "", buf.Bytes(), parserMode)
-		if err != nil {
-			// We should never get here. If we do, provide good diagnostic.
-			return fmt.Errorf("format.Node internal error (%s)", err)
-		}
-		ast.SortImports(fset, file)
-
-		// Use new file with sorted imports.
-		node = file
-		if cnode != nil {
-			node = &printer.CommentedNode{Node: file, Comments: cnode.Comments}
-		}
-	}
-
-	return config.Fprint(dst, fset, node)
-}
-
-// Source formats src in canonical gofmt style and returns the result
-// or an (I/O or syntax) error. src is expected to be a syntactically
-// correct Go source file, or a list of Go declarations or statements.
-//
-// If src is a partial source file, the leading and trailing space of src
-// is applied to the result (such that it has the same leading and trailing
-// space as src), and the result is indented by the same amount as the first
-// line of src containing code. Imports are not sorted for partial source files.
-//
-func Source(src []byte) ([]byte, error) {
-	fset := token.NewFileSet()
-	file, sourceAdj, indentAdj, err := format.Parse(fset, "", src, true)
-	if err != nil {
-		return nil, err
-	}
-
-	if sourceAdj == nil {
-		// Complete source file.
-		// TODO(gri) consider doing this always.
-		ast.SortImports(fset, file)
-	}
-
-	return format.Format(fset, file, sourceAdj, indentAdj, src, config)
-}
-
-func hasUnsortedImports(file *ast.File) bool {
-	for _, d := range file.Decls {
-		d, ok := d.(*ast.GenDecl)
-		if !ok || d.Tok != token.IMPORT {
-			// Not an import declaration, so we're done.
-			// Imports are always first.
-			return false
-		}
-		if d.Lparen.IsValid() {
-			// For now assume all grouped imports are unsorted.
-			// TODO(gri) Should check if they are sorted already.
-			return true
-		}
-		// Ungrouped imports are sorted by default.
-	}
-	return false
-}
diff --git a/third_party/gofrontend/libgo/go/go/format/format_test.go b/third_party/gofrontend/libgo/go/go/format/format_test.go
deleted file mode 100644
index 000c611..0000000
--- a/third_party/gofrontend/libgo/go/go/format/format_test.go
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package format
-
-import (
-	"bytes"
-	"go/parser"
-	"go/token"
-	"io/ioutil"
-	"strings"
-	"testing"
-)
-
-const testfile = "format_test.go"
-
-func diff(t *testing.T, dst, src []byte) {
-	line := 1
-	offs := 0 // line offset
-	for i := 0; i < len(dst) && i < len(src); i++ {
-		d := dst[i]
-		s := src[i]
-		if d != s {
-			t.Errorf("dst:%d: %s\n", line, dst[offs:i+1])
-			t.Errorf("src:%d: %s\n", line, src[offs:i+1])
-			return
-		}
-		if s == '\n' {
-			line++
-			offs = i + 1
-		}
-	}
-	if len(dst) != len(src) {
-		t.Errorf("len(dst) = %d, len(src) = %d\nsrc = %q", len(dst), len(src), src)
-	}
-}
-
-func TestNode(t *testing.T) {
-	src, err := ioutil.ReadFile(testfile)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	fset := token.NewFileSet()
-	file, err := parser.ParseFile(fset, testfile, src, parser.ParseComments)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	var buf bytes.Buffer
-
-	if err = Node(&buf, fset, file); err != nil {
-		t.Fatal("Node failed:", err)
-	}
-
-	diff(t, buf.Bytes(), src)
-}
-
-func TestSource(t *testing.T) {
-	src, err := ioutil.ReadFile(testfile)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	res, err := Source(src)
-	if err != nil {
-		t.Fatal("Source failed:", err)
-	}
-
-	diff(t, res, src)
-}
-
-// Test cases that are expected to fail are marked by the prefix "ERROR".
-var tests = []string{
-	// declaration lists
-	`import "go/format"`,
-	"var x int",
-	"var x int\n\ntype T struct{}",
-
-	// statement lists
-	"x := 0",
-	"f(a, b, c)\nvar x int = f(1, 2, 3)",
-
-	// indentation, leading and trailing space
-	"\tx := 0\n\tgo f()",
-	"\tx := 0\n\tgo f()\n\n\n",
-	"\n\t\t\n\n\tx := 0\n\tgo f()\n\n\n",
-	"\n\t\t\n\n\t\t\tx := 0\n\t\t\tgo f()\n\n\n",
-	"\n\t\t\n\n\t\t\tx := 0\n\t\t\tconst s = `\nfoo\n`\n\n\n",     // no indentation added inside raw strings
-	"\n\t\t\n\n\t\t\tx := 0\n\t\t\tconst s = `\n\t\tfoo\n`\n\n\n", // no indentation removed inside raw strings
-
-	// comments
-	"i := 5 /* Comment */",         // Issue 5551.
-	"\ta()\n//line :1",             // Issue 11276.
-	"\t//xxx\n\ta()\n//line :2",    // Issue 11276.
-	"\ta() //line :1\n\tb()\n",     // Issue 11276.
-	"x := 0\n//line :1\n//line :2", // Issue 11276.
-
-	// erroneous programs
-	"ERROR1 + 2 +",
-	"ERRORx :=  0",
-}
-
-func String(s string) (string, error) {
-	res, err := Source([]byte(s))
-	if err != nil {
-		return "", err
-	}
-	return string(res), nil
-}
-
-func TestPartial(t *testing.T) {
-	for _, src := range tests {
-		if strings.HasPrefix(src, "ERROR") {
-			// test expected to fail
-			src = src[5:] // remove ERROR prefix
-			res, err := String(src)
-			if err == nil && res == src {
-				t.Errorf("formatting succeeded but was expected to fail:\n%q", src)
-			}
-		} else {
-			// test expected to succeed
-			res, err := String(src)
-			if err != nil {
-				t.Errorf("formatting failed (%s):\n%q", err, src)
-			} else if res != src {
-				t.Errorf("formatting incorrect:\nsource: %q\nresult: %q", src, res)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/importer/importer.go b/third_party/gofrontend/libgo/go/go/importer/importer.go
deleted file mode 100644
index 4590ca3..0000000
--- a/third_party/gofrontend/libgo/go/go/importer/importer.go
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package importer provides access to export data importers.
-package importer
-
-import (
-	"go/internal/gccgoimporter"
-	"go/internal/gcimporter"
-	"go/types"
-	"io"
-	"runtime"
-)
-
-// A Lookup function returns a reader to access package data for
-// a given import path, or an error if no matching package is found.
-type Lookup func(path string) (io.ReadCloser, error)
-
-// For returns an Importer for the given compiler and lookup interface,
-// or nil. Supported compilers are "gc", and "gccgo". If lookup is nil,
-// the default package lookup mechanism for the given compiler is used.
-func For(compiler string, lookup Lookup) types.Importer {
-	switch compiler {
-	case "gc":
-		if lookup == nil {
-			return make(gcimports)
-		}
-		panic("gc importer for custom import path lookup not yet implemented")
-	case "gccgo":
-		if lookup == nil {
-			var inst gccgoimporter.GccgoInstallation
-			if err := inst.InitFromDriver("gccgo"); err != nil {
-				return nil
-			}
-			return &gccgoimports{
-				packages: make(map[string]*types.Package),
-				importer: inst.GetImporter(nil, nil),
-			}
-		}
-		panic("gccgo importer for custom import path lookup not yet implemented")
-	}
-	// compiler not supported
-	return nil
-}
-
-// Default returns an Importer for the compiler that built the running binary.
-func Default() types.Importer {
-	return For(runtime.Compiler, nil)
-}
-
-// gc support
-
-type gcimports map[string]*types.Package
-
-func (m gcimports) Import(path string) (*types.Package, error) {
-	return gcimporter.Import(m, path)
-}
-
-// gccgo support
-
-type gccgoimports struct {
-	packages map[string]*types.Package
-	importer gccgoimporter.Importer
-}
-
-func (m *gccgoimports) Import(path string) (*types.Package, error) {
-	return m.importer(m.packages, path)
-}
diff --git a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/gccgoinstallation.go b/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/gccgoinstallation.go
deleted file mode 100644
index 622dfc8..0000000
--- a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/gccgoinstallation.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-import (
-	"bufio"
-	"go/types"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-)
-
-// Information about a specific installation of gccgo.
-type GccgoInstallation struct {
-	// Version of gcc (e.g. 4.8.0).
-	GccVersion string
-
-	// Target triple (e.g. x86_64-unknown-linux-gnu).
-	TargetTriple string
-
-	// Built-in library paths used by this installation.
-	LibPaths []string
-}
-
-// Ask the driver at the given path for information for this GccgoInstallation.
-func (inst *GccgoInstallation) InitFromDriver(gccgoPath string) (err error) {
-	cmd := exec.Command(gccgoPath, "-###", "-S", "-x", "go", "-")
-	stderr, err := cmd.StderrPipe()
-	if err != nil {
-		return
-	}
-
-	err = cmd.Start()
-	if err != nil {
-		return
-	}
-
-	scanner := bufio.NewScanner(stderr)
-	for scanner.Scan() {
-		line := scanner.Text()
-		switch {
-		case strings.HasPrefix(line, "Target: "):
-			inst.TargetTriple = line[8:]
-
-		case line[0] == ' ':
-			args := strings.Fields(line)
-			for _, arg := range args[1:] {
-				if strings.HasPrefix(arg, "-L") {
-					inst.LibPaths = append(inst.LibPaths, arg[2:])
-				}
-			}
-		}
-	}
-
-	stdout, err := exec.Command(gccgoPath, "-dumpversion").Output()
-	if err != nil {
-		return
-	}
-	inst.GccVersion = strings.TrimSpace(string(stdout))
-
-	return
-}
-
-// Return the list of export search paths for this GccgoInstallation.
-func (inst *GccgoInstallation) SearchPaths() (paths []string) {
-	for _, lpath := range inst.LibPaths {
-		spath := filepath.Join(lpath, "go", inst.GccVersion)
-		fi, err := os.Stat(spath)
-		if err != nil || !fi.IsDir() {
-			continue
-		}
-		paths = append(paths, spath)
-
-		spath = filepath.Join(spath, inst.TargetTriple)
-		fi, err = os.Stat(spath)
-		if err != nil || !fi.IsDir() {
-			continue
-		}
-		paths = append(paths, spath)
-	}
-
-	paths = append(paths, inst.LibPaths...)
-
-	return
-}
-
-// Return an importer that searches incpaths followed by the gcc installation's
-// built-in search paths and the current directory.
-func (inst *GccgoInstallation) GetImporter(incpaths []string, initmap map[*types.Package]InitData) Importer {
-	return GetImporter(append(append(incpaths, inst.SearchPaths()...), "."), initmap)
-}
diff --git a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/gccgoinstallation_test.go b/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/gccgoinstallation_test.go
deleted file mode 100644
index a2acaf7..0000000
--- a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/gccgoinstallation_test.go
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-import (
-	"go/types"
-	"runtime"
-	"testing"
-)
-
-var importablePackages = [...]string{
-	"archive/tar",
-	"archive/zip",
-	"bufio",
-	"bytes",
-	"compress/bzip2",
-	"compress/flate",
-	"compress/gzip",
-	"compress/lzw",
-	"compress/zlib",
-	"container/heap",
-	"container/list",
-	"container/ring",
-	"crypto/aes",
-	"crypto/cipher",
-	"crypto/des",
-	"crypto/dsa",
-	"crypto/ecdsa",
-	"crypto/elliptic",
-	"crypto",
-	"crypto/hmac",
-	"crypto/md5",
-	"crypto/rand",
-	"crypto/rc4",
-	"crypto/rsa",
-	"crypto/sha1",
-	"crypto/sha256",
-	"crypto/sha512",
-	"crypto/subtle",
-	"crypto/tls",
-	"crypto/x509",
-	"crypto/x509/pkix",
-	"database/sql/driver",
-	"database/sql",
-	"debug/dwarf",
-	"debug/elf",
-	"debug/gosym",
-	"debug/macho",
-	"debug/pe",
-	"encoding/ascii85",
-	"encoding/asn1",
-	"encoding/base32",
-	"encoding/base64",
-	"encoding/binary",
-	"encoding/csv",
-	"encoding/gob",
-	"encoding",
-	"encoding/hex",
-	"encoding/json",
-	"encoding/pem",
-	"encoding/xml",
-	"errors",
-	"exp/proxy",
-	"exp/terminal",
-	"expvar",
-	"flag",
-	"fmt",
-	"go/ast",
-	"go/build",
-	"go/doc",
-	"go/format",
-	"go/parser",
-	"go/printer",
-	"go/scanner",
-	"go/token",
-	"hash/adler32",
-	"hash/crc32",
-	"hash/crc64",
-	"hash/fnv",
-	"hash",
-	"html",
-	"html/template",
-	"image/color",
-	"image/color/palette",
-	"image/draw",
-	"image/gif",
-	"image",
-	"image/jpeg",
-	"image/png",
-	"index/suffixarray",
-	"io",
-	"io/ioutil",
-	"log",
-	"log/syslog",
-	"math/big",
-	"math/cmplx",
-	"math",
-	"math/rand",
-	"mime",
-	"mime/multipart",
-	"net",
-	"net/http/cgi",
-	"net/http/cookiejar",
-	"net/http/fcgi",
-	"net/http",
-	"net/http/httptest",
-	"net/http/httputil",
-	"net/http/pprof",
-	"net/mail",
-	"net/rpc",
-	"net/rpc/jsonrpc",
-	"net/smtp",
-	"net/textproto",
-	"net/url",
-	"old/regexp",
-	"old/template",
-	"os/exec",
-	"os",
-	"os/signal",
-	"os/user",
-	"path/filepath",
-	"path",
-	"reflect",
-	"regexp",
-	"regexp/syntax",
-	"runtime/debug",
-	"runtime",
-	"runtime/pprof",
-	"sort",
-	"strconv",
-	"strings",
-	"sync/atomic",
-	"sync",
-	"syscall",
-	"testing",
-	"testing/iotest",
-	"testing/quick",
-	"text/scanner",
-	"text/tabwriter",
-	"text/template",
-	"text/template/parse",
-	"time",
-	"unicode",
-	"unicode/utf16",
-	"unicode/utf8",
-}
-
-func TestInstallationImporter(t *testing.T) {
-	// This test relies on gccgo being around, which it most likely will be if we
-	// were compiled with gccgo.
-	if runtime.Compiler != "gccgo" {
-		t.Skip("This test needs gccgo")
-		return
-	}
-
-	// Even when we have gccgo, this doesn't work while building
-	// gccgo itself.
-	t.Skip("gccgo is not necessarily available")
-
-	var inst GccgoInstallation
-	err := inst.InitFromDriver("gccgo")
-	if err != nil {
-		t.Fatal(err)
-	}
-	imp := inst.GetImporter(nil, nil)
-
-	// Ensure we don't regress the number of packages we can parse. First import
-	// all packages into the same map and then each individually.
-	pkgMap := make(map[string]*types.Package)
-	for _, pkg := range importablePackages {
-		_, err = imp(pkgMap, pkg)
-		if err != nil {
-			t.Error(err)
-		}
-	}
-
-	for _, pkg := range importablePackages {
-		_, err = imp(make(map[string]*types.Package), pkg)
-		if err != nil {
-			t.Error(err)
-		}
-	}
-
-	// Test for certain specific entities in the imported data.
-	for _, test := range [...]importerTest{
-		{pkgpath: "io", name: "Reader", want: "type Reader interface{Read(p []uint8) (n int, err error)}"},
-		{pkgpath: "io", name: "ReadWriter", want: "type ReadWriter interface{Reader; Writer}"},
-		{pkgpath: "math", name: "Pi", want: "const Pi untyped float"},
-		{pkgpath: "math", name: "Sin", want: "func Sin(x float64) float64"},
-		{pkgpath: "sort", name: "Ints", want: "func Ints(a []int)"},
-		{pkgpath: "unsafe", name: "Pointer", want: "type Pointer unsafe.Pointer"},
-	} {
-		runImporterTest(t, imp, nil, &test)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/importer.go b/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/importer.go
deleted file mode 100644
index aa0d01a..0000000
--- a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/importer.go
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package gccgoimporter implements Import for gccgo-generated object files.
-package gccgoimporter // import "go/internal/gccgoimporter"
-
-import (
-	"bytes"
-	"debug/elf"
-	"fmt"
-	"go/types"
-	"io"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-)
-
-// A PackageInit describes an imported package that needs initialization.
-type PackageInit struct {
-	Name     string // short package name
-	InitFunc string // name of init function
-	Priority int    // priority of init function, see InitData.Priority
-}
-
-// The gccgo-specific init data for a package.
-type InitData struct {
-	// Initialization priority of this package relative to other packages.
-	// This is based on the maximum depth of the package's dependency graph;
-	// it is guaranteed to be greater than that of its dependencies.
-	Priority int
-
-	// The list of packages which this package depends on to be initialized,
-	// including itself if needed. This is the subset of the transitive closure of
-	// the package's dependencies that need initialization.
-	Inits []PackageInit
-}
-
-// Locate the file from which to read export data.
-// This is intended to replicate the logic in gofrontend.
-func findExportFile(searchpaths []string, pkgpath string) (string, error) {
-	for _, spath := range searchpaths {
-		pkgfullpath := filepath.Join(spath, pkgpath)
-		pkgdir, name := filepath.Split(pkgfullpath)
-
-		for _, filepath := range [...]string{
-			pkgfullpath,
-			pkgfullpath + ".gox",
-			pkgdir + "lib" + name + ".so",
-			pkgdir + "lib" + name + ".a",
-			pkgfullpath + ".o",
-		} {
-			fi, err := os.Stat(filepath)
-			if err == nil && !fi.IsDir() {
-				return filepath, nil
-			}
-		}
-	}
-
-	return "", fmt.Errorf("%s: could not find export data (tried %s)", pkgpath, strings.Join(searchpaths, ":"))
-}
-
-const (
-	gccgov1Magic    = "v1;\n"
-	goimporterMagic = "\n$$ "
-	archiveMagic    = "!<ar"
-)
-
-// Opens the export data file at the given path. If this is an ELF file,
-// searches for and opens the .go_export section. If this is an archive,
-// reads the export data from the first member, which is assumed to be an ELF file.
-// This is intended to replicate the logic in gofrontend.
-func openExportFile(fpath string) (reader io.ReadSeeker, closer io.Closer, err error) {
-	f, err := os.Open(fpath)
-	if err != nil {
-		return
-	}
-	closer = f
-	defer func() {
-		if err != nil && closer != nil {
-			f.Close()
-		}
-	}()
-
-	var magic [4]byte
-	_, err = f.ReadAt(magic[:], 0)
-	if err != nil {
-		return
-	}
-	// reset to offset 0 - needed on Plan 9 (see issue #11265)
-	// TODO: remove once issue #11265 has been resolved.
-	_, err = f.Seek(0, 0)
-	if err != nil {
-		return
-	}
-
-	var elfreader io.ReaderAt
-	switch string(magic[:]) {
-	case gccgov1Magic, goimporterMagic:
-		// Raw export data.
-		reader = f
-		return
-
-	case archiveMagic:
-		// TODO(pcc): Read the archive directly instead of using "ar".
-		f.Close()
-		closer = nil
-
-		cmd := exec.Command("ar", "p", fpath)
-		var out []byte
-		out, err = cmd.Output()
-		if err != nil {
-			return
-		}
-
-		elfreader = bytes.NewReader(out)
-
-	default:
-		elfreader = f
-	}
-
-	ef, err := elf.NewFile(elfreader)
-	if err != nil {
-		return
-	}
-
-	sec := ef.Section(".go_export")
-	if sec == nil {
-		err = fmt.Errorf("%s: .go_export section not found", fpath)
-		return
-	}
-
-	reader = sec.Open()
-	return
-}
-
-// An Importer resolves import paths to Packages. The imports map records
-// packages already known, indexed by package path.
-// An importer must determine the canonical package path and check imports
-// to see if it is already present in the map. If so, the Importer can return
-// the map entry. Otherwise, the importer must load the package data for the
-// given path into a new *Package, record it in imports map, and return the
-// package.
-type Importer func(imports map[string]*types.Package, path string) (*types.Package, error)
-
-func GetImporter(searchpaths []string, initmap map[*types.Package]InitData) Importer {
-	return func(imports map[string]*types.Package, pkgpath string) (pkg *types.Package, err error) {
-		if pkgpath == "unsafe" {
-			return types.Unsafe, nil
-		}
-
-		fpath, err := findExportFile(searchpaths, pkgpath)
-		if err != nil {
-			return
-		}
-
-		reader, closer, err := openExportFile(fpath)
-		if err != nil {
-			return
-		}
-		if closer != nil {
-			defer closer.Close()
-		}
-
-		var magic [4]byte
-		_, err = reader.Read(magic[:])
-		if err != nil {
-			return
-		}
-		_, err = reader.Seek(0, 0)
-		if err != nil {
-			return
-		}
-
-		switch string(magic[:]) {
-		case gccgov1Magic:
-			var p parser
-			p.init(fpath, reader, imports)
-			pkg = p.parsePackage()
-			if initmap != nil {
-				initmap[pkg] = p.initdata
-			}
-
-		// Excluded for now: Standard gccgo doesn't support this import format currently.
-		// case goimporterMagic:
-		// 	var data []byte
-		// 	data, err = ioutil.ReadAll(reader)
-		// 	if err != nil {
-		// 		return
-		// 	}
-		// 	var n int
-		// 	n, pkg, err = importer.ImportData(imports, data)
-		// 	if err != nil {
-		// 		return
-		// 	}
-
-		// 	if initmap != nil {
-		// 		suffixreader := bytes.NewReader(data[n:])
-		// 		var p parser
-		// 		p.init(fpath, suffixreader, nil)
-		// 		p.parseInitData()
-		// 		initmap[pkg] = p.initdata
-		// 	}
-
-		default:
-			err = fmt.Errorf("unrecognized magic string: %q", string(magic[:]))
-		}
-
-		return
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/importer_test.go b/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/importer_test.go
deleted file mode 100644
index f3bcadb..0000000
--- a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/importer_test.go
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-import (
-	"go/types"
-	"internal/testenv"
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"testing"
-)
-
-type importerTest struct {
-	pkgpath, name, want, wantval string
-	wantinits                    []string
-}
-
-func runImporterTest(t *testing.T, imp Importer, initmap map[*types.Package]InitData, test *importerTest) {
-	pkg, err := imp(make(map[string]*types.Package), test.pkgpath)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	if test.name != "" {
-		obj := pkg.Scope().Lookup(test.name)
-		if obj == nil {
-			t.Errorf("%s: object not found", test.name)
-			return
-		}
-
-		got := types.ObjectString(obj, types.RelativeTo(pkg))
-		if got != test.want {
-			t.Errorf("%s: got %q; want %q", test.name, got, test.want)
-		}
-
-		if test.wantval != "" {
-			gotval := obj.(*types.Const).Val().String()
-			if gotval != test.wantval {
-				t.Errorf("%s: got val %q; want val %q", test.name, gotval, test.wantval)
-			}
-		}
-	}
-
-	if len(test.wantinits) > 0 {
-		initdata := initmap[pkg]
-		found := false
-		// Check that the package's own init function has the package's priority
-		for _, pkginit := range initdata.Inits {
-			if pkginit.InitFunc == test.wantinits[0] {
-				if initdata.Priority != pkginit.Priority {
-					t.Errorf("%s: got self priority %d; want %d", test.pkgpath, pkginit.Priority, initdata.Priority)
-				}
-				found = true
-				break
-			}
-		}
-
-		if !found {
-			t.Errorf("%s: could not find expected function %q", test.pkgpath, test.wantinits[0])
-		}
-
-		// Each init function in the list other than the first one is a
-		// dependency of the function immediately before it. Check that
-		// the init functions appear in descending priority order.
-		priority := initdata.Priority
-		for _, wantdepinit := range test.wantinits[1:] {
-			found = false
-			for _, pkginit := range initdata.Inits {
-				if pkginit.InitFunc == wantdepinit {
-					if priority <= pkginit.Priority {
-						t.Errorf("%s: got dep priority %d; want less than %d", test.pkgpath, pkginit.Priority, priority)
-					}
-					found = true
-					priority = pkginit.Priority
-					break
-				}
-			}
-
-			if !found {
-				t.Errorf("%s: could not find expected function %q", test.pkgpath, wantdepinit)
-			}
-		}
-	}
-}
-
-var importerTests = [...]importerTest{
-	{pkgpath: "pointer", name: "Int8Ptr", want: "type Int8Ptr *int8"},
-	{pkgpath: "complexnums", name: "NN", want: "const NN untyped complex", wantval: "(-1/1 + -1/1i)"},
-	{pkgpath: "complexnums", name: "NP", want: "const NP untyped complex", wantval: "(-1/1 + 1/1i)"},
-	{pkgpath: "complexnums", name: "PN", want: "const PN untyped complex", wantval: "(1/1 + -1/1i)"},
-	{pkgpath: "complexnums", name: "PP", want: "const PP untyped complex", wantval: "(1/1 + 1/1i)"},
-	// TODO: enable this entry once bug has been tracked down
-	//{pkgpath: "imports", wantinits: []string{"imports..import", "fmt..import", "math..import"}},
-}
-
-func TestGoxImporter(t *testing.T) {
-	testenv.MustHaveGoBuild(t)
-
-	initmap := make(map[*types.Package]InitData)
-	imp := GetImporter([]string{"testdata"}, initmap)
-
-	for _, test := range importerTests {
-		runImporterTest(t, imp, initmap, &test)
-	}
-}
-
-func TestObjImporter(t *testing.T) {
-	testenv.MustHaveGoBuild(t)
-
-	// This test relies on gccgo being around, which it most likely will be if we
-	// were compiled with gccgo.
-	if runtime.Compiler != "gccgo" {
-		t.Skip("This test needs gccgo")
-		return
-	}
-
-	tmpdir, err := ioutil.TempDir("", "")
-	if err != nil {
-		t.Fatal(err)
-	}
-	initmap := make(map[*types.Package]InitData)
-	imp := GetImporter([]string{tmpdir}, initmap)
-
-	artmpdir, err := ioutil.TempDir("", "")
-	if err != nil {
-		t.Fatal(err)
-	}
-	arinitmap := make(map[*types.Package]InitData)
-	arimp := GetImporter([]string{artmpdir}, arinitmap)
-
-	for _, test := range importerTests {
-		gofile := filepath.Join("testdata", test.pkgpath+".go")
-		ofile := filepath.Join(tmpdir, test.pkgpath+".o")
-		afile := filepath.Join(artmpdir, "lib"+test.pkgpath+".a")
-
-		cmd := exec.Command("gccgo", "-fgo-pkgpath="+test.pkgpath, "-c", "-o", ofile, gofile)
-		out, err := cmd.CombinedOutput()
-		if err != nil {
-			t.Logf("%s", out)
-			t.Fatalf("gccgo %s failed: %s", gofile, err)
-		}
-
-		runImporterTest(t, imp, initmap, &test)
-
-		cmd = exec.Command("ar", "cr", afile, ofile)
-		out, err = cmd.CombinedOutput()
-		if err != nil {
-			t.Logf("%s", out)
-			t.Fatalf("ar cr %s %s failed: %s", afile, ofile, err)
-		}
-
-		runImporterTest(t, arimp, arinitmap, &test)
-
-		if err = os.Remove(ofile); err != nil {
-			t.Fatal(err)
-		}
-		if err = os.Remove(afile); err != nil {
-			t.Fatal(err)
-		}
-	}
-
-	if err = os.Remove(tmpdir); err != nil {
-		t.Fatal(err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/parser.go b/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/parser.go
deleted file mode 100644
index c06cce4..0000000
--- a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/parser.go
+++ /dev/null
@@ -1,855 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"go/constant"
-	"go/token"
-	"go/types"
-	"io"
-	"strconv"
-	"strings"
-	"text/scanner"
-)
-
-type parser struct {
-	scanner  scanner.Scanner
-	tok      rune                      // current token
-	lit      string                    // literal string; only valid for Ident, Int, String tokens
-	pkgpath  string                    // package path of imported package
-	pkgname  string                    // name of imported package
-	pkg      *types.Package            // reference to imported package
-	imports  map[string]*types.Package // package path -> package object
-	typeMap  map[int]types.Type        // type number -> type
-	initdata InitData                  // package init priority data
-}
-
-func (p *parser) init(filename string, src io.Reader, imports map[string]*types.Package) {
-	p.scanner.Init(src)
-	p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) }
-	p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanFloats | scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments
-	p.scanner.Whitespace = 1<<'\t' | 1<<'\n' | 1<<' '
-	p.scanner.Filename = filename // for good error messages
-	p.next()
-	p.imports = imports
-	p.typeMap = make(map[int]types.Type)
-}
-
-type importError struct {
-	pos scanner.Position
-	err error
-}
-
-func (e importError) Error() string {
-	return fmt.Sprintf("import error %s (byte offset = %d): %s", e.pos, e.pos.Offset, e.err)
-}
-
-func (p *parser) error(err interface{}) {
-	if s, ok := err.(string); ok {
-		err = errors.New(s)
-	}
-	// panic with a runtime.Error if err is not an error
-	panic(importError{p.scanner.Pos(), err.(error)})
-}
-
-func (p *parser) errorf(format string, args ...interface{}) {
-	p.error(fmt.Errorf(format, args...))
-}
-
-func (p *parser) expect(tok rune) string {
-	lit := p.lit
-	if p.tok != tok {
-		p.errorf("expected %s, got %s (%s)", scanner.TokenString(tok), scanner.TokenString(p.tok), lit)
-	}
-	p.next()
-	return lit
-}
-
-func (p *parser) expectKeyword(keyword string) {
-	lit := p.expect(scanner.Ident)
-	if lit != keyword {
-		p.errorf("expected keyword %s, got %q", keyword, lit)
-	}
-}
-
-func (p *parser) parseString() string {
-	str, err := strconv.Unquote(p.expect(scanner.String))
-	if err != nil {
-		p.error(err)
-	}
-	return str
-}
-
-// unquotedString     = { unquotedStringChar } .
-// unquotedStringChar = <neither a whitespace nor a ';' char> .
-func (p *parser) parseUnquotedString() string {
-	if p.tok == scanner.EOF {
-		p.error("unexpected EOF")
-	}
-	var buf bytes.Buffer
-	buf.WriteString(p.scanner.TokenText())
-	// This loop needs to examine each character before deciding whether to consume it. If we see a semicolon,
-	// we need to let it be consumed by p.next().
-	for ch := p.scanner.Peek(); ch != ';' && ch != scanner.EOF && p.scanner.Whitespace&(1<<uint(ch)) == 0; ch = p.scanner.Peek() {
-		buf.WriteRune(ch)
-		p.scanner.Next()
-	}
-	p.next()
-	return buf.String()
-}
-
-func (p *parser) next() {
-	p.tok = p.scanner.Scan()
-	switch p.tok {
-	case scanner.Ident, scanner.Int, scanner.Float, scanner.String, '·':
-		p.lit = p.scanner.TokenText()
-	default:
-		p.lit = ""
-	}
-}
-
-func (p *parser) parseQualifiedName() (path, name string) {
-	return p.parseQualifiedNameStr(p.parseString())
-}
-
-func (p *parser) parseUnquotedQualifiedName() (path, name string) {
-	return p.parseQualifiedNameStr(p.parseUnquotedString())
-}
-
-// qualifiedName = [ ["."] unquotedString "." ] unquotedString .
-//
-// The above production uses greedy matching.
-func (p *parser) parseQualifiedNameStr(unquotedName string) (pkgpath, name string) {
-	parts := strings.Split(unquotedName, ".")
-	if parts[0] == "" {
-		parts = parts[1:]
-	}
-
-	switch len(parts) {
-	case 0:
-		p.errorf("malformed qualified name: %q", unquotedName)
-	case 1:
-		// unqualified name
-		pkgpath = p.pkgpath
-		name = parts[0]
-	default:
-		// qualified name, which may contain periods
-		pkgpath = strings.Join(parts[0:len(parts)-1], ".")
-		name = parts[len(parts)-1]
-	}
-
-	return
-}
-
-// getPkg returns the package for a given path. If the package is
-// not found but we have a package name, create the package and
-// add it to the p.imports map.
-//
-func (p *parser) getPkg(pkgpath, name string) *types.Package {
-	// package unsafe is not in the imports map - handle explicitly
-	if pkgpath == "unsafe" {
-		return types.Unsafe
-	}
-	pkg := p.imports[pkgpath]
-	if pkg == nil && name != "" {
-		pkg = types.NewPackage(pkgpath, name)
-		p.imports[pkgpath] = pkg
-	}
-	return pkg
-}
-
-// parseExportedName is like parseQualifiedName, but
-// the package path is resolved to an imported *types.Package.
-//
-// ExportedName = string [string] .
-func (p *parser) parseExportedName() (pkg *types.Package, name string) {
-	path, name := p.parseQualifiedName()
-	var pkgname string
-	if p.tok == scanner.String {
-		pkgname = p.parseString()
-	}
-	pkg = p.getPkg(path, pkgname)
-	if pkg == nil {
-		p.errorf("package %s (path = %q) not found", name, path)
-	}
-	return
-}
-
-// Name = QualifiedName | "?" .
-func (p *parser) parseName() string {
-	if p.tok == '?' {
-		// Anonymous.
-		p.next()
-		return ""
-	}
-	// The package path is redundant for us. Don't try to parse it.
-	_, name := p.parseUnquotedQualifiedName()
-	return name
-}
-
-func deref(typ types.Type) types.Type {
-	if p, _ := typ.(*types.Pointer); p != nil {
-		typ = p.Elem()
-	}
-	return typ
-}
-
-// Field = Name Type [string] .
-func (p *parser) parseField(pkg *types.Package) (field *types.Var, tag string) {
-	name := p.parseName()
-	typ := p.parseType(pkg)
-	anon := false
-	if name == "" {
-		anon = true
-		switch typ := deref(typ).(type) {
-		case *types.Basic:
-			name = typ.Name()
-		case *types.Named:
-			name = typ.Obj().Name()
-		default:
-			p.error("anonymous field expected")
-		}
-	}
-	field = types.NewField(token.NoPos, pkg, name, typ, anon)
-	if p.tok == scanner.String {
-		tag = p.parseString()
-	}
-	return
-}
-
-// Param = Name ["..."] Type .
-func (p *parser) parseParam(pkg *types.Package) (param *types.Var, isVariadic bool) {
-	name := p.parseName()
-	if p.tok == '.' {
-		p.next()
-		p.expect('.')
-		p.expect('.')
-		isVariadic = true
-	}
-	typ := p.parseType(pkg)
-	if isVariadic {
-		typ = types.NewSlice(typ)
-	}
-	param = types.NewParam(token.NoPos, pkg, name, typ)
-	return
-}
-
-// Var = Name Type .
-func (p *parser) parseVar(pkg *types.Package) *types.Var {
-	name := p.parseName()
-	return types.NewVar(token.NoPos, pkg, name, p.parseType(pkg))
-}
-
-// ConstValue     = string | "false" | "true" | ["-"] (int ["'"] | FloatOrComplex) .
-// FloatOrComplex = float ["i" | ("+"|"-") float "i"] .
-func (p *parser) parseConstValue() (val constant.Value, typ types.Type) {
-	switch p.tok {
-	case scanner.String:
-		str := p.parseString()
-		val = constant.MakeString(str)
-		typ = types.Typ[types.UntypedString]
-		return
-
-	case scanner.Ident:
-		b := false
-		switch p.lit {
-		case "false":
-		case "true":
-			b = true
-
-		default:
-			p.errorf("expected const value, got %s (%q)", scanner.TokenString(p.tok), p.lit)
-		}
-
-		p.next()
-		val = constant.MakeBool(b)
-		typ = types.Typ[types.UntypedBool]
-		return
-	}
-
-	sign := ""
-	if p.tok == '-' {
-		p.next()
-		sign = "-"
-	}
-
-	switch p.tok {
-	case scanner.Int:
-		val = constant.MakeFromLiteral(sign+p.lit, token.INT, 0)
-		if val == nil {
-			p.error("could not parse integer literal")
-		}
-
-		p.next()
-		if p.tok == '\'' {
-			p.next()
-			typ = types.Typ[types.UntypedRune]
-		} else {
-			typ = types.Typ[types.UntypedInt]
-		}
-
-	case scanner.Float:
-		re := sign + p.lit
-		p.next()
-
-		var im string
-		switch p.tok {
-		case '+':
-			p.next()
-			im = p.expect(scanner.Float)
-
-		case '-':
-			p.next()
-			im = "-" + p.expect(scanner.Float)
-
-		case scanner.Ident:
-			// re is in fact the imaginary component. Expect "i" below.
-			im = re
-			re = "0"
-
-		default:
-			val = constant.MakeFromLiteral(re, token.FLOAT, 0)
-			if val == nil {
-				p.error("could not parse float literal")
-			}
-			typ = types.Typ[types.UntypedFloat]
-			return
-		}
-
-		p.expectKeyword("i")
-		reval := constant.MakeFromLiteral(re, token.FLOAT, 0)
-		if reval == nil {
-			p.error("could not parse real component of complex literal")
-		}
-		imval := constant.MakeFromLiteral(im+"i", token.IMAG, 0)
-		if imval == nil {
-			p.error("could not parse imag component of complex literal")
-		}
-		val = constant.BinaryOp(reval, token.ADD, imval)
-		typ = types.Typ[types.UntypedComplex]
-
-	default:
-		p.errorf("expected const value, got %s (%q)", scanner.TokenString(p.tok), p.lit)
-	}
-
-	return
-}
-
-// Const = Name [Type] "=" ConstValue .
-func (p *parser) parseConst(pkg *types.Package) *types.Const {
-	name := p.parseName()
-	var typ types.Type
-	if p.tok == '<' {
-		typ = p.parseType(pkg)
-	}
-	p.expect('=')
-	val, vtyp := p.parseConstValue()
-	if typ == nil {
-		typ = vtyp
-	}
-	return types.NewConst(token.NoPos, pkg, name, typ, val)
-}
-
-// TypeName = ExportedName .
-func (p *parser) parseTypeName() *types.TypeName {
-	pkg, name := p.parseExportedName()
-	scope := pkg.Scope()
-	if obj := scope.Lookup(name); obj != nil {
-		return obj.(*types.TypeName)
-	}
-	obj := types.NewTypeName(token.NoPos, pkg, name, nil)
-	// a named type may be referred to before the underlying type
-	// is known - set it up
-	types.NewNamed(obj, nil, nil)
-	scope.Insert(obj)
-	return obj
-}
-
-// NamedType = TypeName Type { Method } .
-// Method    = "func" "(" Param ")" Name ParamList ResultList ";" .
-func (p *parser) parseNamedType(n int) types.Type {
-	obj := p.parseTypeName()
-
-	pkg := obj.Pkg()
-	typ := obj.Type()
-	p.typeMap[n] = typ
-
-	nt, ok := typ.(*types.Named)
-	if !ok {
-		// This can happen for unsafe.Pointer, which is a TypeName holding a Basic type.
-		pt := p.parseType(pkg)
-		if pt != typ {
-			p.error("unexpected underlying type for non-named TypeName")
-		}
-		return typ
-	}
-
-	underlying := p.parseType(pkg)
-	if nt.Underlying() == nil {
-		nt.SetUnderlying(underlying.Underlying())
-	}
-
-	for p.tok == scanner.Ident {
-		// collect associated methods
-		p.expectKeyword("func")
-		p.expect('(')
-		receiver, _ := p.parseParam(pkg)
-		p.expect(')')
-		name := p.parseName()
-		params, isVariadic := p.parseParamList(pkg)
-		results := p.parseResultList(pkg)
-		p.expect(';')
-
-		sig := types.NewSignature(receiver, params, results, isVariadic)
-		nt.AddMethod(types.NewFunc(token.NoPos, pkg, name, sig))
-	}
-
-	return nt
-}
-
-func (p *parser) parseInt() int64 {
-	lit := p.expect(scanner.Int)
-	n, err := strconv.ParseInt(lit, 10, 0)
-	if err != nil {
-		p.error(err)
-	}
-	return n
-}
-
-// ArrayOrSliceType = "[" [ int ] "]" Type .
-func (p *parser) parseArrayOrSliceType(pkg *types.Package) types.Type {
-	p.expect('[')
-	if p.tok == ']' {
-		p.next()
-		return types.NewSlice(p.parseType(pkg))
-	}
-
-	n := p.parseInt()
-	p.expect(']')
-	return types.NewArray(p.parseType(pkg), n)
-}
-
-// MapType = "map" "[" Type "]" Type .
-func (p *parser) parseMapType(pkg *types.Package) types.Type {
-	p.expectKeyword("map")
-	p.expect('[')
-	key := p.parseType(pkg)
-	p.expect(']')
-	elem := p.parseType(pkg)
-	return types.NewMap(key, elem)
-}
-
-// ChanType = "chan" ["<-" | "-<"] Type .
-func (p *parser) parseChanType(pkg *types.Package) types.Type {
-	p.expectKeyword("chan")
-	dir := types.SendRecv
-	switch p.tok {
-	case '-':
-		p.next()
-		p.expect('<')
-		dir = types.SendOnly
-
-	case '<':
-		// don't consume '<' if it belongs to Type
-		if p.scanner.Peek() == '-' {
-			p.next()
-			p.expect('-')
-			dir = types.RecvOnly
-		}
-	}
-
-	return types.NewChan(dir, p.parseType(pkg))
-}
-
-// StructType = "struct" "{" { Field } "}" .
-func (p *parser) parseStructType(pkg *types.Package) types.Type {
-	p.expectKeyword("struct")
-
-	var fields []*types.Var
-	var tags []string
-
-	p.expect('{')
-	for p.tok != '}' && p.tok != scanner.EOF {
-		field, tag := p.parseField(pkg)
-		p.expect(';')
-		fields = append(fields, field)
-		tags = append(tags, tag)
-	}
-	p.expect('}')
-
-	return types.NewStruct(fields, tags)
-}
-
-// ParamList = "(" [ { Parameter "," } Parameter ] ")" .
-func (p *parser) parseParamList(pkg *types.Package) (*types.Tuple, bool) {
-	var list []*types.Var
-	isVariadic := false
-
-	p.expect('(')
-	for p.tok != ')' && p.tok != scanner.EOF {
-		if len(list) > 0 {
-			p.expect(',')
-		}
-		par, variadic := p.parseParam(pkg)
-		list = append(list, par)
-		if variadic {
-			if isVariadic {
-				p.error("... not on final argument")
-			}
-			isVariadic = true
-		}
-	}
-	p.expect(')')
-
-	return types.NewTuple(list...), isVariadic
-}
-
-// ResultList = Type | ParamList .
-func (p *parser) parseResultList(pkg *types.Package) *types.Tuple {
-	switch p.tok {
-	case '<':
-		return types.NewTuple(types.NewParam(token.NoPos, pkg, "", p.parseType(pkg)))
-
-	case '(':
-		params, _ := p.parseParamList(pkg)
-		return params
-
-	default:
-		return nil
-	}
-}
-
-// FunctionType = ParamList ResultList .
-func (p *parser) parseFunctionType(pkg *types.Package) *types.Signature {
-	params, isVariadic := p.parseParamList(pkg)
-	results := p.parseResultList(pkg)
-	return types.NewSignature(nil, params, results, isVariadic)
-}
-
-// Func = Name FunctionType .
-func (p *parser) parseFunc(pkg *types.Package) *types.Func {
-	name := p.parseName()
-	if strings.ContainsRune(name, '$') {
-		// This is a Type$equal or Type$hash function, which we don't want to parse,
-		// except for the types.
-		p.discardDirectiveWhileParsingTypes(pkg)
-		return nil
-	}
-	return types.NewFunc(token.NoPos, pkg, name, p.parseFunctionType(pkg))
-}
-
-// InterfaceType = "interface" "{" { ("?" Type | Func) ";" } "}" .
-func (p *parser) parseInterfaceType(pkg *types.Package) types.Type {
-	p.expectKeyword("interface")
-
-	var methods []*types.Func
-	var typs []*types.Named
-
-	p.expect('{')
-	for p.tok != '}' && p.tok != scanner.EOF {
-		if p.tok == '?' {
-			p.next()
-			typs = append(typs, p.parseType(pkg).(*types.Named))
-		} else {
-			method := p.parseFunc(pkg)
-			methods = append(methods, method)
-		}
-		p.expect(';')
-	}
-	p.expect('}')
-
-	return types.NewInterface(methods, typs)
-}
-
-// PointerType = "*" ("any" | Type) .
-func (p *parser) parsePointerType(pkg *types.Package) types.Type {
-	p.expect('*')
-	if p.tok == scanner.Ident {
-		p.expectKeyword("any")
-		return types.Typ[types.UnsafePointer]
-	}
-	return types.NewPointer(p.parseType(pkg))
-}
-
-// TypeDefinition = NamedType | MapType | ChanType | StructType | InterfaceType | PointerType | ArrayOrSliceType | FunctionType .
-func (p *parser) parseTypeDefinition(pkg *types.Package, n int) types.Type {
-	var t types.Type
-	switch p.tok {
-	case scanner.String:
-		t = p.parseNamedType(n)
-
-	case scanner.Ident:
-		switch p.lit {
-		case "map":
-			t = p.parseMapType(pkg)
-
-		case "chan":
-			t = p.parseChanType(pkg)
-
-		case "struct":
-			t = p.parseStructType(pkg)
-
-		case "interface":
-			t = p.parseInterfaceType(pkg)
-		}
-
-	case '*':
-		t = p.parsePointerType(pkg)
-
-	case '[':
-		t = p.parseArrayOrSliceType(pkg)
-
-	case '(':
-		t = p.parseFunctionType(pkg)
-	}
-
-	p.typeMap[n] = t
-	return t
-}
-
-const (
-	// From gofrontend/go/export.h
-	// Note that these values are negative in the gofrontend and have been made positive
-	// in the gccgoimporter.
-	gccgoBuiltinINT8       = 1
-	gccgoBuiltinINT16      = 2
-	gccgoBuiltinINT32      = 3
-	gccgoBuiltinINT64      = 4
-	gccgoBuiltinUINT8      = 5
-	gccgoBuiltinUINT16     = 6
-	gccgoBuiltinUINT32     = 7
-	gccgoBuiltinUINT64     = 8
-	gccgoBuiltinFLOAT32    = 9
-	gccgoBuiltinFLOAT64    = 10
-	gccgoBuiltinINT        = 11
-	gccgoBuiltinUINT       = 12
-	gccgoBuiltinUINTPTR    = 13
-	gccgoBuiltinBOOL       = 15
-	gccgoBuiltinSTRING     = 16
-	gccgoBuiltinCOMPLEX64  = 17
-	gccgoBuiltinCOMPLEX128 = 18
-	gccgoBuiltinERROR      = 19
-	gccgoBuiltinBYTE       = 20
-	gccgoBuiltinRUNE       = 21
-)
-
-func lookupBuiltinType(typ int) types.Type {
-	return [...]types.Type{
-		gccgoBuiltinINT8:       types.Typ[types.Int8],
-		gccgoBuiltinINT16:      types.Typ[types.Int16],
-		gccgoBuiltinINT32:      types.Typ[types.Int32],
-		gccgoBuiltinINT64:      types.Typ[types.Int64],
-		gccgoBuiltinUINT8:      types.Typ[types.Uint8],
-		gccgoBuiltinUINT16:     types.Typ[types.Uint16],
-		gccgoBuiltinUINT32:     types.Typ[types.Uint32],
-		gccgoBuiltinUINT64:     types.Typ[types.Uint64],
-		gccgoBuiltinFLOAT32:    types.Typ[types.Float32],
-		gccgoBuiltinFLOAT64:    types.Typ[types.Float64],
-		gccgoBuiltinINT:        types.Typ[types.Int],
-		gccgoBuiltinUINT:       types.Typ[types.Uint],
-		gccgoBuiltinUINTPTR:    types.Typ[types.Uintptr],
-		gccgoBuiltinBOOL:       types.Typ[types.Bool],
-		gccgoBuiltinSTRING:     types.Typ[types.String],
-		gccgoBuiltinCOMPLEX64:  types.Typ[types.Complex64],
-		gccgoBuiltinCOMPLEX128: types.Typ[types.Complex128],
-		gccgoBuiltinERROR:      types.Universe.Lookup("error").Type(),
-		gccgoBuiltinBYTE:       types.Universe.Lookup("byte").Type(),
-		gccgoBuiltinRUNE:       types.Universe.Lookup("rune").Type(),
-	}[typ]
-}
-
-// Type = "<" "type" ( "-" int | int [ TypeDefinition ] ) ">" .
-func (p *parser) parseType(pkg *types.Package) (t types.Type) {
-	p.expect('<')
-	p.expectKeyword("type")
-
-	switch p.tok {
-	case scanner.Int:
-		n := p.parseInt()
-
-		if p.tok == '>' {
-			t = p.typeMap[int(n)]
-		} else {
-			t = p.parseTypeDefinition(pkg, int(n))
-		}
-
-	case '-':
-		p.next()
-		n := p.parseInt()
-		t = lookupBuiltinType(int(n))
-
-	default:
-		p.errorf("expected type number, got %s (%q)", scanner.TokenString(p.tok), p.lit)
-		return nil
-	}
-
-	p.expect('>')
-	return
-}
-
-// PackageInit = unquotedString unquotedString int .
-func (p *parser) parsePackageInit() PackageInit {
-	name := p.parseUnquotedString()
-	initfunc := p.parseUnquotedString()
-	priority := int(p.parseInt())
-	return PackageInit{Name: name, InitFunc: initfunc, Priority: priority}
-}
-
-// Throw away tokens until we see a ';'. If we see a '<', attempt to parse as a type.
-func (p *parser) discardDirectiveWhileParsingTypes(pkg *types.Package) {
-	for {
-		switch p.tok {
-		case ';':
-			return
-		case '<':
-			p.parseType(p.pkg)
-		case scanner.EOF:
-			p.error("unexpected EOF")
-		default:
-			p.next()
-		}
-	}
-}
-
-// Create the package if we have parsed both the package path and package name.
-func (p *parser) maybeCreatePackage() {
-	if p.pkgname != "" && p.pkgpath != "" {
-		p.pkg = p.getPkg(p.pkgpath, p.pkgname)
-	}
-}
-
-// InitDataDirective = "v1" ";" |
-//                     "priority" int ";" |
-//                     "init" { PackageInit } ";" |
-//                     "checksum" unquotedString ";" .
-func (p *parser) parseInitDataDirective() {
-	if p.tok != scanner.Ident {
-		// unexpected token kind; panic
-		p.expect(scanner.Ident)
-	}
-
-	switch p.lit {
-	case "v1":
-		p.next()
-		p.expect(';')
-
-	case "priority":
-		p.next()
-		p.initdata.Priority = int(p.parseInt())
-		p.expect(';')
-
-	case "init":
-		p.next()
-		for p.tok != ';' && p.tok != scanner.EOF {
-			p.initdata.Inits = append(p.initdata.Inits, p.parsePackageInit())
-		}
-		p.expect(';')
-
-	case "checksum":
-		// Don't let the scanner try to parse the checksum as a number.
-		defer func(mode uint) {
-			p.scanner.Mode = mode
-		}(p.scanner.Mode)
-		p.scanner.Mode &^= scanner.ScanInts | scanner.ScanFloats
-		p.next()
-		p.parseUnquotedString()
-		p.expect(';')
-
-	default:
-		p.errorf("unexpected identifier: %q", p.lit)
-	}
-}
-
-// Directive = InitDataDirective |
-//             "package" unquotedString ";" |
-//             "pkgpath" unquotedString ";" |
-//             "import" unquotedString unquotedString string ";" |
-//             "func" Func ";" |
-//             "type" Type ";" |
-//             "var" Var ";" |
-//             "const" Const ";" .
-func (p *parser) parseDirective() {
-	if p.tok != scanner.Ident {
-		// unexpected token kind; panic
-		p.expect(scanner.Ident)
-	}
-
-	switch p.lit {
-	case "v1", "priority", "init", "checksum":
-		p.parseInitDataDirective()
-
-	case "package":
-		p.next()
-		p.pkgname = p.parseUnquotedString()
-		p.maybeCreatePackage()
-		p.expect(';')
-
-	case "pkgpath":
-		p.next()
-		p.pkgpath = p.parseUnquotedString()
-		p.maybeCreatePackage()
-		p.expect(';')
-
-	case "import":
-		p.next()
-		pkgname := p.parseUnquotedString()
-		pkgpath := p.parseUnquotedString()
-		p.getPkg(pkgpath, pkgname)
-		p.parseString()
-		p.expect(';')
-
-	case "func":
-		p.next()
-		fun := p.parseFunc(p.pkg)
-		if fun != nil {
-			p.pkg.Scope().Insert(fun)
-		}
-		p.expect(';')
-
-	case "type":
-		p.next()
-		p.parseType(p.pkg)
-		p.expect(';')
-
-	case "var":
-		p.next()
-		v := p.parseVar(p.pkg)
-		p.pkg.Scope().Insert(v)
-		p.expect(';')
-
-	case "const":
-		p.next()
-		c := p.parseConst(p.pkg)
-		p.pkg.Scope().Insert(c)
-		p.expect(';')
-
-	default:
-		p.errorf("unexpected identifier: %q", p.lit)
-	}
-}
-
-// Package = { Directive } .
-func (p *parser) parsePackage() *types.Package {
-	for p.tok != scanner.EOF {
-		p.parseDirective()
-	}
-	for _, typ := range p.typeMap {
-		if it, ok := typ.(*types.Interface); ok {
-			it.Complete()
-		}
-	}
-	p.pkg.MarkComplete()
-	return p.pkg
-}
-
-// InitData = { InitDataDirective } .
-func (p *parser) parseInitData() {
-	for p.tok != scanner.EOF {
-		p.parseInitDataDirective()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/parser_test.go b/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/parser_test.go
deleted file mode 100644
index b96486f..0000000
--- a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/parser_test.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-import (
-	"bytes"
-	"go/types"
-	"strings"
-	"testing"
-	"text/scanner"
-)
-
-var typeParserTests = []struct {
-	id, typ, want, underlying, methods string
-}{
-	{id: "foo", typ: "<type -1>", want: "int8"},
-	{id: "foo", typ: "<type 1 *<type -19>>", want: "*error"},
-	{id: "foo", typ: "<type 1 *any>", want: "unsafe.Pointer"},
-	{id: "foo", typ: "<type 1 \"Bar\" <type 2 *<type 1>>>", want: "foo.Bar", underlying: "*foo.Bar"},
-	{id: "foo", typ: "<type 1 \"bar.Foo\" \"bar\" <type -1> func (? <type 1>) M (); >", want: "bar.Foo", underlying: "int8", methods: "func (bar.Foo).M()"},
-	{id: "foo", typ: "<type 1 \".bar.foo\" \"bar\" <type -1>>", want: "bar.foo", underlying: "int8"},
-	{id: "foo", typ: "<type 1 []<type -1>>", want: "[]int8"},
-	{id: "foo", typ: "<type 1 [42]<type -1>>", want: "[42]int8"},
-	{id: "foo", typ: "<type 1 map [<type -1>] <type -2>>", want: "map[int8]int16"},
-	{id: "foo", typ: "<type 1 chan <type -1>>", want: "chan int8"},
-	{id: "foo", typ: "<type 1 chan <- <type -1>>", want: "<-chan int8"},
-	{id: "foo", typ: "<type 1 chan -< <type -1>>", want: "chan<- int8"},
-	{id: "foo", typ: "<type 1 struct { I8 <type -1>; I16 <type -2> \"i16\"; }>", want: "struct{I8 int8; I16 int16 \"i16\"}"},
-	{id: "foo", typ: "<type 1 interface { Foo (a <type -1>, b <type -2>) <type -1>; Bar (? <type -2>, ? ...<type -1>) (? <type -2>, ? <type -1>); Baz (); }>", want: "interface{Bar(int16, ...int8) (int16, int8); Baz(); Foo(a int8, b int16) int8}"},
-	{id: "foo", typ: "<type 1 (? <type -1>) <type -2>>", want: "func(int8) int16"},
-}
-
-func TestTypeParser(t *testing.T) {
-	for _, test := range typeParserTests {
-		var p parser
-		p.init("test.gox", strings.NewReader(test.typ), make(map[string]*types.Package))
-		p.pkgname = test.id
-		p.pkgpath = test.id
-		p.maybeCreatePackage()
-		typ := p.parseType(p.pkg)
-
-		if p.tok != scanner.EOF {
-			t.Errorf("expected full parse, stopped at %q", p.lit)
-		}
-
-		got := typ.String()
-		if got != test.want {
-			t.Errorf("got type %q, expected %q", got, test.want)
-		}
-
-		if test.underlying != "" {
-			underlying := typ.Underlying().String()
-			if underlying != test.underlying {
-				t.Errorf("got underlying type %q, expected %q", underlying, test.underlying)
-			}
-		}
-
-		if test.methods != "" {
-			nt := typ.(*types.Named)
-			var buf bytes.Buffer
-			for i := 0; i != nt.NumMethods(); i++ {
-				buf.WriteString(nt.Method(i).String())
-			}
-			methods := buf.String()
-			if methods != test.methods {
-				t.Errorf("got methods %q, expected %q", methods, test.methods)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/testdata/complexnums.go b/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/testdata/complexnums.go
deleted file mode 100644
index a51b6b0..0000000
--- a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/testdata/complexnums.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package complexnums
-
-const NN = -1 - 1i
-const NP = -1 + 1i
-const PN = 1 - 1i
-const PP = 1 + 1i
diff --git a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/testdata/imports.go b/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/testdata/imports.go
deleted file mode 100644
index 7907316..0000000
--- a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/testdata/imports.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package imports
-
-import "fmt"
-
-var Hello = fmt.Sprintf("Hello, world")
diff --git a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/testdata/pointer.go b/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/testdata/pointer.go
deleted file mode 100644
index 4ebc671..0000000
--- a/third_party/gofrontend/libgo/go/go/internal/gccgoimporter/testdata/pointer.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package pointer
-
-type Int8Ptr *int8
diff --git a/third_party/gofrontend/libgo/go/go/internal/gcimporter/exportdata.go b/third_party/gofrontend/libgo/go/go/internal/gcimporter/exportdata.go
deleted file mode 100644
index 657742b..0000000
--- a/third_party/gofrontend/libgo/go/go/internal/gcimporter/exportdata.go
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements FindExportData.
-
-package gcimporter
-
-import (
-	"bufio"
-	"errors"
-	"fmt"
-	"io"
-	"strconv"
-	"strings"
-)
-
-func readGopackHeader(r *bufio.Reader) (name string, size int, err error) {
-	// See $GOROOT/include/ar.h.
-	hdr := make([]byte, 16+12+6+6+8+10+2)
-	_, err = io.ReadFull(r, hdr)
-	if err != nil {
-		return
-	}
-	// leave for debugging
-	if false {
-		fmt.Printf("header: %s", hdr)
-	}
-	s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10]))
-	size, err = strconv.Atoi(s)
-	if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' {
-		err = errors.New("invalid archive header")
-		return
-	}
-	name = strings.TrimSpace(string(hdr[:16]))
-	return
-}
-
-// FindExportData positions the reader r at the beginning of the
-// export data section of an underlying GC-created object/archive
-// file by reading from it. The reader must be positioned at the
-// start of the file before calling this function.
-//
-func FindExportData(r *bufio.Reader) (err error) {
-	// Read first line to make sure this is an object file.
-	line, err := r.ReadSlice('\n')
-	if err != nil {
-		return
-	}
-	if string(line) == "!<arch>\n" {
-		// Archive file. Scan to __.PKGDEF.
-		var name string
-		var size int
-		if name, size, err = readGopackHeader(r); err != nil {
-			return
-		}
-
-		// Optional leading __.GOSYMDEF or __.SYMDEF.
-		// Read and discard.
-		if name == "__.SYMDEF" || name == "__.GOSYMDEF" {
-			const block = 4096
-			tmp := make([]byte, block)
-			for size > 0 {
-				n := size
-				if n > block {
-					n = block
-				}
-				if _, err = io.ReadFull(r, tmp[:n]); err != nil {
-					return
-				}
-				size -= n
-			}
-
-			if name, size, err = readGopackHeader(r); err != nil {
-				return
-			}
-		}
-
-		// First real entry should be __.PKGDEF.
-		if name != "__.PKGDEF" {
-			err = errors.New("go archive is missing __.PKGDEF")
-			return
-		}
-
-		// Read first line of __.PKGDEF data, so that line
-		// is once again the first line of the input.
-		if line, err = r.ReadSlice('\n'); err != nil {
-			return
-		}
-	}
-
-	// Now at __.PKGDEF in archive or still at beginning of file.
-	// Either way, line should begin with "go object ".
-	if !strings.HasPrefix(string(line), "go object ") {
-		err = errors.New("not a go object file")
-		return
-	}
-
-	// Skip over object header to export data.
-	// Begins after first line with $$.
-	for line[0] != '$' {
-		if line, err = r.ReadSlice('\n'); err != nil {
-			return
-		}
-	}
-
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/go/internal/gcimporter/gcimporter.go b/third_party/gofrontend/libgo/go/go/internal/gcimporter/gcimporter.go
deleted file mode 100644
index 1d485cf..0000000
--- a/third_party/gofrontend/libgo/go/go/internal/gcimporter/gcimporter.go
+++ /dev/null
@@ -1,991 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package gcimporter implements Import for gc-generated object files.
-package gcimporter // import "go/internal/gcimporter"
-
-import (
-	"bufio"
-	"errors"
-	"fmt"
-	"go/build"
-	"go/token"
-	"io"
-	"os"
-	"path/filepath"
-	"sort"
-	"strconv"
-	"strings"
-	"text/scanner"
-
-	exact "go/constant"
-	"go/types"
-)
-
-// debugging/development support
-const debug = false
-
-var pkgExts = [...]string{".a", ".o"}
-
-// FindPkg returns the filename and unique package id for an import
-// path based on package information provided by build.Import (using
-// the build.Default build.Context).
-// If no file was found, an empty filename is returned.
-//
-func FindPkg(path, srcDir string) (filename, id string) {
-	if len(path) == 0 {
-		return
-	}
-
-	id = path
-	var noext string
-	switch {
-	default:
-		// "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x"
-		// Don't require the source files to be present.
-		bp, _ := build.Import(path, srcDir, build.FindOnly|build.AllowBinary)
-		if bp.PkgObj == "" {
-			return
-		}
-		noext = strings.TrimSuffix(bp.PkgObj, ".a")
-
-	case build.IsLocalImport(path):
-		// "./x" -> "/this/directory/x.ext", "/this/directory/x"
-		noext = filepath.Join(srcDir, path)
-		id = noext
-
-	case filepath.IsAbs(path):
-		// for completeness only - go/build.Import
-		// does not support absolute imports
-		// "/x" -> "/x.ext", "/x"
-		noext = path
-	}
-
-	// try extensions
-	for _, ext := range pkgExts {
-		filename = noext + ext
-		if f, err := os.Stat(filename); err == nil && !f.IsDir() {
-			return
-		}
-	}
-
-	filename = "" // not found
-	return
-}
-
-// ImportData imports a package by reading the gc-generated export data,
-// adds the corresponding package object to the packages map indexed by id,
-// and returns the object.
-//
-// The packages map must contains all packages already imported. The data
-// reader position must be the beginning of the export data section. The
-// filename is only used in error messages.
-//
-// If packages[id] contains the completely imported package, that package
-// can be used directly, and there is no need to call this function (but
-// there is also no harm but for extra time used).
-//
-func ImportData(packages map[string]*types.Package, filename, id string, data io.Reader) (pkg *types.Package, err error) {
-	// support for parser error handling
-	defer func() {
-		switch r := recover().(type) {
-		case nil:
-			// nothing to do
-		case importError:
-			err = r
-		default:
-			panic(r) // internal error
-		}
-	}()
-
-	var p parser
-	p.init(filename, id, data, packages)
-	pkg = p.parseExport()
-
-	return
-}
-
-// Import imports a gc-generated package given its import path, adds the
-// corresponding package object to the packages map, and returns the object.
-// Local import paths are interpreted relative to the current working directory.
-// The packages map must contain all packages already imported.
-//
-func Import(packages map[string]*types.Package, path string) (pkg *types.Package, err error) {
-	// package "unsafe" is handled by the type checker
-	if path == "unsafe" {
-		panic(`gcimporter.Import called for package "unsafe"`)
-	}
-
-	srcDir := "."
-	if build.IsLocalImport(path) {
-		srcDir, err = os.Getwd()
-		if err != nil {
-			return
-		}
-	}
-
-	filename, id := FindPkg(path, srcDir)
-	if filename == "" {
-		err = fmt.Errorf("can't find import: %s", id)
-		return
-	}
-
-	// no need to re-import if the package was imported completely before
-	if pkg = packages[id]; pkg != nil && pkg.Complete() {
-		return
-	}
-
-	// open file
-	f, err := os.Open(filename)
-	if err != nil {
-		return
-	}
-	defer func() {
-		f.Close()
-		if err != nil {
-			// add file name to error
-			err = fmt.Errorf("reading export data: %s: %v", filename, err)
-		}
-	}()
-
-	buf := bufio.NewReader(f)
-	if err = FindExportData(buf); err != nil {
-		return
-	}
-
-	pkg, err = ImportData(packages, filename, id, buf)
-
-	return
-}
-
-// ----------------------------------------------------------------------------
-// Parser
-
-// TODO(gri) Imported objects don't have position information.
-//           Ideally use the debug table line info; alternatively
-//           create some fake position (or the position of the
-//           import). That way error messages referring to imported
-//           objects can print meaningful information.
-
-// parser parses the exports inside a gc compiler-produced
-// object/archive file and populates its scope with the results.
-type parser struct {
-	scanner    scanner.Scanner
-	tok        rune                      // current token
-	lit        string                    // literal string; only valid for Ident, Int, String tokens
-	id         string                    // package id of imported package
-	sharedPkgs map[string]*types.Package // package id -> package object (across importer)
-	localPkgs  map[string]*types.Package // package id -> package object (just this package)
-}
-
-func (p *parser) init(filename, id string, src io.Reader, packages map[string]*types.Package) {
-	p.scanner.Init(src)
-	p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) }
-	p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanChars | scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments
-	p.scanner.Whitespace = 1<<'\t' | 1<<' '
-	p.scanner.Filename = filename // for good error messages
-	p.next()
-	p.id = id
-	p.sharedPkgs = packages
-	if debug {
-		// check consistency of packages map
-		for _, pkg := range packages {
-			if pkg.Name() == "" {
-				fmt.Printf("no package name for %s\n", pkg.Path())
-			}
-		}
-	}
-}
-
-func (p *parser) next() {
-	p.tok = p.scanner.Scan()
-	switch p.tok {
-	case scanner.Ident, scanner.Int, scanner.Char, scanner.String, '·':
-		p.lit = p.scanner.TokenText()
-	default:
-		p.lit = ""
-	}
-	if debug {
-		fmt.Printf("%s: %q -> %q\n", scanner.TokenString(p.tok), p.scanner.TokenText(), p.lit)
-	}
-}
-
-func declTypeName(pkg *types.Package, name string) *types.TypeName {
-	scope := pkg.Scope()
-	if obj := scope.Lookup(name); obj != nil {
-		return obj.(*types.TypeName)
-	}
-	obj := types.NewTypeName(token.NoPos, pkg, name, nil)
-	// a named type may be referred to before the underlying type
-	// is known - set it up
-	types.NewNamed(obj, nil, nil)
-	scope.Insert(obj)
-	return obj
-}
-
-// ----------------------------------------------------------------------------
-// Error handling
-
-// Internal errors are boxed as importErrors.
-type importError struct {
-	pos scanner.Position
-	err error
-}
-
-func (e importError) Error() string {
-	return fmt.Sprintf("import error %s (byte offset = %d): %s", e.pos, e.pos.Offset, e.err)
-}
-
-func (p *parser) error(err interface{}) {
-	if s, ok := err.(string); ok {
-		err = errors.New(s)
-	}
-	// panic with a runtime.Error if err is not an error
-	panic(importError{p.scanner.Pos(), err.(error)})
-}
-
-func (p *parser) errorf(format string, args ...interface{}) {
-	p.error(fmt.Sprintf(format, args...))
-}
-
-func (p *parser) expect(tok rune) string {
-	lit := p.lit
-	if p.tok != tok {
-		p.errorf("expected %s, got %s (%s)", scanner.TokenString(tok), scanner.TokenString(p.tok), lit)
-	}
-	p.next()
-	return lit
-}
-
-func (p *parser) expectSpecial(tok string) {
-	sep := 'x' // not white space
-	i := 0
-	for i < len(tok) && p.tok == rune(tok[i]) && sep > ' ' {
-		sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token
-		p.next()
-		i++
-	}
-	if i < len(tok) {
-		p.errorf("expected %q, got %q", tok, tok[0:i])
-	}
-}
-
-func (p *parser) expectKeyword(keyword string) {
-	lit := p.expect(scanner.Ident)
-	if lit != keyword {
-		p.errorf("expected keyword %s, got %q", keyword, lit)
-	}
-}
-
-// ----------------------------------------------------------------------------
-// Qualified and unqualified names
-
-// PackageId = string_lit .
-//
-func (p *parser) parsePackageId() string {
-	id, err := strconv.Unquote(p.expect(scanner.String))
-	if err != nil {
-		p.error(err)
-	}
-	// id == "" stands for the imported package id
-	// (only known at time of package installation)
-	if id == "" {
-		id = p.id
-	}
-	return id
-}
-
-// PackageName = ident .
-//
-func (p *parser) parsePackageName() string {
-	return p.expect(scanner.Ident)
-}
-
-// dotIdentifier = ( ident | '·' ) { ident | int | '·' } .
-func (p *parser) parseDotIdent() string {
-	ident := ""
-	if p.tok != scanner.Int {
-		sep := 'x' // not white space
-		for (p.tok == scanner.Ident || p.tok == scanner.Int || p.tok == '·') && sep > ' ' {
-			ident += p.lit
-			sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token
-			p.next()
-		}
-	}
-	if ident == "" {
-		p.expect(scanner.Ident) // use expect() for error handling
-	}
-	return ident
-}
-
-// QualifiedName = "@" PackageId "." ( "?" | dotIdentifier ) .
-//
-func (p *parser) parseQualifiedName() (id, name string) {
-	p.expect('@')
-	id = p.parsePackageId()
-	p.expect('.')
-	// Per rev f280b8a485fd (10/2/2013), qualified names may be used for anonymous fields.
-	if p.tok == '?' {
-		p.next()
-	} else {
-		name = p.parseDotIdent()
-	}
-	return
-}
-
-// getPkg returns the package for a given id. If the package is
-// not found but we have a package name, create the package and
-// add it to the p.localPkgs and p.sharedPkgs maps.
-//
-// id identifies a package, usually by a canonical package path like
-// "encoding/json" but possibly by a non-canonical import path like
-// "./json".
-//
-func (p *parser) getPkg(id, name string) *types.Package {
-	// package unsafe is not in the packages maps - handle explicitly
-	if id == "unsafe" {
-		return types.Unsafe
-	}
-
-	pkg := p.localPkgs[id]
-	if pkg == nil && name != "" {
-		// first import of id from this package
-		pkg = p.sharedPkgs[id]
-		if pkg == nil {
-			// first import of id by this importer
-			pkg = types.NewPackage(id, name)
-			p.sharedPkgs[id] = pkg
-		}
-
-		if p.localPkgs == nil {
-			p.localPkgs = make(map[string]*types.Package)
-		}
-		p.localPkgs[id] = pkg
-	}
-	return pkg
-}
-
-// parseExportedName is like parseQualifiedName, but
-// the package id is resolved to an imported *types.Package.
-//
-func (p *parser) parseExportedName() (pkg *types.Package, name string) {
-	id, name := p.parseQualifiedName()
-	pkg = p.getPkg(id, "")
-	if pkg == nil {
-		p.errorf("%s package not found", id)
-	}
-	return
-}
-
-// ----------------------------------------------------------------------------
-// Types
-
-// BasicType = identifier .
-//
-func (p *parser) parseBasicType() types.Type {
-	id := p.expect(scanner.Ident)
-	obj := types.Universe.Lookup(id)
-	if obj, ok := obj.(*types.TypeName); ok {
-		return obj.Type()
-	}
-	p.errorf("not a basic type: %s", id)
-	return nil
-}
-
-// ArrayType = "[" int_lit "]" Type .
-//
-func (p *parser) parseArrayType() types.Type {
-	// "[" already consumed and lookahead known not to be "]"
-	lit := p.expect(scanner.Int)
-	p.expect(']')
-	elem := p.parseType()
-	n, err := strconv.ParseInt(lit, 10, 64)
-	if err != nil {
-		p.error(err)
-	}
-	return types.NewArray(elem, n)
-}
-
-// MapType = "map" "[" Type "]" Type .
-//
-func (p *parser) parseMapType() types.Type {
-	p.expectKeyword("map")
-	p.expect('[')
-	key := p.parseType()
-	p.expect(']')
-	elem := p.parseType()
-	return types.NewMap(key, elem)
-}
-
-// Name = identifier | "?" | QualifiedName .
-//
-// If materializePkg is set, the returned package is guaranteed to be set.
-// For fully qualified names, the returned package may be a fake package
-// (without name, scope, and not in the p.sharedPkgs map), created for the
-// sole purpose of providing a package path. Fake packages are created
-// when the package id is not found in the p.sharedPkgs map; in that case
-// we cannot create a real package because we don't have a package name.
-// For non-qualified names, the returned package is the imported package.
-//
-func (p *parser) parseName(materializePkg bool) (pkg *types.Package, name string) {
-	switch p.tok {
-	case scanner.Ident:
-		pkg = p.sharedPkgs[p.id]
-		name = p.lit
-		p.next()
-	case '?':
-		// anonymous
-		pkg = p.sharedPkgs[p.id]
-		p.next()
-	case '@':
-		// exported name prefixed with package path
-		var id string
-		id, name = p.parseQualifiedName()
-		if materializePkg {
-			// we don't have a package name - if the package
-			// doesn't exist yet, create a fake package instead
-			pkg = p.getPkg(id, "")
-			if pkg == nil {
-				pkg = types.NewPackage(id, "")
-			}
-		}
-	default:
-		p.error("name expected")
-	}
-	return
-}
-
-func deref(typ types.Type) types.Type {
-	if p, _ := typ.(*types.Pointer); p != nil {
-		return p.Elem()
-	}
-	return typ
-}
-
-// Field = Name Type [ string_lit ] .
-//
-func (p *parser) parseField() (*types.Var, string) {
-	pkg, name := p.parseName(true)
-	typ := p.parseType()
-	anonymous := false
-	if name == "" {
-		// anonymous field - typ must be T or *T and T must be a type name
-		switch typ := deref(typ).(type) {
-		case *types.Basic: // basic types are named types
-			pkg = nil
-			name = typ.Name()
-		case *types.Named:
-			name = typ.Obj().Name()
-		default:
-			p.errorf("anonymous field expected")
-		}
-		anonymous = true
-	}
-	tag := ""
-	if p.tok == scanner.String {
-		s := p.expect(scanner.String)
-		var err error
-		tag, err = strconv.Unquote(s)
-		if err != nil {
-			p.errorf("invalid struct tag %s: %s", s, err)
-		}
-	}
-	return types.NewField(token.NoPos, pkg, name, typ, anonymous), tag
-}
-
-// StructType = "struct" "{" [ FieldList ] "}" .
-// FieldList  = Field { ";" Field } .
-//
-func (p *parser) parseStructType() types.Type {
-	var fields []*types.Var
-	var tags []string
-
-	p.expectKeyword("struct")
-	p.expect('{')
-	for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ {
-		if i > 0 {
-			p.expect(';')
-		}
-		fld, tag := p.parseField()
-		if tag != "" && tags == nil {
-			tags = make([]string, i)
-		}
-		if tags != nil {
-			tags = append(tags, tag)
-		}
-		fields = append(fields, fld)
-	}
-	p.expect('}')
-
-	return types.NewStruct(fields, tags)
-}
-
-// Parameter = ( identifier | "?" ) [ "..." ] Type [ string_lit ] .
-//
-func (p *parser) parseParameter() (par *types.Var, isVariadic bool) {
-	_, name := p.parseName(false)
-	// remove gc-specific parameter numbering
-	if i := strings.Index(name, "·"); i >= 0 {
-		name = name[:i]
-	}
-	if p.tok == '.' {
-		p.expectSpecial("...")
-		isVariadic = true
-	}
-	typ := p.parseType()
-	if isVariadic {
-		typ = types.NewSlice(typ)
-	}
-	// ignore argument tag (e.g. "noescape")
-	if p.tok == scanner.String {
-		p.next()
-	}
-	// TODO(gri) should we provide a package?
-	par = types.NewVar(token.NoPos, nil, name, typ)
-	return
-}
-
-// Parameters    = "(" [ ParameterList ] ")" .
-// ParameterList = { Parameter "," } Parameter .
-//
-func (p *parser) parseParameters() (list []*types.Var, isVariadic bool) {
-	p.expect('(')
-	for p.tok != ')' && p.tok != scanner.EOF {
-		if len(list) > 0 {
-			p.expect(',')
-		}
-		par, variadic := p.parseParameter()
-		list = append(list, par)
-		if variadic {
-			if isVariadic {
-				p.error("... not on final argument")
-			}
-			isVariadic = true
-		}
-	}
-	p.expect(')')
-
-	return
-}
-
-// Signature = Parameters [ Result ] .
-// Result    = Type | Parameters .
-//
-func (p *parser) parseSignature(recv *types.Var) *types.Signature {
-	params, isVariadic := p.parseParameters()
-
-	// optional result type
-	var results []*types.Var
-	if p.tok == '(' {
-		var variadic bool
-		results, variadic = p.parseParameters()
-		if variadic {
-			p.error("... not permitted on result type")
-		}
-	}
-
-	return types.NewSignature(recv, types.NewTuple(params...), types.NewTuple(results...), isVariadic)
-}
-
-// InterfaceType = "interface" "{" [ MethodList ] "}" .
-// MethodList    = Method { ";" Method } .
-// Method        = Name Signature .
-//
-// The methods of embedded interfaces are always "inlined"
-// by the compiler and thus embedded interfaces are never
-// visible in the export data.
-//
-func (p *parser) parseInterfaceType() types.Type {
-	var methods []*types.Func
-
-	p.expectKeyword("interface")
-	p.expect('{')
-	for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ {
-		if i > 0 {
-			p.expect(';')
-		}
-		pkg, name := p.parseName(true)
-		sig := p.parseSignature(nil)
-		methods = append(methods, types.NewFunc(token.NoPos, pkg, name, sig))
-	}
-	p.expect('}')
-
-	// Complete requires the type's embedded interfaces to be fully defined,
-	// but we do not define any
-	return types.NewInterface(methods, nil).Complete()
-}
-
-// ChanType = ( "chan" [ "<-" ] | "<-" "chan" ) Type .
-//
-func (p *parser) parseChanType() types.Type {
-	dir := types.SendRecv
-	if p.tok == scanner.Ident {
-		p.expectKeyword("chan")
-		if p.tok == '<' {
-			p.expectSpecial("<-")
-			dir = types.SendOnly
-		}
-	} else {
-		p.expectSpecial("<-")
-		p.expectKeyword("chan")
-		dir = types.RecvOnly
-	}
-	elem := p.parseType()
-	return types.NewChan(dir, elem)
-}
-
-// Type =
-//	BasicType | TypeName | ArrayType | SliceType | StructType |
-//      PointerType | FuncType | InterfaceType | MapType | ChanType |
-//      "(" Type ")" .
-//
-// BasicType   = ident .
-// TypeName    = ExportedName .
-// SliceType   = "[" "]" Type .
-// PointerType = "*" Type .
-// FuncType    = "func" Signature .
-//
-func (p *parser) parseType() types.Type {
-	switch p.tok {
-	case scanner.Ident:
-		switch p.lit {
-		default:
-			return p.parseBasicType()
-		case "struct":
-			return p.parseStructType()
-		case "func":
-			// FuncType
-			p.next()
-			return p.parseSignature(nil)
-		case "interface":
-			return p.parseInterfaceType()
-		case "map":
-			return p.parseMapType()
-		case "chan":
-			return p.parseChanType()
-		}
-	case '@':
-		// TypeName
-		pkg, name := p.parseExportedName()
-		return declTypeName(pkg, name).Type()
-	case '[':
-		p.next() // look ahead
-		if p.tok == ']' {
-			// SliceType
-			p.next()
-			return types.NewSlice(p.parseType())
-		}
-		return p.parseArrayType()
-	case '*':
-		// PointerType
-		p.next()
-		return types.NewPointer(p.parseType())
-	case '<':
-		return p.parseChanType()
-	case '(':
-		// "(" Type ")"
-		p.next()
-		typ := p.parseType()
-		p.expect(')')
-		return typ
-	}
-	p.errorf("expected type, got %s (%q)", scanner.TokenString(p.tok), p.lit)
-	return nil
-}
-
-// ----------------------------------------------------------------------------
-// Declarations
-
-// ImportDecl = "import" PackageName PackageId .
-//
-func (p *parser) parseImportDecl() {
-	p.expectKeyword("import")
-	name := p.parsePackageName()
-	p.getPkg(p.parsePackageId(), name)
-}
-
-// int_lit = [ "+" | "-" ] { "0" ... "9" } .
-//
-func (p *parser) parseInt() string {
-	s := ""
-	switch p.tok {
-	case '-':
-		s = "-"
-		p.next()
-	case '+':
-		p.next()
-	}
-	return s + p.expect(scanner.Int)
-}
-
-// number = int_lit [ "p" int_lit ] .
-//
-func (p *parser) parseNumber() (typ *types.Basic, val exact.Value) {
-	// mantissa
-	mant := exact.MakeFromLiteral(p.parseInt(), token.INT, 0)
-	if mant == nil {
-		panic("invalid mantissa")
-	}
-
-	if p.lit == "p" {
-		// exponent (base 2)
-		p.next()
-		exp, err := strconv.ParseInt(p.parseInt(), 10, 0)
-		if err != nil {
-			p.error(err)
-		}
-		if exp < 0 {
-			denom := exact.MakeInt64(1)
-			denom = exact.Shift(denom, token.SHL, uint(-exp))
-			typ = types.Typ[types.UntypedFloat]
-			val = exact.BinaryOp(mant, token.QUO, denom)
-			return
-		}
-		if exp > 0 {
-			mant = exact.Shift(mant, token.SHL, uint(exp))
-		}
-		typ = types.Typ[types.UntypedFloat]
-		val = mant
-		return
-	}
-
-	typ = types.Typ[types.UntypedInt]
-	val = mant
-	return
-}
-
-// ConstDecl   = "const" ExportedName [ Type ] "=" Literal .
-// Literal     = bool_lit | int_lit | float_lit | complex_lit | rune_lit | string_lit .
-// bool_lit    = "true" | "false" .
-// complex_lit = "(" float_lit "+" float_lit "i" ")" .
-// rune_lit    = "(" int_lit "+" int_lit ")" .
-// string_lit  = `"` { unicode_char } `"` .
-//
-func (p *parser) parseConstDecl() {
-	p.expectKeyword("const")
-	pkg, name := p.parseExportedName()
-
-	var typ0 types.Type
-	if p.tok != '=' {
-		typ0 = p.parseType()
-	}
-
-	p.expect('=')
-	var typ types.Type
-	var val exact.Value
-	switch p.tok {
-	case scanner.Ident:
-		// bool_lit
-		if p.lit != "true" && p.lit != "false" {
-			p.error("expected true or false")
-		}
-		typ = types.Typ[types.UntypedBool]
-		val = exact.MakeBool(p.lit == "true")
-		p.next()
-
-	case '-', scanner.Int:
-		// int_lit
-		typ, val = p.parseNumber()
-
-	case '(':
-		// complex_lit or rune_lit
-		p.next()
-		if p.tok == scanner.Char {
-			p.next()
-			p.expect('+')
-			typ = types.Typ[types.UntypedRune]
-			_, val = p.parseNumber()
-			p.expect(')')
-			break
-		}
-		_, re := p.parseNumber()
-		p.expect('+')
-		_, im := p.parseNumber()
-		p.expectKeyword("i")
-		p.expect(')')
-		typ = types.Typ[types.UntypedComplex]
-		val = exact.BinaryOp(re, token.ADD, exact.MakeImag(im))
-
-	case scanner.Char:
-		// rune_lit
-		typ = types.Typ[types.UntypedRune]
-		val = exact.MakeFromLiteral(p.lit, token.CHAR, 0)
-		p.next()
-
-	case scanner.String:
-		// string_lit
-		typ = types.Typ[types.UntypedString]
-		val = exact.MakeFromLiteral(p.lit, token.STRING, 0)
-		p.next()
-
-	default:
-		p.errorf("expected literal got %s", scanner.TokenString(p.tok))
-	}
-
-	if typ0 == nil {
-		typ0 = typ
-	}
-
-	pkg.Scope().Insert(types.NewConst(token.NoPos, pkg, name, typ0, val))
-}
-
-// TypeDecl = "type" ExportedName Type .
-//
-func (p *parser) parseTypeDecl() {
-	p.expectKeyword("type")
-	pkg, name := p.parseExportedName()
-	obj := declTypeName(pkg, name)
-
-	// The type object may have been imported before and thus already
-	// have a type associated with it. We still need to parse the type
-	// structure, but throw it away if the object already has a type.
-	// This ensures that all imports refer to the same type object for
-	// a given type declaration.
-	typ := p.parseType()
-
-	if name := obj.Type().(*types.Named); name.Underlying() == nil {
-		name.SetUnderlying(typ)
-	}
-}
-
-// VarDecl = "var" ExportedName Type .
-//
-func (p *parser) parseVarDecl() {
-	p.expectKeyword("var")
-	pkg, name := p.parseExportedName()
-	typ := p.parseType()
-	pkg.Scope().Insert(types.NewVar(token.NoPos, pkg, name, typ))
-}
-
-// Func = Signature [ Body ] .
-// Body = "{" ... "}" .
-//
-func (p *parser) parseFunc(recv *types.Var) *types.Signature {
-	sig := p.parseSignature(recv)
-	if p.tok == '{' {
-		p.next()
-		for i := 1; i > 0; p.next() {
-			switch p.tok {
-			case '{':
-				i++
-			case '}':
-				i--
-			}
-		}
-	}
-	return sig
-}
-
-// MethodDecl = "func" Receiver Name Func .
-// Receiver   = "(" ( identifier | "?" ) [ "*" ] ExportedName ")" .
-//
-func (p *parser) parseMethodDecl() {
-	// "func" already consumed
-	p.expect('(')
-	recv, _ := p.parseParameter() // receiver
-	p.expect(')')
-
-	// determine receiver base type object
-	base := deref(recv.Type()).(*types.Named)
-
-	// parse method name, signature, and possibly inlined body
-	_, name := p.parseName(true)
-	sig := p.parseFunc(recv)
-
-	// methods always belong to the same package as the base type object
-	pkg := base.Obj().Pkg()
-
-	// add method to type unless type was imported before
-	// and method exists already
-	// TODO(gri) This leads to a quadratic algorithm - ok for now because method counts are small.
-	base.AddMethod(types.NewFunc(token.NoPos, pkg, name, sig))
-}
-
-// FuncDecl = "func" ExportedName Func .
-//
-func (p *parser) parseFuncDecl() {
-	// "func" already consumed
-	pkg, name := p.parseExportedName()
-	typ := p.parseFunc(nil)
-	pkg.Scope().Insert(types.NewFunc(token.NoPos, pkg, name, typ))
-}
-
-// Decl = [ ImportDecl | ConstDecl | TypeDecl | VarDecl | FuncDecl | MethodDecl ] "\n" .
-//
-func (p *parser) parseDecl() {
-	if p.tok == scanner.Ident {
-		switch p.lit {
-		case "import":
-			p.parseImportDecl()
-		case "const":
-			p.parseConstDecl()
-		case "type":
-			p.parseTypeDecl()
-		case "var":
-			p.parseVarDecl()
-		case "func":
-			p.next() // look ahead
-			if p.tok == '(' {
-				p.parseMethodDecl()
-			} else {
-				p.parseFuncDecl()
-			}
-		}
-	}
-	p.expect('\n')
-}
-
-// ----------------------------------------------------------------------------
-// Export
-
-// Export        = "PackageClause { Decl } "$$" .
-// PackageClause = "package" PackageName [ "safe" ] "\n" .
-//
-func (p *parser) parseExport() *types.Package {
-	p.expectKeyword("package")
-	name := p.parsePackageName()
-	if p.tok == scanner.Ident && p.lit == "safe" {
-		// package was compiled with -u option - ignore
-		p.next()
-	}
-	p.expect('\n')
-
-	pkg := p.getPkg(p.id, name)
-
-	for p.tok != '$' && p.tok != scanner.EOF {
-		p.parseDecl()
-	}
-
-	if ch := p.scanner.Peek(); p.tok != '$' || ch != '$' {
-		// don't call next()/expect() since reading past the
-		// export data may cause scanner errors (e.g. NUL chars)
-		p.errorf("expected '$$', got %s %c", scanner.TokenString(p.tok), ch)
-	}
-
-	if n := p.scanner.ErrorCount; n != 0 {
-		p.errorf("expected no scanner errors, got %d", n)
-	}
-
-	// Record all referenced packages as imports.
-	var imports []*types.Package
-	for id, pkg2 := range p.localPkgs {
-		if id == p.id {
-			continue // avoid self-edge
-		}
-		imports = append(imports, pkg2)
-	}
-	sort.Sort(byPath(imports))
-	pkg.SetImports(imports)
-
-	// package was imported completely and without errors
-	pkg.MarkComplete()
-
-	return pkg
-}
-
-type byPath []*types.Package
-
-func (a byPath) Len() int           { return len(a) }
-func (a byPath) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() }
diff --git a/third_party/gofrontend/libgo/go/go/internal/gcimporter/gcimporter_test.go b/third_party/gofrontend/libgo/go/go/internal/gcimporter/gcimporter_test.go
deleted file mode 100644
index 07993a8..0000000
--- a/third_party/gofrontend/libgo/go/go/internal/gcimporter/gcimporter_test.go
+++ /dev/null
@@ -1,225 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gcimporter
-
-import (
-	"fmt"
-	"internal/testenv"
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"testing"
-	"time"
-
-	"go/types"
-)
-
-// skipSpecialPlatforms causes the test to be skipped for platforms where
-// builders (build.golang.org) don't have access to compiled packages for
-// import.
-func skipSpecialPlatforms(t *testing.T) {
-	switch platform := runtime.GOOS + "-" + runtime.GOARCH; platform {
-	case "nacl-amd64p32",
-		"nacl-386",
-		"nacl-arm",
-		"darwin-arm",
-		"darwin-arm64":
-		t.Skipf("no compiled packages available for import on %s", platform)
-	}
-}
-
-func compile(t *testing.T, dirname, filename string) string {
-	testenv.MustHaveGoBuild(t)
-	cmd := exec.Command("go", "tool", "compile", filename)
-	cmd.Dir = dirname
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		t.Logf("%s", out)
-		t.Fatalf("go tool compile %s failed: %s", filename, err)
-	}
-	// filename should end with ".go"
-	return filepath.Join(dirname, filename[:len(filename)-2]+"o")
-}
-
-// Use the same global imports map for all tests. The effect is
-// as if all tested packages were imported into a single package.
-var imports = make(map[string]*types.Package)
-
-func testPath(t *testing.T, path string) *types.Package {
-	t0 := time.Now()
-	pkg, err := Import(imports, path)
-	if err != nil {
-		t.Errorf("testPath(%s): %s", path, err)
-		return nil
-	}
-	t.Logf("testPath(%s): %v", path, time.Since(t0))
-	return pkg
-}
-
-const maxTime = 30 * time.Second
-
-func testDir(t *testing.T, dir string, endTime time.Time) (nimports int) {
-	dirname := filepath.Join(runtime.GOROOT(), "pkg", runtime.GOOS+"_"+runtime.GOARCH, dir)
-	list, err := ioutil.ReadDir(dirname)
-	if err != nil {
-		t.Fatalf("testDir(%s): %s", dirname, err)
-	}
-	for _, f := range list {
-		if time.Now().After(endTime) {
-			t.Log("testing time used up")
-			return
-		}
-		switch {
-		case !f.IsDir():
-			// try extensions
-			for _, ext := range pkgExts {
-				if strings.HasSuffix(f.Name(), ext) {
-					name := f.Name()[0 : len(f.Name())-len(ext)] // remove extension
-					if testPath(t, filepath.Join(dir, name)) != nil {
-						nimports++
-					}
-				}
-			}
-		case f.IsDir():
-			nimports += testDir(t, filepath.Join(dir, f.Name()), endTime)
-		}
-	}
-	return
-}
-
-func TestImport(t *testing.T) {
-	// This package only handles gc export data.
-	if runtime.Compiler != "gc" {
-		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
-		return
-	}
-
-	if outFn := compile(t, "testdata", "exports.go"); outFn != "" {
-		defer os.Remove(outFn)
-	}
-
-	nimports := 0
-	if pkg := testPath(t, "./testdata/exports"); pkg != nil {
-		nimports++
-		// The package's Imports should include all the types
-		// referenced by the exportdata, which may be more than
-		// the import statements in the package's source, but
-		// fewer than the transitive closure of dependencies.
-		want := `[package ast ("go/ast") package token ("go/token") package runtime ("runtime")]`
-		got := fmt.Sprint(pkg.Imports())
-		if got != want {
-			t.Errorf(`Package("exports").Imports() = %s, want %s`, got, want)
-		}
-	}
-	nimports += testDir(t, "", time.Now().Add(maxTime)) // installed packages
-	t.Logf("tested %d imports", nimports)
-}
-
-var importedObjectTests = []struct {
-	name string
-	want string
-}{
-	{"math.Pi", "const Pi untyped float"},
-	{"io.Reader", "type Reader interface{Read(p []byte) (n int, err error)}"},
-	{"io.ReadWriter", "type ReadWriter interface{Read(p []byte) (n int, err error); Write(p []byte) (n int, err error)}"},
-	{"math.Sin", "func Sin(x float64) float64"},
-	// TODO(gri) add more tests
-}
-
-func TestImportedTypes(t *testing.T) {
-	skipSpecialPlatforms(t)
-
-	// This package only handles gc export data.
-	if runtime.Compiler != "gc" {
-		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
-		return
-	}
-
-	for _, test := range importedObjectTests {
-		s := strings.Split(test.name, ".")
-		if len(s) != 2 {
-			t.Fatal("inconsistent test data")
-		}
-		importPath := s[0]
-		objName := s[1]
-
-		pkg, err := Import(imports, importPath)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-
-		obj := pkg.Scope().Lookup(objName)
-		if obj == nil {
-			t.Errorf("%s: object not found", test.name)
-			continue
-		}
-
-		got := types.ObjectString(obj, types.RelativeTo(pkg))
-		if got != test.want {
-			t.Errorf("%s: got %q; want %q", test.name, got, test.want)
-		}
-	}
-}
-
-func TestIssue5815(t *testing.T) {
-	skipSpecialPlatforms(t)
-
-	// This package only handles gc export data.
-	if runtime.Compiler != "gc" {
-		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
-		return
-	}
-
-	pkg, err := Import(make(map[string]*types.Package), "strings")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	scope := pkg.Scope()
-	for _, name := range scope.Names() {
-		obj := scope.Lookup(name)
-		if obj.Pkg() == nil {
-			t.Errorf("no pkg for %s", obj)
-		}
-		if tname, _ := obj.(*types.TypeName); tname != nil {
-			named := tname.Type().(*types.Named)
-			for i := 0; i < named.NumMethods(); i++ {
-				m := named.Method(i)
-				if m.Pkg() == nil {
-					t.Errorf("no pkg for %s", m)
-				}
-			}
-		}
-	}
-}
-
-// Smoke test to ensure that imported methods get the correct package.
-func TestCorrectMethodPackage(t *testing.T) {
-	skipSpecialPlatforms(t)
-
-	// This package only handles gc export data.
-	if runtime.Compiler != "gc" {
-		t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
-		return
-	}
-
-	imports := make(map[string]*types.Package)
-	_, err := Import(imports, "net/http")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	mutex := imports["sync"].Scope().Lookup("Mutex").(*types.TypeName).Type()
-	mset := types.NewMethodSet(types.NewPointer(mutex)) // methods of *sync.Mutex
-	sel := mset.Lookup(nil, "Lock")
-	lock := sel.Obj().(*types.Func)
-	if got, want := lock.Pkg().Path(), "sync"; got != want {
-		t.Errorf("got package path %q; want %q", got, want)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/internal/gcimporter/testdata/exports.go b/third_party/gofrontend/libgo/go/go/internal/gcimporter/testdata/exports.go
deleted file mode 100644
index 8ee28b0..0000000
--- a/third_party/gofrontend/libgo/go/go/internal/gcimporter/testdata/exports.go
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file is used to generate an object file which
-// serves as test file for gcimporter_test.go.
-
-package exports
-
-import (
-	"go/ast"
-)
-
-// Issue 3682: Correctly read dotted identifiers from export data.
-const init1 = 0
-
-func init() {}
-
-const (
-	C0 int = 0
-	C1     = 3.14159265
-	C2     = 2.718281828i
-	C3     = -123.456e-789
-	C4     = +123.456E+789
-	C5     = 1234i
-	C6     = "foo\n"
-	C7     = `bar\n`
-)
-
-type (
-	T1  int
-	T2  [10]int
-	T3  []int
-	T4  *int
-	T5  chan int
-	T6a chan<- int
-	T6b chan (<-chan int)
-	T6c chan<- (chan int)
-	T7  <-chan *ast.File
-	T8  struct{}
-	T9  struct {
-		a    int
-		b, c float32
-		d    []string `go:"tag"`
-	}
-	T10 struct {
-		T8
-		T9
-		_ *T10
-	}
-	T11 map[int]string
-	T12 interface{}
-	T13 interface {
-		m1()
-		m2(int) float32
-	}
-	T14 interface {
-		T12
-		T13
-		m3(x ...struct{}) []T9
-	}
-	T15 func()
-	T16 func(int)
-	T17 func(x int)
-	T18 func() float32
-	T19 func() (x float32)
-	T20 func(...interface{})
-	T21 struct{ next *T21 }
-	T22 struct{ link *T23 }
-	T23 struct{ link *T22 }
-	T24 *T24
-	T25 *T26
-	T26 *T27
-	T27 *T25
-	T28 func(T28) T28
-)
-
-var (
-	V0 int
-	V1 = -991.0
-)
-
-func F1()         {}
-func F2(x int)    {}
-func F3() int     { return 0 }
-func F4() float32 { return 0 }
-func F5(a, b, c int, u, v, w struct{ x, y T1 }, more ...interface{}) (p, q, r chan<- T10)
-
-func (p *T1) M1()
diff --git a/third_party/gofrontend/libgo/go/go/parser/error_test.go b/third_party/gofrontend/libgo/go/go/parser/error_test.go
deleted file mode 100644
index 1a08d5a..0000000
--- a/third_party/gofrontend/libgo/go/go/parser/error_test.go
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements a parser test harness. The files in the testdata
-// directory are parsed and the errors reported are compared against the
-// error messages expected in the test files. The test files must end in
-// .src rather than .go so that they are not disturbed by gofmt runs.
-//
-// Expected errors are indicated in the test files by putting a comment
-// of the form /* ERROR "rx" */ immediately following an offending token.
-// The harness will verify that an error matching the regular expression
-// rx is reported at that source position.
-//
-// For instance, the following test file indicates that a "not declared"
-// error should be reported for the undeclared variable x:
-//
-//	package p
-//	func f() {
-//		_ = x /* ERROR "not declared" */ + 1
-//	}
-
-package parser
-
-import (
-	"go/scanner"
-	"go/token"
-	"io/ioutil"
-	"path/filepath"
-	"regexp"
-	"strings"
-	"testing"
-)
-
-const testdata = "testdata"
-
-// getFile assumes that each filename occurs at most once
-func getFile(fset *token.FileSet, filename string) (file *token.File) {
-	fset.Iterate(func(f *token.File) bool {
-		if f.Name() == filename {
-			if file != nil {
-				panic(filename + " used multiple times")
-			}
-			file = f
-		}
-		return true
-	})
-	return file
-}
-
-func getPos(fset *token.FileSet, filename string, offset int) token.Pos {
-	if f := getFile(fset, filename); f != nil {
-		return f.Pos(offset)
-	}
-	return token.NoPos
-}
-
-// ERROR comments must be of the form /* ERROR "rx" */ and rx is
-// a regular expression that matches the expected error message.
-// The special form /* ERROR HERE "rx" */ must be used for error
-// messages that appear immediately after a token, rather than at
-// a token's position.
-//
-var errRx = regexp.MustCompile(`^/\* *ERROR *(HERE)? *"([^"]*)" *\*/$`)
-
-// expectedErrors collects the regular expressions of ERROR comments found
-// in files and returns them as a map of error positions to error messages.
-//
-func expectedErrors(t *testing.T, fset *token.FileSet, filename string, src []byte) map[token.Pos]string {
-	errors := make(map[token.Pos]string)
-
-	var s scanner.Scanner
-	// file was parsed already - do not add it again to the file
-	// set otherwise the position information returned here will
-	// not match the position information collected by the parser
-	s.Init(getFile(fset, filename), src, nil, scanner.ScanComments)
-	var prev token.Pos // position of last non-comment, non-semicolon token
-	var here token.Pos // position immediately after the token at position prev
-
-	for {
-		pos, tok, lit := s.Scan()
-		switch tok {
-		case token.EOF:
-			return errors
-		case token.COMMENT:
-			s := errRx.FindStringSubmatch(lit)
-			if len(s) == 3 {
-				pos := prev
-				if s[1] == "HERE" {
-					pos = here
-				}
-				errors[pos] = string(s[2])
-			}
-		default:
-			prev = pos
-			var l int // token length
-			if tok.IsLiteral() {
-				l = len(lit)
-			} else {
-				l = len(tok.String())
-			}
-			here = prev + token.Pos(l)
-		}
-	}
-}
-
-// compareErrors compares the map of expected error messages with the list
-// of found errors and reports discrepancies.
-//
-func compareErrors(t *testing.T, fset *token.FileSet, expected map[token.Pos]string, found scanner.ErrorList) {
-	for _, error := range found {
-		// error.Pos is a token.Position, but we want
-		// a token.Pos so we can do a map lookup
-		pos := getPos(fset, error.Pos.Filename, error.Pos.Offset)
-		if msg, found := expected[pos]; found {
-			// we expect a message at pos; check if it matches
-			rx, err := regexp.Compile(msg)
-			if err != nil {
-				t.Errorf("%s: %v", error.Pos, err)
-				continue
-			}
-			if match := rx.MatchString(error.Msg); !match {
-				t.Errorf("%s: %q does not match %q", error.Pos, error.Msg, msg)
-				continue
-			}
-			// we have a match - eliminate this error
-			delete(expected, pos)
-		} else {
-			// To keep in mind when analyzing failed test output:
-			// If the same error position occurs multiple times in errors,
-			// this message will be triggered (because the first error at
-			// the position removes this position from the expected errors).
-			t.Errorf("%s: unexpected error: %s", error.Pos, error.Msg)
-		}
-	}
-
-	// there should be no expected errors left
-	if len(expected) > 0 {
-		t.Errorf("%d errors not reported:", len(expected))
-		for pos, msg := range expected {
-			t.Errorf("%s: %s\n", fset.Position(pos), msg)
-		}
-	}
-}
-
-func checkErrors(t *testing.T, filename string, input interface{}) {
-	src, err := readSource(filename, input)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	fset := token.NewFileSet()
-	_, err = ParseFile(fset, filename, src, DeclarationErrors|AllErrors)
-	found, ok := err.(scanner.ErrorList)
-	if err != nil && !ok {
-		t.Error(err)
-		return
-	}
-	found.RemoveMultiples()
-
-	// we are expecting the following errors
-	// (collect these after parsing a file so that it is found in the file set)
-	expected := expectedErrors(t, fset, filename, src)
-
-	// verify errors returned by the parser
-	compareErrors(t, fset, expected, found)
-}
-
-func TestErrors(t *testing.T) {
-	list, err := ioutil.ReadDir(testdata)
-	if err != nil {
-		t.Fatal(err)
-	}
-	for _, fi := range list {
-		name := fi.Name()
-		if !fi.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".src") {
-			checkErrors(t, filepath.Join(testdata, name), nil)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/parser/interface.go b/third_party/gofrontend/libgo/go/go/parser/interface.go
deleted file mode 100644
index c6fd932..0000000
--- a/third_party/gofrontend/libgo/go/go/parser/interface.go
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains the exported entry points for invoking the parser.
-
-package parser
-
-import (
-	"bytes"
-	"errors"
-	"go/ast"
-	"go/token"
-	"io"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"strings"
-)
-
-// If src != nil, readSource converts src to a []byte if possible;
-// otherwise it returns an error. If src == nil, readSource returns
-// the result of reading the file specified by filename.
-//
-func readSource(filename string, src interface{}) ([]byte, error) {
-	if src != nil {
-		switch s := src.(type) {
-		case string:
-			return []byte(s), nil
-		case []byte:
-			return s, nil
-		case *bytes.Buffer:
-			// is io.Reader, but src is already available in []byte form
-			if s != nil {
-				return s.Bytes(), nil
-			}
-		case io.Reader:
-			var buf bytes.Buffer
-			if _, err := io.Copy(&buf, s); err != nil {
-				return nil, err
-			}
-			return buf.Bytes(), nil
-		}
-		return nil, errors.New("invalid source")
-	}
-	return ioutil.ReadFile(filename)
-}
-
-// A Mode value is a set of flags (or 0).
-// They control the amount of source code parsed and other optional
-// parser functionality.
-//
-type Mode uint
-
-const (
-	PackageClauseOnly Mode             = 1 << iota // stop parsing after package clause
-	ImportsOnly                                    // stop parsing after import declarations
-	ParseComments                                  // parse comments and add them to AST
-	Trace                                          // print a trace of parsed productions
-	DeclarationErrors                              // report declaration errors
-	SpuriousErrors                                 // same as AllErrors, for backward-compatibility
-	AllErrors         = SpuriousErrors             // report all errors (not just the first 10 on different lines)
-)
-
-// ParseFile parses the source code of a single Go source file and returns
-// the corresponding ast.File node. The source code may be provided via
-// the filename of the source file, or via the src parameter.
-//
-// If src != nil, ParseFile parses the source from src and the filename is
-// only used when recording position information. The type of the argument
-// for the src parameter must be string, []byte, or io.Reader.
-// If src == nil, ParseFile parses the file specified by filename.
-//
-// The mode parameter controls the amount of source text parsed and other
-// optional parser functionality. Position information is recorded in the
-// file set fset.
-//
-// If the source couldn't be read, the returned AST is nil and the error
-// indicates the specific failure. If the source was read but syntax
-// errors were found, the result is a partial AST (with ast.Bad* nodes
-// representing the fragments of erroneous source code). Multiple errors
-// are returned via a scanner.ErrorList which is sorted by file position.
-//
-func ParseFile(fset *token.FileSet, filename string, src interface{}, mode Mode) (f *ast.File, err error) {
-	// get source
-	text, err := readSource(filename, src)
-	if err != nil {
-		return nil, err
-	}
-
-	var p parser
-	defer func() {
-		if e := recover(); e != nil {
-			// resume same panic if it's not a bailout
-			if _, ok := e.(bailout); !ok {
-				panic(e)
-			}
-		}
-
-		// set result values
-		if f == nil {
-			// source is not a valid Go source file - satisfy
-			// ParseFile API and return a valid (but) empty
-			// *ast.File
-			f = &ast.File{
-				Name:  new(ast.Ident),
-				Scope: ast.NewScope(nil),
-			}
-		}
-
-		p.errors.Sort()
-		err = p.errors.Err()
-	}()
-
-	// parse source
-	p.init(fset, filename, text, mode)
-	f = p.parseFile()
-
-	return
-}
-
-// ParseDir calls ParseFile for all files with names ending in ".go" in the
-// directory specified by path and returns a map of package name -> package
-// AST with all the packages found.
-//
-// If filter != nil, only the files with os.FileInfo entries passing through
-// the filter (and ending in ".go") are considered. The mode bits are passed
-// to ParseFile unchanged. Position information is recorded in fset.
-//
-// If the directory couldn't be read, a nil map and the respective error are
-// returned. If a parse error occurred, a non-nil but incomplete map and the
-// first error encountered are returned.
-//
-func ParseDir(fset *token.FileSet, path string, filter func(os.FileInfo) bool, mode Mode) (pkgs map[string]*ast.Package, first error) {
-	fd, err := os.Open(path)
-	if err != nil {
-		return nil, err
-	}
-	defer fd.Close()
-
-	list, err := fd.Readdir(-1)
-	if err != nil {
-		return nil, err
-	}
-
-	pkgs = make(map[string]*ast.Package)
-	for _, d := range list {
-		if strings.HasSuffix(d.Name(), ".go") && (filter == nil || filter(d)) {
-			filename := filepath.Join(path, d.Name())
-			if src, err := ParseFile(fset, filename, nil, mode); err == nil {
-				name := src.Name.Name
-				pkg, found := pkgs[name]
-				if !found {
-					pkg = &ast.Package{
-						Name:  name,
-						Files: make(map[string]*ast.File),
-					}
-					pkgs[name] = pkg
-				}
-				pkg.Files[filename] = src
-			} else if first == nil {
-				first = err
-			}
-		}
-	}
-
-	return
-}
-
-// ParseExprFrom is a convenience function for parsing an expression.
-// The arguments have the same meaning as for Parse, but the source must
-// be a valid Go (type or value) expression.
-//
-func ParseExprFrom(fset *token.FileSet, filename string, src interface{}, mode Mode) (ast.Expr, error) {
-	// get source
-	text, err := readSource(filename, src)
-	if err != nil {
-		return nil, err
-	}
-
-	var p parser
-	defer func() {
-		if e := recover(); e != nil {
-			// resume same panic if it's not a bailout
-			if _, ok := e.(bailout); !ok {
-				panic(e)
-			}
-		}
-		p.errors.Sort()
-		err = p.errors.Err()
-	}()
-
-	// parse expr
-	p.init(fset, filename, text, mode)
-	// Set up pkg-level scopes to avoid nil-pointer errors.
-	// This is not needed for a correct expression x as the
-	// parser will be ok with a nil topScope, but be cautious
-	// in case of an erroneous x.
-	p.openScope()
-	p.pkgScope = p.topScope
-	e := p.parseRhsOrType()
-	p.closeScope()
-	assert(p.topScope == nil, "unbalanced scopes")
-
-	// If a semicolon was inserted, consume it;
-	// report an error if there's more tokens.
-	if p.tok == token.SEMICOLON && p.lit == "\n" {
-		p.next()
-	}
-	p.expect(token.EOF)
-
-	if p.errors.Len() > 0 {
-		p.errors.Sort()
-		return nil, p.errors.Err()
-	}
-
-	return e, nil
-}
-
-// ParseExpr is a convenience function for obtaining the AST of an expression x.
-// The position information recorded in the AST is undefined. The filename used
-// in error messages is the empty string.
-//
-func ParseExpr(x string) (ast.Expr, error) {
-	return ParseExprFrom(token.NewFileSet(), "", []byte(x), 0)
-}
diff --git a/third_party/gofrontend/libgo/go/go/parser/parser.go b/third_party/gofrontend/libgo/go/go/parser/parser.go
deleted file mode 100644
index e82c0bd..0000000
--- a/third_party/gofrontend/libgo/go/go/parser/parser.go
+++ /dev/null
@@ -1,2502 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package parser implements a parser for Go source files. Input may be
-// provided in a variety of forms (see the various Parse* functions); the
-// output is an abstract syntax tree (AST) representing the Go source. The
-// parser is invoked through one of the Parse* functions.
-//
-// The parser accepts a larger language than is syntactically permitted by
-// the Go spec, for simplicity, and for improved robustness in the presence
-// of syntax errors. For instance, in method declarations, the receiver is
-// treated like an ordinary parameter list and thus may contain multiple
-// entries where the spec permits exactly one. Consequently, the corresponding
-// field in the AST (ast.FuncDecl.Recv) field is not restricted to one entry.
-//
-package parser
-
-import (
-	"fmt"
-	"go/ast"
-	"go/scanner"
-	"go/token"
-	"strconv"
-	"strings"
-	"unicode"
-)
-
-// The parser structure holds the parser's internal state.
-type parser struct {
-	file    *token.File
-	errors  scanner.ErrorList
-	scanner scanner.Scanner
-
-	// Tracing/debugging
-	mode   Mode // parsing mode
-	trace  bool // == (mode & Trace != 0)
-	indent int  // indentation used for tracing output
-
-	// Comments
-	comments    []*ast.CommentGroup
-	leadComment *ast.CommentGroup // last lead comment
-	lineComment *ast.CommentGroup // last line comment
-
-	// Next token
-	pos token.Pos   // token position
-	tok token.Token // one token look-ahead
-	lit string      // token literal
-
-	// Error recovery
-	// (used to limit the number of calls to syncXXX functions
-	// w/o making scanning progress - avoids potential endless
-	// loops across multiple parser functions during error recovery)
-	syncPos token.Pos // last synchronization position
-	syncCnt int       // number of calls to syncXXX without progress
-
-	// Non-syntactic parser control
-	exprLev int  // < 0: in control clause, >= 0: in expression
-	inRhs   bool // if set, the parser is parsing a rhs expression
-
-	// Ordinary identifier scopes
-	pkgScope   *ast.Scope        // pkgScope.Outer == nil
-	topScope   *ast.Scope        // top-most scope; may be pkgScope
-	unresolved []*ast.Ident      // unresolved identifiers
-	imports    []*ast.ImportSpec // list of imports
-
-	// Label scopes
-	// (maintained by open/close LabelScope)
-	labelScope  *ast.Scope     // label scope for current function
-	targetStack [][]*ast.Ident // stack of unresolved labels
-}
-
-func (p *parser) init(fset *token.FileSet, filename string, src []byte, mode Mode) {
-	p.file = fset.AddFile(filename, -1, len(src))
-	var m scanner.Mode
-	if mode&ParseComments != 0 {
-		m = scanner.ScanComments
-	}
-	eh := func(pos token.Position, msg string) { p.errors.Add(pos, msg) }
-	p.scanner.Init(p.file, src, eh, m)
-
-	p.mode = mode
-	p.trace = mode&Trace != 0 // for convenience (p.trace is used frequently)
-
-	p.next()
-}
-
-// ----------------------------------------------------------------------------
-// Scoping support
-
-func (p *parser) openScope() {
-	p.topScope = ast.NewScope(p.topScope)
-}
-
-func (p *parser) closeScope() {
-	p.topScope = p.topScope.Outer
-}
-
-func (p *parser) openLabelScope() {
-	p.labelScope = ast.NewScope(p.labelScope)
-	p.targetStack = append(p.targetStack, nil)
-}
-
-func (p *parser) closeLabelScope() {
-	// resolve labels
-	n := len(p.targetStack) - 1
-	scope := p.labelScope
-	for _, ident := range p.targetStack[n] {
-		ident.Obj = scope.Lookup(ident.Name)
-		if ident.Obj == nil && p.mode&DeclarationErrors != 0 {
-			p.error(ident.Pos(), fmt.Sprintf("label %s undefined", ident.Name))
-		}
-	}
-	// pop label scope
-	p.targetStack = p.targetStack[0:n]
-	p.labelScope = p.labelScope.Outer
-}
-
-func (p *parser) declare(decl, data interface{}, scope *ast.Scope, kind ast.ObjKind, idents ...*ast.Ident) {
-	for _, ident := range idents {
-		assert(ident.Obj == nil, "identifier already declared or resolved")
-		obj := ast.NewObj(kind, ident.Name)
-		// remember the corresponding declaration for redeclaration
-		// errors and global variable resolution/typechecking phase
-		obj.Decl = decl
-		obj.Data = data
-		ident.Obj = obj
-		if ident.Name != "_" {
-			if alt := scope.Insert(obj); alt != nil && p.mode&DeclarationErrors != 0 {
-				prevDecl := ""
-				if pos := alt.Pos(); pos.IsValid() {
-					prevDecl = fmt.Sprintf("\n\tprevious declaration at %s", p.file.Position(pos))
-				}
-				p.error(ident.Pos(), fmt.Sprintf("%s redeclared in this block%s", ident.Name, prevDecl))
-			}
-		}
-	}
-}
-
-func (p *parser) shortVarDecl(decl *ast.AssignStmt, list []ast.Expr) {
-	// Go spec: A short variable declaration may redeclare variables
-	// provided they were originally declared in the same block with
-	// the same type, and at least one of the non-blank variables is new.
-	n := 0 // number of new variables
-	for _, x := range list {
-		if ident, isIdent := x.(*ast.Ident); isIdent {
-			assert(ident.Obj == nil, "identifier already declared or resolved")
-			obj := ast.NewObj(ast.Var, ident.Name)
-			// remember corresponding assignment for other tools
-			obj.Decl = decl
-			ident.Obj = obj
-			if ident.Name != "_" {
-				if alt := p.topScope.Insert(obj); alt != nil {
-					ident.Obj = alt // redeclaration
-				} else {
-					n++ // new declaration
-				}
-			}
-		} else {
-			p.errorExpected(x.Pos(), "identifier on left side of :=")
-		}
-	}
-	if n == 0 && p.mode&DeclarationErrors != 0 {
-		p.error(list[0].Pos(), "no new variables on left side of :=")
-	}
-}
-
-// The unresolved object is a sentinel to mark identifiers that have been added
-// to the list of unresolved identifiers. The sentinel is only used for verifying
-// internal consistency.
-var unresolved = new(ast.Object)
-
-// If x is an identifier, tryResolve attempts to resolve x by looking up
-// the object it denotes. If no object is found and collectUnresolved is
-// set, x is marked as unresolved and collected in the list of unresolved
-// identifiers.
-//
-func (p *parser) tryResolve(x ast.Expr, collectUnresolved bool) {
-	// nothing to do if x is not an identifier or the blank identifier
-	ident, _ := x.(*ast.Ident)
-	if ident == nil {
-		return
-	}
-	assert(ident.Obj == nil, "identifier already declared or resolved")
-	if ident.Name == "_" {
-		return
-	}
-	// try to resolve the identifier
-	for s := p.topScope; s != nil; s = s.Outer {
-		if obj := s.Lookup(ident.Name); obj != nil {
-			ident.Obj = obj
-			return
-		}
-	}
-	// all local scopes are known, so any unresolved identifier
-	// must be found either in the file scope, package scope
-	// (perhaps in another file), or universe scope --- collect
-	// them so that they can be resolved later
-	if collectUnresolved {
-		ident.Obj = unresolved
-		p.unresolved = append(p.unresolved, ident)
-	}
-}
-
-func (p *parser) resolve(x ast.Expr) {
-	p.tryResolve(x, true)
-}
-
-// ----------------------------------------------------------------------------
-// Parsing support
-
-func (p *parser) printTrace(a ...interface{}) {
-	const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "
-	const n = len(dots)
-	pos := p.file.Position(p.pos)
-	fmt.Printf("%5d:%3d: ", pos.Line, pos.Column)
-	i := 2 * p.indent
-	for i > n {
-		fmt.Print(dots)
-		i -= n
-	}
-	// i <= n
-	fmt.Print(dots[0:i])
-	fmt.Println(a...)
-}
-
-func trace(p *parser, msg string) *parser {
-	p.printTrace(msg, "(")
-	p.indent++
-	return p
-}
-
-// Usage pattern: defer un(trace(p, "..."))
-func un(p *parser) {
-	p.indent--
-	p.printTrace(")")
-}
-
-// Advance to the next token.
-func (p *parser) next0() {
-	// Because of one-token look-ahead, print the previous token
-	// when tracing as it provides a more readable output. The
-	// very first token (!p.pos.IsValid()) is not initialized
-	// (it is token.ILLEGAL), so don't print it .
-	if p.trace && p.pos.IsValid() {
-		s := p.tok.String()
-		switch {
-		case p.tok.IsLiteral():
-			p.printTrace(s, p.lit)
-		case p.tok.IsOperator(), p.tok.IsKeyword():
-			p.printTrace("\"" + s + "\"")
-		default:
-			p.printTrace(s)
-		}
-	}
-
-	p.pos, p.tok, p.lit = p.scanner.Scan()
-}
-
-// Consume a comment and return it and the line on which it ends.
-func (p *parser) consumeComment() (comment *ast.Comment, endline int) {
-	// /*-style comments may end on a different line than where they start.
-	// Scan the comment for '\n' chars and adjust endline accordingly.
-	endline = p.file.Line(p.pos)
-	if p.lit[1] == '*' {
-		// don't use range here - no need to decode Unicode code points
-		for i := 0; i < len(p.lit); i++ {
-			if p.lit[i] == '\n' {
-				endline++
-			}
-		}
-	}
-
-	comment = &ast.Comment{Slash: p.pos, Text: p.lit}
-	p.next0()
-
-	return
-}
-
-// Consume a group of adjacent comments, add it to the parser's
-// comments list, and return it together with the line at which
-// the last comment in the group ends. A non-comment token or n
-// empty lines terminate a comment group.
-//
-func (p *parser) consumeCommentGroup(n int) (comments *ast.CommentGroup, endline int) {
-	var list []*ast.Comment
-	endline = p.file.Line(p.pos)
-	for p.tok == token.COMMENT && p.file.Line(p.pos) <= endline+n {
-		var comment *ast.Comment
-		comment, endline = p.consumeComment()
-		list = append(list, comment)
-	}
-
-	// add comment group to the comments list
-	comments = &ast.CommentGroup{List: list}
-	p.comments = append(p.comments, comments)
-
-	return
-}
-
-// Advance to the next non-comment token. In the process, collect
-// any comment groups encountered, and remember the last lead and
-// and line comments.
-//
-// A lead comment is a comment group that starts and ends in a
-// line without any other tokens and that is followed by a non-comment
-// token on the line immediately after the comment group.
-//
-// A line comment is a comment group that follows a non-comment
-// token on the same line, and that has no tokens after it on the line
-// where it ends.
-//
-// Lead and line comments may be considered documentation that is
-// stored in the AST.
-//
-func (p *parser) next() {
-	p.leadComment = nil
-	p.lineComment = nil
-	prev := p.pos
-	p.next0()
-
-	if p.tok == token.COMMENT {
-		var comment *ast.CommentGroup
-		var endline int
-
-		if p.file.Line(p.pos) == p.file.Line(prev) {
-			// The comment is on same line as the previous token; it
-			// cannot be a lead comment but may be a line comment.
-			comment, endline = p.consumeCommentGroup(0)
-			if p.file.Line(p.pos) != endline {
-				// The next token is on a different line, thus
-				// the last comment group is a line comment.
-				p.lineComment = comment
-			}
-		}
-
-		// consume successor comments, if any
-		endline = -1
-		for p.tok == token.COMMENT {
-			comment, endline = p.consumeCommentGroup(1)
-		}
-
-		if endline+1 == p.file.Line(p.pos) {
-			// The next token is following on the line immediately after the
-			// comment group, thus the last comment group is a lead comment.
-			p.leadComment = comment
-		}
-	}
-}
-
-// A bailout panic is raised to indicate early termination.
-type bailout struct{}
-
-func (p *parser) error(pos token.Pos, msg string) {
-	epos := p.file.Position(pos)
-
-	// If AllErrors is not set, discard errors reported on the same line
-	// as the last recorded error and stop parsing if there are more than
-	// 10 errors.
-	if p.mode&AllErrors == 0 {
-		n := len(p.errors)
-		if n > 0 && p.errors[n-1].Pos.Line == epos.Line {
-			return // discard - likely a spurious error
-		}
-		if n > 10 {
-			panic(bailout{})
-		}
-	}
-
-	p.errors.Add(epos, msg)
-}
-
-func (p *parser) errorExpected(pos token.Pos, msg string) {
-	msg = "expected " + msg
-	if pos == p.pos {
-		// the error happened at the current position;
-		// make the error message more specific
-		if p.tok == token.SEMICOLON && p.lit == "\n" {
-			msg += ", found newline"
-		} else {
-			msg += ", found '" + p.tok.String() + "'"
-			if p.tok.IsLiteral() {
-				msg += " " + p.lit
-			}
-		}
-	}
-	p.error(pos, msg)
-}
-
-func (p *parser) expect(tok token.Token) token.Pos {
-	pos := p.pos
-	if p.tok != tok {
-		p.errorExpected(pos, "'"+tok.String()+"'")
-	}
-	p.next() // make progress
-	return pos
-}
-
-// expectClosing is like expect but provides a better error message
-// for the common case of a missing comma before a newline.
-//
-func (p *parser) expectClosing(tok token.Token, context string) token.Pos {
-	if p.tok != tok && p.tok == token.SEMICOLON && p.lit == "\n" {
-		p.error(p.pos, "missing ',' before newline in "+context)
-		p.next()
-	}
-	return p.expect(tok)
-}
-
-func (p *parser) expectSemi() {
-	// semicolon is optional before a closing ')' or '}'
-	if p.tok != token.RPAREN && p.tok != token.RBRACE {
-		if p.tok == token.SEMICOLON {
-			p.next()
-		} else {
-			p.errorExpected(p.pos, "';'")
-			syncStmt(p)
-		}
-	}
-}
-
-func (p *parser) atComma(context string, follow token.Token) bool {
-	if p.tok == token.COMMA {
-		return true
-	}
-	if p.tok != follow {
-		msg := "missing ','"
-		if p.tok == token.SEMICOLON && p.lit == "\n" {
-			msg += " before newline"
-		}
-		p.error(p.pos, msg+" in "+context)
-		return true // "insert" comma and continue
-	}
-	return false
-}
-
-func assert(cond bool, msg string) {
-	if !cond {
-		panic("go/parser internal error: " + msg)
-	}
-}
-
-// syncStmt advances to the next statement.
-// Used for synchronization after an error.
-//
-func syncStmt(p *parser) {
-	for {
-		switch p.tok {
-		case token.BREAK, token.CONST, token.CONTINUE, token.DEFER,
-			token.FALLTHROUGH, token.FOR, token.GO, token.GOTO,
-			token.IF, token.RETURN, token.SELECT, token.SWITCH,
-			token.TYPE, token.VAR:
-			// Return only if parser made some progress since last
-			// sync or if it has not reached 10 sync calls without
-			// progress. Otherwise consume at least one token to
-			// avoid an endless parser loop (it is possible that
-			// both parseOperand and parseStmt call syncStmt and
-			// correctly do not advance, thus the need for the
-			// invocation limit p.syncCnt).
-			if p.pos == p.syncPos && p.syncCnt < 10 {
-				p.syncCnt++
-				return
-			}
-			if p.pos > p.syncPos {
-				p.syncPos = p.pos
-				p.syncCnt = 0
-				return
-			}
-			// Reaching here indicates a parser bug, likely an
-			// incorrect token list in this function, but it only
-			// leads to skipping of possibly correct code if a
-			// previous error is present, and thus is preferred
-			// over a non-terminating parse.
-		case token.EOF:
-			return
-		}
-		p.next()
-	}
-}
-
-// syncDecl advances to the next declaration.
-// Used for synchronization after an error.
-//
-func syncDecl(p *parser) {
-	for {
-		switch p.tok {
-		case token.CONST, token.TYPE, token.VAR:
-			// see comments in syncStmt
-			if p.pos == p.syncPos && p.syncCnt < 10 {
-				p.syncCnt++
-				return
-			}
-			if p.pos > p.syncPos {
-				p.syncPos = p.pos
-				p.syncCnt = 0
-				return
-			}
-		case token.EOF:
-			return
-		}
-		p.next()
-	}
-}
-
-// safePos returns a valid file position for a given position: If pos
-// is valid to begin with, safePos returns pos. If pos is out-of-range,
-// safePos returns the EOF position.
-//
-// This is hack to work around "artificial" end positions in the AST which
-// are computed by adding 1 to (presumably valid) token positions. If the
-// token positions are invalid due to parse errors, the resulting end position
-// may be past the file's EOF position, which would lead to panics if used
-// later on.
-//
-func (p *parser) safePos(pos token.Pos) (res token.Pos) {
-	defer func() {
-		if recover() != nil {
-			res = token.Pos(p.file.Base() + p.file.Size()) // EOF position
-		}
-	}()
-	_ = p.file.Offset(pos) // trigger a panic if position is out-of-range
-	return pos
-}
-
-// ----------------------------------------------------------------------------
-// Identifiers
-
-func (p *parser) parseIdent() *ast.Ident {
-	pos := p.pos
-	name := "_"
-	if p.tok == token.IDENT {
-		name = p.lit
-		p.next()
-	} else {
-		p.expect(token.IDENT) // use expect() error handling
-	}
-	return &ast.Ident{NamePos: pos, Name: name}
-}
-
-func (p *parser) parseIdentList() (list []*ast.Ident) {
-	if p.trace {
-		defer un(trace(p, "IdentList"))
-	}
-
-	list = append(list, p.parseIdent())
-	for p.tok == token.COMMA {
-		p.next()
-		list = append(list, p.parseIdent())
-	}
-
-	return
-}
-
-// ----------------------------------------------------------------------------
-// Common productions
-
-// If lhs is set, result list elements which are identifiers are not resolved.
-func (p *parser) parseExprList(lhs bool) (list []ast.Expr) {
-	if p.trace {
-		defer un(trace(p, "ExpressionList"))
-	}
-
-	list = append(list, p.checkExpr(p.parseExpr(lhs)))
-	for p.tok == token.COMMA {
-		p.next()
-		list = append(list, p.checkExpr(p.parseExpr(lhs)))
-	}
-
-	return
-}
-
-func (p *parser) parseLhsList() []ast.Expr {
-	old := p.inRhs
-	p.inRhs = false
-	list := p.parseExprList(true)
-	switch p.tok {
-	case token.DEFINE:
-		// lhs of a short variable declaration
-		// but doesn't enter scope until later:
-		// caller must call p.shortVarDecl(p.makeIdentList(list))
-		// at appropriate time.
-	case token.COLON:
-		// lhs of a label declaration or a communication clause of a select
-		// statement (parseLhsList is not called when parsing the case clause
-		// of a switch statement):
-		// - labels are declared by the caller of parseLhsList
-		// - for communication clauses, if there is a stand-alone identifier
-		//   followed by a colon, we have a syntax error; there is no need
-		//   to resolve the identifier in that case
-	default:
-		// identifiers must be declared elsewhere
-		for _, x := range list {
-			p.resolve(x)
-		}
-	}
-	p.inRhs = old
-	return list
-}
-
-func (p *parser) parseRhsList() []ast.Expr {
-	old := p.inRhs
-	p.inRhs = true
-	list := p.parseExprList(false)
-	p.inRhs = old
-	return list
-}
-
-// ----------------------------------------------------------------------------
-// Types
-
-func (p *parser) parseType() ast.Expr {
-	if p.trace {
-		defer un(trace(p, "Type"))
-	}
-
-	typ := p.tryType()
-
-	if typ == nil {
-		pos := p.pos
-		p.errorExpected(pos, "type")
-		p.next() // make progress
-		return &ast.BadExpr{From: pos, To: p.pos}
-	}
-
-	return typ
-}
-
-// If the result is an identifier, it is not resolved.
-func (p *parser) parseTypeName() ast.Expr {
-	if p.trace {
-		defer un(trace(p, "TypeName"))
-	}
-
-	ident := p.parseIdent()
-	// don't resolve ident yet - it may be a parameter or field name
-
-	if p.tok == token.PERIOD {
-		// ident is a package name
-		p.next()
-		p.resolve(ident)
-		sel := p.parseIdent()
-		return &ast.SelectorExpr{X: ident, Sel: sel}
-	}
-
-	return ident
-}
-
-func (p *parser) parseArrayType() ast.Expr {
-	if p.trace {
-		defer un(trace(p, "ArrayType"))
-	}
-
-	lbrack := p.expect(token.LBRACK)
-	p.exprLev++
-	var len ast.Expr
-	// always permit ellipsis for more fault-tolerant parsing
-	if p.tok == token.ELLIPSIS {
-		len = &ast.Ellipsis{Ellipsis: p.pos}
-		p.next()
-	} else if p.tok != token.RBRACK {
-		len = p.parseRhs()
-	}
-	p.exprLev--
-	p.expect(token.RBRACK)
-	elt := p.parseType()
-
-	return &ast.ArrayType{Lbrack: lbrack, Len: len, Elt: elt}
-}
-
-func (p *parser) makeIdentList(list []ast.Expr) []*ast.Ident {
-	idents := make([]*ast.Ident, len(list))
-	for i, x := range list {
-		ident, isIdent := x.(*ast.Ident)
-		if !isIdent {
-			if _, isBad := x.(*ast.BadExpr); !isBad {
-				// only report error if it's a new one
-				p.errorExpected(x.Pos(), "identifier")
-			}
-			ident = &ast.Ident{NamePos: x.Pos(), Name: "_"}
-		}
-		idents[i] = ident
-	}
-	return idents
-}
-
-func (p *parser) parseFieldDecl(scope *ast.Scope) *ast.Field {
-	if p.trace {
-		defer un(trace(p, "FieldDecl"))
-	}
-
-	doc := p.leadComment
-
-	// FieldDecl
-	list, typ := p.parseVarList(false)
-
-	// Tag
-	var tag *ast.BasicLit
-	if p.tok == token.STRING {
-		tag = &ast.BasicLit{ValuePos: p.pos, Kind: p.tok, Value: p.lit}
-		p.next()
-	}
-
-	// analyze case
-	var idents []*ast.Ident
-	if typ != nil {
-		// IdentifierList Type
-		idents = p.makeIdentList(list)
-	} else {
-		// ["*"] TypeName (AnonymousField)
-		typ = list[0] // we always have at least one element
-		if n := len(list); n > 1 || !isTypeName(deref(typ)) {
-			pos := typ.Pos()
-			p.errorExpected(pos, "anonymous field")
-			typ = &ast.BadExpr{From: pos, To: p.safePos(list[n-1].End())}
-		}
-	}
-
-	p.expectSemi() // call before accessing p.linecomment
-
-	field := &ast.Field{Doc: doc, Names: idents, Type: typ, Tag: tag, Comment: p.lineComment}
-	p.declare(field, nil, scope, ast.Var, idents...)
-	p.resolve(typ)
-
-	return field
-}
-
-func (p *parser) parseStructType() *ast.StructType {
-	if p.trace {
-		defer un(trace(p, "StructType"))
-	}
-
-	pos := p.expect(token.STRUCT)
-	lbrace := p.expect(token.LBRACE)
-	scope := ast.NewScope(nil) // struct scope
-	var list []*ast.Field
-	for p.tok == token.IDENT || p.tok == token.MUL || p.tok == token.LPAREN {
-		// a field declaration cannot start with a '(' but we accept
-		// it here for more robust parsing and better error messages
-		// (parseFieldDecl will check and complain if necessary)
-		list = append(list, p.parseFieldDecl(scope))
-	}
-	rbrace := p.expect(token.RBRACE)
-
-	return &ast.StructType{
-		Struct: pos,
-		Fields: &ast.FieldList{
-			Opening: lbrace,
-			List:    list,
-			Closing: rbrace,
-		},
-	}
-}
-
-func (p *parser) parsePointerType() *ast.StarExpr {
-	if p.trace {
-		defer un(trace(p, "PointerType"))
-	}
-
-	star := p.expect(token.MUL)
-	base := p.parseType()
-
-	return &ast.StarExpr{Star: star, X: base}
-}
-
-// If the result is an identifier, it is not resolved.
-func (p *parser) tryVarType(isParam bool) ast.Expr {
-	if isParam && p.tok == token.ELLIPSIS {
-		pos := p.pos
-		p.next()
-		typ := p.tryIdentOrType() // don't use parseType so we can provide better error message
-		if typ != nil {
-			p.resolve(typ)
-		} else {
-			p.error(pos, "'...' parameter is missing type")
-			typ = &ast.BadExpr{From: pos, To: p.pos}
-		}
-		return &ast.Ellipsis{Ellipsis: pos, Elt: typ}
-	}
-	return p.tryIdentOrType()
-}
-
-// If the result is an identifier, it is not resolved.
-func (p *parser) parseVarType(isParam bool) ast.Expr {
-	typ := p.tryVarType(isParam)
-	if typ == nil {
-		pos := p.pos
-		p.errorExpected(pos, "type")
-		p.next() // make progress
-		typ = &ast.BadExpr{From: pos, To: p.pos}
-	}
-	return typ
-}
-
-// If any of the results are identifiers, they are not resolved.
-func (p *parser) parseVarList(isParam bool) (list []ast.Expr, typ ast.Expr) {
-	if p.trace {
-		defer un(trace(p, "VarList"))
-	}
-
-	// a list of identifiers looks like a list of type names
-	//
-	// parse/tryVarType accepts any type (including parenthesized
-	// ones) even though the syntax does not permit them here: we
-	// accept them all for more robust parsing and complain later
-	for typ := p.parseVarType(isParam); typ != nil; {
-		list = append(list, typ)
-		if p.tok != token.COMMA {
-			break
-		}
-		p.next()
-		typ = p.tryVarType(isParam) // maybe nil as in: func f(int,) {}
-	}
-
-	// if we had a list of identifiers, it must be followed by a type
-	typ = p.tryVarType(isParam)
-
-	return
-}
-
-func (p *parser) parseParameterList(scope *ast.Scope, ellipsisOk bool) (params []*ast.Field) {
-	if p.trace {
-		defer un(trace(p, "ParameterList"))
-	}
-
-	// ParameterDecl
-	list, typ := p.parseVarList(ellipsisOk)
-
-	// analyze case
-	if typ != nil {
-		// IdentifierList Type
-		idents := p.makeIdentList(list)
-		field := &ast.Field{Names: idents, Type: typ}
-		params = append(params, field)
-		// Go spec: The scope of an identifier denoting a function
-		// parameter or result variable is the function body.
-		p.declare(field, nil, scope, ast.Var, idents...)
-		p.resolve(typ)
-		if !p.atComma("parameter list", token.RPAREN) {
-			return
-		}
-		p.next()
-		for p.tok != token.RPAREN && p.tok != token.EOF {
-			idents := p.parseIdentList()
-			typ := p.parseVarType(ellipsisOk)
-			field := &ast.Field{Names: idents, Type: typ}
-			params = append(params, field)
-			// Go spec: The scope of an identifier denoting a function
-			// parameter or result variable is the function body.
-			p.declare(field, nil, scope, ast.Var, idents...)
-			p.resolve(typ)
-			if !p.atComma("parameter list", token.RPAREN) {
-				break
-			}
-			p.next()
-		}
-		return
-	}
-
-	// Type { "," Type } (anonymous parameters)
-	params = make([]*ast.Field, len(list))
-	for i, typ := range list {
-		p.resolve(typ)
-		params[i] = &ast.Field{Type: typ}
-	}
-	return
-}
-
-func (p *parser) parseParameters(scope *ast.Scope, ellipsisOk bool) *ast.FieldList {
-	if p.trace {
-		defer un(trace(p, "Parameters"))
-	}
-
-	var params []*ast.Field
-	lparen := p.expect(token.LPAREN)
-	if p.tok != token.RPAREN {
-		params = p.parseParameterList(scope, ellipsisOk)
-	}
-	rparen := p.expect(token.RPAREN)
-
-	return &ast.FieldList{Opening: lparen, List: params, Closing: rparen}
-}
-
-func (p *parser) parseResult(scope *ast.Scope) *ast.FieldList {
-	if p.trace {
-		defer un(trace(p, "Result"))
-	}
-
-	if p.tok == token.LPAREN {
-		return p.parseParameters(scope, false)
-	}
-
-	typ := p.tryType()
-	if typ != nil {
-		list := make([]*ast.Field, 1)
-		list[0] = &ast.Field{Type: typ}
-		return &ast.FieldList{List: list}
-	}
-
-	return nil
-}
-
-func (p *parser) parseSignature(scope *ast.Scope) (params, results *ast.FieldList) {
-	if p.trace {
-		defer un(trace(p, "Signature"))
-	}
-
-	params = p.parseParameters(scope, true)
-	results = p.parseResult(scope)
-
-	return
-}
-
-func (p *parser) parseFuncType() (*ast.FuncType, *ast.Scope) {
-	if p.trace {
-		defer un(trace(p, "FuncType"))
-	}
-
-	pos := p.expect(token.FUNC)
-	scope := ast.NewScope(p.topScope) // function scope
-	params, results := p.parseSignature(scope)
-
-	return &ast.FuncType{Func: pos, Params: params, Results: results}, scope
-}
-
-func (p *parser) parseMethodSpec(scope *ast.Scope) *ast.Field {
-	if p.trace {
-		defer un(trace(p, "MethodSpec"))
-	}
-
-	doc := p.leadComment
-	var idents []*ast.Ident
-	var typ ast.Expr
-	x := p.parseTypeName()
-	if ident, isIdent := x.(*ast.Ident); isIdent && p.tok == token.LPAREN {
-		// method
-		idents = []*ast.Ident{ident}
-		scope := ast.NewScope(nil) // method scope
-		params, results := p.parseSignature(scope)
-		typ = &ast.FuncType{Func: token.NoPos, Params: params, Results: results}
-	} else {
-		// embedded interface
-		typ = x
-		p.resolve(typ)
-	}
-	p.expectSemi() // call before accessing p.linecomment
-
-	spec := &ast.Field{Doc: doc, Names: idents, Type: typ, Comment: p.lineComment}
-	p.declare(spec, nil, scope, ast.Fun, idents...)
-
-	return spec
-}
-
-func (p *parser) parseInterfaceType() *ast.InterfaceType {
-	if p.trace {
-		defer un(trace(p, "InterfaceType"))
-	}
-
-	pos := p.expect(token.INTERFACE)
-	lbrace := p.expect(token.LBRACE)
-	scope := ast.NewScope(nil) // interface scope
-	var list []*ast.Field
-	for p.tok == token.IDENT {
-		list = append(list, p.parseMethodSpec(scope))
-	}
-	rbrace := p.expect(token.RBRACE)
-
-	return &ast.InterfaceType{
-		Interface: pos,
-		Methods: &ast.FieldList{
-			Opening: lbrace,
-			List:    list,
-			Closing: rbrace,
-		},
-	}
-}
-
-func (p *parser) parseMapType() *ast.MapType {
-	if p.trace {
-		defer un(trace(p, "MapType"))
-	}
-
-	pos := p.expect(token.MAP)
-	p.expect(token.LBRACK)
-	key := p.parseType()
-	p.expect(token.RBRACK)
-	value := p.parseType()
-
-	return &ast.MapType{Map: pos, Key: key, Value: value}
-}
-
-func (p *parser) parseChanType() *ast.ChanType {
-	if p.trace {
-		defer un(trace(p, "ChanType"))
-	}
-
-	pos := p.pos
-	dir := ast.SEND | ast.RECV
-	var arrow token.Pos
-	if p.tok == token.CHAN {
-		p.next()
-		if p.tok == token.ARROW {
-			arrow = p.pos
-			p.next()
-			dir = ast.SEND
-		}
-	} else {
-		arrow = p.expect(token.ARROW)
-		p.expect(token.CHAN)
-		dir = ast.RECV
-	}
-	value := p.parseType()
-
-	return &ast.ChanType{Begin: pos, Arrow: arrow, Dir: dir, Value: value}
-}
-
-// If the result is an identifier, it is not resolved.
-func (p *parser) tryIdentOrType() ast.Expr {
-	switch p.tok {
-	case token.IDENT:
-		return p.parseTypeName()
-	case token.LBRACK:
-		return p.parseArrayType()
-	case token.STRUCT:
-		return p.parseStructType()
-	case token.MUL:
-		return p.parsePointerType()
-	case token.FUNC:
-		typ, _ := p.parseFuncType()
-		return typ
-	case token.INTERFACE:
-		return p.parseInterfaceType()
-	case token.MAP:
-		return p.parseMapType()
-	case token.CHAN, token.ARROW:
-		return p.parseChanType()
-	case token.LPAREN:
-		lparen := p.pos
-		p.next()
-		typ := p.parseType()
-		rparen := p.expect(token.RPAREN)
-		return &ast.ParenExpr{Lparen: lparen, X: typ, Rparen: rparen}
-	}
-
-	// no type found
-	return nil
-}
-
-func (p *parser) tryType() ast.Expr {
-	typ := p.tryIdentOrType()
-	if typ != nil {
-		p.resolve(typ)
-	}
-	return typ
-}
-
-// ----------------------------------------------------------------------------
-// Blocks
-
-func (p *parser) parseStmtList() (list []ast.Stmt) {
-	if p.trace {
-		defer un(trace(p, "StatementList"))
-	}
-
-	for p.tok != token.CASE && p.tok != token.DEFAULT && p.tok != token.RBRACE && p.tok != token.EOF {
-		list = append(list, p.parseStmt())
-	}
-
-	return
-}
-
-func (p *parser) parseBody(scope *ast.Scope) *ast.BlockStmt {
-	if p.trace {
-		defer un(trace(p, "Body"))
-	}
-
-	lbrace := p.expect(token.LBRACE)
-	p.topScope = scope // open function scope
-	p.openLabelScope()
-	list := p.parseStmtList()
-	p.closeLabelScope()
-	p.closeScope()
-	rbrace := p.expect(token.RBRACE)
-
-	return &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace}
-}
-
-func (p *parser) parseBlockStmt() *ast.BlockStmt {
-	if p.trace {
-		defer un(trace(p, "BlockStmt"))
-	}
-
-	lbrace := p.expect(token.LBRACE)
-	p.openScope()
-	list := p.parseStmtList()
-	p.closeScope()
-	rbrace := p.expect(token.RBRACE)
-
-	return &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace}
-}
-
-// ----------------------------------------------------------------------------
-// Expressions
-
-func (p *parser) parseFuncTypeOrLit() ast.Expr {
-	if p.trace {
-		defer un(trace(p, "FuncTypeOrLit"))
-	}
-
-	typ, scope := p.parseFuncType()
-	if p.tok != token.LBRACE {
-		// function type only
-		return typ
-	}
-
-	p.exprLev++
-	body := p.parseBody(scope)
-	p.exprLev--
-
-	return &ast.FuncLit{Type: typ, Body: body}
-}
-
-// parseOperand may return an expression or a raw type (incl. array
-// types of the form [...]T. Callers must verify the result.
-// If lhs is set and the result is an identifier, it is not resolved.
-//
-func (p *parser) parseOperand(lhs bool) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "Operand"))
-	}
-
-	switch p.tok {
-	case token.IDENT:
-		x := p.parseIdent()
-		if !lhs {
-			p.resolve(x)
-		}
-		return x
-
-	case token.INT, token.FLOAT, token.IMAG, token.CHAR, token.STRING:
-		x := &ast.BasicLit{ValuePos: p.pos, Kind: p.tok, Value: p.lit}
-		p.next()
-		return x
-
-	case token.LPAREN:
-		lparen := p.pos
-		p.next()
-		p.exprLev++
-		x := p.parseRhsOrType() // types may be parenthesized: (some type)
-		p.exprLev--
-		rparen := p.expect(token.RPAREN)
-		return &ast.ParenExpr{Lparen: lparen, X: x, Rparen: rparen}
-
-	case token.FUNC:
-		return p.parseFuncTypeOrLit()
-	}
-
-	if typ := p.tryIdentOrType(); typ != nil {
-		// could be type for composite literal or conversion
-		_, isIdent := typ.(*ast.Ident)
-		assert(!isIdent, "type cannot be identifier")
-		return typ
-	}
-
-	// we have an error
-	pos := p.pos
-	p.errorExpected(pos, "operand")
-	syncStmt(p)
-	return &ast.BadExpr{From: pos, To: p.pos}
-}
-
-func (p *parser) parseSelector(x ast.Expr) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "Selector"))
-	}
-
-	sel := p.parseIdent()
-
-	return &ast.SelectorExpr{X: x, Sel: sel}
-}
-
-func (p *parser) parseTypeAssertion(x ast.Expr) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "TypeAssertion"))
-	}
-
-	lparen := p.expect(token.LPAREN)
-	var typ ast.Expr
-	if p.tok == token.TYPE {
-		// type switch: typ == nil
-		p.next()
-	} else {
-		typ = p.parseType()
-	}
-	rparen := p.expect(token.RPAREN)
-
-	return &ast.TypeAssertExpr{X: x, Type: typ, Lparen: lparen, Rparen: rparen}
-}
-
-func (p *parser) parseIndexOrSlice(x ast.Expr) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "IndexOrSlice"))
-	}
-
-	const N = 3 // change the 3 to 2 to disable 3-index slices
-	lbrack := p.expect(token.LBRACK)
-	p.exprLev++
-	var index [N]ast.Expr
-	var colons [N - 1]token.Pos
-	if p.tok != token.COLON {
-		index[0] = p.parseRhs()
-	}
-	ncolons := 0
-	for p.tok == token.COLON && ncolons < len(colons) {
-		colons[ncolons] = p.pos
-		ncolons++
-		p.next()
-		if p.tok != token.COLON && p.tok != token.RBRACK && p.tok != token.EOF {
-			index[ncolons] = p.parseRhs()
-		}
-	}
-	p.exprLev--
-	rbrack := p.expect(token.RBRACK)
-
-	if ncolons > 0 {
-		// slice expression
-		slice3 := false
-		if ncolons == 2 {
-			slice3 = true
-			// Check presence of 2nd and 3rd index here rather than during type-checking
-			// to prevent erroneous programs from passing through gofmt (was issue 7305).
-			if index[1] == nil {
-				p.error(colons[0], "2nd index required in 3-index slice")
-				index[1] = &ast.BadExpr{From: colons[0] + 1, To: colons[1]}
-			}
-			if index[2] == nil {
-				p.error(colons[1], "3rd index required in 3-index slice")
-				index[2] = &ast.BadExpr{From: colons[1] + 1, To: rbrack}
-			}
-		}
-		return &ast.SliceExpr{X: x, Lbrack: lbrack, Low: index[0], High: index[1], Max: index[2], Slice3: slice3, Rbrack: rbrack}
-	}
-
-	return &ast.IndexExpr{X: x, Lbrack: lbrack, Index: index[0], Rbrack: rbrack}
-}
-
-func (p *parser) parseCallOrConversion(fun ast.Expr) *ast.CallExpr {
-	if p.trace {
-		defer un(trace(p, "CallOrConversion"))
-	}
-
-	lparen := p.expect(token.LPAREN)
-	p.exprLev++
-	var list []ast.Expr
-	var ellipsis token.Pos
-	for p.tok != token.RPAREN && p.tok != token.EOF && !ellipsis.IsValid() {
-		list = append(list, p.parseRhsOrType()) // builtins may expect a type: make(some type, ...)
-		if p.tok == token.ELLIPSIS {
-			ellipsis = p.pos
-			p.next()
-		}
-		if !p.atComma("argument list", token.RPAREN) {
-			break
-		}
-		p.next()
-	}
-	p.exprLev--
-	rparen := p.expectClosing(token.RPAREN, "argument list")
-
-	return &ast.CallExpr{Fun: fun, Lparen: lparen, Args: list, Ellipsis: ellipsis, Rparen: rparen}
-}
-
-func (p *parser) parseValue(keyOk bool) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "Element"))
-	}
-
-	if p.tok == token.LBRACE {
-		return p.parseLiteralValue(nil)
-	}
-
-	// Because the parser doesn't know the composite literal type, it cannot
-	// know if a key that's an identifier is a struct field name or a name
-	// denoting a value. The former is not resolved by the parser or the
-	// resolver.
-	//
-	// Instead, _try_ to resolve such a key if possible. If it resolves,
-	// it a) has correctly resolved, or b) incorrectly resolved because
-	// the key is a struct field with a name matching another identifier.
-	// In the former case we are done, and in the latter case we don't
-	// care because the type checker will do a separate field lookup.
-	//
-	// If the key does not resolve, it a) must be defined at the top
-	// level in another file of the same package, the universe scope, or be
-	// undeclared; or b) it is a struct field. In the former case, the type
-	// checker can do a top-level lookup, and in the latter case it will do
-	// a separate field lookup.
-	x := p.checkExpr(p.parseExpr(keyOk))
-	if keyOk {
-		if p.tok == token.COLON {
-			// Try to resolve the key but don't collect it
-			// as unresolved identifier if it fails so that
-			// we don't get (possibly false) errors about
-			// undeclared names.
-			p.tryResolve(x, false)
-		} else {
-			// not a key
-			p.resolve(x)
-		}
-	}
-
-	return x
-}
-
-func (p *parser) parseElement() ast.Expr {
-	if p.trace {
-		defer un(trace(p, "Element"))
-	}
-
-	x := p.parseValue(true)
-	if p.tok == token.COLON {
-		colon := p.pos
-		p.next()
-		x = &ast.KeyValueExpr{Key: x, Colon: colon, Value: p.parseValue(false)}
-	}
-
-	return x
-}
-
-func (p *parser) parseElementList() (list []ast.Expr) {
-	if p.trace {
-		defer un(trace(p, "ElementList"))
-	}
-
-	for p.tok != token.RBRACE && p.tok != token.EOF {
-		list = append(list, p.parseElement())
-		if !p.atComma("composite literal", token.RBRACE) {
-			break
-		}
-		p.next()
-	}
-
-	return
-}
-
-func (p *parser) parseLiteralValue(typ ast.Expr) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "LiteralValue"))
-	}
-
-	lbrace := p.expect(token.LBRACE)
-	var elts []ast.Expr
-	p.exprLev++
-	if p.tok != token.RBRACE {
-		elts = p.parseElementList()
-	}
-	p.exprLev--
-	rbrace := p.expectClosing(token.RBRACE, "composite literal")
-	return &ast.CompositeLit{Type: typ, Lbrace: lbrace, Elts: elts, Rbrace: rbrace}
-}
-
-// checkExpr checks that x is an expression (and not a type).
-func (p *parser) checkExpr(x ast.Expr) ast.Expr {
-	switch unparen(x).(type) {
-	case *ast.BadExpr:
-	case *ast.Ident:
-	case *ast.BasicLit:
-	case *ast.FuncLit:
-	case *ast.CompositeLit:
-	case *ast.ParenExpr:
-		panic("unreachable")
-	case *ast.SelectorExpr:
-	case *ast.IndexExpr:
-	case *ast.SliceExpr:
-	case *ast.TypeAssertExpr:
-		// If t.Type == nil we have a type assertion of the form
-		// y.(type), which is only allowed in type switch expressions.
-		// It's hard to exclude those but for the case where we are in
-		// a type switch. Instead be lenient and test this in the type
-		// checker.
-	case *ast.CallExpr:
-	case *ast.StarExpr:
-	case *ast.UnaryExpr:
-	case *ast.BinaryExpr:
-	default:
-		// all other nodes are not proper expressions
-		p.errorExpected(x.Pos(), "expression")
-		x = &ast.BadExpr{From: x.Pos(), To: p.safePos(x.End())}
-	}
-	return x
-}
-
-// isTypeName reports whether x is a (qualified) TypeName.
-func isTypeName(x ast.Expr) bool {
-	switch t := x.(type) {
-	case *ast.BadExpr:
-	case *ast.Ident:
-	case *ast.SelectorExpr:
-		_, isIdent := t.X.(*ast.Ident)
-		return isIdent
-	default:
-		return false // all other nodes are not type names
-	}
-	return true
-}
-
-// isLiteralType reports whether x is a legal composite literal type.
-func isLiteralType(x ast.Expr) bool {
-	switch t := x.(type) {
-	case *ast.BadExpr:
-	case *ast.Ident:
-	case *ast.SelectorExpr:
-		_, isIdent := t.X.(*ast.Ident)
-		return isIdent
-	case *ast.ArrayType:
-	case *ast.StructType:
-	case *ast.MapType:
-	default:
-		return false // all other nodes are not legal composite literal types
-	}
-	return true
-}
-
-// If x is of the form *T, deref returns T, otherwise it returns x.
-func deref(x ast.Expr) ast.Expr {
-	if p, isPtr := x.(*ast.StarExpr); isPtr {
-		x = p.X
-	}
-	return x
-}
-
-// If x is of the form (T), unparen returns unparen(T), otherwise it returns x.
-func unparen(x ast.Expr) ast.Expr {
-	if p, isParen := x.(*ast.ParenExpr); isParen {
-		x = unparen(p.X)
-	}
-	return x
-}
-
-// checkExprOrType checks that x is an expression or a type
-// (and not a raw type such as [...]T).
-//
-func (p *parser) checkExprOrType(x ast.Expr) ast.Expr {
-	switch t := unparen(x).(type) {
-	case *ast.ParenExpr:
-		panic("unreachable")
-	case *ast.UnaryExpr:
-	case *ast.ArrayType:
-		if len, isEllipsis := t.Len.(*ast.Ellipsis); isEllipsis {
-			p.error(len.Pos(), "expected array length, found '...'")
-			x = &ast.BadExpr{From: x.Pos(), To: p.safePos(x.End())}
-		}
-	}
-
-	// all other nodes are expressions or types
-	return x
-}
-
-// If lhs is set and the result is an identifier, it is not resolved.
-func (p *parser) parsePrimaryExpr(lhs bool) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "PrimaryExpr"))
-	}
-
-	x := p.parseOperand(lhs)
-L:
-	for {
-		switch p.tok {
-		case token.PERIOD:
-			p.next()
-			if lhs {
-				p.resolve(x)
-			}
-			switch p.tok {
-			case token.IDENT:
-				x = p.parseSelector(p.checkExprOrType(x))
-			case token.LPAREN:
-				x = p.parseTypeAssertion(p.checkExpr(x))
-			default:
-				pos := p.pos
-				p.errorExpected(pos, "selector or type assertion")
-				p.next() // make progress
-				sel := &ast.Ident{NamePos: pos, Name: "_"}
-				x = &ast.SelectorExpr{X: x, Sel: sel}
-			}
-		case token.LBRACK:
-			if lhs {
-				p.resolve(x)
-			}
-			x = p.parseIndexOrSlice(p.checkExpr(x))
-		case token.LPAREN:
-			if lhs {
-				p.resolve(x)
-			}
-			x = p.parseCallOrConversion(p.checkExprOrType(x))
-		case token.LBRACE:
-			if isLiteralType(x) && (p.exprLev >= 0 || !isTypeName(x)) {
-				if lhs {
-					p.resolve(x)
-				}
-				x = p.parseLiteralValue(x)
-			} else {
-				break L
-			}
-		default:
-			break L
-		}
-		lhs = false // no need to try to resolve again
-	}
-
-	return x
-}
-
-// If lhs is set and the result is an identifier, it is not resolved.
-func (p *parser) parseUnaryExpr(lhs bool) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "UnaryExpr"))
-	}
-
-	switch p.tok {
-	case token.ADD, token.SUB, token.NOT, token.XOR, token.AND:
-		pos, op := p.pos, p.tok
-		p.next()
-		x := p.parseUnaryExpr(false)
-		return &ast.UnaryExpr{OpPos: pos, Op: op, X: p.checkExpr(x)}
-
-	case token.ARROW:
-		// channel type or receive expression
-		arrow := p.pos
-		p.next()
-
-		// If the next token is token.CHAN we still don't know if it
-		// is a channel type or a receive operation - we only know
-		// once we have found the end of the unary expression. There
-		// are two cases:
-		//
-		//   <- type  => (<-type) must be channel type
-		//   <- expr  => <-(expr) is a receive from an expression
-		//
-		// In the first case, the arrow must be re-associated with
-		// the channel type parsed already:
-		//
-		//   <- (chan type)    =>  (<-chan type)
-		//   <- (chan<- type)  =>  (<-chan (<-type))
-
-		x := p.parseUnaryExpr(false)
-
-		// determine which case we have
-		if typ, ok := x.(*ast.ChanType); ok {
-			// (<-type)
-
-			// re-associate position info and <-
-			dir := ast.SEND
-			for ok && dir == ast.SEND {
-				if typ.Dir == ast.RECV {
-					// error: (<-type) is (<-(<-chan T))
-					p.errorExpected(typ.Arrow, "'chan'")
-				}
-				arrow, typ.Begin, typ.Arrow = typ.Arrow, arrow, arrow
-				dir, typ.Dir = typ.Dir, ast.RECV
-				typ, ok = typ.Value.(*ast.ChanType)
-			}
-			if dir == ast.SEND {
-				p.errorExpected(arrow, "channel type")
-			}
-
-			return x
-		}
-
-		// <-(expr)
-		return &ast.UnaryExpr{OpPos: arrow, Op: token.ARROW, X: p.checkExpr(x)}
-
-	case token.MUL:
-		// pointer type or unary "*" expression
-		pos := p.pos
-		p.next()
-		x := p.parseUnaryExpr(false)
-		return &ast.StarExpr{Star: pos, X: p.checkExprOrType(x)}
-	}
-
-	return p.parsePrimaryExpr(lhs)
-}
-
-func (p *parser) tokPrec() (token.Token, int) {
-	tok := p.tok
-	if p.inRhs && tok == token.ASSIGN {
-		tok = token.EQL
-	}
-	return tok, tok.Precedence()
-}
-
-// If lhs is set and the result is an identifier, it is not resolved.
-func (p *parser) parseBinaryExpr(lhs bool, prec1 int) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "BinaryExpr"))
-	}
-
-	x := p.parseUnaryExpr(lhs)
-	for _, prec := p.tokPrec(); prec >= prec1; prec-- {
-		for {
-			op, oprec := p.tokPrec()
-			if oprec != prec {
-				break
-			}
-			pos := p.expect(op)
-			if lhs {
-				p.resolve(x)
-				lhs = false
-			}
-			y := p.parseBinaryExpr(false, prec+1)
-			x = &ast.BinaryExpr{X: p.checkExpr(x), OpPos: pos, Op: op, Y: p.checkExpr(y)}
-		}
-	}
-
-	return x
-}
-
-// If lhs is set and the result is an identifier, it is not resolved.
-// The result may be a type or even a raw type ([...]int). Callers must
-// check the result (using checkExpr or checkExprOrType), depending on
-// context.
-func (p *parser) parseExpr(lhs bool) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "Expression"))
-	}
-
-	return p.parseBinaryExpr(lhs, token.LowestPrec+1)
-}
-
-func (p *parser) parseRhs() ast.Expr {
-	old := p.inRhs
-	p.inRhs = true
-	x := p.checkExpr(p.parseExpr(false))
-	p.inRhs = old
-	return x
-}
-
-func (p *parser) parseRhsOrType() ast.Expr {
-	old := p.inRhs
-	p.inRhs = true
-	x := p.checkExprOrType(p.parseExpr(false))
-	p.inRhs = old
-	return x
-}
-
-// ----------------------------------------------------------------------------
-// Statements
-
-// Parsing modes for parseSimpleStmt.
-const (
-	basic = iota
-	labelOk
-	rangeOk
-)
-
-// parseSimpleStmt returns true as 2nd result if it parsed the assignment
-// of a range clause (with mode == rangeOk). The returned statement is an
-// assignment with a right-hand side that is a single unary expression of
-// the form "range x". No guarantees are given for the left-hand side.
-func (p *parser) parseSimpleStmt(mode int) (ast.Stmt, bool) {
-	if p.trace {
-		defer un(trace(p, "SimpleStmt"))
-	}
-
-	x := p.parseLhsList()
-
-	switch p.tok {
-	case
-		token.DEFINE, token.ASSIGN, token.ADD_ASSIGN,
-		token.SUB_ASSIGN, token.MUL_ASSIGN, token.QUO_ASSIGN,
-		token.REM_ASSIGN, token.AND_ASSIGN, token.OR_ASSIGN,
-		token.XOR_ASSIGN, token.SHL_ASSIGN, token.SHR_ASSIGN, token.AND_NOT_ASSIGN:
-		// assignment statement, possibly part of a range clause
-		pos, tok := p.pos, p.tok
-		p.next()
-		var y []ast.Expr
-		isRange := false
-		if mode == rangeOk && p.tok == token.RANGE && (tok == token.DEFINE || tok == token.ASSIGN) {
-			pos := p.pos
-			p.next()
-			y = []ast.Expr{&ast.UnaryExpr{OpPos: pos, Op: token.RANGE, X: p.parseRhs()}}
-			isRange = true
-		} else {
-			y = p.parseRhsList()
-		}
-		as := &ast.AssignStmt{Lhs: x, TokPos: pos, Tok: tok, Rhs: y}
-		if tok == token.DEFINE {
-			p.shortVarDecl(as, x)
-		}
-		return as, isRange
-	}
-
-	if len(x) > 1 {
-		p.errorExpected(x[0].Pos(), "1 expression")
-		// continue with first expression
-	}
-
-	switch p.tok {
-	case token.COLON:
-		// labeled statement
-		colon := p.pos
-		p.next()
-		if label, isIdent := x[0].(*ast.Ident); mode == labelOk && isIdent {
-			// Go spec: The scope of a label is the body of the function
-			// in which it is declared and excludes the body of any nested
-			// function.
-			stmt := &ast.LabeledStmt{Label: label, Colon: colon, Stmt: p.parseStmt()}
-			p.declare(stmt, nil, p.labelScope, ast.Lbl, label)
-			return stmt, false
-		}
-		// The label declaration typically starts at x[0].Pos(), but the label
-		// declaration may be erroneous due to a token after that position (and
-		// before the ':'). If SpuriousErrors is not set, the (only) error re-
-		// ported for the line is the illegal label error instead of the token
-		// before the ':' that caused the problem. Thus, use the (latest) colon
-		// position for error reporting.
-		p.error(colon, "illegal label declaration")
-		return &ast.BadStmt{From: x[0].Pos(), To: colon + 1}, false
-
-	case token.ARROW:
-		// send statement
-		arrow := p.pos
-		p.next()
-		y := p.parseRhs()
-		return &ast.SendStmt{Chan: x[0], Arrow: arrow, Value: y}, false
-
-	case token.INC, token.DEC:
-		// increment or decrement
-		s := &ast.IncDecStmt{X: x[0], TokPos: p.pos, Tok: p.tok}
-		p.next()
-		return s, false
-	}
-
-	// expression
-	return &ast.ExprStmt{X: x[0]}, false
-}
-
-func (p *parser) parseCallExpr(callType string) *ast.CallExpr {
-	x := p.parseRhsOrType() // could be a conversion: (some type)(x)
-	if call, isCall := x.(*ast.CallExpr); isCall {
-		return call
-	}
-	if _, isBad := x.(*ast.BadExpr); !isBad {
-		// only report error if it's a new one
-		p.error(p.safePos(x.End()), fmt.Sprintf("function must be invoked in %s statement", callType))
-	}
-	return nil
-}
-
-func (p *parser) parseGoStmt() ast.Stmt {
-	if p.trace {
-		defer un(trace(p, "GoStmt"))
-	}
-
-	pos := p.expect(token.GO)
-	call := p.parseCallExpr("go")
-	p.expectSemi()
-	if call == nil {
-		return &ast.BadStmt{From: pos, To: pos + 2} // len("go")
-	}
-
-	return &ast.GoStmt{Go: pos, Call: call}
-}
-
-func (p *parser) parseDeferStmt() ast.Stmt {
-	if p.trace {
-		defer un(trace(p, "DeferStmt"))
-	}
-
-	pos := p.expect(token.DEFER)
-	call := p.parseCallExpr("defer")
-	p.expectSemi()
-	if call == nil {
-		return &ast.BadStmt{From: pos, To: pos + 5} // len("defer")
-	}
-
-	return &ast.DeferStmt{Defer: pos, Call: call}
-}
-
-func (p *parser) parseReturnStmt() *ast.ReturnStmt {
-	if p.trace {
-		defer un(trace(p, "ReturnStmt"))
-	}
-
-	pos := p.pos
-	p.expect(token.RETURN)
-	var x []ast.Expr
-	if p.tok != token.SEMICOLON && p.tok != token.RBRACE {
-		x = p.parseRhsList()
-	}
-	p.expectSemi()
-
-	return &ast.ReturnStmt{Return: pos, Results: x}
-}
-
-func (p *parser) parseBranchStmt(tok token.Token) *ast.BranchStmt {
-	if p.trace {
-		defer un(trace(p, "BranchStmt"))
-	}
-
-	pos := p.expect(tok)
-	var label *ast.Ident
-	if tok != token.FALLTHROUGH && p.tok == token.IDENT {
-		label = p.parseIdent()
-		// add to list of unresolved targets
-		n := len(p.targetStack) - 1
-		p.targetStack[n] = append(p.targetStack[n], label)
-	}
-	p.expectSemi()
-
-	return &ast.BranchStmt{TokPos: pos, Tok: tok, Label: label}
-}
-
-func (p *parser) makeExpr(s ast.Stmt, kind string) ast.Expr {
-	if s == nil {
-		return nil
-	}
-	if es, isExpr := s.(*ast.ExprStmt); isExpr {
-		return p.checkExpr(es.X)
-	}
-	p.error(s.Pos(), fmt.Sprintf("expected %s, found simple statement (missing parentheses around composite literal?)", kind))
-	return &ast.BadExpr{From: s.Pos(), To: p.safePos(s.End())}
-}
-
-func (p *parser) parseIfStmt() *ast.IfStmt {
-	if p.trace {
-		defer un(trace(p, "IfStmt"))
-	}
-
-	pos := p.expect(token.IF)
-	p.openScope()
-	defer p.closeScope()
-
-	var s ast.Stmt
-	var x ast.Expr
-	{
-		prevLev := p.exprLev
-		p.exprLev = -1
-		if p.tok == token.SEMICOLON {
-			p.next()
-			x = p.parseRhs()
-		} else {
-			s, _ = p.parseSimpleStmt(basic)
-			if p.tok == token.SEMICOLON {
-				p.next()
-				x = p.parseRhs()
-			} else {
-				x = p.makeExpr(s, "boolean expression")
-				s = nil
-			}
-		}
-		p.exprLev = prevLev
-	}
-
-	body := p.parseBlockStmt()
-	var else_ ast.Stmt
-	if p.tok == token.ELSE {
-		p.next()
-		else_ = p.parseStmt()
-	} else {
-		p.expectSemi()
-	}
-
-	return &ast.IfStmt{If: pos, Init: s, Cond: x, Body: body, Else: else_}
-}
-
-func (p *parser) parseTypeList() (list []ast.Expr) {
-	if p.trace {
-		defer un(trace(p, "TypeList"))
-	}
-
-	list = append(list, p.parseType())
-	for p.tok == token.COMMA {
-		p.next()
-		list = append(list, p.parseType())
-	}
-
-	return
-}
-
-func (p *parser) parseCaseClause(typeSwitch bool) *ast.CaseClause {
-	if p.trace {
-		defer un(trace(p, "CaseClause"))
-	}
-
-	pos := p.pos
-	var list []ast.Expr
-	if p.tok == token.CASE {
-		p.next()
-		if typeSwitch {
-			list = p.parseTypeList()
-		} else {
-			list = p.parseRhsList()
-		}
-	} else {
-		p.expect(token.DEFAULT)
-	}
-
-	colon := p.expect(token.COLON)
-	p.openScope()
-	body := p.parseStmtList()
-	p.closeScope()
-
-	return &ast.CaseClause{Case: pos, List: list, Colon: colon, Body: body}
-}
-
-func isTypeSwitchAssert(x ast.Expr) bool {
-	a, ok := x.(*ast.TypeAssertExpr)
-	return ok && a.Type == nil
-}
-
-func isTypeSwitchGuard(s ast.Stmt) bool {
-	switch t := s.(type) {
-	case *ast.ExprStmt:
-		// x.(nil)
-		return isTypeSwitchAssert(t.X)
-	case *ast.AssignStmt:
-		// v := x.(nil)
-		return len(t.Lhs) == 1 && t.Tok == token.DEFINE && len(t.Rhs) == 1 && isTypeSwitchAssert(t.Rhs[0])
-	}
-	return false
-}
-
-func (p *parser) parseSwitchStmt() ast.Stmt {
-	if p.trace {
-		defer un(trace(p, "SwitchStmt"))
-	}
-
-	pos := p.expect(token.SWITCH)
-	p.openScope()
-	defer p.closeScope()
-
-	var s1, s2 ast.Stmt
-	if p.tok != token.LBRACE {
-		prevLev := p.exprLev
-		p.exprLev = -1
-		if p.tok != token.SEMICOLON {
-			s2, _ = p.parseSimpleStmt(basic)
-		}
-		if p.tok == token.SEMICOLON {
-			p.next()
-			s1 = s2
-			s2 = nil
-			if p.tok != token.LBRACE {
-				// A TypeSwitchGuard may declare a variable in addition
-				// to the variable declared in the initial SimpleStmt.
-				// Introduce extra scope to avoid redeclaration errors:
-				//
-				//	switch t := 0; t := x.(T) { ... }
-				//
-				// (this code is not valid Go because the first t
-				// cannot be accessed and thus is never used, the extra
-				// scope is needed for the correct error message).
-				//
-				// If we don't have a type switch, s2 must be an expression.
-				// Having the extra nested but empty scope won't affect it.
-				p.openScope()
-				defer p.closeScope()
-				s2, _ = p.parseSimpleStmt(basic)
-			}
-		}
-		p.exprLev = prevLev
-	}
-
-	typeSwitch := isTypeSwitchGuard(s2)
-	lbrace := p.expect(token.LBRACE)
-	var list []ast.Stmt
-	for p.tok == token.CASE || p.tok == token.DEFAULT {
-		list = append(list, p.parseCaseClause(typeSwitch))
-	}
-	rbrace := p.expect(token.RBRACE)
-	p.expectSemi()
-	body := &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace}
-
-	if typeSwitch {
-		return &ast.TypeSwitchStmt{Switch: pos, Init: s1, Assign: s2, Body: body}
-	}
-
-	return &ast.SwitchStmt{Switch: pos, Init: s1, Tag: p.makeExpr(s2, "switch expression"), Body: body}
-}
-
-func (p *parser) parseCommClause() *ast.CommClause {
-	if p.trace {
-		defer un(trace(p, "CommClause"))
-	}
-
-	p.openScope()
-	pos := p.pos
-	var comm ast.Stmt
-	if p.tok == token.CASE {
-		p.next()
-		lhs := p.parseLhsList()
-		if p.tok == token.ARROW {
-			// SendStmt
-			if len(lhs) > 1 {
-				p.errorExpected(lhs[0].Pos(), "1 expression")
-				// continue with first expression
-			}
-			arrow := p.pos
-			p.next()
-			rhs := p.parseRhs()
-			comm = &ast.SendStmt{Chan: lhs[0], Arrow: arrow, Value: rhs}
-		} else {
-			// RecvStmt
-			if tok := p.tok; tok == token.ASSIGN || tok == token.DEFINE {
-				// RecvStmt with assignment
-				if len(lhs) > 2 {
-					p.errorExpected(lhs[0].Pos(), "1 or 2 expressions")
-					// continue with first two expressions
-					lhs = lhs[0:2]
-				}
-				pos := p.pos
-				p.next()
-				rhs := p.parseRhs()
-				as := &ast.AssignStmt{Lhs: lhs, TokPos: pos, Tok: tok, Rhs: []ast.Expr{rhs}}
-				if tok == token.DEFINE {
-					p.shortVarDecl(as, lhs)
-				}
-				comm = as
-			} else {
-				// lhs must be single receive operation
-				if len(lhs) > 1 {
-					p.errorExpected(lhs[0].Pos(), "1 expression")
-					// continue with first expression
-				}
-				comm = &ast.ExprStmt{X: lhs[0]}
-			}
-		}
-	} else {
-		p.expect(token.DEFAULT)
-	}
-
-	colon := p.expect(token.COLON)
-	body := p.parseStmtList()
-	p.closeScope()
-
-	return &ast.CommClause{Case: pos, Comm: comm, Colon: colon, Body: body}
-}
-
-func (p *parser) parseSelectStmt() *ast.SelectStmt {
-	if p.trace {
-		defer un(trace(p, "SelectStmt"))
-	}
-
-	pos := p.expect(token.SELECT)
-	lbrace := p.expect(token.LBRACE)
-	var list []ast.Stmt
-	for p.tok == token.CASE || p.tok == token.DEFAULT {
-		list = append(list, p.parseCommClause())
-	}
-	rbrace := p.expect(token.RBRACE)
-	p.expectSemi()
-	body := &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace}
-
-	return &ast.SelectStmt{Select: pos, Body: body}
-}
-
-func (p *parser) parseForStmt() ast.Stmt {
-	if p.trace {
-		defer un(trace(p, "ForStmt"))
-	}
-
-	pos := p.expect(token.FOR)
-	p.openScope()
-	defer p.closeScope()
-
-	var s1, s2, s3 ast.Stmt
-	var isRange bool
-	if p.tok != token.LBRACE {
-		prevLev := p.exprLev
-		p.exprLev = -1
-		if p.tok != token.SEMICOLON {
-			if p.tok == token.RANGE {
-				// "for range x" (nil lhs in assignment)
-				pos := p.pos
-				p.next()
-				y := []ast.Expr{&ast.UnaryExpr{OpPos: pos, Op: token.RANGE, X: p.parseRhs()}}
-				s2 = &ast.AssignStmt{Rhs: y}
-				isRange = true
-			} else {
-				s2, isRange = p.parseSimpleStmt(rangeOk)
-			}
-		}
-		if !isRange && p.tok == token.SEMICOLON {
-			p.next()
-			s1 = s2
-			s2 = nil
-			if p.tok != token.SEMICOLON {
-				s2, _ = p.parseSimpleStmt(basic)
-			}
-			p.expectSemi()
-			if p.tok != token.LBRACE {
-				s3, _ = p.parseSimpleStmt(basic)
-			}
-		}
-		p.exprLev = prevLev
-	}
-
-	body := p.parseBlockStmt()
-	p.expectSemi()
-
-	if isRange {
-		as := s2.(*ast.AssignStmt)
-		// check lhs
-		var key, value ast.Expr
-		switch len(as.Lhs) {
-		case 0:
-			// nothing to do
-		case 1:
-			key = as.Lhs[0]
-		case 2:
-			key, value = as.Lhs[0], as.Lhs[1]
-		default:
-			p.errorExpected(as.Lhs[len(as.Lhs)-1].Pos(), "at most 2 expressions")
-			return &ast.BadStmt{From: pos, To: p.safePos(body.End())}
-		}
-		// parseSimpleStmt returned a right-hand side that
-		// is a single unary expression of the form "range x"
-		x := as.Rhs[0].(*ast.UnaryExpr).X
-		return &ast.RangeStmt{
-			For:    pos,
-			Key:    key,
-			Value:  value,
-			TokPos: as.TokPos,
-			Tok:    as.Tok,
-			X:      x,
-			Body:   body,
-		}
-	}
-
-	// regular for statement
-	return &ast.ForStmt{
-		For:  pos,
-		Init: s1,
-		Cond: p.makeExpr(s2, "boolean or range expression"),
-		Post: s3,
-		Body: body,
-	}
-}
-
-func (p *parser) parseStmt() (s ast.Stmt) {
-	if p.trace {
-		defer un(trace(p, "Statement"))
-	}
-
-	switch p.tok {
-	case token.CONST, token.TYPE, token.VAR:
-		s = &ast.DeclStmt{Decl: p.parseDecl(syncStmt)}
-	case
-		// tokens that may start an expression
-		token.IDENT, token.INT, token.FLOAT, token.IMAG, token.CHAR, token.STRING, token.FUNC, token.LPAREN, // operands
-		token.LBRACK, token.STRUCT, token.MAP, token.CHAN, token.INTERFACE, // composite types
-		token.ADD, token.SUB, token.MUL, token.AND, token.XOR, token.ARROW, token.NOT: // unary operators
-		s, _ = p.parseSimpleStmt(labelOk)
-		// because of the required look-ahead, labeled statements are
-		// parsed by parseSimpleStmt - don't expect a semicolon after
-		// them
-		if _, isLabeledStmt := s.(*ast.LabeledStmt); !isLabeledStmt {
-			p.expectSemi()
-		}
-	case token.GO:
-		s = p.parseGoStmt()
-	case token.DEFER:
-		s = p.parseDeferStmt()
-	case token.RETURN:
-		s = p.parseReturnStmt()
-	case token.BREAK, token.CONTINUE, token.GOTO, token.FALLTHROUGH:
-		s = p.parseBranchStmt(p.tok)
-	case token.LBRACE:
-		s = p.parseBlockStmt()
-		p.expectSemi()
-	case token.IF:
-		s = p.parseIfStmt()
-	case token.SWITCH:
-		s = p.parseSwitchStmt()
-	case token.SELECT:
-		s = p.parseSelectStmt()
-	case token.FOR:
-		s = p.parseForStmt()
-	case token.SEMICOLON:
-		// Is it ever possible to have an implicit semicolon
-		// producing an empty statement in a valid program?
-		// (handle correctly anyway)
-		s = &ast.EmptyStmt{Semicolon: p.pos, Implicit: p.lit == "\n"}
-		p.next()
-	case token.RBRACE:
-		// a semicolon may be omitted before a closing "}"
-		s = &ast.EmptyStmt{Semicolon: p.pos, Implicit: true}
-	default:
-		// no statement found
-		pos := p.pos
-		p.errorExpected(pos, "statement")
-		syncStmt(p)
-		s = &ast.BadStmt{From: pos, To: p.pos}
-	}
-
-	return
-}
-
-// ----------------------------------------------------------------------------
-// Declarations
-
-type parseSpecFunction func(doc *ast.CommentGroup, keyword token.Token, iota int) ast.Spec
-
-func isValidImport(lit string) bool {
-	const illegalChars = `!"#$%&'()*,:;<=>?[\]^{|}` + "`\uFFFD"
-	s, _ := strconv.Unquote(lit) // go/scanner returns a legal string literal
-	for _, r := range s {
-		if !unicode.IsGraphic(r) || unicode.IsSpace(r) || strings.ContainsRune(illegalChars, r) {
-			return false
-		}
-	}
-	return s != ""
-}
-
-func (p *parser) parseImportSpec(doc *ast.CommentGroup, _ token.Token, _ int) ast.Spec {
-	if p.trace {
-		defer un(trace(p, "ImportSpec"))
-	}
-
-	var ident *ast.Ident
-	switch p.tok {
-	case token.PERIOD:
-		ident = &ast.Ident{NamePos: p.pos, Name: "."}
-		p.next()
-	case token.IDENT:
-		ident = p.parseIdent()
-	}
-
-	pos := p.pos
-	var path string
-	if p.tok == token.STRING {
-		path = p.lit
-		if !isValidImport(path) {
-			p.error(pos, "invalid import path: "+path)
-		}
-		p.next()
-	} else {
-		p.expect(token.STRING) // use expect() error handling
-	}
-	p.expectSemi() // call before accessing p.linecomment
-
-	// collect imports
-	spec := &ast.ImportSpec{
-		Doc:     doc,
-		Name:    ident,
-		Path:    &ast.BasicLit{ValuePos: pos, Kind: token.STRING, Value: path},
-		Comment: p.lineComment,
-	}
-	p.imports = append(p.imports, spec)
-
-	return spec
-}
-
-func (p *parser) parseValueSpec(doc *ast.CommentGroup, keyword token.Token, iota int) ast.Spec {
-	if p.trace {
-		defer un(trace(p, keyword.String()+"Spec"))
-	}
-
-	pos := p.pos
-	idents := p.parseIdentList()
-	typ := p.tryType()
-	var values []ast.Expr
-	// always permit optional initialization for more tolerant parsing
-	if p.tok == token.ASSIGN {
-		p.next()
-		values = p.parseRhsList()
-	}
-	p.expectSemi() // call before accessing p.linecomment
-
-	switch keyword {
-	case token.VAR:
-		if typ == nil && values == nil {
-			p.error(pos, "missing variable type or initialization")
-		}
-	case token.CONST:
-		if values == nil && (iota == 0 || typ != nil) {
-			p.error(pos, "missing constant value")
-		}
-	}
-
-	// Go spec: The scope of a constant or variable identifier declared inside
-	// a function begins at the end of the ConstSpec or VarSpec and ends at
-	// the end of the innermost containing block.
-	// (Global identifiers are resolved in a separate phase after parsing.)
-	spec := &ast.ValueSpec{
-		Doc:     doc,
-		Names:   idents,
-		Type:    typ,
-		Values:  values,
-		Comment: p.lineComment,
-	}
-	kind := ast.Con
-	if keyword == token.VAR {
-		kind = ast.Var
-	}
-	p.declare(spec, iota, p.topScope, kind, idents...)
-
-	return spec
-}
-
-func (p *parser) parseTypeSpec(doc *ast.CommentGroup, _ token.Token, _ int) ast.Spec {
-	if p.trace {
-		defer un(trace(p, "TypeSpec"))
-	}
-
-	ident := p.parseIdent()
-
-	// Go spec: The scope of a type identifier declared inside a function begins
-	// at the identifier in the TypeSpec and ends at the end of the innermost
-	// containing block.
-	// (Global identifiers are resolved in a separate phase after parsing.)
-	spec := &ast.TypeSpec{Doc: doc, Name: ident}
-	p.declare(spec, nil, p.topScope, ast.Typ, ident)
-
-	spec.Type = p.parseType()
-	p.expectSemi() // call before accessing p.linecomment
-	spec.Comment = p.lineComment
-
-	return spec
-}
-
-func (p *parser) parseGenDecl(keyword token.Token, f parseSpecFunction) *ast.GenDecl {
-	if p.trace {
-		defer un(trace(p, "GenDecl("+keyword.String()+")"))
-	}
-
-	doc := p.leadComment
-	pos := p.expect(keyword)
-	var lparen, rparen token.Pos
-	var list []ast.Spec
-	if p.tok == token.LPAREN {
-		lparen = p.pos
-		p.next()
-		for iota := 0; p.tok != token.RPAREN && p.tok != token.EOF; iota++ {
-			list = append(list, f(p.leadComment, keyword, iota))
-		}
-		rparen = p.expect(token.RPAREN)
-		p.expectSemi()
-	} else {
-		list = append(list, f(nil, keyword, 0))
-	}
-
-	return &ast.GenDecl{
-		Doc:    doc,
-		TokPos: pos,
-		Tok:    keyword,
-		Lparen: lparen,
-		Specs:  list,
-		Rparen: rparen,
-	}
-}
-
-func (p *parser) parseFuncDecl() *ast.FuncDecl {
-	if p.trace {
-		defer un(trace(p, "FunctionDecl"))
-	}
-
-	doc := p.leadComment
-	pos := p.expect(token.FUNC)
-	scope := ast.NewScope(p.topScope) // function scope
-
-	var recv *ast.FieldList
-	if p.tok == token.LPAREN {
-		recv = p.parseParameters(scope, false)
-	}
-
-	ident := p.parseIdent()
-
-	params, results := p.parseSignature(scope)
-
-	var body *ast.BlockStmt
-	if p.tok == token.LBRACE {
-		body = p.parseBody(scope)
-	}
-	p.expectSemi()
-
-	decl := &ast.FuncDecl{
-		Doc:  doc,
-		Recv: recv,
-		Name: ident,
-		Type: &ast.FuncType{
-			Func:    pos,
-			Params:  params,
-			Results: results,
-		},
-		Body: body,
-	}
-	if recv == nil {
-		// Go spec: The scope of an identifier denoting a constant, type,
-		// variable, or function (but not method) declared at top level
-		// (outside any function) is the package block.
-		//
-		// init() functions cannot be referred to and there may
-		// be more than one - don't put them in the pkgScope
-		if ident.Name != "init" {
-			p.declare(decl, nil, p.pkgScope, ast.Fun, ident)
-		}
-	}
-
-	return decl
-}
-
-func (p *parser) parseDecl(sync func(*parser)) ast.Decl {
-	if p.trace {
-		defer un(trace(p, "Declaration"))
-	}
-
-	var f parseSpecFunction
-	switch p.tok {
-	case token.CONST, token.VAR:
-		f = p.parseValueSpec
-
-	case token.TYPE:
-		f = p.parseTypeSpec
-
-	case token.FUNC:
-		return p.parseFuncDecl()
-
-	default:
-		pos := p.pos
-		p.errorExpected(pos, "declaration")
-		sync(p)
-		return &ast.BadDecl{From: pos, To: p.pos}
-	}
-
-	return p.parseGenDecl(p.tok, f)
-}
-
-// ----------------------------------------------------------------------------
-// Source files
-
-func (p *parser) parseFile() *ast.File {
-	if p.trace {
-		defer un(trace(p, "File"))
-	}
-
-	// Don't bother parsing the rest if we had errors scanning the first token.
-	// Likely not a Go source file at all.
-	if p.errors.Len() != 0 {
-		return nil
-	}
-
-	// package clause
-	doc := p.leadComment
-	pos := p.expect(token.PACKAGE)
-	// Go spec: The package clause is not a declaration;
-	// the package name does not appear in any scope.
-	ident := p.parseIdent()
-	if ident.Name == "_" && p.mode&DeclarationErrors != 0 {
-		p.error(p.pos, "invalid package name _")
-	}
-	p.expectSemi()
-
-	// Don't bother parsing the rest if we had errors parsing the package clause.
-	// Likely not a Go source file at all.
-	if p.errors.Len() != 0 {
-		return nil
-	}
-
-	p.openScope()
-	p.pkgScope = p.topScope
-	var decls []ast.Decl
-	if p.mode&PackageClauseOnly == 0 {
-		// import decls
-		for p.tok == token.IMPORT {
-			decls = append(decls, p.parseGenDecl(token.IMPORT, p.parseImportSpec))
-		}
-
-		if p.mode&ImportsOnly == 0 {
-			// rest of package body
-			for p.tok != token.EOF {
-				decls = append(decls, p.parseDecl(syncDecl))
-			}
-		}
-	}
-	p.closeScope()
-	assert(p.topScope == nil, "unbalanced scopes")
-	assert(p.labelScope == nil, "unbalanced label scopes")
-
-	// resolve global identifiers within the same file
-	i := 0
-	for _, ident := range p.unresolved {
-		// i <= index for current ident
-		assert(ident.Obj == unresolved, "object already resolved")
-		ident.Obj = p.pkgScope.Lookup(ident.Name) // also removes unresolved sentinel
-		if ident.Obj == nil {
-			p.unresolved[i] = ident
-			i++
-		}
-	}
-
-	return &ast.File{
-		Doc:        doc,
-		Package:    pos,
-		Name:       ident,
-		Decls:      decls,
-		Scope:      p.pkgScope,
-		Imports:    p.imports,
-		Unresolved: p.unresolved[0:i],
-		Comments:   p.comments,
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/parser/parser_test.go b/third_party/gofrontend/libgo/go/go/parser/parser_test.go
deleted file mode 100644
index c7bb36d..0000000
--- a/third_party/gofrontend/libgo/go/go/parser/parser_test.go
+++ /dev/null
@@ -1,533 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package parser
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/token"
-	"os"
-	"strings"
-	"testing"
-)
-
-var validFiles = []string{
-	"parser.go",
-	"parser_test.go",
-	"error_test.go",
-	"short_test.go",
-}
-
-func TestParse(t *testing.T) {
-	for _, filename := range validFiles {
-		_, err := ParseFile(token.NewFileSet(), filename, nil, DeclarationErrors)
-		if err != nil {
-			t.Fatalf("ParseFile(%s): %v", filename, err)
-		}
-	}
-}
-
-func nameFilter(filename string) bool {
-	switch filename {
-	case "parser.go", "interface.go", "parser_test.go":
-		return true
-	case "parser.go.orig":
-		return true // permit but should be ignored by ParseDir
-	}
-	return false
-}
-
-func dirFilter(f os.FileInfo) bool { return nameFilter(f.Name()) }
-
-func TestParseDir(t *testing.T) {
-	path := "."
-	pkgs, err := ParseDir(token.NewFileSet(), path, dirFilter, 0)
-	if err != nil {
-		t.Fatalf("ParseDir(%s): %v", path, err)
-	}
-	if n := len(pkgs); n != 1 {
-		t.Errorf("got %d packages; want 1", n)
-	}
-	pkg := pkgs["parser"]
-	if pkg == nil {
-		t.Errorf(`package "parser" not found`)
-		return
-	}
-	if n := len(pkg.Files); n != 3 {
-		t.Errorf("got %d package files; want 3", n)
-	}
-	for filename := range pkg.Files {
-		if !nameFilter(filename) {
-			t.Errorf("unexpected package file: %s", filename)
-		}
-	}
-}
-
-func TestParseExpr(t *testing.T) {
-	// just kicking the tires:
-	// a valid arithmetic expression
-	src := "a + b"
-	x, err := ParseExpr(src)
-	if err != nil {
-		t.Errorf("ParseExpr(%q): %v", src, err)
-	}
-	// sanity check
-	if _, ok := x.(*ast.BinaryExpr); !ok {
-		t.Errorf("ParseExpr(%q): got %T, want *ast.BinaryExpr", src, x)
-	}
-
-	// a valid type expression
-	src = "struct{x *int}"
-	x, err = ParseExpr(src)
-	if err != nil {
-		t.Errorf("ParseExpr(%q): %v", src, err)
-	}
-	// sanity check
-	if _, ok := x.(*ast.StructType); !ok {
-		t.Errorf("ParseExpr(%q): got %T, want *ast.StructType", src, x)
-	}
-
-	// an invalid expression
-	src = "a + *"
-	if _, err := ParseExpr(src); err == nil {
-		t.Errorf("ParseExpr(%q): got no error", src)
-	}
-
-	// a valid expression followed by extra tokens is invalid
-	src = "a[i] := x"
-	if _, err := ParseExpr(src); err == nil {
-		t.Errorf("ParseExpr(%q): got no error", src)
-	}
-
-	// a semicolon is not permitted unless automatically inserted
-	src = "a + b\n"
-	if _, err := ParseExpr(src); err != nil {
-		t.Errorf("ParseExpr(%q): got error %s", src, err)
-	}
-	src = "a + b;"
-	if _, err := ParseExpr(src); err == nil {
-		t.Errorf("ParseExpr(%q): got no error", src)
-	}
-
-	// various other stuff following a valid expression
-	const validExpr = "a + b"
-	const anything = "dh3*#D)#_"
-	for _, c := range "!)]};," {
-		src := validExpr + string(c) + anything
-		if _, err := ParseExpr(src); err == nil {
-			t.Errorf("ParseExpr(%q): got no error", src)
-		}
-	}
-
-	// ParseExpr must not crash
-	for _, src := range valids {
-		ParseExpr(src)
-	}
-}
-
-func TestColonEqualsScope(t *testing.T) {
-	f, err := ParseFile(token.NewFileSet(), "", `package p; func f() { x, y, z := x, y, z }`, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// RHS refers to undefined globals; LHS does not.
-	as := f.Decls[0].(*ast.FuncDecl).Body.List[0].(*ast.AssignStmt)
-	for _, v := range as.Rhs {
-		id := v.(*ast.Ident)
-		if id.Obj != nil {
-			t.Errorf("rhs %s has Obj, should not", id.Name)
-		}
-	}
-	for _, v := range as.Lhs {
-		id := v.(*ast.Ident)
-		if id.Obj == nil {
-			t.Errorf("lhs %s does not have Obj, should", id.Name)
-		}
-	}
-}
-
-func TestVarScope(t *testing.T) {
-	f, err := ParseFile(token.NewFileSet(), "", `package p; func f() { var x, y, z = x, y, z }`, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// RHS refers to undefined globals; LHS does not.
-	as := f.Decls[0].(*ast.FuncDecl).Body.List[0].(*ast.DeclStmt).Decl.(*ast.GenDecl).Specs[0].(*ast.ValueSpec)
-	for _, v := range as.Values {
-		id := v.(*ast.Ident)
-		if id.Obj != nil {
-			t.Errorf("rhs %s has Obj, should not", id.Name)
-		}
-	}
-	for _, id := range as.Names {
-		if id.Obj == nil {
-			t.Errorf("lhs %s does not have Obj, should", id.Name)
-		}
-	}
-}
-
-func TestObjects(t *testing.T) {
-	const src = `
-package p
-import fmt "fmt"
-const pi = 3.14
-type T struct{}
-var x int
-func f() { L: }
-`
-
-	f, err := ParseFile(token.NewFileSet(), "", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	objects := map[string]ast.ObjKind{
-		"p":   ast.Bad, // not in a scope
-		"fmt": ast.Bad, // not resolved yet
-		"pi":  ast.Con,
-		"T":   ast.Typ,
-		"x":   ast.Var,
-		"int": ast.Bad, // not resolved yet
-		"f":   ast.Fun,
-		"L":   ast.Lbl,
-	}
-
-	ast.Inspect(f, func(n ast.Node) bool {
-		if ident, ok := n.(*ast.Ident); ok {
-			obj := ident.Obj
-			if obj == nil {
-				if objects[ident.Name] != ast.Bad {
-					t.Errorf("no object for %s", ident.Name)
-				}
-				return true
-			}
-			if obj.Name != ident.Name {
-				t.Errorf("names don't match: obj.Name = %s, ident.Name = %s", obj.Name, ident.Name)
-			}
-			kind := objects[ident.Name]
-			if obj.Kind != kind {
-				t.Errorf("%s: obj.Kind = %s; want %s", ident.Name, obj.Kind, kind)
-			}
-		}
-		return true
-	})
-}
-
-func TestUnresolved(t *testing.T) {
-	f, err := ParseFile(token.NewFileSet(), "", `
-package p
-//
-func f1a(int)
-func f2a(byte, int, float)
-func f3a(a, b int, c float)
-func f4a(...complex)
-func f5a(a s1a, b ...complex)
-//
-func f1b(*int)
-func f2b([]byte, (int), *float)
-func f3b(a, b *int, c []float)
-func f4b(...*complex)
-func f5b(a s1a, b ...[]complex)
-//
-type s1a struct { int }
-type s2a struct { byte; int; s1a }
-type s3a struct { a, b int; c float }
-//
-type s1b struct { *int }
-type s2b struct { byte; int; *float }
-type s3b struct { a, b *s3b; c []float }
-`, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	want := "int " + // f1a
-		"byte int float " + // f2a
-		"int float " + // f3a
-		"complex " + // f4a
-		"complex " + // f5a
-		//
-		"int " + // f1b
-		"byte int float " + // f2b
-		"int float " + // f3b
-		"complex " + // f4b
-		"complex " + // f5b
-		//
-		"int " + // s1a
-		"byte int " + // s2a
-		"int float " + // s3a
-		//
-		"int " + // s1a
-		"byte int float " + // s2a
-		"float " // s3a
-
-	// collect unresolved identifiers
-	var buf bytes.Buffer
-	for _, u := range f.Unresolved {
-		buf.WriteString(u.Name)
-		buf.WriteByte(' ')
-	}
-	got := buf.String()
-
-	if got != want {
-		t.Errorf("\ngot:  %s\nwant: %s", got, want)
-	}
-}
-
-var imports = map[string]bool{
-	`"a"`:        true,
-	"`a`":        true,
-	`"a/b"`:      true,
-	`"a.b"`:      true,
-	`"m\x61th"`:  true,
-	`"greek/αβ"`: true,
-	`""`:         false,
-
-	// Each of these pairs tests both `` vs "" strings
-	// and also use of invalid characters spelled out as
-	// escape sequences and written directly.
-	// For example `"\x00"` tests import "\x00"
-	// while "`\x00`" tests import `<actual-NUL-byte>`.
-	`"\x00"`:     false,
-	"`\x00`":     false,
-	`"\x7f"`:     false,
-	"`\x7f`":     false,
-	`"a!"`:       false,
-	"`a!`":       false,
-	`"a b"`:      false,
-	"`a b`":      false,
-	`"a\\b"`:     false,
-	"`a\\b`":     false,
-	"\"`a`\"":    false,
-	"`\"a\"`":    false,
-	`"\x80\x80"`: false,
-	"`\x80\x80`": false,
-	`"\xFFFD"`:   false,
-	"`\xFFFD`":   false,
-}
-
-func TestImports(t *testing.T) {
-	for path, isValid := range imports {
-		src := fmt.Sprintf("package p; import %s", path)
-		_, err := ParseFile(token.NewFileSet(), "", src, 0)
-		switch {
-		case err != nil && isValid:
-			t.Errorf("ParseFile(%s): got %v; expected no error", src, err)
-		case err == nil && !isValid:
-			t.Errorf("ParseFile(%s): got no error; expected one", src)
-		}
-	}
-}
-
-func TestCommentGroups(t *testing.T) {
-	f, err := ParseFile(token.NewFileSet(), "", `
-package p /* 1a */ /* 1b */      /* 1c */ // 1d
-/* 2a
-*/
-// 2b
-const pi = 3.1415
-/* 3a */ // 3b
-/* 3c */ const e = 2.7182
-
-// Example from issue 3139
-func ExampleCount() {
-	fmt.Println(strings.Count("cheese", "e"))
-	fmt.Println(strings.Count("five", "")) // before & after each rune
-	// Output:
-	// 3
-	// 5
-}
-`, ParseComments)
-	if err != nil {
-		t.Fatal(err)
-	}
-	expected := [][]string{
-		{"/* 1a */", "/* 1b */", "/* 1c */", "// 1d"},
-		{"/* 2a\n*/", "// 2b"},
-		{"/* 3a */", "// 3b", "/* 3c */"},
-		{"// Example from issue 3139"},
-		{"// before & after each rune"},
-		{"// Output:", "// 3", "// 5"},
-	}
-	if len(f.Comments) != len(expected) {
-		t.Fatalf("got %d comment groups; expected %d", len(f.Comments), len(expected))
-	}
-	for i, exp := range expected {
-		got := f.Comments[i].List
-		if len(got) != len(exp) {
-			t.Errorf("got %d comments in group %d; expected %d", len(got), i, len(exp))
-			continue
-		}
-		for j, exp := range exp {
-			got := got[j].Text
-			if got != exp {
-				t.Errorf("got %q in group %d; expected %q", got, i, exp)
-			}
-		}
-	}
-}
-
-func getField(file *ast.File, fieldname string) *ast.Field {
-	parts := strings.Split(fieldname, ".")
-	for _, d := range file.Decls {
-		if d, ok := d.(*ast.GenDecl); ok && d.Tok == token.TYPE {
-			for _, s := range d.Specs {
-				if s, ok := s.(*ast.TypeSpec); ok && s.Name.Name == parts[0] {
-					if s, ok := s.Type.(*ast.StructType); ok {
-						for _, f := range s.Fields.List {
-							for _, name := range f.Names {
-								if name.Name == parts[1] {
-									return f
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	return nil
-}
-
-// Don't use ast.CommentGroup.Text() - we want to see exact comment text.
-func commentText(c *ast.CommentGroup) string {
-	var buf bytes.Buffer
-	if c != nil {
-		for _, c := range c.List {
-			buf.WriteString(c.Text)
-		}
-	}
-	return buf.String()
-}
-
-func checkFieldComments(t *testing.T, file *ast.File, fieldname, lead, line string) {
-	f := getField(file, fieldname)
-	if f == nil {
-		t.Fatalf("field not found: %s", fieldname)
-	}
-	if got := commentText(f.Doc); got != lead {
-		t.Errorf("got lead comment %q; expected %q", got, lead)
-	}
-	if got := commentText(f.Comment); got != line {
-		t.Errorf("got line comment %q; expected %q", got, line)
-	}
-}
-
-func TestLeadAndLineComments(t *testing.T) {
-	f, err := ParseFile(token.NewFileSet(), "", `
-package p
-type T struct {
-	/* F1 lead comment */
-	//
-	F1 int  /* F1 */ // line comment
-	// F2 lead
-	// comment
-	F2 int  // F2 line comment
-	// f3 lead comment
-	f3 int  // f3 line comment
-}
-`, ParseComments)
-	if err != nil {
-		t.Fatal(err)
-	}
-	checkFieldComments(t, f, "T.F1", "/* F1 lead comment *///", "/* F1 */// line comment")
-	checkFieldComments(t, f, "T.F2", "// F2 lead// comment", "// F2 line comment")
-	checkFieldComments(t, f, "T.f3", "// f3 lead comment", "// f3 line comment")
-	ast.FileExports(f)
-	checkFieldComments(t, f, "T.F1", "/* F1 lead comment *///", "/* F1 */// line comment")
-	checkFieldComments(t, f, "T.F2", "// F2 lead// comment", "// F2 line comment")
-	if getField(f, "T.f3") != nil {
-		t.Error("not expected to find T.f3")
-	}
-}
-
-// TestIssue9979 verifies that empty statements are contained within their enclosing blocks.
-func TestIssue9979(t *testing.T) {
-	for _, src := range []string{
-		"package p; func f() {;}",
-		"package p; func f() {L:}",
-		"package p; func f() {L:;}",
-		"package p; func f() {L:\n}",
-		"package p; func f() {L:\n;}",
-		"package p; func f() { ; }",
-		"package p; func f() { L: }",
-		"package p; func f() { L: ; }",
-		"package p; func f() { L: \n}",
-		"package p; func f() { L: \n; }",
-	} {
-		fset := token.NewFileSet()
-		f, err := ParseFile(fset, "", src, 0)
-		if err != nil {
-			t.Fatal(err)
-		}
-
-		var pos, end token.Pos
-		ast.Inspect(f, func(x ast.Node) bool {
-			switch s := x.(type) {
-			case *ast.BlockStmt:
-				pos, end = s.Pos()+1, s.End()-1 // exclude "{", "}"
-			case *ast.LabeledStmt:
-				pos, end = s.Pos()+2, s.End() // exclude "L:"
-			case *ast.EmptyStmt:
-				// check containment
-				if s.Pos() < pos || s.End() > end {
-					t.Errorf("%s: %T[%d, %d] not inside [%d, %d]", src, s, s.Pos(), s.End(), pos, end)
-				}
-				// check semicolon
-				offs := fset.Position(s.Pos()).Offset
-				if ch := src[offs]; ch != ';' != s.Implicit {
-					want := "want ';'"
-					if s.Implicit {
-						want = "but ';' is implicit"
-					}
-					t.Errorf("%s: found %q at offset %d; %s", src, ch, offs, want)
-				}
-			}
-			return true
-		})
-	}
-}
-
-// TestIncompleteSelection ensures that an incomplete selector
-// expression is parsed as a (blank) *ast.SelectorExpr, not a
-// *ast.BadExpr.
-func TestIncompleteSelection(t *testing.T) {
-	for _, src := range []string{
-		"package p; var _ = fmt.",             // at EOF
-		"package p; var _ = fmt.\ntype X int", // not at EOF
-	} {
-		fset := token.NewFileSet()
-		f, err := ParseFile(fset, "", src, 0)
-		if err == nil {
-			t.Errorf("ParseFile(%s) succeeded unexpectedly", src)
-			continue
-		}
-
-		const wantErr = "expected selector or type assertion"
-		if !strings.Contains(err.Error(), wantErr) {
-			t.Errorf("ParseFile returned wrong error %q, want %q", err, wantErr)
-		}
-
-		var sel *ast.SelectorExpr
-		ast.Inspect(f, func(n ast.Node) bool {
-			if n, ok := n.(*ast.SelectorExpr); ok {
-				sel = n
-			}
-			return true
-		})
-		if sel == nil {
-			t.Error("found no *ast.SelectorExpr")
-			continue
-		}
-		const wantSel = "&{fmt _}"
-		if fmt.Sprint(sel) != wantSel {
-			t.Errorf("found selector %s, want %s", sel, wantSel)
-			continue
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/parser/performance_test.go b/third_party/gofrontend/libgo/go/go/parser/performance_test.go
deleted file mode 100644
index f2732c0..0000000
--- a/third_party/gofrontend/libgo/go/go/parser/performance_test.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package parser
-
-import (
-	"go/token"
-	"io/ioutil"
-	"testing"
-)
-
-var src = readFile("parser.go")
-
-func readFile(filename string) []byte {
-	data, err := ioutil.ReadFile(filename)
-	if err != nil {
-		panic(err)
-	}
-	return data
-}
-
-func BenchmarkParse(b *testing.B) {
-	b.SetBytes(int64(len(src)))
-	for i := 0; i < b.N; i++ {
-		if _, err := ParseFile(token.NewFileSet(), "", src, ParseComments); err != nil {
-			b.Fatalf("benchmark failed due to parse error: %s", err)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/parser/short_test.go b/third_party/gofrontend/libgo/go/go/parser/short_test.go
deleted file mode 100644
index ef2ffad..0000000
--- a/third_party/gofrontend/libgo/go/go/parser/short_test.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains test cases for short valid and invalid programs.
-
-package parser
-
-import "testing"
-
-var valids = []string{
-	"package p\n",
-	`package p;`,
-	`package p; import "fmt"; func f() { fmt.Println("Hello, World!") };`,
-	`package p; func f() { if f(T{}) {} };`,
-	`package p; func f() { _ = <-chan int(nil) };`,
-	`package p; func f() { _ = (<-chan int)(nil) };`,
-	`package p; func f() { _ = (<-chan <-chan int)(nil) };`,
-	`package p; func f() { _ = <-chan <-chan <-chan <-chan <-int(nil) };`,
-	`package p; func f(func() func() func());`,
-	`package p; func f(...T);`,
-	`package p; func f(float, ...int);`,
-	`package p; func f(x int, a ...int) { f(0, a...); f(1, a...,) };`,
-	`package p; func f(int,) {};`,
-	`package p; func f(...int,) {};`,
-	`package p; func f(x ...int,) {};`,
-	`package p; type T []int; var a []bool; func f() { if a[T{42}[0]] {} };`,
-	`package p; type T []int; func g(int) bool { return true }; func f() { if g(T{42}[0]) {} };`,
-	`package p; type T []int; func f() { for _ = range []int{T{42}[0]} {} };`,
-	`package p; var a = T{{1, 2}, {3, 4}}`,
-	`package p; func f() { select { case <- c: case c <- d: case c <- <- d: case <-c <- d: } };`,
-	`package p; func f() { select { case x := (<-c): } };`,
-	`package p; func f() { if ; true {} };`,
-	`package p; func f() { switch ; {} };`,
-	`package p; func f() { for _ = range "foo" + "bar" {} };`,
-	`package p; func f() { var s []int; g(s[:], s[i:], s[:j], s[i:j], s[i:j:k], s[:j:k]) };`,
-	`package p; var ( _ = (struct {*T}).m; _ = (interface {T}).m )`,
-	`package p; func ((T),) m() {}`,
-	`package p; func ((*T),) m() {}`,
-	`package p; func (*(T),) m() {}`,
-	`package p; func _(x []int) { for range x {} }`,
-	`package p; func _() { if [T{}.n]int{} {} }`,
-	`package p; func _() { map[int]int{}[0]++; map[int]int{}[0] += 1 }`,
-	`package p; func _(x interface{f()}) { interface{f()}(x).f() }`,
-	`package p; func _(x chan int) { chan int(x) <- 0 }`,
-	`package p; const (x = 0; y; z)`, // issue 9639
-	`package p; var _ = map[P]int{P{}:0, {}:1}`,
-	`package p; var _ = map[*P]int{&P{}:0, {}:1}`,
-}
-
-func TestValid(t *testing.T) {
-	for _, src := range valids {
-		checkErrors(t, src, src)
-	}
-}
-
-var invalids = []string{
-	`foo /* ERROR "expected 'package'" */ !`,
-	`package p; func f() { if { /* ERROR "expected operand" */ } };`,
-	`package p; func f() { if ; { /* ERROR "expected operand" */ } };`,
-	`package p; func f() { if f(); { /* ERROR "expected operand" */ } };`,
-	`package p; func f() { if _ /* ERROR "expected boolean expression" */ = range x; true {} };`,
-	`package p; func f() { switch _ /* ERROR "expected switch expression" */ = range x; true {} };`,
-	`package p; func f() { for _ = range x ; /* ERROR "expected '{'" */ ; {} };`,
-	`package p; func f() { for ; ; _ = range /* ERROR "expected operand" */ x {} };`,
-	`package p; func f() { for ; _ /* ERROR "expected boolean or range expression" */ = range x ; {} };`,
-	`package p; func f() { switch t /* ERROR "expected switch expression" */ = t.(type) {} };`,
-	`package p; func f() { switch t /* ERROR "expected switch expression" */ , t = t.(type) {} };`,
-	`package p; func f() { switch t /* ERROR "expected switch expression" */ = t.(type), t {} };`,
-	`package p; var a = [ /* ERROR "expected expression" */ 1]int;`,
-	`package p; var a = [ /* ERROR "expected expression" */ ...]int;`,
-	`package p; var a = struct /* ERROR "expected expression" */ {}`,
-	`package p; var a = func /* ERROR "expected expression" */ ();`,
-	`package p; var a = interface /* ERROR "expected expression" */ {}`,
-	`package p; var a = [ /* ERROR "expected expression" */ ]int`,
-	`package p; var a = map /* ERROR "expected expression" */ [int]int`,
-	`package p; var a = chan /* ERROR "expected expression" */ int;`,
-	`package p; var a = []int{[ /* ERROR "expected expression" */ ]int};`,
-	`package p; var a = ( /* ERROR "expected expression" */ []int);`,
-	`package p; var a = a[[ /* ERROR "expected expression" */ ]int:[]int];`,
-	`package p; var a = <- /* ERROR "expected expression" */ chan int;`,
-	`package p; func f() { select { case _ <- chan /* ERROR "expected expression" */ int: } };`,
-	`package p; func f() { _ = (<-<- /* ERROR "expected 'chan'" */ chan int)(nil) };`,
-	`package p; func f() { _ = (<-chan<-chan<-chan<-chan<-chan<- /* ERROR "expected channel type" */ int)(nil) };`,
-	`package p; func f() { var t []int; t /* ERROR "expected identifier on left side of :=" */ [0] := 0 };`,
-	`package p; func f() { if x := g(); x = /* ERROR "expected '=='" */ 0 {}};`,
-	`package p; func f() { _ = x = /* ERROR "expected '=='" */ 0 {}};`,
-	`package p; func f() { _ = 1 == func()int { var x bool; x = x = /* ERROR "expected '=='" */ true; return x }() };`,
-	`package p; func f() { var s []int; _ = s[] /* ERROR "expected operand" */ };`,
-	`package p; func f() { var s []int; _ = s[i:j: /* ERROR "3rd index required" */ ] };`,
-	`package p; func f() { var s []int; _ = s[i: /* ERROR "2nd index required" */ :k] };`,
-	`package p; func f() { var s []int; _ = s[i: /* ERROR "2nd index required" */ :] };`,
-	`package p; func f() { var s []int; _ = s[: /* ERROR "2nd index required" */ :] };`,
-	`package p; func f() { var s []int; _ = s[: /* ERROR "2nd index required" */ ::] };`,
-	`package p; func f() { var s []int; _ = s[i:j:k: /* ERROR "expected ']'" */ l] };`,
-	`package p; func f() { for x /* ERROR "boolean or range expression" */ = []string {} }`,
-	`package p; func f() { for x /* ERROR "boolean or range expression" */ := []string {} }`,
-	`package p; func f() { for i /* ERROR "boolean or range expression" */ , x = []string {} }`,
-	`package p; func f() { for i /* ERROR "boolean or range expression" */ , x := []string {} }`,
-	`package p; func f() { go f /* ERROR HERE "function must be invoked" */ }`,
-	`package p; func f() { defer func() {} /* ERROR HERE "function must be invoked" */ }`,
-	`package p; func f() { go func() { func() { f(x func /* ERROR "missing ','" */ (){}) } } }`,
-	`package p; func f(x func(), u v func /* ERROR "missing ','" */ ()){}`,
-	`package p; func f() (a b string /* ERROR "missing ','" */ , ok bool)`,           // issue 8656
-	`package p; var x /* ERROR "missing variable type or initialization" */ , y, z;`, // issue 9639
-	`package p; const x /* ERROR "missing constant value" */ ;`,                      // issue 9639
-	`package p; const x /* ERROR "missing constant value" */ int;`,                   // issue 9639
-	`package p; const (x = 0; y; z /* ERROR "missing constant value" */ int);`,       // issue 9639
-}
-
-func TestInvalid(t *testing.T) {
-	for _, src := range invalids {
-		checkErrors(t, src, src)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/parser/testdata/commas.src b/third_party/gofrontend/libgo/go/go/parser/testdata/commas.src
deleted file mode 100644
index af6e706..0000000
--- a/third_party/gofrontend/libgo/go/go/parser/testdata/commas.src
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test case for error messages/parser synchronization
-// after missing commas.
-
-package p
-
-var _ = []int{
-	0 /* ERROR "missing ','" */
-}
-
-var _ = []int{
-	0,
-	1,
-	2,
-	3 /* ERROR "missing ','" */
-}
diff --git a/third_party/gofrontend/libgo/go/go/parser/testdata/issue3106.src b/third_party/gofrontend/libgo/go/go/parser/testdata/issue3106.src
deleted file mode 100644
index 2db10be..0000000
--- a/third_party/gofrontend/libgo/go/go/parser/testdata/issue3106.src
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test case for issue 3106: Better synchronization of
-// parser after certain syntax errors.
-
-package main
-
-func f() {
-	var m Mutex
-	c := MakeCond(&m)
-	percent := 0
-	const step = 10
-	for i := 0; i < 5; i++ {
-		go func() {
-			for {
-				// Emulates some useful work.
-				time.Sleep(1e8)
-				m.Lock()
-				defer
-				if /* ERROR "expected ';', found 'if'" */ percent == 100 {
-					m.Unlock()
-					break
-				}
-				percent++
-				if percent % step == 0 {
-					//c.Signal()
-				}
-				m.Unlock()
-			}
-		}()
-	}
-	for {
-		m.Lock()
-		if percent == 0 || percent % step != 0 {
-			c.Wait()
-		}
-		fmt.Print(",")
-		if percent == 100 {
-			m.Unlock()
-			break
-		}
-		m.Unlock()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/nodes.go b/third_party/gofrontend/libgo/go/go/printer/nodes.go
deleted file mode 100644
index fe04705..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/nodes.go
+++ /dev/null
@@ -1,1652 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements printing of AST nodes; specifically
-// expressions, statements, declarations, and files. It uses
-// the print functionality implemented in printer.go.
-
-package printer
-
-import (
-	"bytes"
-	"go/ast"
-	"go/token"
-	"strconv"
-	"strings"
-	"unicode"
-	"unicode/utf8"
-)
-
-// Formatting issues:
-// - better comment formatting for /*-style comments at the end of a line (e.g. a declaration)
-//   when the comment spans multiple lines; if such a comment is just two lines, formatting is
-//   not idempotent
-// - formatting of expression lists
-// - should use blank instead of tab to separate one-line function bodies from
-//   the function header unless there is a group of consecutive one-liners
-
-// ----------------------------------------------------------------------------
-// Common AST nodes.
-
-// Print as many newlines as necessary (but at least min newlines) to get to
-// the current line. ws is printed before the first line break. If newSection
-// is set, the first line break is printed as formfeed. Returns true if any
-// line break was printed; returns false otherwise.
-//
-// TODO(gri): linebreak may add too many lines if the next statement at "line"
-//            is preceded by comments because the computation of n assumes
-//            the current position before the comment and the target position
-//            after the comment. Thus, after interspersing such comments, the
-//            space taken up by them is not considered to reduce the number of
-//            linebreaks. At the moment there is no easy way to know about
-//            future (not yet interspersed) comments in this function.
-//
-func (p *printer) linebreak(line, min int, ws whiteSpace, newSection bool) (printedBreak bool) {
-	n := nlimit(line - p.pos.Line)
-	if n < min {
-		n = min
-	}
-	if n > 0 {
-		p.print(ws)
-		if newSection {
-			p.print(formfeed)
-			n--
-		}
-		for ; n > 0; n-- {
-			p.print(newline)
-		}
-		printedBreak = true
-	}
-	return
-}
-
-// setComment sets g as the next comment if g != nil and if node comments
-// are enabled - this mode is used when printing source code fragments such
-// as exports only. It assumes that there is no pending comment in p.comments
-// and at most one pending comment in the p.comment cache.
-func (p *printer) setComment(g *ast.CommentGroup) {
-	if g == nil || !p.useNodeComments {
-		return
-	}
-	if p.comments == nil {
-		// initialize p.comments lazily
-		p.comments = make([]*ast.CommentGroup, 1)
-	} else if p.cindex < len(p.comments) {
-		// for some reason there are pending comments; this
-		// should never happen - handle gracefully and flush
-		// all comments up to g, ignore anything after that
-		p.flush(p.posFor(g.List[0].Pos()), token.ILLEGAL)
-		p.comments = p.comments[0:1]
-		// in debug mode, report error
-		p.internalError("setComment found pending comments")
-	}
-	p.comments[0] = g
-	p.cindex = 0
-	// don't overwrite any pending comment in the p.comment cache
-	// (there may be a pending comment when a line comment is
-	// immediately followed by a lead comment with no other
-	// tokens between)
-	if p.commentOffset == infinity {
-		p.nextComment() // get comment ready for use
-	}
-}
-
-type exprListMode uint
-
-const (
-	commaTerm exprListMode = 1 << iota // list is optionally terminated by a comma
-	noIndent                           // no extra indentation in multi-line lists
-)
-
-// If indent is set, a multi-line identifier list is indented after the
-// first linebreak encountered.
-func (p *printer) identList(list []*ast.Ident, indent bool) {
-	// convert into an expression list so we can re-use exprList formatting
-	xlist := make([]ast.Expr, len(list))
-	for i, x := range list {
-		xlist[i] = x
-	}
-	var mode exprListMode
-	if !indent {
-		mode = noIndent
-	}
-	p.exprList(token.NoPos, xlist, 1, mode, token.NoPos)
-}
-
-// Print a list of expressions. If the list spans multiple
-// source lines, the original line breaks are respected between
-// expressions.
-//
-// TODO(gri) Consider rewriting this to be independent of []ast.Expr
-//           so that we can use the algorithm for any kind of list
-//           (e.g., pass list via a channel over which to range).
-func (p *printer) exprList(prev0 token.Pos, list []ast.Expr, depth int, mode exprListMode, next0 token.Pos) {
-	if len(list) == 0 {
-		return
-	}
-
-	prev := p.posFor(prev0)
-	next := p.posFor(next0)
-	line := p.lineFor(list[0].Pos())
-	endLine := p.lineFor(list[len(list)-1].End())
-
-	if prev.IsValid() && prev.Line == line && line == endLine {
-		// all list entries on a single line
-		for i, x := range list {
-			if i > 0 {
-				// use position of expression following the comma as
-				// comma position for correct comment placement
-				p.print(x.Pos(), token.COMMA, blank)
-			}
-			p.expr0(x, depth)
-		}
-		return
-	}
-
-	// list entries span multiple lines;
-	// use source code positions to guide line breaks
-
-	// don't add extra indentation if noIndent is set;
-	// i.e., pretend that the first line is already indented
-	ws := ignore
-	if mode&noIndent == 0 {
-		ws = indent
-	}
-
-	// the first linebreak is always a formfeed since this section must not
-	// depend on any previous formatting
-	prevBreak := -1 // index of last expression that was followed by a linebreak
-	if prev.IsValid() && prev.Line < line && p.linebreak(line, 0, ws, true) {
-		ws = ignore
-		prevBreak = 0
-	}
-
-	// initialize expression/key size: a zero value indicates expr/key doesn't fit on a single line
-	size := 0
-
-	// print all list elements
-	prevLine := prev.Line
-	for i, x := range list {
-		line = p.lineFor(x.Pos())
-
-		// determine if the next linebreak, if any, needs to use formfeed:
-		// in general, use the entire node size to make the decision; for
-		// key:value expressions, use the key size
-		// TODO(gri) for a better result, should probably incorporate both
-		//           the key and the node size into the decision process
-		useFF := true
-
-		// determine element size: all bets are off if we don't have
-		// position information for the previous and next token (likely
-		// generated code - simply ignore the size in this case by setting
-		// it to 0)
-		prevSize := size
-		const infinity = 1e6 // larger than any source line
-		size = p.nodeSize(x, infinity)
-		pair, isPair := x.(*ast.KeyValueExpr)
-		if size <= infinity && prev.IsValid() && next.IsValid() {
-			// x fits on a single line
-			if isPair {
-				size = p.nodeSize(pair.Key, infinity) // size <= infinity
-			}
-		} else {
-			// size too large or we don't have good layout information
-			size = 0
-		}
-
-		// if the previous line and the current line had single-
-		// line-expressions and the key sizes are small or the
-		// the ratio between the key sizes does not exceed a
-		// threshold, align columns and do not use formfeed
-		if prevSize > 0 && size > 0 {
-			const smallSize = 20
-			if prevSize <= smallSize && size <= smallSize {
-				useFF = false
-			} else {
-				const r = 4 // threshold
-				ratio := float64(size) / float64(prevSize)
-				useFF = ratio <= 1.0/r || r <= ratio
-			}
-		}
-
-		needsLinebreak := 0 < prevLine && prevLine < line
-		if i > 0 {
-			// use position of expression following the comma as
-			// comma position for correct comment placement, but
-			// only if the expression is on the same line
-			if !needsLinebreak {
-				p.print(x.Pos())
-			}
-			p.print(token.COMMA)
-			needsBlank := true
-			if needsLinebreak {
-				// lines are broken using newlines so comments remain aligned
-				// unless forceFF is set or there are multiple expressions on
-				// the same line in which case formfeed is used
-				if p.linebreak(line, 0, ws, useFF || prevBreak+1 < i) {
-					ws = ignore
-					prevBreak = i
-					needsBlank = false // we got a line break instead
-				}
-			}
-			if needsBlank {
-				p.print(blank)
-			}
-		}
-
-		if len(list) > 1 && isPair && size > 0 && needsLinebreak {
-			// we have a key:value expression that fits onto one line
-			// and it's not on the same line as the prior expression:
-			// use a column for the key such that consecutive entries
-			// can align if possible
-			// (needsLinebreak is set if we started a new line before)
-			p.expr(pair.Key)
-			p.print(pair.Colon, token.COLON, vtab)
-			p.expr(pair.Value)
-		} else {
-			p.expr0(x, depth)
-		}
-
-		prevLine = line
-	}
-
-	if mode&commaTerm != 0 && next.IsValid() && p.pos.Line < next.Line {
-		// print a terminating comma if the next token is on a new line
-		p.print(token.COMMA)
-		if ws == ignore && mode&noIndent == 0 {
-			// unindent if we indented
-			p.print(unindent)
-		}
-		p.print(formfeed) // terminating comma needs a line break to look good
-		return
-	}
-
-	if ws == ignore && mode&noIndent == 0 {
-		// unindent if we indented
-		p.print(unindent)
-	}
-}
-
-func (p *printer) parameters(fields *ast.FieldList) {
-	p.print(fields.Opening, token.LPAREN)
-	if len(fields.List) > 0 {
-		prevLine := p.lineFor(fields.Opening)
-		ws := indent
-		for i, par := range fields.List {
-			// determine par begin and end line (may be different
-			// if there are multiple parameter names for this par
-			// or the type is on a separate line)
-			var parLineBeg int
-			if len(par.Names) > 0 {
-				parLineBeg = p.lineFor(par.Names[0].Pos())
-			} else {
-				parLineBeg = p.lineFor(par.Type.Pos())
-			}
-			var parLineEnd = p.lineFor(par.Type.End())
-			// separating "," if needed
-			needsLinebreak := 0 < prevLine && prevLine < parLineBeg
-			if i > 0 {
-				// use position of parameter following the comma as
-				// comma position for correct comma placement, but
-				// only if the next parameter is on the same line
-				if !needsLinebreak {
-					p.print(par.Pos())
-				}
-				p.print(token.COMMA)
-			}
-			// separator if needed (linebreak or blank)
-			if needsLinebreak && p.linebreak(parLineBeg, 0, ws, true) {
-				// break line if the opening "(" or previous parameter ended on a different line
-				ws = ignore
-			} else if i > 0 {
-				p.print(blank)
-			}
-			// parameter names
-			if len(par.Names) > 0 {
-				// Very subtle: If we indented before (ws == ignore), identList
-				// won't indent again. If we didn't (ws == indent), identList will
-				// indent if the identList spans multiple lines, and it will outdent
-				// again at the end (and still ws == indent). Thus, a subsequent indent
-				// by a linebreak call after a type, or in the next multi-line identList
-				// will do the right thing.
-				p.identList(par.Names, ws == indent)
-				p.print(blank)
-			}
-			// parameter type
-			p.expr(stripParensAlways(par.Type))
-			prevLine = parLineEnd
-		}
-		// if the closing ")" is on a separate line from the last parameter,
-		// print an additional "," and line break
-		if closing := p.lineFor(fields.Closing); 0 < prevLine && prevLine < closing {
-			p.print(token.COMMA)
-			p.linebreak(closing, 0, ignore, true)
-		}
-		// unindent if we indented
-		if ws == ignore {
-			p.print(unindent)
-		}
-	}
-	p.print(fields.Closing, token.RPAREN)
-}
-
-func (p *printer) signature(params, result *ast.FieldList) {
-	if params != nil {
-		p.parameters(params)
-	} else {
-		p.print(token.LPAREN, token.RPAREN)
-	}
-	n := result.NumFields()
-	if n > 0 {
-		// result != nil
-		p.print(blank)
-		if n == 1 && result.List[0].Names == nil {
-			// single anonymous result; no ()'s
-			p.expr(stripParensAlways(result.List[0].Type))
-			return
-		}
-		p.parameters(result)
-	}
-}
-
-func identListSize(list []*ast.Ident, maxSize int) (size int) {
-	for i, x := range list {
-		if i > 0 {
-			size += len(", ")
-		}
-		size += utf8.RuneCountInString(x.Name)
-		if size >= maxSize {
-			break
-		}
-	}
-	return
-}
-
-func (p *printer) isOneLineFieldList(list []*ast.Field) bool {
-	if len(list) != 1 {
-		return false // allow only one field
-	}
-	f := list[0]
-	if f.Tag != nil || f.Comment != nil {
-		return false // don't allow tags or comments
-	}
-	// only name(s) and type
-	const maxSize = 30 // adjust as appropriate, this is an approximate value
-	namesSize := identListSize(f.Names, maxSize)
-	if namesSize > 0 {
-		namesSize = 1 // blank between names and types
-	}
-	typeSize := p.nodeSize(f.Type, maxSize)
-	return namesSize+typeSize <= maxSize
-}
-
-func (p *printer) setLineComment(text string) {
-	p.setComment(&ast.CommentGroup{List: []*ast.Comment{{Slash: token.NoPos, Text: text}}})
-}
-
-func (p *printer) fieldList(fields *ast.FieldList, isStruct, isIncomplete bool) {
-	lbrace := fields.Opening
-	list := fields.List
-	rbrace := fields.Closing
-	hasComments := isIncomplete || p.commentBefore(p.posFor(rbrace))
-	srcIsOneLine := lbrace.IsValid() && rbrace.IsValid() && p.lineFor(lbrace) == p.lineFor(rbrace)
-
-	if !hasComments && srcIsOneLine {
-		// possibly a one-line struct/interface
-		if len(list) == 0 {
-			// no blank between keyword and {} in this case
-			p.print(lbrace, token.LBRACE, rbrace, token.RBRACE)
-			return
-		} else if isStruct && p.isOneLineFieldList(list) { // for now ignore interfaces
-			// small enough - print on one line
-			// (don't use identList and ignore source line breaks)
-			p.print(lbrace, token.LBRACE, blank)
-			f := list[0]
-			for i, x := range f.Names {
-				if i > 0 {
-					// no comments so no need for comma position
-					p.print(token.COMMA, blank)
-				}
-				p.expr(x)
-			}
-			if len(f.Names) > 0 {
-				p.print(blank)
-			}
-			p.expr(f.Type)
-			p.print(blank, rbrace, token.RBRACE)
-			return
-		}
-	}
-	// hasComments || !srcIsOneLine
-
-	p.print(blank, lbrace, token.LBRACE, indent)
-	if hasComments || len(list) > 0 {
-		p.print(formfeed)
-	}
-
-	if isStruct {
-
-		sep := vtab
-		if len(list) == 1 {
-			sep = blank
-		}
-		var line int
-		for i, f := range list {
-			if i > 0 {
-				p.linebreak(p.lineFor(f.Pos()), 1, ignore, p.linesFrom(line) > 0)
-			}
-			extraTabs := 0
-			p.setComment(f.Doc)
-			p.recordLine(&line)
-			if len(f.Names) > 0 {
-				// named fields
-				p.identList(f.Names, false)
-				p.print(sep)
-				p.expr(f.Type)
-				extraTabs = 1
-			} else {
-				// anonymous field
-				p.expr(f.Type)
-				extraTabs = 2
-			}
-			if f.Tag != nil {
-				if len(f.Names) > 0 && sep == vtab {
-					p.print(sep)
-				}
-				p.print(sep)
-				p.expr(f.Tag)
-				extraTabs = 0
-			}
-			if f.Comment != nil {
-				for ; extraTabs > 0; extraTabs-- {
-					p.print(sep)
-				}
-				p.setComment(f.Comment)
-			}
-		}
-		if isIncomplete {
-			if len(list) > 0 {
-				p.print(formfeed)
-			}
-			p.flush(p.posFor(rbrace), token.RBRACE) // make sure we don't lose the last line comment
-			p.setLineComment("// contains filtered or unexported fields")
-		}
-
-	} else { // interface
-
-		var line int
-		for i, f := range list {
-			if i > 0 {
-				p.linebreak(p.lineFor(f.Pos()), 1, ignore, p.linesFrom(line) > 0)
-			}
-			p.setComment(f.Doc)
-			p.recordLine(&line)
-			if ftyp, isFtyp := f.Type.(*ast.FuncType); isFtyp {
-				// method
-				p.expr(f.Names[0])
-				p.signature(ftyp.Params, ftyp.Results)
-			} else {
-				// embedded interface
-				p.expr(f.Type)
-			}
-			p.setComment(f.Comment)
-		}
-		if isIncomplete {
-			if len(list) > 0 {
-				p.print(formfeed)
-			}
-			p.flush(p.posFor(rbrace), token.RBRACE) // make sure we don't lose the last line comment
-			p.setLineComment("// contains filtered or unexported methods")
-		}
-
-	}
-	p.print(unindent, formfeed, rbrace, token.RBRACE)
-}
-
-// ----------------------------------------------------------------------------
-// Expressions
-
-func walkBinary(e *ast.BinaryExpr) (has4, has5 bool, maxProblem int) {
-	switch e.Op.Precedence() {
-	case 4:
-		has4 = true
-	case 5:
-		has5 = true
-	}
-
-	switch l := e.X.(type) {
-	case *ast.BinaryExpr:
-		if l.Op.Precedence() < e.Op.Precedence() {
-			// parens will be inserted.
-			// pretend this is an *ast.ParenExpr and do nothing.
-			break
-		}
-		h4, h5, mp := walkBinary(l)
-		has4 = has4 || h4
-		has5 = has5 || h5
-		if maxProblem < mp {
-			maxProblem = mp
-		}
-	}
-
-	switch r := e.Y.(type) {
-	case *ast.BinaryExpr:
-		if r.Op.Precedence() <= e.Op.Precedence() {
-			// parens will be inserted.
-			// pretend this is an *ast.ParenExpr and do nothing.
-			break
-		}
-		h4, h5, mp := walkBinary(r)
-		has4 = has4 || h4
-		has5 = has5 || h5
-		if maxProblem < mp {
-			maxProblem = mp
-		}
-
-	case *ast.StarExpr:
-		if e.Op == token.QUO { // `*/`
-			maxProblem = 5
-		}
-
-	case *ast.UnaryExpr:
-		switch e.Op.String() + r.Op.String() {
-		case "/*", "&&", "&^":
-			maxProblem = 5
-		case "++", "--":
-			if maxProblem < 4 {
-				maxProblem = 4
-			}
-		}
-	}
-	return
-}
-
-func cutoff(e *ast.BinaryExpr, depth int) int {
-	has4, has5, maxProblem := walkBinary(e)
-	if maxProblem > 0 {
-		return maxProblem + 1
-	}
-	if has4 && has5 {
-		if depth == 1 {
-			return 5
-		}
-		return 4
-	}
-	if depth == 1 {
-		return 6
-	}
-	return 4
-}
-
-func diffPrec(expr ast.Expr, prec int) int {
-	x, ok := expr.(*ast.BinaryExpr)
-	if !ok || prec != x.Op.Precedence() {
-		return 1
-	}
-	return 0
-}
-
-func reduceDepth(depth int) int {
-	depth--
-	if depth < 1 {
-		depth = 1
-	}
-	return depth
-}
-
-// Format the binary expression: decide the cutoff and then format.
-// Let's call depth == 1 Normal mode, and depth > 1 Compact mode.
-// (Algorithm suggestion by Russ Cox.)
-//
-// The precedences are:
-//	5             *  /  %  <<  >>  &  &^
-//	4             +  -  |  ^
-//	3             ==  !=  <  <=  >  >=
-//	2             &&
-//	1             ||
-//
-// The only decision is whether there will be spaces around levels 4 and 5.
-// There are never spaces at level 6 (unary), and always spaces at levels 3 and below.
-//
-// To choose the cutoff, look at the whole expression but excluding primary
-// expressions (function calls, parenthesized exprs), and apply these rules:
-//
-//	1) If there is a binary operator with a right side unary operand
-//	   that would clash without a space, the cutoff must be (in order):
-//
-//		/*	6
-//		&&	6
-//		&^	6
-//		++	5
-//		--	5
-//
-//         (Comparison operators always have spaces around them.)
-//
-//	2) If there is a mix of level 5 and level 4 operators, then the cutoff
-//	   is 5 (use spaces to distinguish precedence) in Normal mode
-//	   and 4 (never use spaces) in Compact mode.
-//
-//	3) If there are no level 4 operators or no level 5 operators, then the
-//	   cutoff is 6 (always use spaces) in Normal mode
-//	   and 4 (never use spaces) in Compact mode.
-//
-func (p *printer) binaryExpr(x *ast.BinaryExpr, prec1, cutoff, depth int) {
-	prec := x.Op.Precedence()
-	if prec < prec1 {
-		// parenthesis needed
-		// Note: The parser inserts an ast.ParenExpr node; thus this case
-		//       can only occur if the AST is created in a different way.
-		p.print(token.LPAREN)
-		p.expr0(x, reduceDepth(depth)) // parentheses undo one level of depth
-		p.print(token.RPAREN)
-		return
-	}
-
-	printBlank := prec < cutoff
-
-	ws := indent
-	p.expr1(x.X, prec, depth+diffPrec(x.X, prec))
-	if printBlank {
-		p.print(blank)
-	}
-	xline := p.pos.Line // before the operator (it may be on the next line!)
-	yline := p.lineFor(x.Y.Pos())
-	p.print(x.OpPos, x.Op)
-	if xline != yline && xline > 0 && yline > 0 {
-		// at least one line break, but respect an extra empty line
-		// in the source
-		if p.linebreak(yline, 1, ws, true) {
-			ws = ignore
-			printBlank = false // no blank after line break
-		}
-	}
-	if printBlank {
-		p.print(blank)
-	}
-	p.expr1(x.Y, prec+1, depth+1)
-	if ws == ignore {
-		p.print(unindent)
-	}
-}
-
-func isBinary(expr ast.Expr) bool {
-	_, ok := expr.(*ast.BinaryExpr)
-	return ok
-}
-
-func (p *printer) expr1(expr ast.Expr, prec1, depth int) {
-	p.print(expr.Pos())
-
-	switch x := expr.(type) {
-	case *ast.BadExpr:
-		p.print("BadExpr")
-
-	case *ast.Ident:
-		p.print(x)
-
-	case *ast.BinaryExpr:
-		if depth < 1 {
-			p.internalError("depth < 1:", depth)
-			depth = 1
-		}
-		p.binaryExpr(x, prec1, cutoff(x, depth), depth)
-
-	case *ast.KeyValueExpr:
-		p.expr(x.Key)
-		p.print(x.Colon, token.COLON, blank)
-		p.expr(x.Value)
-
-	case *ast.StarExpr:
-		const prec = token.UnaryPrec
-		if prec < prec1 {
-			// parenthesis needed
-			p.print(token.LPAREN)
-			p.print(token.MUL)
-			p.expr(x.X)
-			p.print(token.RPAREN)
-		} else {
-			// no parenthesis needed
-			p.print(token.MUL)
-			p.expr(x.X)
-		}
-
-	case *ast.UnaryExpr:
-		const prec = token.UnaryPrec
-		if prec < prec1 {
-			// parenthesis needed
-			p.print(token.LPAREN)
-			p.expr(x)
-			p.print(token.RPAREN)
-		} else {
-			// no parenthesis needed
-			p.print(x.Op)
-			if x.Op == token.RANGE {
-				// TODO(gri) Remove this code if it cannot be reached.
-				p.print(blank)
-			}
-			p.expr1(x.X, prec, depth)
-		}
-
-	case *ast.BasicLit:
-		p.print(x)
-
-	case *ast.FuncLit:
-		p.expr(x.Type)
-		p.adjBlock(p.distanceFrom(x.Type.Pos()), blank, x.Body)
-
-	case *ast.ParenExpr:
-		if _, hasParens := x.X.(*ast.ParenExpr); hasParens {
-			// don't print parentheses around an already parenthesized expression
-			// TODO(gri) consider making this more general and incorporate precedence levels
-			p.expr0(x.X, depth)
-		} else {
-			p.print(token.LPAREN)
-			p.expr0(x.X, reduceDepth(depth)) // parentheses undo one level of depth
-			p.print(x.Rparen, token.RPAREN)
-		}
-
-	case *ast.SelectorExpr:
-		p.expr1(x.X, token.HighestPrec, depth)
-		p.print(token.PERIOD)
-		if line := p.lineFor(x.Sel.Pos()); p.pos.IsValid() && p.pos.Line < line {
-			p.print(indent, newline, x.Sel.Pos(), x.Sel, unindent)
-		} else {
-			p.print(x.Sel.Pos(), x.Sel)
-		}
-
-	case *ast.TypeAssertExpr:
-		p.expr1(x.X, token.HighestPrec, depth)
-		p.print(token.PERIOD, x.Lparen, token.LPAREN)
-		if x.Type != nil {
-			p.expr(x.Type)
-		} else {
-			p.print(token.TYPE)
-		}
-		p.print(x.Rparen, token.RPAREN)
-
-	case *ast.IndexExpr:
-		// TODO(gri): should treat[] like parentheses and undo one level of depth
-		p.expr1(x.X, token.HighestPrec, 1)
-		p.print(x.Lbrack, token.LBRACK)
-		p.expr0(x.Index, depth+1)
-		p.print(x.Rbrack, token.RBRACK)
-
-	case *ast.SliceExpr:
-		// TODO(gri): should treat[] like parentheses and undo one level of depth
-		p.expr1(x.X, token.HighestPrec, 1)
-		p.print(x.Lbrack, token.LBRACK)
-		indices := []ast.Expr{x.Low, x.High}
-		if x.Max != nil {
-			indices = append(indices, x.Max)
-		}
-		for i, y := range indices {
-			if i > 0 {
-				// blanks around ":" if both sides exist and either side is a binary expression
-				// TODO(gri) once we have committed a variant of a[i:j:k] we may want to fine-
-				//           tune the formatting here
-				x := indices[i-1]
-				if depth <= 1 && x != nil && y != nil && (isBinary(x) || isBinary(y)) {
-					p.print(blank, token.COLON, blank)
-				} else {
-					p.print(token.COLON)
-				}
-			}
-			if y != nil {
-				p.expr0(y, depth+1)
-			}
-		}
-		p.print(x.Rbrack, token.RBRACK)
-
-	case *ast.CallExpr:
-		if len(x.Args) > 1 {
-			depth++
-		}
-		if _, ok := x.Fun.(*ast.FuncType); ok {
-			// conversions to literal function types require parentheses around the type
-			p.print(token.LPAREN)
-			p.expr1(x.Fun, token.HighestPrec, depth)
-			p.print(token.RPAREN)
-		} else {
-			p.expr1(x.Fun, token.HighestPrec, depth)
-		}
-		p.print(x.Lparen, token.LPAREN)
-		if x.Ellipsis.IsValid() {
-			p.exprList(x.Lparen, x.Args, depth, 0, x.Ellipsis)
-			p.print(x.Ellipsis, token.ELLIPSIS)
-			if x.Rparen.IsValid() && p.lineFor(x.Ellipsis) < p.lineFor(x.Rparen) {
-				p.print(token.COMMA, formfeed)
-			}
-		} else {
-			p.exprList(x.Lparen, x.Args, depth, commaTerm, x.Rparen)
-		}
-		p.print(x.Rparen, token.RPAREN)
-
-	case *ast.CompositeLit:
-		// composite literal elements that are composite literals themselves may have the type omitted
-		if x.Type != nil {
-			p.expr1(x.Type, token.HighestPrec, depth)
-		}
-		p.print(x.Lbrace, token.LBRACE)
-		p.exprList(x.Lbrace, x.Elts, 1, commaTerm, x.Rbrace)
-		// do not insert extra line break following a /*-style comment
-		// before the closing '}' as it might break the code if there
-		// is no trailing ','
-		mode := noExtraLinebreak
-		// do not insert extra blank following a /*-style comment
-		// before the closing '}' unless the literal is empty
-		if len(x.Elts) > 0 {
-			mode |= noExtraBlank
-		}
-		p.print(mode, x.Rbrace, token.RBRACE, mode)
-
-	case *ast.Ellipsis:
-		p.print(token.ELLIPSIS)
-		if x.Elt != nil {
-			p.expr(x.Elt)
-		}
-
-	case *ast.ArrayType:
-		p.print(token.LBRACK)
-		if x.Len != nil {
-			p.expr(x.Len)
-		}
-		p.print(token.RBRACK)
-		p.expr(x.Elt)
-
-	case *ast.StructType:
-		p.print(token.STRUCT)
-		p.fieldList(x.Fields, true, x.Incomplete)
-
-	case *ast.FuncType:
-		p.print(token.FUNC)
-		p.signature(x.Params, x.Results)
-
-	case *ast.InterfaceType:
-		p.print(token.INTERFACE)
-		p.fieldList(x.Methods, false, x.Incomplete)
-
-	case *ast.MapType:
-		p.print(token.MAP, token.LBRACK)
-		p.expr(x.Key)
-		p.print(token.RBRACK)
-		p.expr(x.Value)
-
-	case *ast.ChanType:
-		switch x.Dir {
-		case ast.SEND | ast.RECV:
-			p.print(token.CHAN)
-		case ast.RECV:
-			p.print(token.ARROW, token.CHAN) // x.Arrow and x.Pos() are the same
-		case ast.SEND:
-			p.print(token.CHAN, x.Arrow, token.ARROW)
-		}
-		p.print(blank)
-		p.expr(x.Value)
-
-	default:
-		panic("unreachable")
-	}
-
-	return
-}
-
-func (p *printer) expr0(x ast.Expr, depth int) {
-	p.expr1(x, token.LowestPrec, depth)
-}
-
-func (p *printer) expr(x ast.Expr) {
-	const depth = 1
-	p.expr1(x, token.LowestPrec, depth)
-}
-
-// ----------------------------------------------------------------------------
-// Statements
-
-// Print the statement list indented, but without a newline after the last statement.
-// Extra line breaks between statements in the source are respected but at most one
-// empty line is printed between statements.
-func (p *printer) stmtList(list []ast.Stmt, nindent int, nextIsRBrace bool) {
-	if nindent > 0 {
-		p.print(indent)
-	}
-	var line int
-	i := 0
-	for _, s := range list {
-		// ignore empty statements (was issue 3466)
-		if _, isEmpty := s.(*ast.EmptyStmt); !isEmpty {
-			// nindent == 0 only for lists of switch/select case clauses;
-			// in those cases each clause is a new section
-			if len(p.output) > 0 {
-				// only print line break if we are not at the beginning of the output
-				// (i.e., we are not printing only a partial program)
-				p.linebreak(p.lineFor(s.Pos()), 1, ignore, i == 0 || nindent == 0 || p.linesFrom(line) > 0)
-			}
-			p.recordLine(&line)
-			p.stmt(s, nextIsRBrace && i == len(list)-1)
-			// labeled statements put labels on a separate line, but here
-			// we only care about the start line of the actual statement
-			// without label - correct line for each label
-			for t := s; ; {
-				lt, _ := t.(*ast.LabeledStmt)
-				if lt == nil {
-					break
-				}
-				line++
-				t = lt.Stmt
-			}
-			i++
-		}
-	}
-	if nindent > 0 {
-		p.print(unindent)
-	}
-}
-
-// block prints an *ast.BlockStmt; it always spans at least two lines.
-func (p *printer) block(b *ast.BlockStmt, nindent int) {
-	p.print(b.Lbrace, token.LBRACE)
-	p.stmtList(b.List, nindent, true)
-	p.linebreak(p.lineFor(b.Rbrace), 1, ignore, true)
-	p.print(b.Rbrace, token.RBRACE)
-}
-
-func isTypeName(x ast.Expr) bool {
-	switch t := x.(type) {
-	case *ast.Ident:
-		return true
-	case *ast.SelectorExpr:
-		return isTypeName(t.X)
-	}
-	return false
-}
-
-func stripParens(x ast.Expr) ast.Expr {
-	if px, strip := x.(*ast.ParenExpr); strip {
-		// parentheses must not be stripped if there are any
-		// unparenthesized composite literals starting with
-		// a type name
-		ast.Inspect(px.X, func(node ast.Node) bool {
-			switch x := node.(type) {
-			case *ast.ParenExpr:
-				// parentheses protect enclosed composite literals
-				return false
-			case *ast.CompositeLit:
-				if isTypeName(x.Type) {
-					strip = false // do not strip parentheses
-				}
-				return false
-			}
-			// in all other cases, keep inspecting
-			return true
-		})
-		if strip {
-			return stripParens(px.X)
-		}
-	}
-	return x
-}
-
-func stripParensAlways(x ast.Expr) ast.Expr {
-	if x, ok := x.(*ast.ParenExpr); ok {
-		return stripParensAlways(x.X)
-	}
-	return x
-}
-
-func (p *printer) controlClause(isForStmt bool, init ast.Stmt, expr ast.Expr, post ast.Stmt) {
-	p.print(blank)
-	needsBlank := false
-	if init == nil && post == nil {
-		// no semicolons required
-		if expr != nil {
-			p.expr(stripParens(expr))
-			needsBlank = true
-		}
-	} else {
-		// all semicolons required
-		// (they are not separators, print them explicitly)
-		if init != nil {
-			p.stmt(init, false)
-		}
-		p.print(token.SEMICOLON, blank)
-		if expr != nil {
-			p.expr(stripParens(expr))
-			needsBlank = true
-		}
-		if isForStmt {
-			p.print(token.SEMICOLON, blank)
-			needsBlank = false
-			if post != nil {
-				p.stmt(post, false)
-				needsBlank = true
-			}
-		}
-	}
-	if needsBlank {
-		p.print(blank)
-	}
-}
-
-// indentList reports whether an expression list would look better if it
-// were indented wholesale (starting with the very first element, rather
-// than starting at the first line break).
-//
-func (p *printer) indentList(list []ast.Expr) bool {
-	// Heuristic: indentList returns true if there are more than one multi-
-	// line element in the list, or if there is any element that is not
-	// starting on the same line as the previous one ends.
-	if len(list) >= 2 {
-		var b = p.lineFor(list[0].Pos())
-		var e = p.lineFor(list[len(list)-1].End())
-		if 0 < b && b < e {
-			// list spans multiple lines
-			n := 0 // multi-line element count
-			line := b
-			for _, x := range list {
-				xb := p.lineFor(x.Pos())
-				xe := p.lineFor(x.End())
-				if line < xb {
-					// x is not starting on the same
-					// line as the previous one ended
-					return true
-				}
-				if xb < xe {
-					// x is a multi-line element
-					n++
-				}
-				line = xe
-			}
-			return n > 1
-		}
-	}
-	return false
-}
-
-func (p *printer) stmt(stmt ast.Stmt, nextIsRBrace bool) {
-	p.print(stmt.Pos())
-
-	switch s := stmt.(type) {
-	case *ast.BadStmt:
-		p.print("BadStmt")
-
-	case *ast.DeclStmt:
-		p.decl(s.Decl)
-
-	case *ast.EmptyStmt:
-		// nothing to do
-
-	case *ast.LabeledStmt:
-		// a "correcting" unindent immediately following a line break
-		// is applied before the line break if there is no comment
-		// between (see writeWhitespace)
-		p.print(unindent)
-		p.expr(s.Label)
-		p.print(s.Colon, token.COLON, indent)
-		if e, isEmpty := s.Stmt.(*ast.EmptyStmt); isEmpty {
-			if !nextIsRBrace {
-				p.print(newline, e.Pos(), token.SEMICOLON)
-				break
-			}
-		} else {
-			p.linebreak(p.lineFor(s.Stmt.Pos()), 1, ignore, true)
-		}
-		p.stmt(s.Stmt, nextIsRBrace)
-
-	case *ast.ExprStmt:
-		const depth = 1
-		p.expr0(s.X, depth)
-
-	case *ast.SendStmt:
-		const depth = 1
-		p.expr0(s.Chan, depth)
-		p.print(blank, s.Arrow, token.ARROW, blank)
-		p.expr0(s.Value, depth)
-
-	case *ast.IncDecStmt:
-		const depth = 1
-		p.expr0(s.X, depth+1)
-		p.print(s.TokPos, s.Tok)
-
-	case *ast.AssignStmt:
-		var depth = 1
-		if len(s.Lhs) > 1 && len(s.Rhs) > 1 {
-			depth++
-		}
-		p.exprList(s.Pos(), s.Lhs, depth, 0, s.TokPos)
-		p.print(blank, s.TokPos, s.Tok, blank)
-		p.exprList(s.TokPos, s.Rhs, depth, 0, token.NoPos)
-
-	case *ast.GoStmt:
-		p.print(token.GO, blank)
-		p.expr(s.Call)
-
-	case *ast.DeferStmt:
-		p.print(token.DEFER, blank)
-		p.expr(s.Call)
-
-	case *ast.ReturnStmt:
-		p.print(token.RETURN)
-		if s.Results != nil {
-			p.print(blank)
-			// Use indentList heuristic to make corner cases look
-			// better (issue 1207). A more systematic approach would
-			// always indent, but this would cause significant
-			// reformatting of the code base and not necessarily
-			// lead to more nicely formatted code in general.
-			if p.indentList(s.Results) {
-				p.print(indent)
-				p.exprList(s.Pos(), s.Results, 1, noIndent, token.NoPos)
-				p.print(unindent)
-			} else {
-				p.exprList(s.Pos(), s.Results, 1, 0, token.NoPos)
-			}
-		}
-
-	case *ast.BranchStmt:
-		p.print(s.Tok)
-		if s.Label != nil {
-			p.print(blank)
-			p.expr(s.Label)
-		}
-
-	case *ast.BlockStmt:
-		p.block(s, 1)
-
-	case *ast.IfStmt:
-		p.print(token.IF)
-		p.controlClause(false, s.Init, s.Cond, nil)
-		p.block(s.Body, 1)
-		if s.Else != nil {
-			p.print(blank, token.ELSE, blank)
-			switch s.Else.(type) {
-			case *ast.BlockStmt, *ast.IfStmt:
-				p.stmt(s.Else, nextIsRBrace)
-			default:
-				p.print(token.LBRACE, indent, formfeed)
-				p.stmt(s.Else, true)
-				p.print(unindent, formfeed, token.RBRACE)
-			}
-		}
-
-	case *ast.CaseClause:
-		if s.List != nil {
-			p.print(token.CASE, blank)
-			p.exprList(s.Pos(), s.List, 1, 0, s.Colon)
-		} else {
-			p.print(token.DEFAULT)
-		}
-		p.print(s.Colon, token.COLON)
-		p.stmtList(s.Body, 1, nextIsRBrace)
-
-	case *ast.SwitchStmt:
-		p.print(token.SWITCH)
-		p.controlClause(false, s.Init, s.Tag, nil)
-		p.block(s.Body, 0)
-
-	case *ast.TypeSwitchStmt:
-		p.print(token.SWITCH)
-		if s.Init != nil {
-			p.print(blank)
-			p.stmt(s.Init, false)
-			p.print(token.SEMICOLON)
-		}
-		p.print(blank)
-		p.stmt(s.Assign, false)
-		p.print(blank)
-		p.block(s.Body, 0)
-
-	case *ast.CommClause:
-		if s.Comm != nil {
-			p.print(token.CASE, blank)
-			p.stmt(s.Comm, false)
-		} else {
-			p.print(token.DEFAULT)
-		}
-		p.print(s.Colon, token.COLON)
-		p.stmtList(s.Body, 1, nextIsRBrace)
-
-	case *ast.SelectStmt:
-		p.print(token.SELECT, blank)
-		body := s.Body
-		if len(body.List) == 0 && !p.commentBefore(p.posFor(body.Rbrace)) {
-			// print empty select statement w/o comments on one line
-			p.print(body.Lbrace, token.LBRACE, body.Rbrace, token.RBRACE)
-		} else {
-			p.block(body, 0)
-		}
-
-	case *ast.ForStmt:
-		p.print(token.FOR)
-		p.controlClause(true, s.Init, s.Cond, s.Post)
-		p.block(s.Body, 1)
-
-	case *ast.RangeStmt:
-		p.print(token.FOR, blank)
-		if s.Key != nil {
-			p.expr(s.Key)
-			if s.Value != nil {
-				// use position of value following the comma as
-				// comma position for correct comment placement
-				p.print(s.Value.Pos(), token.COMMA, blank)
-				p.expr(s.Value)
-			}
-			p.print(blank, s.TokPos, s.Tok, blank)
-		}
-		p.print(token.RANGE, blank)
-		p.expr(stripParens(s.X))
-		p.print(blank)
-		p.block(s.Body, 1)
-
-	default:
-		panic("unreachable")
-	}
-
-	return
-}
-
-// ----------------------------------------------------------------------------
-// Declarations
-
-// The keepTypeColumn function determines if the type column of a series of
-// consecutive const or var declarations must be kept, or if initialization
-// values (V) can be placed in the type column (T) instead. The i'th entry
-// in the result slice is true if the type column in spec[i] must be kept.
-//
-// For example, the declaration:
-//
-//	const (
-//		foobar int = 42 // comment
-//		x          = 7  // comment
-//		foo
-//              bar = 991
-//	)
-//
-// leads to the type/values matrix below. A run of value columns (V) can
-// be moved into the type column if there is no type for any of the values
-// in that column (we only move entire columns so that they align properly).
-//
-//	matrix        formatted     result
-//                    matrix
-//	T  V    ->    T  V     ->   true      there is a T and so the type
-//	-  V          -  V          true      column must be kept
-//	-  -          -  -          false
-//	-  V          V  -          false     V is moved into T column
-//
-func keepTypeColumn(specs []ast.Spec) []bool {
-	m := make([]bool, len(specs))
-
-	populate := func(i, j int, keepType bool) {
-		if keepType {
-			for ; i < j; i++ {
-				m[i] = true
-			}
-		}
-	}
-
-	i0 := -1 // if i0 >= 0 we are in a run and i0 is the start of the run
-	var keepType bool
-	for i, s := range specs {
-		t := s.(*ast.ValueSpec)
-		if t.Values != nil {
-			if i0 < 0 {
-				// start of a run of ValueSpecs with non-nil Values
-				i0 = i
-				keepType = false
-			}
-		} else {
-			if i0 >= 0 {
-				// end of a run
-				populate(i0, i, keepType)
-				i0 = -1
-			}
-		}
-		if t.Type != nil {
-			keepType = true
-		}
-	}
-	if i0 >= 0 {
-		// end of a run
-		populate(i0, len(specs), keepType)
-	}
-
-	return m
-}
-
-func (p *printer) valueSpec(s *ast.ValueSpec, keepType bool) {
-	p.setComment(s.Doc)
-	p.identList(s.Names, false) // always present
-	extraTabs := 3
-	if s.Type != nil || keepType {
-		p.print(vtab)
-		extraTabs--
-	}
-	if s.Type != nil {
-		p.expr(s.Type)
-	}
-	if s.Values != nil {
-		p.print(vtab, token.ASSIGN, blank)
-		p.exprList(token.NoPos, s.Values, 1, 0, token.NoPos)
-		extraTabs--
-	}
-	if s.Comment != nil {
-		for ; extraTabs > 0; extraTabs-- {
-			p.print(vtab)
-		}
-		p.setComment(s.Comment)
-	}
-}
-
-func sanitizeImportPath(lit *ast.BasicLit) *ast.BasicLit {
-	// Note: An unmodified AST generated by go/parser will already
-	// contain a backward- or double-quoted path string that does
-	// not contain any invalid characters, and most of the work
-	// here is not needed. However, a modified or generated AST
-	// may possibly contain non-canonical paths. Do the work in
-	// all cases since it's not too hard and not speed-critical.
-
-	// if we don't have a proper string, be conservative and return whatever we have
-	if lit.Kind != token.STRING {
-		return lit
-	}
-	s, err := strconv.Unquote(lit.Value)
-	if err != nil {
-		return lit
-	}
-
-	// if the string is an invalid path, return whatever we have
-	//
-	// spec: "Implementation restriction: A compiler may restrict
-	// ImportPaths to non-empty strings using only characters belonging
-	// to Unicode's L, M, N, P, and S general categories (the Graphic
-	// characters without spaces) and may also exclude the characters
-	// !"#$%&'()*,:;<=>?[\]^`{|} and the Unicode replacement character
-	// U+FFFD."
-	if s == "" {
-		return lit
-	}
-	const illegalChars = `!"#$%&'()*,:;<=>?[\]^{|}` + "`\uFFFD"
-	for _, r := range s {
-		if !unicode.IsGraphic(r) || unicode.IsSpace(r) || strings.ContainsRune(illegalChars, r) {
-			return lit
-		}
-	}
-
-	// otherwise, return the double-quoted path
-	s = strconv.Quote(s)
-	if s == lit.Value {
-		return lit // nothing wrong with lit
-	}
-	return &ast.BasicLit{ValuePos: lit.ValuePos, Kind: token.STRING, Value: s}
-}
-
-// The parameter n is the number of specs in the group. If doIndent is set,
-// multi-line identifier lists in the spec are indented when the first
-// linebreak is encountered.
-//
-func (p *printer) spec(spec ast.Spec, n int, doIndent bool) {
-	switch s := spec.(type) {
-	case *ast.ImportSpec:
-		p.setComment(s.Doc)
-		if s.Name != nil {
-			p.expr(s.Name)
-			p.print(blank)
-		}
-		p.expr(sanitizeImportPath(s.Path))
-		p.setComment(s.Comment)
-		p.print(s.EndPos)
-
-	case *ast.ValueSpec:
-		if n != 1 {
-			p.internalError("expected n = 1; got", n)
-		}
-		p.setComment(s.Doc)
-		p.identList(s.Names, doIndent) // always present
-		if s.Type != nil {
-			p.print(blank)
-			p.expr(s.Type)
-		}
-		if s.Values != nil {
-			p.print(blank, token.ASSIGN, blank)
-			p.exprList(token.NoPos, s.Values, 1, 0, token.NoPos)
-		}
-		p.setComment(s.Comment)
-
-	case *ast.TypeSpec:
-		p.setComment(s.Doc)
-		p.expr(s.Name)
-		if n == 1 {
-			p.print(blank)
-		} else {
-			p.print(vtab)
-		}
-		p.expr(s.Type)
-		p.setComment(s.Comment)
-
-	default:
-		panic("unreachable")
-	}
-}
-
-func (p *printer) genDecl(d *ast.GenDecl) {
-	p.setComment(d.Doc)
-	p.print(d.Pos(), d.Tok, blank)
-
-	if d.Lparen.IsValid() {
-		// group of parenthesized declarations
-		p.print(d.Lparen, token.LPAREN)
-		if n := len(d.Specs); n > 0 {
-			p.print(indent, formfeed)
-			if n > 1 && (d.Tok == token.CONST || d.Tok == token.VAR) {
-				// two or more grouped const/var declarations:
-				// determine if the type column must be kept
-				keepType := keepTypeColumn(d.Specs)
-				var line int
-				for i, s := range d.Specs {
-					if i > 0 {
-						p.linebreak(p.lineFor(s.Pos()), 1, ignore, p.linesFrom(line) > 0)
-					}
-					p.recordLine(&line)
-					p.valueSpec(s.(*ast.ValueSpec), keepType[i])
-				}
-			} else {
-				var line int
-				for i, s := range d.Specs {
-					if i > 0 {
-						p.linebreak(p.lineFor(s.Pos()), 1, ignore, p.linesFrom(line) > 0)
-					}
-					p.recordLine(&line)
-					p.spec(s, n, false)
-				}
-			}
-			p.print(unindent, formfeed)
-		}
-		p.print(d.Rparen, token.RPAREN)
-
-	} else {
-		// single declaration
-		p.spec(d.Specs[0], 1, true)
-	}
-}
-
-// nodeSize determines the size of n in chars after formatting.
-// The result is <= maxSize if the node fits on one line with at
-// most maxSize chars and the formatted output doesn't contain
-// any control chars. Otherwise, the result is > maxSize.
-//
-func (p *printer) nodeSize(n ast.Node, maxSize int) (size int) {
-	// nodeSize invokes the printer, which may invoke nodeSize
-	// recursively. For deep composite literal nests, this can
-	// lead to an exponential algorithm. Remember previous
-	// results to prune the recursion (was issue 1628).
-	if size, found := p.nodeSizes[n]; found {
-		return size
-	}
-
-	size = maxSize + 1 // assume n doesn't fit
-	p.nodeSizes[n] = size
-
-	// nodeSize computation must be independent of particular
-	// style so that we always get the same decision; print
-	// in RawFormat
-	cfg := Config{Mode: RawFormat}
-	var buf bytes.Buffer
-	if err := cfg.fprint(&buf, p.fset, n, p.nodeSizes); err != nil {
-		return
-	}
-	if buf.Len() <= maxSize {
-		for _, ch := range buf.Bytes() {
-			if ch < ' ' {
-				return
-			}
-		}
-		size = buf.Len() // n fits
-		p.nodeSizes[n] = size
-	}
-	return
-}
-
-// bodySize is like nodeSize but it is specialized for *ast.BlockStmt's.
-func (p *printer) bodySize(b *ast.BlockStmt, maxSize int) int {
-	pos1 := b.Pos()
-	pos2 := b.Rbrace
-	if pos1.IsValid() && pos2.IsValid() && p.lineFor(pos1) != p.lineFor(pos2) {
-		// opening and closing brace are on different lines - don't make it a one-liner
-		return maxSize + 1
-	}
-	if len(b.List) > 5 {
-		// too many statements - don't make it a one-liner
-		return maxSize + 1
-	}
-	// otherwise, estimate body size
-	bodySize := p.commentSizeBefore(p.posFor(pos2))
-	for i, s := range b.List {
-		if bodySize > maxSize {
-			break // no need to continue
-		}
-		if i > 0 {
-			bodySize += 2 // space for a semicolon and blank
-		}
-		bodySize += p.nodeSize(s, maxSize)
-	}
-	return bodySize
-}
-
-// adjBlock prints an "adjacent" block (e.g., a for-loop or function body) following
-// a header (e.g., a for-loop control clause or function signature) of given headerSize.
-// If the header's and block's size are "small enough" and the block is "simple enough",
-// the block is printed on the current line, without line breaks, spaced from the header
-// by sep. Otherwise the block's opening "{" is printed on the current line, followed by
-// lines for the block's statements and its closing "}".
-//
-func (p *printer) adjBlock(headerSize int, sep whiteSpace, b *ast.BlockStmt) {
-	if b == nil {
-		return
-	}
-
-	const maxSize = 100
-	if headerSize+p.bodySize(b, maxSize) <= maxSize {
-		p.print(sep, b.Lbrace, token.LBRACE)
-		if len(b.List) > 0 {
-			p.print(blank)
-			for i, s := range b.List {
-				if i > 0 {
-					p.print(token.SEMICOLON, blank)
-				}
-				p.stmt(s, i == len(b.List)-1)
-			}
-			p.print(blank)
-		}
-		p.print(noExtraLinebreak, b.Rbrace, token.RBRACE, noExtraLinebreak)
-		return
-	}
-
-	if sep != ignore {
-		p.print(blank) // always use blank
-	}
-	p.block(b, 1)
-}
-
-// distanceFrom returns the column difference between from and p.pos (the current
-// estimated position) if both are on the same line; if they are on different lines
-// (or unknown) the result is infinity.
-func (p *printer) distanceFrom(from token.Pos) int {
-	if from.IsValid() && p.pos.IsValid() {
-		if f := p.posFor(from); f.Line == p.pos.Line {
-			return p.pos.Column - f.Column
-		}
-	}
-	return infinity
-}
-
-func (p *printer) funcDecl(d *ast.FuncDecl) {
-	p.setComment(d.Doc)
-	p.print(d.Pos(), token.FUNC, blank)
-	if d.Recv != nil {
-		p.parameters(d.Recv) // method: print receiver
-		p.print(blank)
-	}
-	p.expr(d.Name)
-	p.signature(d.Type.Params, d.Type.Results)
-	p.adjBlock(p.distanceFrom(d.Pos()), vtab, d.Body)
-}
-
-func (p *printer) decl(decl ast.Decl) {
-	switch d := decl.(type) {
-	case *ast.BadDecl:
-		p.print(d.Pos(), "BadDecl")
-	case *ast.GenDecl:
-		p.genDecl(d)
-	case *ast.FuncDecl:
-		p.funcDecl(d)
-	default:
-		panic("unreachable")
-	}
-}
-
-// ----------------------------------------------------------------------------
-// Files
-
-func declToken(decl ast.Decl) (tok token.Token) {
-	tok = token.ILLEGAL
-	switch d := decl.(type) {
-	case *ast.GenDecl:
-		tok = d.Tok
-	case *ast.FuncDecl:
-		tok = token.FUNC
-	}
-	return
-}
-
-func (p *printer) declList(list []ast.Decl) {
-	tok := token.ILLEGAL
-	for _, d := range list {
-		prev := tok
-		tok = declToken(d)
-		// If the declaration token changed (e.g., from CONST to TYPE)
-		// or the next declaration has documentation associated with it,
-		// print an empty line between top-level declarations.
-		// (because p.linebreak is called with the position of d, which
-		// is past any documentation, the minimum requirement is satisfied
-		// even w/o the extra getDoc(d) nil-check - leave it in case the
-		// linebreak logic improves - there's already a TODO).
-		if len(p.output) > 0 {
-			// only print line break if we are not at the beginning of the output
-			// (i.e., we are not printing only a partial program)
-			min := 1
-			if prev != tok || getDoc(d) != nil {
-				min = 2
-			}
-			p.linebreak(p.lineFor(d.Pos()), min, ignore, false)
-		}
-		p.decl(d)
-	}
-}
-
-func (p *printer) file(src *ast.File) {
-	p.setComment(src.Doc)
-	p.print(src.Pos(), token.PACKAGE, blank)
-	p.expr(src.Name)
-	p.declList(src.Decls)
-	p.print(newline)
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/performance_test.go b/third_party/gofrontend/libgo/go/go/printer/performance_test.go
deleted file mode 100644
index 5b29aff..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/performance_test.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements a simple printer performance benchmark:
-// go test -bench=BenchmarkPrint
-
-package printer
-
-import (
-	"bytes"
-	"go/ast"
-	"go/parser"
-	"io"
-	"io/ioutil"
-	"log"
-	"testing"
-)
-
-var testfile *ast.File
-
-func testprint(out io.Writer, file *ast.File) {
-	if err := (&Config{TabIndent | UseSpaces, 8, 0}).Fprint(out, fset, file); err != nil {
-		log.Fatalf("print error: %s", err)
-	}
-}
-
-// cannot initialize in init because (printer) Fprint launches goroutines.
-func initialize() {
-	const filename = "testdata/parser.go"
-
-	src, err := ioutil.ReadFile(filename)
-	if err != nil {
-		log.Fatalf("%s", err)
-	}
-
-	file, err := parser.ParseFile(fset, filename, src, parser.ParseComments)
-	if err != nil {
-		log.Fatalf("%s", err)
-	}
-
-	var buf bytes.Buffer
-	testprint(&buf, file)
-	if !bytes.Equal(buf.Bytes(), src) {
-		log.Fatalf("print error: %s not idempotent", filename)
-	}
-
-	testfile = file
-}
-
-func BenchmarkPrint(b *testing.B) {
-	if testfile == nil {
-		initialize()
-	}
-	for i := 0; i < b.N; i++ {
-		testprint(ioutil.Discard, testfile)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/printer.go b/third_party/gofrontend/libgo/go/go/printer/printer.go
deleted file mode 100644
index f9343d3..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/printer.go
+++ /dev/null
@@ -1,1296 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package printer implements printing of AST nodes.
-package printer
-
-import (
-	"fmt"
-	"go/ast"
-	"go/token"
-	"io"
-	"os"
-	"strconv"
-	"strings"
-	"text/tabwriter"
-	"unicode"
-)
-
-const (
-	maxNewlines = 2     // max. number of newlines between source text
-	debug       = false // enable for debugging
-	infinity    = 1 << 30
-)
-
-type whiteSpace byte
-
-const (
-	ignore   = whiteSpace(0)
-	blank    = whiteSpace(' ')
-	vtab     = whiteSpace('\v')
-	newline  = whiteSpace('\n')
-	formfeed = whiteSpace('\f')
-	indent   = whiteSpace('>')
-	unindent = whiteSpace('<')
-)
-
-// A pmode value represents the current printer mode.
-type pmode int
-
-const (
-	noExtraBlank     pmode = 1 << iota // disables extra blank after /*-style comment
-	noExtraLinebreak                   // disables extra line break after /*-style comment
-)
-
-type commentInfo struct {
-	cindex         int               // current comment index
-	comment        *ast.CommentGroup // = printer.comments[cindex]; or nil
-	commentOffset  int               // = printer.posFor(printer.comments[cindex].List[0].Pos()).Offset; or infinity
-	commentNewline bool              // true if the comment group contains newlines
-}
-
-type printer struct {
-	// Configuration (does not change after initialization)
-	Config
-	fset *token.FileSet
-
-	// Current state
-	output      []byte       // raw printer result
-	indent      int          // current indentation
-	mode        pmode        // current printer mode
-	impliedSemi bool         // if set, a linebreak implies a semicolon
-	lastTok     token.Token  // last token printed (token.ILLEGAL if it's whitespace)
-	prevOpen    token.Token  // previous non-brace "open" token (, [, or token.ILLEGAL
-	wsbuf       []whiteSpace // delayed white space
-
-	// Positions
-	// The out position differs from the pos position when the result
-	// formatting differs from the source formatting (in the amount of
-	// white space). If there's a difference and SourcePos is set in
-	// ConfigMode, //line comments are used in the output to restore
-	// original source positions for a reader.
-	pos     token.Position // current position in AST (source) space
-	out     token.Position // current position in output space
-	last    token.Position // value of pos after calling writeString
-	linePtr *int           // if set, record out.Line for the next token in *linePtr
-
-	// The list of all source comments, in order of appearance.
-	comments        []*ast.CommentGroup // may be nil
-	useNodeComments bool                // if not set, ignore lead and line comments of nodes
-
-	// Information about p.comments[p.cindex]; set up by nextComment.
-	commentInfo
-
-	// Cache of already computed node sizes.
-	nodeSizes map[ast.Node]int
-
-	// Cache of most recently computed line position.
-	cachedPos  token.Pos
-	cachedLine int // line corresponding to cachedPos
-}
-
-func (p *printer) init(cfg *Config, fset *token.FileSet, nodeSizes map[ast.Node]int) {
-	p.Config = *cfg
-	p.fset = fset
-	p.pos = token.Position{Line: 1, Column: 1}
-	p.out = token.Position{Line: 1, Column: 1}
-	p.wsbuf = make([]whiteSpace, 0, 16) // whitespace sequences are short
-	p.nodeSizes = nodeSizes
-	p.cachedPos = -1
-}
-
-func (p *printer) internalError(msg ...interface{}) {
-	if debug {
-		fmt.Print(p.pos.String() + ": ")
-		fmt.Println(msg...)
-		panic("go/printer")
-	}
-}
-
-// commentsHaveNewline reports whether a list of comments belonging to
-// an *ast.CommentGroup contains newlines. Because the position information
-// may only be partially correct, we also have to read the comment text.
-func (p *printer) commentsHaveNewline(list []*ast.Comment) bool {
-	// len(list) > 0
-	line := p.lineFor(list[0].Pos())
-	for i, c := range list {
-		if i > 0 && p.lineFor(list[i].Pos()) != line {
-			// not all comments on the same line
-			return true
-		}
-		if t := c.Text; len(t) >= 2 && (t[1] == '/' || strings.Contains(t, "\n")) {
-			return true
-		}
-	}
-	_ = line
-	return false
-}
-
-func (p *printer) nextComment() {
-	for p.cindex < len(p.comments) {
-		c := p.comments[p.cindex]
-		p.cindex++
-		if list := c.List; len(list) > 0 {
-			p.comment = c
-			p.commentOffset = p.posFor(list[0].Pos()).Offset
-			p.commentNewline = p.commentsHaveNewline(list)
-			return
-		}
-		// we should not reach here (correct ASTs don't have empty
-		// ast.CommentGroup nodes), but be conservative and try again
-	}
-	// no more comments
-	p.commentOffset = infinity
-}
-
-// commentBefore reports whether the current comment group occurs
-// before the next position in the source code and printing it does
-// not introduce implicit semicolons.
-//
-func (p *printer) commentBefore(next token.Position) bool {
-	return p.commentOffset < next.Offset && (!p.impliedSemi || !p.commentNewline)
-}
-
-// commentSizeBefore returns the estimated size of the
-// comments on the same line before the next position.
-//
-func (p *printer) commentSizeBefore(next token.Position) int {
-	// save/restore current p.commentInfo (p.nextComment() modifies it)
-	defer func(info commentInfo) {
-		p.commentInfo = info
-	}(p.commentInfo)
-
-	size := 0
-	for p.commentBefore(next) {
-		for _, c := range p.comment.List {
-			size += len(c.Text)
-		}
-		p.nextComment()
-	}
-	return size
-}
-
-// recordLine records the output line number for the next non-whitespace
-// token in *linePtr. It is used to compute an accurate line number for a
-// formatted construct, independent of pending (not yet emitted) whitespace
-// or comments.
-//
-func (p *printer) recordLine(linePtr *int) {
-	p.linePtr = linePtr
-}
-
-// linesFrom returns the number of output lines between the current
-// output line and the line argument, ignoring any pending (not yet
-// emitted) whitespace or comments. It is used to compute an accurate
-// size (in number of lines) for a formatted construct.
-//
-func (p *printer) linesFrom(line int) int {
-	return p.out.Line - line
-}
-
-func (p *printer) posFor(pos token.Pos) token.Position {
-	// not used frequently enough to cache entire token.Position
-	return p.fset.Position(pos)
-}
-
-func (p *printer) lineFor(pos token.Pos) int {
-	if pos != p.cachedPos {
-		p.cachedPos = pos
-		p.cachedLine = p.fset.Position(pos).Line
-	}
-	return p.cachedLine
-}
-
-// atLineBegin emits a //line comment if necessary and prints indentation.
-func (p *printer) atLineBegin(pos token.Position) {
-	// write a //line comment if necessary
-	if p.Config.Mode&SourcePos != 0 && pos.IsValid() && (p.out.Line != pos.Line || p.out.Filename != pos.Filename) {
-		p.output = append(p.output, tabwriter.Escape) // protect '\n' in //line from tabwriter interpretation
-		p.output = append(p.output, fmt.Sprintf("//line %s:%d\n", pos.Filename, pos.Line)...)
-		p.output = append(p.output, tabwriter.Escape)
-		// p.out must match the //line comment
-		p.out.Filename = pos.Filename
-		p.out.Line = pos.Line
-	}
-
-	// write indentation
-	// use "hard" htabs - indentation columns
-	// must not be discarded by the tabwriter
-	n := p.Config.Indent + p.indent // include base indentation
-	for i := 0; i < n; i++ {
-		p.output = append(p.output, '\t')
-	}
-
-	// update positions
-	p.pos.Offset += n
-	p.pos.Column += n
-	p.out.Column += n
-}
-
-// writeByte writes ch n times to p.output and updates p.pos.
-func (p *printer) writeByte(ch byte, n int) {
-	if p.out.Column == 1 {
-		p.atLineBegin(p.pos)
-	}
-
-	for i := 0; i < n; i++ {
-		p.output = append(p.output, ch)
-	}
-
-	// update positions
-	p.pos.Offset += n
-	if ch == '\n' || ch == '\f' {
-		p.pos.Line += n
-		p.out.Line += n
-		p.pos.Column = 1
-		p.out.Column = 1
-		return
-	}
-	p.pos.Column += n
-	p.out.Column += n
-}
-
-// writeString writes the string s to p.output and updates p.pos, p.out,
-// and p.last. If isLit is set, s is escaped w/ tabwriter.Escape characters
-// to protect s from being interpreted by the tabwriter.
-//
-// Note: writeString is only used to write Go tokens, literals, and
-// comments, all of which must be written literally. Thus, it is correct
-// to always set isLit = true. However, setting it explicitly only when
-// needed (i.e., when we don't know that s contains no tabs or line breaks)
-// avoids processing extra escape characters and reduces run time of the
-// printer benchmark by up to 10%.
-//
-func (p *printer) writeString(pos token.Position, s string, isLit bool) {
-	if p.out.Column == 1 {
-		p.atLineBegin(pos)
-	}
-
-	if pos.IsValid() {
-		// update p.pos (if pos is invalid, continue with existing p.pos)
-		// Note: Must do this after handling line beginnings because
-		// atLineBegin updates p.pos if there's indentation, but p.pos
-		// is the position of s.
-		p.pos = pos
-	}
-
-	if isLit {
-		// Protect s such that is passes through the tabwriter
-		// unchanged. Note that valid Go programs cannot contain
-		// tabwriter.Escape bytes since they do not appear in legal
-		// UTF-8 sequences.
-		p.output = append(p.output, tabwriter.Escape)
-	}
-
-	if debug {
-		p.output = append(p.output, fmt.Sprintf("/*%s*/", pos)...) // do not update p.pos!
-	}
-	p.output = append(p.output, s...)
-
-	// update positions
-	nlines := 0
-	var li int // index of last newline; valid if nlines > 0
-	for i := 0; i < len(s); i++ {
-		// Go tokens cannot contain '\f' - no need to look for it
-		if s[i] == '\n' {
-			nlines++
-			li = i
-		}
-	}
-	p.pos.Offset += len(s)
-	if nlines > 0 {
-		p.pos.Line += nlines
-		p.out.Line += nlines
-		c := len(s) - li
-		p.pos.Column = c
-		p.out.Column = c
-	} else {
-		p.pos.Column += len(s)
-		p.out.Column += len(s)
-	}
-
-	if isLit {
-		p.output = append(p.output, tabwriter.Escape)
-	}
-
-	p.last = p.pos
-}
-
-// writeCommentPrefix writes the whitespace before a comment.
-// If there is any pending whitespace, it consumes as much of
-// it as is likely to help position the comment nicely.
-// pos is the comment position, next the position of the item
-// after all pending comments, prev is the previous comment in
-// a group of comments (or nil), and tok is the next token.
-//
-func (p *printer) writeCommentPrefix(pos, next token.Position, prev, comment *ast.Comment, tok token.Token) {
-	if len(p.output) == 0 {
-		// the comment is the first item to be printed - don't write any whitespace
-		return
-	}
-
-	if pos.IsValid() && pos.Filename != p.last.Filename {
-		// comment in a different file - separate with newlines
-		p.writeByte('\f', maxNewlines)
-		return
-	}
-
-	if pos.Line == p.last.Line && (prev == nil || prev.Text[1] != '/') {
-		// comment on the same line as last item:
-		// separate with at least one separator
-		hasSep := false
-		if prev == nil {
-			// first comment of a comment group
-			j := 0
-			for i, ch := range p.wsbuf {
-				switch ch {
-				case blank:
-					// ignore any blanks before a comment
-					p.wsbuf[i] = ignore
-					continue
-				case vtab:
-					// respect existing tabs - important
-					// for proper formatting of commented structs
-					hasSep = true
-					continue
-				case indent:
-					// apply pending indentation
-					continue
-				}
-				j = i
-				break
-			}
-			p.writeWhitespace(j)
-		}
-		// make sure there is at least one separator
-		if !hasSep {
-			sep := byte('\t')
-			if pos.Line == next.Line {
-				// next item is on the same line as the comment
-				// (which must be a /*-style comment): separate
-				// with a blank instead of a tab
-				sep = ' '
-			}
-			p.writeByte(sep, 1)
-		}
-
-	} else {
-		// comment on a different line:
-		// separate with at least one line break
-		droppedLinebreak := false
-		j := 0
-		for i, ch := range p.wsbuf {
-			switch ch {
-			case blank, vtab:
-				// ignore any horizontal whitespace before line breaks
-				p.wsbuf[i] = ignore
-				continue
-			case indent:
-				// apply pending indentation
-				continue
-			case unindent:
-				// if this is not the last unindent, apply it
-				// as it is (likely) belonging to the last
-				// construct (e.g., a multi-line expression list)
-				// and is not part of closing a block
-				if i+1 < len(p.wsbuf) && p.wsbuf[i+1] == unindent {
-					continue
-				}
-				// if the next token is not a closing }, apply the unindent
-				// if it appears that the comment is aligned with the
-				// token; otherwise assume the unindent is part of a
-				// closing block and stop (this scenario appears with
-				// comments before a case label where the comments
-				// apply to the next case instead of the current one)
-				if tok != token.RBRACE && pos.Column == next.Column {
-					continue
-				}
-			case newline, formfeed:
-				p.wsbuf[i] = ignore
-				droppedLinebreak = prev == nil // record only if first comment of a group
-			}
-			j = i
-			break
-		}
-		p.writeWhitespace(j)
-
-		// determine number of linebreaks before the comment
-		n := 0
-		if pos.IsValid() && p.last.IsValid() {
-			n = pos.Line - p.last.Line
-			if n < 0 { // should never happen
-				n = 0
-			}
-		}
-
-		// at the package scope level only (p.indent == 0),
-		// add an extra newline if we dropped one before:
-		// this preserves a blank line before documentation
-		// comments at the package scope level (issue 2570)
-		if p.indent == 0 && droppedLinebreak {
-			n++
-		}
-
-		// make sure there is at least one line break
-		// if the previous comment was a line comment
-		if n == 0 && prev != nil && prev.Text[1] == '/' {
-			n = 1
-		}
-
-		if n > 0 {
-			// use formfeeds to break columns before a comment;
-			// this is analogous to using formfeeds to separate
-			// individual lines of /*-style comments
-			p.writeByte('\f', nlimit(n))
-		}
-	}
-}
-
-// Returns true if s contains only white space
-// (only tabs and blanks can appear in the printer's context).
-//
-func isBlank(s string) bool {
-	for i := 0; i < len(s); i++ {
-		if s[i] > ' ' {
-			return false
-		}
-	}
-	return true
-}
-
-// commonPrefix returns the common prefix of a and b.
-func commonPrefix(a, b string) string {
-	i := 0
-	for i < len(a) && i < len(b) && a[i] == b[i] && (a[i] <= ' ' || a[i] == '*') {
-		i++
-	}
-	return a[0:i]
-}
-
-// trimRight returns s with trailing whitespace removed.
-func trimRight(s string) string {
-	return strings.TrimRightFunc(s, unicode.IsSpace)
-}
-
-// stripCommonPrefix removes a common prefix from /*-style comment lines (unless no
-// comment line is indented, all but the first line have some form of space prefix).
-// The prefix is computed using heuristics such that is likely that the comment
-// contents are nicely laid out after re-printing each line using the printer's
-// current indentation.
-//
-func stripCommonPrefix(lines []string) {
-	if len(lines) <= 1 {
-		return // at most one line - nothing to do
-	}
-	// len(lines) > 1
-
-	// The heuristic in this function tries to handle a few
-	// common patterns of /*-style comments: Comments where
-	// the opening /* and closing */ are aligned and the
-	// rest of the comment text is aligned and indented with
-	// blanks or tabs, cases with a vertical "line of stars"
-	// on the left, and cases where the closing */ is on the
-	// same line as the last comment text.
-
-	// Compute maximum common white prefix of all but the first,
-	// last, and blank lines, and replace blank lines with empty
-	// lines (the first line starts with /* and has no prefix).
-	// In cases where only the first and last lines are not blank,
-	// such as two-line comments, or comments where all inner lines
-	// are blank, consider the last line for the prefix computation
-	// since otherwise the prefix would be empty.
-	//
-	// Note that the first and last line are never empty (they
-	// contain the opening /* and closing */ respectively) and
-	// thus they can be ignored by the blank line check.
-	prefix := ""
-	prefixSet := false
-	if len(lines) > 2 {
-		for i, line := range lines[1 : len(lines)-1] {
-			if isBlank(line) {
-				lines[1+i] = "" // range starts with lines[1]
-			} else {
-				if !prefixSet {
-					prefix = line
-					prefixSet = true
-				}
-				prefix = commonPrefix(prefix, line)
-			}
-
-		}
-	}
-	// If we don't have a prefix yet, consider the last line.
-	if !prefixSet {
-		line := lines[len(lines)-1]
-		prefix = commonPrefix(line, line)
-	}
-
-	/*
-	 * Check for vertical "line of stars" and correct prefix accordingly.
-	 */
-	lineOfStars := false
-	if i := strings.Index(prefix, "*"); i >= 0 {
-		// Line of stars present.
-		if i > 0 && prefix[i-1] == ' ' {
-			i-- // remove trailing blank from prefix so stars remain aligned
-		}
-		prefix = prefix[0:i]
-		lineOfStars = true
-	} else {
-		// No line of stars present.
-		// Determine the white space on the first line after the /*
-		// and before the beginning of the comment text, assume two
-		// blanks instead of the /* unless the first character after
-		// the /* is a tab. If the first comment line is empty but
-		// for the opening /*, assume up to 3 blanks or a tab. This
-		// whitespace may be found as suffix in the common prefix.
-		first := lines[0]
-		if isBlank(first[2:]) {
-			// no comment text on the first line:
-			// reduce prefix by up to 3 blanks or a tab
-			// if present - this keeps comment text indented
-			// relative to the /* and */'s if it was indented
-			// in the first place
-			i := len(prefix)
-			for n := 0; n < 3 && i > 0 && prefix[i-1] == ' '; n++ {
-				i--
-			}
-			if i == len(prefix) && i > 0 && prefix[i-1] == '\t' {
-				i--
-			}
-			prefix = prefix[0:i]
-		} else {
-			// comment text on the first line
-			suffix := make([]byte, len(first))
-			n := 2 // start after opening /*
-			for n < len(first) && first[n] <= ' ' {
-				suffix[n] = first[n]
-				n++
-			}
-			if n > 2 && suffix[2] == '\t' {
-				// assume the '\t' compensates for the /*
-				suffix = suffix[2:n]
-			} else {
-				// otherwise assume two blanks
-				suffix[0], suffix[1] = ' ', ' '
-				suffix = suffix[0:n]
-			}
-			// Shorten the computed common prefix by the length of
-			// suffix, if it is found as suffix of the prefix.
-			prefix = strings.TrimSuffix(prefix, string(suffix))
-		}
-	}
-
-	// Handle last line: If it only contains a closing */, align it
-	// with the opening /*, otherwise align the text with the other
-	// lines.
-	last := lines[len(lines)-1]
-	closing := "*/"
-	i := strings.Index(last, closing) // i >= 0 (closing is always present)
-	if isBlank(last[0:i]) {
-		// last line only contains closing */
-		if lineOfStars {
-			closing = " */" // add blank to align final star
-		}
-		lines[len(lines)-1] = prefix + closing
-	} else {
-		// last line contains more comment text - assume
-		// it is aligned like the other lines and include
-		// in prefix computation
-		prefix = commonPrefix(prefix, last)
-	}
-
-	// Remove the common prefix from all but the first and empty lines.
-	for i, line := range lines {
-		if i > 0 && line != "" {
-			lines[i] = line[len(prefix):]
-		}
-	}
-}
-
-func (p *printer) writeComment(comment *ast.Comment) {
-	text := comment.Text
-	pos := p.posFor(comment.Pos())
-
-	const linePrefix = "//line "
-	if strings.HasPrefix(text, linePrefix) && (!pos.IsValid() || pos.Column == 1) {
-		// possibly a line directive
-		ldir := strings.TrimSpace(text[len(linePrefix):])
-		if i := strings.LastIndex(ldir, ":"); i >= 0 {
-			if line, err := strconv.Atoi(ldir[i+1:]); err == nil && line > 0 {
-				// The line directive we are about to print changed
-				// the Filename and Line number used for subsequent
-				// tokens. We have to update our AST-space position
-				// accordingly and suspend indentation temporarily.
-				indent := p.indent
-				p.indent = 0
-				defer func() {
-					p.pos.Filename = ldir[:i]
-					p.pos.Line = line
-					p.pos.Column = 1
-					p.indent = indent
-				}()
-			}
-		}
-	}
-
-	// shortcut common case of //-style comments
-	if text[1] == '/' {
-		p.writeString(pos, trimRight(text), true)
-		return
-	}
-
-	// for /*-style comments, print line by line and let the
-	// write function take care of the proper indentation
-	lines := strings.Split(text, "\n")
-
-	// The comment started in the first column but is going
-	// to be indented. For an idempotent result, add indentation
-	// to all lines such that they look like they were indented
-	// before - this will make sure the common prefix computation
-	// is the same independent of how many times formatting is
-	// applied (was issue 1835).
-	if pos.IsValid() && pos.Column == 1 && p.indent > 0 {
-		for i, line := range lines[1:] {
-			lines[1+i] = "   " + line
-		}
-	}
-
-	stripCommonPrefix(lines)
-
-	// write comment lines, separated by formfeed,
-	// without a line break after the last line
-	for i, line := range lines {
-		if i > 0 {
-			p.writeByte('\f', 1)
-			pos = p.pos
-		}
-		if len(line) > 0 {
-			p.writeString(pos, trimRight(line), true)
-		}
-	}
-}
-
-// writeCommentSuffix writes a line break after a comment if indicated
-// and processes any leftover indentation information. If a line break
-// is needed, the kind of break (newline vs formfeed) depends on the
-// pending whitespace. The writeCommentSuffix result indicates if a
-// newline was written or if a formfeed was dropped from the whitespace
-// buffer.
-//
-func (p *printer) writeCommentSuffix(needsLinebreak bool) (wroteNewline, droppedFF bool) {
-	for i, ch := range p.wsbuf {
-		switch ch {
-		case blank, vtab:
-			// ignore trailing whitespace
-			p.wsbuf[i] = ignore
-		case indent, unindent:
-			// don't lose indentation information
-		case newline, formfeed:
-			// if we need a line break, keep exactly one
-			// but remember if we dropped any formfeeds
-			if needsLinebreak {
-				needsLinebreak = false
-				wroteNewline = true
-			} else {
-				if ch == formfeed {
-					droppedFF = true
-				}
-				p.wsbuf[i] = ignore
-			}
-		}
-	}
-	p.writeWhitespace(len(p.wsbuf))
-
-	// make sure we have a line break
-	if needsLinebreak {
-		p.writeByte('\n', 1)
-		wroteNewline = true
-	}
-
-	return
-}
-
-// intersperseComments consumes all comments that appear before the next token
-// tok and prints it together with the buffered whitespace (i.e., the whitespace
-// that needs to be written before the next token). A heuristic is used to mix
-// the comments and whitespace. The intersperseComments result indicates if a
-// newline was written or if a formfeed was dropped from the whitespace buffer.
-//
-func (p *printer) intersperseComments(next token.Position, tok token.Token) (wroteNewline, droppedFF bool) {
-	var last *ast.Comment
-	for p.commentBefore(next) {
-		for _, c := range p.comment.List {
-			p.writeCommentPrefix(p.posFor(c.Pos()), next, last, c, tok)
-			p.writeComment(c)
-			last = c
-		}
-		p.nextComment()
-	}
-
-	if last != nil {
-		// if the last comment is a /*-style comment and the next item
-		// follows on the same line but is not a comma, and not a "closing"
-		// token immediately following its corresponding "opening" token,
-		// add an extra blank for separation unless explicitly disabled
-		if p.mode&noExtraBlank == 0 &&
-			last.Text[1] == '*' && p.lineFor(last.Pos()) == next.Line &&
-			tok != token.COMMA &&
-			(tok != token.RPAREN || p.prevOpen == token.LPAREN) &&
-			(tok != token.RBRACK || p.prevOpen == token.LBRACK) {
-			p.writeByte(' ', 1)
-		}
-		// ensure that there is a line break after a //-style comment,
-		// before a closing '}' unless explicitly disabled, or at eof
-		needsLinebreak :=
-			last.Text[1] == '/' ||
-				tok == token.RBRACE && p.mode&noExtraLinebreak == 0 ||
-				tok == token.EOF
-		return p.writeCommentSuffix(needsLinebreak)
-	}
-
-	// no comment was written - we should never reach here since
-	// intersperseComments should not be called in that case
-	p.internalError("intersperseComments called without pending comments")
-	return
-}
-
-// whiteWhitespace writes the first n whitespace entries.
-func (p *printer) writeWhitespace(n int) {
-	// write entries
-	for i := 0; i < n; i++ {
-		switch ch := p.wsbuf[i]; ch {
-		case ignore:
-			// ignore!
-		case indent:
-			p.indent++
-		case unindent:
-			p.indent--
-			if p.indent < 0 {
-				p.internalError("negative indentation:", p.indent)
-				p.indent = 0
-			}
-		case newline, formfeed:
-			// A line break immediately followed by a "correcting"
-			// unindent is swapped with the unindent - this permits
-			// proper label positioning. If a comment is between
-			// the line break and the label, the unindent is not
-			// part of the comment whitespace prefix and the comment
-			// will be positioned correctly indented.
-			if i+1 < n && p.wsbuf[i+1] == unindent {
-				// Use a formfeed to terminate the current section.
-				// Otherwise, a long label name on the next line leading
-				// to a wide column may increase the indentation column
-				// of lines before the label; effectively leading to wrong
-				// indentation.
-				p.wsbuf[i], p.wsbuf[i+1] = unindent, formfeed
-				i-- // do it again
-				continue
-			}
-			fallthrough
-		default:
-			p.writeByte(byte(ch), 1)
-		}
-	}
-
-	// shift remaining entries down
-	l := copy(p.wsbuf, p.wsbuf[n:])
-	p.wsbuf = p.wsbuf[:l]
-}
-
-// ----------------------------------------------------------------------------
-// Printing interface
-
-// nlines limits n to maxNewlines.
-func nlimit(n int) int {
-	if n > maxNewlines {
-		n = maxNewlines
-	}
-	return n
-}
-
-func mayCombine(prev token.Token, next byte) (b bool) {
-	switch prev {
-	case token.INT:
-		b = next == '.' // 1.
-	case token.ADD:
-		b = next == '+' // ++
-	case token.SUB:
-		b = next == '-' // --
-	case token.QUO:
-		b = next == '*' // /*
-	case token.LSS:
-		b = next == '-' || next == '<' // <- or <<
-	case token.AND:
-		b = next == '&' || next == '^' // && or &^
-	}
-	return
-}
-
-// print prints a list of "items" (roughly corresponding to syntactic
-// tokens, but also including whitespace and formatting information).
-// It is the only print function that should be called directly from
-// any of the AST printing functions in nodes.go.
-//
-// Whitespace is accumulated until a non-whitespace token appears. Any
-// comments that need to appear before that token are printed first,
-// taking into account the amount and structure of any pending white-
-// space for best comment placement. Then, any leftover whitespace is
-// printed, followed by the actual token.
-//
-func (p *printer) print(args ...interface{}) {
-	for _, arg := range args {
-		// information about the current arg
-		var data string
-		var isLit bool
-		var impliedSemi bool // value for p.impliedSemi after this arg
-
-		// record previous opening token, if any
-		switch p.lastTok {
-		case token.ILLEGAL:
-			// ignore (white space)
-		case token.LPAREN, token.LBRACK:
-			p.prevOpen = p.lastTok
-		default:
-			// other tokens followed any opening token
-			p.prevOpen = token.ILLEGAL
-		}
-
-		switch x := arg.(type) {
-		case pmode:
-			// toggle printer mode
-			p.mode ^= x
-			continue
-
-		case whiteSpace:
-			if x == ignore {
-				// don't add ignore's to the buffer; they
-				// may screw up "correcting" unindents (see
-				// LabeledStmt)
-				continue
-			}
-			i := len(p.wsbuf)
-			if i == cap(p.wsbuf) {
-				// Whitespace sequences are very short so this should
-				// never happen. Handle gracefully (but possibly with
-				// bad comment placement) if it does happen.
-				p.writeWhitespace(i)
-				i = 0
-			}
-			p.wsbuf = p.wsbuf[0 : i+1]
-			p.wsbuf[i] = x
-			if x == newline || x == formfeed {
-				// newlines affect the current state (p.impliedSemi)
-				// and not the state after printing arg (impliedSemi)
-				// because comments can be interspersed before the arg
-				// in this case
-				p.impliedSemi = false
-			}
-			p.lastTok = token.ILLEGAL
-			continue
-
-		case *ast.Ident:
-			data = x.Name
-			impliedSemi = true
-			p.lastTok = token.IDENT
-
-		case *ast.BasicLit:
-			data = x.Value
-			isLit = true
-			impliedSemi = true
-			p.lastTok = x.Kind
-
-		case token.Token:
-			s := x.String()
-			if mayCombine(p.lastTok, s[0]) {
-				// the previous and the current token must be
-				// separated by a blank otherwise they combine
-				// into a different incorrect token sequence
-				// (except for token.INT followed by a '.' this
-				// should never happen because it is taken care
-				// of via binary expression formatting)
-				if len(p.wsbuf) != 0 {
-					p.internalError("whitespace buffer not empty")
-				}
-				p.wsbuf = p.wsbuf[0:1]
-				p.wsbuf[0] = ' '
-			}
-			data = s
-			// some keywords followed by a newline imply a semicolon
-			switch x {
-			case token.BREAK, token.CONTINUE, token.FALLTHROUGH, token.RETURN,
-				token.INC, token.DEC, token.RPAREN, token.RBRACK, token.RBRACE:
-				impliedSemi = true
-			}
-			p.lastTok = x
-
-		case token.Pos:
-			if x.IsValid() {
-				p.pos = p.posFor(x) // accurate position of next item
-			}
-			continue
-
-		case string:
-			// incorrect AST - print error message
-			data = x
-			isLit = true
-			impliedSemi = true
-			p.lastTok = token.STRING
-
-		default:
-			fmt.Fprintf(os.Stderr, "print: unsupported argument %v (%T)\n", arg, arg)
-			panic("go/printer type")
-		}
-		// data != ""
-
-		next := p.pos // estimated/accurate position of next item
-		wroteNewline, droppedFF := p.flush(next, p.lastTok)
-
-		// intersperse extra newlines if present in the source and
-		// if they don't cause extra semicolons (don't do this in
-		// flush as it will cause extra newlines at the end of a file)
-		if !p.impliedSemi {
-			n := nlimit(next.Line - p.pos.Line)
-			// don't exceed maxNewlines if we already wrote one
-			if wroteNewline && n == maxNewlines {
-				n = maxNewlines - 1
-			}
-			if n > 0 {
-				ch := byte('\n')
-				if droppedFF {
-					ch = '\f' // use formfeed since we dropped one before
-				}
-				p.writeByte(ch, n)
-				impliedSemi = false
-			}
-		}
-
-		// the next token starts now - record its line number if requested
-		if p.linePtr != nil {
-			*p.linePtr = p.out.Line
-			p.linePtr = nil
-		}
-
-		p.writeString(next, data, isLit)
-		p.impliedSemi = impliedSemi
-	}
-}
-
-// flush prints any pending comments and whitespace occurring textually
-// before the position of the next token tok. The flush result indicates
-// if a newline was written or if a formfeed was dropped from the whitespace
-// buffer.
-//
-func (p *printer) flush(next token.Position, tok token.Token) (wroteNewline, droppedFF bool) {
-	if p.commentBefore(next) {
-		// if there are comments before the next item, intersperse them
-		wroteNewline, droppedFF = p.intersperseComments(next, tok)
-	} else {
-		// otherwise, write any leftover whitespace
-		p.writeWhitespace(len(p.wsbuf))
-	}
-	return
-}
-
-// getNode returns the ast.CommentGroup associated with n, if any.
-func getDoc(n ast.Node) *ast.CommentGroup {
-	switch n := n.(type) {
-	case *ast.Field:
-		return n.Doc
-	case *ast.ImportSpec:
-		return n.Doc
-	case *ast.ValueSpec:
-		return n.Doc
-	case *ast.TypeSpec:
-		return n.Doc
-	case *ast.GenDecl:
-		return n.Doc
-	case *ast.FuncDecl:
-		return n.Doc
-	case *ast.File:
-		return n.Doc
-	}
-	return nil
-}
-
-func (p *printer) printNode(node interface{}) error {
-	// unpack *CommentedNode, if any
-	var comments []*ast.CommentGroup
-	if cnode, ok := node.(*CommentedNode); ok {
-		node = cnode.Node
-		comments = cnode.Comments
-	}
-
-	if comments != nil {
-		// commented node - restrict comment list to relevant range
-		n, ok := node.(ast.Node)
-		if !ok {
-			goto unsupported
-		}
-		beg := n.Pos()
-		end := n.End()
-		// if the node has associated documentation,
-		// include that commentgroup in the range
-		// (the comment list is sorted in the order
-		// of the comment appearance in the source code)
-		if doc := getDoc(n); doc != nil {
-			beg = doc.Pos()
-		}
-		// token.Pos values are global offsets, we can
-		// compare them directly
-		i := 0
-		for i < len(comments) && comments[i].End() < beg {
-			i++
-		}
-		j := i
-		for j < len(comments) && comments[j].Pos() < end {
-			j++
-		}
-		if i < j {
-			p.comments = comments[i:j]
-		}
-	} else if n, ok := node.(*ast.File); ok {
-		// use ast.File comments, if any
-		p.comments = n.Comments
-	}
-
-	// if there are no comments, use node comments
-	p.useNodeComments = p.comments == nil
-
-	// get comments ready for use
-	p.nextComment()
-
-	// format node
-	switch n := node.(type) {
-	case ast.Expr:
-		p.expr(n)
-	case ast.Stmt:
-		// A labeled statement will un-indent to position the label.
-		// Set p.indent to 1 so we don't get indent "underflow".
-		if _, ok := n.(*ast.LabeledStmt); ok {
-			p.indent = 1
-		}
-		p.stmt(n, false)
-	case ast.Decl:
-		p.decl(n)
-	case ast.Spec:
-		p.spec(n, 1, false)
-	case []ast.Stmt:
-		// A labeled statement will un-indent to position the label.
-		// Set p.indent to 1 so we don't get indent "underflow".
-		for _, s := range n {
-			if _, ok := s.(*ast.LabeledStmt); ok {
-				p.indent = 1
-			}
-		}
-		p.stmtList(n, 0, false)
-	case []ast.Decl:
-		p.declList(n)
-	case *ast.File:
-		p.file(n)
-	default:
-		goto unsupported
-	}
-
-	return nil
-
-unsupported:
-	return fmt.Errorf("go/printer: unsupported node type %T", node)
-}
-
-// ----------------------------------------------------------------------------
-// Trimmer
-
-// A trimmer is an io.Writer filter for stripping tabwriter.Escape
-// characters, trailing blanks and tabs, and for converting formfeed
-// and vtab characters into newlines and htabs (in case no tabwriter
-// is used). Text bracketed by tabwriter.Escape characters is passed
-// through unchanged.
-//
-type trimmer struct {
-	output io.Writer
-	state  int
-	space  []byte
-}
-
-// trimmer is implemented as a state machine.
-// It can be in one of the following states:
-const (
-	inSpace  = iota // inside space
-	inEscape        // inside text bracketed by tabwriter.Escapes
-	inText          // inside text
-)
-
-func (p *trimmer) resetSpace() {
-	p.state = inSpace
-	p.space = p.space[0:0]
-}
-
-// Design note: It is tempting to eliminate extra blanks occurring in
-//              whitespace in this function as it could simplify some
-//              of the blanks logic in the node printing functions.
-//              However, this would mess up any formatting done by
-//              the tabwriter.
-
-var aNewline = []byte("\n")
-
-func (p *trimmer) Write(data []byte) (n int, err error) {
-	// invariants:
-	// p.state == inSpace:
-	//	p.space is unwritten
-	// p.state == inEscape, inText:
-	//	data[m:n] is unwritten
-	m := 0
-	var b byte
-	for n, b = range data {
-		if b == '\v' {
-			b = '\t' // convert to htab
-		}
-		switch p.state {
-		case inSpace:
-			switch b {
-			case '\t', ' ':
-				p.space = append(p.space, b)
-			case '\n', '\f':
-				p.resetSpace() // discard trailing space
-				_, err = p.output.Write(aNewline)
-			case tabwriter.Escape:
-				_, err = p.output.Write(p.space)
-				p.state = inEscape
-				m = n + 1 // +1: skip tabwriter.Escape
-			default:
-				_, err = p.output.Write(p.space)
-				p.state = inText
-				m = n
-			}
-		case inEscape:
-			if b == tabwriter.Escape {
-				_, err = p.output.Write(data[m:n])
-				p.resetSpace()
-			}
-		case inText:
-			switch b {
-			case '\t', ' ':
-				_, err = p.output.Write(data[m:n])
-				p.resetSpace()
-				p.space = append(p.space, b)
-			case '\n', '\f':
-				_, err = p.output.Write(data[m:n])
-				p.resetSpace()
-				_, err = p.output.Write(aNewline)
-			case tabwriter.Escape:
-				_, err = p.output.Write(data[m:n])
-				p.state = inEscape
-				m = n + 1 // +1: skip tabwriter.Escape
-			}
-		default:
-			panic("unreachable")
-		}
-		if err != nil {
-			return
-		}
-	}
-	n = len(data)
-
-	switch p.state {
-	case inEscape, inText:
-		_, err = p.output.Write(data[m:n])
-		p.resetSpace()
-	}
-
-	return
-}
-
-// ----------------------------------------------------------------------------
-// Public interface
-
-// A Mode value is a set of flags (or 0). They control printing.
-type Mode uint
-
-const (
-	RawFormat Mode = 1 << iota // do not use a tabwriter; if set, UseSpaces is ignored
-	TabIndent                  // use tabs for indentation independent of UseSpaces
-	UseSpaces                  // use spaces instead of tabs for alignment
-	SourcePos                  // emit //line comments to preserve original source positions
-)
-
-// A Config node controls the output of Fprint.
-type Config struct {
-	Mode     Mode // default: 0
-	Tabwidth int  // default: 8
-	Indent   int  // default: 0 (all code is indented at least by this much)
-}
-
-// fprint implements Fprint and takes a nodesSizes map for setting up the printer state.
-func (cfg *Config) fprint(output io.Writer, fset *token.FileSet, node interface{}, nodeSizes map[ast.Node]int) (err error) {
-	// print node
-	var p printer
-	p.init(cfg, fset, nodeSizes)
-	if err = p.printNode(node); err != nil {
-		return
-	}
-	// print outstanding comments
-	p.impliedSemi = false // EOF acts like a newline
-	p.flush(token.Position{Offset: infinity, Line: infinity}, token.EOF)
-
-	// redirect output through a trimmer to eliminate trailing whitespace
-	// (Input to a tabwriter must be untrimmed since trailing tabs provide
-	// formatting information. The tabwriter could provide trimming
-	// functionality but no tabwriter is used when RawFormat is set.)
-	output = &trimmer{output: output}
-
-	// redirect output through a tabwriter if necessary
-	if cfg.Mode&RawFormat == 0 {
-		minwidth := cfg.Tabwidth
-
-		padchar := byte('\t')
-		if cfg.Mode&UseSpaces != 0 {
-			padchar = ' '
-		}
-
-		twmode := tabwriter.DiscardEmptyColumns
-		if cfg.Mode&TabIndent != 0 {
-			minwidth = 0
-			twmode |= tabwriter.TabIndent
-		}
-
-		output = tabwriter.NewWriter(output, minwidth, cfg.Tabwidth, 1, padchar, twmode)
-	}
-
-	// write printer result via tabwriter/trimmer to output
-	if _, err = output.Write(p.output); err != nil {
-		return
-	}
-
-	// flush tabwriter, if any
-	if tw, _ := output.(*tabwriter.Writer); tw != nil {
-		err = tw.Flush()
-	}
-
-	return
-}
-
-// A CommentedNode bundles an AST node and corresponding comments.
-// It may be provided as argument to any of the Fprint functions.
-//
-type CommentedNode struct {
-	Node     interface{} // *ast.File, or ast.Expr, ast.Decl, ast.Spec, or ast.Stmt
-	Comments []*ast.CommentGroup
-}
-
-// Fprint "pretty-prints" an AST node to output for a given configuration cfg.
-// Position information is interpreted relative to the file set fset.
-// The node type must be *ast.File, *CommentedNode, []ast.Decl, []ast.Stmt,
-// or assignment-compatible to ast.Expr, ast.Decl, ast.Spec, or ast.Stmt.
-//
-func (cfg *Config) Fprint(output io.Writer, fset *token.FileSet, node interface{}) error {
-	return cfg.fprint(output, fset, node, make(map[ast.Node]int))
-}
-
-// Fprint "pretty-prints" an AST node to output.
-// It calls Config.Fprint with default settings.
-//
-func Fprint(output io.Writer, fset *token.FileSet, node interface{}) error {
-	return (&Config{Tabwidth: 8}).Fprint(output, fset, node)
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/printer_test.go b/third_party/gofrontend/libgo/go/go/printer/printer_test.go
deleted file mode 100644
index 3b0570e..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/printer_test.go
+++ /dev/null
@@ -1,562 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package printer
-
-import (
-	"bytes"
-	"errors"
-	"flag"
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"io/ioutil"
-	"path/filepath"
-	"testing"
-	"time"
-)
-
-const (
-	dataDir  = "testdata"
-	tabwidth = 8
-)
-
-var update = flag.Bool("update", false, "update golden files")
-
-var fset = token.NewFileSet()
-
-type checkMode uint
-
-const (
-	export checkMode = 1 << iota
-	rawFormat
-	idempotent
-)
-
-// format parses src, prints the corresponding AST, verifies the resulting
-// src is syntactically correct, and returns the resulting src or an error
-// if any.
-func format(src []byte, mode checkMode) ([]byte, error) {
-	// parse src
-	f, err := parser.ParseFile(fset, "", src, parser.ParseComments)
-	if err != nil {
-		return nil, fmt.Errorf("parse: %s\n%s", err, src)
-	}
-
-	// filter exports if necessary
-	if mode&export != 0 {
-		ast.FileExports(f) // ignore result
-		f.Comments = nil   // don't print comments that are not in AST
-	}
-
-	// determine printer configuration
-	cfg := Config{Tabwidth: tabwidth}
-	if mode&rawFormat != 0 {
-		cfg.Mode |= RawFormat
-	}
-
-	// print AST
-	var buf bytes.Buffer
-	if err := cfg.Fprint(&buf, fset, f); err != nil {
-		return nil, fmt.Errorf("print: %s", err)
-	}
-
-	// make sure formatted output is syntactically correct
-	res := buf.Bytes()
-	if _, err := parser.ParseFile(fset, "", res, 0); err != nil {
-		return nil, fmt.Errorf("re-parse: %s\n%s", err, buf.Bytes())
-	}
-
-	return res, nil
-}
-
-// lineAt returns the line in text starting at offset offs.
-func lineAt(text []byte, offs int) []byte {
-	i := offs
-	for i < len(text) && text[i] != '\n' {
-		i++
-	}
-	return text[offs:i]
-}
-
-// diff compares a and b.
-func diff(aname, bname string, a, b []byte) error {
-	var buf bytes.Buffer // holding long error message
-
-	// compare lengths
-	if len(a) != len(b) {
-		fmt.Fprintf(&buf, "\nlength changed: len(%s) = %d, len(%s) = %d", aname, len(a), bname, len(b))
-	}
-
-	// compare contents
-	line := 1
-	offs := 1
-	for i := 0; i < len(a) && i < len(b); i++ {
-		ch := a[i]
-		if ch != b[i] {
-			fmt.Fprintf(&buf, "\n%s:%d:%d: %s", aname, line, i-offs+1, lineAt(a, offs))
-			fmt.Fprintf(&buf, "\n%s:%d:%d: %s", bname, line, i-offs+1, lineAt(b, offs))
-			fmt.Fprintf(&buf, "\n\n")
-			break
-		}
-		if ch == '\n' {
-			line++
-			offs = i + 1
-		}
-	}
-
-	if buf.Len() > 0 {
-		return errors.New(buf.String())
-	}
-	return nil
-}
-
-func runcheck(t *testing.T, source, golden string, mode checkMode) {
-	src, err := ioutil.ReadFile(source)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	res, err := format(src, mode)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	// update golden files if necessary
-	if *update {
-		if err := ioutil.WriteFile(golden, res, 0644); err != nil {
-			t.Error(err)
-		}
-		return
-	}
-
-	// get golden
-	gld, err := ioutil.ReadFile(golden)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	// formatted source and golden must be the same
-	if err := diff(source, golden, res, gld); err != nil {
-		t.Error(err)
-		return
-	}
-
-	if mode&idempotent != 0 {
-		// formatting golden must be idempotent
-		// (This is very difficult to achieve in general and for now
-		// it is only checked for files explicitly marked as such.)
-		res, err = format(gld, mode)
-		if err := diff(golden, fmt.Sprintf("format(%s)", golden), gld, res); err != nil {
-			t.Errorf("golden is not idempotent: %s", err)
-		}
-	}
-}
-
-func check(t *testing.T, source, golden string, mode checkMode) {
-	// run the test
-	cc := make(chan int)
-	go func() {
-		runcheck(t, source, golden, mode)
-		cc <- 0
-	}()
-
-	// wait with timeout
-	select {
-	case <-time.After(10 * time.Second): // plenty of a safety margin, even for very slow machines
-		// test running past time out
-		t.Errorf("%s: running too slowly", source)
-	case <-cc:
-		// test finished within allotted time margin
-	}
-}
-
-type entry struct {
-	source, golden string
-	mode           checkMode
-}
-
-// Use go test -update to create/update the respective golden files.
-var data = []entry{
-	{"empty.input", "empty.golden", idempotent},
-	{"comments.input", "comments.golden", 0},
-	{"comments.input", "comments.x", export},
-	{"comments2.input", "comments2.golden", idempotent},
-	{"linebreaks.input", "linebreaks.golden", idempotent},
-	{"expressions.input", "expressions.golden", idempotent},
-	{"expressions.input", "expressions.raw", rawFormat | idempotent},
-	{"declarations.input", "declarations.golden", 0},
-	{"statements.input", "statements.golden", 0},
-	{"slow.input", "slow.golden", idempotent},
-}
-
-func TestFiles(t *testing.T) {
-	for _, e := range data {
-		source := filepath.Join(dataDir, e.source)
-		golden := filepath.Join(dataDir, e.golden)
-		check(t, source, golden, e.mode)
-		// TODO(gri) check that golden is idempotent
-		//check(t, golden, golden, e.mode)
-	}
-}
-
-// TestLineComments, using a simple test case, checks that consecutive line
-// comments are properly terminated with a newline even if the AST position
-// information is incorrect.
-//
-func TestLineComments(t *testing.T) {
-	const src = `// comment 1
-	// comment 2
-	// comment 3
-	package main
-	`
-
-	fset := token.NewFileSet()
-	f, err := parser.ParseFile(fset, "", src, parser.ParseComments)
-	if err != nil {
-		panic(err) // error in test
-	}
-
-	var buf bytes.Buffer
-	fset = token.NewFileSet() // use the wrong file set
-	Fprint(&buf, fset, f)
-
-	nlines := 0
-	for _, ch := range buf.Bytes() {
-		if ch == '\n' {
-			nlines++
-		}
-	}
-
-	const expected = 3
-	if nlines < expected {
-		t.Errorf("got %d, expected %d\n", nlines, expected)
-		t.Errorf("result:\n%s", buf.Bytes())
-	}
-}
-
-// Verify that the printer can be invoked during initialization.
-func init() {
-	const name = "foobar"
-	var buf bytes.Buffer
-	if err := Fprint(&buf, fset, &ast.Ident{Name: name}); err != nil {
-		panic(err) // error in test
-	}
-	// in debug mode, the result contains additional information;
-	// ignore it
-	if s := buf.String(); !debug && s != name {
-		panic("got " + s + ", want " + name)
-	}
-}
-
-// Verify that the printer doesn't crash if the AST contains BadXXX nodes.
-func TestBadNodes(t *testing.T) {
-	const src = "package p\n("
-	const res = "package p\nBadDecl\n"
-	f, err := parser.ParseFile(fset, "", src, parser.ParseComments)
-	if err == nil {
-		t.Error("expected illegal program") // error in test
-	}
-	var buf bytes.Buffer
-	Fprint(&buf, fset, f)
-	if buf.String() != res {
-		t.Errorf("got %q, expected %q", buf.String(), res)
-	}
-}
-
-// testComment verifies that f can be parsed again after printing it
-// with its first comment set to comment at any possible source offset.
-func testComment(t *testing.T, f *ast.File, srclen int, comment *ast.Comment) {
-	f.Comments[0].List[0] = comment
-	var buf bytes.Buffer
-	for offs := 0; offs <= srclen; offs++ {
-		buf.Reset()
-		// Printing f should result in a correct program no
-		// matter what the (incorrect) comment position is.
-		if err := Fprint(&buf, fset, f); err != nil {
-			t.Error(err)
-		}
-		if _, err := parser.ParseFile(fset, "", buf.Bytes(), 0); err != nil {
-			t.Fatalf("incorrect program for pos = %d:\n%s", comment.Slash, buf.String())
-		}
-		// Position information is just an offset.
-		// Move comment one byte down in the source.
-		comment.Slash++
-	}
-}
-
-// Verify that the printer produces a correct program
-// even if the position information of comments introducing newlines
-// is incorrect.
-func TestBadComments(t *testing.T) {
-	const src = `
-// first comment - text and position changed by test
-package p
-import "fmt"
-const pi = 3.14 // rough circle
-var (
-	x, y, z int = 1, 2, 3
-	u, v float64
-)
-func fibo(n int) {
-	if n < 2 {
-		return n /* seed values */
-	}
-	return fibo(n-1) + fibo(n-2)
-}
-`
-
-	f, err := parser.ParseFile(fset, "", src, parser.ParseComments)
-	if err != nil {
-		t.Error(err) // error in test
-	}
-
-	comment := f.Comments[0].List[0]
-	pos := comment.Pos()
-	if fset.Position(pos).Offset != 1 {
-		t.Error("expected offset 1") // error in test
-	}
-
-	testComment(t, f, len(src), &ast.Comment{Slash: pos, Text: "//-style comment"})
-	testComment(t, f, len(src), &ast.Comment{Slash: pos, Text: "/*-style comment */"})
-	testComment(t, f, len(src), &ast.Comment{Slash: pos, Text: "/*-style \n comment */"})
-	testComment(t, f, len(src), &ast.Comment{Slash: pos, Text: "/*-style comment \n\n\n */"})
-}
-
-type visitor chan *ast.Ident
-
-func (v visitor) Visit(n ast.Node) (w ast.Visitor) {
-	if ident, ok := n.(*ast.Ident); ok {
-		v <- ident
-	}
-	return v
-}
-
-// idents is an iterator that returns all idents in f via the result channel.
-func idents(f *ast.File) <-chan *ast.Ident {
-	v := make(visitor)
-	go func() {
-		ast.Walk(v, f)
-		close(v)
-	}()
-	return v
-}
-
-// identCount returns the number of identifiers found in f.
-func identCount(f *ast.File) int {
-	n := 0
-	for range idents(f) {
-		n++
-	}
-	return n
-}
-
-// Verify that the SourcePos mode emits correct //line comments
-// by testing that position information for matching identifiers
-// is maintained.
-func TestSourcePos(t *testing.T) {
-	const src = `
-package p
-import ( "go/printer"; "math" )
-const pi = 3.14; var x = 0
-type t struct{ x, y, z int; u, v, w float32 }
-func (t *t) foo(a, b, c int) int {
-	return a*t.x + b*t.y +
-		// two extra lines here
-		// ...
-		c*t.z
-}
-`
-
-	// parse original
-	f1, err := parser.ParseFile(fset, "src", src, parser.ParseComments)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// pretty-print original
-	var buf bytes.Buffer
-	err = (&Config{Mode: UseSpaces | SourcePos, Tabwidth: 8}).Fprint(&buf, fset, f1)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// parse pretty printed original
-	// (//line comments must be interpreted even w/o parser.ParseComments set)
-	f2, err := parser.ParseFile(fset, "", buf.Bytes(), 0)
-	if err != nil {
-		t.Fatalf("%s\n%s", err, buf.Bytes())
-	}
-
-	// At this point the position information of identifiers in f2 should
-	// match the position information of corresponding identifiers in f1.
-
-	// number of identifiers must be > 0 (test should run) and must match
-	n1 := identCount(f1)
-	n2 := identCount(f2)
-	if n1 == 0 {
-		t.Fatal("got no idents")
-	}
-	if n2 != n1 {
-		t.Errorf("got %d idents; want %d", n2, n1)
-	}
-
-	// verify that all identifiers have correct line information
-	i2range := idents(f2)
-	for i1 := range idents(f1) {
-		i2 := <-i2range
-
-		if i2.Name != i1.Name {
-			t.Errorf("got ident %s; want %s", i2.Name, i1.Name)
-		}
-
-		l1 := fset.Position(i1.Pos()).Line
-		l2 := fset.Position(i2.Pos()).Line
-		if l2 != l1 {
-			t.Errorf("got line %d; want %d for %s", l2, l1, i1.Name)
-		}
-	}
-
-	if t.Failed() {
-		t.Logf("\n%s", buf.Bytes())
-	}
-}
-
-var decls = []string{
-	`import "fmt"`,
-	"const pi = 3.1415\nconst e = 2.71828\n\nvar x = pi",
-	"func sum(x, y int) int\t{ return x + y }",
-}
-
-func TestDeclLists(t *testing.T) {
-	for _, src := range decls {
-		file, err := parser.ParseFile(fset, "", "package p;"+src, parser.ParseComments)
-		if err != nil {
-			panic(err) // error in test
-		}
-
-		var buf bytes.Buffer
-		err = Fprint(&buf, fset, file.Decls) // only print declarations
-		if err != nil {
-			panic(err) // error in test
-		}
-
-		out := buf.String()
-		if out != src {
-			t.Errorf("\ngot : %q\nwant: %q\n", out, src)
-		}
-	}
-}
-
-var stmts = []string{
-	"i := 0",
-	"select {}\nvar a, b = 1, 2\nreturn a + b",
-	"go f()\ndefer func() {}()",
-}
-
-func TestStmtLists(t *testing.T) {
-	for _, src := range stmts {
-		file, err := parser.ParseFile(fset, "", "package p; func _() {"+src+"}", parser.ParseComments)
-		if err != nil {
-			panic(err) // error in test
-		}
-
-		var buf bytes.Buffer
-		err = Fprint(&buf, fset, file.Decls[0].(*ast.FuncDecl).Body.List) // only print statements
-		if err != nil {
-			panic(err) // error in test
-		}
-
-		out := buf.String()
-		if out != src {
-			t.Errorf("\ngot : %q\nwant: %q\n", out, src)
-		}
-	}
-}
-
-func TestBaseIndent(t *testing.T) {
-	// The testfile must not contain multi-line raw strings since those
-	// are not indented (because their values must not change) and make
-	// this test fail.
-	const filename = "printer.go"
-	src, err := ioutil.ReadFile(filename)
-	if err != nil {
-		panic(err) // error in test
-	}
-
-	file, err := parser.ParseFile(fset, filename, src, 0)
-	if err != nil {
-		panic(err) // error in test
-	}
-
-	var buf bytes.Buffer
-	for indent := 0; indent < 4; indent++ {
-		buf.Reset()
-		(&Config{Tabwidth: tabwidth, Indent: indent}).Fprint(&buf, fset, file)
-		// all code must be indented by at least 'indent' tabs
-		lines := bytes.Split(buf.Bytes(), []byte{'\n'})
-		for i, line := range lines {
-			if len(line) == 0 {
-				continue // empty lines don't have indentation
-			}
-			n := 0
-			for j, b := range line {
-				if b != '\t' {
-					// end of indentation
-					n = j
-					break
-				}
-			}
-			if n < indent {
-				t.Errorf("line %d: got only %d tabs; want at least %d: %q", i, n, indent, line)
-			}
-		}
-	}
-}
-
-// TestFuncType tests that an ast.FuncType with a nil Params field
-// can be printed (per go/ast specification). Test case for issue 3870.
-func TestFuncType(t *testing.T) {
-	src := &ast.File{
-		Name: &ast.Ident{Name: "p"},
-		Decls: []ast.Decl{
-			&ast.FuncDecl{
-				Name: &ast.Ident{Name: "f"},
-				Type: &ast.FuncType{},
-			},
-		},
-	}
-
-	var buf bytes.Buffer
-	if err := Fprint(&buf, fset, src); err != nil {
-		t.Fatal(err)
-	}
-	got := buf.String()
-
-	const want = `package p
-
-func f()
-`
-
-	if got != want {
-		t.Fatalf("got:\n%s\nwant:\n%s\n", got, want)
-	}
-}
-
-// TextX is a skeleton test that can be filled in for debugging one-off cases.
-// Do not remove.
-func TestX(t *testing.T) {
-	const src = `
-package p
-func _() {}
-`
-	_, err := format([]byte(src), 0)
-	if err != nil {
-		t.Error(err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/comments.golden b/third_party/gofrontend/libgo/go/go/printer/testdata/comments.golden
deleted file mode 100644
index 849fa62..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/comments.golden
+++ /dev/null
@@ -1,705 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This is a package for testing comment placement by go/printer.
-//
-package main
-
-import "fmt"	// fmt
-
-const c0 = 0	// zero
-const (
-	c1	= iota	// c1
-	c2		// c2
-)
-
-// Alignment of comments in declarations>
-const (
-	_	T	= iota	// comment
-	_			// comment
-	_			// comment
-	_	= iota + 10
-	_	// comments
-
-	_		= 10	// comment
-	_	T	= 20	// comment
-)
-
-const (
-	_____	= iota	// foo
-	_		// bar
-	_	= 0	// bal
-	_		// bat
-)
-
-const (
-	_	T	= iota	// comment
-	_			// comment
-	_			// comment
-	_	= iota + 10
-	_		// comment
-	_		= 10
-	_		= 20	// comment
-	_	T	= 0	// comment
-)
-
-// The SZ struct; it is empty.
-type SZ struct{}
-
-// The S0 struct; no field is exported.
-type S0 struct {
-	int
-	x, y, z	int	// 3 unexported fields
-}
-
-// The S1 struct; some fields are not exported.
-type S1 struct {
-	S0
-	A, B, C	float	// 3 exported fields
-	D, b, c	int	// 2 unexported fields
-}
-
-// The S2 struct; all fields are exported.
-type S2 struct {
-	S1
-	A, B, C	float	// 3 exported fields
-}
-
-// The IZ interface; it is empty.
-type SZ interface{}
-
-// The I0 interface; no method is exported.
-type I0 interface {
-	f(x int) int	// unexported method
-}
-
-// The I1 interface; some methods are not exported.
-type I1 interface {
-	I0
-	F(x float) float	// exported methods
-	g(x int) int		// unexported method
-}
-
-// The I2 interface; all methods are exported.
-type I2 interface {
-	I0
-	F(x float) float	// exported method
-	G(x float) float	// exported method
-}
-
-// The S3 struct; all comments except for the last one must appear in the export.
-type S3 struct {
-	// lead comment for F1
-	F1	int	// line comment for F1
-	// lead comment for F2
-	F2	int	// line comment for F2
-	f3	int	// f3 is not exported
-}
-
-// This comment group should be separated
-// with a newline from the next comment
-// group.
-
-// This comment should NOT be associated with the next declaration.
-
-var x int	// x
-var ()
-
-// This comment SHOULD be associated with f0.
-func f0() {
-	const pi = 3.14	// pi
-	var s1 struct{}	/* an empty struct */	/* foo */
-	// a struct constructor
-	// --------------------
-	var s2 struct{} = struct{}{}
-	x := pi
-}
-
-//
-// This comment should be associated with f1, with one blank line before the comment.
-//
-func f1() {
-	f0()
-	/* 1 */
-	// 2
-	/* 3 */
-	/* 4 */
-	f0()
-}
-
-func _() {
-	// this comment should be properly indented
-}
-
-func _(x int) int {
-	if x < 0 {	// the tab printed before this comment's // must not affect the remaining lines
-		return -x	// this statement should be properly indented
-	}
-	if x < 0 {	/* the tab printed before this comment's /* must not affect the remaining lines */
-		return -x	// this statement should be properly indented
-	}
-	return x
-}
-
-func typeswitch(x interface{}) {
-	switch v := x.(type) {
-	case bool, int, float:
-	case string:
-	default:
-	}
-
-	switch x.(type) {
-	}
-
-	switch v0, ok := x.(int); v := x.(type) {
-	}
-
-	switch v0, ok := x.(int); x.(type) {
-	case byte:	// this comment should be on the same line as the keyword
-		// this comment should be normally indented
-		_ = 0
-	case bool, int, float:
-		// this comment should be indented
-	case string:
-	default:
-		// this comment should be indented
-	}
-	// this comment should not be indented
-}
-
-//
-// Indentation of comments after possibly indented multi-line constructs
-// (test cases for issue 3147).
-//
-
-func _() {
-	s := 1 +
-		2
-	// should be indented like s
-}
-
-func _() {
-	s := 1 +
-		2	// comment
-	// should be indented like s
-}
-
-func _() {
-	s := 1 +
-		2	// comment
-	// should be indented like s
-	_ = 0
-}
-
-func _() {
-	s := 1 +
-		2
-	// should be indented like s
-	_ = 0
-}
-
-func _() {
-	s := 1 +
-		2
-
-	// should be indented like s
-}
-
-func _() {
-	s := 1 +
-		2	// comment
-
-	// should be indented like s
-}
-
-func _() {
-	s := 1 +
-		2	// comment
-
-	// should be indented like s
-	_ = 0
-}
-
-func _() {
-	s := 1 +
-		2
-
-	// should be indented like s
-	_ = 0
-}
-
-// Test case from issue 3147.
-func f() {
-	templateText := "a" +	// A
-		"b" +	// B
-		"c"	// C
-
-	// should be aligned with f()
-	f()
-}
-
-// Modified test case from issue 3147.
-func f() {
-	templateText := "a" +	// A
-		"b" +	// B
-		"c"	// C
-
-		// may not be aligned with f() (source is not aligned)
-	f()
-}
-
-//
-// Test cases for alignment of lines in general comments.
-//
-
-func _() {
-	/* freestanding comment
-	   aligned		line
-	   aligned line
-	*/
-}
-
-func _() {
-	/* freestanding comment
-	   aligned		line
-	   aligned line
-	*/
-}
-
-func _() {
-	/* freestanding comment
-	   aligned		line
-	   aligned line */
-}
-
-func _() {
-	/*	freestanding comment
-		aligned		line
-		aligned line
-	*/
-}
-
-func _() {
-	/*	freestanding comment
-		aligned		line
-		aligned line
-	*/
-}
-
-func _() {
-	/*	freestanding comment
-		aligned		line
-		aligned line */
-}
-
-func _() {
-	/*
-	   freestanding comment
-	   aligned		line
-	   aligned line
-	*/
-}
-
-func _() {
-	/*
-	   freestanding comment
-	   aligned		line
-	   aligned line
-	*/
-}
-
-func _() {
-	/*
-	   freestanding comment
-	   aligned		line
-	   aligned line */
-}
-
-func _() {
-	/*
-		freestanding comment
-		aligned		line
-		aligned line
-	*/
-}
-
-func _() {
-	/*
-		freestanding comment
-		aligned		line
-		aligned line
-	*/
-}
-
-func _() {
-	/*
-		freestanding comment
-		aligned		line
-		aligned line */
-}
-
-func _() {
-	/* freestanding comment
-	   aligned line
-	*/
-}
-
-func _() {
-	/* freestanding comment
-	   aligned line
-	*/
-}
-
-func _() {
-	/* freestanding comment
-	   aligned line */
-}
-
-func _() {
-	/*	freestanding comment
-		aligned line
-	*/
-}
-
-func _() {
-	/*	freestanding comment
-		aligned line
-	*/
-}
-
-func _() {
-	/*	freestanding comment
-		aligned line */
-}
-
-func _() {
-	/*
-	   freestanding comment
-	   aligned line
-	*/
-}
-
-func _() {
-	/*
-	   freestanding comment
-	   aligned line
-	*/
-}
-
-func _() {
-	/*
-	   freestanding comment
-	   aligned line */
-}
-
-func _() {
-	/*
-		freestanding comment
-		aligned line
-	*/
-}
-
-func _() {
-	/*
-		freestanding comment
-		aligned line
-	*/
-}
-
-func _() {
-	/*
-		freestanding comment
-		aligned line */
-}
-
-// Issue 9751.
-func _() {
-	/*a string
-
-	b string*/
-
-	/*A string
-
-
-
-	Z string*/
-
-	/*a string
-
-	b string
-
-	c string*/
-
-	{
-		/*a string
-		b string*/
-
-		/*a string
-
-		b string*/
-
-		/*a string
-
-		b string
-
-		c string*/
-	}
-
-	{
-		/*a string
-		b string*/
-
-		/*a string
-
-		b string*/
-
-		/*a string
-
-		b string
-
-		c string*/
-	}
-
-	/*
-	 */
-
-	/*
-
-	 */
-
-	/*
-
-	 * line
-
-	 */
-}
-
-/*
- * line
- * of
- * stars
- */
-
-/* another line
- * of
- * stars */
-
-/*	and another line
- *	of
- *	stars */
-
-/* a line of
- * stars */
-
-/*	and another line of
- *	stars */
-
-/* a line of stars
- */
-
-/*	and another line of
- */
-
-/* a line of stars
- */
-
-/*	and another line of
- */
-
-/*
-aligned in middle
-here
-        not here
-*/
-
-/*
-blank line in middle:
-
-with no leading spaces on blank line.
-*/
-
-/*
-   aligned in middle
-   here
-           not here
-*/
-
-/*
-	blank line in middle:
-
-	with no leading spaces on blank line.
-*/
-
-func _() {
-	/*
-	 * line
-	 * of
-	 * stars
-	 */
-
-	/*
-		aligned in middle
-		here
-			not here
-	*/
-
-	/*
-		blank line in middle:
-
-		with no leading spaces on blank line.
-	*/
-}
-
-// Some interesting interspersed comments.
-// See below for more common cases.
-func _( /* this */ x /* is */ /* an */ int) {
-}
-
-func _( /* no params - extra blank before and after comment */ )	{}
-func _(a, b int /* params - no extra blank after comment */)		{}
-
-func _()	{ f( /* no args - extra blank before and after comment */ ) }
-func _()	{ f(a, b /* args - no extra blank after comment */) }
-
-func _() {
-	f( /* no args - extra blank before and after comment */ )
-	f(a, b /* args - no extra blank after comment */)
-}
-
-func ( /* comment1 */ T /* comment2 */) _()	{}
-
-func _()	{ /* "short-ish one-line functions with comments are formatted as multi-line functions */ }
-func _()	{ x := 0; /* comment */ y = x /* comment */ }
-
-func _() {
-	_ = 0
-	/* closing curly brace should be on new line */
-}
-
-func _() {
-	_ = []int{0, 1 /* don't introduce a newline after this comment - was issue 1365 */}
-}
-
-// Test cases from issue 1542:
-// Comments must not be placed before commas and cause invalid programs.
-func _() {
-	var a = []int{1, 2	/*jasldf*/}
-	_ = a
-}
-
-func _() {
-	var a = []int{1, 2}/*jasldf
-	 */
-
-	_ = a
-}
-
-func _() {
-	var a = []int{1, 2}// jasldf
-
-	_ = a
-}
-
-// Comments immediately adjacent to punctuation followed by a newline
-// remain after the punctuation (looks better and permits alignment of
-// comments).
-func _() {
-	_ = T{
-		1,	// comment after comma
-		2,	/* comment after comma */
-		3,	// comment after comma
-	}
-	_ = T{
-		1,	// comment after comma
-		2,	/* comment after comma */
-		3,	// comment after comma
-	}
-	_ = T{
-		/* comment before literal */ 1,
-		2,	/* comment before comma - ok to move after comma */
-		3,	/* comment before comma - ok to move after comma */
-	}
-
-	for i = 0;	// comment after semicolon
-	i < 9;		/* comment after semicolon */
-	i++ {		// comment after opening curly brace
-	}
-
-	// TODO(gri) the last comment in this example should be aligned */
-	for i = 0;	// comment after semicolon
-	i < 9;		/* comment before semicolon - ok to move after semicolon */
-	i++ /* comment before opening curly brace */ {
-	}
-}
-
-// If there is no newline following punctuation, commas move before the punctuation.
-// This way, commas interspersed in lists stay with the respective expression.
-func f(x /* comment */, y int, z int /* comment */, u, v, w int /* comment */) {
-	f(x /* comment */, y)
-	f(x,	/* comment */
-		y)
-	f(
-		x,	/* comment */
-	)
-}
-
-func g(
-	x int,	/* comment */
-) {
-}
-
-type _ struct {
-	a, b /* comment */, c int
-}
-
-type _ struct {
-	a, b /* comment */, c int
-}
-
-func _() {
-	for a /* comment */, b := range x {
-	}
-}
-
-// Print line directives correctly.
-
-// The following is a legal line directive.
-//line foo:1
-func _() {
-	_ = 0
-	// The following is a legal line directive. It must not be indented:
-//line foo:2
-	_ = 1
-
-	// The following is not a legal line directive (it doesn't start in column 1):
-	//line foo:2
-	_ = 2
-
-	// The following is not a legal line directive (negative line number):
-	//line foo:-3
-	_ = 3
-}
-
-// Line comments with tabs
-func _() {
-	var finput *bufio.Reader	// input file
-	var stderr *bufio.Writer
-	var ftable *bufio.Writer	// y.go file
-	var foutput *bufio.Writer	// y.output file
-
-	var oflag string	// -o [y.go]		- y.go file
-	var vflag string	// -v [y.output]	- y.output file
-	var lflag bool		// -l			- disable line directives
-}
-
-// Trailing white space in comments should be trimmed
-func _() {
-	// This comment has 4 blanks following that should be trimmed:
-	/* Each line of this comment has blanks or tabs following that should be trimmed:
-	   line 2:
-	   line 3:
-	*/
-}
-
-/* This comment is the last entry in this file. It must be printed and should be followed by a newline */
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/comments.input b/third_party/gofrontend/libgo/go/go/printer/testdata/comments.input
deleted file mode 100644
index 30cd23c..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/comments.input
+++ /dev/null
@@ -1,710 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This is a package for testing comment placement by go/printer.
-//
-package main
-
-import "fmt"  // fmt
-
-const c0 = 0  // zero
-const (
-	c1 = iota  // c1
-	c2  // c2
-)
-
-// Alignment of comments in declarations>
-const (
-	_ T = iota  // comment
-	_  // comment
-	_  // comment
-	_ = iota+10
-	_  // comments
-
-	_ = 10  // comment
-	_ T = 20  // comment
-)
-
-const (
-	_____ = iota // foo
-	_ // bar
-	_  = 0    // bal
-	_ // bat
-)
-
-const (
-	_ T = iota // comment
-	_ // comment
-	_ // comment
-	_ = iota + 10
-	_ // comment
-	_ = 10
-	_ = 20 // comment
-	_ T = 0 // comment
-)
-
-// The SZ struct; it is empty.
-type SZ struct {}
-
-// The S0 struct; no field is exported.
-type S0 struct {
-	int
-	x, y, z int  // 3 unexported fields
-}
-
-// The S1 struct; some fields are not exported.
-type S1 struct {
-	S0
-	A, B, C float  // 3 exported fields
-	D, b, c int  // 2 unexported fields
-}
-
-// The S2 struct; all fields are exported.
-type S2 struct {
-	S1
-	A, B, C float  // 3 exported fields
-}
-
-// The IZ interface; it is empty.
-type SZ interface {}
-
-// The I0 interface; no method is exported.
-type I0 interface {
-	f(x int) int  // unexported method
-}
-
-// The I1 interface; some methods are not exported.
-type I1 interface {
-	I0
-	F(x float) float  // exported methods
-	g(x int) int  // unexported method
-}
-
-// The I2 interface; all methods are exported.
-type I2 interface {
-	I0
-	F(x float) float  // exported method
-	G(x float) float  // exported method
-}
-
-// The S3 struct; all comments except for the last one must appear in the export.
-type S3 struct {
-	// lead comment for F1
-	F1 int // line comment for F1
-	// lead comment for F2
-	F2 int // line comment for F2
-	f3 int // f3 is not exported
-}
-
-// This comment group should be separated
-// with a newline from the next comment
-// group.
-
-// This comment should NOT be associated with the next declaration.
-
-var x int  // x
-var ()
-
-
-// This comment SHOULD be associated with f0.
-func f0() {
-	const pi = 3.14  // pi
-	var s1 struct {}  /* an empty struct */ /* foo */
-	// a struct constructor
-	// --------------------
-	var s2 struct {} = struct {}{}
-	x := pi
-}
-//
-// This comment should be associated with f1, with one blank line before the comment.
-//
-func f1() {
-	f0()
-	/* 1 */
-	// 2
-	/* 3 */
-	/* 4 */
-	f0()
-}
-
-
-func _() {
-// this comment should be properly indented
-}
-
-
-func _(x int) int {
-	if x < 0 {  // the tab printed before this comment's // must not affect the remaining lines
-		return -x  // this statement should be properly indented
-	}
-	if x < 0 {  /* the tab printed before this comment's /* must not affect the remaining lines */
-		return -x  // this statement should be properly indented
-	}
-	return x
-}
-
-
-func typeswitch(x interface{}) {
-	switch v := x.(type) {
-	case bool, int, float:
-	case string:
-	default:
-	}
-
-	switch x.(type) {
-	}
-
-	switch v0, ok := x.(int); v := x.(type) {
-	}
-
-	switch v0, ok := x.(int); x.(type) {
-	case byte:  // this comment should be on the same line as the keyword
-		// this comment should be normally indented
-		_ = 0
-	case bool, int, float:
-		// this comment should be indented
-	case string:
-	default:
-		// this comment should be indented
-	}
-	// this comment should not be indented
-}
-
-//
-// Indentation of comments after possibly indented multi-line constructs
-// (test cases for issue 3147).
-//
-
-func _() {
-	s := 1 +
-		2
-// should be indented like s
-}
-
-func _() {
-	s := 1 +
-		2 // comment
-		// should be indented like s
-}
-
-func _() {
-	s := 1 +
-		2 // comment
-	// should be indented like s
-	_ = 0
-}
-
-func _() {
-	s := 1 +
-		2
-	// should be indented like s
-	_ = 0
-}
-
-func _() {
-	s := 1 +
-		2
-
-// should be indented like s
-}
-
-func _() {
-	s := 1 +
-		2 // comment
-
-		// should be indented like s
-}
-
-func _() {
-	s := 1 +
-		2 // comment
-
-	// should be indented like s
-	_ = 0
-}
-
-func _() {
-	s := 1 +
-		2
-
-	// should be indented like s
-	_ = 0
-}
-
-// Test case from issue 3147.
-func f() {
-	templateText := "a" + // A
-		"b" + // B
-		"c" // C
-
-	// should be aligned with f()
-	f()
-}
-
-// Modified test case from issue 3147.
-func f() {
-	templateText := "a" + // A
-		"b" + // B
-		"c" // C
-
-		// may not be aligned with f() (source is not aligned)
-	f()
-}
-
-//
-// Test cases for alignment of lines in general comments.
-//
-
-func _() {
-	/* freestanding comment
-	   aligned		line
-	   aligned line
-	*/
-}
-
-func _() {
-	/* freestanding comment
-	   aligned		line
-	   aligned line
-	   */
-}
-
-func _() {
-	/* freestanding comment
-	   aligned		line
-	   aligned line */
-}
-
-func _() {
-	/*	freestanding comment
-		aligned		line
-		aligned line
-	*/
-}
-
-func _() {
-	/*	freestanding comment
-		aligned		line
-		aligned line
-		*/
-}
-
-func _() {
-	/*	freestanding comment
-		aligned		line
-		aligned line */
-}
-
-
-func _() {
-	/*
-	   freestanding comment
-	   aligned		line
-	   aligned line
-	*/
-}
-
-func _() {
-	/*
-	   freestanding comment
-	   aligned		line
-	   aligned line
-	   */
-}
-
-func _() {
-	/*
-	   freestanding comment
-	   aligned		line
-	   aligned line */
-}
-
-func _() {
-	/*
-		freestanding comment
-		aligned		line
-		aligned line
-	*/
-}
-
-func _() {
-	/*
-		freestanding comment
-		aligned		line
-		aligned line
-		*/
-}
-
-func _() {
-	/*
-		freestanding comment
-		aligned		line
-		aligned line */
-}
-
-func _() {
-	/* freestanding comment
-	   aligned line
-	*/
-}
-
-func _() {
-	/* freestanding comment
-	   aligned line
-	   */
-}
-
-func _() {
-	/* freestanding comment
-	   aligned line */
-}
-
-func _() {
-	/*	freestanding comment
-		aligned line
-	*/
-}
-
-func _() {
-	/*	freestanding comment
-		aligned line
-		*/
-}
-
-func _() {
-	/*	freestanding comment
-		aligned line */
-}
-
-
-func _() {
-	/*
-	   freestanding comment
-	   aligned line
-	*/
-}
-
-func _() {
-	/*
-	   freestanding comment
-	   aligned line
-	   */
-}
-
-func _() {
-	/*
-	   freestanding comment
-	   aligned line */
-}
-
-func _() {
-	/*
-		freestanding comment
-		aligned line
-	*/
-}
-
-func _() {
-	/*
-		freestanding comment
-		aligned line
-		*/
-}
-
-func _() {
-	/*
-		freestanding comment
-		aligned line */
-}
-
-// Issue 9751.
-func _() {
-	/*a string
-
-	b string*/
-
-	/*A string
-
-
-
-	Z string*/
-
-	/*a string
-
-	b string
-
-	c string*/
-
-	{
-		/*a string
-b string*/
-
-		/*a string
-
-b string*/
-
-		/*a string
-
-b string
-
-c string*/
-	}
-
-	{
-		/*a string
-				b string*/
-
-		/*a string
-
-				b string*/
-
-		/*a string
-
-				b string
-
-				c string*/
-	}
-
-	/*
-	*/
-
-	/*
-
-	*/
-
-	/*
-
-	 * line
-
-	*/
-}
-
-/*
- * line
- * of
- * stars
- */
-
-/* another line
- * of
- * stars */
-
-/*	and another line
- *	of
- *	stars */
-
-/* a line of
- * stars */
-
-/*	and another line of
- *	stars */
-
-/* a line of stars
-*/
-
-/*	and another line of
-*/
-
-/* a line of stars
- */
-
-/*	and another line of
- */
-
-/*
-aligned in middle
-here
-        not here
-*/
-
-/*
-blank line in middle:
-
-with no leading spaces on blank line.
-*/
-
-/*
-   aligned in middle
-   here
-           not here
-*/
-
-/*
-	blank line in middle:
-
-	with no leading spaces on blank line.
-*/
-
-func _() {
-	/*
-	 * line
-	 * of
-	 * stars
-	 */
-
-	/*
-	aligned in middle
-	here
-		not here
-	*/
-
-	/*
-	blank line in middle:
-
-	with no leading spaces on blank line.
-*/
-}
-
-
-// Some interesting interspersed comments.
-// See below for more common cases.
-func _(/* this */x/* is *//* an */ int) {
-}
-
-func _(/* no params - extra blank before and after comment */) {}
-func _(a, b int /* params - no extra blank after comment */) {}
-
-func _() { f(/* no args - extra blank before and after comment */) }
-func _() { f(a, b /* args - no extra blank after comment */) }
-
-func _() {
-	f(/* no args - extra blank before and after comment */)
-	f(a, b /* args - no extra blank after comment */)
-}
-
-func (/* comment1 */ T /* comment2 */) _() {}
-
-func _() { /* "short-ish one-line functions with comments are formatted as multi-line functions */ }
-func _() { x := 0; /* comment */ y = x /* comment */ }
-
-func _() {
-	_ = 0
-	/* closing curly brace should be on new line */ }
-
-func _() {
-	_ = []int{0, 1 /* don't introduce a newline after this comment - was issue 1365 */}
-}
-
-// Test cases from issue 1542:
-// Comments must not be placed before commas and cause invalid programs.
-func _() {
-	var a = []int{1, 2, /*jasldf*/
-	}
-	_ = a
-}
-
-func _() {
-	var a = []int{1, 2, /*jasldf
-						*/
-	}
-	_ = a
-}
-
-func _() {
-	var a = []int{1, 2, // jasldf
-	}
-	_ = a
-}
-
-// Comments immediately adjacent to punctuation followed by a newline
-// remain after the punctuation (looks better and permits alignment of
-// comments).
-func _() {
-	_ = T{
-		1,    // comment after comma
-		2,    /* comment after comma */
-		3  ,  // comment after comma
-	}
-	_ = T{
-		1  ,// comment after comma
-		2  ,/* comment after comma */
-		3,// comment after comma
-	}
-	_ = T{
-		/* comment before literal */1,
-		2/* comment before comma - ok to move after comma */,
-		3  /* comment before comma - ok to move after comma */  ,
-	}
-
-	for
-		i=0;// comment after semicolon
-		i<9;/* comment after semicolon */
-		i++{// comment after opening curly brace
-	}
-
-	// TODO(gri) the last comment in this example should be aligned */
-	for
-		i=0;// comment after semicolon
-		i<9/* comment before semicolon - ok to move after semicolon */;
-		i++ /* comment before opening curly brace */ {
-	}
-}
-
-// If there is no newline following punctuation, commas move before the punctuation.
-// This way, commas interspersed in lists stay with the respective expression.
-func f(x/* comment */, y int, z int /* comment */, u, v, w int /* comment */) {
-	f(x /* comment */, y)
-	f(x /* comment */, 
-	y)
-	f(
-		x /* comment */,
-	)
-}
-
-func g(
-	x int /* comment */,
-) {}
-
-type _ struct {
-	a, b /* comment */, c int
-}
-
-type _ struct { a, b /* comment */, c int }
-
-func _() {
-	for a /* comment */, b := range x {
-	}
-}
-
-// Print line directives correctly.
-
-// The following is a legal line directive.
-//line foo:1
-func _() {
-	_ = 0
-// The following is a legal line directive. It must not be indented:
-//line foo:2
-	_ = 1
-
-// The following is not a legal line directive (it doesn't start in column 1):
-	//line foo:2
-	_ = 2
-
-// The following is not a legal line directive (negative line number):
-//line foo:-3
-	_ = 3
-}
-
-// Line comments with tabs
-func _() {
-var	finput		*bufio.Reader			// input file
-var	stderr		*bufio.Writer
-var	ftable		*bufio.Writer			// y.go file
-var	foutput		*bufio.Writer			// y.output file
-
-var	oflag		string				// -o [y.go]		- y.go file
-var	vflag		string				// -v [y.output]	- y.output file
-var	lflag		bool				// -l			- disable line directives
-}
-
-// Trailing white space in comments should be trimmed
-func _() {
-// This comment has 4 blanks following that should be trimmed:    
-/* Each line of this comment has blanks or tabs following that should be trimmed:	
-   line 2:    
-   line 3:    			
-*/
-}
-
-/* This comment is the last entry in this file. It must be printed and should be followed by a newline */
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/comments.x b/third_party/gofrontend/libgo/go/go/printer/testdata/comments.x
deleted file mode 100644
index ae77292..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/comments.x
+++ /dev/null
@@ -1,56 +0,0 @@
-// This is a package for testing comment placement by go/printer.
-//
-package main
-
-// The SZ struct; it is empty.
-type SZ struct{}
-
-// The S0 struct; no field is exported.
-type S0 struct {
-	// contains filtered or unexported fields
-}
-
-// The S1 struct; some fields are not exported.
-type S1 struct {
-	S0
-	A, B, C	float	// 3 exported fields
-	D	int	// 2 unexported fields
-	// contains filtered or unexported fields
-}
-
-// The S2 struct; all fields are exported.
-type S2 struct {
-	S1
-	A, B, C	float	// 3 exported fields
-}
-
-// The IZ interface; it is empty.
-type SZ interface{}
-
-// The I0 interface; no method is exported.
-type I0 interface {
-	// contains filtered or unexported methods
-}
-
-// The I1 interface; some methods are not exported.
-type I1 interface {
-	I0
-	F(x float) float	// exported methods
-	// contains filtered or unexported methods
-}
-
-// The I2 interface; all methods are exported.
-type I2 interface {
-	I0
-	F(x float) float	// exported method
-	G(x float) float	// exported method
-}
-
-// The S3 struct; all comments except for the last one must appear in the export.
-type S3 struct {
-	// lead comment for F1
-	F1	int	// line comment for F1
-	// lead comment for F2
-	F2	int	// line comment for F2
-	// contains filtered or unexported fields
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/comments2.golden b/third_party/gofrontend/libgo/go/go/printer/testdata/comments2.golden
deleted file mode 100644
index 7676a26..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/comments2.golden
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This is a package for testing comment placement by go/printer.
-//
-package main
-
-// Test cases for idempotent comment formatting (was issue 1835).
-/*
-c1a
-*/
-/*
-   c1b
-*/
-/* foo
-c1c
-*/
-/* foo
-   c1d
-*/
-/*
-c1e
-foo */
-/*
-   c1f
-   foo */
-
-func f() {
-	/*
-	   c2a
-	*/
-	/*
-	   c2b
-	*/
-	/* foo
-	   c2c
-	*/
-	/* foo
-	   c2d
-	*/
-	/*
-	   c2e
-	   foo */
-	/*
-	   c2f
-	   foo */
-}
-
-func g() {
-	/*
-	   c3a
-	*/
-	/*
-	   c3b
-	*/
-	/* foo
-	   c3c
-	*/
-	/* foo
-	   c3d
-	*/
-	/*
-	   c3e
-	   foo */
-	/*
-	   c3f
-	   foo */
-}
-
-// Test case taken literally from issue 1835.
-func main() {
-	/*
-	   prints test 5 times
-	*/
-	for i := 0; i < 5; i++ {
-		println("test")
-	}
-}
-
-func issue5623() {
-L:
-	_ = yyyyyyyyyyyyyyyy			// comment - should be aligned
-	_ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx	/* comment */
-
-	_ = yyyyyyyyyyyyyyyy			/* comment - should be aligned */
-	_ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx	// comment
-
-LLLLLLL:
-	_ = yyyyyyyyyyyyyyyy			// comment - should be aligned
-	_ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx	// comment
-
-LL:
-LLLLL:
-	_ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx	/* comment */
-	_ = yyyyyyyyyyyyyyyy			/* comment - should be aligned */
-
-	_ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx	// comment
-	_ = yyyyyyyyyyyyyyyy			// comment - should be aligned
-
-	// test case from issue
-label:
-	mask := uint64(1)<<c - 1		// Allocation mask
-	used := atomic.LoadUint64(&h.used)	// Current allocations
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/comments2.input b/third_party/gofrontend/libgo/go/go/printer/testdata/comments2.input
deleted file mode 100644
index 4a055c8..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/comments2.input
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This is a package for testing comment placement by go/printer.
-//
-package main
-
-// Test cases for idempotent comment formatting (was issue 1835).
-/*
-c1a
-*/
-/*
-   c1b
-*/
-/* foo
-c1c
-*/
-/* foo
-   c1d
-*/
-/*
-c1e
-foo */
-/*
-   c1f
-   foo */
-
-func f() {
-/*
-c2a
-*/
-/*
-   c2b
-*/
-/* foo
-c2c
-*/
-/* foo
-   c2d
-*/
-/*
-c2e
-foo */
-/*
-   c2f
-   foo */
-}
-
-func g() {
-/*
-c3a
-*/
-/*
-   c3b
-*/
-/* foo
-c3c
-*/
-/* foo
-   c3d
-*/
-/*
-c3e
-foo */
-/*
-   c3f
-   foo */
-}
-
-// Test case taken literally from issue 1835.
-func main() {
-/*
-prints test 5 times
-*/
-   for i := 0; i < 5; i++ {
-      println("test")
-   }
-}
-
-func issue5623() {
-L:
-   _ = yyyyyyyyyyyyyyyy // comment - should be aligned
-   _ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx /* comment */
-
-   _ = yyyyyyyyyyyyyyyy /* comment - should be aligned */
-   _ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx // comment
-
-LLLLLLL:
-   _ = yyyyyyyyyyyyyyyy // comment - should be aligned
-   _ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx // comment
-
-LL:
-LLLLL:
-   _ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx /* comment */
-   _ = yyyyyyyyyyyyyyyy /* comment - should be aligned */
-
-   _ = xxxxxxxxxxxxxxxxxxxxxxxxxxxx // comment
-   _ = yyyyyyyyyyyyyyyy // comment - should be aligned
-
-// test case from issue
-label:
-   mask := uint64(1)<<c - 1 // Allocation mask
-   used := atomic.LoadUint64(&h.used) // Current allocations
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/declarations.golden b/third_party/gofrontend/libgo/go/go/printer/testdata/declarations.golden
deleted file mode 100644
index 82f5e0f..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/declarations.golden
+++ /dev/null
@@ -1,987 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package imports
-
-import "io"
-
-import (
-	_ "io"
-)
-
-import _ "io"
-
-import (
-	"io"
-	"io"
-	"io"
-)
-
-import (
-	"io"
-	aLongRename "io"
-
-	b "io"
-)
-
-import (
-	"unrenamed"
-	renamed "renameMe"
-	. "io"
-	_ "io"
-	"io"
-	. "os"
-)
-
-// no newlines between consecutive single imports, but
-// respect extra line breaks in the source (at most one empty line)
-import _ "io"
-import _ "io"
-import _ "io"
-
-import _ "os"
-import _ "os"
-import _ "os"
-
-import _ "fmt"
-import _ "fmt"
-import _ "fmt"
-
-import "foo"	// a comment
-import "bar"	// a comment
-
-import (
-	_ "foo"
-	// a comment
-	"bar"
-	"foo"	// a comment
-	"bar"	// a comment
-)
-
-// comments + renames
-import (
-	"unrenamed"	// a comment
-	renamed "renameMe"
-	. "io"		/* a comment */
-	_ "io/ioutil"	// a comment
-	"io"		// testing alignment
-	. "os"
-	// a comment
-)
-
-// a case that caused problems in the past (comment placement)
-import (
-	. "fmt"
-	"io"
-	"malloc"	// for the malloc count test only
-	"math"
-	"strings"
-	"testing"
-)
-
-// more import examples
-import (
-	"xxx"
-	"much_longer_name"	// comment
-	"short_name"		// comment
-)
-
-import (
-	_ "xxx"
-	"much_longer_name"	// comment
-)
-
-import (
-	mymath "math"
-	"/foo/bar/long_package_path"	// a comment
-)
-
-import (
-	"package_a"	// comment
-	"package_b"
-	my_better_c "package_c"	// comment
-	"package_d"		// comment
-	my_e "package_e"	// comment
-
-	"package_a"	// comment
-	"package_bb"
-	"package_ccc"	// comment
-	"package_dddd"	// comment
-)
-
-// print import paths as double-quoted strings
-// (we would like more test cases but the go/parser
-// already excludes most incorrect paths, and we don't
-// bother setting up test-ASTs manually)
-import (
-	"fmt"
-	"math"
-)
-
-// at least one empty line between declarations of different kind
-import _ "io"
-
-var _ int
-
-// at least one empty line between declarations of the same kind
-// if there is associated documentation (was issue 2570)
-type T1 struct{}
-
-// T2 comment
-type T2 struct {
-}	// should be a two-line struct
-
-// T3 comment
-type T2 struct {
-}	// should be a two-line struct
-
-// printing of constant literals
-const (
-	_	= "foobar"
-	_	= "a۰۱۸"
-	_	= "foo६४"
-	_	= "bar9876"
-	_	= 0
-	_	= 1
-	_	= 123456789012345678890
-	_	= 01234567
-	_	= 0xcafebabe
-	_	= 0.
-	_	= .0
-	_	= 3.14159265
-	_	= 1e0
-	_	= 1e+100
-	_	= 1e-100
-	_	= 2.71828e-1000
-	_	= 0i
-	_	= 1i
-	_	= 012345678901234567889i
-	_	= 123456789012345678890i
-	_	= 0.i
-	_	= .0i
-	_	= 3.14159265i
-	_	= 1e0i
-	_	= 1e+100i
-	_	= 1e-100i
-	_	= 2.71828e-1000i
-	_	= 'a'
-	_	= '\000'
-	_	= '\xFF'
-	_	= '\uff16'
-	_	= '\U0000ff16'
-	_	= `foobar`
-	_	= `foo
----
----
-bar`
-)
-
-func _() {
-	type _ int
-	type _ *int
-	type _ []int
-	type _ map[string]int
-	type _ chan int
-	type _ func() int
-
-	var _ int
-	var _ *int
-	var _ []int
-	var _ map[string]int
-	var _ chan int
-	var _ func() int
-
-	type _ struct{}
-	type _ *struct{}
-	type _ []struct{}
-	type _ map[string]struct{}
-	type _ chan struct{}
-	type _ func() struct{}
-
-	type _ interface{}
-	type _ *interface{}
-	type _ []interface{}
-	type _ map[string]interface{}
-	type _ chan interface{}
-	type _ func() interface{}
-
-	var _ struct{}
-	var _ *struct{}
-	var _ []struct{}
-	var _ map[string]struct{}
-	var _ chan struct{}
-	var _ func() struct{}
-
-	var _ interface{}
-	var _ *interface{}
-	var _ []interface{}
-	var _ map[string]interface{}
-	var _ chan interface{}
-	var _ func() interface{}
-}
-
-// don't lose blank lines in grouped declarations
-const (
-	_	int	= 0
-	_	float	= 1
-
-	_	string	= "foo"
-
-	_	= iota
-	_
-
-	// a comment
-	_
-
-	_
-)
-
-type (
-	_	int
-	_	struct{}
-
-	_	interface{}
-
-	// a comment
-	_	map[string]int
-)
-
-var (
-	_	int	= 0
-	_	float	= 1
-
-	_	string	= "foo"
-
-	_	bool
-
-	// a comment
-	_	bool
-)
-
-// don't lose blank lines in this struct
-type _ struct {
-	String	struct {
-		Str, Len int
-	}
-	Slice	struct {
-		Array, Len, Cap int
-	}
-	Eface	struct {
-		Typ, Ptr int
-	}
-
-	UncommonType	struct {
-		Name, PkgPath int
-	}
-	CommonType	struct {
-		Size, Hash, Alg, Align, FieldAlign, String, UncommonType int
-	}
-	Type	struct {
-		Typ, Ptr int
-	}
-	StructField	struct {
-		Name, PkgPath, Typ, Tag, Offset int
-	}
-	StructType	struct {
-		Fields int
-	}
-	PtrType	struct {
-		Elem int
-	}
-	SliceType	struct {
-		Elem int
-	}
-	ArrayType	struct {
-		Elem, Len int
-	}
-
-	Stktop	struct {
-		Stackguard, Stackbase, Gobuf int
-	}
-	Gobuf	struct {
-		Sp, Pc, G int
-	}
-	G	struct {
-		Stackbase, Sched, Status, Alllink int
-	}
-}
-
-// no blank lines in empty structs and interfaces, but leave 1- or 2-line layout alone
-type _ struct{}
-type _ struct {
-}
-
-type _ interface{}
-type _ interface {
-}
-
-// no tabs for single or ungrouped decls
-func _() {
-	const xxxxxx = 0
-	type x int
-	var xxx int
-	var yyyy float = 3.14
-	var zzzzz = "bar"
-
-	const (
-		xxxxxx = 0
-	)
-	type (
-		x int
-	)
-	var (
-		xxx int
-	)
-	var (
-		yyyy float = 3.14
-	)
-	var (
-		zzzzz = "bar"
-	)
-}
-
-// tabs for multiple or grouped decls
-func _() {
-	// no entry has a type
-	const (
-		zzzzzz	= 1
-		z	= 2
-		zzz	= 3
-	)
-	// some entries have a type
-	const (
-		xxxxxx			= 1
-		x			= 2
-		xxx			= 3
-		yyyyyyyy	float	= iota
-		yyyy			= "bar"
-		yyy
-		yy	= 2
-	)
-}
-
-func _() {
-	// no entry has a type
-	var (
-		zzzzzz	= 1
-		z	= 2
-		zzz	= 3
-	)
-	// no entry has a value
-	var (
-		_	int
-		_	float
-		_	string
-
-		_	int	// comment
-		_	float	// comment
-		_	string	// comment
-	)
-	// some entries have a type
-	var (
-		xxxxxx		int
-		x		float
-		xxx		string
-		yyyyyyyy	int	= 1234
-		y		float	= 3.14
-		yyyy			= "bar"
-		yyy		string	= "foo"
-	)
-	// mixed entries - all comments should be aligned
-	var (
-		a, b, c			int
-		x			= 10
-		d			int			// comment
-		y				= 20		// comment
-		f, ff, fff, ffff	int	= 0, 1, 2, 3	// comment
-	)
-	// respect original line breaks
-	var _ = []T{
-		T{0x20, "Telugu"},
-	}
-	var _ = []T{
-		// respect original line breaks
-		T{0x20, "Telugu"},
-	}
-}
-
-// use the formatted output rather than the input to decide when to align
-// (was issue 4505)
-const (
-	short		= 2 * (1 + 2)
-	aMuchLongerName	= 3
-)
-
-var (
-	short		= X{}
-	aMuchLongerName	= X{}
-
-	x1	= X{}	// foo
-	x2	= X{}	// foo
-)
-
-func _() {
-	type (
-		xxxxxx	int
-		x	float
-		xxx	string
-		xxxxx	[]x
-		xx	struct{}
-		xxxxxxx	struct {
-			_, _	int
-			_	float
-		}
-		xxxx	chan<- string
-	)
-}
-
-// alignment of "=" in consecutive lines (extended example from issue 1414)
-const (
-	umax	uint	= ^uint(0)		// maximum value for a uint
-	bpu		= 1 << (5 + umax>>63)	// bits per uint
-	foo
-	bar	= -1
-)
-
-// typical enum
-const (
-	a	MyType	= iota
-	abcd
-	b
-	c
-	def
-)
-
-// excerpt from godoc.go
-var (
-	goroot		= flag.String("goroot", runtime.GOROOT(), "Go root directory")
-	testDir		= flag.String("testdir", "", "Go root subdirectory - for testing only (faster startups)")
-	pkgPath		= flag.String("path", "", "additional package directories (colon-separated)")
-	filter		= flag.String("filter", "", "filter file containing permitted package directory paths")
-	filterMin	= flag.Int("filter_minutes", 0, "filter file update interval in minutes; disabled if <= 0")
-	filterDelay	delayTime	// actual filter update interval in minutes; usually filterDelay == filterMin, but filterDelay may back off exponentially
-)
-
-// formatting of structs
-type _ struct{}
-
-type _ struct { /* this comment should be visible */
-}
-
-type _ struct {
-	// this comment should be visible and properly indented
-}
-
-type _ struct {	// this comment must not change indentation
-	f			int
-	f, ff, fff, ffff	int
-}
-
-type _ struct {
-	string
-}
-
-type _ struct {
-	string	// comment
-}
-
-type _ struct {
-	string "tag"
-}
-
-type _ struct {
-	string "tag"	// comment
-}
-
-type _ struct {
-	f int
-}
-
-type _ struct {
-	f int	// comment
-}
-
-type _ struct {
-	f int "tag"
-}
-
-type _ struct {
-	f int "tag"	// comment
-}
-
-type _ struct {
-	bool
-	a, b, c			int
-	int			"tag"
-	ES				// comment
-	float			"tag"	// comment
-	f			int	// comment
-	f, ff, fff, ffff	int	// comment
-	g			float	"tag"
-	h			float	"tag"	// comment
-}
-
-type _ struct {
-	a, b,
-	c, d	int	// this line should be indented
-	u, v, w, x	float	// this line should be indented
-	p, q,
-	r, s	float	// this line should be indented
-}
-
-// difficult cases
-type _ struct {
-	bool		// comment
-	text	[]byte	// comment
-}
-
-// formatting of interfaces
-type EI interface{}
-
-type _ interface {
-	EI
-}
-
-type _ interface {
-	f()
-	fffff()
-}
-
-type _ interface {
-	EI
-	f()
-	fffffg()
-}
-
-type _ interface {	// this comment must not change indentation
-	EI				// here's a comment
-	f()				// no blank between identifier and ()
-	fffff()				// no blank between identifier and ()
-	gggggggggggg(x, y, z int)	// hurray
-}
-
-// formatting of variable declarations
-func _() {
-	type day struct {
-		n		int
-		short, long	string
-	}
-	var (
-		Sunday		= day{0, "SUN", "Sunday"}
-		Monday		= day{1, "MON", "Monday"}
-		Tuesday		= day{2, "TUE", "Tuesday"}
-		Wednesday	= day{3, "WED", "Wednesday"}
-		Thursday	= day{4, "THU", "Thursday"}
-		Friday		= day{5, "FRI", "Friday"}
-		Saturday	= day{6, "SAT", "Saturday"}
-	)
-}
-
-// formatting of multi-line variable declarations
-var a1, b1, c1 int	// all on one line
-
-var a2, b2,
-	c2 int	// this line should be indented
-
-var (
-	a3, b3,
-	c3, d3	int	// this line should be indented
-	a4, b4, c4	int	// this line should be indented
-)
-
-// Test case from issue 3304: multi-line declarations must end
-// a formatting section and not influence indentation of the
-// next line.
-var (
-	minRefreshTimeSec	= flag.Int64("min_refresh_time_sec", 604800,
-		"minimum time window between two refreshes for a given user.")
-	x	= flag.Int64("refresh_user_rollout_percent", 100,
-		"temporary flag to ramp up the refresh user rpc")
-	aVeryLongVariableName	= stats.GetVarInt("refresh-user-count")
-)
-
-func _() {
-	var privateKey2 = &Block{Type: "RSA PRIVATE KEY",
-		Headers:	map[string]string{},
-		Bytes: []uint8{0x30, 0x82, 0x1, 0x3a, 0x2, 0x1, 0x0, 0x2,
-			0x41, 0x0, 0xb2, 0x99, 0xf, 0x49, 0xc4, 0x7d, 0xfa, 0x8c,
-			0xd4, 0x0, 0xae, 0x6a, 0x4d, 0x1b, 0x8a, 0x3b, 0x6a, 0x13,
-			0x64, 0x2b, 0x23, 0xf2, 0x8b, 0x0, 0x3b, 0xfb, 0x97, 0x79,
-		},
-	}
-}
-
-func _() {
-	var Universe = Scope{
-		Names: map[string]*Ident{
-			// basic types
-			"bool":		nil,
-			"byte":		nil,
-			"int8":		nil,
-			"int16":	nil,
-			"int32":	nil,
-			"int64":	nil,
-			"uint8":	nil,
-			"uint16":	nil,
-			"uint32":	nil,
-			"uint64":	nil,
-			"float32":	nil,
-			"float64":	nil,
-			"string":	nil,
-
-			// convenience types
-			"int":		nil,
-			"uint":		nil,
-			"uintptr":	nil,
-			"float":	nil,
-
-			// constants
-			"false":	nil,
-			"true":		nil,
-			"iota":		nil,
-			"nil":		nil,
-
-			// functions
-			"cap":		nil,
-			"len":		nil,
-			"new":		nil,
-			"make":		nil,
-			"panic":	nil,
-			"panicln":	nil,
-			"print":	nil,
-			"println":	nil,
-		},
-	}
-}
-
-// alignment of map composite entries
-var _ = map[int]int{
-	// small key sizes: always align even if size ratios are large
-	a:			a,
-	abcdefghabcdefgh:	a,
-	ab:			a,
-	abc:			a,
-	abcdefgabcdefg:		a,
-	abcd:			a,
-	abcde:			a,
-	abcdef:			a,
-
-	// mixed key sizes: align when key sizes change within accepted ratio
-	abcdefgh:		a,
-	abcdefghabcdefg:	a,
-	abcdefghij:		a,
-	abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij:	a,	// outlier - do not align with previous line
-	abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij:		a,	// align with previous line
-
-	ab:	a,	// do not align with previous line
-	abcde:	a,	// align with previous line
-}
-
-// alignment of map composite entries: test cases from issue 3965
-// aligned
-var _ = T1{
-	a:			x,
-	b:			y,
-	cccccccccccccccccccc:	z,
-}
-
-// not aligned
-var _ = T2{
-	a:	x,
-	b:	y,
-	ccccccccccccccccccccc:	z,
-}
-
-// aligned
-var _ = T3{
-	aaaaaaaaaaaaaaaaaaaa:	x,
-	b:			y,
-	c:			z,
-}
-
-// not aligned
-var _ = T4{
-	aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:	x,
-	b:	y,
-	c:	z,
-}
-
-// no alignment of map composite entries if they are not the first entry on a line
-var _ = T{0: 0}	// not aligned
-var _ = T{0: 0,	// not aligned
-	1:	1,				// aligned
-	22:	22,				// aligned
-	333:	333, 1234: 12, 12345: 0,	// first on line aligned
-}
-
-// test cases form issue 8685
-// not aligned
-var _ = map[int]string{1: "spring", 2: "summer",
-	3:	"autumn", 4: "winter"}
-
-// not aligned
-var _ = map[string]string{"a": "spring", "b": "summer",
-	"c":	"autumn", "d": "winter"}
-
-// aligned
-var _ = map[string]string{"a": "spring",
-	"b":	"summer",
-	"c":	"autumn",
-	"d":	"winter"}
-
-func _() {
-	var _ = T{
-		a,	// must introduce trailing comma
-	}
-}
-
-// formatting of function results
-func _() func()				{}
-func _() func(int)			{ return nil }
-func _() func(int) int			{ return nil }
-func _() func(int) func(int) func()	{ return nil }
-
-// formatting of consecutive single-line functions
-func _()	{}
-func _()	{}
-func _()	{}
-
-func _()	{}	// an empty line before this function
-func _()	{}
-func _()	{}
-
-func _()		{ f(1, 2, 3) }
-func _(x int) int	{ y := x; return y + 1 }
-func _() int		{ type T struct{}; var x T; return x }
-
-// these must remain multi-line since they are multi-line in the source
-func _() {
-	f(1, 2, 3)
-}
-func _(x int) int {
-	y := x
-	return y + 1
-}
-func _() int {
-	type T struct{}
-	var x T
-	return x
-}
-
-// making function declarations safe for new semicolon rules
-func _()	{ /* single-line function because of "short-ish" comment */ }
-func _() { /* multi-line function because of "long-ish" comment - much more comment text is following here */ /* and more */
-}
-
-func _() {
-	/* multi-line func because block is on multiple lines */
-}
-
-// ellipsis parameters
-func _(...int)
-func _(...*int)
-func _(...[]int)
-func _(...struct{})
-func _(bool, ...interface{})
-func _(bool, ...func())
-func _(bool, ...func(...int))
-func _(bool, ...map[string]int)
-func _(bool, ...chan int)
-
-func _(b bool, x ...int)
-func _(b bool, x ...*int)
-func _(b bool, x ...[]int)
-func _(b bool, x ...struct{})
-func _(x ...interface{})
-func _(x ...func())
-func _(x ...func(...int))
-func _(x ...map[string]int)
-func _(x ...chan int)
-
-// these parameter lists must remain multi-line since they are multi-line in the source
-func _(bool,
-	int) {
-}
-func _(x bool,
-	y int) {
-}
-func _(x,
-	y bool) {
-}
-func _(bool,	// comment
-	int) {
-}
-func _(x bool,	// comment
-	y int) {
-}
-func _(x,	// comment
-	y bool) {
-}
-func _(bool,	// comment
-	// comment
-	int) {
-}
-func _(x bool,	// comment
-	// comment
-	y int) {
-}
-func _(x,	// comment
-	// comment
-	y bool) {
-}
-func _(bool,
-	// comment
-	int) {
-}
-func _(x bool,
-	// comment
-	y int) {
-}
-func _(x,
-	// comment
-	y bool) {
-}
-func _(x,	// comment
-	y,	// comment
-	z bool) {
-}
-func _(x,	// comment
-	y,	// comment
-	z bool) {
-}
-func _(x int,	// comment
-	y float,	// comment
-	z bool) {
-}
-
-// properly indent multi-line signatures
-func ManageStatus(in <-chan *Status, req <-chan Request,
-	stat chan<- *TargetInfo,
-	TargetHistorySize int) {
-}
-
-func MultiLineSignature0(
-	a, b, c int,
-) {
-}
-
-func MultiLineSignature1(
-	a, b, c int,
-	u, v, w float,
-) {
-}
-
-func MultiLineSignature2(
-	a, b,
-	c int,
-) {
-}
-
-func MultiLineSignature3(
-	a, b,
-	c int, u, v,
-	w float,
-	x ...int) {
-}
-
-func MultiLineSignature4(
-	a, b, c int,
-	u, v,
-	w float,
-	x ...int) {
-}
-
-func MultiLineSignature5(
-	a, b, c int,
-	u, v, w float,
-	p, q,
-	r string,
-	x ...int) {
-}
-
-// make sure it also works for methods in interfaces
-type _ interface {
-	MultiLineSignature0(
-		a, b, c int,
-	)
-
-	MultiLineSignature1(
-		a, b, c int,
-		u, v, w float,
-	)
-
-	MultiLineSignature2(
-		a, b,
-		c int,
-	)
-
-	MultiLineSignature3(
-		a, b,
-		c int, u, v,
-		w float,
-		x ...int)
-
-	MultiLineSignature4(
-		a, b, c int,
-		u, v,
-		w float,
-		x ...int)
-
-	MultiLineSignature5(
-		a, b, c int,
-		u, v, w float,
-		p, q,
-		r string,
-		x ...int)
-}
-
-// omit superfluous parentheses in parameter lists
-func _(int)
-func _(int)
-func _(x int)
-func _(x int)
-func _(x, y int)
-func _(x, y int)
-
-func _() int
-func _() int
-func _() int
-
-func _() (x int)
-func _() (x int)
-func _() (x int)
-
-// special cases: some channel types require parentheses
-func _(x chan (<-chan int))
-func _(x chan (<-chan int))
-func _(x chan (<-chan int))
-
-func _(x chan<- (chan int))
-func _(x chan<- (chan int))
-func _(x chan<- (chan int))
-
-// don't introduce comma after last parameter if the closing ) is on the same line
-// even if the parameter type itself is multi-line (test cases from issue 4533)
-func _(...interface{})
-func _(...interface {
-	m()
-	n()
-})	// no extra comma between } and )
-
-func (t *T) _(...interface{})
-func (t *T) _(...interface {
-	m()
-	n()
-})	// no extra comma between } and )
-
-func _(interface{})
-func _(interface {
-	m()
-})	// no extra comma between } and )
-
-func _(struct{})
-func _(struct {
-	x	int
-	y	int
-})	// no extra comma between } and )
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/declarations.input b/third_party/gofrontend/libgo/go/go/printer/testdata/declarations.input
deleted file mode 100644
index a0a3783..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/declarations.input
+++ /dev/null
@@ -1,1001 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package imports
-
-import "io"
-
-import (
-	_ "io"
-)
-
-import _ "io"
-
-import (
-	"io"
-	"io"
-	"io"
-)
-
-import (
-	"io"
-	aLongRename "io"
-
-	b "io"
-)
-
-import (
-       "unrenamed"
-       renamed "renameMe"
-       . "io"
-       _ "io"
-       "io"
-       . "os"
-)
-
-// no newlines between consecutive single imports, but
-// respect extra line breaks in the source (at most one empty line)
-import _ "io"
-import _ "io"
-import _ "io"
-
-import _ "os"
-import _ "os"
-import _ "os"
-
-
-import _ "fmt"
-import _ "fmt"
-import _ "fmt"
-
-import "foo"  // a comment
-import "bar"  // a comment
-
-import (
-	_ "foo"
-	// a comment
-	"bar"
-	"foo"  // a comment
-	"bar"  // a comment
-)
-
-// comments + renames
-import (
-       "unrenamed" // a comment
-       renamed "renameMe"
-       . "io" /* a comment */
-       _ "io/ioutil" // a comment
-       "io" // testing alignment
-       . "os"
-       // a comment
-)
-
-// a case that caused problems in the past (comment placement)
-import (
-	. "fmt"
-	"io"
-	"malloc"	// for the malloc count test only
-	"math"
-	"strings"
-	"testing"
-)
-
-// more import examples
-import (
-	"xxx"
-	"much_longer_name" // comment
-	"short_name" // comment
-)
-
-import (
-	_ "xxx"
-	"much_longer_name" // comment
-)
-
-import (
-	mymath "math"
-	"/foo/bar/long_package_path" // a comment
-)
-
-import (
-	"package_a" // comment
-	"package_b"
-	my_better_c "package_c" // comment
-	"package_d" // comment
-	my_e "package_e" // comment
-
-	"package_a"    // comment
-	"package_bb"
-	"package_ccc"  // comment
-	"package_dddd" // comment
-)
-
-// print import paths as double-quoted strings
-// (we would like more test cases but the go/parser
-// already excludes most incorrect paths, and we don't
-// bother setting up test-ASTs manually)
-import (
-	`fmt`
-	"math"
-)
-
-// at least one empty line between declarations of different kind
-import _ "io"
-var _ int
-
-// at least one empty line between declarations of the same kind
-// if there is associated documentation (was issue 2570)
-type T1 struct{}
-// T2 comment
-type T2 struct {
-} // should be a two-line struct
-
-
-// T3 comment
-type T2 struct {
-
-
-} // should be a two-line struct
-
-
-// printing of constant literals
-const (
-	_ = "foobar"
-	_ = "a۰۱۸"
-	_ = "foo६४"
-	_ = "bar9876"
-	_ = 0
-	_ = 1
-	_ = 123456789012345678890
-	_ = 01234567
-	_ = 0xcafebabe
-	_ = 0.
-	_ = .0
-	_ = 3.14159265
-	_ = 1e0
-	_ = 1e+100
-	_ = 1e-100
-	_ = 2.71828e-1000
-	_ = 0i
-	_ = 1i
-	_ = 012345678901234567889i
-	_ = 123456789012345678890i
-	_ = 0.i
-	_ = .0i
-	_ = 3.14159265i
-	_ = 1e0i
-	_ = 1e+100i
-	_ = 1e-100i
-	_ = 2.71828e-1000i
-	_ = 'a'
-	_ = '\000'
-	_ = '\xFF'
-	_ = '\uff16'
-	_ = '\U0000ff16'
-	_ = `foobar`
-	_ = `foo
----
----
-bar`
-)
-
-
-func _() {
-	type _ int
-	type _ *int
-	type _ []int
-	type _ map[string]int
-	type _ chan int
-	type _ func() int
-
-	var _ int
-	var _ *int
-	var _ []int
-	var _ map[string]int
-	var _ chan int
-	var _ func() int
-
-	type _ struct{}
-	type _ *struct{}
-	type _ []struct{}
-	type _ map[string]struct{}
-	type _ chan struct{}
-	type _ func() struct{}
-
-	type _ interface{}
-	type _ *interface{}
-	type _ []interface{}
-	type _ map[string]interface{}
-	type _ chan interface{}
-	type _ func() interface{}
-
-	var _ struct{}
-	var _ *struct{}
-	var _ []struct{}
-	var _ map[string]struct{}
-	var _ chan struct{}
-	var _ func() struct{}
-
-	var _ interface{}
-	var _ *interface{}
-	var _ []interface{}
-	var _ map[string]interface{}
-	var _ chan interface{}
-	var _ func() interface{}
-}
-
-
-// don't lose blank lines in grouped declarations
-const (
-	_ int = 0
-	_ float = 1
-
-	_ string = "foo"
-
-	_ = iota
-	_
-	
-	// a comment
-	_
-
-	_
-)
-
-
-type (
-	_ int
-	_ struct {}
-	
-	_ interface{}
-	
-	// a comment
-	_ map[string]int
-)
-
-
-var (
-	_ int = 0
-	_ float = 1
-
-	_ string = "foo"
-
-	_ bool
-	
-	// a comment
-	_ bool
-)
-
-
-// don't lose blank lines in this struct
-type _ struct {
-	String struct {
-		Str, Len int
-	}
-	Slice struct {
-		Array, Len, Cap int
-	}
-	Eface struct {
-		Typ, Ptr int
-	}
-
-	UncommonType struct {
-		Name, PkgPath int
-	}
-	CommonType struct {
-		Size, Hash, Alg, Align, FieldAlign, String, UncommonType int
-	}
-	Type struct {
-		Typ, Ptr int
-	}
-	StructField struct {
-		Name, PkgPath, Typ, Tag, Offset int
-	}
-	StructType struct {
-		Fields int
-	}
-	PtrType struct {
-		Elem int
-	}
-	SliceType struct {
-		Elem int
-	}
-	ArrayType struct {
-		Elem, Len int
-	}
-
-	Stktop struct {
-		Stackguard, Stackbase, Gobuf int
-	}
-	Gobuf struct {
-		Sp, Pc, G int
-	}
-	G struct {
-		Stackbase, Sched, Status, Alllink int
-	}
-}
-
-
-// no blank lines in empty structs and interfaces, but leave 1- or 2-line layout alone
-type _ struct{            }
-type _ struct {
-
-}
-
-type _ interface{            }
-type _ interface {
-
-}
-
-
-// no tabs for single or ungrouped decls
-func _() {
-	const xxxxxx = 0
-	type x int
-	var xxx int
-	var yyyy float = 3.14
-	var zzzzz = "bar"
-
-	const (
-		xxxxxx = 0
-	)
-	type (
-		x int
-	)
-	var (
-		xxx int
-	)
-	var (
-		yyyy float = 3.14
-	)
-	var (
-		zzzzz = "bar"
-	)
-}
-
-// tabs for multiple or grouped decls
-func _() {
-	// no entry has a type
-	const (
-		zzzzzz = 1
-		z = 2
-		zzz = 3
-	)
-	// some entries have a type
-	const (
-		xxxxxx = 1
-		x = 2
-		xxx = 3
-		yyyyyyyy float = iota
-		yyyy = "bar"
-		yyy
-		yy = 2
-	)
-}
-
-func _() {
-	// no entry has a type
-	var (
-		zzzzzz = 1
-		z = 2
-		zzz = 3
-	)
-	// no entry has a value
-	var (
-		_ int
-		_ float
-		_ string
-
-		_ int  // comment
-		_ float  // comment
-		_ string  // comment
-	)
-	// some entries have a type
-	var (
-		xxxxxx int
-		x float
-		xxx string
-		yyyyyyyy int = 1234
-		y float = 3.14
-		yyyy = "bar"
-		yyy string = "foo"
-	)
-	// mixed entries - all comments should be aligned
-	var (
-		a, b, c int
-		x = 10
-		d int  // comment
-		y = 20  // comment
-		f, ff, fff, ffff int = 0, 1, 2, 3  // comment
-	)
-	// respect original line breaks
-	var _ = []T {
-		T{0x20,	"Telugu"},
-	}
-	var _ = []T {
-		// respect original line breaks
-		T{0x20,	"Telugu"},
-	}
-}
-
-// use the formatted output rather than the input to decide when to align
-// (was issue 4505)
-const (
-	short = 2 * (
-	1 + 2)
-	aMuchLongerName = 3
-)
-
-var (
-	short = X{
-	}
-	aMuchLongerName = X{}
-
-	x1 = X{} // foo
-	x2 = X{
-	} // foo
-)
-
-func _() {
-	type (
-		xxxxxx int
-		x float
-		xxx string
-		xxxxx []x
-		xx struct{}
-		xxxxxxx struct {
-			_, _ int
-			_ float
-		}
-		xxxx chan<- string
-	)
-}
-
-// alignment of "=" in consecutive lines (extended example from issue 1414)
-const (
-	umax uint                  = ^uint(0) // maximum value for a uint
-	bpu  = 1 << (5 + umax>>63)            // bits per uint
-	foo
-	bar  = -1
-)
-
-// typical enum
-const (
-	a MyType = iota
-	abcd
-	b
-	c
-	def
-)
-
-// excerpt from godoc.go
-var (
-	goroot = flag.String("goroot", runtime.GOROOT(), "Go root directory")
-	testDir = flag.String("testdir", "", "Go root subdirectory - for testing only (faster startups)")
-	pkgPath = flag.String("path", "", "additional package directories (colon-separated)")
-	filter = flag.String("filter", "", "filter file containing permitted package directory paths")
-	filterMin = flag.Int("filter_minutes", 0, "filter file update interval in minutes; disabled if <= 0")
-	filterDelay delayTime // actual filter update interval in minutes; usually filterDelay == filterMin, but filterDelay may back off exponentially
-)
-
-
-// formatting of structs
-type _ struct{}
-
-type _ struct{ /* this comment should be visible */ }
-
-type _ struct{
-	// this comment should be visible and properly indented
-}
-
-type _ struct {  // this comment must not change indentation
-	f int
-	f, ff, fff, ffff int
-}
-
-type _ struct {
-	string
-}
-
-type _ struct {
-	string  // comment
-}
-
-type _ struct {
-	string "tag"
-}
-
-type _ struct {
-	string "tag"  // comment
-}
-
-type _ struct {
-	f int
-}
-
-type _ struct {
-	f int  // comment
-}
-
-type _ struct {
-	f int "tag"
-}
-
-type _ struct {
-	f int "tag"  // comment
-}
-
-type _ struct {
-	bool
-	a, b, c int
-	int "tag"
-	ES // comment
-	float "tag"  // comment
-	f int  // comment
-	f, ff, fff, ffff int  // comment
-	g float "tag"
-	h float "tag"  // comment
-}
-
-type _ struct { a, b,
-c, d int  // this line should be indented
-u, v, w, x float // this line should be indented
-p, q,
-r, s float // this line should be indented
-}
-
-
-// difficult cases
-type _ struct {
-	bool  // comment
-	text []byte  // comment
-}
-
-
-// formatting of interfaces
-type EI interface{}
-
-type _ interface {
-	EI
-}
-
-type _ interface {
-	f()
-	fffff()
-}
-
-type _ interface {
-	EI
-	f()
-	fffffg()
-}
-
-type _ interface {  // this comment must not change indentation
-	EI  // here's a comment
-	f()  // no blank between identifier and ()
-	fffff()  // no blank between identifier and ()
-	gggggggggggg(x, y, z int) ()  // hurray
-}
-
-
-// formatting of variable declarations
-func _() {
-	type day struct { n int; short, long string }
-	var (
-		Sunday = day{ 0, "SUN", "Sunday" }
-		Monday = day{ 1, "MON", "Monday" }
-		Tuesday = day{ 2, "TUE", "Tuesday" }
-		Wednesday = day{ 3, "WED", "Wednesday" }
-		Thursday = day{ 4, "THU", "Thursday" }
-		Friday = day{ 5, "FRI", "Friday" }
-		Saturday = day{ 6, "SAT", "Saturday" }
-	)
-}
-
-
-// formatting of multi-line variable declarations
-var a1, b1, c1 int  // all on one line
-
-var a2, b2,
-c2 int  // this line should be indented
-
-var (a3, b3,
-c3, d3 int  // this line should be indented
-a4, b4, c4 int  // this line should be indented
-)
-
-// Test case from issue 3304: multi-line declarations must end
-// a formatting section and not influence indentation of the
-// next line.
-var (
-	minRefreshTimeSec = flag.Int64("min_refresh_time_sec", 604800,
-		"minimum time window between two refreshes for a given user.")
-	x = flag.Int64("refresh_user_rollout_percent", 100,
-		"temporary flag to ramp up the refresh user rpc")
-	aVeryLongVariableName = stats.GetVarInt("refresh-user-count")
-)
-
-func _() {
-	var privateKey2 = &Block{Type: "RSA PRIVATE KEY",
-					Headers: map[string]string{},
-					Bytes: []uint8{0x30, 0x82, 0x1, 0x3a, 0x2, 0x1, 0x0, 0x2,
-			0x41, 0x0, 0xb2, 0x99, 0xf, 0x49, 0xc4, 0x7d, 0xfa, 0x8c,
-			0xd4, 0x0, 0xae, 0x6a, 0x4d, 0x1b, 0x8a, 0x3b, 0x6a, 0x13,
-			0x64, 0x2b, 0x23, 0xf2, 0x8b, 0x0, 0x3b, 0xfb, 0x97, 0x79,
-		},
-	}
-}
-
-
-func _() {
-	var Universe = Scope {
-		Names: map[string]*Ident {
-			// basic types
-			"bool": nil,
-			"byte": nil,
-			"int8": nil,
-			"int16": nil,
-			"int32": nil,
-			"int64": nil,
-			"uint8": nil,
-			"uint16": nil,
-			"uint32": nil,
-			"uint64": nil,
-			"float32": nil,
-			"float64": nil,
-			"string": nil,
-
-			// convenience types
-			"int": nil,
-			"uint": nil,
-			"uintptr": nil,
-			"float": nil,
-
-			// constants
-			"false": nil,
-			"true": nil,
-			"iota": nil,
-			"nil": nil,
-
-			// functions
-			"cap": nil,
-			"len": nil,
-			"new": nil,
-			"make": nil,
-			"panic": nil,
-			"panicln": nil,
-			"print": nil,
-			"println": nil,
-		},
-	}
-}
-
-
-// alignment of map composite entries
-var _ = map[int]int{
-	// small key sizes: always align even if size ratios are large
-	a: a,
-	abcdefghabcdefgh: a,
-	ab: a,
-	abc: a,
-	abcdefgabcdefg: a,
-	abcd: a,
-	abcde: a,
-	abcdef: a,
-
-	// mixed key sizes: align when key sizes change within accepted ratio
-	abcdefgh: a,
-	abcdefghabcdefg: a,
-	abcdefghij: a,
-	abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij: a, // outlier - do not align with previous line
-	abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij: a, // align with previous line
-
-	ab: a, // do not align with previous line
-	abcde: a, // align with previous line
-}
-
-// alignment of map composite entries: test cases from issue 3965
-// aligned
-var _ = T1{
-	a:                    x,
-	b:                    y,
-	cccccccccccccccccccc: z,
-}
-
-// not aligned
-var _ = T2{
-	a: x,
-	b: y,
-	ccccccccccccccccccccc: z,
-}
-
-// aligned
-var _ = T3{
-	aaaaaaaaaaaaaaaaaaaa: x,
-	b:                    y,
-	c:                    z,
-}
-
-// not aligned
-var _ = T4{
-	aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: x,
-	b:                                       y,
-	c:                                       z,
-}
-
-
-// no alignment of map composite entries if they are not the first entry on a line
-var _ = T{0: 0} // not aligned
-var _ = T{0: 0, // not aligned
-	1: 1, // aligned
-	22: 22, // aligned
-	333: 333, 1234: 12, 12345: 0, // first on line aligned
-}
-
-
-// test cases form issue 8685
-// not aligned
-var _ = map[int]string{1: "spring", 2: "summer",
-					3:             "autumn", 4: "winter"}
-
-// not aligned
-var _ = map[string]string{"a": "spring", "b": "summer",
-	"c": "autumn", "d": "winter"}
-
-// aligned
-var _ = map[string]string{"a": "spring",
-"b": "summer",
-	"c": "autumn",
-"d": "winter"}
-
-
-func _() {
-	var _ = T{
-		a,	// must introduce trailing comma
-	}
-}
-
-
-// formatting of function results
-func _() func() {}
-func _() func(int) { return nil }
-func _() func(int) int { return nil }
-func _() func(int) func(int) func() { return nil }
-
-
-// formatting of consecutive single-line functions
-func _() {}
-func _() {}
-func _() {}
-
-func _() {}  // an empty line before this function
-func _() {}
-func _() {}
-
-func _() { f(1, 2, 3) }
-func _(x int) int { y := x; return y+1 }
-func _() int { type T struct{}; var x T; return x }
-
-// these must remain multi-line since they are multi-line in the source
-func _() {
-	f(1, 2, 3)
-}
-func _(x int) int {
-	y := x; return y+1
-}
-func _() int {
-	type T struct{}; var x T; return x
-}
-
-
-// making function declarations safe for new semicolon rules
-func _() { /* single-line function because of "short-ish" comment */ }
-func _() { /* multi-line function because of "long-ish" comment - much more comment text is following here */ /* and more */ }
-
-func _() {
-/* multi-line func because block is on multiple lines */ }
-
-
-// ellipsis parameters
-func _(...int)
-func _(...*int)
-func _(...[]int)
-func _(...struct{})
-func _(bool, ...interface{})
-func _(bool, ...func())
-func _(bool, ...func(...int))
-func _(bool, ...map[string]int)
-func _(bool, ...chan int)
-
-func _(b bool, x ...int)
-func _(b bool, x ...*int)
-func _(b bool, x ...[]int)
-func _(b bool, x ...struct{})
-func _(x ...interface{})
-func _(x ...func())
-func _(x ...func(...int))
-func _(x ...map[string]int)
-func _(x ...chan int)
-
-
-// these parameter lists must remain multi-line since they are multi-line in the source
-func _(bool,
-int) {
-}
-func _(x bool,
-y int) {
-}
-func _(x,
-y bool) {
-}
-func _(bool, // comment
-int) {
-}
-func _(x bool, // comment
-y int) {
-}
-func _(x, // comment
-y bool) {
-}
-func _(bool, // comment
-// comment
-int) {
-}
-func _(x bool, // comment
-// comment
-y int) {
-}
-func _(x, // comment
-// comment
-y bool) {
-}
-func _(bool,
-// comment
-int) {
-}
-func _(x bool,
-// comment
-y int) {
-}
-func _(x,
-// comment
-y bool) {
-}
-func _(x, // comment
-y,// comment
-z bool) {
-}
-func _(x, // comment
-	y,// comment
-	z bool) {
-}
-func _(x int,	// comment
-	y float,	// comment
-	z bool) {
-}
-
-
-// properly indent multi-line signatures
-func ManageStatus(in <-chan *Status, req <-chan Request,
-stat chan<- *TargetInfo,
-TargetHistorySize int) {
-}
-
-func MultiLineSignature0(
-a, b, c int,
-) {}
-
-func MultiLineSignature1(
-a, b, c int,
-u, v, w float,
-) {}
-
-func MultiLineSignature2(
-a, b,
-c int,
-) {}
-
-func MultiLineSignature3(
-a, b,
-c int, u, v,
-w float,
-		x ...int) {}
-
-func MultiLineSignature4(
-a, b, c int,
-u, v,
-w float,
-		x ...int) {}
-
-func MultiLineSignature5(
-a, b, c int,
-u, v, w float,
-p, q,
-r string,
-		x ...int) {}
-
-// make sure it also works for methods in interfaces
-type _ interface {
-MultiLineSignature0(
-a, b, c int,
-)
-
-MultiLineSignature1(
-a, b, c int,
-u, v, w float,
-)
-
-MultiLineSignature2(
-a, b,
-c int,
-)
-
-MultiLineSignature3(
-a, b,
-c int, u, v,
-w float,
-		x ...int)
-
-MultiLineSignature4(
-a, b, c int,
-u, v,
-w float,
-		x ...int)
-
-MultiLineSignature5(
-a, b, c int,
-u, v, w float,
-p, q,
-r string,
-		x ...int)
-}
-
-// omit superfluous parentheses in parameter lists
-func _((int))
-func _((((((int))))))
-func _(x (int))
-func _(x (((((int))))))
-func _(x, y (int))
-func _(x, y (((((int))))))
-
-func _() (int)
-func _() ((int))
-func _() ((((((int))))))
-
-func _() (x int)
-func _() (x (int))
-func _() (x (((((int))))))
-
-// special cases: some channel types require parentheses
-func _(x chan(<-chan int))
-func _(x (chan(<-chan int)))
-func _(x ((((chan(<-chan int))))))
-
-func _(x chan<-(chan int))
-func _(x (chan<-(chan int)))
-func _(x ((((chan<-(chan int))))))
-
-// don't introduce comma after last parameter if the closing ) is on the same line
-// even if the parameter type itself is multi-line (test cases from issue 4533)
-func _(...interface{})
-func _(...interface {
-	m()
-	n()
-}) // no extra comma between } and )
-
-func (t *T) _(...interface{})
-func (t *T) _(...interface {
-	m()
-	n()
-}) // no extra comma between } and )
-
-func _(interface{})
-func _(interface {
-	m()
-}) // no extra comma between } and )
-
-func _(struct{})
-func _(struct {
-	x int
-	y int
-}) // no extra comma between } and )
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/empty.golden b/third_party/gofrontend/libgo/go/go/printer/testdata/empty.golden
deleted file mode 100644
index a055f47..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/empty.golden
+++ /dev/null
@@ -1,5 +0,0 @@
-// a comment at the beginning of the file
-
-package empty
-
-// a comment at the end of the file
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/empty.input b/third_party/gofrontend/libgo/go/go/printer/testdata/empty.input
deleted file mode 100644
index a055f47..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/empty.input
+++ /dev/null
@@ -1,5 +0,0 @@
-// a comment at the beginning of the file
-
-package empty
-
-// a comment at the end of the file
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/expressions.golden b/third_party/gofrontend/libgo/go/go/printer/testdata/expressions.golden
deleted file mode 100644
index e3d17a4..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/expressions.golden
+++ /dev/null
@@ -1,686 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package expressions
-
-type T struct {
-	x, y, z int
-}
-
-var (
-	a, b, c, d, e						int
-	under_bar						int
-	longIdentifier1, longIdentifier2, longIdentifier3	int
-	t0, t1, t2						T
-	s							string
-	p							*int
-)
-
-func _() {
-	// no spaces around simple or parenthesized expressions
-	_ = (a + 0)
-	_ = a + b
-	_ = a + b + c
-	_ = a + b - c
-	_ = a - b - c
-	_ = a + (b * c)
-	_ = a + (b / c)
-	_ = a - (b % c)
-	_ = 1 + a
-	_ = a + 1
-	_ = a + b + 1
-	_ = s[a]
-	_ = s[a:]
-	_ = s[:b]
-	_ = s[1:2]
-	_ = s[a:b]
-	_ = s[0:len(s)]
-	_ = s[0] << 1
-	_ = (s[0] << 1) & 0xf
-	_ = s[0]<<2 | s[1]>>4
-	_ = "foo" + s
-	_ = s + "foo"
-	_ = 'a' + 'b'
-	_ = len(s) / 2
-	_ = len(t0.x) / a
-
-	// spaces around expressions of different precedence or expressions containing spaces
-	_ = a + -b
-	_ = a - ^b
-	_ = a / *p
-	_ = a + b*c
-	_ = 1 + b*c
-	_ = a + 2*c
-	_ = a + c*2
-	_ = 1 + 2*3
-	_ = s[1 : 2*3]
-	_ = s[a : b-c]
-	_ = s[0:]
-	_ = s[a+b]
-	_ = s[:b-c]
-	_ = s[a+b:]
-	_ = a[a<<b+1]
-	_ = a[a<<b+1:]
-	_ = s[a+b : len(s)]
-	_ = s[len(s):-a]
-	_ = s[a : len(s)+1]
-	_ = s[a:len(s)+1] + s
-
-	// spaces around operators with equal or lower precedence than comparisons
-	_ = a == b
-	_ = a != b
-	_ = a > b
-	_ = a >= b
-	_ = a < b
-	_ = a <= b
-	_ = a < b && c > d
-	_ = a < b || c > d
-
-	// spaces around "long" operands
-	_ = a + longIdentifier1
-	_ = longIdentifier1 + a
-	_ = longIdentifier1 + longIdentifier2*longIdentifier3
-	_ = s + "a longer string"
-
-	// some selected cases
-	_ = a + t0.x
-	_ = a + t0.x + t1.x*t2.x
-	_ = a + b + c + d + e + 2*3
-	_ = a + b + c + 2*3 + d + e
-	_ = (a + b + c) * 2
-	_ = a - b + c - d + (a + b + c) + d&e
-	_ = under_bar - 1
-	_ = Open(dpath+"/file", O_WRONLY|O_CREAT, 0666)
-	_ = int(c0&_Mask4)<<18 | int(c1&_Maskx)<<12 | int(c2&_Maskx)<<6 | int(c3&_Maskx)
-
-	// test case for issue 8021
-	// want:
-	//  ([]bool{})[([]int{})[((1)+(((1)+((((1)*(((1)+(1))+(1)))+(1))*(1)))+(1)))]]
-	_ = ([]bool{})[([]int{})[((1)+(((1)+((((1)*(((1)+(1))+(1)))+(1))*(1)))+(1)))]]
-
-	// the parser does not restrict expressions that may appear as statements
-	true
-	42
-	"foo"
-	x
-	(x)
-	a + b
-	a + b + c
-	a + (b * c)
-	a + (b / c)
-	1 + a
-	a + 1
-	s[a]
-	x << 1
-	(s[0] << 1) & 0xf
-	"foo" + s
-	x == y
-	x < y || z > 42
-}
-
-// slice expressions with cap
-func _() {
-	_ = x[a:b:c]
-	_ = x[a:b : c+d]
-	_ = x[a : b+d : c]
-	_ = x[a : b+d : c+d]
-	_ = x[a+d : b:c]
-	_ = x[a+d : b : c+d]
-	_ = x[a+d : b+d : c]
-	_ = x[a+d : b+d : c+d]
-
-	_ = x[:b:c]
-	_ = x[:b : c+d]
-	_ = x[:b+d : c]
-	_ = x[:b+d : c+d]
-}
-
-func _() {
-	_ = a + b
-	_ = a + b + c
-	_ = a + b*c
-	_ = a + (b * c)
-	_ = (a + b) * c
-	_ = a + (b * c * d)
-	_ = a + (b*c + d)
-
-	_ = 1 << x
-	_ = -1 << x
-	_ = 1<<x - 1
-	_ = -1<<x - 1
-
-	_ = f(a + b)
-	_ = f(a + b + c)
-	_ = f(a + b*c)
-	_ = f(a + (b * c))
-	_ = f(1<<x-1, 1<<x-2)
-
-	_ = 1<<d.logWindowSize - 1
-
-	buf = make(x, 2*cap(b.buf)+n)
-
-	dst[i*3+2] = dbuf[0] << 2
-	dst[i*3+2] = dbuf[0]<<2 | dbuf[1]>>4
-
-	b.buf = b.buf[0 : b.off+m+n]
-	b.buf = b.buf[0 : b.off+m*n]
-	f(b.buf[0 : b.off+m+n])
-
-	signed += ' ' * 8
-	tw.octal(header[148:155], chksum)
-
-	_ = x > 0 && i >= 0
-
-	x1, x0 := x>>w2, x&m2
-	z0 = t1<<w2 + t0
-	z1 = (t1 + t0>>w2) >> w2
-	q1, r1 := x1/d1, x1%d1
-	r1 = r1*b2 | x0>>w2
-	x1 = (x1 << z) | (x0 >> (uint(w) - z))
-	x1 = x1<<z | x0>>(uint(w)-z)
-
-	_ = buf[0 : len(buf)+1]
-	_ = buf[0 : n+1]
-
-	a, b = b, a
-	a = b + c
-	a = b*c + d
-	_ = a*b + c
-	_ = a - b - c
-	_ = a - (b - c)
-	_ = a - b*c
-	_ = a - (b * c)
-	_ = a * b / c
-	_ = a / *b
-	_ = x[a|^b]
-	_ = x[a / *b]
-	_ = a & ^b
-	_ = a + +b
-	_ = a - -b
-	_ = x[a*-b]
-	_ = x[a + +b]
-	_ = x ^ y ^ z
-	_ = b[a>>24] ^ b[(a>>16)&0xFF] ^ b[(a>>8)&0xFF] ^ b[a&0xFF]
-	_ = len(longVariableName) * 2
-
-	_ = token(matchType + xlength<<lengthShift + xoffset)
-}
-
-func f(x int, args ...int) {
-	f(0, args...)
-	f(1, args)
-	f(2, args[0])
-
-	// make sure syntactically legal code remains syntactically legal
-	f(3, 42 ...)	// a blank must remain between 42 and ...
-	f(4, 42....)
-	f(5, 42....)
-	f(6, 42.0...)
-	f(7, 42.0...)
-	f(8, .42...)
-	f(9, .42...)
-	f(10, 42e0...)
-	f(11, 42e0...)
-
-	_ = 42 .x	// a blank must remain between 42 and .x
-	_ = 42..x
-	_ = 42..x
-	_ = 42.0.x
-	_ = 42.0.x
-	_ = .42.x
-	_ = .42.x
-	_ = 42e0.x
-	_ = 42e0.x
-
-	// a blank must remain between the binary operator and the 2nd operand
-	_ = x / *y
-	_ = x < -1
-	_ = x < <-1
-	_ = x + +1
-	_ = x - -1
-	_ = x & &x
-	_ = x & ^x
-
-	_ = f(x / *y, x < -1, x < <-1, x + +1, x - -1, x & &x, x & ^x)
-}
-
-func _() {
-	_ = T{}
-	_ = struct{}{}
-	_ = [10]T{}
-	_ = [...]T{}
-	_ = []T{}
-	_ = map[int]T{}
-}
-
-// one-line structs/interfaces in composite literals (up to a threshold)
-func _() {
-	_ = struct{}{}
-	_ = struct{ x int }{0}
-	_ = struct{ x, y, z int }{0, 1, 2}
-	_ = struct{ int }{0}
-	_ = struct{ s struct{ int } }{struct{ int }{0}}
-}
-
-func _() {
-	// do not modify literals
-	_ = "tab1	tab2	tab3	end"	// string contains 3 tabs
-	_ = "tab1 tab2 tab3 end"	// same string with 3 blanks - may be unaligned because editors see tabs in strings
-	_ = ""				// this comment should be aligned with the one on the previous line
-	_ = ``
-	_ = `
-`
-	_ = `foo
-		bar`
-	_ = `three spaces before the end of the line starting here:   
-they must not be removed`
-}
-
-func _() {
-	// smart handling of indentation for multi-line raw strings
-	var _ = ``
-	var _ = `foo`
-	var _ = `foo
-bar`
-
-	var _ = ``
-	var _ = `foo`
-	var _ =
-	// the next line should remain indented
-	`foo
-bar`
-
-	var _ =	// comment
-	``
-	var _ =	// comment
-	`foo`
-	var _ =	// comment
-	// the next line should remain indented
-	`foo
-bar`
-
-	var _ = /* comment */ ``
-	var _ = /* comment */ `foo`
-	var _ = /* comment */ `foo
-bar`
-
-	var _ =	/* comment */
-	``
-	var _ =	/* comment */
-	`foo`
-	var _ =	/* comment */
-	// the next line should remain indented
-	`foo
-bar`
-
-	var board = []int(
-		`...........
-...........
-....●●●....
-....●●●....
-..●●●●●●●..
-..●●●○●●●..
-..●●●●●●●..
-....●●●....
-....●●●....
-...........
-...........
-`)
-
-	var state = S{
-		"foo",
-		// the next line should remain indented
-		`...........
-...........
-....●●●....
-....●●●....
-..●●●●●●●..
-..●●●○●●●..
-..●●●●●●●..
-....●●●....
-....●●●....
-...........
-...........
-`,
-		"bar",
-	}
-}
-
-func _() {
-	// one-line function literals (body is on a single line)
-	_ = func() {}
-	_ = func() int { return 0 }
-	_ = func(x, y int) bool { m := (x + y) / 2; return m < 0 }
-
-	// multi-line function literals (body is not on one line)
-	_ = func() {
-	}
-	_ = func() int {
-		return 0
-	}
-	_ = func(x, y int) bool {
-		m := (x + y) / 2
-		return x < y
-	}
-
-	f(func() {
-	})
-	f(func() int {
-		return 0
-	})
-	f(func(x, y int) bool {
-		m := (x + y) / 2
-		return x < y
-	})
-}
-
-func _() {
-	_ = [][]int{
-		[]int{1},
-		[]int{1, 2},
-		[]int{1, 2, 3},
-	}
-	_ = [][]int{
-		{1},
-		[]int{1, 2},
-		[]int{1, 2, 3},
-	}
-	_ = [][]int{
-		{1},
-		{1, 2},
-		{1, 2, 3},
-	}
-	_ = [][]int{{1}, {1, 2}, {1, 2, 3}}
-}
-
-// various multi-line expressions
-func _() {
-	// do not add extra indentation to multi-line string lists
-	_ = "foo" + "bar"
-	_ = "foo" +
-		"bar" +
-		"bah"
-	_ = []string{
-		"abc" +
-			"def",
-		"foo" +
-			"bar",
-	}
-}
-
-const _ = F1 +
-	`string = "%s";` +
-	`ptr = *;` +
-	`datafmt.T2 = s ["-" p "-"];`
-
-const _ = `datafmt "datafmt";` +
-	`default = "%v";` +
-	`array = *;` +
-	`datafmt.T3 = s  {" " a a / ","};`
-
-const _ = `datafmt "datafmt";` +
-	`default = "%v";` +
-	`array = *;` +
-	`datafmt.T3 = s  {" " a a / ","};`
-
-func _() {
-	_ = F1 +
-		`string = "%s";` +
-		`ptr = *;` +
-		`datafmt.T2 = s ["-" p "-"];`
-
-	_ =
-		`datafmt "datafmt";` +
-			`default = "%v";` +
-			`array = *;` +
-			`datafmt.T3 = s  {" " a a / ","};`
-
-	_ = `datafmt "datafmt";` +
-		`default = "%v";` +
-		`array = *;` +
-		`datafmt.T3 = s  {" " a a / ","};`
-}
-
-func _() {
-	// respect source lines in multi-line expressions
-	_ = a +
-		b +
-		c
-	_ = a < b ||
-		b < a
-	_ = "933262154439441526816992388562667004907159682643816214685929" +
-		"638952175999932299156089414639761565182862536979208272237582" +
-		"51185210916864000000000000000000000000"	// 100!
-	_ = "170141183460469231731687303715884105727"	// prime
-}
-
-// Alignment after overlong lines
-const (
-	_	= "991"
-	_	= "2432902008176640000"	// 20!
-	_	= "933262154439441526816992388562667004907159682643816214685929" +
-		"638952175999932299156089414639761565182862536979208272237582" +
-		"51185210916864000000000000000000000000"	// 100!
-	_	= "170141183460469231731687303715884105727"	// prime
-)
-
-// Correct placement of operators and comments in multi-line expressions
-func _() {
-	_ = a +	// comment
-		b +	// comment
-		c
-	_ = "a" +
-		"b" +	// comment
-		"c"
-	_ = "ba0408" + "7265717569726564"	// field 71, encoding 2, string "required"
-}
-
-// Correct placement of terminating comma/closing parentheses in multi-line calls.
-func _() {
-	f(1,
-		2,
-		3)
-	f(1,
-		2,
-		3,
-	)
-	f(1,
-		2,
-		3)	// comment
-	f(1,
-		2,
-		3,	// comment
-	)
-	f(1,
-		2,
-		3)	// comment
-	f(1,
-		2,
-		3,	// comment
-	)
-}
-
-// Align comments in multi-line lists of single-line expressions.
-var txpix = [NCOL]draw.Color{
-	draw.Yellow,		// yellow
-	draw.Cyan,		// cyan
-	draw.Green,		// lime green
-	draw.GreyBlue,		// slate
-	draw.Red,		/* red */
-	draw.GreyGreen,		/* olive green */
-	draw.Blue,		/* blue */
-	draw.Color(0xFF55AAFF),	/* pink */
-	draw.Color(0xFFAAFFFF),	/* lavender */
-	draw.Color(0xBB005DFF),	/* maroon */
-}
-
-func same(t, u *Time) bool {
-	// respect source lines in multi-line expressions
-	return t.Year == u.Year &&
-		t.Month == u.Month &&
-		t.Day == u.Day &&
-		t.Hour == u.Hour &&
-		t.Minute == u.Minute &&
-		t.Second == u.Second &&
-		t.Weekday == u.Weekday &&
-		t.ZoneOffset == u.ZoneOffset &&
-		t.Zone == u.Zone
-}
-
-func (p *parser) charClass() {
-	// respect source lines in multi-line expressions
-	if cc.negate && len(cc.ranges) == 2 &&
-		cc.ranges[0] == '\n' && cc.ranges[1] == '\n' {
-		nl := new(_NotNl)
-		p.re.add(nl)
-	}
-}
-
-func addState(s []state, inst instr, match []int) {
-	// handle comments correctly in multi-line expressions
-	for i := 0; i < l; i++ {
-		if s[i].inst.index() == index &&	// same instruction
-			s[i].match[0] < pos {	// earlier match already going; leftmost wins
-			return s
-		}
-	}
-}
-
-func (self *T) foo(x int) *T	{ return self }
-
-func _()	{ module.Func1().Func2() }
-
-func _() {
-	_ = new(T).
-		foo(1).
-		foo(2).
-		foo(3)
-
-	_ = new(T).
-		foo(1).
-		foo(2).	// inline comments
-		foo(3)
-
-	_ = new(T).foo(1).foo(2).foo(3)
-
-	// handle multiline argument list correctly
-	_ = new(T).
-		foo(
-		1).
-		foo(2)
-
-	_ = new(T).foo(
-		1).foo(2)
-
-	_ = Array[3+
-		4]
-
-	_ = Method(1, 2,
-		3)
-
-	_ = new(T).
-		foo().
-		bar().(*Type)
-
-	_ = new(T).
-		foo().
-		bar().(*Type).
-		baz()
-
-	_ = new(T).
-		foo().
-		bar()["idx"]
-
-	_ = new(T).
-		foo().
-		bar()["idx"].
-		baz()
-
-	_ = new(T).
-		foo().
-		bar()[1:2]
-
-	_ = new(T).
-		foo().
-		bar()[1:2].
-		baz()
-
-	_ = new(T).
-		Field.
-		Array[3+
-		4].
-		Table["foo"].
-		Blob.(*Type).
-		Slices[1:4].
-		Method(1, 2,
-		3).
-		Thingy
-
-	_ = a.b.c
-	_ = a.
-		b.
-		c
-	_ = a.b().c
-	_ = a.
-		b().
-		c
-	_ = a.b[0].c
-	_ = a.
-		b[0].
-		c
-	_ = a.b[0:].c
-	_ = a.
-		b[0:].
-		c
-	_ = a.b.(T).c
-	_ = a.
-		b.(T).
-		c
-}
-
-// Don't introduce extra newlines in strangely formatted expression lists.
-func f() {
-	// os.Open parameters should remain on two lines
-	if writer, err = os.Open(outfile, s.O_WRONLY|os.O_CREATE|
-		os.O_TRUNC, 0666); err != nil {
-		log.Fatal(err)
-	}
-}
-
-// Handle multi-line argument lists ending in ... correctly.
-// Was issue 3130.
-func _() {
-	_ = append(s, a...)
-	_ = append(
-		s, a...)
-	_ = append(s,
-		a...)
-	_ = append(
-		s,
-		a...)
-	_ = append(s, a...,
-	)
-	_ = append(s,
-		a...,
-	)
-	_ = append(
-		s,
-		a...,
-	)
-}
-
-// Literal function types in conversions must be parenthesized;
-// for now go/parser accepts the unparenthesized form where it
-// is non-ambiguous.
-func _() {
-	// these conversions should be rewritten to look
-	// the same as the parenthesized conversions below
-	_ = (func())(nil)
-	_ = (func(x int) float)(nil)
-	_ = (func() func() func())(nil)
-
-	_ = (func())(nil)
-	_ = (func(x int) float)(nil)
-	_ = (func() func() func())(nil)
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/expressions.input b/third_party/gofrontend/libgo/go/go/printer/testdata/expressions.input
deleted file mode 100644
index d20a593..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/expressions.input
+++ /dev/null
@@ -1,715 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package expressions
-
-type T struct {
-	x, y, z int
-}
-
-var (
-	a, b, c, d, e int
-	under_bar int
-	longIdentifier1, longIdentifier2, longIdentifier3 int
-	t0, t1, t2 T
-	s string
-	p *int
-)
-
-
-func _() {
-	// no spaces around simple or parenthesized expressions
-	_ = (a+0)
-	_ = a+b
-	_ = a+b+c
-	_ = a+b-c
-	_ = a-b-c
-	_ = a+(b*c)
-	_ = a+(b/c)
-	_ = a-(b%c)
-	_ = 1+a
-	_ = a+1
-	_ = a+b+1
-	_ = s[a]
-	_ = s[a:]
-	_ = s[:b]
-	_ = s[1:2]
-	_ = s[a:b]
-	_ = s[0:len(s)]
-	_ = s[0]<<1
-	_ = (s[0]<<1)&0xf
-	_ = s[0] << 2 | s[1] >> 4
-	_ = "foo"+s
-	_ = s+"foo"
-	_ = 'a'+'b'
-	_ = len(s)/2
-	_ = len(t0.x)/a
-
-	// spaces around expressions of different precedence or expressions containing spaces
-	_ = a + -b
-	_ = a - ^b
-	_ = a / *p
-	_ = a + b*c
-	_ = 1 + b*c
-	_ = a + 2*c
-	_ = a + c*2
-	_ = 1 + 2*3
-	_ = s[1 : 2*3]
-	_ = s[a : b-c]
-	_ = s[0:]
-	_ = s[a+b]
-	_ = s[: b-c]
-	_ = s[a+b :]
-	_ = a[a<<b+1]
-	_ = a[a<<b+1 :]
-	_ = s[a+b : len(s)]
-	_ = s[len(s) : -a]
-	_ = s[a : len(s)+1]
-	_ = s[a : len(s)+1]+s
-
-	// spaces around operators with equal or lower precedence than comparisons
-	_ = a == b
-	_ = a != b
-	_ = a > b
-	_ = a >= b
-	_ = a < b
-	_ = a <= b
-	_ = a < b && c > d
-	_ = a < b || c > d
-
-	// spaces around "long" operands
-	_ = a + longIdentifier1
-	_ = longIdentifier1 + a
-	_ = longIdentifier1 + longIdentifier2 * longIdentifier3
-	_ = s + "a longer string"
-
-	// some selected cases
-	_ = a + t0.x
-	_ = a + t0.x + t1.x * t2.x
-	_ = a + b + c + d + e + 2*3
-	_ = a + b + c + 2*3 + d + e
-	_ = (a+b+c)*2
-	_ = a - b + c - d + (a+b+c) + d&e
-	_ = under_bar-1
-	_ = Open(dpath + "/file", O_WRONLY | O_CREAT, 0666)
-	_ = int(c0&_Mask4)<<18 | int(c1&_Maskx)<<12 | int(c2&_Maskx)<<6 | int(c3&_Maskx)
-
-	// test case for issue 8021
-	// want:
-	//  ([]bool{})[([]int{})[((1)+(((1)+((((1)*(((1)+(1))+(1)))+(1))*(1)))+(1)))]]
-	_ = ([]bool{})[([]int{})[((1) + (((((1) + (((((((1) * (((((1) + (1))) + (1))))) + (1))) * (1))))) + (1))))]]
-
-	// the parser does not restrict expressions that may appear as statements
-	true
-	42
-	"foo"
-	x
-	(x)
-	a+b
-	a+b+c
-	a+(b*c)
-	a+(b/c)
-	1+a
-	a+1
-	s[a]
-	x<<1
-	(s[0]<<1)&0xf
-	"foo"+s
-	x == y
-	x < y || z > 42
-}
-
-
-// slice expressions with cap
-func _() {
-	_ = x[a:b:c]
-	_ = x[a:b:c+d]
-	_ = x[a:b+d:c]
-	_ = x[a:b+d:c+d]
-	_ = x[a+d:b:c]
-	_ = x[a+d:b:c+d]
-	_ = x[a+d:b+d:c]
-	_ = x[a+d:b+d:c+d]
-
-	_ = x[:b:c]
-	_ = x[:b:c+d]
-	_ = x[:b+d:c]
-	_ = x[:b+d:c+d]
-}
-
-func _() {
-	_ = a+b
-	_ = a+b+c
-	_ = a+b*c
-	_ = a+(b*c)
-	_ = (a+b)*c
-	_ = a+(b*c*d)
-	_ = a+(b*c+d)
-
-	_ = 1<<x
-	_ = -1<<x
-	_ = 1<<x-1
-	_ = -1<<x-1
-
-	_ = f(a+b)
-	_ = f(a+b+c)
-	_ = f(a+b*c)
-	_ = f(a+(b*c))
-	_ = f(1<<x-1, 1<<x-2)
-
-	_ = 1<<d.logWindowSize-1
-
-	buf = make(x, 2*cap(b.buf) + n)
-
-	dst[i*3+2] = dbuf[0]<<2
-	dst[i*3+2] = dbuf[0]<<2 | dbuf[1]>>4
-
-	b.buf = b.buf[0:b.off+m+n]
-	b.buf = b.buf[0:b.off+m*n]
-	f(b.buf[0:b.off+m+n])
-
-	signed += ' '*8
-	tw.octal(header[148:155], chksum)
-
-	_ = x > 0 && i >= 0
-
-	x1, x0 := x>>w2, x&m2
-	z0 = t1<<w2+t0
-	z1 = (t1+t0>>w2)>>w2
-	q1, r1 := x1/d1, x1%d1
-	r1 = r1*b2 | x0>>w2
-	x1 = (x1<<z)|(x0>>(uint(w)-z))
-	x1 = x1<<z | x0>>(uint(w)-z)
-
-	_ = buf[0:len(buf)+1]
-	_ = buf[0:n+1]
-
-	a,b = b,a
-	a = b+c
-	a = b*c+d
-	_ = a*b+c
-	_ = a-b-c
-	_ = a-(b-c)
-	_ = a-b*c
-	_ = a-(b*c)
-	_ = a*b/c
-	_ = a/ *b
-	_ = x[a|^b]
-	_ = x[a/ *b]
-	_ = a& ^b
-	_ = a+ +b
-	_ = a- -b
-	_ = x[a*-b]
-	_ = x[a+ +b]
-	_ = x^y^z
-	_ = b[a>>24] ^ b[(a>>16)&0xFF] ^ b[(a>>8)&0xFF] ^ b[a&0xFF]
-	_ = len(longVariableName)*2
-
-	_ = token(matchType + xlength<<lengthShift + xoffset)
-}
-
-
-func f(x int, args ...int) {
-	f(0, args...)
-	f(1, args)
-	f(2, args[0])
-
-	// make sure syntactically legal code remains syntactically legal
-	f(3, 42 ...) // a blank must remain between 42 and ...
-	f(4, 42. ...)
-	f(5, 42....)
-	f(6, 42.0 ...)
-	f(7, 42.0...)
-	f(8, .42 ...)
-	f(9, .42...)
-	f(10, 42e0 ...)
-	f(11, 42e0...)
-
-	_ = 42 .x // a blank must remain between 42 and .x
-	_ = 42. .x
-	_ = 42..x
-	_ = 42.0 .x
-	_ = 42.0.x
-	_ = .42 .x
-	_ = .42.x
-	_ = 42e0 .x
-	_ = 42e0.x
-
-	// a blank must remain between the binary operator and the 2nd operand
-	_ = x/ *y
-	_ = x< -1
-	_ = x< <-1
-	_ = x+ +1
-	_ = x- -1
-	_ = x& &x
-	_ = x& ^x
-
-	_ = f(x/ *y, x< -1, x< <-1, x+ +1, x- -1, x& &x, x& ^x)
-}
-
-
-func _() {
-	_ = T{}
-	_ = struct{}{}
-	_ = [10]T{}
-	_ = [...]T{}
-	_ = []T{}
-	_ = map[int]T{}
-}
-
-
-// one-line structs/interfaces in composite literals (up to a threshold)
-func _() {
-	_ = struct{}{}
-	_ = struct{ x int }{0}
-	_ = struct{ x, y, z int }{0, 1, 2}
-	_ = struct{ int }{0}
-	_ = struct{ s struct { int } }{struct{ int}{0} }
-}
-
-
-func _() {
-	// do not modify literals
-	_ = "tab1	tab2	tab3	end"  // string contains 3 tabs
-	_ = "tab1 tab2 tab3 end"  // same string with 3 blanks - may be unaligned because editors see tabs in strings
-	_ = ""  // this comment should be aligned with the one on the previous line
-	_ = ``
-	_ = `
-`
-_ = `foo
-		bar`
-	_ = `three spaces before the end of the line starting here:   
-they must not be removed`
-}
-
-
-func _() {
-	// smart handling of indentation for multi-line raw strings
-	var _ = ``
-	var _ = `foo`
-	var _ = `foo
-bar`
-
-
-var _ =
-	``
-var _ =
-	`foo`
-var _ =
-	// the next line should remain indented
-	`foo
-bar`
-
-
-	var _ = // comment
-		``
-	var _ = // comment
-		`foo`
-	var _ = // comment
-		// the next line should remain indented
-		`foo
-bar`
-
-
-var _ = /* comment */ ``
-var _ = /* comment */ `foo`
-var _ = /* comment */ `foo
-bar`
-
-
-	var _ = /* comment */
-		``
-	var _ = /* comment */
-		`foo`
-	var _ = /* comment */
-		// the next line should remain indented
-		`foo
-bar`
-
-
-var board = []int(
-	`...........
-...........
-....●●●....
-....●●●....
-..●●●●●●●..
-..●●●○●●●..
-..●●●●●●●..
-....●●●....
-....●●●....
-...........
-...........
-`)
-
-
-	var state = S{
-		"foo",
-		// the next line should remain indented
-		`...........
-...........
-....●●●....
-....●●●....
-..●●●●●●●..
-..●●●○●●●..
-..●●●●●●●..
-....●●●....
-....●●●....
-...........
-...........
-`,
-		"bar",
-	}
-}
-
-
-func _() {
-	// one-line function literals (body is on a single line)
-	_ = func() {}
-	_ = func() int { return 0 }
-	_ = func(x, y int) bool { m := (x+y)/2; return m < 0 }
-
-	// multi-line function literals (body is not on one line)
-	_ = func() {
-	}
-	_ = func() int {
-		return 0
-	}
-	_ = func(x, y int) bool {
-		m := (x+y)/2; return x < y }
-
-	f(func() {
-	})
-	f(func() int {
-		return 0
-	})
-	f(func(x, y int) bool {
-		m := (x+y)/2; return x < y })
-}
-
-
-func _() {
-	_ = [][]int {
-		[]int{1},
-		[]int{1, 2},
-		[]int{1, 2, 3},
-	}
-	_ = [][]int {
-		{1},
-		[]int{1, 2},
-		[]int{1, 2, 3},
-	}
-	_ = [][]int {
-		{1},
-		{1, 2},
-		{1, 2, 3},
-	}
-	_ = [][]int {{1}, {1, 2}, {1, 2, 3}}
-}
-
-
-// various multi-line expressions
-func _() {
-	// do not add extra indentation to multi-line string lists
-	_ = "foo" + "bar"
-	_ = "foo" +
-	"bar" +
-	"bah"
-	_ = []string {
-		"abc" +
-		"def",
-		"foo" +
-		"bar",
-	}
-}
-
-
-const _ = F1 +
-	`string = "%s";` +
-	`ptr = *;` +
-	`datafmt.T2 = s ["-" p "-"];`
-
-
-const _ =
-	`datafmt "datafmt";` +
-	`default = "%v";` +
-	`array = *;` +
-	`datafmt.T3 = s  {" " a a / ","};`
-
-
-const _ = `datafmt "datafmt";` +
-`default = "%v";` +
-`array = *;` +
-`datafmt.T3 = s  {" " a a / ","};`
-
-
-func _() {
-	_ = F1 +
-		`string = "%s";` +
-		`ptr = *;` +
-		`datafmt.T2 = s ["-" p "-"];`
-
-	_ =
-		`datafmt "datafmt";` +
-		`default = "%v";` +
-		`array = *;` +
-		`datafmt.T3 = s  {" " a a / ","};`
-
-	_ = `datafmt "datafmt";` +
-	`default = "%v";` +
-	`array = *;` +
-	`datafmt.T3 = s  {" " a a / ","};`
-}
-
-
-func _() {
-	// respect source lines in multi-line expressions
-	_ = a+
-	b+
-	c
-	_ = a < b ||
-		b < a
-	_ = "933262154439441526816992388562667004907159682643816214685929" +
-	"638952175999932299156089414639761565182862536979208272237582" +
-	"51185210916864000000000000000000000000"  // 100!
-	_ = "170141183460469231731687303715884105727"  // prime
-}
-
-
-// Alignment after overlong lines
-const (
-	_ = "991"
-	_ = "2432902008176640000"  // 20!
-	_ = "933262154439441526816992388562667004907159682643816214685929" +
-	"638952175999932299156089414639761565182862536979208272237582" +
-	"51185210916864000000000000000000000000"  // 100!
-	_ = "170141183460469231731687303715884105727"  // prime
-)
-
-
-// Correct placement of operators and comments in multi-line expressions
-func _() {
-	_ = a +  // comment
-		b +  // comment
-		c
-	_ = "a"	+
-		"b" +	// comment
-		"c"
-	_ = "ba0408" + "7265717569726564"     // field 71, encoding 2, string "required"
-}
-
-
-// Correct placement of terminating comma/closing parentheses in multi-line calls.
-func _() {
-	f(1,
-		2,
-		3)
-	f(1,
-		2,
-		3,
-	)
-	f(1,
-		2,
-		3)  // comment
-	f(1,
-		2,
-		3,  // comment
-	)
-	f(1,
-		2,
-		3)// comment
-	f(1,
-		2,
-		3,// comment
-	)
-}
-
-
-// Align comments in multi-line lists of single-line expressions.
-var txpix = [NCOL]draw.Color{
-	draw.Yellow, // yellow
-	draw.Cyan, // cyan
-	draw.Green, // lime green
-	draw.GreyBlue, // slate
-	draw.Red, /* red */
-	draw.GreyGreen, /* olive green */
-	draw.Blue, /* blue */
-	draw.Color(0xFF55AAFF), /* pink */
-	draw.Color(0xFFAAFFFF), /* lavender */
-	draw.Color(0xBB005DFF), /* maroon */
-}
-
-
-func same(t, u *Time) bool {
-	// respect source lines in multi-line expressions
-	return t.Year == u.Year &&
-		t.Month == u.Month &&
-		t.Day == u.Day &&
-		t.Hour == u.Hour &&
-		t.Minute == u.Minute &&
-		t.Second == u.Second &&
-		t.Weekday == u.Weekday &&
-		t.ZoneOffset == u.ZoneOffset &&
-		t.Zone == u.Zone
-}
-
-
-func (p *parser) charClass() {
-	// respect source lines in multi-line expressions
-	if cc.negate && len(cc.ranges) == 2 &&
-		cc.ranges[0] == '\n' && cc.ranges[1] == '\n' {
-		nl := new(_NotNl)
-		p.re.add(nl)
-	}
-}
-
-
-func addState(s []state, inst instr, match []int) {
-	// handle comments correctly in multi-line expressions
-	for i := 0; i < l; i++ {
-		if s[i].inst.index() == index && // same instruction
-		   s[i].match[0] < pos {	// earlier match already going; leftmost wins
-		   	return s
-		 }
-	}
-}
-
-func (self *T) foo(x int) *T { return self }
-
-func _() { module.Func1().Func2() }
-
-func _() {
-	_ = new(T).
-		foo(1).
-			foo(2).
-		foo(3)
-
-	_ = new(T).
-	foo(1).
-	foo(2). // inline comments
-	foo(3)
-
-	_ = new(T).foo(1).foo(2).foo(3)
-
-	// handle multiline argument list correctly
-	_ = new(T).
-	foo(
-		1).
-		foo(2)
-
-	_ = new(T).foo(
-		1).foo(2)
-
-	_ = Array[3 +
-4]
-
-	_ = Method(1, 2,
-		3)
-
-	_ = new(T).
-   foo().
-   bar() . (*Type)
-
-	_ = new(T).
-foo().
-bar().(*Type).
-baz()
-
-	_ = new(T).
-	foo().
-	bar()["idx"]
-
-	_ = new(T).
-	foo().
-	bar()["idx"]	.
-	baz()
-
-	_ = new(T).
-	foo().
-	bar()[1:2]
-
-	_ = new(T).
-	foo().
-	bar()[1:2].
-	baz()
-
-	_ = new(T).
-		Field.
-		Array[3+
-       		4].
-		Table ["foo"].
-		Blob. (*Type).
-	Slices[1:4].
-	Method(1, 2,
-	3).
-		Thingy
-
-	_ = a.b.c
-	_ = a.
-	b.
-	c
-	_ = a.b().c
-	_ = a.
-	b().
-	c
-	_ = a.b[0].c
-	_ = a.
-	b[0].
-	c
-	_ = a.b[0:].c
-	_ = a.
-	b[0:].
-	c
-	_ = a.b.(T).c
-	_ = a.
-	b.
-	(T).
-	c
-}
-
-
-// Don't introduce extra newlines in strangely formatted expression lists.
-func f() {
-	// os.Open parameters should remain on two lines
-	if writer, err = os.Open(outfile, s.O_WRONLY|os.O_CREATE|
-		os.O_TRUNC, 0666); err != nil {
-	    log.Fatal(err)
-	}
-}
-
-// Handle multi-line argument lists ending in ... correctly.
-// Was issue 3130.
-func _() {
-	_ = append(s, a...)
-	_ = append(
-		s, a...)
-	_ = append(s,
-		a...)
-	_ = append(
-		s,
-		a...)
-	_ = append(s, a...,
-	)
-	_ = append(s,
-		a...,
-	)
-	_ = append(
-		s,
-		a...,
-	)
-}
-
-// Literal function types in conversions must be parenthesized;
-// for now go/parser accepts the unparenthesized form where it
-// is non-ambiguous.
-func _() {
-	// these conversions should be rewritten to look
-	// the same as the parenthesized conversions below
-	_ = func()()(nil)
-	_ = func(x int)(float)(nil)
-	_ = func() func() func()()(nil)
-
-	_ = (func()())(nil)
-	_ = (func(x int)(float))(nil)
-	_ = (func() func() func()())(nil)
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/expressions.raw b/third_party/gofrontend/libgo/go/go/printer/testdata/expressions.raw
deleted file mode 100644
index 2357336..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/expressions.raw
+++ /dev/null
@@ -1,686 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package expressions
-
-type T struct {
-	x, y, z int
-}
-
-var (
-	a, b, c, d, e	int
-	under_bar	int
-	longIdentifier1, longIdentifier2, longIdentifier3	int
-	t0, t1, t2	T
-	s	string
-	p	*int
-)
-
-func _() {
-	// no spaces around simple or parenthesized expressions
-	_ = (a + 0)
-	_ = a + b
-	_ = a + b + c
-	_ = a + b - c
-	_ = a - b - c
-	_ = a + (b * c)
-	_ = a + (b / c)
-	_ = a - (b % c)
-	_ = 1 + a
-	_ = a + 1
-	_ = a + b + 1
-	_ = s[a]
-	_ = s[a:]
-	_ = s[:b]
-	_ = s[1:2]
-	_ = s[a:b]
-	_ = s[0:len(s)]
-	_ = s[0] << 1
-	_ = (s[0] << 1) & 0xf
-	_ = s[0]<<2 | s[1]>>4
-	_ = "foo" + s
-	_ = s + "foo"
-	_ = 'a' + 'b'
-	_ = len(s) / 2
-	_ = len(t0.x) / a
-
-	// spaces around expressions of different precedence or expressions containing spaces
-	_ = a + -b
-	_ = a - ^b
-	_ = a / *p
-	_ = a + b*c
-	_ = 1 + b*c
-	_ = a + 2*c
-	_ = a + c*2
-	_ = 1 + 2*3
-	_ = s[1 : 2*3]
-	_ = s[a : b-c]
-	_ = s[0:]
-	_ = s[a+b]
-	_ = s[:b-c]
-	_ = s[a+b:]
-	_ = a[a<<b+1]
-	_ = a[a<<b+1:]
-	_ = s[a+b : len(s)]
-	_ = s[len(s):-a]
-	_ = s[a : len(s)+1]
-	_ = s[a:len(s)+1] + s
-
-	// spaces around operators with equal or lower precedence than comparisons
-	_ = a == b
-	_ = a != b
-	_ = a > b
-	_ = a >= b
-	_ = a < b
-	_ = a <= b
-	_ = a < b && c > d
-	_ = a < b || c > d
-
-	// spaces around "long" operands
-	_ = a + longIdentifier1
-	_ = longIdentifier1 + a
-	_ = longIdentifier1 + longIdentifier2*longIdentifier3
-	_ = s + "a longer string"
-
-	// some selected cases
-	_ = a + t0.x
-	_ = a + t0.x + t1.x*t2.x
-	_ = a + b + c + d + e + 2*3
-	_ = a + b + c + 2*3 + d + e
-	_ = (a + b + c) * 2
-	_ = a - b + c - d + (a + b + c) + d&e
-	_ = under_bar - 1
-	_ = Open(dpath+"/file", O_WRONLY|O_CREAT, 0666)
-	_ = int(c0&_Mask4)<<18 | int(c1&_Maskx)<<12 | int(c2&_Maskx)<<6 | int(c3&_Maskx)
-
-	// test case for issue 8021
-	// want:
-	//  ([]bool{})[([]int{})[((1)+(((1)+((((1)*(((1)+(1))+(1)))+(1))*(1)))+(1)))]]
-	_ = ([]bool{})[([]int{})[((1)+(((1)+((((1)*(((1)+(1))+(1)))+(1))*(1)))+(1)))]]
-
-	// the parser does not restrict expressions that may appear as statements
-	true
-	42
-	"foo"
-	x
-	(x)
-	a + b
-	a + b + c
-	a + (b * c)
-	a + (b / c)
-	1 + a
-	a + 1
-	s[a]
-	x << 1
-	(s[0] << 1) & 0xf
-	"foo" + s
-	x == y
-	x < y || z > 42
-}
-
-// slice expressions with cap
-func _() {
-	_ = x[a:b:c]
-	_ = x[a:b : c+d]
-	_ = x[a : b+d : c]
-	_ = x[a : b+d : c+d]
-	_ = x[a+d : b:c]
-	_ = x[a+d : b : c+d]
-	_ = x[a+d : b+d : c]
-	_ = x[a+d : b+d : c+d]
-
-	_ = x[:b:c]
-	_ = x[:b : c+d]
-	_ = x[:b+d : c]
-	_ = x[:b+d : c+d]
-}
-
-func _() {
-	_ = a + b
-	_ = a + b + c
-	_ = a + b*c
-	_ = a + (b * c)
-	_ = (a + b) * c
-	_ = a + (b * c * d)
-	_ = a + (b*c + d)
-
-	_ = 1 << x
-	_ = -1 << x
-	_ = 1<<x - 1
-	_ = -1<<x - 1
-
-	_ = f(a + b)
-	_ = f(a + b + c)
-	_ = f(a + b*c)
-	_ = f(a + (b * c))
-	_ = f(1<<x-1, 1<<x-2)
-
-	_ = 1<<d.logWindowSize - 1
-
-	buf = make(x, 2*cap(b.buf)+n)
-
-	dst[i*3+2] = dbuf[0] << 2
-	dst[i*3+2] = dbuf[0]<<2 | dbuf[1]>>4
-
-	b.buf = b.buf[0 : b.off+m+n]
-	b.buf = b.buf[0 : b.off+m*n]
-	f(b.buf[0 : b.off+m+n])
-
-	signed += ' ' * 8
-	tw.octal(header[148:155], chksum)
-
-	_ = x > 0 && i >= 0
-
-	x1, x0 := x>>w2, x&m2
-	z0 = t1<<w2 + t0
-	z1 = (t1 + t0>>w2) >> w2
-	q1, r1 := x1/d1, x1%d1
-	r1 = r1*b2 | x0>>w2
-	x1 = (x1 << z) | (x0 >> (uint(w) - z))
-	x1 = x1<<z | x0>>(uint(w)-z)
-
-	_ = buf[0 : len(buf)+1]
-	_ = buf[0 : n+1]
-
-	a, b = b, a
-	a = b + c
-	a = b*c + d
-	_ = a*b + c
-	_ = a - b - c
-	_ = a - (b - c)
-	_ = a - b*c
-	_ = a - (b * c)
-	_ = a * b / c
-	_ = a / *b
-	_ = x[a|^b]
-	_ = x[a / *b]
-	_ = a & ^b
-	_ = a + +b
-	_ = a - -b
-	_ = x[a*-b]
-	_ = x[a + +b]
-	_ = x ^ y ^ z
-	_ = b[a>>24] ^ b[(a>>16)&0xFF] ^ b[(a>>8)&0xFF] ^ b[a&0xFF]
-	_ = len(longVariableName) * 2
-
-	_ = token(matchType + xlength<<lengthShift + xoffset)
-}
-
-func f(x int, args ...int) {
-	f(0, args...)
-	f(1, args)
-	f(2, args[0])
-
-	// make sure syntactically legal code remains syntactically legal
-	f(3, 42 ...)	// a blank must remain between 42 and ...
-	f(4, 42....)
-	f(5, 42....)
-	f(6, 42.0...)
-	f(7, 42.0...)
-	f(8, .42...)
-	f(9, .42...)
-	f(10, 42e0...)
-	f(11, 42e0...)
-
-	_ = 42 .x	// a blank must remain between 42 and .x
-	_ = 42..x
-	_ = 42..x
-	_ = 42.0.x
-	_ = 42.0.x
-	_ = .42.x
-	_ = .42.x
-	_ = 42e0.x
-	_ = 42e0.x
-
-	// a blank must remain between the binary operator and the 2nd operand
-	_ = x / *y
-	_ = x < -1
-	_ = x < <-1
-	_ = x + +1
-	_ = x - -1
-	_ = x & &x
-	_ = x & ^x
-
-	_ = f(x / *y, x < -1, x < <-1, x + +1, x - -1, x & &x, x & ^x)
-}
-
-func _() {
-	_ = T{}
-	_ = struct{}{}
-	_ = [10]T{}
-	_ = [...]T{}
-	_ = []T{}
-	_ = map[int]T{}
-}
-
-// one-line structs/interfaces in composite literals (up to a threshold)
-func _() {
-	_ = struct{}{}
-	_ = struct{ x int }{0}
-	_ = struct{ x, y, z int }{0, 1, 2}
-	_ = struct{ int }{0}
-	_ = struct{ s struct{ int } }{struct{ int }{0}}
-}
-
-func _() {
-	// do not modify literals
-	_ = "tab1	tab2	tab3	end"	// string contains 3 tabs
-	_ = "tab1 tab2 tab3 end"	// same string with 3 blanks - may be unaligned because editors see tabs in strings
-	_ = ""	// this comment should be aligned with the one on the previous line
-	_ = ``
-	_ = `
-`
-	_ = `foo
-		bar`
-	_ = `three spaces before the end of the line starting here:   
-they must not be removed`
-}
-
-func _() {
-	// smart handling of indentation for multi-line raw strings
-	var _ = ``
-	var _ = `foo`
-	var _ = `foo
-bar`
-
-	var _ = ``
-	var _ = `foo`
-	var _ =
-	// the next line should remain indented
-	`foo
-bar`
-
-	var _ =	// comment
-	``
-	var _ =	// comment
-	`foo`
-	var _ =	// comment
-	// the next line should remain indented
-	`foo
-bar`
-
-	var _ = /* comment */ ``
-	var _ = /* comment */ `foo`
-	var _ = /* comment */ `foo
-bar`
-
-	var _ =	/* comment */
-	``
-	var _ =	/* comment */
-	`foo`
-	var _ =	/* comment */
-	// the next line should remain indented
-	`foo
-bar`
-
-	var board = []int(
-		`...........
-...........
-....●●●....
-....●●●....
-..●●●●●●●..
-..●●●○●●●..
-..●●●●●●●..
-....●●●....
-....●●●....
-...........
-...........
-`)
-
-	var state = S{
-		"foo",
-		// the next line should remain indented
-		`...........
-...........
-....●●●....
-....●●●....
-..●●●●●●●..
-..●●●○●●●..
-..●●●●●●●..
-....●●●....
-....●●●....
-...........
-...........
-`,
-		"bar",
-	}
-}
-
-func _() {
-	// one-line function literals (body is on a single line)
-	_ = func() {}
-	_ = func() int { return 0 }
-	_ = func(x, y int) bool { m := (x + y) / 2; return m < 0 }
-
-	// multi-line function literals (body is not on one line)
-	_ = func() {
-	}
-	_ = func() int {
-		return 0
-	}
-	_ = func(x, y int) bool {
-		m := (x + y) / 2
-		return x < y
-	}
-
-	f(func() {
-	})
-	f(func() int {
-		return 0
-	})
-	f(func(x, y int) bool {
-		m := (x + y) / 2
-		return x < y
-	})
-}
-
-func _() {
-	_ = [][]int{
-		[]int{1},
-		[]int{1, 2},
-		[]int{1, 2, 3},
-	}
-	_ = [][]int{
-		{1},
-		[]int{1, 2},
-		[]int{1, 2, 3},
-	}
-	_ = [][]int{
-		{1},
-		{1, 2},
-		{1, 2, 3},
-	}
-	_ = [][]int{{1}, {1, 2}, {1, 2, 3}}
-}
-
-// various multi-line expressions
-func _() {
-	// do not add extra indentation to multi-line string lists
-	_ = "foo" + "bar"
-	_ = "foo" +
-		"bar" +
-		"bah"
-	_ = []string{
-		"abc" +
-			"def",
-		"foo" +
-			"bar",
-	}
-}
-
-const _ = F1 +
-	`string = "%s";` +
-	`ptr = *;` +
-	`datafmt.T2 = s ["-" p "-"];`
-
-const _ = `datafmt "datafmt";` +
-	`default = "%v";` +
-	`array = *;` +
-	`datafmt.T3 = s  {" " a a / ","};`
-
-const _ = `datafmt "datafmt";` +
-	`default = "%v";` +
-	`array = *;` +
-	`datafmt.T3 = s  {" " a a / ","};`
-
-func _() {
-	_ = F1 +
-		`string = "%s";` +
-		`ptr = *;` +
-		`datafmt.T2 = s ["-" p "-"];`
-
-	_ =
-		`datafmt "datafmt";` +
-			`default = "%v";` +
-			`array = *;` +
-			`datafmt.T3 = s  {" " a a / ","};`
-
-	_ = `datafmt "datafmt";` +
-		`default = "%v";` +
-		`array = *;` +
-		`datafmt.T3 = s  {" " a a / ","};`
-}
-
-func _() {
-	// respect source lines in multi-line expressions
-	_ = a +
-		b +
-		c
-	_ = a < b ||
-		b < a
-	_ = "933262154439441526816992388562667004907159682643816214685929" +
-		"638952175999932299156089414639761565182862536979208272237582" +
-		"51185210916864000000000000000000000000"	// 100!
-	_ = "170141183460469231731687303715884105727"	// prime
-}
-
-// Alignment after overlong lines
-const (
-	_	= "991"
-	_	= "2432902008176640000"		// 20!
-	_	= "933262154439441526816992388562667004907159682643816214685929" +
-		"638952175999932299156089414639761565182862536979208272237582" +
-		"51185210916864000000000000000000000000"	// 100!
-	_	= "170141183460469231731687303715884105727"		// prime
-)
-
-// Correct placement of operators and comments in multi-line expressions
-func _() {
-	_ = a +	// comment
-		b +	// comment
-		c
-	_ = "a" +
-		"b" +	// comment
-		"c"
-	_ = "ba0408" + "7265717569726564"	// field 71, encoding 2, string "required"
-}
-
-// Correct placement of terminating comma/closing parentheses in multi-line calls.
-func _() {
-	f(1,
-		2,
-		3)
-	f(1,
-		2,
-		3,
-	)
-	f(1,
-		2,
-		3)	// comment
-	f(1,
-		2,
-		3,	// comment
-	)
-	f(1,
-		2,
-		3)	// comment
-	f(1,
-		2,
-		3,	// comment
-	)
-}
-
-// Align comments in multi-line lists of single-line expressions.
-var txpix = [NCOL]draw.Color{
-	draw.Yellow,	// yellow
-	draw.Cyan,	// cyan
-	draw.Green,	// lime green
-	draw.GreyBlue,	// slate
-	draw.Red,	/* red */
-	draw.GreyGreen,	/* olive green */
-	draw.Blue,	/* blue */
-	draw.Color(0xFF55AAFF),	/* pink */
-	draw.Color(0xFFAAFFFF),	/* lavender */
-	draw.Color(0xBB005DFF),	/* maroon */
-}
-
-func same(t, u *Time) bool {
-	// respect source lines in multi-line expressions
-	return t.Year == u.Year &&
-		t.Month == u.Month &&
-		t.Day == u.Day &&
-		t.Hour == u.Hour &&
-		t.Minute == u.Minute &&
-		t.Second == u.Second &&
-		t.Weekday == u.Weekday &&
-		t.ZoneOffset == u.ZoneOffset &&
-		t.Zone == u.Zone
-}
-
-func (p *parser) charClass() {
-	// respect source lines in multi-line expressions
-	if cc.negate && len(cc.ranges) == 2 &&
-		cc.ranges[0] == '\n' && cc.ranges[1] == '\n' {
-		nl := new(_NotNl)
-		p.re.add(nl)
-	}
-}
-
-func addState(s []state, inst instr, match []int) {
-	// handle comments correctly in multi-line expressions
-	for i := 0; i < l; i++ {
-		if s[i].inst.index() == index &&	// same instruction
-			s[i].match[0] < pos {	// earlier match already going; leftmost wins
-			return s
-		}
-	}
-}
-
-func (self *T) foo(x int) *T	{ return self }
-
-func _()	{ module.Func1().Func2() }
-
-func _() {
-	_ = new(T).
-		foo(1).
-		foo(2).
-		foo(3)
-
-	_ = new(T).
-		foo(1).
-		foo(2).	// inline comments
-		foo(3)
-
-	_ = new(T).foo(1).foo(2).foo(3)
-
-	// handle multiline argument list correctly
-	_ = new(T).
-		foo(
-		1).
-		foo(2)
-
-	_ = new(T).foo(
-		1).foo(2)
-
-	_ = Array[3+
-		4]
-
-	_ = Method(1, 2,
-		3)
-
-	_ = new(T).
-		foo().
-		bar().(*Type)
-
-	_ = new(T).
-		foo().
-		bar().(*Type).
-		baz()
-
-	_ = new(T).
-		foo().
-		bar()["idx"]
-
-	_ = new(T).
-		foo().
-		bar()["idx"].
-		baz()
-
-	_ = new(T).
-		foo().
-		bar()[1:2]
-
-	_ = new(T).
-		foo().
-		bar()[1:2].
-		baz()
-
-	_ = new(T).
-		Field.
-		Array[3+
-		4].
-		Table["foo"].
-		Blob.(*Type).
-		Slices[1:4].
-		Method(1, 2,
-		3).
-		Thingy
-
-	_ = a.b.c
-	_ = a.
-		b.
-		c
-	_ = a.b().c
-	_ = a.
-		b().
-		c
-	_ = a.b[0].c
-	_ = a.
-		b[0].
-		c
-	_ = a.b[0:].c
-	_ = a.
-		b[0:].
-		c
-	_ = a.b.(T).c
-	_ = a.
-		b.(T).
-		c
-}
-
-// Don't introduce extra newlines in strangely formatted expression lists.
-func f() {
-	// os.Open parameters should remain on two lines
-	if writer, err = os.Open(outfile, s.O_WRONLY|os.O_CREATE|
-		os.O_TRUNC, 0666); err != nil {
-		log.Fatal(err)
-	}
-}
-
-// Handle multi-line argument lists ending in ... correctly.
-// Was issue 3130.
-func _() {
-	_ = append(s, a...)
-	_ = append(
-		s, a...)
-	_ = append(s,
-		a...)
-	_ = append(
-		s,
-		a...)
-	_ = append(s, a...,
-	)
-	_ = append(s,
-		a...,
-	)
-	_ = append(
-		s,
-		a...,
-	)
-}
-
-// Literal function types in conversions must be parenthesized;
-// for now go/parser accepts the unparenthesized form where it
-// is non-ambiguous.
-func _() {
-	// these conversions should be rewritten to look
-	// the same as the parenthesized conversions below
-	_ = (func())(nil)
-	_ = (func(x int) float)(nil)
-	_ = (func() func() func())(nil)
-
-	_ = (func())(nil)
-	_ = (func(x int) float)(nil)
-	_ = (func() func() func())(nil)
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/linebreaks.golden b/third_party/gofrontend/libgo/go/go/printer/testdata/linebreaks.golden
deleted file mode 100644
index 006cf17..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/linebreaks.golden
+++ /dev/null
@@ -1,275 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package linebreaks
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"os"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-type writerTestEntry struct {
-	header		*Header
-	contents	string
-}
-
-type writerTest struct {
-	file	string	// filename of expected output
-	entries	[]*writerTestEntry
-}
-
-var writerTests = []*writerTest{
-	&writerTest{
-		file:	"testdata/writer.tar",
-		entries: []*writerTestEntry{
-			&writerTestEntry{
-				header: &Header{
-					Name:		"small.txt",
-					Mode:		0640,
-					Uid:		73025,
-					Gid:		5000,
-					Size:		5,
-					Mtime:		1246508266,
-					Typeflag:	'0',
-					Uname:		"dsymonds",
-					Gname:		"eng",
-				},
-				contents:	"Kilts",
-			},
-			&writerTestEntry{
-				header: &Header{
-					Name:		"small2.txt",
-					Mode:		0640,
-					Uid:		73025,
-					Gid:		5000,
-					Size:		11,
-					Mtime:		1245217492,
-					Typeflag:	'0',
-					Uname:		"dsymonds",
-					Gname:		"eng",
-				},
-				contents:	"Google.com\n",
-			},
-		},
-	},
-	// The truncated test file was produced using these commands:
-	//   dd if=/dev/zero bs=1048576 count=16384 > /tmp/16gig.txt
-	//   tar -b 1 -c -f- /tmp/16gig.txt | dd bs=512 count=8 > writer-big.tar
-	&writerTest{
-		file:	"testdata/writer-big.tar",
-		entries: []*writerTestEntry{
-			&writerTestEntry{
-				header: &Header{
-					Name:		"tmp/16gig.txt",
-					Mode:		0640,
-					Uid:		73025,
-					Gid:		5000,
-					Size:		16 << 30,
-					Mtime:		1254699560,
-					Typeflag:	'0',
-					Uname:		"dsymonds",
-					Gname:		"eng",
-				},
-				// no contents
-			},
-		},
-	},
-}
-
-type untarTest struct {
-	file	string
-	headers	[]*Header
-}
-
-var untarTests = []*untarTest{
-	&untarTest{
-		file:	"testdata/gnu.tar",
-		headers: []*Header{
-			&Header{
-				Name:		"small.txt",
-				Mode:		0640,
-				Uid:		73025,
-				Gid:		5000,
-				Size:		5,
-				Mtime:		1244428340,
-				Typeflag:	'0',
-				Uname:		"dsymonds",
-				Gname:		"eng",
-			},
-			&Header{
-				Name:		"small2.txt",
-				Mode:		0640,
-				Uid:		73025,
-				Gid:		5000,
-				Size:		11,
-				Mtime:		1244436044,
-				Typeflag:	'0',
-				Uname:		"dsymonds",
-				Gname:		"eng",
-			},
-		},
-	},
-	&untarTest{
-		file:	"testdata/star.tar",
-		headers: []*Header{
-			&Header{
-				Name:		"small.txt",
-				Mode:		0640,
-				Uid:		73025,
-				Gid:		5000,
-				Size:		5,
-				Mtime:		1244592783,
-				Typeflag:	'0',
-				Uname:		"dsymonds",
-				Gname:		"eng",
-				Atime:		1244592783,
-				Ctime:		1244592783,
-			},
-			&Header{
-				Name:		"small2.txt",
-				Mode:		0640,
-				Uid:		73025,
-				Gid:		5000,
-				Size:		11,
-				Mtime:		1244592783,
-				Typeflag:	'0',
-				Uname:		"dsymonds",
-				Gname:		"eng",
-				Atime:		1244592783,
-				Ctime:		1244592783,
-			},
-		},
-	},
-	&untarTest{
-		file:	"testdata/v7.tar",
-		headers: []*Header{
-			&Header{
-				Name:		"small.txt",
-				Mode:		0444,
-				Uid:		73025,
-				Gid:		5000,
-				Size:		5,
-				Mtime:		1244593104,
-				Typeflag:	'\x00',
-			},
-			&Header{
-				Name:		"small2.txt",
-				Mode:		0444,
-				Uid:		73025,
-				Gid:		5000,
-				Size:		11,
-				Mtime:		1244593104,
-				Typeflag:	'\x00',
-			},
-		},
-	},
-}
-
-var facts = map[int]string{
-	0:	"1",
-	1:	"1",
-	2:	"2",
-	10:	"3628800",
-	20:	"2432902008176640000",
-	100: "933262154439441526816992388562667004907159682643816214685929" +
-		"638952175999932299156089414639761565182862536979208272237582" +
-		"51185210916864000000000000000000000000",
-}
-
-func usage() {
-	fmt.Fprintf(os.Stderr,
-		// TODO(gri): the 2nd string of this string list should not be indented
-		"usage: godoc package [name ...]\n"+
-			"	godoc -http=:6060\n")
-	flag.PrintDefaults()
-	os.Exit(2)
-}
-
-func TestReader(t *testing.T) {
-testLoop:
-	for i, test := range untarTests {
-		f, err := os.Open(test.file, os.O_RDONLY, 0444)
-		if err != nil {
-			t.Errorf("test %d: Unexpected error: %v", i, err)
-			continue
-		}
-		tr := NewReader(f)
-		for j, header := range test.headers {
-			hdr, err := tr.Next()
-			if err != nil || hdr == nil {
-				t.Errorf("test %d, entry %d: Didn't get entry: %v", i, j, err)
-				f.Close()
-				continue testLoop
-			}
-			if !reflect.DeepEqual(hdr, header) {
-				t.Errorf("test %d, entry %d: Incorrect header:\nhave %+v\nwant %+v",
-					i, j, *hdr, *header)
-			}
-		}
-		hdr, err := tr.Next()
-		if hdr != nil || err != nil {
-			t.Errorf("test %d: Unexpected entry or error: hdr=%v err=%v", i, err)
-		}
-		f.Close()
-	}
-}
-
-// Respect line breaks in function calls.
-func _() {
-	f(x)
-	f(x,
-		x)
-	f(x,
-		x,
-	)
-	f(
-		x,
-		x)
-	f(
-		x,
-		x,
-	)
-}
-
-// Respect line breaks in function declarations.
-func _(x T)	{}
-func _(x T,
-	y T) {
-}
-func _(x T,
-	y T,
-) {
-}
-func _(
-	x T,
-	y T) {
-}
-func _(
-	x T,
-	y T,
-) {
-}
-
-// Example from issue 2597.
-func ManageStatus0(
-	in <-chan *Status,
-	req <-chan Request,
-	stat chan<- *TargetInfo,
-	TargetHistorySize int) {
-}
-
-func ManageStatus1(
-	in <-chan *Status,
-	req <-chan Request,
-	stat chan<- *TargetInfo,
-	TargetHistorySize int,
-) {
-}
-
-// There should be exactly one linebreak after this comment.
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/linebreaks.input b/third_party/gofrontend/libgo/go/go/printer/testdata/linebreaks.input
deleted file mode 100644
index e782bb0..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/linebreaks.input
+++ /dev/null
@@ -1,271 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package linebreaks
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"os"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-type writerTestEntry struct {
-	header *Header
-	contents string
-}
-
-type writerTest struct {
-	file string  // filename of expected output
-	entries []*writerTestEntry
-}
-
-var writerTests = []*writerTest{
-	&writerTest{
-		file: "testdata/writer.tar",
-		entries: []*writerTestEntry{
-			&writerTestEntry{
-				header: &Header{
-					Name: "small.txt",
-					Mode: 0640,
-					Uid: 73025,
-					Gid: 5000,
-					Size: 5,
-					Mtime: 1246508266,
-					Typeflag: '0',
-					Uname: "dsymonds",
-					Gname: "eng",
-				},
-				contents: "Kilts",
-			},
-			&writerTestEntry{
-				header: &Header{
-					Name: "small2.txt",
-					Mode: 0640,
-					Uid: 73025,
-					Gid: 5000,
-					Size: 11,
-					Mtime: 1245217492,
-					Typeflag: '0',
-					Uname: "dsymonds",
-					Gname: "eng",
-				},
-				contents: "Google.com\n",
-			},
-		},
-	},
-	// The truncated test file was produced using these commands:
-	//   dd if=/dev/zero bs=1048576 count=16384 > /tmp/16gig.txt
-	//   tar -b 1 -c -f- /tmp/16gig.txt | dd bs=512 count=8 > writer-big.tar
-	&writerTest{
-		file: "testdata/writer-big.tar",
-		entries: []*writerTestEntry{
-			&writerTestEntry{
-				header: &Header{
-					Name: "tmp/16gig.txt",
-					Mode: 0640,
-					Uid: 73025,
-					Gid: 5000,
-					Size: 16 << 30,
-					Mtime: 1254699560,
-					Typeflag: '0',
-					Uname: "dsymonds",
-					Gname: "eng",
-				},
-				// no contents
-			},
-		},
-	},
-}
-
-type untarTest struct {
-	file string
-	headers []*Header
-}
-
-var untarTests = []*untarTest{
-	&untarTest{
-		file: "testdata/gnu.tar",
-		headers: []*Header{
-			&Header{
-				Name: "small.txt",
-				Mode: 0640,
-				Uid: 73025,
-				Gid: 5000,
-				Size: 5,
-				Mtime: 1244428340,
-				Typeflag: '0',
-				Uname: "dsymonds",
-				Gname: "eng",
-			},
-			&Header{
-				Name: "small2.txt",
-				Mode: 0640,
-				Uid: 73025,
-				Gid: 5000,
-				Size: 11,
-				Mtime: 1244436044,
-				Typeflag: '0',
-				Uname: "dsymonds",
-				Gname: "eng",
-			},
-		},
-	},
-	&untarTest{
-		file: "testdata/star.tar",
-		headers: []*Header{
-			&Header{
-				Name: "small.txt",
-				Mode: 0640,
-				Uid: 73025,
-				Gid: 5000,
-				Size: 5,
-				Mtime: 1244592783,
-				Typeflag: '0',
-				Uname: "dsymonds",
-				Gname: "eng",
-				Atime: 1244592783,
-				Ctime: 1244592783,
-			},
-			&Header{
-				Name: "small2.txt",
-				Mode: 0640,
-				Uid: 73025,
-				Gid: 5000,
-				Size: 11,
-				Mtime: 1244592783,
-				Typeflag: '0',
-				Uname: "dsymonds",
-				Gname: "eng",
-				Atime: 1244592783,
-				Ctime: 1244592783,
-			},
-		},
-	},
-	&untarTest{
-		file: "testdata/v7.tar",
-		headers: []*Header{
-			&Header{
-				Name: "small.txt",
-				Mode: 0444,
-				Uid: 73025,
-				Gid: 5000,
-				Size: 5,
-				Mtime: 1244593104,
-				Typeflag: '\x00',
-			},
-			&Header{
-				Name: "small2.txt",
-				Mode: 0444,
-				Uid: 73025,
-				Gid: 5000,
-				Size: 11,
-				Mtime: 1244593104,
-				Typeflag: '\x00',
-			},
-		},
-	},
-}
-
-var facts = map[int] string {
-	0: "1",
-	1: "1",
-	2: "2",
-	10: "3628800",
-	20: "2432902008176640000",
-	100: "933262154439441526816992388562667004907159682643816214685929" +
-		"638952175999932299156089414639761565182862536979208272237582" +
-		"51185210916864000000000000000000000000",
-}
-
-func usage() {
-	fmt.Fprintf(os.Stderr,
-		// TODO(gri): the 2nd string of this string list should not be indented
-		"usage: godoc package [name ...]\n" +
-		"	godoc -http=:6060\n")
-	flag.PrintDefaults()
-	os.Exit(2)
-}
-
-func TestReader(t *testing.T) {
-testLoop:
-	for i, test := range untarTests {
-		f, err := os.Open(test.file, os.O_RDONLY, 0444)
-		if err != nil {
-			t.Errorf("test %d: Unexpected error: %v", i, err)
-			continue
-		}
-		tr := NewReader(f)
-		for j, header := range test.headers {
-			hdr, err := tr.Next()
-			if err != nil || hdr == nil {
-				t.Errorf("test %d, entry %d: Didn't get entry: %v", i, j, err)
-				f.Close()
-				continue testLoop
-			}
-			if !reflect.DeepEqual(hdr, header) {
-				t.Errorf("test %d, entry %d: Incorrect header:\nhave %+v\nwant %+v",
-					 i, j, *hdr, *header)
-			}
-		}
-		hdr, err := tr.Next()
-		if hdr != nil || err != nil {
-			t.Errorf("test %d: Unexpected entry or error: hdr=%v err=%v", i, err)
-		}
-		f.Close()
-	}
-}
-
-// Respect line breaks in function calls.
-func _() {
-	f(x)
-	f(x,
-	  x)
-	f(x,
-	  x,
-	)
-	f(
-	  x,
-	  x)
-	f(
-	  x,
-	  x,
-	)
-}
-
-// Respect line breaks in function declarations.
-func _(x T) {}
-func _(x T,
-       y T) {}
-func _(x T,
-       y T,
-) {}
-func _(
-       x T,
-       y T) {}
-func _(
-       x T,
-       y T,
-) {}
-
-// Example from issue 2597.
-func ManageStatus0(
-	in <-chan *Status,
-	req <-chan Request,
-	stat chan<- *TargetInfo,
-	TargetHistorySize int) {
-}
-    
-func ManageStatus1(
-	in <-chan *Status,
-	req <-chan Request,
-	stat chan<- *TargetInfo,
-	TargetHistorySize int,
-) {
-}
-    
-// There should be exactly one linebreak after this comment.
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/parser.go b/third_party/gofrontend/libgo/go/go/printer/testdata/parser.go
deleted file mode 100644
index 44dfa19..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/parser.go
+++ /dev/null
@@ -1,2153 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package parser implements a parser for Go source files. Input may be
-// provided in a variety of forms (see the various Parse* functions); the
-// output is an abstract syntax tree (AST) representing the Go source. The
-// parser is invoked through one of the Parse* functions.
-
-package parser
-
-import (
-	"fmt"
-	"go/ast"
-	"go/scanner"
-	"go/token"
-)
-
-// The mode parameter to the Parse* functions is a set of flags (or 0).
-// They control the amount of source code parsed and other optional
-// parser functionality.
-//
-const (
-	PackageClauseOnly uint = 1 << iota // parsing stops after package clause
-	ImportsOnly                        // parsing stops after import declarations
-	ParseComments                      // parse comments and add them to AST
-	Trace                              // print a trace of parsed productions
-	DeclarationErrors                  // report declaration errors
-)
-
-// The parser structure holds the parser's internal state.
-type parser struct {
-	file *token.File
-	scanner.ErrorVector
-	scanner scanner.Scanner
-
-	// Tracing/debugging
-	mode   uint // parsing mode
-	trace  bool // == (mode & Trace != 0)
-	indent uint // indentation used for tracing output
-
-	// Comments
-	comments    []*ast.CommentGroup
-	leadComment *ast.CommentGroup // last lead comment
-	lineComment *ast.CommentGroup // last line comment
-
-	// Next token
-	pos token.Pos   // token position
-	tok token.Token // one token look-ahead
-	lit string      // token literal
-
-	// Non-syntactic parser control
-	exprLev int // < 0: in control clause, >= 0: in expression
-
-	// Ordinary identifier scopes
-	pkgScope   *ast.Scope        // pkgScope.Outer == nil
-	topScope   *ast.Scope        // top-most scope; may be pkgScope
-	unresolved []*ast.Ident      // unresolved identifiers
-	imports    []*ast.ImportSpec // list of imports
-
-	// Label scope
-	// (maintained by open/close LabelScope)
-	labelScope  *ast.Scope     // label scope for current function
-	targetStack [][]*ast.Ident // stack of unresolved labels
-}
-
-// scannerMode returns the scanner mode bits given the parser's mode bits.
-func scannerMode(mode uint) uint {
-	var m uint = scanner.InsertSemis
-	if mode&ParseComments != 0 {
-		m |= scanner.ScanComments
-	}
-	return m
-}
-
-func (p *parser) init(fset *token.FileSet, filename string, src []byte, mode uint) {
-	p.file = fset.AddFile(filename, fset.Base(), len(src))
-	p.scanner.Init(p.file, src, p, scannerMode(mode))
-
-	p.mode = mode
-	p.trace = mode&Trace != 0 // for convenience (p.trace is used frequently)
-
-	p.next()
-
-	// set up the pkgScope here (as opposed to in parseFile) because
-	// there are other parser entry points (ParseExpr, etc.)
-	p.openScope()
-	p.pkgScope = p.topScope
-
-	// for the same reason, set up a label scope
-	p.openLabelScope()
-}
-
-// ----------------------------------------------------------------------------
-// Scoping support
-
-func (p *parser) openScope() {
-	p.topScope = ast.NewScope(p.topScope)
-}
-
-func (p *parser) closeScope() {
-	p.topScope = p.topScope.Outer
-}
-
-func (p *parser) openLabelScope() {
-	p.labelScope = ast.NewScope(p.labelScope)
-	p.targetStack = append(p.targetStack, nil)
-}
-
-func (p *parser) closeLabelScope() {
-	// resolve labels
-	n := len(p.targetStack) - 1
-	scope := p.labelScope
-	for _, ident := range p.targetStack[n] {
-		ident.Obj = scope.Lookup(ident.Name)
-		if ident.Obj == nil && p.mode&DeclarationErrors != 0 {
-			p.error(ident.Pos(), fmt.Sprintf("label %s undefined", ident.Name))
-		}
-	}
-	// pop label scope
-	p.targetStack = p.targetStack[0:n]
-	p.labelScope = p.labelScope.Outer
-}
-
-func (p *parser) declare(decl interface{}, scope *ast.Scope, kind ast.ObjKind, idents ...*ast.Ident) {
-	for _, ident := range idents {
-		assert(ident.Obj == nil, "identifier already declared or resolved")
-		if ident.Name != "_" {
-			obj := ast.NewObj(kind, ident.Name)
-			// remember the corresponding declaration for redeclaration
-			// errors and global variable resolution/typechecking phase
-			obj.Decl = decl
-			if alt := scope.Insert(obj); alt != nil && p.mode&DeclarationErrors != 0 {
-				prevDecl := ""
-				if pos := alt.Pos(); pos.IsValid() {
-					prevDecl = fmt.Sprintf("\n\tprevious declaration at %s", p.file.Position(pos))
-				}
-				p.error(ident.Pos(), fmt.Sprintf("%s redeclared in this block%s", ident.Name, prevDecl))
-			}
-			ident.Obj = obj
-		}
-	}
-}
-
-func (p *parser) shortVarDecl(idents []*ast.Ident) {
-	// Go spec: A short variable declaration may redeclare variables
-	// provided they were originally declared in the same block with
-	// the same type, and at least one of the non-blank variables is new.
-	n := 0 // number of new variables
-	for _, ident := range idents {
-		assert(ident.Obj == nil, "identifier already declared or resolved")
-		if ident.Name != "_" {
-			obj := ast.NewObj(ast.Var, ident.Name)
-			// short var declarations cannot have redeclaration errors
-			// and are not global => no need to remember the respective
-			// declaration
-			alt := p.topScope.Insert(obj)
-			if alt == nil {
-				n++ // new declaration
-				alt = obj
-			}
-			ident.Obj = alt
-		}
-	}
-	if n == 0 && p.mode&DeclarationErrors != 0 {
-		p.error(idents[0].Pos(), "no new variables on left side of :=")
-	}
-}
-
-// The unresolved object is a sentinel to mark identifiers that have been added
-// to the list of unresolved identifiers. The sentinel is only used for verifying
-// internal consistency.
-var unresolved = new(ast.Object)
-
-func (p *parser) resolve(x ast.Expr) {
-	// nothing to do if x is not an identifier or the blank identifier
-	ident, _ := x.(*ast.Ident)
-	if ident == nil {
-		return
-	}
-	assert(ident.Obj == nil, "identifier already declared or resolved")
-	if ident.Name == "_" {
-		return
-	}
-	// try to resolve the identifier
-	for s := p.topScope; s != nil; s = s.Outer {
-		if obj := s.Lookup(ident.Name); obj != nil {
-			ident.Obj = obj
-			return
-		}
-	}
-	// all local scopes are known, so any unresolved identifier
-	// must be found either in the file scope, package scope
-	// (perhaps in another file), or universe scope --- collect
-	// them so that they can be resolved later
-	ident.Obj = unresolved
-	p.unresolved = append(p.unresolved, ident)
-}
-
-// ----------------------------------------------------------------------------
-// Parsing support
-
-func (p *parser) printTrace(a ...interface{}) {
-	const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " +
-		". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "
-	const n = uint(len(dots))
-	pos := p.file.Position(p.pos)
-	fmt.Printf("%5d:%3d: ", pos.Line, pos.Column)
-	i := 2 * p.indent
-	for ; i > n; i -= n {
-		fmt.Print(dots)
-	}
-	fmt.Print(dots[0:i])
-	fmt.Println(a...)
-}
-
-func trace(p *parser, msg string) *parser {
-	p.printTrace(msg, "(")
-	p.indent++
-	return p
-}
-
-// Usage pattern: defer un(trace(p, "..."));
-func un(p *parser) {
-	p.indent--
-	p.printTrace(")")
-}
-
-// Advance to the next token.
-func (p *parser) next0() {
-	// Because of one-token look-ahead, print the previous token
-	// when tracing as it provides a more readable output. The
-	// very first token (!p.pos.IsValid()) is not initialized
-	// (it is token.ILLEGAL), so don't print it .
-	if p.trace && p.pos.IsValid() {
-		s := p.tok.String()
-		switch {
-		case p.tok.IsLiteral():
-			p.printTrace(s, p.lit)
-		case p.tok.IsOperator(), p.tok.IsKeyword():
-			p.printTrace("\"" + s + "\"")
-		default:
-			p.printTrace(s)
-		}
-	}
-
-	p.pos, p.tok, p.lit = p.scanner.Scan()
-}
-
-// Consume a comment and return it and the line on which it ends.
-func (p *parser) consumeComment() (comment *ast.Comment, endline int) {
-	// /*-style comments may end on a different line than where they start.
-	// Scan the comment for '\n' chars and adjust endline accordingly.
-	endline = p.file.Line(p.pos)
-	if p.lit[1] == '*' {
-		// don't use range here - no need to decode Unicode code points
-		for i := 0; i < len(p.lit); i++ {
-			if p.lit[i] == '\n' {
-				endline++
-			}
-		}
-	}
-
-	comment = &ast.Comment{p.pos, p.lit}
-	p.next0()
-
-	return
-}
-
-// Consume a group of adjacent comments, add it to the parser's
-// comments list, and return it together with the line at which
-// the last comment in the group ends. An empty line or non-comment
-// token terminates a comment group.
-//
-func (p *parser) consumeCommentGroup() (comments *ast.CommentGroup, endline int) {
-	var list []*ast.Comment
-	endline = p.file.Line(p.pos)
-	for p.tok == token.COMMENT && endline+1 >= p.file.Line(p.pos) {
-		var comment *ast.Comment
-		comment, endline = p.consumeComment()
-		list = append(list, comment)
-	}
-
-	// add comment group to the comments list
-	comments = &ast.CommentGroup{list}
-	p.comments = append(p.comments, comments)
-
-	return
-}
-
-// Advance to the next non-comment token. In the process, collect
-// any comment groups encountered, and remember the last lead and
-// and line comments.
-//
-// A lead comment is a comment group that starts and ends in a
-// line without any other tokens and that is followed by a non-comment
-// token on the line immediately after the comment group.
-//
-// A line comment is a comment group that follows a non-comment
-// token on the same line, and that has no tokens after it on the line
-// where it ends.
-//
-// Lead and line comments may be considered documentation that is
-// stored in the AST.
-//
-func (p *parser) next() {
-	p.leadComment = nil
-	p.lineComment = nil
-	line := p.file.Line(p.pos) // current line
-	p.next0()
-
-	if p.tok == token.COMMENT {
-		var comment *ast.CommentGroup
-		var endline int
-
-		if p.file.Line(p.pos) == line {
-			// The comment is on same line as the previous token; it
-			// cannot be a lead comment but may be a line comment.
-			comment, endline = p.consumeCommentGroup()
-			if p.file.Line(p.pos) != endline {
-				// The next token is on a different line, thus
-				// the last comment group is a line comment.
-				p.lineComment = comment
-			}
-		}
-
-		// consume successor comments, if any
-		endline = -1
-		for p.tok == token.COMMENT {
-			comment, endline = p.consumeCommentGroup()
-		}
-
-		if endline+1 == p.file.Line(p.pos) {
-			// The next token is following on the line immediately after the
-			// comment group, thus the last comment group is a lead comment.
-			p.leadComment = comment
-		}
-	}
-}
-
-func (p *parser) error(pos token.Pos, msg string) {
-	p.Error(p.file.Position(pos), msg)
-}
-
-func (p *parser) errorExpected(pos token.Pos, msg string) {
-	msg = "expected " + msg
-	if pos == p.pos {
-		// the error happened at the current position;
-		// make the error message more specific
-		if p.tok == token.SEMICOLON && p.lit[0] == '\n' {
-			msg += ", found newline"
-		} else {
-			msg += ", found '" + p.tok.String() + "'"
-			if p.tok.IsLiteral() {
-				msg += " " + p.lit
-			}
-		}
-	}
-	p.error(pos, msg)
-}
-
-func (p *parser) expect(tok token.Token) token.Pos {
-	pos := p.pos
-	if p.tok != tok {
-		p.errorExpected(pos, "'"+tok.String()+"'")
-	}
-	p.next() // make progress
-	return pos
-}
-
-func (p *parser) expectSemi() {
-	if p.tok != token.RPAREN && p.tok != token.RBRACE {
-		p.expect(token.SEMICOLON)
-	}
-}
-
-func assert(cond bool, msg string) {
-	if !cond {
-		panic("go/parser internal error: " + msg)
-	}
-}
-
-// ----------------------------------------------------------------------------
-// Identifiers
-
-func (p *parser) parseIdent() *ast.Ident {
-	pos := p.pos
-	name := "_"
-	if p.tok == token.IDENT {
-		name = p.lit
-		p.next()
-	} else {
-		p.expect(token.IDENT) // use expect() error handling
-	}
-	return &ast.Ident{pos, name, nil}
-}
-
-func (p *parser) parseIdentList() (list []*ast.Ident) {
-	if p.trace {
-		defer un(trace(p, "IdentList"))
-	}
-
-	list = append(list, p.parseIdent())
-	for p.tok == token.COMMA {
-		p.next()
-		list = append(list, p.parseIdent())
-	}
-
-	return
-}
-
-// ----------------------------------------------------------------------------
-// Common productions
-
-// If lhs is set, result list elements which are identifiers are not resolved.
-func (p *parser) parseExprList(lhs bool) (list []ast.Expr) {
-	if p.trace {
-		defer un(trace(p, "ExpressionList"))
-	}
-
-	list = append(list, p.parseExpr(lhs))
-	for p.tok == token.COMMA {
-		p.next()
-		list = append(list, p.parseExpr(lhs))
-	}
-
-	return
-}
-
-func (p *parser) parseLhsList() []ast.Expr {
-	list := p.parseExprList(true)
-	switch p.tok {
-	case token.DEFINE:
-		// lhs of a short variable declaration
-		p.shortVarDecl(p.makeIdentList(list))
-	case token.COLON:
-		// lhs of a label declaration or a communication clause of a select
-		// statement (parseLhsList is not called when parsing the case clause
-		// of a switch statement):
-		// - labels are declared by the caller of parseLhsList
-		// - for communication clauses, if there is a stand-alone identifier
-		//   followed by a colon, we have a syntax error; there is no need
-		//   to resolve the identifier in that case
-	default:
-		// identifiers must be declared elsewhere
-		for _, x := range list {
-			p.resolve(x)
-		}
-	}
-	return list
-}
-
-func (p *parser) parseRhsList() []ast.Expr {
-	return p.parseExprList(false)
-}
-
-// ----------------------------------------------------------------------------
-// Types
-
-func (p *parser) parseType() ast.Expr {
-	if p.trace {
-		defer un(trace(p, "Type"))
-	}
-
-	typ := p.tryType()
-
-	if typ == nil {
-		pos := p.pos
-		p.errorExpected(pos, "type")
-		p.next() // make progress
-		return &ast.BadExpr{pos, p.pos}
-	}
-
-	return typ
-}
-
-// If the result is an identifier, it is not resolved.
-func (p *parser) parseTypeName() ast.Expr {
-	if p.trace {
-		defer un(trace(p, "TypeName"))
-	}
-
-	ident := p.parseIdent()
-	// don't resolve ident yet - it may be a parameter or field name
-
-	if p.tok == token.PERIOD {
-		// ident is a package name
-		p.next()
-		p.resolve(ident)
-		sel := p.parseIdent()
-		return &ast.SelectorExpr{ident, sel}
-	}
-
-	return ident
-}
-
-func (p *parser) parseArrayType(ellipsisOk bool) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "ArrayType"))
-	}
-
-	lbrack := p.expect(token.LBRACK)
-	var len ast.Expr
-	if ellipsisOk && p.tok == token.ELLIPSIS {
-		len = &ast.Ellipsis{p.pos, nil}
-		p.next()
-	} else if p.tok != token.RBRACK {
-		len = p.parseRhs()
-	}
-	p.expect(token.RBRACK)
-	elt := p.parseType()
-
-	return &ast.ArrayType{lbrack, len, elt}
-}
-
-func (p *parser) makeIdentList(list []ast.Expr) []*ast.Ident {
-	idents := make([]*ast.Ident, len(list))
-	for i, x := range list {
-		ident, isIdent := x.(*ast.Ident)
-		if !isIdent {
-			pos := x.(ast.Expr).Pos()
-			p.errorExpected(pos, "identifier")
-			ident = &ast.Ident{pos, "_", nil}
-		}
-		idents[i] = ident
-	}
-	return idents
-}
-
-func (p *parser) parseFieldDecl(scope *ast.Scope) *ast.Field {
-	if p.trace {
-		defer un(trace(p, "FieldDecl"))
-	}
-
-	doc := p.leadComment
-
-	// fields
-	list, typ := p.parseVarList(false)
-
-	// optional tag
-	var tag *ast.BasicLit
-	if p.tok == token.STRING {
-		tag = &ast.BasicLit{p.pos, p.tok, p.lit}
-		p.next()
-	}
-
-	// analyze case
-	var idents []*ast.Ident
-	if typ != nil {
-		// IdentifierList Type
-		idents = p.makeIdentList(list)
-	} else {
-		// ["*"] TypeName (AnonymousField)
-		typ = list[0] // we always have at least one element
-		p.resolve(typ)
-		if n := len(list); n > 1 || !isTypeName(deref(typ)) {
-			pos := typ.Pos()
-			p.errorExpected(pos, "anonymous field")
-			typ = &ast.BadExpr{pos, list[n-1].End()}
-		}
-	}
-
-	p.expectSemi() // call before accessing p.linecomment
-
-	field := &ast.Field{doc, idents, typ, tag, p.lineComment}
-	p.declare(field, scope, ast.Var, idents...)
-
-	return field
-}
-
-func (p *parser) parseStructType() *ast.StructType {
-	if p.trace {
-		defer un(trace(p, "StructType"))
-	}
-
-	pos := p.expect(token.STRUCT)
-	lbrace := p.expect(token.LBRACE)
-	scope := ast.NewScope(nil) // struct scope
-	var list []*ast.Field
-	for p.tok == token.IDENT || p.tok == token.MUL || p.tok == token.LPAREN {
-		// a field declaration cannot start with a '(' but we accept
-		// it here for more robust parsing and better error messages
-		// (parseFieldDecl will check and complain if necessary)
-		list = append(list, p.parseFieldDecl(scope))
-	}
-	rbrace := p.expect(token.RBRACE)
-
-	// TODO(gri): store struct scope in AST
-	return &ast.StructType{pos, &ast.FieldList{lbrace, list, rbrace}, false}
-}
-
-func (p *parser) parsePointerType() *ast.StarExpr {
-	if p.trace {
-		defer un(trace(p, "PointerType"))
-	}
-
-	star := p.expect(token.MUL)
-	base := p.parseType()
-
-	return &ast.StarExpr{star, base}
-}
-
-func (p *parser) tryVarType(isParam bool) ast.Expr {
-	if isParam && p.tok == token.ELLIPSIS {
-		pos := p.pos
-		p.next()
-		typ := p.tryIdentOrType(isParam) // don't use parseType so we can provide better error message
-		if typ == nil {
-			p.error(pos, "'...' parameter is missing type")
-			typ = &ast.BadExpr{pos, p.pos}
-		}
-		if p.tok != token.RPAREN {
-			p.error(pos, "can use '...' with last parameter type only")
-		}
-		return &ast.Ellipsis{pos, typ}
-	}
-	return p.tryIdentOrType(false)
-}
-
-func (p *parser) parseVarType(isParam bool) ast.Expr {
-	typ := p.tryVarType(isParam)
-	if typ == nil {
-		pos := p.pos
-		p.errorExpected(pos, "type")
-		p.next() // make progress
-		typ = &ast.BadExpr{pos, p.pos}
-	}
-	return typ
-}
-
-func (p *parser) parseVarList(isParam bool) (list []ast.Expr, typ ast.Expr) {
-	if p.trace {
-		defer un(trace(p, "VarList"))
-	}
-
-	// a list of identifiers looks like a list of type names
-	for {
-		// parseVarType accepts any type (including parenthesized ones)
-		// even though the syntax does not permit them here: we
-		// accept them all for more robust parsing and complain
-		// afterwards
-		list = append(list, p.parseVarType(isParam))
-		if p.tok != token.COMMA {
-			break
-		}
-		p.next()
-	}
-
-	// if we had a list of identifiers, it must be followed by a type
-	typ = p.tryVarType(isParam)
-	if typ != nil {
-		p.resolve(typ)
-	}
-
-	return
-}
-
-func (p *parser) parseParameterList(scope *ast.Scope, ellipsisOk bool) (params []*ast.Field) {
-	if p.trace {
-		defer un(trace(p, "ParameterList"))
-	}
-
-	list, typ := p.parseVarList(ellipsisOk)
-	if typ != nil {
-		// IdentifierList Type
-		idents := p.makeIdentList(list)
-		field := &ast.Field{nil, idents, typ, nil, nil}
-		params = append(params, field)
-		// Go spec: The scope of an identifier denoting a function
-		// parameter or result variable is the function body.
-		p.declare(field, scope, ast.Var, idents...)
-		if p.tok == token.COMMA {
-			p.next()
-		}
-
-		for p.tok != token.RPAREN && p.tok != token.EOF {
-			idents := p.parseIdentList()
-			typ := p.parseVarType(ellipsisOk)
-			field := &ast.Field{nil, idents, typ, nil, nil}
-			params = append(params, field)
-			// Go spec: The scope of an identifier denoting a function
-			// parameter or result variable is the function body.
-			p.declare(field, scope, ast.Var, idents...)
-			if p.tok != token.COMMA {
-				break
-			}
-			p.next()
-		}
-
-	} else {
-		// Type { "," Type } (anonymous parameters)
-		params = make([]*ast.Field, len(list))
-		for i, x := range list {
-			p.resolve(x)
-			params[i] = &ast.Field{Type: x}
-		}
-	}
-
-	return
-}
-
-func (p *parser) parseParameters(scope *ast.Scope, ellipsisOk bool) *ast.FieldList {
-	if p.trace {
-		defer un(trace(p, "Parameters"))
-	}
-
-	var params []*ast.Field
-	lparen := p.expect(token.LPAREN)
-	if p.tok != token.RPAREN {
-		params = p.parseParameterList(scope, ellipsisOk)
-	}
-	rparen := p.expect(token.RPAREN)
-
-	return &ast.FieldList{lparen, params, rparen}
-}
-
-func (p *parser) parseResult(scope *ast.Scope) *ast.FieldList {
-	if p.trace {
-		defer un(trace(p, "Result"))
-	}
-
-	if p.tok == token.LPAREN {
-		return p.parseParameters(scope, false)
-	}
-
-	typ := p.tryType()
-	if typ != nil {
-		list := make([]*ast.Field, 1)
-		list[0] = &ast.Field{Type: typ}
-		return &ast.FieldList{List: list}
-	}
-
-	return nil
-}
-
-func (p *parser) parseSignature(scope *ast.Scope) (params, results *ast.FieldList) {
-	if p.trace {
-		defer un(trace(p, "Signature"))
-	}
-
-	params = p.parseParameters(scope, true)
-	results = p.parseResult(scope)
-
-	return
-}
-
-func (p *parser) parseFuncType() (*ast.FuncType, *ast.Scope) {
-	if p.trace {
-		defer un(trace(p, "FuncType"))
-	}
-
-	pos := p.expect(token.FUNC)
-	scope := ast.NewScope(p.topScope) // function scope
-	params, results := p.parseSignature(scope)
-
-	return &ast.FuncType{pos, params, results}, scope
-}
-
-func (p *parser) parseMethodSpec(scope *ast.Scope) *ast.Field {
-	if p.trace {
-		defer un(trace(p, "MethodSpec"))
-	}
-
-	doc := p.leadComment
-	var idents []*ast.Ident
-	var typ ast.Expr
-	x := p.parseTypeName()
-	if ident, isIdent := x.(*ast.Ident); isIdent && p.tok == token.LPAREN {
-		// method
-		idents = []*ast.Ident{ident}
-		scope := ast.NewScope(nil) // method scope
-		params, results := p.parseSignature(scope)
-		typ = &ast.FuncType{token.NoPos, params, results}
-	} else {
-		// embedded interface
-		typ = x
-	}
-	p.expectSemi() // call before accessing p.linecomment
-
-	spec := &ast.Field{doc, idents, typ, nil, p.lineComment}
-	p.declare(spec, scope, ast.Fun, idents...)
-
-	return spec
-}
-
-func (p *parser) parseInterfaceType() *ast.InterfaceType {
-	if p.trace {
-		defer un(trace(p, "InterfaceType"))
-	}
-
-	pos := p.expect(token.INTERFACE)
-	lbrace := p.expect(token.LBRACE)
-	scope := ast.NewScope(nil) // interface scope
-	var list []*ast.Field
-	for p.tok == token.IDENT {
-		list = append(list, p.parseMethodSpec(scope))
-	}
-	rbrace := p.expect(token.RBRACE)
-
-	// TODO(gri): store interface scope in AST
-	return &ast.InterfaceType{pos, &ast.FieldList{lbrace, list, rbrace}, false}
-}
-
-func (p *parser) parseMapType() *ast.MapType {
-	if p.trace {
-		defer un(trace(p, "MapType"))
-	}
-
-	pos := p.expect(token.MAP)
-	p.expect(token.LBRACK)
-	key := p.parseType()
-	p.expect(token.RBRACK)
-	value := p.parseType()
-
-	return &ast.MapType{pos, key, value}
-}
-
-func (p *parser) parseChanType() *ast.ChanType {
-	if p.trace {
-		defer un(trace(p, "ChanType"))
-	}
-
-	pos := p.pos
-	dir := ast.SEND | ast.RECV
-	if p.tok == token.CHAN {
-		p.next()
-		if p.tok == token.ARROW {
-			p.next()
-			dir = ast.SEND
-		}
-	} else {
-		p.expect(token.ARROW)
-		p.expect(token.CHAN)
-		dir = ast.RECV
-	}
-	value := p.parseType()
-
-	return &ast.ChanType{pos, dir, value}
-}
-
-// If the result is an identifier, it is not resolved.
-func (p *parser) tryIdentOrType(ellipsisOk bool) ast.Expr {
-	switch p.tok {
-	case token.IDENT:
-		return p.parseTypeName()
-	case token.LBRACK:
-		return p.parseArrayType(ellipsisOk)
-	case token.STRUCT:
-		return p.parseStructType()
-	case token.MUL:
-		return p.parsePointerType()
-	case token.FUNC:
-		typ, _ := p.parseFuncType()
-		return typ
-	case token.INTERFACE:
-		return p.parseInterfaceType()
-	case token.MAP:
-		return p.parseMapType()
-	case token.CHAN, token.ARROW:
-		return p.parseChanType()
-	case token.LPAREN:
-		lparen := p.pos
-		p.next()
-		typ := p.parseType()
-		rparen := p.expect(token.RPAREN)
-		return &ast.ParenExpr{lparen, typ, rparen}
-	}
-
-	// no type found
-	return nil
-}
-
-func (p *parser) tryType() ast.Expr {
-	typ := p.tryIdentOrType(false)
-	if typ != nil {
-		p.resolve(typ)
-	}
-	return typ
-}
-
-// ----------------------------------------------------------------------------
-// Blocks
-
-func (p *parser) parseStmtList() (list []ast.Stmt) {
-	if p.trace {
-		defer un(trace(p, "StatementList"))
-	}
-
-	for p.tok != token.CASE && p.tok != token.DEFAULT && p.tok != token.RBRACE && p.tok != token.EOF {
-		list = append(list, p.parseStmt())
-	}
-
-	return
-}
-
-func (p *parser) parseBody(scope *ast.Scope) *ast.BlockStmt {
-	if p.trace {
-		defer un(trace(p, "Body"))
-	}
-
-	lbrace := p.expect(token.LBRACE)
-	p.topScope = scope // open function scope
-	p.openLabelScope()
-	list := p.parseStmtList()
-	p.closeLabelScope()
-	p.closeScope()
-	rbrace := p.expect(token.RBRACE)
-
-	return &ast.BlockStmt{lbrace, list, rbrace}
-}
-
-func (p *parser) parseBlockStmt() *ast.BlockStmt {
-	if p.trace {
-		defer un(trace(p, "BlockStmt"))
-	}
-
-	lbrace := p.expect(token.LBRACE)
-	p.openScope()
-	list := p.parseStmtList()
-	p.closeScope()
-	rbrace := p.expect(token.RBRACE)
-
-	return &ast.BlockStmt{lbrace, list, rbrace}
-}
-
-// ----------------------------------------------------------------------------
-// Expressions
-
-func (p *parser) parseFuncTypeOrLit() ast.Expr {
-	if p.trace {
-		defer un(trace(p, "FuncTypeOrLit"))
-	}
-
-	typ, scope := p.parseFuncType()
-	if p.tok != token.LBRACE {
-		// function type only
-		return typ
-	}
-
-	p.exprLev++
-	body := p.parseBody(scope)
-	p.exprLev--
-
-	return &ast.FuncLit{typ, body}
-}
-
-// parseOperand may return an expression or a raw type (incl. array
-// types of the form [...]T. Callers must verify the result.
-// If lhs is set and the result is an identifier, it is not resolved.
-//
-func (p *parser) parseOperand(lhs bool) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "Operand"))
-	}
-
-	switch p.tok {
-	case token.IDENT:
-		x := p.parseIdent()
-		if !lhs {
-			p.resolve(x)
-		}
-		return x
-
-	case token.INT, token.FLOAT, token.IMAG, token.CHAR, token.STRING:
-		x := &ast.BasicLit{p.pos, p.tok, p.lit}
-		p.next()
-		return x
-
-	case token.LPAREN:
-		lparen := p.pos
-		p.next()
-		p.exprLev++
-		x := p.parseRhs()
-		p.exprLev--
-		rparen := p.expect(token.RPAREN)
-		return &ast.ParenExpr{lparen, x, rparen}
-
-	case token.FUNC:
-		return p.parseFuncTypeOrLit()
-
-	default:
-		if typ := p.tryIdentOrType(true); typ != nil {
-			// could be type for composite literal or conversion
-			_, isIdent := typ.(*ast.Ident)
-			assert(!isIdent, "type cannot be identifier")
-			return typ
-		}
-	}
-
-	pos := p.pos
-	p.errorExpected(pos, "operand")
-	p.next() // make progress
-	return &ast.BadExpr{pos, p.pos}
-}
-
-func (p *parser) parseSelector(x ast.Expr) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "Selector"))
-	}
-
-	sel := p.parseIdent()
-
-	return &ast.SelectorExpr{x, sel}
-}
-
-func (p *parser) parseTypeAssertion(x ast.Expr) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "TypeAssertion"))
-	}
-
-	p.expect(token.LPAREN)
-	var typ ast.Expr
-	if p.tok == token.TYPE {
-		// type switch: typ == nil
-		p.next()
-	} else {
-		typ = p.parseType()
-	}
-	p.expect(token.RPAREN)
-
-	return &ast.TypeAssertExpr{x, typ}
-}
-
-func (p *parser) parseIndexOrSlice(x ast.Expr) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "IndexOrSlice"))
-	}
-
-	lbrack := p.expect(token.LBRACK)
-	p.exprLev++
-	var low, high ast.Expr
-	isSlice := false
-	if p.tok != token.COLON {
-		low = p.parseRhs()
-	}
-	if p.tok == token.COLON {
-		isSlice = true
-		p.next()
-		if p.tok != token.RBRACK {
-			high = p.parseRhs()
-		}
-	}
-	p.exprLev--
-	rbrack := p.expect(token.RBRACK)
-
-	if isSlice {
-		return &ast.SliceExpr{x, lbrack, low, high, rbrack}
-	}
-	return &ast.IndexExpr{x, lbrack, low, rbrack}
-}
-
-func (p *parser) parseCallOrConversion(fun ast.Expr) *ast.CallExpr {
-	if p.trace {
-		defer un(trace(p, "CallOrConversion"))
-	}
-
-	lparen := p.expect(token.LPAREN)
-	p.exprLev++
-	var list []ast.Expr
-	var ellipsis token.Pos
-	for p.tok != token.RPAREN && p.tok != token.EOF && !ellipsis.IsValid() {
-		list = append(list, p.parseRhs())
-		if p.tok == token.ELLIPSIS {
-			ellipsis = p.pos
-			p.next()
-		}
-		if p.tok != token.COMMA {
-			break
-		}
-		p.next()
-	}
-	p.exprLev--
-	rparen := p.expect(token.RPAREN)
-
-	return &ast.CallExpr{fun, lparen, list, ellipsis, rparen}
-}
-
-func (p *parser) parseElement(keyOk bool) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "Element"))
-	}
-
-	if p.tok == token.LBRACE {
-		return p.parseLiteralValue(nil)
-	}
-
-	x := p.parseExpr(keyOk) // don't resolve if map key
-	if keyOk {
-		if p.tok == token.COLON {
-			colon := p.pos
-			p.next()
-			return &ast.KeyValueExpr{x, colon, p.parseElement(false)}
-		}
-		p.resolve(x) // not a map key
-	}
-
-	return x
-}
-
-func (p *parser) parseElementList() (list []ast.Expr) {
-	if p.trace {
-		defer un(trace(p, "ElementList"))
-	}
-
-	for p.tok != token.RBRACE && p.tok != token.EOF {
-		list = append(list, p.parseElement(true))
-		if p.tok != token.COMMA {
-			break
-		}
-		p.next()
-	}
-
-	return
-}
-
-func (p *parser) parseLiteralValue(typ ast.Expr) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "LiteralValue"))
-	}
-
-	lbrace := p.expect(token.LBRACE)
-	var elts []ast.Expr
-	p.exprLev++
-	if p.tok != token.RBRACE {
-		elts = p.parseElementList()
-	}
-	p.exprLev--
-	rbrace := p.expect(token.RBRACE)
-	return &ast.CompositeLit{typ, lbrace, elts, rbrace}
-}
-
-// checkExpr checks that x is an expression (and not a type).
-func (p *parser) checkExpr(x ast.Expr) ast.Expr {
-	switch t := unparen(x).(type) {
-	case *ast.BadExpr:
-	case *ast.Ident:
-	case *ast.BasicLit:
-	case *ast.FuncLit:
-	case *ast.CompositeLit:
-	case *ast.ParenExpr:
-		panic("unreachable")
-	case *ast.SelectorExpr:
-	case *ast.IndexExpr:
-	case *ast.SliceExpr:
-	case *ast.TypeAssertExpr:
-		if t.Type == nil {
-			// the form X.(type) is only allowed in type switch expressions
-			p.errorExpected(x.Pos(), "expression")
-			x = &ast.BadExpr{x.Pos(), x.End()}
-		}
-	case *ast.CallExpr:
-	case *ast.StarExpr:
-	case *ast.UnaryExpr:
-		if t.Op == token.RANGE {
-			// the range operator is only allowed at the top of a for statement
-			p.errorExpected(x.Pos(), "expression")
-			x = &ast.BadExpr{x.Pos(), x.End()}
-		}
-	case *ast.BinaryExpr:
-	default:
-		// all other nodes are not proper expressions
-		p.errorExpected(x.Pos(), "expression")
-		x = &ast.BadExpr{x.Pos(), x.End()}
-	}
-	return x
-}
-
-// isTypeName reports whether x is a (qualified) TypeName.
-func isTypeName(x ast.Expr) bool {
-	switch t := x.(type) {
-	case *ast.BadExpr:
-	case *ast.Ident:
-	case *ast.SelectorExpr:
-		_, isIdent := t.X.(*ast.Ident)
-		return isIdent
-	default:
-		return false // all other nodes are not type names
-	}
-	return true
-}
-
-// isLiteralType reports whether x is a legal composite literal type.
-func isLiteralType(x ast.Expr) bool {
-	switch t := x.(type) {
-	case *ast.BadExpr:
-	case *ast.Ident:
-	case *ast.SelectorExpr:
-		_, isIdent := t.X.(*ast.Ident)
-		return isIdent
-	case *ast.ArrayType:
-	case *ast.StructType:
-	case *ast.MapType:
-	default:
-		return false // all other nodes are not legal composite literal types
-	}
-	return true
-}
-
-// If x is of the form *T, deref returns T, otherwise it returns x.
-func deref(x ast.Expr) ast.Expr {
-	if p, isPtr := x.(*ast.StarExpr); isPtr {
-		x = p.X
-	}
-	return x
-}
-
-// If x is of the form (T), unparen returns unparen(T), otherwise it returns x.
-func unparen(x ast.Expr) ast.Expr {
-	if p, isParen := x.(*ast.ParenExpr); isParen {
-		x = unparen(p.X)
-	}
-	return x
-}
-
-// checkExprOrType checks that x is an expression or a type
-// (and not a raw type such as [...]T).
-//
-func (p *parser) checkExprOrType(x ast.Expr) ast.Expr {
-	switch t := unparen(x).(type) {
-	case *ast.ParenExpr:
-		panic("unreachable")
-	case *ast.UnaryExpr:
-		if t.Op == token.RANGE {
-			// the range operator is only allowed at the top of a for statement
-			p.errorExpected(x.Pos(), "expression")
-			x = &ast.BadExpr{x.Pos(), x.End()}
-		}
-	case *ast.ArrayType:
-		if len, isEllipsis := t.Len.(*ast.Ellipsis); isEllipsis {
-			p.error(len.Pos(), "expected array length, found '...'")
-			x = &ast.BadExpr{x.Pos(), x.End()}
-		}
-	}
-
-	// all other nodes are expressions or types
-	return x
-}
-
-// If lhs is set and the result is an identifier, it is not resolved.
-func (p *parser) parsePrimaryExpr(lhs bool) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "PrimaryExpr"))
-	}
-
-	x := p.parseOperand(lhs)
-L:
-	for {
-		switch p.tok {
-		case token.PERIOD:
-			p.next()
-			if lhs {
-				p.resolve(x)
-			}
-			switch p.tok {
-			case token.IDENT:
-				x = p.parseSelector(p.checkExpr(x))
-			case token.LPAREN:
-				x = p.parseTypeAssertion(p.checkExpr(x))
-			default:
-				pos := p.pos
-				p.next() // make progress
-				p.errorExpected(pos, "selector or type assertion")
-				x = &ast.BadExpr{pos, p.pos}
-			}
-		case token.LBRACK:
-			if lhs {
-				p.resolve(x)
-			}
-			x = p.parseIndexOrSlice(p.checkExpr(x))
-		case token.LPAREN:
-			if lhs {
-				p.resolve(x)
-			}
-			x = p.parseCallOrConversion(p.checkExprOrType(x))
-		case token.LBRACE:
-			if isLiteralType(x) && (p.exprLev >= 0 || !isTypeName(x)) {
-				if lhs {
-					p.resolve(x)
-				}
-				x = p.parseLiteralValue(x)
-			} else {
-				break L
-			}
-		default:
-			break L
-		}
-		lhs = false // no need to try to resolve again
-	}
-
-	return x
-}
-
-// If lhs is set and the result is an identifier, it is not resolved.
-func (p *parser) parseUnaryExpr(lhs bool) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "UnaryExpr"))
-	}
-
-	switch p.tok {
-	case token.ADD, token.SUB, token.NOT, token.XOR, token.AND, token.RANGE:
-		pos, op := p.pos, p.tok
-		p.next()
-		x := p.parseUnaryExpr(false)
-		return &ast.UnaryExpr{pos, op, p.checkExpr(x)}
-
-	case token.ARROW:
-		// channel type or receive expression
-		pos := p.pos
-		p.next()
-		if p.tok == token.CHAN {
-			p.next()
-			value := p.parseType()
-			return &ast.ChanType{pos, ast.RECV, value}
-		}
-
-		x := p.parseUnaryExpr(false)
-		return &ast.UnaryExpr{pos, token.ARROW, p.checkExpr(x)}
-
-	case token.MUL:
-		// pointer type or unary "*" expression
-		pos := p.pos
-		p.next()
-		x := p.parseUnaryExpr(false)
-		return &ast.StarExpr{pos, p.checkExprOrType(x)}
-	}
-
-	return p.parsePrimaryExpr(lhs)
-}
-
-// If lhs is set and the result is an identifier, it is not resolved.
-func (p *parser) parseBinaryExpr(lhs bool, prec1 int) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "BinaryExpr"))
-	}
-
-	x := p.parseUnaryExpr(lhs)
-	for prec := p.tok.Precedence(); prec >= prec1; prec-- {
-		for p.tok.Precedence() == prec {
-			pos, op := p.pos, p.tok
-			p.next()
-			if lhs {
-				p.resolve(x)
-				lhs = false
-			}
-			y := p.parseBinaryExpr(false, prec+1)
-			x = &ast.BinaryExpr{p.checkExpr(x), pos, op, p.checkExpr(y)}
-		}
-	}
-
-	return x
-}
-
-// If lhs is set and the result is an identifier, it is not resolved.
-// TODO(gri): parseExpr may return a type or even a raw type ([..]int) -
-//            should reject when a type/raw type is obviously not allowed
-func (p *parser) parseExpr(lhs bool) ast.Expr {
-	if p.trace {
-		defer un(trace(p, "Expression"))
-	}
-
-	return p.parseBinaryExpr(lhs, token.LowestPrec+1)
-}
-
-func (p *parser) parseRhs() ast.Expr {
-	return p.parseExpr(false)
-}
-
-// ----------------------------------------------------------------------------
-// Statements
-
-func (p *parser) parseSimpleStmt(labelOk bool) ast.Stmt {
-	if p.trace {
-		defer un(trace(p, "SimpleStmt"))
-	}
-
-	x := p.parseLhsList()
-
-	switch p.tok {
-	case
-		token.DEFINE, token.ASSIGN, token.ADD_ASSIGN,
-		token.SUB_ASSIGN, token.MUL_ASSIGN, token.QUO_ASSIGN,
-		token.REM_ASSIGN, token.AND_ASSIGN, token.OR_ASSIGN,
-		token.XOR_ASSIGN, token.SHL_ASSIGN, token.SHR_ASSIGN, token.AND_NOT_ASSIGN:
-		// assignment statement
-		pos, tok := p.pos, p.tok
-		p.next()
-		y := p.parseRhsList()
-		return &ast.AssignStmt{x, pos, tok, y}
-	}
-
-	if len(x) > 1 {
-		p.errorExpected(x[0].Pos(), "1 expression")
-		// continue with first expression
-	}
-
-	switch p.tok {
-	case token.COLON:
-		// labeled statement
-		colon := p.pos
-		p.next()
-		if label, isIdent := x[0].(*ast.Ident); labelOk && isIdent {
-			// Go spec: The scope of a label is the body of the function
-			// in which it is declared and excludes the body of any nested
-			// function.
-			stmt := &ast.LabeledStmt{label, colon, p.parseStmt()}
-			p.declare(stmt, p.labelScope, ast.Lbl, label)
-			return stmt
-		}
-		p.error(x[0].Pos(), "illegal label declaration")
-		return &ast.BadStmt{x[0].Pos(), colon + 1}
-
-	case token.ARROW:
-		// send statement
-		arrow := p.pos
-		p.next() // consume "<-"
-		y := p.parseRhs()
-		return &ast.SendStmt{x[0], arrow, y}
-
-	case token.INC, token.DEC:
-		// increment or decrement
-		s := &ast.IncDecStmt{x[0], p.pos, p.tok}
-		p.next() // consume "++" or "--"
-		return s
-	}
-
-	// expression
-	return &ast.ExprStmt{x[0]}
-}
-
-func (p *parser) parseCallExpr() *ast.CallExpr {
-	x := p.parseRhs()
-	if call, isCall := x.(*ast.CallExpr); isCall {
-		return call
-	}
-	p.errorExpected(x.Pos(), "function/method call")
-	return nil
-}
-
-func (p *parser) parseGoStmt() ast.Stmt {
-	if p.trace {
-		defer un(trace(p, "GoStmt"))
-	}
-
-	pos := p.expect(token.GO)
-	call := p.parseCallExpr()
-	p.expectSemi()
-	if call == nil {
-		return &ast.BadStmt{pos, pos + 2} // len("go")
-	}
-
-	return &ast.GoStmt{pos, call}
-}
-
-func (p *parser) parseDeferStmt() ast.Stmt {
-	if p.trace {
-		defer un(trace(p, "DeferStmt"))
-	}
-
-	pos := p.expect(token.DEFER)
-	call := p.parseCallExpr()
-	p.expectSemi()
-	if call == nil {
-		return &ast.BadStmt{pos, pos + 5} // len("defer")
-	}
-
-	return &ast.DeferStmt{pos, call}
-}
-
-func (p *parser) parseReturnStmt() *ast.ReturnStmt {
-	if p.trace {
-		defer un(trace(p, "ReturnStmt"))
-	}
-
-	pos := p.pos
-	p.expect(token.RETURN)
-	var x []ast.Expr
-	if p.tok != token.SEMICOLON && p.tok != token.RBRACE {
-		x = p.parseRhsList()
-	}
-	p.expectSemi()
-
-	return &ast.ReturnStmt{pos, x}
-}
-
-func (p *parser) parseBranchStmt(tok token.Token) *ast.BranchStmt {
-	if p.trace {
-		defer un(trace(p, "BranchStmt"))
-	}
-
-	pos := p.expect(tok)
-	var label *ast.Ident
-	if tok != token.FALLTHROUGH && p.tok == token.IDENT {
-		label = p.parseIdent()
-		// add to list of unresolved targets
-		n := len(p.targetStack) - 1
-		p.targetStack[n] = append(p.targetStack[n], label)
-	}
-	p.expectSemi()
-
-	return &ast.BranchStmt{pos, tok, label}
-}
-
-func (p *parser) makeExpr(s ast.Stmt) ast.Expr {
-	if s == nil {
-		return nil
-	}
-	if es, isExpr := s.(*ast.ExprStmt); isExpr {
-		return p.checkExpr(es.X)
-	}
-	p.error(s.Pos(), "expected condition, found simple statement")
-	return &ast.BadExpr{s.Pos(), s.End()}
-}
-
-func (p *parser) parseIfStmt() *ast.IfStmt {
-	if p.trace {
-		defer un(trace(p, "IfStmt"))
-	}
-
-	pos := p.expect(token.IF)
-	p.openScope()
-	defer p.closeScope()
-
-	var s ast.Stmt
-	var x ast.Expr
-	{
-		prevLev := p.exprLev
-		p.exprLev = -1
-		if p.tok == token.SEMICOLON {
-			p.next()
-			x = p.parseRhs()
-		} else {
-			s = p.parseSimpleStmt(false)
-			if p.tok == token.SEMICOLON {
-				p.next()
-				x = p.parseRhs()
-			} else {
-				x = p.makeExpr(s)
-				s = nil
-			}
-		}
-		p.exprLev = prevLev
-	}
-
-	body := p.parseBlockStmt()
-	var else_ ast.Stmt
-	if p.tok == token.ELSE {
-		p.next()
-		else_ = p.parseStmt()
-	} else {
-		p.expectSemi()
-	}
-
-	return &ast.IfStmt{pos, s, x, body, else_}
-}
-
-func (p *parser) parseTypeList() (list []ast.Expr) {
-	if p.trace {
-		defer un(trace(p, "TypeList"))
-	}
-
-	list = append(list, p.parseType())
-	for p.tok == token.COMMA {
-		p.next()
-		list = append(list, p.parseType())
-	}
-
-	return
-}
-
-func (p *parser) parseCaseClause(exprSwitch bool) *ast.CaseClause {
-	if p.trace {
-		defer un(trace(p, "CaseClause"))
-	}
-
-	pos := p.pos
-	var list []ast.Expr
-	if p.tok == token.CASE {
-		p.next()
-		if exprSwitch {
-			list = p.parseRhsList()
-		} else {
-			list = p.parseTypeList()
-		}
-	} else {
-		p.expect(token.DEFAULT)
-	}
-
-	colon := p.expect(token.COLON)
-	p.openScope()
-	body := p.parseStmtList()
-	p.closeScope()
-
-	return &ast.CaseClause{pos, list, colon, body}
-}
-
-func isExprSwitch(s ast.Stmt) bool {
-	if s == nil {
-		return true
-	}
-	if e, ok := s.(*ast.ExprStmt); ok {
-		if a, ok := e.X.(*ast.TypeAssertExpr); ok {
-			return a.Type != nil // regular type assertion
-		}
-		return true
-	}
-	return false
-}
-
-func (p *parser) parseSwitchStmt() ast.Stmt {
-	if p.trace {
-		defer un(trace(p, "SwitchStmt"))
-	}
-
-	pos := p.expect(token.SWITCH)
-	p.openScope()
-	defer p.closeScope()
-
-	var s1, s2 ast.Stmt
-	if p.tok != token.LBRACE {
-		prevLev := p.exprLev
-		p.exprLev = -1
-		if p.tok != token.SEMICOLON {
-			s2 = p.parseSimpleStmt(false)
-		}
-		if p.tok == token.SEMICOLON {
-			p.next()
-			s1 = s2
-			s2 = nil
-			if p.tok != token.LBRACE {
-				s2 = p.parseSimpleStmt(false)
-			}
-		}
-		p.exprLev = prevLev
-	}
-
-	exprSwitch := isExprSwitch(s2)
-	lbrace := p.expect(token.LBRACE)
-	var list []ast.Stmt
-	for p.tok == token.CASE || p.tok == token.DEFAULT {
-		list = append(list, p.parseCaseClause(exprSwitch))
-	}
-	rbrace := p.expect(token.RBRACE)
-	p.expectSemi()
-	body := &ast.BlockStmt{lbrace, list, rbrace}
-
-	if exprSwitch {
-		return &ast.SwitchStmt{pos, s1, p.makeExpr(s2), body}
-	}
-	// type switch
-	// TODO(gri): do all the checks!
-	return &ast.TypeSwitchStmt{pos, s1, s2, body}
-}
-
-func (p *parser) parseCommClause() *ast.CommClause {
-	if p.trace {
-		defer un(trace(p, "CommClause"))
-	}
-
-	p.openScope()
-	pos := p.pos
-	var comm ast.Stmt
-	if p.tok == token.CASE {
-		p.next()
-		lhs := p.parseLhsList()
-		if p.tok == token.ARROW {
-			// SendStmt
-			if len(lhs) > 1 {
-				p.errorExpected(lhs[0].Pos(), "1 expression")
-				// continue with first expression
-			}
-			arrow := p.pos
-			p.next()
-			rhs := p.parseRhs()
-			comm = &ast.SendStmt{lhs[0], arrow, rhs}
-		} else {
-			// RecvStmt
-			pos := p.pos
-			tok := p.tok
-			var rhs ast.Expr
-			if tok == token.ASSIGN || tok == token.DEFINE {
-				// RecvStmt with assignment
-				if len(lhs) > 2 {
-					p.errorExpected(lhs[0].Pos(), "1 or 2 expressions")
-					// continue with first two expressions
-					lhs = lhs[0:2]
-				}
-				p.next()
-				rhs = p.parseRhs()
-			} else {
-				// rhs must be single receive operation
-				if len(lhs) > 1 {
-					p.errorExpected(lhs[0].Pos(), "1 expression")
-					// continue with first expression
-				}
-				rhs = lhs[0]
-				lhs = nil // there is no lhs
-			}
-			if x, isUnary := rhs.(*ast.UnaryExpr); !isUnary || x.Op != token.ARROW {
-				p.errorExpected(rhs.Pos(), "send or receive operation")
-				rhs = &ast.BadExpr{rhs.Pos(), rhs.End()}
-			}
-			if lhs != nil {
-				comm = &ast.AssignStmt{lhs, pos, tok, []ast.Expr{rhs}}
-			} else {
-				comm = &ast.ExprStmt{rhs}
-			}
-		}
-	} else {
-		p.expect(token.DEFAULT)
-	}
-
-	colon := p.expect(token.COLON)
-	body := p.parseStmtList()
-	p.closeScope()
-
-	return &ast.CommClause{pos, comm, colon, body}
-}
-
-func (p *parser) parseSelectStmt() *ast.SelectStmt {
-	if p.trace {
-		defer un(trace(p, "SelectStmt"))
-	}
-
-	pos := p.expect(token.SELECT)
-	lbrace := p.expect(token.LBRACE)
-	var list []ast.Stmt
-	for p.tok == token.CASE || p.tok == token.DEFAULT {
-		list = append(list, p.parseCommClause())
-	}
-	rbrace := p.expect(token.RBRACE)
-	p.expectSemi()
-	body := &ast.BlockStmt{lbrace, list, rbrace}
-
-	return &ast.SelectStmt{pos, body}
-}
-
-func (p *parser) parseForStmt() ast.Stmt {
-	if p.trace {
-		defer un(trace(p, "ForStmt"))
-	}
-
-	pos := p.expect(token.FOR)
-	p.openScope()
-	defer p.closeScope()
-
-	var s1, s2, s3 ast.Stmt
-	if p.tok != token.LBRACE {
-		prevLev := p.exprLev
-		p.exprLev = -1
-		if p.tok != token.SEMICOLON {
-			s2 = p.parseSimpleStmt(false)
-		}
-		if p.tok == token.SEMICOLON {
-			p.next()
-			s1 = s2
-			s2 = nil
-			if p.tok != token.SEMICOLON {
-				s2 = p.parseSimpleStmt(false)
-			}
-			p.expectSemi()
-			if p.tok != token.LBRACE {
-				s3 = p.parseSimpleStmt(false)
-			}
-		}
-		p.exprLev = prevLev
-	}
-
-	body := p.parseBlockStmt()
-	p.expectSemi()
-
-	if as, isAssign := s2.(*ast.AssignStmt); isAssign {
-		// possibly a for statement with a range clause; check assignment operator
-		if as.Tok != token.ASSIGN && as.Tok != token.DEFINE {
-			p.errorExpected(as.TokPos, "'=' or ':='")
-			return &ast.BadStmt{pos, body.End()}
-		}
-		// check lhs
-		var key, value ast.Expr
-		switch len(as.Lhs) {
-		case 2:
-			key, value = as.Lhs[0], as.Lhs[1]
-		case 1:
-			key = as.Lhs[0]
-		default:
-			p.errorExpected(as.Lhs[0].Pos(), "1 or 2 expressions")
-			return &ast.BadStmt{pos, body.End()}
-		}
-		// check rhs
-		if len(as.Rhs) != 1 {
-			p.errorExpected(as.Rhs[0].Pos(), "1 expression")
-			return &ast.BadStmt{pos, body.End()}
-		}
-		if rhs, isUnary := as.Rhs[0].(*ast.UnaryExpr); isUnary && rhs.Op == token.RANGE {
-			// rhs is range expression
-			// (any short variable declaration was handled by parseSimpleStat above)
-			return &ast.RangeStmt{pos, key, value, as.TokPos, as.Tok, rhs.X, body}
-		}
-		p.errorExpected(s2.Pos(), "range clause")
-		return &ast.BadStmt{pos, body.End()}
-	}
-
-	// regular for statement
-	return &ast.ForStmt{pos, s1, p.makeExpr(s2), s3, body}
-}
-
-func (p *parser) parseStmt() (s ast.Stmt) {
-	if p.trace {
-		defer un(trace(p, "Statement"))
-	}
-
-	switch p.tok {
-	case token.CONST, token.TYPE, token.VAR:
-		s = &ast.DeclStmt{p.parseDecl()}
-	case
-		// tokens that may start a top-level expression
-		token.IDENT, token.INT, token.FLOAT, token.CHAR, token.STRING, token.FUNC, token.LPAREN, // operand
-		token.LBRACK, token.STRUCT, // composite type
-		token.MUL, token.AND, token.ARROW, token.ADD, token.SUB, token.XOR: // unary operators
-		s = p.parseSimpleStmt(true)
-		// because of the required look-ahead, labeled statements are
-		// parsed by parseSimpleStmt - don't expect a semicolon after
-		// them
-		if _, isLabeledStmt := s.(*ast.LabeledStmt); !isLabeledStmt {
-			p.expectSemi()
-		}
-	case token.GO:
-		s = p.parseGoStmt()
-	case token.DEFER:
-		s = p.parseDeferStmt()
-	case token.RETURN:
-		s = p.parseReturnStmt()
-	case token.BREAK, token.CONTINUE, token.GOTO, token.FALLTHROUGH:
-		s = p.parseBranchStmt(p.tok)
-	case token.LBRACE:
-		s = p.parseBlockStmt()
-		p.expectSemi()
-	case token.IF:
-		s = p.parseIfStmt()
-	case token.SWITCH:
-		s = p.parseSwitchStmt()
-	case token.SELECT:
-		s = p.parseSelectStmt()
-	case token.FOR:
-		s = p.parseForStmt()
-	case token.SEMICOLON:
-		s = &ast.EmptyStmt{p.pos}
-		p.next()
-	case token.RBRACE:
-		// a semicolon may be omitted before a closing "}"
-		s = &ast.EmptyStmt{p.pos}
-	default:
-		// no statement found
-		pos := p.pos
-		p.errorExpected(pos, "statement")
-		p.next() // make progress
-		s = &ast.BadStmt{pos, p.pos}
-	}
-
-	return
-}
-
-// ----------------------------------------------------------------------------
-// Declarations
-
-type parseSpecFunction func(p *parser, doc *ast.CommentGroup, iota int) ast.Spec
-
-func parseImportSpec(p *parser, doc *ast.CommentGroup, _ int) ast.Spec {
-	if p.trace {
-		defer un(trace(p, "ImportSpec"))
-	}
-
-	var ident *ast.Ident
-	switch p.tok {
-	case token.PERIOD:
-		ident = &ast.Ident{p.pos, ".", nil}
-		p.next()
-	case token.IDENT:
-		ident = p.parseIdent()
-	}
-
-	var path *ast.BasicLit
-	if p.tok == token.STRING {
-		path = &ast.BasicLit{p.pos, p.tok, p.lit}
-		p.next()
-	} else {
-		p.expect(token.STRING) // use expect() error handling
-	}
-	p.expectSemi() // call before accessing p.linecomment
-
-	// collect imports
-	spec := &ast.ImportSpec{doc, ident, path, p.lineComment}
-	p.imports = append(p.imports, spec)
-
-	return spec
-}
-
-func parseConstSpec(p *parser, doc *ast.CommentGroup, iota int) ast.Spec {
-	if p.trace {
-		defer un(trace(p, "ConstSpec"))
-	}
-
-	idents := p.parseIdentList()
-	typ := p.tryType()
-	var values []ast.Expr
-	if typ != nil || p.tok == token.ASSIGN || iota == 0 {
-		p.expect(token.ASSIGN)
-		values = p.parseRhsList()
-	}
-	p.expectSemi() // call before accessing p.linecomment
-
-	// Go spec: The scope of a constant or variable identifier declared inside
-	// a function begins at the end of the ConstSpec or VarSpec and ends at
-	// the end of the innermost containing block.
-	// (Global identifiers are resolved in a separate phase after parsing.)
-	spec := &ast.ValueSpec{doc, idents, typ, values, p.lineComment}
-	p.declare(spec, p.topScope, ast.Con, idents...)
-
-	return spec
-}
-
-func parseTypeSpec(p *parser, doc *ast.CommentGroup, _ int) ast.Spec {
-	if p.trace {
-		defer un(trace(p, "TypeSpec"))
-	}
-
-	ident := p.parseIdent()
-
-	// Go spec: The scope of a type identifier declared inside a function begins
-	// at the identifier in the TypeSpec and ends at the end of the innermost
-	// containing block.
-	// (Global identifiers are resolved in a separate phase after parsing.)
-	spec := &ast.TypeSpec{doc, ident, nil, nil}
-	p.declare(spec, p.topScope, ast.Typ, ident)
-
-	spec.Type = p.parseType()
-	p.expectSemi() // call before accessing p.linecomment
-	spec.Comment = p.lineComment
-
-	return spec
-}
-
-func parseVarSpec(p *parser, doc *ast.CommentGroup, _ int) ast.Spec {
-	if p.trace {
-		defer un(trace(p, "VarSpec"))
-	}
-
-	idents := p.parseIdentList()
-	typ := p.tryType()
-	var values []ast.Expr
-	if typ == nil || p.tok == token.ASSIGN {
-		p.expect(token.ASSIGN)
-		values = p.parseRhsList()
-	}
-	p.expectSemi() // call before accessing p.linecomment
-
-	// Go spec: The scope of a constant or variable identifier declared inside
-	// a function begins at the end of the ConstSpec or VarSpec and ends at
-	// the end of the innermost containing block.
-	// (Global identifiers are resolved in a separate phase after parsing.)
-	spec := &ast.ValueSpec{doc, idents, typ, values, p.lineComment}
-	p.declare(spec, p.topScope, ast.Var, idents...)
-
-	return spec
-}
-
-func (p *parser) parseGenDecl(keyword token.Token, f parseSpecFunction) *ast.GenDecl {
-	if p.trace {
-		defer un(trace(p, "GenDecl("+keyword.String()+")"))
-	}
-
-	doc := p.leadComment
-	pos := p.expect(keyword)
-	var lparen, rparen token.Pos
-	var list []ast.Spec
-	if p.tok == token.LPAREN {
-		lparen = p.pos
-		p.next()
-		for iota := 0; p.tok != token.RPAREN && p.tok != token.EOF; iota++ {
-			list = append(list, f(p, p.leadComment, iota))
-		}
-		rparen = p.expect(token.RPAREN)
-		p.expectSemi()
-	} else {
-		list = append(list, f(p, nil, 0))
-	}
-
-	return &ast.GenDecl{doc, pos, keyword, lparen, list, rparen}
-}
-
-func (p *parser) parseReceiver(scope *ast.Scope) *ast.FieldList {
-	if p.trace {
-		defer un(trace(p, "Receiver"))
-	}
-
-	pos := p.pos
-	par := p.parseParameters(scope, false)
-
-	// must have exactly one receiver
-	if par.NumFields() != 1 {
-		p.errorExpected(pos, "exactly one receiver")
-		// TODO determine a better range for BadExpr below
-		par.List = []*ast.Field{{Type: &ast.BadExpr{pos, pos}}}
-		return par
-	}
-
-	// recv type must be of the form ["*"] identifier
-	recv := par.List[0]
-	base := deref(recv.Type)
-	if _, isIdent := base.(*ast.Ident); !isIdent {
-		p.errorExpected(base.Pos(), "(unqualified) identifier")
-		par.List = []*ast.Field{{Type: &ast.BadExpr{recv.Pos(), recv.End()}}}
-	}
-
-	return par
-}
-
-func (p *parser) parseFuncDecl() *ast.FuncDecl {
-	if p.trace {
-		defer un(trace(p, "FunctionDecl"))
-	}
-
-	doc := p.leadComment
-	pos := p.expect(token.FUNC)
-	scope := ast.NewScope(p.topScope) // function scope
-
-	var recv *ast.FieldList
-	if p.tok == token.LPAREN {
-		recv = p.parseReceiver(scope)
-	}
-
-	ident := p.parseIdent()
-
-	params, results := p.parseSignature(scope)
-
-	var body *ast.BlockStmt
-	if p.tok == token.LBRACE {
-		body = p.parseBody(scope)
-	}
-	p.expectSemi()
-
-	decl := &ast.FuncDecl{doc, recv, ident, &ast.FuncType{pos, params, results}, body}
-	if recv == nil {
-		// Go spec: The scope of an identifier denoting a constant, type,
-		// variable, or function (but not method) declared at top level
-		// (outside any function) is the package block.
-		//
-		// init() functions cannot be referred to and there may
-		// be more than one - don't put them in the pkgScope
-		if ident.Name != "init" {
-			p.declare(decl, p.pkgScope, ast.Fun, ident)
-		}
-	}
-
-	return decl
-}
-
-func (p *parser) parseDecl() ast.Decl {
-	if p.trace {
-		defer un(trace(p, "Declaration"))
-	}
-
-	var f parseSpecFunction
-	switch p.tok {
-	case token.CONST:
-		f = parseConstSpec
-
-	case token.TYPE:
-		f = parseTypeSpec
-
-	case token.VAR:
-		f = parseVarSpec
-
-	case token.FUNC:
-		return p.parseFuncDecl()
-
-	default:
-		pos := p.pos
-		p.errorExpected(pos, "declaration")
-		p.next() // make progress
-		decl := &ast.BadDecl{pos, p.pos}
-		return decl
-	}
-
-	return p.parseGenDecl(p.tok, f)
-}
-
-func (p *parser) parseDeclList() (list []ast.Decl) {
-	if p.trace {
-		defer un(trace(p, "DeclList"))
-	}
-
-	for p.tok != token.EOF {
-		list = append(list, p.parseDecl())
-	}
-
-	return
-}
-
-// ----------------------------------------------------------------------------
-// Source files
-
-func (p *parser) parseFile() *ast.File {
-	if p.trace {
-		defer un(trace(p, "File"))
-	}
-
-	// package clause
-	doc := p.leadComment
-	pos := p.expect(token.PACKAGE)
-	// Go spec: The package clause is not a declaration;
-	// the package name does not appear in any scope.
-	ident := p.parseIdent()
-	if ident.Name == "_" {
-		p.error(p.pos, "invalid package name _")
-	}
-	p.expectSemi()
-
-	var decls []ast.Decl
-
-	// Don't bother parsing the rest if we had errors already.
-	// Likely not a Go source file at all.
-
-	if p.ErrorCount() == 0 && p.mode&PackageClauseOnly == 0 {
-		// import decls
-		for p.tok == token.IMPORT {
-			decls = append(decls, p.parseGenDecl(token.IMPORT, parseImportSpec))
-		}
-
-		if p.mode&ImportsOnly == 0 {
-			// rest of package body
-			for p.tok != token.EOF {
-				decls = append(decls, p.parseDecl())
-			}
-		}
-	}
-
-	assert(p.topScope == p.pkgScope, "imbalanced scopes")
-
-	// resolve global identifiers within the same file
-	i := 0
-	for _, ident := range p.unresolved {
-		// i <= index for current ident
-		assert(ident.Obj == unresolved, "object already resolved")
-		ident.Obj = p.pkgScope.Lookup(ident.Name) // also removes unresolved sentinel
-		if ident.Obj == nil {
-			p.unresolved[i] = ident
-			i++
-		}
-	}
-
-	// TODO(gri): store p.imports in AST
-	return &ast.File{doc, pos, ident, decls, p.pkgScope, p.imports, p.unresolved[0:i], p.comments}
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/slow.golden b/third_party/gofrontend/libgo/go/go/printer/testdata/slow.golden
deleted file mode 100644
index 43a15cb..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/slow.golden
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package deepequal_test
-
-import (
-	"testing"
-	"google3/spam/archer/frontend/deepequal"
-)
-
-func TestTwoNilValues(t *testing.T) {
-	if err := deepequal.Check(nil, nil); err != nil {
-		t.Errorf("expected nil, saw %v", err)
-	}
-}
-
-type Foo struct {
-	bar	*Bar
-	bang	*Bar
-}
-
-type Bar struct {
-	baz	*Baz
-	foo	[]*Foo
-}
-
-type Baz struct {
-	entries		map[int]interface{}
-	whatever	string
-}
-
-func newFoo() *Foo {
-	return &Foo{bar: &Bar{baz: &Baz{
-		entries: map[int]interface{}{
-			42:	&Foo{},
-			21:	&Bar{},
-			11:	&Baz{whatever: "it's just a test"}}}},
-		bang: &Bar{foo: []*Foo{
-			&Foo{bar: &Bar{baz: &Baz{
-				entries: map[int]interface{}{
-					43:	&Foo{},
-					22:	&Bar{},
-					13:	&Baz{whatever: "this is nuts"}}}},
-				bang: &Bar{foo: []*Foo{
-					&Foo{bar: &Bar{baz: &Baz{
-						entries: map[int]interface{}{
-							61:	&Foo{},
-							71:	&Bar{},
-							11:	&Baz{whatever: "no, it's Go"}}}},
-						bang: &Bar{foo: []*Foo{
-							&Foo{bar: &Bar{baz: &Baz{
-								entries: map[int]interface{}{
-									0:	&Foo{},
-									-2:	&Bar{},
-									-11:	&Baz{whatever: "we need to go deeper"}}}},
-								bang: &Bar{foo: []*Foo{
-									&Foo{bar: &Bar{baz: &Baz{
-										entries: map[int]interface{}{
-											-2:	&Foo{},
-											-5:	&Bar{},
-											-7:	&Baz{whatever: "are you serious?"}}}},
-										bang:	&Bar{foo: []*Foo{}}},
-									&Foo{bar: &Bar{baz: &Baz{
-										entries: map[int]interface{}{
-											-100:	&Foo{},
-											50:	&Bar{},
-											20:	&Baz{whatever: "na, not really ..."}}}},
-										bang:	&Bar{foo: []*Foo{}}}}}}}}},
-					&Foo{bar: &Bar{baz: &Baz{
-						entries: map[int]interface{}{
-							2:	&Foo{},
-							1:	&Bar{},
-							-1:	&Baz{whatever: "... it's just a test."}}}},
-						bang:	&Bar{foo: []*Foo{}}}}}}}}}
-}
-
-func TestElaborate(t *testing.T) {
-	a := newFoo()
-	b := newFoo()
-
-	if err := deepequal.Check(a, b); err != nil {
-		t.Errorf("expected nil, saw %v", err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/slow.input b/third_party/gofrontend/libgo/go/go/printer/testdata/slow.input
deleted file mode 100644
index 0e5a23d..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/slow.input
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package deepequal_test
-
-import (
-        "testing"
-        "google3/spam/archer/frontend/deepequal"
-)
-
-func TestTwoNilValues(t *testing.T) {
-        if err := deepequal.Check(nil, nil); err != nil {
-                t.Errorf("expected nil, saw %v", err)
-        }
-}
-
-type Foo struct {
-        bar *Bar
-        bang *Bar
-}
-
-type Bar struct {
-        baz *Baz
-        foo []*Foo
-}
-
-type Baz struct {
-        entries  map[int]interface{}
-        whatever string
-}
-
-func newFoo() (*Foo) {
-return &Foo{bar: &Bar{ baz: &Baz{
-entries: map[int]interface{}{
-42: &Foo{},
-21: &Bar{},
-11: &Baz{ whatever: "it's just a test" }}}},
-        bang: &Bar{foo: []*Foo{
-&Foo{bar: &Bar{ baz: &Baz{
-entries: map[int]interface{}{
-43: &Foo{},
-22: &Bar{},
-13: &Baz{ whatever: "this is nuts" }}}},
-        bang: &Bar{foo: []*Foo{
-&Foo{bar: &Bar{ baz: &Baz{
-entries: map[int]interface{}{
-61: &Foo{},
-71: &Bar{},
-11: &Baz{ whatever: "no, it's Go" }}}},
-        bang: &Bar{foo: []*Foo{
-&Foo{bar: &Bar{ baz: &Baz{
-entries: map[int]interface{}{
-0: &Foo{},
--2: &Bar{},
--11: &Baz{ whatever: "we need to go deeper" }}}},
-        bang: &Bar{foo: []*Foo{
-&Foo{bar: &Bar{ baz: &Baz{
-entries: map[int]interface{}{
--2: &Foo{},
--5: &Bar{},
--7: &Baz{ whatever: "are you serious?" }}}},
-        bang: &Bar{foo: []*Foo{}}},
-&Foo{bar: &Bar{ baz: &Baz{
-entries: map[int]interface{}{
--100: &Foo{},
-50: &Bar{},
-20: &Baz{ whatever: "na, not really ..." }}}},
-        bang: &Bar{foo: []*Foo{}}}}}}}}},
-&Foo{bar: &Bar{ baz: &Baz{
-entries: map[int]interface{}{
-2: &Foo{},
-1: &Bar{},
--1: &Baz{ whatever: "... it's just a test." }}}},
-        bang: &Bar{foo: []*Foo{}}}}}}}}}
-}
-
-func TestElaborate(t *testing.T) {
-        a := newFoo()
-        b := newFoo()
-
-        if err := deepequal.Check(a, b); err != nil {
-                t.Errorf("expected nil, saw %v", err)
-        }
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/statements.golden b/third_party/gofrontend/libgo/go/go/printer/testdata/statements.golden
deleted file mode 100644
index 4b13460..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/statements.golden
+++ /dev/null
@@ -1,644 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package statements
-
-var expr bool
-
-func use(x interface{})	{}
-
-// Formatting of multi-line return statements.
-func _f() {
-	return
-	return x, y, z
-	return T{}
-	return T{1, 2, 3},
-		x, y, z
-	return T{1, 2, 3},
-		x, y,
-		z
-	return T{1,
-		2,
-		3}
-	return T{1,
-		2,
-		3,
-	}
-	return T{
-		1,
-		2,
-		3}
-	return T{
-		1,
-		2,
-		3,
-	}
-	return T{
-		1,
-		T{1, 2, 3},
-		3,
-	}
-	return T{
-		1,
-		T{1,
-			2, 3},
-		3,
-	}
-	return T{
-		1,
-		T{1,
-			2,
-			3},
-		3,
-	}
-	return T{
-		1,
-		2,
-	}, nil
-	return T{
-			1,
-			2,
-		},
-		T{
-			x:	3,
-			y:	4,
-		}, nil
-	return T{
-			1,
-			2,
-		},
-		nil
-	return T{
-			1,
-			2,
-		},
-		T{
-			x:	3,
-			y:	4,
-		},
-		nil
-	return x + y +
-		z
-	return func() {}
-	return func() {
-			_ = 0
-		}, T{
-			1, 2,
-		}
-	return func() {
-		_ = 0
-	}
-	return func() T {
-		return T{
-			1, 2,
-		}
-	}
-}
-
-// Formatting of multi-line returns: test cases from issue 1207.
-func F() (*T, os.Error) {
-	return &T{
-			X:	1,
-			Y:	2,
-		},
-		nil
-}
-
-func G() (*T, *T, os.Error) {
-	return &T{
-			X:	1,
-			Y:	2,
-		},
-		&T{
-			X:	3,
-			Y:	4,
-		},
-		nil
-}
-
-func _() interface{} {
-	return &fileStat{
-		name:		basename(file.name),
-		size:		mkSize(d.FileSizeHigh, d.FileSizeLow),
-		modTime:	mkModTime(d.LastWriteTime),
-		mode:		mkMode(d.FileAttributes),
-		sys:		mkSysFromFI(&d),
-	}, nil
-}
-
-// Formatting of if-statement headers.
-func _() {
-	if true {
-	}
-	if true {
-	}	// no semicolon printed
-	if expr {
-	}
-	if expr {
-	}	// no semicolon printed
-	if expr {
-	}	// no parens printed
-	if expr {
-	}	// no semicolon and parens printed
-	if x := expr; true {
-		use(x)
-	}
-	if x := expr; expr {
-		use(x)
-	}
-}
-
-// Formatting of switch-statement headers.
-func _() {
-	switch {
-	}
-	switch {
-	}	// no semicolon printed
-	switch expr {
-	}
-	switch expr {
-	}	// no semicolon printed
-	switch expr {
-	}	// no parens printed
-	switch expr {
-	}	// no semicolon and parens printed
-	switch x := expr; {
-	default:
-		use(
-			x)
-	}
-	switch x := expr; expr {
-	default:
-		use(x)
-	}
-}
-
-// Formatting of switch statement bodies.
-func _() {
-	switch {
-	}
-
-	switch x := 0; x {
-	case 1:
-		use(x)
-		use(x)	// followed by an empty line
-
-	case 2:	// followed by an empty line
-
-		use(x)	// followed by an empty line
-
-	case 3:	// no empty lines
-		use(x)
-		use(x)
-	}
-
-	switch x {
-	case 0:
-		use(x)
-	case 1:	// this comment should have no effect on the previous or next line
-		use(x)
-	}
-
-	switch x := 0; x {
-	case 1:
-		x = 0
-		// this comment should be indented
-	case 2:
-		x = 0
-	// this comment should not be indented, it is aligned with the next case
-	case 3:
-		x = 0
-		/* indented comment
-		   aligned
-		   aligned
-		*/
-		// bla
-		/* and more */
-	case 4:
-		x = 0
-	/* not indented comment
-	   aligned
-	   aligned
-	*/
-	// bla
-	/* and more */
-	case 5:
-	}
-}
-
-// Formatting of selected select statements.
-func _() {
-	select {}
-	select { /* this comment should not be tab-aligned because the closing } is on the same line */
-	}
-	select {	/* this comment should be tab-aligned */
-	}
-	select {	// this comment should be tab-aligned
-	}
-	select {
-	case <-c:
-	}
-}
-
-// Formatting of for-statement headers for single-line for-loops.
-func _() {
-	for {
-	}
-	for expr {
-	}
-	for expr {
-	}	// no parens printed
-	for {
-	}	// no semicolons printed
-	for x := expr; ; {
-		use(x)
-	}
-	for expr {
-	}	// no semicolons printed
-	for expr {
-	}	// no semicolons and parens printed
-	for ; ; expr = false {
-	}
-	for x := expr; expr; {
-		use(x)
-	}
-	for x := expr; ; expr = false {
-		use(x)
-	}
-	for ; expr; expr = false {
-	}
-	for x := expr; expr; expr = false {
-		use(x)
-	}
-	for x := range []int{} {
-		use(x)
-	}
-	for x := range []int{} {
-		use(x)
-	}	// no parens printed
-}
-
-// Formatting of for-statement headers for multi-line for-loops.
-func _() {
-	for {
-	}
-	for expr {
-	}
-	for expr {
-	}	// no parens printed
-	for {
-	}	// no semicolons printed
-	for x := expr; ; {
-		use(x)
-	}
-	for expr {
-	}	// no semicolons printed
-	for expr {
-	}	// no semicolons and parens printed
-	for ; ; expr = false {
-	}
-	for x := expr; expr; {
-		use(x)
-	}
-	for x := expr; ; expr = false {
-		use(x)
-	}
-	for ; expr; expr = false {
-	}
-	for x := expr; expr; expr = false {
-		use(x)
-	}
-	for range []int{} {
-		println("foo")
-	}
-	for x := range []int{} {
-		use(x)
-	}
-	for x := range []int{} {
-		use(x)
-	}	// no parens printed
-}
-
-// Formatting of selected short single- and multi-line statements.
-func _() {
-	if cond {
-	}
-	if cond {
-	}	// multiple lines
-	if cond {
-	} else {
-	}	// else clause always requires multiple lines
-
-	for {
-	}
-	for i := 0; i < len(a); 1++ {
-	}
-	for i := 0; i < len(a); 1++ {
-		a[i] = i
-	}
-	for i := 0; i < len(a); 1++ {
-		a[i] = i
-	}	// multiple lines
-
-	for range a {
-	}
-	for _ = range a {
-	}
-	for _, _ = range a {
-	}
-	for i := range a {
-	}
-	for i := range a {
-		a[i] = i
-	}
-	for i := range a {
-		a[i] = i
-	}	// multiple lines
-
-	go func() {
-		for {
-			a <- <-b
-		}
-	}()
-	defer func() {
-		if x := recover(); x != nil {
-			err = fmt.Sprintf("error: %s", x.msg)
-		}
-	}()
-}
-
-// Don't remove mandatory parentheses around composite literals in control clauses.
-func _() {
-	// strip parentheses - no composite literals or composite literals don't start with a type name
-	if x {
-	}
-	if x {
-	}
-	if []T{} {
-	}
-	if []T{} {
-	}
-	if []T{} {
-	}
-
-	for x {
-	}
-	for x {
-	}
-	for []T{} {
-	}
-	for []T{} {
-	}
-	for []T{} {
-	}
-
-	switch x {
-	}
-	switch x {
-	}
-	switch []T{} {
-	}
-	switch []T{} {
-	}
-
-	for _ = range []T{T{42}} {
-	}
-
-	// leave parentheses - composite literals start with a type name
-	if (T{}) {
-	}
-	if (T{}) {
-	}
-	if (T{}) {
-	}
-
-	for (T{}) {
-	}
-	for (T{}) {
-	}
-	for (T{}) {
-	}
-
-	switch (T{}) {
-	}
-	switch (T{}) {
-	}
-
-	for _ = range (T1{T{42}}) {
-	}
-
-	if x == (T{42}[0]) {
-	}
-	if (x == T{42}[0]) {
-	}
-	if x == (T{42}[0]) {
-	}
-	if x == (T{42}[0]) {
-	}
-	if x == (T{42}[0]) {
-	}
-	if x == a+b*(T{42}[0]) {
-	}
-	if (x == a+b*T{42}[0]) {
-	}
-	if x == a+b*(T{42}[0]) {
-	}
-	if x == a+(b*(T{42}[0])) {
-	}
-	if x == a+b*(T{42}[0]) {
-	}
-	if (a + b*(T{42}[0])) == x {
-	}
-	if (a + b*(T{42}[0])) == x {
-	}
-
-	if struct{ x bool }{false}.x {
-	}
-	if (struct{ x bool }{false}.x) == false {
-	}
-	if struct{ x bool }{false}.x == false {
-	}
-}
-
-// Extra empty lines inside functions. Do respect source code line
-// breaks between statement boundaries but print at most one empty
-// line at a time.
-func _() {
-
-	const _ = 0
-
-	const _ = 1
-	type _ int
-	type _ float
-
-	var _ = 0
-	var x = 1
-
-	// Each use(x) call below should have at most one empty line before and after.
-	// Known bug: The first use call may have more than one empty line before
-	//            (see go/printer/nodes.go, func linebreak).
-
-	use(x)
-
-	if x < x {
-
-		use(x)
-
-	} else {
-
-		use(x)
-
-	}
-}
-
-// Formatting around labels.
-func _() {
-L:
-}
-
-func _() {
-	// this comment should be indented
-L:	// no semicolon needed
-}
-
-func _() {
-	switch 0 {
-	case 0:
-	L0:
-		;	// semicolon required
-	case 1:
-	L1:
-		;	// semicolon required
-	default:
-	L2:	// no semicolon needed
-	}
-}
-
-func _() {
-	f()
-L1:
-	f()
-L2:
-	;
-L3:
-}
-
-func _() {
-	// this comment should be indented
-L:
-}
-
-func _() {
-L:
-	_ = 0
-}
-
-func _() {
-	// this comment should be indented
-L:
-	_ = 0
-}
-
-func _() {
-	for {
-	L1:
-		_ = 0
-	L2:
-		_ = 0
-	}
-}
-
-func _() {
-	// this comment should be indented
-	for {
-	L1:
-		_ = 0
-	L2:
-		_ = 0
-	}
-}
-
-func _() {
-	if true {
-		_ = 0
-	}
-	_ = 0	// the indentation here should not be affected by the long label name
-AnOverlongLabel:
-	_ = 0
-
-	if true {
-		_ = 0
-	}
-	_ = 0
-
-L:
-	_ = 0
-}
-
-func _() {
-	for {
-		goto L
-	}
-L:
-
-	MoreCode()
-}
-
-func _() {
-	for {
-		goto L
-	}
-L:	// A comment on the same line as the label, followed by a single empty line.
-	// Known bug: There may be more than one empty line before MoreCode()
-	//            (see go/printer/nodes.go, func linebreak).
-
-	MoreCode()
-}
-
-func _() {
-	for {
-		goto L
-	}
-L:
-
-	// There should be a single empty line before this comment.
-	MoreCode()
-}
-
-func _() {
-	for {
-		goto AVeryLongLabelThatShouldNotAffectFormatting
-	}
-AVeryLongLabelThatShouldNotAffectFormatting:
-	// There should be a single empty line after this comment.
-
-	// There should be a single empty line before this comment.
-	MoreCode()
-}
-
-// Formatting of empty statements.
-func _() {
-
-}
-
-func _() {
-}
-
-func _() {
-}
-
-func _() {
-	f()
-}
-
-func _() {
-L:
-	;
-}
-
-func _() {
-L:
-	;
-	f()
-}
diff --git a/third_party/gofrontend/libgo/go/go/printer/testdata/statements.input b/third_party/gofrontend/libgo/go/go/printer/testdata/statements.input
deleted file mode 100644
index cade157..0000000
--- a/third_party/gofrontend/libgo/go/go/printer/testdata/statements.input
+++ /dev/null
@@ -1,555 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package statements
-
-var expr bool
-
-func use(x interface{}) {}
-
-// Formatting of multi-line return statements.
-func _f() {
-	return
-	return x, y, z
-	return T{}
-	return T{1, 2, 3},
-		x, y, z
-	return T{1, 2, 3},
-		x, y,
-		z
-	return T{1,
-		2,
-		3}
-	return T{1,
-		2,
-		3,
-	}
-	return T{
-		1,
-		2,
-		3}
-	return T{
-		1,
-		2,
-		3,
-	}
-	return T{
-		1,
-		T{1, 2, 3},
-		3,
-	}
-	return T{
-		1,
-		T{1,
-			2, 3},
-		3,
-	}
-	return T{
-		1,
-		T{1,
-			2,
-			3},
-		3,
-	}
-	return T{
-			1,
-			2,
-		}, nil
-	return T{
-			1,
-			2,
-		},
-		T{
-			x: 3,
-			y: 4,
-		}, nil
-	return T{
-			1,
-			2,
-		},
-		nil
-	return T{
-			1,
-			2,
-		},
-		T{
-			x: 3,
-			y: 4,
-		},
-		nil
-	return x + y +
-		z
-	return func() {}
-	return func() {
-		_ = 0
-	}, T{
-		1, 2,
-	}
-	return func() {
-		_ = 0
-	}
-	return func() T {
-		return T {
-			1, 2,
-		}
-	}
-}
-
-// Formatting of multi-line returns: test cases from issue 1207.
-func F() (*T, os.Error) {
-       return &T{
-               X: 1,
-               Y: 2,
-       },
-               nil
-}
-
-func G() (*T, *T, os.Error) {
-       return &T{
-               X: 1,
-               Y: 2,
-       },
-               &T{
-                       X: 3,
-                       Y: 4,
-               },
-               nil
-}
-
-func _() interface{} {
-	return &fileStat{
-			name:    basename(file.name),
-			size:    mkSize(d.FileSizeHigh, d.FileSizeLow),
-			modTime: mkModTime(d.LastWriteTime),
-			mode:    mkMode(d.FileAttributes),
-			sys:     mkSysFromFI(&d),
-		}, nil
-}
-
-// Formatting of if-statement headers.
-func _() {
-	if true {}
-	if; true {}  // no semicolon printed
-	if expr{}
-	if;expr{}  // no semicolon printed
-	if (expr){}  // no parens printed
-	if;((expr)){}  // no semicolon and parens printed
-	if x:=expr;true{
-	use(x)}
-	if x:=expr; expr {use(x)}
-}
-
-
-// Formatting of switch-statement headers.
-func _() {
-	switch {}
-	switch;{}  // no semicolon printed
-	switch expr {}
-	switch;expr{}  // no semicolon printed
-	switch (expr) {}  // no parens printed
-	switch;((expr)){}  // no semicolon and parens printed
-	switch x := expr; { default:use(
-x)
-	}
-	switch x := expr; expr {default:use(x)}
-}
-
-
-// Formatting of switch statement bodies.
-func _() {
-	switch {
-	}
-
-	switch x := 0; x {
-	case 1:
-		use(x)
-		use(x)  // followed by an empty line
-
-	case 2:  // followed by an empty line
-
-		use(x)  // followed by an empty line
-
-	case 3:  // no empty lines
-		use(x)
-		use(x)
-	}
-
-	switch x {
-	case 0:
-		use(x)
-	case 1:  // this comment should have no effect on the previous or next line
-		use(x)
-	}
-
-	switch x := 0; x {
-	case 1:
-		x = 0
-		// this comment should be indented
-	case 2:
-		x = 0
-	// this comment should not be indented, it is aligned with the next case
-	case 3:
-		x = 0
-		/* indented comment
-		   aligned
-		   aligned
-		*/
-		// bla
-		/* and more */
-	case 4:
-		x = 0
-	/* not indented comment
-	   aligned
-	   aligned
-	*/
-	// bla
-	/* and more */
-	case 5:
-	}
-}
-
-
-// Formatting of selected select statements.
-func _() {
-	select {
-	}
-	select { /* this comment should not be tab-aligned because the closing } is on the same line */ }
-	select { /* this comment should be tab-aligned */
-	}
-	select { // this comment should be tab-aligned
-	}
-	select { case <-c: }
-}
-
-
-// Formatting of for-statement headers for single-line for-loops.
-func _() {
-	for{}
-	for expr {}
-	for (expr) {}  // no parens printed
-	for;;{}  // no semicolons printed
-	for x :=expr;; {use( x)}
-	for; expr;{}  // no semicolons printed
-	for; ((expr));{}  // no semicolons and parens printed
-	for; ; expr = false {}
-	for x :=expr; expr; {use(x)}
-	for x := expr;; expr=false {use(x)}
-	for;expr;expr =false {}
-	for x := expr;expr;expr = false { use(x) }
-	for x := range []int{} { use(x) }
-	for x := range (([]int{})) { use(x) }  // no parens printed
-}
-
-
-// Formatting of for-statement headers for multi-line for-loops.
-func _() {
-	for{
-	}
-	for expr {
-	}
-	for (expr) {
-	}  // no parens printed
-	for;;{
-	}  // no semicolons printed
-	for x :=expr;; {use( x)
-	}
-	for; expr;{
-	}  // no semicolons printed
-	for; ((expr));{
-	}  // no semicolons and parens printed
-	for; ; expr = false {
-	}
-	for x :=expr; expr; {use(x)
-	}
-	for x := expr;; expr=false {use(x)
-	}
-	for;expr;expr =false {
-	}
-	for x := expr;expr;expr = false {
-	use(x)
-	}
-	for range []int{} {
-	println("foo")}
-	for x := range []int{} {
-	use(x) }
-	for x := range (([]int{})) {
-	use(x) }  // no parens printed
-}
-
-
-// Formatting of selected short single- and multi-line statements.
-func _() {
-	if cond {}
-	if cond {
-	} // multiple lines
-	if cond {} else {} // else clause always requires multiple lines
-
-	for {}
-	for i := 0; i < len(a); 1++ {}
-	for i := 0; i < len(a); 1++ { a[i] = i }
-	for i := 0; i < len(a); 1++ { a[i] = i
-	} // multiple lines
-
-	for range a{}
-	for _ = range a{}
-	for _, _ = range a{}
-	for i := range a {}
-	for i := range a { a[i] = i }
-	for i := range a { a[i] = i
-	} // multiple lines
-
-	go func() { for { a <- <-b } }()
-	defer func() { if x := recover(); x != nil { err = fmt.Sprintf("error: %s", x.msg) } }()
-}
-
-
-// Don't remove mandatory parentheses around composite literals in control clauses.
-func _() {
-	// strip parentheses - no composite literals or composite literals don't start with a type name
-	if (x) {}
-	if (((x))) {}
-	if ([]T{}) {}
-	if (([]T{})) {}
-	if ; (((([]T{})))) {}
-
-	for (x) {}
-	for (((x))) {}
-	for ([]T{}) {}
-	for (([]T{})) {}
-	for ; (((([]T{})))) ; {}
-
-	switch (x) {}
-	switch (((x))) {}
-	switch ([]T{}) {}
-	switch ; (((([]T{})))) {}
-
-	for _ = range ((([]T{T{42}}))) {}
-
-	// leave parentheses - composite literals start with a type name
-	if (T{}) {}
-	if ((T{})) {}
-	if ; ((((T{})))) {}
-
-	for (T{}) {}
-	for ((T{})) {}
-	for ; ((((T{})))) ; {}
-
-	switch (T{}) {}
-	switch ; ((((T{})))) {}
-
-	for _ = range (((T1{T{42}}))) {}
-
-	if x == (T{42}[0]) {}
-	if (x == T{42}[0]) {}
-	if (x == (T{42}[0])) {}
-	if (x == (((T{42}[0])))) {}
-	if (((x == (T{42}[0])))) {}
-	if x == a + b*(T{42}[0]) {}
-	if (x == a + b*T{42}[0]) {}
-	if (x == a + b*(T{42}[0])) {}
-	if (x == a + ((b * (T{42}[0])))) {}
-	if (((x == a + b * (T{42}[0])))) {}
-	if (((a + b * (T{42}[0])) == x)) {}
-	if (((a + b * (T{42}[0])))) == x {}
-
-	if (struct{x bool}{false}.x) {}
-	if (struct{x bool}{false}.x) == false {}
-	if (struct{x bool}{false}.x == false) {}
-}
-
-
-// Extra empty lines inside functions. Do respect source code line
-// breaks between statement boundaries but print at most one empty
-// line at a time.
-func _() {
-
-	const _ = 0
-
-	const _ = 1
-	type _ int
-	type _ float
-
-	var _ = 0
-	var x = 1
-
-	// Each use(x) call below should have at most one empty line before and after.
-	// Known bug: The first use call may have more than one empty line before
-	//            (see go/printer/nodes.go, func linebreak).
-
-
-
-	use(x)
-
-	if x < x {
-
-		use(x)
-
-	} else {
-
-		use(x)
-
-	}
-}
-
-
-// Formatting around labels.
-func _() {
-	L:
-}
-
-
-func _() {
-	// this comment should be indented
-	L: ;  // no semicolon needed
-}
-
-
-func _() {
-	switch 0 {
-	case 0:
-		L0: ;  // semicolon required
-	case 1:
-		L1: ;  // semicolon required
-	default:
-		L2: ;  // no semicolon needed
-	}
-}
-
-
-func _() {
-	f()
-L1:
-	f()
-L2:
-	;
-L3:
-}
-
-
-func _() {
-	// this comment should be indented
-	L:
-}
-
-
-func _() {
-	L: _ = 0
-}
-
-
-func _() {
-	// this comment should be indented
-	L: _ = 0
-}
-
-
-func _() {
-	for {
-	L1: _ = 0
-	L2:
-		_ = 0
-	}
-}
-
-
-func _() {
-		// this comment should be indented
-	for {
-	L1: _ = 0
-	L2:
-		_ = 0
-	}
-}
-
-
-func _() {
-	if true {
-		_ = 0
-	}
-	_ = 0  // the indentation here should not be affected by the long label name
-AnOverlongLabel:
-	_ = 0
-	
-	if true {
-		_ = 0
-	}
-	_ = 0
-
-L:	_ = 0
-}
-
-
-func _() {
-	for {
-		goto L
-	}
-L:
-
-	MoreCode()
-}
-
-
-func _() {
-	for {
-		goto L
-	}
-L:	// A comment on the same line as the label, followed by a single empty line.
-	// Known bug: There may be more than one empty line before MoreCode()
-	//            (see go/printer/nodes.go, func linebreak).
-
-
-
-
-	MoreCode()
-}
-
-
-func _() {
-	for {
-		goto L
-	}
-L:
-
-
-
-
-	// There should be a single empty line before this comment.
-	MoreCode()
-}
-
-
-func _() {
-	for {
-		goto AVeryLongLabelThatShouldNotAffectFormatting
-	}
-AVeryLongLabelThatShouldNotAffectFormatting:
-	// There should be a single empty line after this comment.
-
-	// There should be a single empty line before this comment.
-	MoreCode()
-}
-
-
-// Formatting of empty statements.
-func _() {
-	;;;;;;;;;;;;;;;;;;;;;;;;;
-}
-
-func _() {;;;;;;;;;;;;;;;;;;;;;;;;;
-}
-
-func _() {;;;;;;;;;;;;;;;;;;;;;;;;;}
-
-func _() {
-f();;;;;;;;;;;;;;;;;;;;;;;;;
-}
-
-func _() {
-L:;;;;;;;;;;;;
-}
-
-func _() {
-L:;;;;;;;;;;;;
-	f()
-}
diff --git a/third_party/gofrontend/libgo/go/go/scanner/errors.go b/third_party/gofrontend/libgo/go/go/scanner/errors.go
deleted file mode 100644
index bf7bfa3..0000000
--- a/third_party/gofrontend/libgo/go/go/scanner/errors.go
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package scanner
-
-import (
-	"fmt"
-	"go/token"
-	"io"
-	"sort"
-)
-
-// In an ErrorList, an error is represented by an *Error.
-// The position Pos, if valid, points to the beginning of
-// the offending token, and the error condition is described
-// by Msg.
-//
-type Error struct {
-	Pos token.Position
-	Msg string
-}
-
-// Error implements the error interface.
-func (e Error) Error() string {
-	if e.Pos.Filename != "" || e.Pos.IsValid() {
-		// don't print "<unknown position>"
-		// TODO(gri) reconsider the semantics of Position.IsValid
-		return e.Pos.String() + ": " + e.Msg
-	}
-	return e.Msg
-}
-
-// ErrorList is a list of *Errors.
-// The zero value for an ErrorList is an empty ErrorList ready to use.
-//
-type ErrorList []*Error
-
-// Add adds an Error with given position and error message to an ErrorList.
-func (p *ErrorList) Add(pos token.Position, msg string) {
-	*p = append(*p, &Error{pos, msg})
-}
-
-// Reset resets an ErrorList to no errors.
-func (p *ErrorList) Reset() { *p = (*p)[0:0] }
-
-// ErrorList implements the sort Interface.
-func (p ErrorList) Len() int      { return len(p) }
-func (p ErrorList) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
-
-func (p ErrorList) Less(i, j int) bool {
-	e := &p[i].Pos
-	f := &p[j].Pos
-	// Note that it is not sufficient to simply compare file offsets because
-	// the offsets do not reflect modified line information (through //line
-	// comments).
-	if e.Filename != f.Filename {
-		return e.Filename < f.Filename
-	}
-	if e.Line != f.Line {
-		return e.Line < f.Line
-	}
-	if e.Column != f.Column {
-		return e.Column < f.Column
-	}
-	return p[i].Msg < p[j].Msg
-}
-
-// Sort sorts an ErrorList. *Error entries are sorted by position,
-// other errors are sorted by error message, and before any *Error
-// entry.
-//
-func (p ErrorList) Sort() {
-	sort.Sort(p)
-}
-
-// RemoveMultiples sorts an ErrorList and removes all but the first error per line.
-func (p *ErrorList) RemoveMultiples() {
-	sort.Sort(p)
-	var last token.Position // initial last.Line is != any legal error line
-	i := 0
-	for _, e := range *p {
-		if e.Pos.Filename != last.Filename || e.Pos.Line != last.Line {
-			last = e.Pos
-			(*p)[i] = e
-			i++
-		}
-	}
-	(*p) = (*p)[0:i]
-}
-
-// An ErrorList implements the error interface.
-func (p ErrorList) Error() string {
-	switch len(p) {
-	case 0:
-		return "no errors"
-	case 1:
-		return p[0].Error()
-	}
-	return fmt.Sprintf("%s (and %d more errors)", p[0], len(p)-1)
-}
-
-// Err returns an error equivalent to this error list.
-// If the list is empty, Err returns nil.
-func (p ErrorList) Err() error {
-	if len(p) == 0 {
-		return nil
-	}
-	return p
-}
-
-// PrintError is a utility function that prints a list of errors to w,
-// one error per line, if the err parameter is an ErrorList. Otherwise
-// it prints the err string.
-//
-func PrintError(w io.Writer, err error) {
-	if list, ok := err.(ErrorList); ok {
-		for _, e := range list {
-			fmt.Fprintf(w, "%s\n", e)
-		}
-	} else if err != nil {
-		fmt.Fprintf(w, "%s\n", err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/scanner/scanner.go b/third_party/gofrontend/libgo/go/go/scanner/scanner.go
deleted file mode 100644
index e9476c4..0000000
--- a/third_party/gofrontend/libgo/go/go/scanner/scanner.go
+++ /dev/null
@@ -1,761 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package scanner implements a scanner for Go source text.
-// It takes a []byte as source which can then be tokenized
-// through repeated calls to the Scan method.
-//
-package scanner
-
-import (
-	"bytes"
-	"fmt"
-	"go/token"
-	"path/filepath"
-	"strconv"
-	"unicode"
-	"unicode/utf8"
-)
-
-// An ErrorHandler may be provided to Scanner.Init. If a syntax error is
-// encountered and a handler was installed, the handler is called with a
-// position and an error message. The position points to the beginning of
-// the offending token.
-//
-type ErrorHandler func(pos token.Position, msg string)
-
-// A Scanner holds the scanner's internal state while processing
-// a given text.  It can be allocated as part of another data
-// structure but must be initialized via Init before use.
-//
-type Scanner struct {
-	// immutable state
-	file *token.File  // source file handle
-	dir  string       // directory portion of file.Name()
-	src  []byte       // source
-	err  ErrorHandler // error reporting; or nil
-	mode Mode         // scanning mode
-
-	// scanning state
-	ch         rune // current character
-	offset     int  // character offset
-	rdOffset   int  // reading offset (position after current character)
-	lineOffset int  // current line offset
-	insertSemi bool // insert a semicolon before next newline
-
-	// public state - ok to modify
-	ErrorCount int // number of errors encountered
-}
-
-const bom = 0xFEFF // byte order mark, only permitted as very first character
-
-// Read the next Unicode char into s.ch.
-// s.ch < 0 means end-of-file.
-//
-func (s *Scanner) next() {
-	if s.rdOffset < len(s.src) {
-		s.offset = s.rdOffset
-		if s.ch == '\n' {
-			s.lineOffset = s.offset
-			s.file.AddLine(s.offset)
-		}
-		r, w := rune(s.src[s.rdOffset]), 1
-		switch {
-		case r == 0:
-			s.error(s.offset, "illegal character NUL")
-		case r >= 0x80:
-			// not ASCII
-			r, w = utf8.DecodeRune(s.src[s.rdOffset:])
-			if r == utf8.RuneError && w == 1 {
-				s.error(s.offset, "illegal UTF-8 encoding")
-			} else if r == bom && s.offset > 0 {
-				s.error(s.offset, "illegal byte order mark")
-			}
-		}
-		s.rdOffset += w
-		s.ch = r
-	} else {
-		s.offset = len(s.src)
-		if s.ch == '\n' {
-			s.lineOffset = s.offset
-			s.file.AddLine(s.offset)
-		}
-		s.ch = -1 // eof
-	}
-}
-
-// A mode value is a set of flags (or 0).
-// They control scanner behavior.
-//
-type Mode uint
-
-const (
-	ScanComments    Mode = 1 << iota // return comments as COMMENT tokens
-	dontInsertSemis                  // do not automatically insert semicolons - for testing only
-)
-
-// Init prepares the scanner s to tokenize the text src by setting the
-// scanner at the beginning of src. The scanner uses the file set file
-// for position information and it adds line information for each line.
-// It is ok to re-use the same file when re-scanning the same file as
-// line information which is already present is ignored. Init causes a
-// panic if the file size does not match the src size.
-//
-// Calls to Scan will invoke the error handler err if they encounter a
-// syntax error and err is not nil. Also, for each error encountered,
-// the Scanner field ErrorCount is incremented by one. The mode parameter
-// determines how comments are handled.
-//
-// Note that Init may call err if there is an error in the first character
-// of the file.
-//
-func (s *Scanner) Init(file *token.File, src []byte, err ErrorHandler, mode Mode) {
-	// Explicitly initialize all fields since a scanner may be reused.
-	if file.Size() != len(src) {
-		panic(fmt.Sprintf("file size (%d) does not match src len (%d)", file.Size(), len(src)))
-	}
-	s.file = file
-	s.dir, _ = filepath.Split(file.Name())
-	s.src = src
-	s.err = err
-	s.mode = mode
-
-	s.ch = ' '
-	s.offset = 0
-	s.rdOffset = 0
-	s.lineOffset = 0
-	s.insertSemi = false
-	s.ErrorCount = 0
-
-	s.next()
-	if s.ch == bom {
-		s.next() // ignore BOM at file beginning
-	}
-}
-
-func (s *Scanner) error(offs int, msg string) {
-	if s.err != nil {
-		s.err(s.file.Position(s.file.Pos(offs)), msg)
-	}
-	s.ErrorCount++
-}
-
-var prefix = []byte("//line ")
-
-func (s *Scanner) interpretLineComment(text []byte) {
-	if bytes.HasPrefix(text, prefix) {
-		// get filename and line number, if any
-		if i := bytes.LastIndex(text, []byte{':'}); i > 0 {
-			if line, err := strconv.Atoi(string(text[i+1:])); err == nil && line > 0 {
-				// valid //line filename:line comment
-				filename := string(bytes.TrimSpace(text[len(prefix):i]))
-				if filename != "" {
-					filename = filepath.Clean(filename)
-					if !filepath.IsAbs(filename) {
-						// make filename relative to current directory
-						filename = filepath.Join(s.dir, filename)
-					}
-				}
-				// update scanner position
-				s.file.AddLineInfo(s.lineOffset+len(text)+1, filename, line) // +len(text)+1 since comment applies to next line
-			}
-		}
-	}
-}
-
-func (s *Scanner) scanComment() string {
-	// initial '/' already consumed; s.ch == '/' || s.ch == '*'
-	offs := s.offset - 1 // position of initial '/'
-	hasCR := false
-
-	if s.ch == '/' {
-		//-style comment
-		s.next()
-		for s.ch != '\n' && s.ch >= 0 {
-			if s.ch == '\r' {
-				hasCR = true
-			}
-			s.next()
-		}
-		if offs == s.lineOffset {
-			// comment starts at the beginning of the current line
-			s.interpretLineComment(s.src[offs:s.offset])
-		}
-		goto exit
-	}
-
-	/*-style comment */
-	s.next()
-	for s.ch >= 0 {
-		ch := s.ch
-		if ch == '\r' {
-			hasCR = true
-		}
-		s.next()
-		if ch == '*' && s.ch == '/' {
-			s.next()
-			goto exit
-		}
-	}
-
-	s.error(offs, "comment not terminated")
-
-exit:
-	lit := s.src[offs:s.offset]
-	if hasCR {
-		lit = stripCR(lit)
-	}
-
-	return string(lit)
-}
-
-func (s *Scanner) findLineEnd() bool {
-	// initial '/' already consumed
-
-	defer func(offs int) {
-		// reset scanner state to where it was upon calling findLineEnd
-		s.ch = '/'
-		s.offset = offs
-		s.rdOffset = offs + 1
-		s.next() // consume initial '/' again
-	}(s.offset - 1)
-
-	// read ahead until a newline, EOF, or non-comment token is found
-	for s.ch == '/' || s.ch == '*' {
-		if s.ch == '/' {
-			//-style comment always contains a newline
-			return true
-		}
-		/*-style comment: look for newline */
-		s.next()
-		for s.ch >= 0 {
-			ch := s.ch
-			if ch == '\n' {
-				return true
-			}
-			s.next()
-			if ch == '*' && s.ch == '/' {
-				s.next()
-				break
-			}
-		}
-		s.skipWhitespace() // s.insertSemi is set
-		if s.ch < 0 || s.ch == '\n' {
-			return true
-		}
-		if s.ch != '/' {
-			// non-comment token
-			return false
-		}
-		s.next() // consume '/'
-	}
-
-	return false
-}
-
-func isLetter(ch rune) bool {
-	return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch)
-}
-
-func isDigit(ch rune) bool {
-	return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch)
-}
-
-func (s *Scanner) scanIdentifier() string {
-	offs := s.offset
-	for isLetter(s.ch) || isDigit(s.ch) {
-		s.next()
-	}
-	return string(s.src[offs:s.offset])
-}
-
-func digitVal(ch rune) int {
-	switch {
-	case '0' <= ch && ch <= '9':
-		return int(ch - '0')
-	case 'a' <= ch && ch <= 'f':
-		return int(ch - 'a' + 10)
-	case 'A' <= ch && ch <= 'F':
-		return int(ch - 'A' + 10)
-	}
-	return 16 // larger than any legal digit val
-}
-
-func (s *Scanner) scanMantissa(base int) {
-	for digitVal(s.ch) < base {
-		s.next()
-	}
-}
-
-func (s *Scanner) scanNumber(seenDecimalPoint bool) (token.Token, string) {
-	// digitVal(s.ch) < 10
-	offs := s.offset
-	tok := token.INT
-
-	if seenDecimalPoint {
-		offs--
-		tok = token.FLOAT
-		s.scanMantissa(10)
-		goto exponent
-	}
-
-	if s.ch == '0' {
-		// int or float
-		offs := s.offset
-		s.next()
-		if s.ch == 'x' || s.ch == 'X' {
-			// hexadecimal int
-			s.next()
-			s.scanMantissa(16)
-			if s.offset-offs <= 2 {
-				// only scanned "0x" or "0X"
-				s.error(offs, "illegal hexadecimal number")
-			}
-		} else {
-			// octal int or float
-			seenDecimalDigit := false
-			s.scanMantissa(8)
-			if s.ch == '8' || s.ch == '9' {
-				// illegal octal int or float
-				seenDecimalDigit = true
-				s.scanMantissa(10)
-			}
-			if s.ch == '.' || s.ch == 'e' || s.ch == 'E' || s.ch == 'i' {
-				goto fraction
-			}
-			// octal int
-			if seenDecimalDigit {
-				s.error(offs, "illegal octal number")
-			}
-		}
-		goto exit
-	}
-
-	// decimal int or float
-	s.scanMantissa(10)
-
-fraction:
-	if s.ch == '.' {
-		tok = token.FLOAT
-		s.next()
-		s.scanMantissa(10)
-	}
-
-exponent:
-	if s.ch == 'e' || s.ch == 'E' {
-		tok = token.FLOAT
-		s.next()
-		if s.ch == '-' || s.ch == '+' {
-			s.next()
-		}
-		s.scanMantissa(10)
-	}
-
-	if s.ch == 'i' {
-		tok = token.IMAG
-		s.next()
-	}
-
-exit:
-	return tok, string(s.src[offs:s.offset])
-}
-
-// scanEscape parses an escape sequence where rune is the accepted
-// escaped quote. In case of a syntax error, it stops at the offending
-// character (without consuming it) and returns false. Otherwise
-// it returns true.
-func (s *Scanner) scanEscape(quote rune) bool {
-	offs := s.offset
-
-	var n int
-	var base, max uint32
-	switch s.ch {
-	case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', quote:
-		s.next()
-		return true
-	case '0', '1', '2', '3', '4', '5', '6', '7':
-		n, base, max = 3, 8, 255
-	case 'x':
-		s.next()
-		n, base, max = 2, 16, 255
-	case 'u':
-		s.next()
-		n, base, max = 4, 16, unicode.MaxRune
-	case 'U':
-		s.next()
-		n, base, max = 8, 16, unicode.MaxRune
-	default:
-		msg := "unknown escape sequence"
-		if s.ch < 0 {
-			msg = "escape sequence not terminated"
-		}
-		s.error(offs, msg)
-		return false
-	}
-
-	var x uint32
-	for n > 0 {
-		d := uint32(digitVal(s.ch))
-		if d >= base {
-			msg := fmt.Sprintf("illegal character %#U in escape sequence", s.ch)
-			if s.ch < 0 {
-				msg = "escape sequence not terminated"
-			}
-			s.error(s.offset, msg)
-			return false
-		}
-		x = x*base + d
-		s.next()
-		n--
-	}
-
-	if x > max || 0xD800 <= x && x < 0xE000 {
-		s.error(offs, "escape sequence is invalid Unicode code point")
-		return false
-	}
-
-	return true
-}
-
-func (s *Scanner) scanRune() string {
-	// '\'' opening already consumed
-	offs := s.offset - 1
-
-	valid := true
-	n := 0
-	for {
-		ch := s.ch
-		if ch == '\n' || ch < 0 {
-			// only report error if we don't have one already
-			if valid {
-				s.error(offs, "rune literal not terminated")
-				valid = false
-			}
-			break
-		}
-		s.next()
-		if ch == '\'' {
-			break
-		}
-		n++
-		if ch == '\\' {
-			if !s.scanEscape('\'') {
-				valid = false
-			}
-			// continue to read to closing quote
-		}
-	}
-
-	if valid && n != 1 {
-		s.error(offs, "illegal rune literal")
-	}
-
-	return string(s.src[offs:s.offset])
-}
-
-func (s *Scanner) scanString() string {
-	// '"' opening already consumed
-	offs := s.offset - 1
-
-	for {
-		ch := s.ch
-		if ch == '\n' || ch < 0 {
-			s.error(offs, "string literal not terminated")
-			break
-		}
-		s.next()
-		if ch == '"' {
-			break
-		}
-		if ch == '\\' {
-			s.scanEscape('"')
-		}
-	}
-
-	return string(s.src[offs:s.offset])
-}
-
-func stripCR(b []byte) []byte {
-	c := make([]byte, len(b))
-	i := 0
-	for _, ch := range b {
-		if ch != '\r' {
-			c[i] = ch
-			i++
-		}
-	}
-	return c[:i]
-}
-
-func (s *Scanner) scanRawString() string {
-	// '`' opening already consumed
-	offs := s.offset - 1
-
-	hasCR := false
-	for {
-		ch := s.ch
-		if ch < 0 {
-			s.error(offs, "raw string literal not terminated")
-			break
-		}
-		s.next()
-		if ch == '`' {
-			break
-		}
-		if ch == '\r' {
-			hasCR = true
-		}
-	}
-
-	lit := s.src[offs:s.offset]
-	if hasCR {
-		lit = stripCR(lit)
-	}
-
-	return string(lit)
-}
-
-func (s *Scanner) skipWhitespace() {
-	for s.ch == ' ' || s.ch == '\t' || s.ch == '\n' && !s.insertSemi || s.ch == '\r' {
-		s.next()
-	}
-}
-
-// Helper functions for scanning multi-byte tokens such as >> += >>= .
-// Different routines recognize different length tok_i based on matches
-// of ch_i. If a token ends in '=', the result is tok1 or tok3
-// respectively. Otherwise, the result is tok0 if there was no other
-// matching character, or tok2 if the matching character was ch2.
-
-func (s *Scanner) switch2(tok0, tok1 token.Token) token.Token {
-	if s.ch == '=' {
-		s.next()
-		return tok1
-	}
-	return tok0
-}
-
-func (s *Scanner) switch3(tok0, tok1 token.Token, ch2 rune, tok2 token.Token) token.Token {
-	if s.ch == '=' {
-		s.next()
-		return tok1
-	}
-	if s.ch == ch2 {
-		s.next()
-		return tok2
-	}
-	return tok0
-}
-
-func (s *Scanner) switch4(tok0, tok1 token.Token, ch2 rune, tok2, tok3 token.Token) token.Token {
-	if s.ch == '=' {
-		s.next()
-		return tok1
-	}
-	if s.ch == ch2 {
-		s.next()
-		if s.ch == '=' {
-			s.next()
-			return tok3
-		}
-		return tok2
-	}
-	return tok0
-}
-
-// Scan scans the next token and returns the token position, the token,
-// and its literal string if applicable. The source end is indicated by
-// token.EOF.
-//
-// If the returned token is a literal (token.IDENT, token.INT, token.FLOAT,
-// token.IMAG, token.CHAR, token.STRING) or token.COMMENT, the literal string
-// has the corresponding value.
-//
-// If the returned token is a keyword, the literal string is the keyword.
-//
-// If the returned token is token.SEMICOLON, the corresponding
-// literal string is ";" if the semicolon was present in the source,
-// and "\n" if the semicolon was inserted because of a newline or
-// at EOF.
-//
-// If the returned token is token.ILLEGAL, the literal string is the
-// offending character.
-//
-// In all other cases, Scan returns an empty literal string.
-//
-// For more tolerant parsing, Scan will return a valid token if
-// possible even if a syntax error was encountered. Thus, even
-// if the resulting token sequence contains no illegal tokens,
-// a client may not assume that no error occurred. Instead it
-// must check the scanner's ErrorCount or the number of calls
-// of the error handler, if there was one installed.
-//
-// Scan adds line information to the file added to the file
-// set with Init. Token positions are relative to that file
-// and thus relative to the file set.
-//
-func (s *Scanner) Scan() (pos token.Pos, tok token.Token, lit string) {
-scanAgain:
-	s.skipWhitespace()
-
-	// current token start
-	pos = s.file.Pos(s.offset)
-
-	// determine token value
-	insertSemi := false
-	switch ch := s.ch; {
-	case isLetter(ch):
-		lit = s.scanIdentifier()
-		if len(lit) > 1 {
-			// keywords are longer than one letter - avoid lookup otherwise
-			tok = token.Lookup(lit)
-			switch tok {
-			case token.IDENT, token.BREAK, token.CONTINUE, token.FALLTHROUGH, token.RETURN:
-				insertSemi = true
-			}
-		} else {
-			insertSemi = true
-			tok = token.IDENT
-		}
-	case '0' <= ch && ch <= '9':
-		insertSemi = true
-		tok, lit = s.scanNumber(false)
-	default:
-		s.next() // always make progress
-		switch ch {
-		case -1:
-			if s.insertSemi {
-				s.insertSemi = false // EOF consumed
-				return pos, token.SEMICOLON, "\n"
-			}
-			tok = token.EOF
-		case '\n':
-			// we only reach here if s.insertSemi was
-			// set in the first place and exited early
-			// from s.skipWhitespace()
-			s.insertSemi = false // newline consumed
-			return pos, token.SEMICOLON, "\n"
-		case '"':
-			insertSemi = true
-			tok = token.STRING
-			lit = s.scanString()
-		case '\'':
-			insertSemi = true
-			tok = token.CHAR
-			lit = s.scanRune()
-		case '`':
-			insertSemi = true
-			tok = token.STRING
-			lit = s.scanRawString()
-		case ':':
-			tok = s.switch2(token.COLON, token.DEFINE)
-		case '.':
-			if '0' <= s.ch && s.ch <= '9' {
-				insertSemi = true
-				tok, lit = s.scanNumber(true)
-			} else if s.ch == '.' {
-				s.next()
-				if s.ch == '.' {
-					s.next()
-					tok = token.ELLIPSIS
-				}
-			} else {
-				tok = token.PERIOD
-			}
-		case ',':
-			tok = token.COMMA
-		case ';':
-			tok = token.SEMICOLON
-			lit = ";"
-		case '(':
-			tok = token.LPAREN
-		case ')':
-			insertSemi = true
-			tok = token.RPAREN
-		case '[':
-			tok = token.LBRACK
-		case ']':
-			insertSemi = true
-			tok = token.RBRACK
-		case '{':
-			tok = token.LBRACE
-		case '}':
-			insertSemi = true
-			tok = token.RBRACE
-		case '+':
-			tok = s.switch3(token.ADD, token.ADD_ASSIGN, '+', token.INC)
-			if tok == token.INC {
-				insertSemi = true
-			}
-		case '-':
-			tok = s.switch3(token.SUB, token.SUB_ASSIGN, '-', token.DEC)
-			if tok == token.DEC {
-				insertSemi = true
-			}
-		case '*':
-			tok = s.switch2(token.MUL, token.MUL_ASSIGN)
-		case '/':
-			if s.ch == '/' || s.ch == '*' {
-				// comment
-				if s.insertSemi && s.findLineEnd() {
-					// reset position to the beginning of the comment
-					s.ch = '/'
-					s.offset = s.file.Offset(pos)
-					s.rdOffset = s.offset + 1
-					s.insertSemi = false // newline consumed
-					return pos, token.SEMICOLON, "\n"
-				}
-				comment := s.scanComment()
-				if s.mode&ScanComments == 0 {
-					// skip comment
-					s.insertSemi = false // newline consumed
-					goto scanAgain
-				}
-				tok = token.COMMENT
-				lit = comment
-			} else {
-				tok = s.switch2(token.QUO, token.QUO_ASSIGN)
-			}
-		case '%':
-			tok = s.switch2(token.REM, token.REM_ASSIGN)
-		case '^':
-			tok = s.switch2(token.XOR, token.XOR_ASSIGN)
-		case '<':
-			if s.ch == '-' {
-				s.next()
-				tok = token.ARROW
-			} else {
-				tok = s.switch4(token.LSS, token.LEQ, '<', token.SHL, token.SHL_ASSIGN)
-			}
-		case '>':
-			tok = s.switch4(token.GTR, token.GEQ, '>', token.SHR, token.SHR_ASSIGN)
-		case '=':
-			tok = s.switch2(token.ASSIGN, token.EQL)
-		case '!':
-			tok = s.switch2(token.NOT, token.NEQ)
-		case '&':
-			if s.ch == '^' {
-				s.next()
-				tok = s.switch2(token.AND_NOT, token.AND_NOT_ASSIGN)
-			} else {
-				tok = s.switch3(token.AND, token.AND_ASSIGN, '&', token.LAND)
-			}
-		case '|':
-			tok = s.switch3(token.OR, token.OR_ASSIGN, '|', token.LOR)
-		default:
-			// next reports unexpected BOMs - don't repeat
-			if ch != bom {
-				s.error(s.file.Offset(pos), fmt.Sprintf("illegal character %#U", ch))
-			}
-			insertSemi = s.insertSemi // preserve insertSemi info
-			tok = token.ILLEGAL
-			lit = string(ch)
-		}
-	}
-	if s.mode&dontInsertSemis == 0 {
-		s.insertSemi = insertSemi
-	}
-
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/go/scanner/scanner_test.go b/third_party/gofrontend/libgo/go/go/scanner/scanner_test.go
deleted file mode 100644
index 0d21905..0000000
--- a/third_party/gofrontend/libgo/go/go/scanner/scanner_test.go
+++ /dev/null
@@ -1,810 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package scanner
-
-import (
-	"go/token"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"runtime"
-	"testing"
-)
-
-var fset = token.NewFileSet()
-
-const /* class */ (
-	special = iota
-	literal
-	operator
-	keyword
-)
-
-func tokenclass(tok token.Token) int {
-	switch {
-	case tok.IsLiteral():
-		return literal
-	case tok.IsOperator():
-		return operator
-	case tok.IsKeyword():
-		return keyword
-	}
-	return special
-}
-
-type elt struct {
-	tok   token.Token
-	lit   string
-	class int
-}
-
-var tokens = [...]elt{
-	// Special tokens
-	{token.COMMENT, "/* a comment */", special},
-	{token.COMMENT, "// a comment \n", special},
-	{token.COMMENT, "/*\r*/", special},
-	{token.COMMENT, "//\r\n", special},
-
-	// Identifiers and basic type literals
-	{token.IDENT, "foobar", literal},
-	{token.IDENT, "a۰۱۸", literal},
-	{token.IDENT, "foo६४", literal},
-	{token.IDENT, "bar9876", literal},
-	{token.IDENT, "ŝ", literal},    // was bug (issue 4000)
-	{token.IDENT, "ŝfoo", literal}, // was bug (issue 4000)
-	{token.INT, "0", literal},
-	{token.INT, "1", literal},
-	{token.INT, "123456789012345678890", literal},
-	{token.INT, "01234567", literal},
-	{token.INT, "0xcafebabe", literal},
-	{token.FLOAT, "0.", literal},
-	{token.FLOAT, ".0", literal},
-	{token.FLOAT, "3.14159265", literal},
-	{token.FLOAT, "1e0", literal},
-	{token.FLOAT, "1e+100", literal},
-	{token.FLOAT, "1e-100", literal},
-	{token.FLOAT, "2.71828e-1000", literal},
-	{token.IMAG, "0i", literal},
-	{token.IMAG, "1i", literal},
-	{token.IMAG, "012345678901234567889i", literal},
-	{token.IMAG, "123456789012345678890i", literal},
-	{token.IMAG, "0.i", literal},
-	{token.IMAG, ".0i", literal},
-	{token.IMAG, "3.14159265i", literal},
-	{token.IMAG, "1e0i", literal},
-	{token.IMAG, "1e+100i", literal},
-	{token.IMAG, "1e-100i", literal},
-	{token.IMAG, "2.71828e-1000i", literal},
-	{token.CHAR, "'a'", literal},
-	{token.CHAR, "'\\000'", literal},
-	{token.CHAR, "'\\xFF'", literal},
-	{token.CHAR, "'\\uff16'", literal},
-	{token.CHAR, "'\\U0000ff16'", literal},
-	{token.STRING, "`foobar`", literal},
-	{token.STRING, "`" + `foo
-	                        bar` +
-		"`",
-		literal,
-	},
-	{token.STRING, "`\r`", literal},
-	{token.STRING, "`foo\r\nbar`", literal},
-
-	// Operators and delimiters
-	{token.ADD, "+", operator},
-	{token.SUB, "-", operator},
-	{token.MUL, "*", operator},
-	{token.QUO, "/", operator},
-	{token.REM, "%", operator},
-
-	{token.AND, "&", operator},
-	{token.OR, "|", operator},
-	{token.XOR, "^", operator},
-	{token.SHL, "<<", operator},
-	{token.SHR, ">>", operator},
-	{token.AND_NOT, "&^", operator},
-
-	{token.ADD_ASSIGN, "+=", operator},
-	{token.SUB_ASSIGN, "-=", operator},
-	{token.MUL_ASSIGN, "*=", operator},
-	{token.QUO_ASSIGN, "/=", operator},
-	{token.REM_ASSIGN, "%=", operator},
-
-	{token.AND_ASSIGN, "&=", operator},
-	{token.OR_ASSIGN, "|=", operator},
-	{token.XOR_ASSIGN, "^=", operator},
-	{token.SHL_ASSIGN, "<<=", operator},
-	{token.SHR_ASSIGN, ">>=", operator},
-	{token.AND_NOT_ASSIGN, "&^=", operator},
-
-	{token.LAND, "&&", operator},
-	{token.LOR, "||", operator},
-	{token.ARROW, "<-", operator},
-	{token.INC, "++", operator},
-	{token.DEC, "--", operator},
-
-	{token.EQL, "==", operator},
-	{token.LSS, "<", operator},
-	{token.GTR, ">", operator},
-	{token.ASSIGN, "=", operator},
-	{token.NOT, "!", operator},
-
-	{token.NEQ, "!=", operator},
-	{token.LEQ, "<=", operator},
-	{token.GEQ, ">=", operator},
-	{token.DEFINE, ":=", operator},
-	{token.ELLIPSIS, "...", operator},
-
-	{token.LPAREN, "(", operator},
-	{token.LBRACK, "[", operator},
-	{token.LBRACE, "{", operator},
-	{token.COMMA, ",", operator},
-	{token.PERIOD, ".", operator},
-
-	{token.RPAREN, ")", operator},
-	{token.RBRACK, "]", operator},
-	{token.RBRACE, "}", operator},
-	{token.SEMICOLON, ";", operator},
-	{token.COLON, ":", operator},
-
-	// Keywords
-	{token.BREAK, "break", keyword},
-	{token.CASE, "case", keyword},
-	{token.CHAN, "chan", keyword},
-	{token.CONST, "const", keyword},
-	{token.CONTINUE, "continue", keyword},
-
-	{token.DEFAULT, "default", keyword},
-	{token.DEFER, "defer", keyword},
-	{token.ELSE, "else", keyword},
-	{token.FALLTHROUGH, "fallthrough", keyword},
-	{token.FOR, "for", keyword},
-
-	{token.FUNC, "func", keyword},
-	{token.GO, "go", keyword},
-	{token.GOTO, "goto", keyword},
-	{token.IF, "if", keyword},
-	{token.IMPORT, "import", keyword},
-
-	{token.INTERFACE, "interface", keyword},
-	{token.MAP, "map", keyword},
-	{token.PACKAGE, "package", keyword},
-	{token.RANGE, "range", keyword},
-	{token.RETURN, "return", keyword},
-
-	{token.SELECT, "select", keyword},
-	{token.STRUCT, "struct", keyword},
-	{token.SWITCH, "switch", keyword},
-	{token.TYPE, "type", keyword},
-	{token.VAR, "var", keyword},
-}
-
-const whitespace = "  \t  \n\n\n" // to separate tokens
-
-var source = func() []byte {
-	var src []byte
-	for _, t := range tokens {
-		src = append(src, t.lit...)
-		src = append(src, whitespace...)
-	}
-	return src
-}()
-
-func newlineCount(s string) int {
-	n := 0
-	for i := 0; i < len(s); i++ {
-		if s[i] == '\n' {
-			n++
-		}
-	}
-	return n
-}
-
-func checkPos(t *testing.T, lit string, p token.Pos, expected token.Position) {
-	pos := fset.Position(p)
-	if pos.Filename != expected.Filename {
-		t.Errorf("bad filename for %q: got %s, expected %s", lit, pos.Filename, expected.Filename)
-	}
-	if pos.Offset != expected.Offset {
-		t.Errorf("bad position for %q: got %d, expected %d", lit, pos.Offset, expected.Offset)
-	}
-	if pos.Line != expected.Line {
-		t.Errorf("bad line for %q: got %d, expected %d", lit, pos.Line, expected.Line)
-	}
-	if pos.Column != expected.Column {
-		t.Errorf("bad column for %q: got %d, expected %d", lit, pos.Column, expected.Column)
-	}
-}
-
-// Verify that calling Scan() provides the correct results.
-func TestScan(t *testing.T) {
-	whitespace_linecount := newlineCount(whitespace)
-
-	// error handler
-	eh := func(_ token.Position, msg string) {
-		t.Errorf("error handler called (msg = %s)", msg)
-	}
-
-	// verify scan
-	var s Scanner
-	s.Init(fset.AddFile("", fset.Base(), len(source)), source, eh, ScanComments|dontInsertSemis)
-
-	// set up expected position
-	epos := token.Position{
-		Filename: "",
-		Offset:   0,
-		Line:     1,
-		Column:   1,
-	}
-
-	index := 0
-	for {
-		pos, tok, lit := s.Scan()
-
-		// check position
-		if tok == token.EOF {
-			// correction for EOF
-			epos.Line = newlineCount(string(source))
-			epos.Column = 2
-		}
-		checkPos(t, lit, pos, epos)
-
-		// check token
-		e := elt{token.EOF, "", special}
-		if index < len(tokens) {
-			e = tokens[index]
-			index++
-		}
-		if tok != e.tok {
-			t.Errorf("bad token for %q: got %s, expected %s", lit, tok, e.tok)
-		}
-
-		// check token class
-		if tokenclass(tok) != e.class {
-			t.Errorf("bad class for %q: got %d, expected %d", lit, tokenclass(tok), e.class)
-		}
-
-		// check literal
-		elit := ""
-		switch e.tok {
-		case token.COMMENT:
-			// no CRs in comments
-			elit = string(stripCR([]byte(e.lit)))
-			//-style comment literal doesn't contain newline
-			if elit[1] == '/' {
-				elit = elit[0 : len(elit)-1]
-			}
-		case token.IDENT:
-			elit = e.lit
-		case token.SEMICOLON:
-			elit = ";"
-		default:
-			if e.tok.IsLiteral() {
-				// no CRs in raw string literals
-				elit = e.lit
-				if elit[0] == '`' {
-					elit = string(stripCR([]byte(elit)))
-				}
-			} else if e.tok.IsKeyword() {
-				elit = e.lit
-			}
-		}
-		if lit != elit {
-			t.Errorf("bad literal for %q: got %q, expected %q", lit, lit, elit)
-		}
-
-		if tok == token.EOF {
-			break
-		}
-
-		// update position
-		epos.Offset += len(e.lit) + len(whitespace)
-		epos.Line += newlineCount(e.lit) + whitespace_linecount
-
-	}
-
-	if s.ErrorCount != 0 {
-		t.Errorf("found %d errors", s.ErrorCount)
-	}
-}
-
-func checkSemi(t *testing.T, line string, mode Mode) {
-	var S Scanner
-	file := fset.AddFile("TestSemis", fset.Base(), len(line))
-	S.Init(file, []byte(line), nil, mode)
-	pos, tok, lit := S.Scan()
-	for tok != token.EOF {
-		if tok == token.ILLEGAL {
-			// the illegal token literal indicates what
-			// kind of semicolon literal to expect
-			semiLit := "\n"
-			if lit[0] == '#' {
-				semiLit = ";"
-			}
-			// next token must be a semicolon
-			semiPos := file.Position(pos)
-			semiPos.Offset++
-			semiPos.Column++
-			pos, tok, lit = S.Scan()
-			if tok == token.SEMICOLON {
-				if lit != semiLit {
-					t.Errorf(`bad literal for %q: got %q, expected %q`, line, lit, semiLit)
-				}
-				checkPos(t, line, pos, semiPos)
-			} else {
-				t.Errorf("bad token for %q: got %s, expected ;", line, tok)
-			}
-		} else if tok == token.SEMICOLON {
-			t.Errorf("bad token for %q: got ;, expected no ;", line)
-		}
-		pos, tok, lit = S.Scan()
-	}
-}
-
-var lines = []string{
-	// # indicates a semicolon present in the source
-	// $ indicates an automatically inserted semicolon
-	"",
-	"\ufeff#;", // first BOM is ignored
-	"#;",
-	"foo$\n",
-	"123$\n",
-	"1.2$\n",
-	"'x'$\n",
-	`"x"` + "$\n",
-	"`x`$\n",
-
-	"+\n",
-	"-\n",
-	"*\n",
-	"/\n",
-	"%\n",
-
-	"&\n",
-	"|\n",
-	"^\n",
-	"<<\n",
-	">>\n",
-	"&^\n",
-
-	"+=\n",
-	"-=\n",
-	"*=\n",
-	"/=\n",
-	"%=\n",
-
-	"&=\n",
-	"|=\n",
-	"^=\n",
-	"<<=\n",
-	">>=\n",
-	"&^=\n",
-
-	"&&\n",
-	"||\n",
-	"<-\n",
-	"++$\n",
-	"--$\n",
-
-	"==\n",
-	"<\n",
-	">\n",
-	"=\n",
-	"!\n",
-
-	"!=\n",
-	"<=\n",
-	">=\n",
-	":=\n",
-	"...\n",
-
-	"(\n",
-	"[\n",
-	"{\n",
-	",\n",
-	".\n",
-
-	")$\n",
-	"]$\n",
-	"}$\n",
-	"#;\n",
-	":\n",
-
-	"break$\n",
-	"case\n",
-	"chan\n",
-	"const\n",
-	"continue$\n",
-
-	"default\n",
-	"defer\n",
-	"else\n",
-	"fallthrough$\n",
-	"for\n",
-
-	"func\n",
-	"go\n",
-	"goto\n",
-	"if\n",
-	"import\n",
-
-	"interface\n",
-	"map\n",
-	"package\n",
-	"range\n",
-	"return$\n",
-
-	"select\n",
-	"struct\n",
-	"switch\n",
-	"type\n",
-	"var\n",
-
-	"foo$//comment\n",
-	"foo$//comment",
-	"foo$/*comment*/\n",
-	"foo$/*\n*/",
-	"foo$/*comment*/    \n",
-	"foo$/*\n*/    ",
-
-	"foo    $// comment\n",
-	"foo    $// comment",
-	"foo    $/*comment*/\n",
-	"foo    $/*\n*/",
-	"foo    $/*  */ /* \n */ bar$/**/\n",
-	"foo    $/*0*/ /*1*/ /*2*/\n",
-
-	"foo    $/*comment*/    \n",
-	"foo    $/*0*/ /*1*/ /*2*/    \n",
-	"foo	$/**/ /*-------------*/       /*----\n*/bar       $/*  \n*/baa$\n",
-	"foo    $/* an EOF terminates a line */",
-	"foo    $/* an EOF terminates a line */ /*",
-	"foo    $/* an EOF terminates a line */ //",
-
-	"package main$\n\nfunc main() {\n\tif {\n\t\treturn /* */ }$\n}$\n",
-	"package main$",
-}
-
-func TestSemis(t *testing.T) {
-	for _, line := range lines {
-		checkSemi(t, line, 0)
-		checkSemi(t, line, ScanComments)
-
-		// if the input ended in newlines, the input must tokenize the
-		// same with or without those newlines
-		for i := len(line) - 1; i >= 0 && line[i] == '\n'; i-- {
-			checkSemi(t, line[0:i], 0)
-			checkSemi(t, line[0:i], ScanComments)
-		}
-	}
-}
-
-type segment struct {
-	srcline  string // a line of source text
-	filename string // filename for current token
-	line     int    // line number for current token
-}
-
-var segments = []segment{
-	// exactly one token per line since the test consumes one token per segment
-	{"  line1", filepath.Join("dir", "TestLineComments"), 1},
-	{"\nline2", filepath.Join("dir", "TestLineComments"), 2},
-	{"\nline3  //line File1.go:100", filepath.Join("dir", "TestLineComments"), 3}, // bad line comment, ignored
-	{"\nline4", filepath.Join("dir", "TestLineComments"), 4},
-	{"\n//line File1.go:100\n  line100", filepath.Join("dir", "File1.go"), 100},
-	{"\n//line  \t :42\n  line1", "", 42},
-	{"\n//line File2.go:200\n  line200", filepath.Join("dir", "File2.go"), 200},
-	{"\n//line foo\t:42\n  line42", filepath.Join("dir", "foo"), 42},
-	{"\n //line foo:42\n  line44", filepath.Join("dir", "foo"), 44},           // bad line comment, ignored
-	{"\n//line foo 42\n  line46", filepath.Join("dir", "foo"), 46},            // bad line comment, ignored
-	{"\n//line foo:42 extra text\n  line48", filepath.Join("dir", "foo"), 48}, // bad line comment, ignored
-	{"\n//line ./foo:42\n  line42", filepath.Join("dir", "foo"), 42},
-	{"\n//line a/b/c/File1.go:100\n  line100", filepath.Join("dir", "a", "b", "c", "File1.go"), 100},
-}
-
-var unixsegments = []segment{
-	{"\n//line /bar:42\n  line42", "/bar", 42},
-}
-
-var winsegments = []segment{
-	{"\n//line c:\\bar:42\n  line42", "c:\\bar", 42},
-	{"\n//line c:\\dir\\File1.go:100\n  line100", "c:\\dir\\File1.go", 100},
-}
-
-// Verify that comments of the form "//line filename:line" are interpreted correctly.
-func TestLineComments(t *testing.T) {
-	segs := segments
-	if runtime.GOOS == "windows" {
-		segs = append(segs, winsegments...)
-	} else {
-		segs = append(segs, unixsegments...)
-	}
-
-	// make source
-	var src string
-	for _, e := range segs {
-		src += e.srcline
-	}
-
-	// verify scan
-	var S Scanner
-	file := fset.AddFile(filepath.Join("dir", "TestLineComments"), fset.Base(), len(src))
-	S.Init(file, []byte(src), nil, dontInsertSemis)
-	for _, s := range segs {
-		p, _, lit := S.Scan()
-		pos := file.Position(p)
-		checkPos(t, lit, p, token.Position{
-			Filename: s.filename,
-			Offset:   pos.Offset,
-			Line:     s.line,
-			Column:   pos.Column,
-		})
-	}
-
-	if S.ErrorCount != 0 {
-		t.Errorf("found %d errors", S.ErrorCount)
-	}
-}
-
-// Verify that initializing the same scanner more than once works correctly.
-func TestInit(t *testing.T) {
-	var s Scanner
-
-	// 1st init
-	src1 := "if true { }"
-	f1 := fset.AddFile("src1", fset.Base(), len(src1))
-	s.Init(f1, []byte(src1), nil, dontInsertSemis)
-	if f1.Size() != len(src1) {
-		t.Errorf("bad file size: got %d, expected %d", f1.Size(), len(src1))
-	}
-	s.Scan()              // if
-	s.Scan()              // true
-	_, tok, _ := s.Scan() // {
-	if tok != token.LBRACE {
-		t.Errorf("bad token: got %s, expected %s", tok, token.LBRACE)
-	}
-
-	// 2nd init
-	src2 := "go true { ]"
-	f2 := fset.AddFile("src2", fset.Base(), len(src2))
-	s.Init(f2, []byte(src2), nil, dontInsertSemis)
-	if f2.Size() != len(src2) {
-		t.Errorf("bad file size: got %d, expected %d", f2.Size(), len(src2))
-	}
-	_, tok, _ = s.Scan() // go
-	if tok != token.GO {
-		t.Errorf("bad token: got %s, expected %s", tok, token.GO)
-	}
-
-	if s.ErrorCount != 0 {
-		t.Errorf("found %d errors", s.ErrorCount)
-	}
-}
-
-func TestStdErrorHander(t *testing.T) {
-	const src = "@\n" + // illegal character, cause an error
-		"@ @\n" + // two errors on the same line
-		"//line File2:20\n" +
-		"@\n" + // different file, but same line
-		"//line File2:1\n" +
-		"@ @\n" + // same file, decreasing line number
-		"//line File1:1\n" +
-		"@ @ @" // original file, line 1 again
-
-	var list ErrorList
-	eh := func(pos token.Position, msg string) { list.Add(pos, msg) }
-
-	var s Scanner
-	s.Init(fset.AddFile("File1", fset.Base(), len(src)), []byte(src), eh, dontInsertSemis)
-	for {
-		if _, tok, _ := s.Scan(); tok == token.EOF {
-			break
-		}
-	}
-
-	if len(list) != s.ErrorCount {
-		t.Errorf("found %d errors, expected %d", len(list), s.ErrorCount)
-	}
-
-	if len(list) != 9 {
-		t.Errorf("found %d raw errors, expected 9", len(list))
-		PrintError(os.Stderr, list)
-	}
-
-	list.Sort()
-	if len(list) != 9 {
-		t.Errorf("found %d sorted errors, expected 9", len(list))
-		PrintError(os.Stderr, list)
-	}
-
-	list.RemoveMultiples()
-	if len(list) != 4 {
-		t.Errorf("found %d one-per-line errors, expected 4", len(list))
-		PrintError(os.Stderr, list)
-	}
-}
-
-type errorCollector struct {
-	cnt int            // number of errors encountered
-	msg string         // last error message encountered
-	pos token.Position // last error position encountered
-}
-
-func checkError(t *testing.T, src string, tok token.Token, pos int, lit, err string) {
-	var s Scanner
-	var h errorCollector
-	eh := func(pos token.Position, msg string) {
-		h.cnt++
-		h.msg = msg
-		h.pos = pos
-	}
-	s.Init(fset.AddFile("", fset.Base(), len(src)), []byte(src), eh, ScanComments|dontInsertSemis)
-	_, tok0, lit0 := s.Scan()
-	if tok0 != tok {
-		t.Errorf("%q: got %s, expected %s", src, tok0, tok)
-	}
-	if tok0 != token.ILLEGAL && lit0 != lit {
-		t.Errorf("%q: got literal %q, expected %q", src, lit0, lit)
-	}
-	cnt := 0
-	if err != "" {
-		cnt = 1
-	}
-	if h.cnt != cnt {
-		t.Errorf("%q: got cnt %d, expected %d", src, h.cnt, cnt)
-	}
-	if h.msg != err {
-		t.Errorf("%q: got msg %q, expected %q", src, h.msg, err)
-	}
-	if h.pos.Offset != pos {
-		t.Errorf("%q: got offset %d, expected %d", src, h.pos.Offset, pos)
-	}
-}
-
-var errors = []struct {
-	src string
-	tok token.Token
-	pos int
-	lit string
-	err string
-}{
-	{"\a", token.ILLEGAL, 0, "", "illegal character U+0007"},
-	{`#`, token.ILLEGAL, 0, "", "illegal character U+0023 '#'"},
-	{`…`, token.ILLEGAL, 0, "", "illegal character U+2026 '…'"},
-	{`' '`, token.CHAR, 0, `' '`, ""},
-	{`''`, token.CHAR, 0, `''`, "illegal rune literal"},
-	{`'12'`, token.CHAR, 0, `'12'`, "illegal rune literal"},
-	{`'123'`, token.CHAR, 0, `'123'`, "illegal rune literal"},
-	{`'\0'`, token.CHAR, 3, `'\0'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\07'`, token.CHAR, 4, `'\07'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\8'`, token.CHAR, 2, `'\8'`, "unknown escape sequence"},
-	{`'\08'`, token.CHAR, 3, `'\08'`, "illegal character U+0038 '8' in escape sequence"},
-	{`'\x'`, token.CHAR, 3, `'\x'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\x0'`, token.CHAR, 4, `'\x0'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\x0g'`, token.CHAR, 4, `'\x0g'`, "illegal character U+0067 'g' in escape sequence"},
-	{`'\u'`, token.CHAR, 3, `'\u'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\u0'`, token.CHAR, 4, `'\u0'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\u00'`, token.CHAR, 5, `'\u00'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\u000'`, token.CHAR, 6, `'\u000'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\u000`, token.CHAR, 6, `'\u000`, "escape sequence not terminated"},
-	{`'\u0000'`, token.CHAR, 0, `'\u0000'`, ""},
-	{`'\U'`, token.CHAR, 3, `'\U'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\U0'`, token.CHAR, 4, `'\U0'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\U00'`, token.CHAR, 5, `'\U00'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\U000'`, token.CHAR, 6, `'\U000'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\U0000'`, token.CHAR, 7, `'\U0000'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\U00000'`, token.CHAR, 8, `'\U00000'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\U000000'`, token.CHAR, 9, `'\U000000'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\U0000000'`, token.CHAR, 10, `'\U0000000'`, "illegal character U+0027 ''' in escape sequence"},
-	{`'\U0000000`, token.CHAR, 10, `'\U0000000`, "escape sequence not terminated"},
-	{`'\U00000000'`, token.CHAR, 0, `'\U00000000'`, ""},
-	{`'\Uffffffff'`, token.CHAR, 2, `'\Uffffffff'`, "escape sequence is invalid Unicode code point"},
-	{`'`, token.CHAR, 0, `'`, "rune literal not terminated"},
-	{`'\`, token.CHAR, 2, `'\`, "escape sequence not terminated"},
-	{"'\n", token.CHAR, 0, "'", "rune literal not terminated"},
-	{"'\n   ", token.CHAR, 0, "'", "rune literal not terminated"},
-	{`""`, token.STRING, 0, `""`, ""},
-	{`"abc`, token.STRING, 0, `"abc`, "string literal not terminated"},
-	{"\"abc\n", token.STRING, 0, `"abc`, "string literal not terminated"},
-	{"\"abc\n   ", token.STRING, 0, `"abc`, "string literal not terminated"},
-	{"``", token.STRING, 0, "``", ""},
-	{"`", token.STRING, 0, "`", "raw string literal not terminated"},
-	{"/**/", token.COMMENT, 0, "/**/", ""},
-	{"/*", token.COMMENT, 0, "/*", "comment not terminated"},
-	{"077", token.INT, 0, "077", ""},
-	{"078.", token.FLOAT, 0, "078.", ""},
-	{"07801234567.", token.FLOAT, 0, "07801234567.", ""},
-	{"078e0", token.FLOAT, 0, "078e0", ""},
-	{"078", token.INT, 0, "078", "illegal octal number"},
-	{"07800000009", token.INT, 0, "07800000009", "illegal octal number"},
-	{"0x", token.INT, 0, "0x", "illegal hexadecimal number"},
-	{"0X", token.INT, 0, "0X", "illegal hexadecimal number"},
-	{"\"abc\x00def\"", token.STRING, 4, "\"abc\x00def\"", "illegal character NUL"},
-	{"\"abc\x80def\"", token.STRING, 4, "\"abc\x80def\"", "illegal UTF-8 encoding"},
-	{"\ufeff\ufeff", token.ILLEGAL, 3, "\ufeff\ufeff", "illegal byte order mark"},                        // only first BOM is ignored
-	{"//\ufeff", token.COMMENT, 2, "//\ufeff", "illegal byte order mark"},                                // only first BOM is ignored
-	{"'\ufeff" + `'`, token.CHAR, 1, "'\ufeff" + `'`, "illegal byte order mark"},                         // only first BOM is ignored
-	{`"` + "abc\ufeffdef" + `"`, token.STRING, 4, `"` + "abc\ufeffdef" + `"`, "illegal byte order mark"}, // only first BOM is ignored
-}
-
-func TestScanErrors(t *testing.T) {
-	for _, e := range errors {
-		checkError(t, e.src, e.tok, e.pos, e.lit, e.err)
-	}
-}
-
-// Verify that no comments show up as literal values when skipping comments.
-func TestIssue10213(t *testing.T) {
-	var src = `
-		var (
-			A = 1 // foo
-		)
-
-		var (
-			B = 2
-			// foo
-		)
-
-		var C = 3 // foo
-
-		var D = 4
-		// foo
-
-		func anycode() {
-		// foo
-		}
-	`
-	var s Scanner
-	s.Init(fset.AddFile("", fset.Base(), len(src)), []byte(src), nil, 0)
-	for {
-		pos, tok, lit := s.Scan()
-		class := tokenclass(tok)
-		if lit != "" && class != keyword && class != literal && tok != token.SEMICOLON {
-			t.Errorf("%s: tok = %s, lit = %q", fset.Position(pos), tok, lit)
-		}
-		if tok <= token.EOF {
-			break
-		}
-	}
-}
-
-func BenchmarkScan(b *testing.B) {
-	b.StopTimer()
-	fset := token.NewFileSet()
-	file := fset.AddFile("", fset.Base(), len(source))
-	var s Scanner
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		s.Init(file, source, nil, ScanComments)
-		for {
-			_, tok, _ := s.Scan()
-			if tok == token.EOF {
-				break
-			}
-		}
-	}
-}
-
-func BenchmarkScanFile(b *testing.B) {
-	b.StopTimer()
-	const filename = "scanner.go"
-	src, err := ioutil.ReadFile(filename)
-	if err != nil {
-		panic(err)
-	}
-	fset := token.NewFileSet()
-	file := fset.AddFile(filename, fset.Base(), len(src))
-	b.SetBytes(int64(len(src)))
-	var s Scanner
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		s.Init(file, src, nil, ScanComments)
-		for {
-			_, tok, _ := s.Scan()
-			if tok == token.EOF {
-				break
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/token/position.go b/third_party/gofrontend/libgo/go/go/token/position.go
deleted file mode 100644
index 3375177..0000000
--- a/third_party/gofrontend/libgo/go/go/token/position.go
+++ /dev/null
@@ -1,485 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package token
-
-import (
-	"fmt"
-	"sort"
-	"sync"
-)
-
-// -----------------------------------------------------------------------------
-// Positions
-
-// Position describes an arbitrary source position
-// including the file, line, and column location.
-// A Position is valid if the line number is > 0.
-//
-type Position struct {
-	Filename string // filename, if any
-	Offset   int    // offset, starting at 0
-	Line     int    // line number, starting at 1
-	Column   int    // column number, starting at 1 (byte count)
-}
-
-// IsValid reports whether the position is valid.
-func (pos *Position) IsValid() bool { return pos.Line > 0 }
-
-// String returns a string in one of several forms:
-//
-//	file:line:column    valid position with file name
-//	line:column         valid position without file name
-//	file                invalid position with file name
-//	-                   invalid position without file name
-//
-func (pos Position) String() string {
-	s := pos.Filename
-	if pos.IsValid() {
-		if s != "" {
-			s += ":"
-		}
-		s += fmt.Sprintf("%d:%d", pos.Line, pos.Column)
-	}
-	if s == "" {
-		s = "-"
-	}
-	return s
-}
-
-// Pos is a compact encoding of a source position within a file set.
-// It can be converted into a Position for a more convenient, but much
-// larger, representation.
-//
-// The Pos value for a given file is a number in the range [base, base+size],
-// where base and size are specified when adding the file to the file set via
-// AddFile.
-//
-// To create the Pos value for a specific source offset (measured in bytes),
-// first add the respective file to the current file set using FileSet.AddFile
-// and then call File.Pos(offset) for that file. Given a Pos value p
-// for a specific file set fset, the corresponding Position value is
-// obtained by calling fset.Position(p).
-//
-// Pos values can be compared directly with the usual comparison operators:
-// If two Pos values p and q are in the same file, comparing p and q is
-// equivalent to comparing the respective source file offsets. If p and q
-// are in different files, p < q is true if the file implied by p was added
-// to the respective file set before the file implied by q.
-//
-type Pos int
-
-// The zero value for Pos is NoPos; there is no file and line information
-// associated with it, and NoPos().IsValid() is false. NoPos is always
-// smaller than any other Pos value. The corresponding Position value
-// for NoPos is the zero value for Position.
-//
-const NoPos Pos = 0
-
-// IsValid reports whether the position is valid.
-func (p Pos) IsValid() bool {
-	return p != NoPos
-}
-
-// -----------------------------------------------------------------------------
-// File
-
-// A File is a handle for a file belonging to a FileSet.
-// A File has a name, size, and line offset table.
-//
-type File struct {
-	set  *FileSet
-	name string // file name as provided to AddFile
-	base int    // Pos value range for this file is [base...base+size]
-	size int    // file size as provided to AddFile
-
-	// lines and infos are protected by set.mutex
-	lines []int // lines contains the offset of the first character for each line (the first entry is always 0)
-	infos []lineInfo
-}
-
-// Name returns the file name of file f as registered with AddFile.
-func (f *File) Name() string {
-	return f.name
-}
-
-// Base returns the base offset of file f as registered with AddFile.
-func (f *File) Base() int {
-	return f.base
-}
-
-// Size returns the size of file f as registered with AddFile.
-func (f *File) Size() int {
-	return f.size
-}
-
-// LineCount returns the number of lines in file f.
-func (f *File) LineCount() int {
-	f.set.mutex.RLock()
-	n := len(f.lines)
-	f.set.mutex.RUnlock()
-	return n
-}
-
-// AddLine adds the line offset for a new line.
-// The line offset must be larger than the offset for the previous line
-// and smaller than the file size; otherwise the line offset is ignored.
-//
-func (f *File) AddLine(offset int) {
-	f.set.mutex.Lock()
-	if i := len(f.lines); (i == 0 || f.lines[i-1] < offset) && offset < f.size {
-		f.lines = append(f.lines, offset)
-	}
-	f.set.mutex.Unlock()
-}
-
-// MergeLine merges a line with the following line. It is akin to replacing
-// the newline character at the end of the line with a space (to not change the
-// remaining offsets). To obtain the line number, consult e.g. Position.Line.
-// MergeLine will panic if given an invalid line number.
-//
-func (f *File) MergeLine(line int) {
-	if line <= 0 {
-		panic("illegal line number (line numbering starts at 1)")
-	}
-	f.set.mutex.Lock()
-	defer f.set.mutex.Unlock()
-	if line >= len(f.lines) {
-		panic("illegal line number")
-	}
-	// To merge the line numbered <line> with the line numbered <line+1>,
-	// we need to remove the entry in lines corresponding to the line
-	// numbered <line+1>. The entry in lines corresponding to the line
-	// numbered <line+1> is located at index <line>, since indices in lines
-	// are 0-based and line numbers are 1-based.
-	copy(f.lines[line:], f.lines[line+1:])
-	f.lines = f.lines[:len(f.lines)-1]
-}
-
-// SetLines sets the line offsets for a file and reports whether it succeeded.
-// The line offsets are the offsets of the first character of each line;
-// for instance for the content "ab\nc\n" the line offsets are {0, 3}.
-// An empty file has an empty line offset table.
-// Each line offset must be larger than the offset for the previous line
-// and smaller than the file size; otherwise SetLines fails and returns
-// false.
-//
-func (f *File) SetLines(lines []int) bool {
-	// verify validity of lines table
-	size := f.size
-	for i, offset := range lines {
-		if i > 0 && offset <= lines[i-1] || size <= offset {
-			return false
-		}
-	}
-
-	// set lines table
-	f.set.mutex.Lock()
-	f.lines = lines
-	f.set.mutex.Unlock()
-	return true
-}
-
-// SetLinesForContent sets the line offsets for the given file content.
-// It ignores position-altering //line comments.
-func (f *File) SetLinesForContent(content []byte) {
-	var lines []int
-	line := 0
-	for offset, b := range content {
-		if line >= 0 {
-			lines = append(lines, line)
-		}
-		line = -1
-		if b == '\n' {
-			line = offset + 1
-		}
-	}
-
-	// set lines table
-	f.set.mutex.Lock()
-	f.lines = lines
-	f.set.mutex.Unlock()
-}
-
-// A lineInfo object describes alternative file and line number
-// information (such as provided via a //line comment in a .go
-// file) for a given file offset.
-type lineInfo struct {
-	// fields are exported to make them accessible to gob
-	Offset   int
-	Filename string
-	Line     int
-}
-
-// AddLineInfo adds alternative file and line number information for
-// a given file offset. The offset must be larger than the offset for
-// the previously added alternative line info and smaller than the
-// file size; otherwise the information is ignored.
-//
-// AddLineInfo is typically used to register alternative position
-// information for //line filename:line comments in source files.
-//
-func (f *File) AddLineInfo(offset int, filename string, line int) {
-	f.set.mutex.Lock()
-	if i := len(f.infos); i == 0 || f.infos[i-1].Offset < offset && offset < f.size {
-		f.infos = append(f.infos, lineInfo{offset, filename, line})
-	}
-	f.set.mutex.Unlock()
-}
-
-// Pos returns the Pos value for the given file offset;
-// the offset must be <= f.Size().
-// f.Pos(f.Offset(p)) == p.
-//
-func (f *File) Pos(offset int) Pos {
-	if offset > f.size {
-		panic("illegal file offset")
-	}
-	return Pos(f.base + offset)
-}
-
-// Offset returns the offset for the given file position p;
-// p must be a valid Pos value in that file.
-// f.Offset(f.Pos(offset)) == offset.
-//
-func (f *File) Offset(p Pos) int {
-	if int(p) < f.base || int(p) > f.base+f.size {
-		panic("illegal Pos value")
-	}
-	return int(p) - f.base
-}
-
-// Line returns the line number for the given file position p;
-// p must be a Pos value in that file or NoPos.
-//
-func (f *File) Line(p Pos) int {
-	return f.Position(p).Line
-}
-
-func searchLineInfos(a []lineInfo, x int) int {
-	return sort.Search(len(a), func(i int) bool { return a[i].Offset > x }) - 1
-}
-
-// unpack returns the filename and line and column number for a file offset.
-// If adjusted is set, unpack will return the filename and line information
-// possibly adjusted by //line comments; otherwise those comments are ignored.
-//
-func (f *File) unpack(offset int, adjusted bool) (filename string, line, column int) {
-	filename = f.name
-	if i := searchInts(f.lines, offset); i >= 0 {
-		line, column = i+1, offset-f.lines[i]+1
-	}
-	if adjusted && len(f.infos) > 0 {
-		// almost no files have extra line infos
-		if i := searchLineInfos(f.infos, offset); i >= 0 {
-			alt := &f.infos[i]
-			filename = alt.Filename
-			if i := searchInts(f.lines, alt.Offset); i >= 0 {
-				line += alt.Line - i - 1
-			}
-		}
-	}
-	return
-}
-
-func (f *File) position(p Pos, adjusted bool) (pos Position) {
-	offset := int(p) - f.base
-	pos.Offset = offset
-	pos.Filename, pos.Line, pos.Column = f.unpack(offset, adjusted)
-	return
-}
-
-// PositionFor returns the Position value for the given file position p.
-// If adjusted is set, the position may be adjusted by position-altering
-// //line comments; otherwise those comments are ignored.
-// p must be a Pos value in f or NoPos.
-//
-func (f *File) PositionFor(p Pos, adjusted bool) (pos Position) {
-	if p != NoPos {
-		if int(p) < f.base || int(p) > f.base+f.size {
-			panic("illegal Pos value")
-		}
-		pos = f.position(p, adjusted)
-	}
-	return
-}
-
-// Position returns the Position value for the given file position p.
-// Calling f.Position(p) is equivalent to calling f.PositionFor(p, true).
-//
-func (f *File) Position(p Pos) (pos Position) {
-	return f.PositionFor(p, true)
-}
-
-// -----------------------------------------------------------------------------
-// FileSet
-
-// A FileSet represents a set of source files.
-// Methods of file sets are synchronized; multiple goroutines
-// may invoke them concurrently.
-//
-type FileSet struct {
-	mutex sync.RWMutex // protects the file set
-	base  int          // base offset for the next file
-	files []*File      // list of files in the order added to the set
-	last  *File        // cache of last file looked up
-}
-
-// NewFileSet creates a new file set.
-func NewFileSet() *FileSet {
-	return &FileSet{
-		base: 1, // 0 == NoPos
-	}
-}
-
-// Base returns the minimum base offset that must be provided to
-// AddFile when adding the next file.
-//
-func (s *FileSet) Base() int {
-	s.mutex.RLock()
-	b := s.base
-	s.mutex.RUnlock()
-	return b
-
-}
-
-// AddFile adds a new file with a given filename, base offset, and file size
-// to the file set s and returns the file. Multiple files may have the same
-// name. The base offset must not be smaller than the FileSet's Base(), and
-// size must not be negative. As a special case, if a negative base is provided,
-// the current value of the FileSet's Base() is used instead.
-//
-// Adding the file will set the file set's Base() value to base + size + 1
-// as the minimum base value for the next file. The following relationship
-// exists between a Pos value p for a given file offset offs:
-//
-//	int(p) = base + offs
-//
-// with offs in the range [0, size] and thus p in the range [base, base+size].
-// For convenience, File.Pos may be used to create file-specific position
-// values from a file offset.
-//
-func (s *FileSet) AddFile(filename string, base, size int) *File {
-	s.mutex.Lock()
-	defer s.mutex.Unlock()
-	if base < 0 {
-		base = s.base
-	}
-	if base < s.base || size < 0 {
-		panic("illegal base or size")
-	}
-	// base >= s.base && size >= 0
-	f := &File{s, filename, base, size, []int{0}, nil}
-	base += size + 1 // +1 because EOF also has a position
-	if base < 0 {
-		panic("token.Pos offset overflow (> 2G of source code in file set)")
-	}
-	// add the file to the file set
-	s.base = base
-	s.files = append(s.files, f)
-	s.last = f
-	return f
-}
-
-// Iterate calls f for the files in the file set in the order they were added
-// until f returns false.
-//
-func (s *FileSet) Iterate(f func(*File) bool) {
-	for i := 0; ; i++ {
-		var file *File
-		s.mutex.RLock()
-		if i < len(s.files) {
-			file = s.files[i]
-		}
-		s.mutex.RUnlock()
-		if file == nil || !f(file) {
-			break
-		}
-	}
-}
-
-func searchFiles(a []*File, x int) int {
-	return sort.Search(len(a), func(i int) bool { return a[i].base > x }) - 1
-}
-
-func (s *FileSet) file(p Pos) *File {
-	s.mutex.RLock()
-	// common case: p is in last file
-	if f := s.last; f != nil && f.base <= int(p) && int(p) <= f.base+f.size {
-		s.mutex.RUnlock()
-		return f
-	}
-	// p is not in last file - search all files
-	if i := searchFiles(s.files, int(p)); i >= 0 {
-		f := s.files[i]
-		// f.base <= int(p) by definition of searchFiles
-		if int(p) <= f.base+f.size {
-			s.mutex.RUnlock()
-			s.mutex.Lock()
-			s.last = f // race is ok - s.last is only a cache
-			s.mutex.Unlock()
-			return f
-		}
-	}
-	s.mutex.RUnlock()
-	return nil
-}
-
-// File returns the file that contains the position p.
-// If no such file is found (for instance for p == NoPos),
-// the result is nil.
-//
-func (s *FileSet) File(p Pos) (f *File) {
-	if p != NoPos {
-		f = s.file(p)
-	}
-	return
-}
-
-// PositionFor converts a Pos p in the fileset into a Position value.
-// If adjusted is set, the position may be adjusted by position-altering
-// //line comments; otherwise those comments are ignored.
-// p must be a Pos value in s or NoPos.
-//
-func (s *FileSet) PositionFor(p Pos, adjusted bool) (pos Position) {
-	if p != NoPos {
-		if f := s.file(p); f != nil {
-			pos = f.position(p, adjusted)
-		}
-	}
-	return
-}
-
-// Position converts a Pos p in the fileset into a Position value.
-// Calling s.Position(p) is equivalent to calling s.PositionFor(p, true).
-//
-func (s *FileSet) Position(p Pos) (pos Position) {
-	return s.PositionFor(p, true)
-}
-
-// -----------------------------------------------------------------------------
-// Helper functions
-
-func searchInts(a []int, x int) int {
-	// This function body is a manually inlined version of:
-	//
-	//   return sort.Search(len(a), func(i int) bool { return a[i] > x }) - 1
-	//
-	// With better compiler optimizations, this may not be needed in the
-	// future, but at the moment this change improves the go/printer
-	// benchmark performance by ~30%. This has a direct impact on the
-	// speed of gofmt and thus seems worthwhile (2011-04-29).
-	// TODO(gri): Remove this when compilers have caught up.
-	i, j := 0, len(a)
-	for i < j {
-		h := i + (j-i)/2 // avoid overflow when computing h
-		// i ≤ h < j
-		if a[h] <= x {
-			i = h + 1
-		} else {
-			j = h
-		}
-	}
-	return i - 1
-}
diff --git a/third_party/gofrontend/libgo/go/go/token/position_test.go b/third_party/gofrontend/libgo/go/go/token/position_test.go
deleted file mode 100644
index d26939c..0000000
--- a/third_party/gofrontend/libgo/go/go/token/position_test.go
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package token
-
-import (
-	"fmt"
-	"math/rand"
-	"sync"
-	"testing"
-)
-
-func checkPos(t *testing.T, msg string, got, want Position) {
-	if got.Filename != want.Filename {
-		t.Errorf("%s: got filename = %q; want %q", msg, got.Filename, want.Filename)
-	}
-	if got.Offset != want.Offset {
-		t.Errorf("%s: got offset = %d; want %d", msg, got.Offset, want.Offset)
-	}
-	if got.Line != want.Line {
-		t.Errorf("%s: got line = %d; want %d", msg, got.Line, want.Line)
-	}
-	if got.Column != want.Column {
-		t.Errorf("%s: got column = %d; want %d", msg, got.Column, want.Column)
-	}
-}
-
-func TestNoPos(t *testing.T) {
-	if NoPos.IsValid() {
-		t.Errorf("NoPos should not be valid")
-	}
-	var fset *FileSet
-	checkPos(t, "nil NoPos", fset.Position(NoPos), Position{})
-	fset = NewFileSet()
-	checkPos(t, "fset NoPos", fset.Position(NoPos), Position{})
-}
-
-var tests = []struct {
-	filename string
-	source   []byte // may be nil
-	size     int
-	lines    []int
-}{
-	{"a", []byte{}, 0, []int{}},
-	{"b", []byte("01234"), 5, []int{0}},
-	{"c", []byte("\n\n\n\n\n\n\n\n\n"), 9, []int{0, 1, 2, 3, 4, 5, 6, 7, 8}},
-	{"d", nil, 100, []int{0, 5, 10, 20, 30, 70, 71, 72, 80, 85, 90, 99}},
-	{"e", nil, 777, []int{0, 80, 100, 120, 130, 180, 267, 455, 500, 567, 620}},
-	{"f", []byte("package p\n\nimport \"fmt\""), 23, []int{0, 10, 11}},
-	{"g", []byte("package p\n\nimport \"fmt\"\n"), 24, []int{0, 10, 11}},
-	{"h", []byte("package p\n\nimport \"fmt\"\n "), 25, []int{0, 10, 11, 24}},
-}
-
-func linecol(lines []int, offs int) (int, int) {
-	prevLineOffs := 0
-	for line, lineOffs := range lines {
-		if offs < lineOffs {
-			return line, offs - prevLineOffs + 1
-		}
-		prevLineOffs = lineOffs
-	}
-	return len(lines), offs - prevLineOffs + 1
-}
-
-func verifyPositions(t *testing.T, fset *FileSet, f *File, lines []int) {
-	for offs := 0; offs < f.Size(); offs++ {
-		p := f.Pos(offs)
-		offs2 := f.Offset(p)
-		if offs2 != offs {
-			t.Errorf("%s, Offset: got offset %d; want %d", f.Name(), offs2, offs)
-		}
-		line, col := linecol(lines, offs)
-		msg := fmt.Sprintf("%s (offs = %d, p = %d)", f.Name(), offs, p)
-		checkPos(t, msg, f.Position(f.Pos(offs)), Position{f.Name(), offs, line, col})
-		checkPos(t, msg, fset.Position(p), Position{f.Name(), offs, line, col})
-	}
-}
-
-func makeTestSource(size int, lines []int) []byte {
-	src := make([]byte, size)
-	for _, offs := range lines {
-		if offs > 0 {
-			src[offs-1] = '\n'
-		}
-	}
-	return src
-}
-
-func TestPositions(t *testing.T) {
-	const delta = 7 // a non-zero base offset increment
-	fset := NewFileSet()
-	for _, test := range tests {
-		// verify consistency of test case
-		if test.source != nil && len(test.source) != test.size {
-			t.Errorf("%s: inconsistent test case: got file size %d; want %d", test.filename, len(test.source), test.size)
-		}
-
-		// add file and verify name and size
-		f := fset.AddFile(test.filename, fset.Base()+delta, test.size)
-		if f.Name() != test.filename {
-			t.Errorf("got filename %q; want %q", f.Name(), test.filename)
-		}
-		if f.Size() != test.size {
-			t.Errorf("%s: got file size %d; want %d", f.Name(), f.Size(), test.size)
-		}
-		if fset.File(f.Pos(0)) != f {
-			t.Errorf("%s: f.Pos(0) was not found in f", f.Name())
-		}
-
-		// add lines individually and verify all positions
-		for i, offset := range test.lines {
-			f.AddLine(offset)
-			if f.LineCount() != i+1 {
-				t.Errorf("%s, AddLine: got line count %d; want %d", f.Name(), f.LineCount(), i+1)
-			}
-			// adding the same offset again should be ignored
-			f.AddLine(offset)
-			if f.LineCount() != i+1 {
-				t.Errorf("%s, AddLine: got unchanged line count %d; want %d", f.Name(), f.LineCount(), i+1)
-			}
-			verifyPositions(t, fset, f, test.lines[0:i+1])
-		}
-
-		// add lines with SetLines and verify all positions
-		if ok := f.SetLines(test.lines); !ok {
-			t.Errorf("%s: SetLines failed", f.Name())
-		}
-		if f.LineCount() != len(test.lines) {
-			t.Errorf("%s, SetLines: got line count %d; want %d", f.Name(), f.LineCount(), len(test.lines))
-		}
-		verifyPositions(t, fset, f, test.lines)
-
-		// add lines with SetLinesForContent and verify all positions
-		src := test.source
-		if src == nil {
-			// no test source available - create one from scratch
-			src = makeTestSource(test.size, test.lines)
-		}
-		f.SetLinesForContent(src)
-		if f.LineCount() != len(test.lines) {
-			t.Errorf("%s, SetLinesForContent: got line count %d; want %d", f.Name(), f.LineCount(), len(test.lines))
-		}
-		verifyPositions(t, fset, f, test.lines)
-	}
-}
-
-func TestLineInfo(t *testing.T) {
-	fset := NewFileSet()
-	f := fset.AddFile("foo", fset.Base(), 500)
-	lines := []int{0, 42, 77, 100, 210, 220, 277, 300, 333, 401}
-	// add lines individually and provide alternative line information
-	for _, offs := range lines {
-		f.AddLine(offs)
-		f.AddLineInfo(offs, "bar", 42)
-	}
-	// verify positions for all offsets
-	for offs := 0; offs <= f.Size(); offs++ {
-		p := f.Pos(offs)
-		_, col := linecol(lines, offs)
-		msg := fmt.Sprintf("%s (offs = %d, p = %d)", f.Name(), offs, p)
-		checkPos(t, msg, f.Position(f.Pos(offs)), Position{"bar", offs, 42, col})
-		checkPos(t, msg, fset.Position(p), Position{"bar", offs, 42, col})
-	}
-}
-
-func TestFiles(t *testing.T) {
-	fset := NewFileSet()
-	for i, test := range tests {
-		base := fset.Base()
-		if i%2 == 1 {
-			// Setting a negative base is equivalent to
-			// fset.Base(), so test some of each.
-			base = -1
-		}
-		fset.AddFile(test.filename, base, test.size)
-		j := 0
-		fset.Iterate(func(f *File) bool {
-			if f.Name() != tests[j].filename {
-				t.Errorf("got filename = %s; want %s", f.Name(), tests[j].filename)
-			}
-			j++
-			return true
-		})
-		if j != i+1 {
-			t.Errorf("got %d files; want %d", j, i+1)
-		}
-	}
-}
-
-// FileSet.File should return nil if Pos is past the end of the FileSet.
-func TestFileSetPastEnd(t *testing.T) {
-	fset := NewFileSet()
-	for _, test := range tests {
-		fset.AddFile(test.filename, fset.Base(), test.size)
-	}
-	if f := fset.File(Pos(fset.Base())); f != nil {
-		t.Errorf("got %v, want nil", f)
-	}
-}
-
-func TestFileSetCacheUnlikely(t *testing.T) {
-	fset := NewFileSet()
-	offsets := make(map[string]int)
-	for _, test := range tests {
-		offsets[test.filename] = fset.Base()
-		fset.AddFile(test.filename, fset.Base(), test.size)
-	}
-	for file, pos := range offsets {
-		f := fset.File(Pos(pos))
-		if f.Name() != file {
-			t.Errorf("got %q at position %d, want %q", f.Name(), pos, file)
-		}
-	}
-}
-
-// issue 4345. Test concurrent use of FileSet.Pos does not trigger a
-// race in the FileSet position cache.
-func TestFileSetRace(t *testing.T) {
-	fset := NewFileSet()
-	for i := 0; i < 100; i++ {
-		fset.AddFile(fmt.Sprintf("file-%d", i), fset.Base(), 1031)
-	}
-	max := int32(fset.Base())
-	var stop sync.WaitGroup
-	r := rand.New(rand.NewSource(7))
-	for i := 0; i < 2; i++ {
-		r := rand.New(rand.NewSource(r.Int63()))
-		stop.Add(1)
-		go func() {
-			for i := 0; i < 1000; i++ {
-				fset.Position(Pos(r.Int31n(max)))
-			}
-			stop.Done()
-		}()
-	}
-	stop.Wait()
-}
-
-func TestPositionFor(t *testing.T) {
-	src := []byte(`
-foo
-b
-ar
-//line :100
-foobar
-//line bar:3
-done
-`)
-
-	const filename = "foo"
-	fset := NewFileSet()
-	f := fset.AddFile(filename, fset.Base(), len(src))
-	f.SetLinesForContent(src)
-
-	// verify position info
-	for i, offs := range f.lines {
-		got1 := f.PositionFor(f.Pos(offs), false)
-		got2 := f.PositionFor(f.Pos(offs), true)
-		got3 := f.Position(f.Pos(offs))
-		want := Position{filename, offs, i + 1, 1}
-		checkPos(t, "1. PositionFor unadjusted", got1, want)
-		checkPos(t, "1. PositionFor adjusted", got2, want)
-		checkPos(t, "1. Position", got3, want)
-	}
-
-	// manually add //line info on lines l1, l2
-	const l1, l2 = 5, 7
-	f.AddLineInfo(f.lines[l1-1], "", 100)
-	f.AddLineInfo(f.lines[l2-1], "bar", 3)
-
-	// unadjusted position info must remain unchanged
-	for i, offs := range f.lines {
-		got1 := f.PositionFor(f.Pos(offs), false)
-		want := Position{filename, offs, i + 1, 1}
-		checkPos(t, "2. PositionFor unadjusted", got1, want)
-	}
-
-	// adjusted position info should have changed
-	for i, offs := range f.lines {
-		got2 := f.PositionFor(f.Pos(offs), true)
-		got3 := f.Position(f.Pos(offs))
-		want := Position{filename, offs, i + 1, 1}
-		// manually compute wanted filename and line
-		line := want.Line
-		if i+1 >= l1 {
-			want.Filename = ""
-			want.Line = line - l1 + 100
-		}
-		if i+1 >= l2 {
-			want.Filename = "bar"
-			want.Line = line - l2 + 3
-		}
-		checkPos(t, "3. PositionFor adjusted", got2, want)
-		checkPos(t, "3. Position", got3, want)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/token/serialize.go b/third_party/gofrontend/libgo/go/go/token/serialize.go
deleted file mode 100644
index 4adc8f9..0000000
--- a/third_party/gofrontend/libgo/go/go/token/serialize.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package token
-
-type serializedFile struct {
-	// fields correspond 1:1 to fields with same (lower-case) name in File
-	Name  string
-	Base  int
-	Size  int
-	Lines []int
-	Infos []lineInfo
-}
-
-type serializedFileSet struct {
-	Base  int
-	Files []serializedFile
-}
-
-// Read calls decode to deserialize a file set into s; s must not be nil.
-func (s *FileSet) Read(decode func(interface{}) error) error {
-	var ss serializedFileSet
-	if err := decode(&ss); err != nil {
-		return err
-	}
-
-	s.mutex.Lock()
-	s.base = ss.Base
-	files := make([]*File, len(ss.Files))
-	for i := 0; i < len(ss.Files); i++ {
-		f := &ss.Files[i]
-		files[i] = &File{s, f.Name, f.Base, f.Size, f.Lines, f.Infos}
-	}
-	s.files = files
-	s.last = nil
-	s.mutex.Unlock()
-
-	return nil
-}
-
-// Write calls encode to serialize the file set s.
-func (s *FileSet) Write(encode func(interface{}) error) error {
-	var ss serializedFileSet
-
-	s.mutex.Lock()
-	ss.Base = s.base
-	files := make([]serializedFile, len(s.files))
-	for i, f := range s.files {
-		files[i] = serializedFile{f.name, f.base, f.size, f.lines, f.infos}
-	}
-	ss.Files = files
-	s.mutex.Unlock()
-
-	return encode(ss)
-}
diff --git a/third_party/gofrontend/libgo/go/go/token/serialize_test.go b/third_party/gofrontend/libgo/go/go/token/serialize_test.go
deleted file mode 100644
index 4e925ad..0000000
--- a/third_party/gofrontend/libgo/go/go/token/serialize_test.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package token
-
-import (
-	"bytes"
-	"encoding/gob"
-	"fmt"
-	"testing"
-)
-
-// equal returns nil if p and q describe the same file set;
-// otherwise it returns an error describing the discrepancy.
-func equal(p, q *FileSet) error {
-	if p == q {
-		// avoid deadlock if p == q
-		return nil
-	}
-
-	// not strictly needed for the test
-	p.mutex.Lock()
-	q.mutex.Lock()
-	defer q.mutex.Unlock()
-	defer p.mutex.Unlock()
-
-	if p.base != q.base {
-		return fmt.Errorf("different bases: %d != %d", p.base, q.base)
-	}
-
-	if len(p.files) != len(q.files) {
-		return fmt.Errorf("different number of files: %d != %d", len(p.files), len(q.files))
-	}
-
-	for i, f := range p.files {
-		g := q.files[i]
-		if f.set != p {
-			return fmt.Errorf("wrong fileset for %q", f.name)
-		}
-		if g.set != q {
-			return fmt.Errorf("wrong fileset for %q", g.name)
-		}
-		if f.name != g.name {
-			return fmt.Errorf("different filenames: %q != %q", f.name, g.name)
-		}
-		if f.base != g.base {
-			return fmt.Errorf("different base for %q: %d != %d", f.name, f.base, g.base)
-		}
-		if f.size != g.size {
-			return fmt.Errorf("different size for %q: %d != %d", f.name, f.size, g.size)
-		}
-		for j, l := range f.lines {
-			m := g.lines[j]
-			if l != m {
-				return fmt.Errorf("different offsets for %q", f.name)
-			}
-		}
-		for j, l := range f.infos {
-			m := g.infos[j]
-			if l.Offset != m.Offset || l.Filename != m.Filename || l.Line != m.Line {
-				return fmt.Errorf("different infos for %q", f.name)
-			}
-		}
-	}
-
-	// we don't care about .last - it's just a cache
-	return nil
-}
-
-func checkSerialize(t *testing.T, p *FileSet) {
-	var buf bytes.Buffer
-	encode := func(x interface{}) error {
-		return gob.NewEncoder(&buf).Encode(x)
-	}
-	if err := p.Write(encode); err != nil {
-		t.Errorf("writing fileset failed: %s", err)
-		return
-	}
-	q := NewFileSet()
-	decode := func(x interface{}) error {
-		return gob.NewDecoder(&buf).Decode(x)
-	}
-	if err := q.Read(decode); err != nil {
-		t.Errorf("reading fileset failed: %s", err)
-		return
-	}
-	if err := equal(p, q); err != nil {
-		t.Errorf("filesets not identical: %s", err)
-	}
-}
-
-func TestSerialization(t *testing.T) {
-	p := NewFileSet()
-	checkSerialize(t, p)
-	// add some files
-	for i := 0; i < 10; i++ {
-		f := p.AddFile(fmt.Sprintf("file%d", i), p.Base()+i, i*100)
-		checkSerialize(t, p)
-		// add some lines and alternative file infos
-		line := 1000
-		for offs := 0; offs < f.Size(); offs += 40 + i {
-			f.AddLine(offs)
-			if offs%7 == 0 {
-				f.AddLineInfo(offs, fmt.Sprintf("file%d", offs), line)
-				line += 33
-			}
-		}
-		checkSerialize(t, p)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/token/token.go b/third_party/gofrontend/libgo/go/go/token/token.go
deleted file mode 100644
index 865f63f..0000000
--- a/third_party/gofrontend/libgo/go/go/token/token.go
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package token defines constants representing the lexical tokens of the Go
-// programming language and basic operations on tokens (printing, predicates).
-//
-package token
-
-import "strconv"
-
-// Token is the set of lexical tokens of the Go programming language.
-type Token int
-
-// The list of tokens.
-const (
-	// Special tokens
-	ILLEGAL Token = iota
-	EOF
-	COMMENT
-
-	literal_beg
-	// Identifiers and basic type literals
-	// (these tokens stand for classes of literals)
-	IDENT  // main
-	INT    // 12345
-	FLOAT  // 123.45
-	IMAG   // 123.45i
-	CHAR   // 'a'
-	STRING // "abc"
-	literal_end
-
-	operator_beg
-	// Operators and delimiters
-	ADD // +
-	SUB // -
-	MUL // *
-	QUO // /
-	REM // %
-
-	AND     // &
-	OR      // |
-	XOR     // ^
-	SHL     // <<
-	SHR     // >>
-	AND_NOT // &^
-
-	ADD_ASSIGN // +=
-	SUB_ASSIGN // -=
-	MUL_ASSIGN // *=
-	QUO_ASSIGN // /=
-	REM_ASSIGN // %=
-
-	AND_ASSIGN     // &=
-	OR_ASSIGN      // |=
-	XOR_ASSIGN     // ^=
-	SHL_ASSIGN     // <<=
-	SHR_ASSIGN     // >>=
-	AND_NOT_ASSIGN // &^=
-
-	LAND  // &&
-	LOR   // ||
-	ARROW // <-
-	INC   // ++
-	DEC   // --
-
-	EQL    // ==
-	LSS    // <
-	GTR    // >
-	ASSIGN // =
-	NOT    // !
-
-	NEQ      // !=
-	LEQ      // <=
-	GEQ      // >=
-	DEFINE   // :=
-	ELLIPSIS // ...
-
-	LPAREN // (
-	LBRACK // [
-	LBRACE // {
-	COMMA  // ,
-	PERIOD // .
-
-	RPAREN    // )
-	RBRACK    // ]
-	RBRACE    // }
-	SEMICOLON // ;
-	COLON     // :
-	operator_end
-
-	keyword_beg
-	// Keywords
-	BREAK
-	CASE
-	CHAN
-	CONST
-	CONTINUE
-
-	DEFAULT
-	DEFER
-	ELSE
-	FALLTHROUGH
-	FOR
-
-	FUNC
-	GO
-	GOTO
-	IF
-	IMPORT
-
-	INTERFACE
-	MAP
-	PACKAGE
-	RANGE
-	RETURN
-
-	SELECT
-	STRUCT
-	SWITCH
-	TYPE
-	VAR
-	keyword_end
-)
-
-var tokens = [...]string{
-	ILLEGAL: "ILLEGAL",
-
-	EOF:     "EOF",
-	COMMENT: "COMMENT",
-
-	IDENT:  "IDENT",
-	INT:    "INT",
-	FLOAT:  "FLOAT",
-	IMAG:   "IMAG",
-	CHAR:   "CHAR",
-	STRING: "STRING",
-
-	ADD: "+",
-	SUB: "-",
-	MUL: "*",
-	QUO: "/",
-	REM: "%",
-
-	AND:     "&",
-	OR:      "|",
-	XOR:     "^",
-	SHL:     "<<",
-	SHR:     ">>",
-	AND_NOT: "&^",
-
-	ADD_ASSIGN: "+=",
-	SUB_ASSIGN: "-=",
-	MUL_ASSIGN: "*=",
-	QUO_ASSIGN: "/=",
-	REM_ASSIGN: "%=",
-
-	AND_ASSIGN:     "&=",
-	OR_ASSIGN:      "|=",
-	XOR_ASSIGN:     "^=",
-	SHL_ASSIGN:     "<<=",
-	SHR_ASSIGN:     ">>=",
-	AND_NOT_ASSIGN: "&^=",
-
-	LAND:  "&&",
-	LOR:   "||",
-	ARROW: "<-",
-	INC:   "++",
-	DEC:   "--",
-
-	EQL:    "==",
-	LSS:    "<",
-	GTR:    ">",
-	ASSIGN: "=",
-	NOT:    "!",
-
-	NEQ:      "!=",
-	LEQ:      "<=",
-	GEQ:      ">=",
-	DEFINE:   ":=",
-	ELLIPSIS: "...",
-
-	LPAREN: "(",
-	LBRACK: "[",
-	LBRACE: "{",
-	COMMA:  ",",
-	PERIOD: ".",
-
-	RPAREN:    ")",
-	RBRACK:    "]",
-	RBRACE:    "}",
-	SEMICOLON: ";",
-	COLON:     ":",
-
-	BREAK:    "break",
-	CASE:     "case",
-	CHAN:     "chan",
-	CONST:    "const",
-	CONTINUE: "continue",
-
-	DEFAULT:     "default",
-	DEFER:       "defer",
-	ELSE:        "else",
-	FALLTHROUGH: "fallthrough",
-	FOR:         "for",
-
-	FUNC:   "func",
-	GO:     "go",
-	GOTO:   "goto",
-	IF:     "if",
-	IMPORT: "import",
-
-	INTERFACE: "interface",
-	MAP:       "map",
-	PACKAGE:   "package",
-	RANGE:     "range",
-	RETURN:    "return",
-
-	SELECT: "select",
-	STRUCT: "struct",
-	SWITCH: "switch",
-	TYPE:   "type",
-	VAR:    "var",
-}
-
-// String returns the string corresponding to the token tok.
-// For operators, delimiters, and keywords the string is the actual
-// token character sequence (e.g., for the token ADD, the string is
-// "+"). For all other tokens the string corresponds to the token
-// constant name (e.g. for the token IDENT, the string is "IDENT").
-//
-func (tok Token) String() string {
-	s := ""
-	if 0 <= tok && tok < Token(len(tokens)) {
-		s = tokens[tok]
-	}
-	if s == "" {
-		s = "token(" + strconv.Itoa(int(tok)) + ")"
-	}
-	return s
-}
-
-// A set of constants for precedence-based expression parsing.
-// Non-operators have lowest precedence, followed by operators
-// starting with precedence 1 up to unary operators. The highest
-// precedence serves as "catch-all" precedence for selector,
-// indexing, and other operator and delimiter tokens.
-//
-const (
-	LowestPrec  = 0 // non-operators
-	UnaryPrec   = 6
-	HighestPrec = 7
-)
-
-// Precedence returns the operator precedence of the binary
-// operator op. If op is not a binary operator, the result
-// is LowestPrecedence.
-//
-func (op Token) Precedence() int {
-	switch op {
-	case LOR:
-		return 1
-	case LAND:
-		return 2
-	case EQL, NEQ, LSS, LEQ, GTR, GEQ:
-		return 3
-	case ADD, SUB, OR, XOR:
-		return 4
-	case MUL, QUO, REM, SHL, SHR, AND, AND_NOT:
-		return 5
-	}
-	return LowestPrec
-}
-
-var keywords map[string]Token
-
-func init() {
-	keywords = make(map[string]Token)
-	for i := keyword_beg + 1; i < keyword_end; i++ {
-		keywords[tokens[i]] = i
-	}
-}
-
-// Lookup maps an identifier to its keyword token or IDENT (if not a keyword).
-//
-func Lookup(ident string) Token {
-	if tok, is_keyword := keywords[ident]; is_keyword {
-		return tok
-	}
-	return IDENT
-}
-
-// Predicates
-
-// IsLiteral returns true for tokens corresponding to identifiers
-// and basic type literals; it returns false otherwise.
-//
-func (tok Token) IsLiteral() bool { return literal_beg < tok && tok < literal_end }
-
-// IsOperator returns true for tokens corresponding to operators and
-// delimiters; it returns false otherwise.
-//
-func (tok Token) IsOperator() bool { return operator_beg < tok && tok < operator_end }
-
-// IsKeyword returns true for tokens corresponding to keywords;
-// it returns false otherwise.
-//
-func (tok Token) IsKeyword() bool { return keyword_beg < tok && tok < keyword_end }
diff --git a/third_party/gofrontend/libgo/go/go/types/api.go b/third_party/gofrontend/libgo/go/go/types/api.go
deleted file mode 100644
index b3bf6f0..0000000
--- a/third_party/gofrontend/libgo/go/go/types/api.go
+++ /dev/null
@@ -1,336 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package types declares the data types and implements
-// the algorithms for type-checking of Go packages. Use
-// Config.Check to invoke the type checker for a package.
-// Alternatively, create a new type checked with NewChecker
-// and invoke it incrementally by calling Checker.Files.
-//
-// Type-checking consists of several interdependent phases:
-//
-// Name resolution maps each identifier (ast.Ident) in the program to the
-// language object (Object) it denotes.
-// Use Info.{Defs,Uses,Implicits} for the results of name resolution.
-//
-// Constant folding computes the exact constant value (constant.Value)
-// for every expression (ast.Expr) that is a compile-time constant.
-// Use Info.Types[expr].Value for the results of constant folding.
-//
-// Type inference computes the type (Type) of every expression (ast.Expr)
-// and checks for compliance with the language specification.
-// Use Info.Types[expr].Type for the results of type inference.
-//
-package types // import "go/types"
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/constant"
-	"go/token"
-)
-
-// An Error describes a type-checking error; it implements the error interface.
-// A "soft" error is an error that still permits a valid interpretation of a
-// package (such as "unused variable"); "hard" errors may lead to unpredictable
-// behavior if ignored.
-type Error struct {
-	Fset *token.FileSet // file set for interpretation of Pos
-	Pos  token.Pos      // error position
-	Msg  string         // error message
-	Soft bool           // if set, error is "soft"
-}
-
-// Error returns an error string formatted as follows:
-// filename:line:column: message
-func (err Error) Error() string {
-	return fmt.Sprintf("%s: %s", err.Fset.Position(err.Pos), err.Msg)
-}
-
-// An importer resolves import paths to Packages.
-// See go/importer for existing implementations.
-type Importer interface {
-	// Import returns the imported package for the given import
-	// path, or an error if the package couldn't be imported.
-	// Import is responsible for returning the same package for
-	// matching import paths.
-	Import(path string) (*Package, error)
-}
-
-// A Config specifies the configuration for type checking.
-// The zero value for Config is a ready-to-use default configuration.
-type Config struct {
-	// If IgnoreFuncBodies is set, function bodies are not
-	// type-checked.
-	IgnoreFuncBodies bool
-
-	// If FakeImportC is set, `import "C"` (for packages requiring Cgo)
-	// declares an empty "C" package and errors are omitted for qualified
-	// identifiers referring to package C (which won't find an object).
-	// This feature is intended for the standard library cmd/api tool.
-	//
-	// Caution: Effects may be unpredictable due to follow-up errors.
-	//          Do not use casually!
-	FakeImportC bool
-
-	// If Error != nil, it is called with each error found
-	// during type checking; err has dynamic type Error.
-	// Secondary errors (for instance, to enumerate all types
-	// involved in an invalid recursive type declaration) have
-	// error strings that start with a '\t' character.
-	// If Error == nil, type-checking stops with the first
-	// error found.
-	Error func(err error)
-
-	// Importer is called for each import declaration except when
-	// importing package "unsafe". An error is reported if an
-	// importer is needed but none was installed.
-	Importer Importer
-
-	// If Sizes != nil, it provides the sizing functions for package unsafe.
-	// Otherwise &StdSizes{WordSize: 8, MaxAlign: 8} is used instead.
-	Sizes Sizes
-
-	// If DisableUnusedImportCheck is set, packages are not checked
-	// for unused imports.
-	DisableUnusedImportCheck bool
-}
-
-// Info holds result type information for a type-checked package.
-// Only the information for which a map is provided is collected.
-// If the package has type errors, the collected information may
-// be incomplete.
-type Info struct {
-	// Types maps expressions to their types, and for constant
-	// expressions, their values. Invalid expressions are omitted.
-	//
-	// For (possibly parenthesized) identifiers denoting built-in
-	// functions, the recorded signatures are call-site specific:
-	// if the call result is not a constant, the recorded type is
-	// an argument-specific signature. Otherwise, the recorded type
-	// is invalid.
-	//
-	// Identifiers on the lhs of declarations (i.e., the identifiers
-	// which are being declared) are collected in the Defs map.
-	// Identifiers denoting packages are collected in the Uses maps.
-	Types map[ast.Expr]TypeAndValue
-
-	// Defs maps identifiers to the objects they define (including
-	// package names, dots "." of dot-imports, and blank "_" identifiers).
-	// For identifiers that do not denote objects (e.g., the package name
-	// in package clauses, or symbolic variables t in t := x.(type) of
-	// type switch headers), the corresponding objects are nil.
-	//
-	// For an anonymous field, Defs returns the field *Var it defines.
-	//
-	// Invariant: Defs[id] == nil || Defs[id].Pos() == id.Pos()
-	Defs map[*ast.Ident]Object
-
-	// Uses maps identifiers to the objects they denote.
-	//
-	// For an anonymous field, Uses returns the *TypeName it denotes.
-	//
-	// Invariant: Uses[id].Pos() != id.Pos()
-	Uses map[*ast.Ident]Object
-
-	// Implicits maps nodes to their implicitly declared objects, if any.
-	// The following node and object types may appear:
-	//
-	//	node               declared object
-	//
-	//	*ast.ImportSpec    *PkgName for dot-imports and imports without renames
-	//	*ast.CaseClause    type-specific *Var for each type switch case clause (incl. default)
-	//      *ast.Field         anonymous struct field or parameter *Var
-	//
-	Implicits map[ast.Node]Object
-
-	// Selections maps selector expressions (excluding qualified identifiers)
-	// to their corresponding selections.
-	Selections map[*ast.SelectorExpr]*Selection
-
-	// Scopes maps ast.Nodes to the scopes they define. Package scopes are not
-	// associated with a specific node but with all files belonging to a package.
-	// Thus, the package scope can be found in the type-checked Package object.
-	// Scopes nest, with the Universe scope being the outermost scope, enclosing
-	// the package scope, which contains (one or more) files scopes, which enclose
-	// function scopes which in turn enclose statement and function literal scopes.
-	// Note that even though package-level functions are declared in the package
-	// scope, the function scopes are embedded in the file scope of the file
-	// containing the function declaration.
-	//
-	// The following node types may appear in Scopes:
-	//
-	//	*ast.File
-	//	*ast.FuncType
-	//	*ast.BlockStmt
-	//	*ast.IfStmt
-	//	*ast.SwitchStmt
-	//	*ast.TypeSwitchStmt
-	//	*ast.CaseClause
-	//	*ast.CommClause
-	//	*ast.ForStmt
-	//	*ast.RangeStmt
-	//
-	Scopes map[ast.Node]*Scope
-
-	// InitOrder is the list of package-level initializers in the order in which
-	// they must be executed. Initializers referring to variables related by an
-	// initialization dependency appear in topological order, the others appear
-	// in source order. Variables without an initialization expression do not
-	// appear in this list.
-	InitOrder []*Initializer
-}
-
-// TypeOf returns the type of expression e, or nil if not found.
-// Precondition: the Types, Uses and Defs maps are populated.
-//
-func (info *Info) TypeOf(e ast.Expr) Type {
-	if t, ok := info.Types[e]; ok {
-		return t.Type
-	}
-	if id, _ := e.(*ast.Ident); id != nil {
-		if obj := info.ObjectOf(id); obj != nil {
-			return obj.Type()
-		}
-	}
-	return nil
-}
-
-// ObjectOf returns the object denoted by the specified id,
-// or nil if not found.
-//
-// If id is an anonymous struct field, ObjectOf returns the field (*Var)
-// it uses, not the type (*TypeName) it defines.
-//
-// Precondition: the Uses and Defs maps are populated.
-//
-func (info *Info) ObjectOf(id *ast.Ident) Object {
-	if obj, _ := info.Defs[id]; obj != nil {
-		return obj
-	}
-	return info.Uses[id]
-}
-
-// TypeAndValue reports the type and value (for constants)
-// of the corresponding expression.
-type TypeAndValue struct {
-	mode  operandMode
-	Type  Type
-	Value constant.Value
-}
-
-// TODO(gri) Consider eliminating the IsVoid predicate. Instead, report
-// "void" values as regular values but with the empty tuple type.
-
-// IsVoid reports whether the corresponding expression
-// is a function call without results.
-func (tv TypeAndValue) IsVoid() bool {
-	return tv.mode == novalue
-}
-
-// IsType reports whether the corresponding expression specifies a type.
-func (tv TypeAndValue) IsType() bool {
-	return tv.mode == typexpr
-}
-
-// IsBuiltin reports whether the corresponding expression denotes
-// a (possibly parenthesized) built-in function.
-func (tv TypeAndValue) IsBuiltin() bool {
-	return tv.mode == builtin
-}
-
-// IsValue reports whether the corresponding expression is a value.
-// Builtins are not considered values. Constant values have a non-
-// nil Value.
-func (tv TypeAndValue) IsValue() bool {
-	switch tv.mode {
-	case constant_, variable, mapindex, value, commaok:
-		return true
-	}
-	return false
-}
-
-// IsNil reports whether the corresponding expression denotes the
-// predeclared value nil.
-func (tv TypeAndValue) IsNil() bool {
-	return tv.mode == value && tv.Type == Typ[UntypedNil]
-}
-
-// Addressable reports whether the corresponding expression
-// is addressable (https://golang.org/ref/spec#Address_operators).
-func (tv TypeAndValue) Addressable() bool {
-	return tv.mode == variable
-}
-
-// Assignable reports whether the corresponding expression
-// is assignable to (provided a value of the right type).
-func (tv TypeAndValue) Assignable() bool {
-	return tv.mode == variable || tv.mode == mapindex
-}
-
-// HasOk reports whether the corresponding expression may be
-// used on the lhs of a comma-ok assignment.
-func (tv TypeAndValue) HasOk() bool {
-	return tv.mode == commaok || tv.mode == mapindex
-}
-
-// An Initializer describes a package-level variable, or a list of variables in case
-// of a multi-valued initialization expression, and the corresponding initialization
-// expression.
-type Initializer struct {
-	Lhs []*Var // var Lhs = Rhs
-	Rhs ast.Expr
-}
-
-func (init *Initializer) String() string {
-	var buf bytes.Buffer
-	for i, lhs := range init.Lhs {
-		if i > 0 {
-			buf.WriteString(", ")
-		}
-		buf.WriteString(lhs.Name())
-	}
-	buf.WriteString(" = ")
-	WriteExpr(&buf, init.Rhs)
-	return buf.String()
-}
-
-// Check type-checks a package and returns the resulting package object,
-// the first error if any, and if info != nil, additional type information.
-// The package is marked as complete if no errors occurred, otherwise it is
-// incomplete. See Config.Error for controlling behavior in the presence of
-// errors.
-//
-// The package is specified by a list of *ast.Files and corresponding
-// file set, and the package path the package is identified with.
-// The clean path must not be empty or dot (".").
-func (conf *Config) Check(path string, fset *token.FileSet, files []*ast.File, info *Info) (*Package, error) {
-	pkg := NewPackage(path, "")
-	return pkg, NewChecker(conf, fset, pkg, info).Files(files)
-}
-
-// AssertableTo reports whether a value of type V can be asserted to have type T.
-func AssertableTo(V *Interface, T Type) bool {
-	m, _ := assertableTo(V, T)
-	return m == nil
-}
-
-// AssignableTo reports whether a value of type V is assignable to a variable of type T.
-func AssignableTo(V, T Type) bool {
-	x := operand{mode: value, typ: V}
-	return x.assignableTo(nil, T) // config not needed for non-constant x
-}
-
-// ConvertibleTo reports whether a value of type V is convertible to a value of type T.
-func ConvertibleTo(V, T Type) bool {
-	x := operand{mode: value, typ: V}
-	return x.convertibleTo(nil, T) // config not needed for non-constant x
-}
-
-// Implements reports whether type V implements interface T.
-func Implements(V Type, T *Interface) bool {
-	f, _ := MissingMethod(V, T, true)
-	return f == nil
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/api_test.go b/third_party/gofrontend/libgo/go/go/types/api_test.go
deleted file mode 100644
index eeda0d8..0000000
--- a/third_party/gofrontend/libgo/go/go/types/api_test.go
+++ /dev/null
@@ -1,1044 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/importer"
-	"go/parser"
-	"go/token"
-	"internal/testenv"
-	"reflect"
-	"regexp"
-	"strings"
-	"testing"
-
-	. "go/types"
-)
-
-func pkgFor(path, source string, info *Info) (*Package, error) {
-	fset := token.NewFileSet()
-	f, err := parser.ParseFile(fset, path, source, 0)
-	if err != nil {
-		return nil, err
-	}
-
-	conf := Config{Importer: importer.Default()}
-	return conf.Check(f.Name.Name, fset, []*ast.File{f}, info)
-}
-
-func mustTypecheck(t *testing.T, path, source string, info *Info) string {
-	pkg, err := pkgFor(path, source, info)
-	if err != nil {
-		name := path
-		if pkg != nil {
-			name = "package " + pkg.Name()
-		}
-		t.Fatalf("%s: didn't type-check (%s)", name, err)
-	}
-	return pkg.Name()
-}
-
-func TestValuesInfo(t *testing.T) {
-	var tests = []struct {
-		src  string
-		expr string // constant expression
-		typ  string // constant type
-		val  string // constant value
-	}{
-		{`package a0; const _ = false`, `false`, `untyped bool`, `false`},
-		{`package a1; const _ = 0`, `0`, `untyped int`, `0`},
-		{`package a2; const _ = 'A'`, `'A'`, `untyped rune`, `65`},
-		{`package a3; const _ = 0.`, `0.`, `untyped float`, `0`},
-		{`package a4; const _ = 0i`, `0i`, `untyped complex`, `0`},
-		{`package a5; const _ = "foo"`, `"foo"`, `untyped string`, `"foo"`},
-
-		{`package b0; var _ = false`, `false`, `bool`, `false`},
-		{`package b1; var _ = 0`, `0`, `int`, `0`},
-		{`package b2; var _ = 'A'`, `'A'`, `rune`, `65`},
-		{`package b3; var _ = 0.`, `0.`, `float64`, `0`},
-		{`package b4; var _ = 0i`, `0i`, `complex128`, `0`},
-		{`package b5; var _ = "foo"`, `"foo"`, `string`, `"foo"`},
-
-		{`package c0a; var _ = bool(false)`, `false`, `bool`, `false`},
-		{`package c0b; var _ = bool(false)`, `bool(false)`, `bool`, `false`},
-		{`package c0c; type T bool; var _ = T(false)`, `T(false)`, `c0c.T`, `false`},
-
-		{`package c1a; var _ = int(0)`, `0`, `int`, `0`},
-		{`package c1b; var _ = int(0)`, `int(0)`, `int`, `0`},
-		{`package c1c; type T int; var _ = T(0)`, `T(0)`, `c1c.T`, `0`},
-
-		{`package c2a; var _ = rune('A')`, `'A'`, `rune`, `65`},
-		{`package c2b; var _ = rune('A')`, `rune('A')`, `rune`, `65`},
-		{`package c2c; type T rune; var _ = T('A')`, `T('A')`, `c2c.T`, `65`},
-
-		{`package c3a; var _ = float32(0.)`, `0.`, `float32`, `0`},
-		{`package c3b; var _ = float32(0.)`, `float32(0.)`, `float32`, `0`},
-		{`package c3c; type T float32; var _ = T(0.)`, `T(0.)`, `c3c.T`, `0`},
-
-		{`package c4a; var _ = complex64(0i)`, `0i`, `complex64`, `0`},
-		{`package c4b; var _ = complex64(0i)`, `complex64(0i)`, `complex64`, `0`},
-		{`package c4c; type T complex64; var _ = T(0i)`, `T(0i)`, `c4c.T`, `0`},
-
-		{`package c5a; var _ = string("foo")`, `"foo"`, `string`, `"foo"`},
-		{`package c5b; var _ = string("foo")`, `string("foo")`, `string`, `"foo"`},
-		{`package c5c; type T string; var _ = T("foo")`, `T("foo")`, `c5c.T`, `"foo"`},
-
-		{`package d0; var _ = []byte("foo")`, `"foo"`, `string`, `"foo"`},
-		{`package d1; var _ = []byte(string("foo"))`, `"foo"`, `string`, `"foo"`},
-		{`package d2; var _ = []byte(string("foo"))`, `string("foo")`, `string`, `"foo"`},
-		{`package d3; type T []byte; var _ = T("foo")`, `"foo"`, `string`, `"foo"`},
-
-		{`package e0; const _ = float32( 1e-200)`, `float32(1e-200)`, `float32`, `0`},
-		{`package e1; const _ = float32(-1e-200)`, `float32(-1e-200)`, `float32`, `0`},
-		{`package e2; const _ = float64( 1e-2000)`, `float64(1e-2000)`, `float64`, `0`},
-		{`package e3; const _ = float64(-1e-2000)`, `float64(-1e-2000)`, `float64`, `0`},
-		{`package e4; const _ = complex64( 1e-200)`, `complex64(1e-200)`, `complex64`, `0`},
-		{`package e5; const _ = complex64(-1e-200)`, `complex64(-1e-200)`, `complex64`, `0`},
-		{`package e6; const _ = complex128( 1e-2000)`, `complex128(1e-2000)`, `complex128`, `0`},
-		{`package e7; const _ = complex128(-1e-2000)`, `complex128(-1e-2000)`, `complex128`, `0`},
-
-		{`package f0 ; var _ float32 =  1e-200`, `1e-200`, `float32`, `0`},
-		{`package f1 ; var _ float32 = -1e-200`, `-1e-200`, `float32`, `0`},
-		{`package f2a; var _ float64 =  1e-2000`, `1e-2000`, `float64`, `0`},
-		{`package f3a; var _ float64 = -1e-2000`, `-1e-2000`, `float64`, `0`},
-		{`package f2b; var _         =  1e-2000`, `1e-2000`, `float64`, `0`},
-		{`package f3b; var _         = -1e-2000`, `-1e-2000`, `float64`, `0`},
-		{`package f4 ; var _ complex64  =  1e-200 `, `1e-200`, `complex64`, `0`},
-		{`package f5 ; var _ complex64  = -1e-200 `, `-1e-200`, `complex64`, `0`},
-		{`package f6a; var _ complex128 =  1e-2000i`, `1e-2000i`, `complex128`, `0`},
-		{`package f7a; var _ complex128 = -1e-2000i`, `-1e-2000i`, `complex128`, `0`},
-		{`package f6b; var _            =  1e-2000i`, `1e-2000i`, `complex128`, `0`},
-		{`package f7b; var _            = -1e-2000i`, `-1e-2000i`, `complex128`, `0`},
-	}
-
-	for _, test := range tests {
-		info := Info{
-			Types: make(map[ast.Expr]TypeAndValue),
-		}
-		name := mustTypecheck(t, "ValuesInfo", test.src, &info)
-
-		// look for constant expression
-		var expr ast.Expr
-		for e := range info.Types {
-			if ExprString(e) == test.expr {
-				expr = e
-				break
-			}
-		}
-		if expr == nil {
-			t.Errorf("package %s: no expression found for %s", name, test.expr)
-			continue
-		}
-		tv := info.Types[expr]
-
-		// check that type is correct
-		if got := tv.Type.String(); got != test.typ {
-			t.Errorf("package %s: got type %s; want %s", name, got, test.typ)
-			continue
-		}
-
-		// check that value is correct
-		if got := tv.Value.String(); got != test.val {
-			t.Errorf("package %s: got value %s; want %s", name, got, test.val)
-		}
-	}
-}
-
-func TestTypesInfo(t *testing.T) {
-	var tests = []struct {
-		src  string
-		expr string // expression
-		typ  string // value type
-	}{
-		// single-valued expressions of untyped constants
-		{`package b0; var x interface{} = false`, `false`, `bool`},
-		{`package b1; var x interface{} = 0`, `0`, `int`},
-		{`package b2; var x interface{} = 0.`, `0.`, `float64`},
-		{`package b3; var x interface{} = 0i`, `0i`, `complex128`},
-		{`package b4; var x interface{} = "foo"`, `"foo"`, `string`},
-
-		// comma-ok expressions
-		{`package p0; var x interface{}; var _, _ = x.(int)`,
-			`x.(int)`,
-			`(int, bool)`,
-		},
-		{`package p1; var x interface{}; func _() { _, _ = x.(int) }`,
-			`x.(int)`,
-			`(int, bool)`,
-		},
-		// TODO(gri): uncomment if we accept issue 8189.
-		// {`package p2; type mybool bool; var m map[string]complex128; var b mybool; func _() { _, b = m["foo"] }`,
-		// 	`m["foo"]`,
-		// 	`(complex128, p2.mybool)`,
-		// },
-		// TODO(gri): remove if we accept issue 8189.
-		{`package p2; var m map[string]complex128; var b bool; func _() { _, b = m["foo"] }`,
-			`m["foo"]`,
-			`(complex128, bool)`,
-		},
-		{`package p3; var c chan string; var _, _ = <-c`,
-			`<-c`,
-			`(string, bool)`,
-		},
-
-		// issue 6796
-		{`package issue6796_a; var x interface{}; var _, _ = (x.(int))`,
-			`x.(int)`,
-			`(int, bool)`,
-		},
-		{`package issue6796_b; var c chan string; var _, _ = (<-c)`,
-			`(<-c)`,
-			`(string, bool)`,
-		},
-		{`package issue6796_c; var c chan string; var _, _ = (<-c)`,
-			`<-c`,
-			`(string, bool)`,
-		},
-		{`package issue6796_d; var c chan string; var _, _ = ((<-c))`,
-			`(<-c)`,
-			`(string, bool)`,
-		},
-		{`package issue6796_e; func f(c chan string) { _, _ = ((<-c)) }`,
-			`(<-c)`,
-			`(string, bool)`,
-		},
-
-		// issue 7060
-		{`package issue7060_a; var ( m map[int]string; x, ok = m[0] )`,
-			`m[0]`,
-			`(string, bool)`,
-		},
-		{`package issue7060_b; var ( m map[int]string; x, ok interface{} = m[0] )`,
-			`m[0]`,
-			`(string, bool)`,
-		},
-		{`package issue7060_c; func f(x interface{}, ok bool, m map[int]string) { x, ok = m[0] }`,
-			`m[0]`,
-			`(string, bool)`,
-		},
-		{`package issue7060_d; var ( ch chan string; x, ok = <-ch )`,
-			`<-ch`,
-			`(string, bool)`,
-		},
-		{`package issue7060_e; var ( ch chan string; x, ok interface{} = <-ch )`,
-			`<-ch`,
-			`(string, bool)`,
-		},
-		{`package issue7060_f; func f(x interface{}, ok bool, ch chan string) { x, ok = <-ch }`,
-			`<-ch`,
-			`(string, bool)`,
-		},
-	}
-
-	for _, test := range tests {
-		info := Info{Types: make(map[ast.Expr]TypeAndValue)}
-		name := mustTypecheck(t, "TypesInfo", test.src, &info)
-
-		// look for expression type
-		var typ Type
-		for e, tv := range info.Types {
-			if ExprString(e) == test.expr {
-				typ = tv.Type
-				break
-			}
-		}
-		if typ == nil {
-			t.Errorf("package %s: no type found for %s", name, test.expr)
-			continue
-		}
-
-		// check that type is correct
-		if got := typ.String(); got != test.typ {
-			t.Errorf("package %s: got %s; want %s", name, got, test.typ)
-		}
-	}
-}
-
-func predString(tv TypeAndValue) string {
-	var buf bytes.Buffer
-	pred := func(b bool, s string) {
-		if b {
-			if buf.Len() > 0 {
-				buf.WriteString(", ")
-			}
-			buf.WriteString(s)
-		}
-	}
-
-	pred(tv.IsVoid(), "void")
-	pred(tv.IsType(), "type")
-	pred(tv.IsBuiltin(), "builtin")
-	pred(tv.IsValue() && tv.Value != nil, "const")
-	pred(tv.IsValue() && tv.Value == nil, "value")
-	pred(tv.IsNil(), "nil")
-	pred(tv.Addressable(), "addressable")
-	pred(tv.Assignable(), "assignable")
-	pred(tv.HasOk(), "hasOk")
-
-	if buf.Len() == 0 {
-		return "invalid"
-	}
-	return buf.String()
-}
-
-func TestPredicatesInfo(t *testing.T) {
-	testenv.MustHaveGoBuild(t)
-
-	var tests = []struct {
-		src  string
-		expr string
-		pred string
-	}{
-		// void
-		{`package n0; func f() { f() }`, `f()`, `void`},
-
-		// types
-		{`package t0; type _ int`, `int`, `type`},
-		{`package t1; type _ []int`, `[]int`, `type`},
-		{`package t2; type _ func()`, `func()`, `type`},
-
-		// built-ins
-		{`package b0; var _ = len("")`, `len`, `builtin`},
-		{`package b1; var _ = (len)("")`, `(len)`, `builtin`},
-
-		// constants
-		{`package c0; var _ = 42`, `42`, `const`},
-		{`package c1; var _ = "foo" + "bar"`, `"foo" + "bar"`, `const`},
-		{`package c2; const (i = 1i; _ = i)`, `i`, `const`},
-
-		// values
-		{`package v0; var (a, b int; _ = a + b)`, `a + b`, `value`},
-		{`package v1; var _ = &[]int{1}`, `([]int literal)`, `value`},
-		{`package v2; var _ = func(){}`, `(func() literal)`, `value`},
-		{`package v4; func f() { _ = f }`, `f`, `value`},
-		{`package v3; var _ *int = nil`, `nil`, `value, nil`},
-		{`package v3; var _ *int = (nil)`, `(nil)`, `value, nil`},
-
-		// addressable (and thus assignable) operands
-		{`package a0; var (x int; _ = x)`, `x`, `value, addressable, assignable`},
-		{`package a1; var (p *int; _ = *p)`, `*p`, `value, addressable, assignable`},
-		{`package a2; var (s []int; _ = s[0])`, `s[0]`, `value, addressable, assignable`},
-		{`package a3; var (s struct{f int}; _ = s.f)`, `s.f`, `value, addressable, assignable`},
-		{`package a4; var (a [10]int; _ = a[0])`, `a[0]`, `value, addressable, assignable`},
-		{`package a5; func _(x int) { _ = x }`, `x`, `value, addressable, assignable`},
-		{`package a6; func _()(x int) { _ = x; return }`, `x`, `value, addressable, assignable`},
-		{`package a7; type T int; func (x T) _() { _ = x }`, `x`, `value, addressable, assignable`},
-		// composite literals are not addressable
-
-		// assignable but not addressable values
-		{`package s0; var (m map[int]int; _ = m[0])`, `m[0]`, `value, assignable, hasOk`},
-		{`package s1; var (m map[int]int; _, _ = m[0])`, `m[0]`, `value, assignable, hasOk`},
-
-		// hasOk expressions
-		{`package k0; var (ch chan int; _ = <-ch)`, `<-ch`, `value, hasOk`},
-		{`package k1; var (ch chan int; _, _ = <-ch)`, `<-ch`, `value, hasOk`},
-
-		// missing entries
-		// - package names are collected in the Uses map
-		// - identifiers being declared are collected in the Defs map
-		{`package m0; import "os"; func _() { _ = os.Stdout }`, `os`, `<missing>`},
-		{`package m1; import p "os"; func _() { _ = p.Stdout }`, `p`, `<missing>`},
-		{`package m2; const c = 0`, `c`, `<missing>`},
-		{`package m3; type T int`, `T`, `<missing>`},
-		{`package m4; var v int`, `v`, `<missing>`},
-		{`package m5; func f() {}`, `f`, `<missing>`},
-		{`package m6; func _(x int) {}`, `x`, `<missing>`},
-		{`package m6; func _()(x int) { return }`, `x`, `<missing>`},
-		{`package m6; type T int; func (x T) _() {}`, `x`, `<missing>`},
-	}
-
-	for _, test := range tests {
-		info := Info{Types: make(map[ast.Expr]TypeAndValue)}
-		name := mustTypecheck(t, "PredicatesInfo", test.src, &info)
-
-		// look for expression predicates
-		got := "<missing>"
-		for e, tv := range info.Types {
-			//println(name, ExprString(e))
-			if ExprString(e) == test.expr {
-				got = predString(tv)
-				break
-			}
-		}
-
-		if got != test.pred {
-			t.Errorf("package %s: got %s; want %s", name, got, test.pred)
-		}
-	}
-}
-
-func TestScopesInfo(t *testing.T) {
-	testenv.MustHaveGoBuild(t)
-
-	var tests = []struct {
-		src    string
-		scopes []string // list of scope descriptors of the form kind:varlist
-	}{
-		{`package p0`, []string{
-			"file:",
-		}},
-		{`package p1; import ( "fmt"; m "math"; _ "os" ); var ( _ = fmt.Println; _ = m.Pi )`, []string{
-			"file:fmt m",
-		}},
-		{`package p2; func _() {}`, []string{
-			"file:", "func:",
-		}},
-		{`package p3; func _(x, y int) {}`, []string{
-			"file:", "func:x y",
-		}},
-		{`package p4; func _(x, y int) { x, z := 1, 2; _ = z }`, []string{
-			"file:", "func:x y z", // redeclaration of x
-		}},
-		{`package p5; func _(x, y int) (u, _ int) { return }`, []string{
-			"file:", "func:u x y",
-		}},
-		{`package p6; func _() { { var x int; _ = x } }`, []string{
-			"file:", "func:", "block:x",
-		}},
-		{`package p7; func _() { if true {} }`, []string{
-			"file:", "func:", "if:", "block:",
-		}},
-		{`package p8; func _() { if x := 0; x < 0 { y := x; _ = y } }`, []string{
-			"file:", "func:", "if:x", "block:y",
-		}},
-		{`package p9; func _() { switch x := 0; x {} }`, []string{
-			"file:", "func:", "switch:x",
-		}},
-		{`package p10; func _() { switch x := 0; x { case 1: y := x; _ = y; default: }}`, []string{
-			"file:", "func:", "switch:x", "case:y", "case:",
-		}},
-		{`package p11; func _(t interface{}) { switch t.(type) {} }`, []string{
-			"file:", "func:t", "type switch:",
-		}},
-		{`package p12; func _(t interface{}) { switch t := t; t.(type) {} }`, []string{
-			"file:", "func:t", "type switch:t",
-		}},
-		{`package p13; func _(t interface{}) { switch x := t.(type) { case int: _ = x } }`, []string{
-			"file:", "func:t", "type switch:", "case:x", // x implicitly declared
-		}},
-		{`package p14; func _() { select{} }`, []string{
-			"file:", "func:",
-		}},
-		{`package p15; func _(c chan int) { select{ case <-c: } }`, []string{
-			"file:", "func:c", "comm:",
-		}},
-		{`package p16; func _(c chan int) { select{ case i := <-c: x := i; _ = x} }`, []string{
-			"file:", "func:c", "comm:i x",
-		}},
-		{`package p17; func _() { for{} }`, []string{
-			"file:", "func:", "for:", "block:",
-		}},
-		{`package p18; func _(n int) { for i := 0; i < n; i++ { _ = i } }`, []string{
-			"file:", "func:n", "for:i", "block:",
-		}},
-		{`package p19; func _(a []int) { for i := range a { _ = i} }`, []string{
-			"file:", "func:a", "range:i", "block:",
-		}},
-		{`package p20; var s int; func _(a []int) { for i, x := range a { s += x; _ = i } }`, []string{
-			"file:", "func:a", "range:i x", "block:",
-		}},
-	}
-
-	for _, test := range tests {
-		info := Info{Scopes: make(map[ast.Node]*Scope)}
-		name := mustTypecheck(t, "ScopesInfo", test.src, &info)
-
-		// number of scopes must match
-		if len(info.Scopes) != len(test.scopes) {
-			t.Errorf("package %s: got %d scopes; want %d", name, len(info.Scopes), len(test.scopes))
-		}
-
-		// scope descriptions must match
-		for node, scope := range info.Scopes {
-			kind := "<unknown node kind>"
-			switch node.(type) {
-			case *ast.File:
-				kind = "file"
-			case *ast.FuncType:
-				kind = "func"
-			case *ast.BlockStmt:
-				kind = "block"
-			case *ast.IfStmt:
-				kind = "if"
-			case *ast.SwitchStmt:
-				kind = "switch"
-			case *ast.TypeSwitchStmt:
-				kind = "type switch"
-			case *ast.CaseClause:
-				kind = "case"
-			case *ast.CommClause:
-				kind = "comm"
-			case *ast.ForStmt:
-				kind = "for"
-			case *ast.RangeStmt:
-				kind = "range"
-			}
-
-			// look for matching scope description
-			desc := kind + ":" + strings.Join(scope.Names(), " ")
-			found := false
-			for _, d := range test.scopes {
-				if desc == d {
-					found = true
-					break
-				}
-			}
-			if !found {
-				t.Errorf("package %s: no matching scope found for %s", name, desc)
-			}
-		}
-	}
-}
-
-func TestInitOrderInfo(t *testing.T) {
-	var tests = []struct {
-		src   string
-		inits []string
-	}{
-		{`package p0; var (x = 1; y = x)`, []string{
-			"x = 1", "y = x",
-		}},
-		{`package p1; var (a = 1; b = 2; c = 3)`, []string{
-			"a = 1", "b = 2", "c = 3",
-		}},
-		{`package p2; var (a, b, c = 1, 2, 3)`, []string{
-			"a = 1", "b = 2", "c = 3",
-		}},
-		{`package p3; var _ = f(); func f() int { return 1 }`, []string{
-			"_ = f()", // blank var
-		}},
-		{`package p4; var (a = 0; x = y; y = z; z = 0)`, []string{
-			"a = 0", "z = 0", "y = z", "x = y",
-		}},
-		{`package p5; var (a, _ = m[0]; m map[int]string)`, []string{
-			"a, _ = m[0]", // blank var
-		}},
-		{`package p6; var a, b = f(); func f() (_, _ int) { return z, z }; var z = 0`, []string{
-			"z = 0", "a, b = f()",
-		}},
-		{`package p7; var (a = func() int { return b }(); b = 1)`, []string{
-			"b = 1", "a = (func() int literal)()",
-		}},
-		{`package p8; var (a, b = func() (_, _ int) { return c, c }(); c = 1)`, []string{
-			"c = 1", "a, b = (func() (_, _ int) literal)()",
-		}},
-		{`package p9; type T struct{}; func (T) m() int { _ = y; return 0 }; var x, y = T.m, 1`, []string{
-			"y = 1", "x = T.m",
-		}},
-		{`package p10; var (d = c + b; a = 0; b = 0; c = 0)`, []string{
-			"a = 0", "b = 0", "c = 0", "d = c + b",
-		}},
-		{`package p11; var (a = e + c; b = d + c; c = 0; d = 0; e = 0)`, []string{
-			"c = 0", "d = 0", "b = d + c", "e = 0", "a = e + c",
-		}},
-		// emit an initializer for n:1 initializations only once (not for each node
-		// on the lhs which may appear in different order in the dependency graph)
-		{`package p12; var (a = x; b = 0; x, y = m[0]; m map[int]int)`, []string{
-			"b = 0", "x, y = m[0]", "a = x",
-		}},
-		// test case from spec section on package initialization
-		{`package p12
-
-		var (
-			a = c + b
-			b = f()
-			c = f()
-			d = 3
-		)
-
-		func f() int {
-			d++
-			return d
-		}`, []string{
-			"d = 3", "b = f()", "c = f()", "a = c + b",
-		}},
-		// test case for issue 7131
-		{`package main
-
-		var counter int
-		func next() int { counter++; return counter }
-
-		var _ = makeOrder()
-		func makeOrder() []int { return []int{f, b, d, e, c, a} }
-
-		var a       = next()
-		var b, c    = next(), next()
-		var d, e, f = next(), next(), next()
-		`, []string{
-			"a = next()", "b = next()", "c = next()", "d = next()", "e = next()", "f = next()", "_ = makeOrder()",
-		}},
-	}
-
-	for _, test := range tests {
-		info := Info{}
-		name := mustTypecheck(t, "InitOrderInfo", test.src, &info)
-
-		// number of initializers must match
-		if len(info.InitOrder) != len(test.inits) {
-			t.Errorf("package %s: got %d initializers; want %d", name, len(info.InitOrder), len(test.inits))
-			continue
-		}
-
-		// initializers must match
-		for i, want := range test.inits {
-			got := info.InitOrder[i].String()
-			if got != want {
-				t.Errorf("package %s, init %d: got %s; want %s", name, i, got, want)
-				continue
-			}
-		}
-	}
-}
-
-func TestMultiFileInitOrder(t *testing.T) {
-	fset := token.NewFileSet()
-	mustParse := func(src string) *ast.File {
-		f, err := parser.ParseFile(fset, "main", src, 0)
-		if err != nil {
-			t.Fatal(err)
-		}
-		return f
-	}
-
-	fileA := mustParse(`package main; var a = 1`)
-	fileB := mustParse(`package main; var b = 2`)
-
-	// The initialization order must not depend on the parse
-	// order of the files, only on the presentation order to
-	// the type-checker.
-	for _, test := range []struct {
-		files []*ast.File
-		want  string
-	}{
-		{[]*ast.File{fileA, fileB}, "[a = 1 b = 2]"},
-		{[]*ast.File{fileB, fileA}, "[b = 2 a = 1]"},
-	} {
-		var info Info
-		if _, err := new(Config).Check("main", fset, test.files, &info); err != nil {
-			t.Fatal(err)
-		}
-		if got := fmt.Sprint(info.InitOrder); got != test.want {
-			t.Fatalf("got %s; want %s", got, test.want)
-		}
-	}
-}
-
-func TestFiles(t *testing.T) {
-	var sources = []string{
-		"package p; type T struct{}; func (T) m1() {}",
-		"package p; func (T) m2() {}; var x interface{ m1(); m2() } = T{}",
-		"package p; func (T) m3() {}; var y interface{ m1(); m2(); m3() } = T{}",
-		"package p",
-	}
-
-	var conf Config
-	fset := token.NewFileSet()
-	pkg := NewPackage("p", "p")
-	var info Info
-	check := NewChecker(&conf, fset, pkg, &info)
-
-	for i, src := range sources {
-		filename := fmt.Sprintf("sources%d", i)
-		f, err := parser.ParseFile(fset, filename, src, 0)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if err := check.Files([]*ast.File{f}); err != nil {
-			t.Error(err)
-		}
-	}
-
-	// check InitOrder is [x y]
-	var vars []string
-	for _, init := range info.InitOrder {
-		for _, v := range init.Lhs {
-			vars = append(vars, v.Name())
-		}
-	}
-	if got, want := fmt.Sprint(vars), "[x y]"; got != want {
-		t.Errorf("InitOrder == %s, want %s", got, want)
-	}
-}
-
-type testImporter map[string]*Package
-
-func (m testImporter) Import(path string) (*Package, error) {
-	if pkg := m[path]; pkg != nil {
-		return pkg, nil
-	}
-	return nil, fmt.Errorf("package %q not found", path)
-}
-
-func TestSelection(t *testing.T) {
-	selections := make(map[*ast.SelectorExpr]*Selection)
-
-	fset := token.NewFileSet()
-	imports := make(testImporter)
-	conf := Config{Importer: imports}
-	makePkg := func(path, src string) {
-		f, err := parser.ParseFile(fset, path+".go", src, 0)
-		if err != nil {
-			t.Fatal(err)
-		}
-		pkg, err := conf.Check(path, fset, []*ast.File{f}, &Info{Selections: selections})
-		if err != nil {
-			t.Fatal(err)
-		}
-		imports[path] = pkg
-	}
-
-	const libSrc = `
-package lib
-type T float64
-const C T = 3
-var V T
-func F() {}
-func (T) M() {}
-`
-	const mainSrc = `
-package main
-import "lib"
-
-type A struct {
-	*B
-	C
-}
-
-type B struct {
-	b int
-}
-
-func (B) f(int)
-
-type C struct {
-	c int
-}
-
-func (C) g()
-func (*C) h()
-
-func main() {
-	// qualified identifiers
-	var _ lib.T
-        _ = lib.C
-        _ = lib.F
-        _ = lib.V
-	_ = lib.T.M
-
-	// fields
-	_ = A{}.B
-	_ = new(A).B
-
-	_ = A{}.C
-	_ = new(A).C
-
-	_ = A{}.b
-	_ = new(A).b
-
-	_ = A{}.c
-	_ = new(A).c
-
-	// methods
-        _ = A{}.f
-        _ = new(A).f
-        _ = A{}.g
-        _ = new(A).g
-        _ = new(A).h
-
-        _ = B{}.f
-        _ = new(B).f
-
-        _ = C{}.g
-        _ = new(C).g
-        _ = new(C).h
-
-	// method expressions
-        _ = A.f
-        _ = (*A).f
-        _ = B.f
-        _ = (*B).f
-}`
-
-	wantOut := map[string][2]string{
-		"lib.T.M": {"method expr (lib.T) M(lib.T)", ".[0]"},
-
-		"A{}.B":    {"field (main.A) B *main.B", ".[0]"},
-		"new(A).B": {"field (*main.A) B *main.B", "->[0]"},
-		"A{}.C":    {"field (main.A) C main.C", ".[1]"},
-		"new(A).C": {"field (*main.A) C main.C", "->[1]"},
-		"A{}.b":    {"field (main.A) b int", "->[0 0]"},
-		"new(A).b": {"field (*main.A) b int", "->[0 0]"},
-		"A{}.c":    {"field (main.A) c int", ".[1 0]"},
-		"new(A).c": {"field (*main.A) c int", "->[1 0]"},
-
-		"A{}.f":    {"method (main.A) f(int)", "->[0 0]"},
-		"new(A).f": {"method (*main.A) f(int)", "->[0 0]"},
-		"A{}.g":    {"method (main.A) g()", ".[1 0]"},
-		"new(A).g": {"method (*main.A) g()", "->[1 0]"},
-		"new(A).h": {"method (*main.A) h()", "->[1 1]"}, // TODO(gri) should this report .[1 1] ?
-		"B{}.f":    {"method (main.B) f(int)", ".[0]"},
-		"new(B).f": {"method (*main.B) f(int)", "->[0]"},
-		"C{}.g":    {"method (main.C) g()", ".[0]"},
-		"new(C).g": {"method (*main.C) g()", "->[0]"},
-		"new(C).h": {"method (*main.C) h()", "->[1]"}, // TODO(gri) should this report .[1] ?
-
-		"A.f":    {"method expr (main.A) f(main.A, int)", "->[0 0]"},
-		"(*A).f": {"method expr (*main.A) f(*main.A, int)", "->[0 0]"},
-		"B.f":    {"method expr (main.B) f(main.B, int)", ".[0]"},
-		"(*B).f": {"method expr (*main.B) f(*main.B, int)", "->[0]"},
-	}
-
-	makePkg("lib", libSrc)
-	makePkg("main", mainSrc)
-
-	for e, sel := range selections {
-		sel.String() // assertion: must not panic
-
-		start := fset.Position(e.Pos()).Offset
-		end := fset.Position(e.End()).Offset
-		syntax := mainSrc[start:end] // (all SelectorExprs are in main, not lib)
-
-		direct := "."
-		if sel.Indirect() {
-			direct = "->"
-		}
-		got := [2]string{
-			sel.String(),
-			fmt.Sprintf("%s%v", direct, sel.Index()),
-		}
-		want := wantOut[syntax]
-		if want != got {
-			t.Errorf("%s: got %q; want %q", syntax, got, want)
-		}
-		delete(wantOut, syntax)
-
-		// We must explicitly assert properties of the
-		// Signature's receiver since it doesn't participate
-		// in Identical() or String().
-		sig, _ := sel.Type().(*Signature)
-		if sel.Kind() == MethodVal {
-			got := sig.Recv().Type()
-			want := sel.Recv()
-			if !Identical(got, want) {
-				t.Errorf("%s: Recv() = %s, want %s", syntax, got, want)
-			}
-		} else if sig != nil && sig.Recv() != nil {
-			t.Errorf("%s: signature has receiver %s", sig, sig.Recv().Type())
-		}
-	}
-	// Assert that all wantOut entries were used exactly once.
-	for syntax := range wantOut {
-		t.Errorf("no ast.Selection found with syntax %q", syntax)
-	}
-}
-
-func TestIssue8518(t *testing.T) {
-	fset := token.NewFileSet()
-	imports := make(testImporter)
-	conf := Config{
-		Error:    func(err error) { t.Log(err) }, // don't exit after first error
-		Importer: imports,
-	}
-	makePkg := func(path, src string) {
-		f, err := parser.ParseFile(fset, path, src, 0)
-		if err != nil {
-			t.Fatal(err)
-		}
-		pkg, _ := conf.Check(path, fset, []*ast.File{f}, nil) // errors logged via conf.Error
-		imports[path] = pkg
-	}
-
-	const libSrc = `
-package a
-import "missing"
-const C1 = foo
-const C2 = missing.C
-`
-
-	const mainSrc = `
-package main
-import "a"
-var _ = a.C1
-var _ = a.C2
-`
-
-	makePkg("a", libSrc)
-	makePkg("main", mainSrc) // don't crash when type-checking this package
-}
-
-func TestLookupFieldOrMethod(t *testing.T) {
-	// Test cases assume a lookup of the form a.f or x.f, where a stands for an
-	// addressable value, and x for a non-addressable value (even though a variable
-	// for ease of test case writing).
-	var tests = []struct {
-		src      string
-		found    bool
-		index    []int
-		indirect bool
-	}{
-		// field lookups
-		{"var x T; type T struct{}", false, nil, false},
-		{"var x T; type T struct{ f int }", true, []int{0}, false},
-		{"var x T; type T struct{ a, b, f, c int }", true, []int{2}, false},
-
-		// method lookups
-		{"var a T; type T struct{}; func (T) f() {}", true, []int{0}, false},
-		{"var a *T; type T struct{}; func (T) f() {}", true, []int{0}, true},
-		{"var a T; type T struct{}; func (*T) f() {}", true, []int{0}, false},
-		{"var a *T; type T struct{}; func (*T) f() {}", true, []int{0}, true}, // TODO(gri) should this report indirect = false?
-
-		// collisions
-		{"type ( E1 struct{ f int }; E2 struct{ f int }; x struct{ E1; *E2 })", false, []int{1, 0}, false},
-		{"type ( E1 struct{ f int }; E2 struct{}; x struct{ E1; *E2 }); func (E2) f() {}", false, []int{1, 0}, false},
-
-		// outside methodset
-		// (*T).f method exists, but value of type T is not addressable
-		{"var x T; type T struct{}; func (*T) f() {}", false, nil, true},
-	}
-
-	for _, test := range tests {
-		pkg, err := pkgFor("test", "package p;"+test.src, nil)
-		if err != nil {
-			t.Errorf("%s: incorrect test case: %s", test.src, err)
-			continue
-		}
-
-		obj := pkg.Scope().Lookup("a")
-		if obj == nil {
-			if obj = pkg.Scope().Lookup("x"); obj == nil {
-				t.Errorf("%s: incorrect test case - no object a or x", test.src)
-				continue
-			}
-		}
-
-		f, index, indirect := LookupFieldOrMethod(obj.Type(), obj.Name() == "a", pkg, "f")
-		if (f != nil) != test.found {
-			if f == nil {
-				t.Errorf("%s: got no object; want one", test.src)
-			} else {
-				t.Errorf("%s: got object = %v; want none", test.src, f)
-			}
-		}
-		if !sameSlice(index, test.index) {
-			t.Errorf("%s: got index = %v; want %v", test.src, index, test.index)
-		}
-		if indirect != test.indirect {
-			t.Errorf("%s: got indirect = %v; want %v", test.src, indirect, test.indirect)
-		}
-	}
-}
-
-func sameSlice(a, b []int) bool {
-	if len(a) != len(b) {
-		return false
-	}
-	for i, x := range a {
-		if x != b[i] {
-			return false
-		}
-	}
-	return true
-}
-
-// TestScopeLookupParent ensures that (*Scope).LookupParent returns
-// the correct result at various positions with the source.
-func TestScopeLookupParent(t *testing.T) {
-	fset := token.NewFileSet()
-	imports := make(testImporter)
-	conf := Config{Importer: imports}
-	mustParse := func(src string) *ast.File {
-		f, err := parser.ParseFile(fset, "dummy.go", src, parser.ParseComments)
-		if err != nil {
-			t.Fatal(err)
-		}
-		return f
-	}
-	var info Info
-	makePkg := func(path string, files ...*ast.File) {
-		imports[path], _ = conf.Check(path, fset, files, &info)
-	}
-
-	makePkg("lib", mustParse("package lib; var X int"))
-	// Each /*name=kind:line*/ comment makes the test look up the
-	// name at that point and checks that it resolves to a decl of
-	// the specified kind and line number.  "undef" means undefined.
-	mainSrc := `
-package main
-import "lib"
-var Y = lib.X
-func f() {
-	print(Y) /*Y=var:4*/
-	z /*z=undef*/ := /*z=undef*/ 1 /*z=var:7*/
-	print(z)
-	/*f=func:5*/ /*lib=pkgname:3*/
-	type /*T=undef*/ T /*T=typename:10*/ *T
-}
-`
-	info.Uses = make(map[*ast.Ident]Object)
-	f := mustParse(mainSrc)
-	makePkg("main", f)
-	mainScope := imports["main"].Scope()
-	rx := regexp.MustCompile(`^/\*(\w*)=([\w:]*)\*/$`)
-	for _, group := range f.Comments {
-		for _, comment := range group.List {
-			// Parse the assertion in the comment.
-			m := rx.FindStringSubmatch(comment.Text)
-			if m == nil {
-				t.Errorf("%s: bad comment: %s",
-					fset.Position(comment.Pos()), comment.Text)
-				continue
-			}
-			name, want := m[1], m[2]
-
-			// Look up the name in the innermost enclosing scope.
-			inner := mainScope.Innermost(comment.Pos())
-			if inner == nil {
-				t.Errorf("%s: at %s: can't find innermost scope",
-					fset.Position(comment.Pos()), comment.Text)
-				continue
-			}
-			got := "undef"
-			if _, obj := inner.LookupParent(name, comment.Pos()); obj != nil {
-				kind := strings.ToLower(strings.TrimPrefix(reflect.TypeOf(obj).String(), "*types."))
-				got = fmt.Sprintf("%s:%d", kind, fset.Position(obj.Pos()).Line)
-			}
-			if got != want {
-				t.Errorf("%s: at %s: %s resolved to %s, want %s",
-					fset.Position(comment.Pos()), comment.Text, name, got, want)
-			}
-		}
-	}
-
-	// Check that for each referring identifier,
-	// a lookup of its name on the innermost
-	// enclosing scope returns the correct object.
-
-	for id, wantObj := range info.Uses {
-		inner := mainScope.Innermost(id.Pos())
-		if inner == nil {
-			t.Errorf("%s: can't find innermost scope enclosing %q",
-				fset.Position(id.Pos()), id.Name)
-			continue
-		}
-
-		// Exclude selectors and qualified identifiers---lexical
-		// refs only.  (Ideally, we'd see if the AST parent is a
-		// SelectorExpr, but that requires PathEnclosingInterval
-		// from golang.org/x/tools/go/ast/astutil.)
-		if id.Name == "X" {
-			continue
-		}
-
-		_, gotObj := inner.LookupParent(id.Name, id.Pos())
-		if gotObj != wantObj {
-			t.Errorf("%s: got %v, want %v",
-				fset.Position(id.Pos()), gotObj, wantObj)
-			continue
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/assignments.go b/third_party/gofrontend/libgo/go/go/types/assignments.go
deleted file mode 100644
index e88de56..0000000
--- a/third_party/gofrontend/libgo/go/go/types/assignments.go
+++ /dev/null
@@ -1,328 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements initialization and assignment checks.
-
-package types
-
-import (
-	"go/ast"
-	"go/token"
-)
-
-// assignment reports whether x can be assigned to a variable of type T,
-// if necessary by attempting to convert untyped values to the appropriate
-// type. If x.mode == invalid upon return, then assignment has already
-// issued an error message and the caller doesn't have to report another.
-// Use T == nil to indicate assignment to an untyped blank identifier.
-//
-// TODO(gri) Should find a better way to handle in-band errors.
-//
-func (check *Checker) assignment(x *operand, T Type) bool {
-	switch x.mode {
-	case invalid:
-		return true // error reported before
-	case constant_, variable, mapindex, value, commaok:
-		// ok
-	default:
-		unreachable()
-	}
-
-	// x must be a single value
-	// (tuple types are never named - no need for underlying type)
-	if t, _ := x.typ.(*Tuple); t != nil {
-		assert(t.Len() > 1)
-		check.errorf(x.pos(), "%d-valued expression %s used as single value", t.Len(), x)
-		x.mode = invalid
-		return false
-	}
-
-	if isUntyped(x.typ) {
-		target := T
-		// spec: "If an untyped constant is assigned to a variable of interface
-		// type or the blank identifier, the constant is first converted to type
-		// bool, rune, int, float64, complex128 or string respectively, depending
-		// on whether the value is a boolean, rune, integer, floating-point, complex,
-		// or string constant."
-		if T == nil || IsInterface(T) {
-			if T == nil && x.typ == Typ[UntypedNil] {
-				check.errorf(x.pos(), "use of untyped nil")
-				x.mode = invalid
-				return false
-			}
-			target = defaultType(x.typ)
-		}
-		check.convertUntyped(x, target)
-		if x.mode == invalid {
-			return false
-		}
-	}
-
-	// spec: "If a left-hand side is the blank identifier, any typed or
-	// non-constant value except for the predeclared identifier nil may
-	// be assigned to it."
-	return T == nil || x.assignableTo(check.conf, T)
-}
-
-func (check *Checker) initConst(lhs *Const, x *operand) {
-	if x.mode == invalid || x.typ == Typ[Invalid] || lhs.typ == Typ[Invalid] {
-		if lhs.typ == nil {
-			lhs.typ = Typ[Invalid]
-		}
-		return
-	}
-
-	// rhs must be a constant
-	if x.mode != constant_ {
-		check.errorf(x.pos(), "%s is not constant", x)
-		if lhs.typ == nil {
-			lhs.typ = Typ[Invalid]
-		}
-		return
-	}
-	assert(isConstType(x.typ))
-
-	// If the lhs doesn't have a type yet, use the type of x.
-	if lhs.typ == nil {
-		lhs.typ = x.typ
-	}
-
-	if !check.assignment(x, lhs.typ) {
-		if x.mode != invalid {
-			check.errorf(x.pos(), "cannot define constant %s (type %s) as %s", lhs.Name(), lhs.typ, x)
-		}
-		return
-	}
-
-	lhs.val = x.val
-}
-
-// If result is set, lhs is a function result parameter and x is a return result.
-func (check *Checker) initVar(lhs *Var, x *operand, result bool) Type {
-	if x.mode == invalid || x.typ == Typ[Invalid] || lhs.typ == Typ[Invalid] {
-		if lhs.typ == nil {
-			lhs.typ = Typ[Invalid]
-		}
-		return nil
-	}
-
-	// If the lhs doesn't have a type yet, use the type of x.
-	if lhs.typ == nil {
-		typ := x.typ
-		if isUntyped(typ) {
-			// convert untyped types to default types
-			if typ == Typ[UntypedNil] {
-				check.errorf(x.pos(), "use of untyped nil")
-				lhs.typ = Typ[Invalid]
-				return nil
-			}
-			typ = defaultType(typ)
-		}
-		lhs.typ = typ
-	}
-
-	if !check.assignment(x, lhs.typ) {
-		if x.mode != invalid {
-			if result {
-				// don't refer to lhs.name because it may be an anonymous result parameter
-				check.errorf(x.pos(), "cannot return %s as value of type %s", x, lhs.typ)
-			} else {
-				check.errorf(x.pos(), "cannot initialize %s with %s", lhs, x)
-			}
-		}
-		return nil
-	}
-
-	return x.typ
-}
-
-func (check *Checker) assignVar(lhs ast.Expr, x *operand) Type {
-	if x.mode == invalid || x.typ == Typ[Invalid] {
-		return nil
-	}
-
-	// Determine if the lhs is a (possibly parenthesized) identifier.
-	ident, _ := unparen(lhs).(*ast.Ident)
-
-	// Don't evaluate lhs if it is the blank identifier.
-	if ident != nil && ident.Name == "_" {
-		check.recordDef(ident, nil)
-		if !check.assignment(x, nil) {
-			assert(x.mode == invalid)
-			x.typ = nil
-		}
-		return x.typ
-	}
-
-	// If the lhs is an identifier denoting a variable v, this assignment
-	// is not a 'use' of v. Remember current value of v.used and restore
-	// after evaluating the lhs via check.expr.
-	var v *Var
-	var v_used bool
-	if ident != nil {
-		if _, obj := check.scope.LookupParent(ident.Name, token.NoPos); obj != nil {
-			v, _ = obj.(*Var)
-			if v != nil {
-				v_used = v.used
-			}
-		}
-	}
-
-	var z operand
-	check.expr(&z, lhs)
-	if v != nil {
-		v.used = v_used // restore v.used
-	}
-
-	if z.mode == invalid || z.typ == Typ[Invalid] {
-		return nil
-	}
-
-	// spec: "Each left-hand side operand must be addressable, a map index
-	// expression, or the blank identifier. Operands may be parenthesized."
-	switch z.mode {
-	case invalid:
-		return nil
-	case variable, mapindex:
-		// ok
-	default:
-		check.errorf(z.pos(), "cannot assign to %s", &z)
-		return nil
-	}
-
-	if !check.assignment(x, z.typ) {
-		if x.mode != invalid {
-			check.errorf(x.pos(), "cannot assign %s to %s", x, &z)
-		}
-		return nil
-	}
-
-	return x.typ
-}
-
-// If returnPos is valid, initVars is called to type-check the assignment of
-// return expressions, and returnPos is the position of the return statement.
-func (check *Checker) initVars(lhs []*Var, rhs []ast.Expr, returnPos token.Pos) {
-	l := len(lhs)
-	get, r, commaOk := unpack(func(x *operand, i int) { check.expr(x, rhs[i]) }, len(rhs), l == 2 && !returnPos.IsValid())
-	if get == nil || l != r {
-		// invalidate lhs and use rhs
-		for _, obj := range lhs {
-			if obj.typ == nil {
-				obj.typ = Typ[Invalid]
-			}
-		}
-		if get == nil {
-			return // error reported by unpack
-		}
-		check.useGetter(get, r)
-		if returnPos.IsValid() {
-			check.errorf(returnPos, "wrong number of return values (want %d, got %d)", l, r)
-			return
-		}
-		check.errorf(rhs[0].Pos(), "assignment count mismatch (%d vs %d)", l, r)
-		return
-	}
-
-	var x operand
-	if commaOk {
-		var a [2]Type
-		for i := range a {
-			get(&x, i)
-			a[i] = check.initVar(lhs[i], &x, returnPos.IsValid())
-		}
-		check.recordCommaOkTypes(rhs[0], a)
-		return
-	}
-
-	for i, lhs := range lhs {
-		get(&x, i)
-		check.initVar(lhs, &x, returnPos.IsValid())
-	}
-}
-
-func (check *Checker) assignVars(lhs, rhs []ast.Expr) {
-	l := len(lhs)
-	get, r, commaOk := unpack(func(x *operand, i int) { check.expr(x, rhs[i]) }, len(rhs), l == 2)
-	if get == nil {
-		return // error reported by unpack
-	}
-	if l != r {
-		check.useGetter(get, r)
-		check.errorf(rhs[0].Pos(), "assignment count mismatch (%d vs %d)", l, r)
-		return
-	}
-
-	var x operand
-	if commaOk {
-		var a [2]Type
-		for i := range a {
-			get(&x, i)
-			a[i] = check.assignVar(lhs[i], &x)
-		}
-		check.recordCommaOkTypes(rhs[0], a)
-		return
-	}
-
-	for i, lhs := range lhs {
-		get(&x, i)
-		check.assignVar(lhs, &x)
-	}
-}
-
-func (check *Checker) shortVarDecl(pos token.Pos, lhs, rhs []ast.Expr) {
-	scope := check.scope
-
-	// collect lhs variables
-	var newVars []*Var
-	var lhsVars = make([]*Var, len(lhs))
-	for i, lhs := range lhs {
-		var obj *Var
-		if ident, _ := lhs.(*ast.Ident); ident != nil {
-			// Use the correct obj if the ident is redeclared. The
-			// variable's scope starts after the declaration; so we
-			// must use Scope.Lookup here and call Scope.Insert
-			// (via check.declare) later.
-			name := ident.Name
-			if alt := scope.Lookup(name); alt != nil {
-				// redeclared object must be a variable
-				if alt, _ := alt.(*Var); alt != nil {
-					obj = alt
-				} else {
-					check.errorf(lhs.Pos(), "cannot assign to %s", lhs)
-				}
-				check.recordUse(ident, alt)
-			} else {
-				// declare new variable, possibly a blank (_) variable
-				obj = NewVar(ident.Pos(), check.pkg, name, nil)
-				if name != "_" {
-					newVars = append(newVars, obj)
-				}
-				check.recordDef(ident, obj)
-			}
-		} else {
-			check.errorf(lhs.Pos(), "cannot declare %s", lhs)
-		}
-		if obj == nil {
-			obj = NewVar(lhs.Pos(), check.pkg, "_", nil) // dummy variable
-		}
-		lhsVars[i] = obj
-	}
-
-	check.initVars(lhsVars, rhs, token.NoPos)
-
-	// declare new variables
-	if len(newVars) > 0 {
-		// spec: "The scope of a constant or variable identifier declared inside
-		// a function begins at the end of the ConstSpec or VarSpec (ShortVarDecl
-		// for short variable declarations) and ends at the end of the innermost
-		// containing block."
-		scopePos := rhs[len(rhs)-1].End()
-		for _, obj := range newVars {
-			check.declare(scope, nil, obj, scopePos) // recordObject already called
-		}
-	} else {
-		check.softErrorf(pos, "no new variables on left side of :=")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/builtins.go b/third_party/gofrontend/libgo/go/go/types/builtins.go
deleted file mode 100644
index 4729591..0000000
--- a/third_party/gofrontend/libgo/go/go/types/builtins.go
+++ /dev/null
@@ -1,627 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements typechecking of builtin function calls.
-
-package types
-
-import (
-	"go/ast"
-	"go/constant"
-	"go/token"
-)
-
-// builtin type-checks a call to the built-in specified by id and
-// returns true if the call is valid, with *x holding the result;
-// but x.expr is not set. If the call is invalid, the result is
-// false, and *x is undefined.
-//
-func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ bool) {
-	// append is the only built-in that permits the use of ... for the last argument
-	bin := predeclaredFuncs[id]
-	if call.Ellipsis.IsValid() && id != _Append {
-		check.invalidOp(call.Ellipsis, "invalid use of ... with built-in %s", bin.name)
-		check.use(call.Args...)
-		return
-	}
-
-	// For len(x) and cap(x) we need to know if x contains any function calls or
-	// receive operations. Save/restore current setting and set hasCallOrRecv to
-	// false for the evaluation of x so that we can check it afterwards.
-	// Note: We must do this _before_ calling unpack because unpack evaluates the
-	//       first argument before we even call arg(x, 0)!
-	if id == _Len || id == _Cap {
-		defer func(b bool) {
-			check.hasCallOrRecv = b
-		}(check.hasCallOrRecv)
-		check.hasCallOrRecv = false
-	}
-
-	// determine actual arguments
-	var arg getter
-	nargs := len(call.Args)
-	switch id {
-	default:
-		// make argument getter
-		arg, nargs, _ = unpack(func(x *operand, i int) { check.expr(x, call.Args[i]) }, nargs, false)
-		if arg == nil {
-			return
-		}
-		// evaluate first argument, if present
-		if nargs > 0 {
-			arg(x, 0)
-			if x.mode == invalid {
-				return
-			}
-		}
-	case _Make, _New, _Offsetof, _Trace:
-		// arguments require special handling
-	}
-
-	// check argument count
-	{
-		msg := ""
-		if nargs < bin.nargs {
-			msg = "not enough"
-		} else if !bin.variadic && nargs > bin.nargs {
-			msg = "too many"
-		}
-		if msg != "" {
-			check.invalidOp(call.Rparen, "%s arguments for %s (expected %d, found %d)", msg, call, bin.nargs, nargs)
-			return
-		}
-	}
-
-	switch id {
-	case _Append:
-		// append(s S, x ...T) S, where T is the element type of S
-		// spec: "The variadic function append appends zero or more values x to s of type
-		// S, which must be a slice type, and returns the resulting slice, also of type S.
-		// The values x are passed to a parameter of type ...T where T is the element type
-		// of S and the respective parameter passing rules apply."
-		S := x.typ
-		var T Type
-		if s, _ := S.Underlying().(*Slice); s != nil {
-			T = s.elem
-		} else {
-			check.invalidArg(x.pos(), "%s is not a slice", x)
-			return
-		}
-
-		// remember arguments that have been evaluated already
-		alist := []operand{*x}
-
-		// spec: "As a special case, append also accepts a first argument assignable
-		// to type []byte with a second argument of string type followed by ... .
-		// This form appends the bytes of the string.
-		if nargs == 2 && call.Ellipsis.IsValid() && x.assignableTo(check.conf, NewSlice(universeByte)) {
-			arg(x, 1)
-			if x.mode == invalid {
-				return
-			}
-			if isString(x.typ) {
-				if check.Types != nil {
-					sig := makeSig(S, S, x.typ)
-					sig.variadic = true
-					check.recordBuiltinType(call.Fun, sig)
-				}
-				x.mode = value
-				x.typ = S
-				break
-			}
-			alist = append(alist, *x)
-			// fallthrough
-		}
-
-		// check general case by creating custom signature
-		sig := makeSig(S, S, NewSlice(T)) // []T required for variadic signature
-		sig.variadic = true
-		check.arguments(x, call, sig, func(x *operand, i int) {
-			// only evaluate arguments that have not been evaluated before
-			if i < len(alist) {
-				*x = alist[i]
-				return
-			}
-			arg(x, i)
-		}, nargs)
-		// ok to continue even if check.arguments reported errors
-
-		x.mode = value
-		x.typ = S
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, sig)
-		}
-
-	case _Cap, _Len:
-		// cap(x)
-		// len(x)
-		mode := invalid
-		var typ Type
-		var val constant.Value
-		switch typ = implicitArrayDeref(x.typ.Underlying()); t := typ.(type) {
-		case *Basic:
-			if isString(t) && id == _Len {
-				if x.mode == constant_ {
-					mode = constant_
-					val = constant.MakeInt64(int64(len(constant.StringVal(x.val))))
-				} else {
-					mode = value
-				}
-			}
-
-		case *Array:
-			mode = value
-			// spec: "The expressions len(s) and cap(s) are constants
-			// if the type of s is an array or pointer to an array and
-			// the expression s does not contain channel receives or
-			// function calls; in this case s is not evaluated."
-			if !check.hasCallOrRecv {
-				mode = constant_
-				val = constant.MakeInt64(t.len)
-			}
-
-		case *Slice, *Chan:
-			mode = value
-
-		case *Map:
-			if id == _Len {
-				mode = value
-			}
-		}
-
-		if mode == invalid {
-			check.invalidArg(x.pos(), "%s for %s", x, bin.name)
-			return
-		}
-
-		x.mode = mode
-		x.typ = Typ[Int]
-		x.val = val
-		if check.Types != nil && mode != constant_ {
-			check.recordBuiltinType(call.Fun, makeSig(x.typ, typ))
-		}
-
-	case _Close:
-		// close(c)
-		c, _ := x.typ.Underlying().(*Chan)
-		if c == nil {
-			check.invalidArg(x.pos(), "%s is not a channel", x)
-			return
-		}
-		if c.dir == RecvOnly {
-			check.invalidArg(x.pos(), "%s must not be a receive-only channel", x)
-			return
-		}
-
-		x.mode = novalue
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(nil, c))
-		}
-
-	case _Complex:
-		// complex(x, y realT) complexT
-		if !check.complexArg(x) {
-			return
-		}
-
-		var y operand
-		arg(&y, 1)
-		if y.mode == invalid {
-			return
-		}
-		if !check.complexArg(&y) {
-			return
-		}
-
-		check.convertUntyped(x, y.typ)
-		if x.mode == invalid {
-			return
-		}
-		check.convertUntyped(&y, x.typ)
-		if y.mode == invalid {
-			return
-		}
-
-		if !Identical(x.typ, y.typ) {
-			check.invalidArg(x.pos(), "mismatched types %s and %s", x.typ, y.typ)
-			return
-		}
-
-		if x.mode == constant_ && y.mode == constant_ {
-			x.val = constant.BinaryOp(x.val, token.ADD, constant.MakeImag(y.val))
-		} else {
-			x.mode = value
-		}
-
-		realT := x.typ
-		complexT := Typ[Invalid]
-		switch realT.Underlying().(*Basic).kind {
-		case Float32:
-			complexT = Typ[Complex64]
-		case Float64:
-			complexT = Typ[Complex128]
-		case UntypedInt, UntypedRune, UntypedFloat:
-			if x.mode == constant_ {
-				realT = defaultType(realT).(*Basic)
-				complexT = Typ[UntypedComplex]
-			} else {
-				// untyped but not constant; probably because one
-				// operand is a non-constant shift of untyped lhs
-				realT = Typ[Float64]
-				complexT = Typ[Complex128]
-			}
-		default:
-			check.invalidArg(x.pos(), "float32 or float64 arguments expected")
-			return
-		}
-
-		x.typ = complexT
-		if check.Types != nil && x.mode != constant_ {
-			check.recordBuiltinType(call.Fun, makeSig(complexT, realT, realT))
-		}
-
-		if x.mode != constant_ {
-			// The arguments have now their final types, which at run-
-			// time will be materialized. Update the expression trees.
-			// If the current types are untyped, the materialized type
-			// is the respective default type.
-			// (If the result is constant, the arguments are never
-			// materialized and there is nothing to do.)
-			check.updateExprType(x.expr, realT, true)
-			check.updateExprType(y.expr, realT, true)
-		}
-
-	case _Copy:
-		// copy(x, y []T) int
-		var dst Type
-		if t, _ := x.typ.Underlying().(*Slice); t != nil {
-			dst = t.elem
-		}
-
-		var y operand
-		arg(&y, 1)
-		if y.mode == invalid {
-			return
-		}
-		var src Type
-		switch t := y.typ.Underlying().(type) {
-		case *Basic:
-			if isString(y.typ) {
-				src = universeByte
-			}
-		case *Slice:
-			src = t.elem
-		}
-
-		if dst == nil || src == nil {
-			check.invalidArg(x.pos(), "copy expects slice arguments; found %s and %s", x, &y)
-			return
-		}
-
-		if !Identical(dst, src) {
-			check.invalidArg(x.pos(), "arguments to copy %s and %s have different element types %s and %s", x, &y, dst, src)
-			return
-		}
-
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(Typ[Int], x.typ, y.typ))
-		}
-		x.mode = value
-		x.typ = Typ[Int]
-
-	case _Delete:
-		// delete(m, k)
-		m, _ := x.typ.Underlying().(*Map)
-		if m == nil {
-			check.invalidArg(x.pos(), "%s is not a map", x)
-			return
-		}
-		arg(x, 1) // k
-		if x.mode == invalid {
-			return
-		}
-
-		if !x.assignableTo(check.conf, m.key) {
-			check.invalidArg(x.pos(), "%s is not assignable to %s", x, m.key)
-			return
-		}
-
-		x.mode = novalue
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(nil, m, m.key))
-		}
-
-	case _Imag, _Real:
-		// imag(complexT) realT
-		// real(complexT) realT
-		if !isComplex(x.typ) {
-			check.invalidArg(x.pos(), "%s must be a complex number", x)
-			return
-		}
-		if x.mode == constant_ {
-			if id == _Real {
-				x.val = constant.Real(x.val)
-			} else {
-				x.val = constant.Imag(x.val)
-			}
-		} else {
-			x.mode = value
-		}
-		var k BasicKind
-		switch x.typ.Underlying().(*Basic).kind {
-		case Complex64:
-			k = Float32
-		case Complex128:
-			k = Float64
-		case UntypedComplex:
-			k = UntypedFloat
-		default:
-			unreachable()
-		}
-
-		if check.Types != nil && x.mode != constant_ {
-			check.recordBuiltinType(call.Fun, makeSig(Typ[k], x.typ))
-		}
-		x.typ = Typ[k]
-
-	case _Make:
-		// make(T, n)
-		// make(T, n, m)
-		// (no argument evaluated yet)
-		arg0 := call.Args[0]
-		T := check.typ(arg0)
-		if T == Typ[Invalid] {
-			return
-		}
-
-		var min int // minimum number of arguments
-		switch T.Underlying().(type) {
-		case *Slice:
-			min = 2
-		case *Map, *Chan:
-			min = 1
-		default:
-			check.invalidArg(arg0.Pos(), "cannot make %s; type must be slice, map, or channel", arg0)
-			return
-		}
-		if nargs < min || min+1 < nargs {
-			check.errorf(call.Pos(), "%s expects %d or %d arguments; found %d", call, min, min+1, nargs)
-			return
-		}
-		var sizes []int64 // constant integer arguments, if any
-		for _, arg := range call.Args[1:] {
-			if s, ok := check.index(arg, -1); ok && s >= 0 {
-				sizes = append(sizes, s)
-			}
-		}
-		if len(sizes) == 2 && sizes[0] > sizes[1] {
-			check.invalidArg(call.Args[1].Pos(), "length and capacity swapped")
-			// safe to continue
-		}
-		x.mode = value
-		x.typ = T
-		if check.Types != nil {
-			params := [...]Type{T, Typ[Int], Typ[Int]}
-			check.recordBuiltinType(call.Fun, makeSig(x.typ, params[:1+len(sizes)]...))
-		}
-
-	case _New:
-		// new(T)
-		// (no argument evaluated yet)
-		T := check.typ(call.Args[0])
-		if T == Typ[Invalid] {
-			return
-		}
-
-		x.mode = value
-		x.typ = &Pointer{base: T}
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(x.typ, T))
-		}
-
-	case _Panic:
-		// panic(x)
-		T := new(Interface)
-		if !check.assignment(x, T) {
-			assert(x.mode == invalid)
-			return
-		}
-
-		x.mode = novalue
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(nil, T))
-		}
-
-	case _Print, _Println:
-		// print(x, y, ...)
-		// println(x, y, ...)
-		var params []Type
-		if nargs > 0 {
-			params = make([]Type, nargs)
-			for i := 0; i < nargs; i++ {
-				if i > 0 {
-					arg(x, i) // first argument already evaluated
-				}
-				if !check.assignment(x, nil) {
-					assert(x.mode == invalid)
-					return
-				}
-				params[i] = x.typ
-			}
-		}
-
-		x.mode = novalue
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(nil, params...))
-		}
-
-	case _Recover:
-		// recover() interface{}
-		x.mode = value
-		x.typ = new(Interface)
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(x.typ))
-		}
-
-	case _Alignof:
-		// unsafe.Alignof(x T) uintptr
-		if !check.assignment(x, nil) {
-			assert(x.mode == invalid)
-			return
-		}
-
-		x.mode = constant_
-		x.val = constant.MakeInt64(check.conf.alignof(x.typ))
-		x.typ = Typ[Uintptr]
-		// result is constant - no need to record signature
-
-	case _Offsetof:
-		// unsafe.Offsetof(x T) uintptr, where x must be a selector
-		// (no argument evaluated yet)
-		arg0 := call.Args[0]
-		selx, _ := unparen(arg0).(*ast.SelectorExpr)
-		if selx == nil {
-			check.invalidArg(arg0.Pos(), "%s is not a selector expression", arg0)
-			check.use(arg0)
-			return
-		}
-
-		check.expr(x, selx.X)
-		if x.mode == invalid {
-			return
-		}
-
-		base := derefStructPtr(x.typ)
-		sel := selx.Sel.Name
-		obj, index, indirect := LookupFieldOrMethod(base, false, check.pkg, sel)
-		switch obj.(type) {
-		case nil:
-			check.invalidArg(x.pos(), "%s has no single field %s", base, sel)
-			return
-		case *Func:
-			// TODO(gri) Using derefStructPtr may result in methods being found
-			// that don't actually exist. An error either way, but the error
-			// message is confusing. See: https://play.golang.org/p/al75v23kUy ,
-			// but go/types reports: "invalid argument: x.m is a method value".
-			check.invalidArg(arg0.Pos(), "%s is a method value", arg0)
-			return
-		}
-		if indirect {
-			check.invalidArg(x.pos(), "field %s is embedded via a pointer in %s", sel, base)
-			return
-		}
-
-		// TODO(gri) Should we pass x.typ instead of base (and indirect report if derefStructPtr indirected)?
-		check.recordSelection(selx, FieldVal, base, obj, index, false)
-
-		offs := check.conf.offsetof(base, index)
-		x.mode = constant_
-		x.val = constant.MakeInt64(offs)
-		x.typ = Typ[Uintptr]
-		// result is constant - no need to record signature
-
-	case _Sizeof:
-		// unsafe.Sizeof(x T) uintptr
-		if !check.assignment(x, nil) {
-			assert(x.mode == invalid)
-			return
-		}
-
-		x.mode = constant_
-		x.val = constant.MakeInt64(check.conf.sizeof(x.typ))
-		x.typ = Typ[Uintptr]
-		// result is constant - no need to record signature
-
-	case _Assert:
-		// assert(pred) causes a typechecker error if pred is false.
-		// The result of assert is the value of pred if there is no error.
-		// Note: assert is only available in self-test mode.
-		if x.mode != constant_ || !isBoolean(x.typ) {
-			check.invalidArg(x.pos(), "%s is not a boolean constant", x)
-			return
-		}
-		if x.val.Kind() != constant.Bool {
-			check.errorf(x.pos(), "internal error: value of %s should be a boolean constant", x)
-			return
-		}
-		if !constant.BoolVal(x.val) {
-			check.errorf(call.Pos(), "%s failed", call)
-			// compile-time assertion failure - safe to continue
-		}
-		// result is constant - no need to record signature
-
-	case _Trace:
-		// trace(x, y, z, ...) dumps the positions, expressions, and
-		// values of its arguments. The result of trace is the value
-		// of the first argument.
-		// Note: trace is only available in self-test mode.
-		// (no argument evaluated yet)
-		if nargs == 0 {
-			check.dump("%s: trace() without arguments", call.Pos())
-			x.mode = novalue
-			break
-		}
-		var t operand
-		x1 := x
-		for _, arg := range call.Args {
-			check.rawExpr(x1, arg, nil) // permit trace for types, e.g.: new(trace(T))
-			check.dump("%s: %s", x1.pos(), x1)
-			x1 = &t // use incoming x only for first argument
-		}
-		// trace is only available in test mode - no need to record signature
-
-	default:
-		unreachable()
-	}
-
-	return true
-}
-
-// makeSig makes a signature for the given argument and result types.
-// Default types are used for untyped arguments, and res may be nil.
-func makeSig(res Type, args ...Type) *Signature {
-	list := make([]*Var, len(args))
-	for i, param := range args {
-		list[i] = NewVar(token.NoPos, nil, "", defaultType(param))
-	}
-	params := NewTuple(list...)
-	var result *Tuple
-	if res != nil {
-		assert(!isUntyped(res))
-		result = NewTuple(NewVar(token.NoPos, nil, "", res))
-	}
-	return &Signature{params: params, results: result}
-}
-
-// implicitArrayDeref returns A if typ is of the form *A and A is an array;
-// otherwise it returns typ.
-//
-func implicitArrayDeref(typ Type) Type {
-	if p, ok := typ.(*Pointer); ok {
-		if a, ok := p.base.Underlying().(*Array); ok {
-			return a
-		}
-	}
-	return typ
-}
-
-// unparen returns e with any enclosing parentheses stripped.
-func unparen(e ast.Expr) ast.Expr {
-	for {
-		p, ok := e.(*ast.ParenExpr)
-		if !ok {
-			return e
-		}
-		e = p.X
-	}
-}
-
-func (check *Checker) complexArg(x *operand) bool {
-	t, _ := x.typ.Underlying().(*Basic)
-	if t != nil && (t.info&IsFloat != 0 || t.kind == UntypedInt || t.kind == UntypedRune) {
-		return true
-	}
-	check.invalidArg(x.pos(), "%s must be a float32, float64, or an untyped non-complex numeric constant", x)
-	return false
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/builtins_test.go b/third_party/gofrontend/libgo/go/go/types/builtins_test.go
deleted file mode 100644
index 9835a48..0000000
--- a/third_party/gofrontend/libgo/go/go/types/builtins_test.go
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"fmt"
-	"go/ast"
-	"go/importer"
-	"go/parser"
-	"testing"
-
-	. "go/types"
-)
-
-var builtinCalls = []struct {
-	name, src, sig string
-}{
-	{"append", `var s []int; _ = append(s)`, `func([]int, ...int) []int`},
-	{"append", `var s []int; _ = append(s, 0)`, `func([]int, ...int) []int`},
-	{"append", `var s []int; _ = (append)(s, 0)`, `func([]int, ...int) []int`},
-	{"append", `var s []byte; _ = ((append))(s, 0)`, `func([]byte, ...byte) []byte`},
-	{"append", `var s []byte; _ = append(s, "foo"...)`, `func([]byte, string...) []byte`},
-	{"append", `type T []byte; var s T; var str string; _ = append(s, str...)`, `func(p.T, string...) p.T`},
-	{"append", `type T []byte; type U string; var s T; var str U; _ = append(s, str...)`, `func(p.T, p.U...) p.T`},
-
-	{"cap", `var s [10]int; _ = cap(s)`, `invalid type`},  // constant
-	{"cap", `var s [10]int; _ = cap(&s)`, `invalid type`}, // constant
-	{"cap", `var s []int64; _ = cap(s)`, `func([]int64) int`},
-	{"cap", `var c chan<-bool; _ = cap(c)`, `func(chan<- bool) int`},
-
-	{"len", `_ = len("foo")`, `invalid type`}, // constant
-	{"len", `var s string; _ = len(s)`, `func(string) int`},
-	{"len", `var s [10]int; _ = len(s)`, `invalid type`},  // constant
-	{"len", `var s [10]int; _ = len(&s)`, `invalid type`}, // constant
-	{"len", `var s []int64; _ = len(s)`, `func([]int64) int`},
-	{"len", `var c chan<-bool; _ = len(c)`, `func(chan<- bool) int`},
-	{"len", `var m map[string]float32; _ = len(m)`, `func(map[string]float32) int`},
-
-	{"close", `var c chan int; close(c)`, `func(chan int)`},
-	{"close", `var c chan<- chan string; close(c)`, `func(chan<- chan string)`},
-
-	{"complex", `_ = complex(1, 0)`, `invalid type`}, // constant
-	{"complex", `var re float32; _ = complex(re, 1.0)`, `func(float32, float32) complex64`},
-	{"complex", `var im float64; _ = complex(1, im)`, `func(float64, float64) complex128`},
-	{"complex", `type F32 float32; var re, im F32; _ = complex(re, im)`, `func(p.F32, p.F32) complex64`},
-	{"complex", `type F64 float64; var re, im F64; _ = complex(re, im)`, `func(p.F64, p.F64) complex128`},
-
-	{"copy", `var src, dst []byte; copy(dst, src)`, `func([]byte, []byte) int`},
-	{"copy", `type T [][]int; var src, dst T; _ = copy(dst, src)`, `func(p.T, p.T) int`},
-	{"copy", `var src string; var dst []byte; copy(dst, src)`, `func([]byte, string) int`},
-	{"copy", `type T string; type U []byte; var src T; var dst U; copy(dst, src)`, `func(p.U, p.T) int`},
-	{"copy", `var dst []byte; copy(dst, "hello")`, `func([]byte, string) int`},
-
-	{"delete", `var m map[string]bool; delete(m, "foo")`, `func(map[string]bool, string)`},
-	{"delete", `type (K string; V int); var m map[K]V; delete(m, "foo")`, `func(map[p.K]p.V, p.K)`},
-
-	{"imag", `_ = imag(1i)`, `invalid type`}, // constant
-	{"imag", `var c complex64; _ = imag(c)`, `func(complex64) float32`},
-	{"imag", `var c complex128; _ = imag(c)`, `func(complex128) float64`},
-	{"imag", `type C64 complex64; var c C64; _ = imag(c)`, `func(p.C64) float32`},
-	{"imag", `type C128 complex128; var c C128; _ = imag(c)`, `func(p.C128) float64`},
-
-	{"real", `_ = real(1i)`, `invalid type`}, // constant
-	{"real", `var c complex64; _ = real(c)`, `func(complex64) float32`},
-	{"real", `var c complex128; _ = real(c)`, `func(complex128) float64`},
-	{"real", `type C64 complex64; var c C64; _ = real(c)`, `func(p.C64) float32`},
-	{"real", `type C128 complex128; var c C128; _ = real(c)`, `func(p.C128) float64`},
-
-	{"make", `_ = make([]int, 10)`, `func([]int, int) []int`},
-	{"make", `type T []byte; _ = make(T, 10, 20)`, `func(p.T, int, int) p.T`},
-
-	{"new", `_ = new(int)`, `func(int) *int`},
-	{"new", `type T struct{}; _ = new(T)`, `func(p.T) *p.T`},
-
-	{"panic", `panic(0)`, `func(interface{})`},
-	{"panic", `panic("foo")`, `func(interface{})`},
-
-	{"print", `print()`, `func()`},
-	{"print", `print(0)`, `func(int)`},
-	{"print", `print(1, 2.0, "foo", true)`, `func(int, float64, string, bool)`},
-
-	{"println", `println()`, `func()`},
-	{"println", `println(0)`, `func(int)`},
-	{"println", `println(1, 2.0, "foo", true)`, `func(int, float64, string, bool)`},
-
-	{"recover", `recover()`, `func() interface{}`},
-	{"recover", `_ = recover()`, `func() interface{}`},
-
-	{"Alignof", `_ = unsafe.Alignof(0)`, `invalid type`},                 // constant
-	{"Alignof", `var x struct{}; _ = unsafe.Alignof(x)`, `invalid type`}, // constant
-
-	{"Offsetof", `var x struct{f bool}; _ = unsafe.Offsetof(x.f)`, `invalid type`},           // constant
-	{"Offsetof", `var x struct{_ int; f bool}; _ = unsafe.Offsetof((&x).f)`, `invalid type`}, // constant
-
-	{"Sizeof", `_ = unsafe.Sizeof(0)`, `invalid type`},                 // constant
-	{"Sizeof", `var x struct{}; _ = unsafe.Sizeof(x)`, `invalid type`}, // constant
-
-	{"assert", `assert(true)`, `invalid type`},                                    // constant
-	{"assert", `type B bool; const pred B = 1 < 2; assert(pred)`, `invalid type`}, // constant
-
-	// no tests for trace since it produces output as a side-effect
-}
-
-func TestBuiltinSignatures(t *testing.T) {
-	DefPredeclaredTestFuncs()
-
-	seen := map[string]bool{"trace": true} // no test for trace built-in; add it manually
-	for _, call := range builtinCalls {
-		testBuiltinSignature(t, call.name, call.src, call.sig)
-		seen[call.name] = true
-	}
-
-	// make sure we didn't miss one
-	for _, name := range Universe.Names() {
-		if _, ok := Universe.Lookup(name).(*Builtin); ok && !seen[name] {
-			t.Errorf("missing test for %s", name)
-		}
-	}
-	for _, name := range Unsafe.Scope().Names() {
-		if _, ok := Unsafe.Scope().Lookup(name).(*Builtin); ok && !seen[name] {
-			t.Errorf("missing test for unsafe.%s", name)
-		}
-	}
-}
-
-func testBuiltinSignature(t *testing.T, name, src0, want string) {
-	src := fmt.Sprintf(`package p; import "unsafe"; type _ unsafe.Pointer /* use unsafe */; func _() { %s }`, src0)
-	f, err := parser.ParseFile(fset, "", src, 0)
-	if err != nil {
-		t.Errorf("%s: %s", src0, err)
-		return
-	}
-
-	conf := Config{Importer: importer.Default()}
-	uses := make(map[*ast.Ident]Object)
-	types := make(map[ast.Expr]TypeAndValue)
-	_, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Uses: uses, Types: types})
-	if err != nil {
-		t.Errorf("%s: %s", src0, err)
-		return
-	}
-
-	// find called function
-	n := 0
-	var fun ast.Expr
-	for x := range types {
-		if call, _ := x.(*ast.CallExpr); call != nil {
-			fun = call.Fun
-			n++
-		}
-	}
-	if n != 1 {
-		t.Errorf("%s: got %d CallExprs; want 1", src0, n)
-		return
-	}
-
-	// check recorded types for fun and descendents (may be parenthesized)
-	for {
-		// the recorded type for the built-in must match the wanted signature
-		typ := types[fun].Type
-		if typ == nil {
-			t.Errorf("%s: no type recorded for %s", src0, ExprString(fun))
-			return
-		}
-		if got := typ.String(); got != want {
-			t.Errorf("%s: got type %s; want %s", src0, got, want)
-			return
-		}
-
-		// called function must be a (possibly parenthesized, qualified)
-		// identifier denoting the expected built-in
-		switch p := fun.(type) {
-		case *ast.Ident:
-			obj := uses[p]
-			if obj == nil {
-				t.Errorf("%s: no object found for %s", src0, p)
-				return
-			}
-			bin, _ := obj.(*Builtin)
-			if bin == nil {
-				t.Errorf("%s: %s does not denote a built-in", src0, p)
-				return
-			}
-			if bin.Name() != name {
-				t.Errorf("%s: got built-in %s; want %s", src0, bin.Name(), name)
-				return
-			}
-			return // we're done
-
-		case *ast.ParenExpr:
-			fun = p.X // unpack
-
-		case *ast.SelectorExpr:
-			// built-in from package unsafe - ignore details
-			return // we're done
-
-		default:
-			t.Errorf("%s: invalid function call", src0)
-			return
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/call.go b/third_party/gofrontend/libgo/go/go/types/call.go
deleted file mode 100644
index 62cefc0..0000000
--- a/third_party/gofrontend/libgo/go/go/types/call.go
+++ /dev/null
@@ -1,441 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements typechecking of call and selector expressions.
-
-package types
-
-import (
-	"go/ast"
-	"go/token"
-)
-
-func (check *Checker) call(x *operand, e *ast.CallExpr) exprKind {
-	check.exprOrType(x, e.Fun)
-
-	switch x.mode {
-	case invalid:
-		check.use(e.Args...)
-		x.mode = invalid
-		x.expr = e
-		return statement
-
-	case typexpr:
-		// conversion
-		T := x.typ
-		x.mode = invalid
-		switch n := len(e.Args); n {
-		case 0:
-			check.errorf(e.Rparen, "missing argument in conversion to %s", T)
-		case 1:
-			check.expr(x, e.Args[0])
-			if x.mode != invalid {
-				check.conversion(x, T)
-			}
-		default:
-			check.errorf(e.Args[n-1].Pos(), "too many arguments in conversion to %s", T)
-		}
-		x.expr = e
-		return conversion
-
-	case builtin:
-		id := x.id
-		if !check.builtin(x, e, id) {
-			x.mode = invalid
-		}
-		x.expr = e
-		// a non-constant result implies a function call
-		if x.mode != invalid && x.mode != constant_ {
-			check.hasCallOrRecv = true
-		}
-		return predeclaredFuncs[id].kind
-
-	default:
-		// function/method call
-		sig, _ := x.typ.Underlying().(*Signature)
-		if sig == nil {
-			check.invalidOp(x.pos(), "cannot call non-function %s", x)
-			x.mode = invalid
-			x.expr = e
-			return statement
-		}
-
-		arg, n, _ := unpack(func(x *operand, i int) { check.expr(x, e.Args[i]) }, len(e.Args), false)
-		if arg == nil {
-			x.mode = invalid
-			x.expr = e
-			return statement
-		}
-
-		check.arguments(x, e, sig, arg, n)
-
-		// determine result
-		switch sig.results.Len() {
-		case 0:
-			x.mode = novalue
-		case 1:
-			x.mode = value
-			x.typ = sig.results.vars[0].typ // unpack tuple
-		default:
-			x.mode = value
-			x.typ = sig.results
-		}
-		x.expr = e
-		check.hasCallOrRecv = true
-
-		return statement
-	}
-}
-
-// use type-checks each argument.
-// Useful to make sure expressions are evaluated
-// (and variables are "used") in the presence of other errors.
-func (check *Checker) use(arg ...ast.Expr) {
-	var x operand
-	for _, e := range arg {
-		check.rawExpr(&x, e, nil)
-	}
-}
-
-// useGetter is like use, but takes a getter instead of a list of expressions.
-// It should be called instead of use if a getter is present to avoid repeated
-// evaluation of the first argument (since the getter was likely obtained via
-// unpack, which may have evaluated the first argument already).
-func (check *Checker) useGetter(get getter, n int) {
-	var x operand
-	for i := 0; i < n; i++ {
-		get(&x, i)
-	}
-}
-
-// A getter sets x as the i'th operand, where 0 <= i < n and n is the total
-// number of operands (context-specific, and maintained elsewhere). A getter
-// type-checks the i'th operand; the details of the actual check are getter-
-// specific.
-type getter func(x *operand, i int)
-
-// unpack takes a getter get and a number of operands n. If n == 1, unpack
-// calls the incoming getter for the first operand. If that operand is
-// invalid, unpack returns (nil, 0, false). Otherwise, if that operand is a
-// function call, or a comma-ok expression and allowCommaOk is set, the result
-// is a new getter and operand count providing access to the function results,
-// or comma-ok values, respectively. The third result value reports if it
-// is indeed the comma-ok case. In all other cases, the incoming getter and
-// operand count are returned unchanged, and the third result value is false.
-//
-// In other words, if there's exactly one operand that - after type-checking
-// by calling get - stands for multiple operands, the resulting getter provides
-// access to those operands instead.
-//
-// If the returned getter is called at most once for a given operand index i
-// (including i == 0), that operand is guaranteed to cause only one call of
-// the incoming getter with that i.
-//
-func unpack(get getter, n int, allowCommaOk bool) (getter, int, bool) {
-	if n == 1 {
-		// possibly result of an n-valued function call or comma,ok value
-		var x0 operand
-		get(&x0, 0)
-		if x0.mode == invalid {
-			return nil, 0, false
-		}
-
-		if t, ok := x0.typ.(*Tuple); ok {
-			// result of an n-valued function call
-			return func(x *operand, i int) {
-				x.mode = value
-				x.expr = x0.expr
-				x.typ = t.At(i).typ
-			}, t.Len(), false
-		}
-
-		if x0.mode == mapindex || x0.mode == commaok {
-			// comma-ok value
-			if allowCommaOk {
-				a := [2]Type{x0.typ, Typ[UntypedBool]}
-				return func(x *operand, i int) {
-					x.mode = value
-					x.expr = x0.expr
-					x.typ = a[i]
-				}, 2, true
-			}
-			x0.mode = value
-		}
-
-		// single value
-		return func(x *operand, i int) {
-			if i != 0 {
-				unreachable()
-			}
-			*x = x0
-		}, 1, false
-	}
-
-	// zero or multiple values
-	return get, n, false
-}
-
-// arguments checks argument passing for the call with the given signature.
-// The arg function provides the operand for the i'th argument.
-func (check *Checker) arguments(x *operand, call *ast.CallExpr, sig *Signature, arg getter, n int) {
-	if call.Ellipsis.IsValid() {
-		// last argument is of the form x...
-		if len(call.Args) == 1 && n > 1 {
-			// f()... is not permitted if f() is multi-valued
-			check.errorf(call.Ellipsis, "cannot use ... with %d-valued expression %s", n, call.Args[0])
-			check.useGetter(arg, n)
-			return
-		}
-		if !sig.variadic {
-			check.errorf(call.Ellipsis, "cannot use ... in call to non-variadic %s", call.Fun)
-			check.useGetter(arg, n)
-			return
-		}
-	}
-
-	// evaluate arguments
-	for i := 0; i < n; i++ {
-		arg(x, i)
-		if x.mode != invalid {
-			var ellipsis token.Pos
-			if i == n-1 && call.Ellipsis.IsValid() {
-				ellipsis = call.Ellipsis
-			}
-			check.argument(sig, i, x, ellipsis)
-		}
-	}
-
-	// check argument count
-	if sig.variadic {
-		// a variadic function accepts an "empty"
-		// last argument: count one extra
-		n++
-	}
-	if n < sig.params.Len() {
-		check.errorf(call.Rparen, "too few arguments in call to %s", call.Fun)
-		// ok to continue
-	}
-}
-
-// argument checks passing of argument x to the i'th parameter of the given signature.
-// If ellipsis is valid, the argument is followed by ... at that position in the call.
-func (check *Checker) argument(sig *Signature, i int, x *operand, ellipsis token.Pos) {
-	n := sig.params.Len()
-
-	// determine parameter type
-	var typ Type
-	switch {
-	case i < n:
-		typ = sig.params.vars[i].typ
-	case sig.variadic:
-		typ = sig.params.vars[n-1].typ
-		if debug {
-			if _, ok := typ.(*Slice); !ok {
-				check.dump("%s: expected unnamed slice type, got %s", sig.params.vars[n-1].Pos(), typ)
-			}
-		}
-	default:
-		check.errorf(x.pos(), "too many arguments")
-		return
-	}
-
-	if ellipsis.IsValid() {
-		// argument is of the form x...
-		if i != n-1 {
-			check.errorf(ellipsis, "can only use ... with matching parameter")
-			return
-		}
-		switch t := x.typ.Underlying().(type) {
-		case *Slice:
-			// ok
-		case *Tuple:
-			check.errorf(ellipsis, "cannot use ... with %d-valued expression %s", t.Len(), x)
-			return
-		default:
-			check.errorf(x.pos(), "cannot use %s as parameter of type %s", x, typ)
-			return
-		}
-	} else if sig.variadic && i >= n-1 {
-		// use the variadic parameter slice's element type
-		typ = typ.(*Slice).elem
-	}
-
-	if !check.assignment(x, typ) && x.mode != invalid {
-		check.errorf(x.pos(), "cannot pass argument %s to parameter of type %s", x, typ)
-	}
-}
-
-func (check *Checker) selector(x *operand, e *ast.SelectorExpr) {
-	// these must be declared before the "goto Error" statements
-	var (
-		obj      Object
-		index    []int
-		indirect bool
-	)
-
-	sel := e.Sel.Name
-	// If the identifier refers to a package, handle everything here
-	// so we don't need a "package" mode for operands: package names
-	// can only appear in qualified identifiers which are mapped to
-	// selector expressions.
-	if ident, ok := e.X.(*ast.Ident); ok {
-		_, obj := check.scope.LookupParent(ident.Name, check.pos)
-		if pkg, _ := obj.(*PkgName); pkg != nil {
-			assert(pkg.pkg == check.pkg)
-			check.recordUse(ident, pkg)
-			pkg.used = true
-			exp := pkg.imported.scope.Lookup(sel)
-			if exp == nil {
-				if !pkg.imported.fake {
-					check.errorf(e.Pos(), "%s not declared by package %s", sel, ident)
-				}
-				goto Error
-			}
-			if !exp.Exported() {
-				check.errorf(e.Pos(), "%s not exported by package %s", sel, ident)
-				// ok to continue
-			}
-			check.recordUse(e.Sel, exp)
-			// Simplified version of the code for *ast.Idents:
-			// - imported objects are always fully initialized
-			switch exp := exp.(type) {
-			case *Const:
-				assert(exp.Val() != nil)
-				x.mode = constant_
-				x.typ = exp.typ
-				x.val = exp.val
-			case *TypeName:
-				x.mode = typexpr
-				x.typ = exp.typ
-			case *Var:
-				x.mode = variable
-				x.typ = exp.typ
-			case *Func:
-				x.mode = value
-				x.typ = exp.typ
-			case *Builtin:
-				x.mode = builtin
-				x.typ = exp.typ
-				x.id = exp.id
-			default:
-				unreachable()
-			}
-			x.expr = e
-			return
-		}
-	}
-
-	check.exprOrType(x, e.X)
-	if x.mode == invalid {
-		goto Error
-	}
-
-	obj, index, indirect = LookupFieldOrMethod(x.typ, x.mode == variable, check.pkg, sel)
-	if obj == nil {
-		switch {
-		case index != nil:
-			// TODO(gri) should provide actual type where the conflict happens
-			check.invalidOp(e.Pos(), "ambiguous selector %s", sel)
-		case indirect:
-			check.invalidOp(e.Pos(), "%s is not in method set of %s", sel, x.typ)
-		default:
-			check.invalidOp(e.Pos(), "%s has no field or method %s", x, sel)
-		}
-		goto Error
-	}
-
-	if x.mode == typexpr {
-		// method expression
-		m, _ := obj.(*Func)
-		if m == nil {
-			check.invalidOp(e.Pos(), "%s has no method %s", x, sel)
-			goto Error
-		}
-
-		check.recordSelection(e, MethodExpr, x.typ, m, index, indirect)
-
-		// the receiver type becomes the type of the first function
-		// argument of the method expression's function type
-		var params []*Var
-		sig := m.typ.(*Signature)
-		if sig.params != nil {
-			params = sig.params.vars
-		}
-		x.mode = value
-		x.typ = &Signature{
-			params:   NewTuple(append([]*Var{NewVar(token.NoPos, check.pkg, "", x.typ)}, params...)...),
-			results:  sig.results,
-			variadic: sig.variadic,
-		}
-
-		check.addDeclDep(m)
-
-	} else {
-		// regular selector
-		switch obj := obj.(type) {
-		case *Var:
-			check.recordSelection(e, FieldVal, x.typ, obj, index, indirect)
-			if x.mode == variable || indirect {
-				x.mode = variable
-			} else {
-				x.mode = value
-			}
-			x.typ = obj.typ
-
-		case *Func:
-			// TODO(gri) If we needed to take into account the receiver's
-			// addressability, should we report the type &(x.typ) instead?
-			check.recordSelection(e, MethodVal, x.typ, obj, index, indirect)
-
-			if debug {
-				// Verify that LookupFieldOrMethod and MethodSet.Lookup agree.
-				typ := x.typ
-				if x.mode == variable {
-					// If typ is not an (unnamed) pointer or an interface,
-					// use *typ instead, because the method set of *typ
-					// includes the methods of typ.
-					// Variables are addressable, so we can always take their
-					// address.
-					if _, ok := typ.(*Pointer); !ok && !IsInterface(typ) {
-						typ = &Pointer{base: typ}
-					}
-				}
-				// If we created a synthetic pointer type above, we will throw
-				// away the method set computed here after use.
-				// TODO(gri) Method set computation should probably always compute
-				// both, the value and the pointer receiver method set and represent
-				// them in a single structure.
-				// TODO(gri) Consider also using a method set cache for the lifetime
-				// of checker once we rely on MethodSet lookup instead of individual
-				// lookup.
-				mset := NewMethodSet(typ)
-				if m := mset.Lookup(check.pkg, sel); m == nil || m.obj != obj {
-					check.dump("%s: (%s).%v -> %s", e.Pos(), typ, obj.name, m)
-					check.dump("%s\n", mset)
-					panic("method sets and lookup don't agree")
-				}
-			}
-
-			x.mode = value
-
-			// remove receiver
-			sig := *obj.typ.(*Signature)
-			sig.recv = nil
-			x.typ = &sig
-
-			check.addDeclDep(obj)
-
-		default:
-			unreachable()
-		}
-	}
-
-	// everything went well
-	x.expr = e
-	return
-
-Error:
-	x.mode = invalid
-	x.expr = e
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/check.go b/third_party/gofrontend/libgo/go/go/types/check.go
deleted file mode 100644
index bb0b074..0000000
--- a/third_party/gofrontend/libgo/go/go/types/check.go
+++ /dev/null
@@ -1,358 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements the Check function, which drives type-checking.
-
-package types
-
-import (
-	"go/ast"
-	"go/constant"
-	"go/token"
-)
-
-// debugging/development support
-const (
-	debug = false // leave on during development
-	trace = false // turn on for detailed type resolution traces
-)
-
-// If Strict is set, the type-checker enforces additional
-// rules not specified by the Go 1 spec, but which will
-// catch guaranteed run-time errors if the respective
-// code is executed. In other words, programs passing in
-// Strict mode are Go 1 compliant, but not all Go 1 programs
-// will pass in Strict mode. The additional rules are:
-//
-// - A type assertion x.(T) where T is an interface type
-//   is invalid if any (statically known) method that exists
-//   for both x and T have different signatures.
-//
-const strict = false
-
-// exprInfo stores information about an untyped expression.
-type exprInfo struct {
-	isLhs bool // expression is lhs operand of a shift with delayed type-check
-	mode  operandMode
-	typ   *Basic
-	val   constant.Value // constant value; or nil (if not a constant)
-}
-
-// funcInfo stores the information required for type-checking a function.
-type funcInfo struct {
-	name string    // for debugging/tracing only
-	decl *declInfo // for cycle detection
-	sig  *Signature
-	body *ast.BlockStmt
-}
-
-// A context represents the context within which an object is type-checked.
-type context struct {
-	decl          *declInfo      // package-level declaration whose init expression/function body is checked
-	scope         *Scope         // top-most scope for lookups
-	iota          constant.Value // value of iota in a constant declaration; nil otherwise
-	sig           *Signature     // function signature if inside a function; nil otherwise
-	hasLabel      bool           // set if a function makes use of labels (only ~1% of functions); unused outside functions
-	hasCallOrRecv bool           // set if an expression contains a function call or channel receive operation
-}
-
-// A Checker maintains the state of the type checker.
-// It must be created with NewChecker.
-type Checker struct {
-	// package information
-	// (initialized by NewChecker, valid for the life-time of checker)
-	conf *Config
-	fset *token.FileSet
-	pkg  *Package
-	*Info
-	objMap map[Object]*declInfo // maps package-level object to declaration info
-
-	// information collected during type-checking of a set of package files
-	// (initialized by Files, valid only for the duration of check.Files;
-	// maps and lists are allocated on demand)
-	files            []*ast.File                       // package files
-	unusedDotImports map[*Scope]map[*Package]token.Pos // positions of unused dot-imported packages for each file scope
-
-	firstErr error                 // first error encountered
-	methods  map[string][]*Func    // maps type names to associated methods
-	untyped  map[ast.Expr]exprInfo // map of expressions without final type
-	funcs    []funcInfo            // list of functions to type-check
-	delayed  []func()              // delayed checks requiring fully setup types
-
-	// context within which the current object is type-checked
-	// (valid only for the duration of type-checking a specific object)
-	context
-	pos token.Pos // if valid, identifiers are looked up as if at position pos (used by Eval)
-
-	// debugging
-	indent int // indentation for tracing
-}
-
-// addUnusedImport adds the position of a dot-imported package
-// pkg to the map of dot imports for the given file scope.
-func (check *Checker) addUnusedDotImport(scope *Scope, pkg *Package, pos token.Pos) {
-	mm := check.unusedDotImports
-	if mm == nil {
-		mm = make(map[*Scope]map[*Package]token.Pos)
-		check.unusedDotImports = mm
-	}
-	m := mm[scope]
-	if m == nil {
-		m = make(map[*Package]token.Pos)
-		mm[scope] = m
-	}
-	m[pkg] = pos
-}
-
-// addDeclDep adds the dependency edge (check.decl -> to) if check.decl exists
-func (check *Checker) addDeclDep(to Object) {
-	from := check.decl
-	if from == nil {
-		return // not in a package-level init expression
-	}
-	if _, found := check.objMap[to]; !found {
-		return // to is not a package-level object
-	}
-	from.addDep(to)
-}
-
-func (check *Checker) assocMethod(tname string, meth *Func) {
-	m := check.methods
-	if m == nil {
-		m = make(map[string][]*Func)
-		check.methods = m
-	}
-	m[tname] = append(m[tname], meth)
-}
-
-func (check *Checker) rememberUntyped(e ast.Expr, lhs bool, mode operandMode, typ *Basic, val constant.Value) {
-	m := check.untyped
-	if m == nil {
-		m = make(map[ast.Expr]exprInfo)
-		check.untyped = m
-	}
-	m[e] = exprInfo{lhs, mode, typ, val}
-}
-
-func (check *Checker) later(name string, decl *declInfo, sig *Signature, body *ast.BlockStmt) {
-	check.funcs = append(check.funcs, funcInfo{name, decl, sig, body})
-}
-
-func (check *Checker) delay(f func()) {
-	check.delayed = append(check.delayed, f)
-}
-
-// NewChecker returns a new Checker instance for a given package.
-// Package files may be added incrementally via checker.Files.
-func NewChecker(conf *Config, fset *token.FileSet, pkg *Package, info *Info) *Checker {
-	// make sure we have a configuration
-	if conf == nil {
-		conf = new(Config)
-	}
-
-	// make sure we have an info struct
-	if info == nil {
-		info = new(Info)
-	}
-
-	return &Checker{
-		conf:   conf,
-		fset:   fset,
-		pkg:    pkg,
-		Info:   info,
-		objMap: make(map[Object]*declInfo),
-	}
-}
-
-// initFiles initializes the files-specific portion of checker.
-// The provided files must all belong to the same package.
-func (check *Checker) initFiles(files []*ast.File) {
-	// start with a clean slate (check.Files may be called multiple times)
-	check.files = nil
-	check.unusedDotImports = nil
-
-	check.firstErr = nil
-	check.methods = nil
-	check.untyped = nil
-	check.funcs = nil
-	check.delayed = nil
-
-	// determine package name and collect valid files
-	pkg := check.pkg
-	for _, file := range files {
-		switch name := file.Name.Name; pkg.name {
-		case "":
-			if name != "_" {
-				pkg.name = name
-			} else {
-				check.errorf(file.Name.Pos(), "invalid package name _")
-			}
-			fallthrough
-
-		case name:
-			check.files = append(check.files, file)
-
-		default:
-			check.errorf(file.Package, "package %s; expected %s", name, pkg.name)
-			// ignore this file
-		}
-	}
-}
-
-// A bailout panic is used for early termination.
-type bailout struct{}
-
-func (check *Checker) handleBailout(err *error) {
-	switch p := recover().(type) {
-	case nil, bailout:
-		// normal return or early exit
-		*err = check.firstErr
-	default:
-		// re-panic
-		panic(p)
-	}
-}
-
-// Files checks the provided files as part of the checker's package.
-func (check *Checker) Files(files []*ast.File) (err error) {
-	defer check.handleBailout(&err)
-
-	check.initFiles(files)
-
-	check.collectObjects()
-
-	check.packageObjects(check.resolveOrder())
-
-	check.functionBodies()
-
-	check.initOrder()
-
-	if !check.conf.DisableUnusedImportCheck {
-		check.unusedImports()
-	}
-
-	// perform delayed checks
-	for _, f := range check.delayed {
-		f()
-	}
-
-	check.recordUntyped()
-
-	check.pkg.complete = true
-	return
-}
-
-func (check *Checker) recordUntyped() {
-	if !debug && check.Types == nil {
-		return // nothing to do
-	}
-
-	for x, info := range check.untyped {
-		if debug && isTyped(info.typ) {
-			check.dump("%s: %s (type %s) is typed", x.Pos(), x, info.typ)
-			unreachable()
-		}
-		check.recordTypeAndValue(x, info.mode, info.typ, info.val)
-	}
-}
-
-func (check *Checker) recordTypeAndValue(x ast.Expr, mode operandMode, typ Type, val constant.Value) {
-	assert(x != nil)
-	assert(typ != nil)
-	if mode == invalid {
-		return // omit
-	}
-	assert(typ != nil)
-	if mode == constant_ {
-		assert(val != nil)
-		assert(typ == Typ[Invalid] || isConstType(typ))
-	}
-	if m := check.Types; m != nil {
-		m[x] = TypeAndValue{mode, typ, val}
-	}
-}
-
-func (check *Checker) recordBuiltinType(f ast.Expr, sig *Signature) {
-	// f must be a (possibly parenthesized) identifier denoting a built-in
-	// (built-ins in package unsafe always produce a constant result and
-	// we don't record their signatures, so we don't see qualified idents
-	// here): record the signature for f and possible children.
-	for {
-		check.recordTypeAndValue(f, builtin, sig, nil)
-		switch p := f.(type) {
-		case *ast.Ident:
-			return // we're done
-		case *ast.ParenExpr:
-			f = p.X
-		default:
-			unreachable()
-		}
-	}
-}
-
-func (check *Checker) recordCommaOkTypes(x ast.Expr, a [2]Type) {
-	assert(x != nil)
-	if a[0] == nil || a[1] == nil {
-		return
-	}
-	assert(isTyped(a[0]) && isTyped(a[1]) && isBoolean(a[1]))
-	if m := check.Types; m != nil {
-		for {
-			tv := m[x]
-			assert(tv.Type != nil) // should have been recorded already
-			pos := x.Pos()
-			tv.Type = NewTuple(
-				NewVar(pos, check.pkg, "", a[0]),
-				NewVar(pos, check.pkg, "", a[1]),
-			)
-			m[x] = tv
-			// if x is a parenthesized expression (p.X), update p.X
-			p, _ := x.(*ast.ParenExpr)
-			if p == nil {
-				break
-			}
-			x = p.X
-		}
-	}
-}
-
-func (check *Checker) recordDef(id *ast.Ident, obj Object) {
-	assert(id != nil)
-	if m := check.Defs; m != nil {
-		m[id] = obj
-	}
-}
-
-func (check *Checker) recordUse(id *ast.Ident, obj Object) {
-	assert(id != nil)
-	assert(obj != nil)
-	if m := check.Uses; m != nil {
-		m[id] = obj
-	}
-}
-
-func (check *Checker) recordImplicit(node ast.Node, obj Object) {
-	assert(node != nil)
-	assert(obj != nil)
-	if m := check.Implicits; m != nil {
-		m[node] = obj
-	}
-}
-
-func (check *Checker) recordSelection(x *ast.SelectorExpr, kind SelectionKind, recv Type, obj Object, index []int, indirect bool) {
-	assert(obj != nil && (recv == nil || len(index) > 0))
-	check.recordUse(x.Sel, obj)
-	// TODO(gri) Should we also call recordTypeAndValue?
-	if m := check.Selections; m != nil {
-		m[x] = &Selection{kind, recv, obj, index, indirect}
-	}
-}
-
-func (check *Checker) recordScope(node ast.Node, scope *Scope) {
-	assert(node != nil)
-	assert(scope != nil)
-	if m := check.Scopes; m != nil {
-		m[node] = scope
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/check_test.go b/third_party/gofrontend/libgo/go/go/types/check_test.go
deleted file mode 100644
index 5e34c65..0000000
--- a/third_party/gofrontend/libgo/go/go/types/check_test.go
+++ /dev/null
@@ -1,298 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements a typechecker test harness. The packages specified
-// in tests are typechecked. Error messages reported by the typechecker are
-// compared against the error messages expected in the test files.
-//
-// Expected errors are indicated in the test files by putting a comment
-// of the form /* ERROR "rx" */ immediately following an offending token.
-// The harness will verify that an error matching the regular expression
-// rx is reported at that source position. Consecutive comments may be
-// used to indicate multiple errors for the same token position.
-//
-// For instance, the following test file indicates that a "not declared"
-// error should be reported for the undeclared variable x:
-//
-//	package p
-//	func f() {
-//		_ = x /* ERROR "not declared" */ + 1
-//	}
-
-// TODO(gri) Also collect strict mode errors of the form /* STRICT ... */
-//           and test against strict mode.
-
-package types_test
-
-import (
-	"flag"
-	"go/ast"
-	"go/importer"
-	"go/parser"
-	"go/scanner"
-	"go/token"
-	"internal/testenv"
-	"io/ioutil"
-	"regexp"
-	"strings"
-	"testing"
-
-	. "go/types"
-)
-
-var (
-	listErrors = flag.Bool("list", false, "list errors")
-	testFiles  = flag.String("files", "", "space-separated list of test files")
-)
-
-// The test filenames do not end in .go so that they are invisible
-// to gofmt since they contain comments that must not change their
-// positions relative to surrounding tokens.
-
-// Each tests entry is list of files belonging to the same package.
-var tests = [][]string{
-	{"testdata/errors.src"},
-	{"testdata/importdecl0a.src", "testdata/importdecl0b.src"},
-	{"testdata/importdecl1a.src", "testdata/importdecl1b.src"},
-	{"testdata/cycles.src"},
-	{"testdata/cycles1.src"},
-	{"testdata/cycles2.src"},
-	{"testdata/cycles3.src"},
-	{"testdata/cycles4.src"},
-	{"testdata/init0.src"},
-	{"testdata/init1.src"},
-	{"testdata/init2.src"},
-	{"testdata/decls0.src"},
-	{"testdata/decls1.src"},
-	{"testdata/decls2a.src", "testdata/decls2b.src"},
-	{"testdata/decls3.src"},
-	{"testdata/const0.src"},
-	{"testdata/const1.src"},
-	{"testdata/constdecl.src"},
-	{"testdata/vardecl.src"},
-	{"testdata/expr0.src"},
-	{"testdata/expr1.src"},
-	{"testdata/expr2.src"},
-	{"testdata/expr3.src"},
-	{"testdata/methodsets.src"},
-	{"testdata/shifts.src"},
-	{"testdata/builtins.src"},
-	{"testdata/conversions.src"},
-	{"testdata/stmt0.src"},
-	{"testdata/stmt1.src"},
-	{"testdata/gotos.src"},
-	{"testdata/labels.src"},
-	{"testdata/issues.src"},
-	{"testdata/blank.src"},
-}
-
-var fset = token.NewFileSet()
-
-// Positioned errors are of the form filename:line:column: message .
-var posMsgRx = regexp.MustCompile(`^(.*:[0-9]+:[0-9]+): *(.*)`)
-
-// splitError splits an error's error message into a position string
-// and the actual error message. If there's no position information,
-// pos is the empty string, and msg is the entire error message.
-//
-func splitError(err error) (pos, msg string) {
-	msg = err.Error()
-	if m := posMsgRx.FindStringSubmatch(msg); len(m) == 3 {
-		pos = m[1]
-		msg = m[2]
-	}
-	return
-}
-
-func parseFiles(t *testing.T, filenames []string) ([]*ast.File, []error) {
-	var files []*ast.File
-	var errlist []error
-	for _, filename := range filenames {
-		file, err := parser.ParseFile(fset, filename, nil, parser.AllErrors)
-		if file == nil {
-			t.Fatalf("%s: %s", filename, err)
-		}
-		files = append(files, file)
-		if err != nil {
-			if list, _ := err.(scanner.ErrorList); len(list) > 0 {
-				for _, err := range list {
-					errlist = append(errlist, err)
-				}
-			} else {
-				errlist = append(errlist, err)
-			}
-		}
-	}
-	return files, errlist
-}
-
-// ERROR comments must start with text `ERROR "rx"` or `ERROR rx` where
-// rx is a regular expression that matches the expected error message.
-// Space around "rx" or rx is ignored. Use the form `ERROR HERE "rx"`
-// for error messages that are located immediately after rather than
-// at a token's position.
-//
-var errRx = regexp.MustCompile(`^ *ERROR *(HERE)? *"?([^"]*)"?`)
-
-// errMap collects the regular expressions of ERROR comments found
-// in files and returns them as a map of error positions to error messages.
-//
-func errMap(t *testing.T, testname string, files []*ast.File) map[string][]string {
-	// map of position strings to lists of error message patterns
-	errmap := make(map[string][]string)
-
-	for _, file := range files {
-		filename := fset.Position(file.Package).Filename
-		src, err := ioutil.ReadFile(filename)
-		if err != nil {
-			t.Fatalf("%s: could not read %s", testname, filename)
-		}
-
-		var s scanner.Scanner
-		s.Init(fset.AddFile(filename, -1, len(src)), src, nil, scanner.ScanComments)
-		var prev token.Pos // position of last non-comment, non-semicolon token
-		var here token.Pos // position immediately after the token at position prev
-
-	scanFile:
-		for {
-			pos, tok, lit := s.Scan()
-			switch tok {
-			case token.EOF:
-				break scanFile
-			case token.COMMENT:
-				if lit[1] == '*' {
-					lit = lit[:len(lit)-2] // strip trailing */
-				}
-				if s := errRx.FindStringSubmatch(lit[2:]); len(s) == 3 {
-					pos := prev
-					if s[1] == "HERE" {
-						pos = here
-					}
-					p := fset.Position(pos).String()
-					errmap[p] = append(errmap[p], strings.TrimSpace(s[2]))
-				}
-			case token.SEMICOLON:
-				// ignore automatically inserted semicolon
-				if lit == "\n" {
-					continue scanFile
-				}
-				fallthrough
-			default:
-				prev = pos
-				var l int // token length
-				if tok.IsLiteral() {
-					l = len(lit)
-				} else {
-					l = len(tok.String())
-				}
-				here = prev + token.Pos(l)
-			}
-		}
-	}
-
-	return errmap
-}
-
-func eliminate(t *testing.T, errmap map[string][]string, errlist []error) {
-	for _, err := range errlist {
-		pos, gotMsg := splitError(err)
-		list := errmap[pos]
-		index := -1 // list index of matching message, if any
-		// we expect one of the messages in list to match the error at pos
-		for i, wantRx := range list {
-			rx, err := regexp.Compile(wantRx)
-			if err != nil {
-				t.Errorf("%s: %v", pos, err)
-				continue
-			}
-			if rx.MatchString(gotMsg) {
-				index = i
-				break
-			}
-		}
-		if index >= 0 {
-			// eliminate from list
-			if n := len(list) - 1; n > 0 {
-				// not the last entry - swap in last element and shorten list by 1
-				list[index] = list[n]
-				errmap[pos] = list[:n]
-			} else {
-				// last entry - remove list from map
-				delete(errmap, pos)
-			}
-		} else {
-			t.Errorf("%s: no error expected: %q", pos, gotMsg)
-		}
-	}
-}
-
-func checkFiles(t *testing.T, testfiles []string) {
-	// parse files and collect parser errors
-	files, errlist := parseFiles(t, testfiles)
-
-	pkgName := "<no package>"
-	if len(files) > 0 {
-		pkgName = files[0].Name.Name
-	}
-
-	if *listErrors && len(errlist) > 0 {
-		t.Errorf("--- %s:", pkgName)
-		for _, err := range errlist {
-			t.Error(err)
-		}
-	}
-
-	// typecheck and collect typechecker errors
-	var conf Config
-	conf.Importer = importer.Default()
-	conf.Error = func(err error) {
-		if *listErrors {
-			t.Error(err)
-			return
-		}
-		// Ignore secondary error messages starting with "\t";
-		// they are clarifying messages for a primary error.
-		if !strings.Contains(err.Error(), ": \t") {
-			errlist = append(errlist, err)
-		}
-	}
-	conf.Check(pkgName, fset, files, nil)
-
-	if *listErrors {
-		return
-	}
-
-	// match and eliminate errors;
-	// we are expecting the following errors
-	errmap := errMap(t, pkgName, files)
-	eliminate(t, errmap, errlist)
-
-	// there should be no expected errors left
-	if len(errmap) > 0 {
-		t.Errorf("--- %s: %d source positions with expected (but not reported) errors:", pkgName, len(errmap))
-		for pos, list := range errmap {
-			for _, rx := range list {
-				t.Errorf("%s: %q", pos, rx)
-			}
-		}
-	}
-}
-
-func TestCheck(t *testing.T) {
-	testenv.MustHaveGoBuild(t)
-
-	// Declare builtins for testing.
-	DefPredeclaredTestFuncs()
-
-	// If explicit test files are specified, only check those.
-	if files := *testFiles; files != "" {
-		checkFiles(t, strings.Split(files, " "))
-		return
-	}
-
-	// Otherwise, run all the tests.
-	for _, files := range tests {
-		checkFiles(t, files)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/conversions.go b/third_party/gofrontend/libgo/go/go/types/conversions.go
deleted file mode 100644
index 74826ce..0000000
--- a/third_party/gofrontend/libgo/go/go/types/conversions.go
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements typechecking of conversions.
-
-package types
-
-import "go/constant"
-
-// Conversion type-checks the conversion T(x).
-// The result is in x.
-func (check *Checker) conversion(x *operand, T Type) {
-	constArg := x.mode == constant_
-
-	var ok bool
-	switch {
-	case constArg && isConstType(T):
-		// constant conversion
-		switch t := T.Underlying().(*Basic); {
-		case representableConst(x.val, check.conf, t.kind, &x.val):
-			ok = true
-		case isInteger(x.typ) && isString(t):
-			codepoint := int64(-1)
-			if i, ok := constant.Int64Val(x.val); ok {
-				codepoint = i
-			}
-			// If codepoint < 0 the absolute value is too large (or unknown) for
-			// conversion. This is the same as converting any other out-of-range
-			// value - let string(codepoint) do the work.
-			x.val = constant.MakeString(string(codepoint))
-			ok = true
-		}
-	case x.convertibleTo(check.conf, T):
-		// non-constant conversion
-		x.mode = value
-		ok = true
-	}
-
-	if !ok {
-		check.errorf(x.pos(), "cannot convert %s to %s", x, T)
-		x.mode = invalid
-		return
-	}
-
-	// The conversion argument types are final. For untyped values the
-	// conversion provides the type, per the spec: "A constant may be
-	// given a type explicitly by a constant declaration or conversion,...".
-	final := x.typ
-	if isUntyped(x.typ) {
-		final = T
-		// - For conversions to interfaces, use the argument's default type.
-		// - For conversions of untyped constants to non-constant types, also
-		//   use the default type (e.g., []byte("foo") should report string
-		//   not []byte as type for the constant "foo").
-		// - Keep untyped nil for untyped nil arguments.
-		if IsInterface(T) || constArg && !isConstType(T) {
-			final = defaultType(x.typ)
-		}
-		check.updateExprType(x.expr, final, true)
-	}
-
-	x.typ = T
-}
-
-func (x *operand) convertibleTo(conf *Config, T Type) bool {
-	// "x is assignable to T"
-	if x.assignableTo(conf, T) {
-		return true
-	}
-
-	// "x's type and T have identical underlying types"
-	V := x.typ
-	Vu := V.Underlying()
-	Tu := T.Underlying()
-	if Identical(Vu, Tu) {
-		return true
-	}
-
-	// "x's type and T are unnamed pointer types and their pointer base types have identical underlying types"
-	if V, ok := V.(*Pointer); ok {
-		if T, ok := T.(*Pointer); ok {
-			if Identical(V.base.Underlying(), T.base.Underlying()) {
-				return true
-			}
-		}
-	}
-
-	// "x's type and T are both integer or floating point types"
-	if (isInteger(V) || isFloat(V)) && (isInteger(T) || isFloat(T)) {
-		return true
-	}
-
-	// "x's type and T are both complex types"
-	if isComplex(V) && isComplex(T) {
-		return true
-	}
-
-	// "x is an integer or a slice of bytes or runes and T is a string type"
-	if (isInteger(V) || isBytesOrRunes(Vu)) && isString(T) {
-		return true
-	}
-
-	// "x is a string and T is a slice of bytes or runes"
-	if isString(V) && isBytesOrRunes(Tu) {
-		return true
-	}
-
-	// package unsafe:
-	// "any pointer or value of underlying type uintptr can be converted into a unsafe.Pointer"
-	if (isPointer(Vu) || isUintptr(Vu)) && isUnsafePointer(T) {
-		return true
-	}
-	// "and vice versa"
-	if isUnsafePointer(V) && (isPointer(Tu) || isUintptr(Tu)) {
-		return true
-	}
-
-	return false
-}
-
-func isUintptr(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.kind == Uintptr
-}
-
-func isUnsafePointer(typ Type) bool {
-	// TODO(gri): Is this (typ.Underlying() instead of just typ) correct?
-	//            The spec does not say so, but gc claims it is. See also
-	//            issue 6326.
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.kind == UnsafePointer
-}
-
-func isPointer(typ Type) bool {
-	_, ok := typ.Underlying().(*Pointer)
-	return ok
-}
-
-func isBytesOrRunes(typ Type) bool {
-	if s, ok := typ.(*Slice); ok {
-		t, ok := s.elem.Underlying().(*Basic)
-		return ok && (t.kind == Byte || t.kind == Rune)
-	}
-	return false
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/decl.go b/third_party/gofrontend/libgo/go/go/types/decl.go
deleted file mode 100644
index 8e9e5f3..0000000
--- a/third_party/gofrontend/libgo/go/go/types/decl.go
+++ /dev/null
@@ -1,430 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import (
-	"go/ast"
-	"go/constant"
-	"go/token"
-)
-
-func (check *Checker) reportAltDecl(obj Object) {
-	if pos := obj.Pos(); pos.IsValid() {
-		// We use "other" rather than "previous" here because
-		// the first declaration seen may not be textually
-		// earlier in the source.
-		check.errorf(pos, "\tother declaration of %s", obj.Name()) // secondary error, \t indented
-	}
-}
-
-func (check *Checker) declare(scope *Scope, id *ast.Ident, obj Object, pos token.Pos) {
-	// spec: "The blank identifier, represented by the underscore
-	// character _, may be used in a declaration like any other
-	// identifier but the declaration does not introduce a new
-	// binding."
-	if obj.Name() != "_" {
-		if alt := scope.Insert(obj); alt != nil {
-			check.errorf(obj.Pos(), "%s redeclared in this block", obj.Name())
-			check.reportAltDecl(alt)
-			return
-		}
-		obj.setScopePos(pos)
-	}
-	if id != nil {
-		check.recordDef(id, obj)
-	}
-}
-
-// objDecl type-checks the declaration of obj in its respective (file) context.
-// See check.typ for the details on def and path.
-func (check *Checker) objDecl(obj Object, def *Named, path []*TypeName) {
-	if obj.Type() != nil {
-		return // already checked - nothing to do
-	}
-
-	if trace {
-		check.trace(obj.Pos(), "-- declaring %s", obj.Name())
-		check.indent++
-		defer func() {
-			check.indent--
-			check.trace(obj.Pos(), "=> %s", obj)
-		}()
-	}
-
-	d := check.objMap[obj]
-	if d == nil {
-		check.dump("%s: %s should have been declared", obj.Pos(), obj.Name())
-		unreachable()
-	}
-
-	// save/restore current context and setup object context
-	defer func(ctxt context) {
-		check.context = ctxt
-	}(check.context)
-	check.context = context{
-		scope: d.file,
-	}
-
-	// Const and var declarations must not have initialization
-	// cycles. We track them by remembering the current declaration
-	// in check.decl. Initialization expressions depending on other
-	// consts, vars, or functions, add dependencies to the current
-	// check.decl.
-	switch obj := obj.(type) {
-	case *Const:
-		check.decl = d // new package-level const decl
-		check.constDecl(obj, d.typ, d.init)
-	case *Var:
-		check.decl = d // new package-level var decl
-		check.varDecl(obj, d.lhs, d.typ, d.init)
-	case *TypeName:
-		// invalid recursive types are detected via path
-		check.typeDecl(obj, d.typ, def, path)
-	case *Func:
-		// functions may be recursive - no need to track dependencies
-		check.funcDecl(obj, d)
-	default:
-		unreachable()
-	}
-}
-
-func (check *Checker) constDecl(obj *Const, typ, init ast.Expr) {
-	assert(obj.typ == nil)
-
-	if obj.visited {
-		obj.typ = Typ[Invalid]
-		return
-	}
-	obj.visited = true
-
-	// use the correct value of iota
-	assert(check.iota == nil)
-	check.iota = obj.val
-	defer func() { check.iota = nil }()
-
-	// provide valid constant value under all circumstances
-	obj.val = constant.MakeUnknown()
-
-	// determine type, if any
-	if typ != nil {
-		t := check.typ(typ)
-		if !isConstType(t) {
-			check.errorf(typ.Pos(), "invalid constant type %s", t)
-			obj.typ = Typ[Invalid]
-			return
-		}
-		obj.typ = t
-	}
-
-	// check initialization
-	var x operand
-	if init != nil {
-		check.expr(&x, init)
-	}
-	check.initConst(obj, &x)
-}
-
-func (check *Checker) varDecl(obj *Var, lhs []*Var, typ, init ast.Expr) {
-	assert(obj.typ == nil)
-
-	if obj.visited {
-		obj.typ = Typ[Invalid]
-		return
-	}
-	obj.visited = true
-
-	// var declarations cannot use iota
-	assert(check.iota == nil)
-
-	// determine type, if any
-	if typ != nil {
-		obj.typ = check.typ(typ)
-	}
-
-	// check initialization
-	if init == nil {
-		if typ == nil {
-			// error reported before by arityMatch
-			obj.typ = Typ[Invalid]
-		}
-		return
-	}
-
-	if lhs == nil || len(lhs) == 1 {
-		assert(lhs == nil || lhs[0] == obj)
-		var x operand
-		check.expr(&x, init)
-		check.initVar(obj, &x, false)
-		return
-	}
-
-	if debug {
-		// obj must be one of lhs
-		found := false
-		for _, lhs := range lhs {
-			if obj == lhs {
-				found = true
-				break
-			}
-		}
-		if !found {
-			panic("inconsistent lhs")
-		}
-	}
-	check.initVars(lhs, []ast.Expr{init}, token.NoPos)
-}
-
-// underlying returns the underlying type of typ; possibly by following
-// forward chains of named types. Such chains only exist while named types
-// are incomplete.
-func underlying(typ Type) Type {
-	for {
-		n, _ := typ.(*Named)
-		if n == nil {
-			break
-		}
-		typ = n.underlying
-	}
-	return typ
-}
-
-func (n *Named) setUnderlying(typ Type) {
-	if n != nil {
-		n.underlying = typ
-	}
-}
-
-func (check *Checker) typeDecl(obj *TypeName, typ ast.Expr, def *Named, path []*TypeName) {
-	assert(obj.typ == nil)
-
-	// type declarations cannot use iota
-	assert(check.iota == nil)
-
-	named := &Named{obj: obj}
-	def.setUnderlying(named)
-	obj.typ = named // make sure recursive type declarations terminate
-
-	// determine underlying type of named
-	check.typExpr(typ, named, append(path, obj))
-
-	// The underlying type of named may be itself a named type that is
-	// incomplete:
-	//
-	//	type (
-	//		A B
-	//		B *C
-	//		C A
-	//	)
-	//
-	// The type of C is the (named) type of A which is incomplete,
-	// and which has as its underlying type the named type B.
-	// Determine the (final, unnamed) underlying type by resolving
-	// any forward chain (they always end in an unnamed type).
-	named.underlying = underlying(named.underlying)
-
-	// check and add associated methods
-	// TODO(gri) It's easy to create pathological cases where the
-	// current approach is incorrect: In general we need to know
-	// and add all methods _before_ type-checking the type.
-	// See https://play.golang.org/p/WMpE0q2wK8
-	check.addMethodDecls(obj)
-}
-
-func (check *Checker) addMethodDecls(obj *TypeName) {
-	// get associated methods
-	methods := check.methods[obj.name]
-	if len(methods) == 0 {
-		return // no methods
-	}
-	delete(check.methods, obj.name)
-
-	// use an objset to check for name conflicts
-	var mset objset
-
-	// spec: "If the base type is a struct type, the non-blank method
-	// and field names must be distinct."
-	base := obj.typ.(*Named)
-	if t, _ := base.underlying.(*Struct); t != nil {
-		for _, fld := range t.fields {
-			if fld.name != "_" {
-				assert(mset.insert(fld) == nil)
-			}
-		}
-	}
-
-	// Checker.Files may be called multiple times; additional package files
-	// may add methods to already type-checked types. Add pre-existing methods
-	// so that we can detect redeclarations.
-	for _, m := range base.methods {
-		assert(m.name != "_")
-		assert(mset.insert(m) == nil)
-	}
-
-	// type-check methods
-	for _, m := range methods {
-		// spec: "For a base type, the non-blank names of methods bound
-		// to it must be unique."
-		if m.name != "_" {
-			if alt := mset.insert(m); alt != nil {
-				switch alt.(type) {
-				case *Var:
-					check.errorf(m.pos, "field and method with the same name %s", m.name)
-				case *Func:
-					check.errorf(m.pos, "method %s already declared for %s", m.name, base)
-				default:
-					unreachable()
-				}
-				check.reportAltDecl(alt)
-				continue
-			}
-		}
-		check.objDecl(m, nil, nil)
-		// methods with blank _ names cannot be found - don't keep them
-		if m.name != "_" {
-			base.methods = append(base.methods, m)
-		}
-	}
-}
-
-func (check *Checker) funcDecl(obj *Func, decl *declInfo) {
-	assert(obj.typ == nil)
-
-	// func declarations cannot use iota
-	assert(check.iota == nil)
-
-	sig := new(Signature)
-	obj.typ = sig // guard against cycles
-	fdecl := decl.fdecl
-	check.funcType(sig, fdecl.Recv, fdecl.Type)
-	if sig.recv == nil && obj.name == "init" && (sig.params.Len() > 0 || sig.results.Len() > 0) {
-		check.errorf(fdecl.Pos(), "func init must have no arguments and no return values")
-		// ok to continue
-	}
-
-	// function body must be type-checked after global declarations
-	// (functions implemented elsewhere have no body)
-	if !check.conf.IgnoreFuncBodies && fdecl.Body != nil {
-		check.later(obj.name, decl, sig, fdecl.Body)
-	}
-}
-
-func (check *Checker) declStmt(decl ast.Decl) {
-	pkg := check.pkg
-
-	switch d := decl.(type) {
-	case *ast.BadDecl:
-		// ignore
-
-	case *ast.GenDecl:
-		var last *ast.ValueSpec // last ValueSpec with type or init exprs seen
-		for iota, spec := range d.Specs {
-			switch s := spec.(type) {
-			case *ast.ValueSpec:
-				switch d.Tok {
-				case token.CONST:
-					// determine which init exprs to use
-					switch {
-					case s.Type != nil || len(s.Values) > 0:
-						last = s
-					case last == nil:
-						last = new(ast.ValueSpec) // make sure last exists
-					}
-
-					// declare all constants
-					lhs := make([]*Const, len(s.Names))
-					for i, name := range s.Names {
-						obj := NewConst(name.Pos(), pkg, name.Name, nil, constant.MakeInt64(int64(iota)))
-						lhs[i] = obj
-
-						var init ast.Expr
-						if i < len(last.Values) {
-							init = last.Values[i]
-						}
-
-						check.constDecl(obj, last.Type, init)
-					}
-
-					check.arityMatch(s, last)
-
-					// spec: "The scope of a constant or variable identifier declared
-					// inside a function begins at the end of the ConstSpec or VarSpec
-					// (ShortVarDecl for short variable declarations) and ends at the
-					// end of the innermost containing block."
-					scopePos := s.End()
-					for i, name := range s.Names {
-						check.declare(check.scope, name, lhs[i], scopePos)
-					}
-
-				case token.VAR:
-					lhs0 := make([]*Var, len(s.Names))
-					for i, name := range s.Names {
-						lhs0[i] = NewVar(name.Pos(), pkg, name.Name, nil)
-					}
-
-					// initialize all variables
-					for i, obj := range lhs0 {
-						var lhs []*Var
-						var init ast.Expr
-						switch len(s.Values) {
-						case len(s.Names):
-							// lhs and rhs match
-							init = s.Values[i]
-						case 1:
-							// rhs is expected to be a multi-valued expression
-							lhs = lhs0
-							init = s.Values[0]
-						default:
-							if i < len(s.Values) {
-								init = s.Values[i]
-							}
-						}
-						check.varDecl(obj, lhs, s.Type, init)
-						if len(s.Values) == 1 {
-							// If we have a single lhs variable we are done either way.
-							// If we have a single rhs expression, it must be a multi-
-							// valued expression, in which case handling the first lhs
-							// variable will cause all lhs variables to have a type
-							// assigned, and we are done as well.
-							if debug {
-								for _, obj := range lhs0 {
-									assert(obj.typ != nil)
-								}
-							}
-							break
-						}
-					}
-
-					check.arityMatch(s, nil)
-
-					// declare all variables
-					// (only at this point are the variable scopes (parents) set)
-					scopePos := s.End() // see constant declarations
-					for i, name := range s.Names {
-						// see constant declarations
-						check.declare(check.scope, name, lhs0[i], scopePos)
-					}
-
-				default:
-					check.invalidAST(s.Pos(), "invalid token %s", d.Tok)
-				}
-
-			case *ast.TypeSpec:
-				obj := NewTypeName(s.Name.Pos(), pkg, s.Name.Name, nil)
-				// spec: "The scope of a type identifier declared inside a function
-				// begins at the identifier in the TypeSpec and ends at the end of
-				// the innermost containing block."
-				scopePos := s.Name.Pos()
-				check.declare(check.scope, s.Name, obj, scopePos)
-				check.typeDecl(obj, s.Type, nil, nil)
-
-			default:
-				check.invalidAST(s.Pos(), "const, type, or var declaration expected")
-			}
-		}
-
-	default:
-		check.invalidAST(d.Pos(), "unknown ast.Decl node %T", d)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/errors.go b/third_party/gofrontend/libgo/go/go/types/errors.go
deleted file mode 100644
index 0c0049b..0000000
--- a/third_party/gofrontend/libgo/go/go/types/errors.go
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements various error reporters.
-
-package types
-
-import (
-	"fmt"
-	"go/ast"
-	"go/token"
-	"strings"
-)
-
-func assert(p bool) {
-	if !p {
-		panic("assertion failed")
-	}
-}
-
-func unreachable() {
-	panic("unreachable")
-}
-
-func (check *Checker) qualifier(pkg *Package) string {
-	if pkg != check.pkg {
-		return pkg.path
-	}
-	return ""
-}
-
-func (check *Checker) sprintf(format string, args ...interface{}) string {
-	for i, arg := range args {
-		switch a := arg.(type) {
-		case nil:
-			arg = "<nil>"
-		case operand:
-			panic("internal error: should always pass *operand")
-		case *operand:
-			arg = operandString(a, check.qualifier)
-		case token.Pos:
-			arg = check.fset.Position(a).String()
-		case ast.Expr:
-			arg = ExprString(a)
-		case Object:
-			arg = ObjectString(a, check.qualifier)
-		case Type:
-			arg = TypeString(a, check.qualifier)
-		}
-		args[i] = arg
-	}
-	return fmt.Sprintf(format, args...)
-}
-
-func (check *Checker) trace(pos token.Pos, format string, args ...interface{}) {
-	fmt.Printf("%s:\t%s%s\n",
-		check.fset.Position(pos),
-		strings.Repeat(".  ", check.indent),
-		check.sprintf(format, args...),
-	)
-}
-
-// dump is only needed for debugging
-func (check *Checker) dump(format string, args ...interface{}) {
-	fmt.Println(check.sprintf(format, args...))
-}
-
-func (check *Checker) err(pos token.Pos, msg string, soft bool) {
-	err := Error{check.fset, pos, msg, soft}
-	if check.firstErr == nil {
-		check.firstErr = err
-	}
-	f := check.conf.Error
-	if f == nil {
-		panic(bailout{}) // report only first error
-	}
-	f(err)
-}
-
-func (check *Checker) error(pos token.Pos, msg string) {
-	check.err(pos, msg, false)
-}
-
-func (check *Checker) errorf(pos token.Pos, format string, args ...interface{}) {
-	check.err(pos, check.sprintf(format, args...), false)
-}
-
-func (check *Checker) softErrorf(pos token.Pos, format string, args ...interface{}) {
-	check.err(pos, check.sprintf(format, args...), true)
-}
-
-func (check *Checker) invalidAST(pos token.Pos, format string, args ...interface{}) {
-	check.errorf(pos, "invalid AST: "+format, args...)
-}
-
-func (check *Checker) invalidArg(pos token.Pos, format string, args ...interface{}) {
-	check.errorf(pos, "invalid argument: "+format, args...)
-}
-
-func (check *Checker) invalidOp(pos token.Pos, format string, args ...interface{}) {
-	check.errorf(pos, "invalid operation: "+format, args...)
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/eval.go b/third_party/gofrontend/libgo/go/go/types/eval.go
deleted file mode 100644
index 7b42ff1..0000000
--- a/third_party/gofrontend/libgo/go/go/types/eval.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import (
-	"fmt"
-	"go/parser"
-	"go/token"
-)
-
-// Eval returns the type and, if constant, the value for the
-// expression expr, evaluated at position pos of package pkg,
-// which must have been derived from type-checking an AST with
-// complete position information relative to the provided file
-// set.
-//
-// If the expression contains function literals, their bodies
-// are ignored (i.e., the bodies are not type-checked).
-//
-// If pkg == nil, the Universe scope is used and the provided
-// position pos is ignored. If pkg != nil, and pos is invalid,
-// the package scope is used. Otherwise, pos must belong to the
-// package.
-//
-// An error is returned if pos is not within the package or
-// if the node cannot be evaluated.
-//
-// Note: Eval should not be used instead of running Check to compute
-// types and values, but in addition to Check. Eval will re-evaluate
-// its argument each time, and it also does not know about the context
-// in which an expression is used (e.g., an assignment). Thus, top-
-// level untyped constants will return an untyped type rather then the
-// respective context-specific type.
-//
-func Eval(fset *token.FileSet, pkg *Package, pos token.Pos, expr string) (tv TypeAndValue, err error) {
-	// determine scope
-	var scope *Scope
-	if pkg == nil {
-		scope = Universe
-		pos = token.NoPos
-	} else if !pos.IsValid() {
-		scope = pkg.scope
-	} else {
-		// The package scope extent (position information) may be
-		// incorrect (files spread accross a wide range of fset
-		// positions) - ignore it and just consider its children
-		// (file scopes).
-		for _, fscope := range pkg.scope.children {
-			if scope = fscope.Innermost(pos); scope != nil {
-				break
-			}
-		}
-		if scope == nil || debug {
-			s := scope
-			for s != nil && s != pkg.scope {
-				s = s.parent
-			}
-			// s == nil || s == pkg.scope
-			if s == nil {
-				return TypeAndValue{}, fmt.Errorf("no position %s found in package %s", fset.Position(pos), pkg.name)
-			}
-		}
-	}
-
-	// parse expressions
-	node, err := parser.ParseExprFrom(fset, "eval", expr, 0)
-	if err != nil {
-		return TypeAndValue{}, err
-	}
-
-	// initialize checker
-	check := NewChecker(nil, fset, pkg, nil)
-	check.scope = scope
-	check.pos = pos
-	defer check.handleBailout(&err)
-
-	// evaluate node
-	var x operand
-	check.rawExpr(&x, node, nil)
-	return TypeAndValue{x.mode, x.typ, x.val}, err
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/eval_test.go b/third_party/gofrontend/libgo/go/go/types/eval_test.go
deleted file mode 100644
index 7e0be43..0000000
--- a/third_party/gofrontend/libgo/go/go/types/eval_test.go
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for Eval.
-
-package types_test
-
-import (
-	"go/ast"
-	"go/importer"
-	"go/parser"
-	"go/token"
-	"internal/testenv"
-	"strings"
-	"testing"
-
-	. "go/types"
-)
-
-func testEval(t *testing.T, fset *token.FileSet, pkg *Package, pos token.Pos, expr string, typ Type, typStr, valStr string) {
-	gotTv, err := Eval(fset, pkg, pos, expr)
-	if err != nil {
-		t.Errorf("Eval(%q) failed: %s", expr, err)
-		return
-	}
-	if gotTv.Type == nil {
-		t.Errorf("Eval(%q) got nil type but no error", expr)
-		return
-	}
-
-	// compare types
-	if typ != nil {
-		// we have a type, check identity
-		if !Identical(gotTv.Type, typ) {
-			t.Errorf("Eval(%q) got type %s, want %s", expr, gotTv.Type, typ)
-			return
-		}
-	} else {
-		// we have a string, compare type string
-		gotStr := gotTv.Type.String()
-		if gotStr != typStr {
-			t.Errorf("Eval(%q) got type %s, want %s", expr, gotStr, typStr)
-			return
-		}
-	}
-
-	// compare values
-	gotStr := ""
-	if gotTv.Value != nil {
-		gotStr = gotTv.Value.String()
-	}
-	if gotStr != valStr {
-		t.Errorf("Eval(%q) got value %s, want %s", expr, gotStr, valStr)
-	}
-}
-
-func TestEvalBasic(t *testing.T) {
-	fset := token.NewFileSet()
-	for _, typ := range Typ[Bool : String+1] {
-		testEval(t, fset, nil, token.NoPos, typ.Name(), typ, "", "")
-	}
-}
-
-func TestEvalComposite(t *testing.T) {
-	fset := token.NewFileSet()
-	for _, test := range independentTestTypes {
-		testEval(t, fset, nil, token.NoPos, test.src, nil, test.str, "")
-	}
-}
-
-func TestEvalArith(t *testing.T) {
-	var tests = []string{
-		`true`,
-		`false == false`,
-		`12345678 + 87654321 == 99999999`,
-		`10 * 20 == 200`,
-		`(1<<1000)*2 >> 100 == 2<<900`,
-		`"foo" + "bar" == "foobar"`,
-		`"abc" <= "bcd"`,
-		`len([10]struct{}{}) == 2*5`,
-	}
-	fset := token.NewFileSet()
-	for _, test := range tests {
-		testEval(t, fset, nil, token.NoPos, test, Typ[UntypedBool], "", "true")
-	}
-}
-
-func TestEvalPos(t *testing.T) {
-	testenv.MustHaveGoBuild(t)
-
-	// The contents of /*-style comments are of the form
-	//	expr => value, type
-	// where value may be the empty string.
-	// Each expr is evaluated at the position of the comment
-	// and the result is compared with the expected value
-	// and type.
-	var sources = []string{
-		`
-		package p
-		import "fmt"
-		import m "math"
-		const c = 3.0
-		type T []int
-		func f(a int, s string) float64 {
-			fmt.Println("calling f")
-			_ = m.Pi // use package math
-			const d int = c + 1
-			var x int
-			x = a + len(s)
-			return float64(x)
-			/* true => true, untyped bool */
-			/* fmt.Println => , func(a ...interface{}) (n int, err error) */
-			/* c => 3, untyped float */
-			/* T => , p.T */
-			/* a => , int */
-			/* s => , string */
-			/* d => 4, int */
-			/* x => , int */
-			/* d/c => 1, int */
-			/* c/2 => 3/2, untyped float */
-			/* m.Pi < m.E => false, untyped bool */
-		}
-		`,
-		`
-		package p
-		/* c => 3, untyped float */
-		type T1 /* T1 => , p.T1 */ struct {}
-		var v1 /* v1 => , int */ = 42
-		func /* f1 => , func(v1 float64) */ f1(v1 float64) {
-			/* f1 => , func(v1 float64) */
-			/* v1 => , float64 */
-			var c /* c => 3, untyped float */ = "foo" /* c => , string */
-			{
-				var c struct {
-					c /* c => , string */ int
-				}
-				/* c => , struct{c int} */
-				_ = c
-			}
-			_ = func(a, b, c int) /* c => , string */ {
-				/* c => , int */
-			}
-			_ = c
-			type FT /* FT => , p.FT */ interface{}
-		}
-		`,
-		`
-		package p
-		/* T => , p.T */
-		`,
-	}
-
-	fset := token.NewFileSet()
-	var files []*ast.File
-	for i, src := range sources {
-		file, err := parser.ParseFile(fset, "p", src, parser.ParseComments)
-		if err != nil {
-			t.Fatalf("could not parse file %d: %s", i, err)
-		}
-		files = append(files, file)
-	}
-
-	conf := Config{Importer: importer.Default()}
-	pkg, err := conf.Check("p", fset, files, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	for _, file := range files {
-		for _, group := range file.Comments {
-			for _, comment := range group.List {
-				s := comment.Text
-				if len(s) >= 4 && s[:2] == "/*" && s[len(s)-2:] == "*/" {
-					str, typ := split(s[2:len(s)-2], ", ")
-					str, val := split(str, "=>")
-					testEval(t, fset, pkg, comment.Pos(), str, nil, typ, val)
-				}
-			}
-		}
-	}
-}
-
-// split splits string s at the first occurrence of s.
-func split(s, sep string) (string, string) {
-	i := strings.Index(s, sep)
-	return strings.TrimSpace(s[:i]), strings.TrimSpace(s[i+len(sep):])
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/example_test.go b/third_party/gofrontend/libgo/go/go/types/example_test.go
deleted file mode 100644
index 9daad87..0000000
--- a/third_party/gofrontend/libgo/go/go/types/example_test.go
+++ /dev/null
@@ -1,312 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Only run where builders (build.golang.org) have
-// access to compiled packages for import.
-//
-// +build ignore,!arm,!arm64,!nacl
-
-package types_test
-
-// This file shows examples of basic usage of the go/types API.
-//
-// To locate a Go package, use (*go/build.Context).Import.
-// To load, parse, and type-check a complete Go program
-// from source, use golang.org/x/tools/go/loader.
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/format"
-	"go/importer"
-	"go/parser"
-	"go/token"
-	"go/types"
-	"log"
-	"regexp"
-	"sort"
-	"strings"
-)
-
-// ExampleScope prints the tree of Scopes of a package created from a
-// set of parsed files.
-func ExampleScope() {
-	// Parse the source files for a package.
-	fset := token.NewFileSet()
-	var files []*ast.File
-	for _, file := range []struct{ name, input string }{
-		{"main.go", `
-package main
-import "fmt"
-func main() {
-	freezing := FToC(-18)
-	fmt.Println(freezing, Boiling) }
-`},
-		{"celsius.go", `
-package main
-import "fmt"
-type Celsius float64
-func (c Celsius) String() string { return fmt.Sprintf("%g°C", c) }
-func FToC(f float64) Celsius { return Celsius(f - 32 / 9 * 5) }
-const Boiling Celsius = 100
-`},
-	} {
-		f, err := parser.ParseFile(fset, file.name, file.input, 0)
-		if err != nil {
-			log.Fatal(err)
-		}
-		files = append(files, f)
-	}
-
-	// Type-check a package consisting of these files.
-	// Type information for the imported "fmt" package
-	// comes from $GOROOT/pkg/$GOOS_$GOOARCH/fmt.a.
-	conf := types.Config{Importer: importer.Default()}
-	pkg, err := conf.Check("temperature", fset, files, nil)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	// Print the tree of scopes.
-	// For determinism, we redact addresses.
-	var buf bytes.Buffer
-	pkg.Scope().WriteTo(&buf, 0, true)
-	rx := regexp.MustCompile(` 0x[a-fA-F0-9]*`)
-	fmt.Println(rx.ReplaceAllString(buf.String(), ""))
-
-	// Output:
-	// package "temperature" scope {
-	// .  const temperature.Boiling temperature.Celsius
-	// .  type temperature.Celsius float64
-	// .  func temperature.FToC(f float64) temperature.Celsius
-	// .  func temperature.main()
-	//
-	// .  main.go scope {
-	// .  .  package fmt
-	//
-	// .  .  function scope {
-	// .  .  .  var freezing temperature.Celsius
-	// .  .  }.  }
-	// .  celsius.go scope {
-	// .  .  package fmt
-	//
-	// .  .  function scope {
-	// .  .  .  var c temperature.Celsius
-	// .  .  }
-	// .  .  function scope {
-	// .  .  .  var f float64
-	// .  .  }.  }}
-}
-
-// ExampleMethodSet prints the method sets of various types.
-func ExampleMethodSet() {
-	// Parse a single source file.
-	const input = `
-package temperature
-import "fmt"
-type Celsius float64
-func (c Celsius) String() string  { return fmt.Sprintf("%g°C", c) }
-func (c *Celsius) SetF(f float64) { *c = Celsius(f - 32 / 9 * 5) }
-`
-	fset := token.NewFileSet()
-	f, err := parser.ParseFile(fset, "celsius.go", input, 0)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	// Type-check a package consisting of this file.
-	// Type information for the imported packages
-	// comes from $GOROOT/pkg/$GOOS_$GOOARCH/fmt.a.
-	conf := types.Config{Importer: importer.Default()}
-	pkg, err := conf.Check("temperature", fset, []*ast.File{f}, nil)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	// Print the method sets of Celsius and *Celsius.
-	celsius := pkg.Scope().Lookup("Celsius").Type()
-	for _, t := range []types.Type{celsius, types.NewPointer(celsius)} {
-		fmt.Printf("Method set of %s:\n", t)
-		mset := types.NewMethodSet(t)
-		for i := 0; i < mset.Len(); i++ {
-			fmt.Println(mset.At(i))
-		}
-		fmt.Println()
-	}
-
-	// Output:
-	// Method set of temperature.Celsius:
-	// method (temperature.Celsius) String() string
-	//
-	// Method set of *temperature.Celsius:
-	// method (*temperature.Celsius) SetF(f float64)
-	// method (*temperature.Celsius) String() string
-}
-
-// ExampleInfo prints various facts recorded by the type checker in a
-// types.Info struct: definitions of and references to each named object,
-// and the type, value, and mode of every expression in the package.
-func ExampleInfo() {
-	// Parse a single source file.
-	const input = `
-package fib
-
-type S string
-
-var a, b, c = len(b), S(c), "hello"
-
-func fib(x int) int {
-	if x < 2 {
-		return x
-	}
-	return fib(x-1) - fib(x-2)
-}`
-	fset := token.NewFileSet()
-	f, err := parser.ParseFile(fset, "fib.go", input, 0)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	// Type-check the package.
-	// We create an empty map for each kind of input
-	// we're interested in, and Check populates them.
-	info := types.Info{
-		Types: make(map[ast.Expr]types.TypeAndValue),
-		Defs:  make(map[*ast.Ident]types.Object),
-		Uses:  make(map[*ast.Ident]types.Object),
-	}
-	var conf types.Config
-	pkg, err := conf.Check("fib", fset, []*ast.File{f}, &info)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	// Print package-level variables in initialization order.
-	fmt.Printf("InitOrder: %v\n\n", info.InitOrder)
-
-	// For each named object, print the line and
-	// column of its definition and each of its uses.
-	fmt.Println("Defs and Uses of each named object:")
-	usesByObj := make(map[types.Object][]string)
-	for id, obj := range info.Uses {
-		posn := fset.Position(id.Pos())
-		lineCol := fmt.Sprintf("%d:%d", posn.Line, posn.Column)
-		usesByObj[obj] = append(usesByObj[obj], lineCol)
-	}
-	var items []string
-	for obj, uses := range usesByObj {
-		sort.Strings(uses)
-		item := fmt.Sprintf("%s:\n  defined at %s\n  used at %s",
-			types.ObjectString(obj, types.RelativeTo(pkg)),
-			fset.Position(obj.Pos()),
-			strings.Join(uses, ", "))
-		items = append(items, item)
-	}
-	sort.Strings(items) // sort by line:col, in effect
-	fmt.Println(strings.Join(items, "\n"))
-	fmt.Println()
-
-	fmt.Println("Types and Values of each expression:")
-	items = nil
-	for expr, tv := range info.Types {
-		var buf bytes.Buffer
-		posn := fset.Position(expr.Pos())
-		tvstr := tv.Type.String()
-		if tv.Value != nil {
-			tvstr += " = " + tv.Value.String()
-		}
-		// line:col | expr | mode : type = value
-		fmt.Fprintf(&buf, "%2d:%2d | %-19s | %-7s : %s",
-			posn.Line, posn.Column, exprString(fset, expr),
-			mode(tv), tvstr)
-		items = append(items, buf.String())
-	}
-	sort.Strings(items)
-	fmt.Println(strings.Join(items, "\n"))
-
-	// Output:
-	// InitOrder: [c = "hello" b = S(c) a = len(b)]
-	//
-	// Defs and Uses of each named object:
-	// builtin len:
-	//   defined at -
-	//   used at 6:15
-	// func fib(x int) int:
-	//   defined at fib.go:8:6
-	//   used at 12:20, 12:9
-	// type S string:
-	//   defined at fib.go:4:6
-	//   used at 6:23
-	// type int int:
-	//   defined at -
-	//   used at 8:12, 8:17
-	// type string string:
-	//   defined at -
-	//   used at 4:8
-	// var b S:
-	//   defined at fib.go:6:8
-	//   used at 6:19
-	// var c string:
-	//   defined at fib.go:6:11
-	//   used at 6:25
-	// var x int:
-	//   defined at fib.go:8:10
-	//   used at 10:10, 12:13, 12:24, 9:5
-	//
-	// Types and Values of each expression:
-	//  4: 8 | string              | type    : string
-	//  6:15 | len                 | builtin : func(string) int
-	//  6:15 | len(b)              | value   : int
-	//  6:19 | b                   | var     : fib.S
-	//  6:23 | S                   | type    : fib.S
-	//  6:23 | S(c)                | value   : fib.S
-	//  6:25 | c                   | var     : string
-	//  6:29 | "hello"             | value   : string = "hello"
-	//  8:12 | int                 | type    : int
-	//  8:17 | int                 | type    : int
-	//  9: 5 | x                   | var     : int
-	//  9: 5 | x < 2               | value   : untyped bool
-	//  9: 9 | 2                   | value   : int = 2
-	// 10:10 | x                   | var     : int
-	// 12: 9 | fib                 | value   : func(x int) int
-	// 12: 9 | fib(x - 1)          | value   : int
-	// 12: 9 | fib(x-1) - fib(x-2) | value   : int
-	// 12:13 | x                   | var     : int
-	// 12:13 | x - 1               | value   : int
-	// 12:15 | 1                   | value   : int = 1
-	// 12:20 | fib                 | value   : func(x int) int
-	// 12:20 | fib(x - 2)          | value   : int
-	// 12:24 | x                   | var     : int
-	// 12:24 | x - 2               | value   : int
-	// 12:26 | 2                   | value   : int = 2
-}
-
-func mode(tv types.TypeAndValue) string {
-	switch {
-	case tv.IsVoid():
-		return "void"
-	case tv.IsType():
-		return "type"
-	case tv.IsBuiltin():
-		return "builtin"
-	case tv.IsNil():
-		return "nil"
-	case tv.Assignable():
-		if tv.Addressable() {
-			return "var"
-		}
-		return "mapindex"
-	case tv.IsValue():
-		return "value"
-	default:
-		return "unknown"
-	}
-}
-
-func exprString(fset *token.FileSet, expr ast.Expr) string {
-	var buf bytes.Buffer
-	format.Node(&buf, fset, expr)
-	return buf.String()
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/expr.go b/third_party/gofrontend/libgo/go/go/types/expr.go
deleted file mode 100644
index 7d00dd5..0000000
--- a/third_party/gofrontend/libgo/go/go/types/expr.go
+++ /dev/null
@@ -1,1496 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements typechecking of expressions.
-
-package types
-
-import (
-	"fmt"
-	"go/ast"
-	"go/constant"
-	"go/token"
-	"math"
-)
-
-/*
-Basic algorithm:
-
-Expressions are checked recursively, top down. Expression checker functions
-are generally of the form:
-
-  func f(x *operand, e *ast.Expr, ...)
-
-where e is the expression to be checked, and x is the result of the check.
-The check performed by f may fail in which case x.mode == invalid, and
-related error messages will have been issued by f.
-
-If a hint argument is present, it is the composite literal element type
-of an outer composite literal; it is used to type-check composite literal
-elements that have no explicit type specification in the source
-(e.g.: []T{{...}, {...}}, the hint is the type T in this case).
-
-All expressions are checked via rawExpr, which dispatches according
-to expression kind. Upon returning, rawExpr is recording the types and
-constant values for all expressions that have an untyped type (those types
-may change on the way up in the expression tree). Usually these are constants,
-but the results of comparisons or non-constant shifts of untyped constants
-may also be untyped, but not constant.
-
-Untyped expressions may eventually become fully typed (i.e., not untyped),
-typically when the value is assigned to a variable, or is used otherwise.
-The updateExprType method is used to record this final type and update
-the recorded types: the type-checked expression tree is again traversed down,
-and the new type is propagated as needed. Untyped constant expression values
-that become fully typed must now be representable by the full type (constant
-sub-expression trees are left alone except for their roots). This mechanism
-ensures that a client sees the actual (run-time) type an untyped value would
-have. It also permits type-checking of lhs shift operands "as if the shift
-were not present": when updateExprType visits an untyped lhs shift operand
-and assigns it it's final type, that type must be an integer type, and a
-constant lhs must be representable as an integer.
-
-When an expression gets its final type, either on the way out from rawExpr,
-on the way down in updateExprType, or at the end of the type checker run,
-the type (and constant value, if any) is recorded via Info.Types, if present.
-*/
-
-type opPredicates map[token.Token]func(Type) bool
-
-var unaryOpPredicates = opPredicates{
-	token.ADD: isNumeric,
-	token.SUB: isNumeric,
-	token.XOR: isInteger,
-	token.NOT: isBoolean,
-}
-
-func (check *Checker) op(m opPredicates, x *operand, op token.Token) bool {
-	if pred := m[op]; pred != nil {
-		if !pred(x.typ) {
-			check.invalidOp(x.pos(), "operator %s not defined for %s", op, x)
-			return false
-		}
-	} else {
-		check.invalidAST(x.pos(), "unknown operator %s", op)
-		return false
-	}
-	return true
-}
-
-// The unary expression e may be nil. It's passed in for better error messages only.
-func (check *Checker) unary(x *operand, e *ast.UnaryExpr, op token.Token) {
-	switch op {
-	case token.AND:
-		// spec: "As an exception to the addressability
-		// requirement x may also be a composite literal."
-		if _, ok := unparen(x.expr).(*ast.CompositeLit); !ok && x.mode != variable {
-			check.invalidOp(x.pos(), "cannot take address of %s", x)
-			x.mode = invalid
-			return
-		}
-		x.mode = value
-		x.typ = &Pointer{base: x.typ}
-		return
-
-	case token.ARROW:
-		typ, ok := x.typ.Underlying().(*Chan)
-		if !ok {
-			check.invalidOp(x.pos(), "cannot receive from non-channel %s", x)
-			x.mode = invalid
-			return
-		}
-		if typ.dir == SendOnly {
-			check.invalidOp(x.pos(), "cannot receive from send-only channel %s", x)
-			x.mode = invalid
-			return
-		}
-		x.mode = commaok
-		x.typ = typ.elem
-		check.hasCallOrRecv = true
-		return
-	}
-
-	if !check.op(unaryOpPredicates, x, op) {
-		x.mode = invalid
-		return
-	}
-
-	if x.mode == constant_ {
-		typ := x.typ.Underlying().(*Basic)
-		var prec uint
-		if isUnsigned(typ) {
-			prec = uint(check.conf.sizeof(typ) * 8)
-		}
-		x.val = constant.UnaryOp(op, x.val, prec)
-		// Typed constants must be representable in
-		// their type after each constant operation.
-		if isTyped(typ) {
-			if e != nil {
-				x.expr = e // for better error message
-			}
-			check.representable(x, typ)
-		}
-		return
-	}
-
-	x.mode = value
-	// x.typ remains unchanged
-}
-
-func isShift(op token.Token) bool {
-	return op == token.SHL || op == token.SHR
-}
-
-func isComparison(op token.Token) bool {
-	// Note: tokens are not ordered well to make this much easier
-	switch op {
-	case token.EQL, token.NEQ, token.LSS, token.LEQ, token.GTR, token.GEQ:
-		return true
-	}
-	return false
-}
-
-func fitsFloat32(x constant.Value) bool {
-	f32, _ := constant.Float32Val(x)
-	f := float64(f32)
-	return !math.IsInf(f, 0)
-}
-
-func roundFloat32(x constant.Value) constant.Value {
-	f32, _ := constant.Float32Val(x)
-	f := float64(f32)
-	if !math.IsInf(f, 0) {
-		return constant.MakeFloat64(f)
-	}
-	return nil
-}
-
-func fitsFloat64(x constant.Value) bool {
-	f, _ := constant.Float64Val(x)
-	return !math.IsInf(f, 0)
-}
-
-func roundFloat64(x constant.Value) constant.Value {
-	f, _ := constant.Float64Val(x)
-	if !math.IsInf(f, 0) {
-		return constant.MakeFloat64(f)
-	}
-	return nil
-}
-
-// representableConst reports whether x can be represented as
-// value of the given basic type kind and for the configuration
-// provided (only needed for int/uint sizes).
-//
-// If rounded != nil, *rounded is set to the rounded value of x for
-// representable floating-point values; it is left alone otherwise.
-// It is ok to provide the addressof the first argument for rounded.
-func representableConst(x constant.Value, conf *Config, as BasicKind, rounded *constant.Value) bool {
-	switch x.Kind() {
-	case constant.Unknown:
-		return true
-
-	case constant.Bool:
-		return as == Bool || as == UntypedBool
-
-	case constant.Int:
-		if x, ok := constant.Int64Val(x); ok {
-			switch as {
-			case Int:
-				var s = uint(conf.sizeof(Typ[as])) * 8
-				return int64(-1)<<(s-1) <= x && x <= int64(1)<<(s-1)-1
-			case Int8:
-				const s = 8
-				return -1<<(s-1) <= x && x <= 1<<(s-1)-1
-			case Int16:
-				const s = 16
-				return -1<<(s-1) <= x && x <= 1<<(s-1)-1
-			case Int32:
-				const s = 32
-				return -1<<(s-1) <= x && x <= 1<<(s-1)-1
-			case Int64:
-				return true
-			case Uint, Uintptr:
-				if s := uint(conf.sizeof(Typ[as])) * 8; s < 64 {
-					return 0 <= x && x <= int64(1)<<s-1
-				}
-				return 0 <= x
-			case Uint8:
-				const s = 8
-				return 0 <= x && x <= 1<<s-1
-			case Uint16:
-				const s = 16
-				return 0 <= x && x <= 1<<s-1
-			case Uint32:
-				const s = 32
-				return 0 <= x && x <= 1<<s-1
-			case Uint64:
-				return 0 <= x
-			case Float32, Float64, Complex64, Complex128,
-				UntypedInt, UntypedFloat, UntypedComplex:
-				return true
-			}
-		}
-
-		n := constant.BitLen(x)
-		switch as {
-		case Uint, Uintptr:
-			var s = uint(conf.sizeof(Typ[as])) * 8
-			return constant.Sign(x) >= 0 && n <= int(s)
-		case Uint64:
-			return constant.Sign(x) >= 0 && n <= 64
-		case Float32, Complex64:
-			if rounded == nil {
-				return fitsFloat32(x)
-			}
-			r := roundFloat32(x)
-			if r != nil {
-				*rounded = r
-				return true
-			}
-		case Float64, Complex128:
-			if rounded == nil {
-				return fitsFloat64(x)
-			}
-			r := roundFloat64(x)
-			if r != nil {
-				*rounded = r
-				return true
-			}
-		case UntypedInt, UntypedFloat, UntypedComplex:
-			return true
-		}
-
-	case constant.Float:
-		switch as {
-		case Float32, Complex64:
-			if rounded == nil {
-				return fitsFloat32(x)
-			}
-			r := roundFloat32(x)
-			if r != nil {
-				*rounded = r
-				return true
-			}
-		case Float64, Complex128:
-			if rounded == nil {
-				return fitsFloat64(x)
-			}
-			r := roundFloat64(x)
-			if r != nil {
-				*rounded = r
-				return true
-			}
-		case UntypedFloat, UntypedComplex:
-			return true
-		}
-
-	case constant.Complex:
-		switch as {
-		case Complex64:
-			if rounded == nil {
-				return fitsFloat32(constant.Real(x)) && fitsFloat32(constant.Imag(x))
-			}
-			re := roundFloat32(constant.Real(x))
-			im := roundFloat32(constant.Imag(x))
-			if re != nil && im != nil {
-				*rounded = constant.BinaryOp(re, token.ADD, constant.MakeImag(im))
-				return true
-			}
-		case Complex128:
-			if rounded == nil {
-				return fitsFloat64(constant.Real(x)) && fitsFloat64(constant.Imag(x))
-			}
-			re := roundFloat64(constant.Real(x))
-			im := roundFloat64(constant.Imag(x))
-			if re != nil && im != nil {
-				*rounded = constant.BinaryOp(re, token.ADD, constant.MakeImag(im))
-				return true
-			}
-		case UntypedComplex:
-			return true
-		}
-
-	case constant.String:
-		return as == String || as == UntypedString
-
-	default:
-		unreachable()
-	}
-
-	return false
-}
-
-// representable checks that a constant operand is representable in the given basic type.
-func (check *Checker) representable(x *operand, typ *Basic) {
-	assert(x.mode == constant_)
-	if !representableConst(x.val, check.conf, typ.kind, &x.val) {
-		var msg string
-		if isNumeric(x.typ) && isNumeric(typ) {
-			// numeric conversion : error msg
-			//
-			// integer -> integer : overflows
-			// integer -> float   : overflows (actually not possible)
-			// float   -> integer : truncated
-			// float   -> float   : overflows
-			//
-			if !isInteger(x.typ) && isInteger(typ) {
-				msg = "%s truncated to %s"
-			} else {
-				msg = "%s overflows %s"
-			}
-		} else {
-			msg = "cannot convert %s to %s"
-		}
-		check.errorf(x.pos(), msg, x, typ)
-		x.mode = invalid
-	}
-}
-
-// updateExprType updates the type of x to typ and invokes itself
-// recursively for the operands of x, depending on expression kind.
-// If typ is still an untyped and not the final type, updateExprType
-// only updates the recorded untyped type for x and possibly its
-// operands. Otherwise (i.e., typ is not an untyped type anymore,
-// or it is the final type for x), the type and value are recorded.
-// Also, if x is a constant, it must be representable as a value of typ,
-// and if x is the (formerly untyped) lhs operand of a non-constant
-// shift, it must be an integer value.
-//
-func (check *Checker) updateExprType(x ast.Expr, typ Type, final bool) {
-	old, found := check.untyped[x]
-	if !found {
-		return // nothing to do
-	}
-
-	// update operands of x if necessary
-	switch x := x.(type) {
-	case *ast.BadExpr,
-		*ast.FuncLit,
-		*ast.CompositeLit,
-		*ast.IndexExpr,
-		*ast.SliceExpr,
-		*ast.TypeAssertExpr,
-		*ast.StarExpr,
-		*ast.KeyValueExpr,
-		*ast.ArrayType,
-		*ast.StructType,
-		*ast.FuncType,
-		*ast.InterfaceType,
-		*ast.MapType,
-		*ast.ChanType:
-		// These expression are never untyped - nothing to do.
-		// The respective sub-expressions got their final types
-		// upon assignment or use.
-		if debug {
-			check.dump("%s: found old type(%s): %s (new: %s)", x.Pos(), x, old.typ, typ)
-			unreachable()
-		}
-		return
-
-	case *ast.CallExpr:
-		// Resulting in an untyped constant (e.g., built-in complex).
-		// The respective calls take care of calling updateExprType
-		// for the arguments if necessary.
-
-	case *ast.Ident, *ast.BasicLit, *ast.SelectorExpr:
-		// An identifier denoting a constant, a constant literal,
-		// or a qualified identifier (imported untyped constant).
-		// No operands to take care of.
-
-	case *ast.ParenExpr:
-		check.updateExprType(x.X, typ, final)
-
-	case *ast.UnaryExpr:
-		// If x is a constant, the operands were constants.
-		// They don't need to be updated since they never
-		// get "materialized" into a typed value; and they
-		// will be processed at the end of the type check.
-		if old.val != nil {
-			break
-		}
-		check.updateExprType(x.X, typ, final)
-
-	case *ast.BinaryExpr:
-		if old.val != nil {
-			break // see comment for unary expressions
-		}
-		if isComparison(x.Op) {
-			// The result type is independent of operand types
-			// and the operand types must have final types.
-		} else if isShift(x.Op) {
-			// The result type depends only on lhs operand.
-			// The rhs type was updated when checking the shift.
-			check.updateExprType(x.X, typ, final)
-		} else {
-			// The operand types match the result type.
-			check.updateExprType(x.X, typ, final)
-			check.updateExprType(x.Y, typ, final)
-		}
-
-	default:
-		unreachable()
-	}
-
-	// If the new type is not final and still untyped, just
-	// update the recorded type.
-	if !final && isUntyped(typ) {
-		old.typ = typ.Underlying().(*Basic)
-		check.untyped[x] = old
-		return
-	}
-
-	// Otherwise we have the final (typed or untyped type).
-	// Remove it from the map of yet untyped expressions.
-	delete(check.untyped, x)
-
-	// If x is the lhs of a shift, its final type must be integer.
-	// We already know from the shift check that it is representable
-	// as an integer if it is a constant.
-	if old.isLhs && !isInteger(typ) {
-		check.invalidOp(x.Pos(), "shifted operand %s (type %s) must be integer", x, typ)
-		return
-	}
-
-	// Everything's fine, record final type and value for x.
-	check.recordTypeAndValue(x, old.mode, typ, old.val)
-}
-
-// updateExprVal updates the value of x to val.
-func (check *Checker) updateExprVal(x ast.Expr, val constant.Value) {
-	if info, ok := check.untyped[x]; ok {
-		info.val = val
-		check.untyped[x] = info
-	}
-}
-
-// convertUntyped attempts to set the type of an untyped value to the target type.
-func (check *Checker) convertUntyped(x *operand, target Type) {
-	if x.mode == invalid || isTyped(x.typ) || target == Typ[Invalid] {
-		return
-	}
-
-	// TODO(gri) Sloppy code - clean up. This function is central
-	//           to assignment and expression checking.
-
-	if isUntyped(target) {
-		// both x and target are untyped
-		xkind := x.typ.(*Basic).kind
-		tkind := target.(*Basic).kind
-		if isNumeric(x.typ) && isNumeric(target) {
-			if xkind < tkind {
-				x.typ = target
-				check.updateExprType(x.expr, target, false)
-			}
-		} else if xkind != tkind {
-			goto Error
-		}
-		return
-	}
-
-	// typed target
-	switch t := target.Underlying().(type) {
-	case *Basic:
-		if x.mode == constant_ {
-			check.representable(x, t)
-			if x.mode == invalid {
-				return
-			}
-			// expression value may have been rounded - update if needed
-			// TODO(gri) A floating-point value may silently underflow to
-			// zero. If it was negative, the sign is lost. See issue 6898.
-			check.updateExprVal(x.expr, x.val)
-		} else {
-			// Non-constant untyped values may appear as the
-			// result of comparisons (untyped bool), intermediate
-			// (delayed-checked) rhs operands of shifts, and as
-			// the value nil.
-			switch x.typ.(*Basic).kind {
-			case UntypedBool:
-				if !isBoolean(target) {
-					goto Error
-				}
-			case UntypedInt, UntypedRune, UntypedFloat, UntypedComplex:
-				if !isNumeric(target) {
-					goto Error
-				}
-			case UntypedString:
-				// Non-constant untyped string values are not
-				// permitted by the spec and should not occur.
-				unreachable()
-			case UntypedNil:
-				// Unsafe.Pointer is a basic type that includes nil.
-				if !hasNil(target) {
-					goto Error
-				}
-			default:
-				goto Error
-			}
-		}
-	case *Interface:
-		if !x.isNil() && !t.Empty() /* empty interfaces are ok */ {
-			goto Error
-		}
-		// Update operand types to the default type rather then
-		// the target (interface) type: values must have concrete
-		// dynamic types. If the value is nil, keep it untyped
-		// (this is important for tools such as go vet which need
-		// the dynamic type for argument checking of say, print
-		// functions)
-		if x.isNil() {
-			target = Typ[UntypedNil]
-		} else {
-			// cannot assign untyped values to non-empty interfaces
-			if !t.Empty() {
-				goto Error
-			}
-			target = defaultType(x.typ)
-		}
-	case *Pointer, *Signature, *Slice, *Map, *Chan:
-		if !x.isNil() {
-			goto Error
-		}
-		// keep nil untyped - see comment for interfaces, above
-		target = Typ[UntypedNil]
-	default:
-		goto Error
-	}
-
-	x.typ = target
-	check.updateExprType(x.expr, target, true) // UntypedNils are final
-	return
-
-Error:
-	check.errorf(x.pos(), "cannot convert %s to %s", x, target)
-	x.mode = invalid
-}
-
-func (check *Checker) comparison(x, y *operand, op token.Token) {
-	// spec: "In any comparison, the first operand must be assignable
-	// to the type of the second operand, or vice versa."
-	err := ""
-	if x.assignableTo(check.conf, y.typ) || y.assignableTo(check.conf, x.typ) {
-		defined := false
-		switch op {
-		case token.EQL, token.NEQ:
-			// spec: "The equality operators == and != apply to operands that are comparable."
-			defined = Comparable(x.typ) || x.isNil() && hasNil(y.typ) || y.isNil() && hasNil(x.typ)
-		case token.LSS, token.LEQ, token.GTR, token.GEQ:
-			// spec: The ordering operators <, <=, >, and >= apply to operands that are ordered."
-			defined = isOrdered(x.typ)
-		default:
-			unreachable()
-		}
-		if !defined {
-			typ := x.typ
-			if x.isNil() {
-				typ = y.typ
-			}
-			err = check.sprintf("operator %s not defined for %s", op, typ)
-		}
-	} else {
-		err = check.sprintf("mismatched types %s and %s", x.typ, y.typ)
-	}
-
-	if err != "" {
-		check.errorf(x.pos(), "cannot compare %s %s %s (%s)", x.expr, op, y.expr, err)
-		x.mode = invalid
-		return
-	}
-
-	if x.mode == constant_ && y.mode == constant_ {
-		x.val = constant.MakeBool(constant.Compare(x.val, op, y.val))
-		// The operands are never materialized; no need to update
-		// their types.
-	} else {
-		x.mode = value
-		// The operands have now their final types, which at run-
-		// time will be materialized. Update the expression trees.
-		// If the current types are untyped, the materialized type
-		// is the respective default type.
-		check.updateExprType(x.expr, defaultType(x.typ), true)
-		check.updateExprType(y.expr, defaultType(y.typ), true)
-	}
-
-	// spec: "Comparison operators compare two operands and yield
-	//        an untyped boolean value."
-	x.typ = Typ[UntypedBool]
-}
-
-func (check *Checker) shift(x, y *operand, op token.Token) {
-	untypedx := isUntyped(x.typ)
-
-	// The lhs must be of integer type or be representable
-	// as an integer; otherwise the shift has no chance.
-	if !x.isInteger() {
-		check.invalidOp(x.pos(), "shifted operand %s must be integer", x)
-		x.mode = invalid
-		return
-	}
-
-	// spec: "The right operand in a shift expression must have unsigned
-	// integer type or be an untyped constant that can be converted to
-	// unsigned integer type."
-	switch {
-	case isInteger(y.typ) && isUnsigned(y.typ):
-		// nothing to do
-	case isUntyped(y.typ):
-		check.convertUntyped(y, Typ[UntypedInt])
-		if y.mode == invalid {
-			x.mode = invalid
-			return
-		}
-	default:
-		check.invalidOp(y.pos(), "shift count %s must be unsigned integer", y)
-		x.mode = invalid
-		return
-	}
-
-	if x.mode == constant_ {
-		if y.mode == constant_ {
-			// rhs must be an integer value
-			if !y.isInteger() {
-				check.invalidOp(y.pos(), "shift count %s must be unsigned integer", y)
-				x.mode = invalid
-				return
-			}
-			// rhs must be within reasonable bounds
-			const stupidShift = 1023 - 1 + 52 // so we can express smallestFloat64
-			s, ok := constant.Uint64Val(y.val)
-			if !ok || s > stupidShift {
-				check.invalidOp(y.pos(), "stupid shift count %s", y)
-				x.mode = invalid
-				return
-			}
-			// The lhs is representable as an integer but may not be an integer
-			// (e.g., 2.0, an untyped float) - this can only happen for untyped
-			// non-integer numeric constants. Correct the type so that the shift
-			// result is of integer type.
-			if !isInteger(x.typ) {
-				x.typ = Typ[UntypedInt]
-			}
-			x.val = constant.Shift(x.val, op, uint(s))
-			return
-		}
-
-		// non-constant shift with constant lhs
-		if untypedx {
-			// spec: "If the left operand of a non-constant shift
-			// expression is an untyped constant, the type of the
-			// constant is what it would be if the shift expression
-			// were replaced by its left operand alone.".
-			//
-			// Delay operand checking until we know the final type:
-			// The lhs expression must be in the untyped map, mark
-			// the entry as lhs shift operand.
-			info, found := check.untyped[x.expr]
-			assert(found)
-			info.isLhs = true
-			check.untyped[x.expr] = info
-			// keep x's type
-			x.mode = value
-			return
-		}
-	}
-
-	// constant rhs must be >= 0
-	if y.mode == constant_ && constant.Sign(y.val) < 0 {
-		check.invalidOp(y.pos(), "shift count %s must not be negative", y)
-	}
-
-	// non-constant shift - lhs must be an integer
-	if !isInteger(x.typ) {
-		check.invalidOp(x.pos(), "shifted operand %s must be integer", x)
-		x.mode = invalid
-		return
-	}
-
-	x.mode = value
-}
-
-var binaryOpPredicates = opPredicates{
-	token.ADD: func(typ Type) bool { return isNumeric(typ) || isString(typ) },
-	token.SUB: isNumeric,
-	token.MUL: isNumeric,
-	token.QUO: isNumeric,
-	token.REM: isInteger,
-
-	token.AND:     isInteger,
-	token.OR:      isInteger,
-	token.XOR:     isInteger,
-	token.AND_NOT: isInteger,
-
-	token.LAND: isBoolean,
-	token.LOR:  isBoolean,
-}
-
-// The binary expression e may be nil. It's passed in for better error messages only.
-func (check *Checker) binary(x *operand, e *ast.BinaryExpr, lhs, rhs ast.Expr, op token.Token) {
-	var y operand
-
-	check.expr(x, lhs)
-	check.expr(&y, rhs)
-
-	if x.mode == invalid {
-		return
-	}
-	if y.mode == invalid {
-		x.mode = invalid
-		x.expr = y.expr
-		return
-	}
-
-	if isShift(op) {
-		check.shift(x, &y, op)
-		return
-	}
-
-	check.convertUntyped(x, y.typ)
-	if x.mode == invalid {
-		return
-	}
-	check.convertUntyped(&y, x.typ)
-	if y.mode == invalid {
-		x.mode = invalid
-		return
-	}
-
-	if isComparison(op) {
-		check.comparison(x, &y, op)
-		return
-	}
-
-	if !Identical(x.typ, y.typ) {
-		// only report an error if we have valid types
-		// (otherwise we had an error reported elsewhere already)
-		if x.typ != Typ[Invalid] && y.typ != Typ[Invalid] {
-			check.invalidOp(x.pos(), "mismatched types %s and %s", x.typ, y.typ)
-		}
-		x.mode = invalid
-		return
-	}
-
-	if !check.op(binaryOpPredicates, x, op) {
-		x.mode = invalid
-		return
-	}
-
-	if (op == token.QUO || op == token.REM) && (x.mode == constant_ || isInteger(x.typ)) && y.mode == constant_ && constant.Sign(y.val) == 0 {
-		check.invalidOp(y.pos(), "division by zero")
-		x.mode = invalid
-		return
-	}
-
-	if x.mode == constant_ && y.mode == constant_ {
-		typ := x.typ.Underlying().(*Basic)
-		// force integer division of integer operands
-		if op == token.QUO && isInteger(typ) {
-			op = token.QUO_ASSIGN
-		}
-		x.val = constant.BinaryOp(x.val, op, y.val)
-		// Typed constants must be representable in
-		// their type after each constant operation.
-		if isTyped(typ) {
-			if e != nil {
-				x.expr = e // for better error message
-			}
-			check.representable(x, typ)
-		}
-		return
-	}
-
-	x.mode = value
-	// x.typ is unchanged
-}
-
-// index checks an index expression for validity.
-// If max >= 0, it is the upper bound for index.
-// If index is valid and the result i >= 0, then i is the constant value of index.
-func (check *Checker) index(index ast.Expr, max int64) (i int64, valid bool) {
-	var x operand
-	check.expr(&x, index)
-	if x.mode == invalid {
-		return
-	}
-
-	// an untyped constant must be representable as Int
-	check.convertUntyped(&x, Typ[Int])
-	if x.mode == invalid {
-		return
-	}
-
-	// the index must be of integer type
-	if !isInteger(x.typ) {
-		check.invalidArg(x.pos(), "index %s must be integer", &x)
-		return
-	}
-
-	// a constant index i must be in bounds
-	if x.mode == constant_ {
-		if constant.Sign(x.val) < 0 {
-			check.invalidArg(x.pos(), "index %s must not be negative", &x)
-			return
-		}
-		i, valid = constant.Int64Val(x.val)
-		if !valid || max >= 0 && i >= max {
-			check.errorf(x.pos(), "index %s is out of bounds", &x)
-			return i, false
-		}
-		// 0 <= i [ && i < max ]
-		return i, true
-	}
-
-	return -1, true
-}
-
-// indexElts checks the elements (elts) of an array or slice composite literal
-// against the literal's element type (typ), and the element indices against
-// the literal length if known (length >= 0). It returns the length of the
-// literal (maximum index value + 1).
-//
-func (check *Checker) indexedElts(elts []ast.Expr, typ Type, length int64) int64 {
-	visited := make(map[int64]bool, len(elts))
-	var index, max int64
-	for _, e := range elts {
-		// determine and check index
-		validIndex := false
-		eval := e
-		if kv, _ := e.(*ast.KeyValueExpr); kv != nil {
-			if i, ok := check.index(kv.Key, length); ok {
-				if i >= 0 {
-					index = i
-					validIndex = true
-				} else {
-					check.errorf(e.Pos(), "index %s must be integer constant", kv.Key)
-				}
-			}
-			eval = kv.Value
-		} else if length >= 0 && index >= length {
-			check.errorf(e.Pos(), "index %d is out of bounds (>= %d)", index, length)
-		} else {
-			validIndex = true
-		}
-
-		// if we have a valid index, check for duplicate entries
-		if validIndex {
-			if visited[index] {
-				check.errorf(e.Pos(), "duplicate index %d in array or slice literal", index)
-			}
-			visited[index] = true
-		}
-		index++
-		if index > max {
-			max = index
-		}
-
-		// check element against composite literal element type
-		var x operand
-		check.exprWithHint(&x, eval, typ)
-		if !check.assignment(&x, typ) && x.mode != invalid {
-			check.errorf(x.pos(), "cannot use %s as %s value in array or slice literal", &x, typ)
-		}
-	}
-	return max
-}
-
-// exprKind describes the kind of an expression; the kind
-// determines if an expression is valid in 'statement context'.
-type exprKind int
-
-const (
-	conversion exprKind = iota
-	expression
-	statement
-)
-
-// rawExpr typechecks expression e and initializes x with the expression
-// value or type. If an error occurred, x.mode is set to invalid.
-// If hint != nil, it is the type of a composite literal element.
-//
-func (check *Checker) rawExpr(x *operand, e ast.Expr, hint Type) exprKind {
-	if trace {
-		check.trace(e.Pos(), "%s", e)
-		check.indent++
-		defer func() {
-			check.indent--
-			check.trace(e.Pos(), "=> %s", x)
-		}()
-	}
-
-	kind := check.exprInternal(x, e, hint)
-
-	// convert x into a user-friendly set of values
-	// TODO(gri) this code can be simplified
-	var typ Type
-	var val constant.Value
-	switch x.mode {
-	case invalid:
-		typ = Typ[Invalid]
-	case novalue:
-		typ = (*Tuple)(nil)
-	case constant_:
-		typ = x.typ
-		val = x.val
-	default:
-		typ = x.typ
-	}
-	assert(x.expr != nil && typ != nil)
-
-	if isUntyped(typ) {
-		// delay type and value recording until we know the type
-		// or until the end of type checking
-		check.rememberUntyped(x.expr, false, x.mode, typ.(*Basic), val)
-	} else {
-		check.recordTypeAndValue(e, x.mode, typ, val)
-	}
-
-	return kind
-}
-
-// exprInternal contains the core of type checking of expressions.
-// Must only be called by rawExpr.
-//
-func (check *Checker) exprInternal(x *operand, e ast.Expr, hint Type) exprKind {
-	// make sure x has a valid state in case of bailout
-	// (was issue 5770)
-	x.mode = invalid
-	x.typ = Typ[Invalid]
-
-	switch e := e.(type) {
-	case *ast.BadExpr:
-		goto Error // error was reported before
-
-	case *ast.Ident:
-		check.ident(x, e, nil, nil)
-
-	case *ast.Ellipsis:
-		// ellipses are handled explicitly where they are legal
-		// (array composite literals and parameter lists)
-		check.error(e.Pos(), "invalid use of '...'")
-		goto Error
-
-	case *ast.BasicLit:
-		x.setConst(e.Kind, e.Value)
-		if x.mode == invalid {
-			check.invalidAST(e.Pos(), "invalid literal %v", e.Value)
-			goto Error
-		}
-
-	case *ast.FuncLit:
-		if sig, ok := check.typ(e.Type).(*Signature); ok {
-			// Anonymous functions are considered part of the
-			// init expression/func declaration which contains
-			// them: use existing package-level declaration info.
-			check.funcBody(check.decl, "", sig, e.Body)
-			x.mode = value
-			x.typ = sig
-		} else {
-			check.invalidAST(e.Pos(), "invalid function literal %s", e)
-			goto Error
-		}
-
-	case *ast.CompositeLit:
-		typ := hint
-		openArray := false
-		if e.Type != nil {
-			// [...]T array types may only appear with composite literals.
-			// Check for them here so we don't have to handle ... in general.
-			typ = nil
-			if atyp, _ := e.Type.(*ast.ArrayType); atyp != nil && atyp.Len != nil {
-				if ellip, _ := atyp.Len.(*ast.Ellipsis); ellip != nil && ellip.Elt == nil {
-					// We have an "open" [...]T array type.
-					// Create a new ArrayType with unknown length (-1)
-					// and finish setting it up after analyzing the literal.
-					typ = &Array{len: -1, elem: check.typ(atyp.Elt)}
-					openArray = true
-				}
-			}
-			if typ == nil {
-				typ = check.typ(e.Type)
-			}
-		}
-		if typ == nil {
-			// TODO(gri) provide better error messages depending on context
-			check.error(e.Pos(), "missing type in composite literal")
-			goto Error
-		}
-
-		switch typ, _ := deref(typ); utyp := typ.Underlying().(type) {
-		case *Struct:
-			if len(e.Elts) == 0 {
-				break
-			}
-			fields := utyp.fields
-			if _, ok := e.Elts[0].(*ast.KeyValueExpr); ok {
-				// all elements must have keys
-				visited := make([]bool, len(fields))
-				for _, e := range e.Elts {
-					kv, _ := e.(*ast.KeyValueExpr)
-					if kv == nil {
-						check.error(e.Pos(), "mixture of field:value and value elements in struct literal")
-						continue
-					}
-					key, _ := kv.Key.(*ast.Ident)
-					if key == nil {
-						check.errorf(kv.Pos(), "invalid field name %s in struct literal", kv.Key)
-						continue
-					}
-					i := fieldIndex(utyp.fields, check.pkg, key.Name)
-					if i < 0 {
-						check.errorf(kv.Pos(), "unknown field %s in struct literal", key.Name)
-						continue
-					}
-					fld := fields[i]
-					check.recordUse(key, fld)
-					// 0 <= i < len(fields)
-					if visited[i] {
-						check.errorf(kv.Pos(), "duplicate field name %s in struct literal", key.Name)
-						continue
-					}
-					visited[i] = true
-					check.expr(x, kv.Value)
-					etyp := fld.typ
-					if !check.assignment(x, etyp) {
-						if x.mode != invalid {
-							check.errorf(x.pos(), "cannot use %s as %s value in struct literal", x, etyp)
-						}
-						continue
-					}
-				}
-			} else {
-				// no element must have a key
-				for i, e := range e.Elts {
-					if kv, _ := e.(*ast.KeyValueExpr); kv != nil {
-						check.error(kv.Pos(), "mixture of field:value and value elements in struct literal")
-						continue
-					}
-					check.expr(x, e)
-					if i >= len(fields) {
-						check.error(x.pos(), "too many values in struct literal")
-						break // cannot continue
-					}
-					// i < len(fields)
-					fld := fields[i]
-					if !fld.Exported() && fld.pkg != check.pkg {
-						check.errorf(x.pos(), "implicit assignment to unexported field %s in %s literal", fld.name, typ)
-						continue
-					}
-					etyp := fld.typ
-					if !check.assignment(x, etyp) {
-						if x.mode != invalid {
-							check.errorf(x.pos(), "cannot use %s as %s value in struct literal", x, etyp)
-						}
-						continue
-					}
-				}
-				if len(e.Elts) < len(fields) {
-					check.error(e.Rbrace, "too few values in struct literal")
-					// ok to continue
-				}
-			}
-
-		case *Array:
-			n := check.indexedElts(e.Elts, utyp.elem, utyp.len)
-			// if we have an "open" [...]T array, set the length now that we know it
-			if openArray {
-				utyp.len = n
-			}
-
-		case *Slice:
-			check.indexedElts(e.Elts, utyp.elem, -1)
-
-		case *Map:
-			visited := make(map[interface{}][]Type, len(e.Elts))
-			for _, e := range e.Elts {
-				kv, _ := e.(*ast.KeyValueExpr)
-				if kv == nil {
-					check.error(e.Pos(), "missing key in map literal")
-					continue
-				}
-				check.exprWithHint(x, kv.Key, utyp.key)
-				if !check.assignment(x, utyp.key) {
-					if x.mode != invalid {
-						check.errorf(x.pos(), "cannot use %s as %s key in map literal", x, utyp.key)
-					}
-					continue
-				}
-				if x.mode == constant_ {
-					duplicate := false
-					// if the key is of interface type, the type is also significant when checking for duplicates
-					if _, ok := utyp.key.Underlying().(*Interface); ok {
-						for _, vtyp := range visited[x.val] {
-							if Identical(vtyp, x.typ) {
-								duplicate = true
-								break
-							}
-						}
-						visited[x.val] = append(visited[x.val], x.typ)
-					} else {
-						_, duplicate = visited[x.val]
-						visited[x.val] = nil
-					}
-					if duplicate {
-						check.errorf(x.pos(), "duplicate key %s in map literal", x.val)
-						continue
-					}
-				}
-				check.exprWithHint(x, kv.Value, utyp.elem)
-				if !check.assignment(x, utyp.elem) {
-					if x.mode != invalid {
-						check.errorf(x.pos(), "cannot use %s as %s value in map literal", x, utyp.elem)
-					}
-					continue
-				}
-			}
-
-		default:
-			// if utyp is invalid, an error was reported before
-			if utyp != Typ[Invalid] {
-				check.errorf(e.Pos(), "invalid composite literal type %s", typ)
-				goto Error
-			}
-		}
-
-		x.mode = value
-		x.typ = typ
-
-	case *ast.ParenExpr:
-		kind := check.rawExpr(x, e.X, nil)
-		x.expr = e
-		return kind
-
-	case *ast.SelectorExpr:
-		check.selector(x, e)
-
-	case *ast.IndexExpr:
-		check.expr(x, e.X)
-		if x.mode == invalid {
-			goto Error
-		}
-
-		valid := false
-		length := int64(-1) // valid if >= 0
-		switch typ := x.typ.Underlying().(type) {
-		case *Basic:
-			if isString(typ) {
-				valid = true
-				if x.mode == constant_ {
-					length = int64(len(constant.StringVal(x.val)))
-				}
-				// an indexed string always yields a byte value
-				// (not a constant) even if the string and the
-				// index are constant
-				x.mode = value
-				x.typ = universeByte // use 'byte' name
-			}
-
-		case *Array:
-			valid = true
-			length = typ.len
-			if x.mode != variable {
-				x.mode = value
-			}
-			x.typ = typ.elem
-
-		case *Pointer:
-			if typ, _ := typ.base.Underlying().(*Array); typ != nil {
-				valid = true
-				length = typ.len
-				x.mode = variable
-				x.typ = typ.elem
-			}
-
-		case *Slice:
-			valid = true
-			x.mode = variable
-			x.typ = typ.elem
-
-		case *Map:
-			var key operand
-			check.expr(&key, e.Index)
-			if !check.assignment(&key, typ.key) {
-				if key.mode != invalid {
-					check.invalidOp(key.pos(), "cannot use %s as map index of type %s", &key, typ.key)
-				}
-				goto Error
-			}
-			x.mode = mapindex
-			x.typ = typ.elem
-			x.expr = e
-			return expression
-		}
-
-		if !valid {
-			check.invalidOp(x.pos(), "cannot index %s", x)
-			goto Error
-		}
-
-		if e.Index == nil {
-			check.invalidAST(e.Pos(), "missing index for %s", x)
-			goto Error
-		}
-
-		check.index(e.Index, length)
-		// ok to continue
-
-	case *ast.SliceExpr:
-		check.expr(x, e.X)
-		if x.mode == invalid {
-			goto Error
-		}
-
-		valid := false
-		length := int64(-1) // valid if >= 0
-		switch typ := x.typ.Underlying().(type) {
-		case *Basic:
-			if isString(typ) {
-				if slice3(e) {
-					check.invalidOp(x.pos(), "3-index slice of string")
-					goto Error
-				}
-				valid = true
-				if x.mode == constant_ {
-					length = int64(len(constant.StringVal(x.val)))
-				}
-				// spec: "For untyped string operands the result
-				// is a non-constant value of type string."
-				if typ.kind == UntypedString {
-					x.typ = Typ[String]
-				}
-			}
-
-		case *Array:
-			valid = true
-			length = typ.len
-			if x.mode != variable {
-				check.invalidOp(x.pos(), "cannot slice %s (value not addressable)", x)
-				goto Error
-			}
-			x.typ = &Slice{elem: typ.elem}
-
-		case *Pointer:
-			if typ, _ := typ.base.Underlying().(*Array); typ != nil {
-				valid = true
-				length = typ.len
-				x.typ = &Slice{elem: typ.elem}
-			}
-
-		case *Slice:
-			valid = true
-			// x.typ doesn't change
-		}
-
-		if !valid {
-			check.invalidOp(x.pos(), "cannot slice %s", x)
-			goto Error
-		}
-
-		x.mode = value
-
-		// spec: "Only the first index may be omitted; it defaults to 0."
-		if slice3(e) && (e.High == nil || sliceMax(e) == nil) {
-			check.error(e.Rbrack, "2nd and 3rd index required in 3-index slice")
-			goto Error
-		}
-
-		// check indices
-		var ind [3]int64
-		for i, expr := range []ast.Expr{e.Low, e.High, sliceMax(e)} {
-			x := int64(-1)
-			switch {
-			case expr != nil:
-				// The "capacity" is only known statically for strings, arrays,
-				// and pointers to arrays, and it is the same as the length for
-				// those types.
-				max := int64(-1)
-				if length >= 0 {
-					max = length + 1
-				}
-				if t, ok := check.index(expr, max); ok && t >= 0 {
-					x = t
-				}
-			case i == 0:
-				// default is 0 for the first index
-				x = 0
-			case length >= 0:
-				// default is length (== capacity) otherwise
-				x = length
-			}
-			ind[i] = x
-		}
-
-		// constant indices must be in range
-		// (check.index already checks that existing indices >= 0)
-	L:
-		for i, x := range ind[:len(ind)-1] {
-			if x > 0 {
-				for _, y := range ind[i+1:] {
-					if y >= 0 && x > y {
-						check.errorf(e.Rbrack, "invalid slice indices: %d > %d", x, y)
-						break L // only report one error, ok to continue
-					}
-				}
-			}
-		}
-
-	case *ast.TypeAssertExpr:
-		check.expr(x, e.X)
-		if x.mode == invalid {
-			goto Error
-		}
-		xtyp, _ := x.typ.Underlying().(*Interface)
-		if xtyp == nil {
-			check.invalidOp(x.pos(), "%s is not an interface", x)
-			goto Error
-		}
-		// x.(type) expressions are handled explicitly in type switches
-		if e.Type == nil {
-			check.invalidAST(e.Pos(), "use of .(type) outside type switch")
-			goto Error
-		}
-		T := check.typ(e.Type)
-		if T == Typ[Invalid] {
-			goto Error
-		}
-		check.typeAssertion(x.pos(), x, xtyp, T)
-		x.mode = commaok
-		x.typ = T
-
-	case *ast.CallExpr:
-		return check.call(x, e)
-
-	case *ast.StarExpr:
-		check.exprOrType(x, e.X)
-		switch x.mode {
-		case invalid:
-			goto Error
-		case typexpr:
-			x.typ = &Pointer{base: x.typ}
-		default:
-			if typ, ok := x.typ.Underlying().(*Pointer); ok {
-				x.mode = variable
-				x.typ = typ.base
-			} else {
-				check.invalidOp(x.pos(), "cannot indirect %s", x)
-				goto Error
-			}
-		}
-
-	case *ast.UnaryExpr:
-		check.expr(x, e.X)
-		if x.mode == invalid {
-			goto Error
-		}
-		check.unary(x, e, e.Op)
-		if x.mode == invalid {
-			goto Error
-		}
-		if e.Op == token.ARROW {
-			x.expr = e
-			return statement // receive operations may appear in statement context
-		}
-
-	case *ast.BinaryExpr:
-		check.binary(x, e, e.X, e.Y, e.Op)
-		if x.mode == invalid {
-			goto Error
-		}
-
-	case *ast.KeyValueExpr:
-		// key:value expressions are handled in composite literals
-		check.invalidAST(e.Pos(), "no key:value expected")
-		goto Error
-
-	case *ast.ArrayType, *ast.StructType, *ast.FuncType,
-		*ast.InterfaceType, *ast.MapType, *ast.ChanType:
-		x.mode = typexpr
-		x.typ = check.typ(e)
-		// Note: rawExpr (caller of exprInternal) will call check.recordTypeAndValue
-		// even though check.typ has already called it. This is fine as both
-		// times the same expression and type are recorded. It is also not a
-		// performance issue because we only reach here for composite literal
-		// types, which are comparatively rare.
-
-	default:
-		panic(fmt.Sprintf("%s: unknown expression type %T", check.fset.Position(e.Pos()), e))
-	}
-
-	// everything went well
-	x.expr = e
-	return expression
-
-Error:
-	x.mode = invalid
-	x.expr = e
-	return statement // avoid follow-up errors
-}
-
-// typeAssertion checks that x.(T) is legal; xtyp must be the type of x.
-func (check *Checker) typeAssertion(pos token.Pos, x *operand, xtyp *Interface, T Type) {
-	method, wrongType := assertableTo(xtyp, T)
-	if method == nil {
-		return
-	}
-
-	var msg string
-	if wrongType {
-		msg = "wrong type for method"
-	} else {
-		msg = "missing method"
-	}
-	check.errorf(pos, "%s cannot have dynamic type %s (%s %s)", x, T, msg, method.name)
-}
-
-// expr typechecks expression e and initializes x with the expression value.
-// If an error occurred, x.mode is set to invalid.
-//
-func (check *Checker) expr(x *operand, e ast.Expr) {
-	check.rawExpr(x, e, nil)
-	var msg string
-	switch x.mode {
-	default:
-		return
-	case novalue:
-		msg = "used as value"
-	case builtin:
-		msg = "must be called"
-	case typexpr:
-		msg = "is not an expression"
-	}
-	check.errorf(x.pos(), "%s %s", x, msg)
-	x.mode = invalid
-}
-
-// exprWithHint typechecks expression e and initializes x with the expression value.
-// If an error occurred, x.mode is set to invalid.
-// If hint != nil, it is the type of a composite literal element.
-//
-func (check *Checker) exprWithHint(x *operand, e ast.Expr, hint Type) {
-	assert(hint != nil)
-	check.rawExpr(x, e, hint)
-	var msg string
-	switch x.mode {
-	default:
-		return
-	case novalue:
-		msg = "used as value"
-	case builtin:
-		msg = "must be called"
-	case typexpr:
-		msg = "is not an expression"
-	}
-	check.errorf(x.pos(), "%s %s", x, msg)
-	x.mode = invalid
-}
-
-// exprOrType typechecks expression or type e and initializes x with the expression value or type.
-// If an error occurred, x.mode is set to invalid.
-//
-func (check *Checker) exprOrType(x *operand, e ast.Expr) {
-	check.rawExpr(x, e, nil)
-	if x.mode == novalue {
-		check.errorf(x.pos(), "%s used as value or type", x)
-		x.mode = invalid
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/exprstring.go b/third_party/gofrontend/libgo/go/go/types/exprstring.go
deleted file mode 100644
index 370bdf3..0000000
--- a/third_party/gofrontend/libgo/go/go/types/exprstring.go
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements printing of expressions.
-
-package types
-
-import (
-	"bytes"
-	"go/ast"
-)
-
-// ExprString returns the (possibly simplified) string representation for x.
-func ExprString(x ast.Expr) string {
-	var buf bytes.Buffer
-	WriteExpr(&buf, x)
-	return buf.String()
-}
-
-// WriteExpr writes the (possibly simplified) string representation for x to buf.
-func WriteExpr(buf *bytes.Buffer, x ast.Expr) {
-	// The AST preserves source-level parentheses so there is
-	// no need to introduce them here to correct for different
-	// operator precedences. (This assumes that the AST was
-	// generated by a Go parser.)
-
-	switch x := x.(type) {
-	default:
-		buf.WriteString("(bad expr)") // nil, ast.BadExpr, ast.KeyValueExpr
-
-	case *ast.Ident:
-		buf.WriteString(x.Name)
-
-	case *ast.Ellipsis:
-		buf.WriteString("...")
-		if x.Elt != nil {
-			WriteExpr(buf, x.Elt)
-		}
-
-	case *ast.BasicLit:
-		buf.WriteString(x.Value)
-
-	case *ast.FuncLit:
-		buf.WriteByte('(')
-		WriteExpr(buf, x.Type)
-		buf.WriteString(" literal)") // simplified
-
-	case *ast.CompositeLit:
-		buf.WriteByte('(')
-		WriteExpr(buf, x.Type)
-		buf.WriteString(" literal)") // simplified
-
-	case *ast.ParenExpr:
-		buf.WriteByte('(')
-		WriteExpr(buf, x.X)
-		buf.WriteByte(')')
-
-	case *ast.SelectorExpr:
-		WriteExpr(buf, x.X)
-		buf.WriteByte('.')
-		buf.WriteString(x.Sel.Name)
-
-	case *ast.IndexExpr:
-		WriteExpr(buf, x.X)
-		buf.WriteByte('[')
-		WriteExpr(buf, x.Index)
-		buf.WriteByte(']')
-
-	case *ast.SliceExpr:
-		WriteExpr(buf, x.X)
-		buf.WriteByte('[')
-		if x.Low != nil {
-			WriteExpr(buf, x.Low)
-		}
-		buf.WriteByte(':')
-		if x.High != nil {
-			WriteExpr(buf, x.High)
-		}
-		if x.Slice3 {
-			buf.WriteByte(':')
-			if x.Max != nil {
-				WriteExpr(buf, x.Max)
-			}
-		}
-		buf.WriteByte(']')
-
-	case *ast.TypeAssertExpr:
-		WriteExpr(buf, x.X)
-		buf.WriteString(".(")
-		WriteExpr(buf, x.Type)
-		buf.WriteByte(')')
-
-	case *ast.CallExpr:
-		WriteExpr(buf, x.Fun)
-		buf.WriteByte('(')
-		for i, arg := range x.Args {
-			if i > 0 {
-				buf.WriteString(", ")
-			}
-			WriteExpr(buf, arg)
-		}
-		if x.Ellipsis.IsValid() {
-			buf.WriteString("...")
-		}
-		buf.WriteByte(')')
-
-	case *ast.StarExpr:
-		buf.WriteByte('*')
-		WriteExpr(buf, x.X)
-
-	case *ast.UnaryExpr:
-		buf.WriteString(x.Op.String())
-		WriteExpr(buf, x.X)
-
-	case *ast.BinaryExpr:
-		WriteExpr(buf, x.X)
-		buf.WriteByte(' ')
-		buf.WriteString(x.Op.String())
-		buf.WriteByte(' ')
-		WriteExpr(buf, x.Y)
-
-	case *ast.ArrayType:
-		buf.WriteByte('[')
-		if x.Len != nil {
-			WriteExpr(buf, x.Len)
-		}
-		buf.WriteByte(']')
-		WriteExpr(buf, x.Elt)
-
-	case *ast.StructType:
-		buf.WriteString("struct{")
-		writeFieldList(buf, x.Fields, "; ", false)
-		buf.WriteByte('}')
-
-	case *ast.FuncType:
-		buf.WriteString("func")
-		writeSigExpr(buf, x)
-
-	case *ast.InterfaceType:
-		buf.WriteString("interface{")
-		writeFieldList(buf, x.Methods, "; ", true)
-		buf.WriteByte('}')
-
-	case *ast.MapType:
-		buf.WriteString("map[")
-		WriteExpr(buf, x.Key)
-		buf.WriteByte(']')
-		WriteExpr(buf, x.Value)
-
-	case *ast.ChanType:
-		var s string
-		switch x.Dir {
-		case ast.SEND:
-			s = "chan<- "
-		case ast.RECV:
-			s = "<-chan "
-		default:
-			s = "chan "
-		}
-		buf.WriteString(s)
-		WriteExpr(buf, x.Value)
-	}
-}
-
-func writeSigExpr(buf *bytes.Buffer, sig *ast.FuncType) {
-	buf.WriteByte('(')
-	writeFieldList(buf, sig.Params, ", ", false)
-	buf.WriteByte(')')
-
-	res := sig.Results
-	n := res.NumFields()
-	if n == 0 {
-		// no result
-		return
-	}
-
-	buf.WriteByte(' ')
-	if n == 1 && len(res.List[0].Names) == 0 {
-		// single unnamed result
-		WriteExpr(buf, res.List[0].Type)
-		return
-	}
-
-	// multiple or named result(s)
-	buf.WriteByte('(')
-	writeFieldList(buf, res, ", ", false)
-	buf.WriteByte(')')
-}
-
-func writeFieldList(buf *bytes.Buffer, fields *ast.FieldList, sep string, iface bool) {
-	for i, f := range fields.List {
-		if i > 0 {
-			buf.WriteString(sep)
-		}
-
-		// field list names
-		for i, name := range f.Names {
-			if i > 0 {
-				buf.WriteString(", ")
-			}
-			buf.WriteString(name.Name)
-		}
-
-		// types of interface methods consist of signatures only
-		if sig, _ := f.Type.(*ast.FuncType); sig != nil && iface {
-			writeSigExpr(buf, sig)
-			continue
-		}
-
-		// named fields are separated with a blank from the field type
-		if len(f.Names) > 0 {
-			buf.WriteByte(' ')
-		}
-
-		WriteExpr(buf, f.Type)
-
-		// ignore tag
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/exprstring_test.go b/third_party/gofrontend/libgo/go/go/types/exprstring_test.go
deleted file mode 100644
index 5110288..0000000
--- a/third_party/gofrontend/libgo/go/go/types/exprstring_test.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"go/parser"
-	"testing"
-
-	. "go/types"
-)
-
-var testExprs = []testEntry{
-	// basic type literals
-	dup("x"),
-	dup("true"),
-	dup("42"),
-	dup("3.1415"),
-	dup("2.71828i"),
-	dup(`'a'`),
-	dup(`"foo"`),
-	dup("`bar`"),
-
-	// func and composite literals
-	{"func(){}", "(func() literal)"},
-	{"func(x int) complex128 {}", "(func(x int) complex128 literal)"},
-	{"[]int{1, 2, 3}", "([]int literal)"},
-
-	// non-type expressions
-	dup("(x)"),
-	dup("x.f"),
-	dup("a[i]"),
-
-	dup("s[:]"),
-	dup("s[i:]"),
-	dup("s[:j]"),
-	dup("s[i:j]"),
-	dup("s[:j:k]"),
-	dup("s[i:j:k]"),
-
-	dup("x.(T)"),
-
-	dup("x.([10]int)"),
-	dup("x.([...]int)"),
-
-	dup("x.(struct{})"),
-	dup("x.(struct{x int; y, z float32; E})"),
-
-	dup("x.(func())"),
-	dup("x.(func(x int))"),
-	dup("x.(func() int)"),
-	dup("x.(func(x, y int, z float32) (r int))"),
-	dup("x.(func(a, b, c int))"),
-	dup("x.(func(x ...T))"),
-
-	dup("x.(interface{})"),
-	dup("x.(interface{m(); n(x int); E})"),
-	dup("x.(interface{m(); n(x int) T; E; F})"),
-
-	dup("x.(map[K]V)"),
-
-	dup("x.(chan E)"),
-	dup("x.(<-chan E)"),
-	dup("x.(chan<- chan int)"),
-	dup("x.(chan<- <-chan int)"),
-	dup("x.(<-chan chan int)"),
-	dup("x.(chan (<-chan int))"),
-
-	dup("f()"),
-	dup("f(x)"),
-	dup("int(x)"),
-	dup("f(x, x + y)"),
-	dup("f(s...)"),
-	dup("f(a, s...)"),
-
-	dup("*x"),
-	dup("&x"),
-	dup("x + y"),
-	dup("x + y << (2 * s)"),
-}
-
-func TestExprString(t *testing.T) {
-	for _, test := range testExprs {
-		x, err := parser.ParseExpr(test.src)
-		if err != nil {
-			t.Errorf("%s: %s", test.src, err)
-			continue
-		}
-		if got := ExprString(x); got != test.str {
-			t.Errorf("%s: got %s, want %s", test.src, got, test.str)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/go11.go b/third_party/gofrontend/libgo/go/go/types/go11.go
deleted file mode 100644
index cf41cab..0000000
--- a/third_party/gofrontend/libgo/go/go/types/go11.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.2
-
-package types
-
-import "go/ast"
-
-func slice3(x *ast.SliceExpr) bool {
-	return false
-}
-
-func sliceMax(x *ast.SliceExpr) ast.Expr {
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/go12.go b/third_party/gofrontend/libgo/go/go/types/go12.go
deleted file mode 100644
index 2017442..0000000
--- a/third_party/gofrontend/libgo/go/go/types/go12.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.2
-
-package types
-
-import "go/ast"
-
-func slice3(x *ast.SliceExpr) bool {
-	return x.Slice3
-}
-
-func sliceMax(x *ast.SliceExpr) ast.Expr {
-	return x.Max
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/hilbert_test.go b/third_party/gofrontend/libgo/go/go/types/hilbert_test.go
deleted file mode 100644
index cfd51b1..0000000
--- a/third_party/gofrontend/libgo/go/go/types/hilbert_test.go
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"go/ast"
-	"go/importer"
-	"go/parser"
-	"go/token"
-	"io/ioutil"
-	"testing"
-
-	. "go/types"
-)
-
-var (
-	H   = flag.Int("H", 5, "Hilbert matrix size")
-	out = flag.String("out", "", "write generated program to out")
-)
-
-func TestHilbert(t *testing.T) {
-	// generate source
-	src := program(*H, *out)
-	if *out != "" {
-		ioutil.WriteFile(*out, src, 0666)
-		return
-	}
-
-	// parse source
-	fset := token.NewFileSet()
-	f, err := parser.ParseFile(fset, "hilbert.go", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// type-check file
-	DefPredeclaredTestFuncs() // define assert built-in
-	conf := Config{Importer: importer.Default()}
-	_, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func program(n int, out string) []byte {
-	var g gen
-
-	g.p(`// WARNING: GENERATED FILE - DO NOT MODIFY MANUALLY!
-// (To generate, in go/types directory: go test -run=Hilbert -H=%d -out=%q)
-
-// This program tests arbitrary precision constant arithmetic
-// by generating the constant elements of a Hilbert matrix H,
-// its inverse I, and the product P = H*I. The product should
-// be the identity matrix.
-package main
-
-func main() {
-	if !ok {
-		printProduct()
-		return
-	}
-	println("PASS")
-}
-
-`, n, out)
-	g.hilbert(n)
-	g.inverse(n)
-	g.product(n)
-	g.verify(n)
-	g.printProduct(n)
-	g.binomials(2*n - 1)
-	g.factorials(2*n - 1)
-
-	return g.Bytes()
-}
-
-type gen struct {
-	bytes.Buffer
-}
-
-func (g *gen) p(format string, args ...interface{}) {
-	fmt.Fprintf(&g.Buffer, format, args...)
-}
-
-func (g *gen) hilbert(n int) {
-	g.p(`// Hilbert matrix, n = %d
-const (
-`, n)
-	for i := 0; i < n; i++ {
-		g.p("\t")
-		for j := 0; j < n; j++ {
-			if j > 0 {
-				g.p(", ")
-			}
-			g.p("h%d_%d", i, j)
-		}
-		if i == 0 {
-			g.p(" = ")
-			for j := 0; j < n; j++ {
-				if j > 0 {
-					g.p(", ")
-				}
-				g.p("1.0/(iota + %d)", j+1)
-			}
-		}
-		g.p("\n")
-	}
-	g.p(")\n\n")
-}
-
-func (g *gen) inverse(n int) {
-	g.p(`// Inverse Hilbert matrix
-const (
-`)
-	for i := 0; i < n; i++ {
-		for j := 0; j < n; j++ {
-			s := "+"
-			if (i+j)&1 != 0 {
-				s = "-"
-			}
-			g.p("\ti%d_%d = %s%d * b%d_%d * b%d_%d * b%d_%d * b%d_%d\n",
-				i, j, s, i+j+1, n+i, n-j-1, n+j, n-i-1, i+j, i, i+j, i)
-		}
-		g.p("\n")
-	}
-	g.p(")\n\n")
-}
-
-func (g *gen) product(n int) {
-	g.p(`// Product matrix
-const (
-`)
-	for i := 0; i < n; i++ {
-		for j := 0; j < n; j++ {
-			g.p("\tp%d_%d = ", i, j)
-			for k := 0; k < n; k++ {
-				if k > 0 {
-					g.p(" + ")
-				}
-				g.p("h%d_%d*i%d_%d", i, k, k, j)
-			}
-			g.p("\n")
-		}
-		g.p("\n")
-	}
-	g.p(")\n\n")
-}
-
-func (g *gen) verify(n int) {
-	g.p(`// Verify that product is the identity matrix
-const ok =
-`)
-	for i := 0; i < n; i++ {
-		for j := 0; j < n; j++ {
-			if j == 0 {
-				g.p("\t")
-			} else {
-				g.p(" && ")
-			}
-			v := 0
-			if i == j {
-				v = 1
-			}
-			g.p("p%d_%d == %d", i, j, v)
-		}
-		g.p(" &&\n")
-	}
-	g.p("\ttrue\n\n")
-
-	// verify ok at type-check time
-	if *out == "" {
-		g.p("const _ = assert(ok)\n\n")
-	}
-}
-
-func (g *gen) printProduct(n int) {
-	g.p("func printProduct() {\n")
-	for i := 0; i < n; i++ {
-		g.p("\tprintln(")
-		for j := 0; j < n; j++ {
-			if j > 0 {
-				g.p(", ")
-			}
-			g.p("p%d_%d", i, j)
-		}
-		g.p(")\n")
-	}
-	g.p("}\n\n")
-}
-
-func (g *gen) mulRange(a, b int) {
-	if a > b {
-		g.p("1")
-		return
-	}
-	for i := a; i <= b; i++ {
-		if i > a {
-			g.p("*")
-		}
-		g.p("%d", i)
-	}
-}
-
-func (g *gen) binomials(n int) {
-	g.p(`// Binomials
-const (
-`)
-	for j := 0; j <= n; j++ {
-		if j > 0 {
-			g.p("\n")
-		}
-		for k := 0; k <= j; k++ {
-			g.p("\tb%d_%d = f%d / (f%d*f%d)\n", j, k, j, k, j-k)
-		}
-	}
-	g.p(")\n\n")
-}
-
-func (g *gen) factorials(n int) {
-	g.p(`// Factorials
-const (
-	f0 = 1
-	f1 = 1
-`)
-	for i := 2; i <= n; i++ {
-		g.p("\tf%d = f%d * %d\n", i, i-1, i)
-	}
-	g.p(")\n\n")
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/initorder.go b/third_party/gofrontend/libgo/go/go/types/initorder.go
deleted file mode 100644
index 0fd567b..0000000
--- a/third_party/gofrontend/libgo/go/go/types/initorder.go
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import (
-	"container/heap"
-	"fmt"
-)
-
-// initOrder computes the Info.InitOrder for package variables.
-func (check *Checker) initOrder() {
-	// An InitOrder may already have been computed if a package is
-	// built from several calls to (*Checker).Files.  Clear it.
-	check.Info.InitOrder = check.Info.InitOrder[:0]
-
-	// compute the object dependency graph and
-	// initialize a priority queue with the list
-	// of graph nodes
-	pq := nodeQueue(dependencyGraph(check.objMap))
-	heap.Init(&pq)
-
-	const debug = false
-	if debug {
-		fmt.Printf("package %s: object dependency graph\n", check.pkg.Name())
-		for _, n := range pq {
-			for _, o := range n.out {
-				fmt.Printf("\t%s -> %s\n", n.obj.Name(), o.obj.Name())
-			}
-		}
-		fmt.Println()
-		fmt.Printf("package %s: initialization order\n", check.pkg.Name())
-	}
-
-	// determine initialization order by removing the highest priority node
-	// (the one with the fewest dependencies) and its edges from the graph,
-	// repeatedly, until there are no nodes left.
-	// In a valid Go program, those nodes always have zero dependencies (after
-	// removing all incoming dependencies), otherwise there are initialization
-	// cycles.
-	mark := 0
-	emitted := make(map[*declInfo]bool)
-	for len(pq) > 0 {
-		// get the next node
-		n := heap.Pop(&pq).(*objNode)
-
-		// if n still depends on other nodes, we have a cycle
-		if n.in > 0 {
-			mark++ // mark nodes using a different value each time
-			cycle := findPath(n, n, mark)
-			if i := valIndex(cycle); i >= 0 {
-				check.reportCycle(cycle, i)
-			}
-			// ok to continue, but the variable initialization order
-			// will be incorrect at this point since it assumes no
-			// cycle errors
-		}
-
-		// reduce dependency count of all dependent nodes
-		// and update priority queue
-		for _, out := range n.out {
-			out.in--
-			heap.Fix(&pq, out.index)
-		}
-
-		// record the init order for variables with initializers only
-		v, _ := n.obj.(*Var)
-		info := check.objMap[v]
-		if v == nil || !info.hasInitializer() {
-			continue
-		}
-
-		// n:1 variable declarations such as: a, b = f()
-		// introduce a node for each lhs variable (here: a, b);
-		// but they all have the same initializer - emit only
-		// one, for the first variable seen
-		if emitted[info] {
-			continue // initializer already emitted, if any
-		}
-		emitted[info] = true
-
-		infoLhs := info.lhs // possibly nil (see declInfo.lhs field comment)
-		if infoLhs == nil {
-			infoLhs = []*Var{v}
-		}
-		init := &Initializer{infoLhs, info.init}
-		check.Info.InitOrder = append(check.Info.InitOrder, init)
-
-		if debug {
-			fmt.Printf("\t%s\n", init)
-		}
-	}
-
-	if debug {
-		fmt.Println()
-	}
-}
-
-// findPath returns the (reversed) list of nodes z, ... c, b, a,
-// such that there is a path (list of edges) from a to z.
-// If there is no such path, the result is nil.
-// Nodes marked with the value mark are considered "visited";
-// unvisited nodes are marked during the graph search.
-func findPath(a, z *objNode, mark int) []*objNode {
-	if a.mark == mark {
-		return nil // node already seen
-	}
-	a.mark = mark
-
-	for _, n := range a.out {
-		if n == z {
-			return []*objNode{z}
-		}
-		if P := findPath(n, z, mark); P != nil {
-			return append(P, n)
-		}
-	}
-
-	return nil
-}
-
-// valIndex returns the index of the first constant or variable in a,
-// if any; or a value < 0.
-func valIndex(a []*objNode) int {
-	for i, n := range a {
-		switch n.obj.(type) {
-		case *Const, *Var:
-			return i
-		}
-	}
-	return -1
-}
-
-// reportCycle reports an error for the cycle starting at i.
-func (check *Checker) reportCycle(cycle []*objNode, i int) {
-	obj := cycle[i].obj
-	check.errorf(obj.Pos(), "initialization cycle for %s", obj.Name())
-	// print cycle
-	for _ = range cycle {
-		check.errorf(obj.Pos(), "\t%s refers to", obj.Name()) // secondary error, \t indented
-		i++
-		if i >= len(cycle) {
-			i = 0
-		}
-		obj = cycle[i].obj
-	}
-	check.errorf(obj.Pos(), "\t%s", obj.Name())
-}
-
-// An objNode represents a node in the object dependency graph.
-// Each node b in a.out represents an edge a->b indicating that
-// b depends on a.
-// Nodes may be marked for cycle detection. A node n is marked
-// if n.mark corresponds to the current mark value.
-type objNode struct {
-	obj   Object     // object represented by this node
-	in    int        // number of nodes this node depends on
-	out   []*objNode // list of nodes that depend on this node
-	index int        // node index in list of nodes
-	mark  int        // for cycle detection
-}
-
-// dependencyGraph computes the transposed object dependency graph
-// from the given objMap. The transposed graph is returned as a list
-// of nodes; an edge d->n indicates that node n depends on node d.
-func dependencyGraph(objMap map[Object]*declInfo) []*objNode {
-	// M maps each object to its corresponding node
-	M := make(map[Object]*objNode, len(objMap))
-	for obj := range objMap {
-		M[obj] = &objNode{obj: obj}
-	}
-
-	// G is the graph of nodes n
-	G := make([]*objNode, len(M))
-	i := 0
-	for obj, n := range M {
-		deps := objMap[obj].deps
-		n.in = len(deps)
-		for d := range deps {
-			d := M[d]                // node n depends on node d
-			d.out = append(d.out, n) // add edge d->n
-		}
-
-		G[i] = n
-		n.index = i
-		i++
-	}
-
-	return G
-}
-
-// nodeQueue implements the container/heap interface;
-// a nodeQueue may be used as a priority queue.
-type nodeQueue []*objNode
-
-func (a nodeQueue) Len() int { return len(a) }
-
-func (a nodeQueue) Swap(i, j int) {
-	x, y := a[i], a[j]
-	a[i], a[j] = y, x
-	x.index, y.index = j, i
-}
-
-func (a nodeQueue) Less(i, j int) bool {
-	x, y := a[i], a[j]
-	// nodes are prioritized by number of incoming dependencies (1st key)
-	// and source order (2nd key)
-	return x.in < y.in || x.in == y.in && x.obj.order() < y.obj.order()
-}
-
-func (a *nodeQueue) Push(x interface{}) {
-	panic("unreachable")
-}
-
-func (a *nodeQueue) Pop() interface{} {
-	n := len(*a)
-	x := (*a)[n-1]
-	x.index = -1 // for safety
-	*a = (*a)[:n-1]
-	return x
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/issues_test.go b/third_party/gofrontend/libgo/go/go/types/issues_test.go
deleted file mode 100644
index 672c78d..0000000
--- a/third_party/gofrontend/libgo/go/go/types/issues_test.go
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements tests for various issues.
-
-package types_test
-
-import (
-	"fmt"
-	"go/ast"
-	"go/importer"
-	"go/parser"
-	"sort"
-	"strings"
-	"testing"
-
-	. "go/types"
-)
-
-func TestIssue5770(t *testing.T) {
-	src := `package p; type S struct{T}`
-	f, err := parser.ParseFile(fset, "", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	conf := Config{Importer: importer.Default()}
-	_, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, nil) // do not crash
-	want := "undeclared name: T"
-	if err == nil || !strings.Contains(err.Error(), want) {
-		t.Errorf("got: %v; want: %s", err, want)
-	}
-}
-
-func TestIssue5849(t *testing.T) {
-	src := `
-package p
-var (
-	s uint
-	_ = uint8(8)
-	_ = uint16(16) << s
-	_ = uint32(32 << s)
-	_ = uint64(64 << s + s)
-	_ = (interface{})("foo")
-	_ = (interface{})(nil)
-)`
-	f, err := parser.ParseFile(fset, "", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	var conf Config
-	types := make(map[ast.Expr]TypeAndValue)
-	_, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Types: types})
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	for x, tv := range types {
-		var want Type
-		switch x := x.(type) {
-		case *ast.BasicLit:
-			switch x.Value {
-			case `8`:
-				want = Typ[Uint8]
-			case `16`:
-				want = Typ[Uint16]
-			case `32`:
-				want = Typ[Uint32]
-			case `64`:
-				want = Typ[Uint] // because of "+ s", s is of type uint
-			case `"foo"`:
-				want = Typ[String]
-			}
-		case *ast.Ident:
-			if x.Name == "nil" {
-				want = Typ[UntypedNil]
-			}
-		}
-		if want != nil && !Identical(tv.Type, want) {
-			t.Errorf("got %s; want %s", tv.Type, want)
-		}
-	}
-}
-
-func TestIssue6413(t *testing.T) {
-	src := `
-package p
-func f() int {
-	defer f()
-	go f()
-	return 0
-}
-`
-	f, err := parser.ParseFile(fset, "", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	var conf Config
-	types := make(map[ast.Expr]TypeAndValue)
-	_, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Types: types})
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	want := Typ[Int]
-	n := 0
-	for x, tv := range types {
-		if _, ok := x.(*ast.CallExpr); ok {
-			if tv.Type != want {
-				t.Errorf("%s: got %s; want %s", fset.Position(x.Pos()), tv.Type, want)
-			}
-			n++
-		}
-	}
-
-	if n != 2 {
-		t.Errorf("got %d CallExprs; want 2", n)
-	}
-}
-
-func TestIssue7245(t *testing.T) {
-	src := `
-package p
-func (T) m() (res bool) { return }
-type T struct{} // receiver type after method declaration
-`
-	f, err := parser.ParseFile(fset, "", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	var conf Config
-	defs := make(map[*ast.Ident]Object)
-	_, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Defs: defs})
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	m := f.Decls[0].(*ast.FuncDecl)
-	res1 := defs[m.Name].(*Func).Type().(*Signature).Results().At(0)
-	res2 := defs[m.Type.Results.List[0].Names[0]].(*Var)
-
-	if res1 != res2 {
-		t.Errorf("got %s (%p) != %s (%p)", res1, res2, res1, res2)
-	}
-}
-
-// This tests that uses of existing vars on the LHS of an assignment
-// are Uses, not Defs; and also that the (illegal) use of a non-var on
-// the LHS of an assignment is a Use nonetheless.
-func TestIssue7827(t *testing.T) {
-	const src = `
-package p
-func _() {
-	const w = 1        // defs w
-        x, y := 2, 3       // defs x, y
-        w, x, z := 4, 5, 6 // uses w, x, defs z; error: cannot assign to w
-        _, _, _ = x, y, z  // uses x, y, z
-}
-`
-	const want = `L3 defs func p._()
-L4 defs const w untyped int
-L5 defs var x int
-L5 defs var y int
-L6 defs var z int
-L6 uses const w untyped int
-L6 uses var x int
-L7 uses var x int
-L7 uses var y int
-L7 uses var z int`
-
-	f, err := parser.ParseFile(fset, "", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// don't abort at the first error
-	conf := Config{Error: func(err error) { t.Log(err) }}
-	defs := make(map[*ast.Ident]Object)
-	uses := make(map[*ast.Ident]Object)
-	_, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Defs: defs, Uses: uses})
-	if s := fmt.Sprint(err); !strings.HasSuffix(s, "cannot assign to w") {
-		t.Errorf("Check: unexpected error: %s", s)
-	}
-
-	var facts []string
-	for id, obj := range defs {
-		if obj != nil {
-			fact := fmt.Sprintf("L%d defs %s", fset.Position(id.Pos()).Line, obj)
-			facts = append(facts, fact)
-		}
-	}
-	for id, obj := range uses {
-		fact := fmt.Sprintf("L%d uses %s", fset.Position(id.Pos()).Line, obj)
-		facts = append(facts, fact)
-	}
-	sort.Strings(facts)
-
-	got := strings.Join(facts, "\n")
-	if got != want {
-		t.Errorf("Unexpected defs/uses\ngot:\n%s\nwant:\n%s", got, want)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/labels.go b/third_party/gofrontend/libgo/go/go/types/labels.go
deleted file mode 100644
index 7364d4d..0000000
--- a/third_party/gofrontend/libgo/go/go/types/labels.go
+++ /dev/null
@@ -1,268 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import (
-	"go/ast"
-	"go/token"
-)
-
-// labels checks correct label use in body.
-func (check *Checker) labels(body *ast.BlockStmt) {
-	// set of all labels in this body
-	all := NewScope(nil, body.Pos(), body.End(), "label")
-
-	fwdJumps := check.blockBranches(all, nil, nil, body.List)
-
-	// If there are any forward jumps left, no label was found for
-	// the corresponding goto statements. Either those labels were
-	// never defined, or they are inside blocks and not reachable
-	// for the respective gotos.
-	for _, jmp := range fwdJumps {
-		var msg string
-		name := jmp.Label.Name
-		if alt := all.Lookup(name); alt != nil {
-			msg = "goto %s jumps into block"
-			alt.(*Label).used = true // avoid another error
-		} else {
-			msg = "label %s not declared"
-		}
-		check.errorf(jmp.Label.Pos(), msg, name)
-	}
-
-	// spec: "It is illegal to define a label that is never used."
-	for _, obj := range all.elems {
-		if lbl := obj.(*Label); !lbl.used {
-			check.softErrorf(lbl.pos, "label %s declared but not used", lbl.name)
-		}
-	}
-}
-
-// A block tracks label declarations in a block and its enclosing blocks.
-type block struct {
-	parent *block                      // enclosing block
-	lstmt  *ast.LabeledStmt            // labeled statement to which this block belongs, or nil
-	labels map[string]*ast.LabeledStmt // allocated lazily
-}
-
-// insert records a new label declaration for the current block.
-// The label must not have been declared before in any block.
-func (b *block) insert(s *ast.LabeledStmt) {
-	name := s.Label.Name
-	if debug {
-		assert(b.gotoTarget(name) == nil)
-	}
-	labels := b.labels
-	if labels == nil {
-		labels = make(map[string]*ast.LabeledStmt)
-		b.labels = labels
-	}
-	labels[name] = s
-}
-
-// gotoTarget returns the labeled statement in the current
-// or an enclosing block with the given label name, or nil.
-func (b *block) gotoTarget(name string) *ast.LabeledStmt {
-	for s := b; s != nil; s = s.parent {
-		if t := s.labels[name]; t != nil {
-			return t
-		}
-	}
-	return nil
-}
-
-// enclosingTarget returns the innermost enclosing labeled
-// statement with the given label name, or nil.
-func (b *block) enclosingTarget(name string) *ast.LabeledStmt {
-	for s := b; s != nil; s = s.parent {
-		if t := s.lstmt; t != nil && t.Label.Name == name {
-			return t
-		}
-	}
-	return nil
-}
-
-// blockBranches processes a block's statement list and returns the set of outgoing forward jumps.
-// all is the scope of all declared labels, parent the set of labels declared in the immediately
-// enclosing block, and lstmt is the labeled statement this block is associated with (or nil).
-func (check *Checker) blockBranches(all *Scope, parent *block, lstmt *ast.LabeledStmt, list []ast.Stmt) []*ast.BranchStmt {
-	b := &block{parent: parent, lstmt: lstmt}
-
-	var (
-		varDeclPos         token.Pos
-		fwdJumps, badJumps []*ast.BranchStmt
-	)
-
-	// All forward jumps jumping over a variable declaration are possibly
-	// invalid (they may still jump out of the block and be ok).
-	// recordVarDecl records them for the given position.
-	recordVarDecl := func(pos token.Pos) {
-		varDeclPos = pos
-		badJumps = append(badJumps[:0], fwdJumps...) // copy fwdJumps to badJumps
-	}
-
-	jumpsOverVarDecl := func(jmp *ast.BranchStmt) bool {
-		if varDeclPos.IsValid() {
-			for _, bad := range badJumps {
-				if jmp == bad {
-					return true
-				}
-			}
-		}
-		return false
-	}
-
-	blockBranches := func(lstmt *ast.LabeledStmt, list []ast.Stmt) {
-		// Unresolved forward jumps inside the nested block
-		// become forward jumps in the current block.
-		fwdJumps = append(fwdJumps, check.blockBranches(all, b, lstmt, list)...)
-	}
-
-	var stmtBranches func(ast.Stmt)
-	stmtBranches = func(s ast.Stmt) {
-		switch s := s.(type) {
-		case *ast.DeclStmt:
-			if d, _ := s.Decl.(*ast.GenDecl); d != nil && d.Tok == token.VAR {
-				recordVarDecl(d.Pos())
-			}
-
-		case *ast.LabeledStmt:
-			// declare non-blank label
-			if name := s.Label.Name; name != "_" {
-				lbl := NewLabel(s.Label.Pos(), check.pkg, name)
-				if alt := all.Insert(lbl); alt != nil {
-					check.softErrorf(lbl.pos, "label %s already declared", name)
-					check.reportAltDecl(alt)
-					// ok to continue
-				} else {
-					b.insert(s)
-					check.recordDef(s.Label, lbl)
-				}
-				// resolve matching forward jumps and remove them from fwdJumps
-				i := 0
-				for _, jmp := range fwdJumps {
-					if jmp.Label.Name == name {
-						// match
-						lbl.used = true
-						check.recordUse(jmp.Label, lbl)
-						if jumpsOverVarDecl(jmp) {
-							check.softErrorf(
-								jmp.Label.Pos(),
-								"goto %s jumps over variable declaration at line %d",
-								name,
-								check.fset.Position(varDeclPos).Line,
-							)
-							// ok to continue
-						}
-					} else {
-						// no match - record new forward jump
-						fwdJumps[i] = jmp
-						i++
-					}
-				}
-				fwdJumps = fwdJumps[:i]
-				lstmt = s
-			}
-			stmtBranches(s.Stmt)
-
-		case *ast.BranchStmt:
-			if s.Label == nil {
-				return // checked in 1st pass (check.stmt)
-			}
-
-			// determine and validate target
-			name := s.Label.Name
-			switch s.Tok {
-			case token.BREAK:
-				// spec: "If there is a label, it must be that of an enclosing
-				// "for", "switch", or "select" statement, and that is the one
-				// whose execution terminates."
-				valid := false
-				if t := b.enclosingTarget(name); t != nil {
-					switch t.Stmt.(type) {
-					case *ast.SwitchStmt, *ast.TypeSwitchStmt, *ast.SelectStmt, *ast.ForStmt, *ast.RangeStmt:
-						valid = true
-					}
-				}
-				if !valid {
-					check.errorf(s.Label.Pos(), "invalid break label %s", name)
-					return
-				}
-
-			case token.CONTINUE:
-				// spec: "If there is a label, it must be that of an enclosing
-				// "for" statement, and that is the one whose execution advances."
-				valid := false
-				if t := b.enclosingTarget(name); t != nil {
-					switch t.Stmt.(type) {
-					case *ast.ForStmt, *ast.RangeStmt:
-						valid = true
-					}
-				}
-				if !valid {
-					check.errorf(s.Label.Pos(), "invalid continue label %s", name)
-					return
-				}
-
-			case token.GOTO:
-				if b.gotoTarget(name) == nil {
-					// label may be declared later - add branch to forward jumps
-					fwdJumps = append(fwdJumps, s)
-					return
-				}
-
-			default:
-				check.invalidAST(s.Pos(), "branch statement: %s %s", s.Tok, name)
-				return
-			}
-
-			// record label use
-			obj := all.Lookup(name)
-			obj.(*Label).used = true
-			check.recordUse(s.Label, obj)
-
-		case *ast.AssignStmt:
-			if s.Tok == token.DEFINE {
-				recordVarDecl(s.Pos())
-			}
-
-		case *ast.BlockStmt:
-			blockBranches(lstmt, s.List)
-
-		case *ast.IfStmt:
-			stmtBranches(s.Body)
-			if s.Else != nil {
-				stmtBranches(s.Else)
-			}
-
-		case *ast.CaseClause:
-			blockBranches(nil, s.Body)
-
-		case *ast.SwitchStmt:
-			stmtBranches(s.Body)
-
-		case *ast.TypeSwitchStmt:
-			stmtBranches(s.Body)
-
-		case *ast.CommClause:
-			blockBranches(nil, s.Body)
-
-		case *ast.SelectStmt:
-			stmtBranches(s.Body)
-
-		case *ast.ForStmt:
-			stmtBranches(s.Body)
-
-		case *ast.RangeStmt:
-			stmtBranches(s.Body)
-		}
-	}
-
-	for _, s := range list {
-		stmtBranches(s)
-	}
-
-	return fwdJumps
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/lookup.go b/third_party/gofrontend/libgo/go/go/types/lookup.go
deleted file mode 100644
index 3caca55..0000000
--- a/third_party/gofrontend/libgo/go/go/types/lookup.go
+++ /dev/null
@@ -1,341 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements various field and method lookup functions.
-
-package types
-
-// LookupFieldOrMethod looks up a field or method with given package and name
-// in T and returns the corresponding *Var or *Func, an index sequence, and a
-// bool indicating if there were any pointer indirections on the path to the
-// field or method. If addressable is set, T is the type of an addressable
-// variable (only matters for method lookups).
-//
-// The last index entry is the field or method index in the (possibly embedded)
-// type where the entry was found, either:
-//
-//	1) the list of declared methods of a named type; or
-//	2) the list of all methods (method set) of an interface type; or
-//	3) the list of fields of a struct type.
-//
-// The earlier index entries are the indices of the anonymous struct fields
-// traversed to get to the found entry, starting at depth 0.
-//
-// If no entry is found, a nil object is returned. In this case, the returned
-// index and indirect values have the following meaning:
-//
-//	- If index != nil, the index sequence points to an ambiguous entry
-//	(the same name appeared more than once at the same embedding level).
-//
-//	- If indirect is set, a method with a pointer receiver type was found
-//      but there was no pointer on the path from the actual receiver type to
-//	the method's formal receiver base type, nor was the receiver addressable.
-//
-func LookupFieldOrMethod(T Type, addressable bool, pkg *Package, name string) (obj Object, index []int, indirect bool) {
-	// Methods cannot be associated to a named pointer type
-	// (spec: "The type denoted by T is called the receiver base type;
-	// it must not be a pointer or interface type and it must be declared
-	// in the same package as the method.").
-	// Thus, if we have a named pointer type, proceed with the underlying
-	// pointer type but discard the result if it is a method since we would
-	// not have found it for T (see also issue 8590).
-	if t, _ := T.(*Named); t != nil {
-		if p, _ := t.underlying.(*Pointer); p != nil {
-			obj, index, indirect = lookupFieldOrMethod(p, false, pkg, name)
-			if _, ok := obj.(*Func); ok {
-				return nil, nil, false
-			}
-			return
-		}
-	}
-
-	return lookupFieldOrMethod(T, addressable, pkg, name)
-}
-
-// TODO(gri) The named type consolidation and seen maps below must be
-//           indexed by unique keys for a given type. Verify that named
-//           types always have only one representation (even when imported
-//           indirectly via different packages.)
-
-func lookupFieldOrMethod(T Type, addressable bool, pkg *Package, name string) (obj Object, index []int, indirect bool) {
-	// WARNING: The code in this function is extremely subtle - do not modify casually!
-	//          This function and NewMethodSet should be kept in sync.
-
-	if name == "_" {
-		return // blank fields/methods are never found
-	}
-
-	typ, isPtr := deref(T)
-	named, _ := typ.(*Named)
-
-	// *typ where typ is an interface has no methods.
-	if isPtr {
-		utyp := typ
-		if named != nil {
-			utyp = named.underlying
-		}
-		if _, ok := utyp.(*Interface); ok {
-			return
-		}
-	}
-
-	// Start with typ as single entry at shallowest depth.
-	// If typ is not a named type, insert a nil type instead.
-	current := []embeddedType{{named, nil, isPtr, false}}
-
-	// named types that we have seen already, allocated lazily
-	var seen map[*Named]bool
-
-	// search current depth
-	for len(current) > 0 {
-		var next []embeddedType // embedded types found at current depth
-
-		// look for (pkg, name) in all types at current depth
-		for _, e := range current {
-			// The very first time only, e.typ may be nil.
-			// In this case, we don't have a named type and
-			// we simply continue with the underlying type.
-			if e.typ != nil {
-				if seen[e.typ] {
-					// We have seen this type before, at a more shallow depth
-					// (note that multiples of this type at the current depth
-					// were consolidated before). The type at that depth shadows
-					// this same type at the current depth, so we can ignore
-					// this one.
-					continue
-				}
-				if seen == nil {
-					seen = make(map[*Named]bool)
-				}
-				seen[e.typ] = true
-
-				// look for a matching attached method
-				if i, m := lookupMethod(e.typ.methods, pkg, name); m != nil {
-					// potential match
-					assert(m.typ != nil)
-					index = concat(e.index, i)
-					if obj != nil || e.multiples {
-						return nil, index, false // collision
-					}
-					obj = m
-					indirect = e.indirect
-					continue // we can't have a matching field or interface method
-				}
-
-				// continue with underlying type
-				typ = e.typ.underlying
-			}
-
-			switch t := typ.(type) {
-			case *Struct:
-				// look for a matching field and collect embedded types
-				for i, f := range t.fields {
-					if f.sameId(pkg, name) {
-						assert(f.typ != nil)
-						index = concat(e.index, i)
-						if obj != nil || e.multiples {
-							return nil, index, false // collision
-						}
-						obj = f
-						indirect = e.indirect
-						continue // we can't have a matching interface method
-					}
-					// Collect embedded struct fields for searching the next
-					// lower depth, but only if we have not seen a match yet
-					// (if we have a match it is either the desired field or
-					// we have a name collision on the same depth; in either
-					// case we don't need to look further).
-					// Embedded fields are always of the form T or *T where
-					// T is a named type. If e.typ appeared multiple times at
-					// this depth, f.typ appears multiple times at the next
-					// depth.
-					if obj == nil && f.anonymous {
-						// Ignore embedded basic types - only user-defined
-						// named types can have methods or struct fields.
-						typ, isPtr := deref(f.typ)
-						if t, _ := typ.(*Named); t != nil {
-							next = append(next, embeddedType{t, concat(e.index, i), e.indirect || isPtr, e.multiples})
-						}
-					}
-				}
-
-			case *Interface:
-				// look for a matching method
-				// TODO(gri) t.allMethods is sorted - use binary search
-				if i, m := lookupMethod(t.allMethods, pkg, name); m != nil {
-					assert(m.typ != nil)
-					index = concat(e.index, i)
-					if obj != nil || e.multiples {
-						return nil, index, false // collision
-					}
-					obj = m
-					indirect = e.indirect
-				}
-			}
-		}
-
-		if obj != nil {
-			// found a potential match
-			// spec: "A method call x.m() is valid if the method set of (the type of) x
-			//        contains m and the argument list can be assigned to the parameter
-			//        list of m. If x is addressable and &x's method set contains m, x.m()
-			//        is shorthand for (&x).m()".
-			if f, _ := obj.(*Func); f != nil && ptrRecv(f) && !indirect && !addressable {
-				return nil, nil, true // pointer/addressable receiver required
-			}
-			return
-		}
-
-		current = consolidateMultiples(next)
-	}
-
-	return nil, nil, false // not found
-}
-
-// embeddedType represents an embedded named type
-type embeddedType struct {
-	typ       *Named // nil means use the outer typ variable instead
-	index     []int  // embedded field indices, starting with index at depth 0
-	indirect  bool   // if set, there was a pointer indirection on the path to this field
-	multiples bool   // if set, typ appears multiple times at this depth
-}
-
-// consolidateMultiples collects multiple list entries with the same type
-// into a single entry marked as containing multiples. The result is the
-// consolidated list.
-func consolidateMultiples(list []embeddedType) []embeddedType {
-	if len(list) <= 1 {
-		return list // at most one entry - nothing to do
-	}
-
-	n := 0                       // number of entries w/ unique type
-	prev := make(map[*Named]int) // index at which type was previously seen
-	for _, e := range list {
-		if i, found := prev[e.typ]; found {
-			list[i].multiples = true
-			// ignore this entry
-		} else {
-			prev[e.typ] = n
-			list[n] = e
-			n++
-		}
-	}
-	return list[:n]
-}
-
-// MissingMethod returns (nil, false) if V implements T, otherwise it
-// returns a missing method required by T and whether it is missing or
-// just has the wrong type.
-//
-// For non-interface types V, or if static is set, V implements T if all
-// methods of T are present in V. Otherwise (V is an interface and static
-// is not set), MissingMethod only checks that methods of T which are also
-// present in V have matching types (e.g., for a type assertion x.(T) where
-// x is of interface type V).
-//
-func MissingMethod(V Type, T *Interface, static bool) (method *Func, wrongType bool) {
-	// fast path for common case
-	if T.Empty() {
-		return
-	}
-
-	// TODO(gri) Consider using method sets here. Might be more efficient.
-
-	if ityp, _ := V.Underlying().(*Interface); ityp != nil {
-		// TODO(gri) allMethods is sorted - can do this more efficiently
-		for _, m := range T.allMethods {
-			_, obj := lookupMethod(ityp.allMethods, m.pkg, m.name)
-			switch {
-			case obj == nil:
-				if static {
-					return m, false
-				}
-			case !Identical(obj.Type(), m.typ):
-				return m, true
-			}
-		}
-		return
-	}
-
-	// A concrete type implements T if it implements all methods of T.
-	for _, m := range T.allMethods {
-		obj, _, _ := lookupFieldOrMethod(V, false, m.pkg, m.name)
-
-		f, _ := obj.(*Func)
-		if f == nil {
-			return m, false
-		}
-
-		if !Identical(f.typ, m.typ) {
-			return m, true
-		}
-	}
-
-	return
-}
-
-// assertableTo reports whether a value of type V can be asserted to have type T.
-// It returns (nil, false) as affirmative answer. Otherwise it returns a missing
-// method required by V and whether it is missing or just has the wrong type.
-func assertableTo(V *Interface, T Type) (method *Func, wrongType bool) {
-	// no static check is required if T is an interface
-	// spec: "If T is an interface type, x.(T) asserts that the
-	//        dynamic type of x implements the interface T."
-	if _, ok := T.Underlying().(*Interface); ok && !strict {
-		return
-	}
-	return MissingMethod(T, V, false)
-}
-
-// deref dereferences typ if it is a *Pointer and returns its base and true.
-// Otherwise it returns (typ, false).
-func deref(typ Type) (Type, bool) {
-	if p, _ := typ.(*Pointer); p != nil {
-		return p.base, true
-	}
-	return typ, false
-}
-
-// derefStructPtr dereferences typ if it is a (named or unnamed) pointer to a
-// (named or unnamed) struct and returns its base. Otherwise it returns typ.
-func derefStructPtr(typ Type) Type {
-	if p, _ := typ.Underlying().(*Pointer); p != nil {
-		if _, ok := p.base.Underlying().(*Struct); ok {
-			return p.base
-		}
-	}
-	return typ
-}
-
-// concat returns the result of concatenating list and i.
-// The result does not share its underlying array with list.
-func concat(list []int, i int) []int {
-	var t []int
-	t = append(t, list...)
-	return append(t, i)
-}
-
-// fieldIndex returns the index for the field with matching package and name, or a value < 0.
-func fieldIndex(fields []*Var, pkg *Package, name string) int {
-	if name != "_" {
-		for i, f := range fields {
-			if f.sameId(pkg, name) {
-				return i
-			}
-		}
-	}
-	return -1
-}
-
-// lookupMethod returns the index of and method with matching package and name, or (-1, nil).
-func lookupMethod(methods []*Func, pkg *Package, name string) (int, *Func) {
-	if name != "_" {
-		for i, m := range methods {
-			if m.sameId(pkg, name) {
-				return i, m
-			}
-		}
-	}
-	return -1, nil
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/methodset.go b/third_party/gofrontend/libgo/go/go/types/methodset.go
deleted file mode 100644
index b27f2da..0000000
--- a/third_party/gofrontend/libgo/go/go/types/methodset.go
+++ /dev/null
@@ -1,268 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements method sets.
-
-package types
-
-import (
-	"bytes"
-	"fmt"
-	"sort"
-)
-
-// A MethodSet is an ordered set of concrete or abstract (interface) methods;
-// a method is a MethodVal selection, and they are ordered by ascending m.Obj().Id().
-// The zero value for a MethodSet is a ready-to-use empty method set.
-type MethodSet struct {
-	list []*Selection
-}
-
-func (s *MethodSet) String() string {
-	if s.Len() == 0 {
-		return "MethodSet {}"
-	}
-
-	var buf bytes.Buffer
-	fmt.Fprintln(&buf, "MethodSet {")
-	for _, f := range s.list {
-		fmt.Fprintf(&buf, "\t%s\n", f)
-	}
-	fmt.Fprintln(&buf, "}")
-	return buf.String()
-}
-
-// Len returns the number of methods in s.
-func (s *MethodSet) Len() int { return len(s.list) }
-
-// At returns the i'th method in s for 0 <= i < s.Len().
-func (s *MethodSet) At(i int) *Selection { return s.list[i] }
-
-// Lookup returns the method with matching package and name, or nil if not found.
-func (s *MethodSet) Lookup(pkg *Package, name string) *Selection {
-	if s.Len() == 0 {
-		return nil
-	}
-
-	key := Id(pkg, name)
-	i := sort.Search(len(s.list), func(i int) bool {
-		m := s.list[i]
-		return m.obj.Id() >= key
-	})
-	if i < len(s.list) {
-		m := s.list[i]
-		if m.obj.Id() == key {
-			return m
-		}
-	}
-	return nil
-}
-
-// Shared empty method set.
-var emptyMethodSet MethodSet
-
-// NewMethodSet returns the method set for the given type T.
-// It always returns a non-nil method set, even if it is empty.
-func NewMethodSet(T Type) *MethodSet {
-	// WARNING: The code in this function is extremely subtle - do not modify casually!
-	//          This function and lookupFieldOrMethod should be kept in sync.
-
-	// method set up to the current depth, allocated lazily
-	var base methodSet
-
-	typ, isPtr := deref(T)
-	named, _ := typ.(*Named)
-
-	// *typ where typ is an interface has no methods.
-	if isPtr {
-		utyp := typ
-		if named != nil {
-			utyp = named.underlying
-		}
-		if _, ok := utyp.(*Interface); ok {
-			return &emptyMethodSet
-		}
-	}
-
-	// Start with typ as single entry at shallowest depth.
-	// If typ is not a named type, insert a nil type instead.
-	current := []embeddedType{{named, nil, isPtr, false}}
-
-	// named types that we have seen already, allocated lazily
-	var seen map[*Named]bool
-
-	// collect methods at current depth
-	for len(current) > 0 {
-		var next []embeddedType // embedded types found at current depth
-
-		// field and method sets at current depth, allocated lazily
-		var fset fieldSet
-		var mset methodSet
-
-		for _, e := range current {
-			// The very first time only, e.typ may be nil.
-			// In this case, we don't have a named type and
-			// we simply continue with the underlying type.
-			if e.typ != nil {
-				if seen[e.typ] {
-					// We have seen this type before, at a more shallow depth
-					// (note that multiples of this type at the current depth
-					// were consolidated before). The type at that depth shadows
-					// this same type at the current depth, so we can ignore
-					// this one.
-					continue
-				}
-				if seen == nil {
-					seen = make(map[*Named]bool)
-				}
-				seen[e.typ] = true
-
-				mset = mset.add(e.typ.methods, e.index, e.indirect, e.multiples)
-
-				// continue with underlying type
-				typ = e.typ.underlying
-			}
-
-			switch t := typ.(type) {
-			case *Struct:
-				for i, f := range t.fields {
-					fset = fset.add(f, e.multiples)
-
-					// Embedded fields are always of the form T or *T where
-					// T is a named type. If typ appeared multiple times at
-					// this depth, f.Type appears multiple times at the next
-					// depth.
-					if f.anonymous {
-						// Ignore embedded basic types - only user-defined
-						// named types can have methods or struct fields.
-						typ, isPtr := deref(f.typ)
-						if t, _ := typ.(*Named); t != nil {
-							next = append(next, embeddedType{t, concat(e.index, i), e.indirect || isPtr, e.multiples})
-						}
-					}
-				}
-
-			case *Interface:
-				mset = mset.add(t.allMethods, e.index, true, e.multiples)
-			}
-		}
-
-		// Add methods and collisions at this depth to base if no entries with matching
-		// names exist already.
-		for k, m := range mset {
-			if _, found := base[k]; !found {
-				// Fields collide with methods of the same name at this depth.
-				if _, found := fset[k]; found {
-					m = nil // collision
-				}
-				if base == nil {
-					base = make(methodSet)
-				}
-				base[k] = m
-			}
-		}
-
-		// Multiple fields with matching names collide at this depth and shadow all
-		// entries further down; add them as collisions to base if no entries with
-		// matching names exist already.
-		for k, f := range fset {
-			if f == nil {
-				if _, found := base[k]; !found {
-					if base == nil {
-						base = make(methodSet)
-					}
-					base[k] = nil // collision
-				}
-			}
-		}
-
-		current = consolidateMultiples(next)
-	}
-
-	if len(base) == 0 {
-		return &emptyMethodSet
-	}
-
-	// collect methods
-	var list []*Selection
-	for _, m := range base {
-		if m != nil {
-			m.recv = T
-			list = append(list, m)
-		}
-	}
-	sort.Sort(byUniqueName(list))
-	return &MethodSet{list}
-}
-
-// A fieldSet is a set of fields and name collisions.
-// A collision indicates that multiple fields with the
-// same unique id appeared.
-type fieldSet map[string]*Var // a nil entry indicates a name collision
-
-// Add adds field f to the field set s.
-// If multiples is set, f appears multiple times
-// and is treated as a collision.
-func (s fieldSet) add(f *Var, multiples bool) fieldSet {
-	if s == nil {
-		s = make(fieldSet)
-	}
-	key := f.Id()
-	// if f is not in the set, add it
-	if !multiples {
-		if _, found := s[key]; !found {
-			s[key] = f
-			return s
-		}
-	}
-	s[key] = nil // collision
-	return s
-}
-
-// A methodSet is a set of methods and name collisions.
-// A collision indicates that multiple methods with the
-// same unique id appeared.
-type methodSet map[string]*Selection // a nil entry indicates a name collision
-
-// Add adds all functions in list to the method set s.
-// If multiples is set, every function in list appears multiple times
-// and is treated as a collision.
-func (s methodSet) add(list []*Func, index []int, indirect bool, multiples bool) methodSet {
-	if len(list) == 0 {
-		return s
-	}
-	if s == nil {
-		s = make(methodSet)
-	}
-	for i, f := range list {
-		key := f.Id()
-		// if f is not in the set, add it
-		if !multiples {
-			// TODO(gri) A found method may not be added because it's not in the method set
-			// (!indirect && ptrRecv(f)). A 2nd method on the same level may be in the method
-			// set and may not collide with the first one, thus leading to a false positive.
-			// Is that possible? Investigate.
-			if _, found := s[key]; !found && (indirect || !ptrRecv(f)) {
-				s[key] = &Selection{MethodVal, nil, f, concat(index, i), indirect}
-				continue
-			}
-		}
-		s[key] = nil // collision
-	}
-	return s
-}
-
-// ptrRecv reports whether the receiver is of the form *T.
-// The receiver must exist.
-func ptrRecv(f *Func) bool {
-	_, isPtr := deref(f.typ.(*Signature).recv.typ)
-	return isPtr
-}
-
-// byUniqueName function lists can be sorted by their unique names.
-type byUniqueName []*Selection
-
-func (a byUniqueName) Len() int           { return len(a) }
-func (a byUniqueName) Less(i, j int) bool { return a[i].obj.Id() < a[j].obj.Id() }
-func (a byUniqueName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
diff --git a/third_party/gofrontend/libgo/go/go/types/object.go b/third_party/gofrontend/libgo/go/go/types/object.go
deleted file mode 100644
index b835c6e..0000000
--- a/third_party/gofrontend/libgo/go/go/types/object.go
+++ /dev/null
@@ -1,360 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/constant"
-	"go/token"
-)
-
-// TODO(gri) Document factory, accessor methods, and fields. General clean-up.
-
-// An Object describes a named language entity such as a package,
-// constant, type, variable, function (incl. methods), or label.
-// All objects implement the Object interface.
-//
-type Object interface {
-	Parent() *Scope // scope in which this object is declared
-	Pos() token.Pos // position of object identifier in declaration
-	Pkg() *Package  // nil for objects in the Universe scope and labels
-	Name() string   // package local object name
-	Type() Type     // object type
-	Exported() bool // reports whether the name starts with a capital letter
-	Id() string     // object id (see Id below)
-
-	// String returns a human-readable string of the object.
-	String() string
-
-	// order reflects a package-level object's source order: if object
-	// a is before object b in the source, then a.order() < b.order().
-	// order returns a value > 0 for package-level objects; it returns
-	// 0 for all other objects (including objects in file scopes).
-	order() uint32
-
-	// setOrder sets the order number of the object. It must be > 0.
-	setOrder(uint32)
-
-	// setParent sets the parent scope of the object.
-	setParent(*Scope)
-
-	// sameId reports whether obj.Id() and Id(pkg, name) are the same.
-	sameId(pkg *Package, name string) bool
-
-	// scopePos returns the start position of the scope of this Object
-	scopePos() token.Pos
-
-	// setScopePos sets the start position of the scope for this Object.
-	setScopePos(pos token.Pos)
-}
-
-// Id returns name if it is exported, otherwise it
-// returns the name qualified with the package path.
-func Id(pkg *Package, name string) string {
-	if ast.IsExported(name) {
-		return name
-	}
-	// unexported names need the package path for differentiation
-	// (if there's no package, make sure we don't start with '.'
-	// as that may change the order of methods between a setup
-	// inside a package and outside a package - which breaks some
-	// tests)
-	path := "_"
-	// TODO(gri): shouldn't !ast.IsExported(name) => pkg != nil be an precondition?
-	// if pkg == nil {
-	// 	panic("nil package in lookup of unexported name")
-	// }
-	if pkg != nil {
-		path = pkg.path
-		if path == "" {
-			path = "_"
-		}
-	}
-	return path + "." + name
-}
-
-// An object implements the common parts of an Object.
-type object struct {
-	parent    *Scope
-	pos       token.Pos
-	pkg       *Package
-	name      string
-	typ       Type
-	order_    uint32
-	scopePos_ token.Pos
-}
-
-func (obj *object) Parent() *Scope      { return obj.parent }
-func (obj *object) Pos() token.Pos      { return obj.pos }
-func (obj *object) Pkg() *Package       { return obj.pkg }
-func (obj *object) Name() string        { return obj.name }
-func (obj *object) Type() Type          { return obj.typ }
-func (obj *object) Exported() bool      { return ast.IsExported(obj.name) }
-func (obj *object) Id() string          { return Id(obj.pkg, obj.name) }
-func (obj *object) String() string      { panic("abstract") }
-func (obj *object) order() uint32       { return obj.order_ }
-func (obj *object) scopePos() token.Pos { return obj.scopePos_ }
-
-func (obj *object) setParent(parent *Scope)   { obj.parent = parent }
-func (obj *object) setOrder(order uint32)     { assert(order > 0); obj.order_ = order }
-func (obj *object) setScopePos(pos token.Pos) { obj.scopePos_ = pos }
-
-func (obj *object) sameId(pkg *Package, name string) bool {
-	// spec:
-	// "Two identifiers are different if they are spelled differently,
-	// or if they appear in different packages and are not exported.
-	// Otherwise, they are the same."
-	if name != obj.name {
-		return false
-	}
-	// obj.Name == name
-	if obj.Exported() {
-		return true
-	}
-	// not exported, so packages must be the same (pkg == nil for
-	// fields in Universe scope; this can only happen for types
-	// introduced via Eval)
-	if pkg == nil || obj.pkg == nil {
-		return pkg == obj.pkg
-	}
-	// pkg != nil && obj.pkg != nil
-	return pkg.path == obj.pkg.path
-}
-
-// A PkgName represents an imported Go package.
-type PkgName struct {
-	object
-	imported *Package
-	used     bool // set if the package was used
-}
-
-func NewPkgName(pos token.Pos, pkg *Package, name string, imported *Package) *PkgName {
-	return &PkgName{object{nil, pos, pkg, name, Typ[Invalid], 0, token.NoPos}, imported, false}
-}
-
-// Imported returns the package that was imported.
-// It is distinct from Pkg(), which is the package containing the import statement.
-func (obj *PkgName) Imported() *Package { return obj.imported }
-
-// A Const represents a declared constant.
-type Const struct {
-	object
-	val     constant.Value
-	visited bool // for initialization cycle detection
-}
-
-func NewConst(pos token.Pos, pkg *Package, name string, typ Type, val constant.Value) *Const {
-	return &Const{object{nil, pos, pkg, name, typ, 0, token.NoPos}, val, false}
-}
-
-func (obj *Const) Val() constant.Value { return obj.val }
-
-// A TypeName represents a declared type.
-type TypeName struct {
-	object
-}
-
-func NewTypeName(pos token.Pos, pkg *Package, name string, typ Type) *TypeName {
-	return &TypeName{object{nil, pos, pkg, name, typ, 0, token.NoPos}}
-}
-
-// A Variable represents a declared variable (including function parameters and results, and struct fields).
-type Var struct {
-	object
-	anonymous bool // if set, the variable is an anonymous struct field, and name is the type name
-	visited   bool // for initialization cycle detection
-	isField   bool // var is struct field
-	used      bool // set if the variable was used
-}
-
-func NewVar(pos token.Pos, pkg *Package, name string, typ Type) *Var {
-	return &Var{object: object{nil, pos, pkg, name, typ, 0, token.NoPos}}
-}
-
-func NewParam(pos token.Pos, pkg *Package, name string, typ Type) *Var {
-	return &Var{object: object{nil, pos, pkg, name, typ, 0, token.NoPos}, used: true} // parameters are always 'used'
-}
-
-func NewField(pos token.Pos, pkg *Package, name string, typ Type, anonymous bool) *Var {
-	return &Var{object: object{nil, pos, pkg, name, typ, 0, token.NoPos}, anonymous: anonymous, isField: true}
-}
-
-func (obj *Var) Anonymous() bool { return obj.anonymous }
-
-func (obj *Var) IsField() bool { return obj.isField }
-
-// A Func represents a declared function, concrete method, or abstract
-// (interface) method.  Its Type() is always a *Signature.
-// An abstract method may belong to many interfaces due to embedding.
-type Func struct {
-	object
-}
-
-func NewFunc(pos token.Pos, pkg *Package, name string, sig *Signature) *Func {
-	// don't store a nil signature
-	var typ Type
-	if sig != nil {
-		typ = sig
-	}
-	return &Func{object{nil, pos, pkg, name, typ, 0, token.NoPos}}
-}
-
-// FullName returns the package- or receiver-type-qualified name of
-// function or method obj.
-func (obj *Func) FullName() string {
-	var buf bytes.Buffer
-	writeFuncName(&buf, obj, nil)
-	return buf.String()
-}
-
-func (obj *Func) Scope() *Scope {
-	return obj.typ.(*Signature).scope
-}
-
-// A Label represents a declared label.
-type Label struct {
-	object
-	used bool // set if the label was used
-}
-
-func NewLabel(pos token.Pos, pkg *Package, name string) *Label {
-	return &Label{object{pos: pos, pkg: pkg, name: name, typ: Typ[Invalid]}, false}
-}
-
-// A Builtin represents a built-in function.
-// Builtins don't have a valid type.
-type Builtin struct {
-	object
-	id builtinId
-}
-
-func newBuiltin(id builtinId) *Builtin {
-	return &Builtin{object{name: predeclaredFuncs[id].name, typ: Typ[Invalid]}, id}
-}
-
-// Nil represents the predeclared value nil.
-type Nil struct {
-	object
-}
-
-func writeObject(buf *bytes.Buffer, obj Object, qf Qualifier) {
-	typ := obj.Type()
-	switch obj := obj.(type) {
-	case *PkgName:
-		fmt.Fprintf(buf, "package %s", obj.Name())
-		if path := obj.imported.path; path != "" && path != obj.name {
-			fmt.Fprintf(buf, " (%q)", path)
-		}
-		return
-
-	case *Const:
-		buf.WriteString("const")
-
-	case *TypeName:
-		buf.WriteString("type")
-		typ = typ.Underlying()
-
-	case *Var:
-		if obj.isField {
-			buf.WriteString("field")
-		} else {
-			buf.WriteString("var")
-		}
-
-	case *Func:
-		buf.WriteString("func ")
-		writeFuncName(buf, obj, qf)
-		if typ != nil {
-			WriteSignature(buf, typ.(*Signature), qf)
-		}
-		return
-
-	case *Label:
-		buf.WriteString("label")
-		typ = nil
-
-	case *Builtin:
-		buf.WriteString("builtin")
-		typ = nil
-
-	case *Nil:
-		buf.WriteString("nil")
-		return
-
-	default:
-		panic(fmt.Sprintf("writeObject(%T)", obj))
-	}
-
-	buf.WriteByte(' ')
-
-	// For package-level objects, qualify the name.
-	if obj.Pkg() != nil && obj.Pkg().scope.Lookup(obj.Name()) == obj {
-		writePackage(buf, obj.Pkg(), qf)
-	}
-	buf.WriteString(obj.Name())
-	if typ != nil {
-		buf.WriteByte(' ')
-		WriteType(buf, typ, qf)
-	}
-}
-
-func writePackage(buf *bytes.Buffer, pkg *Package, qf Qualifier) {
-	if pkg == nil {
-		return
-	}
-	var s string
-	if qf != nil {
-		s = qf(pkg)
-	} else {
-		s = pkg.Path()
-	}
-	if s != "" {
-		buf.WriteString(s)
-		buf.WriteByte('.')
-	}
-}
-
-// ObjectString returns the string form of obj.
-// The Qualifier controls the printing of
-// package-level objects, and may be nil.
-func ObjectString(obj Object, qf Qualifier) string {
-	var buf bytes.Buffer
-	writeObject(&buf, obj, qf)
-	return buf.String()
-}
-
-func (obj *PkgName) String() string  { return ObjectString(obj, nil) }
-func (obj *Const) String() string    { return ObjectString(obj, nil) }
-func (obj *TypeName) String() string { return ObjectString(obj, nil) }
-func (obj *Var) String() string      { return ObjectString(obj, nil) }
-func (obj *Func) String() string     { return ObjectString(obj, nil) }
-func (obj *Label) String() string    { return ObjectString(obj, nil) }
-func (obj *Builtin) String() string  { return ObjectString(obj, nil) }
-func (obj *Nil) String() string      { return ObjectString(obj, nil) }
-
-func writeFuncName(buf *bytes.Buffer, f *Func, qf Qualifier) {
-	if f.typ != nil {
-		sig := f.typ.(*Signature)
-		if recv := sig.Recv(); recv != nil {
-			buf.WriteByte('(')
-			if _, ok := recv.Type().(*Interface); ok {
-				// gcimporter creates abstract methods of
-				// named interfaces using the interface type
-				// (not the named type) as the receiver.
-				// Don't print it in full.
-				buf.WriteString("interface")
-			} else {
-				WriteType(buf, recv.Type(), qf)
-			}
-			buf.WriteByte(')')
-			buf.WriteByte('.')
-		} else if f.pkg != nil {
-			writePackage(buf, f.pkg, qf)
-		}
-	}
-	buf.WriteString(f.name)
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/objset.go b/third_party/gofrontend/libgo/go/go/types/objset.go
deleted file mode 100644
index 55eb74a..0000000
--- a/third_party/gofrontend/libgo/go/go/types/objset.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements objsets.
-//
-// An objset is similar to a Scope but objset elements
-// are identified by their unique id, instead of their
-// object name.
-
-package types
-
-// An objset is a set of objects identified by their unique id.
-// The zero value for objset is a ready-to-use empty objset.
-type objset map[string]Object // initialized lazily
-
-// insert attempts to insert an object obj into objset s.
-// If s already contains an alternative object alt with
-// the same name, insert leaves s unchanged and returns alt.
-// Otherwise it inserts obj and returns nil.
-func (s *objset) insert(obj Object) Object {
-	id := obj.Id()
-	if alt := (*s)[id]; alt != nil {
-		return alt
-	}
-	if *s == nil {
-		*s = make(map[string]Object)
-	}
-	(*s)[id] = obj
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/operand.go b/third_party/gofrontend/libgo/go/go/types/operand.go
deleted file mode 100644
index d3bab51..0000000
--- a/third_party/gofrontend/libgo/go/go/types/operand.go
+++ /dev/null
@@ -1,287 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file defines operands and associated operations.
-
-package types
-
-import (
-	"bytes"
-	"go/ast"
-	"go/constant"
-	"go/token"
-)
-
-// An operandMode specifies the (addressing) mode of an operand.
-type operandMode byte
-
-const (
-	invalid   operandMode = iota // operand is invalid
-	novalue                      // operand represents no value (result of a function call w/o result)
-	builtin                      // operand is a built-in function
-	typexpr                      // operand is a type
-	constant_                    // operand is a constant; the operand's typ is a Basic type
-	variable                     // operand is an addressable variable
-	mapindex                     // operand is a map index expression (acts like a variable on lhs, commaok on rhs of an assignment)
-	value                        // operand is a computed value
-	commaok                      // like value, but operand may be used in a comma,ok expression
-)
-
-var operandModeString = [...]string{
-	invalid:   "invalid operand",
-	novalue:   "no value",
-	builtin:   "built-in",
-	typexpr:   "type",
-	constant_: "constant",
-	variable:  "variable",
-	mapindex:  "map index expression",
-	value:     "value",
-	commaok:   "comma, ok expression",
-}
-
-// An operand represents an intermediate value during type checking.
-// Operands have an (addressing) mode, the expression evaluating to
-// the operand, the operand's type, a value for constants, and an id
-// for built-in functions.
-// The zero value of operand is a ready to use invalid operand.
-//
-type operand struct {
-	mode operandMode
-	expr ast.Expr
-	typ  Type
-	val  constant.Value
-	id   builtinId
-}
-
-// pos returns the position of the expression corresponding to x.
-// If x is invalid the position is token.NoPos.
-//
-func (x *operand) pos() token.Pos {
-	// x.expr may not be set if x is invalid
-	if x.expr == nil {
-		return token.NoPos
-	}
-	return x.expr.Pos()
-}
-
-// Operand string formats
-// (not all "untyped" cases can appear due to the type system,
-// but they fall out naturally here)
-//
-// mode       format
-//
-// invalid    <expr> (               <mode>                    )
-// novalue    <expr> (               <mode>                    )
-// builtin    <expr> (               <mode>                    )
-// typexpr    <expr> (               <mode>                    )
-//
-// constant   <expr> (<untyped kind> <mode>                    )
-// constant   <expr> (               <mode>       of type <typ>)
-// constant   <expr> (<untyped kind> <mode> <val>              )
-// constant   <expr> (               <mode> <val> of type <typ>)
-//
-// variable   <expr> (<untyped kind> <mode>                    )
-// variable   <expr> (               <mode>       of type <typ>)
-//
-// mapindex   <expr> (<untyped kind> <mode>                    )
-// mapindex   <expr> (               <mode>       of type <typ>)
-//
-// value      <expr> (<untyped kind> <mode>                    )
-// value      <expr> (               <mode>       of type <typ>)
-//
-// commaok    <expr> (<untyped kind> <mode>                    )
-// commaok    <expr> (               <mode>       of type <typ>)
-//
-func operandString(x *operand, qf Qualifier) string {
-	var buf bytes.Buffer
-
-	var expr string
-	if x.expr != nil {
-		expr = ExprString(x.expr)
-	} else {
-		switch x.mode {
-		case builtin:
-			expr = predeclaredFuncs[x.id].name
-		case typexpr:
-			expr = TypeString(x.typ, qf)
-		case constant_:
-			expr = x.val.String()
-		}
-	}
-
-	// <expr> (
-	if expr != "" {
-		buf.WriteString(expr)
-		buf.WriteString(" (")
-	}
-
-	// <untyped kind>
-	hasType := false
-	switch x.mode {
-	case invalid, novalue, builtin, typexpr:
-		// no type
-	default:
-		// has type
-		if isUntyped(x.typ) {
-			buf.WriteString(x.typ.(*Basic).name)
-			buf.WriteByte(' ')
-			break
-		}
-		hasType = true
-	}
-
-	// <mode>
-	buf.WriteString(operandModeString[x.mode])
-
-	// <val>
-	if x.mode == constant_ {
-		if s := x.val.String(); s != expr {
-			buf.WriteByte(' ')
-			buf.WriteString(s)
-		}
-	}
-
-	// <typ>
-	if hasType {
-		if x.typ != Typ[Invalid] {
-			buf.WriteString(" of type ")
-			WriteType(&buf, x.typ, qf)
-		} else {
-			buf.WriteString(" with invalid type")
-		}
-	}
-
-	// )
-	if expr != "" {
-		buf.WriteByte(')')
-	}
-
-	return buf.String()
-}
-
-func (x *operand) String() string {
-	return operandString(x, nil)
-}
-
-// setConst sets x to the untyped constant for literal lit.
-func (x *operand) setConst(tok token.Token, lit string) {
-	val := constant.MakeFromLiteral(lit, tok, 0)
-	if val == nil {
-		// TODO(gri) Should we make it an unknown constant instead?
-		x.mode = invalid
-		return
-	}
-
-	var kind BasicKind
-	switch tok {
-	case token.INT:
-		kind = UntypedInt
-	case token.FLOAT:
-		kind = UntypedFloat
-	case token.IMAG:
-		kind = UntypedComplex
-	case token.CHAR:
-		kind = UntypedRune
-	case token.STRING:
-		kind = UntypedString
-	}
-
-	x.mode = constant_
-	x.typ = Typ[kind]
-	x.val = val
-}
-
-// isNil reports whether x is the nil value.
-func (x *operand) isNil() bool {
-	return x.mode == value && x.typ == Typ[UntypedNil]
-}
-
-// TODO(gri) The functions operand.assignableTo, checker.convertUntyped,
-//           checker.representable, and checker.assignment are
-//           overlapping in functionality. Need to simplify and clean up.
-
-// assignableTo reports whether x is assignable to a variable of type T.
-func (x *operand) assignableTo(conf *Config, T Type) bool {
-	if x.mode == invalid || T == Typ[Invalid] {
-		return true // avoid spurious errors
-	}
-
-	V := x.typ
-
-	// x's type is identical to T
-	if Identical(V, T) {
-		return true
-	}
-
-	Vu := V.Underlying()
-	Tu := T.Underlying()
-
-	// T is an interface type and x implements T
-	// (Do this check first as it might succeed early.)
-	if Ti, ok := Tu.(*Interface); ok {
-		if Implements(x.typ, Ti) {
-			return true
-		}
-	}
-
-	// x's type V and T have identical underlying types
-	// and at least one of V or T is not a named type
-	if Identical(Vu, Tu) && (!isNamed(V) || !isNamed(T)) {
-		return true
-	}
-
-	// x is a bidirectional channel value, T is a channel
-	// type, x's type V and T have identical element types,
-	// and at least one of V or T is not a named type
-	if Vc, ok := Vu.(*Chan); ok && Vc.dir == SendRecv {
-		if Tc, ok := Tu.(*Chan); ok && Identical(Vc.elem, Tc.elem) {
-			return !isNamed(V) || !isNamed(T)
-		}
-	}
-
-	// x is the predeclared identifier nil and T is a pointer,
-	// function, slice, map, channel, or interface type
-	if x.isNil() {
-		switch t := Tu.(type) {
-		case *Basic:
-			if t.kind == UnsafePointer {
-				return true
-			}
-		case *Pointer, *Signature, *Slice, *Map, *Chan, *Interface:
-			return true
-		}
-		return false
-	}
-
-	// x is an untyped constant representable by a value of type T
-	// TODO(gri) This is borrowing from checker.convertUntyped and
-	//           checker.representable. Need to clean up.
-	if isUntyped(Vu) {
-		switch t := Tu.(type) {
-		case *Basic:
-			if x.mode == constant_ {
-				return representableConst(x.val, conf, t.kind, nil)
-			}
-			// The result of a comparison is an untyped boolean,
-			// but may not be a constant.
-			if Vb, _ := Vu.(*Basic); Vb != nil {
-				return Vb.kind == UntypedBool && isBoolean(Tu)
-			}
-		case *Interface:
-			return x.isNil() || t.Empty()
-		case *Pointer, *Signature, *Slice, *Map, *Chan:
-			return x.isNil()
-		}
-	}
-
-	return false
-}
-
-// isInteger reports whether x is value of integer type
-// or an untyped constant representable as an integer.
-func (x *operand) isInteger() bool {
-	return x.mode == invalid ||
-		isInteger(x.typ) ||
-		isUntyped(x.typ) && x.mode == constant_ && representableConst(x.val, nil, UntypedInt, nil) // no *Config required for UntypedInt
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/ordering.go b/third_party/gofrontend/libgo/go/go/types/ordering.go
deleted file mode 100644
index 6bb98f2..0000000
--- a/third_party/gofrontend/libgo/go/go/types/ordering.go
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements resolveOrder.
-
-package types
-
-import (
-	"go/ast"
-	"sort"
-)
-
-// resolveOrder computes the order in which package-level objects
-// must be type-checked.
-//
-// Interface types appear first in the list, sorted topologically
-// by dependencies on embedded interfaces that are also declared
-// in this package, followed by all other objects sorted in source
-// order.
-//
-// TODO(gri) Consider sorting all types by dependencies here, and
-// in the process check _and_ report type cycles. This may simplify
-// the full type-checking phase.
-//
-func (check *Checker) resolveOrder() []Object {
-	var ifaces, others []Object
-
-	// collect interface types with their dependencies, and all other objects
-	for obj := range check.objMap {
-		if ityp := check.interfaceFor(obj); ityp != nil {
-			ifaces = append(ifaces, obj)
-			// determine dependencies on embedded interfaces
-			for _, f := range ityp.Methods.List {
-				if len(f.Names) == 0 {
-					// Embedded interface: The type must be a (possibly
-					// qualified) identifier denoting another interface.
-					// Imported interfaces are already fully resolved,
-					// so we can ignore qualified identifiers.
-					if ident, _ := f.Type.(*ast.Ident); ident != nil {
-						embedded := check.pkg.scope.Lookup(ident.Name)
-						if check.interfaceFor(embedded) != nil {
-							check.objMap[obj].addDep(embedded)
-						}
-					}
-				}
-			}
-		} else {
-			others = append(others, obj)
-		}
-	}
-
-	// final object order
-	var order []Object
-
-	// sort interface types topologically by dependencies,
-	// and in source order if there are no dependencies
-	sort.Sort(inSourceOrder(ifaces))
-	if debug {
-		for _, obj := range ifaces {
-			assert(check.objMap[obj].mark == 0)
-		}
-	}
-	for _, obj := range ifaces {
-		check.appendInPostOrder(&order, obj)
-	}
-
-	// sort everything else in source order
-	sort.Sort(inSourceOrder(others))
-
-	return append(order, others...)
-}
-
-// interfaceFor returns the AST interface denoted by obj, or nil.
-func (check *Checker) interfaceFor(obj Object) *ast.InterfaceType {
-	tname, _ := obj.(*TypeName)
-	if tname == nil {
-		return nil // not a type
-	}
-	d := check.objMap[obj]
-	if d == nil {
-		check.dump("%s: %s should have been declared", obj.Pos(), obj.Name())
-		unreachable()
-	}
-	if d.typ == nil {
-		return nil // invalid AST - ignore (will be handled later)
-	}
-	ityp, _ := d.typ.(*ast.InterfaceType)
-	return ityp
-}
-
-func (check *Checker) appendInPostOrder(order *[]Object, obj Object) {
-	d := check.objMap[obj]
-	if d.mark != 0 {
-		// We've already seen this object; either because it's
-		// already added to order, or because we have a cycle.
-		// In both cases we stop. Cycle errors are reported
-		// when type-checking types.
-		return
-	}
-	d.mark = 1
-
-	for _, obj := range orderedSetObjects(d.deps) {
-		check.appendInPostOrder(order, obj)
-	}
-
-	*order = append(*order, obj)
-}
-
-func orderedSetObjects(set map[Object]bool) []Object {
-	list := make([]Object, len(set))
-	i := 0
-	for obj := range set {
-		// we don't care about the map element value
-		list[i] = obj
-		i++
-	}
-	sort.Sort(inSourceOrder(list))
-	return list
-}
-
-// inSourceOrder implements the sort.Sort interface.
-type inSourceOrder []Object
-
-func (a inSourceOrder) Len() int           { return len(a) }
-func (a inSourceOrder) Less(i, j int) bool { return a[i].order() < a[j].order() }
-func (a inSourceOrder) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
diff --git a/third_party/gofrontend/libgo/go/go/types/package.go b/third_party/gofrontend/libgo/go/go/types/package.go
deleted file mode 100644
index 48fe839..0000000
--- a/third_party/gofrontend/libgo/go/go/types/package.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import (
-	"fmt"
-	"go/token"
-)
-
-// A Package describes a Go package.
-type Package struct {
-	path     string
-	name     string
-	scope    *Scope
-	complete bool
-	imports  []*Package
-	fake     bool // scope lookup errors are silently dropped if package is fake (internal use only)
-}
-
-// NewPackage returns a new Package for the given package path and name;
-// the name must not be the blank identifier.
-// The package is not complete and contains no explicit imports.
-func NewPackage(path, name string) *Package {
-	if name == "_" {
-		panic("invalid package name _")
-	}
-	scope := NewScope(Universe, token.NoPos, token.NoPos, fmt.Sprintf("package %q", path))
-	return &Package{path: path, name: name, scope: scope}
-}
-
-// Path returns the package path.
-func (pkg *Package) Path() string { return pkg.path }
-
-// Name returns the package name.
-func (pkg *Package) Name() string { return pkg.name }
-
-// Scope returns the (complete or incomplete) package scope
-// holding the objects declared at package level (TypeNames,
-// Consts, Vars, and Funcs).
-func (pkg *Package) Scope() *Scope { return pkg.scope }
-
-// A package is complete if its scope contains (at least) all
-// exported objects; otherwise it is incomplete.
-func (pkg *Package) Complete() bool { return pkg.complete }
-
-// MarkComplete marks a package as complete.
-func (pkg *Package) MarkComplete() { pkg.complete = true }
-
-// Imports returns the list of packages directly imported by
-// pkg; the list is in source order. Package unsafe is excluded.
-//
-// If pkg was loaded from export data, Imports includes packages that
-// provide package-level objects referenced by pkg.  This may be more or
-// less than the set of packages directly imported by pkg's source code.
-func (pkg *Package) Imports() []*Package { return pkg.imports }
-
-// SetImports sets the list of explicitly imported packages to list.
-// It is the caller's responsibility to make sure list elements are unique.
-func (pkg *Package) SetImports(list []*Package) { pkg.imports = list }
-
-func (pkg *Package) String() string {
-	return fmt.Sprintf("package %s (%q)", pkg.name, pkg.path)
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/predicates.go b/third_party/gofrontend/libgo/go/go/types/predicates.go
deleted file mode 100644
index 993c6d2..0000000
--- a/third_party/gofrontend/libgo/go/go/types/predicates.go
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements commonly used type predicates.
-
-package types
-
-import "sort"
-
-func isNamed(typ Type) bool {
-	if _, ok := typ.(*Basic); ok {
-		return ok
-	}
-	_, ok := typ.(*Named)
-	return ok
-}
-
-func isBoolean(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsBoolean != 0
-}
-
-func isInteger(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsInteger != 0
-}
-
-func isUnsigned(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsUnsigned != 0
-}
-
-func isFloat(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsFloat != 0
-}
-
-func isComplex(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsComplex != 0
-}
-
-func isNumeric(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsNumeric != 0
-}
-
-func isString(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsString != 0
-}
-
-func isTyped(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return !ok || t.info&IsUntyped == 0
-}
-
-func isUntyped(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsUntyped != 0
-}
-
-func isOrdered(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsOrdered != 0
-}
-
-func isConstType(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsConstType != 0
-}
-
-// IsInterface reports whether typ is an interface type.
-func IsInterface(typ Type) bool {
-	_, ok := typ.Underlying().(*Interface)
-	return ok
-}
-
-// Comparable reports whether values of type T are comparable.
-func Comparable(T Type) bool {
-	switch t := T.Underlying().(type) {
-	case *Basic:
-		// assume invalid types to be comparable
-		// to avoid follow-up errors
-		return t.kind != UntypedNil
-	case *Pointer, *Interface, *Chan:
-		return true
-	case *Struct:
-		for _, f := range t.fields {
-			if !Comparable(f.typ) {
-				return false
-			}
-		}
-		return true
-	case *Array:
-		return Comparable(t.elem)
-	}
-	return false
-}
-
-// hasNil reports whether a type includes the nil value.
-func hasNil(typ Type) bool {
-	switch t := typ.Underlying().(type) {
-	case *Basic:
-		return t.kind == UnsafePointer
-	case *Slice, *Pointer, *Signature, *Interface, *Map, *Chan:
-		return true
-	}
-	return false
-}
-
-// Identical reports whether x and y are identical.
-func Identical(x, y Type) bool {
-	return identical(x, y, nil)
-}
-
-// An ifacePair is a node in a stack of interface type pairs compared for identity.
-type ifacePair struct {
-	x, y *Interface
-	prev *ifacePair
-}
-
-func (p *ifacePair) identical(q *ifacePair) bool {
-	return p.x == q.x && p.y == q.y || p.x == q.y && p.y == q.x
-}
-
-func identical(x, y Type, p *ifacePair) bool {
-	if x == y {
-		return true
-	}
-
-	switch x := x.(type) {
-	case *Basic:
-		// Basic types are singletons except for the rune and byte
-		// aliases, thus we cannot solely rely on the x == y check
-		// above.
-		if y, ok := y.(*Basic); ok {
-			return x.kind == y.kind
-		}
-
-	case *Array:
-		// Two array types are identical if they have identical element types
-		// and the same array length.
-		if y, ok := y.(*Array); ok {
-			return x.len == y.len && identical(x.elem, y.elem, p)
-		}
-
-	case *Slice:
-		// Two slice types are identical if they have identical element types.
-		if y, ok := y.(*Slice); ok {
-			return identical(x.elem, y.elem, p)
-		}
-
-	case *Struct:
-		// Two struct types are identical if they have the same sequence of fields,
-		// and if corresponding fields have the same names, and identical types,
-		// and identical tags. Two anonymous fields are considered to have the same
-		// name. Lower-case field names from different packages are always different.
-		if y, ok := y.(*Struct); ok {
-			if x.NumFields() == y.NumFields() {
-				for i, f := range x.fields {
-					g := y.fields[i]
-					if f.anonymous != g.anonymous ||
-						x.Tag(i) != y.Tag(i) ||
-						!f.sameId(g.pkg, g.name) ||
-						!identical(f.typ, g.typ, p) {
-						return false
-					}
-				}
-				return true
-			}
-		}
-
-	case *Pointer:
-		// Two pointer types are identical if they have identical base types.
-		if y, ok := y.(*Pointer); ok {
-			return identical(x.base, y.base, p)
-		}
-
-	case *Tuple:
-		// Two tuples types are identical if they have the same number of elements
-		// and corresponding elements have identical types.
-		if y, ok := y.(*Tuple); ok {
-			if x.Len() == y.Len() {
-				if x != nil {
-					for i, v := range x.vars {
-						w := y.vars[i]
-						if !identical(v.typ, w.typ, p) {
-							return false
-						}
-					}
-				}
-				return true
-			}
-		}
-
-	case *Signature:
-		// Two function types are identical if they have the same number of parameters
-		// and result values, corresponding parameter and result types are identical,
-		// and either both functions are variadic or neither is. Parameter and result
-		// names are not required to match.
-		if y, ok := y.(*Signature); ok {
-			return x.variadic == y.variadic &&
-				identical(x.params, y.params, p) &&
-				identical(x.results, y.results, p)
-		}
-
-	case *Interface:
-		// Two interface types are identical if they have the same set of methods with
-		// the same names and identical function types. Lower-case method names from
-		// different packages are always different. The order of the methods is irrelevant.
-		if y, ok := y.(*Interface); ok {
-			a := x.allMethods
-			b := y.allMethods
-			if len(a) == len(b) {
-				// Interface types are the only types where cycles can occur
-				// that are not "terminated" via named types; and such cycles
-				// can only be created via method parameter types that are
-				// anonymous interfaces (directly or indirectly) embedding
-				// the current interface. Example:
-				//
-				//    type T interface {
-				//        m() interface{T}
-				//    }
-				//
-				// If two such (differently named) interfaces are compared,
-				// endless recursion occurs if the cycle is not detected.
-				//
-				// If x and y were compared before, they must be equal
-				// (if they were not, the recursion would have stopped);
-				// search the ifacePair stack for the same pair.
-				//
-				// This is a quadratic algorithm, but in practice these stacks
-				// are extremely short (bounded by the nesting depth of interface
-				// type declarations that recur via parameter types, an extremely
-				// rare occurrence). An alternative implementation might use a
-				// "visited" map, but that is probably less efficient overall.
-				q := &ifacePair{x, y, p}
-				for p != nil {
-					if p.identical(q) {
-						return true // same pair was compared before
-					}
-					p = p.prev
-				}
-				if debug {
-					assert(sort.IsSorted(byUniqueMethodName(a)))
-					assert(sort.IsSorted(byUniqueMethodName(b)))
-				}
-				for i, f := range a {
-					g := b[i]
-					if f.Id() != g.Id() || !identical(f.typ, g.typ, q) {
-						return false
-					}
-				}
-				return true
-			}
-		}
-
-	case *Map:
-		// Two map types are identical if they have identical key and value types.
-		if y, ok := y.(*Map); ok {
-			return identical(x.key, y.key, p) && identical(x.elem, y.elem, p)
-		}
-
-	case *Chan:
-		// Two channel types are identical if they have identical value types
-		// and the same direction.
-		if y, ok := y.(*Chan); ok {
-			return x.dir == y.dir && identical(x.elem, y.elem, p)
-		}
-
-	case *Named:
-		// Two named types are identical if their type names originate
-		// in the same type declaration.
-		if y, ok := y.(*Named); ok {
-			return x.obj == y.obj
-		}
-
-	default:
-		unreachable()
-	}
-
-	return false
-}
-
-// defaultType returns the default "typed" type for an "untyped" type;
-// it returns the incoming type for all other types. The default type
-// for untyped nil is untyped nil.
-//
-func defaultType(typ Type) Type {
-	if t, ok := typ.(*Basic); ok {
-		switch t.kind {
-		case UntypedBool:
-			return Typ[Bool]
-		case UntypedInt:
-			return Typ[Int]
-		case UntypedRune:
-			return universeRune // use 'rune' name
-		case UntypedFloat:
-			return Typ[Float64]
-		case UntypedComplex:
-			return Typ[Complex128]
-		case UntypedString:
-			return Typ[String]
-		}
-	}
-	return typ
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/resolver.go b/third_party/gofrontend/libgo/go/go/types/resolver.go
deleted file mode 100644
index c31ef42..0000000
--- a/third_party/gofrontend/libgo/go/go/types/resolver.go
+++ /dev/null
@@ -1,445 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import (
-	"fmt"
-	"go/ast"
-	"go/constant"
-	"go/token"
-	pathLib "path"
-	"strconv"
-	"strings"
-	"unicode"
-)
-
-// A declInfo describes a package-level const, type, var, or func declaration.
-type declInfo struct {
-	file  *Scope        // scope of file containing this declaration
-	lhs   []*Var        // lhs of n:1 variable declarations, or nil
-	typ   ast.Expr      // type, or nil
-	init  ast.Expr      // init expression, or nil
-	fdecl *ast.FuncDecl // func declaration, or nil
-
-	deps map[Object]bool // type and init dependencies; lazily allocated
-	mark int             // for dependency analysis
-}
-
-// hasInitializer reports whether the declared object has an initialization
-// expression or function body.
-func (d *declInfo) hasInitializer() bool {
-	return d.init != nil || d.fdecl != nil && d.fdecl.Body != nil
-}
-
-// addDep adds obj as a dependency to d.
-func (d *declInfo) addDep(obj Object) {
-	m := d.deps
-	if m == nil {
-		m = make(map[Object]bool)
-		d.deps = m
-	}
-	m[obj] = true
-}
-
-// arityMatch checks that the lhs and rhs of a const or var decl
-// have the appropriate number of names and init exprs. For const
-// decls, init is the value spec providing the init exprs; for
-// var decls, init is nil (the init exprs are in s in this case).
-func (check *Checker) arityMatch(s, init *ast.ValueSpec) {
-	l := len(s.Names)
-	r := len(s.Values)
-	if init != nil {
-		r = len(init.Values)
-	}
-
-	switch {
-	case init == nil && r == 0:
-		// var decl w/o init expr
-		if s.Type == nil {
-			check.errorf(s.Pos(), "missing type or init expr")
-		}
-	case l < r:
-		if l < len(s.Values) {
-			// init exprs from s
-			n := s.Values[l]
-			check.errorf(n.Pos(), "extra init expr %s", n)
-			// TODO(gri) avoid declared but not used error here
-		} else {
-			// init exprs "inherited"
-			check.errorf(s.Pos(), "extra init expr at %s", init.Pos())
-			// TODO(gri) avoid declared but not used error here
-		}
-	case l > r && (init != nil || r != 1):
-		n := s.Names[r]
-		check.errorf(n.Pos(), "missing init expr for %s", n)
-	}
-}
-
-func validatedImportPath(path string) (string, error) {
-	s, err := strconv.Unquote(path)
-	if err != nil {
-		return "", err
-	}
-	if s == "" {
-		return "", fmt.Errorf("empty string")
-	}
-	const illegalChars = `!"#$%&'()*,:;<=>?[\]^{|}` + "`\uFFFD"
-	for _, r := range s {
-		if !unicode.IsGraphic(r) || unicode.IsSpace(r) || strings.ContainsRune(illegalChars, r) {
-			return s, fmt.Errorf("invalid character %#U", r)
-		}
-	}
-	return s, nil
-}
-
-// declarePkgObj declares obj in the package scope, records its ident -> obj mapping,
-// and updates check.objMap. The object must not be a function or method.
-func (check *Checker) declarePkgObj(ident *ast.Ident, obj Object, d *declInfo) {
-	assert(ident.Name == obj.Name())
-
-	// spec: "A package-scope or file-scope identifier with name init
-	// may only be declared to be a function with this (func()) signature."
-	if ident.Name == "init" {
-		check.errorf(ident.Pos(), "cannot declare init - must be func")
-		return
-	}
-
-	check.declare(check.pkg.scope, ident, obj, token.NoPos)
-	check.objMap[obj] = d
-	obj.setOrder(uint32(len(check.objMap)))
-}
-
-// filename returns a filename suitable for debugging output.
-func (check *Checker) filename(fileNo int) string {
-	file := check.files[fileNo]
-	if pos := file.Pos(); pos.IsValid() {
-		return check.fset.File(pos).Name()
-	}
-	return fmt.Sprintf("file[%d]", fileNo)
-}
-
-// collectObjects collects all file and package objects and inserts them
-// into their respective scopes. It also performs imports and associates
-// methods with receiver base type names.
-func (check *Checker) collectObjects() {
-	pkg := check.pkg
-
-	// pkgImports is the set of packages already imported by any package file seen
-	// so far. Used to avoid duplicate entries in pkg.imports. Allocate and populate
-	// it (pkg.imports may not be empty if we are checking test files incrementally).
-	var pkgImports = make(map[*Package]bool)
-	for _, imp := range pkg.imports {
-		pkgImports[imp] = true
-	}
-
-	for fileNo, file := range check.files {
-		// The package identifier denotes the current package,
-		// but there is no corresponding package object.
-		check.recordDef(file.Name, nil)
-
-		// Use the actual source file extent rather than *ast.File extent since the
-		// latter doesn't include comments which appear at the start or end of the file.
-		// Be conservative and use the *ast.File extent if we don't have a *token.File.
-		pos, end := file.Pos(), file.End()
-		if f := check.fset.File(file.Pos()); f != nil {
-			pos, end = token.Pos(f.Base()), token.Pos(f.Base()+f.Size())
-		}
-		fileScope := NewScope(check.pkg.scope, pos, end, check.filename(fileNo))
-		check.recordScope(file, fileScope)
-
-		for _, decl := range file.Decls {
-			switch d := decl.(type) {
-			case *ast.BadDecl:
-				// ignore
-
-			case *ast.GenDecl:
-				var last *ast.ValueSpec // last ValueSpec with type or init exprs seen
-				for iota, spec := range d.Specs {
-					switch s := spec.(type) {
-					case *ast.ImportSpec:
-						// import package
-						var imp *Package
-						path, err := validatedImportPath(s.Path.Value)
-						if err != nil {
-							check.errorf(s.Path.Pos(), "invalid import path (%s)", err)
-							continue
-						}
-						if path == "C" && check.conf.FakeImportC {
-							// TODO(gri) shouldn't create a new one each time
-							imp = NewPackage("C", "C")
-							imp.fake = true
-						} else if path == "unsafe" {
-							// package "unsafe" is known to the language
-							imp = Unsafe
-						} else {
-							if importer := check.conf.Importer; importer != nil {
-								imp, err = importer.Import(path)
-								if imp == nil && err == nil {
-									err = fmt.Errorf("Config.Importer.Import(%s) returned nil but no error", path)
-								}
-							} else {
-								err = fmt.Errorf("Config.Importer not installed")
-							}
-							if err != nil {
-								check.errorf(s.Path.Pos(), "could not import %s (%s)", path, err)
-								continue
-							}
-						}
-
-						// add package to list of explicit imports
-						// (this functionality is provided as a convenience
-						// for clients; it is not needed for type-checking)
-						if !pkgImports[imp] {
-							pkgImports[imp] = true
-							if imp != Unsafe {
-								pkg.imports = append(pkg.imports, imp)
-							}
-						}
-
-						// local name overrides imported package name
-						name := imp.name
-						if s.Name != nil {
-							name = s.Name.Name
-							if name == "init" {
-								check.errorf(s.Name.Pos(), "cannot declare init - must be func")
-								continue
-							}
-						}
-
-						obj := NewPkgName(s.Pos(), pkg, name, imp)
-						if s.Name != nil {
-							// in a dot-import, the dot represents the package
-							check.recordDef(s.Name, obj)
-						} else {
-							check.recordImplicit(s, obj)
-						}
-
-						// add import to file scope
-						if name == "." {
-							// merge imported scope with file scope
-							for _, obj := range imp.scope.elems {
-								// A package scope may contain non-exported objects,
-								// do not import them!
-								if obj.Exported() {
-									// TODO(gri) When we import a package, we create
-									// a new local package object. We should do the
-									// same for each dot-imported object. That way
-									// they can have correct position information.
-									// (We must not modify their existing position
-									// information because the same package - found
-									// via Config.Packages - may be dot-imported in
-									// another package!)
-									check.declare(fileScope, nil, obj, token.NoPos)
-									check.recordImplicit(s, obj)
-								}
-							}
-							// add position to set of dot-import positions for this file
-							// (this is only needed for "imported but not used" errors)
-							check.addUnusedDotImport(fileScope, imp, s.Pos())
-						} else {
-							// declare imported package object in file scope
-							check.declare(fileScope, nil, obj, token.NoPos)
-						}
-
-					case *ast.ValueSpec:
-						switch d.Tok {
-						case token.CONST:
-							// determine which initialization expressions to use
-							switch {
-							case s.Type != nil || len(s.Values) > 0:
-								last = s
-							case last == nil:
-								last = new(ast.ValueSpec) // make sure last exists
-							}
-
-							// declare all constants
-							for i, name := range s.Names {
-								obj := NewConst(name.Pos(), pkg, name.Name, nil, constant.MakeInt64(int64(iota)))
-
-								var init ast.Expr
-								if i < len(last.Values) {
-									init = last.Values[i]
-								}
-
-								d := &declInfo{file: fileScope, typ: last.Type, init: init}
-								check.declarePkgObj(name, obj, d)
-							}
-
-							check.arityMatch(s, last)
-
-						case token.VAR:
-							lhs := make([]*Var, len(s.Names))
-							// If there's exactly one rhs initializer, use
-							// the same declInfo d1 for all lhs variables
-							// so that each lhs variable depends on the same
-							// rhs initializer (n:1 var declaration).
-							var d1 *declInfo
-							if len(s.Values) == 1 {
-								// The lhs elements are only set up after the for loop below,
-								// but that's ok because declareVar only collects the declInfo
-								// for a later phase.
-								d1 = &declInfo{file: fileScope, lhs: lhs, typ: s.Type, init: s.Values[0]}
-							}
-
-							// declare all variables
-							for i, name := range s.Names {
-								obj := NewVar(name.Pos(), pkg, name.Name, nil)
-								lhs[i] = obj
-
-								d := d1
-								if d == nil {
-									// individual assignments
-									var init ast.Expr
-									if i < len(s.Values) {
-										init = s.Values[i]
-									}
-									d = &declInfo{file: fileScope, typ: s.Type, init: init}
-								}
-
-								check.declarePkgObj(name, obj, d)
-							}
-
-							check.arityMatch(s, nil)
-
-						default:
-							check.invalidAST(s.Pos(), "invalid token %s", d.Tok)
-						}
-
-					case *ast.TypeSpec:
-						obj := NewTypeName(s.Name.Pos(), pkg, s.Name.Name, nil)
-						check.declarePkgObj(s.Name, obj, &declInfo{file: fileScope, typ: s.Type})
-
-					default:
-						check.invalidAST(s.Pos(), "unknown ast.Spec node %T", s)
-					}
-				}
-
-			case *ast.FuncDecl:
-				name := d.Name.Name
-				obj := NewFunc(d.Name.Pos(), pkg, name, nil)
-				if d.Recv == nil {
-					// regular function
-					if name == "init" {
-						// don't declare init functions in the package scope - they are invisible
-						obj.parent = pkg.scope
-						check.recordDef(d.Name, obj)
-						// init functions must have a body
-						if d.Body == nil {
-							check.softErrorf(obj.pos, "missing function body")
-						}
-					} else {
-						check.declare(pkg.scope, d.Name, obj, token.NoPos)
-					}
-				} else {
-					// method
-					check.recordDef(d.Name, obj)
-					// Associate method with receiver base type name, if possible.
-					// Ignore methods that have an invalid receiver, or a blank _
-					// receiver name. They will be type-checked later, with regular
-					// functions.
-					if list := d.Recv.List; len(list) > 0 {
-						typ := list[0].Type
-						if ptr, _ := typ.(*ast.StarExpr); ptr != nil {
-							typ = ptr.X
-						}
-						if base, _ := typ.(*ast.Ident); base != nil && base.Name != "_" {
-							check.assocMethod(base.Name, obj)
-						}
-					}
-				}
-				info := &declInfo{file: fileScope, fdecl: d}
-				check.objMap[obj] = info
-				obj.setOrder(uint32(len(check.objMap)))
-
-			default:
-				check.invalidAST(d.Pos(), "unknown ast.Decl node %T", d)
-			}
-		}
-	}
-
-	// verify that objects in package and file scopes have different names
-	for _, scope := range check.pkg.scope.children /* file scopes */ {
-		for _, obj := range scope.elems {
-			if alt := pkg.scope.Lookup(obj.Name()); alt != nil {
-				if pkg, ok := obj.(*PkgName); ok {
-					check.errorf(alt.Pos(), "%s already declared through import of %s", alt.Name(), pkg.Imported())
-					check.reportAltDecl(pkg)
-				} else {
-					check.errorf(alt.Pos(), "%s already declared through dot-import of %s", alt.Name(), obj.Pkg())
-					// TODO(gri) dot-imported objects don't have a position; reportAltDecl won't print anything
-					check.reportAltDecl(obj)
-				}
-			}
-		}
-	}
-}
-
-// packageObjects typechecks all package objects in objList, but not function bodies.
-func (check *Checker) packageObjects(objList []Object) {
-	// add new methods to already type-checked types (from a prior Checker.Files call)
-	for _, obj := range objList {
-		if obj, _ := obj.(*TypeName); obj != nil && obj.typ != nil {
-			check.addMethodDecls(obj)
-		}
-	}
-
-	// pre-allocate space for type declaration paths so that the underlying array is reused
-	typePath := make([]*TypeName, 0, 8)
-
-	for _, obj := range objList {
-		check.objDecl(obj, nil, typePath)
-	}
-
-	// At this point we may have a non-empty check.methods map; this means that not all
-	// entries were deleted at the end of typeDecl because the respective receiver base
-	// types were not found. In that case, an error was reported when declaring those
-	// methods. We can now safely discard this map.
-	check.methods = nil
-}
-
-// functionBodies typechecks all function bodies.
-func (check *Checker) functionBodies() {
-	for _, f := range check.funcs {
-		check.funcBody(f.decl, f.name, f.sig, f.body)
-	}
-}
-
-// unusedImports checks for unused imports.
-func (check *Checker) unusedImports() {
-	// if function bodies are not checked, packages' uses are likely missing - don't check
-	if check.conf.IgnoreFuncBodies {
-		return
-	}
-
-	// spec: "It is illegal (...) to directly import a package without referring to
-	// any of its exported identifiers. To import a package solely for its side-effects
-	// (initialization), use the blank identifier as explicit package name."
-
-	// check use of regular imported packages
-	for _, scope := range check.pkg.scope.children /* file scopes */ {
-		for _, obj := range scope.elems {
-			if obj, ok := obj.(*PkgName); ok {
-				// Unused "blank imports" are automatically ignored
-				// since _ identifiers are not entered into scopes.
-				if !obj.used {
-					path := obj.imported.path
-					base := pathLib.Base(path)
-					if obj.name == base {
-						check.softErrorf(obj.pos, "%q imported but not used", path)
-					} else {
-						check.softErrorf(obj.pos, "%q imported but not used as %s", path, obj.name)
-					}
-				}
-			}
-		}
-	}
-
-	// check use of dot-imported packages
-	for _, unusedDotImports := range check.unusedDotImports {
-		for pkg, pos := range unusedDotImports {
-			check.softErrorf(pos, "%q imported but not used", pkg.path)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/resolver_test.go b/third_party/gofrontend/libgo/go/go/types/resolver_test.go
deleted file mode 100644
index 34deae2..0000000
--- a/third_party/gofrontend/libgo/go/go/types/resolver_test.go
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"fmt"
-	"go/ast"
-	"go/importer"
-	"go/parser"
-	"go/token"
-	"internal/testenv"
-	"sort"
-	"testing"
-
-	. "go/types"
-)
-
-type resolveTestImporter struct {
-	importer Importer
-	imported map[string]bool
-}
-
-func (imp *resolveTestImporter) Import(path string) (*Package, error) {
-	if imp.importer == nil {
-		imp.importer = importer.Default()
-		imp.imported = make(map[string]bool)
-	}
-	pkg, err := imp.importer.Import(path)
-	if err != nil {
-		return nil, err
-	}
-	imp.imported[path] = true
-	return pkg, nil
-}
-
-func TestResolveIdents(t *testing.T) {
-	testenv.MustHaveGoBuild(t)
-
-	sources := []string{
-		`
-		package p
-		import "fmt"
-		import "math"
-		const pi = math.Pi
-		func sin(x float64) float64 {
-			return math.Sin(x)
-		}
-		var Println = fmt.Println
-		`,
-		`
-		package p
-		import "fmt"
-		type errorStringer struct { fmt.Stringer; error }
-		func f() string {
-			_ = "foo"
-			return fmt.Sprintf("%d", g())
-		}
-		func g() (x int) { return }
-		`,
-		`
-		package p
-		import . "go/parser"
-		import "sync"
-		func h() Mode { return ImportsOnly }
-		var _, x int = 1, 2
-		func init() {}
-		type T struct{ *sync.Mutex; a, b, c int}
-		type I interface{ m() }
-		var _ = T{a: 1, b: 2, c: 3}
-		func (_ T) m() {}
-		func (T) _() {}
-		var i I
-		var _ = i.m
-		func _(s []int) { for i, x := range s { _, _ = i, x } }
-		func _(x interface{}) {
-			switch x := x.(type) {
-			case int:
-				_ = x
-			}
-			switch {} // implicit 'true' tag
-		}
-		`,
-		`
-		package p
-		type S struct{}
-		func (T) _() {}
-		func (T) _() {}
-		`,
-		`
-		package p
-		func _() {
-		L0:
-		L1:
-			goto L0
-			for {
-				goto L1
-			}
-			if true {
-				goto L2
-			}
-		L2:
-		}
-		`,
-	}
-
-	pkgnames := []string{
-		"fmt",
-		"math",
-	}
-
-	// parse package files
-	fset := token.NewFileSet()
-	var files []*ast.File
-	for i, src := range sources {
-		f, err := parser.ParseFile(fset, fmt.Sprintf("sources[%d]", i), src, parser.DeclarationErrors)
-		if err != nil {
-			t.Fatal(err)
-		}
-		files = append(files, f)
-	}
-
-	// resolve and type-check package AST
-	importer := new(resolveTestImporter)
-	conf := Config{Importer: importer}
-	uses := make(map[*ast.Ident]Object)
-	defs := make(map[*ast.Ident]Object)
-	_, err := conf.Check("testResolveIdents", fset, files, &Info{Defs: defs, Uses: uses})
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// check that all packages were imported
-	for _, name := range pkgnames {
-		if !importer.imported[name] {
-			t.Errorf("package %s not imported", name)
-		}
-	}
-
-	// check that qualified identifiers are resolved
-	for _, f := range files {
-		ast.Inspect(f, func(n ast.Node) bool {
-			if s, ok := n.(*ast.SelectorExpr); ok {
-				if x, ok := s.X.(*ast.Ident); ok {
-					obj := uses[x]
-					if obj == nil {
-						t.Errorf("%s: unresolved qualified identifier %s", fset.Position(x.Pos()), x.Name)
-						return false
-					}
-					if _, ok := obj.(*PkgName); ok && uses[s.Sel] == nil {
-						t.Errorf("%s: unresolved selector %s", fset.Position(s.Sel.Pos()), s.Sel.Name)
-						return false
-					}
-					return false
-				}
-				return false
-			}
-			return true
-		})
-	}
-
-	for id, obj := range uses {
-		if obj == nil {
-			t.Errorf("%s: Uses[%s] == nil", fset.Position(id.Pos()), id.Name)
-		}
-	}
-
-	// check that each identifier in the source is found in uses or defs or both
-	var both []string
-	for _, f := range files {
-		ast.Inspect(f, func(n ast.Node) bool {
-			if x, ok := n.(*ast.Ident); ok {
-				var objects int
-				if _, found := uses[x]; found {
-					objects |= 1
-					delete(uses, x)
-				}
-				if _, found := defs[x]; found {
-					objects |= 2
-					delete(defs, x)
-				}
-				if objects == 0 {
-					t.Errorf("%s: unresolved identifier %s", fset.Position(x.Pos()), x.Name)
-				} else if objects == 3 {
-					both = append(both, x.Name)
-				}
-				return false
-			}
-			return true
-		})
-	}
-
-	// check the expected set of idents that are simultaneously uses and defs
-	sort.Strings(both)
-	if got, want := fmt.Sprint(both), "[Mutex Stringer error]"; got != want {
-		t.Errorf("simultaneous uses/defs = %s, want %s", got, want)
-	}
-
-	// any left-over identifiers didn't exist in the source
-	for x := range uses {
-		t.Errorf("%s: identifier %s not present in source", fset.Position(x.Pos()), x.Name)
-	}
-	for x := range defs {
-		t.Errorf("%s: identifier %s not present in source", fset.Position(x.Pos()), x.Name)
-	}
-
-	// TODO(gri) add tests to check ImplicitObj callbacks
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/return.go b/third_party/gofrontend/libgo/go/go/types/return.go
deleted file mode 100644
index 6628985..0000000
--- a/third_party/gofrontend/libgo/go/go/types/return.go
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements isTerminating.
-
-package types
-
-import (
-	"go/ast"
-	"go/token"
-)
-
-// isTerminating reports if s is a terminating statement.
-// If s is labeled, label is the label name; otherwise s
-// is "".
-func (check *Checker) isTerminating(s ast.Stmt, label string) bool {
-	switch s := s.(type) {
-	default:
-		unreachable()
-
-	case *ast.BadStmt, *ast.DeclStmt, *ast.EmptyStmt, *ast.SendStmt,
-		*ast.IncDecStmt, *ast.AssignStmt, *ast.GoStmt, *ast.DeferStmt,
-		*ast.RangeStmt:
-		// no chance
-
-	case *ast.LabeledStmt:
-		return check.isTerminating(s.Stmt, s.Label.Name)
-
-	case *ast.ExprStmt:
-		// the predeclared (possibly parenthesized) panic() function is terminating
-		if call, _ := unparen(s.X).(*ast.CallExpr); call != nil {
-			if id, _ := call.Fun.(*ast.Ident); id != nil {
-				if _, obj := check.scope.LookupParent(id.Name, token.NoPos); obj != nil {
-					if b, _ := obj.(*Builtin); b != nil && b.id == _Panic {
-						return true
-					}
-				}
-			}
-		}
-
-	case *ast.ReturnStmt:
-		return true
-
-	case *ast.BranchStmt:
-		if s.Tok == token.GOTO || s.Tok == token.FALLTHROUGH {
-			return true
-		}
-
-	case *ast.BlockStmt:
-		return check.isTerminatingList(s.List, "")
-
-	case *ast.IfStmt:
-		if s.Else != nil &&
-			check.isTerminating(s.Body, "") &&
-			check.isTerminating(s.Else, "") {
-			return true
-		}
-
-	case *ast.SwitchStmt:
-		return check.isTerminatingSwitch(s.Body, label)
-
-	case *ast.TypeSwitchStmt:
-		return check.isTerminatingSwitch(s.Body, label)
-
-	case *ast.SelectStmt:
-		for _, s := range s.Body.List {
-			cc := s.(*ast.CommClause)
-			if !check.isTerminatingList(cc.Body, "") || hasBreakList(cc.Body, label, true) {
-				return false
-			}
-
-		}
-		return true
-
-	case *ast.ForStmt:
-		if s.Cond == nil && !hasBreak(s.Body, label, true) {
-			return true
-		}
-	}
-
-	return false
-}
-
-func (check *Checker) isTerminatingList(list []ast.Stmt, label string) bool {
-	n := len(list)
-	return n > 0 && check.isTerminating(list[n-1], label)
-}
-
-func (check *Checker) isTerminatingSwitch(body *ast.BlockStmt, label string) bool {
-	hasDefault := false
-	for _, s := range body.List {
-		cc := s.(*ast.CaseClause)
-		if cc.List == nil {
-			hasDefault = true
-		}
-		if !check.isTerminatingList(cc.Body, "") || hasBreakList(cc.Body, label, true) {
-			return false
-		}
-	}
-	return hasDefault
-}
-
-// TODO(gri) For nested breakable statements, the current implementation of hasBreak
-//	     will traverse the same subtree repeatedly, once for each label. Replace
-//           with a single-pass label/break matching phase.
-
-// hasBreak reports if s is or contains a break statement
-// referring to the label-ed statement or implicit-ly the
-// closest outer breakable statement.
-func hasBreak(s ast.Stmt, label string, implicit bool) bool {
-	switch s := s.(type) {
-	default:
-		unreachable()
-
-	case *ast.BadStmt, *ast.DeclStmt, *ast.EmptyStmt, *ast.ExprStmt,
-		*ast.SendStmt, *ast.IncDecStmt, *ast.AssignStmt, *ast.GoStmt,
-		*ast.DeferStmt, *ast.ReturnStmt:
-		// no chance
-
-	case *ast.LabeledStmt:
-		return hasBreak(s.Stmt, label, implicit)
-
-	case *ast.BranchStmt:
-		if s.Tok == token.BREAK {
-			if s.Label == nil {
-				return implicit
-			}
-			if s.Label.Name == label {
-				return true
-			}
-		}
-
-	case *ast.BlockStmt:
-		return hasBreakList(s.List, label, implicit)
-
-	case *ast.IfStmt:
-		if hasBreak(s.Body, label, implicit) ||
-			s.Else != nil && hasBreak(s.Else, label, implicit) {
-			return true
-		}
-
-	case *ast.CaseClause:
-		return hasBreakList(s.Body, label, implicit)
-
-	case *ast.SwitchStmt:
-		if label != "" && hasBreak(s.Body, label, false) {
-			return true
-		}
-
-	case *ast.TypeSwitchStmt:
-		if label != "" && hasBreak(s.Body, label, false) {
-			return true
-		}
-
-	case *ast.CommClause:
-		return hasBreakList(s.Body, label, implicit)
-
-	case *ast.SelectStmt:
-		if label != "" && hasBreak(s.Body, label, false) {
-			return true
-		}
-
-	case *ast.ForStmt:
-		if label != "" && hasBreak(s.Body, label, false) {
-			return true
-		}
-
-	case *ast.RangeStmt:
-		if label != "" && hasBreak(s.Body, label, false) {
-			return true
-		}
-	}
-
-	return false
-}
-
-func hasBreakList(list []ast.Stmt, label string, implicit bool) bool {
-	for _, s := range list {
-		if hasBreak(s, label, implicit) {
-			return true
-		}
-	}
-	return false
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/scope.go b/third_party/gofrontend/libgo/go/go/types/scope.go
deleted file mode 100644
index 3502840..0000000
--- a/third_party/gofrontend/libgo/go/go/types/scope.go
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements Scopes.
-
-package types
-
-import (
-	"bytes"
-	"fmt"
-	"go/token"
-	"io"
-	"sort"
-	"strings"
-)
-
-// TODO(gri) Provide scopes with a name or other mechanism so that
-//           objects can use that information for better printing.
-
-// A Scope maintains a set of objects and links to its containing
-// (parent) and contained (children) scopes. Objects may be inserted
-// and looked up by name. The zero value for Scope is a ready-to-use
-// empty scope.
-type Scope struct {
-	parent   *Scope
-	children []*Scope
-	elems    map[string]Object // lazily allocated
-	pos, end token.Pos         // scope extent; may be invalid
-	comment  string            // for debugging only
-}
-
-// NewScope returns a new, empty scope contained in the given parent
-// scope, if any.  The comment is for debugging only.
-func NewScope(parent *Scope, pos, end token.Pos, comment string) *Scope {
-	s := &Scope{parent, nil, nil, pos, end, comment}
-	// don't add children to Universe scope!
-	if parent != nil && parent != Universe {
-		parent.children = append(parent.children, s)
-	}
-	return s
-}
-
-// Parent returns the scope's containing (parent) scope.
-func (s *Scope) Parent() *Scope { return s.parent }
-
-// Len() returns the number of scope elements.
-func (s *Scope) Len() int { return len(s.elems) }
-
-// Names returns the scope's element names in sorted order.
-func (s *Scope) Names() []string {
-	names := make([]string, len(s.elems))
-	i := 0
-	for name := range s.elems {
-		names[i] = name
-		i++
-	}
-	sort.Strings(names)
-	return names
-}
-
-// NumChildren() returns the number of scopes nested in s.
-func (s *Scope) NumChildren() int { return len(s.children) }
-
-// Child returns the i'th child scope for 0 <= i < NumChildren().
-func (s *Scope) Child(i int) *Scope { return s.children[i] }
-
-// Lookup returns the object in scope s with the given name if such an
-// object exists; otherwise the result is nil.
-func (s *Scope) Lookup(name string) Object {
-	return s.elems[name]
-}
-
-// LookupParent follows the parent chain of scopes starting with s until
-// it finds a scope where Lookup(name) returns a non-nil object, and then
-// returns that scope and object. If a valid position pos is provided,
-// only objects that were declared at or before pos are considered.
-// If no such scope and object exists, the result is (nil, nil).
-//
-// Note that obj.Parent() may be different from the returned scope if the
-// object was inserted into the scope and already had a parent at that
-// time (see Insert, below). This can only happen for dot-imported objects
-// whose scope is the scope of the package that exported them.
-func (s *Scope) LookupParent(name string, pos token.Pos) (*Scope, Object) {
-	for ; s != nil; s = s.parent {
-		if obj := s.elems[name]; obj != nil && (!pos.IsValid() || obj.scopePos() <= pos) {
-			return s, obj
-		}
-	}
-	return nil, nil
-}
-
-// Insert attempts to insert an object obj into scope s.
-// If s already contains an alternative object alt with
-// the same name, Insert leaves s unchanged and returns alt.
-// Otherwise it inserts obj, sets the object's parent scope
-// if not already set, and returns nil.
-func (s *Scope) Insert(obj Object) Object {
-	name := obj.Name()
-	if alt := s.elems[name]; alt != nil {
-		return alt
-	}
-	if s.elems == nil {
-		s.elems = make(map[string]Object)
-	}
-	s.elems[name] = obj
-	if obj.Parent() == nil {
-		obj.setParent(s)
-	}
-	return nil
-}
-
-// Pos and End describe the scope's source code extent [pos, end).
-// The results are guaranteed to be valid only if the type-checked
-// AST has complete position information. The extent is undefined
-// for Universe and package scopes.
-func (s *Scope) Pos() token.Pos { return s.pos }
-func (s *Scope) End() token.Pos { return s.end }
-
-// Contains returns true if pos is within the scope's extent.
-// The result is guaranteed to be valid only if the type-checked
-// AST has complete position information.
-func (s *Scope) Contains(pos token.Pos) bool {
-	return s.pos <= pos && pos < s.end
-}
-
-// Innermost returns the innermost (child) scope containing
-// pos. If pos is not within any scope, the result is nil.
-// The result is also nil for the Universe scope.
-// The result is guaranteed to be valid only if the type-checked
-// AST has complete position information.
-func (s *Scope) Innermost(pos token.Pos) *Scope {
-	// Package scopes do not have extents since they may be
-	// discontiguous, so iterate over the package's files.
-	if s.parent == Universe {
-		for _, s := range s.children {
-			if inner := s.Innermost(pos); inner != nil {
-				return inner
-			}
-		}
-	}
-
-	if s.Contains(pos) {
-		for _, s := range s.children {
-			if s.Contains(pos) {
-				return s.Innermost(pos)
-			}
-		}
-		return s
-	}
-	return nil
-}
-
-// WriteTo writes a string representation of the scope to w,
-// with the scope elements sorted by name.
-// The level of indentation is controlled by n >= 0, with
-// n == 0 for no indentation.
-// If recurse is set, it also writes nested (children) scopes.
-func (s *Scope) WriteTo(w io.Writer, n int, recurse bool) {
-	const ind = ".  "
-	indn := strings.Repeat(ind, n)
-
-	fmt.Fprintf(w, "%s%s scope %p {", indn, s.comment, s)
-	if len(s.elems) == 0 {
-		fmt.Fprintf(w, "}\n")
-		return
-	}
-
-	fmt.Fprintln(w)
-	indn1 := indn + ind
-	for _, name := range s.Names() {
-		fmt.Fprintf(w, "%s%s\n", indn1, s.elems[name])
-	}
-
-	if recurse {
-		for _, s := range s.children {
-			fmt.Fprintln(w)
-			s.WriteTo(w, n+1, recurse)
-		}
-	}
-
-	fmt.Fprintf(w, "%s}", indn)
-}
-
-// String returns a string representation of the scope, for debugging.
-func (s *Scope) String() string {
-	var buf bytes.Buffer
-	s.WriteTo(&buf, 0, false)
-	return buf.String()
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/selection.go b/third_party/gofrontend/libgo/go/go/types/selection.go
deleted file mode 100644
index 124e0d3..0000000
--- a/third_party/gofrontend/libgo/go/go/types/selection.go
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements Selections.
-
-package types
-
-import (
-	"bytes"
-	"fmt"
-)
-
-// SelectionKind describes the kind of a selector expression x.f
-// (excluding qualified identifiers).
-type SelectionKind int
-
-const (
-	FieldVal   SelectionKind = iota // x.f is a struct field selector
-	MethodVal                       // x.f is a method selector
-	MethodExpr                      // x.f is a method expression
-)
-
-// A Selection describes a selector expression x.f.
-// For the declarations:
-//
-//	type T struct{ x int; E }
-//	type E struct{}
-//	func (e E) m() {}
-//	var p *T
-//
-// the following relations exist:
-//
-//	Selector    Kind          Recv    Obj    Type               Index     Indirect
-//
-//	p.x         FieldVal      T       x      int                {0}       true
-//	p.m         MethodVal     *T      m      func (e *T) m()    {1, 0}    true
-//	T.m         MethodExpr    T       m      func m(_ T)        {1, 0}    false
-//
-type Selection struct {
-	kind     SelectionKind
-	recv     Type   // type of x
-	obj      Object // object denoted by x.f
-	index    []int  // path from x to x.f
-	indirect bool   // set if there was any pointer indirection on the path
-}
-
-// Kind returns the selection kind.
-func (s *Selection) Kind() SelectionKind { return s.kind }
-
-// Recv returns the type of x in x.f.
-func (s *Selection) Recv() Type { return s.recv }
-
-// Obj returns the object denoted by x.f; a *Var for
-// a field selection, and a *Func in all other cases.
-func (s *Selection) Obj() Object { return s.obj }
-
-// Type returns the type of x.f, which may be different from the type of f.
-// See Selection for more information.
-func (s *Selection) Type() Type {
-	switch s.kind {
-	case MethodVal:
-		// The type of x.f is a method with its receiver type set
-		// to the type of x.
-		sig := *s.obj.(*Func).typ.(*Signature)
-		recv := *sig.recv
-		recv.typ = s.recv
-		sig.recv = &recv
-		return &sig
-
-	case MethodExpr:
-		// The type of x.f is a function (without receiver)
-		// and an additional first argument with the same type as x.
-		// TODO(gri) Similar code is already in call.go - factor!
-		// TODO(gri) Compute this eagerly to avoid allocations.
-		sig := *s.obj.(*Func).typ.(*Signature)
-		arg0 := *sig.recv
-		sig.recv = nil
-		arg0.typ = s.recv
-		var params []*Var
-		if sig.params != nil {
-			params = sig.params.vars
-		}
-		sig.params = NewTuple(append([]*Var{&arg0}, params...)...)
-		return &sig
-	}
-
-	// In all other cases, the type of x.f is the type of x.
-	return s.obj.Type()
-}
-
-// Index describes the path from x to f in x.f.
-// The last index entry is the field or method index of the type declaring f;
-// either:
-//
-//	1) the list of declared methods of a named type; or
-//	2) the list of methods of an interface type; or
-//	3) the list of fields of a struct type.
-//
-// The earlier index entries are the indices of the embedded fields implicitly
-// traversed to get from (the type of) x to f, starting at embedding depth 0.
-func (s *Selection) Index() []int { return s.index }
-
-// Indirect reports whether any pointer indirection was required to get from
-// x to f in x.f.
-func (s *Selection) Indirect() bool { return s.indirect }
-
-func (s *Selection) String() string { return SelectionString(s, nil) }
-
-// SelectionString returns the string form of s.
-// The Qualifier controls the printing of
-// package-level objects, and may be nil.
-//
-// Examples:
-//	"field (T) f int"
-//	"method (T) f(X) Y"
-//	"method expr (T) f(X) Y"
-//
-func SelectionString(s *Selection, qf Qualifier) string {
-	var k string
-	switch s.kind {
-	case FieldVal:
-		k = "field "
-	case MethodVal:
-		k = "method "
-	case MethodExpr:
-		k = "method expr "
-	default:
-		unreachable()
-	}
-	var buf bytes.Buffer
-	buf.WriteString(k)
-	buf.WriteByte('(')
-	WriteType(&buf, s.Recv(), qf)
-	fmt.Fprintf(&buf, ") %s", s.obj.Name())
-	if T := s.Type(); s.kind == FieldVal {
-		buf.WriteByte(' ')
-		WriteType(&buf, T, qf)
-	} else {
-		WriteSignature(&buf, T.(*Signature), qf)
-	}
-	return buf.String()
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/self_test.go b/third_party/gofrontend/libgo/go/go/types/self_test.go
deleted file mode 100644
index 10ad06f..0000000
--- a/third_party/gofrontend/libgo/go/go/types/self_test.go
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"flag"
-	"fmt"
-	"go/ast"
-	"go/importer"
-	"go/parser"
-	"go/token"
-	"path/filepath"
-	"testing"
-	"time"
-
-	. "go/types"
-)
-
-var benchmark = flag.Bool("b", false, "run benchmarks")
-
-func TestSelf(t *testing.T) {
-	fset := token.NewFileSet()
-	files, err := pkgFiles(fset, ".")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	conf := Config{Importer: importer.Default()}
-	_, err = conf.Check("go/types", fset, files, nil)
-	if err != nil {
-		// Importing go/constant doesn't work in the
-		// build dashboard environment. Don't report an error
-		// for now so that the build remains green.
-		// TODO(gri) fix this
-		t.Log(err) // replace w/ t.Fatal eventually
-		return
-	}
-}
-
-func TestBenchmark(t *testing.T) {
-	if !*benchmark {
-		return
-	}
-
-	// We're not using testing's benchmarking mechanism directly
-	// because we want custom output.
-
-	for _, p := range []string{"types", "constant", filepath.Join("internal", "gcimporter")} {
-		path := filepath.Join("..", p)
-		runbench(t, path, false)
-		runbench(t, path, true)
-		fmt.Println()
-	}
-}
-
-func runbench(t *testing.T, path string, ignoreFuncBodies bool) {
-	fset := token.NewFileSet()
-	files, err := pkgFiles(fset, path)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	b := testing.Benchmark(func(b *testing.B) {
-		for i := 0; i < b.N; i++ {
-			conf := Config{IgnoreFuncBodies: ignoreFuncBodies}
-			conf.Check(path, fset, files, nil)
-		}
-	})
-
-	// determine line count
-	lines := 0
-	fset.Iterate(func(f *token.File) bool {
-		lines += f.LineCount()
-		return true
-	})
-
-	d := time.Duration(b.NsPerOp())
-	fmt.Printf(
-		"%s: %s for %d lines (%d lines/s), ignoreFuncBodies = %v\n",
-		filepath.Base(path), d, lines, int64(float64(lines)/d.Seconds()), ignoreFuncBodies,
-	)
-}
-
-func pkgFiles(fset *token.FileSet, path string) ([]*ast.File, error) {
-	filenames, err := pkgFilenames(path) // from stdlib_test.go
-	if err != nil {
-		return nil, err
-	}
-
-	var files []*ast.File
-	for _, filename := range filenames {
-		file, err := parser.ParseFile(fset, filename, nil, 0)
-		if err != nil {
-			return nil, err
-		}
-		files = append(files, file)
-	}
-
-	return files, nil
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/sizes.go b/third_party/gofrontend/libgo/go/go/types/sizes.go
deleted file mode 100644
index 56fb310..0000000
--- a/third_party/gofrontend/libgo/go/go/types/sizes.go
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements Sizes.
-
-package types
-
-// Sizes defines the sizing functions for package unsafe.
-type Sizes interface {
-	// Alignof returns the alignment of a variable of type T.
-	// Alignof must implement the alignment guarantees required by the spec.
-	Alignof(T Type) int64
-
-	// Offsetsof returns the offsets of the given struct fields, in bytes.
-	// Offsetsof must implement the offset guarantees required by the spec.
-	Offsetsof(fields []*Var) []int64
-
-	// Sizeof returns the size of a variable of type T.
-	// Sizeof must implement the size guarantees required by the spec.
-	Sizeof(T Type) int64
-}
-
-// StdSizes is a convenience type for creating commonly used Sizes.
-// It makes the following simplifying assumptions:
-//
-//	- The size of explicitly sized basic types (int16, etc.) is the
-//	  specified size.
-//	- The size of strings and interfaces is 2*WordSize.
-//	- The size of slices is 3*WordSize.
-//	- The size of an array of n elements corresponds to the size of
-//	  a struct of n consecutive fields of the array's element type.
-//      - The size of a struct is the offset of the last field plus that
-//	  field's size. As with all element types, if the struct is used
-//	  in an array its size must first be aligned to a multiple of the
-//	  struct's alignment.
-//	- All other types have size WordSize.
-//	- Arrays and structs are aligned per spec definition; all other
-//	  types are naturally aligned with a maximum alignment MaxAlign.
-//
-// *StdSizes implements Sizes.
-//
-type StdSizes struct {
-	WordSize int64 // word size in bytes - must be >= 4 (32bits)
-	MaxAlign int64 // maximum alignment in bytes - must be >= 1
-}
-
-func (s *StdSizes) Alignof(T Type) int64 {
-	// For arrays and structs, alignment is defined in terms
-	// of alignment of the elements and fields, respectively.
-	switch t := T.Underlying().(type) {
-	case *Array:
-		// spec: "For a variable x of array type: unsafe.Alignof(x)
-		// is the same as unsafe.Alignof(x[0]), but at least 1."
-		return s.Alignof(t.elem)
-	case *Struct:
-		// spec: "For a variable x of struct type: unsafe.Alignof(x)
-		// is the largest of the values unsafe.Alignof(x.f) for each
-		// field f of x, but at least 1."
-		max := int64(1)
-		for _, f := range t.fields {
-			if a := s.Alignof(f.typ); a > max {
-				max = a
-			}
-		}
-		return max
-	}
-	a := s.Sizeof(T) // may be 0
-	// spec: "For a variable x of any type: unsafe.Alignof(x) is at least 1."
-	if a < 1 {
-		return 1
-	}
-	if a > s.MaxAlign {
-		return s.MaxAlign
-	}
-	return a
-}
-
-func (s *StdSizes) Offsetsof(fields []*Var) []int64 {
-	offsets := make([]int64, len(fields))
-	var o int64
-	for i, f := range fields {
-		a := s.Alignof(f.typ)
-		o = align(o, a)
-		offsets[i] = o
-		o += s.Sizeof(f.typ)
-	}
-	return offsets
-}
-
-var basicSizes = [...]byte{
-	Bool:       1,
-	Int8:       1,
-	Int16:      2,
-	Int32:      4,
-	Int64:      8,
-	Uint8:      1,
-	Uint16:     2,
-	Uint32:     4,
-	Uint64:     8,
-	Float32:    4,
-	Float64:    8,
-	Complex64:  8,
-	Complex128: 16,
-}
-
-func (s *StdSizes) Sizeof(T Type) int64 {
-	switch t := T.Underlying().(type) {
-	case *Basic:
-		assert(isTyped(T))
-		k := t.kind
-		if int(k) < len(basicSizes) {
-			if s := basicSizes[k]; s > 0 {
-				return int64(s)
-			}
-		}
-		if k == String {
-			return s.WordSize * 2
-		}
-	case *Array:
-		n := t.len
-		if n == 0 {
-			return 0
-		}
-		a := s.Alignof(t.elem)
-		z := s.Sizeof(t.elem)
-		return align(z, a)*(n-1) + z
-	case *Slice:
-		return s.WordSize * 3
-	case *Struct:
-		n := t.NumFields()
-		if n == 0 {
-			return 0
-		}
-		offsets := t.offsets
-		if t.offsets == nil {
-			// compute offsets on demand
-			offsets = s.Offsetsof(t.fields)
-			t.offsets = offsets
-		}
-		return offsets[n-1] + s.Sizeof(t.fields[n-1].typ)
-	case *Interface:
-		return s.WordSize * 2
-	}
-	return s.WordSize // catch-all
-}
-
-// stdSizes is used if Config.Sizes == nil.
-var stdSizes = StdSizes{8, 8}
-
-func (conf *Config) alignof(T Type) int64 {
-	if s := conf.Sizes; s != nil {
-		if a := s.Alignof(T); a >= 1 {
-			return a
-		}
-		panic("Config.Sizes.Alignof returned an alignment < 1")
-	}
-	return stdSizes.Alignof(T)
-}
-
-func (conf *Config) offsetsof(T *Struct) []int64 {
-	offsets := T.offsets
-	if offsets == nil && T.NumFields() > 0 {
-		// compute offsets on demand
-		if s := conf.Sizes; s != nil {
-			offsets = s.Offsetsof(T.fields)
-			// sanity checks
-			if len(offsets) != T.NumFields() {
-				panic("Config.Sizes.Offsetsof returned the wrong number of offsets")
-			}
-			for _, o := range offsets {
-				if o < 0 {
-					panic("Config.Sizes.Offsetsof returned an offset < 0")
-				}
-			}
-		} else {
-			offsets = stdSizes.Offsetsof(T.fields)
-		}
-		T.offsets = offsets
-	}
-	return offsets
-}
-
-// offsetof returns the offset of the field specified via
-// the index sequence relative to typ. All embedded fields
-// must be structs (rather than pointer to structs).
-func (conf *Config) offsetof(typ Type, index []int) int64 {
-	var o int64
-	for _, i := range index {
-		s := typ.Underlying().(*Struct)
-		o += conf.offsetsof(s)[i]
-		typ = s.fields[i].typ
-	}
-	return o
-}
-
-func (conf *Config) sizeof(T Type) int64 {
-	if s := conf.Sizes; s != nil {
-		if z := s.Sizeof(T); z >= 0 {
-			return z
-		}
-		panic("Config.Sizes.Sizeof returned a size < 0")
-	}
-	return stdSizes.Sizeof(T)
-}
-
-// align returns the smallest y >= x such that y % a == 0.
-func align(x, a int64) int64 {
-	y := x + a - 1
-	return y - y%a
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/stdlib_test.go b/third_party/gofrontend/libgo/go/go/types/stdlib_test.go
deleted file mode 100644
index c6c946e..0000000
--- a/third_party/gofrontend/libgo/go/go/types/stdlib_test.go
+++ /dev/null
@@ -1,279 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file tests types.Check by using it to
-// typecheck the standard library and tests.
-
-package types_test
-
-import (
-	"fmt"
-	"go/ast"
-	"go/build"
-	"go/importer"
-	"go/parser"
-	"go/scanner"
-	"go/token"
-	"internal/testenv"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"testing"
-	"time"
-
-	. "go/types"
-)
-
-var (
-	pkgCount int // number of packages processed
-	start    time.Time
-
-	// Use the same importer for all std lib tests to
-	// avoid repeated importing of the same packages.
-	stdLibImporter = importer.Default()
-)
-
-func TestStdlib(t *testing.T) {
-	testenv.MustHaveGoBuild(t)
-
-	start = time.Now()
-	walkDirs(t, filepath.Join(runtime.GOROOT(), "src"))
-	if testing.Verbose() {
-		fmt.Println(pkgCount, "packages typechecked in", time.Since(start))
-	}
-}
-
-// firstComment returns the contents of the first comment in
-// the given file, assuming there's one within the first KB.
-func firstComment(filename string) string {
-	f, err := os.Open(filename)
-	if err != nil {
-		return ""
-	}
-	defer f.Close()
-
-	var src [1 << 10]byte // read at most 1KB
-	n, _ := f.Read(src[:])
-
-	var s scanner.Scanner
-	s.Init(fset.AddFile("", fset.Base(), n), src[:n], nil, scanner.ScanComments)
-	for {
-		_, tok, lit := s.Scan()
-		switch tok {
-		case token.COMMENT:
-			// remove trailing */ of multi-line comment
-			if lit[1] == '*' {
-				lit = lit[:len(lit)-2]
-			}
-			return strings.TrimSpace(lit[2:])
-		case token.EOF:
-			return ""
-		}
-	}
-}
-
-func testTestDir(t *testing.T, path string, ignore ...string) {
-	files, err := ioutil.ReadDir(path)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	excluded := make(map[string]bool)
-	for _, filename := range ignore {
-		excluded[filename] = true
-	}
-
-	fset := token.NewFileSet()
-	for _, f := range files {
-		// filter directory contents
-		if f.IsDir() || !strings.HasSuffix(f.Name(), ".go") || excluded[f.Name()] {
-			continue
-		}
-
-		// get per-file instructions
-		expectErrors := false
-		filename := filepath.Join(path, f.Name())
-		if cmd := firstComment(filename); cmd != "" {
-			switch cmd {
-			case "skip", "compiledir":
-				continue // ignore this file
-			case "errorcheck":
-				expectErrors = true
-			}
-		}
-
-		// parse and type-check file
-		file, err := parser.ParseFile(fset, filename, nil, 0)
-		if err == nil {
-			conf := Config{Importer: stdLibImporter}
-			_, err = conf.Check(filename, fset, []*ast.File{file}, nil)
-		}
-
-		if expectErrors {
-			if err == nil {
-				t.Errorf("expected errors but found none in %s", filename)
-			}
-		} else {
-			if err != nil {
-				t.Error(err)
-			}
-		}
-	}
-}
-
-func TestStdTest(t *testing.T) {
-	testenv.MustHaveGoBuild(t)
-
-	// test/recover4.go is only built for Linux and Darwin.
-	// TODO(gri) Remove once tests consider +build tags (issue 10370).
-	if runtime.GOOS != "linux" && runtime.GOOS != "darwin" {
-		return
-	}
-
-	testTestDir(t, filepath.Join(runtime.GOROOT(), "test"),
-		"cmplxdivide.go", // also needs file cmplxdivide1.go - ignore
-		"sigchld.go",     // don't work on Windows; testTestDir should consult build tags
-	)
-}
-
-func TestStdFixed(t *testing.T) {
-	testenv.MustHaveGoBuild(t)
-
-	testTestDir(t, filepath.Join(runtime.GOROOT(), "test", "fixedbugs"),
-		"bug248.go", "bug302.go", "bug369.go", // complex test instructions - ignore
-		"bug459.go",      // possibly incorrect test - see issue 6703 (pending spec clarification)
-		"issue3924.go",   // possibly incorrect test - see issue 6671 (pending spec clarification)
-		"issue6889.go",   // gc-specific test
-		"issue7746.go",   // large constants - consumes too much memory
-		"issue11326.go",  // large constants
-		"issue11326b.go", // large constants
-	)
-}
-
-func TestStdKen(t *testing.T) {
-	testenv.MustHaveGoBuild(t)
-
-	testTestDir(t, filepath.Join(runtime.GOROOT(), "test", "ken"))
-}
-
-// Package paths of excluded packages.
-var excluded = map[string]bool{
-	"builtin": true,
-}
-
-// typecheck typechecks the given package files.
-func typecheck(t *testing.T, path string, filenames []string) {
-	fset := token.NewFileSet()
-
-	// parse package files
-	var files []*ast.File
-	for _, filename := range filenames {
-		file, err := parser.ParseFile(fset, filename, nil, parser.AllErrors)
-		if err != nil {
-			// the parser error may be a list of individual errors; report them all
-			if list, ok := err.(scanner.ErrorList); ok {
-				for _, err := range list {
-					t.Error(err)
-				}
-				return
-			}
-			t.Error(err)
-			return
-		}
-
-		if testing.Verbose() {
-			if len(files) == 0 {
-				fmt.Println("package", file.Name.Name)
-			}
-			fmt.Println("\t", filename)
-		}
-
-		files = append(files, file)
-	}
-
-	// typecheck package files
-	conf := Config{
-		Error:    func(err error) { t.Error(err) },
-		Importer: stdLibImporter,
-	}
-	info := Info{Uses: make(map[*ast.Ident]Object)}
-	conf.Check(path, fset, files, &info)
-	pkgCount++
-
-	// Perform checks of API invariants.
-
-	// All Objects have a package, except predeclared ones.
-	errorError := Universe.Lookup("error").Type().Underlying().(*Interface).ExplicitMethod(0) // (error).Error
-	for id, obj := range info.Uses {
-		predeclared := obj == Universe.Lookup(obj.Name()) || obj == errorError
-		if predeclared == (obj.Pkg() != nil) {
-			posn := fset.Position(id.Pos())
-			if predeclared {
-				t.Errorf("%s: predeclared object with package: %s", posn, obj)
-			} else {
-				t.Errorf("%s: user-defined object without package: %s", posn, obj)
-			}
-		}
-	}
-}
-
-// pkgFilenames returns the list of package filenames for the given directory.
-func pkgFilenames(dir string) ([]string, error) {
-	ctxt := build.Default
-	ctxt.CgoEnabled = false
-	pkg, err := ctxt.ImportDir(dir, 0)
-	if err != nil {
-		if _, nogo := err.(*build.NoGoError); nogo {
-			return nil, nil // no *.go files, not an error
-		}
-		return nil, err
-	}
-	if excluded[pkg.ImportPath] {
-		return nil, nil
-	}
-	var filenames []string
-	for _, name := range pkg.GoFiles {
-		filenames = append(filenames, filepath.Join(pkg.Dir, name))
-	}
-	for _, name := range pkg.TestGoFiles {
-		filenames = append(filenames, filepath.Join(pkg.Dir, name))
-	}
-	return filenames, nil
-}
-
-// Note: Could use filepath.Walk instead of walkDirs but that wouldn't
-//       necessarily be shorter or clearer after adding the code to
-//       terminate early for -short tests.
-
-func walkDirs(t *testing.T, dir string) {
-	// limit run time for short tests
-	if testing.Short() && time.Since(start) >= 750*time.Millisecond {
-		return
-	}
-
-	fis, err := ioutil.ReadDir(dir)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	// typecheck package in directory
-	files, err := pkgFilenames(dir)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	if files != nil {
-		typecheck(t, dir, files)
-	}
-
-	// traverse subdirectories, but don't walk into testdata
-	for _, fi := range fis {
-		if fi.IsDir() && fi.Name() != "testdata" {
-			walkDirs(t, filepath.Join(dir, fi.Name()))
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/stmt.go b/third_party/gofrontend/libgo/go/go/types/stmt.go
deleted file mode 100644
index 88a1d9b..0000000
--- a/third_party/gofrontend/libgo/go/go/types/stmt.go
+++ /dev/null
@@ -1,744 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements typechecking of statements.
-
-package types
-
-import (
-	"fmt"
-	"go/ast"
-	"go/constant"
-	"go/token"
-)
-
-func (check *Checker) funcBody(decl *declInfo, name string, sig *Signature, body *ast.BlockStmt) {
-	if trace {
-		if name == "" {
-			name = "<function literal>"
-		}
-		fmt.Printf("--- %s: %s {\n", name, sig)
-		defer fmt.Println("--- <end>")
-	}
-
-	// set function scope extent
-	sig.scope.pos = body.Pos()
-	sig.scope.end = body.End()
-
-	// save/restore current context and setup function context
-	// (and use 0 indentation at function start)
-	defer func(ctxt context, indent int) {
-		check.context = ctxt
-		check.indent = indent
-	}(check.context, check.indent)
-	check.context = context{
-		decl:  decl,
-		scope: sig.scope,
-		sig:   sig,
-	}
-	check.indent = 0
-
-	check.stmtList(0, body.List)
-
-	if check.hasLabel {
-		check.labels(body)
-	}
-
-	if sig.results.Len() > 0 && !check.isTerminating(body, "") {
-		check.error(body.Rbrace, "missing return")
-	}
-
-	// spec: "Implementation restriction: A compiler may make it illegal to
-	// declare a variable inside a function body if the variable is never used."
-	// (One could check each scope after use, but that distributes this check
-	// over several places because CloseScope is not always called explicitly.)
-	check.usage(sig.scope)
-}
-
-func (check *Checker) usage(scope *Scope) {
-	for _, obj := range scope.elems {
-		if v, _ := obj.(*Var); v != nil && !v.used {
-			check.softErrorf(v.pos, "%s declared but not used", v.name)
-		}
-	}
-	for _, scope := range scope.children {
-		check.usage(scope)
-	}
-}
-
-// stmtContext is a bitset describing which
-// control-flow statements are permissible.
-type stmtContext uint
-
-const (
-	breakOk stmtContext = 1 << iota
-	continueOk
-	fallthroughOk
-)
-
-func (check *Checker) simpleStmt(s ast.Stmt) {
-	if s != nil {
-		check.stmt(0, s)
-	}
-}
-
-func (check *Checker) stmtList(ctxt stmtContext, list []ast.Stmt) {
-	ok := ctxt&fallthroughOk != 0
-	inner := ctxt &^ fallthroughOk
-	for i, s := range list {
-		inner := inner
-		if ok && i+1 == len(list) {
-			inner |= fallthroughOk
-		}
-		check.stmt(inner, s)
-	}
-}
-
-func (check *Checker) multipleDefaults(list []ast.Stmt) {
-	var first ast.Stmt
-	for _, s := range list {
-		var d ast.Stmt
-		switch c := s.(type) {
-		case *ast.CaseClause:
-			if len(c.List) == 0 {
-				d = s
-			}
-		case *ast.CommClause:
-			if c.Comm == nil {
-				d = s
-			}
-		default:
-			check.invalidAST(s.Pos(), "case/communication clause expected")
-		}
-		if d != nil {
-			if first != nil {
-				check.errorf(d.Pos(), "multiple defaults (first at %s)", first.Pos())
-			} else {
-				first = d
-			}
-		}
-	}
-}
-
-func (check *Checker) openScope(s ast.Stmt, comment string) {
-	scope := NewScope(check.scope, s.Pos(), s.End(), comment)
-	check.recordScope(s, scope)
-	check.scope = scope
-}
-
-func (check *Checker) closeScope() {
-	check.scope = check.scope.Parent()
-}
-
-func assignOp(op token.Token) token.Token {
-	// token_test.go verifies the token ordering this function relies on
-	if token.ADD_ASSIGN <= op && op <= token.AND_NOT_ASSIGN {
-		return op + (token.ADD - token.ADD_ASSIGN)
-	}
-	return token.ILLEGAL
-}
-
-func (check *Checker) suspendedCall(keyword string, call *ast.CallExpr) {
-	var x operand
-	var msg string
-	switch check.rawExpr(&x, call, nil) {
-	case conversion:
-		msg = "requires function call, not conversion"
-	case expression:
-		msg = "discards result of"
-	case statement:
-		return
-	default:
-		unreachable()
-	}
-	check.errorf(x.pos(), "%s %s %s", keyword, msg, &x)
-}
-
-func (check *Checker) caseValues(x operand /* copy argument (not *operand!) */, values []ast.Expr) {
-	// No duplicate checking for now. See issue 4524.
-	for _, e := range values {
-		var y operand
-		check.expr(&y, e)
-		if y.mode == invalid {
-			return
-		}
-		// TODO(gri) The convertUntyped call pair below appears in other places. Factor!
-		// Order matters: By comparing y against x, error positions are at the case values.
-		check.convertUntyped(&y, x.typ)
-		if y.mode == invalid {
-			return
-		}
-		check.convertUntyped(&x, y.typ)
-		if x.mode == invalid {
-			return
-		}
-		check.comparison(&y, &x, token.EQL)
-	}
-}
-
-func (check *Checker) caseTypes(x *operand, xtyp *Interface, types []ast.Expr, seen map[Type]token.Pos) (T Type) {
-L:
-	for _, e := range types {
-		T = check.typOrNil(e)
-		if T == Typ[Invalid] {
-			continue
-		}
-		// complain about duplicate types
-		// TODO(gri) use a type hash to avoid quadratic algorithm
-		for t, pos := range seen {
-			if T == nil && t == nil || T != nil && t != nil && Identical(T, t) {
-				// talk about "case" rather than "type" because of nil case
-				check.error(e.Pos(), "duplicate case in type switch")
-				check.errorf(pos, "\tprevious case %s", T) // secondary error, \t indented
-				continue L
-			}
-		}
-		seen[T] = e.Pos()
-		if T != nil {
-			check.typeAssertion(e.Pos(), x, xtyp, T)
-		}
-	}
-	return
-}
-
-// stmt typechecks statement s.
-func (check *Checker) stmt(ctxt stmtContext, s ast.Stmt) {
-	// statements cannot use iota in general
-	// (constant declarations set it explicitly)
-	assert(check.iota == nil)
-
-	// statements must end with the same top scope as they started with
-	if debug {
-		defer func(scope *Scope) {
-			// don't check if code is panicking
-			if p := recover(); p != nil {
-				panic(p)
-			}
-			assert(scope == check.scope)
-		}(check.scope)
-	}
-
-	inner := ctxt &^ fallthroughOk
-	switch s := s.(type) {
-	case *ast.BadStmt, *ast.EmptyStmt:
-		// ignore
-
-	case *ast.DeclStmt:
-		check.declStmt(s.Decl)
-
-	case *ast.LabeledStmt:
-		check.hasLabel = true
-		check.stmt(ctxt, s.Stmt)
-
-	case *ast.ExprStmt:
-		// spec: "With the exception of specific built-in functions,
-		// function and method calls and receive operations can appear
-		// in statement context. Such statements may be parenthesized."
-		var x operand
-		kind := check.rawExpr(&x, s.X, nil)
-		var msg string
-		switch x.mode {
-		default:
-			if kind == statement {
-				return
-			}
-			msg = "is not used"
-		case builtin:
-			msg = "must be called"
-		case typexpr:
-			msg = "is not an expression"
-		}
-		check.errorf(x.pos(), "%s %s", &x, msg)
-
-	case *ast.SendStmt:
-		var ch, x operand
-		check.expr(&ch, s.Chan)
-		check.expr(&x, s.Value)
-		if ch.mode == invalid || x.mode == invalid {
-			return
-		}
-		if tch, ok := ch.typ.Underlying().(*Chan); !ok || tch.dir == RecvOnly || !check.assignment(&x, tch.elem) {
-			if x.mode != invalid {
-				check.invalidOp(ch.pos(), "cannot send %s to channel %s", &x, &ch)
-			}
-		}
-
-	case *ast.IncDecStmt:
-		var op token.Token
-		switch s.Tok {
-		case token.INC:
-			op = token.ADD
-		case token.DEC:
-			op = token.SUB
-		default:
-			check.invalidAST(s.TokPos, "unknown inc/dec operation %s", s.Tok)
-			return
-		}
-		var x operand
-		Y := &ast.BasicLit{ValuePos: s.X.Pos(), Kind: token.INT, Value: "1"} // use x's position
-		check.binary(&x, nil, s.X, Y, op)
-		if x.mode == invalid {
-			return
-		}
-		check.assignVar(s.X, &x)
-
-	case *ast.AssignStmt:
-		switch s.Tok {
-		case token.ASSIGN, token.DEFINE:
-			if len(s.Lhs) == 0 {
-				check.invalidAST(s.Pos(), "missing lhs in assignment")
-				return
-			}
-			if s.Tok == token.DEFINE {
-				check.shortVarDecl(s.TokPos, s.Lhs, s.Rhs)
-			} else {
-				// regular assignment
-				check.assignVars(s.Lhs, s.Rhs)
-			}
-
-		default:
-			// assignment operations
-			if len(s.Lhs) != 1 || len(s.Rhs) != 1 {
-				check.errorf(s.TokPos, "assignment operation %s requires single-valued expressions", s.Tok)
-				return
-			}
-			op := assignOp(s.Tok)
-			if op == token.ILLEGAL {
-				check.invalidAST(s.TokPos, "unknown assignment operation %s", s.Tok)
-				return
-			}
-			var x operand
-			check.binary(&x, nil, s.Lhs[0], s.Rhs[0], op)
-			if x.mode == invalid {
-				return
-			}
-			check.assignVar(s.Lhs[0], &x)
-		}
-
-	case *ast.GoStmt:
-		check.suspendedCall("go", s.Call)
-
-	case *ast.DeferStmt:
-		check.suspendedCall("defer", s.Call)
-
-	case *ast.ReturnStmt:
-		res := check.sig.results
-		if res.Len() > 0 {
-			// function returns results
-			// (if one, say the first, result parameter is named, all of them are named)
-			if len(s.Results) == 0 && res.vars[0].name != "" {
-				// spec: "Implementation restriction: A compiler may disallow an empty expression
-				// list in a "return" statement if a different entity (constant, type, or variable)
-				// with the same name as a result parameter is in scope at the place of the return."
-				for _, obj := range res.vars {
-					if _, alt := check.scope.LookupParent(obj.name, check.pos); alt != nil && alt != obj {
-						check.errorf(s.Pos(), "result parameter %s not in scope at return", obj.name)
-						check.errorf(alt.Pos(), "\tinner declaration of %s", obj)
-						// ok to continue
-					}
-				}
-			} else {
-				// return has results or result parameters are unnamed
-				check.initVars(res.vars, s.Results, s.Return)
-			}
-		} else if len(s.Results) > 0 {
-			check.error(s.Results[0].Pos(), "no result values expected")
-			check.use(s.Results...)
-		}
-
-	case *ast.BranchStmt:
-		if s.Label != nil {
-			check.hasLabel = true
-			return // checked in 2nd pass (check.labels)
-		}
-		switch s.Tok {
-		case token.BREAK:
-			if ctxt&breakOk == 0 {
-				check.error(s.Pos(), "break not in for, switch, or select statement")
-			}
-		case token.CONTINUE:
-			if ctxt&continueOk == 0 {
-				check.error(s.Pos(), "continue not in for statement")
-			}
-		case token.FALLTHROUGH:
-			if ctxt&fallthroughOk == 0 {
-				check.error(s.Pos(), "fallthrough statement out of place")
-			}
-		default:
-			check.invalidAST(s.Pos(), "branch statement: %s", s.Tok)
-		}
-
-	case *ast.BlockStmt:
-		check.openScope(s, "block")
-		defer check.closeScope()
-
-		check.stmtList(inner, s.List)
-
-	case *ast.IfStmt:
-		check.openScope(s, "if")
-		defer check.closeScope()
-
-		check.simpleStmt(s.Init)
-		var x operand
-		check.expr(&x, s.Cond)
-		if x.mode != invalid && !isBoolean(x.typ) {
-			check.error(s.Cond.Pos(), "non-boolean condition in if statement")
-		}
-		check.stmt(inner, s.Body)
-		if s.Else != nil {
-			check.stmt(inner, s.Else)
-		}
-
-	case *ast.SwitchStmt:
-		inner |= breakOk
-		check.openScope(s, "switch")
-		defer check.closeScope()
-
-		check.simpleStmt(s.Init)
-		var x operand
-		if s.Tag != nil {
-			check.expr(&x, s.Tag)
-		} else {
-			// spec: "A missing switch expression is
-			// equivalent to the boolean value true."
-			x.mode = constant_
-			x.typ = Typ[Bool]
-			x.val = constant.MakeBool(true)
-			x.expr = &ast.Ident{NamePos: s.Body.Lbrace, Name: "true"}
-		}
-
-		check.multipleDefaults(s.Body.List)
-
-		for i, c := range s.Body.List {
-			clause, _ := c.(*ast.CaseClause)
-			if clause == nil {
-				check.invalidAST(c.Pos(), "incorrect expression switch case")
-				continue
-			}
-			if x.mode != invalid {
-				check.caseValues(x, clause.List)
-			}
-			check.openScope(clause, "case")
-			inner := inner
-			if i+1 < len(s.Body.List) {
-				inner |= fallthroughOk
-			}
-			check.stmtList(inner, clause.Body)
-			check.closeScope()
-		}
-
-	case *ast.TypeSwitchStmt:
-		inner |= breakOk
-		check.openScope(s, "type switch")
-		defer check.closeScope()
-
-		check.simpleStmt(s.Init)
-
-		// A type switch guard must be of the form:
-		//
-		//     TypeSwitchGuard = [ identifier ":=" ] PrimaryExpr "." "(" "type" ")" .
-		//
-		// The parser is checking syntactic correctness;
-		// remaining syntactic errors are considered AST errors here.
-		// TODO(gri) better factoring of error handling (invalid ASTs)
-		//
-		var lhs *ast.Ident // lhs identifier or nil
-		var rhs ast.Expr
-		switch guard := s.Assign.(type) {
-		case *ast.ExprStmt:
-			rhs = guard.X
-		case *ast.AssignStmt:
-			if len(guard.Lhs) != 1 || guard.Tok != token.DEFINE || len(guard.Rhs) != 1 {
-				check.invalidAST(s.Pos(), "incorrect form of type switch guard")
-				return
-			}
-
-			lhs, _ = guard.Lhs[0].(*ast.Ident)
-			if lhs == nil {
-				check.invalidAST(s.Pos(), "incorrect form of type switch guard")
-				return
-			}
-
-			if lhs.Name == "_" {
-				// _ := x.(type) is an invalid short variable declaration
-				check.softErrorf(lhs.Pos(), "no new variable on left side of :=")
-				lhs = nil // avoid declared but not used error below
-			} else {
-				check.recordDef(lhs, nil) // lhs variable is implicitly declared in each cause clause
-			}
-
-			rhs = guard.Rhs[0]
-
-		default:
-			check.invalidAST(s.Pos(), "incorrect form of type switch guard")
-			return
-		}
-
-		// rhs must be of the form: expr.(type) and expr must be an interface
-		expr, _ := rhs.(*ast.TypeAssertExpr)
-		if expr == nil || expr.Type != nil {
-			check.invalidAST(s.Pos(), "incorrect form of type switch guard")
-			return
-		}
-		var x operand
-		check.expr(&x, expr.X)
-		if x.mode == invalid {
-			return
-		}
-		xtyp, _ := x.typ.Underlying().(*Interface)
-		if xtyp == nil {
-			check.errorf(x.pos(), "%s is not an interface", &x)
-			return
-		}
-
-		check.multipleDefaults(s.Body.List)
-
-		var lhsVars []*Var               // list of implicitly declared lhs variables
-		seen := make(map[Type]token.Pos) // map of seen types to positions
-		for _, s := range s.Body.List {
-			clause, _ := s.(*ast.CaseClause)
-			if clause == nil {
-				check.invalidAST(s.Pos(), "incorrect type switch case")
-				continue
-			}
-			// Check each type in this type switch case.
-			T := check.caseTypes(&x, xtyp, clause.List, seen)
-			check.openScope(clause, "case")
-			// If lhs exists, declare a corresponding variable in the case-local scope.
-			if lhs != nil {
-				// spec: "The TypeSwitchGuard may include a short variable declaration.
-				// When that form is used, the variable is declared at the beginning of
-				// the implicit block in each clause. In clauses with a case listing
-				// exactly one type, the variable has that type; otherwise, the variable
-				// has the type of the expression in the TypeSwitchGuard."
-				if len(clause.List) != 1 || T == nil {
-					T = x.typ
-				}
-				obj := NewVar(lhs.Pos(), check.pkg, lhs.Name, T)
-				scopePos := clause.End()
-				if len(clause.Body) > 0 {
-					scopePos = clause.Body[0].Pos()
-				}
-				check.declare(check.scope, nil, obj, scopePos)
-				check.recordImplicit(clause, obj)
-				// For the "declared but not used" error, all lhs variables act as
-				// one; i.e., if any one of them is 'used', all of them are 'used'.
-				// Collect them for later analysis.
-				lhsVars = append(lhsVars, obj)
-			}
-			check.stmtList(inner, clause.Body)
-			check.closeScope()
-		}
-
-		// If lhs exists, we must have at least one lhs variable that was used.
-		if lhs != nil {
-			var used bool
-			for _, v := range lhsVars {
-				if v.used {
-					used = true
-				}
-				v.used = true // avoid usage error when checking entire function
-			}
-			if !used {
-				check.softErrorf(lhs.Pos(), "%s declared but not used", lhs.Name)
-			}
-		}
-
-	case *ast.SelectStmt:
-		inner |= breakOk
-
-		check.multipleDefaults(s.Body.List)
-
-		for _, s := range s.Body.List {
-			clause, _ := s.(*ast.CommClause)
-			if clause == nil {
-				continue // error reported before
-			}
-
-			// clause.Comm must be a SendStmt, RecvStmt, or default case
-			valid := false
-			var rhs ast.Expr // rhs of RecvStmt, or nil
-			switch s := clause.Comm.(type) {
-			case nil, *ast.SendStmt:
-				valid = true
-			case *ast.AssignStmt:
-				if len(s.Rhs) == 1 {
-					rhs = s.Rhs[0]
-				}
-			case *ast.ExprStmt:
-				rhs = s.X
-			}
-
-			// if present, rhs must be a receive operation
-			if rhs != nil {
-				if x, _ := unparen(rhs).(*ast.UnaryExpr); x != nil && x.Op == token.ARROW {
-					valid = true
-				}
-			}
-
-			if !valid {
-				check.error(clause.Comm.Pos(), "select case must be send or receive (possibly with assignment)")
-				continue
-			}
-
-			check.openScope(s, "case")
-			if clause.Comm != nil {
-				check.stmt(inner, clause.Comm)
-			}
-			check.stmtList(inner, clause.Body)
-			check.closeScope()
-		}
-
-	case *ast.ForStmt:
-		inner |= breakOk | continueOk
-		check.openScope(s, "for")
-		defer check.closeScope()
-
-		check.simpleStmt(s.Init)
-		if s.Cond != nil {
-			var x operand
-			check.expr(&x, s.Cond)
-			if x.mode != invalid && !isBoolean(x.typ) {
-				check.error(s.Cond.Pos(), "non-boolean condition in for statement")
-			}
-		}
-		check.simpleStmt(s.Post)
-		// spec: "The init statement may be a short variable
-		// declaration, but the post statement must not."
-		if s, _ := s.Post.(*ast.AssignStmt); s != nil && s.Tok == token.DEFINE {
-			check.softErrorf(s.Pos(), "cannot declare in post statement")
-			check.use(s.Lhs...) // avoid follow-up errors
-		}
-		check.stmt(inner, s.Body)
-
-	case *ast.RangeStmt:
-		inner |= breakOk | continueOk
-		check.openScope(s, "for")
-		defer check.closeScope()
-
-		// check expression to iterate over
-		var x operand
-		check.expr(&x, s.X)
-
-		// determine key/value types
-		var key, val Type
-		if x.mode != invalid {
-			switch typ := x.typ.Underlying().(type) {
-			case *Basic:
-				if isString(typ) {
-					key = Typ[Int]
-					val = universeRune // use 'rune' name
-				}
-			case *Array:
-				key = Typ[Int]
-				val = typ.elem
-			case *Slice:
-				key = Typ[Int]
-				val = typ.elem
-			case *Pointer:
-				if typ, _ := typ.base.Underlying().(*Array); typ != nil {
-					key = Typ[Int]
-					val = typ.elem
-				}
-			case *Map:
-				key = typ.key
-				val = typ.elem
-			case *Chan:
-				key = typ.elem
-				val = Typ[Invalid]
-				if typ.dir == SendOnly {
-					check.errorf(x.pos(), "cannot range over send-only channel %s", &x)
-					// ok to continue
-				}
-				if s.Value != nil {
-					check.errorf(s.Value.Pos(), "iteration over %s permits only one iteration variable", &x)
-					// ok to continue
-				}
-			}
-		}
-
-		if key == nil {
-			check.errorf(x.pos(), "cannot range over %s", &x)
-			// ok to continue
-		}
-
-		// check assignment to/declaration of iteration variables
-		// (irregular assignment, cannot easily map to existing assignment checks)
-
-		// lhs expressions and initialization value (rhs) types
-		lhs := [2]ast.Expr{s.Key, s.Value}
-		rhs := [2]Type{key, val} // key, val may be nil
-
-		if s.Tok == token.DEFINE {
-			// short variable declaration; variable scope starts after the range clause
-			// (the for loop opens a new scope, so variables on the lhs never redeclare
-			// previously declared variables)
-			var vars []*Var
-			for i, lhs := range lhs {
-				if lhs == nil {
-					continue
-				}
-
-				// determine lhs variable
-				var obj *Var
-				if ident, _ := lhs.(*ast.Ident); ident != nil {
-					// declare new variable
-					name := ident.Name
-					obj = NewVar(ident.Pos(), check.pkg, name, nil)
-					check.recordDef(ident, obj)
-					// _ variables don't count as new variables
-					if name != "_" {
-						vars = append(vars, obj)
-					}
-				} else {
-					check.errorf(lhs.Pos(), "cannot declare %s", lhs)
-					obj = NewVar(lhs.Pos(), check.pkg, "_", nil) // dummy variable
-				}
-
-				// initialize lhs variable
-				if typ := rhs[i]; typ != nil {
-					x.mode = value
-					x.expr = lhs // we don't have a better rhs expression to use here
-					x.typ = typ
-					check.initVar(obj, &x, false)
-				} else {
-					obj.typ = Typ[Invalid]
-					obj.used = true // don't complain about unused variable
-				}
-			}
-
-			// declare variables
-			if len(vars) > 0 {
-				for _, obj := range vars {
-					// spec: "The scope of a constant or variable identifier declared inside
-					// a function begins at the end of the ConstSpec or VarSpec (ShortVarDecl
-					// for short variable declarations) and ends at the end of the innermost
-					// containing block."
-					scopePos := s.End()
-					check.declare(check.scope, nil /* recordDef already called */, obj, scopePos)
-				}
-			} else {
-				check.error(s.TokPos, "no new variables on left side of :=")
-			}
-		} else {
-			// ordinary assignment
-			for i, lhs := range lhs {
-				if lhs == nil {
-					continue
-				}
-				if typ := rhs[i]; typ != nil {
-					x.mode = value
-					x.expr = lhs // we don't have a better rhs expression to use here
-					x.typ = typ
-					check.assignVar(lhs, &x)
-				}
-			}
-		}
-
-		check.stmt(inner, s.Body)
-
-	default:
-		check.error(s.Pos(), "invalid statement")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/token_test.go b/third_party/gofrontend/libgo/go/go/types/token_test.go
deleted file mode 100644
index 705bb29..0000000
--- a/third_party/gofrontend/libgo/go/go/types/token_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file checks invariants of token.Token ordering that we rely on
-// since package go/token doesn't provide any guarantees at the moment.
-
-package types
-
-import (
-	"go/token"
-	"testing"
-)
-
-var assignOps = map[token.Token]token.Token{
-	token.ADD_ASSIGN:     token.ADD,
-	token.SUB_ASSIGN:     token.SUB,
-	token.MUL_ASSIGN:     token.MUL,
-	token.QUO_ASSIGN:     token.QUO,
-	token.REM_ASSIGN:     token.REM,
-	token.AND_ASSIGN:     token.AND,
-	token.OR_ASSIGN:      token.OR,
-	token.XOR_ASSIGN:     token.XOR,
-	token.SHL_ASSIGN:     token.SHL,
-	token.SHR_ASSIGN:     token.SHR,
-	token.AND_NOT_ASSIGN: token.AND_NOT,
-}
-
-func TestZeroTok(t *testing.T) {
-	// zero value for token.Token must be token.ILLEGAL
-	var zero token.Token
-	if token.ILLEGAL != zero {
-		t.Errorf("%s == %d; want 0", token.ILLEGAL, zero)
-	}
-}
-
-func TestAssignOp(t *testing.T) {
-	// there are fewer than 256 tokens
-	for i := 0; i < 256; i++ {
-		tok := token.Token(i)
-		got := assignOp(tok)
-		want := assignOps[tok]
-		if got != want {
-			t.Errorf("for assignOp(%s): got %s; want %s", tok, got, want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/type.go b/third_party/gofrontend/libgo/go/go/types/type.go
deleted file mode 100644
index 1df8b45..0000000
--- a/third_party/gofrontend/libgo/go/go/types/type.go
+++ /dev/null
@@ -1,454 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import "sort"
-
-// TODO(gri) Revisit factory functions - make sure they have all relevant parameters.
-
-// A Type represents a type of Go.
-// All types implement the Type interface.
-type Type interface {
-	// Underlying returns the underlying type of a type.
-	Underlying() Type
-
-	// String returns a string representation of a type.
-	String() string
-}
-
-// BasicKind describes the kind of basic type.
-type BasicKind int
-
-const (
-	Invalid BasicKind = iota // type is invalid
-
-	// predeclared types
-	Bool
-	Int
-	Int8
-	Int16
-	Int32
-	Int64
-	Uint
-	Uint8
-	Uint16
-	Uint32
-	Uint64
-	Uintptr
-	Float32
-	Float64
-	Complex64
-	Complex128
-	String
-	UnsafePointer
-
-	// types for untyped values
-	UntypedBool
-	UntypedInt
-	UntypedRune
-	UntypedFloat
-	UntypedComplex
-	UntypedString
-	UntypedNil
-
-	// aliases
-	Byte = Uint8
-	Rune = Int32
-)
-
-// BasicInfo is a set of flags describing properties of a basic type.
-type BasicInfo int
-
-// Properties of basic types.
-const (
-	IsBoolean BasicInfo = 1 << iota
-	IsInteger
-	IsUnsigned
-	IsFloat
-	IsComplex
-	IsString
-	IsUntyped
-
-	IsOrdered   = IsInteger | IsFloat | IsString
-	IsNumeric   = IsInteger | IsFloat | IsComplex
-	IsConstType = IsBoolean | IsNumeric | IsString
-)
-
-// A Basic represents a basic type.
-type Basic struct {
-	kind BasicKind
-	info BasicInfo
-	name string
-}
-
-// Kind returns the kind of basic type b.
-func (b *Basic) Kind() BasicKind { return b.kind }
-
-// Info returns information about properties of basic type b.
-func (b *Basic) Info() BasicInfo { return b.info }
-
-// Name returns the name of basic type b.
-func (b *Basic) Name() string { return b.name }
-
-// An Array represents an array type.
-type Array struct {
-	len  int64
-	elem Type
-}
-
-// NewArray returns a new array type for the given element type and length.
-func NewArray(elem Type, len int64) *Array { return &Array{len, elem} }
-
-// Len returns the length of array a.
-func (a *Array) Len() int64 { return a.len }
-
-// Elem returns element type of array a.
-func (a *Array) Elem() Type { return a.elem }
-
-// A Slice represents a slice type.
-type Slice struct {
-	elem Type
-}
-
-// NewSlice returns a new slice type for the given element type.
-func NewSlice(elem Type) *Slice { return &Slice{elem} }
-
-// Elem returns the element type of slice s.
-func (s *Slice) Elem() Type { return s.elem }
-
-// A Struct represents a struct type.
-type Struct struct {
-	fields []*Var
-	tags   []string // field tags; nil if there are no tags
-	// TODO(gri) access to offsets is not threadsafe - fix this
-	offsets []int64 // field offsets in bytes, lazily initialized
-}
-
-// NewStruct returns a new struct with the given fields and corresponding field tags.
-// If a field with index i has a tag, tags[i] must be that tag, but len(tags) may be
-// only as long as required to hold the tag with the largest index i. Consequently,
-// if no field has a tag, tags may be nil.
-func NewStruct(fields []*Var, tags []string) *Struct {
-	var fset objset
-	for _, f := range fields {
-		if f.name != "_" && fset.insert(f) != nil {
-			panic("multiple fields with the same name")
-		}
-	}
-	if len(tags) > len(fields) {
-		panic("more tags than fields")
-	}
-	return &Struct{fields: fields, tags: tags}
-}
-
-// NumFields returns the number of fields in the struct (including blank and anonymous fields).
-func (s *Struct) NumFields() int { return len(s.fields) }
-
-// Field returns the i'th field for 0 <= i < NumFields().
-func (s *Struct) Field(i int) *Var { return s.fields[i] }
-
-// Tag returns the i'th field tag for 0 <= i < NumFields().
-func (s *Struct) Tag(i int) string {
-	if i < len(s.tags) {
-		return s.tags[i]
-	}
-	return ""
-}
-
-// A Pointer represents a pointer type.
-type Pointer struct {
-	base Type // element type
-}
-
-// NewPointer returns a new pointer type for the given element (base) type.
-func NewPointer(elem Type) *Pointer { return &Pointer{base: elem} }
-
-// Elem returns the element type for the given pointer p.
-func (p *Pointer) Elem() Type { return p.base }
-
-// A Tuple represents an ordered list of variables; a nil *Tuple is a valid (empty) tuple.
-// Tuples are used as components of signatures and to represent the type of multiple
-// assignments; they are not first class types of Go.
-type Tuple struct {
-	vars []*Var
-}
-
-// NewTuple returns a new tuple for the given variables.
-func NewTuple(x ...*Var) *Tuple {
-	if len(x) > 0 {
-		return &Tuple{x}
-	}
-	return nil
-}
-
-// Len returns the number variables of tuple t.
-func (t *Tuple) Len() int {
-	if t != nil {
-		return len(t.vars)
-	}
-	return 0
-}
-
-// At returns the i'th variable of tuple t.
-func (t *Tuple) At(i int) *Var { return t.vars[i] }
-
-// A Signature represents a (non-builtin) function or method type.
-type Signature struct {
-	// We need to keep the scope in Signature (rather than passing it around
-	// and store it in the Func Object) because when type-checking a function
-	// literal we call the general type checker which returns a general Type.
-	// We then unpack the *Signature and use the scope for the literal body.
-	scope    *Scope // function scope, present for package-local signatures
-	recv     *Var   // nil if not a method
-	params   *Tuple // (incoming) parameters from left to right; or nil
-	results  *Tuple // (outgoing) results from left to right; or nil
-	variadic bool   // true if the last parameter's type is of the form ...T (or string, for append built-in only)
-}
-
-// NewSignature returns a new function type for the given receiver, parameters,
-// and results, either of which may be nil. If variadic is set, the function
-// is variadic, it must have at least one parameter, and the last parameter
-// must be of unnamed slice type.
-func NewSignature(recv *Var, params, results *Tuple, variadic bool) *Signature {
-	if variadic {
-		n := params.Len()
-		if n == 0 {
-			panic("types.NewSignature: variadic function must have at least one parameter")
-		}
-		if _, ok := params.At(n - 1).typ.(*Slice); !ok {
-			panic("types.NewSignature: variadic parameter must be of unnamed slice type")
-		}
-	}
-	return &Signature{nil, recv, params, results, variadic}
-}
-
-// Recv returns the receiver of signature s (if a method), or nil if a
-// function.
-//
-// For an abstract method, Recv returns the enclosing interface either
-// as a *Named or an *Interface.  Due to embedding, an interface may
-// contain methods whose receiver type is a different interface.
-func (s *Signature) Recv() *Var { return s.recv }
-
-// Params returns the parameters of signature s, or nil.
-func (s *Signature) Params() *Tuple { return s.params }
-
-// Results returns the results of signature s, or nil.
-func (s *Signature) Results() *Tuple { return s.results }
-
-// Variadic reports whether the signature s is variadic.
-func (s *Signature) Variadic() bool { return s.variadic }
-
-// An Interface represents an interface type.
-type Interface struct {
-	methods   []*Func  // ordered list of explicitly declared methods
-	embeddeds []*Named // ordered list of explicitly embedded types
-
-	allMethods []*Func // ordered list of methods declared with or embedded in this interface (TODO(gri): replace with mset)
-}
-
-// NewInterface returns a new interface for the given methods and embedded types.
-func NewInterface(methods []*Func, embeddeds []*Named) *Interface {
-	typ := new(Interface)
-
-	var mset objset
-	for _, m := range methods {
-		if mset.insert(m) != nil {
-			panic("multiple methods with the same name")
-		}
-		// set receiver
-		// TODO(gri) Ideally, we should use a named type here instead of
-		// typ, for less verbose printing of interface method signatures.
-		m.typ.(*Signature).recv = NewVar(m.pos, m.pkg, "", typ)
-	}
-	sort.Sort(byUniqueMethodName(methods))
-
-	if embeddeds == nil {
-		sort.Sort(byUniqueTypeName(embeddeds))
-	}
-
-	typ.methods = methods
-	typ.embeddeds = embeddeds
-	return typ
-}
-
-// NumExplicitMethods returns the number of explicitly declared methods of interface t.
-func (t *Interface) NumExplicitMethods() int { return len(t.methods) }
-
-// ExplicitMethod returns the i'th explicitly declared method of interface t for 0 <= i < t.NumExplicitMethods().
-// The methods are ordered by their unique Id.
-func (t *Interface) ExplicitMethod(i int) *Func { return t.methods[i] }
-
-// NumEmbeddeds returns the number of embedded types in interface t.
-func (t *Interface) NumEmbeddeds() int { return len(t.embeddeds) }
-
-// Embedded returns the i'th embedded type of interface t for 0 <= i < t.NumEmbeddeds().
-// The types are ordered by the corresponding TypeName's unique Id.
-func (t *Interface) Embedded(i int) *Named { return t.embeddeds[i] }
-
-// NumMethods returns the total number of methods of interface t.
-func (t *Interface) NumMethods() int { return len(t.allMethods) }
-
-// Method returns the i'th method of interface t for 0 <= i < t.NumMethods().
-// The methods are ordered by their unique Id.
-func (t *Interface) Method(i int) *Func { return t.allMethods[i] }
-
-// Empty returns true if t is the empty interface.
-func (t *Interface) Empty() bool { return len(t.allMethods) == 0 }
-
-// Complete computes the interface's method set. It must be called by users of
-// NewInterface after the interface's embedded types are fully defined and
-// before using the interface type in any way other than to form other types.
-// Complete returns the receiver.
-func (t *Interface) Complete() *Interface {
-	if t.allMethods != nil {
-		return t
-	}
-
-	var allMethods []*Func
-	if t.embeddeds == nil {
-		if t.methods == nil {
-			allMethods = make([]*Func, 0, 1)
-		} else {
-			allMethods = t.methods
-		}
-	} else {
-		allMethods = append(allMethods, t.methods...)
-		for _, et := range t.embeddeds {
-			it := et.Underlying().(*Interface)
-			it.Complete()
-			for _, tm := range it.allMethods {
-				// Make a copy of the method and adjust its receiver type.
-				newm := *tm
-				newmtyp := *tm.typ.(*Signature)
-				newm.typ = &newmtyp
-				newmtyp.recv = NewVar(newm.pos, newm.pkg, "", t)
-				allMethods = append(allMethods, &newm)
-			}
-		}
-		sort.Sort(byUniqueMethodName(allMethods))
-	}
-	t.allMethods = allMethods
-
-	return t
-}
-
-// A Map represents a map type.
-type Map struct {
-	key, elem Type
-}
-
-// NewMap returns a new map for the given key and element types.
-func NewMap(key, elem Type) *Map {
-	return &Map{key, elem}
-}
-
-// Key returns the key type of map m.
-func (m *Map) Key() Type { return m.key }
-
-// Elem returns the element type of map m.
-func (m *Map) Elem() Type { return m.elem }
-
-// A Chan represents a channel type.
-type Chan struct {
-	dir  ChanDir
-	elem Type
-}
-
-// A ChanDir value indicates a channel direction.
-type ChanDir int
-
-// The direction of a channel is indicated by one of the following constants.
-const (
-	SendRecv ChanDir = iota
-	SendOnly
-	RecvOnly
-)
-
-// NewChan returns a new channel type for the given direction and element type.
-func NewChan(dir ChanDir, elem Type) *Chan {
-	return &Chan{dir, elem}
-}
-
-// Dir returns the direction of channel c.
-func (c *Chan) Dir() ChanDir { return c.dir }
-
-// Elem returns the element type of channel c.
-func (c *Chan) Elem() Type { return c.elem }
-
-// A Named represents a named type.
-type Named struct {
-	obj        *TypeName // corresponding declared object
-	underlying Type      // possibly a *Named during setup; never a *Named once set up completely
-	methods    []*Func   // methods declared for this type (not the method set of this type)
-}
-
-// NewNamed returns a new named type for the given type name, underlying type, and associated methods.
-// The underlying type must not be a *Named.
-func NewNamed(obj *TypeName, underlying Type, methods []*Func) *Named {
-	if _, ok := underlying.(*Named); ok {
-		panic("types.NewNamed: underlying type must not be *Named")
-	}
-	typ := &Named{obj: obj, underlying: underlying, methods: methods}
-	if obj.typ == nil {
-		obj.typ = typ
-	}
-	return typ
-}
-
-// TypeName returns the type name for the named type t.
-func (t *Named) Obj() *TypeName { return t.obj }
-
-// NumMethods returns the number of explicit methods whose receiver is named type t.
-func (t *Named) NumMethods() int { return len(t.methods) }
-
-// Method returns the i'th method of named type t for 0 <= i < t.NumMethods().
-func (t *Named) Method(i int) *Func { return t.methods[i] }
-
-// SetUnderlying sets the underlying type and marks t as complete.
-// TODO(gri) determine if there's a better solution rather than providing this function
-func (t *Named) SetUnderlying(underlying Type) {
-	if underlying == nil {
-		panic("types.Named.SetUnderlying: underlying type must not be nil")
-	}
-	if _, ok := underlying.(*Named); ok {
-		panic("types.Named.SetUnderlying: underlying type must not be *Named")
-	}
-	t.underlying = underlying
-}
-
-// AddMethod adds method m unless it is already in the method list.
-// TODO(gri) find a better solution instead of providing this function
-func (t *Named) AddMethod(m *Func) {
-	if i, _ := lookupMethod(t.methods, m.pkg, m.name); i < 0 {
-		t.methods = append(t.methods, m)
-	}
-}
-
-// Implementations for Type methods.
-
-func (t *Basic) Underlying() Type     { return t }
-func (t *Array) Underlying() Type     { return t }
-func (t *Slice) Underlying() Type     { return t }
-func (t *Struct) Underlying() Type    { return t }
-func (t *Pointer) Underlying() Type   { return t }
-func (t *Tuple) Underlying() Type     { return t }
-func (t *Signature) Underlying() Type { return t }
-func (t *Interface) Underlying() Type { return t }
-func (t *Map) Underlying() Type       { return t }
-func (t *Chan) Underlying() Type      { return t }
-func (t *Named) Underlying() Type     { return t.underlying }
-
-func (t *Basic) String() string     { return TypeString(t, nil) }
-func (t *Array) String() string     { return TypeString(t, nil) }
-func (t *Slice) String() string     { return TypeString(t, nil) }
-func (t *Struct) String() string    { return TypeString(t, nil) }
-func (t *Pointer) String() string   { return TypeString(t, nil) }
-func (t *Tuple) String() string     { return TypeString(t, nil) }
-func (t *Signature) String() string { return TypeString(t, nil) }
-func (t *Interface) String() string { return TypeString(t, nil) }
-func (t *Map) String() string       { return TypeString(t, nil) }
-func (t *Chan) String() string      { return TypeString(t, nil) }
-func (t *Named) String() string     { return TypeString(t, nil) }
diff --git a/third_party/gofrontend/libgo/go/go/types/typestring.go b/third_party/gofrontend/libgo/go/go/types/typestring.go
deleted file mode 100644
index bd62f4d..0000000
--- a/third_party/gofrontend/libgo/go/go/types/typestring.go
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements printing of types.
-
-package types
-
-import (
-	"bytes"
-	"fmt"
-)
-
-// A Qualifier controls how named package-level objects are printed in
-// calls to TypeString, ObjectString, and SelectionString.
-//
-// These three formatting routines call the Qualifier for each
-// package-level object O, and if the Qualifier returns a non-empty
-// string p, the object is printed in the form p.O.
-// If it returns an empty string, only the object name O is printed.
-//
-// Using a nil Qualifier is equivalent to using (*Package).Path: the
-// object is qualified by the import path, e.g., "encoding/json.Marshal".
-//
-type Qualifier func(*Package) string
-
-// RelativeTo(pkg) returns a Qualifier that fully qualifies members of
-// all packages other than pkg.
-func RelativeTo(pkg *Package) Qualifier {
-	if pkg == nil {
-		return nil
-	}
-	return func(other *Package) string {
-		if pkg == other {
-			return "" // same package; unqualified
-		}
-		return other.Path()
-	}
-}
-
-// If gcCompatibilityMode is set, printing of types is modified
-// to match the representation of some types in the gc compiler:
-//
-//	- byte and rune lose their alias name and simply stand for
-//	  uint8 and int32 respectively
-//	- embedded interfaces get flattened (the embedding info is lost,
-//	  and certain recursive interface types cannot be printed anymore)
-//
-// This makes it easier to compare packages computed with the type-
-// checker vs packages imported from gc export data.
-//
-// Caution: This flag affects all uses of WriteType, globally.
-// It is only provided for testing in conjunction with
-// gc-generated data.
-//
-// This flag is exported in the x/tools/go/types package. We don't
-// need it at the moment in the std repo and so we don't export it
-// anymore. We should eventually try to remove it altogether.
-var gcCompatibilityMode bool
-
-// TypeString returns the string representation of typ.
-// The Qualifier controls the printing of
-// package-level objects, and may be nil.
-func TypeString(typ Type, qf Qualifier) string {
-	var buf bytes.Buffer
-	WriteType(&buf, typ, qf)
-	return buf.String()
-}
-
-// WriteType writes the string representation of typ to buf.
-// The Qualifier controls the printing of
-// package-level objects, and may be nil.
-func WriteType(buf *bytes.Buffer, typ Type, qf Qualifier) {
-	writeType(buf, typ, qf, make([]Type, 8))
-}
-
-func writeType(buf *bytes.Buffer, typ Type, qf Qualifier, visited []Type) {
-	// Theoretically, this is a quadratic lookup algorithm, but in
-	// practice deeply nested composite types with unnamed component
-	// types are uncommon. This code is likely more efficient than
-	// using a map.
-	for _, t := range visited {
-		if t == typ {
-			fmt.Fprintf(buf, "○%T", typ) // cycle to typ
-			return
-		}
-	}
-	visited = append(visited, typ)
-
-	switch t := typ.(type) {
-	case nil:
-		buf.WriteString("<nil>")
-
-	case *Basic:
-		if t.kind == UnsafePointer {
-			buf.WriteString("unsafe.")
-		}
-		if gcCompatibilityMode {
-			// forget the alias names
-			switch t.kind {
-			case Byte:
-				t = Typ[Uint8]
-			case Rune:
-				t = Typ[Int32]
-			}
-		}
-		buf.WriteString(t.name)
-
-	case *Array:
-		fmt.Fprintf(buf, "[%d]", t.len)
-		writeType(buf, t.elem, qf, visited)
-
-	case *Slice:
-		buf.WriteString("[]")
-		writeType(buf, t.elem, qf, visited)
-
-	case *Struct:
-		buf.WriteString("struct{")
-		for i, f := range t.fields {
-			if i > 0 {
-				buf.WriteString("; ")
-			}
-			if !f.anonymous {
-				buf.WriteString(f.name)
-				buf.WriteByte(' ')
-			}
-			writeType(buf, f.typ, qf, visited)
-			if tag := t.Tag(i); tag != "" {
-				fmt.Fprintf(buf, " %q", tag)
-			}
-		}
-		buf.WriteByte('}')
-
-	case *Pointer:
-		buf.WriteByte('*')
-		writeType(buf, t.base, qf, visited)
-
-	case *Tuple:
-		writeTuple(buf, t, false, qf, visited)
-
-	case *Signature:
-		buf.WriteString("func")
-		writeSignature(buf, t, qf, visited)
-
-	case *Interface:
-		// We write the source-level methods and embedded types rather
-		// than the actual method set since resolved method signatures
-		// may have non-printable cycles if parameters have anonymous
-		// interface types that (directly or indirectly) embed the
-		// current interface. For instance, consider the result type
-		// of m:
-		//
-		//     type T interface{
-		//         m() interface{ T }
-		//     }
-		//
-		buf.WriteString("interface{")
-		if gcCompatibilityMode {
-			// print flattened interface
-			// (useful to compare against gc-generated interfaces)
-			for i, m := range t.allMethods {
-				if i > 0 {
-					buf.WriteString("; ")
-				}
-				buf.WriteString(m.name)
-				writeSignature(buf, m.typ.(*Signature), qf, visited)
-			}
-		} else {
-			// print explicit interface methods and embedded types
-			for i, m := range t.methods {
-				if i > 0 {
-					buf.WriteString("; ")
-				}
-				buf.WriteString(m.name)
-				writeSignature(buf, m.typ.(*Signature), qf, visited)
-			}
-			for i, typ := range t.embeddeds {
-				if i > 0 || len(t.methods) > 0 {
-					buf.WriteString("; ")
-				}
-				writeType(buf, typ, qf, visited)
-			}
-		}
-		buf.WriteByte('}')
-
-	case *Map:
-		buf.WriteString("map[")
-		writeType(buf, t.key, qf, visited)
-		buf.WriteByte(']')
-		writeType(buf, t.elem, qf, visited)
-
-	case *Chan:
-		var s string
-		var parens bool
-		switch t.dir {
-		case SendRecv:
-			s = "chan "
-			// chan (<-chan T) requires parentheses
-			if c, _ := t.elem.(*Chan); c != nil && c.dir == RecvOnly {
-				parens = true
-			}
-		case SendOnly:
-			s = "chan<- "
-		case RecvOnly:
-			s = "<-chan "
-		default:
-			panic("unreachable")
-		}
-		buf.WriteString(s)
-		if parens {
-			buf.WriteByte('(')
-		}
-		writeType(buf, t.elem, qf, visited)
-		if parens {
-			buf.WriteByte(')')
-		}
-
-	case *Named:
-		s := "<Named w/o object>"
-		if obj := t.obj; obj != nil {
-			if obj.pkg != nil {
-				writePackage(buf, obj.pkg, qf)
-			}
-			// TODO(gri): function-local named types should be displayed
-			// differently from named types at package level to avoid
-			// ambiguity.
-			s = obj.name
-		}
-		buf.WriteString(s)
-
-	default:
-		// For externally defined implementations of Type.
-		buf.WriteString(t.String())
-	}
-}
-
-func writeTuple(buf *bytes.Buffer, tup *Tuple, variadic bool, qf Qualifier, visited []Type) {
-	buf.WriteByte('(')
-	if tup != nil {
-		for i, v := range tup.vars {
-			if i > 0 {
-				buf.WriteString(", ")
-			}
-			if v.name != "" {
-				buf.WriteString(v.name)
-				buf.WriteByte(' ')
-			}
-			typ := v.typ
-			if variadic && i == len(tup.vars)-1 {
-				if s, ok := typ.(*Slice); ok {
-					buf.WriteString("...")
-					typ = s.elem
-				} else {
-					// special case:
-					// append(s, "foo"...) leads to signature func([]byte, string...)
-					if t, ok := typ.Underlying().(*Basic); !ok || t.kind != String {
-						panic("internal error: string type expected")
-					}
-					writeType(buf, typ, qf, visited)
-					buf.WriteString("...")
-					continue
-				}
-			}
-			writeType(buf, typ, qf, visited)
-		}
-	}
-	buf.WriteByte(')')
-}
-
-// WriteSignature writes the representation of the signature sig to buf,
-// without a leading "func" keyword.
-// The Qualifier controls the printing of
-// package-level objects, and may be nil.
-func WriteSignature(buf *bytes.Buffer, sig *Signature, qf Qualifier) {
-	writeSignature(buf, sig, qf, make([]Type, 8))
-}
-
-func writeSignature(buf *bytes.Buffer, sig *Signature, qf Qualifier, visited []Type) {
-	writeTuple(buf, sig.params, sig.variadic, qf, visited)
-
-	n := sig.results.Len()
-	if n == 0 {
-		// no result
-		return
-	}
-
-	buf.WriteByte(' ')
-	if n == 1 && sig.results.vars[0].name == "" {
-		// single unnamed result
-		writeType(buf, sig.results.vars[0].typ, qf, visited)
-		return
-	}
-
-	// multiple or named result(s)
-	writeTuple(buf, sig.results, false, qf, visited)
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/typestring_test.go b/third_party/gofrontend/libgo/go/go/types/typestring_test.go
deleted file mode 100644
index 913e6c7..0000000
--- a/third_party/gofrontend/libgo/go/go/types/typestring_test.go
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"go/ast"
-	"go/importer"
-	"go/parser"
-	"go/token"
-	"internal/testenv"
-	"testing"
-
-	. "go/types"
-)
-
-const filename = "<src>"
-
-func makePkg(t *testing.T, src string) (*Package, error) {
-	fset := token.NewFileSet()
-	file, err := parser.ParseFile(fset, filename, src, parser.DeclarationErrors)
-	if err != nil {
-		return nil, err
-	}
-	// use the package name as package path
-	conf := Config{Importer: importer.Default()}
-	return conf.Check(file.Name.Name, fset, []*ast.File{file}, nil)
-}
-
-type testEntry struct {
-	src, str string
-}
-
-// dup returns a testEntry where both src and str are the same.
-func dup(s string) testEntry {
-	return testEntry{s, s}
-}
-
-// types that don't depend on any other type declarations
-var independentTestTypes = []testEntry{
-	// basic types
-	dup("int"),
-	dup("float32"),
-	dup("string"),
-
-	// arrays
-	dup("[10]int"),
-
-	// slices
-	dup("[]int"),
-	dup("[][]int"),
-
-	// structs
-	dup("struct{}"),
-	dup("struct{x int}"),
-	{`struct {
-		x, y int
-		z float32 "foo"
-	}`, `struct{x int; y int; z float32 "foo"}`},
-	{`struct {
-		string
-		elems []complex128
-	}`, `struct{string; elems []complex128}`},
-
-	// pointers
-	dup("*int"),
-	dup("***struct{}"),
-	dup("*struct{a int; b float32}"),
-
-	// functions
-	dup("func()"),
-	dup("func(x int)"),
-	{"func(x, y int)", "func(x int, y int)"},
-	{"func(x, y int, z string)", "func(x int, y int, z string)"},
-	dup("func(int)"),
-	{"func(int, string, byte)", "func(int, string, byte)"},
-
-	dup("func() int"),
-	{"func() (string)", "func() string"},
-	dup("func() (u int)"),
-	{"func() (u, v int, w string)", "func() (u int, v int, w string)"},
-
-	dup("func(int) string"),
-	dup("func(x int) string"),
-	dup("func(x int) (u string)"),
-	{"func(x, y int) (u string)", "func(x int, y int) (u string)"},
-
-	dup("func(...int) string"),
-	dup("func(x ...int) string"),
-	dup("func(x ...int) (u string)"),
-	{"func(x, y ...int) (u string)", "func(x int, y ...int) (u string)"},
-
-	// interfaces
-	dup("interface{}"),
-	dup("interface{m()}"),
-	dup(`interface{String() string; m(int) float32}`),
-
-	// maps
-	dup("map[string]int"),
-	{"map[struct{x, y int}][]byte", "map[struct{x int; y int}][]byte"},
-
-	// channels
-	dup("chan<- chan int"),
-	dup("chan<- <-chan int"),
-	dup("<-chan <-chan int"),
-	dup("chan (<-chan int)"),
-	dup("chan<- func()"),
-	dup("<-chan []func() int"),
-}
-
-// types that depend on other type declarations (src in TestTypes)
-var dependentTestTypes = []testEntry{
-	// interfaces
-	dup(`interface{io.Reader; io.Writer}`),
-	dup(`interface{m() int; io.Writer}`),
-	{`interface{m() interface{T}}`, `interface{m() interface{p.T}}`},
-}
-
-func TestTypeString(t *testing.T) {
-	testenv.MustHaveGoBuild(t)
-
-	var tests []testEntry
-	tests = append(tests, independentTestTypes...)
-	tests = append(tests, dependentTestTypes...)
-
-	for _, test := range tests {
-		src := `package p; import "io"; type _ io.Writer; type T ` + test.src
-		pkg, err := makePkg(t, src)
-		if err != nil {
-			t.Errorf("%s: %s", src, err)
-			continue
-		}
-		typ := pkg.Scope().Lookup("T").Type().Underlying()
-		if got := typ.String(); got != test.str {
-			t.Errorf("%s: got %s, want %s", test.src, got, test.str)
-		}
-	}
-}
-
-func TestQualifiedTypeString(t *testing.T) {
-	p, _ := pkgFor("p.go", "package p; type T int", nil)
-	q, _ := pkgFor("q.go", "package q", nil)
-
-	pT := p.Scope().Lookup("T").Type()
-	for _, test := range []struct {
-		typ  Type
-		this *Package
-		want string
-	}{
-		{pT, nil, "p.T"},
-		{pT, p, "T"},
-		{pT, q, "p.T"},
-		{NewPointer(pT), p, "*T"},
-		{NewPointer(pT), q, "*p.T"},
-	} {
-		qualifier := func(pkg *Package) string {
-			if pkg != test.this {
-				return pkg.Name()
-			}
-			return ""
-		}
-		if got := TypeString(test.typ, qualifier); got != test.want {
-			t.Errorf("TypeString(%s, %s) = %s, want %s",
-				test.this, test.typ, got, test.want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/typexpr.go b/third_party/gofrontend/libgo/go/go/types/typexpr.go
deleted file mode 100644
index c744eea..0000000
--- a/third_party/gofrontend/libgo/go/go/types/typexpr.go
+++ /dev/null
@@ -1,712 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements type-checking of identifiers and type expressions.
-
-package types
-
-import (
-	"go/ast"
-	"go/constant"
-	"go/token"
-	"sort"
-	"strconv"
-)
-
-// ident type-checks identifier e and initializes x with the value or type of e.
-// If an error occurred, x.mode is set to invalid.
-// For the meaning of def and path, see check.typ, below.
-//
-func (check *Checker) ident(x *operand, e *ast.Ident, def *Named, path []*TypeName) {
-	x.mode = invalid
-	x.expr = e
-
-	scope, obj := check.scope.LookupParent(e.Name, check.pos)
-	if obj == nil {
-		if e.Name == "_" {
-			check.errorf(e.Pos(), "cannot use _ as value or type")
-		} else {
-			check.errorf(e.Pos(), "undeclared name: %s", e.Name)
-		}
-		return
-	}
-	check.recordUse(e, obj)
-
-	check.objDecl(obj, def, path)
-	typ := obj.Type()
-	assert(typ != nil)
-
-	// The object may be dot-imported: If so, remove its package from
-	// the map of unused dot imports for the respective file scope.
-	// (This code is only needed for dot-imports. Without them,
-	// we only have to mark variables, see *Var case below).
-	if pkg := obj.Pkg(); pkg != check.pkg && pkg != nil {
-		delete(check.unusedDotImports[scope], pkg)
-	}
-
-	switch obj := obj.(type) {
-	case *PkgName:
-		check.errorf(e.Pos(), "use of package %s not in selector", obj.name)
-		return
-
-	case *Const:
-		check.addDeclDep(obj)
-		if typ == Typ[Invalid] {
-			return
-		}
-		if obj == universeIota {
-			if check.iota == nil {
-				check.errorf(e.Pos(), "cannot use iota outside constant declaration")
-				return
-			}
-			x.val = check.iota
-		} else {
-			x.val = obj.val
-		}
-		assert(x.val != nil)
-		x.mode = constant_
-
-	case *TypeName:
-		x.mode = typexpr
-		// check for cycle
-		// (it's ok to iterate forward because each named type appears at most once in path)
-		for i, prev := range path {
-			if prev == obj {
-				check.errorf(obj.pos, "illegal cycle in declaration of %s", obj.name)
-				// print cycle
-				for _, obj := range path[i:] {
-					check.errorf(obj.Pos(), "\t%s refers to", obj.Name()) // secondary error, \t indented
-				}
-				check.errorf(obj.Pos(), "\t%s", obj.Name())
-				// maintain x.mode == typexpr despite error
-				typ = Typ[Invalid]
-				break
-			}
-		}
-
-	case *Var:
-		if obj.pkg == check.pkg {
-			obj.used = true
-		}
-		check.addDeclDep(obj)
-		if typ == Typ[Invalid] {
-			return
-		}
-		x.mode = variable
-
-	case *Func:
-		check.addDeclDep(obj)
-		x.mode = value
-
-	case *Builtin:
-		x.id = obj.id
-		x.mode = builtin
-
-	case *Nil:
-		x.mode = value
-
-	default:
-		unreachable()
-	}
-
-	x.typ = typ
-}
-
-// typExpr type-checks the type expression e and returns its type, or Typ[Invalid].
-// If def != nil, e is the type specification for the named type def, declared
-// in a type declaration, and def.underlying will be set to the type of e before
-// any components of e are type-checked. Path contains the path of named types
-// referring to this type.
-//
-func (check *Checker) typExpr(e ast.Expr, def *Named, path []*TypeName) (T Type) {
-	if trace {
-		check.trace(e.Pos(), "%s", e)
-		check.indent++
-		defer func() {
-			check.indent--
-			check.trace(e.Pos(), "=> %s", T)
-		}()
-	}
-
-	T = check.typExprInternal(e, def, path)
-	assert(isTyped(T))
-	check.recordTypeAndValue(e, typexpr, T, nil)
-
-	return
-}
-
-func (check *Checker) typ(e ast.Expr) Type {
-	return check.typExpr(e, nil, nil)
-}
-
-// funcType type-checks a function or method type.
-func (check *Checker) funcType(sig *Signature, recvPar *ast.FieldList, ftyp *ast.FuncType) {
-	scope := NewScope(check.scope, token.NoPos, token.NoPos, "function")
-	check.recordScope(ftyp, scope)
-
-	recvList, _ := check.collectParams(scope, recvPar, false)
-	params, variadic := check.collectParams(scope, ftyp.Params, true)
-	results, _ := check.collectParams(scope, ftyp.Results, false)
-
-	if recvPar != nil {
-		// recv parameter list present (may be empty)
-		// spec: "The receiver is specified via an extra parameter section preceding the
-		// method name. That parameter section must declare a single parameter, the receiver."
-		var recv *Var
-		switch len(recvList) {
-		case 0:
-			check.error(recvPar.Pos(), "method is missing receiver")
-			recv = NewParam(0, nil, "", Typ[Invalid]) // ignore recv below
-		default:
-			// more than one receiver
-			check.error(recvList[len(recvList)-1].Pos(), "method must have exactly one receiver")
-			fallthrough // continue with first receiver
-		case 1:
-			recv = recvList[0]
-		}
-		// spec: "The receiver type must be of the form T or *T where T is a type name."
-		// (ignore invalid types - error was reported before)
-		if t, _ := deref(recv.typ); t != Typ[Invalid] {
-			var err string
-			if T, _ := t.(*Named); T != nil {
-				// spec: "The type denoted by T is called the receiver base type; it must not
-				// be a pointer or interface type and it must be declared in the same package
-				// as the method."
-				if T.obj.pkg != check.pkg {
-					err = "type not defined in this package"
-				} else {
-					// TODO(gri) This is not correct if the underlying type is unknown yet.
-					switch u := T.underlying.(type) {
-					case *Basic:
-						// unsafe.Pointer is treated like a regular pointer
-						if u.kind == UnsafePointer {
-							err = "unsafe.Pointer"
-						}
-					case *Pointer, *Interface:
-						err = "pointer or interface type"
-					}
-				}
-			} else {
-				err = "basic or unnamed type"
-			}
-			if err != "" {
-				check.errorf(recv.pos, "invalid receiver %s (%s)", recv.typ, err)
-				// ok to continue
-			}
-		}
-		sig.recv = recv
-	}
-
-	sig.scope = scope
-	sig.params = NewTuple(params...)
-	sig.results = NewTuple(results...)
-	sig.variadic = variadic
-}
-
-// typExprInternal drives type checking of types.
-// Must only be called by typExpr.
-//
-func (check *Checker) typExprInternal(e ast.Expr, def *Named, path []*TypeName) Type {
-	switch e := e.(type) {
-	case *ast.BadExpr:
-		// ignore - error reported before
-
-	case *ast.Ident:
-		var x operand
-		check.ident(&x, e, def, path)
-
-		switch x.mode {
-		case typexpr:
-			typ := x.typ
-			def.setUnderlying(typ)
-			return typ
-		case invalid:
-			// ignore - error reported before
-		case novalue:
-			check.errorf(x.pos(), "%s used as type", &x)
-		default:
-			check.errorf(x.pos(), "%s is not a type", &x)
-		}
-
-	case *ast.SelectorExpr:
-		var x operand
-		check.selector(&x, e)
-
-		switch x.mode {
-		case typexpr:
-			typ := x.typ
-			def.setUnderlying(typ)
-			return typ
-		case invalid:
-			// ignore - error reported before
-		case novalue:
-			check.errorf(x.pos(), "%s used as type", &x)
-		default:
-			check.errorf(x.pos(), "%s is not a type", &x)
-		}
-
-	case *ast.ParenExpr:
-		return check.typExpr(e.X, def, path)
-
-	case *ast.ArrayType:
-		if e.Len != nil {
-			typ := new(Array)
-			def.setUnderlying(typ)
-			typ.len = check.arrayLength(e.Len)
-			typ.elem = check.typExpr(e.Elt, nil, path)
-			return typ
-
-		} else {
-			typ := new(Slice)
-			def.setUnderlying(typ)
-			typ.elem = check.typ(e.Elt)
-			return typ
-		}
-
-	case *ast.StructType:
-		typ := new(Struct)
-		def.setUnderlying(typ)
-		check.structType(typ, e, path)
-		return typ
-
-	case *ast.StarExpr:
-		typ := new(Pointer)
-		def.setUnderlying(typ)
-		typ.base = check.typ(e.X)
-		return typ
-
-	case *ast.FuncType:
-		typ := new(Signature)
-		def.setUnderlying(typ)
-		check.funcType(typ, nil, e)
-		return typ
-
-	case *ast.InterfaceType:
-		typ := new(Interface)
-		def.setUnderlying(typ)
-		check.interfaceType(typ, e, def, path)
-		return typ
-
-	case *ast.MapType:
-		typ := new(Map)
-		def.setUnderlying(typ)
-
-		typ.key = check.typ(e.Key)
-		typ.elem = check.typ(e.Value)
-
-		// spec: "The comparison operators == and != must be fully defined
-		// for operands of the key type; thus the key type must not be a
-		// function, map, or slice."
-		//
-		// Delay this check because it requires fully setup types;
-		// it is safe to continue in any case (was issue 6667).
-		check.delay(func() {
-			if !Comparable(typ.key) {
-				check.errorf(e.Key.Pos(), "invalid map key type %s", typ.key)
-			}
-		})
-
-		return typ
-
-	case *ast.ChanType:
-		typ := new(Chan)
-		def.setUnderlying(typ)
-
-		dir := SendRecv
-		switch e.Dir {
-		case ast.SEND | ast.RECV:
-			// nothing to do
-		case ast.SEND:
-			dir = SendOnly
-		case ast.RECV:
-			dir = RecvOnly
-		default:
-			check.invalidAST(e.Pos(), "unknown channel direction %d", e.Dir)
-			// ok to continue
-		}
-
-		typ.dir = dir
-		typ.elem = check.typ(e.Value)
-		return typ
-
-	default:
-		check.errorf(e.Pos(), "%s is not a type", e)
-	}
-
-	typ := Typ[Invalid]
-	def.setUnderlying(typ)
-	return typ
-}
-
-// typeOrNil type-checks the type expression (or nil value) e
-// and returns the typ of e, or nil.
-// If e is neither a type nor nil, typOrNil returns Typ[Invalid].
-//
-func (check *Checker) typOrNil(e ast.Expr) Type {
-	var x operand
-	check.rawExpr(&x, e, nil)
-	switch x.mode {
-	case invalid:
-		// ignore - error reported before
-	case novalue:
-		check.errorf(x.pos(), "%s used as type", &x)
-	case typexpr:
-		return x.typ
-	case value:
-		if x.isNil() {
-			return nil
-		}
-		fallthrough
-	default:
-		check.errorf(x.pos(), "%s is not a type", &x)
-	}
-	return Typ[Invalid]
-}
-
-func (check *Checker) arrayLength(e ast.Expr) int64 {
-	var x operand
-	check.expr(&x, e)
-	if x.mode != constant_ {
-		if x.mode != invalid {
-			check.errorf(x.pos(), "array length %s must be constant", &x)
-		}
-		return 0
-	}
-	if !x.isInteger() {
-		check.errorf(x.pos(), "array length %s must be integer", &x)
-		return 0
-	}
-	n, ok := constant.Int64Val(x.val)
-	if !ok || n < 0 {
-		check.errorf(x.pos(), "invalid array length %s", &x)
-		return 0
-	}
-	return n
-}
-
-func (check *Checker) collectParams(scope *Scope, list *ast.FieldList, variadicOk bool) (params []*Var, variadic bool) {
-	if list == nil {
-		return
-	}
-
-	var named, anonymous bool
-	for i, field := range list.List {
-		ftype := field.Type
-		if t, _ := ftype.(*ast.Ellipsis); t != nil {
-			ftype = t.Elt
-			if variadicOk && i == len(list.List)-1 {
-				variadic = true
-			} else {
-				check.invalidAST(field.Pos(), "... not permitted")
-				// ignore ... and continue
-			}
-		}
-		typ := check.typ(ftype)
-		// The parser ensures that f.Tag is nil and we don't
-		// care if a constructed AST contains a non-nil tag.
-		if len(field.Names) > 0 {
-			// named parameter
-			for _, name := range field.Names {
-				if name.Name == "" {
-					check.invalidAST(name.Pos(), "anonymous parameter")
-					// ok to continue
-				}
-				par := NewParam(name.Pos(), check.pkg, name.Name, typ)
-				check.declare(scope, name, par, scope.pos)
-				params = append(params, par)
-			}
-			named = true
-		} else {
-			// anonymous parameter
-			par := NewParam(ftype.Pos(), check.pkg, "", typ)
-			check.recordImplicit(field, par)
-			params = append(params, par)
-			anonymous = true
-		}
-	}
-
-	if named && anonymous {
-		check.invalidAST(list.Pos(), "list contains both named and anonymous parameters")
-		// ok to continue
-	}
-
-	// For a variadic function, change the last parameter's type from T to []T.
-	if variadic && len(params) > 0 {
-		last := params[len(params)-1]
-		last.typ = &Slice{elem: last.typ}
-	}
-
-	return
-}
-
-func (check *Checker) declareInSet(oset *objset, pos token.Pos, obj Object) bool {
-	if alt := oset.insert(obj); alt != nil {
-		check.errorf(pos, "%s redeclared", obj.Name())
-		check.reportAltDecl(alt)
-		return false
-	}
-	return true
-}
-
-func (check *Checker) interfaceType(iface *Interface, ityp *ast.InterfaceType, def *Named, path []*TypeName) {
-	// empty interface: common case
-	if ityp.Methods == nil {
-		return
-	}
-
-	// The parser ensures that field tags are nil and we don't
-	// care if a constructed AST contains non-nil tags.
-
-	// use named receiver type if available (for better error messages)
-	var recvTyp Type = iface
-	if def != nil {
-		recvTyp = def
-	}
-
-	// Phase 1: Collect explicitly declared methods, the corresponding
-	//          signature (AST) expressions, and the list of embedded
-	//          type (AST) expressions. Do not resolve signatures or
-	//          embedded types yet to avoid cycles referring to this
-	//          interface.
-
-	var (
-		mset       objset
-		signatures []ast.Expr // list of corresponding method signatures
-		embedded   []ast.Expr // list of embedded types
-	)
-	for _, f := range ityp.Methods.List {
-		if len(f.Names) > 0 {
-			// The parser ensures that there's only one method
-			// and we don't care if a constructed AST has more.
-			name := f.Names[0]
-			pos := name.Pos()
-			// spec: "As with all method sets, in an interface type,
-			// each method must have a unique non-blank name."
-			if name.Name == "_" {
-				check.errorf(pos, "invalid method name _")
-				continue
-			}
-			// Don't type-check signature yet - use an
-			// empty signature now and update it later.
-			// Since we know the receiver, set it up now
-			// (required to avoid crash in ptrRecv; see
-			// e.g. test case for issue 6638).
-			// TODO(gri) Consider marking methods signatures
-			// as incomplete, for better error messages. See
-			// also the T4 and T5 tests in testdata/cycles2.src.
-			sig := new(Signature)
-			sig.recv = NewVar(pos, check.pkg, "", recvTyp)
-			m := NewFunc(pos, check.pkg, name.Name, sig)
-			if check.declareInSet(&mset, pos, m) {
-				iface.methods = append(iface.methods, m)
-				iface.allMethods = append(iface.allMethods, m)
-				signatures = append(signatures, f.Type)
-				check.recordDef(name, m)
-			}
-		} else {
-			// embedded type
-			embedded = append(embedded, f.Type)
-		}
-	}
-
-	// Phase 2: Resolve embedded interfaces. Because an interface must not
-	//          embed itself (directly or indirectly), each embedded interface
-	//          can be fully resolved without depending on any method of this
-	//          interface (if there is a cycle or another error, the embedded
-	//          type resolves to an invalid type and is ignored).
-	//          In particular, the list of methods for each embedded interface
-	//          must be complete (it cannot depend on this interface), and so
-	//          those methods can be added to the list of all methods of this
-	//          interface.
-
-	for _, e := range embedded {
-		pos := e.Pos()
-		typ := check.typExpr(e, nil, path)
-		// Determine underlying embedded (possibly incomplete) type
-		// by following its forward chain.
-		named, _ := typ.(*Named)
-		under := underlying(named)
-		embed, _ := under.(*Interface)
-		if embed == nil {
-			if typ != Typ[Invalid] {
-				check.errorf(pos, "%s is not an interface", typ)
-			}
-			continue
-		}
-		iface.embeddeds = append(iface.embeddeds, named)
-		// collect embedded methods
-		for _, m := range embed.allMethods {
-			if check.declareInSet(&mset, pos, m) {
-				iface.allMethods = append(iface.allMethods, m)
-			}
-		}
-	}
-
-	// Phase 3: At this point all methods have been collected for this interface.
-	//          It is now safe to type-check the signatures of all explicitly
-	//          declared methods, even if they refer to this interface via a cycle
-	//          and embed the methods of this interface in a parameter of interface
-	//          type.
-
-	for i, m := range iface.methods {
-		expr := signatures[i]
-		typ := check.typ(expr)
-		sig, _ := typ.(*Signature)
-		if sig == nil {
-			if typ != Typ[Invalid] {
-				check.invalidAST(expr.Pos(), "%s is not a method signature", typ)
-			}
-			continue // keep method with empty method signature
-		}
-		// update signature, but keep recv that was set up before
-		old := m.typ.(*Signature)
-		sig.recv = old.recv
-		*old = *sig // update signature (don't replace it!)
-	}
-
-	// TODO(gri) The list of explicit methods is only sorted for now to
-	// produce the same Interface as NewInterface. We may be able to
-	// claim source order in the future. Revisit.
-	sort.Sort(byUniqueMethodName(iface.methods))
-
-	// TODO(gri) The list of embedded types is only sorted for now to
-	// produce the same Interface as NewInterface. We may be able to
-	// claim source order in the future. Revisit.
-	sort.Sort(byUniqueTypeName(iface.embeddeds))
-
-	sort.Sort(byUniqueMethodName(iface.allMethods))
-}
-
-// byUniqueTypeName named type lists can be sorted by their unique type names.
-type byUniqueTypeName []*Named
-
-func (a byUniqueTypeName) Len() int           { return len(a) }
-func (a byUniqueTypeName) Less(i, j int) bool { return a[i].obj.Id() < a[j].obj.Id() }
-func (a byUniqueTypeName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-
-// byUniqueMethodName method lists can be sorted by their unique method names.
-type byUniqueMethodName []*Func
-
-func (a byUniqueMethodName) Len() int           { return len(a) }
-func (a byUniqueMethodName) Less(i, j int) bool { return a[i].Id() < a[j].Id() }
-func (a byUniqueMethodName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-
-func (check *Checker) tag(t *ast.BasicLit) string {
-	if t != nil {
-		if t.Kind == token.STRING {
-			if val, err := strconv.Unquote(t.Value); err == nil {
-				return val
-			}
-		}
-		check.invalidAST(t.Pos(), "incorrect tag syntax: %q", t.Value)
-	}
-	return ""
-}
-
-func (check *Checker) structType(styp *Struct, e *ast.StructType, path []*TypeName) {
-	list := e.Fields
-	if list == nil {
-		return
-	}
-
-	// struct fields and tags
-	var fields []*Var
-	var tags []string
-
-	// for double-declaration checks
-	var fset objset
-
-	// current field typ and tag
-	var typ Type
-	var tag string
-	// anonymous != nil indicates an anonymous field.
-	add := func(field *ast.Field, ident *ast.Ident, anonymous *TypeName, pos token.Pos) {
-		if tag != "" && tags == nil {
-			tags = make([]string, len(fields))
-		}
-		if tags != nil {
-			tags = append(tags, tag)
-		}
-
-		name := ident.Name
-		fld := NewField(pos, check.pkg, name, typ, anonymous != nil)
-		// spec: "Within a struct, non-blank field names must be unique."
-		if name == "_" || check.declareInSet(&fset, pos, fld) {
-			fields = append(fields, fld)
-			check.recordDef(ident, fld)
-		}
-		if anonymous != nil {
-			check.recordUse(ident, anonymous)
-		}
-	}
-
-	for _, f := range list.List {
-		typ = check.typExpr(f.Type, nil, path)
-		tag = check.tag(f.Tag)
-		if len(f.Names) > 0 {
-			// named fields
-			for _, name := range f.Names {
-				add(f, name, nil, name.Pos())
-			}
-		} else {
-			// anonymous field
-			name := anonymousFieldIdent(f.Type)
-			pos := f.Type.Pos()
-			t, isPtr := deref(typ)
-			switch t := t.(type) {
-			case *Basic:
-				if t == Typ[Invalid] {
-					// error was reported before
-					continue
-				}
-				// unsafe.Pointer is treated like a regular pointer
-				if t.kind == UnsafePointer {
-					check.errorf(pos, "anonymous field type cannot be unsafe.Pointer")
-					continue
-				}
-				add(f, name, Universe.Lookup(t.name).(*TypeName), pos)
-
-			case *Named:
-				// spec: "An embedded type must be specified as a type name
-				// T or as a pointer to a non-interface type name *T, and T
-				// itself may not be a pointer type."
-				switch u := t.underlying.(type) {
-				case *Basic:
-					// unsafe.Pointer is treated like a regular pointer
-					if u.kind == UnsafePointer {
-						check.errorf(pos, "anonymous field type cannot be unsafe.Pointer")
-						continue
-					}
-				case *Pointer:
-					check.errorf(pos, "anonymous field type cannot be a pointer")
-					continue
-				case *Interface:
-					if isPtr {
-						check.errorf(pos, "anonymous field type cannot be a pointer to an interface")
-						continue
-					}
-				}
-				add(f, name, t.obj, pos)
-
-			default:
-				check.invalidAST(pos, "anonymous field type %s must be named", typ)
-			}
-		}
-	}
-
-	styp.fields = fields
-	styp.tags = tags
-}
-
-func anonymousFieldIdent(e ast.Expr) *ast.Ident {
-	switch e := e.(type) {
-	case *ast.Ident:
-		return e
-	case *ast.StarExpr:
-		return anonymousFieldIdent(e.X)
-	case *ast.SelectorExpr:
-		return e.Sel
-	}
-	return nil // invalid anonymous field
-}
diff --git a/third_party/gofrontend/libgo/go/go/types/universe.go b/third_party/gofrontend/libgo/go/go/types/universe.go
deleted file mode 100644
index 40185c1..0000000
--- a/third_party/gofrontend/libgo/go/go/types/universe.go
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file sets up the universe scope and the unsafe package.
-
-package types
-
-import (
-	"go/constant"
-	"go/token"
-	"strings"
-)
-
-var (
-	Universe     *Scope
-	Unsafe       *Package
-	universeIota *Const
-	universeByte *Basic // uint8 alias, but has name "byte"
-	universeRune *Basic // int32 alias, but has name "rune"
-)
-
-var Typ = []*Basic{
-	Invalid: {Invalid, 0, "invalid type"},
-
-	Bool:          {Bool, IsBoolean, "bool"},
-	Int:           {Int, IsInteger, "int"},
-	Int8:          {Int8, IsInteger, "int8"},
-	Int16:         {Int16, IsInteger, "int16"},
-	Int32:         {Int32, IsInteger, "int32"},
-	Int64:         {Int64, IsInteger, "int64"},
-	Uint:          {Uint, IsInteger | IsUnsigned, "uint"},
-	Uint8:         {Uint8, IsInteger | IsUnsigned, "uint8"},
-	Uint16:        {Uint16, IsInteger | IsUnsigned, "uint16"},
-	Uint32:        {Uint32, IsInteger | IsUnsigned, "uint32"},
-	Uint64:        {Uint64, IsInteger | IsUnsigned, "uint64"},
-	Uintptr:       {Uintptr, IsInteger | IsUnsigned, "uintptr"},
-	Float32:       {Float32, IsFloat, "float32"},
-	Float64:       {Float64, IsFloat, "float64"},
-	Complex64:     {Complex64, IsComplex, "complex64"},
-	Complex128:    {Complex128, IsComplex, "complex128"},
-	String:        {String, IsString, "string"},
-	UnsafePointer: {UnsafePointer, 0, "Pointer"},
-
-	UntypedBool:    {UntypedBool, IsBoolean | IsUntyped, "untyped bool"},
-	UntypedInt:     {UntypedInt, IsInteger | IsUntyped, "untyped int"},
-	UntypedRune:    {UntypedRune, IsInteger | IsUntyped, "untyped rune"},
-	UntypedFloat:   {UntypedFloat, IsFloat | IsUntyped, "untyped float"},
-	UntypedComplex: {UntypedComplex, IsComplex | IsUntyped, "untyped complex"},
-	UntypedString:  {UntypedString, IsString | IsUntyped, "untyped string"},
-	UntypedNil:     {UntypedNil, IsUntyped, "untyped nil"},
-}
-
-var aliases = [...]*Basic{
-	{Byte, IsInteger | IsUnsigned, "byte"},
-	{Rune, IsInteger, "rune"},
-}
-
-func defPredeclaredTypes() {
-	for _, t := range Typ {
-		def(NewTypeName(token.NoPos, nil, t.name, t))
-	}
-	for _, t := range aliases {
-		def(NewTypeName(token.NoPos, nil, t.name, t))
-	}
-
-	// Error has a nil package in its qualified name since it is in no package
-	res := NewVar(token.NoPos, nil, "", Typ[String])
-	sig := &Signature{results: NewTuple(res)}
-	err := NewFunc(token.NoPos, nil, "Error", sig)
-	typ := &Named{underlying: NewInterface([]*Func{err}, nil).Complete()}
-	sig.recv = NewVar(token.NoPos, nil, "", typ)
-	def(NewTypeName(token.NoPos, nil, "error", typ))
-}
-
-var predeclaredConsts = [...]struct {
-	name string
-	kind BasicKind
-	val  constant.Value
-}{
-	{"true", UntypedBool, constant.MakeBool(true)},
-	{"false", UntypedBool, constant.MakeBool(false)},
-	{"iota", UntypedInt, constant.MakeInt64(0)},
-}
-
-func defPredeclaredConsts() {
-	for _, c := range predeclaredConsts {
-		def(NewConst(token.NoPos, nil, c.name, Typ[c.kind], c.val))
-	}
-}
-
-func defPredeclaredNil() {
-	def(&Nil{object{name: "nil", typ: Typ[UntypedNil]}})
-}
-
-// A builtinId is the id of a builtin function.
-type builtinId int
-
-const (
-	// universe scope
-	_Append builtinId = iota
-	_Cap
-	_Close
-	_Complex
-	_Copy
-	_Delete
-	_Imag
-	_Len
-	_Make
-	_New
-	_Panic
-	_Print
-	_Println
-	_Real
-	_Recover
-
-	// package unsafe
-	_Alignof
-	_Offsetof
-	_Sizeof
-
-	// testing support
-	_Assert
-	_Trace
-)
-
-var predeclaredFuncs = [...]struct {
-	name     string
-	nargs    int
-	variadic bool
-	kind     exprKind
-}{
-	_Append:  {"append", 1, true, expression},
-	_Cap:     {"cap", 1, false, expression},
-	_Close:   {"close", 1, false, statement},
-	_Complex: {"complex", 2, false, expression},
-	_Copy:    {"copy", 2, false, statement},
-	_Delete:  {"delete", 2, false, statement},
-	_Imag:    {"imag", 1, false, expression},
-	_Len:     {"len", 1, false, expression},
-	_Make:    {"make", 1, true, expression},
-	_New:     {"new", 1, false, expression},
-	_Panic:   {"panic", 1, false, statement},
-	_Print:   {"print", 0, true, statement},
-	_Println: {"println", 0, true, statement},
-	_Real:    {"real", 1, false, expression},
-	_Recover: {"recover", 0, false, statement},
-
-	_Alignof:  {"Alignof", 1, false, expression},
-	_Offsetof: {"Offsetof", 1, false, expression},
-	_Sizeof:   {"Sizeof", 1, false, expression},
-
-	_Assert: {"assert", 1, false, statement},
-	_Trace:  {"trace", 0, true, statement},
-}
-
-func defPredeclaredFuncs() {
-	for i := range predeclaredFuncs {
-		id := builtinId(i)
-		if id == _Assert || id == _Trace {
-			continue // only define these in testing environment
-		}
-		def(newBuiltin(id))
-	}
-}
-
-// DefPredeclaredTestFuncs defines the assert and trace built-ins.
-// These built-ins are intended for debugging and testing of this
-// package only.
-func DefPredeclaredTestFuncs() {
-	if Universe.Lookup("assert") != nil {
-		return // already defined
-	}
-	def(newBuiltin(_Assert))
-	def(newBuiltin(_Trace))
-}
-
-func init() {
-	Universe = NewScope(nil, token.NoPos, token.NoPos, "universe")
-	Unsafe = NewPackage("unsafe", "unsafe")
-	Unsafe.complete = true
-
-	defPredeclaredTypes()
-	defPredeclaredConsts()
-	defPredeclaredNil()
-	defPredeclaredFuncs()
-
-	universeIota = Universe.Lookup("iota").(*Const)
-	universeByte = Universe.Lookup("byte").(*TypeName).typ.(*Basic)
-	universeRune = Universe.Lookup("rune").(*TypeName).typ.(*Basic)
-}
-
-// Objects with names containing blanks are internal and not entered into
-// a scope. Objects with exported names are inserted in the unsafe package
-// scope; other objects are inserted in the universe scope.
-//
-func def(obj Object) {
-	name := obj.Name()
-	if strings.Index(name, " ") >= 0 {
-		return // nothing to do
-	}
-	// fix Obj link for named types
-	if typ, ok := obj.Type().(*Named); ok {
-		typ.obj = obj.(*TypeName)
-	}
-	// exported identifiers go into package unsafe
-	scope := Universe
-	if obj.Exported() {
-		scope = Unsafe.scope
-		// set Pkg field
-		switch obj := obj.(type) {
-		case *TypeName:
-			obj.pkg = Unsafe
-		case *Builtin:
-			obj.pkg = Unsafe
-		default:
-			unreachable()
-		}
-	}
-	if scope.Insert(obj) != nil {
-		panic("internal error: double declaration")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/hash/adler32/adler32.go b/third_party/gofrontend/libgo/go/hash/adler32/adler32.go
deleted file mode 100644
index 7c80796..0000000
--- a/third_party/gofrontend/libgo/go/hash/adler32/adler32.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package adler32 implements the Adler-32 checksum.
-//
-// It is defined in RFC 1950:
-//	Adler-32 is composed of two sums accumulated per byte: s1 is
-//	the sum of all bytes, s2 is the sum of all s1 values. Both sums
-//	are done modulo 65521. s1 is initialized to 1, s2 to zero.  The
-//	Adler-32 checksum is stored as s2*65536 + s1 in most-
-//	significant-byte first (network) order.
-package adler32
-
-import "hash"
-
-const (
-	// mod is the largest prime that is less than 65536.
-	mod = 65521
-	// nmax is the largest n such that
-	// 255 * n * (n+1) / 2 + (n+1) * (mod-1) <= 2^32-1.
-	// It is mentioned in RFC 1950 (search for "5552").
-	nmax = 5552
-)
-
-// The size of an Adler-32 checksum in bytes.
-const Size = 4
-
-// digest represents the partial evaluation of a checksum.
-// The low 16 bits are s1, the high 16 bits are s2.
-type digest uint32
-
-func (d *digest) Reset() { *d = 1 }
-
-// New returns a new hash.Hash32 computing the Adler-32 checksum.
-func New() hash.Hash32 {
-	d := new(digest)
-	d.Reset()
-	return d
-}
-
-func (d *digest) Size() int { return Size }
-
-func (d *digest) BlockSize() int { return 1 }
-
-// Add p to the running checksum d.
-func update(d digest, p []byte) digest {
-	s1, s2 := uint32(d&0xffff), uint32(d>>16)
-	for len(p) > 0 {
-		var q []byte
-		if len(p) > nmax {
-			p, q = p[:nmax], p[nmax:]
-		}
-		for _, x := range p {
-			s1 += uint32(x)
-			s2 += s1
-		}
-		s1 %= mod
-		s2 %= mod
-		p = q
-	}
-	return digest(s2<<16 | s1)
-}
-
-func (d *digest) Write(p []byte) (nn int, err error) {
-	*d = update(*d, p)
-	return len(p), nil
-}
-
-func (d *digest) Sum32() uint32 { return uint32(*d) }
-
-func (d *digest) Sum(in []byte) []byte {
-	s := uint32(*d)
-	return append(in, byte(s>>24), byte(s>>16), byte(s>>8), byte(s))
-}
-
-// Checksum returns the Adler-32 checksum of data.
-func Checksum(data []byte) uint32 { return uint32(update(1, data)) }
diff --git a/third_party/gofrontend/libgo/go/hash/adler32/adler32_test.go b/third_party/gofrontend/libgo/go/hash/adler32/adler32_test.go
deleted file mode 100644
index 0e9c938..0000000
--- a/third_party/gofrontend/libgo/go/hash/adler32/adler32_test.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package adler32
-
-import (
-	"strings"
-	"testing"
-)
-
-var golden = []struct {
-	out uint32
-	in  string
-}{
-	{0x00000001, ""},
-	{0x00620062, "a"},
-	{0x012600c4, "ab"},
-	{0x024d0127, "abc"},
-	{0x03d8018b, "abcd"},
-	{0x05c801f0, "abcde"},
-	{0x081e0256, "abcdef"},
-	{0x0adb02bd, "abcdefg"},
-	{0x0e000325, "abcdefgh"},
-	{0x118e038e, "abcdefghi"},
-	{0x158603f8, "abcdefghij"},
-	{0x3f090f02, "Discard medicine more than two years old."},
-	{0x46d81477, "He who has a shady past knows that nice guys finish last."},
-	{0x40ee0ee1, "I wouldn't marry him with a ten foot pole."},
-	{0x16661315, "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave"},
-	{0x5b2e1480, "The days of the digital watch are numbered.  -Tom Stoppard"},
-	{0x8c3c09ea, "Nepal premier won't resign."},
-	{0x45ac18fd, "For every action there is an equal and opposite government program."},
-	{0x53c61462, "His money is twice tainted: 'taint yours and 'taint mine."},
-	{0x7e511e63, "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977"},
-	{0xe4801a6a, "It's a tiny change to the code and not completely disgusting. - Bob Manchek"},
-	{0x61b507df, "size:  a.out:  bad magic"},
-	{0xb8631171, "The major problem is with sendmail.  -Mark Horton"},
-	{0x8b5e1904, "Give me a rock, paper and scissors and I will move the world.  CCFestoon"},
-	{0x7cc6102b, "If the enemy is within range, then so are you."},
-	{0x700318e7, "It's well we cannot hear the screams/That we create in others' dreams."},
-	{0x1e601747, "You remind me of a TV show, but that's all right: I watch it anyway."},
-	{0xb55b0b09, "C is as portable as Stonehedge!!"},
-	{0x39111dd0, "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley"},
-	{0x91dd304f, "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction.  Lewis-Randall Rule"},
-	{0x2e5d1316, "How can you write a big system without C++?  -Paul Glick"},
-	{0xd0201df6, "'Invariant assertions' is the most elegant programming technique!  -Tom Szymanski"},
-	{0x211297c8, strings.Repeat("\xff", 5548) + "8"},
-	{0xbaa198c8, strings.Repeat("\xff", 5549) + "9"},
-	{0x553499be, strings.Repeat("\xff", 5550) + "0"},
-	{0xf0c19abe, strings.Repeat("\xff", 5551) + "1"},
-	{0x8d5c9bbe, strings.Repeat("\xff", 5552) + "2"},
-	{0x2af69cbe, strings.Repeat("\xff", 5553) + "3"},
-	{0xc9809dbe, strings.Repeat("\xff", 5554) + "4"},
-	{0x69189ebe, strings.Repeat("\xff", 5555) + "5"},
-	{0x86af0001, strings.Repeat("\x00", 1e5)},
-	{0x79660b4d, strings.Repeat("a", 1e5)},
-	{0x110588ee, strings.Repeat("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 1e4)},
-}
-
-// checksum is a slow but simple implementation of the Adler-32 checksum.
-// It is a straight port of the sample code in RFC 1950 section 9.
-func checksum(p []byte) uint32 {
-	s1, s2 := uint32(1), uint32(0)
-	for _, x := range p {
-		s1 = (s1 + uint32(x)) % mod
-		s2 = (s2 + s1) % mod
-	}
-	return s2<<16 | s1
-}
-
-func TestGolden(t *testing.T) {
-	for _, g := range golden {
-		in := g.in
-		if len(in) > 220 {
-			in = in[:100] + "..." + in[len(in)-100:]
-		}
-		p := []byte(g.in)
-		if got := checksum(p); got != g.out {
-			t.Errorf("simple implementation: checksum(%q) = 0x%x want 0x%x", in, got, g.out)
-			continue
-		}
-		if got := Checksum(p); got != g.out {
-			t.Errorf("optimized implementation: Checksum(%q) = 0x%x want 0x%x", in, got, g.out)
-			continue
-		}
-	}
-}
-
-func BenchmarkAdler32KB(b *testing.B) {
-	b.SetBytes(1024)
-	data := make([]byte, 1024)
-	for i := range data {
-		data[i] = byte(i)
-	}
-	h := New()
-	in := make([]byte, 0, h.Size())
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		h.Reset()
-		h.Write(data)
-		h.Sum(in)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/hash/crc32/crc32.go b/third_party/gofrontend/libgo/go/hash/crc32/crc32.go
deleted file mode 100644
index 234d929..0000000
--- a/third_party/gofrontend/libgo/go/hash/crc32/crc32.go
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package crc32 implements the 32-bit cyclic redundancy check, or CRC-32,
-// checksum. See http://en.wikipedia.org/wiki/Cyclic_redundancy_check for
-// information.
-//
-// Polynomials are represented in LSB-first form also known as reversed representation.
-//
-// See http://en.wikipedia.org/wiki/Mathematics_of_cyclic_redundancy_checks#Reversed_representations_and_reciprocal_polynomials
-// for information.
-package crc32
-
-import (
-	"hash"
-	"sync"
-)
-
-// The size of a CRC-32 checksum in bytes.
-const Size = 4
-
-// Predefined polynomials.
-const (
-	// IEEE is by far and away the most common CRC-32 polynomial.
-	// Used by ethernet (IEEE 802.3), v.42, fddi, gzip, zip, png, ...
-	IEEE = 0xedb88320
-
-	// Castagnoli's polynomial, used in iSCSI.
-	// Has better error detection characteristics than IEEE.
-	// http://dx.doi.org/10.1109/26.231911
-	Castagnoli = 0x82f63b78
-
-	// Koopman's polynomial.
-	// Also has better error detection characteristics than IEEE.
-	// http://dx.doi.org/10.1109/DSN.2002.1028931
-	Koopman = 0xeb31d82e
-)
-
-// Table is a 256-word table representing the polynomial for efficient processing.
-type Table [256]uint32
-
-// castagnoliTable points to a lazily initialized Table for the Castagnoli
-// polynomial. MakeTable will always return this value when asked to make a
-// Castagnoli table so we can compare against it to find when the caller is
-// using this polynomial.
-var castagnoliTable *Table
-var castagnoliOnce sync.Once
-
-func castagnoliInit() {
-	castagnoliTable = makeTable(Castagnoli)
-}
-
-// IEEETable is the table for the IEEE polynomial.
-var IEEETable = makeTable(IEEE)
-
-// slicing8Table is array of 8 Tables
-type slicing8Table [8]Table
-
-// iEEETable8 is the slicing8Table for IEEE
-var iEEETable8 *slicing8Table
-var iEEETable8Once sync.Once
-
-// MakeTable returns the Table constructed from the specified polynomial.
-func MakeTable(poly uint32) *Table {
-	switch poly {
-	case IEEE:
-		return IEEETable
-	case Castagnoli:
-		castagnoliOnce.Do(castagnoliInit)
-		return castagnoliTable
-	}
-	return makeTable(poly)
-}
-
-// makeTable returns the Table constructed from the specified polynomial.
-func makeTable(poly uint32) *Table {
-	t := new(Table)
-	for i := 0; i < 256; i++ {
-		crc := uint32(i)
-		for j := 0; j < 8; j++ {
-			if crc&1 == 1 {
-				crc = (crc >> 1) ^ poly
-			} else {
-				crc >>= 1
-			}
-		}
-		t[i] = crc
-	}
-	return t
-}
-
-// makeTable8 returns slicing8Table constructed from the specified polynomial.
-func makeTable8(poly uint32) *slicing8Table {
-	t := new(slicing8Table)
-	t[0] = *makeTable(poly)
-	for i := 0; i < 256; i++ {
-		crc := t[0][i]
-		for j := 1; j < 8; j++ {
-			crc = t[0][crc&0xFF] ^ (crc >> 8)
-			t[j][i] = crc
-		}
-	}
-	return t
-}
-
-// digest represents the partial evaluation of a checksum.
-type digest struct {
-	crc uint32
-	tab *Table
-}
-
-// New creates a new hash.Hash32 computing the CRC-32 checksum
-// using the polynomial represented by the Table.
-func New(tab *Table) hash.Hash32 { return &digest{0, tab} }
-
-// NewIEEE creates a new hash.Hash32 computing the CRC-32 checksum
-// using the IEEE polynomial.
-func NewIEEE() hash.Hash32 { return New(IEEETable) }
-
-func (d *digest) Size() int { return Size }
-
-func (d *digest) BlockSize() int { return 1 }
-
-func (d *digest) Reset() { d.crc = 0 }
-
-func update(crc uint32, tab *Table, p []byte) uint32 {
-	crc = ^crc
-	for _, v := range p {
-		crc = tab[byte(crc)^v] ^ (crc >> 8)
-	}
-	return ^crc
-}
-
-// updateSlicingBy8 updates CRC using Slicing-by-8
-func updateSlicingBy8(crc uint32, tab *slicing8Table, p []byte) uint32 {
-	crc = ^crc
-	for len(p) > 8 {
-		crc ^= uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24
-		crc = tab[0][p[7]] ^ tab[1][p[6]] ^ tab[2][p[5]] ^ tab[3][p[4]] ^
-			tab[4][crc>>24] ^ tab[5][(crc>>16)&0xFF] ^
-			tab[6][(crc>>8)&0xFF] ^ tab[7][crc&0xFF]
-		p = p[8:]
-	}
-	crc = ^crc
-	return update(crc, &tab[0], p)
-}
-
-// Update returns the result of adding the bytes in p to the crc.
-func Update(crc uint32, tab *Table, p []byte) uint32 {
-	if tab == castagnoliTable {
-		return updateCastagnoli(crc, p)
-	}
-	// only use slicing-by-8 when input is larger than 4KB
-	if tab == IEEETable && len(p) >= 4096 {
-		iEEETable8Once.Do(func() {
-			iEEETable8 = makeTable8(IEEE)
-		})
-		return updateSlicingBy8(crc, iEEETable8, p)
-	}
-	return update(crc, tab, p)
-}
-
-func (d *digest) Write(p []byte) (n int, err error) {
-	d.crc = Update(d.crc, d.tab, p)
-	return len(p), nil
-}
-
-func (d *digest) Sum32() uint32 { return d.crc }
-
-func (d *digest) Sum(in []byte) []byte {
-	s := d.Sum32()
-	return append(in, byte(s>>24), byte(s>>16), byte(s>>8), byte(s))
-}
-
-// Checksum returns the CRC-32 checksum of data
-// using the polynomial represented by the Table.
-func Checksum(data []byte, tab *Table) uint32 { return Update(0, tab, data) }
-
-// ChecksumIEEE returns the CRC-32 checksum of data
-// using the IEEE polynomial.
-func ChecksumIEEE(data []byte) uint32 { return Update(0, IEEETable, data) }
diff --git a/third_party/gofrontend/libgo/go/hash/crc32/crc32_amd64x.go b/third_party/gofrontend/libgo/go/hash/crc32/crc32_amd64x.go
deleted file mode 100644
index b7e3599..0000000
--- a/third_party/gofrontend/libgo/go/hash/crc32/crc32_amd64x.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64 amd64p32
-
-package crc32
-
-// This file contains the code to call the SSE 4.2 version of the Castagnoli
-// CRC.
-
-// haveSSE42 is defined in crc_amd64.s and uses CPUID to test for SSE 4.2
-// support.
-func haveSSE42() bool
-
-// castagnoliSSE42 is defined in crc_amd64.s and uses the SSE4.2 CRC32
-// instruction.
-func castagnoliSSE42(crc uint32, p []byte) uint32
-
-var sse42 = haveSSE42()
-
-func updateCastagnoli(crc uint32, p []byte) uint32 {
-	if sse42 {
-		return castagnoliSSE42(crc, p)
-	}
-	return update(crc, castagnoliTable, p)
-}
diff --git a/third_party/gofrontend/libgo/go/hash/crc32/crc32_generic.go b/third_party/gofrontend/libgo/go/hash/crc32/crc32_generic.go
deleted file mode 100644
index 416c1b7..0000000
--- a/third_party/gofrontend/libgo/go/hash/crc32/crc32_generic.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build 386 arm arm64 ppc64 ppc64le
-
-package crc32
-
-// The file contains the generic version of updateCastagnoli which just calls
-// the software implementation.
-
-func updateCastagnoli(crc uint32, p []byte) uint32 {
-	return update(crc, castagnoliTable, p)
-}
diff --git a/third_party/gofrontend/libgo/go/hash/crc32/crc32_test.go b/third_party/gofrontend/libgo/go/hash/crc32/crc32_test.go
deleted file mode 100644
index 1ca3ac2..0000000
--- a/third_party/gofrontend/libgo/go/hash/crc32/crc32_test.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package crc32
-
-import (
-	"io"
-	"testing"
-)
-
-type test struct {
-	ieee, castagnoli uint32
-	in               string
-}
-
-var golden = []test{
-	{0x0, 0x0, ""},
-	{0xe8b7be43, 0xc1d04330, "a"},
-	{0x9e83486d, 0xe2a22936, "ab"},
-	{0x352441c2, 0x364b3fb7, "abc"},
-	{0xed82cd11, 0x92c80a31, "abcd"},
-	{0x8587d865, 0xc450d697, "abcde"},
-	{0x4b8e39ef, 0x53bceff1, "abcdef"},
-	{0x312a6aa6, 0xe627f441, "abcdefg"},
-	{0xaeef2a50, 0xa9421b7, "abcdefgh"},
-	{0x8da988af, 0x2ddc99fc, "abcdefghi"},
-	{0x3981703a, 0xe6599437, "abcdefghij"},
-	{0x6b9cdfe7, 0xb2cc01fe, "Discard medicine more than two years old."},
-	{0xc90ef73f, 0xe28207f, "He who has a shady past knows that nice guys finish last."},
-	{0xb902341f, 0xbe93f964, "I wouldn't marry him with a ten foot pole."},
-	{0x42080e8, 0x9e3be0c3, "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave"},
-	{0x154c6d11, 0xf505ef04, "The days of the digital watch are numbered.  -Tom Stoppard"},
-	{0x4c418325, 0x85d3dc82, "Nepal premier won't resign."},
-	{0x33955150, 0xc5142380, "For every action there is an equal and opposite government program."},
-	{0x26216a4b, 0x75eb77dd, "His money is twice tainted: 'taint yours and 'taint mine."},
-	{0x1abbe45e, 0x91ebe9f7, "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977"},
-	{0xc89a94f7, 0xf0b1168e, "It's a tiny change to the code and not completely disgusting. - Bob Manchek"},
-	{0xab3abe14, 0x572b74e2, "size:  a.out:  bad magic"},
-	{0xbab102b6, 0x8a58a6d5, "The major problem is with sendmail.  -Mark Horton"},
-	{0x999149d7, 0x9c426c50, "Give me a rock, paper and scissors and I will move the world.  CCFestoon"},
-	{0x6d52a33c, 0x735400a4, "If the enemy is within range, then so are you."},
-	{0x90631e8d, 0xbec49c95, "It's well we cannot hear the screams/That we create in others' dreams."},
-	{0x78309130, 0xa95a2079, "You remind me of a TV show, but that's all right: I watch it anyway."},
-	{0x7d0a377f, 0xde2e65c5, "C is as portable as Stonehedge!!"},
-	{0x8c79fd79, 0x297a88ed, "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley"},
-	{0xa20b7167, 0x66ed1d8b, "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction.  Lewis-Randall Rule"},
-	{0x8e0bb443, 0xdcded527, "How can you write a big system without C++?  -Paul Glick"},
-}
-
-func TestGolden(t *testing.T) {
-	castagnoliTab := MakeTable(Castagnoli)
-
-	for _, g := range golden {
-		ieee := NewIEEE()
-		io.WriteString(ieee, g.in)
-		s := ieee.Sum32()
-		if s != g.ieee {
-			t.Errorf("IEEE(%s) = 0x%x want 0x%x", g.in, s, g.ieee)
-		}
-
-		castagnoli := New(castagnoliTab)
-		io.WriteString(castagnoli, g.in)
-		s = castagnoli.Sum32()
-		if s != g.castagnoli {
-			t.Errorf("Castagnoli(%s) = 0x%x want 0x%x", g.in, s, g.castagnoli)
-		}
-
-		if len(g.in) > 0 {
-			// The SSE4.2 implementation of this has code to deal
-			// with misaligned data so we ensure that we test that
-			// too.
-			castagnoli = New(castagnoliTab)
-			io.WriteString(castagnoli, g.in[:1])
-			io.WriteString(castagnoli, g.in[1:])
-			s = castagnoli.Sum32()
-			if s != g.castagnoli {
-				t.Errorf("Castagnoli[misaligned](%s) = 0x%x want 0x%x", g.in, s, g.castagnoli)
-			}
-		}
-	}
-}
-
-func BenchmarkIEEECrc1KB(b *testing.B) {
-	b.SetBytes(1024)
-	data := make([]byte, 1024)
-	for i := range data {
-		data[i] = byte(i)
-	}
-	h := NewIEEE()
-	in := make([]byte, 0, h.Size())
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		h.Reset()
-		h.Write(data)
-		h.Sum(in)
-	}
-}
-
-func BenchmarkIEEECrc4KB(b *testing.B) {
-	b.SetBytes(4096)
-	data := make([]byte, 4096)
-	for i := range data {
-		data[i] = byte(i)
-	}
-	h := NewIEEE()
-	in := make([]byte, 0, h.Size())
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		h.Reset()
-		h.Write(data)
-		h.Sum(in)
-	}
-}
-
-func BenchmarkCastagnoliCrc1KB(b *testing.B) {
-	b.SetBytes(1024)
-	data := make([]byte, 1024)
-	for i := range data {
-		data[i] = byte(i)
-	}
-	h := New(MakeTable(Castagnoli))
-	in := make([]byte, 0, h.Size())
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		h.Reset()
-		h.Write(data)
-		h.Sum(in)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/hash/crc32/example_test.go b/third_party/gofrontend/libgo/go/hash/crc32/example_test.go
deleted file mode 100644
index a1d9e16..0000000
--- a/third_party/gofrontend/libgo/go/hash/crc32/example_test.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package crc32_test
-
-import (
-	"fmt"
-	"hash/crc32"
-)
-
-func ExampleMakeTable() {
-	// In this package, the CRC polynomial is represented in reversed notation,
-	// or LSB-first representation.
-	//
-	// LSB-first representation is a hexadecimal number with n bits, in which the
-	// most significant bit represents the coefficient of x⁰ and the least significant
-	// bit represents the coefficient of xⁿ⁻¹ (the coefficient for xⁿ is implicit).
-	//
-	// For example, CRC32-Q, as defined by the following polynomial,
-	//	x³²+ x³¹+ x²⁴+ x²²+ x¹⁶+ x¹⁴+ x⁸+ x⁷+ x⁵+ x³+ x¹+ x⁰
-	// has the reversed notation 0b11010101100000101000001010000001, so the value
-	// that should be passed to MakeTable is 0xD5828281.
-	crc32q := crc32.MakeTable(0xD5828281)
-	fmt.Printf("%08x\n", crc32.Checksum([]byte("Hello world"), crc32q))
-	// Output:
-	// 2964d064
-}
diff --git a/third_party/gofrontend/libgo/go/hash/crc64/crc64.go b/third_party/gofrontend/libgo/go/hash/crc64/crc64.go
deleted file mode 100644
index 6925867..0000000
--- a/third_party/gofrontend/libgo/go/hash/crc64/crc64.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package crc64 implements the 64-bit cyclic redundancy check, or CRC-64,
-// checksum. See http://en.wikipedia.org/wiki/Cyclic_redundancy_check for
-// information.
-package crc64
-
-import "hash"
-
-// The size of a CRC-64 checksum in bytes.
-const Size = 8
-
-// Predefined polynomials.
-const (
-	// The ISO polynomial, defined in ISO 3309 and used in HDLC.
-	ISO = 0xD800000000000000
-
-	// The ECMA polynomial, defined in ECMA 182.
-	ECMA = 0xC96C5795D7870F42
-)
-
-// Table is a 256-word table representing the polynomial for efficient processing.
-type Table [256]uint64
-
-// MakeTable returns the Table constructed from the specified polynomial.
-func MakeTable(poly uint64) *Table {
-	t := new(Table)
-	for i := 0; i < 256; i++ {
-		crc := uint64(i)
-		for j := 0; j < 8; j++ {
-			if crc&1 == 1 {
-				crc = (crc >> 1) ^ poly
-			} else {
-				crc >>= 1
-			}
-		}
-		t[i] = crc
-	}
-	return t
-}
-
-// digest represents the partial evaluation of a checksum.
-type digest struct {
-	crc uint64
-	tab *Table
-}
-
-// New creates a new hash.Hash64 computing the CRC-64 checksum
-// using the polynomial represented by the Table.
-func New(tab *Table) hash.Hash64 { return &digest{0, tab} }
-
-func (d *digest) Size() int { return Size }
-
-func (d *digest) BlockSize() int { return 1 }
-
-func (d *digest) Reset() { d.crc = 0 }
-
-func update(crc uint64, tab *Table, p []byte) uint64 {
-	crc = ^crc
-	for _, v := range p {
-		crc = tab[byte(crc)^v] ^ (crc >> 8)
-	}
-	return ^crc
-}
-
-// Update returns the result of adding the bytes in p to the crc.
-func Update(crc uint64, tab *Table, p []byte) uint64 {
-	return update(crc, tab, p)
-}
-
-func (d *digest) Write(p []byte) (n int, err error) {
-	d.crc = update(d.crc, d.tab, p)
-	return len(p), nil
-}
-
-func (d *digest) Sum64() uint64 { return d.crc }
-
-func (d *digest) Sum(in []byte) []byte {
-	s := d.Sum64()
-	return append(in, byte(s>>56), byte(s>>48), byte(s>>40), byte(s>>32), byte(s>>24), byte(s>>16), byte(s>>8), byte(s))
-}
-
-// Checksum returns the CRC-64 checksum of data
-// using the polynomial represented by the Table.
-func Checksum(data []byte, tab *Table) uint64 { return update(0, tab, data) }
diff --git a/third_party/gofrontend/libgo/go/hash/crc64/crc64_test.go b/third_party/gofrontend/libgo/go/hash/crc64/crc64_test.go
deleted file mode 100644
index 81a87b5..0000000
--- a/third_party/gofrontend/libgo/go/hash/crc64/crc64_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package crc64
-
-import (
-	"io"
-	"testing"
-)
-
-type test struct {
-	out uint64
-	in  string
-}
-
-var golden = []test{
-	{0x0, ""},
-	{0x3420000000000000, "a"},
-	{0x36c4200000000000, "ab"},
-	{0x3776c42000000000, "abc"},
-	{0x336776c420000000, "abcd"},
-	{0x32d36776c4200000, "abcde"},
-	{0x3002d36776c42000, "abcdef"},
-	{0x31b002d36776c420, "abcdefg"},
-	{0xe21b002d36776c4, "abcdefgh"},
-	{0x8b6e21b002d36776, "abcdefghi"},
-	{0x7f5b6e21b002d367, "abcdefghij"},
-	{0x8ec0e7c835bf9cdf, "Discard medicine more than two years old."},
-	{0xc7db1759e2be5ab4, "He who has a shady past knows that nice guys finish last."},
-	{0xfbf9d9603a6fa020, "I wouldn't marry him with a ten foot pole."},
-	{0xeafc4211a6daa0ef, "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave"},
-	{0x3e05b21c7a4dc4da, "The days of the digital watch are numbered.  -Tom Stoppard"},
-	{0x5255866ad6ef28a6, "Nepal premier won't resign."},
-	{0x8a79895be1e9c361, "For every action there is an equal and opposite government program."},
-	{0x8878963a649d4916, "His money is twice tainted: 'taint yours and 'taint mine."},
-	{0xa7b9d53ea87eb82f, "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977"},
-	{0xdb6805c0966a2f9c, "It's a tiny change to the code and not completely disgusting. - Bob Manchek"},
-	{0xf3553c65dacdadd2, "size:  a.out:  bad magic"},
-	{0x9d5e034087a676b9, "The major problem is with sendmail.  -Mark Horton"},
-	{0xa6db2d7f8da96417, "Give me a rock, paper and scissors and I will move the world.  CCFestoon"},
-	{0x325e00cd2fe819f9, "If the enemy is within range, then so are you."},
-	{0x88c6600ce58ae4c6, "It's well we cannot hear the screams/That we create in others' dreams."},
-	{0x28c4a3f3b769e078, "You remind me of a TV show, but that's all right: I watch it anyway."},
-	{0xa698a34c9d9f1dca, "C is as portable as Stonehedge!!"},
-	{0xf6c1e2a8c26c5cfc, "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley"},
-	{0xd402559dfe9b70c, "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction.  Lewis-Randall Rule"},
-	{0xdb6efff26aa94946, "How can you write a big system without C++?  -Paul Glick"},
-}
-
-var tab = MakeTable(ISO)
-
-func TestGolden(t *testing.T) {
-	for i := 0; i < len(golden); i++ {
-		g := golden[i]
-		c := New(tab)
-		io.WriteString(c, g.in)
-		s := c.Sum64()
-		if s != g.out {
-			t.Errorf("crc64(%s) = 0x%x want 0x%x", g.in, s, g.out)
-			t.FailNow()
-		}
-	}
-}
-
-func BenchmarkCrc64KB(b *testing.B) {
-	b.SetBytes(1024)
-	data := make([]byte, 1024)
-	for i := range data {
-		data[i] = byte(i)
-	}
-	h := New(tab)
-	in := make([]byte, 0, h.Size())
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		h.Reset()
-		h.Write(data)
-		h.Sum(in)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/hash/fnv/fnv.go b/third_party/gofrontend/libgo/go/hash/fnv/fnv.go
deleted file mode 100644
index c020661..0000000
--- a/third_party/gofrontend/libgo/go/hash/fnv/fnv.go
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package fnv implements FNV-1 and FNV-1a, non-cryptographic hash functions
-// created by Glenn Fowler, Landon Curt Noll, and Phong Vo.
-// See
-// http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function.
-package fnv
-
-import (
-	"hash"
-)
-
-type (
-	sum32  uint32
-	sum32a uint32
-	sum64  uint64
-	sum64a uint64
-)
-
-const (
-	offset32 = 2166136261
-	offset64 = 14695981039346656037
-	prime32  = 16777619
-	prime64  = 1099511628211
-)
-
-// New32 returns a new 32-bit FNV-1 hash.Hash.
-func New32() hash.Hash32 {
-	var s sum32 = offset32
-	return &s
-}
-
-// New32a returns a new 32-bit FNV-1a hash.Hash.
-func New32a() hash.Hash32 {
-	var s sum32a = offset32
-	return &s
-}
-
-// New64 returns a new 64-bit FNV-1 hash.Hash.
-func New64() hash.Hash64 {
-	var s sum64 = offset64
-	return &s
-}
-
-// New64a returns a new 64-bit FNV-1a hash.Hash.
-func New64a() hash.Hash64 {
-	var s sum64a = offset64
-	return &s
-}
-
-func (s *sum32) Reset()  { *s = offset32 }
-func (s *sum32a) Reset() { *s = offset32 }
-func (s *sum64) Reset()  { *s = offset64 }
-func (s *sum64a) Reset() { *s = offset64 }
-
-func (s *sum32) Sum32() uint32  { return uint32(*s) }
-func (s *sum32a) Sum32() uint32 { return uint32(*s) }
-func (s *sum64) Sum64() uint64  { return uint64(*s) }
-func (s *sum64a) Sum64() uint64 { return uint64(*s) }
-
-func (s *sum32) Write(data []byte) (int, error) {
-	hash := *s
-	for _, c := range data {
-		hash *= prime32
-		hash ^= sum32(c)
-	}
-	*s = hash
-	return len(data), nil
-}
-
-func (s *sum32a) Write(data []byte) (int, error) {
-	hash := *s
-	for _, c := range data {
-		hash ^= sum32a(c)
-		hash *= prime32
-	}
-	*s = hash
-	return len(data), nil
-}
-
-func (s *sum64) Write(data []byte) (int, error) {
-	hash := *s
-	for _, c := range data {
-		hash *= prime64
-		hash ^= sum64(c)
-	}
-	*s = hash
-	return len(data), nil
-}
-
-func (s *sum64a) Write(data []byte) (int, error) {
-	hash := *s
-	for _, c := range data {
-		hash ^= sum64a(c)
-		hash *= prime64
-	}
-	*s = hash
-	return len(data), nil
-}
-
-func (s *sum32) Size() int  { return 4 }
-func (s *sum32a) Size() int { return 4 }
-func (s *sum64) Size() int  { return 8 }
-func (s *sum64a) Size() int { return 8 }
-
-func (s *sum32) BlockSize() int  { return 1 }
-func (s *sum32a) BlockSize() int { return 1 }
-func (s *sum64) BlockSize() int  { return 1 }
-func (s *sum64a) BlockSize() int { return 1 }
-
-func (s *sum32) Sum(in []byte) []byte {
-	v := uint32(*s)
-	return append(in, byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
-}
-
-func (s *sum32a) Sum(in []byte) []byte {
-	v := uint32(*s)
-	return append(in, byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
-}
-
-func (s *sum64) Sum(in []byte) []byte {
-	v := uint64(*s)
-	return append(in, byte(v>>56), byte(v>>48), byte(v>>40), byte(v>>32), byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
-}
-
-func (s *sum64a) Sum(in []byte) []byte {
-	v := uint64(*s)
-	return append(in, byte(v>>56), byte(v>>48), byte(v>>40), byte(v>>32), byte(v>>24), byte(v>>16), byte(v>>8), byte(v))
-}
diff --git a/third_party/gofrontend/libgo/go/hash/fnv/fnv_test.go b/third_party/gofrontend/libgo/go/hash/fnv/fnv_test.go
deleted file mode 100644
index 89d39b3..0000000
--- a/third_party/gofrontend/libgo/go/hash/fnv/fnv_test.go
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package fnv
-
-import (
-	"bytes"
-	"encoding/binary"
-	"hash"
-	"testing"
-)
-
-type golden struct {
-	sum  []byte
-	text string
-}
-
-var golden32 = []golden{
-	{[]byte{0x81, 0x1c, 0x9d, 0xc5}, ""},
-	{[]byte{0x05, 0x0c, 0x5d, 0x7e}, "a"},
-	{[]byte{0x70, 0x77, 0x2d, 0x38}, "ab"},
-	{[]byte{0x43, 0x9c, 0x2f, 0x4b}, "abc"},
-}
-
-var golden32a = []golden{
-	{[]byte{0x81, 0x1c, 0x9d, 0xc5}, ""},
-	{[]byte{0xe4, 0x0c, 0x29, 0x2c}, "a"},
-	{[]byte{0x4d, 0x25, 0x05, 0xca}, "ab"},
-	{[]byte{0x1a, 0x47, 0xe9, 0x0b}, "abc"},
-}
-
-var golden64 = []golden{
-	{[]byte{0xcb, 0xf2, 0x9c, 0xe4, 0x84, 0x22, 0x23, 0x25}, ""},
-	{[]byte{0xaf, 0x63, 0xbd, 0x4c, 0x86, 0x01, 0xb7, 0xbe}, "a"},
-	{[]byte{0x08, 0x32, 0x67, 0x07, 0xb4, 0xeb, 0x37, 0xb8}, "ab"},
-	{[]byte{0xd8, 0xdc, 0xca, 0x18, 0x6b, 0xaf, 0xad, 0xcb}, "abc"},
-}
-
-var golden64a = []golden{
-	{[]byte{0xcb, 0xf2, 0x9c, 0xe4, 0x84, 0x22, 0x23, 0x25}, ""},
-	{[]byte{0xaf, 0x63, 0xdc, 0x4c, 0x86, 0x01, 0xec, 0x8c}, "a"},
-	{[]byte{0x08, 0x9c, 0x44, 0x07, 0xb5, 0x45, 0x98, 0x6a}, "ab"},
-	{[]byte{0xe7, 0x1f, 0xa2, 0x19, 0x05, 0x41, 0x57, 0x4b}, "abc"},
-}
-
-func TestGolden32(t *testing.T) {
-	testGolden(t, New32(), golden32)
-}
-
-func TestGolden32a(t *testing.T) {
-	testGolden(t, New32a(), golden32a)
-}
-
-func TestGolden64(t *testing.T) {
-	testGolden(t, New64(), golden64)
-}
-
-func TestGolden64a(t *testing.T) {
-	testGolden(t, New64a(), golden64a)
-}
-
-func testGolden(t *testing.T, hash hash.Hash, gold []golden) {
-	for _, g := range gold {
-		hash.Reset()
-		done, error := hash.Write([]byte(g.text))
-		if error != nil {
-			t.Fatalf("write error: %s", error)
-		}
-		if done != len(g.text) {
-			t.Fatalf("wrote only %d out of %d bytes", done, len(g.text))
-		}
-		if actual := hash.Sum(nil); !bytes.Equal(g.sum, actual) {
-			t.Errorf("hash(%q) = 0x%x want 0x%x", g.text, actual, g.sum)
-		}
-	}
-}
-
-func TestIntegrity32(t *testing.T) {
-	testIntegrity(t, New32())
-}
-
-func TestIntegrity32a(t *testing.T) {
-	testIntegrity(t, New32a())
-}
-
-func TestIntegrity64(t *testing.T) {
-	testIntegrity(t, New64())
-}
-
-func TestIntegrity64a(t *testing.T) {
-	testIntegrity(t, New64a())
-}
-
-func testIntegrity(t *testing.T, h hash.Hash) {
-	data := []byte{'1', '2', 3, 4, 5}
-	h.Write(data)
-	sum := h.Sum(nil)
-
-	if size := h.Size(); size != len(sum) {
-		t.Fatalf("Size()=%d but len(Sum())=%d", size, len(sum))
-	}
-
-	if a := h.Sum(nil); !bytes.Equal(sum, a) {
-		t.Fatalf("first Sum()=0x%x, second Sum()=0x%x", sum, a)
-	}
-
-	h.Reset()
-	h.Write(data)
-	if a := h.Sum(nil); !bytes.Equal(sum, a) {
-		t.Fatalf("Sum()=0x%x, but after Reset() Sum()=0x%x", sum, a)
-	}
-
-	h.Reset()
-	h.Write(data[:2])
-	h.Write(data[2:])
-	if a := h.Sum(nil); !bytes.Equal(sum, a) {
-		t.Fatalf("Sum()=0x%x, but with partial writes, Sum()=0x%x", sum, a)
-	}
-
-	switch h.Size() {
-	case 4:
-		sum32 := h.(hash.Hash32).Sum32()
-		if sum32 != binary.BigEndian.Uint32(sum) {
-			t.Fatalf("Sum()=0x%x, but Sum32()=0x%x", sum, sum32)
-		}
-	case 8:
-		sum64 := h.(hash.Hash64).Sum64()
-		if sum64 != binary.BigEndian.Uint64(sum) {
-			t.Fatalf("Sum()=0x%x, but Sum64()=0x%x", sum, sum64)
-		}
-	}
-}
-
-func BenchmarkFnv32KB(b *testing.B) {
-	benchmarkKB(b, New32())
-}
-
-func BenchmarkFnv32aKB(b *testing.B) {
-	benchmarkKB(b, New32a())
-}
-
-func BenchmarkFnv64KB(b *testing.B) {
-	benchmarkKB(b, New64())
-}
-
-func BenchmarkFnv64aKB(b *testing.B) {
-	benchmarkKB(b, New64a())
-}
-
-func benchmarkKB(b *testing.B, h hash.Hash) {
-	b.SetBytes(1024)
-	data := make([]byte, 1024)
-	for i := range data {
-		data[i] = byte(i)
-	}
-	in := make([]byte, 0, h.Size())
-
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		h.Reset()
-		h.Write(data)
-		h.Sum(in)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/hash/hash.go b/third_party/gofrontend/libgo/go/hash/hash.go
deleted file mode 100644
index 8d138d0..0000000
--- a/third_party/gofrontend/libgo/go/hash/hash.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package hash provides interfaces for hash functions.
-package hash
-
-import "io"
-
-// Hash is the common interface implemented by all hash functions.
-type Hash interface {
-	// Write (via the embedded io.Writer interface) adds more data to the running hash.
-	// It never returns an error.
-	io.Writer
-
-	// Sum appends the current hash to b and returns the resulting slice.
-	// It does not change the underlying hash state.
-	Sum(b []byte) []byte
-
-	// Reset resets the Hash to its initial state.
-	Reset()
-
-	// Size returns the number of bytes Sum will return.
-	Size() int
-
-	// BlockSize returns the hash's underlying block size.
-	// The Write method must be able to accept any amount
-	// of data, but it may operate more efficiently if all writes
-	// are a multiple of the block size.
-	BlockSize() int
-}
-
-// Hash32 is the common interface implemented by all 32-bit hash functions.
-type Hash32 interface {
-	Hash
-	Sum32() uint32
-}
-
-// Hash64 is the common interface implemented by all 64-bit hash functions.
-type Hash64 interface {
-	Hash
-	Sum64() uint64
-}
diff --git a/third_party/gofrontend/libgo/go/html/entity.go b/third_party/gofrontend/libgo/go/html/entity.go
deleted file mode 100644
index af8a007..0000000
--- a/third_party/gofrontend/libgo/go/html/entity.go
+++ /dev/null
@@ -1,2253 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package html
-
-// All entities that do not end with ';' are 6 or fewer bytes long.
-const longestEntityWithoutSemicolon = 6
-
-// entity is a map from HTML entity names to their values. The semicolon matters:
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html
-// lists both "amp" and "amp;" as two separate entries.
-//
-// Note that the HTML5 list is larger than the HTML4 list at
-// http://www.w3.org/TR/html4/sgml/entities.html
-var entity = map[string]rune{
-	"AElig;":                           '\U000000C6',
-	"AMP;":                             '\U00000026',
-	"Aacute;":                          '\U000000C1',
-	"Abreve;":                          '\U00000102',
-	"Acirc;":                           '\U000000C2',
-	"Acy;":                             '\U00000410',
-	"Afr;":                             '\U0001D504',
-	"Agrave;":                          '\U000000C0',
-	"Alpha;":                           '\U00000391',
-	"Amacr;":                           '\U00000100',
-	"And;":                             '\U00002A53',
-	"Aogon;":                           '\U00000104',
-	"Aopf;":                            '\U0001D538',
-	"ApplyFunction;":                   '\U00002061',
-	"Aring;":                           '\U000000C5',
-	"Ascr;":                            '\U0001D49C',
-	"Assign;":                          '\U00002254',
-	"Atilde;":                          '\U000000C3',
-	"Auml;":                            '\U000000C4',
-	"Backslash;":                       '\U00002216',
-	"Barv;":                            '\U00002AE7',
-	"Barwed;":                          '\U00002306',
-	"Bcy;":                             '\U00000411',
-	"Because;":                         '\U00002235',
-	"Bernoullis;":                      '\U0000212C',
-	"Beta;":                            '\U00000392',
-	"Bfr;":                             '\U0001D505',
-	"Bopf;":                            '\U0001D539',
-	"Breve;":                           '\U000002D8',
-	"Bscr;":                            '\U0000212C',
-	"Bumpeq;":                          '\U0000224E',
-	"CHcy;":                            '\U00000427',
-	"COPY;":                            '\U000000A9',
-	"Cacute;":                          '\U00000106',
-	"Cap;":                             '\U000022D2',
-	"CapitalDifferentialD;":            '\U00002145',
-	"Cayleys;":                         '\U0000212D',
-	"Ccaron;":                          '\U0000010C',
-	"Ccedil;":                          '\U000000C7',
-	"Ccirc;":                           '\U00000108',
-	"Cconint;":                         '\U00002230',
-	"Cdot;":                            '\U0000010A',
-	"Cedilla;":                         '\U000000B8',
-	"CenterDot;":                       '\U000000B7',
-	"Cfr;":                             '\U0000212D',
-	"Chi;":                             '\U000003A7',
-	"CircleDot;":                       '\U00002299',
-	"CircleMinus;":                     '\U00002296',
-	"CirclePlus;":                      '\U00002295',
-	"CircleTimes;":                     '\U00002297',
-	"ClockwiseContourIntegral;":        '\U00002232',
-	"CloseCurlyDoubleQuote;":           '\U0000201D',
-	"CloseCurlyQuote;":                 '\U00002019',
-	"Colon;":                           '\U00002237',
-	"Colone;":                          '\U00002A74',
-	"Congruent;":                       '\U00002261',
-	"Conint;":                          '\U0000222F',
-	"ContourIntegral;":                 '\U0000222E',
-	"Copf;":                            '\U00002102',
-	"Coproduct;":                       '\U00002210',
-	"CounterClockwiseContourIntegral;": '\U00002233',
-	"Cross;":                    '\U00002A2F',
-	"Cscr;":                     '\U0001D49E',
-	"Cup;":                      '\U000022D3',
-	"CupCap;":                   '\U0000224D',
-	"DD;":                       '\U00002145',
-	"DDotrahd;":                 '\U00002911',
-	"DJcy;":                     '\U00000402',
-	"DScy;":                     '\U00000405',
-	"DZcy;":                     '\U0000040F',
-	"Dagger;":                   '\U00002021',
-	"Darr;":                     '\U000021A1',
-	"Dashv;":                    '\U00002AE4',
-	"Dcaron;":                   '\U0000010E',
-	"Dcy;":                      '\U00000414',
-	"Del;":                      '\U00002207',
-	"Delta;":                    '\U00000394',
-	"Dfr;":                      '\U0001D507',
-	"DiacriticalAcute;":         '\U000000B4',
-	"DiacriticalDot;":           '\U000002D9',
-	"DiacriticalDoubleAcute;":   '\U000002DD',
-	"DiacriticalGrave;":         '\U00000060',
-	"DiacriticalTilde;":         '\U000002DC',
-	"Diamond;":                  '\U000022C4',
-	"DifferentialD;":            '\U00002146',
-	"Dopf;":                     '\U0001D53B',
-	"Dot;":                      '\U000000A8',
-	"DotDot;":                   '\U000020DC',
-	"DotEqual;":                 '\U00002250',
-	"DoubleContourIntegral;":    '\U0000222F',
-	"DoubleDot;":                '\U000000A8',
-	"DoubleDownArrow;":          '\U000021D3',
-	"DoubleLeftArrow;":          '\U000021D0',
-	"DoubleLeftRightArrow;":     '\U000021D4',
-	"DoubleLeftTee;":            '\U00002AE4',
-	"DoubleLongLeftArrow;":      '\U000027F8',
-	"DoubleLongLeftRightArrow;": '\U000027FA',
-	"DoubleLongRightArrow;":     '\U000027F9',
-	"DoubleRightArrow;":         '\U000021D2',
-	"DoubleRightTee;":           '\U000022A8',
-	"DoubleUpArrow;":            '\U000021D1',
-	"DoubleUpDownArrow;":        '\U000021D5',
-	"DoubleVerticalBar;":        '\U00002225',
-	"DownArrow;":                '\U00002193',
-	"DownArrowBar;":             '\U00002913',
-	"DownArrowUpArrow;":         '\U000021F5',
-	"DownBreve;":                '\U00000311',
-	"DownLeftRightVector;":      '\U00002950',
-	"DownLeftTeeVector;":        '\U0000295E',
-	"DownLeftVector;":           '\U000021BD',
-	"DownLeftVectorBar;":        '\U00002956',
-	"DownRightTeeVector;":       '\U0000295F',
-	"DownRightVector;":          '\U000021C1',
-	"DownRightVectorBar;":       '\U00002957',
-	"DownTee;":                  '\U000022A4',
-	"DownTeeArrow;":             '\U000021A7',
-	"Downarrow;":                '\U000021D3',
-	"Dscr;":                     '\U0001D49F',
-	"Dstrok;":                   '\U00000110',
-	"ENG;":                      '\U0000014A',
-	"ETH;":                      '\U000000D0',
-	"Eacute;":                   '\U000000C9',
-	"Ecaron;":                   '\U0000011A',
-	"Ecirc;":                    '\U000000CA',
-	"Ecy;":                      '\U0000042D',
-	"Edot;":                     '\U00000116',
-	"Efr;":                      '\U0001D508',
-	"Egrave;":                   '\U000000C8',
-	"Element;":                  '\U00002208',
-	"Emacr;":                    '\U00000112',
-	"EmptySmallSquare;":         '\U000025FB',
-	"EmptyVerySmallSquare;":     '\U000025AB',
-	"Eogon;":                    '\U00000118',
-	"Eopf;":                     '\U0001D53C',
-	"Epsilon;":                  '\U00000395',
-	"Equal;":                    '\U00002A75',
-	"EqualTilde;":               '\U00002242',
-	"Equilibrium;":              '\U000021CC',
-	"Escr;":                     '\U00002130',
-	"Esim;":                     '\U00002A73',
-	"Eta;":                      '\U00000397',
-	"Euml;":                     '\U000000CB',
-	"Exists;":                   '\U00002203',
-	"ExponentialE;":             '\U00002147',
-	"Fcy;":                      '\U00000424',
-	"Ffr;":                      '\U0001D509',
-	"FilledSmallSquare;":        '\U000025FC',
-	"FilledVerySmallSquare;":    '\U000025AA',
-	"Fopf;":                     '\U0001D53D',
-	"ForAll;":                   '\U00002200',
-	"Fouriertrf;":               '\U00002131',
-	"Fscr;":                     '\U00002131',
-	"GJcy;":                     '\U00000403',
-	"GT;":                       '\U0000003E',
-	"Gamma;":                    '\U00000393',
-	"Gammad;":                   '\U000003DC',
-	"Gbreve;":                   '\U0000011E',
-	"Gcedil;":                   '\U00000122',
-	"Gcirc;":                    '\U0000011C',
-	"Gcy;":                      '\U00000413',
-	"Gdot;":                     '\U00000120',
-	"Gfr;":                      '\U0001D50A',
-	"Gg;":                       '\U000022D9',
-	"Gopf;":                     '\U0001D53E',
-	"GreaterEqual;":             '\U00002265',
-	"GreaterEqualLess;":         '\U000022DB',
-	"GreaterFullEqual;":         '\U00002267',
-	"GreaterGreater;":           '\U00002AA2',
-	"GreaterLess;":              '\U00002277',
-	"GreaterSlantEqual;":        '\U00002A7E',
-	"GreaterTilde;":             '\U00002273',
-	"Gscr;":                     '\U0001D4A2',
-	"Gt;":                       '\U0000226B',
-	"HARDcy;":                   '\U0000042A',
-	"Hacek;":                    '\U000002C7',
-	"Hat;":                      '\U0000005E',
-	"Hcirc;":                    '\U00000124',
-	"Hfr;":                      '\U0000210C',
-	"HilbertSpace;":             '\U0000210B',
-	"Hopf;":                     '\U0000210D',
-	"HorizontalLine;":           '\U00002500',
-	"Hscr;":                     '\U0000210B',
-	"Hstrok;":                   '\U00000126',
-	"HumpDownHump;":             '\U0000224E',
-	"HumpEqual;":                '\U0000224F',
-	"IEcy;":                     '\U00000415',
-	"IJlig;":                    '\U00000132',
-	"IOcy;":                     '\U00000401',
-	"Iacute;":                   '\U000000CD',
-	"Icirc;":                    '\U000000CE',
-	"Icy;":                      '\U00000418',
-	"Idot;":                     '\U00000130',
-	"Ifr;":                      '\U00002111',
-	"Igrave;":                   '\U000000CC',
-	"Im;":                       '\U00002111',
-	"Imacr;":                    '\U0000012A',
-	"ImaginaryI;":               '\U00002148',
-	"Implies;":                  '\U000021D2',
-	"Int;":                      '\U0000222C',
-	"Integral;":                 '\U0000222B',
-	"Intersection;":             '\U000022C2',
-	"InvisibleComma;":           '\U00002063',
-	"InvisibleTimes;":           '\U00002062',
-	"Iogon;":                    '\U0000012E',
-	"Iopf;":                     '\U0001D540',
-	"Iota;":                     '\U00000399',
-	"Iscr;":                     '\U00002110',
-	"Itilde;":                   '\U00000128',
-	"Iukcy;":                    '\U00000406',
-	"Iuml;":                     '\U000000CF',
-	"Jcirc;":                    '\U00000134',
-	"Jcy;":                      '\U00000419',
-	"Jfr;":                      '\U0001D50D',
-	"Jopf;":                     '\U0001D541',
-	"Jscr;":                     '\U0001D4A5',
-	"Jsercy;":                   '\U00000408',
-	"Jukcy;":                    '\U00000404',
-	"KHcy;":                     '\U00000425',
-	"KJcy;":                     '\U0000040C',
-	"Kappa;":                    '\U0000039A',
-	"Kcedil;":                   '\U00000136',
-	"Kcy;":                      '\U0000041A',
-	"Kfr;":                      '\U0001D50E',
-	"Kopf;":                     '\U0001D542',
-	"Kscr;":                     '\U0001D4A6',
-	"LJcy;":                     '\U00000409',
-	"LT;":                       '\U0000003C',
-	"Lacute;":                   '\U00000139',
-	"Lambda;":                   '\U0000039B',
-	"Lang;":                     '\U000027EA',
-	"Laplacetrf;":               '\U00002112',
-	"Larr;":                     '\U0000219E',
-	"Lcaron;":                   '\U0000013D',
-	"Lcedil;":                   '\U0000013B',
-	"Lcy;":                      '\U0000041B',
-	"LeftAngleBracket;":         '\U000027E8',
-	"LeftArrow;":                '\U00002190',
-	"LeftArrowBar;":             '\U000021E4',
-	"LeftArrowRightArrow;":      '\U000021C6',
-	"LeftCeiling;":              '\U00002308',
-	"LeftDoubleBracket;":        '\U000027E6',
-	"LeftDownTeeVector;":        '\U00002961',
-	"LeftDownVector;":           '\U000021C3',
-	"LeftDownVectorBar;":        '\U00002959',
-	"LeftFloor;":                '\U0000230A',
-	"LeftRightArrow;":           '\U00002194',
-	"LeftRightVector;":          '\U0000294E',
-	"LeftTee;":                  '\U000022A3',
-	"LeftTeeArrow;":             '\U000021A4',
-	"LeftTeeVector;":            '\U0000295A',
-	"LeftTriangle;":             '\U000022B2',
-	"LeftTriangleBar;":          '\U000029CF',
-	"LeftTriangleEqual;":        '\U000022B4',
-	"LeftUpDownVector;":         '\U00002951',
-	"LeftUpTeeVector;":          '\U00002960',
-	"LeftUpVector;":             '\U000021BF',
-	"LeftUpVectorBar;":          '\U00002958',
-	"LeftVector;":               '\U000021BC',
-	"LeftVectorBar;":            '\U00002952',
-	"Leftarrow;":                '\U000021D0',
-	"Leftrightarrow;":           '\U000021D4',
-	"LessEqualGreater;":         '\U000022DA',
-	"LessFullEqual;":            '\U00002266',
-	"LessGreater;":              '\U00002276',
-	"LessLess;":                 '\U00002AA1',
-	"LessSlantEqual;":           '\U00002A7D',
-	"LessTilde;":                '\U00002272',
-	"Lfr;":                      '\U0001D50F',
-	"Ll;":                       '\U000022D8',
-	"Lleftarrow;":               '\U000021DA',
-	"Lmidot;":                   '\U0000013F',
-	"LongLeftArrow;":            '\U000027F5',
-	"LongLeftRightArrow;":       '\U000027F7',
-	"LongRightArrow;":           '\U000027F6',
-	"Longleftarrow;":            '\U000027F8',
-	"Longleftrightarrow;":       '\U000027FA',
-	"Longrightarrow;":           '\U000027F9',
-	"Lopf;":                     '\U0001D543',
-	"LowerLeftArrow;":           '\U00002199',
-	"LowerRightArrow;":          '\U00002198',
-	"Lscr;":                     '\U00002112',
-	"Lsh;":                      '\U000021B0',
-	"Lstrok;":                   '\U00000141',
-	"Lt;":                       '\U0000226A',
-	"Map;":                      '\U00002905',
-	"Mcy;":                      '\U0000041C',
-	"MediumSpace;":              '\U0000205F',
-	"Mellintrf;":                '\U00002133',
-	"Mfr;":                      '\U0001D510',
-	"MinusPlus;":                '\U00002213',
-	"Mopf;":                     '\U0001D544',
-	"Mscr;":                     '\U00002133',
-	"Mu;":                       '\U0000039C',
-	"NJcy;":                     '\U0000040A',
-	"Nacute;":                   '\U00000143',
-	"Ncaron;":                   '\U00000147',
-	"Ncedil;":                   '\U00000145',
-	"Ncy;":                      '\U0000041D',
-	"NegativeMediumSpace;":      '\U0000200B',
-	"NegativeThickSpace;":       '\U0000200B',
-	"NegativeThinSpace;":        '\U0000200B',
-	"NegativeVeryThinSpace;":    '\U0000200B',
-	"NestedGreaterGreater;":     '\U0000226B',
-	"NestedLessLess;":           '\U0000226A',
-	"NewLine;":                  '\U0000000A',
-	"Nfr;":                      '\U0001D511',
-	"NoBreak;":                  '\U00002060',
-	"NonBreakingSpace;":         '\U000000A0',
-	"Nopf;":                     '\U00002115',
-	"Not;":                      '\U00002AEC',
-	"NotCongruent;":             '\U00002262',
-	"NotCupCap;":                '\U0000226D',
-	"NotDoubleVerticalBar;":     '\U00002226',
-	"NotElement;":               '\U00002209',
-	"NotEqual;":                 '\U00002260',
-	"NotExists;":                '\U00002204',
-	"NotGreater;":               '\U0000226F',
-	"NotGreaterEqual;":          '\U00002271',
-	"NotGreaterLess;":           '\U00002279',
-	"NotGreaterTilde;":          '\U00002275',
-	"NotLeftTriangle;":          '\U000022EA',
-	"NotLeftTriangleEqual;":     '\U000022EC',
-	"NotLess;":                  '\U0000226E',
-	"NotLessEqual;":             '\U00002270',
-	"NotLessGreater;":           '\U00002278',
-	"NotLessTilde;":             '\U00002274',
-	"NotPrecedes;":              '\U00002280',
-	"NotPrecedesSlantEqual;":    '\U000022E0',
-	"NotReverseElement;":        '\U0000220C',
-	"NotRightTriangle;":         '\U000022EB',
-	"NotRightTriangleEqual;":    '\U000022ED',
-	"NotSquareSubsetEqual;":     '\U000022E2',
-	"NotSquareSupersetEqual;":   '\U000022E3',
-	"NotSubsetEqual;":           '\U00002288',
-	"NotSucceeds;":              '\U00002281',
-	"NotSucceedsSlantEqual;":    '\U000022E1',
-	"NotSupersetEqual;":         '\U00002289',
-	"NotTilde;":                 '\U00002241',
-	"NotTildeEqual;":            '\U00002244',
-	"NotTildeFullEqual;":        '\U00002247',
-	"NotTildeTilde;":            '\U00002249',
-	"NotVerticalBar;":           '\U00002224',
-	"Nscr;":                     '\U0001D4A9',
-	"Ntilde;":                   '\U000000D1',
-	"Nu;":                       '\U0000039D',
-	"OElig;":                    '\U00000152',
-	"Oacute;":                   '\U000000D3',
-	"Ocirc;":                    '\U000000D4',
-	"Ocy;":                      '\U0000041E',
-	"Odblac;":                   '\U00000150',
-	"Ofr;":                      '\U0001D512',
-	"Ograve;":                   '\U000000D2',
-	"Omacr;":                    '\U0000014C',
-	"Omega;":                    '\U000003A9',
-	"Omicron;":                  '\U0000039F',
-	"Oopf;":                     '\U0001D546',
-	"OpenCurlyDoubleQuote;":     '\U0000201C',
-	"OpenCurlyQuote;":           '\U00002018',
-	"Or;":                       '\U00002A54',
-	"Oscr;":                     '\U0001D4AA',
-	"Oslash;":                   '\U000000D8',
-	"Otilde;":                   '\U000000D5',
-	"Otimes;":                   '\U00002A37',
-	"Ouml;":                     '\U000000D6',
-	"OverBar;":                  '\U0000203E',
-	"OverBrace;":                '\U000023DE',
-	"OverBracket;":              '\U000023B4',
-	"OverParenthesis;":          '\U000023DC',
-	"PartialD;":                 '\U00002202',
-	"Pcy;":                      '\U0000041F',
-	"Pfr;":                      '\U0001D513',
-	"Phi;":                      '\U000003A6',
-	"Pi;":                       '\U000003A0',
-	"PlusMinus;":                '\U000000B1',
-	"Poincareplane;":            '\U0000210C',
-	"Popf;":                     '\U00002119',
-	"Pr;":                       '\U00002ABB',
-	"Precedes;":                 '\U0000227A',
-	"PrecedesEqual;":            '\U00002AAF',
-	"PrecedesSlantEqual;":       '\U0000227C',
-	"PrecedesTilde;":            '\U0000227E',
-	"Prime;":                    '\U00002033',
-	"Product;":                  '\U0000220F',
-	"Proportion;":               '\U00002237',
-	"Proportional;":             '\U0000221D',
-	"Pscr;":                     '\U0001D4AB',
-	"Psi;":                      '\U000003A8',
-	"QUOT;":                     '\U00000022',
-	"Qfr;":                      '\U0001D514',
-	"Qopf;":                     '\U0000211A',
-	"Qscr;":                     '\U0001D4AC',
-	"RBarr;":                    '\U00002910',
-	"REG;":                      '\U000000AE',
-	"Racute;":                   '\U00000154',
-	"Rang;":                     '\U000027EB',
-	"Rarr;":                     '\U000021A0',
-	"Rarrtl;":                   '\U00002916',
-	"Rcaron;":                   '\U00000158',
-	"Rcedil;":                   '\U00000156',
-	"Rcy;":                      '\U00000420',
-	"Re;":                       '\U0000211C',
-	"ReverseElement;":           '\U0000220B',
-	"ReverseEquilibrium;":       '\U000021CB',
-	"ReverseUpEquilibrium;":     '\U0000296F',
-	"Rfr;":                      '\U0000211C',
-	"Rho;":                      '\U000003A1',
-	"RightAngleBracket;":        '\U000027E9',
-	"RightArrow;":               '\U00002192',
-	"RightArrowBar;":            '\U000021E5',
-	"RightArrowLeftArrow;":      '\U000021C4',
-	"RightCeiling;":             '\U00002309',
-	"RightDoubleBracket;":       '\U000027E7',
-	"RightDownTeeVector;":       '\U0000295D',
-	"RightDownVector;":          '\U000021C2',
-	"RightDownVectorBar;":       '\U00002955',
-	"RightFloor;":               '\U0000230B',
-	"RightTee;":                 '\U000022A2',
-	"RightTeeArrow;":            '\U000021A6',
-	"RightTeeVector;":           '\U0000295B',
-	"RightTriangle;":            '\U000022B3',
-	"RightTriangleBar;":         '\U000029D0',
-	"RightTriangleEqual;":       '\U000022B5',
-	"RightUpDownVector;":        '\U0000294F',
-	"RightUpTeeVector;":         '\U0000295C',
-	"RightUpVector;":            '\U000021BE',
-	"RightUpVectorBar;":         '\U00002954',
-	"RightVector;":              '\U000021C0',
-	"RightVectorBar;":           '\U00002953',
-	"Rightarrow;":               '\U000021D2',
-	"Ropf;":                     '\U0000211D',
-	"RoundImplies;":             '\U00002970',
-	"Rrightarrow;":              '\U000021DB',
-	"Rscr;":                     '\U0000211B',
-	"Rsh;":                      '\U000021B1',
-	"RuleDelayed;":              '\U000029F4',
-	"SHCHcy;":                   '\U00000429',
-	"SHcy;":                     '\U00000428',
-	"SOFTcy;":                   '\U0000042C',
-	"Sacute;":                   '\U0000015A',
-	"Sc;":                       '\U00002ABC',
-	"Scaron;":                   '\U00000160',
-	"Scedil;":                   '\U0000015E',
-	"Scirc;":                    '\U0000015C',
-	"Scy;":                      '\U00000421',
-	"Sfr;":                      '\U0001D516',
-	"ShortDownArrow;":           '\U00002193',
-	"ShortLeftArrow;":           '\U00002190',
-	"ShortRightArrow;":          '\U00002192',
-	"ShortUpArrow;":             '\U00002191',
-	"Sigma;":                    '\U000003A3',
-	"SmallCircle;":              '\U00002218',
-	"Sopf;":                     '\U0001D54A',
-	"Sqrt;":                     '\U0000221A',
-	"Square;":                   '\U000025A1',
-	"SquareIntersection;":       '\U00002293',
-	"SquareSubset;":             '\U0000228F',
-	"SquareSubsetEqual;":        '\U00002291',
-	"SquareSuperset;":           '\U00002290',
-	"SquareSupersetEqual;":      '\U00002292',
-	"SquareUnion;":              '\U00002294',
-	"Sscr;":                     '\U0001D4AE',
-	"Star;":                     '\U000022C6',
-	"Sub;":                      '\U000022D0',
-	"Subset;":                   '\U000022D0',
-	"SubsetEqual;":              '\U00002286',
-	"Succeeds;":                 '\U0000227B',
-	"SucceedsEqual;":            '\U00002AB0',
-	"SucceedsSlantEqual;":       '\U0000227D',
-	"SucceedsTilde;":            '\U0000227F',
-	"SuchThat;":                 '\U0000220B',
-	"Sum;":                      '\U00002211',
-	"Sup;":                      '\U000022D1',
-	"Superset;":                 '\U00002283',
-	"SupersetEqual;":            '\U00002287',
-	"Supset;":                   '\U000022D1',
-	"THORN;":                    '\U000000DE',
-	"TRADE;":                    '\U00002122',
-	"TSHcy;":                    '\U0000040B',
-	"TScy;":                     '\U00000426',
-	"Tab;":                      '\U00000009',
-	"Tau;":                      '\U000003A4',
-	"Tcaron;":                   '\U00000164',
-	"Tcedil;":                   '\U00000162',
-	"Tcy;":                      '\U00000422',
-	"Tfr;":                      '\U0001D517',
-	"Therefore;":                '\U00002234',
-	"Theta;":                    '\U00000398',
-	"ThinSpace;":                '\U00002009',
-	"Tilde;":                    '\U0000223C',
-	"TildeEqual;":               '\U00002243',
-	"TildeFullEqual;":           '\U00002245',
-	"TildeTilde;":               '\U00002248',
-	"Topf;":                     '\U0001D54B',
-	"TripleDot;":                '\U000020DB',
-	"Tscr;":                     '\U0001D4AF',
-	"Tstrok;":                   '\U00000166',
-	"Uacute;":                   '\U000000DA',
-	"Uarr;":                     '\U0000219F',
-	"Uarrocir;":                 '\U00002949',
-	"Ubrcy;":                    '\U0000040E',
-	"Ubreve;":                   '\U0000016C',
-	"Ucirc;":                    '\U000000DB',
-	"Ucy;":                      '\U00000423',
-	"Udblac;":                   '\U00000170',
-	"Ufr;":                      '\U0001D518',
-	"Ugrave;":                   '\U000000D9',
-	"Umacr;":                    '\U0000016A',
-	"UnderBar;":                 '\U0000005F',
-	"UnderBrace;":               '\U000023DF',
-	"UnderBracket;":             '\U000023B5',
-	"UnderParenthesis;":         '\U000023DD',
-	"Union;":                    '\U000022C3',
-	"UnionPlus;":                '\U0000228E',
-	"Uogon;":                    '\U00000172',
-	"Uopf;":                     '\U0001D54C',
-	"UpArrow;":                  '\U00002191',
-	"UpArrowBar;":               '\U00002912',
-	"UpArrowDownArrow;":         '\U000021C5',
-	"UpDownArrow;":              '\U00002195',
-	"UpEquilibrium;":            '\U0000296E',
-	"UpTee;":                    '\U000022A5',
-	"UpTeeArrow;":               '\U000021A5',
-	"Uparrow;":                  '\U000021D1',
-	"Updownarrow;":              '\U000021D5',
-	"UpperLeftArrow;":           '\U00002196',
-	"UpperRightArrow;":          '\U00002197',
-	"Upsi;":                     '\U000003D2',
-	"Upsilon;":                  '\U000003A5',
-	"Uring;":                    '\U0000016E',
-	"Uscr;":                     '\U0001D4B0',
-	"Utilde;":                   '\U00000168',
-	"Uuml;":                     '\U000000DC',
-	"VDash;":                    '\U000022AB',
-	"Vbar;":                     '\U00002AEB',
-	"Vcy;":                      '\U00000412',
-	"Vdash;":                    '\U000022A9',
-	"Vdashl;":                   '\U00002AE6',
-	"Vee;":                      '\U000022C1',
-	"Verbar;":                   '\U00002016',
-	"Vert;":                     '\U00002016',
-	"VerticalBar;":              '\U00002223',
-	"VerticalLine;":             '\U0000007C',
-	"VerticalSeparator;":        '\U00002758',
-	"VerticalTilde;":            '\U00002240',
-	"VeryThinSpace;":            '\U0000200A',
-	"Vfr;":                      '\U0001D519',
-	"Vopf;":                     '\U0001D54D',
-	"Vscr;":                     '\U0001D4B1',
-	"Vvdash;":                   '\U000022AA',
-	"Wcirc;":                    '\U00000174',
-	"Wedge;":                    '\U000022C0',
-	"Wfr;":                      '\U0001D51A',
-	"Wopf;":                     '\U0001D54E',
-	"Wscr;":                     '\U0001D4B2',
-	"Xfr;":                      '\U0001D51B',
-	"Xi;":                       '\U0000039E',
-	"Xopf;":                     '\U0001D54F',
-	"Xscr;":                     '\U0001D4B3',
-	"YAcy;":                     '\U0000042F',
-	"YIcy;":                     '\U00000407',
-	"YUcy;":                     '\U0000042E',
-	"Yacute;":                   '\U000000DD',
-	"Ycirc;":                    '\U00000176',
-	"Ycy;":                      '\U0000042B',
-	"Yfr;":                      '\U0001D51C',
-	"Yopf;":                     '\U0001D550',
-	"Yscr;":                     '\U0001D4B4',
-	"Yuml;":                     '\U00000178',
-	"ZHcy;":                     '\U00000416',
-	"Zacute;":                   '\U00000179',
-	"Zcaron;":                   '\U0000017D',
-	"Zcy;":                      '\U00000417',
-	"Zdot;":                     '\U0000017B',
-	"ZeroWidthSpace;":           '\U0000200B',
-	"Zeta;":                     '\U00000396',
-	"Zfr;":                      '\U00002128',
-	"Zopf;":                     '\U00002124',
-	"Zscr;":                     '\U0001D4B5',
-	"aacute;":                   '\U000000E1',
-	"abreve;":                   '\U00000103',
-	"ac;":                       '\U0000223E',
-	"acd;":                      '\U0000223F',
-	"acirc;":                    '\U000000E2',
-	"acute;":                    '\U000000B4',
-	"acy;":                      '\U00000430',
-	"aelig;":                    '\U000000E6',
-	"af;":                       '\U00002061',
-	"afr;":                      '\U0001D51E',
-	"agrave;":                   '\U000000E0',
-	"alefsym;":                  '\U00002135',
-	"aleph;":                    '\U00002135',
-	"alpha;":                    '\U000003B1',
-	"amacr;":                    '\U00000101',
-	"amalg;":                    '\U00002A3F',
-	"amp;":                      '\U00000026',
-	"and;":                      '\U00002227',
-	"andand;":                   '\U00002A55',
-	"andd;":                     '\U00002A5C',
-	"andslope;":                 '\U00002A58',
-	"andv;":                     '\U00002A5A',
-	"ang;":                      '\U00002220',
-	"ange;":                     '\U000029A4',
-	"angle;":                    '\U00002220',
-	"angmsd;":                   '\U00002221',
-	"angmsdaa;":                 '\U000029A8',
-	"angmsdab;":                 '\U000029A9',
-	"angmsdac;":                 '\U000029AA',
-	"angmsdad;":                 '\U000029AB',
-	"angmsdae;":                 '\U000029AC',
-	"angmsdaf;":                 '\U000029AD',
-	"angmsdag;":                 '\U000029AE',
-	"angmsdah;":                 '\U000029AF',
-	"angrt;":                    '\U0000221F',
-	"angrtvb;":                  '\U000022BE',
-	"angrtvbd;":                 '\U0000299D',
-	"angsph;":                   '\U00002222',
-	"angst;":                    '\U000000C5',
-	"angzarr;":                  '\U0000237C',
-	"aogon;":                    '\U00000105',
-	"aopf;":                     '\U0001D552',
-	"ap;":                       '\U00002248',
-	"apE;":                      '\U00002A70',
-	"apacir;":                   '\U00002A6F',
-	"ape;":                      '\U0000224A',
-	"apid;":                     '\U0000224B',
-	"apos;":                     '\U00000027',
-	"approx;":                   '\U00002248',
-	"approxeq;":                 '\U0000224A',
-	"aring;":                    '\U000000E5',
-	"ascr;":                     '\U0001D4B6',
-	"ast;":                      '\U0000002A',
-	"asymp;":                    '\U00002248',
-	"asympeq;":                  '\U0000224D',
-	"atilde;":                   '\U000000E3',
-	"auml;":                     '\U000000E4',
-	"awconint;":                 '\U00002233',
-	"awint;":                    '\U00002A11',
-	"bNot;":                     '\U00002AED',
-	"backcong;":                 '\U0000224C',
-	"backepsilon;":              '\U000003F6',
-	"backprime;":                '\U00002035',
-	"backsim;":                  '\U0000223D',
-	"backsimeq;":                '\U000022CD',
-	"barvee;":                   '\U000022BD',
-	"barwed;":                   '\U00002305',
-	"barwedge;":                 '\U00002305',
-	"bbrk;":                     '\U000023B5',
-	"bbrktbrk;":                 '\U000023B6',
-	"bcong;":                    '\U0000224C',
-	"bcy;":                      '\U00000431',
-	"bdquo;":                    '\U0000201E',
-	"becaus;":                   '\U00002235',
-	"because;":                  '\U00002235',
-	"bemptyv;":                  '\U000029B0',
-	"bepsi;":                    '\U000003F6',
-	"bernou;":                   '\U0000212C',
-	"beta;":                     '\U000003B2',
-	"beth;":                     '\U00002136',
-	"between;":                  '\U0000226C',
-	"bfr;":                      '\U0001D51F',
-	"bigcap;":                   '\U000022C2',
-	"bigcirc;":                  '\U000025EF',
-	"bigcup;":                   '\U000022C3',
-	"bigodot;":                  '\U00002A00',
-	"bigoplus;":                 '\U00002A01',
-	"bigotimes;":                '\U00002A02',
-	"bigsqcup;":                 '\U00002A06',
-	"bigstar;":                  '\U00002605',
-	"bigtriangledown;":          '\U000025BD',
-	"bigtriangleup;":            '\U000025B3',
-	"biguplus;":                 '\U00002A04',
-	"bigvee;":                   '\U000022C1',
-	"bigwedge;":                 '\U000022C0',
-	"bkarow;":                   '\U0000290D',
-	"blacklozenge;":             '\U000029EB',
-	"blacksquare;":              '\U000025AA',
-	"blacktriangle;":            '\U000025B4',
-	"blacktriangledown;":        '\U000025BE',
-	"blacktriangleleft;":        '\U000025C2',
-	"blacktriangleright;":       '\U000025B8',
-	"blank;":                    '\U00002423',
-	"blk12;":                    '\U00002592',
-	"blk14;":                    '\U00002591',
-	"blk34;":                    '\U00002593',
-	"block;":                    '\U00002588',
-	"bnot;":                     '\U00002310',
-	"bopf;":                     '\U0001D553',
-	"bot;":                      '\U000022A5',
-	"bottom;":                   '\U000022A5',
-	"bowtie;":                   '\U000022C8',
-	"boxDL;":                    '\U00002557',
-	"boxDR;":                    '\U00002554',
-	"boxDl;":                    '\U00002556',
-	"boxDr;":                    '\U00002553',
-	"boxH;":                     '\U00002550',
-	"boxHD;":                    '\U00002566',
-	"boxHU;":                    '\U00002569',
-	"boxHd;":                    '\U00002564',
-	"boxHu;":                    '\U00002567',
-	"boxUL;":                    '\U0000255D',
-	"boxUR;":                    '\U0000255A',
-	"boxUl;":                    '\U0000255C',
-	"boxUr;":                    '\U00002559',
-	"boxV;":                     '\U00002551',
-	"boxVH;":                    '\U0000256C',
-	"boxVL;":                    '\U00002563',
-	"boxVR;":                    '\U00002560',
-	"boxVh;":                    '\U0000256B',
-	"boxVl;":                    '\U00002562',
-	"boxVr;":                    '\U0000255F',
-	"boxbox;":                   '\U000029C9',
-	"boxdL;":                    '\U00002555',
-	"boxdR;":                    '\U00002552',
-	"boxdl;":                    '\U00002510',
-	"boxdr;":                    '\U0000250C',
-	"boxh;":                     '\U00002500',
-	"boxhD;":                    '\U00002565',
-	"boxhU;":                    '\U00002568',
-	"boxhd;":                    '\U0000252C',
-	"boxhu;":                    '\U00002534',
-	"boxminus;":                 '\U0000229F',
-	"boxplus;":                  '\U0000229E',
-	"boxtimes;":                 '\U000022A0',
-	"boxuL;":                    '\U0000255B',
-	"boxuR;":                    '\U00002558',
-	"boxul;":                    '\U00002518',
-	"boxur;":                    '\U00002514',
-	"boxv;":                     '\U00002502',
-	"boxvH;":                    '\U0000256A',
-	"boxvL;":                    '\U00002561',
-	"boxvR;":                    '\U0000255E',
-	"boxvh;":                    '\U0000253C',
-	"boxvl;":                    '\U00002524',
-	"boxvr;":                    '\U0000251C',
-	"bprime;":                   '\U00002035',
-	"breve;":                    '\U000002D8',
-	"brvbar;":                   '\U000000A6',
-	"bscr;":                     '\U0001D4B7',
-	"bsemi;":                    '\U0000204F',
-	"bsim;":                     '\U0000223D',
-	"bsime;":                    '\U000022CD',
-	"bsol;":                     '\U0000005C',
-	"bsolb;":                    '\U000029C5',
-	"bsolhsub;":                 '\U000027C8',
-	"bull;":                     '\U00002022',
-	"bullet;":                   '\U00002022',
-	"bump;":                     '\U0000224E',
-	"bumpE;":                    '\U00002AAE',
-	"bumpe;":                    '\U0000224F',
-	"bumpeq;":                   '\U0000224F',
-	"cacute;":                   '\U00000107',
-	"cap;":                      '\U00002229',
-	"capand;":                   '\U00002A44',
-	"capbrcup;":                 '\U00002A49',
-	"capcap;":                   '\U00002A4B',
-	"capcup;":                   '\U00002A47',
-	"capdot;":                   '\U00002A40',
-	"caret;":                    '\U00002041',
-	"caron;":                    '\U000002C7',
-	"ccaps;":                    '\U00002A4D',
-	"ccaron;":                   '\U0000010D',
-	"ccedil;":                   '\U000000E7',
-	"ccirc;":                    '\U00000109',
-	"ccups;":                    '\U00002A4C',
-	"ccupssm;":                  '\U00002A50',
-	"cdot;":                     '\U0000010B',
-	"cedil;":                    '\U000000B8',
-	"cemptyv;":                  '\U000029B2',
-	"cent;":                     '\U000000A2',
-	"centerdot;":                '\U000000B7',
-	"cfr;":                      '\U0001D520',
-	"chcy;":                     '\U00000447',
-	"check;":                    '\U00002713',
-	"checkmark;":                '\U00002713',
-	"chi;":                      '\U000003C7',
-	"cir;":                      '\U000025CB',
-	"cirE;":                     '\U000029C3',
-	"circ;":                     '\U000002C6',
-	"circeq;":                   '\U00002257',
-	"circlearrowleft;":          '\U000021BA',
-	"circlearrowright;":         '\U000021BB',
-	"circledR;":                 '\U000000AE',
-	"circledS;":                 '\U000024C8',
-	"circledast;":               '\U0000229B',
-	"circledcirc;":              '\U0000229A',
-	"circleddash;":              '\U0000229D',
-	"cire;":                     '\U00002257',
-	"cirfnint;":                 '\U00002A10',
-	"cirmid;":                   '\U00002AEF',
-	"cirscir;":                  '\U000029C2',
-	"clubs;":                    '\U00002663',
-	"clubsuit;":                 '\U00002663',
-	"colon;":                    '\U0000003A',
-	"colone;":                   '\U00002254',
-	"coloneq;":                  '\U00002254',
-	"comma;":                    '\U0000002C',
-	"commat;":                   '\U00000040',
-	"comp;":                     '\U00002201',
-	"compfn;":                   '\U00002218',
-	"complement;":               '\U00002201',
-	"complexes;":                '\U00002102',
-	"cong;":                     '\U00002245',
-	"congdot;":                  '\U00002A6D',
-	"conint;":                   '\U0000222E',
-	"copf;":                     '\U0001D554',
-	"coprod;":                   '\U00002210',
-	"copy;":                     '\U000000A9',
-	"copysr;":                   '\U00002117',
-	"crarr;":                    '\U000021B5',
-	"cross;":                    '\U00002717',
-	"cscr;":                     '\U0001D4B8',
-	"csub;":                     '\U00002ACF',
-	"csube;":                    '\U00002AD1',
-	"csup;":                     '\U00002AD0',
-	"csupe;":                    '\U00002AD2',
-	"ctdot;":                    '\U000022EF',
-	"cudarrl;":                  '\U00002938',
-	"cudarrr;":                  '\U00002935',
-	"cuepr;":                    '\U000022DE',
-	"cuesc;":                    '\U000022DF',
-	"cularr;":                   '\U000021B6',
-	"cularrp;":                  '\U0000293D',
-	"cup;":                      '\U0000222A',
-	"cupbrcap;":                 '\U00002A48',
-	"cupcap;":                   '\U00002A46',
-	"cupcup;":                   '\U00002A4A',
-	"cupdot;":                   '\U0000228D',
-	"cupor;":                    '\U00002A45',
-	"curarr;":                   '\U000021B7',
-	"curarrm;":                  '\U0000293C',
-	"curlyeqprec;":              '\U000022DE',
-	"curlyeqsucc;":              '\U000022DF',
-	"curlyvee;":                 '\U000022CE',
-	"curlywedge;":               '\U000022CF',
-	"curren;":                   '\U000000A4',
-	"curvearrowleft;":           '\U000021B6',
-	"curvearrowright;":          '\U000021B7',
-	"cuvee;":                    '\U000022CE',
-	"cuwed;":                    '\U000022CF',
-	"cwconint;":                 '\U00002232',
-	"cwint;":                    '\U00002231',
-	"cylcty;":                   '\U0000232D',
-	"dArr;":                     '\U000021D3',
-	"dHar;":                     '\U00002965',
-	"dagger;":                   '\U00002020',
-	"daleth;":                   '\U00002138',
-	"darr;":                     '\U00002193',
-	"dash;":                     '\U00002010',
-	"dashv;":                    '\U000022A3',
-	"dbkarow;":                  '\U0000290F',
-	"dblac;":                    '\U000002DD',
-	"dcaron;":                   '\U0000010F',
-	"dcy;":                      '\U00000434',
-	"dd;":                       '\U00002146',
-	"ddagger;":                  '\U00002021',
-	"ddarr;":                    '\U000021CA',
-	"ddotseq;":                  '\U00002A77',
-	"deg;":                      '\U000000B0',
-	"delta;":                    '\U000003B4',
-	"demptyv;":                  '\U000029B1',
-	"dfisht;":                   '\U0000297F',
-	"dfr;":                      '\U0001D521',
-	"dharl;":                    '\U000021C3',
-	"dharr;":                    '\U000021C2',
-	"diam;":                     '\U000022C4',
-	"diamond;":                  '\U000022C4',
-	"diamondsuit;":              '\U00002666',
-	"diams;":                    '\U00002666',
-	"die;":                      '\U000000A8',
-	"digamma;":                  '\U000003DD',
-	"disin;":                    '\U000022F2',
-	"div;":                      '\U000000F7',
-	"divide;":                   '\U000000F7',
-	"divideontimes;":            '\U000022C7',
-	"divonx;":                   '\U000022C7',
-	"djcy;":                     '\U00000452',
-	"dlcorn;":                   '\U0000231E',
-	"dlcrop;":                   '\U0000230D',
-	"dollar;":                   '\U00000024',
-	"dopf;":                     '\U0001D555',
-	"dot;":                      '\U000002D9',
-	"doteq;":                    '\U00002250',
-	"doteqdot;":                 '\U00002251',
-	"dotminus;":                 '\U00002238',
-	"dotplus;":                  '\U00002214',
-	"dotsquare;":                '\U000022A1',
-	"doublebarwedge;":           '\U00002306',
-	"downarrow;":                '\U00002193',
-	"downdownarrows;":           '\U000021CA',
-	"downharpoonleft;":          '\U000021C3',
-	"downharpoonright;":         '\U000021C2',
-	"drbkarow;":                 '\U00002910',
-	"drcorn;":                   '\U0000231F',
-	"drcrop;":                   '\U0000230C',
-	"dscr;":                     '\U0001D4B9',
-	"dscy;":                     '\U00000455',
-	"dsol;":                     '\U000029F6',
-	"dstrok;":                   '\U00000111',
-	"dtdot;":                    '\U000022F1',
-	"dtri;":                     '\U000025BF',
-	"dtrif;":                    '\U000025BE',
-	"duarr;":                    '\U000021F5',
-	"duhar;":                    '\U0000296F',
-	"dwangle;":                  '\U000029A6',
-	"dzcy;":                     '\U0000045F',
-	"dzigrarr;":                 '\U000027FF',
-	"eDDot;":                    '\U00002A77',
-	"eDot;":                     '\U00002251',
-	"eacute;":                   '\U000000E9',
-	"easter;":                   '\U00002A6E',
-	"ecaron;":                   '\U0000011B',
-	"ecir;":                     '\U00002256',
-	"ecirc;":                    '\U000000EA',
-	"ecolon;":                   '\U00002255',
-	"ecy;":                      '\U0000044D',
-	"edot;":                     '\U00000117',
-	"ee;":                       '\U00002147',
-	"efDot;":                    '\U00002252',
-	"efr;":                      '\U0001D522',
-	"eg;":                       '\U00002A9A',
-	"egrave;":                   '\U000000E8',
-	"egs;":                      '\U00002A96',
-	"egsdot;":                   '\U00002A98',
-	"el;":                       '\U00002A99',
-	"elinters;":                 '\U000023E7',
-	"ell;":                      '\U00002113',
-	"els;":                      '\U00002A95',
-	"elsdot;":                   '\U00002A97',
-	"emacr;":                    '\U00000113',
-	"empty;":                    '\U00002205',
-	"emptyset;":                 '\U00002205',
-	"emptyv;":                   '\U00002205',
-	"emsp;":                     '\U00002003',
-	"emsp13;":                   '\U00002004',
-	"emsp14;":                   '\U00002005',
-	"eng;":                      '\U0000014B',
-	"ensp;":                     '\U00002002',
-	"eogon;":                    '\U00000119',
-	"eopf;":                     '\U0001D556',
-	"epar;":                     '\U000022D5',
-	"eparsl;":                   '\U000029E3',
-	"eplus;":                    '\U00002A71',
-	"epsi;":                     '\U000003B5',
-	"epsilon;":                  '\U000003B5',
-	"epsiv;":                    '\U000003F5',
-	"eqcirc;":                   '\U00002256',
-	"eqcolon;":                  '\U00002255',
-	"eqsim;":                    '\U00002242',
-	"eqslantgtr;":               '\U00002A96',
-	"eqslantless;":              '\U00002A95',
-	"equals;":                   '\U0000003D',
-	"equest;":                   '\U0000225F',
-	"equiv;":                    '\U00002261',
-	"equivDD;":                  '\U00002A78',
-	"eqvparsl;":                 '\U000029E5',
-	"erDot;":                    '\U00002253',
-	"erarr;":                    '\U00002971',
-	"escr;":                     '\U0000212F',
-	"esdot;":                    '\U00002250',
-	"esim;":                     '\U00002242',
-	"eta;":                      '\U000003B7',
-	"eth;":                      '\U000000F0',
-	"euml;":                     '\U000000EB',
-	"euro;":                     '\U000020AC',
-	"excl;":                     '\U00000021',
-	"exist;":                    '\U00002203',
-	"expectation;":              '\U00002130',
-	"exponentiale;":             '\U00002147',
-	"fallingdotseq;":            '\U00002252',
-	"fcy;":                      '\U00000444',
-	"female;":                   '\U00002640',
-	"ffilig;":                   '\U0000FB03',
-	"fflig;":                    '\U0000FB00',
-	"ffllig;":                   '\U0000FB04',
-	"ffr;":                      '\U0001D523',
-	"filig;":                    '\U0000FB01',
-	"flat;":                     '\U0000266D',
-	"fllig;":                    '\U0000FB02',
-	"fltns;":                    '\U000025B1',
-	"fnof;":                     '\U00000192',
-	"fopf;":                     '\U0001D557',
-	"forall;":                   '\U00002200',
-	"fork;":                     '\U000022D4',
-	"forkv;":                    '\U00002AD9',
-	"fpartint;":                 '\U00002A0D',
-	"frac12;":                   '\U000000BD',
-	"frac13;":                   '\U00002153',
-	"frac14;":                   '\U000000BC',
-	"frac15;":                   '\U00002155',
-	"frac16;":                   '\U00002159',
-	"frac18;":                   '\U0000215B',
-	"frac23;":                   '\U00002154',
-	"frac25;":                   '\U00002156',
-	"frac34;":                   '\U000000BE',
-	"frac35;":                   '\U00002157',
-	"frac38;":                   '\U0000215C',
-	"frac45;":                   '\U00002158',
-	"frac56;":                   '\U0000215A',
-	"frac58;":                   '\U0000215D',
-	"frac78;":                   '\U0000215E',
-	"frasl;":                    '\U00002044',
-	"frown;":                    '\U00002322',
-	"fscr;":                     '\U0001D4BB',
-	"gE;":                       '\U00002267',
-	"gEl;":                      '\U00002A8C',
-	"gacute;":                   '\U000001F5',
-	"gamma;":                    '\U000003B3',
-	"gammad;":                   '\U000003DD',
-	"gap;":                      '\U00002A86',
-	"gbreve;":                   '\U0000011F',
-	"gcirc;":                    '\U0000011D',
-	"gcy;":                      '\U00000433',
-	"gdot;":                     '\U00000121',
-	"ge;":                       '\U00002265',
-	"gel;":                      '\U000022DB',
-	"geq;":                      '\U00002265',
-	"geqq;":                     '\U00002267',
-	"geqslant;":                 '\U00002A7E',
-	"ges;":                      '\U00002A7E',
-	"gescc;":                    '\U00002AA9',
-	"gesdot;":                   '\U00002A80',
-	"gesdoto;":                  '\U00002A82',
-	"gesdotol;":                 '\U00002A84',
-	"gesles;":                   '\U00002A94',
-	"gfr;":                      '\U0001D524',
-	"gg;":                       '\U0000226B',
-	"ggg;":                      '\U000022D9',
-	"gimel;":                    '\U00002137',
-	"gjcy;":                     '\U00000453',
-	"gl;":                       '\U00002277',
-	"glE;":                      '\U00002A92',
-	"gla;":                      '\U00002AA5',
-	"glj;":                      '\U00002AA4',
-	"gnE;":                      '\U00002269',
-	"gnap;":                     '\U00002A8A',
-	"gnapprox;":                 '\U00002A8A',
-	"gne;":                      '\U00002A88',
-	"gneq;":                     '\U00002A88',
-	"gneqq;":                    '\U00002269',
-	"gnsim;":                    '\U000022E7',
-	"gopf;":                     '\U0001D558',
-	"grave;":                    '\U00000060',
-	"gscr;":                     '\U0000210A',
-	"gsim;":                     '\U00002273',
-	"gsime;":                    '\U00002A8E',
-	"gsiml;":                    '\U00002A90',
-	"gt;":                       '\U0000003E',
-	"gtcc;":                     '\U00002AA7',
-	"gtcir;":                    '\U00002A7A',
-	"gtdot;":                    '\U000022D7',
-	"gtlPar;":                   '\U00002995',
-	"gtquest;":                  '\U00002A7C',
-	"gtrapprox;":                '\U00002A86',
-	"gtrarr;":                   '\U00002978',
-	"gtrdot;":                   '\U000022D7',
-	"gtreqless;":                '\U000022DB',
-	"gtreqqless;":               '\U00002A8C',
-	"gtrless;":                  '\U00002277',
-	"gtrsim;":                   '\U00002273',
-	"hArr;":                     '\U000021D4',
-	"hairsp;":                   '\U0000200A',
-	"half;":                     '\U000000BD',
-	"hamilt;":                   '\U0000210B',
-	"hardcy;":                   '\U0000044A',
-	"harr;":                     '\U00002194',
-	"harrcir;":                  '\U00002948',
-	"harrw;":                    '\U000021AD',
-	"hbar;":                     '\U0000210F',
-	"hcirc;":                    '\U00000125',
-	"hearts;":                   '\U00002665',
-	"heartsuit;":                '\U00002665',
-	"hellip;":                   '\U00002026',
-	"hercon;":                   '\U000022B9',
-	"hfr;":                      '\U0001D525',
-	"hksearow;":                 '\U00002925',
-	"hkswarow;":                 '\U00002926',
-	"hoarr;":                    '\U000021FF',
-	"homtht;":                   '\U0000223B',
-	"hookleftarrow;":            '\U000021A9',
-	"hookrightarrow;":           '\U000021AA',
-	"hopf;":                     '\U0001D559',
-	"horbar;":                   '\U00002015',
-	"hscr;":                     '\U0001D4BD',
-	"hslash;":                   '\U0000210F',
-	"hstrok;":                   '\U00000127',
-	"hybull;":                   '\U00002043',
-	"hyphen;":                   '\U00002010',
-	"iacute;":                   '\U000000ED',
-	"ic;":                       '\U00002063',
-	"icirc;":                    '\U000000EE',
-	"icy;":                      '\U00000438',
-	"iecy;":                     '\U00000435',
-	"iexcl;":                    '\U000000A1',
-	"iff;":                      '\U000021D4',
-	"ifr;":                      '\U0001D526',
-	"igrave;":                   '\U000000EC',
-	"ii;":                       '\U00002148',
-	"iiiint;":                   '\U00002A0C',
-	"iiint;":                    '\U0000222D',
-	"iinfin;":                   '\U000029DC',
-	"iiota;":                    '\U00002129',
-	"ijlig;":                    '\U00000133',
-	"imacr;":                    '\U0000012B',
-	"image;":                    '\U00002111',
-	"imagline;":                 '\U00002110',
-	"imagpart;":                 '\U00002111',
-	"imath;":                    '\U00000131',
-	"imof;":                     '\U000022B7',
-	"imped;":                    '\U000001B5',
-	"in;":                       '\U00002208',
-	"incare;":                   '\U00002105',
-	"infin;":                    '\U0000221E',
-	"infintie;":                 '\U000029DD',
-	"inodot;":                   '\U00000131',
-	"int;":                      '\U0000222B',
-	"intcal;":                   '\U000022BA',
-	"integers;":                 '\U00002124',
-	"intercal;":                 '\U000022BA',
-	"intlarhk;":                 '\U00002A17',
-	"intprod;":                  '\U00002A3C',
-	"iocy;":                     '\U00000451',
-	"iogon;":                    '\U0000012F',
-	"iopf;":                     '\U0001D55A',
-	"iota;":                     '\U000003B9',
-	"iprod;":                    '\U00002A3C',
-	"iquest;":                   '\U000000BF',
-	"iscr;":                     '\U0001D4BE',
-	"isin;":                     '\U00002208',
-	"isinE;":                    '\U000022F9',
-	"isindot;":                  '\U000022F5',
-	"isins;":                    '\U000022F4',
-	"isinsv;":                   '\U000022F3',
-	"isinv;":                    '\U00002208',
-	"it;":                       '\U00002062',
-	"itilde;":                   '\U00000129',
-	"iukcy;":                    '\U00000456',
-	"iuml;":                     '\U000000EF',
-	"jcirc;":                    '\U00000135',
-	"jcy;":                      '\U00000439',
-	"jfr;":                      '\U0001D527',
-	"jmath;":                    '\U00000237',
-	"jopf;":                     '\U0001D55B',
-	"jscr;":                     '\U0001D4BF',
-	"jsercy;":                   '\U00000458',
-	"jukcy;":                    '\U00000454',
-	"kappa;":                    '\U000003BA',
-	"kappav;":                   '\U000003F0',
-	"kcedil;":                   '\U00000137',
-	"kcy;":                      '\U0000043A',
-	"kfr;":                      '\U0001D528',
-	"kgreen;":                   '\U00000138',
-	"khcy;":                     '\U00000445',
-	"kjcy;":                     '\U0000045C',
-	"kopf;":                     '\U0001D55C',
-	"kscr;":                     '\U0001D4C0',
-	"lAarr;":                    '\U000021DA',
-	"lArr;":                     '\U000021D0',
-	"lAtail;":                   '\U0000291B',
-	"lBarr;":                    '\U0000290E',
-	"lE;":                       '\U00002266',
-	"lEg;":                      '\U00002A8B',
-	"lHar;":                     '\U00002962',
-	"lacute;":                   '\U0000013A',
-	"laemptyv;":                 '\U000029B4',
-	"lagran;":                   '\U00002112',
-	"lambda;":                   '\U000003BB',
-	"lang;":                     '\U000027E8',
-	"langd;":                    '\U00002991',
-	"langle;":                   '\U000027E8',
-	"lap;":                      '\U00002A85',
-	"laquo;":                    '\U000000AB',
-	"larr;":                     '\U00002190',
-	"larrb;":                    '\U000021E4',
-	"larrbfs;":                  '\U0000291F',
-	"larrfs;":                   '\U0000291D',
-	"larrhk;":                   '\U000021A9',
-	"larrlp;":                   '\U000021AB',
-	"larrpl;":                   '\U00002939',
-	"larrsim;":                  '\U00002973',
-	"larrtl;":                   '\U000021A2',
-	"lat;":                      '\U00002AAB',
-	"latail;":                   '\U00002919',
-	"late;":                     '\U00002AAD',
-	"lbarr;":                    '\U0000290C',
-	"lbbrk;":                    '\U00002772',
-	"lbrace;":                   '\U0000007B',
-	"lbrack;":                   '\U0000005B',
-	"lbrke;":                    '\U0000298B',
-	"lbrksld;":                  '\U0000298F',
-	"lbrkslu;":                  '\U0000298D',
-	"lcaron;":                   '\U0000013E',
-	"lcedil;":                   '\U0000013C',
-	"lceil;":                    '\U00002308',
-	"lcub;":                     '\U0000007B',
-	"lcy;":                      '\U0000043B',
-	"ldca;":                     '\U00002936',
-	"ldquo;":                    '\U0000201C',
-	"ldquor;":                   '\U0000201E',
-	"ldrdhar;":                  '\U00002967',
-	"ldrushar;":                 '\U0000294B',
-	"ldsh;":                     '\U000021B2',
-	"le;":                       '\U00002264',
-	"leftarrow;":                '\U00002190',
-	"leftarrowtail;":            '\U000021A2',
-	"leftharpoondown;":          '\U000021BD',
-	"leftharpoonup;":            '\U000021BC',
-	"leftleftarrows;":           '\U000021C7',
-	"leftrightarrow;":           '\U00002194',
-	"leftrightarrows;":          '\U000021C6',
-	"leftrightharpoons;":        '\U000021CB',
-	"leftrightsquigarrow;":      '\U000021AD',
-	"leftthreetimes;":           '\U000022CB',
-	"leg;":                      '\U000022DA',
-	"leq;":                      '\U00002264',
-	"leqq;":                     '\U00002266',
-	"leqslant;":                 '\U00002A7D',
-	"les;":                      '\U00002A7D',
-	"lescc;":                    '\U00002AA8',
-	"lesdot;":                   '\U00002A7F',
-	"lesdoto;":                  '\U00002A81',
-	"lesdotor;":                 '\U00002A83',
-	"lesges;":                   '\U00002A93',
-	"lessapprox;":               '\U00002A85',
-	"lessdot;":                  '\U000022D6',
-	"lesseqgtr;":                '\U000022DA',
-	"lesseqqgtr;":               '\U00002A8B',
-	"lessgtr;":                  '\U00002276',
-	"lesssim;":                  '\U00002272',
-	"lfisht;":                   '\U0000297C',
-	"lfloor;":                   '\U0000230A',
-	"lfr;":                      '\U0001D529',
-	"lg;":                       '\U00002276',
-	"lgE;":                      '\U00002A91',
-	"lhard;":                    '\U000021BD',
-	"lharu;":                    '\U000021BC',
-	"lharul;":                   '\U0000296A',
-	"lhblk;":                    '\U00002584',
-	"ljcy;":                     '\U00000459',
-	"ll;":                       '\U0000226A',
-	"llarr;":                    '\U000021C7',
-	"llcorner;":                 '\U0000231E',
-	"llhard;":                   '\U0000296B',
-	"lltri;":                    '\U000025FA',
-	"lmidot;":                   '\U00000140',
-	"lmoust;":                   '\U000023B0',
-	"lmoustache;":               '\U000023B0',
-	"lnE;":                      '\U00002268',
-	"lnap;":                     '\U00002A89',
-	"lnapprox;":                 '\U00002A89',
-	"lne;":                      '\U00002A87',
-	"lneq;":                     '\U00002A87',
-	"lneqq;":                    '\U00002268',
-	"lnsim;":                    '\U000022E6',
-	"loang;":                    '\U000027EC',
-	"loarr;":                    '\U000021FD',
-	"lobrk;":                    '\U000027E6',
-	"longleftarrow;":            '\U000027F5',
-	"longleftrightarrow;":       '\U000027F7',
-	"longmapsto;":               '\U000027FC',
-	"longrightarrow;":           '\U000027F6',
-	"looparrowleft;":            '\U000021AB',
-	"looparrowright;":           '\U000021AC',
-	"lopar;":                    '\U00002985',
-	"lopf;":                     '\U0001D55D',
-	"loplus;":                   '\U00002A2D',
-	"lotimes;":                  '\U00002A34',
-	"lowast;":                   '\U00002217',
-	"lowbar;":                   '\U0000005F',
-	"loz;":                      '\U000025CA',
-	"lozenge;":                  '\U000025CA',
-	"lozf;":                     '\U000029EB',
-	"lpar;":                     '\U00000028',
-	"lparlt;":                   '\U00002993',
-	"lrarr;":                    '\U000021C6',
-	"lrcorner;":                 '\U0000231F',
-	"lrhar;":                    '\U000021CB',
-	"lrhard;":                   '\U0000296D',
-	"lrm;":                      '\U0000200E',
-	"lrtri;":                    '\U000022BF',
-	"lsaquo;":                   '\U00002039',
-	"lscr;":                     '\U0001D4C1',
-	"lsh;":                      '\U000021B0',
-	"lsim;":                     '\U00002272',
-	"lsime;":                    '\U00002A8D',
-	"lsimg;":                    '\U00002A8F',
-	"lsqb;":                     '\U0000005B',
-	"lsquo;":                    '\U00002018',
-	"lsquor;":                   '\U0000201A',
-	"lstrok;":                   '\U00000142',
-	"lt;":                       '\U0000003C',
-	"ltcc;":                     '\U00002AA6',
-	"ltcir;":                    '\U00002A79',
-	"ltdot;":                    '\U000022D6',
-	"lthree;":                   '\U000022CB',
-	"ltimes;":                   '\U000022C9',
-	"ltlarr;":                   '\U00002976',
-	"ltquest;":                  '\U00002A7B',
-	"ltrPar;":                   '\U00002996',
-	"ltri;":                     '\U000025C3',
-	"ltrie;":                    '\U000022B4',
-	"ltrif;":                    '\U000025C2',
-	"lurdshar;":                 '\U0000294A',
-	"luruhar;":                  '\U00002966',
-	"mDDot;":                    '\U0000223A',
-	"macr;":                     '\U000000AF',
-	"male;":                     '\U00002642',
-	"malt;":                     '\U00002720',
-	"maltese;":                  '\U00002720',
-	"map;":                      '\U000021A6',
-	"mapsto;":                   '\U000021A6',
-	"mapstodown;":               '\U000021A7',
-	"mapstoleft;":               '\U000021A4',
-	"mapstoup;":                 '\U000021A5',
-	"marker;":                   '\U000025AE',
-	"mcomma;":                   '\U00002A29',
-	"mcy;":                      '\U0000043C',
-	"mdash;":                    '\U00002014',
-	"measuredangle;":            '\U00002221',
-	"mfr;":                      '\U0001D52A',
-	"mho;":                      '\U00002127',
-	"micro;":                    '\U000000B5',
-	"mid;":                      '\U00002223',
-	"midast;":                   '\U0000002A',
-	"midcir;":                   '\U00002AF0',
-	"middot;":                   '\U000000B7',
-	"minus;":                    '\U00002212',
-	"minusb;":                   '\U0000229F',
-	"minusd;":                   '\U00002238',
-	"minusdu;":                  '\U00002A2A',
-	"mlcp;":                     '\U00002ADB',
-	"mldr;":                     '\U00002026',
-	"mnplus;":                   '\U00002213',
-	"models;":                   '\U000022A7',
-	"mopf;":                     '\U0001D55E',
-	"mp;":                       '\U00002213',
-	"mscr;":                     '\U0001D4C2',
-	"mstpos;":                   '\U0000223E',
-	"mu;":                       '\U000003BC',
-	"multimap;":                 '\U000022B8',
-	"mumap;":                    '\U000022B8',
-	"nLeftarrow;":               '\U000021CD',
-	"nLeftrightarrow;":          '\U000021CE',
-	"nRightarrow;":              '\U000021CF',
-	"nVDash;":                   '\U000022AF',
-	"nVdash;":                   '\U000022AE',
-	"nabla;":                    '\U00002207',
-	"nacute;":                   '\U00000144',
-	"nap;":                      '\U00002249',
-	"napos;":                    '\U00000149',
-	"napprox;":                  '\U00002249',
-	"natur;":                    '\U0000266E',
-	"natural;":                  '\U0000266E',
-	"naturals;":                 '\U00002115',
-	"nbsp;":                     '\U000000A0',
-	"ncap;":                     '\U00002A43',
-	"ncaron;":                   '\U00000148',
-	"ncedil;":                   '\U00000146',
-	"ncong;":                    '\U00002247',
-	"ncup;":                     '\U00002A42',
-	"ncy;":                      '\U0000043D',
-	"ndash;":                    '\U00002013',
-	"ne;":                       '\U00002260',
-	"neArr;":                    '\U000021D7',
-	"nearhk;":                   '\U00002924',
-	"nearr;":                    '\U00002197',
-	"nearrow;":                  '\U00002197',
-	"nequiv;":                   '\U00002262',
-	"nesear;":                   '\U00002928',
-	"nexist;":                   '\U00002204',
-	"nexists;":                  '\U00002204',
-	"nfr;":                      '\U0001D52B',
-	"nge;":                      '\U00002271',
-	"ngeq;":                     '\U00002271',
-	"ngsim;":                    '\U00002275',
-	"ngt;":                      '\U0000226F',
-	"ngtr;":                     '\U0000226F',
-	"nhArr;":                    '\U000021CE',
-	"nharr;":                    '\U000021AE',
-	"nhpar;":                    '\U00002AF2',
-	"ni;":                       '\U0000220B',
-	"nis;":                      '\U000022FC',
-	"nisd;":                     '\U000022FA',
-	"niv;":                      '\U0000220B',
-	"njcy;":                     '\U0000045A',
-	"nlArr;":                    '\U000021CD',
-	"nlarr;":                    '\U0000219A',
-	"nldr;":                     '\U00002025',
-	"nle;":                      '\U00002270',
-	"nleftarrow;":               '\U0000219A',
-	"nleftrightarrow;":          '\U000021AE',
-	"nleq;":                     '\U00002270',
-	"nless;":                    '\U0000226E',
-	"nlsim;":                    '\U00002274',
-	"nlt;":                      '\U0000226E',
-	"nltri;":                    '\U000022EA',
-	"nltrie;":                   '\U000022EC',
-	"nmid;":                     '\U00002224',
-	"nopf;":                     '\U0001D55F',
-	"not;":                      '\U000000AC',
-	"notin;":                    '\U00002209',
-	"notinva;":                  '\U00002209',
-	"notinvb;":                  '\U000022F7',
-	"notinvc;":                  '\U000022F6',
-	"notni;":                    '\U0000220C',
-	"notniva;":                  '\U0000220C',
-	"notnivb;":                  '\U000022FE',
-	"notnivc;":                  '\U000022FD',
-	"npar;":                     '\U00002226',
-	"nparallel;":                '\U00002226',
-	"npolint;":                  '\U00002A14',
-	"npr;":                      '\U00002280',
-	"nprcue;":                   '\U000022E0',
-	"nprec;":                    '\U00002280',
-	"nrArr;":                    '\U000021CF',
-	"nrarr;":                    '\U0000219B',
-	"nrightarrow;":              '\U0000219B',
-	"nrtri;":                    '\U000022EB',
-	"nrtrie;":                   '\U000022ED',
-	"nsc;":                      '\U00002281',
-	"nsccue;":                   '\U000022E1',
-	"nscr;":                     '\U0001D4C3',
-	"nshortmid;":                '\U00002224',
-	"nshortparallel;":           '\U00002226',
-	"nsim;":                     '\U00002241',
-	"nsime;":                    '\U00002244',
-	"nsimeq;":                   '\U00002244',
-	"nsmid;":                    '\U00002224',
-	"nspar;":                    '\U00002226',
-	"nsqsube;":                  '\U000022E2',
-	"nsqsupe;":                  '\U000022E3',
-	"nsub;":                     '\U00002284',
-	"nsube;":                    '\U00002288',
-	"nsubseteq;":                '\U00002288',
-	"nsucc;":                    '\U00002281',
-	"nsup;":                     '\U00002285',
-	"nsupe;":                    '\U00002289',
-	"nsupseteq;":                '\U00002289',
-	"ntgl;":                     '\U00002279',
-	"ntilde;":                   '\U000000F1',
-	"ntlg;":                     '\U00002278',
-	"ntriangleleft;":            '\U000022EA',
-	"ntrianglelefteq;":          '\U000022EC',
-	"ntriangleright;":           '\U000022EB',
-	"ntrianglerighteq;":         '\U000022ED',
-	"nu;":                       '\U000003BD',
-	"num;":                      '\U00000023',
-	"numero;":                   '\U00002116',
-	"numsp;":                    '\U00002007',
-	"nvDash;":                   '\U000022AD',
-	"nvHarr;":                   '\U00002904',
-	"nvdash;":                   '\U000022AC',
-	"nvinfin;":                  '\U000029DE',
-	"nvlArr;":                   '\U00002902',
-	"nvrArr;":                   '\U00002903',
-	"nwArr;":                    '\U000021D6',
-	"nwarhk;":                   '\U00002923',
-	"nwarr;":                    '\U00002196',
-	"nwarrow;":                  '\U00002196',
-	"nwnear;":                   '\U00002927',
-	"oS;":                       '\U000024C8',
-	"oacute;":                   '\U000000F3',
-	"oast;":                     '\U0000229B',
-	"ocir;":                     '\U0000229A',
-	"ocirc;":                    '\U000000F4',
-	"ocy;":                      '\U0000043E',
-	"odash;":                    '\U0000229D',
-	"odblac;":                   '\U00000151',
-	"odiv;":                     '\U00002A38',
-	"odot;":                     '\U00002299',
-	"odsold;":                   '\U000029BC',
-	"oelig;":                    '\U00000153',
-	"ofcir;":                    '\U000029BF',
-	"ofr;":                      '\U0001D52C',
-	"ogon;":                     '\U000002DB',
-	"ograve;":                   '\U000000F2',
-	"ogt;":                      '\U000029C1',
-	"ohbar;":                    '\U000029B5',
-	"ohm;":                      '\U000003A9',
-	"oint;":                     '\U0000222E',
-	"olarr;":                    '\U000021BA',
-	"olcir;":                    '\U000029BE',
-	"olcross;":                  '\U000029BB',
-	"oline;":                    '\U0000203E',
-	"olt;":                      '\U000029C0',
-	"omacr;":                    '\U0000014D',
-	"omega;":                    '\U000003C9',
-	"omicron;":                  '\U000003BF',
-	"omid;":                     '\U000029B6',
-	"ominus;":                   '\U00002296',
-	"oopf;":                     '\U0001D560',
-	"opar;":                     '\U000029B7',
-	"operp;":                    '\U000029B9',
-	"oplus;":                    '\U00002295',
-	"or;":                       '\U00002228',
-	"orarr;":                    '\U000021BB',
-	"ord;":                      '\U00002A5D',
-	"order;":                    '\U00002134',
-	"orderof;":                  '\U00002134',
-	"ordf;":                     '\U000000AA',
-	"ordm;":                     '\U000000BA',
-	"origof;":                   '\U000022B6',
-	"oror;":                     '\U00002A56',
-	"orslope;":                  '\U00002A57',
-	"orv;":                      '\U00002A5B',
-	"oscr;":                     '\U00002134',
-	"oslash;":                   '\U000000F8',
-	"osol;":                     '\U00002298',
-	"otilde;":                   '\U000000F5',
-	"otimes;":                   '\U00002297',
-	"otimesas;":                 '\U00002A36',
-	"ouml;":                     '\U000000F6',
-	"ovbar;":                    '\U0000233D',
-	"par;":                      '\U00002225',
-	"para;":                     '\U000000B6',
-	"parallel;":                 '\U00002225',
-	"parsim;":                   '\U00002AF3',
-	"parsl;":                    '\U00002AFD',
-	"part;":                     '\U00002202',
-	"pcy;":                      '\U0000043F',
-	"percnt;":                   '\U00000025',
-	"period;":                   '\U0000002E',
-	"permil;":                   '\U00002030',
-	"perp;":                     '\U000022A5',
-	"pertenk;":                  '\U00002031',
-	"pfr;":                      '\U0001D52D',
-	"phi;":                      '\U000003C6',
-	"phiv;":                     '\U000003D5',
-	"phmmat;":                   '\U00002133',
-	"phone;":                    '\U0000260E',
-	"pi;":                       '\U000003C0',
-	"pitchfork;":                '\U000022D4',
-	"piv;":                      '\U000003D6',
-	"planck;":                   '\U0000210F',
-	"planckh;":                  '\U0000210E',
-	"plankv;":                   '\U0000210F',
-	"plus;":                     '\U0000002B',
-	"plusacir;":                 '\U00002A23',
-	"plusb;":                    '\U0000229E',
-	"pluscir;":                  '\U00002A22',
-	"plusdo;":                   '\U00002214',
-	"plusdu;":                   '\U00002A25',
-	"pluse;":                    '\U00002A72',
-	"plusmn;":                   '\U000000B1',
-	"plussim;":                  '\U00002A26',
-	"plustwo;":                  '\U00002A27',
-	"pm;":                       '\U000000B1',
-	"pointint;":                 '\U00002A15',
-	"popf;":                     '\U0001D561',
-	"pound;":                    '\U000000A3',
-	"pr;":                       '\U0000227A',
-	"prE;":                      '\U00002AB3',
-	"prap;":                     '\U00002AB7',
-	"prcue;":                    '\U0000227C',
-	"pre;":                      '\U00002AAF',
-	"prec;":                     '\U0000227A',
-	"precapprox;":               '\U00002AB7',
-	"preccurlyeq;":              '\U0000227C',
-	"preceq;":                   '\U00002AAF',
-	"precnapprox;":              '\U00002AB9',
-	"precneqq;":                 '\U00002AB5',
-	"precnsim;":                 '\U000022E8',
-	"precsim;":                  '\U0000227E',
-	"prime;":                    '\U00002032',
-	"primes;":                   '\U00002119',
-	"prnE;":                     '\U00002AB5',
-	"prnap;":                    '\U00002AB9',
-	"prnsim;":                   '\U000022E8',
-	"prod;":                     '\U0000220F',
-	"profalar;":                 '\U0000232E',
-	"profline;":                 '\U00002312',
-	"profsurf;":                 '\U00002313',
-	"prop;":                     '\U0000221D',
-	"propto;":                   '\U0000221D',
-	"prsim;":                    '\U0000227E',
-	"prurel;":                   '\U000022B0',
-	"pscr;":                     '\U0001D4C5',
-	"psi;":                      '\U000003C8',
-	"puncsp;":                   '\U00002008',
-	"qfr;":                      '\U0001D52E',
-	"qint;":                     '\U00002A0C',
-	"qopf;":                     '\U0001D562',
-	"qprime;":                   '\U00002057',
-	"qscr;":                     '\U0001D4C6',
-	"quaternions;":              '\U0000210D',
-	"quatint;":                  '\U00002A16',
-	"quest;":                    '\U0000003F',
-	"questeq;":                  '\U0000225F',
-	"quot;":                     '\U00000022',
-	"rAarr;":                    '\U000021DB',
-	"rArr;":                     '\U000021D2',
-	"rAtail;":                   '\U0000291C',
-	"rBarr;":                    '\U0000290F',
-	"rHar;":                     '\U00002964',
-	"racute;":                   '\U00000155',
-	"radic;":                    '\U0000221A',
-	"raemptyv;":                 '\U000029B3',
-	"rang;":                     '\U000027E9',
-	"rangd;":                    '\U00002992',
-	"range;":                    '\U000029A5',
-	"rangle;":                   '\U000027E9',
-	"raquo;":                    '\U000000BB',
-	"rarr;":                     '\U00002192',
-	"rarrap;":                   '\U00002975',
-	"rarrb;":                    '\U000021E5',
-	"rarrbfs;":                  '\U00002920',
-	"rarrc;":                    '\U00002933',
-	"rarrfs;":                   '\U0000291E',
-	"rarrhk;":                   '\U000021AA',
-	"rarrlp;":                   '\U000021AC',
-	"rarrpl;":                   '\U00002945',
-	"rarrsim;":                  '\U00002974',
-	"rarrtl;":                   '\U000021A3',
-	"rarrw;":                    '\U0000219D',
-	"ratail;":                   '\U0000291A',
-	"ratio;":                    '\U00002236',
-	"rationals;":                '\U0000211A',
-	"rbarr;":                    '\U0000290D',
-	"rbbrk;":                    '\U00002773',
-	"rbrace;":                   '\U0000007D',
-	"rbrack;":                   '\U0000005D',
-	"rbrke;":                    '\U0000298C',
-	"rbrksld;":                  '\U0000298E',
-	"rbrkslu;":                  '\U00002990',
-	"rcaron;":                   '\U00000159',
-	"rcedil;":                   '\U00000157',
-	"rceil;":                    '\U00002309',
-	"rcub;":                     '\U0000007D',
-	"rcy;":                      '\U00000440',
-	"rdca;":                     '\U00002937',
-	"rdldhar;":                  '\U00002969',
-	"rdquo;":                    '\U0000201D',
-	"rdquor;":                   '\U0000201D',
-	"rdsh;":                     '\U000021B3',
-	"real;":                     '\U0000211C',
-	"realine;":                  '\U0000211B',
-	"realpart;":                 '\U0000211C',
-	"reals;":                    '\U0000211D',
-	"rect;":                     '\U000025AD',
-	"reg;":                      '\U000000AE',
-	"rfisht;":                   '\U0000297D',
-	"rfloor;":                   '\U0000230B',
-	"rfr;":                      '\U0001D52F',
-	"rhard;":                    '\U000021C1',
-	"rharu;":                    '\U000021C0',
-	"rharul;":                   '\U0000296C',
-	"rho;":                      '\U000003C1',
-	"rhov;":                     '\U000003F1',
-	"rightarrow;":               '\U00002192',
-	"rightarrowtail;":           '\U000021A3',
-	"rightharpoondown;":         '\U000021C1',
-	"rightharpoonup;":           '\U000021C0',
-	"rightleftarrows;":          '\U000021C4',
-	"rightleftharpoons;":        '\U000021CC',
-	"rightrightarrows;":         '\U000021C9',
-	"rightsquigarrow;":          '\U0000219D',
-	"rightthreetimes;":          '\U000022CC',
-	"ring;":                     '\U000002DA',
-	"risingdotseq;":             '\U00002253',
-	"rlarr;":                    '\U000021C4',
-	"rlhar;":                    '\U000021CC',
-	"rlm;":                      '\U0000200F',
-	"rmoust;":                   '\U000023B1',
-	"rmoustache;":               '\U000023B1',
-	"rnmid;":                    '\U00002AEE',
-	"roang;":                    '\U000027ED',
-	"roarr;":                    '\U000021FE',
-	"robrk;":                    '\U000027E7',
-	"ropar;":                    '\U00002986',
-	"ropf;":                     '\U0001D563',
-	"roplus;":                   '\U00002A2E',
-	"rotimes;":                  '\U00002A35',
-	"rpar;":                     '\U00000029',
-	"rpargt;":                   '\U00002994',
-	"rppolint;":                 '\U00002A12',
-	"rrarr;":                    '\U000021C9',
-	"rsaquo;":                   '\U0000203A',
-	"rscr;":                     '\U0001D4C7',
-	"rsh;":                      '\U000021B1',
-	"rsqb;":                     '\U0000005D',
-	"rsquo;":                    '\U00002019',
-	"rsquor;":                   '\U00002019',
-	"rthree;":                   '\U000022CC',
-	"rtimes;":                   '\U000022CA',
-	"rtri;":                     '\U000025B9',
-	"rtrie;":                    '\U000022B5',
-	"rtrif;":                    '\U000025B8',
-	"rtriltri;":                 '\U000029CE',
-	"ruluhar;":                  '\U00002968',
-	"rx;":                       '\U0000211E',
-	"sacute;":                   '\U0000015B',
-	"sbquo;":                    '\U0000201A',
-	"sc;":                       '\U0000227B',
-	"scE;":                      '\U00002AB4',
-	"scap;":                     '\U00002AB8',
-	"scaron;":                   '\U00000161',
-	"sccue;":                    '\U0000227D',
-	"sce;":                      '\U00002AB0',
-	"scedil;":                   '\U0000015F',
-	"scirc;":                    '\U0000015D',
-	"scnE;":                     '\U00002AB6',
-	"scnap;":                    '\U00002ABA',
-	"scnsim;":                   '\U000022E9',
-	"scpolint;":                 '\U00002A13',
-	"scsim;":                    '\U0000227F',
-	"scy;":                      '\U00000441',
-	"sdot;":                     '\U000022C5',
-	"sdotb;":                    '\U000022A1',
-	"sdote;":                    '\U00002A66',
-	"seArr;":                    '\U000021D8',
-	"searhk;":                   '\U00002925',
-	"searr;":                    '\U00002198',
-	"searrow;":                  '\U00002198',
-	"sect;":                     '\U000000A7',
-	"semi;":                     '\U0000003B',
-	"seswar;":                   '\U00002929',
-	"setminus;":                 '\U00002216',
-	"setmn;":                    '\U00002216',
-	"sext;":                     '\U00002736',
-	"sfr;":                      '\U0001D530',
-	"sfrown;":                   '\U00002322',
-	"sharp;":                    '\U0000266F',
-	"shchcy;":                   '\U00000449',
-	"shcy;":                     '\U00000448',
-	"shortmid;":                 '\U00002223',
-	"shortparallel;":            '\U00002225',
-	"shy;":                      '\U000000AD',
-	"sigma;":                    '\U000003C3',
-	"sigmaf;":                   '\U000003C2',
-	"sigmav;":                   '\U000003C2',
-	"sim;":                      '\U0000223C',
-	"simdot;":                   '\U00002A6A',
-	"sime;":                     '\U00002243',
-	"simeq;":                    '\U00002243',
-	"simg;":                     '\U00002A9E',
-	"simgE;":                    '\U00002AA0',
-	"siml;":                     '\U00002A9D',
-	"simlE;":                    '\U00002A9F',
-	"simne;":                    '\U00002246',
-	"simplus;":                  '\U00002A24',
-	"simrarr;":                  '\U00002972',
-	"slarr;":                    '\U00002190',
-	"smallsetminus;":            '\U00002216',
-	"smashp;":                   '\U00002A33',
-	"smeparsl;":                 '\U000029E4',
-	"smid;":                     '\U00002223',
-	"smile;":                    '\U00002323',
-	"smt;":                      '\U00002AAA',
-	"smte;":                     '\U00002AAC',
-	"softcy;":                   '\U0000044C',
-	"sol;":                      '\U0000002F',
-	"solb;":                     '\U000029C4',
-	"solbar;":                   '\U0000233F',
-	"sopf;":                     '\U0001D564',
-	"spades;":                   '\U00002660',
-	"spadesuit;":                '\U00002660',
-	"spar;":                     '\U00002225',
-	"sqcap;":                    '\U00002293',
-	"sqcup;":                    '\U00002294',
-	"sqsub;":                    '\U0000228F',
-	"sqsube;":                   '\U00002291',
-	"sqsubset;":                 '\U0000228F',
-	"sqsubseteq;":               '\U00002291',
-	"sqsup;":                    '\U00002290',
-	"sqsupe;":                   '\U00002292',
-	"sqsupset;":                 '\U00002290',
-	"sqsupseteq;":               '\U00002292',
-	"squ;":                      '\U000025A1',
-	"square;":                   '\U000025A1',
-	"squarf;":                   '\U000025AA',
-	"squf;":                     '\U000025AA',
-	"srarr;":                    '\U00002192',
-	"sscr;":                     '\U0001D4C8',
-	"ssetmn;":                   '\U00002216',
-	"ssmile;":                   '\U00002323',
-	"sstarf;":                   '\U000022C6',
-	"star;":                     '\U00002606',
-	"starf;":                    '\U00002605',
-	"straightepsilon;":          '\U000003F5',
-	"straightphi;":              '\U000003D5',
-	"strns;":                    '\U000000AF',
-	"sub;":                      '\U00002282',
-	"subE;":                     '\U00002AC5',
-	"subdot;":                   '\U00002ABD',
-	"sube;":                     '\U00002286',
-	"subedot;":                  '\U00002AC3',
-	"submult;":                  '\U00002AC1',
-	"subnE;":                    '\U00002ACB',
-	"subne;":                    '\U0000228A',
-	"subplus;":                  '\U00002ABF',
-	"subrarr;":                  '\U00002979',
-	"subset;":                   '\U00002282',
-	"subseteq;":                 '\U00002286',
-	"subseteqq;":                '\U00002AC5',
-	"subsetneq;":                '\U0000228A',
-	"subsetneqq;":               '\U00002ACB',
-	"subsim;":                   '\U00002AC7',
-	"subsub;":                   '\U00002AD5',
-	"subsup;":                   '\U00002AD3',
-	"succ;":                     '\U0000227B',
-	"succapprox;":               '\U00002AB8',
-	"succcurlyeq;":              '\U0000227D',
-	"succeq;":                   '\U00002AB0',
-	"succnapprox;":              '\U00002ABA',
-	"succneqq;":                 '\U00002AB6',
-	"succnsim;":                 '\U000022E9',
-	"succsim;":                  '\U0000227F',
-	"sum;":                      '\U00002211',
-	"sung;":                     '\U0000266A',
-	"sup;":                      '\U00002283',
-	"sup1;":                     '\U000000B9',
-	"sup2;":                     '\U000000B2',
-	"sup3;":                     '\U000000B3',
-	"supE;":                     '\U00002AC6',
-	"supdot;":                   '\U00002ABE',
-	"supdsub;":                  '\U00002AD8',
-	"supe;":                     '\U00002287',
-	"supedot;":                  '\U00002AC4',
-	"suphsol;":                  '\U000027C9',
-	"suphsub;":                  '\U00002AD7',
-	"suplarr;":                  '\U0000297B',
-	"supmult;":                  '\U00002AC2',
-	"supnE;":                    '\U00002ACC',
-	"supne;":                    '\U0000228B',
-	"supplus;":                  '\U00002AC0',
-	"supset;":                   '\U00002283',
-	"supseteq;":                 '\U00002287',
-	"supseteqq;":                '\U00002AC6',
-	"supsetneq;":                '\U0000228B',
-	"supsetneqq;":               '\U00002ACC',
-	"supsim;":                   '\U00002AC8',
-	"supsub;":                   '\U00002AD4',
-	"supsup;":                   '\U00002AD6',
-	"swArr;":                    '\U000021D9',
-	"swarhk;":                   '\U00002926',
-	"swarr;":                    '\U00002199',
-	"swarrow;":                  '\U00002199',
-	"swnwar;":                   '\U0000292A',
-	"szlig;":                    '\U000000DF',
-	"target;":                   '\U00002316',
-	"tau;":                      '\U000003C4',
-	"tbrk;":                     '\U000023B4',
-	"tcaron;":                   '\U00000165',
-	"tcedil;":                   '\U00000163',
-	"tcy;":                      '\U00000442',
-	"tdot;":                     '\U000020DB',
-	"telrec;":                   '\U00002315',
-	"tfr;":                      '\U0001D531',
-	"there4;":                   '\U00002234',
-	"therefore;":                '\U00002234',
-	"theta;":                    '\U000003B8',
-	"thetasym;":                 '\U000003D1',
-	"thetav;":                   '\U000003D1',
-	"thickapprox;":              '\U00002248',
-	"thicksim;":                 '\U0000223C',
-	"thinsp;":                   '\U00002009',
-	"thkap;":                    '\U00002248',
-	"thksim;":                   '\U0000223C',
-	"thorn;":                    '\U000000FE',
-	"tilde;":                    '\U000002DC',
-	"times;":                    '\U000000D7',
-	"timesb;":                   '\U000022A0',
-	"timesbar;":                 '\U00002A31',
-	"timesd;":                   '\U00002A30',
-	"tint;":                     '\U0000222D',
-	"toea;":                     '\U00002928',
-	"top;":                      '\U000022A4',
-	"topbot;":                   '\U00002336',
-	"topcir;":                   '\U00002AF1',
-	"topf;":                     '\U0001D565',
-	"topfork;":                  '\U00002ADA',
-	"tosa;":                     '\U00002929',
-	"tprime;":                   '\U00002034',
-	"trade;":                    '\U00002122',
-	"triangle;":                 '\U000025B5',
-	"triangledown;":             '\U000025BF',
-	"triangleleft;":             '\U000025C3',
-	"trianglelefteq;":           '\U000022B4',
-	"triangleq;":                '\U0000225C',
-	"triangleright;":            '\U000025B9',
-	"trianglerighteq;":          '\U000022B5',
-	"tridot;":                   '\U000025EC',
-	"trie;":                     '\U0000225C',
-	"triminus;":                 '\U00002A3A',
-	"triplus;":                  '\U00002A39',
-	"trisb;":                    '\U000029CD',
-	"tritime;":                  '\U00002A3B',
-	"trpezium;":                 '\U000023E2',
-	"tscr;":                     '\U0001D4C9',
-	"tscy;":                     '\U00000446',
-	"tshcy;":                    '\U0000045B',
-	"tstrok;":                   '\U00000167',
-	"twixt;":                    '\U0000226C',
-	"twoheadleftarrow;":         '\U0000219E',
-	"twoheadrightarrow;":        '\U000021A0',
-	"uArr;":                     '\U000021D1',
-	"uHar;":                     '\U00002963',
-	"uacute;":                   '\U000000FA',
-	"uarr;":                     '\U00002191',
-	"ubrcy;":                    '\U0000045E',
-	"ubreve;":                   '\U0000016D',
-	"ucirc;":                    '\U000000FB',
-	"ucy;":                      '\U00000443',
-	"udarr;":                    '\U000021C5',
-	"udblac;":                   '\U00000171',
-	"udhar;":                    '\U0000296E',
-	"ufisht;":                   '\U0000297E',
-	"ufr;":                      '\U0001D532',
-	"ugrave;":                   '\U000000F9',
-	"uharl;":                    '\U000021BF',
-	"uharr;":                    '\U000021BE',
-	"uhblk;":                    '\U00002580',
-	"ulcorn;":                   '\U0000231C',
-	"ulcorner;":                 '\U0000231C',
-	"ulcrop;":                   '\U0000230F',
-	"ultri;":                    '\U000025F8',
-	"umacr;":                    '\U0000016B',
-	"uml;":                      '\U000000A8',
-	"uogon;":                    '\U00000173',
-	"uopf;":                     '\U0001D566',
-	"uparrow;":                  '\U00002191',
-	"updownarrow;":              '\U00002195',
-	"upharpoonleft;":            '\U000021BF',
-	"upharpoonright;":           '\U000021BE',
-	"uplus;":                    '\U0000228E',
-	"upsi;":                     '\U000003C5',
-	"upsih;":                    '\U000003D2',
-	"upsilon;":                  '\U000003C5',
-	"upuparrows;":               '\U000021C8',
-	"urcorn;":                   '\U0000231D',
-	"urcorner;":                 '\U0000231D',
-	"urcrop;":                   '\U0000230E',
-	"uring;":                    '\U0000016F',
-	"urtri;":                    '\U000025F9',
-	"uscr;":                     '\U0001D4CA',
-	"utdot;":                    '\U000022F0',
-	"utilde;":                   '\U00000169',
-	"utri;":                     '\U000025B5',
-	"utrif;":                    '\U000025B4',
-	"uuarr;":                    '\U000021C8',
-	"uuml;":                     '\U000000FC',
-	"uwangle;":                  '\U000029A7',
-	"vArr;":                     '\U000021D5',
-	"vBar;":                     '\U00002AE8',
-	"vBarv;":                    '\U00002AE9',
-	"vDash;":                    '\U000022A8',
-	"vangrt;":                   '\U0000299C',
-	"varepsilon;":               '\U000003F5',
-	"varkappa;":                 '\U000003F0',
-	"varnothing;":               '\U00002205',
-	"varphi;":                   '\U000003D5',
-	"varpi;":                    '\U000003D6',
-	"varpropto;":                '\U0000221D',
-	"varr;":                     '\U00002195',
-	"varrho;":                   '\U000003F1',
-	"varsigma;":                 '\U000003C2',
-	"vartheta;":                 '\U000003D1',
-	"vartriangleleft;":          '\U000022B2',
-	"vartriangleright;":         '\U000022B3',
-	"vcy;":                      '\U00000432',
-	"vdash;":                    '\U000022A2',
-	"vee;":                      '\U00002228',
-	"veebar;":                   '\U000022BB',
-	"veeeq;":                    '\U0000225A',
-	"vellip;":                   '\U000022EE',
-	"verbar;":                   '\U0000007C',
-	"vert;":                     '\U0000007C',
-	"vfr;":                      '\U0001D533',
-	"vltri;":                    '\U000022B2',
-	"vopf;":                     '\U0001D567',
-	"vprop;":                    '\U0000221D',
-	"vrtri;":                    '\U000022B3',
-	"vscr;":                     '\U0001D4CB',
-	"vzigzag;":                  '\U0000299A',
-	"wcirc;":                    '\U00000175',
-	"wedbar;":                   '\U00002A5F',
-	"wedge;":                    '\U00002227',
-	"wedgeq;":                   '\U00002259',
-	"weierp;":                   '\U00002118',
-	"wfr;":                      '\U0001D534',
-	"wopf;":                     '\U0001D568',
-	"wp;":                       '\U00002118',
-	"wr;":                       '\U00002240',
-	"wreath;":                   '\U00002240',
-	"wscr;":                     '\U0001D4CC',
-	"xcap;":                     '\U000022C2',
-	"xcirc;":                    '\U000025EF',
-	"xcup;":                     '\U000022C3',
-	"xdtri;":                    '\U000025BD',
-	"xfr;":                      '\U0001D535',
-	"xhArr;":                    '\U000027FA',
-	"xharr;":                    '\U000027F7',
-	"xi;":                       '\U000003BE',
-	"xlArr;":                    '\U000027F8',
-	"xlarr;":                    '\U000027F5',
-	"xmap;":                     '\U000027FC',
-	"xnis;":                     '\U000022FB',
-	"xodot;":                    '\U00002A00',
-	"xopf;":                     '\U0001D569',
-	"xoplus;":                   '\U00002A01',
-	"xotime;":                   '\U00002A02',
-	"xrArr;":                    '\U000027F9',
-	"xrarr;":                    '\U000027F6',
-	"xscr;":                     '\U0001D4CD',
-	"xsqcup;":                   '\U00002A06',
-	"xuplus;":                   '\U00002A04',
-	"xutri;":                    '\U000025B3',
-	"xvee;":                     '\U000022C1',
-	"xwedge;":                   '\U000022C0',
-	"yacute;":                   '\U000000FD',
-	"yacy;":                     '\U0000044F',
-	"ycirc;":                    '\U00000177',
-	"ycy;":                      '\U0000044B',
-	"yen;":                      '\U000000A5',
-	"yfr;":                      '\U0001D536',
-	"yicy;":                     '\U00000457',
-	"yopf;":                     '\U0001D56A',
-	"yscr;":                     '\U0001D4CE',
-	"yucy;":                     '\U0000044E',
-	"yuml;":                     '\U000000FF',
-	"zacute;":                   '\U0000017A',
-	"zcaron;":                   '\U0000017E',
-	"zcy;":                      '\U00000437',
-	"zdot;":                     '\U0000017C',
-	"zeetrf;":                   '\U00002128',
-	"zeta;":                     '\U000003B6',
-	"zfr;":                      '\U0001D537',
-	"zhcy;":                     '\U00000436',
-	"zigrarr;":                  '\U000021DD',
-	"zopf;":                     '\U0001D56B',
-	"zscr;":                     '\U0001D4CF',
-	"zwj;":                      '\U0000200D',
-	"zwnj;":                     '\U0000200C',
-	"AElig":                     '\U000000C6',
-	"AMP":                       '\U00000026',
-	"Aacute":                    '\U000000C1',
-	"Acirc":                     '\U000000C2',
-	"Agrave":                    '\U000000C0',
-	"Aring":                     '\U000000C5',
-	"Atilde":                    '\U000000C3',
-	"Auml":                      '\U000000C4',
-	"COPY":                      '\U000000A9',
-	"Ccedil":                    '\U000000C7',
-	"ETH":                       '\U000000D0',
-	"Eacute":                    '\U000000C9',
-	"Ecirc":                     '\U000000CA',
-	"Egrave":                    '\U000000C8',
-	"Euml":                      '\U000000CB',
-	"GT":                        '\U0000003E',
-	"Iacute":                    '\U000000CD',
-	"Icirc":                     '\U000000CE',
-	"Igrave":                    '\U000000CC',
-	"Iuml":                      '\U000000CF',
-	"LT":                        '\U0000003C',
-	"Ntilde":                    '\U000000D1',
-	"Oacute":                    '\U000000D3',
-	"Ocirc":                     '\U000000D4',
-	"Ograve":                    '\U000000D2',
-	"Oslash":                    '\U000000D8',
-	"Otilde":                    '\U000000D5',
-	"Ouml":                      '\U000000D6',
-	"QUOT":                      '\U00000022',
-	"REG":                       '\U000000AE',
-	"THORN":                     '\U000000DE',
-	"Uacute":                    '\U000000DA',
-	"Ucirc":                     '\U000000DB',
-	"Ugrave":                    '\U000000D9',
-	"Uuml":                      '\U000000DC',
-	"Yacute":                    '\U000000DD',
-	"aacute":                    '\U000000E1',
-	"acirc":                     '\U000000E2',
-	"acute":                     '\U000000B4',
-	"aelig":                     '\U000000E6',
-	"agrave":                    '\U000000E0',
-	"amp":                       '\U00000026',
-	"aring":                     '\U000000E5',
-	"atilde":                    '\U000000E3',
-	"auml":                      '\U000000E4',
-	"brvbar":                    '\U000000A6',
-	"ccedil":                    '\U000000E7',
-	"cedil":                     '\U000000B8',
-	"cent":                      '\U000000A2',
-	"copy":                      '\U000000A9',
-	"curren":                    '\U000000A4',
-	"deg":                       '\U000000B0',
-	"divide":                    '\U000000F7',
-	"eacute":                    '\U000000E9',
-	"ecirc":                     '\U000000EA',
-	"egrave":                    '\U000000E8',
-	"eth":                       '\U000000F0',
-	"euml":                      '\U000000EB',
-	"frac12":                    '\U000000BD',
-	"frac14":                    '\U000000BC',
-	"frac34":                    '\U000000BE',
-	"gt":                        '\U0000003E',
-	"iacute":                    '\U000000ED',
-	"icirc":                     '\U000000EE',
-	"iexcl":                     '\U000000A1',
-	"igrave":                    '\U000000EC',
-	"iquest":                    '\U000000BF',
-	"iuml":                      '\U000000EF',
-	"laquo":                     '\U000000AB',
-	"lt":                        '\U0000003C',
-	"macr":                      '\U000000AF',
-	"micro":                     '\U000000B5',
-	"middot":                    '\U000000B7',
-	"nbsp":                      '\U000000A0',
-	"not":                       '\U000000AC',
-	"ntilde":                    '\U000000F1',
-	"oacute":                    '\U000000F3',
-	"ocirc":                     '\U000000F4',
-	"ograve":                    '\U000000F2',
-	"ordf":                      '\U000000AA',
-	"ordm":                      '\U000000BA',
-	"oslash":                    '\U000000F8',
-	"otilde":                    '\U000000F5',
-	"ouml":                      '\U000000F6',
-	"para":                      '\U000000B6',
-	"plusmn":                    '\U000000B1',
-	"pound":                     '\U000000A3',
-	"quot":                      '\U00000022',
-	"raquo":                     '\U000000BB',
-	"reg":                       '\U000000AE',
-	"sect":                      '\U000000A7',
-	"shy":                       '\U000000AD',
-	"sup1":                      '\U000000B9',
-	"sup2":                      '\U000000B2',
-	"sup3":                      '\U000000B3',
-	"szlig":                     '\U000000DF',
-	"thorn":                     '\U000000FE',
-	"times":                     '\U000000D7',
-	"uacute":                    '\U000000FA',
-	"ucirc":                     '\U000000FB',
-	"ugrave":                    '\U000000F9',
-	"uml":                       '\U000000A8',
-	"uuml":                      '\U000000FC',
-	"yacute":                    '\U000000FD',
-	"yen":                       '\U000000A5',
-	"yuml":                      '\U000000FF',
-}
-
-// HTML entities that are two unicode codepoints.
-var entity2 = map[string][2]rune{
-	// TODO(nigeltao): Handle replacements that are wider than their names.
-	// "nLt;":                     {'\u226A', '\u20D2'},
-	// "nGt;":                     {'\u226B', '\u20D2'},
-	"NotEqualTilde;":           {'\u2242', '\u0338'},
-	"NotGreaterFullEqual;":     {'\u2267', '\u0338'},
-	"NotGreaterGreater;":       {'\u226B', '\u0338'},
-	"NotGreaterSlantEqual;":    {'\u2A7E', '\u0338'},
-	"NotHumpDownHump;":         {'\u224E', '\u0338'},
-	"NotHumpEqual;":            {'\u224F', '\u0338'},
-	"NotLeftTriangleBar;":      {'\u29CF', '\u0338'},
-	"NotLessLess;":             {'\u226A', '\u0338'},
-	"NotLessSlantEqual;":       {'\u2A7D', '\u0338'},
-	"NotNestedGreaterGreater;": {'\u2AA2', '\u0338'},
-	"NotNestedLessLess;":       {'\u2AA1', '\u0338'},
-	"NotPrecedesEqual;":        {'\u2AAF', '\u0338'},
-	"NotRightTriangleBar;":     {'\u29D0', '\u0338'},
-	"NotSquareSubset;":         {'\u228F', '\u0338'},
-	"NotSquareSuperset;":       {'\u2290', '\u0338'},
-	"NotSubset;":               {'\u2282', '\u20D2'},
-	"NotSucceedsEqual;":        {'\u2AB0', '\u0338'},
-	"NotSucceedsTilde;":        {'\u227F', '\u0338'},
-	"NotSuperset;":             {'\u2283', '\u20D2'},
-	"ThickSpace;":              {'\u205F', '\u200A'},
-	"acE;":                     {'\u223E', '\u0333'},
-	"bne;":                     {'\u003D', '\u20E5'},
-	"bnequiv;":                 {'\u2261', '\u20E5'},
-	"caps;":                    {'\u2229', '\uFE00'},
-	"cups;":                    {'\u222A', '\uFE00'},
-	"fjlig;":                   {'\u0066', '\u006A'},
-	"gesl;":                    {'\u22DB', '\uFE00'},
-	"gvertneqq;":               {'\u2269', '\uFE00'},
-	"gvnE;":                    {'\u2269', '\uFE00'},
-	"lates;":                   {'\u2AAD', '\uFE00'},
-	"lesg;":                    {'\u22DA', '\uFE00'},
-	"lvertneqq;":               {'\u2268', '\uFE00'},
-	"lvnE;":                    {'\u2268', '\uFE00'},
-	"nGg;":                     {'\u22D9', '\u0338'},
-	"nGtv;":                    {'\u226B', '\u0338'},
-	"nLl;":                     {'\u22D8', '\u0338'},
-	"nLtv;":                    {'\u226A', '\u0338'},
-	"nang;":                    {'\u2220', '\u20D2'},
-	"napE;":                    {'\u2A70', '\u0338'},
-	"napid;":                   {'\u224B', '\u0338'},
-	"nbump;":                   {'\u224E', '\u0338'},
-	"nbumpe;":                  {'\u224F', '\u0338'},
-	"ncongdot;":                {'\u2A6D', '\u0338'},
-	"nedot;":                   {'\u2250', '\u0338'},
-	"nesim;":                   {'\u2242', '\u0338'},
-	"ngE;":                     {'\u2267', '\u0338'},
-	"ngeqq;":                   {'\u2267', '\u0338'},
-	"ngeqslant;":               {'\u2A7E', '\u0338'},
-	"nges;":                    {'\u2A7E', '\u0338'},
-	"nlE;":                     {'\u2266', '\u0338'},
-	"nleqq;":                   {'\u2266', '\u0338'},
-	"nleqslant;":               {'\u2A7D', '\u0338'},
-	"nles;":                    {'\u2A7D', '\u0338'},
-	"notinE;":                  {'\u22F9', '\u0338'},
-	"notindot;":                {'\u22F5', '\u0338'},
-	"nparsl;":                  {'\u2AFD', '\u20E5'},
-	"npart;":                   {'\u2202', '\u0338'},
-	"npre;":                    {'\u2AAF', '\u0338'},
-	"npreceq;":                 {'\u2AAF', '\u0338'},
-	"nrarrc;":                  {'\u2933', '\u0338'},
-	"nrarrw;":                  {'\u219D', '\u0338'},
-	"nsce;":                    {'\u2AB0', '\u0338'},
-	"nsubE;":                   {'\u2AC5', '\u0338'},
-	"nsubset;":                 {'\u2282', '\u20D2'},
-	"nsubseteqq;":              {'\u2AC5', '\u0338'},
-	"nsucceq;":                 {'\u2AB0', '\u0338'},
-	"nsupE;":                   {'\u2AC6', '\u0338'},
-	"nsupset;":                 {'\u2283', '\u20D2'},
-	"nsupseteqq;":              {'\u2AC6', '\u0338'},
-	"nvap;":                    {'\u224D', '\u20D2'},
-	"nvge;":                    {'\u2265', '\u20D2'},
-	"nvgt;":                    {'\u003E', '\u20D2'},
-	"nvle;":                    {'\u2264', '\u20D2'},
-	"nvlt;":                    {'\u003C', '\u20D2'},
-	"nvltrie;":                 {'\u22B4', '\u20D2'},
-	"nvrtrie;":                 {'\u22B5', '\u20D2'},
-	"nvsim;":                   {'\u223C', '\u20D2'},
-	"race;":                    {'\u223D', '\u0331'},
-	"smtes;":                   {'\u2AAC', '\uFE00'},
-	"sqcaps;":                  {'\u2293', '\uFE00'},
-	"sqcups;":                  {'\u2294', '\uFE00'},
-	"varsubsetneq;":            {'\u228A', '\uFE00'},
-	"varsubsetneqq;":           {'\u2ACB', '\uFE00'},
-	"varsupsetneq;":            {'\u228B', '\uFE00'},
-	"varsupsetneqq;":           {'\u2ACC', '\uFE00'},
-	"vnsub;":                   {'\u2282', '\u20D2'},
-	"vnsup;":                   {'\u2283', '\u20D2'},
-	"vsubnE;":                  {'\u2ACB', '\uFE00'},
-	"vsubne;":                  {'\u228A', '\uFE00'},
-	"vsupnE;":                  {'\u2ACC', '\uFE00'},
-	"vsupne;":                  {'\u228B', '\uFE00'},
-}
diff --git a/third_party/gofrontend/libgo/go/html/entity_test.go b/third_party/gofrontend/libgo/go/html/entity_test.go
deleted file mode 100644
index b53f866..0000000
--- a/third_party/gofrontend/libgo/go/html/entity_test.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package html
-
-import (
-	"testing"
-	"unicode/utf8"
-)
-
-func TestEntityLength(t *testing.T) {
-	// We verify that the length of UTF-8 encoding of each value is <= 1 + len(key).
-	// The +1 comes from the leading "&". This property implies that the length of
-	// unescaped text is <= the length of escaped text.
-	for k, v := range entity {
-		if 1+len(k) < utf8.RuneLen(v) {
-			t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v))
-		}
-		if len(k) > longestEntityWithoutSemicolon && k[len(k)-1] != ';' {
-			t.Errorf("entity name %s is %d characters, but longestEntityWithoutSemicolon=%d", k, len(k), longestEntityWithoutSemicolon)
-		}
-	}
-	for k, v := range entity2 {
-		if 1+len(k) < utf8.RuneLen(v[0])+utf8.RuneLen(v[1]) {
-			t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v[0]) + string(v[1]))
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/html/escape.go b/third_party/gofrontend/libgo/go/html/escape.go
deleted file mode 100644
index f50a4b9..0000000
--- a/third_party/gofrontend/libgo/go/html/escape.go
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package html provides functions for escaping and unescaping HTML text.
-package html
-
-import (
-	"strings"
-	"unicode/utf8"
-)
-
-type writer interface {
-	WriteString(string) (int, error)
-}
-
-// These replacements permit compatibility with old numeric entities that
-// assumed Windows-1252 encoding.
-// http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#consume-a-character-reference
-var replacementTable = [...]rune{
-	'\u20AC', // First entry is what 0x80 should be replaced with.
-	'\u0081',
-	'\u201A',
-	'\u0192',
-	'\u201E',
-	'\u2026',
-	'\u2020',
-	'\u2021',
-	'\u02C6',
-	'\u2030',
-	'\u0160',
-	'\u2039',
-	'\u0152',
-	'\u008D',
-	'\u017D',
-	'\u008F',
-	'\u0090',
-	'\u2018',
-	'\u2019',
-	'\u201C',
-	'\u201D',
-	'\u2022',
-	'\u2013',
-	'\u2014',
-	'\u02DC',
-	'\u2122',
-	'\u0161',
-	'\u203A',
-	'\u0153',
-	'\u009D',
-	'\u017E',
-	'\u0178', // Last entry is 0x9F.
-	// 0x00->'\uFFFD' is handled programmatically.
-	// 0x0D->'\u000D' is a no-op.
-}
-
-// unescapeEntity reads an entity like "&lt;" from b[src:] and writes the
-// corresponding "<" to b[dst:], returning the incremented dst and src cursors.
-// Precondition: b[src] == '&' && dst <= src.
-// attribute should be true if parsing an attribute value.
-func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) {
-	// http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#consume-a-character-reference
-
-	// i starts at 1 because we already know that s[0] == '&'.
-	i, s := 1, b[src:]
-
-	if len(s) <= 1 {
-		b[dst] = b[src]
-		return dst + 1, src + 1
-	}
-
-	if s[i] == '#' {
-		if len(s) <= 3 { // We need to have at least "&#.".
-			b[dst] = b[src]
-			return dst + 1, src + 1
-		}
-		i++
-		c := s[i]
-		hex := false
-		if c == 'x' || c == 'X' {
-			hex = true
-			i++
-		}
-
-		x := '\x00'
-		for i < len(s) {
-			c = s[i]
-			i++
-			if hex {
-				if '0' <= c && c <= '9' {
-					x = 16*x + rune(c) - '0'
-					continue
-				} else if 'a' <= c && c <= 'f' {
-					x = 16*x + rune(c) - 'a' + 10
-					continue
-				} else if 'A' <= c && c <= 'F' {
-					x = 16*x + rune(c) - 'A' + 10
-					continue
-				}
-			} else if '0' <= c && c <= '9' {
-				x = 10*x + rune(c) - '0'
-				continue
-			}
-			if c != ';' {
-				i--
-			}
-			break
-		}
-
-		if i <= 3 { // No characters matched.
-			b[dst] = b[src]
-			return dst + 1, src + 1
-		}
-
-		if 0x80 <= x && x <= 0x9F {
-			// Replace characters from Windows-1252 with UTF-8 equivalents.
-			x = replacementTable[x-0x80]
-		} else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF {
-			// Replace invalid characters with the replacement character.
-			x = '\uFFFD'
-		}
-
-		return dst + utf8.EncodeRune(b[dst:], x), src + i
-	}
-
-	// Consume the maximum number of characters possible, with the
-	// consumed characters matching one of the named references.
-
-	for i < len(s) {
-		c := s[i]
-		i++
-		// Lower-cased characters are more common in entities, so we check for them first.
-		if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' {
-			continue
-		}
-		if c != ';' {
-			i--
-		}
-		break
-	}
-
-	entityName := string(s[1:i])
-	if entityName == "" {
-		// No-op.
-	} else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' {
-		// No-op.
-	} else if x := entity[entityName]; x != 0 {
-		return dst + utf8.EncodeRune(b[dst:], x), src + i
-	} else if x := entity2[entityName]; x[0] != 0 {
-		dst1 := dst + utf8.EncodeRune(b[dst:], x[0])
-		return dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i
-	} else if !attribute {
-		maxLen := len(entityName) - 1
-		if maxLen > longestEntityWithoutSemicolon {
-			maxLen = longestEntityWithoutSemicolon
-		}
-		for j := maxLen; j > 1; j-- {
-			if x := entity[entityName[:j]]; x != 0 {
-				return dst + utf8.EncodeRune(b[dst:], x), src + j + 1
-			}
-		}
-	}
-
-	dst1, src1 = dst+i, src+i
-	copy(b[dst:dst1], b[src:src1])
-	return dst1, src1
-}
-
-// unescape unescapes b's entities in-place, so that "a&lt;b" becomes "a<b".
-func unescape(b []byte) []byte {
-	for i, c := range b {
-		if c == '&' {
-			dst, src := unescapeEntity(b, i, i, false)
-			for src < len(b) {
-				c := b[src]
-				if c == '&' {
-					dst, src = unescapeEntity(b, dst, src, false)
-				} else {
-					b[dst] = c
-					dst, src = dst+1, src+1
-				}
-			}
-			return b[0:dst]
-		}
-	}
-	return b
-}
-
-var htmlEscaper = strings.NewReplacer(
-	`&`, "&amp;",
-	`'`, "&#39;", // "&#39;" is shorter than "&apos;" and apos was not in HTML until HTML5.
-	`<`, "&lt;",
-	`>`, "&gt;",
-	`"`, "&#34;", // "&#34;" is shorter than "&quot;".
-)
-
-// EscapeString escapes special characters like "<" to become "&lt;". It
-// escapes only five such characters: <, >, &, ' and ".
-// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't
-// always true.
-func EscapeString(s string) string {
-	return htmlEscaper.Replace(s)
-}
-
-// UnescapeString unescapes entities like "&lt;" to become "<". It unescapes a
-// larger range of entities than EscapeString escapes. For example, "&aacute;"
-// unescapes to "á", as does "&#225;" and "&xE1;".
-// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't
-// always true.
-func UnescapeString(s string) string {
-	if !strings.Contains(s, "&") {
-		return s
-	}
-	return string(unescape([]byte(s)))
-}
diff --git a/third_party/gofrontend/libgo/go/html/escape_test.go b/third_party/gofrontend/libgo/go/html/escape_test.go
deleted file mode 100644
index 3702626..0000000
--- a/third_party/gofrontend/libgo/go/html/escape_test.go
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package html
-
-import (
-	"strings"
-	"testing"
-)
-
-type unescapeTest struct {
-	// A short description of the test case.
-	desc string
-	// The HTML text.
-	html string
-	// The unescaped text.
-	unescaped string
-}
-
-var unescapeTests = []unescapeTest{
-	// Handle no entities.
-	{
-		"copy",
-		"A\ttext\nstring",
-		"A\ttext\nstring",
-	},
-	// Handle simple named entities.
-	{
-		"simple",
-		"&amp; &gt; &lt;",
-		"& > <",
-	},
-	// Handle hitting the end of the string.
-	{
-		"stringEnd",
-		"&amp &amp",
-		"& &",
-	},
-	// Handle entities with two codepoints.
-	{
-		"multiCodepoint",
-		"text &gesl; blah",
-		"text \u22db\ufe00 blah",
-	},
-	// Handle decimal numeric entities.
-	{
-		"decimalEntity",
-		"Delta = &#916; ",
-		"Delta = Δ ",
-	},
-	// Handle hexadecimal numeric entities.
-	{
-		"hexadecimalEntity",
-		"Lambda = &#x3bb; = &#X3Bb ",
-		"Lambda = λ = λ ",
-	},
-	// Handle numeric early termination.
-	{
-		"numericEnds",
-		"&# &#x &#128;43 &copy = &#169f = &#xa9",
-		"&# &#x €43 © = ©f = ©",
-	},
-	// Handle numeric ISO-8859-1 entity replacements.
-	{
-		"numericReplacements",
-		"Footnote&#x87;",
-		"Footnote‡",
-	},
-	// Handle single ampersand.
-	{
-		"copySingleAmpersand",
-		"&",
-		"&",
-	},
-	// Handle ampersand followed by non-entity.
-	{
-		"copyAmpersandNonEntity",
-		"text &test",
-		"text &test",
-	},
-	// Handle "&#".
-	{
-		"copyAmpersandHash",
-		"text &#",
-		"text &#",
-	},
-}
-
-func TestUnescape(t *testing.T) {
-	for _, tt := range unescapeTests {
-		unescaped := UnescapeString(tt.html)
-		if unescaped != tt.unescaped {
-			t.Errorf("TestUnescape %s: want %q, got %q", tt.desc, tt.unescaped, unescaped)
-		}
-	}
-}
-
-func TestUnescapeEscape(t *testing.T) {
-	ss := []string{
-		``,
-		`abc def`,
-		`a & b`,
-		`a&amp;b`,
-		`a &amp b`,
-		`&quot;`,
-		`"`,
-		`"<&>"`,
-		`&quot;&lt;&amp;&gt;&quot;`,
-		`3&5==1 && 0<1, "0&lt;1", a+acute=&aacute;`,
-		`The special characters are: <, >, &, ' and "`,
-	}
-	for _, s := range ss {
-		if got := UnescapeString(EscapeString(s)); got != s {
-			t.Errorf("got %q want %q", got, s)
-		}
-	}
-}
-
-var (
-	benchEscapeData = strings.Repeat("AAAAA < BBBBB > CCCCC & DDDDD ' EEEEE \" ", 100)
-	benchEscapeNone = strings.Repeat("AAAAA x BBBBB x CCCCC x DDDDD x EEEEE x ", 100)
-)
-
-func BenchmarkEscape(b *testing.B) {
-	n := 0
-	for i := 0; i < b.N; i++ {
-		n += len(EscapeString(benchEscapeData))
-	}
-}
-
-func BenchmarkEscapeNone(b *testing.B) {
-	n := 0
-	for i := 0; i < b.N; i++ {
-		n += len(EscapeString(benchEscapeNone))
-	}
-}
-
-func BenchmarkUnescape(b *testing.B) {
-	s := EscapeString(benchEscapeData)
-	n := 0
-	for i := 0; i < b.N; i++ {
-		n += len(UnescapeString(s))
-	}
-}
-
-func BenchmarkUnescapeNone(b *testing.B) {
-	s := EscapeString(benchEscapeNone)
-	n := 0
-	for i := 0; i < b.N; i++ {
-		n += len(UnescapeString(s))
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/html/example_test.go b/third_party/gofrontend/libgo/go/html/example_test.go
deleted file mode 100644
index d0f0a9b..0000000
--- a/third_party/gofrontend/libgo/go/html/example_test.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package html_test
-
-import (
-	"fmt"
-	"html"
-)
-
-func ExampleEscapeString() {
-	const s = `"Fran & Freddie's Diner" <tasty@example.com>`
-	fmt.Println(html.EscapeString(s))
-	// Output: &#34;Fran &amp; Freddie&#39;s Diner&#34; &lt;tasty@example.com&gt;
-}
-
-func ExampleUnescapeString() {
-	const s = `&quot;Fran &amp; Freddie&#39;s Diner&quot; &lt;tasty@example.com&gt;`
-	fmt.Println(html.UnescapeString(s))
-	// Output: "Fran & Freddie's Diner" <tasty@example.com>
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/attr.go b/third_party/gofrontend/libgo/go/html/template/attr.go
deleted file mode 100644
index d65d340..0000000
--- a/third_party/gofrontend/libgo/go/html/template/attr.go
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"strings"
-)
-
-// attrTypeMap[n] describes the value of the given attribute.
-// If an attribute affects (or can mask) the encoding or interpretation of
-// other content, or affects the contents, idempotency, or credentials of a
-// network message, then the value in this map is contentTypeUnsafe.
-// This map is derived from HTML5, specifically
-// http://www.w3.org/TR/html5/Overview.html#attributes-1
-// as well as "%URI"-typed attributes from
-// http://www.w3.org/TR/html4/index/attributes.html
-var attrTypeMap = map[string]contentType{
-	"accept":          contentTypePlain,
-	"accept-charset":  contentTypeUnsafe,
-	"action":          contentTypeURL,
-	"alt":             contentTypePlain,
-	"archive":         contentTypeURL,
-	"async":           contentTypeUnsafe,
-	"autocomplete":    contentTypePlain,
-	"autofocus":       contentTypePlain,
-	"autoplay":        contentTypePlain,
-	"background":      contentTypeURL,
-	"border":          contentTypePlain,
-	"checked":         contentTypePlain,
-	"cite":            contentTypeURL,
-	"challenge":       contentTypeUnsafe,
-	"charset":         contentTypeUnsafe,
-	"class":           contentTypePlain,
-	"classid":         contentTypeURL,
-	"codebase":        contentTypeURL,
-	"cols":            contentTypePlain,
-	"colspan":         contentTypePlain,
-	"content":         contentTypeUnsafe,
-	"contenteditable": contentTypePlain,
-	"contextmenu":     contentTypePlain,
-	"controls":        contentTypePlain,
-	"coords":          contentTypePlain,
-	"crossorigin":     contentTypeUnsafe,
-	"data":            contentTypeURL,
-	"datetime":        contentTypePlain,
-	"default":         contentTypePlain,
-	"defer":           contentTypeUnsafe,
-	"dir":             contentTypePlain,
-	"dirname":         contentTypePlain,
-	"disabled":        contentTypePlain,
-	"draggable":       contentTypePlain,
-	"dropzone":        contentTypePlain,
-	"enctype":         contentTypeUnsafe,
-	"for":             contentTypePlain,
-	"form":            contentTypeUnsafe,
-	"formaction":      contentTypeURL,
-	"formenctype":     contentTypeUnsafe,
-	"formmethod":      contentTypeUnsafe,
-	"formnovalidate":  contentTypeUnsafe,
-	"formtarget":      contentTypePlain,
-	"headers":         contentTypePlain,
-	"height":          contentTypePlain,
-	"hidden":          contentTypePlain,
-	"high":            contentTypePlain,
-	"href":            contentTypeURL,
-	"hreflang":        contentTypePlain,
-	"http-equiv":      contentTypeUnsafe,
-	"icon":            contentTypeURL,
-	"id":              contentTypePlain,
-	"ismap":           contentTypePlain,
-	"keytype":         contentTypeUnsafe,
-	"kind":            contentTypePlain,
-	"label":           contentTypePlain,
-	"lang":            contentTypePlain,
-	"language":        contentTypeUnsafe,
-	"list":            contentTypePlain,
-	"longdesc":        contentTypeURL,
-	"loop":            contentTypePlain,
-	"low":             contentTypePlain,
-	"manifest":        contentTypeURL,
-	"max":             contentTypePlain,
-	"maxlength":       contentTypePlain,
-	"media":           contentTypePlain,
-	"mediagroup":      contentTypePlain,
-	"method":          contentTypeUnsafe,
-	"min":             contentTypePlain,
-	"multiple":        contentTypePlain,
-	"name":            contentTypePlain,
-	"novalidate":      contentTypeUnsafe,
-	// Skip handler names from
-	// http://www.w3.org/TR/html5/webappapis.html#event-handlers-on-elements,-document-objects,-and-window-objects
-	// since we have special handling in attrType.
-	"open":        contentTypePlain,
-	"optimum":     contentTypePlain,
-	"pattern":     contentTypeUnsafe,
-	"placeholder": contentTypePlain,
-	"poster":      contentTypeURL,
-	"profile":     contentTypeURL,
-	"preload":     contentTypePlain,
-	"pubdate":     contentTypePlain,
-	"radiogroup":  contentTypePlain,
-	"readonly":    contentTypePlain,
-	"rel":         contentTypeUnsafe,
-	"required":    contentTypePlain,
-	"reversed":    contentTypePlain,
-	"rows":        contentTypePlain,
-	"rowspan":     contentTypePlain,
-	"sandbox":     contentTypeUnsafe,
-	"spellcheck":  contentTypePlain,
-	"scope":       contentTypePlain,
-	"scoped":      contentTypePlain,
-	"seamless":    contentTypePlain,
-	"selected":    contentTypePlain,
-	"shape":       contentTypePlain,
-	"size":        contentTypePlain,
-	"sizes":       contentTypePlain,
-	"span":        contentTypePlain,
-	"src":         contentTypeURL,
-	"srcdoc":      contentTypeHTML,
-	"srclang":     contentTypePlain,
-	"start":       contentTypePlain,
-	"step":        contentTypePlain,
-	"style":       contentTypeCSS,
-	"tabindex":    contentTypePlain,
-	"target":      contentTypePlain,
-	"title":       contentTypePlain,
-	"type":        contentTypeUnsafe,
-	"usemap":      contentTypeURL,
-	"value":       contentTypeUnsafe,
-	"width":       contentTypePlain,
-	"wrap":        contentTypePlain,
-	"xmlns":       contentTypeURL,
-}
-
-// attrType returns a conservative (upper-bound on authority) guess at the
-// type of the named attribute.
-func attrType(name string) contentType {
-	name = strings.ToLower(name)
-	if strings.HasPrefix(name, "data-") {
-		// Strip data- so that custom attribute heuristics below are
-		// widely applied.
-		// Treat data-action as URL below.
-		name = name[5:]
-	} else if colon := strings.IndexRune(name, ':'); colon != -1 {
-		if name[:colon] == "xmlns" {
-			return contentTypeURL
-		}
-		// Treat svg:href and xlink:href as href below.
-		name = name[colon+1:]
-	}
-	if t, ok := attrTypeMap[name]; ok {
-		return t
-	}
-	// Treat partial event handler names as script.
-	if strings.HasPrefix(name, "on") {
-		return contentTypeJS
-	}
-
-	// Heuristics to prevent "javascript:..." injection in custom
-	// data attributes and custom attributes like g:tweetUrl.
-	// http://www.w3.org/TR/html5/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes
-	// "Custom data attributes are intended to store custom data
-	//  private to the page or application, for which there are no
-	//  more appropriate attributes or elements."
-	// Developers seem to store URL content in data URLs that start
-	// or end with "URI" or "URL".
-	if strings.Contains(name, "src") ||
-		strings.Contains(name, "uri") ||
-		strings.Contains(name, "url") {
-		return contentTypeURL
-	}
-	return contentTypePlain
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/clone_test.go b/third_party/gofrontend/libgo/go/html/template/clone_test.go
deleted file mode 100644
index c89d22a..0000000
--- a/third_party/gofrontend/libgo/go/html/template/clone_test.go
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"errors"
-	"io/ioutil"
-	"testing"
-	"text/template/parse"
-)
-
-func TestAddParseTree(t *testing.T) {
-	root := Must(New("root").Parse(`{{define "a"}} {{.}} {{template "b"}} {{.}} "></a>{{end}}`))
-	tree, err := parse.Parse("t", `{{define "b"}}<a href="{{end}}`, "", "", nil, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	added := Must(root.AddParseTree("b", tree["b"]))
-	b := new(bytes.Buffer)
-	err = added.ExecuteTemplate(b, "a", "1>0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if got, want := b.String(), ` 1&gt;0 <a href=" 1%3e0 "></a>`; got != want {
-		t.Errorf("got %q want %q", got, want)
-	}
-}
-
-func TestClone(t *testing.T) {
-	// The {{.}} will be executed with data "<i>*/" in different contexts.
-	// In the t0 template, it will be in a text context.
-	// In the t1 template, it will be in a URL context.
-	// In the t2 template, it will be in a JavaScript context.
-	// In the t3 template, it will be in a CSS context.
-	const tmpl = `{{define "a"}}{{template "lhs"}}{{.}}{{template "rhs"}}{{end}}`
-	b := new(bytes.Buffer)
-
-	// Create an incomplete template t0.
-	t0 := Must(New("t0").Parse(tmpl))
-
-	// Clone t0 as t1.
-	t1 := Must(t0.Clone())
-	Must(t1.Parse(`{{define "lhs"}} <a href=" {{end}}`))
-	Must(t1.Parse(`{{define "rhs"}} "></a> {{end}}`))
-
-	// Execute t1.
-	b.Reset()
-	if err := t1.ExecuteTemplate(b, "a", "<i>*/"); err != nil {
-		t.Fatal(err)
-	}
-	if got, want := b.String(), ` <a href=" %3ci%3e*/ "></a> `; got != want {
-		t.Errorf("t1: got %q want %q", got, want)
-	}
-
-	// Clone t0 as t2.
-	t2 := Must(t0.Clone())
-	Must(t2.Parse(`{{define "lhs"}} <p onclick="javascript: {{end}}`))
-	Must(t2.Parse(`{{define "rhs"}} "></p> {{end}}`))
-
-	// Execute t2.
-	b.Reset()
-	if err := t2.ExecuteTemplate(b, "a", "<i>*/"); err != nil {
-		t.Fatal(err)
-	}
-	if got, want := b.String(), ` <p onclick="javascript: &#34;\u003ci\u003e*/&#34; "></p> `; got != want {
-		t.Errorf("t2: got %q want %q", got, want)
-	}
-
-	// Clone t0 as t3, but do not execute t3 yet.
-	t3 := Must(t0.Clone())
-	Must(t3.Parse(`{{define "lhs"}} <style> {{end}}`))
-	Must(t3.Parse(`{{define "rhs"}} </style> {{end}}`))
-
-	// Complete t0.
-	Must(t0.Parse(`{{define "lhs"}} ( {{end}}`))
-	Must(t0.Parse(`{{define "rhs"}} ) {{end}}`))
-
-	// Clone t0 as t4. Redefining the "lhs" template should fail.
-	t4 := Must(t0.Clone())
-	if _, err := t4.Parse(`{{define "lhs"}} FAIL {{end}}`); err == nil {
-		t.Error(`redefine "lhs": got nil err want non-nil`)
-	}
-
-	// Execute t0.
-	b.Reset()
-	if err := t0.ExecuteTemplate(b, "a", "<i>*/"); err != nil {
-		t.Fatal(err)
-	}
-	if got, want := b.String(), ` ( &lt;i&gt;*/ ) `; got != want {
-		t.Errorf("t0: got %q want %q", got, want)
-	}
-
-	// Clone t0. This should fail, as t0 has already executed.
-	if _, err := t0.Clone(); err == nil {
-		t.Error(`t0.Clone(): got nil err want non-nil`)
-	}
-
-	// Similarly, cloning sub-templates should fail.
-	if _, err := t0.Lookup("a").Clone(); err == nil {
-		t.Error(`t0.Lookup("a").Clone(): got nil err want non-nil`)
-	}
-	if _, err := t0.Lookup("lhs").Clone(); err == nil {
-		t.Error(`t0.Lookup("lhs").Clone(): got nil err want non-nil`)
-	}
-
-	// Execute t3.
-	b.Reset()
-	if err := t3.ExecuteTemplate(b, "a", "<i>*/"); err != nil {
-		t.Fatal(err)
-	}
-	if got, want := b.String(), ` <style> ZgotmplZ </style> `; got != want {
-		t.Errorf("t3: got %q want %q", got, want)
-	}
-}
-
-func TestTemplates(t *testing.T) {
-	names := []string{"t0", "a", "lhs", "rhs"}
-	// Some template definitions borrowed from TestClone.
-	const tmpl = `
-		{{define "a"}}{{template "lhs"}}{{.}}{{template "rhs"}}{{end}}
-		{{define "lhs"}} <a href=" {{end}}
-		{{define "rhs"}} "></a> {{end}}`
-	t0 := Must(New("t0").Parse(tmpl))
-	templates := t0.Templates()
-	if len(templates) != len(names) {
-		t.Errorf("expected %d templates; got %d", len(names), len(templates))
-	}
-	for _, name := range names {
-		found := false
-		for _, tmpl := range templates {
-			if name == tmpl.text.Name() {
-				found = true
-				break
-			}
-		}
-		if !found {
-			t.Error("could not find template", name)
-		}
-	}
-}
-
-// This used to crash; https://golang.org/issue/3281
-func TestCloneCrash(t *testing.T) {
-	t1 := New("all")
-	Must(t1.New("t1").Parse(`{{define "foo"}}foo{{end}}`))
-	t1.Clone()
-}
-
-// Ensure that this guarantee from the docs is upheld:
-// "Further calls to Parse in the copy will add templates
-// to the copy but not to the original."
-func TestCloneThenParse(t *testing.T) {
-	t0 := Must(New("t0").Parse(`{{define "a"}}{{template "embedded"}}{{end}}`))
-	t1 := Must(t0.Clone())
-	Must(t1.Parse(`{{define "embedded"}}t1{{end}}`))
-	if len(t0.Templates())+1 != len(t1.Templates()) {
-		t.Error("adding a template to a clone added it to the original")
-	}
-	// double check that the embedded template isn't available in the original
-	err := t0.ExecuteTemplate(ioutil.Discard, "a", nil)
-	if err == nil {
-		t.Error("expected 'no such template' error")
-	}
-}
-
-// https://golang.org/issue/5980
-func TestFuncMapWorksAfterClone(t *testing.T) {
-	funcs := FuncMap{"customFunc": func() (string, error) {
-		return "", errors.New("issue5980")
-	}}
-
-	// get the expected error output (no clone)
-	uncloned := Must(New("").Funcs(funcs).Parse("{{customFunc}}"))
-	wantErr := uncloned.Execute(ioutil.Discard, nil)
-
-	// toClone must be the same as uncloned. It has to be recreated from scratch,
-	// since cloning cannot occur after execution.
-	toClone := Must(New("").Funcs(funcs).Parse("{{customFunc}}"))
-	cloned := Must(toClone.Clone())
-	gotErr := cloned.Execute(ioutil.Discard, nil)
-
-	if wantErr.Error() != gotErr.Error() {
-		t.Errorf("clone error message mismatch want %q got %q", wantErr, gotErr)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/content.go b/third_party/gofrontend/libgo/go/html/template/content.go
deleted file mode 100644
index 3715ed5..0000000
--- a/third_party/gofrontend/libgo/go/html/template/content.go
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"fmt"
-	"reflect"
-)
-
-// Strings of content from a trusted source.
-type (
-	// CSS encapsulates known safe content that matches any of:
-	//   1. The CSS3 stylesheet production, such as `p { color: purple }`.
-	//   2. The CSS3 rule production, such as `a[href=~"https:"].foo#bar`.
-	//   3. CSS3 declaration productions, such as `color: red; margin: 2px`.
-	//   4. The CSS3 value production, such as `rgba(0, 0, 255, 127)`.
-	// See http://www.w3.org/TR/css3-syntax/#parsing and
-	// https://web.archive.org/web/20090211114933/http://w3.org/TR/css3-syntax#style
-	CSS string
-
-	// HTML encapsulates a known safe HTML document fragment.
-	// It should not be used for HTML from a third-party, or HTML with
-	// unclosed tags or comments. The outputs of a sound HTML sanitizer
-	// and a template escaped by this package are fine for use with HTML.
-	HTML string
-
-	// HTMLAttr encapsulates an HTML attribute from a trusted source,
-	// for example, ` dir="ltr"`.
-	HTMLAttr string
-
-	// JS encapsulates a known safe EcmaScript5 Expression, for example,
-	// `(x + y * z())`.
-	// Template authors are responsible for ensuring that typed expressions
-	// do not break the intended precedence and that there is no
-	// statement/expression ambiguity as when passing an expression like
-	// "{ foo: bar() }\n['foo']()", which is both a valid Expression and a
-	// valid Program with a very different meaning.
-	JS string
-
-	// JSStr encapsulates a sequence of characters meant to be embedded
-	// between quotes in a JavaScript expression.
-	// The string must match a series of StringCharacters:
-	//   StringCharacter :: SourceCharacter but not `\` or LineTerminator
-	//                    | EscapeSequence
-	// Note that LineContinuations are not allowed.
-	// JSStr("foo\\nbar") is fine, but JSStr("foo\\\nbar") is not.
-	JSStr string
-
-	// URL encapsulates a known safe URL or URL substring (see RFC 3986).
-	// A URL like `javascript:checkThatFormNotEditedBeforeLeavingPage()`
-	// from a trusted source should go in the page, but by default dynamic
-	// `javascript:` URLs are filtered out since they are a frequently
-	// exploited injection vector.
-	URL string
-)
-
-type contentType uint8
-
-const (
-	contentTypePlain contentType = iota
-	contentTypeCSS
-	contentTypeHTML
-	contentTypeHTMLAttr
-	contentTypeJS
-	contentTypeJSStr
-	contentTypeURL
-	// contentTypeUnsafe is used in attr.go for values that affect how
-	// embedded content and network messages are formed, vetted,
-	// or interpreted; or which credentials network messages carry.
-	contentTypeUnsafe
-)
-
-// indirect returns the value, after dereferencing as many times
-// as necessary to reach the base type (or nil).
-func indirect(a interface{}) interface{} {
-	if a == nil {
-		return nil
-	}
-	if t := reflect.TypeOf(a); t.Kind() != reflect.Ptr {
-		// Avoid creating a reflect.Value if it's not a pointer.
-		return a
-	}
-	v := reflect.ValueOf(a)
-	for v.Kind() == reflect.Ptr && !v.IsNil() {
-		v = v.Elem()
-	}
-	return v.Interface()
-}
-
-var (
-	errorType       = reflect.TypeOf((*error)(nil)).Elem()
-	fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem()
-)
-
-// indirectToStringerOrError returns the value, after dereferencing as many times
-// as necessary to reach the base type (or nil) or an implementation of fmt.Stringer
-// or error,
-func indirectToStringerOrError(a interface{}) interface{} {
-	if a == nil {
-		return nil
-	}
-	v := reflect.ValueOf(a)
-	for !v.Type().Implements(fmtStringerType) && !v.Type().Implements(errorType) && v.Kind() == reflect.Ptr && !v.IsNil() {
-		v = v.Elem()
-	}
-	return v.Interface()
-}
-
-// stringify converts its arguments to a string and the type of the content.
-// All pointers are dereferenced, as in the text/template package.
-func stringify(args ...interface{}) (string, contentType) {
-	if len(args) == 1 {
-		switch s := indirect(args[0]).(type) {
-		case string:
-			return s, contentTypePlain
-		case CSS:
-			return string(s), contentTypeCSS
-		case HTML:
-			return string(s), contentTypeHTML
-		case HTMLAttr:
-			return string(s), contentTypeHTMLAttr
-		case JS:
-			return string(s), contentTypeJS
-		case JSStr:
-			return string(s), contentTypeJSStr
-		case URL:
-			return string(s), contentTypeURL
-		}
-	}
-	for i, arg := range args {
-		args[i] = indirectToStringerOrError(arg)
-	}
-	return fmt.Sprint(args...), contentTypePlain
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/content_test.go b/third_party/gofrontend/libgo/go/html/template/content_test.go
deleted file mode 100644
index e698328..0000000
--- a/third_party/gofrontend/libgo/go/html/template/content_test.go
+++ /dev/null
@@ -1,280 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"fmt"
-	"strings"
-	"testing"
-)
-
-func TestTypedContent(t *testing.T) {
-	data := []interface{}{
-		`<b> "foo%" O'Reilly &bar;`,
-		CSS(`a[href =~ "//example.com"]#foo`),
-		HTML(`Hello, <b>World</b> &amp;tc!`),
-		HTMLAttr(` dir="ltr"`),
-		JS(`c && alert("Hello, World!");`),
-		JSStr(`Hello, World & O'Reilly\x21`),
-		URL(`greeting=H%69&addressee=(World)`),
-	}
-
-	// For each content sensitive escaper, see how it does on
-	// each of the typed strings above.
-	tests := []struct {
-		// A template containing a single {{.}}.
-		input string
-		want  []string
-	}{
-		{
-			`<style>{{.}} { color: blue }</style>`,
-			[]string{
-				`ZgotmplZ`,
-				// Allowed but not escaped.
-				`a[href =~ "//example.com"]#foo`,
-				`ZgotmplZ`,
-				`ZgotmplZ`,
-				`ZgotmplZ`,
-				`ZgotmplZ`,
-				`ZgotmplZ`,
-			},
-		},
-		{
-			`<div style="{{.}}">`,
-			[]string{
-				`ZgotmplZ`,
-				// Allowed and HTML escaped.
-				`a[href =~ &#34;//example.com&#34;]#foo`,
-				`ZgotmplZ`,
-				`ZgotmplZ`,
-				`ZgotmplZ`,
-				`ZgotmplZ`,
-				`ZgotmplZ`,
-			},
-		},
-		{
-			`{{.}}`,
-			[]string{
-				`&lt;b&gt; &#34;foo%&#34; O&#39;Reilly &amp;bar;`,
-				`a[href =~ &#34;//example.com&#34;]#foo`,
-				// Not escaped.
-				`Hello, <b>World</b> &amp;tc!`,
-				` dir=&#34;ltr&#34;`,
-				`c &amp;&amp; alert(&#34;Hello, World!&#34;);`,
-				`Hello, World &amp; O&#39;Reilly\x21`,
-				`greeting=H%69&amp;addressee=(World)`,
-			},
-		},
-		{
-			`<a{{.}}>`,
-			[]string{
-				`ZgotmplZ`,
-				`ZgotmplZ`,
-				`ZgotmplZ`,
-				// Allowed and HTML escaped.
-				` dir="ltr"`,
-				`ZgotmplZ`,
-				`ZgotmplZ`,
-				`ZgotmplZ`,
-			},
-		},
-		{
-			`<a title={{.}}>`,
-			[]string{
-				`&lt;b&gt;&#32;&#34;foo%&#34;&#32;O&#39;Reilly&#32;&amp;bar;`,
-				`a[href&#32;&#61;~&#32;&#34;//example.com&#34;]#foo`,
-				// Tags stripped, spaces escaped, entity not re-escaped.
-				`Hello,&#32;World&#32;&amp;tc!`,
-				`&#32;dir&#61;&#34;ltr&#34;`,
-				`c&#32;&amp;&amp;&#32;alert(&#34;Hello,&#32;World!&#34;);`,
-				`Hello,&#32;World&#32;&amp;&#32;O&#39;Reilly\x21`,
-				`greeting&#61;H%69&amp;addressee&#61;(World)`,
-			},
-		},
-		{
-			`<a title='{{.}}'>`,
-			[]string{
-				`&lt;b&gt; &#34;foo%&#34; O&#39;Reilly &amp;bar;`,
-				`a[href =~ &#34;//example.com&#34;]#foo`,
-				// Tags stripped, entity not re-escaped.
-				`Hello, World &amp;tc!`,
-				` dir=&#34;ltr&#34;`,
-				`c &amp;&amp; alert(&#34;Hello, World!&#34;);`,
-				`Hello, World &amp; O&#39;Reilly\x21`,
-				`greeting=H%69&amp;addressee=(World)`,
-			},
-		},
-		{
-			`<textarea>{{.}}</textarea>`,
-			[]string{
-				`&lt;b&gt; &#34;foo%&#34; O&#39;Reilly &amp;bar;`,
-				`a[href =~ &#34;//example.com&#34;]#foo`,
-				// Angle brackets escaped to prevent injection of close tags, entity not re-escaped.
-				`Hello, &lt;b&gt;World&lt;/b&gt; &amp;tc!`,
-				` dir=&#34;ltr&#34;`,
-				`c &amp;&amp; alert(&#34;Hello, World!&#34;);`,
-				`Hello, World &amp; O&#39;Reilly\x21`,
-				`greeting=H%69&amp;addressee=(World)`,
-			},
-		},
-		{
-			`<script>alert({{.}})</script>`,
-			[]string{
-				`"\u003cb\u003e \"foo%\" O'Reilly \u0026bar;"`,
-				`"a[href =~ \"//example.com\"]#foo"`,
-				`"Hello, \u003cb\u003eWorld\u003c/b\u003e \u0026amp;tc!"`,
-				`" dir=\"ltr\""`,
-				// Not escaped.
-				`c && alert("Hello, World!");`,
-				// Escape sequence not over-escaped.
-				`"Hello, World & O'Reilly\x21"`,
-				`"greeting=H%69\u0026addressee=(World)"`,
-			},
-		},
-		{
-			`<button onclick="alert({{.}})">`,
-			[]string{
-				`&#34;\u003cb\u003e \&#34;foo%\&#34; O&#39;Reilly \u0026bar;&#34;`,
-				`&#34;a[href =~ \&#34;//example.com\&#34;]#foo&#34;`,
-				`&#34;Hello, \u003cb\u003eWorld\u003c/b\u003e \u0026amp;tc!&#34;`,
-				`&#34; dir=\&#34;ltr\&#34;&#34;`,
-				// Not JS escaped but HTML escaped.
-				`c &amp;&amp; alert(&#34;Hello, World!&#34;);`,
-				// Escape sequence not over-escaped.
-				`&#34;Hello, World &amp; O&#39;Reilly\x21&#34;`,
-				`&#34;greeting=H%69\u0026addressee=(World)&#34;`,
-			},
-		},
-		{
-			`<script>alert("{{.}}")</script>`,
-			[]string{
-				`\x3cb\x3e \x22foo%\x22 O\x27Reilly \x26bar;`,
-				`a[href =~ \x22\/\/example.com\x22]#foo`,
-				`Hello, \x3cb\x3eWorld\x3c\/b\x3e \x26amp;tc!`,
-				` dir=\x22ltr\x22`,
-				`c \x26\x26 alert(\x22Hello, World!\x22);`,
-				// Escape sequence not over-escaped.
-				`Hello, World \x26 O\x27Reilly\x21`,
-				`greeting=H%69\x26addressee=(World)`,
-			},
-		},
-		{
-			`<button onclick='alert("{{.}}")'>`,
-			[]string{
-				`\x3cb\x3e \x22foo%\x22 O\x27Reilly \x26bar;`,
-				`a[href =~ \x22\/\/example.com\x22]#foo`,
-				`Hello, \x3cb\x3eWorld\x3c\/b\x3e \x26amp;tc!`,
-				` dir=\x22ltr\x22`,
-				`c \x26\x26 alert(\x22Hello, World!\x22);`,
-				// Escape sequence not over-escaped.
-				`Hello, World \x26 O\x27Reilly\x21`,
-				`greeting=H%69\x26addressee=(World)`,
-			},
-		},
-		{
-			`<a href="?q={{.}}">`,
-			[]string{
-				`%3cb%3e%20%22foo%25%22%20O%27Reilly%20%26bar%3b`,
-				`a%5bhref%20%3d~%20%22%2f%2fexample.com%22%5d%23foo`,
-				`Hello%2c%20%3cb%3eWorld%3c%2fb%3e%20%26amp%3btc%21`,
-				`%20dir%3d%22ltr%22`,
-				`c%20%26%26%20alert%28%22Hello%2c%20World%21%22%29%3b`,
-				`Hello%2c%20World%20%26%20O%27Reilly%5cx21`,
-				// Quotes and parens are escaped but %69 is not over-escaped. HTML escaping is done.
-				`greeting=H%69&amp;addressee=%28World%29`,
-			},
-		},
-		{
-			`<style>body { background: url('?img={{.}}') }</style>`,
-			[]string{
-				`%3cb%3e%20%22foo%25%22%20O%27Reilly%20%26bar%3b`,
-				`a%5bhref%20%3d~%20%22%2f%2fexample.com%22%5d%23foo`,
-				`Hello%2c%20%3cb%3eWorld%3c%2fb%3e%20%26amp%3btc%21`,
-				`%20dir%3d%22ltr%22`,
-				`c%20%26%26%20alert%28%22Hello%2c%20World%21%22%29%3b`,
-				`Hello%2c%20World%20%26%20O%27Reilly%5cx21`,
-				// Quotes and parens are escaped but %69 is not over-escaped. HTML escaping is not done.
-				`greeting=H%69&addressee=%28World%29`,
-			},
-		},
-	}
-
-	for _, test := range tests {
-		tmpl := Must(New("x").Parse(test.input))
-		pre := strings.Index(test.input, "{{.}}")
-		post := len(test.input) - (pre + 5)
-		var b bytes.Buffer
-		for i, x := range data {
-			b.Reset()
-			if err := tmpl.Execute(&b, x); err != nil {
-				t.Errorf("%q with %v: %s", test.input, x, err)
-				continue
-			}
-			if want, got := test.want[i], b.String()[pre:b.Len()-post]; want != got {
-				t.Errorf("%q with %v:\nwant\n\t%q,\ngot\n\t%q\n", test.input, x, want, got)
-				continue
-			}
-		}
-	}
-}
-
-// Test that we print using the String method. Was issue 3073.
-type stringer struct {
-	v int
-}
-
-func (s *stringer) String() string {
-	return fmt.Sprintf("string=%d", s.v)
-}
-
-type errorer struct {
-	v int
-}
-
-func (s *errorer) Error() string {
-	return fmt.Sprintf("error=%d", s.v)
-}
-
-func TestStringer(t *testing.T) {
-	s := &stringer{3}
-	b := new(bytes.Buffer)
-	tmpl := Must(New("x").Parse("{{.}}"))
-	if err := tmpl.Execute(b, s); err != nil {
-		t.Fatal(err)
-	}
-	var expect = "string=3"
-	if b.String() != expect {
-		t.Errorf("expected %q got %q", expect, b.String())
-	}
-	e := &errorer{7}
-	b.Reset()
-	if err := tmpl.Execute(b, e); err != nil {
-		t.Fatal(err)
-	}
-	expect = "error=7"
-	if b.String() != expect {
-		t.Errorf("expected %q got %q", expect, b.String())
-	}
-}
-
-// https://golang.org/issue/5982
-func TestEscapingNilNonemptyInterfaces(t *testing.T) {
-	tmpl := Must(New("x").Parse("{{.E}}"))
-
-	got := new(bytes.Buffer)
-	testData := struct{ E error }{} // any non-empty interface here will do; error is just ready at hand
-	tmpl.Execute(got, testData)
-
-	// Use this data instead of just hard-coding "&lt;nil&gt;" to avoid
-	// dependencies on the html escaper and the behavior of fmt w.r.t. nil.
-	want := new(bytes.Buffer)
-	data := struct{ E string }{E: fmt.Sprint(nil)}
-	tmpl.Execute(want, data)
-
-	if !bytes.Equal(want.Bytes(), got.Bytes()) {
-		t.Errorf("expected %q got %q", string(want.Bytes()), string(got.Bytes()))
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/context.go b/third_party/gofrontend/libgo/go/html/template/context.go
deleted file mode 100644
index 59e794d..0000000
--- a/third_party/gofrontend/libgo/go/html/template/context.go
+++ /dev/null
@@ -1,339 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"fmt"
-)
-
-// context describes the state an HTML parser must be in when it reaches the
-// portion of HTML produced by evaluating a particular template node.
-//
-// The zero value of type context is the start context for a template that
-// produces an HTML fragment as defined at
-// http://www.w3.org/TR/html5/syntax.html#the-end
-// where the context element is null.
-type context struct {
-	state   state
-	delim   delim
-	urlPart urlPart
-	jsCtx   jsCtx
-	attr    attr
-	element element
-	err     *Error
-}
-
-func (c context) String() string {
-	return fmt.Sprintf("{%v %v %v %v %v %v %v}", c.state, c.delim, c.urlPart, c.jsCtx, c.attr, c.element, c.err)
-}
-
-// eq reports whether two contexts are equal.
-func (c context) eq(d context) bool {
-	return c.state == d.state &&
-		c.delim == d.delim &&
-		c.urlPart == d.urlPart &&
-		c.jsCtx == d.jsCtx &&
-		c.attr == d.attr &&
-		c.element == d.element &&
-		c.err == d.err
-}
-
-// mangle produces an identifier that includes a suffix that distinguishes it
-// from template names mangled with different contexts.
-func (c context) mangle(templateName string) string {
-	// The mangled name for the default context is the input templateName.
-	if c.state == stateText {
-		return templateName
-	}
-	s := templateName + "$htmltemplate_" + c.state.String()
-	if c.delim != 0 {
-		s += "_" + c.delim.String()
-	}
-	if c.urlPart != 0 {
-		s += "_" + c.urlPart.String()
-	}
-	if c.jsCtx != 0 {
-		s += "_" + c.jsCtx.String()
-	}
-	if c.attr != 0 {
-		s += "_" + c.attr.String()
-	}
-	if c.element != 0 {
-		s += "_" + c.element.String()
-	}
-	return s
-}
-
-// state describes a high-level HTML parser state.
-//
-// It bounds the top of the element stack, and by extension the HTML insertion
-// mode, but also contains state that does not correspond to anything in the
-// HTML5 parsing algorithm because a single token production in the HTML
-// grammar may contain embedded actions in a template. For instance, the quoted
-// HTML attribute produced by
-//     <div title="Hello {{.World}}">
-// is a single token in HTML's grammar but in a template spans several nodes.
-type state uint8
-
-const (
-	// stateText is parsed character data. An HTML parser is in
-	// this state when its parse position is outside an HTML tag,
-	// directive, comment, and special element body.
-	stateText state = iota
-	// stateTag occurs before an HTML attribute or the end of a tag.
-	stateTag
-	// stateAttrName occurs inside an attribute name.
-	// It occurs between the ^'s in ` ^name^ = value`.
-	stateAttrName
-	// stateAfterName occurs after an attr name has ended but before any
-	// equals sign. It occurs between the ^'s in ` name^ ^= value`.
-	stateAfterName
-	// stateBeforeValue occurs after the equals sign but before the value.
-	// It occurs between the ^'s in ` name =^ ^value`.
-	stateBeforeValue
-	// stateHTMLCmt occurs inside an <!-- HTML comment -->.
-	stateHTMLCmt
-	// stateRCDATA occurs inside an RCDATA element (<textarea> or <title>)
-	// as described at http://www.w3.org/TR/html5/syntax.html#elements-0
-	stateRCDATA
-	// stateAttr occurs inside an HTML attribute whose content is text.
-	stateAttr
-	// stateURL occurs inside an HTML attribute whose content is a URL.
-	stateURL
-	// stateJS occurs inside an event handler or script element.
-	stateJS
-	// stateJSDqStr occurs inside a JavaScript double quoted string.
-	stateJSDqStr
-	// stateJSSqStr occurs inside a JavaScript single quoted string.
-	stateJSSqStr
-	// stateJSRegexp occurs inside a JavaScript regexp literal.
-	stateJSRegexp
-	// stateJSBlockCmt occurs inside a JavaScript /* block comment */.
-	stateJSBlockCmt
-	// stateJSLineCmt occurs inside a JavaScript // line comment.
-	stateJSLineCmt
-	// stateCSS occurs inside a <style> element or style attribute.
-	stateCSS
-	// stateCSSDqStr occurs inside a CSS double quoted string.
-	stateCSSDqStr
-	// stateCSSSqStr occurs inside a CSS single quoted string.
-	stateCSSSqStr
-	// stateCSSDqURL occurs inside a CSS double quoted url("...").
-	stateCSSDqURL
-	// stateCSSSqURL occurs inside a CSS single quoted url('...').
-	stateCSSSqURL
-	// stateCSSURL occurs inside a CSS unquoted url(...).
-	stateCSSURL
-	// stateCSSBlockCmt occurs inside a CSS /* block comment */.
-	stateCSSBlockCmt
-	// stateCSSLineCmt occurs inside a CSS // line comment.
-	stateCSSLineCmt
-	// stateError is an infectious error state outside any valid
-	// HTML/CSS/JS construct.
-	stateError
-)
-
-var stateNames = [...]string{
-	stateText:        "stateText",
-	stateTag:         "stateTag",
-	stateAttrName:    "stateAttrName",
-	stateAfterName:   "stateAfterName",
-	stateBeforeValue: "stateBeforeValue",
-	stateHTMLCmt:     "stateHTMLCmt",
-	stateRCDATA:      "stateRCDATA",
-	stateAttr:        "stateAttr",
-	stateURL:         "stateURL",
-	stateJS:          "stateJS",
-	stateJSDqStr:     "stateJSDqStr",
-	stateJSSqStr:     "stateJSSqStr",
-	stateJSRegexp:    "stateJSRegexp",
-	stateJSBlockCmt:  "stateJSBlockCmt",
-	stateJSLineCmt:   "stateJSLineCmt",
-	stateCSS:         "stateCSS",
-	stateCSSDqStr:    "stateCSSDqStr",
-	stateCSSSqStr:    "stateCSSSqStr",
-	stateCSSDqURL:    "stateCSSDqURL",
-	stateCSSSqURL:    "stateCSSSqURL",
-	stateCSSURL:      "stateCSSURL",
-	stateCSSBlockCmt: "stateCSSBlockCmt",
-	stateCSSLineCmt:  "stateCSSLineCmt",
-	stateError:       "stateError",
-}
-
-func (s state) String() string {
-	if int(s) < len(stateNames) {
-		return stateNames[s]
-	}
-	return fmt.Sprintf("illegal state %d", int(s))
-}
-
-// isComment is true for any state that contains content meant for template
-// authors & maintainers, not for end-users or machines.
-func isComment(s state) bool {
-	switch s {
-	case stateHTMLCmt, stateJSBlockCmt, stateJSLineCmt, stateCSSBlockCmt, stateCSSLineCmt:
-		return true
-	}
-	return false
-}
-
-// isInTag return whether s occurs solely inside an HTML tag.
-func isInTag(s state) bool {
-	switch s {
-	case stateTag, stateAttrName, stateAfterName, stateBeforeValue, stateAttr:
-		return true
-	}
-	return false
-}
-
-// delim is the delimiter that will end the current HTML attribute.
-type delim uint8
-
-const (
-	// delimNone occurs outside any attribute.
-	delimNone delim = iota
-	// delimDoubleQuote occurs when a double quote (") closes the attribute.
-	delimDoubleQuote
-	// delimSingleQuote occurs when a single quote (') closes the attribute.
-	delimSingleQuote
-	// delimSpaceOrTagEnd occurs when a space or right angle bracket (>)
-	// closes the attribute.
-	delimSpaceOrTagEnd
-)
-
-var delimNames = [...]string{
-	delimNone:          "delimNone",
-	delimDoubleQuote:   "delimDoubleQuote",
-	delimSingleQuote:   "delimSingleQuote",
-	delimSpaceOrTagEnd: "delimSpaceOrTagEnd",
-}
-
-func (d delim) String() string {
-	if int(d) < len(delimNames) {
-		return delimNames[d]
-	}
-	return fmt.Sprintf("illegal delim %d", int(d))
-}
-
-// urlPart identifies a part in an RFC 3986 hierarchical URL to allow different
-// encoding strategies.
-type urlPart uint8
-
-const (
-	// urlPartNone occurs when not in a URL, or possibly at the start:
-	// ^ in "^http://auth/path?k=v#frag".
-	urlPartNone urlPart = iota
-	// urlPartPreQuery occurs in the scheme, authority, or path; between the
-	// ^s in "h^ttp://auth/path^?k=v#frag".
-	urlPartPreQuery
-	// urlPartQueryOrFrag occurs in the query portion between the ^s in
-	// "http://auth/path?^k=v#frag^".
-	urlPartQueryOrFrag
-	// urlPartUnknown occurs due to joining of contexts both before and
-	// after the query separator.
-	urlPartUnknown
-)
-
-var urlPartNames = [...]string{
-	urlPartNone:        "urlPartNone",
-	urlPartPreQuery:    "urlPartPreQuery",
-	urlPartQueryOrFrag: "urlPartQueryOrFrag",
-	urlPartUnknown:     "urlPartUnknown",
-}
-
-func (u urlPart) String() string {
-	if int(u) < len(urlPartNames) {
-		return urlPartNames[u]
-	}
-	return fmt.Sprintf("illegal urlPart %d", int(u))
-}
-
-// jsCtx determines whether a '/' starts a regular expression literal or a
-// division operator.
-type jsCtx uint8
-
-const (
-	// jsCtxRegexp occurs where a '/' would start a regexp literal.
-	jsCtxRegexp jsCtx = iota
-	// jsCtxDivOp occurs where a '/' would start a division operator.
-	jsCtxDivOp
-	// jsCtxUnknown occurs where a '/' is ambiguous due to context joining.
-	jsCtxUnknown
-)
-
-func (c jsCtx) String() string {
-	switch c {
-	case jsCtxRegexp:
-		return "jsCtxRegexp"
-	case jsCtxDivOp:
-		return "jsCtxDivOp"
-	case jsCtxUnknown:
-		return "jsCtxUnknown"
-	}
-	return fmt.Sprintf("illegal jsCtx %d", int(c))
-}
-
-// element identifies the HTML element when inside a start tag or special body.
-// Certain HTML element (for example <script> and <style>) have bodies that are
-// treated differently from stateText so the element type is necessary to
-// transition into the correct context at the end of a tag and to identify the
-// end delimiter for the body.
-type element uint8
-
-const (
-	// elementNone occurs outside a special tag or special element body.
-	elementNone element = iota
-	// elementScript corresponds to the raw text <script> element.
-	elementScript
-	// elementStyle corresponds to the raw text <style> element.
-	elementStyle
-	// elementTextarea corresponds to the RCDATA <textarea> element.
-	elementTextarea
-	// elementTitle corresponds to the RCDATA <title> element.
-	elementTitle
-)
-
-var elementNames = [...]string{
-	elementNone:     "elementNone",
-	elementScript:   "elementScript",
-	elementStyle:    "elementStyle",
-	elementTextarea: "elementTextarea",
-	elementTitle:    "elementTitle",
-}
-
-func (e element) String() string {
-	if int(e) < len(elementNames) {
-		return elementNames[e]
-	}
-	return fmt.Sprintf("illegal element %d", int(e))
-}
-
-// attr identifies the most recent HTML attribute when inside a start tag.
-type attr uint8
-
-const (
-	// attrNone corresponds to a normal attribute or no attribute.
-	attrNone attr = iota
-	// attrScript corresponds to an event handler attribute.
-	attrScript
-	// attrStyle corresponds to the style attribute whose value is CSS.
-	attrStyle
-	// attrURL corresponds to an attribute whose value is a URL.
-	attrURL
-)
-
-var attrNames = [...]string{
-	attrNone:   "attrNone",
-	attrScript: "attrScript",
-	attrStyle:  "attrStyle",
-	attrURL:    "attrURL",
-}
-
-func (a attr) String() string {
-	if int(a) < len(attrNames) {
-		return attrNames[a]
-	}
-	return fmt.Sprintf("illegal attr %d", int(a))
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/css.go b/third_party/gofrontend/libgo/go/html/template/css.go
deleted file mode 100644
index 3184648..0000000
--- a/third_party/gofrontend/libgo/go/html/template/css.go
+++ /dev/null
@@ -1,256 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"fmt"
-	"unicode"
-	"unicode/utf8"
-)
-
-// endsWithCSSKeyword reports whether b ends with an ident that
-// case-insensitively matches the lower-case kw.
-func endsWithCSSKeyword(b []byte, kw string) bool {
-	i := len(b) - len(kw)
-	if i < 0 {
-		// Too short.
-		return false
-	}
-	if i != 0 {
-		r, _ := utf8.DecodeLastRune(b[:i])
-		if isCSSNmchar(r) {
-			// Too long.
-			return false
-		}
-	}
-	// Many CSS keywords, such as "!important" can have characters encoded,
-	// but the URI production does not allow that according to
-	// http://www.w3.org/TR/css3-syntax/#TOK-URI
-	// This does not attempt to recognize encoded keywords. For example,
-	// given "\75\72\6c" and "url" this return false.
-	return string(bytes.ToLower(b[i:])) == kw
-}
-
-// isCSSNmchar reports whether rune is allowed anywhere in a CSS identifier.
-func isCSSNmchar(r rune) bool {
-	// Based on the CSS3 nmchar production but ignores multi-rune escape
-	// sequences.
-	// http://www.w3.org/TR/css3-syntax/#SUBTOK-nmchar
-	return 'a' <= r && r <= 'z' ||
-		'A' <= r && r <= 'Z' ||
-		'0' <= r && r <= '9' ||
-		r == '-' ||
-		r == '_' ||
-		// Non-ASCII cases below.
-		0x80 <= r && r <= 0xd7ff ||
-		0xe000 <= r && r <= 0xfffd ||
-		0x10000 <= r && r <= 0x10ffff
-}
-
-// decodeCSS decodes CSS3 escapes given a sequence of stringchars.
-// If there is no change, it returns the input, otherwise it returns a slice
-// backed by a new array.
-// http://www.w3.org/TR/css3-syntax/#SUBTOK-stringchar defines stringchar.
-func decodeCSS(s []byte) []byte {
-	i := bytes.IndexByte(s, '\\')
-	if i == -1 {
-		return s
-	}
-	// The UTF-8 sequence for a codepoint is never longer than 1 + the
-	// number hex digits need to represent that codepoint, so len(s) is an
-	// upper bound on the output length.
-	b := make([]byte, 0, len(s))
-	for len(s) != 0 {
-		i := bytes.IndexByte(s, '\\')
-		if i == -1 {
-			i = len(s)
-		}
-		b, s = append(b, s[:i]...), s[i:]
-		if len(s) < 2 {
-			break
-		}
-		// http://www.w3.org/TR/css3-syntax/#SUBTOK-escape
-		// escape ::= unicode | '\' [#x20-#x7E#x80-#xD7FF#xE000-#xFFFD#x10000-#x10FFFF]
-		if isHex(s[1]) {
-			// http://www.w3.org/TR/css3-syntax/#SUBTOK-unicode
-			//   unicode ::= '\' [0-9a-fA-F]{1,6} wc?
-			j := 2
-			for j < len(s) && j < 7 && isHex(s[j]) {
-				j++
-			}
-			r := hexDecode(s[1:j])
-			if r > unicode.MaxRune {
-				r, j = r/16, j-1
-			}
-			n := utf8.EncodeRune(b[len(b):cap(b)], r)
-			// The optional space at the end allows a hex
-			// sequence to be followed by a literal hex.
-			// string(decodeCSS([]byte(`\A B`))) == "\nB"
-			b, s = b[:len(b)+n], skipCSSSpace(s[j:])
-		} else {
-			// `\\` decodes to `\` and `\"` to `"`.
-			_, n := utf8.DecodeRune(s[1:])
-			b, s = append(b, s[1:1+n]...), s[1+n:]
-		}
-	}
-	return b
-}
-
-// isHex reports whether the given character is a hex digit.
-func isHex(c byte) bool {
-	return '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F'
-}
-
-// hexDecode decodes a short hex digit sequence: "10" -> 16.
-func hexDecode(s []byte) rune {
-	n := '\x00'
-	for _, c := range s {
-		n <<= 4
-		switch {
-		case '0' <= c && c <= '9':
-			n |= rune(c - '0')
-		case 'a' <= c && c <= 'f':
-			n |= rune(c-'a') + 10
-		case 'A' <= c && c <= 'F':
-			n |= rune(c-'A') + 10
-		default:
-			panic(fmt.Sprintf("Bad hex digit in %q", s))
-		}
-	}
-	return n
-}
-
-// skipCSSSpace returns a suffix of c, skipping over a single space.
-func skipCSSSpace(c []byte) []byte {
-	if len(c) == 0 {
-		return c
-	}
-	// wc ::= #x9 | #xA | #xC | #xD | #x20
-	switch c[0] {
-	case '\t', '\n', '\f', ' ':
-		return c[1:]
-	case '\r':
-		// This differs from CSS3's wc production because it contains a
-		// probable spec error whereby wc contains all the single byte
-		// sequences in nl (newline) but not CRLF.
-		if len(c) >= 2 && c[1] == '\n' {
-			return c[2:]
-		}
-		return c[1:]
-	}
-	return c
-}
-
-// isCSSSpace reports whether b is a CSS space char as defined in wc.
-func isCSSSpace(b byte) bool {
-	switch b {
-	case '\t', '\n', '\f', '\r', ' ':
-		return true
-	}
-	return false
-}
-
-// cssEscaper escapes HTML and CSS special characters using \<hex>+ escapes.
-func cssEscaper(args ...interface{}) string {
-	s, _ := stringify(args...)
-	var b bytes.Buffer
-	r, w, written := rune(0), 0, 0
-	for i := 0; i < len(s); i += w {
-		// See comment in htmlEscaper.
-		r, w = utf8.DecodeRuneInString(s[i:])
-		var repl string
-		switch {
-		case int(r) < len(cssReplacementTable) && cssReplacementTable[r] != "":
-			repl = cssReplacementTable[r]
-		default:
-			continue
-		}
-		b.WriteString(s[written:i])
-		b.WriteString(repl)
-		written = i + w
-		if repl != `\\` && (written == len(s) || isHex(s[written]) || isCSSSpace(s[written])) {
-			b.WriteByte(' ')
-		}
-	}
-	if written == 0 {
-		return s
-	}
-	b.WriteString(s[written:])
-	return b.String()
-}
-
-var cssReplacementTable = []string{
-	0:    `\0`,
-	'\t': `\9`,
-	'\n': `\a`,
-	'\f': `\c`,
-	'\r': `\d`,
-	// Encode HTML specials as hex so the output can be embedded
-	// in HTML attributes without further encoding.
-	'"':  `\22`,
-	'&':  `\26`,
-	'\'': `\27`,
-	'(':  `\28`,
-	')':  `\29`,
-	'+':  `\2b`,
-	'/':  `\2f`,
-	':':  `\3a`,
-	';':  `\3b`,
-	'<':  `\3c`,
-	'>':  `\3e`,
-	'\\': `\\`,
-	'{':  `\7b`,
-	'}':  `\7d`,
-}
-
-var expressionBytes = []byte("expression")
-var mozBindingBytes = []byte("mozbinding")
-
-// cssValueFilter allows innocuous CSS values in the output including CSS
-// quantities (10px or 25%), ID or class literals (#foo, .bar), keyword values
-// (inherit, blue), and colors (#888).
-// It filters out unsafe values, such as those that affect token boundaries,
-// and anything that might execute scripts.
-func cssValueFilter(args ...interface{}) string {
-	s, t := stringify(args...)
-	if t == contentTypeCSS {
-		return s
-	}
-	b, id := decodeCSS([]byte(s)), make([]byte, 0, 64)
-
-	// CSS3 error handling is specified as honoring string boundaries per
-	// http://www.w3.org/TR/css3-syntax/#error-handling :
-	//     Malformed declarations. User agents must handle unexpected
-	//     tokens encountered while parsing a declaration by reading until
-	//     the end of the declaration, while observing the rules for
-	//     matching pairs of (), [], {}, "", and '', and correctly handling
-	//     escapes. For example, a malformed declaration may be missing a
-	//     property, colon (:) or value.
-	// So we need to make sure that values do not have mismatched bracket
-	// or quote characters to prevent the browser from restarting parsing
-	// inside a string that might embed JavaScript source.
-	for i, c := range b {
-		switch c {
-		case 0, '"', '\'', '(', ')', '/', ';', '@', '[', '\\', ']', '`', '{', '}':
-			return filterFailsafe
-		case '-':
-			// Disallow <!-- or -->.
-			// -- should not appear in valid identifiers.
-			if i != 0 && b[i-1] == '-' {
-				return filterFailsafe
-			}
-		default:
-			if c < 0x80 && isCSSNmchar(rune(c)) {
-				id = append(id, c)
-			}
-		}
-	}
-	id = bytes.ToLower(id)
-	if bytes.Index(id, expressionBytes) != -1 || bytes.Index(id, mozBindingBytes) != -1 {
-		return filterFailsafe
-	}
-	return string(b)
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/css_test.go b/third_party/gofrontend/libgo/go/html/template/css_test.go
deleted file mode 100644
index a735638..0000000
--- a/third_party/gofrontend/libgo/go/html/template/css_test.go
+++ /dev/null
@@ -1,281 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"strconv"
-	"strings"
-	"testing"
-)
-
-func TestEndsWithCSSKeyword(t *testing.T) {
-	tests := []struct {
-		css, kw string
-		want    bool
-	}{
-		{"", "url", false},
-		{"url", "url", true},
-		{"URL", "url", true},
-		{"Url", "url", true},
-		{"url", "important", false},
-		{"important", "important", true},
-		{"image-url", "url", false},
-		{"imageurl", "url", false},
-		{"image url", "url", true},
-	}
-	for _, test := range tests {
-		got := endsWithCSSKeyword([]byte(test.css), test.kw)
-		if got != test.want {
-			t.Errorf("want %t but got %t for css=%v, kw=%v", test.want, got, test.css, test.kw)
-		}
-	}
-}
-
-func TestIsCSSNmchar(t *testing.T) {
-	tests := []struct {
-		rune rune
-		want bool
-	}{
-		{0, false},
-		{'0', true},
-		{'9', true},
-		{'A', true},
-		{'Z', true},
-		{'a', true},
-		{'z', true},
-		{'_', true},
-		{'-', true},
-		{':', false},
-		{';', false},
-		{' ', false},
-		{0x7f, false},
-		{0x80, true},
-		{0x1234, true},
-		{0xd800, false},
-		{0xdc00, false},
-		{0xfffe, false},
-		{0x10000, true},
-		{0x110000, false},
-	}
-	for _, test := range tests {
-		got := isCSSNmchar(test.rune)
-		if got != test.want {
-			t.Errorf("%q: want %t but got %t", string(test.rune), test.want, got)
-		}
-	}
-}
-
-func TestDecodeCSS(t *testing.T) {
-	tests := []struct {
-		css, want string
-	}{
-		{``, ``},
-		{`foo`, `foo`},
-		{`foo\`, `foo`},
-		{`foo\\`, `foo\`},
-		{`\`, ``},
-		{`\A`, "\n"},
-		{`\a`, "\n"},
-		{`\0a`, "\n"},
-		{`\00000a`, "\n"},
-		{`\000000a`, "\u0000a"},
-		{`\1234 5`, "\u1234" + "5"},
-		{`\1234\20 5`, "\u1234" + " 5"},
-		{`\1234\A 5`, "\u1234" + "\n5"},
-		{"\\1234\t5", "\u1234" + "5"},
-		{"\\1234\n5", "\u1234" + "5"},
-		{"\\1234\r\n5", "\u1234" + "5"},
-		{`\12345`, "\U00012345"},
-		{`\\`, `\`},
-		{`\\ `, `\ `},
-		{`\"`, `"`},
-		{`\'`, `'`},
-		{`\.`, `.`},
-		{`\. .`, `. .`},
-		{
-			`The \3c i\3equick\3c/i\3e,\d\A\3cspan style=\27 color:brown\27\3e brown\3c/span\3e  fox jumps\2028over the \3c canine class=\22lazy\22 \3e dog\3c/canine\3e`,
-			"The <i>quick</i>,\r\n<span style='color:brown'>brown</span> fox jumps\u2028over the <canine class=\"lazy\">dog</canine>",
-		},
-	}
-	for _, test := range tests {
-		got1 := string(decodeCSS([]byte(test.css)))
-		if got1 != test.want {
-			t.Errorf("%q: want\n\t%q\nbut got\n\t%q", test.css, test.want, got1)
-		}
-		recoded := cssEscaper(got1)
-		if got2 := string(decodeCSS([]byte(recoded))); got2 != test.want {
-			t.Errorf("%q: escape & decode not dual for %q", test.css, recoded)
-		}
-	}
-}
-
-func TestHexDecode(t *testing.T) {
-	for i := 0; i < 0x200000; i += 101 /* coprime with 16 */ {
-		s := strconv.FormatInt(int64(i), 16)
-		if got := int(hexDecode([]byte(s))); got != i {
-			t.Errorf("%s: want %d but got %d", s, i, got)
-		}
-		s = strings.ToUpper(s)
-		if got := int(hexDecode([]byte(s))); got != i {
-			t.Errorf("%s: want %d but got %d", s, i, got)
-		}
-	}
-}
-
-func TestSkipCSSSpace(t *testing.T) {
-	tests := []struct {
-		css, want string
-	}{
-		{"", ""},
-		{"foo", "foo"},
-		{"\n", ""},
-		{"\r\n", ""},
-		{"\r", ""},
-		{"\t", ""},
-		{" ", ""},
-		{"\f", ""},
-		{" foo", "foo"},
-		{"  foo", " foo"},
-		{`\20`, `\20`},
-	}
-	for _, test := range tests {
-		got := string(skipCSSSpace([]byte(test.css)))
-		if got != test.want {
-			t.Errorf("%q: want %q but got %q", test.css, test.want, got)
-		}
-	}
-}
-
-func TestCSSEscaper(t *testing.T) {
-	input := ("\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f" +
-		"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
-		` !"#$%&'()*+,-./` +
-		`0123456789:;<=>?` +
-		`@ABCDEFGHIJKLMNO` +
-		`PQRSTUVWXYZ[\]^_` +
-		"`abcdefghijklmno" +
-		"pqrstuvwxyz{|}~\x7f" +
-		"\u00A0\u0100\u2028\u2029\ufeff\U0001D11E")
-
-	want := ("\\0\x01\x02\x03\x04\x05\x06\x07" +
-		"\x08\\9 \\a\x0b\\c \\d\x0E\x0F" +
-		"\x10\x11\x12\x13\x14\x15\x16\x17" +
-		"\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
-		` !\22#$%\26\27\28\29*\2b,-.\2f ` +
-		`0123456789\3a\3b\3c=\3e?` +
-		`@ABCDEFGHIJKLMNO` +
-		`PQRSTUVWXYZ[\\]^_` +
-		"`abcdefghijklmno" +
-		`pqrstuvwxyz\7b|\7d~` + "\u007f" +
-		"\u00A0\u0100\u2028\u2029\ufeff\U0001D11E")
-
-	got := cssEscaper(input)
-	if got != want {
-		t.Errorf("encode: want\n\t%q\nbut got\n\t%q", want, got)
-	}
-
-	got = string(decodeCSS([]byte(got)))
-	if input != got {
-		t.Errorf("decode: want\n\t%q\nbut got\n\t%q", input, got)
-	}
-}
-
-func TestCSSValueFilter(t *testing.T) {
-	tests := []struct {
-		css, want string
-	}{
-		{"", ""},
-		{"foo", "foo"},
-		{"0", "0"},
-		{"0px", "0px"},
-		{"-5px", "-5px"},
-		{"1.25in", "1.25in"},
-		{"+.33em", "+.33em"},
-		{"100%", "100%"},
-		{"12.5%", "12.5%"},
-		{".foo", ".foo"},
-		{"#bar", "#bar"},
-		{"corner-radius", "corner-radius"},
-		{"-moz-corner-radius", "-moz-corner-radius"},
-		{"#000", "#000"},
-		{"#48f", "#48f"},
-		{"#123456", "#123456"},
-		{"U+00-FF, U+980-9FF", "U+00-FF, U+980-9FF"},
-		{"color: red", "color: red"},
-		{"<!--", "ZgotmplZ"},
-		{"-->", "ZgotmplZ"},
-		{"<![CDATA[", "ZgotmplZ"},
-		{"]]>", "ZgotmplZ"},
-		{"</style", "ZgotmplZ"},
-		{`"`, "ZgotmplZ"},
-		{`'`, "ZgotmplZ"},
-		{"`", "ZgotmplZ"},
-		{"\x00", "ZgotmplZ"},
-		{"/* foo */", "ZgotmplZ"},
-		{"//", "ZgotmplZ"},
-		{"[href=~", "ZgotmplZ"},
-		{"expression(alert(1337))", "ZgotmplZ"},
-		{"-expression(alert(1337))", "ZgotmplZ"},
-		{"expression", "ZgotmplZ"},
-		{"Expression", "ZgotmplZ"},
-		{"EXPRESSION", "ZgotmplZ"},
-		{"-moz-binding", "ZgotmplZ"},
-		{"-expr\x00ession(alert(1337))", "ZgotmplZ"},
-		{`-expr\0ession(alert(1337))`, "ZgotmplZ"},
-		{`-express\69on(alert(1337))`, "ZgotmplZ"},
-		{`-express\69 on(alert(1337))`, "ZgotmplZ"},
-		{`-exp\72 ession(alert(1337))`, "ZgotmplZ"},
-		{`-exp\52 ession(alert(1337))`, "ZgotmplZ"},
-		{`-exp\000052 ession(alert(1337))`, "ZgotmplZ"},
-		{`-expre\0000073sion`, "-expre\x073sion"},
-		{`@import url evil.css`, "ZgotmplZ"},
-	}
-	for _, test := range tests {
-		got := cssValueFilter(test.css)
-		if got != test.want {
-			t.Errorf("%q: want %q but got %q", test.css, test.want, got)
-		}
-	}
-}
-
-func BenchmarkCSSEscaper(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		cssEscaper("The <i>quick</i>,\r\n<span style='color:brown'>brown</span> fox jumps\u2028over the <canine class=\"lazy\">dog</canine>")
-	}
-}
-
-func BenchmarkCSSEscaperNoSpecials(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		cssEscaper("The quick, brown fox jumps over the lazy dog.")
-	}
-}
-
-func BenchmarkDecodeCSS(b *testing.B) {
-	s := []byte(`The \3c i\3equick\3c/i\3e,\d\A\3cspan style=\27 color:brown\27\3e brown\3c/span\3e fox jumps\2028over the \3c canine class=\22lazy\22 \3edog\3c/canine\3e`)
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		decodeCSS(s)
-	}
-}
-
-func BenchmarkDecodeCSSNoSpecials(b *testing.B) {
-	s := []byte("The quick, brown fox jumps over the lazy dog.")
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		decodeCSS(s)
-	}
-}
-
-func BenchmarkCSSValueFilter(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		cssValueFilter(`  e\78preS\0Sio/**/n(alert(1337))`)
-	}
-}
-
-func BenchmarkCSSValueFilterOk(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		cssValueFilter(`Times New Roman`)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/doc.go b/third_party/gofrontend/libgo/go/html/template/doc.go
deleted file mode 100644
index 1827403..0000000
--- a/third_party/gofrontend/libgo/go/html/template/doc.go
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package template (html/template) implements data-driven templates for
-generating HTML output safe against code injection. It provides the
-same interface as package text/template and should be used instead of
-text/template whenever the output is HTML.
-
-The documentation here focuses on the security features of the package.
-For information about how to program the templates themselves, see the
-documentation for text/template.
-
-Introduction
-
-This package wraps package text/template so you can share its template API
-to parse and execute HTML templates safely.
-
-  tmpl, err := template.New("name").Parse(...)
-  // Error checking elided
-  err = tmpl.Execute(out, data)
-
-If successful, tmpl will now be injection-safe. Otherwise, err is an error
-defined in the docs for ErrorCode.
-
-HTML templates treat data values as plain text which should be encoded so they
-can be safely embedded in an HTML document. The escaping is contextual, so
-actions can appear within JavaScript, CSS, and URI contexts.
-
-The security model used by this package assumes that template authors are
-trusted, while Execute's data parameter is not. More details are
-provided below.
-
-Example
-
-  import "text/template"
-  ...
-  t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
-  err = t.ExecuteTemplate(out, "T", "<script>alert('you have been pwned')</script>")
-
-produces
-
-  Hello, <script>alert('you have been pwned')</script>!
-
-but the contextual autoescaping in html/template
-
-  import "html/template"
-  ...
-  t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
-  err = t.ExecuteTemplate(out, "T", "<script>alert('you have been pwned')</script>")
-
-produces safe, escaped HTML output
-
-  Hello, &lt;script&gt;alert(&#39;you have been pwned&#39;)&lt;/script&gt;!
-
-
-Contexts
-
-This package understands HTML, CSS, JavaScript, and URIs. It adds sanitizing
-functions to each simple action pipeline, so given the excerpt
-
-  <a href="/search?q={{.}}">{{.}}</a>
-
-At parse time each {{.}} is overwritten to add escaping functions as necessary.
-In this case it becomes
-
-  <a href="/search?q={{. | urlquery}}">{{. | html}}</a>
-
-
-Errors
-
-See the documentation of ErrorCode for details.
-
-
-A fuller picture
-
-The rest of this package comment may be skipped on first reading; it includes
-details necessary to understand escaping contexts and error messages. Most users
-will not need to understand these details.
-
-
-Contexts
-
-Assuming {{.}} is `O'Reilly: How are <i>you</i>?`, the table below shows
-how {{.}} appears when used in the context to the left.
-
-  Context                          {{.}} After
-  {{.}}                            O'Reilly: How are &lt;i&gt;you&lt;/i&gt;?
-  <a title='{{.}}'>                O&#39;Reilly: How are you?
-  <a href="/{{.}}">                O&#39;Reilly: How are %3ci%3eyou%3c/i%3e?
-  <a href="?q={{.}}">              O&#39;Reilly%3a%20How%20are%3ci%3e...%3f
-  <a onx='f("{{.}}")'>             O\x27Reilly: How are \x3ci\x3eyou...?
-  <a onx='f({{.}})'>               "O\x27Reilly: How are \x3ci\x3eyou...?"
-  <a onx='pattern = /{{.}}/;'>     O\x27Reilly: How are \x3ci\x3eyou...\x3f
-
-If used in an unsafe context, then the value might be filtered out:
-
-  Context                          {{.}} After
-  <a href="{{.}}">                 #ZgotmplZ
-
-since "O'Reilly:" is not an allowed protocol like "http:".
-
-
-If {{.}} is the innocuous word, `left`, then it can appear more widely,
-
-  Context                              {{.}} After
-  {{.}}                                left
-  <a title='{{.}}'>                    left
-  <a href='{{.}}'>                     left
-  <a href='/{{.}}'>                    left
-  <a href='?dir={{.}}'>                left
-  <a style="border-{{.}}: 4px">        left
-  <a style="align: {{.}}">             left
-  <a style="background: '{{.}}'>       left
-  <a style="background: url('{{.}}')>  left
-  <style>p.{{.}} {color:red}</style>   left
-
-Non-string values can be used in JavaScript contexts.
-If {{.}} is
-
-  struct{A,B string}{ "foo", "bar" }
-
-in the escaped template
-
-  <script>var pair = {{.}};</script>
-
-then the template output is
-
-  <script>var pair = {"A": "foo", "B": "bar"};</script>
-
-See package json to understand how non-string content is marshalled for
-embedding in JavaScript contexts.
-
-
-Typed Strings
-
-By default, this package assumes that all pipelines produce a plain text string.
-It adds escaping pipeline stages necessary to correctly and safely embed that
-plain text string in the appropriate context.
-
-When a data value is not plain text, you can make sure it is not over-escaped
-by marking it with its type.
-
-Types HTML, JS, URL, and others from content.go can carry safe content that is
-exempted from escaping.
-
-The template
-
-  Hello, {{.}}!
-
-can be invoked with
-
-  tmpl.Execute(out, template.HTML(`<b>World</b>`))
-
-to produce
-
-  Hello, <b>World</b>!
-
-instead of the
-
-  Hello, &lt;b&gt;World&lt;b&gt;!
-
-that would have been produced if {{.}} was a regular string.
-
-
-Security Model
-
-http://js-quasis-libraries-and-repl.googlecode.com/svn/trunk/safetemplate.html#problem_definition defines "safe" as used by this package.
-
-This package assumes that template authors are trusted, that Execute's data
-parameter is not, and seeks to preserve the properties below in the face
-of untrusted data:
-
-Structure Preservation Property:
-"... when a template author writes an HTML tag in a safe templating language,
-the browser will interpret the corresponding portion of the output as a tag
-regardless of the values of untrusted data, and similarly for other structures
-such as attribute boundaries and JS and CSS string boundaries."
-
-Code Effect Property:
-"... only code specified by the template author should run as a result of
-injecting the template output into a page and all code specified by the
-template author should run as a result of the same."
-
-Least Surprise Property:
-"A developer (or code reviewer) familiar with HTML, CSS, and JavaScript, who
-knows that contextual autoescaping happens should be able to look at a {{.}}
-and correctly infer what sanitization happens."
-*/
-package template
diff --git a/third_party/gofrontend/libgo/go/html/template/error.go b/third_party/gofrontend/libgo/go/html/template/error.go
deleted file mode 100644
index 8f99e1b..0000000
--- a/third_party/gofrontend/libgo/go/html/template/error.go
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"fmt"
-	"text/template/parse"
-)
-
-// Error describes a problem encountered during template Escaping.
-type Error struct {
-	// ErrorCode describes the kind of error.
-	ErrorCode ErrorCode
-	// Node is the node that caused the problem, if known.
-	// If not nil, it overrides Name and Line.
-	Node parse.Node
-	// Name is the name of the template in which the error was encountered.
-	Name string
-	// Line is the line number of the error in the template source or 0.
-	Line int
-	// Description is a human-readable description of the problem.
-	Description string
-}
-
-// ErrorCode is a code for a kind of error.
-type ErrorCode int
-
-// We define codes for each error that manifests while escaping templates, but
-// escaped templates may also fail at runtime.
-//
-// Output: "ZgotmplZ"
-// Example:
-//   <img src="{{.X}}">
-//   where {{.X}} evaluates to `javascript:...`
-// Discussion:
-//   "ZgotmplZ" is a special value that indicates that unsafe content reached a
-//   CSS or URL context at runtime. The output of the example will be
-//     <img src="#ZgotmplZ">
-//   If the data comes from a trusted source, use content types to exempt it
-//   from filtering: URL(`javascript:...`).
-const (
-	// OK indicates the lack of an error.
-	OK ErrorCode = iota
-
-	// ErrAmbigContext: "... appears in an ambiguous URL context"
-	// Example:
-	//   <a href="
-	//      {{if .C}}
-	//        /path/
-	//      {{else}}
-	//        /search?q=
-	//      {{end}}
-	//      {{.X}}
-	//   ">
-	// Discussion:
-	//   {{.X}} is in an ambiguous URL context since, depending on {{.C}},
-	//  it may be either a URL suffix or a query parameter.
-	//   Moving {{.X}} into the condition removes the ambiguity:
-	//   <a href="{{if .C}}/path/{{.X}}{{else}}/search?q={{.X}}">
-	ErrAmbigContext
-
-	// ErrBadHTML: "expected space, attr name, or end of tag, but got ...",
-	//   "... in unquoted attr", "... in attribute name"
-	// Example:
-	//   <a href = /search?q=foo>
-	//   <href=foo>
-	//   <form na<e=...>
-	//   <option selected<
-	// Discussion:
-	//   This is often due to a typo in an HTML element, but some runes
-	//   are banned in tag names, attribute names, and unquoted attribute
-	//   values because they can tickle parser ambiguities.
-	//   Quoting all attributes is the best policy.
-	ErrBadHTML
-
-	// ErrBranchEnd: "{{if}} branches end in different contexts"
-	// Example:
-	//   {{if .C}}<a href="{{end}}{{.X}}
-	// Discussion:
-	//   Package html/template statically examines each path through an
-	//   {{if}}, {{range}}, or {{with}} to escape any following pipelines.
-	//   The example is ambiguous since {{.X}} might be an HTML text node,
-	//   or a URL prefix in an HTML attribute. The context of {{.X}} is
-	//   used to figure out how to escape it, but that context depends on
-	//   the run-time value of {{.C}} which is not statically known.
-	//
-	//   The problem is usually something like missing quotes or angle
-	//   brackets, or can be avoided by refactoring to put the two contexts
-	//   into different branches of an if, range or with. If the problem
-	//   is in a {{range}} over a collection that should never be empty,
-	//   adding a dummy {{else}} can help.
-	ErrBranchEnd
-
-	// ErrEndContext: "... ends in a non-text context: ..."
-	// Examples:
-	//   <div
-	//   <div title="no close quote>
-	//   <script>f()
-	// Discussion:
-	//   Executed templates should produce a DocumentFragment of HTML.
-	//   Templates that end without closing tags will trigger this error.
-	//   Templates that should not be used in an HTML context or that
-	//   produce incomplete Fragments should not be executed directly.
-	//
-	//   {{define "main"}} <script>{{template "helper"}}</script> {{end}}
-	//   {{define "helper"}} document.write(' <div title=" ') {{end}}
-	//
-	//   "helper" does not produce a valid document fragment, so should
-	//   not be Executed directly.
-	ErrEndContext
-
-	// ErrNoSuchTemplate: "no such template ..."
-	// Examples:
-	//   {{define "main"}}<div {{template "attrs"}}>{{end}}
-	//   {{define "attrs"}}href="{{.URL}}"{{end}}
-	// Discussion:
-	//   Package html/template looks through template calls to compute the
-	//   context.
-	//   Here the {{.URL}} in "attrs" must be treated as a URL when called
-	//   from "main", but you will get this error if "attrs" is not defined
-	//   when "main" is parsed.
-	ErrNoSuchTemplate
-
-	// ErrOutputContext: "cannot compute output context for template ..."
-	// Examples:
-	//   {{define "t"}}{{if .T}}{{template "t" .T}}{{end}}{{.H}}",{{end}}
-	// Discussion:
-	//   A recursive template does not end in the same context in which it
-	//   starts, and a reliable output context cannot be computed.
-	//   Look for typos in the named template.
-	//   If the template should not be called in the named start context,
-	//   look for calls to that template in unexpected contexts.
-	//   Maybe refactor recursive templates to not be recursive.
-	ErrOutputContext
-
-	// ErrPartialCharset: "unfinished JS regexp charset in ..."
-	// Example:
-	//     <script>var pattern = /foo[{{.Chars}}]/</script>
-	// Discussion:
-	//   Package html/template does not support interpolation into regular
-	//   expression literal character sets.
-	ErrPartialCharset
-
-	// ErrPartialEscape: "unfinished escape sequence in ..."
-	// Example:
-	//   <script>alert("\{{.X}}")</script>
-	// Discussion:
-	//   Package html/template does not support actions following a
-	//   backslash.
-	//   This is usually an error and there are better solutions; for
-	//   example
-	//     <script>alert("{{.X}}")</script>
-	//   should work, and if {{.X}} is a partial escape sequence such as
-	//   "xA0", mark the whole sequence as safe content: JSStr(`\xA0`)
-	ErrPartialEscape
-
-	// ErrRangeLoopReentry: "on range loop re-entry: ..."
-	// Example:
-	//   <script>var x = [{{range .}}'{{.}},{{end}}]</script>
-	// Discussion:
-	//   If an iteration through a range would cause it to end in a
-	//   different context than an earlier pass, there is no single context.
-	//   In the example, there is missing a quote, so it is not clear
-	//   whether {{.}} is meant to be inside a JS string or in a JS value
-	//   context.  The second iteration would produce something like
-	//
-	//     <script>var x = ['firstValue,'secondValue]</script>
-	ErrRangeLoopReentry
-
-	// ErrSlashAmbig: '/' could start a division or regexp.
-	// Example:
-	//   <script>
-	//     {{if .C}}var x = 1{{end}}
-	//     /-{{.N}}/i.test(x) ? doThis : doThat();
-	//   </script>
-	// Discussion:
-	//   The example above could produce `var x = 1/-2/i.test(s)...`
-	//   in which the first '/' is a mathematical division operator or it
-	//   could produce `/-2/i.test(s)` in which the first '/' starts a
-	//   regexp literal.
-	//   Look for missing semicolons inside branches, and maybe add
-	//   parentheses to make it clear which interpretation you intend.
-	ErrSlashAmbig
-)
-
-func (e *Error) Error() string {
-	switch {
-	case e.Node != nil:
-		loc, _ := (*parse.Tree)(nil).ErrorContext(e.Node)
-		return fmt.Sprintf("html/template:%s: %s", loc, e.Description)
-	case e.Line != 0:
-		return fmt.Sprintf("html/template:%s:%d: %s", e.Name, e.Line, e.Description)
-	case e.Name != "":
-		return fmt.Sprintf("html/template:%s: %s", e.Name, e.Description)
-	}
-	return "html/template: " + e.Description
-}
-
-// errorf creates an error given a format string f and args.
-// The template Name still needs to be supplied.
-func errorf(k ErrorCode, node parse.Node, line int, f string, args ...interface{}) *Error {
-	return &Error{k, node, "", line, fmt.Sprintf(f, args...)}
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/escape.go b/third_party/gofrontend/libgo/go/html/template/escape.go
deleted file mode 100644
index 3c18340..0000000
--- a/third_party/gofrontend/libgo/go/html/template/escape.go
+++ /dev/null
@@ -1,809 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"fmt"
-	"html"
-	"io"
-	"text/template"
-	"text/template/parse"
-)
-
-// escapeTemplate rewrites the named template, which must be
-// associated with t, to guarantee that the output of any of the named
-// templates is properly escaped.  If no error is returned, then the named templates have
-// been modified.  Otherwise the named templates have been rendered
-// unusable.
-func escapeTemplate(tmpl *Template, node parse.Node, name string) error {
-	e := newEscaper(tmpl)
-	c, _ := e.escapeTree(context{}, node, name, 0)
-	var err error
-	if c.err != nil {
-		err, c.err.Name = c.err, name
-	} else if c.state != stateText {
-		err = &Error{ErrEndContext, nil, name, 0, fmt.Sprintf("ends in a non-text context: %v", c)}
-	}
-	if err != nil {
-		// Prevent execution of unsafe templates.
-		if t := tmpl.set[name]; t != nil {
-			t.escapeErr = err
-			t.text.Tree = nil
-			t.Tree = nil
-		}
-		return err
-	}
-	e.commit()
-	if t := tmpl.set[name]; t != nil {
-		t.escapeErr = escapeOK
-		t.Tree = t.text.Tree
-	}
-	return nil
-}
-
-// funcMap maps command names to functions that render their inputs safe.
-var funcMap = template.FuncMap{
-	"html_template_attrescaper":     attrEscaper,
-	"html_template_commentescaper":  commentEscaper,
-	"html_template_cssescaper":      cssEscaper,
-	"html_template_cssvaluefilter":  cssValueFilter,
-	"html_template_htmlnamefilter":  htmlNameFilter,
-	"html_template_htmlescaper":     htmlEscaper,
-	"html_template_jsregexpescaper": jsRegexpEscaper,
-	"html_template_jsstrescaper":    jsStrEscaper,
-	"html_template_jsvalescaper":    jsValEscaper,
-	"html_template_nospaceescaper":  htmlNospaceEscaper,
-	"html_template_rcdataescaper":   rcdataEscaper,
-	"html_template_urlescaper":      urlEscaper,
-	"html_template_urlfilter":       urlFilter,
-	"html_template_urlnormalizer":   urlNormalizer,
-}
-
-// equivEscapers matches contextual escapers to equivalent template builtins.
-var equivEscapers = map[string]string{
-	"html_template_attrescaper":    "html",
-	"html_template_htmlescaper":    "html",
-	"html_template_nospaceescaper": "html",
-	"html_template_rcdataescaper":  "html",
-	"html_template_urlescaper":     "urlquery",
-	"html_template_urlnormalizer":  "urlquery",
-}
-
-// escaper collects type inferences about templates and changes needed to make
-// templates injection safe.
-type escaper struct {
-	tmpl *Template
-	// output[templateName] is the output context for a templateName that
-	// has been mangled to include its input context.
-	output map[string]context
-	// derived[c.mangle(name)] maps to a template derived from the template
-	// named name templateName for the start context c.
-	derived map[string]*template.Template
-	// called[templateName] is a set of called mangled template names.
-	called map[string]bool
-	// xxxNodeEdits are the accumulated edits to apply during commit.
-	// Such edits are not applied immediately in case a template set
-	// executes a given template in different escaping contexts.
-	actionNodeEdits   map[*parse.ActionNode][]string
-	templateNodeEdits map[*parse.TemplateNode]string
-	textNodeEdits     map[*parse.TextNode][]byte
-}
-
-// newEscaper creates a blank escaper for the given set.
-func newEscaper(t *Template) *escaper {
-	return &escaper{
-		t,
-		map[string]context{},
-		map[string]*template.Template{},
-		map[string]bool{},
-		map[*parse.ActionNode][]string{},
-		map[*parse.TemplateNode]string{},
-		map[*parse.TextNode][]byte{},
-	}
-}
-
-// filterFailsafe is an innocuous word that is emitted in place of unsafe values
-// by sanitizer functions. It is not a keyword in any programming language,
-// contains no special characters, is not empty, and when it appears in output
-// it is distinct enough that a developer can find the source of the problem
-// via a search engine.
-const filterFailsafe = "ZgotmplZ"
-
-// escape escapes a template node.
-func (e *escaper) escape(c context, n parse.Node) context {
-	switch n := n.(type) {
-	case *parse.ActionNode:
-		return e.escapeAction(c, n)
-	case *parse.IfNode:
-		return e.escapeBranch(c, &n.BranchNode, "if")
-	case *parse.ListNode:
-		return e.escapeList(c, n)
-	case *parse.RangeNode:
-		return e.escapeBranch(c, &n.BranchNode, "range")
-	case *parse.TemplateNode:
-		return e.escapeTemplate(c, n)
-	case *parse.TextNode:
-		return e.escapeText(c, n)
-	case *parse.WithNode:
-		return e.escapeBranch(c, &n.BranchNode, "with")
-	}
-	panic("escaping " + n.String() + " is unimplemented")
-}
-
-// escapeAction escapes an action template node.
-func (e *escaper) escapeAction(c context, n *parse.ActionNode) context {
-	if len(n.Pipe.Decl) != 0 {
-		// A local variable assignment, not an interpolation.
-		return c
-	}
-	c = nudge(c)
-	s := make([]string, 0, 3)
-	switch c.state {
-	case stateError:
-		return c
-	case stateURL, stateCSSDqStr, stateCSSSqStr, stateCSSDqURL, stateCSSSqURL, stateCSSURL:
-		switch c.urlPart {
-		case urlPartNone:
-			s = append(s, "html_template_urlfilter")
-			fallthrough
-		case urlPartPreQuery:
-			switch c.state {
-			case stateCSSDqStr, stateCSSSqStr:
-				s = append(s, "html_template_cssescaper")
-			default:
-				s = append(s, "html_template_urlnormalizer")
-			}
-		case urlPartQueryOrFrag:
-			s = append(s, "html_template_urlescaper")
-		case urlPartUnknown:
-			return context{
-				state: stateError,
-				err:   errorf(ErrAmbigContext, n, n.Line, "%s appears in an ambiguous URL context", n),
-			}
-		default:
-			panic(c.urlPart.String())
-		}
-	case stateJS:
-		s = append(s, "html_template_jsvalescaper")
-		// A slash after a value starts a div operator.
-		c.jsCtx = jsCtxDivOp
-	case stateJSDqStr, stateJSSqStr:
-		s = append(s, "html_template_jsstrescaper")
-	case stateJSRegexp:
-		s = append(s, "html_template_jsregexpescaper")
-	case stateCSS:
-		s = append(s, "html_template_cssvaluefilter")
-	case stateText:
-		s = append(s, "html_template_htmlescaper")
-	case stateRCDATA:
-		s = append(s, "html_template_rcdataescaper")
-	case stateAttr:
-		// Handled below in delim check.
-	case stateAttrName, stateTag:
-		c.state = stateAttrName
-		s = append(s, "html_template_htmlnamefilter")
-	default:
-		if isComment(c.state) {
-			s = append(s, "html_template_commentescaper")
-		} else {
-			panic("unexpected state " + c.state.String())
-		}
-	}
-	switch c.delim {
-	case delimNone:
-		// No extra-escaping needed for raw text content.
-	case delimSpaceOrTagEnd:
-		s = append(s, "html_template_nospaceescaper")
-	default:
-		s = append(s, "html_template_attrescaper")
-	}
-	e.editActionNode(n, s)
-	return c
-}
-
-// allIdents returns the names of the identifiers under the Ident field of the node,
-// which might be a singleton (Identifier) or a slice (Field or Chain).
-func allIdents(node parse.Node) []string {
-	switch node := node.(type) {
-	case *parse.IdentifierNode:
-		return []string{node.Ident}
-	case *parse.FieldNode:
-		return node.Ident
-	case *parse.ChainNode:
-		return node.Field
-	}
-	return nil
-}
-
-// ensurePipelineContains ensures that the pipeline has commands with
-// the identifiers in s in order.
-// If the pipeline already has some of the sanitizers, do not interfere.
-// For example, if p is (.X | html) and s is ["escapeJSVal", "html"] then it
-// has one matching, "html", and one to insert, "escapeJSVal", to produce
-// (.X | escapeJSVal | html).
-func ensurePipelineContains(p *parse.PipeNode, s []string) {
-	if len(s) == 0 {
-		return
-	}
-	n := len(p.Cmds)
-	// Find the identifiers at the end of the command chain.
-	idents := p.Cmds
-	for i := n - 1; i >= 0; i-- {
-		if cmd := p.Cmds[i]; len(cmd.Args) != 0 {
-			if _, ok := cmd.Args[0].(*parse.IdentifierNode); ok {
-				continue
-			}
-		}
-		idents = p.Cmds[i+1:]
-	}
-	dups := 0
-	for _, idNode := range idents {
-		for _, ident := range allIdents(idNode.Args[0]) {
-			if escFnsEq(s[dups], ident) {
-				dups++
-				if dups == len(s) {
-					return
-				}
-			}
-		}
-	}
-	newCmds := make([]*parse.CommandNode, n-len(idents), n+len(s)-dups)
-	copy(newCmds, p.Cmds)
-	// Merge existing identifier commands with the sanitizers needed.
-	for _, idNode := range idents {
-		pos := idNode.Args[0].Position()
-		for _, ident := range allIdents(idNode.Args[0]) {
-			i := indexOfStr(ident, s, escFnsEq)
-			if i != -1 {
-				for _, name := range s[:i] {
-					newCmds = appendCmd(newCmds, newIdentCmd(name, pos))
-				}
-				s = s[i+1:]
-			}
-		}
-		newCmds = appendCmd(newCmds, idNode)
-	}
-	// Create any remaining sanitizers.
-	for _, name := range s {
-		newCmds = appendCmd(newCmds, newIdentCmd(name, p.Position()))
-	}
-	p.Cmds = newCmds
-}
-
-// redundantFuncs[a][b] implies that funcMap[b](funcMap[a](x)) == funcMap[a](x)
-// for all x.
-var redundantFuncs = map[string]map[string]bool{
-	"html_template_commentescaper": {
-		"html_template_attrescaper":    true,
-		"html_template_nospaceescaper": true,
-		"html_template_htmlescaper":    true,
-	},
-	"html_template_cssescaper": {
-		"html_template_attrescaper": true,
-	},
-	"html_template_jsregexpescaper": {
-		"html_template_attrescaper": true,
-	},
-	"html_template_jsstrescaper": {
-		"html_template_attrescaper": true,
-	},
-	"html_template_urlescaper": {
-		"html_template_urlnormalizer": true,
-	},
-}
-
-// appendCmd appends the given command to the end of the command pipeline
-// unless it is redundant with the last command.
-func appendCmd(cmds []*parse.CommandNode, cmd *parse.CommandNode) []*parse.CommandNode {
-	if n := len(cmds); n != 0 {
-		last, okLast := cmds[n-1].Args[0].(*parse.IdentifierNode)
-		next, okNext := cmd.Args[0].(*parse.IdentifierNode)
-		if okLast && okNext && redundantFuncs[last.Ident][next.Ident] {
-			return cmds
-		}
-	}
-	return append(cmds, cmd)
-}
-
-// indexOfStr is the first i such that eq(s, strs[i]) or -1 if s was not found.
-func indexOfStr(s string, strs []string, eq func(a, b string) bool) int {
-	for i, t := range strs {
-		if eq(s, t) {
-			return i
-		}
-	}
-	return -1
-}
-
-// escFnsEq reports whether the two escaping functions are equivalent.
-func escFnsEq(a, b string) bool {
-	if e := equivEscapers[a]; e != "" {
-		a = e
-	}
-	if e := equivEscapers[b]; e != "" {
-		b = e
-	}
-	return a == b
-}
-
-// newIdentCmd produces a command containing a single identifier node.
-func newIdentCmd(identifier string, pos parse.Pos) *parse.CommandNode {
-	return &parse.CommandNode{
-		NodeType: parse.NodeCommand,
-		Args:     []parse.Node{parse.NewIdentifier(identifier).SetTree(nil).SetPos(pos)}, // TODO: SetTree.
-	}
-}
-
-// nudge returns the context that would result from following empty string
-// transitions from the input context.
-// For example, parsing:
-//     `<a href=`
-// will end in context{stateBeforeValue, attrURL}, but parsing one extra rune:
-//     `<a href=x`
-// will end in context{stateURL, delimSpaceOrTagEnd, ...}.
-// There are two transitions that happen when the 'x' is seen:
-// (1) Transition from a before-value state to a start-of-value state without
-//     consuming any character.
-// (2) Consume 'x' and transition past the first value character.
-// In this case, nudging produces the context after (1) happens.
-func nudge(c context) context {
-	switch c.state {
-	case stateTag:
-		// In `<foo {{.}}`, the action should emit an attribute.
-		c.state = stateAttrName
-	case stateBeforeValue:
-		// In `<foo bar={{.}}`, the action is an undelimited value.
-		c.state, c.delim, c.attr = attrStartStates[c.attr], delimSpaceOrTagEnd, attrNone
-	case stateAfterName:
-		// In `<foo bar {{.}}`, the action is an attribute name.
-		c.state, c.attr = stateAttrName, attrNone
-	}
-	return c
-}
-
-// join joins the two contexts of a branch template node. The result is an
-// error context if either of the input contexts are error contexts, or if the
-// the input contexts differ.
-func join(a, b context, node parse.Node, nodeName string) context {
-	if a.state == stateError {
-		return a
-	}
-	if b.state == stateError {
-		return b
-	}
-	if a.eq(b) {
-		return a
-	}
-
-	c := a
-	c.urlPart = b.urlPart
-	if c.eq(b) {
-		// The contexts differ only by urlPart.
-		c.urlPart = urlPartUnknown
-		return c
-	}
-
-	c = a
-	c.jsCtx = b.jsCtx
-	if c.eq(b) {
-		// The contexts differ only by jsCtx.
-		c.jsCtx = jsCtxUnknown
-		return c
-	}
-
-	// Allow a nudged context to join with an unnudged one.
-	// This means that
-	//   <p title={{if .C}}{{.}}{{end}}
-	// ends in an unquoted value state even though the else branch
-	// ends in stateBeforeValue.
-	if c, d := nudge(a), nudge(b); !(c.eq(a) && d.eq(b)) {
-		if e := join(c, d, node, nodeName); e.state != stateError {
-			return e
-		}
-	}
-
-	return context{
-		state: stateError,
-		err:   errorf(ErrBranchEnd, node, 0, "{{%s}} branches end in different contexts: %v, %v", nodeName, a, b),
-	}
-}
-
-// escapeBranch escapes a branch template node: "if", "range" and "with".
-func (e *escaper) escapeBranch(c context, n *parse.BranchNode, nodeName string) context {
-	c0 := e.escapeList(c, n.List)
-	if nodeName == "range" && c0.state != stateError {
-		// The "true" branch of a "range" node can execute multiple times.
-		// We check that executing n.List once results in the same context
-		// as executing n.List twice.
-		c1, _ := e.escapeListConditionally(c0, n.List, nil)
-		c0 = join(c0, c1, n, nodeName)
-		if c0.state == stateError {
-			// Make clear that this is a problem on loop re-entry
-			// since developers tend to overlook that branch when
-			// debugging templates.
-			c0.err.Line = n.Line
-			c0.err.Description = "on range loop re-entry: " + c0.err.Description
-			return c0
-		}
-	}
-	c1 := e.escapeList(c, n.ElseList)
-	return join(c0, c1, n, nodeName)
-}
-
-// escapeList escapes a list template node.
-func (e *escaper) escapeList(c context, n *parse.ListNode) context {
-	if n == nil {
-		return c
-	}
-	for _, m := range n.Nodes {
-		c = e.escape(c, m)
-	}
-	return c
-}
-
-// escapeListConditionally escapes a list node but only preserves edits and
-// inferences in e if the inferences and output context satisfy filter.
-// It returns the best guess at an output context, and the result of the filter
-// which is the same as whether e was updated.
-func (e *escaper) escapeListConditionally(c context, n *parse.ListNode, filter func(*escaper, context) bool) (context, bool) {
-	e1 := newEscaper(e.tmpl)
-	// Make type inferences available to f.
-	for k, v := range e.output {
-		e1.output[k] = v
-	}
-	c = e1.escapeList(c, n)
-	ok := filter != nil && filter(e1, c)
-	if ok {
-		// Copy inferences and edits from e1 back into e.
-		for k, v := range e1.output {
-			e.output[k] = v
-		}
-		for k, v := range e1.derived {
-			e.derived[k] = v
-		}
-		for k, v := range e1.called {
-			e.called[k] = v
-		}
-		for k, v := range e1.actionNodeEdits {
-			e.editActionNode(k, v)
-		}
-		for k, v := range e1.templateNodeEdits {
-			e.editTemplateNode(k, v)
-		}
-		for k, v := range e1.textNodeEdits {
-			e.editTextNode(k, v)
-		}
-	}
-	return c, ok
-}
-
-// escapeTemplate escapes a {{template}} call node.
-func (e *escaper) escapeTemplate(c context, n *parse.TemplateNode) context {
-	c, name := e.escapeTree(c, n, n.Name, n.Line)
-	if name != n.Name {
-		e.editTemplateNode(n, name)
-	}
-	return c
-}
-
-// escapeTree escapes the named template starting in the given context as
-// necessary and returns its output context.
-func (e *escaper) escapeTree(c context, node parse.Node, name string, line int) (context, string) {
-	// Mangle the template name with the input context to produce a reliable
-	// identifier.
-	dname := c.mangle(name)
-	e.called[dname] = true
-	if out, ok := e.output[dname]; ok {
-		// Already escaped.
-		return out, dname
-	}
-	t := e.template(name)
-	if t == nil {
-		// Two cases: The template exists but is empty, or has never been mentioned at
-		// all. Distinguish the cases in the error messages.
-		if e.tmpl.set[name] != nil {
-			return context{
-				state: stateError,
-				err:   errorf(ErrNoSuchTemplate, node, line, "%q is an incomplete or empty template", name),
-			}, dname
-		}
-		return context{
-			state: stateError,
-			err:   errorf(ErrNoSuchTemplate, node, line, "no such template %q", name),
-		}, dname
-	}
-	if dname != name {
-		// Use any template derived during an earlier call to escapeTemplate
-		// with different top level templates, or clone if necessary.
-		dt := e.template(dname)
-		if dt == nil {
-			dt = template.New(dname)
-			dt.Tree = &parse.Tree{Name: dname, Root: t.Root.CopyList()}
-			e.derived[dname] = dt
-		}
-		t = dt
-	}
-	return e.computeOutCtx(c, t), dname
-}
-
-// computeOutCtx takes a template and its start context and computes the output
-// context while storing any inferences in e.
-func (e *escaper) computeOutCtx(c context, t *template.Template) context {
-	// Propagate context over the body.
-	c1, ok := e.escapeTemplateBody(c, t)
-	if !ok {
-		// Look for a fixed point by assuming c1 as the output context.
-		if c2, ok2 := e.escapeTemplateBody(c1, t); ok2 {
-			c1, ok = c2, true
-		}
-		// Use c1 as the error context if neither assumption worked.
-	}
-	if !ok && c1.state != stateError {
-		return context{
-			state: stateError,
-			err:   errorf(ErrOutputContext, t.Tree.Root, 0, "cannot compute output context for template %s", t.Name()),
-		}
-	}
-	return c1
-}
-
-// escapeTemplateBody escapes the given template assuming the given output
-// context, and returns the best guess at the output context and whether the
-// assumption was correct.
-func (e *escaper) escapeTemplateBody(c context, t *template.Template) (context, bool) {
-	filter := func(e1 *escaper, c1 context) bool {
-		if c1.state == stateError {
-			// Do not update the input escaper, e.
-			return false
-		}
-		if !e1.called[t.Name()] {
-			// If t is not recursively called, then c1 is an
-			// accurate output context.
-			return true
-		}
-		// c1 is accurate if it matches our assumed output context.
-		return c.eq(c1)
-	}
-	// We need to assume an output context so that recursive template calls
-	// take the fast path out of escapeTree instead of infinitely recursing.
-	// Naively assuming that the input context is the same as the output
-	// works >90% of the time.
-	e.output[t.Name()] = c
-	return e.escapeListConditionally(c, t.Tree.Root, filter)
-}
-
-// delimEnds maps each delim to a string of characters that terminate it.
-var delimEnds = [...]string{
-	delimDoubleQuote: `"`,
-	delimSingleQuote: "'",
-	// Determined empirically by running the below in various browsers.
-	// var div = document.createElement("DIV");
-	// for (var i = 0; i < 0x10000; ++i) {
-	//   div.innerHTML = "<span title=x" + String.fromCharCode(i) + "-bar>";
-	//   if (div.getElementsByTagName("SPAN")[0].title.indexOf("bar") < 0)
-	//     document.write("<p>U+" + i.toString(16));
-	// }
-	delimSpaceOrTagEnd: " \t\n\f\r>",
-}
-
-var doctypeBytes = []byte("<!DOCTYPE")
-
-// escapeText escapes a text template node.
-func (e *escaper) escapeText(c context, n *parse.TextNode) context {
-	s, written, i, b := n.Text, 0, 0, new(bytes.Buffer)
-	for i != len(s) {
-		c1, nread := contextAfterText(c, s[i:])
-		i1 := i + nread
-		if c.state == stateText || c.state == stateRCDATA {
-			end := i1
-			if c1.state != c.state {
-				for j := end - 1; j >= i; j-- {
-					if s[j] == '<' {
-						end = j
-						break
-					}
-				}
-			}
-			for j := i; j < end; j++ {
-				if s[j] == '<' && !bytes.HasPrefix(bytes.ToUpper(s[j:]), doctypeBytes) {
-					b.Write(s[written:j])
-					b.WriteString("&lt;")
-					written = j + 1
-				}
-			}
-		} else if isComment(c.state) && c.delim == delimNone {
-			switch c.state {
-			case stateJSBlockCmt:
-				// http://es5.github.com/#x7.4:
-				// "Comments behave like white space and are
-				// discarded except that, if a MultiLineComment
-				// contains a line terminator character, then
-				// the entire comment is considered to be a
-				// LineTerminator for purposes of parsing by
-				// the syntactic grammar."
-				if bytes.IndexAny(s[written:i1], "\n\r\u2028\u2029") != -1 {
-					b.WriteByte('\n')
-				} else {
-					b.WriteByte(' ')
-				}
-			case stateCSSBlockCmt:
-				b.WriteByte(' ')
-			}
-			written = i1
-		}
-		if c.state != c1.state && isComment(c1.state) && c1.delim == delimNone {
-			// Preserve the portion between written and the comment start.
-			cs := i1 - 2
-			if c1.state == stateHTMLCmt {
-				// "<!--" instead of "/*" or "//"
-				cs -= 2
-			}
-			b.Write(s[written:cs])
-			written = i1
-		}
-		if i == i1 && c.state == c1.state {
-			panic(fmt.Sprintf("infinite loop from %v to %v on %q..%q", c, c1, s[:i], s[i:]))
-		}
-		c, i = c1, i1
-	}
-
-	if written != 0 && c.state != stateError {
-		if !isComment(c.state) || c.delim != delimNone {
-			b.Write(n.Text[written:])
-		}
-		e.editTextNode(n, b.Bytes())
-	}
-	return c
-}
-
-// contextAfterText starts in context c, consumes some tokens from the front of
-// s, then returns the context after those tokens and the unprocessed suffix.
-func contextAfterText(c context, s []byte) (context, int) {
-	if c.delim == delimNone {
-		c1, i := tSpecialTagEnd(c, s)
-		if i == 0 {
-			// A special end tag (`</script>`) has been seen and
-			// all content preceding it has been consumed.
-			return c1, 0
-		}
-		// Consider all content up to any end tag.
-		return transitionFunc[c.state](c, s[:i])
-	}
-
-	i := bytes.IndexAny(s, delimEnds[c.delim])
-	if i == -1 {
-		i = len(s)
-	}
-	if c.delim == delimSpaceOrTagEnd {
-		// http://www.w3.org/TR/html5/syntax.html#attribute-value-(unquoted)-state
-		// lists the runes below as error characters.
-		// Error out because HTML parsers may differ on whether
-		// "<a id= onclick=f("     ends inside id's or onclick's value,
-		// "<a class=`foo "        ends inside a value,
-		// "<a style=font:'Arial'" needs open-quote fixup.
-		// IE treats '`' as a quotation character.
-		if j := bytes.IndexAny(s[:i], "\"'<=`"); j >= 0 {
-			return context{
-				state: stateError,
-				err:   errorf(ErrBadHTML, nil, 0, "%q in unquoted attr: %q", s[j:j+1], s[:i]),
-			}, len(s)
-		}
-	}
-	if i == len(s) {
-		// Remain inside the attribute.
-		// Decode the value so non-HTML rules can easily handle
-		//     <button onclick="alert(&quot;Hi!&quot;)">
-		// without having to entity decode token boundaries.
-		for u := []byte(html.UnescapeString(string(s))); len(u) != 0; {
-			c1, i1 := transitionFunc[c.state](c, u)
-			c, u = c1, u[i1:]
-		}
-		return c, len(s)
-	}
-	if c.delim != delimSpaceOrTagEnd {
-		// Consume any quote.
-		i++
-	}
-	// On exiting an attribute, we discard all state information
-	// except the state and element.
-	return context{state: stateTag, element: c.element}, i
-}
-
-// editActionNode records a change to an action pipeline for later commit.
-func (e *escaper) editActionNode(n *parse.ActionNode, cmds []string) {
-	if _, ok := e.actionNodeEdits[n]; ok {
-		panic(fmt.Sprintf("node %s shared between templates", n))
-	}
-	e.actionNodeEdits[n] = cmds
-}
-
-// editTemplateNode records a change to a {{template}} callee for later commit.
-func (e *escaper) editTemplateNode(n *parse.TemplateNode, callee string) {
-	if _, ok := e.templateNodeEdits[n]; ok {
-		panic(fmt.Sprintf("node %s shared between templates", n))
-	}
-	e.templateNodeEdits[n] = callee
-}
-
-// editTextNode records a change to a text node for later commit.
-func (e *escaper) editTextNode(n *parse.TextNode, text []byte) {
-	if _, ok := e.textNodeEdits[n]; ok {
-		panic(fmt.Sprintf("node %s shared between templates", n))
-	}
-	e.textNodeEdits[n] = text
-}
-
-// commit applies changes to actions and template calls needed to contextually
-// autoescape content and adds any derived templates to the set.
-func (e *escaper) commit() {
-	for name := range e.output {
-		e.template(name).Funcs(funcMap)
-	}
-	for _, t := range e.derived {
-		if _, err := e.tmpl.text.AddParseTree(t.Name(), t.Tree); err != nil {
-			panic("error adding derived template")
-		}
-	}
-	for n, s := range e.actionNodeEdits {
-		ensurePipelineContains(n.Pipe, s)
-	}
-	for n, name := range e.templateNodeEdits {
-		n.Name = name
-	}
-	for n, s := range e.textNodeEdits {
-		n.Text = s
-	}
-}
-
-// template returns the named template given a mangled template name.
-func (e *escaper) template(name string) *template.Template {
-	t := e.tmpl.text.Lookup(name)
-	if t == nil {
-		t = e.derived[name]
-	}
-	return t
-}
-
-// Forwarding functions so that clients need only import this package
-// to reach the general escaping functions of text/template.
-
-// HTMLEscape writes to w the escaped HTML equivalent of the plain text data b.
-func HTMLEscape(w io.Writer, b []byte) {
-	template.HTMLEscape(w, b)
-}
-
-// HTMLEscapeString returns the escaped HTML equivalent of the plain text data s.
-func HTMLEscapeString(s string) string {
-	return template.HTMLEscapeString(s)
-}
-
-// HTMLEscaper returns the escaped HTML equivalent of the textual
-// representation of its arguments.
-func HTMLEscaper(args ...interface{}) string {
-	return template.HTMLEscaper(args...)
-}
-
-// JSEscape writes to w the escaped JavaScript equivalent of the plain text data b.
-func JSEscape(w io.Writer, b []byte) {
-	template.JSEscape(w, b)
-}
-
-// JSEscapeString returns the escaped JavaScript equivalent of the plain text data s.
-func JSEscapeString(s string) string {
-	return template.JSEscapeString(s)
-}
-
-// JSEscaper returns the escaped JavaScript equivalent of the textual
-// representation of its arguments.
-func JSEscaper(args ...interface{}) string {
-	return template.JSEscaper(args...)
-}
-
-// URLQueryEscaper returns the escaped value of the textual representation of
-// its arguments in a form suitable for embedding in a URL query.
-func URLQueryEscaper(args ...interface{}) string {
-	return template.URLQueryEscaper(args...)
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/escape_test.go b/third_party/gofrontend/libgo/go/html/template/escape_test.go
deleted file mode 100644
index bea2d13..0000000
--- a/third_party/gofrontend/libgo/go/html/template/escape_test.go
+++ /dev/null
@@ -1,1756 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"encoding/json"
-	"fmt"
-	"os"
-	"strings"
-	"testing"
-	"text/template"
-	"text/template/parse"
-)
-
-type badMarshaler struct{}
-
-func (x *badMarshaler) MarshalJSON() ([]byte, error) {
-	// Keys in valid JSON must be double quoted as must all strings.
-	return []byte("{ foo: 'not quite valid JSON' }"), nil
-}
-
-type goodMarshaler struct{}
-
-func (x *goodMarshaler) MarshalJSON() ([]byte, error) {
-	return []byte(`{ "<foo>": "O'Reilly" }`), nil
-}
-
-func TestEscape(t *testing.T) {
-	data := struct {
-		F, T    bool
-		C, G, H string
-		A, E    []string
-		B, M    json.Marshaler
-		N       int
-		Z       *int
-		W       HTML
-	}{
-		F: false,
-		T: true,
-		C: "<Cincinatti>",
-		G: "<Goodbye>",
-		H: "<Hello>",
-		A: []string{"<a>", "<b>"},
-		E: []string{},
-		N: 42,
-		B: &badMarshaler{},
-		M: &goodMarshaler{},
-		Z: nil,
-		W: HTML(`&iexcl;<b class="foo">Hello</b>, <textarea>O'World</textarea>!`),
-	}
-	pdata := &data
-
-	tests := []struct {
-		name   string
-		input  string
-		output string
-	}{
-		{
-			"if",
-			"{{if .T}}Hello{{end}}, {{.C}}!",
-			"Hello, &lt;Cincinatti&gt;!",
-		},
-		{
-			"else",
-			"{{if .F}}{{.H}}{{else}}{{.G}}{{end}}!",
-			"&lt;Goodbye&gt;!",
-		},
-		{
-			"overescaping1",
-			"Hello, {{.C | html}}!",
-			"Hello, &lt;Cincinatti&gt;!",
-		},
-		{
-			"overescaping2",
-			"Hello, {{html .C}}!",
-			"Hello, &lt;Cincinatti&gt;!",
-		},
-		{
-			"overescaping3",
-			"{{with .C}}{{$msg := .}}Hello, {{$msg}}!{{end}}",
-			"Hello, &lt;Cincinatti&gt;!",
-		},
-		{
-			"assignment",
-			"{{if $x := .H}}{{$x}}{{end}}",
-			"&lt;Hello&gt;",
-		},
-		{
-			"withBody",
-			"{{with .H}}{{.}}{{end}}",
-			"&lt;Hello&gt;",
-		},
-		{
-			"withElse",
-			"{{with .E}}{{.}}{{else}}{{.H}}{{end}}",
-			"&lt;Hello&gt;",
-		},
-		{
-			"rangeBody",
-			"{{range .A}}{{.}}{{end}}",
-			"&lt;a&gt;&lt;b&gt;",
-		},
-		{
-			"rangeElse",
-			"{{range .E}}{{.}}{{else}}{{.H}}{{end}}",
-			"&lt;Hello&gt;",
-		},
-		{
-			"nonStringValue",
-			"{{.T}}",
-			"true",
-		},
-		{
-			"constant",
-			`<a href="/search?q={{"'a<b'"}}">`,
-			`<a href="/search?q=%27a%3cb%27">`,
-		},
-		{
-			"multipleAttrs",
-			"<a b=1 c={{.H}}>",
-			"<a b=1 c=&lt;Hello&gt;>",
-		},
-		{
-			"urlStartRel",
-			`<a href='{{"/foo/bar?a=b&c=d"}}'>`,
-			`<a href='/foo/bar?a=b&amp;c=d'>`,
-		},
-		{
-			"urlStartAbsOk",
-			`<a href='{{"http://example.com/foo/bar?a=b&c=d"}}'>`,
-			`<a href='http://example.com/foo/bar?a=b&amp;c=d'>`,
-		},
-		{
-			"protocolRelativeURLStart",
-			`<a href='{{"//example.com:8000/foo/bar?a=b&c=d"}}'>`,
-			`<a href='//example.com:8000/foo/bar?a=b&amp;c=d'>`,
-		},
-		{
-			"pathRelativeURLStart",
-			`<a href="{{"/javascript:80/foo/bar"}}">`,
-			`<a href="/javascript:80/foo/bar">`,
-		},
-		{
-			"dangerousURLStart",
-			`<a href='{{"javascript:alert(%22pwned%22)"}}'>`,
-			`<a href='#ZgotmplZ'>`,
-		},
-		{
-			"dangerousURLStart2",
-			`<a href='  {{"javascript:alert(%22pwned%22)"}}'>`,
-			`<a href='  #ZgotmplZ'>`,
-		},
-		{
-			"nonHierURL",
-			`<a href={{"mailto:Muhammed \"The Greatest\" Ali <m.ali@example.com>"}}>`,
-			`<a href=mailto:Muhammed%20%22The%20Greatest%22%20Ali%20%3cm.ali@example.com%3e>`,
-		},
-		{
-			"urlPath",
-			`<a href='http://{{"javascript:80"}}/foo'>`,
-			`<a href='http://javascript:80/foo'>`,
-		},
-		{
-			"urlQuery",
-			`<a href='/search?q={{.H}}'>`,
-			`<a href='/search?q=%3cHello%3e'>`,
-		},
-		{
-			"urlFragment",
-			`<a href='/faq#{{.H}}'>`,
-			`<a href='/faq#%3cHello%3e'>`,
-		},
-		{
-			"urlBranch",
-			`<a href="{{if .F}}/foo?a=b{{else}}/bar{{end}}">`,
-			`<a href="/bar">`,
-		},
-		{
-			"urlBranchConflictMoot",
-			`<a href="{{if .T}}/foo?a={{else}}/bar#{{end}}{{.C}}">`,
-			`<a href="/foo?a=%3cCincinatti%3e">`,
-		},
-		{
-			"jsStrValue",
-			"<button onclick='alert({{.H}})'>",
-			`<button onclick='alert(&#34;\u003cHello\u003e&#34;)'>`,
-		},
-		{
-			"jsNumericValue",
-			"<button onclick='alert({{.N}})'>",
-			`<button onclick='alert( 42 )'>`,
-		},
-		{
-			"jsBoolValue",
-			"<button onclick='alert({{.T}})'>",
-			`<button onclick='alert( true )'>`,
-		},
-		{
-			"jsNilValue",
-			"<button onclick='alert(typeof{{.Z}})'>",
-			`<button onclick='alert(typeof null )'>`,
-		},
-		{
-			"jsObjValue",
-			"<button onclick='alert({{.A}})'>",
-			`<button onclick='alert([&#34;\u003ca\u003e&#34;,&#34;\u003cb\u003e&#34;])'>`,
-		},
-		{
-			"jsObjValueScript",
-			"<script>alert({{.A}})</script>",
-			`<script>alert(["\u003ca\u003e","\u003cb\u003e"])</script>`,
-		},
-		{
-			"jsObjValueNotOverEscaped",
-			"<button onclick='alert({{.A | html}})'>",
-			`<button onclick='alert([&#34;\u003ca\u003e&#34;,&#34;\u003cb\u003e&#34;])'>`,
-		},
-		{
-			"jsStr",
-			"<button onclick='alert(&quot;{{.H}}&quot;)'>",
-			`<button onclick='alert(&quot;\x3cHello\x3e&quot;)'>`,
-		},
-		{
-			"badMarshaler",
-			`<button onclick='alert(1/{{.B}}in numbers)'>`,
-			`<button onclick='alert(1/ /* json: error calling MarshalJSON for type *template.badMarshaler: invalid character &#39;f&#39; looking for beginning of object key string */null in numbers)'>`,
-		},
-		{
-			"jsMarshaler",
-			`<button onclick='alert({{.M}})'>`,
-			`<button onclick='alert({&#34;\u003cfoo\u003e&#34;:&#34;O&#39;Reilly&#34;})'>`,
-		},
-		{
-			"jsStrNotUnderEscaped",
-			"<button onclick='alert({{.C | urlquery}})'>",
-			// URL escaped, then quoted for JS.
-			`<button onclick='alert(&#34;%3CCincinatti%3E&#34;)'>`,
-		},
-		{
-			"jsRe",
-			`<button onclick='alert(/{{"foo+bar"}}/.test(""))'>`,
-			`<button onclick='alert(/foo\x2bbar/.test(""))'>`,
-		},
-		{
-			"jsReBlank",
-			`<script>alert(/{{""}}/.test(""));</script>`,
-			`<script>alert(/(?:)/.test(""));</script>`,
-		},
-		{
-			"jsReAmbigOk",
-			`<script>{{if true}}var x = 1{{end}}</script>`,
-			// The {if} ends in an ambiguous jsCtx but there is
-			// no slash following so we shouldn't care.
-			`<script>var x = 1</script>`,
-		},
-		{
-			"styleBidiKeywordPassed",
-			`<p style="dir: {{"ltr"}}">`,
-			`<p style="dir: ltr">`,
-		},
-		{
-			"styleBidiPropNamePassed",
-			`<p style="border-{{"left"}}: 0; border-{{"right"}}: 1in">`,
-			`<p style="border-left: 0; border-right: 1in">`,
-		},
-		{
-			"styleExpressionBlocked",
-			`<p style="width: {{"expression(alert(1337))"}}">`,
-			`<p style="width: ZgotmplZ">`,
-		},
-		{
-			"styleTagSelectorPassed",
-			`<style>{{"p"}} { color: pink }</style>`,
-			`<style>p { color: pink }</style>`,
-		},
-		{
-			"styleIDPassed",
-			`<style>p{{"#my-ID"}} { font: Arial }</style>`,
-			`<style>p#my-ID { font: Arial }</style>`,
-		},
-		{
-			"styleClassPassed",
-			`<style>p{{".my_class"}} { font: Arial }</style>`,
-			`<style>p.my_class { font: Arial }</style>`,
-		},
-		{
-			"styleQuantityPassed",
-			`<a style="left: {{"2em"}}; top: {{0}}">`,
-			`<a style="left: 2em; top: 0">`,
-		},
-		{
-			"stylePctPassed",
-			`<table style=width:{{"100%"}}>`,
-			`<table style=width:100%>`,
-		},
-		{
-			"styleColorPassed",
-			`<p style="color: {{"#8ff"}}; background: {{"#000"}}">`,
-			`<p style="color: #8ff; background: #000">`,
-		},
-		{
-			"styleObfuscatedExpressionBlocked",
-			`<p style="width: {{"  e\\78preS\x00Sio/**/n(alert(1337))"}}">`,
-			`<p style="width: ZgotmplZ">`,
-		},
-		{
-			"styleMozBindingBlocked",
-			`<p style="{{"-moz-binding(alert(1337))"}}: ...">`,
-			`<p style="ZgotmplZ: ...">`,
-		},
-		{
-			"styleObfuscatedMozBindingBlocked",
-			`<p style="{{"  -mo\\7a-B\x00I/**/nding(alert(1337))"}}: ...">`,
-			`<p style="ZgotmplZ: ...">`,
-		},
-		{
-			"styleFontNameString",
-			`<p style='font-family: "{{"Times New Roman"}}"'>`,
-			`<p style='font-family: "Times New Roman"'>`,
-		},
-		{
-			"styleFontNameString",
-			`<p style='font-family: "{{"Times New Roman"}}", "{{"sans-serif"}}"'>`,
-			`<p style='font-family: "Times New Roman", "sans-serif"'>`,
-		},
-		{
-			"styleFontNameUnquoted",
-			`<p style='font-family: {{"Times New Roman"}}'>`,
-			`<p style='font-family: Times New Roman'>`,
-		},
-		{
-			"styleURLQueryEncoded",
-			`<p style="background: url(/img?name={{"O'Reilly Animal(1)<2>.png"}})">`,
-			`<p style="background: url(/img?name=O%27Reilly%20Animal%281%29%3c2%3e.png)">`,
-		},
-		{
-			"styleQuotedURLQueryEncoded",
-			`<p style="background: url('/img?name={{"O'Reilly Animal(1)<2>.png"}}')">`,
-			`<p style="background: url('/img?name=O%27Reilly%20Animal%281%29%3c2%3e.png')">`,
-		},
-		{
-			"styleStrQueryEncoded",
-			`<p style="background: '/img?name={{"O'Reilly Animal(1)<2>.png"}}'">`,
-			`<p style="background: '/img?name=O%27Reilly%20Animal%281%29%3c2%3e.png'">`,
-		},
-		{
-			"styleURLBadProtocolBlocked",
-			`<a style="background: url('{{"javascript:alert(1337)"}}')">`,
-			`<a style="background: url('#ZgotmplZ')">`,
-		},
-		{
-			"styleStrBadProtocolBlocked",
-			`<a style="background: '{{"vbscript:alert(1337)"}}'">`,
-			`<a style="background: '#ZgotmplZ'">`,
-		},
-		{
-			"styleStrEncodedProtocolEncoded",
-			`<a style="background: '{{"javascript\\3a alert(1337)"}}'">`,
-			// The CSS string 'javascript\\3a alert(1337)' does not contains a colon.
-			`<a style="background: 'javascript\\3a alert\28 1337\29 '">`,
-		},
-		{
-			"styleURLGoodProtocolPassed",
-			`<a style="background: url('{{"http://oreilly.com/O'Reilly Animals(1)<2>;{}.html"}}')">`,
-			`<a style="background: url('http://oreilly.com/O%27Reilly%20Animals%281%29%3c2%3e;%7b%7d.html')">`,
-		},
-		{
-			"styleStrGoodProtocolPassed",
-			`<a style="background: '{{"http://oreilly.com/O'Reilly Animals(1)<2>;{}.html"}}'">`,
-			`<a style="background: 'http\3a\2f\2foreilly.com\2fO\27Reilly Animals\28 1\29\3c 2\3e\3b\7b\7d.html'">`,
-		},
-		{
-			"styleURLEncodedForHTMLInAttr",
-			`<a style="background: url('{{"/search?img=foo&size=icon"}}')">`,
-			`<a style="background: url('/search?img=foo&amp;size=icon')">`,
-		},
-		{
-			"styleURLNotEncodedForHTMLInCdata",
-			`<style>body { background: url('{{"/search?img=foo&size=icon"}}') }</style>`,
-			`<style>body { background: url('/search?img=foo&size=icon') }</style>`,
-		},
-		{
-			"styleURLMixedCase",
-			`<p style="background: URL(#{{.H}})">`,
-			`<p style="background: URL(#%3cHello%3e)">`,
-		},
-		{
-			"stylePropertyPairPassed",
-			`<a style='{{"color: red"}}'>`,
-			`<a style='color: red'>`,
-		},
-		{
-			"styleStrSpecialsEncoded",
-			`<a style="font-family: '{{"/**/'\";:// \\"}}', &quot;{{"/**/'\";:// \\"}}&quot;">`,
-			`<a style="font-family: '\2f**\2f\27\22\3b\3a\2f\2f  \\', &quot;\2f**\2f\27\22\3b\3a\2f\2f  \\&quot;">`,
-		},
-		{
-			"styleURLSpecialsEncoded",
-			`<a style="border-image: url({{"/**/'\";:// \\"}}), url(&quot;{{"/**/'\";:// \\"}}&quot;), url('{{"/**/'\";:// \\"}}'), 'http://www.example.com/?q={{"/**/'\";:// \\"}}''">`,
-			`<a style="border-image: url(/**/%27%22;://%20%5c), url(&quot;/**/%27%22;://%20%5c&quot;), url('/**/%27%22;://%20%5c'), 'http://www.example.com/?q=%2f%2a%2a%2f%27%22%3b%3a%2f%2f%20%5c''">`,
-		},
-		{
-			"HTML comment",
-			"<b>Hello, <!-- name of world -->{{.C}}</b>",
-			"<b>Hello, &lt;Cincinatti&gt;</b>",
-		},
-		{
-			"HTML comment not first < in text node.",
-			"<<!-- -->!--",
-			"&lt;!--",
-		},
-		{
-			"HTML normalization 1",
-			"a < b",
-			"a &lt; b",
-		},
-		{
-			"HTML normalization 2",
-			"a << b",
-			"a &lt;&lt; b",
-		},
-		{
-			"HTML normalization 3",
-			"a<<!-- --><!-- -->b",
-			"a&lt;b",
-		},
-		{
-			"HTML doctype not normalized",
-			"<!DOCTYPE html>Hello, World!",
-			"<!DOCTYPE html>Hello, World!",
-		},
-		{
-			"HTML doctype not case-insensitive",
-			"<!doCtYPE htMl>Hello, World!",
-			"<!doCtYPE htMl>Hello, World!",
-		},
-		{
-			"No doctype injection",
-			`<!{{"DOCTYPE"}}`,
-			"&lt;!DOCTYPE",
-		},
-		{
-			"Split HTML comment",
-			"<b>Hello, <!-- name of {{if .T}}city -->{{.C}}{{else}}world -->{{.W}}{{end}}</b>",
-			"<b>Hello, &lt;Cincinatti&gt;</b>",
-		},
-		{
-			"JS line comment",
-			"<script>for (;;) { if (c()) break// foo not a label\n" +
-				"foo({{.T}});}</script>",
-			"<script>for (;;) { if (c()) break\n" +
-				"foo( true );}</script>",
-		},
-		{
-			"JS multiline block comment",
-			"<script>for (;;) { if (c()) break/* foo not a label\n" +
-				" */foo({{.T}});}</script>",
-			// Newline separates break from call. If newline
-			// removed, then break will consume label leaving
-			// code invalid.
-			"<script>for (;;) { if (c()) break\n" +
-				"foo( true );}</script>",
-		},
-		{
-			"JS single-line block comment",
-			"<script>for (;;) {\n" +
-				"if (c()) break/* foo a label */foo;" +
-				"x({{.T}});}</script>",
-			// Newline separates break from call. If newline
-			// removed, then break will consume label leaving
-			// code invalid.
-			"<script>for (;;) {\n" +
-				"if (c()) break foo;" +
-				"x( true );}</script>",
-		},
-		{
-			"JS block comment flush with mathematical division",
-			"<script>var a/*b*//c\nd</script>",
-			"<script>var a /c\nd</script>",
-		},
-		{
-			"JS mixed comments",
-			"<script>var a/*b*///c\nd</script>",
-			"<script>var a \nd</script>",
-		},
-		{
-			"CSS comments",
-			"<style>p// paragraph\n" +
-				`{border: 1px/* color */{{"#00f"}}}</style>`,
-			"<style>p\n" +
-				"{border: 1px #00f}</style>",
-		},
-		{
-			"JS attr block comment",
-			`<a onclick="f(&quot;&quot;); /* alert({{.H}}) */">`,
-			// Attribute comment tests should pass if the comments
-			// are successfully elided.
-			`<a onclick="f(&quot;&quot;); /* alert() */">`,
-		},
-		{
-			"JS attr line comment",
-			`<a onclick="// alert({{.G}})">`,
-			`<a onclick="// alert()">`,
-		},
-		{
-			"CSS attr block comment",
-			`<a style="/* color: {{.H}} */">`,
-			`<a style="/* color:  */">`,
-		},
-		{
-			"CSS attr line comment",
-			`<a style="// color: {{.G}}">`,
-			`<a style="// color: ">`,
-		},
-		{
-			"HTML substitution commented out",
-			"<p><!-- {{.H}} --></p>",
-			"<p></p>",
-		},
-		{
-			"Comment ends flush with start",
-			"<!--{{.}}--><script>/*{{.}}*///{{.}}\n</script><style>/*{{.}}*///{{.}}\n</style><a onclick='/*{{.}}*///{{.}}' style='/*{{.}}*///{{.}}'>",
-			"<script> \n</script><style> \n</style><a onclick='/**///' style='/**///'>",
-		},
-		{
-			"typed HTML in text",
-			`{{.W}}`,
-			`&iexcl;<b class="foo">Hello</b>, <textarea>O'World</textarea>!`,
-		},
-		{
-			"typed HTML in attribute",
-			`<div title="{{.W}}">`,
-			`<div title="&iexcl;Hello, O&#39;World!">`,
-		},
-		{
-			"typed HTML in script",
-			`<button onclick="alert({{.W}})">`,
-			`<button onclick="alert(&#34;\u0026iexcl;\u003cb class=\&#34;foo\&#34;\u003eHello\u003c/b\u003e, \u003ctextarea\u003eO&#39;World\u003c/textarea\u003e!&#34;)">`,
-		},
-		{
-			"typed HTML in RCDATA",
-			`<textarea>{{.W}}</textarea>`,
-			`<textarea>&iexcl;&lt;b class=&#34;foo&#34;&gt;Hello&lt;/b&gt;, &lt;textarea&gt;O&#39;World&lt;/textarea&gt;!</textarea>`,
-		},
-		{
-			"range in textarea",
-			"<textarea>{{range .A}}{{.}}{{end}}</textarea>",
-			"<textarea>&lt;a&gt;&lt;b&gt;</textarea>",
-		},
-		{
-			"No tag injection",
-			`{{"10$"}}<{{"script src,evil.org/pwnd.js"}}...`,
-			`10$&lt;script src,evil.org/pwnd.js...`,
-		},
-		{
-			"No comment injection",
-			`<{{"!--"}}`,
-			`&lt;!--`,
-		},
-		{
-			"No RCDATA end tag injection",
-			`<textarea><{{"/textarea "}}...</textarea>`,
-			`<textarea>&lt;/textarea ...</textarea>`,
-		},
-		{
-			"optional attrs",
-			`<img class="{{"iconClass"}}"` +
-				`{{if .T}} id="{{"<iconId>"}}"{{end}}` +
-				// Double quotes inside if/else.
-				` src=` +
-				`{{if .T}}"?{{"<iconPath>"}}"` +
-				`{{else}}"images/cleardot.gif"{{end}}` +
-				// Missing space before title, but it is not a
-				// part of the src attribute.
-				`{{if .T}}title="{{"<title>"}}"{{end}}` +
-				// Quotes outside if/else.
-				` alt="` +
-				`{{if .T}}{{"<alt>"}}` +
-				`{{else}}{{if .F}}{{"<title>"}}{{end}}` +
-				`{{end}}"` +
-				`>`,
-			`<img class="iconClass" id="&lt;iconId&gt;" src="?%3ciconPath%3e"title="&lt;title&gt;" alt="&lt;alt&gt;">`,
-		},
-		{
-			"conditional valueless attr name",
-			`<input{{if .T}} checked{{end}} name=n>`,
-			`<input checked name=n>`,
-		},
-		{
-			"conditional dynamic valueless attr name 1",
-			`<input{{if .T}} {{"checked"}}{{end}} name=n>`,
-			`<input checked name=n>`,
-		},
-		{
-			"conditional dynamic valueless attr name 2",
-			`<input {{if .T}}{{"checked"}} {{end}}name=n>`,
-			`<input checked name=n>`,
-		},
-		{
-			"dynamic attribute name",
-			`<img on{{"load"}}="alert({{"loaded"}})">`,
-			// Treated as JS since quotes are inserted.
-			`<img onload="alert(&#34;loaded&#34;)">`,
-		},
-		{
-			"bad dynamic attribute name 1",
-			// Allow checked, selected, disabled, but not JS or
-			// CSS attributes.
-			`<input {{"onchange"}}="{{"doEvil()"}}">`,
-			`<input ZgotmplZ="doEvil()">`,
-		},
-		{
-			"bad dynamic attribute name 2",
-			`<div {{"sTyle"}}="{{"color: expression(alert(1337))"}}">`,
-			`<div ZgotmplZ="color: expression(alert(1337))">`,
-		},
-		{
-			"bad dynamic attribute name 3",
-			// Allow title or alt, but not a URL.
-			`<img {{"src"}}="{{"javascript:doEvil()"}}">`,
-			`<img ZgotmplZ="javascript:doEvil()">`,
-		},
-		{
-			"bad dynamic attribute name 4",
-			// Structure preservation requires values to associate
-			// with a consistent attribute.
-			`<input checked {{""}}="Whose value am I?">`,
-			`<input checked ZgotmplZ="Whose value am I?">`,
-		},
-		{
-			"dynamic element name",
-			`<h{{3}}><table><t{{"head"}}>...</h{{3}}>`,
-			`<h3><table><thead>...</h3>`,
-		},
-		{
-			"bad dynamic element name",
-			// Dynamic element names are typically used to switch
-			// between (thead, tfoot, tbody), (ul, ol), (th, td),
-			// and other replaceable sets.
-			// We do not currently easily support (ul, ol).
-			// If we do change to support that, this test should
-			// catch failures to filter out special tag names which
-			// would violate the structure preservation property --
-			// if any special tag name could be substituted, then
-			// the content could be raw text/RCDATA for some inputs
-			// and regular HTML content for others.
-			`<{{"script"}}>{{"doEvil()"}}</{{"script"}}>`,
-			`&lt;script>doEvil()&lt;/script>`,
-		},
-	}
-
-	for _, test := range tests {
-		tmpl := New(test.name)
-		tmpl = Must(tmpl.Parse(test.input))
-		// Check for bug 6459: Tree field was not set in Parse.
-		if tmpl.Tree != tmpl.text.Tree {
-			t.Errorf("%s: tree not set properly", test.name)
-			continue
-		}
-		b := new(bytes.Buffer)
-		if err := tmpl.Execute(b, data); err != nil {
-			t.Errorf("%s: template execution failed: %s", test.name, err)
-			continue
-		}
-		if w, g := test.output, b.String(); w != g {
-			t.Errorf("%s: escaped output: want\n\t%q\ngot\n\t%q", test.name, w, g)
-			continue
-		}
-		b.Reset()
-		if err := tmpl.Execute(b, pdata); err != nil {
-			t.Errorf("%s: template execution failed for pointer: %s", test.name, err)
-			continue
-		}
-		if w, g := test.output, b.String(); w != g {
-			t.Errorf("%s: escaped output for pointer: want\n\t%q\ngot\n\t%q", test.name, w, g)
-			continue
-		}
-		if tmpl.Tree != tmpl.text.Tree {
-			t.Errorf("%s: tree mismatch", test.name)
-			continue
-		}
-	}
-}
-
-func TestEscapeSet(t *testing.T) {
-	type dataItem struct {
-		Children []*dataItem
-		X        string
-	}
-
-	data := dataItem{
-		Children: []*dataItem{
-			{X: "foo"},
-			{X: "<bar>"},
-			{
-				Children: []*dataItem{
-					{X: "baz"},
-				},
-			},
-		},
-	}
-
-	tests := []struct {
-		inputs map[string]string
-		want   string
-	}{
-		// The trivial set.
-		{
-			map[string]string{
-				"main": ``,
-			},
-			``,
-		},
-		// A template called in the start context.
-		{
-			map[string]string{
-				"main": `Hello, {{template "helper"}}!`,
-				// Not a valid top level HTML template.
-				// "<b" is not a full tag.
-				"helper": `{{"<World>"}}`,
-			},
-			`Hello, &lt;World&gt;!`,
-		},
-		// A template called in a context other than the start.
-		{
-			map[string]string{
-				"main": `<a onclick='a = {{template "helper"}};'>`,
-				// Not a valid top level HTML template.
-				// "<b" is not a full tag.
-				"helper": `{{"<a>"}}<b`,
-			},
-			`<a onclick='a = &#34;\u003ca\u003e&#34;<b;'>`,
-		},
-		// A recursive template that ends in its start context.
-		{
-			map[string]string{
-				"main": `{{range .Children}}{{template "main" .}}{{else}}{{.X}} {{end}}`,
-			},
-			`foo &lt;bar&gt; baz `,
-		},
-		// A recursive helper template that ends in its start context.
-		{
-			map[string]string{
-				"main":   `{{template "helper" .}}`,
-				"helper": `{{if .Children}}<ul>{{range .Children}}<li>{{template "main" .}}</li>{{end}}</ul>{{else}}{{.X}}{{end}}`,
-			},
-			`<ul><li>foo</li><li>&lt;bar&gt;</li><li><ul><li>baz</li></ul></li></ul>`,
-		},
-		// Co-recursive templates that end in its start context.
-		{
-			map[string]string{
-				"main":   `<blockquote>{{range .Children}}{{template "helper" .}}{{end}}</blockquote>`,
-				"helper": `{{if .Children}}{{template "main" .}}{{else}}{{.X}}<br>{{end}}`,
-			},
-			`<blockquote>foo<br>&lt;bar&gt;<br><blockquote>baz<br></blockquote></blockquote>`,
-		},
-		// A template that is called in two different contexts.
-		{
-			map[string]string{
-				"main":   `<button onclick="title='{{template "helper"}}'; ...">{{template "helper"}}</button>`,
-				"helper": `{{11}} of {{"<100>"}}`,
-			},
-			`<button onclick="title='11 of \x3c100\x3e'; ...">11 of &lt;100&gt;</button>`,
-		},
-		// A non-recursive template that ends in a different context.
-		// helper starts in jsCtxRegexp and ends in jsCtxDivOp.
-		{
-			map[string]string{
-				"main":   `<script>var x={{template "helper"}}/{{"42"}};</script>`,
-				"helper": "{{126}}",
-			},
-			`<script>var x= 126 /"42";</script>`,
-		},
-		// A recursive template that ends in a similar context.
-		{
-			map[string]string{
-				"main":      `<script>var x=[{{template "countdown" 4}}];</script>`,
-				"countdown": `{{.}}{{if .}},{{template "countdown" . | pred}}{{end}}`,
-			},
-			`<script>var x=[ 4 , 3 , 2 , 1 , 0 ];</script>`,
-		},
-		// A recursive template that ends in a different context.
-		/*
-			{
-				map[string]string{
-					"main":   `<a href="/foo{{template "helper" .}}">`,
-					"helper": `{{if .Children}}{{range .Children}}{{template "helper" .}}{{end}}{{else}}?x={{.X}}{{end}}`,
-				},
-				`<a href="/foo?x=foo?x=%3cbar%3e?x=baz">`,
-			},
-		*/
-	}
-
-	// pred is a template function that returns the predecessor of a
-	// natural number for testing recursive templates.
-	fns := FuncMap{"pred": func(a ...interface{}) (interface{}, error) {
-		if len(a) == 1 {
-			if i, _ := a[0].(int); i > 0 {
-				return i - 1, nil
-			}
-		}
-		return nil, fmt.Errorf("undefined pred(%v)", a)
-	}}
-
-	for _, test := range tests {
-		source := ""
-		for name, body := range test.inputs {
-			source += fmt.Sprintf("{{define %q}}%s{{end}} ", name, body)
-		}
-		tmpl, err := New("root").Funcs(fns).Parse(source)
-		if err != nil {
-			t.Errorf("error parsing %q: %v", source, err)
-			continue
-		}
-		var b bytes.Buffer
-
-		if err := tmpl.ExecuteTemplate(&b, "main", data); err != nil {
-			t.Errorf("%q executing %v", err.Error(), tmpl.Lookup("main"))
-			continue
-		}
-		if got := b.String(); test.want != got {
-			t.Errorf("want\n\t%q\ngot\n\t%q", test.want, got)
-		}
-	}
-
-}
-
-func TestErrors(t *testing.T) {
-	tests := []struct {
-		input string
-		err   string
-	}{
-		// Non-error cases.
-		{
-			"{{if .Cond}}<a>{{else}}<b>{{end}}",
-			"",
-		},
-		{
-			"{{if .Cond}}<a>{{end}}",
-			"",
-		},
-		{
-			"{{if .Cond}}{{else}}<b>{{end}}",
-			"",
-		},
-		{
-			"{{with .Cond}}<div>{{end}}",
-			"",
-		},
-		{
-			"{{range .Items}}<a>{{end}}",
-			"",
-		},
-		{
-			"<a href='/foo?{{range .Items}}&{{.K}}={{.V}}{{end}}'>",
-			"",
-		},
-		// Error cases.
-		{
-			"{{if .Cond}}<a{{end}}",
-			"z:1:5: {{if}} branches",
-		},
-		{
-			"{{if .Cond}}\n{{else}}\n<a{{end}}",
-			"z:1:5: {{if}} branches",
-		},
-		{
-			// Missing quote in the else branch.
-			`{{if .Cond}}<a href="foo">{{else}}<a href="bar>{{end}}`,
-			"z:1:5: {{if}} branches",
-		},
-		{
-			// Different kind of attribute: href implies a URL.
-			"<a {{if .Cond}}href='{{else}}title='{{end}}{{.X}}'>",
-			"z:1:8: {{if}} branches",
-		},
-		{
-			"\n{{with .X}}<a{{end}}",
-			"z:2:7: {{with}} branches",
-		},
-		{
-			"\n{{with .X}}<a>{{else}}<a{{end}}",
-			"z:2:7: {{with}} branches",
-		},
-		{
-			"{{range .Items}}<a{{end}}",
-			`z:1: on range loop re-entry: "<" in attribute name: "<a"`,
-		},
-		{
-			"\n{{range .Items}} x='<a{{end}}",
-			"z:2:8: on range loop re-entry: {{range}} branches",
-		},
-		{
-			"<a b=1 c={{.H}}",
-			"z: ends in a non-text context: {stateAttr delimSpaceOrTagEnd",
-		},
-		{
-			"<script>foo();",
-			"z: ends in a non-text context: {stateJS",
-		},
-		{
-			`<a href="{{if .F}}/foo?a={{else}}/bar/{{end}}{{.H}}">`,
-			"z:1:47: {{.H}} appears in an ambiguous URL context",
-		},
-		{
-			`<a onclick="alert('Hello \`,
-			`unfinished escape sequence in JS string: "Hello \\"`,
-		},
-		{
-			`<a onclick='alert("Hello\, World\`,
-			`unfinished escape sequence in JS string: "Hello\\, World\\"`,
-		},
-		{
-			`<a onclick='alert(/x+\`,
-			`unfinished escape sequence in JS string: "x+\\"`,
-		},
-		{
-			`<a onclick="/foo[\]/`,
-			`unfinished JS regexp charset: "foo[\\]/"`,
-		},
-		{
-			// It is ambiguous whether 1.5 should be 1\.5 or 1.5.
-			// Either `var x = 1/- 1.5 /i.test(x)`
-			// where `i.test(x)` is a method call of reference i,
-			// or `/-1\.5/i.test(x)` which is a method call on a
-			// case insensitive regular expression.
-			`<script>{{if false}}var x = 1{{end}}/-{{"1.5"}}/i.test(x)</script>`,
-			`'/' could start a division or regexp: "/-"`,
-		},
-		{
-			`{{template "foo"}}`,
-			"z:1:11: no such template \"foo\"",
-		},
-		{
-			`<div{{template "y"}}>` +
-				// Illegal starting in stateTag but not in stateText.
-				`{{define "y"}} foo<b{{end}}`,
-			`"<" in attribute name: " foo<b"`,
-		},
-		{
-			`<script>reverseList = [{{template "t"}}]</script>` +
-				// Missing " after recursive call.
-				`{{define "t"}}{{if .Tail}}{{template "t" .Tail}}{{end}}{{.Head}}",{{end}}`,
-			`: cannot compute output context for template t$htmltemplate_stateJS_elementScript`,
-		},
-		{
-			`<input type=button value=onclick=>`,
-			`html/template:z: "=" in unquoted attr: "onclick="`,
-		},
-		{
-			`<input type=button value= onclick=>`,
-			`html/template:z: "=" in unquoted attr: "onclick="`,
-		},
-		{
-			`<input type=button value= 1+1=2>`,
-			`html/template:z: "=" in unquoted attr: "1+1=2"`,
-		},
-		{
-			"<a class=`foo>",
-			"html/template:z: \"`\" in unquoted attr: \"`foo\"",
-		},
-		{
-			`<a style=font:'Arial'>`,
-			`html/template:z: "'" in unquoted attr: "font:'Arial'"`,
-		},
-		{
-			`<a=foo>`,
-			`: expected space, attr name, or end of tag, but got "=foo>"`,
-		},
-	}
-
-	for _, test := range tests {
-		buf := new(bytes.Buffer)
-		tmpl, err := New("z").Parse(test.input)
-		if err != nil {
-			t.Errorf("input=%q: unexpected parse error %s\n", test.input, err)
-			continue
-		}
-		err = tmpl.Execute(buf, nil)
-		var got string
-		if err != nil {
-			got = err.Error()
-		}
-		if test.err == "" {
-			if got != "" {
-				t.Errorf("input=%q: unexpected error %q", test.input, got)
-			}
-			continue
-		}
-		if strings.Index(got, test.err) == -1 {
-			t.Errorf("input=%q: error\n\t%q\ndoes not contain expected string\n\t%q", test.input, got, test.err)
-			continue
-		}
-		// Check that we get the same error if we call Execute again.
-		if err := tmpl.Execute(buf, nil); err == nil || err.Error() != got {
-			t.Errorf("input=%q: unexpected error on second call %q", test.input, err)
-
-		}
-	}
-}
-
-func TestEscapeText(t *testing.T) {
-	tests := []struct {
-		input  string
-		output context
-	}{
-		{
-			``,
-			context{},
-		},
-		{
-			`Hello, World!`,
-			context{},
-		},
-		{
-			// An orphaned "<" is OK.
-			`I <3 Ponies!`,
-			context{},
-		},
-		{
-			`<a`,
-			context{state: stateTag},
-		},
-		{
-			`<a `,
-			context{state: stateTag},
-		},
-		{
-			`<a>`,
-			context{state: stateText},
-		},
-		{
-			`<a href`,
-			context{state: stateAttrName, attr: attrURL},
-		},
-		{
-			`<a on`,
-			context{state: stateAttrName, attr: attrScript},
-		},
-		{
-			`<a href `,
-			context{state: stateAfterName, attr: attrURL},
-		},
-		{
-			`<a style  =  `,
-			context{state: stateBeforeValue, attr: attrStyle},
-		},
-		{
-			`<a href=`,
-			context{state: stateBeforeValue, attr: attrURL},
-		},
-		{
-			`<a href=x`,
-			context{state: stateURL, delim: delimSpaceOrTagEnd, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a href=x `,
-			context{state: stateTag},
-		},
-		{
-			`<a href=>`,
-			context{state: stateText},
-		},
-		{
-			`<a href=x>`,
-			context{state: stateText},
-		},
-		{
-			`<a href ='`,
-			context{state: stateURL, delim: delimSingleQuote},
-		},
-		{
-			`<a href=''`,
-			context{state: stateTag},
-		},
-		{
-			`<a href= "`,
-			context{state: stateURL, delim: delimDoubleQuote},
-		},
-		{
-			`<a href=""`,
-			context{state: stateTag},
-		},
-		{
-			`<a title="`,
-			context{state: stateAttr, delim: delimDoubleQuote},
-		},
-		{
-			`<a HREF='http:`,
-			context{state: stateURL, delim: delimSingleQuote, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a Href='/`,
-			context{state: stateURL, delim: delimSingleQuote, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a href='"`,
-			context{state: stateURL, delim: delimSingleQuote, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a href="'`,
-			context{state: stateURL, delim: delimDoubleQuote, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a href='&apos;`,
-			context{state: stateURL, delim: delimSingleQuote, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a href="&quot;`,
-			context{state: stateURL, delim: delimDoubleQuote, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a href="&#34;`,
-			context{state: stateURL, delim: delimDoubleQuote, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a href=&quot;`,
-			context{state: stateURL, delim: delimSpaceOrTagEnd, urlPart: urlPartPreQuery},
-		},
-		{
-			`<img alt="1">`,
-			context{state: stateText},
-		},
-		{
-			`<img alt="1>"`,
-			context{state: stateTag},
-		},
-		{
-			`<img alt="1>">`,
-			context{state: stateText},
-		},
-		{
-			`<input checked type="checkbox"`,
-			context{state: stateTag},
-		},
-		{
-			`<a onclick="`,
-			context{state: stateJS, delim: delimDoubleQuote},
-		},
-		{
-			`<a onclick="//foo`,
-			context{state: stateJSLineCmt, delim: delimDoubleQuote},
-		},
-		{
-			"<a onclick='//\n",
-			context{state: stateJS, delim: delimSingleQuote},
-		},
-		{
-			"<a onclick='//\r\n",
-			context{state: stateJS, delim: delimSingleQuote},
-		},
-		{
-			"<a onclick='//\u2028",
-			context{state: stateJS, delim: delimSingleQuote},
-		},
-		{
-			`<a onclick="/*`,
-			context{state: stateJSBlockCmt, delim: delimDoubleQuote},
-		},
-		{
-			`<a onclick="/*/`,
-			context{state: stateJSBlockCmt, delim: delimDoubleQuote},
-		},
-		{
-			`<a onclick="/**/`,
-			context{state: stateJS, delim: delimDoubleQuote},
-		},
-		{
-			`<a onkeypress="&quot;`,
-			context{state: stateJSDqStr, delim: delimDoubleQuote},
-		},
-		{
-			`<a onclick='&quot;foo&quot;`,
-			context{state: stateJS, delim: delimSingleQuote, jsCtx: jsCtxDivOp},
-		},
-		{
-			`<a onclick=&#39;foo&#39;`,
-			context{state: stateJS, delim: delimSpaceOrTagEnd, jsCtx: jsCtxDivOp},
-		},
-		{
-			`<a onclick=&#39;foo`,
-			context{state: stateJSSqStr, delim: delimSpaceOrTagEnd},
-		},
-		{
-			`<a onclick="&quot;foo'`,
-			context{state: stateJSDqStr, delim: delimDoubleQuote},
-		},
-		{
-			`<a onclick="'foo&quot;`,
-			context{state: stateJSSqStr, delim: delimDoubleQuote},
-		},
-		{
-			`<A ONCLICK="'`,
-			context{state: stateJSSqStr, delim: delimDoubleQuote},
-		},
-		{
-			`<a onclick="/`,
-			context{state: stateJSRegexp, delim: delimDoubleQuote},
-		},
-		{
-			`<a onclick="'foo'`,
-			context{state: stateJS, delim: delimDoubleQuote, jsCtx: jsCtxDivOp},
-		},
-		{
-			`<a onclick="'foo\'`,
-			context{state: stateJSSqStr, delim: delimDoubleQuote},
-		},
-		{
-			`<a onclick="'foo\'`,
-			context{state: stateJSSqStr, delim: delimDoubleQuote},
-		},
-		{
-			`<a onclick="/foo/`,
-			context{state: stateJS, delim: delimDoubleQuote, jsCtx: jsCtxDivOp},
-		},
-		{
-			`<script>/foo/ /=`,
-			context{state: stateJS, element: elementScript},
-		},
-		{
-			`<a onclick="1 /foo`,
-			context{state: stateJS, delim: delimDoubleQuote, jsCtx: jsCtxDivOp},
-		},
-		{
-			`<a onclick="1 /*c*/ /foo`,
-			context{state: stateJS, delim: delimDoubleQuote, jsCtx: jsCtxDivOp},
-		},
-		{
-			`<a onclick="/foo[/]`,
-			context{state: stateJSRegexp, delim: delimDoubleQuote},
-		},
-		{
-			`<a onclick="/foo\/`,
-			context{state: stateJSRegexp, delim: delimDoubleQuote},
-		},
-		{
-			`<a onclick="/foo/`,
-			context{state: stateJS, delim: delimDoubleQuote, jsCtx: jsCtxDivOp},
-		},
-		{
-			`<input checked style="`,
-			context{state: stateCSS, delim: delimDoubleQuote},
-		},
-		{
-			`<a style="//`,
-			context{state: stateCSSLineCmt, delim: delimDoubleQuote},
-		},
-		{
-			`<a style="//</script>`,
-			context{state: stateCSSLineCmt, delim: delimDoubleQuote},
-		},
-		{
-			"<a style='//\n",
-			context{state: stateCSS, delim: delimSingleQuote},
-		},
-		{
-			"<a style='//\r",
-			context{state: stateCSS, delim: delimSingleQuote},
-		},
-		{
-			`<a style="/*`,
-			context{state: stateCSSBlockCmt, delim: delimDoubleQuote},
-		},
-		{
-			`<a style="/*/`,
-			context{state: stateCSSBlockCmt, delim: delimDoubleQuote},
-		},
-		{
-			`<a style="/**/`,
-			context{state: stateCSS, delim: delimDoubleQuote},
-		},
-		{
-			`<a style="background: '`,
-			context{state: stateCSSSqStr, delim: delimDoubleQuote},
-		},
-		{
-			`<a style="background: &quot;`,
-			context{state: stateCSSDqStr, delim: delimDoubleQuote},
-		},
-		{
-			`<a style="background: '/foo?img=`,
-			context{state: stateCSSSqStr, delim: delimDoubleQuote, urlPart: urlPartQueryOrFrag},
-		},
-		{
-			`<a style="background: '/`,
-			context{state: stateCSSSqStr, delim: delimDoubleQuote, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a style="background: url(&#x22;/`,
-			context{state: stateCSSDqURL, delim: delimDoubleQuote, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a style="background: url('/`,
-			context{state: stateCSSSqURL, delim: delimDoubleQuote, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a style="background: url('/)`,
-			context{state: stateCSSSqURL, delim: delimDoubleQuote, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a style="background: url('/ `,
-			context{state: stateCSSSqURL, delim: delimDoubleQuote, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a style="background: url(/`,
-			context{state: stateCSSURL, delim: delimDoubleQuote, urlPart: urlPartPreQuery},
-		},
-		{
-			`<a style="background: url( `,
-			context{state: stateCSSURL, delim: delimDoubleQuote},
-		},
-		{
-			`<a style="background: url( /image?name=`,
-			context{state: stateCSSURL, delim: delimDoubleQuote, urlPart: urlPartQueryOrFrag},
-		},
-		{
-			`<a style="background: url(x)`,
-			context{state: stateCSS, delim: delimDoubleQuote},
-		},
-		{
-			`<a style="background: url('x'`,
-			context{state: stateCSS, delim: delimDoubleQuote},
-		},
-		{
-			`<a style="background: url( x `,
-			context{state: stateCSS, delim: delimDoubleQuote},
-		},
-		{
-			`<!-- foo`,
-			context{state: stateHTMLCmt},
-		},
-		{
-			`<!-->`,
-			context{state: stateHTMLCmt},
-		},
-		{
-			`<!--->`,
-			context{state: stateHTMLCmt},
-		},
-		{
-			`<!-- foo -->`,
-			context{state: stateText},
-		},
-		{
-			`<script`,
-			context{state: stateTag, element: elementScript},
-		},
-		{
-			`<script `,
-			context{state: stateTag, element: elementScript},
-		},
-		{
-			`<script src="foo.js" `,
-			context{state: stateTag, element: elementScript},
-		},
-		{
-			`<script src='foo.js' `,
-			context{state: stateTag, element: elementScript},
-		},
-		{
-			`<script type=text/javascript `,
-			context{state: stateTag, element: elementScript},
-		},
-		{
-			`<script>foo`,
-			context{state: stateJS, jsCtx: jsCtxDivOp, element: elementScript},
-		},
-		{
-			`<script>foo</script>`,
-			context{state: stateText},
-		},
-		{
-			`<script>foo</script><!--`,
-			context{state: stateHTMLCmt},
-		},
-		{
-			`<script>document.write("<p>foo</p>");`,
-			context{state: stateJS, element: elementScript},
-		},
-		{
-			`<script>document.write("<p>foo<\/script>");`,
-			context{state: stateJS, element: elementScript},
-		},
-		{
-			`<script>document.write("<script>alert(1)</script>");`,
-			context{state: stateText},
-		},
-		{
-			`<Script>`,
-			context{state: stateJS, element: elementScript},
-		},
-		{
-			`<SCRIPT>foo`,
-			context{state: stateJS, jsCtx: jsCtxDivOp, element: elementScript},
-		},
-		{
-			`<textarea>value`,
-			context{state: stateRCDATA, element: elementTextarea},
-		},
-		{
-			`<textarea>value</TEXTAREA>`,
-			context{state: stateText},
-		},
-		{
-			`<textarea name=html><b`,
-			context{state: stateRCDATA, element: elementTextarea},
-		},
-		{
-			`<title>value`,
-			context{state: stateRCDATA, element: elementTitle},
-		},
-		{
-			`<style>value`,
-			context{state: stateCSS, element: elementStyle},
-		},
-		{
-			`<a xlink:href`,
-			context{state: stateAttrName, attr: attrURL},
-		},
-		{
-			`<a xmlns`,
-			context{state: stateAttrName, attr: attrURL},
-		},
-		{
-			`<a xmlns:foo`,
-			context{state: stateAttrName, attr: attrURL},
-		},
-		{
-			`<a xmlnsxyz`,
-			context{state: stateAttrName},
-		},
-		{
-			`<a data-url`,
-			context{state: stateAttrName, attr: attrURL},
-		},
-		{
-			`<a data-iconUri`,
-			context{state: stateAttrName, attr: attrURL},
-		},
-		{
-			`<a data-urlItem`,
-			context{state: stateAttrName, attr: attrURL},
-		},
-		{
-			`<a g:`,
-			context{state: stateAttrName},
-		},
-		{
-			`<a g:url`,
-			context{state: stateAttrName, attr: attrURL},
-		},
-		{
-			`<a g:iconUri`,
-			context{state: stateAttrName, attr: attrURL},
-		},
-		{
-			`<a g:urlItem`,
-			context{state: stateAttrName, attr: attrURL},
-		},
-		{
-			`<a g:value`,
-			context{state: stateAttrName},
-		},
-		{
-			`<a svg:style='`,
-			context{state: stateCSS, delim: delimSingleQuote},
-		},
-		{
-			`<svg:font-face`,
-			context{state: stateTag},
-		},
-		{
-			`<svg:a svg:onclick="`,
-			context{state: stateJS, delim: delimDoubleQuote},
-		},
-	}
-
-	for _, test := range tests {
-		b, e := []byte(test.input), newEscaper(nil)
-		c := e.escapeText(context{}, &parse.TextNode{NodeType: parse.NodeText, Text: b})
-		if !test.output.eq(c) {
-			t.Errorf("input %q: want context\n\t%v\ngot\n\t%v", test.input, test.output, c)
-			continue
-		}
-		if test.input != string(b) {
-			t.Errorf("input %q: text node was modified: want %q got %q", test.input, test.input, b)
-			continue
-		}
-	}
-}
-
-func TestEnsurePipelineContains(t *testing.T) {
-	tests := []struct {
-		input, output string
-		ids           []string
-	}{
-		{
-			"{{.X}}",
-			".X",
-			[]string{},
-		},
-		{
-			"{{.X | html}}",
-			".X | html",
-			[]string{},
-		},
-		{
-			"{{.X}}",
-			".X | html",
-			[]string{"html"},
-		},
-		{
-			"{{.X | html}}",
-			".X | html | urlquery",
-			[]string{"urlquery"},
-		},
-		{
-			"{{.X | html | urlquery}}",
-			".X | html | urlquery",
-			[]string{"urlquery"},
-		},
-		{
-			"{{.X | html | urlquery}}",
-			".X | html | urlquery",
-			[]string{"html", "urlquery"},
-		},
-		{
-			"{{.X | html | urlquery}}",
-			".X | html | urlquery",
-			[]string{"html"},
-		},
-		{
-			"{{.X | urlquery}}",
-			".X | html | urlquery",
-			[]string{"html", "urlquery"},
-		},
-		{
-			"{{.X | html | print}}",
-			".X | urlquery | html | print",
-			[]string{"urlquery", "html"},
-		},
-		{
-			"{{($).X | html | print}}",
-			"($).X | urlquery | html | print",
-			[]string{"urlquery", "html"},
-		},
-		{
-			"{{.X | print 2 | .f 3}}",
-			".X | print 2 | .f 3 | urlquery | html",
-			[]string{"urlquery", "html"},
-		},
-		{
-			"{{.X | html | print 2 | .f 3}}",
-			".X | urlquery | html | print 2 | .f 3",
-			[]string{"urlquery", "html"},
-		},
-		{
-			// covering issue 10801
-			"{{.X | js.x }}",
-			".X | js.x | urlquery | html",
-			[]string{"urlquery", "html"},
-		},
-		{
-			// covering issue 10801
-			"{{.X | (print 12 | js).x }}",
-			".X | (print 12 | js).x | urlquery | html",
-			[]string{"urlquery", "html"},
-		},
-	}
-	for i, test := range tests {
-		tmpl := template.Must(template.New("test").Parse(test.input))
-		action, ok := (tmpl.Tree.Root.Nodes[0].(*parse.ActionNode))
-		if !ok {
-			t.Errorf("#%d: First node is not an action: %s", i, test.input)
-			continue
-		}
-		pipe := action.Pipe
-		ensurePipelineContains(pipe, test.ids)
-		got := pipe.String()
-		if got != test.output {
-			t.Errorf("#%d: %s, %v: want\n\t%s\ngot\n\t%s", i, test.input, test.ids, test.output, got)
-		}
-	}
-}
-
-func TestEscapeMalformedPipelines(t *testing.T) {
-	tests := []string{
-		"{{ 0 | $ }}",
-		"{{ 0 | $ | urlquery }}",
-		"{{ 0 | $ | urlquery | html }}",
-		"{{ 0 | (nil) }}",
-		"{{ 0 | (nil) | html }}",
-		"{{ 0 | (nil) | html | urlquery }}",
-	}
-	for _, test := range tests {
-		var b bytes.Buffer
-		tmpl, err := New("test").Parse(test)
-		if err != nil {
-			t.Errorf("failed to parse set: %q", err)
-		}
-		err = tmpl.Execute(&b, nil)
-		if err == nil {
-			t.Errorf("Expected error for %q", test)
-		}
-	}
-}
-
-func TestEscapeErrorsNotIgnorable(t *testing.T) {
-	var b bytes.Buffer
-	tmpl, _ := New("dangerous").Parse("<a")
-	err := tmpl.Execute(&b, nil)
-	if err == nil {
-		t.Errorf("Expected error")
-	} else if b.Len() != 0 {
-		t.Errorf("Emitted output despite escaping failure")
-	}
-}
-
-func TestEscapeSetErrorsNotIgnorable(t *testing.T) {
-	var b bytes.Buffer
-	tmpl, err := New("root").Parse(`{{define "t"}}<a{{end}}`)
-	if err != nil {
-		t.Errorf("failed to parse set: %q", err)
-	}
-	err = tmpl.ExecuteTemplate(&b, "t", nil)
-	if err == nil {
-		t.Errorf("Expected error")
-	} else if b.Len() != 0 {
-		t.Errorf("Emitted output despite escaping failure")
-	}
-}
-
-func TestRedundantFuncs(t *testing.T) {
-	inputs := []interface{}{
-		"\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f" +
-			"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
-			` !"#$%&'()*+,-./` +
-			`0123456789:;<=>?` +
-			`@ABCDEFGHIJKLMNO` +
-			`PQRSTUVWXYZ[\]^_` +
-			"`abcdefghijklmno" +
-			"pqrstuvwxyz{|}~\x7f" +
-			"\u00A0\u0100\u2028\u2029\ufeff\ufdec\ufffd\uffff\U0001D11E" +
-			"&amp;%22\\",
-		CSS(`a[href =~ "//example.com"]#foo`),
-		HTML(`Hello, <b>World</b> &amp;tc!`),
-		HTMLAttr(` dir="ltr"`),
-		JS(`c && alert("Hello, World!");`),
-		JSStr(`Hello, World & O'Reilly\x21`),
-		URL(`greeting=H%69&addressee=(World)`),
-	}
-
-	for n0, m := range redundantFuncs {
-		f0 := funcMap[n0].(func(...interface{}) string)
-		for n1 := range m {
-			f1 := funcMap[n1].(func(...interface{}) string)
-			for _, input := range inputs {
-				want := f0(input)
-				if got := f1(want); want != got {
-					t.Errorf("%s %s with %T %q: want\n\t%q,\ngot\n\t%q", n0, n1, input, input, want, got)
-				}
-			}
-		}
-	}
-}
-
-func TestIndirectPrint(t *testing.T) {
-	a := 3
-	ap := &a
-	b := "hello"
-	bp := &b
-	bpp := &bp
-	tmpl := Must(New("t").Parse(`{{.}}`))
-	var buf bytes.Buffer
-	err := tmpl.Execute(&buf, ap)
-	if err != nil {
-		t.Errorf("Unexpected error: %s", err)
-	} else if buf.String() != "3" {
-		t.Errorf(`Expected "3"; got %q`, buf.String())
-	}
-	buf.Reset()
-	err = tmpl.Execute(&buf, bpp)
-	if err != nil {
-		t.Errorf("Unexpected error: %s", err)
-	} else if buf.String() != "hello" {
-		t.Errorf(`Expected "hello"; got %q`, buf.String())
-	}
-}
-
-// This is a test for issue 3272.
-func TestEmptyTemplate(t *testing.T) {
-	page := Must(New("page").ParseFiles(os.DevNull))
-	if err := page.ExecuteTemplate(os.Stdout, "page", "nothing"); err == nil {
-		t.Fatal("expected error")
-	}
-}
-
-type Issue7379 int
-
-func (Issue7379) SomeMethod(x int) string {
-	return fmt.Sprintf("<%d>", x)
-}
-
-// This is a test for issue 7379: type assertion error caused panic, and then
-// the code to handle the panic breaks escaping. It's hard to see the second
-// problem once the first is fixed, but its fix is trivial so we let that go. See
-// the discussion for issue 7379.
-func TestPipeToMethodIsEscaped(t *testing.T) {
-	tmpl := Must(New("x").Parse("<html>{{0 | .SomeMethod}}</html>\n"))
-	tryExec := func() string {
-		defer func() {
-			panicValue := recover()
-			if panicValue != nil {
-				t.Errorf("panicked: %v\n", panicValue)
-			}
-		}()
-		var b bytes.Buffer
-		tmpl.Execute(&b, Issue7379(0))
-		return b.String()
-	}
-	for i := 0; i < 3; i++ {
-		str := tryExec()
-		const expect = "<html>&lt;0&gt;</html>\n"
-		if str != expect {
-			t.Errorf("expected %q got %q", expect, str)
-		}
-	}
-}
-
-// Unlike text/template, html/template crashed if given an incomplete
-// template, that is, a template that had been named but not given any content.
-// This is issue #10204.
-func TestErrorOnUndefined(t *testing.T) {
-	tmpl := New("undefined")
-
-	err := tmpl.Execute(nil, nil)
-	if err == nil {
-		t.Error("expected error")
-	}
-	if !strings.Contains(err.Error(), "incomplete") {
-		t.Errorf("expected error about incomplete template; got %s", err)
-	}
-}
-
-func BenchmarkEscapedExecute(b *testing.B) {
-	tmpl := Must(New("t").Parse(`<a onclick="alert('{{.}}')">{{.}}</a>`))
-	var buf bytes.Buffer
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		tmpl.Execute(&buf, "foo & 'bar' & baz")
-		buf.Reset()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/example_test.go b/third_party/gofrontend/libgo/go/html/template/example_test.go
deleted file mode 100644
index 3ea3dca..0000000
--- a/third_party/gofrontend/libgo/go/html/template/example_test.go
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package template_test
-
-import (
-	"fmt"
-	"html/template"
-	"log"
-	"os"
-)
-
-func Example() {
-	const tpl = `
-<!DOCTYPE html>
-<html>
-	<head>
-		<meta charset="UTF-8">
-		<title>{{.Title}}</title>
-	</head>
-	<body>
-		{{range .Items}}<div>{{ . }}</div>{{else}}<div><strong>no rows</strong></div>{{end}}
-	</body>
-</html>`
-
-	check := func(err error) {
-		if err != nil {
-			log.Fatal(err)
-		}
-	}
-	t, err := template.New("webpage").Parse(tpl)
-
-	data := struct {
-		Title string
-		Items []string
-	}{
-		Title: "My page",
-		Items: []string{
-			"My photos",
-			"My blog",
-		},
-	}
-
-	err = t.Execute(os.Stdout, data)
-	check(err)
-
-	noItems := struct {
-		Title string
-		Items []string
-	}{
-		Title: "My another page",
-		Items: []string{},
-	}
-
-	err = t.Execute(os.Stdout, noItems)
-	check(err)
-
-	// Output:
-	// <!DOCTYPE html>
-	// <html>
-	// 	<head>
-	// 		<meta charset="UTF-8">
-	// 		<title>My page</title>
-	// 	</head>
-	// 	<body>
-	// 		<div>My photos</div><div>My blog</div>
-	// 	</body>
-	// </html>
-	// <!DOCTYPE html>
-	// <html>
-	// 	<head>
-	// 		<meta charset="UTF-8">
-	// 		<title>My another page</title>
-	// 	</head>
-	// 	<body>
-	// 		<div><strong>no rows</strong></div>
-	// 	</body>
-	// </html>
-
-}
-
-func Example_autoescaping() {
-	check := func(err error) {
-		if err != nil {
-			log.Fatal(err)
-		}
-	}
-	t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
-	check(err)
-	err = t.ExecuteTemplate(os.Stdout, "T", "<script>alert('you have been pwned')</script>")
-	check(err)
-	// Output:
-	// Hello, &lt;script&gt;alert(&#39;you have been pwned&#39;)&lt;/script&gt;!
-}
-
-func Example_escape() {
-	const s = `"Fran & Freddie's Diner" <tasty@example.com>`
-	v := []interface{}{`"Fran & Freddie's Diner"`, ' ', `<tasty@example.com>`}
-
-	fmt.Println(template.HTMLEscapeString(s))
-	template.HTMLEscape(os.Stdout, []byte(s))
-	fmt.Fprintln(os.Stdout, "")
-	fmt.Println(template.HTMLEscaper(v...))
-
-	fmt.Println(template.JSEscapeString(s))
-	template.JSEscape(os.Stdout, []byte(s))
-	fmt.Fprintln(os.Stdout, "")
-	fmt.Println(template.JSEscaper(v...))
-
-	fmt.Println(template.URLQueryEscaper(v...))
-
-	// Output:
-	// &#34;Fran &amp; Freddie&#39;s Diner&#34; &lt;tasty@example.com&gt;
-	// &#34;Fran &amp; Freddie&#39;s Diner&#34; &lt;tasty@example.com&gt;
-	// &#34;Fran &amp; Freddie&#39;s Diner&#34;32&lt;tasty@example.com&gt;
-	// \"Fran & Freddie\'s Diner\" \x3Ctasty@example.com\x3E
-	// \"Fran & Freddie\'s Diner\" \x3Ctasty@example.com\x3E
-	// \"Fran & Freddie\'s Diner\"32\x3Ctasty@example.com\x3E
-	// %22Fran+%26+Freddie%27s+Diner%2232%3Ctasty%40example.com%3E
-
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/html.go b/third_party/gofrontend/libgo/go/html/template/html.go
deleted file mode 100644
index de4aa4a..0000000
--- a/third_party/gofrontend/libgo/go/html/template/html.go
+++ /dev/null
@@ -1,260 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"fmt"
-	"strings"
-	"unicode/utf8"
-)
-
-// htmlNospaceEscaper escapes for inclusion in unquoted attribute values.
-func htmlNospaceEscaper(args ...interface{}) string {
-	s, t := stringify(args...)
-	if t == contentTypeHTML {
-		return htmlReplacer(stripTags(s), htmlNospaceNormReplacementTable, false)
-	}
-	return htmlReplacer(s, htmlNospaceReplacementTable, false)
-}
-
-// attrEscaper escapes for inclusion in quoted attribute values.
-func attrEscaper(args ...interface{}) string {
-	s, t := stringify(args...)
-	if t == contentTypeHTML {
-		return htmlReplacer(stripTags(s), htmlNormReplacementTable, true)
-	}
-	return htmlReplacer(s, htmlReplacementTable, true)
-}
-
-// rcdataEscaper escapes for inclusion in an RCDATA element body.
-func rcdataEscaper(args ...interface{}) string {
-	s, t := stringify(args...)
-	if t == contentTypeHTML {
-		return htmlReplacer(s, htmlNormReplacementTable, true)
-	}
-	return htmlReplacer(s, htmlReplacementTable, true)
-}
-
-// htmlEscaper escapes for inclusion in HTML text.
-func htmlEscaper(args ...interface{}) string {
-	s, t := stringify(args...)
-	if t == contentTypeHTML {
-		return s
-	}
-	return htmlReplacer(s, htmlReplacementTable, true)
-}
-
-// htmlReplacementTable contains the runes that need to be escaped
-// inside a quoted attribute value or in a text node.
-var htmlReplacementTable = []string{
-	// http://www.w3.org/TR/html5/syntax.html#attribute-value-(unquoted)-state
-	// U+0000 NULL Parse error. Append a U+FFFD REPLACEMENT
-	// CHARACTER character to the current attribute's value.
-	// "
-	// and similarly
-	// http://www.w3.org/TR/html5/syntax.html#before-attribute-value-state
-	0:    "\uFFFD",
-	'"':  "&#34;",
-	'&':  "&amp;",
-	'\'': "&#39;",
-	'+':  "&#43;",
-	'<':  "&lt;",
-	'>':  "&gt;",
-}
-
-// htmlNormReplacementTable is like htmlReplacementTable but without '&' to
-// avoid over-encoding existing entities.
-var htmlNormReplacementTable = []string{
-	0:    "\uFFFD",
-	'"':  "&#34;",
-	'\'': "&#39;",
-	'+':  "&#43;",
-	'<':  "&lt;",
-	'>':  "&gt;",
-}
-
-// htmlNospaceReplacementTable contains the runes that need to be escaped
-// inside an unquoted attribute value.
-// The set of runes escaped is the union of the HTML specials and
-// those determined by running the JS below in browsers:
-// <div id=d></div>
-// <script>(function () {
-// var a = [], d = document.getElementById("d"), i, c, s;
-// for (i = 0; i < 0x10000; ++i) {
-//   c = String.fromCharCode(i);
-//   d.innerHTML = "<span title=" + c + "lt" + c + "></span>"
-//   s = d.getElementsByTagName("SPAN")[0];
-//   if (!s || s.title !== c + "lt" + c) { a.push(i.toString(16)); }
-// }
-// document.write(a.join(", "));
-// })()</script>
-var htmlNospaceReplacementTable = []string{
-	0:    "&#xfffd;",
-	'\t': "&#9;",
-	'\n': "&#10;",
-	'\v': "&#11;",
-	'\f': "&#12;",
-	'\r': "&#13;",
-	' ':  "&#32;",
-	'"':  "&#34;",
-	'&':  "&amp;",
-	'\'': "&#39;",
-	'+':  "&#43;",
-	'<':  "&lt;",
-	'=':  "&#61;",
-	'>':  "&gt;",
-	// A parse error in the attribute value (unquoted) and
-	// before attribute value states.
-	// Treated as a quoting character by IE.
-	'`': "&#96;",
-}
-
-// htmlNospaceNormReplacementTable is like htmlNospaceReplacementTable but
-// without '&' to avoid over-encoding existing entities.
-var htmlNospaceNormReplacementTable = []string{
-	0:    "&#xfffd;",
-	'\t': "&#9;",
-	'\n': "&#10;",
-	'\v': "&#11;",
-	'\f': "&#12;",
-	'\r': "&#13;",
-	' ':  "&#32;",
-	'"':  "&#34;",
-	'\'': "&#39;",
-	'+':  "&#43;",
-	'<':  "&lt;",
-	'=':  "&#61;",
-	'>':  "&gt;",
-	// A parse error in the attribute value (unquoted) and
-	// before attribute value states.
-	// Treated as a quoting character by IE.
-	'`': "&#96;",
-}
-
-// htmlReplacer returns s with runes replaced according to replacementTable
-// and when badRunes is true, certain bad runes are allowed through unescaped.
-func htmlReplacer(s string, replacementTable []string, badRunes bool) string {
-	written, b := 0, new(bytes.Buffer)
-	r, w := rune(0), 0
-	for i := 0; i < len(s); i += w {
-		// Cannot use 'for range s' because we need to preserve the width
-		// of the runes in the input. If we see a decoding error, the input
-		// width will not be utf8.Runelen(r) and we will overrun the buffer.
-		r, w = utf8.DecodeRuneInString(s[i:])
-		if int(r) < len(replacementTable) {
-			if repl := replacementTable[r]; len(repl) != 0 {
-				b.WriteString(s[written:i])
-				b.WriteString(repl)
-				written = i + w
-			}
-		} else if badRunes {
-			// No-op.
-			// IE does not allow these ranges in unquoted attrs.
-		} else if 0xfdd0 <= r && r <= 0xfdef || 0xfff0 <= r && r <= 0xffff {
-			fmt.Fprintf(b, "%s&#x%x;", s[written:i], r)
-			written = i + w
-		}
-	}
-	if written == 0 {
-		return s
-	}
-	b.WriteString(s[written:])
-	return b.String()
-}
-
-// stripTags takes a snippet of HTML and returns only the text content.
-// For example, `<b>&iexcl;Hi!</b> <script>...</script>` -> `&iexcl;Hi! `.
-func stripTags(html string) string {
-	var b bytes.Buffer
-	s, c, i, allText := []byte(html), context{}, 0, true
-	// Using the transition funcs helps us avoid mangling
-	// `<div title="1>2">` or `I <3 Ponies!`.
-	for i != len(s) {
-		if c.delim == delimNone {
-			st := c.state
-			// Use RCDATA instead of parsing into JS or CSS styles.
-			if c.element != elementNone && !isInTag(st) {
-				st = stateRCDATA
-			}
-			d, nread := transitionFunc[st](c, s[i:])
-			i1 := i + nread
-			if c.state == stateText || c.state == stateRCDATA {
-				// Emit text up to the start of the tag or comment.
-				j := i1
-				if d.state != c.state {
-					for j1 := j - 1; j1 >= i; j1-- {
-						if s[j1] == '<' {
-							j = j1
-							break
-						}
-					}
-				}
-				b.Write(s[i:j])
-			} else {
-				allText = false
-			}
-			c, i = d, i1
-			continue
-		}
-		i1 := i + bytes.IndexAny(s[i:], delimEnds[c.delim])
-		if i1 < i {
-			break
-		}
-		if c.delim != delimSpaceOrTagEnd {
-			// Consume any quote.
-			i1++
-		}
-		c, i = context{state: stateTag, element: c.element}, i1
-	}
-	if allText {
-		return html
-	} else if c.state == stateText || c.state == stateRCDATA {
-		b.Write(s[i:])
-	}
-	return b.String()
-}
-
-// htmlNameFilter accepts valid parts of an HTML attribute or tag name or
-// a known-safe HTML attribute.
-func htmlNameFilter(args ...interface{}) string {
-	s, t := stringify(args...)
-	if t == contentTypeHTMLAttr {
-		return s
-	}
-	if len(s) == 0 {
-		// Avoid violation of structure preservation.
-		// <input checked {{.K}}={{.V}}>.
-		// Without this, if .K is empty then .V is the value of
-		// checked, but otherwise .V is the value of the attribute
-		// named .K.
-		return filterFailsafe
-	}
-	s = strings.ToLower(s)
-	if t := attrType(s); t != contentTypePlain {
-		// TODO: Split attr and element name part filters so we can whitelist
-		// attributes.
-		return filterFailsafe
-	}
-	for _, r := range s {
-		switch {
-		case '0' <= r && r <= '9':
-		case 'a' <= r && r <= 'z':
-		default:
-			return filterFailsafe
-		}
-	}
-	return s
-}
-
-// commentEscaper returns the empty string regardless of input.
-// Comment content does not correspond to any parsed structure or
-// human-readable content, so the simplest and most secure policy is to drop
-// content interpolated into comments.
-// This approach is equally valid whether or not static comment content is
-// removed from the template.
-func commentEscaper(args ...interface{}) string {
-	return ""
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/html_test.go b/third_party/gofrontend/libgo/go/html/template/html_test.go
deleted file mode 100644
index f04ee04..0000000
--- a/third_party/gofrontend/libgo/go/html/template/html_test.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"html"
-	"strings"
-	"testing"
-)
-
-func TestHTMLNospaceEscaper(t *testing.T) {
-	input := ("\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f" +
-		"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
-		` !"#$%&'()*+,-./` +
-		`0123456789:;<=>?` +
-		`@ABCDEFGHIJKLMNO` +
-		`PQRSTUVWXYZ[\]^_` +
-		"`abcdefghijklmno" +
-		"pqrstuvwxyz{|}~\x7f" +
-		"\u00A0\u0100\u2028\u2029\ufeff\ufdec\U0001D11E" +
-		"erroneous\x960") // keep at the end
-
-	want := ("&#xfffd;\x01\x02\x03\x04\x05\x06\x07" +
-		"\x08&#9;&#10;&#11;&#12;&#13;\x0E\x0F" +
-		"\x10\x11\x12\x13\x14\x15\x16\x17" +
-		"\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
-		`&#32;!&#34;#$%&amp;&#39;()*&#43;,-./` +
-		`0123456789:;&lt;&#61;&gt;?` +
-		`@ABCDEFGHIJKLMNO` +
-		`PQRSTUVWXYZ[\]^_` +
-		`&#96;abcdefghijklmno` +
-		`pqrstuvwxyz{|}~` + "\u007f" +
-		"\u00A0\u0100\u2028\u2029\ufeff&#xfdec;\U0001D11E" +
-		"erroneous&#xfffd;0") // keep at the end
-
-	got := htmlNospaceEscaper(input)
-	if got != want {
-		t.Errorf("encode: want\n\t%q\nbut got\n\t%q", want, got)
-	}
-
-	r := strings.NewReplacer("\x00", "\ufffd", "\x96", "\ufffd")
-	got, want = html.UnescapeString(got), r.Replace(input)
-	if want != got {
-		t.Errorf("decode: want\n\t%q\nbut got\n\t%q", want, got)
-	}
-}
-
-func TestStripTags(t *testing.T) {
-	tests := []struct {
-		input, want string
-	}{
-		{"", ""},
-		{"Hello, World!", "Hello, World!"},
-		{"foo&amp;bar", "foo&amp;bar"},
-		{`Hello <a href="www.example.com/">World</a>!`, "Hello World!"},
-		{"Foo <textarea>Bar</textarea> Baz", "Foo Bar Baz"},
-		{"Foo <!-- Bar --> Baz", "Foo  Baz"},
-		{"<", "<"},
-		{"foo < bar", "foo < bar"},
-		{`Foo<script type="text/javascript">alert(1337)</script>Bar`, "FooBar"},
-		{`Foo<div title="1>2">Bar`, "FooBar"},
-		{`I <3 Ponies!`, `I <3 Ponies!`},
-		{`<script>foo()</script>`, ``},
-	}
-
-	for _, test := range tests {
-		if got := stripTags(test.input); got != test.want {
-			t.Errorf("%q: want %q, got %q", test.input, test.want, got)
-		}
-	}
-}
-
-func BenchmarkHTMLNospaceEscaper(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		htmlNospaceEscaper("The <i>quick</i>,\r\n<span style='color:brown'>brown</span> fox jumps\u2028over the <canine class=\"lazy\">dog</canine>")
-	}
-}
-
-func BenchmarkHTMLNospaceEscaperNoSpecials(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		htmlNospaceEscaper("The_quick,_brown_fox_jumps_over_the_lazy_dog.")
-	}
-}
-
-func BenchmarkStripTags(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		stripTags("The <i>quick</i>,\r\n<span style='color:brown'>brown</span> fox jumps\u2028over the <canine class=\"lazy\">dog</canine>")
-	}
-}
-
-func BenchmarkStripTagsNoSpecials(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		stripTags("The quick, brown fox jumps over the lazy dog.")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/js.go b/third_party/gofrontend/libgo/go/html/template/js.go
deleted file mode 100644
index f6d166b..0000000
--- a/third_party/gofrontend/libgo/go/html/template/js.go
+++ /dev/null
@@ -1,364 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"encoding/json"
-	"fmt"
-	"reflect"
-	"strings"
-	"unicode/utf8"
-)
-
-// nextJSCtx returns the context that determines whether a slash after the
-// given run of tokens starts a regular expression instead of a division
-// operator: / or /=.
-//
-// This assumes that the token run does not include any string tokens, comment
-// tokens, regular expression literal tokens, or division operators.
-//
-// This fails on some valid but nonsensical JavaScript programs like
-// "x = ++/foo/i" which is quite different than "x++/foo/i", but is not known to
-// fail on any known useful programs. It is based on the draft
-// JavaScript 2.0 lexical grammar and requires one token of lookbehind:
-// http://www.mozilla.org/js/language/js20-2000-07/rationale/syntax.html
-func nextJSCtx(s []byte, preceding jsCtx) jsCtx {
-	s = bytes.TrimRight(s, "\t\n\f\r \u2028\u2029")
-	if len(s) == 0 {
-		return preceding
-	}
-
-	// All cases below are in the single-byte UTF-8 group.
-	switch c, n := s[len(s)-1], len(s); c {
-	case '+', '-':
-		// ++ and -- are not regexp preceders, but + and - are whether
-		// they are used as infix or prefix operators.
-		start := n - 1
-		// Count the number of adjacent dashes or pluses.
-		for start > 0 && s[start-1] == c {
-			start--
-		}
-		if (n-start)&1 == 1 {
-			// Reached for trailing minus signs since "---" is the
-			// same as "-- -".
-			return jsCtxRegexp
-		}
-		return jsCtxDivOp
-	case '.':
-		// Handle "42."
-		if n != 1 && '0' <= s[n-2] && s[n-2] <= '9' {
-			return jsCtxDivOp
-		}
-		return jsCtxRegexp
-	// Suffixes for all punctuators from section 7.7 of the language spec
-	// that only end binary operators not handled above.
-	case ',', '<', '>', '=', '*', '%', '&', '|', '^', '?':
-		return jsCtxRegexp
-	// Suffixes for all punctuators from section 7.7 of the language spec
-	// that are prefix operators not handled above.
-	case '!', '~':
-		return jsCtxRegexp
-	// Matches all the punctuators from section 7.7 of the language spec
-	// that are open brackets not handled above.
-	case '(', '[':
-		return jsCtxRegexp
-	// Matches all the punctuators from section 7.7 of the language spec
-	// that precede expression starts.
-	case ':', ';', '{':
-		return jsCtxRegexp
-	// CAVEAT: the close punctuators ('}', ']', ')') precede div ops and
-	// are handled in the default except for '}' which can precede a
-	// division op as in
-	//    ({ valueOf: function () { return 42 } } / 2
-	// which is valid, but, in practice, developers don't divide object
-	// literals, so our heuristic works well for code like
-	//    function () { ... }  /foo/.test(x) && sideEffect();
-	// The ')' punctuator can precede a regular expression as in
-	//     if (b) /foo/.test(x) && ...
-	// but this is much less likely than
-	//     (a + b) / c
-	case '}':
-		return jsCtxRegexp
-	default:
-		// Look for an IdentifierName and see if it is a keyword that
-		// can precede a regular expression.
-		j := n
-		for j > 0 && isJSIdentPart(rune(s[j-1])) {
-			j--
-		}
-		if regexpPrecederKeywords[string(s[j:])] {
-			return jsCtxRegexp
-		}
-	}
-	// Otherwise is a punctuator not listed above, or
-	// a string which precedes a div op, or an identifier
-	// which precedes a div op.
-	return jsCtxDivOp
-}
-
-// regexpPrecederKeywords is a set of reserved JS keywords that can precede a
-// regular expression in JS source.
-var regexpPrecederKeywords = map[string]bool{
-	"break":      true,
-	"case":       true,
-	"continue":   true,
-	"delete":     true,
-	"do":         true,
-	"else":       true,
-	"finally":    true,
-	"in":         true,
-	"instanceof": true,
-	"return":     true,
-	"throw":      true,
-	"try":        true,
-	"typeof":     true,
-	"void":       true,
-}
-
-var jsonMarshalType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
-
-// indirectToJSONMarshaler returns the value, after dereferencing as many times
-// as necessary to reach the base type (or nil) or an implementation of json.Marshal.
-func indirectToJSONMarshaler(a interface{}) interface{} {
-	v := reflect.ValueOf(a)
-	for !v.Type().Implements(jsonMarshalType) && v.Kind() == reflect.Ptr && !v.IsNil() {
-		v = v.Elem()
-	}
-	return v.Interface()
-}
-
-// jsValEscaper escapes its inputs to a JS Expression (section 11.14) that has
-// neither side-effects nor free variables outside (NaN, Infinity).
-func jsValEscaper(args ...interface{}) string {
-	var a interface{}
-	if len(args) == 1 {
-		a = indirectToJSONMarshaler(args[0])
-		switch t := a.(type) {
-		case JS:
-			return string(t)
-		case JSStr:
-			// TODO: normalize quotes.
-			return `"` + string(t) + `"`
-		case json.Marshaler:
-			// Do not treat as a Stringer.
-		case fmt.Stringer:
-			a = t.String()
-		}
-	} else {
-		for i, arg := range args {
-			args[i] = indirectToJSONMarshaler(arg)
-		}
-		a = fmt.Sprint(args...)
-	}
-	// TODO: detect cycles before calling Marshal which loops infinitely on
-	// cyclic data. This may be an unacceptable DoS risk.
-
-	b, err := json.Marshal(a)
-	if err != nil {
-		// Put a space before comment so that if it is flush against
-		// a division operator it is not turned into a line comment:
-		//     x/{{y}}
-		// turning into
-		//     x//* error marshalling y:
-		//          second line of error message */null
-		return fmt.Sprintf(" /* %s */null ", strings.Replace(err.Error(), "*/", "* /", -1))
-	}
-
-	// TODO: maybe post-process output to prevent it from containing
-	// "<!--", "-->", "<![CDATA[", "]]>", or "</script"
-	// in case custom marshallers produce output containing those.
-
-	// TODO: Maybe abbreviate \u00ab to \xab to produce more compact output.
-	if len(b) == 0 {
-		// In, `x=y/{{.}}*z` a json.Marshaler that produces "" should
-		// not cause the output `x=y/*z`.
-		return " null "
-	}
-	first, _ := utf8.DecodeRune(b)
-	last, _ := utf8.DecodeLastRune(b)
-	var buf bytes.Buffer
-	// Prevent IdentifierNames and NumericLiterals from running into
-	// keywords: in, instanceof, typeof, void
-	pad := isJSIdentPart(first) || isJSIdentPart(last)
-	if pad {
-		buf.WriteByte(' ')
-	}
-	written := 0
-	// Make sure that json.Marshal escapes codepoints U+2028 & U+2029
-	// so it falls within the subset of JSON which is valid JS.
-	for i := 0; i < len(b); {
-		rune, n := utf8.DecodeRune(b[i:])
-		repl := ""
-		if rune == 0x2028 {
-			repl = `\u2028`
-		} else if rune == 0x2029 {
-			repl = `\u2029`
-		}
-		if repl != "" {
-			buf.Write(b[written:i])
-			buf.WriteString(repl)
-			written = i + n
-		}
-		i += n
-	}
-	if buf.Len() != 0 {
-		buf.Write(b[written:])
-		if pad {
-			buf.WriteByte(' ')
-		}
-		b = buf.Bytes()
-	}
-	return string(b)
-}
-
-// jsStrEscaper produces a string that can be included between quotes in
-// JavaScript source, in JavaScript embedded in an HTML5 <script> element,
-// or in an HTML5 event handler attribute such as onclick.
-func jsStrEscaper(args ...interface{}) string {
-	s, t := stringify(args...)
-	if t == contentTypeJSStr {
-		return replace(s, jsStrNormReplacementTable)
-	}
-	return replace(s, jsStrReplacementTable)
-}
-
-// jsRegexpEscaper behaves like jsStrEscaper but escapes regular expression
-// specials so the result is treated literally when included in a regular
-// expression literal. /foo{{.X}}bar/ matches the string "foo" followed by
-// the literal text of {{.X}} followed by the string "bar".
-func jsRegexpEscaper(args ...interface{}) string {
-	s, _ := stringify(args...)
-	s = replace(s, jsRegexpReplacementTable)
-	if s == "" {
-		// /{{.X}}/ should not produce a line comment when .X == "".
-		return "(?:)"
-	}
-	return s
-}
-
-// replace replaces each rune r of s with replacementTable[r], provided that
-// r < len(replacementTable). If replacementTable[r] is the empty string then
-// no replacement is made.
-// It also replaces runes U+2028 and U+2029 with the raw strings `\u2028` and
-// `\u2029`.
-func replace(s string, replacementTable []string) string {
-	var b bytes.Buffer
-	r, w, written := rune(0), 0, 0
-	for i := 0; i < len(s); i += w {
-		// See comment in htmlEscaper.
-		r, w = utf8.DecodeRuneInString(s[i:])
-		var repl string
-		switch {
-		case int(r) < len(replacementTable) && replacementTable[r] != "":
-			repl = replacementTable[r]
-		case r == '\u2028':
-			repl = `\u2028`
-		case r == '\u2029':
-			repl = `\u2029`
-		default:
-			continue
-		}
-		b.WriteString(s[written:i])
-		b.WriteString(repl)
-		written = i + w
-	}
-	if written == 0 {
-		return s
-	}
-	b.WriteString(s[written:])
-	return b.String()
-}
-
-var jsStrReplacementTable = []string{
-	0:    `\0`,
-	'\t': `\t`,
-	'\n': `\n`,
-	'\v': `\x0b`, // "\v" == "v" on IE 6.
-	'\f': `\f`,
-	'\r': `\r`,
-	// Encode HTML specials as hex so the output can be embedded
-	// in HTML attributes without further encoding.
-	'"':  `\x22`,
-	'&':  `\x26`,
-	'\'': `\x27`,
-	'+':  `\x2b`,
-	'/':  `\/`,
-	'<':  `\x3c`,
-	'>':  `\x3e`,
-	'\\': `\\`,
-}
-
-// jsStrNormReplacementTable is like jsStrReplacementTable but does not
-// overencode existing escapes since this table has no entry for `\`.
-var jsStrNormReplacementTable = []string{
-	0:    `\0`,
-	'\t': `\t`,
-	'\n': `\n`,
-	'\v': `\x0b`, // "\v" == "v" on IE 6.
-	'\f': `\f`,
-	'\r': `\r`,
-	// Encode HTML specials as hex so the output can be embedded
-	// in HTML attributes without further encoding.
-	'"':  `\x22`,
-	'&':  `\x26`,
-	'\'': `\x27`,
-	'+':  `\x2b`,
-	'/':  `\/`,
-	'<':  `\x3c`,
-	'>':  `\x3e`,
-}
-
-var jsRegexpReplacementTable = []string{
-	0:    `\0`,
-	'\t': `\t`,
-	'\n': `\n`,
-	'\v': `\x0b`, // "\v" == "v" on IE 6.
-	'\f': `\f`,
-	'\r': `\r`,
-	// Encode HTML specials as hex so the output can be embedded
-	// in HTML attributes without further encoding.
-	'"':  `\x22`,
-	'$':  `\$`,
-	'&':  `\x26`,
-	'\'': `\x27`,
-	'(':  `\(`,
-	')':  `\)`,
-	'*':  `\*`,
-	'+':  `\x2b`,
-	'-':  `\-`,
-	'.':  `\.`,
-	'/':  `\/`,
-	'<':  `\x3c`,
-	'>':  `\x3e`,
-	'?':  `\?`,
-	'[':  `\[`,
-	'\\': `\\`,
-	']':  `\]`,
-	'^':  `\^`,
-	'{':  `\{`,
-	'|':  `\|`,
-	'}':  `\}`,
-}
-
-// isJSIdentPart reports whether the given rune is a JS identifier part.
-// It does not handle all the non-Latin letters, joiners, and combining marks,
-// but it does handle every codepoint that can occur in a numeric literal or
-// a keyword.
-func isJSIdentPart(r rune) bool {
-	switch {
-	case r == '$':
-		return true
-	case '0' <= r && r <= '9':
-		return true
-	case 'A' <= r && r <= 'Z':
-		return true
-	case r == '_':
-		return true
-	case 'a' <= r && r <= 'z':
-		return true
-	}
-	return false
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/js_test.go b/third_party/gofrontend/libgo/go/html/template/js_test.go
deleted file mode 100644
index 7af7997..0000000
--- a/third_party/gofrontend/libgo/go/html/template/js_test.go
+++ /dev/null
@@ -1,401 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"math"
-	"strings"
-	"testing"
-)
-
-func TestNextJsCtx(t *testing.T) {
-	tests := []struct {
-		jsCtx jsCtx
-		s     string
-	}{
-		// Statement terminators precede regexps.
-		{jsCtxRegexp, ";"},
-		// This is not airtight.
-		//     ({ valueOf: function () { return 1 } } / 2)
-		// is valid JavaScript but in practice, devs do not do this.
-		// A block followed by a statement starting with a RegExp is
-		// much more common:
-		//     while (x) {...} /foo/.test(x) || panic()
-		{jsCtxRegexp, "}"},
-		// But member, call, grouping, and array expression terminators
-		// precede div ops.
-		{jsCtxDivOp, ")"},
-		{jsCtxDivOp, "]"},
-		// At the start of a primary expression, array, or expression
-		// statement, expect a regexp.
-		{jsCtxRegexp, "("},
-		{jsCtxRegexp, "["},
-		{jsCtxRegexp, "{"},
-		// Assignment operators precede regexps as do all exclusively
-		// prefix and binary operators.
-		{jsCtxRegexp, "="},
-		{jsCtxRegexp, "+="},
-		{jsCtxRegexp, "*="},
-		{jsCtxRegexp, "*"},
-		{jsCtxRegexp, "!"},
-		// Whether the + or - is infix or prefix, it cannot precede a
-		// div op.
-		{jsCtxRegexp, "+"},
-		{jsCtxRegexp, "-"},
-		// An incr/decr op precedes a div operator.
-		// This is not airtight. In (g = ++/h/i) a regexp follows a
-		// pre-increment operator, but in practice devs do not try to
-		// increment or decrement regular expressions.
-		// (g++/h/i) where ++ is a postfix operator on g is much more
-		// common.
-		{jsCtxDivOp, "--"},
-		{jsCtxDivOp, "++"},
-		{jsCtxDivOp, "x--"},
-		// When we have many dashes or pluses, then they are grouped
-		// left to right.
-		{jsCtxRegexp, "x---"}, // A postfix -- then a -.
-		// return followed by a slash returns the regexp literal or the
-		// slash starts a regexp literal in an expression statement that
-		// is dead code.
-		{jsCtxRegexp, "return"},
-		{jsCtxRegexp, "return "},
-		{jsCtxRegexp, "return\t"},
-		{jsCtxRegexp, "return\n"},
-		{jsCtxRegexp, "return\u2028"},
-		// Identifiers can be divided and cannot validly be preceded by
-		// a regular expressions. Semicolon insertion cannot happen
-		// between an identifier and a regular expression on a new line
-		// because the one token lookahead for semicolon insertion has
-		// to conclude that it could be a div binary op and treat it as
-		// such.
-		{jsCtxDivOp, "x"},
-		{jsCtxDivOp, "x "},
-		{jsCtxDivOp, "x\t"},
-		{jsCtxDivOp, "x\n"},
-		{jsCtxDivOp, "x\u2028"},
-		{jsCtxDivOp, "preturn"},
-		// Numbers precede div ops.
-		{jsCtxDivOp, "0"},
-		// Dots that are part of a number are div preceders.
-		{jsCtxDivOp, "0."},
-	}
-
-	for _, test := range tests {
-		if nextJSCtx([]byte(test.s), jsCtxRegexp) != test.jsCtx {
-			t.Errorf("want %s got %q", test.jsCtx, test.s)
-		}
-		if nextJSCtx([]byte(test.s), jsCtxDivOp) != test.jsCtx {
-			t.Errorf("want %s got %q", test.jsCtx, test.s)
-		}
-	}
-
-	if nextJSCtx([]byte("   "), jsCtxRegexp) != jsCtxRegexp {
-		t.Error("Blank tokens")
-	}
-
-	if nextJSCtx([]byte("   "), jsCtxDivOp) != jsCtxDivOp {
-		t.Error("Blank tokens")
-	}
-}
-
-func TestJSValEscaper(t *testing.T) {
-	tests := []struct {
-		x  interface{}
-		js string
-	}{
-		{int(42), " 42 "},
-		{uint(42), " 42 "},
-		{int16(42), " 42 "},
-		{uint16(42), " 42 "},
-		{int32(-42), " -42 "},
-		{uint32(42), " 42 "},
-		{int16(-42), " -42 "},
-		{uint16(42), " 42 "},
-		{int64(-42), " -42 "},
-		{uint64(42), " 42 "},
-		{uint64(1) << 53, " 9007199254740992 "},
-		// ulp(1 << 53) > 1 so this loses precision in JS
-		// but it is still a representable integer literal.
-		{uint64(1)<<53 + 1, " 9007199254740993 "},
-		{float32(1.0), " 1 "},
-		{float32(-1.0), " -1 "},
-		{float32(0.5), " 0.5 "},
-		{float32(-0.5), " -0.5 "},
-		{float32(1.0) / float32(256), " 0.00390625 "},
-		{float32(0), " 0 "},
-		{math.Copysign(0, -1), " -0 "},
-		{float64(1.0), " 1 "},
-		{float64(-1.0), " -1 "},
-		{float64(0.5), " 0.5 "},
-		{float64(-0.5), " -0.5 "},
-		{float64(0), " 0 "},
-		{math.Copysign(0, -1), " -0 "},
-		{"", `""`},
-		{"foo", `"foo"`},
-		// Newlines.
-		{"\r\n\u2028\u2029", `"\r\n\u2028\u2029"`},
-		// "\v" == "v" on IE 6 so use "\x0b" instead.
-		{"\t\x0b", `"\t\u000b"`},
-		{struct{ X, Y int }{1, 2}, `{"X":1,"Y":2}`},
-		{[]interface{}{}, "[]"},
-		{[]interface{}{42, "foo", nil}, `[42,"foo",null]`},
-		{[]string{"<!--", "</script>", "-->"}, `["\u003c!--","\u003c/script\u003e","--\u003e"]`},
-		{"<!--", `"\u003c!--"`},
-		{"-->", `"--\u003e"`},
-		{"<![CDATA[", `"\u003c![CDATA["`},
-		{"]]>", `"]]\u003e"`},
-		{"</script", `"\u003c/script"`},
-		{"\U0001D11E", "\"\U0001D11E\""}, // or "\uD834\uDD1E"
-	}
-
-	for _, test := range tests {
-		if js := jsValEscaper(test.x); js != test.js {
-			t.Errorf("%+v: want\n\t%q\ngot\n\t%q", test.x, test.js, js)
-		}
-		// Make sure that escaping corner cases are not broken
-		// by nesting.
-		a := []interface{}{test.x}
-		want := "[" + strings.TrimSpace(test.js) + "]"
-		if js := jsValEscaper(a); js != want {
-			t.Errorf("%+v: want\n\t%q\ngot\n\t%q", a, want, js)
-		}
-	}
-}
-
-func TestJSStrEscaper(t *testing.T) {
-	tests := []struct {
-		x   interface{}
-		esc string
-	}{
-		{"", ``},
-		{"foo", `foo`},
-		{"\u0000", `\0`},
-		{"\t", `\t`},
-		{"\n", `\n`},
-		{"\r", `\r`},
-		{"\u2028", `\u2028`},
-		{"\u2029", `\u2029`},
-		{"\\", `\\`},
-		{"\\n", `\\n`},
-		{"foo\r\nbar", `foo\r\nbar`},
-		// Preserve attribute boundaries.
-		{`"`, `\x22`},
-		{`'`, `\x27`},
-		// Allow embedding in HTML without further escaping.
-		{`&amp;`, `\x26amp;`},
-		// Prevent breaking out of text node and element boundaries.
-		{"</script>", `\x3c\/script\x3e`},
-		{"<![CDATA[", `\x3c![CDATA[`},
-		{"]]>", `]]\x3e`},
-		// http://dev.w3.org/html5/markup/aria/syntax.html#escaping-text-span
-		//   "The text in style, script, title, and textarea elements
-		//   must not have an escaping text span start that is not
-		//   followed by an escaping text span end."
-		// Furthermore, spoofing an escaping text span end could lead
-		// to different interpretation of a </script> sequence otherwise
-		// masked by the escaping text span, and spoofing a start could
-		// allow regular text content to be interpreted as script
-		// allowing script execution via a combination of a JS string
-		// injection followed by an HTML text injection.
-		{"<!--", `\x3c!--`},
-		{"-->", `--\x3e`},
-		// From http://code.google.com/p/doctype/wiki/ArticleUtf7
-		{"+ADw-script+AD4-alert(1)+ADw-/script+AD4-",
-			`\x2bADw-script\x2bAD4-alert(1)\x2bADw-\/script\x2bAD4-`,
-		},
-		// Invalid UTF-8 sequence
-		{"foo\xA0bar", "foo\xA0bar"},
-		// Invalid unicode scalar value.
-		{"foo\xed\xa0\x80bar", "foo\xed\xa0\x80bar"},
-	}
-
-	for _, test := range tests {
-		esc := jsStrEscaper(test.x)
-		if esc != test.esc {
-			t.Errorf("%q: want %q got %q", test.x, test.esc, esc)
-		}
-	}
-}
-
-func TestJSRegexpEscaper(t *testing.T) {
-	tests := []struct {
-		x   interface{}
-		esc string
-	}{
-		{"", `(?:)`},
-		{"foo", `foo`},
-		{"\u0000", `\0`},
-		{"\t", `\t`},
-		{"\n", `\n`},
-		{"\r", `\r`},
-		{"\u2028", `\u2028`},
-		{"\u2029", `\u2029`},
-		{"\\", `\\`},
-		{"\\n", `\\n`},
-		{"foo\r\nbar", `foo\r\nbar`},
-		// Preserve attribute boundaries.
-		{`"`, `\x22`},
-		{`'`, `\x27`},
-		// Allow embedding in HTML without further escaping.
-		{`&amp;`, `\x26amp;`},
-		// Prevent breaking out of text node and element boundaries.
-		{"</script>", `\x3c\/script\x3e`},
-		{"<![CDATA[", `\x3c!\[CDATA\[`},
-		{"]]>", `\]\]\x3e`},
-		// Escaping text spans.
-		{"<!--", `\x3c!\-\-`},
-		{"-->", `\-\-\x3e`},
-		{"*", `\*`},
-		{"+", `\x2b`},
-		{"?", `\?`},
-		{"[](){}", `\[\]\(\)\{\}`},
-		{"$foo|x.y", `\$foo\|x\.y`},
-		{"x^y", `x\^y`},
-	}
-
-	for _, test := range tests {
-		esc := jsRegexpEscaper(test.x)
-		if esc != test.esc {
-			t.Errorf("%q: want %q got %q", test.x, test.esc, esc)
-		}
-	}
-}
-
-func TestEscapersOnLower7AndSelectHighCodepoints(t *testing.T) {
-	input := ("\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f" +
-		"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
-		` !"#$%&'()*+,-./` +
-		`0123456789:;<=>?` +
-		`@ABCDEFGHIJKLMNO` +
-		`PQRSTUVWXYZ[\]^_` +
-		"`abcdefghijklmno" +
-		"pqrstuvwxyz{|}~\x7f" +
-		"\u00A0\u0100\u2028\u2029\ufeff\U0001D11E")
-
-	tests := []struct {
-		name    string
-		escaper func(...interface{}) string
-		escaped string
-	}{
-		{
-			"jsStrEscaper",
-			jsStrEscaper,
-			"\\0\x01\x02\x03\x04\x05\x06\x07" +
-				"\x08\\t\\n\\x0b\\f\\r\x0E\x0F" +
-				"\x10\x11\x12\x13\x14\x15\x16\x17" +
-				"\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
-				` !\x22#$%\x26\x27()*\x2b,-.\/` +
-				`0123456789:;\x3c=\x3e?` +
-				`@ABCDEFGHIJKLMNO` +
-				`PQRSTUVWXYZ[\\]^_` +
-				"`abcdefghijklmno" +
-				"pqrstuvwxyz{|}~\x7f" +
-				"\u00A0\u0100\\u2028\\u2029\ufeff\U0001D11E",
-		},
-		{
-			"jsRegexpEscaper",
-			jsRegexpEscaper,
-			"\\0\x01\x02\x03\x04\x05\x06\x07" +
-				"\x08\\t\\n\\x0b\\f\\r\x0E\x0F" +
-				"\x10\x11\x12\x13\x14\x15\x16\x17" +
-				"\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
-				` !\x22#\$%\x26\x27\(\)\*\x2b,\-\.\/` +
-				`0123456789:;\x3c=\x3e\?` +
-				`@ABCDEFGHIJKLMNO` +
-				`PQRSTUVWXYZ\[\\\]\^_` +
-				"`abcdefghijklmno" +
-				`pqrstuvwxyz\{\|\}~` + "\u007f" +
-				"\u00A0\u0100\\u2028\\u2029\ufeff\U0001D11E",
-		},
-	}
-
-	for _, test := range tests {
-		if s := test.escaper(input); s != test.escaped {
-			t.Errorf("%s once: want\n\t%q\ngot\n\t%q", test.name, test.escaped, s)
-			continue
-		}
-
-		// Escape it rune by rune to make sure that any
-		// fast-path checking does not break escaping.
-		var buf bytes.Buffer
-		for _, c := range input {
-			buf.WriteString(test.escaper(string(c)))
-		}
-
-		if s := buf.String(); s != test.escaped {
-			t.Errorf("%s rune-wise: want\n\t%q\ngot\n\t%q", test.name, test.escaped, s)
-			continue
-		}
-	}
-}
-
-func BenchmarkJSValEscaperWithNum(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		jsValEscaper(3.141592654)
-	}
-}
-
-func BenchmarkJSValEscaperWithStr(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		jsValEscaper("The <i>quick</i>,\r\n<span style='color:brown'>brown</span> fox jumps\u2028over the <canine class=\"lazy\">dog</canine>")
-	}
-}
-
-func BenchmarkJSValEscaperWithStrNoSpecials(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		jsValEscaper("The quick, brown fox jumps over the lazy dog")
-	}
-}
-
-func BenchmarkJSValEscaperWithObj(b *testing.B) {
-	o := struct {
-		S string
-		N int
-	}{
-		"The <i>quick</i>,\r\n<span style='color:brown'>brown</span> fox jumps\u2028over the <canine class=\"lazy\">dog</canine>\u2028",
-		42,
-	}
-	for i := 0; i < b.N; i++ {
-		jsValEscaper(o)
-	}
-}
-
-func BenchmarkJSValEscaperWithObjNoSpecials(b *testing.B) {
-	o := struct {
-		S string
-		N int
-	}{
-		"The quick, brown fox jumps over the lazy dog",
-		42,
-	}
-	for i := 0; i < b.N; i++ {
-		jsValEscaper(o)
-	}
-}
-
-func BenchmarkJSStrEscaperNoSpecials(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		jsStrEscaper("The quick, brown fox jumps over the lazy dog.")
-	}
-}
-
-func BenchmarkJSStrEscaper(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		jsStrEscaper("The <i>quick</i>,\r\n<span style='color:brown'>brown</span> fox jumps\u2028over the <canine class=\"lazy\">dog</canine>")
-	}
-}
-
-func BenchmarkJSRegexpEscaperNoSpecials(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		jsRegexpEscaper("The quick, brown fox jumps over the lazy dog")
-	}
-}
-
-func BenchmarkJSRegexpEscaper(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		jsRegexpEscaper("The <i>quick</i>,\r\n<span style='color:brown'>brown</span> fox jumps\u2028over the <canine class=\"lazy\">dog</canine>")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/template.go b/third_party/gofrontend/libgo/go/html/template/template.go
deleted file mode 100644
index bb9140a..0000000
--- a/third_party/gofrontend/libgo/go/html/template/template.go
+++ /dev/null
@@ -1,415 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"fmt"
-	"io"
-	"io/ioutil"
-	"path/filepath"
-	"sync"
-	"text/template"
-	"text/template/parse"
-)
-
-// Template is a specialized Template from "text/template" that produces a safe
-// HTML document fragment.
-type Template struct {
-	// Sticky error if escaping fails.
-	escapeErr error
-	// We could embed the text/template field, but it's safer not to because
-	// we need to keep our version of the name space and the underlying
-	// template's in sync.
-	text *template.Template
-	// The underlying template's parse tree, updated to be HTML-safe.
-	Tree       *parse.Tree
-	*nameSpace // common to all associated templates
-}
-
-// escapeOK is a sentinel value used to indicate valid escaping.
-var escapeOK = fmt.Errorf("template escaped correctly")
-
-// nameSpace is the data structure shared by all templates in an association.
-type nameSpace struct {
-	mu  sync.Mutex
-	set map[string]*Template
-}
-
-// Templates returns a slice of the templates associated with t, including t
-// itself.
-func (t *Template) Templates() []*Template {
-	ns := t.nameSpace
-	ns.mu.Lock()
-	defer ns.mu.Unlock()
-	// Return a slice so we don't expose the map.
-	m := make([]*Template, 0, len(ns.set))
-	for _, v := range ns.set {
-		m = append(m, v)
-	}
-	return m
-}
-
-// Option sets options for the template. Options are described by
-// strings, either a simple string or "key=value". There can be at
-// most one equals sign in an option string. If the option string
-// is unrecognized or otherwise invalid, Option panics.
-//
-// Known options:
-//
-// missingkey: Control the behavior during execution if a map is
-// indexed with a key that is not present in the map.
-//	"missingkey=default" or "missingkey=invalid"
-//		The default behavior: Do nothing and continue execution.
-//		If printed, the result of the index operation is the string
-//		"<no value>".
-//	"missingkey=zero"
-//		The operation returns the zero value for the map type's element.
-//	"missingkey=error"
-//		Execution stops immediately with an error.
-//
-func (t *Template) Option(opt ...string) *Template {
-	t.text.Option(opt...)
-	return t
-}
-
-// escape escapes all associated templates.
-func (t *Template) escape() error {
-	t.nameSpace.mu.Lock()
-	defer t.nameSpace.mu.Unlock()
-	if t.escapeErr == nil {
-		if t.Tree == nil {
-			return fmt.Errorf("template: %q is an incomplete or empty template%s", t.Name(), t.text.DefinedTemplates())
-		}
-		if err := escapeTemplate(t, t.text.Root, t.Name()); err != nil {
-			return err
-		}
-	} else if t.escapeErr != escapeOK {
-		return t.escapeErr
-	}
-	return nil
-}
-
-// Execute applies a parsed template to the specified data object,
-// writing the output to wr.
-// If an error occurs executing the template or writing its output,
-// execution stops, but partial results may already have been written to
-// the output writer.
-// A template may be executed safely in parallel.
-func (t *Template) Execute(wr io.Writer, data interface{}) error {
-	if err := t.escape(); err != nil {
-		return err
-	}
-	return t.text.Execute(wr, data)
-}
-
-// ExecuteTemplate applies the template associated with t that has the given
-// name to the specified data object and writes the output to wr.
-// If an error occurs executing the template or writing its output,
-// execution stops, but partial results may already have been written to
-// the output writer.
-// A template may be executed safely in parallel.
-func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error {
-	tmpl, err := t.lookupAndEscapeTemplate(name)
-	if err != nil {
-		return err
-	}
-	return tmpl.text.Execute(wr, data)
-}
-
-// lookupAndEscapeTemplate guarantees that the template with the given name
-// is escaped, or returns an error if it cannot be. It returns the named
-// template.
-func (t *Template) lookupAndEscapeTemplate(name string) (tmpl *Template, err error) {
-	t.nameSpace.mu.Lock()
-	defer t.nameSpace.mu.Unlock()
-	tmpl = t.set[name]
-	if tmpl == nil {
-		return nil, fmt.Errorf("html/template: %q is undefined", name)
-	}
-	if tmpl.escapeErr != nil && tmpl.escapeErr != escapeOK {
-		return nil, tmpl.escapeErr
-	}
-	if tmpl.text.Tree == nil || tmpl.text.Root == nil {
-		return nil, fmt.Errorf("html/template: %q is an incomplete template", name)
-	}
-	if t.text.Lookup(name) == nil {
-		panic("html/template internal error: template escaping out of sync")
-	}
-	if tmpl.escapeErr == nil {
-		err = escapeTemplate(tmpl, tmpl.text.Root, name)
-	}
-	return tmpl, err
-}
-
-// Parse parses a string into a template. Nested template definitions
-// will be associated with the top-level template t. Parse may be
-// called multiple times to parse definitions of templates to associate
-// with t. It is an error if a resulting template is non-empty (contains
-// content other than template definitions) and would replace a
-// non-empty template with the same name.  (In multiple calls to Parse
-// with the same receiver template, only one call can contain text
-// other than space, comments, and template definitions.)
-func (t *Template) Parse(src string) (*Template, error) {
-	t.nameSpace.mu.Lock()
-	t.escapeErr = nil
-	t.nameSpace.mu.Unlock()
-	ret, err := t.text.Parse(src)
-	if err != nil {
-		return nil, err
-	}
-	// In general, all the named templates might have changed underfoot.
-	// Regardless, some new ones may have been defined.
-	// The template.Template set has been updated; update ours.
-	t.nameSpace.mu.Lock()
-	defer t.nameSpace.mu.Unlock()
-	for _, v := range ret.Templates() {
-		name := v.Name()
-		tmpl := t.set[name]
-		if tmpl == nil {
-			tmpl = t.new(name)
-		}
-		// Restore our record of this text/template to its unescaped original state.
-		tmpl.escapeErr = nil
-		tmpl.text = v
-		tmpl.Tree = v.Tree
-	}
-	return t, nil
-}
-
-// AddParseTree creates a new template with the name and parse tree
-// and associates it with t.
-//
-// It returns an error if t has already been executed.
-func (t *Template) AddParseTree(name string, tree *parse.Tree) (*Template, error) {
-	t.nameSpace.mu.Lock()
-	defer t.nameSpace.mu.Unlock()
-	if t.escapeErr != nil {
-		return nil, fmt.Errorf("html/template: cannot AddParseTree to %q after it has executed", t.Name())
-	}
-	text, err := t.text.AddParseTree(name, tree)
-	if err != nil {
-		return nil, err
-	}
-	ret := &Template{
-		nil,
-		text,
-		text.Tree,
-		t.nameSpace,
-	}
-	t.set[name] = ret
-	return ret, nil
-}
-
-// Clone returns a duplicate of the template, including all associated
-// templates. The actual representation is not copied, but the name space of
-// associated templates is, so further calls to Parse in the copy will add
-// templates to the copy but not to the original. Clone can be used to prepare
-// common templates and use them with variant definitions for other templates
-// by adding the variants after the clone is made.
-//
-// It returns an error if t has already been executed.
-func (t *Template) Clone() (*Template, error) {
-	t.nameSpace.mu.Lock()
-	defer t.nameSpace.mu.Unlock()
-	if t.escapeErr != nil {
-		return nil, fmt.Errorf("html/template: cannot Clone %q after it has executed", t.Name())
-	}
-	textClone, err := t.text.Clone()
-	if err != nil {
-		return nil, err
-	}
-	ret := &Template{
-		nil,
-		textClone,
-		textClone.Tree,
-		&nameSpace{
-			set: make(map[string]*Template),
-		},
-	}
-	for _, x := range textClone.Templates() {
-		name := x.Name()
-		src := t.set[name]
-		if src == nil || src.escapeErr != nil {
-			return nil, fmt.Errorf("html/template: cannot Clone %q after it has executed", t.Name())
-		}
-		x.Tree = x.Tree.Copy()
-		ret.set[name] = &Template{
-			nil,
-			x,
-			x.Tree,
-			ret.nameSpace,
-		}
-	}
-	return ret, nil
-}
-
-// New allocates a new HTML template with the given name.
-func New(name string) *Template {
-	tmpl := &Template{
-		nil,
-		template.New(name),
-		nil,
-		&nameSpace{
-			set: make(map[string]*Template),
-		},
-	}
-	tmpl.set[name] = tmpl
-	return tmpl
-}
-
-// New allocates a new HTML template associated with the given one
-// and with the same delimiters. The association, which is transitive,
-// allows one template to invoke another with a {{template}} action.
-func (t *Template) New(name string) *Template {
-	t.nameSpace.mu.Lock()
-	defer t.nameSpace.mu.Unlock()
-	return t.new(name)
-}
-
-// new is the implementation of New, without the lock.
-func (t *Template) new(name string) *Template {
-	tmpl := &Template{
-		nil,
-		t.text.New(name),
-		nil,
-		t.nameSpace,
-	}
-	tmpl.set[name] = tmpl
-	return tmpl
-}
-
-// Name returns the name of the template.
-func (t *Template) Name() string {
-	return t.text.Name()
-}
-
-// FuncMap is the type of the map defining the mapping from names to
-// functions. Each function must have either a single return value, or two
-// return values of which the second has type error. In that case, if the
-// second (error) argument evaluates to non-nil during execution, execution
-// terminates and Execute returns that error. FuncMap has the same base type
-// as FuncMap in "text/template", copied here so clients need not import
-// "text/template".
-type FuncMap map[string]interface{}
-
-// Funcs adds the elements of the argument map to the template's function map.
-// It panics if a value in the map is not a function with appropriate return
-// type. However, it is legal to overwrite elements of the map. The return
-// value is the template, so calls can be chained.
-func (t *Template) Funcs(funcMap FuncMap) *Template {
-	t.text.Funcs(template.FuncMap(funcMap))
-	return t
-}
-
-// Delims sets the action delimiters to the specified strings, to be used in
-// subsequent calls to Parse, ParseFiles, or ParseGlob. Nested template
-// definitions will inherit the settings. An empty delimiter stands for the
-// corresponding default: {{ or }}.
-// The return value is the template, so calls can be chained.
-func (t *Template) Delims(left, right string) *Template {
-	t.text.Delims(left, right)
-	return t
-}
-
-// Lookup returns the template with the given name that is associated with t,
-// or nil if there is no such template.
-func (t *Template) Lookup(name string) *Template {
-	t.nameSpace.mu.Lock()
-	defer t.nameSpace.mu.Unlock()
-	return t.set[name]
-}
-
-// Must is a helper that wraps a call to a function returning (*Template, error)
-// and panics if the error is non-nil. It is intended for use in variable initializations
-// such as
-//	var t = template.Must(template.New("name").Parse("html"))
-func Must(t *Template, err error) *Template {
-	if err != nil {
-		panic(err)
-	}
-	return t
-}
-
-// ParseFiles creates a new Template and parses the template definitions from
-// the named files. The returned template's name will have the (base) name and
-// (parsed) contents of the first file. There must be at least one file.
-// If an error occurs, parsing stops and the returned *Template is nil.
-func ParseFiles(filenames ...string) (*Template, error) {
-	return parseFiles(nil, filenames...)
-}
-
-// ParseFiles parses the named files and associates the resulting templates with
-// t. If an error occurs, parsing stops and the returned template is nil;
-// otherwise it is t. There must be at least one file.
-func (t *Template) ParseFiles(filenames ...string) (*Template, error) {
-	return parseFiles(t, filenames...)
-}
-
-// parseFiles is the helper for the method and function. If the argument
-// template is nil, it is created from the first file.
-func parseFiles(t *Template, filenames ...string) (*Template, error) {
-	if len(filenames) == 0 {
-		// Not really a problem, but be consistent.
-		return nil, fmt.Errorf("html/template: no files named in call to ParseFiles")
-	}
-	for _, filename := range filenames {
-		b, err := ioutil.ReadFile(filename)
-		if err != nil {
-			return nil, err
-		}
-		s := string(b)
-		name := filepath.Base(filename)
-		// First template becomes return value if not already defined,
-		// and we use that one for subsequent New calls to associate
-		// all the templates together. Also, if this file has the same name
-		// as t, this file becomes the contents of t, so
-		//  t, err := New(name).Funcs(xxx).ParseFiles(name)
-		// works. Otherwise we create a new template associated with t.
-		var tmpl *Template
-		if t == nil {
-			t = New(name)
-		}
-		if name == t.Name() {
-			tmpl = t
-		} else {
-			tmpl = t.New(name)
-		}
-		_, err = tmpl.Parse(s)
-		if err != nil {
-			return nil, err
-		}
-	}
-	return t, nil
-}
-
-// ParseGlob creates a new Template and parses the template definitions from the
-// files identified by the pattern, which must match at least one file. The
-// returned template will have the (base) name and (parsed) contents of the
-// first file matched by the pattern. ParseGlob is equivalent to calling
-// ParseFiles with the list of files matched by the pattern.
-func ParseGlob(pattern string) (*Template, error) {
-	return parseGlob(nil, pattern)
-}
-
-// ParseGlob parses the template definitions in the files identified by the
-// pattern and associates the resulting templates with t. The pattern is
-// processed by filepath.Glob and must match at least one file. ParseGlob is
-// equivalent to calling t.ParseFiles with the list of files matched by the
-// pattern.
-func (t *Template) ParseGlob(pattern string) (*Template, error) {
-	return parseGlob(t, pattern)
-}
-
-// parseGlob is the implementation of the function and method ParseGlob.
-func parseGlob(t *Template, pattern string) (*Template, error) {
-	filenames, err := filepath.Glob(pattern)
-	if err != nil {
-		return nil, err
-	}
-	if len(filenames) == 0 {
-		return nil, fmt.Errorf("html/template: pattern matches no files: %#q", pattern)
-	}
-	return parseFiles(t, filenames...)
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/transition.go b/third_party/gofrontend/libgo/go/html/template/transition.go
deleted file mode 100644
index d2e0287..0000000
--- a/third_party/gofrontend/libgo/go/html/template/transition.go
+++ /dev/null
@@ -1,580 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"strings"
-)
-
-// transitionFunc is the array of context transition functions for text nodes.
-// A transition function takes a context and template text input, and returns
-// the updated context and the number of bytes consumed from the front of the
-// input.
-var transitionFunc = [...]func(context, []byte) (context, int){
-	stateText:        tText,
-	stateTag:         tTag,
-	stateAttrName:    tAttrName,
-	stateAfterName:   tAfterName,
-	stateBeforeValue: tBeforeValue,
-	stateHTMLCmt:     tHTMLCmt,
-	stateRCDATA:      tSpecialTagEnd,
-	stateAttr:        tAttr,
-	stateURL:         tURL,
-	stateJS:          tJS,
-	stateJSDqStr:     tJSDelimited,
-	stateJSSqStr:     tJSDelimited,
-	stateJSRegexp:    tJSDelimited,
-	stateJSBlockCmt:  tBlockCmt,
-	stateJSLineCmt:   tLineCmt,
-	stateCSS:         tCSS,
-	stateCSSDqStr:    tCSSStr,
-	stateCSSSqStr:    tCSSStr,
-	stateCSSDqURL:    tCSSStr,
-	stateCSSSqURL:    tCSSStr,
-	stateCSSURL:      tCSSStr,
-	stateCSSBlockCmt: tBlockCmt,
-	stateCSSLineCmt:  tLineCmt,
-	stateError:       tError,
-}
-
-var commentStart = []byte("<!--")
-var commentEnd = []byte("-->")
-
-// tText is the context transition function for the text state.
-func tText(c context, s []byte) (context, int) {
-	k := 0
-	for {
-		i := k + bytes.IndexByte(s[k:], '<')
-		if i < k || i+1 == len(s) {
-			return c, len(s)
-		} else if i+4 <= len(s) && bytes.Equal(commentStart, s[i:i+4]) {
-			return context{state: stateHTMLCmt}, i + 4
-		}
-		i++
-		end := false
-		if s[i] == '/' {
-			if i+1 == len(s) {
-				return c, len(s)
-			}
-			end, i = true, i+1
-		}
-		j, e := eatTagName(s, i)
-		if j != i {
-			if end {
-				e = elementNone
-			}
-			// We've found an HTML tag.
-			return context{state: stateTag, element: e}, j
-		}
-		k = j
-	}
-}
-
-var elementContentType = [...]state{
-	elementNone:     stateText,
-	elementScript:   stateJS,
-	elementStyle:    stateCSS,
-	elementTextarea: stateRCDATA,
-	elementTitle:    stateRCDATA,
-}
-
-// tTag is the context transition function for the tag state.
-func tTag(c context, s []byte) (context, int) {
-	// Find the attribute name.
-	i := eatWhiteSpace(s, 0)
-	if i == len(s) {
-		return c, len(s)
-	}
-	if s[i] == '>' {
-		return context{
-			state:   elementContentType[c.element],
-			element: c.element,
-		}, i + 1
-	}
-	j, err := eatAttrName(s, i)
-	if err != nil {
-		return context{state: stateError, err: err}, len(s)
-	}
-	state, attr := stateTag, attrNone
-	if i == j {
-		return context{
-			state: stateError,
-			err:   errorf(ErrBadHTML, nil, 0, "expected space, attr name, or end of tag, but got %q", s[i:]),
-		}, len(s)
-	}
-	switch attrType(string(s[i:j])) {
-	case contentTypeURL:
-		attr = attrURL
-	case contentTypeCSS:
-		attr = attrStyle
-	case contentTypeJS:
-		attr = attrScript
-	}
-	if j == len(s) {
-		state = stateAttrName
-	} else {
-		state = stateAfterName
-	}
-	return context{state: state, element: c.element, attr: attr}, j
-}
-
-// tAttrName is the context transition function for stateAttrName.
-func tAttrName(c context, s []byte) (context, int) {
-	i, err := eatAttrName(s, 0)
-	if err != nil {
-		return context{state: stateError, err: err}, len(s)
-	} else if i != len(s) {
-		c.state = stateAfterName
-	}
-	return c, i
-}
-
-// tAfterName is the context transition function for stateAfterName.
-func tAfterName(c context, s []byte) (context, int) {
-	// Look for the start of the value.
-	i := eatWhiteSpace(s, 0)
-	if i == len(s) {
-		return c, len(s)
-	} else if s[i] != '=' {
-		// Occurs due to tag ending '>', and valueless attribute.
-		c.state = stateTag
-		return c, i
-	}
-	c.state = stateBeforeValue
-	// Consume the "=".
-	return c, i + 1
-}
-
-var attrStartStates = [...]state{
-	attrNone:   stateAttr,
-	attrScript: stateJS,
-	attrStyle:  stateCSS,
-	attrURL:    stateURL,
-}
-
-// tBeforeValue is the context transition function for stateBeforeValue.
-func tBeforeValue(c context, s []byte) (context, int) {
-	i := eatWhiteSpace(s, 0)
-	if i == len(s) {
-		return c, len(s)
-	}
-	// Find the attribute delimiter.
-	delim := delimSpaceOrTagEnd
-	switch s[i] {
-	case '\'':
-		delim, i = delimSingleQuote, i+1
-	case '"':
-		delim, i = delimDoubleQuote, i+1
-	}
-	c.state, c.delim, c.attr = attrStartStates[c.attr], delim, attrNone
-	return c, i
-}
-
-// tHTMLCmt is the context transition function for stateHTMLCmt.
-func tHTMLCmt(c context, s []byte) (context, int) {
-	if i := bytes.Index(s, commentEnd); i != -1 {
-		return context{}, i + 3
-	}
-	return c, len(s)
-}
-
-// specialTagEndMarkers maps element types to the character sequence that
-// case-insensitively signals the end of the special tag body.
-var specialTagEndMarkers = [...][]byte{
-	elementScript:   []byte("script"),
-	elementStyle:    []byte("style"),
-	elementTextarea: []byte("textarea"),
-	elementTitle:    []byte("title"),
-}
-
-var (
-	specialTagEndPrefix = []byte("</")
-	tagEndSeparators    = []byte("> \t\n\f/")
-)
-
-// tSpecialTagEnd is the context transition function for raw text and RCDATA
-// element states.
-func tSpecialTagEnd(c context, s []byte) (context, int) {
-	if c.element != elementNone {
-		if i := indexTagEnd(s, specialTagEndMarkers[c.element]); i != -1 {
-			return context{}, i
-		}
-	}
-	return c, len(s)
-}
-
-// indexTagEnd finds the index of a special tag end in a case insensitive way, or returns -1
-func indexTagEnd(s []byte, tag []byte) int {
-	res := 0
-	plen := len(specialTagEndPrefix)
-	for len(s) > 0 {
-		// Try to find the tag end prefix first
-		i := bytes.Index(s, specialTagEndPrefix)
-		if i == -1 {
-			return i
-		}
-		s = s[i+plen:]
-		// Try to match the actual tag if there is still space for it
-		if len(tag) <= len(s) && bytes.EqualFold(tag, s[:len(tag)]) {
-			s = s[len(tag):]
-			// Check the tag is followed by a proper separator
-			if len(s) > 0 && bytes.IndexByte(tagEndSeparators, s[0]) != -1 {
-				return res + i
-			}
-			res += len(tag)
-		}
-		res += i + plen
-	}
-	return -1
-}
-
-// tAttr is the context transition function for the attribute state.
-func tAttr(c context, s []byte) (context, int) {
-	return c, len(s)
-}
-
-// tURL is the context transition function for the URL state.
-func tURL(c context, s []byte) (context, int) {
-	if bytes.IndexAny(s, "#?") >= 0 {
-		c.urlPart = urlPartQueryOrFrag
-	} else if len(s) != eatWhiteSpace(s, 0) && c.urlPart == urlPartNone {
-		// HTML5 uses "Valid URL potentially surrounded by spaces" for
-		// attrs: http://www.w3.org/TR/html5/index.html#attributes-1
-		c.urlPart = urlPartPreQuery
-	}
-	return c, len(s)
-}
-
-// tJS is the context transition function for the JS state.
-func tJS(c context, s []byte) (context, int) {
-	i := bytes.IndexAny(s, `"'/`)
-	if i == -1 {
-		// Entire input is non string, comment, regexp tokens.
-		c.jsCtx = nextJSCtx(s, c.jsCtx)
-		return c, len(s)
-	}
-	c.jsCtx = nextJSCtx(s[:i], c.jsCtx)
-	switch s[i] {
-	case '"':
-		c.state, c.jsCtx = stateJSDqStr, jsCtxRegexp
-	case '\'':
-		c.state, c.jsCtx = stateJSSqStr, jsCtxRegexp
-	case '/':
-		switch {
-		case i+1 < len(s) && s[i+1] == '/':
-			c.state, i = stateJSLineCmt, i+1
-		case i+1 < len(s) && s[i+1] == '*':
-			c.state, i = stateJSBlockCmt, i+1
-		case c.jsCtx == jsCtxRegexp:
-			c.state = stateJSRegexp
-		case c.jsCtx == jsCtxDivOp:
-			c.jsCtx = jsCtxRegexp
-		default:
-			return context{
-				state: stateError,
-				err:   errorf(ErrSlashAmbig, nil, 0, "'/' could start a division or regexp: %.32q", s[i:]),
-			}, len(s)
-		}
-	default:
-		panic("unreachable")
-	}
-	return c, i + 1
-}
-
-// tJSDelimited is the context transition function for the JS string and regexp
-// states.
-func tJSDelimited(c context, s []byte) (context, int) {
-	specials := `\"`
-	switch c.state {
-	case stateJSSqStr:
-		specials = `\'`
-	case stateJSRegexp:
-		specials = `\/[]`
-	}
-
-	k, inCharset := 0, false
-	for {
-		i := k + bytes.IndexAny(s[k:], specials)
-		if i < k {
-			break
-		}
-		switch s[i] {
-		case '\\':
-			i++
-			if i == len(s) {
-				return context{
-					state: stateError,
-					err:   errorf(ErrPartialEscape, nil, 0, "unfinished escape sequence in JS string: %q", s),
-				}, len(s)
-			}
-		case '[':
-			inCharset = true
-		case ']':
-			inCharset = false
-		default:
-			// end delimiter
-			if !inCharset {
-				c.state, c.jsCtx = stateJS, jsCtxDivOp
-				return c, i + 1
-			}
-		}
-		k = i + 1
-	}
-
-	if inCharset {
-		// This can be fixed by making context richer if interpolation
-		// into charsets is desired.
-		return context{
-			state: stateError,
-			err:   errorf(ErrPartialCharset, nil, 0, "unfinished JS regexp charset: %q", s),
-		}, len(s)
-	}
-
-	return c, len(s)
-}
-
-var blockCommentEnd = []byte("*/")
-
-// tBlockCmt is the context transition function for /*comment*/ states.
-func tBlockCmt(c context, s []byte) (context, int) {
-	i := bytes.Index(s, blockCommentEnd)
-	if i == -1 {
-		return c, len(s)
-	}
-	switch c.state {
-	case stateJSBlockCmt:
-		c.state = stateJS
-	case stateCSSBlockCmt:
-		c.state = stateCSS
-	default:
-		panic(c.state.String())
-	}
-	return c, i + 2
-}
-
-// tLineCmt is the context transition function for //comment states.
-func tLineCmt(c context, s []byte) (context, int) {
-	var lineTerminators string
-	var endState state
-	switch c.state {
-	case stateJSLineCmt:
-		lineTerminators, endState = "\n\r\u2028\u2029", stateJS
-	case stateCSSLineCmt:
-		lineTerminators, endState = "\n\f\r", stateCSS
-		// Line comments are not part of any published CSS standard but
-		// are supported by the 4 major browsers.
-		// This defines line comments as
-		//     LINECOMMENT ::= "//" [^\n\f\d]*
-		// since http://www.w3.org/TR/css3-syntax/#SUBTOK-nl defines
-		// newlines:
-		//     nl ::= #xA | #xD #xA | #xD | #xC
-	default:
-		panic(c.state.String())
-	}
-
-	i := bytes.IndexAny(s, lineTerminators)
-	if i == -1 {
-		return c, len(s)
-	}
-	c.state = endState
-	// Per section 7.4 of EcmaScript 5 : http://es5.github.com/#x7.4
-	// "However, the LineTerminator at the end of the line is not
-	// considered to be part of the single-line comment; it is
-	// recognized separately by the lexical grammar and becomes part
-	// of the stream of input elements for the syntactic grammar."
-	return c, i
-}
-
-// tCSS is the context transition function for the CSS state.
-func tCSS(c context, s []byte) (context, int) {
-	// CSS quoted strings are almost never used except for:
-	// (1) URLs as in background: "/foo.png"
-	// (2) Multiword font-names as in font-family: "Times New Roman"
-	// (3) List separators in content values as in inline-lists:
-	//    <style>
-	//    ul.inlineList { list-style: none; padding:0 }
-	//    ul.inlineList > li { display: inline }
-	//    ul.inlineList > li:before { content: ", " }
-	//    ul.inlineList > li:first-child:before { content: "" }
-	//    </style>
-	//    <ul class=inlineList><li>One<li>Two<li>Three</ul>
-	// (4) Attribute value selectors as in a[href="http://example.com/"]
-	//
-	// We conservatively treat all strings as URLs, but make some
-	// allowances to avoid confusion.
-	//
-	// In (1), our conservative assumption is justified.
-	// In (2), valid font names do not contain ':', '?', or '#', so our
-	// conservative assumption is fine since we will never transition past
-	// urlPartPreQuery.
-	// In (3), our protocol heuristic should not be tripped, and there
-	// should not be non-space content after a '?' or '#', so as long as
-	// we only %-encode RFC 3986 reserved characters we are ok.
-	// In (4), we should URL escape for URL attributes, and for others we
-	// have the attribute name available if our conservative assumption
-	// proves problematic for real code.
-
-	k := 0
-	for {
-		i := k + bytes.IndexAny(s[k:], `("'/`)
-		if i < k {
-			return c, len(s)
-		}
-		switch s[i] {
-		case '(':
-			// Look for url to the left.
-			p := bytes.TrimRight(s[:i], "\t\n\f\r ")
-			if endsWithCSSKeyword(p, "url") {
-				j := len(s) - len(bytes.TrimLeft(s[i+1:], "\t\n\f\r "))
-				switch {
-				case j != len(s) && s[j] == '"':
-					c.state, j = stateCSSDqURL, j+1
-				case j != len(s) && s[j] == '\'':
-					c.state, j = stateCSSSqURL, j+1
-				default:
-					c.state = stateCSSURL
-				}
-				return c, j
-			}
-		case '/':
-			if i+1 < len(s) {
-				switch s[i+1] {
-				case '/':
-					c.state = stateCSSLineCmt
-					return c, i + 2
-				case '*':
-					c.state = stateCSSBlockCmt
-					return c, i + 2
-				}
-			}
-		case '"':
-			c.state = stateCSSDqStr
-			return c, i + 1
-		case '\'':
-			c.state = stateCSSSqStr
-			return c, i + 1
-		}
-		k = i + 1
-	}
-}
-
-// tCSSStr is the context transition function for the CSS string and URL states.
-func tCSSStr(c context, s []byte) (context, int) {
-	var endAndEsc string
-	switch c.state {
-	case stateCSSDqStr, stateCSSDqURL:
-		endAndEsc = `\"`
-	case stateCSSSqStr, stateCSSSqURL:
-		endAndEsc = `\'`
-	case stateCSSURL:
-		// Unquoted URLs end with a newline or close parenthesis.
-		// The below includes the wc (whitespace character) and nl.
-		endAndEsc = "\\\t\n\f\r )"
-	default:
-		panic(c.state.String())
-	}
-
-	k := 0
-	for {
-		i := k + bytes.IndexAny(s[k:], endAndEsc)
-		if i < k {
-			c, nread := tURL(c, decodeCSS(s[k:]))
-			return c, k + nread
-		}
-		if s[i] == '\\' {
-			i++
-			if i == len(s) {
-				return context{
-					state: stateError,
-					err:   errorf(ErrPartialEscape, nil, 0, "unfinished escape sequence in CSS string: %q", s),
-				}, len(s)
-			}
-		} else {
-			c.state = stateCSS
-			return c, i + 1
-		}
-		c, _ = tURL(c, decodeCSS(s[:i+1]))
-		k = i + 1
-	}
-}
-
-// tError is the context transition function for the error state.
-func tError(c context, s []byte) (context, int) {
-	return c, len(s)
-}
-
-// eatAttrName returns the largest j such that s[i:j] is an attribute name.
-// It returns an error if s[i:] does not look like it begins with an
-// attribute name, such as encountering a quote mark without a preceding
-// equals sign.
-func eatAttrName(s []byte, i int) (int, *Error) {
-	for j := i; j < len(s); j++ {
-		switch s[j] {
-		case ' ', '\t', '\n', '\f', '\r', '=', '>':
-			return j, nil
-		case '\'', '"', '<':
-			// These result in a parse warning in HTML5 and are
-			// indicative of serious problems if seen in an attr
-			// name in a template.
-			return -1, errorf(ErrBadHTML, nil, 0, "%q in attribute name: %.32q", s[j:j+1], s)
-		default:
-			// No-op.
-		}
-	}
-	return len(s), nil
-}
-
-var elementNameMap = map[string]element{
-	"script":   elementScript,
-	"style":    elementStyle,
-	"textarea": elementTextarea,
-	"title":    elementTitle,
-}
-
-// asciiAlpha reports whether c is an ASCII letter.
-func asciiAlpha(c byte) bool {
-	return 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z'
-}
-
-// asciiAlphaNum reports whether c is an ASCII letter or digit.
-func asciiAlphaNum(c byte) bool {
-	return asciiAlpha(c) || '0' <= c && c <= '9'
-}
-
-// eatTagName returns the largest j such that s[i:j] is a tag name and the tag type.
-func eatTagName(s []byte, i int) (int, element) {
-	if i == len(s) || !asciiAlpha(s[i]) {
-		return i, elementNone
-	}
-	j := i + 1
-	for j < len(s) {
-		x := s[j]
-		if asciiAlphaNum(x) {
-			j++
-			continue
-		}
-		// Allow "x-y" or "x:y" but not "x-", "-y", or "x--y".
-		if (x == ':' || x == '-') && j+1 < len(s) && asciiAlphaNum(s[j+1]) {
-			j += 2
-			continue
-		}
-		break
-	}
-	return j, elementNameMap[strings.ToLower(string(s[i:j]))]
-}
-
-// eatWhiteSpace returns the largest j such that s[i:j] is white space.
-func eatWhiteSpace(s []byte, i int) int {
-	for j := i; j < len(s); j++ {
-		switch s[j] {
-		case ' ', '\t', '\n', '\f', '\r':
-			// No-op.
-		default:
-			return j
-		}
-	}
-	return len(s)
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/transition_test.go b/third_party/gofrontend/libgo/go/html/template/transition_test.go
deleted file mode 100644
index 412a4c7..0000000
--- a/third_party/gofrontend/libgo/go/html/template/transition_test.go
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"strings"
-	"testing"
-)
-
-func TestFindEndTag(t *testing.T) {
-	tests := []struct {
-		s, tag string
-		want   int
-	}{
-		{"", "tag", -1},
-		{"hello </textarea> hello", "textarea", 6},
-		{"hello </TEXTarea> hello", "textarea", 6},
-		{"hello </textAREA>", "textarea", 6},
-		{"hello </textarea", "textareax", -1},
-		{"hello </textarea>", "tag", -1},
-		{"hello tag </textarea", "tag", -1},
-		{"hello </tag> </other> </textarea> <other>", "textarea", 22},
-		{"</textarea> <other>", "textarea", 0},
-		{"<div> </div> </TEXTAREA>", "textarea", 13},
-		{"<div> </div> </TEXTAREA\t>", "textarea", 13},
-		{"<div> </div> </TEXTAREA >", "textarea", 13},
-		{"<div> </div> </TEXTAREAfoo", "textarea", -1},
-		{"</TEXTAREAfoo </textarea>", "textarea", 14},
-		{"<</script >", "script", 1},
-		{"</script>", "textarea", -1},
-	}
-	for _, test := range tests {
-		if got := indexTagEnd([]byte(test.s), []byte(test.tag)); test.want != got {
-			t.Errorf("%q/%q: want\n\t%d\nbut got\n\t%d", test.s, test.tag, test.want, got)
-		}
-	}
-}
-
-func BenchmarkTemplateSpecialTags(b *testing.B) {
-
-	r := struct {
-		Name, Gift string
-	}{"Aunt Mildred", "bone china tea set"}
-
-	h1 := "<textarea> Hello Hello Hello </textarea> "
-	h2 := "<textarea> <p> Dear {{.Name}},\n{{with .Gift}}Thank you for the lovely {{.}}. {{end}}\nBest wishes. </p>\n</textarea>"
-	html := strings.Repeat(h1, 100) + h2 + strings.Repeat(h1, 100) + h2
-
-	var buf bytes.Buffer
-	for i := 0; i < b.N; i++ {
-		tmpl := Must(New("foo").Parse(html))
-		if err := tmpl.Execute(&buf, r); err != nil {
-			b.Fatal(err)
-		}
-		buf.Reset()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/url.go b/third_party/gofrontend/libgo/go/html/template/url.go
deleted file mode 100644
index 2ca76bf..0000000
--- a/third_party/gofrontend/libgo/go/html/template/url.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"fmt"
-	"strings"
-)
-
-// urlFilter returns its input unless it contains an unsafe protocol in which
-// case it defangs the entire URL.
-func urlFilter(args ...interface{}) string {
-	s, t := stringify(args...)
-	if t == contentTypeURL {
-		return s
-	}
-	if i := strings.IndexRune(s, ':'); i >= 0 && strings.IndexRune(s[:i], '/') < 0 {
-		protocol := strings.ToLower(s[:i])
-		if protocol != "http" && protocol != "https" && protocol != "mailto" {
-			return "#" + filterFailsafe
-		}
-	}
-	return s
-}
-
-// urlEscaper produces an output that can be embedded in a URL query.
-// The output can be embedded in an HTML attribute without further escaping.
-func urlEscaper(args ...interface{}) string {
-	return urlProcessor(false, args...)
-}
-
-// urlEscaper normalizes URL content so it can be embedded in a quote-delimited
-// string or parenthesis delimited url(...).
-// The normalizer does not encode all HTML specials. Specifically, it does not
-// encode '&' so correct embedding in an HTML attribute requires escaping of
-// '&' to '&amp;'.
-func urlNormalizer(args ...interface{}) string {
-	return urlProcessor(true, args...)
-}
-
-// urlProcessor normalizes (when norm is true) or escapes its input to produce
-// a valid hierarchical or opaque URL part.
-func urlProcessor(norm bool, args ...interface{}) string {
-	s, t := stringify(args...)
-	if t == contentTypeURL {
-		norm = true
-	}
-	var b bytes.Buffer
-	written := 0
-	// The byte loop below assumes that all URLs use UTF-8 as the
-	// content-encoding. This is similar to the URI to IRI encoding scheme
-	// defined in section 3.1 of  RFC 3987, and behaves the same as the
-	// EcmaScript builtin encodeURIComponent.
-	// It should not cause any misencoding of URLs in pages with
-	// Content-type: text/html;charset=UTF-8.
-	for i, n := 0, len(s); i < n; i++ {
-		c := s[i]
-		switch c {
-		// Single quote and parens are sub-delims in RFC 3986, but we
-		// escape them so the output can be embedded in single
-		// quoted attributes and unquoted CSS url(...) constructs.
-		// Single quotes are reserved in URLs, but are only used in
-		// the obsolete "mark" rule in an appendix in RFC 3986
-		// so can be safely encoded.
-		case '!', '#', '$', '&', '*', '+', ',', '/', ':', ';', '=', '?', '@', '[', ']':
-			if norm {
-				continue
-			}
-		// Unreserved according to RFC 3986 sec 2.3
-		// "For consistency, percent-encoded octets in the ranges of
-		// ALPHA (%41-%5A and %61-%7A), DIGIT (%30-%39), hyphen (%2D),
-		// period (%2E), underscore (%5F), or tilde (%7E) should not be
-		// created by URI producers
-		case '-', '.', '_', '~':
-			continue
-		case '%':
-			// When normalizing do not re-encode valid escapes.
-			if norm && i+2 < len(s) && isHex(s[i+1]) && isHex(s[i+2]) {
-				continue
-			}
-		default:
-			// Unreserved according to RFC 3986 sec 2.3
-			if 'a' <= c && c <= 'z' {
-				continue
-			}
-			if 'A' <= c && c <= 'Z' {
-				continue
-			}
-			if '0' <= c && c <= '9' {
-				continue
-			}
-		}
-		b.WriteString(s[written:i])
-		fmt.Fprintf(&b, "%%%02x", c)
-		written = i + 1
-	}
-	if written == 0 {
-		return s
-	}
-	b.WriteString(s[written:])
-	return b.String()
-}
diff --git a/third_party/gofrontend/libgo/go/html/template/url_test.go b/third_party/gofrontend/libgo/go/html/template/url_test.go
deleted file mode 100644
index 5182e9d..0000000
--- a/third_party/gofrontend/libgo/go/html/template/url_test.go
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"testing"
-)
-
-func TestURLNormalizer(t *testing.T) {
-	tests := []struct {
-		url, want string
-	}{
-		{"", ""},
-		{
-			"http://example.com:80/foo/bar?q=foo%20&bar=x+y#frag",
-			"http://example.com:80/foo/bar?q=foo%20&bar=x+y#frag",
-		},
-		{" ", "%20"},
-		{"%7c", "%7c"},
-		{"%7C", "%7C"},
-		{"%2", "%252"},
-		{"%", "%25"},
-		{"%z", "%25z"},
-		{"/foo|bar/%5c\u1234", "/foo%7cbar/%5c%e1%88%b4"},
-	}
-	for _, test := range tests {
-		if got := urlNormalizer(test.url); test.want != got {
-			t.Errorf("%q: want\n\t%q\nbut got\n\t%q", test.url, test.want, got)
-		}
-		if test.want != urlNormalizer(test.want) {
-			t.Errorf("not idempotent: %q", test.want)
-		}
-	}
-}
-
-func TestURLFilters(t *testing.T) {
-	input := ("\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f" +
-		"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
-		` !"#$%&'()*+,-./` +
-		`0123456789:;<=>?` +
-		`@ABCDEFGHIJKLMNO` +
-		`PQRSTUVWXYZ[\]^_` +
-		"`abcdefghijklmno" +
-		"pqrstuvwxyz{|}~\x7f" +
-		"\u00A0\u0100\u2028\u2029\ufeff\U0001D11E")
-
-	tests := []struct {
-		name    string
-		escaper func(...interface{}) string
-		escaped string
-	}{
-		{
-			"urlEscaper",
-			urlEscaper,
-			"%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f" +
-				"%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f" +
-				"%20%21%22%23%24%25%26%27%28%29%2a%2b%2c-.%2f" +
-				"0123456789%3a%3b%3c%3d%3e%3f" +
-				"%40ABCDEFGHIJKLMNO" +
-				"PQRSTUVWXYZ%5b%5c%5d%5e_" +
-				"%60abcdefghijklmno" +
-				"pqrstuvwxyz%7b%7c%7d~%7f" +
-				"%c2%a0%c4%80%e2%80%a8%e2%80%a9%ef%bb%bf%f0%9d%84%9e",
-		},
-		{
-			"urlNormalizer",
-			urlNormalizer,
-			"%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f" +
-				"%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f" +
-				"%20!%22#$%25&%27%28%29*+,-./" +
-				"0123456789:;%3c=%3e?" +
-				"@ABCDEFGHIJKLMNO" +
-				"PQRSTUVWXYZ[%5c]%5e_" +
-				"%60abcdefghijklmno" +
-				"pqrstuvwxyz%7b%7c%7d~%7f" +
-				"%c2%a0%c4%80%e2%80%a8%e2%80%a9%ef%bb%bf%f0%9d%84%9e",
-		},
-	}
-
-	for _, test := range tests {
-		if s := test.escaper(input); s != test.escaped {
-			t.Errorf("%s: want\n\t%q\ngot\n\t%q", test.name, test.escaped, s)
-			continue
-		}
-	}
-}
-
-func BenchmarkURLEscaper(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		urlEscaper("http://example.com:80/foo?q=bar%20&baz=x+y#frag")
-	}
-}
-
-func BenchmarkURLEscaperNoSpecials(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		urlEscaper("TheQuickBrownFoxJumpsOverTheLazyDog.")
-	}
-}
-
-func BenchmarkURLNormalizer(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		urlNormalizer("The quick brown fox jumps over the lazy dog.\n")
-	}
-}
-
-func BenchmarkURLNormalizerNoSpecials(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		urlNormalizer("http://example.com:80/foo?q=bar%20&baz=x+y#frag")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/color/color.go b/third_party/gofrontend/libgo/go/image/color/color.go
deleted file mode 100644
index cae059b..0000000
--- a/third_party/gofrontend/libgo/go/image/color/color.go
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package color implements a basic color library.
-package color
-
-// Color can convert itself to alpha-premultiplied 16-bits per channel RGBA.
-// The conversion may be lossy.
-type Color interface {
-	// RGBA returns the alpha-premultiplied red, green, blue and alpha values
-	// for the color. Each value ranges within [0, 0xffff], but is represented
-	// by a uint32 so that multiplying by a blend factor up to 0xffff will not
-	// overflow.
-	//
-	// An alpha-premultiplied color component c has been scaled by alpha (a),
-	// so has valid values 0 <= c <= a.
-	RGBA() (r, g, b, a uint32)
-}
-
-// RGBA represents a traditional 32-bit alpha-premultiplied color, having 8
-// bits for each of red, green, blue and alpha.
-//
-// An alpha-premultiplied color component C has been scaled by alpha (A), so
-// has valid values 0 <= C <= A.
-type RGBA struct {
-	R, G, B, A uint8
-}
-
-func (c RGBA) RGBA() (r, g, b, a uint32) {
-	r = uint32(c.R)
-	r |= r << 8
-	g = uint32(c.G)
-	g |= g << 8
-	b = uint32(c.B)
-	b |= b << 8
-	a = uint32(c.A)
-	a |= a << 8
-	return
-}
-
-// RGBA64 represents a 64-bit alpha-premultiplied color, having 16 bits for
-// each of red, green, blue and alpha.
-//
-// An alpha-premultiplied color component C has been scaled by alpha (A), so
-// has valid values 0 <= C <= A.
-type RGBA64 struct {
-	R, G, B, A uint16
-}
-
-func (c RGBA64) RGBA() (r, g, b, a uint32) {
-	return uint32(c.R), uint32(c.G), uint32(c.B), uint32(c.A)
-}
-
-// NRGBA represents a non-alpha-premultiplied 32-bit color.
-type NRGBA struct {
-	R, G, B, A uint8
-}
-
-func (c NRGBA) RGBA() (r, g, b, a uint32) {
-	r = uint32(c.R)
-	r |= r << 8
-	r *= uint32(c.A)
-	r /= 0xff
-	g = uint32(c.G)
-	g |= g << 8
-	g *= uint32(c.A)
-	g /= 0xff
-	b = uint32(c.B)
-	b |= b << 8
-	b *= uint32(c.A)
-	b /= 0xff
-	a = uint32(c.A)
-	a |= a << 8
-	return
-}
-
-// NRGBA64 represents a non-alpha-premultiplied 64-bit color,
-// having 16 bits for each of red, green, blue and alpha.
-type NRGBA64 struct {
-	R, G, B, A uint16
-}
-
-func (c NRGBA64) RGBA() (r, g, b, a uint32) {
-	r = uint32(c.R)
-	r *= uint32(c.A)
-	r /= 0xffff
-	g = uint32(c.G)
-	g *= uint32(c.A)
-	g /= 0xffff
-	b = uint32(c.B)
-	b *= uint32(c.A)
-	b /= 0xffff
-	a = uint32(c.A)
-	return
-}
-
-// Alpha represents an 8-bit alpha color.
-type Alpha struct {
-	A uint8
-}
-
-func (c Alpha) RGBA() (r, g, b, a uint32) {
-	a = uint32(c.A)
-	a |= a << 8
-	return a, a, a, a
-}
-
-// Alpha16 represents a 16-bit alpha color.
-type Alpha16 struct {
-	A uint16
-}
-
-func (c Alpha16) RGBA() (r, g, b, a uint32) {
-	a = uint32(c.A)
-	return a, a, a, a
-}
-
-// Gray represents an 8-bit grayscale color.
-type Gray struct {
-	Y uint8
-}
-
-func (c Gray) RGBA() (r, g, b, a uint32) {
-	y := uint32(c.Y)
-	y |= y << 8
-	return y, y, y, 0xffff
-}
-
-// Gray16 represents a 16-bit grayscale color.
-type Gray16 struct {
-	Y uint16
-}
-
-func (c Gray16) RGBA() (r, g, b, a uint32) {
-	y := uint32(c.Y)
-	return y, y, y, 0xffff
-}
-
-// Model can convert any Color to one from its own color model. The conversion
-// may be lossy.
-type Model interface {
-	Convert(c Color) Color
-}
-
-// ModelFunc returns a Model that invokes f to implement the conversion.
-func ModelFunc(f func(Color) Color) Model {
-	// Note: using *modelFunc as the implementation
-	// means that callers can still use comparisons
-	// like m == RGBAModel.  This is not possible if
-	// we use the func value directly, because funcs
-	// are no longer comparable.
-	return &modelFunc{f}
-}
-
-type modelFunc struct {
-	f func(Color) Color
-}
-
-func (m *modelFunc) Convert(c Color) Color {
-	return m.f(c)
-}
-
-// Models for the standard color types.
-var (
-	RGBAModel    Model = ModelFunc(rgbaModel)
-	RGBA64Model  Model = ModelFunc(rgba64Model)
-	NRGBAModel   Model = ModelFunc(nrgbaModel)
-	NRGBA64Model Model = ModelFunc(nrgba64Model)
-	AlphaModel   Model = ModelFunc(alphaModel)
-	Alpha16Model Model = ModelFunc(alpha16Model)
-	GrayModel    Model = ModelFunc(grayModel)
-	Gray16Model  Model = ModelFunc(gray16Model)
-)
-
-func rgbaModel(c Color) Color {
-	if _, ok := c.(RGBA); ok {
-		return c
-	}
-	r, g, b, a := c.RGBA()
-	return RGBA{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)}
-}
-
-func rgba64Model(c Color) Color {
-	if _, ok := c.(RGBA64); ok {
-		return c
-	}
-	r, g, b, a := c.RGBA()
-	return RGBA64{uint16(r), uint16(g), uint16(b), uint16(a)}
-}
-
-func nrgbaModel(c Color) Color {
-	if _, ok := c.(NRGBA); ok {
-		return c
-	}
-	r, g, b, a := c.RGBA()
-	if a == 0xffff {
-		return NRGBA{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), 0xff}
-	}
-	if a == 0 {
-		return NRGBA{0, 0, 0, 0}
-	}
-	// Since Color.RGBA returns a alpha-premultiplied color, we should have r <= a && g <= a && b <= a.
-	r = (r * 0xffff) / a
-	g = (g * 0xffff) / a
-	b = (b * 0xffff) / a
-	return NRGBA{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)}
-}
-
-func nrgba64Model(c Color) Color {
-	if _, ok := c.(NRGBA64); ok {
-		return c
-	}
-	r, g, b, a := c.RGBA()
-	if a == 0xffff {
-		return NRGBA64{uint16(r), uint16(g), uint16(b), 0xffff}
-	}
-	if a == 0 {
-		return NRGBA64{0, 0, 0, 0}
-	}
-	// Since Color.RGBA returns a alpha-premultiplied color, we should have r <= a && g <= a && b <= a.
-	r = (r * 0xffff) / a
-	g = (g * 0xffff) / a
-	b = (b * 0xffff) / a
-	return NRGBA64{uint16(r), uint16(g), uint16(b), uint16(a)}
-}
-
-func alphaModel(c Color) Color {
-	if _, ok := c.(Alpha); ok {
-		return c
-	}
-	_, _, _, a := c.RGBA()
-	return Alpha{uint8(a >> 8)}
-}
-
-func alpha16Model(c Color) Color {
-	if _, ok := c.(Alpha16); ok {
-		return c
-	}
-	_, _, _, a := c.RGBA()
-	return Alpha16{uint16(a)}
-}
-
-func grayModel(c Color) Color {
-	if _, ok := c.(Gray); ok {
-		return c
-	}
-	r, g, b, _ := c.RGBA()
-	y := (299*r + 587*g + 114*b + 500) / 1000
-	return Gray{uint8(y >> 8)}
-}
-
-func gray16Model(c Color) Color {
-	if _, ok := c.(Gray16); ok {
-		return c
-	}
-	r, g, b, _ := c.RGBA()
-	y := (299*r + 587*g + 114*b + 500) / 1000
-	return Gray16{uint16(y)}
-}
-
-// Palette is a palette of colors.
-type Palette []Color
-
-// Convert returns the palette color closest to c in Euclidean R,G,B space.
-func (p Palette) Convert(c Color) Color {
-	if len(p) == 0 {
-		return nil
-	}
-	return p[p.Index(c)]
-}
-
-// Index returns the index of the palette color closest to c in Euclidean
-// R,G,B,A space.
-func (p Palette) Index(c Color) int {
-	// A batch version of this computation is in image/draw/draw.go.
-
-	cr, cg, cb, ca := c.RGBA()
-	ret, bestSum := 0, uint32(1<<32-1)
-	for i, v := range p {
-		vr, vg, vb, va := v.RGBA()
-		sum := sqDiff(cr, vr) + sqDiff(cg, vg) + sqDiff(cb, vb) + sqDiff(ca, va)
-		if sum < bestSum {
-			if sum == 0 {
-				return i
-			}
-			ret, bestSum = i, sum
-		}
-	}
-	return ret
-}
-
-// sqDiff returns the squared-difference of x and y, shifted by 2 so that
-// adding four of those won't overflow a uint32.
-//
-// x and y are both assumed to be in the range [0, 0xffff].
-func sqDiff(x, y uint32) uint32 {
-	var d uint32
-	if x > y {
-		d = x - y
-	} else {
-		d = y - x
-	}
-	return (d * d) >> 2
-}
-
-// Standard colors.
-var (
-	Black       = Gray16{0}
-	White       = Gray16{0xffff}
-	Transparent = Alpha16{0}
-	Opaque      = Alpha16{0xffff}
-)
diff --git a/third_party/gofrontend/libgo/go/image/color/palette/gen.go b/third_party/gofrontend/libgo/go/image/color/palette/gen.go
deleted file mode 100644
index 2b5fdaa..0000000
--- a/third_party/gofrontend/libgo/go/image/color/palette/gen.go
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package main
-
-// This program generates palette.go. Invoke it as
-//	go run gen.go -output palette.go
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"go/format"
-	"io"
-	"io/ioutil"
-	"log"
-)
-
-var filename = flag.String("output", "palette.go", "output file name")
-
-func main() {
-	flag.Parse()
-
-	var buf bytes.Buffer
-
-	fmt.Fprintln(&buf, `// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.`)
-	fmt.Fprintln(&buf)
-	fmt.Fprintln(&buf, "// generated by go run gen.go -output palette.go; DO NOT EDIT")
-	fmt.Fprintln(&buf)
-	fmt.Fprintln(&buf, "package palette")
-	fmt.Fprintln(&buf)
-	fmt.Fprintln(&buf, `import "image/color"`)
-	fmt.Fprintln(&buf)
-	printPlan9(&buf)
-	printWebSafe(&buf)
-
-	data, err := format.Source(buf.Bytes())
-	if err != nil {
-		log.Fatal(err)
-	}
-	err = ioutil.WriteFile(*filename, data, 0644)
-	if err != nil {
-		log.Fatal(err)
-	}
-}
-
-func printPlan9(w io.Writer) {
-	c, lines := [3]int{}, [256]string{}
-	for r, i := 0, 0; r != 4; r++ {
-		for v := 0; v != 4; v, i = v+1, i+16 {
-			for g, j := 0, v-r; g != 4; g++ {
-				for b := 0; b != 4; b, j = b+1, j+1 {
-					den := r
-					if g > den {
-						den = g
-					}
-					if b > den {
-						den = b
-					}
-					if den == 0 {
-						c[0] = 0x11 * v
-						c[1] = 0x11 * v
-						c[2] = 0x11 * v
-					} else {
-						num := 17 * (4*den + v)
-						c[0] = r * num / den
-						c[1] = g * num / den
-						c[2] = b * num / den
-					}
-					lines[i+(j&0x0f)] =
-						fmt.Sprintf("\tcolor.RGBA{0x%02x, 0x%02x, 0x%02x, 0xff},", c[0], c[1], c[2])
-				}
-			}
-		}
-	}
-	fmt.Fprintln(w, "// Plan9 is a 256-color palette that partitions the 24-bit RGB space")
-	fmt.Fprintln(w, "// into 4×4×4 subdivision, with 4 shades in each subcube. Compared to the")
-	fmt.Fprintln(w, "// WebSafe, the idea is to reduce the color resolution by dicing the")
-	fmt.Fprintln(w, "// color cube into fewer cells, and to use the extra space to increase the")
-	fmt.Fprintln(w, "// intensity resolution. This results in 16 gray shades (4 gray subcubes with")
-	fmt.Fprintln(w, "// 4 samples in each), 13 shades of each primary and secondary color (3")
-	fmt.Fprintln(w, "// subcubes with 4 samples plus black) and a reasonable selection of colors")
-	fmt.Fprintln(w, "// covering the rest of the color cube. The advantage is better representation")
-	fmt.Fprintln(w, "// of continuous tones.")
-	fmt.Fprintln(w, "//")
-	fmt.Fprintln(w, "// This palette was used in the Plan 9 Operating System, described at")
-	fmt.Fprintln(w, "// http://plan9.bell-labs.com/magic/man2html/6/color")
-	fmt.Fprintln(w, "var Plan9 = []color.Color{")
-	for _, line := range lines {
-		fmt.Fprintln(w, line)
-	}
-	fmt.Fprintln(w, "}")
-	fmt.Fprintln(w)
-}
-
-func printWebSafe(w io.Writer) {
-	lines := [6 * 6 * 6]string{}
-	for r := 0; r < 6; r++ {
-		for g := 0; g < 6; g++ {
-			for b := 0; b < 6; b++ {
-				lines[36*r+6*g+b] =
-					fmt.Sprintf("\tcolor.RGBA{0x%02x, 0x%02x, 0x%02x, 0xff},", 0x33*r, 0x33*g, 0x33*b)
-			}
-		}
-	}
-	fmt.Fprintln(w, "// WebSafe is a 216-color palette that was popularized by early versions")
-	fmt.Fprintln(w, "// of Netscape Navigator. It is also known as the Netscape Color Cube.")
-	fmt.Fprintln(w, "//")
-	fmt.Fprintln(w, "// See http://en.wikipedia.org/wiki/Web_colors#Web-safe_colors for details.")
-	fmt.Fprintln(w, "var WebSafe = []color.Color{")
-	for _, line := range lines {
-		fmt.Fprintln(w, line)
-	}
-	fmt.Fprintln(w, "}")
-	fmt.Fprintln(w)
-}
diff --git a/third_party/gofrontend/libgo/go/image/color/palette/generate.go b/third_party/gofrontend/libgo/go/image/color/palette/generate.go
deleted file mode 100644
index 64c2ec0..0000000
--- a/third_party/gofrontend/libgo/go/image/color/palette/generate.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:generate go run gen.go -output palette.go
-
-// Package palette provides standard color palettes.
-package palette
diff --git a/third_party/gofrontend/libgo/go/image/color/palette/palette.go b/third_party/gofrontend/libgo/go/image/color/palette/palette.go
deleted file mode 100644
index 0bf2c8e..0000000
--- a/third_party/gofrontend/libgo/go/image/color/palette/palette.go
+++ /dev/null
@@ -1,503 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// generated by go run gen.go -output palette.go; DO NOT EDIT
-
-package palette
-
-import "image/color"
-
-// Plan9 is a 256-color palette that partitions the 24-bit RGB space
-// into 4×4×4 subdivision, with 4 shades in each subcube. Compared to the
-// WebSafe, the idea is to reduce the color resolution by dicing the
-// color cube into fewer cells, and to use the extra space to increase the
-// intensity resolution. This results in 16 gray shades (4 gray subcubes with
-// 4 samples in each), 13 shades of each primary and secondary color (3
-// subcubes with 4 samples plus black) and a reasonable selection of colors
-// covering the rest of the color cube. The advantage is better representation
-// of continuous tones.
-//
-// This palette was used in the Plan 9 Operating System, described at
-// http://plan9.bell-labs.com/magic/man2html/6/color
-var Plan9 = []color.Color{
-	color.RGBA{0x00, 0x00, 0x00, 0xff},
-	color.RGBA{0x00, 0x00, 0x44, 0xff},
-	color.RGBA{0x00, 0x00, 0x88, 0xff},
-	color.RGBA{0x00, 0x00, 0xcc, 0xff},
-	color.RGBA{0x00, 0x44, 0x00, 0xff},
-	color.RGBA{0x00, 0x44, 0x44, 0xff},
-	color.RGBA{0x00, 0x44, 0x88, 0xff},
-	color.RGBA{0x00, 0x44, 0xcc, 0xff},
-	color.RGBA{0x00, 0x88, 0x00, 0xff},
-	color.RGBA{0x00, 0x88, 0x44, 0xff},
-	color.RGBA{0x00, 0x88, 0x88, 0xff},
-	color.RGBA{0x00, 0x88, 0xcc, 0xff},
-	color.RGBA{0x00, 0xcc, 0x00, 0xff},
-	color.RGBA{0x00, 0xcc, 0x44, 0xff},
-	color.RGBA{0x00, 0xcc, 0x88, 0xff},
-	color.RGBA{0x00, 0xcc, 0xcc, 0xff},
-	color.RGBA{0x00, 0xdd, 0xdd, 0xff},
-	color.RGBA{0x11, 0x11, 0x11, 0xff},
-	color.RGBA{0x00, 0x00, 0x55, 0xff},
-	color.RGBA{0x00, 0x00, 0x99, 0xff},
-	color.RGBA{0x00, 0x00, 0xdd, 0xff},
-	color.RGBA{0x00, 0x55, 0x00, 0xff},
-	color.RGBA{0x00, 0x55, 0x55, 0xff},
-	color.RGBA{0x00, 0x4c, 0x99, 0xff},
-	color.RGBA{0x00, 0x49, 0xdd, 0xff},
-	color.RGBA{0x00, 0x99, 0x00, 0xff},
-	color.RGBA{0x00, 0x99, 0x4c, 0xff},
-	color.RGBA{0x00, 0x99, 0x99, 0xff},
-	color.RGBA{0x00, 0x93, 0xdd, 0xff},
-	color.RGBA{0x00, 0xdd, 0x00, 0xff},
-	color.RGBA{0x00, 0xdd, 0x49, 0xff},
-	color.RGBA{0x00, 0xdd, 0x93, 0xff},
-	color.RGBA{0x00, 0xee, 0x9e, 0xff},
-	color.RGBA{0x00, 0xee, 0xee, 0xff},
-	color.RGBA{0x22, 0x22, 0x22, 0xff},
-	color.RGBA{0x00, 0x00, 0x66, 0xff},
-	color.RGBA{0x00, 0x00, 0xaa, 0xff},
-	color.RGBA{0x00, 0x00, 0xee, 0xff},
-	color.RGBA{0x00, 0x66, 0x00, 0xff},
-	color.RGBA{0x00, 0x66, 0x66, 0xff},
-	color.RGBA{0x00, 0x55, 0xaa, 0xff},
-	color.RGBA{0x00, 0x4f, 0xee, 0xff},
-	color.RGBA{0x00, 0xaa, 0x00, 0xff},
-	color.RGBA{0x00, 0xaa, 0x55, 0xff},
-	color.RGBA{0x00, 0xaa, 0xaa, 0xff},
-	color.RGBA{0x00, 0x9e, 0xee, 0xff},
-	color.RGBA{0x00, 0xee, 0x00, 0xff},
-	color.RGBA{0x00, 0xee, 0x4f, 0xff},
-	color.RGBA{0x00, 0xff, 0x55, 0xff},
-	color.RGBA{0x00, 0xff, 0xaa, 0xff},
-	color.RGBA{0x00, 0xff, 0xff, 0xff},
-	color.RGBA{0x33, 0x33, 0x33, 0xff},
-	color.RGBA{0x00, 0x00, 0x77, 0xff},
-	color.RGBA{0x00, 0x00, 0xbb, 0xff},
-	color.RGBA{0x00, 0x00, 0xff, 0xff},
-	color.RGBA{0x00, 0x77, 0x00, 0xff},
-	color.RGBA{0x00, 0x77, 0x77, 0xff},
-	color.RGBA{0x00, 0x5d, 0xbb, 0xff},
-	color.RGBA{0x00, 0x55, 0xff, 0xff},
-	color.RGBA{0x00, 0xbb, 0x00, 0xff},
-	color.RGBA{0x00, 0xbb, 0x5d, 0xff},
-	color.RGBA{0x00, 0xbb, 0xbb, 0xff},
-	color.RGBA{0x00, 0xaa, 0xff, 0xff},
-	color.RGBA{0x00, 0xff, 0x00, 0xff},
-	color.RGBA{0x44, 0x00, 0x44, 0xff},
-	color.RGBA{0x44, 0x00, 0x88, 0xff},
-	color.RGBA{0x44, 0x00, 0xcc, 0xff},
-	color.RGBA{0x44, 0x44, 0x00, 0xff},
-	color.RGBA{0x44, 0x44, 0x44, 0xff},
-	color.RGBA{0x44, 0x44, 0x88, 0xff},
-	color.RGBA{0x44, 0x44, 0xcc, 0xff},
-	color.RGBA{0x44, 0x88, 0x00, 0xff},
-	color.RGBA{0x44, 0x88, 0x44, 0xff},
-	color.RGBA{0x44, 0x88, 0x88, 0xff},
-	color.RGBA{0x44, 0x88, 0xcc, 0xff},
-	color.RGBA{0x44, 0xcc, 0x00, 0xff},
-	color.RGBA{0x44, 0xcc, 0x44, 0xff},
-	color.RGBA{0x44, 0xcc, 0x88, 0xff},
-	color.RGBA{0x44, 0xcc, 0xcc, 0xff},
-	color.RGBA{0x44, 0x00, 0x00, 0xff},
-	color.RGBA{0x55, 0x00, 0x00, 0xff},
-	color.RGBA{0x55, 0x00, 0x55, 0xff},
-	color.RGBA{0x4c, 0x00, 0x99, 0xff},
-	color.RGBA{0x49, 0x00, 0xdd, 0xff},
-	color.RGBA{0x55, 0x55, 0x00, 0xff},
-	color.RGBA{0x55, 0x55, 0x55, 0xff},
-	color.RGBA{0x4c, 0x4c, 0x99, 0xff},
-	color.RGBA{0x49, 0x49, 0xdd, 0xff},
-	color.RGBA{0x4c, 0x99, 0x00, 0xff},
-	color.RGBA{0x4c, 0x99, 0x4c, 0xff},
-	color.RGBA{0x4c, 0x99, 0x99, 0xff},
-	color.RGBA{0x49, 0x93, 0xdd, 0xff},
-	color.RGBA{0x49, 0xdd, 0x00, 0xff},
-	color.RGBA{0x49, 0xdd, 0x49, 0xff},
-	color.RGBA{0x49, 0xdd, 0x93, 0xff},
-	color.RGBA{0x49, 0xdd, 0xdd, 0xff},
-	color.RGBA{0x4f, 0xee, 0xee, 0xff},
-	color.RGBA{0x66, 0x00, 0x00, 0xff},
-	color.RGBA{0x66, 0x00, 0x66, 0xff},
-	color.RGBA{0x55, 0x00, 0xaa, 0xff},
-	color.RGBA{0x4f, 0x00, 0xee, 0xff},
-	color.RGBA{0x66, 0x66, 0x00, 0xff},
-	color.RGBA{0x66, 0x66, 0x66, 0xff},
-	color.RGBA{0x55, 0x55, 0xaa, 0xff},
-	color.RGBA{0x4f, 0x4f, 0xee, 0xff},
-	color.RGBA{0x55, 0xaa, 0x00, 0xff},
-	color.RGBA{0x55, 0xaa, 0x55, 0xff},
-	color.RGBA{0x55, 0xaa, 0xaa, 0xff},
-	color.RGBA{0x4f, 0x9e, 0xee, 0xff},
-	color.RGBA{0x4f, 0xee, 0x00, 0xff},
-	color.RGBA{0x4f, 0xee, 0x4f, 0xff},
-	color.RGBA{0x4f, 0xee, 0x9e, 0xff},
-	color.RGBA{0x55, 0xff, 0xaa, 0xff},
-	color.RGBA{0x55, 0xff, 0xff, 0xff},
-	color.RGBA{0x77, 0x00, 0x00, 0xff},
-	color.RGBA{0x77, 0x00, 0x77, 0xff},
-	color.RGBA{0x5d, 0x00, 0xbb, 0xff},
-	color.RGBA{0x55, 0x00, 0xff, 0xff},
-	color.RGBA{0x77, 0x77, 0x00, 0xff},
-	color.RGBA{0x77, 0x77, 0x77, 0xff},
-	color.RGBA{0x5d, 0x5d, 0xbb, 0xff},
-	color.RGBA{0x55, 0x55, 0xff, 0xff},
-	color.RGBA{0x5d, 0xbb, 0x00, 0xff},
-	color.RGBA{0x5d, 0xbb, 0x5d, 0xff},
-	color.RGBA{0x5d, 0xbb, 0xbb, 0xff},
-	color.RGBA{0x55, 0xaa, 0xff, 0xff},
-	color.RGBA{0x55, 0xff, 0x00, 0xff},
-	color.RGBA{0x55, 0xff, 0x55, 0xff},
-	color.RGBA{0x88, 0x00, 0x88, 0xff},
-	color.RGBA{0x88, 0x00, 0xcc, 0xff},
-	color.RGBA{0x88, 0x44, 0x00, 0xff},
-	color.RGBA{0x88, 0x44, 0x44, 0xff},
-	color.RGBA{0x88, 0x44, 0x88, 0xff},
-	color.RGBA{0x88, 0x44, 0xcc, 0xff},
-	color.RGBA{0x88, 0x88, 0x00, 0xff},
-	color.RGBA{0x88, 0x88, 0x44, 0xff},
-	color.RGBA{0x88, 0x88, 0x88, 0xff},
-	color.RGBA{0x88, 0x88, 0xcc, 0xff},
-	color.RGBA{0x88, 0xcc, 0x00, 0xff},
-	color.RGBA{0x88, 0xcc, 0x44, 0xff},
-	color.RGBA{0x88, 0xcc, 0x88, 0xff},
-	color.RGBA{0x88, 0xcc, 0xcc, 0xff},
-	color.RGBA{0x88, 0x00, 0x00, 0xff},
-	color.RGBA{0x88, 0x00, 0x44, 0xff},
-	color.RGBA{0x99, 0x00, 0x4c, 0xff},
-	color.RGBA{0x99, 0x00, 0x99, 0xff},
-	color.RGBA{0x93, 0x00, 0xdd, 0xff},
-	color.RGBA{0x99, 0x4c, 0x00, 0xff},
-	color.RGBA{0x99, 0x4c, 0x4c, 0xff},
-	color.RGBA{0x99, 0x4c, 0x99, 0xff},
-	color.RGBA{0x93, 0x49, 0xdd, 0xff},
-	color.RGBA{0x99, 0x99, 0x00, 0xff},
-	color.RGBA{0x99, 0x99, 0x4c, 0xff},
-	color.RGBA{0x99, 0x99, 0x99, 0xff},
-	color.RGBA{0x93, 0x93, 0xdd, 0xff},
-	color.RGBA{0x93, 0xdd, 0x00, 0xff},
-	color.RGBA{0x93, 0xdd, 0x49, 0xff},
-	color.RGBA{0x93, 0xdd, 0x93, 0xff},
-	color.RGBA{0x93, 0xdd, 0xdd, 0xff},
-	color.RGBA{0x99, 0x00, 0x00, 0xff},
-	color.RGBA{0xaa, 0x00, 0x00, 0xff},
-	color.RGBA{0xaa, 0x00, 0x55, 0xff},
-	color.RGBA{0xaa, 0x00, 0xaa, 0xff},
-	color.RGBA{0x9e, 0x00, 0xee, 0xff},
-	color.RGBA{0xaa, 0x55, 0x00, 0xff},
-	color.RGBA{0xaa, 0x55, 0x55, 0xff},
-	color.RGBA{0xaa, 0x55, 0xaa, 0xff},
-	color.RGBA{0x9e, 0x4f, 0xee, 0xff},
-	color.RGBA{0xaa, 0xaa, 0x00, 0xff},
-	color.RGBA{0xaa, 0xaa, 0x55, 0xff},
-	color.RGBA{0xaa, 0xaa, 0xaa, 0xff},
-	color.RGBA{0x9e, 0x9e, 0xee, 0xff},
-	color.RGBA{0x9e, 0xee, 0x00, 0xff},
-	color.RGBA{0x9e, 0xee, 0x4f, 0xff},
-	color.RGBA{0x9e, 0xee, 0x9e, 0xff},
-	color.RGBA{0x9e, 0xee, 0xee, 0xff},
-	color.RGBA{0xaa, 0xff, 0xff, 0xff},
-	color.RGBA{0xbb, 0x00, 0x00, 0xff},
-	color.RGBA{0xbb, 0x00, 0x5d, 0xff},
-	color.RGBA{0xbb, 0x00, 0xbb, 0xff},
-	color.RGBA{0xaa, 0x00, 0xff, 0xff},
-	color.RGBA{0xbb, 0x5d, 0x00, 0xff},
-	color.RGBA{0xbb, 0x5d, 0x5d, 0xff},
-	color.RGBA{0xbb, 0x5d, 0xbb, 0xff},
-	color.RGBA{0xaa, 0x55, 0xff, 0xff},
-	color.RGBA{0xbb, 0xbb, 0x00, 0xff},
-	color.RGBA{0xbb, 0xbb, 0x5d, 0xff},
-	color.RGBA{0xbb, 0xbb, 0xbb, 0xff},
-	color.RGBA{0xaa, 0xaa, 0xff, 0xff},
-	color.RGBA{0xaa, 0xff, 0x00, 0xff},
-	color.RGBA{0xaa, 0xff, 0x55, 0xff},
-	color.RGBA{0xaa, 0xff, 0xaa, 0xff},
-	color.RGBA{0xcc, 0x00, 0xcc, 0xff},
-	color.RGBA{0xcc, 0x44, 0x00, 0xff},
-	color.RGBA{0xcc, 0x44, 0x44, 0xff},
-	color.RGBA{0xcc, 0x44, 0x88, 0xff},
-	color.RGBA{0xcc, 0x44, 0xcc, 0xff},
-	color.RGBA{0xcc, 0x88, 0x00, 0xff},
-	color.RGBA{0xcc, 0x88, 0x44, 0xff},
-	color.RGBA{0xcc, 0x88, 0x88, 0xff},
-	color.RGBA{0xcc, 0x88, 0xcc, 0xff},
-	color.RGBA{0xcc, 0xcc, 0x00, 0xff},
-	color.RGBA{0xcc, 0xcc, 0x44, 0xff},
-	color.RGBA{0xcc, 0xcc, 0x88, 0xff},
-	color.RGBA{0xcc, 0xcc, 0xcc, 0xff},
-	color.RGBA{0xcc, 0x00, 0x00, 0xff},
-	color.RGBA{0xcc, 0x00, 0x44, 0xff},
-	color.RGBA{0xcc, 0x00, 0x88, 0xff},
-	color.RGBA{0xdd, 0x00, 0x93, 0xff},
-	color.RGBA{0xdd, 0x00, 0xdd, 0xff},
-	color.RGBA{0xdd, 0x49, 0x00, 0xff},
-	color.RGBA{0xdd, 0x49, 0x49, 0xff},
-	color.RGBA{0xdd, 0x49, 0x93, 0xff},
-	color.RGBA{0xdd, 0x49, 0xdd, 0xff},
-	color.RGBA{0xdd, 0x93, 0x00, 0xff},
-	color.RGBA{0xdd, 0x93, 0x49, 0xff},
-	color.RGBA{0xdd, 0x93, 0x93, 0xff},
-	color.RGBA{0xdd, 0x93, 0xdd, 0xff},
-	color.RGBA{0xdd, 0xdd, 0x00, 0xff},
-	color.RGBA{0xdd, 0xdd, 0x49, 0xff},
-	color.RGBA{0xdd, 0xdd, 0x93, 0xff},
-	color.RGBA{0xdd, 0xdd, 0xdd, 0xff},
-	color.RGBA{0xdd, 0x00, 0x00, 0xff},
-	color.RGBA{0xdd, 0x00, 0x49, 0xff},
-	color.RGBA{0xee, 0x00, 0x4f, 0xff},
-	color.RGBA{0xee, 0x00, 0x9e, 0xff},
-	color.RGBA{0xee, 0x00, 0xee, 0xff},
-	color.RGBA{0xee, 0x4f, 0x00, 0xff},
-	color.RGBA{0xee, 0x4f, 0x4f, 0xff},
-	color.RGBA{0xee, 0x4f, 0x9e, 0xff},
-	color.RGBA{0xee, 0x4f, 0xee, 0xff},
-	color.RGBA{0xee, 0x9e, 0x00, 0xff},
-	color.RGBA{0xee, 0x9e, 0x4f, 0xff},
-	color.RGBA{0xee, 0x9e, 0x9e, 0xff},
-	color.RGBA{0xee, 0x9e, 0xee, 0xff},
-	color.RGBA{0xee, 0xee, 0x00, 0xff},
-	color.RGBA{0xee, 0xee, 0x4f, 0xff},
-	color.RGBA{0xee, 0xee, 0x9e, 0xff},
-	color.RGBA{0xee, 0xee, 0xee, 0xff},
-	color.RGBA{0xee, 0x00, 0x00, 0xff},
-	color.RGBA{0xff, 0x00, 0x00, 0xff},
-	color.RGBA{0xff, 0x00, 0x55, 0xff},
-	color.RGBA{0xff, 0x00, 0xaa, 0xff},
-	color.RGBA{0xff, 0x00, 0xff, 0xff},
-	color.RGBA{0xff, 0x55, 0x00, 0xff},
-	color.RGBA{0xff, 0x55, 0x55, 0xff},
-	color.RGBA{0xff, 0x55, 0xaa, 0xff},
-	color.RGBA{0xff, 0x55, 0xff, 0xff},
-	color.RGBA{0xff, 0xaa, 0x00, 0xff},
-	color.RGBA{0xff, 0xaa, 0x55, 0xff},
-	color.RGBA{0xff, 0xaa, 0xaa, 0xff},
-	color.RGBA{0xff, 0xaa, 0xff, 0xff},
-	color.RGBA{0xff, 0xff, 0x00, 0xff},
-	color.RGBA{0xff, 0xff, 0x55, 0xff},
-	color.RGBA{0xff, 0xff, 0xaa, 0xff},
-	color.RGBA{0xff, 0xff, 0xff, 0xff},
-}
-
-// WebSafe is a 216-color palette that was popularized by early versions
-// of Netscape Navigator. It is also known as the Netscape Color Cube.
-//
-// See http://en.wikipedia.org/wiki/Web_colors#Web-safe_colors for details.
-var WebSafe = []color.Color{
-	color.RGBA{0x00, 0x00, 0x00, 0xff},
-	color.RGBA{0x00, 0x00, 0x33, 0xff},
-	color.RGBA{0x00, 0x00, 0x66, 0xff},
-	color.RGBA{0x00, 0x00, 0x99, 0xff},
-	color.RGBA{0x00, 0x00, 0xcc, 0xff},
-	color.RGBA{0x00, 0x00, 0xff, 0xff},
-	color.RGBA{0x00, 0x33, 0x00, 0xff},
-	color.RGBA{0x00, 0x33, 0x33, 0xff},
-	color.RGBA{0x00, 0x33, 0x66, 0xff},
-	color.RGBA{0x00, 0x33, 0x99, 0xff},
-	color.RGBA{0x00, 0x33, 0xcc, 0xff},
-	color.RGBA{0x00, 0x33, 0xff, 0xff},
-	color.RGBA{0x00, 0x66, 0x00, 0xff},
-	color.RGBA{0x00, 0x66, 0x33, 0xff},
-	color.RGBA{0x00, 0x66, 0x66, 0xff},
-	color.RGBA{0x00, 0x66, 0x99, 0xff},
-	color.RGBA{0x00, 0x66, 0xcc, 0xff},
-	color.RGBA{0x00, 0x66, 0xff, 0xff},
-	color.RGBA{0x00, 0x99, 0x00, 0xff},
-	color.RGBA{0x00, 0x99, 0x33, 0xff},
-	color.RGBA{0x00, 0x99, 0x66, 0xff},
-	color.RGBA{0x00, 0x99, 0x99, 0xff},
-	color.RGBA{0x00, 0x99, 0xcc, 0xff},
-	color.RGBA{0x00, 0x99, 0xff, 0xff},
-	color.RGBA{0x00, 0xcc, 0x00, 0xff},
-	color.RGBA{0x00, 0xcc, 0x33, 0xff},
-	color.RGBA{0x00, 0xcc, 0x66, 0xff},
-	color.RGBA{0x00, 0xcc, 0x99, 0xff},
-	color.RGBA{0x00, 0xcc, 0xcc, 0xff},
-	color.RGBA{0x00, 0xcc, 0xff, 0xff},
-	color.RGBA{0x00, 0xff, 0x00, 0xff},
-	color.RGBA{0x00, 0xff, 0x33, 0xff},
-	color.RGBA{0x00, 0xff, 0x66, 0xff},
-	color.RGBA{0x00, 0xff, 0x99, 0xff},
-	color.RGBA{0x00, 0xff, 0xcc, 0xff},
-	color.RGBA{0x00, 0xff, 0xff, 0xff},
-	color.RGBA{0x33, 0x00, 0x00, 0xff},
-	color.RGBA{0x33, 0x00, 0x33, 0xff},
-	color.RGBA{0x33, 0x00, 0x66, 0xff},
-	color.RGBA{0x33, 0x00, 0x99, 0xff},
-	color.RGBA{0x33, 0x00, 0xcc, 0xff},
-	color.RGBA{0x33, 0x00, 0xff, 0xff},
-	color.RGBA{0x33, 0x33, 0x00, 0xff},
-	color.RGBA{0x33, 0x33, 0x33, 0xff},
-	color.RGBA{0x33, 0x33, 0x66, 0xff},
-	color.RGBA{0x33, 0x33, 0x99, 0xff},
-	color.RGBA{0x33, 0x33, 0xcc, 0xff},
-	color.RGBA{0x33, 0x33, 0xff, 0xff},
-	color.RGBA{0x33, 0x66, 0x00, 0xff},
-	color.RGBA{0x33, 0x66, 0x33, 0xff},
-	color.RGBA{0x33, 0x66, 0x66, 0xff},
-	color.RGBA{0x33, 0x66, 0x99, 0xff},
-	color.RGBA{0x33, 0x66, 0xcc, 0xff},
-	color.RGBA{0x33, 0x66, 0xff, 0xff},
-	color.RGBA{0x33, 0x99, 0x00, 0xff},
-	color.RGBA{0x33, 0x99, 0x33, 0xff},
-	color.RGBA{0x33, 0x99, 0x66, 0xff},
-	color.RGBA{0x33, 0x99, 0x99, 0xff},
-	color.RGBA{0x33, 0x99, 0xcc, 0xff},
-	color.RGBA{0x33, 0x99, 0xff, 0xff},
-	color.RGBA{0x33, 0xcc, 0x00, 0xff},
-	color.RGBA{0x33, 0xcc, 0x33, 0xff},
-	color.RGBA{0x33, 0xcc, 0x66, 0xff},
-	color.RGBA{0x33, 0xcc, 0x99, 0xff},
-	color.RGBA{0x33, 0xcc, 0xcc, 0xff},
-	color.RGBA{0x33, 0xcc, 0xff, 0xff},
-	color.RGBA{0x33, 0xff, 0x00, 0xff},
-	color.RGBA{0x33, 0xff, 0x33, 0xff},
-	color.RGBA{0x33, 0xff, 0x66, 0xff},
-	color.RGBA{0x33, 0xff, 0x99, 0xff},
-	color.RGBA{0x33, 0xff, 0xcc, 0xff},
-	color.RGBA{0x33, 0xff, 0xff, 0xff},
-	color.RGBA{0x66, 0x00, 0x00, 0xff},
-	color.RGBA{0x66, 0x00, 0x33, 0xff},
-	color.RGBA{0x66, 0x00, 0x66, 0xff},
-	color.RGBA{0x66, 0x00, 0x99, 0xff},
-	color.RGBA{0x66, 0x00, 0xcc, 0xff},
-	color.RGBA{0x66, 0x00, 0xff, 0xff},
-	color.RGBA{0x66, 0x33, 0x00, 0xff},
-	color.RGBA{0x66, 0x33, 0x33, 0xff},
-	color.RGBA{0x66, 0x33, 0x66, 0xff},
-	color.RGBA{0x66, 0x33, 0x99, 0xff},
-	color.RGBA{0x66, 0x33, 0xcc, 0xff},
-	color.RGBA{0x66, 0x33, 0xff, 0xff},
-	color.RGBA{0x66, 0x66, 0x00, 0xff},
-	color.RGBA{0x66, 0x66, 0x33, 0xff},
-	color.RGBA{0x66, 0x66, 0x66, 0xff},
-	color.RGBA{0x66, 0x66, 0x99, 0xff},
-	color.RGBA{0x66, 0x66, 0xcc, 0xff},
-	color.RGBA{0x66, 0x66, 0xff, 0xff},
-	color.RGBA{0x66, 0x99, 0x00, 0xff},
-	color.RGBA{0x66, 0x99, 0x33, 0xff},
-	color.RGBA{0x66, 0x99, 0x66, 0xff},
-	color.RGBA{0x66, 0x99, 0x99, 0xff},
-	color.RGBA{0x66, 0x99, 0xcc, 0xff},
-	color.RGBA{0x66, 0x99, 0xff, 0xff},
-	color.RGBA{0x66, 0xcc, 0x00, 0xff},
-	color.RGBA{0x66, 0xcc, 0x33, 0xff},
-	color.RGBA{0x66, 0xcc, 0x66, 0xff},
-	color.RGBA{0x66, 0xcc, 0x99, 0xff},
-	color.RGBA{0x66, 0xcc, 0xcc, 0xff},
-	color.RGBA{0x66, 0xcc, 0xff, 0xff},
-	color.RGBA{0x66, 0xff, 0x00, 0xff},
-	color.RGBA{0x66, 0xff, 0x33, 0xff},
-	color.RGBA{0x66, 0xff, 0x66, 0xff},
-	color.RGBA{0x66, 0xff, 0x99, 0xff},
-	color.RGBA{0x66, 0xff, 0xcc, 0xff},
-	color.RGBA{0x66, 0xff, 0xff, 0xff},
-	color.RGBA{0x99, 0x00, 0x00, 0xff},
-	color.RGBA{0x99, 0x00, 0x33, 0xff},
-	color.RGBA{0x99, 0x00, 0x66, 0xff},
-	color.RGBA{0x99, 0x00, 0x99, 0xff},
-	color.RGBA{0x99, 0x00, 0xcc, 0xff},
-	color.RGBA{0x99, 0x00, 0xff, 0xff},
-	color.RGBA{0x99, 0x33, 0x00, 0xff},
-	color.RGBA{0x99, 0x33, 0x33, 0xff},
-	color.RGBA{0x99, 0x33, 0x66, 0xff},
-	color.RGBA{0x99, 0x33, 0x99, 0xff},
-	color.RGBA{0x99, 0x33, 0xcc, 0xff},
-	color.RGBA{0x99, 0x33, 0xff, 0xff},
-	color.RGBA{0x99, 0x66, 0x00, 0xff},
-	color.RGBA{0x99, 0x66, 0x33, 0xff},
-	color.RGBA{0x99, 0x66, 0x66, 0xff},
-	color.RGBA{0x99, 0x66, 0x99, 0xff},
-	color.RGBA{0x99, 0x66, 0xcc, 0xff},
-	color.RGBA{0x99, 0x66, 0xff, 0xff},
-	color.RGBA{0x99, 0x99, 0x00, 0xff},
-	color.RGBA{0x99, 0x99, 0x33, 0xff},
-	color.RGBA{0x99, 0x99, 0x66, 0xff},
-	color.RGBA{0x99, 0x99, 0x99, 0xff},
-	color.RGBA{0x99, 0x99, 0xcc, 0xff},
-	color.RGBA{0x99, 0x99, 0xff, 0xff},
-	color.RGBA{0x99, 0xcc, 0x00, 0xff},
-	color.RGBA{0x99, 0xcc, 0x33, 0xff},
-	color.RGBA{0x99, 0xcc, 0x66, 0xff},
-	color.RGBA{0x99, 0xcc, 0x99, 0xff},
-	color.RGBA{0x99, 0xcc, 0xcc, 0xff},
-	color.RGBA{0x99, 0xcc, 0xff, 0xff},
-	color.RGBA{0x99, 0xff, 0x00, 0xff},
-	color.RGBA{0x99, 0xff, 0x33, 0xff},
-	color.RGBA{0x99, 0xff, 0x66, 0xff},
-	color.RGBA{0x99, 0xff, 0x99, 0xff},
-	color.RGBA{0x99, 0xff, 0xcc, 0xff},
-	color.RGBA{0x99, 0xff, 0xff, 0xff},
-	color.RGBA{0xcc, 0x00, 0x00, 0xff},
-	color.RGBA{0xcc, 0x00, 0x33, 0xff},
-	color.RGBA{0xcc, 0x00, 0x66, 0xff},
-	color.RGBA{0xcc, 0x00, 0x99, 0xff},
-	color.RGBA{0xcc, 0x00, 0xcc, 0xff},
-	color.RGBA{0xcc, 0x00, 0xff, 0xff},
-	color.RGBA{0xcc, 0x33, 0x00, 0xff},
-	color.RGBA{0xcc, 0x33, 0x33, 0xff},
-	color.RGBA{0xcc, 0x33, 0x66, 0xff},
-	color.RGBA{0xcc, 0x33, 0x99, 0xff},
-	color.RGBA{0xcc, 0x33, 0xcc, 0xff},
-	color.RGBA{0xcc, 0x33, 0xff, 0xff},
-	color.RGBA{0xcc, 0x66, 0x00, 0xff},
-	color.RGBA{0xcc, 0x66, 0x33, 0xff},
-	color.RGBA{0xcc, 0x66, 0x66, 0xff},
-	color.RGBA{0xcc, 0x66, 0x99, 0xff},
-	color.RGBA{0xcc, 0x66, 0xcc, 0xff},
-	color.RGBA{0xcc, 0x66, 0xff, 0xff},
-	color.RGBA{0xcc, 0x99, 0x00, 0xff},
-	color.RGBA{0xcc, 0x99, 0x33, 0xff},
-	color.RGBA{0xcc, 0x99, 0x66, 0xff},
-	color.RGBA{0xcc, 0x99, 0x99, 0xff},
-	color.RGBA{0xcc, 0x99, 0xcc, 0xff},
-	color.RGBA{0xcc, 0x99, 0xff, 0xff},
-	color.RGBA{0xcc, 0xcc, 0x00, 0xff},
-	color.RGBA{0xcc, 0xcc, 0x33, 0xff},
-	color.RGBA{0xcc, 0xcc, 0x66, 0xff},
-	color.RGBA{0xcc, 0xcc, 0x99, 0xff},
-	color.RGBA{0xcc, 0xcc, 0xcc, 0xff},
-	color.RGBA{0xcc, 0xcc, 0xff, 0xff},
-	color.RGBA{0xcc, 0xff, 0x00, 0xff},
-	color.RGBA{0xcc, 0xff, 0x33, 0xff},
-	color.RGBA{0xcc, 0xff, 0x66, 0xff},
-	color.RGBA{0xcc, 0xff, 0x99, 0xff},
-	color.RGBA{0xcc, 0xff, 0xcc, 0xff},
-	color.RGBA{0xcc, 0xff, 0xff, 0xff},
-	color.RGBA{0xff, 0x00, 0x00, 0xff},
-	color.RGBA{0xff, 0x00, 0x33, 0xff},
-	color.RGBA{0xff, 0x00, 0x66, 0xff},
-	color.RGBA{0xff, 0x00, 0x99, 0xff},
-	color.RGBA{0xff, 0x00, 0xcc, 0xff},
-	color.RGBA{0xff, 0x00, 0xff, 0xff},
-	color.RGBA{0xff, 0x33, 0x00, 0xff},
-	color.RGBA{0xff, 0x33, 0x33, 0xff},
-	color.RGBA{0xff, 0x33, 0x66, 0xff},
-	color.RGBA{0xff, 0x33, 0x99, 0xff},
-	color.RGBA{0xff, 0x33, 0xcc, 0xff},
-	color.RGBA{0xff, 0x33, 0xff, 0xff},
-	color.RGBA{0xff, 0x66, 0x00, 0xff},
-	color.RGBA{0xff, 0x66, 0x33, 0xff},
-	color.RGBA{0xff, 0x66, 0x66, 0xff},
-	color.RGBA{0xff, 0x66, 0x99, 0xff},
-	color.RGBA{0xff, 0x66, 0xcc, 0xff},
-	color.RGBA{0xff, 0x66, 0xff, 0xff},
-	color.RGBA{0xff, 0x99, 0x00, 0xff},
-	color.RGBA{0xff, 0x99, 0x33, 0xff},
-	color.RGBA{0xff, 0x99, 0x66, 0xff},
-	color.RGBA{0xff, 0x99, 0x99, 0xff},
-	color.RGBA{0xff, 0x99, 0xcc, 0xff},
-	color.RGBA{0xff, 0x99, 0xff, 0xff},
-	color.RGBA{0xff, 0xcc, 0x00, 0xff},
-	color.RGBA{0xff, 0xcc, 0x33, 0xff},
-	color.RGBA{0xff, 0xcc, 0x66, 0xff},
-	color.RGBA{0xff, 0xcc, 0x99, 0xff},
-	color.RGBA{0xff, 0xcc, 0xcc, 0xff},
-	color.RGBA{0xff, 0xcc, 0xff, 0xff},
-	color.RGBA{0xff, 0xff, 0x00, 0xff},
-	color.RGBA{0xff, 0xff, 0x33, 0xff},
-	color.RGBA{0xff, 0xff, 0x66, 0xff},
-	color.RGBA{0xff, 0xff, 0x99, 0xff},
-	color.RGBA{0xff, 0xff, 0xcc, 0xff},
-	color.RGBA{0xff, 0xff, 0xff, 0xff},
-}
diff --git a/third_party/gofrontend/libgo/go/image/color/ycbcr.go b/third_party/gofrontend/libgo/go/image/color/ycbcr.go
deleted file mode 100644
index 4bcb07d..0000000
--- a/third_party/gofrontend/libgo/go/image/color/ycbcr.go
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package color
-
-// RGBToYCbCr converts an RGB triple to a Y'CbCr triple.
-func RGBToYCbCr(r, g, b uint8) (uint8, uint8, uint8) {
-	// The JFIF specification says:
-	//	Y' =  0.2990*R + 0.5870*G + 0.1140*B
-	//	Cb = -0.1687*R - 0.3313*G + 0.5000*B + 128
-	//	Cr =  0.5000*R - 0.4187*G - 0.0813*B + 128
-	// http://www.w3.org/Graphics/JPEG/jfif3.pdf says Y but means Y'.
-
-	r1 := int32(r)
-	g1 := int32(g)
-	b1 := int32(b)
-	yy := (19595*r1 + 38470*g1 + 7471*b1 + 1<<15) >> 16
-	cb := (-11056*r1 - 21712*g1 + 32768*b1 + 257<<15) >> 16
-	cr := (32768*r1 - 27440*g1 - 5328*b1 + 257<<15) >> 16
-	if yy < 0 {
-		yy = 0
-	} else if yy > 0xff {
-		yy = 0xff
-	}
-	if cb < 0 {
-		cb = 0
-	} else if cb > 0xff {
-		cb = 0xff
-	}
-	if cr < 0 {
-		cr = 0
-	} else if cr > 0xff {
-		cr = 0xff
-	}
-	return uint8(yy), uint8(cb), uint8(cr)
-}
-
-// YCbCrToRGB converts a Y'CbCr triple to an RGB triple.
-func YCbCrToRGB(y, cb, cr uint8) (uint8, uint8, uint8) {
-	// The JFIF specification says:
-	//	R = Y' + 1.40200*(Cr-128)
-	//	G = Y' - 0.34414*(Cb-128) - 0.71414*(Cr-128)
-	//	B = Y' + 1.77200*(Cb-128)
-	// http://www.w3.org/Graphics/JPEG/jfif3.pdf says Y but means Y'.
-
-	yy1 := int32(y) * 0x10100 // Convert 0x12 to 0x121200.
-	cb1 := int32(cb) - 128
-	cr1 := int32(cr) - 128
-	r := (yy1 + 91881*cr1) >> 16
-	g := (yy1 - 22554*cb1 - 46802*cr1) >> 16
-	b := (yy1 + 116130*cb1) >> 16
-	if r < 0 {
-		r = 0
-	} else if r > 0xff {
-		r = 0xff
-	}
-	if g < 0 {
-		g = 0
-	} else if g > 0xff {
-		g = 0xff
-	}
-	if b < 0 {
-		b = 0
-	} else if b > 0xff {
-		b = 0xff
-	}
-	return uint8(r), uint8(g), uint8(b)
-}
-
-// YCbCr represents a fully opaque 24-bit Y'CbCr color, having 8 bits each for
-// one luma and two chroma components.
-//
-// JPEG, VP8, the MPEG family and other codecs use this color model. Such
-// codecs often use the terms YUV and Y'CbCr interchangeably, but strictly
-// speaking, the term YUV applies only to analog video signals, and Y' (luma)
-// is Y (luminance) after applying gamma correction.
-//
-// Conversion between RGB and Y'CbCr is lossy and there are multiple, slightly
-// different formulae for converting between the two. This package follows
-// the JFIF specification at http://www.w3.org/Graphics/JPEG/jfif3.pdf.
-type YCbCr struct {
-	Y, Cb, Cr uint8
-}
-
-func (c YCbCr) RGBA() (uint32, uint32, uint32, uint32) {
-	// This code is a copy of the YCbCrToRGB function above, except that it
-	// returns values in the range [0, 0xffff] instead of [0, 0xff]. There is a
-	// subtle difference between doing this and having YCbCr satisfy the Color
-	// interface by first converting to an RGBA. The latter loses some
-	// information by going to and from 8 bits per channel.
-	//
-	// For example, this code:
-	//	const y, cb, cr = 0x7f, 0x7f, 0x7f
-	//	r, g, b := color.YCbCrToRGB(y, cb, cr)
-	//	r0, g0, b0, _ := color.YCbCr{y, cb, cr}.RGBA()
-	//	r1, g1, b1, _ := color.RGBA{r, g, b, 0xff}.RGBA()
-	//	fmt.Printf("0x%04x 0x%04x 0x%04x\n", r0, g0, b0)
-	//	fmt.Printf("0x%04x 0x%04x 0x%04x\n", r1, g1, b1)
-	// prints:
-	//	0x7e18 0x808e 0x7db9
-	//	0x7e7e 0x8080 0x7d7d
-
-	yy1 := int32(c.Y) * 0x10100 // Convert 0x12 to 0x121200.
-	cb1 := int32(c.Cb) - 128
-	cr1 := int32(c.Cr) - 128
-	r := (yy1 + 91881*cr1) >> 8
-	g := (yy1 - 22554*cb1 - 46802*cr1) >> 8
-	b := (yy1 + 116130*cb1) >> 8
-	if r < 0 {
-		r = 0
-	} else if r > 0xffff {
-		r = 0xffff
-	}
-	if g < 0 {
-		g = 0
-	} else if g > 0xffff {
-		g = 0xffff
-	}
-	if b < 0 {
-		b = 0
-	} else if b > 0xffff {
-		b = 0xffff
-	}
-	return uint32(r), uint32(g), uint32(b), 0xffff
-}
-
-// YCbCrModel is the Model for Y'CbCr colors.
-var YCbCrModel Model = ModelFunc(yCbCrModel)
-
-func yCbCrModel(c Color) Color {
-	if _, ok := c.(YCbCr); ok {
-		return c
-	}
-	r, g, b, _ := c.RGBA()
-	y, u, v := RGBToYCbCr(uint8(r>>8), uint8(g>>8), uint8(b>>8))
-	return YCbCr{y, u, v}
-}
-
-// RGBToCMYK converts an RGB triple to a CMYK quadruple.
-func RGBToCMYK(r, g, b uint8) (uint8, uint8, uint8, uint8) {
-	rr := uint32(r)
-	gg := uint32(g)
-	bb := uint32(b)
-	w := rr
-	if w < gg {
-		w = gg
-	}
-	if w < bb {
-		w = bb
-	}
-	if w == 0 {
-		return 0, 0, 0, 0xff
-	}
-	c := (w - rr) * 0xff / w
-	m := (w - gg) * 0xff / w
-	y := (w - bb) * 0xff / w
-	return uint8(c), uint8(m), uint8(y), uint8(0xff - w)
-}
-
-// CMYKToRGB converts a CMYK quadruple to an RGB triple.
-func CMYKToRGB(c, m, y, k uint8) (uint8, uint8, uint8) {
-	w := uint32(0xffff - uint32(k)*0x101)
-	r := uint32(0xffff-uint32(c)*0x101) * w / 0xffff
-	g := uint32(0xffff-uint32(m)*0x101) * w / 0xffff
-	b := uint32(0xffff-uint32(y)*0x101) * w / 0xffff
-	return uint8(r >> 8), uint8(g >> 8), uint8(b >> 8)
-}
-
-// CMYK represents a fully opaque CMYK color, having 8 bits for each of cyan,
-// magenta, yellow and black.
-//
-// It is not associated with any particular color profile.
-type CMYK struct {
-	C, M, Y, K uint8
-}
-
-func (c CMYK) RGBA() (uint32, uint32, uint32, uint32) {
-	// This code is a copy of the CMYKToRGB function above, except that it
-	// returns values in the range [0, 0xffff] instead of [0, 0xff].
-
-	w := uint32(0xffff - uint32(c.K)*0x101)
-	r := uint32(0xffff-uint32(c.C)*0x101) * w / 0xffff
-	g := uint32(0xffff-uint32(c.M)*0x101) * w / 0xffff
-	b := uint32(0xffff-uint32(c.Y)*0x101) * w / 0xffff
-	return uint32(r), uint32(g), uint32(b), 0xffff
-}
-
-// CMYKModel is the Model for CMYK colors.
-var CMYKModel Model = ModelFunc(cmykModel)
-
-func cmykModel(c Color) Color {
-	if _, ok := c.(CMYK); ok {
-		return c
-	}
-	r, g, b, _ := c.RGBA()
-	cc, mm, yy, kk := RGBToCMYK(uint8(r>>8), uint8(g>>8), uint8(b>>8))
-	return CMYK{cc, mm, yy, kk}
-}
diff --git a/third_party/gofrontend/libgo/go/image/color/ycbcr_test.go b/third_party/gofrontend/libgo/go/image/color/ycbcr_test.go
deleted file mode 100644
index 5da49d3..0000000
--- a/third_party/gofrontend/libgo/go/image/color/ycbcr_test.go
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package color
-
-import (
-	"fmt"
-	"testing"
-)
-
-func delta(x, y uint8) uint8 {
-	if x >= y {
-		return x - y
-	}
-	return y - x
-}
-
-func eq(c0, c1 Color) error {
-	r0, g0, b0, a0 := c0.RGBA()
-	r1, g1, b1, a1 := c1.RGBA()
-	if r0 != r1 || g0 != g1 || b0 != b1 || a0 != a1 {
-		return fmt.Errorf("got  0x%04x 0x%04x 0x%04x 0x%04x\nwant 0x%04x 0x%04x 0x%04x 0x%04x",
-			r0, g0, b0, a0, r1, g1, b1, a1)
-	}
-	return nil
-}
-
-// TestYCbCrRoundtrip tests that a subset of RGB space can be converted to YCbCr
-// and back to within 2/256 tolerance.
-func TestYCbCrRoundtrip(t *testing.T) {
-	for r := 0; r < 256; r += 7 {
-		for g := 0; g < 256; g += 5 {
-			for b := 0; b < 256; b += 3 {
-				r0, g0, b0 := uint8(r), uint8(g), uint8(b)
-				y, cb, cr := RGBToYCbCr(r0, g0, b0)
-				r1, g1, b1 := YCbCrToRGB(y, cb, cr)
-				if delta(r0, r1) > 2 || delta(g0, g1) > 2 || delta(b0, b1) > 2 {
-					t.Fatalf("\nr0, g0, b0 = %d, %d, %d\ny,  cb, cr = %d, %d, %d\nr1, g1, b1 = %d, %d, %d",
-						r0, g0, b0, y, cb, cr, r1, g1, b1)
-				}
-			}
-		}
-	}
-}
-
-// TestYCbCrToRGBConsistency tests that calling the RGBA method (16 bit color)
-// then truncating to 8 bits is equivalent to calling the YCbCrToRGB function (8
-// bit color).
-func TestYCbCrToRGBConsistency(t *testing.T) {
-	for y := 0; y < 256; y += 7 {
-		for cb := 0; cb < 256; cb += 5 {
-			for cr := 0; cr < 256; cr += 3 {
-				x := YCbCr{uint8(y), uint8(cb), uint8(cr)}
-				r0, g0, b0, _ := x.RGBA()
-				r1, g1, b1 := uint8(r0>>8), uint8(g0>>8), uint8(b0>>8)
-				r2, g2, b2 := YCbCrToRGB(x.Y, x.Cb, x.Cr)
-				if r1 != r2 || g1 != g2 || b1 != b2 {
-					t.Fatalf("y, cb, cr = %d, %d, %d\nr1, g1, b1 = %d, %d, %d\nr2, g2, b2 = %d, %d, %d",
-						y, cb, cr, r1, g1, b1, r2, g2, b2)
-				}
-			}
-		}
-	}
-}
-
-// TestYCbCrGray tests that YCbCr colors are a superset of Gray colors.
-func TestYCbCrGray(t *testing.T) {
-	for i := 0; i < 256; i++ {
-		if err := eq(YCbCr{uint8(i), 0x80, 0x80}, Gray{uint8(i)}); err != nil {
-			t.Errorf("i=0x%02x:\n%v", i, err)
-		}
-	}
-}
-
-// TestCMYKRoundtrip tests that a subset of RGB space can be converted to CMYK
-// and back to within 1/256 tolerance.
-func TestCMYKRoundtrip(t *testing.T) {
-	for r := 0; r < 256; r += 7 {
-		for g := 0; g < 256; g += 5 {
-			for b := 0; b < 256; b += 3 {
-				r0, g0, b0 := uint8(r), uint8(g), uint8(b)
-				c, m, y, k := RGBToCMYK(r0, g0, b0)
-				r1, g1, b1 := CMYKToRGB(c, m, y, k)
-				if delta(r0, r1) > 1 || delta(g0, g1) > 1 || delta(b0, b1) > 1 {
-					t.Fatalf("\nr0, g0, b0 = %d, %d, %d\nc, m, y, k = %d, %d, %d, %d\nr1, g1, b1 = %d, %d, %d",
-						r0, g0, b0, c, m, y, k, r1, g1, b1)
-				}
-			}
-		}
-	}
-}
-
-// TestCMYKToRGBConsistency tests that calling the RGBA method (16 bit color)
-// then truncating to 8 bits is equivalent to calling the CMYKToRGB function (8
-// bit color).
-func TestCMYKToRGBConsistency(t *testing.T) {
-	for c := 0; c < 256; c += 7 {
-		for m := 0; m < 256; m += 5 {
-			for y := 0; y < 256; y += 3 {
-				for k := 0; k < 256; k += 11 {
-					x := CMYK{uint8(c), uint8(m), uint8(y), uint8(k)}
-					r0, g0, b0, _ := x.RGBA()
-					r1, g1, b1 := uint8(r0>>8), uint8(g0>>8), uint8(b0>>8)
-					r2, g2, b2 := CMYKToRGB(x.C, x.M, x.Y, x.K)
-					if r1 != r2 || g1 != g2 || b1 != b2 {
-						t.Fatalf("c, m, y, k = %d, %d, %d, %d\nr1, g1, b1 = %d, %d, %d\nr2, g2, b2 = %d, %d, %d",
-							c, m, y, k, r1, g1, b1, r2, g2, b2)
-					}
-				}
-			}
-		}
-	}
-}
-
-// TestCMYKGray tests that CMYK colors are a superset of Gray colors.
-func TestCMYKGray(t *testing.T) {
-	for i := 0; i < 256; i++ {
-		if err := eq(CMYK{0x00, 0x00, 0x00, uint8(255 - i)}, Gray{uint8(i)}); err != nil {
-			t.Errorf("i=0x%02x:\n%v", i, err)
-		}
-	}
-}
-
-func TestPalette(t *testing.T) {
-	p := Palette{
-		RGBA{0xff, 0xff, 0xff, 0xff},
-		RGBA{0x80, 0x00, 0x00, 0xff},
-		RGBA{0x7f, 0x00, 0x00, 0x7f},
-		RGBA{0x00, 0x00, 0x00, 0x7f},
-		RGBA{0x00, 0x00, 0x00, 0x00},
-		RGBA{0x40, 0x40, 0x40, 0x40},
-	}
-	// Check that, for a Palette with no repeated colors, the closest color to
-	// each element is itself.
-	for i, c := range p {
-		j := p.Index(c)
-		if i != j {
-			t.Errorf("Index(%v): got %d (color = %v), want %d", c, j, p[j], i)
-		}
-	}
-	// Check that finding the closest color considers alpha, not just red,
-	// green and blue.
-	got := p.Convert(RGBA{0x80, 0x00, 0x00, 0x80})
-	want := RGBA{0x7f, 0x00, 0x00, 0x7f}
-	if got != want {
-		t.Errorf("got %v, want %v", got, want)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/decode_example_test.go b/third_party/gofrontend/libgo/go/image/decode_example_test.go
deleted file mode 100644
index 81fa037..0000000
--- a/third_party/gofrontend/libgo/go/image/decode_example_test.go
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This example demonstrates decoding a JPEG image and examining its pixels.
-package image_test
-
-import (
-	"encoding/base64"
-	"fmt"
-	"image"
-	"log"
-	"strings"
-
-	// Package image/jpeg is not used explicitly in the code below,
-	// but is imported for its initialization side-effect, which allows
-	// image.Decode to understand JPEG formatted images. Uncomment these
-	// two lines to also understand GIF and PNG images:
-	// _ "image/gif"
-	// _ "image/png"
-	_ "image/jpeg"
-)
-
-func Example() {
-	// Decode the JPEG data. If reading from file, create a reader with
-	//
-	// reader, err := os.Open("testdata/video-001.q50.420.jpeg")
-	// if err != nil {
-	//     log.Fatal(err)
-	// }
-	// defer reader.Close()
-	reader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(data))
-	m, _, err := image.Decode(reader)
-	if err != nil {
-		log.Fatal(err)
-	}
-	bounds := m.Bounds()
-
-	// Calculate a 16-bin histogram for m's red, green, blue and alpha components.
-	//
-	// An image's bounds do not necessarily start at (0, 0), so the two loops start
-	// at bounds.Min.Y and bounds.Min.X. Looping over Y first and X second is more
-	// likely to result in better memory access patterns than X first and Y second.
-	var histogram [16][4]int
-	for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
-		for x := bounds.Min.X; x < bounds.Max.X; x++ {
-			r, g, b, a := m.At(x, y).RGBA()
-			// A color's RGBA method returns values in the range [0, 65535].
-			// Shifting by 12 reduces this to the range [0, 15].
-			histogram[r>>12][0]++
-			histogram[g>>12][1]++
-			histogram[b>>12][2]++
-			histogram[a>>12][3]++
-		}
-	}
-
-	// Print the results.
-	fmt.Printf("%-14s %6s %6s %6s %6s\n", "bin", "red", "green", "blue", "alpha")
-	for i, x := range histogram {
-		fmt.Printf("0x%04x-0x%04x: %6d %6d %6d %6d\n", i<<12, (i+1)<<12-1, x[0], x[1], x[2], x[3])
-	}
-	// Output:
-	// bin               red  green   blue  alpha
-	// 0x0000-0x0fff:    364    790   7242      0
-	// 0x1000-0x1fff:    645   2967   1039      0
-	// 0x2000-0x2fff:   1072   2299    979      0
-	// 0x3000-0x3fff:    820   2266    980      0
-	// 0x4000-0x4fff:    537   1305    541      0
-	// 0x5000-0x5fff:    319    962    261      0
-	// 0x6000-0x6fff:    322    375    177      0
-	// 0x7000-0x7fff:    601    279    214      0
-	// 0x8000-0x8fff:   3478    227    273      0
-	// 0x9000-0x9fff:   2260    234    329      0
-	// 0xa000-0xafff:    921    282    373      0
-	// 0xb000-0xbfff:    321    335    397      0
-	// 0xc000-0xcfff:    229    388    298      0
-	// 0xd000-0xdfff:    260    414    277      0
-	// 0xe000-0xefff:    516    428    298      0
-	// 0xf000-0xffff:   2785   1899   1772  15450
-}
-
-const data = `
-/9j/4AAQSkZJRgABAQIAHAAcAAD/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdA
-SFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2Nj
-Y2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wAARCABnAJYDASIAAhEBAxEB/8QA
-HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
-MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW
-V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
-x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF
-BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
-YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
-hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq
-8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDlwKMD0pwzSiuK57QzGDxS7D6in8Y5ximnAPUfSlcq4m3ilUYp
-2OKXHvRcVxnTtS7c07HNFK4DQPakC4PNOA+tOx70XAjK/So5gBGP94fzqfvUVx/qxx/EP51UXqRP4WSE
-cmgjilP3jSEZqS0IO/NGDnpUiocDg/McDjvV6HTPOdVWYgsM5KcfzzQ2JySM2jp6VYu7SWzmMUwG4cgj
-kMPUVBjjtTGtRu0Zopw+lFFxhinrGzuqqMsxAA9yaXFSRv5cqSEcIwYj6GpuZ30O30fSLKzhUpbpNMv3
-5XGTn29BV28jt7pPLuIVljPBBFVreYx+VbqAjycgt3x14zRcNOxGyVFHQkIc/wA61exyKLbuzjdZ046d
-ftEuTEw3Rk9SPT8P8Kpbea3tchbyVae4JkjbbGpGdwOM89Af6ViFTWUtGdcXoM2+woK1JtpNtTcoZt+l
-Jt7ZqTbRtouFyPFRXI/c9D94fzqzioLsfuD/ALw/nVReqIn8LJCOTSY+tSMOTmkIpXLRu+F0t5pJxPHG
-wjjUAuBjJJz1+laD6Pai+WaK9SBX6puzn6ZP+NV/Dkdtc6ZNbyAFwxLAHDYPv6VoQ21nPNEEiQGEFRtk
-Gf0NaWTOeW7Of8QwGG4MRZnEbYXPJwRnOR0zWNXW+KrqBLUWi5EjbWCgcAA9c/gRXKYqZaGlK/LqMH0F
-FLtHvRSNiYD2pSDTgpp6p0ywUHoTULXYxcktzrdCf7Xo8LP/AKyEmMNjJ46dfbFWJ5TDGNwB9lFUvDV9
-YrbfYGbyrjcWG88S57g+vtV26ZIvMlumKwwjLZ6V0WfU54yTvYwtbubea2WNWbzg4bYQeBgj8OtYeKhj
-u4y2HQxqxOD1xzxmrWAQCCGB6EGsaikndmsJxeiYzBo280/Z7UbayuaXGY5oIp+2lx9KLjIsVDeD/Rj/
-ALy/zq1t96r3y4tT/vL/ADq4P3kRP4WSleTSFKkkKoCW4GaqNcMxIjXj1pxjKT0FKrGC1Nrw3vGrKkYz
-5kTAr6455/HH510UdwPtRgWCbzF5+YYUf4Vwun39xpmoR3qASMmQUJwGU9Rnt/8AWrpbrxhb8/ZdOmaQ
-gAGZwFH5ZJrpVKVlY5ZYhN6kXiu2eO/ikZlIljAAB5yM549OawSOOlPuLqe+umuLqTfM4OSOAo7ADsKh
-hl/cRsTuJHPv7mlKi3sVTxNtGP20VJhThgSQaK52mnZnUqsWrpkyeUrr5pABOAPU1AGaXUCWJISHGPfP
-P8qL7BiKnsMg46H3qrbzupbj5mPTPTpXVSglG551SpzSsXJ4/MBUgYIxyKpySyGBYJriV1D7kRpCVH4V
-bSeNJ4xchni3DeqnBI+td7F4b0mKIRjT45VbktJlzk455+n6VtYzv2PNwFZWBHBGKVJDGVC54/nXQeMN
-NttLNkba1jgWVWDmM8bhg4/nzXLSSbXVj6fyNKUdNRp21RtIRJGrjuM0u3FQ2DbodvcEkfQmrW2vLqLl
-k0ejCXNFMj2/jQV9qkxSYNRcsZiq2oI32N2CkhWXJxwOe9XMcVt6hoPn6dFaW0wgRpNzvKDlz6+/0rai
-ryv2Jm9LHJai+ZRGCBjnr71ErdAxAY9B611t1Y2cunbbaOQ3FvKZI3UqGlZMbiWwfcfhV231iwvLSM3U
-lt5Uq52TuZG+hGMA12xXJGxxzjzybOQtNOvb5j9ktZJhnBIHyg+5PFX38JayqK/2eLJIBUTgkDA9q7ex
-itrSHFpGsUbndhRgc+g7VNIyfZJAoJZUbb3I46CtFJMylBo8sdWhmYMuCnylc9wef5VUT7+1chc5NS7h
-sUZO5RtIPUH3pkBDOxxxmqM9TQtn+WilhHfHaik43KTG3Z4IyPyrNVjGCsZ+dmwv6V3cXhSG8sYpJLud
-JJIwxChdoJGcYx/Wkg8DafA4knvLiQr/ALqj+VQpKw3FtnFFfvbiSMgZJ6/jXp2n3d9cQRBTFsKD96EP
-oOxPU/8A68VVtbbRtMVntbePKDLTSHJH/Aj/AEqHTvE66rq72VugMMcbSGTnL4wMAfjT5n0HyW3L+s6b
-baxaJBdzN+7bcrxkAhun0rz3VNCv7e7lgigknWI43xLu6jjIHTjtXqfkpPGVYsBkghTikgsYIN/lhgXb
-cxLkknp/ShczQ7xtY8vtEmhkj8yGRBuCnehUcnHcVtmwfJ/fQ8e7f/E12txZW91C0U6b42xlST2OR/Ko
-Bo1gM/uW55/1jf41nOipu7LhV5FZHIGzI6zwj/vr/Ck+yr3uYf8Ax7/CutbQdMb71tn/ALaN/jSf8I/p
-X/PoP++2/wAan6rAr6wzkWt0II+1Rc/7Lf4Vd1eeCSKBbdZDdShYoiZNoyfY10P/AAj2lf8APmP++2/x
-oPh/SjKspsozIuNrZORjp3qo0FHYPb3OZt7ae3SzjuItsiRSAgnccl/UA+3Q1yNjKLR4ZZYY5VD7tkv3
-WwO/+e1evPp9nI257aJm6bioz1z1+tY+s6Hplnot9PbWMMcqwOFcLyOO1bJWMZSTOPHi+9w3mosrlyd2
-9lCj02g9P/1e9a3hzxAbl2ikZRcdQueHHt7j864Y8Z4I4oRzG6urFWU5BHBB7HNJxTFGbR6he6Vpmtgm
-eLy5zwZI/lb8fX8azIvBUUTHdfSFP4QsYB/HNZ+k+KEnRY75hHOvAk6K/v7H9K6yyvlnQBmDZ6GsnzR0
-N0oy1RzOtaN/Y1tHNFO06u+zYy4I4Jzx9KKveJblXuordSGES5b6n/62PzorKVdp2LjQTVyWz8UWEWlq
-jSgyxfJt6EgdDzWTdeLIZGO7zHI/hVajGmWWP+PWL8qwlAIURrhpMAHHJA71pRcZrToZzcoEuo6heakA
-GHk245CZ6/X1qPTLq40q+W5t2QybSpDAkEEc55/zilk5k2r91eKhLDzWz2rpsczbbuemeD76fUNG865I
-MiysmQMZAAwa3a5j4ftu0ByP+fh/5CulkLLG7INzhSVHqe1Fh3uOoqn9qQQxyhndmHIxwOmSR2xQ13KD
-KoiBZOV9JBnt707MVy5RWdNdy7wRGf3bfMinnO1jg+vY03WXLaJO3mhQ20b0zwpYf0qlG7S7icrJs08U
-VwumgC+YiQyeVtZH567hzj8aSL949oGhE/2v5pJCDkksQwBHC4/+vXQ8LZ2uYxxCavY7us/xCcaBfn0h
-b+VP0bnSrb94ZMJgOecj1rl/GfidUE2k2gy5+SeQjgA/wj3rlas2jdao48qrjLAGkSKPk4Gc1WMj92I+
-lIJnU8OfxPWo5inBokmtQTmM4OOh71b0q6vbFmWCbaxHyqQGAP0PT8KhSTzVyo5ocSKA5VfTOTmqsmRd
-pl99XjPzThzK3zOeOSeveirNmkgg/fIpYsTkYORxRXmzlTjJqx6EVUcU7mhkKCzdAK59QI9zYxtG1fYU
-UVtgtmY4nZEa8Ak9aqFv3rfSiiu1nMeifDv/AJF+T/r4f+QrqqKKQwzQenNFFMCOKFIgNuThdoJ5OPSk
-ubeK6t3gnXdG4wwziiii/UTKMOg6dbzJLFE4dSCP3rEdeOM8805tDsGMvySgSsS6rM6gk9eAcUUVftZt
-3uyVGNthuq3Eei6DK8H7sRR7YuMgHtXkc8rzTNLM26RyWY+p70UVnLY0iEsUipG7rhZBlDkc1HgYoorM
-0HwyBXGeRjmrcUhMg2ghezd//rUUVcTKW5s2jZtY/QDaOKKKK8ip8bPRj8KP/9k=
-`
diff --git a/third_party/gofrontend/libgo/go/image/decode_test.go b/third_party/gofrontend/libgo/go/image/decode_test.go
deleted file mode 100644
index d16ef8a..0000000
--- a/third_party/gofrontend/libgo/go/image/decode_test.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package image_test
-
-import (
-	"bufio"
-	"fmt"
-	"image"
-	"image/color"
-	"os"
-	"testing"
-
-	_ "image/gif"
-	_ "image/jpeg"
-	_ "image/png"
-)
-
-type imageTest struct {
-	goldenFilename string
-	filename       string
-	tolerance      int
-}
-
-var imageTests = []imageTest{
-	{"testdata/video-001.png", "testdata/video-001.png", 0},
-	// GIF images are restricted to a 256-color palette and the conversion
-	// to GIF loses significant image quality.
-	{"testdata/video-001.png", "testdata/video-001.gif", 64 << 8},
-	{"testdata/video-001.png", "testdata/video-001.interlaced.gif", 64 << 8},
-	{"testdata/video-001.png", "testdata/video-001.5bpp.gif", 128 << 8},
-	// JPEG is a lossy format and hence needs a non-zero tolerance.
-	{"testdata/video-001.png", "testdata/video-001.jpeg", 8 << 8},
-	{"testdata/video-001.png", "testdata/video-001.progressive.jpeg", 8 << 8},
-	{"testdata/video-001.221212.png", "testdata/video-001.221212.jpeg", 8 << 8},
-	{"testdata/video-001.cmyk.png", "testdata/video-001.cmyk.jpeg", 8 << 8},
-	{"testdata/video-001.rgb.png", "testdata/video-001.rgb.jpeg", 8 << 8},
-	// Grayscale images.
-	{"testdata/video-005.gray.png", "testdata/video-005.gray.jpeg", 8 << 8},
-	{"testdata/video-005.gray.png", "testdata/video-005.gray.png", 0},
-}
-
-func decode(filename string) (image.Image, string, error) {
-	f, err := os.Open(filename)
-	if err != nil {
-		return nil, "", err
-	}
-	defer f.Close()
-	return image.Decode(bufio.NewReader(f))
-}
-
-func decodeConfig(filename string) (image.Config, string, error) {
-	f, err := os.Open(filename)
-	if err != nil {
-		return image.Config{}, "", err
-	}
-	defer f.Close()
-	return image.DecodeConfig(bufio.NewReader(f))
-}
-
-func delta(u0, u1 uint32) int {
-	d := int(u0) - int(u1)
-	if d < 0 {
-		return -d
-	}
-	return d
-}
-
-func withinTolerance(c0, c1 color.Color, tolerance int) bool {
-	r0, g0, b0, a0 := c0.RGBA()
-	r1, g1, b1, a1 := c1.RGBA()
-	r := delta(r0, r1)
-	g := delta(g0, g1)
-	b := delta(b0, b1)
-	a := delta(a0, a1)
-	return r <= tolerance && g <= tolerance && b <= tolerance && a <= tolerance
-}
-
-func TestDecode(t *testing.T) {
-	rgba := func(c color.Color) string {
-		r, g, b, a := c.RGBA()
-		return fmt.Sprintf("rgba = 0x%04x, 0x%04x, 0x%04x, 0x%04x for %T%v", r, g, b, a, c, c)
-	}
-
-	golden := make(map[string]image.Image)
-loop:
-	for _, it := range imageTests {
-		g := golden[it.goldenFilename]
-		if g == nil {
-			var err error
-			g, _, err = decode(it.goldenFilename)
-			if err != nil {
-				t.Errorf("%s: %v", it.goldenFilename, err)
-				continue loop
-			}
-			golden[it.goldenFilename] = g
-		}
-		m, imageFormat, err := decode(it.filename)
-		if err != nil {
-			t.Errorf("%s: %v", it.filename, err)
-			continue loop
-		}
-		b := g.Bounds()
-		if !b.Eq(m.Bounds()) {
-			t.Errorf("%s: got bounds %v want %v", it.filename, m.Bounds(), b)
-			continue loop
-		}
-		for y := b.Min.Y; y < b.Max.Y; y++ {
-			for x := b.Min.X; x < b.Max.X; x++ {
-				if !withinTolerance(g.At(x, y), m.At(x, y), it.tolerance) {
-					t.Errorf("%s: at (%d, %d):\ngot  %v\nwant %v",
-						it.filename, x, y, rgba(m.At(x, y)), rgba(g.At(x, y)))
-					continue loop
-				}
-			}
-		}
-		if imageFormat == "gif" {
-			// Each frame of a GIF can have a frame-local palette override the
-			// GIF-global palette. Thus, image.Decode can yield a different ColorModel
-			// than image.DecodeConfig.
-			continue
-		}
-		c, _, err := decodeConfig(it.filename)
-		if m.ColorModel() != c.ColorModel {
-			t.Errorf("%s: color models differ", it.filename)
-			continue loop
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/draw/bench_test.go b/third_party/gofrontend/libgo/go/image/draw/bench_test.go
deleted file mode 100644
index 7b89f95..0000000
--- a/third_party/gofrontend/libgo/go/image/draw/bench_test.go
+++ /dev/null
@@ -1,259 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package draw
-
-import (
-	"image"
-	"image/color"
-	"reflect"
-	"testing"
-)
-
-const (
-	dstw, dsth = 640, 480
-	srcw, srch = 400, 300
-)
-
-var palette = color.Palette{
-	color.Black,
-	color.White,
-}
-
-// bench benchmarks drawing src and mask images onto a dst image with the
-// given op and the color models to create those images from.
-// The created images' pixels are initialized to non-zero values.
-func bench(b *testing.B, dcm, scm, mcm color.Model, op Op) {
-	b.StopTimer()
-
-	var dst Image
-	switch dcm {
-	case color.RGBAModel:
-		dst1 := image.NewRGBA(image.Rect(0, 0, dstw, dsth))
-		for y := 0; y < dsth; y++ {
-			for x := 0; x < dstw; x++ {
-				dst1.SetRGBA(x, y, color.RGBA{
-					uint8(5 * x % 0x100),
-					uint8(7 * y % 0x100),
-					uint8((7*x + 5*y) % 0x100),
-					0xff,
-				})
-			}
-		}
-		dst = dst1
-	case color.RGBA64Model:
-		dst1 := image.NewRGBA64(image.Rect(0, 0, dstw, dsth))
-		for y := 0; y < dsth; y++ {
-			for x := 0; x < dstw; x++ {
-				dst1.SetRGBA64(x, y, color.RGBA64{
-					uint16(53 * x % 0x10000),
-					uint16(59 * y % 0x10000),
-					uint16((59*x + 53*y) % 0x10000),
-					0xffff,
-				})
-			}
-		}
-		dst = dst1
-	default:
-		// The == operator isn't defined on a color.Palette (a slice), so we
-		// use reflection.
-		if reflect.DeepEqual(dcm, palette) {
-			dst1 := image.NewPaletted(image.Rect(0, 0, dstw, dsth), palette)
-			for y := 0; y < dsth; y++ {
-				for x := 0; x < dstw; x++ {
-					dst1.SetColorIndex(x, y, uint8(x^y)&1)
-				}
-			}
-			dst = dst1
-		} else {
-			b.Fatal("unknown destination color model", dcm)
-		}
-	}
-
-	var src image.Image
-	switch scm {
-	case nil:
-		src = &image.Uniform{C: color.RGBA{0x11, 0x22, 0x33, 0xff}}
-	case color.CMYKModel:
-		src1 := image.NewCMYK(image.Rect(0, 0, srcw, srch))
-		for y := 0; y < srch; y++ {
-			for x := 0; x < srcw; x++ {
-				src1.SetCMYK(x, y, color.CMYK{
-					uint8(13 * x % 0x100),
-					uint8(11 * y % 0x100),
-					uint8((11*x + 13*y) % 0x100),
-					uint8((31*x + 37*y) % 0x100),
-				})
-			}
-		}
-		src = src1
-	case color.GrayModel:
-		src1 := image.NewGray(image.Rect(0, 0, srcw, srch))
-		for y := 0; y < srch; y++ {
-			for x := 0; x < srcw; x++ {
-				src1.SetGray(x, y, color.Gray{
-					uint8((11*x + 13*y) % 0x100),
-				})
-			}
-		}
-		src = src1
-	case color.RGBAModel:
-		src1 := image.NewRGBA(image.Rect(0, 0, srcw, srch))
-		for y := 0; y < srch; y++ {
-			for x := 0; x < srcw; x++ {
-				src1.SetRGBA(x, y, color.RGBA{
-					uint8(13 * x % 0x80),
-					uint8(11 * y % 0x80),
-					uint8((11*x + 13*y) % 0x80),
-					0x7f,
-				})
-			}
-		}
-		src = src1
-	case color.RGBA64Model:
-		src1 := image.NewRGBA64(image.Rect(0, 0, srcw, srch))
-		for y := 0; y < srch; y++ {
-			for x := 0; x < srcw; x++ {
-				src1.SetRGBA64(x, y, color.RGBA64{
-					uint16(103 * x % 0x8000),
-					uint16(101 * y % 0x8000),
-					uint16((101*x + 103*y) % 0x8000),
-					0x7fff,
-				})
-			}
-		}
-		src = src1
-	case color.NRGBAModel:
-		src1 := image.NewNRGBA(image.Rect(0, 0, srcw, srch))
-		for y := 0; y < srch; y++ {
-			for x := 0; x < srcw; x++ {
-				src1.SetNRGBA(x, y, color.NRGBA{
-					uint8(13 * x % 0x100),
-					uint8(11 * y % 0x100),
-					uint8((11*x + 13*y) % 0x100),
-					0x7f,
-				})
-			}
-		}
-		src = src1
-	case color.YCbCrModel:
-		yy := make([]uint8, srcw*srch)
-		cb := make([]uint8, srcw*srch)
-		cr := make([]uint8, srcw*srch)
-		for i := range yy {
-			yy[i] = uint8(3 * i % 0x100)
-			cb[i] = uint8(5 * i % 0x100)
-			cr[i] = uint8(7 * i % 0x100)
-		}
-		src = &image.YCbCr{
-			Y:              yy,
-			Cb:             cb,
-			Cr:             cr,
-			YStride:        srcw,
-			CStride:        srcw,
-			SubsampleRatio: image.YCbCrSubsampleRatio444,
-			Rect:           image.Rect(0, 0, srcw, srch),
-		}
-	default:
-		b.Fatal("unknown source color model", scm)
-	}
-
-	var mask image.Image
-	switch mcm {
-	case nil:
-		// No-op.
-	case color.AlphaModel:
-		mask1 := image.NewAlpha(image.Rect(0, 0, srcw, srch))
-		for y := 0; y < srch; y++ {
-			for x := 0; x < srcw; x++ {
-				a := uint8((23*x + 29*y) % 0x100)
-				// Glyph masks are typically mostly zero,
-				// so we only set a quarter of mask1's pixels.
-				if a >= 0xc0 {
-					mask1.SetAlpha(x, y, color.Alpha{a})
-				}
-			}
-		}
-		mask = mask1
-	default:
-		b.Fatal("unknown mask color model", mcm)
-	}
-
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		// Scatter the destination rectangle to draw into.
-		x := 3 * i % (dstw - srcw)
-		y := 7 * i % (dsth - srch)
-
-		DrawMask(dst, dst.Bounds().Add(image.Pt(x, y)), src, image.ZP, mask, image.ZP, op)
-	}
-}
-
-// The BenchmarkFoo functions exercise a drawFoo fast-path function in draw.go.
-
-func BenchmarkFillOver(b *testing.B) {
-	bench(b, color.RGBAModel, nil, nil, Over)
-}
-
-func BenchmarkFillSrc(b *testing.B) {
-	bench(b, color.RGBAModel, nil, nil, Src)
-}
-
-func BenchmarkCopyOver(b *testing.B) {
-	bench(b, color.RGBAModel, color.RGBAModel, nil, Over)
-}
-
-func BenchmarkCopySrc(b *testing.B) {
-	bench(b, color.RGBAModel, color.RGBAModel, nil, Src)
-}
-
-func BenchmarkNRGBAOver(b *testing.B) {
-	bench(b, color.RGBAModel, color.NRGBAModel, nil, Over)
-}
-
-func BenchmarkNRGBASrc(b *testing.B) {
-	bench(b, color.RGBAModel, color.NRGBAModel, nil, Src)
-}
-
-func BenchmarkYCbCr(b *testing.B) {
-	bench(b, color.RGBAModel, color.YCbCrModel, nil, Over)
-}
-
-func BenchmarkGray(b *testing.B) {
-	bench(b, color.RGBAModel, color.GrayModel, nil, Over)
-}
-
-func BenchmarkCMYK(b *testing.B) {
-	bench(b, color.RGBAModel, color.CMYKModel, nil, Over)
-}
-
-func BenchmarkGlyphOver(b *testing.B) {
-	bench(b, color.RGBAModel, nil, color.AlphaModel, Over)
-}
-
-func BenchmarkRGBA(b *testing.B) {
-	bench(b, color.RGBAModel, color.RGBA64Model, nil, Src)
-}
-
-func BenchmarkPaletted(b *testing.B) {
-	bench(b, palette, color.RGBAModel, nil, Src)
-}
-
-// The BenchmarkGenericFoo functions exercise the generic, slow-path code.
-
-func BenchmarkGenericOver(b *testing.B) {
-	bench(b, color.RGBA64Model, color.RGBA64Model, nil, Over)
-}
-
-func BenchmarkGenericMaskOver(b *testing.B) {
-	bench(b, color.RGBA64Model, color.RGBA64Model, color.AlphaModel, Over)
-}
-
-func BenchmarkGenericSrc(b *testing.B) {
-	bench(b, color.RGBA64Model, color.RGBA64Model, nil, Src)
-}
-
-func BenchmarkGenericMaskSrc(b *testing.B) {
-	bench(b, color.RGBA64Model, color.RGBA64Model, color.AlphaModel, Src)
-}
diff --git a/third_party/gofrontend/libgo/go/image/draw/clip_test.go b/third_party/gofrontend/libgo/go/image/draw/clip_test.go
deleted file mode 100644
index 0abf53e..0000000
--- a/third_party/gofrontend/libgo/go/image/draw/clip_test.go
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package draw
-
-import (
-	"image"
-	"testing"
-)
-
-type clipTest struct {
-	desc          string
-	r, dr, sr, mr image.Rectangle
-	sp, mp        image.Point
-	nilMask       bool
-	r0            image.Rectangle
-	sp0, mp0      image.Point
-}
-
-var clipTests = []clipTest{
-	// The following tests all have a nil mask.
-	{
-		"basic",
-		image.Rect(0, 0, 100, 100),
-		image.Rect(0, 0, 100, 100),
-		image.Rect(0, 0, 100, 100),
-		image.ZR,
-		image.ZP,
-		image.ZP,
-		true,
-		image.Rect(0, 0, 100, 100),
-		image.ZP,
-		image.ZP,
-	},
-	{
-		"clip dr",
-		image.Rect(0, 0, 100, 100),
-		image.Rect(40, 40, 60, 60),
-		image.Rect(0, 0, 100, 100),
-		image.ZR,
-		image.ZP,
-		image.ZP,
-		true,
-		image.Rect(40, 40, 60, 60),
-		image.Pt(40, 40),
-		image.ZP,
-	},
-	{
-		"clip sr",
-		image.Rect(0, 0, 100, 100),
-		image.Rect(0, 0, 100, 100),
-		image.Rect(20, 20, 80, 80),
-		image.ZR,
-		image.ZP,
-		image.ZP,
-		true,
-		image.Rect(20, 20, 80, 80),
-		image.Pt(20, 20),
-		image.ZP,
-	},
-	{
-		"clip dr and sr",
-		image.Rect(0, 0, 100, 100),
-		image.Rect(0, 0, 50, 100),
-		image.Rect(20, 20, 80, 80),
-		image.ZR,
-		image.ZP,
-		image.ZP,
-		true,
-		image.Rect(20, 20, 50, 80),
-		image.Pt(20, 20),
-		image.ZP,
-	},
-	{
-		"clip dr and sr, sp outside sr (top-left)",
-		image.Rect(0, 0, 100, 100),
-		image.Rect(0, 0, 50, 100),
-		image.Rect(20, 20, 80, 80),
-		image.ZR,
-		image.Pt(15, 8),
-		image.ZP,
-		true,
-		image.Rect(5, 12, 50, 72),
-		image.Pt(20, 20),
-		image.ZP,
-	},
-	{
-		"clip dr and sr, sp outside sr (middle-left)",
-		image.Rect(0, 0, 100, 100),
-		image.Rect(0, 0, 50, 100),
-		image.Rect(20, 20, 80, 80),
-		image.ZR,
-		image.Pt(15, 66),
-		image.ZP,
-		true,
-		image.Rect(5, 0, 50, 14),
-		image.Pt(20, 66),
-		image.ZP,
-	},
-	{
-		"clip dr and sr, sp outside sr (bottom-left)",
-		image.Rect(0, 0, 100, 100),
-		image.Rect(0, 0, 50, 100),
-		image.Rect(20, 20, 80, 80),
-		image.ZR,
-		image.Pt(15, 91),
-		image.ZP,
-		true,
-		image.ZR,
-		image.Pt(15, 91),
-		image.ZP,
-	},
-	{
-		"clip dr and sr, sp inside sr",
-		image.Rect(0, 0, 100, 100),
-		image.Rect(0, 0, 50, 100),
-		image.Rect(20, 20, 80, 80),
-		image.ZR,
-		image.Pt(44, 33),
-		image.ZP,
-		true,
-		image.Rect(0, 0, 36, 47),
-		image.Pt(44, 33),
-		image.ZP,
-	},
-
-	// The following tests all have a non-nil mask.
-	{
-		"basic mask",
-		image.Rect(0, 0, 80, 80),
-		image.Rect(20, 0, 100, 80),
-		image.Rect(0, 0, 50, 49),
-		image.Rect(0, 0, 46, 47),
-		image.ZP,
-		image.ZP,
-		false,
-		image.Rect(20, 0, 46, 47),
-		image.Pt(20, 0),
-		image.Pt(20, 0),
-	},
-	{
-		"clip sr and mr",
-		image.Rect(0, 0, 100, 100),
-		image.Rect(0, 0, 100, 100),
-		image.Rect(23, 23, 55, 86),
-		image.Rect(44, 44, 87, 58),
-		image.Pt(10, 10),
-		image.Pt(11, 11),
-		false,
-		image.Rect(33, 33, 45, 47),
-		image.Pt(43, 43),
-		image.Pt(44, 44),
-	},
-}
-
-func TestClip(t *testing.T) {
-	dst0 := image.NewRGBA(image.Rect(0, 0, 100, 100))
-	src0 := image.NewRGBA(image.Rect(0, 0, 100, 100))
-	mask0 := image.NewRGBA(image.Rect(0, 0, 100, 100))
-	for _, c := range clipTests {
-		dst := dst0.SubImage(c.dr).(*image.RGBA)
-		src := src0.SubImage(c.sr).(*image.RGBA)
-		r, sp, mp := c.r, c.sp, c.mp
-		if c.nilMask {
-			clip(dst, &r, src, &sp, nil, nil)
-		} else {
-			clip(dst, &r, src, &sp, mask0.SubImage(c.mr), &mp)
-		}
-
-		// Check that the actual results equal the expected results.
-		if !c.r0.Eq(r) {
-			t.Errorf("%s: clip rectangle want %v got %v", c.desc, c.r0, r)
-			continue
-		}
-		if !c.sp0.Eq(sp) {
-			t.Errorf("%s: sp want %v got %v", c.desc, c.sp0, sp)
-			continue
-		}
-		if !c.nilMask {
-			if !c.mp0.Eq(mp) {
-				t.Errorf("%s: mp want %v got %v", c.desc, c.mp0, mp)
-				continue
-			}
-		}
-
-		// Check that the clipped rectangle is contained by the dst / src / mask
-		// rectangles, in their respective coordinate spaces.
-		if !r.In(c.dr) {
-			t.Errorf("%s: c.dr %v does not contain r %v", c.desc, c.dr, r)
-		}
-		// sr is r translated into src's coordinate space.
-		sr := r.Add(c.sp.Sub(c.dr.Min))
-		if !sr.In(c.sr) {
-			t.Errorf("%s: c.sr %v does not contain sr %v", c.desc, c.sr, sr)
-		}
-		if !c.nilMask {
-			// mr is r translated into mask's coordinate space.
-			mr := r.Add(c.mp.Sub(c.dr.Min))
-			if !mr.In(c.mr) {
-				t.Errorf("%s: c.mr %v does not contain mr %v", c.desc, c.mr, mr)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/draw/draw.go b/third_party/gofrontend/libgo/go/image/draw/draw.go
deleted file mode 100644
index 9419d5e..0000000
--- a/third_party/gofrontend/libgo/go/image/draw/draw.go
+++ /dev/null
@@ -1,690 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package draw provides image composition functions.
-//
-// See "The Go image/draw package" for an introduction to this package:
-// https://golang.org/doc/articles/image_draw.html
-package draw
-
-import (
-	"image"
-	"image/color"
-	"image/internal/imageutil"
-)
-
-// m is the maximum color value returned by image.Color.RGBA.
-const m = 1<<16 - 1
-
-// Image is an image.Image with a Set method to change a single pixel.
-type Image interface {
-	image.Image
-	Set(x, y int, c color.Color)
-}
-
-// Quantizer produces a palette for an image.
-type Quantizer interface {
-	// Quantize appends up to cap(p) - len(p) colors to p and returns the
-	// updated palette suitable for converting m to a paletted image.
-	Quantize(p color.Palette, m image.Image) color.Palette
-}
-
-// Op is a Porter-Duff compositing operator.
-type Op int
-
-const (
-	// Over specifies ``(src in mask) over dst''.
-	Over Op = iota
-	// Src specifies ``src in mask''.
-	Src
-)
-
-// Draw implements the Drawer interface by calling the Draw function with this
-// Op.
-func (op Op) Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point) {
-	DrawMask(dst, r, src, sp, nil, image.Point{}, op)
-}
-
-// Drawer contains the Draw method.
-type Drawer interface {
-	// Draw aligns r.Min in dst with sp in src and then replaces the
-	// rectangle r in dst with the result of drawing src on dst.
-	Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point)
-}
-
-// FloydSteinberg is a Drawer that is the Src Op with Floyd-Steinberg error
-// diffusion.
-var FloydSteinberg Drawer = floydSteinberg{}
-
-type floydSteinberg struct{}
-
-func (floydSteinberg) Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point) {
-	clip(dst, &r, src, &sp, nil, nil)
-	if r.Empty() {
-		return
-	}
-	drawPaletted(dst, r, src, sp, true)
-}
-
-// clip clips r against each image's bounds (after translating into the
-// destination image's coordinate space) and shifts the points sp and mp by
-// the same amount as the change in r.Min.
-func clip(dst Image, r *image.Rectangle, src image.Image, sp *image.Point, mask image.Image, mp *image.Point) {
-	orig := r.Min
-	*r = r.Intersect(dst.Bounds())
-	*r = r.Intersect(src.Bounds().Add(orig.Sub(*sp)))
-	if mask != nil {
-		*r = r.Intersect(mask.Bounds().Add(orig.Sub(*mp)))
-	}
-	dx := r.Min.X - orig.X
-	dy := r.Min.Y - orig.Y
-	if dx == 0 && dy == 0 {
-		return
-	}
-	sp.X += dx
-	sp.Y += dy
-	if mp != nil {
-		mp.X += dx
-		mp.Y += dy
-	}
-}
-
-func processBackward(dst Image, r image.Rectangle, src image.Image, sp image.Point) bool {
-	return image.Image(dst) == src &&
-		r.Overlaps(r.Add(sp.Sub(r.Min))) &&
-		(sp.Y < r.Min.Y || (sp.Y == r.Min.Y && sp.X < r.Min.X))
-}
-
-// Draw calls DrawMask with a nil mask.
-func Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point, op Op) {
-	DrawMask(dst, r, src, sp, nil, image.Point{}, op)
-}
-
-// DrawMask aligns r.Min in dst with sp in src and mp in mask and then replaces the rectangle r
-// in dst with the result of a Porter-Duff composition. A nil mask is treated as opaque.
-func DrawMask(dst Image, r image.Rectangle, src image.Image, sp image.Point, mask image.Image, mp image.Point, op Op) {
-	clip(dst, &r, src, &sp, mask, &mp)
-	if r.Empty() {
-		return
-	}
-
-	// Fast paths for special cases. If none of them apply, then we fall back to a general but slow implementation.
-	switch dst0 := dst.(type) {
-	case *image.RGBA:
-		if op == Over {
-			if mask == nil {
-				switch src0 := src.(type) {
-				case *image.Uniform:
-					drawFillOver(dst0, r, src0)
-					return
-				case *image.RGBA:
-					drawCopyOver(dst0, r, src0, sp)
-					return
-				case *image.NRGBA:
-					drawNRGBAOver(dst0, r, src0, sp)
-					return
-				case *image.YCbCr:
-					// An image.YCbCr is always fully opaque, and so if the
-					// mask is nil (i.e. fully opaque) then the op is
-					// effectively always Src. Similarly for image.Gray and
-					// image.CMYK.
-					if imageutil.DrawYCbCr(dst0, r, src0, sp) {
-						return
-					}
-				case *image.Gray:
-					drawGray(dst0, r, src0, sp)
-					return
-				case *image.CMYK:
-					drawCMYK(dst0, r, src0, sp)
-					return
-				}
-			} else if mask0, ok := mask.(*image.Alpha); ok {
-				switch src0 := src.(type) {
-				case *image.Uniform:
-					drawGlyphOver(dst0, r, src0, mask0, mp)
-					return
-				}
-			}
-		} else {
-			if mask == nil {
-				switch src0 := src.(type) {
-				case *image.Uniform:
-					drawFillSrc(dst0, r, src0)
-					return
-				case *image.RGBA:
-					drawCopySrc(dst0, r, src0, sp)
-					return
-				case *image.NRGBA:
-					drawNRGBASrc(dst0, r, src0, sp)
-					return
-				case *image.YCbCr:
-					if imageutil.DrawYCbCr(dst0, r, src0, sp) {
-						return
-					}
-				case *image.Gray:
-					drawGray(dst0, r, src0, sp)
-					return
-				case *image.CMYK:
-					drawCMYK(dst0, r, src0, sp)
-					return
-				}
-			}
-		}
-		drawRGBA(dst0, r, src, sp, mask, mp, op)
-		return
-	case *image.Paletted:
-		if op == Src && mask == nil && !processBackward(dst, r, src, sp) {
-			drawPaletted(dst0, r, src, sp, false)
-			return
-		}
-	}
-
-	x0, x1, dx := r.Min.X, r.Max.X, 1
-	y0, y1, dy := r.Min.Y, r.Max.Y, 1
-	if processBackward(dst, r, src, sp) {
-		x0, x1, dx = x1-1, x0-1, -1
-		y0, y1, dy = y1-1, y0-1, -1
-	}
-
-	var out color.RGBA64
-	sy := sp.Y + y0 - r.Min.Y
-	my := mp.Y + y0 - r.Min.Y
-	for y := y0; y != y1; y, sy, my = y+dy, sy+dy, my+dy {
-		sx := sp.X + x0 - r.Min.X
-		mx := mp.X + x0 - r.Min.X
-		for x := x0; x != x1; x, sx, mx = x+dx, sx+dx, mx+dx {
-			ma := uint32(m)
-			if mask != nil {
-				_, _, _, ma = mask.At(mx, my).RGBA()
-			}
-			switch {
-			case ma == 0:
-				if op == Over {
-					// No-op.
-				} else {
-					dst.Set(x, y, color.Transparent)
-				}
-			case ma == m && op == Src:
-				dst.Set(x, y, src.At(sx, sy))
-			default:
-				sr, sg, sb, sa := src.At(sx, sy).RGBA()
-				if op == Over {
-					dr, dg, db, da := dst.At(x, y).RGBA()
-					a := m - (sa * ma / m)
-					out.R = uint16((dr*a + sr*ma) / m)
-					out.G = uint16((dg*a + sg*ma) / m)
-					out.B = uint16((db*a + sb*ma) / m)
-					out.A = uint16((da*a + sa*ma) / m)
-				} else {
-					out.R = uint16(sr * ma / m)
-					out.G = uint16(sg * ma / m)
-					out.B = uint16(sb * ma / m)
-					out.A = uint16(sa * ma / m)
-				}
-				// The third argument is &out instead of out (and out is
-				// declared outside of the inner loop) to avoid the implicit
-				// conversion to color.Color here allocating memory in the
-				// inner loop if sizeof(color.RGBA64) > sizeof(uintptr).
-				dst.Set(x, y, &out)
-			}
-		}
-	}
-}
-
-func drawFillOver(dst *image.RGBA, r image.Rectangle, src *image.Uniform) {
-	sr, sg, sb, sa := src.RGBA()
-	// The 0x101 is here for the same reason as in drawRGBA.
-	a := (m - sa) * 0x101
-	i0 := dst.PixOffset(r.Min.X, r.Min.Y)
-	i1 := i0 + r.Dx()*4
-	for y := r.Min.Y; y != r.Max.Y; y++ {
-		for i := i0; i < i1; i += 4 {
-			dr := uint32(dst.Pix[i+0])
-			dg := uint32(dst.Pix[i+1])
-			db := uint32(dst.Pix[i+2])
-			da := uint32(dst.Pix[i+3])
-
-			dst.Pix[i+0] = uint8((dr*a/m + sr) >> 8)
-			dst.Pix[i+1] = uint8((dg*a/m + sg) >> 8)
-			dst.Pix[i+2] = uint8((db*a/m + sb) >> 8)
-			dst.Pix[i+3] = uint8((da*a/m + sa) >> 8)
-		}
-		i0 += dst.Stride
-		i1 += dst.Stride
-	}
-}
-
-func drawFillSrc(dst *image.RGBA, r image.Rectangle, src *image.Uniform) {
-	sr, sg, sb, sa := src.RGBA()
-	sr8 := uint8(sr >> 8)
-	sg8 := uint8(sg >> 8)
-	sb8 := uint8(sb >> 8)
-	sa8 := uint8(sa >> 8)
-	// The built-in copy function is faster than a straightforward for loop to fill the destination with
-	// the color, but copy requires a slice source. We therefore use a for loop to fill the first row, and
-	// then use the first row as the slice source for the remaining rows.
-	i0 := dst.PixOffset(r.Min.X, r.Min.Y)
-	i1 := i0 + r.Dx()*4
-	for i := i0; i < i1; i += 4 {
-		dst.Pix[i+0] = sr8
-		dst.Pix[i+1] = sg8
-		dst.Pix[i+2] = sb8
-		dst.Pix[i+3] = sa8
-	}
-	firstRow := dst.Pix[i0:i1]
-	for y := r.Min.Y + 1; y < r.Max.Y; y++ {
-		i0 += dst.Stride
-		i1 += dst.Stride
-		copy(dst.Pix[i0:i1], firstRow)
-	}
-}
-
-func drawCopyOver(dst *image.RGBA, r image.Rectangle, src *image.RGBA, sp image.Point) {
-	dx, dy := r.Dx(), r.Dy()
-	d0 := dst.PixOffset(r.Min.X, r.Min.Y)
-	s0 := src.PixOffset(sp.X, sp.Y)
-	var (
-		ddelta, sdelta int
-		i0, i1, idelta int
-	)
-	if r.Min.Y < sp.Y || r.Min.Y == sp.Y && r.Min.X <= sp.X {
-		ddelta = dst.Stride
-		sdelta = src.Stride
-		i0, i1, idelta = 0, dx*4, +4
-	} else {
-		// If the source start point is higher than the destination start point, or equal height but to the left,
-		// then we compose the rows in right-to-left, bottom-up order instead of left-to-right, top-down.
-		d0 += (dy - 1) * dst.Stride
-		s0 += (dy - 1) * src.Stride
-		ddelta = -dst.Stride
-		sdelta = -src.Stride
-		i0, i1, idelta = (dx-1)*4, -4, -4
-	}
-	for ; dy > 0; dy-- {
-		dpix := dst.Pix[d0:]
-		spix := src.Pix[s0:]
-		for i := i0; i != i1; i += idelta {
-			sr := uint32(spix[i+0]) * 0x101
-			sg := uint32(spix[i+1]) * 0x101
-			sb := uint32(spix[i+2]) * 0x101
-			sa := uint32(spix[i+3]) * 0x101
-
-			dr := uint32(dpix[i+0])
-			dg := uint32(dpix[i+1])
-			db := uint32(dpix[i+2])
-			da := uint32(dpix[i+3])
-
-			// The 0x101 is here for the same reason as in drawRGBA.
-			a := (m - sa) * 0x101
-
-			dpix[i+0] = uint8((dr*a/m + sr) >> 8)
-			dpix[i+1] = uint8((dg*a/m + sg) >> 8)
-			dpix[i+2] = uint8((db*a/m + sb) >> 8)
-			dpix[i+3] = uint8((da*a/m + sa) >> 8)
-		}
-		d0 += ddelta
-		s0 += sdelta
-	}
-}
-
-func drawCopySrc(dst *image.RGBA, r image.Rectangle, src *image.RGBA, sp image.Point) {
-	n, dy := 4*r.Dx(), r.Dy()
-	d0 := dst.PixOffset(r.Min.X, r.Min.Y)
-	s0 := src.PixOffset(sp.X, sp.Y)
-	var ddelta, sdelta int
-	if r.Min.Y <= sp.Y {
-		ddelta = dst.Stride
-		sdelta = src.Stride
-	} else {
-		// If the source start point is higher than the destination start
-		// point, then we compose the rows in bottom-up order instead of
-		// top-down. Unlike the drawCopyOver function, we don't have to check
-		// the x coordinates because the built-in copy function can handle
-		// overlapping slices.
-		d0 += (dy - 1) * dst.Stride
-		s0 += (dy - 1) * src.Stride
-		ddelta = -dst.Stride
-		sdelta = -src.Stride
-	}
-	for ; dy > 0; dy-- {
-		copy(dst.Pix[d0:d0+n], src.Pix[s0:s0+n])
-		d0 += ddelta
-		s0 += sdelta
-	}
-}
-
-func drawNRGBAOver(dst *image.RGBA, r image.Rectangle, src *image.NRGBA, sp image.Point) {
-	i0 := (r.Min.X - dst.Rect.Min.X) * 4
-	i1 := (r.Max.X - dst.Rect.Min.X) * 4
-	si0 := (sp.X - src.Rect.Min.X) * 4
-	yMax := r.Max.Y - dst.Rect.Min.Y
-
-	y := r.Min.Y - dst.Rect.Min.Y
-	sy := sp.Y - src.Rect.Min.Y
-	for ; y != yMax; y, sy = y+1, sy+1 {
-		dpix := dst.Pix[y*dst.Stride:]
-		spix := src.Pix[sy*src.Stride:]
-
-		for i, si := i0, si0; i < i1; i, si = i+4, si+4 {
-			// Convert from non-premultiplied color to pre-multiplied color.
-			sa := uint32(spix[si+3]) * 0x101
-			sr := uint32(spix[si+0]) * sa / 0xff
-			sg := uint32(spix[si+1]) * sa / 0xff
-			sb := uint32(spix[si+2]) * sa / 0xff
-
-			dr := uint32(dpix[i+0])
-			dg := uint32(dpix[i+1])
-			db := uint32(dpix[i+2])
-			da := uint32(dpix[i+3])
-
-			// The 0x101 is here for the same reason as in drawRGBA.
-			a := (m - sa) * 0x101
-
-			dpix[i+0] = uint8((dr*a/m + sr) >> 8)
-			dpix[i+1] = uint8((dg*a/m + sg) >> 8)
-			dpix[i+2] = uint8((db*a/m + sb) >> 8)
-			dpix[i+3] = uint8((da*a/m + sa) >> 8)
-		}
-	}
-}
-
-func drawNRGBASrc(dst *image.RGBA, r image.Rectangle, src *image.NRGBA, sp image.Point) {
-	i0 := (r.Min.X - dst.Rect.Min.X) * 4
-	i1 := (r.Max.X - dst.Rect.Min.X) * 4
-	si0 := (sp.X - src.Rect.Min.X) * 4
-	yMax := r.Max.Y - dst.Rect.Min.Y
-
-	y := r.Min.Y - dst.Rect.Min.Y
-	sy := sp.Y - src.Rect.Min.Y
-	for ; y != yMax; y, sy = y+1, sy+1 {
-		dpix := dst.Pix[y*dst.Stride:]
-		spix := src.Pix[sy*src.Stride:]
-
-		for i, si := i0, si0; i < i1; i, si = i+4, si+4 {
-			// Convert from non-premultiplied color to pre-multiplied color.
-			sa := uint32(spix[si+3]) * 0x101
-			sr := uint32(spix[si+0]) * sa / 0xff
-			sg := uint32(spix[si+1]) * sa / 0xff
-			sb := uint32(spix[si+2]) * sa / 0xff
-
-			dpix[i+0] = uint8(sr >> 8)
-			dpix[i+1] = uint8(sg >> 8)
-			dpix[i+2] = uint8(sb >> 8)
-			dpix[i+3] = uint8(sa >> 8)
-		}
-	}
-}
-
-func drawGray(dst *image.RGBA, r image.Rectangle, src *image.Gray, sp image.Point) {
-	i0 := (r.Min.X - dst.Rect.Min.X) * 4
-	i1 := (r.Max.X - dst.Rect.Min.X) * 4
-	si0 := (sp.X - src.Rect.Min.X) * 1
-	yMax := r.Max.Y - dst.Rect.Min.Y
-
-	y := r.Min.Y - dst.Rect.Min.Y
-	sy := sp.Y - src.Rect.Min.Y
-	for ; y != yMax; y, sy = y+1, sy+1 {
-		dpix := dst.Pix[y*dst.Stride:]
-		spix := src.Pix[sy*src.Stride:]
-
-		for i, si := i0, si0; i < i1; i, si = i+4, si+1 {
-			p := spix[si]
-			dpix[i+0] = p
-			dpix[i+1] = p
-			dpix[i+2] = p
-			dpix[i+3] = 255
-		}
-	}
-}
-
-func drawCMYK(dst *image.RGBA, r image.Rectangle, src *image.CMYK, sp image.Point) {
-	i0 := (r.Min.X - dst.Rect.Min.X) * 4
-	i1 := (r.Max.X - dst.Rect.Min.X) * 4
-	si0 := (sp.X - src.Rect.Min.X) * 4
-	yMax := r.Max.Y - dst.Rect.Min.Y
-
-	y := r.Min.Y - dst.Rect.Min.Y
-	sy := sp.Y - src.Rect.Min.Y
-	for ; y != yMax; y, sy = y+1, sy+1 {
-		dpix := dst.Pix[y*dst.Stride:]
-		spix := src.Pix[sy*src.Stride:]
-
-		for i, si := i0, si0; i < i1; i, si = i+4, si+4 {
-			dpix[i+0], dpix[i+1], dpix[i+2] =
-				color.CMYKToRGB(spix[si+0], spix[si+1], spix[si+2], spix[si+3])
-			dpix[i+3] = 255
-		}
-	}
-}
-
-func drawGlyphOver(dst *image.RGBA, r image.Rectangle, src *image.Uniform, mask *image.Alpha, mp image.Point) {
-	i0 := dst.PixOffset(r.Min.X, r.Min.Y)
-	i1 := i0 + r.Dx()*4
-	mi0 := mask.PixOffset(mp.X, mp.Y)
-	sr, sg, sb, sa := src.RGBA()
-	for y, my := r.Min.Y, mp.Y; y != r.Max.Y; y, my = y+1, my+1 {
-		for i, mi := i0, mi0; i < i1; i, mi = i+4, mi+1 {
-			ma := uint32(mask.Pix[mi])
-			if ma == 0 {
-				continue
-			}
-			ma |= ma << 8
-
-			dr := uint32(dst.Pix[i+0])
-			dg := uint32(dst.Pix[i+1])
-			db := uint32(dst.Pix[i+2])
-			da := uint32(dst.Pix[i+3])
-
-			// The 0x101 is here for the same reason as in drawRGBA.
-			a := (m - (sa * ma / m)) * 0x101
-
-			dst.Pix[i+0] = uint8((dr*a + sr*ma) / m >> 8)
-			dst.Pix[i+1] = uint8((dg*a + sg*ma) / m >> 8)
-			dst.Pix[i+2] = uint8((db*a + sb*ma) / m >> 8)
-			dst.Pix[i+3] = uint8((da*a + sa*ma) / m >> 8)
-		}
-		i0 += dst.Stride
-		i1 += dst.Stride
-		mi0 += mask.Stride
-	}
-}
-
-func drawRGBA(dst *image.RGBA, r image.Rectangle, src image.Image, sp image.Point, mask image.Image, mp image.Point, op Op) {
-	x0, x1, dx := r.Min.X, r.Max.X, 1
-	y0, y1, dy := r.Min.Y, r.Max.Y, 1
-	if image.Image(dst) == src && r.Overlaps(r.Add(sp.Sub(r.Min))) {
-		if sp.Y < r.Min.Y || sp.Y == r.Min.Y && sp.X < r.Min.X {
-			x0, x1, dx = x1-1, x0-1, -1
-			y0, y1, dy = y1-1, y0-1, -1
-		}
-	}
-
-	sy := sp.Y + y0 - r.Min.Y
-	my := mp.Y + y0 - r.Min.Y
-	sx0 := sp.X + x0 - r.Min.X
-	mx0 := mp.X + x0 - r.Min.X
-	sx1 := sx0 + (x1 - x0)
-	i0 := dst.PixOffset(x0, y0)
-	di := dx * 4
-	for y := y0; y != y1; y, sy, my = y+dy, sy+dy, my+dy {
-		for i, sx, mx := i0, sx0, mx0; sx != sx1; i, sx, mx = i+di, sx+dx, mx+dx {
-			ma := uint32(m)
-			if mask != nil {
-				_, _, _, ma = mask.At(mx, my).RGBA()
-			}
-			sr, sg, sb, sa := src.At(sx, sy).RGBA()
-			if op == Over {
-				dr := uint32(dst.Pix[i+0])
-				dg := uint32(dst.Pix[i+1])
-				db := uint32(dst.Pix[i+2])
-				da := uint32(dst.Pix[i+3])
-
-				// dr, dg, db and da are all 8-bit color at the moment, ranging in [0,255].
-				// We work in 16-bit color, and so would normally do:
-				// dr |= dr << 8
-				// and similarly for dg, db and da, but instead we multiply a
-				// (which is a 16-bit color, ranging in [0,65535]) by 0x101.
-				// This yields the same result, but is fewer arithmetic operations.
-				a := (m - (sa * ma / m)) * 0x101
-
-				dst.Pix[i+0] = uint8((dr*a + sr*ma) / m >> 8)
-				dst.Pix[i+1] = uint8((dg*a + sg*ma) / m >> 8)
-				dst.Pix[i+2] = uint8((db*a + sb*ma) / m >> 8)
-				dst.Pix[i+3] = uint8((da*a + sa*ma) / m >> 8)
-
-			} else {
-				dst.Pix[i+0] = uint8(sr * ma / m >> 8)
-				dst.Pix[i+1] = uint8(sg * ma / m >> 8)
-				dst.Pix[i+2] = uint8(sb * ma / m >> 8)
-				dst.Pix[i+3] = uint8(sa * ma / m >> 8)
-			}
-		}
-		i0 += dy * dst.Stride
-	}
-}
-
-// clamp clamps i to the interval [0, 0xffff].
-func clamp(i int32) int32 {
-	if i < 0 {
-		return 0
-	}
-	if i > 0xffff {
-		return 0xffff
-	}
-	return i
-}
-
-// sqDiff returns the squared-difference of x and y, shifted by 2 so that
-// adding four of those won't overflow a uint32.
-//
-// x and y are both assumed to be in the range [0, 0xffff].
-func sqDiff(x, y int32) uint32 {
-	var d uint32
-	if x > y {
-		d = uint32(x - y)
-	} else {
-		d = uint32(y - x)
-	}
-	return (d * d) >> 2
-}
-
-func drawPaletted(dst Image, r image.Rectangle, src image.Image, sp image.Point, floydSteinberg bool) {
-	// TODO(nigeltao): handle the case where the dst and src overlap.
-	// Does it even make sense to try and do Floyd-Steinberg whilst
-	// walking the image backward (right-to-left bottom-to-top)?
-
-	// If dst is an *image.Paletted, we have a fast path for dst.Set and
-	// dst.At. The dst.Set equivalent is a batch version of the algorithm
-	// used by color.Palette's Index method in image/color/color.go, plus
-	// optional Floyd-Steinberg error diffusion.
-	palette, pix, stride := [][4]int32(nil), []byte(nil), 0
-	if p, ok := dst.(*image.Paletted); ok {
-		palette = make([][4]int32, len(p.Palette))
-		for i, col := range p.Palette {
-			r, g, b, a := col.RGBA()
-			palette[i][0] = int32(r)
-			palette[i][1] = int32(g)
-			palette[i][2] = int32(b)
-			palette[i][3] = int32(a)
-		}
-		pix, stride = p.Pix[p.PixOffset(r.Min.X, r.Min.Y):], p.Stride
-	}
-
-	// quantErrorCurr and quantErrorNext are the Floyd-Steinberg quantization
-	// errors that have been propagated to the pixels in the current and next
-	// rows. The +2 simplifies calculation near the edges.
-	var quantErrorCurr, quantErrorNext [][4]int32
-	if floydSteinberg {
-		quantErrorCurr = make([][4]int32, r.Dx()+2)
-		quantErrorNext = make([][4]int32, r.Dx()+2)
-	}
-
-	// Loop over each source pixel.
-	out := color.RGBA64{A: 0xffff}
-	for y := 0; y != r.Dy(); y++ {
-		for x := 0; x != r.Dx(); x++ {
-			// er, eg and eb are the pixel's R,G,B values plus the
-			// optional Floyd-Steinberg error.
-			sr, sg, sb, sa := src.At(sp.X+x, sp.Y+y).RGBA()
-			er, eg, eb, ea := int32(sr), int32(sg), int32(sb), int32(sa)
-			if floydSteinberg {
-				er = clamp(er + quantErrorCurr[x+1][0]/16)
-				eg = clamp(eg + quantErrorCurr[x+1][1]/16)
-				eb = clamp(eb + quantErrorCurr[x+1][2]/16)
-				ea = clamp(ea + quantErrorCurr[x+1][3]/16)
-			}
-
-			if palette != nil {
-				// Find the closest palette color in Euclidean R,G,B,A space:
-				// the one that minimizes sum-squared-difference.
-				// TODO(nigeltao): consider smarter algorithms.
-				bestIndex, bestSum := 0, uint32(1<<32-1)
-				for index, p := range palette {
-					sum := sqDiff(er, p[0]) + sqDiff(eg, p[1]) + sqDiff(eb, p[2]) + sqDiff(ea, p[3])
-					if sum < bestSum {
-						bestIndex, bestSum = index, sum
-						if sum == 0 {
-							break
-						}
-					}
-				}
-				pix[y*stride+x] = byte(bestIndex)
-
-				if !floydSteinberg {
-					continue
-				}
-				er -= int32(palette[bestIndex][0])
-				eg -= int32(palette[bestIndex][1])
-				eb -= int32(palette[bestIndex][2])
-				ea -= int32(palette[bestIndex][3])
-
-			} else {
-				out.R = uint16(er)
-				out.G = uint16(eg)
-				out.B = uint16(eb)
-				out.A = uint16(ea)
-				// The third argument is &out instead of out (and out is
-				// declared outside of the inner loop) to avoid the implicit
-				// conversion to color.Color here allocating memory in the
-				// inner loop if sizeof(color.RGBA64) > sizeof(uintptr).
-				dst.Set(r.Min.X+x, r.Min.Y+y, &out)
-
-				if !floydSteinberg {
-					continue
-				}
-				sr, sg, sb, sa = dst.At(r.Min.X+x, r.Min.Y+y).RGBA()
-				er -= int32(sr)
-				eg -= int32(sg)
-				eb -= int32(sb)
-				ea -= int32(sa)
-			}
-
-			// Propagate the Floyd-Steinberg quantization error.
-			quantErrorNext[x+0][0] += er * 3
-			quantErrorNext[x+0][1] += eg * 3
-			quantErrorNext[x+0][2] += eb * 3
-			quantErrorNext[x+0][3] += ea * 3
-			quantErrorNext[x+1][0] += er * 5
-			quantErrorNext[x+1][1] += eg * 5
-			quantErrorNext[x+1][2] += eb * 5
-			quantErrorNext[x+1][3] += ea * 5
-			quantErrorNext[x+2][0] += er * 1
-			quantErrorNext[x+2][1] += eg * 1
-			quantErrorNext[x+2][2] += eb * 1
-			quantErrorNext[x+2][3] += ea * 1
-			quantErrorCurr[x+2][0] += er * 7
-			quantErrorCurr[x+2][1] += eg * 7
-			quantErrorCurr[x+2][2] += eb * 7
-			quantErrorCurr[x+2][3] += ea * 7
-		}
-
-		// Recycle the quantization error buffers.
-		if floydSteinberg {
-			quantErrorCurr, quantErrorNext = quantErrorNext, quantErrorCurr
-			for i := range quantErrorNext {
-				quantErrorNext[i] = [4]int32{}
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/draw/draw_test.go b/third_party/gofrontend/libgo/go/image/draw/draw_test.go
deleted file mode 100644
index a58f0f4..0000000
--- a/third_party/gofrontend/libgo/go/image/draw/draw_test.go
+++ /dev/null
@@ -1,469 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package draw
-
-import (
-	"image"
-	"image/color"
-	"image/png"
-	"os"
-	"testing"
-)
-
-func eq(c0, c1 color.Color) bool {
-	r0, g0, b0, a0 := c0.RGBA()
-	r1, g1, b1, a1 := c1.RGBA()
-	return r0 == r1 && g0 == g1 && b0 == b1 && a0 == a1
-}
-
-func fillBlue(alpha int) image.Image {
-	return image.NewUniform(color.RGBA{0, 0, uint8(alpha), uint8(alpha)})
-}
-
-func fillAlpha(alpha int) image.Image {
-	return image.NewUniform(color.Alpha{uint8(alpha)})
-}
-
-func vgradGreen(alpha int) image.Image {
-	m := image.NewRGBA(image.Rect(0, 0, 16, 16))
-	for y := 0; y < 16; y++ {
-		for x := 0; x < 16; x++ {
-			m.Set(x, y, color.RGBA{0, uint8(y * alpha / 15), 0, uint8(alpha)})
-		}
-	}
-	return m
-}
-
-func vgradAlpha(alpha int) image.Image {
-	m := image.NewAlpha(image.Rect(0, 0, 16, 16))
-	for y := 0; y < 16; y++ {
-		for x := 0; x < 16; x++ {
-			m.Set(x, y, color.Alpha{uint8(y * alpha / 15)})
-		}
-	}
-	return m
-}
-
-func vgradGreenNRGBA(alpha int) image.Image {
-	m := image.NewNRGBA(image.Rect(0, 0, 16, 16))
-	for y := 0; y < 16; y++ {
-		for x := 0; x < 16; x++ {
-			m.Set(x, y, color.RGBA{0, uint8(y * 0x11), 0, uint8(alpha)})
-		}
-	}
-	return m
-}
-
-func vgradCr() image.Image {
-	m := &image.YCbCr{
-		Y:              make([]byte, 16*16),
-		Cb:             make([]byte, 16*16),
-		Cr:             make([]byte, 16*16),
-		YStride:        16,
-		CStride:        16,
-		SubsampleRatio: image.YCbCrSubsampleRatio444,
-		Rect:           image.Rect(0, 0, 16, 16),
-	}
-	for y := 0; y < 16; y++ {
-		for x := 0; x < 16; x++ {
-			m.Cr[y*m.CStride+x] = uint8(y * 0x11)
-		}
-	}
-	return m
-}
-
-func vgradGray() image.Image {
-	m := image.NewGray(image.Rect(0, 0, 16, 16))
-	for y := 0; y < 16; y++ {
-		for x := 0; x < 16; x++ {
-			m.Set(x, y, color.Gray{uint8(y * 0x11)})
-		}
-	}
-	return m
-}
-
-func vgradMagenta() image.Image {
-	m := image.NewCMYK(image.Rect(0, 0, 16, 16))
-	for y := 0; y < 16; y++ {
-		for x := 0; x < 16; x++ {
-			m.Set(x, y, color.CMYK{0, uint8(y * 0x11), 0, 0x3f})
-		}
-	}
-	return m
-}
-
-func hgradRed(alpha int) Image {
-	m := image.NewRGBA(image.Rect(0, 0, 16, 16))
-	for y := 0; y < 16; y++ {
-		for x := 0; x < 16; x++ {
-			m.Set(x, y, color.RGBA{uint8(x * alpha / 15), 0, 0, uint8(alpha)})
-		}
-	}
-	return m
-}
-
-func gradYellow(alpha int) Image {
-	m := image.NewRGBA(image.Rect(0, 0, 16, 16))
-	for y := 0; y < 16; y++ {
-		for x := 0; x < 16; x++ {
-			m.Set(x, y, color.RGBA{uint8(x * alpha / 15), uint8(y * alpha / 15), 0, uint8(alpha)})
-		}
-	}
-	return m
-}
-
-type drawTest struct {
-	desc     string
-	src      image.Image
-	mask     image.Image
-	op       Op
-	expected color.Color
-}
-
-var drawTests = []drawTest{
-	// Uniform mask (0% opaque).
-	{"nop", vgradGreen(255), fillAlpha(0), Over, color.RGBA{136, 0, 0, 255}},
-	{"clear", vgradGreen(255), fillAlpha(0), Src, color.RGBA{0, 0, 0, 0}},
-	// Uniform mask (100%, 75%, nil) and uniform source.
-	// At (x, y) == (8, 8):
-	// The destination pixel is {136, 0, 0, 255}.
-	// The source pixel is {0, 0, 90, 90}.
-	{"fill", fillBlue(90), fillAlpha(255), Over, color.RGBA{88, 0, 90, 255}},
-	{"fillSrc", fillBlue(90), fillAlpha(255), Src, color.RGBA{0, 0, 90, 90}},
-	{"fillAlpha", fillBlue(90), fillAlpha(192), Over, color.RGBA{100, 0, 68, 255}},
-	{"fillAlphaSrc", fillBlue(90), fillAlpha(192), Src, color.RGBA{0, 0, 68, 68}},
-	{"fillNil", fillBlue(90), nil, Over, color.RGBA{88, 0, 90, 255}},
-	{"fillNilSrc", fillBlue(90), nil, Src, color.RGBA{0, 0, 90, 90}},
-	// Uniform mask (100%, 75%, nil) and variable source.
-	// At (x, y) == (8, 8):
-	// The destination pixel is {136, 0, 0, 255}.
-	// The source pixel is {0, 48, 0, 90}.
-	{"copy", vgradGreen(90), fillAlpha(255), Over, color.RGBA{88, 48, 0, 255}},
-	{"copySrc", vgradGreen(90), fillAlpha(255), Src, color.RGBA{0, 48, 0, 90}},
-	{"copyAlpha", vgradGreen(90), fillAlpha(192), Over, color.RGBA{100, 36, 0, 255}},
-	{"copyAlphaSrc", vgradGreen(90), fillAlpha(192), Src, color.RGBA{0, 36, 0, 68}},
-	{"copyNil", vgradGreen(90), nil, Over, color.RGBA{88, 48, 0, 255}},
-	{"copyNilSrc", vgradGreen(90), nil, Src, color.RGBA{0, 48, 0, 90}},
-	// Uniform mask (100%, 75%, nil) and variable NRGBA source.
-	// At (x, y) == (8, 8):
-	// The destination pixel is {136, 0, 0, 255}.
-	// The source pixel is {0, 136, 0, 90} in NRGBA-space, which is {0, 48, 0, 90} in RGBA-space.
-	// The result pixel is different than in the "copy*" test cases because of rounding errors.
-	{"nrgba", vgradGreenNRGBA(90), fillAlpha(255), Over, color.RGBA{88, 46, 0, 255}},
-	{"nrgbaSrc", vgradGreenNRGBA(90), fillAlpha(255), Src, color.RGBA{0, 46, 0, 90}},
-	{"nrgbaAlpha", vgradGreenNRGBA(90), fillAlpha(192), Over, color.RGBA{100, 34, 0, 255}},
-	{"nrgbaAlphaSrc", vgradGreenNRGBA(90), fillAlpha(192), Src, color.RGBA{0, 34, 0, 68}},
-	{"nrgbaNil", vgradGreenNRGBA(90), nil, Over, color.RGBA{88, 46, 0, 255}},
-	{"nrgbaNilSrc", vgradGreenNRGBA(90), nil, Src, color.RGBA{0, 46, 0, 90}},
-	// Uniform mask (100%, 75%, nil) and variable YCbCr source.
-	// At (x, y) == (8, 8):
-	// The destination pixel is {136, 0, 0, 255}.
-	// The source pixel is {0, 0, 136} in YCbCr-space, which is {11, 38, 0, 255} in RGB-space.
-	{"ycbcr", vgradCr(), fillAlpha(255), Over, color.RGBA{11, 38, 0, 255}},
-	{"ycbcrSrc", vgradCr(), fillAlpha(255), Src, color.RGBA{11, 38, 0, 255}},
-	{"ycbcrAlpha", vgradCr(), fillAlpha(192), Over, color.RGBA{42, 28, 0, 255}},
-	{"ycbcrAlphaSrc", vgradCr(), fillAlpha(192), Src, color.RGBA{8, 28, 0, 192}},
-	{"ycbcrNil", vgradCr(), nil, Over, color.RGBA{11, 38, 0, 255}},
-	{"ycbcrNilSrc", vgradCr(), nil, Src, color.RGBA{11, 38, 0, 255}},
-	// Uniform mask (100%, 75%, nil) and variable Gray source.
-	// At (x, y) == (8, 8):
-	// The destination pixel is {136, 0, 0, 255}.
-	// The source pixel is {136} in Gray-space, which is {136, 136, 136, 255} in RGBA-space.
-	{"gray", vgradGray(), fillAlpha(255), Over, color.RGBA{136, 136, 136, 255}},
-	{"graySrc", vgradGray(), fillAlpha(255), Src, color.RGBA{136, 136, 136, 255}},
-	{"grayAlpha", vgradGray(), fillAlpha(192), Over, color.RGBA{136, 102, 102, 255}},
-	{"grayAlphaSrc", vgradGray(), fillAlpha(192), Src, color.RGBA{102, 102, 102, 192}},
-	{"grayNil", vgradGray(), nil, Over, color.RGBA{136, 136, 136, 255}},
-	{"grayNilSrc", vgradGray(), nil, Src, color.RGBA{136, 136, 136, 255}},
-	// Uniform mask (100%, 75%, nil) and variable CMYK source.
-	// At (x, y) == (8, 8):
-	// The destination pixel is {136, 0, 0, 255}.
-	// The source pixel is {0, 136, 0, 63} in CMYK-space, which is {192, 89, 192} in RGB-space.
-	{"cmyk", vgradMagenta(), fillAlpha(255), Over, color.RGBA{192, 89, 192, 255}},
-	{"cmykSrc", vgradMagenta(), fillAlpha(255), Src, color.RGBA{192, 89, 192, 255}},
-	{"cmykAlpha", vgradMagenta(), fillAlpha(192), Over, color.RGBA{178, 67, 145, 255}},
-	{"cmykAlphaSrc", vgradMagenta(), fillAlpha(192), Src, color.RGBA{145, 67, 145, 192}},
-	{"cmykNil", vgradMagenta(), nil, Over, color.RGBA{192, 89, 192, 255}},
-	{"cmykNilSrc", vgradMagenta(), nil, Src, color.RGBA{192, 89, 192, 255}},
-	// Variable mask and variable source.
-	// At (x, y) == (8, 8):
-	// The destination pixel is {136, 0, 0, 255}.
-	// The source pixel is {0, 0, 255, 255}.
-	// The mask pixel's alpha is 102, or 40%.
-	{"generic", fillBlue(255), vgradAlpha(192), Over, color.RGBA{81, 0, 102, 255}},
-	{"genericSrc", fillBlue(255), vgradAlpha(192), Src, color.RGBA{0, 0, 102, 102}},
-}
-
-func makeGolden(dst image.Image, r image.Rectangle, src image.Image, sp image.Point, mask image.Image, mp image.Point, op Op) image.Image {
-	// Since golden is a newly allocated image, we don't have to check if the
-	// input source and mask images and the output golden image overlap.
-	b := dst.Bounds()
-	sb := src.Bounds()
-	mb := image.Rect(-1e9, -1e9, 1e9, 1e9)
-	if mask != nil {
-		mb = mask.Bounds()
-	}
-	golden := image.NewRGBA(image.Rect(0, 0, b.Max.X, b.Max.Y))
-	for y := r.Min.Y; y < r.Max.Y; y++ {
-		sy := y + sp.Y - r.Min.Y
-		my := y + mp.Y - r.Min.Y
-		for x := r.Min.X; x < r.Max.X; x++ {
-			if !(image.Pt(x, y).In(b)) {
-				continue
-			}
-			sx := x + sp.X - r.Min.X
-			if !(image.Pt(sx, sy).In(sb)) {
-				continue
-			}
-			mx := x + mp.X - r.Min.X
-			if !(image.Pt(mx, my).In(mb)) {
-				continue
-			}
-
-			const M = 1<<16 - 1
-			var dr, dg, db, da uint32
-			if op == Over {
-				dr, dg, db, da = dst.At(x, y).RGBA()
-			}
-			sr, sg, sb, sa := src.At(sx, sy).RGBA()
-			ma := uint32(M)
-			if mask != nil {
-				_, _, _, ma = mask.At(mx, my).RGBA()
-			}
-			a := M - (sa * ma / M)
-			golden.Set(x, y, color.RGBA64{
-				uint16((dr*a + sr*ma) / M),
-				uint16((dg*a + sg*ma) / M),
-				uint16((db*a + sb*ma) / M),
-				uint16((da*a + sa*ma) / M),
-			})
-		}
-	}
-	return golden.SubImage(b)
-}
-
-func TestDraw(t *testing.T) {
-	rr := []image.Rectangle{
-		image.Rect(0, 0, 0, 0),
-		image.Rect(0, 0, 16, 16),
-		image.Rect(3, 5, 12, 10),
-		image.Rect(0, 0, 9, 9),
-		image.Rect(8, 8, 16, 16),
-		image.Rect(8, 0, 9, 16),
-		image.Rect(0, 8, 16, 9),
-		image.Rect(8, 8, 9, 9),
-		image.Rect(8, 8, 8, 8),
-	}
-	for _, r := range rr {
-	loop:
-		for _, test := range drawTests {
-			dst := hgradRed(255).(*image.RGBA).SubImage(r).(Image)
-			// Draw the (src, mask, op) onto a copy of dst using a slow but obviously correct implementation.
-			golden := makeGolden(dst, image.Rect(0, 0, 16, 16), test.src, image.ZP, test.mask, image.ZP, test.op)
-			b := dst.Bounds()
-			if !b.Eq(golden.Bounds()) {
-				t.Errorf("draw %v %s: bounds %v versus %v", r, test.desc, dst.Bounds(), golden.Bounds())
-				continue
-			}
-			// Draw the same combination onto the actual dst using the optimized DrawMask implementation.
-			DrawMask(dst, image.Rect(0, 0, 16, 16), test.src, image.ZP, test.mask, image.ZP, test.op)
-			if image.Pt(8, 8).In(r) {
-				// Check that the resultant pixel at (8, 8) matches what we expect
-				// (the expected value can be verified by hand).
-				if !eq(dst.At(8, 8), test.expected) {
-					t.Errorf("draw %v %s: at (8, 8) %v versus %v", r, test.desc, dst.At(8, 8), test.expected)
-					continue
-				}
-			}
-			// Check that the resultant dst image matches the golden output.
-			for y := b.Min.Y; y < b.Max.Y; y++ {
-				for x := b.Min.X; x < b.Max.X; x++ {
-					if !eq(dst.At(x, y), golden.At(x, y)) {
-						t.Errorf("draw %v %s: at (%d, %d), %v versus golden %v", r, test.desc, x, y, dst.At(x, y), golden.At(x, y))
-						continue loop
-					}
-				}
-			}
-		}
-	}
-}
-
-func TestDrawOverlap(t *testing.T) {
-	for _, op := range []Op{Over, Src} {
-		for yoff := -2; yoff <= 2; yoff++ {
-		loop:
-			for xoff := -2; xoff <= 2; xoff++ {
-				m := gradYellow(127).(*image.RGBA)
-				dst := m.SubImage(image.Rect(5, 5, 10, 10)).(*image.RGBA)
-				src := m.SubImage(image.Rect(5+xoff, 5+yoff, 10+xoff, 10+yoff)).(*image.RGBA)
-				b := dst.Bounds()
-				// Draw the (src, mask, op) onto a copy of dst using a slow but obviously correct implementation.
-				golden := makeGolden(dst, b, src, src.Bounds().Min, nil, image.ZP, op)
-				if !b.Eq(golden.Bounds()) {
-					t.Errorf("drawOverlap xoff=%d,yoff=%d: bounds %v versus %v", xoff, yoff, dst.Bounds(), golden.Bounds())
-					continue
-				}
-				// Draw the same combination onto the actual dst using the optimized DrawMask implementation.
-				DrawMask(dst, b, src, src.Bounds().Min, nil, image.ZP, op)
-				// Check that the resultant dst image matches the golden output.
-				for y := b.Min.Y; y < b.Max.Y; y++ {
-					for x := b.Min.X; x < b.Max.X; x++ {
-						if !eq(dst.At(x, y), golden.At(x, y)) {
-							t.Errorf("drawOverlap xoff=%d,yoff=%d: at (%d, %d), %v versus golden %v", xoff, yoff, x, y, dst.At(x, y), golden.At(x, y))
-							continue loop
-						}
-					}
-				}
-			}
-		}
-	}
-}
-
-// TestNonZeroSrcPt checks drawing with a non-zero src point parameter.
-func TestNonZeroSrcPt(t *testing.T) {
-	a := image.NewRGBA(image.Rect(0, 0, 1, 1))
-	b := image.NewRGBA(image.Rect(0, 0, 2, 2))
-	b.Set(0, 0, color.RGBA{0, 0, 0, 5})
-	b.Set(1, 0, color.RGBA{0, 0, 5, 5})
-	b.Set(0, 1, color.RGBA{0, 5, 0, 5})
-	b.Set(1, 1, color.RGBA{5, 0, 0, 5})
-	Draw(a, image.Rect(0, 0, 1, 1), b, image.Pt(1, 1), Over)
-	if !eq(color.RGBA{5, 0, 0, 5}, a.At(0, 0)) {
-		t.Errorf("non-zero src pt: want %v got %v", color.RGBA{5, 0, 0, 5}, a.At(0, 0))
-	}
-}
-
-func TestFill(t *testing.T) {
-	rr := []image.Rectangle{
-		image.Rect(0, 0, 0, 0),
-		image.Rect(0, 0, 40, 30),
-		image.Rect(10, 0, 40, 30),
-		image.Rect(0, 20, 40, 30),
-		image.Rect(10, 20, 40, 30),
-		image.Rect(10, 20, 15, 25),
-		image.Rect(10, 0, 35, 30),
-		image.Rect(0, 15, 40, 16),
-		image.Rect(24, 24, 25, 25),
-		image.Rect(23, 23, 26, 26),
-		image.Rect(22, 22, 27, 27),
-		image.Rect(21, 21, 28, 28),
-		image.Rect(20, 20, 29, 29),
-	}
-	for _, r := range rr {
-		m := image.NewRGBA(image.Rect(0, 0, 40, 30)).SubImage(r).(*image.RGBA)
-		b := m.Bounds()
-		c := color.RGBA{11, 0, 0, 255}
-		src := &image.Uniform{C: c}
-		check := func(desc string) {
-			for y := b.Min.Y; y < b.Max.Y; y++ {
-				for x := b.Min.X; x < b.Max.X; x++ {
-					if !eq(c, m.At(x, y)) {
-						t.Errorf("%s fill: at (%d, %d), sub-image bounds=%v: want %v got %v", desc, x, y, r, c, m.At(x, y))
-						return
-					}
-				}
-			}
-		}
-		// Draw 1 pixel at a time.
-		for y := b.Min.Y; y < b.Max.Y; y++ {
-			for x := b.Min.X; x < b.Max.X; x++ {
-				DrawMask(m, image.Rect(x, y, x+1, y+1), src, image.ZP, nil, image.ZP, Src)
-			}
-		}
-		check("pixel")
-		// Draw 1 row at a time.
-		c = color.RGBA{0, 22, 0, 255}
-		src = &image.Uniform{C: c}
-		for y := b.Min.Y; y < b.Max.Y; y++ {
-			DrawMask(m, image.Rect(b.Min.X, y, b.Max.X, y+1), src, image.ZP, nil, image.ZP, Src)
-		}
-		check("row")
-		// Draw 1 column at a time.
-		c = color.RGBA{0, 0, 33, 255}
-		src = &image.Uniform{C: c}
-		for x := b.Min.X; x < b.Max.X; x++ {
-			DrawMask(m, image.Rect(x, b.Min.Y, x+1, b.Max.Y), src, image.ZP, nil, image.ZP, Src)
-		}
-		check("column")
-		// Draw the whole image at once.
-		c = color.RGBA{44, 55, 66, 77}
-		src = &image.Uniform{C: c}
-		DrawMask(m, b, src, image.ZP, nil, image.ZP, Src)
-		check("whole")
-	}
-}
-
-// TestFloydSteinbergCheckerboard tests that the result of Floyd-Steinberg
-// error diffusion of a uniform 50% gray source image with a black-and-white
-// palette is a checkerboard pattern.
-func TestFloydSteinbergCheckerboard(t *testing.T) {
-	b := image.Rect(0, 0, 640, 480)
-	// We can't represent 50% exactly, but 0x7fff / 0xffff is close enough.
-	src := &image.Uniform{color.Gray16{0x7fff}}
-	dst := image.NewPaletted(b, color.Palette{color.Black, color.White})
-	FloydSteinberg.Draw(dst, b, src, image.Point{})
-	nErr := 0
-	for y := b.Min.Y; y < b.Max.Y; y++ {
-		for x := b.Min.X; x < b.Max.X; x++ {
-			got := dst.Pix[dst.PixOffset(x, y)]
-			want := uint8(x+y) % 2
-			if got != want {
-				t.Errorf("at (%d, %d): got %d, want %d", x, y, got, want)
-				if nErr++; nErr == 10 {
-					t.Fatal("there may be more errors")
-				}
-			}
-		}
-	}
-}
-
-// embeddedPaletted is an Image that behaves like an *image.Paletted but whose
-// type is not *image.Paletted.
-type embeddedPaletted struct {
-	*image.Paletted
-}
-
-// TestPaletted tests that the drawPaletted function behaves the same
-// regardless of whether dst is an *image.Paletted.
-func TestPaletted(t *testing.T) {
-	f, err := os.Open("../testdata/video-001.png")
-	if err != nil {
-		t.Fatalf("open: %v", err)
-	}
-	defer f.Close()
-	src, err := png.Decode(f)
-	if err != nil {
-		t.Fatalf("decode: %v", err)
-	}
-	b := src.Bounds()
-
-	cgaPalette := color.Palette{
-		color.RGBA{0x00, 0x00, 0x00, 0xff},
-		color.RGBA{0x55, 0xff, 0xff, 0xff},
-		color.RGBA{0xff, 0x55, 0xff, 0xff},
-		color.RGBA{0xff, 0xff, 0xff, 0xff},
-	}
-	drawers := map[string]Drawer{
-		"src":             Src,
-		"floyd-steinberg": FloydSteinberg,
-	}
-
-loop:
-	for dName, d := range drawers {
-		dst0 := image.NewPaletted(b, cgaPalette)
-		dst1 := image.NewPaletted(b, cgaPalette)
-		d.Draw(dst0, b, src, image.Point{})
-		d.Draw(embeddedPaletted{dst1}, b, src, image.Point{})
-		for y := b.Min.Y; y < b.Max.Y; y++ {
-			for x := b.Min.X; x < b.Max.X; x++ {
-				if !eq(dst0.At(x, y), dst1.At(x, y)) {
-					t.Errorf("%s: at (%d, %d), %v versus %v",
-						dName, x, y, dst0.At(x, y), dst1.At(x, y))
-					continue loop
-				}
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/format.go b/third_party/gofrontend/libgo/go/image/format.go
deleted file mode 100644
index 3668de4..0000000
--- a/third_party/gofrontend/libgo/go/image/format.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package image
-
-import (
-	"bufio"
-	"errors"
-	"io"
-)
-
-// ErrFormat indicates that decoding encountered an unknown format.
-var ErrFormat = errors.New("image: unknown format")
-
-// A format holds an image format's name, magic header and how to decode it.
-type format struct {
-	name, magic  string
-	decode       func(io.Reader) (Image, error)
-	decodeConfig func(io.Reader) (Config, error)
-}
-
-// Formats is the list of registered formats.
-var formats []format
-
-// RegisterFormat registers an image format for use by Decode.
-// Name is the name of the format, like "jpeg" or "png".
-// Magic is the magic prefix that identifies the format's encoding. The magic
-// string can contain "?" wildcards that each match any one byte.
-// Decode is the function that decodes the encoded image.
-// DecodeConfig is the function that decodes just its configuration.
-func RegisterFormat(name, magic string, decode func(io.Reader) (Image, error), decodeConfig func(io.Reader) (Config, error)) {
-	formats = append(formats, format{name, magic, decode, decodeConfig})
-}
-
-// A reader is an io.Reader that can also peek ahead.
-type reader interface {
-	io.Reader
-	Peek(int) ([]byte, error)
-}
-
-// asReader converts an io.Reader to a reader.
-func asReader(r io.Reader) reader {
-	if rr, ok := r.(reader); ok {
-		return rr
-	}
-	return bufio.NewReader(r)
-}
-
-// Match reports whether magic matches b. Magic may contain "?" wildcards.
-func match(magic string, b []byte) bool {
-	if len(magic) != len(b) {
-		return false
-	}
-	for i, c := range b {
-		if magic[i] != c && magic[i] != '?' {
-			return false
-		}
-	}
-	return true
-}
-
-// Sniff determines the format of r's data.
-func sniff(r reader) format {
-	for _, f := range formats {
-		b, err := r.Peek(len(f.magic))
-		if err == nil && match(f.magic, b) {
-			return f
-		}
-	}
-	return format{}
-}
-
-// Decode decodes an image that has been encoded in a registered format.
-// The string returned is the format name used during format registration.
-// Format registration is typically done by an init function in the codec-
-// specific package.
-func Decode(r io.Reader) (Image, string, error) {
-	rr := asReader(r)
-	f := sniff(rr)
-	if f.decode == nil {
-		return nil, "", ErrFormat
-	}
-	m, err := f.decode(rr)
-	return m, f.name, err
-}
-
-// DecodeConfig decodes the color model and dimensions of an image that has
-// been encoded in a registered format. The string returned is the format name
-// used during format registration. Format registration is typically done by
-// an init function in the codec-specific package.
-func DecodeConfig(r io.Reader) (Config, string, error) {
-	rr := asReader(r)
-	f := sniff(rr)
-	if f.decodeConfig == nil {
-		return Config{}, "", ErrFormat
-	}
-	c, err := f.decodeConfig(rr)
-	return c, f.name, err
-}
diff --git a/third_party/gofrontend/libgo/go/image/geom.go b/third_party/gofrontend/libgo/go/image/geom.go
deleted file mode 100644
index e1cd4dc..0000000
--- a/third_party/gofrontend/libgo/go/image/geom.go
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package image
-
-import (
-	"image/color"
-	"strconv"
-)
-
-// A Point is an X, Y coordinate pair. The axes increase right and down.
-type Point struct {
-	X, Y int
-}
-
-// String returns a string representation of p like "(3,4)".
-func (p Point) String() string {
-	return "(" + strconv.Itoa(p.X) + "," + strconv.Itoa(p.Y) + ")"
-}
-
-// Add returns the vector p+q.
-func (p Point) Add(q Point) Point {
-	return Point{p.X + q.X, p.Y + q.Y}
-}
-
-// Sub returns the vector p-q.
-func (p Point) Sub(q Point) Point {
-	return Point{p.X - q.X, p.Y - q.Y}
-}
-
-// Mul returns the vector p*k.
-func (p Point) Mul(k int) Point {
-	return Point{p.X * k, p.Y * k}
-}
-
-// Div returns the vector p/k.
-func (p Point) Div(k int) Point {
-	return Point{p.X / k, p.Y / k}
-}
-
-// In reports whether p is in r.
-func (p Point) In(r Rectangle) bool {
-	return r.Min.X <= p.X && p.X < r.Max.X &&
-		r.Min.Y <= p.Y && p.Y < r.Max.Y
-}
-
-// Mod returns the point q in r such that p.X-q.X is a multiple of r's width
-// and p.Y-q.Y is a multiple of r's height.
-func (p Point) Mod(r Rectangle) Point {
-	w, h := r.Dx(), r.Dy()
-	p = p.Sub(r.Min)
-	p.X = p.X % w
-	if p.X < 0 {
-		p.X += w
-	}
-	p.Y = p.Y % h
-	if p.Y < 0 {
-		p.Y += h
-	}
-	return p.Add(r.Min)
-}
-
-// Eq reports whether p and q are equal.
-func (p Point) Eq(q Point) bool {
-	return p == q
-}
-
-// ZP is the zero Point.
-var ZP Point
-
-// Pt is shorthand for Point{X, Y}.
-func Pt(X, Y int) Point {
-	return Point{X, Y}
-}
-
-// A Rectangle contains the points with Min.X <= X < Max.X, Min.Y <= Y < Max.Y.
-// It is well-formed if Min.X <= Max.X and likewise for Y. Points are always
-// well-formed. A rectangle's methods always return well-formed outputs for
-// well-formed inputs.
-//
-// A Rectangle is also an Image whose bounds are the rectangle itself. At
-// returns color.Opaque for points in the rectangle and color.Transparent
-// otherwise.
-type Rectangle struct {
-	Min, Max Point
-}
-
-// String returns a string representation of r like "(3,4)-(6,5)".
-func (r Rectangle) String() string {
-	return r.Min.String() + "-" + r.Max.String()
-}
-
-// Dx returns r's width.
-func (r Rectangle) Dx() int {
-	return r.Max.X - r.Min.X
-}
-
-// Dy returns r's height.
-func (r Rectangle) Dy() int {
-	return r.Max.Y - r.Min.Y
-}
-
-// Size returns r's width and height.
-func (r Rectangle) Size() Point {
-	return Point{
-		r.Max.X - r.Min.X,
-		r.Max.Y - r.Min.Y,
-	}
-}
-
-// Add returns the rectangle r translated by p.
-func (r Rectangle) Add(p Point) Rectangle {
-	return Rectangle{
-		Point{r.Min.X + p.X, r.Min.Y + p.Y},
-		Point{r.Max.X + p.X, r.Max.Y + p.Y},
-	}
-}
-
-// Sub returns the rectangle r translated by -p.
-func (r Rectangle) Sub(p Point) Rectangle {
-	return Rectangle{
-		Point{r.Min.X - p.X, r.Min.Y - p.Y},
-		Point{r.Max.X - p.X, r.Max.Y - p.Y},
-	}
-}
-
-// Inset returns the rectangle r inset by n, which may be negative. If either
-// of r's dimensions is less than 2*n then an empty rectangle near the center
-// of r will be returned.
-func (r Rectangle) Inset(n int) Rectangle {
-	if r.Dx() < 2*n {
-		r.Min.X = (r.Min.X + r.Max.X) / 2
-		r.Max.X = r.Min.X
-	} else {
-		r.Min.X += n
-		r.Max.X -= n
-	}
-	if r.Dy() < 2*n {
-		r.Min.Y = (r.Min.Y + r.Max.Y) / 2
-		r.Max.Y = r.Min.Y
-	} else {
-		r.Min.Y += n
-		r.Max.Y -= n
-	}
-	return r
-}
-
-// Intersect returns the largest rectangle contained by both r and s. If the
-// two rectangles do not overlap then the zero rectangle will be returned.
-func (r Rectangle) Intersect(s Rectangle) Rectangle {
-	if r.Min.X < s.Min.X {
-		r.Min.X = s.Min.X
-	}
-	if r.Min.Y < s.Min.Y {
-		r.Min.Y = s.Min.Y
-	}
-	if r.Max.X > s.Max.X {
-		r.Max.X = s.Max.X
-	}
-	if r.Max.Y > s.Max.Y {
-		r.Max.Y = s.Max.Y
-	}
-	if r.Min.X > r.Max.X || r.Min.Y > r.Max.Y {
-		return ZR
-	}
-	return r
-}
-
-// Union returns the smallest rectangle that contains both r and s.
-func (r Rectangle) Union(s Rectangle) Rectangle {
-	if r.Empty() {
-		return s
-	}
-	if s.Empty() {
-		return r
-	}
-	if r.Min.X > s.Min.X {
-		r.Min.X = s.Min.X
-	}
-	if r.Min.Y > s.Min.Y {
-		r.Min.Y = s.Min.Y
-	}
-	if r.Max.X < s.Max.X {
-		r.Max.X = s.Max.X
-	}
-	if r.Max.Y < s.Max.Y {
-		r.Max.Y = s.Max.Y
-	}
-	return r
-}
-
-// Empty reports whether the rectangle contains no points.
-func (r Rectangle) Empty() bool {
-	return r.Min.X >= r.Max.X || r.Min.Y >= r.Max.Y
-}
-
-// Eq reports whether r and s contain the same set of points. All empty
-// rectangles are considered equal.
-func (r Rectangle) Eq(s Rectangle) bool {
-	return r == s || r.Empty() && s.Empty()
-}
-
-// Overlaps reports whether r and s have a non-empty intersection.
-func (r Rectangle) Overlaps(s Rectangle) bool {
-	return !r.Empty() && !s.Empty() &&
-		r.Min.X < s.Max.X && s.Min.X < r.Max.X &&
-		r.Min.Y < s.Max.Y && s.Min.Y < r.Max.Y
-}
-
-// In reports whether every point in r is in s.
-func (r Rectangle) In(s Rectangle) bool {
-	if r.Empty() {
-		return true
-	}
-	// Note that r.Max is an exclusive bound for r, so that r.In(s)
-	// does not require that r.Max.In(s).
-	return s.Min.X <= r.Min.X && r.Max.X <= s.Max.X &&
-		s.Min.Y <= r.Min.Y && r.Max.Y <= s.Max.Y
-}
-
-// Canon returns the canonical version of r. The returned rectangle has minimum
-// and maximum coordinates swapped if necessary so that it is well-formed.
-func (r Rectangle) Canon() Rectangle {
-	if r.Max.X < r.Min.X {
-		r.Min.X, r.Max.X = r.Max.X, r.Min.X
-	}
-	if r.Max.Y < r.Min.Y {
-		r.Min.Y, r.Max.Y = r.Max.Y, r.Min.Y
-	}
-	return r
-}
-
-// At implements the Image interface.
-func (r Rectangle) At(x, y int) color.Color {
-	if (Point{x, y}).In(r) {
-		return color.Opaque
-	}
-	return color.Transparent
-}
-
-// Bounds implements the Image interface.
-func (r Rectangle) Bounds() Rectangle {
-	return r
-}
-
-// ColorModel implements the Image interface.
-func (r Rectangle) ColorModel() color.Model {
-	return color.Alpha16Model
-}
-
-// ZR is the zero Rectangle.
-var ZR Rectangle
-
-// Rect is shorthand for Rectangle{Pt(x0, y0), Pt(x1, y1)}. The returned
-// rectangle has minimum and maximum coordinates swapped if necessary so that
-// it is well-formed.
-func Rect(x0, y0, x1, y1 int) Rectangle {
-	if x0 > x1 {
-		x0, x1 = x1, x0
-	}
-	if y0 > y1 {
-		y0, y1 = y1, y0
-	}
-	return Rectangle{Point{x0, y0}, Point{x1, y1}}
-}
diff --git a/third_party/gofrontend/libgo/go/image/geom_test.go b/third_party/gofrontend/libgo/go/image/geom_test.go
deleted file mode 100644
index 6e9c6a1..0000000
--- a/third_party/gofrontend/libgo/go/image/geom_test.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package image
-
-import (
-	"fmt"
-	"testing"
-)
-
-func TestRectangle(t *testing.T) {
-	// in checks that every point in f is in g.
-	in := func(f, g Rectangle) error {
-		if !f.In(g) {
-			return fmt.Errorf("f=%s, f.In(%s): got false, want true", f, g)
-		}
-		for y := f.Min.Y; y < f.Max.Y; y++ {
-			for x := f.Min.X; x < f.Max.X; x++ {
-				p := Point{x, y}
-				if !p.In(g) {
-					return fmt.Errorf("p=%s, p.In(%s): got false, want true", p, g)
-				}
-			}
-		}
-		return nil
-	}
-
-	rects := []Rectangle{
-		Rect(0, 0, 10, 10),
-		Rect(1, 2, 3, 4),
-		Rect(4, 6, 10, 10),
-		Rect(2, 3, 12, 5),
-		Rect(-1, -2, 0, 0),
-		Rect(-1, -2, 4, 6),
-		Rect(-10, -20, 30, 40),
-		Rect(8, 8, 8, 8),
-		Rect(88, 88, 88, 88),
-		Rect(6, 5, 4, 3),
-	}
-
-	// r.Eq(s) should be equivalent to every point in r being in s, and every
-	// point in s being in r.
-	for _, r := range rects {
-		for _, s := range rects {
-			got := r.Eq(s)
-			want := in(r, s) == nil && in(s, r) == nil
-			if got != want {
-				t.Errorf("Eq: r=%s, s=%s: got %t, want %t", r, s, got, want)
-			}
-		}
-	}
-
-	// The intersection should be the largest rectangle a such that every point
-	// in a is both in r and in s.
-	for _, r := range rects {
-		for _, s := range rects {
-			a := r.Intersect(s)
-			if err := in(a, r); err != nil {
-				t.Errorf("Intersect: r=%s, s=%s, a=%s, a not in r: %v", r, s, a, err)
-			}
-			if err := in(a, s); err != nil {
-				t.Errorf("Intersect: r=%s, s=%s, a=%s, a not in s: %v", r, s, a, err)
-			}
-			if a.Empty() == r.Overlaps(s) {
-				t.Errorf("Intersect: r=%s, s=%s, a=%s: empty=%t same as overlaps=%t",
-					r, s, a, a.Empty(), r.Overlaps(s))
-			}
-			largerThanA := [4]Rectangle{a, a, a, a}
-			largerThanA[0].Min.X--
-			largerThanA[1].Min.Y--
-			largerThanA[2].Max.X++
-			largerThanA[3].Max.Y++
-			for i, b := range largerThanA {
-				if b.Empty() {
-					// b isn't actually larger than a.
-					continue
-				}
-				if in(b, r) == nil && in(b, s) == nil {
-					t.Errorf("Intersect: r=%s, s=%s, a=%s, b=%s, i=%d: intersection could be larger",
-						r, s, a, b, i)
-				}
-			}
-		}
-	}
-
-	// The union should be the smallest rectangle a such that every point in r
-	// is in a and every point in s is in a.
-	for _, r := range rects {
-		for _, s := range rects {
-			a := r.Union(s)
-			if err := in(r, a); err != nil {
-				t.Errorf("Union: r=%s, s=%s, a=%s, r not in a: %v", r, s, a, err)
-			}
-			if err := in(s, a); err != nil {
-				t.Errorf("Union: r=%s, s=%s, a=%s, s not in a: %v", r, s, a, err)
-			}
-			if a.Empty() {
-				// You can't get any smaller than a.
-				continue
-			}
-			smallerThanA := [4]Rectangle{a, a, a, a}
-			smallerThanA[0].Min.X++
-			smallerThanA[1].Min.Y++
-			smallerThanA[2].Max.X--
-			smallerThanA[3].Max.Y--
-			for i, b := range smallerThanA {
-				if in(r, b) == nil && in(s, b) == nil {
-					t.Errorf("Union: r=%s, s=%s, a=%s, b=%s, i=%d: union could be smaller",
-						r, s, a, b, i)
-				}
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/gif/reader.go b/third_party/gofrontend/libgo/go/image/gif/reader.go
deleted file mode 100644
index 6a13312..0000000
--- a/third_party/gofrontend/libgo/go/image/gif/reader.go
+++ /dev/null
@@ -1,494 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package gif implements a GIF image decoder and encoder.
-//
-// The GIF specification is at http://www.w3.org/Graphics/GIF/spec-gif89a.txt.
-package gif
-
-import (
-	"bufio"
-	"compress/lzw"
-	"errors"
-	"fmt"
-	"image"
-	"image/color"
-	"io"
-)
-
-var (
-	errNotEnough = errors.New("gif: not enough image data")
-	errTooMuch   = errors.New("gif: too much image data")
-	errBadPixel  = errors.New("gif: invalid pixel value")
-)
-
-// If the io.Reader does not also have ReadByte, then decode will introduce its own buffering.
-type reader interface {
-	io.Reader
-	io.ByteReader
-}
-
-// Masks etc.
-const (
-	// Fields.
-	fColorTable         = 1 << 7
-	fInterlace          = 1 << 6
-	fColorTableBitsMask = 7
-
-	// Graphic control flags.
-	gcTransparentColorSet = 1 << 0
-	gcDisposalMethodMask  = 7 << 2
-)
-
-// Disposal Methods.
-const (
-	DisposalNone       = 0x01
-	DisposalBackground = 0x02
-	DisposalPrevious   = 0x03
-)
-
-// Section indicators.
-const (
-	sExtension       = 0x21
-	sImageDescriptor = 0x2C
-	sTrailer         = 0x3B
-)
-
-// Extensions.
-const (
-	eText           = 0x01 // Plain Text
-	eGraphicControl = 0xF9 // Graphic Control
-	eComment        = 0xFE // Comment
-	eApplication    = 0xFF // Application
-)
-
-// decoder is the type used to decode a GIF file.
-type decoder struct {
-	r reader
-
-	// From header.
-	vers            string
-	width           int
-	height          int
-	loopCount       int
-	delayTime       int
-	backgroundIndex byte
-	disposalMethod  byte
-
-	// From image descriptor.
-	imageFields byte
-
-	// From graphics control.
-	transparentIndex    byte
-	hasTransparentIndex bool
-
-	// Computed.
-	globalColorTable color.Palette
-
-	// Used when decoding.
-	delay    []int
-	disposal []byte
-	image    []*image.Paletted
-	tmp      [1024]byte // must be at least 768 so we can read color table
-}
-
-// blockReader parses the block structure of GIF image data, which
-// comprises (n, (n bytes)) blocks, with 1 <= n <= 255.  It is the
-// reader given to the LZW decoder, which is thus immune to the
-// blocking.  After the LZW decoder completes, there will be a 0-byte
-// block remaining (0, ()), which is consumed when checking that the
-// blockReader is exhausted.
-type blockReader struct {
-	r     reader
-	slice []byte
-	err   error
-	tmp   [256]byte
-}
-
-func (b *blockReader) Read(p []byte) (int, error) {
-	if b.err != nil {
-		return 0, b.err
-	}
-	if len(p) == 0 {
-		return 0, nil
-	}
-	if len(b.slice) == 0 {
-		var blockLen uint8
-		blockLen, b.err = b.r.ReadByte()
-		if b.err != nil {
-			return 0, b.err
-		}
-		if blockLen == 0 {
-			b.err = io.EOF
-			return 0, b.err
-		}
-		b.slice = b.tmp[:blockLen]
-		if _, b.err = io.ReadFull(b.r, b.slice); b.err != nil {
-			return 0, b.err
-		}
-	}
-	n := copy(p, b.slice)
-	b.slice = b.slice[n:]
-	return n, nil
-}
-
-// decode reads a GIF image from r and stores the result in d.
-func (d *decoder) decode(r io.Reader, configOnly bool) error {
-	// Add buffering if r does not provide ReadByte.
-	if rr, ok := r.(reader); ok {
-		d.r = rr
-	} else {
-		d.r = bufio.NewReader(r)
-	}
-
-	err := d.readHeaderAndScreenDescriptor()
-	if err != nil {
-		return err
-	}
-	if configOnly {
-		return nil
-	}
-
-	for {
-		c, err := d.r.ReadByte()
-		if err != nil {
-			return err
-		}
-		switch c {
-		case sExtension:
-			if err = d.readExtension(); err != nil {
-				return err
-			}
-
-		case sImageDescriptor:
-			m, err := d.newImageFromDescriptor()
-			if err != nil {
-				return err
-			}
-			useLocalColorTable := d.imageFields&fColorTable != 0
-			if useLocalColorTable {
-				m.Palette, err = d.readColorTable(d.imageFields)
-				if err != nil {
-					return err
-				}
-			} else {
-				if d.globalColorTable == nil {
-					return errors.New("gif: no color table")
-				}
-				m.Palette = d.globalColorTable
-			}
-			if d.hasTransparentIndex && int(d.transparentIndex) < len(m.Palette) {
-				if !useLocalColorTable {
-					// Clone the global color table.
-					m.Palette = append(color.Palette(nil), d.globalColorTable...)
-				}
-				m.Palette[d.transparentIndex] = color.RGBA{}
-			}
-			litWidth, err := d.r.ReadByte()
-			if err != nil {
-				return err
-			}
-			if litWidth < 2 || litWidth > 8 {
-				return fmt.Errorf("gif: pixel size in decode out of range: %d", litWidth)
-			}
-			// A wonderfully Go-like piece of magic.
-			br := &blockReader{r: d.r}
-			lzwr := lzw.NewReader(br, lzw.LSB, int(litWidth))
-			defer lzwr.Close()
-			if _, err = io.ReadFull(lzwr, m.Pix); err != nil {
-				if err != io.ErrUnexpectedEOF {
-					return err
-				}
-				return errNotEnough
-			}
-			// Both lzwr and br should be exhausted. Reading from them should
-			// yield (0, io.EOF).
-			//
-			// The spec (Appendix F - Compression), says that "An End of
-			// Information code... must be the last code output by the encoder
-			// for an image". In practice, though, giflib (a widely used C
-			// library) does not enforce this, so we also accept lzwr returning
-			// io.ErrUnexpectedEOF (meaning that the encoded stream hit io.EOF
-			// before the LZW decoder saw an explict end code), provided that
-			// the io.ReadFull call above successfully read len(m.Pix) bytes.
-			// See https://golang.org/issue/9856 for an example GIF.
-			if n, err := lzwr.Read(d.tmp[:1]); n != 0 || (err != io.EOF && err != io.ErrUnexpectedEOF) {
-				if err != nil {
-					return err
-				}
-				return errTooMuch
-			}
-			if n, err := br.Read(d.tmp[:1]); n != 0 || err != io.EOF {
-				if err != nil {
-					return err
-				}
-				return errTooMuch
-			}
-
-			// Check that the color indexes are inside the palette.
-			if len(m.Palette) < 256 {
-				for _, pixel := range m.Pix {
-					if int(pixel) >= len(m.Palette) {
-						return errBadPixel
-					}
-				}
-			}
-
-			// Undo the interlacing if necessary.
-			if d.imageFields&fInterlace != 0 {
-				uninterlace(m)
-			}
-
-			d.image = append(d.image, m)
-			d.delay = append(d.delay, d.delayTime)
-			d.disposal = append(d.disposal, d.disposalMethod)
-			// The GIF89a spec, Section 23 (Graphic Control Extension) says:
-			// "The scope of this extension is the first graphic rendering block
-			// to follow." We therefore reset the GCE fields to zero.
-			d.delayTime = 0
-			d.hasTransparentIndex = false
-
-		case sTrailer:
-			if len(d.image) == 0 {
-				return io.ErrUnexpectedEOF
-			}
-			return nil
-
-		default:
-			return fmt.Errorf("gif: unknown block type: 0x%.2x", c)
-		}
-	}
-}
-
-func (d *decoder) readHeaderAndScreenDescriptor() error {
-	_, err := io.ReadFull(d.r, d.tmp[:13])
-	if err != nil {
-		return err
-	}
-	d.vers = string(d.tmp[:6])
-	if d.vers != "GIF87a" && d.vers != "GIF89a" {
-		return fmt.Errorf("gif: can't recognize format %s", d.vers)
-	}
-	d.width = int(d.tmp[6]) + int(d.tmp[7])<<8
-	d.height = int(d.tmp[8]) + int(d.tmp[9])<<8
-	if fields := d.tmp[10]; fields&fColorTable != 0 {
-		d.backgroundIndex = d.tmp[11]
-		// readColorTable overwrites the contents of d.tmp, but that's OK.
-		if d.globalColorTable, err = d.readColorTable(fields); err != nil {
-			return err
-		}
-	}
-	// d.tmp[12] is the Pixel Aspect Ratio, which is ignored.
-	return nil
-}
-
-func (d *decoder) readColorTable(fields byte) (color.Palette, error) {
-	n := 1 << (1 + uint(fields&fColorTableBitsMask))
-	_, err := io.ReadFull(d.r, d.tmp[:3*n])
-	if err != nil {
-		return nil, fmt.Errorf("gif: short read on color table: %s", err)
-	}
-	j, p := 0, make(color.Palette, n)
-	for i := range p {
-		p[i] = color.RGBA{d.tmp[j+0], d.tmp[j+1], d.tmp[j+2], 0xFF}
-		j += 3
-	}
-	return p, nil
-}
-
-func (d *decoder) readExtension() error {
-	extension, err := d.r.ReadByte()
-	if err != nil {
-		return err
-	}
-	size := 0
-	switch extension {
-	case eText:
-		size = 13
-	case eGraphicControl:
-		return d.readGraphicControl()
-	case eComment:
-		// nothing to do but read the data.
-	case eApplication:
-		b, err := d.r.ReadByte()
-		if err != nil {
-			return err
-		}
-		// The spec requires size be 11, but Adobe sometimes uses 10.
-		size = int(b)
-	default:
-		return fmt.Errorf("gif: unknown extension 0x%.2x", extension)
-	}
-	if size > 0 {
-		if _, err := io.ReadFull(d.r, d.tmp[:size]); err != nil {
-			return err
-		}
-	}
-
-	// Application Extension with "NETSCAPE2.0" as string and 1 in data means
-	// this extension defines a loop count.
-	if extension == eApplication && string(d.tmp[:size]) == "NETSCAPE2.0" {
-		n, err := d.readBlock()
-		if n == 0 || err != nil {
-			return err
-		}
-		if n == 3 && d.tmp[0] == 1 {
-			d.loopCount = int(d.tmp[1]) | int(d.tmp[2])<<8
-		}
-	}
-	for {
-		n, err := d.readBlock()
-		if n == 0 || err != nil {
-			return err
-		}
-	}
-}
-
-func (d *decoder) readGraphicControl() error {
-	if _, err := io.ReadFull(d.r, d.tmp[:6]); err != nil {
-		return fmt.Errorf("gif: can't read graphic control: %s", err)
-	}
-	flags := d.tmp[1]
-	d.disposalMethod = (flags & gcDisposalMethodMask) >> 2
-	d.delayTime = int(d.tmp[2]) | int(d.tmp[3])<<8
-	if flags&gcTransparentColorSet != 0 {
-		d.transparentIndex = d.tmp[4]
-		d.hasTransparentIndex = true
-	}
-	return nil
-}
-
-func (d *decoder) newImageFromDescriptor() (*image.Paletted, error) {
-	if _, err := io.ReadFull(d.r, d.tmp[:9]); err != nil {
-		return nil, fmt.Errorf("gif: can't read image descriptor: %s", err)
-	}
-	left := int(d.tmp[0]) + int(d.tmp[1])<<8
-	top := int(d.tmp[2]) + int(d.tmp[3])<<8
-	width := int(d.tmp[4]) + int(d.tmp[5])<<8
-	height := int(d.tmp[6]) + int(d.tmp[7])<<8
-	d.imageFields = d.tmp[8]
-
-	// The GIF89a spec, Section 20 (Image Descriptor) says:
-	// "Each image must fit within the boundaries of the Logical
-	// Screen, as defined in the Logical Screen Descriptor."
-	bounds := image.Rect(left, top, left+width, top+height)
-	if bounds != bounds.Intersect(image.Rect(0, 0, d.width, d.height)) {
-		return nil, errors.New("gif: frame bounds larger than image bounds")
-	}
-	return image.NewPaletted(bounds, nil), nil
-}
-
-func (d *decoder) readBlock() (int, error) {
-	n, err := d.r.ReadByte()
-	if n == 0 || err != nil {
-		return 0, err
-	}
-	return io.ReadFull(d.r, d.tmp[:n])
-}
-
-// interlaceScan defines the ordering for a pass of the interlace algorithm.
-type interlaceScan struct {
-	skip, start int
-}
-
-// interlacing represents the set of scans in an interlaced GIF image.
-var interlacing = []interlaceScan{
-	{8, 0}, // Group 1 : Every 8th. row, starting with row 0.
-	{8, 4}, // Group 2 : Every 8th. row, starting with row 4.
-	{4, 2}, // Group 3 : Every 4th. row, starting with row 2.
-	{2, 1}, // Group 4 : Every 2nd. row, starting with row 1.
-}
-
-// uninterlace rearranges the pixels in m to account for interlaced input.
-func uninterlace(m *image.Paletted) {
-	var nPix []uint8
-	dx := m.Bounds().Dx()
-	dy := m.Bounds().Dy()
-	nPix = make([]uint8, dx*dy)
-	offset := 0 // steps through the input by sequential scan lines.
-	for _, pass := range interlacing {
-		nOffset := pass.start * dx // steps through the output as defined by pass.
-		for y := pass.start; y < dy; y += pass.skip {
-			copy(nPix[nOffset:nOffset+dx], m.Pix[offset:offset+dx])
-			offset += dx
-			nOffset += dx * pass.skip
-		}
-	}
-	m.Pix = nPix
-}
-
-// Decode reads a GIF image from r and returns the first embedded
-// image as an image.Image.
-func Decode(r io.Reader) (image.Image, error) {
-	var d decoder
-	if err := d.decode(r, false); err != nil {
-		return nil, err
-	}
-	return d.image[0], nil
-}
-
-// GIF represents the possibly multiple images stored in a GIF file.
-type GIF struct {
-	Image     []*image.Paletted // The successive images.
-	Delay     []int             // The successive delay times, one per frame, in 100ths of a second.
-	LoopCount int               // The loop count.
-	// Disposal is the successive disposal methods, one per frame. For
-	// backwards compatibility, a nil Disposal is valid to pass to EncodeAll,
-	// and implies that each frame's disposal method is 0 (no disposal
-	// specified).
-	Disposal []byte
-	// Config is the global color table (palette), width and height. A nil or
-	// empty-color.Palette Config.ColorModel means that each frame has its own
-	// color table and there is no global color table. Each frame's bounds must
-	// be within the rectangle defined by the two points (0, 0) and
-	// (Config.Width, Config.Height).
-	//
-	// For backwards compatibility, a zero-valued Config is valid to pass to
-	// EncodeAll, and implies that the overall GIF's width and height equals
-	// the first frame's bounds' Rectangle.Max point.
-	Config image.Config
-	// BackgroundIndex is the background index in the global color table, for
-	// use with the DisposalBackground disposal method.
-	BackgroundIndex byte
-}
-
-// DecodeAll reads a GIF image from r and returns the sequential frames
-// and timing information.
-func DecodeAll(r io.Reader) (*GIF, error) {
-	var d decoder
-	if err := d.decode(r, false); err != nil {
-		return nil, err
-	}
-	gif := &GIF{
-		Image:     d.image,
-		LoopCount: d.loopCount,
-		Delay:     d.delay,
-		Disposal:  d.disposal,
-		Config: image.Config{
-			ColorModel: d.globalColorTable,
-			Width:      d.width,
-			Height:     d.height,
-		},
-		BackgroundIndex: d.backgroundIndex,
-	}
-	return gif, nil
-}
-
-// DecodeConfig returns the global color model and dimensions of a GIF image
-// without decoding the entire image.
-func DecodeConfig(r io.Reader) (image.Config, error) {
-	var d decoder
-	if err := d.decode(r, true); err != nil {
-		return image.Config{}, err
-	}
-	return image.Config{
-		ColorModel: d.globalColorTable,
-		Width:      d.width,
-		Height:     d.height,
-	}, nil
-}
-
-func init() {
-	image.RegisterFormat("gif", "GIF8?a", Decode, DecodeConfig)
-}
diff --git a/third_party/gofrontend/libgo/go/image/gif/reader_test.go b/third_party/gofrontend/libgo/go/image/gif/reader_test.go
deleted file mode 100644
index c294195..0000000
--- a/third_party/gofrontend/libgo/go/image/gif/reader_test.go
+++ /dev/null
@@ -1,276 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gif
-
-import (
-	"bytes"
-	"compress/lzw"
-	"image"
-	"image/color"
-	"reflect"
-	"testing"
-)
-
-// header, palette and trailer are parts of a valid 2x1 GIF image.
-const (
-	headerStr = "GIF89a" +
-		"\x02\x00\x01\x00" + // width=2, height=1
-		"\x80\x00\x00" // headerFields=(a color table of 2 pixels), backgroundIndex, aspect
-	paletteStr = "\x10\x20\x30\x40\x50\x60" // the color table, also known as a palette
-	trailerStr = "\x3b"
-)
-
-// lzwEncode returns an LZW encoding (with 2-bit literals) of n zeroes.
-func lzwEncode(n int) []byte {
-	b := &bytes.Buffer{}
-	w := lzw.NewWriter(b, lzw.LSB, 2)
-	w.Write(make([]byte, n))
-	w.Close()
-	return b.Bytes()
-}
-
-func TestDecode(t *testing.T) {
-	testCases := []struct {
-		nPix    int  // The number of pixels in the image data.
-		extra   bool // Whether to write an extra block after the LZW-encoded data.
-		wantErr error
-	}{
-		{0, false, errNotEnough},
-		{1, false, errNotEnough},
-		{2, false, nil},
-		{2, true, errTooMuch},
-		{3, false, errTooMuch},
-	}
-	for _, tc := range testCases {
-		b := &bytes.Buffer{}
-		b.WriteString(headerStr)
-		b.WriteString(paletteStr)
-		// Write an image with bounds 2x1 but tc.nPix pixels. If tc.nPix != 2
-		// then this should result in an invalid GIF image. First, write a
-		// magic 0x2c (image descriptor) byte, bounds=(0,0)-(2,1), a flags
-		// byte, and 2-bit LZW literals.
-		b.WriteString("\x2c\x00\x00\x00\x00\x02\x00\x01\x00\x00\x02")
-		if tc.nPix > 0 {
-			enc := lzwEncode(tc.nPix)
-			if len(enc) > 0xff {
-				t.Errorf("nPix=%d, extra=%t: compressed length %d is too large", tc.nPix, tc.extra, len(enc))
-				continue
-			}
-			b.WriteByte(byte(len(enc)))
-			b.Write(enc)
-		}
-		if tc.extra {
-			b.WriteString("\x01\x02") // A 1-byte payload with an 0x02 byte.
-		}
-		b.WriteByte(0x00) // An empty block signifies the end of the image data.
-		b.WriteString(trailerStr)
-
-		got, err := Decode(b)
-		if err != tc.wantErr {
-			t.Errorf("nPix=%d, extra=%t\ngot  %v\nwant %v", tc.nPix, tc.extra, err, tc.wantErr)
-		}
-
-		if tc.wantErr != nil {
-			continue
-		}
-		want := &image.Paletted{
-			Pix:    []uint8{0, 0},
-			Stride: 2,
-			Rect:   image.Rect(0, 0, 2, 1),
-			Palette: color.Palette{
-				color.RGBA{0x10, 0x20, 0x30, 0xff},
-				color.RGBA{0x40, 0x50, 0x60, 0xff},
-			},
-		}
-		if !reflect.DeepEqual(got, want) {
-			t.Errorf("nPix=%d, extra=%t\ngot  %v\nwant %v", tc.nPix, tc.extra, got, want)
-		}
-	}
-}
-
-func TestTransparentIndex(t *testing.T) {
-	b := &bytes.Buffer{}
-	b.WriteString(headerStr)
-	b.WriteString(paletteStr)
-	for transparentIndex := 0; transparentIndex < 3; transparentIndex++ {
-		if transparentIndex < 2 {
-			// Write the graphic control for the transparent index.
-			b.WriteString("\x21\xf9\x00\x01\x00\x00")
-			b.WriteByte(byte(transparentIndex))
-			b.WriteByte(0)
-		}
-		// Write an image with bounds 2x1, as per TestDecode.
-		b.WriteString("\x2c\x00\x00\x00\x00\x02\x00\x01\x00\x00\x02")
-		enc := lzwEncode(2)
-		if len(enc) > 0xff {
-			t.Fatalf("compressed length %d is too large", len(enc))
-		}
-		b.WriteByte(byte(len(enc)))
-		b.Write(enc)
-		b.WriteByte(0x00)
-	}
-	b.WriteString(trailerStr)
-
-	g, err := DecodeAll(b)
-	if err != nil {
-		t.Fatalf("DecodeAll: %v", err)
-	}
-	c0 := color.RGBA{paletteStr[0], paletteStr[1], paletteStr[2], 0xff}
-	c1 := color.RGBA{paletteStr[3], paletteStr[4], paletteStr[5], 0xff}
-	cz := color.RGBA{}
-	wants := []color.Palette{
-		{cz, c1},
-		{c0, cz},
-		{c0, c1},
-	}
-	if len(g.Image) != len(wants) {
-		t.Fatalf("got %d images, want %d", len(g.Image), len(wants))
-	}
-	for i, want := range wants {
-		got := g.Image[i].Palette
-		if !reflect.DeepEqual(got, want) {
-			t.Errorf("palette #%d:\ngot  %v\nwant %v", i, got, want)
-		}
-	}
-}
-
-// testGIF is a simple GIF that we can modify to test different scenarios.
-var testGIF = []byte{
-	'G', 'I', 'F', '8', '9', 'a',
-	1, 0, 1, 0, // w=1, h=1 (6)
-	128, 0, 0, // headerFields, bg, aspect (10)
-	0, 0, 0, 1, 1, 1, // color table and graphics control (13)
-	0x21, 0xf9, 0x04, 0x00, 0x00, 0x00, 0xff, 0x00, // (19)
-	// frame 1 (0,0 - 1,1)
-	0x2c,
-	0x00, 0x00, 0x00, 0x00,
-	0x01, 0x00, 0x01, 0x00, // (32)
-	0x00,
-	0x02, 0x02, 0x4c, 0x01, 0x00, // lzw pixels
-	// trailer
-	0x3b,
-}
-
-func try(t *testing.T, b []byte, want string) {
-	_, err := DecodeAll(bytes.NewReader(b))
-	var got string
-	if err != nil {
-		got = err.Error()
-	}
-	if got != want {
-		t.Fatalf("got %v, want %v", got, want)
-	}
-}
-
-func TestBounds(t *testing.T) {
-	// Make a local copy of testGIF.
-	gif := make([]byte, len(testGIF))
-	copy(gif, testGIF)
-	// Make the bounds too big, just by one.
-	gif[32] = 2
-	want := "gif: frame bounds larger than image bounds"
-	try(t, gif, want)
-
-	// Make the bounds too small; does not trigger bounds
-	// check, but now there's too much data.
-	gif[32] = 0
-	want = "gif: too much image data"
-	try(t, gif, want)
-	gif[32] = 1
-
-	// Make the bounds really big, expect an error.
-	want = "gif: frame bounds larger than image bounds"
-	for i := 0; i < 4; i++ {
-		gif[32+i] = 0xff
-	}
-	try(t, gif, want)
-}
-
-func TestNoPalette(t *testing.T) {
-	b := &bytes.Buffer{}
-
-	// Manufacture a GIF with no palette, so any pixel at all
-	// will be invalid.
-	b.WriteString(headerStr[:len(headerStr)-3])
-	b.WriteString("\x00\x00\x00") // No global palette.
-
-	// Image descriptor: 2x1, no local palette.
-	b.WriteString("\x2c\x00\x00\x00\x00\x02\x00\x01\x00\x00\x02")
-
-	// Encode the pixels: neither is in range, because there is no palette.
-	pix := []byte{0, 3}
-	enc := &bytes.Buffer{}
-	w := lzw.NewWriter(enc, lzw.LSB, 2)
-	if _, err := w.Write(pix); err != nil {
-		t.Fatalf("Write: %v", err)
-	}
-	if err := w.Close(); err != nil {
-		t.Fatalf("Close: %v", err)
-	}
-	b.WriteByte(byte(len(enc.Bytes())))
-	b.Write(enc.Bytes())
-	b.WriteByte(0x00) // An empty block signifies the end of the image data.
-
-	b.WriteString(trailerStr)
-
-	try(t, b.Bytes(), "gif: no color table")
-}
-
-func TestPixelOutsidePaletteRange(t *testing.T) {
-	for _, pval := range []byte{0, 1, 2, 3} {
-		b := &bytes.Buffer{}
-
-		// Manufacture a GIF with a 2 color palette.
-		b.WriteString(headerStr)
-		b.WriteString(paletteStr)
-
-		// Image descriptor: 2x1, no local palette.
-		b.WriteString("\x2c\x00\x00\x00\x00\x02\x00\x01\x00\x00\x02")
-
-		// Encode the pixels; some pvals trigger the expected error.
-		pix := []byte{pval, pval}
-		enc := &bytes.Buffer{}
-		w := lzw.NewWriter(enc, lzw.LSB, 2)
-		if _, err := w.Write(pix); err != nil {
-			t.Fatalf("Write: %v", err)
-		}
-		if err := w.Close(); err != nil {
-			t.Fatalf("Close: %v", err)
-		}
-		b.WriteByte(byte(len(enc.Bytes())))
-		b.Write(enc.Bytes())
-		b.WriteByte(0x00) // An empty block signifies the end of the image data.
-
-		b.WriteString(trailerStr)
-
-		// No error expected, unless the pixels are beyond the 2 color palette.
-		want := ""
-		if pval >= 2 {
-			want = "gif: invalid pixel value"
-		}
-		try(t, b.Bytes(), want)
-	}
-}
-
-func TestLoopCount(t *testing.T) {
-	data := []byte("GIF89a000\x00000,0\x00\x00\x00\n\x00" +
-		"\n\x00\x80000000\x02\b\xf01u\xb9\xfdal\x05\x00;")
-	img, err := DecodeAll(bytes.NewReader(data))
-	if err != nil {
-		t.Fatal("DecodeAll:", err)
-	}
-	w := new(bytes.Buffer)
-	err = EncodeAll(w, img)
-	if err != nil {
-		t.Fatal("EncodeAll:", err)
-	}
-	img1, err := DecodeAll(w)
-	if err != nil {
-		t.Fatal("DecodeAll:", err)
-	}
-	if img.LoopCount != img1.LoopCount {
-		t.Errorf("loop count mismatch: %d vs %d", img.LoopCount, img1.LoopCount)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/gif/writer.go b/third_party/gofrontend/libgo/go/image/gif/writer.go
deleted file mode 100644
index dd31790..0000000
--- a/third_party/gofrontend/libgo/go/image/gif/writer.go
+++ /dev/null
@@ -1,386 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gif
-
-import (
-	"bufio"
-	"bytes"
-	"compress/lzw"
-	"errors"
-	"image"
-	"image/color"
-	"image/color/palette"
-	"image/draw"
-	"io"
-)
-
-// Graphic control extension fields.
-const (
-	gcLabel     = 0xF9
-	gcBlockSize = 0x04
-)
-
-var log2Lookup = [8]int{2, 4, 8, 16, 32, 64, 128, 256}
-
-func log2(x int) int {
-	for i, v := range log2Lookup {
-		if x <= v {
-			return i
-		}
-	}
-	return -1
-}
-
-// Little-endian.
-func writeUint16(b []uint8, u uint16) {
-	b[0] = uint8(u)
-	b[1] = uint8(u >> 8)
-}
-
-// writer is a buffered writer.
-type writer interface {
-	Flush() error
-	io.Writer
-	io.ByteWriter
-}
-
-// encoder encodes an image to the GIF format.
-type encoder struct {
-	// w is the writer to write to. err is the first error encountered during
-	// writing. All attempted writes after the first error become no-ops.
-	w   writer
-	err error
-	// g is a reference to the data that is being encoded.
-	g GIF
-	// globalCT is the size in bytes of the global color table.
-	globalCT int
-	// buf is a scratch buffer. It must be at least 256 for the blockWriter.
-	buf              [256]byte
-	globalColorTable [3 * 256]byte
-	localColorTable  [3 * 256]byte
-}
-
-// blockWriter writes the block structure of GIF image data, which
-// comprises (n, (n bytes)) blocks, with 1 <= n <= 255. It is the
-// writer given to the LZW encoder, which is thus immune to the
-// blocking.
-type blockWriter struct {
-	e *encoder
-}
-
-func (b blockWriter) Write(data []byte) (int, error) {
-	if b.e.err != nil {
-		return 0, b.e.err
-	}
-	if len(data) == 0 {
-		return 0, nil
-	}
-	total := 0
-	for total < len(data) {
-		n := copy(b.e.buf[1:256], data[total:])
-		total += n
-		b.e.buf[0] = uint8(n)
-
-		n, b.e.err = b.e.w.Write(b.e.buf[:n+1])
-		if b.e.err != nil {
-			return 0, b.e.err
-		}
-	}
-	return total, b.e.err
-}
-
-func (e *encoder) flush() {
-	if e.err != nil {
-		return
-	}
-	e.err = e.w.Flush()
-}
-
-func (e *encoder) write(p []byte) {
-	if e.err != nil {
-		return
-	}
-	_, e.err = e.w.Write(p)
-}
-
-func (e *encoder) writeByte(b byte) {
-	if e.err != nil {
-		return
-	}
-	e.err = e.w.WriteByte(b)
-}
-
-func (e *encoder) writeHeader() {
-	if e.err != nil {
-		return
-	}
-	_, e.err = io.WriteString(e.w, "GIF89a")
-	if e.err != nil {
-		return
-	}
-
-	// Logical screen width and height.
-	writeUint16(e.buf[0:2], uint16(e.g.Config.Width))
-	writeUint16(e.buf[2:4], uint16(e.g.Config.Height))
-	e.write(e.buf[:4])
-
-	if p, ok := e.g.Config.ColorModel.(color.Palette); ok && len(p) > 0 {
-		paddedSize := log2(len(p)) // Size of Global Color Table: 2^(1+n).
-		e.buf[0] = fColorTable | uint8(paddedSize)
-		e.buf[1] = e.g.BackgroundIndex
-		e.buf[2] = 0x00 // Pixel Aspect Ratio.
-		e.write(e.buf[:3])
-		e.globalCT = encodeColorTable(e.globalColorTable[:], p, paddedSize)
-		e.write(e.globalColorTable[:e.globalCT])
-	} else {
-		// All frames have a local color table, so a global color table
-		// is not needed.
-		e.buf[0] = 0x00
-		e.buf[1] = 0x00 // Background Color Index.
-		e.buf[2] = 0x00 // Pixel Aspect Ratio.
-		e.write(e.buf[:3])
-	}
-
-	// Add animation info if necessary.
-	if len(e.g.Image) > 1 {
-		e.buf[0] = 0x21 // Extension Introducer.
-		e.buf[1] = 0xff // Application Label.
-		e.buf[2] = 0x0b // Block Size.
-		e.write(e.buf[:3])
-		_, e.err = io.WriteString(e.w, "NETSCAPE2.0") // Application Identifier.
-		if e.err != nil {
-			return
-		}
-		e.buf[0] = 0x03 // Block Size.
-		e.buf[1] = 0x01 // Sub-block Index.
-		writeUint16(e.buf[2:4], uint16(e.g.LoopCount))
-		e.buf[4] = 0x00 // Block Terminator.
-		e.write(e.buf[:5])
-	}
-}
-
-func encodeColorTable(dst []byte, p color.Palette, size int) int {
-	n := log2Lookup[size]
-	for i := 0; i < n; i++ {
-		if i < len(p) {
-			r, g, b, _ := p[i].RGBA()
-			dst[3*i+0] = uint8(r >> 8)
-			dst[3*i+1] = uint8(g >> 8)
-			dst[3*i+2] = uint8(b >> 8)
-		} else {
-			// Pad with black.
-			dst[3*i+0] = 0x00
-			dst[3*i+1] = 0x00
-			dst[3*i+2] = 0x00
-		}
-	}
-	return 3 * n
-}
-
-func (e *encoder) writeImageBlock(pm *image.Paletted, delay int, disposal byte) {
-	if e.err != nil {
-		return
-	}
-
-	if len(pm.Palette) == 0 {
-		e.err = errors.New("gif: cannot encode image block with empty palette")
-		return
-	}
-
-	b := pm.Bounds()
-	if b.Min.X < 0 || b.Max.X >= 1<<16 || b.Min.Y < 0 || b.Max.Y >= 1<<16 {
-		e.err = errors.New("gif: image block is too large to encode")
-		return
-	}
-	if !b.In(image.Rectangle{Max: image.Point{e.g.Config.Width, e.g.Config.Height}}) {
-		e.err = errors.New("gif: image block is out of bounds")
-		return
-	}
-
-	transparentIndex := -1
-	for i, c := range pm.Palette {
-		if _, _, _, a := c.RGBA(); a == 0 {
-			transparentIndex = i
-			break
-		}
-	}
-
-	if delay > 0 || disposal != 0 || transparentIndex != -1 {
-		e.buf[0] = sExtension  // Extension Introducer.
-		e.buf[1] = gcLabel     // Graphic Control Label.
-		e.buf[2] = gcBlockSize // Block Size.
-		if transparentIndex != -1 {
-			e.buf[3] = 0x01 | disposal<<2
-		} else {
-			e.buf[3] = 0x00 | disposal<<2
-		}
-		writeUint16(e.buf[4:6], uint16(delay)) // Delay Time (1/100ths of a second)
-
-		// Transparent color index.
-		if transparentIndex != -1 {
-			e.buf[6] = uint8(transparentIndex)
-		} else {
-			e.buf[6] = 0x00
-		}
-		e.buf[7] = 0x00 // Block Terminator.
-		e.write(e.buf[:8])
-	}
-	e.buf[0] = sImageDescriptor
-	writeUint16(e.buf[1:3], uint16(b.Min.X))
-	writeUint16(e.buf[3:5], uint16(b.Min.Y))
-	writeUint16(e.buf[5:7], uint16(b.Dx()))
-	writeUint16(e.buf[7:9], uint16(b.Dy()))
-	e.write(e.buf[:9])
-
-	paddedSize := log2(len(pm.Palette)) // Size of Local Color Table: 2^(1+n).
-	ct := encodeColorTable(e.localColorTable[:], pm.Palette, paddedSize)
-	if ct != e.globalCT || !bytes.Equal(e.globalColorTable[:ct], e.localColorTable[:ct]) {
-		// Use a local color table.
-		e.writeByte(fColorTable | uint8(paddedSize))
-		e.write(e.localColorTable[:ct])
-	} else {
-		// Use the global color table.
-		e.writeByte(0)
-	}
-
-	litWidth := paddedSize + 1
-	if litWidth < 2 {
-		litWidth = 2
-	}
-	e.writeByte(uint8(litWidth)) // LZW Minimum Code Size.
-
-	lzww := lzw.NewWriter(blockWriter{e: e}, lzw.LSB, litWidth)
-	if dx := b.Dx(); dx == pm.Stride {
-		_, e.err = lzww.Write(pm.Pix)
-		if e.err != nil {
-			lzww.Close()
-			return
-		}
-	} else {
-		for i, y := 0, b.Min.Y; y < b.Max.Y; i, y = i+pm.Stride, y+1 {
-			_, e.err = lzww.Write(pm.Pix[i : i+dx])
-			if e.err != nil {
-				lzww.Close()
-				return
-			}
-		}
-	}
-	lzww.Close()
-	e.writeByte(0x00) // Block Terminator.
-}
-
-// Options are the encoding parameters.
-type Options struct {
-	// NumColors is the maximum number of colors used in the image.
-	// It ranges from 1 to 256.
-	NumColors int
-
-	// Quantizer is used to produce a palette with size NumColors.
-	// palette.Plan9 is used in place of a nil Quantizer.
-	Quantizer draw.Quantizer
-
-	// Drawer is used to convert the source image to the desired palette.
-	// draw.FloydSteinberg is used in place of a nil Drawer.
-	Drawer draw.Drawer
-}
-
-// EncodeAll writes the images in g to w in GIF format with the
-// given loop count and delay between frames.
-func EncodeAll(w io.Writer, g *GIF) error {
-	if len(g.Image) == 0 {
-		return errors.New("gif: must provide at least one image")
-	}
-
-	if len(g.Image) != len(g.Delay) {
-		return errors.New("gif: mismatched image and delay lengths")
-	}
-	if g.LoopCount < 0 {
-		g.LoopCount = 0
-	}
-
-	e := encoder{g: *g}
-	// The GIF.Disposal, GIF.Config and GIF.BackgroundIndex fields were added
-	// in Go 1.5. Valid Go 1.4 code, such as when the Disposal field is omitted
-	// in a GIF struct literal, should still produce valid GIFs.
-	if e.g.Disposal != nil && len(e.g.Image) != len(e.g.Disposal) {
-		return errors.New("gif: mismatched image and disposal lengths")
-	}
-	if e.g.Config == (image.Config{}) {
-		p := g.Image[0].Bounds().Max
-		e.g.Config.Width = p.X
-		e.g.Config.Height = p.Y
-	} else if e.g.Config.ColorModel != nil {
-		if _, ok := e.g.Config.ColorModel.(color.Palette); !ok {
-			return errors.New("gif: GIF color model must be a color.Palette")
-		}
-	}
-
-	if ww, ok := w.(writer); ok {
-		e.w = ww
-	} else {
-		e.w = bufio.NewWriter(w)
-	}
-
-	e.writeHeader()
-	for i, pm := range g.Image {
-		disposal := uint8(0)
-		if g.Disposal != nil {
-			disposal = g.Disposal[i]
-		}
-		e.writeImageBlock(pm, g.Delay[i], disposal)
-	}
-	e.writeByte(sTrailer)
-	e.flush()
-	return e.err
-}
-
-// Encode writes the Image m to w in GIF format.
-func Encode(w io.Writer, m image.Image, o *Options) error {
-	// Check for bounds and size restrictions.
-	b := m.Bounds()
-	if b.Dx() >= 1<<16 || b.Dy() >= 1<<16 {
-		return errors.New("gif: image is too large to encode")
-	}
-
-	opts := Options{}
-	if o != nil {
-		opts = *o
-	}
-	if opts.NumColors < 1 || 256 < opts.NumColors {
-		opts.NumColors = 256
-	}
-	if opts.Drawer == nil {
-		opts.Drawer = draw.FloydSteinberg
-	}
-
-	pm, ok := m.(*image.Paletted)
-	if !ok || len(pm.Palette) > opts.NumColors {
-		// TODO: Pick a better sub-sample of the Plan 9 palette.
-		pm = image.NewPaletted(b, palette.Plan9[:opts.NumColors])
-		if opts.Quantizer != nil {
-			pm.Palette = opts.Quantizer.Quantize(make(color.Palette, 0, opts.NumColors), m)
-		}
-		opts.Drawer.Draw(pm, b, m, image.ZP)
-	}
-
-	// When calling Encode instead of EncodeAll, the single-frame image is
-	// translated such that its top-left corner is (0, 0), so that the single
-	// frame completely fills the overall GIF's bounds.
-	if pm.Rect.Min != (image.Point{}) {
-		dup := *pm
-		dup.Rect = dup.Rect.Sub(dup.Rect.Min)
-		pm = &dup
-	}
-
-	return EncodeAll(w, &GIF{
-		Image: []*image.Paletted{pm},
-		Delay: []int{0},
-		Config: image.Config{
-			ColorModel: pm.Palette,
-			Width:      b.Dx(),
-			Height:     b.Dy(),
-		},
-	})
-}
diff --git a/third_party/gofrontend/libgo/go/image/gif/writer_test.go b/third_party/gofrontend/libgo/go/image/gif/writer_test.go
deleted file mode 100644
index db61a5c..0000000
--- a/third_party/gofrontend/libgo/go/image/gif/writer_test.go
+++ /dev/null
@@ -1,491 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gif
-
-import (
-	"bytes"
-	"image"
-	"image/color"
-	"image/color/palette"
-	_ "image/png"
-	"io/ioutil"
-	"math/rand"
-	"os"
-	"reflect"
-	"testing"
-)
-
-func readImg(filename string) (image.Image, error) {
-	f, err := os.Open(filename)
-	if err != nil {
-		return nil, err
-	}
-	defer f.Close()
-	m, _, err := image.Decode(f)
-	return m, err
-}
-
-func readGIF(filename string) (*GIF, error) {
-	f, err := os.Open(filename)
-	if err != nil {
-		return nil, err
-	}
-	defer f.Close()
-	return DecodeAll(f)
-}
-
-func delta(u0, u1 uint32) int64 {
-	d := int64(u0) - int64(u1)
-	if d < 0 {
-		return -d
-	}
-	return d
-}
-
-// averageDelta returns the average delta in RGB space. The two images must
-// have the same bounds.
-func averageDelta(m0, m1 image.Image) int64 {
-	b := m0.Bounds()
-	var sum, n int64
-	for y := b.Min.Y; y < b.Max.Y; y++ {
-		for x := b.Min.X; x < b.Max.X; x++ {
-			c0 := m0.At(x, y)
-			c1 := m1.At(x, y)
-			r0, g0, b0, _ := c0.RGBA()
-			r1, g1, b1, _ := c1.RGBA()
-			sum += delta(r0, r1)
-			sum += delta(g0, g1)
-			sum += delta(b0, b1)
-			n += 3
-		}
-	}
-	return sum / n
-}
-
-var testCase = []struct {
-	filename  string
-	tolerance int64
-}{
-	{"../testdata/video-001.png", 1 << 12},
-	{"../testdata/video-001.gif", 0},
-	{"../testdata/video-001.interlaced.gif", 0},
-}
-
-func TestWriter(t *testing.T) {
-	for _, tc := range testCase {
-		m0, err := readImg(tc.filename)
-		if err != nil {
-			t.Error(tc.filename, err)
-			continue
-		}
-		var buf bytes.Buffer
-		err = Encode(&buf, m0, nil)
-		if err != nil {
-			t.Error(tc.filename, err)
-			continue
-		}
-		m1, err := Decode(&buf)
-		if err != nil {
-			t.Error(tc.filename, err)
-			continue
-		}
-		if m0.Bounds() != m1.Bounds() {
-			t.Errorf("%s, bounds differ: %v and %v", tc.filename, m0.Bounds(), m1.Bounds())
-			continue
-		}
-		// Compare the average delta to the tolerance level.
-		avgDelta := averageDelta(m0, m1)
-		if avgDelta > tc.tolerance {
-			t.Errorf("%s: average delta is too high. expected: %d, got %d", tc.filename, tc.tolerance, avgDelta)
-			continue
-		}
-	}
-}
-
-func TestSubImage(t *testing.T) {
-	m0, err := readImg("../testdata/video-001.gif")
-	if err != nil {
-		t.Fatalf("readImg: %v", err)
-	}
-	m0 = m0.(*image.Paletted).SubImage(image.Rect(0, 0, 50, 30))
-	var buf bytes.Buffer
-	err = Encode(&buf, m0, nil)
-	if err != nil {
-		t.Fatalf("Encode: %v", err)
-	}
-	m1, err := Decode(&buf)
-	if err != nil {
-		t.Fatalf("Decode: %v", err)
-	}
-	if m0.Bounds() != m1.Bounds() {
-		t.Fatalf("bounds differ: %v and %v", m0.Bounds(), m1.Bounds())
-	}
-	if averageDelta(m0, m1) != 0 {
-		t.Fatalf("images differ")
-	}
-}
-
-// palettesEqual reports whether two color.Palette values are equal, ignoring
-// any trailing opaque-black palette entries.
-func palettesEqual(p, q color.Palette) bool {
-	n := len(p)
-	if n > len(q) {
-		n = len(q)
-	}
-	for i := 0; i < n; i++ {
-		if p[i] != q[i] {
-			return false
-		}
-	}
-	for i := n; i < len(p); i++ {
-		r, g, b, a := p[i].RGBA()
-		if r != 0 || g != 0 || b != 0 || a != 0xffff {
-			return false
-		}
-	}
-	for i := n; i < len(q); i++ {
-		r, g, b, a := q[i].RGBA()
-		if r != 0 || g != 0 || b != 0 || a != 0xffff {
-			return false
-		}
-	}
-	return true
-}
-
-var frames = []string{
-	"../testdata/video-001.gif",
-	"../testdata/video-005.gray.gif",
-}
-
-func testEncodeAll(t *testing.T, go1Dot5Fields bool, useGlobalColorModel bool) {
-	const width, height = 150, 103
-
-	g0 := &GIF{
-		Image:     make([]*image.Paletted, len(frames)),
-		Delay:     make([]int, len(frames)),
-		LoopCount: 5,
-	}
-	for i, f := range frames {
-		g, err := readGIF(f)
-		if err != nil {
-			t.Fatal(f, err)
-		}
-		m := g.Image[0]
-		if m.Bounds().Dx() != width || m.Bounds().Dy() != height {
-			t.Fatalf("frame %d had unexpected bounds: got %v, want width/height = %d/%d",
-				i, m.Bounds(), width, height)
-		}
-		g0.Image[i] = m
-	}
-	// The GIF.Disposal, GIF.Config and GIF.BackgroundIndex fields were added
-	// in Go 1.5. Valid Go 1.4 or earlier code should still produce valid GIFs.
-	//
-	// On the following line, color.Model is an interface type, and
-	// color.Palette is a concrete (slice) type.
-	globalColorModel, backgroundIndex := color.Model(color.Palette(nil)), uint8(0)
-	if useGlobalColorModel {
-		globalColorModel, backgroundIndex = color.Palette(palette.WebSafe), uint8(1)
-	}
-	if go1Dot5Fields {
-		g0.Disposal = make([]byte, len(g0.Image))
-		for i := range g0.Disposal {
-			g0.Disposal[i] = DisposalNone
-		}
-		g0.Config = image.Config{
-			ColorModel: globalColorModel,
-			Width:      width,
-			Height:     height,
-		}
-		g0.BackgroundIndex = backgroundIndex
-	}
-
-	var buf bytes.Buffer
-	if err := EncodeAll(&buf, g0); err != nil {
-		t.Fatal("EncodeAll:", err)
-	}
-	encoded := buf.Bytes()
-	config, err := DecodeConfig(bytes.NewReader(encoded))
-	if err != nil {
-		t.Fatal("DecodeConfig:", err)
-	}
-	g1, err := DecodeAll(bytes.NewReader(encoded))
-	if err != nil {
-		t.Fatal("DecodeAll:", err)
-	}
-
-	if !reflect.DeepEqual(config, g1.Config) {
-		t.Errorf("DecodeConfig inconsistent with DecodeAll")
-	}
-	if !palettesEqual(g1.Config.ColorModel.(color.Palette), globalColorModel.(color.Palette)) {
-		t.Errorf("unexpected global color model")
-	}
-	if w, h := g1.Config.Width, g1.Config.Height; w != width || h != height {
-		t.Errorf("got config width * height = %d * %d, want %d * %d", w, h, width, height)
-	}
-
-	if g0.LoopCount != g1.LoopCount {
-		t.Errorf("loop counts differ: %d and %d", g0.LoopCount, g1.LoopCount)
-	}
-	if backgroundIndex != g1.BackgroundIndex {
-		t.Errorf("background indexes differ: %d and %d", backgroundIndex, g1.BackgroundIndex)
-	}
-	if len(g0.Image) != len(g1.Image) {
-		t.Fatalf("image lengths differ: %d and %d", len(g0.Image), len(g1.Image))
-	}
-	if len(g1.Image) != len(g1.Delay) {
-		t.Fatalf("image and delay lengths differ: %d and %d", len(g1.Image), len(g1.Delay))
-	}
-	if len(g1.Image) != len(g1.Disposal) {
-		t.Fatalf("image and disposal lengths differ: %d and %d", len(g1.Image), len(g1.Disposal))
-	}
-
-	for i := range g0.Image {
-		m0, m1 := g0.Image[i], g1.Image[i]
-		if m0.Bounds() != m1.Bounds() {
-			t.Errorf("frame %d: bounds differ: %v and %v", i, m0.Bounds(), m1.Bounds())
-		}
-		d0, d1 := g0.Delay[i], g1.Delay[i]
-		if d0 != d1 {
-			t.Errorf("frame %d: delay values differ: %d and %d", i, d0, d1)
-		}
-		p0, p1 := uint8(0), g1.Disposal[i]
-		if go1Dot5Fields {
-			p0 = DisposalNone
-		}
-		if p0 != p1 {
-			t.Errorf("frame %d: disposal values differ: %d and %d", i, p0, p1)
-		}
-	}
-}
-
-func TestEncodeAllGo1Dot4(t *testing.T)                 { testEncodeAll(t, false, false) }
-func TestEncodeAllGo1Dot5(t *testing.T)                 { testEncodeAll(t, true, false) }
-func TestEncodeAllGo1Dot5GlobalColorModel(t *testing.T) { testEncodeAll(t, true, true) }
-
-func TestEncodeMismatchDelay(t *testing.T) {
-	images := make([]*image.Paletted, 2)
-	for i := range images {
-		images[i] = image.NewPaletted(image.Rect(0, 0, 5, 5), palette.Plan9)
-	}
-
-	g0 := &GIF{
-		Image: images,
-		Delay: make([]int, 1),
-	}
-	if err := EncodeAll(ioutil.Discard, g0); err == nil {
-		t.Error("expected error from mismatched delay and image slice lengths")
-	}
-
-	g1 := &GIF{
-		Image:    images,
-		Delay:    make([]int, len(images)),
-		Disposal: make([]byte, 1),
-	}
-	for i := range g1.Disposal {
-		g1.Disposal[i] = DisposalNone
-	}
-	if err := EncodeAll(ioutil.Discard, g1); err == nil {
-		t.Error("expected error from mismatched disposal and image slice lengths")
-	}
-}
-
-func TestEncodeZeroGIF(t *testing.T) {
-	if err := EncodeAll(ioutil.Discard, &GIF{}); err == nil {
-		t.Error("expected error from providing empty gif")
-	}
-}
-
-func TestEncodeAllFramesOutOfBounds(t *testing.T) {
-	images := []*image.Paletted{
-		image.NewPaletted(image.Rect(0, 0, 5, 5), palette.Plan9),
-		image.NewPaletted(image.Rect(2, 2, 8, 8), palette.Plan9),
-		image.NewPaletted(image.Rect(3, 3, 4, 4), palette.Plan9),
-	}
-	for _, upperBound := range []int{6, 10} {
-		g := &GIF{
-			Image:    images,
-			Delay:    make([]int, len(images)),
-			Disposal: make([]byte, len(images)),
-			Config: image.Config{
-				Width:  upperBound,
-				Height: upperBound,
-			},
-		}
-		err := EncodeAll(ioutil.Discard, g)
-		if upperBound >= 8 {
-			if err != nil {
-				t.Errorf("upperBound=%d: %v", upperBound, err)
-			}
-		} else {
-			if err == nil {
-				t.Errorf("upperBound=%d: got nil error, want non-nil", upperBound)
-			}
-		}
-	}
-}
-
-func TestEncodeNonZeroMinPoint(t *testing.T) {
-	points := []image.Point{
-		image.Point{-8, -9},
-		image.Point{-4, -4},
-		image.Point{-3, +3},
-		image.Point{+0, +0},
-		image.Point{+2, +2},
-	}
-	for _, p := range points {
-		src := image.NewPaletted(image.Rectangle{Min: p, Max: p.Add(image.Point{6, 6})}, palette.Plan9)
-		var buf bytes.Buffer
-		if err := Encode(&buf, src, nil); err != nil {
-			t.Errorf("p=%v: Encode: %v", p, err)
-			continue
-		}
-		m, err := Decode(&buf)
-		if err != nil {
-			t.Errorf("p=%v: Decode: %v", p, err)
-			continue
-		}
-		if got, want := m.Bounds(), image.Rect(0, 0, 6, 6); got != want {
-			t.Errorf("p=%v: got %v, want %v", p, got, want)
-		}
-	}
-}
-
-func TestEncodeImplicitConfigSize(t *testing.T) {
-	// For backwards compatibility for Go 1.4 and earlier code, the Config
-	// field is optional, and if zero, the width and height is implied by the
-	// first (and in this case only) frame's width and height.
-	//
-	// A Config only specifies a width and height (two integers) while an
-	// image.Image's Bounds method returns an image.Rectangle (four integers).
-	// For a gif.GIF, the overall bounds' top-left point is always implicitly
-	// (0, 0), and any frame whose bounds have a negative X or Y will be
-	// outside those overall bounds, so encoding should fail.
-	for _, lowerBound := range []int{-1, 0, 1} {
-		images := []*image.Paletted{
-			image.NewPaletted(image.Rect(lowerBound, lowerBound, 4, 4), palette.Plan9),
-		}
-		g := &GIF{
-			Image: images,
-			Delay: make([]int, len(images)),
-		}
-		err := EncodeAll(ioutil.Discard, g)
-		if lowerBound >= 0 {
-			if err != nil {
-				t.Errorf("lowerBound=%d: %v", lowerBound, err)
-			}
-		} else {
-			if err == nil {
-				t.Errorf("lowerBound=%d: got nil error, want non-nil", lowerBound)
-			}
-		}
-	}
-}
-
-func TestEncodePalettes(t *testing.T) {
-	const w, h = 5, 5
-	pals := []color.Palette{{
-		color.RGBA{0x00, 0x00, 0x00, 0xff},
-		color.RGBA{0x01, 0x00, 0x00, 0xff},
-		color.RGBA{0x02, 0x00, 0x00, 0xff},
-	}, {
-		color.RGBA{0x00, 0x00, 0x00, 0xff},
-		color.RGBA{0x00, 0x01, 0x00, 0xff},
-	}, {
-		color.RGBA{0x00, 0x00, 0x03, 0xff},
-		color.RGBA{0x00, 0x00, 0x02, 0xff},
-		color.RGBA{0x00, 0x00, 0x01, 0xff},
-		color.RGBA{0x00, 0x00, 0x00, 0xff},
-	}, {
-		color.RGBA{0x10, 0x07, 0xf0, 0xff},
-		color.RGBA{0x20, 0x07, 0xf0, 0xff},
-		color.RGBA{0x30, 0x07, 0xf0, 0xff},
-		color.RGBA{0x40, 0x07, 0xf0, 0xff},
-		color.RGBA{0x50, 0x07, 0xf0, 0xff},
-	}}
-	g0 := &GIF{
-		Image: []*image.Paletted{
-			image.NewPaletted(image.Rect(0, 0, w, h), pals[0]),
-			image.NewPaletted(image.Rect(0, 0, w, h), pals[1]),
-			image.NewPaletted(image.Rect(0, 0, w, h), pals[2]),
-			image.NewPaletted(image.Rect(0, 0, w, h), pals[3]),
-		},
-		Delay:    make([]int, len(pals)),
-		Disposal: make([]byte, len(pals)),
-		Config: image.Config{
-			ColorModel: pals[2],
-			Width:      w,
-			Height:     h,
-		},
-	}
-
-	var buf bytes.Buffer
-	if err := EncodeAll(&buf, g0); err != nil {
-		t.Fatalf("EncodeAll: %v", err)
-	}
-	g1, err := DecodeAll(&buf)
-	if err != nil {
-		t.Fatalf("DecodeAll: %v", err)
-	}
-	if len(g0.Image) != len(g1.Image) {
-		t.Fatalf("image lengths differ: %d and %d", len(g0.Image), len(g1.Image))
-	}
-	for i, m := range g1.Image {
-		if got, want := m.Palette, pals[i]; !palettesEqual(got, want) {
-			t.Errorf("frame %d:\ngot  %v\nwant %v", i, got, want)
-		}
-	}
-}
-
-func BenchmarkEncode(b *testing.B) {
-	b.StopTimer()
-
-	bo := image.Rect(0, 0, 640, 480)
-	rnd := rand.New(rand.NewSource(123))
-
-	// Restrict to a 256-color paletted image to avoid quantization path.
-	palette := make(color.Palette, 256)
-	for i := range palette {
-		palette[i] = color.RGBA{
-			uint8(rnd.Intn(256)),
-			uint8(rnd.Intn(256)),
-			uint8(rnd.Intn(256)),
-			255,
-		}
-	}
-	img := image.NewPaletted(image.Rect(0, 0, 640, 480), palette)
-	for y := bo.Min.Y; y < bo.Max.Y; y++ {
-		for x := bo.Min.X; x < bo.Max.X; x++ {
-			img.Set(x, y, palette[rnd.Intn(256)])
-		}
-	}
-
-	b.SetBytes(640 * 480 * 4)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		Encode(ioutil.Discard, img, nil)
-	}
-}
-
-func BenchmarkQuantizedEncode(b *testing.B) {
-	b.StopTimer()
-	img := image.NewRGBA(image.Rect(0, 0, 640, 480))
-	bo := img.Bounds()
-	rnd := rand.New(rand.NewSource(123))
-	for y := bo.Min.Y; y < bo.Max.Y; y++ {
-		for x := bo.Min.X; x < bo.Max.X; x++ {
-			img.SetRGBA(x, y, color.RGBA{
-				uint8(rnd.Intn(256)),
-				uint8(rnd.Intn(256)),
-				uint8(rnd.Intn(256)),
-				255,
-			})
-		}
-	}
-	b.SetBytes(640 * 480 * 4)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		Encode(ioutil.Discard, img, nil)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/image.go b/third_party/gofrontend/libgo/go/image/image.go
deleted file mode 100644
index 20b64d7..0000000
--- a/third_party/gofrontend/libgo/go/image/image.go
+++ /dev/null
@@ -1,1022 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package image implements a basic 2-D image library.
-//
-// The fundamental interface is called Image. An Image contains colors, which
-// are described in the image/color package.
-//
-// Values of the Image interface are created either by calling functions such
-// as NewRGBA and NewPaletted, or by calling Decode on an io.Reader containing
-// image data in a format such as GIF, JPEG or PNG. Decoding any particular
-// image format requires the prior registration of a decoder function.
-// Registration is typically automatic as a side effect of initializing that
-// format's package so that, to decode a PNG image, it suffices to have
-//	import _ "image/png"
-// in a program's main package. The _ means to import a package purely for its
-// initialization side effects.
-//
-// See "The Go image package" for more details:
-// https://golang.org/doc/articles/image_package.html
-package image
-
-import (
-	"image/color"
-)
-
-// Config holds an image's color model and dimensions.
-type Config struct {
-	ColorModel    color.Model
-	Width, Height int
-}
-
-// Image is a finite rectangular grid of color.Color values taken from a color
-// model.
-type Image interface {
-	// ColorModel returns the Image's color model.
-	ColorModel() color.Model
-	// Bounds returns the domain for which At can return non-zero color.
-	// The bounds do not necessarily contain the point (0, 0).
-	Bounds() Rectangle
-	// At returns the color of the pixel at (x, y).
-	// At(Bounds().Min.X, Bounds().Min.Y) returns the upper-left pixel of the grid.
-	// At(Bounds().Max.X-1, Bounds().Max.Y-1) returns the lower-right one.
-	At(x, y int) color.Color
-}
-
-// PalettedImage is an image whose colors may come from a limited palette.
-// If m is a PalettedImage and m.ColorModel() returns a color.Palette p,
-// then m.At(x, y) should be equivalent to p[m.ColorIndexAt(x, y)]. If m's
-// color model is not a color.Palette, then ColorIndexAt's behavior is
-// undefined.
-type PalettedImage interface {
-	// ColorIndexAt returns the palette index of the pixel at (x, y).
-	ColorIndexAt(x, y int) uint8
-	Image
-}
-
-// RGBA is an in-memory image whose At method returns color.RGBA values.
-type RGBA struct {
-	// Pix holds the image's pixels, in R, G, B, A order. The pixel at
-	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*4].
-	Pix []uint8
-	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
-	Stride int
-	// Rect is the image's bounds.
-	Rect Rectangle
-}
-
-func (p *RGBA) ColorModel() color.Model { return color.RGBAModel }
-
-func (p *RGBA) Bounds() Rectangle { return p.Rect }
-
-func (p *RGBA) At(x, y int) color.Color {
-	return p.RGBAAt(x, y)
-}
-
-func (p *RGBA) RGBAAt(x, y int) color.RGBA {
-	if !(Point{x, y}.In(p.Rect)) {
-		return color.RGBA{}
-	}
-	i := p.PixOffset(x, y)
-	return color.RGBA{p.Pix[i+0], p.Pix[i+1], p.Pix[i+2], p.Pix[i+3]}
-}
-
-// PixOffset returns the index of the first element of Pix that corresponds to
-// the pixel at (x, y).
-func (p *RGBA) PixOffset(x, y int) int {
-	return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*4
-}
-
-func (p *RGBA) Set(x, y int, c color.Color) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	c1 := color.RGBAModel.Convert(c).(color.RGBA)
-	p.Pix[i+0] = c1.R
-	p.Pix[i+1] = c1.G
-	p.Pix[i+2] = c1.B
-	p.Pix[i+3] = c1.A
-}
-
-func (p *RGBA) SetRGBA(x, y int, c color.RGBA) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	p.Pix[i+0] = c.R
-	p.Pix[i+1] = c.G
-	p.Pix[i+2] = c.B
-	p.Pix[i+3] = c.A
-}
-
-// SubImage returns an image representing the portion of the image p visible
-// through r. The returned value shares pixels with the original image.
-func (p *RGBA) SubImage(r Rectangle) Image {
-	r = r.Intersect(p.Rect)
-	// If r1 and r2 are Rectangles, r1.Intersect(r2) is not guaranteed to be inside
-	// either r1 or r2 if the intersection is empty. Without explicitly checking for
-	// this, the Pix[i:] expression below can panic.
-	if r.Empty() {
-		return &RGBA{}
-	}
-	i := p.PixOffset(r.Min.X, r.Min.Y)
-	return &RGBA{
-		Pix:    p.Pix[i:],
-		Stride: p.Stride,
-		Rect:   r,
-	}
-}
-
-// Opaque scans the entire image and reports whether it is fully opaque.
-func (p *RGBA) Opaque() bool {
-	if p.Rect.Empty() {
-		return true
-	}
-	i0, i1 := 3, p.Rect.Dx()*4
-	for y := p.Rect.Min.Y; y < p.Rect.Max.Y; y++ {
-		for i := i0; i < i1; i += 4 {
-			if p.Pix[i] != 0xff {
-				return false
-			}
-		}
-		i0 += p.Stride
-		i1 += p.Stride
-	}
-	return true
-}
-
-// NewRGBA returns a new RGBA with the given bounds.
-func NewRGBA(r Rectangle) *RGBA {
-	w, h := r.Dx(), r.Dy()
-	buf := make([]uint8, 4*w*h)
-	return &RGBA{buf, 4 * w, r}
-}
-
-// RGBA64 is an in-memory image whose At method returns color.RGBA64 values.
-type RGBA64 struct {
-	// Pix holds the image's pixels, in R, G, B, A order and big-endian format. The pixel at
-	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*8].
-	Pix []uint8
-	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
-	Stride int
-	// Rect is the image's bounds.
-	Rect Rectangle
-}
-
-func (p *RGBA64) ColorModel() color.Model { return color.RGBA64Model }
-
-func (p *RGBA64) Bounds() Rectangle { return p.Rect }
-
-func (p *RGBA64) At(x, y int) color.Color {
-	return p.RGBA64At(x, y)
-}
-
-func (p *RGBA64) RGBA64At(x, y int) color.RGBA64 {
-	if !(Point{x, y}.In(p.Rect)) {
-		return color.RGBA64{}
-	}
-	i := p.PixOffset(x, y)
-	return color.RGBA64{
-		uint16(p.Pix[i+0])<<8 | uint16(p.Pix[i+1]),
-		uint16(p.Pix[i+2])<<8 | uint16(p.Pix[i+3]),
-		uint16(p.Pix[i+4])<<8 | uint16(p.Pix[i+5]),
-		uint16(p.Pix[i+6])<<8 | uint16(p.Pix[i+7]),
-	}
-}
-
-// PixOffset returns the index of the first element of Pix that corresponds to
-// the pixel at (x, y).
-func (p *RGBA64) PixOffset(x, y int) int {
-	return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*8
-}
-
-func (p *RGBA64) Set(x, y int, c color.Color) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	c1 := color.RGBA64Model.Convert(c).(color.RGBA64)
-	p.Pix[i+0] = uint8(c1.R >> 8)
-	p.Pix[i+1] = uint8(c1.R)
-	p.Pix[i+2] = uint8(c1.G >> 8)
-	p.Pix[i+3] = uint8(c1.G)
-	p.Pix[i+4] = uint8(c1.B >> 8)
-	p.Pix[i+5] = uint8(c1.B)
-	p.Pix[i+6] = uint8(c1.A >> 8)
-	p.Pix[i+7] = uint8(c1.A)
-}
-
-func (p *RGBA64) SetRGBA64(x, y int, c color.RGBA64) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	p.Pix[i+0] = uint8(c.R >> 8)
-	p.Pix[i+1] = uint8(c.R)
-	p.Pix[i+2] = uint8(c.G >> 8)
-	p.Pix[i+3] = uint8(c.G)
-	p.Pix[i+4] = uint8(c.B >> 8)
-	p.Pix[i+5] = uint8(c.B)
-	p.Pix[i+6] = uint8(c.A >> 8)
-	p.Pix[i+7] = uint8(c.A)
-}
-
-// SubImage returns an image representing the portion of the image p visible
-// through r. The returned value shares pixels with the original image.
-func (p *RGBA64) SubImage(r Rectangle) Image {
-	r = r.Intersect(p.Rect)
-	// If r1 and r2 are Rectangles, r1.Intersect(r2) is not guaranteed to be inside
-	// either r1 or r2 if the intersection is empty. Without explicitly checking for
-	// this, the Pix[i:] expression below can panic.
-	if r.Empty() {
-		return &RGBA64{}
-	}
-	i := p.PixOffset(r.Min.X, r.Min.Y)
-	return &RGBA64{
-		Pix:    p.Pix[i:],
-		Stride: p.Stride,
-		Rect:   r,
-	}
-}
-
-// Opaque scans the entire image and reports whether it is fully opaque.
-func (p *RGBA64) Opaque() bool {
-	if p.Rect.Empty() {
-		return true
-	}
-	i0, i1 := 6, p.Rect.Dx()*8
-	for y := p.Rect.Min.Y; y < p.Rect.Max.Y; y++ {
-		for i := i0; i < i1; i += 8 {
-			if p.Pix[i+0] != 0xff || p.Pix[i+1] != 0xff {
-				return false
-			}
-		}
-		i0 += p.Stride
-		i1 += p.Stride
-	}
-	return true
-}
-
-// NewRGBA64 returns a new RGBA64 with the given bounds.
-func NewRGBA64(r Rectangle) *RGBA64 {
-	w, h := r.Dx(), r.Dy()
-	pix := make([]uint8, 8*w*h)
-	return &RGBA64{pix, 8 * w, r}
-}
-
-// NRGBA is an in-memory image whose At method returns color.NRGBA values.
-type NRGBA struct {
-	// Pix holds the image's pixels, in R, G, B, A order. The pixel at
-	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*4].
-	Pix []uint8
-	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
-	Stride int
-	// Rect is the image's bounds.
-	Rect Rectangle
-}
-
-func (p *NRGBA) ColorModel() color.Model { return color.NRGBAModel }
-
-func (p *NRGBA) Bounds() Rectangle { return p.Rect }
-
-func (p *NRGBA) At(x, y int) color.Color {
-	return p.NRGBAAt(x, y)
-}
-
-func (p *NRGBA) NRGBAAt(x, y int) color.NRGBA {
-	if !(Point{x, y}.In(p.Rect)) {
-		return color.NRGBA{}
-	}
-	i := p.PixOffset(x, y)
-	return color.NRGBA{p.Pix[i+0], p.Pix[i+1], p.Pix[i+2], p.Pix[i+3]}
-}
-
-// PixOffset returns the index of the first element of Pix that corresponds to
-// the pixel at (x, y).
-func (p *NRGBA) PixOffset(x, y int) int {
-	return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*4
-}
-
-func (p *NRGBA) Set(x, y int, c color.Color) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	c1 := color.NRGBAModel.Convert(c).(color.NRGBA)
-	p.Pix[i+0] = c1.R
-	p.Pix[i+1] = c1.G
-	p.Pix[i+2] = c1.B
-	p.Pix[i+3] = c1.A
-}
-
-func (p *NRGBA) SetNRGBA(x, y int, c color.NRGBA) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	p.Pix[i+0] = c.R
-	p.Pix[i+1] = c.G
-	p.Pix[i+2] = c.B
-	p.Pix[i+3] = c.A
-}
-
-// SubImage returns an image representing the portion of the image p visible
-// through r. The returned value shares pixels with the original image.
-func (p *NRGBA) SubImage(r Rectangle) Image {
-	r = r.Intersect(p.Rect)
-	// If r1 and r2 are Rectangles, r1.Intersect(r2) is not guaranteed to be inside
-	// either r1 or r2 if the intersection is empty. Without explicitly checking for
-	// this, the Pix[i:] expression below can panic.
-	if r.Empty() {
-		return &NRGBA{}
-	}
-	i := p.PixOffset(r.Min.X, r.Min.Y)
-	return &NRGBA{
-		Pix:    p.Pix[i:],
-		Stride: p.Stride,
-		Rect:   r,
-	}
-}
-
-// Opaque scans the entire image and reports whether it is fully opaque.
-func (p *NRGBA) Opaque() bool {
-	if p.Rect.Empty() {
-		return true
-	}
-	i0, i1 := 3, p.Rect.Dx()*4
-	for y := p.Rect.Min.Y; y < p.Rect.Max.Y; y++ {
-		for i := i0; i < i1; i += 4 {
-			if p.Pix[i] != 0xff {
-				return false
-			}
-		}
-		i0 += p.Stride
-		i1 += p.Stride
-	}
-	return true
-}
-
-// NewNRGBA returns a new NRGBA with the given bounds.
-func NewNRGBA(r Rectangle) *NRGBA {
-	w, h := r.Dx(), r.Dy()
-	pix := make([]uint8, 4*w*h)
-	return &NRGBA{pix, 4 * w, r}
-}
-
-// NRGBA64 is an in-memory image whose At method returns color.NRGBA64 values.
-type NRGBA64 struct {
-	// Pix holds the image's pixels, in R, G, B, A order and big-endian format. The pixel at
-	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*8].
-	Pix []uint8
-	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
-	Stride int
-	// Rect is the image's bounds.
-	Rect Rectangle
-}
-
-func (p *NRGBA64) ColorModel() color.Model { return color.NRGBA64Model }
-
-func (p *NRGBA64) Bounds() Rectangle { return p.Rect }
-
-func (p *NRGBA64) At(x, y int) color.Color {
-	return p.NRGBA64At(x, y)
-}
-
-func (p *NRGBA64) NRGBA64At(x, y int) color.NRGBA64 {
-	if !(Point{x, y}.In(p.Rect)) {
-		return color.NRGBA64{}
-	}
-	i := p.PixOffset(x, y)
-	return color.NRGBA64{
-		uint16(p.Pix[i+0])<<8 | uint16(p.Pix[i+1]),
-		uint16(p.Pix[i+2])<<8 | uint16(p.Pix[i+3]),
-		uint16(p.Pix[i+4])<<8 | uint16(p.Pix[i+5]),
-		uint16(p.Pix[i+6])<<8 | uint16(p.Pix[i+7]),
-	}
-}
-
-// PixOffset returns the index of the first element of Pix that corresponds to
-// the pixel at (x, y).
-func (p *NRGBA64) PixOffset(x, y int) int {
-	return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*8
-}
-
-func (p *NRGBA64) Set(x, y int, c color.Color) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	c1 := color.NRGBA64Model.Convert(c).(color.NRGBA64)
-	p.Pix[i+0] = uint8(c1.R >> 8)
-	p.Pix[i+1] = uint8(c1.R)
-	p.Pix[i+2] = uint8(c1.G >> 8)
-	p.Pix[i+3] = uint8(c1.G)
-	p.Pix[i+4] = uint8(c1.B >> 8)
-	p.Pix[i+5] = uint8(c1.B)
-	p.Pix[i+6] = uint8(c1.A >> 8)
-	p.Pix[i+7] = uint8(c1.A)
-}
-
-func (p *NRGBA64) SetNRGBA64(x, y int, c color.NRGBA64) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	p.Pix[i+0] = uint8(c.R >> 8)
-	p.Pix[i+1] = uint8(c.R)
-	p.Pix[i+2] = uint8(c.G >> 8)
-	p.Pix[i+3] = uint8(c.G)
-	p.Pix[i+4] = uint8(c.B >> 8)
-	p.Pix[i+5] = uint8(c.B)
-	p.Pix[i+6] = uint8(c.A >> 8)
-	p.Pix[i+7] = uint8(c.A)
-}
-
-// SubImage returns an image representing the portion of the image p visible
-// through r. The returned value shares pixels with the original image.
-func (p *NRGBA64) SubImage(r Rectangle) Image {
-	r = r.Intersect(p.Rect)
-	// If r1 and r2 are Rectangles, r1.Intersect(r2) is not guaranteed to be inside
-	// either r1 or r2 if the intersection is empty. Without explicitly checking for
-	// this, the Pix[i:] expression below can panic.
-	if r.Empty() {
-		return &NRGBA64{}
-	}
-	i := p.PixOffset(r.Min.X, r.Min.Y)
-	return &NRGBA64{
-		Pix:    p.Pix[i:],
-		Stride: p.Stride,
-		Rect:   r,
-	}
-}
-
-// Opaque scans the entire image and reports whether it is fully opaque.
-func (p *NRGBA64) Opaque() bool {
-	if p.Rect.Empty() {
-		return true
-	}
-	i0, i1 := 6, p.Rect.Dx()*8
-	for y := p.Rect.Min.Y; y < p.Rect.Max.Y; y++ {
-		for i := i0; i < i1; i += 8 {
-			if p.Pix[i+0] != 0xff || p.Pix[i+1] != 0xff {
-				return false
-			}
-		}
-		i0 += p.Stride
-		i1 += p.Stride
-	}
-	return true
-}
-
-// NewNRGBA64 returns a new NRGBA64 with the given bounds.
-func NewNRGBA64(r Rectangle) *NRGBA64 {
-	w, h := r.Dx(), r.Dy()
-	pix := make([]uint8, 8*w*h)
-	return &NRGBA64{pix, 8 * w, r}
-}
-
-// Alpha is an in-memory image whose At method returns color.Alpha values.
-type Alpha struct {
-	// Pix holds the image's pixels, as alpha values. The pixel at
-	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*1].
-	Pix []uint8
-	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
-	Stride int
-	// Rect is the image's bounds.
-	Rect Rectangle
-}
-
-func (p *Alpha) ColorModel() color.Model { return color.AlphaModel }
-
-func (p *Alpha) Bounds() Rectangle { return p.Rect }
-
-func (p *Alpha) At(x, y int) color.Color {
-	return p.AlphaAt(x, y)
-}
-
-func (p *Alpha) AlphaAt(x, y int) color.Alpha {
-	if !(Point{x, y}.In(p.Rect)) {
-		return color.Alpha{}
-	}
-	i := p.PixOffset(x, y)
-	return color.Alpha{p.Pix[i]}
-}
-
-// PixOffset returns the index of the first element of Pix that corresponds to
-// the pixel at (x, y).
-func (p *Alpha) PixOffset(x, y int) int {
-	return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*1
-}
-
-func (p *Alpha) Set(x, y int, c color.Color) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	p.Pix[i] = color.AlphaModel.Convert(c).(color.Alpha).A
-}
-
-func (p *Alpha) SetAlpha(x, y int, c color.Alpha) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	p.Pix[i] = c.A
-}
-
-// SubImage returns an image representing the portion of the image p visible
-// through r. The returned value shares pixels with the original image.
-func (p *Alpha) SubImage(r Rectangle) Image {
-	r = r.Intersect(p.Rect)
-	// If r1 and r2 are Rectangles, r1.Intersect(r2) is not guaranteed to be inside
-	// either r1 or r2 if the intersection is empty. Without explicitly checking for
-	// this, the Pix[i:] expression below can panic.
-	if r.Empty() {
-		return &Alpha{}
-	}
-	i := p.PixOffset(r.Min.X, r.Min.Y)
-	return &Alpha{
-		Pix:    p.Pix[i:],
-		Stride: p.Stride,
-		Rect:   r,
-	}
-}
-
-// Opaque scans the entire image and reports whether it is fully opaque.
-func (p *Alpha) Opaque() bool {
-	if p.Rect.Empty() {
-		return true
-	}
-	i0, i1 := 0, p.Rect.Dx()
-	for y := p.Rect.Min.Y; y < p.Rect.Max.Y; y++ {
-		for i := i0; i < i1; i++ {
-			if p.Pix[i] != 0xff {
-				return false
-			}
-		}
-		i0 += p.Stride
-		i1 += p.Stride
-	}
-	return true
-}
-
-// NewAlpha returns a new Alpha with the given bounds.
-func NewAlpha(r Rectangle) *Alpha {
-	w, h := r.Dx(), r.Dy()
-	pix := make([]uint8, 1*w*h)
-	return &Alpha{pix, 1 * w, r}
-}
-
-// Alpha16 is an in-memory image whose At method returns color.Alpha16 values.
-type Alpha16 struct {
-	// Pix holds the image's pixels, as alpha values in big-endian format. The pixel at
-	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*2].
-	Pix []uint8
-	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
-	Stride int
-	// Rect is the image's bounds.
-	Rect Rectangle
-}
-
-func (p *Alpha16) ColorModel() color.Model { return color.Alpha16Model }
-
-func (p *Alpha16) Bounds() Rectangle { return p.Rect }
-
-func (p *Alpha16) At(x, y int) color.Color {
-	return p.Alpha16At(x, y)
-}
-
-func (p *Alpha16) Alpha16At(x, y int) color.Alpha16 {
-	if !(Point{x, y}.In(p.Rect)) {
-		return color.Alpha16{}
-	}
-	i := p.PixOffset(x, y)
-	return color.Alpha16{uint16(p.Pix[i+0])<<8 | uint16(p.Pix[i+1])}
-}
-
-// PixOffset returns the index of the first element of Pix that corresponds to
-// the pixel at (x, y).
-func (p *Alpha16) PixOffset(x, y int) int {
-	return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*2
-}
-
-func (p *Alpha16) Set(x, y int, c color.Color) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	c1 := color.Alpha16Model.Convert(c).(color.Alpha16)
-	p.Pix[i+0] = uint8(c1.A >> 8)
-	p.Pix[i+1] = uint8(c1.A)
-}
-
-func (p *Alpha16) SetAlpha16(x, y int, c color.Alpha16) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	p.Pix[i+0] = uint8(c.A >> 8)
-	p.Pix[i+1] = uint8(c.A)
-}
-
-// SubImage returns an image representing the portion of the image p visible
-// through r. The returned value shares pixels with the original image.
-func (p *Alpha16) SubImage(r Rectangle) Image {
-	r = r.Intersect(p.Rect)
-	// If r1 and r2 are Rectangles, r1.Intersect(r2) is not guaranteed to be inside
-	// either r1 or r2 if the intersection is empty. Without explicitly checking for
-	// this, the Pix[i:] expression below can panic.
-	if r.Empty() {
-		return &Alpha16{}
-	}
-	i := p.PixOffset(r.Min.X, r.Min.Y)
-	return &Alpha16{
-		Pix:    p.Pix[i:],
-		Stride: p.Stride,
-		Rect:   r,
-	}
-}
-
-// Opaque scans the entire image and reports whether it is fully opaque.
-func (p *Alpha16) Opaque() bool {
-	if p.Rect.Empty() {
-		return true
-	}
-	i0, i1 := 0, p.Rect.Dx()*2
-	for y := p.Rect.Min.Y; y < p.Rect.Max.Y; y++ {
-		for i := i0; i < i1; i += 2 {
-			if p.Pix[i+0] != 0xff || p.Pix[i+1] != 0xff {
-				return false
-			}
-		}
-		i0 += p.Stride
-		i1 += p.Stride
-	}
-	return true
-}
-
-// NewAlpha16 returns a new Alpha16 with the given bounds.
-func NewAlpha16(r Rectangle) *Alpha16 {
-	w, h := r.Dx(), r.Dy()
-	pix := make([]uint8, 2*w*h)
-	return &Alpha16{pix, 2 * w, r}
-}
-
-// Gray is an in-memory image whose At method returns color.Gray values.
-type Gray struct {
-	// Pix holds the image's pixels, as gray values. The pixel at
-	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*1].
-	Pix []uint8
-	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
-	Stride int
-	// Rect is the image's bounds.
-	Rect Rectangle
-}
-
-func (p *Gray) ColorModel() color.Model { return color.GrayModel }
-
-func (p *Gray) Bounds() Rectangle { return p.Rect }
-
-func (p *Gray) At(x, y int) color.Color {
-	return p.GrayAt(x, y)
-}
-
-func (p *Gray) GrayAt(x, y int) color.Gray {
-	if !(Point{x, y}.In(p.Rect)) {
-		return color.Gray{}
-	}
-	i := p.PixOffset(x, y)
-	return color.Gray{p.Pix[i]}
-}
-
-// PixOffset returns the index of the first element of Pix that corresponds to
-// the pixel at (x, y).
-func (p *Gray) PixOffset(x, y int) int {
-	return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*1
-}
-
-func (p *Gray) Set(x, y int, c color.Color) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	p.Pix[i] = color.GrayModel.Convert(c).(color.Gray).Y
-}
-
-func (p *Gray) SetGray(x, y int, c color.Gray) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	p.Pix[i] = c.Y
-}
-
-// SubImage returns an image representing the portion of the image p visible
-// through r. The returned value shares pixels with the original image.
-func (p *Gray) SubImage(r Rectangle) Image {
-	r = r.Intersect(p.Rect)
-	// If r1 and r2 are Rectangles, r1.Intersect(r2) is not guaranteed to be inside
-	// either r1 or r2 if the intersection is empty. Without explicitly checking for
-	// this, the Pix[i:] expression below can panic.
-	if r.Empty() {
-		return &Gray{}
-	}
-	i := p.PixOffset(r.Min.X, r.Min.Y)
-	return &Gray{
-		Pix:    p.Pix[i:],
-		Stride: p.Stride,
-		Rect:   r,
-	}
-}
-
-// Opaque scans the entire image and reports whether it is fully opaque.
-func (p *Gray) Opaque() bool {
-	return true
-}
-
-// NewGray returns a new Gray with the given bounds.
-func NewGray(r Rectangle) *Gray {
-	w, h := r.Dx(), r.Dy()
-	pix := make([]uint8, 1*w*h)
-	return &Gray{pix, 1 * w, r}
-}
-
-// Gray16 is an in-memory image whose At method returns color.Gray16 values.
-type Gray16 struct {
-	// Pix holds the image's pixels, as gray values in big-endian format. The pixel at
-	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*2].
-	Pix []uint8
-	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
-	Stride int
-	// Rect is the image's bounds.
-	Rect Rectangle
-}
-
-func (p *Gray16) ColorModel() color.Model { return color.Gray16Model }
-
-func (p *Gray16) Bounds() Rectangle { return p.Rect }
-
-func (p *Gray16) At(x, y int) color.Color {
-	return p.Gray16At(x, y)
-}
-
-func (p *Gray16) Gray16At(x, y int) color.Gray16 {
-	if !(Point{x, y}.In(p.Rect)) {
-		return color.Gray16{}
-	}
-	i := p.PixOffset(x, y)
-	return color.Gray16{uint16(p.Pix[i+0])<<8 | uint16(p.Pix[i+1])}
-}
-
-// PixOffset returns the index of the first element of Pix that corresponds to
-// the pixel at (x, y).
-func (p *Gray16) PixOffset(x, y int) int {
-	return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*2
-}
-
-func (p *Gray16) Set(x, y int, c color.Color) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	c1 := color.Gray16Model.Convert(c).(color.Gray16)
-	p.Pix[i+0] = uint8(c1.Y >> 8)
-	p.Pix[i+1] = uint8(c1.Y)
-}
-
-func (p *Gray16) SetGray16(x, y int, c color.Gray16) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	p.Pix[i+0] = uint8(c.Y >> 8)
-	p.Pix[i+1] = uint8(c.Y)
-}
-
-// SubImage returns an image representing the portion of the image p visible
-// through r. The returned value shares pixels with the original image.
-func (p *Gray16) SubImage(r Rectangle) Image {
-	r = r.Intersect(p.Rect)
-	// If r1 and r2 are Rectangles, r1.Intersect(r2) is not guaranteed to be inside
-	// either r1 or r2 if the intersection is empty. Without explicitly checking for
-	// this, the Pix[i:] expression below can panic.
-	if r.Empty() {
-		return &Gray16{}
-	}
-	i := p.PixOffset(r.Min.X, r.Min.Y)
-	return &Gray16{
-		Pix:    p.Pix[i:],
-		Stride: p.Stride,
-		Rect:   r,
-	}
-}
-
-// Opaque scans the entire image and reports whether it is fully opaque.
-func (p *Gray16) Opaque() bool {
-	return true
-}
-
-// NewGray16 returns a new Gray16 with the given bounds.
-func NewGray16(r Rectangle) *Gray16 {
-	w, h := r.Dx(), r.Dy()
-	pix := make([]uint8, 2*w*h)
-	return &Gray16{pix, 2 * w, r}
-}
-
-// CMYK is an in-memory image whose At method returns color.CMYK values.
-type CMYK struct {
-	// Pix holds the image's pixels, in C, M, Y, K order. The pixel at
-	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*4].
-	Pix []uint8
-	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
-	Stride int
-	// Rect is the image's bounds.
-	Rect Rectangle
-}
-
-func (p *CMYK) ColorModel() color.Model { return color.CMYKModel }
-
-func (p *CMYK) Bounds() Rectangle { return p.Rect }
-
-func (p *CMYK) At(x, y int) color.Color {
-	return p.CMYKAt(x, y)
-}
-
-func (p *CMYK) CMYKAt(x, y int) color.CMYK {
-	if !(Point{x, y}.In(p.Rect)) {
-		return color.CMYK{}
-	}
-	i := p.PixOffset(x, y)
-	return color.CMYK{p.Pix[i+0], p.Pix[i+1], p.Pix[i+2], p.Pix[i+3]}
-}
-
-// PixOffset returns the index of the first element of Pix that corresponds to
-// the pixel at (x, y).
-func (p *CMYK) PixOffset(x, y int) int {
-	return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*4
-}
-
-func (p *CMYK) Set(x, y int, c color.Color) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	c1 := color.CMYKModel.Convert(c).(color.CMYK)
-	p.Pix[i+0] = c1.C
-	p.Pix[i+1] = c1.M
-	p.Pix[i+2] = c1.Y
-	p.Pix[i+3] = c1.K
-}
-
-func (p *CMYK) SetCMYK(x, y int, c color.CMYK) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	p.Pix[i+0] = c.C
-	p.Pix[i+1] = c.M
-	p.Pix[i+2] = c.Y
-	p.Pix[i+3] = c.K
-}
-
-// SubImage returns an image representing the portion of the image p visible
-// through r. The returned value shares pixels with the original image.
-func (p *CMYK) SubImage(r Rectangle) Image {
-	r = r.Intersect(p.Rect)
-	// If r1 and r2 are Rectangles, r1.Intersect(r2) is not guaranteed to be inside
-	// either r1 or r2 if the intersection is empty. Without explicitly checking for
-	// this, the Pix[i:] expression below can panic.
-	if r.Empty() {
-		return &CMYK{}
-	}
-	i := p.PixOffset(r.Min.X, r.Min.Y)
-	return &CMYK{
-		Pix:    p.Pix[i:],
-		Stride: p.Stride,
-		Rect:   r,
-	}
-}
-
-// Opaque scans the entire image and reports whether it is fully opaque.
-func (p *CMYK) Opaque() bool {
-	return true
-}
-
-// NewCMYK returns a new CMYK with the given bounds.
-func NewCMYK(r Rectangle) *CMYK {
-	w, h := r.Dx(), r.Dy()
-	buf := make([]uint8, 4*w*h)
-	return &CMYK{buf, 4 * w, r}
-}
-
-// Paletted is an in-memory image of uint8 indices into a given palette.
-type Paletted struct {
-	// Pix holds the image's pixels, as palette indices. The pixel at
-	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*1].
-	Pix []uint8
-	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
-	Stride int
-	// Rect is the image's bounds.
-	Rect Rectangle
-	// Palette is the image's palette.
-	Palette color.Palette
-}
-
-func (p *Paletted) ColorModel() color.Model { return p.Palette }
-
-func (p *Paletted) Bounds() Rectangle { return p.Rect }
-
-func (p *Paletted) At(x, y int) color.Color {
-	if len(p.Palette) == 0 {
-		return nil
-	}
-	if !(Point{x, y}.In(p.Rect)) {
-		return p.Palette[0]
-	}
-	i := p.PixOffset(x, y)
-	return p.Palette[p.Pix[i]]
-}
-
-// PixOffset returns the index of the first element of Pix that corresponds to
-// the pixel at (x, y).
-func (p *Paletted) PixOffset(x, y int) int {
-	return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*1
-}
-
-func (p *Paletted) Set(x, y int, c color.Color) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	p.Pix[i] = uint8(p.Palette.Index(c))
-}
-
-func (p *Paletted) ColorIndexAt(x, y int) uint8 {
-	if !(Point{x, y}.In(p.Rect)) {
-		return 0
-	}
-	i := p.PixOffset(x, y)
-	return p.Pix[i]
-}
-
-func (p *Paletted) SetColorIndex(x, y int, index uint8) {
-	if !(Point{x, y}.In(p.Rect)) {
-		return
-	}
-	i := p.PixOffset(x, y)
-	p.Pix[i] = index
-}
-
-// SubImage returns an image representing the portion of the image p visible
-// through r. The returned value shares pixels with the original image.
-func (p *Paletted) SubImage(r Rectangle) Image {
-	r = r.Intersect(p.Rect)
-	// If r1 and r2 are Rectangles, r1.Intersect(r2) is not guaranteed to be inside
-	// either r1 or r2 if the intersection is empty. Without explicitly checking for
-	// this, the Pix[i:] expression below can panic.
-	if r.Empty() {
-		return &Paletted{
-			Palette: p.Palette,
-		}
-	}
-	i := p.PixOffset(r.Min.X, r.Min.Y)
-	return &Paletted{
-		Pix:     p.Pix[i:],
-		Stride:  p.Stride,
-		Rect:    p.Rect.Intersect(r),
-		Palette: p.Palette,
-	}
-}
-
-// Opaque scans the entire image and reports whether it is fully opaque.
-func (p *Paletted) Opaque() bool {
-	var present [256]bool
-	i0, i1 := 0, p.Rect.Dx()
-	for y := p.Rect.Min.Y; y < p.Rect.Max.Y; y++ {
-		for _, c := range p.Pix[i0:i1] {
-			present[c] = true
-		}
-		i0 += p.Stride
-		i1 += p.Stride
-	}
-	for i, c := range p.Palette {
-		if !present[i] {
-			continue
-		}
-		_, _, _, a := c.RGBA()
-		if a != 0xffff {
-			return false
-		}
-	}
-	return true
-}
-
-// NewPaletted returns a new Paletted with the given width, height and palette.
-func NewPaletted(r Rectangle, p color.Palette) *Paletted {
-	w, h := r.Dx(), r.Dy()
-	pix := make([]uint8, 1*w*h)
-	return &Paletted{pix, 1 * w, r, p}
-}
diff --git a/third_party/gofrontend/libgo/go/image/image_test.go b/third_party/gofrontend/libgo/go/image/image_test.go
deleted file mode 100644
index 799c1a7..0000000
--- a/third_party/gofrontend/libgo/go/image/image_test.go
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package image
-
-import (
-	"image/color"
-	"testing"
-)
-
-type image interface {
-	Image
-	Opaque() bool
-	Set(int, int, color.Color)
-	SubImage(Rectangle) Image
-}
-
-func cmp(t *testing.T, cm color.Model, c0, c1 color.Color) bool {
-	r0, g0, b0, a0 := cm.Convert(c0).RGBA()
-	r1, g1, b1, a1 := cm.Convert(c1).RGBA()
-	return r0 == r1 && g0 == g1 && b0 == b1 && a0 == a1
-}
-
-func TestImage(t *testing.T) {
-	testImage := []image{
-		NewRGBA(Rect(0, 0, 10, 10)),
-		NewRGBA64(Rect(0, 0, 10, 10)),
-		NewNRGBA(Rect(0, 0, 10, 10)),
-		NewNRGBA64(Rect(0, 0, 10, 10)),
-		NewAlpha(Rect(0, 0, 10, 10)),
-		NewAlpha16(Rect(0, 0, 10, 10)),
-		NewGray(Rect(0, 0, 10, 10)),
-		NewGray16(Rect(0, 0, 10, 10)),
-		NewPaletted(Rect(0, 0, 10, 10), color.Palette{
-			Transparent,
-			Opaque,
-		}),
-	}
-	for _, m := range testImage {
-		if !Rect(0, 0, 10, 10).Eq(m.Bounds()) {
-			t.Errorf("%T: want bounds %v, got %v", m, Rect(0, 0, 10, 10), m.Bounds())
-			continue
-		}
-		if !cmp(t, m.ColorModel(), Transparent, m.At(6, 3)) {
-			t.Errorf("%T: at (6, 3), want a zero color, got %v", m, m.At(6, 3))
-			continue
-		}
-		m.Set(6, 3, Opaque)
-		if !cmp(t, m.ColorModel(), Opaque, m.At(6, 3)) {
-			t.Errorf("%T: at (6, 3), want a non-zero color, got %v", m, m.At(6, 3))
-			continue
-		}
-		if !m.SubImage(Rect(6, 3, 7, 4)).(image).Opaque() {
-			t.Errorf("%T: at (6, 3) was not opaque", m)
-			continue
-		}
-		m = m.SubImage(Rect(3, 2, 9, 8)).(image)
-		if !Rect(3, 2, 9, 8).Eq(m.Bounds()) {
-			t.Errorf("%T: sub-image want bounds %v, got %v", m, Rect(3, 2, 9, 8), m.Bounds())
-			continue
-		}
-		if !cmp(t, m.ColorModel(), Opaque, m.At(6, 3)) {
-			t.Errorf("%T: sub-image at (6, 3), want a non-zero color, got %v", m, m.At(6, 3))
-			continue
-		}
-		if !cmp(t, m.ColorModel(), Transparent, m.At(3, 3)) {
-			t.Errorf("%T: sub-image at (3, 3), want a zero color, got %v", m, m.At(3, 3))
-			continue
-		}
-		m.Set(3, 3, Opaque)
-		if !cmp(t, m.ColorModel(), Opaque, m.At(3, 3)) {
-			t.Errorf("%T: sub-image at (3, 3), want a non-zero color, got %v", m, m.At(3, 3))
-			continue
-		}
-		// Test that taking an empty sub-image starting at a corner does not panic.
-		m.SubImage(Rect(0, 0, 0, 0))
-		m.SubImage(Rect(10, 0, 10, 0))
-		m.SubImage(Rect(0, 10, 0, 10))
-		m.SubImage(Rect(10, 10, 10, 10))
-	}
-}
-
-func Test16BitsPerColorChannel(t *testing.T) {
-	testColorModel := []color.Model{
-		color.RGBA64Model,
-		color.NRGBA64Model,
-		color.Alpha16Model,
-		color.Gray16Model,
-	}
-	for _, cm := range testColorModel {
-		c := cm.Convert(color.RGBA64{0x1234, 0x1234, 0x1234, 0x1234}) // Premultiplied alpha.
-		r, _, _, _ := c.RGBA()
-		if r != 0x1234 {
-			t.Errorf("%T: want red value 0x%04x got 0x%04x", c, 0x1234, r)
-			continue
-		}
-	}
-	testImage := []image{
-		NewRGBA64(Rect(0, 0, 10, 10)),
-		NewNRGBA64(Rect(0, 0, 10, 10)),
-		NewAlpha16(Rect(0, 0, 10, 10)),
-		NewGray16(Rect(0, 0, 10, 10)),
-	}
-	for _, m := range testImage {
-		m.Set(1, 2, color.NRGBA64{0xffff, 0xffff, 0xffff, 0x1357}) // Non-premultiplied alpha.
-		r, _, _, _ := m.At(1, 2).RGBA()
-		if r != 0x1357 {
-			t.Errorf("%T: want red value 0x%04x got 0x%04x", m, 0x1357, r)
-			continue
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/internal/imageutil/gen.go b/third_party/gofrontend/libgo/go/image/internal/imageutil/gen.go
deleted file mode 100644
index fc1e707..0000000
--- a/third_party/gofrontend/libgo/go/image/internal/imageutil/gen.go
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package main
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"go/format"
-	"io/ioutil"
-	"log"
-	"os"
-)
-
-var debug = flag.Bool("debug", false, "")
-
-func main() {
-	flag.Parse()
-
-	w := new(bytes.Buffer)
-	w.WriteString(pre)
-	for _, sratio := range subsampleRatios {
-		fmt.Fprintf(w, sratioCase, sratio, sratioLines[sratio])
-	}
-	w.WriteString(post)
-
-	if *debug {
-		os.Stdout.Write(w.Bytes())
-		return
-	}
-	out, err := format.Source(w.Bytes())
-	if err != nil {
-		log.Fatal(err)
-	}
-	if err := ioutil.WriteFile("impl.go", out, 0660); err != nil {
-		log.Fatal(err)
-	}
-}
-
-const pre = `// generated by "go run gen.go". DO NOT EDIT.
-
-package imageutil
-
-import (
-	"image"
-)
-
-// DrawYCbCr draws the YCbCr source image on the RGBA destination image with
-// r.Min in dst aligned with sp in src. It reports whether the draw was
-// successful. If it returns false, no dst pixels were changed.
-//
-// This function assumes that r is entirely within dst's bounds and the
-// translation of r from dst coordinate space to src coordinate space is
-// entirely within src's bounds.
-func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Point) (ok bool) {
-	// This function exists in the image/internal/imageutil package because it
-	// is needed by both the image/draw and image/jpeg packages, but it doesn't
-	// seem right for one of those two to depend on the other.
-	//
-	// Another option is to have this code be exported in the image package,
-	// but we'd need to make sure we're totally happy with the API (for the
-	// rest of Go 1 compatibility), and decide if we want to have a more
-	// general purpose DrawToRGBA method for other image types. One possibility
-	// is:
-	//
-	// func (src *YCbCr) CopyToRGBA(dst *RGBA, dr, sr Rectangle) (effectiveDr, effectiveSr Rectangle)
-	//
-	// in the spirit of the built-in copy function for 1-dimensional slices,
-	// that also allowed a CopyFromRGBA method if needed.
-
-	x0 := (r.Min.X - dst.Rect.Min.X) * 4
-	x1 := (r.Max.X - dst.Rect.Min.X) * 4
-	y0 := r.Min.Y - dst.Rect.Min.Y
-	y1 := r.Max.Y - dst.Rect.Min.Y
-	switch src.SubsampleRatio {
-`
-
-const post = `
-	default:
-		return false
-	}
-	return true
-}
-`
-
-const sratioCase = `
-	case image.YCbCrSubsampleRatio%s:
-		for y, sy := y0, sp.Y; y != y1; y, sy = y+1, sy+1 {
-			dpix := dst.Pix[y*dst.Stride:]
-			yi := (sy-src.Rect.Min.Y)*src.YStride + (sp.X - src.Rect.Min.X)
-			%s
-
-				// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
-				yy1 := int32(src.Y[yi]) * 0x10100 // Convert 0x12 to 0x121200.
-				cb1 := int32(src.Cb[ci]) - 128
-				cr1 := int32(src.Cr[ci]) - 128
-				r := (yy1 + 91881*cr1) >> 16
-				g := (yy1 - 22554*cb1 - 46802*cr1) >> 16
-				b := (yy1 + 116130*cb1) >> 16
-				if r < 0 {
-					r = 0
-				} else if r > 255 {
-					r = 255
-				}
-				if g < 0 {
-					g = 0
-				} else if g > 255 {
-					g = 255
-				}
-				if b < 0 {
-					b = 0
-				} else if b > 255 {
-					b = 255
-				}
-
-				dpix[x+0] = uint8(r)
-				dpix[x+1] = uint8(g)
-				dpix[x+2] = uint8(b)
-				dpix[x+3] = 255
-			}
-		}
-`
-
-var subsampleRatios = []string{
-	"444",
-	"422",
-	"420",
-	"440",
-}
-
-var sratioLines = map[string]string{
-	"444": `
-		ci := (sy-src.Rect.Min.Y)*src.CStride + (sp.X - src.Rect.Min.X)
-		for x := x0; x != x1; x, yi, ci = x+4, yi+1, ci+1 {
-	`,
-	"422": `
-		ciBase := (sy-src.Rect.Min.Y)*src.CStride - src.Rect.Min.X/2
-		for x, sx := x0, sp.X; x != x1; x, sx, yi = x+4, sx+1, yi+1 {
-			ci := ciBase + sx/2
-	`,
-	"420": `
-		ciBase := (sy/2-src.Rect.Min.Y/2)*src.CStride - src.Rect.Min.X/2
-		for x, sx := x0, sp.X; x != x1; x, sx, yi = x+4, sx+1, yi+1 {
-			ci := ciBase + sx/2
-	`,
-	"440": `
-		ci := (sy/2-src.Rect.Min.Y/2)*src.CStride + (sp.X - src.Rect.Min.X)
-		for x := x0; x != x1; x, yi, ci = x+4, yi+1, ci+1 {
-	`,
-}
diff --git a/third_party/gofrontend/libgo/go/image/internal/imageutil/imageutil.go b/third_party/gofrontend/libgo/go/image/internal/imageutil/imageutil.go
deleted file mode 100644
index 10cef0c..0000000
--- a/third_party/gofrontend/libgo/go/image/internal/imageutil/imageutil.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:generate go run gen.go
-
-// Package imageutil contains code shared by image-related packages.
-package imageutil
diff --git a/third_party/gofrontend/libgo/go/image/internal/imageutil/impl.go b/third_party/gofrontend/libgo/go/image/internal/imageutil/impl.go
deleted file mode 100644
index fd7826d..0000000
--- a/third_party/gofrontend/libgo/go/image/internal/imageutil/impl.go
+++ /dev/null
@@ -1,196 +0,0 @@
-// generated by "go run gen.go". DO NOT EDIT.
-
-package imageutil
-
-import (
-	"image"
-)
-
-// DrawYCbCr draws the YCbCr source image on the RGBA destination image with
-// r.Min in dst aligned with sp in src. It reports whether the draw was
-// successful. If it returns false, no dst pixels were changed.
-//
-// This function assumes that r is entirely within dst's bounds and the
-// translation of r from dst coordinate space to src coordinate space is
-// entirely within src's bounds.
-func DrawYCbCr(dst *image.RGBA, r image.Rectangle, src *image.YCbCr, sp image.Point) (ok bool) {
-	// This function exists in the image/internal/imageutil package because it
-	// is needed by both the image/draw and image/jpeg packages, but it doesn't
-	// seem right for one of those two to depend on the other.
-	//
-	// Another option is to have this code be exported in the image package,
-	// but we'd need to make sure we're totally happy with the API (for the
-	// rest of Go 1 compatibility), and decide if we want to have a more
-	// general purpose DrawToRGBA method for other image types. One possibility
-	// is:
-	//
-	// func (src *YCbCr) CopyToRGBA(dst *RGBA, dr, sr Rectangle) (effectiveDr, effectiveSr Rectangle)
-	//
-	// in the spirit of the built-in copy function for 1-dimensional slices,
-	// that also allowed a CopyFromRGBA method if needed.
-
-	x0 := (r.Min.X - dst.Rect.Min.X) * 4
-	x1 := (r.Max.X - dst.Rect.Min.X) * 4
-	y0 := r.Min.Y - dst.Rect.Min.Y
-	y1 := r.Max.Y - dst.Rect.Min.Y
-	switch src.SubsampleRatio {
-
-	case image.YCbCrSubsampleRatio444:
-		for y, sy := y0, sp.Y; y != y1; y, sy = y+1, sy+1 {
-			dpix := dst.Pix[y*dst.Stride:]
-			yi := (sy-src.Rect.Min.Y)*src.YStride + (sp.X - src.Rect.Min.X)
-
-			ci := (sy-src.Rect.Min.Y)*src.CStride + (sp.X - src.Rect.Min.X)
-			for x := x0; x != x1; x, yi, ci = x+4, yi+1, ci+1 {
-
-				// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
-				yy1 := int32(src.Y[yi]) * 0x10100 // Convert 0x12 to 0x121200.
-				cb1 := int32(src.Cb[ci]) - 128
-				cr1 := int32(src.Cr[ci]) - 128
-				r := (yy1 + 91881*cr1) >> 16
-				g := (yy1 - 22554*cb1 - 46802*cr1) >> 16
-				b := (yy1 + 116130*cb1) >> 16
-				if r < 0 {
-					r = 0
-				} else if r > 255 {
-					r = 255
-				}
-				if g < 0 {
-					g = 0
-				} else if g > 255 {
-					g = 255
-				}
-				if b < 0 {
-					b = 0
-				} else if b > 255 {
-					b = 255
-				}
-
-				dpix[x+0] = uint8(r)
-				dpix[x+1] = uint8(g)
-				dpix[x+2] = uint8(b)
-				dpix[x+3] = 255
-			}
-		}
-
-	case image.YCbCrSubsampleRatio422:
-		for y, sy := y0, sp.Y; y != y1; y, sy = y+1, sy+1 {
-			dpix := dst.Pix[y*dst.Stride:]
-			yi := (sy-src.Rect.Min.Y)*src.YStride + (sp.X - src.Rect.Min.X)
-
-			ciBase := (sy-src.Rect.Min.Y)*src.CStride - src.Rect.Min.X/2
-			for x, sx := x0, sp.X; x != x1; x, sx, yi = x+4, sx+1, yi+1 {
-				ci := ciBase + sx/2
-
-				// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
-				yy1 := int32(src.Y[yi]) * 0x10100 // Convert 0x12 to 0x121200.
-				cb1 := int32(src.Cb[ci]) - 128
-				cr1 := int32(src.Cr[ci]) - 128
-				r := (yy1 + 91881*cr1) >> 16
-				g := (yy1 - 22554*cb1 - 46802*cr1) >> 16
-				b := (yy1 + 116130*cb1) >> 16
-				if r < 0 {
-					r = 0
-				} else if r > 255 {
-					r = 255
-				}
-				if g < 0 {
-					g = 0
-				} else if g > 255 {
-					g = 255
-				}
-				if b < 0 {
-					b = 0
-				} else if b > 255 {
-					b = 255
-				}
-
-				dpix[x+0] = uint8(r)
-				dpix[x+1] = uint8(g)
-				dpix[x+2] = uint8(b)
-				dpix[x+3] = 255
-			}
-		}
-
-	case image.YCbCrSubsampleRatio420:
-		for y, sy := y0, sp.Y; y != y1; y, sy = y+1, sy+1 {
-			dpix := dst.Pix[y*dst.Stride:]
-			yi := (sy-src.Rect.Min.Y)*src.YStride + (sp.X - src.Rect.Min.X)
-
-			ciBase := (sy/2-src.Rect.Min.Y/2)*src.CStride - src.Rect.Min.X/2
-			for x, sx := x0, sp.X; x != x1; x, sx, yi = x+4, sx+1, yi+1 {
-				ci := ciBase + sx/2
-
-				// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
-				yy1 := int32(src.Y[yi]) * 0x10100 // Convert 0x12 to 0x121200.
-				cb1 := int32(src.Cb[ci]) - 128
-				cr1 := int32(src.Cr[ci]) - 128
-				r := (yy1 + 91881*cr1) >> 16
-				g := (yy1 - 22554*cb1 - 46802*cr1) >> 16
-				b := (yy1 + 116130*cb1) >> 16
-				if r < 0 {
-					r = 0
-				} else if r > 255 {
-					r = 255
-				}
-				if g < 0 {
-					g = 0
-				} else if g > 255 {
-					g = 255
-				}
-				if b < 0 {
-					b = 0
-				} else if b > 255 {
-					b = 255
-				}
-
-				dpix[x+0] = uint8(r)
-				dpix[x+1] = uint8(g)
-				dpix[x+2] = uint8(b)
-				dpix[x+3] = 255
-			}
-		}
-
-	case image.YCbCrSubsampleRatio440:
-		for y, sy := y0, sp.Y; y != y1; y, sy = y+1, sy+1 {
-			dpix := dst.Pix[y*dst.Stride:]
-			yi := (sy-src.Rect.Min.Y)*src.YStride + (sp.X - src.Rect.Min.X)
-
-			ci := (sy/2-src.Rect.Min.Y/2)*src.CStride + (sp.X - src.Rect.Min.X)
-			for x := x0; x != x1; x, yi, ci = x+4, yi+1, ci+1 {
-
-				// This is an inline version of image/color/ycbcr.go's func YCbCrToRGB.
-				yy1 := int32(src.Y[yi]) * 0x10100 // Convert 0x12 to 0x121200.
-				cb1 := int32(src.Cb[ci]) - 128
-				cr1 := int32(src.Cr[ci]) - 128
-				r := (yy1 + 91881*cr1) >> 16
-				g := (yy1 - 22554*cb1 - 46802*cr1) >> 16
-				b := (yy1 + 116130*cb1) >> 16
-				if r < 0 {
-					r = 0
-				} else if r > 255 {
-					r = 255
-				}
-				if g < 0 {
-					g = 0
-				} else if g > 255 {
-					g = 255
-				}
-				if b < 0 {
-					b = 0
-				} else if b > 255 {
-					b = 255
-				}
-
-				dpix[x+0] = uint8(r)
-				dpix[x+1] = uint8(g)
-				dpix[x+2] = uint8(b)
-				dpix[x+3] = 255
-			}
-		}
-
-	default:
-		return false
-	}
-	return true
-}
diff --git a/third_party/gofrontend/libgo/go/image/jpeg/dct_test.go b/third_party/gofrontend/libgo/go/image/jpeg/dct_test.go
deleted file mode 100644
index 845e758..0000000
--- a/third_party/gofrontend/libgo/go/image/jpeg/dct_test.go
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package jpeg
-
-import (
-	"bytes"
-	"fmt"
-	"math"
-	"math/rand"
-	"testing"
-)
-
-func benchmarkDCT(b *testing.B, f func(*block)) {
-	b.StopTimer()
-	blocks := make([]block, 0, b.N*len(testBlocks))
-	for i := 0; i < b.N; i++ {
-		blocks = append(blocks, testBlocks[:]...)
-	}
-	b.StartTimer()
-	for i := range blocks {
-		f(&blocks[i])
-	}
-}
-
-func BenchmarkFDCT(b *testing.B) {
-	benchmarkDCT(b, fdct)
-}
-
-func BenchmarkIDCT(b *testing.B) {
-	benchmarkDCT(b, idct)
-}
-
-func TestDCT(t *testing.T) {
-	blocks := make([]block, len(testBlocks))
-	copy(blocks, testBlocks[:])
-
-	// Append some randomly generated blocks of varying sparseness.
-	r := rand.New(rand.NewSource(123))
-	for i := 0; i < 100; i++ {
-		b := block{}
-		n := r.Int() % 64
-		for j := 0; j < n; j++ {
-			b[r.Int()%len(b)] = r.Int31() % 256
-		}
-		blocks = append(blocks, b)
-	}
-
-	// Check that the FDCT and IDCT functions are inverses, after a scale and
-	// level shift. Scaling reduces the rounding errors in the conversion from
-	// floats to ints.
-	for i, b := range blocks {
-		got, want := b, b
-		for j := range got {
-			got[j] = (got[j] - 128) * 8
-		}
-		slowFDCT(&got)
-		slowIDCT(&got)
-		for j := range got {
-			got[j] = got[j]/8 + 128
-		}
-		if differ(&got, &want) {
-			t.Errorf("i=%d: IDCT(FDCT)\nsrc\n%s\ngot\n%s\nwant\n%s\n", i, &b, &got, &want)
-		}
-	}
-
-	// Check that the optimized and slow FDCT implementations agree.
-	// The fdct function already does a scale and level shift.
-	for i, b := range blocks {
-		got, want := b, b
-		fdct(&got)
-		for j := range want {
-			want[j] = (want[j] - 128) * 8
-		}
-		slowFDCT(&want)
-		if differ(&got, &want) {
-			t.Errorf("i=%d: FDCT\nsrc\n%s\ngot\n%s\nwant\n%s\n", i, &b, &got, &want)
-		}
-	}
-
-	// Check that the optimized and slow IDCT implementations agree.
-	for i, b := range blocks {
-		got, want := b, b
-		idct(&got)
-		slowIDCT(&want)
-		if differ(&got, &want) {
-			t.Errorf("i=%d: IDCT\nsrc\n%s\ngot\n%s\nwant\n%s\n", i, &b, &got, &want)
-		}
-	}
-}
-
-// differ reports whether any pair-wise elements in b0 and b1 differ by 2 or
-// more. That tolerance is because there isn't a single definitive decoding of
-// a given JPEG image, even before the YCbCr to RGB conversion; implementations
-// can have different IDCT rounding errors.
-func differ(b0, b1 *block) bool {
-	for i := range b0 {
-		delta := b0[i] - b1[i]
-		if delta < -2 || +2 < delta {
-			return true
-		}
-	}
-	return false
-}
-
-// alpha returns 1 if i is 0 and returns √2 otherwise.
-func alpha(i int) float64 {
-	if i == 0 {
-		return 1
-	}
-	return math.Sqrt2
-}
-
-var cosines [32]float64 // cosines[k] = cos(π/2 * k/8)
-
-func init() {
-	for k := range cosines {
-		cosines[k] = math.Cos(math.Pi * float64(k) / 16)
-	}
-}
-
-// slowFDCT performs the 8*8 2-dimensional forward discrete cosine transform:
-//
-//	dst[u,v] = (1/8) * Σ_x Σ_y alpha(u) * alpha(v) * src[x,y] *
-//		cos((π/2) * (2*x + 1) * u / 8) *
-//		cos((π/2) * (2*y + 1) * v / 8)
-//
-// x and y are in pixel space, and u and v are in transform space.
-//
-// b acts as both dst and src.
-func slowFDCT(b *block) {
-	var dst [blockSize]float64
-	for v := 0; v < 8; v++ {
-		for u := 0; u < 8; u++ {
-			sum := 0.0
-			for y := 0; y < 8; y++ {
-				for x := 0; x < 8; x++ {
-					sum += alpha(u) * alpha(v) * float64(b[8*y+x]) *
-						cosines[((2*x+1)*u)%32] *
-						cosines[((2*y+1)*v)%32]
-				}
-			}
-			dst[8*v+u] = sum / 8
-		}
-	}
-	// Convert from float64 to int32.
-	for i := range dst {
-		b[i] = int32(dst[i] + 0.5)
-	}
-}
-
-// slowIDCT performs the 8*8 2-dimensional inverse discrete cosine transform:
-//
-//	dst[x,y] = (1/8) * Σ_u Σ_v alpha(u) * alpha(v) * src[u,v] *
-//		cos((π/2) * (2*x + 1) * u / 8) *
-//		cos((π/2) * (2*y + 1) * v / 8)
-//
-// x and y are in pixel space, and u and v are in transform space.
-//
-// b acts as both dst and src.
-func slowIDCT(b *block) {
-	var dst [blockSize]float64
-	for y := 0; y < 8; y++ {
-		for x := 0; x < 8; x++ {
-			sum := 0.0
-			for v := 0; v < 8; v++ {
-				for u := 0; u < 8; u++ {
-					sum += alpha(u) * alpha(v) * float64(b[8*v+u]) *
-						cosines[((2*x+1)*u)%32] *
-						cosines[((2*y+1)*v)%32]
-				}
-			}
-			dst[8*y+x] = sum / 8
-		}
-	}
-	// Convert from float64 to int32.
-	for i := range dst {
-		b[i] = int32(dst[i] + 0.5)
-	}
-}
-
-func (b *block) String() string {
-	s := bytes.NewBuffer(nil)
-	fmt.Fprintf(s, "{\n")
-	for y := 0; y < 8; y++ {
-		fmt.Fprintf(s, "\t")
-		for x := 0; x < 8; x++ {
-			fmt.Fprintf(s, "0x%04x, ", uint16(b[8*y+x]))
-		}
-		fmt.Fprintln(s)
-	}
-	fmt.Fprintf(s, "}")
-	return s.String()
-}
-
-// testBlocks are the first 10 pre-IDCT blocks from ../testdata/video-001.jpeg.
-var testBlocks = [10]block{
-	{
-		0x7f, 0xf6, 0x01, 0x07, 0xff, 0x00, 0x00, 0x00,
-		0xf5, 0x01, 0xfa, 0x01, 0xfe, 0x00, 0x01, 0x00,
-		0x05, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x01, 0xff, 0xf8, 0x00, 0x01, 0xff, 0x00, 0x00,
-		0x00, 0x01, 0x00, 0x01, 0x00, 0xff, 0xff, 0x00,
-		0xff, 0x0c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01,
-		0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
-		0x01, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0xfe,
-	},
-	{
-		0x29, 0x07, 0x00, 0xfc, 0x01, 0x01, 0x00, 0x00,
-		0x07, 0x00, 0x03, 0x00, 0x01, 0x00, 0xff, 0xff,
-		0xff, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x04, 0x00, 0xff, 0x01, 0x00, 0x00,
-		0x01, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00,
-		0x01, 0xfa, 0x01, 0x00, 0x01, 0x00, 0x01, 0xff,
-		0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x02,
-	},
-	{
-		0xc5, 0xfa, 0x01, 0x00, 0x00, 0x01, 0x00, 0xff,
-		0x02, 0xff, 0x01, 0x00, 0x01, 0x00, 0xff, 0x00,
-		0xff, 0xff, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00,
-		0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
-		0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	},
-	{
-		0x86, 0x05, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00,
-		0xf2, 0x06, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00,
-		0xf6, 0xfa, 0xf9, 0x00, 0xff, 0x01, 0x00, 0x00,
-		0xf9, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
-		0xff, 0x00, 0x00, 0x01, 0x00, 0xff, 0x01, 0x00,
-		0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01,
-		0x00, 0x01, 0xff, 0x01, 0x00, 0xff, 0x00, 0x00,
-	},
-	{
-		0x24, 0xfe, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00,
-		0x08, 0xfd, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00,
-		0x06, 0x03, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00,
-		0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
-		0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-		0x01, 0x00, 0x01, 0xff, 0x00, 0x01, 0x00, 0x00,
-		0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x01,
-	},
-	{
-		0xcd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
-		0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
-		0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
-		0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
-		0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff,
-	},
-	{
-		0x81, 0xfe, 0x05, 0xff, 0x01, 0xff, 0x01, 0x00,
-		0xef, 0xf9, 0x00, 0xf9, 0x00, 0xff, 0x00, 0xff,
-		0x05, 0xf9, 0x00, 0xf8, 0x01, 0xff, 0x01, 0xff,
-		0x00, 0xff, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00,
-		0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
-		0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01,
-		0xff, 0x01, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00,
-		0x01, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
-	},
-	{
-		0x28, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x0b, 0x02, 0x01, 0x03, 0x00, 0xff, 0x00, 0x01,
-		0xfe, 0x02, 0x01, 0x03, 0xff, 0x00, 0x00, 0x00,
-		0x01, 0x00, 0xfd, 0x00, 0x01, 0x00, 0xff, 0x00,
-		0x01, 0xff, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x00, 0xff,
-		0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x01,
-	},
-	{
-		0xdf, 0xf9, 0xfe, 0x00, 0x03, 0x01, 0xff, 0xff,
-		0x04, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
-		0xff, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01,
-		0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00, 0x01,
-		0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
-		0x00, 0xff, 0x00, 0xff, 0x01, 0x00, 0x00, 0x01,
-		0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
-	},
-	{
-		0x88, 0xfd, 0x00, 0x00, 0xff, 0x00, 0x01, 0xff,
-		0xe1, 0x06, 0x06, 0x01, 0xff, 0x00, 0x01, 0x00,
-		0x08, 0x00, 0xfa, 0x00, 0xff, 0xff, 0xff, 0xff,
-		0x08, 0x01, 0x00, 0xff, 0x01, 0xff, 0x00, 0x00,
-		0xf5, 0xff, 0x00, 0x01, 0xff, 0x01, 0x01, 0x00,
-		0xff, 0xff, 0x01, 0xff, 0x01, 0x00, 0x01, 0x00,
-		0x00, 0x01, 0x01, 0xff, 0x00, 0xff, 0x00, 0x01,
-		0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00,
-	},
-}
diff --git a/third_party/gofrontend/libgo/go/image/jpeg/fdct.go b/third_party/gofrontend/libgo/go/image/jpeg/fdct.go
deleted file mode 100644
index 3f8be4e..0000000
--- a/third_party/gofrontend/libgo/go/image/jpeg/fdct.go
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package jpeg
-
-// This file implements a Forward Discrete Cosine Transformation.
-
-/*
-It is based on the code in jfdctint.c from the Independent JPEG Group,
-found at http://www.ijg.org/files/jpegsrc.v8c.tar.gz.
-
-The "LEGAL ISSUES" section of the README in that archive says:
-
-In plain English:
-
-1. We don't promise that this software works.  (But if you find any bugs,
-   please let us know!)
-2. You can use this software for whatever you want.  You don't have to pay us.
-3. You may not pretend that you wrote this software.  If you use it in a
-   program, you must acknowledge somewhere in your documentation that
-   you've used the IJG code.
-
-In legalese:
-
-The authors make NO WARRANTY or representation, either express or implied,
-with respect to this software, its quality, accuracy, merchantability, or
-fitness for a particular purpose.  This software is provided "AS IS", and you,
-its user, assume the entire risk as to its quality and accuracy.
-
-This software is copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding.
-All Rights Reserved except as specified below.
-
-Permission is hereby granted to use, copy, modify, and distribute this
-software (or portions thereof) for any purpose, without fee, subject to these
-conditions:
-(1) If any part of the source code for this software is distributed, then this
-README file must be included, with this copyright and no-warranty notice
-unaltered; and any additions, deletions, or changes to the original files
-must be clearly indicated in accompanying documentation.
-(2) If only executable code is distributed, then the accompanying
-documentation must state that "this software is based in part on the work of
-the Independent JPEG Group".
-(3) Permission for use of this software is granted only if the user accepts
-full responsibility for any undesirable consequences; the authors accept
-NO LIABILITY for damages of any kind.
-
-These conditions apply to any software derived from or based on the IJG code,
-not just to the unmodified library.  If you use our work, you ought to
-acknowledge us.
-
-Permission is NOT granted for the use of any IJG author's name or company name
-in advertising or publicity relating to this software or products derived from
-it.  This software may be referred to only as "the Independent JPEG Group's
-software".
-
-We specifically permit and encourage the use of this software as the basis of
-commercial products, provided that all warranty or liability claims are
-assumed by the product vendor.
-*/
-
-// Trigonometric constants in 13-bit fixed point format.
-const (
-	fix_0_298631336 = 2446
-	fix_0_390180644 = 3196
-	fix_0_541196100 = 4433
-	fix_0_765366865 = 6270
-	fix_0_899976223 = 7373
-	fix_1_175875602 = 9633
-	fix_1_501321110 = 12299
-	fix_1_847759065 = 15137
-	fix_1_961570560 = 16069
-	fix_2_053119869 = 16819
-	fix_2_562915447 = 20995
-	fix_3_072711026 = 25172
-)
-
-const (
-	constBits     = 13
-	pass1Bits     = 2
-	centerJSample = 128
-)
-
-// fdct performs a forward DCT on an 8x8 block of coefficients, including a
-// level shift.
-func fdct(b *block) {
-	// Pass 1: process rows.
-	for y := 0; y < 8; y++ {
-		x0 := b[y*8+0]
-		x1 := b[y*8+1]
-		x2 := b[y*8+2]
-		x3 := b[y*8+3]
-		x4 := b[y*8+4]
-		x5 := b[y*8+5]
-		x6 := b[y*8+6]
-		x7 := b[y*8+7]
-
-		tmp0 := x0 + x7
-		tmp1 := x1 + x6
-		tmp2 := x2 + x5
-		tmp3 := x3 + x4
-
-		tmp10 := tmp0 + tmp3
-		tmp12 := tmp0 - tmp3
-		tmp11 := tmp1 + tmp2
-		tmp13 := tmp1 - tmp2
-
-		tmp0 = x0 - x7
-		tmp1 = x1 - x6
-		tmp2 = x2 - x5
-		tmp3 = x3 - x4
-
-		b[y*8+0] = (tmp10 + tmp11 - 8*centerJSample) << pass1Bits
-		b[y*8+4] = (tmp10 - tmp11) << pass1Bits
-		z1 := (tmp12 + tmp13) * fix_0_541196100
-		z1 += 1 << (constBits - pass1Bits - 1)
-		b[y*8+2] = (z1 + tmp12*fix_0_765366865) >> (constBits - pass1Bits)
-		b[y*8+6] = (z1 - tmp13*fix_1_847759065) >> (constBits - pass1Bits)
-
-		tmp10 = tmp0 + tmp3
-		tmp11 = tmp1 + tmp2
-		tmp12 = tmp0 + tmp2
-		tmp13 = tmp1 + tmp3
-		z1 = (tmp12 + tmp13) * fix_1_175875602
-		z1 += 1 << (constBits - pass1Bits - 1)
-		tmp0 = tmp0 * fix_1_501321110
-		tmp1 = tmp1 * fix_3_072711026
-		tmp2 = tmp2 * fix_2_053119869
-		tmp3 = tmp3 * fix_0_298631336
-		tmp10 = tmp10 * -fix_0_899976223
-		tmp11 = tmp11 * -fix_2_562915447
-		tmp12 = tmp12 * -fix_0_390180644
-		tmp13 = tmp13 * -fix_1_961570560
-
-		tmp12 += z1
-		tmp13 += z1
-		b[y*8+1] = (tmp0 + tmp10 + tmp12) >> (constBits - pass1Bits)
-		b[y*8+3] = (tmp1 + tmp11 + tmp13) >> (constBits - pass1Bits)
-		b[y*8+5] = (tmp2 + tmp11 + tmp12) >> (constBits - pass1Bits)
-		b[y*8+7] = (tmp3 + tmp10 + tmp13) >> (constBits - pass1Bits)
-	}
-	// Pass 2: process columns.
-	// We remove pass1Bits scaling, but leave results scaled up by an overall factor of 8.
-	for x := 0; x < 8; x++ {
-		tmp0 := b[0*8+x] + b[7*8+x]
-		tmp1 := b[1*8+x] + b[6*8+x]
-		tmp2 := b[2*8+x] + b[5*8+x]
-		tmp3 := b[3*8+x] + b[4*8+x]
-
-		tmp10 := tmp0 + tmp3 + 1<<(pass1Bits-1)
-		tmp12 := tmp0 - tmp3
-		tmp11 := tmp1 + tmp2
-		tmp13 := tmp1 - tmp2
-
-		tmp0 = b[0*8+x] - b[7*8+x]
-		tmp1 = b[1*8+x] - b[6*8+x]
-		tmp2 = b[2*8+x] - b[5*8+x]
-		tmp3 = b[3*8+x] - b[4*8+x]
-
-		b[0*8+x] = (tmp10 + tmp11) >> pass1Bits
-		b[4*8+x] = (tmp10 - tmp11) >> pass1Bits
-
-		z1 := (tmp12 + tmp13) * fix_0_541196100
-		z1 += 1 << (constBits + pass1Bits - 1)
-		b[2*8+x] = (z1 + tmp12*fix_0_765366865) >> (constBits + pass1Bits)
-		b[6*8+x] = (z1 - tmp13*fix_1_847759065) >> (constBits + pass1Bits)
-
-		tmp10 = tmp0 + tmp3
-		tmp11 = tmp1 + tmp2
-		tmp12 = tmp0 + tmp2
-		tmp13 = tmp1 + tmp3
-		z1 = (tmp12 + tmp13) * fix_1_175875602
-		z1 += 1 << (constBits + pass1Bits - 1)
-		tmp0 = tmp0 * fix_1_501321110
-		tmp1 = tmp1 * fix_3_072711026
-		tmp2 = tmp2 * fix_2_053119869
-		tmp3 = tmp3 * fix_0_298631336
-		tmp10 = tmp10 * -fix_0_899976223
-		tmp11 = tmp11 * -fix_2_562915447
-		tmp12 = tmp12 * -fix_0_390180644
-		tmp13 = tmp13 * -fix_1_961570560
-
-		tmp12 += z1
-		tmp13 += z1
-		b[1*8+x] = (tmp0 + tmp10 + tmp12) >> (constBits + pass1Bits)
-		b[3*8+x] = (tmp1 + tmp11 + tmp13) >> (constBits + pass1Bits)
-		b[5*8+x] = (tmp2 + tmp11 + tmp12) >> (constBits + pass1Bits)
-		b[7*8+x] = (tmp3 + tmp10 + tmp13) >> (constBits + pass1Bits)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/jpeg/huffman.go b/third_party/gofrontend/libgo/go/image/jpeg/huffman.go
deleted file mode 100644
index 4f8fe8e..0000000
--- a/third_party/gofrontend/libgo/go/image/jpeg/huffman.go
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package jpeg
-
-import (
-	"io"
-)
-
-// maxCodeLength is the maximum (inclusive) number of bits in a Huffman code.
-const maxCodeLength = 16
-
-// maxNCodes is the maximum (inclusive) number of codes in a Huffman tree.
-const maxNCodes = 256
-
-// lutSize is the log-2 size of the Huffman decoder's look-up table.
-const lutSize = 8
-
-// huffman is a Huffman decoder, specified in section C.
-type huffman struct {
-	// length is the number of codes in the tree.
-	nCodes int32
-	// lut is the look-up table for the next lutSize bits in the bit-stream.
-	// The high 8 bits of the uint16 are the encoded value. The low 8 bits
-	// are 1 plus the code length, or 0 if the value is too large to fit in
-	// lutSize bits.
-	lut [1 << lutSize]uint16
-	// vals are the decoded values, sorted by their encoding.
-	vals [maxNCodes]uint8
-	// minCodes[i] is the minimum code of length i, or -1 if there are no
-	// codes of that length.
-	minCodes [maxCodeLength]int32
-	// maxCodes[i] is the maximum code of length i, or -1 if there are no
-	// codes of that length.
-	maxCodes [maxCodeLength]int32
-	// valsIndices[i] is the index into vals of minCodes[i].
-	valsIndices [maxCodeLength]int32
-}
-
-// errShortHuffmanData means that an unexpected EOF occurred while decoding
-// Huffman data.
-var errShortHuffmanData = FormatError("short Huffman data")
-
-// ensureNBits reads bytes from the byte buffer to ensure that d.bits.n is at
-// least n. For best performance (avoiding function calls inside hot loops),
-// the caller is the one responsible for first checking that d.bits.n < n.
-func (d *decoder) ensureNBits(n int32) error {
-	for {
-		c, err := d.readByteStuffedByte()
-		if err != nil {
-			if err == io.EOF {
-				return errShortHuffmanData
-			}
-			return err
-		}
-		d.bits.a = d.bits.a<<8 | uint32(c)
-		d.bits.n += 8
-		if d.bits.m == 0 {
-			d.bits.m = 1 << 7
-		} else {
-			d.bits.m <<= 8
-		}
-		if d.bits.n >= n {
-			break
-		}
-	}
-	return nil
-}
-
-// receiveExtend is the composition of RECEIVE and EXTEND, specified in section
-// F.2.2.1.
-func (d *decoder) receiveExtend(t uint8) (int32, error) {
-	if d.bits.n < int32(t) {
-		if err := d.ensureNBits(int32(t)); err != nil {
-			return 0, err
-		}
-	}
-	d.bits.n -= int32(t)
-	d.bits.m >>= t
-	s := int32(1) << t
-	x := int32(d.bits.a>>uint8(d.bits.n)) & (s - 1)
-	if x < s>>1 {
-		x += ((-1) << t) + 1
-	}
-	return x, nil
-}
-
-// processDHT processes a Define Huffman Table marker, and initializes a huffman
-// struct from its contents. Specified in section B.2.4.2.
-func (d *decoder) processDHT(n int) error {
-	for n > 0 {
-		if n < 17 {
-			return FormatError("DHT has wrong length")
-		}
-		if err := d.readFull(d.tmp[:17]); err != nil {
-			return err
-		}
-		tc := d.tmp[0] >> 4
-		if tc > maxTc {
-			return FormatError("bad Tc value")
-		}
-		th := d.tmp[0] & 0x0f
-		if th > maxTh || !d.progressive && th > 1 {
-			return FormatError("bad Th value")
-		}
-		h := &d.huff[tc][th]
-
-		// Read nCodes and h.vals (and derive h.nCodes).
-		// nCodes[i] is the number of codes with code length i.
-		// h.nCodes is the total number of codes.
-		h.nCodes = 0
-		var nCodes [maxCodeLength]int32
-		for i := range nCodes {
-			nCodes[i] = int32(d.tmp[i+1])
-			h.nCodes += nCodes[i]
-		}
-		if h.nCodes == 0 {
-			return FormatError("Huffman table has zero length")
-		}
-		if h.nCodes > maxNCodes {
-			return FormatError("Huffman table has excessive length")
-		}
-		n -= int(h.nCodes) + 17
-		if n < 0 {
-			return FormatError("DHT has wrong length")
-		}
-		if err := d.readFull(h.vals[:h.nCodes]); err != nil {
-			return err
-		}
-
-		// Derive the look-up table.
-		for i := range h.lut {
-			h.lut[i] = 0
-		}
-		var x, code uint32
-		for i := uint32(0); i < lutSize; i++ {
-			code <<= 1
-			for j := int32(0); j < nCodes[i]; j++ {
-				// The codeLength is 1+i, so shift code by 8-(1+i) to
-				// calculate the high bits for every 8-bit sequence
-				// whose codeLength's high bits matches code.
-				// The high 8 bits of lutValue are the encoded value.
-				// The low 8 bits are 1 plus the codeLength.
-				base := uint8(code << (7 - i))
-				lutValue := uint16(h.vals[x])<<8 | uint16(2+i)
-				for k := uint8(0); k < 1<<(7-i); k++ {
-					h.lut[base|k] = lutValue
-				}
-				code++
-				x++
-			}
-		}
-
-		// Derive minCodes, maxCodes, and valsIndices.
-		var c, index int32
-		for i, n := range nCodes {
-			if n == 0 {
-				h.minCodes[i] = -1
-				h.maxCodes[i] = -1
-				h.valsIndices[i] = -1
-			} else {
-				h.minCodes[i] = c
-				h.maxCodes[i] = c + n - 1
-				h.valsIndices[i] = index
-				c += n
-				index += n
-			}
-			c <<= 1
-		}
-	}
-	return nil
-}
-
-// decodeHuffman returns the next Huffman-coded value from the bit-stream,
-// decoded according to h.
-func (d *decoder) decodeHuffman(h *huffman) (uint8, error) {
-	if h.nCodes == 0 {
-		return 0, FormatError("uninitialized Huffman table")
-	}
-
-	if d.bits.n < 8 {
-		if err := d.ensureNBits(8); err != nil {
-			if err != errMissingFF00 && err != errShortHuffmanData {
-				return 0, err
-			}
-			// There are no more bytes of data in this segment, but we may still
-			// be able to read the next symbol out of the previously read bits.
-			// First, undo the readByte that the ensureNBits call made.
-			if d.bytes.nUnreadable != 0 {
-				d.unreadByteStuffedByte()
-			}
-			goto slowPath
-		}
-	}
-	if v := h.lut[(d.bits.a>>uint32(d.bits.n-lutSize))&0xff]; v != 0 {
-		n := (v & 0xff) - 1
-		d.bits.n -= int32(n)
-		d.bits.m >>= n
-		return uint8(v >> 8), nil
-	}
-
-slowPath:
-	for i, code := 0, int32(0); i < maxCodeLength; i++ {
-		if d.bits.n == 0 {
-			if err := d.ensureNBits(1); err != nil {
-				return 0, err
-			}
-		}
-		if d.bits.a&d.bits.m != 0 {
-			code |= 1
-		}
-		d.bits.n--
-		d.bits.m >>= 1
-		if code <= h.maxCodes[i] {
-			return h.vals[h.valsIndices[i]+code-h.minCodes[i]], nil
-		}
-		code <<= 1
-	}
-	return 0, FormatError("bad Huffman code")
-}
-
-func (d *decoder) decodeBit() (bool, error) {
-	if d.bits.n == 0 {
-		if err := d.ensureNBits(1); err != nil {
-			return false, err
-		}
-	}
-	ret := d.bits.a&d.bits.m != 0
-	d.bits.n--
-	d.bits.m >>= 1
-	return ret, nil
-}
-
-func (d *decoder) decodeBits(n int32) (uint32, error) {
-	if d.bits.n < n {
-		if err := d.ensureNBits(n); err != nil {
-			return 0, err
-		}
-	}
-	ret := d.bits.a >> uint32(d.bits.n-n)
-	ret &= (1 << uint32(n)) - 1
-	d.bits.n -= n
-	d.bits.m >>= uint32(n)
-	return ret, nil
-}
diff --git a/third_party/gofrontend/libgo/go/image/jpeg/idct.go b/third_party/gofrontend/libgo/go/image/jpeg/idct.go
deleted file mode 100644
index 46fcaec..0000000
--- a/third_party/gofrontend/libgo/go/image/jpeg/idct.go
+++ /dev/null
@@ -1,192 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package jpeg
-
-// This is a Go translation of idct.c from
-//
-// http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_IEC_13818-4_2004_Conformance_Testing/Video/verifier/mpeg2decode_960109.tar.gz
-//
-// which carries the following notice:
-
-/* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
-
-/*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose.  In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders.  Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
-
-const blockSize = 64 // A DCT block is 8x8.
-
-type block [blockSize]int32
-
-const (
-	w1 = 2841 // 2048*sqrt(2)*cos(1*pi/16)
-	w2 = 2676 // 2048*sqrt(2)*cos(2*pi/16)
-	w3 = 2408 // 2048*sqrt(2)*cos(3*pi/16)
-	w5 = 1609 // 2048*sqrt(2)*cos(5*pi/16)
-	w6 = 1108 // 2048*sqrt(2)*cos(6*pi/16)
-	w7 = 565  // 2048*sqrt(2)*cos(7*pi/16)
-
-	w1pw7 = w1 + w7
-	w1mw7 = w1 - w7
-	w2pw6 = w2 + w6
-	w2mw6 = w2 - w6
-	w3pw5 = w3 + w5
-	w3mw5 = w3 - w5
-
-	r2 = 181 // 256/sqrt(2)
-)
-
-// idct performs a 2-D Inverse Discrete Cosine Transformation.
-//
-// The input coefficients should already have been multiplied by the
-// appropriate quantization table. We use fixed-point computation, with the
-// number of bits for the fractional component varying over the intermediate
-// stages.
-//
-// For more on the actual algorithm, see Z. Wang, "Fast algorithms for the
-// discrete W transform and for the discrete Fourier transform", IEEE Trans. on
-// ASSP, Vol. ASSP- 32, pp. 803-816, Aug. 1984.
-func idct(src *block) {
-	// Horizontal 1-D IDCT.
-	for y := 0; y < 8; y++ {
-		y8 := y * 8
-		// If all the AC components are zero, then the IDCT is trivial.
-		if src[y8+1] == 0 && src[y8+2] == 0 && src[y8+3] == 0 &&
-			src[y8+4] == 0 && src[y8+5] == 0 && src[y8+6] == 0 && src[y8+7] == 0 {
-			dc := src[y8+0] << 3
-			src[y8+0] = dc
-			src[y8+1] = dc
-			src[y8+2] = dc
-			src[y8+3] = dc
-			src[y8+4] = dc
-			src[y8+5] = dc
-			src[y8+6] = dc
-			src[y8+7] = dc
-			continue
-		}
-
-		// Prescale.
-		x0 := (src[y8+0] << 11) + 128
-		x1 := src[y8+4] << 11
-		x2 := src[y8+6]
-		x3 := src[y8+2]
-		x4 := src[y8+1]
-		x5 := src[y8+7]
-		x6 := src[y8+5]
-		x7 := src[y8+3]
-
-		// Stage 1.
-		x8 := w7 * (x4 + x5)
-		x4 = x8 + w1mw7*x4
-		x5 = x8 - w1pw7*x5
-		x8 = w3 * (x6 + x7)
-		x6 = x8 - w3mw5*x6
-		x7 = x8 - w3pw5*x7
-
-		// Stage 2.
-		x8 = x0 + x1
-		x0 -= x1
-		x1 = w6 * (x3 + x2)
-		x2 = x1 - w2pw6*x2
-		x3 = x1 + w2mw6*x3
-		x1 = x4 + x6
-		x4 -= x6
-		x6 = x5 + x7
-		x5 -= x7
-
-		// Stage 3.
-		x7 = x8 + x3
-		x8 -= x3
-		x3 = x0 + x2
-		x0 -= x2
-		x2 = (r2*(x4+x5) + 128) >> 8
-		x4 = (r2*(x4-x5) + 128) >> 8
-
-		// Stage 4.
-		src[y8+0] = (x7 + x1) >> 8
-		src[y8+1] = (x3 + x2) >> 8
-		src[y8+2] = (x0 + x4) >> 8
-		src[y8+3] = (x8 + x6) >> 8
-		src[y8+4] = (x8 - x6) >> 8
-		src[y8+5] = (x0 - x4) >> 8
-		src[y8+6] = (x3 - x2) >> 8
-		src[y8+7] = (x7 - x1) >> 8
-	}
-
-	// Vertical 1-D IDCT.
-	for x := 0; x < 8; x++ {
-		// Similar to the horizontal 1-D IDCT case, if all the AC components are zero, then the IDCT is trivial.
-		// However, after performing the horizontal 1-D IDCT, there are typically non-zero AC components, so
-		// we do not bother to check for the all-zero case.
-
-		// Prescale.
-		y0 := (src[8*0+x] << 8) + 8192
-		y1 := src[8*4+x] << 8
-		y2 := src[8*6+x]
-		y3 := src[8*2+x]
-		y4 := src[8*1+x]
-		y5 := src[8*7+x]
-		y6 := src[8*5+x]
-		y7 := src[8*3+x]
-
-		// Stage 1.
-		y8 := w7*(y4+y5) + 4
-		y4 = (y8 + w1mw7*y4) >> 3
-		y5 = (y8 - w1pw7*y5) >> 3
-		y8 = w3*(y6+y7) + 4
-		y6 = (y8 - w3mw5*y6) >> 3
-		y7 = (y8 - w3pw5*y7) >> 3
-
-		// Stage 2.
-		y8 = y0 + y1
-		y0 -= y1
-		y1 = w6*(y3+y2) + 4
-		y2 = (y1 - w2pw6*y2) >> 3
-		y3 = (y1 + w2mw6*y3) >> 3
-		y1 = y4 + y6
-		y4 -= y6
-		y6 = y5 + y7
-		y5 -= y7
-
-		// Stage 3.
-		y7 = y8 + y3
-		y8 -= y3
-		y3 = y0 + y2
-		y0 -= y2
-		y2 = (r2*(y4+y5) + 128) >> 8
-		y4 = (r2*(y4-y5) + 128) >> 8
-
-		// Stage 4.
-		src[8*0+x] = (y7 + y1) >> 14
-		src[8*1+x] = (y3 + y2) >> 14
-		src[8*2+x] = (y0 + y4) >> 14
-		src[8*3+x] = (y8 + y6) >> 14
-		src[8*4+x] = (y8 - y6) >> 14
-		src[8*5+x] = (y0 - y4) >> 14
-		src[8*6+x] = (y3 - y2) >> 14
-		src[8*7+x] = (y7 - y1) >> 14
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/jpeg/reader.go b/third_party/gofrontend/libgo/go/image/jpeg/reader.go
deleted file mode 100644
index adf97ab..0000000
--- a/third_party/gofrontend/libgo/go/image/jpeg/reader.go
+++ /dev/null
@@ -1,802 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package jpeg implements a JPEG image decoder and encoder.
-//
-// JPEG is defined in ITU-T T.81: http://www.w3.org/Graphics/JPEG/itu-t81.pdf.
-package jpeg
-
-import (
-	"image"
-	"image/color"
-	"image/internal/imageutil"
-	"io"
-)
-
-// TODO(nigeltao): fix up the doc comment style so that sentences start with
-// the name of the type or function that they annotate.
-
-// A FormatError reports that the input is not a valid JPEG.
-type FormatError string
-
-func (e FormatError) Error() string { return "invalid JPEG format: " + string(e) }
-
-// An UnsupportedError reports that the input uses a valid but unimplemented JPEG feature.
-type UnsupportedError string
-
-func (e UnsupportedError) Error() string { return "unsupported JPEG feature: " + string(e) }
-
-var errUnsupportedSubsamplingRatio = UnsupportedError("luma/chroma subsampling ratio")
-
-// Component specification, specified in section B.2.2.
-type component struct {
-	h  int   // Horizontal sampling factor.
-	v  int   // Vertical sampling factor.
-	c  uint8 // Component identifier.
-	tq uint8 // Quantization table destination selector.
-}
-
-const (
-	dcTable = 0
-	acTable = 1
-	maxTc   = 1
-	maxTh   = 3
-	maxTq   = 3
-
-	maxComponents = 4
-)
-
-const (
-	sof0Marker = 0xc0 // Start Of Frame (Baseline).
-	sof1Marker = 0xc1 // Start Of Frame (Extended Sequential).
-	sof2Marker = 0xc2 // Start Of Frame (Progressive).
-	dhtMarker  = 0xc4 // Define Huffman Table.
-	rst0Marker = 0xd0 // ReSTart (0).
-	rst7Marker = 0xd7 // ReSTart (7).
-	soiMarker  = 0xd8 // Start Of Image.
-	eoiMarker  = 0xd9 // End Of Image.
-	sosMarker  = 0xda // Start Of Scan.
-	dqtMarker  = 0xdb // Define Quantization Table.
-	driMarker  = 0xdd // Define Restart Interval.
-	comMarker  = 0xfe // COMment.
-	// "APPlication specific" markers aren't part of the JPEG spec per se,
-	// but in practice, their use is described at
-	// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/JPEG.html
-	app0Marker  = 0xe0
-	app14Marker = 0xee
-	app15Marker = 0xef
-)
-
-// See http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/JPEG.html#Adobe
-const (
-	adobeTransformUnknown = 0
-	adobeTransformYCbCr   = 1
-	adobeTransformYCbCrK  = 2
-)
-
-// unzig maps from the zig-zag ordering to the natural ordering. For example,
-// unzig[3] is the column and row of the fourth element in zig-zag order. The
-// value is 16, which means first column (16%8 == 0) and third row (16/8 == 2).
-var unzig = [blockSize]int{
-	0, 1, 8, 16, 9, 2, 3, 10,
-	17, 24, 32, 25, 18, 11, 4, 5,
-	12, 19, 26, 33, 40, 48, 41, 34,
-	27, 20, 13, 6, 7, 14, 21, 28,
-	35, 42, 49, 56, 57, 50, 43, 36,
-	29, 22, 15, 23, 30, 37, 44, 51,
-	58, 59, 52, 45, 38, 31, 39, 46,
-	53, 60, 61, 54, 47, 55, 62, 63,
-}
-
-// Deprecated: Reader is deprecated.
-type Reader interface {
-	io.ByteReader
-	io.Reader
-}
-
-// bits holds the unprocessed bits that have been taken from the byte-stream.
-// The n least significant bits of a form the unread bits, to be read in MSB to
-// LSB order.
-type bits struct {
-	a uint32 // accumulator.
-	m uint32 // mask. m==1<<(n-1) when n>0, with m==0 when n==0.
-	n int32  // the number of unread bits in a.
-}
-
-type decoder struct {
-	r    io.Reader
-	bits bits
-	// bytes is a byte buffer, similar to a bufio.Reader, except that it
-	// has to be able to unread more than 1 byte, due to byte stuffing.
-	// Byte stuffing is specified in section F.1.2.3.
-	bytes struct {
-		// buf[i:j] are the buffered bytes read from the underlying
-		// io.Reader that haven't yet been passed further on.
-		buf  [4096]byte
-		i, j int
-		// nUnreadable is the number of bytes to back up i after
-		// overshooting. It can be 0, 1 or 2.
-		nUnreadable int
-	}
-	width, height int
-
-	img1        *image.Gray
-	img3        *image.YCbCr
-	blackPix    []byte
-	blackStride int
-
-	ri                  int // Restart Interval.
-	nComp               int
-	progressive         bool
-	jfif                bool
-	adobeTransformValid bool
-	adobeTransform      uint8
-	eobRun              uint16 // End-of-Band run, specified in section G.1.2.2.
-
-	comp       [maxComponents]component
-	progCoeffs [maxComponents][]block // Saved state between progressive-mode scans.
-	huff       [maxTc + 1][maxTh + 1]huffman
-	quant      [maxTq + 1]block // Quantization tables, in zig-zag order.
-	tmp        [2 * blockSize]byte
-}
-
-// fill fills up the d.bytes.buf buffer from the underlying io.Reader. It
-// should only be called when there are no unread bytes in d.bytes.
-func (d *decoder) fill() error {
-	if d.bytes.i != d.bytes.j {
-		panic("jpeg: fill called when unread bytes exist")
-	}
-	// Move the last 2 bytes to the start of the buffer, in case we need
-	// to call unreadByteStuffedByte.
-	if d.bytes.j > 2 {
-		d.bytes.buf[0] = d.bytes.buf[d.bytes.j-2]
-		d.bytes.buf[1] = d.bytes.buf[d.bytes.j-1]
-		d.bytes.i, d.bytes.j = 2, 2
-	}
-	// Fill in the rest of the buffer.
-	n, err := d.r.Read(d.bytes.buf[d.bytes.j:])
-	d.bytes.j += n
-	if n > 0 {
-		err = nil
-	}
-	return err
-}
-
-// unreadByteStuffedByte undoes the most recent readByteStuffedByte call,
-// giving a byte of data back from d.bits to d.bytes. The Huffman look-up table
-// requires at least 8 bits for look-up, which means that Huffman decoding can
-// sometimes overshoot and read one or two too many bytes. Two-byte overshoot
-// can happen when expecting to read a 0xff 0x00 byte-stuffed byte.
-func (d *decoder) unreadByteStuffedByte() {
-	d.bytes.i -= d.bytes.nUnreadable
-	d.bytes.nUnreadable = 0
-	if d.bits.n >= 8 {
-		d.bits.a >>= 8
-		d.bits.n -= 8
-		d.bits.m >>= 8
-	}
-}
-
-// readByte returns the next byte, whether buffered or not buffered. It does
-// not care about byte stuffing.
-func (d *decoder) readByte() (x byte, err error) {
-	for d.bytes.i == d.bytes.j {
-		if err = d.fill(); err != nil {
-			return 0, err
-		}
-	}
-	x = d.bytes.buf[d.bytes.i]
-	d.bytes.i++
-	d.bytes.nUnreadable = 0
-	return x, nil
-}
-
-// errMissingFF00 means that readByteStuffedByte encountered an 0xff byte (a
-// marker byte) that wasn't the expected byte-stuffed sequence 0xff, 0x00.
-var errMissingFF00 = FormatError("missing 0xff00 sequence")
-
-// readByteStuffedByte is like readByte but is for byte-stuffed Huffman data.
-func (d *decoder) readByteStuffedByte() (x byte, err error) {
-	// Take the fast path if d.bytes.buf contains at least two bytes.
-	if d.bytes.i+2 <= d.bytes.j {
-		x = d.bytes.buf[d.bytes.i]
-		d.bytes.i++
-		d.bytes.nUnreadable = 1
-		if x != 0xff {
-			return x, err
-		}
-		if d.bytes.buf[d.bytes.i] != 0x00 {
-			return 0, errMissingFF00
-		}
-		d.bytes.i++
-		d.bytes.nUnreadable = 2
-		return 0xff, nil
-	}
-
-	d.bytes.nUnreadable = 0
-
-	x, err = d.readByte()
-	if err != nil {
-		return 0, err
-	}
-	d.bytes.nUnreadable = 1
-	if x != 0xff {
-		return x, nil
-	}
-
-	x, err = d.readByte()
-	if err != nil {
-		return 0, err
-	}
-	d.bytes.nUnreadable = 2
-	if x != 0x00 {
-		return 0, errMissingFF00
-	}
-	return 0xff, nil
-}
-
-// readFull reads exactly len(p) bytes into p. It does not care about byte
-// stuffing.
-func (d *decoder) readFull(p []byte) error {
-	// Unread the overshot bytes, if any.
-	if d.bytes.nUnreadable != 0 {
-		if d.bits.n >= 8 {
-			d.unreadByteStuffedByte()
-		}
-		d.bytes.nUnreadable = 0
-	}
-
-	for {
-		n := copy(p, d.bytes.buf[d.bytes.i:d.bytes.j])
-		p = p[n:]
-		d.bytes.i += n
-		if len(p) == 0 {
-			break
-		}
-		if err := d.fill(); err != nil {
-			if err == io.EOF {
-				err = io.ErrUnexpectedEOF
-			}
-			return err
-		}
-	}
-	return nil
-}
-
-// ignore ignores the next n bytes.
-func (d *decoder) ignore(n int) error {
-	// Unread the overshot bytes, if any.
-	if d.bytes.nUnreadable != 0 {
-		if d.bits.n >= 8 {
-			d.unreadByteStuffedByte()
-		}
-		d.bytes.nUnreadable = 0
-	}
-
-	for {
-		m := d.bytes.j - d.bytes.i
-		if m > n {
-			m = n
-		}
-		d.bytes.i += m
-		n -= m
-		if n == 0 {
-			break
-		}
-		if err := d.fill(); err != nil {
-			if err == io.EOF {
-				err = io.ErrUnexpectedEOF
-			}
-			return err
-		}
-	}
-	return nil
-}
-
-// Specified in section B.2.2.
-func (d *decoder) processSOF(n int) error {
-	if d.nComp != 0 {
-		return FormatError("multiple SOF markers")
-	}
-	switch n {
-	case 6 + 3*1: // Grayscale image.
-		d.nComp = 1
-	case 6 + 3*3: // YCbCr or RGB image.
-		d.nComp = 3
-	case 6 + 3*4: // YCbCrK or CMYK image.
-		d.nComp = 4
-	default:
-		return UnsupportedError("number of components")
-	}
-	if err := d.readFull(d.tmp[:n]); err != nil {
-		return err
-	}
-	// We only support 8-bit precision.
-	if d.tmp[0] != 8 {
-		return UnsupportedError("precision")
-	}
-	d.height = int(d.tmp[1])<<8 + int(d.tmp[2])
-	d.width = int(d.tmp[3])<<8 + int(d.tmp[4])
-	if int(d.tmp[5]) != d.nComp {
-		return FormatError("SOF has wrong length")
-	}
-
-	for i := 0; i < d.nComp; i++ {
-		d.comp[i].c = d.tmp[6+3*i]
-		// Section B.2.2 states that "the value of C_i shall be different from
-		// the values of C_1 through C_(i-1)".
-		for j := 0; j < i; j++ {
-			if d.comp[i].c == d.comp[j].c {
-				return FormatError("repeated component identifier")
-			}
-		}
-
-		d.comp[i].tq = d.tmp[8+3*i]
-		if d.comp[i].tq > maxTq {
-			return FormatError("bad Tq value")
-		}
-
-		hv := d.tmp[7+3*i]
-		h, v := int(hv>>4), int(hv&0x0f)
-		if h < 1 || 4 < h || v < 1 || 4 < v {
-			return FormatError("luma/chroma subsampling ratio")
-		}
-		if h == 3 || v == 3 {
-			return errUnsupportedSubsamplingRatio
-		}
-		switch d.nComp {
-		case 1:
-			// If a JPEG image has only one component, section A.2 says "this data
-			// is non-interleaved by definition" and section A.2.2 says "[in this
-			// case...] the order of data units within a scan shall be left-to-right
-			// and top-to-bottom... regardless of the values of H_1 and V_1". Section
-			// 4.8.2 also says "[for non-interleaved data], the MCU is defined to be
-			// one data unit". Similarly, section A.1.1 explains that it is the ratio
-			// of H_i to max_j(H_j) that matters, and similarly for V. For grayscale
-			// images, H_1 is the maximum H_j for all components j, so that ratio is
-			// always 1. The component's (h, v) is effectively always (1, 1): even if
-			// the nominal (h, v) is (2, 1), a 20x5 image is encoded in three 8x8
-			// MCUs, not two 16x8 MCUs.
-			h, v = 1, 1
-
-		case 3:
-			// For YCbCr images, we only support 4:4:4, 4:4:0, 4:2:2, 4:2:0,
-			// 4:1:1 or 4:1:0 chroma subsampling ratios. This implies that the
-			// (h, v) values for the Y component are either (1, 1), (1, 2),
-			// (2, 1), (2, 2), (4, 1) or (4, 2), and the Y component's values
-			// must be a multiple of the Cb and Cr component's values. We also
-			// assume that the two chroma components have the same subsampling
-			// ratio.
-			switch i {
-			case 0: // Y.
-				// We have already verified, above, that h and v are both
-				// either 1, 2 or 4, so invalid (h, v) combinations are those
-				// with v == 4.
-				if v == 4 {
-					return errUnsupportedSubsamplingRatio
-				}
-			case 1: // Cb.
-				if d.comp[0].h%h != 0 || d.comp[0].v%v != 0 {
-					return errUnsupportedSubsamplingRatio
-				}
-			case 2: // Cr.
-				if d.comp[1].h != h || d.comp[1].v != v {
-					return errUnsupportedSubsamplingRatio
-				}
-			}
-
-		case 4:
-			// For 4-component images (either CMYK or YCbCrK), we only support two
-			// hv vectors: [0x11 0x11 0x11 0x11] and [0x22 0x11 0x11 0x22].
-			// Theoretically, 4-component JPEG images could mix and match hv values
-			// but in practice, those two combinations are the only ones in use,
-			// and it simplifies the applyBlack code below if we can assume that:
-			//	- for CMYK, the C and K channels have full samples, and if the M
-			//	  and Y channels subsample, they subsample both horizontally and
-			//	  vertically.
-			//	- for YCbCrK, the Y and K channels have full samples.
-			switch i {
-			case 0:
-				if hv != 0x11 && hv != 0x22 {
-					return errUnsupportedSubsamplingRatio
-				}
-			case 1, 2:
-				if hv != 0x11 {
-					return errUnsupportedSubsamplingRatio
-				}
-			case 3:
-				if d.comp[0].h != h || d.comp[0].v != v {
-					return errUnsupportedSubsamplingRatio
-				}
-			}
-		}
-
-		d.comp[i].h = h
-		d.comp[i].v = v
-	}
-	return nil
-}
-
-// Specified in section B.2.4.1.
-func (d *decoder) processDQT(n int) error {
-loop:
-	for n > 0 {
-		n--
-		x, err := d.readByte()
-		if err != nil {
-			return err
-		}
-		tq := x & 0x0f
-		if tq > maxTq {
-			return FormatError("bad Tq value")
-		}
-		switch x >> 4 {
-		default:
-			return FormatError("bad Pq value")
-		case 0:
-			if n < blockSize {
-				break loop
-			}
-			n -= blockSize
-			if err := d.readFull(d.tmp[:blockSize]); err != nil {
-				return err
-			}
-			for i := range d.quant[tq] {
-				d.quant[tq][i] = int32(d.tmp[i])
-			}
-		case 1:
-			if n < 2*blockSize {
-				break loop
-			}
-			n -= 2 * blockSize
-			if err := d.readFull(d.tmp[:2*blockSize]); err != nil {
-				return err
-			}
-			for i := range d.quant[tq] {
-				d.quant[tq][i] = int32(d.tmp[2*i])<<8 | int32(d.tmp[2*i+1])
-			}
-		}
-	}
-	if n != 0 {
-		return FormatError("DQT has wrong length")
-	}
-	return nil
-}
-
-// Specified in section B.2.4.4.
-func (d *decoder) processDRI(n int) error {
-	if n != 2 {
-		return FormatError("DRI has wrong length")
-	}
-	if err := d.readFull(d.tmp[:2]); err != nil {
-		return err
-	}
-	d.ri = int(d.tmp[0])<<8 + int(d.tmp[1])
-	return nil
-}
-
-func (d *decoder) processApp0Marker(n int) error {
-	if n < 5 {
-		return d.ignore(n)
-	}
-	if err := d.readFull(d.tmp[:5]); err != nil {
-		return err
-	}
-	n -= 5
-
-	d.jfif = d.tmp[0] == 'J' && d.tmp[1] == 'F' && d.tmp[2] == 'I' && d.tmp[3] == 'F' && d.tmp[4] == '\x00'
-
-	if n > 0 {
-		return d.ignore(n)
-	}
-	return nil
-}
-
-func (d *decoder) processApp14Marker(n int) error {
-	if n < 12 {
-		return d.ignore(n)
-	}
-	if err := d.readFull(d.tmp[:12]); err != nil {
-		return err
-	}
-	n -= 12
-
-	if d.tmp[0] == 'A' && d.tmp[1] == 'd' && d.tmp[2] == 'o' && d.tmp[3] == 'b' && d.tmp[4] == 'e' {
-		d.adobeTransformValid = true
-		d.adobeTransform = d.tmp[11]
-	}
-
-	if n > 0 {
-		return d.ignore(n)
-	}
-	return nil
-}
-
-// decode reads a JPEG image from r and returns it as an image.Image.
-func (d *decoder) decode(r io.Reader, configOnly bool) (image.Image, error) {
-	d.r = r
-
-	// Check for the Start Of Image marker.
-	if err := d.readFull(d.tmp[:2]); err != nil {
-		return nil, err
-	}
-	if d.tmp[0] != 0xff || d.tmp[1] != soiMarker {
-		return nil, FormatError("missing SOI marker")
-	}
-
-	// Process the remaining segments until the End Of Image marker.
-	for {
-		err := d.readFull(d.tmp[:2])
-		if err != nil {
-			return nil, err
-		}
-		for d.tmp[0] != 0xff {
-			// Strictly speaking, this is a format error. However, libjpeg is
-			// liberal in what it accepts. As of version 9, next_marker in
-			// jdmarker.c treats this as a warning (JWRN_EXTRANEOUS_DATA) and
-			// continues to decode the stream. Even before next_marker sees
-			// extraneous data, jpeg_fill_bit_buffer in jdhuff.c reads as many
-			// bytes as it can, possibly past the end of a scan's data. It
-			// effectively puts back any markers that it overscanned (e.g. an
-			// "\xff\xd9" EOI marker), but it does not put back non-marker data,
-			// and thus it can silently ignore a small number of extraneous
-			// non-marker bytes before next_marker has a chance to see them (and
-			// print a warning).
-			//
-			// We are therefore also liberal in what we accept. Extraneous data
-			// is silently ignored.
-			//
-			// This is similar to, but not exactly the same as, the restart
-			// mechanism within a scan (the RST[0-7] markers).
-			//
-			// Note that extraneous 0xff bytes in e.g. SOS data are escaped as
-			// "\xff\x00", and so are detected a little further down below.
-			d.tmp[0] = d.tmp[1]
-			d.tmp[1], err = d.readByte()
-			if err != nil {
-				return nil, err
-			}
-		}
-		marker := d.tmp[1]
-		if marker == 0 {
-			// Treat "\xff\x00" as extraneous data.
-			continue
-		}
-		for marker == 0xff {
-			// Section B.1.1.2 says, "Any marker may optionally be preceded by any
-			// number of fill bytes, which are bytes assigned code X'FF'".
-			marker, err = d.readByte()
-			if err != nil {
-				return nil, err
-			}
-		}
-		if marker == eoiMarker { // End Of Image.
-			break
-		}
-		if rst0Marker <= marker && marker <= rst7Marker {
-			// Figures B.2 and B.16 of the specification suggest that restart markers should
-			// only occur between Entropy Coded Segments and not after the final ECS.
-			// However, some encoders may generate incorrect JPEGs with a final restart
-			// marker. That restart marker will be seen here instead of inside the processSOS
-			// method, and is ignored as a harmless error. Restart markers have no extra data,
-			// so we check for this before we read the 16-bit length of the segment.
-			continue
-		}
-
-		// Read the 16-bit length of the segment. The value includes the 2 bytes for the
-		// length itself, so we subtract 2 to get the number of remaining bytes.
-		if err = d.readFull(d.tmp[:2]); err != nil {
-			return nil, err
-		}
-		n := int(d.tmp[0])<<8 + int(d.tmp[1]) - 2
-		if n < 0 {
-			return nil, FormatError("short segment length")
-		}
-
-		switch marker {
-		case sof0Marker, sof1Marker, sof2Marker:
-			d.progressive = marker == sof2Marker
-			err = d.processSOF(n)
-			if configOnly && d.jfif {
-				return nil, err
-			}
-		case dhtMarker:
-			if configOnly {
-				err = d.ignore(n)
-			} else {
-				err = d.processDHT(n)
-			}
-		case dqtMarker:
-			if configOnly {
-				err = d.ignore(n)
-			} else {
-				err = d.processDQT(n)
-			}
-		case sosMarker:
-			if configOnly {
-				return nil, nil
-			}
-			err = d.processSOS(n)
-		case driMarker:
-			if configOnly {
-				err = d.ignore(n)
-			} else {
-				err = d.processDRI(n)
-			}
-		case app0Marker:
-			err = d.processApp0Marker(n)
-		case app14Marker:
-			err = d.processApp14Marker(n)
-		default:
-			if app0Marker <= marker && marker <= app15Marker || marker == comMarker {
-				err = d.ignore(n)
-			} else if marker < 0xc0 { // See Table B.1 "Marker code assignments".
-				err = FormatError("unknown marker")
-			} else {
-				err = UnsupportedError("unknown marker")
-			}
-		}
-		if err != nil {
-			return nil, err
-		}
-	}
-	if d.img1 != nil {
-		return d.img1, nil
-	}
-	if d.img3 != nil {
-		if d.blackPix != nil {
-			return d.applyBlack()
-		} else if d.isRGB() {
-			return d.convertToRGB()
-		}
-		return d.img3, nil
-	}
-	return nil, FormatError("missing SOS marker")
-}
-
-// applyBlack combines d.img3 and d.blackPix into a CMYK image. The formula
-// used depends on whether the JPEG image is stored as CMYK or YCbCrK,
-// indicated by the APP14 (Adobe) metadata.
-//
-// Adobe CMYK JPEG images are inverted, where 255 means no ink instead of full
-// ink, so we apply "v = 255 - v" at various points. Note that a double
-// inversion is a no-op, so inversions might be implicit in the code below.
-func (d *decoder) applyBlack() (image.Image, error) {
-	if !d.adobeTransformValid {
-		return nil, UnsupportedError("unknown color model: 4-component JPEG doesn't have Adobe APP14 metadata")
-	}
-
-	// If the 4-component JPEG image isn't explicitly marked as "Unknown (RGB
-	// or CMYK)" as per
-	// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/JPEG.html#Adobe
-	// we assume that it is YCbCrK. This matches libjpeg's jdapimin.c.
-	if d.adobeTransform != adobeTransformUnknown {
-		// Convert the YCbCr part of the YCbCrK to RGB, invert the RGB to get
-		// CMY, and patch in the original K. The RGB to CMY inversion cancels
-		// out the 'Adobe inversion' described in the applyBlack doc comment
-		// above, so in practice, only the fourth channel (black) is inverted.
-		bounds := d.img3.Bounds()
-		img := image.NewRGBA(bounds)
-		imageutil.DrawYCbCr(img, bounds, d.img3, bounds.Min)
-		for iBase, y := 0, bounds.Min.Y; y < bounds.Max.Y; iBase, y = iBase+img.Stride, y+1 {
-			for i, x := iBase+3, bounds.Min.X; x < bounds.Max.X; i, x = i+4, x+1 {
-				img.Pix[i] = 255 - d.blackPix[(y-bounds.Min.Y)*d.blackStride+(x-bounds.Min.X)]
-			}
-		}
-		return &image.CMYK{
-			Pix:    img.Pix,
-			Stride: img.Stride,
-			Rect:   img.Rect,
-		}, nil
-	}
-
-	// The first three channels (cyan, magenta, yellow) of the CMYK
-	// were decoded into d.img3, but each channel was decoded into a separate
-	// []byte slice, and some channels may be subsampled. We interleave the
-	// separate channels into an image.CMYK's single []byte slice containing 4
-	// contiguous bytes per pixel.
-	bounds := d.img3.Bounds()
-	img := image.NewCMYK(bounds)
-
-	translations := [4]struct {
-		src    []byte
-		stride int
-	}{
-		{d.img3.Y, d.img3.YStride},
-		{d.img3.Cb, d.img3.CStride},
-		{d.img3.Cr, d.img3.CStride},
-		{d.blackPix, d.blackStride},
-	}
-	for t, translation := range translations {
-		subsample := d.comp[t].h != d.comp[0].h || d.comp[t].v != d.comp[0].v
-		for iBase, y := 0, bounds.Min.Y; y < bounds.Max.Y; iBase, y = iBase+img.Stride, y+1 {
-			sy := y - bounds.Min.Y
-			if subsample {
-				sy /= 2
-			}
-			for i, x := iBase+t, bounds.Min.X; x < bounds.Max.X; i, x = i+4, x+1 {
-				sx := x - bounds.Min.X
-				if subsample {
-					sx /= 2
-				}
-				img.Pix[i] = 255 - translation.src[sy*translation.stride+sx]
-			}
-		}
-	}
-	return img, nil
-}
-
-func (d *decoder) isRGB() bool {
-	if d.jfif {
-		return false
-	}
-	if d.adobeTransformValid && d.adobeTransform == adobeTransformUnknown {
-		// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/JPEG.html#Adobe
-		// says that 0 means Unknown (and in practice RGB) and 1 means YCbCr.
-		return true
-	}
-	return d.comp[0].c == 'R' && d.comp[1].c == 'G' && d.comp[2].c == 'B'
-}
-
-func (d *decoder) convertToRGB() (image.Image, error) {
-	cScale := d.comp[0].h / d.comp[1].h
-	bounds := d.img3.Bounds()
-	img := image.NewRGBA(bounds)
-	for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
-		po := img.PixOffset(bounds.Min.X, y)
-		yo := d.img3.YOffset(bounds.Min.X, y)
-		co := d.img3.COffset(bounds.Min.X, y)
-		for i, iMax := 0, bounds.Max.X-bounds.Min.X; i < iMax; i++ {
-			img.Pix[po+4*i+0] = d.img3.Y[yo+i]
-			img.Pix[po+4*i+1] = d.img3.Cb[co+i/cScale]
-			img.Pix[po+4*i+2] = d.img3.Cr[co+i/cScale]
-			img.Pix[po+4*i+3] = 255
-		}
-	}
-	return img, nil
-}
-
-// Decode reads a JPEG image from r and returns it as an image.Image.
-func Decode(r io.Reader) (image.Image, error) {
-	var d decoder
-	return d.decode(r, false)
-}
-
-// DecodeConfig returns the color model and dimensions of a JPEG image without
-// decoding the entire image.
-func DecodeConfig(r io.Reader) (image.Config, error) {
-	var d decoder
-	if _, err := d.decode(r, true); err != nil {
-		return image.Config{}, err
-	}
-	switch d.nComp {
-	case 1:
-		return image.Config{
-			ColorModel: color.GrayModel,
-			Width:      d.width,
-			Height:     d.height,
-		}, nil
-	case 3:
-		cm := color.YCbCrModel
-		if d.isRGB() {
-			cm = color.RGBAModel
-		}
-		return image.Config{
-			ColorModel: cm,
-			Width:      d.width,
-			Height:     d.height,
-		}, nil
-	case 4:
-		return image.Config{
-			ColorModel: color.CMYKModel,
-			Width:      d.width,
-			Height:     d.height,
-		}, nil
-	}
-	return image.Config{}, FormatError("missing SOF marker")
-}
-
-func init() {
-	image.RegisterFormat("jpeg", "\xff\xd8", Decode, DecodeConfig)
-}
diff --git a/third_party/gofrontend/libgo/go/image/jpeg/reader_test.go b/third_party/gofrontend/libgo/go/image/jpeg/reader_test.go
deleted file mode 100644
index 7737615..0000000
--- a/third_party/gofrontend/libgo/go/image/jpeg/reader_test.go
+++ /dev/null
@@ -1,348 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package jpeg
-
-import (
-	"bytes"
-	"fmt"
-	"image"
-	"image/color"
-	"io"
-	"io/ioutil"
-	"math/rand"
-	"os"
-	"strings"
-	"testing"
-	"time"
-)
-
-// TestDecodeProgressive tests that decoding the baseline and progressive
-// versions of the same image result in exactly the same pixel data, in YCbCr
-// space for color images, and Y space for grayscale images.
-func TestDecodeProgressive(t *testing.T) {
-	testCases := []string{
-		"../testdata/video-001",
-		"../testdata/video-001.q50.410",
-		"../testdata/video-001.q50.411",
-		"../testdata/video-001.q50.420",
-		"../testdata/video-001.q50.422",
-		"../testdata/video-001.q50.440",
-		"../testdata/video-001.q50.444",
-		"../testdata/video-005.gray.q50",
-		"../testdata/video-005.gray.q50.2x2",
-		"../testdata/video-001.separate.dc.progression",
-	}
-	for _, tc := range testCases {
-		m0, err := decodeFile(tc + ".jpeg")
-		if err != nil {
-			t.Errorf("%s: %v", tc+".jpeg", err)
-			continue
-		}
-		m1, err := decodeFile(tc + ".progressive.jpeg")
-		if err != nil {
-			t.Errorf("%s: %v", tc+".progressive.jpeg", err)
-			continue
-		}
-		if m0.Bounds() != m1.Bounds() {
-			t.Errorf("%s: bounds differ: %v and %v", tc, m0.Bounds(), m1.Bounds())
-			continue
-		}
-		// All of the video-*.jpeg files are 150x103.
-		if m0.Bounds() != image.Rect(0, 0, 150, 103) {
-			t.Errorf("%s: bad bounds: %v", tc, m0.Bounds())
-			continue
-		}
-
-		switch m0 := m0.(type) {
-		case *image.YCbCr:
-			m1 := m1.(*image.YCbCr)
-			if err := check(m0.Bounds(), m0.Y, m1.Y, m0.YStride, m1.YStride); err != nil {
-				t.Errorf("%s (Y): %v", tc, err)
-				continue
-			}
-			if err := check(m0.Bounds(), m0.Cb, m1.Cb, m0.CStride, m1.CStride); err != nil {
-				t.Errorf("%s (Cb): %v", tc, err)
-				continue
-			}
-			if err := check(m0.Bounds(), m0.Cr, m1.Cr, m0.CStride, m1.CStride); err != nil {
-				t.Errorf("%s (Cr): %v", tc, err)
-				continue
-			}
-		case *image.Gray:
-			m1 := m1.(*image.Gray)
-			if err := check(m0.Bounds(), m0.Pix, m1.Pix, m0.Stride, m1.Stride); err != nil {
-				t.Errorf("%s: %v", tc, err)
-				continue
-			}
-		default:
-			t.Errorf("%s: unexpected image type %T", tc, m0)
-			continue
-		}
-	}
-}
-
-func decodeFile(filename string) (image.Image, error) {
-	f, err := os.Open(filename)
-	if err != nil {
-		return nil, err
-	}
-	defer f.Close()
-	return Decode(f)
-}
-
-type eofReader struct {
-	data     []byte // deliver from Read without EOF
-	dataEOF  []byte // then deliver from Read with EOF on last chunk
-	lenAtEOF int
-}
-
-func (r *eofReader) Read(b []byte) (n int, err error) {
-	if len(r.data) > 0 {
-		n = copy(b, r.data)
-		r.data = r.data[n:]
-	} else {
-		n = copy(b, r.dataEOF)
-		r.dataEOF = r.dataEOF[n:]
-		if len(r.dataEOF) == 0 {
-			err = io.EOF
-			if r.lenAtEOF == -1 {
-				r.lenAtEOF = n
-			}
-		}
-	}
-	return
-}
-
-func TestDecodeEOF(t *testing.T) {
-	// Check that if reader returns final data and EOF at same time, jpeg handles it.
-	data, err := ioutil.ReadFile("../testdata/video-001.jpeg")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	n := len(data)
-	for i := 0; i < n; {
-		r := &eofReader{data[:n-i], data[n-i:], -1}
-		_, err := Decode(r)
-		if err != nil {
-			t.Errorf("Decode with Read() = %d, EOF: %v", r.lenAtEOF, err)
-		}
-		if i == 0 {
-			i = 1
-		} else {
-			i *= 2
-		}
-	}
-}
-
-// check checks that the two pix data are equal, within the given bounds.
-func check(bounds image.Rectangle, pix0, pix1 []byte, stride0, stride1 int) error {
-	if stride0 <= 0 || stride0%8 != 0 {
-		return fmt.Errorf("bad stride %d", stride0)
-	}
-	if stride1 <= 0 || stride1%8 != 0 {
-		return fmt.Errorf("bad stride %d", stride1)
-	}
-	// Compare the two pix data, one 8x8 block at a time.
-	for y := 0; y < len(pix0)/stride0 && y < len(pix1)/stride1; y += 8 {
-		for x := 0; x < stride0 && x < stride1; x += 8 {
-			if x >= bounds.Max.X || y >= bounds.Max.Y {
-				// We don't care if the two pix data differ if the 8x8 block is
-				// entirely outside of the image's bounds. For example, this can
-				// occur with a 4:2:0 chroma subsampling and a 1x1 image. Baseline
-				// decoding works on the one 16x16 MCU as a whole; progressive
-				// decoding's first pass works on that 16x16 MCU as a whole but
-				// refinement passes only process one 8x8 block within the MCU.
-				continue
-			}
-
-			for j := 0; j < 8; j++ {
-				for i := 0; i < 8; i++ {
-					index0 := (y+j)*stride0 + (x + i)
-					index1 := (y+j)*stride1 + (x + i)
-					if pix0[index0] != pix1[index1] {
-						return fmt.Errorf("blocks at (%d, %d) differ:\n%sand\n%s", x, y,
-							pixString(pix0, stride0, x, y),
-							pixString(pix1, stride1, x, y),
-						)
-					}
-				}
-			}
-		}
-	}
-	return nil
-}
-
-func pixString(pix []byte, stride, x, y int) string {
-	s := bytes.NewBuffer(nil)
-	for j := 0; j < 8; j++ {
-		fmt.Fprintf(s, "\t")
-		for i := 0; i < 8; i++ {
-			fmt.Fprintf(s, "%02x ", pix[(y+j)*stride+(x+i)])
-		}
-		fmt.Fprintf(s, "\n")
-	}
-	return s.String()
-}
-
-func TestTruncatedSOSDataDoesntPanic(t *testing.T) {
-	b, err := ioutil.ReadFile("../testdata/video-005.gray.q50.jpeg")
-	if err != nil {
-		t.Fatal(err)
-	}
-	sosMarker := []byte{0xff, 0xda}
-	i := bytes.Index(b, sosMarker)
-	if i < 0 {
-		t.Fatal("SOS marker not found")
-	}
-	i += len(sosMarker)
-	j := i + 10
-	if j > len(b) {
-		j = len(b)
-	}
-	for ; i < j; i++ {
-		Decode(bytes.NewReader(b[:i]))
-	}
-}
-
-func TestLargeImageWithShortData(t *testing.T) {
-	// This input is an invalid JPEG image, based on the fuzzer-generated image
-	// in issue 10413. It is only 504 bytes, and shouldn't take long for Decode
-	// to return an error. The Start Of Frame marker gives the image dimensions
-	// as 8192 wide and 8192 high, so even if an unreadByteStuffedByte bug
-	// doesn't technically lead to an infinite loop, such a bug can still cause
-	// an unreasonably long loop for such a short input.
-	const input = "" +
-		"\xff\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x00\x00\x01" +
-		"\x00\x01\x00\x00\xff\xdb\x00\x43\x00\x10\x0b\x0c\x0e\x0c\x0a\x10" +
-		"\x0e\x89\x0e\x12\x11\x10\x13\x18\xff\xd8\xff\xe0\x00\x10\x4a\x46" +
-		"\x49\x46\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00\x43" +
-		"\x00\x10\x0b\x0c\x0e\x0c\x0a\x10\x0e\x0d\x0e\x12\x11\x10\x13\x18" +
-		"\x28\x1a\x18\x16\x16\x18\x31\x23\x25\x1d\x28\x3a\x33\x3d\x3c\x39" +
-		"\x33\x38\x37\x40\x48\x5c\x4e\x40\x44\x57\x45\x37\x38\x50\x6d\x51" +
-		"\x57\x5f\x62\x67\x68\x67\x3e\x4d\x71\x79\x70\x64\x78\x5c\x65\x67" +
-		"\x63\xff\xc0\x00\x0b\x08\x20\x00\x20\x00\x01\x01\x11\x00\xff\xc4" +
-		"\x00\x1f\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00" +
-		"\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\xff" +
-		"\xc4\x00\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04" +
-		"\x00\x00\x01\x7d\x01\x02\x03\x00\x04\x11\x05\x12\x21\x31\x01\x06" +
-		"\x13\x51\x61\x07\x22\x71\x14\x32\x81\x91\xa1\x08\x23\xd8\xff\xdd" +
-		"\x42\xb1\xc1\x15\x52\xd1\xf0\x24\x33\x62\x72\x82\x09\x0a\x16\x17" +
-		"\x18\x19\x1a\x25\x26\x27\x28\x29\x2a\x34\x35\x36\x37\x38\x39\x3a" +
-		"\x43\x44\x45\x46\x47\x48\x49\x4a\x53\x54\x55\x56\x57\x58\x59\x5a" +
-		"\x00\x63\x64\x65\x66\x67\x68\x69\x6a\x73\x74\x75\x76\x77\x78\x79" +
-		"\x7a\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98" +
-		"\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6" +
-		"\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xff\xd8\xff\xe0\x00\x10" +
-		"\x4a\x46\x49\x46\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb" +
-		"\x00\x43\x00\x10\x0b\x0c\x0e\x0c\x0a\x10\x0e\x0d\x0e\x12\x11\x10" +
-		"\x13\x18\x28\x1a\x18\x16\x16\x18\x31\x23\x25\x1d\xc8\xc9\xca\xd2" +
-		"\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8" +
-		"\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xda\x00\x08" +
-		"\x01\x01\x00\x00\x3f\x00\xb9\xeb\x50\xb0\xdb\xc8\xa8\xe4\x63\x80" +
-		"\xdd\x31\xd6\x9d\xbb\xf2\xc5\x42\x1f\x6c\x6f\xf4\x34\xdd\x3c\xfc" +
-		"\xac\xe7\x3d\x80\xa9\xcc\x87\x34\xb3\x37\xfa\x2b\x9f\x6a\xad\x63" +
-		"\x20\x36\x9f\x78\x64\x75\xe6\xab\x7d\xb2\xde\x29\x70\xd3\x20\x27" +
-		"\xde\xaf\xa4\xf0\xca\x9f\x24\xa8\xdf\x46\xa8\x24\x84\x96\xe3\x77" +
-		"\xf9\x2e\xe0\x0a\x62\x7f\xdf\xd9"
-	c := make(chan error, 1)
-	go func() {
-		_, err := Decode(strings.NewReader(input))
-		c <- err
-	}()
-	select {
-	case err := <-c:
-		if err == nil {
-			t.Fatalf("got nil error, want non-nil")
-		}
-	case <-time.After(3 * time.Second):
-		t.Fatalf("timed out")
-	}
-}
-
-func TestExtraneousData(t *testing.T) {
-	// Encode a 1x1 red image.
-	src := image.NewRGBA(image.Rect(0, 0, 1, 1))
-	src.Set(0, 0, color.RGBA{0xff, 0x00, 0x00, 0xff})
-	buf := new(bytes.Buffer)
-	if err := Encode(buf, src, nil); err != nil {
-		t.Fatalf("encode: %v", err)
-	}
-	enc := buf.String()
-	// Sanity check that the encoded JPEG is long enough, that it ends in a
-	// "\xff\xd9" EOI marker, and that it contains a "\xff\xda" SOS marker
-	// somewhere in the final 64 bytes.
-	if len(enc) < 64 {
-		t.Fatalf("encoded JPEG is too short: %d bytes", len(enc))
-	}
-	if got, want := enc[len(enc)-2:], "\xff\xd9"; got != want {
-		t.Fatalf("encoded JPEG ends with %q, want %q", got, want)
-	}
-	if s := enc[len(enc)-64:]; !strings.Contains(s, "\xff\xda") {
-		t.Fatalf("encoded JPEG does not contain a SOS marker (ff da) near the end: % x", s)
-	}
-	// Test that adding some random junk between the SOS marker and the
-	// EOI marker does not affect the decoding.
-	rnd := rand.New(rand.NewSource(1))
-	for i, nerr := 0, 0; i < 1000 && nerr < 10; i++ {
-		buf.Reset()
-		// Write all but the trailing "\xff\xd9" EOI marker.
-		buf.WriteString(enc[:len(enc)-2])
-		// Write some random extraneous data.
-		for n := rnd.Intn(10); n > 0; n-- {
-			if x := byte(rnd.Intn(256)); x != 0xff {
-				buf.WriteByte(x)
-			} else {
-				// The JPEG format escapes a SOS 0xff data byte as "\xff\x00".
-				buf.WriteString("\xff\x00")
-			}
-		}
-		// Write the "\xff\xd9" EOI marker.
-		buf.WriteString("\xff\xd9")
-
-		// Check that we can still decode the resultant image.
-		got, err := Decode(buf)
-		if err != nil {
-			t.Errorf("could not decode image #%d: %v", i, err)
-			nerr++
-			continue
-		}
-		if got.Bounds() != src.Bounds() {
-			t.Errorf("image #%d, bounds differ: %v and %v", i, got.Bounds(), src.Bounds())
-			nerr++
-			continue
-		}
-		if averageDelta(got, src) > 2<<8 {
-			t.Errorf("image #%d changed too much after a round trip", i)
-			nerr++
-			continue
-		}
-	}
-}
-
-func benchmarkDecode(b *testing.B, filename string) {
-	b.StopTimer()
-	data, err := ioutil.ReadFile(filename)
-	if err != nil {
-		b.Fatal(err)
-	}
-	cfg, err := DecodeConfig(bytes.NewReader(data))
-	if err != nil {
-		b.Fatal(err)
-	}
-	b.SetBytes(int64(cfg.Width * cfg.Height * 4))
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		Decode(bytes.NewReader(data))
-	}
-}
-
-func BenchmarkDecodeBaseline(b *testing.B) {
-	benchmarkDecode(b, "../testdata/video-001.jpeg")
-}
-
-func BenchmarkDecodeProgressive(b *testing.B) {
-	benchmarkDecode(b, "../testdata/video-001.progressive.jpeg")
-}
diff --git a/third_party/gofrontend/libgo/go/image/jpeg/scan.go b/third_party/gofrontend/libgo/go/image/jpeg/scan.go
deleted file mode 100644
index 99734c0..0000000
--- a/third_party/gofrontend/libgo/go/image/jpeg/scan.go
+++ /dev/null
@@ -1,472 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package jpeg
-
-import (
-	"image"
-)
-
-// makeImg allocates and initializes the destination image.
-func (d *decoder) makeImg(mxx, myy int) {
-	if d.nComp == 1 {
-		m := image.NewGray(image.Rect(0, 0, 8*mxx, 8*myy))
-		d.img1 = m.SubImage(image.Rect(0, 0, d.width, d.height)).(*image.Gray)
-		return
-	}
-
-	h0 := d.comp[0].h
-	v0 := d.comp[0].v
-	hRatio := h0 / d.comp[1].h
-	vRatio := v0 / d.comp[1].v
-	var subsampleRatio image.YCbCrSubsampleRatio
-	switch hRatio<<4 | vRatio {
-	case 0x11:
-		subsampleRatio = image.YCbCrSubsampleRatio444
-	case 0x12:
-		subsampleRatio = image.YCbCrSubsampleRatio440
-	case 0x21:
-		subsampleRatio = image.YCbCrSubsampleRatio422
-	case 0x22:
-		subsampleRatio = image.YCbCrSubsampleRatio420
-	case 0x41:
-		subsampleRatio = image.YCbCrSubsampleRatio411
-	case 0x42:
-		subsampleRatio = image.YCbCrSubsampleRatio410
-	default:
-		panic("unreachable")
-	}
-	m := image.NewYCbCr(image.Rect(0, 0, 8*h0*mxx, 8*v0*myy), subsampleRatio)
-	d.img3 = m.SubImage(image.Rect(0, 0, d.width, d.height)).(*image.YCbCr)
-
-	if d.nComp == 4 {
-		h3, v3 := d.comp[3].h, d.comp[3].v
-		d.blackPix = make([]byte, 8*h3*mxx*8*v3*myy)
-		d.blackStride = 8 * h3 * mxx
-	}
-}
-
-// Specified in section B.2.3.
-func (d *decoder) processSOS(n int) error {
-	if d.nComp == 0 {
-		return FormatError("missing SOF marker")
-	}
-	if n < 6 || 4+2*d.nComp < n || n%2 != 0 {
-		return FormatError("SOS has wrong length")
-	}
-	if err := d.readFull(d.tmp[:n]); err != nil {
-		return err
-	}
-	nComp := int(d.tmp[0])
-	if n != 4+2*nComp {
-		return FormatError("SOS length inconsistent with number of components")
-	}
-	var scan [maxComponents]struct {
-		compIndex uint8
-		td        uint8 // DC table selector.
-		ta        uint8 // AC table selector.
-	}
-	totalHV := 0
-	for i := 0; i < nComp; i++ {
-		cs := d.tmp[1+2*i] // Component selector.
-		compIndex := -1
-		for j, comp := range d.comp[:d.nComp] {
-			if cs == comp.c {
-				compIndex = j
-			}
-		}
-		if compIndex < 0 {
-			return FormatError("unknown component selector")
-		}
-		scan[i].compIndex = uint8(compIndex)
-		// Section B.2.3 states that "the value of Cs_j shall be different from
-		// the values of Cs_1 through Cs_(j-1)". Since we have previously
-		// verified that a frame's component identifiers (C_i values in section
-		// B.2.2) are unique, it suffices to check that the implicit indexes
-		// into d.comp are unique.
-		for j := 0; j < i; j++ {
-			if scan[i].compIndex == scan[j].compIndex {
-				return FormatError("repeated component selector")
-			}
-		}
-		totalHV += d.comp[compIndex].h * d.comp[compIndex].v
-
-		scan[i].td = d.tmp[2+2*i] >> 4
-		if scan[i].td > maxTh {
-			return FormatError("bad Td value")
-		}
-		scan[i].ta = d.tmp[2+2*i] & 0x0f
-		if scan[i].ta > maxTh {
-			return FormatError("bad Ta value")
-		}
-	}
-	// Section B.2.3 states that if there is more than one component then the
-	// total H*V values in a scan must be <= 10.
-	if d.nComp > 1 && totalHV > 10 {
-		return FormatError("total sampling factors too large")
-	}
-
-	// zigStart and zigEnd are the spectral selection bounds.
-	// ah and al are the successive approximation high and low values.
-	// The spec calls these values Ss, Se, Ah and Al.
-	//
-	// For progressive JPEGs, these are the two more-or-less independent
-	// aspects of progression. Spectral selection progression is when not
-	// all of a block's 64 DCT coefficients are transmitted in one pass.
-	// For example, three passes could transmit coefficient 0 (the DC
-	// component), coefficients 1-5, and coefficients 6-63, in zig-zag
-	// order. Successive approximation is when not all of the bits of a
-	// band of coefficients are transmitted in one pass. For example,
-	// three passes could transmit the 6 most significant bits, followed
-	// by the second-least significant bit, followed by the least
-	// significant bit.
-	//
-	// For baseline JPEGs, these parameters are hard-coded to 0/63/0/0.
-	zigStart, zigEnd, ah, al := int32(0), int32(blockSize-1), uint32(0), uint32(0)
-	if d.progressive {
-		zigStart = int32(d.tmp[1+2*nComp])
-		zigEnd = int32(d.tmp[2+2*nComp])
-		ah = uint32(d.tmp[3+2*nComp] >> 4)
-		al = uint32(d.tmp[3+2*nComp] & 0x0f)
-		if (zigStart == 0 && zigEnd != 0) || zigStart > zigEnd || blockSize <= zigEnd {
-			return FormatError("bad spectral selection bounds")
-		}
-		if zigStart != 0 && nComp != 1 {
-			return FormatError("progressive AC coefficients for more than one component")
-		}
-		if ah != 0 && ah != al+1 {
-			return FormatError("bad successive approximation values")
-		}
-	}
-
-	// mxx and myy are the number of MCUs (Minimum Coded Units) in the image.
-	h0, v0 := d.comp[0].h, d.comp[0].v // The h and v values from the Y components.
-	mxx := (d.width + 8*h0 - 1) / (8 * h0)
-	myy := (d.height + 8*v0 - 1) / (8 * v0)
-	if d.img1 == nil && d.img3 == nil {
-		d.makeImg(mxx, myy)
-	}
-	if d.progressive {
-		for i := 0; i < nComp; i++ {
-			compIndex := scan[i].compIndex
-			if d.progCoeffs[compIndex] == nil {
-				d.progCoeffs[compIndex] = make([]block, mxx*myy*d.comp[compIndex].h*d.comp[compIndex].v)
-			}
-		}
-	}
-
-	d.bits = bits{}
-	mcu, expectedRST := 0, uint8(rst0Marker)
-	var (
-		// b is the decoded coefficients, in natural (not zig-zag) order.
-		b  block
-		dc [maxComponents]int32
-		// bx and by are the location of the current block, in units of 8x8
-		// blocks: the third block in the first row has (bx, by) = (2, 0).
-		bx, by     int
-		blockCount int
-	)
-	for my := 0; my < myy; my++ {
-		for mx := 0; mx < mxx; mx++ {
-			for i := 0; i < nComp; i++ {
-				compIndex := scan[i].compIndex
-				hi := d.comp[compIndex].h
-				vi := d.comp[compIndex].v
-				qt := &d.quant[d.comp[compIndex].tq]
-				for j := 0; j < hi*vi; j++ {
-					// The blocks are traversed one MCU at a time. For 4:2:0 chroma
-					// subsampling, there are four Y 8x8 blocks in every 16x16 MCU.
-					//
-					// For a baseline 32x16 pixel image, the Y blocks visiting order is:
-					//	0 1 4 5
-					//	2 3 6 7
-					//
-					// For progressive images, the interleaved scans (those with nComp > 1)
-					// are traversed as above, but non-interleaved scans are traversed left
-					// to right, top to bottom:
-					//	0 1 2 3
-					//	4 5 6 7
-					// Only DC scans (zigStart == 0) can be interleaved. AC scans must have
-					// only one component.
-					//
-					// To further complicate matters, for non-interleaved scans, there is no
-					// data for any blocks that are inside the image at the MCU level but
-					// outside the image at the pixel level. For example, a 24x16 pixel 4:2:0
-					// progressive image consists of two 16x16 MCUs. The interleaved scans
-					// will process 8 Y blocks:
-					//	0 1 4 5
-					//	2 3 6 7
-					// The non-interleaved scans will process only 6 Y blocks:
-					//	0 1 2
-					//	3 4 5
-					if nComp != 1 {
-						bx = hi*mx + j%hi
-						by = vi*my + j/hi
-					} else {
-						q := mxx * hi
-						bx = blockCount % q
-						by = blockCount / q
-						blockCount++
-						if bx*8 >= d.width || by*8 >= d.height {
-							continue
-						}
-					}
-
-					// Load the previous partially decoded coefficients, if applicable.
-					if d.progressive {
-						b = d.progCoeffs[compIndex][by*mxx*hi+bx]
-					} else {
-						b = block{}
-					}
-
-					if ah != 0 {
-						if err := d.refine(&b, &d.huff[acTable][scan[i].ta], zigStart, zigEnd, 1<<al); err != nil {
-							return err
-						}
-					} else {
-						zig := zigStart
-						if zig == 0 {
-							zig++
-							// Decode the DC coefficient, as specified in section F.2.2.1.
-							value, err := d.decodeHuffman(&d.huff[dcTable][scan[i].td])
-							if err != nil {
-								return err
-							}
-							if value > 16 {
-								return UnsupportedError("excessive DC component")
-							}
-							dcDelta, err := d.receiveExtend(value)
-							if err != nil {
-								return err
-							}
-							dc[compIndex] += dcDelta
-							b[0] = dc[compIndex] << al
-						}
-
-						if zig <= zigEnd && d.eobRun > 0 {
-							d.eobRun--
-						} else {
-							// Decode the AC coefficients, as specified in section F.2.2.2.
-							huff := &d.huff[acTable][scan[i].ta]
-							for ; zig <= zigEnd; zig++ {
-								value, err := d.decodeHuffman(huff)
-								if err != nil {
-									return err
-								}
-								val0 := value >> 4
-								val1 := value & 0x0f
-								if val1 != 0 {
-									zig += int32(val0)
-									if zig > zigEnd {
-										break
-									}
-									ac, err := d.receiveExtend(val1)
-									if err != nil {
-										return err
-									}
-									b[unzig[zig]] = ac << al
-								} else {
-									if val0 != 0x0f {
-										d.eobRun = uint16(1 << val0)
-										if val0 != 0 {
-											bits, err := d.decodeBits(int32(val0))
-											if err != nil {
-												return err
-											}
-											d.eobRun |= uint16(bits)
-										}
-										d.eobRun--
-										break
-									}
-									zig += 0x0f
-								}
-							}
-						}
-					}
-
-					if d.progressive {
-						if zigEnd != blockSize-1 || al != 0 {
-							// We haven't completely decoded this 8x8 block. Save the coefficients.
-							d.progCoeffs[compIndex][by*mxx*hi+bx] = b
-							// At this point, we could execute the rest of the loop body to dequantize and
-							// perform the inverse DCT, to save early stages of a progressive image to the
-							// *image.YCbCr buffers (the whole point of progressive encoding), but in Go,
-							// the jpeg.Decode function does not return until the entire image is decoded,
-							// so we "continue" here to avoid wasted computation.
-							continue
-						}
-					}
-
-					// Dequantize, perform the inverse DCT and store the block to the image.
-					for zig := 0; zig < blockSize; zig++ {
-						b[unzig[zig]] *= qt[zig]
-					}
-					idct(&b)
-					dst, stride := []byte(nil), 0
-					if d.nComp == 1 {
-						dst, stride = d.img1.Pix[8*(by*d.img1.Stride+bx):], d.img1.Stride
-					} else {
-						switch compIndex {
-						case 0:
-							dst, stride = d.img3.Y[8*(by*d.img3.YStride+bx):], d.img3.YStride
-						case 1:
-							dst, stride = d.img3.Cb[8*(by*d.img3.CStride+bx):], d.img3.CStride
-						case 2:
-							dst, stride = d.img3.Cr[8*(by*d.img3.CStride+bx):], d.img3.CStride
-						case 3:
-							dst, stride = d.blackPix[8*(by*d.blackStride+bx):], d.blackStride
-						default:
-							return UnsupportedError("too many components")
-						}
-					}
-					// Level shift by +128, clip to [0, 255], and write to dst.
-					for y := 0; y < 8; y++ {
-						y8 := y * 8
-						yStride := y * stride
-						for x := 0; x < 8; x++ {
-							c := b[y8+x]
-							if c < -128 {
-								c = 0
-							} else if c > 127 {
-								c = 255
-							} else {
-								c += 128
-							}
-							dst[yStride+x] = uint8(c)
-						}
-					}
-				} // for j
-			} // for i
-			mcu++
-			if d.ri > 0 && mcu%d.ri == 0 && mcu < mxx*myy {
-				// A more sophisticated decoder could use RST[0-7] markers to resynchronize from corrupt input,
-				// but this one assumes well-formed input, and hence the restart marker follows immediately.
-				if err := d.readFull(d.tmp[:2]); err != nil {
-					return err
-				}
-				if d.tmp[0] != 0xff || d.tmp[1] != expectedRST {
-					return FormatError("bad RST marker")
-				}
-				expectedRST++
-				if expectedRST == rst7Marker+1 {
-					expectedRST = rst0Marker
-				}
-				// Reset the Huffman decoder.
-				d.bits = bits{}
-				// Reset the DC components, as per section F.2.1.3.1.
-				dc = [maxComponents]int32{}
-				// Reset the progressive decoder state, as per section G.1.2.2.
-				d.eobRun = 0
-			}
-		} // for mx
-	} // for my
-
-	return nil
-}
-
-// refine decodes a successive approximation refinement block, as specified in
-// section G.1.2.
-func (d *decoder) refine(b *block, h *huffman, zigStart, zigEnd, delta int32) error {
-	// Refining a DC component is trivial.
-	if zigStart == 0 {
-		if zigEnd != 0 {
-			panic("unreachable")
-		}
-		bit, err := d.decodeBit()
-		if err != nil {
-			return err
-		}
-		if bit {
-			b[0] |= delta
-		}
-		return nil
-	}
-
-	// Refining AC components is more complicated; see sections G.1.2.2 and G.1.2.3.
-	zig := zigStart
-	if d.eobRun == 0 {
-	loop:
-		for ; zig <= zigEnd; zig++ {
-			z := int32(0)
-			value, err := d.decodeHuffman(h)
-			if err != nil {
-				return err
-			}
-			val0 := value >> 4
-			val1 := value & 0x0f
-
-			switch val1 {
-			case 0:
-				if val0 != 0x0f {
-					d.eobRun = uint16(1 << val0)
-					if val0 != 0 {
-						bits, err := d.decodeBits(int32(val0))
-						if err != nil {
-							return err
-						}
-						d.eobRun |= uint16(bits)
-					}
-					break loop
-				}
-			case 1:
-				z = delta
-				bit, err := d.decodeBit()
-				if err != nil {
-					return err
-				}
-				if !bit {
-					z = -z
-				}
-			default:
-				return FormatError("unexpected Huffman code")
-			}
-
-			zig, err = d.refineNonZeroes(b, zig, zigEnd, int32(val0), delta)
-			if err != nil {
-				return err
-			}
-			if zig > zigEnd {
-				return FormatError("too many coefficients")
-			}
-			if z != 0 {
-				b[unzig[zig]] = z
-			}
-		}
-	}
-	if d.eobRun > 0 {
-		d.eobRun--
-		if _, err := d.refineNonZeroes(b, zig, zigEnd, -1, delta); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// refineNonZeroes refines non-zero entries of b in zig-zag order. If nz >= 0,
-// the first nz zero entries are skipped over.
-func (d *decoder) refineNonZeroes(b *block, zig, zigEnd, nz, delta int32) (int32, error) {
-	for ; zig <= zigEnd; zig++ {
-		u := unzig[zig]
-		if b[u] == 0 {
-			if nz == 0 {
-				break
-			}
-			nz--
-			continue
-		}
-		bit, err := d.decodeBit()
-		if err != nil {
-			return 0, err
-		}
-		if !bit {
-			continue
-		}
-		if b[u] >= 0 {
-			b[u] += delta
-		} else {
-			b[u] -= delta
-		}
-	}
-	return zig, nil
-}
diff --git a/third_party/gofrontend/libgo/go/image/jpeg/writer.go b/third_party/gofrontend/libgo/go/image/jpeg/writer.go
deleted file mode 100644
index 91bbde3..0000000
--- a/third_party/gofrontend/libgo/go/image/jpeg/writer.go
+++ /dev/null
@@ -1,614 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package jpeg
-
-import (
-	"bufio"
-	"errors"
-	"image"
-	"image/color"
-	"io"
-)
-
-// min returns the minimum of two integers.
-func min(x, y int) int {
-	if x < y {
-		return x
-	}
-	return y
-}
-
-// div returns a/b rounded to the nearest integer, instead of rounded to zero.
-func div(a, b int32) int32 {
-	if a >= 0 {
-		return (a + (b >> 1)) / b
-	}
-	return -((-a + (b >> 1)) / b)
-}
-
-// bitCount counts the number of bits needed to hold an integer.
-var bitCount = [256]byte{
-	0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
-	5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-	6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-	6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
-	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
-	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
-	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
-	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
-	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
-	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
-	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
-}
-
-type quantIndex int
-
-const (
-	quantIndexLuminance quantIndex = iota
-	quantIndexChrominance
-	nQuantIndex
-)
-
-// unscaledQuant are the unscaled quantization tables in zig-zag order. Each
-// encoder copies and scales the tables according to its quality parameter.
-// The values are derived from section K.1 after converting from natural to
-// zig-zag order.
-var unscaledQuant = [nQuantIndex][blockSize]byte{
-	// Luminance.
-	{
-		16, 11, 12, 14, 12, 10, 16, 14,
-		13, 14, 18, 17, 16, 19, 24, 40,
-		26, 24, 22, 22, 24, 49, 35, 37,
-		29, 40, 58, 51, 61, 60, 57, 51,
-		56, 55, 64, 72, 92, 78, 64, 68,
-		87, 69, 55, 56, 80, 109, 81, 87,
-		95, 98, 103, 104, 103, 62, 77, 113,
-		121, 112, 100, 120, 92, 101, 103, 99,
-	},
-	// Chrominance.
-	{
-		17, 18, 18, 24, 21, 24, 47, 26,
-		26, 47, 99, 66, 56, 66, 99, 99,
-		99, 99, 99, 99, 99, 99, 99, 99,
-		99, 99, 99, 99, 99, 99, 99, 99,
-		99, 99, 99, 99, 99, 99, 99, 99,
-		99, 99, 99, 99, 99, 99, 99, 99,
-		99, 99, 99, 99, 99, 99, 99, 99,
-		99, 99, 99, 99, 99, 99, 99, 99,
-	},
-}
-
-type huffIndex int
-
-const (
-	huffIndexLuminanceDC huffIndex = iota
-	huffIndexLuminanceAC
-	huffIndexChrominanceDC
-	huffIndexChrominanceAC
-	nHuffIndex
-)
-
-// huffmanSpec specifies a Huffman encoding.
-type huffmanSpec struct {
-	// count[i] is the number of codes of length i bits.
-	count [16]byte
-	// value[i] is the decoded value of the i'th codeword.
-	value []byte
-}
-
-// theHuffmanSpec is the Huffman encoding specifications.
-// This encoder uses the same Huffman encoding for all images.
-var theHuffmanSpec = [nHuffIndex]huffmanSpec{
-	// Luminance DC.
-	{
-		[16]byte{0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
-		[]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
-	},
-	// Luminance AC.
-	{
-		[16]byte{0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125},
-		[]byte{
-			0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
-			0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
-			0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
-			0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
-			0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
-			0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
-			0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
-			0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
-			0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
-			0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
-			0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
-			0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
-			0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
-			0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
-			0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
-			0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
-			0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
-			0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
-			0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
-			0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
-			0xf9, 0xfa,
-		},
-	},
-	// Chrominance DC.
-	{
-		[16]byte{0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
-		[]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
-	},
-	// Chrominance AC.
-	{
-		[16]byte{0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119},
-		[]byte{
-			0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
-			0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
-			0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
-			0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
-			0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
-			0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
-			0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
-			0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
-			0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
-			0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
-			0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
-			0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-			0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
-			0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
-			0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
-			0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
-			0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
-			0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
-			0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
-			0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
-			0xf9, 0xfa,
-		},
-	},
-}
-
-// huffmanLUT is a compiled look-up table representation of a huffmanSpec.
-// Each value maps to a uint32 of which the 8 most significant bits hold the
-// codeword size in bits and the 24 least significant bits hold the codeword.
-// The maximum codeword size is 16 bits.
-type huffmanLUT []uint32
-
-func (h *huffmanLUT) init(s huffmanSpec) {
-	maxValue := 0
-	for _, v := range s.value {
-		if int(v) > maxValue {
-			maxValue = int(v)
-		}
-	}
-	*h = make([]uint32, maxValue+1)
-	code, k := uint32(0), 0
-	for i := 0; i < len(s.count); i++ {
-		nBits := uint32(i+1) << 24
-		for j := uint8(0); j < s.count[i]; j++ {
-			(*h)[s.value[k]] = nBits | code
-			code++
-			k++
-		}
-		code <<= 1
-	}
-}
-
-// theHuffmanLUT are compiled representations of theHuffmanSpec.
-var theHuffmanLUT [4]huffmanLUT
-
-func init() {
-	for i, s := range theHuffmanSpec {
-		theHuffmanLUT[i].init(s)
-	}
-}
-
-// writer is a buffered writer.
-type writer interface {
-	Flush() error
-	io.Writer
-	io.ByteWriter
-}
-
-// encoder encodes an image to the JPEG format.
-type encoder struct {
-	// w is the writer to write to. err is the first error encountered during
-	// writing. All attempted writes after the first error become no-ops.
-	w   writer
-	err error
-	// buf is a scratch buffer.
-	buf [16]byte
-	// bits and nBits are accumulated bits to write to w.
-	bits, nBits uint32
-	// quant is the scaled quantization tables, in zig-zag order.
-	quant [nQuantIndex][blockSize]byte
-}
-
-func (e *encoder) flush() {
-	if e.err != nil {
-		return
-	}
-	e.err = e.w.Flush()
-}
-
-func (e *encoder) write(p []byte) {
-	if e.err != nil {
-		return
-	}
-	_, e.err = e.w.Write(p)
-}
-
-func (e *encoder) writeByte(b byte) {
-	if e.err != nil {
-		return
-	}
-	e.err = e.w.WriteByte(b)
-}
-
-// emit emits the least significant nBits bits of bits to the bit-stream.
-// The precondition is bits < 1<<nBits && nBits <= 16.
-func (e *encoder) emit(bits, nBits uint32) {
-	nBits += e.nBits
-	bits <<= 32 - nBits
-	bits |= e.bits
-	for nBits >= 8 {
-		b := uint8(bits >> 24)
-		e.writeByte(b)
-		if b == 0xff {
-			e.writeByte(0x00)
-		}
-		bits <<= 8
-		nBits -= 8
-	}
-	e.bits, e.nBits = bits, nBits
-}
-
-// emitHuff emits the given value with the given Huffman encoder.
-func (e *encoder) emitHuff(h huffIndex, value int32) {
-	x := theHuffmanLUT[h][value]
-	e.emit(x&(1<<24-1), x>>24)
-}
-
-// emitHuffRLE emits a run of runLength copies of value encoded with the given
-// Huffman encoder.
-func (e *encoder) emitHuffRLE(h huffIndex, runLength, value int32) {
-	a, b := value, value
-	if a < 0 {
-		a, b = -value, value-1
-	}
-	var nBits uint32
-	if a < 0x100 {
-		nBits = uint32(bitCount[a])
-	} else {
-		nBits = 8 + uint32(bitCount[a>>8])
-	}
-	e.emitHuff(h, runLength<<4|int32(nBits))
-	if nBits > 0 {
-		e.emit(uint32(b)&(1<<nBits-1), nBits)
-	}
-}
-
-// writeMarkerHeader writes the header for a marker with the given length.
-func (e *encoder) writeMarkerHeader(marker uint8, markerlen int) {
-	e.buf[0] = 0xff
-	e.buf[1] = marker
-	e.buf[2] = uint8(markerlen >> 8)
-	e.buf[3] = uint8(markerlen & 0xff)
-	e.write(e.buf[:4])
-}
-
-// writeDQT writes the Define Quantization Table marker.
-func (e *encoder) writeDQT() {
-	const markerlen = 2 + int(nQuantIndex)*(1+blockSize)
-	e.writeMarkerHeader(dqtMarker, markerlen)
-	for i := range e.quant {
-		e.writeByte(uint8(i))
-		e.write(e.quant[i][:])
-	}
-}
-
-// writeSOF0 writes the Start Of Frame (Baseline) marker.
-func (e *encoder) writeSOF0(size image.Point, nComponent int) {
-	markerlen := 8 + 3*nComponent
-	e.writeMarkerHeader(sof0Marker, markerlen)
-	e.buf[0] = 8 // 8-bit color.
-	e.buf[1] = uint8(size.Y >> 8)
-	e.buf[2] = uint8(size.Y & 0xff)
-	e.buf[3] = uint8(size.X >> 8)
-	e.buf[4] = uint8(size.X & 0xff)
-	e.buf[5] = uint8(nComponent)
-	if nComponent == 1 {
-		e.buf[6] = 1
-		// No subsampling for grayscale image.
-		e.buf[7] = 0x11
-		e.buf[8] = 0x00
-	} else {
-		for i := 0; i < nComponent; i++ {
-			e.buf[3*i+6] = uint8(i + 1)
-			// We use 4:2:0 chroma subsampling.
-			e.buf[3*i+7] = "\x22\x11\x11"[i]
-			e.buf[3*i+8] = "\x00\x01\x01"[i]
-		}
-	}
-	e.write(e.buf[:3*(nComponent-1)+9])
-}
-
-// writeDHT writes the Define Huffman Table marker.
-func (e *encoder) writeDHT(nComponent int) {
-	markerlen := 2
-	specs := theHuffmanSpec[:]
-	if nComponent == 1 {
-		// Drop the Chrominance tables.
-		specs = specs[:2]
-	}
-	for _, s := range specs {
-		markerlen += 1 + 16 + len(s.value)
-	}
-	e.writeMarkerHeader(dhtMarker, markerlen)
-	for i, s := range specs {
-		e.writeByte("\x00\x10\x01\x11"[i])
-		e.write(s.count[:])
-		e.write(s.value)
-	}
-}
-
-// writeBlock writes a block of pixel data using the given quantization table,
-// returning the post-quantized DC value of the DCT-transformed block. b is in
-// natural (not zig-zag) order.
-func (e *encoder) writeBlock(b *block, q quantIndex, prevDC int32) int32 {
-	fdct(b)
-	// Emit the DC delta.
-	dc := div(b[0], 8*int32(e.quant[q][0]))
-	e.emitHuffRLE(huffIndex(2*q+0), 0, dc-prevDC)
-	// Emit the AC components.
-	h, runLength := huffIndex(2*q+1), int32(0)
-	for zig := 1; zig < blockSize; zig++ {
-		ac := div(b[unzig[zig]], 8*int32(e.quant[q][zig]))
-		if ac == 0 {
-			runLength++
-		} else {
-			for runLength > 15 {
-				e.emitHuff(h, 0xf0)
-				runLength -= 16
-			}
-			e.emitHuffRLE(h, runLength, ac)
-			runLength = 0
-		}
-	}
-	if runLength > 0 {
-		e.emitHuff(h, 0x00)
-	}
-	return dc
-}
-
-// toYCbCr converts the 8x8 region of m whose top-left corner is p to its
-// YCbCr values.
-func toYCbCr(m image.Image, p image.Point, yBlock, cbBlock, crBlock *block) {
-	b := m.Bounds()
-	xmax := b.Max.X - 1
-	ymax := b.Max.Y - 1
-	for j := 0; j < 8; j++ {
-		for i := 0; i < 8; i++ {
-			r, g, b, _ := m.At(min(p.X+i, xmax), min(p.Y+j, ymax)).RGBA()
-			yy, cb, cr := color.RGBToYCbCr(uint8(r>>8), uint8(g>>8), uint8(b>>8))
-			yBlock[8*j+i] = int32(yy)
-			cbBlock[8*j+i] = int32(cb)
-			crBlock[8*j+i] = int32(cr)
-		}
-	}
-}
-
-// grayToY stores the 8x8 region of m whose top-left corner is p in yBlock.
-func grayToY(m *image.Gray, p image.Point, yBlock *block) {
-	b := m.Bounds()
-	xmax := b.Max.X - 1
-	ymax := b.Max.Y - 1
-	pix := m.Pix
-	for j := 0; j < 8; j++ {
-		for i := 0; i < 8; i++ {
-			idx := m.PixOffset(min(p.X+i, xmax), min(p.Y+j, ymax))
-			yBlock[8*j+i] = int32(pix[idx])
-		}
-	}
-}
-
-// rgbaToYCbCr is a specialized version of toYCbCr for image.RGBA images.
-func rgbaToYCbCr(m *image.RGBA, p image.Point, yBlock, cbBlock, crBlock *block) {
-	b := m.Bounds()
-	xmax := b.Max.X - 1
-	ymax := b.Max.Y - 1
-	for j := 0; j < 8; j++ {
-		sj := p.Y + j
-		if sj > ymax {
-			sj = ymax
-		}
-		offset := (sj-b.Min.Y)*m.Stride - b.Min.X*4
-		for i := 0; i < 8; i++ {
-			sx := p.X + i
-			if sx > xmax {
-				sx = xmax
-			}
-			pix := m.Pix[offset+sx*4:]
-			yy, cb, cr := color.RGBToYCbCr(pix[0], pix[1], pix[2])
-			yBlock[8*j+i] = int32(yy)
-			cbBlock[8*j+i] = int32(cb)
-			crBlock[8*j+i] = int32(cr)
-		}
-	}
-}
-
-// scale scales the 16x16 region represented by the 4 src blocks to the 8x8
-// dst block.
-func scale(dst *block, src *[4]block) {
-	for i := 0; i < 4; i++ {
-		dstOff := (i&2)<<4 | (i&1)<<2
-		for y := 0; y < 4; y++ {
-			for x := 0; x < 4; x++ {
-				j := 16*y + 2*x
-				sum := src[i][j] + src[i][j+1] + src[i][j+8] + src[i][j+9]
-				dst[8*y+x+dstOff] = (sum + 2) >> 2
-			}
-		}
-	}
-}
-
-// sosHeaderY is the SOS marker "\xff\xda" followed by 8 bytes:
-//	- the marker length "\x00\x08",
-//	- the number of components "\x01",
-//	- component 1 uses DC table 0 and AC table 0 "\x01\x00",
-//	- the bytes "\x00\x3f\x00". Section B.2.3 of the spec says that for
-//	  sequential DCTs, those bytes (8-bit Ss, 8-bit Se, 4-bit Ah, 4-bit Al)
-//	  should be 0x00, 0x3f, 0x00<<4 | 0x00.
-var sosHeaderY = []byte{
-	0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, 0x00, 0x3f, 0x00,
-}
-
-// sosHeaderYCbCr is the SOS marker "\xff\xda" followed by 12 bytes:
-//	- the marker length "\x00\x0c",
-//	- the number of components "\x03",
-//	- component 1 uses DC table 0 and AC table 0 "\x01\x00",
-//	- component 2 uses DC table 1 and AC table 1 "\x02\x11",
-//	- component 3 uses DC table 1 and AC table 1 "\x03\x11",
-//	- the bytes "\x00\x3f\x00". Section B.2.3 of the spec says that for
-//	  sequential DCTs, those bytes (8-bit Ss, 8-bit Se, 4-bit Ah, 4-bit Al)
-//	  should be 0x00, 0x3f, 0x00<<4 | 0x00.
-var sosHeaderYCbCr = []byte{
-	0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02,
-	0x11, 0x03, 0x11, 0x00, 0x3f, 0x00,
-}
-
-// writeSOS writes the StartOfScan marker.
-func (e *encoder) writeSOS(m image.Image) {
-	switch m.(type) {
-	case *image.Gray:
-		e.write(sosHeaderY)
-	default:
-		e.write(sosHeaderYCbCr)
-	}
-	var (
-		// Scratch buffers to hold the YCbCr values.
-		// The blocks are in natural (not zig-zag) order.
-		b      block
-		cb, cr [4]block
-		// DC components are delta-encoded.
-		prevDCY, prevDCCb, prevDCCr int32
-	)
-	bounds := m.Bounds()
-	switch m := m.(type) {
-	// TODO(wathiede): switch on m.ColorModel() instead of type.
-	case *image.Gray:
-		for y := bounds.Min.Y; y < bounds.Max.Y; y += 8 {
-			for x := bounds.Min.X; x < bounds.Max.X; x += 8 {
-				p := image.Pt(x, y)
-				grayToY(m, p, &b)
-				prevDCY = e.writeBlock(&b, 0, prevDCY)
-			}
-		}
-	default:
-		rgba, _ := m.(*image.RGBA)
-		for y := bounds.Min.Y; y < bounds.Max.Y; y += 16 {
-			for x := bounds.Min.X; x < bounds.Max.X; x += 16 {
-				for i := 0; i < 4; i++ {
-					xOff := (i & 1) * 8
-					yOff := (i & 2) * 4
-					p := image.Pt(x+xOff, y+yOff)
-					if rgba != nil {
-						rgbaToYCbCr(rgba, p, &b, &cb[i], &cr[i])
-					} else {
-						toYCbCr(m, p, &b, &cb[i], &cr[i])
-					}
-					prevDCY = e.writeBlock(&b, 0, prevDCY)
-				}
-				scale(&b, &cb)
-				prevDCCb = e.writeBlock(&b, 1, prevDCCb)
-				scale(&b, &cr)
-				prevDCCr = e.writeBlock(&b, 1, prevDCCr)
-			}
-		}
-	}
-	// Pad the last byte with 1's.
-	e.emit(0x7f, 7)
-}
-
-// DefaultQuality is the default quality encoding parameter.
-const DefaultQuality = 75
-
-// Options are the encoding parameters.
-// Quality ranges from 1 to 100 inclusive, higher is better.
-type Options struct {
-	Quality int
-}
-
-// Encode writes the Image m to w in JPEG 4:2:0 baseline format with the given
-// options. Default parameters are used if a nil *Options is passed.
-func Encode(w io.Writer, m image.Image, o *Options) error {
-	b := m.Bounds()
-	if b.Dx() >= 1<<16 || b.Dy() >= 1<<16 {
-		return errors.New("jpeg: image is too large to encode")
-	}
-	var e encoder
-	if ww, ok := w.(writer); ok {
-		e.w = ww
-	} else {
-		e.w = bufio.NewWriter(w)
-	}
-	// Clip quality to [1, 100].
-	quality := DefaultQuality
-	if o != nil {
-		quality = o.Quality
-		if quality < 1 {
-			quality = 1
-		} else if quality > 100 {
-			quality = 100
-		}
-	}
-	// Convert from a quality rating to a scaling factor.
-	var scale int
-	if quality < 50 {
-		scale = 5000 / quality
-	} else {
-		scale = 200 - quality*2
-	}
-	// Initialize the quantization tables.
-	for i := range e.quant {
-		for j := range e.quant[i] {
-			x := int(unscaledQuant[i][j])
-			x = (x*scale + 50) / 100
-			if x < 1 {
-				x = 1
-			} else if x > 255 {
-				x = 255
-			}
-			e.quant[i][j] = uint8(x)
-		}
-	}
-	// Compute number of components based on input image type.
-	nComponent := 3
-	switch m.(type) {
-	// TODO(wathiede): switch on m.ColorModel() instead of type.
-	case *image.Gray:
-		nComponent = 1
-	}
-	// Write the Start Of Image marker.
-	e.buf[0] = 0xff
-	e.buf[1] = 0xd8
-	e.write(e.buf[:2])
-	// Write the quantization tables.
-	e.writeDQT()
-	// Write the image dimensions.
-	e.writeSOF0(b.Size(), nComponent)
-	// Write the Huffman tables.
-	e.writeDHT(nComponent)
-	// Write the image data.
-	e.writeSOS(m)
-	// Write the End Of Image marker.
-	e.buf[0] = 0xff
-	e.buf[1] = 0xd9
-	e.write(e.buf[:2])
-	e.flush()
-	return e.err
-}
diff --git a/third_party/gofrontend/libgo/go/image/jpeg/writer_test.go b/third_party/gofrontend/libgo/go/image/jpeg/writer_test.go
deleted file mode 100644
index 3df3cfc..0000000
--- a/third_party/gofrontend/libgo/go/image/jpeg/writer_test.go
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package jpeg
-
-import (
-	"bytes"
-	"fmt"
-	"image"
-	"image/color"
-	"image/png"
-	"io/ioutil"
-	"math/rand"
-	"os"
-	"testing"
-)
-
-// zigzag maps from the natural ordering to the zig-zag ordering. For example,
-// zigzag[0*8 + 3] is the zig-zag sequence number of the element in the fourth
-// column and first row.
-var zigzag = [blockSize]int{
-	0, 1, 5, 6, 14, 15, 27, 28,
-	2, 4, 7, 13, 16, 26, 29, 42,
-	3, 8, 12, 17, 25, 30, 41, 43,
-	9, 11, 18, 24, 31, 40, 44, 53,
-	10, 19, 23, 32, 39, 45, 52, 54,
-	20, 22, 33, 38, 46, 51, 55, 60,
-	21, 34, 37, 47, 50, 56, 59, 61,
-	35, 36, 48, 49, 57, 58, 62, 63,
-}
-
-func TestZigUnzig(t *testing.T) {
-	for i := 0; i < blockSize; i++ {
-		if unzig[zigzag[i]] != i {
-			t.Errorf("unzig[zigzag[%d]] == %d", i, unzig[zigzag[i]])
-		}
-		if zigzag[unzig[i]] != i {
-			t.Errorf("zigzag[unzig[%d]] == %d", i, zigzag[unzig[i]])
-		}
-	}
-}
-
-// unscaledQuantInNaturalOrder are the unscaled quantization tables in
-// natural (not zig-zag) order, as specified in section K.1.
-var unscaledQuantInNaturalOrder = [nQuantIndex][blockSize]byte{
-	// Luminance.
-	{
-		16, 11, 10, 16, 24, 40, 51, 61,
-		12, 12, 14, 19, 26, 58, 60, 55,
-		14, 13, 16, 24, 40, 57, 69, 56,
-		14, 17, 22, 29, 51, 87, 80, 62,
-		18, 22, 37, 56, 68, 109, 103, 77,
-		24, 35, 55, 64, 81, 104, 113, 92,
-		49, 64, 78, 87, 103, 121, 120, 101,
-		72, 92, 95, 98, 112, 100, 103, 99,
-	},
-	// Chrominance.
-	{
-		17, 18, 24, 47, 99, 99, 99, 99,
-		18, 21, 26, 66, 99, 99, 99, 99,
-		24, 26, 56, 99, 99, 99, 99, 99,
-		47, 66, 99, 99, 99, 99, 99, 99,
-		99, 99, 99, 99, 99, 99, 99, 99,
-		99, 99, 99, 99, 99, 99, 99, 99,
-		99, 99, 99, 99, 99, 99, 99, 99,
-		99, 99, 99, 99, 99, 99, 99, 99,
-	},
-}
-
-func TestUnscaledQuant(t *testing.T) {
-	bad := false
-	for i := quantIndex(0); i < nQuantIndex; i++ {
-		for zig := 0; zig < blockSize; zig++ {
-			got := unscaledQuant[i][zig]
-			want := unscaledQuantInNaturalOrder[i][unzig[zig]]
-			if got != want {
-				t.Errorf("i=%d, zig=%d: got %d, want %d", i, zig, got, want)
-				bad = true
-			}
-		}
-	}
-	if bad {
-		names := [nQuantIndex]string{"Luminance", "Chrominance"}
-		buf := &bytes.Buffer{}
-		for i, name := range names {
-			fmt.Fprintf(buf, "// %s.\n{\n", name)
-			for zig := 0; zig < blockSize; zig++ {
-				fmt.Fprintf(buf, "%d, ", unscaledQuantInNaturalOrder[i][unzig[zig]])
-				if zig%8 == 7 {
-					buf.WriteString("\n")
-				}
-			}
-			buf.WriteString("},\n")
-		}
-		t.Logf("expected unscaledQuant values:\n%s", buf.String())
-	}
-}
-
-var testCase = []struct {
-	filename  string
-	quality   int
-	tolerance int64
-}{
-	{"../testdata/video-001.png", 1, 24 << 8},
-	{"../testdata/video-001.png", 20, 12 << 8},
-	{"../testdata/video-001.png", 60, 8 << 8},
-	{"../testdata/video-001.png", 80, 6 << 8},
-	{"../testdata/video-001.png", 90, 4 << 8},
-	{"../testdata/video-001.png", 100, 2 << 8},
-}
-
-func delta(u0, u1 uint32) int64 {
-	d := int64(u0) - int64(u1)
-	if d < 0 {
-		return -d
-	}
-	return d
-}
-
-func readPng(filename string) (image.Image, error) {
-	f, err := os.Open(filename)
-	if err != nil {
-		return nil, err
-	}
-	defer f.Close()
-	return png.Decode(f)
-}
-
-func TestWriter(t *testing.T) {
-	for _, tc := range testCase {
-		// Read the image.
-		m0, err := readPng(tc.filename)
-		if err != nil {
-			t.Error(tc.filename, err)
-			continue
-		}
-		// Encode that image as JPEG.
-		var buf bytes.Buffer
-		err = Encode(&buf, m0, &Options{Quality: tc.quality})
-		if err != nil {
-			t.Error(tc.filename, err)
-			continue
-		}
-		// Decode that JPEG.
-		m1, err := Decode(&buf)
-		if err != nil {
-			t.Error(tc.filename, err)
-			continue
-		}
-		if m0.Bounds() != m1.Bounds() {
-			t.Errorf("%s, bounds differ: %v and %v", tc.filename, m0.Bounds(), m1.Bounds())
-			continue
-		}
-		// Compare the average delta to the tolerance level.
-		if averageDelta(m0, m1) > tc.tolerance {
-			t.Errorf("%s, quality=%d: average delta is too high", tc.filename, tc.quality)
-			continue
-		}
-	}
-}
-
-// TestWriteGrayscale tests that a grayscale images survives a round-trip
-// through encode/decode cycle.
-func TestWriteGrayscale(t *testing.T) {
-	m0 := image.NewGray(image.Rect(0, 0, 32, 32))
-	for i := range m0.Pix {
-		m0.Pix[i] = uint8(i)
-	}
-	var buf bytes.Buffer
-	if err := Encode(&buf, m0, nil); err != nil {
-		t.Fatal(err)
-	}
-	m1, err := Decode(&buf)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if m0.Bounds() != m1.Bounds() {
-		t.Fatalf("bounds differ: %v and %v", m0.Bounds(), m1.Bounds())
-	}
-	if _, ok := m1.(*image.Gray); !ok {
-		t.Errorf("got %T, want *image.Gray", m1)
-	}
-	// Compare the average delta to the tolerance level.
-	want := int64(2 << 8)
-	if got := averageDelta(m0, m1); got > want {
-		t.Errorf("average delta too high; got %d, want <= %d", got, want)
-	}
-}
-
-// averageDelta returns the average delta in RGB space. The two images must
-// have the same bounds.
-func averageDelta(m0, m1 image.Image) int64 {
-	b := m0.Bounds()
-	var sum, n int64
-	for y := b.Min.Y; y < b.Max.Y; y++ {
-		for x := b.Min.X; x < b.Max.X; x++ {
-			c0 := m0.At(x, y)
-			c1 := m1.At(x, y)
-			r0, g0, b0, _ := c0.RGBA()
-			r1, g1, b1, _ := c1.RGBA()
-			sum += delta(r0, r1)
-			sum += delta(g0, g1)
-			sum += delta(b0, b1)
-			n += 3
-		}
-	}
-	return sum / n
-}
-
-func BenchmarkEncode(b *testing.B) {
-	b.StopTimer()
-	img := image.NewRGBA(image.Rect(0, 0, 640, 480))
-	bo := img.Bounds()
-	rnd := rand.New(rand.NewSource(123))
-	for y := bo.Min.Y; y < bo.Max.Y; y++ {
-		for x := bo.Min.X; x < bo.Max.X; x++ {
-			img.SetRGBA(x, y, color.RGBA{
-				uint8(rnd.Intn(256)),
-				uint8(rnd.Intn(256)),
-				uint8(rnd.Intn(256)),
-				255,
-			})
-		}
-	}
-	b.SetBytes(640 * 480 * 4)
-	b.StartTimer()
-	options := &Options{Quality: 90}
-	for i := 0; i < b.N; i++ {
-		Encode(ioutil.Discard, img, options)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/names.go b/third_party/gofrontend/libgo/go/image/names.go
deleted file mode 100644
index 8985f49..0000000
--- a/third_party/gofrontend/libgo/go/image/names.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package image
-
-import (
-	"image/color"
-)
-
-var (
-	// Black is an opaque black uniform image.
-	Black = NewUniform(color.Black)
-	// White is an opaque white uniform image.
-	White = NewUniform(color.White)
-	// Transparent is a fully transparent uniform image.
-	Transparent = NewUniform(color.Transparent)
-	// Opaque is a fully opaque uniform image.
-	Opaque = NewUniform(color.Opaque)
-)
-
-// Uniform is an infinite-sized Image of uniform color.
-// It implements the color.Color, color.Model, and Image interfaces.
-type Uniform struct {
-	C color.Color
-}
-
-func (c *Uniform) RGBA() (r, g, b, a uint32) {
-	return c.C.RGBA()
-}
-
-func (c *Uniform) ColorModel() color.Model {
-	return c
-}
-
-func (c *Uniform) Convert(color.Color) color.Color {
-	return c.C
-}
-
-func (c *Uniform) Bounds() Rectangle { return Rectangle{Point{-1e9, -1e9}, Point{1e9, 1e9}} }
-
-func (c *Uniform) At(x, y int) color.Color { return c.C }
-
-// Opaque scans the entire image and reports whether it is fully opaque.
-func (c *Uniform) Opaque() bool {
-	_, _, _, a := c.C.RGBA()
-	return a == 0xffff
-}
-
-func NewUniform(c color.Color) *Uniform {
-	return &Uniform{c}
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/paeth.go b/third_party/gofrontend/libgo/go/image/png/paeth.go
deleted file mode 100644
index 9ed6300..0000000
--- a/third_party/gofrontend/libgo/go/image/png/paeth.go
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package png
-
-// intSize is either 32 or 64.
-const intSize = 32 << (^uint(0) >> 63)
-
-func abs(x int) int {
-	// m := -1 if x < 0. m := 0 otherwise.
-	m := x >> (intSize - 1)
-
-	// In two's complement representation, the negative number
-	// of any number (except the smallest one) can be computed
-	// by flipping all the bits and add 1. This is faster than
-	// code with a branch.
-	// See Hacker's Delight, section 2-4.
-	return (x ^ m) - m
-}
-
-// paeth implements the Paeth filter function, as per the PNG specification.
-func paeth(a, b, c uint8) uint8 {
-	// This is an optimized version of the sample code in the PNG spec.
-	// For example, the sample code starts with:
-	//	p := int(a) + int(b) - int(c)
-	//	pa := abs(p - int(a))
-	// but the optimized form uses fewer arithmetic operations:
-	//	pa := int(b) - int(c)
-	//	pa = abs(pa)
-	pc := int(c)
-	pa := int(b) - pc
-	pb := int(a) - pc
-	pc = abs(pa + pb)
-	pa = abs(pa)
-	pb = abs(pb)
-	if pa <= pb && pa <= pc {
-		return a
-	} else if pb <= pc {
-		return b
-	}
-	return c
-}
-
-// filterPaeth applies the Paeth filter to the cdat slice.
-// cdat is the current row's data, pdat is the previous row's data.
-func filterPaeth(cdat, pdat []byte, bytesPerPixel int) {
-	var a, b, c, pa, pb, pc int
-	for i := 0; i < bytesPerPixel; i++ {
-		a, c = 0, 0
-		for j := i; j < len(cdat); j += bytesPerPixel {
-			b = int(pdat[j])
-			pa = b - c
-			pb = a - c
-			pc = abs(pa + pb)
-			pa = abs(pa)
-			pb = abs(pb)
-			if pa <= pb && pa <= pc {
-				// No-op.
-			} else if pb <= pc {
-				a = b
-			} else {
-				a = c
-			}
-			a += int(cdat[j])
-			a &= 0xff
-			cdat[j] = uint8(a)
-			c = b
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/paeth_test.go b/third_party/gofrontend/libgo/go/image/png/paeth_test.go
deleted file mode 100644
index cfc1896..0000000
--- a/third_party/gofrontend/libgo/go/image/png/paeth_test.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package png
-
-import (
-	"bytes"
-	"math/rand"
-	"testing"
-)
-
-func slowAbs(x int) int {
-	if x < 0 {
-		return -x
-	}
-	return x
-}
-
-// slowPaeth is a slow but simple implementation of the Paeth function.
-// It is a straight port of the sample code in the PNG spec, section 9.4.
-func slowPaeth(a, b, c uint8) uint8 {
-	p := int(a) + int(b) - int(c)
-	pa := slowAbs(p - int(a))
-	pb := slowAbs(p - int(b))
-	pc := slowAbs(p - int(c))
-	if pa <= pb && pa <= pc {
-		return a
-	} else if pb <= pc {
-		return b
-	}
-	return c
-}
-
-// slowFilterPaeth is a slow but simple implementation of func filterPaeth.
-func slowFilterPaeth(cdat, pdat []byte, bytesPerPixel int) {
-	for i := 0; i < bytesPerPixel; i++ {
-		cdat[i] += paeth(0, pdat[i], 0)
-	}
-	for i := bytesPerPixel; i < len(cdat); i++ {
-		cdat[i] += paeth(cdat[i-bytesPerPixel], pdat[i], pdat[i-bytesPerPixel])
-	}
-}
-
-func TestPaeth(t *testing.T) {
-	for a := 0; a < 256; a += 15 {
-		for b := 0; b < 256; b += 15 {
-			for c := 0; c < 256; c += 15 {
-				got := paeth(uint8(a), uint8(b), uint8(c))
-				want := slowPaeth(uint8(a), uint8(b), uint8(c))
-				if got != want {
-					t.Errorf("a, b, c = %d, %d, %d: got %d, want %d", a, b, c, got, want)
-				}
-			}
-		}
-	}
-}
-
-func BenchmarkPaeth(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		paeth(uint8(i>>16), uint8(i>>8), uint8(i))
-	}
-}
-
-func TestPaethDecode(t *testing.T) {
-	pdat0 := make([]byte, 32)
-	pdat1 := make([]byte, 32)
-	pdat2 := make([]byte, 32)
-	cdat0 := make([]byte, 32)
-	cdat1 := make([]byte, 32)
-	cdat2 := make([]byte, 32)
-	r := rand.New(rand.NewSource(1))
-	for bytesPerPixel := 1; bytesPerPixel <= 8; bytesPerPixel++ {
-		for i := 0; i < 100; i++ {
-			for j := range pdat0 {
-				pdat0[j] = uint8(r.Uint32())
-				cdat0[j] = uint8(r.Uint32())
-			}
-			copy(pdat1, pdat0)
-			copy(pdat2, pdat0)
-			copy(cdat1, cdat0)
-			copy(cdat2, cdat0)
-			filterPaeth(cdat1, pdat1, bytesPerPixel)
-			slowFilterPaeth(cdat2, pdat2, bytesPerPixel)
-			if !bytes.Equal(cdat1, cdat2) {
-				t.Errorf("bytesPerPixel: %d\npdat0: % x\ncdat0: % x\ngot:   % x\nwant:  % x", bytesPerPixel, pdat0, cdat0, cdat1, cdat2)
-				break
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/reader.go b/third_party/gofrontend/libgo/go/image/png/reader.go
deleted file mode 100644
index bbd6f75..0000000
--- a/third_party/gofrontend/libgo/go/image/png/reader.go
+++ /dev/null
@@ -1,846 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package png implements a PNG image decoder and encoder.
-//
-// The PNG specification is at http://www.w3.org/TR/PNG/.
-package png
-
-import (
-	"compress/zlib"
-	"encoding/binary"
-	"fmt"
-	"hash"
-	"hash/crc32"
-	"image"
-	"image/color"
-	"io"
-)
-
-// Color type, as per the PNG spec.
-const (
-	ctGrayscale      = 0
-	ctTrueColor      = 2
-	ctPaletted       = 3
-	ctGrayscaleAlpha = 4
-	ctTrueColorAlpha = 6
-)
-
-// A cb is a combination of color type and bit depth.
-const (
-	cbInvalid = iota
-	cbG1
-	cbG2
-	cbG4
-	cbG8
-	cbGA8
-	cbTC8
-	cbP1
-	cbP2
-	cbP4
-	cbP8
-	cbTCA8
-	cbG16
-	cbGA16
-	cbTC16
-	cbTCA16
-)
-
-func cbPaletted(cb int) bool {
-	return cbP1 <= cb && cb <= cbP8
-}
-
-// Filter type, as per the PNG spec.
-const (
-	ftNone    = 0
-	ftSub     = 1
-	ftUp      = 2
-	ftAverage = 3
-	ftPaeth   = 4
-	nFilter   = 5
-)
-
-// Interlace type.
-const (
-	itNone  = 0
-	itAdam7 = 1
-)
-
-// interlaceScan defines the placement and size of a pass for Adam7 interlacing.
-type interlaceScan struct {
-	xFactor, yFactor, xOffset, yOffset int
-}
-
-// interlacing defines Adam7 interlacing, with 7 passes of reduced images.
-// See http://www.w3.org/TR/PNG/#8Interlace
-var interlacing = []interlaceScan{
-	{8, 8, 0, 0},
-	{8, 8, 4, 0},
-	{4, 8, 0, 4},
-	{4, 4, 2, 0},
-	{2, 4, 0, 2},
-	{2, 2, 1, 0},
-	{1, 2, 0, 1},
-}
-
-// Decoding stage.
-// The PNG specification says that the IHDR, PLTE (if present), tRNS (if
-// present), IDAT and IEND chunks must appear in that order. There may be
-// multiple IDAT chunks, and IDAT chunks must be sequential (i.e. they may not
-// have any other chunks between them).
-// http://www.w3.org/TR/PNG/#5ChunkOrdering
-const (
-	dsStart = iota
-	dsSeenIHDR
-	dsSeenPLTE
-	dsSeentRNS
-	dsSeenIDAT
-	dsSeenIEND
-)
-
-const pngHeader = "\x89PNG\r\n\x1a\n"
-
-type decoder struct {
-	r             io.Reader
-	img           image.Image
-	crc           hash.Hash32
-	width, height int
-	depth         int
-	palette       color.Palette
-	cb            int
-	stage         int
-	idatLength    uint32
-	tmp           [3 * 256]byte
-	interlace     int
-}
-
-// A FormatError reports that the input is not a valid PNG.
-type FormatError string
-
-func (e FormatError) Error() string { return "png: invalid format: " + string(e) }
-
-var chunkOrderError = FormatError("chunk out of order")
-
-// An UnsupportedError reports that the input uses a valid but unimplemented PNG feature.
-type UnsupportedError string
-
-func (e UnsupportedError) Error() string { return "png: unsupported feature: " + string(e) }
-
-func min(a, b int) int {
-	if a < b {
-		return a
-	}
-	return b
-}
-
-func (d *decoder) parseIHDR(length uint32) error {
-	if length != 13 {
-		return FormatError("bad IHDR length")
-	}
-	if _, err := io.ReadFull(d.r, d.tmp[:13]); err != nil {
-		return err
-	}
-	d.crc.Write(d.tmp[:13])
-	if d.tmp[10] != 0 {
-		return UnsupportedError("compression method")
-	}
-	if d.tmp[11] != 0 {
-		return UnsupportedError("filter method")
-	}
-	if d.tmp[12] != itNone && d.tmp[12] != itAdam7 {
-		return FormatError("invalid interlace method")
-	}
-	d.interlace = int(d.tmp[12])
-	w := int32(binary.BigEndian.Uint32(d.tmp[0:4]))
-	h := int32(binary.BigEndian.Uint32(d.tmp[4:8]))
-	if w < 0 || h < 0 {
-		return FormatError("negative dimension")
-	}
-	nPixels := int64(w) * int64(h)
-	if nPixels != int64(int(nPixels)) {
-		return UnsupportedError("dimension overflow")
-	}
-	d.cb = cbInvalid
-	d.depth = int(d.tmp[8])
-	switch d.depth {
-	case 1:
-		switch d.tmp[9] {
-		case ctGrayscale:
-			d.cb = cbG1
-		case ctPaletted:
-			d.cb = cbP1
-		}
-	case 2:
-		switch d.tmp[9] {
-		case ctGrayscale:
-			d.cb = cbG2
-		case ctPaletted:
-			d.cb = cbP2
-		}
-	case 4:
-		switch d.tmp[9] {
-		case ctGrayscale:
-			d.cb = cbG4
-		case ctPaletted:
-			d.cb = cbP4
-		}
-	case 8:
-		switch d.tmp[9] {
-		case ctGrayscale:
-			d.cb = cbG8
-		case ctTrueColor:
-			d.cb = cbTC8
-		case ctPaletted:
-			d.cb = cbP8
-		case ctGrayscaleAlpha:
-			d.cb = cbGA8
-		case ctTrueColorAlpha:
-			d.cb = cbTCA8
-		}
-	case 16:
-		switch d.tmp[9] {
-		case ctGrayscale:
-			d.cb = cbG16
-		case ctTrueColor:
-			d.cb = cbTC16
-		case ctGrayscaleAlpha:
-			d.cb = cbGA16
-		case ctTrueColorAlpha:
-			d.cb = cbTCA16
-		}
-	}
-	if d.cb == cbInvalid {
-		return UnsupportedError(fmt.Sprintf("bit depth %d, color type %d", d.tmp[8], d.tmp[9]))
-	}
-	d.width, d.height = int(w), int(h)
-	return d.verifyChecksum()
-}
-
-func (d *decoder) parsePLTE(length uint32) error {
-	np := int(length / 3) // The number of palette entries.
-	if length%3 != 0 || np <= 0 || np > 256 || np > 1<<uint(d.depth) {
-		return FormatError("bad PLTE length")
-	}
-	n, err := io.ReadFull(d.r, d.tmp[:3*np])
-	if err != nil {
-		return err
-	}
-	d.crc.Write(d.tmp[:n])
-	switch d.cb {
-	case cbP1, cbP2, cbP4, cbP8:
-		d.palette = make(color.Palette, 256)
-		for i := 0; i < np; i++ {
-			d.palette[i] = color.RGBA{d.tmp[3*i+0], d.tmp[3*i+1], d.tmp[3*i+2], 0xff}
-		}
-		for i := np; i < 256; i++ {
-			// Initialize the rest of the palette to opaque black. The spec (section
-			// 11.2.3) says that "any out-of-range pixel value found in the image data
-			// is an error", but some real-world PNG files have out-of-range pixel
-			// values. We fall back to opaque black, the same as libpng 1.5.13;
-			// ImageMagick 6.5.7 returns an error.
-			d.palette[i] = color.RGBA{0x00, 0x00, 0x00, 0xff}
-		}
-		d.palette = d.palette[:np]
-	case cbTC8, cbTCA8, cbTC16, cbTCA16:
-		// As per the PNG spec, a PLTE chunk is optional (and for practical purposes,
-		// ignorable) for the ctTrueColor and ctTrueColorAlpha color types (section 4.1.2).
-	default:
-		return FormatError("PLTE, color type mismatch")
-	}
-	return d.verifyChecksum()
-}
-
-func (d *decoder) parsetRNS(length uint32) error {
-	if length > 256 {
-		return FormatError("bad tRNS length")
-	}
-	n, err := io.ReadFull(d.r, d.tmp[:length])
-	if err != nil {
-		return err
-	}
-	d.crc.Write(d.tmp[:n])
-	switch d.cb {
-	case cbG8, cbG16:
-		return UnsupportedError("grayscale transparency")
-	case cbTC8, cbTC16:
-		return UnsupportedError("truecolor transparency")
-	case cbP1, cbP2, cbP4, cbP8:
-		if len(d.palette) < n {
-			d.palette = d.palette[:n]
-		}
-		for i := 0; i < n; i++ {
-			rgba := d.palette[i].(color.RGBA)
-			d.palette[i] = color.NRGBA{rgba.R, rgba.G, rgba.B, d.tmp[i]}
-		}
-	case cbGA8, cbGA16, cbTCA8, cbTCA16:
-		return FormatError("tRNS, color type mismatch")
-	}
-	return d.verifyChecksum()
-}
-
-// Read presents one or more IDAT chunks as one continuous stream (minus the
-// intermediate chunk headers and footers). If the PNG data looked like:
-//   ... len0 IDAT xxx crc0 len1 IDAT yy crc1 len2 IEND crc2
-// then this reader presents xxxyy. For well-formed PNG data, the decoder state
-// immediately before the first Read call is that d.r is positioned between the
-// first IDAT and xxx, and the decoder state immediately after the last Read
-// call is that d.r is positioned between yy and crc1.
-func (d *decoder) Read(p []byte) (int, error) {
-	if len(p) == 0 {
-		return 0, nil
-	}
-	for d.idatLength == 0 {
-		// We have exhausted an IDAT chunk. Verify the checksum of that chunk.
-		if err := d.verifyChecksum(); err != nil {
-			return 0, err
-		}
-		// Read the length and chunk type of the next chunk, and check that
-		// it is an IDAT chunk.
-		if _, err := io.ReadFull(d.r, d.tmp[:8]); err != nil {
-			return 0, err
-		}
-		d.idatLength = binary.BigEndian.Uint32(d.tmp[:4])
-		if string(d.tmp[4:8]) != "IDAT" {
-			return 0, FormatError("not enough pixel data")
-		}
-		d.crc.Reset()
-		d.crc.Write(d.tmp[4:8])
-	}
-	if int(d.idatLength) < 0 {
-		return 0, UnsupportedError("IDAT chunk length overflow")
-	}
-	n, err := d.r.Read(p[:min(len(p), int(d.idatLength))])
-	d.crc.Write(p[:n])
-	d.idatLength -= uint32(n)
-	return n, err
-}
-
-// decode decodes the IDAT data into an image.
-func (d *decoder) decode() (image.Image, error) {
-	r, err := zlib.NewReader(d)
-	if err != nil {
-		return nil, err
-	}
-	defer r.Close()
-	var img image.Image
-	if d.interlace == itNone {
-		img, err = d.readImagePass(r, 0, false)
-		if err != nil {
-			return nil, err
-		}
-	} else if d.interlace == itAdam7 {
-		// Allocate a blank image of the full size.
-		img, err = d.readImagePass(nil, 0, true)
-		if err != nil {
-			return nil, err
-		}
-		for pass := 0; pass < 7; pass++ {
-			imagePass, err := d.readImagePass(r, pass, false)
-			if err != nil {
-				return nil, err
-			}
-			if imagePass != nil {
-				d.mergePassInto(img, imagePass, pass)
-			}
-		}
-	}
-
-	// Check for EOF, to verify the zlib checksum.
-	n := 0
-	for i := 0; n == 0 && err == nil; i++ {
-		if i == 100 {
-			return nil, io.ErrNoProgress
-		}
-		n, err = r.Read(d.tmp[:1])
-	}
-	if err != nil && err != io.EOF {
-		return nil, FormatError(err.Error())
-	}
-	if n != 0 || d.idatLength != 0 {
-		return nil, FormatError("too much pixel data")
-	}
-
-	return img, nil
-}
-
-// readImagePass reads a single image pass, sized according to the pass number.
-func (d *decoder) readImagePass(r io.Reader, pass int, allocateOnly bool) (image.Image, error) {
-	var bitsPerPixel int = 0
-	pixOffset := 0
-	var (
-		gray     *image.Gray
-		rgba     *image.RGBA
-		paletted *image.Paletted
-		nrgba    *image.NRGBA
-		gray16   *image.Gray16
-		rgba64   *image.RGBA64
-		nrgba64  *image.NRGBA64
-		img      image.Image
-	)
-	width, height := d.width, d.height
-	if d.interlace == itAdam7 && !allocateOnly {
-		p := interlacing[pass]
-		// Add the multiplication factor and subtract one, effectively rounding up.
-		width = (width - p.xOffset + p.xFactor - 1) / p.xFactor
-		height = (height - p.yOffset + p.yFactor - 1) / p.yFactor
-		// A PNG image can't have zero width or height, but for an interlaced
-		// image, an individual pass might have zero width or height. If so, we
-		// shouldn't even read a per-row filter type byte, so return early.
-		if width == 0 || height == 0 {
-			return nil, nil
-		}
-	}
-	switch d.cb {
-	case cbG1, cbG2, cbG4, cbG8:
-		bitsPerPixel = d.depth
-		gray = image.NewGray(image.Rect(0, 0, width, height))
-		img = gray
-	case cbGA8:
-		bitsPerPixel = 16
-		nrgba = image.NewNRGBA(image.Rect(0, 0, width, height))
-		img = nrgba
-	case cbTC8:
-		bitsPerPixel = 24
-		rgba = image.NewRGBA(image.Rect(0, 0, width, height))
-		img = rgba
-	case cbP1, cbP2, cbP4, cbP8:
-		bitsPerPixel = d.depth
-		paletted = image.NewPaletted(image.Rect(0, 0, width, height), d.palette)
-		img = paletted
-	case cbTCA8:
-		bitsPerPixel = 32
-		nrgba = image.NewNRGBA(image.Rect(0, 0, width, height))
-		img = nrgba
-	case cbG16:
-		bitsPerPixel = 16
-		gray16 = image.NewGray16(image.Rect(0, 0, width, height))
-		img = gray16
-	case cbGA16:
-		bitsPerPixel = 32
-		nrgba64 = image.NewNRGBA64(image.Rect(0, 0, width, height))
-		img = nrgba64
-	case cbTC16:
-		bitsPerPixel = 48
-		rgba64 = image.NewRGBA64(image.Rect(0, 0, width, height))
-		img = rgba64
-	case cbTCA16:
-		bitsPerPixel = 64
-		nrgba64 = image.NewNRGBA64(image.Rect(0, 0, width, height))
-		img = nrgba64
-	}
-	if allocateOnly {
-		return img, nil
-	}
-	bytesPerPixel := (bitsPerPixel + 7) / 8
-
-	// The +1 is for the per-row filter type, which is at cr[0].
-	rowSize := 1 + (bitsPerPixel*width+7)/8
-	// cr and pr are the bytes for the current and previous row.
-	cr := make([]uint8, rowSize)
-	pr := make([]uint8, rowSize)
-
-	for y := 0; y < height; y++ {
-		// Read the decompressed bytes.
-		_, err := io.ReadFull(r, cr)
-		if err != nil {
-			if err == io.EOF || err == io.ErrUnexpectedEOF {
-				return nil, FormatError("not enough pixel data")
-			}
-			return nil, err
-		}
-
-		// Apply the filter.
-		cdat := cr[1:]
-		pdat := pr[1:]
-		switch cr[0] {
-		case ftNone:
-			// No-op.
-		case ftSub:
-			for i := bytesPerPixel; i < len(cdat); i++ {
-				cdat[i] += cdat[i-bytesPerPixel]
-			}
-		case ftUp:
-			for i, p := range pdat {
-				cdat[i] += p
-			}
-		case ftAverage:
-			// The first column has no column to the left of it, so it is a
-			// special case. We know that the first column exists because we
-			// check above that width != 0, and so len(cdat) != 0.
-			for i := 0; i < bytesPerPixel; i++ {
-				cdat[i] += pdat[i] / 2
-			}
-			for i := bytesPerPixel; i < len(cdat); i++ {
-				cdat[i] += uint8((int(cdat[i-bytesPerPixel]) + int(pdat[i])) / 2)
-			}
-		case ftPaeth:
-			filterPaeth(cdat, pdat, bytesPerPixel)
-		default:
-			return nil, FormatError("bad filter type")
-		}
-
-		// Convert from bytes to colors.
-		switch d.cb {
-		case cbG1:
-			for x := 0; x < width; x += 8 {
-				b := cdat[x/8]
-				for x2 := 0; x2 < 8 && x+x2 < width; x2++ {
-					gray.SetGray(x+x2, y, color.Gray{(b >> 7) * 0xff})
-					b <<= 1
-				}
-			}
-		case cbG2:
-			for x := 0; x < width; x += 4 {
-				b := cdat[x/4]
-				for x2 := 0; x2 < 4 && x+x2 < width; x2++ {
-					gray.SetGray(x+x2, y, color.Gray{(b >> 6) * 0x55})
-					b <<= 2
-				}
-			}
-		case cbG4:
-			for x := 0; x < width; x += 2 {
-				b := cdat[x/2]
-				for x2 := 0; x2 < 2 && x+x2 < width; x2++ {
-					gray.SetGray(x+x2, y, color.Gray{(b >> 4) * 0x11})
-					b <<= 4
-				}
-			}
-		case cbG8:
-			copy(gray.Pix[pixOffset:], cdat)
-			pixOffset += gray.Stride
-		case cbGA8:
-			for x := 0; x < width; x++ {
-				ycol := cdat[2*x+0]
-				nrgba.SetNRGBA(x, y, color.NRGBA{ycol, ycol, ycol, cdat[2*x+1]})
-			}
-		case cbTC8:
-			pix, i, j := rgba.Pix, pixOffset, 0
-			for x := 0; x < width; x++ {
-				pix[i+0] = cdat[j+0]
-				pix[i+1] = cdat[j+1]
-				pix[i+2] = cdat[j+2]
-				pix[i+3] = 0xff
-				i += 4
-				j += 3
-			}
-			pixOffset += rgba.Stride
-		case cbP1:
-			for x := 0; x < width; x += 8 {
-				b := cdat[x/8]
-				for x2 := 0; x2 < 8 && x+x2 < width; x2++ {
-					idx := b >> 7
-					if len(paletted.Palette) <= int(idx) {
-						paletted.Palette = paletted.Palette[:int(idx)+1]
-					}
-					paletted.SetColorIndex(x+x2, y, idx)
-					b <<= 1
-				}
-			}
-		case cbP2:
-			for x := 0; x < width; x += 4 {
-				b := cdat[x/4]
-				for x2 := 0; x2 < 4 && x+x2 < width; x2++ {
-					idx := b >> 6
-					if len(paletted.Palette) <= int(idx) {
-						paletted.Palette = paletted.Palette[:int(idx)+1]
-					}
-					paletted.SetColorIndex(x+x2, y, idx)
-					b <<= 2
-				}
-			}
-		case cbP4:
-			for x := 0; x < width; x += 2 {
-				b := cdat[x/2]
-				for x2 := 0; x2 < 2 && x+x2 < width; x2++ {
-					idx := b >> 4
-					if len(paletted.Palette) <= int(idx) {
-						paletted.Palette = paletted.Palette[:int(idx)+1]
-					}
-					paletted.SetColorIndex(x+x2, y, idx)
-					b <<= 4
-				}
-			}
-		case cbP8:
-			if len(paletted.Palette) != 255 {
-				for x := 0; x < width; x++ {
-					if len(paletted.Palette) <= int(cdat[x]) {
-						paletted.Palette = paletted.Palette[:int(cdat[x])+1]
-					}
-				}
-			}
-			copy(paletted.Pix[pixOffset:], cdat)
-			pixOffset += paletted.Stride
-		case cbTCA8:
-			copy(nrgba.Pix[pixOffset:], cdat)
-			pixOffset += nrgba.Stride
-		case cbG16:
-			for x := 0; x < width; x++ {
-				ycol := uint16(cdat[2*x+0])<<8 | uint16(cdat[2*x+1])
-				gray16.SetGray16(x, y, color.Gray16{ycol})
-			}
-		case cbGA16:
-			for x := 0; x < width; x++ {
-				ycol := uint16(cdat[4*x+0])<<8 | uint16(cdat[4*x+1])
-				acol := uint16(cdat[4*x+2])<<8 | uint16(cdat[4*x+3])
-				nrgba64.SetNRGBA64(x, y, color.NRGBA64{ycol, ycol, ycol, acol})
-			}
-		case cbTC16:
-			for x := 0; x < width; x++ {
-				rcol := uint16(cdat[6*x+0])<<8 | uint16(cdat[6*x+1])
-				gcol := uint16(cdat[6*x+2])<<8 | uint16(cdat[6*x+3])
-				bcol := uint16(cdat[6*x+4])<<8 | uint16(cdat[6*x+5])
-				rgba64.SetRGBA64(x, y, color.RGBA64{rcol, gcol, bcol, 0xffff})
-			}
-		case cbTCA16:
-			for x := 0; x < width; x++ {
-				rcol := uint16(cdat[8*x+0])<<8 | uint16(cdat[8*x+1])
-				gcol := uint16(cdat[8*x+2])<<8 | uint16(cdat[8*x+3])
-				bcol := uint16(cdat[8*x+4])<<8 | uint16(cdat[8*x+5])
-				acol := uint16(cdat[8*x+6])<<8 | uint16(cdat[8*x+7])
-				nrgba64.SetNRGBA64(x, y, color.NRGBA64{rcol, gcol, bcol, acol})
-			}
-		}
-
-		// The current row for y is the previous row for y+1.
-		pr, cr = cr, pr
-	}
-
-	return img, nil
-}
-
-// mergePassInto merges a single pass into a full sized image.
-func (d *decoder) mergePassInto(dst image.Image, src image.Image, pass int) {
-	p := interlacing[pass]
-	var (
-		srcPix        []uint8
-		dstPix        []uint8
-		stride        int
-		rect          image.Rectangle
-		bytesPerPixel int
-	)
-	switch target := dst.(type) {
-	case *image.Alpha:
-		srcPix = src.(*image.Alpha).Pix
-		dstPix, stride, rect = target.Pix, target.Stride, target.Rect
-		bytesPerPixel = 1
-	case *image.Alpha16:
-		srcPix = src.(*image.Alpha16).Pix
-		dstPix, stride, rect = target.Pix, target.Stride, target.Rect
-		bytesPerPixel = 2
-	case *image.Gray:
-		srcPix = src.(*image.Gray).Pix
-		dstPix, stride, rect = target.Pix, target.Stride, target.Rect
-		bytesPerPixel = 1
-	case *image.Gray16:
-		srcPix = src.(*image.Gray16).Pix
-		dstPix, stride, rect = target.Pix, target.Stride, target.Rect
-		bytesPerPixel = 2
-	case *image.NRGBA:
-		srcPix = src.(*image.NRGBA).Pix
-		dstPix, stride, rect = target.Pix, target.Stride, target.Rect
-		bytesPerPixel = 4
-	case *image.NRGBA64:
-		srcPix = src.(*image.NRGBA64).Pix
-		dstPix, stride, rect = target.Pix, target.Stride, target.Rect
-		bytesPerPixel = 8
-	case *image.Paletted:
-		srcPix = src.(*image.Paletted).Pix
-		dstPix, stride, rect = target.Pix, target.Stride, target.Rect
-		bytesPerPixel = 1
-	case *image.RGBA:
-		srcPix = src.(*image.RGBA).Pix
-		dstPix, stride, rect = target.Pix, target.Stride, target.Rect
-		bytesPerPixel = 4
-	case *image.RGBA64:
-		srcPix = src.(*image.RGBA64).Pix
-		dstPix, stride, rect = target.Pix, target.Stride, target.Rect
-		bytesPerPixel = 8
-	}
-	s, bounds := 0, src.Bounds()
-	for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
-		dBase := (y*p.yFactor+p.yOffset-rect.Min.Y)*stride + (p.xOffset-rect.Min.X)*bytesPerPixel
-		for x := bounds.Min.X; x < bounds.Max.X; x++ {
-			d := dBase + x*p.xFactor*bytesPerPixel
-			copy(dstPix[d:], srcPix[s:s+bytesPerPixel])
-			s += bytesPerPixel
-		}
-	}
-}
-
-func (d *decoder) parseIDAT(length uint32) (err error) {
-	d.idatLength = length
-	d.img, err = d.decode()
-	if err != nil {
-		return err
-	}
-	return d.verifyChecksum()
-}
-
-func (d *decoder) parseIEND(length uint32) error {
-	if length != 0 {
-		return FormatError("bad IEND length")
-	}
-	return d.verifyChecksum()
-}
-
-func (d *decoder) parseChunk() error {
-	// Read the length and chunk type.
-	n, err := io.ReadFull(d.r, d.tmp[:8])
-	if err != nil {
-		return err
-	}
-	length := binary.BigEndian.Uint32(d.tmp[:4])
-	d.crc.Reset()
-	d.crc.Write(d.tmp[4:8])
-
-	// Read the chunk data.
-	switch string(d.tmp[4:8]) {
-	case "IHDR":
-		if d.stage != dsStart {
-			return chunkOrderError
-		}
-		d.stage = dsSeenIHDR
-		return d.parseIHDR(length)
-	case "PLTE":
-		if d.stage != dsSeenIHDR {
-			return chunkOrderError
-		}
-		d.stage = dsSeenPLTE
-		return d.parsePLTE(length)
-	case "tRNS":
-		if d.stage != dsSeenPLTE {
-			return chunkOrderError
-		}
-		d.stage = dsSeentRNS
-		return d.parsetRNS(length)
-	case "IDAT":
-		if d.stage < dsSeenIHDR || d.stage > dsSeenIDAT || (d.stage == dsSeenIHDR && cbPaletted(d.cb)) {
-			return chunkOrderError
-		}
-		d.stage = dsSeenIDAT
-		return d.parseIDAT(length)
-	case "IEND":
-		if d.stage != dsSeenIDAT {
-			return chunkOrderError
-		}
-		d.stage = dsSeenIEND
-		return d.parseIEND(length)
-	}
-	// Ignore this chunk (of a known length).
-	var ignored [4096]byte
-	for length > 0 {
-		n, err = io.ReadFull(d.r, ignored[:min(len(ignored), int(length))])
-		if err != nil {
-			return err
-		}
-		d.crc.Write(ignored[:n])
-		length -= uint32(n)
-	}
-	return d.verifyChecksum()
-}
-
-func (d *decoder) verifyChecksum() error {
-	if _, err := io.ReadFull(d.r, d.tmp[:4]); err != nil {
-		return err
-	}
-	if binary.BigEndian.Uint32(d.tmp[:4]) != d.crc.Sum32() {
-		return FormatError("invalid checksum")
-	}
-	return nil
-}
-
-func (d *decoder) checkHeader() error {
-	_, err := io.ReadFull(d.r, d.tmp[:len(pngHeader)])
-	if err != nil {
-		return err
-	}
-	if string(d.tmp[:len(pngHeader)]) != pngHeader {
-		return FormatError("not a PNG file")
-	}
-	return nil
-}
-
-// Decode reads a PNG image from r and returns it as an image.Image.
-// The type of Image returned depends on the PNG contents.
-func Decode(r io.Reader) (image.Image, error) {
-	d := &decoder{
-		r:   r,
-		crc: crc32.NewIEEE(),
-	}
-	if err := d.checkHeader(); err != nil {
-		if err == io.EOF {
-			err = io.ErrUnexpectedEOF
-		}
-		return nil, err
-	}
-	for d.stage != dsSeenIEND {
-		if err := d.parseChunk(); err != nil {
-			if err == io.EOF {
-				err = io.ErrUnexpectedEOF
-			}
-			return nil, err
-		}
-	}
-	return d.img, nil
-}
-
-// DecodeConfig returns the color model and dimensions of a PNG image without
-// decoding the entire image.
-func DecodeConfig(r io.Reader) (image.Config, error) {
-	d := &decoder{
-		r:   r,
-		crc: crc32.NewIEEE(),
-	}
-	if err := d.checkHeader(); err != nil {
-		if err == io.EOF {
-			err = io.ErrUnexpectedEOF
-		}
-		return image.Config{}, err
-	}
-	for {
-		if err := d.parseChunk(); err != nil {
-			if err == io.EOF {
-				err = io.ErrUnexpectedEOF
-			}
-			return image.Config{}, err
-		}
-		paletted := cbPaletted(d.cb)
-		if d.stage == dsSeenIHDR && !paletted {
-			break
-		}
-		if d.stage == dsSeenPLTE && paletted {
-			break
-		}
-	}
-	var cm color.Model
-	switch d.cb {
-	case cbG1, cbG2, cbG4, cbG8:
-		cm = color.GrayModel
-	case cbGA8:
-		cm = color.NRGBAModel
-	case cbTC8:
-		cm = color.RGBAModel
-	case cbP1, cbP2, cbP4, cbP8:
-		cm = d.palette
-	case cbTCA8:
-		cm = color.NRGBAModel
-	case cbG16:
-		cm = color.Gray16Model
-	case cbGA16:
-		cm = color.NRGBA64Model
-	case cbTC16:
-		cm = color.RGBA64Model
-	case cbTCA16:
-		cm = color.NRGBA64Model
-	}
-	return image.Config{
-		ColorModel: cm,
-		Width:      d.width,
-		Height:     d.height,
-	}, nil
-}
-
-func init() {
-	image.RegisterFormat("png", pngHeader, Decode, DecodeConfig)
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/reader_test.go b/third_party/gofrontend/libgo/go/image/png/reader_test.go
deleted file mode 100644
index f89e7ef..0000000
--- a/third_party/gofrontend/libgo/go/image/png/reader_test.go
+++ /dev/null
@@ -1,451 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package png
-
-import (
-	"bufio"
-	"bytes"
-	"fmt"
-	"image"
-	"image/color"
-	"io"
-	"io/ioutil"
-	"os"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-var filenames = []string{
-	"basn0g01",
-	"basn0g01-30",
-	"basn0g02",
-	"basn0g02-29",
-	"basn0g04",
-	"basn0g04-31",
-	"basn0g08",
-	"basn0g16",
-	"basn2c08",
-	"basn2c16",
-	"basn3p01",
-	"basn3p02",
-	"basn3p04",
-	"basn3p04-31i",
-	"basn3p08",
-	"basn3p08-trns",
-	"basn4a08",
-	"basn4a16",
-	"basn6a08",
-	"basn6a16",
-}
-
-var filenamesPaletted = []string{
-	"basn3p01",
-	"basn3p02",
-	"basn3p04",
-	"basn3p08",
-	"basn3p08-trns",
-}
-
-var filenamesShort = []string{
-	"basn0g01",
-	"basn0g04-31",
-	"basn6a16",
-}
-
-func readPNG(filename string) (image.Image, error) {
-	f, err := os.Open(filename)
-	if err != nil {
-		return nil, err
-	}
-	defer f.Close()
-	return Decode(f)
-}
-
-// An approximation of the sng command-line tool.
-func sng(w io.WriteCloser, filename string, png image.Image) {
-	defer w.Close()
-	bounds := png.Bounds()
-	cm := png.ColorModel()
-	var bitdepth int
-	switch cm {
-	case color.RGBAModel, color.NRGBAModel, color.AlphaModel, color.GrayModel:
-		bitdepth = 8
-	default:
-		bitdepth = 16
-	}
-	cpm, _ := cm.(color.Palette)
-	var paletted *image.Paletted
-	if cpm != nil {
-		switch {
-		case len(cpm) <= 2:
-			bitdepth = 1
-		case len(cpm) <= 4:
-			bitdepth = 2
-		case len(cpm) <= 16:
-			bitdepth = 4
-		default:
-			bitdepth = 8
-		}
-		paletted = png.(*image.Paletted)
-	}
-
-	// Write the filename and IHDR.
-	io.WriteString(w, "#SNG: from "+filename+".png\nIHDR {\n")
-	fmt.Fprintf(w, "    width: %d; height: %d; bitdepth: %d;\n", bounds.Dx(), bounds.Dy(), bitdepth)
-	switch {
-	case cm == color.RGBAModel, cm == color.RGBA64Model:
-		io.WriteString(w, "    using color;\n")
-	case cm == color.NRGBAModel, cm == color.NRGBA64Model:
-		io.WriteString(w, "    using color alpha;\n")
-	case cm == color.GrayModel, cm == color.Gray16Model:
-		io.WriteString(w, "    using grayscale;\n")
-	case cpm != nil:
-		io.WriteString(w, "    using color palette;\n")
-	default:
-		io.WriteString(w, "unknown PNG decoder color model\n")
-	}
-	io.WriteString(w, "}\n")
-
-	// We fake a gAMA output. The test files have a gAMA chunk but the go PNG parser ignores it
-	// (the PNG spec section 11.3 says "Ancillary chunks may be ignored by a decoder").
-	io.WriteString(w, "gAMA {1.0000}\n")
-
-	// Write the PLTE and tRNS (if applicable).
-	if cpm != nil {
-		lastAlpha := -1
-		io.WriteString(w, "PLTE {\n")
-		for i, c := range cpm {
-			var r, g, b, a uint8
-			switch c := c.(type) {
-			case color.RGBA:
-				r, g, b, a = c.R, c.G, c.B, 0xff
-			case color.NRGBA:
-				r, g, b, a = c.R, c.G, c.B, c.A
-			default:
-				panic("unknown palette color type")
-			}
-			if a != 0xff {
-				lastAlpha = i
-			}
-			fmt.Fprintf(w, "    (%3d,%3d,%3d)     # rgb = (0x%02x,0x%02x,0x%02x)\n", r, g, b, r, g, b)
-		}
-		io.WriteString(w, "}\n")
-		if lastAlpha != -1 {
-			io.WriteString(w, "tRNS {\n")
-			for i := 0; i <= lastAlpha; i++ {
-				_, _, _, a := cpm[i].RGBA()
-				a >>= 8
-				fmt.Fprintf(w, " %d", a)
-			}
-			io.WriteString(w, "}\n")
-		}
-	}
-
-	// Write the IMAGE.
-	io.WriteString(w, "IMAGE {\n    pixels hex\n")
-	for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
-		switch {
-		case cm == color.GrayModel:
-			for x := bounds.Min.X; x < bounds.Max.X; x++ {
-				gray := png.At(x, y).(color.Gray)
-				fmt.Fprintf(w, "%02x", gray.Y)
-			}
-		case cm == color.Gray16Model:
-			for x := bounds.Min.X; x < bounds.Max.X; x++ {
-				gray16 := png.At(x, y).(color.Gray16)
-				fmt.Fprintf(w, "%04x ", gray16.Y)
-			}
-		case cm == color.RGBAModel:
-			for x := bounds.Min.X; x < bounds.Max.X; x++ {
-				rgba := png.At(x, y).(color.RGBA)
-				fmt.Fprintf(w, "%02x%02x%02x ", rgba.R, rgba.G, rgba.B)
-			}
-		case cm == color.RGBA64Model:
-			for x := bounds.Min.X; x < bounds.Max.X; x++ {
-				rgba64 := png.At(x, y).(color.RGBA64)
-				fmt.Fprintf(w, "%04x%04x%04x ", rgba64.R, rgba64.G, rgba64.B)
-			}
-		case cm == color.NRGBAModel:
-			for x := bounds.Min.X; x < bounds.Max.X; x++ {
-				nrgba := png.At(x, y).(color.NRGBA)
-				fmt.Fprintf(w, "%02x%02x%02x%02x ", nrgba.R, nrgba.G, nrgba.B, nrgba.A)
-			}
-		case cm == color.NRGBA64Model:
-			for x := bounds.Min.X; x < bounds.Max.X; x++ {
-				nrgba64 := png.At(x, y).(color.NRGBA64)
-				fmt.Fprintf(w, "%04x%04x%04x%04x ", nrgba64.R, nrgba64.G, nrgba64.B, nrgba64.A)
-			}
-		case cpm != nil:
-			var b, c int
-			for x := bounds.Min.X; x < bounds.Max.X; x++ {
-				b = b<<uint(bitdepth) | int(paletted.ColorIndexAt(x, y))
-				c++
-				if c == 8/bitdepth {
-					fmt.Fprintf(w, "%02x", b)
-					b = 0
-					c = 0
-				}
-			}
-			if c != 0 {
-				for c != 8/bitdepth {
-					b = b << uint(bitdepth)
-					c++
-				}
-				fmt.Fprintf(w, "%02x", b)
-			}
-		}
-		io.WriteString(w, "\n")
-	}
-	io.WriteString(w, "}\n")
-}
-
-func TestReader(t *testing.T) {
-	names := filenames
-	if testing.Short() {
-		names = filenamesShort
-	}
-	for _, fn := range names {
-		// Read the .png file.
-		img, err := readPNG("testdata/pngsuite/" + fn + ".png")
-		if err != nil {
-			t.Error(fn, err)
-			continue
-		}
-
-		if fn == "basn4a16" {
-			// basn4a16.sng is gray + alpha but sng() will produce true color + alpha
-			// so we just check a single random pixel.
-			c := img.At(2, 1).(color.NRGBA64)
-			if c.R != 0x11a7 || c.G != 0x11a7 || c.B != 0x11a7 || c.A != 0x1085 {
-				t.Error(fn, fmt.Errorf("wrong pixel value at (2, 1): %x", c))
-			}
-			continue
-		}
-
-		piper, pipew := io.Pipe()
-		pb := bufio.NewScanner(piper)
-		go sng(pipew, fn, img)
-		defer piper.Close()
-
-		// Read the .sng file.
-		sf, err := os.Open("testdata/pngsuite/" + fn + ".sng")
-		if err != nil {
-			t.Error(fn, err)
-			continue
-		}
-		defer sf.Close()
-		sb := bufio.NewScanner(sf)
-		if err != nil {
-			t.Error(fn, err)
-			continue
-		}
-
-		// Compare the two, in SNG format, line by line.
-		for {
-			pdone := !pb.Scan()
-			sdone := !sb.Scan()
-			if pdone && sdone {
-				break
-			}
-			if pdone || sdone {
-				t.Errorf("%s: Different sizes", fn)
-				break
-			}
-			ps := pb.Text()
-			ss := sb.Text()
-			if ps != ss {
-				t.Errorf("%s: Mismatch\n%sversus\n%s\n", fn, ps, ss)
-				break
-			}
-		}
-		if pb.Err() != nil {
-			t.Error(fn, pb.Err())
-		}
-		if sb.Err() != nil {
-			t.Error(fn, sb.Err())
-		}
-	}
-}
-
-var readerErrors = []struct {
-	file string
-	err  string
-}{
-	{"invalid-zlib.png", "zlib: invalid checksum"},
-	{"invalid-crc32.png", "invalid checksum"},
-	{"invalid-noend.png", "unexpected EOF"},
-	{"invalid-trunc.png", "unexpected EOF"},
-}
-
-func TestReaderError(t *testing.T) {
-	for _, tt := range readerErrors {
-		img, err := readPNG("testdata/" + tt.file)
-		if err == nil {
-			t.Errorf("decoding %s: missing error", tt.file)
-			continue
-		}
-		if !strings.Contains(err.Error(), tt.err) {
-			t.Errorf("decoding %s: %s, want %s", tt.file, err, tt.err)
-		}
-		if img != nil {
-			t.Errorf("decoding %s: have image + error", tt.file)
-		}
-	}
-}
-
-func TestPalettedDecodeConfig(t *testing.T) {
-	for _, fn := range filenamesPaletted {
-		f, err := os.Open("testdata/pngsuite/" + fn + ".png")
-		if err != nil {
-			t.Errorf("%s: open failed: %v", fn, err)
-			continue
-		}
-		defer f.Close()
-		cfg, err := DecodeConfig(f)
-		if err != nil {
-			t.Errorf("%s: %v", fn, err)
-			continue
-		}
-		pal, ok := cfg.ColorModel.(color.Palette)
-		if !ok {
-			t.Errorf("%s: expected paletted color model", fn)
-			continue
-		}
-		if pal == nil {
-			t.Errorf("%s: palette not initialized", fn)
-			continue
-		}
-	}
-}
-
-func TestInterlaced(t *testing.T) {
-	a, err := readPNG("testdata/gray-gradient.png")
-	if err != nil {
-		t.Fatal(err)
-	}
-	b, err := readPNG("testdata/gray-gradient.interlaced.png")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !reflect.DeepEqual(a, b) {
-		t.Fatalf("decodings differ:\nnon-interlaced:\n%#v\ninterlaced:\n%#v", a, b)
-	}
-}
-
-func TestIncompleteIDATOnRowBoundary(t *testing.T) {
-	// The following is an invalid 1x2 grayscale PNG image. The header is OK,
-	// but the zlib-compressed IDAT payload contains two bytes "\x02\x00",
-	// which is only one row of data (the leading "\x02" is a row filter).
-	const (
-		ihdr = "\x00\x00\x00\x0dIHDR\x00\x00\x00\x01\x00\x00\x00\x02\x08\x00\x00\x00\x00\xbc\xea\xe9\xfb"
-		idat = "\x00\x00\x00\x0eIDAT\x78\x9c\x62\x62\x00\x04\x00\x00\xff\xff\x00\x06\x00\x03\xfa\xd0\x59\xae"
-		iend = "\x00\x00\x00\x00IEND\xae\x42\x60\x82"
-	)
-	_, err := Decode(strings.NewReader(pngHeader + ihdr + idat + iend))
-	if err == nil {
-		t.Fatal("got nil error, want non-nil")
-	}
-}
-
-func TestMultipletRNSChunks(t *testing.T) {
-	/*
-		The following is a valid 1x1 paletted PNG image with a 1-element palette
-		containing color.NRGBA{0xff, 0x00, 0x00, 0x7f}:
-			0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
-			0000010: 0000 0001 0000 0001 0803 0000 0028 cb34  .............(.4
-			0000020: bb00 0000 0350 4c54 45ff 0000 19e2 0937  .....PLTE......7
-			0000030: 0000 0001 7452 4e53 7f80 5cb4 cb00 0000  ....tRNS..\.....
-			0000040: 0e49 4441 5478 9c62 6200 0400 00ff ff00  .IDATx.bb.......
-			0000050: 0600 03fa d059 ae00 0000 0049 454e 44ae  .....Y.....IEND.
-			0000060: 4260 82                                  B`.
-		Dropping the tRNS chunk makes that color's alpha 0xff instead of 0x7f.
-	*/
-	const (
-		ihdr = "\x00\x00\x00\x0dIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x03\x00\x00\x00\x28\xcb\x34\xbb"
-		plte = "\x00\x00\x00\x03PLTE\xff\x00\x00\x19\xe2\x09\x37"
-		trns = "\x00\x00\x00\x01tRNS\x7f\x80\x5c\xb4\xcb"
-		idat = "\x00\x00\x00\x0eIDAT\x78\x9c\x62\x62\x00\x04\x00\x00\xff\xff\x00\x06\x00\x03\xfa\xd0\x59\xae"
-		iend = "\x00\x00\x00\x00IEND\xae\x42\x60\x82"
-	)
-	for i := 0; i < 4; i++ {
-		var b []byte
-		b = append(b, pngHeader...)
-		b = append(b, ihdr...)
-		b = append(b, plte...)
-		for j := 0; j < i; j++ {
-			b = append(b, trns...)
-		}
-		b = append(b, idat...)
-		b = append(b, iend...)
-
-		var want color.Color
-		m, err := Decode(bytes.NewReader(b))
-		switch i {
-		case 0:
-			if err != nil {
-				t.Errorf("%d tRNS chunks: %v", i, err)
-				continue
-			}
-			want = color.RGBA{0xff, 0x00, 0x00, 0xff}
-		case 1:
-			if err != nil {
-				t.Errorf("%d tRNS chunks: %v", i, err)
-				continue
-			}
-			want = color.NRGBA{0xff, 0x00, 0x00, 0x7f}
-		default:
-			if err == nil {
-				t.Errorf("%d tRNS chunks: got nil error, want non-nil", i)
-			}
-			continue
-		}
-		if got := m.At(0, 0); got != want {
-			t.Errorf("%d tRNS chunks: got %T %v, want %T %v", i, got, got, want, want)
-		}
-	}
-}
-
-func benchmarkDecode(b *testing.B, filename string, bytesPerPixel int) {
-	b.StopTimer()
-	data, err := ioutil.ReadFile(filename)
-	if err != nil {
-		b.Fatal(err)
-	}
-	s := string(data)
-	cfg, err := DecodeConfig(strings.NewReader(s))
-	if err != nil {
-		b.Fatal(err)
-	}
-	b.SetBytes(int64(cfg.Width * cfg.Height * bytesPerPixel))
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		Decode(strings.NewReader(s))
-	}
-}
-
-func BenchmarkDecodeGray(b *testing.B) {
-	benchmarkDecode(b, "testdata/benchGray.png", 1)
-}
-
-func BenchmarkDecodeNRGBAGradient(b *testing.B) {
-	benchmarkDecode(b, "testdata/benchNRGBA-gradient.png", 4)
-}
-
-func BenchmarkDecodeNRGBAOpaque(b *testing.B) {
-	benchmarkDecode(b, "testdata/benchNRGBA-opaque.png", 4)
-}
-
-func BenchmarkDecodePaletted(b *testing.B) {
-	benchmarkDecode(b, "testdata/benchPaletted.png", 1)
-}
-
-func BenchmarkDecodeRGB(b *testing.B) {
-	benchmarkDecode(b, "testdata/benchRGB.png", 4)
-}
-
-func BenchmarkDecodeInterlacing(b *testing.B) {
-	benchmarkDecode(b, "testdata/benchRGB-interlace.png", 4)
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/benchGray.png b/third_party/gofrontend/libgo/go/image/png/testdata/benchGray.png
deleted file mode 100644
index 42bc6c3..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/benchGray.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/benchNRGBA-gradient.png b/third_party/gofrontend/libgo/go/image/png/testdata/benchNRGBA-gradient.png
deleted file mode 100644
index 961934c..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/benchNRGBA-gradient.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/benchNRGBA-opaque.png b/third_party/gofrontend/libgo/go/image/png/testdata/benchNRGBA-opaque.png
deleted file mode 100644
index ca4f4a0..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/benchNRGBA-opaque.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/benchPaletted.png b/third_party/gofrontend/libgo/go/image/png/testdata/benchPaletted.png
deleted file mode 100644
index 4b4d5b9..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/benchPaletted.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/benchRGB-interlace.png b/third_party/gofrontend/libgo/go/image/png/testdata/benchRGB-interlace.png
deleted file mode 100644
index b4b5dab..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/benchRGB-interlace.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/benchRGB.png b/third_party/gofrontend/libgo/go/image/png/testdata/benchRGB.png
deleted file mode 100644
index 31ac65a..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/benchRGB.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/gray-gradient.interlaced.png b/third_party/gofrontend/libgo/go/image/png/testdata/gray-gradient.interlaced.png
deleted file mode 100644
index 01f657a..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/gray-gradient.interlaced.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/gray-gradient.png b/third_party/gofrontend/libgo/go/image/png/testdata/gray-gradient.png
deleted file mode 100644
index 6de1cd3..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/gray-gradient.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/invalid-crc32.png b/third_party/gofrontend/libgo/go/image/png/testdata/invalid-crc32.png
deleted file mode 100644
index e5be408..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/invalid-crc32.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/invalid-noend.png b/third_party/gofrontend/libgo/go/image/png/testdata/invalid-noend.png
deleted file mode 100644
index 9137270..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/invalid-noend.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/invalid-trunc.png b/third_party/gofrontend/libgo/go/image/png/testdata/invalid-trunc.png
deleted file mode 100644
index d0748cf..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/invalid-trunc.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/invalid-zlib.png b/third_party/gofrontend/libgo/go/image/png/testdata/invalid-zlib.png
deleted file mode 100644
index c6d051c..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/invalid-zlib.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/README b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/README
deleted file mode 100644
index c0f78bd..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/README
+++ /dev/null
@@ -1,21 +0,0 @@
-The *.png and README.original files in this directory are copied from
-libpng.org, specifically contrib/pngsuite/* in libpng-1.2.40.tar.gz.
-README.original gives the following license for those files:
-
-	Permission to use, copy, and distribute these images for any purpose
-	and without fee is hereby granted.
-
-
-The files basn0g01-30.png, basn0g02-29.png and basn0g04-31.png are in fact
-not part of pngsuite but were created from files in pngsuite. Their non-power-
-of-two sizes makes them useful for testing bit-depths smaller than a byte.
-
-basn3a08.png was generated from basn6a08.png using the pngnq tool, which
-converted it to the 8-bit paletted image with alpha values in tRNS chunk.
-
-The *.sng files in this directory were generated from the *.png files
-by the sng command-line tool and some hand editing. The files
-basn0g0{1,2,4}.sng were actually generated by first converting the PNG
-to a bitdepth of 8 and then running sng on them. basn4a08.sng was generated
-by from a 16-bit rgba version of basn4a08.png rather than the original
-gray + alpha.
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/README.original b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/README.original
deleted file mode 100644
index 714d12c..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/README.original
+++ /dev/null
@@ -1,85 +0,0 @@
-
-pngsuite
---------
-(c) Willem van Schaik, 1999
-
-Permission to use, copy, and distribute these images for any purpose and
-without fee is hereby granted.
-
-These 15 images are part of the much larger PngSuite test-set of 
-images, available for developers of PNG supporting software. The 
-complete set, available at http:/www.schaik.com/pngsuite/, contains 
-a variety of images to test interlacing, gamma settings, ancillary
-chunks, etc.
-
-The images in this directory represent the basic PNG color-types:
-grayscale (1-16 bit deep), full color (8 or 16 bit), paletted
-(1-8 bit) and grayscale or color images with alpha channel. You
-can use them to test the proper functioning of PNG software.
-
-    filename      depth type
-    ------------ ------ --------------
-    basn0g01.png  1-bit grayscale
-    basn0g02.png  2-bit grayscale
-    basn0g04.png  4-bit grayscale
-    basn0g08.png  8-bit grayscale
-    basn0g16.png 16-bit grayscale
-    basn2c08.png  8-bit truecolor
-    basn2c16.png 16-bit truecolor
-    basn3p01.png  1-bit paletted
-    basn3p02.png  2-bit paletted
-    basn3p04.png  4-bit paletted
-    basn3p08.png  8-bit paletted
-    basn4a08.png  8-bit gray with alpha
-    basn4a16.png 16-bit gray with alpha
-    basn6a08.png  8-bit RGBA
-    basn6a16.png 16-bit RGBA
-
-Here is the correct result of typing "pngtest -m *.png" in
-this directory:
-
-Testing basn0g01.png: PASS (524 zero samples)
- Filter 0 was used 32 times
-Testing basn0g02.png: PASS (448 zero samples)
- Filter 0 was used 32 times
-Testing basn0g04.png: PASS (520 zero samples)
- Filter 0 was used 32 times
-Testing basn0g08.png: PASS (3 zero samples)
- Filter 1 was used 9 times
- Filter 4 was used 23 times
-Testing basn0g16.png: PASS (1 zero samples)
- Filter 1 was used 1 times
- Filter 2 was used 31 times
-Testing basn2c08.png: PASS (6 zero samples)
- Filter 1 was used 5 times
- Filter 4 was used 27 times
-Testing basn2c16.png: PASS (592 zero samples)
- Filter 1 was used 1 times
- Filter 4 was used 31 times
-Testing basn3p01.png: PASS (512 zero samples)
- Filter 0 was used 32 times
-Testing basn3p02.png: PASS (448 zero samples)
- Filter 0 was used 32 times
-Testing basn3p04.png: PASS (544 zero samples)
- Filter 0 was used 32 times
-Testing basn3p08.png: PASS (4 zero samples)
- Filter 0 was used 32 times
-Testing basn4a08.png: PASS (32 zero samples)
- Filter 1 was used 1 times
- Filter 4 was used 31 times
-Testing basn4a16.png: PASS (64 zero samples)
- Filter 0 was used 1 times
- Filter 1 was used 2 times
- Filter 2 was used 1 times
- Filter 4 was used 28 times
-Testing basn6a08.png: PASS (160 zero samples)
- Filter 1 was used 1 times
- Filter 4 was used 31 times
-Testing basn6a16.png: PASS (1072 zero samples)
- Filter 1 was used 4 times
- Filter 4 was used 28 times
-libpng passes test
-
-Willem van Schaik
-<willem@schaik.com>
-October 1999
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g01-30.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g01-30.png
deleted file mode 100644
index 007750c..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g01-30.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g01-30.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g01-30.sng
deleted file mode 100644
index 7fa3571..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g01-30.sng
+++ /dev/null
@@ -1,39 +0,0 @@
-#SNG: from basn0g01-30.png
-IHDR {
-    width: 30; height: 30; bitdepth: 8;
-    using grayscale;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
-ffffffff0000ffffffffffff0000ffffffffffffffffffffffffff000000
-ffffffff0000ffffffffffff0000ffffffffffffffffffffffff00000000
-ffffffff0000ffffffffffff0000ffffffffffffffffffffff0000000000
-ffffffff0000ffff0000ffff0000ffffffffffffffffffff000000000000
-ffffffff0000ffff0000ffff0000ffffffffffffffffff00000000000000
-ffffffff0000ffff0000ffff0000ffffffffffffffff0000000000000000
-ffffffffff0000000000000000ffffffffffffffff000000000000000000
-ffffffffff0000000000000000ffffffffffffff00000000000000000000
-ffffffffffff0000ffff0000ffffffffffffff0000000000000000000000
-ffffffffffff0000ffff0000ffffffffffff000000000000000000000000
-ffffffffffffffffffffffffffffffffff00000000000000000000000000
-ffffffffffffffffffffffffffffffff0000000000000000000000000000
-ffffffffffffffffffffffffffffff000000000000000000000000000000
-ffffffffffffffffffffffffffff00000000000000000000000000000000
-ffffffffffffffffffffffffff00000000000000ffffffffffffff000000
-ffffffffffffffffffffffff0000000000000000ffffffffffffff000000
-ffffffffffffffffffffff000000000000000000ffff00000000ffff0000
-ffffffffffffffffffff00000000000000000000ffff00000000ffff0000
-ffffffffffffffffff0000000000000000000000ffffffffffffff000000
-ffffffffffffffff000000000000000000000000ffffffffffffff000000
-ffffffffffffff00000000000000000000000000ffff00000000ffff0000
-ffffffffffff0000000000000000000000000000ffff00000000ffff0000
-ffffffffff000000000000000000000000000000ffffffffffffff000000
-ffffffff00000000000000000000000000000000ffffffffffffff000000
-ffffff000000000000000000000000000000000000000000000000000000
-ffff00000000000000000000000000000000000000000000000000000000
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g01.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g01.png
deleted file mode 100644
index e31e1c7..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g01.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g01.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g01.sng
deleted file mode 100644
index 2ce069d..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g01.sng
+++ /dev/null
@@ -1,41 +0,0 @@
-#SNG: from basn0g01.png
-IHDR {
-    width: 32; height: 32; bitdepth: 8;
-    using grayscale;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
-ffffffff0000ffffffffffff0000ffffffffffffffffffffffffff0000000000
-ffffffff0000ffffffffffff0000ffffffffffffffffffffffff000000000000
-ffffffff0000ffffffffffff0000ffffffffffffffffffffff00000000000000
-ffffffff0000ffff0000ffff0000ffffffffffffffffffff0000000000000000
-ffffffff0000ffff0000ffff0000ffffffffffffffffff000000000000000000
-ffffffff0000ffff0000ffff0000ffffffffffffffff00000000000000000000
-ffffffffff0000000000000000ffffffffffffffff0000000000000000000000
-ffffffffff0000000000000000ffffffffffffff000000000000000000000000
-ffffffffffff0000ffff0000ffffffffffffff00000000000000000000000000
-ffffffffffff0000ffff0000ffffffffffff0000000000000000000000000000
-ffffffffffffffffffffffffffffffffff000000000000000000000000000000
-ffffffffffffffffffffffffffffffff00000000000000000000000000000000
-ffffffffffffffffffffffffffffff0000000000000000000000000000000000
-ffffffffffffffffffffffffffff000000000000000000000000000000000000
-ffffffffffffffffffffffffff00000000000000ffffffffffffff0000000000
-ffffffffffffffffffffffff0000000000000000ffffffffffffff0000000000
-ffffffffffffffffffffff000000000000000000ffff00000000ffff00000000
-ffffffffffffffffffff00000000000000000000ffff00000000ffff00000000
-ffffffffffffffffff0000000000000000000000ffffffffffffff0000000000
-ffffffffffffffff000000000000000000000000ffffffffffffff0000000000
-ffffffffffffff00000000000000000000000000ffff00000000ffff00000000
-ffffffffffff0000000000000000000000000000ffff00000000ffff00000000
-ffffffffff000000000000000000000000000000ffffffffffffff0000000000
-ffffffff00000000000000000000000000000000ffffffffffffff0000000000
-ffffff0000000000000000000000000000000000000000000000000000000000
-ffff000000000000000000000000000000000000000000000000000000000000
-ff00000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g02-29.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g02-29.png
deleted file mode 100644
index d17d8f8..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g02-29.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g02-29.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g02-29.sng
deleted file mode 100644
index afb5dba..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g02-29.sng
+++ /dev/null
@@ -1,38 +0,0 @@
-#SNG: from basn0g02-29.png
-IHDR {
-    width: 29; height: 29; bitdepth: 8;
-    using grayscale;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaff
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaff
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaff
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaff
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055
-ffffffff0000000055555555aaaaaaaaffffffff0000000055555555aa
-ffffffff0000000055555555aaaaaaaaffffffff0000000055555555aa
-ffffffff0000000055555555aaaaaaaaffffffff0000000055555555aa
-ffffffff0000000055555555aaaaaaaaffffffff0000000055555555aa
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaff
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaff
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaff
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaff
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055
-ffffffff0000000055555555aaaaaaaaffffffff0000000055555555aa
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g02.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g02.png
deleted file mode 100644
index 68809dd..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g02.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g02.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g02.sng
deleted file mode 100644
index bb53d75..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g02.sng
+++ /dev/null
@@ -1,41 +0,0 @@
-#SNG: from basn0g02.png
-IHDR {
-    width: 32; height: 32; bitdepth: 8;
-    using grayscale;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00000000
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00000000
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00000000
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00000000
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055555555
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055555555
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055555555
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055555555
-ffffffff0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaa
-ffffffff0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaa
-ffffffff0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaa
-ffffffff0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaa
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff
-0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00000000
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00000000
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00000000
-55555555aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff00000000
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055555555
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055555555
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055555555
-aaaaaaaaffffffff0000000055555555aaaaaaaaffffffff0000000055555555
-ffffffff0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaa
-ffffffff0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaa
-ffffffff0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaa
-ffffffff0000000055555555aaaaaaaaffffffff0000000055555555aaaaaaaa
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g04-31.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g04-31.png
deleted file mode 100644
index e30644d..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g04-31.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g04-31.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g04-31.sng
deleted file mode 100644
index 7f7948e..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g04-31.sng
+++ /dev/null
@@ -1,40 +0,0 @@
-#SNG: from basn0g04-31.png
-IHDR {
-    width: 31; height: 31; bitdepth: 8;
-    using grayscale;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-00000000111111112222222233333333444444445555555566666666777777
-00000000111111112222222233333333444444445555555566666666777777
-00000000111111112222222233333333444444445555555566666666777777
-00000000111111112222222233333333444444445555555566666666777777
-11111111222222223333333344444444555555556666666677777777888888
-11111111222222223333333344444444555555556666666677777777888888
-11111111222222223333333344444444555555556666666677777777888888
-11111111222222223333333344444444555555556666666677777777888888
-22222222333333334444444455555555666666667777777788888888999999
-22222222333333334444444455555555666666667777777788888888999999
-22222222333333334444444455555555666666667777777788888888999999
-22222222333333334444444455555555666666667777777788888888999999
-33333333444444445555555566666666777777778888888899999999aaaaaa
-33333333444444445555555566666666777777778888888899999999aaaaaa
-33333333444444445555555566666666777777778888888899999999aaaaaa
-33333333444444445555555566666666777777778888888899999999aaaaaa
-444444445555555566666666777777778888888899999999aaaaaaaabbbbbb
-444444445555555566666666777777778888888899999999aaaaaaaabbbbbb
-444444445555555566666666777777778888888899999999aaaaaaaabbbbbb
-444444445555555566666666777777778888888899999999aaaaaaaabbbbbb
-5555555566666666777777778888888899999999aaaaaaaabbbbbbbbcccccc
-5555555566666666777777778888888899999999aaaaaaaabbbbbbbbcccccc
-5555555566666666777777778888888899999999aaaaaaaabbbbbbbbcccccc
-5555555566666666777777778888888899999999aaaaaaaabbbbbbbbcccccc
-66666666777777778888888899999999aaaaaaaabbbbbbbbccccccccdddddd
-66666666777777778888888899999999aaaaaaaabbbbbbbbccccccccdddddd
-66666666777777778888888899999999aaaaaaaabbbbbbbbccccccccdddddd
-66666666777777778888888899999999aaaaaaaabbbbbbbbccccccccdddddd
-777777778888888899999999aaaaaaaabbbbbbbbccccccccddddddddeeeeee
-777777778888888899999999aaaaaaaabbbbbbbbccccccccddddddddeeeeee
-777777778888888899999999aaaaaaaabbbbbbbbccccccccddddddddeeeeee
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g04.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g04.png
deleted file mode 100644
index 6fa089c..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g04.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g04.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g04.sng
deleted file mode 100644
index a95ad01..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g04.sng
+++ /dev/null
@@ -1,41 +0,0 @@
-#SNG: from basn0g04.png
-IHDR {
-    width: 32; height: 32; bitdepth: 8;
-    using grayscale;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-0000000011111111222222223333333344444444555555556666666677777777
-0000000011111111222222223333333344444444555555556666666677777777
-0000000011111111222222223333333344444444555555556666666677777777
-0000000011111111222222223333333344444444555555556666666677777777
-1111111122222222333333334444444455555555666666667777777788888888
-1111111122222222333333334444444455555555666666667777777788888888
-1111111122222222333333334444444455555555666666667777777788888888
-1111111122222222333333334444444455555555666666667777777788888888
-2222222233333333444444445555555566666666777777778888888899999999
-2222222233333333444444445555555566666666777777778888888899999999
-2222222233333333444444445555555566666666777777778888888899999999
-2222222233333333444444445555555566666666777777778888888899999999
-33333333444444445555555566666666777777778888888899999999aaaaaaaa
-33333333444444445555555566666666777777778888888899999999aaaaaaaa
-33333333444444445555555566666666777777778888888899999999aaaaaaaa
-33333333444444445555555566666666777777778888888899999999aaaaaaaa
-444444445555555566666666777777778888888899999999aaaaaaaabbbbbbbb
-444444445555555566666666777777778888888899999999aaaaaaaabbbbbbbb
-444444445555555566666666777777778888888899999999aaaaaaaabbbbbbbb
-444444445555555566666666777777778888888899999999aaaaaaaabbbbbbbb
-5555555566666666777777778888888899999999aaaaaaaabbbbbbbbcccccccc
-5555555566666666777777778888888899999999aaaaaaaabbbbbbbbcccccccc
-5555555566666666777777778888888899999999aaaaaaaabbbbbbbbcccccccc
-5555555566666666777777778888888899999999aaaaaaaabbbbbbbbcccccccc
-66666666777777778888888899999999aaaaaaaabbbbbbbbccccccccdddddddd
-66666666777777778888888899999999aaaaaaaabbbbbbbbccccccccdddddddd
-66666666777777778888888899999999aaaaaaaabbbbbbbbccccccccdddddddd
-66666666777777778888888899999999aaaaaaaabbbbbbbbccccccccdddddddd
-777777778888888899999999aaaaaaaabbbbbbbbccccccccddddddddeeeeeeee
-777777778888888899999999aaaaaaaabbbbbbbbccccccccddddddddeeeeeeee
-777777778888888899999999aaaaaaaabbbbbbbbccccccccddddddddeeeeeeee
-777777778888888899999999aaaaaaaabbbbbbbbccccccccddddddddeeeeeeee
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g08.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g08.png
deleted file mode 100644
index bf522ee..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g08.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g08.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g08.sng
deleted file mode 100644
index 7389eb7..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g08.sng
+++ /dev/null
@@ -1,41 +0,0 @@
-#SNG: from basn0g08.png
-IHDR {
-    width: 32; height: 32; bitdepth: 8;
-    using grayscale;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
-202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f
-404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f
-606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f
-808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f
-a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf
-c0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf
-e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
-fefdfcfbfaf9f8f7f6f5f4f3f2f1f0efeeedecebeae9e8e7e6e5e4e3e2e1e0df
-dedddcdbdad9d8d7d6d5d4d3d2d1d0cfcecdcccbcac9c8c7c6c5c4c3c2c1c0bf
-bebdbcbbbab9b8b7b6b5b4b3b2b1b0afaeadacabaaa9a8a7a6a5a4a3a2a1a09f
-9e9d9c9b9a999897969594939291908f8e8d8c8b8a898887868584838281807f
-7e7d7c7b7a797877767574737271706f6e6d6c6b6a696867666564636261605f
-5e5d5c5b5a595857565554535251504f4e4d4c4b4a494847464544434241403f
-3e3d3c3b3a393837363534333231302f2e2d2c2b2a292827262524232221201f
-1e1d1c1b1a191817161514131211100f0e0d0c0b0a0908070605040302010001
-02030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021
-22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041
-42434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061
-62636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081
-82838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1
-a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1
-c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1
-e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfefffefd
-fcfbfaf9f8f7f6f5f4f3f2f1f0efeeedecebeae9e8e7e6e5e4e3e2e1e0dfdedd
-dcdbdad9d8d7d6d5d4d3d2d1d0cfcecdcccbcac9c8c7c6c5c4c3c2c1c0bfbebd
-bcbbbab9b8b7b6b5b4b3b2b1b0afaeadacabaaa9a8a7a6a5a4a3a2a1a09f9e9d
-9c9b9a999897969594939291908f8e8d8c8b8a898887868584838281807f7e7d
-7c7b7a797877767574737271706f6e6d6c6b6a696867666564636261605f5e5d
-5c5b5a595857565554535251504f4e4d4c4b4a494847464544434241403f3e3d
-3c3b3a393837363534333231302f2e2d2c2b2a292827262524232221201f1e1d
-1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100010203
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g16.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g16.png
deleted file mode 100644
index 318ebca..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g16.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g16.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g16.sng
deleted file mode 100644
index 922391a..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn0g16.sng
+++ /dev/null
@@ -1,41 +0,0 @@
-#SNG: from basn0g16.png
-IHDR {
-    width: 32; height: 32; bitdepth: 16;
-    using grayscale;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-0000 0900 1200 1b00 2400 2d00 3600 3f00 4800 5100 5a00 6300 6c00 7500 7e00 8700 9000 9900 a200 ab00 b400 bd00 c600 cf00 d800 e100 ea00 f300 fc00 f0ff d5ff baff 
-0200 0b00 1400 1d00 2600 2f00 3800 4100 4a00 5300 5c00 6500 6e00 7700 8000 8900 9200 9b00 a400 ad00 b600 bf00 c800 d100 da00 e300 ec00 f500 fe00 eaff cfff b4ff 
-0400 0d00 1600 1f00 2800 3100 3a00 4300 4c00 5500 5e00 6700 7000 7900 8200 8b00 9400 9d00 a600 af00 b800 c100 ca00 d300 dc00 e500 ee00 f700 ffff e4ff c9ff aeff 
-0600 0f00 1800 2100 2a00 3300 3c00 4500 4e00 5700 6000 6900 7200 7b00 8400 8d00 9600 9f00 a800 b100 ba00 c300 cc00 d500 de00 e700 f000 f900 f9ff deff c3ff a8ff 
-0800 1100 1a00 2300 2c00 3500 3e00 4700 5000 5900 6200 6b00 7400 7d00 8600 8f00 9800 a100 aa00 b300 bc00 c500 ce00 d700 e000 e900 f200 fb00 f3ff d8ff bdff a2ff 
-0a00 1300 1c00 2500 2e00 3700 4000 4900 5200 5b00 6400 6d00 7600 7f00 8800 9100 9a00 a300 ac00 b500 be00 c700 d000 d900 e200 eb00 f400 fd00 edff d2ff b7ff 9cff 
-0c00 1500 1e00 2700 3000 3900 4200 4b00 5400 5d00 6600 6f00 7800 8100 8a00 9300 9c00 a500 ae00 b700 c000 c900 d200 db00 e400 ed00 f600 ff00 e7ff ccff b1ff 96ff 
-0e00 1700 2000 2900 3200 3b00 4400 4d00 5600 5f00 6800 7100 7a00 8300 8c00 9500 9e00 a700 b000 b900 c200 cb00 d400 dd00 e600 ef00 f800 fcff e1ff c6ff abff 90ff 
-1000 1900 2200 2b00 3400 3d00 4600 4f00 5800 6100 6a00 7300 7c00 8500 8e00 9700 a000 a900 b200 bb00 c400 cd00 d600 df00 e800 f100 fa00 f6ff dbff c0ff a5ff 8aff 
-1200 1b00 2400 2d00 3600 3f00 4800 5100 5a00 6300 6c00 7500 7e00 8700 9000 9900 a200 ab00 b400 bd00 c600 cf00 d800 e100 ea00 f300 fc00 f0ff d5ff baff 9fff 84ff 
-1400 1d00 2600 2f00 3800 4100 4a00 5300 5c00 6500 6e00 7700 8000 8900 9200 9b00 a400 ad00 b600 bf00 c800 d100 da00 e300 ec00 f500 fe00 eaff cfff b4ff 99ff 7eff 
-1600 1f00 2800 3100 3a00 4300 4c00 5500 5e00 6700 7000 7900 8200 8b00 9400 9d00 a600 af00 b800 c100 ca00 d300 dc00 e500 ee00 f700 ffff e4ff c9ff aeff 93ff 78ff 
-1800 2100 2a00 3300 3c00 4500 4e00 5700 6000 6900 7200 7b00 8400 8d00 9600 9f00 a800 b100 ba00 c300 cc00 d500 de00 e700 f000 f900 f9ff deff c3ff a8ff 8dff 72ff 
-1a00 2300 2c00 3500 3e00 4700 5000 5900 6200 6b00 7400 7d00 8600 8f00 9800 a100 aa00 b300 bc00 c500 ce00 d700 e000 e900 f200 fb00 f3ff d8ff bdff a2ff 87ff 6cff 
-1c00 2500 2e00 3700 4000 4900 5200 5b00 6400 6d00 7600 7f00 8800 9100 9a00 a300 ac00 b500 be00 c700 d000 d900 e200 eb00 f400 fd00 edff d2ff b7ff 9cff 81ff 66ff 
-1e00 2700 3000 3900 4200 4b00 5400 5d00 6600 6f00 7800 8100 8a00 9300 9c00 a500 ae00 b700 c000 c900 d200 db00 e400 ed00 f600 ff00 e7ff ccff b1ff 96ff 7bff 60ff 
-2000 2900 3200 3b00 4400 4d00 5600 5f00 6800 7100 7a00 8300 8c00 9500 9e00 a700 b000 b900 c200 cb00 d400 dd00 e600 ef00 f800 fcff e1ff c6ff abff 90ff 75ff 5aff 
-2200 2b00 3400 3d00 4600 4f00 5800 6100 6a00 7300 7c00 8500 8e00 9700 a000 a900 b200 bb00 c400 cd00 d600 df00 e800 f100 fa00 f6ff dbff c0ff a5ff 8aff 6fff 54ff 
-2400 2d00 3600 3f00 4800 5100 5a00 6300 6c00 7500 7e00 8700 9000 9900 a200 ab00 b400 bd00 c600 cf00 d800 e100 ea00 f300 fc00 f0ff d5ff baff 9fff 84ff 69ff 4eff 
-2600 2f00 3800 4100 4a00 5300 5c00 6500 6e00 7700 8000 8900 9200 9b00 a400 ad00 b600 bf00 c800 d100 da00 e300 ec00 f500 fe00 eaff cfff b4ff 99ff 7eff 63ff 48ff 
-2800 3100 3a00 4300 4c00 5500 5e00 6700 7000 7900 8200 8b00 9400 9d00 a600 af00 b800 c100 ca00 d300 dc00 e500 ee00 f700 ffff e4ff c9ff aeff 93ff 78ff 5dff 42ff 
-2a00 3300 3c00 4500 4e00 5700 6000 6900 7200 7b00 8400 8d00 9600 9f00 a800 b100 ba00 c300 cc00 d500 de00 e700 f000 f900 f9ff deff c3ff a8ff 8dff 72ff 57ff 3cff 
-2c00 3500 3e00 4700 5000 5900 6200 6b00 7400 7d00 8600 8f00 9800 a100 aa00 b300 bc00 c500 ce00 d700 e000 e900 f200 fb00 f3ff d8ff bdff a2ff 87ff 6cff 51ff 36ff 
-2e00 3700 4000 4900 5200 5b00 6400 6d00 7600 7f00 8800 9100 9a00 a300 ac00 b500 be00 c700 d000 d900 e200 eb00 f400 fd00 edff d2ff b7ff 9cff 81ff 66ff 4bff 30ff 
-3000 3900 4200 4b00 5400 5d00 6600 6f00 7800 8100 8a00 9300 9c00 a500 ae00 b700 c000 c900 d200 db00 e400 ed00 f600 ff00 e7ff ccff b1ff 96ff 7bff 60ff 45ff 2aff 
-3200 3b00 4400 4d00 5600 5f00 6800 7100 7a00 8300 8c00 9500 9e00 a700 b000 b900 c200 cb00 d400 dd00 e600 ef00 f800 fcff e1ff c6ff abff 90ff 75ff 5aff 3fff 24ff 
-3400 3d00 4600 4f00 5800 6100 6a00 7300 7c00 8500 8e00 9700 a000 a900 b200 bb00 c400 cd00 d600 df00 e800 f100 fa00 f6ff dbff c0ff a5ff 8aff 6fff 54ff 39ff 1eff 
-3600 3f00 4800 5100 5a00 6300 6c00 7500 7e00 8700 9000 9900 a200 ab00 b400 bd00 c600 cf00 d800 e100 ea00 f300 fc00 f0ff d5ff baff 9fff 84ff 69ff 4eff 33ff 18ff 
-3800 4100 4a00 5300 5c00 6500 6e00 7700 8000 8900 9200 9b00 a400 ad00 b600 bf00 c800 d100 da00 e300 ec00 f500 fe00 eaff cfff b4ff 99ff 7eff 63ff 48ff 2dff 12ff 
-3a00 4300 4c00 5500 5e00 6700 7000 7900 8200 8b00 9400 9d00 a600 af00 b800 c100 ca00 d300 dc00 e500 ee00 f700 ffff e4ff c9ff aeff 93ff 78ff 5dff 42ff 27ff 0cff 
-3c00 4500 4e00 5700 6000 6900 7200 7b00 8400 8d00 9600 9f00 a800 b100 ba00 c300 cc00 d500 de00 e700 f000 f900 f9ff deff c3ff a8ff 8dff 72ff 57ff 3cff 21ff 06ff 
-3e00 4700 5000 5900 6200 6b00 7400 7d00 8600 8f00 9800 a100 aa00 b300 bc00 c500 ce00 d700 e000 e900 f200 fb00 f3ff d8ff bdff a2ff 87ff 6cff 51ff 36ff 1bff 00ff 
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn2c08.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn2c08.png
deleted file mode 100644
index 21d2f91..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn2c08.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn2c08.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn2c08.sng
deleted file mode 100644
index 09a6131..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn2c08.sng
+++ /dev/null
@@ -1,41 +0,0 @@
-#SNG: from basn2c08.png
-IHDR {
-    width: 32; height: 32; bitdepth: 8;
-    using color;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-ffffff fffffe fffffd fffffc fffffb fffffa fffff9 fffff8 fffff7 fffff6 fffff5 fffff4 fffff3 fffff2 fffff1 fffff0 ffffef ffffee ffffed ffffec ffffeb ffffea ffffe9 ffffe8 ffffe7 ffffe6 ffffe5 ffffe4 ffffe3 ffffe2 ffffe1 ffffe0 
-ffffdf ffffde ffffdd ffffdc ffffdb ffffda ffffd9 ffffd8 ffffd7 ffffd6 ffffd5 ffffd4 ffffd3 ffffd2 ffffd1 ffffd0 ffffcf ffffce ffffcd ffffcc ffffcb ffffca ffffc9 ffffc8 ffffc7 ffffc6 ffffc5 ffffc4 ffffc3 ffffc2 ffffc1 ffffc0 
-ffffbf ffffbe ffffbd ffffbc ffffbb ffffba ffffb9 ffffb8 ffffb7 ffffb6 ffffb5 ffffb4 ffffb3 ffffb2 ffffb1 ffffb0 ffffaf ffffae ffffad ffffac ffffab ffffaa ffffa9 ffffa8 ffffa7 ffffa6 ffffa5 ffffa4 ffffa3 ffffa2 ffffa1 ffffa0 
-ffff9f ffff9e ffff9d ffff9c ffff9b ffff9a ffff99 ffff98 ffff97 ffff96 ffff95 ffff94 ffff93 ffff92 ffff91 ffff90 ffff8f ffff8e ffff8d ffff8c ffff8b ffff8a ffff89 ffff88 ffff87 ffff86 ffff85 ffff84 ffff83 ffff82 ffff81 ffff80 
-ffff7f ffff7e ffff7d ffff7c ffff7b ffff7a ffff79 ffff78 ffff77 ffff76 ffff75 ffff74 ffff73 ffff72 ffff71 ffff70 ffff6f ffff6e ffff6d ffff6c ffff6b ffff6a ffff69 ffff68 ffff67 ffff66 ffff65 ffff64 ffff63 ffff62 ffff61 ffff60 
-ffff5f ffff5e ffff5d ffff5c ffff5b ffff5a ffff59 ffff58 ffff57 ffff56 ffff55 ffff54 ffff53 ffff52 ffff51 ffff50 ffff4f ffff4e ffff4d ffff4c ffff4b ffff4a ffff49 ffff48 ffff47 ffff46 ffff45 ffff44 ffff43 ffff42 ffff41 ffff40 
-ffff3f ffff3e ffff3d ffff3c ffff3b ffff3a ffff39 ffff38 ffff37 ffff36 ffff35 ffff34 ffff33 ffff32 ffff31 ffff30 ffff2f ffff2e ffff2d ffff2c ffff2b ffff2a ffff29 ffff28 ffff27 ffff26 ffff25 ffff24 ffff23 ffff22 ffff21 ffff20 
-ffff1f ffff1e ffff1d ffff1c ffff1b ffff1a ffff19 ffff18 ffff17 ffff16 ffff15 ffff14 ffff13 ffff12 ffff11 ffff10 ffff0f ffff0e ffff0d ffff0c ffff0b ffff0a ffff09 ffff08 ffff07 ffff06 ffff05 ffff04 ffff03 ffff02 ffff01 ffff00 
-ffffff fffeff fffdff fffcff fffbff fffaff fff9ff fff8ff fff7ff fff6ff fff5ff fff4ff fff3ff fff2ff fff1ff fff0ff ffefff ffeeff ffedff ffecff ffebff ffeaff ffe9ff ffe8ff ffe7ff ffe6ff ffe5ff ffe4ff ffe3ff ffe2ff ffe1ff ffe0ff 
-ffdfff ffdeff ffddff ffdcff ffdbff ffdaff ffd9ff ffd8ff ffd7ff ffd6ff ffd5ff ffd4ff ffd3ff ffd2ff ffd1ff ffd0ff ffcfff ffceff ffcdff ffccff ffcbff ffcaff ffc9ff ffc8ff ffc7ff ffc6ff ffc5ff ffc4ff ffc3ff ffc2ff ffc1ff ffc0ff 
-ffbfff ffbeff ffbdff ffbcff ffbbff ffbaff ffb9ff ffb8ff ffb7ff ffb6ff ffb5ff ffb4ff ffb3ff ffb2ff ffb1ff ffb0ff ffafff ffaeff ffadff ffacff ffabff ffaaff ffa9ff ffa8ff ffa7ff ffa6ff ffa5ff ffa4ff ffa3ff ffa2ff ffa1ff ffa0ff 
-ff9fff ff9eff ff9dff ff9cff ff9bff ff9aff ff99ff ff98ff ff97ff ff96ff ff95ff ff94ff ff93ff ff92ff ff91ff ff90ff ff8fff ff8eff ff8dff ff8cff ff8bff ff8aff ff89ff ff88ff ff87ff ff86ff ff85ff ff84ff ff83ff ff82ff ff81ff ff80ff 
-ff7fff ff7eff ff7dff ff7cff ff7bff ff7aff ff79ff ff78ff ff77ff ff76ff ff75ff ff74ff ff73ff ff72ff ff71ff ff70ff ff6fff ff6eff ff6dff ff6cff ff6bff ff6aff ff69ff ff68ff ff67ff ff66ff ff65ff ff64ff ff63ff ff62ff ff61ff ff60ff 
-ff5fff ff5eff ff5dff ff5cff ff5bff ff5aff ff59ff ff58ff ff57ff ff56ff ff55ff ff54ff ff53ff ff52ff ff51ff ff50ff ff4fff ff4eff ff4dff ff4cff ff4bff ff4aff ff49ff ff48ff ff47ff ff46ff ff45ff ff44ff ff43ff ff42ff ff41ff ff40ff 
-ff3fff ff3eff ff3dff ff3cff ff3bff ff3aff ff39ff ff38ff ff37ff ff36ff ff35ff ff34ff ff33ff ff32ff ff31ff ff30ff ff2fff ff2eff ff2dff ff2cff ff2bff ff2aff ff29ff ff28ff ff27ff ff26ff ff25ff ff24ff ff23ff ff22ff ff21ff ff20ff 
-ff1fff ff1eff ff1dff ff1cff ff1bff ff1aff ff19ff ff18ff ff17ff ff16ff ff15ff ff14ff ff13ff ff12ff ff11ff ff10ff ff0fff ff0eff ff0dff ff0cff ff0bff ff0aff ff09ff ff08ff ff07ff ff06ff ff05ff ff04ff ff03ff ff02ff ff01ff ff00ff 
-ffffff feffff fdffff fcffff fbffff faffff f9ffff f8ffff f7ffff f6ffff f5ffff f4ffff f3ffff f2ffff f1ffff f0ffff efffff eeffff edffff ecffff ebffff eaffff e9ffff e8ffff e7ffff e6ffff e5ffff e4ffff e3ffff e2ffff e1ffff e0ffff 
-dfffff deffff ddffff dcffff dbffff daffff d9ffff d8ffff d7ffff d6ffff d5ffff d4ffff d3ffff d2ffff d1ffff d0ffff cfffff ceffff cdffff ccffff cbffff caffff c9ffff c8ffff c7ffff c6ffff c5ffff c4ffff c3ffff c2ffff c1ffff c0ffff 
-bfffff beffff bdffff bcffff bbffff baffff b9ffff b8ffff b7ffff b6ffff b5ffff b4ffff b3ffff b2ffff b1ffff b0ffff afffff aeffff adffff acffff abffff aaffff a9ffff a8ffff a7ffff a6ffff a5ffff a4ffff a3ffff a2ffff a1ffff a0ffff 
-9fffff 9effff 9dffff 9cffff 9bffff 9affff 99ffff 98ffff 97ffff 96ffff 95ffff 94ffff 93ffff 92ffff 91ffff 90ffff 8fffff 8effff 8dffff 8cffff 8bffff 8affff 89ffff 88ffff 87ffff 86ffff 85ffff 84ffff 83ffff 82ffff 81ffff 80ffff 
-7fffff 7effff 7dffff 7cffff 7bffff 7affff 79ffff 78ffff 77ffff 76ffff 75ffff 74ffff 73ffff 72ffff 71ffff 70ffff 6fffff 6effff 6dffff 6cffff 6bffff 6affff 69ffff 68ffff 67ffff 66ffff 65ffff 64ffff 63ffff 62ffff 61ffff 60ffff 
-5fffff 5effff 5dffff 5cffff 5bffff 5affff 59ffff 58ffff 57ffff 56ffff 55ffff 54ffff 53ffff 52ffff 51ffff 50ffff 4fffff 4effff 4dffff 4cffff 4bffff 4affff 49ffff 48ffff 47ffff 46ffff 45ffff 44ffff 43ffff 42ffff 41ffff 40ffff 
-3fffff 3effff 3dffff 3cffff 3bffff 3affff 39ffff 38ffff 37ffff 36ffff 35ffff 34ffff 33ffff 32ffff 31ffff 30ffff 2fffff 2effff 2dffff 2cffff 2bffff 2affff 29ffff 28ffff 27ffff 26ffff 25ffff 24ffff 23ffff 22ffff 21ffff 20ffff 
-1fffff 1effff 1dffff 1cffff 1bffff 1affff 19ffff 18ffff 17ffff 16ffff 15ffff 14ffff 13ffff 12ffff 11ffff 10ffff 0fffff 0effff 0dffff 0cffff 0bffff 0affff 09ffff 08ffff 07ffff 06ffff 05ffff 04ffff 03ffff 02ffff 01ffff 00ffff 
-ffffff fefefe fdfdfd fcfcfc fbfbfb fafafa f9f9f9 f8f8f8 f7f7f7 f6f6f6 f5f5f5 f4f4f4 f3f3f3 f2f2f2 f1f1f1 f0f0f0 efefef eeeeee ededed ececec ebebeb eaeaea e9e9e9 e8e8e8 e7e7e7 e6e6e6 e5e5e5 e4e4e4 e3e3e3 e2e2e2 e1e1e1 e0e0e0 
-dfdfdf dedede dddddd dcdcdc dbdbdb dadada d9d9d9 d8d8d8 d7d7d7 d6d6d6 d5d5d5 d4d4d4 d3d3d3 d2d2d2 d1d1d1 d0d0d0 cfcfcf cecece cdcdcd cccccc cbcbcb cacaca c9c9c9 c8c8c8 c7c7c7 c6c6c6 c5c5c5 c4c4c4 c3c3c3 c2c2c2 c1c1c1 c0c0c0 
-bfbfbf bebebe bdbdbd bcbcbc bbbbbb bababa b9b9b9 b8b8b8 b7b7b7 b6b6b6 b5b5b5 b4b4b4 b3b3b3 b2b2b2 b1b1b1 b0b0b0 afafaf aeaeae adadad acacac ababab aaaaaa a9a9a9 a8a8a8 a7a7a7 a6a6a6 a5a5a5 a4a4a4 a3a3a3 a2a2a2 a1a1a1 a0a0a0 
-9f9f9f 9e9e9e 9d9d9d 9c9c9c 9b9b9b 9a9a9a 999999 989898 979797 969696 959595 949494 939393 929292 919191 909090 8f8f8f 8e8e8e 8d8d8d 8c8c8c 8b8b8b 8a8a8a 898989 888888 878787 868686 858585 848484 838383 828282 818181 808080 
-7f7f7f 7e7e7e 7d7d7d 7c7c7c 7b7b7b 7a7a7a 797979 787878 777777 767676 757575 747474 737373 727272 717171 707070 6f6f6f 6e6e6e 6d6d6d 6c6c6c 6b6b6b 6a6a6a 696969 686868 676767 666666 656565 646464 636363 626262 616161 606060 
-5f5f5f 5e5e5e 5d5d5d 5c5c5c 5b5b5b 5a5a5a 595959 585858 575757 565656 555555 545454 535353 525252 515151 505050 4f4f4f 4e4e4e 4d4d4d 4c4c4c 4b4b4b 4a4a4a 494949 484848 474747 464646 454545 444444 434343 424242 414141 404040 
-3f3f3f 3e3e3e 3d3d3d 3c3c3c 3b3b3b 3a3a3a 393939 383838 373737 363636 353535 343434 333333 323232 313131 303030 2f2f2f 2e2e2e 2d2d2d 2c2c2c 2b2b2b 2a2a2a 292929 282828 272727 262626 252525 242424 232323 222222 212121 202020 
-1f1f1f 1e1e1e 1d1d1d 1c1c1c 1b1b1b 1a1a1a 191919 181818 171717 161616 151515 141414 131313 121212 111111 101010 0f0f0f 0e0e0e 0d0d0d 0c0c0c 0b0b0b 0a0a0a 090909 080808 070707 060606 050505 040404 030303 020202 010101 000000 
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn2c16.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn2c16.png
deleted file mode 100644
index 1bd4a4d..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn2c16.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn2c16.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn2c16.sng
deleted file mode 100644
index bac7c9d..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn2c16.sng
+++ /dev/null
@@ -1,41 +0,0 @@
-#SNG: from basn2c16.png
-IHDR {
-    width: 32; height: 32; bitdepth: 16;
-    using color;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-ffffffff0000 f7bdffff0000 ef7bffff0000 e739ffff0000 def7ffff0000 d6b5ffff0000 ce73ffff0000 c631ffff0000 bdefffff0000 b5adffff0000 ad6bffff0000 a529ffff0000 9ce7ffff0000 94a5ffff0000 8c63ffff0000 8421ffff0000 7bdeffff0000 739cffff0000 6b5affff0000 6318ffff0000 5ad6ffff0000 5294ffff0000 4a52ffff0000 4210ffff0000 39ceffff0000 318cffff0000 294affff0000 2108ffff0000 18c6ffff0000 1084ffff0000 0842ffff0000 0000ffff0000 
-fffff7bd0000 f7bdf7bd0000 ef7bf7bd0000 e739f7bd0000 def7f7bd0000 d6b5f7bd0000 ce73f7bd0000 c631f7bd0000 bdeff7bd0000 b5adf7bd0000 ad6bf7bd0000 a529f7bd0000 9ce7f7bd0000 94a5f7bd0000 8c63f7bd0000 8421f7bd0000 7bdef7bd0000 739cf7bd0000 6b5af7bd0000 6318f7bd0000 5ad6f7bd0000 5294f7bd0000 4a52f7bd0000 4210f7bd0000 39cef7bd0000 318cf7bd0000 294af7bd0000 2108f7bd0000 18c6f7bd0000 1084f7bd0000 0842f7bd0000 0000f7bd0842 
-ffffef7b0000 f7bdef7b0000 ef7bef7b0000 e739ef7b0000 def7ef7b0000 d6b5ef7b0000 ce73ef7b0000 c631ef7b0000 bdefef7b0000 b5adef7b0000 ad6bef7b0000 a529ef7b0000 9ce7ef7b0000 94a5ef7b0000 8c63ef7b0000 8421ef7b0000 7bdeef7b0000 739cef7b0000 6b5aef7b0000 6318ef7b0000 5ad6ef7b0000 5294ef7b0000 4a52ef7b0000 4210ef7b0000 39ceef7b0000 318cef7b0000 294aef7b0000 2108ef7b0000 18c6ef7b0000 1084ef7b0000 0842ef7b0842 0000ef7b1084 
-ffffe7390000 f7bde7390000 ef7be7390000 e739e7390000 def7e7390000 d6b5e7390000 ce73e7390000 c631e7390000 bdefe7390000 b5ade7390000 ad6be7390000 a529e7390000 9ce7e7390000 94a5e7390000 8c63e7390000 8421e7390000 7bdee7390000 739ce7390000 6b5ae7390000 6318e7390000 5ad6e7390000 5294e7390000 4a52e7390000 4210e7390000 39cee7390000 318ce7390000 294ae7390000 2108e7390000 18c6e7390000 1084e7390842 0842e7391084 0000e73918c6 
-ffffdef70000 f7bddef70000 ef7bdef70000 e739def70000 def7def70000 d6b5def70000 ce73def70000 c631def70000 bdefdef70000 b5addef70000 ad6bdef70000 a529def70000 9ce7def70000 94a5def70000 8c63def70000 8421def70000 7bdedef70000 739cdef70000 6b5adef70000 6318def70000 5ad6def70000 5294def70000 4a52def70000 4210def70000 39cedef70000 318cdef70000 294adef70000 2108def70000 18c6def70842 1084def71084 0842def718c6 0000def72108 
-ffffd6b50000 f7bdd6b50000 ef7bd6b50000 e739d6b50000 def7d6b50000 d6b5d6b50000 ce73d6b50000 c631d6b50000 bdefd6b50000 b5add6b50000 ad6bd6b50000 a529d6b50000 9ce7d6b50000 94a5d6b50000 8c63d6b50000 8421d6b50000 7bded6b50000 739cd6b50000 6b5ad6b50000 6318d6b50000 5ad6d6b50000 5294d6b50000 4a52d6b50000 4210d6b50000 39ced6b50000 318cd6b50000 294ad6b50000 2108d6b50842 18c6d6b51084 1084d6b518c6 0842d6b52108 0000d6b5294a 
-ffffce730000 f7bdce730000 ef7bce730000 e739ce730000 def7ce730000 d6b5ce730000 ce73ce730000 c631ce730000 bdefce730000 b5adce730000 ad6bce730000 a529ce730000 9ce7ce730000 94a5ce730000 8c63ce730000 8421ce730000 7bdece730000 739cce730000 6b5ace730000 6318ce730000 5ad6ce730000 5294ce730000 4a52ce730000 4210ce730000 39cece730000 318cce730000 294ace730842 2108ce731084 18c6ce7318c6 1084ce732108 0842ce73294a 0000ce73318c 
-ffffc6310000 f7bdc6310000 ef7bc6310000 e739c6310000 def7c6310000 d6b5c6310000 ce73c6310000 c631c6310000 bdefc6310000 b5adc6310000 ad6bc6310000 a529c6310000 9ce7c6310000 94a5c6310000 8c63c6310000 8421c6310000 7bdec6310000 739cc6310000 6b5ac6310000 6318c6310000 5ad6c6310000 5294c6310000 4a52c6310000 4210c6310000 39cec6310000 318cc6310842 294ac6311084 2108c63118c6 18c6c6312108 1084c631294a 0842c631318c 0000c63139ce 
-ffffbdef0000 f7bdbdef0000 ef7bbdef0000 e739bdef0000 def7bdef0000 d6b5bdef0000 ce73bdef0000 c631bdef0000 bdefbdef0000 b5adbdef0000 ad6bbdef0000 a529bdef0000 9ce7bdef0000 94a5bdef0000 8c63bdef0000 8421bdef0000 7bdebdef0000 739cbdef0000 6b5abdef0000 6318bdef0000 5ad6bdef0000 5294bdef0000 4a52bdef0000 4210bdef0000 39cebdef0842 318cbdef1084 294abdef18c6 2108bdef2108 18c6bdef294a 1084bdef318c 0842bdef39ce 0000bdef4210 
-ffffb5ad0000 f7bdb5ad0000 ef7bb5ad0000 e739b5ad0000 def7b5ad0000 d6b5b5ad0000 ce73b5ad0000 c631b5ad0000 bdefb5ad0000 b5adb5ad0000 ad6bb5ad0000 a529b5ad0000 9ce7b5ad0000 94a5b5ad0000 8c63b5ad0000 8421b5ad0000 7bdeb5ad0000 739cb5ad0000 6b5ab5ad0000 6318b5ad0000 5ad6b5ad0000 5294b5ad0000 4a52b5ad0000 4210b5ad0842 39ceb5ad1084 318cb5ad18c6 294ab5ad2108 2108b5ad294a 18c6b5ad318c 1084b5ad39ce 0842b5ad4210 0000b5ad4a52 
-ffffad6b0000 f7bdad6b0000 ef7bad6b0000 e739ad6b0000 def7ad6b0000 d6b5ad6b0000 ce73ad6b0000 c631ad6b0000 bdefad6b0000 b5adad6b0000 ad6bad6b0000 a529ad6b0000 9ce7ad6b0000 94a5ad6b0000 8c63ad6b0000 8421ad6b0000 7bdead6b0000 739cad6b0000 6b5aad6b0000 6318ad6b0000 5ad6ad6b0000 5294ad6b0000 4a52ad6b0842 4210ad6b1084 39cead6b18c6 318cad6b2108 294aad6b294a 2108ad6b318c 18c6ad6b39ce 1084ad6b4210 0842ad6b4a52 0000ad6b5294 
-ffffa5290000 f7bda5290000 ef7ba5290000 e739a5290000 def7a5290000 d6b5a5290000 ce73a5290000 c631a5290000 bdefa5290000 b5ada5290000 ad6ba5290000 a529a5290000 9ce7a5290000 94a5a5290000 8c63a5290000 8421a5290000 7bdea5290000 739ca5290000 6b5aa5290000 6318a5290000 5ad6a5290000 5294a5290842 4a52a5291084 4210a52918c6 39cea5292108 318ca529294a 294aa529318c 2108a52939ce 18c6a5294210 1084a5294a52 0842a5295294 0000a5295ad6 
-ffff9ce70000 f7bd9ce70000 ef7b9ce70000 e7399ce70000 def79ce70000 d6b59ce70000 ce739ce70000 c6319ce70000 bdef9ce70000 b5ad9ce70000 ad6b9ce70000 a5299ce70000 9ce79ce70000 94a59ce70000 8c639ce70000 84219ce70000 7bde9ce70000 739c9ce70000 6b5a9ce70000 63189ce70000 5ad69ce70842 52949ce71084 4a529ce718c6 42109ce72108 39ce9ce7294a 318c9ce7318c 294a9ce739ce 21089ce74210 18c69ce74a52 10849ce75294 08429ce75ad6 00009ce76318 
-ffff94a50000 f7bd94a50000 ef7b94a50000 e73994a50000 def794a50000 d6b594a50000 ce7394a50000 c63194a50000 bdef94a50000 b5ad94a50000 ad6b94a50000 a52994a50000 9ce794a50000 94a594a50000 8c6394a50000 842194a50000 7bde94a50000 739c94a50000 6b5a94a50000 631894a50842 5ad694a51084 529494a518c6 4a5294a52108 421094a5294a 39ce94a5318c 318c94a539ce 294a94a54210 210894a54a52 18c694a55294 108494a55ad6 084294a56318 000094a56b5a 
-ffff8c630000 f7bd8c630000 ef7b8c630000 e7398c630000 def78c630000 d6b58c630000 ce738c630000 c6318c630000 bdef8c630000 b5ad8c630000 ad6b8c630000 a5298c630000 9ce78c630000 94a58c630000 8c638c630000 84218c630000 7bde8c630000 739c8c630000 6b5a8c630842 63188c631084 5ad68c6318c6 52948c632108 4a528c63294a 42108c63318c 39ce8c6339ce 318c8c634210 294a8c634a52 21088c635294 18c68c635ad6 10848c636318 08428c636b5a 00008c63739c 
-ffff84210000 f7bd84210000 ef7b84210000 e73984210000 def784210000 d6b584210000 ce7384210000 c63184210000 bdef84210000 b5ad84210000 ad6b84210000 a52984210000 9ce784210000 94a584210000 8c6384210000 842184210000 7bde84210000 739c84210842 6b5a84211084 6318842118c6 5ad684212108 52948421294a 4a528421318c 4210842139ce 39ce84214210 318c84214a52 294a84215294 210884215ad6 18c684216318 108484216b5a 08428421739c 000084217bde 
-ffff7bde0000 f7bd7bde0000 ef7b7bde0000 e7397bde0000 def77bde0000 d6b57bde0000 ce737bde0000 c6317bde0000 bdef7bde0000 b5ad7bde0000 ad6b7bde0000 a5297bde0000 9ce77bde0000 94a57bde0000 8c637bde0000 84217bde0000 7bde7bde0842 739c7bde1084 6b5a7bde18c6 63187bde2108 5ad67bde294a 52947bde318c 4a527bde39ce 42107bde4210 39ce7bde4a52 318c7bde5294 294a7bde5ad6 21087bde6318 18c67bde6b5a 10847bde739c 08427bde7bde 00007bde8421 
-ffff739c0000 f7bd739c0000 ef7b739c0000 e739739c0000 def7739c0000 d6b5739c0000 ce73739c0000 c631739c0000 bdef739c0000 b5ad739c0000 ad6b739c0000 a529739c0000 9ce7739c0000 94a5739c0000 8c63739c0000 8421739c0842 7bde739c1084 739c739c18c6 6b5a739c2108 6318739c294a 5ad6739c318c 5294739c39ce 4a52739c4210 4210739c4a52 39ce739c5294 318c739c5ad6 294a739c6318 2108739c6b5a 18c6739c739c 1084739c7bde 0842739c8421 0000739c8c63 
-ffff6b5a0000 f7bd6b5a0000 ef7b6b5a0000 e7396b5a0000 def76b5a0000 d6b56b5a0000 ce736b5a0000 c6316b5a0000 bdef6b5a0000 b5ad6b5a0000 ad6b6b5a0000 a5296b5a0000 9ce76b5a0000 94a56b5a0000 8c636b5a0842 84216b5a1084 7bde6b5a18c6 739c6b5a2108 6b5a6b5a294a 63186b5a318c 5ad66b5a39ce 52946b5a4210 4a526b5a4a52 42106b5a5294 39ce6b5a5ad6 318c6b5a6318 294a6b5a6b5a 21086b5a739c 18c66b5a7bde 10846b5a8421 08426b5a8c63 00006b5a94a5 
-ffff63180000 f7bd63180000 ef7b63180000 e73963180000 def763180000 d6b563180000 ce7363180000 c63163180000 bdef63180000 b5ad63180000 ad6b63180000 a52963180000 9ce763180000 94a563180842 8c6363181084 8421631818c6 7bde63182108 739c6318294a 6b5a6318318c 6318631839ce 5ad663184210 529463184a52 4a5263185294 421063185ad6 39ce63186318 318c63186b5a 294a6318739c 210863187bde 18c663188421 108463188c63 0842631894a5 000063189ce7 
-ffff5ad60000 f7bd5ad60000 ef7b5ad60000 e7395ad60000 def75ad60000 d6b55ad60000 ce735ad60000 c6315ad60000 bdef5ad60000 b5ad5ad60000 ad6b5ad60000 a5295ad60000 9ce75ad60842 94a55ad61084 8c635ad618c6 84215ad62108 7bde5ad6294a 739c5ad6318c 6b5a5ad639ce 63185ad64210 5ad65ad64a52 52945ad65294 4a525ad65ad6 42105ad66318 39ce5ad66b5a 318c5ad6739c 294a5ad67bde 21085ad68421 18c65ad68c63 10845ad694a5 08425ad69ce7 00005ad6a529 
-ffff52940000 f7bd52940000 ef7b52940000 e73952940000 def752940000 d6b552940000 ce7352940000 c63152940000 bdef52940000 b5ad52940000 ad6b52940000 a52952940842 9ce752941084 94a5529418c6 8c6352942108 84215294294a 7bde5294318c 739c529439ce 6b5a52944210 631852944a52 5ad652945294 529452945ad6 4a5252946318 421052946b5a 39ce5294739c 318c52947bde 294a52948421 210852948c63 18c6529494a5 108452949ce7 08425294a529 00005294ad6b 
-ffff4a520000 f7bd4a520000 ef7b4a520000 e7394a520000 def74a520000 d6b54a520000 ce734a520000 c6314a520000 bdef4a520000 b5ad4a520000 ad6b4a520842 a5294a521084 9ce74a5218c6 94a54a522108 8c634a52294a 84214a52318c 7bde4a5239ce 739c4a524210 6b5a4a524a52 63184a525294 5ad64a525ad6 52944a526318 4a524a526b5a 42104a52739c 39ce4a527bde 318c4a528421 294a4a528c63 21084a5294a5 18c64a529ce7 10844a52a529 08424a52ad6b 00004a52b5ad 
-ffff42100000 f7bd42100000 ef7b42100000 e73942100000 def742100000 d6b542100000 ce7342100000 c63142100000 bdef42100000 b5ad42100842 ad6b42101084 a529421018c6 9ce742102108 94a54210294a 8c634210318c 8421421039ce 7bde42104210 739c42104a52 6b5a42105294 631842105ad6 5ad642106318 529442106b5a 4a524210739c 421042107bde 39ce42108421 318c42108c63 294a421094a5 210842109ce7 18c64210a529 10844210ad6b 08424210b5ad 00004210bdef 
-ffff39ce0000 f7bd39ce0000 ef7b39ce0000 e73939ce0000 def739ce0000 d6b539ce0000 ce7339ce0000 c63139ce0000 bdef39ce0842 b5ad39ce1084 ad6b39ce18c6 a52939ce2108 9ce739ce294a 94a539ce318c 8c6339ce39ce 842139ce4210 7bde39ce4a52 739c39ce5294 6b5a39ce5ad6 631839ce6318 5ad639ce6b5a 529439ce739c 4a5239ce7bde 421039ce8421 39ce39ce8c63 318c39ce94a5 294a39ce9ce7 210839cea529 18c639cead6b 108439ceb5ad 084239cebdef 000039cec631 
-ffff318c0000 f7bd318c0000 ef7b318c0000 e739318c0000 def7318c0000 d6b5318c0000 ce73318c0000 c631318c0842 bdef318c1084 b5ad318c18c6 ad6b318c2108 a529318c294a 9ce7318c318c 94a5318c39ce 8c63318c4210 8421318c4a52 7bde318c5294 739c318c5ad6 6b5a318c6318 6318318c6b5a 5ad6318c739c 5294318c7bde 4a52318c8421 4210318c8c63 39ce318c94a5 318c318c9ce7 294a318ca529 2108318cad6b 18c6318cb5ad 1084318cbdef 0842318cc631 0000318cce73 
-ffff294a0000 f7bd294a0000 ef7b294a0000 e739294a0000 def7294a0000 d6b5294a0000 ce73294a0842 c631294a1084 bdef294a18c6 b5ad294a2108 ad6b294a294a a529294a318c 9ce7294a39ce 94a5294a4210 8c63294a4a52 8421294a5294 7bde294a5ad6 739c294a6318 6b5a294a6b5a 6318294a739c 5ad6294a7bde 5294294a8421 4a52294a8c63 4210294a94a5 39ce294a9ce7 318c294aa529 294a294aad6b 2108294ab5ad 18c6294abdef 1084294ac631 0842294ace73 0000294ad6b5 
-ffff21080000 f7bd21080000 ef7b21080000 e73921080000 def721080000 d6b521080842 ce7321081084 c631210818c6 bdef21082108 b5ad2108294a ad6b2108318c a529210839ce 9ce721084210 94a521084a52 8c6321085294 842121085ad6 7bde21086318 739c21086b5a 6b5a2108739c 631821087bde 5ad621088421 529421088c63 4a52210894a5 421021089ce7 39ce2108a529 318c2108ad6b 294a2108b5ad 21082108bdef 18c62108c631 10842108ce73 08422108d6b5 00002108def7 
-ffff18c60000 f7bd18c60000 ef7b18c60000 e73918c60000 def718c60842 d6b518c61084 ce7318c618c6 c63118c62108 bdef18c6294a b5ad18c6318c ad6b18c639ce a52918c64210 9ce718c64a52 94a518c65294 8c6318c65ad6 842118c66318 7bde18c66b5a 739c18c6739c 6b5a18c67bde 631818c68421 5ad618c68c63 529418c694a5 4a5218c69ce7 421018c6a529 39ce18c6ad6b 318c18c6b5ad 294a18c6bdef 210818c6c631 18c618c6ce73 108418c6d6b5 084218c6def7 000018c6e739 
-ffff10840000 f7bd10840000 ef7b10840000 e73910840842 def710841084 d6b5108418c6 ce7310842108 c6311084294a bdef1084318c b5ad108439ce ad6b10844210 a52910844a52 9ce710845294 94a510845ad6 8c6310846318 842110846b5a 7bde1084739c 739c10847bde 6b5a10848421 631810848c63 5ad6108494a5 529410849ce7 4a521084a529 42101084ad6b 39ce1084b5ad 318c1084bdef 294a1084c631 21081084ce73 18c61084d6b5 10841084def7 08421084e739 00001084ef7b 
-ffff08420000 f7bd08420000 ef7b08420842 e73908421084 def7084218c6 d6b508422108 ce730842294a c6310842318c bdef084239ce b5ad08424210 ad6b08424a52 a52908425294 9ce708425ad6 94a508426318 8c6308426b5a 84210842739c 7bde08427bde 739c08428421 6b5a08428c63 6318084294a5 5ad608429ce7 52940842a529 4a520842ad6b 42100842b5ad 39ce0842bdef 318c0842c631 294a0842ce73 21080842d6b5 18c60842def7 10840842e739 08420842ef7b 00000842f7bd 
-ffff00000000 f7bd00000842 ef7b00001084 e739000018c6 def700002108 d6b50000294a ce730000318c c631000039ce bdef00004210 b5ad00004a52 ad6b00005294 a52900005ad6 9ce700006318 94a500006b5a 8c630000739c 842100007bde 7bde00008421 739c00008c63 6b5a000094a5 631800009ce7 5ad60000a529 52940000ad6b 4a520000b5ad 42100000bdef 39ce0000c631 318c0000ce73 294a0000d6b5 21080000def7 18c60000e739 10840000ef7b 08420000f7bd 00000000ffff 
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p01.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p01.png
deleted file mode 100644
index a21db59..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p01.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p01.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p01.sng
deleted file mode 100644
index a8b3ce8..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p01.sng
+++ /dev/null
@@ -1,45 +0,0 @@
-#SNG: from basn3p01.png
-IHDR {
-    width: 32; height: 32; bitdepth: 1;
-    using color palette;
-}
-gAMA {1.0000}
-PLTE {
-    (238,255, 34)     # rgb = (0xee,0xff,0x22)
-    ( 34,102,255)     # rgb = (0x22,0x66,0xff)
-}
-IMAGE {
-    pixels hex
-0f0f0f0f
-0f0f0f0f
-0f0f0f0f
-0f0f0f0f
-f0f0f0f0
-f0f0f0f0
-f0f0f0f0
-f0f0f0f0
-0f0f0f0f
-0f0f0f0f
-0f0f0f0f
-0f0f0f0f
-f0f0f0f0
-f0f0f0f0
-f0f0f0f0
-f0f0f0f0
-0f0f0f0f
-0f0f0f0f
-0f0f0f0f
-0f0f0f0f
-f0f0f0f0
-f0f0f0f0
-f0f0f0f0
-f0f0f0f0
-0f0f0f0f
-0f0f0f0f
-0f0f0f0f
-0f0f0f0f
-f0f0f0f0
-f0f0f0f0
-f0f0f0f0
-f0f0f0f0
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p02.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p02.png
deleted file mode 100644
index 1d0ab61..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p02.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p02.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p02.sng
deleted file mode 100644
index ab3fb37..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p02.sng
+++ /dev/null
@@ -1,47 +0,0 @@
-#SNG: from basn3p02.png
-IHDR {
-    width: 32; height: 32; bitdepth: 2;
-    using color palette;
-}
-gAMA {1.0000}
-PLTE {
-    (  0,255,  0)     # rgb = (0x00,0xff,0x00)
-    (255,  0,  0)     # rgb = (0xff,0x00,0x00)
-    (255,255,  0)     # rgb = (0xff,0xff,0x00)
-    (  0,  0,255)     # rgb = (0x00,0x00,0xff)
-}
-IMAGE {
-    pixels hex
-ff55aa00ff55aa00
-ff55aa00ff55aa00
-ff55aa00ff55aa00
-ff55aa00ff55aa00
-00ff55aa00ff55aa
-00ff55aa00ff55aa
-00ff55aa00ff55aa
-00ff55aa00ff55aa
-aa00ff55aa00ff55
-aa00ff55aa00ff55
-aa00ff55aa00ff55
-aa00ff55aa00ff55
-55aa00ff55aa00ff
-55aa00ff55aa00ff
-55aa00ff55aa00ff
-55aa00ff55aa00ff
-ff55aa00ff55aa00
-ff55aa00ff55aa00
-ff55aa00ff55aa00
-ff55aa00ff55aa00
-00ff55aa00ff55aa
-00ff55aa00ff55aa
-00ff55aa00ff55aa
-00ff55aa00ff55aa
-aa00ff55aa00ff55
-aa00ff55aa00ff55
-aa00ff55aa00ff55
-aa00ff55aa00ff55
-55aa00ff55aa00ff
-55aa00ff55aa00ff
-55aa00ff55aa00ff
-55aa00ff55aa00ff
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p04-31i.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p04-31i.png
deleted file mode 100644
index 540137c..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p04-31i.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p04-31i.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p04-31i.sng
deleted file mode 100644
index 31b87c7..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p04-31i.sng
+++ /dev/null
@@ -1,57 +0,0 @@
-#SNG: from basn3p04-31i.png
-IHDR {
-    width: 31; height: 31; bitdepth: 4;
-    using color palette;
-}
-gAMA {1.0000}
-PLTE {
-    ( 34,  0,255)     # rgb = (0x22,0x00,0xff)
-    (  0,255,255)     # rgb = (0x00,0xff,0xff)
-    (136,  0,255)     # rgb = (0x88,0x00,0xff)
-    ( 34,255,  0)     # rgb = (0x22,0xff,0x00)
-    (  0,153,255)     # rgb = (0x00,0x99,0xff)
-    (255,102,  0)     # rgb = (0xff,0x66,0x00)
-    (221,  0,255)     # rgb = (0xdd,0x00,0xff)
-    (119,255,  0)     # rgb = (0x77,0xff,0x00)
-    (255,  0,  0)     # rgb = (0xff,0x00,0x00)
-    (  0,255,153)     # rgb = (0x00,0xff,0x99)
-    (221,255,  0)     # rgb = (0xdd,0xff,0x00)
-    (255,  0,187)     # rgb = (0xff,0x00,0xbb)
-    (255,187,  0)     # rgb = (0xff,0xbb,0x00)
-    (  0, 68,255)     # rgb = (0x00,0x44,0xff)
-    (  0,255, 68)     # rgb = (0x00,0xff,0x44)
-}
-IMAGE {
-    pixels hex
-88885555ccccaaaa77773333eeee9990
-88885555ccccaaaa77773333eeee9990
-88885555ccccaaaa77773333eeee9990
-88885555ccccaaaa77773333eeee9990
-5555ccccaaaa77773333eeee99991110
-5555ccccaaaa77773333eeee99991110
-5555ccccaaaa77773333eeee99991110
-5555ccccaaaa77773333eeee99991110
-ccccaaaa77773333eeee999911114440
-ccccaaaa77773333eeee999911114440
-ccccaaaa77773333eeee999911114440
-ccccaaaa77773333eeee999911114440
-aaaa77773333eeee999911114444ddd0
-aaaa77773333eeee999911114444ddd0
-aaaa77773333eeee999911114444ddd0
-aaaa77773333eeee999911114444ddd0
-77773333eeee999911114444dddd0000
-77773333eeee999911114444dddd0000
-77773333eeee999911114444dddd0000
-77773333eeee999911114444dddd0000
-3333eeee999911114444dddd00002220
-3333eeee999911114444dddd00002220
-3333eeee999911114444dddd00002220
-3333eeee999911114444dddd00002220
-eeee999911114444dddd000022226660
-eeee999911114444dddd000022226660
-eeee999911114444dddd000022226660
-eeee999911114444dddd000022226660
-999911114444dddd000022226666bbb0
-999911114444dddd000022226666bbb0
-999911114444dddd000022226666bbb0
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p04.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p04.png
deleted file mode 100644
index 6dc6eac..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p04.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p04.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p04.sng
deleted file mode 100644
index a2b2fb5..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p04.sng
+++ /dev/null
@@ -1,58 +0,0 @@
-#SNG: from basn3p04.png
-IHDR {
-    width: 32; height: 32; bitdepth: 4;
-    using color palette;
-}
-gAMA {1.0000}
-PLTE {
-    ( 34,  0,255)     # rgb = (0x22,0x00,0xff)
-    (  0,255,255)     # rgb = (0x00,0xff,0xff)
-    (136,  0,255)     # rgb = (0x88,0x00,0xff)
-    ( 34,255,  0)     # rgb = (0x22,0xff,0x00)
-    (  0,153,255)     # rgb = (0x00,0x99,0xff)
-    (255,102,  0)     # rgb = (0xff,0x66,0x00)
-    (221,  0,255)     # rgb = (0xdd,0x00,0xff)
-    (119,255,  0)     # rgb = (0x77,0xff,0x00)
-    (255,  0,  0)     # rgb = (0xff,0x00,0x00)
-    (  0,255,153)     # rgb = (0x00,0xff,0x99)
-    (221,255,  0)     # rgb = (0xdd,0xff,0x00)
-    (255,  0,187)     # rgb = (0xff,0x00,0xbb)
-    (255,187,  0)     # rgb = (0xff,0xbb,0x00)
-    (  0, 68,255)     # rgb = (0x00,0x44,0xff)
-    (  0,255, 68)     # rgb = (0x00,0xff,0x44)
-}
-IMAGE {
-    pixels hex
-88885555ccccaaaa77773333eeee9999
-88885555ccccaaaa77773333eeee9999
-88885555ccccaaaa77773333eeee9999
-88885555ccccaaaa77773333eeee9999
-5555ccccaaaa77773333eeee99991111
-5555ccccaaaa77773333eeee99991111
-5555ccccaaaa77773333eeee99991111
-5555ccccaaaa77773333eeee99991111
-ccccaaaa77773333eeee999911114444
-ccccaaaa77773333eeee999911114444
-ccccaaaa77773333eeee999911114444
-ccccaaaa77773333eeee999911114444
-aaaa77773333eeee999911114444dddd
-aaaa77773333eeee999911114444dddd
-aaaa77773333eeee999911114444dddd
-aaaa77773333eeee999911114444dddd
-77773333eeee999911114444dddd0000
-77773333eeee999911114444dddd0000
-77773333eeee999911114444dddd0000
-77773333eeee999911114444dddd0000
-3333eeee999911114444dddd00002222
-3333eeee999911114444dddd00002222
-3333eeee999911114444dddd00002222
-3333eeee999911114444dddd00002222
-eeee999911114444dddd000022226666
-eeee999911114444dddd000022226666
-eeee999911114444dddd000022226666
-eeee999911114444dddd000022226666
-999911114444dddd000022226666bbbb
-999911114444dddd000022226666bbbb
-999911114444dddd000022226666bbbb
-999911114444dddd000022226666bbbb
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p08-trns.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p08-trns.png
deleted file mode 100644
index b0fc0c1..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p08-trns.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p08-trns.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p08-trns.sng
deleted file mode 100644
index 78dc367..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p08-trns.sng
+++ /dev/null
@@ -1,301 +0,0 @@
-#SNG: from basn3p08-trns.png
-IHDR {
-    width: 32; height: 32; bitdepth: 8;
-    using color palette;
-}
-gAMA {1.0000}
-PLTE {
-    (255,  3,  7)     # rgb = (0xff,0x03,0x07)
-    (255,  4,  7)     # rgb = (0xff,0x04,0x07)
-    (255,  9,  7)     # rgb = (0xff,0x09,0x07)
-    (217, 14,  7)     # rgb = (0xd9,0x0e,0x07)
-    (255, 14,  7)     # rgb = (0xff,0x0e,0x07)
-    (  2, 22, 19)     # rgb = (0x02,0x16,0x13)
-    (255, 26,  7)     # rgb = (0xff,0x1a,0x07)
-    (255, 31,  7)     # rgb = (0xff,0x1f,0x07)
-    ( 10, 37, 14)     # rgb = (0x0a,0x25,0x0e)
-    (179, 37,  6)     # rgb = (0xb3,0x25,0x06)
-    (254, 42,  7)     # rgb = (0xfe,0x2a,0x07)
-    (255, 45,  7)     # rgb = (0xff,0x2d,0x07)
-    ( 25, 46,  9)     # rgb = (0x19,0x2e,0x09)
-    (  0, 48,254)     # rgb = (0x00,0x30,0xfe)
-    (  0, 48,255)     # rgb = (0x00,0x30,0xff)
-    (  0, 49,255)     # rgb = (0x00,0x31,0xff)
-    (  0, 51,254)     # rgb = (0x00,0x33,0xfe)
-    (  0, 52,255)     # rgb = (0x00,0x34,0xff)
-    (255, 53,  7)     # rgb = (0xff,0x35,0x07)
-    (  0, 54,252)     # rgb = (0x00,0x36,0xfc)
-    (254, 57,  7)     # rgb = (0xfe,0x39,0x07)
-    (251, 57,  7)     # rgb = (0xfb,0x39,0x07)
-    (247, 59,  7)     # rgb = (0xf7,0x3b,0x07)
-    (  0, 59, 61)     # rgb = (0x00,0x3b,0x3d)
-    (  0, 62,255)     # rgb = (0x00,0x3e,0xff)
-    (142, 63,  5)     # rgb = (0x8e,0x3f,0x05)
-    (  0, 63,250)     # rgb = (0x00,0x3f,0xfa)
-    (255, 63,  7)     # rgb = (0xff,0x3f,0x07)
-    (253, 68,  7)     # rgb = (0xfd,0x44,0x07)
-    (  0, 73,255)     # rgb = (0x00,0x49,0xff)
-    (  0, 73,246)     # rgb = (0x00,0x49,0xf6)
-    (255, 75,  7)     # rgb = (0xff,0x4b,0x07)
-    ( 82, 85,  9)     # rgb = (0x52,0x55,0x09)
-    (255, 85,  7)     # rgb = (0xff,0x55,0x07)
-    (  0, 89,255)     # rgb = (0x00,0x59,0xff)
-    (  0, 91,237)     # rgb = (0x00,0x5b,0xed)
-    (255, 94,  7)     # rgb = (0xff,0x5e,0x07)
-    (241,100,  7)     # rgb = (0xf1,0x64,0x07)
-    (  0,101,255)     # rgb = (0x00,0x65,0xff)
-    (253,105,  7)     # rgb = (0xfd,0x69,0x07)
-    (  0,107,223)     # rgb = (0x00,0x6b,0xdf)
-    (255,106,  7)     # rgb = (0xff,0x6a,0x07)
-    (  1,110, 95)     # rgb = (0x01,0x6e,0x5f)
-    (255,115,  7)     # rgb = (0xff,0x73,0x07)
-    (  0,117,255)     # rgb = (0x00,0x75,0xff)
-    (255,124,  7)     # rgb = (0xff,0x7c,0x07)
-    (118,126, 10)     # rgb = (0x76,0x7e,0x0a)
-    (  0,130,250)     # rgb = (0x00,0x82,0xfa)
-    (  0,132,255)     # rgb = (0x00,0x84,0xff)
-    (  0,134,207)     # rgb = (0x00,0x86,0xcf)
-    (255,134,  7)     # rgb = (0xff,0x86,0x07)
-    (  0,136,249)     # rgb = (0x00,0x88,0xf9)
-    (219,140,  6)     # rgb = (0xdb,0x8c,0x06)
-    (  0,140,252)     # rgb = (0x00,0x8c,0xfc)
-    (  0,140,255)     # rgb = (0x00,0x8c,0xff)
-    (  1,142,136)     # rgb = (0x01,0x8e,0x88)
-    (255,143,  7)     # rgb = (0xff,0x8f,0x07)
-    (243,150,  7)     # rgb = (0xf3,0x96,0x07)
-    (198,152,  7)     # rgb = (0xc6,0x98,0x07)
-    (165,153,  7)     # rgb = (0xa5,0x99,0x07)
-    (  0,157,255)     # rgb = (0x00,0x9d,0xff)
-    (255,158,  7)     # rgb = (0xff,0x9e,0x07)
-    ( 70,159,  4)     # rgb = (0x46,0x9f,0x04)
-    (  0,160,251)     # rgb = (0x00,0xa0,0xfb)
-    (203,163,  6)     # rgb = (0xcb,0xa3,0x06)
-    (  0,163,239)     # rgb = (0x00,0xa3,0xef)
-    (  1,164,178)     # rgb = (0x01,0xa4,0xb2)
-    (255,166,  7)     # rgb = (0xff,0xa6,0x07)
-    (  1,169,165)     # rgb = (0x01,0xa9,0xa5)
-    (  1,170,255)     # rgb = (0x01,0xaa,0xff)
-    (232,172,  6)     # rgb = (0xe8,0xac,0x06)
-    (255,175,  7)     # rgb = (0xff,0xaf,0x07)
-    (185,176,131)     # rgb = (0xb9,0xb0,0x83)
-    (  1,179,225)     # rgb = (0x01,0xb3,0xe1)
-    (188,179,118)     # rgb = (0xbc,0xb3,0x76)
-    (199,180,  6)     # rgb = (0xc7,0xb4,0x06)
-    (  1,182,255)     # rgb = (0x01,0xb6,0xff)
-    (  1,184,249)     # rgb = (0x01,0xb8,0xf9)
-    (255,184,  7)     # rgb = (0xff,0xb8,0x07)
-    (207,186, 71)     # rgb = (0xcf,0xba,0x47)
-    (193,187,  6)     # rgb = (0xc1,0xbb,0x06)
-    (253,191,  7)     # rgb = (0xfd,0xbf,0x07)
-    (218,193, 48)     # rgb = (0xda,0xc1,0x30)
-    (  1,193,157)     # rgb = (0x01,0xc1,0x9d)
-    (  1,196,244)     # rgb = (0x01,0xc4,0xf4)
-    (  1,196,254)     # rgb = (0x01,0xc4,0xfe)
-    ( 48,199,  3)     # rgb = (0x30,0xc7,0x03)
-    (164,199,  5)     # rgb = (0xa4,0xc7,0x05)
-    (220,202,  6)     # rgb = (0xdc,0xca,0x06)
-    (253,203,  7)     # rgb = (0xfd,0xcb,0x07)
-    (  1,204,204)     # rgb = (0x01,0xcc,0xcc)
-    (251,209,  7)     # rgb = (0xfb,0xd1,0x07)
-    (231,208, 24)     # rgb = (0xe7,0xd0,0x18)
-    (  1,210,254)     # rgb = (0x01,0xd2,0xfe)
-    (  2,211,146)     # rgb = (0x02,0xd3,0x92)
-    (  1,212,156)     # rgb = (0x01,0xd4,0x9c)
-    (  1,213,252)     # rgb = (0x01,0xd5,0xfc)
-    (237,219, 15)     # rgb = (0xed,0xdb,0x0f)
-    (  1,218,240)     # rgb = (0x01,0xda,0xf0)
-    (165,220,  5)     # rgb = (0xa5,0xdc,0x05)
-    (  1,221,250)     # rgb = (0x01,0xdd,0xfa)
-    (249,221,  6)     # rgb = (0xf9,0xdd,0x06)
-    (146,222,  4)     # rgb = (0x92,0xde,0x04)
-    (  1,224,184)     # rgb = (0x01,0xe0,0xb8)
-    (  2,224,155)     # rgb = (0x02,0xe0,0x9b)
-    (244,225, 10)     # rgb = (0xf4,0xe1,0x0a)
-    (249,227,  7)     # rgb = (0xf9,0xe3,0x07)
-    (  2,229,133)     # rgb = (0x02,0xe5,0x85)
-    (192,228,  6)     # rgb = (0xc0,0xe4,0x06)
-    ( 37,230,  3)     # rgb = (0x25,0xe6,0x03)
-    (246,230,  7)     # rgb = (0xf6,0xe6,0x07)
-    (143,232,  4)     # rgb = (0x8f,0xe8,0x04)
-    (244,233,  8)     # rgb = (0xf4,0xe9,0x08)
-    (  2,236,139)     # rgb = (0x02,0xec,0x8b)
-    (  1,236,227)     # rgb = (0x01,0xec,0xe3)
-    (  1,238,238)     # rgb = (0x01,0xee,0xee)
-    (101,241,  4)     # rgb = (0x65,0xf1,0x04)
-    (  1,241,218)     # rgb = (0x01,0xf1,0xda)
-    (  1,240,232)     # rgb = (0x01,0xf0,0xe8)
-    (167,240,  5)     # rgb = (0xa7,0xf0,0x05)
-    ( 27,243,  2)     # rgb = (0x1b,0xf3,0x02)
-    (126,243,  4)     # rgb = (0x7e,0xf3,0x04)
-    (  2,246,113)     # rgb = (0x02,0xf6,0x71)
-    (133,248,  5)     # rgb = (0x85,0xf8,0x05)
-    ( 22,250,  1)     # rgb = (0x16,0xfa,0x01)
-    (  2,249,219)     # rgb = (0x02,0xf9,0xdb)
-    (148,250,  5)     # rgb = (0x94,0xfa,0x05)
-    (  2,250,199)     # rgb = (0x02,0xfa,0xc7)
-    (183,252,  5)     # rgb = (0xb7,0xfc,0x05)
-    (176,252,  5)     # rgb = (0xb0,0xfc,0x05)
-    (  2,252,211)     # rgb = (0x02,0xfc,0xd3)
-    (  2,252,190)     # rgb = (0x02,0xfc,0xbe)
-    (164,251,  5)     # rgb = (0xa4,0xfb,0x05)
-    ( 12,254,128)     # rgb = (0x0c,0xfe,0x80)
-    (192,253,  5)     # rgb = (0xc0,0xfd,0x05)
-    (164,253,  5)     # rgb = (0xa4,0xfd,0x05)
-    ( 26,254, 85)     # rgb = (0x1a,0xfe,0x55)
-    ( 14,254,  1)     # rgb = (0x0e,0xfe,0x01)
-    (133,253,  5)     # rgb = (0x85,0xfd,0x05)
-    (  4,253,180)     # rgb = (0x04,0xfd,0xb4)
-    (196,253,  5)     # rgb = (0xc4,0xfd,0x05)
-    (  2,253,198)     # rgb = (0x02,0xfd,0xc6)
-    (  3,255, 91)     # rgb = (0x03,0xff,0x5b)
-    (  3,255, 80)     # rgb = (0x03,0xff,0x50)
-    (186,255,  5)     # rgb = (0xba,0xff,0x05)
-    (  9,255,  2)     # rgb = (0x09,0xff,0x02)
-    (  3,255,118)     # rgb = (0x03,0xff,0x76)
-    (  9,255,  3)     # rgb = (0x09,0xff,0x03)
-    ( 10,255,  1)     # rgb = (0x0a,0xff,0x01)
-    (  3,255, 76)     # rgb = (0x03,0xff,0x4c)
-    (  3,255, 86)     # rgb = (0x03,0xff,0x56)
-    (  3,255, 82)     # rgb = (0x03,0xff,0x52)
-    ( 13,255,  1)     # rgb = (0x0d,0xff,0x01)
-    (  3,255, 49)     # rgb = (0x03,0xff,0x31)
-    (  3,255,101)     # rgb = (0x03,0xff,0x65)
-    ( 61,255, 32)     # rgb = (0x3d,0xff,0x20)
-    (129,255,  5)     # rgb = (0x81,0xff,0x05)
-    (177,255,  5)     # rgb = (0xb1,0xff,0x05)
-    (  3,255, 37)     # rgb = (0x03,0xff,0x25)
-    (149,255,  5)     # rgb = (0x95,0xff,0x05)
-    (  7,255,  6)     # rgb = (0x07,0xff,0x06)
-    (192,255,  5)     # rgb = (0xc0,0xff,0x05)
-    (  2,255,131)     # rgb = (0x02,0xff,0x83)
-    (  3,255, 98)     # rgb = (0x03,0xff,0x62)
-    ( 85,255, 11)     # rgb = (0x55,0xff,0x0b)
-    (  2,255,163)     # rgb = (0x02,0xff,0xa3)
-    (  2,255,149)     # rgb = (0x02,0xff,0x95)
-    (  4,255, 23)     # rgb = (0x04,0xff,0x17)
-    (  6,255, 12)     # rgb = (0x06,0xff,0x0c)
-    (  3,255, 67)     # rgb = (0x03,0xff,0x43)
-    (160,255,  5)     # rgb = (0xa0,0xff,0x05)
-    (119,255,  6)     # rgb = (0x77,0xff,0x06)
-    (102,255,  8)     # rgb = (0x66,0xff,0x08)
-    (255,255,255)     # rgb = (0xff,0xff,0xff)
-    (254,254,254)     # rgb = (0xfe,0xfe,0xfe)
-    (254,254,254)     # rgb = (0xfe,0xfe,0xfe)
-    (252,252,252)     # rgb = (0xfc,0xfc,0xfc)
-    (252,252,252)     # rgb = (0xfc,0xfc,0xfc)
-    (250,250,250)     # rgb = (0xfa,0xfa,0xfa)
-    (250,250,250)     # rgb = (0xfa,0xfa,0xfa)
-    (248,248,248)     # rgb = (0xf8,0xf8,0xf8)
-    (248,248,248)     # rgb = (0xf8,0xf8,0xf8)
-    (247,247,247)     # rgb = (0xf7,0xf7,0xf7)
-    (245,245,245)     # rgb = (0xf5,0xf5,0xf5)
-    (245,245,245)     # rgb = (0xf5,0xf5,0xf5)
-    (243,243,243)     # rgb = (0xf3,0xf3,0xf3)
-    (243,243,243)     # rgb = (0xf3,0xf3,0xf3)
-    (241,241,241)     # rgb = (0xf1,0xf1,0xf1)
-    (241,241,241)     # rgb = (0xf1,0xf1,0xf1)
-    (239,239,239)     # rgb = (0xef,0xef,0xef)
-    (238,238,238)     # rgb = (0xee,0xee,0xee)
-    (238,238,238)     # rgb = (0xee,0xee,0xee)
-    (236,236,236)     # rgb = (0xec,0xec,0xec)
-    (236,236,236)     # rgb = (0xec,0xec,0xec)
-    (234,234,234)     # rgb = (0xea,0xea,0xea)
-    (234,234,234)     # rgb = (0xea,0xea,0xea)
-    (232,232,232)     # rgb = (0xe8,0xe8,0xe8)
-    (231,231,231)     # rgb = (0xe7,0xe7,0xe7)
-    (231,231,231)     # rgb = (0xe7,0xe7,0xe7)
-    (229,229,229)     # rgb = (0xe5,0xe5,0xe5)
-    (229,229,229)     # rgb = (0xe5,0xe5,0xe5)
-    (227,227,227)     # rgb = (0xe3,0xe3,0xe3)
-    (226,226,226)     # rgb = (0xe2,0xe2,0xe2)
-    (226,226,226)     # rgb = (0xe2,0xe2,0xe2)
-    (224,224,224)     # rgb = (0xe0,0xe0,0xe0)
-    (224,224,224)     # rgb = (0xe0,0xe0,0xe0)
-    (222,222,222)     # rgb = (0xde,0xde,0xde)
-    (222,222,222)     # rgb = (0xde,0xde,0xde)
-    (220,220,220)     # rgb = (0xdc,0xdc,0xdc)
-    (219,219,219)     # rgb = (0xdb,0xdb,0xdb)
-    (219,219,219)     # rgb = (0xdb,0xdb,0xdb)
-    (217,217,217)     # rgb = (0xd9,0xd9,0xd9)
-    (217,217,217)     # rgb = (0xd9,0xd9,0xd9)
-    (215,215,215)     # rgb = (0xd7,0xd7,0xd7)
-    (214,214,214)     # rgb = (0xd6,0xd6,0xd6)
-    (214,214,214)     # rgb = (0xd6,0xd6,0xd6)
-    (212,212,212)     # rgb = (0xd4,0xd4,0xd4)
-    (212,212,212)     # rgb = (0xd4,0xd4,0xd4)
-    (210,210,210)     # rgb = (0xd2,0xd2,0xd2)
-    (209,209,209)     # rgb = (0xd1,0xd1,0xd1)
-    (209,209,209)     # rgb = (0xd1,0xd1,0xd1)
-    (207,207,207)     # rgb = (0xcf,0xcf,0xcf)
-    (205,205,205)     # rgb = (0xcd,0xcd,0xcd)
-    (205,205,205)     # rgb = (0xcd,0xcd,0xcd)
-    (204,204,204)     # rgb = (0xcc,0xcc,0xcc)
-    (204,204,204)     # rgb = (0xcc,0xcc,0xcc)
-    (202,202,202)     # rgb = (0xca,0xca,0xca)
-    (201,201,201)     # rgb = (0xc9,0xc9,0xc9)
-    (201,201,201)     # rgb = (0xc9,0xc9,0xc9)
-    (199,199,199)     # rgb = (0xc7,0xc7,0xc7)
-    (199,199,199)     # rgb = (0xc7,0xc7,0xc7)
-    (197,197,197)     # rgb = (0xc5,0xc5,0xc5)
-    (196,196,196)     # rgb = (0xc4,0xc4,0xc4)
-    (196,196,196)     # rgb = (0xc4,0xc4,0xc4)
-    (194,194,194)     # rgb = (0xc2,0xc2,0xc2)
-    (193,193,193)     # rgb = (0xc1,0xc1,0xc1)
-    (193,193,193)     # rgb = (0xc1,0xc1,0xc1)
-    (191,191,191)     # rgb = (0xbf,0xbf,0xbf)
-    (191,191,191)     # rgb = (0xbf,0xbf,0xbf)
-    (189,189,189)     # rgb = (0xbd,0xbd,0xbd)
-    (188,188,188)     # rgb = (0xbc,0xbc,0xbc)
-    (188,188,188)     # rgb = (0xbc,0xbc,0xbc)
-    (186,186,186)     # rgb = (0xba,0xba,0xba)
-    (185,185,185)     # rgb = (0xb9,0xb9,0xb9)
-    (185,185,185)     # rgb = (0xb9,0xb9,0xb9)
-    (183,183,183)     # rgb = (0xb7,0xb7,0xb7)
-    (182,182,182)     # rgb = (0xb6,0xb6,0xb6)
-    (182,182,182)     # rgb = (0xb6,0xb6,0xb6)
-    (180,180,180)     # rgb = (0xb4,0xb4,0xb4)
-    (178,178,178)     # rgb = (0xb2,0xb2,0xb2)
-    (178,178,178)     # rgb = (0xb2,0xb2,0xb2)
-    (177,177,177)     # rgb = (0xb1,0xb1,0xb1)
-    (177,177,177)     # rgb = (0xb1,0xb1,0xb1)
-    (175,175,175)     # rgb = (0xaf,0xaf,0xaf)
-    (174,174,174)     # rgb = (0xae,0xae,0xae)
-    (174,174,174)     # rgb = (0xae,0xae,0xae)
-}
-tRNS {
- 197 187 190 194 186 4 186 189 4 195 84 191 5 193 175 163 205 150 191 213 88 75 67 8 147 191 220 203 95 151 223 199 8 207 156 227 199 65 163 98 226 204 12 202 167 201 11 65 178 228 205 74 59 87 178 19 201 99 18 14 184 204 184 96 22 61 227 199 22 193 97 197 254 59 253 28 192 102 199 247 58 198 244 30 109 202 188 32 96 196 60 203 239 202 230 41 207 237 119 53 213 209 37 55 45 230 214 233 92 185 223 50 230 57 124 217 43 133 221 95 198 47 233 99 194 221 107 138 152 144 226 140 133 220 172 125 218 196 118 225 161 223 235 238 200 155 147 146 172 236 236 151 183 150 234 216 217 211 151 219 132 185 145 147 217 138 144 137 142 151 217 217 213}
-IMAGE {
-    pixels hex
-0520201616160a0a0a0a0a0a0a0a010101010101010101000000000000000000
-053a3a161616160a0a0a0a0a0a0a0a0a0a06060606060607070707070707071b
-053a3a3a161616161615151c1c1c1c1c1c1c12121212121b1b1b1b1b1b1b1b1b
-053a3a3a3a252525252527272727272727272724242424242424212121212121
-053a3a3a4034343425252727272727393939392d2d2d2d2d2d2d323232323232
-053a3a404034343434343939393939393939394747474343433d3d3d3d3d3d3d
-053a404b4b4b50505046464646464646464659595959595151514e5b5b616161
-053a404b4b4b50505058585858585858588c8c8c595959595b656a6e70707070
-053a4b4b4b4b5050506c5858585858588c8c8c8c8c8c5965656a6a6e70707070
-053b4b4b4b636363506c6c6c6c6c6c8781808c8c8c86a1a1a1906e6e70707070
-053b4b5757636363636c6c6c6c7787878181808c8c86a1a190909d9d9d9daa70
-053b576666666f6363777777777e8787848481808086a19090aaaaaaaa9f9f9f
-053b576666797979797b7b7b7b7b8a8a8a8a848480809c9c9c9c9c9c9c9c9c9c
-053b66747474747474747b7b7b7b8a8a8a8a8a8aacacacacacacacacacaca4a4
-052e7474747474747474747b7b7b8a8a8a6d6d6d6d6d6d6da4a4a4a4a4a4a4a4
-052e7474747474747474a0a0a0a0a0a09393936d6d6d6d787878787878787878
-05207474747474a0a0a0a0a0a0a0a0a093939191949494948989898989898989
-052a2a2a7171717171a7a7a7a7a7a7a7a7a79e9e9e9e9e9e9e9e959595959595
-052a53536871717171717171a9a9a9a9a9a9a9a9a9a9a9a99595959595959595
-053753536871717171717171a3a3a3a3a3a3a3a3979797979a9a9a9a8e8e8e8e
-05445353686871717171717171a5a2a2a2a2a2929292928585857a7a7a7a7a7a
-054453535f68687171717171a5a5a5a5a5a5a6a6a6a6a68b8b8b8b8b8b8b8b6b
-054444535f686767676767677272727f7f8383838383838d8d8d8d8d8d8d8b8b
-054444535f6767675a5a5a627272727275757f7f7f7f5d73737d7d7d82828282
-0544445367675a5a5a5a4d546262727272757575755d5d5d7373737376767676
-054444535349495a5a5a4d4d54626262626275754c5d5d5d5d60646464767676
-054444444949494949494d4d4d5454546262624c4c4c4c4c5555556060646464
-05444444444941414133353f3f3f3f3f3f4d3636363c3c454545454531313131
-05444444442f2f2f2f333535353535352c2c2c2c2c3030303030282828282828
-053744442f2f2f2f2f2f333535351d1d22222222262626262323232323232323
-053737372f2f2f2f2f2f2f331818181818181d1d1d1d1d131a1a1a1a1a1e1e1e
-052a37372f2f2f2f2f2f18111111110f0e0e0e0e0d0d0d0d0d0d0d0d0d0d0d13
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p08.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p08.png
deleted file mode 100644
index 0e07f48..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p08.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p08.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p08.sng
deleted file mode 100644
index 0423bb2..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn3p08.sng
+++ /dev/null
@@ -1,299 +0,0 @@
-#SNG: from basn3p08.png
-IHDR {
-    width: 32; height: 32; bitdepth: 8;
-    using color palette;
-}
-gAMA {1.0000}
-PLTE {
-    ( 34, 68,  0)     # rgb = (0x22,0x44,0x00)
-    (245,255,237)     # rgb = (0xf5,0xff,0xed)
-    (119,255,119)     # rgb = (0x77,0xff,0x77)
-    (203,255,255)     # rgb = (0xcb,0xff,0xff)
-    ( 17, 10,  0)     # rgb = (0x11,0x0a,0x00)
-    ( 58,119,  0)     # rgb = (0x3a,0x77,0x00)
-    ( 34, 34,255)     # rgb = (0x22,0x22,0xff)
-    (255, 17,255)     # rgb = (0xff,0x11,0xff)
-    ( 17,  0,  0)     # rgb = (0x11,0x00,0x00)
-    ( 34, 34,  0)     # rgb = (0x22,0x22,0x00)
-    (255,172, 85)     # rgb = (0xff,0xac,0x55)
-    (102,255,102)     # rgb = (0x66,0xff,0x66)
-    (255,102,102)     # rgb = (0xff,0x66,0x66)
-    (255,  1,255)     # rgb = (0xff,0x01,0xff)
-    ( 34, 18,  0)     # rgb = (0x22,0x12,0x00)
-    (220,255,255)     # rgb = (0xdc,0xff,0xff)
-    (204,255,153)     # rgb = (0xcc,0xff,0x99)
-    ( 68, 68,255)     # rgb = (0x44,0x44,0xff)
-    (  0, 85, 85)     # rgb = (0x00,0x55,0x55)
-    ( 34,  0,  0)     # rgb = (0x22,0x00,0x00)
-    (203,203,255)     # rgb = (0xcb,0xcb,0xff)
-    ( 68, 68,  0)     # rgb = (0x44,0x44,0x00)
-    ( 85,255, 85)     # rgb = (0x55,0xff,0x55)
-    (203,203,  0)     # rgb = (0xcb,0xcb,0x00)
-    ( 51, 26,  0)     # rgb = (0x33,0x1a,0x00)
-    (255,236,220)     # rgb = (0xff,0xec,0xdc)
-    (237,255,255)     # rgb = (0xed,0xff,0xff)
-    (228,255,203)     # rgb = (0xe4,0xff,0xcb)
-    (255,220,220)     # rgb = (0xff,0xdc,0xdc)
-    ( 68,255, 68)     # rgb = (0x44,0xff,0x44)
-    (102,102,255)     # rgb = (0x66,0x66,0xff)
-    ( 51,  0,  0)     # rgb = (0x33,0x00,0x00)
-    ( 68, 34,  0)     # rgb = (0x44,0x22,0x00)
-    (237,237,255)     # rgb = (0xed,0xed,0xff)
-    (102,102,  0)     # rgb = (0x66,0x66,0x00)
-    (255,164, 68)     # rgb = (0xff,0xa4,0x44)
-    (255,255,170)     # rgb = (0xff,0xff,0xaa)
-    (237,237,  0)     # rgb = (0xed,0xed,0x00)
-    (  0,203,203)     # rgb = (0x00,0xcb,0xcb)
-    (254,255,255)     # rgb = (0xfe,0xff,0xff)
-    (253,255,254)     # rgb = (0xfd,0xff,0xfe)
-    (255,255,  1)     # rgb = (0xff,0xff,0x01)
-    ( 51,255, 51)     # rgb = (0x33,0xff,0x33)
-    ( 85, 42,  0)     # rgb = (0x55,0x2a,0x00)
-    (  1,  1,255)     # rgb = (0x01,0x01,0xff)
-    (136,136,255)     # rgb = (0x88,0x88,0xff)
-    (  0,170,170)     # rgb = (0x00,0xaa,0xaa)
-    (  1,  1,  0)     # rgb = (0x01,0x01,0x00)
-    ( 68,  0,  0)     # rgb = (0x44,0x00,0x00)
-    (136,136,  0)     # rgb = (0x88,0x88,0x00)
-    (255,228,203)     # rgb = (0xff,0xe4,0xcb)
-    (186, 91,  0)     # rgb = (0xba,0x5b,0x00)
-    ( 34,255, 34)     # rgb = (0x22,0xff,0x22)
-    (102, 50,  0)     # rgb = (0x66,0x32,0x00)
-    (255,255,153)     # rgb = (0xff,0xff,0x99)
-    (170,170,255)     # rgb = (0xaa,0xaa,0xff)
-    ( 85,  0,  0)     # rgb = (0x55,0x00,0x00)
-    (170,170,  0)     # rgb = (0xaa,0xaa,0x00)
-    (203, 99,  0)     # rgb = (0xcb,0x63,0x00)
-    ( 17,255, 17)     # rgb = (0x11,0xff,0x11)
-    (212,255,170)     # rgb = (0xd4,0xff,0xaa)
-    (119, 58,  0)     # rgb = (0x77,0x3a,0x00)
-    (255, 68, 68)     # rgb = (0xff,0x44,0x44)
-    (220,107,  0)     # rgb = (0xdc,0x6b,0x00)
-    (102,  0,  0)     # rgb = (0x66,0x00,0x00)
-    (  1,255,  1)     # rgb = (0x01,0xff,0x01)
-    (136, 66,  0)     # rgb = (0x88,0x42,0x00)
-    (236,255,220)     # rgb = (0xec,0xff,0xdc)
-    (107,220,  0)     # rgb = (0x6b,0xdc,0x00)
-    (255,220,186)     # rgb = (0xff,0xdc,0xba)
-    (  0, 51, 51)     # rgb = (0x00,0x33,0x33)
-    (  0,237,  0)     # rgb = (0x00,0xed,0x00)
-    (237,115,  0)     # rgb = (0xed,0x73,0x00)
-    (255,255,136)     # rgb = (0xff,0xff,0x88)
-    (153, 74,  0)     # rgb = (0x99,0x4a,0x00)
-    ( 17,255,255)     # rgb = (0x11,0xff,0xff)
-    (119,  0,  0)     # rgb = (0x77,0x00,0x00)
-    (255,131,  1)     # rgb = (0xff,0x83,0x01)
-    (255,186,186)     # rgb = (0xff,0xba,0xba)
-    (254,123,  0)     # rgb = (0xfe,0x7b,0x00)
-    (255,254,255)     # rgb = (0xff,0xfe,0xff)
-    (  0,203,  0)     # rgb = (0x00,0xcb,0x00)
-    (255,153,153)     # rgb = (0xff,0x99,0x99)
-    ( 34,255,255)     # rgb = (0x22,0xff,0xff)
-    (136,  0,  0)     # rgb = (0x88,0x00,0x00)
-    (255,255,119)     # rgb = (0xff,0xff,0x77)
-    (  0,136,136)     # rgb = (0x00,0x88,0x88)
-    (255,220,255)     # rgb = (0xff,0xdc,0xff)
-    ( 26, 51,  0)     # rgb = (0x1a,0x33,0x00)
-    (  0,  0,170)     # rgb = (0x00,0x00,0xaa)
-    ( 51,255,255)     # rgb = (0x33,0xff,0xff)
-    (  0,153,  0)     # rgb = (0x00,0x99,0x00)
-    (153,  0,  0)     # rgb = (0x99,0x00,0x00)
-    (  0,  0,  1)     # rgb = (0x00,0x00,0x01)
-    ( 50,102,  0)     # rgb = (0x32,0x66,0x00)
-    (255,186,255)     # rgb = (0xff,0xba,0xff)
-    ( 68,255,255)     # rgb = (0x44,0xff,0xff)
-    (255,170,255)     # rgb = (0xff,0xaa,0xff)
-    (  0,119,  0)     # rgb = (0x00,0x77,0x00)
-    (  0,254,254)     # rgb = (0x00,0xfe,0xfe)
-    (170,  0,  0)     # rgb = (0xaa,0x00,0x00)
-    ( 74,153,  0)     # rgb = (0x4a,0x99,0x00)
-    (255,255,102)     # rgb = (0xff,0xff,0x66)
-    (255, 34, 34)     # rgb = (0xff,0x22,0x22)
-    (  0,  0,153)     # rgb = (0x00,0x00,0x99)
-    (139,255, 17)     # rgb = (0x8b,0xff,0x11)
-    ( 85,255,255)     # rgb = (0x55,0xff,0xff)
-    (255,  1,  1)     # rgb = (0xff,0x01,0x01)
-    (255,136,255)     # rgb = (0xff,0x88,0xff)
-    (  0, 85,  0)     # rgb = (0x00,0x55,0x00)
-    (  0, 17, 17)     # rgb = (0x00,0x11,0x11)
-    (255,255,254)     # rgb = (0xff,0xff,0xfe)
-    (255,253,254)     # rgb = (0xff,0xfd,0xfe)
-    (164,255, 68)     # rgb = (0xa4,0xff,0x44)
-    (102,255,255)     # rgb = (0x66,0xff,0xff)
-    (255,102,255)     # rgb = (0xff,0x66,0xff)
-    (  0, 51,  0)     # rgb = (0x00,0x33,0x00)
-    (255,255, 85)     # rgb = (0xff,0xff,0x55)
-    (255,119,119)     # rgb = (0xff,0x77,0x77)
-    (  0,  0,136)     # rgb = (0x00,0x00,0x88)
-    (255, 68,255)     # rgb = (0xff,0x44,0xff)
-    (  0, 17,  0)     # rgb = (0x00,0x11,0x00)
-    (119,255,255)     # rgb = (0x77,0xff,0xff)
-    (  0,102,102)     # rgb = (0x00,0x66,0x66)
-    (255,255,237)     # rgb = (0xff,0xff,0xed)
-    (  0,  1,  0)     # rgb = (0x00,0x01,0x00)
-    (255,245,237)     # rgb = (0xff,0xf5,0xed)
-    ( 17, 17,255)     # rgb = (0x11,0x11,0xff)
-    (255,255, 68)     # rgb = (0xff,0xff,0x44)
-    (255, 34,255)     # rgb = (0xff,0x22,0xff)
-    (255,237,237)     # rgb = (0xff,0xed,0xed)
-    ( 17, 17,  0)     # rgb = (0x11,0x11,0x00)
-    (136,255,255)     # rgb = (0x88,0xff,0xff)
-    (  0,  0,119)     # rgb = (0x00,0x00,0x77)
-    (147,255, 34)     # rgb = (0x93,0xff,0x22)
-    (  0,220,220)     # rgb = (0x00,0xdc,0xdc)
-    ( 51, 51,255)     # rgb = (0x33,0x33,0xff)
-    (254,  0,254)     # rgb = (0xfe,0x00,0xfe)
-    (186,186,255)     # rgb = (0xba,0xba,0xff)
-    (153,255,255)     # rgb = (0x99,0xff,0xff)
-    ( 51, 51,  0)     # rgb = (0x33,0x33,0x00)
-    ( 99,203,  0)     # rgb = (0x63,0xcb,0x00)
-    (186,186,  0)     # rgb = (0xba,0xba,0x00)
-    (172,255, 85)     # rgb = (0xac,0xff,0x55)
-    (255,255,220)     # rgb = (0xff,0xff,0xdc)
-    (255,255, 51)     # rgb = (0xff,0xff,0x33)
-    (123,254,  0)     # rgb = (0x7b,0xfe,0x00)
-    (237,  0,237)     # rgb = (0xed,0x00,0xed)
-    ( 85, 85,255)     # rgb = (0x55,0x55,0xff)
-    (170,255,255)     # rgb = (0xaa,0xff,0xff)
-    (220,220,255)     # rgb = (0xdc,0xdc,0xff)
-    ( 85, 85,  0)     # rgb = (0x55,0x55,0x00)
-    (  0,  0,102)     # rgb = (0x00,0x00,0x66)
-    (220,220,  0)     # rgb = (0xdc,0xdc,0x00)
-    (220,  0,220)     # rgb = (0xdc,0x00,0xdc)
-    (131,255,  1)     # rgb = (0x83,0xff,0x01)
-    (119,119,255)     # rgb = (0x77,0x77,0xff)
-    (254,254,255)     # rgb = (0xfe,0xfe,0xff)
-    (255,255,203)     # rgb = (0xff,0xff,0xcb)
-    (255, 85, 85)     # rgb = (0xff,0x55,0x55)
-    (119,119,  0)     # rgb = (0x77,0x77,0x00)
-    (254,254,  0)     # rgb = (0xfe,0xfe,0x00)
-    (203,  0,203)     # rgb = (0xcb,0x00,0xcb)
-    (  0,  0,254)     # rgb = (0x00,0x00,0xfe)
-    (  1,  2,  0)     # rgb = (0x01,0x02,0x00)
-    (  1,  0,  0)     # rgb = (0x01,0x00,0x00)
-    ( 18, 34,  0)     # rgb = (0x12,0x22,0x00)
-    (255,255, 34)     # rgb = (0xff,0xff,0x22)
-    (  0, 68, 68)     # rgb = (0x00,0x44,0x44)
-    (155,255, 51)     # rgb = (0x9b,0xff,0x33)
-    (255,212,170)     # rgb = (0xff,0xd4,0xaa)
-    (  0,  0, 85)     # rgb = (0x00,0x00,0x55)
-    (153,153,255)     # rgb = (0x99,0x99,0xff)
-    (153,153,  0)     # rgb = (0x99,0x99,0x00)
-    (186,  0,186)     # rgb = (0xba,0x00,0xba)
-    ( 42, 85,  0)     # rgb = (0x2a,0x55,0x00)
-    (255,203,203)     # rgb = (0xff,0xcb,0xcb)
-    (180,255,102)     # rgb = (0xb4,0xff,0x66)
-    (255,155, 51)     # rgb = (0xff,0x9b,0x33)
-    (255,255,186)     # rgb = (0xff,0xff,0xba)
-    (170,  0,170)     # rgb = (0xaa,0x00,0xaa)
-    ( 66,136,  0)     # rgb = (0x42,0x88,0x00)
-    ( 83,170,  0)     # rgb = (0x53,0xaa,0x00)
-    (255,170,170)     # rgb = (0xff,0xaa,0xaa)
-    (  0,  0,237)     # rgb = (0x00,0x00,0xed)
-    (  0,186,186)     # rgb = (0x00,0xba,0xba)
-    (255,255, 17)     # rgb = (0xff,0xff,0x11)
-    (  0,254,  0)     # rgb = (0x00,0xfe,0x00)
-    (  0,  0, 68)     # rgb = (0x00,0x00,0x44)
-    (  0,153,153)     # rgb = (0x00,0x99,0x99)
-    (153,  0,153)     # rgb = (0x99,0x00,0x99)
-    (255,204,153)     # rgb = (0xff,0xcc,0x99)
-    (186,  0,  0)     # rgb = (0xba,0x00,0x00)
-    (136,  0,136)     # rgb = (0x88,0x00,0x88)
-    (  0,220,  0)     # rgb = (0x00,0xdc,0x00)
-    (255,147, 34)     # rgb = (0xff,0x93,0x22)
-    (  0,  0,220)     # rgb = (0x00,0x00,0xdc)
-    (254,255,254)     # rgb = (0xfe,0xff,0xfe)
-    (170, 83,  0)     # rgb = (0xaa,0x53,0x00)
-    (119,  0,119)     # rgb = (0x77,0x00,0x77)
-    (  2,  1,  0)     # rgb = (0x02,0x01,0x00)
-    (203,  0,  0)     # rgb = (0xcb,0x00,0x00)
-    (  0,  0, 51)     # rgb = (0x00,0x00,0x33)
-    (255,237,255)     # rgb = (0xff,0xed,0xff)
-    (  0,186,  0)     # rgb = (0x00,0xba,0x00)
-    (255, 51, 51)     # rgb = (0xff,0x33,0x33)
-    (237,255,237)     # rgb = (0xed,0xff,0xed)
-    (255,196,136)     # rgb = (0xff,0xc4,0x88)
-    (188,255,119)     # rgb = (0xbc,0xff,0x77)
-    (  0,170,  0)     # rgb = (0x00,0xaa,0x00)
-    (102,  0,102)     # rgb = (0x66,0x00,0x66)
-    (  0, 34, 34)     # rgb = (0x00,0x22,0x22)
-    (220,  0,  0)     # rgb = (0xdc,0x00,0x00)
-    (255,203,255)     # rgb = (0xff,0xcb,0xff)
-    (220,255,220)     # rgb = (0xdc,0xff,0xdc)
-    (255,139, 17)     # rgb = (0xff,0x8b,0x11)
-    (  0,  0,203)     # rgb = (0x00,0x00,0xcb)
-    (  0,  1,  1)     # rgb = (0x00,0x01,0x01)
-    ( 85,  0, 85)     # rgb = (0x55,0x00,0x55)
-    (  0,136,  0)     # rgb = (0x00,0x88,0x00)
-    (  0,  0, 34)     # rgb = (0x00,0x00,0x22)
-    (  1,255,255)     # rgb = (0x01,0xff,0xff)
-    (203,255,203)     # rgb = (0xcb,0xff,0xcb)
-    (237,  0,  0)     # rgb = (0xed,0x00,0x00)
-    (255,136,136)     # rgb = (0xff,0x88,0x88)
-    ( 68,  0, 68)     # rgb = (0x44,0x00,0x44)
-    ( 91,186,  0)     # rgb = (0x5b,0xba,0x00)
-    (255,188,119)     # rgb = (0xff,0xbc,0x77)
-    (255,153,255)     # rgb = (0xff,0x99,0xff)
-    (  0,102,  0)     # rgb = (0x00,0x66,0x00)
-    (186,255,186)     # rgb = (0xba,0xff,0xba)
-    (  0,119,119)     # rgb = (0x00,0x77,0x77)
-    (115,237,  0)     # rgb = (0x73,0xed,0x00)
-    (254,  0,  0)     # rgb = (0xfe,0x00,0x00)
-    ( 51,  0, 51)     # rgb = (0x33,0x00,0x33)
-    (  0,  0,186)     # rgb = (0x00,0x00,0xba)
-    (255,119,255)     # rgb = (0xff,0x77,0xff)
-    (  0, 68,  0)     # rgb = (0x00,0x44,0x00)
-    (170,255,170)     # rgb = (0xaa,0xff,0xaa)
-    (255,254,254)     # rgb = (0xff,0xfe,0xfe)
-    (  0,  0, 17)     # rgb = (0x00,0x00,0x11)
-    ( 34,  0, 34)     # rgb = (0x22,0x00,0x22)
-    (196,255,136)     # rgb = (0xc4,0xff,0x88)
-    (  0,237,237)     # rgb = (0x00,0xed,0xed)
-    (153,255,153)     # rgb = (0x99,0xff,0x99)
-    (255, 85,255)     # rgb = (0xff,0x55,0xff)
-    (  0, 34,  0)     # rgb = (0x00,0x22,0x00)
-    (255,180,102)     # rgb = (0xff,0xb4,0x66)
-    ( 17,  0, 17)     # rgb = (0x11,0x00,0x11)
-    ( 10, 17,  0)     # rgb = (0x0a,0x11,0x00)
-    (255, 17, 17)     # rgb = (0xff,0x11,0x11)
-    (220,255,186)     # rgb = (0xdc,0xff,0xba)
-    (186,255,255)     # rgb = (0xba,0xff,0xff)
-    (136,255,136)     # rgb = (0x88,0xff,0x88)
-    (  1,  0,  1)     # rgb = (0x01,0x00,0x01)
-    (255, 51,255)     # rgb = (0xff,0x33,0xff)
-}
-IMAGE {
-    pixels hex
-a5a5a5a5a4a4a4a42f2f2f2fc8c8c8c87d7d7d7dd9d9d9d95d5d5d5dfefefefe
-080808080404040483838383f9f9f9f9797979796e6e6e6ef0f0f0f0f8f8f8f8
-131313130e0e0e0e09090909a6a6a6a6f6f6f6f6d3d3d3d3dcdcdcdcf1f1f1f1
-1f1f1f1f181818188c8c8c8c585858587474747446464646cacacacaeaeaeaea
-30303030202020201515151500000000ededededa8a8a8a8bcbcbcbce1e1e1e1
-383838382b2b2b2b97979797afafafaf6d6d6d6d12121212ababababdadadada
-4040404035353535222222225e5e5e5ee5e5e5e57b7b7b7b98989898d2d2d2d2
-4c4c4c4c3d3d3d3da0a0a0a00505050562626262e7e7e7e785858585c7c7c7c7
-545454544242424231313131b5b5b5b5dbdbdbdb5656565677777777c1c1c1c1
-5c5c5c5c4a4a4a4aadadadad656565655b5b5b5bbdbdbdbd68686868bebebebe
-64646464c6c6c6c639393939b6b6b6b6d1d1d1d12e2e2e2e59595959b4b4b4b4
-c0c0c0c0333333338e8e8e8ee2e2e2e2ccccccccb9b9b9b9ebebebebaeaeaeae
-c9c9c9c93a3a3a3a171717178d8d8d8d5151515126262626d8d8d8d8a2a2a2a2
-d4d4d4d43f3f3f3f9999999944444444c2c2c2c287878787c4c4c4c49a9a9a9a
-dfdfdfdf4848484825252525e8e8e8e847474747f3f3f3f3b8b8b8b893939393
-e9e9e9e94f4f4f4fa1a1a1a192929292bbbbbbbb63636363a3a3a3a389898989
-6b6b6b6b4d4d4d4d292929299b9b9b9b41414141dddddddd2c2c2c2c0d0d0d0d
-fafafafad7d7d7d7babababa696969693b3b3b3b4b4b4b4b7f7f7f7f07070707
-67676767c3c3c3c3a7a7a7a78686868634343434535353530606060681818181
-cdcdcdcdb2b2b2b291919191a9a9a9a92a2a2a2a5a5a5a5a88888888ffffffff
-3e3e3e3e2323232380808080717171711d1d1d1d606060601111111178787878
-9f9f9f9f0a0a0a0a757575758f8f8f8f161616166a6a6a6a94949494f5f5f5f5
-0c0c0c0cf7f7f7f766666666b1b1b1b10b0b0b0b727272721e1e1e1e73737373
-76767676e3e3e3e355555555d0d0d0d0020202027a7a7a7a9c9c9c9cecececec
-e0e0e0e0cfcfcfcf49494949f2f2f2f2fdfdfdfd848484842d2d2d2d6c6c6c6c
-52525252bfbfbfbf3636363610101010f4f4f4f48b8b8b8bacacacace4e4e4e4
-b7b7b7b7aaaaaaaa242424243c3c3c3ceeeeeeee959595953737373761616161
-4e4e4e4e45454545b3b3b3b3fbfbfbfbe6e6e6e6fcfcfcfc8a8a8a8a5f5f5f5f
-b0b0b0b0323232329e9e9e9e1b1b1b1bdededede0303030314141414d5d5d5d5
-1c1c1c1c191919199090909043434343d6d6d6d60f0f0f0f9696969657575757
-828282827e7e7e7e7c7c7c7c01010101cececece1a1a1a1a21212121cbcbcbcb
-efefefef707070706f6f6f6f28282828c5c5c5c5272727279d9d9d9d50505050
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn4a08.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn4a08.png
deleted file mode 100644
index 3bb0dd0..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn4a08.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn4a08.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn4a08.sng
deleted file mode 100644
index cc4096f..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn4a08.sng
+++ /dev/null
@@ -1,41 +0,0 @@
-#SNG: from basn4a08.png
-IHDR {
-    width: 32; height: 32; bitdepth: 8;
-    using color alpha;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-ffffff00 ffffff08 ffffff10 ffffff18 ffffff20 ffffff29 ffffff31 ffffff39 ffffff41 ffffff4a ffffff52 ffffff5a ffffff62 ffffff6a ffffff73 ffffff7b ffffff83 ffffff8b ffffff94 ffffff9c ffffffa4 ffffffac ffffffb4 ffffffbd ffffffc5 ffffffcd ffffffd5 ffffffde ffffffe6 ffffffee fffffff6 ffffffff 
-f6f6f600 f6f6f608 f6f6f610 f6f6f618 f6f6f620 f6f6f629 f6f6f631 f6f6f639 f6f6f641 f6f6f64a f6f6f652 f6f6f65a f6f6f662 f6f6f66a f6f6f673 f6f6f67b f6f6f683 f6f6f68b f6f6f694 f6f6f69c f6f6f6a4 f6f6f6ac f6f6f6b4 f6f6f6bd f6f6f6c5 f6f6f6cd f6f6f6d5 f6f6f6de f6f6f6e6 f6f6f6ee f6f6f6f6 f6f6f6ff 
-eeeeee00 eeeeee08 eeeeee10 eeeeee18 eeeeee20 eeeeee29 eeeeee31 eeeeee39 eeeeee41 eeeeee4a eeeeee52 eeeeee5a eeeeee62 eeeeee6a eeeeee73 eeeeee7b eeeeee83 eeeeee8b eeeeee94 eeeeee9c eeeeeea4 eeeeeeac eeeeeeb4 eeeeeebd eeeeeec5 eeeeeecd eeeeeed5 eeeeeede eeeeeee6 eeeeeeee eeeeeef6 eeeeeeff 
-e6e6e600 e6e6e608 e6e6e610 e6e6e618 e6e6e620 e6e6e629 e6e6e631 e6e6e639 e6e6e641 e6e6e64a e6e6e652 e6e6e65a e6e6e662 e6e6e66a e6e6e673 e6e6e67b e6e6e683 e6e6e68b e6e6e694 e6e6e69c e6e6e6a4 e6e6e6ac e6e6e6b4 e6e6e6bd e6e6e6c5 e6e6e6cd e6e6e6d5 e6e6e6de e6e6e6e6 e6e6e6ee e6e6e6f6 e6e6e6ff 
-dedede00 dedede08 dedede10 dedede18 dedede20 dedede29 dedede31 dedede39 dedede41 dedede4a dedede52 dedede5a dedede62 dedede6a dedede73 dedede7b dedede83 dedede8b dedede94 dedede9c dededea4 dededeac dededeb4 dededebd dededec5 dededecd dededed5 dededede dededee6 dededeee dededef6 dededeff 
-d5d5d500 d5d5d508 d5d5d510 d5d5d518 d5d5d520 d5d5d529 d5d5d531 d5d5d539 d5d5d541 d5d5d54a d5d5d552 d5d5d55a d5d5d562 d5d5d56a d5d5d573 d5d5d57b d5d5d583 d5d5d58b d5d5d594 d5d5d59c d5d5d5a4 d5d5d5ac d5d5d5b4 d5d5d5bd d5d5d5c5 d5d5d5cd d5d5d5d5 d5d5d5de d5d5d5e6 d5d5d5ee d5d5d5f6 d5d5d5ff 
-cdcdcd00 cdcdcd08 cdcdcd10 cdcdcd18 cdcdcd20 cdcdcd29 cdcdcd31 cdcdcd39 cdcdcd41 cdcdcd4a cdcdcd52 cdcdcd5a cdcdcd62 cdcdcd6a cdcdcd73 cdcdcd7b cdcdcd83 cdcdcd8b cdcdcd94 cdcdcd9c cdcdcda4 cdcdcdac cdcdcdb4 cdcdcdbd cdcdcdc5 cdcdcdcd cdcdcdd5 cdcdcdde cdcdcde6 cdcdcdee cdcdcdf6 cdcdcdff 
-c5c5c500 c5c5c508 c5c5c510 c5c5c518 c5c5c520 c5c5c529 c5c5c531 c5c5c539 c5c5c541 c5c5c54a c5c5c552 c5c5c55a c5c5c562 c5c5c56a c5c5c573 c5c5c57b c5c5c583 c5c5c58b c5c5c594 c5c5c59c c5c5c5a4 c5c5c5ac c5c5c5b4 c5c5c5bd c5c5c5c5 c5c5c5cd c5c5c5d5 c5c5c5de c5c5c5e6 c5c5c5ee c5c5c5f6 c5c5c5ff 
-bdbdbd00 bdbdbd08 bdbdbd10 bdbdbd18 bdbdbd20 bdbdbd29 bdbdbd31 bdbdbd39 bdbdbd41 bdbdbd4a bdbdbd52 bdbdbd5a bdbdbd62 bdbdbd6a bdbdbd73 bdbdbd7b bdbdbd83 bdbdbd8b bdbdbd94 bdbdbd9c bdbdbda4 bdbdbdac bdbdbdb4 bdbdbdbd bdbdbdc5 bdbdbdcd bdbdbdd5 bdbdbdde bdbdbde6 bdbdbdee bdbdbdf6 bdbdbdff 
-b4b4b400 b4b4b408 b4b4b410 b4b4b418 b4b4b420 b4b4b429 b4b4b431 b4b4b439 b4b4b441 b4b4b44a b4b4b452 b4b4b45a b4b4b462 b4b4b46a b4b4b473 b4b4b47b b4b4b483 b4b4b48b b4b4b494 b4b4b49c b4b4b4a4 b4b4b4ac b4b4b4b4 b4b4b4bd b4b4b4c5 b4b4b4cd b4b4b4d5 b4b4b4de b4b4b4e6 b4b4b4ee b4b4b4f6 b4b4b4ff 
-acacac00 acacac08 acacac10 acacac18 acacac20 acacac29 acacac31 acacac39 acacac41 acacac4a acacac52 acacac5a acacac62 acacac6a acacac73 acacac7b acacac83 acacac8b acacac94 acacac9c acacaca4 acacacac acacacb4 acacacbd acacacc5 acacaccd acacacd5 acacacde acacace6 acacacee acacacf6 acacacff 
-a4a4a400 a4a4a408 a4a4a410 a4a4a418 a4a4a420 a4a4a429 a4a4a431 a4a4a439 a4a4a441 a4a4a44a a4a4a452 a4a4a45a a4a4a462 a4a4a46a a4a4a473 a4a4a47b a4a4a483 a4a4a48b a4a4a494 a4a4a49c a4a4a4a4 a4a4a4ac a4a4a4b4 a4a4a4bd a4a4a4c5 a4a4a4cd a4a4a4d5 a4a4a4de a4a4a4e6 a4a4a4ee a4a4a4f6 a4a4a4ff 
-9c9c9c00 9c9c9c08 9c9c9c10 9c9c9c18 9c9c9c20 9c9c9c29 9c9c9c31 9c9c9c39 9c9c9c41 9c9c9c4a 9c9c9c52 9c9c9c5a 9c9c9c62 9c9c9c6a 9c9c9c73 9c9c9c7b 9c9c9c83 9c9c9c8b 9c9c9c94 9c9c9c9c 9c9c9ca4 9c9c9cac 9c9c9cb4 9c9c9cbd 9c9c9cc5 9c9c9ccd 9c9c9cd5 9c9c9cde 9c9c9ce6 9c9c9cee 9c9c9cf6 9c9c9cff 
-94949400 94949408 94949410 94949418 94949420 94949429 94949431 94949439 94949441 9494944a 94949452 9494945a 94949462 9494946a 94949473 9494947b 94949483 9494948b 94949494 9494949c 949494a4 949494ac 949494b4 949494bd 949494c5 949494cd 949494d5 949494de 949494e6 949494ee 949494f6 949494ff 
-8b8b8b00 8b8b8b08 8b8b8b10 8b8b8b18 8b8b8b20 8b8b8b29 8b8b8b31 8b8b8b39 8b8b8b41 8b8b8b4a 8b8b8b52 8b8b8b5a 8b8b8b62 8b8b8b6a 8b8b8b73 8b8b8b7b 8b8b8b83 8b8b8b8b 8b8b8b94 8b8b8b9c 8b8b8ba4 8b8b8bac 8b8b8bb4 8b8b8bbd 8b8b8bc5 8b8b8bcd 8b8b8bd5 8b8b8bde 8b8b8be6 8b8b8bee 8b8b8bf6 8b8b8bff 
-83838300 83838308 83838310 83838318 83838320 83838329 83838331 83838339 83838341 8383834a 83838352 8383835a 83838362 8383836a 83838373 8383837b 83838383 8383838b 83838394 8383839c 838383a4 838383ac 838383b4 838383bd 838383c5 838383cd 838383d5 838383de 838383e6 838383ee 838383f6 838383ff 
-7b7b7b00 7b7b7b08 7b7b7b10 7b7b7b18 7b7b7b20 7b7b7b29 7b7b7b31 7b7b7b39 7b7b7b41 7b7b7b4a 7b7b7b52 7b7b7b5a 7b7b7b62 7b7b7b6a 7b7b7b73 7b7b7b7b 7b7b7b83 7b7b7b8b 7b7b7b94 7b7b7b9c 7b7b7ba4 7b7b7bac 7b7b7bb4 7b7b7bbd 7b7b7bc5 7b7b7bcd 7b7b7bd5 7b7b7bde 7b7b7be6 7b7b7bee 7b7b7bf6 7b7b7bff 
-73737300 73737308 73737310 73737318 73737320 73737329 73737331 73737339 73737341 7373734a 73737352 7373735a 73737362 7373736a 73737373 7373737b 73737383 7373738b 73737394 7373739c 737373a4 737373ac 737373b4 737373bd 737373c5 737373cd 737373d5 737373de 737373e6 737373ee 737373f6 737373ff 
-6a6a6a00 6a6a6a08 6a6a6a10 6a6a6a18 6a6a6a20 6a6a6a29 6a6a6a31 6a6a6a39 6a6a6a41 6a6a6a4a 6a6a6a52 6a6a6a5a 6a6a6a62 6a6a6a6a 6a6a6a73 6a6a6a7b 6a6a6a83 6a6a6a8b 6a6a6a94 6a6a6a9c 6a6a6aa4 6a6a6aac 6a6a6ab4 6a6a6abd 6a6a6ac5 6a6a6acd 6a6a6ad5 6a6a6ade 6a6a6ae6 6a6a6aee 6a6a6af6 6a6a6aff 
-62626200 62626208 62626210 62626218 62626220 62626229 62626231 62626239 62626241 6262624a 62626252 6262625a 62626262 6262626a 62626273 6262627b 62626283 6262628b 62626294 6262629c 626262a4 626262ac 626262b4 626262bd 626262c5 626262cd 626262d5 626262de 626262e6 626262ee 626262f6 626262ff 
-5a5a5a00 5a5a5a08 5a5a5a10 5a5a5a18 5a5a5a20 5a5a5a29 5a5a5a31 5a5a5a39 5a5a5a41 5a5a5a4a 5a5a5a52 5a5a5a5a 5a5a5a62 5a5a5a6a 5a5a5a73 5a5a5a7b 5a5a5a83 5a5a5a8b 5a5a5a94 5a5a5a9c 5a5a5aa4 5a5a5aac 5a5a5ab4 5a5a5abd 5a5a5ac5 5a5a5acd 5a5a5ad5 5a5a5ade 5a5a5ae6 5a5a5aee 5a5a5af6 5a5a5aff 
-52525200 52525208 52525210 52525218 52525220 52525229 52525231 52525239 52525241 5252524a 52525252 5252525a 52525262 5252526a 52525273 5252527b 52525283 5252528b 52525294 5252529c 525252a4 525252ac 525252b4 525252bd 525252c5 525252cd 525252d5 525252de 525252e6 525252ee 525252f6 525252ff 
-4a4a4a00 4a4a4a08 4a4a4a10 4a4a4a18 4a4a4a20 4a4a4a29 4a4a4a31 4a4a4a39 4a4a4a41 4a4a4a4a 4a4a4a52 4a4a4a5a 4a4a4a62 4a4a4a6a 4a4a4a73 4a4a4a7b 4a4a4a83 4a4a4a8b 4a4a4a94 4a4a4a9c 4a4a4aa4 4a4a4aac 4a4a4ab4 4a4a4abd 4a4a4ac5 4a4a4acd 4a4a4ad5 4a4a4ade 4a4a4ae6 4a4a4aee 4a4a4af6 4a4a4aff 
-41414100 41414108 41414110 41414118 41414120 41414129 41414131 41414139 41414141 4141414a 41414152 4141415a 41414162 4141416a 41414173 4141417b 41414183 4141418b 41414194 4141419c 414141a4 414141ac 414141b4 414141bd 414141c5 414141cd 414141d5 414141de 414141e6 414141ee 414141f6 414141ff 
-39393900 39393908 39393910 39393918 39393920 39393929 39393931 39393939 39393941 3939394a 39393952 3939395a 39393962 3939396a 39393973 3939397b 39393983 3939398b 39393994 3939399c 393939a4 393939ac 393939b4 393939bd 393939c5 393939cd 393939d5 393939de 393939e6 393939ee 393939f6 393939ff 
-31313100 31313108 31313110 31313118 31313120 31313129 31313131 31313139 31313141 3131314a 31313152 3131315a 31313162 3131316a 31313173 3131317b 31313183 3131318b 31313194 3131319c 313131a4 313131ac 313131b4 313131bd 313131c5 313131cd 313131d5 313131de 313131e6 313131ee 313131f6 313131ff 
-29292900 29292908 29292910 29292918 29292920 29292929 29292931 29292939 29292941 2929294a 29292952 2929295a 29292962 2929296a 29292973 2929297b 29292983 2929298b 29292994 2929299c 292929a4 292929ac 292929b4 292929bd 292929c5 292929cd 292929d5 292929de 292929e6 292929ee 292929f6 292929ff 
-20202000 20202008 20202010 20202018 20202020 20202029 20202031 20202039 20202041 2020204a 20202052 2020205a 20202062 2020206a 20202073 2020207b 20202083 2020208b 20202094 2020209c 202020a4 202020ac 202020b4 202020bd 202020c5 202020cd 202020d5 202020de 202020e6 202020ee 202020f6 202020ff 
-18181800 18181808 18181810 18181818 18181820 18181829 18181831 18181839 18181841 1818184a 18181852 1818185a 18181862 1818186a 18181873 1818187b 18181883 1818188b 18181894 1818189c 181818a4 181818ac 181818b4 181818bd 181818c5 181818cd 181818d5 181818de 181818e6 181818ee 181818f6 181818ff 
-10101000 10101008 10101010 10101018 10101020 10101029 10101031 10101039 10101041 1010104a 10101052 1010105a 10101062 1010106a 10101073 1010107b 10101083 1010108b 10101094 1010109c 101010a4 101010ac 101010b4 101010bd 101010c5 101010cd 101010d5 101010de 101010e6 101010ee 101010f6 101010ff 
-08080800 08080808 08080810 08080818 08080820 08080829 08080831 08080839 08080841 0808084a 08080852 0808085a 08080862 0808086a 08080873 0808087b 08080883 0808088b 08080894 0808089c 080808a4 080808ac 080808b4 080808bd 080808c5 080808cd 080808d5 080808de 080808e6 080808ee 080808f6 080808ff 
-00000000 00000008 00000010 00000018 00000020 00000029 00000031 00000039 00000041 0000004a 00000052 0000005a 00000062 0000006a 00000073 0000007b 00000083 0000008b 00000094 0000009c 000000a4 000000ac 000000b4 000000bd 000000c5 000000cd 000000d5 000000de 000000e6 000000ee 000000f6 000000ff 
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn4a16.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn4a16.png
deleted file mode 100644
index 6dbee9f..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn4a16.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn4a16.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn4a16.sng
deleted file mode 100644
index d3b9b47..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn4a16.sng
+++ /dev/null
@@ -1,41 +0,0 @@
-#SNG: from basn4a16.png
-IHDR {
-    width: 32; height: 32; bitdepth: 16;
-    using grayscale alpha;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-00000000 10840000 21080000 318c0000 42100000 52940000 63180000 739c0000 84200000 94a40000 a5280000 b5ac0000 c6300000 d6b40000 e7380000 f7bc0000 f7bc0000 e7380000 d6b40000 c6300000 b5ac0000 a5280000 94a40000 84200000 739c0000 63180000 52940000 42100000 318c0000 21080000 10840000 00000000 
-10840000 00001085 11a71085 234f1085 34f61085 469e1085 58461085 69ed1085 7b951085 8d3d1085 9ee41085 b08c1085 c2341085 d3db1085 e5831085 f72b1085 f72b1085 e5831085 d3db1085 c2341085 b08c1085 9ee41085 8d3d1085 7b951085 69ed1085 58461085 469e1085 34f61085 234f1085 11a71085 00001085 10840000 
-21080000 11a71085 00002109 12f62109 25ec2109 38e32109 4bd92109 5ed02109 71c62109 84bd2109 97b32109 aaa92109 bda02109 d0962109 e38d2109 f6832109 f6832109 e38d2109 d0962109 bda02109 aaa92109 97b32109 84bd2109 71c62109 5ed02109 4bd92109 38e32109 25ec2109 12f62109 00002109 11a71085 21080000 
-318c0000 234f1085 12f62109 0000318d 147a318d 28f5318d 3d70318d 51eb318d 6665318d 7ae0318d 8f5b318d a3d6318d b851318d cccb318d e146318d f5c1318d f5c1318d e146318d cccb318d b851318d a3d6318d 8f5b318d 7ae0318d 6665318d 51eb318d 3d70318d 28f5318d 147a318d 0000318d 12f62109 234f1085 318c0000 
-42100000 34f61085 25ec2109 147a318d 00004211 16424211 2c854211 42c84211 590a4211 6f4d4211 85904211 9bd24211 b2154211 c8584211 de9a4211 f4dd4211 f4dd4211 de9a4211 c8584211 b2154211 9bd24211 85904211 6f4d4211 590a4211 42c84211 2c854211 16424211 00004211 147a318d 25ec2109 34f61085 42100000 
-52940000 469e1085 38e32109 28f5318d 16424211 00005295 18615295 30c25295 49245295 61855295 79e75295 92485295 aaa95295 c30b5295 db6c5295 f3ce5295 f3ce5295 db6c5295 c30b5295 aaa95295 92485295 79e75295 61855295 49245295 30c25295 18615295 00005295 16424211 28f5318d 38e32109 469e1085 52940000 
-63180000 58461085 4bd92109 3d70318d 2c854211 18615295 00006319 1af26319 35e46319 50d76319 6bc96319 86bc6319 a1ae6319 bca06319 d7936319 f2856319 f2856319 d7936319 bca06319 a1ae6319 86bc6319 6bc96319 50d76319 35e46319 1af26319 00006319 18615295 2c854211 3d70318d 4bd92109 58461085 63180000 
-739c0000 69ed1085 5ed02109 51eb318d 42c84211 30c25295 1af26319 0000739d 1e1d739d 3c3b739d 5a59739d 7877739d 9695739d b4b3739d d2d1739d f0ef739d f0ef739d d2d1739d b4b3739d 9695739d 7877739d 5a59739d 3c3b739d 1e1d739d 0000739d 1af26319 30c25295 42c84211 51eb318d 5ed02109 69ed1085 739c0000 
-84200000 7b951085 71c62109 6665318d 590a4211 49245295 35e46319 1e1d739d 00008421 22218421 44438421 66658421 88878421 aaa98421 cccb8421 eeed8421 eeed8421 cccb8421 aaa98421 88878421 66658421 44438421 22218421 00008421 1e1d739d 35e46319 49245295 590a4211 6665318d 71c62109 7b951085 84200000 
-94a40000 8d3d1085 84bd2109 7ae0318d 6f4d4211 61855295 50d76319 3c3b739d 22218421 000094a5 276294a5 4ec494a5 762694a5 9d8994a5 c4eb94a5 ec4d94a5 ec4d94a5 c4eb94a5 9d8994a5 762694a5 4ec494a5 276294a5 000094a5 22218421 3c3b739d 50d76319 61855295 6f4d4211 7ae0318d 84bd2109 8d3d1085 94a40000 
-a5280000 9ee41085 97b32109 8f5b318d 85904211 79e75295 6bc96319 5a59739d 44438421 276294a5 0000a529 2e8ba529 5d16a529 8ba2a529 ba2da529 e8b9a529 e8b9a529 ba2da529 8ba2a529 5d16a529 2e8ba529 0000a529 276294a5 44438421 5a59739d 6bc96319 79e75295 85904211 8f5b318d 97b32109 9ee41085 a5280000 
-b5ac0000 b08c1085 aaa92109 a3d6318d 9bd24211 92485295 86bc6319 7877739d 66658421 4ec494a5 2e8ba529 0000b5ad 38e3b5ad 71c6b5ad aaa9b5ad e38db5ad e38db5ad aaa9b5ad 71c6b5ad 38e3b5ad 0000b5ad 2e8ba529 4ec494a5 66658421 7877739d 86bc6319 92485295 9bd24211 a3d6318d aaa92109 b08c1085 b5ac0000 
-c6300000 c2341085 bda02109 b851318d b2154211 aaa95295 a1ae6319 9695739d 88878421 762694a5 5d16a529 38e3b5ad 0000c631 4924c631 9248c631 db6cc631 db6cc631 9248c631 4924c631 0000c631 38e3b5ad 5d16a529 762694a5 88878421 9695739d a1ae6319 aaa95295 b2154211 b851318d bda02109 c2341085 c6300000 
-d6b40000 d3db1085 d0962109 cccb318d c8584211 c30b5295 bca06319 b4b3739d aaa98421 9d8994a5 8ba2a529 71c6b5ad 4924c631 0000d6b5 6665d6b5 cccbd6b5 cccbd6b5 6665d6b5 0000d6b5 4924c631 71c6b5ad 8ba2a529 9d8994a5 aaa98421 b4b3739d bca06319 c30b5295 c8584211 cccb318d d0962109 d3db1085 d6b40000 
-e7380000 e5831085 e38d2109 e146318d de9a4211 db6c5295 d7936319 d2d1739d cccb8421 c4eb94a5 ba2da529 aaa9b5ad 9248c631 6665d6b5 0000e739 aaa9e739 aaa9e739 0000e739 6665d6b5 9248c631 aaa9b5ad ba2da529 c4eb94a5 cccb8421 d2d1739d d7936319 db6c5295 de9a4211 e146318d e38d2109 e5831085 e7380000 
-f7bc0000 f72b1085 f6832109 f5c1318d f4dd4211 f3ce5295 f2856319 f0ef739d eeed8421 ec4d94a5 e8b9a529 e38db5ad db6cc631 cccbd6b5 aaa9e739 0000f7bd 0000f7bd aaa9e739 cccbd6b5 db6cc631 e38db5ad e8b9a529 ec4d94a5 eeed8421 f0ef739d f2856319 f3ce5295 f4dd4211 f5c1318d f6832109 f72b1085 f7bc0000 
-f7bc0000 f72b1085 f6832109 f5c1318d f4dd4211 f3ce5295 f2856319 f0ef739d eeed8421 ec4d94a5 e8b9a529 e38db5ad db6cc631 cccbd6b5 aaa9e739 0000f7bd 0000f7bd aaa9e739 cccbd6b5 db6cc631 e38db5ad e8b9a529 ec4d94a5 eeed8421 f0ef739d f2856319 f3ce5295 f4dd4211 f5c1318d f6832109 f72b1085 f7bc0000 
-e7380000 e5831085 e38d2109 e146318d de9a4211 db6c5295 d7936319 d2d1739d cccb8421 c4eb94a5 ba2da529 aaa9b5ad 9248c631 6665d6b5 0000e739 aaa9e739 aaa9e739 0000e739 6665d6b5 9248c631 aaa9b5ad ba2da529 c4eb94a5 cccb8421 d2d1739d d7936319 db6c5295 de9a4211 e146318d e38d2109 e5831085 e7380000 
-d6b40000 d3db1085 d0962109 cccb318d c8584211 c30b5295 bca06319 b4b3739d aaa98421 9d8994a5 8ba2a529 71c6b5ad 4924c631 0000d6b5 6665d6b5 cccbd6b5 cccbd6b5 6665d6b5 0000d6b5 4924c631 71c6b5ad 8ba2a529 9d8994a5 aaa98421 b4b3739d bca06319 c30b5295 c8584211 cccb318d d0962109 d3db1085 d6b40000 
-c6300000 c2341085 bda02109 b851318d b2154211 aaa95295 a1ae6319 9695739d 88878421 762694a5 5d16a529 38e3b5ad 0000c631 4924c631 9248c631 db6cc631 db6cc631 9248c631 4924c631 0000c631 38e3b5ad 5d16a529 762694a5 88878421 9695739d a1ae6319 aaa95295 b2154211 b851318d bda02109 c2341085 c6300000 
-b5ac0000 b08c1085 aaa92109 a3d6318d 9bd24211 92485295 86bc6319 7877739d 66658421 4ec494a5 2e8ba529 0000b5ad 38e3b5ad 71c6b5ad aaa9b5ad e38db5ad e38db5ad aaa9b5ad 71c6b5ad 38e3b5ad 0000b5ad 2e8ba529 4ec494a5 66658421 7877739d 86bc6319 92485295 9bd24211 a3d6318d aaa92109 b08c1085 b5ac0000 
-a5280000 9ee41085 97b32109 8f5b318d 85904211 79e75295 6bc96319 5a59739d 44438421 276294a5 0000a529 2e8ba529 5d16a529 8ba2a529 ba2da529 e8b9a529 e8b9a529 ba2da529 8ba2a529 5d16a529 2e8ba529 0000a529 276294a5 44438421 5a59739d 6bc96319 79e75295 85904211 8f5b318d 97b32109 9ee41085 a5280000 
-94a40000 8d3d1085 84bd2109 7ae0318d 6f4d4211 61855295 50d76319 3c3b739d 22218421 000094a5 276294a5 4ec494a5 762694a5 9d8994a5 c4eb94a5 ec4d94a5 ec4d94a5 c4eb94a5 9d8994a5 762694a5 4ec494a5 276294a5 000094a5 22218421 3c3b739d 50d76319 61855295 6f4d4211 7ae0318d 84bd2109 8d3d1085 94a40000 
-84200000 7b951085 71c62109 6665318d 590a4211 49245295 35e46319 1e1d739d 00008421 22218421 44438421 66658421 88878421 aaa98421 cccb8421 eeed8421 eeed8421 cccb8421 aaa98421 88878421 66658421 44438421 22218421 00008421 1e1d739d 35e46319 49245295 590a4211 6665318d 71c62109 7b951085 84200000 
-739c0000 69ed1085 5ed02109 51eb318d 42c84211 30c25295 1af26319 0000739d 1e1d739d 3c3b739d 5a59739d 7877739d 9695739d b4b3739d d2d1739d f0ef739d f0ef739d d2d1739d b4b3739d 9695739d 7877739d 5a59739d 3c3b739d 1e1d739d 0000739d 1af26319 30c25295 42c84211 51eb318d 5ed02109 69ed1085 739c0000 
-63180000 58461085 4bd92109 3d70318d 2c854211 18615295 00006319 1af26319 35e46319 50d76319 6bc96319 86bc6319 a1ae6319 bca06319 d7936319 f2856319 f2856319 d7936319 bca06319 a1ae6319 86bc6319 6bc96319 50d76319 35e46319 1af26319 00006319 18615295 2c854211 3d70318d 4bd92109 58461085 63180000 
-52940000 469e1085 38e32109 28f5318d 16424211 00005295 18615295 30c25295 49245295 61855295 79e75295 92485295 aaa95295 c30b5295 db6c5295 f3ce5295 f3ce5295 db6c5295 c30b5295 aaa95295 92485295 79e75295 61855295 49245295 30c25295 18615295 00005295 16424211 28f5318d 38e32109 469e1085 52940000 
-42100000 34f61085 25ec2109 147a318d 00004211 16424211 2c854211 42c84211 590a4211 6f4d4211 85904211 9bd24211 b2154211 c8584211 de9a4211 f4dd4211 f4dd4211 de9a4211 c8584211 b2154211 9bd24211 85904211 6f4d4211 590a4211 42c84211 2c854211 16424211 00004211 147a318d 25ec2109 34f61085 42100000 
-318c0000 234f1085 12f62109 0000318d 147a318d 28f5318d 3d70318d 51eb318d 6665318d 7ae0318d 8f5b318d a3d6318d b851318d cccb318d e146318d f5c1318d f5c1318d e146318d cccb318d b851318d a3d6318d 8f5b318d 7ae0318d 6665318d 51eb318d 3d70318d 28f5318d 147a318d 0000318d 12f62109 234f1085 318c0000 
-21080000 11a71085 00002109 12f62109 25ec2109 38e32109 4bd92109 5ed02109 71c62109 84bd2109 97b32109 aaa92109 bda02109 d0962109 e38d2109 f6832109 f6832109 e38d2109 d0962109 bda02109 aaa92109 97b32109 84bd2109 71c62109 5ed02109 4bd92109 38e32109 25ec2109 12f62109 00002109 11a71085 21080000 
-10840000 00001085 11a71085 234f1085 34f61085 469e1085 58461085 69ed1085 7b951085 8d3d1085 9ee41085 b08c1085 c2341085 d3db1085 e5831085 f72b1085 f72b1085 e5831085 d3db1085 c2341085 b08c1085 9ee41085 8d3d1085 7b951085 69ed1085 58461085 469e1085 34f61085 234f1085 11a71085 00001085 10840000 
-00000000 10840000 21080000 318c0000 42100000 52940000 63180000 739c0000 84200000 94a40000 a5280000 b5ac0000 c6300000 d6b40000 e7380000 f7bc0000 f7bc0000 e7380000 d6b40000 c6300000 b5ac0000 a5280000 94a40000 84200000 739c0000 63180000 52940000 42100000 318c0000 21080000 10840000 00000000 
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn6a08.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn6a08.png
deleted file mode 100644
index 6106230..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn6a08.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn6a08.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn6a08.sng
deleted file mode 100644
index c1e0bf4..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn6a08.sng
+++ /dev/null
@@ -1,41 +0,0 @@
-#SNG: from basn6a08.png
-IHDR {
-    width: 32; height: 32; bitdepth: 8;
-    using color alpha;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-ff000800 ff000808 ff000810 ff000818 ff000820 ff000829 ff000831 ff000839 ff000841 ff00084a ff000852 ff00085a ff000862 ff00086a ff000873 ff00087b ff000883 ff00088b ff000894 ff00089c ff0008a4 ff0008ac ff0008b4 ff0008bd ff0008c5 ff0008cd ff0008d5 ff0008de ff0008e6 ff0008ee ff0008f6 ff0008ff 
-ff1f0800 ff1f0808 ff1f0810 ff1f0818 ff1f0820 ff1f0829 ff1f0831 ff1f0839 ff1f0841 ff1f084a ff1f0852 ff1f085a ff1f0862 ff1f086a ff1f0873 ff1f087b ff1f0883 ff1f088b ff1f0894 ff1f089c ff1f08a4 ff1f08ac ff1f08b4 ff1f08bd ff1f08c5 ff1f08cd ff1f08d5 ff1f08de ff1f08e6 ff1f08ee ff1f08f6 ff1f08ff 
-ff3f0800 ff3f0808 ff3f0810 ff3f0818 ff3f0820 ff3f0829 ff3f0831 ff3f0839 ff3f0841 ff3f084a ff3f0852 ff3f085a ff3f0862 ff3f086a ff3f0873 ff3f087b ff3f0883 ff3f088b ff3f0894 ff3f089c ff3f08a4 ff3f08ac ff3f08b4 ff3f08bd ff3f08c5 ff3f08cd ff3f08d5 ff3f08de ff3f08e6 ff3f08ee ff3f08f6 ff3f08ff 
-ff5f0800 ff5f0808 ff5f0810 ff5f0818 ff5f0820 ff5f0829 ff5f0831 ff5f0839 ff5f0841 ff5f084a ff5f0852 ff5f085a ff5f0862 ff5f086a ff5f0873 ff5f087b ff5f0883 ff5f088b ff5f0894 ff5f089c ff5f08a4 ff5f08ac ff5f08b4 ff5f08bd ff5f08c5 ff5f08cd ff5f08d5 ff5f08de ff5f08e6 ff5f08ee ff5f08f6 ff5f08ff 
-ff7f0700 ff7f0708 ff7f0710 ff7f0718 ff7f0720 ff7f0729 ff7f0731 ff7f0739 ff7f0741 ff7f074a ff7f0752 ff7f075a ff7f0762 ff7f076a ff7f0773 ff7f077b ff7f0783 ff7f078b ff7f0794 ff7f079c ff7f07a4 ff7f07ac ff7f07b4 ff7f07bd ff7f07c5 ff7f07cd ff7f07d5 ff7f07de ff7f07e6 ff7f07ee ff7f07f6 ff7f07ff 
-ff9f0700 ff9f0708 ff9f0710 ff9f0718 ff9f0720 ff9f0729 ff9f0731 ff9f0739 ff9f0741 ff9f074a ff9f0752 ff9f075a ff9f0762 ff9f076a ff9f0773 ff9f077b ff9f0783 ff9f078b ff9f0794 ff9f079c ff9f07a4 ff9f07ac ff9f07b4 ff9f07bd ff9f07c5 ff9f07cd ff9f07d5 ff9f07de ff9f07e6 ff9f07ee ff9f07f6 ff9f07ff 
-ffbf0700 ffbf0708 ffbf0710 ffbf0718 ffbf0720 ffbf0729 ffbf0731 ffbf0739 ffbf0741 ffbf074a ffbf0752 ffbf075a ffbf0762 ffbf076a ffbf0773 ffbf077b ffbf0783 ffbf078b ffbf0794 ffbf079c ffbf07a4 ffbf07ac ffbf07b4 ffbf07bd ffbf07c5 ffbf07cd ffbf07d5 ffbf07de ffbf07e6 ffbf07ee ffbf07f6 ffbf07ff 
-ffdf0700 ffdf0708 ffdf0710 ffdf0718 ffdf0720 ffdf0729 ffdf0731 ffdf0739 ffdf0741 ffdf074a ffdf0752 ffdf075a ffdf0762 ffdf076a ffdf0773 ffdf077b ffdf0783 ffdf078b ffdf0794 ffdf079c ffdf07a4 ffdf07ac ffdf07b4 ffdf07bd ffdf07c5 ffdf07cd ffdf07d5 ffdf07de ffdf07e6 ffdf07ee ffdf07f6 ffdf07ff 
-ffff0600 ffff0608 ffff0610 ffff0618 ffff0620 ffff0629 ffff0631 ffff0639 ffff0641 ffff064a ffff0652 ffff065a ffff0662 ffff066a ffff0673 ffff067b ffff0683 ffff068b ffff0694 ffff069c ffff06a4 ffff06ac ffff06b4 ffff06bd ffff06c5 ffff06cd ffff06d5 ffff06de ffff06e6 ffff06ee ffff06f6 ffff06ff 
-e0ff0600 e0ff0608 e0ff0610 e0ff0618 e0ff0620 e0ff0629 e0ff0631 e0ff0639 e0ff0641 e0ff064a e0ff0652 e0ff065a e0ff0662 e0ff066a e0ff0673 e0ff067b e0ff0683 e0ff068b e0ff0694 e0ff069c e0ff06a4 e0ff06ac e0ff06b4 e0ff06bd e0ff06c5 e0ff06cd e0ff06d5 e0ff06de e0ff06e6 e0ff06ee e0ff06f6 e0ff06ff 
-c0ff0600 c0ff0608 c0ff0610 c0ff0618 c0ff0620 c0ff0629 c0ff0631 c0ff0639 c0ff0641 c0ff064a c0ff0652 c0ff065a c0ff0662 c0ff066a c0ff0673 c0ff067b c0ff0683 c0ff068b c0ff0694 c0ff069c c0ff06a4 c0ff06ac c0ff06b4 c0ff06bd c0ff06c5 c0ff06cd c0ff06d5 c0ff06de c0ff06e6 c0ff06ee c0ff06f6 c0ff06ff 
-a0ff0500 a0ff0508 a0ff0510 a0ff0518 a0ff0520 a0ff0529 a0ff0531 a0ff0539 a0ff0541 a0ff054a a0ff0552 a0ff055a a0ff0562 a0ff056a a0ff0573 a0ff057b a0ff0583 a0ff058b a0ff0594 a0ff059c a0ff05a4 a0ff05ac a0ff05b4 a0ff05bd a0ff05c5 a0ff05cd a0ff05d5 a0ff05de a0ff05e6 a0ff05ee a0ff05f6 a0ff05ff 
-80ff0500 80ff0508 80ff0510 80ff0518 80ff0520 80ff0529 80ff0531 80ff0539 80ff0541 80ff054a 80ff0552 80ff055a 80ff0562 80ff056a 80ff0573 80ff057b 80ff0583 80ff058b 80ff0594 80ff059c 80ff05a4 80ff05ac 80ff05b4 80ff05bd 80ff05c5 80ff05cd 80ff05d5 80ff05de 80ff05e6 80ff05ee 80ff05f6 80ff05ff 
-60ff0500 60ff0508 60ff0510 60ff0518 60ff0520 60ff0529 60ff0531 60ff0539 60ff0541 60ff054a 60ff0552 60ff055a 60ff0562 60ff056a 60ff0573 60ff057b 60ff0583 60ff058b 60ff0594 60ff059c 60ff05a4 60ff05ac 60ff05b4 60ff05bd 60ff05c5 60ff05cd 60ff05d5 60ff05de 60ff05e6 60ff05ee 60ff05f6 60ff05ff 
-40ff0500 40ff0508 40ff0510 40ff0518 40ff0520 40ff0529 40ff0531 40ff0539 40ff0541 40ff054a 40ff0552 40ff055a 40ff0562 40ff056a 40ff0573 40ff057b 40ff0583 40ff058b 40ff0594 40ff059c 40ff05a4 40ff05ac 40ff05b4 40ff05bd 40ff05c5 40ff05cd 40ff05d5 40ff05de 40ff05e6 40ff05ee 40ff05f6 40ff05ff 
-20ff0400 20ff0408 20ff0410 20ff0418 20ff0420 20ff0429 20ff0431 20ff0439 20ff0441 20ff044a 20ff0452 20ff045a 20ff0462 20ff046a 20ff0473 20ff047b 20ff0483 20ff048b 20ff0494 20ff049c 20ff04a4 20ff04ac 20ff04b4 20ff04bd 20ff04c5 20ff04cd 20ff04d5 20ff04de 20ff04e6 20ff04ee 20ff04f6 20ff04ff 
-04ff0000 04ff0008 04ff0010 04ff0018 04ff0020 04ff0029 04ff0031 04ff0039 04ff0041 04ff004a 04ff0052 04ff005a 04ff0062 04ff006a 04ff0073 04ff007b 04ff0083 04ff008b 04ff0094 04ff009c 04ff00a4 04ff00ac 04ff00b4 04ff00bd 04ff00c5 04ff00cd 04ff00d5 04ff00de 04ff00e6 04ff00ee 04ff00f6 04ff00ff 
-04ff1f00 04ff1f08 04ff1f10 04ff1f18 04ff1f20 04ff1f29 04ff1f31 04ff1f39 04ff1f41 04ff1f4a 04ff1f52 04ff1f5a 04ff1f62 04ff1f6a 04ff1f73 04ff1f7b 04ff1f83 04ff1f8b 04ff1f94 04ff1f9c 04ff1fa4 04ff1fac 04ff1fb4 04ff1fbd 04ff1fc5 04ff1fcd 04ff1fd5 04ff1fde 04ff1fe6 04ff1fee 04ff1ff6 04ff1fff 
-03ff3f00 03ff3f08 03ff3f10 03ff3f18 03ff3f20 03ff3f29 03ff3f31 03ff3f39 03ff3f41 03ff3f4a 03ff3f52 03ff3f5a 03ff3f62 03ff3f6a 03ff3f73 03ff3f7b 03ff3f83 03ff3f8b 03ff3f94 03ff3f9c 03ff3fa4 03ff3fac 03ff3fb4 03ff3fbd 03ff3fc5 03ff3fcd 03ff3fd5 03ff3fde 03ff3fe6 03ff3fee 03ff3ff6 03ff3fff 
-03ff5f00 03ff5f08 03ff5f10 03ff5f18 03ff5f20 03ff5f29 03ff5f31 03ff5f39 03ff5f41 03ff5f4a 03ff5f52 03ff5f5a 03ff5f62 03ff5f6a 03ff5f73 03ff5f7b 03ff5f83 03ff5f8b 03ff5f94 03ff5f9c 03ff5fa4 03ff5fac 03ff5fb4 03ff5fbd 03ff5fc5 03ff5fcd 03ff5fd5 03ff5fde 03ff5fe6 03ff5fee 03ff5ff6 03ff5fff 
-03ff7f00 03ff7f08 03ff7f10 03ff7f18 03ff7f20 03ff7f29 03ff7f31 03ff7f39 03ff7f41 03ff7f4a 03ff7f52 03ff7f5a 03ff7f62 03ff7f6a 03ff7f73 03ff7f7b 03ff7f83 03ff7f8b 03ff7f94 03ff7f9c 03ff7fa4 03ff7fac 03ff7fb4 03ff7fbd 03ff7fc5 03ff7fcd 03ff7fd5 03ff7fde 03ff7fe6 03ff7fee 03ff7ff6 03ff7fff 
-03ff9f00 03ff9f08 03ff9f10 03ff9f18 03ff9f20 03ff9f29 03ff9f31 03ff9f39 03ff9f41 03ff9f4a 03ff9f52 03ff9f5a 03ff9f62 03ff9f6a 03ff9f73 03ff9f7b 03ff9f83 03ff9f8b 03ff9f94 03ff9f9c 03ff9fa4 03ff9fac 03ff9fb4 03ff9fbd 03ff9fc5 03ff9fcd 03ff9fd5 03ff9fde 03ff9fe6 03ff9fee 03ff9ff6 03ff9fff 
-02ffbf00 02ffbf08 02ffbf10 02ffbf18 02ffbf20 02ffbf29 02ffbf31 02ffbf39 02ffbf41 02ffbf4a 02ffbf52 02ffbf5a 02ffbf62 02ffbf6a 02ffbf73 02ffbf7b 02ffbf83 02ffbf8b 02ffbf94 02ffbf9c 02ffbfa4 02ffbfac 02ffbfb4 02ffbfbd 02ffbfc5 02ffbfcd 02ffbfd5 02ffbfde 02ffbfe6 02ffbfee 02ffbff6 02ffbfff 
-02ffdf00 02ffdf08 02ffdf10 02ffdf18 02ffdf20 02ffdf29 02ffdf31 02ffdf39 02ffdf41 02ffdf4a 02ffdf52 02ffdf5a 02ffdf62 02ffdf6a 02ffdf73 02ffdf7b 02ffdf83 02ffdf8b 02ffdf94 02ffdf9c 02ffdfa4 02ffdfac 02ffdfb4 02ffdfbd 02ffdfc5 02ffdfcd 02ffdfd5 02ffdfde 02ffdfe6 02ffdfee 02ffdff6 02ffdfff 
-02ffff00 02ffff08 02ffff10 02ffff18 02ffff20 02ffff29 02ffff31 02ffff39 02ffff41 02ffff4a 02ffff52 02ffff5a 02ffff62 02ffff6a 02ffff73 02ffff7b 02ffff83 02ffff8b 02ffff94 02ffff9c 02ffffa4 02ffffac 02ffffb4 02ffffbd 02ffffc5 02ffffcd 02ffffd5 02ffffde 02ffffe6 02ffffee 02fffff6 02ffffff 
-01e0ff00 01e0ff08 01e0ff10 01e0ff18 01e0ff20 01e0ff29 01e0ff31 01e0ff39 01e0ff41 01e0ff4a 01e0ff52 01e0ff5a 01e0ff62 01e0ff6a 01e0ff73 01e0ff7b 01e0ff83 01e0ff8b 01e0ff94 01e0ff9c 01e0ffa4 01e0ffac 01e0ffb4 01e0ffbd 01e0ffc5 01e0ffcd 01e0ffd5 01e0ffde 01e0ffe6 01e0ffee 01e0fff6 01e0ffff 
-01c0ff00 01c0ff08 01c0ff10 01c0ff18 01c0ff20 01c0ff29 01c0ff31 01c0ff39 01c0ff41 01c0ff4a 01c0ff52 01c0ff5a 01c0ff62 01c0ff6a 01c0ff73 01c0ff7b 01c0ff83 01c0ff8b 01c0ff94 01c0ff9c 01c0ffa4 01c0ffac 01c0ffb4 01c0ffbd 01c0ffc5 01c0ffcd 01c0ffd5 01c0ffde 01c0ffe6 01c0ffee 01c0fff6 01c0ffff 
-01a0ff00 01a0ff08 01a0ff10 01a0ff18 01a0ff20 01a0ff29 01a0ff31 01a0ff39 01a0ff41 01a0ff4a 01a0ff52 01a0ff5a 01a0ff62 01a0ff6a 01a0ff73 01a0ff7b 01a0ff83 01a0ff8b 01a0ff94 01a0ff9c 01a0ffa4 01a0ffac 01a0ffb4 01a0ffbd 01a0ffc5 01a0ffcd 01a0ffd5 01a0ffde 01a0ffe6 01a0ffee 01a0fff6 01a0ffff 
-0180ff00 0180ff08 0180ff10 0180ff18 0180ff20 0180ff29 0180ff31 0180ff39 0180ff41 0180ff4a 0180ff52 0180ff5a 0180ff62 0180ff6a 0180ff73 0180ff7b 0180ff83 0180ff8b 0180ff94 0180ff9c 0180ffa4 0180ffac 0180ffb4 0180ffbd 0180ffc5 0180ffcd 0180ffd5 0180ffde 0180ffe6 0180ffee 0180fff6 0180ffff 
-0060ff00 0060ff08 0060ff10 0060ff18 0060ff20 0060ff29 0060ff31 0060ff39 0060ff41 0060ff4a 0060ff52 0060ff5a 0060ff62 0060ff6a 0060ff73 0060ff7b 0060ff83 0060ff8b 0060ff94 0060ff9c 0060ffa4 0060ffac 0060ffb4 0060ffbd 0060ffc5 0060ffcd 0060ffd5 0060ffde 0060ffe6 0060ffee 0060fff6 0060ffff 
-0040ff00 0040ff08 0040ff10 0040ff18 0040ff20 0040ff29 0040ff31 0040ff39 0040ff41 0040ff4a 0040ff52 0040ff5a 0040ff62 0040ff6a 0040ff73 0040ff7b 0040ff83 0040ff8b 0040ff94 0040ff9c 0040ffa4 0040ffac 0040ffb4 0040ffbd 0040ffc5 0040ffcd 0040ffd5 0040ffde 0040ffe6 0040ffee 0040fff6 0040ffff 
-0020ff00 0020ff08 0020ff10 0020ff18 0020ff20 0020ff29 0020ff31 0020ff39 0020ff41 0020ff4a 0020ff52 0020ff5a 0020ff62 0020ff6a 0020ff73 0020ff7b 0020ff83 0020ff8b 0020ff94 0020ff9c 0020ffa4 0020ffac 0020ffb4 0020ffbd 0020ffc5 0020ffcd 0020ffd5 0020ffde 0020ffe6 0020ffee 0020fff6 0020ffff 
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn6a16.png b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn6a16.png
deleted file mode 100644
index a9bf3cb..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn6a16.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn6a16.sng b/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn6a16.sng
deleted file mode 100644
index 13c70a4..0000000
--- a/third_party/gofrontend/libgo/go/image/png/testdata/pngsuite/basn6a16.sng
+++ /dev/null
@@ -1,41 +0,0 @@
-#SNG: from basn6a16.png
-IHDR {
-    width: 32; height: 32; bitdepth: 16;
-    using color alpha;
-}
-gAMA {1.0000}
-IMAGE {
-    pixels hex
-ffffffff00000000 f7bcffff00000000 ef7affff00000000 e738ffff00000000 def6ffff00000000 d6b4ffff00000000 ce72ffff00000000 c630ffff00000000 bdeeffff00000000 b5acffff00000000 ad6affff00000000 a528ffff00000000 9ce6ffff00000000 94a4ffff00000000 8c62ffff00000000 8420ffff00000000 7bdeffff00000000 739cffff00000000 6b5affff00000000 6318ffff00000000 5ad6ffff00000000 5294ffff00000000 4a52ffff00000000 4210ffff00000000 39ceffff00000000 318cffff00000000 294affff00000000 2108ffff00000000 18c6ffff00000000 1084ffff00000000 0842ffff00000000 0000ffff00000000 
-fffff7bc00000000 ffffffff00001085 f72bffff00001085 ee57ffff00001085 e583ffff00001085 dcafffff00001085 d3dbffff00001085 cb08ffff00001085 c234ffff00001085 b960ffff00001085 b08cffff00001085 a7b8ffff00001085 9ee4ffff00001085 9611ffff00001085 8d3dffff00001085 8469ffff00001085 7b95ffff00001085 72c1ffff00001085 69edffff00001085 611affff00001085 5846ffff00001085 4f72ffff00001085 469effff00001085 3dcaffff00001085 34f6ffff00001085 2c23ffff00001085 234fffff00001085 1a7bffff00001085 11a7ffff00001085 08d3ffff00001085 0000ffff00001085 0000f7bc08420000 
-ffffef7a00000000 fffff72b00001085 ffffffff00002109 f683ffff00002109 ed08ffff00002109 e38dffff00002109 da12ffff00002109 d096ffff00002109 c71bffff00002109 bda0ffff00002109 b425ffff00002109 aaa9ffff00002109 a12effff00002109 97b3ffff00002109 8e38ffff00002109 84bdffff00002109 7b41ffff00002109 71c6ffff00002109 684bffff00002109 5ed0ffff00002109 5554ffff00002109 4bd9ffff00002109 425effff00002109 38e3ffff00002109 2f68ffff00002109 25ecffff00002109 1c71ffff00002109 12f6ffff00002109 097bffff00002109 0000ffff00002109 0000f72b08d31085 0000ef7a10840000 
-ffffe73800000000 ffffee5700001085 fffff68300002109 ffffffff0000318d f5c1ffff0000318d eb84ffff0000318d e146ffff0000318d d709ffff0000318d ccccffff0000318d c28effff0000318d b851ffff0000318d ae13ffff0000318d a3d6ffff0000318d 9998ffff0000318d 8f5bffff0000318d 851effff0000318d 7ae0ffff0000318d 70a3ffff0000318d 6665ffff0000318d 5c28ffff0000318d 51ebffff0000318d 47adffff0000318d 3d70ffff0000318d 3332ffff0000318d 28f5ffff0000318d 1eb8ffff0000318d 147affff0000318d 0a3dffff0000318d 0000ffff0000318d 0000f683097b2109 0000ee5711a71085 0000e73818c60000 
-ffffdef600000000 ffffe58300001085 ffffed0800002109 fffff5c10000318d ffffffff00004211 f4ddffff00004211 e9bcffff00004211 de9affff00004211 d379ffff00004211 c858ffff00004211 bd36ffff00004211 b215ffff00004211 a6f4ffff00004211 9bd2ffff00004211 90b1ffff00004211 8590ffff00004211 7a6effff00004211 6f4dffff00004211 642cffff00004211 590affff00004211 4de9ffff00004211 42c8ffff00004211 37a6ffff00004211 2c85ffff00004211 2164ffff00004211 1642ffff00004211 0b21ffff00004211 0000ffff00004211 0000f5c10a3d318d 0000ed0812f62109 0000e5831a7b1085 0000def621080000 
-ffffd6b400000000 ffffdcaf00001085 ffffe38d00002109 ffffeb840000318d fffff4dd00004211 ffffffff00005295 f3ceffff00005295 e79dffff00005295 db6cffff00005295 cf3cffff00005295 c30bffff00005295 b6daffff00005295 aaa9ffff00005295 9e79ffff00005295 9248ffff00005295 8617ffff00005295 79e7ffff00005295 6db6ffff00005295 6185ffff00005295 5554ffff00005295 4924ffff00005295 3cf3ffff00005295 30c2ffff00005295 2492ffff00005295 1861ffff00005295 0c30ffff00005295 0000ffff00005295 0000f4dd0b214211 0000eb84147a318d 0000e38d1c712109 0000dcaf234f1085 0000d6b4294a0000 
-ffffce7200000000 ffffd3db00001085 ffffda1200002109 ffffe1460000318d ffffe9bc00004211 fffff3ce00005295 ffffffff00006319 f285ffff00006319 e50cffff00006319 d793ffff00006319 ca1affff00006319 bca0ffff00006319 af27ffff00006319 a1aeffff00006319 9435ffff00006319 86bcffff00006319 7942ffff00006319 6bc9ffff00006319 5e50ffff00006319 50d7ffff00006319 435effff00006319 35e4ffff00006319 286bffff00006319 1af2ffff00006319 0d79ffff00006319 0000ffff00006319 0000f3ce0c305295 0000e9bc16424211 0000e1461eb8318d 0000da1225ec2109 0000d3db2c231085 0000ce72318c0000 
-ffffc63000000000 ffffcb0800001085 ffffd09600002109 ffffd7090000318d ffffde9a00004211 ffffe79d00005295 fffff28500006319 ffffffff0000739d f0f0ffff0000739d e1e1ffff0000739d d2d2ffff0000739d c3c3ffff0000739d b4b3ffff0000739d a5a4ffff0000739d 9695ffff0000739d 8786ffff0000739d 7877ffff0000739d 6968ffff0000739d 5a59ffff0000739d 4b4affff0000739d 3c3bffff0000739d 2d2cffff0000739d 1e1dffff0000739d 0f0effff0000739d 0000ffff0000739d 0000f2850d796319 0000e79d18615295 0000de9a21644211 0000d70928f5318d 0000d0962f682109 0000cb0834f61085 0000c63039ce0000 
-ffffbdee00000000 ffffc23400001085 ffffc71b00002109 ffffcccc0000318d ffffd37900004211 ffffdb6c00005295 ffffe50c00006319 fffff0f00000739d ffffffff00008421 eeeeffff00008421 ddddffff00008421 ccccffff00008421 bbbaffff00008421 aaa9ffff00008421 9998ffff00008421 8887ffff00008421 7776ffff00008421 6665ffff00008421 5554ffff00008421 4443ffff00008421 3332ffff00008421 2221ffff00008421 1110ffff00008421 0000ffff00008421 0000f0f00f0e739d 0000e50c1af26319 0000db6c24925295 0000d3792c854211 0000cccc3332318d 0000c71b38e32109 0000c2343dca1085 0000bdee42100000 
-ffffb5ac00000000 ffffb96000001085 ffffbda000002109 ffffc28e0000318d ffffc85800004211 ffffcf3c00005295 ffffd79300006319 ffffe1e10000739d ffffeeee00008421 ffffffff000094a5 ec4dffff000094a5 d89cffff000094a5 c4ebffff000094a5 b13affff000094a5 9d89ffff000094a5 89d8ffff000094a5 7626ffff000094a5 6275ffff000094a5 4ec4ffff000094a5 3b13ffff000094a5 2762ffff000094a5 13b1ffff000094a5 0000ffff000094a5 0000eeee11108421 0000e1e11e1d739d 0000d793286b6319 0000cf3c30c25295 0000c85837a64211 0000c28e3d70318d 0000bda0425e2109 0000b960469e1085 0000b5ac4a520000 
-ffffad6a00000000 ffffb08c00001085 ffffb42500002109 ffffb8510000318d ffffbd3600004211 ffffc30b00005295 ffffca1a00006319 ffffd2d20000739d ffffdddd00008421 ffffec4d000094a5 ffffffff0000a529 e8b9ffff0000a529 d173ffff0000a529 ba2dffff0000a529 a2e8ffff0000a529 8ba2ffff0000a529 745cffff0000a529 5d16ffff0000a529 45d1ffff0000a529 2e8bffff0000a529 1745ffff0000a529 0000ffff0000a529 0000ec4d13b194a5 0000dddd22218421 0000d2d22d2c739d 0000ca1a35e46319 0000c30b3cf35295 0000bd3642c84211 0000b85147ad318d 0000b4254bd92109 0000b08c4f721085 0000ad6a52940000 
-ffffa52800000000 ffffa7b800001085 ffffaaa900002109 ffffae130000318d ffffb21500004211 ffffb6da00005295 ffffbca000006319 ffffc3c30000739d ffffcccc00008421 ffffd89c000094a5 ffffe8b90000a529 ffffffff0000b5ad e38dffff0000b5ad c71bffff0000b5ad aaa9ffff0000b5ad 8e38ffff0000b5ad 71c6ffff0000b5ad 5554ffff0000b5ad 38e3ffff0000b5ad 1c71ffff0000b5ad 0000ffff0000b5ad 0000e8b91745a529 0000d89c276294a5 0000cccc33328421 0000c3c33c3b739d 0000bca0435e6319 0000b6da49245295 0000b2154de94211 0000ae1351eb318d 0000aaa955542109 0000a7b858461085 0000a5285ad60000 
-ffff9ce600000000 ffff9ee400001085 ffffa12e00002109 ffffa3d60000318d ffffa6f400004211 ffffaaa900005295 ffffaf2700006319 ffffb4b30000739d ffffbbba00008421 ffffc4eb000094a5 ffffd1730000a529 ffffe38d0000b5ad ffffffff0000c631 db6cffff0000c631 b6daffff0000c631 9248ffff0000c631 6db6ffff0000c631 4924ffff0000c631 2492ffff0000c631 0000ffff0000c631 0000e38d1c71b5ad 0000d1732e8ba529 0000c4eb3b1394a5 0000bbba44438421 0000b4b34b4a739d 0000af2750d76319 0000aaa955545295 0000a6f4590a4211 0000a3d65c28318d 0000a12e5ed02109 00009ee4611a1085 00009ce663180000 
-ffff94a400000000 ffff961100001085 ffff97b300002109 ffff99980000318d ffff9bd200004211 ffff9e7900005295 ffffa1ae00006319 ffffa5a40000739d ffffaaa900008421 ffffb13a000094a5 ffffba2d0000a529 ffffc71b0000b5ad ffffdb6c0000c631 ffffffff0000d6b5 ccccffff0000d6b5 9998ffff0000d6b5 6665ffff0000d6b5 3332ffff0000d6b5 0000ffff0000d6b5 0000db6c2492c631 0000c71b38e3b5ad 0000ba2d45d1a529 0000b13a4ec494a5 0000aaa955548421 0000a5a45a59739d 0000a1ae5e506319 00009e7961855295 00009bd2642c4211 000099986665318d 000097b3684b2109 0000961169ed1085 000094a46b5a0000 
-ffff8c6200000000 ffff8d3d00001085 ffff8e3800002109 ffff8f5b0000318d ffff90b100004211 ffff924800005295 ffff943500006319 ffff96950000739d ffff999800008421 ffff9d89000094a5 ffffa2e80000a529 ffffaaa90000b5ad ffffb6da0000c631 ffffcccc0000d6b5 ffffffff0000e739 aaa9ffff0000e739 5554ffff0000e739 0000ffff0000e739 0000cccc3332d6b5 0000b6da4924c631 0000aaa95554b5ad 0000a2e85d16a529 00009d89627594a5 0000999866658421 000096956968739d 000094356bc96319 000092486db65295 000090b16f4d4211 00008f5b70a3318d 00008e3871c62109 00008d3d72c11085 00008c62739c0000 
-ffff842000000000 ffff846900001085 ffff84bd00002109 ffff851e0000318d ffff859000004211 ffff861700005295 ffff86bc00006319 ffff87860000739d ffff888700008421 ffff89d8000094a5 ffff8ba20000a529 ffff8e380000b5ad ffff92480000c631 ffff99980000d6b5 ffffaaa90000e739 ffffffff0000f7bd 0000ffff0000f7bd 0000aaa95554e739 000099986665d6b5 000092486db6c631 00008e3871c6b5ad 00008ba2745ca529 000089d8762694a5 0000888777768421 000087867877739d 000086bc79426319 0000861779e75295 000085907a6e4211 0000851e7ae0318d 000084bd7b412109 000084697b951085 000084207bde0000 
-ffff7bde00000000 ffff7b9500001085 ffff7b4100002109 ffff7ae00000318d ffff7a6e00004211 ffff79e700005295 ffff794200006319 ffff78770000739d ffff777600008421 ffff7626000094a5 ffff745c0000a529 ffff71c60000b5ad ffff6db60000c631 ffff66650000d6b5 ffff55540000e739 ffff00000000f7bd 00000000fffff7bd 00005554aaa9e739 000066659998d6b5 00006db69248c631 000071c68e38b5ad 0000745c8ba2a529 0000762689d894a5 0000777688878421 000078778786739d 0000794286bc6319 000079e786175295 00007a6e85904211 00007ae0851e318d 00007b4184bd2109 00007b9584691085 00007bde84200000 
-ffff739c00000000 ffff72c100001085 ffff71c600002109 ffff70a30000318d ffff6f4d00004211 ffff6db600005295 ffff6bc900006319 ffff69680000739d ffff666500008421 ffff6275000094a5 ffff5d160000a529 ffff55540000b5ad ffff49240000c631 ffff33320000d6b5 ffff00000000e739 aaa900005554e739 55540000aaa9e739 00000000ffffe739 00003332ccccd6b5 00004924b6dac631 00005554aaa9b5ad 00005d16a2e8a529 000062759d8994a5 0000666599988421 000069689695739d 00006bc994356319 00006db692485295 00006f4d90b14211 000070a38f5b318d 000071c68e382109 000072c18d3d1085 0000739c8c620000 
-ffff6b5a00000000 ffff69ed00001085 ffff684b00002109 ffff66650000318d ffff642c00004211 ffff618500005295 ffff5e5000006319 ffff5a590000739d ffff555400008421 ffff4ec4000094a5 ffff45d10000a529 ffff38e30000b5ad ffff24920000c631 ffff00000000d6b5 cccc00003332d6b5 999800006665d6b5 666500009998d6b5 33320000ccccd6b5 00000000ffffd6b5 00002492db6cc631 000038e3c71bb5ad 000045d1ba2da529 00004ec4b13a94a5 00005554aaa98421 00005a59a5a4739d 00005e50a1ae6319 000061859e795295 0000642c9bd24211 000066659998318d 0000684b97b32109 000069ed96111085 00006b5a94a40000 
-ffff631800000000 ffff611a00001085 ffff5ed000002109 ffff5c280000318d ffff590a00004211 ffff555400005295 ffff50d700006319 ffff4b4a0000739d ffff444300008421 ffff3b13000094a5 ffff2e8b0000a529 ffff1c710000b5ad ffff00000000c631 db6c00002492c631 b6da00004924c631 924800006db6c631 6db600009248c631 49240000b6dac631 24920000db6cc631 00000000ffffc631 00001c71e38db5ad 00002e8bd173a529 00003b13c4eb94a5 00004443bbba8421 00004b4ab4b3739d 000050d7af276319 00005554aaa95295 0000590aa6f44211 00005c28a3d6318d 00005ed0a12e2109 0000611a9ee41085 000063189ce60000 
-ffff5ad600000000 ffff584600001085 ffff555400002109 ffff51eb0000318d ffff4de900004211 ffff492400005295 ffff435e00006319 ffff3c3b0000739d ffff333200008421 ffff2762000094a5 ffff17450000a529 ffff00000000b5ad e38d00001c71b5ad c71b000038e3b5ad aaa900005554b5ad 8e38000071c6b5ad 71c600008e38b5ad 55540000aaa9b5ad 38e30000c71bb5ad 1c710000e38db5ad 00000000ffffb5ad 00001745e8b9a529 00002762d89c94a5 00003332cccc8421 00003c3bc3c3739d 0000435ebca06319 00004924b6da5295 00004de9b2154211 000051ebae13318d 00005554aaa92109 00005846a7b81085 00005ad6a5280000 
-ffff529400000000 ffff4f7200001085 ffff4bd900002109 ffff47ad0000318d ffff42c800004211 ffff3cf300005295 ffff35e400006319 ffff2d2c0000739d ffff222100008421 ffff13b1000094a5 ffff00000000a529 e8b900001745a529 d17300002e8ba529 ba2d000045d1a529 a2e800005d16a529 8ba20000745ca529 745c00008ba2a529 5d160000a2e8a529 45d10000ba2da529 2e8b0000d173a529 17450000e8b9a529 00000000ffffa529 000013b1ec4d94a5 00002221dddd8421 00002d2cd2d2739d 000035e4ca1a6319 00003cf3c30b5295 000042c8bd364211 000047adb851318d 00004bd9b4252109 00004f72b08c1085 00005294ad6a0000 
-ffff4a5200000000 ffff469e00001085 ffff425e00002109 ffff3d700000318d ffff37a600004211 ffff30c200005295 ffff286b00006319 ffff1e1d0000739d ffff111000008421 ffff0000000094a5 ec4d000013b194a5 d89c0000276294a5 c4eb00003b1394a5 b13a00004ec494a5 9d890000627594a5 89d80000762694a5 7626000089d894a5 627500009d8994a5 4ec40000b13a94a5 3b130000c4eb94a5 27620000d89c94a5 13b10000ec4d94a5 00000000ffff94a5 00001110eeee8421 00001e1de1e1739d 0000286bd7936319 000030c2cf3c5295 000037a6c8584211 00003d70c28e318d 0000425ebda02109 0000469eb9601085 00004a52b5ac0000 
-ffff421000000000 ffff3dca00001085 ffff38e300002109 ffff33320000318d ffff2c8500004211 ffff249200005295 ffff1af200006319 ffff0f0e0000739d ffff000000008421 eeee000011108421 dddd000022218421 cccc000033328421 bbba000044438421 aaa9000055548421 9998000066658421 8887000077768421 7776000088878421 6665000099988421 55540000aaa98421 44430000bbba8421 33320000cccc8421 22210000dddd8421 11100000eeee8421 00000000ffff8421 00000f0ef0f0739d 00001af2e50c6319 00002492db6c5295 00002c85d3794211 00003332cccc318d 000038e3c71b2109 00003dcac2341085 00004210bdee0000 
-ffff39ce00000000 ffff34f600001085 ffff2f6800002109 ffff28f50000318d ffff216400004211 ffff186100005295 ffff0d7900006319 ffff00000000739d f0f000000f0e739d e1e100001e1d739d d2d200002d2c739d c3c300003c3b739d b4b300004b4a739d a5a400005a59739d 969500006968739d 878600007877739d 787700008786739d 696800009695739d 5a590000a5a4739d 4b4a0000b4b3739d 3c3b0000c3c3739d 2d2c0000d2d2739d 1e1d0000e1e1739d 0f0e0000f0f0739d 00000000ffff739d 00000d79f2856319 00001861e79d5295 00002164de9a4211 000028f5d709318d 00002f68d0962109 000034f6cb081085 000039cec6300000 
-ffff318c00000000 ffff2c2300001085 ffff25ec00002109 ffff1eb80000318d ffff164200004211 ffff0c3000005295 ffff000000006319 f28500000d796319 e50c00001af26319 d7930000286b6319 ca1a000035e46319 bca00000435e6319 af27000050d76319 a1ae00005e506319 943500006bc96319 86bc000079426319 7942000086bc6319 6bc9000094356319 5e500000a1ae6319 50d70000af276319 435e0000bca06319 35e40000ca1a6319 286b0000d7936319 1af20000e50c6319 0d790000f2856319 00000000ffff6319 00000c30f3ce5295 00001642e9bc4211 00001eb8e146318d 000025ecda122109 00002c23d3db1085 0000318cce720000 
-ffff294a00000000 ffff234f00001085 ffff1c7100002109 ffff147a0000318d ffff0b2100004211 ffff000000005295 f3ce00000c305295 e79d000018615295 db6c000024925295 cf3c000030c25295 c30b00003cf35295 b6da000049245295 aaa9000055545295 9e79000061855295 924800006db65295 8617000079e75295 79e7000086175295 6db6000092485295 618500009e795295 55540000aaa95295 49240000b6da5295 3cf30000c30b5295 30c20000cf3c5295 24920000db6c5295 18610000e79d5295 0c300000f3ce5295 00000000ffff5295 00000b21f4dd4211 0000147aeb84318d 00001c71e38d2109 0000234fdcaf1085 0000294ad6b40000 
-ffff210800000000 ffff1a7b00001085 ffff12f600002109 ffff0a3d0000318d ffff000000004211 f4dd00000b214211 e9bc000016424211 de9a000021644211 d37900002c854211 c858000037a64211 bd36000042c84211 b21500004de94211 a6f40000590a4211 9bd20000642c4211 90b100006f4d4211 859000007a6e4211 7a6e000085904211 6f4d000090b14211 642c00009bd24211 590a0000a6f44211 4de90000b2154211 42c80000bd364211 37a60000c8584211 2c850000d3794211 21640000de9a4211 16420000e9bc4211 0b210000f4dd4211 00000000ffff4211 00000a3df5c1318d 000012f6ed082109 00001a7be5831085 00002108def60000 
-ffff18c600000000 ffff11a700001085 ffff097b00002109 ffff00000000318d f5c100000a3d318d eb840000147a318d e14600001eb8318d d709000028f5318d cccc00003332318d c28e00003d70318d b851000047ad318d ae13000051eb318d a3d600005c28318d 999800006665318d 8f5b000070a3318d 851e00007ae0318d 7ae00000851e318d 70a300008f5b318d 666500009998318d 5c280000a3d6318d 51eb0000ae13318d 47ad0000b851318d 3d700000c28e318d 33320000cccc318d 28f50000d709318d 1eb80000e146318d 147a0000eb84318d 0a3d0000f5c1318d 00000000ffff318d 0000097bf6832109 000011a7ee571085 000018c6e7380000 
-ffff108400000000 ffff08d300001085 ffff000000002109 f6830000097b2109 ed08000012f62109 e38d00001c712109 da12000025ec2109 d09600002f682109 c71b000038e32109 bda00000425e2109 b42500004bd92109 aaa9000055542109 a12e00005ed02109 97b30000684b2109 8e38000071c62109 84bd00007b412109 7b41000084bd2109 71c600008e382109 684b000097b32109 5ed00000a12e2109 55540000aaa92109 4bd90000b4252109 425e0000bda02109 38e30000c71b2109 2f680000d0962109 25ec0000da122109 1c710000e38d2109 12f60000ed082109 097b0000f6832109 00000000ffff2109 000008d3f72b1085 00001084ef7a0000 
-ffff084200000000 ffff000000001085 f72b000008d31085 ee57000011a71085 e58300001a7b1085 dcaf0000234f1085 d3db00002c231085 cb08000034f61085 c23400003dca1085 b9600000469e1085 b08c00004f721085 a7b8000058461085 9ee40000611a1085 9611000069ed1085 8d3d000072c11085 846900007b951085 7b95000084691085 72c100008d3d1085 69ed000096111085 611a00009ee41085 58460000a7b81085 4f720000b08c1085 469e0000b9601085 3dca0000c2341085 34f60000cb081085 2c230000d3db1085 234f0000dcaf1085 1a7b0000e5831085 11a70000ee571085 08d30000f72b1085 00000000ffff1085 00000842f7bc0000 
-ffff000000000000 f7bc000008420000 ef7a000010840000 e738000018c60000 def6000021080000 d6b40000294a0000 ce720000318c0000 c630000039ce0000 bdee000042100000 b5ac00004a520000 ad6a000052940000 a52800005ad60000 9ce6000063180000 94a400006b5a0000 8c620000739c0000 842000007bde0000 7bde000084200000 739c00008c620000 6b5a000094a40000 631800009ce60000 5ad60000a5280000 52940000ad6a0000 4a520000b5ac0000 42100000bdee0000 39ce0000c6300000 318c0000ce720000 294a0000d6b40000 21080000def60000 18c60000e7380000 10840000ef7a0000 08420000f7bc0000 00000000ffff0000 
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/writer.go b/third_party/gofrontend/libgo/go/image/png/writer.go
deleted file mode 100644
index df23270..0000000
--- a/third_party/gofrontend/libgo/go/image/png/writer.go
+++ /dev/null
@@ -1,530 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package png
-
-import (
-	"bufio"
-	"compress/zlib"
-	"hash/crc32"
-	"image"
-	"image/color"
-	"io"
-	"strconv"
-)
-
-// Encoder configures encoding PNG images.
-type Encoder struct {
-	CompressionLevel CompressionLevel
-}
-
-type encoder struct {
-	enc    *Encoder
-	w      io.Writer
-	m      image.Image
-	cb     int
-	err    error
-	header [8]byte
-	footer [4]byte
-	tmp    [4 * 256]byte
-}
-
-type CompressionLevel int
-
-const (
-	DefaultCompression CompressionLevel = 0
-	NoCompression      CompressionLevel = -1
-	BestSpeed          CompressionLevel = -2
-	BestCompression    CompressionLevel = -3
-
-	// Positive CompressionLevel values are reserved to mean a numeric zlib
-	// compression level, although that is not implemented yet.
-)
-
-// Big-endian.
-func writeUint32(b []uint8, u uint32) {
-	b[0] = uint8(u >> 24)
-	b[1] = uint8(u >> 16)
-	b[2] = uint8(u >> 8)
-	b[3] = uint8(u >> 0)
-}
-
-type opaquer interface {
-	Opaque() bool
-}
-
-// Returns whether or not the image is fully opaque.
-func opaque(m image.Image) bool {
-	if o, ok := m.(opaquer); ok {
-		return o.Opaque()
-	}
-	b := m.Bounds()
-	for y := b.Min.Y; y < b.Max.Y; y++ {
-		for x := b.Min.X; x < b.Max.X; x++ {
-			_, _, _, a := m.At(x, y).RGBA()
-			if a != 0xffff {
-				return false
-			}
-		}
-	}
-	return true
-}
-
-// The absolute value of a byte interpreted as a signed int8.
-func abs8(d uint8) int {
-	if d < 128 {
-		return int(d)
-	}
-	return 256 - int(d)
-}
-
-func (e *encoder) writeChunk(b []byte, name string) {
-	if e.err != nil {
-		return
-	}
-	n := uint32(len(b))
-	if int(n) != len(b) {
-		e.err = UnsupportedError(name + " chunk is too large: " + strconv.Itoa(len(b)))
-		return
-	}
-	writeUint32(e.header[:4], n)
-	e.header[4] = name[0]
-	e.header[5] = name[1]
-	e.header[6] = name[2]
-	e.header[7] = name[3]
-	crc := crc32.NewIEEE()
-	crc.Write(e.header[4:8])
-	crc.Write(b)
-	writeUint32(e.footer[:4], crc.Sum32())
-
-	_, e.err = e.w.Write(e.header[:8])
-	if e.err != nil {
-		return
-	}
-	_, e.err = e.w.Write(b)
-	if e.err != nil {
-		return
-	}
-	_, e.err = e.w.Write(e.footer[:4])
-}
-
-func (e *encoder) writeIHDR() {
-	b := e.m.Bounds()
-	writeUint32(e.tmp[0:4], uint32(b.Dx()))
-	writeUint32(e.tmp[4:8], uint32(b.Dy()))
-	// Set bit depth and color type.
-	switch e.cb {
-	case cbG8:
-		e.tmp[8] = 8
-		e.tmp[9] = ctGrayscale
-	case cbTC8:
-		e.tmp[8] = 8
-		e.tmp[9] = ctTrueColor
-	case cbP8:
-		e.tmp[8] = 8
-		e.tmp[9] = ctPaletted
-	case cbTCA8:
-		e.tmp[8] = 8
-		e.tmp[9] = ctTrueColorAlpha
-	case cbG16:
-		e.tmp[8] = 16
-		e.tmp[9] = ctGrayscale
-	case cbTC16:
-		e.tmp[8] = 16
-		e.tmp[9] = ctTrueColor
-	case cbTCA16:
-		e.tmp[8] = 16
-		e.tmp[9] = ctTrueColorAlpha
-	}
-	e.tmp[10] = 0 // default compression method
-	e.tmp[11] = 0 // default filter method
-	e.tmp[12] = 0 // non-interlaced
-	e.writeChunk(e.tmp[:13], "IHDR")
-}
-
-func (e *encoder) writePLTEAndTRNS(p color.Palette) {
-	if len(p) < 1 || len(p) > 256 {
-		e.err = FormatError("bad palette length: " + strconv.Itoa(len(p)))
-		return
-	}
-	last := -1
-	for i, c := range p {
-		c1 := color.NRGBAModel.Convert(c).(color.NRGBA)
-		e.tmp[3*i+0] = c1.R
-		e.tmp[3*i+1] = c1.G
-		e.tmp[3*i+2] = c1.B
-		if c1.A != 0xff {
-			last = i
-		}
-		e.tmp[3*256+i] = c1.A
-	}
-	e.writeChunk(e.tmp[:3*len(p)], "PLTE")
-	if last != -1 {
-		e.writeChunk(e.tmp[3*256:3*256+1+last], "tRNS")
-	}
-}
-
-// An encoder is an io.Writer that satisfies writes by writing PNG IDAT chunks,
-// including an 8-byte header and 4-byte CRC checksum per Write call. Such calls
-// should be relatively infrequent, since writeIDATs uses a bufio.Writer.
-//
-// This method should only be called from writeIDATs (via writeImage).
-// No other code should treat an encoder as an io.Writer.
-func (e *encoder) Write(b []byte) (int, error) {
-	e.writeChunk(b, "IDAT")
-	if e.err != nil {
-		return 0, e.err
-	}
-	return len(b), nil
-}
-
-// Chooses the filter to use for encoding the current row, and applies it.
-// The return value is the index of the filter and also of the row in cr that has had it applied.
-func filter(cr *[nFilter][]byte, pr []byte, bpp int) int {
-	// We try all five filter types, and pick the one that minimizes the sum of absolute differences.
-	// This is the same heuristic that libpng uses, although the filters are attempted in order of
-	// estimated most likely to be minimal (ftUp, ftPaeth, ftNone, ftSub, ftAverage), rather than
-	// in their enumeration order (ftNone, ftSub, ftUp, ftAverage, ftPaeth).
-	cdat0 := cr[0][1:]
-	cdat1 := cr[1][1:]
-	cdat2 := cr[2][1:]
-	cdat3 := cr[3][1:]
-	cdat4 := cr[4][1:]
-	pdat := pr[1:]
-	n := len(cdat0)
-
-	// The up filter.
-	sum := 0
-	for i := 0; i < n; i++ {
-		cdat2[i] = cdat0[i] - pdat[i]
-		sum += abs8(cdat2[i])
-	}
-	best := sum
-	filter := ftUp
-
-	// The Paeth filter.
-	sum = 0
-	for i := 0; i < bpp; i++ {
-		cdat4[i] = cdat0[i] - pdat[i]
-		sum += abs8(cdat4[i])
-	}
-	for i := bpp; i < n; i++ {
-		cdat4[i] = cdat0[i] - paeth(cdat0[i-bpp], pdat[i], pdat[i-bpp])
-		sum += abs8(cdat4[i])
-		if sum >= best {
-			break
-		}
-	}
-	if sum < best {
-		best = sum
-		filter = ftPaeth
-	}
-
-	// The none filter.
-	sum = 0
-	for i := 0; i < n; i++ {
-		sum += abs8(cdat0[i])
-		if sum >= best {
-			break
-		}
-	}
-	if sum < best {
-		best = sum
-		filter = ftNone
-	}
-
-	// The sub filter.
-	sum = 0
-	for i := 0; i < bpp; i++ {
-		cdat1[i] = cdat0[i]
-		sum += abs8(cdat1[i])
-	}
-	for i := bpp; i < n; i++ {
-		cdat1[i] = cdat0[i] - cdat0[i-bpp]
-		sum += abs8(cdat1[i])
-		if sum >= best {
-			break
-		}
-	}
-	if sum < best {
-		best = sum
-		filter = ftSub
-	}
-
-	// The average filter.
-	sum = 0
-	for i := 0; i < bpp; i++ {
-		cdat3[i] = cdat0[i] - pdat[i]/2
-		sum += abs8(cdat3[i])
-	}
-	for i := bpp; i < n; i++ {
-		cdat3[i] = cdat0[i] - uint8((int(cdat0[i-bpp])+int(pdat[i]))/2)
-		sum += abs8(cdat3[i])
-		if sum >= best {
-			break
-		}
-	}
-	if sum < best {
-		best = sum
-		filter = ftAverage
-	}
-
-	return filter
-}
-
-func writeImage(w io.Writer, m image.Image, cb int, level int) error {
-	zw, err := zlib.NewWriterLevel(w, level)
-	if err != nil {
-		return err
-	}
-	defer zw.Close()
-
-	bpp := 0 // Bytes per pixel.
-
-	switch cb {
-	case cbG8:
-		bpp = 1
-	case cbTC8:
-		bpp = 3
-	case cbP8:
-		bpp = 1
-	case cbTCA8:
-		bpp = 4
-	case cbTC16:
-		bpp = 6
-	case cbTCA16:
-		bpp = 8
-	case cbG16:
-		bpp = 2
-	}
-	// cr[*] and pr are the bytes for the current and previous row.
-	// cr[0] is unfiltered (or equivalently, filtered with the ftNone filter).
-	// cr[ft], for non-zero filter types ft, are buffers for transforming cr[0] under the
-	// other PNG filter types. These buffers are allocated once and re-used for each row.
-	// The +1 is for the per-row filter type, which is at cr[*][0].
-	b := m.Bounds()
-	var cr [nFilter][]uint8
-	for i := range cr {
-		cr[i] = make([]uint8, 1+bpp*b.Dx())
-		cr[i][0] = uint8(i)
-	}
-	pr := make([]uint8, 1+bpp*b.Dx())
-
-	gray, _ := m.(*image.Gray)
-	rgba, _ := m.(*image.RGBA)
-	paletted, _ := m.(*image.Paletted)
-	nrgba, _ := m.(*image.NRGBA)
-
-	for y := b.Min.Y; y < b.Max.Y; y++ {
-		// Convert from colors to bytes.
-		i := 1
-		switch cb {
-		case cbG8:
-			if gray != nil {
-				offset := (y - b.Min.Y) * gray.Stride
-				copy(cr[0][1:], gray.Pix[offset:offset+b.Dx()])
-			} else {
-				for x := b.Min.X; x < b.Max.X; x++ {
-					c := color.GrayModel.Convert(m.At(x, y)).(color.Gray)
-					cr[0][i] = c.Y
-					i++
-				}
-			}
-		case cbTC8:
-			// We have previously verified that the alpha value is fully opaque.
-			cr0 := cr[0]
-			stride, pix := 0, []byte(nil)
-			if rgba != nil {
-				stride, pix = rgba.Stride, rgba.Pix
-			} else if nrgba != nil {
-				stride, pix = nrgba.Stride, nrgba.Pix
-			}
-			if stride != 0 {
-				j0 := (y - b.Min.Y) * stride
-				j1 := j0 + b.Dx()*4
-				for j := j0; j < j1; j += 4 {
-					cr0[i+0] = pix[j+0]
-					cr0[i+1] = pix[j+1]
-					cr0[i+2] = pix[j+2]
-					i += 3
-				}
-			} else {
-				for x := b.Min.X; x < b.Max.X; x++ {
-					r, g, b, _ := m.At(x, y).RGBA()
-					cr0[i+0] = uint8(r >> 8)
-					cr0[i+1] = uint8(g >> 8)
-					cr0[i+2] = uint8(b >> 8)
-					i += 3
-				}
-			}
-		case cbP8:
-			if paletted != nil {
-				offset := (y - b.Min.Y) * paletted.Stride
-				copy(cr[0][1:], paletted.Pix[offset:offset+b.Dx()])
-			} else {
-				pi := m.(image.PalettedImage)
-				for x := b.Min.X; x < b.Max.X; x++ {
-					cr[0][i] = pi.ColorIndexAt(x, y)
-					i += 1
-				}
-			}
-		case cbTCA8:
-			if nrgba != nil {
-				offset := (y - b.Min.Y) * nrgba.Stride
-				copy(cr[0][1:], nrgba.Pix[offset:offset+b.Dx()*4])
-			} else {
-				// Convert from image.Image (which is alpha-premultiplied) to PNG's non-alpha-premultiplied.
-				for x := b.Min.X; x < b.Max.X; x++ {
-					c := color.NRGBAModel.Convert(m.At(x, y)).(color.NRGBA)
-					cr[0][i+0] = c.R
-					cr[0][i+1] = c.G
-					cr[0][i+2] = c.B
-					cr[0][i+3] = c.A
-					i += 4
-				}
-			}
-		case cbG16:
-			for x := b.Min.X; x < b.Max.X; x++ {
-				c := color.Gray16Model.Convert(m.At(x, y)).(color.Gray16)
-				cr[0][i+0] = uint8(c.Y >> 8)
-				cr[0][i+1] = uint8(c.Y)
-				i += 2
-			}
-		case cbTC16:
-			// We have previously verified that the alpha value is fully opaque.
-			for x := b.Min.X; x < b.Max.X; x++ {
-				r, g, b, _ := m.At(x, y).RGBA()
-				cr[0][i+0] = uint8(r >> 8)
-				cr[0][i+1] = uint8(r)
-				cr[0][i+2] = uint8(g >> 8)
-				cr[0][i+3] = uint8(g)
-				cr[0][i+4] = uint8(b >> 8)
-				cr[0][i+5] = uint8(b)
-				i += 6
-			}
-		case cbTCA16:
-			// Convert from image.Image (which is alpha-premultiplied) to PNG's non-alpha-premultiplied.
-			for x := b.Min.X; x < b.Max.X; x++ {
-				c := color.NRGBA64Model.Convert(m.At(x, y)).(color.NRGBA64)
-				cr[0][i+0] = uint8(c.R >> 8)
-				cr[0][i+1] = uint8(c.R)
-				cr[0][i+2] = uint8(c.G >> 8)
-				cr[0][i+3] = uint8(c.G)
-				cr[0][i+4] = uint8(c.B >> 8)
-				cr[0][i+5] = uint8(c.B)
-				cr[0][i+6] = uint8(c.A >> 8)
-				cr[0][i+7] = uint8(c.A)
-				i += 8
-			}
-		}
-
-		// Apply the filter.
-		f := ftNone
-		if level != zlib.NoCompression {
-			f = filter(&cr, pr, bpp)
-		}
-
-		// Write the compressed bytes.
-		if _, err := zw.Write(cr[f]); err != nil {
-			return err
-		}
-
-		// The current row for y is the previous row for y+1.
-		pr, cr[0] = cr[0], pr
-	}
-	return nil
-}
-
-// Write the actual image data to one or more IDAT chunks.
-func (e *encoder) writeIDATs() {
-	if e.err != nil {
-		return
-	}
-	var bw *bufio.Writer
-	bw = bufio.NewWriterSize(e, 1<<15)
-	e.err = writeImage(bw, e.m, e.cb, levelToZlib(e.enc.CompressionLevel))
-	if e.err != nil {
-		return
-	}
-	e.err = bw.Flush()
-}
-
-// This function is required because we want the zero value of
-// Encoder.CompressionLevel to map to zlib.DefaultCompression.
-func levelToZlib(l CompressionLevel) int {
-	switch l {
-	case DefaultCompression:
-		return zlib.DefaultCompression
-	case NoCompression:
-		return zlib.NoCompression
-	case BestSpeed:
-		return zlib.BestSpeed
-	case BestCompression:
-		return zlib.BestCompression
-	default:
-		return zlib.DefaultCompression
-	}
-}
-
-func (e *encoder) writeIEND() { e.writeChunk(nil, "IEND") }
-
-// Encode writes the Image m to w in PNG format. Any Image may be
-// encoded, but images that are not image.NRGBA might be encoded lossily.
-func Encode(w io.Writer, m image.Image) error {
-	var e Encoder
-	return e.Encode(w, m)
-}
-
-// Encode writes the Image m to w in PNG format.
-func (enc *Encoder) Encode(w io.Writer, m image.Image) error {
-	// Obviously, negative widths and heights are invalid. Furthermore, the PNG
-	// spec section 11.2.2 says that zero is invalid. Excessively large images are
-	// also rejected.
-	mw, mh := int64(m.Bounds().Dx()), int64(m.Bounds().Dy())
-	if mw <= 0 || mh <= 0 || mw >= 1<<32 || mh >= 1<<32 {
-		return FormatError("invalid image size: " + strconv.FormatInt(mw, 10) + "x" + strconv.FormatInt(mh, 10))
-	}
-
-	var e encoder
-	e.enc = enc
-	e.w = w
-	e.m = m
-
-	var pal color.Palette
-	// cbP8 encoding needs PalettedImage's ColorIndexAt method.
-	if _, ok := m.(image.PalettedImage); ok {
-		pal, _ = m.ColorModel().(color.Palette)
-	}
-	if pal != nil {
-		e.cb = cbP8
-	} else {
-		switch m.ColorModel() {
-		case color.GrayModel:
-			e.cb = cbG8
-		case color.Gray16Model:
-			e.cb = cbG16
-		case color.RGBAModel, color.NRGBAModel, color.AlphaModel:
-			if opaque(m) {
-				e.cb = cbTC8
-			} else {
-				e.cb = cbTCA8
-			}
-		default:
-			if opaque(m) {
-				e.cb = cbTC16
-			} else {
-				e.cb = cbTCA16
-			}
-		}
-	}
-
-	_, e.err = io.WriteString(w, pngHeader)
-	e.writeIHDR()
-	if pal != nil {
-		e.writePLTEAndTRNS(pal)
-	}
-	e.writeIDATs()
-	e.writeIEND()
-	return e.err
-}
diff --git a/third_party/gofrontend/libgo/go/image/png/writer_test.go b/third_party/gofrontend/libgo/go/image/png/writer_test.go
deleted file mode 100644
index d67a815..0000000
--- a/third_party/gofrontend/libgo/go/image/png/writer_test.go
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package png
-
-import (
-	"bytes"
-	"fmt"
-	"image"
-	"image/color"
-	"io/ioutil"
-	"testing"
-)
-
-func diff(m0, m1 image.Image) error {
-	b0, b1 := m0.Bounds(), m1.Bounds()
-	if !b0.Size().Eq(b1.Size()) {
-		return fmt.Errorf("dimensions differ: %v vs %v", b0, b1)
-	}
-	dx := b1.Min.X - b0.Min.X
-	dy := b1.Min.Y - b0.Min.Y
-	for y := b0.Min.Y; y < b0.Max.Y; y++ {
-		for x := b0.Min.X; x < b0.Max.X; x++ {
-			c0 := m0.At(x, y)
-			c1 := m1.At(x+dx, y+dy)
-			r0, g0, b0, a0 := c0.RGBA()
-			r1, g1, b1, a1 := c1.RGBA()
-			if r0 != r1 || g0 != g1 || b0 != b1 || a0 != a1 {
-				return fmt.Errorf("colors differ at (%d, %d): %v vs %v", x, y, c0, c1)
-			}
-		}
-	}
-	return nil
-}
-
-func encodeDecode(m image.Image) (image.Image, error) {
-	var b bytes.Buffer
-	err := Encode(&b, m)
-	if err != nil {
-		return nil, err
-	}
-	return Decode(&b)
-}
-
-func TestWriter(t *testing.T) {
-	// The filenames variable is declared in reader_test.go.
-	names := filenames
-	if testing.Short() {
-		names = filenamesShort
-	}
-	for _, fn := range names {
-		qfn := "testdata/pngsuite/" + fn + ".png"
-		// Read the image.
-		m0, err := readPNG(qfn)
-		if err != nil {
-			t.Error(fn, err)
-			continue
-		}
-		// Read the image again, encode it, and decode it.
-		m1, err := readPNG(qfn)
-		if err != nil {
-			t.Error(fn, err)
-			return
-		}
-		m2, err := encodeDecode(m1)
-		if err != nil {
-			t.Error(fn, err)
-			return
-		}
-		// Compare the two.
-		err = diff(m0, m2)
-		if err != nil {
-			t.Error(fn, err)
-			continue
-		}
-	}
-}
-
-func TestWriterLevels(t *testing.T) {
-	m := image.NewNRGBA(image.Rect(0, 0, 100, 100))
-
-	var b1, b2 bytes.Buffer
-	if err := (&Encoder{}).Encode(&b1, m); err != nil {
-		t.Fatal(err)
-	}
-	noenc := &Encoder{CompressionLevel: NoCompression}
-	if err := noenc.Encode(&b2, m); err != nil {
-		t.Fatal(err)
-	}
-
-	if b2.Len() <= b1.Len() {
-		t.Error("DefaultCompression encoding was larger than NoCompression encoding")
-	}
-	if _, err := Decode(&b1); err != nil {
-		t.Error("cannot decode DefaultCompression")
-	}
-	if _, err := Decode(&b2); err != nil {
-		t.Error("cannot decode NoCompression")
-	}
-}
-
-func TestSubImage(t *testing.T) {
-	m0 := image.NewRGBA(image.Rect(0, 0, 256, 256))
-	for y := 0; y < 256; y++ {
-		for x := 0; x < 256; x++ {
-			m0.Set(x, y, color.RGBA{uint8(x), uint8(y), 0, 255})
-		}
-	}
-	m0 = m0.SubImage(image.Rect(50, 30, 250, 130)).(*image.RGBA)
-	m1, err := encodeDecode(m0)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	err = diff(m0, m1)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-}
-
-func BenchmarkEncodeGray(b *testing.B) {
-	b.StopTimer()
-	img := image.NewGray(image.Rect(0, 0, 640, 480))
-	b.SetBytes(640 * 480 * 1)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		Encode(ioutil.Discard, img)
-	}
-}
-
-func BenchmarkEncodeNRGBOpaque(b *testing.B) {
-	b.StopTimer()
-	img := image.NewNRGBA(image.Rect(0, 0, 640, 480))
-	// Set all pixels to 0xFF alpha to force opaque mode.
-	bo := img.Bounds()
-	for y := bo.Min.Y; y < bo.Max.Y; y++ {
-		for x := bo.Min.X; x < bo.Max.X; x++ {
-			img.Set(x, y, color.NRGBA{0, 0, 0, 255})
-		}
-	}
-	if !img.Opaque() {
-		b.Fatal("expected image to be opaque")
-	}
-	b.SetBytes(640 * 480 * 4)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		Encode(ioutil.Discard, img)
-	}
-}
-
-func BenchmarkEncodeNRGBA(b *testing.B) {
-	b.StopTimer()
-	img := image.NewNRGBA(image.Rect(0, 0, 640, 480))
-	if img.Opaque() {
-		b.Fatal("expected image not to be opaque")
-	}
-	b.SetBytes(640 * 480 * 4)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		Encode(ioutil.Discard, img)
-	}
-}
-
-func BenchmarkEncodePaletted(b *testing.B) {
-	b.StopTimer()
-	img := image.NewPaletted(image.Rect(0, 0, 640, 480), color.Palette{
-		color.RGBA{0, 0, 0, 255},
-		color.RGBA{255, 255, 255, 255},
-	})
-	b.SetBytes(640 * 480 * 1)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		Encode(ioutil.Discard, img)
-	}
-}
-
-func BenchmarkEncodeRGBOpaque(b *testing.B) {
-	b.StopTimer()
-	img := image.NewRGBA(image.Rect(0, 0, 640, 480))
-	// Set all pixels to 0xFF alpha to force opaque mode.
-	bo := img.Bounds()
-	for y := bo.Min.Y; y < bo.Max.Y; y++ {
-		for x := bo.Min.X; x < bo.Max.X; x++ {
-			img.Set(x, y, color.RGBA{0, 0, 0, 255})
-		}
-	}
-	if !img.Opaque() {
-		b.Fatal("expected image to be opaque")
-	}
-	b.SetBytes(640 * 480 * 4)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		Encode(ioutil.Discard, img)
-	}
-}
-
-func BenchmarkEncodeRGBA(b *testing.B) {
-	b.StopTimer()
-	img := image.NewRGBA(image.Rect(0, 0, 640, 480))
-	if img.Opaque() {
-		b.Fatal("expected image not to be opaque")
-	}
-	b.SetBytes(640 * 480 * 4)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		Encode(ioutil.Discard, img)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.221212.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.221212.jpeg
deleted file mode 100644
index f069c76..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.221212.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.221212.png b/third_party/gofrontend/libgo/go/image/testdata/video-001.221212.png
deleted file mode 100644
index d619a62..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.221212.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.5bpp.gif b/third_party/gofrontend/libgo/go/image/testdata/video-001.5bpp.gif
deleted file mode 100644
index ce53104..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.5bpp.gif
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.cmyk.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.cmyk.jpeg
deleted file mode 100644
index 507df84..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.cmyk.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.cmyk.png b/third_party/gofrontend/libgo/go/image/testdata/video-001.cmyk.png
deleted file mode 100644
index ef7b2b8..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.cmyk.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.gif b/third_party/gofrontend/libgo/go/image/testdata/video-001.gif
deleted file mode 100644
index ca06af6..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.gif
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.interlaced.gif b/third_party/gofrontend/libgo/go/image/testdata/video-001.interlaced.gif
deleted file mode 100644
index 590594e..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.interlaced.gif
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.jpeg
deleted file mode 100644
index 1b87c93..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.png b/third_party/gofrontend/libgo/go/image/testdata/video-001.png
deleted file mode 100644
index d3468bb..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.progressive.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.progressive.jpeg
deleted file mode 100644
index b8cae23..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.progressive.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.410.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.410.jpeg
deleted file mode 100644
index 4cebd1e..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.410.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.410.progressive.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.410.progressive.jpeg
deleted file mode 100644
index fb71402..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.410.progressive.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.411.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.411.jpeg
deleted file mode 100644
index b90de18..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.411.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.411.progressive.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.411.progressive.jpeg
deleted file mode 100644
index 1ddb22b..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.411.progressive.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.420.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.420.jpeg
deleted file mode 100644
index 83fb0f8..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.420.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.420.progressive.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.420.progressive.jpeg
deleted file mode 100644
index b048eb2..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.420.progressive.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.422.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.422.jpeg
deleted file mode 100644
index 60fff4f..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.422.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.422.progressive.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.422.progressive.jpeg
deleted file mode 100644
index 926d005..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.422.progressive.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.440.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.440.jpeg
deleted file mode 100644
index 32eeeae..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.440.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.440.progressive.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.440.progressive.jpeg
deleted file mode 100644
index e641a3b..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.440.progressive.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.444.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.444.jpeg
deleted file mode 100644
index 7d57433..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.444.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.444.progressive.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.444.progressive.jpeg
deleted file mode 100644
index ff7d5f9..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.q50.444.progressive.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.rgb.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.rgb.jpeg
deleted file mode 100644
index fc2ce3c..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.rgb.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.rgb.png b/third_party/gofrontend/libgo/go/image/testdata/video-001.rgb.png
deleted file mode 100644
index edb716d..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.rgb.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.separate.dc.progression.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.separate.dc.progression.jpeg
deleted file mode 100644
index 107f0fa..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.separate.dc.progression.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-001.separate.dc.progression.progressive.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-001.separate.dc.progression.progressive.jpeg
deleted file mode 100644
index a1d493e..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-001.separate.dc.progression.progressive.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.gif b/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.gif
deleted file mode 100644
index 23350d6..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.gif
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.jpeg
deleted file mode 100644
index f9d6e5c..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.png b/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.png
deleted file mode 100644
index 0b0ee75..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.png
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.q50.2x2.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.q50.2x2.jpeg
deleted file mode 100644
index 630b615..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.q50.2x2.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.q50.2x2.progressive.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.q50.2x2.progressive.jpeg
deleted file mode 100644
index c6b9360..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.q50.2x2.progressive.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.q50.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.q50.jpeg
deleted file mode 100644
index c65b5a7..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.q50.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.q50.progressive.jpeg b/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.q50.progressive.jpeg
deleted file mode 100644
index 24b70e8..0000000
--- a/third_party/gofrontend/libgo/go/image/testdata/video-005.gray.q50.progressive.jpeg
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/image/ycbcr.go b/third_party/gofrontend/libgo/go/image/ycbcr.go
deleted file mode 100644
index 93c354b..0000000
--- a/third_party/gofrontend/libgo/go/image/ycbcr.go
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package image
-
-import (
-	"image/color"
-)
-
-// YCbCrSubsampleRatio is the chroma subsample ratio used in a YCbCr image.
-type YCbCrSubsampleRatio int
-
-const (
-	YCbCrSubsampleRatio444 YCbCrSubsampleRatio = iota
-	YCbCrSubsampleRatio422
-	YCbCrSubsampleRatio420
-	YCbCrSubsampleRatio440
-	YCbCrSubsampleRatio411
-	YCbCrSubsampleRatio410
-)
-
-func (s YCbCrSubsampleRatio) String() string {
-	switch s {
-	case YCbCrSubsampleRatio444:
-		return "YCbCrSubsampleRatio444"
-	case YCbCrSubsampleRatio422:
-		return "YCbCrSubsampleRatio422"
-	case YCbCrSubsampleRatio420:
-		return "YCbCrSubsampleRatio420"
-	case YCbCrSubsampleRatio440:
-		return "YCbCrSubsampleRatio440"
-	case YCbCrSubsampleRatio411:
-		return "YCbCrSubsampleRatio411"
-	case YCbCrSubsampleRatio410:
-		return "YCbCrSubsampleRatio410"
-	}
-	return "YCbCrSubsampleRatioUnknown"
-}
-
-// YCbCr is an in-memory image of Y'CbCr colors. There is one Y sample per
-// pixel, but each Cb and Cr sample can span one or more pixels.
-// YStride is the Y slice index delta between vertically adjacent pixels.
-// CStride is the Cb and Cr slice index delta between vertically adjacent pixels
-// that map to separate chroma samples.
-// It is not an absolute requirement, but YStride and len(Y) are typically
-// multiples of 8, and:
-//	For 4:4:4, CStride == YStride/1 && len(Cb) == len(Cr) == len(Y)/1.
-//	For 4:2:2, CStride == YStride/2 && len(Cb) == len(Cr) == len(Y)/2.
-//	For 4:2:0, CStride == YStride/2 && len(Cb) == len(Cr) == len(Y)/4.
-//	For 4:4:0, CStride == YStride/1 && len(Cb) == len(Cr) == len(Y)/2.
-//	For 4:1:1, CStride == YStride/4 && len(Cb) == len(Cr) == len(Y)/4.
-//	For 4:1:0, CStride == YStride/4 && len(Cb) == len(Cr) == len(Y)/8.
-type YCbCr struct {
-	Y, Cb, Cr      []uint8
-	YStride        int
-	CStride        int
-	SubsampleRatio YCbCrSubsampleRatio
-	Rect           Rectangle
-}
-
-func (p *YCbCr) ColorModel() color.Model {
-	return color.YCbCrModel
-}
-
-func (p *YCbCr) Bounds() Rectangle {
-	return p.Rect
-}
-
-func (p *YCbCr) At(x, y int) color.Color {
-	return p.YCbCrAt(x, y)
-}
-
-func (p *YCbCr) YCbCrAt(x, y int) color.YCbCr {
-	if !(Point{x, y}.In(p.Rect)) {
-		return color.YCbCr{}
-	}
-	yi := p.YOffset(x, y)
-	ci := p.COffset(x, y)
-	return color.YCbCr{
-		p.Y[yi],
-		p.Cb[ci],
-		p.Cr[ci],
-	}
-}
-
-// YOffset returns the index of the first element of Y that corresponds to
-// the pixel at (x, y).
-func (p *YCbCr) YOffset(x, y int) int {
-	return (y-p.Rect.Min.Y)*p.YStride + (x - p.Rect.Min.X)
-}
-
-// COffset returns the index of the first element of Cb or Cr that corresponds
-// to the pixel at (x, y).
-func (p *YCbCr) COffset(x, y int) int {
-	switch p.SubsampleRatio {
-	case YCbCrSubsampleRatio422:
-		return (y-p.Rect.Min.Y)*p.CStride + (x/2 - p.Rect.Min.X/2)
-	case YCbCrSubsampleRatio420:
-		return (y/2-p.Rect.Min.Y/2)*p.CStride + (x/2 - p.Rect.Min.X/2)
-	case YCbCrSubsampleRatio440:
-		return (y/2-p.Rect.Min.Y/2)*p.CStride + (x - p.Rect.Min.X)
-	case YCbCrSubsampleRatio411:
-		return (y-p.Rect.Min.Y)*p.CStride + (x/4 - p.Rect.Min.X/4)
-	case YCbCrSubsampleRatio410:
-		return (y/2-p.Rect.Min.Y/2)*p.CStride + (x/4 - p.Rect.Min.X/4)
-	}
-	// Default to 4:4:4 subsampling.
-	return (y-p.Rect.Min.Y)*p.CStride + (x - p.Rect.Min.X)
-}
-
-// SubImage returns an image representing the portion of the image p visible
-// through r. The returned value shares pixels with the original image.
-func (p *YCbCr) SubImage(r Rectangle) Image {
-	r = r.Intersect(p.Rect)
-	// If r1 and r2 are Rectangles, r1.Intersect(r2) is not guaranteed to be inside
-	// either r1 or r2 if the intersection is empty. Without explicitly checking for
-	// this, the Pix[i:] expression below can panic.
-	if r.Empty() {
-		return &YCbCr{
-			SubsampleRatio: p.SubsampleRatio,
-		}
-	}
-	yi := p.YOffset(r.Min.X, r.Min.Y)
-	ci := p.COffset(r.Min.X, r.Min.Y)
-	return &YCbCr{
-		Y:              p.Y[yi:],
-		Cb:             p.Cb[ci:],
-		Cr:             p.Cr[ci:],
-		SubsampleRatio: p.SubsampleRatio,
-		YStride:        p.YStride,
-		CStride:        p.CStride,
-		Rect:           r,
-	}
-}
-
-func (p *YCbCr) Opaque() bool {
-	return true
-}
-
-// NewYCbCr returns a new YCbCr with the given bounds and subsample ratio.
-func NewYCbCr(r Rectangle, subsampleRatio YCbCrSubsampleRatio) *YCbCr {
-	w, h, cw, ch := r.Dx(), r.Dy(), 0, 0
-	switch subsampleRatio {
-	case YCbCrSubsampleRatio422:
-		cw = (r.Max.X+1)/2 - r.Min.X/2
-		ch = h
-	case YCbCrSubsampleRatio420:
-		cw = (r.Max.X+1)/2 - r.Min.X/2
-		ch = (r.Max.Y+1)/2 - r.Min.Y/2
-	case YCbCrSubsampleRatio440:
-		cw = w
-		ch = (r.Max.Y+1)/2 - r.Min.Y/2
-	case YCbCrSubsampleRatio411:
-		cw = (r.Max.X+3)/4 - r.Min.X/4
-		ch = h
-	case YCbCrSubsampleRatio410:
-		cw = (r.Max.X+3)/4 - r.Min.X/4
-		ch = (r.Max.Y+1)/2 - r.Min.Y/2
-	default:
-		// Default to 4:4:4 subsampling.
-		cw = w
-		ch = h
-	}
-	i0 := w*h + 0*cw*ch
-	i1 := w*h + 1*cw*ch
-	i2 := w*h + 2*cw*ch
-	b := make([]byte, i2)
-	return &YCbCr{
-		Y:              b[:i0:i0],
-		Cb:             b[i0:i1:i1],
-		Cr:             b[i1:i2:i2],
-		SubsampleRatio: subsampleRatio,
-		YStride:        w,
-		CStride:        cw,
-		Rect:           r,
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/image/ycbcr_test.go b/third_party/gofrontend/libgo/go/image/ycbcr_test.go
deleted file mode 100644
index 4996bc8..0000000
--- a/third_party/gofrontend/libgo/go/image/ycbcr_test.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package image
-
-import (
-	"image/color"
-	"testing"
-)
-
-func TestYCbCr(t *testing.T) {
-	rects := []Rectangle{
-		Rect(0, 0, 16, 16),
-		Rect(1, 0, 16, 16),
-		Rect(0, 1, 16, 16),
-		Rect(1, 1, 16, 16),
-		Rect(1, 1, 15, 16),
-		Rect(1, 1, 16, 15),
-		Rect(1, 1, 15, 15),
-		Rect(2, 3, 14, 15),
-		Rect(7, 0, 7, 16),
-		Rect(0, 8, 16, 8),
-		Rect(0, 0, 10, 11),
-		Rect(5, 6, 16, 16),
-		Rect(7, 7, 8, 8),
-		Rect(7, 8, 8, 9),
-		Rect(8, 7, 9, 8),
-		Rect(8, 8, 9, 9),
-		Rect(7, 7, 17, 17),
-		Rect(8, 8, 17, 17),
-		Rect(9, 9, 17, 17),
-		Rect(10, 10, 17, 17),
-	}
-	subsampleRatios := []YCbCrSubsampleRatio{
-		YCbCrSubsampleRatio444,
-		YCbCrSubsampleRatio422,
-		YCbCrSubsampleRatio420,
-		YCbCrSubsampleRatio440,
-		YCbCrSubsampleRatio411,
-		YCbCrSubsampleRatio410,
-	}
-	deltas := []Point{
-		Pt(0, 0),
-		Pt(1000, 1001),
-		Pt(5001, -400),
-		Pt(-701, -801),
-	}
-	for _, r := range rects {
-		for _, subsampleRatio := range subsampleRatios {
-			for _, delta := range deltas {
-				testYCbCr(t, r, subsampleRatio, delta)
-			}
-		}
-		if testing.Short() {
-			break
-		}
-	}
-}
-
-func testYCbCr(t *testing.T, r Rectangle, subsampleRatio YCbCrSubsampleRatio, delta Point) {
-	// Create a YCbCr image m, whose bounds are r translated by (delta.X, delta.Y).
-	r1 := r.Add(delta)
-	m := NewYCbCr(r1, subsampleRatio)
-
-	// Test that the image buffer is reasonably small even if (delta.X, delta.Y) is far from the origin.
-	if len(m.Y) > 100*100 {
-		t.Errorf("r=%v, subsampleRatio=%v, delta=%v: image buffer is too large",
-			r, subsampleRatio, delta)
-		return
-	}
-
-	// Initialize m's pixels. For 422 and 420 subsampling, some of the Cb and Cr elements
-	// will be set multiple times. That's OK. We just want to avoid a uniform image.
-	for y := r1.Min.Y; y < r1.Max.Y; y++ {
-		for x := r1.Min.X; x < r1.Max.X; x++ {
-			yi := m.YOffset(x, y)
-			ci := m.COffset(x, y)
-			m.Y[yi] = uint8(16*y + x)
-			m.Cb[ci] = uint8(y + 16*x)
-			m.Cr[ci] = uint8(y + 16*x)
-		}
-	}
-
-	// Make various sub-images of m.
-	for y0 := delta.Y + 3; y0 < delta.Y+7; y0++ {
-		for y1 := delta.Y + 8; y1 < delta.Y+13; y1++ {
-			for x0 := delta.X + 3; x0 < delta.X+7; x0++ {
-				for x1 := delta.X + 8; x1 < delta.X+13; x1++ {
-					subRect := Rect(x0, y0, x1, y1)
-					sub := m.SubImage(subRect).(*YCbCr)
-
-					// For each point in the sub-image's bounds, check that m.At(x, y) equals sub.At(x, y).
-					for y := sub.Rect.Min.Y; y < sub.Rect.Max.Y; y++ {
-						for x := sub.Rect.Min.X; x < sub.Rect.Max.X; x++ {
-							color0 := m.At(x, y).(color.YCbCr)
-							color1 := sub.At(x, y).(color.YCbCr)
-							if color0 != color1 {
-								t.Errorf("r=%v, subsampleRatio=%v, delta=%v, x=%d, y=%d, color0=%v, color1=%v",
-									r, subsampleRatio, delta, x, y, color0, color1)
-								return
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-}
-
-func TestYCbCrSlicesDontOverlap(t *testing.T) {
-	m := NewYCbCr(Rect(0, 0, 8, 8), YCbCrSubsampleRatio420)
-	names := []string{"Y", "Cb", "Cr"}
-	slices := [][]byte{
-		m.Y[:cap(m.Y)],
-		m.Cb[:cap(m.Cb)],
-		m.Cr[:cap(m.Cr)],
-	}
-	for i, slice := range slices {
-		want := uint8(10 + i)
-		for j := range slice {
-			slice[j] = want
-		}
-	}
-	for i, slice := range slices {
-		want := uint8(10 + i)
-		for j, got := range slice {
-			if got != want {
-				t.Fatalf("m.%s[%d]: got %d, want %d", names[i], j, got, want)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/index/suffixarray/qsufsort.go b/third_party/gofrontend/libgo/go/index/suffixarray/qsufsort.go
deleted file mode 100644
index 9c36a98..0000000
--- a/third_party/gofrontend/libgo/go/index/suffixarray/qsufsort.go
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This algorithm is based on "Faster Suffix Sorting"
-//   by N. Jesper Larsson and Kunihiko Sadakane
-// paper: http://www.larsson.dogma.net/ssrev-tr.pdf
-// code:  http://www.larsson.dogma.net/qsufsort.c
-
-// This algorithm computes the suffix array sa by computing its inverse.
-// Consecutive groups of suffixes in sa are labeled as sorted groups or
-// unsorted groups. For a given pass of the sorter, all suffixes are ordered
-// up to their first h characters, and sa is h-ordered. Suffixes in their
-// final positions and unambiguously sorted in h-order are in a sorted group.
-// Consecutive groups of suffixes with identical first h characters are an
-// unsorted group. In each pass of the algorithm, unsorted groups are sorted
-// according to the group number of their following suffix.
-
-// In the implementation, if sa[i] is negative, it indicates that i is
-// the first element of a sorted group of length -sa[i], and can be skipped.
-// An unsorted group sa[i:k] is given the group number of the index of its
-// last element, k-1. The group numbers are stored in the inverse slice (inv),
-// and when all groups are sorted, this slice is the inverse suffix array.
-
-package suffixarray
-
-import "sort"
-
-func qsufsort(data []byte) []int {
-	// initial sorting by first byte of suffix
-	sa := sortedByFirstByte(data)
-	if len(sa) < 2 {
-		return sa
-	}
-	// initialize the group lookup table
-	// this becomes the inverse of the suffix array when all groups are sorted
-	inv := initGroups(sa, data)
-
-	// the index starts 1-ordered
-	sufSortable := &suffixSortable{sa: sa, inv: inv, h: 1}
-
-	for sa[0] > -len(sa) { // until all suffixes are one big sorted group
-		// The suffixes are h-ordered, make them 2*h-ordered
-		pi := 0 // pi is first position of first group
-		sl := 0 // sl is negated length of sorted groups
-		for pi < len(sa) {
-			if s := sa[pi]; s < 0 { // if pi starts sorted group
-				pi -= s // skip over sorted group
-				sl += s // add negated length to sl
-			} else { // if pi starts unsorted group
-				if sl != 0 {
-					sa[pi+sl] = sl // combine sorted groups before pi
-					sl = 0
-				}
-				pk := inv[s] + 1 // pk-1 is last position of unsorted group
-				sufSortable.sa = sa[pi:pk]
-				sort.Sort(sufSortable)
-				sufSortable.updateGroups(pi)
-				pi = pk // next group
-			}
-		}
-		if sl != 0 { // if the array ends with a sorted group
-			sa[pi+sl] = sl // combine sorted groups at end of sa
-		}
-
-		sufSortable.h *= 2 // double sorted depth
-	}
-
-	for i := range sa { // reconstruct suffix array from inverse
-		sa[inv[i]] = i
-	}
-	return sa
-}
-
-func sortedByFirstByte(data []byte) []int {
-	// total byte counts
-	var count [256]int
-	for _, b := range data {
-		count[b]++
-	}
-	// make count[b] equal index of first occurrence of b in sorted array
-	sum := 0
-	for b := range count {
-		count[b], sum = sum, count[b]+sum
-	}
-	// iterate through bytes, placing index into the correct spot in sa
-	sa := make([]int, len(data))
-	for i, b := range data {
-		sa[count[b]] = i
-		count[b]++
-	}
-	return sa
-}
-
-func initGroups(sa []int, data []byte) []int {
-	// label contiguous same-letter groups with the same group number
-	inv := make([]int, len(data))
-	prevGroup := len(sa) - 1
-	groupByte := data[sa[prevGroup]]
-	for i := len(sa) - 1; i >= 0; i-- {
-		if b := data[sa[i]]; b < groupByte {
-			if prevGroup == i+1 {
-				sa[i+1] = -1
-			}
-			groupByte = b
-			prevGroup = i
-		}
-		inv[sa[i]] = prevGroup
-		if prevGroup == 0 {
-			sa[0] = -1
-		}
-	}
-	// Separate out the final suffix to the start of its group.
-	// This is necessary to ensure the suffix "a" is before "aba"
-	// when using a potentially unstable sort.
-	lastByte := data[len(data)-1]
-	s := -1
-	for i := range sa {
-		if sa[i] >= 0 {
-			if data[sa[i]] == lastByte && s == -1 {
-				s = i
-			}
-			if sa[i] == len(sa)-1 {
-				sa[i], sa[s] = sa[s], sa[i]
-				inv[sa[s]] = s
-				sa[s] = -1 // mark it as an isolated sorted group
-				break
-			}
-		}
-	}
-	return inv
-}
-
-type suffixSortable struct {
-	sa  []int
-	inv []int
-	h   int
-	buf []int // common scratch space
-}
-
-func (x *suffixSortable) Len() int           { return len(x.sa) }
-func (x *suffixSortable) Less(i, j int) bool { return x.inv[x.sa[i]+x.h] < x.inv[x.sa[j]+x.h] }
-func (x *suffixSortable) Swap(i, j int)      { x.sa[i], x.sa[j] = x.sa[j], x.sa[i] }
-
-func (x *suffixSortable) updateGroups(offset int) {
-	bounds := x.buf[0:0]
-	group := x.inv[x.sa[0]+x.h]
-	for i := 1; i < len(x.sa); i++ {
-		if g := x.inv[x.sa[i]+x.h]; g > group {
-			bounds = append(bounds, i)
-			group = g
-		}
-	}
-	bounds = append(bounds, len(x.sa))
-	x.buf = bounds
-
-	// update the group numberings after all new groups are determined
-	prev := 0
-	for _, b := range bounds {
-		for i := prev; i < b; i++ {
-			x.inv[x.sa[i]] = offset + b - 1
-		}
-		if b-prev == 1 {
-			x.sa[prev] = -1
-		}
-		prev = b
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/index/suffixarray/suffixarray.go b/third_party/gofrontend/libgo/go/index/suffixarray/suffixarray.go
deleted file mode 100644
index c59ae6e..0000000
--- a/third_party/gofrontend/libgo/go/index/suffixarray/suffixarray.go
+++ /dev/null
@@ -1,307 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package suffixarray implements substring search in logarithmic time using
-// an in-memory suffix array.
-//
-// Example use:
-//
-//	// create index for some data
-//	index := suffixarray.New(data)
-//
-//	// lookup byte slice s
-//	offsets1 := index.Lookup(s, -1) // the list of all indices where s occurs in data
-//	offsets2 := index.Lookup(s, 3)  // the list of at most 3 indices where s occurs in data
-//
-package suffixarray
-
-import (
-	"bytes"
-	"encoding/binary"
-	"io"
-	"regexp"
-	"sort"
-)
-
-// Index implements a suffix array for fast substring search.
-type Index struct {
-	data []byte
-	sa   []int // suffix array for data; len(sa) == len(data)
-}
-
-// New creates a new Index for data.
-// Index creation time is O(N*log(N)) for N = len(data).
-func New(data []byte) *Index {
-	return &Index{data, qsufsort(data)}
-}
-
-// writeInt writes an int x to w using buf to buffer the write.
-func writeInt(w io.Writer, buf []byte, x int) error {
-	binary.PutVarint(buf, int64(x))
-	_, err := w.Write(buf[0:binary.MaxVarintLen64])
-	return err
-}
-
-// readInt reads an int x from r using buf to buffer the read and returns x.
-func readInt(r io.Reader, buf []byte) (int, error) {
-	_, err := io.ReadFull(r, buf[0:binary.MaxVarintLen64]) // ok to continue with error
-	x, _ := binary.Varint(buf)
-	return int(x), err
-}
-
-// writeSlice writes data[:n] to w and returns n.
-// It uses buf to buffer the write.
-func writeSlice(w io.Writer, buf []byte, data []int) (n int, err error) {
-	// encode as many elements as fit into buf
-	p := binary.MaxVarintLen64
-	for ; n < len(data) && p+binary.MaxVarintLen64 <= len(buf); n++ {
-		p += binary.PutUvarint(buf[p:], uint64(data[n]))
-	}
-
-	// update buffer size
-	binary.PutVarint(buf, int64(p))
-
-	// write buffer
-	_, err = w.Write(buf[0:p])
-	return
-}
-
-// readSlice reads data[:n] from r and returns n.
-// It uses buf to buffer the read.
-func readSlice(r io.Reader, buf []byte, data []int) (n int, err error) {
-	// read buffer size
-	var size int
-	size, err = readInt(r, buf)
-	if err != nil {
-		return
-	}
-
-	// read buffer w/o the size
-	if _, err = io.ReadFull(r, buf[binary.MaxVarintLen64:size]); err != nil {
-		return
-	}
-
-	// decode as many elements as present in buf
-	for p := binary.MaxVarintLen64; p < size; n++ {
-		x, w := binary.Uvarint(buf[p:])
-		data[n] = int(x)
-		p += w
-	}
-
-	return
-}
-
-const bufSize = 16 << 10 // reasonable for BenchmarkSaveRestore
-
-// Read reads the index from r into x; x must not be nil.
-func (x *Index) Read(r io.Reader) error {
-	// buffer for all reads
-	buf := make([]byte, bufSize)
-
-	// read length
-	n, err := readInt(r, buf)
-	if err != nil {
-		return err
-	}
-
-	// allocate space
-	if 2*n < cap(x.data) || cap(x.data) < n {
-		// new data is significantly smaller or larger then
-		// existing buffers - allocate new ones
-		x.data = make([]byte, n)
-		x.sa = make([]int, n)
-	} else {
-		// re-use existing buffers
-		x.data = x.data[0:n]
-		x.sa = x.sa[0:n]
-	}
-
-	// read data
-	if _, err := io.ReadFull(r, x.data); err != nil {
-		return err
-	}
-
-	// read index
-	for sa := x.sa; len(sa) > 0; {
-		n, err := readSlice(r, buf, sa)
-		if err != nil {
-			return err
-		}
-		sa = sa[n:]
-	}
-	return nil
-}
-
-// Write writes the index x to w.
-func (x *Index) Write(w io.Writer) error {
-	// buffer for all writes
-	buf := make([]byte, bufSize)
-
-	// write length
-	if err := writeInt(w, buf, len(x.data)); err != nil {
-		return err
-	}
-
-	// write data
-	if _, err := w.Write(x.data); err != nil {
-		return err
-	}
-
-	// write index
-	for sa := x.sa; len(sa) > 0; {
-		n, err := writeSlice(w, buf, sa)
-		if err != nil {
-			return err
-		}
-		sa = sa[n:]
-	}
-	return nil
-}
-
-// Bytes returns the data over which the index was created.
-// It must not be modified.
-//
-func (x *Index) Bytes() []byte {
-	return x.data
-}
-
-func (x *Index) at(i int) []byte {
-	return x.data[x.sa[i]:]
-}
-
-// lookupAll returns a slice into the matching region of the index.
-// The runtime is O(log(N)*len(s)).
-func (x *Index) lookupAll(s []byte) []int {
-	// find matching suffix index range [i:j]
-	// find the first index where s would be the prefix
-	i := sort.Search(len(x.sa), func(i int) bool { return bytes.Compare(x.at(i), s) >= 0 })
-	// starting at i, find the first index at which s is not a prefix
-	j := i + sort.Search(len(x.sa)-i, func(j int) bool { return !bytes.HasPrefix(x.at(j+i), s) })
-	return x.sa[i:j]
-}
-
-// Lookup returns an unsorted list of at most n indices where the byte string s
-// occurs in the indexed data. If n < 0, all occurrences are returned.
-// The result is nil if s is empty, s is not found, or n == 0.
-// Lookup time is O(log(N)*len(s) + len(result)) where N is the
-// size of the indexed data.
-//
-func (x *Index) Lookup(s []byte, n int) (result []int) {
-	if len(s) > 0 && n != 0 {
-		matches := x.lookupAll(s)
-		if n < 0 || len(matches) < n {
-			n = len(matches)
-		}
-		// 0 <= n <= len(matches)
-		if n > 0 {
-			result = make([]int, n)
-			copy(result, matches)
-		}
-	}
-	return
-}
-
-// FindAllIndex returns a sorted list of non-overlapping matches of the
-// regular expression r, where a match is a pair of indices specifying
-// the matched slice of x.Bytes(). If n < 0, all matches are returned
-// in successive order. Otherwise, at most n matches are returned and
-// they may not be successive. The result is nil if there are no matches,
-// or if n == 0.
-//
-func (x *Index) FindAllIndex(r *regexp.Regexp, n int) (result [][]int) {
-	// a non-empty literal prefix is used to determine possible
-	// match start indices with Lookup
-	prefix, complete := r.LiteralPrefix()
-	lit := []byte(prefix)
-
-	// worst-case scenario: no literal prefix
-	if prefix == "" {
-		return r.FindAllIndex(x.data, n)
-	}
-
-	// if regexp is a literal just use Lookup and convert its
-	// result into match pairs
-	if complete {
-		// Lookup returns indices that may belong to overlapping matches.
-		// After eliminating them, we may end up with fewer than n matches.
-		// If we don't have enough at the end, redo the search with an
-		// increased value n1, but only if Lookup returned all the requested
-		// indices in the first place (if it returned fewer than that then
-		// there cannot be more).
-		for n1 := n; ; n1 += 2 * (n - len(result)) /* overflow ok */ {
-			indices := x.Lookup(lit, n1)
-			if len(indices) == 0 {
-				return
-			}
-			sort.Ints(indices)
-			pairs := make([]int, 2*len(indices))
-			result = make([][]int, len(indices))
-			count := 0
-			prev := 0
-			for _, i := range indices {
-				if count == n {
-					break
-				}
-				// ignore indices leading to overlapping matches
-				if prev <= i {
-					j := 2 * count
-					pairs[j+0] = i
-					pairs[j+1] = i + len(lit)
-					result[count] = pairs[j : j+2]
-					count++
-					prev = i + len(lit)
-				}
-			}
-			result = result[0:count]
-			if len(result) >= n || len(indices) != n1 {
-				// found all matches or there's no chance to find more
-				// (n and n1 can be negative)
-				break
-			}
-		}
-		if len(result) == 0 {
-			result = nil
-		}
-		return
-	}
-
-	// regexp has a non-empty literal prefix; Lookup(lit) computes
-	// the indices of possible complete matches; use these as starting
-	// points for anchored searches
-	// (regexp "^" matches beginning of input, not beginning of line)
-	r = regexp.MustCompile("^" + r.String()) // compiles because r compiled
-
-	// same comment about Lookup applies here as in the loop above
-	for n1 := n; ; n1 += 2 * (n - len(result)) /* overflow ok */ {
-		indices := x.Lookup(lit, n1)
-		if len(indices) == 0 {
-			return
-		}
-		sort.Ints(indices)
-		result = result[0:0]
-		prev := 0
-		for _, i := range indices {
-			if len(result) == n {
-				break
-			}
-			m := r.FindIndex(x.data[i:]) // anchored search - will not run off
-			// ignore indices leading to overlapping matches
-			if m != nil && prev <= i {
-				m[0] = i // correct m
-				m[1] += i
-				result = append(result, m)
-				prev = m[1]
-			}
-		}
-		if len(result) >= n || len(indices) != n1 {
-			// found all matches or there's no chance to find more
-			// (n and n1 can be negative)
-			break
-		}
-	}
-	if len(result) == 0 {
-		result = nil
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/index/suffixarray/suffixarray_test.go b/third_party/gofrontend/libgo/go/index/suffixarray/suffixarray_test.go
deleted file mode 100644
index 644f00c..0000000
--- a/third_party/gofrontend/libgo/go/index/suffixarray/suffixarray_test.go
+++ /dev/null
@@ -1,304 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package suffixarray
-
-import (
-	"bytes"
-	"math/rand"
-	"regexp"
-	"sort"
-	"strings"
-	"testing"
-)
-
-type testCase struct {
-	name     string   // name of test case
-	source   string   // source to index
-	patterns []string // patterns to lookup
-}
-
-var testCases = []testCase{
-	{
-		"empty string",
-		"",
-		[]string{
-			"",
-			"foo",
-			"(foo)",
-			".*",
-			"a*",
-		},
-	},
-
-	{
-		"all a's",
-		"aaaaaaaaaa", // 10 a's
-		[]string{
-			"",
-			"a",
-			"aa",
-			"aaa",
-			"aaaa",
-			"aaaaa",
-			"aaaaaa",
-			"aaaaaaa",
-			"aaaaaaaa",
-			"aaaaaaaaa",
-			"aaaaaaaaaa",
-			"aaaaaaaaaaa", // 11 a's
-			".",
-			".*",
-			"a+",
-			"aa+",
-			"aaaa[b]?",
-			"aaa*",
-		},
-	},
-
-	{
-		"abc",
-		"abc",
-		[]string{
-			"a",
-			"b",
-			"c",
-			"ab",
-			"bc",
-			"abc",
-			"a.c",
-			"a(b|c)",
-			"abc?",
-		},
-	},
-
-	{
-		"barbara*3",
-		"barbarabarbarabarbara",
-		[]string{
-			"a",
-			"bar",
-			"rab",
-			"arab",
-			"barbar",
-			"bara?bar",
-		},
-	},
-
-	{
-		"typing drill",
-		"Now is the time for all good men to come to the aid of their country.",
-		[]string{
-			"Now",
-			"the time",
-			"to come the aid",
-			"is the time for all good men to come to the aid of their",
-			"to (come|the)?",
-		},
-	},
-
-	{
-		"godoc simulation",
-		"package main\n\nimport(\n    \"rand\"\n    ",
-		[]string{},
-	},
-}
-
-// find all occurrences of s in source; report at most n occurrences
-func find(src, s string, n int) []int {
-	var res []int
-	if s != "" && n != 0 {
-		// find at most n occurrences of s in src
-		for i := -1; n < 0 || len(res) < n; {
-			j := strings.Index(src[i+1:], s)
-			if j < 0 {
-				break
-			}
-			i += j + 1
-			res = append(res, i)
-		}
-	}
-	return res
-}
-
-func testLookup(t *testing.T, tc *testCase, x *Index, s string, n int) {
-	res := x.Lookup([]byte(s), n)
-	exp := find(tc.source, s, n)
-
-	// check that the lengths match
-	if len(res) != len(exp) {
-		t.Errorf("test %q, lookup %q (n = %d): expected %d results; got %d", tc.name, s, n, len(exp), len(res))
-	}
-
-	// if n >= 0 the number of results is limited --- unless n >= all results,
-	// we may obtain different positions from the Index and from find (because
-	// Index may not find the results in the same order as find) => in general
-	// we cannot simply check that the res and exp lists are equal
-
-	// check that each result is in fact a correct match and there are no duplicates
-	sort.Ints(res)
-	for i, r := range res {
-		if r < 0 || len(tc.source) <= r {
-			t.Errorf("test %q, lookup %q, result %d (n = %d): index %d out of range [0, %d[", tc.name, s, i, n, r, len(tc.source))
-		} else if !strings.HasPrefix(tc.source[r:], s) {
-			t.Errorf("test %q, lookup %q, result %d (n = %d): index %d not a match", tc.name, s, i, n, r)
-		}
-		if i > 0 && res[i-1] == r {
-			t.Errorf("test %q, lookup %q, result %d (n = %d): found duplicate index %d", tc.name, s, i, n, r)
-		}
-	}
-
-	if n < 0 {
-		// all results computed - sorted res and exp must be equal
-		for i, r := range res {
-			e := exp[i]
-			if r != e {
-				t.Errorf("test %q, lookup %q, result %d: expected index %d; got %d", tc.name, s, i, e, r)
-			}
-		}
-	}
-}
-
-func testFindAllIndex(t *testing.T, tc *testCase, x *Index, rx *regexp.Regexp, n int) {
-	res := x.FindAllIndex(rx, n)
-	exp := rx.FindAllStringIndex(tc.source, n)
-
-	// check that the lengths match
-	if len(res) != len(exp) {
-		t.Errorf("test %q, FindAllIndex %q (n = %d): expected %d results; got %d", tc.name, rx, n, len(exp), len(res))
-	}
-
-	// if n >= 0 the number of results is limited --- unless n >= all results,
-	// we may obtain different positions from the Index and from regexp (because
-	// Index may not find the results in the same order as regexp) => in general
-	// we cannot simply check that the res and exp lists are equal
-
-	// check that each result is in fact a correct match and the result is sorted
-	for i, r := range res {
-		if r[0] < 0 || r[0] > r[1] || len(tc.source) < r[1] {
-			t.Errorf("test %q, FindAllIndex %q, result %d (n == %d): illegal match [%d, %d]", tc.name, rx, i, n, r[0], r[1])
-		} else if !rx.MatchString(tc.source[r[0]:r[1]]) {
-			t.Errorf("test %q, FindAllIndex %q, result %d (n = %d): [%d, %d] not a match", tc.name, rx, i, n, r[0], r[1])
-		}
-	}
-
-	if n < 0 {
-		// all results computed - sorted res and exp must be equal
-		for i, r := range res {
-			e := exp[i]
-			if r[0] != e[0] || r[1] != e[1] {
-				t.Errorf("test %q, FindAllIndex %q, result %d: expected match [%d, %d]; got [%d, %d]",
-					tc.name, rx, i, e[0], e[1], r[0], r[1])
-			}
-		}
-	}
-}
-
-func testLookups(t *testing.T, tc *testCase, x *Index, n int) {
-	for _, pat := range tc.patterns {
-		testLookup(t, tc, x, pat, n)
-		if rx, err := regexp.Compile(pat); err == nil {
-			testFindAllIndex(t, tc, x, rx, n)
-		}
-	}
-}
-
-// index is used to hide the sort.Interface
-type index Index
-
-func (x *index) Len() int           { return len(x.sa) }
-func (x *index) Less(i, j int) bool { return bytes.Compare(x.at(i), x.at(j)) < 0 }
-func (x *index) Swap(i, j int)      { x.sa[i], x.sa[j] = x.sa[j], x.sa[i] }
-func (a *index) at(i int) []byte    { return a.data[a.sa[i]:] }
-
-func testConstruction(t *testing.T, tc *testCase, x *Index) {
-	if !sort.IsSorted((*index)(x)) {
-		t.Errorf("failed testConstruction %s", tc.name)
-	}
-}
-
-func equal(x, y *Index) bool {
-	if !bytes.Equal(x.data, y.data) {
-		return false
-	}
-	for i, j := range x.sa {
-		if j != y.sa[i] {
-			return false
-		}
-	}
-	return true
-}
-
-// returns the serialized index size
-func testSaveRestore(t *testing.T, tc *testCase, x *Index) int {
-	var buf bytes.Buffer
-	if err := x.Write(&buf); err != nil {
-		t.Errorf("failed writing index %s (%s)", tc.name, err)
-	}
-	size := buf.Len()
-	var y Index
-	if err := y.Read(&buf); err != nil {
-		t.Errorf("failed reading index %s (%s)", tc.name, err)
-	}
-	if !equal(x, &y) {
-		t.Errorf("restored index doesn't match saved index %s", tc.name)
-	}
-	return size
-}
-
-func TestIndex(t *testing.T) {
-	for _, tc := range testCases {
-		x := New([]byte(tc.source))
-		testConstruction(t, &tc, x)
-		testSaveRestore(t, &tc, x)
-		testLookups(t, &tc, x, 0)
-		testLookups(t, &tc, x, 1)
-		testLookups(t, &tc, x, 10)
-		testLookups(t, &tc, x, 2e9)
-		testLookups(t, &tc, x, -1)
-	}
-}
-
-// Of all possible inputs, the random bytes have the least amount of substring
-// repetition, and the repeated bytes have the most. For most algorithms,
-// the running time of every input will be between these two.
-func benchmarkNew(b *testing.B, random bool) {
-	b.StopTimer()
-	data := make([]byte, 1e6)
-	if random {
-		for i := range data {
-			data[i] = byte(rand.Intn(256))
-		}
-	}
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		New(data)
-	}
-}
-
-func BenchmarkNewIndexRandom(b *testing.B) {
-	benchmarkNew(b, true)
-}
-func BenchmarkNewIndexRepeat(b *testing.B) {
-	benchmarkNew(b, false)
-}
-
-func BenchmarkSaveRestore(b *testing.B) {
-	b.StopTimer()
-	r := rand.New(rand.NewSource(0x5a77a1)) // guarantee always same sequence
-	data := make([]byte, 1<<20)             // 1MB of data to index
-	for i := range data {
-		data[i] = byte(r.Intn(256))
-	}
-	x := New(data)
-	size := testSaveRestore(nil, nil, x)       // verify correctness
-	buf := bytes.NewBuffer(make([]byte, size)) // avoid growing
-	b.SetBytes(int64(size))
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		x.Write(buf)
-		var y Index
-		y.Read(buf)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/internal/format/format.go b/third_party/gofrontend/libgo/go/internal/format/format.go
deleted file mode 100644
index a8270ba..0000000
--- a/third_party/gofrontend/libgo/go/internal/format/format.go
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package format
-
-import (
-	"bytes"
-	"go/ast"
-	"go/parser"
-	"go/printer"
-	"go/token"
-	"strings"
-)
-
-const parserMode = parser.ParseComments
-
-// Parse parses src, which was read from the named file,
-// as a Go source file, declaration, or statement list.
-func Parse(fset *token.FileSet, filename string, src []byte, fragmentOk bool) (
-	file *ast.File,
-	sourceAdj func(src []byte, indent int) []byte,
-	indentAdj int,
-	err error,
-) {
-	// Try as whole source file.
-	file, err = parser.ParseFile(fset, filename, src, parserMode)
-	// If there's no error, return.  If the error is that the source file didn't begin with a
-	// package line and source fragments are ok, fall through to
-	// try as a source fragment.  Stop and return on any other error.
-	if err == nil || !fragmentOk || !strings.Contains(err.Error(), "expected 'package'") {
-		return
-	}
-
-	// If this is a declaration list, make it a source file
-	// by inserting a package clause.
-	// Insert using a ;, not a newline, so that the line numbers
-	// in psrc match the ones in src.
-	psrc := append([]byte("package p;"), src...)
-	file, err = parser.ParseFile(fset, filename, psrc, parserMode)
-	if err == nil {
-		sourceAdj = func(src []byte, indent int) []byte {
-			// Remove the package clause.
-			// Gofmt has turned the ; into a \n.
-			src = src[indent+len("package p\n"):]
-			return bytes.TrimSpace(src)
-		}
-		return
-	}
-	// If the error is that the source file didn't begin with a
-	// declaration, fall through to try as a statement list.
-	// Stop and return on any other error.
-	if !strings.Contains(err.Error(), "expected declaration") {
-		return
-	}
-
-	// If this is a statement list, make it a source file
-	// by inserting a package clause and turning the list
-	// into a function body.  This handles expressions too.
-	// Insert using a ;, not a newline, so that the line numbers
-	// in fsrc match the ones in src. Add an extra '\n' before the '}'
-	// to make sure comments are flushed before the '}'.
-	fsrc := append(append([]byte("package p; func _() {"), src...), '\n', '\n', '}')
-	file, err = parser.ParseFile(fset, filename, fsrc, parserMode)
-	if err == nil {
-		sourceAdj = func(src []byte, indent int) []byte {
-			// Cap adjusted indent to zero.
-			if indent < 0 {
-				indent = 0
-			}
-			// Remove the wrapping.
-			// Gofmt has turned the ; into a \n\n.
-			// There will be two non-blank lines with indent, hence 2*indent.
-			src = src[2*indent+len("package p\n\nfunc _() {"):]
-			// Remove only the "}\n" suffix: remaining whitespaces will be trimmed anyway
-			src = src[:len(src)-len("}\n")]
-			return bytes.TrimSpace(src)
-		}
-		// Gofmt has also indented the function body one level.
-		// Adjust that with indentAdj.
-		indentAdj = -1
-	}
-
-	// Succeeded, or out of options.
-	return
-}
-
-// Format formats the given package file originally obtained from src
-// and adjusts the result based on the original source via sourceAdj
-// and indentAdj.
-func Format(
-	fset *token.FileSet,
-	file *ast.File,
-	sourceAdj func(src []byte, indent int) []byte,
-	indentAdj int,
-	src []byte,
-	cfg printer.Config,
-) ([]byte, error) {
-	if sourceAdj == nil {
-		// Complete source file.
-		var buf bytes.Buffer
-		err := cfg.Fprint(&buf, fset, file)
-		if err != nil {
-			return nil, err
-		}
-		return buf.Bytes(), nil
-	}
-
-	// Partial source file.
-	// Determine and prepend leading space.
-	i, j := 0, 0
-	for j < len(src) && IsSpace(src[j]) {
-		if src[j] == '\n' {
-			i = j + 1 // byte offset of last line in leading space
-		}
-		j++
-	}
-	var res []byte
-	res = append(res, src[:i]...)
-
-	// Determine and prepend indentation of first code line.
-	// Spaces are ignored unless there are no tabs,
-	// in which case spaces count as one tab.
-	indent := 0
-	hasSpace := false
-	for _, b := range src[i:j] {
-		switch b {
-		case ' ':
-			hasSpace = true
-		case '\t':
-			indent++
-		}
-	}
-	if indent == 0 && hasSpace {
-		indent = 1
-	}
-	for i := 0; i < indent; i++ {
-		res = append(res, '\t')
-	}
-
-	// Format the source.
-	// Write it without any leading and trailing space.
-	cfg.Indent = indent + indentAdj
-	var buf bytes.Buffer
-	err := cfg.Fprint(&buf, fset, file)
-	if err != nil {
-		return nil, err
-	}
-	res = append(res, sourceAdj(buf.Bytes(), cfg.Indent)...)
-
-	// Determine and append trailing space.
-	i = len(src)
-	for i > 0 && IsSpace(src[i-1]) {
-		i--
-	}
-	return append(res, src[i:]...), nil
-}
-
-// IsSpace reports whether the byte is a space character.
-// IsSpace defines a space as being among the following bytes: ' ', '\t', '\n' and '\r'.
-func IsSpace(b byte) bool {
-	return b == ' ' || b == '\t' || b == '\n' || b == '\r'
-}
diff --git a/third_party/gofrontend/libgo/go/internal/singleflight/singleflight.go b/third_party/gofrontend/libgo/go/internal/singleflight/singleflight.go
deleted file mode 100644
index f4cb2d6..0000000
--- a/third_party/gofrontend/libgo/go/internal/singleflight/singleflight.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package singleflight provides a duplicate function call suppression
-// mechanism.
-package singleflight
-
-import "sync"
-
-// call is an in-flight or completed singleflight.Do call
-type call struct {
-	wg sync.WaitGroup
-
-	// These fields are written once before the WaitGroup is done
-	// and are only read after the WaitGroup is done.
-	val interface{}
-	err error
-
-	// These fields are read and written with the singleflight
-	// mutex held before the WaitGroup is done, and are read but
-	// not written after the WaitGroup is done.
-	dups  int
-	chans []chan<- Result
-}
-
-// Group represents a class of work and forms a namespace in
-// which units of work can be executed with duplicate suppression.
-type Group struct {
-	mu sync.Mutex       // protects m
-	m  map[string]*call // lazily initialized
-}
-
-// Result holds the results of Do, so they can be passed
-// on a channel.
-type Result struct {
-	Val    interface{}
-	Err    error
-	Shared bool
-}
-
-// Do executes and returns the results of the given function, making
-// sure that only one execution is in-flight for a given key at a
-// time. If a duplicate comes in, the duplicate caller waits for the
-// original to complete and receives the same results.
-// The return value shared indicates whether v was given to multiple callers.
-func (g *Group) Do(key string, fn func() (interface{}, error)) (v interface{}, err error, shared bool) {
-	g.mu.Lock()
-	if g.m == nil {
-		g.m = make(map[string]*call)
-	}
-	if c, ok := g.m[key]; ok {
-		c.dups++
-		g.mu.Unlock()
-		c.wg.Wait()
-		return c.val, c.err, true
-	}
-	c := new(call)
-	c.wg.Add(1)
-	g.m[key] = c
-	g.mu.Unlock()
-
-	g.doCall(c, key, fn)
-	return c.val, c.err, c.dups > 0
-}
-
-// DoChan is like Do but returns a channel that will receive the
-// results when they are ready.
-func (g *Group) DoChan(key string, fn func() (interface{}, error)) <-chan Result {
-	ch := make(chan Result, 1)
-	g.mu.Lock()
-	if g.m == nil {
-		g.m = make(map[string]*call)
-	}
-	if c, ok := g.m[key]; ok {
-		c.dups++
-		c.chans = append(c.chans, ch)
-		g.mu.Unlock()
-		return ch
-	}
-	c := &call{chans: []chan<- Result{ch}}
-	c.wg.Add(1)
-	g.m[key] = c
-	g.mu.Unlock()
-
-	go g.doCall(c, key, fn)
-
-	return ch
-}
-
-// doCall handles the single call for a key.
-func (g *Group) doCall(c *call, key string, fn func() (interface{}, error)) {
-	c.val, c.err = fn()
-	c.wg.Done()
-
-	g.mu.Lock()
-	delete(g.m, key)
-	for _, ch := range c.chans {
-		ch <- Result{c.val, c.err, c.dups > 0}
-	}
-	g.mu.Unlock()
-}
-
-// Forget tells the singleflight to forget about a key.  Future calls
-// to Do for this key will call the function rather than waiting for
-// an earlier call to complete.
-func (g *Group) Forget(key string) {
-	g.mu.Lock()
-	delete(g.m, key)
-	g.mu.Unlock()
-}
diff --git a/third_party/gofrontend/libgo/go/internal/singleflight/singleflight_test.go b/third_party/gofrontend/libgo/go/internal/singleflight/singleflight_test.go
deleted file mode 100644
index c0ec024..0000000
--- a/third_party/gofrontend/libgo/go/internal/singleflight/singleflight_test.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package singleflight
-
-import (
-	"errors"
-	"fmt"
-	"sync"
-	"sync/atomic"
-	"testing"
-	"time"
-)
-
-func TestDo(t *testing.T) {
-	var g Group
-	v, err, _ := g.Do("key", func() (interface{}, error) {
-		return "bar", nil
-	})
-	if got, want := fmt.Sprintf("%v (%T)", v, v), "bar (string)"; got != want {
-		t.Errorf("Do = %v; want %v", got, want)
-	}
-	if err != nil {
-		t.Errorf("Do error = %v", err)
-	}
-}
-
-func TestDoErr(t *testing.T) {
-	var g Group
-	someErr := errors.New("Some error")
-	v, err, _ := g.Do("key", func() (interface{}, error) {
-		return nil, someErr
-	})
-	if err != someErr {
-		t.Errorf("Do error = %v; want someErr %v", err, someErr)
-	}
-	if v != nil {
-		t.Errorf("unexpected non-nil value %#v", v)
-	}
-}
-
-func TestDoDupSuppress(t *testing.T) {
-	var g Group
-	var wg1, wg2 sync.WaitGroup
-	c := make(chan string, 1)
-	var calls int32
-	fn := func() (interface{}, error) {
-		if atomic.AddInt32(&calls, 1) == 1 {
-			// First invocation.
-			wg1.Done()
-		}
-		v := <-c
-		c <- v // pump; make available for any future calls
-
-		time.Sleep(10 * time.Millisecond) // let more goroutines enter Do
-
-		return v, nil
-	}
-
-	const n = 10
-	wg1.Add(1)
-	for i := 0; i < n; i++ {
-		wg1.Add(1)
-		wg2.Add(1)
-		go func() {
-			defer wg2.Done()
-			wg1.Done()
-			v, err, _ := g.Do("key", fn)
-			if err != nil {
-				t.Errorf("Do error: %v", err)
-				return
-			}
-			if s, _ := v.(string); s != "bar" {
-				t.Errorf("Do = %T %v; want %q", v, v, "bar")
-			}
-		}()
-	}
-	wg1.Wait()
-	// At least one goroutine is in fn now and all of them have at
-	// least reached the line before the Do.
-	c <- "bar"
-	wg2.Wait()
-	if got := atomic.LoadInt32(&calls); got <= 0 || got >= n {
-		t.Errorf("number of calls = %d; want over 0 and less than %d", got, n)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/internal/syscall/unix/dummy.go b/third_party/gofrontend/libgo/go/internal/syscall/unix/dummy.go
deleted file mode 100644
index a40e6a3..0000000
--- a/third_party/gofrontend/libgo/go/internal/syscall/unix/dummy.go
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package unix
diff --git a/third_party/gofrontend/libgo/go/internal/syscall/unix/getrandom_linux.go b/third_party/gofrontend/libgo/go/internal/syscall/unix/getrandom_linux.go
deleted file mode 100644
index 7388271..0000000
--- a/third_party/gofrontend/libgo/go/internal/syscall/unix/getrandom_linux.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package unix
-
-import (
-	"runtime"
-	"sync/atomic"
-	"syscall"
-	"unsafe"
-)
-
-var randomTrap = map[string]uintptr{
-	"386":     355,
-	"amd64":   318,
-	"arm":     384,
-	"ppc64":   359,
-	"ppc64le": 359,
-}[runtime.GOARCH]
-
-var randomUnsupported int32 // atomic
-
-// GetRandomFlag is a flag supported by the getrandom system call.
-type GetRandomFlag uintptr
-
-const (
-	// GRND_NONBLOCK means return EAGAIN rather than blocking.
-	GRND_NONBLOCK GetRandomFlag = 0x0001
-
-	// GRND_RANDOM means use the /dev/random pool instead of /dev/urandom.
-	GRND_RANDOM GetRandomFlag = 0x0002
-)
-
-// GetRandom calls the Linux getrandom system call.
-// See https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c6e9d6f38894798696f23c8084ca7edbf16ee895
-func GetRandom(p []byte, flags GetRandomFlag) (n int, err error) {
-	if randomTrap == 0 {
-		return 0, syscall.ENOSYS
-	}
-	if len(p) == 0 {
-		return 0, nil
-	}
-	if atomic.LoadInt32(&randomUnsupported) != 0 {
-		return 0, syscall.ENOSYS
-	}
-	r1, _, errno := syscall.Syscall(randomTrap,
-		uintptr(unsafe.Pointer(&p[0])),
-		uintptr(len(p)),
-		uintptr(flags))
-	if errno != 0 {
-		if errno == syscall.ENOSYS {
-			atomic.StoreInt32(&randomUnsupported, 1)
-		}
-		return 0, errno
-	}
-	return int(r1), nil
-}
diff --git a/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/export_test.go b/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/export_test.go
deleted file mode 100644
index 8badf6f..0000000
--- a/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/export_test.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build windows
-
-package registry
-
-func (k Key) SetValue(name string, valtype uint32, data []byte) error {
-	return k.setValue(name, valtype, data)
-}
diff --git a/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/key.go b/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/key.go
deleted file mode 100644
index 62144d3..0000000
--- a/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/key.go
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build windows
-
-// Package registry provides access to the Windows registry.
-//
-// Here is a simple example, opening a registry key and reading a string value from it.
-//
-//	k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
-//	if err != nil {
-//		log.Fatal(err)
-//	}
-//	defer k.Close()
-//
-//	s, _, err := k.GetStringValue("SystemRoot")
-//	if err != nil {
-//		log.Fatal(err)
-//	}
-//	fmt.Printf("Windows system root is %q\n", s)
-//
-// NOTE: This package is a copy of golang.org/x/sys/windows/registry
-// with KeyInfo.ModTime removed to prevent dependency cycles.
-//
-package registry
-
-import (
-	"io"
-	"syscall"
-)
-
-const (
-	// Registry key security and access rights.
-	// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878.aspx
-	// for details.
-	ALL_ACCESS         = 0xf003f
-	CREATE_LINK        = 0x00020
-	CREATE_SUB_KEY     = 0x00004
-	ENUMERATE_SUB_KEYS = 0x00008
-	EXECUTE            = 0x20019
-	NOTIFY             = 0x00010
-	QUERY_VALUE        = 0x00001
-	READ               = 0x20019
-	SET_VALUE          = 0x00002
-	WOW64_32KEY        = 0x00200
-	WOW64_64KEY        = 0x00100
-	WRITE              = 0x20006
-)
-
-// Key is a handle to an open Windows registry key.
-// Keys can be obtained by calling OpenKey; there are
-// also some predefined root keys such as CURRENT_USER.
-// Keys can be used directly in the Windows API.
-type Key syscall.Handle
-
-const (
-	// Windows defines some predefined root keys that are always open.
-	// An application can use these keys as entry points to the registry.
-	// Normally these keys are used in OpenKey to open new keys,
-	// but they can also be used anywhere a Key is required.
-	CLASSES_ROOT   = Key(syscall.HKEY_CLASSES_ROOT)
-	CURRENT_USER   = Key(syscall.HKEY_CURRENT_USER)
-	LOCAL_MACHINE  = Key(syscall.HKEY_LOCAL_MACHINE)
-	USERS          = Key(syscall.HKEY_USERS)
-	CURRENT_CONFIG = Key(syscall.HKEY_CURRENT_CONFIG)
-)
-
-// Close closes open key k.
-func (k Key) Close() error {
-	return syscall.RegCloseKey(syscall.Handle(k))
-}
-
-// OpenKey opens a new key with path name relative to key k.
-// It accepts any open key, including CURRENT_USER and others,
-// and returns the new key and an error.
-// The access parameter specifies desired access rights to the
-// key to be opened.
-func OpenKey(k Key, path string, access uint32) (Key, error) {
-	p, err := syscall.UTF16PtrFromString(path)
-	if err != nil {
-		return 0, err
-	}
-	var subkey syscall.Handle
-	err = syscall.RegOpenKeyEx(syscall.Handle(k), p, 0, access, &subkey)
-	if err != nil {
-		return 0, err
-	}
-	return Key(subkey), nil
-}
-
-// ReadSubKeyNames returns the names of subkeys of key k.
-// The parameter n controls the number of returned names,
-// analogous to the way os.File.Readdirnames works.
-func (k Key) ReadSubKeyNames(n int) ([]string, error) {
-	ki, err := k.Stat()
-	if err != nil {
-		return nil, err
-	}
-	names := make([]string, 0, ki.SubKeyCount)
-	buf := make([]uint16, ki.MaxSubKeyLen+1) // extra room for terminating zero byte
-loopItems:
-	for i := uint32(0); ; i++ {
-		if n > 0 {
-			if len(names) == n {
-				return names, nil
-			}
-		}
-		l := uint32(len(buf))
-		for {
-			err := syscall.RegEnumKeyEx(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil)
-			if err == nil {
-				break
-			}
-			if err == syscall.ERROR_MORE_DATA {
-				// Double buffer size and try again.
-				l = uint32(2 * len(buf))
-				buf = make([]uint16, l)
-				continue
-			}
-			if err == _ERROR_NO_MORE_ITEMS {
-				break loopItems
-			}
-			return names, err
-		}
-		names = append(names, syscall.UTF16ToString(buf[:l]))
-	}
-	if n > len(names) {
-		return names, io.EOF
-	}
-	return names, nil
-}
-
-// CreateKey creates a key named path under open key k.
-// CreateKey returns the new key and a boolean flag that reports
-// whether the key already existed.
-// The access parameter specifies the access rights for the key
-// to be created.
-func CreateKey(k Key, path string, access uint32) (newk Key, openedExisting bool, err error) {
-	var h syscall.Handle
-	var d uint32
-	err = regCreateKeyEx(syscall.Handle(k), syscall.StringToUTF16Ptr(path),
-		0, nil, _REG_OPTION_NON_VOLATILE, access, nil, &h, &d)
-	if err != nil {
-		return 0, false, err
-	}
-	return Key(h), d == _REG_OPENED_EXISTING_KEY, nil
-}
-
-// DeleteKey deletes the subkey path of key k and its values.
-func DeleteKey(k Key, path string) error {
-	return regDeleteKey(syscall.Handle(k), syscall.StringToUTF16Ptr(path))
-}
-
-// A KeyInfo describes the statistics of a key. It is returned by Stat.
-type KeyInfo struct {
-	SubKeyCount     uint32
-	MaxSubKeyLen    uint32 // size of the key's subkey with the longest name, in Unicode characters, not including the terminating zero byte
-	ValueCount      uint32
-	MaxValueNameLen uint32 // size of the key's longest value name, in Unicode characters, not including the terminating zero byte
-	MaxValueLen     uint32 // longest data component among the key's values, in bytes
-	lastWriteTime   syscall.Filetime
-}
-
-// Stat retrieves information about the open key k.
-func (k Key) Stat() (*KeyInfo, error) {
-	var ki KeyInfo
-	err := syscall.RegQueryInfoKey(syscall.Handle(k), nil, nil, nil,
-		&ki.SubKeyCount, &ki.MaxSubKeyLen, nil, &ki.ValueCount,
-		&ki.MaxValueNameLen, &ki.MaxValueLen, nil, &ki.lastWriteTime)
-	if err != nil {
-		return nil, err
-	}
-	return &ki, nil
-}
diff --git a/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/registry_test.go b/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/registry_test.go
deleted file mode 100644
index 07eccb2..0000000
--- a/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/registry_test.go
+++ /dev/null
@@ -1,678 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build windows
-
-package registry_test
-
-import (
-	"bytes"
-	"crypto/rand"
-	"os"
-	"syscall"
-	"testing"
-
-	"internal/syscall/windows/registry"
-)
-
-func randKeyName(prefix string) string {
-	const numbers = "0123456789"
-	buf := make([]byte, 10)
-	rand.Read(buf)
-	for i, b := range buf {
-		buf[i] = numbers[b%byte(len(numbers))]
-	}
-	return prefix + string(buf)
-}
-
-func TestReadSubKeyNames(t *testing.T) {
-	k, err := registry.OpenKey(registry.CLASSES_ROOT, "TypeLib", registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer k.Close()
-
-	names, err := k.ReadSubKeyNames(-1)
-	if err != nil {
-		t.Fatal(err)
-	}
-	var foundStdOle bool
-	for _, name := range names {
-		// Every PC has "stdole 2.0 OLE Automation" library installed.
-		if name == "{00020430-0000-0000-C000-000000000046}" {
-			foundStdOle = true
-		}
-	}
-	if !foundStdOle {
-		t.Fatal("could not find stdole 2.0 OLE Automation")
-	}
-}
-
-func TestCreateOpenDeleteKey(t *testing.T) {
-	k, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer k.Close()
-
-	testKName := randKeyName("TestCreateOpenDeleteKey_")
-
-	testK, exist, err := registry.CreateKey(k, testKName, registry.CREATE_SUB_KEY)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer testK.Close()
-
-	if exist {
-		t.Fatalf("key %q already exists", testKName)
-	}
-
-	testKAgain, exist, err := registry.CreateKey(k, testKName, registry.CREATE_SUB_KEY)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer testKAgain.Close()
-
-	if !exist {
-		t.Fatalf("key %q should already exist", testKName)
-	}
-
-	testKOpened, err := registry.OpenKey(k, testKName, registry.ENUMERATE_SUB_KEYS)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer testKOpened.Close()
-
-	err = registry.DeleteKey(k, testKName)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	testKOpenedAgain, err := registry.OpenKey(k, testKName, registry.ENUMERATE_SUB_KEYS)
-	if err == nil {
-		defer testKOpenedAgain.Close()
-		t.Fatalf("key %q should already been deleted", testKName)
-	}
-	if err != registry.ErrNotExist {
-		t.Fatalf(`unexpected error ("not exist" expected): %v`, err)
-	}
-}
-
-func equalStringSlice(a, b []string) bool {
-	if len(a) != len(b) {
-		return false
-	}
-	if a == nil {
-		return true
-	}
-	for i := range a {
-		if a[i] != b[i] {
-			return false
-		}
-	}
-	return true
-}
-
-type ValueTest struct {
-	Type     uint32
-	Name     string
-	Value    interface{}
-	WillFail bool
-}
-
-var ValueTests = []ValueTest{
-	{Type: registry.SZ, Name: "String1", Value: ""},
-	{Type: registry.SZ, Name: "String2", Value: "\000", WillFail: true},
-	{Type: registry.SZ, Name: "String3", Value: "Hello World"},
-	{Type: registry.SZ, Name: "String4", Value: "Hello World\000", WillFail: true},
-	{Type: registry.EXPAND_SZ, Name: "ExpString1", Value: ""},
-	{Type: registry.EXPAND_SZ, Name: "ExpString2", Value: "\000", WillFail: true},
-	{Type: registry.EXPAND_SZ, Name: "ExpString3", Value: "Hello World"},
-	{Type: registry.EXPAND_SZ, Name: "ExpString4", Value: "Hello\000World", WillFail: true},
-	{Type: registry.EXPAND_SZ, Name: "ExpString5", Value: "%PATH%"},
-	{Type: registry.EXPAND_SZ, Name: "ExpString6", Value: "%NO_SUCH_VARIABLE%"},
-	{Type: registry.EXPAND_SZ, Name: "ExpString7", Value: "%PATH%;."},
-	{Type: registry.BINARY, Name: "Binary1", Value: []byte{}},
-	{Type: registry.BINARY, Name: "Binary2", Value: []byte{1, 2, 3}},
-	{Type: registry.BINARY, Name: "Binary3", Value: []byte{3, 2, 1, 0, 1, 2, 3}},
-	{Type: registry.DWORD, Name: "Dword1", Value: uint64(0)},
-	{Type: registry.DWORD, Name: "Dword2", Value: uint64(1)},
-	{Type: registry.DWORD, Name: "Dword3", Value: uint64(0xff)},
-	{Type: registry.DWORD, Name: "Dword4", Value: uint64(0xffff)},
-	{Type: registry.QWORD, Name: "Qword1", Value: uint64(0)},
-	{Type: registry.QWORD, Name: "Qword2", Value: uint64(1)},
-	{Type: registry.QWORD, Name: "Qword3", Value: uint64(0xff)},
-	{Type: registry.QWORD, Name: "Qword4", Value: uint64(0xffff)},
-	{Type: registry.QWORD, Name: "Qword5", Value: uint64(0xffffff)},
-	{Type: registry.QWORD, Name: "Qword6", Value: uint64(0xffffffff)},
-	{Type: registry.MULTI_SZ, Name: "MultiString1", Value: []string{"a", "b", "c"}},
-	{Type: registry.MULTI_SZ, Name: "MultiString2", Value: []string{"abc", "", "cba"}},
-	{Type: registry.MULTI_SZ, Name: "MultiString3", Value: []string{""}},
-	{Type: registry.MULTI_SZ, Name: "MultiString4", Value: []string{"abcdef"}},
-	{Type: registry.MULTI_SZ, Name: "MultiString5", Value: []string{"\000"}, WillFail: true},
-	{Type: registry.MULTI_SZ, Name: "MultiString6", Value: []string{"a\000b"}, WillFail: true},
-	{Type: registry.MULTI_SZ, Name: "MultiString7", Value: []string{"ab", "\000", "cd"}, WillFail: true},
-	{Type: registry.MULTI_SZ, Name: "MultiString8", Value: []string{"\000", "cd"}, WillFail: true},
-	{Type: registry.MULTI_SZ, Name: "MultiString9", Value: []string{"ab", "\000"}, WillFail: true},
-}
-
-func setValues(t *testing.T, k registry.Key) {
-	for _, test := range ValueTests {
-		var err error
-		switch test.Type {
-		case registry.SZ:
-			err = k.SetStringValue(test.Name, test.Value.(string))
-		case registry.EXPAND_SZ:
-			err = k.SetExpandStringValue(test.Name, test.Value.(string))
-		case registry.MULTI_SZ:
-			err = k.SetStringsValue(test.Name, test.Value.([]string))
-		case registry.BINARY:
-			err = k.SetBinaryValue(test.Name, test.Value.([]byte))
-		case registry.DWORD:
-			err = k.SetDWordValue(test.Name, uint32(test.Value.(uint64)))
-		case registry.QWORD:
-			err = k.SetQWordValue(test.Name, test.Value.(uint64))
-		default:
-			t.Fatalf("unsupported type %d for %s value", test.Type, test.Name)
-		}
-		if test.WillFail {
-			if err == nil {
-				t.Fatalf("setting %s value %q should fail, but succeeded", test.Name, test.Value)
-			}
-		} else {
-			if err != nil {
-				t.Fatal(err)
-			}
-		}
-	}
-}
-
-func enumerateValues(t *testing.T, k registry.Key) {
-	names, err := k.ReadValueNames(-1)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	haveNames := make(map[string]bool)
-	for _, n := range names {
-		haveNames[n] = false
-	}
-	for _, test := range ValueTests {
-		wantFound := !test.WillFail
-		_, haveFound := haveNames[test.Name]
-		if wantFound && !haveFound {
-			t.Errorf("value %s is not found while enumerating", test.Name)
-		}
-		if haveFound && !wantFound {
-			t.Errorf("value %s is found while enumerating, but expected to fail", test.Name)
-		}
-		if haveFound {
-			delete(haveNames, test.Name)
-		}
-	}
-	for n, v := range haveNames {
-		t.Errorf("value %s (%v) is found while enumerating, but has not been cretaed", n, v)
-	}
-}
-
-func testErrNotExist(t *testing.T, name string, err error) {
-	if err == nil {
-		t.Errorf("%s value should not exist", name)
-		return
-	}
-	if err != registry.ErrNotExist {
-		t.Errorf("reading %s value should return 'not exist' error, but got: %s", name, err)
-		return
-	}
-}
-
-func testErrUnexpectedType(t *testing.T, test ValueTest, gottype uint32, err error) {
-	if err == nil {
-		t.Errorf("GetXValue(%q) should not succeed", test.Name)
-		return
-	}
-	if err != registry.ErrUnexpectedType {
-		t.Errorf("reading %s value should return 'unexpected key value type' error, but got: %s", test.Name, err)
-		return
-	}
-	if gottype != test.Type {
-		t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
-		return
-	}
-}
-
-func testGetStringValue(t *testing.T, k registry.Key, test ValueTest) {
-	got, gottype, err := k.GetStringValue(test.Name)
-	if err != nil {
-		t.Errorf("GetStringValue(%s) failed: %v", test.Name, err)
-		return
-	}
-	if got != test.Value {
-		t.Errorf("want %s value %q, got %q", test.Name, test.Value, got)
-		return
-	}
-	if gottype != test.Type {
-		t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
-		return
-	}
-	if gottype == registry.EXPAND_SZ {
-		_, err = registry.ExpandString(got)
-		if err != nil {
-			t.Errorf("ExpandString(%s) failed: %v", got, err)
-			return
-		}
-	}
-}
-
-func testGetIntegerValue(t *testing.T, k registry.Key, test ValueTest) {
-	got, gottype, err := k.GetIntegerValue(test.Name)
-	if err != nil {
-		t.Errorf("GetIntegerValue(%s) failed: %v", test.Name, err)
-		return
-	}
-	if got != test.Value.(uint64) {
-		t.Errorf("want %s value %v, got %v", test.Name, test.Value, got)
-		return
-	}
-	if gottype != test.Type {
-		t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
-		return
-	}
-}
-
-func testGetBinaryValue(t *testing.T, k registry.Key, test ValueTest) {
-	got, gottype, err := k.GetBinaryValue(test.Name)
-	if err != nil {
-		t.Errorf("GetBinaryValue(%s) failed: %v", test.Name, err)
-		return
-	}
-	if !bytes.Equal(got, test.Value.([]byte)) {
-		t.Errorf("want %s value %v, got %v", test.Name, test.Value, got)
-		return
-	}
-	if gottype != test.Type {
-		t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
-		return
-	}
-}
-
-func testGetStringsValue(t *testing.T, k registry.Key, test ValueTest) {
-	got, gottype, err := k.GetStringsValue(test.Name)
-	if err != nil {
-		t.Errorf("GetStringsValue(%s) failed: %v", test.Name, err)
-		return
-	}
-	if !equalStringSlice(got, test.Value.([]string)) {
-		t.Errorf("want %s value %#v, got %#v", test.Name, test.Value, got)
-		return
-	}
-	if gottype != test.Type {
-		t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
-		return
-	}
-}
-
-func testGetValue(t *testing.T, k registry.Key, test ValueTest, size int) {
-	if size <= 0 {
-		return
-	}
-	// read data with no buffer
-	gotsize, gottype, err := k.GetValue(test.Name, nil)
-	if err != nil {
-		t.Errorf("GetValue(%s, [%d]byte) failed: %v", test.Name, size, err)
-		return
-	}
-	if gotsize != size {
-		t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize)
-		return
-	}
-	if gottype != test.Type {
-		t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
-		return
-	}
-	// read data with short buffer
-	gotsize, gottype, err = k.GetValue(test.Name, make([]byte, size-1))
-	if err == nil {
-		t.Errorf("GetValue(%s, [%d]byte) should fail, but suceeded", test.Name, size-1)
-		return
-	}
-	if err != registry.ErrShortBuffer {
-		t.Errorf("reading %s value should return 'short buffer' error, but got: %s", test.Name, err)
-		return
-	}
-	if gotsize != size {
-		t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize)
-		return
-	}
-	if gottype != test.Type {
-		t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
-		return
-	}
-	// read full data
-	gotsize, gottype, err = k.GetValue(test.Name, make([]byte, size))
-	if err != nil {
-		t.Errorf("GetValue(%s, [%d]byte) failed: %v", test.Name, size, err)
-		return
-	}
-	if gotsize != size {
-		t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize)
-		return
-	}
-	if gottype != test.Type {
-		t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype)
-		return
-	}
-	// check GetValue returns ErrNotExist as required
-	_, _, err = k.GetValue(test.Name+"_not_there", make([]byte, size))
-	if err == nil {
-		t.Errorf("GetValue(%q) should not succeed", test.Name)
-		return
-	}
-	if err != registry.ErrNotExist {
-		t.Errorf("GetValue(%q) should return 'not exist' error, but got: %s", test.Name, err)
-		return
-	}
-}
-
-func testValues(t *testing.T, k registry.Key) {
-	for _, test := range ValueTests {
-		switch test.Type {
-		case registry.SZ, registry.EXPAND_SZ:
-			if test.WillFail {
-				_, _, err := k.GetStringValue(test.Name)
-				testErrNotExist(t, test.Name, err)
-			} else {
-				testGetStringValue(t, k, test)
-				_, gottype, err := k.GetIntegerValue(test.Name)
-				testErrUnexpectedType(t, test, gottype, err)
-				// Size of utf16 string in bytes is not perfect,
-				// but correct for current test values.
-				// Size also includes terminating 0.
-				testGetValue(t, k, test, (len(test.Value.(string))+1)*2)
-			}
-			_, _, err := k.GetStringValue(test.Name + "_string_not_created")
-			testErrNotExist(t, test.Name+"_string_not_created", err)
-		case registry.DWORD, registry.QWORD:
-			testGetIntegerValue(t, k, test)
-			_, gottype, err := k.GetBinaryValue(test.Name)
-			testErrUnexpectedType(t, test, gottype, err)
-			_, _, err = k.GetIntegerValue(test.Name + "_int_not_created")
-			testErrNotExist(t, test.Name+"_int_not_created", err)
-			size := 8
-			if test.Type == registry.DWORD {
-				size = 4
-			}
-			testGetValue(t, k, test, size)
-		case registry.BINARY:
-			testGetBinaryValue(t, k, test)
-			_, gottype, err := k.GetStringsValue(test.Name)
-			testErrUnexpectedType(t, test, gottype, err)
-			_, _, err = k.GetBinaryValue(test.Name + "_byte_not_created")
-			testErrNotExist(t, test.Name+"_byte_not_created", err)
-			testGetValue(t, k, test, len(test.Value.([]byte)))
-		case registry.MULTI_SZ:
-			if test.WillFail {
-				_, _, err := k.GetStringsValue(test.Name)
-				testErrNotExist(t, test.Name, err)
-			} else {
-				testGetStringsValue(t, k, test)
-				_, gottype, err := k.GetStringValue(test.Name)
-				testErrUnexpectedType(t, test, gottype, err)
-				size := 0
-				for _, s := range test.Value.([]string) {
-					size += len(s) + 1 // nil terminated
-				}
-				size += 1 // extra nil at the end
-				size *= 2 // count bytes, not uint16
-				testGetValue(t, k, test, size)
-			}
-			_, _, err := k.GetStringsValue(test.Name + "_strings_not_created")
-			testErrNotExist(t, test.Name+"_strings_not_created", err)
-		default:
-			t.Errorf("unsupported type %d for %s value", test.Type, test.Name)
-			continue
-		}
-	}
-}
-
-func testStat(t *testing.T, k registry.Key) {
-	subk, _, err := registry.CreateKey(k, "subkey", registry.CREATE_SUB_KEY)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	defer subk.Close()
-
-	defer registry.DeleteKey(k, "subkey")
-
-	ki, err := k.Stat()
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	if ki.SubKeyCount != 1 {
-		t.Error("key must have 1 subkey")
-	}
-	if ki.MaxSubKeyLen != 6 {
-		t.Error("key max subkey name length must be 6")
-	}
-	if ki.ValueCount != 24 {
-		t.Errorf("key must have 24 values, but is %d", ki.ValueCount)
-	}
-	if ki.MaxValueNameLen != 12 {
-		t.Errorf("key max value name length must be 10, but is %d", ki.MaxValueNameLen)
-	}
-	if ki.MaxValueLen != 38 {
-		t.Errorf("key max value length must be 38, but is %d", ki.MaxValueLen)
-	}
-}
-
-func deleteValues(t *testing.T, k registry.Key) {
-	for _, test := range ValueTests {
-		if test.WillFail {
-			continue
-		}
-		err := k.DeleteValue(test.Name)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-	}
-	names, err := k.ReadValueNames(-1)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	if len(names) != 0 {
-		t.Errorf("some values remain after deletion: %v", names)
-	}
-}
-
-func TestValues(t *testing.T) {
-	softwareK, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer softwareK.Close()
-
-	testKName := randKeyName("TestValues_")
-
-	k, exist, err := registry.CreateKey(softwareK, testKName, registry.CREATE_SUB_KEY|registry.QUERY_VALUE|registry.SET_VALUE)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer k.Close()
-
-	if exist {
-		t.Fatalf("key %q already exists", testKName)
-	}
-
-	defer registry.DeleteKey(softwareK, testKName)
-
-	setValues(t, k)
-
-	enumerateValues(t, k)
-
-	testValues(t, k)
-
-	testStat(t, k)
-
-	deleteValues(t, k)
-}
-
-func walkKey(t *testing.T, k registry.Key, kname string) {
-	names, err := k.ReadValueNames(-1)
-	if err != nil {
-		t.Fatalf("reading value names of %s failed: %v", kname, err)
-	}
-	for _, name := range names {
-		_, valtype, err := k.GetValue(name, nil)
-		if err != nil {
-			t.Fatalf("reading value type of %s of %s failed: %v", name, kname, err)
-		}
-		switch valtype {
-		case registry.NONE:
-		case registry.SZ:
-			_, _, err := k.GetStringValue(name)
-			if err != nil {
-				t.Error(err)
-			}
-		case registry.EXPAND_SZ:
-			s, _, err := k.GetStringValue(name)
-			if err != nil {
-				t.Error(err)
-			}
-			_, err = registry.ExpandString(s)
-			if err != nil {
-				t.Error(err)
-			}
-		case registry.DWORD, registry.QWORD:
-			_, _, err := k.GetIntegerValue(name)
-			if err != nil {
-				t.Error(err)
-			}
-		case registry.BINARY:
-			_, _, err := k.GetBinaryValue(name)
-			if err != nil {
-				t.Error(err)
-			}
-		case registry.MULTI_SZ:
-			_, _, err := k.GetStringsValue(name)
-			if err != nil {
-				t.Error(err)
-			}
-		case registry.FULL_RESOURCE_DESCRIPTOR, registry.RESOURCE_LIST, registry.RESOURCE_REQUIREMENTS_LIST:
-			// TODO: not implemented
-		default:
-			t.Fatalf("value type %d of %s of %s failed: %v", valtype, name, kname, err)
-		}
-	}
-
-	names, err = k.ReadSubKeyNames(-1)
-	if err != nil {
-		t.Fatalf("reading sub-keys of %s failed: %v", kname, err)
-	}
-	for _, name := range names {
-		func() {
-			subk, err := registry.OpenKey(k, name, registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE)
-			if err != nil {
-				if err == syscall.ERROR_ACCESS_DENIED {
-					// ignore error, if we are not allowed to access this key
-					return
-				}
-				t.Fatalf("opening sub-keys %s of %s failed: %v", name, kname, err)
-			}
-			defer subk.Close()
-
-			walkKey(t, subk, kname+`\`+name)
-		}()
-	}
-}
-
-func TestWalkFullRegistry(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping long running test in short mode")
-	}
-	walkKey(t, registry.CLASSES_ROOT, "CLASSES_ROOT")
-	walkKey(t, registry.CURRENT_USER, "CURRENT_USER")
-	walkKey(t, registry.LOCAL_MACHINE, "LOCAL_MACHINE")
-	walkKey(t, registry.USERS, "USERS")
-	walkKey(t, registry.CURRENT_CONFIG, "CURRENT_CONFIG")
-}
-
-func TestExpandString(t *testing.T) {
-	got, err := registry.ExpandString("%PATH%")
-	if err != nil {
-		t.Fatal(err)
-	}
-	want := os.Getenv("PATH")
-	if got != want {
-		t.Errorf("want %q string expanded, got %q", want, got)
-	}
-}
-
-func TestInvalidValues(t *testing.T) {
-	softwareK, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer softwareK.Close()
-
-	testKName := randKeyName("TestInvalidValues_")
-
-	k, exist, err := registry.CreateKey(softwareK, testKName, registry.CREATE_SUB_KEY|registry.QUERY_VALUE|registry.SET_VALUE)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer k.Close()
-
-	if exist {
-		t.Fatalf("key %q already exists", testKName)
-	}
-
-	defer registry.DeleteKey(softwareK, testKName)
-
-	var tests = []struct {
-		Type uint32
-		Name string
-		Data []byte
-	}{
-		{registry.DWORD, "Dword1", nil},
-		{registry.DWORD, "Dword2", []byte{1, 2, 3}},
-		{registry.QWORD, "Qword1", nil},
-		{registry.QWORD, "Qword2", []byte{1, 2, 3}},
-		{registry.QWORD, "Qword3", []byte{1, 2, 3, 4, 5, 6, 7}},
-		{registry.MULTI_SZ, "MultiString1", nil},
-		{registry.MULTI_SZ, "MultiString2", []byte{0}},
-		{registry.MULTI_SZ, "MultiString3", []byte{'a', 'b', 0}},
-		{registry.MULTI_SZ, "MultiString4", []byte{'a', 0, 0, 'b', 0}},
-		{registry.MULTI_SZ, "MultiString5", []byte{'a', 0, 0}},
-	}
-
-	for _, test := range tests {
-		err := k.SetValue(test.Name, test.Type, test.Data)
-		if err != nil {
-			t.Fatalf("SetValue for %q failed: %v", test.Name, err)
-		}
-	}
-
-	for _, test := range tests {
-		switch test.Type {
-		case registry.DWORD, registry.QWORD:
-			value, valType, err := k.GetIntegerValue(test.Name)
-			if err == nil {
-				t.Errorf("GetIntegerValue(%q) succeeded. Returns type=%d value=%v", test.Name, valType, value)
-			}
-		case registry.MULTI_SZ:
-			value, valType, err := k.GetStringsValue(test.Name)
-			if err == nil {
-				if len(value) != 0 {
-					t.Errorf("GetStringsValue(%q) succeeded. Returns type=%d value=%v", test.Name, valType, value)
-				}
-			}
-		default:
-			t.Errorf("unsupported type %d for %s value", test.Type, test.Name)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/syscall.go b/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/syscall.go
deleted file mode 100644
index 38e573f..0000000
--- a/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/syscall.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build windows
-
-package registry
-
-import "syscall"
-
-//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go
-
-const (
-	_REG_OPTION_NON_VOLATILE = 0
-
-	_REG_CREATED_NEW_KEY     = 1
-	_REG_OPENED_EXISTING_KEY = 2
-
-	_ERROR_NO_MORE_ITEMS syscall.Errno = 259
-)
-
-//sys	regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) = advapi32.RegCreateKeyExW
-//sys	regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) = advapi32.RegDeleteKeyW
-//sys	regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) = advapi32.RegSetValueExW
-//sys	regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegEnumValueW
-//sys	regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) = advapi32.RegDeleteValueW
-
-//sys	expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW
diff --git a/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/value.go b/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/value.go
deleted file mode 100644
index f4bb1b3..0000000
--- a/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/value.go
+++ /dev/null
@@ -1,329 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build windows
-
-package registry
-
-import (
-	"errors"
-	"io"
-	"syscall"
-	"unicode/utf16"
-	"unsafe"
-)
-
-const (
-	// Registry value types.
-	NONE                       = 0
-	SZ                         = 1
-	EXPAND_SZ                  = 2
-	BINARY                     = 3
-	DWORD                      = 4
-	DWORD_BIG_ENDIAN           = 5
-	LINK                       = 6
-	MULTI_SZ                   = 7
-	RESOURCE_LIST              = 8
-	FULL_RESOURCE_DESCRIPTOR   = 9
-	RESOURCE_REQUIREMENTS_LIST = 10
-	QWORD                      = 11
-)
-
-var (
-	// ErrShortBuffer is returned when the buffer was too short for the operation.
-	ErrShortBuffer = syscall.ERROR_MORE_DATA
-
-	// ErrNotExist is returned when a registry key or value does not exist.
-	ErrNotExist = syscall.ERROR_FILE_NOT_FOUND
-
-	// ErrUnexpectedType is returned by Get*Value when the value's type was unexpected.
-	ErrUnexpectedType = errors.New("unexpected key value type")
-)
-
-// GetValue retrieves the type and data for the specified value associated
-// with an open key k. It fills up buffer buf and returns the retrieved
-// byte count n. If buf is too small to fit the stored value it returns
-// ErrShortBuffer error along with the required buffer size n.
-// If no buffer is provided, it returns true and actual buffer size n.
-// If no buffer is provided, GetValue returns the value's type only.
-// If the value does not exist, the error returned is ErrNotExist.
-//
-// GetValue is a low level function. If value's type is known, use the appropriate
-// Get*Value function instead.
-func (k Key) GetValue(name string, buf []byte) (n int, valtype uint32, err error) {
-	pname, err := syscall.UTF16PtrFromString(name)
-	if err != nil {
-		return 0, 0, err
-	}
-	var pbuf *byte
-	if len(buf) > 0 {
-		pbuf = (*byte)(unsafe.Pointer(&buf[0]))
-	}
-	l := uint32(len(buf))
-	err = syscall.RegQueryValueEx(syscall.Handle(k), pname, nil, &valtype, pbuf, &l)
-	if err != nil {
-		return int(l), valtype, err
-	}
-	return int(l), valtype, nil
-}
-
-func (k Key) getValue(name string, buf []byte) (date []byte, valtype uint32, err error) {
-	p, err := syscall.UTF16PtrFromString(name)
-	if err != nil {
-		return nil, 0, err
-	}
-	var t uint32
-	n := uint32(len(buf))
-	for {
-		err = syscall.RegQueryValueEx(syscall.Handle(k), p, nil, &t, (*byte)(unsafe.Pointer(&buf[0])), &n)
-		if err == nil {
-			return buf[:n], t, nil
-		}
-		if err != syscall.ERROR_MORE_DATA {
-			return nil, 0, err
-		}
-		if n <= uint32(len(buf)) {
-			return nil, 0, err
-		}
-		buf = make([]byte, n)
-	}
-}
-
-// GetStringValue retrieves the string value for the specified
-// value name associated with an open key k. It also returns the value's type.
-// If value does not exist, GetStringValue returns ErrNotExist.
-// If value is not SZ or EXPAND_SZ, it will return the correct value
-// type and ErrUnexpectedType.
-func (k Key) GetStringValue(name string) (val string, valtype uint32, err error) {
-	data, typ, err2 := k.getValue(name, make([]byte, 64))
-	if err2 != nil {
-		return "", typ, err2
-	}
-	switch typ {
-	case SZ, EXPAND_SZ:
-	default:
-		return "", typ, ErrUnexpectedType
-	}
-	if len(data) == 0 {
-		return "", typ, nil
-	}
-	u := (*[1 << 10]uint16)(unsafe.Pointer(&data[0]))[:]
-	return syscall.UTF16ToString(u), typ, nil
-}
-
-// ExpandString expands environment-variable strings and replaces
-// them with the values defined for the current user.
-// Use ExpandString to expand EXPAND_SZ strings.
-func ExpandString(value string) (string, error) {
-	if value == "" {
-		return "", nil
-	}
-	p, err := syscall.UTF16PtrFromString(value)
-	if err != nil {
-		return "", err
-	}
-	r := make([]uint16, 100)
-	for {
-		n, err := expandEnvironmentStrings(p, &r[0], uint32(len(r)))
-		if err != nil {
-			return "", err
-		}
-		if n <= uint32(len(r)) {
-			u := (*[1 << 15]uint16)(unsafe.Pointer(&r[0]))[:]
-			return syscall.UTF16ToString(u), nil
-		}
-		r = make([]uint16, n)
-	}
-}
-
-// GetStringsValue retrieves the []string value for the specified
-// value name associated with an open key k. It also returns the value's type.
-// If value does not exist, GetStringsValue returns ErrNotExist.
-// If value is not MULTI_SZ, it will return the correct value
-// type and ErrUnexpectedType.
-func (k Key) GetStringsValue(name string) (val []string, valtype uint32, err error) {
-	data, typ, err2 := k.getValue(name, make([]byte, 64))
-	if err2 != nil {
-		return nil, typ, err2
-	}
-	if typ != MULTI_SZ {
-		return nil, typ, ErrUnexpectedType
-	}
-	if len(data) == 0 {
-		return nil, typ, nil
-	}
-	p := (*[1 << 24]uint16)(unsafe.Pointer(&data[0]))[:len(data)/2]
-	if len(p) == 0 {
-		return nil, typ, nil
-	}
-	if p[len(p)-1] == 0 {
-		p = p[:len(p)-1] // remove terminating null
-	}
-	val = make([]string, 0, 5)
-	from := 0
-	for i, c := range p {
-		if c == 0 {
-			val = append(val, string(utf16.Decode(p[from:i])))
-			from = i + 1
-		}
-	}
-	return val, typ, nil
-}
-
-// GetIntegerValue retrieves the integer value for the specified
-// value name associated with an open key k. It also returns the value's type.
-// If value does not exist, GetIntegerValue returns ErrNotExist.
-// If value is not DWORD or QWORD, it will return the correct value
-// type and ErrUnexpectedType.
-func (k Key) GetIntegerValue(name string) (val uint64, valtype uint32, err error) {
-	data, typ, err2 := k.getValue(name, make([]byte, 8))
-	if err2 != nil {
-		return 0, typ, err2
-	}
-	switch typ {
-	case DWORD:
-		if len(data) != 4 {
-			return 0, typ, errors.New("DWORD value is not 4 bytes long")
-		}
-		return uint64(*(*uint32)(unsafe.Pointer(&data[0]))), DWORD, nil
-	case QWORD:
-		if len(data) != 8 {
-			return 0, typ, errors.New("QWORD value is not 8 bytes long")
-		}
-		return uint64(*(*uint64)(unsafe.Pointer(&data[0]))), QWORD, nil
-	default:
-		return 0, typ, ErrUnexpectedType
-	}
-}
-
-// GetBinaryValue retrieves the binary value for the specified
-// value name associated with an open key k. It also returns the value's type.
-// If value does not exist, GetBinaryValue returns ErrNotExist.
-// If value is not BINARY, it will return the correct value
-// type and ErrUnexpectedType.
-func (k Key) GetBinaryValue(name string) (val []byte, valtype uint32, err error) {
-	data, typ, err2 := k.getValue(name, make([]byte, 64))
-	if err2 != nil {
-		return nil, typ, err2
-	}
-	if typ != BINARY {
-		return nil, typ, ErrUnexpectedType
-	}
-	return data, typ, nil
-}
-
-func (k Key) setValue(name string, valtype uint32, data []byte) error {
-	p, err := syscall.UTF16PtrFromString(name)
-	if err != nil {
-		return err
-	}
-	if len(data) == 0 {
-		return regSetValueEx(syscall.Handle(k), p, 0, valtype, nil, 0)
-	}
-	return regSetValueEx(syscall.Handle(k), p, 0, valtype, &data[0], uint32(len(data)))
-}
-
-// SetDWordValue sets the data and type of a name value
-// under key k to value and DWORD.
-func (k Key) SetDWordValue(name string, value uint32) error {
-	return k.setValue(name, DWORD, (*[4]byte)(unsafe.Pointer(&value))[:])
-}
-
-// SetQWordValue sets the data and type of a name value
-// under key k to value and QWORD.
-func (k Key) SetQWordValue(name string, value uint64) error {
-	return k.setValue(name, QWORD, (*[8]byte)(unsafe.Pointer(&value))[:])
-}
-
-func (k Key) setStringValue(name string, valtype uint32, value string) error {
-	v, err := syscall.UTF16FromString(value)
-	if err != nil {
-		return err
-	}
-	buf := (*[1 << 10]byte)(unsafe.Pointer(&v[0]))[:len(v)*2]
-	return k.setValue(name, valtype, buf)
-}
-
-// SetStringValue sets the data and type of a name value
-// under key k to value and SZ. The value must not contain a zero byte.
-func (k Key) SetStringValue(name, value string) error {
-	return k.setStringValue(name, SZ, value)
-}
-
-// SetExpandStringValue sets the data and type of a name value
-// under key k to value and EXPAND_SZ. The value must not contain a zero byte.
-func (k Key) SetExpandStringValue(name, value string) error {
-	return k.setStringValue(name, EXPAND_SZ, value)
-}
-
-// SetStringsValue sets the data and type of a name value
-// under key k to value and MULTI_SZ. The value strings
-// must not contain a zero byte.
-func (k Key) SetStringsValue(name string, value []string) error {
-	ss := ""
-	for _, s := range value {
-		for i := 0; i < len(s); i++ {
-			if s[i] == 0 {
-				return errors.New("string cannot have 0 inside")
-			}
-		}
-		ss += s + "\x00"
-	}
-	v := utf16.Encode([]rune(ss + "\x00"))
-	buf := (*[1 << 10]byte)(unsafe.Pointer(&v[0]))[:len(v)*2]
-	return k.setValue(name, MULTI_SZ, buf)
-}
-
-// SetBinaryValue sets the data and type of a name value
-// under key k to value and BINARY.
-func (k Key) SetBinaryValue(name string, value []byte) error {
-	return k.setValue(name, BINARY, value)
-}
-
-// DeleteValue removes a named value from the key k.
-func (k Key) DeleteValue(name string) error {
-	return regDeleteValue(syscall.Handle(k), syscall.StringToUTF16Ptr(name))
-}
-
-// ReadValueNames returns the value names of key k.
-// The parameter n controls the number of returned names,
-// analogous to the way os.File.Readdirnames works.
-func (k Key) ReadValueNames(n int) ([]string, error) {
-	ki, err := k.Stat()
-	if err != nil {
-		return nil, err
-	}
-	names := make([]string, 0, ki.ValueCount)
-	buf := make([]uint16, ki.MaxValueNameLen+1) // extra room for terminating null character
-loopItems:
-	for i := uint32(0); ; i++ {
-		if n > 0 {
-			if len(names) == n {
-				return names, nil
-			}
-		}
-		l := uint32(len(buf))
-		for {
-			err := regEnumValue(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil)
-			if err == nil {
-				break
-			}
-			if err == syscall.ERROR_MORE_DATA {
-				// Double buffer size and try again.
-				l = uint32(2 * len(buf))
-				buf = make([]uint16, l)
-				continue
-			}
-			if err == _ERROR_NO_MORE_ITEMS {
-				break loopItems
-			}
-			return names, err
-		}
-		names = append(names, syscall.UTF16ToString(buf[:l]))
-	}
-	if n > len(names) {
-		return names, io.EOF
-	}
-	return names, nil
-}
diff --git a/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/zsyscall_windows.go b/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/zsyscall_windows.go
deleted file mode 100644
index 2b3de63..0000000
--- a/third_party/gofrontend/libgo/go/internal/syscall/windows/registry/zsyscall_windows.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT
-
-package registry
-
-import "unsafe"
-import "syscall"
-
-var _ unsafe.Pointer
-
-var (
-	modadvapi32 = syscall.NewLazyDLL("advapi32.dll")
-	modkernel32 = syscall.NewLazyDLL("kernel32.dll")
-
-	procRegCreateKeyExW           = modadvapi32.NewProc("RegCreateKeyExW")
-	procRegDeleteKeyW             = modadvapi32.NewProc("RegDeleteKeyW")
-	procRegSetValueExW            = modadvapi32.NewProc("RegSetValueExW")
-	procRegEnumValueW             = modadvapi32.NewProc("RegEnumValueW")
-	procRegDeleteValueW           = modadvapi32.NewProc("RegDeleteValueW")
-	procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW")
-)
-
-func regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) {
-	r0, _, _ := syscall.Syscall9(procRegCreateKeyExW.Addr(), 9, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(reserved), uintptr(unsafe.Pointer(class)), uintptr(options), uintptr(desired), uintptr(unsafe.Pointer(sa)), uintptr(unsafe.Pointer(result)), uintptr(unsafe.Pointer(disposition)))
-	if r0 != 0 {
-		regerrno = syscall.Errno(r0)
-	}
-	return
-}
-
-func regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) {
-	r0, _, _ := syscall.Syscall(procRegDeleteKeyW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(subkey)), 0)
-	if r0 != 0 {
-		regerrno = syscall.Errno(r0)
-	}
-	return
-}
-
-func regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) {
-	r0, _, _ := syscall.Syscall6(procRegSetValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(valueName)), uintptr(reserved), uintptr(vtype), uintptr(unsafe.Pointer(buf)), uintptr(bufsize))
-	if r0 != 0 {
-		regerrno = syscall.Errno(r0)
-	}
-	return
-}
-
-func regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) {
-	r0, _, _ := syscall.Syscall9(procRegEnumValueW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen)), 0)
-	if r0 != 0 {
-		regerrno = syscall.Errno(r0)
-	}
-	return
-}
-
-func regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) {
-	r0, _, _ := syscall.Syscall(procRegDeleteValueW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(name)), 0)
-	if r0 != 0 {
-		regerrno = syscall.Errno(r0)
-	}
-	return
-}
-
-func expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) {
-	r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size))
-	n = uint32(r0)
-	if n == 0 {
-		if e1 != 0 {
-			err = error(e1)
-		} else {
-			err = syscall.EINVAL
-		}
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/internal/syscall/windows/syscall_windows.go b/third_party/gofrontend/libgo/go/internal/syscall/windows/syscall_windows.go
deleted file mode 100644
index dc8a916..0000000
--- a/third_party/gofrontend/libgo/go/internal/syscall/windows/syscall_windows.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package windows
-
-import "syscall"
-
-//go:generate go run ../../../syscall/mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go
-
-const GAA_FLAG_INCLUDE_PREFIX = 0x00000010
-
-const IF_TYPE_SOFTWARE_LOOPBACK = 24
-
-type SocketAddress struct {
-	Sockaddr       *syscall.RawSockaddrAny
-	SockaddrLength int32
-}
-
-type IpAdapterUnicastAddress struct {
-	Length             uint32
-	Flags              uint32
-	Next               *IpAdapterUnicastAddress
-	Address            SocketAddress
-	PrefixOrigin       int32
-	SuffixOrigin       int32
-	DadState           int32
-	ValidLifetime      uint32
-	PreferredLifetime  uint32
-	LeaseLifetime      uint32
-	OnLinkPrefixLength uint8
-}
-
-type IpAdapterAnycastAddress struct {
-	Length  uint32
-	Flags   uint32
-	Next    *IpAdapterAnycastAddress
-	Address SocketAddress
-}
-
-type IpAdapterMulticastAddress struct {
-	Length  uint32
-	Flags   uint32
-	Next    *IpAdapterMulticastAddress
-	Address SocketAddress
-}
-
-type IpAdapterDnsServerAdapter struct {
-	Length   uint32
-	Reserved uint32
-	Next     *IpAdapterDnsServerAdapter
-	Address  SocketAddress
-}
-
-type IpAdapterPrefix struct {
-	Length       uint32
-	Flags        uint32
-	Next         *IpAdapterPrefix
-	Address      SocketAddress
-	PrefixLength uint32
-}
-
-type IpAdapterAddresses struct {
-	Length                uint32
-	IfIndex               uint32
-	Next                  *IpAdapterAddresses
-	AdapterName           *byte
-	FirstUnicastAddress   *IpAdapterUnicastAddress
-	FirstAnycastAddress   *IpAdapterAnycastAddress
-	FirstMulticastAddress *IpAdapterMulticastAddress
-	FirstDnsServerAddress *IpAdapterDnsServerAdapter
-	DnsSuffix             *uint16
-	Description           *uint16
-	FriendlyName          *uint16
-	PhysicalAddress       [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte
-	PhysicalAddressLength uint32
-	Flags                 uint32
-	Mtu                   uint32
-	IfType                uint32
-	OperStatus            uint32
-	Ipv6IfIndex           uint32
-	ZoneIndices           [16]uint32
-	FirstPrefix           *IpAdapterPrefix
-	/* more fields might be present here. */
-}
-
-const (
-	IfOperStatusUp             = 1
-	IfOperStatusDown           = 2
-	IfOperStatusTesting        = 3
-	IfOperStatusUnknown        = 4
-	IfOperStatusDormant        = 5
-	IfOperStatusNotPresent     = 6
-	IfOperStatusLowerLayerDown = 7
-)
-
-//sys GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizeOfPointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses
-//sys	GetComputerNameEx(nameformat uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW
-//sys	MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW
-
-const (
-	ComputerNameNetBIOS                   = 0
-	ComputerNameDnsHostname               = 1
-	ComputerNameDnsDomain                 = 2
-	ComputerNameDnsFullyQualified         = 3
-	ComputerNamePhysicalNetBIOS           = 4
-	ComputerNamePhysicalDnsHostname       = 5
-	ComputerNamePhysicalDnsDomain         = 6
-	ComputerNamePhysicalDnsFullyQualified = 7
-	ComputerNameMax                       = 8
-
-	MOVEFILE_REPLACE_EXISTING      = 0x1
-	MOVEFILE_COPY_ALLOWED          = 0x2
-	MOVEFILE_DELAY_UNTIL_REBOOT    = 0x4
-	MOVEFILE_WRITE_THROUGH         = 0x8
-	MOVEFILE_CREATE_HARDLINK       = 0x10
-	MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20
-)
-
-func Rename(oldpath, newpath string) error {
-	from, err := syscall.UTF16PtrFromString(oldpath)
-	if err != nil {
-		return err
-	}
-	to, err := syscall.UTF16PtrFromString(newpath)
-	if err != nil {
-		return err
-	}
-	return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING)
-}
diff --git a/third_party/gofrontend/libgo/go/internal/syscall/windows/zsyscall_windows.go b/third_party/gofrontend/libgo/go/internal/syscall/windows/zsyscall_windows.go
deleted file mode 100644
index c6f607a..0000000
--- a/third_party/gofrontend/libgo/go/internal/syscall/windows/zsyscall_windows.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT
-
-package windows
-
-import "unsafe"
-import "syscall"
-
-var _ unsafe.Pointer
-
-var (
-	modiphlpapi = syscall.NewLazyDLL("iphlpapi.dll")
-	modkernel32 = syscall.NewLazyDLL("kernel32.dll")
-
-	procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses")
-	procGetComputerNameExW   = modkernel32.NewProc("GetComputerNameExW")
-	procMoveFileExW          = modkernel32.NewProc("MoveFileExW")
-)
-
-func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizeOfPointer *uint32) (errcode error) {
-	r0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizeOfPointer)), 0)
-	if r0 != 0 {
-		errcode = syscall.Errno(r0)
-	}
-	return
-}
-
-func GetComputerNameEx(nameformat uint32, buf *uint16, n *uint32) (err error) {
-	r1, _, e1 := syscall.Syscall(procGetComputerNameExW.Addr(), 3, uintptr(nameformat), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)))
-	if r1 == 0 {
-		if e1 != 0 {
-			err = error(e1)
-		} else {
-			err = syscall.EINVAL
-		}
-	}
-	return
-}
-
-func MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) {
-	r1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags))
-	if r1 == 0 {
-		if e1 != 0 {
-			err = error(e1)
-		} else {
-			err = syscall.EINVAL
-		}
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/internal/testenv/testenv.go b/third_party/gofrontend/libgo/go/internal/testenv/testenv.go
deleted file mode 100644
index 1071908..0000000
--- a/third_party/gofrontend/libgo/go/internal/testenv/testenv.go
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package testenv provides information about what functionality
-// is available in different testing environments run by the Go team.
-//
-// It is an internal package because these details are specific
-// to the Go team's test setup (on build.golang.org) and not
-// fundamental to tests in general.
-package testenv
-
-import (
-	"os"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-// Builder reports the name of the builder running this test
-// (for example, "linux-amd64" or "windows-386-gce").
-// If the test is not running on the build infrastructure,
-// Builder returns the empty string.
-func Builder() string {
-	return os.Getenv("GO_BUILDER_NAME")
-}
-
-// HasGoBuild reports whether the current system can build programs with ``go build''
-// and then run them with os.StartProcess or exec.Command.
-func HasGoBuild() bool {
-	switch runtime.GOOS {
-	case "android", "nacl":
-		return false
-	case "darwin":
-		if strings.HasPrefix(runtime.GOARCH, "arm") {
-			return false
-		}
-	}
-	// gccgo tests can not run "go build".
-	return false
-}
-
-// MustHaveGoBuild checks that the current system can build programs with ``go build''
-// and then run them with os.StartProcess or exec.Command.
-// If not, MustHaveGoBuild calls t.Skip with an explanation.
-func MustHaveGoBuild(t *testing.T) {
-	t.Skip("skipping test: 'go build' not available for gccgo tests")
-	if !HasGoBuild() {
-		t.Skipf("skipping test: 'go build' not available on %s/%s", runtime.GOOS, runtime.GOARCH)
-	}
-}
-
-// HasGoRun reports whether the current system can run programs with ``go run.''
-func HasGoRun() bool {
-	// For now, having go run and having go build are the same.
-	return HasGoBuild()
-}
-
-// MustHaveGoRun checks that the current system can run programs with ``go run.''
-// If not, MustHaveGoRun calls t.Skip with an explanation.
-func MustHaveGoRun(t *testing.T) {
-	t.Skip("skipping test: 'go run' not available for gccgo tests")
-	if !HasGoRun() {
-		t.Skipf("skipping test: 'go run' not available on %s/%s", runtime.GOOS, runtime.GOARCH)
-	}
-}
-
-// HasExec reports whether the current system can start new processes
-// using os.StartProcess or (more commonly) exec.Command.
-func HasExec() bool {
-	switch runtime.GOOS {
-	case "nacl":
-		return false
-	case "darwin":
-		if strings.HasPrefix(runtime.GOARCH, "arm") {
-			return false
-		}
-	}
-	return true
-}
-
-// MustHaveExec checks that the current system can start new processes
-// using os.StartProcess or (more commonly) exec.Command.
-// If not, MustHaveExec calls t.Skip with an explanation.
-func MustHaveExec(t *testing.T) {
-	if !HasExec() {
-		t.Skipf("skipping test: cannot exec subprocess on %s/%s", runtime.GOOS, runtime.GOARCH)
-	}
-}
-
-// HasExternalNetwork reports whether the current system can use
-// external (non-localhost) networks.
-func HasExternalNetwork() bool {
-	return !testing.Short()
-}
-
-// MustHaveExternalNetwork checks that the current system can use
-// external (non-localhost) networks.
-// If not, MustHaveExternalNetwork calls t.Skip with an explanation.
-func MustHaveExternalNetwork(t *testing.T) {
-	if testing.Short() {
-		t.Skipf("skipping test: no external network in -short mode")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/internal/trace/goroutines.go b/third_party/gofrontend/libgo/go/internal/trace/goroutines.go
deleted file mode 100644
index f8673e2..0000000
--- a/third_party/gofrontend/libgo/go/internal/trace/goroutines.go
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package trace
-
-// GDesc contains statistics about execution of a single goroutine.
-type GDesc struct {
-	ID           uint64
-	Name         string
-	PC           uint64
-	CreationTime int64
-	StartTime    int64
-	EndTime      int64
-
-	ExecTime      int64
-	SchedWaitTime int64
-	IOTime        int64
-	BlockTime     int64
-	SyscallTime   int64
-	GCTime        int64
-	SweepTime     int64
-	TotalTime     int64
-
-	*gdesc // private part
-}
-
-// gdesc is a private part of GDesc that is required only during analysis.
-type gdesc struct {
-	lastStartTime    int64
-	blockNetTime     int64
-	blockSyncTime    int64
-	blockSyscallTime int64
-	blockSweepTime   int64
-	blockGCTime      int64
-	blockSchedTime   int64
-}
-
-// GoroutineStats generates statistics for all goroutines in the trace.
-func GoroutineStats(events []*Event) map[uint64]*GDesc {
-	gs := make(map[uint64]*GDesc)
-	var lastTs int64
-	var gcStartTime int64
-	for _, ev := range events {
-		lastTs = ev.Ts
-		switch ev.Type {
-		case EvGoCreate:
-			g := &GDesc{ID: ev.Args[0], CreationTime: ev.Ts, gdesc: new(gdesc)}
-			g.blockSchedTime = ev.Ts
-			gs[g.ID] = g
-		case EvGoStart:
-			g := gs[ev.G]
-			if g.PC == 0 {
-				g.PC = ev.Stk[0].PC
-				g.Name = ev.Stk[0].Fn
-			}
-			g.lastStartTime = ev.Ts
-			if g.StartTime == 0 {
-				g.StartTime = ev.Ts
-			}
-			if g.blockSchedTime != 0 {
-				g.SchedWaitTime += ev.Ts - g.blockSchedTime
-				g.blockSchedTime = 0
-			}
-		case EvGoEnd, EvGoStop:
-			g := gs[ev.G]
-			g.ExecTime += ev.Ts - g.lastStartTime
-			g.TotalTime = ev.Ts - g.CreationTime
-			g.EndTime = ev.Ts
-		case EvGoBlockSend, EvGoBlockRecv, EvGoBlockSelect,
-			EvGoBlockSync, EvGoBlockCond:
-			g := gs[ev.G]
-			g.ExecTime += ev.Ts - g.lastStartTime
-			g.blockSyncTime = ev.Ts
-		case EvGoSched, EvGoPreempt:
-			g := gs[ev.G]
-			g.ExecTime += ev.Ts - g.lastStartTime
-			g.blockSchedTime = ev.Ts
-		case EvGoSleep, EvGoBlock:
-			g := gs[ev.G]
-			g.ExecTime += ev.Ts - g.lastStartTime
-		case EvGoBlockNet:
-			g := gs[ev.G]
-			g.ExecTime += ev.Ts - g.lastStartTime
-			g.blockNetTime = ev.Ts
-		case EvGoUnblock:
-			g := gs[ev.Args[0]]
-			if g.blockNetTime != 0 {
-				g.IOTime += ev.Ts - g.blockNetTime
-				g.blockNetTime = 0
-			}
-			if g.blockSyncTime != 0 {
-				g.BlockTime += ev.Ts - g.blockSyncTime
-				g.blockSyncTime = 0
-			}
-			g.blockSchedTime = ev.Ts
-		case EvGoSysBlock:
-			g := gs[ev.G]
-			g.ExecTime += ev.Ts - g.lastStartTime
-			g.blockSyscallTime = ev.Ts
-		case EvGoSysExit:
-			g := gs[ev.G]
-			if g.blockSyscallTime != 0 {
-				g.SyscallTime += ev.Ts - g.blockSyscallTime
-				g.blockSyscallTime = 0
-			}
-			g.blockSchedTime = ev.Ts
-		case EvGCSweepStart:
-			g := gs[ev.G]
-			if g != nil {
-				// Sweep can happen during GC on system goroutine.
-				g.blockSweepTime = ev.Ts
-			}
-		case EvGCSweepDone:
-			g := gs[ev.G]
-			if g != nil && g.blockSweepTime != 0 {
-				g.SweepTime += ev.Ts - g.blockSweepTime
-				g.blockSweepTime = 0
-			}
-		case EvGCStart:
-			gcStartTime = ev.Ts
-		case EvGCDone:
-			for _, g := range gs {
-				if g.EndTime == 0 {
-					g.GCTime += ev.Ts - gcStartTime
-				}
-			}
-		}
-	}
-
-	for _, g := range gs {
-		if g.TotalTime == 0 {
-			g.TotalTime = lastTs - g.CreationTime
-		}
-		if g.EndTime == 0 {
-			g.EndTime = lastTs
-		}
-		if g.blockNetTime != 0 {
-			g.IOTime += lastTs - g.blockNetTime
-			g.blockNetTime = 0
-		}
-		if g.blockSyncTime != 0 {
-			g.BlockTime += lastTs - g.blockSyncTime
-			g.blockSyncTime = 0
-		}
-		if g.blockSyscallTime != 0 {
-			g.SyscallTime += lastTs - g.blockSyscallTime
-			g.blockSyscallTime = 0
-		}
-		if g.blockSchedTime != 0 {
-			g.SchedWaitTime += lastTs - g.blockSchedTime
-			g.blockSchedTime = 0
-		}
-		g.gdesc = nil
-	}
-
-	return gs
-}
-
-// RelatedGoroutines finds a set of goroutines related to goroutine goid.
-func RelatedGoroutines(events []*Event, goid uint64) map[uint64]bool {
-	// BFS of depth 2 over "unblock" edges
-	// (what goroutines unblock goroutine goid?).
-	gmap := make(map[uint64]bool)
-	gmap[goid] = true
-	for i := 0; i < 2; i++ {
-		gmap1 := make(map[uint64]bool)
-		for g := range gmap {
-			gmap1[g] = true
-		}
-		for _, ev := range events {
-			if ev.Type == EvGoUnblock && gmap[ev.Args[0]] {
-				gmap1[ev.G] = true
-			}
-		}
-		gmap = gmap1
-	}
-	gmap[0] = true // for GC events
-	return gmap
-}
diff --git a/third_party/gofrontend/libgo/go/internal/trace/parser.go b/third_party/gofrontend/libgo/go/internal/trace/parser.go
deleted file mode 100644
index 1eb39dd..0000000
--- a/third_party/gofrontend/libgo/go/internal/trace/parser.go
+++ /dev/null
@@ -1,786 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package trace
-
-import (
-	"bufio"
-	"bytes"
-	"fmt"
-	"io"
-	"os"
-	"os/exec"
-	"sort"
-	"strconv"
-	"strings"
-)
-
-// Event describes one event in the trace.
-type Event struct {
-	Off   int       // offset in input file (for debugging and error reporting)
-	Type  byte      // one of Ev*
-	Seq   int64     // sequence number
-	Ts    int64     // timestamp in nanoseconds
-	P     int       // P on which the event happened (can be one of TimerP, NetpollP, SyscallP)
-	G     uint64    // G on which the event happened
-	StkID uint64    // unique stack ID
-	Stk   []*Frame  // stack trace (can be empty)
-	Args  [3]uint64 // event-type-specific arguments
-	// linked event (can be nil), depends on event type:
-	// for GCStart: the GCStop
-	// for GCScanStart: the GCScanDone
-	// for GCSweepStart: the GCSweepDone
-	// for GoCreate: first GoStart of the created goroutine
-	// for GoStart: the associated GoEnd, GoBlock or other blocking event
-	// for GoSched/GoPreempt: the next GoStart
-	// for GoBlock and other blocking events: the unblock event
-	// for GoUnblock: the associated GoStart
-	// for blocking GoSysCall: the associated GoSysExit
-	// for GoSysExit: the next GoStart
-	Link *Event
-}
-
-// Frame is a frame in stack traces.
-type Frame struct {
-	PC   uint64
-	Fn   string
-	File string
-	Line int
-}
-
-const (
-	// Special P identifiers:
-	FakeP    = 1000000 + iota
-	TimerP   // depicts timer unblocks
-	NetpollP // depicts network unblocks
-	SyscallP // depicts returns from syscalls
-)
-
-// Parse parses, post-processes and verifies the trace.
-func Parse(r io.Reader) ([]*Event, error) {
-	rawEvents, err := readTrace(r)
-	if err != nil {
-		return nil, err
-	}
-	events, err := parseEvents(rawEvents)
-	if err != nil {
-		return nil, err
-	}
-	events, err = removeFutile(events)
-	if err != nil {
-		return nil, err
-	}
-	err = postProcessTrace(events)
-	if err != nil {
-		return nil, err
-	}
-	return events, nil
-}
-
-// rawEvent is a helper type used during parsing.
-type rawEvent struct {
-	off  int
-	typ  byte
-	args []uint64
-}
-
-// readTrace does wire-format parsing and verification.
-// It does not care about specific event types and argument meaning.
-func readTrace(r io.Reader) ([]rawEvent, error) {
-	// Read and validate trace header.
-	var buf [16]byte
-	off, err := r.Read(buf[:])
-	if off != 16 || err != nil {
-		return nil, fmt.Errorf("failed to read header: read %v, err %v", off, err)
-	}
-	if bytes.Compare(buf[:], []byte("go 1.5 trace\x00\x00\x00\x00")) != 0 {
-		return nil, fmt.Errorf("not a trace file")
-	}
-
-	// Read events.
-	var events []rawEvent
-	for {
-		// Read event type and number of arguments (1 byte).
-		off0 := off
-		n, err := r.Read(buf[:1])
-		if err == io.EOF {
-			break
-		}
-		if err != nil || n != 1 {
-			return nil, fmt.Errorf("failed to read trace at offset 0x%x: n=%v err=%v", off0, n, err)
-		}
-		off += n
-		typ := buf[0] << 2 >> 2
-		narg := buf[0] >> 6
-		ev := rawEvent{typ: typ, off: off0}
-		if narg < 3 {
-			for i := 0; i < int(narg)+2; i++ { // sequence number and time stamp are present but not counted in narg
-				var v uint64
-				v, off, err = readVal(r, off)
-				if err != nil {
-					return nil, err
-				}
-				ev.args = append(ev.args, v)
-			}
-		} else {
-			// If narg == 3, the first value is length of the event in bytes.
-			var v uint64
-			v, off, err = readVal(r, off)
-			if err != nil {
-				return nil, err
-			}
-			evLen := v
-			off1 := off
-			for evLen > uint64(off-off1) {
-				v, off, err = readVal(r, off)
-				if err != nil {
-					return nil, err
-				}
-				ev.args = append(ev.args, v)
-			}
-			if evLen != uint64(off-off1) {
-				return nil, fmt.Errorf("event has wrong length at offset 0x%x: want %v, got %v", off0, evLen, off-off1)
-			}
-		}
-		events = append(events, ev)
-	}
-	return events, nil
-}
-
-// Parse events transforms raw events into events.
-// It does analyze and verify per-event-type arguments.
-func parseEvents(rawEvents []rawEvent) (events []*Event, err error) {
-	var ticksPerSec, lastSeq, lastTs int64
-	var lastG, timerGoid uint64
-	var lastP int
-	lastGs := make(map[int]uint64) // last goroutine running on P
-	stacks := make(map[uint64][]*Frame)
-	for _, raw := range rawEvents {
-		if raw.typ == EvNone || raw.typ >= EvCount {
-			err = fmt.Errorf("unknown event type %v at offset 0x%x", raw.typ, raw.off)
-			return
-		}
-		desc := EventDescriptions[raw.typ]
-		if desc.Name == "" {
-			err = fmt.Errorf("missing description for event type %v", raw.typ)
-			return
-		}
-		if raw.typ != EvStack {
-			narg := len(desc.Args)
-			if desc.Stack {
-				narg++
-			}
-			if raw.typ != EvBatch && raw.typ != EvFrequency && raw.typ != EvTimerGoroutine {
-				narg++ // sequence number
-				narg++ // timestamp
-			}
-			if len(raw.args) != narg {
-				err = fmt.Errorf("%v has wrong number of arguments at offset 0x%x: want %v, got %v",
-					desc.Name, raw.off, narg, len(raw.args))
-				return
-			}
-		}
-		switch raw.typ {
-		case EvBatch:
-			lastGs[lastP] = lastG
-			lastP = int(raw.args[0])
-			lastG = lastGs[lastP]
-			lastSeq = int64(raw.args[1])
-			lastTs = int64(raw.args[2])
-		case EvFrequency:
-			ticksPerSec = int64(raw.args[0])
-			if ticksPerSec <= 0 {
-				// The most likely cause for this is tick skew on different CPUs.
-				// For example, solaris/amd64 seems to have wildly different
-				// ticks on different CPUs.
-				err = ErrTimeOrder
-				return
-			}
-		case EvTimerGoroutine:
-			timerGoid = raw.args[0]
-		case EvStack:
-			if len(raw.args) < 2 {
-				err = fmt.Errorf("EvStack has wrong number of arguments at offset 0x%x: want at least 2, got %v",
-					raw.off, len(raw.args))
-				return
-			}
-			size := raw.args[1]
-			if size > 1000 {
-				err = fmt.Errorf("EvStack has bad number of frames at offset 0x%x: %v",
-					raw.off, size)
-				return
-			}
-			if uint64(len(raw.args)) != size+2 {
-				err = fmt.Errorf("EvStack has wrong number of arguments at offset 0x%x: want %v, got %v",
-					raw.off, size+2, len(raw.args))
-				return
-			}
-			id := raw.args[0]
-			if id != 0 && size > 0 {
-				stk := make([]*Frame, size)
-				for i := 0; i < int(size); i++ {
-					stk[i] = &Frame{PC: raw.args[i+2]}
-				}
-				stacks[id] = stk
-			}
-		default:
-			e := &Event{Off: raw.off, Type: raw.typ, P: lastP, G: lastG}
-			e.Seq = lastSeq + int64(raw.args[0])
-			e.Ts = lastTs + int64(raw.args[1])
-			lastSeq = e.Seq
-			lastTs = e.Ts
-			for i := range desc.Args {
-				e.Args[i] = raw.args[i+2]
-			}
-			if desc.Stack {
-				e.StkID = raw.args[len(desc.Args)+2]
-			}
-			switch raw.typ {
-			case EvGoStart:
-				lastG = e.Args[0]
-				e.G = lastG
-			case EvGCStart, EvGCDone, EvGCScanStart, EvGCScanDone:
-				e.G = 0
-			case EvGoEnd, EvGoStop, EvGoSched, EvGoPreempt,
-				EvGoSleep, EvGoBlock, EvGoBlockSend, EvGoBlockRecv,
-				EvGoBlockSelect, EvGoBlockSync, EvGoBlockCond, EvGoBlockNet,
-				EvGoSysBlock:
-				lastG = 0
-			case EvGoSysExit:
-				// EvGoSysExit emission is delayed until the thread has a P.
-				// Give it the real sequence number and time stamp.
-				e.Seq = int64(e.Args[1])
-				if e.Args[2] != 0 {
-					e.Ts = int64(e.Args[2])
-				}
-			}
-			events = append(events, e)
-		}
-	}
-	if len(events) == 0 {
-		err = fmt.Errorf("trace is empty")
-		return
-	}
-
-	// Attach stack traces.
-	for _, ev := range events {
-		if ev.StkID != 0 {
-			ev.Stk = stacks[ev.StkID]
-		}
-	}
-
-	// Sort by sequence number and translate cpu ticks to real time.
-	sort.Sort(eventList(events))
-	if ticksPerSec == 0 {
-		err = fmt.Errorf("no EvFrequency event")
-		return
-	}
-	minTs := events[0].Ts
-	for _, ev := range events {
-		ev.Ts = (ev.Ts - minTs) * 1e9 / ticksPerSec
-		// Move timers and syscalls to separate fake Ps.
-		if timerGoid != 0 && ev.G == timerGoid && ev.Type == EvGoUnblock {
-			ev.P = TimerP
-		}
-		if ev.Type == EvGoSysExit {
-			ev.P = SyscallP
-			ev.G = ev.Args[0]
-		}
-	}
-
-	return
-}
-
-// removeFutile removes all constituents of futile wakeups (block, unblock, start).
-// For example, a goroutine was unblocked on a mutex, but another goroutine got
-// ahead and acquired the mutex before the first goroutine is scheduled,
-// so the first goroutine has to block again. Such wakeups happen on buffered
-// channels and sync.Mutex, but are generally not interesting for end user.
-func removeFutile(events []*Event) ([]*Event, error) {
-	// Two non-trivial aspects:
-	// 1. A goroutine can be preempted during a futile wakeup and migrate to another P.
-	//	We want to remove all of that.
-	// 2. Tracing can start in the middle of a futile wakeup.
-	//	That is, we can see a futile wakeup event w/o the actual wakeup before it.
-	// postProcessTrace runs after us and ensures that we leave the trace in a consistent state.
-
-	// Phase 1: determine futile wakeup sequences.
-	type G struct {
-		futile bool
-		wakeup []*Event // wakeup sequence (subject for removal)
-	}
-	gs := make(map[uint64]G)
-	futile := make(map[*Event]bool)
-	for _, ev := range events {
-		switch ev.Type {
-		case EvGoUnblock:
-			g := gs[ev.Args[0]]
-			g.wakeup = []*Event{ev}
-			gs[ev.Args[0]] = g
-		case EvGoStart, EvGoPreempt, EvFutileWakeup:
-			g := gs[ev.G]
-			g.wakeup = append(g.wakeup, ev)
-			if ev.Type == EvFutileWakeup {
-				g.futile = true
-			}
-			gs[ev.G] = g
-		case EvGoBlock, EvGoBlockSend, EvGoBlockRecv, EvGoBlockSelect, EvGoBlockSync, EvGoBlockCond:
-			g := gs[ev.G]
-			if g.futile {
-				futile[ev] = true
-				for _, ev1 := range g.wakeup {
-					futile[ev1] = true
-				}
-			}
-			delete(gs, ev.G)
-		}
-	}
-
-	// Phase 2: remove futile wakeup sequences.
-	newEvents := events[:0] // overwrite the original slice
-	for _, ev := range events {
-		if !futile[ev] {
-			newEvents = append(newEvents, ev)
-		}
-	}
-	return newEvents, nil
-}
-
-// ErrTimeOrder is returned by Parse when the trace contains
-// time stamps that do not respect actual event ordering.
-var ErrTimeOrder = fmt.Errorf("time stamps out of order")
-
-// postProcessTrace does inter-event verification and information restoration.
-// The resulting trace is guaranteed to be consistent
-// (for example, a P does not run two Gs at the same time, or a G is indeed
-// blocked before an unblock event).
-func postProcessTrace(events []*Event) error {
-	const (
-		gDead = iota
-		gRunnable
-		gRunning
-		gWaiting
-	)
-	type gdesc struct {
-		state    int
-		ev       *Event
-		evStart  *Event
-		evCreate *Event
-	}
-	type pdesc struct {
-		running bool
-		g       uint64
-		evScan  *Event
-		evSweep *Event
-	}
-
-	gs := make(map[uint64]gdesc)
-	ps := make(map[int]pdesc)
-	gs[0] = gdesc{state: gRunning}
-	var evGC *Event
-
-	checkRunning := func(p pdesc, g gdesc, ev *Event, allowG0 bool) error {
-		name := EventDescriptions[ev.Type].Name
-		if g.state != gRunning {
-			return fmt.Errorf("g %v is not running while %v (offset %v, time %v)", ev.G, name, ev.Off, ev.Ts)
-		}
-		if p.g != ev.G {
-			return fmt.Errorf("p %v is not running g %v while %v (offset %v, time %v)", ev.P, ev.G, name, ev.Off, ev.Ts)
-		}
-		if !allowG0 && ev.G == 0 {
-			return fmt.Errorf("g 0 did %v (offset %v, time %v)", EventDescriptions[ev.Type].Name, ev.Off, ev.Ts)
-		}
-		return nil
-	}
-
-	for _, ev := range events {
-		g := gs[ev.G]
-		p := ps[ev.P]
-
-		switch ev.Type {
-		case EvProcStart:
-			if p.running {
-				return fmt.Errorf("p %v is running before start (offset %v, time %v)", ev.P, ev.Off, ev.Ts)
-			}
-			p.running = true
-		case EvProcStop:
-			if !p.running {
-				return fmt.Errorf("p %v is not running before stop (offset %v, time %v)", ev.P, ev.Off, ev.Ts)
-			}
-			if p.g != 0 {
-				return fmt.Errorf("p %v is running a goroutine %v during stop (offset %v, time %v)", ev.P, p.g, ev.Off, ev.Ts)
-			}
-			p.running = false
-		case EvGCStart:
-			if evGC != nil {
-				return fmt.Errorf("previous GC is not ended before a new one (offset %v, time %v)", ev.Off, ev.Ts)
-			}
-			evGC = ev
-		case EvGCDone:
-			if evGC == nil {
-				return fmt.Errorf("bogus GC end (offset %v, time %v)", ev.Off, ev.Ts)
-			}
-			evGC.Link = ev
-			evGC = nil
-		case EvGCScanStart:
-			if p.evScan != nil {
-				return fmt.Errorf("previous scanning is not ended before a new one (offset %v, time %v)", ev.Off, ev.Ts)
-			}
-			p.evScan = ev
-		case EvGCScanDone:
-			if p.evScan == nil {
-				return fmt.Errorf("bogus scanning end (offset %v, time %v)", ev.Off, ev.Ts)
-			}
-			p.evScan.Link = ev
-			p.evScan = nil
-		case EvGCSweepStart:
-			if p.evSweep != nil {
-				return fmt.Errorf("previous sweeping is not ended before a new one (offset %v, time %v)", ev.Off, ev.Ts)
-			}
-			p.evSweep = ev
-		case EvGCSweepDone:
-			if p.evSweep == nil {
-				return fmt.Errorf("bogus sweeping end (offset %v, time %v)", ev.Off, ev.Ts)
-			}
-			p.evSweep.Link = ev
-			p.evSweep = nil
-		case EvGoWaiting:
-			g1 := gs[ev.Args[0]]
-			if g1.state != gRunnable {
-				return fmt.Errorf("g %v is not runnable before EvGoWaiting (offset %v, time %v)", ev.Args[0], ev.Off, ev.Ts)
-			}
-			g1.state = gWaiting
-			gs[ev.Args[0]] = g1
-		case EvGoInSyscall:
-			g1 := gs[ev.Args[0]]
-			if g1.state != gRunnable {
-				return fmt.Errorf("g %v is not runnable before EvGoInSyscall (offset %v, time %v)", ev.Args[0], ev.Off, ev.Ts)
-			}
-			g1.state = gWaiting
-			gs[ev.Args[0]] = g1
-		case EvGoCreate:
-			if err := checkRunning(p, g, ev, true); err != nil {
-				return err
-			}
-			if _, ok := gs[ev.Args[0]]; ok {
-				return fmt.Errorf("g %v already exists (offset %v, time %v)", ev.Args[0], ev.Off, ev.Ts)
-			}
-			gs[ev.Args[0]] = gdesc{state: gRunnable, ev: ev, evCreate: ev}
-		case EvGoStart:
-			if g.state != gRunnable {
-				return fmt.Errorf("g %v is not runnable before start (offset %v, time %v)", ev.G, ev.Off, ev.Ts)
-			}
-			if p.g != 0 {
-				return fmt.Errorf("p %v is already running g %v while start g %v (offset %v, time %v)", ev.P, p.g, ev.G, ev.Off, ev.Ts)
-			}
-			g.state = gRunning
-			g.evStart = ev
-			p.g = ev.G
-			if g.evCreate != nil {
-				// +1 because symbolizer expects return pc.
-				ev.Stk = []*Frame{&Frame{PC: g.evCreate.Args[1] + 1}}
-				g.evCreate = nil
-			}
-
-			if g.ev != nil {
-				g.ev.Link = ev
-				g.ev = nil
-			}
-		case EvGoEnd, EvGoStop:
-			if err := checkRunning(p, g, ev, false); err != nil {
-				return err
-			}
-			g.evStart.Link = ev
-			g.evStart = nil
-			g.state = gDead
-			p.g = 0
-		case EvGoSched, EvGoPreempt:
-			if err := checkRunning(p, g, ev, false); err != nil {
-				return err
-			}
-			g.state = gRunnable
-			g.evStart.Link = ev
-			g.evStart = nil
-			p.g = 0
-			g.ev = ev
-		case EvGoUnblock:
-			if g.state != gRunning {
-				return fmt.Errorf("g %v is not running while unpark (offset %v, time %v)", ev.G, ev.Off, ev.Ts)
-			}
-			if ev.P != TimerP && p.g != ev.G {
-				return fmt.Errorf("p %v is not running g %v while unpark (offset %v, time %v)", ev.P, ev.G, ev.Off, ev.Ts)
-			}
-			g1 := gs[ev.Args[0]]
-			if g1.state != gWaiting {
-				return fmt.Errorf("g %v is not waiting before unpark (offset %v, time %v)", ev.Args[0], ev.Off, ev.Ts)
-			}
-			if g1.ev != nil && g1.ev.Type == EvGoBlockNet && ev.P != TimerP {
-				ev.P = NetpollP
-			}
-			if g1.ev != nil {
-				g1.ev.Link = ev
-			}
-			g1.state = gRunnable
-			g1.ev = ev
-			gs[ev.Args[0]] = g1
-		case EvGoSysCall:
-			if err := checkRunning(p, g, ev, false); err != nil {
-				return err
-			}
-			g.ev = ev
-		case EvGoSysBlock:
-			if err := checkRunning(p, g, ev, false); err != nil {
-				return err
-			}
-			g.state = gWaiting
-			g.evStart.Link = ev
-			g.evStart = nil
-			p.g = 0
-		case EvGoSysExit:
-			if g.state != gWaiting {
-				return fmt.Errorf("g %v is not waiting during syscall exit (offset %v, time %v)", ev.G, ev.Off, ev.Ts)
-			}
-			if g.ev != nil && g.ev.Type == EvGoSysCall {
-				g.ev.Link = ev
-			}
-			g.state = gRunnable
-			g.ev = ev
-		case EvGoSleep, EvGoBlock, EvGoBlockSend, EvGoBlockRecv,
-			EvGoBlockSelect, EvGoBlockSync, EvGoBlockCond, EvGoBlockNet:
-			if err := checkRunning(p, g, ev, false); err != nil {
-				return err
-			}
-			g.state = gWaiting
-			g.ev = ev
-			g.evStart.Link = ev
-			g.evStart = nil
-			p.g = 0
-		}
-
-		gs[ev.G] = g
-		ps[ev.P] = p
-	}
-
-	// TODO(dvyukov): restore stacks for EvGoStart events.
-	// TODO(dvyukov): test that all EvGoStart events has non-nil Link.
-
-	// Last, after all the other consistency checks,
-	// make sure time stamps respect sequence numbers.
-	// The tests will skip (not fail) the test case if they see this error,
-	// so check everything else that could possibly be wrong first.
-	lastTs := int64(0)
-	for _, ev := range events {
-		if ev.Ts < lastTs {
-			return ErrTimeOrder
-		}
-		lastTs = ev.Ts
-	}
-
-	return nil
-}
-
-// symbolizeTrace attaches func/file/line info to stack traces.
-func Symbolize(events []*Event, bin string) error {
-	// First, collect and dedup all pcs.
-	pcs := make(map[uint64]*Frame)
-	for _, ev := range events {
-		for _, f := range ev.Stk {
-			pcs[f.PC] = nil
-		}
-	}
-
-	// Start addr2line.
-	cmd := exec.Command("go", "tool", "addr2line", bin)
-	in, err := cmd.StdinPipe()
-	if err != nil {
-		return fmt.Errorf("failed to pipe addr2line stdin: %v", err)
-	}
-	cmd.Stderr = os.Stderr
-	out, err := cmd.StdoutPipe()
-	if err != nil {
-		return fmt.Errorf("failed to pipe addr2line stdout: %v", err)
-	}
-	err = cmd.Start()
-	if err != nil {
-		return fmt.Errorf("failed to start addr2line: %v", err)
-	}
-	outb := bufio.NewReader(out)
-
-	// Write all pcs to addr2line.
-	// Need to copy pcs to an array, because map iteration order is non-deterministic.
-	var pcArray []uint64
-	for pc := range pcs {
-		pcArray = append(pcArray, pc)
-		_, err := fmt.Fprintf(in, "0x%x\n", pc-1)
-		if err != nil {
-			return fmt.Errorf("failed to write to addr2line: %v", err)
-		}
-	}
-	in.Close()
-
-	// Read in answers.
-	for _, pc := range pcArray {
-		fn, err := outb.ReadString('\n')
-		if err != nil {
-			return fmt.Errorf("failed to read from addr2line: %v", err)
-		}
-		file, err := outb.ReadString('\n')
-		if err != nil {
-			return fmt.Errorf("failed to read from addr2line: %v", err)
-		}
-		f := &Frame{PC: pc}
-		f.Fn = fn[:len(fn)-1]
-		f.File = file[:len(file)-1]
-		if colon := strings.LastIndex(f.File, ":"); colon != -1 {
-			ln, err := strconv.Atoi(f.File[colon+1:])
-			if err == nil {
-				f.File = f.File[:colon]
-				f.Line = ln
-			}
-		}
-		pcs[pc] = f
-	}
-	cmd.Wait()
-
-	// Replace frames in events array.
-	for _, ev := range events {
-		for i, f := range ev.Stk {
-			ev.Stk[i] = pcs[f.PC]
-		}
-	}
-
-	return nil
-}
-
-// readVal reads unsigned base-128 value from r.
-func readVal(r io.Reader, off0 int) (v uint64, off int, err error) {
-	off = off0
-	for i := 0; i < 10; i++ {
-		var buf [1]byte
-		var n int
-		n, err = r.Read(buf[:])
-		if err != nil || n != 1 {
-			return 0, 0, fmt.Errorf("failed to read trace at offset %d: read %v, error %v", off0, n, err)
-		}
-		off++
-		v |= uint64(buf[0]&0x7f) << (uint(i) * 7)
-		if buf[0]&0x80 == 0 {
-			return
-		}
-	}
-	return 0, 0, fmt.Errorf("bad value at offset 0x%x", off0)
-}
-
-type eventList []*Event
-
-func (l eventList) Len() int {
-	return len(l)
-}
-
-func (l eventList) Less(i, j int) bool {
-	return l[i].Seq < l[j].Seq
-}
-
-func (l eventList) Swap(i, j int) {
-	l[i], l[j] = l[j], l[i]
-}
-
-// Print dumps events to stdout. For debugging.
-func Print(events []*Event) {
-	for _, ev := range events {
-		desc := EventDescriptions[ev.Type]
-		fmt.Printf("%v %v p=%v g=%v off=%v", ev.Ts, desc.Name, ev.P, ev.G, ev.Off)
-		for i, a := range desc.Args {
-			fmt.Printf(" %v=%v", a, ev.Args[i])
-		}
-		fmt.Printf("\n")
-	}
-}
-
-// Event types in the trace.
-// Verbatim copy from src/runtime/trace.go.
-const (
-	EvNone           = 0  // unused
-	EvBatch          = 1  // start of per-P batch of events [pid, timestamp]
-	EvFrequency      = 2  // contains tracer timer frequency [frequency (ticks per second)]
-	EvStack          = 3  // stack [stack id, number of PCs, array of PCs]
-	EvGomaxprocs     = 4  // current value of GOMAXPROCS [timestamp, GOMAXPROCS, stack id]
-	EvProcStart      = 5  // start of P [timestamp, thread id]
-	EvProcStop       = 6  // stop of P [timestamp]
-	EvGCStart        = 7  // GC start [timestamp, stack id]
-	EvGCDone         = 8  // GC done [timestamp]
-	EvGCScanStart    = 9  // GC scan start [timestamp]
-	EvGCScanDone     = 10 // GC scan done [timestamp]
-	EvGCSweepStart   = 11 // GC sweep start [timestamp, stack id]
-	EvGCSweepDone    = 12 // GC sweep done [timestamp]
-	EvGoCreate       = 13 // goroutine creation [timestamp, new goroutine id, start PC, stack id]
-	EvGoStart        = 14 // goroutine starts running [timestamp, goroutine id]
-	EvGoEnd          = 15 // goroutine ends [timestamp]
-	EvGoStop         = 16 // goroutine stops (like in select{}) [timestamp, stack]
-	EvGoSched        = 17 // goroutine calls Gosched [timestamp, stack]
-	EvGoPreempt      = 18 // goroutine is preempted [timestamp, stack]
-	EvGoSleep        = 19 // goroutine calls Sleep [timestamp, stack]
-	EvGoBlock        = 20 // goroutine blocks [timestamp, stack]
-	EvGoUnblock      = 21 // goroutine is unblocked [timestamp, goroutine id, stack]
-	EvGoBlockSend    = 22 // goroutine blocks on chan send [timestamp, stack]
-	EvGoBlockRecv    = 23 // goroutine blocks on chan recv [timestamp, stack]
-	EvGoBlockSelect  = 24 // goroutine blocks on select [timestamp, stack]
-	EvGoBlockSync    = 25 // goroutine blocks on Mutex/RWMutex [timestamp, stack]
-	EvGoBlockCond    = 26 // goroutine blocks on Cond [timestamp, stack]
-	EvGoBlockNet     = 27 // goroutine blocks on network [timestamp, stack]
-	EvGoSysCall      = 28 // syscall enter [timestamp, stack]
-	EvGoSysExit      = 29 // syscall exit [timestamp, goroutine id, real timestamp]
-	EvGoSysBlock     = 30 // syscall blocks [timestamp]
-	EvGoWaiting      = 31 // denotes that goroutine is blocked when tracing starts [goroutine id]
-	EvGoInSyscall    = 32 // denotes that goroutine is in syscall when tracing starts [goroutine id]
-	EvHeapAlloc      = 33 // memstats.heap_alloc change [timestamp, heap_alloc]
-	EvNextGC         = 34 // memstats.next_gc change [timestamp, next_gc]
-	EvTimerGoroutine = 35 // denotes timer goroutine [timer goroutine id]
-	EvFutileWakeup   = 36 // denotes that the previous wakeup of this goroutine was futile [timestamp]
-	EvCount          = 37
-)
-
-var EventDescriptions = [EvCount]struct {
-	Name  string
-	Stack bool
-	Args  []string
-}{
-	EvNone:           {"None", false, []string{}},
-	EvBatch:          {"Batch", false, []string{"p", "seq", "ticks"}},
-	EvFrequency:      {"Frequency", false, []string{"freq", "unused"}},
-	EvStack:          {"Stack", false, []string{"id", "siz"}},
-	EvGomaxprocs:     {"Gomaxprocs", true, []string{"procs"}},
-	EvProcStart:      {"ProcStart", false, []string{"thread"}},
-	EvProcStop:       {"ProcStop", false, []string{}},
-	EvGCStart:        {"GCStart", true, []string{}},
-	EvGCDone:         {"GCDone", false, []string{}},
-	EvGCScanStart:    {"GCScanStart", false, []string{}},
-	EvGCScanDone:     {"GCScanDone", false, []string{}},
-	EvGCSweepStart:   {"GCSweepStart", true, []string{}},
-	EvGCSweepDone:    {"GCSweepDone", false, []string{}},
-	EvGoCreate:       {"GoCreate", true, []string{"g", "pc"}},
-	EvGoStart:        {"GoStart", false, []string{"g"}},
-	EvGoEnd:          {"GoEnd", false, []string{}},
-	EvGoStop:         {"GoStop", true, []string{}},
-	EvGoSched:        {"GoSched", true, []string{}},
-	EvGoPreempt:      {"GoPreempt", true, []string{}},
-	EvGoSleep:        {"GoSleep", true, []string{}},
-	EvGoBlock:        {"GoBlock", true, []string{}},
-	EvGoUnblock:      {"GoUnblock", true, []string{"g"}},
-	EvGoBlockSend:    {"GoBlockSend", true, []string{}},
-	EvGoBlockRecv:    {"GoBlockRecv", true, []string{}},
-	EvGoBlockSelect:  {"GoBlockSelect", true, []string{}},
-	EvGoBlockSync:    {"GoBlockSync", true, []string{}},
-	EvGoBlockCond:    {"GoBlockCond", true, []string{}},
-	EvGoBlockNet:     {"GoBlockNet", true, []string{}},
-	EvGoSysCall:      {"GoSysCall", true, []string{}},
-	EvGoSysExit:      {"GoSysExit", false, []string{"g", "seq", "ts"}},
-	EvGoSysBlock:     {"GoSysBlock", false, []string{}},
-	EvGoWaiting:      {"GoWaiting", false, []string{"g"}},
-	EvGoInSyscall:    {"GoInSyscall", false, []string{"g"}},
-	EvHeapAlloc:      {"HeapAlloc", false, []string{"mem"}},
-	EvNextGC:         {"NextGC", false, []string{"mem"}},
-	EvTimerGoroutine: {"TimerGoroutine", false, []string{"g", "unused"}},
-	EvFutileWakeup:   {"FutileWakeup", false, []string{}},
-}
diff --git a/third_party/gofrontend/libgo/go/internal/trace/parser_test.go b/third_party/gofrontend/libgo/go/internal/trace/parser_test.go
deleted file mode 100644
index 0eeb3e6..0000000
--- a/third_party/gofrontend/libgo/go/internal/trace/parser_test.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package trace
-
-import (
-	"strings"
-	"testing"
-)
-
-func TestCorruptedInputs(t *testing.T) {
-	// These inputs crashed parser previously.
-	tests := []string{
-		"gotrace\x00\x020",
-		"gotrace\x00Q00\x020",
-		"gotrace\x00T00\x020",
-		"gotrace\x00\xc3\x0200",
-		"go 1.5 trace\x00\x00\x00\x00\x020",
-		"go 1.5 trace\x00\x00\x00\x00Q00\x020",
-		"go 1.5 trace\x00\x00\x00\x00T00\x020",
-		"go 1.5 trace\x00\x00\x00\x00\xc3\x0200",
-	}
-	for _, data := range tests {
-		events, err := Parse(strings.NewReader(data))
-		if err == nil || events != nil {
-			t.Fatalf("no error on input: %q\n", t)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/io/io.go b/third_party/gofrontend/libgo/go/io/io.go
deleted file mode 100644
index 8851eaf..0000000
--- a/third_party/gofrontend/libgo/go/io/io.go
+++ /dev/null
@@ -1,521 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package io provides basic interfaces to I/O primitives.
-// Its primary job is to wrap existing implementations of such primitives,
-// such as those in package os, into shared public interfaces that
-// abstract the functionality, plus some other related primitives.
-//
-// Because these interfaces and primitives wrap lower-level operations with
-// various implementations, unless otherwise informed clients should not
-// assume they are safe for parallel execution.
-package io
-
-import (
-	"errors"
-)
-
-// ErrShortWrite means that a write accepted fewer bytes than requested
-// but failed to return an explicit error.
-var ErrShortWrite = errors.New("short write")
-
-// ErrShortBuffer means that a read required a longer buffer than was provided.
-var ErrShortBuffer = errors.New("short buffer")
-
-// EOF is the error returned by Read when no more input is available.
-// Functions should return EOF only to signal a graceful end of input.
-// If the EOF occurs unexpectedly in a structured data stream,
-// the appropriate error is either ErrUnexpectedEOF or some other error
-// giving more detail.
-var EOF = errors.New("EOF")
-
-// ErrUnexpectedEOF means that EOF was encountered in the
-// middle of reading a fixed-size block or data structure.
-var ErrUnexpectedEOF = errors.New("unexpected EOF")
-
-// ErrNoProgress is returned by some clients of an io.Reader when
-// many calls to Read have failed to return any data or error,
-// usually the sign of a broken io.Reader implementation.
-var ErrNoProgress = errors.New("multiple Read calls return no data or error")
-
-// Reader is the interface that wraps the basic Read method.
-//
-// Read reads up to len(p) bytes into p.  It returns the number of bytes
-// read (0 <= n <= len(p)) and any error encountered.  Even if Read
-// returns n < len(p), it may use all of p as scratch space during the call.
-// If some data is available but not len(p) bytes, Read conventionally
-// returns what is available instead of waiting for more.
-//
-// When Read encounters an error or end-of-file condition after
-// successfully reading n > 0 bytes, it returns the number of
-// bytes read.  It may return the (non-nil) error from the same call
-// or return the error (and n == 0) from a subsequent call.
-// An instance of this general case is that a Reader returning
-// a non-zero number of bytes at the end of the input stream may
-// return either err == EOF or err == nil.  The next Read should
-// return 0, EOF.
-//
-// Callers should always process the n > 0 bytes returned before
-// considering the error err.  Doing so correctly handles I/O errors
-// that happen after reading some bytes and also both of the
-// allowed EOF behaviors.
-//
-// Implementations of Read are discouraged from returning a
-// zero byte count with a nil error, except when len(p) == 0.
-// Callers should treat a return of 0 and nil as indicating that
-// nothing happened; in particular it does not indicate EOF.
-//
-// Implementations must not retain p.
-type Reader interface {
-	Read(p []byte) (n int, err error)
-}
-
-// Writer is the interface that wraps the basic Write method.
-//
-// Write writes len(p) bytes from p to the underlying data stream.
-// It returns the number of bytes written from p (0 <= n <= len(p))
-// and any error encountered that caused the write to stop early.
-// Write must return a non-nil error if it returns n < len(p).
-// Write must not modify the slice data, even temporarily.
-//
-// Implementations must not retain p.
-type Writer interface {
-	Write(p []byte) (n int, err error)
-}
-
-// Closer is the interface that wraps the basic Close method.
-//
-// The behavior of Close after the first call is undefined.
-// Specific implementations may document their own behavior.
-type Closer interface {
-	Close() error
-}
-
-// Seeker is the interface that wraps the basic Seek method.
-//
-// Seek sets the offset for the next Read or Write to offset,
-// interpreted according to whence: 0 means relative to the origin of
-// the file, 1 means relative to the current offset, and 2 means
-// relative to the end.  Seek returns the new offset and an error, if
-// any.
-//
-// Seeking to a negative offset is an error. Seeking to any positive
-// offset is legal, but the behavior of subsequent I/O operations on
-// the underlying object is implementation-dependent.
-type Seeker interface {
-	Seek(offset int64, whence int) (int64, error)
-}
-
-// ReadWriter is the interface that groups the basic Read and Write methods.
-type ReadWriter interface {
-	Reader
-	Writer
-}
-
-// ReadCloser is the interface that groups the basic Read and Close methods.
-type ReadCloser interface {
-	Reader
-	Closer
-}
-
-// WriteCloser is the interface that groups the basic Write and Close methods.
-type WriteCloser interface {
-	Writer
-	Closer
-}
-
-// ReadWriteCloser is the interface that groups the basic Read, Write and Close methods.
-type ReadWriteCloser interface {
-	Reader
-	Writer
-	Closer
-}
-
-// ReadSeeker is the interface that groups the basic Read and Seek methods.
-type ReadSeeker interface {
-	Reader
-	Seeker
-}
-
-// WriteSeeker is the interface that groups the basic Write and Seek methods.
-type WriteSeeker interface {
-	Writer
-	Seeker
-}
-
-// ReadWriteSeeker is the interface that groups the basic Read, Write and Seek methods.
-type ReadWriteSeeker interface {
-	Reader
-	Writer
-	Seeker
-}
-
-// ReaderFrom is the interface that wraps the ReadFrom method.
-//
-// ReadFrom reads data from r until EOF or error.
-// The return value n is the number of bytes read.
-// Any error except io.EOF encountered during the read is also returned.
-//
-// The Copy function uses ReaderFrom if available.
-type ReaderFrom interface {
-	ReadFrom(r Reader) (n int64, err error)
-}
-
-// WriterTo is the interface that wraps the WriteTo method.
-//
-// WriteTo writes data to w until there's no more data to write or
-// when an error occurs. The return value n is the number of bytes
-// written. Any error encountered during the write is also returned.
-//
-// The Copy function uses WriterTo if available.
-type WriterTo interface {
-	WriteTo(w Writer) (n int64, err error)
-}
-
-// ReaderAt is the interface that wraps the basic ReadAt method.
-//
-// ReadAt reads len(p) bytes into p starting at offset off in the
-// underlying input source.  It returns the number of bytes
-// read (0 <= n <= len(p)) and any error encountered.
-//
-// When ReadAt returns n < len(p), it returns a non-nil error
-// explaining why more bytes were not returned.  In this respect,
-// ReadAt is stricter than Read.
-//
-// Even if ReadAt returns n < len(p), it may use all of p as scratch
-// space during the call.  If some data is available but not len(p) bytes,
-// ReadAt blocks until either all the data is available or an error occurs.
-// In this respect ReadAt is different from Read.
-//
-// If the n = len(p) bytes returned by ReadAt are at the end of the
-// input source, ReadAt may return either err == EOF or err == nil.
-//
-// If ReadAt is reading from an input source with a seek offset,
-// ReadAt should not affect nor be affected by the underlying
-// seek offset.
-//
-// Clients of ReadAt can execute parallel ReadAt calls on the
-// same input source.
-//
-// Implementations must not retain p.
-type ReaderAt interface {
-	ReadAt(p []byte, off int64) (n int, err error)
-}
-
-// WriterAt is the interface that wraps the basic WriteAt method.
-//
-// WriteAt writes len(p) bytes from p to the underlying data stream
-// at offset off.  It returns the number of bytes written from p (0 <= n <= len(p))
-// and any error encountered that caused the write to stop early.
-// WriteAt must return a non-nil error if it returns n < len(p).
-//
-// If WriteAt is writing to a destination with a seek offset,
-// WriteAt should not affect nor be affected by the underlying
-// seek offset.
-//
-// Clients of WriteAt can execute parallel WriteAt calls on the same
-// destination if the ranges do not overlap.
-//
-// Implementations must not retain p.
-type WriterAt interface {
-	WriteAt(p []byte, off int64) (n int, err error)
-}
-
-// ByteReader is the interface that wraps the ReadByte method.
-//
-// ReadByte reads and returns the next byte from the input.
-// If no byte is available, err will be set.
-type ByteReader interface {
-	ReadByte() (c byte, err error)
-}
-
-// ByteScanner is the interface that adds the UnreadByte method to the
-// basic ReadByte method.
-//
-// UnreadByte causes the next call to ReadByte to return the same byte
-// as the previous call to ReadByte.
-// It may be an error to call UnreadByte twice without an intervening
-// call to ReadByte.
-type ByteScanner interface {
-	ByteReader
-	UnreadByte() error
-}
-
-// ByteWriter is the interface that wraps the WriteByte method.
-type ByteWriter interface {
-	WriteByte(c byte) error
-}
-
-// RuneReader is the interface that wraps the ReadRune method.
-//
-// ReadRune reads a single UTF-8 encoded Unicode character
-// and returns the rune and its size in bytes. If no character is
-// available, err will be set.
-type RuneReader interface {
-	ReadRune() (r rune, size int, err error)
-}
-
-// RuneScanner is the interface that adds the UnreadRune method to the
-// basic ReadRune method.
-//
-// UnreadRune causes the next call to ReadRune to return the same rune
-// as the previous call to ReadRune.
-// It may be an error to call UnreadRune twice without an intervening
-// call to ReadRune.
-type RuneScanner interface {
-	RuneReader
-	UnreadRune() error
-}
-
-// stringWriter is the interface that wraps the WriteString method.
-type stringWriter interface {
-	WriteString(s string) (n int, err error)
-}
-
-// WriteString writes the contents of the string s to w, which accepts a slice of bytes.
-// If w implements a WriteString method, it is invoked directly.
-func WriteString(w Writer, s string) (n int, err error) {
-	if sw, ok := w.(stringWriter); ok {
-		return sw.WriteString(s)
-	}
-	return w.Write([]byte(s))
-}
-
-// ReadAtLeast reads from r into buf until it has read at least min bytes.
-// It returns the number of bytes copied and an error if fewer bytes were read.
-// The error is EOF only if no bytes were read.
-// If an EOF happens after reading fewer than min bytes,
-// ReadAtLeast returns ErrUnexpectedEOF.
-// If min is greater than the length of buf, ReadAtLeast returns ErrShortBuffer.
-// On return, n >= min if and only if err == nil.
-func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error) {
-	if len(buf) < min {
-		return 0, ErrShortBuffer
-	}
-	for n < min && err == nil {
-		var nn int
-		nn, err = r.Read(buf[n:])
-		n += nn
-	}
-	if n >= min {
-		err = nil
-	} else if n > 0 && err == EOF {
-		err = ErrUnexpectedEOF
-	}
-	return
-}
-
-// ReadFull reads exactly len(buf) bytes from r into buf.
-// It returns the number of bytes copied and an error if fewer bytes were read.
-// The error is EOF only if no bytes were read.
-// If an EOF happens after reading some but not all the bytes,
-// ReadFull returns ErrUnexpectedEOF.
-// On return, n == len(buf) if and only if err == nil.
-func ReadFull(r Reader, buf []byte) (n int, err error) {
-	return ReadAtLeast(r, buf, len(buf))
-}
-
-// CopyN copies n bytes (or until an error) from src to dst.
-// It returns the number of bytes copied and the earliest
-// error encountered while copying.
-// On return, written == n if and only if err == nil.
-//
-// If dst implements the ReaderFrom interface,
-// the copy is implemented using it.
-func CopyN(dst Writer, src Reader, n int64) (written int64, err error) {
-	written, err = Copy(dst, LimitReader(src, n))
-	if written == n {
-		return n, nil
-	}
-	if written < n && err == nil {
-		// src stopped early; must have been EOF.
-		err = EOF
-	}
-	return
-}
-
-// Copy copies from src to dst until either EOF is reached
-// on src or an error occurs.  It returns the number of bytes
-// copied and the first error encountered while copying, if any.
-//
-// A successful Copy returns err == nil, not err == EOF.
-// Because Copy is defined to read from src until EOF, it does
-// not treat an EOF from Read as an error to be reported.
-//
-// If src implements the WriterTo interface,
-// the copy is implemented by calling src.WriteTo(dst).
-// Otherwise, if dst implements the ReaderFrom interface,
-// the copy is implemented by calling dst.ReadFrom(src).
-func Copy(dst Writer, src Reader) (written int64, err error) {
-	return copyBuffer(dst, src, nil)
-}
-
-// CopyBuffer is identical to Copy except that it stages through the
-// provided buffer (if one is required) rather than allocating a
-// temporary one. If buf is nil, one is allocated; otherwise if it has
-// zero length, CopyBuffer panics.
-func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {
-	if buf != nil && len(buf) == 0 {
-		panic("empty buffer in io.CopyBuffer")
-	}
-	return copyBuffer(dst, src, buf)
-}
-
-// copyBuffer is the actual implementation of Copy and CopyBuffer.
-// if buf is nil, one is allocated.
-func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {
-	// If the reader has a WriteTo method, use it to do the copy.
-	// Avoids an allocation and a copy.
-	if wt, ok := src.(WriterTo); ok {
-		return wt.WriteTo(dst)
-	}
-	// Similarly, if the writer has a ReadFrom method, use it to do the copy.
-	if rt, ok := dst.(ReaderFrom); ok {
-		return rt.ReadFrom(src)
-	}
-	if buf == nil {
-		buf = make([]byte, 32*1024)
-	}
-	for {
-		nr, er := src.Read(buf)
-		if nr > 0 {
-			nw, ew := dst.Write(buf[0:nr])
-			if nw > 0 {
-				written += int64(nw)
-			}
-			if ew != nil {
-				err = ew
-				break
-			}
-			if nr != nw {
-				err = ErrShortWrite
-				break
-			}
-		}
-		if er == EOF {
-			break
-		}
-		if er != nil {
-			err = er
-			break
-		}
-	}
-	return written, err
-}
-
-// LimitReader returns a Reader that reads from r
-// but stops with EOF after n bytes.
-// The underlying implementation is a *LimitedReader.
-func LimitReader(r Reader, n int64) Reader { return &LimitedReader{r, n} }
-
-// A LimitedReader reads from R but limits the amount of
-// data returned to just N bytes. Each call to Read
-// updates N to reflect the new amount remaining.
-type LimitedReader struct {
-	R Reader // underlying reader
-	N int64  // max bytes remaining
-}
-
-func (l *LimitedReader) Read(p []byte) (n int, err error) {
-	if l.N <= 0 {
-		return 0, EOF
-	}
-	if int64(len(p)) > l.N {
-		p = p[0:l.N]
-	}
-	n, err = l.R.Read(p)
-	l.N -= int64(n)
-	return
-}
-
-// NewSectionReader returns a SectionReader that reads from r
-// starting at offset off and stops with EOF after n bytes.
-func NewSectionReader(r ReaderAt, off int64, n int64) *SectionReader {
-	return &SectionReader{r, off, off, off + n}
-}
-
-// SectionReader implements Read, Seek, and ReadAt on a section
-// of an underlying ReaderAt.
-type SectionReader struct {
-	r     ReaderAt
-	base  int64
-	off   int64
-	limit int64
-}
-
-func (s *SectionReader) Read(p []byte) (n int, err error) {
-	if s.off >= s.limit {
-		return 0, EOF
-	}
-	if max := s.limit - s.off; int64(len(p)) > max {
-		p = p[0:max]
-	}
-	n, err = s.r.ReadAt(p, s.off)
-	s.off += int64(n)
-	return
-}
-
-var errWhence = errors.New("Seek: invalid whence")
-var errOffset = errors.New("Seek: invalid offset")
-
-func (s *SectionReader) Seek(offset int64, whence int) (int64, error) {
-	switch whence {
-	default:
-		return 0, errWhence
-	case 0:
-		offset += s.base
-	case 1:
-		offset += s.off
-	case 2:
-		offset += s.limit
-	}
-	if offset < s.base {
-		return 0, errOffset
-	}
-	s.off = offset
-	return offset - s.base, nil
-}
-
-func (s *SectionReader) ReadAt(p []byte, off int64) (n int, err error) {
-	if off < 0 || off >= s.limit-s.base {
-		return 0, EOF
-	}
-	off += s.base
-	if max := s.limit - off; int64(len(p)) > max {
-		p = p[0:max]
-		n, err = s.r.ReadAt(p, off)
-		if err == nil {
-			err = EOF
-		}
-		return n, err
-	}
-	return s.r.ReadAt(p, off)
-}
-
-// Size returns the size of the section in bytes.
-func (s *SectionReader) Size() int64 { return s.limit - s.base }
-
-// TeeReader returns a Reader that writes to w what it reads from r.
-// All reads from r performed through it are matched with
-// corresponding writes to w.  There is no internal buffering -
-// the write must complete before the read completes.
-// Any error encountered while writing is reported as a read error.
-func TeeReader(r Reader, w Writer) Reader {
-	return &teeReader{r, w}
-}
-
-type teeReader struct {
-	r Reader
-	w Writer
-}
-
-func (t *teeReader) Read(p []byte) (n int, err error) {
-	n, err = t.r.Read(p)
-	if n > 0 {
-		if n, err := t.w.Write(p[:n]); err != nil {
-			return n, err
-		}
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/io/io_test.go b/third_party/gofrontend/libgo/go/io/io_test.go
deleted file mode 100644
index e892574..0000000
--- a/third_party/gofrontend/libgo/go/io/io_test.go
+++ /dev/null
@@ -1,389 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io_test
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	. "io"
-	"strings"
-	"testing"
-)
-
-// An version of bytes.Buffer without ReadFrom and WriteTo
-type Buffer struct {
-	bytes.Buffer
-	ReaderFrom // conflicts with and hides bytes.Buffer's ReaderFrom.
-	WriterTo   // conflicts with and hides bytes.Buffer's WriterTo.
-}
-
-// Simple tests, primarily to verify the ReadFrom and WriteTo callouts inside Copy, CopyBuffer and CopyN.
-
-func TestCopy(t *testing.T) {
-	rb := new(Buffer)
-	wb := new(Buffer)
-	rb.WriteString("hello, world.")
-	Copy(wb, rb)
-	if wb.String() != "hello, world." {
-		t.Errorf("Copy did not work properly")
-	}
-}
-
-func TestCopyBuffer(t *testing.T) {
-	rb := new(Buffer)
-	wb := new(Buffer)
-	rb.WriteString("hello, world.")
-	CopyBuffer(wb, rb, make([]byte, 1)) // Tiny buffer to keep it honest.
-	if wb.String() != "hello, world." {
-		t.Errorf("CopyBuffer did not work properly")
-	}
-}
-
-func TestCopyBufferNil(t *testing.T) {
-	rb := new(Buffer)
-	wb := new(Buffer)
-	rb.WriteString("hello, world.")
-	CopyBuffer(wb, rb, nil) // Should allocate a buffer.
-	if wb.String() != "hello, world." {
-		t.Errorf("CopyBuffer did not work properly")
-	}
-}
-
-func TestCopyReadFrom(t *testing.T) {
-	rb := new(Buffer)
-	wb := new(bytes.Buffer) // implements ReadFrom.
-	rb.WriteString("hello, world.")
-	Copy(wb, rb)
-	if wb.String() != "hello, world." {
-		t.Errorf("Copy did not work properly")
-	}
-}
-
-func TestCopyWriteTo(t *testing.T) {
-	rb := new(bytes.Buffer) // implements WriteTo.
-	wb := new(Buffer)
-	rb.WriteString("hello, world.")
-	Copy(wb, rb)
-	if wb.String() != "hello, world." {
-		t.Errorf("Copy did not work properly")
-	}
-}
-
-// Version of bytes.Buffer that checks whether WriteTo was called or not
-type writeToChecker struct {
-	bytes.Buffer
-	writeToCalled bool
-}
-
-func (wt *writeToChecker) WriteTo(w Writer) (int64, error) {
-	wt.writeToCalled = true
-	return wt.Buffer.WriteTo(w)
-}
-
-// It's preferable to choose WriterTo over ReaderFrom, since a WriterTo can issue one large write,
-// while the ReaderFrom must read until EOF, potentially allocating when running out of buffer.
-// Make sure that we choose WriterTo when both are implemented.
-func TestCopyPriority(t *testing.T) {
-	rb := new(writeToChecker)
-	wb := new(bytes.Buffer)
-	rb.WriteString("hello, world.")
-	Copy(wb, rb)
-	if wb.String() != "hello, world." {
-		t.Errorf("Copy did not work properly")
-	} else if !rb.writeToCalled {
-		t.Errorf("WriteTo was not prioritized over ReadFrom")
-	}
-}
-
-type zeroErrReader struct {
-	err error
-}
-
-func (r zeroErrReader) Read(p []byte) (int, error) {
-	return copy(p, []byte{0}), r.err
-}
-
-type errWriter struct {
-	err error
-}
-
-func (w errWriter) Write([]byte) (int, error) {
-	return 0, w.err
-}
-
-// In case a Read results in an error with non-zero bytes read, and
-// the subsequent Write also results in an error, the error from Write
-// is returned, as it is the one that prevented progressing further.
-func TestCopyReadErrWriteErr(t *testing.T) {
-	er, ew := errors.New("readError"), errors.New("writeError")
-	r, w := zeroErrReader{err: er}, errWriter{err: ew}
-	n, err := Copy(w, r)
-	if n != 0 || err != ew {
-		t.Errorf("Copy(zeroErrReader, errWriter) = %d, %v; want 0, writeError", n, err)
-	}
-}
-
-func TestCopyN(t *testing.T) {
-	rb := new(Buffer)
-	wb := new(Buffer)
-	rb.WriteString("hello, world.")
-	CopyN(wb, rb, 5)
-	if wb.String() != "hello" {
-		t.Errorf("CopyN did not work properly")
-	}
-}
-
-func TestCopyNReadFrom(t *testing.T) {
-	rb := new(Buffer)
-	wb := new(bytes.Buffer) // implements ReadFrom.
-	rb.WriteString("hello")
-	CopyN(wb, rb, 5)
-	if wb.String() != "hello" {
-		t.Errorf("CopyN did not work properly")
-	}
-}
-
-func TestCopyNWriteTo(t *testing.T) {
-	rb := new(bytes.Buffer) // implements WriteTo.
-	wb := new(Buffer)
-	rb.WriteString("hello, world.")
-	CopyN(wb, rb, 5)
-	if wb.String() != "hello" {
-		t.Errorf("CopyN did not work properly")
-	}
-}
-
-type noReadFrom struct {
-	w Writer
-}
-
-func (w *noReadFrom) Write(p []byte) (n int, err error) {
-	return w.w.Write(p)
-}
-
-type wantedAndErrReader struct{}
-
-func (wantedAndErrReader) Read(p []byte) (int, error) {
-	return len(p), errors.New("wantedAndErrReader error")
-}
-
-func TestCopyNEOF(t *testing.T) {
-	// Test that EOF behavior is the same regardless of whether
-	// argument to CopyN has ReadFrom.
-
-	b := new(bytes.Buffer)
-
-	n, err := CopyN(&noReadFrom{b}, strings.NewReader("foo"), 3)
-	if n != 3 || err != nil {
-		t.Errorf("CopyN(noReadFrom, foo, 3) = %d, %v; want 3, nil", n, err)
-	}
-
-	n, err = CopyN(&noReadFrom{b}, strings.NewReader("foo"), 4)
-	if n != 3 || err != EOF {
-		t.Errorf("CopyN(noReadFrom, foo, 4) = %d, %v; want 3, EOF", n, err)
-	}
-
-	n, err = CopyN(b, strings.NewReader("foo"), 3) // b has read from
-	if n != 3 || err != nil {
-		t.Errorf("CopyN(bytes.Buffer, foo, 3) = %d, %v; want 3, nil", n, err)
-	}
-
-	n, err = CopyN(b, strings.NewReader("foo"), 4) // b has read from
-	if n != 3 || err != EOF {
-		t.Errorf("CopyN(bytes.Buffer, foo, 4) = %d, %v; want 3, EOF", n, err)
-	}
-
-	n, err = CopyN(b, wantedAndErrReader{}, 5)
-	if n != 5 || err != nil {
-		t.Errorf("CopyN(bytes.Buffer, wantedAndErrReader, 5) = %d, %v; want 5, nil", n, err)
-	}
-
-	n, err = CopyN(&noReadFrom{b}, wantedAndErrReader{}, 5)
-	if n != 5 || err != nil {
-		t.Errorf("CopyN(noReadFrom, wantedAndErrReader, 5) = %d, %v; want 5, nil", n, err)
-	}
-}
-
-func TestReadAtLeast(t *testing.T) {
-	var rb bytes.Buffer
-	testReadAtLeast(t, &rb)
-}
-
-// A version of bytes.Buffer that returns n > 0, err on Read
-// when the input is exhausted.
-type dataAndErrorBuffer struct {
-	err error
-	bytes.Buffer
-}
-
-func (r *dataAndErrorBuffer) Read(p []byte) (n int, err error) {
-	n, err = r.Buffer.Read(p)
-	if n > 0 && r.Buffer.Len() == 0 && err == nil {
-		err = r.err
-	}
-	return
-}
-
-func TestReadAtLeastWithDataAndEOF(t *testing.T) {
-	var rb dataAndErrorBuffer
-	rb.err = EOF
-	testReadAtLeast(t, &rb)
-}
-
-func TestReadAtLeastWithDataAndError(t *testing.T) {
-	var rb dataAndErrorBuffer
-	rb.err = fmt.Errorf("fake error")
-	testReadAtLeast(t, &rb)
-}
-
-func testReadAtLeast(t *testing.T, rb ReadWriter) {
-	rb.Write([]byte("0123"))
-	buf := make([]byte, 2)
-	n, err := ReadAtLeast(rb, buf, 2)
-	if err != nil {
-		t.Error(err)
-	}
-	n, err = ReadAtLeast(rb, buf, 4)
-	if err != ErrShortBuffer {
-		t.Errorf("expected ErrShortBuffer got %v", err)
-	}
-	if n != 0 {
-		t.Errorf("expected to have read 0 bytes, got %v", n)
-	}
-	n, err = ReadAtLeast(rb, buf, 1)
-	if err != nil {
-		t.Error(err)
-	}
-	if n != 2 {
-		t.Errorf("expected to have read 2 bytes, got %v", n)
-	}
-	n, err = ReadAtLeast(rb, buf, 2)
-	if err != EOF {
-		t.Errorf("expected EOF, got %v", err)
-	}
-	if n != 0 {
-		t.Errorf("expected to have read 0 bytes, got %v", n)
-	}
-	rb.Write([]byte("4"))
-	n, err = ReadAtLeast(rb, buf, 2)
-	want := ErrUnexpectedEOF
-	if rb, ok := rb.(*dataAndErrorBuffer); ok && rb.err != EOF {
-		want = rb.err
-	}
-	if err != want {
-		t.Errorf("expected %v, got %v", want, err)
-	}
-	if n != 1 {
-		t.Errorf("expected to have read 1 bytes, got %v", n)
-	}
-}
-
-func TestTeeReader(t *testing.T) {
-	src := []byte("hello, world")
-	dst := make([]byte, len(src))
-	rb := bytes.NewBuffer(src)
-	wb := new(bytes.Buffer)
-	r := TeeReader(rb, wb)
-	if n, err := ReadFull(r, dst); err != nil || n != len(src) {
-		t.Fatalf("ReadFull(r, dst) = %d, %v; want %d, nil", n, err, len(src))
-	}
-	if !bytes.Equal(dst, src) {
-		t.Errorf("bytes read = %q want %q", dst, src)
-	}
-	if !bytes.Equal(wb.Bytes(), src) {
-		t.Errorf("bytes written = %q want %q", wb.Bytes(), src)
-	}
-	if n, err := r.Read(dst); n != 0 || err != EOF {
-		t.Errorf("r.Read at EOF = %d, %v want 0, EOF", n, err)
-	}
-	rb = bytes.NewBuffer(src)
-	pr, pw := Pipe()
-	pr.Close()
-	r = TeeReader(rb, pw)
-	if n, err := ReadFull(r, dst); n != 0 || err != ErrClosedPipe {
-		t.Errorf("closed tee: ReadFull(r, dst) = %d, %v; want 0, EPIPE", n, err)
-	}
-}
-
-func TestSectionReader_ReadAt(t *testing.T) {
-	dat := "a long sample data, 1234567890"
-	tests := []struct {
-		data   string
-		off    int
-		n      int
-		bufLen int
-		at     int
-		exp    string
-		err    error
-	}{
-		{data: "", off: 0, n: 10, bufLen: 2, at: 0, exp: "", err: EOF},
-		{data: dat, off: 0, n: len(dat), bufLen: 0, at: 0, exp: "", err: nil},
-		{data: dat, off: len(dat), n: 1, bufLen: 1, at: 0, exp: "", err: EOF},
-		{data: dat, off: 0, n: len(dat) + 2, bufLen: len(dat), at: 0, exp: dat, err: nil},
-		{data: dat, off: 0, n: len(dat), bufLen: len(dat) / 2, at: 0, exp: dat[:len(dat)/2], err: nil},
-		{data: dat, off: 0, n: len(dat), bufLen: len(dat), at: 0, exp: dat, err: nil},
-		{data: dat, off: 0, n: len(dat), bufLen: len(dat) / 2, at: 2, exp: dat[2 : 2+len(dat)/2], err: nil},
-		{data: dat, off: 3, n: len(dat), bufLen: len(dat) / 2, at: 2, exp: dat[5 : 5+len(dat)/2], err: nil},
-		{data: dat, off: 3, n: len(dat) / 2, bufLen: len(dat)/2 - 2, at: 2, exp: dat[5 : 5+len(dat)/2-2], err: nil},
-		{data: dat, off: 3, n: len(dat) / 2, bufLen: len(dat)/2 + 2, at: 2, exp: dat[5 : 5+len(dat)/2-2], err: EOF},
-		{data: dat, off: 0, n: 0, bufLen: 0, at: -1, exp: "", err: EOF},
-		{data: dat, off: 0, n: 0, bufLen: 0, at: 1, exp: "", err: EOF},
-	}
-	for i, tt := range tests {
-		r := strings.NewReader(tt.data)
-		s := NewSectionReader(r, int64(tt.off), int64(tt.n))
-		buf := make([]byte, tt.bufLen)
-		if n, err := s.ReadAt(buf, int64(tt.at)); n != len(tt.exp) || string(buf[:n]) != tt.exp || err != tt.err {
-			t.Fatalf("%d: ReadAt(%d) = %q, %v; expected %q, %v", i, tt.at, buf[:n], err, tt.exp, tt.err)
-		}
-	}
-}
-
-func TestSectionReader_Seek(t *testing.T) {
-	// Verifies that NewSectionReader's Seeker behaves like bytes.NewReader (which is like strings.NewReader)
-	br := bytes.NewReader([]byte("foo"))
-	sr := NewSectionReader(br, 0, int64(len("foo")))
-
-	for whence := 0; whence <= 2; whence++ {
-		for offset := int64(-3); offset <= 4; offset++ {
-			brOff, brErr := br.Seek(offset, whence)
-			srOff, srErr := sr.Seek(offset, whence)
-			if (brErr != nil) != (srErr != nil) || brOff != srOff {
-				t.Errorf("For whence %d, offset %d: bytes.Reader.Seek = (%v, %v) != SectionReader.Seek = (%v, %v)",
-					whence, offset, brOff, brErr, srErr, srOff)
-			}
-		}
-	}
-
-	// And verify we can just seek past the end and get an EOF
-	got, err := sr.Seek(100, 0)
-	if err != nil || got != 100 {
-		t.Errorf("Seek = %v, %v; want 100, nil", got, err)
-	}
-
-	n, err := sr.Read(make([]byte, 10))
-	if n != 0 || err != EOF {
-		t.Errorf("Read = %v, %v; want 0, EOF", n, err)
-	}
-}
-
-func TestSectionReader_Size(t *testing.T) {
-	tests := []struct {
-		data string
-		want int64
-	}{
-		{"a long sample data, 1234567890", 30},
-		{"", 0},
-	}
-
-	for _, tt := range tests {
-		r := strings.NewReader(tt.data)
-		sr := NewSectionReader(r, 0, int64(len(tt.data)))
-		if got := sr.Size(); got != tt.want {
-			t.Errorf("Size = %v; want %v", got, tt.want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/io/ioutil/ioutil.go b/third_party/gofrontend/libgo/go/io/ioutil/ioutil.go
deleted file mode 100644
index 909a815..0000000
--- a/third_party/gofrontend/libgo/go/io/ioutil/ioutil.go
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package ioutil implements some I/O utility functions.
-package ioutil
-
-import (
-	"bytes"
-	"io"
-	"os"
-	"sort"
-	"sync"
-)
-
-// readAll reads from r until an error or EOF and returns the data it read
-// from the internal buffer allocated with a specified capacity.
-func readAll(r io.Reader, capacity int64) (b []byte, err error) {
-	buf := bytes.NewBuffer(make([]byte, 0, capacity))
-	// If the buffer overflows, we will get bytes.ErrTooLarge.
-	// Return that as an error. Any other panic remains.
-	defer func() {
-		e := recover()
-		if e == nil {
-			return
-		}
-		if panicErr, ok := e.(error); ok && panicErr == bytes.ErrTooLarge {
-			err = panicErr
-		} else {
-			panic(e)
-		}
-	}()
-	_, err = buf.ReadFrom(r)
-	return buf.Bytes(), err
-}
-
-// ReadAll reads from r until an error or EOF and returns the data it read.
-// A successful call returns err == nil, not err == EOF. Because ReadAll is
-// defined to read from src until EOF, it does not treat an EOF from Read
-// as an error to be reported.
-func ReadAll(r io.Reader) ([]byte, error) {
-	return readAll(r, bytes.MinRead)
-}
-
-// ReadFile reads the file named by filename and returns the contents.
-// A successful call returns err == nil, not err == EOF. Because ReadFile
-// reads the whole file, it does not treat an EOF from Read as an error
-// to be reported.
-func ReadFile(filename string) ([]byte, error) {
-	f, err := os.Open(filename)
-	if err != nil {
-		return nil, err
-	}
-	defer f.Close()
-	// It's a good but not certain bet that FileInfo will tell us exactly how much to
-	// read, so let's try it but be prepared for the answer to be wrong.
-	var n int64
-
-	if fi, err := f.Stat(); err == nil {
-		// Don't preallocate a huge buffer, just in case.
-		if size := fi.Size(); size < 1e9 {
-			n = size
-		}
-	}
-	// As initial capacity for readAll, use n + a little extra in case Size is zero,
-	// and to avoid another allocation after Read has filled the buffer.  The readAll
-	// call will read into its allocated internal buffer cheaply.  If the size was
-	// wrong, we'll either waste some space off the end or reallocate as needed, but
-	// in the overwhelmingly common case we'll get it just right.
-	return readAll(f, n+bytes.MinRead)
-}
-
-// WriteFile writes data to a file named by filename.
-// If the file does not exist, WriteFile creates it with permissions perm;
-// otherwise WriteFile truncates it before writing.
-func WriteFile(filename string, data []byte, perm os.FileMode) error {
-	f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
-	if err != nil {
-		return err
-	}
-	n, err := f.Write(data)
-	if err == nil && n < len(data) {
-		err = io.ErrShortWrite
-	}
-	if err1 := f.Close(); err == nil {
-		err = err1
-	}
-	return err
-}
-
-// byName implements sort.Interface.
-type byName []os.FileInfo
-
-func (f byName) Len() int           { return len(f) }
-func (f byName) Less(i, j int) bool { return f[i].Name() < f[j].Name() }
-func (f byName) Swap(i, j int)      { f[i], f[j] = f[j], f[i] }
-
-// ReadDir reads the directory named by dirname and returns
-// a list of sorted directory entries.
-func ReadDir(dirname string) ([]os.FileInfo, error) {
-	f, err := os.Open(dirname)
-	if err != nil {
-		return nil, err
-	}
-	list, err := f.Readdir(-1)
-	f.Close()
-	if err != nil {
-		return nil, err
-	}
-	sort.Sort(byName(list))
-	return list, nil
-}
-
-type nopCloser struct {
-	io.Reader
-}
-
-func (nopCloser) Close() error { return nil }
-
-// NopCloser returns a ReadCloser with a no-op Close method wrapping
-// the provided Reader r.
-func NopCloser(r io.Reader) io.ReadCloser {
-	return nopCloser{r}
-}
-
-type devNull int
-
-// devNull implements ReaderFrom as an optimization so io.Copy to
-// ioutil.Discard can avoid doing unnecessary work.
-var _ io.ReaderFrom = devNull(0)
-
-func (devNull) Write(p []byte) (int, error) {
-	return len(p), nil
-}
-
-func (devNull) WriteString(s string) (int, error) {
-	return len(s), nil
-}
-
-var blackHolePool = sync.Pool{
-	New: func() interface{} {
-		b := make([]byte, 8192)
-		return &b
-	},
-}
-
-func (devNull) ReadFrom(r io.Reader) (n int64, err error) {
-	bufp := blackHolePool.Get().(*[]byte)
-	readSize := 0
-	for {
-		readSize, err = r.Read(*bufp)
-		n += int64(readSize)
-		if err != nil {
-			blackHolePool.Put(bufp)
-			if err == io.EOF {
-				return n, nil
-			}
-			return
-		}
-	}
-}
-
-// Discard is an io.Writer on which all Write calls succeed
-// without doing anything.
-var Discard io.Writer = devNull(0)
diff --git a/third_party/gofrontend/libgo/go/io/ioutil/ioutil_test.go b/third_party/gofrontend/libgo/go/io/ioutil/ioutil_test.go
deleted file mode 100644
index 81fc602..0000000
--- a/third_party/gofrontend/libgo/go/io/ioutil/ioutil_test.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ioutil
-
-import (
-	"os"
-	"testing"
-)
-
-func checkSize(t *testing.T, path string, size int64) {
-	dir, err := os.Stat(path)
-	if err != nil {
-		t.Fatalf("Stat %q (looking for size %d): %s", path, size, err)
-	}
-	if dir.Size() != size {
-		t.Errorf("Stat %q: size %d want %d", path, dir.Size(), size)
-	}
-}
-
-func TestReadFile(t *testing.T) {
-	filename := "rumpelstilzchen"
-	contents, err := ReadFile(filename)
-	if err == nil {
-		t.Fatalf("ReadFile %s: error expected, none found", filename)
-	}
-
-	filename = "ioutil_test.go"
-	contents, err = ReadFile(filename)
-	if err != nil {
-		t.Fatalf("ReadFile %s: %v", filename, err)
-	}
-
-	checkSize(t, filename, int64(len(contents)))
-}
-
-func TestWriteFile(t *testing.T) {
-	f, err := TempFile("", "ioutil-test")
-	if err != nil {
-		t.Fatal(err)
-	}
-	filename := f.Name()
-	data := "Programming today is a race between software engineers striving to " +
-		"build bigger and better idiot-proof programs, and the Universe trying " +
-		"to produce bigger and better idiots. So far, the Universe is winning."
-
-	if err := WriteFile(filename, []byte(data), 0644); err != nil {
-		t.Fatalf("WriteFile %s: %v", filename, err)
-	}
-
-	contents, err := ReadFile(filename)
-	if err != nil {
-		t.Fatalf("ReadFile %s: %v", filename, err)
-	}
-
-	if string(contents) != data {
-		t.Fatalf("contents = %q\nexpected = %q", string(contents), data)
-	}
-
-	// cleanup
-	f.Close()
-	os.Remove(filename) // ignore error
-}
-
-func TestReadDir(t *testing.T) {
-	dirname := "rumpelstilzchen"
-	_, err := ReadDir(dirname)
-	if err == nil {
-		t.Fatalf("ReadDir %s: error expected, none found", dirname)
-	}
-
-	/* Does not work in gccgo testing environment.
-	dirname = ".."
-	list, err := ReadDir(dirname)
-	if err != nil {
-		t.Fatalf("ReadDir %s: %v", dirname, err)
-	}
-
-	foundFile := false
-	foundSubDir := false
-	for _, dir := range list {
-		switch {
-		case !dir.IsDir() && dir.Name() == "io_test.go":
-			foundFile = true
-		case dir.IsDir() && dir.Name() == "ioutil":
-			foundSubDir = true
-		}
-	}
-	if !foundFile {
-		t.Fatalf("ReadDir %s: io_test.go file not found", dirname)
-	}
-	if !foundSubDir {
-		t.Fatalf("ReadDir %s: ioutil directory not found", dirname)
-	}
-	*/
-}
diff --git a/third_party/gofrontend/libgo/go/io/ioutil/tempfile.go b/third_party/gofrontend/libgo/go/io/ioutil/tempfile.go
deleted file mode 100644
index 61d4a7a..0000000
--- a/third_party/gofrontend/libgo/go/io/ioutil/tempfile.go
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ioutil
-
-import (
-	"os"
-	"path/filepath"
-	"strconv"
-	"sync"
-	"time"
-)
-
-// Random number state.
-// We generate random temporary file names so that there's a good
-// chance the file doesn't exist yet - keeps the number of tries in
-// TempFile to a minimum.
-var rand uint32
-var randmu sync.Mutex
-
-func reseed() uint32 {
-	return uint32(time.Now().UnixNano() + int64(os.Getpid()))
-}
-
-func nextSuffix() string {
-	randmu.Lock()
-	r := rand
-	if r == 0 {
-		r = reseed()
-	}
-	r = r*1664525 + 1013904223 // constants from Numerical Recipes
-	rand = r
-	randmu.Unlock()
-	return strconv.Itoa(int(1e9 + r%1e9))[1:]
-}
-
-// TempFile creates a new temporary file in the directory dir
-// with a name beginning with prefix, opens the file for reading
-// and writing, and returns the resulting *os.File.
-// If dir is the empty string, TempFile uses the default directory
-// for temporary files (see os.TempDir).
-// Multiple programs calling TempFile simultaneously
-// will not choose the same file.  The caller can use f.Name()
-// to find the pathname of the file.  It is the caller's responsibility
-// to remove the file when no longer needed.
-func TempFile(dir, prefix string) (f *os.File, err error) {
-	if dir == "" {
-		dir = os.TempDir()
-	}
-
-	nconflict := 0
-	for i := 0; i < 10000; i++ {
-		name := filepath.Join(dir, prefix+nextSuffix())
-		f, err = os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600)
-		if os.IsExist(err) {
-			if nconflict++; nconflict > 10 {
-				randmu.Lock()
-				rand = reseed()
-				randmu.Unlock()
-			}
-			continue
-		}
-		break
-	}
-	return
-}
-
-// TempDir creates a new temporary directory in the directory dir
-// with a name beginning with prefix and returns the path of the
-// new directory.  If dir is the empty string, TempDir uses the
-// default directory for temporary files (see os.TempDir).
-// Multiple programs calling TempDir simultaneously
-// will not choose the same directory.  It is the caller's responsibility
-// to remove the directory when no longer needed.
-func TempDir(dir, prefix string) (name string, err error) {
-	if dir == "" {
-		dir = os.TempDir()
-	}
-
-	nconflict := 0
-	for i := 0; i < 10000; i++ {
-		try := filepath.Join(dir, prefix+nextSuffix())
-		err = os.Mkdir(try, 0700)
-		if os.IsExist(err) {
-			if nconflict++; nconflict > 10 {
-				randmu.Lock()
-				rand = reseed()
-				randmu.Unlock()
-			}
-			continue
-		}
-		if err == nil {
-			name = try
-		}
-		break
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/io/ioutil/tempfile_test.go b/third_party/gofrontend/libgo/go/io/ioutil/tempfile_test.go
deleted file mode 100644
index d2a132a..0000000
--- a/third_party/gofrontend/libgo/go/io/ioutil/tempfile_test.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ioutil
-
-import (
-	"os"
-	"path/filepath"
-	"regexp"
-	"testing"
-)
-
-func TestTempFile(t *testing.T) {
-	f, err := TempFile("/_not_exists_", "foo")
-	if f != nil || err == nil {
-		t.Errorf("TempFile(`/_not_exists_`, `foo`) = %v, %v", f, err)
-	}
-
-	dir := os.TempDir()
-	f, err = TempFile(dir, "ioutil_test")
-	if f == nil || err != nil {
-		t.Errorf("TempFile(dir, `ioutil_test`) = %v, %v", f, err)
-	}
-	if f != nil {
-		f.Close()
-		os.Remove(f.Name())
-		re := regexp.MustCompile("^" + regexp.QuoteMeta(filepath.Join(dir, "ioutil_test")) + "[0-9]+$")
-		if !re.MatchString(f.Name()) {
-			t.Errorf("TempFile(`"+dir+"`, `ioutil_test`) created bad name %s", f.Name())
-		}
-	}
-}
-
-func TestTempDir(t *testing.T) {
-	name, err := TempDir("/_not_exists_", "foo")
-	if name != "" || err == nil {
-		t.Errorf("TempDir(`/_not_exists_`, `foo`) = %v, %v", name, err)
-	}
-
-	dir := os.TempDir()
-	name, err = TempDir(dir, "ioutil_test")
-	if name == "" || err != nil {
-		t.Errorf("TempDir(dir, `ioutil_test`) = %v, %v", name, err)
-	}
-	if name != "" {
-		os.Remove(name)
-		re := regexp.MustCompile("^" + regexp.QuoteMeta(filepath.Join(dir, "ioutil_test")) + "[0-9]+$")
-		if !re.MatchString(name) {
-			t.Errorf("TempDir(`"+dir+"`, `ioutil_test`) created bad name %s", name)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/io/multi.go b/third_party/gofrontend/libgo/go/io/multi.go
deleted file mode 100644
index e26cc53..0000000
--- a/third_party/gofrontend/libgo/go/io/multi.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io
-
-type multiReader struct {
-	readers []Reader
-}
-
-func (mr *multiReader) Read(p []byte) (n int, err error) {
-	for len(mr.readers) > 0 {
-		n, err = mr.readers[0].Read(p)
-		if n > 0 || err != EOF {
-			if err == EOF {
-				// Don't return EOF yet. There may be more bytes
-				// in the remaining readers.
-				err = nil
-			}
-			return
-		}
-		mr.readers = mr.readers[1:]
-	}
-	return 0, EOF
-}
-
-// MultiReader returns a Reader that's the logical concatenation of
-// the provided input readers.  They're read sequentially.  Once all
-// inputs have returned EOF, Read will return EOF.  If any of the readers
-// return a non-nil, non-EOF error, Read will return that error.
-func MultiReader(readers ...Reader) Reader {
-	r := make([]Reader, len(readers))
-	copy(r, readers)
-	return &multiReader{r}
-}
-
-type multiWriter struct {
-	writers []Writer
-}
-
-func (t *multiWriter) Write(p []byte) (n int, err error) {
-	for _, w := range t.writers {
-		n, err = w.Write(p)
-		if err != nil {
-			return
-		}
-		if n != len(p) {
-			err = ErrShortWrite
-			return
-		}
-	}
-	return len(p), nil
-}
-
-// MultiWriter creates a writer that duplicates its writes to all the
-// provided writers, similar to the Unix tee(1) command.
-func MultiWriter(writers ...Writer) Writer {
-	w := make([]Writer, len(writers))
-	copy(w, writers)
-	return &multiWriter{w}
-}
diff --git a/third_party/gofrontend/libgo/go/io/multi_test.go b/third_party/gofrontend/libgo/go/io/multi_test.go
deleted file mode 100644
index 56c6769..0000000
--- a/third_party/gofrontend/libgo/go/io/multi_test.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io_test
-
-import (
-	"bytes"
-	"crypto/sha1"
-	"fmt"
-	. "io"
-	"io/ioutil"
-	"strings"
-	"testing"
-)
-
-func TestMultiReader(t *testing.T) {
-	var mr Reader
-	var buf []byte
-	nread := 0
-	withFooBar := func(tests func()) {
-		r1 := strings.NewReader("foo ")
-		r2 := strings.NewReader("")
-		r3 := strings.NewReader("bar")
-		mr = MultiReader(r1, r2, r3)
-		buf = make([]byte, 20)
-		tests()
-	}
-	expectRead := func(size int, expected string, eerr error) {
-		nread++
-		n, gerr := mr.Read(buf[0:size])
-		if n != len(expected) {
-			t.Errorf("#%d, expected %d bytes; got %d",
-				nread, len(expected), n)
-		}
-		got := string(buf[0:n])
-		if got != expected {
-			t.Errorf("#%d, expected %q; got %q",
-				nread, expected, got)
-		}
-		if gerr != eerr {
-			t.Errorf("#%d, expected error %v; got %v",
-				nread, eerr, gerr)
-		}
-		buf = buf[n:]
-	}
-	withFooBar(func() {
-		expectRead(2, "fo", nil)
-		expectRead(5, "o ", nil)
-		expectRead(5, "bar", nil)
-		expectRead(5, "", EOF)
-	})
-	withFooBar(func() {
-		expectRead(4, "foo ", nil)
-		expectRead(1, "b", nil)
-		expectRead(3, "ar", nil)
-		expectRead(1, "", EOF)
-	})
-	withFooBar(func() {
-		expectRead(5, "foo ", nil)
-	})
-}
-
-func TestMultiWriter(t *testing.T) {
-	sha1 := sha1.New()
-	sink := new(bytes.Buffer)
-	mw := MultiWriter(sha1, sink)
-
-	sourceString := "My input text."
-	source := strings.NewReader(sourceString)
-	written, err := Copy(mw, source)
-
-	if written != int64(len(sourceString)) {
-		t.Errorf("short write of %d, not %d", written, len(sourceString))
-	}
-
-	if err != nil {
-		t.Errorf("unexpected error: %v", err)
-	}
-
-	sha1hex := fmt.Sprintf("%x", sha1.Sum(nil))
-	if sha1hex != "01cb303fa8c30a64123067c5aa6284ba7ec2d31b" {
-		t.Error("incorrect sha1 value")
-	}
-
-	if sink.String() != sourceString {
-		t.Errorf("expected %q; got %q", sourceString, sink.String())
-	}
-}
-
-// Test that MultiReader copies the input slice and is insulated from future modification.
-func TestMultiReaderCopy(t *testing.T) {
-	slice := []Reader{strings.NewReader("hello world")}
-	r := MultiReader(slice...)
-	slice[0] = nil
-	data, err := ioutil.ReadAll(r)
-	if err != nil || string(data) != "hello world" {
-		t.Errorf("ReadAll() = %q, %v, want %q, nil", data, err, "hello world")
-	}
-}
-
-// Test that MultiWriter copies the input slice and is insulated from future modification.
-func TestMultiWriterCopy(t *testing.T) {
-	var buf bytes.Buffer
-	slice := []Writer{&buf}
-	w := MultiWriter(slice...)
-	slice[0] = nil
-	n, err := w.Write([]byte("hello world"))
-	if err != nil || n != 11 {
-		t.Errorf("Write(`hello world`) = %d, %v, want 11, nil", n, err)
-	}
-	if buf.String() != "hello world" {
-		t.Errorf("buf.String() = %q, want %q", buf.String(), "hello world")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/io/pipe.go b/third_party/gofrontend/libgo/go/io/pipe.go
deleted file mode 100644
index 179515e..0000000
--- a/third_party/gofrontend/libgo/go/io/pipe.go
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Pipe adapter to connect code expecting an io.Reader
-// with code expecting an io.Writer.
-
-package io
-
-import (
-	"errors"
-	"sync"
-)
-
-// ErrClosedPipe is the error used for read or write operations on a closed pipe.
-var ErrClosedPipe = errors.New("io: read/write on closed pipe")
-
-type pipeResult struct {
-	n   int
-	err error
-}
-
-// A pipe is the shared pipe structure underlying PipeReader and PipeWriter.
-type pipe struct {
-	rl    sync.Mutex // gates readers one at a time
-	wl    sync.Mutex // gates writers one at a time
-	l     sync.Mutex // protects remaining fields
-	data  []byte     // data remaining in pending write
-	rwait sync.Cond  // waiting reader
-	wwait sync.Cond  // waiting writer
-	rerr  error      // if reader closed, error to give writes
-	werr  error      // if writer closed, error to give reads
-}
-
-func (p *pipe) read(b []byte) (n int, err error) {
-	// One reader at a time.
-	p.rl.Lock()
-	defer p.rl.Unlock()
-
-	p.l.Lock()
-	defer p.l.Unlock()
-	for {
-		if p.rerr != nil {
-			return 0, ErrClosedPipe
-		}
-		if p.data != nil {
-			break
-		}
-		if p.werr != nil {
-			return 0, p.werr
-		}
-		p.rwait.Wait()
-	}
-	n = copy(b, p.data)
-	p.data = p.data[n:]
-	if len(p.data) == 0 {
-		p.data = nil
-		p.wwait.Signal()
-	}
-	return
-}
-
-var zero [0]byte
-
-func (p *pipe) write(b []byte) (n int, err error) {
-	// pipe uses nil to mean not available
-	if b == nil {
-		b = zero[:]
-	}
-
-	// One writer at a time.
-	p.wl.Lock()
-	defer p.wl.Unlock()
-
-	p.l.Lock()
-	defer p.l.Unlock()
-	if p.werr != nil {
-		err = ErrClosedPipe
-		return
-	}
-	p.data = b
-	p.rwait.Signal()
-	for {
-		if p.data == nil {
-			break
-		}
-		if p.rerr != nil {
-			err = p.rerr
-			break
-		}
-		if p.werr != nil {
-			err = ErrClosedPipe
-		}
-		p.wwait.Wait()
-	}
-	n = len(b) - len(p.data)
-	p.data = nil // in case of rerr or werr
-	return
-}
-
-func (p *pipe) rclose(err error) {
-	if err == nil {
-		err = ErrClosedPipe
-	}
-	p.l.Lock()
-	defer p.l.Unlock()
-	p.rerr = err
-	p.rwait.Signal()
-	p.wwait.Signal()
-}
-
-func (p *pipe) wclose(err error) {
-	if err == nil {
-		err = EOF
-	}
-	p.l.Lock()
-	defer p.l.Unlock()
-	p.werr = err
-	p.rwait.Signal()
-	p.wwait.Signal()
-}
-
-// A PipeReader is the read half of a pipe.
-type PipeReader struct {
-	p *pipe
-}
-
-// Read implements the standard Read interface:
-// it reads data from the pipe, blocking until a writer
-// arrives or the write end is closed.
-// If the write end is closed with an error, that error is
-// returned as err; otherwise err is EOF.
-func (r *PipeReader) Read(data []byte) (n int, err error) {
-	return r.p.read(data)
-}
-
-// Close closes the reader; subsequent writes to the
-// write half of the pipe will return the error ErrClosedPipe.
-func (r *PipeReader) Close() error {
-	return r.CloseWithError(nil)
-}
-
-// CloseWithError closes the reader; subsequent writes
-// to the write half of the pipe will return the error err.
-func (r *PipeReader) CloseWithError(err error) error {
-	r.p.rclose(err)
-	return nil
-}
-
-// A PipeWriter is the write half of a pipe.
-type PipeWriter struct {
-	p *pipe
-}
-
-// Write implements the standard Write interface:
-// it writes data to the pipe, blocking until readers
-// have consumed all the data or the read end is closed.
-// If the read end is closed with an error, that err is
-// returned as err; otherwise err is ErrClosedPipe.
-func (w *PipeWriter) Write(data []byte) (n int, err error) {
-	return w.p.write(data)
-}
-
-// Close closes the writer; subsequent reads from the
-// read half of the pipe will return no bytes and EOF.
-func (w *PipeWriter) Close() error {
-	return w.CloseWithError(nil)
-}
-
-// CloseWithError closes the writer; subsequent reads from the
-// read half of the pipe will return no bytes and the error err,
-// or EOF if err is nil.
-//
-// CloseWithError always returns nil.
-func (w *PipeWriter) CloseWithError(err error) error {
-	w.p.wclose(err)
-	return nil
-}
-
-// Pipe creates a synchronous in-memory pipe.
-// It can be used to connect code expecting an io.Reader
-// with code expecting an io.Writer.
-// Reads on one end are matched with writes on the other,
-// copying data directly between the two; there is no internal buffering.
-// It is safe to call Read and Write in parallel with each other or with
-// Close. Close will complete once pending I/O is done. Parallel calls to
-// Read, and parallel calls to Write, are also safe:
-// the individual calls will be gated sequentially.
-func Pipe() (*PipeReader, *PipeWriter) {
-	p := new(pipe)
-	p.rwait.L = &p.l
-	p.wwait.L = &p.l
-	r := &PipeReader{p}
-	w := &PipeWriter{p}
-	return r, w
-}
diff --git a/third_party/gofrontend/libgo/go/io/pipe_test.go b/third_party/gofrontend/libgo/go/io/pipe_test.go
deleted file mode 100644
index b16e653..0000000
--- a/third_party/gofrontend/libgo/go/io/pipe_test.go
+++ /dev/null
@@ -1,302 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io_test
-
-import (
-	"fmt"
-	. "io"
-	"testing"
-	"time"
-)
-
-func checkWrite(t *testing.T, w Writer, data []byte, c chan int) {
-	n, err := w.Write(data)
-	if err != nil {
-		t.Errorf("write: %v", err)
-	}
-	if n != len(data) {
-		t.Errorf("short write: %d != %d", n, len(data))
-	}
-	c <- 0
-}
-
-// Test a single read/write pair.
-func TestPipe1(t *testing.T) {
-	c := make(chan int)
-	r, w := Pipe()
-	var buf = make([]byte, 64)
-	go checkWrite(t, w, []byte("hello, world"), c)
-	n, err := r.Read(buf)
-	if err != nil {
-		t.Errorf("read: %v", err)
-	} else if n != 12 || string(buf[0:12]) != "hello, world" {
-		t.Errorf("bad read: got %q", buf[0:n])
-	}
-	<-c
-	r.Close()
-	w.Close()
-}
-
-func reader(t *testing.T, r Reader, c chan int) {
-	var buf = make([]byte, 64)
-	for {
-		n, err := r.Read(buf)
-		if err == EOF {
-			c <- 0
-			break
-		}
-		if err != nil {
-			t.Errorf("read: %v", err)
-		}
-		c <- n
-	}
-}
-
-// Test a sequence of read/write pairs.
-func TestPipe2(t *testing.T) {
-	c := make(chan int)
-	r, w := Pipe()
-	go reader(t, r, c)
-	var buf = make([]byte, 64)
-	for i := 0; i < 5; i++ {
-		p := buf[0 : 5+i*10]
-		n, err := w.Write(p)
-		if n != len(p) {
-			t.Errorf("wrote %d, got %d", len(p), n)
-		}
-		if err != nil {
-			t.Errorf("write: %v", err)
-		}
-		nn := <-c
-		if nn != n {
-			t.Errorf("wrote %d, read got %d", n, nn)
-		}
-	}
-	w.Close()
-	nn := <-c
-	if nn != 0 {
-		t.Errorf("final read got %d", nn)
-	}
-}
-
-type pipeReturn struct {
-	n   int
-	err error
-}
-
-// Test a large write that requires multiple reads to satisfy.
-func writer(w WriteCloser, buf []byte, c chan pipeReturn) {
-	n, err := w.Write(buf)
-	w.Close()
-	c <- pipeReturn{n, err}
-}
-
-func TestPipe3(t *testing.T) {
-	c := make(chan pipeReturn)
-	r, w := Pipe()
-	var wdat = make([]byte, 128)
-	for i := 0; i < len(wdat); i++ {
-		wdat[i] = byte(i)
-	}
-	go writer(w, wdat, c)
-	var rdat = make([]byte, 1024)
-	tot := 0
-	for n := 1; n <= 256; n *= 2 {
-		nn, err := r.Read(rdat[tot : tot+n])
-		if err != nil && err != EOF {
-			t.Fatalf("read: %v", err)
-		}
-
-		// only final two reads should be short - 1 byte, then 0
-		expect := n
-		if n == 128 {
-			expect = 1
-		} else if n == 256 {
-			expect = 0
-			if err != EOF {
-				t.Fatalf("read at end: %v", err)
-			}
-		}
-		if nn != expect {
-			t.Fatalf("read %d, expected %d, got %d", n, expect, nn)
-		}
-		tot += nn
-	}
-	pr := <-c
-	if pr.n != 128 || pr.err != nil {
-		t.Fatalf("write 128: %d, %v", pr.n, pr.err)
-	}
-	if tot != 128 {
-		t.Fatalf("total read %d != 128", tot)
-	}
-	for i := 0; i < 128; i++ {
-		if rdat[i] != byte(i) {
-			t.Fatalf("rdat[%d] = %d", i, rdat[i])
-		}
-	}
-}
-
-// Test read after/before writer close.
-
-type closer interface {
-	CloseWithError(error) error
-	Close() error
-}
-
-type pipeTest struct {
-	async          bool
-	err            error
-	closeWithError bool
-}
-
-func (p pipeTest) String() string {
-	return fmt.Sprintf("async=%v err=%v closeWithError=%v", p.async, p.err, p.closeWithError)
-}
-
-var pipeTests = []pipeTest{
-	{true, nil, false},
-	{true, nil, true},
-	{true, ErrShortWrite, true},
-	{false, nil, false},
-	{false, nil, true},
-	{false, ErrShortWrite, true},
-}
-
-func delayClose(t *testing.T, cl closer, ch chan int, tt pipeTest) {
-	time.Sleep(1 * time.Millisecond)
-	var err error
-	if tt.closeWithError {
-		err = cl.CloseWithError(tt.err)
-	} else {
-		err = cl.Close()
-	}
-	if err != nil {
-		t.Errorf("delayClose: %v", err)
-	}
-	ch <- 0
-}
-
-func TestPipeReadClose(t *testing.T) {
-	for _, tt := range pipeTests {
-		c := make(chan int, 1)
-		r, w := Pipe()
-		if tt.async {
-			go delayClose(t, w, c, tt)
-		} else {
-			delayClose(t, w, c, tt)
-		}
-		var buf = make([]byte, 64)
-		n, err := r.Read(buf)
-		<-c
-		want := tt.err
-		if want == nil {
-			want = EOF
-		}
-		if err != want {
-			t.Errorf("read from closed pipe: %v want %v", err, want)
-		}
-		if n != 0 {
-			t.Errorf("read on closed pipe returned %d", n)
-		}
-		if err = r.Close(); err != nil {
-			t.Errorf("r.Close: %v", err)
-		}
-	}
-}
-
-// Test close on Read side during Read.
-func TestPipeReadClose2(t *testing.T) {
-	c := make(chan int, 1)
-	r, _ := Pipe()
-	go delayClose(t, r, c, pipeTest{})
-	n, err := r.Read(make([]byte, 64))
-	<-c
-	if n != 0 || err != ErrClosedPipe {
-		t.Errorf("read from closed pipe: %v, %v want %v, %v", n, err, 0, ErrClosedPipe)
-	}
-}
-
-// Test write after/before reader close.
-
-func TestPipeWriteClose(t *testing.T) {
-	for _, tt := range pipeTests {
-		c := make(chan int, 1)
-		r, w := Pipe()
-		if tt.async {
-			go delayClose(t, r, c, tt)
-		} else {
-			delayClose(t, r, c, tt)
-		}
-		n, err := WriteString(w, "hello, world")
-		<-c
-		expect := tt.err
-		if expect == nil {
-			expect = ErrClosedPipe
-		}
-		if err != expect {
-			t.Errorf("write on closed pipe: %v want %v", err, expect)
-		}
-		if n != 0 {
-			t.Errorf("write on closed pipe returned %d", n)
-		}
-		if err = w.Close(); err != nil {
-			t.Errorf("w.Close: %v", err)
-		}
-	}
-}
-
-func TestWriteEmpty(t *testing.T) {
-	r, w := Pipe()
-	go func() {
-		w.Write([]byte{})
-		w.Close()
-	}()
-	var b [2]byte
-	ReadFull(r, b[0:2])
-	r.Close()
-}
-
-func TestWriteNil(t *testing.T) {
-	r, w := Pipe()
-	go func() {
-		w.Write(nil)
-		w.Close()
-	}()
-	var b [2]byte
-	ReadFull(r, b[0:2])
-	r.Close()
-}
-
-func TestWriteAfterWriterClose(t *testing.T) {
-	r, w := Pipe()
-
-	done := make(chan bool)
-	var writeErr error
-	go func() {
-		_, err := w.Write([]byte("hello"))
-		if err != nil {
-			t.Errorf("got error: %q; expected none", err)
-		}
-		w.Close()
-		_, writeErr = w.Write([]byte("world"))
-		done <- true
-	}()
-
-	buf := make([]byte, 100)
-	var result string
-	n, err := ReadFull(r, buf)
-	if err != nil && err != ErrUnexpectedEOF {
-		t.Fatalf("got: %q; want: %q", err, ErrUnexpectedEOF)
-	}
-	result = string(buf[0:n])
-	<-done
-
-	if result != "hello" {
-		t.Errorf("got: %q; want: %q", result, "hello")
-	}
-	if writeErr != ErrClosedPipe {
-		t.Errorf("got: %q; want: %q", writeErr, ErrClosedPipe)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/log/log.go b/third_party/gofrontend/libgo/go/log/log.go
deleted file mode 100644
index 4cfe550..0000000
--- a/third_party/gofrontend/libgo/go/log/log.go
+++ /dev/null
@@ -1,346 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package log implements a simple logging package. It defines a type, Logger,
-// with methods for formatting output. It also has a predefined 'standard'
-// Logger accessible through helper functions Print[f|ln], Fatal[f|ln], and
-// Panic[f|ln], which are easier to use than creating a Logger manually.
-// That logger writes to standard error and prints the date and time
-// of each logged message.
-// The Fatal functions call os.Exit(1) after writing the log message.
-// The Panic functions call panic after writing the log message.
-package log
-
-import (
-	"fmt"
-	"io"
-	"os"
-	"runtime"
-	"sync"
-	"time"
-)
-
-// These flags define which text to prefix to each log entry generated by the Logger.
-const (
-	// Bits or'ed together to control what's printed.
-	// There is no control over the order they appear (the order listed
-	// here) or the format they present (as described in the comments).
-	// The prefix is followed by a colon only when Llongfile or Lshortfile
-	// is specified.
-	// For example, flags Ldate | Ltime (or LstdFlags) produce,
-	//	2009/01/23 01:23:23 message
-	// while flags Ldate | Ltime | Lmicroseconds | Llongfile produce,
-	//	2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
-	Ldate         = 1 << iota     // the date in the local time zone: 2009/01/23
-	Ltime                         // the time in the local time zone: 01:23:23
-	Lmicroseconds                 // microsecond resolution: 01:23:23.123123.  assumes Ltime.
-	Llongfile                     // full file name and line number: /a/b/c/d.go:23
-	Lshortfile                    // final file name element and line number: d.go:23. overrides Llongfile
-	LUTC                          // if Ldate or Ltime is set, use UTC rather than the local time zone
-	LstdFlags     = Ldate | Ltime // initial values for the standard logger
-)
-
-// A Logger represents an active logging object that generates lines of
-// output to an io.Writer.  Each logging operation makes a single call to
-// the Writer's Write method.  A Logger can be used simultaneously from
-// multiple goroutines; it guarantees to serialize access to the Writer.
-type Logger struct {
-	mu     sync.Mutex // ensures atomic writes; protects the following fields
-	prefix string     // prefix to write at beginning of each line
-	flag   int        // properties
-	out    io.Writer  // destination for output
-	buf    []byte     // for accumulating text to write
-}
-
-// New creates a new Logger.   The out variable sets the
-// destination to which log data will be written.
-// The prefix appears at the beginning of each generated log line.
-// The flag argument defines the logging properties.
-func New(out io.Writer, prefix string, flag int) *Logger {
-	return &Logger{out: out, prefix: prefix, flag: flag}
-}
-
-// SetOutput sets the output destination for the logger.
-func (l *Logger) SetOutput(w io.Writer) {
-	l.mu.Lock()
-	defer l.mu.Unlock()
-	l.out = w
-}
-
-var std = New(os.Stderr, "", LstdFlags)
-
-// Cheap integer to fixed-width decimal ASCII.  Give a negative width to avoid zero-padding.
-func itoa(buf *[]byte, i int, wid int) {
-	// Assemble decimal in reverse order.
-	var b [20]byte
-	bp := len(b) - 1
-	for i >= 10 || wid > 1 {
-		wid--
-		q := i / 10
-		b[bp] = byte('0' + i - q*10)
-		bp--
-		i = q
-	}
-	// i < 10
-	b[bp] = byte('0' + i)
-	*buf = append(*buf, b[bp:]...)
-}
-
-func (l *Logger) formatHeader(buf *[]byte, t time.Time, file string, line int) {
-	*buf = append(*buf, l.prefix...)
-	if l.flag&LUTC != 0 {
-		t = t.UTC()
-	}
-	if l.flag&(Ldate|Ltime|Lmicroseconds) != 0 {
-		if l.flag&Ldate != 0 {
-			year, month, day := t.Date()
-			itoa(buf, year, 4)
-			*buf = append(*buf, '/')
-			itoa(buf, int(month), 2)
-			*buf = append(*buf, '/')
-			itoa(buf, day, 2)
-			*buf = append(*buf, ' ')
-		}
-		if l.flag&(Ltime|Lmicroseconds) != 0 {
-			hour, min, sec := t.Clock()
-			itoa(buf, hour, 2)
-			*buf = append(*buf, ':')
-			itoa(buf, min, 2)
-			*buf = append(*buf, ':')
-			itoa(buf, sec, 2)
-			if l.flag&Lmicroseconds != 0 {
-				*buf = append(*buf, '.')
-				itoa(buf, t.Nanosecond()/1e3, 6)
-			}
-			*buf = append(*buf, ' ')
-		}
-	}
-	if l.flag&(Lshortfile|Llongfile) != 0 {
-		if l.flag&Lshortfile != 0 {
-			short := file
-			for i := len(file) - 1; i > 0; i-- {
-				if file[i] == '/' {
-					short = file[i+1:]
-					break
-				}
-			}
-			file = short
-		}
-		*buf = append(*buf, file...)
-		*buf = append(*buf, ':')
-		itoa(buf, line, -1)
-		*buf = append(*buf, ": "...)
-	}
-}
-
-// Output writes the output for a logging event.  The string s contains
-// the text to print after the prefix specified by the flags of the
-// Logger.  A newline is appended if the last character of s is not
-// already a newline.  Calldepth is used to recover the PC and is
-// provided for generality, although at the moment on all pre-defined
-// paths it will be 2.
-func (l *Logger) Output(calldepth int, s string) error {
-	now := time.Now() // get this early.
-	var file string
-	var line int
-	l.mu.Lock()
-	defer l.mu.Unlock()
-	if l.flag&(Lshortfile|Llongfile) != 0 {
-		// release lock while getting caller info - it's expensive.
-		l.mu.Unlock()
-		var ok bool
-		_, file, line, ok = runtime.Caller(calldepth)
-		if !ok {
-			file = "???"
-			line = 0
-		}
-		l.mu.Lock()
-	}
-	l.buf = l.buf[:0]
-	l.formatHeader(&l.buf, now, file, line)
-	l.buf = append(l.buf, s...)
-	if len(s) == 0 || s[len(s)-1] != '\n' {
-		l.buf = append(l.buf, '\n')
-	}
-	_, err := l.out.Write(l.buf)
-	return err
-}
-
-// Printf calls l.Output to print to the logger.
-// Arguments are handled in the manner of fmt.Printf.
-func (l *Logger) Printf(format string, v ...interface{}) {
-	l.Output(2, fmt.Sprintf(format, v...))
-}
-
-// Print calls l.Output to print to the logger.
-// Arguments are handled in the manner of fmt.Print.
-func (l *Logger) Print(v ...interface{}) { l.Output(2, fmt.Sprint(v...)) }
-
-// Println calls l.Output to print to the logger.
-// Arguments are handled in the manner of fmt.Println.
-func (l *Logger) Println(v ...interface{}) { l.Output(2, fmt.Sprintln(v...)) }
-
-// Fatal is equivalent to l.Print() followed by a call to os.Exit(1).
-func (l *Logger) Fatal(v ...interface{}) {
-	l.Output(2, fmt.Sprint(v...))
-	os.Exit(1)
-}
-
-// Fatalf is equivalent to l.Printf() followed by a call to os.Exit(1).
-func (l *Logger) Fatalf(format string, v ...interface{}) {
-	l.Output(2, fmt.Sprintf(format, v...))
-	os.Exit(1)
-}
-
-// Fatalln is equivalent to l.Println() followed by a call to os.Exit(1).
-func (l *Logger) Fatalln(v ...interface{}) {
-	l.Output(2, fmt.Sprintln(v...))
-	os.Exit(1)
-}
-
-// Panic is equivalent to l.Print() followed by a call to panic().
-func (l *Logger) Panic(v ...interface{}) {
-	s := fmt.Sprint(v...)
-	l.Output(2, s)
-	panic(s)
-}
-
-// Panicf is equivalent to l.Printf() followed by a call to panic().
-func (l *Logger) Panicf(format string, v ...interface{}) {
-	s := fmt.Sprintf(format, v...)
-	l.Output(2, s)
-	panic(s)
-}
-
-// Panicln is equivalent to l.Println() followed by a call to panic().
-func (l *Logger) Panicln(v ...interface{}) {
-	s := fmt.Sprintln(v...)
-	l.Output(2, s)
-	panic(s)
-}
-
-// Flags returns the output flags for the logger.
-func (l *Logger) Flags() int {
-	l.mu.Lock()
-	defer l.mu.Unlock()
-	return l.flag
-}
-
-// SetFlags sets the output flags for the logger.
-func (l *Logger) SetFlags(flag int) {
-	l.mu.Lock()
-	defer l.mu.Unlock()
-	l.flag = flag
-}
-
-// Prefix returns the output prefix for the logger.
-func (l *Logger) Prefix() string {
-	l.mu.Lock()
-	defer l.mu.Unlock()
-	return l.prefix
-}
-
-// SetPrefix sets the output prefix for the logger.
-func (l *Logger) SetPrefix(prefix string) {
-	l.mu.Lock()
-	defer l.mu.Unlock()
-	l.prefix = prefix
-}
-
-// SetOutput sets the output destination for the standard logger.
-func SetOutput(w io.Writer) {
-	std.mu.Lock()
-	defer std.mu.Unlock()
-	std.out = w
-}
-
-// Flags returns the output flags for the standard logger.
-func Flags() int {
-	return std.Flags()
-}
-
-// SetFlags sets the output flags for the standard logger.
-func SetFlags(flag int) {
-	std.SetFlags(flag)
-}
-
-// Prefix returns the output prefix for the standard logger.
-func Prefix() string {
-	return std.Prefix()
-}
-
-// SetPrefix sets the output prefix for the standard logger.
-func SetPrefix(prefix string) {
-	std.SetPrefix(prefix)
-}
-
-// These functions write to the standard logger.
-
-// Print calls Output to print to the standard logger.
-// Arguments are handled in the manner of fmt.Print.
-func Print(v ...interface{}) {
-	std.Output(2, fmt.Sprint(v...))
-}
-
-// Printf calls Output to print to the standard logger.
-// Arguments are handled in the manner of fmt.Printf.
-func Printf(format string, v ...interface{}) {
-	std.Output(2, fmt.Sprintf(format, v...))
-}
-
-// Println calls Output to print to the standard logger.
-// Arguments are handled in the manner of fmt.Println.
-func Println(v ...interface{}) {
-	std.Output(2, fmt.Sprintln(v...))
-}
-
-// Fatal is equivalent to Print() followed by a call to os.Exit(1).
-func Fatal(v ...interface{}) {
-	std.Output(2, fmt.Sprint(v...))
-	os.Exit(1)
-}
-
-// Fatalf is equivalent to Printf() followed by a call to os.Exit(1).
-func Fatalf(format string, v ...interface{}) {
-	std.Output(2, fmt.Sprintf(format, v...))
-	os.Exit(1)
-}
-
-// Fatalln is equivalent to Println() followed by a call to os.Exit(1).
-func Fatalln(v ...interface{}) {
-	std.Output(2, fmt.Sprintln(v...))
-	os.Exit(1)
-}
-
-// Panic is equivalent to Print() followed by a call to panic().
-func Panic(v ...interface{}) {
-	s := fmt.Sprint(v...)
-	std.Output(2, s)
-	panic(s)
-}
-
-// Panicf is equivalent to Printf() followed by a call to panic().
-func Panicf(format string, v ...interface{}) {
-	s := fmt.Sprintf(format, v...)
-	std.Output(2, s)
-	panic(s)
-}
-
-// Panicln is equivalent to Println() followed by a call to panic().
-func Panicln(v ...interface{}) {
-	s := fmt.Sprintln(v...)
-	std.Output(2, s)
-	panic(s)
-}
-
-// Output writes the output for a logging event.  The string s contains
-// the text to print after the prefix specified by the flags of the
-// Logger.  A newline is appended if the last character of s is not
-// already a newline.  Calldepth is the count of the number of
-// frames to skip when computing the file name and line number
-// if Llongfile or Lshortfile is set; a value of 1 will print the details
-// for the caller of Output.
-func Output(calldepth int, s string) error {
-	return std.Output(calldepth+1, s) // +1 for this frame.
-}
diff --git a/third_party/gofrontend/libgo/go/log/log_test.go b/third_party/gofrontend/libgo/go/log/log_test.go
deleted file mode 100644
index dd16c9d..0000000
--- a/third_party/gofrontend/libgo/go/log/log_test.go
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package log
-
-// These tests are too simple.
-
-import (
-	"bytes"
-	"fmt"
-	"os"
-	"regexp"
-	"strings"
-	"testing"
-	"time"
-)
-
-const (
-	Rdate         = `[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]`
-	Rtime         = `[0-9][0-9]:[0-9][0-9]:[0-9][0-9]`
-	Rmicroseconds = `\.[0-9][0-9][0-9][0-9][0-9][0-9]`
-	Rline         = `(57|59):` // must update if the calls to l.Printf / l.Print below move
-	Rlongfile     = `.*/[A-Za-z0-9_\-]+\.go:` + Rline
-	Rshortfile    = `[A-Za-z0-9_\-]+\.go:` + Rline
-)
-
-type tester struct {
-	flag    int
-	prefix  string
-	pattern string // regexp that log output must match; we add ^ and expected_text$ always
-}
-
-var tests = []tester{
-	// individual pieces:
-	{0, "", ""},
-	{0, "XXX", "XXX"},
-	{Ldate, "", Rdate + " "},
-	{Ltime, "", Rtime + " "},
-	{Ltime | Lmicroseconds, "", Rtime + Rmicroseconds + " "},
-	{Lmicroseconds, "", Rtime + Rmicroseconds + " "}, // microsec implies time
-	{Llongfile, "", Rlongfile + " "},
-	{Lshortfile, "", Rshortfile + " "},
-	{Llongfile | Lshortfile, "", Rshortfile + " "}, // shortfile overrides longfile
-	// everything at once:
-	{Ldate | Ltime | Lmicroseconds | Llongfile, "XXX", "XXX" + Rdate + " " + Rtime + Rmicroseconds + " " + Rlongfile + " "},
-	{Ldate | Ltime | Lmicroseconds | Lshortfile, "XXX", "XXX" + Rdate + " " + Rtime + Rmicroseconds + " " + Rshortfile + " "},
-}
-
-// Test using Println("hello", 23, "world") or using Printf("hello %d world", 23)
-func testPrint(t *testing.T, flag int, prefix string, pattern string, useFormat bool) {
-	buf := new(bytes.Buffer)
-	SetOutput(buf)
-	SetFlags(flag)
-	SetPrefix(prefix)
-	if useFormat {
-		Printf("hello %d world", 23)
-	} else {
-		Println("hello", 23, "world")
-	}
-	line := buf.String()
-	line = line[0 : len(line)-1]
-	pattern = "^" + pattern + "hello 23 world$"
-	matched, err4 := regexp.MatchString(pattern, line)
-	if err4 != nil {
-		t.Fatal("pattern did not compile:", err4)
-	}
-	if !matched {
-		t.Errorf("log output should match %q is %q", pattern, line)
-	}
-	SetOutput(os.Stderr)
-}
-
-func TestAll(t *testing.T) {
-	for _, testcase := range tests {
-		testPrint(t, testcase.flag, testcase.prefix, testcase.pattern, false)
-		testPrint(t, testcase.flag, testcase.prefix, testcase.pattern, true)
-	}
-}
-
-func TestOutput(t *testing.T) {
-	const testString = "test"
-	var b bytes.Buffer
-	l := New(&b, "", 0)
-	l.Println(testString)
-	if expect := testString + "\n"; b.String() != expect {
-		t.Errorf("log output should match %q is %q", expect, b.String())
-	}
-}
-
-func TestFlagAndPrefixSetting(t *testing.T) {
-	var b bytes.Buffer
-	l := New(&b, "Test:", LstdFlags)
-	f := l.Flags()
-	if f != LstdFlags {
-		t.Errorf("Flags 1: expected %x got %x", LstdFlags, f)
-	}
-	l.SetFlags(f | Lmicroseconds)
-	f = l.Flags()
-	if f != LstdFlags|Lmicroseconds {
-		t.Errorf("Flags 2: expected %x got %x", LstdFlags|Lmicroseconds, f)
-	}
-	p := l.Prefix()
-	if p != "Test:" {
-		t.Errorf(`Prefix: expected "Test:" got %q`, p)
-	}
-	l.SetPrefix("Reality:")
-	p = l.Prefix()
-	if p != "Reality:" {
-		t.Errorf(`Prefix: expected "Reality:" got %q`, p)
-	}
-	// Verify a log message looks right, with our prefix and microseconds present.
-	l.Print("hello")
-	pattern := "^Reality:" + Rdate + " " + Rtime + Rmicroseconds + " hello\n"
-	matched, err := regexp.Match(pattern, b.Bytes())
-	if err != nil {
-		t.Fatalf("pattern %q did not compile: %s", pattern, err)
-	}
-	if !matched {
-		t.Error("message did not match pattern")
-	}
-}
-
-func TestUTCFlag(t *testing.T) {
-	var b bytes.Buffer
-	l := New(&b, "Test:", LstdFlags)
-	l.SetFlags(Ldate | Ltime | LUTC)
-	// Verify a log message looks right in the right time zone. Quantize to the second only.
-	now := time.Now().UTC()
-	l.Print("hello")
-	want := fmt.Sprintf("Test:%d/%.2d/%.2d %.2d:%.2d:%.2d hello\n",
-		now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
-	got := b.String()
-	if got == want {
-		return
-	}
-	// It's possible we crossed a second boundary between getting now and logging,
-	// so add a second and try again. This should very nearly always work.
-	now = now.Add(time.Second)
-	want = fmt.Sprintf("Test:%d/%.2d/%.2d %.2d:%.2d:%.2d hello\n",
-		now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
-	if got == want {
-		return
-	}
-	t.Errorf("got %q; want %q", got, want)
-}
-
-func TestEmptyPrintCreatesLine(t *testing.T) {
-	var b bytes.Buffer
-	l := New(&b, "Header:", LstdFlags)
-	l.Print()
-	l.Println("non-empty")
-	output := b.String()
-	if n := strings.Count(output, "Header"); n != 2 {
-		t.Errorf("expected 2 headers, got %d", n)
-	}
-	if n := strings.Count(output, "\n"); n != 2 {
-		t.Errorf("expected 2 lines, got %d", n)
-	}
-}
-
-func BenchmarkItoa(b *testing.B) {
-	dst := make([]byte, 0, 64)
-	for i := 0; i < b.N; i++ {
-		dst = dst[0:0]
-		itoa(&dst, 2015, 4)   // year
-		itoa(&dst, 1, 2)      // month
-		itoa(&dst, 30, 2)     // day
-		itoa(&dst, 12, 2)     // hour
-		itoa(&dst, 56, 2)     // minute
-		itoa(&dst, 0, 2)      // second
-		itoa(&dst, 987654, 6) // microsecond
-	}
-}
-
-func BenchmarkPrintln(b *testing.B) {
-	const testString = "test"
-	var buf bytes.Buffer
-	l := New(&buf, "", LstdFlags)
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		l.Println(testString)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/log/syslog/doc.go b/third_party/gofrontend/libgo/go/log/syslog/doc.go
deleted file mode 100644
index 54e76ed..0000000
--- a/third_party/gofrontend/libgo/go/log/syslog/doc.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package syslog provides a simple interface to the system log
-// service. It can send messages to the syslog daemon using UNIX
-// domain sockets, UDP or TCP.
-//
-// Only one call to Dial is necessary. On write failures,
-// the syslog client will attempt to reconnect to the server
-// and write again.
-package syslog
-
-// BUG(brainman): This package is not implemented on Windows yet.
-
-// BUG(akumar): This package is not implemented on Plan 9 yet.
-
-// BUG(minux): This package is not implemented on NaCl (Native Client) yet.
diff --git a/third_party/gofrontend/libgo/go/log/syslog/syslog.go b/third_party/gofrontend/libgo/go/log/syslog/syslog.go
deleted file mode 100644
index 4bf4476..0000000
--- a/third_party/gofrontend/libgo/go/log/syslog/syslog.go
+++ /dev/null
@@ -1,312 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !windows,!nacl,!plan9
-
-package syslog
-
-import (
-	"errors"
-	"fmt"
-	"log"
-	"net"
-	"os"
-	"strings"
-	"sync"
-	"time"
-)
-
-// The Priority is a combination of the syslog facility and
-// severity. For example, LOG_ALERT | LOG_FTP sends an alert severity
-// message from the FTP facility. The default severity is LOG_EMERG;
-// the default facility is LOG_KERN.
-type Priority int
-
-const severityMask = 0x07
-const facilityMask = 0xf8
-
-const (
-	// Severity.
-
-	// From /usr/include/sys/syslog.h.
-	// These are the same on Linux, BSD, and OS X.
-	LOG_EMERG Priority = iota
-	LOG_ALERT
-	LOG_CRIT
-	LOG_ERR
-	LOG_WARNING
-	LOG_NOTICE
-	LOG_INFO
-	LOG_DEBUG
-)
-
-const (
-	// Facility.
-
-	// From /usr/include/sys/syslog.h.
-	// These are the same up to LOG_FTP on Linux, BSD, and OS X.
-	LOG_KERN Priority = iota << 3
-	LOG_USER
-	LOG_MAIL
-	LOG_DAEMON
-	LOG_AUTH
-	LOG_SYSLOG
-	LOG_LPR
-	LOG_NEWS
-	LOG_UUCP
-	LOG_CRON
-	LOG_AUTHPRIV
-	LOG_FTP
-	_ // unused
-	_ // unused
-	_ // unused
-	_ // unused
-	LOG_LOCAL0
-	LOG_LOCAL1
-	LOG_LOCAL2
-	LOG_LOCAL3
-	LOG_LOCAL4
-	LOG_LOCAL5
-	LOG_LOCAL6
-	LOG_LOCAL7
-)
-
-// A Writer is a connection to a syslog server.
-type Writer struct {
-	priority Priority
-	tag      string
-	hostname string
-	network  string
-	raddr    string
-
-	mu   sync.Mutex // guards conn
-	conn serverConn
-}
-
-// This interface and the separate syslog_unix.go file exist for
-// Solaris support as implemented by gccgo.  On Solaris you can not
-// simply open a TCP connection to the syslog daemon.  The gccgo
-// sources have a syslog_solaris.go file that implements unixSyslog to
-// return a type that satisfies this interface and simply calls the C
-// library syslog function.
-type serverConn interface {
-	writeString(p Priority, hostname, tag, s, nl string) error
-	close() error
-}
-
-type netConn struct {
-	local bool
-	conn  net.Conn
-}
-
-// New establishes a new connection to the system log daemon.  Each
-// write to the returned writer sends a log message with the given
-// priority and prefix.
-func New(priority Priority, tag string) (w *Writer, err error) {
-	return Dial("", "", priority, tag)
-}
-
-// Dial establishes a connection to a log daemon by connecting to
-// address raddr on the specified network.  Each write to the returned
-// writer sends a log message with the given facility, severity and
-// tag.
-// If network is empty, Dial will connect to the local syslog server.
-func Dial(network, raddr string, priority Priority, tag string) (*Writer, error) {
-	if priority < 0 || priority > LOG_LOCAL7|LOG_DEBUG {
-		return nil, errors.New("log/syslog: invalid priority")
-	}
-
-	if tag == "" {
-		tag = os.Args[0]
-	}
-	hostname, _ := os.Hostname()
-
-	w := &Writer{
-		priority: priority,
-		tag:      tag,
-		hostname: hostname,
-		network:  network,
-		raddr:    raddr,
-	}
-
-	w.mu.Lock()
-	defer w.mu.Unlock()
-
-	err := w.connect()
-	if err != nil {
-		return nil, err
-	}
-	return w, err
-}
-
-// connect makes a connection to the syslog server.
-// It must be called with w.mu held.
-func (w *Writer) connect() (err error) {
-	if w.conn != nil {
-		// ignore err from close, it makes sense to continue anyway
-		w.conn.close()
-		w.conn = nil
-	}
-
-	if w.network == "" {
-		w.conn, err = unixSyslog()
-		if w.hostname == "" {
-			w.hostname = "localhost"
-		}
-	} else {
-		var c net.Conn
-		c, err = net.Dial(w.network, w.raddr)
-		if err == nil {
-			w.conn = &netConn{conn: c}
-			if w.hostname == "" {
-				w.hostname = c.LocalAddr().String()
-			}
-		}
-	}
-	return
-}
-
-// Write sends a log message to the syslog daemon.
-func (w *Writer) Write(b []byte) (int, error) {
-	return w.writeAndRetry(w.priority, string(b))
-}
-
-// Close closes a connection to the syslog daemon.
-func (w *Writer) Close() error {
-	w.mu.Lock()
-	defer w.mu.Unlock()
-
-	if w.conn != nil {
-		err := w.conn.close()
-		w.conn = nil
-		return err
-	}
-	return nil
-}
-
-// Emerg logs a message with severity LOG_EMERG, ignoring the severity
-// passed to New.
-func (w *Writer) Emerg(m string) (err error) {
-	_, err = w.writeAndRetry(LOG_EMERG, m)
-	return err
-}
-
-// Alert logs a message with severity LOG_ALERT, ignoring the severity
-// passed to New.
-func (w *Writer) Alert(m string) (err error) {
-	_, err = w.writeAndRetry(LOG_ALERT, m)
-	return err
-}
-
-// Crit logs a message with severity LOG_CRIT, ignoring the severity
-// passed to New.
-func (w *Writer) Crit(m string) (err error) {
-	_, err = w.writeAndRetry(LOG_CRIT, m)
-	return err
-}
-
-// Err logs a message with severity LOG_ERR, ignoring the severity
-// passed to New.
-func (w *Writer) Err(m string) (err error) {
-	_, err = w.writeAndRetry(LOG_ERR, m)
-	return err
-}
-
-// Warning logs a message with severity LOG_WARNING, ignoring the
-// severity passed to New.
-func (w *Writer) Warning(m string) (err error) {
-	_, err = w.writeAndRetry(LOG_WARNING, m)
-	return err
-}
-
-// Notice logs a message with severity LOG_NOTICE, ignoring the
-// severity passed to New.
-func (w *Writer) Notice(m string) (err error) {
-	_, err = w.writeAndRetry(LOG_NOTICE, m)
-	return err
-}
-
-// Info logs a message with severity LOG_INFO, ignoring the severity
-// passed to New.
-func (w *Writer) Info(m string) (err error) {
-	_, err = w.writeAndRetry(LOG_INFO, m)
-	return err
-}
-
-// Debug logs a message with severity LOG_DEBUG, ignoring the severity
-// passed to New.
-func (w *Writer) Debug(m string) (err error) {
-	_, err = w.writeAndRetry(LOG_DEBUG, m)
-	return err
-}
-
-func (w *Writer) writeAndRetry(p Priority, s string) (int, error) {
-	pr := (w.priority & facilityMask) | (p & severityMask)
-
-	w.mu.Lock()
-	defer w.mu.Unlock()
-
-	if w.conn != nil {
-		if n, err := w.write(pr, s); err == nil {
-			return n, err
-		}
-	}
-	if err := w.connect(); err != nil {
-		return 0, err
-	}
-	return w.write(pr, s)
-}
-
-// write generates and writes a syslog formatted string. The
-// format is as follows: <PRI>TIMESTAMP HOSTNAME TAG[PID]: MSG
-func (w *Writer) write(p Priority, msg string) (int, error) {
-	// ensure it ends in a \n
-	nl := ""
-	if !strings.HasSuffix(msg, "\n") {
-		nl = "\n"
-	}
-
-	err := w.conn.writeString(p, w.hostname, w.tag, msg, nl)
-	if err != nil {
-		return 0, err
-	}
-	// Note: return the length of the input, not the number of
-	// bytes printed by Fprintf, because this must behave like
-	// an io.Writer.
-	return len(msg), nil
-}
-
-func (n *netConn) writeString(p Priority, hostname, tag, msg, nl string) error {
-	if n.local {
-		// Compared to the network form below, the changes are:
-		//	1. Use time.Stamp instead of time.RFC3339.
-		//	2. Drop the hostname field from the Fprintf.
-		timestamp := time.Now().Format(time.Stamp)
-		_, err := fmt.Fprintf(n.conn, "<%d>%s %s[%d]: %s%s",
-			p, timestamp,
-			tag, os.Getpid(), msg, nl)
-		return err
-	}
-	timestamp := time.Now().Format(time.RFC3339)
-	_, err := fmt.Fprintf(n.conn, "<%d>%s %s %s[%d]: %s%s",
-		p, timestamp, hostname,
-		tag, os.Getpid(), msg, nl)
-	return err
-}
-
-func (n *netConn) close() error {
-	return n.conn.Close()
-}
-
-// NewLogger creates a log.Logger whose output is written to
-// the system log service with the specified priority. The logFlag
-// argument is the flag set passed through to log.New to create
-// the Logger.
-func NewLogger(p Priority, logFlag int) (*log.Logger, error) {
-	s, err := New(p, "")
-	if err != nil {
-		return nil, err
-	}
-	return log.New(s, "", logFlag), nil
-}
diff --git a/third_party/gofrontend/libgo/go/log/syslog/syslog_c.c b/third_party/gofrontend/libgo/go/log/syslog/syslog_c.c
deleted file mode 100644
index 5b33d78..0000000
--- a/third_party/gofrontend/libgo/go/log/syslog/syslog_c.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* syslog_c.c -- call syslog for Go.
-
-   Copyright 2011 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <syslog.h>
-
-#include "runtime.h"
-
-/* We need to use a C function to call the syslog function, because we
-   can't represent a C varargs function in Go.  */
-
-void syslog_c(intgo, const char*)
-  __asm__ (GOSYM_PREFIX "log_syslog.syslog_c");
-
-void
-syslog_c (intgo priority, const char *msg)
-{
-  syslog (priority, "%s", msg);
-}
diff --git a/third_party/gofrontend/libgo/go/log/syslog/syslog_libc.go b/third_party/gofrontend/libgo/go/log/syslog/syslog_libc.go
deleted file mode 100644
index cf370ef..0000000
--- a/third_party/gofrontend/libgo/go/log/syslog/syslog_libc.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// gccgo specific implementation of syslog for Solaris.  Solaris uses
-// STREAMS to communicate with syslogd.  That is enough of a pain that
-// we just call the libc function.
-
-package syslog
-
-import (
-	"fmt"
-	"os"
-	"syscall"
-	"time"
-)
-
-func unixSyslog() (conn serverConn, err error) {
-	return libcConn(0), nil
-}
-
-type libcConn int
-
-func syslog_c(int, *byte)
-
-func (libcConn) writeString(p Priority, hostname, tag, msg, nl string) error {
-	timestamp := time.Now().Format(time.RFC3339)
-	log := fmt.Sprintf("%s %s %s[%d]: %s%s", timestamp, hostname, tag, os.Getpid(), msg, nl)
-	buf, err := syscall.BytePtrFromString(log)
-	if err != nil {
-		return err
-	}
-	syscall.Entersyscall()
-	syslog_c(int(p), buf)
-	syscall.Exitsyscall()
-	return nil
-}
-
-func (libcConn) close() error {
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/log/syslog/syslog_test.go b/third_party/gofrontend/libgo/go/log/syslog/syslog_test.go
deleted file mode 100644
index 85aec53..0000000
--- a/third_party/gofrontend/libgo/go/log/syslog/syslog_test.go
+++ /dev/null
@@ -1,381 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !windows,!nacl,!plan9
-
-package syslog
-
-import (
-	"bufio"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	"net"
-	"os"
-	"runtime"
-	"sync"
-	"testing"
-	"time"
-)
-
-func runPktSyslog(c net.PacketConn, done chan<- string) {
-	var buf [4096]byte
-	var rcvd string
-	ct := 0
-	for {
-		var n int
-		var err error
-
-		c.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
-		n, _, err = c.ReadFrom(buf[:])
-		rcvd += string(buf[:n])
-		if err != nil {
-			if oe, ok := err.(*net.OpError); ok {
-				if ct < 3 && oe.Temporary() {
-					ct++
-					continue
-				}
-			}
-			break
-		}
-	}
-	c.Close()
-	done <- rcvd
-}
-
-var crashy = false
-
-func runStreamSyslog(l net.Listener, done chan<- string, wg *sync.WaitGroup) {
-	for {
-		var c net.Conn
-		var err error
-		if c, err = l.Accept(); err != nil {
-			return
-		}
-		wg.Add(1)
-		go func(c net.Conn) {
-			defer wg.Done()
-			c.SetReadDeadline(time.Now().Add(5 * time.Second))
-			b := bufio.NewReader(c)
-			for ct := 1; !crashy || ct&7 != 0; ct++ {
-				s, err := b.ReadString('\n')
-				if err != nil {
-					break
-				}
-				done <- s
-			}
-			c.Close()
-		}(c)
-	}
-}
-
-func startServer(n, la string, done chan<- string) (addr string, sock io.Closer, wg *sync.WaitGroup) {
-	if n == "udp" || n == "tcp" {
-		la = "127.0.0.1:0"
-	} else {
-		// unix and unixgram: choose an address if none given
-		if la == "" {
-			// use ioutil.TempFile to get a name that is unique
-			f, err := ioutil.TempFile("", "syslogtest")
-			if err != nil {
-				log.Fatal("TempFile: ", err)
-			}
-			f.Close()
-			la = f.Name()
-		}
-		os.Remove(la)
-	}
-
-	wg = new(sync.WaitGroup)
-	if n == "udp" || n == "unixgram" {
-		l, e := net.ListenPacket(n, la)
-		if e != nil {
-			log.Fatalf("startServer failed: %v", e)
-		}
-		addr = l.LocalAddr().String()
-		sock = l
-		wg.Add(1)
-		go func() {
-			defer wg.Done()
-			runPktSyslog(l, done)
-		}()
-	} else {
-		l, e := net.Listen(n, la)
-		if e != nil {
-			log.Fatalf("startServer failed: %v", e)
-		}
-		addr = l.Addr().String()
-		sock = l
-		wg.Add(1)
-		go func() {
-			defer wg.Done()
-			runStreamSyslog(l, done, wg)
-		}()
-	}
-	return
-}
-
-func TestWithSimulated(t *testing.T) {
-	msg := "Test 123"
-	transport := []string{"unix", "unixgram", "udp", "tcp"}
-
-	if runtime.GOOS == "darwin" {
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			transport = []string{"udp", "tcp"}
-		}
-	}
-
-	for _, tr := range transport {
-		done := make(chan string)
-		addr, sock, srvWG := startServer(tr, "", done)
-		defer srvWG.Wait()
-		defer sock.Close()
-		if tr == "unix" || tr == "unixgram" {
-			defer os.Remove(addr)
-		}
-		s, err := Dial(tr, addr, LOG_INFO|LOG_USER, "syslog_test")
-		if err != nil {
-			t.Fatalf("Dial() failed: %v", err)
-		}
-		err = s.Info(msg)
-		if err != nil {
-			t.Fatalf("log failed: %v", err)
-		}
-		check(t, msg, <-done)
-		s.Close()
-	}
-}
-
-func TestFlap(t *testing.T) {
-	if runtime.GOOS == "darwin" {
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			t.Skipf("skipping on %s/%s", runtime.GOOS, runtime.GOARCH)
-		}
-	}
-
-	net := "unix"
-	done := make(chan string)
-	addr, sock, srvWG := startServer(net, "", done)
-	defer srvWG.Wait()
-	defer os.Remove(addr)
-	defer sock.Close()
-
-	s, err := Dial(net, addr, LOG_INFO|LOG_USER, "syslog_test")
-	if err != nil {
-		t.Fatalf("Dial() failed: %v", err)
-	}
-	msg := "Moo 2"
-	err = s.Info(msg)
-	if err != nil {
-		t.Fatalf("log failed: %v", err)
-	}
-	check(t, msg, <-done)
-
-	// restart the server
-	_, sock2, srvWG2 := startServer(net, addr, done)
-	defer srvWG2.Wait()
-	defer sock2.Close()
-
-	// and try retransmitting
-	msg = "Moo 3"
-	err = s.Info(msg)
-	if err != nil {
-		t.Fatalf("log failed: %v", err)
-	}
-	check(t, msg, <-done)
-
-	s.Close()
-}
-
-func TestNew(t *testing.T) {
-	if LOG_LOCAL7 != 23<<3 {
-		t.Fatalf("LOG_LOCAL7 has wrong value")
-	}
-	if testing.Short() {
-		// Depends on syslog daemon running, and sometimes it's not.
-		t.Skip("skipping syslog test during -short")
-	}
-
-	s, err := New(LOG_INFO|LOG_USER, "the_tag")
-	if err != nil {
-		t.Fatalf("New() failed: %s", err)
-	}
-	// Don't send any messages.
-	s.Close()
-}
-
-func TestNewLogger(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping syslog test during -short")
-	}
-	f, err := NewLogger(LOG_USER|LOG_INFO, 0)
-	if f == nil {
-		t.Error(err)
-	}
-}
-
-func TestDial(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping syslog test during -short")
-	}
-	f, err := Dial("", "", (LOG_LOCAL7|LOG_DEBUG)+1, "syslog_test")
-	if f != nil {
-		t.Fatalf("Should have trapped bad priority")
-	}
-	f, err = Dial("", "", -1, "syslog_test")
-	if f != nil {
-		t.Fatalf("Should have trapped bad priority")
-	}
-	l, err := Dial("", "", LOG_USER|LOG_ERR, "syslog_test")
-	if err != nil {
-		t.Fatalf("Dial() failed: %s", err)
-	}
-	l.Close()
-}
-
-func check(t *testing.T, in, out string) {
-	tmpl := fmt.Sprintf("<%d>%%s %%s syslog_test[%%d]: %s\n", LOG_USER+LOG_INFO, in)
-	if hostname, err := os.Hostname(); err != nil {
-		t.Error("Error retrieving hostname")
-	} else {
-		var parsedHostname, timestamp string
-		var pid int
-		if n, err := fmt.Sscanf(out, tmpl, &timestamp, &parsedHostname, &pid); n != 3 || err != nil || hostname != parsedHostname {
-			t.Errorf("Got %q, does not match template %q (%d %s)", out, tmpl, n, err)
-		}
-	}
-}
-
-func TestWrite(t *testing.T) {
-	tests := []struct {
-		pri Priority
-		pre string
-		msg string
-		exp string
-	}{
-		{LOG_USER | LOG_ERR, "syslog_test", "", "%s %s syslog_test[%d]: \n"},
-		{LOG_USER | LOG_ERR, "syslog_test", "write test", "%s %s syslog_test[%d]: write test\n"},
-		// Write should not add \n if there already is one
-		{LOG_USER | LOG_ERR, "syslog_test", "write test 2\n", "%s %s syslog_test[%d]: write test 2\n"},
-	}
-
-	if hostname, err := os.Hostname(); err != nil {
-		t.Fatalf("Error retrieving hostname")
-	} else {
-		for _, test := range tests {
-			done := make(chan string)
-			addr, sock, srvWG := startServer("udp", "", done)
-			defer srvWG.Wait()
-			defer sock.Close()
-			l, err := Dial("udp", addr, test.pri, test.pre)
-			if err != nil {
-				t.Fatalf("syslog.Dial() failed: %v", err)
-			}
-			defer l.Close()
-			_, err = io.WriteString(l, test.msg)
-			if err != nil {
-				t.Fatalf("WriteString() failed: %v", err)
-			}
-			rcvd := <-done
-			test.exp = fmt.Sprintf("<%d>", test.pri) + test.exp
-			var parsedHostname, timestamp string
-			var pid int
-			if n, err := fmt.Sscanf(rcvd, test.exp, &timestamp, &parsedHostname, &pid); n != 3 || err != nil || hostname != parsedHostname {
-				t.Errorf("s.Info() = '%q', didn't match '%q' (%d %s)", rcvd, test.exp, n, err)
-			}
-		}
-	}
-}
-
-func TestConcurrentWrite(t *testing.T) {
-	addr, sock, srvWG := startServer("udp", "", make(chan string, 1))
-	defer srvWG.Wait()
-	defer sock.Close()
-	w, err := Dial("udp", addr, LOG_USER|LOG_ERR, "how's it going?")
-	if err != nil {
-		t.Fatalf("syslog.Dial() failed: %v", err)
-	}
-	var wg sync.WaitGroup
-	for i := 0; i < 10; i++ {
-		wg.Add(1)
-		go func() {
-			defer wg.Done()
-			err := w.Info("test")
-			if err != nil {
-				t.Errorf("Info() failed: %v", err)
-				return
-			}
-		}()
-	}
-	wg.Wait()
-}
-
-func TestConcurrentReconnect(t *testing.T) {
-	crashy = true
-	defer func() { crashy = false }()
-
-	const N = 10
-	const M = 100
-	net := "unix"
-	if runtime.GOOS == "darwin" {
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			net = "tcp"
-		}
-	}
-	done := make(chan string, N*M)
-	addr, sock, srvWG := startServer(net, "", done)
-	if net == "unix" {
-		defer os.Remove(addr)
-	}
-
-	// count all the messages arriving
-	count := make(chan int)
-	go func() {
-		ct := 0
-		for range done {
-			ct++
-			// we are looking for 500 out of 1000 events
-			// here because lots of log messages are lost
-			// in buffers (kernel and/or bufio)
-			if ct > N*M/2 {
-				break
-			}
-		}
-		count <- ct
-	}()
-
-	var wg sync.WaitGroup
-	wg.Add(N)
-	for i := 0; i < N; i++ {
-		go func() {
-			defer wg.Done()
-			w, err := Dial(net, addr, LOG_USER|LOG_ERR, "tag")
-			if err != nil {
-				t.Fatalf("syslog.Dial() failed: %v", err)
-			}
-			defer w.Close()
-			for i := 0; i < M; i++ {
-				err := w.Info("test")
-				if err != nil {
-					t.Errorf("Info() failed: %v", err)
-					return
-				}
-			}
-		}()
-	}
-	wg.Wait()
-	sock.Close()
-	srvWG.Wait()
-	close(done)
-
-	select {
-	case <-count:
-	case <-time.After(100 * time.Millisecond):
-		t.Error("timeout in concurrent reconnect")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/log/syslog/syslog_unix.go b/third_party/gofrontend/libgo/go/log/syslog/syslog_unix.go
deleted file mode 100644
index 1cdabec..0000000
--- a/third_party/gofrontend/libgo/go/log/syslog/syslog_unix.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !windows,!nacl,!plan9
-
-package syslog
-
-import (
-	"errors"
-	"net"
-)
-
-// unixSyslog opens a connection to the syslog daemon running on the
-// local machine using a Unix domain socket.
-
-func unixSyslog() (conn serverConn, err error) {
-	logTypes := []string{"unixgram", "unix"}
-	logPaths := []string{"/dev/log", "/var/run/syslog", "/var/run/log"}
-	for _, network := range logTypes {
-		for _, path := range logPaths {
-			conn, err := net.Dial(network, path)
-			if err != nil {
-				continue
-			} else {
-				return &netConn{conn: conn, local: true}, nil
-			}
-		}
-	}
-	return nil, errors.New("Unix syslog delivery error")
-}
diff --git a/third_party/gofrontend/libgo/go/math/abs.go b/third_party/gofrontend/libgo/go/math/abs.go
deleted file mode 100644
index 433d0f7..0000000
--- a/third_party/gofrontend/libgo/go/math/abs.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Abs returns the absolute value of x.
-//
-// Special cases are:
-//	Abs(±Inf) = +Inf
-//	Abs(NaN) = NaN
-
-//extern fabs
-func libc_fabs(float64) float64
-
-func Abs(x float64) float64 {
-	return libc_fabs(x)
-}
-
-func abs(x float64) float64 {
-	switch {
-	case x < 0:
-		return -x
-	case x == 0:
-		return 0 // return correctly abs(-0)
-	}
-	return x
-}
diff --git a/third_party/gofrontend/libgo/go/math/acosh.go b/third_party/gofrontend/libgo/go/math/acosh.go
deleted file mode 100644
index e394008..0000000
--- a/third_party/gofrontend/libgo/go/math/acosh.go
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// The original C code, the long comment, and the constants
-// below are from FreeBSD's /usr/src/lib/msun/src/e_acosh.c
-// and came with this notice.  The go code is a simplified
-// version of the original C.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunPro, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-//
-// __ieee754_acosh(x)
-// Method :
-//	Based on
-//	        acosh(x) = log [ x + sqrt(x*x-1) ]
-//	we have
-//	        acosh(x) := log(x)+ln2,	if x is large; else
-//	        acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else
-//	        acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
-//
-// Special cases:
-//	acosh(x) is NaN with signal if x<1.
-//	acosh(NaN) is NaN without signal.
-//
-
-// Acosh returns the inverse hyperbolic cosine of x.
-//
-// Special cases are:
-//	Acosh(+Inf) = +Inf
-//	Acosh(x) = NaN if x < 1
-//	Acosh(NaN) = NaN
-func Acosh(x float64) float64 {
-	const (
-		Ln2   = 6.93147180559945286227e-01 // 0x3FE62E42FEFA39EF
-		Large = 1 << 28                    // 2**28
-	)
-	// first case is special case
-	switch {
-	case x < 1 || IsNaN(x):
-		return NaN()
-	case x == 1:
-		return 0
-	case x >= Large:
-		return Log(x) + Ln2 // x > 2**28
-	case x > 2:
-		return Log(2*x - 1/(x+Sqrt(x*x-1))) // 2**28 > x > 2
-	}
-	t := x - 1
-	return Log1p(t + Sqrt(2*t+t*t)) // 2 >= x > 1
-}
diff --git a/third_party/gofrontend/libgo/go/math/all_test.go b/third_party/gofrontend/libgo/go/math/all_test.go
deleted file mode 100644
index e18e45e..0000000
--- a/third_party/gofrontend/libgo/go/math/all_test.go
+++ /dev/null
@@ -1,3072 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math_test
-
-import (
-	"fmt"
-	. "math"
-	"testing"
-)
-
-var vf = []float64{
-	4.9790119248836735e+00,
-	7.7388724745781045e+00,
-	-2.7688005719200159e-01,
-	-5.0106036182710749e+00,
-	9.6362937071984173e+00,
-	2.9263772392439646e+00,
-	5.2290834314593066e+00,
-	2.7279399104360102e+00,
-	1.8253080916808550e+00,
-	-8.6859247685756013e+00,
-}
-
-// The expected results below were computed by the high precision calculators
-// at http://keisan.casio.com/.  More exact input values (array vf[], above)
-// were obtained by printing them with "%.26f".  The answers were calculated
-// to 26 digits (by using the "Digit number" drop-down control of each
-// calculator).
-var acos = []float64{
-	1.0496193546107222142571536e+00,
-	6.8584012813664425171660692e-01,
-	1.5984878714577160325521819e+00,
-	2.0956199361475859327461799e+00,
-	2.7053008467824138592616927e-01,
-	1.2738121680361776018155625e+00,
-	1.0205369421140629186287407e+00,
-	1.2945003481781246062157835e+00,
-	1.3872364345374451433846657e+00,
-	2.6231510803970463967294145e+00,
-}
-var acosh = []float64{
-	2.4743347004159012494457618e+00,
-	2.8576385344292769649802701e+00,
-	7.2796961502981066190593175e-01,
-	2.4796794418831451156471977e+00,
-	3.0552020742306061857212962e+00,
-	2.044238592688586588942468e+00,
-	2.5158701513104513595766636e+00,
-	1.99050839282411638174299e+00,
-	1.6988625798424034227205445e+00,
-	2.9611454842470387925531875e+00,
-}
-var asin = []float64{
-	5.2117697218417440497416805e-01,
-	8.8495619865825236751471477e-01,
-	-02.769154466281941332086016e-02,
-	-5.2482360935268931351485822e-01,
-	1.3002662421166552333051524e+00,
-	2.9698415875871901741575922e-01,
-	5.5025938468083370060258102e-01,
-	2.7629597861677201301553823e-01,
-	1.83559892257451475846656e-01,
-	-1.0523547536021497774980928e+00,
-}
-var asinh = []float64{
-	2.3083139124923523427628243e+00,
-	2.743551594301593620039021e+00,
-	-2.7345908534880091229413487e-01,
-	-2.3145157644718338650499085e+00,
-	2.9613652154015058521951083e+00,
-	1.7949041616585821933067568e+00,
-	2.3564032905983506405561554e+00,
-	1.7287118790768438878045346e+00,
-	1.3626658083714826013073193e+00,
-	-2.8581483626513914445234004e+00,
-}
-var atan = []float64{
-	1.372590262129621651920085e+00,
-	1.442290609645298083020664e+00,
-	-2.7011324359471758245192595e-01,
-	-1.3738077684543379452781531e+00,
-	1.4673921193587666049154681e+00,
-	1.2415173565870168649117764e+00,
-	1.3818396865615168979966498e+00,
-	1.2194305844639670701091426e+00,
-	1.0696031952318783760193244e+00,
-	-1.4561721938838084990898679e+00,
-}
-var atanh = []float64{
-	5.4651163712251938116878204e-01,
-	1.0299474112843111224914709e+00,
-	-2.7695084420740135145234906e-02,
-	-5.5072096119207195480202529e-01,
-	1.9943940993171843235906642e+00,
-	3.01448604578089708203017e-01,
-	5.8033427206942188834370595e-01,
-	2.7987997499441511013958297e-01,
-	1.8459947964298794318714228e-01,
-	-1.3273186910532645867272502e+00,
-}
-var atan2 = []float64{
-	1.1088291730037004444527075e+00,
-	9.1218183188715804018797795e-01,
-	1.5984772603216203736068915e+00,
-	2.0352918654092086637227327e+00,
-	8.0391819139044720267356014e-01,
-	1.2861075249894661588866752e+00,
-	1.0889904479131695712182587e+00,
-	1.3044821793397925293797357e+00,
-	1.3902530903455392306872261e+00,
-	2.2859857424479142655411058e+00,
-}
-var cbrt = []float64{
-	1.7075799841925094446722675e+00,
-	1.9779982212970353936691498e+00,
-	-6.5177429017779910853339447e-01,
-	-1.7111838886544019873338113e+00,
-	2.1279920909827937423960472e+00,
-	1.4303536770460741452312367e+00,
-	1.7357021059106154902341052e+00,
-	1.3972633462554328350552916e+00,
-	1.2221149580905388454977636e+00,
-	-2.0556003730500069110343596e+00,
-}
-var ceil = []float64{
-	5.0000000000000000e+00,
-	8.0000000000000000e+00,
-	0.0000000000000000e+00,
-	-5.0000000000000000e+00,
-	1.0000000000000000e+01,
-	3.0000000000000000e+00,
-	6.0000000000000000e+00,
-	3.0000000000000000e+00,
-	2.0000000000000000e+00,
-	-8.0000000000000000e+00,
-}
-var copysign = []float64{
-	-4.9790119248836735e+00,
-	-7.7388724745781045e+00,
-	-2.7688005719200159e-01,
-	-5.0106036182710749e+00,
-	-9.6362937071984173e+00,
-	-2.9263772392439646e+00,
-	-5.2290834314593066e+00,
-	-2.7279399104360102e+00,
-	-1.8253080916808550e+00,
-	-8.6859247685756013e+00,
-}
-var cos = []float64{
-	2.634752140995199110787593e-01,
-	1.148551260848219865642039e-01,
-	9.6191297325640768154550453e-01,
-	2.938141150061714816890637e-01,
-	-9.777138189897924126294461e-01,
-	-9.7693041344303219127199518e-01,
-	4.940088096948647263961162e-01,
-	-9.1565869021018925545016502e-01,
-	-2.517729313893103197176091e-01,
-	-7.39241351595676573201918e-01,
-}
-
-// Results for 100000 * Pi + vf[i]
-var cosLarge = []float64{
-	2.634752141185559426744e-01,
-	1.14855126055543100712e-01,
-	9.61912973266488928113e-01,
-	2.9381411499556122552e-01,
-	-9.777138189880161924641e-01,
-	-9.76930413445147608049e-01,
-	4.940088097314976789841e-01,
-	-9.15658690217517835002e-01,
-	-2.51772931436786954751e-01,
-	-7.3924135157173099849e-01,
-}
-var cosh = []float64{
-	7.2668796942212842775517446e+01,
-	1.1479413465659254502011135e+03,
-	1.0385767908766418550935495e+00,
-	7.5000957789658051428857788e+01,
-	7.655246669605357888468613e+03,
-	9.3567491758321272072888257e+00,
-	9.331351599270605471131735e+01,
-	7.6833430994624643209296404e+00,
-	3.1829371625150718153881164e+00,
-	2.9595059261916188501640911e+03,
-}
-var erf = []float64{
-	5.1865354817738701906913566e-01,
-	7.2623875834137295116929844e-01,
-	-3.123458688281309990629839e-02,
-	-5.2143121110253302920437013e-01,
-	8.2704742671312902508629582e-01,
-	3.2101767558376376743993945e-01,
-	5.403990312223245516066252e-01,
-	3.0034702916738588551174831e-01,
-	2.0369924417882241241559589e-01,
-	-7.8069386968009226729944677e-01,
-}
-var erfc = []float64{
-	4.8134645182261298093086434e-01,
-	2.7376124165862704883070156e-01,
-	1.0312345868828130999062984e+00,
-	1.5214312111025330292043701e+00,
-	1.7295257328687097491370418e-01,
-	6.7898232441623623256006055e-01,
-	4.596009687776754483933748e-01,
-	6.9965297083261411448825169e-01,
-	7.9630075582117758758440411e-01,
-	1.7806938696800922672994468e+00,
-}
-var exp = []float64{
-	1.4533071302642137507696589e+02,
-	2.2958822575694449002537581e+03,
-	7.5814542574851666582042306e-01,
-	6.6668778421791005061482264e-03,
-	1.5310493273896033740861206e+04,
-	1.8659907517999328638667732e+01,
-	1.8662167355098714543942057e+02,
-	1.5301332413189378961665788e+01,
-	6.2047063430646876349125085e+00,
-	1.6894712385826521111610438e-04,
-}
-var expm1 = []float64{
-	5.105047796122957327384770212e-02,
-	8.046199708567344080562675439e-02,
-	-2.764970978891639815187418703e-03,
-	-4.8871434888875355394330300273e-02,
-	1.0115864277221467777117227494e-01,
-	2.969616407795910726014621657e-02,
-	5.368214487944892300914037972e-02,
-	2.765488851131274068067445335e-02,
-	1.842068661871398836913874273e-02,
-	-8.3193870863553801814961137573e-02,
-}
-var exp2 = []float64{
-	3.1537839463286288034313104e+01,
-	2.1361549283756232296144849e+02,
-	8.2537402562185562902577219e-01,
-	3.1021158628740294833424229e-02,
-	7.9581744110252191462569661e+02,
-	7.6019905892596359262696423e+00,
-	3.7506882048388096973183084e+01,
-	6.6250893439173561733216375e+00,
-	3.5438267900243941544605339e+00,
-	2.4281533133513300984289196e-03,
-}
-var fabs = []float64{
-	4.9790119248836735e+00,
-	7.7388724745781045e+00,
-	2.7688005719200159e-01,
-	5.0106036182710749e+00,
-	9.6362937071984173e+00,
-	2.9263772392439646e+00,
-	5.2290834314593066e+00,
-	2.7279399104360102e+00,
-	1.8253080916808550e+00,
-	8.6859247685756013e+00,
-}
-var fdim = []float64{
-	4.9790119248836735e+00,
-	7.7388724745781045e+00,
-	0.0000000000000000e+00,
-	0.0000000000000000e+00,
-	9.6362937071984173e+00,
-	2.9263772392439646e+00,
-	5.2290834314593066e+00,
-	2.7279399104360102e+00,
-	1.8253080916808550e+00,
-	0.0000000000000000e+00,
-}
-var floor = []float64{
-	4.0000000000000000e+00,
-	7.0000000000000000e+00,
-	-1.0000000000000000e+00,
-	-6.0000000000000000e+00,
-	9.0000000000000000e+00,
-	2.0000000000000000e+00,
-	5.0000000000000000e+00,
-	2.0000000000000000e+00,
-	1.0000000000000000e+00,
-	-9.0000000000000000e+00,
-}
-var fmod = []float64{
-	4.197615023265299782906368e-02,
-	2.261127525421895434476482e+00,
-	3.231794108794261433104108e-02,
-	4.989396381728925078391512e+00,
-	3.637062928015826201999516e-01,
-	1.220868282268106064236690e+00,
-	4.770916568540693347699744e+00,
-	1.816180268691969246219742e+00,
-	8.734595415957246977711748e-01,
-	1.314075231424398637614104e+00,
-}
-
-type fi struct {
-	f float64
-	i int
-}
-
-var frexp = []fi{
-	{6.2237649061045918750e-01, 3},
-	{9.6735905932226306250e-01, 3},
-	{-5.5376011438400318000e-01, -1},
-	{-6.2632545228388436250e-01, 3},
-	{6.02268356699901081250e-01, 4},
-	{7.3159430981099115000e-01, 2},
-	{6.5363542893241332500e-01, 3},
-	{6.8198497760900255000e-01, 2},
-	{9.1265404584042750000e-01, 1},
-	{-5.4287029803597508250e-01, 4},
-}
-var gamma = []float64{
-	2.3254348370739963835386613898e+01,
-	2.991153837155317076427529816e+03,
-	-4.561154336726758060575129109e+00,
-	7.719403468842639065959210984e-01,
-	1.6111876618855418534325755566e+05,
-	1.8706575145216421164173224946e+00,
-	3.4082787447257502836734201635e+01,
-	1.579733951448952054898583387e+00,
-	9.3834586598354592860187267089e-01,
-	-2.093995902923148389186189429e-05,
-}
-var j0 = []float64{
-	-1.8444682230601672018219338e-01,
-	2.27353668906331975435892e-01,
-	9.809259936157051116270273e-01,
-	-1.741170131426226587841181e-01,
-	-2.1389448451144143352039069e-01,
-	-2.340905848928038763337414e-01,
-	-1.0029099691890912094586326e-01,
-	-1.5466726714884328135358907e-01,
-	3.252650187653420388714693e-01,
-	-8.72218484409407250005360235e-03,
-}
-var j1 = []float64{
-	-3.251526395295203422162967e-01,
-	1.893581711430515718062564e-01,
-	-1.3711761352467242914491514e-01,
-	3.287486536269617297529617e-01,
-	1.3133899188830978473849215e-01,
-	3.660243417832986825301766e-01,
-	-3.4436769271848174665420672e-01,
-	4.329481396640773768835036e-01,
-	5.8181350531954794639333955e-01,
-	-2.7030574577733036112996607e-01,
-}
-var j2 = []float64{
-	5.3837518920137802565192769e-02,
-	-1.7841678003393207281244667e-01,
-	9.521746934916464142495821e-03,
-	4.28958355470987397983072e-02,
-	2.4115371837854494725492872e-01,
-	4.842458532394520316844449e-01,
-	-3.142145220618633390125946e-02,
-	4.720849184745124761189957e-01,
-	3.122312022520957042957497e-01,
-	7.096213118930231185707277e-02,
-}
-var jM3 = []float64{
-	-3.684042080996403091021151e-01,
-	2.8157665936340887268092661e-01,
-	4.401005480841948348343589e-04,
-	3.629926999056814081597135e-01,
-	3.123672198825455192489266e-02,
-	-2.958805510589623607540455e-01,
-	-3.2033177696533233403289416e-01,
-	-2.592737332129663376736604e-01,
-	-1.0241334641061485092351251e-01,
-	-2.3762660886100206491674503e-01,
-}
-var lgamma = []fi{
-	{3.146492141244545774319734e+00, 1},
-	{8.003414490659126375852113e+00, 1},
-	{1.517575735509779707488106e+00, -1},
-	{-2.588480028182145853558748e-01, 1},
-	{1.1989897050205555002007985e+01, 1},
-	{6.262899811091257519386906e-01, 1},
-	{3.5287924899091566764846037e+00, 1},
-	{4.5725644770161182299423372e-01, 1},
-	{-6.363667087767961257654854e-02, 1},
-	{-1.077385130910300066425564e+01, -1},
-}
-var log = []float64{
-	1.605231462693062999102599e+00,
-	2.0462560018708770653153909e+00,
-	-1.2841708730962657801275038e+00,
-	1.6115563905281545116286206e+00,
-	2.2655365644872016636317461e+00,
-	1.0737652208918379856272735e+00,
-	1.6542360106073546632707956e+00,
-	1.0035467127723465801264487e+00,
-	6.0174879014578057187016475e-01,
-	2.161703872847352815363655e+00,
-}
-var logb = []float64{
-	2.0000000000000000e+00,
-	2.0000000000000000e+00,
-	-2.0000000000000000e+00,
-	2.0000000000000000e+00,
-	3.0000000000000000e+00,
-	1.0000000000000000e+00,
-	2.0000000000000000e+00,
-	1.0000000000000000e+00,
-	0.0000000000000000e+00,
-	3.0000000000000000e+00,
-}
-var log10 = []float64{
-	6.9714316642508290997617083e-01,
-	8.886776901739320576279124e-01,
-	-5.5770832400658929815908236e-01,
-	6.998900476822994346229723e-01,
-	9.8391002850684232013281033e-01,
-	4.6633031029295153334285302e-01,
-	7.1842557117242328821552533e-01,
-	4.3583479968917773161304553e-01,
-	2.6133617905227038228626834e-01,
-	9.3881606348649405716214241e-01,
-}
-var log1p = []float64{
-	4.8590257759797794104158205e-02,
-	7.4540265965225865330849141e-02,
-	-2.7726407903942672823234024e-03,
-	-5.1404917651627649094953380e-02,
-	9.1998280672258624681335010e-02,
-	2.8843762576593352865894824e-02,
-	5.0969534581863707268992645e-02,
-	2.6913947602193238458458594e-02,
-	1.8088493239630770262045333e-02,
-	-9.0865245631588989681559268e-02,
-}
-var log2 = []float64{
-	2.3158594707062190618898251e+00,
-	2.9521233862883917703341018e+00,
-	-1.8526669502700329984917062e+00,
-	2.3249844127278861543568029e+00,
-	3.268478366538305087466309e+00,
-	1.5491157592596970278166492e+00,
-	2.3865580889631732407886495e+00,
-	1.447811865817085365540347e+00,
-	8.6813999540425116282815557e-01,
-	3.118679457227342224364709e+00,
-}
-var modf = [][2]float64{
-	{4.0000000000000000e+00, 9.7901192488367350108546816e-01},
-	{7.0000000000000000e+00, 7.3887247457810456552351752e-01},
-	{0.0000000000000000e+00, -2.7688005719200159404635997e-01},
-	{-5.0000000000000000e+00, -1.060361827107492160848778e-02},
-	{9.0000000000000000e+00, 6.3629370719841737980004837e-01},
-	{2.0000000000000000e+00, 9.2637723924396464525443662e-01},
-	{5.0000000000000000e+00, 2.2908343145930665230025625e-01},
-	{2.0000000000000000e+00, 7.2793991043601025126008608e-01},
-	{1.0000000000000000e+00, 8.2530809168085506044576505e-01},
-	{-8.0000000000000000e+00, -6.8592476857560136238589621e-01},
-}
-var nextafter32 = []float32{
-	4.979012489318848e+00,
-	7.738873004913330e+00,
-	-2.768800258636475e-01,
-	-5.010602951049805e+00,
-	9.636294364929199e+00,
-	2.926377534866333e+00,
-	5.229084014892578e+00,
-	2.727940082550049e+00,
-	1.825308203697205e+00,
-	-8.685923576354980e+00,
-}
-var nextafter64 = []float64{
-	4.97901192488367438926388786e+00,
-	7.73887247457810545370193722e+00,
-	-2.7688005719200153853520874e-01,
-	-5.01060361827107403343006808e+00,
-	9.63629370719841915615688777e+00,
-	2.92637723924396508934364647e+00,
-	5.22908343145930754047867595e+00,
-	2.72793991043601069534929593e+00,
-	1.82530809168085528249036997e+00,
-	-8.68592476857559958602905681e+00,
-}
-var pow = []float64{
-	9.5282232631648411840742957e+04,
-	5.4811599352999901232411871e+07,
-	5.2859121715894396531132279e-01,
-	9.7587991957286474464259698e-06,
-	4.328064329346044846740467e+09,
-	8.4406761805034547437659092e+02,
-	1.6946633276191194947742146e+05,
-	5.3449040147551939075312879e+02,
-	6.688182138451414936380374e+01,
-	2.0609869004248742886827439e-09,
-}
-var remainder = []float64{
-	4.197615023265299782906368e-02,
-	2.261127525421895434476482e+00,
-	3.231794108794261433104108e-02,
-	-2.120723654214984321697556e-02,
-	3.637062928015826201999516e-01,
-	1.220868282268106064236690e+00,
-	-4.581668629186133046005125e-01,
-	-9.117596417440410050403443e-01,
-	8.734595415957246977711748e-01,
-	1.314075231424398637614104e+00,
-}
-var signbit = []bool{
-	false,
-	false,
-	true,
-	true,
-	false,
-	false,
-	false,
-	false,
-	false,
-	true,
-}
-var sin = []float64{
-	-9.6466616586009283766724726e-01,
-	9.9338225271646545763467022e-01,
-	-2.7335587039794393342449301e-01,
-	9.5586257685042792878173752e-01,
-	-2.099421066779969164496634e-01,
-	2.135578780799860532750616e-01,
-	-8.694568971167362743327708e-01,
-	4.019566681155577786649878e-01,
-	9.6778633541687993721617774e-01,
-	-6.734405869050344734943028e-01,
-}
-
-// Results for 100000 * Pi + vf[i]
-var sinLarge = []float64{
-	-9.646661658548936063912e-01,
-	9.933822527198506903752e-01,
-	-2.7335587036246899796e-01,
-	9.55862576853689321268e-01,
-	-2.099421066862688873691e-01,
-	2.13557878070308981163e-01,
-	-8.694568970959221300497e-01,
-	4.01956668098863248917e-01,
-	9.67786335404528727927e-01,
-	-6.7344058693131973066e-01,
-}
-var sinh = []float64{
-	7.2661916084208532301448439e+01,
-	1.1479409110035194500526446e+03,
-	-2.8043136512812518927312641e-01,
-	-7.499429091181587232835164e+01,
-	7.6552466042906758523925934e+03,
-	9.3031583421672014313789064e+00,
-	9.330815755828109072810322e+01,
-	7.6179893137269146407361477e+00,
-	3.021769180549615819524392e+00,
-	-2.95950575724449499189888e+03,
-}
-var sqrt = []float64{
-	2.2313699659365484748756904e+00,
-	2.7818829009464263511285458e+00,
-	5.2619393496314796848143251e-01,
-	2.2384377628763938724244104e+00,
-	3.1042380236055381099288487e+00,
-	1.7106657298385224403917771e+00,
-	2.286718922705479046148059e+00,
-	1.6516476350711159636222979e+00,
-	1.3510396336454586262419247e+00,
-	2.9471892997524949215723329e+00,
-}
-var tan = []float64{
-	-3.661316565040227801781974e+00,
-	8.64900232648597589369854e+00,
-	-2.8417941955033612725238097e-01,
-	3.253290185974728640827156e+00,
-	2.147275640380293804770778e-01,
-	-2.18600910711067004921551e-01,
-	-1.760002817872367935518928e+00,
-	-4.389808914752818126249079e-01,
-	-3.843885560201130679995041e+00,
-	9.10988793377685105753416e-01,
-}
-
-// Results for 100000 * Pi + vf[i]
-var tanLarge = []float64{
-	-3.66131656475596512705e+00,
-	8.6490023287202547927e+00,
-	-2.841794195104782406e-01,
-	3.2532901861033120983e+00,
-	2.14727564046880001365e-01,
-	-2.18600910700688062874e-01,
-	-1.760002817699722747043e+00,
-	-4.38980891453536115952e-01,
-	-3.84388555942723509071e+00,
-	9.1098879344275101051e-01,
-}
-var tanh = []float64{
-	9.9990531206936338549262119e-01,
-	9.9999962057085294197613294e-01,
-	-2.7001505097318677233756845e-01,
-	-9.9991110943061718603541401e-01,
-	9.9999999146798465745022007e-01,
-	9.9427249436125236705001048e-01,
-	9.9994257600983138572705076e-01,
-	9.9149409509772875982054701e-01,
-	9.4936501296239685514466577e-01,
-	-9.9999994291374030946055701e-01,
-}
-var trunc = []float64{
-	4.0000000000000000e+00,
-	7.0000000000000000e+00,
-	-0.0000000000000000e+00,
-	-5.0000000000000000e+00,
-	9.0000000000000000e+00,
-	2.0000000000000000e+00,
-	5.0000000000000000e+00,
-	2.0000000000000000e+00,
-	1.0000000000000000e+00,
-	-8.0000000000000000e+00,
-}
-var y0 = []float64{
-	-3.053399153780788357534855e-01,
-	1.7437227649515231515503649e-01,
-	-8.6221781263678836910392572e-01,
-	-3.100664880987498407872839e-01,
-	1.422200649300982280645377e-01,
-	4.000004067997901144239363e-01,
-	-3.3340749753099352392332536e-01,
-	4.5399790746668954555205502e-01,
-	4.8290004112497761007536522e-01,
-	2.7036697826604756229601611e-01,
-}
-var y1 = []float64{
-	0.15494213737457922210218611,
-	-0.2165955142081145245075746,
-	-2.4644949631241895201032829,
-	0.1442740489541836405154505,
-	0.2215379960518984777080163,
-	0.3038800915160754150565448,
-	0.0691107642452362383808547,
-	0.2380116417809914424860165,
-	-0.20849492979459761009678934,
-	0.0242503179793232308250804,
-}
-var y2 = []float64{
-	0.3675780219390303613394936,
-	-0.23034826393250119879267257,
-	-16.939677983817727205631397,
-	0.367653980523052152867791,
-	-0.0962401471767804440353136,
-	-0.1923169356184851105200523,
-	0.35984072054267882391843766,
-	-0.2794987252299739821654982,
-	-0.7113490692587462579757954,
-	-0.2647831587821263302087457,
-}
-var yM3 = []float64{
-	-0.14035984421094849100895341,
-	-0.097535139617792072703973,
-	242.25775994555580176377379,
-	-0.1492267014802818619511046,
-	0.26148702629155918694500469,
-	0.56675383593895176530394248,
-	-0.206150264009006981070575,
-	0.64784284687568332737963658,
-	1.3503631555901938037008443,
-	0.1461869756579956803341844,
-}
-
-// arguments and expected results for special cases
-var vfacosSC = []float64{
-	-Pi,
-	1,
-	Pi,
-	NaN(),
-}
-var acosSC = []float64{
-	NaN(),
-	0,
-	NaN(),
-	NaN(),
-}
-
-var vfacoshSC = []float64{
-	Inf(-1),
-	0.5,
-	1,
-	Inf(1),
-	NaN(),
-}
-var acoshSC = []float64{
-	NaN(),
-	NaN(),
-	0,
-	Inf(1),
-	NaN(),
-}
-
-var vfasinSC = []float64{
-	-Pi,
-	Copysign(0, -1),
-	0,
-	Pi,
-	NaN(),
-}
-var asinSC = []float64{
-	NaN(),
-	Copysign(0, -1),
-	0,
-	NaN(),
-	NaN(),
-}
-
-var vfasinhSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var asinhSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-
-var vfatanSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var atanSC = []float64{
-	-Pi / 2,
-	Copysign(0, -1),
-	0,
-	Pi / 2,
-	NaN(),
-}
-
-var vfatanhSC = []float64{
-	Inf(-1),
-	-Pi,
-	-1,
-	Copysign(0, -1),
-	0,
-	1,
-	Pi,
-	Inf(1),
-	NaN(),
-}
-var atanhSC = []float64{
-	NaN(),
-	NaN(),
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-	NaN(),
-	NaN(),
-}
-var vfatan2SC = [][2]float64{
-	{Inf(-1), Inf(-1)},
-	{Inf(-1), -Pi},
-	{Inf(-1), 0},
-	{Inf(-1), +Pi},
-	{Inf(-1), Inf(1)},
-	{Inf(-1), NaN()},
-	{-Pi, Inf(-1)},
-	{-Pi, 0},
-	{-Pi, Inf(1)},
-	{-Pi, NaN()},
-	{Copysign(0, -1), Inf(-1)},
-	{Copysign(0, -1), -Pi},
-	{Copysign(0, -1), Copysign(0, -1)},
-	{Copysign(0, -1), 0},
-	{Copysign(0, -1), +Pi},
-	{Copysign(0, -1), Inf(1)},
-	{Copysign(0, -1), NaN()},
-	{0, Inf(-1)},
-	{0, -Pi},
-	{0, Copysign(0, -1)},
-	{0, 0},
-	{0, +Pi},
-	{0, Inf(1)},
-	{0, NaN()},
-	{+Pi, Inf(-1)},
-	{+Pi, 0},
-	{+Pi, Inf(1)},
-	{+Pi, NaN()},
-	{Inf(1), Inf(-1)},
-	{Inf(1), -Pi},
-	{Inf(1), 0},
-	{Inf(1), +Pi},
-	{Inf(1), Inf(1)},
-	{Inf(1), NaN()},
-	{NaN(), NaN()},
-}
-var atan2SC = []float64{
-	-3 * Pi / 4,     // atan2(-Inf, -Inf)
-	-Pi / 2,         // atan2(-Inf, -Pi)
-	-Pi / 2,         // atan2(-Inf, +0)
-	-Pi / 2,         // atan2(-Inf, +Pi)
-	-Pi / 4,         // atan2(-Inf, +Inf)
-	NaN(),           // atan2(-Inf, NaN)
-	-Pi,             // atan2(-Pi, -Inf)
-	-Pi / 2,         // atan2(-Pi, +0)
-	Copysign(0, -1), // atan2(-Pi, Inf)
-	NaN(),           // atan2(-Pi, NaN)
-	-Pi,             // atan2(-0, -Inf)
-	-Pi,             // atan2(-0, -Pi)
-	-Pi,             // atan2(-0, -0)
-	Copysign(0, -1), // atan2(-0, +0)
-	Copysign(0, -1), // atan2(-0, +Pi)
-	Copysign(0, -1), // atan2(-0, +Inf)
-	NaN(),           // atan2(-0, NaN)
-	Pi,              // atan2(+0, -Inf)
-	Pi,              // atan2(+0, -Pi)
-	Pi,              // atan2(+0, -0)
-	0,               // atan2(+0, +0)
-	0,               // atan2(+0, +Pi)
-	0,               // atan2(+0, +Inf)
-	NaN(),           // atan2(+0, NaN)
-	Pi,              // atan2(+Pi, -Inf)
-	Pi / 2,          // atan2(+Pi, +0)
-	0,               // atan2(+Pi, +Inf)
-	NaN(),           // atan2(+Pi, NaN)
-	3 * Pi / 4,      // atan2(+Inf, -Inf)
-	Pi / 2,          // atan2(+Inf, -Pi)
-	Pi / 2,          // atan2(+Inf, +0)
-	Pi / 2,          // atan2(+Inf, +Pi)
-	Pi / 4,          // atan2(+Inf, +Inf)
-	NaN(),           // atan2(+Inf, NaN)
-	NaN(),           // atan2(NaN, NaN)
-}
-
-var vfcbrtSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var cbrtSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-
-var vfceilSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var ceilSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-
-var vfcopysignSC = []float64{
-	Inf(-1),
-	Inf(1),
-	NaN(),
-}
-var copysignSC = []float64{
-	Inf(-1),
-	Inf(-1),
-	NaN(),
-}
-
-var vfcosSC = []float64{
-	Inf(-1),
-	Inf(1),
-	NaN(),
-}
-var cosSC = []float64{
-	NaN(),
-	NaN(),
-	NaN(),
-}
-
-var vfcoshSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var coshSC = []float64{
-	Inf(1),
-	1,
-	1,
-	Inf(1),
-	NaN(),
-}
-
-var vferfSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var erfSC = []float64{
-	-1,
-	Copysign(0, -1),
-	0,
-	1,
-	NaN(),
-}
-
-var vferfcSC = []float64{
-	Inf(-1),
-	Inf(1),
-	NaN(),
-}
-var erfcSC = []float64{
-	2,
-	0,
-	NaN(),
-}
-
-var vfexpSC = []float64{
-	Inf(-1),
-	-2000,
-	2000,
-	Inf(1),
-	NaN(),
-}
-var expSC = []float64{
-	0,
-	0,
-	Inf(1),
-	Inf(1),
-	NaN(),
-}
-
-var vfexpm1SC = []float64{
-	Inf(-1),
-	-710,
-	Copysign(0, -1),
-	0,
-	710,
-	Inf(1),
-	NaN(),
-}
-var expm1SC = []float64{
-	-1,
-	-1,
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	Inf(1),
-	NaN(),
-}
-
-var vffabsSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var fabsSC = []float64{
-	Inf(1),
-	0,
-	0,
-	Inf(1),
-	NaN(),
-}
-
-var vffdimSC = [][2]float64{
-	{Inf(-1), Inf(-1)},
-	{Inf(-1), Inf(1)},
-	{Inf(-1), NaN()},
-	{Copysign(0, -1), Copysign(0, -1)},
-	{Copysign(0, -1), 0},
-	{0, Copysign(0, -1)},
-	{0, 0},
-	{Inf(1), Inf(-1)},
-	{Inf(1), Inf(1)},
-	{Inf(1), NaN()},
-	{NaN(), Inf(-1)},
-	{NaN(), Copysign(0, -1)},
-	{NaN(), 0},
-	{NaN(), Inf(1)},
-	{NaN(), NaN()},
-}
-var nan = Float64frombits(0xFFF8000000000000) // SSE2 DIVSD 0/0
-var vffdim2SC = [][2]float64{
-	{Inf(-1), Inf(-1)},
-	{Inf(-1), Inf(1)},
-	{Inf(-1), nan},
-	{Copysign(0, -1), Copysign(0, -1)},
-	{Copysign(0, -1), 0},
-	{0, Copysign(0, -1)},
-	{0, 0},
-	{Inf(1), Inf(-1)},
-	{Inf(1), Inf(1)},
-	{Inf(1), nan},
-	{nan, Inf(-1)},
-	{nan, Copysign(0, -1)},
-	{nan, 0},
-	{nan, Inf(1)},
-	{nan, nan},
-}
-var fdimSC = []float64{
-	NaN(),
-	0,
-	NaN(),
-	0,
-	0,
-	0,
-	0,
-	Inf(1),
-	NaN(),
-	NaN(),
-	NaN(),
-	NaN(),
-	NaN(),
-	NaN(),
-	NaN(),
-}
-var fmaxSC = []float64{
-	Inf(-1),
-	Inf(1),
-	NaN(),
-	Copysign(0, -1),
-	0,
-	0,
-	0,
-	Inf(1),
-	Inf(1),
-	Inf(1),
-	NaN(),
-	NaN(),
-	NaN(),
-	Inf(1),
-	NaN(),
-}
-var fminSC = []float64{
-	Inf(-1),
-	Inf(-1),
-	Inf(-1),
-	Copysign(0, -1),
-	Copysign(0, -1),
-	Copysign(0, -1),
-	0,
-	Inf(-1),
-	Inf(1),
-	NaN(),
-	Inf(-1),
-	NaN(),
-	NaN(),
-	NaN(),
-	NaN(),
-}
-
-var vffmodSC = [][2]float64{
-	{Inf(-1), Inf(-1)},
-	{Inf(-1), -Pi},
-	{Inf(-1), 0},
-	{Inf(-1), Pi},
-	{Inf(-1), Inf(1)},
-	{Inf(-1), NaN()},
-	{-Pi, Inf(-1)},
-	{-Pi, 0},
-	{-Pi, Inf(1)},
-	{-Pi, NaN()},
-	{Copysign(0, -1), Inf(-1)},
-	{Copysign(0, -1), 0},
-	{Copysign(0, -1), Inf(1)},
-	{Copysign(0, -1), NaN()},
-	{0, Inf(-1)},
-	{0, 0},
-	{0, Inf(1)},
-	{0, NaN()},
-	{Pi, Inf(-1)},
-	{Pi, 0},
-	{Pi, Inf(1)},
-	{Pi, NaN()},
-	{Inf(1), Inf(-1)},
-	{Inf(1), -Pi},
-	{Inf(1), 0},
-	{Inf(1), Pi},
-	{Inf(1), Inf(1)},
-	{Inf(1), NaN()},
-	{NaN(), Inf(-1)},
-	{NaN(), -Pi},
-	{NaN(), 0},
-	{NaN(), Pi},
-	{NaN(), Inf(1)},
-	{NaN(), NaN()},
-}
-var fmodSC = []float64{
-	NaN(),           // fmod(-Inf, -Inf)
-	NaN(),           // fmod(-Inf, -Pi)
-	NaN(),           // fmod(-Inf, 0)
-	NaN(),           // fmod(-Inf, Pi)
-	NaN(),           // fmod(-Inf, +Inf)
-	NaN(),           // fmod(-Inf, NaN)
-	-Pi,             // fmod(-Pi, -Inf)
-	NaN(),           // fmod(-Pi, 0)
-	-Pi,             // fmod(-Pi, +Inf)
-	NaN(),           // fmod(-Pi, NaN)
-	Copysign(0, -1), // fmod(-0, -Inf)
-	NaN(),           // fmod(-0, 0)
-	Copysign(0, -1), // fmod(-0, Inf)
-	NaN(),           // fmod(-0, NaN)
-	0,               // fmod(0, -Inf)
-	NaN(),           // fmod(0, 0)
-	0,               // fmod(0, +Inf)
-	NaN(),           // fmod(0, NaN)
-	Pi,              // fmod(Pi, -Inf)
-	NaN(),           // fmod(Pi, 0)
-	Pi,              // fmod(Pi, +Inf)
-	NaN(),           // fmod(Pi, NaN)
-	NaN(),           // fmod(+Inf, -Inf)
-	NaN(),           // fmod(+Inf, -Pi)
-	NaN(),           // fmod(+Inf, 0)
-	NaN(),           // fmod(+Inf, Pi)
-	NaN(),           // fmod(+Inf, +Inf)
-	NaN(),           // fmod(+Inf, NaN)
-	NaN(),           // fmod(NaN, -Inf)
-	NaN(),           // fmod(NaN, -Pi)
-	NaN(),           // fmod(NaN, 0)
-	NaN(),           // fmod(NaN, Pi)
-	NaN(),           // fmod(NaN, +Inf)
-	NaN(),           // fmod(NaN, NaN)
-}
-
-var vffrexpSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var frexpSC = []fi{
-	{Inf(-1), 0},
-	{Copysign(0, -1), 0},
-	{0, 0},
-	{Inf(1), 0},
-	{NaN(), 0},
-}
-
-var vfgammaSC = []float64{
-	Inf(-1),
-	-3,
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var gammaSC = []float64{
-	NaN(),
-	NaN(),
-	Inf(-1),
-	Inf(1),
-	Inf(1),
-	NaN(),
-}
-
-var vfhypotSC = [][2]float64{
-	{Inf(-1), Inf(-1)},
-	{Inf(-1), 0},
-	{Inf(-1), Inf(1)},
-	{Inf(-1), NaN()},
-	{Copysign(0, -1), Copysign(0, -1)},
-	{Copysign(0, -1), 0},
-	{0, Copysign(0, -1)},
-	{0, 0}, // +0, +0
-	{0, Inf(-1)},
-	{0, Inf(1)},
-	{0, NaN()},
-	{Inf(1), Inf(-1)},
-	{Inf(1), 0},
-	{Inf(1), Inf(1)},
-	{Inf(1), NaN()},
-	{NaN(), Inf(-1)},
-	{NaN(), 0},
-	{NaN(), Inf(1)},
-	{NaN(), NaN()},
-}
-var hypotSC = []float64{
-	Inf(1),
-	Inf(1),
-	Inf(1),
-	Inf(1),
-	0,
-	0,
-	0,
-	0,
-	Inf(1),
-	Inf(1),
-	NaN(),
-	Inf(1),
-	Inf(1),
-	Inf(1),
-	Inf(1),
-	Inf(1),
-	NaN(),
-	Inf(1),
-	NaN(),
-}
-
-var vfilogbSC = []float64{
-	Inf(-1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var ilogbSC = []int{
-	MaxInt32,
-	MinInt32,
-	MaxInt32,
-	MaxInt32,
-}
-
-var vfj0SC = []float64{
-	Inf(-1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var j0SC = []float64{
-	0,
-	1,
-	0,
-	NaN(),
-}
-var j1SC = []float64{
-	0,
-	0,
-	0,
-	NaN(),
-}
-var j2SC = []float64{
-	0,
-	0,
-	0,
-	NaN(),
-}
-var jM3SC = []float64{
-	0,
-	0,
-	0,
-	NaN(),
-}
-
-var vfldexpSC = []fi{
-	{0, 0},
-	{0, -1075},
-	{0, 1024},
-	{Copysign(0, -1), 0},
-	{Copysign(0, -1), -1075},
-	{Copysign(0, -1), 1024},
-	{Inf(1), 0},
-	{Inf(1), -1024},
-	{Inf(-1), 0},
-	{Inf(-1), -1024},
-	{NaN(), -1024},
-}
-var ldexpSC = []float64{
-	0,
-	0,
-	0,
-	Copysign(0, -1),
-	Copysign(0, -1),
-	Copysign(0, -1),
-	Inf(1),
-	Inf(1),
-	Inf(-1),
-	Inf(-1),
-	NaN(),
-}
-
-var vflgammaSC = []float64{
-	Inf(-1),
-	-3,
-	0,
-	1,
-	2,
-	Inf(1),
-	NaN(),
-}
-var lgammaSC = []fi{
-	{Inf(-1), 1},
-	{Inf(1), 1},
-	{Inf(1), 1},
-	{0, 1},
-	{0, 1},
-	{Inf(1), 1},
-	{NaN(), 1},
-}
-
-var vflogSC = []float64{
-	Inf(-1),
-	-Pi,
-	Copysign(0, -1),
-	0,
-	1,
-	Inf(1),
-	NaN(),
-}
-var logSC = []float64{
-	NaN(),
-	NaN(),
-	Inf(-1),
-	Inf(-1),
-	0,
-	Inf(1),
-	NaN(),
-}
-
-var vflogbSC = []float64{
-	Inf(-1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var logbSC = []float64{
-	Inf(1),
-	Inf(-1),
-	Inf(1),
-	NaN(),
-}
-
-var vflog1pSC = []float64{
-	Inf(-1),
-	-Pi,
-	-1,
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var log1pSC = []float64{
-	NaN(),
-	NaN(),
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-
-var vfmodfSC = []float64{
-	Inf(-1),
-	Inf(1),
-	NaN(),
-}
-var modfSC = [][2]float64{
-	{Inf(-1), NaN()}, // [2]float64{Copysign(0, -1), Inf(-1)},
-	{Inf(1), NaN()},  // [2]float64{0, Inf(1)},
-	{NaN(), NaN()},
-}
-
-var vfnextafter32SC = [][2]float32{
-	{0, 0},
-	{0, float32(Copysign(0, -1))},
-	{0, -1},
-	{0, float32(NaN())},
-	{float32(Copysign(0, -1)), 1},
-	{float32(Copysign(0, -1)), 0},
-	{float32(Copysign(0, -1)), float32(Copysign(0, -1))},
-	{float32(Copysign(0, -1)), -1},
-	{float32(NaN()), 0},
-	{float32(NaN()), float32(NaN())},
-}
-var nextafter32SC = []float32{
-	0,
-	0,
-	-1.401298464e-45, // Float32frombits(0x80000001)
-	float32(NaN()),
-	1.401298464e-45, // Float32frombits(0x00000001)
-	float32(Copysign(0, -1)),
-	float32(Copysign(0, -1)),
-	-1.401298464e-45, // Float32frombits(0x80000001)
-	float32(NaN()),
-	float32(NaN()),
-}
-
-var vfnextafter64SC = [][2]float64{
-	{0, 0},
-	{0, Copysign(0, -1)},
-	{0, -1},
-	{0, NaN()},
-	{Copysign(0, -1), 1},
-	{Copysign(0, -1), 0},
-	{Copysign(0, -1), Copysign(0, -1)},
-	{Copysign(0, -1), -1},
-	{NaN(), 0},
-	{NaN(), NaN()},
-}
-var nextafter64SC = []float64{
-	0,
-	0,
-	-4.9406564584124654418e-324, // Float64frombits(0x8000000000000001)
-	NaN(),
-	4.9406564584124654418e-324, // Float64frombits(0x0000000000000001)
-	Copysign(0, -1),
-	Copysign(0, -1),
-	-4.9406564584124654418e-324, // Float64frombits(0x8000000000000001)
-	NaN(),
-	NaN(),
-}
-
-var vfpowSC = [][2]float64{
-	{Inf(-1), -Pi},
-	{Inf(-1), -3},
-	{Inf(-1), Copysign(0, -1)},
-	{Inf(-1), 0},
-	{Inf(-1), 1},
-	{Inf(-1), 3},
-	{Inf(-1), Pi},
-	{Inf(-1), NaN()},
-
-	{-Pi, Inf(-1)},
-	{-Pi, -Pi},
-	{-Pi, Copysign(0, -1)},
-	{-Pi, 0},
-	{-Pi, 1},
-	{-Pi, Pi},
-	{-Pi, Inf(1)},
-	{-Pi, NaN()},
-
-	{-1, Inf(-1)},
-	{-1, Inf(1)},
-	{-1, NaN()},
-	{-1 / 2, Inf(-1)},
-	{-1 / 2, Inf(1)},
-	{Copysign(0, -1), Inf(-1)},
-	{Copysign(0, -1), -Pi},
-	{Copysign(0, -1), -3},
-	{Copysign(0, -1), 3},
-	{Copysign(0, -1), Pi},
-	{Copysign(0, -1), Inf(1)},
-
-	{0, Inf(-1)},
-	{0, -Pi},
-	{0, -3},
-	{0, Copysign(0, -1)},
-	{0, 0},
-	{0, 3},
-	{0, Pi},
-	{0, Inf(1)},
-	{0, NaN()},
-
-	{1 / 2, Inf(-1)},
-	{1 / 2, Inf(1)},
-	{1, Inf(-1)},
-	{1, Inf(1)},
-	{1, NaN()},
-
-	{Pi, Inf(-1)},
-	{Pi, Copysign(0, -1)},
-	{Pi, 0},
-	{Pi, 1},
-	{Pi, Inf(1)},
-	{Pi, NaN()},
-	{Inf(1), -Pi},
-	{Inf(1), Copysign(0, -1)},
-	{Inf(1), 0},
-	{Inf(1), 1},
-	{Inf(1), Pi},
-	{Inf(1), NaN()},
-	{NaN(), -Pi},
-	{NaN(), Copysign(0, -1)},
-	{NaN(), 0},
-	{NaN(), 1},
-	{NaN(), Pi},
-	{NaN(), NaN()},
-}
-var powSC = []float64{
-	0,               // pow(-Inf, -Pi)
-	Copysign(0, -1), // pow(-Inf, -3)
-	1,               // pow(-Inf, -0)
-	1,               // pow(-Inf, +0)
-	Inf(-1),         // pow(-Inf, 1)
-	Inf(-1),         // pow(-Inf, 3)
-	Inf(1),          // pow(-Inf, Pi)
-	NaN(),           // pow(-Inf, NaN)
-	0,               // pow(-Pi, -Inf)
-	NaN(),           // pow(-Pi, -Pi)
-	1,               // pow(-Pi, -0)
-	1,               // pow(-Pi, +0)
-	-Pi,             // pow(-Pi, 1)
-	NaN(),           // pow(-Pi, Pi)
-	Inf(1),          // pow(-Pi, +Inf)
-	NaN(),           // pow(-Pi, NaN)
-	1,               // pow(-1, -Inf) IEEE 754-2008
-	1,               // pow(-1, +Inf) IEEE 754-2008
-	NaN(),           // pow(-1, NaN)
-	Inf(1),          // pow(-1/2, -Inf)
-	0,               // pow(-1/2, +Inf)
-	Inf(1),          // pow(-0, -Inf)
-	Inf(1),          // pow(-0, -Pi)
-	Inf(-1),         // pow(-0, -3) IEEE 754-2008
-	Copysign(0, -1), // pow(-0, 3) IEEE 754-2008
-	0,               // pow(-0, +Pi)
-	0,               // pow(-0, +Inf)
-	Inf(1),          // pow(+0, -Inf)
-	Inf(1),          // pow(+0, -Pi)
-	Inf(1),          // pow(+0, -3)
-	1,               // pow(+0, -0)
-	1,               // pow(+0, +0)
-	0,               // pow(+0, 3)
-	0,               // pow(+0, +Pi)
-	0,               // pow(+0, +Inf)
-	NaN(),           // pow(+0, NaN)
-	Inf(1),          // pow(1/2, -Inf)
-	0,               // pow(1/2, +Inf)
-	1,               // pow(1, -Inf) IEEE 754-2008
-	1,               // pow(1, +Inf) IEEE 754-2008
-	1,               // pow(1, NaN) IEEE 754-2008
-	0,               // pow(+Pi, -Inf)
-	1,               // pow(+Pi, -0)
-	1,               // pow(+Pi, +0)
-	Pi,              // pow(+Pi, 1)
-	Inf(1),          // pow(+Pi, +Inf)
-	NaN(),           // pow(+Pi, NaN)
-	0,               // pow(+Inf, -Pi)
-	1,               // pow(+Inf, -0)
-	1,               // pow(+Inf, +0)
-	Inf(1),          // pow(+Inf, 1)
-	Inf(1),          // pow(+Inf, Pi)
-	NaN(),           // pow(+Inf, NaN)
-	NaN(),           // pow(NaN, -Pi)
-	1,               // pow(NaN, -0)
-	1,               // pow(NaN, +0)
-	NaN(),           // pow(NaN, 1)
-	NaN(),           // pow(NaN, +Pi)
-	NaN(),           // pow(NaN, NaN)
-}
-
-var vfpow10SC = []int{
-	MinInt32,
-	MaxInt32,
-	-325,
-	309,
-}
-
-var pow10SC = []float64{
-	0,      // pow10(MinInt32)
-	Inf(1), // pow10(MaxInt32)
-	0,      // pow10(-325)
-	Inf(1), // pow10(309)
-}
-
-var vfsignbitSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var signbitSC = []bool{
-	true,
-	true,
-	false,
-	false,
-	false,
-}
-
-var vfsinSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var sinSC = []float64{
-	NaN(),
-	Copysign(0, -1),
-	0,
-	NaN(),
-	NaN(),
-}
-
-var vfsinhSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var sinhSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-
-var vfsqrtSC = []float64{
-	Inf(-1),
-	-Pi,
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var sqrtSC = []float64{
-	NaN(),
-	NaN(),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-
-var vftanhSC = []float64{
-	Inf(-1),
-	Copysign(0, -1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var tanhSC = []float64{
-	-1,
-	Copysign(0, -1),
-	0,
-	1,
-	NaN(),
-}
-
-var vfy0SC = []float64{
-	Inf(-1),
-	0,
-	Inf(1),
-	NaN(),
-}
-var y0SC = []float64{
-	NaN(),
-	Inf(-1),
-	0,
-	NaN(),
-}
-var y1SC = []float64{
-	NaN(),
-	Inf(-1),
-	0,
-	NaN(),
-}
-var y2SC = []float64{
-	NaN(),
-	Inf(-1),
-	0,
-	NaN(),
-}
-var yM3SC = []float64{
-	NaN(),
-	Inf(1),
-	0,
-	NaN(),
-}
-
-// arguments and expected results for boundary cases
-const (
-	SmallestNormalFloat64   = 2.2250738585072014e-308 // 2**-1022
-	LargestSubnormalFloat64 = SmallestNormalFloat64 - SmallestNonzeroFloat64
-)
-
-var vffrexpBC = []float64{
-	SmallestNormalFloat64,
-	LargestSubnormalFloat64,
-	SmallestNonzeroFloat64,
-	MaxFloat64,
-	-SmallestNormalFloat64,
-	-LargestSubnormalFloat64,
-	-SmallestNonzeroFloat64,
-	-MaxFloat64,
-}
-var frexpBC = []fi{
-	{0.5, -1021},
-	{0.99999999999999978, -1022},
-	{0.5, -1073},
-	{0.99999999999999989, 1024},
-	{-0.5, -1021},
-	{-0.99999999999999978, -1022},
-	{-0.5, -1073},
-	{-0.99999999999999989, 1024},
-}
-
-var vfldexpBC = []fi{
-	{SmallestNormalFloat64, -52},
-	{LargestSubnormalFloat64, -51},
-	{SmallestNonzeroFloat64, 1074},
-	{MaxFloat64, -(1023 + 1074)},
-	{1, -1075},
-	{-1, -1075},
-	{1, 1024},
-	{-1, 1024},
-}
-var ldexpBC = []float64{
-	SmallestNonzeroFloat64,
-	1e-323, // 2**-1073
-	1,
-	1e-323, // 2**-1073
-	0,
-	Copysign(0, -1),
-	Inf(1),
-	Inf(-1),
-}
-
-var logbBC = []float64{
-	-1022,
-	-1023,
-	-1074,
-	1023,
-	-1022,
-	-1023,
-	-1074,
-	1023,
-}
-
-func tolerance(a, b, e float64) bool {
-	d := a - b
-	if d < 0 {
-		d = -d
-	}
-
-	// note: b is correct (expected) value, a is actual value.
-	// make error tolerance a fraction of b, not a.
-	if b != 0 {
-		e = e * b
-		if e < 0 {
-			e = -e
-		}
-	}
-	return d < e
-}
-func kindaclose(a, b float64) bool { return tolerance(a, b, 1e-8) }
-func close(a, b float64) bool      { return tolerance(a, b, 1e-14) }
-func veryclose(a, b float64) bool  { return tolerance(a, b, 4e-16) }
-func soclose(a, b, e float64) bool { return tolerance(a, b, e) }
-func alike(a, b float64) bool {
-	switch {
-	case IsNaN(a) && IsNaN(b):
-		return true
-	case a == b:
-		return Signbit(a) == Signbit(b)
-	}
-	return false
-}
-
-func TestNaN(t *testing.T) {
-	f64 := NaN()
-	if f64 == f64 {
-		t.Fatalf("NaN() returns %g, expected NaN", f64)
-	}
-	f32 := float32(f64)
-	if f32 == f32 {
-		t.Fatalf("float32(NaN()) is %g, expected NaN", f32)
-	}
-}
-
-func TestAcos(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := vf[i] / 10
-		if f := Acos(a); !close(acos[i], f) {
-			t.Errorf("Acos(%g) = %g, want %g", a, f, acos[i])
-		}
-	}
-	for i := 0; i < len(vfacosSC); i++ {
-		if f := Acos(vfacosSC[i]); !alike(acosSC[i], f) {
-			t.Errorf("Acos(%g) = %g, want %g", vfacosSC[i], f, acosSC[i])
-		}
-	}
-}
-
-func TestAcosh(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := 1 + Abs(vf[i])
-		if f := Acosh(a); !veryclose(acosh[i], f) {
-			t.Errorf("Acosh(%g) = %g, want %g", a, f, acosh[i])
-		}
-	}
-	for i := 0; i < len(vfacoshSC); i++ {
-		if f := Acosh(vfacoshSC[i]); !alike(acoshSC[i], f) {
-			t.Errorf("Acosh(%g) = %g, want %g", vfacoshSC[i], f, acoshSC[i])
-		}
-	}
-}
-
-func TestAsin(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := vf[i] / 10
-		if f := Asin(a); !veryclose(asin[i], f) {
-			t.Errorf("Asin(%g) = %g, want %g", a, f, asin[i])
-		}
-	}
-	for i := 0; i < len(vfasinSC); i++ {
-		if f := Asin(vfasinSC[i]); !alike(asinSC[i], f) {
-			t.Errorf("Asin(%g) = %g, want %g", vfasinSC[i], f, asinSC[i])
-		}
-	}
-}
-
-func TestAsinh(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Asinh(vf[i]); !veryclose(asinh[i], f) {
-			t.Errorf("Asinh(%g) = %g, want %g", vf[i], f, asinh[i])
-		}
-	}
-	for i := 0; i < len(vfasinhSC); i++ {
-		if f := Asinh(vfasinhSC[i]); !alike(asinhSC[i], f) {
-			t.Errorf("Asinh(%g) = %g, want %g", vfasinhSC[i], f, asinhSC[i])
-		}
-	}
-}
-
-func TestAtan(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Atan(vf[i]); !veryclose(atan[i], f) {
-			t.Errorf("Atan(%g) = %g, want %g", vf[i], f, atan[i])
-		}
-	}
-	for i := 0; i < len(vfatanSC); i++ {
-		if f := Atan(vfatanSC[i]); !alike(atanSC[i], f) {
-			t.Errorf("Atan(%g) = %g, want %g", vfatanSC[i], f, atanSC[i])
-		}
-	}
-}
-
-func TestAtanh(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := vf[i] / 10
-		if f := Atanh(a); !veryclose(atanh[i], f) {
-			t.Errorf("Atanh(%g) = %g, want %g", a, f, atanh[i])
-		}
-	}
-	for i := 0; i < len(vfatanhSC); i++ {
-		if f := Atanh(vfatanhSC[i]); !alike(atanhSC[i], f) {
-			t.Errorf("Atanh(%g) = %g, want %g", vfatanhSC[i], f, atanhSC[i])
-		}
-	}
-}
-
-func TestAtan2(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Atan2(10, vf[i]); !veryclose(atan2[i], f) {
-			t.Errorf("Atan2(10, %g) = %g, want %g", vf[i], f, atan2[i])
-		}
-	}
-	for i := 0; i < len(vfatan2SC); i++ {
-		if f := Atan2(vfatan2SC[i][0], vfatan2SC[i][1]); !alike(atan2SC[i], f) {
-			t.Errorf("Atan2(%g, %g) = %g, want %g", vfatan2SC[i][0], vfatan2SC[i][1], f, atan2SC[i])
-		}
-	}
-}
-
-func TestCbrt(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Cbrt(vf[i]); !veryclose(cbrt[i], f) {
-			t.Errorf("Cbrt(%g) = %g, want %g", vf[i], f, cbrt[i])
-		}
-	}
-	for i := 0; i < len(vfcbrtSC); i++ {
-		if f := Cbrt(vfcbrtSC[i]); !alike(cbrtSC[i], f) {
-			t.Errorf("Cbrt(%g) = %g, want %g", vfcbrtSC[i], f, cbrtSC[i])
-		}
-	}
-}
-
-func TestCeil(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Ceil(vf[i]); ceil[i] != f {
-			t.Errorf("Ceil(%g) = %g, want %g", vf[i], f, ceil[i])
-		}
-	}
-	for i := 0; i < len(vfceilSC); i++ {
-		if f := Ceil(vfceilSC[i]); !alike(ceilSC[i], f) {
-			t.Errorf("Ceil(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i])
-		}
-	}
-}
-
-func TestCopysign(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Copysign(vf[i], -1); copysign[i] != f {
-			t.Errorf("Copysign(%g, -1) = %g, want %g", vf[i], f, copysign[i])
-		}
-	}
-	for i := 0; i < len(vf); i++ {
-		if f := Copysign(vf[i], 1); -copysign[i] != f {
-			t.Errorf("Copysign(%g, 1) = %g, want %g", vf[i], f, -copysign[i])
-		}
-	}
-	for i := 0; i < len(vfcopysignSC); i++ {
-		if f := Copysign(vfcopysignSC[i], -1); !alike(copysignSC[i], f) {
-			t.Errorf("Copysign(%g, -1) = %g, want %g", vfcopysignSC[i], f, copysignSC[i])
-		}
-	}
-}
-
-func TestCos(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Cos(vf[i]); !veryclose(cos[i], f) {
-			t.Errorf("Cos(%g) = %g, want %g", vf[i], f, cos[i])
-		}
-	}
-	for i := 0; i < len(vfcosSC); i++ {
-		if f := Cos(vfcosSC[i]); !alike(cosSC[i], f) {
-			t.Errorf("Cos(%g) = %g, want %g", vfcosSC[i], f, cosSC[i])
-		}
-	}
-}
-
-func TestCosh(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Cosh(vf[i]); !close(cosh[i], f) {
-			t.Errorf("Cosh(%g) = %g, want %g", vf[i], f, cosh[i])
-		}
-	}
-	for i := 0; i < len(vfcoshSC); i++ {
-		if f := Cosh(vfcoshSC[i]); !alike(coshSC[i], f) {
-			t.Errorf("Cosh(%g) = %g, want %g", vfcoshSC[i], f, coshSC[i])
-		}
-	}
-}
-
-func TestErf(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := vf[i] / 10
-		if f := Erf(a); !veryclose(erf[i], f) {
-			t.Errorf("Erf(%g) = %g, want %g", a, f, erf[i])
-		}
-	}
-	for i := 0; i < len(vferfSC); i++ {
-		if f := Erf(vferfSC[i]); !alike(erfSC[i], f) {
-			t.Errorf("Erf(%g) = %g, want %g", vferfSC[i], f, erfSC[i])
-		}
-	}
-}
-
-func TestErfc(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := vf[i] / 10
-		if f := Erfc(a); !veryclose(erfc[i], f) {
-			t.Errorf("Erfc(%g) = %g, want %g", a, f, erfc[i])
-		}
-	}
-	for i := 0; i < len(vferfcSC); i++ {
-		if f := Erfc(vferfcSC[i]); !alike(erfcSC[i], f) {
-			t.Errorf("Erfc(%g) = %g, want %g", vferfcSC[i], f, erfcSC[i])
-		}
-	}
-}
-
-func TestExp(t *testing.T) {
-	testExp(t, Exp, "Exp")
-	testExp(t, ExpGo, "ExpGo")
-}
-
-func testExp(t *testing.T, Exp func(float64) float64, name string) {
-	for i := 0; i < len(vf); i++ {
-		if f := Exp(vf[i]); !close(exp[i], f) {
-			t.Errorf("%s(%g) = %g, want %g", name, vf[i], f, exp[i])
-		}
-	}
-	for i := 0; i < len(vfexpSC); i++ {
-		if f := Exp(vfexpSC[i]); !alike(expSC[i], f) {
-			t.Errorf("%s(%g) = %g, want %g", name, vfexpSC[i], f, expSC[i])
-		}
-	}
-}
-
-func TestExpm1(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := vf[i] / 100
-		if f := Expm1(a); !veryclose(expm1[i], f) {
-			t.Errorf("Expm1(%g) = %g, want %g", a, f, expm1[i])
-		}
-	}
-	for i := 0; i < len(vfexpm1SC); i++ {
-		if f := Expm1(vfexpm1SC[i]); !alike(expm1SC[i], f) {
-			t.Errorf("Expm1(%g) = %g, want %g", vfexpm1SC[i], f, expm1SC[i])
-		}
-	}
-}
-
-func TestExp2(t *testing.T) {
-	testExp2(t, Exp2, "Exp2")
-	testExp2(t, Exp2Go, "Exp2Go")
-}
-
-func testExp2(t *testing.T, Exp2 func(float64) float64, name string) {
-	for i := 0; i < len(vf); i++ {
-		if f := Exp2(vf[i]); !close(exp2[i], f) {
-			t.Errorf("%s(%g) = %g, want %g", name, vf[i], f, exp2[i])
-		}
-	}
-	for i := 0; i < len(vfexpSC); i++ {
-		if f := Exp2(vfexpSC[i]); !alike(expSC[i], f) {
-			t.Errorf("%s(%g) = %g, want %g", name, vfexpSC[i], f, expSC[i])
-		}
-	}
-	for n := -1074; n < 1024; n++ {
-		f := Exp2(float64(n))
-		vf := Ldexp(1, n)
-		if f != vf {
-			t.Errorf("%s(%d) = %g, want %g", name, n, f, vf)
-		}
-	}
-}
-
-func TestAbs(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Abs(vf[i]); fabs[i] != f {
-			t.Errorf("Abs(%g) = %g, want %g", vf[i], f, fabs[i])
-		}
-	}
-	for i := 0; i < len(vffabsSC); i++ {
-		if f := Abs(vffabsSC[i]); !alike(fabsSC[i], f) {
-			t.Errorf("Abs(%g) = %g, want %g", vffabsSC[i], f, fabsSC[i])
-		}
-	}
-}
-
-func TestDim(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Dim(vf[i], 0); fdim[i] != f {
-			t.Errorf("Dim(%g, %g) = %g, want %g", vf[i], 0.0, f, fdim[i])
-		}
-	}
-	for i := 0; i < len(vffdimSC); i++ {
-		if f := Dim(vffdimSC[i][0], vffdimSC[i][1]); !alike(fdimSC[i], f) {
-			t.Errorf("Dim(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fdimSC[i])
-		}
-	}
-	for i := 0; i < len(vffdim2SC); i++ {
-		if f := Dim(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fdimSC[i], f) {
-			t.Errorf("Dim(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fdimSC[i])
-		}
-	}
-}
-
-func TestFloor(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Floor(vf[i]); floor[i] != f {
-			t.Errorf("Floor(%g) = %g, want %g", vf[i], f, floor[i])
-		}
-	}
-	for i := 0; i < len(vfceilSC); i++ {
-		if f := Floor(vfceilSC[i]); !alike(ceilSC[i], f) {
-			t.Errorf("Floor(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i])
-		}
-	}
-}
-
-func TestMax(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Max(vf[i], ceil[i]); ceil[i] != f {
-			t.Errorf("Max(%g, %g) = %g, want %g", vf[i], ceil[i], f, ceil[i])
-		}
-	}
-	for i := 0; i < len(vffdimSC); i++ {
-		if f := Max(vffdimSC[i][0], vffdimSC[i][1]); !alike(fmaxSC[i], f) {
-			t.Errorf("Max(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fmaxSC[i])
-		}
-	}
-	for i := 0; i < len(vffdim2SC); i++ {
-		if f := Max(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fmaxSC[i], f) {
-			t.Errorf("Max(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fmaxSC[i])
-		}
-	}
-}
-
-func TestMin(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Min(vf[i], floor[i]); floor[i] != f {
-			t.Errorf("Min(%g, %g) = %g, want %g", vf[i], floor[i], f, floor[i])
-		}
-	}
-	for i := 0; i < len(vffdimSC); i++ {
-		if f := Min(vffdimSC[i][0], vffdimSC[i][1]); !alike(fminSC[i], f) {
-			t.Errorf("Min(%g, %g) = %g, want %g", vffdimSC[i][0], vffdimSC[i][1], f, fminSC[i])
-		}
-	}
-	for i := 0; i < len(vffdim2SC); i++ {
-		if f := Min(vffdim2SC[i][0], vffdim2SC[i][1]); !alike(fminSC[i], f) {
-			t.Errorf("Min(%g, %g) = %g, want %g", vffdim2SC[i][0], vffdim2SC[i][1], f, fminSC[i])
-		}
-	}
-}
-
-func TestMod(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Mod(10, vf[i]); fmod[i] != f {
-			t.Errorf("Mod(10, %g) = %g, want %g", vf[i], f, fmod[i])
-		}
-	}
-	for i := 0; i < len(vffmodSC); i++ {
-		if f := Mod(vffmodSC[i][0], vffmodSC[i][1]); !alike(fmodSC[i], f) {
-			t.Errorf("Mod(%g, %g) = %g, want %g", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i])
-		}
-	}
-}
-
-func TestFrexp(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f, j := Frexp(vf[i]); !veryclose(frexp[i].f, f) || frexp[i].i != j {
-			t.Errorf("Frexp(%g) = %g, %d, want %g, %d", vf[i], f, j, frexp[i].f, frexp[i].i)
-		}
-	}
-	for i := 0; i < len(vffrexpSC); i++ {
-		if f, j := Frexp(vffrexpSC[i]); !alike(frexpSC[i].f, f) || frexpSC[i].i != j {
-			t.Errorf("Frexp(%g) = %g, %d, want %g, %d", vffrexpSC[i], f, j, frexpSC[i].f, frexpSC[i].i)
-		}
-	}
-	for i := 0; i < len(vffrexpBC); i++ {
-		if f, j := Frexp(vffrexpBC[i]); !alike(frexpBC[i].f, f) || frexpBC[i].i != j {
-			t.Errorf("Frexp(%g) = %g, %d, want %g, %d", vffrexpBC[i], f, j, frexpBC[i].f, frexpBC[i].i)
-		}
-	}
-}
-
-func TestGamma(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Gamma(vf[i]); !close(gamma[i], f) {
-			t.Errorf("Gamma(%g) = %g, want %g", vf[i], f, gamma[i])
-		}
-	}
-	for i := 0; i < len(vfgammaSC); i++ {
-		if f := Gamma(vfgammaSC[i]); !alike(gammaSC[i], f) {
-			t.Errorf("Gamma(%g) = %g, want %g", vfgammaSC[i], f, gammaSC[i])
-		}
-	}
-}
-
-func TestHypot(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := Abs(1e200 * tanh[i] * Sqrt(2))
-		if f := Hypot(1e200*tanh[i], 1e200*tanh[i]); !veryclose(a, f) {
-			t.Errorf("Hypot(%g, %g) = %g, want %g", 1e200*tanh[i], 1e200*tanh[i], f, a)
-		}
-	}
-	for i := 0; i < len(vfhypotSC); i++ {
-		if f := Hypot(vfhypotSC[i][0], vfhypotSC[i][1]); !alike(hypotSC[i], f) {
-			t.Errorf("Hypot(%g, %g) = %g, want %g", vfhypotSC[i][0], vfhypotSC[i][1], f, hypotSC[i])
-		}
-	}
-}
-
-func TestHypotGo(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := Abs(1e200 * tanh[i] * Sqrt(2))
-		if f := HypotGo(1e200*tanh[i], 1e200*tanh[i]); !veryclose(a, f) {
-			t.Errorf("HypotGo(%g, %g) = %g, want %g", 1e200*tanh[i], 1e200*tanh[i], f, a)
-		}
-	}
-	for i := 0; i < len(vfhypotSC); i++ {
-		if f := HypotGo(vfhypotSC[i][0], vfhypotSC[i][1]); !alike(hypotSC[i], f) {
-			t.Errorf("HypotGo(%g, %g) = %g, want %g", vfhypotSC[i][0], vfhypotSC[i][1], f, hypotSC[i])
-		}
-	}
-}
-
-func TestIlogb(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := frexp[i].i - 1 // adjust because fr in the interval [½, 1)
-		if e := Ilogb(vf[i]); a != e {
-			t.Errorf("Ilogb(%g) = %d, want %d", vf[i], e, a)
-		}
-	}
-	for i := 0; i < len(vflogbSC); i++ {
-		if e := Ilogb(vflogbSC[i]); ilogbSC[i] != e {
-			t.Errorf("Ilogb(%g) = %d, want %d", vflogbSC[i], e, ilogbSC[i])
-		}
-	}
-	for i := 0; i < len(vffrexpBC); i++ {
-		if e := Ilogb(vffrexpBC[i]); int(logbBC[i]) != e {
-			t.Errorf("Ilogb(%g) = %d, want %d", vffrexpBC[i], e, int(logbBC[i]))
-		}
-	}
-}
-
-func TestJ0(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := J0(vf[i]); !soclose(j0[i], f, 4e-14) {
-			t.Errorf("J0(%g) = %g, want %g", vf[i], f, j0[i])
-		}
-	}
-	for i := 0; i < len(vfj0SC); i++ {
-		if f := J0(vfj0SC[i]); !alike(j0SC[i], f) {
-			t.Errorf("J0(%g) = %g, want %g", vfj0SC[i], f, j0SC[i])
-		}
-	}
-}
-
-func TestJ1(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := J1(vf[i]); !close(j1[i], f) {
-			t.Errorf("J1(%g) = %g, want %g", vf[i], f, j1[i])
-		}
-	}
-	for i := 0; i < len(vfj0SC); i++ {
-		if f := J1(vfj0SC[i]); !alike(j1SC[i], f) {
-			t.Errorf("J1(%g) = %g, want %g", vfj0SC[i], f, j1SC[i])
-		}
-	}
-}
-
-func TestJn(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Jn(2, vf[i]); !close(j2[i], f) {
-			t.Errorf("Jn(2, %g) = %g, want %g", vf[i], f, j2[i])
-		}
-		if f := Jn(-3, vf[i]); !close(jM3[i], f) {
-			t.Errorf("Jn(-3, %g) = %g, want %g", vf[i], f, jM3[i])
-		}
-	}
-	for i := 0; i < len(vfj0SC); i++ {
-		if f := Jn(2, vfj0SC[i]); !alike(j2SC[i], f) {
-			t.Errorf("Jn(2, %g) = %g, want %g", vfj0SC[i], f, j2SC[i])
-		}
-		if f := Jn(-3, vfj0SC[i]); !alike(jM3SC[i], f) {
-			t.Errorf("Jn(-3, %g) = %g, want %g", vfj0SC[i], f, jM3SC[i])
-		}
-	}
-}
-
-func TestLdexp(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Ldexp(frexp[i].f, frexp[i].i); !veryclose(vf[i], f) {
-			t.Errorf("Ldexp(%g, %d) = %g, want %g", frexp[i].f, frexp[i].i, f, vf[i])
-		}
-	}
-	for i := 0; i < len(vffrexpSC); i++ {
-		if f := Ldexp(frexpSC[i].f, frexpSC[i].i); !alike(vffrexpSC[i], f) {
-			t.Errorf("Ldexp(%g, %d) = %g, want %g", frexpSC[i].f, frexpSC[i].i, f, vffrexpSC[i])
-		}
-	}
-	for i := 0; i < len(vfldexpSC); i++ {
-		if f := Ldexp(vfldexpSC[i].f, vfldexpSC[i].i); !alike(ldexpSC[i], f) {
-			t.Errorf("Ldexp(%g, %d) = %g, want %g", vfldexpSC[i].f, vfldexpSC[i].i, f, ldexpSC[i])
-		}
-	}
-	for i := 0; i < len(vffrexpBC); i++ {
-		if f := Ldexp(frexpBC[i].f, frexpBC[i].i); !alike(vffrexpBC[i], f) {
-			t.Errorf("Ldexp(%g, %d) = %g, want %g", frexpBC[i].f, frexpBC[i].i, f, vffrexpBC[i])
-		}
-	}
-	for i := 0; i < len(vfldexpBC); i++ {
-		if f := Ldexp(vfldexpBC[i].f, vfldexpBC[i].i); !alike(ldexpBC[i], f) {
-			t.Errorf("Ldexp(%g, %d) = %g, want %g", vfldexpBC[i].f, vfldexpBC[i].i, f, ldexpBC[i])
-		}
-	}
-}
-
-func TestLgamma(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f, s := Lgamma(vf[i]); !close(lgamma[i].f, f) || lgamma[i].i != s {
-			t.Errorf("Lgamma(%g) = %g, %d, want %g, %d", vf[i], f, s, lgamma[i].f, lgamma[i].i)
-		}
-	}
-	for i := 0; i < len(vflgammaSC); i++ {
-		if f, s := Lgamma(vflgammaSC[i]); !alike(lgammaSC[i].f, f) || lgammaSC[i].i != s {
-			t.Errorf("Lgamma(%g) = %g, %d, want %g, %d", vflgammaSC[i], f, s, lgammaSC[i].f, lgammaSC[i].i)
-		}
-	}
-}
-
-func TestLog(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := Abs(vf[i])
-		if f := Log(a); log[i] != f {
-			t.Errorf("Log(%g) = %g, want %g", a, f, log[i])
-		}
-	}
-	if f := Log(10); f != Ln10 {
-		t.Errorf("Log(%g) = %g, want %g", 10.0, f, Ln10)
-	}
-	for i := 0; i < len(vflogSC); i++ {
-		if f := Log(vflogSC[i]); !alike(logSC[i], f) {
-			t.Errorf("Log(%g) = %g, want %g", vflogSC[i], f, logSC[i])
-		}
-	}
-}
-
-func TestLogb(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Logb(vf[i]); logb[i] != f {
-			t.Errorf("Logb(%g) = %g, want %g", vf[i], f, logb[i])
-		}
-	}
-	for i := 0; i < len(vflogbSC); i++ {
-		if f := Logb(vflogbSC[i]); !alike(logbSC[i], f) {
-			t.Errorf("Logb(%g) = %g, want %g", vflogbSC[i], f, logbSC[i])
-		}
-	}
-	for i := 0; i < len(vffrexpBC); i++ {
-		if f := Logb(vffrexpBC[i]); !alike(logbBC[i], f) {
-			t.Errorf("Logb(%g) = %g, want %g", vffrexpBC[i], f, logbBC[i])
-		}
-	}
-}
-
-func TestLog10(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := Abs(vf[i])
-		if f := Log10(a); !veryclose(log10[i], f) {
-			t.Errorf("Log10(%g) = %g, want %g", a, f, log10[i])
-		}
-	}
-	if f := Log10(E); f != Log10E {
-		t.Errorf("Log10(%g) = %g, want %g", E, f, Log10E)
-	}
-	for i := 0; i < len(vflogSC); i++ {
-		if f := Log10(vflogSC[i]); !alike(logSC[i], f) {
-			t.Errorf("Log10(%g) = %g, want %g", vflogSC[i], f, logSC[i])
-		}
-	}
-}
-
-func TestLog1p(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := vf[i] / 100
-		if f := Log1p(a); !veryclose(log1p[i], f) {
-			t.Errorf("Log1p(%g) = %g, want %g", a, f, log1p[i])
-		}
-	}
-	a := 9.0
-	if f := Log1p(a); f != Ln10 {
-		t.Errorf("Log1p(%g) = %g, want %g", a, f, Ln10)
-	}
-	for i := 0; i < len(vflogSC); i++ {
-		if f := Log1p(vflog1pSC[i]); !alike(log1pSC[i], f) {
-			t.Errorf("Log1p(%g) = %g, want %g", vflog1pSC[i], f, log1pSC[i])
-		}
-	}
-}
-
-func TestLog2(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := Abs(vf[i])
-		if f := Log2(a); !veryclose(log2[i], f) {
-			t.Errorf("Log2(%g) = %g, want %g", a, f, log2[i])
-		}
-	}
-	if f := Log2(E); f != Log2E {
-		t.Errorf("Log2(%g) = %g, want %g", E, f, Log2E)
-	}
-	for i := 0; i < len(vflogSC); i++ {
-		if f := Log2(vflogSC[i]); !alike(logSC[i], f) {
-			t.Errorf("Log2(%g) = %g, want %g", vflogSC[i], f, logSC[i])
-		}
-	}
-	for i := -1074; i <= 1023; i++ {
-		f := Ldexp(1, i)
-		l := Log2(f)
-		if l != float64(i) {
-			t.Errorf("Log2(2**%d) = %g, want %d", i, l, i)
-		}
-	}
-}
-
-func TestModf(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f, g := Modf(vf[i]); !veryclose(modf[i][0], f) || !veryclose(modf[i][1], g) {
-			t.Errorf("Modf(%g) = %g, %g, want %g, %g", vf[i], f, g, modf[i][0], modf[i][1])
-		}
-	}
-	for i := 0; i < len(vfmodfSC); i++ {
-		if f, g := Modf(vfmodfSC[i]); !alike(modfSC[i][0], f) || !alike(modfSC[i][1], g) {
-			t.Errorf("Modf(%g) = %g, %g, want %g, %g", vfmodfSC[i], f, g, modfSC[i][0], modfSC[i][1])
-		}
-	}
-}
-
-func TestNextafter32(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		vfi := float32(vf[i])
-		if f := Nextafter32(vfi, 10); nextafter32[i] != f {
-			t.Errorf("Nextafter32(%g, %g) = %g want %g", vfi, 10.0, f, nextafter32[i])
-		}
-	}
-	for i := 0; i < len(vfnextafter32SC); i++ {
-		if f := Nextafter32(vfnextafter32SC[i][0], vfnextafter32SC[i][1]); !alike(float64(nextafter32SC[i]), float64(f)) {
-			t.Errorf("Nextafter32(%g, %g) = %g want %g", vfnextafter32SC[i][0], vfnextafter32SC[i][1], f, nextafter32SC[i])
-		}
-	}
-}
-
-func TestNextafter64(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Nextafter(vf[i], 10); nextafter64[i] != f {
-			t.Errorf("Nextafter64(%g, %g) = %g want %g", vf[i], 10.0, f, nextafter64[i])
-		}
-	}
-	for i := 0; i < len(vfnextafter64SC); i++ {
-		if f := Nextafter(vfnextafter64SC[i][0], vfnextafter64SC[i][1]); !alike(nextafter64SC[i], f) {
-			t.Errorf("Nextafter64(%g, %g) = %g want %g", vfnextafter64SC[i][0], vfnextafter64SC[i][1], f, nextafter64SC[i])
-		}
-	}
-}
-
-func TestPow(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Pow(10, vf[i]); !close(pow[i], f) {
-			t.Errorf("Pow(10, %g) = %g, want %g", vf[i], f, pow[i])
-		}
-	}
-	for i := 0; i < len(vfpowSC); i++ {
-		if f := Pow(vfpowSC[i][0], vfpowSC[i][1]); !alike(powSC[i], f) {
-			t.Errorf("Pow(%g, %g) = %g, want %g", vfpowSC[i][0], vfpowSC[i][1], f, powSC[i])
-		}
-	}
-}
-
-func TestPow10(t *testing.T) {
-	for i := 0; i < len(vfpow10SC); i++ {
-		if f := Pow10(vfpow10SC[i]); !alike(pow10SC[i], f) {
-			t.Errorf("Pow10(%d) = %g, want %g", vfpow10SC[i], f, pow10SC[i])
-		}
-	}
-}
-
-func TestRemainder(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Remainder(10, vf[i]); remainder[i] != f {
-			t.Errorf("Remainder(10, %g) = %g, want %g", vf[i], f, remainder[i])
-		}
-	}
-	for i := 0; i < len(vffmodSC); i++ {
-		if f := Remainder(vffmodSC[i][0], vffmodSC[i][1]); !alike(fmodSC[i], f) {
-			t.Errorf("Remainder(%g, %g) = %g, want %g", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i])
-		}
-	}
-}
-
-func TestSignbit(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Signbit(vf[i]); signbit[i] != f {
-			t.Errorf("Signbit(%g) = %t, want %t", vf[i], f, signbit[i])
-		}
-	}
-	for i := 0; i < len(vfsignbitSC); i++ {
-		if f := Signbit(vfsignbitSC[i]); signbitSC[i] != f {
-			t.Errorf("Signbit(%g) = %t, want %t", vfsignbitSC[i], f, signbitSC[i])
-		}
-	}
-}
-func TestSin(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Sin(vf[i]); !veryclose(sin[i], f) {
-			t.Errorf("Sin(%g) = %g, want %g", vf[i], f, sin[i])
-		}
-	}
-	for i := 0; i < len(vfsinSC); i++ {
-		if f := Sin(vfsinSC[i]); !alike(sinSC[i], f) {
-			t.Errorf("Sin(%g) = %g, want %g", vfsinSC[i], f, sinSC[i])
-		}
-	}
-}
-
-func TestSincos(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if s, c := Sincos(vf[i]); !veryclose(sin[i], s) || !veryclose(cos[i], c) {
-			t.Errorf("Sincos(%g) = %g, %g want %g, %g", vf[i], s, c, sin[i], cos[i])
-		}
-	}
-}
-
-func TestSinh(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Sinh(vf[i]); !close(sinh[i], f) {
-			t.Errorf("Sinh(%g) = %g, want %g", vf[i], f, sinh[i])
-		}
-	}
-	for i := 0; i < len(vfsinhSC); i++ {
-		if f := Sinh(vfsinhSC[i]); !alike(sinhSC[i], f) {
-			t.Errorf("Sinh(%g) = %g, want %g", vfsinhSC[i], f, sinhSC[i])
-		}
-	}
-}
-
-func TestSqrt(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := Abs(vf[i])
-		if f := SqrtGo(a); sqrt[i] != f {
-			t.Errorf("SqrtGo(%g) = %g, want %g", a, f, sqrt[i])
-		}
-		a = Abs(vf[i])
-		if f := Sqrt(a); sqrt[i] != f {
-			t.Errorf("Sqrt(%g) = %g, want %g", a, f, sqrt[i])
-		}
-	}
-	for i := 0; i < len(vfsqrtSC); i++ {
-		if f := SqrtGo(vfsqrtSC[i]); !alike(sqrtSC[i], f) {
-			t.Errorf("SqrtGo(%g) = %g, want %g", vfsqrtSC[i], f, sqrtSC[i])
-		}
-		if f := Sqrt(vfsqrtSC[i]); !alike(sqrtSC[i], f) {
-			t.Errorf("Sqrt(%g) = %g, want %g", vfsqrtSC[i], f, sqrtSC[i])
-		}
-	}
-}
-
-func TestTan(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Tan(vf[i]); !veryclose(tan[i], f) {
-			t.Errorf("Tan(%g) = %g, want %g", vf[i], f, tan[i])
-		}
-	}
-	// same special cases as Sin
-	for i := 0; i < len(vfsinSC); i++ {
-		if f := Tan(vfsinSC[i]); !alike(sinSC[i], f) {
-			t.Errorf("Tan(%g) = %g, want %g", vfsinSC[i], f, sinSC[i])
-		}
-	}
-}
-
-func TestTanh(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Tanh(vf[i]); !veryclose(tanh[i], f) {
-			t.Errorf("Tanh(%g) = %g, want %g", vf[i], f, tanh[i])
-		}
-	}
-	for i := 0; i < len(vftanhSC); i++ {
-		if f := Tanh(vftanhSC[i]); !alike(tanhSC[i], f) {
-			t.Errorf("Tanh(%g) = %g, want %g", vftanhSC[i], f, tanhSC[i])
-		}
-	}
-}
-
-func TestTrunc(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		if f := Trunc(vf[i]); trunc[i] != f {
-			t.Errorf("Trunc(%g) = %g, want %g", vf[i], f, trunc[i])
-		}
-	}
-	for i := 0; i < len(vfceilSC); i++ {
-		if f := Trunc(vfceilSC[i]); !alike(ceilSC[i], f) {
-			t.Errorf("Trunc(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i])
-		}
-	}
-}
-
-func TestY0(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := Abs(vf[i])
-		if f := Y0(a); !close(y0[i], f) {
-			t.Errorf("Y0(%g) = %g, want %g", a, f, y0[i])
-		}
-	}
-	for i := 0; i < len(vfy0SC); i++ {
-		if f := Y0(vfy0SC[i]); !alike(y0SC[i], f) {
-			t.Errorf("Y0(%g) = %g, want %g", vfy0SC[i], f, y0SC[i])
-		}
-	}
-}
-
-func TestY1(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := Abs(vf[i])
-		if f := Y1(a); !soclose(y1[i], f, 2e-14) {
-			t.Errorf("Y1(%g) = %g, want %g", a, f, y1[i])
-		}
-	}
-	for i := 0; i < len(vfy0SC); i++ {
-		if f := Y1(vfy0SC[i]); !alike(y1SC[i], f) {
-			t.Errorf("Y1(%g) = %g, want %g", vfy0SC[i], f, y1SC[i])
-		}
-	}
-}
-
-func TestYn(t *testing.T) {
-	for i := 0; i < len(vf); i++ {
-		a := Abs(vf[i])
-		if f := Yn(2, a); !close(y2[i], f) {
-			t.Errorf("Yn(2, %g) = %g, want %g", a, f, y2[i])
-		}
-		if f := Yn(-3, a); !close(yM3[i], f) {
-			t.Errorf("Yn(-3, %g) = %g, want %g", a, f, yM3[i])
-		}
-	}
-	for i := 0; i < len(vfy0SC); i++ {
-		if f := Yn(2, vfy0SC[i]); !alike(y2SC[i], f) {
-			t.Errorf("Yn(2, %g) = %g, want %g", vfy0SC[i], f, y2SC[i])
-		}
-		if f := Yn(-3, vfy0SC[i]); !alike(yM3SC[i], f) {
-			t.Errorf("Yn(-3, %g) = %g, want %g", vfy0SC[i], f, yM3SC[i])
-		}
-	}
-}
-
-// Check that math functions of high angle values
-// return accurate results. [Since (vf[i] + large) - large != vf[i],
-// testing for Trig(vf[i] + large) == Trig(vf[i]), where large is
-// a multiple of 2*Pi, is misleading.]
-func TestLargeCos(t *testing.T) {
-	large := float64(100000 * Pi)
-	for i := 0; i < len(vf); i++ {
-		f1 := cosLarge[i]
-		f2 := Cos(vf[i] + large)
-		if !close(f1, f2) {
-			t.Errorf("Cos(%g) = %g, want %g", vf[i]+large, f2, f1)
-		}
-	}
-}
-
-func TestLargeSin(t *testing.T) {
-	large := float64(100000 * Pi)
-	for i := 0; i < len(vf); i++ {
-		f1 := sinLarge[i]
-		f2 := Sin(vf[i] + large)
-		if !close(f1, f2) {
-			t.Errorf("Sin(%g) = %g, want %g", vf[i]+large, f2, f1)
-		}
-	}
-}
-
-func TestLargeSincos(t *testing.T) {
-	large := float64(100000 * Pi)
-	for i := 0; i < len(vf); i++ {
-		f1, g1 := sinLarge[i], cosLarge[i]
-		f2, g2 := Sincos(vf[i] + large)
-		if !close(f1, f2) || !close(g1, g2) {
-			t.Errorf("Sincos(%g) = %g, %g, want %g, %g", vf[i]+large, f2, g2, f1, g1)
-		}
-	}
-}
-
-func TestLargeTan(t *testing.T) {
-	large := float64(100000 * Pi)
-	for i := 0; i < len(vf); i++ {
-		f1 := tanLarge[i]
-		f2 := Tan(vf[i] + large)
-		if !close(f1, f2) {
-			t.Errorf("Tan(%g) = %g, want %g", vf[i]+large, f2, f1)
-		}
-	}
-}
-
-// Check that math constants are accepted by compiler
-// and have right value (assumes strconv.ParseFloat works).
-// https://golang.org/issue/201
-
-type floatTest struct {
-	val  interface{}
-	name string
-	str  string
-}
-
-var floatTests = []floatTest{
-	{float64(MaxFloat64), "MaxFloat64", "1.7976931348623157e+308"},
-	{float64(SmallestNonzeroFloat64), "SmallestNonzeroFloat64", "5e-324"},
-	{float32(MaxFloat32), "MaxFloat32", "3.4028235e+38"},
-	{float32(SmallestNonzeroFloat32), "SmallestNonzeroFloat32", "1e-45"},
-}
-
-func TestFloatMinMax(t *testing.T) {
-	for _, tt := range floatTests {
-		s := fmt.Sprint(tt.val)
-		if s != tt.str {
-			t.Errorf("Sprint(%v) = %s, want %s", tt.name, s, tt.str)
-		}
-	}
-}
-
-// Benchmarks
-
-func BenchmarkAcos(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Acos(.5)
-	}
-}
-
-func BenchmarkAcosh(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Acosh(1.5)
-	}
-}
-
-func BenchmarkAsin(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Asin(.5)
-	}
-}
-
-func BenchmarkAsinh(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Asinh(.5)
-	}
-}
-
-func BenchmarkAtan(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Atan(.5)
-	}
-}
-
-func BenchmarkAtanh(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Atanh(.5)
-	}
-}
-
-func BenchmarkAtan2(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Atan2(.5, 1)
-	}
-}
-
-func BenchmarkCbrt(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Cbrt(10)
-	}
-}
-
-func BenchmarkCeil(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Ceil(.5)
-	}
-}
-
-func BenchmarkCopysign(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Copysign(.5, -1)
-	}
-}
-
-func BenchmarkCos(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Cos(.5)
-	}
-}
-
-func BenchmarkCosh(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Cosh(2.5)
-	}
-}
-
-func BenchmarkErf(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Erf(.5)
-	}
-}
-
-func BenchmarkErfc(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Erfc(.5)
-	}
-}
-
-func BenchmarkExp(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Exp(.5)
-	}
-}
-
-func BenchmarkExpGo(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ExpGo(.5)
-	}
-}
-
-func BenchmarkExpm1(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Expm1(.5)
-	}
-}
-
-func BenchmarkExp2(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Exp2(.5)
-	}
-}
-
-func BenchmarkExp2Go(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Exp2Go(.5)
-	}
-}
-
-func BenchmarkAbs(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Abs(.5)
-	}
-}
-
-func BenchmarkDim(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Dim(10, 3)
-	}
-}
-
-func BenchmarkFloor(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Floor(.5)
-	}
-}
-
-func BenchmarkMax(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Max(10, 3)
-	}
-}
-
-func BenchmarkMin(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Min(10, 3)
-	}
-}
-
-func BenchmarkMod(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Mod(10, 3)
-	}
-}
-
-func BenchmarkFrexp(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Frexp(8)
-	}
-}
-
-func BenchmarkGamma(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Gamma(2.5)
-	}
-}
-
-func BenchmarkHypot(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Hypot(3, 4)
-	}
-}
-
-func BenchmarkHypotGo(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		HypotGo(3, 4)
-	}
-}
-
-func BenchmarkIlogb(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Ilogb(.5)
-	}
-}
-
-func BenchmarkJ0(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		J0(2.5)
-	}
-}
-
-func BenchmarkJ1(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		J1(2.5)
-	}
-}
-
-func BenchmarkJn(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Jn(2, 2.5)
-	}
-}
-
-func BenchmarkLdexp(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Ldexp(.5, 2)
-	}
-}
-
-func BenchmarkLgamma(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Lgamma(2.5)
-	}
-}
-
-func BenchmarkLog(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Log(.5)
-	}
-}
-
-func BenchmarkLogb(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Logb(.5)
-	}
-}
-
-func BenchmarkLog1p(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Log1p(.5)
-	}
-}
-
-func BenchmarkLog10(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Log10(.5)
-	}
-}
-
-func BenchmarkLog2(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Log2(.5)
-	}
-}
-
-func BenchmarkModf(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Modf(1.5)
-	}
-}
-
-func BenchmarkNextafter32(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Nextafter32(.5, 1)
-	}
-}
-
-func BenchmarkNextafter64(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Nextafter(.5, 1)
-	}
-}
-
-func BenchmarkPowInt(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Pow(2, 2)
-	}
-}
-
-func BenchmarkPowFrac(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Pow(2.5, 1.5)
-	}
-}
-
-func BenchmarkPow10Pos(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Pow10(300)
-	}
-}
-
-func BenchmarkPow10Neg(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Pow10(-300)
-	}
-}
-
-func BenchmarkRemainder(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Remainder(10, 3)
-	}
-}
-
-func BenchmarkSignbit(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Signbit(2.5)
-	}
-}
-
-func BenchmarkSin(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Sin(.5)
-	}
-}
-
-func BenchmarkSincos(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Sincos(.5)
-	}
-}
-
-func BenchmarkSinh(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Sinh(2.5)
-	}
-}
-
-var Global float64
-
-func BenchmarkSqrt(b *testing.B) {
-	x, y := 0.0, 10.0
-	for i := 0; i < b.N; i++ {
-		x += Sqrt(y)
-	}
-	Global = x
-}
-
-func BenchmarkSqrtIndirect(b *testing.B) {
-	x, y := 0.0, 10.0
-	f := Sqrt
-	for i := 0; i < b.N; i++ {
-		x += f(y)
-	}
-	Global = x
-}
-
-func BenchmarkSqrtGo(b *testing.B) {
-	x, y := 0.0, 10.0
-	for i := 0; i < b.N; i++ {
-		x += SqrtGo(y)
-	}
-	Global = x
-}
-
-func isPrime(i int) bool {
-	// Yes, this is a dumb way to write this code,
-	// but calling Sqrt repeatedly in this way demonstrates
-	// the benefit of using a direct SQRT instruction on systems
-	// that have one, whereas the obvious loop seems not to
-	// demonstrate such a benefit.
-	for j := 2; float64(j) <= Sqrt(float64(i)); j++ {
-		if i%j == 0 {
-			return false
-		}
-	}
-	return true
-}
-
-func BenchmarkSqrtPrime(b *testing.B) {
-	any := false
-	for i := 0; i < b.N; i++ {
-		if isPrime(100003) {
-			any = true
-		}
-	}
-	if any {
-		Global = 1
-	}
-}
-
-func BenchmarkTan(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Tan(.5)
-	}
-}
-
-func BenchmarkTanh(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Tanh(2.5)
-	}
-}
-func BenchmarkTrunc(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Trunc(.5)
-	}
-}
-
-func BenchmarkY0(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Y0(2.5)
-	}
-}
-
-func BenchmarkY1(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Y1(2.5)
-	}
-}
-
-func BenchmarkYn(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Yn(2, 2.5)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/asin.go b/third_party/gofrontend/libgo/go/math/asin.go
deleted file mode 100644
index 46a5fe9..0000000
--- a/third_party/gofrontend/libgo/go/math/asin.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-/*
-	Floating-point arcsine and arccosine.
-
-	They are implemented by computing the arctangent
-	after appropriate range reduction.
-*/
-
-// Asin returns the arcsine, in radians, of x.
-//
-// Special cases are:
-//	Asin(±0) = ±0
-//	Asin(x) = NaN if x < -1 or x > 1
-
-//extern asin
-func libc_asin(float64) float64
-
-func Asin(x float64) float64 {
-	return libc_asin(x)
-}
-
-func asin(x float64) float64 {
-	if x == 0 {
-		return x // special case
-	}
-	sign := false
-	if x < 0 {
-		x = -x
-		sign = true
-	}
-	if x > 1 {
-		return NaN() // special case
-	}
-
-	temp := Sqrt(1 - x*x)
-	if x > 0.7 {
-		temp = Pi/2 - satan(temp/x)
-	} else {
-		temp = satan(x / temp)
-	}
-
-	if sign {
-		temp = -temp
-	}
-	return temp
-}
-
-// Acos returns the arccosine, in radians, of x.
-//
-// Special case is:
-//	Acos(x) = NaN if x < -1 or x > 1
-
-//extern acos
-func libc_acos(float64) float64
-
-func Acos(x float64) float64 {
-	return libc_acos(x)
-}
-
-func acos(x float64) float64 {
-	return Pi/2 - Asin(x)
-}
diff --git a/third_party/gofrontend/libgo/go/math/asinh.go b/third_party/gofrontend/libgo/go/math/asinh.go
deleted file mode 100644
index ff2de02..0000000
--- a/third_party/gofrontend/libgo/go/math/asinh.go
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// The original C code, the long comment, and the constants
-// below are from FreeBSD's /usr/src/lib/msun/src/s_asinh.c
-// and came with this notice.  The go code is a simplified
-// version of the original C.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunPro, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-//
-// asinh(x)
-// Method :
-//	Based on
-//	        asinh(x) = sign(x) * log [ |x| + sqrt(x*x+1) ]
-//	we have
-//	asinh(x) := x  if  1+x*x=1,
-//	         := sign(x)*(log(x)+ln2)) for large |x|, else
-//	         := sign(x)*log(2|x|+1/(|x|+sqrt(x*x+1))) if|x|>2, else
-//	         := sign(x)*log1p(|x| + x**2/(1 + sqrt(1+x**2)))
-//
-
-// Asinh returns the inverse hyperbolic sine of x.
-//
-// Special cases are:
-//	Asinh(±0) = ±0
-//	Asinh(±Inf) = ±Inf
-//	Asinh(NaN) = NaN
-func Asinh(x float64) float64 {
-	const (
-		Ln2      = 6.93147180559945286227e-01 // 0x3FE62E42FEFA39EF
-		NearZero = 1.0 / (1 << 28)            // 2**-28
-		Large    = 1 << 28                    // 2**28
-	)
-	// special cases
-	if IsNaN(x) || IsInf(x, 0) {
-		return x
-	}
-	sign := false
-	if x < 0 {
-		x = -x
-		sign = true
-	}
-	var temp float64
-	switch {
-	case x > Large:
-		temp = Log(x) + Ln2 // |x| > 2**28
-	case x > 2:
-		temp = Log(2*x + 1/(Sqrt(x*x+1)+x)) // 2**28 > |x| > 2.0
-	case x < NearZero:
-		temp = x // |x| < 2**-28
-	default:
-		temp = Log1p(x + x*x/(1+Sqrt(1+x*x))) // 2.0 > |x| > 2**-28
-	}
-	if sign {
-		temp = -temp
-	}
-	return temp
-}
diff --git a/third_party/gofrontend/libgo/go/math/atan.go b/third_party/gofrontend/libgo/go/math/atan.go
deleted file mode 100644
index d942bce..0000000
--- a/third_party/gofrontend/libgo/go/math/atan.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-/*
-	Floating-point arctangent.
-*/
-
-// The original C code, the long comment, and the constants below were
-// from http://netlib.sandia.gov/cephes/cmath/atan.c, available from
-// http://www.netlib.org/cephes/cmath.tgz.
-// The go code is a version of the original C.
-//
-// atan.c
-// Inverse circular tangent (arctangent)
-//
-// SYNOPSIS:
-// double x, y, atan();
-// y = atan( x );
-//
-// DESCRIPTION:
-// Returns radian angle between -pi/2 and +pi/2 whose tangent is x.
-//
-// Range reduction is from three intervals into the interval from zero to 0.66.
-// The approximant uses a rational function of degree 4/5 of the form
-// x + x**3 P(x)/Q(x).
-//
-// ACCURACY:
-//                      Relative error:
-// arithmetic   domain    # trials  peak     rms
-//    DEC       -10, 10   50000     2.4e-17  8.3e-18
-//    IEEE      -10, 10   10^6      1.8e-16  5.0e-17
-//
-// Cephes Math Library Release 2.8:  June, 2000
-// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
-//
-// The readme file at http://netlib.sandia.gov/cephes/ says:
-//    Some software in this archive may be from the book _Methods and
-// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
-// International, 1989) or from the Cephes Mathematical Library, a
-// commercial product. In either event, it is copyrighted by the author.
-// What you see here may be used freely but it comes with no support or
-// guarantee.
-//
-//   The two known misprints in the book are repaired here in the
-// source listings for the gamma function and the incomplete beta
-// integral.
-//
-//   Stephen L. Moshier
-//   moshier@na-net.ornl.gov
-
-// xatan evaluates a series valid in the range [0, 0.66].
-func xatan(x float64) float64 {
-	const (
-		P0 = -8.750608600031904122785e-01
-		P1 = -1.615753718733365076637e+01
-		P2 = -7.500855792314704667340e+01
-		P3 = -1.228866684490136173410e+02
-		P4 = -6.485021904942025371773e+01
-		Q0 = +2.485846490142306297962e+01
-		Q1 = +1.650270098316988542046e+02
-		Q2 = +4.328810604912902668951e+02
-		Q3 = +4.853903996359136964868e+02
-		Q4 = +1.945506571482613964425e+02
-	)
-	z := x * x
-	z = z * ((((P0*z+P1)*z+P2)*z+P3)*z + P4) / (((((z+Q0)*z+Q1)*z+Q2)*z+Q3)*z + Q4)
-	z = x*z + x
-	return z
-}
-
-// satan reduces its argument (known to be positive)
-// to the range [0, 0.66] and calls xatan.
-func satan(x float64) float64 {
-	const (
-		Morebits = 6.123233995736765886130e-17 // pi/2 = PIO2 + Morebits
-		Tan3pio8 = 2.41421356237309504880      // tan(3*pi/8)
-	)
-	if x <= 0.66 {
-		return xatan(x)
-	}
-	if x > Tan3pio8 {
-		return Pi/2 - xatan(1/x) + Morebits
-	}
-	return Pi/4 + xatan((x-1)/(x+1)) + 0.5*Morebits
-}
-
-// Atan returns the arctangent, in radians, of x.
-//
-// Special cases are:
-//	Atan(±0) = ±0
-//	Atan(±Inf) = ±Pi/2
-
-//extern atan
-func libc_atan(float64) float64
-
-func Atan(x float64) float64 {
-	return libc_atan(x)
-}
-
-func atan(x float64) float64 {
-	if x == 0 {
-		return x
-	}
-	if x > 0 {
-		return satan(x)
-	}
-	return -satan(-x)
-}
diff --git a/third_party/gofrontend/libgo/go/math/atan2.go b/third_party/gofrontend/libgo/go/math/atan2.go
deleted file mode 100644
index 48ed9a9..0000000
--- a/third_party/gofrontend/libgo/go/math/atan2.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Atan2 returns the arc tangent of y/x, using
-// the signs of the two to determine the quadrant
-// of the return value.
-//
-// Special cases are (in order):
-//	Atan2(y, NaN) = NaN
-//	Atan2(NaN, x) = NaN
-//	Atan2(+0, x>=0) = +0
-//	Atan2(-0, x>=0) = -0
-//	Atan2(+0, x<=-0) = +Pi
-//	Atan2(-0, x<=-0) = -Pi
-//	Atan2(y>0, 0) = +Pi/2
-//	Atan2(y<0, 0) = -Pi/2
-//	Atan2(+Inf, +Inf) = +Pi/4
-//	Atan2(-Inf, +Inf) = -Pi/4
-//	Atan2(+Inf, -Inf) = 3Pi/4
-//	Atan2(-Inf, -Inf) = -3Pi/4
-//	Atan2(y, +Inf) = 0
-//	Atan2(y>0, -Inf) = +Pi
-//	Atan2(y<0, -Inf) = -Pi
-//	Atan2(+Inf, x) = +Pi/2
-//	Atan2(-Inf, x) = -Pi/2
-
-//extern atan2
-func libc_atan2(float64, float64) float64
-
-func Atan2(y, x float64) float64 {
-	return libc_atan2(y, x)
-}
-
-func atan2(y, x float64) float64 {
-	// special cases
-	switch {
-	case IsNaN(y) || IsNaN(x):
-		return NaN()
-	case y == 0:
-		if x >= 0 && !Signbit(x) {
-			return Copysign(0, y)
-		}
-		return Copysign(Pi, y)
-	case x == 0:
-		return Copysign(Pi/2, y)
-	case IsInf(x, 0):
-		if IsInf(x, 1) {
-			switch {
-			case IsInf(y, 0):
-				return Copysign(Pi/4, y)
-			default:
-				return Copysign(0, y)
-			}
-		}
-		switch {
-		case IsInf(y, 0):
-			return Copysign(3*Pi/4, y)
-		default:
-			return Copysign(Pi, y)
-		}
-	case IsInf(y, 0):
-		return Copysign(Pi/2, y)
-	}
-
-	// Call atan and determine the quadrant.
-	q := Atan(y / x)
-	if x < 0 {
-		if q <= 0 {
-			return q + Pi
-		}
-		return q - Pi
-	}
-	return q
-}
diff --git a/third_party/gofrontend/libgo/go/math/atanh.go b/third_party/gofrontend/libgo/go/math/atanh.go
deleted file mode 100644
index 113d5c1..0000000
--- a/third_party/gofrontend/libgo/go/math/atanh.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// The original C code, the long comment, and the constants
-// below are from FreeBSD's /usr/src/lib/msun/src/e_atanh.c
-// and came with this notice.  The go code is a simplified
-// version of the original C.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunPro, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-//
-// __ieee754_atanh(x)
-// Method :
-//	1. Reduce x to positive by atanh(-x) = -atanh(x)
-//	2. For x>=0.5
-//	            1              2x                          x
-//	atanh(x) = --- * log(1 + -------) = 0.5 * log1p(2 * --------)
-//	            2             1 - x                      1 - x
-//
-//	For x<0.5
-//	atanh(x) = 0.5*log1p(2x+2x*x/(1-x))
-//
-// Special cases:
-//	atanh(x) is NaN if |x| > 1 with signal;
-//	atanh(NaN) is that NaN with no signal;
-//	atanh(+-1) is +-INF with signal.
-//
-
-// Atanh returns the inverse hyperbolic tangent of x.
-//
-// Special cases are:
-//	Atanh(1) = +Inf
-//	Atanh(±0) = ±0
-//	Atanh(-1) = -Inf
-//	Atanh(x) = NaN if x < -1 or x > 1
-//	Atanh(NaN) = NaN
-func Atanh(x float64) float64 {
-	const NearZero = 1.0 / (1 << 28) // 2**-28
-	// special cases
-	switch {
-	case x < -1 || x > 1 || IsNaN(x):
-		return NaN()
-	case x == 1:
-		return Inf(1)
-	case x == -1:
-		return Inf(-1)
-	}
-	sign := false
-	if x < 0 {
-		x = -x
-		sign = true
-	}
-	var temp float64
-	switch {
-	case x < NearZero:
-		temp = x
-	case x < 0.5:
-		temp = x + x
-		temp = 0.5 * Log1p(temp+temp*x/(1-x))
-	default:
-		temp = 0.5 * Log1p((x+x)/(1-x))
-	}
-	if sign {
-		temp = -temp
-	}
-	return temp
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/accuracy_string.go b/third_party/gofrontend/libgo/go/math/big/accuracy_string.go
deleted file mode 100644
index 24ef7f1..0000000
--- a/third_party/gofrontend/libgo/go/math/big/accuracy_string.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// generated by stringer -type=Accuracy; DO NOT EDIT
-
-package big
-
-import "fmt"
-
-const _Accuracy_name = "BelowExactAbove"
-
-var _Accuracy_index = [...]uint8{0, 5, 10, 15}
-
-func (i Accuracy) String() string {
-	i -= -1
-	if i < 0 || i+1 >= Accuracy(len(_Accuracy_index)) {
-		return fmt.Sprintf("Accuracy(%d)", i+-1)
-	}
-	return _Accuracy_name[_Accuracy_index[i]:_Accuracy_index[i+1]]
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/arith.go b/third_party/gofrontend/libgo/go/math/big/arith.go
deleted file mode 100644
index d7ea838..0000000
--- a/third_party/gofrontend/libgo/go/math/big/arith.go
+++ /dev/null
@@ -1,305 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file provides Go implementations of elementary multi-precision
-// arithmetic operations on word vectors. Needed for platforms without
-// assembly implementations of these routines.
-
-package big
-
-// A Word represents a single digit of a multi-precision unsigned integer.
-type Word uintptr
-
-const (
-	// Compute the size _S of a Word in bytes.
-	_m    = ^Word(0)
-	_logS = _m>>8&1 + _m>>16&1 + _m>>32&1
-	_S    = 1 << _logS
-
-	_W = _S << 3 // word size in bits
-	_B = 1 << _W // digit base
-	_M = _B - 1  // digit mask
-
-	_W2 = _W / 2   // half word size in bits
-	_B2 = 1 << _W2 // half digit base
-	_M2 = _B2 - 1  // half digit mask
-)
-
-// ----------------------------------------------------------------------------
-// Elementary operations on words
-//
-// These operations are used by the vector operations below.
-
-// z1<<_W + z0 = x+y+c, with c == 0 or 1
-func addWW_g(x, y, c Word) (z1, z0 Word) {
-	yc := y + c
-	z0 = x + yc
-	if z0 < x || yc < y {
-		z1 = 1
-	}
-	return
-}
-
-// z1<<_W + z0 = x-y-c, with c == 0 or 1
-func subWW_g(x, y, c Word) (z1, z0 Word) {
-	yc := y + c
-	z0 = x - yc
-	if z0 > x || yc < y {
-		z1 = 1
-	}
-	return
-}
-
-// z1<<_W + z0 = x*y
-// Adapted from Warren, Hacker's Delight, p. 132.
-func mulWW_g(x, y Word) (z1, z0 Word) {
-	x0 := x & _M2
-	x1 := x >> _W2
-	y0 := y & _M2
-	y1 := y >> _W2
-	w0 := x0 * y0
-	t := x1*y0 + w0>>_W2
-	w1 := t & _M2
-	w2 := t >> _W2
-	w1 += x0 * y1
-	z1 = x1*y1 + w2 + w1>>_W2
-	z0 = x * y
-	return
-}
-
-// z1<<_W + z0 = x*y + c
-func mulAddWWW_g(x, y, c Word) (z1, z0 Word) {
-	z1, zz0 := mulWW_g(x, y)
-	if z0 = zz0 + c; z0 < zz0 {
-		z1++
-	}
-	return
-}
-
-// Length of x in bits.
-func bitLen_g(x Word) (n int) {
-	for ; x >= 0x8000; x >>= 16 {
-		n += 16
-	}
-	if x >= 0x80 {
-		x >>= 8
-		n += 8
-	}
-	if x >= 0x8 {
-		x >>= 4
-		n += 4
-	}
-	if x >= 0x2 {
-		x >>= 2
-		n += 2
-	}
-	if x >= 0x1 {
-		n++
-	}
-	return
-}
-
-// log2 computes the integer binary logarithm of x.
-// The result is the integer n for which 2^n <= x < 2^(n+1).
-// If x == 0, the result is -1.
-func log2(x Word) int {
-	return bitLen(x) - 1
-}
-
-// nlz returns the number of leading zeros in x.
-func nlz(x Word) uint {
-	return uint(_W - bitLen(x))
-}
-
-// nlz64 returns the number of leading zeros in x.
-func nlz64(x uint64) uint {
-	switch _W {
-	case 32:
-		w := x >> 32
-		if w == 0 {
-			return 32 + nlz(Word(x))
-		}
-		return nlz(Word(w))
-	case 64:
-		return nlz(Word(x))
-	}
-	panic("unreachable")
-}
-
-// q = (u1<<_W + u0 - r)/y
-// Adapted from Warren, Hacker's Delight, p. 152.
-func divWW_g(u1, u0, v Word) (q, r Word) {
-	if u1 >= v {
-		return 1<<_W - 1, 1<<_W - 1
-	}
-
-	s := nlz(v)
-	v <<= s
-
-	vn1 := v >> _W2
-	vn0 := v & _M2
-	un32 := u1<<s | u0>>(_W-s)
-	un10 := u0 << s
-	un1 := un10 >> _W2
-	un0 := un10 & _M2
-	q1 := un32 / vn1
-	rhat := un32 - q1*vn1
-
-	for q1 >= _B2 || q1*vn0 > _B2*rhat+un1 {
-		q1--
-		rhat += vn1
-		if rhat >= _B2 {
-			break
-		}
-	}
-
-	un21 := un32*_B2 + un1 - q1*v
-	q0 := un21 / vn1
-	rhat = un21 - q0*vn1
-
-	for q0 >= _B2 || q0*vn0 > _B2*rhat+un0 {
-		q0--
-		rhat += vn1
-		if rhat >= _B2 {
-			break
-		}
-	}
-
-	return q1*_B2 + q0, (un21*_B2 + un0 - q0*v) >> s
-}
-
-// Keep for performance debugging.
-// Using addWW_g is likely slower.
-const use_addWW_g = false
-
-// The resulting carry c is either 0 or 1.
-func addVV_g(z, x, y []Word) (c Word) {
-	if use_addWW_g {
-		for i := range z {
-			c, z[i] = addWW_g(x[i], y[i], c)
-		}
-		return
-	}
-
-	for i, xi := range x[:len(z)] {
-		yi := y[i]
-		zi := xi + yi + c
-		z[i] = zi
-		// see "Hacker's Delight", section 2-12 (overflow detection)
-		c = (xi&yi | (xi|yi)&^zi) >> (_W - 1)
-	}
-	return
-}
-
-// The resulting carry c is either 0 or 1.
-func subVV_g(z, x, y []Word) (c Word) {
-	if use_addWW_g {
-		for i := range z {
-			c, z[i] = subWW_g(x[i], y[i], c)
-		}
-		return
-	}
-
-	for i, xi := range x[:len(z)] {
-		yi := y[i]
-		zi := xi - yi - c
-		z[i] = zi
-		// see "Hacker's Delight", section 2-12 (overflow detection)
-		c = (yi&^xi | (yi|^xi)&zi) >> (_W - 1)
-	}
-	return
-}
-
-// The resulting carry c is either 0 or 1.
-func addVW_g(z, x []Word, y Word) (c Word) {
-	if use_addWW_g {
-		c = y
-		for i := range z {
-			c, z[i] = addWW_g(x[i], c, 0)
-		}
-		return
-	}
-
-	c = y
-	for i, xi := range x[:len(z)] {
-		zi := xi + c
-		z[i] = zi
-		c = xi &^ zi >> (_W - 1)
-	}
-	return
-}
-
-func subVW_g(z, x []Word, y Word) (c Word) {
-	if use_addWW_g {
-		c = y
-		for i := range z {
-			c, z[i] = subWW_g(x[i], c, 0)
-		}
-		return
-	}
-
-	c = y
-	for i, xi := range x[:len(z)] {
-		zi := xi - c
-		z[i] = zi
-		c = (zi &^ xi) >> (_W - 1)
-	}
-	return
-}
-
-func shlVU_g(z, x []Word, s uint) (c Word) {
-	if n := len(z); n > 0 {
-		ŝ := _W - s
-		w1 := x[n-1]
-		c = w1 >> ŝ
-		for i := n - 1; i > 0; i-- {
-			w := w1
-			w1 = x[i-1]
-			z[i] = w<<s | w1>>ŝ
-		}
-		z[0] = w1 << s
-	}
-	return
-}
-
-func shrVU_g(z, x []Word, s uint) (c Word) {
-	if n := len(z); n > 0 {
-		ŝ := _W - s
-		w1 := x[0]
-		c = w1 << ŝ
-		for i := 0; i < n-1; i++ {
-			w := w1
-			w1 = x[i+1]
-			z[i] = w>>s | w1<<ŝ
-		}
-		z[n-1] = w1 >> s
-	}
-	return
-}
-
-func mulAddVWW_g(z, x []Word, y, r Word) (c Word) {
-	c = r
-	for i := range z {
-		c, z[i] = mulAddWWW_g(x[i], y, c)
-	}
-	return
-}
-
-// TODO(gri) Remove use of addWW_g here and then we can remove addWW_g and subWW_g.
-func addMulVVW_g(z, x []Word, y Word) (c Word) {
-	for i := range z {
-		z1, z0 := mulAddWWW_g(x[i], y, z[i])
-		c, z[i] = addWW_g(z0, c, 0)
-		c += z1
-	}
-	return
-}
-
-func divWVW_g(z []Word, xn Word, x []Word, y Word) (r Word) {
-	r = xn
-	for i := len(z) - 1; i >= 0; i-- {
-		z[i], r = divWW_g(r, x[i], y)
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/arith_decl.go b/third_party/gofrontend/libgo/go/math/big/arith_decl.go
deleted file mode 100644
index 1707aa4..0000000
--- a/third_party/gofrontend/libgo/go/math/big/arith_decl.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !math_big_pure_go
-
-package big
-
-// implemented in arith_$GOARCH.s
-func mulWW(x, y Word) (z1, z0 Word)
-func divWW(x1, x0, y Word) (q, r Word)
-func addVV(z, x, y []Word) (c Word)
-func subVV(z, x, y []Word) (c Word)
-func addVW(z, x []Word, y Word) (c Word)
-func subVW(z, x []Word, y Word) (c Word)
-func shlVU(z, x []Word, s uint) (c Word)
-func shrVU(z, x []Word, s uint) (c Word)
-func mulAddVWW(z, x []Word, y, r Word) (c Word)
-func addMulVVW(z, x []Word, y Word) (c Word)
-func divWVW(z []Word, xn Word, x []Word, y Word) (r Word)
-func bitLen(x Word) (n int)
diff --git a/third_party/gofrontend/libgo/go/math/big/arith_decl_pure.go b/third_party/gofrontend/libgo/go/math/big/arith_decl_pure.go
deleted file mode 100644
index e760a38..0000000
--- a/third_party/gofrontend/libgo/go/math/big/arith_decl_pure.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build math_big_pure_go
-
-package big
-
-func mulWW(x, y Word) (z1, z0 Word) {
-	return mulWW_g(x, y)
-}
-
-func divWW(x1, x0, y Word) (q, r Word) {
-	return divWW_g(x1, x0, y)
-}
-
-func addVV(z, x, y []Word) (c Word) {
-	return addVV_g(z, x, y)
-}
-
-func subVV(z, x, y []Word) (c Word) {
-	return subVV_g(z, x, y)
-}
-
-func addVW(z, x []Word, y Word) (c Word) {
-	return addVW_g(z, x, y)
-}
-
-func subVW(z, x []Word, y Word) (c Word) {
-	return subVW_g(z, x, y)
-}
-
-func shlVU(z, x []Word, s uint) (c Word) {
-	return shlVU_g(z, x, s)
-}
-
-func shrVU(z, x []Word, s uint) (c Word) {
-	return shrVU_g(z, x, s)
-}
-
-func mulAddVWW(z, x []Word, y, r Word) (c Word) {
-	return mulAddVWW_g(z, x, y, r)
-}
-
-func addMulVVW(z, x []Word, y Word) (c Word) {
-	return addMulVVW_g(z, x, y)
-}
-
-func divWVW(z []Word, xn Word, x []Word, y Word) (r Word) {
-	return divWVW_g(z, xn, x, y)
-}
-
-func bitLen(x Word) (n int) {
-	return bitLen_g(x)
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/arith_test.go b/third_party/gofrontend/libgo/go/math/big/arith_test.go
deleted file mode 100644
index f46a494..0000000
--- a/third_party/gofrontend/libgo/go/math/big/arith_test.go
+++ /dev/null
@@ -1,457 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package big
-
-import (
-	"math/rand"
-	"testing"
-)
-
-type funWW func(x, y, c Word) (z1, z0 Word)
-type argWW struct {
-	x, y, c, z1, z0 Word
-}
-
-var sumWW = []argWW{
-	{0, 0, 0, 0, 0},
-	{0, 1, 0, 0, 1},
-	{0, 0, 1, 0, 1},
-	{0, 1, 1, 0, 2},
-	{12345, 67890, 0, 0, 80235},
-	{12345, 67890, 1, 0, 80236},
-	{_M, 1, 0, 1, 0},
-	{_M, 0, 1, 1, 0},
-	{_M, 1, 1, 1, 1},
-	{_M, _M, 0, 1, _M - 1},
-	{_M, _M, 1, 1, _M},
-}
-
-func testFunWW(t *testing.T, msg string, f funWW, a argWW) {
-	z1, z0 := f(a.x, a.y, a.c)
-	if z1 != a.z1 || z0 != a.z0 {
-		t.Errorf("%s%+v\n\tgot z1:z0 = %#x:%#x; want %#x:%#x", msg, a, z1, z0, a.z1, a.z0)
-	}
-}
-
-func TestFunWW(t *testing.T) {
-	for _, a := range sumWW {
-		arg := a
-		testFunWW(t, "addWW_g", addWW_g, arg)
-
-		arg = argWW{a.y, a.x, a.c, a.z1, a.z0}
-		testFunWW(t, "addWW_g symmetric", addWW_g, arg)
-
-		arg = argWW{a.z0, a.x, a.c, a.z1, a.y}
-		testFunWW(t, "subWW_g", subWW_g, arg)
-
-		arg = argWW{a.z0, a.y, a.c, a.z1, a.x}
-		testFunWW(t, "subWW_g symmetric", subWW_g, arg)
-	}
-}
-
-type funVV func(z, x, y []Word) (c Word)
-type argVV struct {
-	z, x, y nat
-	c       Word
-}
-
-var sumVV = []argVV{
-	{},
-	{nat{0}, nat{0}, nat{0}, 0},
-	{nat{1}, nat{1}, nat{0}, 0},
-	{nat{0}, nat{_M}, nat{1}, 1},
-	{nat{80235}, nat{12345}, nat{67890}, 0},
-	{nat{_M - 1}, nat{_M}, nat{_M}, 1},
-	{nat{0, 0, 0, 0}, nat{_M, _M, _M, _M}, nat{1, 0, 0, 0}, 1},
-	{nat{0, 0, 0, _M}, nat{_M, _M, _M, _M - 1}, nat{1, 0, 0, 0}, 0},
-	{nat{0, 0, 0, 0}, nat{_M, 0, _M, 0}, nat{1, _M, 0, _M}, 1},
-}
-
-func testFunVV(t *testing.T, msg string, f funVV, a argVV) {
-	z := make(nat, len(a.z))
-	c := f(z, a.x, a.y)
-	for i, zi := range z {
-		if zi != a.z[i] {
-			t.Errorf("%s%+v\n\tgot z[%d] = %#x; want %#x", msg, a, i, zi, a.z[i])
-			break
-		}
-	}
-	if c != a.c {
-		t.Errorf("%s%+v\n\tgot c = %#x; want %#x", msg, a, c, a.c)
-	}
-}
-
-func TestFunVV(t *testing.T) {
-	for _, a := range sumVV {
-		arg := a
-		testFunVV(t, "addVV_g", addVV_g, arg)
-		testFunVV(t, "addVV", addVV, arg)
-
-		arg = argVV{a.z, a.y, a.x, a.c}
-		testFunVV(t, "addVV_g symmetric", addVV_g, arg)
-		testFunVV(t, "addVV symmetric", addVV, arg)
-
-		arg = argVV{a.x, a.z, a.y, a.c}
-		testFunVV(t, "subVV_g", subVV_g, arg)
-		testFunVV(t, "subVV", subVV, arg)
-
-		arg = argVV{a.y, a.z, a.x, a.c}
-		testFunVV(t, "subVV_g symmetric", subVV_g, arg)
-		testFunVV(t, "subVV symmetric", subVV, arg)
-	}
-}
-
-// Always the same seed for reproducible results.
-var rnd = rand.New(rand.NewSource(0))
-
-func rndW() Word {
-	return Word(rnd.Int63()<<1 | rnd.Int63n(2))
-}
-
-func rndV(n int) []Word {
-	v := make([]Word, n)
-	for i := range v {
-		v[i] = rndW()
-	}
-	return v
-}
-
-func benchmarkFunVV(b *testing.B, f funVV, n int) {
-	x := rndV(n)
-	y := rndV(n)
-	z := make([]Word, n)
-	b.SetBytes(int64(n * _W))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		f(z, x, y)
-	}
-}
-
-func BenchmarkAddVV_1(b *testing.B)   { benchmarkFunVV(b, addVV, 1) }
-func BenchmarkAddVV_2(b *testing.B)   { benchmarkFunVV(b, addVV, 2) }
-func BenchmarkAddVV_3(b *testing.B)   { benchmarkFunVV(b, addVV, 3) }
-func BenchmarkAddVV_4(b *testing.B)   { benchmarkFunVV(b, addVV, 4) }
-func BenchmarkAddVV_5(b *testing.B)   { benchmarkFunVV(b, addVV, 5) }
-func BenchmarkAddVV_1e1(b *testing.B) { benchmarkFunVV(b, addVV, 1e1) }
-func BenchmarkAddVV_1e2(b *testing.B) { benchmarkFunVV(b, addVV, 1e2) }
-func BenchmarkAddVV_1e3(b *testing.B) { benchmarkFunVV(b, addVV, 1e3) }
-func BenchmarkAddVV_1e4(b *testing.B) { benchmarkFunVV(b, addVV, 1e4) }
-func BenchmarkAddVV_1e5(b *testing.B) { benchmarkFunVV(b, addVV, 1e5) }
-
-type funVW func(z, x []Word, y Word) (c Word)
-type argVW struct {
-	z, x nat
-	y    Word
-	c    Word
-}
-
-var sumVW = []argVW{
-	{},
-	{nil, nil, 2, 2},
-	{nat{0}, nat{0}, 0, 0},
-	{nat{1}, nat{0}, 1, 0},
-	{nat{1}, nat{1}, 0, 0},
-	{nat{0}, nat{_M}, 1, 1},
-	{nat{0, 0, 0, 0}, nat{_M, _M, _M, _M}, 1, 1},
-	{nat{585}, nat{314}, 271, 0},
-}
-
-var prodVW = []argVW{
-	{},
-	{nat{0}, nat{0}, 0, 0},
-	{nat{0}, nat{_M}, 0, 0},
-	{nat{0}, nat{0}, _M, 0},
-	{nat{1}, nat{1}, 1, 0},
-	{nat{22793}, nat{991}, 23, 0},
-	{nat{0, 0, 0, 22793}, nat{0, 0, 0, 991}, 23, 0},
-	{nat{0, 0, 0, 0}, nat{7893475, 7395495, 798547395, 68943}, 0, 0},
-	{nat{0, 0, 0, 0}, nat{0, 0, 0, 0}, 894375984, 0},
-	{nat{_M << 1 & _M}, nat{_M}, 1 << 1, _M >> (_W - 1)},
-	{nat{_M << 7 & _M}, nat{_M}, 1 << 7, _M >> (_W - 7)},
-	{nat{_M << 7 & _M, _M, _M, _M}, nat{_M, _M, _M, _M}, 1 << 7, _M >> (_W - 7)},
-}
-
-var lshVW = []argVW{
-	{},
-	{nat{0}, nat{0}, 0, 0},
-	{nat{0}, nat{0}, 1, 0},
-	{nat{0}, nat{0}, 20, 0},
-
-	{nat{_M}, nat{_M}, 0, 0},
-	{nat{_M << 1 & _M}, nat{_M}, 1, 1},
-	{nat{_M << 20 & _M}, nat{_M}, 20, _M >> (_W - 20)},
-
-	{nat{_M, _M, _M}, nat{_M, _M, _M}, 0, 0},
-	{nat{_M << 1 & _M, _M, _M}, nat{_M, _M, _M}, 1, 1},
-	{nat{_M << 20 & _M, _M, _M}, nat{_M, _M, _M}, 20, _M >> (_W - 20)},
-}
-
-var rshVW = []argVW{
-	{},
-	{nat{0}, nat{0}, 0, 0},
-	{nat{0}, nat{0}, 1, 0},
-	{nat{0}, nat{0}, 20, 0},
-
-	{nat{_M}, nat{_M}, 0, 0},
-	{nat{_M >> 1}, nat{_M}, 1, _M << (_W - 1) & _M},
-	{nat{_M >> 20}, nat{_M}, 20, _M << (_W - 20) & _M},
-
-	{nat{_M, _M, _M}, nat{_M, _M, _M}, 0, 0},
-	{nat{_M, _M, _M >> 1}, nat{_M, _M, _M}, 1, _M << (_W - 1) & _M},
-	{nat{_M, _M, _M >> 20}, nat{_M, _M, _M}, 20, _M << (_W - 20) & _M},
-}
-
-func testFunVW(t *testing.T, msg string, f funVW, a argVW) {
-	z := make(nat, len(a.z))
-	c := f(z, a.x, a.y)
-	for i, zi := range z {
-		if zi != a.z[i] {
-			t.Errorf("%s%+v\n\tgot z[%d] = %#x; want %#x", msg, a, i, zi, a.z[i])
-			break
-		}
-	}
-	if c != a.c {
-		t.Errorf("%s%+v\n\tgot c = %#x; want %#x", msg, a, c, a.c)
-	}
-}
-
-func makeFunVW(f func(z, x []Word, s uint) (c Word)) funVW {
-	return func(z, x []Word, s Word) (c Word) {
-		return f(z, x, uint(s))
-	}
-}
-
-func TestFunVW(t *testing.T) {
-	for _, a := range sumVW {
-		arg := a
-		testFunVW(t, "addVW_g", addVW_g, arg)
-		testFunVW(t, "addVW", addVW, arg)
-
-		arg = argVW{a.x, a.z, a.y, a.c}
-		testFunVW(t, "subVW_g", subVW_g, arg)
-		testFunVW(t, "subVW", subVW, arg)
-	}
-
-	shlVW_g := makeFunVW(shlVU_g)
-	shlVW := makeFunVW(shlVU)
-	for _, a := range lshVW {
-		arg := a
-		testFunVW(t, "shlVU_g", shlVW_g, arg)
-		testFunVW(t, "shlVU", shlVW, arg)
-	}
-
-	shrVW_g := makeFunVW(shrVU_g)
-	shrVW := makeFunVW(shrVU)
-	for _, a := range rshVW {
-		arg := a
-		testFunVW(t, "shrVU_g", shrVW_g, arg)
-		testFunVW(t, "shrVU", shrVW, arg)
-	}
-}
-
-func benchmarkFunVW(b *testing.B, f funVW, n int) {
-	x := rndV(n)
-	y := rndW()
-	z := make([]Word, n)
-	b.SetBytes(int64(n * _S))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		f(z, x, y)
-	}
-}
-
-func BenchmarkAddVW_1(b *testing.B)   { benchmarkFunVW(b, addVW, 1) }
-func BenchmarkAddVW_2(b *testing.B)   { benchmarkFunVW(b, addVW, 2) }
-func BenchmarkAddVW_3(b *testing.B)   { benchmarkFunVW(b, addVW, 3) }
-func BenchmarkAddVW_4(b *testing.B)   { benchmarkFunVW(b, addVW, 4) }
-func BenchmarkAddVW_5(b *testing.B)   { benchmarkFunVW(b, addVW, 5) }
-func BenchmarkAddVW_1e1(b *testing.B) { benchmarkFunVW(b, addVW, 1e1) }
-func BenchmarkAddVW_1e2(b *testing.B) { benchmarkFunVW(b, addVW, 1e2) }
-func BenchmarkAddVW_1e3(b *testing.B) { benchmarkFunVW(b, addVW, 1e3) }
-func BenchmarkAddVW_1e4(b *testing.B) { benchmarkFunVW(b, addVW, 1e4) }
-func BenchmarkAddVW_1e5(b *testing.B) { benchmarkFunVW(b, addVW, 1e5) }
-
-type funVWW func(z, x []Word, y, r Word) (c Word)
-type argVWW struct {
-	z, x nat
-	y, r Word
-	c    Word
-}
-
-var prodVWW = []argVWW{
-	{},
-	{nat{0}, nat{0}, 0, 0, 0},
-	{nat{991}, nat{0}, 0, 991, 0},
-	{nat{0}, nat{_M}, 0, 0, 0},
-	{nat{991}, nat{_M}, 0, 991, 0},
-	{nat{0}, nat{0}, _M, 0, 0},
-	{nat{991}, nat{0}, _M, 991, 0},
-	{nat{1}, nat{1}, 1, 0, 0},
-	{nat{992}, nat{1}, 1, 991, 0},
-	{nat{22793}, nat{991}, 23, 0, 0},
-	{nat{22800}, nat{991}, 23, 7, 0},
-	{nat{0, 0, 0, 22793}, nat{0, 0, 0, 991}, 23, 0, 0},
-	{nat{7, 0, 0, 22793}, nat{0, 0, 0, 991}, 23, 7, 0},
-	{nat{0, 0, 0, 0}, nat{7893475, 7395495, 798547395, 68943}, 0, 0, 0},
-	{nat{991, 0, 0, 0}, nat{7893475, 7395495, 798547395, 68943}, 0, 991, 0},
-	{nat{0, 0, 0, 0}, nat{0, 0, 0, 0}, 894375984, 0, 0},
-	{nat{991, 0, 0, 0}, nat{0, 0, 0, 0}, 894375984, 991, 0},
-	{nat{_M << 1 & _M}, nat{_M}, 1 << 1, 0, _M >> (_W - 1)},
-	{nat{_M<<1&_M + 1}, nat{_M}, 1 << 1, 1, _M >> (_W - 1)},
-	{nat{_M << 7 & _M}, nat{_M}, 1 << 7, 0, _M >> (_W - 7)},
-	{nat{_M<<7&_M + 1<<6}, nat{_M}, 1 << 7, 1 << 6, _M >> (_W - 7)},
-	{nat{_M << 7 & _M, _M, _M, _M}, nat{_M, _M, _M, _M}, 1 << 7, 0, _M >> (_W - 7)},
-	{nat{_M<<7&_M + 1<<6, _M, _M, _M}, nat{_M, _M, _M, _M}, 1 << 7, 1 << 6, _M >> (_W - 7)},
-}
-
-func testFunVWW(t *testing.T, msg string, f funVWW, a argVWW) {
-	z := make(nat, len(a.z))
-	c := f(z, a.x, a.y, a.r)
-	for i, zi := range z {
-		if zi != a.z[i] {
-			t.Errorf("%s%+v\n\tgot z[%d] = %#x; want %#x", msg, a, i, zi, a.z[i])
-			break
-		}
-	}
-	if c != a.c {
-		t.Errorf("%s%+v\n\tgot c = %#x; want %#x", msg, a, c, a.c)
-	}
-}
-
-// TODO(gri) mulAddVWW and divWVW are symmetric operations but
-//           their signature is not symmetric. Try to unify.
-
-type funWVW func(z []Word, xn Word, x []Word, y Word) (r Word)
-type argWVW struct {
-	z  nat
-	xn Word
-	x  nat
-	y  Word
-	r  Word
-}
-
-func testFunWVW(t *testing.T, msg string, f funWVW, a argWVW) {
-	z := make(nat, len(a.z))
-	r := f(z, a.xn, a.x, a.y)
-	for i, zi := range z {
-		if zi != a.z[i] {
-			t.Errorf("%s%+v\n\tgot z[%d] = %#x; want %#x", msg, a, i, zi, a.z[i])
-			break
-		}
-	}
-	if r != a.r {
-		t.Errorf("%s%+v\n\tgot r = %#x; want %#x", msg, a, r, a.r)
-	}
-}
-
-func TestFunVWW(t *testing.T) {
-	for _, a := range prodVWW {
-		arg := a
-		testFunVWW(t, "mulAddVWW_g", mulAddVWW_g, arg)
-		testFunVWW(t, "mulAddVWW", mulAddVWW, arg)
-
-		if a.y != 0 && a.r < a.y {
-			arg := argWVW{a.x, a.c, a.z, a.y, a.r}
-			testFunWVW(t, "divWVW_g", divWVW_g, arg)
-			testFunWVW(t, "divWVW", divWVW, arg)
-		}
-	}
-}
-
-var mulWWTests = []struct {
-	x, y Word
-	q, r Word
-}{
-	{_M, _M, _M - 1, 1},
-	// 32 bit only: {0xc47dfa8c, 50911, 0x98a4, 0x998587f4},
-}
-
-func TestMulWW(t *testing.T) {
-	for i, test := range mulWWTests {
-		q, r := mulWW_g(test.x, test.y)
-		if q != test.q || r != test.r {
-			t.Errorf("#%d got (%x, %x) want (%x, %x)", i, q, r, test.q, test.r)
-		}
-	}
-}
-
-var mulAddWWWTests = []struct {
-	x, y, c Word
-	q, r    Word
-}{
-	// TODO(agl): These will only work on 64-bit platforms.
-	// {15064310297182388543, 0xe7df04d2d35d5d80, 13537600649892366549, 13644450054494335067, 10832252001440893781},
-	// {15064310297182388543, 0xdab2f18048baa68d, 13644450054494335067, 12869334219691522700, 14233854684711418382},
-	{_M, _M, 0, _M - 1, 1},
-	{_M, _M, _M, _M, 0},
-}
-
-func TestMulAddWWW(t *testing.T) {
-	for i, test := range mulAddWWWTests {
-		q, r := mulAddWWW_g(test.x, test.y, test.c)
-		if q != test.q || r != test.r {
-			t.Errorf("#%d got (%x, %x) want (%x, %x)", i, q, r, test.q, test.r)
-		}
-	}
-}
-
-func benchmarkAddMulVVW(b *testing.B, n int) {
-	x := rndV(n)
-	y := rndW()
-	z := make([]Word, n)
-	b.SetBytes(int64(n * _W))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		addMulVVW(z, x, y)
-	}
-}
-
-func BenchmarkAddMulVVW_1(b *testing.B)   { benchmarkAddMulVVW(b, 1) }
-func BenchmarkAddMulVVW_2(b *testing.B)   { benchmarkAddMulVVW(b, 2) }
-func BenchmarkAddMulVVW_3(b *testing.B)   { benchmarkAddMulVVW(b, 3) }
-func BenchmarkAddMulVVW_4(b *testing.B)   { benchmarkAddMulVVW(b, 4) }
-func BenchmarkAddMulVVW_5(b *testing.B)   { benchmarkAddMulVVW(b, 5) }
-func BenchmarkAddMulVVW_1e1(b *testing.B) { benchmarkAddMulVVW(b, 1e1) }
-func BenchmarkAddMulVVW_1e2(b *testing.B) { benchmarkAddMulVVW(b, 1e2) }
-func BenchmarkAddMulVVW_1e3(b *testing.B) { benchmarkAddMulVVW(b, 1e3) }
-func BenchmarkAddMulVVW_1e4(b *testing.B) { benchmarkAddMulVVW(b, 1e4) }
-func BenchmarkAddMulVVW_1e5(b *testing.B) { benchmarkAddMulVVW(b, 1e5) }
-
-func testWordBitLen(t *testing.T, fname string, f func(Word) int) {
-	for i := 0; i <= _W; i++ {
-		x := Word(1) << uint(i-1) // i == 0 => x == 0
-		n := f(x)
-		if n != i {
-			t.Errorf("got %d; want %d for %s(%#x)", n, i, fname, x)
-		}
-	}
-}
-
-func TestWordBitLen(t *testing.T) {
-	testWordBitLen(t, "bitLen", bitLen)
-	testWordBitLen(t, "bitLen_g", bitLen_g)
-}
-
-// runs b.N iterations of bitLen called on a Word containing (1 << nbits)-1.
-func benchmarkBitLenN(b *testing.B, nbits uint) {
-	testword := Word((uint64(1) << nbits) - 1)
-	for i := 0; i < b.N; i++ {
-		bitLen(testword)
-	}
-}
-
-// Individual bitLen tests.  Numbers chosen to examine both sides
-// of powers-of-two boundaries.
-func BenchmarkBitLen0(b *testing.B)  { benchmarkBitLenN(b, 0) }
-func BenchmarkBitLen1(b *testing.B)  { benchmarkBitLenN(b, 1) }
-func BenchmarkBitLen2(b *testing.B)  { benchmarkBitLenN(b, 2) }
-func BenchmarkBitLen3(b *testing.B)  { benchmarkBitLenN(b, 3) }
-func BenchmarkBitLen4(b *testing.B)  { benchmarkBitLenN(b, 4) }
-func BenchmarkBitLen5(b *testing.B)  { benchmarkBitLenN(b, 5) }
-func BenchmarkBitLen8(b *testing.B)  { benchmarkBitLenN(b, 8) }
-func BenchmarkBitLen9(b *testing.B)  { benchmarkBitLenN(b, 9) }
-func BenchmarkBitLen16(b *testing.B) { benchmarkBitLenN(b, 16) }
-func BenchmarkBitLen17(b *testing.B) { benchmarkBitLenN(b, 17) }
-func BenchmarkBitLen31(b *testing.B) { benchmarkBitLenN(b, 31) }
diff --git a/third_party/gofrontend/libgo/go/math/big/bits_test.go b/third_party/gofrontend/libgo/go/math/big/bits_test.go
deleted file mode 100644
index 985b60b..0000000
--- a/third_party/gofrontend/libgo/go/math/big/bits_test.go
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements the Bits type used for testing Float operations
-// via an independent (albeit slower) representations for floating-point
-// numbers.
-
-package big
-
-import (
-	"fmt"
-	"sort"
-	"testing"
-)
-
-// A Bits value b represents a finite floating-point number x of the form
-//
-//	x = 2**b[0] + 2**b[1] + ... 2**b[len(b)-1]
-//
-// The order of slice elements is not significant. Negative elements may be
-// used to form fractions. A Bits value is normalized if each b[i] occurs at
-// most once. For instance Bits{0, 0, 1} is not normalized but represents the
-// same floating-point number as Bits{2}, which is normalized. The zero (nil)
-// value of Bits is a ready to use Bits value and represents the value 0.
-type Bits []int
-
-func (x Bits) add(y Bits) Bits {
-	return append(x, y...)
-}
-
-func (x Bits) mul(y Bits) Bits {
-	var p Bits
-	for _, x := range x {
-		for _, y := range y {
-			p = append(p, x+y)
-		}
-	}
-	return p
-}
-
-func TestMulBits(t *testing.T) {
-	for _, test := range []struct {
-		x, y, want Bits
-	}{
-		{nil, nil, nil},
-		{Bits{}, Bits{}, nil},
-		{Bits{0}, Bits{0}, Bits{0}},
-		{Bits{0}, Bits{1}, Bits{1}},
-		{Bits{1}, Bits{1, 2, 3}, Bits{2, 3, 4}},
-		{Bits{-1}, Bits{1}, Bits{0}},
-		{Bits{-10, -1, 0, 1, 10}, Bits{1, 2, 3}, Bits{-9, -8, -7, 0, 1, 2, 1, 2, 3, 2, 3, 4, 11, 12, 13}},
-	} {
-		got := fmt.Sprintf("%v", test.x.mul(test.y))
-		want := fmt.Sprintf("%v", test.want)
-		if got != want {
-			t.Errorf("%v * %v = %s; want %s", test.x, test.y, got, want)
-		}
-
-	}
-}
-
-// norm returns the normalized bits for x: It removes multiple equal entries
-// by treating them as an addition (e.g., Bits{5, 5} => Bits{6}), and it sorts
-// the result list for reproducible results.
-func (x Bits) norm() Bits {
-	m := make(map[int]bool)
-	for _, b := range x {
-		for m[b] {
-			m[b] = false
-			b++
-		}
-		m[b] = true
-	}
-	var z Bits
-	for b, set := range m {
-		if set {
-			z = append(z, b)
-		}
-	}
-	sort.Ints([]int(z))
-	return z
-}
-
-func TestNormBits(t *testing.T) {
-	for _, test := range []struct {
-		x, want Bits
-	}{
-		{nil, nil},
-		{Bits{}, Bits{}},
-		{Bits{0}, Bits{0}},
-		{Bits{0, 0}, Bits{1}},
-		{Bits{3, 1, 1}, Bits{2, 3}},
-		{Bits{10, 9, 8, 7, 6, 6}, Bits{11}},
-	} {
-		got := fmt.Sprintf("%v", test.x.norm())
-		want := fmt.Sprintf("%v", test.want)
-		if got != want {
-			t.Errorf("normBits(%v) = %s; want %s", test.x, got, want)
-		}
-
-	}
-}
-
-// round returns the Float value corresponding to x after rounding x
-// to prec bits according to mode.
-func (x Bits) round(prec uint, mode RoundingMode) *Float {
-	x = x.norm()
-
-	// determine range
-	var min, max int
-	for i, b := range x {
-		if i == 0 || b < min {
-			min = b
-		}
-		if i == 0 || b > max {
-			max = b
-		}
-	}
-	prec0 := uint(max + 1 - min)
-	if prec >= prec0 {
-		return x.Float()
-	}
-	// prec < prec0
-
-	// determine bit 0, rounding, and sticky bit, and result bits z
-	var bit0, rbit, sbit uint
-	var z Bits
-	r := max - int(prec)
-	for _, b := range x {
-		switch {
-		case b == r:
-			rbit = 1
-		case b < r:
-			sbit = 1
-		default:
-			// b > r
-			if b == r+1 {
-				bit0 = 1
-			}
-			z = append(z, b)
-		}
-	}
-
-	// round
-	f := z.Float() // rounded to zero
-	if mode == ToNearestAway {
-		panic("not yet implemented")
-	}
-	if mode == ToNearestEven && rbit == 1 && (sbit == 1 || sbit == 0 && bit0 != 0) || mode == AwayFromZero {
-		// round away from zero
-		f.SetMode(ToZero).SetPrec(prec)
-		f.Add(f, Bits{int(r) + 1}.Float())
-	}
-	return f
-}
-
-// Float returns the *Float z of the smallest possible precision such that
-// z = sum(2**bits[i]), with i = range bits. If multiple bits[i] are equal,
-// they are added: Bits{0, 1, 0}.Float() == 2**0 + 2**1 + 2**0 = 4.
-func (bits Bits) Float() *Float {
-	// handle 0
-	if len(bits) == 0 {
-		return new(Float)
-	}
-	// len(bits) > 0
-
-	// determine lsb exponent
-	var min int
-	for i, b := range bits {
-		if i == 0 || b < min {
-			min = b
-		}
-	}
-
-	// create bit pattern
-	x := NewInt(0)
-	for _, b := range bits {
-		badj := b - min
-		// propagate carry if necessary
-		for x.Bit(badj) != 0 {
-			x.SetBit(x, badj, 0)
-			badj++
-		}
-		x.SetBit(x, badj, 1)
-	}
-
-	// create corresponding float
-	z := new(Float).SetInt(x) // normalized
-	if e := int64(z.exp) + int64(min); MinExp <= e && e <= MaxExp {
-		z.exp = int32(e)
-	} else {
-		// this should never happen for our test cases
-		panic("exponent out of range")
-	}
-	return z
-}
-
-func TestFromBits(t *testing.T) {
-	for _, test := range []struct {
-		bits Bits
-		want string
-	}{
-		// all different bit numbers
-		{nil, "0"},
-		{Bits{0}, "0x.8p+1"},
-		{Bits{1}, "0x.8p+2"},
-		{Bits{-1}, "0x.8p+0"},
-		{Bits{63}, "0x.8p+64"},
-		{Bits{33, -30}, "0x.8000000000000001p+34"},
-		{Bits{255, 0}, "0x.8000000000000000000000000000000000000000000000000000000000000001p+256"},
-
-		// multiple equal bit numbers
-		{Bits{0, 0}, "0x.8p+2"},
-		{Bits{0, 0, 0, 0}, "0x.8p+3"},
-		{Bits{0, 1, 0}, "0x.8p+3"},
-		{append(Bits{2, 1, 0} /* 7 */, Bits{3, 1} /* 10 */ ...), "0x.88p+5" /* 17 */},
-	} {
-		f := test.bits.Float()
-		if got := f.Text('p', 0); got != test.want {
-			t.Errorf("setBits(%v) = %s; want %s", test.bits, got, test.want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/calibrate_test.go b/third_party/gofrontend/libgo/go/math/big/calibrate_test.go
deleted file mode 100644
index f69ffbf..0000000
--- a/third_party/gofrontend/libgo/go/math/big/calibrate_test.go
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file prints execution times for the Mul benchmark
-// given different Karatsuba thresholds. The result may be
-// used to manually fine-tune the threshold constant. The
-// results are somewhat fragile; use repeated runs to get
-// a clear picture.
-
-// Usage: go test -run=TestCalibrate -calibrate
-
-package big
-
-import (
-	"flag"
-	"fmt"
-	"testing"
-	"time"
-)
-
-var calibrate = flag.Bool("calibrate", false, "run calibration test")
-
-func karatsubaLoad(b *testing.B) {
-	BenchmarkMul(b)
-}
-
-// measureKaratsuba returns the time to run a Karatsuba-relevant benchmark
-// given Karatsuba threshold th.
-func measureKaratsuba(th int) time.Duration {
-	th, karatsubaThreshold = karatsubaThreshold, th
-	res := testing.Benchmark(karatsubaLoad)
-	karatsubaThreshold = th
-	return time.Duration(res.NsPerOp())
-}
-
-func computeThresholds() {
-	fmt.Printf("Multiplication times for varying Karatsuba thresholds\n")
-	fmt.Printf("(run repeatedly for good results)\n")
-
-	// determine Tk, the work load execution time using basic multiplication
-	Tb := measureKaratsuba(1e9) // th == 1e9 => Karatsuba multiplication disabled
-	fmt.Printf("Tb = %10s\n", Tb)
-
-	// thresholds
-	th := 4
-	th1 := -1
-	th2 := -1
-
-	var deltaOld time.Duration
-	for count := -1; count != 0 && th < 128; count-- {
-		// determine Tk, the work load execution time using Karatsuba multiplication
-		Tk := measureKaratsuba(th)
-
-		// improvement over Tb
-		delta := (Tb - Tk) * 100 / Tb
-
-		fmt.Printf("th = %3d  Tk = %10s  %4d%%", th, Tk, delta)
-
-		// determine break-even point
-		if Tk < Tb && th1 < 0 {
-			th1 = th
-			fmt.Print("  break-even point")
-		}
-
-		// determine diminishing return
-		if 0 < delta && delta < deltaOld && th2 < 0 {
-			th2 = th
-			fmt.Print("  diminishing return")
-		}
-		deltaOld = delta
-
-		fmt.Println()
-
-		// trigger counter
-		if th1 >= 0 && th2 >= 0 && count < 0 {
-			count = 10 // this many extra measurements after we got both thresholds
-		}
-
-		th++
-	}
-}
-
-func TestCalibrate(t *testing.T) {
-	if *calibrate {
-		computeThresholds()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/decimal.go b/third_party/gofrontend/libgo/go/math/big/decimal.go
deleted file mode 100644
index 2595e5f..0000000
--- a/third_party/gofrontend/libgo/go/math/big/decimal.go
+++ /dev/null
@@ -1,264 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements multi-precision decimal numbers.
-// The implementation is for float to decimal conversion only;
-// not general purpose use.
-// The only operations are precise conversion from binary to
-// decimal and rounding.
-//
-// The key observation and some code (shr) is borrowed from
-// strconv/decimal.go: conversion of binary fractional values can be done
-// precisely in multi-precision decimal because 2 divides 10 (required for
-// >> of mantissa); but conversion of decimal floating-point values cannot
-// be done precisely in binary representation.
-//
-// In contrast to strconv/decimal.go, only right shift is implemented in
-// decimal format - left shift can be done precisely in binary format.
-
-package big
-
-// A decimal represents an unsigned floating-point number in decimal representation.
-// The value of a non-zero decimal x is x.mant * 10 ** x.exp with 0.5 <= x.mant < 1,
-// with the most-significant mantissa digit at index 0. For the zero decimal, the
-// mantissa length and exponent are 0.
-// The zero value for decimal represents a ready-to-use 0.0.
-type decimal struct {
-	mant []byte // mantissa ASCII digits, big-endian
-	exp  int    // exponent
-}
-
-// Maximum shift amount that can be done in one pass without overflow.
-// A Word has _W bits and (1<<maxShift - 1)*10 + 9 must fit into Word.
-const maxShift = _W - 4
-
-// TODO(gri) Since we know the desired decimal precision when converting
-// a floating-point number, we may be able to limit the number of decimal
-// digits that need to be computed by init by providing an additional
-// precision argument and keeping track of when a number was truncated early
-// (equivalent of "sticky bit" in binary rounding).
-
-// TODO(gri) Along the same lines, enforce some limit to shift magnitudes
-// to avoid "infinitely" long running conversions (until we run out of space).
-
-// Init initializes x to the decimal representation of m << shift (for
-// shift >= 0), or m >> -shift (for shift < 0).
-func (x *decimal) init(m nat, shift int) {
-	// special case 0
-	if len(m) == 0 {
-		x.mant = x.mant[:0]
-		x.exp = 0
-		return
-	}
-
-	// Optimization: If we need to shift right, first remove any trailing
-	// zero bits from m to reduce shift amount that needs to be done in
-	// decimal format (since that is likely slower).
-	if shift < 0 {
-		ntz := m.trailingZeroBits()
-		s := uint(-shift)
-		if s >= ntz {
-			s = ntz // shift at most ntz bits
-		}
-		m = nat(nil).shr(m, s)
-		shift += int(s)
-	}
-
-	// Do any shift left in binary representation.
-	if shift > 0 {
-		m = nat(nil).shl(m, uint(shift))
-		shift = 0
-	}
-
-	// Convert mantissa into decimal representation.
-	s := m.decimalString() // TODO(gri) avoid string conversion here
-	n := len(s)
-	x.exp = n
-	// Trim trailing zeros; instead the exponent is tracking
-	// the decimal point independent of the number of digits.
-	for n > 0 && s[n-1] == '0' {
-		n--
-	}
-	x.mant = append(x.mant[:0], s[:n]...)
-
-	// Do any (remaining) shift right in decimal representation.
-	if shift < 0 {
-		for shift < -maxShift {
-			shr(x, maxShift)
-			shift += maxShift
-		}
-		shr(x, uint(-shift))
-	}
-}
-
-// Possibly optimization: The current implementation of nat.string takes
-// a charset argument. When a right shift is needed, we could provide
-// "\x00\x01...\x09" instead of "012..9" (as in nat.decimalString) and
-// avoid the repeated +'0' and -'0' operations in decimal.shr (and do a
-// single +'0' pass at the end).
-
-// shr implements x >> s, for s <= maxShift.
-func shr(x *decimal, s uint) {
-	// Division by 1<<s using shift-and-subtract algorithm.
-
-	// pick up enough leading digits to cover first shift
-	r := 0 // read index
-	var n Word
-	for n>>s == 0 && r < len(x.mant) {
-		ch := Word(x.mant[r])
-		r++
-		n = n*10 + ch - '0'
-	}
-	if n == 0 {
-		// x == 0; shouldn't get here, but handle anyway
-		x.mant = x.mant[:0]
-		return
-	}
-	for n>>s == 0 {
-		r++
-		n *= 10
-	}
-	x.exp += 1 - r
-
-	// read a digit, write a digit
-	w := 0 // write index
-	for r < len(x.mant) {
-		ch := Word(x.mant[r])
-		r++
-		d := n >> s
-		n -= d << s
-		x.mant[w] = byte(d + '0')
-		w++
-		n = n*10 + ch - '0'
-	}
-
-	// write extra digits that still fit
-	for n > 0 && w < len(x.mant) {
-		d := n >> s
-		n -= d << s
-		x.mant[w] = byte(d + '0')
-		w++
-		n = n * 10
-	}
-	x.mant = x.mant[:w] // the number may be shorter (e.g. 1024 >> 10)
-
-	// append additional digits that didn't fit
-	for n > 0 {
-		d := n >> s
-		n -= d << s
-		x.mant = append(x.mant, byte(d+'0'))
-		n = n * 10
-	}
-
-	trim(x)
-}
-
-func (x *decimal) String() string {
-	if len(x.mant) == 0 {
-		return "0"
-	}
-
-	var buf []byte
-	switch {
-	case x.exp <= 0:
-		// 0.00ddd
-		buf = append(buf, "0."...)
-		buf = appendZeros(buf, -x.exp)
-		buf = append(buf, x.mant...)
-
-	case /* 0 < */ x.exp < len(x.mant):
-		// dd.ddd
-		buf = append(buf, x.mant[:x.exp]...)
-		buf = append(buf, '.')
-		buf = append(buf, x.mant[x.exp:]...)
-
-	default: // len(x.mant) <= x.exp
-		// ddd00
-		buf = append(buf, x.mant...)
-		buf = appendZeros(buf, x.exp-len(x.mant))
-	}
-
-	return string(buf)
-}
-
-// appendZeros appends n 0 digits to buf and returns buf.
-func appendZeros(buf []byte, n int) []byte {
-	for ; n > 0; n-- {
-		buf = append(buf, '0')
-	}
-	return buf
-}
-
-// shouldRoundUp reports if x should be rounded up
-// if shortened to n digits. n must be a valid index
-// for x.mant.
-func shouldRoundUp(x *decimal, n int) bool {
-	if x.mant[n] == '5' && n+1 == len(x.mant) {
-		// exactly halfway - round to even
-		return n > 0 && (x.mant[n-1]-'0')&1 != 0
-	}
-	// not halfway - digit tells all (x.mant has no trailing zeros)
-	return x.mant[n] >= '5'
-}
-
-// round sets x to (at most) n mantissa digits by rounding it
-// to the nearest even value with n (or fever) mantissa digits.
-// If n < 0, x remains unchanged.
-func (x *decimal) round(n int) {
-	if n < 0 || n >= len(x.mant) {
-		return // nothing to do
-	}
-
-	if shouldRoundUp(x, n) {
-		x.roundUp(n)
-	} else {
-		x.roundDown(n)
-	}
-}
-
-func (x *decimal) roundUp(n int) {
-	if n < 0 || n >= len(x.mant) {
-		return // nothing to do
-	}
-	// 0 <= n < len(x.mant)
-
-	// find first digit < '9'
-	for n > 0 && x.mant[n-1] >= '9' {
-		n--
-	}
-
-	if n == 0 {
-		// all digits are '9's => round up to '1' and update exponent
-		x.mant[0] = '1' // ok since len(x.mant) > n
-		x.mant = x.mant[:1]
-		x.exp++
-		return
-	}
-
-	// n > 0 && x.mant[n-1] < '9'
-	x.mant[n-1]++
-	x.mant = x.mant[:n]
-	// x already trimmed
-}
-
-func (x *decimal) roundDown(n int) {
-	if n < 0 || n >= len(x.mant) {
-		return // nothing to do
-	}
-	x.mant = x.mant[:n]
-	trim(x)
-}
-
-// trim cuts off any trailing zeros from x's mantissa;
-// they are meaningless for the value of x.
-func trim(x *decimal) {
-	i := len(x.mant)
-	for i > 0 && x.mant[i-1] == '0' {
-		i--
-	}
-	x.mant = x.mant[:i]
-	if i == 0 {
-		x.exp = 0
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/decimal_test.go b/third_party/gofrontend/libgo/go/math/big/decimal_test.go
deleted file mode 100644
index 81e022a..0000000
--- a/third_party/gofrontend/libgo/go/math/big/decimal_test.go
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package big
-
-import "testing"
-
-func TestDecimalString(t *testing.T) {
-	for _, test := range []struct {
-		x    decimal
-		want string
-	}{
-		{want: "0"},
-		{decimal{nil, 1000}, "0"}, // exponent of 0 is ignored
-		{decimal{[]byte("12345"), 0}, "0.12345"},
-		{decimal{[]byte("12345"), -3}, "0.00012345"},
-		{decimal{[]byte("12345"), +3}, "123.45"},
-		{decimal{[]byte("12345"), +10}, "1234500000"},
-	} {
-		if got := test.x.String(); got != test.want {
-			t.Errorf("%v == %s; want %s", test.x, got, test.want)
-		}
-	}
-}
-
-func TestDecimalInit(t *testing.T) {
-	for _, test := range []struct {
-		x     Word
-		shift int
-		want  string
-	}{
-		{0, 0, "0"},
-		{0, -100, "0"},
-		{0, 100, "0"},
-		{1, 0, "1"},
-		{1, 10, "1024"},
-		{1, 100, "1267650600228229401496703205376"},
-		{1, -100, "0.0000000000000000000000000000007888609052210118054117285652827862296732064351090230047702789306640625"},
-		{12345678, 8, "3160493568"},
-		{12345678, -8, "48225.3046875"},
-		{195312, 9, "99999744"},
-		{1953125, 9, "1000000000"},
-	} {
-		var d decimal
-		d.init(nat{test.x}.norm(), test.shift)
-		if got := d.String(); got != test.want {
-			t.Errorf("%d << %d == %s; want %s", test.x, test.shift, got, test.want)
-		}
-	}
-}
-
-func TestDecimalRounding(t *testing.T) {
-	for _, test := range []struct {
-		x              uint64
-		n              int
-		down, even, up string
-	}{
-		{0, 0, "0", "0", "0"},
-		{0, 1, "0", "0", "0"},
-
-		{1, 0, "0", "0", "10"},
-		{5, 0, "0", "0", "10"},
-		{9, 0, "0", "10", "10"},
-
-		{15, 1, "10", "20", "20"},
-		{45, 1, "40", "40", "50"},
-		{95, 1, "90", "100", "100"},
-
-		{12344999, 4, "12340000", "12340000", "12350000"},
-		{12345000, 4, "12340000", "12340000", "12350000"},
-		{12345001, 4, "12340000", "12350000", "12350000"},
-		{23454999, 4, "23450000", "23450000", "23460000"},
-		{23455000, 4, "23450000", "23460000", "23460000"},
-		{23455001, 4, "23450000", "23460000", "23460000"},
-
-		{99994999, 4, "99990000", "99990000", "100000000"},
-		{99995000, 4, "99990000", "100000000", "100000000"},
-		{99999999, 4, "99990000", "100000000", "100000000"},
-
-		{12994999, 4, "12990000", "12990000", "13000000"},
-		{12995000, 4, "12990000", "13000000", "13000000"},
-		{12999999, 4, "12990000", "13000000", "13000000"},
-	} {
-		x := nat(nil).setUint64(test.x)
-
-		var d decimal
-		d.init(x, 0)
-		d.roundDown(test.n)
-		if got := d.String(); got != test.down {
-			t.Errorf("roundDown(%d, %d) = %s; want %s", test.x, test.n, got, test.down)
-		}
-
-		d.init(x, 0)
-		d.round(test.n)
-		if got := d.String(); got != test.even {
-			t.Errorf("round(%d, %d) = %s; want %s", test.x, test.n, got, test.even)
-		}
-
-		d.init(x, 0)
-		d.roundUp(test.n)
-		if got := d.String(); got != test.up {
-			t.Errorf("roundUp(%d, %d) = %s; want %s", test.x, test.n, got, test.up)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/float.go b/third_party/gofrontend/libgo/go/math/big/float.go
deleted file mode 100644
index d7aa895..0000000
--- a/third_party/gofrontend/libgo/go/math/big/float.go
+++ /dev/null
@@ -1,1693 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements multi-precision floating-point numbers.
-// Like in the GNU MPFR library (http://www.mpfr.org/), operands
-// can be of mixed precision. Unlike MPFR, the rounding mode is
-// not specified with each operation, but with each operand. The
-// rounding mode of the result operand determines the rounding
-// mode of an operation. This is a from-scratch implementation.
-
-package big
-
-import (
-	"fmt"
-	"math"
-)
-
-const debugFloat = false // enable for debugging
-
-// A nonzero finite Float represents a multi-precision floating point number
-//
-//   sign × mantissa × 2**exponent
-//
-// with 0.5 <= mantissa < 1.0, and MinExp <= exponent <= MaxExp.
-// A Float may also be zero (+0, -0) or infinite (+Inf, -Inf).
-// All Floats are ordered, and the ordering of two Floats x and y
-// is defined by x.Cmp(y).
-//
-// Each Float value also has a precision, rounding mode, and accuracy.
-// The precision is the maximum number of mantissa bits available to
-// represent the value. The rounding mode specifies how a result should
-// be rounded to fit into the mantissa bits, and accuracy describes the
-// rounding error with respect to the exact result.
-//
-// Unless specified otherwise, all operations (including setters) that
-// specify a *Float variable for the result (usually via the receiver
-// with the exception of MantExp), round the numeric result according
-// to the precision and rounding mode of the result variable.
-//
-// If the provided result precision is 0 (see below), it is set to the
-// precision of the argument with the largest precision value before any
-// rounding takes place, and the rounding mode remains unchanged. Thus,
-// uninitialized Floats provided as result arguments will have their
-// precision set to a reasonable value determined by the operands and
-// their mode is the zero value for RoundingMode (ToNearestEven).
-//
-// By setting the desired precision to 24 or 53 and using matching rounding
-// mode (typically ToNearestEven), Float operations produce the same results
-// as the corresponding float32 or float64 IEEE-754 arithmetic for operands
-// that correspond to normal (i.e., not denormal) float32 or float64 numbers.
-// Exponent underflow and overflow lead to a 0 or an Infinity for different
-// values than IEEE-754 because Float exponents have a much larger range.
-//
-// The zero (uninitialized) value for a Float is ready to use and represents
-// the number +0.0 exactly, with precision 0 and rounding mode ToNearestEven.
-//
-type Float struct {
-	prec uint32
-	mode RoundingMode
-	acc  Accuracy
-	form form
-	neg  bool
-	mant nat
-	exp  int32
-}
-
-// An ErrNaN panic is raised by a Float operation that would lead to
-// a NaN under IEEE-754 rules. An ErrNaN implements the error interface.
-type ErrNaN struct {
-	msg string
-}
-
-func (err ErrNaN) Error() string {
-	return err.msg
-}
-
-// NewFloat allocates and returns a new Float set to x,
-// with precision 53 and rounding mode ToNearestEven.
-// NewFloat panics with ErrNaN if x is a NaN.
-func NewFloat(x float64) *Float {
-	if math.IsNaN(x) {
-		panic(ErrNaN{"NewFloat(NaN)"})
-	}
-	return new(Float).SetFloat64(x)
-}
-
-// Exponent and precision limits.
-const (
-	MaxExp  = math.MaxInt32  // largest supported exponent
-	MinExp  = math.MinInt32  // smallest supported exponent
-	MaxPrec = math.MaxUint32 // largest (theoretically) supported precision; likely memory-limited
-)
-
-// Internal representation: The mantissa bits x.mant of a nonzero finite
-// Float x are stored in a nat slice long enough to hold up to x.prec bits;
-// the slice may (but doesn't have to) be shorter if the mantissa contains
-// trailing 0 bits. x.mant is normalized if the msb of x.mant == 1 (i.e.,
-// the msb is shifted all the way "to the left"). Thus, if the mantissa has
-// trailing 0 bits or x.prec is not a multiple of the the Word size _W,
-// x.mant[0] has trailing zero bits. The msb of the mantissa corresponds
-// to the value 0.5; the exponent x.exp shifts the binary point as needed.
-//
-// A zero or non-finite Float x ignores x.mant and x.exp.
-//
-// x                 form      neg      mant         exp
-// ----------------------------------------------------------
-// ±0                zero      sign     -            -
-// 0 < |x| < +Inf    finite    sign     mantissa     exponent
-// ±Inf              inf       sign     -            -
-
-// A form value describes the internal representation.
-type form byte
-
-// The form value order is relevant - do not change!
-const (
-	zero form = iota
-	finite
-	inf
-)
-
-// RoundingMode determines how a Float value is rounded to the
-// desired precision. Rounding may change the Float value; the
-// rounding error is described by the Float's Accuracy.
-type RoundingMode byte
-
-// The following rounding modes are supported.
-const (
-	ToNearestEven RoundingMode = iota // == IEEE 754-2008 roundTiesToEven
-	ToNearestAway                     // == IEEE 754-2008 roundTiesToAway
-	ToZero                            // == IEEE 754-2008 roundTowardZero
-	AwayFromZero                      // no IEEE 754-2008 equivalent
-	ToNegativeInf                     // == IEEE 754-2008 roundTowardNegative
-	ToPositiveInf                     // == IEEE 754-2008 roundTowardPositive
-)
-
-//go:generate stringer -type=RoundingMode
-
-// Accuracy describes the rounding error produced by the most recent
-// operation that generated a Float value, relative to the exact value.
-type Accuracy int8
-
-// Constants describing the Accuracy of a Float.
-const (
-	Below Accuracy = -1
-	Exact Accuracy = 0
-	Above Accuracy = +1
-)
-
-//go:generate stringer -type=Accuracy
-
-// SetPrec sets z's precision to prec and returns the (possibly) rounded
-// value of z. Rounding occurs according to z's rounding mode if the mantissa
-// cannot be represented in prec bits without loss of precision.
-// SetPrec(0) maps all finite values to ±0; infinite values remain unchanged.
-// If prec > MaxPrec, it is set to MaxPrec.
-func (z *Float) SetPrec(prec uint) *Float {
-	z.acc = Exact // optimistically assume no rounding is needed
-
-	// special case
-	if prec == 0 {
-		z.prec = 0
-		if z.form == finite {
-			// truncate z to 0
-			z.acc = makeAcc(z.neg)
-			z.form = zero
-		}
-		return z
-	}
-
-	// general case
-	if prec > MaxPrec {
-		prec = MaxPrec
-	}
-	old := z.prec
-	z.prec = uint32(prec)
-	if z.prec < old {
-		z.round(0)
-	}
-	return z
-}
-
-func makeAcc(above bool) Accuracy {
-	if above {
-		return Above
-	}
-	return Below
-}
-
-// SetMode sets z's rounding mode to mode and returns an exact z.
-// z remains unchanged otherwise.
-// z.SetMode(z.Mode()) is a cheap way to set z's accuracy to Exact.
-func (z *Float) SetMode(mode RoundingMode) *Float {
-	z.mode = mode
-	z.acc = Exact
-	return z
-}
-
-// Prec returns the mantissa precision of x in bits.
-// The result may be 0 for |x| == 0 and |x| == Inf.
-func (x *Float) Prec() uint {
-	return uint(x.prec)
-}
-
-// MinPrec returns the minimum precision required to represent x exactly
-// (i.e., the smallest prec before x.SetPrec(prec) would start rounding x).
-// The result is 0 for |x| == 0 and |x| == Inf.
-func (x *Float) MinPrec() uint {
-	if x.form != finite {
-		return 0
-	}
-	return uint(len(x.mant))*_W - x.mant.trailingZeroBits()
-}
-
-// Mode returns the rounding mode of x.
-func (x *Float) Mode() RoundingMode {
-	return x.mode
-}
-
-// Acc returns the accuracy of x produced by the most recent operation.
-func (x *Float) Acc() Accuracy {
-	return x.acc
-}
-
-// Sign returns:
-//
-//	-1 if x <   0
-//	 0 if x is ±0
-//	+1 if x >   0
-//
-func (x *Float) Sign() int {
-	if debugFloat {
-		x.validate()
-	}
-	if x.form == zero {
-		return 0
-	}
-	if x.neg {
-		return -1
-	}
-	return 1
-}
-
-// MantExp breaks x into its mantissa and exponent components
-// and returns the exponent. If a non-nil mant argument is
-// provided its value is set to the mantissa of x, with the
-// same precision and rounding mode as x. The components
-// satisfy x == mant × 2**exp, with 0.5 <= |mant| < 1.0.
-// Calling MantExp with a nil argument is an efficient way to
-// get the exponent of the receiver.
-//
-// Special cases are:
-//
-//	(  ±0).MantExp(mant) = 0, with mant set to   ±0
-//	(±Inf).MantExp(mant) = 0, with mant set to ±Inf
-//
-// x and mant may be the same in which case x is set to its
-// mantissa value.
-func (x *Float) MantExp(mant *Float) (exp int) {
-	if debugFloat {
-		x.validate()
-	}
-	if x.form == finite {
-		exp = int(x.exp)
-	}
-	if mant != nil {
-		mant.Copy(x)
-		if mant.form == finite {
-			mant.exp = 0
-		}
-	}
-	return
-}
-
-func (z *Float) setExpAndRound(exp int64, sbit uint) {
-	if exp < MinExp {
-		// underflow
-		z.acc = makeAcc(z.neg)
-		z.form = zero
-		return
-	}
-
-	if exp > MaxExp {
-		// overflow
-		z.acc = makeAcc(!z.neg)
-		z.form = inf
-		return
-	}
-
-	z.form = finite
-	z.exp = int32(exp)
-	z.round(sbit)
-}
-
-// SetMantExp sets z to mant × 2**exp and and returns z.
-// The result z has the same precision and rounding mode
-// as mant. SetMantExp is an inverse of MantExp but does
-// not require 0.5 <= |mant| < 1.0. Specifically:
-//
-//	mant := new(Float)
-//	new(Float).SetMantExp(mant, x.SetMantExp(mant)).Cmp(x).Eql() is true
-//
-// Special cases are:
-//
-//	z.SetMantExp(  ±0, exp) =   ±0
-//	z.SetMantExp(±Inf, exp) = ±Inf
-//
-// z and mant may be the same in which case z's exponent
-// is set to exp.
-func (z *Float) SetMantExp(mant *Float, exp int) *Float {
-	if debugFloat {
-		z.validate()
-		mant.validate()
-	}
-	z.Copy(mant)
-	if z.form != finite {
-		return z
-	}
-	z.setExpAndRound(int64(z.exp)+int64(exp), 0)
-	return z
-}
-
-// Signbit returns true if x is negative or negative zero.
-func (x *Float) Signbit() bool {
-	return x.neg
-}
-
-// IsInf reports whether x is +Inf or -Inf.
-func (x *Float) IsInf() bool {
-	return x.form == inf
-}
-
-// IsInt reports whether x is an integer.
-// ±Inf values are not integers.
-func (x *Float) IsInt() bool {
-	if debugFloat {
-		x.validate()
-	}
-	// special cases
-	if x.form != finite {
-		return x.form == zero
-	}
-	// x.form == finite
-	if x.exp <= 0 {
-		return false
-	}
-	// x.exp > 0
-	return x.prec <= uint32(x.exp) || x.MinPrec() <= uint(x.exp) // not enough bits for fractional mantissa
-}
-
-// debugging support
-func (x *Float) validate() {
-	if !debugFloat {
-		// avoid performance bugs
-		panic("validate called but debugFloat is not set")
-	}
-	if x.form != finite {
-		return
-	}
-	m := len(x.mant)
-	if m == 0 {
-		panic("nonzero finite number with empty mantissa")
-	}
-	const msb = 1 << (_W - 1)
-	if x.mant[m-1]&msb == 0 {
-		panic(fmt.Sprintf("msb not set in last word %#x of %s", x.mant[m-1], x.Text('p', 0)))
-	}
-	if x.prec == 0 {
-		panic("zero precision finite number")
-	}
-}
-
-// round rounds z according to z.mode to z.prec bits and sets z.acc accordingly.
-// sbit must be 0 or 1 and summarizes any "sticky bit" information one might
-// have before calling round. z's mantissa must be normalized (with the msb set)
-// or empty.
-//
-// CAUTION: The rounding modes ToNegativeInf, ToPositiveInf are affected by the
-// sign of z. For correct rounding, the sign of z must be set correctly before
-// calling round.
-func (z *Float) round(sbit uint) {
-	if debugFloat {
-		z.validate()
-	}
-
-	z.acc = Exact
-	if z.form != finite {
-		// ±0 or ±Inf => nothing left to do
-		return
-	}
-	// z.form == finite && len(z.mant) > 0
-	// m > 0 implies z.prec > 0 (checked by validate)
-
-	m := uint32(len(z.mant)) // present mantissa length in words
-	bits := m * _W           // present mantissa bits
-	if bits <= z.prec {
-		// mantissa fits => nothing to do
-		return
-	}
-	// bits > z.prec
-
-	n := (z.prec + (_W - 1)) / _W // mantissa length in words for desired precision
-
-	// Rounding is based on two bits: the rounding bit (rbit) and the
-	// sticky bit (sbit). The rbit is the bit immediately before the
-	// z.prec leading mantissa bits (the "0.5"). The sbit is set if any
-	// of the bits before the rbit are set (the "0.25", "0.125", etc.):
-	//
-	//   rbit  sbit  => "fractional part"
-	//
-	//   0     0        == 0
-	//   0     1        >  0  , < 0.5
-	//   1     0        == 0.5
-	//   1     1        >  0.5, < 1.0
-
-	// bits > z.prec: mantissa too large => round
-	r := uint(bits - z.prec - 1) // rounding bit position; r >= 0
-	rbit := z.mant.bit(r)        // rounding bit
-	if sbit == 0 {
-		sbit = z.mant.sticky(r)
-	}
-	if debugFloat && sbit&^1 != 0 {
-		panic(fmt.Sprintf("invalid sbit %#x", sbit))
-	}
-
-	// convert ToXInf rounding modes
-	mode := z.mode
-	switch mode {
-	case ToNegativeInf:
-		mode = ToZero
-		if z.neg {
-			mode = AwayFromZero
-		}
-	case ToPositiveInf:
-		mode = AwayFromZero
-		if z.neg {
-			mode = ToZero
-		}
-	}
-
-	// cut off extra words
-	if m > n {
-		copy(z.mant, z.mant[m-n:]) // move n last words to front
-		z.mant = z.mant[:n]
-	}
-
-	// determine number of trailing zero bits t
-	t := n*_W - z.prec // 0 <= t < _W
-	lsb := Word(1) << t
-
-	// make rounding decision
-	// TODO(gri) This can be simplified (see Bits.round in bits_test.go).
-	switch mode {
-	case ToZero:
-		// nothing to do
-	case ToNearestEven, ToNearestAway:
-		if rbit == 0 {
-			// rounding bits == 0b0x
-			mode = ToZero
-		} else if sbit == 1 {
-			// rounding bits == 0b11
-			mode = AwayFromZero
-		}
-	case AwayFromZero:
-		if rbit|sbit == 0 {
-			mode = ToZero
-		}
-	default:
-		// ToXInf modes have been converted to ToZero or AwayFromZero
-		panic("unreachable")
-	}
-
-	// round and determine accuracy
-	switch mode {
-	case ToZero:
-		if rbit|sbit != 0 {
-			z.acc = Below
-		}
-
-	case ToNearestEven, ToNearestAway:
-		if debugFloat && rbit != 1 {
-			panic("internal error in rounding")
-		}
-		if mode == ToNearestEven && sbit == 0 && z.mant[0]&lsb == 0 {
-			z.acc = Below
-			break
-		}
-		// mode == ToNearestAway || sbit == 1 || z.mant[0]&lsb != 0
-		fallthrough
-
-	case AwayFromZero:
-		// add 1 to mantissa
-		if addVW(z.mant, z.mant, lsb) != 0 {
-			// overflow => shift mantissa right by 1 and add msb
-			shrVU(z.mant, z.mant, 1)
-			z.mant[n-1] |= 1 << (_W - 1)
-			// adjust exponent
-			if z.exp < MaxExp {
-				z.exp++
-			} else {
-				// exponent overflow
-				z.acc = makeAcc(!z.neg)
-				z.form = inf
-				return
-			}
-		}
-		z.acc = Above
-	}
-
-	// zero out trailing bits in least-significant word
-	z.mant[0] &^= lsb - 1
-
-	// update accuracy
-	if z.acc != Exact && z.neg {
-		z.acc = -z.acc
-	}
-
-	if debugFloat {
-		z.validate()
-	}
-
-	return
-}
-
-func (z *Float) setBits64(neg bool, x uint64) *Float {
-	if z.prec == 0 {
-		z.prec = 64
-	}
-	z.acc = Exact
-	z.neg = neg
-	if x == 0 {
-		z.form = zero
-		return z
-	}
-	// x != 0
-	z.form = finite
-	s := nlz64(x)
-	z.mant = z.mant.setUint64(x << s)
-	z.exp = int32(64 - s) // always fits
-	if z.prec < 64 {
-		z.round(0)
-	}
-	return z
-}
-
-// SetUint64 sets z to the (possibly rounded) value of x and returns z.
-// If z's precision is 0, it is changed to 64 (and rounding will have
-// no effect).
-func (z *Float) SetUint64(x uint64) *Float {
-	return z.setBits64(false, x)
-}
-
-// SetInt64 sets z to the (possibly rounded) value of x and returns z.
-// If z's precision is 0, it is changed to 64 (and rounding will have
-// no effect).
-func (z *Float) SetInt64(x int64) *Float {
-	u := x
-	if u < 0 {
-		u = -u
-	}
-	// We cannot simply call z.SetUint64(uint64(u)) and change
-	// the sign afterwards because the sign affects rounding.
-	return z.setBits64(x < 0, uint64(u))
-}
-
-// SetFloat64 sets z to the (possibly rounded) value of x and returns z.
-// If z's precision is 0, it is changed to 53 (and rounding will have
-// no effect). SetFloat64 panics with ErrNaN if x is a NaN.
-func (z *Float) SetFloat64(x float64) *Float {
-	if z.prec == 0 {
-		z.prec = 53
-	}
-	if math.IsNaN(x) {
-		panic(ErrNaN{"Float.SetFloat64(NaN)"})
-	}
-	z.acc = Exact
-	z.neg = math.Signbit(x) // handle -0, -Inf correctly
-	if x == 0 {
-		z.form = zero
-		return z
-	}
-	if math.IsInf(x, 0) {
-		z.form = inf
-		return z
-	}
-	// normalized x != 0
-	z.form = finite
-	fmant, exp := math.Frexp(x) // get normalized mantissa
-	z.mant = z.mant.setUint64(1<<63 | math.Float64bits(fmant)<<11)
-	z.exp = int32(exp) // always fits
-	if z.prec < 53 {
-		z.round(0)
-	}
-	return z
-}
-
-// fnorm normalizes mantissa m by shifting it to the left
-// such that the msb of the most-significant word (msw) is 1.
-// It returns the shift amount. It assumes that len(m) != 0.
-func fnorm(m nat) int64 {
-	if debugFloat && (len(m) == 0 || m[len(m)-1] == 0) {
-		panic("msw of mantissa is 0")
-	}
-	s := nlz(m[len(m)-1])
-	if s > 0 {
-		c := shlVU(m, m, s)
-		if debugFloat && c != 0 {
-			panic("nlz or shlVU incorrect")
-		}
-	}
-	return int64(s)
-}
-
-// SetInt sets z to the (possibly rounded) value of x and returns z.
-// If z's precision is 0, it is changed to the larger of x.BitLen()
-// or 64 (and rounding will have no effect).
-func (z *Float) SetInt(x *Int) *Float {
-	// TODO(gri) can be more efficient if z.prec > 0
-	// but small compared to the size of x, or if there
-	// are many trailing 0's.
-	bits := uint32(x.BitLen())
-	if z.prec == 0 {
-		z.prec = umax32(bits, 64)
-	}
-	z.acc = Exact
-	z.neg = x.neg
-	if len(x.abs) == 0 {
-		z.form = zero
-		return z
-	}
-	// x != 0
-	z.mant = z.mant.set(x.abs)
-	fnorm(z.mant)
-	z.setExpAndRound(int64(bits), 0)
-	return z
-}
-
-// SetRat sets z to the (possibly rounded) value of x and returns z.
-// If z's precision is 0, it is changed to the largest of a.BitLen(),
-// b.BitLen(), or 64; with x = a/b.
-func (z *Float) SetRat(x *Rat) *Float {
-	if x.IsInt() {
-		return z.SetInt(x.Num())
-	}
-	var a, b Float
-	a.SetInt(x.Num())
-	b.SetInt(x.Denom())
-	if z.prec == 0 {
-		z.prec = umax32(a.prec, b.prec)
-	}
-	return z.Quo(&a, &b)
-}
-
-// SetInf sets z to the infinite Float -Inf if signbit is
-// set, or +Inf if signbit is not set, and returns z. The
-// precision of z is unchanged and the result is always
-// Exact.
-func (z *Float) SetInf(signbit bool) *Float {
-	z.acc = Exact
-	z.form = inf
-	z.neg = signbit
-	return z
-}
-
-// Set sets z to the (possibly rounded) value of x and returns z.
-// If z's precision is 0, it is changed to the precision of x
-// before setting z (and rounding will have no effect).
-// Rounding is performed according to z's precision and rounding
-// mode; and z's accuracy reports the result error relative to the
-// exact (not rounded) result.
-func (z *Float) Set(x *Float) *Float {
-	if debugFloat {
-		x.validate()
-	}
-	z.acc = Exact
-	if z != x {
-		z.form = x.form
-		z.neg = x.neg
-		if x.form == finite {
-			z.exp = x.exp
-			z.mant = z.mant.set(x.mant)
-		}
-		if z.prec == 0 {
-			z.prec = x.prec
-		} else if z.prec < x.prec {
-			z.round(0)
-		}
-	}
-	return z
-}
-
-// Copy sets z to x, with the same precision, rounding mode, and
-// accuracy as x, and returns z. x is not changed even if z and
-// x are the same.
-func (z *Float) Copy(x *Float) *Float {
-	if debugFloat {
-		x.validate()
-	}
-	if z != x {
-		z.prec = x.prec
-		z.mode = x.mode
-		z.acc = x.acc
-		z.form = x.form
-		z.neg = x.neg
-		if z.form == finite {
-			z.mant = z.mant.set(x.mant)
-			z.exp = x.exp
-		}
-	}
-	return z
-}
-
-// msb32 returns the 32 most significant bits of x.
-func msb32(x nat) uint32 {
-	i := len(x) - 1
-	if i < 0 {
-		return 0
-	}
-	if debugFloat && x[i]&(1<<(_W-1)) == 0 {
-		panic("x not normalized")
-	}
-	switch _W {
-	case 32:
-		return uint32(x[i])
-	case 64:
-		return uint32(x[i] >> 32)
-	}
-	panic("unreachable")
-}
-
-// msb64 returns the 64 most significant bits of x.
-func msb64(x nat) uint64 {
-	i := len(x) - 1
-	if i < 0 {
-		return 0
-	}
-	if debugFloat && x[i]&(1<<(_W-1)) == 0 {
-		panic("x not normalized")
-	}
-	switch _W {
-	case 32:
-		v := uint64(x[i]) << 32
-		if i > 0 {
-			v |= uint64(x[i-1])
-		}
-		return v
-	case 64:
-		return uint64(x[i])
-	}
-	panic("unreachable")
-}
-
-// Uint64 returns the unsigned integer resulting from truncating x
-// towards zero. If 0 <= x <= math.MaxUint64, the result is Exact
-// if x is an integer and Below otherwise.
-// The result is (0, Above) for x < 0, and (math.MaxUint64, Below)
-// for x > math.MaxUint64.
-func (x *Float) Uint64() (uint64, Accuracy) {
-	if debugFloat {
-		x.validate()
-	}
-
-	switch x.form {
-	case finite:
-		if x.neg {
-			return 0, Above
-		}
-		// 0 < x < +Inf
-		if x.exp <= 0 {
-			// 0 < x < 1
-			return 0, Below
-		}
-		// 1 <= x < Inf
-		if x.exp <= 64 {
-			// u = trunc(x) fits into a uint64
-			u := msb64(x.mant) >> (64 - uint32(x.exp))
-			if x.MinPrec() <= 64 {
-				return u, Exact
-			}
-			return u, Below // x truncated
-		}
-		// x too large
-		return math.MaxUint64, Below
-
-	case zero:
-		return 0, Exact
-
-	case inf:
-		if x.neg {
-			return 0, Above
-		}
-		return math.MaxUint64, Below
-	}
-
-	panic("unreachable")
-}
-
-// Int64 returns the integer resulting from truncating x towards zero.
-// If math.MinInt64 <= x <= math.MaxInt64, the result is Exact if x is
-// an integer, and Above (x < 0) or Below (x > 0) otherwise.
-// The result is (math.MinInt64, Above) for x < math.MinInt64,
-// and (math.MaxInt64, Below) for x > math.MaxInt64.
-func (x *Float) Int64() (int64, Accuracy) {
-	if debugFloat {
-		x.validate()
-	}
-
-	switch x.form {
-	case finite:
-		// 0 < |x| < +Inf
-		acc := makeAcc(x.neg)
-		if x.exp <= 0 {
-			// 0 < |x| < 1
-			return 0, acc
-		}
-		// x.exp > 0
-
-		// 1 <= |x| < +Inf
-		if x.exp <= 63 {
-			// i = trunc(x) fits into an int64 (excluding math.MinInt64)
-			i := int64(msb64(x.mant) >> (64 - uint32(x.exp)))
-			if x.neg {
-				i = -i
-			}
-			if x.MinPrec() <= uint(x.exp) {
-				return i, Exact
-			}
-			return i, acc // x truncated
-		}
-		if x.neg {
-			// check for special case x == math.MinInt64 (i.e., x == -(0.5 << 64))
-			if x.exp == 64 && x.MinPrec() == 1 {
-				acc = Exact
-			}
-			return math.MinInt64, acc
-		}
-		// x too large
-		return math.MaxInt64, Below
-
-	case zero:
-		return 0, Exact
-
-	case inf:
-		if x.neg {
-			return math.MinInt64, Above
-		}
-		return math.MaxInt64, Below
-	}
-
-	panic("unreachable")
-}
-
-// Float32 returns the float32 value nearest to x. If x is too small to be
-// represented by a float32 (|x| < math.SmallestNonzeroFloat32), the result
-// is (0, Below) or (-0, Above), respectively, depending on the sign of x.
-// If x is too large to be represented by a float32 (|x| > math.MaxFloat32),
-// the result is (+Inf, Above) or (-Inf, Below), depending on the sign of x.
-func (x *Float) Float32() (float32, Accuracy) {
-	if debugFloat {
-		x.validate()
-	}
-
-	switch x.form {
-	case finite:
-		// 0 < |x| < +Inf
-
-		const (
-			fbits = 32                //        float size
-			mbits = 23                //        mantissa size (excluding implicit msb)
-			ebits = fbits - mbits - 1 //     8  exponent size
-			bias  = 1<<(ebits-1) - 1  //   127  exponent bias
-			dmin  = 1 - bias - mbits  //  -149  smallest unbiased exponent (denormal)
-			emin  = 1 - bias          //  -126  smallest unbiased exponent (normal)
-			emax  = bias              //   127  largest unbiased exponent (normal)
-		)
-
-		// Float mantissa m is 0.5 <= m < 1.0; compute exponent for floatxx mantissa.
-		e := x.exp - 1 // exponent for mantissa m with 1.0 <= m < 2.0
-		p := mbits + 1 // precision of normal float
-
-		// If the exponent is too small, we may have a denormal number
-		// in which case we have fewer mantissa bits available: reduce
-		// precision accordingly.
-		if e < emin {
-			p -= emin - int(e)
-			// Make sure we have at least 1 bit so that we don't
-			// lose numbers rounded up to the smallest denormal.
-			if p < 1 {
-				p = 1
-			}
-		}
-
-		// round
-		var r Float
-		r.prec = uint32(p)
-		r.Set(x)
-		e = r.exp - 1
-
-		// Rounding may have caused r to overflow to ±Inf
-		// (rounding never causes underflows to 0).
-		if r.form == inf {
-			e = emax + 1 // cause overflow below
-		}
-
-		// If the exponent is too large, overflow to ±Inf.
-		if e > emax {
-			// overflow
-			if x.neg {
-				return float32(math.Inf(-1)), Below
-			}
-			return float32(math.Inf(+1)), Above
-		}
-		// e <= emax
-
-		// Determine sign, biased exponent, and mantissa.
-		var sign, bexp, mant uint32
-		if x.neg {
-			sign = 1 << (fbits - 1)
-		}
-
-		// Rounding may have caused a denormal number to
-		// become normal. Check again.
-		if e < emin {
-			// denormal number
-			if e < dmin {
-				// underflow to ±0
-				if x.neg {
-					var z float32
-					return -z, Above
-				}
-				return 0.0, Below
-			}
-			// bexp = 0
-			mant = msb32(r.mant) >> (fbits - r.prec)
-		} else {
-			// normal number: emin <= e <= emax
-			bexp = uint32(e+bias) << mbits
-			mant = msb32(r.mant) >> ebits & (1<<mbits - 1) // cut off msb (implicit 1 bit)
-		}
-
-		return math.Float32frombits(sign | bexp | mant), r.acc
-
-	case zero:
-		if x.neg {
-			var z float32
-			return -z, Exact
-		}
-		return 0.0, Exact
-
-	case inf:
-		if x.neg {
-			return float32(math.Inf(-1)), Exact
-		}
-		return float32(math.Inf(+1)), Exact
-	}
-
-	panic("unreachable")
-}
-
-// Float64 returns the float64 value nearest to x. If x is too small to be
-// represented by a float64 (|x| < math.SmallestNonzeroFloat64), the result
-// is (0, Below) or (-0, Above), respectively, depending on the sign of x.
-// If x is too large to be represented by a float64 (|x| > math.MaxFloat64),
-// the result is (+Inf, Above) or (-Inf, Below), depending on the sign of x.
-func (x *Float) Float64() (float64, Accuracy) {
-	if debugFloat {
-		x.validate()
-	}
-
-	switch x.form {
-	case finite:
-		// 0 < |x| < +Inf
-
-		const (
-			fbits = 64                //        float size
-			mbits = 52                //        mantissa size (excluding implicit msb)
-			ebits = fbits - mbits - 1 //    11  exponent size
-			bias  = 1<<(ebits-1) - 1  //  1023  exponent bias
-			dmin  = 1 - bias - mbits  // -1074  smallest unbiased exponent (denormal)
-			emin  = 1 - bias          // -1022  smallest unbiased exponent (normal)
-			emax  = bias              //  1023  largest unbiased exponent (normal)
-		)
-
-		// Float mantissa m is 0.5 <= m < 1.0; compute exponent for floatxx mantissa.
-		e := x.exp - 1 // exponent for mantissa m with 1.0 <= m < 2.0
-		p := mbits + 1 // precision of normal float
-
-		// If the exponent is too small, we may have a denormal number
-		// in which case we have fewer mantissa bits available: reduce
-		// precision accordingly.
-		if e < emin {
-			p -= emin - int(e)
-			// Make sure we have at least 1 bit so that we don't
-			// lose numbers rounded up to the smallest denormal.
-			if p < 1 {
-				p = 1
-			}
-		}
-
-		// round
-		var r Float
-		r.prec = uint32(p)
-		r.Set(x)
-		e = r.exp - 1
-
-		// Rounding may have caused r to overflow to ±Inf
-		// (rounding never causes underflows to 0).
-		if r.form == inf {
-			e = emax + 1 // cause overflow below
-		}
-
-		// If the exponent is too large, overflow to ±Inf.
-		if e > emax {
-			// overflow
-			if x.neg {
-				return math.Inf(-1), Below
-			}
-			return math.Inf(+1), Above
-		}
-		// e <= emax
-
-		// Determine sign, biased exponent, and mantissa.
-		var sign, bexp, mant uint64
-		if x.neg {
-			sign = 1 << (fbits - 1)
-		}
-
-		// Rounding may have caused a denormal number to
-		// become normal. Check again.
-		if e < emin {
-			// denormal number
-			if e < dmin {
-				// underflow to ±0
-				if x.neg {
-					var z float64
-					return -z, Above
-				}
-				return 0.0, Below
-			}
-			// bexp = 0
-			mant = msb64(r.mant) >> (fbits - r.prec)
-		} else {
-			// normal number: emin <= e <= emax
-			bexp = uint64(e+bias) << mbits
-			mant = msb64(r.mant) >> ebits & (1<<mbits - 1) // cut off msb (implicit 1 bit)
-		}
-
-		return math.Float64frombits(sign | bexp | mant), r.acc
-
-	case zero:
-		if x.neg {
-			var z float64
-			return -z, Exact
-		}
-		return 0.0, Exact
-
-	case inf:
-		if x.neg {
-			return math.Inf(-1), Exact
-		}
-		return math.Inf(+1), Exact
-	}
-
-	panic("unreachable")
-}
-
-// Int returns the result of truncating x towards zero;
-// or nil if x is an infinity.
-// The result is Exact if x.IsInt(); otherwise it is Below
-// for x > 0, and Above for x < 0.
-// If a non-nil *Int argument z is provided, Int stores
-// the result in z instead of allocating a new Int.
-func (x *Float) Int(z *Int) (*Int, Accuracy) {
-	if debugFloat {
-		x.validate()
-	}
-
-	if z == nil && x.form <= finite {
-		z = new(Int)
-	}
-
-	switch x.form {
-	case finite:
-		// 0 < |x| < +Inf
-		acc := makeAcc(x.neg)
-		if x.exp <= 0 {
-			// 0 < |x| < 1
-			return z.SetInt64(0), acc
-		}
-		// x.exp > 0
-
-		// 1 <= |x| < +Inf
-		// determine minimum required precision for x
-		allBits := uint(len(x.mant)) * _W
-		exp := uint(x.exp)
-		if x.MinPrec() <= exp {
-			acc = Exact
-		}
-		// shift mantissa as needed
-		if z == nil {
-			z = new(Int)
-		}
-		z.neg = x.neg
-		switch {
-		case exp > allBits:
-			z.abs = z.abs.shl(x.mant, exp-allBits)
-		default:
-			z.abs = z.abs.set(x.mant)
-		case exp < allBits:
-			z.abs = z.abs.shr(x.mant, allBits-exp)
-		}
-		return z, acc
-
-	case zero:
-		return z.SetInt64(0), Exact
-
-	case inf:
-		return nil, makeAcc(x.neg)
-	}
-
-	panic("unreachable")
-}
-
-// Rat returns the rational number corresponding to x;
-// or nil if x is an infinity.
-// The result is Exact is x is not an Inf.
-// If a non-nil *Rat argument z is provided, Rat stores
-// the result in z instead of allocating a new Rat.
-func (x *Float) Rat(z *Rat) (*Rat, Accuracy) {
-	if debugFloat {
-		x.validate()
-	}
-
-	if z == nil && x.form <= finite {
-		z = new(Rat)
-	}
-
-	switch x.form {
-	case finite:
-		// 0 < |x| < +Inf
-		allBits := int32(len(x.mant)) * _W
-		// build up numerator and denominator
-		z.a.neg = x.neg
-		switch {
-		case x.exp > allBits:
-			z.a.abs = z.a.abs.shl(x.mant, uint(x.exp-allBits))
-			z.b.abs = z.b.abs[:0] // == 1 (see Rat)
-			// z already in normal form
-		default:
-			z.a.abs = z.a.abs.set(x.mant)
-			z.b.abs = z.b.abs[:0] // == 1 (see Rat)
-			// z already in normal form
-		case x.exp < allBits:
-			z.a.abs = z.a.abs.set(x.mant)
-			t := z.b.abs.setUint64(1)
-			z.b.abs = t.shl(t, uint(allBits-x.exp))
-			z.norm()
-		}
-		return z, Exact
-
-	case zero:
-		return z.SetInt64(0), Exact
-
-	case inf:
-		return nil, makeAcc(x.neg)
-	}
-
-	panic("unreachable")
-}
-
-// Abs sets z to the (possibly rounded) value |x| (the absolute value of x)
-// and returns z.
-func (z *Float) Abs(x *Float) *Float {
-	z.Set(x)
-	z.neg = false
-	return z
-}
-
-// Neg sets z to the (possibly rounded) value of x with its sign negated,
-// and returns z.
-func (z *Float) Neg(x *Float) *Float {
-	z.Set(x)
-	z.neg = !z.neg
-	return z
-}
-
-func validateBinaryOperands(x, y *Float) {
-	if !debugFloat {
-		// avoid performance bugs
-		panic("validateBinaryOperands called but debugFloat is not set")
-	}
-	if len(x.mant) == 0 {
-		panic("empty mantissa for x")
-	}
-	if len(y.mant) == 0 {
-		panic("empty mantissa for y")
-	}
-}
-
-// z = x + y, ignoring signs of x and y for the addition
-// but using the sign of z for rounding the result.
-// x and y must have a non-empty mantissa and valid exponent.
-func (z *Float) uadd(x, y *Float) {
-	// Note: This implementation requires 2 shifts most of the
-	// time. It is also inefficient if exponents or precisions
-	// differ by wide margins. The following article describes
-	// an efficient (but much more complicated) implementation
-	// compatible with the internal representation used here:
-	//
-	// Vincent Lefèvre: "The Generic Multiple-Precision Floating-
-	// Point Addition With Exact Rounding (as in the MPFR Library)"
-	// http://www.vinc17.net/research/papers/rnc6.pdf
-
-	if debugFloat {
-		validateBinaryOperands(x, y)
-	}
-
-	// compute exponents ex, ey for mantissa with "binary point"
-	// on the right (mantissa.0) - use int64 to avoid overflow
-	ex := int64(x.exp) - int64(len(x.mant))*_W
-	ey := int64(y.exp) - int64(len(y.mant))*_W
-
-	// TODO(gri) having a combined add-and-shift primitive
-	//           could make this code significantly faster
-	switch {
-	case ex < ey:
-		// cannot re-use z.mant w/o testing for aliasing
-		t := nat(nil).shl(y.mant, uint(ey-ex))
-		z.mant = z.mant.add(x.mant, t)
-	default:
-		// ex == ey, no shift needed
-		z.mant = z.mant.add(x.mant, y.mant)
-	case ex > ey:
-		// cannot re-use z.mant w/o testing for aliasing
-		t := nat(nil).shl(x.mant, uint(ex-ey))
-		z.mant = z.mant.add(t, y.mant)
-		ex = ey
-	}
-	// len(z.mant) > 0
-
-	z.setExpAndRound(ex+int64(len(z.mant))*_W-fnorm(z.mant), 0)
-}
-
-// z = x - y for |x| > |y|, ignoring signs of x and y for the subtraction
-// but using the sign of z for rounding the result.
-// x and y must have a non-empty mantissa and valid exponent.
-func (z *Float) usub(x, y *Float) {
-	// This code is symmetric to uadd.
-	// We have not factored the common code out because
-	// eventually uadd (and usub) should be optimized
-	// by special-casing, and the code will diverge.
-
-	if debugFloat {
-		validateBinaryOperands(x, y)
-	}
-
-	ex := int64(x.exp) - int64(len(x.mant))*_W
-	ey := int64(y.exp) - int64(len(y.mant))*_W
-
-	switch {
-	case ex < ey:
-		// cannot re-use z.mant w/o testing for aliasing
-		t := nat(nil).shl(y.mant, uint(ey-ex))
-		z.mant = t.sub(x.mant, t)
-	default:
-		// ex == ey, no shift needed
-		z.mant = z.mant.sub(x.mant, y.mant)
-	case ex > ey:
-		// cannot re-use z.mant w/o testing for aliasing
-		t := nat(nil).shl(x.mant, uint(ex-ey))
-		z.mant = t.sub(t, y.mant)
-		ex = ey
-	}
-
-	// operands may have cancelled each other out
-	if len(z.mant) == 0 {
-		z.acc = Exact
-		z.form = zero
-		z.neg = false
-		return
-	}
-	// len(z.mant) > 0
-
-	z.setExpAndRound(ex+int64(len(z.mant))*_W-fnorm(z.mant), 0)
-}
-
-// z = x * y, ignoring signs of x and y for the multiplication
-// but using the sign of z for rounding the result.
-// x and y must have a non-empty mantissa and valid exponent.
-func (z *Float) umul(x, y *Float) {
-	if debugFloat {
-		validateBinaryOperands(x, y)
-	}
-
-	// Note: This is doing too much work if the precision
-	// of z is less than the sum of the precisions of x
-	// and y which is often the case (e.g., if all floats
-	// have the same precision).
-	// TODO(gri) Optimize this for the common case.
-
-	e := int64(x.exp) + int64(y.exp)
-	z.mant = z.mant.mul(x.mant, y.mant)
-
-	z.setExpAndRound(e-fnorm(z.mant), 0)
-}
-
-// z = x / y, ignoring signs of x and y for the division
-// but using the sign of z for rounding the result.
-// x and y must have a non-empty mantissa and valid exponent.
-func (z *Float) uquo(x, y *Float) {
-	if debugFloat {
-		validateBinaryOperands(x, y)
-	}
-
-	// mantissa length in words for desired result precision + 1
-	// (at least one extra bit so we get the rounding bit after
-	// the division)
-	n := int(z.prec/_W) + 1
-
-	// compute adjusted x.mant such that we get enough result precision
-	xadj := x.mant
-	if d := n - len(x.mant) + len(y.mant); d > 0 {
-		// d extra words needed => add d "0 digits" to x
-		xadj = make(nat, len(x.mant)+d)
-		copy(xadj[d:], x.mant)
-	}
-	// TODO(gri): If we have too many digits (d < 0), we should be able
-	// to shorten x for faster division. But we must be extra careful
-	// with rounding in that case.
-
-	// Compute d before division since there may be aliasing of x.mant
-	// (via xadj) or y.mant with z.mant.
-	d := len(xadj) - len(y.mant)
-
-	// divide
-	var r nat
-	z.mant, r = z.mant.div(nil, xadj, y.mant)
-	e := int64(x.exp) - int64(y.exp) - int64(d-len(z.mant))*_W
-
-	// The result is long enough to include (at least) the rounding bit.
-	// If there's a non-zero remainder, the corresponding fractional part
-	// (if it were computed), would have a non-zero sticky bit (if it were
-	// zero, it couldn't have a non-zero remainder).
-	var sbit uint
-	if len(r) > 0 {
-		sbit = 1
-	}
-
-	z.setExpAndRound(e-fnorm(z.mant), sbit)
-}
-
-// ucmp returns -1, 0, or +1, depending on whether
-// |x| < |y|, |x| == |y|, or |x| > |y|.
-// x and y must have a non-empty mantissa and valid exponent.
-func (x *Float) ucmp(y *Float) int {
-	if debugFloat {
-		validateBinaryOperands(x, y)
-	}
-
-	switch {
-	case x.exp < y.exp:
-		return -1
-	case x.exp > y.exp:
-		return +1
-	}
-	// x.exp == y.exp
-
-	// compare mantissas
-	i := len(x.mant)
-	j := len(y.mant)
-	for i > 0 || j > 0 {
-		var xm, ym Word
-		if i > 0 {
-			i--
-			xm = x.mant[i]
-		}
-		if j > 0 {
-			j--
-			ym = y.mant[j]
-		}
-		switch {
-		case xm < ym:
-			return -1
-		case xm > ym:
-			return +1
-		}
-	}
-
-	return 0
-}
-
-// Handling of sign bit as defined by IEEE 754-2008, section 6.3:
-//
-// When neither the inputs nor result are NaN, the sign of a product or
-// quotient is the exclusive OR of the operands’ signs; the sign of a sum,
-// or of a difference x−y regarded as a sum x+(−y), differs from at most
-// one of the addends’ signs; and the sign of the result of conversions,
-// the quantize operation, the roundToIntegral operations, and the
-// roundToIntegralExact (see 5.3.1) is the sign of the first or only operand.
-// These rules shall apply even when operands or results are zero or infinite.
-//
-// When the sum of two operands with opposite signs (or the difference of
-// two operands with like signs) is exactly zero, the sign of that sum (or
-// difference) shall be +0 in all rounding-direction attributes except
-// roundTowardNegative; under that attribute, the sign of an exact zero
-// sum (or difference) shall be −0. However, x+x = x−(−x) retains the same
-// sign as x even when x is zero.
-//
-// See also: https://play.golang.org/p/RtH3UCt5IH
-
-// Add sets z to the rounded sum x+y and returns z. If z's precision is 0,
-// it is changed to the larger of x's or y's precision before the operation.
-// Rounding is performed according to z's precision and rounding mode; and
-// z's accuracy reports the result error relative to the exact (not rounded)
-// result. Add panics with ErrNaN if x and y are infinities with opposite
-// signs. The value of z is undefined in that case.
-//
-// BUG(gri) When rounding ToNegativeInf, the sign of Float values rounded to 0 is incorrect.
-func (z *Float) Add(x, y *Float) *Float {
-	if debugFloat {
-		x.validate()
-		y.validate()
-	}
-
-	if z.prec == 0 {
-		z.prec = umax32(x.prec, y.prec)
-	}
-
-	if x.form == finite && y.form == finite {
-		// x + y (commom case)
-		z.neg = x.neg
-		if x.neg == y.neg {
-			// x + y == x + y
-			// (-x) + (-y) == -(x + y)
-			z.uadd(x, y)
-		} else {
-			// x + (-y) == x - y == -(y - x)
-			// (-x) + y == y - x == -(x - y)
-			if x.ucmp(y) > 0 {
-				z.usub(x, y)
-			} else {
-				z.neg = !z.neg
-				z.usub(y, x)
-			}
-		}
-		return z
-	}
-
-	if x.form == inf && y.form == inf && x.neg != y.neg {
-		// +Inf + -Inf
-		// -Inf + +Inf
-		// value of z is undefined but make sure it's valid
-		z.acc = Exact
-		z.form = zero
-		z.neg = false
-		panic(ErrNaN{"addition of infinities with opposite signs"})
-	}
-
-	if x.form == zero && y.form == zero {
-		// ±0 + ±0
-		z.acc = Exact
-		z.form = zero
-		z.neg = x.neg && y.neg // -0 + -0 == -0
-		return z
-	}
-
-	if x.form == inf || y.form == zero {
-		// ±Inf + y
-		// x + ±0
-		return z.Set(x)
-	}
-
-	// ±0 + y
-	// x + ±Inf
-	return z.Set(y)
-}
-
-// Sub sets z to the rounded difference x-y and returns z.
-// Precision, rounding, and accuracy reporting are as for Add.
-// Sub panics with ErrNaN if x and y are infinities with equal
-// signs. The value of z is undefined in that case.
-func (z *Float) Sub(x, y *Float) *Float {
-	if debugFloat {
-		x.validate()
-		y.validate()
-	}
-
-	if z.prec == 0 {
-		z.prec = umax32(x.prec, y.prec)
-	}
-
-	if x.form == finite && y.form == finite {
-		// x - y (common case)
-		z.neg = x.neg
-		if x.neg != y.neg {
-			// x - (-y) == x + y
-			// (-x) - y == -(x + y)
-			z.uadd(x, y)
-		} else {
-			// x - y == x - y == -(y - x)
-			// (-x) - (-y) == y - x == -(x - y)
-			if x.ucmp(y) > 0 {
-				z.usub(x, y)
-			} else {
-				z.neg = !z.neg
-				z.usub(y, x)
-			}
-		}
-		return z
-	}
-
-	if x.form == inf && y.form == inf && x.neg == y.neg {
-		// +Inf - +Inf
-		// -Inf - -Inf
-		// value of z is undefined but make sure it's valid
-		z.acc = Exact
-		z.form = zero
-		z.neg = false
-		panic(ErrNaN{"subtraction of infinities with equal signs"})
-	}
-
-	if x.form == zero && y.form == zero {
-		// ±0 - ±0
-		z.acc = Exact
-		z.form = zero
-		z.neg = x.neg && !y.neg // -0 - +0 == -0
-		return z
-	}
-
-	if x.form == inf || y.form == zero {
-		// ±Inf - y
-		// x - ±0
-		return z.Set(x)
-	}
-
-	// ±0 - y
-	// x - ±Inf
-	return z.Neg(y)
-}
-
-// Mul sets z to the rounded product x*y and returns z.
-// Precision, rounding, and accuracy reporting are as for Add.
-// Mul panics with ErrNaN if one operand is zero and the other
-// operand an infinity. The value of z is undefined in that case.
-func (z *Float) Mul(x, y *Float) *Float {
-	if debugFloat {
-		x.validate()
-		y.validate()
-	}
-
-	if z.prec == 0 {
-		z.prec = umax32(x.prec, y.prec)
-	}
-
-	z.neg = x.neg != y.neg
-
-	if x.form == finite && y.form == finite {
-		// x * y (common case)
-		z.umul(x, y)
-		return z
-	}
-
-	z.acc = Exact
-	if x.form == zero && y.form == inf || x.form == inf && y.form == zero {
-		// ±0 * ±Inf
-		// ±Inf * ±0
-		// value of z is undefined but make sure it's valid
-		z.form = zero
-		z.neg = false
-		panic(ErrNaN{"multiplication of zero with infinity"})
-	}
-
-	if x.form == inf || y.form == inf {
-		// ±Inf * y
-		// x * ±Inf
-		z.form = inf
-		return z
-	}
-
-	// ±0 * y
-	// x * ±0
-	z.form = zero
-	return z
-}
-
-// Quo sets z to the rounded quotient x/y and returns z.
-// Precision, rounding, and accuracy reporting are as for Add.
-// Quo panics with ErrNaN if both operands are zero or infinities.
-// The value of z is undefined in that case.
-func (z *Float) Quo(x, y *Float) *Float {
-	if debugFloat {
-		x.validate()
-		y.validate()
-	}
-
-	if z.prec == 0 {
-		z.prec = umax32(x.prec, y.prec)
-	}
-
-	z.neg = x.neg != y.neg
-
-	if x.form == finite && y.form == finite {
-		// x / y (common case)
-		z.uquo(x, y)
-		return z
-	}
-
-	z.acc = Exact
-	if x.form == zero && y.form == zero || x.form == inf && y.form == inf {
-		// ±0 / ±0
-		// ±Inf / ±Inf
-		// value of z is undefined but make sure it's valid
-		z.form = zero
-		z.neg = false
-		panic(ErrNaN{"division of zero by zero or infinity by infinity"})
-	}
-
-	if x.form == zero || y.form == inf {
-		// ±0 / y
-		// x / ±Inf
-		z.form = zero
-		return z
-	}
-
-	// x / ±0
-	// ±Inf / y
-	z.form = inf
-	return z
-}
-
-// Cmp compares x and y and returns:
-//
-//   -1 if x <  y
-//    0 if x == y (incl. -0 == 0, -Inf == -Inf, and +Inf == +Inf)
-//   +1 if x >  y
-//
-func (x *Float) Cmp(y *Float) int {
-	if debugFloat {
-		x.validate()
-		y.validate()
-	}
-
-	mx := x.ord()
-	my := y.ord()
-	switch {
-	case mx < my:
-		return -1
-	case mx > my:
-		return +1
-	}
-	// mx == my
-
-	// only if |mx| == 1 we have to compare the mantissae
-	switch mx {
-	case -1:
-		return y.ucmp(x)
-	case +1:
-		return x.ucmp(y)
-	}
-
-	return 0
-}
-
-// ord classifies x and returns:
-//
-//	-2 if -Inf == x
-//	-1 if -Inf < x < 0
-//	 0 if x == 0 (signed or unsigned)
-//	+1 if 0 < x < +Inf
-//	+2 if x == +Inf
-//
-func (x *Float) ord() int {
-	var m int
-	switch x.form {
-	case finite:
-		m = 1
-	case zero:
-		return 0
-	case inf:
-		m = 2
-	}
-	if x.neg {
-		m = -m
-	}
-	return m
-}
-
-func umax32(x, y uint32) uint32 {
-	if x > y {
-		return x
-	}
-	return y
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/float_test.go b/third_party/gofrontend/libgo/go/math/big/float_test.go
deleted file mode 100644
index d3b214b..0000000
--- a/third_party/gofrontend/libgo/go/math/big/float_test.go
+++ /dev/null
@@ -1,1694 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package big
-
-import (
-	"fmt"
-	"math"
-	"strconv"
-	"strings"
-	"testing"
-)
-
-// Verify that ErrNaN implements the error interface.
-var _ error = ErrNaN{}
-
-func (x *Float) uint64() uint64 {
-	u, acc := x.Uint64()
-	if acc != Exact {
-		panic(fmt.Sprintf("%s is not a uint64", x.Text('g', 10)))
-	}
-	return u
-}
-
-func (x *Float) int64() int64 {
-	i, acc := x.Int64()
-	if acc != Exact {
-		panic(fmt.Sprintf("%s is not an int64", x.Text('g', 10)))
-	}
-	return i
-}
-
-func TestFloatZeroValue(t *testing.T) {
-	// zero (uninitialized) value is a ready-to-use 0.0
-	var x Float
-	if s := x.Text('f', 1); s != "0.0" {
-		t.Errorf("zero value = %s; want 0.0", s)
-	}
-
-	// zero value has precision 0
-	if prec := x.Prec(); prec != 0 {
-		t.Errorf("prec = %d; want 0", prec)
-	}
-
-	// zero value can be used in any and all positions of binary operations
-	make := func(x int) *Float {
-		var f Float
-		if x != 0 {
-			f.SetInt64(int64(x))
-		}
-		// x == 0 translates into the zero value
-		return &f
-	}
-	for _, test := range []struct {
-		z, x, y, want int
-		opname        rune
-		op            func(z, x, y *Float) *Float
-	}{
-		{0, 0, 0, 0, '+', (*Float).Add},
-		{0, 1, 2, 3, '+', (*Float).Add},
-		{1, 2, 0, 2, '+', (*Float).Add},
-		{2, 0, 1, 1, '+', (*Float).Add},
-
-		{0, 0, 0, 0, '-', (*Float).Sub},
-		{0, 1, 2, -1, '-', (*Float).Sub},
-		{1, 2, 0, 2, '-', (*Float).Sub},
-		{2, 0, 1, -1, '-', (*Float).Sub},
-
-		{0, 0, 0, 0, '*', (*Float).Mul},
-		{0, 1, 2, 2, '*', (*Float).Mul},
-		{1, 2, 0, 0, '*', (*Float).Mul},
-		{2, 0, 1, 0, '*', (*Float).Mul},
-
-		// {0, 0, 0, 0, '/', (*Float).Quo}, // panics
-		{0, 2, 1, 2, '/', (*Float).Quo},
-		{1, 2, 0, 0, '/', (*Float).Quo}, // = +Inf
-		{2, 0, 1, 0, '/', (*Float).Quo},
-	} {
-		z := make(test.z)
-		test.op(z, make(test.x), make(test.y))
-		got := 0
-		if !z.IsInf() {
-			got = int(z.int64())
-		}
-		if got != test.want {
-			t.Errorf("%d %c %d = %d; want %d", test.x, test.opname, test.y, got, test.want)
-		}
-	}
-
-	// TODO(gri) test how precision is set for zero value results
-}
-
-func makeFloat(s string) *Float {
-	x, _, err := ParseFloat(s, 0, 1000, ToNearestEven)
-	if err != nil {
-		panic(err)
-	}
-	return x
-}
-
-func TestFloatSetPrec(t *testing.T) {
-	for _, test := range []struct {
-		x    string
-		prec uint
-		want string
-		acc  Accuracy
-	}{
-		// prec 0
-		{"0", 0, "0", Exact},
-		{"-0", 0, "-0", Exact},
-		{"-Inf", 0, "-Inf", Exact},
-		{"+Inf", 0, "+Inf", Exact},
-		{"123", 0, "0", Below},
-		{"-123", 0, "-0", Above},
-
-		// prec at upper limit
-		{"0", MaxPrec, "0", Exact},
-		{"-0", MaxPrec, "-0", Exact},
-		{"-Inf", MaxPrec, "-Inf", Exact},
-		{"+Inf", MaxPrec, "+Inf", Exact},
-
-		// just a few regular cases - general rounding is tested elsewhere
-		{"1.5", 1, "2", Above},
-		{"-1.5", 1, "-2", Below},
-		{"123", 1e6, "123", Exact},
-		{"-123", 1e6, "-123", Exact},
-	} {
-		x := makeFloat(test.x).SetPrec(test.prec)
-		prec := test.prec
-		if prec > MaxPrec {
-			prec = MaxPrec
-		}
-		if got := x.Prec(); got != prec {
-			t.Errorf("%s.SetPrec(%d).Prec() == %d; want %d", test.x, test.prec, got, prec)
-		}
-		if got, acc := x.String(), x.Acc(); got != test.want || acc != test.acc {
-			t.Errorf("%s.SetPrec(%d) = %s (%s); want %s (%s)", test.x, test.prec, got, acc, test.want, test.acc)
-		}
-	}
-}
-
-func TestFloatMinPrec(t *testing.T) {
-	const max = 100
-	for _, test := range []struct {
-		x    string
-		want uint
-	}{
-		{"0", 0},
-		{"-0", 0},
-		{"+Inf", 0},
-		{"-Inf", 0},
-		{"1", 1},
-		{"2", 1},
-		{"3", 2},
-		{"0x8001", 16},
-		{"0x8001p-1000", 16},
-		{"0x8001p+1000", 16},
-		{"0.1", max},
-	} {
-		x := makeFloat(test.x).SetPrec(max)
-		if got := x.MinPrec(); got != test.want {
-			t.Errorf("%s.MinPrec() = %d; want %d", test.x, got, test.want)
-		}
-	}
-}
-
-func TestFloatSign(t *testing.T) {
-	for _, test := range []struct {
-		x string
-		s int
-	}{
-		{"-Inf", -1},
-		{"-1", -1},
-		{"-0", 0},
-		{"+0", 0},
-		{"+1", +1},
-		{"+Inf", +1},
-	} {
-		x := makeFloat(test.x)
-		s := x.Sign()
-		if s != test.s {
-			t.Errorf("%s.Sign() = %d; want %d", test.x, s, test.s)
-		}
-	}
-}
-
-// alike(x, y) is like x.Cmp(y) == 0 but also considers the sign of 0 (0 != -0).
-func alike(x, y *Float) bool {
-	return x.Cmp(y) == 0 && x.Signbit() == y.Signbit()
-}
-
-func alike32(x, y float32) bool {
-	// we can ignore NaNs
-	return x == y && math.Signbit(float64(x)) == math.Signbit(float64(y))
-
-}
-
-func alike64(x, y float64) bool {
-	// we can ignore NaNs
-	return x == y && math.Signbit(x) == math.Signbit(y)
-
-}
-
-func TestFloatMantExp(t *testing.T) {
-	for _, test := range []struct {
-		x    string
-		mant string
-		exp  int
-	}{
-		{"0", "0", 0},
-		{"+0", "0", 0},
-		{"-0", "-0", 0},
-		{"Inf", "+Inf", 0},
-		{"+Inf", "+Inf", 0},
-		{"-Inf", "-Inf", 0},
-		{"1.5", "0.75", 1},
-		{"1.024e3", "0.5", 11},
-		{"-0.125", "-0.5", -2},
-	} {
-		x := makeFloat(test.x)
-		mant := makeFloat(test.mant)
-		m := new(Float)
-		e := x.MantExp(m)
-		if !alike(m, mant) || e != test.exp {
-			t.Errorf("%s.MantExp() = %s, %d; want %s, %d", test.x, m.Text('g', 10), e, test.mant, test.exp)
-		}
-	}
-}
-
-func TestFloatMantExpAliasing(t *testing.T) {
-	x := makeFloat("0.5p10")
-	if e := x.MantExp(x); e != 10 {
-		t.Fatalf("Float.MantExp aliasing error: got %d; want 10", e)
-	}
-	if want := makeFloat("0.5"); !alike(x, want) {
-		t.Fatalf("Float.MantExp aliasing error: got %s; want %s", x.Text('g', 10), want.Text('g', 10))
-	}
-}
-
-func TestFloatSetMantExp(t *testing.T) {
-	for _, test := range []struct {
-		frac string
-		exp  int
-		z    string
-	}{
-		{"0", 0, "0"},
-		{"+0", 0, "0"},
-		{"-0", 0, "-0"},
-		{"Inf", 1234, "+Inf"},
-		{"+Inf", -1234, "+Inf"},
-		{"-Inf", -1234, "-Inf"},
-		{"0", MinExp, "0"},
-		{"0.25", MinExp, "+0"},    // exponent underflow
-		{"-0.25", MinExp, "-0"},   // exponent underflow
-		{"1", MaxExp, "+Inf"},     // exponent overflow
-		{"2", MaxExp - 1, "+Inf"}, // exponent overflow
-		{"0.75", 1, "1.5"},
-		{"0.5", 11, "1024"},
-		{"-0.5", -2, "-0.125"},
-		{"32", 5, "1024"},
-		{"1024", -10, "1"},
-	} {
-		frac := makeFloat(test.frac)
-		want := makeFloat(test.z)
-		var z Float
-		z.SetMantExp(frac, test.exp)
-		if !alike(&z, want) {
-			t.Errorf("SetMantExp(%s, %d) = %s; want %s", test.frac, test.exp, z.Text('g', 10), test.z)
-		}
-		// test inverse property
-		mant := new(Float)
-		if z.SetMantExp(mant, want.MantExp(mant)).Cmp(want) != 0 {
-			t.Errorf("Inverse property not satisfied: got %s; want %s", z.Text('g', 10), test.z)
-		}
-	}
-}
-
-func TestFloatPredicates(t *testing.T) {
-	for _, test := range []struct {
-		x            string
-		sign         int
-		signbit, inf bool
-	}{
-		{x: "-Inf", sign: -1, signbit: true, inf: true},
-		{x: "-1", sign: -1, signbit: true},
-		{x: "-0", signbit: true},
-		{x: "0"},
-		{x: "1", sign: 1},
-		{x: "+Inf", sign: 1, inf: true},
-	} {
-		x := makeFloat(test.x)
-		if got := x.Signbit(); got != test.signbit {
-			t.Errorf("(%s).Signbit() = %v; want %v", test.x, got, test.signbit)
-		}
-		if got := x.Sign(); got != test.sign {
-			t.Errorf("(%s).Sign() = %d; want %d", test.x, got, test.sign)
-		}
-		if got := x.IsInf(); got != test.inf {
-			t.Errorf("(%s).IsInf() = %v; want %v", test.x, got, test.inf)
-		}
-	}
-}
-
-func TestFloatIsInt(t *testing.T) {
-	for _, test := range []string{
-		"0 int",
-		"-0 int",
-		"1 int",
-		"-1 int",
-		"0.5",
-		"1.23",
-		"1.23e1",
-		"1.23e2 int",
-		"0.000000001e+8",
-		"0.000000001e+9 int",
-		"1.2345e200 int",
-		"Inf",
-		"+Inf",
-		"-Inf",
-	} {
-		s := strings.TrimSuffix(test, " int")
-		want := s != test
-		if got := makeFloat(s).IsInt(); got != want {
-			t.Errorf("%s.IsInt() == %t", s, got)
-		}
-	}
-}
-
-func fromBinary(s string) int64 {
-	x, err := strconv.ParseInt(s, 2, 64)
-	if err != nil {
-		panic(err)
-	}
-	return x
-}
-
-func toBinary(x int64) string {
-	return strconv.FormatInt(x, 2)
-}
-
-func testFloatRound(t *testing.T, x, r int64, prec uint, mode RoundingMode) {
-	// verify test data
-	var ok bool
-	switch mode {
-	case ToNearestEven, ToNearestAway:
-		ok = true // nothing to do for now
-	case ToZero:
-		if x < 0 {
-			ok = r >= x
-		} else {
-			ok = r <= x
-		}
-	case AwayFromZero:
-		if x < 0 {
-			ok = r <= x
-		} else {
-			ok = r >= x
-		}
-	case ToNegativeInf:
-		ok = r <= x
-	case ToPositiveInf:
-		ok = r >= x
-	default:
-		panic("unreachable")
-	}
-	if !ok {
-		t.Fatalf("incorrect test data for prec = %d, %s: x = %s, r = %s", prec, mode, toBinary(x), toBinary(r))
-	}
-
-	// compute expected accuracy
-	a := Exact
-	switch {
-	case r < x:
-		a = Below
-	case r > x:
-		a = Above
-	}
-
-	// round
-	f := new(Float).SetMode(mode).SetInt64(x).SetPrec(prec)
-
-	// check result
-	r1 := f.int64()
-	p1 := f.Prec()
-	a1 := f.Acc()
-	if r1 != r || p1 != prec || a1 != a {
-		t.Errorf("round %s (%d bits, %s) incorrect: got %s (%d bits, %s); want %s (%d bits, %s)",
-			toBinary(x), prec, mode,
-			toBinary(r1), p1, a1,
-			toBinary(r), prec, a)
-		return
-	}
-
-	// g and f should be the same
-	// (rounding by SetPrec after SetInt64 using default precision
-	// should be the same as rounding by SetInt64 after setting the
-	// precision)
-	g := new(Float).SetMode(mode).SetPrec(prec).SetInt64(x)
-	if !alike(g, f) {
-		t.Errorf("round %s (%d bits, %s) not symmetric: got %s and %s; want %s",
-			toBinary(x), prec, mode,
-			toBinary(g.int64()),
-			toBinary(r1),
-			toBinary(r),
-		)
-		return
-	}
-
-	// h and f should be the same
-	// (repeated rounding should be idempotent)
-	h := new(Float).SetMode(mode).SetPrec(prec).Set(f)
-	if !alike(h, f) {
-		t.Errorf("round %s (%d bits, %s) not idempotent: got %s and %s; want %s",
-			toBinary(x), prec, mode,
-			toBinary(h.int64()),
-			toBinary(r1),
-			toBinary(r),
-		)
-		return
-	}
-}
-
-// TestFloatRound tests basic rounding.
-func TestFloatRound(t *testing.T) {
-	for _, test := range []struct {
-		prec                        uint
-		x, zero, neven, naway, away string // input, results rounded to prec bits
-	}{
-		{5, "1000", "1000", "1000", "1000", "1000"},
-		{5, "1001", "1001", "1001", "1001", "1001"},
-		{5, "1010", "1010", "1010", "1010", "1010"},
-		{5, "1011", "1011", "1011", "1011", "1011"},
-		{5, "1100", "1100", "1100", "1100", "1100"},
-		{5, "1101", "1101", "1101", "1101", "1101"},
-		{5, "1110", "1110", "1110", "1110", "1110"},
-		{5, "1111", "1111", "1111", "1111", "1111"},
-
-		{4, "1000", "1000", "1000", "1000", "1000"},
-		{4, "1001", "1001", "1001", "1001", "1001"},
-		{4, "1010", "1010", "1010", "1010", "1010"},
-		{4, "1011", "1011", "1011", "1011", "1011"},
-		{4, "1100", "1100", "1100", "1100", "1100"},
-		{4, "1101", "1101", "1101", "1101", "1101"},
-		{4, "1110", "1110", "1110", "1110", "1110"},
-		{4, "1111", "1111", "1111", "1111", "1111"},
-
-		{3, "1000", "1000", "1000", "1000", "1000"},
-		{3, "1001", "1000", "1000", "1010", "1010"},
-		{3, "1010", "1010", "1010", "1010", "1010"},
-		{3, "1011", "1010", "1100", "1100", "1100"},
-		{3, "1100", "1100", "1100", "1100", "1100"},
-		{3, "1101", "1100", "1100", "1110", "1110"},
-		{3, "1110", "1110", "1110", "1110", "1110"},
-		{3, "1111", "1110", "10000", "10000", "10000"},
-
-		{3, "1000001", "1000000", "1000000", "1000000", "1010000"},
-		{3, "1001001", "1000000", "1010000", "1010000", "1010000"},
-		{3, "1010001", "1010000", "1010000", "1010000", "1100000"},
-		{3, "1011001", "1010000", "1100000", "1100000", "1100000"},
-		{3, "1100001", "1100000", "1100000", "1100000", "1110000"},
-		{3, "1101001", "1100000", "1110000", "1110000", "1110000"},
-		{3, "1110001", "1110000", "1110000", "1110000", "10000000"},
-		{3, "1111001", "1110000", "10000000", "10000000", "10000000"},
-
-		{2, "1000", "1000", "1000", "1000", "1000"},
-		{2, "1001", "1000", "1000", "1000", "1100"},
-		{2, "1010", "1000", "1000", "1100", "1100"},
-		{2, "1011", "1000", "1100", "1100", "1100"},
-		{2, "1100", "1100", "1100", "1100", "1100"},
-		{2, "1101", "1100", "1100", "1100", "10000"},
-		{2, "1110", "1100", "10000", "10000", "10000"},
-		{2, "1111", "1100", "10000", "10000", "10000"},
-
-		{2, "1000001", "1000000", "1000000", "1000000", "1100000"},
-		{2, "1001001", "1000000", "1000000", "1000000", "1100000"},
-		{2, "1010001", "1000000", "1100000", "1100000", "1100000"},
-		{2, "1011001", "1000000", "1100000", "1100000", "1100000"},
-		{2, "1100001", "1100000", "1100000", "1100000", "10000000"},
-		{2, "1101001", "1100000", "1100000", "1100000", "10000000"},
-		{2, "1110001", "1100000", "10000000", "10000000", "10000000"},
-		{2, "1111001", "1100000", "10000000", "10000000", "10000000"},
-
-		{1, "1000", "1000", "1000", "1000", "1000"},
-		{1, "1001", "1000", "1000", "1000", "10000"},
-		{1, "1010", "1000", "1000", "1000", "10000"},
-		{1, "1011", "1000", "1000", "1000", "10000"},
-		{1, "1100", "1000", "10000", "10000", "10000"},
-		{1, "1101", "1000", "10000", "10000", "10000"},
-		{1, "1110", "1000", "10000", "10000", "10000"},
-		{1, "1111", "1000", "10000", "10000", "10000"},
-
-		{1, "1000001", "1000000", "1000000", "1000000", "10000000"},
-		{1, "1001001", "1000000", "1000000", "1000000", "10000000"},
-		{1, "1010001", "1000000", "1000000", "1000000", "10000000"},
-		{1, "1011001", "1000000", "1000000", "1000000", "10000000"},
-		{1, "1100001", "1000000", "10000000", "10000000", "10000000"},
-		{1, "1101001", "1000000", "10000000", "10000000", "10000000"},
-		{1, "1110001", "1000000", "10000000", "10000000", "10000000"},
-		{1, "1111001", "1000000", "10000000", "10000000", "10000000"},
-	} {
-		x := fromBinary(test.x)
-		z := fromBinary(test.zero)
-		e := fromBinary(test.neven)
-		n := fromBinary(test.naway)
-		a := fromBinary(test.away)
-		prec := test.prec
-
-		testFloatRound(t, x, z, prec, ToZero)
-		testFloatRound(t, x, e, prec, ToNearestEven)
-		testFloatRound(t, x, n, prec, ToNearestAway)
-		testFloatRound(t, x, a, prec, AwayFromZero)
-
-		testFloatRound(t, x, z, prec, ToNegativeInf)
-		testFloatRound(t, x, a, prec, ToPositiveInf)
-
-		testFloatRound(t, -x, -a, prec, ToNegativeInf)
-		testFloatRound(t, -x, -z, prec, ToPositiveInf)
-	}
-}
-
-// TestFloatRound24 tests that rounding a float64 to 24 bits
-// matches IEEE-754 rounding to nearest when converting a
-// float64 to a float32 (excluding denormal numbers).
-func TestFloatRound24(t *testing.T) {
-	const x0 = 1<<26 - 0x10 // 11...110000 (26 bits)
-	for d := 0; d <= 0x10; d++ {
-		x := float64(x0 + d)
-		f := new(Float).SetPrec(24).SetFloat64(x)
-		got, _ := f.Float32()
-		want := float32(x)
-		if got != want {
-			t.Errorf("Round(%g, 24) = %g; want %g", x, got, want)
-		}
-	}
-}
-
-func TestFloatSetUint64(t *testing.T) {
-	for _, want := range []uint64{
-		0,
-		1,
-		2,
-		10,
-		100,
-		1<<32 - 1,
-		1 << 32,
-		1<<64 - 1,
-	} {
-		var f Float
-		f.SetUint64(want)
-		if got := f.uint64(); got != want {
-			t.Errorf("got %#x (%s); want %#x", got, f.Text('p', 0), want)
-		}
-	}
-
-	// test basic rounding behavior (exhaustive rounding testing is done elsewhere)
-	const x uint64 = 0x8765432187654321 // 64 bits needed
-	for prec := uint(1); prec <= 64; prec++ {
-		f := new(Float).SetPrec(prec).SetMode(ToZero).SetUint64(x)
-		got := f.uint64()
-		want := x &^ (1<<(64-prec) - 1) // cut off (round to zero) low 64-prec bits
-		if got != want {
-			t.Errorf("got %#x (%s); want %#x", got, f.Text('p', 0), want)
-		}
-	}
-}
-
-func TestFloatSetInt64(t *testing.T) {
-	for _, want := range []int64{
-		0,
-		1,
-		2,
-		10,
-		100,
-		1<<32 - 1,
-		1 << 32,
-		1<<63 - 1,
-	} {
-		for i := range [2]int{} {
-			if i&1 != 0 {
-				want = -want
-			}
-			var f Float
-			f.SetInt64(want)
-			if got := f.int64(); got != want {
-				t.Errorf("got %#x (%s); want %#x", got, f.Text('p', 0), want)
-			}
-		}
-	}
-
-	// test basic rounding behavior (exhaustive rounding testing is done elsewhere)
-	const x int64 = 0x7654321076543210 // 63 bits needed
-	for prec := uint(1); prec <= 63; prec++ {
-		f := new(Float).SetPrec(prec).SetMode(ToZero).SetInt64(x)
-		got := f.int64()
-		want := x &^ (1<<(63-prec) - 1) // cut off (round to zero) low 63-prec bits
-		if got != want {
-			t.Errorf("got %#x (%s); want %#x", got, f.Text('p', 0), want)
-		}
-	}
-}
-
-func TestFloatSetFloat64(t *testing.T) {
-	for _, want := range []float64{
-		0,
-		1,
-		2,
-		12345,
-		1e10,
-		1e100,
-		3.14159265e10,
-		2.718281828e-123,
-		1.0 / 3,
-		math.MaxFloat32,
-		math.MaxFloat64,
-		math.SmallestNonzeroFloat32,
-		math.SmallestNonzeroFloat64,
-		math.Inf(-1),
-		math.Inf(0),
-		-math.Inf(1),
-	} {
-		for i := range [2]int{} {
-			if i&1 != 0 {
-				want = -want
-			}
-			var f Float
-			f.SetFloat64(want)
-			if got, acc := f.Float64(); got != want || acc != Exact {
-				t.Errorf("got %g (%s, %s); want %g (Exact)", got, f.Text('p', 0), acc, want)
-			}
-		}
-	}
-
-	// test basic rounding behavior (exhaustive rounding testing is done elsewhere)
-	const x uint64 = 0x8765432143218 // 53 bits needed
-	for prec := uint(1); prec <= 52; prec++ {
-		f := new(Float).SetPrec(prec).SetMode(ToZero).SetFloat64(float64(x))
-		got, _ := f.Float64()
-		want := float64(x &^ (1<<(52-prec) - 1)) // cut off (round to zero) low 53-prec bits
-		if got != want {
-			t.Errorf("got %g (%s); want %g", got, f.Text('p', 0), want)
-		}
-	}
-
-	// test NaN
-	defer func() {
-		if p, ok := recover().(ErrNaN); !ok {
-			t.Errorf("got %v; want ErrNaN panic", p)
-		}
-	}()
-	var f Float
-	f.SetFloat64(math.NaN())
-	// should not reach here
-	t.Errorf("got %s; want ErrNaN panic", f.Text('p', 0))
-}
-
-func TestFloatSetInt(t *testing.T) {
-	for _, want := range []string{
-		"0",
-		"1",
-		"-1",
-		"1234567890",
-		"123456789012345678901234567890",
-		"123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890",
-	} {
-		var x Int
-		_, ok := x.SetString(want, 0)
-		if !ok {
-			t.Errorf("invalid integer %s", want)
-			continue
-		}
-		n := x.BitLen()
-
-		var f Float
-		f.SetInt(&x)
-
-		// check precision
-		if n < 64 {
-			n = 64
-		}
-		if prec := f.Prec(); prec != uint(n) {
-			t.Errorf("got prec = %d; want %d", prec, n)
-		}
-
-		// check value
-		got := f.Text('g', 100)
-		if got != want {
-			t.Errorf("got %s (%s); want %s", got, f.Text('p', 0), want)
-		}
-	}
-
-	// TODO(gri) test basic rounding behavior
-}
-
-func TestFloatSetRat(t *testing.T) {
-	for _, want := range []string{
-		"0",
-		"1",
-		"-1",
-		"1234567890",
-		"123456789012345678901234567890",
-		"123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890",
-		"1.2",
-		"3.14159265",
-		// TODO(gri) expand
-	} {
-		var x Rat
-		_, ok := x.SetString(want)
-		if !ok {
-			t.Errorf("invalid fraction %s", want)
-			continue
-		}
-		n := max(x.Num().BitLen(), x.Denom().BitLen())
-
-		var f1, f2 Float
-		f2.SetPrec(1000)
-		f1.SetRat(&x)
-		f2.SetRat(&x)
-
-		// check precision when set automatically
-		if n < 64 {
-			n = 64
-		}
-		if prec := f1.Prec(); prec != uint(n) {
-			t.Errorf("got prec = %d; want %d", prec, n)
-		}
-
-		got := f2.Text('g', 100)
-		if got != want {
-			t.Errorf("got %s (%s); want %s", got, f2.Text('p', 0), want)
-		}
-	}
-}
-
-func TestFloatSetInf(t *testing.T) {
-	var f Float
-	for _, test := range []struct {
-		signbit bool
-		prec    uint
-		want    string
-	}{
-		{false, 0, "+Inf"},
-		{true, 0, "-Inf"},
-		{false, 10, "+Inf"},
-		{true, 30, "-Inf"},
-	} {
-		x := f.SetPrec(test.prec).SetInf(test.signbit)
-		if got := x.String(); got != test.want || x.Prec() != test.prec {
-			t.Errorf("SetInf(%v) = %s (prec = %d); want %s (prec = %d)", test.signbit, got, x.Prec(), test.want, test.prec)
-		}
-	}
-}
-
-func TestFloatUint64(t *testing.T) {
-	for _, test := range []struct {
-		x   string
-		out uint64
-		acc Accuracy
-	}{
-		{"-Inf", 0, Above},
-		{"-1", 0, Above},
-		{"-1e-1000", 0, Above},
-		{"-0", 0, Exact},
-		{"0", 0, Exact},
-		{"1e-1000", 0, Below},
-		{"1", 1, Exact},
-		{"1.000000000000000000001", 1, Below},
-		{"12345.0", 12345, Exact},
-		{"12345.000000000000000000001", 12345, Below},
-		{"18446744073709551615", 18446744073709551615, Exact},
-		{"18446744073709551615.000000000000000000001", math.MaxUint64, Below},
-		{"18446744073709551616", math.MaxUint64, Below},
-		{"1e10000", math.MaxUint64, Below},
-		{"+Inf", math.MaxUint64, Below},
-	} {
-		x := makeFloat(test.x)
-		out, acc := x.Uint64()
-		if out != test.out || acc != test.acc {
-			t.Errorf("%s: got %d (%s); want %d (%s)", test.x, out, acc, test.out, test.acc)
-		}
-	}
-}
-
-func TestFloatInt64(t *testing.T) {
-	for _, test := range []struct {
-		x   string
-		out int64
-		acc Accuracy
-	}{
-		{"-Inf", math.MinInt64, Above},
-		{"-1e10000", math.MinInt64, Above},
-		{"-9223372036854775809", math.MinInt64, Above},
-		{"-9223372036854775808.000000000000000000001", math.MinInt64, Above},
-		{"-9223372036854775808", -9223372036854775808, Exact},
-		{"-9223372036854775807.000000000000000000001", -9223372036854775807, Above},
-		{"-9223372036854775807", -9223372036854775807, Exact},
-		{"-12345.000000000000000000001", -12345, Above},
-		{"-12345.0", -12345, Exact},
-		{"-1.000000000000000000001", -1, Above},
-		{"-1.5", -1, Above},
-		{"-1", -1, Exact},
-		{"-1e-1000", 0, Above},
-		{"0", 0, Exact},
-		{"1e-1000", 0, Below},
-		{"1", 1, Exact},
-		{"1.000000000000000000001", 1, Below},
-		{"1.5", 1, Below},
-		{"12345.0", 12345, Exact},
-		{"12345.000000000000000000001", 12345, Below},
-		{"9223372036854775807", 9223372036854775807, Exact},
-		{"9223372036854775807.000000000000000000001", math.MaxInt64, Below},
-		{"9223372036854775808", math.MaxInt64, Below},
-		{"1e10000", math.MaxInt64, Below},
-		{"+Inf", math.MaxInt64, Below},
-	} {
-		x := makeFloat(test.x)
-		out, acc := x.Int64()
-		if out != test.out || acc != test.acc {
-			t.Errorf("%s: got %d (%s); want %d (%s)", test.x, out, acc, test.out, test.acc)
-		}
-	}
-}
-
-func TestFloatFloat32(t *testing.T) {
-	for _, test := range []struct {
-		x   string
-		out float32
-		acc Accuracy
-	}{
-		{"0", 0, Exact},
-
-		// underflow
-		{"1e-1000", 0, Below},
-		{"0x0.000002p-127", 0, Below},
-		{"0x.0000010p-126", 0, Below},
-
-		// denormals
-		{"1.401298464e-45", math.SmallestNonzeroFloat32, Above}, // rounded up to smallest denormal
-		{"0x.ffffff8p-149", math.SmallestNonzeroFloat32, Above}, // rounded up to smallest denormal
-		{"0x.0000018p-126", math.SmallestNonzeroFloat32, Above}, // rounded up to smallest denormal
-		{"0x.0000020p-126", math.SmallestNonzeroFloat32, Exact},
-		{"0x.8p-148", math.SmallestNonzeroFloat32, Exact},
-		{"1p-149", math.SmallestNonzeroFloat32, Exact},
-		{"0x.fffffep-126", math.Float32frombits(0x7fffff), Exact}, // largest denormal
-
-		// normals
-		{"0x.ffffffp-126", math.Float32frombits(0x00800000), Above}, // rounded up to smallest normal
-		{"1p-126", math.Float32frombits(0x00800000), Exact},         // smallest normal
-		{"0x1.fffffep-126", math.Float32frombits(0x00ffffff), Exact},
-		{"0x1.ffffffp-126", math.Float32frombits(0x01000000), Above}, // rounded up
-		{"1", 1, Exact},
-		{"1.000000000000000000001", 1, Below},
-		{"12345.0", 12345, Exact},
-		{"12345.000000000000000000001", 12345, Below},
-		{"0x1.fffffe0p127", math.MaxFloat32, Exact},
-		{"0x1.fffffe8p127", math.MaxFloat32, Below},
-
-		// overflow
-		{"0x1.ffffff0p127", float32(math.Inf(+1)), Above},
-		{"0x1p128", float32(math.Inf(+1)), Above},
-		{"1e10000", float32(math.Inf(+1)), Above},
-		{"0x1.ffffff0p2147483646", float32(math.Inf(+1)), Above}, // overflow in rounding
-
-		// inf
-		{"Inf", float32(math.Inf(+1)), Exact},
-	} {
-		for i := 0; i < 2; i++ {
-			// test both signs
-			tx, tout, tacc := test.x, test.out, test.acc
-			if i != 0 {
-				tx = "-" + tx
-				tout = -tout
-				tacc = -tacc
-			}
-
-			// conversion should match strconv where syntax is agreeable
-			if f, err := strconv.ParseFloat(tx, 32); err == nil && !alike32(float32(f), tout) {
-				t.Errorf("%s: got %g; want %g (incorrect test data)", tx, f, tout)
-			}
-
-			x := makeFloat(tx)
-			out, acc := x.Float32()
-			if !alike32(out, tout) || acc != tacc {
-				t.Errorf("%s: got %g (%#x, %s); want %g (%#x, %s)", tx, out, math.Float32bits(out), acc, test.out, math.Float32bits(test.out), tacc)
-			}
-
-			// test that x.SetFloat64(float64(f)).Float32() == f
-			var x2 Float
-			out2, acc2 := x2.SetFloat64(float64(out)).Float32()
-			if !alike32(out2, out) || acc2 != Exact {
-				t.Errorf("idempotency test: got %g (%s); want %g (Exact)", out2, acc2, out)
-			}
-		}
-	}
-}
-
-func TestFloatFloat64(t *testing.T) {
-	const smallestNormalFloat64 = 2.2250738585072014e-308 // 1p-1022
-	for _, test := range []struct {
-		x   string
-		out float64
-		acc Accuracy
-	}{
-		{"0", 0, Exact},
-
-		// underflow
-		{"1e-1000", 0, Below},
-		{"0x0.0000000000001p-1023", 0, Below},
-		{"0x0.00000000000008p-1022", 0, Below},
-
-		// denormals
-		{"0x0.0000000000000cp-1022", math.SmallestNonzeroFloat64, Above}, // rounded up to smallest denormal
-		{"0x0.0000000000001p-1022", math.SmallestNonzeroFloat64, Exact},  // smallest denormal
-		{"0x.8p-1073", math.SmallestNonzeroFloat64, Exact},
-		{"1p-1074", math.SmallestNonzeroFloat64, Exact},
-		{"0x.fffffffffffffp-1022", math.Float64frombits(0x000fffffffffffff), Exact}, // largest denormal
-
-		// normals
-		{"0x.fffffffffffff8p-1022", math.Float64frombits(0x0010000000000000), Above}, // rounded up to smallest normal
-		{"1p-1022", math.Float64frombits(0x0010000000000000), Exact},                 // smallest normal
-		{"1", 1, Exact},
-		{"1.000000000000000000001", 1, Below},
-		{"12345.0", 12345, Exact},
-		{"12345.000000000000000000001", 12345, Below},
-		{"0x1.fffffffffffff0p1023", math.MaxFloat64, Exact},
-		{"0x1.fffffffffffff4p1023", math.MaxFloat64, Below},
-
-		// overflow
-		{"0x1.fffffffffffff8p1023", math.Inf(+1), Above},
-		{"0x1p1024", math.Inf(+1), Above},
-		{"1e10000", math.Inf(+1), Above},
-		{"0x1.fffffffffffff8p2147483646", math.Inf(+1), Above}, // overflow in rounding
-		{"Inf", math.Inf(+1), Exact},
-
-		// selected denormalized values that were handled incorrectly in the past
-		{"0x.fffffffffffffp-1022", smallestNormalFloat64 - math.SmallestNonzeroFloat64, Exact},
-		{"4503599627370495p-1074", smallestNormalFloat64 - math.SmallestNonzeroFloat64, Exact},
-
-		// http://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/
-		{"2.2250738585072011e-308", 2.225073858507201e-308, Below},
-		// http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
-		{"2.2250738585072012e-308", 2.2250738585072014e-308, Above},
-	} {
-		for i := 0; i < 2; i++ {
-			// test both signs
-			tx, tout, tacc := test.x, test.out, test.acc
-			if i != 0 {
-				tx = "-" + tx
-				tout = -tout
-				tacc = -tacc
-			}
-
-			// conversion should match strconv where syntax is agreeable
-			if f, err := strconv.ParseFloat(tx, 64); err == nil && !alike64(f, tout) {
-				t.Errorf("%s: got %g; want %g (incorrect test data)", tx, f, tout)
-			}
-
-			x := makeFloat(tx)
-			out, acc := x.Float64()
-			if !alike64(out, tout) || acc != tacc {
-				t.Errorf("%s: got %g (%#x, %s); want %g (%#x, %s)", tx, out, math.Float64bits(out), acc, test.out, math.Float64bits(test.out), tacc)
-			}
-
-			// test that x.SetFloat64(f).Float64() == f
-			var x2 Float
-			out2, acc2 := x2.SetFloat64(out).Float64()
-			if !alike64(out2, out) || acc2 != Exact {
-				t.Errorf("idempotency test: got %g (%s); want %g (Exact)", out2, acc2, out)
-			}
-		}
-	}
-}
-
-func TestFloatInt(t *testing.T) {
-	for _, test := range []struct {
-		x    string
-		want string
-		acc  Accuracy
-	}{
-		{"0", "0", Exact},
-		{"+0", "0", Exact},
-		{"-0", "0", Exact},
-		{"Inf", "nil", Below},
-		{"+Inf", "nil", Below},
-		{"-Inf", "nil", Above},
-		{"1", "1", Exact},
-		{"-1", "-1", Exact},
-		{"1.23", "1", Below},
-		{"-1.23", "-1", Above},
-		{"123e-2", "1", Below},
-		{"123e-3", "0", Below},
-		{"123e-4", "0", Below},
-		{"1e-1000", "0", Below},
-		{"-1e-1000", "0", Above},
-		{"1e+10", "10000000000", Exact},
-		{"1e+100", "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Exact},
-	} {
-		x := makeFloat(test.x)
-		res, acc := x.Int(nil)
-		got := "nil"
-		if res != nil {
-			got = res.String()
-		}
-		if got != test.want || acc != test.acc {
-			t.Errorf("%s: got %s (%s); want %s (%s)", test.x, got, acc, test.want, test.acc)
-		}
-	}
-
-	// check that supplied *Int is used
-	for _, f := range []string{"0", "1", "-1", "1234"} {
-		x := makeFloat(f)
-		i := new(Int)
-		if res, _ := x.Int(i); res != i {
-			t.Errorf("(%s).Int is not using supplied *Int", f)
-		}
-	}
-}
-
-func TestFloatRat(t *testing.T) {
-	for _, test := range []struct {
-		x, want string
-		acc     Accuracy
-	}{
-		{"0", "0/1", Exact},
-		{"+0", "0/1", Exact},
-		{"-0", "0/1", Exact},
-		{"Inf", "nil", Below},
-		{"+Inf", "nil", Below},
-		{"-Inf", "nil", Above},
-		{"1", "1/1", Exact},
-		{"-1", "-1/1", Exact},
-		{"1.25", "5/4", Exact},
-		{"-1.25", "-5/4", Exact},
-		{"1e10", "10000000000/1", Exact},
-		{"1p10", "1024/1", Exact},
-		{"-1p-10", "-1/1024", Exact},
-		{"3.14159265", "7244019449799623199/2305843009213693952", Exact},
-	} {
-		x := makeFloat(test.x).SetPrec(64)
-		res, acc := x.Rat(nil)
-		got := "nil"
-		if res != nil {
-			got = res.String()
-		}
-		if got != test.want {
-			t.Errorf("%s: got %s; want %s", test.x, got, test.want)
-			continue
-		}
-		if acc != test.acc {
-			t.Errorf("%s: got %s; want %s", test.x, acc, test.acc)
-			continue
-		}
-
-		// inverse conversion
-		if res != nil {
-			got := new(Float).SetPrec(64).SetRat(res)
-			if got.Cmp(x) != 0 {
-				t.Errorf("%s: got %s; want %s", test.x, got, x)
-			}
-		}
-	}
-
-	// check that supplied *Rat is used
-	for _, f := range []string{"0", "1", "-1", "1234"} {
-		x := makeFloat(f)
-		r := new(Rat)
-		if res, _ := x.Rat(r); res != r {
-			t.Errorf("(%s).Rat is not using supplied *Rat", f)
-		}
-	}
-}
-
-func TestFloatAbs(t *testing.T) {
-	for _, test := range []string{
-		"0",
-		"1",
-		"1234",
-		"1.23e-2",
-		"1e-1000",
-		"1e1000",
-		"Inf",
-	} {
-		p := makeFloat(test)
-		a := new(Float).Abs(p)
-		if !alike(a, p) {
-			t.Errorf("%s: got %s; want %s", test, a.Text('g', 10), test)
-		}
-
-		n := makeFloat("-" + test)
-		a.Abs(n)
-		if !alike(a, p) {
-			t.Errorf("-%s: got %s; want %s", test, a.Text('g', 10), test)
-		}
-	}
-}
-
-func TestFloatNeg(t *testing.T) {
-	for _, test := range []string{
-		"0",
-		"1",
-		"1234",
-		"1.23e-2",
-		"1e-1000",
-		"1e1000",
-		"Inf",
-	} {
-		p1 := makeFloat(test)
-		n1 := makeFloat("-" + test)
-		n2 := new(Float).Neg(p1)
-		p2 := new(Float).Neg(n2)
-		if !alike(n2, n1) {
-			t.Errorf("%s: got %s; want %s", test, n2.Text('g', 10), n1.Text('g', 10))
-		}
-		if !alike(p2, p1) {
-			t.Errorf("%s: got %s; want %s", test, p2.Text('g', 10), p1.Text('g', 10))
-		}
-	}
-}
-
-func TestFloatInc(t *testing.T) {
-	const n = 10
-	for _, prec := range precList {
-		if 1<<prec < n {
-			continue // prec must be large enough to hold all numbers from 0 to n
-		}
-		var x, one Float
-		x.SetPrec(prec)
-		one.SetInt64(1)
-		for i := 0; i < n; i++ {
-			x.Add(&x, &one)
-		}
-		if x.Cmp(new(Float).SetInt64(n)) != 0 {
-			t.Errorf("prec = %d: got %s; want %d", prec, &x, n)
-		}
-	}
-}
-
-// Selected precisions with which to run various tests.
-var precList = [...]uint{1, 2, 5, 8, 10, 16, 23, 24, 32, 50, 53, 64, 100, 128, 500, 511, 512, 513, 1000, 10000}
-
-// Selected bits with which to run various tests.
-// Each entry is a list of bits representing a floating-point number (see fromBits).
-var bitsList = [...]Bits{
-	{},           // = 0
-	{0},          // = 1
-	{1},          // = 2
-	{-1},         // = 1/2
-	{10},         // = 2**10 == 1024
-	{-10},        // = 2**-10 == 1/1024
-	{100, 10, 1}, // = 2**100 + 2**10 + 2**1
-	{0, -1, -2, -10},
-	// TODO(gri) add more test cases
-}
-
-// TestFloatAdd tests Float.Add/Sub by comparing the result of a "manual"
-// addition/subtraction of arguments represented by Bits values with the
-// respective Float addition/subtraction for a variety of precisions
-// and rounding modes.
-func TestFloatAdd(t *testing.T) {
-	for _, xbits := range bitsList {
-		for _, ybits := range bitsList {
-			// exact values
-			x := xbits.Float()
-			y := ybits.Float()
-			zbits := xbits.add(ybits)
-			z := zbits.Float()
-
-			for i, mode := range [...]RoundingMode{ToZero, ToNearestEven, AwayFromZero} {
-				for _, prec := range precList {
-					got := new(Float).SetPrec(prec).SetMode(mode)
-					got.Add(x, y)
-					want := zbits.round(prec, mode)
-					if got.Cmp(want) != 0 {
-						t.Errorf("i = %d, prec = %d, %s:\n\t     %s %v\n\t+    %s %v\n\t=    %s\n\twant %s",
-							i, prec, mode, x, xbits, y, ybits, got, want)
-					}
-
-					got.Sub(z, x)
-					want = ybits.round(prec, mode)
-					if got.Cmp(want) != 0 {
-						t.Errorf("i = %d, prec = %d, %s:\n\t     %s %v\n\t-    %s %v\n\t=    %s\n\twant %s",
-							i, prec, mode, z, zbits, x, xbits, got, want)
-					}
-				}
-			}
-		}
-	}
-}
-
-// TestFloatAdd32 tests that Float.Add/Sub of numbers with
-// 24bit mantissa behaves like float32 addition/subtraction
-// (excluding denormal numbers).
-func TestFloatAdd32(t *testing.T) {
-	// chose base such that we cross the mantissa precision limit
-	const base = 1<<26 - 0x10 // 11...110000 (26 bits)
-	for d := 0; d <= 0x10; d++ {
-		for i := range [2]int{} {
-			x0, y0 := float64(base), float64(d)
-			if i&1 != 0 {
-				x0, y0 = y0, x0
-			}
-
-			x := NewFloat(x0)
-			y := NewFloat(y0)
-			z := new(Float).SetPrec(24)
-
-			z.Add(x, y)
-			got, acc := z.Float32()
-			want := float32(y0) + float32(x0)
-			if got != want || acc != Exact {
-				t.Errorf("d = %d: %g + %g = %g (%s); want %g (Exact)", d, x0, y0, got, acc, want)
-			}
-
-			z.Sub(z, y)
-			got, acc = z.Float32()
-			want = float32(want) - float32(y0)
-			if got != want || acc != Exact {
-				t.Errorf("d = %d: %g - %g = %g (%s); want %g (Exact)", d, x0+y0, y0, got, acc, want)
-			}
-		}
-	}
-}
-
-// TestFloatAdd64 tests that Float.Add/Sub of numbers with
-// 53bit mantissa behaves like float64 addition/subtraction.
-func TestFloatAdd64(t *testing.T) {
-	// chose base such that we cross the mantissa precision limit
-	const base = 1<<55 - 0x10 // 11...110000 (55 bits)
-	for d := 0; d <= 0x10; d++ {
-		for i := range [2]int{} {
-			x0, y0 := float64(base), float64(d)
-			if i&1 != 0 {
-				x0, y0 = y0, x0
-			}
-
-			x := NewFloat(x0)
-			y := NewFloat(y0)
-			z := new(Float).SetPrec(53)
-
-			z.Add(x, y)
-			got, acc := z.Float64()
-			want := x0 + y0
-			if got != want || acc != Exact {
-				t.Errorf("d = %d: %g + %g = %g (%s); want %g (Exact)", d, x0, y0, got, acc, want)
-			}
-
-			z.Sub(z, y)
-			got, acc = z.Float64()
-			want -= y0
-			if got != want || acc != Exact {
-				t.Errorf("d = %d: %g - %g = %g (%s); want %g (Exact)", d, x0+y0, y0, got, acc, want)
-			}
-		}
-	}
-}
-
-// TestFloatMul tests Float.Mul/Quo by comparing the result of a "manual"
-// multiplication/division of arguments represented by Bits values with the
-// respective Float multiplication/division for a variety of precisions
-// and rounding modes.
-func TestFloatMul(t *testing.T) {
-	for _, xbits := range bitsList {
-		for _, ybits := range bitsList {
-			// exact values
-			x := xbits.Float()
-			y := ybits.Float()
-			zbits := xbits.mul(ybits)
-			z := zbits.Float()
-
-			for i, mode := range [...]RoundingMode{ToZero, ToNearestEven, AwayFromZero} {
-				for _, prec := range precList {
-					got := new(Float).SetPrec(prec).SetMode(mode)
-					got.Mul(x, y)
-					want := zbits.round(prec, mode)
-					if got.Cmp(want) != 0 {
-						t.Errorf("i = %d, prec = %d, %s:\n\t     %s %v\n\t*    %s %v\n\t=    %s\n\twant %s",
-							i, prec, mode, x, xbits, y, ybits, got, want)
-					}
-
-					if x.Sign() == 0 {
-						continue // ignore div-0 case (not invertable)
-					}
-					got.Quo(z, x)
-					want = ybits.round(prec, mode)
-					if got.Cmp(want) != 0 {
-						t.Errorf("i = %d, prec = %d, %s:\n\t     %s %v\n\t/    %s %v\n\t=    %s\n\twant %s",
-							i, prec, mode, z, zbits, x, xbits, got, want)
-					}
-				}
-			}
-		}
-	}
-}
-
-// TestFloatMul64 tests that Float.Mul/Quo of numbers with
-// 53bit mantissa behaves like float64 multiplication/division.
-func TestFloatMul64(t *testing.T) {
-	for _, test := range []struct {
-		x, y float64
-	}{
-		{0, 0},
-		{0, 1},
-		{1, 1},
-		{1, 1.5},
-		{1.234, 0.5678},
-		{2.718281828, 3.14159265358979},
-		{2.718281828e10, 3.14159265358979e-32},
-		{1.0 / 3, 1e200},
-	} {
-		for i := range [8]int{} {
-			x0, y0 := test.x, test.y
-			if i&1 != 0 {
-				x0 = -x0
-			}
-			if i&2 != 0 {
-				y0 = -y0
-			}
-			if i&4 != 0 {
-				x0, y0 = y0, x0
-			}
-
-			x := NewFloat(x0)
-			y := NewFloat(y0)
-			z := new(Float).SetPrec(53)
-
-			z.Mul(x, y)
-			got, _ := z.Float64()
-			want := x0 * y0
-			if got != want {
-				t.Errorf("%g * %g = %g; want %g", x0, y0, got, want)
-			}
-
-			if y0 == 0 {
-				continue // avoid division-by-zero
-			}
-			z.Quo(z, y)
-			got, _ = z.Float64()
-			want /= y0
-			if got != want {
-				t.Errorf("%g / %g = %g; want %g", x0*y0, y0, got, want)
-			}
-		}
-	}
-}
-
-func TestIssue6866(t *testing.T) {
-	for _, prec := range precList {
-		two := new(Float).SetPrec(prec).SetInt64(2)
-		one := new(Float).SetPrec(prec).SetInt64(1)
-		three := new(Float).SetPrec(prec).SetInt64(3)
-		msix := new(Float).SetPrec(prec).SetInt64(-6)
-		psix := new(Float).SetPrec(prec).SetInt64(+6)
-
-		p := new(Float).SetPrec(prec)
-		z1 := new(Float).SetPrec(prec)
-		z2 := new(Float).SetPrec(prec)
-
-		// z1 = 2 + 1.0/3*-6
-		p.Quo(one, three)
-		p.Mul(p, msix)
-		z1.Add(two, p)
-
-		// z2 = 2 - 1.0/3*+6
-		p.Quo(one, three)
-		p.Mul(p, psix)
-		z2.Sub(two, p)
-
-		if z1.Cmp(z2) != 0 {
-			t.Fatalf("prec %d: got z1 = %s != z2 = %s; want z1 == z2\n", prec, z1, z2)
-		}
-		if z1.Sign() != 0 {
-			t.Errorf("prec %d: got z1 = %s; want 0", prec, z1)
-		}
-		if z2.Sign() != 0 {
-			t.Errorf("prec %d: got z2 = %s; want 0", prec, z2)
-		}
-	}
-}
-
-func TestFloatQuo(t *testing.T) {
-	// TODO(gri) make the test vary these precisions
-	preci := 200 // precision of integer part
-	precf := 20  // precision of fractional part
-
-	for i := 0; i < 8; i++ {
-		// compute accurate (not rounded) result z
-		bits := Bits{preci - 1}
-		if i&3 != 0 {
-			bits = append(bits, 0)
-		}
-		if i&2 != 0 {
-			bits = append(bits, -1)
-		}
-		if i&1 != 0 {
-			bits = append(bits, -precf)
-		}
-		z := bits.Float()
-
-		// compute accurate x as z*y
-		y := NewFloat(3.14159265358979323e123)
-
-		x := new(Float).SetPrec(z.Prec() + y.Prec()).SetMode(ToZero)
-		x.Mul(z, y)
-
-		// leave for debugging
-		// fmt.Printf("x = %s\ny = %s\nz = %s\n", x, y, z)
-
-		if got := x.Acc(); got != Exact {
-			t.Errorf("got acc = %s; want exact", got)
-		}
-
-		// round accurate z for a variety of precisions and
-		// modes and compare against result of x / y.
-		for _, mode := range [...]RoundingMode{ToZero, ToNearestEven, AwayFromZero} {
-			for d := -5; d < 5; d++ {
-				prec := uint(preci + d)
-				got := new(Float).SetPrec(prec).SetMode(mode).Quo(x, y)
-				want := bits.round(prec, mode)
-				if got.Cmp(want) != 0 {
-					t.Errorf("i = %d, prec = %d, %s:\n\t     %s\n\t/    %s\n\t=    %s\n\twant %s",
-						i, prec, mode, x, y, got, want)
-				}
-			}
-		}
-	}
-}
-
-// TestFloatQuoSmoke tests all divisions x/y for values x, y in the range [-n, +n];
-// it serves as a smoke test for basic correctness of division.
-func TestFloatQuoSmoke(t *testing.T) {
-	n := 1000
-	if testing.Short() {
-		n = 10
-	}
-
-	const dprec = 3         // max. precision variation
-	const prec = 10 + dprec // enough bits to hold n precisely
-	for x := -n; x <= n; x++ {
-		for y := -n; y < n; y++ {
-			if y == 0 {
-				continue
-			}
-
-			a := float64(x)
-			b := float64(y)
-			c := a / b
-
-			// vary operand precision (only ok as long as a, b can be represented correctly)
-			for ad := -dprec; ad <= dprec; ad++ {
-				for bd := -dprec; bd <= dprec; bd++ {
-					A := new(Float).SetPrec(uint(prec + ad)).SetFloat64(a)
-					B := new(Float).SetPrec(uint(prec + bd)).SetFloat64(b)
-					C := new(Float).SetPrec(53).Quo(A, B) // C has float64 mantissa width
-
-					cc, acc := C.Float64()
-					if cc != c {
-						t.Errorf("%g/%g = %s; want %.5g\n", a, b, C.Text('g', 5), c)
-						continue
-					}
-					if acc != Exact {
-						t.Errorf("%g/%g got %s result; want exact result", a, b, acc)
-					}
-				}
-			}
-		}
-	}
-}
-
-// TestFloatArithmeticSpecialValues tests that Float operations produce the
-// correct results for combinations of zero (±0), finite (±1 and ±2.71828),
-// and infinite (±Inf) operands.
-func TestFloatArithmeticSpecialValues(t *testing.T) {
-	zero := 0.0
-	args := []float64{math.Inf(-1), -2.71828, -1, -zero, zero, 1, 2.71828, math.Inf(1)}
-	xx := new(Float)
-	yy := new(Float)
-	got := new(Float)
-	want := new(Float)
-	for i := 0; i < 4; i++ {
-		for _, x := range args {
-			xx.SetFloat64(x)
-			// check conversion is correct
-			// (no need to do this for y, since we see exactly the
-			// same values there)
-			if got, acc := xx.Float64(); got != x || acc != Exact {
-				t.Errorf("Float(%g) == %g (%s)", x, got, acc)
-			}
-			for _, y := range args {
-				yy.SetFloat64(y)
-				var (
-					op string
-					z  float64
-					f  func(z, x, y *Float) *Float
-				)
-				switch i {
-				case 0:
-					op = "+"
-					z = x + y
-					f = (*Float).Add
-				case 1:
-					op = "-"
-					z = x - y
-					f = (*Float).Sub
-				case 2:
-					op = "*"
-					z = x * y
-					f = (*Float).Mul
-				case 3:
-					op = "/"
-					z = x / y
-					f = (*Float).Quo
-				default:
-					panic("unreachable")
-				}
-				var errnan bool // set if execution of f panicked with ErrNaN
-				// protect execution of f
-				func() {
-					defer func() {
-						if p := recover(); p != nil {
-							_ = p.(ErrNaN) // re-panic if not ErrNaN
-							errnan = true
-						}
-					}()
-					f(got, xx, yy)
-				}()
-				if math.IsNaN(z) {
-					if !errnan {
-						t.Errorf("%5g %s %5g = %5s; want ErrNaN panic", x, op, y, got)
-					}
-					continue
-				}
-				if errnan {
-					t.Errorf("%5g %s %5g panicked with ErrNan; want %5s", x, op, y, want)
-					continue
-				}
-				want.SetFloat64(z)
-				if !alike(got, want) {
-					t.Errorf("%5g %s %5g = %5s; want %5s", x, op, y, got, want)
-				}
-			}
-		}
-	}
-}
-
-func TestFloatArithmeticOverflow(t *testing.T) {
-	for _, test := range []struct {
-		prec       uint
-		mode       RoundingMode
-		op         byte
-		x, y, want string
-		acc        Accuracy
-	}{
-		{4, ToNearestEven, '+', "0", "0", "0", Exact},                   // smoke test
-		{4, ToNearestEven, '+', "0x.8p+0", "0x.8p+0", "0x.8p+1", Exact}, // smoke test
-
-		{4, ToNearestEven, '+', "0", "0x.8p2147483647", "0x.8p+2147483647", Exact},
-		{4, ToNearestEven, '+', "0x.8p2147483500", "0x.8p2147483647", "0x.8p+2147483647", Below}, // rounded to zero
-		{4, ToNearestEven, '+', "0x.8p2147483647", "0x.8p2147483647", "+Inf", Above},             // exponent overflow in +
-		{4, ToNearestEven, '+', "-0x.8p2147483647", "-0x.8p2147483647", "-Inf", Below},           // exponent overflow in +
-		{4, ToNearestEven, '-', "-0x.8p2147483647", "0x.8p2147483647", "-Inf", Below},            // exponent overflow in -
-
-		{4, ToZero, '+', "0x.fp2147483647", "0x.8p2147483643", "0x.fp+2147483647", Below}, // rounded to zero
-		{4, ToNearestEven, '+', "0x.fp2147483647", "0x.8p2147483643", "+Inf", Above},      // exponent overflow in rounding
-		{4, AwayFromZero, '+', "0x.fp2147483647", "0x.8p2147483643", "+Inf", Above},       // exponent overflow in rounding
-
-		{4, AwayFromZero, '-', "-0x.fp2147483647", "0x.8p2147483644", "-Inf", Below},        // exponent overflow in rounding
-		{4, ToNearestEven, '-', "-0x.fp2147483647", "0x.8p2147483643", "-Inf", Below},       // exponent overflow in rounding
-		{4, ToZero, '-', "-0x.fp2147483647", "0x.8p2147483643", "-0x.fp+2147483647", Above}, // rounded to zero
-
-		{4, ToNearestEven, '+', "0", "0x.8p-2147483648", "0x.8p-2147483648", Exact},
-		{4, ToNearestEven, '+', "0x.8p-2147483648", "0x.8p-2147483648", "0x.8p-2147483647", Exact},
-
-		{4, ToNearestEven, '*', "1", "0x.8p2147483647", "0x.8p+2147483647", Exact},
-		{4, ToNearestEven, '*', "2", "0x.8p2147483647", "+Inf", Above},  // exponent overflow in *
-		{4, ToNearestEven, '*', "-2", "0x.8p2147483647", "-Inf", Below}, // exponent overflow in *
-
-		{4, ToNearestEven, '/', "0.5", "0x.8p2147483647", "0x.8p-2147483646", Exact},
-		{4, ToNearestEven, '/', "0x.8p+0", "0x.8p2147483647", "0x.8p-2147483646", Exact},
-		{4, ToNearestEven, '/', "0x.8p-1", "0x.8p2147483647", "0x.8p-2147483647", Exact},
-		{4, ToNearestEven, '/', "0x.8p-2", "0x.8p2147483647", "0x.8p-2147483648", Exact},
-		{4, ToNearestEven, '/', "0x.8p-3", "0x.8p2147483647", "0", Below}, // exponent underflow in /
-	} {
-		x := makeFloat(test.x)
-		y := makeFloat(test.y)
-		z := new(Float).SetPrec(test.prec).SetMode(test.mode)
-		switch test.op {
-		case '+':
-			z.Add(x, y)
-		case '-':
-			z.Sub(x, y)
-		case '*':
-			z.Mul(x, y)
-		case '/':
-			z.Quo(x, y)
-		default:
-			panic("unreachable")
-		}
-		if got := z.Text('p', 0); got != test.want || z.Acc() != test.acc {
-			t.Errorf(
-				"prec = %d (%s): %s %c %s = %s (%s); want %s (%s)",
-				test.prec, test.mode, x.Text('p', 0), test.op, y.Text('p', 0), got, z.Acc(), test.want, test.acc,
-			)
-		}
-	}
-}
-
-// TODO(gri) Add tests that check correctness in the presence of aliasing.
-
-// For rounding modes ToNegativeInf and ToPositiveInf, rounding is affected
-// by the sign of the value to be rounded. Test that rounding happens after
-// the sign of a result has been set.
-// This test uses specific values that are known to fail if rounding is
-// "factored" out before setting the result sign.
-func TestFloatArithmeticRounding(t *testing.T) {
-	for _, test := range []struct {
-		mode       RoundingMode
-		prec       uint
-		x, y, want int64
-		op         byte
-	}{
-		{ToZero, 3, -0x8, -0x1, -0x8, '+'},
-		{AwayFromZero, 3, -0x8, -0x1, -0xa, '+'},
-		{ToNegativeInf, 3, -0x8, -0x1, -0xa, '+'},
-
-		{ToZero, 3, -0x8, 0x1, -0x8, '-'},
-		{AwayFromZero, 3, -0x8, 0x1, -0xa, '-'},
-		{ToNegativeInf, 3, -0x8, 0x1, -0xa, '-'},
-
-		{ToZero, 3, -0x9, 0x1, -0x8, '*'},
-		{AwayFromZero, 3, -0x9, 0x1, -0xa, '*'},
-		{ToNegativeInf, 3, -0x9, 0x1, -0xa, '*'},
-
-		{ToZero, 3, -0x9, 0x1, -0x8, '/'},
-		{AwayFromZero, 3, -0x9, 0x1, -0xa, '/'},
-		{ToNegativeInf, 3, -0x9, 0x1, -0xa, '/'},
-	} {
-		var x, y, z Float
-		x.SetInt64(test.x)
-		y.SetInt64(test.y)
-		z.SetPrec(test.prec).SetMode(test.mode)
-		switch test.op {
-		case '+':
-			z.Add(&x, &y)
-		case '-':
-			z.Sub(&x, &y)
-		case '*':
-			z.Mul(&x, &y)
-		case '/':
-			z.Quo(&x, &y)
-		default:
-			panic("unreachable")
-		}
-		if got, acc := z.Int64(); got != test.want || acc != Exact {
-			t.Errorf("%s, %d bits: %d %c %d = %d (%s); want %d (Exact)",
-				test.mode, test.prec, test.x, test.op, test.y, got, acc, test.want,
-			)
-		}
-	}
-}
-
-// TestFloatCmpSpecialValues tests that Cmp produces the correct results for
-// combinations of zero (±0), finite (±1 and ±2.71828), and infinite (±Inf)
-// operands.
-func TestFloatCmpSpecialValues(t *testing.T) {
-	zero := 0.0
-	args := []float64{math.Inf(-1), -2.71828, -1, -zero, zero, 1, 2.71828, math.Inf(1)}
-	xx := new(Float)
-	yy := new(Float)
-	for i := 0; i < 4; i++ {
-		for _, x := range args {
-			xx.SetFloat64(x)
-			// check conversion is correct
-			// (no need to do this for y, since we see exactly the
-			// same values there)
-			if got, acc := xx.Float64(); got != x || acc != Exact {
-				t.Errorf("Float(%g) == %g (%s)", x, got, acc)
-			}
-			for _, y := range args {
-				yy.SetFloat64(y)
-				got := xx.Cmp(yy)
-				want := 0
-				switch {
-				case x < y:
-					want = -1
-				case x > y:
-					want = +1
-				}
-				if got != want {
-					t.Errorf("(%g).Cmp(%g) = %v; want %v", x, y, got, want)
-				}
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/floatconv.go b/third_party/gofrontend/libgo/go/math/big/floatconv.go
deleted file mode 100644
index 4a070ca..0000000
--- a/third_party/gofrontend/libgo/go/math/big/floatconv.go
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements string-to-Float conversion functions.
-
-package big
-
-import (
-	"fmt"
-	"io"
-	"strings"
-)
-
-// SetString sets z to the value of s and returns z and a boolean indicating
-// success. s must be a floating-point number of the same format as accepted
-// by Parse, with base argument 0.
-func (z *Float) SetString(s string) (*Float, bool) {
-	if f, _, err := z.Parse(s, 0); err == nil {
-		return f, true
-	}
-	return nil, false
-}
-
-// scan is like Parse but reads the longest possible prefix representing a valid
-// floating point number from an io.ByteScanner rather than a string. It serves
-// as the implementation of Parse. It does not recognize ±Inf and does not expect
-// EOF at the end.
-func (z *Float) scan(r io.ByteScanner, base int) (f *Float, b int, err error) {
-	prec := z.prec
-	if prec == 0 {
-		prec = 64
-	}
-
-	// A reasonable value in case of an error.
-	z.form = zero
-
-	// sign
-	z.neg, err = scanSign(r)
-	if err != nil {
-		return
-	}
-
-	// mantissa
-	var fcount int // fractional digit count; valid if <= 0
-	z.mant, b, fcount, err = z.mant.scan(r, base, true)
-	if err != nil {
-		return
-	}
-
-	// exponent
-	var exp int64
-	var ebase int
-	exp, ebase, err = scanExponent(r, true)
-	if err != nil {
-		return
-	}
-
-	// special-case 0
-	if len(z.mant) == 0 {
-		z.prec = prec
-		z.acc = Exact
-		z.form = zero
-		f = z
-		return
-	}
-	// len(z.mant) > 0
-
-	// The mantissa may have a decimal point (fcount <= 0) and there
-	// may be a nonzero exponent exp. The decimal point amounts to a
-	// division by b**(-fcount). An exponent means multiplication by
-	// ebase**exp. Finally, mantissa normalization (shift left) requires
-	// a correcting multiplication by 2**(-shiftcount). Multiplications
-	// are commutative, so we can apply them in any order as long as there
-	// is no loss of precision. We only have powers of 2 and 10; keep
-	// track via separate exponents exp2 and exp10.
-
-	// normalize mantissa and get initial binary exponent
-	var exp2 = int64(len(z.mant))*_W - fnorm(z.mant)
-
-	// determine binary or decimal exponent contribution of decimal point
-	var exp10 int64
-	if fcount < 0 {
-		// The mantissa has a "decimal" point ddd.dddd; and
-		// -fcount is the number of digits to the right of '.'.
-		// Adjust relevant exponent accodingly.
-		switch b {
-		case 16:
-			fcount *= 4 // hexadecimal digits are 4 bits each
-			fallthrough
-		case 2:
-			exp2 += int64(fcount)
-		default: // b == 10
-			exp10 = int64(fcount)
-		}
-		// we don't need fcount anymore
-	}
-
-	// take actual exponent into account
-	if ebase == 2 {
-		exp2 += exp
-	} else { // ebase == 10
-		exp10 += exp
-	}
-	// we don't need exp anymore
-
-	// apply 2**exp2
-	if MinExp <= exp2 && exp2 <= MaxExp {
-		z.prec = prec
-		z.form = finite
-		z.exp = int32(exp2)
-		f = z
-	} else {
-		err = fmt.Errorf("exponent overflow")
-		return
-	}
-
-	if exp10 == 0 {
-		// no decimal exponent to consider
-		z.round(0)
-		return
-	}
-	// exp10 != 0
-
-	// apply 10**exp10
-	p := new(Float).SetPrec(z.Prec() + 64) // use more bits for p -- TODO(gri) what is the right number?
-	if exp10 < 0 {
-		z.uquo(z, p.pow10(-exp10))
-	} else {
-		z.umul(z, p.pow10(exp10))
-	}
-
-	return
-}
-
-// These powers of 10 can be represented exactly as a float64.
-var pow10tab = [...]float64{
-	1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
-	1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
-}
-
-// pow10 sets z to 10**n and returns z.
-// n must not be negative.
-func (z *Float) pow10(n int64) *Float {
-	if n < 0 {
-		panic("pow10 called with negative argument")
-	}
-
-	const m = int64(len(pow10tab) - 1)
-	if n <= m {
-		return z.SetFloat64(pow10tab[n])
-	}
-	// n > m
-
-	z.SetFloat64(pow10tab[m])
-	n -= m
-
-	// use more bits for f than for z
-	// TODO(gri) what is the right number?
-	f := new(Float).SetPrec(z.Prec() + 64).SetInt64(10)
-
-	for n > 0 {
-		if n&1 != 0 {
-			z.Mul(z, f)
-		}
-		f.Mul(f, f)
-		n >>= 1
-	}
-
-	return z
-}
-
-// Parse parses s which must contain a text representation of a floating-
-// point number with a mantissa in the given conversion base (the exponent
-// is always a decimal number), or a string representing an infinite value.
-//
-// It sets z to the (possibly rounded) value of the corresponding floating-
-// point value, and returns z, the actual base b, and an error err, if any.
-// If z's precision is 0, it is changed to 64 before rounding takes effect.
-// The number must be of the form:
-//
-//	number   = [ sign ] [ prefix ] mantissa [ exponent ] | infinity .
-//	sign     = "+" | "-" .
-//      prefix   = "0" ( "x" | "X" | "b" | "B" ) .
-//	mantissa = digits | digits "." [ digits ] | "." digits .
-//	exponent = ( "E" | "e" | "p" ) [ sign ] digits .
-//	digits   = digit { digit } .
-//	digit    = "0" ... "9" | "a" ... "z" | "A" ... "Z" .
-//      infinity = [ sign ] ( "inf" | "Inf" ) .
-//
-// The base argument must be 0, 2, 10, or 16. Providing an invalid base
-// argument will lead to a run-time panic.
-//
-// For base 0, the number prefix determines the actual base: A prefix of
-// "0x" or "0X" selects base 16, and a "0b" or "0B" prefix selects
-// base 2; otherwise, the actual base is 10 and no prefix is accepted.
-// The octal prefix "0" is not supported (a leading "0" is simply
-// considered a "0").
-//
-// A "p" exponent indicates a binary (rather then decimal) exponent;
-// for instance "0x1.fffffffffffffp1023" (using base 0) represents the
-// maximum float64 value. For hexadecimal mantissae, the exponent must
-// be binary, if present (an "e" or "E" exponent indicator cannot be
-// distinguished from a mantissa digit).
-//
-// The returned *Float f is nil and the value of z is valid but not
-// defined if an error is reported.
-//
-func (z *Float) Parse(s string, base int) (f *Float, b int, err error) {
-	// scan doesn't handle ±Inf
-	if len(s) == 3 && (s == "Inf" || s == "inf") {
-		f = z.SetInf(false)
-		return
-	}
-	if len(s) == 4 && (s[0] == '+' || s[0] == '-') && (s[1:] == "Inf" || s[1:] == "inf") {
-		f = z.SetInf(s[0] == '-')
-		return
-	}
-
-	r := strings.NewReader(s)
-	if f, b, err = z.scan(r, base); err != nil {
-		return
-	}
-
-	// entire string must have been consumed
-	if ch, err2 := r.ReadByte(); err2 == nil {
-		err = fmt.Errorf("expected end of string, found %q", ch)
-	} else if err2 != io.EOF {
-		err = err2
-	}
-
-	return
-}
-
-// ParseFloat is like f.Parse(s, base) with f set to the given precision
-// and rounding mode.
-func ParseFloat(s string, base int, prec uint, mode RoundingMode) (f *Float, b int, err error) {
-	return new(Float).SetPrec(prec).SetMode(mode).Parse(s, base)
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/floatconv_test.go b/third_party/gofrontend/libgo/go/math/big/floatconv_test.go
deleted file mode 100644
index 4f23953..0000000
--- a/third_party/gofrontend/libgo/go/math/big/floatconv_test.go
+++ /dev/null
@@ -1,573 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package big
-
-import (
-	"fmt"
-	"math"
-	"strconv"
-	"testing"
-)
-
-func TestFloatSetFloat64String(t *testing.T) {
-	inf := math.Inf(0)
-	nan := math.NaN()
-
-	for _, test := range []struct {
-		s string
-		x float64 // NaNs represent invalid inputs
-	}{
-		// basics
-		{"0", 0},
-		{"-0", -0},
-		{"+0", 0},
-		{"1", 1},
-		{"-1", -1},
-		{"+1", 1},
-		{"1.234", 1.234},
-		{"-1.234", -1.234},
-		{"+1.234", 1.234},
-		{".1", 0.1},
-		{"1.", 1},
-		{"+1.", 1},
-
-		// various zeros
-		{"0e100", 0},
-		{"-0e+100", 0},
-		{"+0e-100", 0},
-		{"0E100", 0},
-		{"-0E+100", 0},
-		{"+0E-100", 0},
-
-		// various decimal exponent formats
-		{"1.e10", 1e10},
-		{"1e+10", 1e10},
-		{"+1e-10", 1e-10},
-		{"1E10", 1e10},
-		{"1.E+10", 1e10},
-		{"+1E-10", 1e-10},
-
-		// infinities
-		{"Inf", inf},
-		{"+Inf", inf},
-		{"-Inf", -inf},
-		{"inf", inf},
-		{"+inf", inf},
-		{"-inf", -inf},
-
-		// invalid numbers
-		{"", nan},
-		{"-", nan},
-		{"0x", nan},
-		{"0e", nan},
-		{"1.2ef", nan},
-		{"2..3", nan},
-		{"123..", nan},
-		{"infinity", nan},
-		{"foobar", nan},
-
-		// misc decimal values
-		{"3.14159265", 3.14159265},
-		{"-687436.79457e-245", -687436.79457e-245},
-		{"-687436.79457E245", -687436.79457e245},
-		{".0000000000000000000000000000000000000001", 1e-40},
-		{"+10000000000000000000000000000000000000000e-0", 1e40},
-
-		// decimal mantissa, binary exponent
-		{"0p0", 0},
-		{"-0p0", -0},
-		{"1p10", 1 << 10},
-		{"1p+10", 1 << 10},
-		{"+1p-10", 1.0 / (1 << 10)},
-		{"1024p-12", 0.25},
-		{"-1p10", -1024},
-		{"1.5p1", 3},
-
-		// binary mantissa, decimal exponent
-		{"0b0", 0},
-		{"-0b0", -0},
-		{"0b0e+10", 0},
-		{"-0b0e-10", -0},
-		{"0b1010", 10},
-		{"0B1010E2", 1000},
-		{"0b.1", 0.5},
-		{"0b.001", 0.125},
-		{"0b.001e3", 125},
-
-		// binary mantissa, binary exponent
-		{"0b0p+10", 0},
-		{"-0b0p-10", -0},
-		{"0b.1010p4", 10},
-		{"0b1p-1", 0.5},
-		{"0b001p-3", 0.125},
-		{"0b.001p3", 1},
-		{"0b0.01p2", 1},
-
-		// hexadecimal mantissa and exponent
-		{"0x0", 0},
-		{"-0x0", -0},
-		{"0x0p+10", 0},
-		{"-0x0p-10", -0},
-		{"0xff", 255},
-		{"0X.8p1", 1},
-		{"-0X0.00008p16", -0.5},
-		{"0x0.0000000000001p-1022", math.SmallestNonzeroFloat64},
-		{"0x1.fffffffffffffp1023", math.MaxFloat64},
-	} {
-		var x Float
-		x.SetPrec(53)
-		_, ok := x.SetString(test.s)
-		if math.IsNaN(test.x) {
-			// test.s is invalid
-			if ok {
-				t.Errorf("%s: want parse error", test.s)
-			}
-			continue
-		}
-		// test.s is valid
-		if !ok {
-			t.Errorf("%s: got parse error", test.s)
-			continue
-		}
-		f, _ := x.Float64()
-		want := new(Float).SetFloat64(test.x)
-		if x.Cmp(want) != 0 {
-			t.Errorf("%s: got %s (%v); want %v", test.s, &x, f, test.x)
-		}
-	}
-}
-
-const (
-	below1e23 = 99999999999999974834176
-	above1e23 = 100000000000000008388608
-)
-
-func TestFloat64Text(t *testing.T) {
-	for _, test := range []struct {
-		x      float64
-		format byte
-		prec   int
-		want   string
-	}{
-		{0, 'f', 0, "0"},
-		{math.Copysign(0, -1), 'f', 0, "-0"},
-		{1, 'f', 0, "1"},
-		{-1, 'f', 0, "-1"},
-
-		{0.001, 'e', 0, "1e-03"},
-		{0.459, 'e', 0, "5e-01"},
-		{1.459, 'e', 0, "1e+00"},
-		{2.459, 'e', 1, "2.5e+00"},
-		{3.459, 'e', 2, "3.46e+00"},
-		{4.459, 'e', 3, "4.459e+00"},
-		{5.459, 'e', 4, "5.4590e+00"},
-
-		{0.001, 'f', 0, "0"},
-		{0.459, 'f', 0, "0"},
-		{1.459, 'f', 0, "1"},
-		{2.459, 'f', 1, "2.5"},
-		{3.459, 'f', 2, "3.46"},
-		{4.459, 'f', 3, "4.459"},
-		{5.459, 'f', 4, "5.4590"},
-
-		{0, 'b', 0, "0"},
-		{math.Copysign(0, -1), 'b', 0, "-0"},
-		{1.0, 'b', 0, "4503599627370496p-52"},
-		{-1.0, 'b', 0, "-4503599627370496p-52"},
-		{4503599627370496, 'b', 0, "4503599627370496p+0"},
-
-		{0, 'p', 0, "0"},
-		{math.Copysign(0, -1), 'p', 0, "-0"},
-		{1024.0, 'p', 0, "0x.8p+11"},
-		{-1024.0, 'p', 0, "-0x.8p+11"},
-
-		// all test cases below from strconv/ftoa_test.go
-		{1, 'e', 5, "1.00000e+00"},
-		{1, 'f', 5, "1.00000"},
-		{1, 'g', 5, "1"},
-		// {1, 'g', -1, "1"},
-		// {20, 'g', -1, "20"},
-		// {1234567.8, 'g', -1, "1.2345678e+06"},
-		// {200000, 'g', -1, "200000"},
-		// {2000000, 'g', -1, "2e+06"},
-
-		// g conversion and zero suppression
-		{400, 'g', 2, "4e+02"},
-		{40, 'g', 2, "40"},
-		{4, 'g', 2, "4"},
-		{.4, 'g', 2, "0.4"},
-		{.04, 'g', 2, "0.04"},
-		{.004, 'g', 2, "0.004"},
-		{.0004, 'g', 2, "0.0004"},
-		{.00004, 'g', 2, "4e-05"},
-		{.000004, 'g', 2, "4e-06"},
-
-		{0, 'e', 5, "0.00000e+00"},
-		{0, 'f', 5, "0.00000"},
-		{0, 'g', 5, "0"},
-		// {0, 'g', -1, "0"},
-
-		{-1, 'e', 5, "-1.00000e+00"},
-		{-1, 'f', 5, "-1.00000"},
-		{-1, 'g', 5, "-1"},
-		// {-1, 'g', -1, "-1"},
-
-		{12, 'e', 5, "1.20000e+01"},
-		{12, 'f', 5, "12.00000"},
-		{12, 'g', 5, "12"},
-		// {12, 'g', -1, "12"},
-
-		{123456700, 'e', 5, "1.23457e+08"},
-		{123456700, 'f', 5, "123456700.00000"},
-		{123456700, 'g', 5, "1.2346e+08"},
-		// {123456700, 'g', -1, "1.234567e+08"},
-
-		{1.2345e6, 'e', 5, "1.23450e+06"},
-		{1.2345e6, 'f', 5, "1234500.00000"},
-		{1.2345e6, 'g', 5, "1.2345e+06"},
-
-		{1e23, 'e', 17, "9.99999999999999916e+22"},
-		{1e23, 'f', 17, "99999999999999991611392.00000000000000000"},
-		{1e23, 'g', 17, "9.9999999999999992e+22"},
-
-		// {1e23, 'e', -1, "1e+23"},
-		// {1e23, 'f', -1, "100000000000000000000000"},
-		// {1e23, 'g', -1, "1e+23"},
-
-		{below1e23, 'e', 17, "9.99999999999999748e+22"},
-		{below1e23, 'f', 17, "99999999999999974834176.00000000000000000"},
-		{below1e23, 'g', 17, "9.9999999999999975e+22"},
-
-		// {below1e23, 'e', -1, "9.999999999999997e+22"},
-		// {below1e23, 'f', -1, "99999999999999970000000"},
-		// {below1e23, 'g', -1, "9.999999999999997e+22"},
-
-		{above1e23, 'e', 17, "1.00000000000000008e+23"},
-		{above1e23, 'f', 17, "100000000000000008388608.00000000000000000"},
-		// {above1e23, 'g', 17, "1.0000000000000001e+23"},
-
-		// {above1e23, 'e', -1, "1.0000000000000001e+23"},
-		// {above1e23, 'f', -1, "100000000000000010000000"},
-		// {above1e23, 'g', -1, "1.0000000000000001e+23"},
-
-		// {fdiv(5e-304, 1e20), 'g', -1, "5e-324"},
-		// {fdiv(-5e-304, 1e20), 'g', -1, "-5e-324"},
-
-		// {32, 'g', -1, "32"},
-		// {32, 'g', 0, "3e+01"},
-
-		// {100, 'x', -1, "%x"},
-
-		// {math.NaN(), 'g', -1, "NaN"},
-		// {-math.NaN(), 'g', -1, "NaN"},
-		{math.Inf(0), 'g', -1, "+Inf"},
-		{math.Inf(-1), 'g', -1, "-Inf"},
-		{-math.Inf(0), 'g', -1, "-Inf"},
-
-		{-1, 'b', -1, "-4503599627370496p-52"},
-
-		// fixed bugs
-		{0.9, 'f', 1, "0.9"},
-		{0.09, 'f', 1, "0.1"},
-		{0.0999, 'f', 1, "0.1"},
-		{0.05, 'f', 1, "0.1"},
-		{0.05, 'f', 0, "0"},
-		{0.5, 'f', 1, "0.5"},
-		{0.5, 'f', 0, "0"},
-		{1.5, 'f', 0, "2"},
-
-		// http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
-		// {2.2250738585072012e-308, 'g', -1, "2.2250738585072014e-308"},
-		// http://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/
-		// {2.2250738585072011e-308, 'g', -1, "2.225073858507201e-308"},
-
-		// Issue 2625.
-		{383260575764816448, 'f', 0, "383260575764816448"},
-		// {383260575764816448, 'g', -1, "3.8326057576481645e+17"},
-	} {
-		f := new(Float).SetFloat64(test.x)
-		got := f.Text(test.format, test.prec)
-		if got != test.want {
-			t.Errorf("%v: got %s; want %s", test, got, test.want)
-		}
-
-		if test.format == 'b' && test.x == 0 {
-			continue // 'b' format in strconv.Float requires knowledge of bias for 0.0
-		}
-		if test.format == 'p' {
-			continue // 'p' format not supported in strconv.Format
-		}
-
-		// verify that Float format matches strconv format
-		want := strconv.FormatFloat(test.x, test.format, test.prec, 64)
-		if got != want {
-			t.Errorf("%v: got %s; want %s (strconv)", test, got, want)
-		}
-	}
-}
-
-func TestFloatText(t *testing.T) {
-	for _, test := range []struct {
-		x      string
-		prec   uint
-		format byte
-		digits int
-		want   string
-	}{
-		{"0", 10, 'f', 0, "0"},
-		{"-0", 10, 'f', 0, "-0"},
-		{"1", 10, 'f', 0, "1"},
-		{"-1", 10, 'f', 0, "-1"},
-
-		{"1.459", 100, 'e', 0, "1e+00"},
-		{"2.459", 100, 'e', 1, "2.5e+00"},
-		{"3.459", 100, 'e', 2, "3.46e+00"},
-		{"4.459", 100, 'e', 3, "4.459e+00"},
-		{"5.459", 100, 'e', 4, "5.4590e+00"},
-
-		{"1.459", 100, 'E', 0, "1E+00"},
-		{"2.459", 100, 'E', 1, "2.5E+00"},
-		{"3.459", 100, 'E', 2, "3.46E+00"},
-		{"4.459", 100, 'E', 3, "4.459E+00"},
-		{"5.459", 100, 'E', 4, "5.4590E+00"},
-
-		{"1.459", 100, 'f', 0, "1"},
-		{"2.459", 100, 'f', 1, "2.5"},
-		{"3.459", 100, 'f', 2, "3.46"},
-		{"4.459", 100, 'f', 3, "4.459"},
-		{"5.459", 100, 'f', 4, "5.4590"},
-
-		{"1.459", 100, 'g', 0, "1"},
-		{"2.459", 100, 'g', 1, "2"},
-		{"3.459", 100, 'g', 2, "3.5"},
-		{"4.459", 100, 'g', 3, "4.46"},
-		{"5.459", 100, 'g', 4, "5.459"},
-
-		{"1459", 53, 'g', 0, "1e+03"},
-		{"2459", 53, 'g', 1, "2e+03"},
-		{"3459", 53, 'g', 2, "3.5e+03"},
-		{"4459", 53, 'g', 3, "4.46e+03"},
-		{"5459", 53, 'g', 4, "5459"},
-
-		{"1459", 53, 'G', 0, "1E+03"},
-		{"2459", 53, 'G', 1, "2E+03"},
-		{"3459", 53, 'G', 2, "3.5E+03"},
-		{"4459", 53, 'G', 3, "4.46E+03"},
-		{"5459", 53, 'G', 4, "5459"},
-
-		{"3", 10, 'e', 40, "3.0000000000000000000000000000000000000000e+00"},
-		{"3", 10, 'f', 40, "3.0000000000000000000000000000000000000000"},
-		{"3", 10, 'g', 40, "3"},
-
-		{"3e40", 100, 'e', 40, "3.0000000000000000000000000000000000000000e+40"},
-		{"3e40", 100, 'f', 4, "30000000000000000000000000000000000000000.0000"},
-		{"3e40", 100, 'g', 40, "3e+40"},
-
-		// make sure "stupid" exponents don't stall the machine
-		{"1e1000000", 64, 'p', 0, "0x.88b3a28a05eade3ap+3321929"},
-		{"1e1000000000", 64, 'p', 0, "0x.ecc5f45aa573d3p+1538481529"},
-		{"1e-1000000", 64, 'p', 0, "0x.efb4542cc8ca418ap-3321928"},
-		{"1e-1000000000", 64, 'p', 0, "0x.8a64dd983a4c7dabp-1538481528"},
-
-		// TODO(gri) need tests for actual large Floats
-
-		{"0", 53, 'b', 0, "0"},
-		{"-0", 53, 'b', 0, "-0"},
-		{"1.0", 53, 'b', 0, "4503599627370496p-52"},
-		{"-1.0", 53, 'b', 0, "-4503599627370496p-52"},
-		{"4503599627370496", 53, 'b', 0, "4503599627370496p+0"},
-
-		// issue 9939
-		{"3", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
-		{"03", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
-		{"3.", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
-		{"3.0", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
-		{"3.00", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
-		{"3.000", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
-
-		{"3", 350, 'p', 0, "0x.cp+2"},
-		{"03", 350, 'p', 0, "0x.cp+2"},
-		{"3.", 350, 'p', 0, "0x.cp+2"},
-		{"3.0", 350, 'p', 0, "0x.cp+2"},
-		{"3.00", 350, 'p', 0, "0x.cp+2"},
-		{"3.000", 350, 'p', 0, "0x.cp+2"},
-
-		{"0", 64, 'p', 0, "0"},
-		{"-0", 64, 'p', 0, "-0"},
-		{"1024.0", 64, 'p', 0, "0x.8p+11"},
-		{"-1024.0", 64, 'p', 0, "-0x.8p+11"},
-
-		// unsupported format
-		{"3.14", 64, 'x', 0, "%x"},
-		{"-3.14", 64, 'x', 0, "%x"},
-	} {
-		f, _, err := ParseFloat(test.x, 0, test.prec, ToNearestEven)
-		if err != nil {
-			t.Errorf("%v: %s", test, err)
-			continue
-		}
-
-		got := f.Text(test.format, test.digits)
-		if got != test.want {
-			t.Errorf("%v: got %s; want %s", test, got, test.want)
-		}
-
-		// compare with strconv.FormatFloat output if possible
-		// ('p' format is not supported by strconv.FormatFloat,
-		// and its output for 0.0 prints a biased exponent value
-		// as in 0p-1074 which makes no sense to emulate here)
-		if test.prec == 53 && test.format != 'p' && f.Sign() != 0 {
-			f64, acc := f.Float64()
-			if acc != Exact {
-				t.Errorf("%v: expected exact conversion to float64", test)
-				continue
-			}
-			got := strconv.FormatFloat(f64, test.format, test.digits, 64)
-			if got != test.want {
-				t.Errorf("%v: got %s; want %s", test, got, test.want)
-			}
-		}
-	}
-}
-
-func TestFloatFormat(t *testing.T) {
-	for _, test := range []struct {
-		format string
-		value  interface{} // float32, float64, or string (== 512bit *Float)
-		want   string
-	}{
-		// TODO(gri) uncomment the disabled 'g'/'G' formats
-		// 	     below once (*Float).Text supports prec < 0
-
-		// from fmt/fmt_test.go
-		{"%+.3e", 0.0, "+0.000e+00"},
-		{"%+.3e", 1.0, "+1.000e+00"},
-		{"%+.3f", -1.0, "-1.000"},
-		{"%+.3F", -1.0, "-1.000"},
-		{"%+.3F", float32(-1.0), "-1.000"},
-		{"%+07.2f", 1.0, "+001.00"},
-		{"%+07.2f", -1.0, "-001.00"},
-		{"%+10.2f", +1.0, "     +1.00"},
-		{"%+10.2f", -1.0, "     -1.00"},
-		{"% .3E", -1.0, "-1.000E+00"},
-		{"% .3e", 1.0, " 1.000e+00"},
-		{"%+.3g", 0.0, "+0"},
-		{"%+.3g", 1.0, "+1"},
-		{"%+.3g", -1.0, "-1"},
-		{"% .3g", -1.0, "-1"},
-		{"% .3g", 1.0, " 1"},
-		{"%b", float32(1.0), "8388608p-23"},
-		{"%b", 1.0, "4503599627370496p-52"},
-
-		// from fmt/fmt_test.go: old test/fmt_test.go
-		{"%e", 1.0, "1.000000e+00"},
-		{"%e", 1234.5678e3, "1.234568e+06"},
-		{"%e", 1234.5678e-8, "1.234568e-05"},
-		{"%e", -7.0, "-7.000000e+00"},
-		{"%e", -1e-9, "-1.000000e-09"},
-		{"%f", 1234.5678e3, "1234567.800000"},
-		{"%f", 1234.5678e-8, "0.000012"},
-		{"%f", -7.0, "-7.000000"},
-		{"%f", -1e-9, "-0.000000"},
-		// {"%g", 1234.5678e3, "1.2345678e+06"},
-		// {"%g", float32(1234.5678e3), "1.2345678e+06"},
-		// {"%g", 1234.5678e-8, "1.2345678e-05"},
-		{"%g", -7.0, "-7"},
-		{"%g", -1e-9, "-1e-09"},
-		{"%g", float32(-1e-9), "-1e-09"},
-		{"%E", 1.0, "1.000000E+00"},
-		{"%E", 1234.5678e3, "1.234568E+06"},
-		{"%E", 1234.5678e-8, "1.234568E-05"},
-		{"%E", -7.0, "-7.000000E+00"},
-		{"%E", -1e-9, "-1.000000E-09"},
-		// {"%G", 1234.5678e3, "1.2345678E+06"},
-		// {"%G", float32(1234.5678e3), "1.2345678E+06"},
-		// {"%G", 1234.5678e-8, "1.2345678E-05"},
-		{"%G", -7.0, "-7"},
-		{"%G", -1e-9, "-1E-09"},
-		{"%G", float32(-1e-9), "-1E-09"},
-
-		{"%20.6e", 1.2345e3, "        1.234500e+03"},
-		{"%20.6e", 1.2345e-3, "        1.234500e-03"},
-		{"%20e", 1.2345e3, "        1.234500e+03"},
-		{"%20e", 1.2345e-3, "        1.234500e-03"},
-		{"%20.8e", 1.2345e3, "      1.23450000e+03"},
-		{"%20f", 1.23456789e3, "         1234.567890"},
-		{"%20f", 1.23456789e-3, "            0.001235"},
-		{"%20f", 12345678901.23456789, "  12345678901.234568"},
-		{"%-20f", 1.23456789e3, "1234.567890         "},
-		{"%20.8f", 1.23456789e3, "       1234.56789000"},
-		{"%20.8f", 1.23456789e-3, "          0.00123457"},
-		// {"%g", 1.23456789e3, "1234.56789"},
-		// {"%g", 1.23456789e-3, "0.00123456789"},
-		// {"%g", 1.23456789e20, "1.23456789e+20"},
-		{"%20e", math.Inf(1), "                +Inf"},
-		{"%-20f", math.Inf(-1), "-Inf                "},
-
-		// from fmt/fmt_test.go: comparison of padding rules with C printf
-		{"%.2f", 1.0, "1.00"},
-		{"%.2f", -1.0, "-1.00"},
-		{"% .2f", 1.0, " 1.00"},
-		{"% .2f", -1.0, "-1.00"},
-		{"%+.2f", 1.0, "+1.00"},
-		{"%+.2f", -1.0, "-1.00"},
-		{"%7.2f", 1.0, "   1.00"},
-		{"%7.2f", -1.0, "  -1.00"},
-		{"% 7.2f", 1.0, "   1.00"},
-		{"% 7.2f", -1.0, "  -1.00"},
-		{"%+7.2f", 1.0, "  +1.00"},
-		{"%+7.2f", -1.0, "  -1.00"},
-		{"%07.2f", 1.0, "0001.00"},
-		{"%07.2f", -1.0, "-001.00"},
-		{"% 07.2f", 1.0, " 001.00"},
-		{"% 07.2f", -1.0, "-001.00"},
-		{"%+07.2f", 1.0, "+001.00"},
-		{"%+07.2f", -1.0, "-001.00"},
-
-		// from fmt/fmt_test.go: zero padding does not apply to infinities
-		{"%020f", math.Inf(-1), "                -Inf"},
-		{"%020f", math.Inf(+1), "                +Inf"},
-		{"% 020f", math.Inf(-1), "                -Inf"},
-		{"% 020f", math.Inf(+1), "                 Inf"},
-		{"%+020f", math.Inf(-1), "                -Inf"},
-		{"%+020f", math.Inf(+1), "                +Inf"},
-		{"%20f", -1.0, "           -1.000000"},
-
-		// handle %v like %g
-		{"%v", 0.0, "0"},
-		{"%v", -7.0, "-7"},
-		{"%v", -1e-9, "-1e-09"},
-		{"%v", float32(-1e-9), "-1e-09"},
-		{"%010v", 0.0, "0000000000"},
-		{"%010v", 0.0, "0000000000"},
-
-		// *Float cases
-		{"%.20f", "1e-20", "0.00000000000000000001"},
-		{"%.20f", "-1e-20", "-0.00000000000000000001"},
-		{"%30.20f", "-1e-20", "       -0.00000000000000000001"},
-		{"%030.20f", "-1e-20", "-00000000.00000000000000000001"},
-		{"%030.20f", "+1e-20", "000000000.00000000000000000001"},
-		{"% 030.20f", "+1e-20", " 00000000.00000000000000000001"},
-
-		// erroneous formats
-		{"%s", 1.0, "%!s(*big.Float=1)"},
-	} {
-		value := new(Float)
-		switch v := test.value.(type) {
-		case float32:
-			value.SetPrec(24).SetFloat64(float64(v))
-		case float64:
-			value.SetPrec(53).SetFloat64(v)
-		case string:
-			value.SetPrec(512).Parse(v, 0)
-		default:
-			t.Fatalf("unsupported test value: %v (%T)", v, v)
-		}
-
-		if got := fmt.Sprintf(test.format, value); got != test.want {
-			t.Errorf("%v: got %q; want %q", test, got, test.want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/floatexample_test.go b/third_party/gofrontend/libgo/go/math/big/floatexample_test.go
deleted file mode 100644
index 69686b7..0000000
--- a/third_party/gofrontend/libgo/go/math/big/floatexample_test.go
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package big_test
-
-import (
-	"fmt"
-	"math"
-	"math/big"
-)
-
-func ExampleFloat_Add() {
-	// Operating on numbers of different precision.
-	var x, y, z big.Float
-	x.SetInt64(1000)          // x is automatically set to 64bit precision
-	y.SetFloat64(2.718281828) // y is automatically set to 53bit precision
-	z.SetPrec(32)
-	z.Add(&x, &y)
-	fmt.Printf("x = %.10g (%s, prec = %d, acc = %s)\n", &x, x.Text('p', 0), x.Prec(), x.Acc())
-	fmt.Printf("y = %.10g (%s, prec = %d, acc = %s)\n", &y, y.Text('p', 0), y.Prec(), y.Acc())
-	fmt.Printf("z = %.10g (%s, prec = %d, acc = %s)\n", &z, z.Text('p', 0), z.Prec(), z.Acc())
-	// Output:
-	// x = 1000 (0x.fap+10, prec = 64, acc = Exact)
-	// y = 2.718281828 (0x.adf85458248cd8p+2, prec = 53, acc = Exact)
-	// z = 1002.718282 (0x.faadf854p+10, prec = 32, acc = Below)
-}
-
-func Example_Shift() {
-	// Implementing Float "shift" by modifying the (binary) exponents directly.
-	for s := -5; s <= 5; s++ {
-		x := big.NewFloat(0.5)
-		x.SetMantExp(x, x.MantExp(nil)+s) // shift x by s
-		fmt.Println(x)
-	}
-	// Output:
-	// 0.015625
-	// 0.03125
-	// 0.0625
-	// 0.125
-	// 0.25
-	// 0.5
-	// 1
-	// 2
-	// 4
-	// 8
-	// 16
-}
-
-func ExampleFloat_Cmp() {
-	inf := math.Inf(1)
-	zero := 0.0
-
-	operands := []float64{-inf, -1.2, -zero, 0, +1.2, +inf}
-
-	fmt.Println("   x     y  cmp")
-	fmt.Println("---------------")
-	for _, x64 := range operands {
-		x := big.NewFloat(x64)
-		for _, y64 := range operands {
-			y := big.NewFloat(y64)
-			fmt.Printf("%4g  %4g  %3d\n", x, y, x.Cmp(y))
-		}
-		fmt.Println()
-	}
-
-	// Output:
-	//    x     y  cmp
-	// ---------------
-	// -Inf  -Inf    0
-	// -Inf  -1.2   -1
-	// -Inf    -0   -1
-	// -Inf     0   -1
-	// -Inf   1.2   -1
-	// -Inf  +Inf   -1
-	//
-	// -1.2  -Inf    1
-	// -1.2  -1.2    0
-	// -1.2    -0   -1
-	// -1.2     0   -1
-	// -1.2   1.2   -1
-	// -1.2  +Inf   -1
-	//
-	//   -0  -Inf    1
-	//   -0  -1.2    1
-	//   -0    -0    0
-	//   -0     0    0
-	//   -0   1.2   -1
-	//   -0  +Inf   -1
-	//
-	//    0  -Inf    1
-	//    0  -1.2    1
-	//    0    -0    0
-	//    0     0    0
-	//    0   1.2   -1
-	//    0  +Inf   -1
-	//
-	//  1.2  -Inf    1
-	//  1.2  -1.2    1
-	//  1.2    -0    1
-	//  1.2     0    1
-	//  1.2   1.2    0
-	//  1.2  +Inf   -1
-	//
-	// +Inf  -Inf    1
-	// +Inf  -1.2    1
-	// +Inf    -0    1
-	// +Inf     0    1
-	// +Inf   1.2    1
-	// +Inf  +Inf    0
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/ftoa.go b/third_party/gofrontend/libgo/go/math/big/ftoa.go
deleted file mode 100644
index 5c5f2ce..0000000
--- a/third_party/gofrontend/libgo/go/math/big/ftoa.go
+++ /dev/null
@@ -1,393 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements Float-to-string conversion functions.
-// It is closely following the corresponding implementation
-// in strconv/ftoa.go, but modified and simplified for Float.
-
-package big
-
-import (
-	"fmt"
-	"strconv"
-	"strings"
-)
-
-// Text converts the floating-point number x to a string according
-// to the given format and precision prec. The format is one of:
-//
-//	'e'	-d.dddde±dd, decimal exponent, at least two (possibly 0) exponent digits
-//	'E'	-d.ddddE±dd, decimal exponent, at least two (possibly 0) exponent digits
-//	'f'	-ddddd.dddd, no exponent
-//	'g'	like 'e' for large exponents, like 'f' otherwise
-//	'G'	like 'E' for large exponents, like 'f' otherwise
-//	'b'	-ddddddp±dd, binary exponent
-//	'p'	-0x.dddp±dd, binary exponent, hexadecimal mantissa
-//
-// For the binary exponent formats, the mantissa is printed in normalized form:
-//
-//	'b'	decimal integer mantissa using x.Prec() bits, or -0
-//	'p'	hexadecimal fraction with 0.5 <= 0.mantissa < 1.0, or -0
-//
-// If format is a different character, Text returns a "%" followed by the
-// unrecognized format character.
-//
-// The precision prec controls the number of digits (excluding the exponent)
-// printed by the 'e', 'E', 'f', 'g', and 'G' formats. For 'e', 'E', and 'f'
-// it is the number of digits after the decimal point. For 'g' and 'G' it is
-// the total number of digits. A negative precision selects the smallest
-// number of digits necessary to identify the value x uniquely.
-// The prec value is ignored for the 'b' or 'p' format.
-//
-// BUG(gri) Float.Text does not accept negative precisions (issue #10991).
-func (x *Float) Text(format byte, prec int) string {
-	const extra = 10 // TODO(gri) determine a good/better value here
-	return string(x.Append(make([]byte, 0, prec+extra), format, prec))
-}
-
-// String formats x like x.Text('g', 10).
-func (x *Float) String() string {
-	return x.Text('g', 10)
-}
-
-// Append appends to buf the string form of the floating-point number x,
-// as generated by x.Text, and returns the extended buffer.
-func (x *Float) Append(buf []byte, fmt byte, prec int) []byte {
-	// sign
-	if x.neg {
-		buf = append(buf, '-')
-	}
-
-	// Inf
-	if x.form == inf {
-		if !x.neg {
-			buf = append(buf, '+')
-		}
-		return append(buf, "Inf"...)
-	}
-
-	// pick off easy formats
-	switch fmt {
-	case 'b':
-		return x.fmtB(buf)
-	case 'p':
-		return x.fmtP(buf)
-	}
-
-	// Algorithm:
-	//   1) convert Float to multiprecision decimal
-	//   2) round to desired precision
-	//   3) read digits out and format
-
-	// 1) convert Float to multiprecision decimal
-	var d decimal // == 0.0
-	if x.form == finite {
-		d.init(x.mant, int(x.exp)-x.mant.bitLen())
-	}
-
-	// 2) round to desired precision
-	shortest := false
-	if prec < 0 {
-		shortest = true
-		panic("unimplemented")
-		// TODO(gri) complete this
-		// roundShortest(&d, f.mant, int(f.exp))
-		// Precision for shortest representation mode.
-		switch fmt {
-		case 'e', 'E':
-			prec = len(d.mant) - 1
-		case 'f':
-			prec = max(len(d.mant)-d.exp, 0)
-		case 'g', 'G':
-			prec = len(d.mant)
-		}
-	} else {
-		// round appropriately
-		switch fmt {
-		case 'e', 'E':
-			// one digit before and number of digits after decimal point
-			d.round(1 + prec)
-		case 'f':
-			// number of digits before and after decimal point
-			d.round(d.exp + prec)
-		case 'g', 'G':
-			if prec == 0 {
-				prec = 1
-			}
-			d.round(prec)
-		}
-	}
-
-	// 3) read digits out and format
-	switch fmt {
-	case 'e', 'E':
-		return fmtE(buf, fmt, prec, d)
-	case 'f':
-		return fmtF(buf, prec, d)
-	case 'g', 'G':
-		// trim trailing fractional zeros in %e format
-		eprec := prec
-		if eprec > len(d.mant) && len(d.mant) >= d.exp {
-			eprec = len(d.mant)
-		}
-		// %e is used if the exponent from the conversion
-		// is less than -4 or greater than or equal to the precision.
-		// If precision was the shortest possible, use eprec = 6 for
-		// this decision.
-		if shortest {
-			eprec = 6
-		}
-		exp := d.exp - 1
-		if exp < -4 || exp >= eprec {
-			if prec > len(d.mant) {
-				prec = len(d.mant)
-			}
-			return fmtE(buf, fmt+'e'-'g', prec-1, d)
-		}
-		if prec > d.exp {
-			prec = len(d.mant)
-		}
-		return fmtF(buf, max(prec-d.exp, 0), d)
-	}
-
-	// unknown format
-	if x.neg {
-		buf = buf[:len(buf)-1] // sign was added prematurely - remove it again
-	}
-	return append(buf, '%', fmt)
-}
-
-// %e: d.ddddde±dd
-func fmtE(buf []byte, fmt byte, prec int, d decimal) []byte {
-	// first digit
-	ch := byte('0')
-	if len(d.mant) > 0 {
-		ch = d.mant[0]
-	}
-	buf = append(buf, ch)
-
-	// .moredigits
-	if prec > 0 {
-		buf = append(buf, '.')
-		i := 1
-		m := min(len(d.mant), prec+1)
-		if i < m {
-			buf = append(buf, d.mant[i:m]...)
-			i = m
-		}
-		for ; i <= prec; i++ {
-			buf = append(buf, '0')
-		}
-	}
-
-	// e±
-	buf = append(buf, fmt)
-	var exp int64
-	if len(d.mant) > 0 {
-		exp = int64(d.exp) - 1 // -1 because first digit was printed before '.'
-	}
-	if exp < 0 {
-		ch = '-'
-		exp = -exp
-	} else {
-		ch = '+'
-	}
-	buf = append(buf, ch)
-
-	// dd...d
-	if exp < 10 {
-		buf = append(buf, '0') // at least 2 exponent digits
-	}
-	return strconv.AppendInt(buf, exp, 10)
-}
-
-// %f: ddddddd.ddddd
-func fmtF(buf []byte, prec int, d decimal) []byte {
-	// integer, padded with zeros as needed
-	if d.exp > 0 {
-		m := min(len(d.mant), d.exp)
-		buf = append(buf, d.mant[:m]...)
-		for ; m < d.exp; m++ {
-			buf = append(buf, '0')
-		}
-	} else {
-		buf = append(buf, '0')
-	}
-
-	// fraction
-	if prec > 0 {
-		buf = append(buf, '.')
-		for i := 0; i < prec; i++ {
-			ch := byte('0')
-			if j := d.exp + i; 0 <= j && j < len(d.mant) {
-				ch = d.mant[j]
-			}
-			buf = append(buf, ch)
-		}
-	}
-
-	return buf
-}
-
-// fmtB appends the string of x in the format mantissa "p" exponent
-// with a decimal mantissa and a binary exponent, or 0" if x is zero,
-// and returns the extended buffer.
-// The mantissa is normalized such that is uses x.Prec() bits in binary
-// representation.
-// The sign of x is ignored, and x must not be an Inf.
-func (x *Float) fmtB(buf []byte) []byte {
-	if x.form == zero {
-		return append(buf, '0')
-	}
-
-	if debugFloat && x.form != finite {
-		panic("non-finite float")
-	}
-	// x != 0
-
-	// adjust mantissa to use exactly x.prec bits
-	m := x.mant
-	switch w := uint32(len(x.mant)) * _W; {
-	case w < x.prec:
-		m = nat(nil).shl(m, uint(x.prec-w))
-	case w > x.prec:
-		m = nat(nil).shr(m, uint(w-x.prec))
-	}
-
-	buf = append(buf, m.decimalString()...)
-	buf = append(buf, 'p')
-	e := int64(x.exp) - int64(x.prec)
-	if e >= 0 {
-		buf = append(buf, '+')
-	}
-	return strconv.AppendInt(buf, e, 10)
-}
-
-// fmtP appends the string of x in the format 0x." mantissa "p" exponent
-// with a hexadecimal mantissa and a binary exponent, or 0" if x is zero,
-// ad returns the extended buffer.
-// The mantissa is normalized such that 0.5 <= 0.mantissa < 1.0.
-// The sign of x is ignored, and x must not be an Inf.
-func (x *Float) fmtP(buf []byte) []byte {
-	if x.form == zero {
-		return append(buf, '0')
-	}
-
-	if debugFloat && x.form != finite {
-		panic("non-finite float")
-	}
-	// x != 0
-
-	// remove trailing 0 words early
-	// (no need to convert to hex 0's and trim later)
-	m := x.mant
-	i := 0
-	for i < len(m) && m[i] == 0 {
-		i++
-	}
-	m = m[i:]
-
-	buf = append(buf, "0x."...)
-	buf = append(buf, strings.TrimRight(m.hexString(), "0")...)
-	buf = append(buf, 'p')
-	if x.exp >= 0 {
-		buf = append(buf, '+')
-	}
-	return strconv.AppendInt(buf, int64(x.exp), 10)
-}
-
-func min(x, y int) int {
-	if x < y {
-		return x
-	}
-	return y
-}
-
-// Format implements fmt.Formatter. It accepts all the regular
-// formats for floating-point numbers ('e', 'E', 'f', 'F', 'g',
-// 'G') as well as 'b', 'p', and 'v'. See (*Float).Text for the
-// interpretation of 'b' and 'p'. The 'v' format is handled like
-// 'g'.
-// Format also supports specification of the minimum precision
-// in digits, the output field width, as well as the format verbs
-// '+' and ' ' for sign control, '0' for space or zero padding,
-// and '-' for left or right justification. See the fmt package
-// for details.
-//
-// BUG(gri) A missing precision for the 'g' format, or a negative
-//          (via '*') precision is not yet supported. Instead the
-//          default precision (6) is used in that case (issue #10991).
-func (x *Float) Format(s fmt.State, format rune) {
-	prec, hasPrec := s.Precision()
-	if !hasPrec {
-		prec = 6 // default precision for 'e', 'f'
-	}
-
-	switch format {
-	case 'e', 'E', 'f', 'b', 'p':
-		// nothing to do
-	case 'F':
-		// (*Float).Text doesn't support 'F'; handle like 'f'
-		format = 'f'
-	case 'v':
-		// handle like 'g'
-		format = 'g'
-		fallthrough
-	case 'g', 'G':
-		if !hasPrec {
-			// TODO(gri) uncomment once (*Float).Text handles prec < 0
-			// prec = -1 // default precision for 'g', 'G'
-		}
-	default:
-		fmt.Fprintf(s, "%%!%c(*big.Float=%s)", format, x.String())
-		return
-	}
-	var buf []byte
-	buf = x.Append(buf, byte(format), prec)
-	if len(buf) == 0 {
-		buf = []byte("?") // should never happen, but don't crash
-	}
-	// len(buf) > 0
-
-	var sign string
-	switch {
-	case buf[0] == '-':
-		sign = "-"
-		buf = buf[1:]
-	case buf[0] == '+':
-		// +Inf
-		sign = "+"
-		if s.Flag(' ') {
-			sign = " "
-		}
-		buf = buf[1:]
-	case s.Flag('+'):
-		sign = "+"
-	case s.Flag(' '):
-		sign = " "
-	}
-
-	var padding int
-	if width, hasWidth := s.Width(); hasWidth && width > len(sign)+len(buf) {
-		padding = width - len(sign) - len(buf)
-	}
-
-	switch {
-	case s.Flag('0') && !x.IsInf():
-		// 0-padding on left
-		writeMultiple(s, sign, 1)
-		writeMultiple(s, "0", padding)
-		s.Write(buf)
-	case s.Flag('-'):
-		// padding on right
-		writeMultiple(s, sign, 1)
-		s.Write(buf)
-		writeMultiple(s, " ", padding)
-	default:
-		// padding on left
-		writeMultiple(s, " ", padding)
-		writeMultiple(s, sign, 1)
-		s.Write(buf)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/gcd_test.go b/third_party/gofrontend/libgo/go/math/big/gcd_test.go
deleted file mode 100644
index c0b9f58..0000000
--- a/third_party/gofrontend/libgo/go/math/big/gcd_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements a GCD benchmark.
-// Usage: go test math/big -test.bench GCD
-
-package big
-
-import (
-	"math/rand"
-	"testing"
-)
-
-// randInt returns a pseudo-random Int in the range [1<<(size-1), (1<<size) - 1]
-func randInt(r *rand.Rand, size uint) *Int {
-	n := new(Int).Lsh(intOne, size-1)
-	x := new(Int).Rand(r, n)
-	return x.Add(x, n) // make sure result > 1<<(size-1)
-}
-
-func runGCD(b *testing.B, aSize, bSize uint) {
-	b.StopTimer()
-	var r = rand.New(rand.NewSource(1234))
-	aa := randInt(r, aSize)
-	bb := randInt(r, bSize)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		new(Int).GCD(nil, nil, aa, bb)
-	}
-}
-
-func BenchmarkGCD10x10(b *testing.B)         { runGCD(b, 10, 10) }
-func BenchmarkGCD10x100(b *testing.B)        { runGCD(b, 10, 100) }
-func BenchmarkGCD10x1000(b *testing.B)       { runGCD(b, 10, 1000) }
-func BenchmarkGCD10x10000(b *testing.B)      { runGCD(b, 10, 10000) }
-func BenchmarkGCD10x100000(b *testing.B)     { runGCD(b, 10, 100000) }
-func BenchmarkGCD100x100(b *testing.B)       { runGCD(b, 100, 100) }
-func BenchmarkGCD100x1000(b *testing.B)      { runGCD(b, 100, 1000) }
-func BenchmarkGCD100x10000(b *testing.B)     { runGCD(b, 100, 10000) }
-func BenchmarkGCD100x100000(b *testing.B)    { runGCD(b, 100, 100000) }
-func BenchmarkGCD1000x1000(b *testing.B)     { runGCD(b, 1000, 1000) }
-func BenchmarkGCD1000x10000(b *testing.B)    { runGCD(b, 1000, 10000) }
-func BenchmarkGCD1000x100000(b *testing.B)   { runGCD(b, 1000, 100000) }
-func BenchmarkGCD10000x10000(b *testing.B)   { runGCD(b, 10000, 10000) }
-func BenchmarkGCD10000x100000(b *testing.B)  { runGCD(b, 10000, 100000) }
-func BenchmarkGCD100000x100000(b *testing.B) { runGCD(b, 100000, 100000) }
diff --git a/third_party/gofrontend/libgo/go/math/big/hilbert_test.go b/third_party/gofrontend/libgo/go/math/big/hilbert_test.go
deleted file mode 100644
index 1a84341..0000000
--- a/third_party/gofrontend/libgo/go/math/big/hilbert_test.go
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// A little test program and benchmark for rational arithmetics.
-// Computes a Hilbert matrix, its inverse, multiplies them
-// and verifies that the product is the identity matrix.
-
-package big
-
-import (
-	"fmt"
-	"testing"
-)
-
-type matrix struct {
-	n, m int
-	a    []*Rat
-}
-
-func (a *matrix) at(i, j int) *Rat {
-	if !(0 <= i && i < a.n && 0 <= j && j < a.m) {
-		panic("index out of range")
-	}
-	return a.a[i*a.m+j]
-}
-
-func (a *matrix) set(i, j int, x *Rat) {
-	if !(0 <= i && i < a.n && 0 <= j && j < a.m) {
-		panic("index out of range")
-	}
-	a.a[i*a.m+j] = x
-}
-
-func newMatrix(n, m int) *matrix {
-	if !(0 <= n && 0 <= m) {
-		panic("illegal matrix")
-	}
-	a := new(matrix)
-	a.n = n
-	a.m = m
-	a.a = make([]*Rat, n*m)
-	return a
-}
-
-func newUnit(n int) *matrix {
-	a := newMatrix(n, n)
-	for i := 0; i < n; i++ {
-		for j := 0; j < n; j++ {
-			x := NewRat(0, 1)
-			if i == j {
-				x.SetInt64(1)
-			}
-			a.set(i, j, x)
-		}
-	}
-	return a
-}
-
-func newHilbert(n int) *matrix {
-	a := newMatrix(n, n)
-	for i := 0; i < n; i++ {
-		for j := 0; j < n; j++ {
-			a.set(i, j, NewRat(1, int64(i+j+1)))
-		}
-	}
-	return a
-}
-
-func newInverseHilbert(n int) *matrix {
-	a := newMatrix(n, n)
-	for i := 0; i < n; i++ {
-		for j := 0; j < n; j++ {
-			x1 := new(Rat).SetInt64(int64(i + j + 1))
-			x2 := new(Rat).SetInt(new(Int).Binomial(int64(n+i), int64(n-j-1)))
-			x3 := new(Rat).SetInt(new(Int).Binomial(int64(n+j), int64(n-i-1)))
-			x4 := new(Rat).SetInt(new(Int).Binomial(int64(i+j), int64(i)))
-
-			x1.Mul(x1, x2)
-			x1.Mul(x1, x3)
-			x1.Mul(x1, x4)
-			x1.Mul(x1, x4)
-
-			if (i+j)&1 != 0 {
-				x1.Neg(x1)
-			}
-
-			a.set(i, j, x1)
-		}
-	}
-	return a
-}
-
-func (a *matrix) mul(b *matrix) *matrix {
-	if a.m != b.n {
-		panic("illegal matrix multiply")
-	}
-	c := newMatrix(a.n, b.m)
-	for i := 0; i < c.n; i++ {
-		for j := 0; j < c.m; j++ {
-			x := NewRat(0, 1)
-			for k := 0; k < a.m; k++ {
-				x.Add(x, new(Rat).Mul(a.at(i, k), b.at(k, j)))
-			}
-			c.set(i, j, x)
-		}
-	}
-	return c
-}
-
-func (a *matrix) eql(b *matrix) bool {
-	if a.n != b.n || a.m != b.m {
-		return false
-	}
-	for i := 0; i < a.n; i++ {
-		for j := 0; j < a.m; j++ {
-			if a.at(i, j).Cmp(b.at(i, j)) != 0 {
-				return false
-			}
-		}
-	}
-	return true
-}
-
-func (a *matrix) String() string {
-	s := ""
-	for i := 0; i < a.n; i++ {
-		for j := 0; j < a.m; j++ {
-			s += fmt.Sprintf("\t%s", a.at(i, j))
-		}
-		s += "\n"
-	}
-	return s
-}
-
-func doHilbert(t *testing.T, n int) {
-	a := newHilbert(n)
-	b := newInverseHilbert(n)
-	I := newUnit(n)
-	ab := a.mul(b)
-	if !ab.eql(I) {
-		if t == nil {
-			panic("Hilbert failed")
-		}
-		t.Errorf("a   = %s\n", a)
-		t.Errorf("b   = %s\n", b)
-		t.Errorf("a*b = %s\n", ab)
-		t.Errorf("I   = %s\n", I)
-	}
-}
-
-func TestHilbert(t *testing.T) {
-	doHilbert(t, 10)
-}
-
-func BenchmarkHilbert(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		doHilbert(nil, 10)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/int.go b/third_party/gofrontend/libgo/go/math/big/int.go
deleted file mode 100644
index 65334e0..0000000
--- a/third_party/gofrontend/libgo/go/math/big/int.go
+++ /dev/null
@@ -1,968 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements signed multi-precision integers.
-
-package big
-
-import (
-	"fmt"
-	"io"
-	"math/rand"
-	"strings"
-)
-
-// An Int represents a signed multi-precision integer.
-// The zero value for an Int represents the value 0.
-type Int struct {
-	neg bool // sign
-	abs nat  // absolute value of the integer
-}
-
-var intOne = &Int{false, natOne}
-
-// Sign returns:
-//
-//	-1 if x <  0
-//	 0 if x == 0
-//	+1 if x >  0
-//
-func (x *Int) Sign() int {
-	if len(x.abs) == 0 {
-		return 0
-	}
-	if x.neg {
-		return -1
-	}
-	return 1
-}
-
-// SetInt64 sets z to x and returns z.
-func (z *Int) SetInt64(x int64) *Int {
-	neg := false
-	if x < 0 {
-		neg = true
-		x = -x
-	}
-	z.abs = z.abs.setUint64(uint64(x))
-	z.neg = neg
-	return z
-}
-
-// SetUint64 sets z to x and returns z.
-func (z *Int) SetUint64(x uint64) *Int {
-	z.abs = z.abs.setUint64(x)
-	z.neg = false
-	return z
-}
-
-// NewInt allocates and returns a new Int set to x.
-func NewInt(x int64) *Int {
-	return new(Int).SetInt64(x)
-}
-
-// Set sets z to x and returns z.
-func (z *Int) Set(x *Int) *Int {
-	if z != x {
-		z.abs = z.abs.set(x.abs)
-		z.neg = x.neg
-	}
-	return z
-}
-
-// Bits provides raw (unchecked but fast) access to x by returning its
-// absolute value as a little-endian Word slice. The result and x share
-// the same underlying array.
-// Bits is intended to support implementation of missing low-level Int
-// functionality outside this package; it should be avoided otherwise.
-func (x *Int) Bits() []Word {
-	return x.abs
-}
-
-// SetBits provides raw (unchecked but fast) access to z by setting its
-// value to abs, interpreted as a little-endian Word slice, and returning
-// z. The result and abs share the same underlying array.
-// SetBits is intended to support implementation of missing low-level Int
-// functionality outside this package; it should be avoided otherwise.
-func (z *Int) SetBits(abs []Word) *Int {
-	z.abs = nat(abs).norm()
-	z.neg = false
-	return z
-}
-
-// Abs sets z to |x| (the absolute value of x) and returns z.
-func (z *Int) Abs(x *Int) *Int {
-	z.Set(x)
-	z.neg = false
-	return z
-}
-
-// Neg sets z to -x and returns z.
-func (z *Int) Neg(x *Int) *Int {
-	z.Set(x)
-	z.neg = len(z.abs) > 0 && !z.neg // 0 has no sign
-	return z
-}
-
-// Add sets z to the sum x+y and returns z.
-func (z *Int) Add(x, y *Int) *Int {
-	neg := x.neg
-	if x.neg == y.neg {
-		// x + y == x + y
-		// (-x) + (-y) == -(x + y)
-		z.abs = z.abs.add(x.abs, y.abs)
-	} else {
-		// x + (-y) == x - y == -(y - x)
-		// (-x) + y == y - x == -(x - y)
-		if x.abs.cmp(y.abs) >= 0 {
-			z.abs = z.abs.sub(x.abs, y.abs)
-		} else {
-			neg = !neg
-			z.abs = z.abs.sub(y.abs, x.abs)
-		}
-	}
-	z.neg = len(z.abs) > 0 && neg // 0 has no sign
-	return z
-}
-
-// Sub sets z to the difference x-y and returns z.
-func (z *Int) Sub(x, y *Int) *Int {
-	neg := x.neg
-	if x.neg != y.neg {
-		// x - (-y) == x + y
-		// (-x) - y == -(x + y)
-		z.abs = z.abs.add(x.abs, y.abs)
-	} else {
-		// x - y == x - y == -(y - x)
-		// (-x) - (-y) == y - x == -(x - y)
-		if x.abs.cmp(y.abs) >= 0 {
-			z.abs = z.abs.sub(x.abs, y.abs)
-		} else {
-			neg = !neg
-			z.abs = z.abs.sub(y.abs, x.abs)
-		}
-	}
-	z.neg = len(z.abs) > 0 && neg // 0 has no sign
-	return z
-}
-
-// Mul sets z to the product x*y and returns z.
-func (z *Int) Mul(x, y *Int) *Int {
-	// x * y == x * y
-	// x * (-y) == -(x * y)
-	// (-x) * y == -(x * y)
-	// (-x) * (-y) == x * y
-	z.abs = z.abs.mul(x.abs, y.abs)
-	z.neg = len(z.abs) > 0 && x.neg != y.neg // 0 has no sign
-	return z
-}
-
-// MulRange sets z to the product of all integers
-// in the range [a, b] inclusively and returns z.
-// If a > b (empty range), the result is 1.
-func (z *Int) MulRange(a, b int64) *Int {
-	switch {
-	case a > b:
-		return z.SetInt64(1) // empty range
-	case a <= 0 && b >= 0:
-		return z.SetInt64(0) // range includes 0
-	}
-	// a <= b && (b < 0 || a > 0)
-
-	neg := false
-	if a < 0 {
-		neg = (b-a)&1 == 0
-		a, b = -b, -a
-	}
-
-	z.abs = z.abs.mulRange(uint64(a), uint64(b))
-	z.neg = neg
-	return z
-}
-
-// Binomial sets z to the binomial coefficient of (n, k) and returns z.
-func (z *Int) Binomial(n, k int64) *Int {
-	// reduce the number of multiplications by reducing k
-	if n/2 < k && k <= n {
-		k = n - k // Binomial(n, k) == Binomial(n, n-k)
-	}
-	var a, b Int
-	a.MulRange(n-k+1, n)
-	b.MulRange(1, k)
-	return z.Quo(&a, &b)
-}
-
-// Quo sets z to the quotient x/y for y != 0 and returns z.
-// If y == 0, a division-by-zero run-time panic occurs.
-// Quo implements truncated division (like Go); see QuoRem for more details.
-func (z *Int) Quo(x, y *Int) *Int {
-	z.abs, _ = z.abs.div(nil, x.abs, y.abs)
-	z.neg = len(z.abs) > 0 && x.neg != y.neg // 0 has no sign
-	return z
-}
-
-// Rem sets z to the remainder x%y for y != 0 and returns z.
-// If y == 0, a division-by-zero run-time panic occurs.
-// Rem implements truncated modulus (like Go); see QuoRem for more details.
-func (z *Int) Rem(x, y *Int) *Int {
-	_, z.abs = nat(nil).div(z.abs, x.abs, y.abs)
-	z.neg = len(z.abs) > 0 && x.neg // 0 has no sign
-	return z
-}
-
-// QuoRem sets z to the quotient x/y and r to the remainder x%y
-// and returns the pair (z, r) for y != 0.
-// If y == 0, a division-by-zero run-time panic occurs.
-//
-// QuoRem implements T-division and modulus (like Go):
-//
-//	q = x/y      with the result truncated to zero
-//	r = x - y*q
-//
-// (See Daan Leijen, ``Division and Modulus for Computer Scientists''.)
-// See DivMod for Euclidean division and modulus (unlike Go).
-//
-func (z *Int) QuoRem(x, y, r *Int) (*Int, *Int) {
-	z.abs, r.abs = z.abs.div(r.abs, x.abs, y.abs)
-	z.neg, r.neg = len(z.abs) > 0 && x.neg != y.neg, len(r.abs) > 0 && x.neg // 0 has no sign
-	return z, r
-}
-
-// Div sets z to the quotient x/y for y != 0 and returns z.
-// If y == 0, a division-by-zero run-time panic occurs.
-// Div implements Euclidean division (unlike Go); see DivMod for more details.
-func (z *Int) Div(x, y *Int) *Int {
-	y_neg := y.neg // z may be an alias for y
-	var r Int
-	z.QuoRem(x, y, &r)
-	if r.neg {
-		if y_neg {
-			z.Add(z, intOne)
-		} else {
-			z.Sub(z, intOne)
-		}
-	}
-	return z
-}
-
-// Mod sets z to the modulus x%y for y != 0 and returns z.
-// If y == 0, a division-by-zero run-time panic occurs.
-// Mod implements Euclidean modulus (unlike Go); see DivMod for more details.
-func (z *Int) Mod(x, y *Int) *Int {
-	y0 := y // save y
-	if z == y || alias(z.abs, y.abs) {
-		y0 = new(Int).Set(y)
-	}
-	var q Int
-	q.QuoRem(x, y, z)
-	if z.neg {
-		if y0.neg {
-			z.Sub(z, y0)
-		} else {
-			z.Add(z, y0)
-		}
-	}
-	return z
-}
-
-// DivMod sets z to the quotient x div y and m to the modulus x mod y
-// and returns the pair (z, m) for y != 0.
-// If y == 0, a division-by-zero run-time panic occurs.
-//
-// DivMod implements Euclidean division and modulus (unlike Go):
-//
-//	q = x div y  such that
-//	m = x - y*q  with 0 <= m < |q|
-//
-// (See Raymond T. Boute, ``The Euclidean definition of the functions
-// div and mod''. ACM Transactions on Programming Languages and
-// Systems (TOPLAS), 14(2):127-144, New York, NY, USA, 4/1992.
-// ACM press.)
-// See QuoRem for T-division and modulus (like Go).
-//
-func (z *Int) DivMod(x, y, m *Int) (*Int, *Int) {
-	y0 := y // save y
-	if z == y || alias(z.abs, y.abs) {
-		y0 = new(Int).Set(y)
-	}
-	z.QuoRem(x, y, m)
-	if m.neg {
-		if y0.neg {
-			z.Add(z, intOne)
-			m.Sub(m, y0)
-		} else {
-			z.Sub(z, intOne)
-			m.Add(m, y0)
-		}
-	}
-	return z, m
-}
-
-// Cmp compares x and y and returns:
-//
-//   -1 if x <  y
-//    0 if x == y
-//   +1 if x >  y
-//
-func (x *Int) Cmp(y *Int) (r int) {
-	// x cmp y == x cmp y
-	// x cmp (-y) == x
-	// (-x) cmp y == y
-	// (-x) cmp (-y) == -(x cmp y)
-	switch {
-	case x.neg == y.neg:
-		r = x.abs.cmp(y.abs)
-		if x.neg {
-			r = -r
-		}
-	case x.neg:
-		r = -1
-	default:
-		r = 1
-	}
-	return
-}
-
-// low32 returns the least significant 32 bits of z.
-func low32(z nat) uint32 {
-	if len(z) == 0 {
-		return 0
-	}
-	return uint32(z[0])
-}
-
-// low64 returns the least significant 64 bits of z.
-func low64(z nat) uint64 {
-	if len(z) == 0 {
-		return 0
-	}
-	v := uint64(z[0])
-	if _W == 32 && len(z) > 1 {
-		v |= uint64(z[1]) << 32
-	}
-	return v
-}
-
-// Int64 returns the int64 representation of x.
-// If x cannot be represented in an int64, the result is undefined.
-func (x *Int) Int64() int64 {
-	v := int64(low64(x.abs))
-	if x.neg {
-		v = -v
-	}
-	return v
-}
-
-// Uint64 returns the uint64 representation of x.
-// If x cannot be represented in a uint64, the result is undefined.
-func (x *Int) Uint64() uint64 {
-	return low64(x.abs)
-}
-
-// SetString sets z to the value of s, interpreted in the given base,
-// and returns z and a boolean indicating success. If SetString fails,
-// the value of z is undefined but the returned value is nil.
-//
-// The base argument must be 0 or a value between 2 and MaxBase. If the base
-// is 0, the string prefix determines the actual conversion base. A prefix of
-// ``0x'' or ``0X'' selects base 16; the ``0'' prefix selects base 8, and a
-// ``0b'' or ``0B'' prefix selects base 2. Otherwise the selected base is 10.
-//
-func (z *Int) SetString(s string, base int) (*Int, bool) {
-	r := strings.NewReader(s)
-	_, _, err := z.scan(r, base)
-	if err != nil {
-		return nil, false
-	}
-	_, err = r.ReadByte()
-	if err != io.EOF {
-		return nil, false
-	}
-	return z, true // err == io.EOF => scan consumed all of s
-}
-
-// SetBytes interprets buf as the bytes of a big-endian unsigned
-// integer, sets z to that value, and returns z.
-func (z *Int) SetBytes(buf []byte) *Int {
-	z.abs = z.abs.setBytes(buf)
-	z.neg = false
-	return z
-}
-
-// Bytes returns the absolute value of x as a big-endian byte slice.
-func (x *Int) Bytes() []byte {
-	buf := make([]byte, len(x.abs)*_S)
-	return buf[x.abs.bytes(buf):]
-}
-
-// BitLen returns the length of the absolute value of x in bits.
-// The bit length of 0 is 0.
-func (x *Int) BitLen() int {
-	return x.abs.bitLen()
-}
-
-// Exp sets z = x**y mod |m| (i.e. the sign of m is ignored), and returns z.
-// If y <= 0, the result is 1 mod |m|; if m == nil or m == 0, z = x**y.
-// See Knuth, volume 2, section 4.6.3.
-func (z *Int) Exp(x, y, m *Int) *Int {
-	var yWords nat
-	if !y.neg {
-		yWords = y.abs
-	}
-	// y >= 0
-
-	var mWords nat
-	if m != nil {
-		mWords = m.abs // m.abs may be nil for m == 0
-	}
-
-	z.abs = z.abs.expNN(x.abs, yWords, mWords)
-	z.neg = len(z.abs) > 0 && x.neg && len(yWords) > 0 && yWords[0]&1 == 1 // 0 has no sign
-	if z.neg && len(mWords) > 0 {
-		// make modulus result positive
-		z.abs = z.abs.sub(mWords, z.abs) // z == x**y mod |m| && 0 <= z < |m|
-		z.neg = false
-	}
-
-	return z
-}
-
-// GCD sets z to the greatest common divisor of a and b, which both must
-// be > 0, and returns z.
-// If x and y are not nil, GCD sets x and y such that z = a*x + b*y.
-// If either a or b is <= 0, GCD sets z = x = y = 0.
-func (z *Int) GCD(x, y, a, b *Int) *Int {
-	if a.Sign() <= 0 || b.Sign() <= 0 {
-		z.SetInt64(0)
-		if x != nil {
-			x.SetInt64(0)
-		}
-		if y != nil {
-			y.SetInt64(0)
-		}
-		return z
-	}
-	if x == nil && y == nil {
-		return z.binaryGCD(a, b)
-	}
-
-	A := new(Int).Set(a)
-	B := new(Int).Set(b)
-
-	X := new(Int)
-	Y := new(Int).SetInt64(1)
-
-	lastX := new(Int).SetInt64(1)
-	lastY := new(Int)
-
-	q := new(Int)
-	temp := new(Int)
-
-	for len(B.abs) > 0 {
-		r := new(Int)
-		q, r = q.QuoRem(A, B, r)
-
-		A, B = B, r
-
-		temp.Set(X)
-		X.Mul(X, q)
-		X.neg = !X.neg
-		X.Add(X, lastX)
-		lastX.Set(temp)
-
-		temp.Set(Y)
-		Y.Mul(Y, q)
-		Y.neg = !Y.neg
-		Y.Add(Y, lastY)
-		lastY.Set(temp)
-	}
-
-	if x != nil {
-		*x = *lastX
-	}
-
-	if y != nil {
-		*y = *lastY
-	}
-
-	*z = *A
-	return z
-}
-
-// binaryGCD sets z to the greatest common divisor of a and b, which both must
-// be > 0, and returns z.
-// See Knuth, The Art of Computer Programming, Vol. 2, Section 4.5.2, Algorithm B.
-func (z *Int) binaryGCD(a, b *Int) *Int {
-	u := z
-	v := new(Int)
-
-	// use one Euclidean iteration to ensure that u and v are approx. the same size
-	switch {
-	case len(a.abs) > len(b.abs):
-		// must set v before u since u may be alias for a or b (was issue #11284)
-		v.Rem(a, b)
-		u.Set(b)
-	case len(a.abs) < len(b.abs):
-		v.Rem(b, a)
-		u.Set(a)
-	default:
-		v.Set(b)
-		u.Set(a)
-	}
-	// a, b must not be used anymore (may be aliases with u)
-
-	// v might be 0 now
-	if len(v.abs) == 0 {
-		return u
-	}
-	// u > 0 && v > 0
-
-	// determine largest k such that u = u' << k, v = v' << k
-	k := u.abs.trailingZeroBits()
-	if vk := v.abs.trailingZeroBits(); vk < k {
-		k = vk
-	}
-	u.Rsh(u, k)
-	v.Rsh(v, k)
-
-	// determine t (we know that u > 0)
-	t := new(Int)
-	if u.abs[0]&1 != 0 {
-		// u is odd
-		t.Neg(v)
-	} else {
-		t.Set(u)
-	}
-
-	for len(t.abs) > 0 {
-		// reduce t
-		t.Rsh(t, t.abs.trailingZeroBits())
-		if t.neg {
-			v, t = t, v
-			v.neg = len(v.abs) > 0 && !v.neg // 0 has no sign
-		} else {
-			u, t = t, u
-		}
-		t.Sub(u, v)
-	}
-
-	return z.Lsh(u, k)
-}
-
-// ProbablyPrime performs n Miller-Rabin tests to check whether x is prime.
-// If it returns true, x is prime with probability 1 - 1/4^n.
-// If it returns false, x is not prime. n must be > 0.
-func (x *Int) ProbablyPrime(n int) bool {
-	if n <= 0 {
-		panic("non-positive n for ProbablyPrime")
-	}
-	return !x.neg && x.abs.probablyPrime(n)
-}
-
-// Rand sets z to a pseudo-random number in [0, n) and returns z.
-func (z *Int) Rand(rnd *rand.Rand, n *Int) *Int {
-	z.neg = false
-	if n.neg == true || len(n.abs) == 0 {
-		z.abs = nil
-		return z
-	}
-	z.abs = z.abs.random(rnd, n.abs, n.abs.bitLen())
-	return z
-}
-
-// ModInverse sets z to the multiplicative inverse of g in the ring ℤ/nℤ
-// and returns z. If g and n are not relatively prime, the result is undefined.
-func (z *Int) ModInverse(g, n *Int) *Int {
-	var d Int
-	d.GCD(z, nil, g, n)
-	// x and y are such that g*x + n*y = d. Since g and n are
-	// relatively prime, d = 1. Taking that modulo n results in
-	// g*x = 1, therefore x is the inverse element.
-	if z.neg {
-		z.Add(z, n)
-	}
-	return z
-}
-
-// Jacobi returns the Jacobi symbol (x/y), either +1, -1, or 0.
-// The y argument must be an odd integer.
-func Jacobi(x, y *Int) int {
-	if len(y.abs) == 0 || y.abs[0]&1 == 0 {
-		panic(fmt.Sprintf("big: invalid 2nd argument to Int.Jacobi: need odd integer but got %s", y))
-	}
-
-	// We use the formulation described in chapter 2, section 2.4,
-	// "The Yacas Book of Algorithms":
-	// http://yacas.sourceforge.net/Algo.book.pdf
-
-	var a, b, c Int
-	a.Set(x)
-	b.Set(y)
-	j := 1
-
-	if b.neg {
-		if a.neg {
-			j = -1
-		}
-		b.neg = false
-	}
-
-	for {
-		if b.Cmp(intOne) == 0 {
-			return j
-		}
-		if len(a.abs) == 0 {
-			return 0
-		}
-		a.Mod(&a, &b)
-		if len(a.abs) == 0 {
-			return 0
-		}
-		// a > 0
-
-		// handle factors of 2 in 'a'
-		s := a.abs.trailingZeroBits()
-		if s&1 != 0 {
-			bmod8 := b.abs[0] & 7
-			if bmod8 == 3 || bmod8 == 5 {
-				j = -j
-			}
-		}
-		c.Rsh(&a, s) // a = 2^s*c
-
-		// swap numerator and denominator
-		if b.abs[0]&3 == 3 && c.abs[0]&3 == 3 {
-			j = -j
-		}
-		a.Set(&b)
-		b.Set(&c)
-	}
-}
-
-// ModSqrt sets z to a square root of x mod p if such a square root exists, and
-// returns z. The modulus p must be an odd prime. If x is not a square mod p,
-// ModSqrt leaves z unchanged and returns nil. This function panics if p is
-// not an odd integer.
-func (z *Int) ModSqrt(x, p *Int) *Int {
-	switch Jacobi(x, p) {
-	case -1:
-		return nil // x is not a square mod p
-	case 0:
-		return z.SetInt64(0) // sqrt(0) mod p = 0
-	case 1:
-		break
-	}
-	if x.neg || x.Cmp(p) >= 0 { // ensure 0 <= x < p
-		x = new(Int).Mod(x, p)
-	}
-
-	// Break p-1 into s*2^e such that s is odd.
-	var s Int
-	s.Sub(p, intOne)
-	e := s.abs.trailingZeroBits()
-	s.Rsh(&s, e)
-
-	// find some non-square n
-	var n Int
-	n.SetInt64(2)
-	for Jacobi(&n, p) != -1 {
-		n.Add(&n, intOne)
-	}
-
-	// Core of the Tonelli-Shanks algorithm. Follows the description in
-	// section 6 of "Square roots from 1; 24, 51, 10 to Dan Shanks" by Ezra
-	// Brown:
-	// https://www.maa.org/sites/default/files/pdf/upload_library/22/Polya/07468342.di020786.02p0470a.pdf
-	var y, b, g, t Int
-	y.Add(&s, intOne)
-	y.Rsh(&y, 1)
-	y.Exp(x, &y, p)  // y = x^((s+1)/2)
-	b.Exp(x, &s, p)  // b = x^s
-	g.Exp(&n, &s, p) // g = n^s
-	r := e
-	for {
-		// find the least m such that ord_p(b) = 2^m
-		var m uint
-		t.Set(&b)
-		for t.Cmp(intOne) != 0 {
-			t.Mul(&t, &t).Mod(&t, p)
-			m++
-		}
-
-		if m == 0 {
-			return z.Set(&y)
-		}
-
-		t.SetInt64(0).SetBit(&t, int(r-m-1), 1).Exp(&g, &t, p)
-		// t = g^(2^(r-m-1)) mod p
-		g.Mul(&t, &t).Mod(&g, p) // g = g^(2^(r-m)) mod p
-		y.Mul(&y, &t).Mod(&y, p)
-		b.Mul(&b, &g).Mod(&b, p)
-		r = m
-	}
-}
-
-// Lsh sets z = x << n and returns z.
-func (z *Int) Lsh(x *Int, n uint) *Int {
-	z.abs = z.abs.shl(x.abs, n)
-	z.neg = x.neg
-	return z
-}
-
-// Rsh sets z = x >> n and returns z.
-func (z *Int) Rsh(x *Int, n uint) *Int {
-	if x.neg {
-		// (-x) >> s == ^(x-1) >> s == ^((x-1) >> s) == -(((x-1) >> s) + 1)
-		t := z.abs.sub(x.abs, natOne) // no underflow because |x| > 0
-		t = t.shr(t, n)
-		z.abs = t.add(t, natOne)
-		z.neg = true // z cannot be zero if x is negative
-		return z
-	}
-
-	z.abs = z.abs.shr(x.abs, n)
-	z.neg = false
-	return z
-}
-
-// Bit returns the value of the i'th bit of x. That is, it
-// returns (x>>i)&1. The bit index i must be >= 0.
-func (x *Int) Bit(i int) uint {
-	if i == 0 {
-		// optimization for common case: odd/even test of x
-		if len(x.abs) > 0 {
-			return uint(x.abs[0] & 1) // bit 0 is same for -x
-		}
-		return 0
-	}
-	if i < 0 {
-		panic("negative bit index")
-	}
-	if x.neg {
-		t := nat(nil).sub(x.abs, natOne)
-		return t.bit(uint(i)) ^ 1
-	}
-
-	return x.abs.bit(uint(i))
-}
-
-// SetBit sets z to x, with x's i'th bit set to b (0 or 1).
-// That is, if b is 1 SetBit sets z = x | (1 << i);
-// if b is 0 SetBit sets z = x &^ (1 << i). If b is not 0 or 1,
-// SetBit will panic.
-func (z *Int) SetBit(x *Int, i int, b uint) *Int {
-	if i < 0 {
-		panic("negative bit index")
-	}
-	if x.neg {
-		t := z.abs.sub(x.abs, natOne)
-		t = t.setBit(t, uint(i), b^1)
-		z.abs = t.add(t, natOne)
-		z.neg = len(z.abs) > 0
-		return z
-	}
-	z.abs = z.abs.setBit(x.abs, uint(i), b)
-	z.neg = false
-	return z
-}
-
-// And sets z = x & y and returns z.
-func (z *Int) And(x, y *Int) *Int {
-	if x.neg == y.neg {
-		if x.neg {
-			// (-x) & (-y) == ^(x-1) & ^(y-1) == ^((x-1) | (y-1)) == -(((x-1) | (y-1)) + 1)
-			x1 := nat(nil).sub(x.abs, natOne)
-			y1 := nat(nil).sub(y.abs, natOne)
-			z.abs = z.abs.add(z.abs.or(x1, y1), natOne)
-			z.neg = true // z cannot be zero if x and y are negative
-			return z
-		}
-
-		// x & y == x & y
-		z.abs = z.abs.and(x.abs, y.abs)
-		z.neg = false
-		return z
-	}
-
-	// x.neg != y.neg
-	if x.neg {
-		x, y = y, x // & is symmetric
-	}
-
-	// x & (-y) == x & ^(y-1) == x &^ (y-1)
-	y1 := nat(nil).sub(y.abs, natOne)
-	z.abs = z.abs.andNot(x.abs, y1)
-	z.neg = false
-	return z
-}
-
-// AndNot sets z = x &^ y and returns z.
-func (z *Int) AndNot(x, y *Int) *Int {
-	if x.neg == y.neg {
-		if x.neg {
-			// (-x) &^ (-y) == ^(x-1) &^ ^(y-1) == ^(x-1) & (y-1) == (y-1) &^ (x-1)
-			x1 := nat(nil).sub(x.abs, natOne)
-			y1 := nat(nil).sub(y.abs, natOne)
-			z.abs = z.abs.andNot(y1, x1)
-			z.neg = false
-			return z
-		}
-
-		// x &^ y == x &^ y
-		z.abs = z.abs.andNot(x.abs, y.abs)
-		z.neg = false
-		return z
-	}
-
-	if x.neg {
-		// (-x) &^ y == ^(x-1) &^ y == ^(x-1) & ^y == ^((x-1) | y) == -(((x-1) | y) + 1)
-		x1 := nat(nil).sub(x.abs, natOne)
-		z.abs = z.abs.add(z.abs.or(x1, y.abs), natOne)
-		z.neg = true // z cannot be zero if x is negative and y is positive
-		return z
-	}
-
-	// x &^ (-y) == x &^ ^(y-1) == x & (y-1)
-	y1 := nat(nil).sub(y.abs, natOne)
-	z.abs = z.abs.and(x.abs, y1)
-	z.neg = false
-	return z
-}
-
-// Or sets z = x | y and returns z.
-func (z *Int) Or(x, y *Int) *Int {
-	if x.neg == y.neg {
-		if x.neg {
-			// (-x) | (-y) == ^(x-1) | ^(y-1) == ^((x-1) & (y-1)) == -(((x-1) & (y-1)) + 1)
-			x1 := nat(nil).sub(x.abs, natOne)
-			y1 := nat(nil).sub(y.abs, natOne)
-			z.abs = z.abs.add(z.abs.and(x1, y1), natOne)
-			z.neg = true // z cannot be zero if x and y are negative
-			return z
-		}
-
-		// x | y == x | y
-		z.abs = z.abs.or(x.abs, y.abs)
-		z.neg = false
-		return z
-	}
-
-	// x.neg != y.neg
-	if x.neg {
-		x, y = y, x // | is symmetric
-	}
-
-	// x | (-y) == x | ^(y-1) == ^((y-1) &^ x) == -(^((y-1) &^ x) + 1)
-	y1 := nat(nil).sub(y.abs, natOne)
-	z.abs = z.abs.add(z.abs.andNot(y1, x.abs), natOne)
-	z.neg = true // z cannot be zero if one of x or y is negative
-	return z
-}
-
-// Xor sets z = x ^ y and returns z.
-func (z *Int) Xor(x, y *Int) *Int {
-	if x.neg == y.neg {
-		if x.neg {
-			// (-x) ^ (-y) == ^(x-1) ^ ^(y-1) == (x-1) ^ (y-1)
-			x1 := nat(nil).sub(x.abs, natOne)
-			y1 := nat(nil).sub(y.abs, natOne)
-			z.abs = z.abs.xor(x1, y1)
-			z.neg = false
-			return z
-		}
-
-		// x ^ y == x ^ y
-		z.abs = z.abs.xor(x.abs, y.abs)
-		z.neg = false
-		return z
-	}
-
-	// x.neg != y.neg
-	if x.neg {
-		x, y = y, x // ^ is symmetric
-	}
-
-	// x ^ (-y) == x ^ ^(y-1) == ^(x ^ (y-1)) == -((x ^ (y-1)) + 1)
-	y1 := nat(nil).sub(y.abs, natOne)
-	z.abs = z.abs.add(z.abs.xor(x.abs, y1), natOne)
-	z.neg = true // z cannot be zero if only one of x or y is negative
-	return z
-}
-
-// Not sets z = ^x and returns z.
-func (z *Int) Not(x *Int) *Int {
-	if x.neg {
-		// ^(-x) == ^(^(x-1)) == x-1
-		z.abs = z.abs.sub(x.abs, natOne)
-		z.neg = false
-		return z
-	}
-
-	// ^x == -x-1 == -(x+1)
-	z.abs = z.abs.add(x.abs, natOne)
-	z.neg = true // z cannot be zero if x is positive
-	return z
-}
-
-// Gob codec version. Permits backward-compatible changes to the encoding.
-const intGobVersion byte = 1
-
-// GobEncode implements the gob.GobEncoder interface.
-func (x *Int) GobEncode() ([]byte, error) {
-	if x == nil {
-		return nil, nil
-	}
-	buf := make([]byte, 1+len(x.abs)*_S) // extra byte for version and sign bit
-	i := x.abs.bytes(buf) - 1            // i >= 0
-	b := intGobVersion << 1              // make space for sign bit
-	if x.neg {
-		b |= 1
-	}
-	buf[i] = b
-	return buf[i:], nil
-}
-
-// GobDecode implements the gob.GobDecoder interface.
-func (z *Int) GobDecode(buf []byte) error {
-	if len(buf) == 0 {
-		// Other side sent a nil or default value.
-		*z = Int{}
-		return nil
-	}
-	b := buf[0]
-	if b>>1 != intGobVersion {
-		return fmt.Errorf("Int.GobDecode: encoding version %d not supported", b>>1)
-	}
-	z.neg = b&1 != 0
-	z.abs = z.abs.setBytes(buf[1:])
-	return nil
-}
-
-// MarshalJSON implements the json.Marshaler interface.
-func (z *Int) MarshalJSON() ([]byte, error) {
-	// TODO(gri): get rid of the []byte/string conversions
-	return []byte(z.String()), nil
-}
-
-// UnmarshalJSON implements the json.Unmarshaler interface.
-func (z *Int) UnmarshalJSON(text []byte) error {
-	// TODO(gri): get rid of the []byte/string conversions
-	if _, ok := z.SetString(string(text), 0); !ok {
-		return fmt.Errorf("math/big: cannot unmarshal %q into a *big.Int", text)
-	}
-	return nil
-}
-
-// MarshalText implements the encoding.TextMarshaler interface.
-func (z *Int) MarshalText() (text []byte, err error) {
-	return []byte(z.String()), nil
-}
-
-// UnmarshalText implements the encoding.TextUnmarshaler interface.
-func (z *Int) UnmarshalText(text []byte) error {
-	if _, ok := z.SetString(string(text), 0); !ok {
-		return fmt.Errorf("math/big: cannot unmarshal %q into a *big.Int", text)
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/int_test.go b/third_party/gofrontend/libgo/go/math/big/int_test.go
deleted file mode 100644
index 88c8c2b..0000000
--- a/third_party/gofrontend/libgo/go/math/big/int_test.go
+++ /dev/null
@@ -1,1540 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package big
-
-import (
-	"bytes"
-	"encoding/gob"
-	"encoding/hex"
-	"encoding/json"
-	"encoding/xml"
-	"fmt"
-	"math/rand"
-	"testing"
-	"testing/quick"
-)
-
-func isNormalized(x *Int) bool {
-	if len(x.abs) == 0 {
-		return !x.neg
-	}
-	// len(x.abs) > 0
-	return x.abs[len(x.abs)-1] != 0
-}
-
-type funZZ func(z, x, y *Int) *Int
-type argZZ struct {
-	z, x, y *Int
-}
-
-var sumZZ = []argZZ{
-	{NewInt(0), NewInt(0), NewInt(0)},
-	{NewInt(1), NewInt(1), NewInt(0)},
-	{NewInt(1111111110), NewInt(123456789), NewInt(987654321)},
-	{NewInt(-1), NewInt(-1), NewInt(0)},
-	{NewInt(864197532), NewInt(-123456789), NewInt(987654321)},
-	{NewInt(-1111111110), NewInt(-123456789), NewInt(-987654321)},
-}
-
-var prodZZ = []argZZ{
-	{NewInt(0), NewInt(0), NewInt(0)},
-	{NewInt(0), NewInt(1), NewInt(0)},
-	{NewInt(1), NewInt(1), NewInt(1)},
-	{NewInt(-991 * 991), NewInt(991), NewInt(-991)},
-	// TODO(gri) add larger products
-}
-
-func TestSignZ(t *testing.T) {
-	var zero Int
-	for _, a := range sumZZ {
-		s := a.z.Sign()
-		e := a.z.Cmp(&zero)
-		if s != e {
-			t.Errorf("got %d; want %d for z = %v", s, e, a.z)
-		}
-	}
-}
-
-func TestSetZ(t *testing.T) {
-	for _, a := range sumZZ {
-		var z Int
-		z.Set(a.z)
-		if !isNormalized(&z) {
-			t.Errorf("%v is not normalized", z)
-		}
-		if (&z).Cmp(a.z) != 0 {
-			t.Errorf("got z = %v; want %v", z, a.z)
-		}
-	}
-}
-
-func TestAbsZ(t *testing.T) {
-	var zero Int
-	for _, a := range sumZZ {
-		var z Int
-		z.Abs(a.z)
-		var e Int
-		e.Set(a.z)
-		if e.Cmp(&zero) < 0 {
-			e.Sub(&zero, &e)
-		}
-		if z.Cmp(&e) != 0 {
-			t.Errorf("got z = %v; want %v", z, e)
-		}
-	}
-}
-
-func testFunZZ(t *testing.T, msg string, f funZZ, a argZZ) {
-	var z Int
-	f(&z, a.x, a.y)
-	if !isNormalized(&z) {
-		t.Errorf("%s%v is not normalized", msg, z)
-	}
-	if (&z).Cmp(a.z) != 0 {
-		t.Errorf("%s%+v\n\tgot z = %v; want %v", msg, a, &z, a.z)
-	}
-}
-
-func TestSumZZ(t *testing.T) {
-	AddZZ := func(z, x, y *Int) *Int { return z.Add(x, y) }
-	SubZZ := func(z, x, y *Int) *Int { return z.Sub(x, y) }
-	for _, a := range sumZZ {
-		arg := a
-		testFunZZ(t, "AddZZ", AddZZ, arg)
-
-		arg = argZZ{a.z, a.y, a.x}
-		testFunZZ(t, "AddZZ symmetric", AddZZ, arg)
-
-		arg = argZZ{a.x, a.z, a.y}
-		testFunZZ(t, "SubZZ", SubZZ, arg)
-
-		arg = argZZ{a.y, a.z, a.x}
-		testFunZZ(t, "SubZZ symmetric", SubZZ, arg)
-	}
-}
-
-func TestProdZZ(t *testing.T) {
-	MulZZ := func(z, x, y *Int) *Int { return z.Mul(x, y) }
-	for _, a := range prodZZ {
-		arg := a
-		testFunZZ(t, "MulZZ", MulZZ, arg)
-
-		arg = argZZ{a.z, a.y, a.x}
-		testFunZZ(t, "MulZZ symmetric", MulZZ, arg)
-	}
-}
-
-// mulBytes returns x*y via grade school multiplication. Both inputs
-// and the result are assumed to be in big-endian representation (to
-// match the semantics of Int.Bytes and Int.SetBytes).
-func mulBytes(x, y []byte) []byte {
-	z := make([]byte, len(x)+len(y))
-
-	// multiply
-	k0 := len(z) - 1
-	for j := len(y) - 1; j >= 0; j-- {
-		d := int(y[j])
-		if d != 0 {
-			k := k0
-			carry := 0
-			for i := len(x) - 1; i >= 0; i-- {
-				t := int(z[k]) + int(x[i])*d + carry
-				z[k], carry = byte(t), t>>8
-				k--
-			}
-			z[k] = byte(carry)
-		}
-		k0--
-	}
-
-	// normalize (remove leading 0's)
-	i := 0
-	for i < len(z) && z[i] == 0 {
-		i++
-	}
-
-	return z[i:]
-}
-
-func checkMul(a, b []byte) bool {
-	var x, y, z1 Int
-	x.SetBytes(a)
-	y.SetBytes(b)
-	z1.Mul(&x, &y)
-
-	var z2 Int
-	z2.SetBytes(mulBytes(a, b))
-
-	return z1.Cmp(&z2) == 0
-}
-
-func TestMul(t *testing.T) {
-	if err := quick.Check(checkMul, nil); err != nil {
-		t.Error(err)
-	}
-}
-
-var mulRangesZ = []struct {
-	a, b int64
-	prod string
-}{
-	// entirely positive ranges are covered by mulRangesN
-	{-1, 1, "0"},
-	{-2, -1, "2"},
-	{-3, -2, "6"},
-	{-3, -1, "-6"},
-	{1, 3, "6"},
-	{-10, -10, "-10"},
-	{0, -1, "1"},                      // empty range
-	{-1, -100, "1"},                   // empty range
-	{-1, 1, "0"},                      // range includes 0
-	{-1e9, 0, "0"},                    // range includes 0
-	{-1e9, 1e9, "0"},                  // range includes 0
-	{-10, -1, "3628800"},              // 10!
-	{-20, -2, "-2432902008176640000"}, // -20!
-	{-99, -1,
-		"-933262154439441526816992388562667004907159682643816214685929" +
-			"638952175999932299156089414639761565182862536979208272237582" +
-			"511852109168640000000000000000000000", // -99!
-	},
-}
-
-func TestMulRangeZ(t *testing.T) {
-	var tmp Int
-	// test entirely positive ranges
-	for i, r := range mulRangesN {
-		prod := tmp.MulRange(int64(r.a), int64(r.b)).String()
-		if prod != r.prod {
-			t.Errorf("#%da: got %s; want %s", i, prod, r.prod)
-		}
-	}
-	// test other ranges
-	for i, r := range mulRangesZ {
-		prod := tmp.MulRange(r.a, r.b).String()
-		if prod != r.prod {
-			t.Errorf("#%db: got %s; want %s", i, prod, r.prod)
-		}
-	}
-}
-
-func TestBinomial(t *testing.T) {
-	var z Int
-	for _, test := range []struct {
-		n, k int64
-		want string
-	}{
-		{0, 0, "1"},
-		{0, 1, "0"},
-		{1, 0, "1"},
-		{1, 1, "1"},
-		{1, 10, "0"},
-		{4, 0, "1"},
-		{4, 1, "4"},
-		{4, 2, "6"},
-		{4, 3, "4"},
-		{4, 4, "1"},
-		{10, 1, "10"},
-		{10, 9, "10"},
-		{10, 5, "252"},
-		{11, 5, "462"},
-		{11, 6, "462"},
-		{100, 10, "17310309456440"},
-		{100, 90, "17310309456440"},
-		{1000, 10, "263409560461970212832400"},
-		{1000, 990, "263409560461970212832400"},
-	} {
-		if got := z.Binomial(test.n, test.k).String(); got != test.want {
-			t.Errorf("Binomial(%d, %d) = %s; want %s", test.n, test.k, got, test.want)
-		}
-	}
-}
-
-func BenchmarkBinomial(b *testing.B) {
-	var z Int
-	for i := b.N - 1; i >= 0; i-- {
-		z.Binomial(1000, 990)
-	}
-}
-
-// Examples from the Go Language Spec, section "Arithmetic operators"
-var divisionSignsTests = []struct {
-	x, y int64
-	q, r int64 // T-division
-	d, m int64 // Euclidian division
-}{
-	{5, 3, 1, 2, 1, 2},
-	{-5, 3, -1, -2, -2, 1},
-	{5, -3, -1, 2, -1, 2},
-	{-5, -3, 1, -2, 2, 1},
-	{1, 2, 0, 1, 0, 1},
-	{8, 4, 2, 0, 2, 0},
-}
-
-func TestDivisionSigns(t *testing.T) {
-	for i, test := range divisionSignsTests {
-		x := NewInt(test.x)
-		y := NewInt(test.y)
-		q := NewInt(test.q)
-		r := NewInt(test.r)
-		d := NewInt(test.d)
-		m := NewInt(test.m)
-
-		q1 := new(Int).Quo(x, y)
-		r1 := new(Int).Rem(x, y)
-		if !isNormalized(q1) {
-			t.Errorf("#%d Quo: %v is not normalized", i, *q1)
-		}
-		if !isNormalized(r1) {
-			t.Errorf("#%d Rem: %v is not normalized", i, *r1)
-		}
-		if q1.Cmp(q) != 0 || r1.Cmp(r) != 0 {
-			t.Errorf("#%d QuoRem: got (%s, %s), want (%s, %s)", i, q1, r1, q, r)
-		}
-
-		q2, r2 := new(Int).QuoRem(x, y, new(Int))
-		if !isNormalized(q2) {
-			t.Errorf("#%d Quo: %v is not normalized", i, *q2)
-		}
-		if !isNormalized(r2) {
-			t.Errorf("#%d Rem: %v is not normalized", i, *r2)
-		}
-		if q2.Cmp(q) != 0 || r2.Cmp(r) != 0 {
-			t.Errorf("#%d QuoRem: got (%s, %s), want (%s, %s)", i, q2, r2, q, r)
-		}
-
-		d1 := new(Int).Div(x, y)
-		m1 := new(Int).Mod(x, y)
-		if !isNormalized(d1) {
-			t.Errorf("#%d Div: %v is not normalized", i, *d1)
-		}
-		if !isNormalized(m1) {
-			t.Errorf("#%d Mod: %v is not normalized", i, *m1)
-		}
-		if d1.Cmp(d) != 0 || m1.Cmp(m) != 0 {
-			t.Errorf("#%d DivMod: got (%s, %s), want (%s, %s)", i, d1, m1, d, m)
-		}
-
-		d2, m2 := new(Int).DivMod(x, y, new(Int))
-		if !isNormalized(d2) {
-			t.Errorf("#%d Div: %v is not normalized", i, *d2)
-		}
-		if !isNormalized(m2) {
-			t.Errorf("#%d Mod: %v is not normalized", i, *m2)
-		}
-		if d2.Cmp(d) != 0 || m2.Cmp(m) != 0 {
-			t.Errorf("#%d DivMod: got (%s, %s), want (%s, %s)", i, d2, m2, d, m)
-		}
-	}
-}
-
-func norm(x nat) nat {
-	i := len(x)
-	for i > 0 && x[i-1] == 0 {
-		i--
-	}
-	return x[:i]
-}
-
-func TestBits(t *testing.T) {
-	for _, test := range []nat{
-		nil,
-		{0},
-		{1},
-		{0, 1, 2, 3, 4},
-		{4, 3, 2, 1, 0},
-		{4, 3, 2, 1, 0, 0, 0, 0},
-	} {
-		var z Int
-		z.neg = true
-		got := z.SetBits(test)
-		want := norm(test)
-		if got.abs.cmp(want) != 0 {
-			t.Errorf("SetBits(%v) = %v; want %v", test, got.abs, want)
-		}
-
-		if got.neg {
-			t.Errorf("SetBits(%v): got negative result", test)
-		}
-
-		bits := nat(z.Bits())
-		if bits.cmp(want) != 0 {
-			t.Errorf("%v.Bits() = %v; want %v", z.abs, bits, want)
-		}
-	}
-}
-
-func checkSetBytes(b []byte) bool {
-	hex1 := hex.EncodeToString(new(Int).SetBytes(b).Bytes())
-	hex2 := hex.EncodeToString(b)
-
-	for len(hex1) < len(hex2) {
-		hex1 = "0" + hex1
-	}
-
-	for len(hex1) > len(hex2) {
-		hex2 = "0" + hex2
-	}
-
-	return hex1 == hex2
-}
-
-func TestSetBytes(t *testing.T) {
-	if err := quick.Check(checkSetBytes, nil); err != nil {
-		t.Error(err)
-	}
-}
-
-func checkBytes(b []byte) bool {
-	b2 := new(Int).SetBytes(b).Bytes()
-	return bytes.Equal(b, b2)
-}
-
-func TestBytes(t *testing.T) {
-	if err := quick.Check(checkBytes, nil); err != nil {
-		t.Error(err)
-	}
-}
-
-func checkQuo(x, y []byte) bool {
-	u := new(Int).SetBytes(x)
-	v := new(Int).SetBytes(y)
-
-	if len(v.abs) == 0 {
-		return true
-	}
-
-	r := new(Int)
-	q, r := new(Int).QuoRem(u, v, r)
-
-	if r.Cmp(v) >= 0 {
-		return false
-	}
-
-	uprime := new(Int).Set(q)
-	uprime.Mul(uprime, v)
-	uprime.Add(uprime, r)
-
-	return uprime.Cmp(u) == 0
-}
-
-var quoTests = []struct {
-	x, y string
-	q, r string
-}{
-	{
-		"476217953993950760840509444250624797097991362735329973741718102894495832294430498335824897858659711275234906400899559094370964723884706254265559534144986498357",
-		"9353930466774385905609975137998169297361893554149986716853295022578535724979483772383667534691121982974895531435241089241440253066816724367338287092081996",
-		"50911",
-		"1",
-	},
-	{
-		"11510768301994997771168",
-		"1328165573307167369775",
-		"8",
-		"885443715537658812968",
-	},
-}
-
-func TestQuo(t *testing.T) {
-	if err := quick.Check(checkQuo, nil); err != nil {
-		t.Error(err)
-	}
-
-	for i, test := range quoTests {
-		x, _ := new(Int).SetString(test.x, 10)
-		y, _ := new(Int).SetString(test.y, 10)
-		expectedQ, _ := new(Int).SetString(test.q, 10)
-		expectedR, _ := new(Int).SetString(test.r, 10)
-
-		r := new(Int)
-		q, r := new(Int).QuoRem(x, y, r)
-
-		if q.Cmp(expectedQ) != 0 || r.Cmp(expectedR) != 0 {
-			t.Errorf("#%d got (%s, %s) want (%s, %s)", i, q, r, expectedQ, expectedR)
-		}
-	}
-}
-
-func TestQuoStepD6(t *testing.T) {
-	// See Knuth, Volume 2, section 4.3.1, exercise 21. This code exercises
-	// a code path which only triggers 1 in 10^{-19} cases.
-
-	u := &Int{false, nat{0, 0, 1 + 1<<(_W-1), _M ^ (1 << (_W - 1))}}
-	v := &Int{false, nat{5, 2 + 1<<(_W-1), 1 << (_W - 1)}}
-
-	r := new(Int)
-	q, r := new(Int).QuoRem(u, v, r)
-	const expectedQ64 = "18446744073709551613"
-	const expectedR64 = "3138550867693340382088035895064302439801311770021610913807"
-	const expectedQ32 = "4294967293"
-	const expectedR32 = "39614081266355540837921718287"
-	if q.String() != expectedQ64 && q.String() != expectedQ32 ||
-		r.String() != expectedR64 && r.String() != expectedR32 {
-		t.Errorf("got (%s, %s) want (%s, %s) or (%s, %s)", q, r, expectedQ64, expectedR64, expectedQ32, expectedR32)
-	}
-}
-
-var bitLenTests = []struct {
-	in  string
-	out int
-}{
-	{"-1", 1},
-	{"0", 0},
-	{"1", 1},
-	{"2", 2},
-	{"4", 3},
-	{"0xabc", 12},
-	{"0x8000", 16},
-	{"0x80000000", 32},
-	{"0x800000000000", 48},
-	{"0x8000000000000000", 64},
-	{"0x80000000000000000000", 80},
-	{"-0x4000000000000000000000", 87},
-}
-
-func TestBitLen(t *testing.T) {
-	for i, test := range bitLenTests {
-		x, ok := new(Int).SetString(test.in, 0)
-		if !ok {
-			t.Errorf("#%d test input invalid: %s", i, test.in)
-			continue
-		}
-
-		if n := x.BitLen(); n != test.out {
-			t.Errorf("#%d got %d want %d", i, n, test.out)
-		}
-	}
-}
-
-var expTests = []struct {
-	x, y, m string
-	out     string
-}{
-	// y <= 0
-	{"0", "0", "", "1"},
-	{"1", "0", "", "1"},
-	{"-10", "0", "", "1"},
-	{"1234", "-1", "", "1"},
-
-	// m == 1
-	{"0", "0", "1", "0"},
-	{"1", "0", "1", "0"},
-	{"-10", "0", "1", "0"},
-	{"1234", "-1", "1", "0"},
-
-	// misc
-	{"5", "1", "3", "2"},
-	{"5", "-7", "", "1"},
-	{"-5", "-7", "", "1"},
-	{"5", "0", "", "1"},
-	{"-5", "0", "", "1"},
-	{"5", "1", "", "5"},
-	{"-5", "1", "", "-5"},
-	{"-5", "1", "7", "2"},
-	{"-2", "3", "2", "0"},
-	{"5", "2", "", "25"},
-	{"1", "65537", "2", "1"},
-	{"0x8000000000000000", "2", "", "0x40000000000000000000000000000000"},
-	{"0x8000000000000000", "2", "6719", "4944"},
-	{"0x8000000000000000", "3", "6719", "5447"},
-	{"0x8000000000000000", "1000", "6719", "1603"},
-	{"0x8000000000000000", "1000000", "6719", "3199"},
-	{"0x8000000000000000", "-1000000", "6719", "1"},
-	{
-		"2938462938472983472983659726349017249287491026512746239764525612965293865296239471239874193284792387498274256129746192347",
-		"298472983472983471903246121093472394872319615612417471234712061",
-		"29834729834729834729347290846729561262544958723956495615629569234729836259263598127342374289365912465901365498236492183464",
-		"23537740700184054162508175125554701713153216681790245129157191391322321508055833908509185839069455749219131480588829346291",
-	},
-	// test case for issue 8822
-	{
-		"-0x1BCE04427D8032319A89E5C4136456671AC620883F2C4139E57F91307C485AD2D6204F4F87A58262652DB5DBBAC72B0613E51B835E7153BEC6068F5C8D696B74DBD18FEC316AEF73985CF0475663208EB46B4F17DD9DA55367B03323E5491A70997B90C059FB34809E6EE55BCFBD5F2F52233BFE62E6AA9E4E26A1D4C2439883D14F2633D55D8AA66A1ACD5595E778AC3A280517F1157989E70C1A437B849F1877B779CC3CDDEDE2DAA6594A6C66D181A00A5F777EE60596D8773998F6E988DEAE4CCA60E4DDCF9590543C89F74F603259FCAD71660D30294FBBE6490300F78A9D63FA660DC9417B8B9DDA28BEB3977B621B988E23D4D954F322C3540541BC649ABD504C50FADFD9F0987D58A2BF689313A285E773FF02899A6EF887D1D4A0D2",
-		"0xB08FFB20760FFED58FADA86DFEF71AD72AA0FA763219618FE022C197E54708BB1191C66470250FCE8879487507CEE41381CA4D932F81C2B3F1AB20B539D50DCD",
-		"0xAC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73",
-		"21484252197776302499639938883777710321993113097987201050501182909581359357618579566746556372589385361683610524730509041328855066514963385522570894839035884713051640171474186548713546686476761306436434146475140156284389181808675016576845833340494848283681088886584219750554408060556769486628029028720727393293111678826356480455433909233520504112074401376133077150471237549474149190242010469539006449596611576612573955754349042329130631128234637924786466585703488460540228477440853493392086251021228087076124706778899179648655221663765993962724699135217212118535057766739392069738618682722216712319320435674779146070442",
-	},
-}
-
-func TestExp(t *testing.T) {
-	for i, test := range expTests {
-		x, ok1 := new(Int).SetString(test.x, 0)
-		y, ok2 := new(Int).SetString(test.y, 0)
-		out, ok3 := new(Int).SetString(test.out, 0)
-
-		var ok4 bool
-		var m *Int
-
-		if len(test.m) == 0 {
-			m, ok4 = nil, true
-		} else {
-			m, ok4 = new(Int).SetString(test.m, 0)
-		}
-
-		if !ok1 || !ok2 || !ok3 || !ok4 {
-			t.Errorf("#%d: error in input", i)
-			continue
-		}
-
-		z1 := new(Int).Exp(x, y, m)
-		if !isNormalized(z1) {
-			t.Errorf("#%d: %v is not normalized", i, *z1)
-		}
-		if z1.Cmp(out) != 0 {
-			t.Errorf("#%d: got %s want %s", i, z1, out)
-		}
-
-		if m == nil {
-			// The result should be the same as for m == 0;
-			// specifically, there should be no div-zero panic.
-			m = &Int{abs: nat{}} // m != nil && len(m.abs) == 0
-			z2 := new(Int).Exp(x, y, m)
-			if z2.Cmp(z1) != 0 {
-				t.Errorf("#%d: got %s want %s", i, z2, z1)
-			}
-		}
-	}
-}
-
-func checkGcd(aBytes, bBytes []byte) bool {
-	x := new(Int)
-	y := new(Int)
-	a := new(Int).SetBytes(aBytes)
-	b := new(Int).SetBytes(bBytes)
-
-	d := new(Int).GCD(x, y, a, b)
-	x.Mul(x, a)
-	y.Mul(y, b)
-	x.Add(x, y)
-
-	return x.Cmp(d) == 0
-}
-
-var gcdTests = []struct {
-	d, x, y, a, b string
-}{
-	// a <= 0 || b <= 0
-	{"0", "0", "0", "0", "0"},
-	{"0", "0", "0", "0", "7"},
-	{"0", "0", "0", "11", "0"},
-	{"0", "0", "0", "-77", "35"},
-	{"0", "0", "0", "64515", "-24310"},
-	{"0", "0", "0", "-64515", "-24310"},
-
-	{"1", "-9", "47", "120", "23"},
-	{"7", "1", "-2", "77", "35"},
-	{"935", "-3", "8", "64515", "24310"},
-	{"935000000000000000", "-3", "8", "64515000000000000000", "24310000000000000000"},
-	{"1", "-221", "22059940471369027483332068679400581064239780177629666810348940098015901108344", "98920366548084643601728869055592650835572950932266967461790948584315647051443", "991"},
-
-	// test early exit (after one Euclidean iteration) in binaryGCD
-	{"1", "", "", "1", "98920366548084643601728869055592650835572950932266967461790948584315647051443"},
-}
-
-func testGcd(t *testing.T, d, x, y, a, b *Int) {
-	var X *Int
-	if x != nil {
-		X = new(Int)
-	}
-	var Y *Int
-	if y != nil {
-		Y = new(Int)
-	}
-
-	D := new(Int).GCD(X, Y, a, b)
-	if D.Cmp(d) != 0 {
-		t.Errorf("GCD(%s, %s): got d = %s, want %s", a, b, D, d)
-	}
-	if x != nil && X.Cmp(x) != 0 {
-		t.Errorf("GCD(%s, %s): got x = %s, want %s", a, b, X, x)
-	}
-	if y != nil && Y.Cmp(y) != 0 {
-		t.Errorf("GCD(%s, %s): got y = %s, want %s", a, b, Y, y)
-	}
-
-	// binaryGCD requires a > 0 && b > 0
-	if a.Sign() <= 0 || b.Sign() <= 0 {
-		return
-	}
-
-	D.binaryGCD(a, b)
-	if D.Cmp(d) != 0 {
-		t.Errorf("binaryGcd(%s, %s): got d = %s, want %s", a, b, D, d)
-	}
-
-	// check results in presence of aliasing (issue #11284)
-	a2 := new(Int).Set(a)
-	b2 := new(Int).Set(b)
-	a2.binaryGCD(a2, b2) // result is same as 1st argument
-	if a2.Cmp(d) != 0 {
-		t.Errorf("binaryGcd(%s, %s): got d = %s, want %s", a, b, a2, d)
-	}
-
-	a2 = new(Int).Set(a)
-	b2 = new(Int).Set(b)
-	b2.binaryGCD(a2, b2) // result is same as 2nd argument
-	if b2.Cmp(d) != 0 {
-		t.Errorf("binaryGcd(%s, %s): got d = %s, want %s", a, b, b2, d)
-	}
-}
-
-func TestGcd(t *testing.T) {
-	for _, test := range gcdTests {
-		d, _ := new(Int).SetString(test.d, 0)
-		x, _ := new(Int).SetString(test.x, 0)
-		y, _ := new(Int).SetString(test.y, 0)
-		a, _ := new(Int).SetString(test.a, 0)
-		b, _ := new(Int).SetString(test.b, 0)
-
-		testGcd(t, d, nil, nil, a, b)
-		testGcd(t, d, x, nil, a, b)
-		testGcd(t, d, nil, y, a, b)
-		testGcd(t, d, x, y, a, b)
-	}
-
-	quick.Check(checkGcd, nil)
-}
-
-var primes = []string{
-	"2",
-	"3",
-	"5",
-	"7",
-	"11",
-
-	"13756265695458089029",
-	"13496181268022124907",
-	"10953742525620032441",
-	"17908251027575790097",
-
-	// https://golang.org/issue/638
-	"18699199384836356663",
-
-	"98920366548084643601728869055592650835572950932266967461790948584315647051443",
-	"94560208308847015747498523884063394671606671904944666360068158221458669711639",
-
-	// http://primes.utm.edu/lists/small/small3.html
-	"449417999055441493994709297093108513015373787049558499205492347871729927573118262811508386655998299074566974373711472560655026288668094291699357843464363003144674940345912431129144354948751003607115263071543163",
-	"230975859993204150666423538988557839555560243929065415434980904258310530753006723857139742334640122533598517597674807096648905501653461687601339782814316124971547968912893214002992086353183070342498989426570593",
-	"5521712099665906221540423207019333379125265462121169655563495403888449493493629943498064604536961775110765377745550377067893607246020694972959780839151452457728855382113555867743022746090187341871655890805971735385789993",
-	"203956878356401977405765866929034577280193993314348263094772646453283062722701277632936616063144088173312372882677123879538709400158306567338328279154499698366071906766440037074217117805690872792848149112022286332144876183376326512083574821647933992961249917319836219304274280243803104015000563790123",
-
-	// ECC primes: http://tools.ietf.org/html/draft-ladd-safecurves-02
-	"3618502788666131106986593281521497120414687020801267626233049500247285301239",                                                                                  // Curve1174: 2^251-9
-	"57896044618658097711785492504343953926634992332820282019728792003956564819949",                                                                                 // Curve25519: 2^255-19
-	"9850501549098619803069760025035903451269934817616361666987073351061430442874302652853566563721228910201656997576599",                                           // E-382: 2^382-105
-	"42307582002575910332922579714097346549017899709713998034217522897561970639123926132812109468141778230245837569601494931472367",                                 // Curve41417: 2^414-17
-	"6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151", // E-521: 2^521-1
-}
-
-var composites = []string{
-	"0",
-	"1",
-	"21284175091214687912771199898307297748211672914763848041968395774954376176754",
-	"6084766654921918907427900243509372380954290099172559290432744450051395395951",
-	"84594350493221918389213352992032324280367711247940675652888030554255915464401",
-	"82793403787388584738507275144194252681",
-}
-
-func TestProbablyPrime(t *testing.T) {
-	nreps := 20
-	if testing.Short() {
-		nreps = 1
-	}
-	for i, s := range primes {
-		p, _ := new(Int).SetString(s, 10)
-		if !p.ProbablyPrime(nreps) {
-			t.Errorf("#%d prime found to be non-prime (%s)", i, s)
-		}
-	}
-
-	for i, s := range composites {
-		c, _ := new(Int).SetString(s, 10)
-		if c.ProbablyPrime(nreps) {
-			t.Errorf("#%d composite found to be prime (%s)", i, s)
-		}
-		if testing.Short() {
-			break
-		}
-	}
-
-	// check that ProbablyPrime panics if n <= 0
-	c := NewInt(11) // a prime
-	for _, n := range []int{-1, 0, 1} {
-		func() {
-			defer func() {
-				if n <= 0 && recover() == nil {
-					t.Fatalf("expected panic from ProbablyPrime(%d)", n)
-				}
-			}()
-			if !c.ProbablyPrime(n) {
-				t.Fatalf("%v should be a prime", c)
-			}
-		}()
-	}
-}
-
-type intShiftTest struct {
-	in    string
-	shift uint
-	out   string
-}
-
-var rshTests = []intShiftTest{
-	{"0", 0, "0"},
-	{"-0", 0, "0"},
-	{"0", 1, "0"},
-	{"0", 2, "0"},
-	{"1", 0, "1"},
-	{"1", 1, "0"},
-	{"1", 2, "0"},
-	{"2", 0, "2"},
-	{"2", 1, "1"},
-	{"-1", 0, "-1"},
-	{"-1", 1, "-1"},
-	{"-1", 10, "-1"},
-	{"-100", 2, "-25"},
-	{"-100", 3, "-13"},
-	{"-100", 100, "-1"},
-	{"4294967296", 0, "4294967296"},
-	{"4294967296", 1, "2147483648"},
-	{"4294967296", 2, "1073741824"},
-	{"18446744073709551616", 0, "18446744073709551616"},
-	{"18446744073709551616", 1, "9223372036854775808"},
-	{"18446744073709551616", 2, "4611686018427387904"},
-	{"18446744073709551616", 64, "1"},
-	{"340282366920938463463374607431768211456", 64, "18446744073709551616"},
-	{"340282366920938463463374607431768211456", 128, "1"},
-}
-
-func TestRsh(t *testing.T) {
-	for i, test := range rshTests {
-		in, _ := new(Int).SetString(test.in, 10)
-		expected, _ := new(Int).SetString(test.out, 10)
-		out := new(Int).Rsh(in, test.shift)
-
-		if !isNormalized(out) {
-			t.Errorf("#%d: %v is not normalized", i, *out)
-		}
-		if out.Cmp(expected) != 0 {
-			t.Errorf("#%d: got %s want %s", i, out, expected)
-		}
-	}
-}
-
-func TestRshSelf(t *testing.T) {
-	for i, test := range rshTests {
-		z, _ := new(Int).SetString(test.in, 10)
-		expected, _ := new(Int).SetString(test.out, 10)
-		z.Rsh(z, test.shift)
-
-		if !isNormalized(z) {
-			t.Errorf("#%d: %v is not normalized", i, *z)
-		}
-		if z.Cmp(expected) != 0 {
-			t.Errorf("#%d: got %s want %s", i, z, expected)
-		}
-	}
-}
-
-var lshTests = []intShiftTest{
-	{"0", 0, "0"},
-	{"0", 1, "0"},
-	{"0", 2, "0"},
-	{"1", 0, "1"},
-	{"1", 1, "2"},
-	{"1", 2, "4"},
-	{"2", 0, "2"},
-	{"2", 1, "4"},
-	{"2", 2, "8"},
-	{"-87", 1, "-174"},
-	{"4294967296", 0, "4294967296"},
-	{"4294967296", 1, "8589934592"},
-	{"4294967296", 2, "17179869184"},
-	{"18446744073709551616", 0, "18446744073709551616"},
-	{"9223372036854775808", 1, "18446744073709551616"},
-	{"4611686018427387904", 2, "18446744073709551616"},
-	{"1", 64, "18446744073709551616"},
-	{"18446744073709551616", 64, "340282366920938463463374607431768211456"},
-	{"1", 128, "340282366920938463463374607431768211456"},
-}
-
-func TestLsh(t *testing.T) {
-	for i, test := range lshTests {
-		in, _ := new(Int).SetString(test.in, 10)
-		expected, _ := new(Int).SetString(test.out, 10)
-		out := new(Int).Lsh(in, test.shift)
-
-		if !isNormalized(out) {
-			t.Errorf("#%d: %v is not normalized", i, *out)
-		}
-		if out.Cmp(expected) != 0 {
-			t.Errorf("#%d: got %s want %s", i, out, expected)
-		}
-	}
-}
-
-func TestLshSelf(t *testing.T) {
-	for i, test := range lshTests {
-		z, _ := new(Int).SetString(test.in, 10)
-		expected, _ := new(Int).SetString(test.out, 10)
-		z.Lsh(z, test.shift)
-
-		if !isNormalized(z) {
-			t.Errorf("#%d: %v is not normalized", i, *z)
-		}
-		if z.Cmp(expected) != 0 {
-			t.Errorf("#%d: got %s want %s", i, z, expected)
-		}
-	}
-}
-
-func TestLshRsh(t *testing.T) {
-	for i, test := range rshTests {
-		in, _ := new(Int).SetString(test.in, 10)
-		out := new(Int).Lsh(in, test.shift)
-		out = out.Rsh(out, test.shift)
-
-		if !isNormalized(out) {
-			t.Errorf("#%d: %v is not normalized", i, *out)
-		}
-		if in.Cmp(out) != 0 {
-			t.Errorf("#%d: got %s want %s", i, out, in)
-		}
-	}
-	for i, test := range lshTests {
-		in, _ := new(Int).SetString(test.in, 10)
-		out := new(Int).Lsh(in, test.shift)
-		out.Rsh(out, test.shift)
-
-		if !isNormalized(out) {
-			t.Errorf("#%d: %v is not normalized", i, *out)
-		}
-		if in.Cmp(out) != 0 {
-			t.Errorf("#%d: got %s want %s", i, out, in)
-		}
-	}
-}
-
-var int64Tests = []int64{
-	0,
-	1,
-	-1,
-	4294967295,
-	-4294967295,
-	4294967296,
-	-4294967296,
-	9223372036854775807,
-	-9223372036854775807,
-	-9223372036854775808,
-}
-
-func TestInt64(t *testing.T) {
-	for i, testVal := range int64Tests {
-		in := NewInt(testVal)
-		out := in.Int64()
-
-		if out != testVal {
-			t.Errorf("#%d got %d want %d", i, out, testVal)
-		}
-	}
-}
-
-var uint64Tests = []uint64{
-	0,
-	1,
-	4294967295,
-	4294967296,
-	8589934591,
-	8589934592,
-	9223372036854775807,
-	9223372036854775808,
-	18446744073709551615, // 1<<64 - 1
-}
-
-func TestUint64(t *testing.T) {
-	in := new(Int)
-	for i, testVal := range uint64Tests {
-		in.SetUint64(testVal)
-		out := in.Uint64()
-
-		if out != testVal {
-			t.Errorf("#%d got %d want %d", i, out, testVal)
-		}
-
-		str := fmt.Sprint(testVal)
-		strOut := in.String()
-		if strOut != str {
-			t.Errorf("#%d.String got %s want %s", i, strOut, str)
-		}
-	}
-}
-
-var bitwiseTests = []struct {
-	x, y                 string
-	and, or, xor, andNot string
-}{
-	{"0x00", "0x00", "0x00", "0x00", "0x00", "0x00"},
-	{"0x00", "0x01", "0x00", "0x01", "0x01", "0x00"},
-	{"0x01", "0x00", "0x00", "0x01", "0x01", "0x01"},
-	{"-0x01", "0x00", "0x00", "-0x01", "-0x01", "-0x01"},
-	{"-0xaf", "-0x50", "-0xf0", "-0x0f", "0xe1", "0x41"},
-	{"0x00", "-0x01", "0x00", "-0x01", "-0x01", "0x00"},
-	{"0x01", "0x01", "0x01", "0x01", "0x00", "0x00"},
-	{"-0x01", "-0x01", "-0x01", "-0x01", "0x00", "0x00"},
-	{"0x07", "0x08", "0x00", "0x0f", "0x0f", "0x07"},
-	{"0x05", "0x0f", "0x05", "0x0f", "0x0a", "0x00"},
-	{"0xff", "-0x0a", "0xf6", "-0x01", "-0xf7", "0x09"},
-	{"0x013ff6", "0x9a4e", "0x1a46", "0x01bffe", "0x01a5b8", "0x0125b0"},
-	{"-0x013ff6", "0x9a4e", "0x800a", "-0x0125b2", "-0x01a5bc", "-0x01c000"},
-	{"-0x013ff6", "-0x9a4e", "-0x01bffe", "-0x1a46", "0x01a5b8", "0x8008"},
-	{
-		"0x1000009dc6e3d9822cba04129bcbe3401",
-		"0xb9bd7d543685789d57cb918e833af352559021483cdb05cc21fd",
-		"0x1000001186210100001000009048c2001",
-		"0xb9bd7d543685789d57cb918e8bfeff7fddb2ebe87dfbbdfe35fd",
-		"0xb9bd7d543685789d57ca918e8ae69d6fcdb2eae87df2b97215fc",
-		"0x8c40c2d8822caa04120b8321400",
-	},
-	{
-		"0x1000009dc6e3d9822cba04129bcbe3401",
-		"-0xb9bd7d543685789d57cb918e833af352559021483cdb05cc21fd",
-		"0x8c40c2d8822caa04120b8321401",
-		"-0xb9bd7d543685789d57ca918e82229142459020483cd2014001fd",
-		"-0xb9bd7d543685789d57ca918e8ae69d6fcdb2eae87df2b97215fe",
-		"0x1000001186210100001000009048c2000",
-	},
-	{
-		"-0x1000009dc6e3d9822cba04129bcbe3401",
-		"-0xb9bd7d543685789d57cb918e833af352559021483cdb05cc21fd",
-		"-0xb9bd7d543685789d57cb918e8bfeff7fddb2ebe87dfbbdfe35fd",
-		"-0x1000001186210100001000009048c2001",
-		"0xb9bd7d543685789d57ca918e8ae69d6fcdb2eae87df2b97215fc",
-		"0xb9bd7d543685789d57ca918e82229142459020483cd2014001fc",
-	},
-}
-
-type bitFun func(z, x, y *Int) *Int
-
-func testBitFun(t *testing.T, msg string, f bitFun, x, y *Int, exp string) {
-	expected := new(Int)
-	expected.SetString(exp, 0)
-
-	out := f(new(Int), x, y)
-	if out.Cmp(expected) != 0 {
-		t.Errorf("%s: got %s want %s", msg, out, expected)
-	}
-}
-
-func testBitFunSelf(t *testing.T, msg string, f bitFun, x, y *Int, exp string) {
-	self := new(Int)
-	self.Set(x)
-	expected := new(Int)
-	expected.SetString(exp, 0)
-
-	self = f(self, self, y)
-	if self.Cmp(expected) != 0 {
-		t.Errorf("%s: got %s want %s", msg, self, expected)
-	}
-}
-
-func altBit(x *Int, i int) uint {
-	z := new(Int).Rsh(x, uint(i))
-	z = z.And(z, NewInt(1))
-	if z.Cmp(new(Int)) != 0 {
-		return 1
-	}
-	return 0
-}
-
-func altSetBit(z *Int, x *Int, i int, b uint) *Int {
-	one := NewInt(1)
-	m := one.Lsh(one, uint(i))
-	switch b {
-	case 1:
-		return z.Or(x, m)
-	case 0:
-		return z.AndNot(x, m)
-	}
-	panic("set bit is not 0 or 1")
-}
-
-func testBitset(t *testing.T, x *Int) {
-	n := x.BitLen()
-	z := new(Int).Set(x)
-	z1 := new(Int).Set(x)
-	for i := 0; i < n+10; i++ {
-		old := z.Bit(i)
-		old1 := altBit(z1, i)
-		if old != old1 {
-			t.Errorf("bitset: inconsistent value for Bit(%s, %d), got %v want %v", z1, i, old, old1)
-		}
-		z := new(Int).SetBit(z, i, 1)
-		z1 := altSetBit(new(Int), z1, i, 1)
-		if z.Bit(i) == 0 {
-			t.Errorf("bitset: bit %d of %s got 0 want 1", i, x)
-		}
-		if z.Cmp(z1) != 0 {
-			t.Errorf("bitset: inconsistent value after SetBit 1, got %s want %s", z, z1)
-		}
-		z.SetBit(z, i, 0)
-		altSetBit(z1, z1, i, 0)
-		if z.Bit(i) != 0 {
-			t.Errorf("bitset: bit %d of %s got 1 want 0", i, x)
-		}
-		if z.Cmp(z1) != 0 {
-			t.Errorf("bitset: inconsistent value after SetBit 0, got %s want %s", z, z1)
-		}
-		altSetBit(z1, z1, i, old)
-		z.SetBit(z, i, old)
-		if z.Cmp(z1) != 0 {
-			t.Errorf("bitset: inconsistent value after SetBit old, got %s want %s", z, z1)
-		}
-	}
-	if z.Cmp(x) != 0 {
-		t.Errorf("bitset: got %s want %s", z, x)
-	}
-}
-
-var bitsetTests = []struct {
-	x string
-	i int
-	b uint
-}{
-	{"0", 0, 0},
-	{"0", 200, 0},
-	{"1", 0, 1},
-	{"1", 1, 0},
-	{"-1", 0, 1},
-	{"-1", 200, 1},
-	{"0x2000000000000000000000000000", 108, 0},
-	{"0x2000000000000000000000000000", 109, 1},
-	{"0x2000000000000000000000000000", 110, 0},
-	{"-0x2000000000000000000000000001", 108, 1},
-	{"-0x2000000000000000000000000001", 109, 0},
-	{"-0x2000000000000000000000000001", 110, 1},
-}
-
-func TestBitSet(t *testing.T) {
-	for _, test := range bitwiseTests {
-		x := new(Int)
-		x.SetString(test.x, 0)
-		testBitset(t, x)
-		x = new(Int)
-		x.SetString(test.y, 0)
-		testBitset(t, x)
-	}
-	for i, test := range bitsetTests {
-		x := new(Int)
-		x.SetString(test.x, 0)
-		b := x.Bit(test.i)
-		if b != test.b {
-			t.Errorf("#%d got %v want %v", i, b, test.b)
-		}
-	}
-	z := NewInt(1)
-	z.SetBit(NewInt(0), 2, 1)
-	if z.Cmp(NewInt(4)) != 0 {
-		t.Errorf("destination leaked into result; got %s want 4", z)
-	}
-}
-
-func BenchmarkBitset(b *testing.B) {
-	z := new(Int)
-	z.SetBit(z, 512, 1)
-	b.ResetTimer()
-	b.StartTimer()
-	for i := b.N - 1; i >= 0; i-- {
-		z.SetBit(z, i&512, 1)
-	}
-}
-
-func BenchmarkBitsetNeg(b *testing.B) {
-	z := NewInt(-1)
-	z.SetBit(z, 512, 0)
-	b.ResetTimer()
-	b.StartTimer()
-	for i := b.N - 1; i >= 0; i-- {
-		z.SetBit(z, i&512, 0)
-	}
-}
-
-func BenchmarkBitsetOrig(b *testing.B) {
-	z := new(Int)
-	altSetBit(z, z, 512, 1)
-	b.ResetTimer()
-	b.StartTimer()
-	for i := b.N - 1; i >= 0; i-- {
-		altSetBit(z, z, i&512, 1)
-	}
-}
-
-func BenchmarkBitsetNegOrig(b *testing.B) {
-	z := NewInt(-1)
-	altSetBit(z, z, 512, 0)
-	b.ResetTimer()
-	b.StartTimer()
-	for i := b.N - 1; i >= 0; i-- {
-		altSetBit(z, z, i&512, 0)
-	}
-}
-
-func TestBitwise(t *testing.T) {
-	x := new(Int)
-	y := new(Int)
-	for _, test := range bitwiseTests {
-		x.SetString(test.x, 0)
-		y.SetString(test.y, 0)
-
-		testBitFun(t, "and", (*Int).And, x, y, test.and)
-		testBitFunSelf(t, "and", (*Int).And, x, y, test.and)
-		testBitFun(t, "andNot", (*Int).AndNot, x, y, test.andNot)
-		testBitFunSelf(t, "andNot", (*Int).AndNot, x, y, test.andNot)
-		testBitFun(t, "or", (*Int).Or, x, y, test.or)
-		testBitFunSelf(t, "or", (*Int).Or, x, y, test.or)
-		testBitFun(t, "xor", (*Int).Xor, x, y, test.xor)
-		testBitFunSelf(t, "xor", (*Int).Xor, x, y, test.xor)
-	}
-}
-
-var notTests = []struct {
-	in  string
-	out string
-}{
-	{"0", "-1"},
-	{"1", "-2"},
-	{"7", "-8"},
-	{"0", "-1"},
-	{"-81910", "81909"},
-	{
-		"298472983472983471903246121093472394872319615612417471234712061",
-		"-298472983472983471903246121093472394872319615612417471234712062",
-	},
-}
-
-func TestNot(t *testing.T) {
-	in := new(Int)
-	out := new(Int)
-	expected := new(Int)
-	for i, test := range notTests {
-		in.SetString(test.in, 10)
-		expected.SetString(test.out, 10)
-		out = out.Not(in)
-		if out.Cmp(expected) != 0 {
-			t.Errorf("#%d: got %s want %s", i, out, expected)
-		}
-		out = out.Not(out)
-		if out.Cmp(in) != 0 {
-			t.Errorf("#%d: got %s want %s", i, out, in)
-		}
-	}
-}
-
-var modInverseTests = []struct {
-	element string
-	modulus string
-}{
-	{"1234567", "458948883992"},
-	{"239487239847", "2410312426921032588552076022197566074856950548502459942654116941958108831682612228890093858261341614673227141477904012196503648957050582631942730706805009223062734745341073406696246014589361659774041027169249453200378729434170325843778659198143763193776859869524088940195577346119843545301547043747207749969763750084308926339295559968882457872412993810129130294592999947926365264059284647209730384947211681434464714438488520940127459844288859336526896320919633919"},
-}
-
-func TestModInverse(t *testing.T) {
-	var element, modulus, gcd, inverse Int
-	one := NewInt(1)
-	for i, test := range modInverseTests {
-		(&element).SetString(test.element, 10)
-		(&modulus).SetString(test.modulus, 10)
-		(&inverse).ModInverse(&element, &modulus)
-		(&inverse).Mul(&inverse, &element)
-		(&inverse).Mod(&inverse, &modulus)
-		if (&inverse).Cmp(one) != 0 {
-			t.Errorf("#%d: failed (e·e^(-1)=%s)", i, &inverse)
-		}
-	}
-	// exhaustive test for small values
-	for n := 2; n < 100; n++ {
-		(&modulus).SetInt64(int64(n))
-		for x := 1; x < n; x++ {
-			(&element).SetInt64(int64(x))
-			(&gcd).GCD(nil, nil, &element, &modulus)
-			if (&gcd).Cmp(one) != 0 {
-				continue
-			}
-			(&inverse).ModInverse(&element, &modulus)
-			(&inverse).Mul(&inverse, &element)
-			(&inverse).Mod(&inverse, &modulus)
-			if (&inverse).Cmp(one) != 0 {
-				t.Errorf("ModInverse(%d,%d)*%d%%%d=%d, not 1", &element, &modulus, &element, &modulus, &inverse)
-			}
-		}
-	}
-}
-
-// testModSqrt is a helper for TestModSqrt,
-// which checks that ModSqrt can compute a square-root of elt^2.
-func testModSqrt(t *testing.T, elt, mod, sq, sqrt *Int) bool {
-	var sqChk, sqrtChk, sqrtsq Int
-	sq.Mul(elt, elt)
-	sq.Mod(sq, mod)
-	z := sqrt.ModSqrt(sq, mod)
-	if z != sqrt {
-		t.Errorf("ModSqrt returned wrong value %s", z)
-	}
-
-	// test ModSqrt arguments outside the range [0,mod)
-	sqChk.Add(sq, mod)
-	z = sqrtChk.ModSqrt(&sqChk, mod)
-	if z != &sqrtChk || z.Cmp(sqrt) != 0 {
-		t.Errorf("ModSqrt returned inconsistent value %s", z)
-	}
-	sqChk.Sub(sq, mod)
-	z = sqrtChk.ModSqrt(&sqChk, mod)
-	if z != &sqrtChk || z.Cmp(sqrt) != 0 {
-		t.Errorf("ModSqrt returned inconsistent value %s", z)
-	}
-
-	// make sure we actually got a square root
-	if sqrt.Cmp(elt) == 0 {
-		return true // we found the "desired" square root
-	}
-	sqrtsq.Mul(sqrt, sqrt) // make sure we found the "other" one
-	sqrtsq.Mod(&sqrtsq, mod)
-	return sq.Cmp(&sqrtsq) == 0
-}
-
-func TestModSqrt(t *testing.T) {
-	var elt, mod, modx4, sq, sqrt Int
-	r := rand.New(rand.NewSource(9))
-	for i, s := range primes[1:] { // skip 2, use only odd primes
-		mod.SetString(s, 10)
-		modx4.Lsh(&mod, 2)
-
-		// test a few random elements per prime
-		for x := 1; x < 5; x++ {
-			elt.Rand(r, &modx4)
-			elt.Sub(&elt, &mod) // test range [-mod, 3*mod)
-			if !testModSqrt(t, &elt, &mod, &sq, &sqrt) {
-				t.Errorf("#%d: failed (sqrt(e) = %s)", i, &sqrt)
-			}
-		}
-	}
-
-	// exhaustive test for small values
-	for n := 3; n < 100; n++ {
-		mod.SetInt64(int64(n))
-		if !mod.ProbablyPrime(10) {
-			continue
-		}
-		isSquare := make([]bool, n)
-
-		// test all the squares
-		for x := 1; x < n; x++ {
-			elt.SetInt64(int64(x))
-			if !testModSqrt(t, &elt, &mod, &sq, &sqrt) {
-				t.Errorf("#%d: failed (sqrt(%d,%d) = %s)", x, &elt, &mod, &sqrt)
-			}
-			isSquare[sq.Uint64()] = true
-		}
-
-		// test all non-squares
-		for x := 1; x < n; x++ {
-			sq.SetInt64(int64(x))
-			z := sqrt.ModSqrt(&sq, &mod)
-			if !isSquare[x] && z != nil {
-				t.Errorf("#%d: failed (sqrt(%d,%d) = nil)", x, &sqrt, &mod)
-			}
-		}
-	}
-}
-
-func TestJacobi(t *testing.T) {
-	testCases := []struct {
-		x, y   int64
-		result int
-	}{
-		{0, 1, 1},
-		{0, -1, 1},
-		{1, 1, 1},
-		{1, -1, 1},
-		{0, 5, 0},
-		{1, 5, 1},
-		{2, 5, -1},
-		{-2, 5, -1},
-		{2, -5, -1},
-		{-2, -5, 1},
-		{3, 5, -1},
-		{5, 5, 0},
-		{-5, 5, 0},
-		{6, 5, 1},
-		{6, -5, 1},
-		{-6, 5, 1},
-		{-6, -5, -1},
-	}
-
-	var x, y Int
-
-	for i, test := range testCases {
-		x.SetInt64(test.x)
-		y.SetInt64(test.y)
-		expected := test.result
-		actual := Jacobi(&x, &y)
-		if actual != expected {
-			t.Errorf("#%d: Jacobi(%d, %d) = %d, but expected %d", i, test.x, test.y, actual, expected)
-		}
-	}
-}
-
-func TestJacobiPanic(t *testing.T) {
-	const failureMsg = "test failure"
-	defer func() {
-		msg := recover()
-		if msg == nil || msg == failureMsg {
-			panic(msg)
-		}
-		t.Log(msg)
-	}()
-	x := NewInt(1)
-	y := NewInt(2)
-	// Jacobi should panic when the second argument is even.
-	Jacobi(x, y)
-	panic(failureMsg)
-}
-
-var encodingTests = []string{
-	"-539345864568634858364538753846587364875430589374589",
-	"-678645873",
-	"-100",
-	"-2",
-	"-1",
-	"0",
-	"1",
-	"2",
-	"10",
-	"42",
-	"1234567890",
-	"298472983472983471903246121093472394872319615612417471234712061",
-}
-
-func TestIntGobEncoding(t *testing.T) {
-	var medium bytes.Buffer
-	enc := gob.NewEncoder(&medium)
-	dec := gob.NewDecoder(&medium)
-	for _, test := range encodingTests {
-		medium.Reset() // empty buffer for each test case (in case of failures)
-		var tx Int
-		tx.SetString(test, 10)
-		if err := enc.Encode(&tx); err != nil {
-			t.Errorf("encoding of %s failed: %s", &tx, err)
-		}
-		var rx Int
-		if err := dec.Decode(&rx); err != nil {
-			t.Errorf("decoding of %s failed: %s", &tx, err)
-		}
-		if rx.Cmp(&tx) != 0 {
-			t.Errorf("transmission of %s failed: got %s want %s", &tx, &rx, &tx)
-		}
-	}
-}
-
-// Sending a nil Int pointer (inside a slice) on a round trip through gob should yield a zero.
-// TODO: top-level nils.
-func TestGobEncodingNilIntInSlice(t *testing.T) {
-	buf := new(bytes.Buffer)
-	enc := gob.NewEncoder(buf)
-	dec := gob.NewDecoder(buf)
-
-	var in = make([]*Int, 1)
-	err := enc.Encode(&in)
-	if err != nil {
-		t.Errorf("gob encode failed: %q", err)
-	}
-	var out []*Int
-	err = dec.Decode(&out)
-	if err != nil {
-		t.Fatalf("gob decode failed: %q", err)
-	}
-	if len(out) != 1 {
-		t.Fatalf("wrong len; want 1 got %d", len(out))
-	}
-	var zero Int
-	if out[0].Cmp(&zero) != 0 {
-		t.Errorf("transmission of (*Int)(nill) failed: got %s want 0", out)
-	}
-}
-
-func TestIntJSONEncoding(t *testing.T) {
-	for _, test := range encodingTests {
-		var tx Int
-		tx.SetString(test, 10)
-		b, err := json.Marshal(&tx)
-		if err != nil {
-			t.Errorf("marshaling of %s failed: %s", &tx, err)
-		}
-		var rx Int
-		if err := json.Unmarshal(b, &rx); err != nil {
-			t.Errorf("unmarshaling of %s failed: %s", &tx, err)
-		}
-		if rx.Cmp(&tx) != 0 {
-			t.Errorf("JSON encoding of %s failed: got %s want %s", &tx, &rx, &tx)
-		}
-	}
-}
-
-var intVals = []string{
-	"-141592653589793238462643383279502884197169399375105820974944592307816406286",
-	"-1415926535897932384626433832795028841971",
-	"-141592653589793",
-	"-1",
-	"0",
-	"1",
-	"141592653589793",
-	"1415926535897932384626433832795028841971",
-	"141592653589793238462643383279502884197169399375105820974944592307816406286",
-}
-
-func TestIntJSONEncodingTextMarshaller(t *testing.T) {
-	for _, num := range intVals {
-		var tx Int
-		tx.SetString(num, 0)
-		b, err := json.Marshal(&tx)
-		if err != nil {
-			t.Errorf("marshaling of %s failed: %s", &tx, err)
-			continue
-		}
-		var rx Int
-		if err := json.Unmarshal(b, &rx); err != nil {
-			t.Errorf("unmarshaling of %s failed: %s", &tx, err)
-			continue
-		}
-		if rx.Cmp(&tx) != 0 {
-			t.Errorf("JSON encoding of %s failed: got %s want %s", &tx, &rx, &tx)
-		}
-	}
-}
-
-func TestIntXMLEncodingTextMarshaller(t *testing.T) {
-	for _, num := range intVals {
-		var tx Int
-		tx.SetString(num, 0)
-		b, err := xml.Marshal(&tx)
-		if err != nil {
-			t.Errorf("marshaling of %s failed: %s", &tx, err)
-			continue
-		}
-		var rx Int
-		if err := xml.Unmarshal(b, &rx); err != nil {
-			t.Errorf("unmarshaling of %s failed: %s", &tx, err)
-			continue
-		}
-		if rx.Cmp(&tx) != 0 {
-			t.Errorf("XML encoding of %s failed: got %s want %s", &tx, &rx, &tx)
-		}
-	}
-}
-
-func TestIssue2607(t *testing.T) {
-	// This code sequence used to hang.
-	n := NewInt(10)
-	n.Rand(rand.New(rand.NewSource(9)), n)
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/intconv.go b/third_party/gofrontend/libgo/go/math/big/intconv.go
deleted file mode 100644
index 9c68a22..0000000
--- a/third_party/gofrontend/libgo/go/math/big/intconv.go
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements int-to-string conversion functions.
-
-package big
-
-import (
-	"errors"
-	"fmt"
-	"io"
-)
-
-func (x *Int) String() string {
-	switch {
-	case x == nil:
-		return "<nil>"
-	case x.neg:
-		return "-" + x.abs.decimalString()
-	}
-	return x.abs.decimalString()
-}
-
-func charset(ch rune) string {
-	switch ch {
-	case 'b':
-		return lowercaseDigits[0:2]
-	case 'o':
-		return lowercaseDigits[0:8]
-	case 'd', 's', 'v':
-		return lowercaseDigits[0:10]
-	case 'x':
-		return lowercaseDigits[0:16]
-	case 'X':
-		return uppercaseDigits[0:16]
-	}
-	return "" // unknown format
-}
-
-// write count copies of text to s
-func writeMultiple(s fmt.State, text string, count int) {
-	if len(text) > 0 {
-		b := []byte(text)
-		for ; count > 0; count-- {
-			s.Write(b)
-		}
-	}
-}
-
-// Format is a support routine for fmt.Formatter. It accepts
-// the formats 'b' (binary), 'o' (octal), 'd' (decimal), 'x'
-// (lowercase hexadecimal), and 'X' (uppercase hexadecimal).
-// Also supported are the full suite of package fmt's format
-// verbs for integral types, including '+', '-', and ' '
-// for sign control, '#' for leading zero in octal and for
-// hexadecimal, a leading "0x" or "0X" for "%#x" and "%#X"
-// respectively, specification of minimum digits precision,
-// output field width, space or zero padding, and left or
-// right justification.
-//
-func (x *Int) Format(s fmt.State, ch rune) {
-	cs := charset(ch)
-
-	// special cases
-	switch {
-	case cs == "":
-		// unknown format
-		fmt.Fprintf(s, "%%!%c(big.Int=%s)", ch, x.String())
-		return
-	case x == nil:
-		fmt.Fprint(s, "<nil>")
-		return
-	}
-
-	// determine sign character
-	sign := ""
-	switch {
-	case x.neg:
-		sign = "-"
-	case s.Flag('+'): // supersedes ' ' when both specified
-		sign = "+"
-	case s.Flag(' '):
-		sign = " "
-	}
-
-	// determine prefix characters for indicating output base
-	prefix := ""
-	if s.Flag('#') {
-		switch ch {
-		case 'o': // octal
-			prefix = "0"
-		case 'x': // hexadecimal
-			prefix = "0x"
-		case 'X':
-			prefix = "0X"
-		}
-	}
-
-	// determine digits with base set by len(cs) and digit characters from cs
-	digits := x.abs.string(cs)
-
-	// number of characters for the three classes of number padding
-	var left int   // space characters to left of digits for right justification ("%8d")
-	var zeroes int // zero characters (actually cs[0]) as left-most digits ("%.8d")
-	var right int  // space characters to right of digits for left justification ("%-8d")
-
-	// determine number padding from precision: the least number of digits to output
-	precision, precisionSet := s.Precision()
-	if precisionSet {
-		switch {
-		case len(digits) < precision:
-			zeroes = precision - len(digits) // count of zero padding
-		case digits == "0" && precision == 0:
-			return // print nothing if zero value (x == 0) and zero precision ("." or ".0")
-		}
-	}
-
-	// determine field pad from width: the least number of characters to output
-	length := len(sign) + len(prefix) + zeroes + len(digits)
-	if width, widthSet := s.Width(); widthSet && length < width { // pad as specified
-		switch d := width - length; {
-		case s.Flag('-'):
-			// pad on the right with spaces; supersedes '0' when both specified
-			right = d
-		case s.Flag('0') && !precisionSet:
-			// pad with zeroes unless precision also specified
-			zeroes = d
-		default:
-			// pad on the left with spaces
-			left = d
-		}
-	}
-
-	// print number as [left pad][sign][prefix][zero pad][digits][right pad]
-	writeMultiple(s, " ", left)
-	writeMultiple(s, sign, 1)
-	writeMultiple(s, prefix, 1)
-	writeMultiple(s, "0", zeroes)
-	writeMultiple(s, digits, 1)
-	writeMultiple(s, " ", right)
-}
-
-// scan sets z to the integer value corresponding to the longest possible prefix
-// read from r representing a signed integer number in a given conversion base.
-// It returns z, the actual conversion base used, and an error, if any. In the
-// error case, the value of z is undefined but the returned value is nil. The
-// syntax follows the syntax of integer literals in Go.
-//
-// The base argument must be 0 or a value from 2 through MaxBase. If the base
-// is 0, the string prefix determines the actual conversion base. A prefix of
-// ``0x'' or ``0X'' selects base 16; the ``0'' prefix selects base 8, and a
-// ``0b'' or ``0B'' prefix selects base 2. Otherwise the selected base is 10.
-//
-func (z *Int) scan(r io.ByteScanner, base int) (*Int, int, error) {
-	// determine sign
-	neg, err := scanSign(r)
-	if err != nil {
-		return nil, 0, err
-	}
-
-	// determine mantissa
-	z.abs, base, _, err = z.abs.scan(r, base, false)
-	if err != nil {
-		return nil, base, err
-	}
-	z.neg = len(z.abs) > 0 && neg // 0 has no sign
-
-	return z, base, nil
-}
-
-func scanSign(r io.ByteScanner) (neg bool, err error) {
-	var ch byte
-	if ch, err = r.ReadByte(); err != nil {
-		return false, err
-	}
-	switch ch {
-	case '-':
-		neg = true
-	case '+':
-		// nothing to do
-	default:
-		r.UnreadByte()
-	}
-	return
-}
-
-// byteReader is a local wrapper around fmt.ScanState;
-// it implements the ByteReader interface.
-type byteReader struct {
-	fmt.ScanState
-}
-
-func (r byteReader) ReadByte() (byte, error) {
-	ch, size, err := r.ReadRune()
-	if size != 1 && err == nil {
-		err = fmt.Errorf("invalid rune %#U", ch)
-	}
-	return byte(ch), err
-}
-
-func (r byteReader) UnreadByte() error {
-	return r.UnreadRune()
-}
-
-// Scan is a support routine for fmt.Scanner; it sets z to the value of
-// the scanned number. It accepts the formats 'b' (binary), 'o' (octal),
-// 'd' (decimal), 'x' (lowercase hexadecimal), and 'X' (uppercase hexadecimal).
-func (z *Int) Scan(s fmt.ScanState, ch rune) error {
-	s.SkipSpace() // skip leading space characters
-	base := 0
-	switch ch {
-	case 'b':
-		base = 2
-	case 'o':
-		base = 8
-	case 'd':
-		base = 10
-	case 'x', 'X':
-		base = 16
-	case 's', 'v':
-		// let scan determine the base
-	default:
-		return errors.New("Int.Scan: invalid verb")
-	}
-	_, _, err := z.scan(byteReader{s}, base)
-	return err
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/intconv_test.go b/third_party/gofrontend/libgo/go/math/big/intconv_test.go
deleted file mode 100644
index 2deb84b..0000000
--- a/third_party/gofrontend/libgo/go/math/big/intconv_test.go
+++ /dev/null
@@ -1,342 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package big
-
-import (
-	"bytes"
-	"fmt"
-	"testing"
-)
-
-var stringTests = []struct {
-	in   string
-	out  string
-	base int
-	val  int64
-	ok   bool
-}{
-	{in: "", ok: false},
-	{in: "a", ok: false},
-	{in: "z", ok: false},
-	{in: "+", ok: false},
-	{in: "-", ok: false},
-	{in: "0b", ok: false},
-	{in: "0x", ok: false},
-	{in: "2", base: 2, ok: false},
-	{in: "0b2", base: 0, ok: false},
-	{in: "08", ok: false},
-	{in: "8", base: 8, ok: false},
-	{in: "0xg", base: 0, ok: false},
-	{in: "g", base: 16, ok: false},
-	{"0", "0", 0, 0, true},
-	{"0", "0", 10, 0, true},
-	{"0", "0", 16, 0, true},
-	{"+0", "0", 0, 0, true},
-	{"-0", "0", 0, 0, true},
-	{"10", "10", 0, 10, true},
-	{"10", "10", 10, 10, true},
-	{"10", "10", 16, 16, true},
-	{"-10", "-10", 16, -16, true},
-	{"+10", "10", 16, 16, true},
-	{"0x10", "16", 0, 16, true},
-	{in: "0x10", base: 16, ok: false},
-	{"-0x10", "-16", 0, -16, true},
-	{"+0x10", "16", 0, 16, true},
-	{"00", "0", 0, 0, true},
-	{"0", "0", 8, 0, true},
-	{"07", "7", 0, 7, true},
-	{"7", "7", 8, 7, true},
-	{"023", "19", 0, 19, true},
-	{"23", "23", 8, 19, true},
-	{"cafebabe", "cafebabe", 16, 0xcafebabe, true},
-	{"0b0", "0", 0, 0, true},
-	{"-111", "-111", 2, -7, true},
-	{"-0b111", "-7", 0, -7, true},
-	{"0b1001010111", "599", 0, 0x257, true},
-	{"1001010111", "1001010111", 2, 0x257, true},
-}
-
-func format(base int) string {
-	switch base {
-	case 2:
-		return "%b"
-	case 8:
-		return "%o"
-	case 16:
-		return "%x"
-	}
-	return "%d"
-}
-
-func TestGetString(t *testing.T) {
-	z := new(Int)
-	for i, test := range stringTests {
-		if !test.ok {
-			continue
-		}
-		z.SetInt64(test.val)
-
-		if test.base == 10 {
-			s := z.String()
-			if s != test.out {
-				t.Errorf("#%da got %s; want %s", i, s, test.out)
-			}
-		}
-
-		s := fmt.Sprintf(format(test.base), z)
-		if s != test.out {
-			t.Errorf("#%db got %s; want %s", i, s, test.out)
-		}
-	}
-}
-
-func TestSetString(t *testing.T) {
-	tmp := new(Int)
-	for i, test := range stringTests {
-		// initialize to a non-zero value so that issues with parsing
-		// 0 are detected
-		tmp.SetInt64(1234567890)
-		n1, ok1 := new(Int).SetString(test.in, test.base)
-		n2, ok2 := tmp.SetString(test.in, test.base)
-		expected := NewInt(test.val)
-		if ok1 != test.ok || ok2 != test.ok {
-			t.Errorf("#%d (input '%s') ok incorrect (should be %t)", i, test.in, test.ok)
-			continue
-		}
-		if !ok1 {
-			if n1 != nil {
-				t.Errorf("#%d (input '%s') n1 != nil", i, test.in)
-			}
-			continue
-		}
-		if !ok2 {
-			if n2 != nil {
-				t.Errorf("#%d (input '%s') n2 != nil", i, test.in)
-			}
-			continue
-		}
-
-		if ok1 && !isNormalized(n1) {
-			t.Errorf("#%d (input '%s'): %v is not normalized", i, test.in, *n1)
-		}
-		if ok2 && !isNormalized(n2) {
-			t.Errorf("#%d (input '%s'): %v is not normalized", i, test.in, *n2)
-		}
-
-		if n1.Cmp(expected) != 0 {
-			t.Errorf("#%d (input '%s') got: %s want: %d", i, test.in, n1, test.val)
-		}
-		if n2.Cmp(expected) != 0 {
-			t.Errorf("#%d (input '%s') got: %s want: %d", i, test.in, n2, test.val)
-		}
-	}
-}
-
-var formatTests = []struct {
-	input  string
-	format string
-	output string
-}{
-	{"<nil>", "%x", "<nil>"},
-	{"<nil>", "%#x", "<nil>"},
-	{"<nil>", "%#y", "%!y(big.Int=<nil>)"},
-
-	{"10", "%b", "1010"},
-	{"10", "%o", "12"},
-	{"10", "%d", "10"},
-	{"10", "%v", "10"},
-	{"10", "%x", "a"},
-	{"10", "%X", "A"},
-	{"-10", "%X", "-A"},
-	{"10", "%y", "%!y(big.Int=10)"},
-	{"-10", "%y", "%!y(big.Int=-10)"},
-
-	{"10", "%#b", "1010"},
-	{"10", "%#o", "012"},
-	{"10", "%#d", "10"},
-	{"10", "%#v", "10"},
-	{"10", "%#x", "0xa"},
-	{"10", "%#X", "0XA"},
-	{"-10", "%#X", "-0XA"},
-	{"10", "%#y", "%!y(big.Int=10)"},
-	{"-10", "%#y", "%!y(big.Int=-10)"},
-
-	{"1234", "%d", "1234"},
-	{"1234", "%3d", "1234"},
-	{"1234", "%4d", "1234"},
-	{"-1234", "%d", "-1234"},
-	{"1234", "% 5d", " 1234"},
-	{"1234", "%+5d", "+1234"},
-	{"1234", "%-5d", "1234 "},
-	{"1234", "%x", "4d2"},
-	{"1234", "%X", "4D2"},
-	{"-1234", "%3x", "-4d2"},
-	{"-1234", "%4x", "-4d2"},
-	{"-1234", "%5x", " -4d2"},
-	{"-1234", "%-5x", "-4d2 "},
-	{"1234", "%03d", "1234"},
-	{"1234", "%04d", "1234"},
-	{"1234", "%05d", "01234"},
-	{"1234", "%06d", "001234"},
-	{"-1234", "%06d", "-01234"},
-	{"1234", "%+06d", "+01234"},
-	{"1234", "% 06d", " 01234"},
-	{"1234", "%-6d", "1234  "},
-	{"1234", "%-06d", "1234  "},
-	{"-1234", "%-06d", "-1234 "},
-
-	{"1234", "%.3d", "1234"},
-	{"1234", "%.4d", "1234"},
-	{"1234", "%.5d", "01234"},
-	{"1234", "%.6d", "001234"},
-	{"-1234", "%.3d", "-1234"},
-	{"-1234", "%.4d", "-1234"},
-	{"-1234", "%.5d", "-01234"},
-	{"-1234", "%.6d", "-001234"},
-
-	{"1234", "%8.3d", "    1234"},
-	{"1234", "%8.4d", "    1234"},
-	{"1234", "%8.5d", "   01234"},
-	{"1234", "%8.6d", "  001234"},
-	{"-1234", "%8.3d", "   -1234"},
-	{"-1234", "%8.4d", "   -1234"},
-	{"-1234", "%8.5d", "  -01234"},
-	{"-1234", "%8.6d", " -001234"},
-
-	{"1234", "%+8.3d", "   +1234"},
-	{"1234", "%+8.4d", "   +1234"},
-	{"1234", "%+8.5d", "  +01234"},
-	{"1234", "%+8.6d", " +001234"},
-	{"-1234", "%+8.3d", "   -1234"},
-	{"-1234", "%+8.4d", "   -1234"},
-	{"-1234", "%+8.5d", "  -01234"},
-	{"-1234", "%+8.6d", " -001234"},
-
-	{"1234", "% 8.3d", "    1234"},
-	{"1234", "% 8.4d", "    1234"},
-	{"1234", "% 8.5d", "   01234"},
-	{"1234", "% 8.6d", "  001234"},
-	{"-1234", "% 8.3d", "   -1234"},
-	{"-1234", "% 8.4d", "   -1234"},
-	{"-1234", "% 8.5d", "  -01234"},
-	{"-1234", "% 8.6d", " -001234"},
-
-	{"1234", "%.3x", "4d2"},
-	{"1234", "%.4x", "04d2"},
-	{"1234", "%.5x", "004d2"},
-	{"1234", "%.6x", "0004d2"},
-	{"-1234", "%.3x", "-4d2"},
-	{"-1234", "%.4x", "-04d2"},
-	{"-1234", "%.5x", "-004d2"},
-	{"-1234", "%.6x", "-0004d2"},
-
-	{"1234", "%8.3x", "     4d2"},
-	{"1234", "%8.4x", "    04d2"},
-	{"1234", "%8.5x", "   004d2"},
-	{"1234", "%8.6x", "  0004d2"},
-	{"-1234", "%8.3x", "    -4d2"},
-	{"-1234", "%8.4x", "   -04d2"},
-	{"-1234", "%8.5x", "  -004d2"},
-	{"-1234", "%8.6x", " -0004d2"},
-
-	{"1234", "%+8.3x", "    +4d2"},
-	{"1234", "%+8.4x", "   +04d2"},
-	{"1234", "%+8.5x", "  +004d2"},
-	{"1234", "%+8.6x", " +0004d2"},
-	{"-1234", "%+8.3x", "    -4d2"},
-	{"-1234", "%+8.4x", "   -04d2"},
-	{"-1234", "%+8.5x", "  -004d2"},
-	{"-1234", "%+8.6x", " -0004d2"},
-
-	{"1234", "% 8.3x", "     4d2"},
-	{"1234", "% 8.4x", "    04d2"},
-	{"1234", "% 8.5x", "   004d2"},
-	{"1234", "% 8.6x", "  0004d2"},
-	{"1234", "% 8.7x", " 00004d2"},
-	{"1234", "% 8.8x", " 000004d2"},
-	{"-1234", "% 8.3x", "    -4d2"},
-	{"-1234", "% 8.4x", "   -04d2"},
-	{"-1234", "% 8.5x", "  -004d2"},
-	{"-1234", "% 8.6x", " -0004d2"},
-	{"-1234", "% 8.7x", "-00004d2"},
-	{"-1234", "% 8.8x", "-000004d2"},
-
-	{"1234", "%-8.3d", "1234    "},
-	{"1234", "%-8.4d", "1234    "},
-	{"1234", "%-8.5d", "01234   "},
-	{"1234", "%-8.6d", "001234  "},
-	{"1234", "%-8.7d", "0001234 "},
-	{"1234", "%-8.8d", "00001234"},
-	{"-1234", "%-8.3d", "-1234   "},
-	{"-1234", "%-8.4d", "-1234   "},
-	{"-1234", "%-8.5d", "-01234  "},
-	{"-1234", "%-8.6d", "-001234 "},
-	{"-1234", "%-8.7d", "-0001234"},
-	{"-1234", "%-8.8d", "-00001234"},
-
-	{"16777215", "%b", "111111111111111111111111"}, // 2**24 - 1
-
-	{"0", "%.d", ""},
-	{"0", "%.0d", ""},
-	{"0", "%3.d", ""},
-}
-
-func TestFormat(t *testing.T) {
-	for i, test := range formatTests {
-		var x *Int
-		if test.input != "<nil>" {
-			var ok bool
-			x, ok = new(Int).SetString(test.input, 0)
-			if !ok {
-				t.Errorf("#%d failed reading input %s", i, test.input)
-			}
-		}
-		output := fmt.Sprintf(test.format, x)
-		if output != test.output {
-			t.Errorf("#%d got %q; want %q, {%q, %q, %q}", i, output, test.output, test.input, test.format, test.output)
-		}
-	}
-}
-
-var scanTests = []struct {
-	input     string
-	format    string
-	output    string
-	remaining int
-}{
-	{"1010", "%b", "10", 0},
-	{"0b1010", "%v", "10", 0},
-	{"12", "%o", "10", 0},
-	{"012", "%v", "10", 0},
-	{"10", "%d", "10", 0},
-	{"10", "%v", "10", 0},
-	{"a", "%x", "10", 0},
-	{"0xa", "%v", "10", 0},
-	{"A", "%X", "10", 0},
-	{"-A", "%X", "-10", 0},
-	{"+0b1011001", "%v", "89", 0},
-	{"0xA", "%v", "10", 0},
-	{"0 ", "%v", "0", 1},
-	{"2+3", "%v", "2", 2},
-	{"0XABC 12", "%v", "2748", 3},
-}
-
-func TestScan(t *testing.T) {
-	var buf bytes.Buffer
-	for i, test := range scanTests {
-		x := new(Int)
-		buf.Reset()
-		buf.WriteString(test.input)
-		if _, err := fmt.Fscanf(&buf, test.format, x); err != nil {
-			t.Errorf("#%d error: %s", i, err)
-		}
-		if x.String() != test.output {
-			t.Errorf("#%d got %s; want %s", i, x.String(), test.output)
-		}
-		if buf.Len() != test.remaining {
-			t.Errorf("#%d got %d bytes remaining; want %d", i, buf.Len(), test.remaining)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/nat.go b/third_party/gofrontend/libgo/go/math/big/nat.go
deleted file mode 100644
index 6545bc1..0000000
--- a/third_party/gofrontend/libgo/go/math/big/nat.go
+++ /dev/null
@@ -1,1274 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package big implements multi-precision arithmetic (big numbers).
-// The following numeric types are supported:
-//
-//   Int    signed integers
-//   Rat    rational numbers
-//   Float  floating-point numbers
-//
-// Methods are typically of the form:
-//
-//   func (z *T) Unary(x *T) *T        // z = op x
-//   func (z *T) Binary(x, y *T) *T    // z = x op y
-//   func (x *T) M() T1                // v = x.M()
-//
-// with T one of Int, Rat, or Float. For unary and binary operations, the
-// result is the receiver (usually named z in that case); if it is one of
-// the operands x or y it may be overwritten (and its memory reused).
-// To enable chaining of operations, the result is also returned. Methods
-// returning a result other than *Int, *Rat, or *Float take an operand as
-// the receiver (usually named x in that case).
-//
-package big
-
-// This file contains operations on unsigned multi-precision integers.
-// These are the building blocks for the operations on signed integers
-// and rationals.
-
-import "math/rand"
-
-// An unsigned integer x of the form
-//
-//   x = x[n-1]*_B^(n-1) + x[n-2]*_B^(n-2) + ... + x[1]*_B + x[0]
-//
-// with 0 <= x[i] < _B and 0 <= i < n is stored in a slice of length n,
-// with the digits x[i] as the slice elements.
-//
-// A number is normalized if the slice contains no leading 0 digits.
-// During arithmetic operations, denormalized values may occur but are
-// always normalized before returning the final result. The normalized
-// representation of 0 is the empty or nil slice (length = 0).
-//
-type nat []Word
-
-var (
-	natOne = nat{1}
-	natTwo = nat{2}
-	natTen = nat{10}
-)
-
-func (z nat) clear() {
-	for i := range z {
-		z[i] = 0
-	}
-}
-
-func (z nat) norm() nat {
-	i := len(z)
-	for i > 0 && z[i-1] == 0 {
-		i--
-	}
-	return z[0:i]
-}
-
-func (z nat) make(n int) nat {
-	if n <= cap(z) {
-		return z[:n] // reuse z
-	}
-	// Choosing a good value for e has significant performance impact
-	// because it increases the chance that a value can be reused.
-	const e = 4 // extra capacity
-	return make(nat, n, n+e)
-}
-
-func (z nat) setWord(x Word) nat {
-	if x == 0 {
-		return z[:0]
-	}
-	z = z.make(1)
-	z[0] = x
-	return z
-}
-
-func (z nat) setUint64(x uint64) nat {
-	// single-digit values
-	if w := Word(x); uint64(w) == x {
-		return z.setWord(w)
-	}
-
-	// compute number of words n required to represent x
-	n := 0
-	for t := x; t > 0; t >>= _W {
-		n++
-	}
-
-	// split x into n words
-	z = z.make(n)
-	for i := range z {
-		z[i] = Word(x & _M)
-		x >>= _W
-	}
-
-	return z
-}
-
-func (z nat) set(x nat) nat {
-	z = z.make(len(x))
-	copy(z, x)
-	return z
-}
-
-func (z nat) add(x, y nat) nat {
-	m := len(x)
-	n := len(y)
-
-	switch {
-	case m < n:
-		return z.add(y, x)
-	case m == 0:
-		// n == 0 because m >= n; result is 0
-		return z[:0]
-	case n == 0:
-		// result is x
-		return z.set(x)
-	}
-	// m > 0
-
-	z = z.make(m + 1)
-	c := addVV(z[0:n], x, y)
-	if m > n {
-		c = addVW(z[n:m], x[n:], c)
-	}
-	z[m] = c
-
-	return z.norm()
-}
-
-func (z nat) sub(x, y nat) nat {
-	m := len(x)
-	n := len(y)
-
-	switch {
-	case m < n:
-		panic("underflow")
-	case m == 0:
-		// n == 0 because m >= n; result is 0
-		return z[:0]
-	case n == 0:
-		// result is x
-		return z.set(x)
-	}
-	// m > 0
-
-	z = z.make(m)
-	c := subVV(z[0:n], x, y)
-	if m > n {
-		c = subVW(z[n:], x[n:], c)
-	}
-	if c != 0 {
-		panic("underflow")
-	}
-
-	return z.norm()
-}
-
-func (x nat) cmp(y nat) (r int) {
-	m := len(x)
-	n := len(y)
-	if m != n || m == 0 {
-		switch {
-		case m < n:
-			r = -1
-		case m > n:
-			r = 1
-		}
-		return
-	}
-
-	i := m - 1
-	for i > 0 && x[i] == y[i] {
-		i--
-	}
-
-	switch {
-	case x[i] < y[i]:
-		r = -1
-	case x[i] > y[i]:
-		r = 1
-	}
-	return
-}
-
-func (z nat) mulAddWW(x nat, y, r Word) nat {
-	m := len(x)
-	if m == 0 || y == 0 {
-		return z.setWord(r) // result is r
-	}
-	// m > 0
-
-	z = z.make(m + 1)
-	z[m] = mulAddVWW(z[0:m], x, y, r)
-
-	return z.norm()
-}
-
-// basicMul multiplies x and y and leaves the result in z.
-// The (non-normalized) result is placed in z[0 : len(x) + len(y)].
-func basicMul(z, x, y nat) {
-	z[0 : len(x)+len(y)].clear() // initialize z
-	for i, d := range y {
-		if d != 0 {
-			z[len(x)+i] = addMulVVW(z[i:i+len(x)], x, d)
-		}
-	}
-}
-
-// montgomery computes x*y*2^(-n*_W) mod m,
-// assuming k = -1/m mod 2^_W.
-// z is used for storing the result which is returned;
-// z must not alias x, y or m.
-func (z nat) montgomery(x, y, m nat, k Word, n int) nat {
-	var c1, c2 Word
-	z = z.make(n)
-	z.clear()
-	for i := 0; i < n; i++ {
-		d := y[i]
-		c1 += addMulVVW(z, x, d)
-		t := z[0] * k
-		c2 = addMulVVW(z, m, t)
-
-		copy(z, z[1:])
-		z[n-1] = c1 + c2
-		if z[n-1] < c1 {
-			c1 = 1
-		} else {
-			c1 = 0
-		}
-	}
-	if c1 != 0 {
-		subVV(z, z, m)
-	}
-	return z
-}
-
-// Fast version of z[0:n+n>>1].add(z[0:n+n>>1], x[0:n]) w/o bounds checks.
-// Factored out for readability - do not use outside karatsuba.
-func karatsubaAdd(z, x nat, n int) {
-	if c := addVV(z[0:n], z, x); c != 0 {
-		addVW(z[n:n+n>>1], z[n:], c)
-	}
-}
-
-// Like karatsubaAdd, but does subtract.
-func karatsubaSub(z, x nat, n int) {
-	if c := subVV(z[0:n], z, x); c != 0 {
-		subVW(z[n:n+n>>1], z[n:], c)
-	}
-}
-
-// Operands that are shorter than karatsubaThreshold are multiplied using
-// "grade school" multiplication; for longer operands the Karatsuba algorithm
-// is used.
-var karatsubaThreshold int = 40 // computed by calibrate.go
-
-// karatsuba multiplies x and y and leaves the result in z.
-// Both x and y must have the same length n and n must be a
-// power of 2. The result vector z must have len(z) >= 6*n.
-// The (non-normalized) result is placed in z[0 : 2*n].
-func karatsuba(z, x, y nat) {
-	n := len(y)
-
-	// Switch to basic multiplication if numbers are odd or small.
-	// (n is always even if karatsubaThreshold is even, but be
-	// conservative)
-	if n&1 != 0 || n < karatsubaThreshold || n < 2 {
-		basicMul(z, x, y)
-		return
-	}
-	// n&1 == 0 && n >= karatsubaThreshold && n >= 2
-
-	// Karatsuba multiplication is based on the observation that
-	// for two numbers x and y with:
-	//
-	//   x = x1*b + x0
-	//   y = y1*b + y0
-	//
-	// the product x*y can be obtained with 3 products z2, z1, z0
-	// instead of 4:
-	//
-	//   x*y = x1*y1*b*b + (x1*y0 + x0*y1)*b + x0*y0
-	//       =    z2*b*b +              z1*b +    z0
-	//
-	// with:
-	//
-	//   xd = x1 - x0
-	//   yd = y0 - y1
-	//
-	//   z1 =      xd*yd                    + z2 + z0
-	//      = (x1-x0)*(y0 - y1)             + z2 + z0
-	//      = x1*y0 - x1*y1 - x0*y0 + x0*y1 + z2 + z0
-	//      = x1*y0 -    z2 -    z0 + x0*y1 + z2 + z0
-	//      = x1*y0                 + x0*y1
-
-	// split x, y into "digits"
-	n2 := n >> 1              // n2 >= 1
-	x1, x0 := x[n2:], x[0:n2] // x = x1*b + y0
-	y1, y0 := y[n2:], y[0:n2] // y = y1*b + y0
-
-	// z is used for the result and temporary storage:
-	//
-	//   6*n     5*n     4*n     3*n     2*n     1*n     0*n
-	// z = [z2 copy|z0 copy| xd*yd | yd:xd | x1*y1 | x0*y0 ]
-	//
-	// For each recursive call of karatsuba, an unused slice of
-	// z is passed in that has (at least) half the length of the
-	// caller's z.
-
-	// compute z0 and z2 with the result "in place" in z
-	karatsuba(z, x0, y0)     // z0 = x0*y0
-	karatsuba(z[n:], x1, y1) // z2 = x1*y1
-
-	// compute xd (or the negative value if underflow occurs)
-	s := 1 // sign of product xd*yd
-	xd := z[2*n : 2*n+n2]
-	if subVV(xd, x1, x0) != 0 { // x1-x0
-		s = -s
-		subVV(xd, x0, x1) // x0-x1
-	}
-
-	// compute yd (or the negative value if underflow occurs)
-	yd := z[2*n+n2 : 3*n]
-	if subVV(yd, y0, y1) != 0 { // y0-y1
-		s = -s
-		subVV(yd, y1, y0) // y1-y0
-	}
-
-	// p = (x1-x0)*(y0-y1) == x1*y0 - x1*y1 - x0*y0 + x0*y1 for s > 0
-	// p = (x0-x1)*(y0-y1) == x0*y0 - x0*y1 - x1*y0 + x1*y1 for s < 0
-	p := z[n*3:]
-	karatsuba(p, xd, yd)
-
-	// save original z2:z0
-	// (ok to use upper half of z since we're done recursing)
-	r := z[n*4:]
-	copy(r, z[:n*2])
-
-	// add up all partial products
-	//
-	//   2*n     n     0
-	// z = [ z2  | z0  ]
-	//   +    [ z0  ]
-	//   +    [ z2  ]
-	//   +    [  p  ]
-	//
-	karatsubaAdd(z[n2:], r, n)
-	karatsubaAdd(z[n2:], r[n:], n)
-	if s > 0 {
-		karatsubaAdd(z[n2:], p, n)
-	} else {
-		karatsubaSub(z[n2:], p, n)
-	}
-}
-
-// alias reports whether x and y share the same base array.
-func alias(x, y nat) bool {
-	return cap(x) > 0 && cap(y) > 0 && &x[0:cap(x)][cap(x)-1] == &y[0:cap(y)][cap(y)-1]
-}
-
-// addAt implements z += x<<(_W*i); z must be long enough.
-// (we don't use nat.add because we need z to stay the same
-// slice, and we don't need to normalize z after each addition)
-func addAt(z, x nat, i int) {
-	if n := len(x); n > 0 {
-		if c := addVV(z[i:i+n], z[i:], x); c != 0 {
-			j := i + n
-			if j < len(z) {
-				addVW(z[j:], z[j:], c)
-			}
-		}
-	}
-}
-
-func max(x, y int) int {
-	if x > y {
-		return x
-	}
-	return y
-}
-
-// karatsubaLen computes an approximation to the maximum k <= n such that
-// k = p<<i for a number p <= karatsubaThreshold and an i >= 0. Thus, the
-// result is the largest number that can be divided repeatedly by 2 before
-// becoming about the value of karatsubaThreshold.
-func karatsubaLen(n int) int {
-	i := uint(0)
-	for n > karatsubaThreshold {
-		n >>= 1
-		i++
-	}
-	return n << i
-}
-
-func (z nat) mul(x, y nat) nat {
-	m := len(x)
-	n := len(y)
-
-	switch {
-	case m < n:
-		return z.mul(y, x)
-	case m == 0 || n == 0:
-		return z[:0]
-	case n == 1:
-		return z.mulAddWW(x, y[0], 0)
-	}
-	// m >= n > 1
-
-	// determine if z can be reused
-	if alias(z, x) || alias(z, y) {
-		z = nil // z is an alias for x or y - cannot reuse
-	}
-
-	// use basic multiplication if the numbers are small
-	if n < karatsubaThreshold {
-		z = z.make(m + n)
-		basicMul(z, x, y)
-		return z.norm()
-	}
-	// m >= n && n >= karatsubaThreshold && n >= 2
-
-	// determine Karatsuba length k such that
-	//
-	//   x = xh*b + x0  (0 <= x0 < b)
-	//   y = yh*b + y0  (0 <= y0 < b)
-	//   b = 1<<(_W*k)  ("base" of digits xi, yi)
-	//
-	k := karatsubaLen(n)
-	// k <= n
-
-	// multiply x0 and y0 via Karatsuba
-	x0 := x[0:k]              // x0 is not normalized
-	y0 := y[0:k]              // y0 is not normalized
-	z = z.make(max(6*k, m+n)) // enough space for karatsuba of x0*y0 and full result of x*y
-	karatsuba(z, x0, y0)
-	z = z[0 : m+n]  // z has final length but may be incomplete
-	z[2*k:].clear() // upper portion of z is garbage (and 2*k <= m+n since k <= n <= m)
-
-	// If xh != 0 or yh != 0, add the missing terms to z. For
-	//
-	//   xh = xi*b^i + ... + x2*b^2 + x1*b (0 <= xi < b)
-	//   yh =                         y1*b (0 <= y1 < b)
-	//
-	// the missing terms are
-	//
-	//   x0*y1*b and xi*y0*b^i, xi*y1*b^(i+1) for i > 0
-	//
-	// since all the yi for i > 1 are 0 by choice of k: If any of them
-	// were > 0, then yh >= b^2 and thus y >= b^2. Then k' = k*2 would
-	// be a larger valid threshold contradicting the assumption about k.
-	//
-	if k < n || m != n {
-		var t nat
-
-		// add x0*y1*b
-		x0 := x0.norm()
-		y1 := y[k:]       // y1 is normalized because y is
-		t = t.mul(x0, y1) // update t so we don't lose t's underlying array
-		addAt(z, t, k)
-
-		// add xi*y0<<i, xi*y1*b<<(i+k)
-		y0 := y0.norm()
-		for i := k; i < len(x); i += k {
-			xi := x[i:]
-			if len(xi) > k {
-				xi = xi[:k]
-			}
-			xi = xi.norm()
-			t = t.mul(xi, y0)
-			addAt(z, t, i)
-			t = t.mul(xi, y1)
-			addAt(z, t, i+k)
-		}
-	}
-
-	return z.norm()
-}
-
-// mulRange computes the product of all the unsigned integers in the
-// range [a, b] inclusively. If a > b (empty range), the result is 1.
-func (z nat) mulRange(a, b uint64) nat {
-	switch {
-	case a == 0:
-		// cut long ranges short (optimization)
-		return z.setUint64(0)
-	case a > b:
-		return z.setUint64(1)
-	case a == b:
-		return z.setUint64(a)
-	case a+1 == b:
-		return z.mul(nat(nil).setUint64(a), nat(nil).setUint64(b))
-	}
-	m := (a + b) / 2
-	return z.mul(nat(nil).mulRange(a, m), nat(nil).mulRange(m+1, b))
-}
-
-// q = (x-r)/y, with 0 <= r < y
-func (z nat) divW(x nat, y Word) (q nat, r Word) {
-	m := len(x)
-	switch {
-	case y == 0:
-		panic("division by zero")
-	case y == 1:
-		q = z.set(x) // result is x
-		return
-	case m == 0:
-		q = z[:0] // result is 0
-		return
-	}
-	// m > 0
-	z = z.make(m)
-	r = divWVW(z, 0, x, y)
-	q = z.norm()
-	return
-}
-
-func (z nat) div(z2, u, v nat) (q, r nat) {
-	if len(v) == 0 {
-		panic("division by zero")
-	}
-
-	if u.cmp(v) < 0 {
-		q = z[:0]
-		r = z2.set(u)
-		return
-	}
-
-	if len(v) == 1 {
-		var r2 Word
-		q, r2 = z.divW(u, v[0])
-		r = z2.setWord(r2)
-		return
-	}
-
-	q, r = z.divLarge(z2, u, v)
-	return
-}
-
-// q = (uIn-r)/v, with 0 <= r < y
-// Uses z as storage for q, and u as storage for r if possible.
-// See Knuth, Volume 2, section 4.3.1, Algorithm D.
-// Preconditions:
-//    len(v) >= 2
-//    len(uIn) >= len(v)
-func (z nat) divLarge(u, uIn, v nat) (q, r nat) {
-	n := len(v)
-	m := len(uIn) - n
-
-	// determine if z can be reused
-	// TODO(gri) should find a better solution - this if statement
-	//           is very costly (see e.g. time pidigits -s -n 10000)
-	if alias(z, uIn) || alias(z, v) {
-		z = nil // z is an alias for uIn or v - cannot reuse
-	}
-	q = z.make(m + 1)
-
-	qhatv := make(nat, n+1)
-	if alias(u, uIn) || alias(u, v) {
-		u = nil // u is an alias for uIn or v - cannot reuse
-	}
-	u = u.make(len(uIn) + 1)
-	u.clear() // TODO(gri) no need to clear if we allocated a new u
-
-	// D1.
-	shift := nlz(v[n-1])
-	if shift > 0 {
-		// do not modify v, it may be used by another goroutine simultaneously
-		v1 := make(nat, n)
-		shlVU(v1, v, shift)
-		v = v1
-	}
-	u[len(uIn)] = shlVU(u[0:len(uIn)], uIn, shift)
-
-	// D2.
-	for j := m; j >= 0; j-- {
-		// D3.
-		qhat := Word(_M)
-		if u[j+n] != v[n-1] {
-			var rhat Word
-			qhat, rhat = divWW(u[j+n], u[j+n-1], v[n-1])
-
-			// x1 | x2 = q̂v_{n-2}
-			x1, x2 := mulWW(qhat, v[n-2])
-			// test if q̂v_{n-2} > br̂ + u_{j+n-2}
-			for greaterThan(x1, x2, rhat, u[j+n-2]) {
-				qhat--
-				prevRhat := rhat
-				rhat += v[n-1]
-				// v[n-1] >= 0, so this tests for overflow.
-				if rhat < prevRhat {
-					break
-				}
-				x1, x2 = mulWW(qhat, v[n-2])
-			}
-		}
-
-		// D4.
-		qhatv[n] = mulAddVWW(qhatv[0:n], v, qhat, 0)
-
-		c := subVV(u[j:j+len(qhatv)], u[j:], qhatv)
-		if c != 0 {
-			c := addVV(u[j:j+n], u[j:], v)
-			u[j+n] += c
-			qhat--
-		}
-
-		q[j] = qhat
-	}
-
-	q = q.norm()
-	shrVU(u, u, shift)
-	r = u.norm()
-
-	return q, r
-}
-
-// Length of x in bits. x must be normalized.
-func (x nat) bitLen() int {
-	if i := len(x) - 1; i >= 0 {
-		return i*_W + bitLen(x[i])
-	}
-	return 0
-}
-
-const deBruijn32 = 0x077CB531
-
-var deBruijn32Lookup = []byte{
-	0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
-	31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9,
-}
-
-const deBruijn64 = 0x03f79d71b4ca8b09
-
-var deBruijn64Lookup = []byte{
-	0, 1, 56, 2, 57, 49, 28, 3, 61, 58, 42, 50, 38, 29, 17, 4,
-	62, 47, 59, 36, 45, 43, 51, 22, 53, 39, 33, 30, 24, 18, 12, 5,
-	63, 55, 48, 27, 60, 41, 37, 16, 46, 35, 44, 21, 52, 32, 23, 11,
-	54, 26, 40, 15, 34, 20, 31, 10, 25, 14, 19, 9, 13, 8, 7, 6,
-}
-
-// trailingZeroBits returns the number of consecutive least significant zero
-// bits of x.
-func trailingZeroBits(x Word) uint {
-	// x & -x leaves only the right-most bit set in the word. Let k be the
-	// index of that bit. Since only a single bit is set, the value is two
-	// to the power of k. Multiplying by a power of two is equivalent to
-	// left shifting, in this case by k bits.  The de Bruijn constant is
-	// such that all six bit, consecutive substrings are distinct.
-	// Therefore, if we have a left shifted version of this constant we can
-	// find by how many bits it was shifted by looking at which six bit
-	// substring ended up at the top of the word.
-	// (Knuth, volume 4, section 7.3.1)
-	switch _W {
-	case 32:
-		return uint(deBruijn32Lookup[((x&-x)*deBruijn32)>>27])
-	case 64:
-		return uint(deBruijn64Lookup[((x&-x)*(deBruijn64&_M))>>58])
-	default:
-		panic("unknown word size")
-	}
-}
-
-// trailingZeroBits returns the number of consecutive least significant zero
-// bits of x.
-func (x nat) trailingZeroBits() uint {
-	if len(x) == 0 {
-		return 0
-	}
-	var i uint
-	for x[i] == 0 {
-		i++
-	}
-	// x[i] != 0
-	return i*_W + trailingZeroBits(x[i])
-}
-
-// z = x << s
-func (z nat) shl(x nat, s uint) nat {
-	m := len(x)
-	if m == 0 {
-		return z[:0]
-	}
-	// m > 0
-
-	n := m + int(s/_W)
-	z = z.make(n + 1)
-	z[n] = shlVU(z[n-m:n], x, s%_W)
-	z[0 : n-m].clear()
-
-	return z.norm()
-}
-
-// z = x >> s
-func (z nat) shr(x nat, s uint) nat {
-	m := len(x)
-	n := m - int(s/_W)
-	if n <= 0 {
-		return z[:0]
-	}
-	// n > 0
-
-	z = z.make(n)
-	shrVU(z, x[m-n:], s%_W)
-
-	return z.norm()
-}
-
-func (z nat) setBit(x nat, i uint, b uint) nat {
-	j := int(i / _W)
-	m := Word(1) << (i % _W)
-	n := len(x)
-	switch b {
-	case 0:
-		z = z.make(n)
-		copy(z, x)
-		if j >= n {
-			// no need to grow
-			return z
-		}
-		z[j] &^= m
-		return z.norm()
-	case 1:
-		if j >= n {
-			z = z.make(j + 1)
-			z[n:].clear()
-		} else {
-			z = z.make(n)
-		}
-		copy(z, x)
-		z[j] |= m
-		// no need to normalize
-		return z
-	}
-	panic("set bit is not 0 or 1")
-}
-
-// bit returns the value of the i'th bit, with lsb == bit 0.
-func (x nat) bit(i uint) uint {
-	j := i / _W
-	if j >= uint(len(x)) {
-		return 0
-	}
-	// 0 <= j < len(x)
-	return uint(x[j] >> (i % _W) & 1)
-}
-
-// sticky returns 1 if there's a 1 bit within the
-// i least significant bits, otherwise it returns 0.
-func (x nat) sticky(i uint) uint {
-	j := i / _W
-	if j >= uint(len(x)) {
-		if len(x) == 0 {
-			return 0
-		}
-		return 1
-	}
-	// 0 <= j < len(x)
-	for _, x := range x[:j] {
-		if x != 0 {
-			return 1
-		}
-	}
-	if x[j]<<(_W-i%_W) != 0 {
-		return 1
-	}
-	return 0
-}
-
-func (z nat) and(x, y nat) nat {
-	m := len(x)
-	n := len(y)
-	if m > n {
-		m = n
-	}
-	// m <= n
-
-	z = z.make(m)
-	for i := 0; i < m; i++ {
-		z[i] = x[i] & y[i]
-	}
-
-	return z.norm()
-}
-
-func (z nat) andNot(x, y nat) nat {
-	m := len(x)
-	n := len(y)
-	if n > m {
-		n = m
-	}
-	// m >= n
-
-	z = z.make(m)
-	for i := 0; i < n; i++ {
-		z[i] = x[i] &^ y[i]
-	}
-	copy(z[n:m], x[n:m])
-
-	return z.norm()
-}
-
-func (z nat) or(x, y nat) nat {
-	m := len(x)
-	n := len(y)
-	s := x
-	if m < n {
-		n, m = m, n
-		s = y
-	}
-	// m >= n
-
-	z = z.make(m)
-	for i := 0; i < n; i++ {
-		z[i] = x[i] | y[i]
-	}
-	copy(z[n:m], s[n:m])
-
-	return z.norm()
-}
-
-func (z nat) xor(x, y nat) nat {
-	m := len(x)
-	n := len(y)
-	s := x
-	if m < n {
-		n, m = m, n
-		s = y
-	}
-	// m >= n
-
-	z = z.make(m)
-	for i := 0; i < n; i++ {
-		z[i] = x[i] ^ y[i]
-	}
-	copy(z[n:m], s[n:m])
-
-	return z.norm()
-}
-
-// greaterThan reports whether (x1<<_W + x2) > (y1<<_W + y2)
-func greaterThan(x1, x2, y1, y2 Word) bool {
-	return x1 > y1 || x1 == y1 && x2 > y2
-}
-
-// modW returns x % d.
-func (x nat) modW(d Word) (r Word) {
-	// TODO(agl): we don't actually need to store the q value.
-	var q nat
-	q = q.make(len(x))
-	return divWVW(q, 0, x, d)
-}
-
-// random creates a random integer in [0..limit), using the space in z if
-// possible. n is the bit length of limit.
-func (z nat) random(rand *rand.Rand, limit nat, n int) nat {
-	if alias(z, limit) {
-		z = nil // z is an alias for limit - cannot reuse
-	}
-	z = z.make(len(limit))
-
-	bitLengthOfMSW := uint(n % _W)
-	if bitLengthOfMSW == 0 {
-		bitLengthOfMSW = _W
-	}
-	mask := Word((1 << bitLengthOfMSW) - 1)
-
-	for {
-		switch _W {
-		case 32:
-			for i := range z {
-				z[i] = Word(rand.Uint32())
-			}
-		case 64:
-			for i := range z {
-				z[i] = Word(rand.Uint32()) | Word(rand.Uint32())<<32
-			}
-		default:
-			panic("unknown word size")
-		}
-		z[len(limit)-1] &= mask
-		if z.cmp(limit) < 0 {
-			break
-		}
-	}
-
-	return z.norm()
-}
-
-// If m != 0 (i.e., len(m) != 0), expNN sets z to x**y mod m;
-// otherwise it sets z to x**y. The result is the value of z.
-func (z nat) expNN(x, y, m nat) nat {
-	if alias(z, x) || alias(z, y) {
-		// We cannot allow in-place modification of x or y.
-		z = nil
-	}
-
-	// x**y mod 1 == 0
-	if len(m) == 1 && m[0] == 1 {
-		return z.setWord(0)
-	}
-	// m == 0 || m > 1
-
-	// x**0 == 1
-	if len(y) == 0 {
-		return z.setWord(1)
-	}
-	// y > 0
-
-	// x**1 mod m == x mod m
-	if len(y) == 1 && y[0] == 1 && len(m) != 0 {
-		_, z = z.div(z, x, m)
-		return z
-	}
-	// y > 1
-
-	if len(m) != 0 {
-		// We likely end up being as long as the modulus.
-		z = z.make(len(m))
-	}
-	z = z.set(x)
-
-	// If the base is non-trivial and the exponent is large, we use
-	// 4-bit, windowed exponentiation. This involves precomputing 14 values
-	// (x^2...x^15) but then reduces the number of multiply-reduces by a
-	// third. Even for a 32-bit exponent, this reduces the number of
-	// operations. Uses Montgomery method for odd moduli.
-	if len(x) > 1 && len(y) > 1 && len(m) > 0 {
-		if m[0]&1 == 1 {
-			return z.expNNMontgomery(x, y, m)
-		}
-		return z.expNNWindowed(x, y, m)
-	}
-
-	v := y[len(y)-1] // v > 0 because y is normalized and y > 0
-	shift := nlz(v) + 1
-	v <<= shift
-	var q nat
-
-	const mask = 1 << (_W - 1)
-
-	// We walk through the bits of the exponent one by one. Each time we
-	// see a bit, we square, thus doubling the power. If the bit is a one,
-	// we also multiply by x, thus adding one to the power.
-
-	w := _W - int(shift)
-	// zz and r are used to avoid allocating in mul and div as
-	// otherwise the arguments would alias.
-	var zz, r nat
-	for j := 0; j < w; j++ {
-		zz = zz.mul(z, z)
-		zz, z = z, zz
-
-		if v&mask != 0 {
-			zz = zz.mul(z, x)
-			zz, z = z, zz
-		}
-
-		if len(m) != 0 {
-			zz, r = zz.div(r, z, m)
-			zz, r, q, z = q, z, zz, r
-		}
-
-		v <<= 1
-	}
-
-	for i := len(y) - 2; i >= 0; i-- {
-		v = y[i]
-
-		for j := 0; j < _W; j++ {
-			zz = zz.mul(z, z)
-			zz, z = z, zz
-
-			if v&mask != 0 {
-				zz = zz.mul(z, x)
-				zz, z = z, zz
-			}
-
-			if len(m) != 0 {
-				zz, r = zz.div(r, z, m)
-				zz, r, q, z = q, z, zz, r
-			}
-
-			v <<= 1
-		}
-	}
-
-	return z.norm()
-}
-
-// expNNWindowed calculates x**y mod m using a fixed, 4-bit window.
-func (z nat) expNNWindowed(x, y, m nat) nat {
-	// zz and r are used to avoid allocating in mul and div as otherwise
-	// the arguments would alias.
-	var zz, r nat
-
-	const n = 4
-	// powers[i] contains x^i.
-	var powers [1 << n]nat
-	powers[0] = natOne
-	powers[1] = x
-	for i := 2; i < 1<<n; i += 2 {
-		p2, p, p1 := &powers[i/2], &powers[i], &powers[i+1]
-		*p = p.mul(*p2, *p2)
-		zz, r = zz.div(r, *p, m)
-		*p, r = r, *p
-		*p1 = p1.mul(*p, x)
-		zz, r = zz.div(r, *p1, m)
-		*p1, r = r, *p1
-	}
-
-	z = z.setWord(1)
-
-	for i := len(y) - 1; i >= 0; i-- {
-		yi := y[i]
-		for j := 0; j < _W; j += n {
-			if i != len(y)-1 || j != 0 {
-				// Unrolled loop for significant performance
-				// gain.  Use go test -bench=".*" in crypto/rsa
-				// to check performance before making changes.
-				zz = zz.mul(z, z)
-				zz, z = z, zz
-				zz, r = zz.div(r, z, m)
-				z, r = r, z
-
-				zz = zz.mul(z, z)
-				zz, z = z, zz
-				zz, r = zz.div(r, z, m)
-				z, r = r, z
-
-				zz = zz.mul(z, z)
-				zz, z = z, zz
-				zz, r = zz.div(r, z, m)
-				z, r = r, z
-
-				zz = zz.mul(z, z)
-				zz, z = z, zz
-				zz, r = zz.div(r, z, m)
-				z, r = r, z
-			}
-
-			zz = zz.mul(z, powers[yi>>(_W-n)])
-			zz, z = z, zz
-			zz, r = zz.div(r, z, m)
-			z, r = r, z
-
-			yi <<= n
-		}
-	}
-
-	return z.norm()
-}
-
-// expNNMontgomery calculates x**y mod m using a fixed, 4-bit window.
-// Uses Montgomery representation.
-func (z nat) expNNMontgomery(x, y, m nat) nat {
-	var zz, one, rr, RR nat
-
-	numWords := len(m)
-
-	// We want the lengths of x and m to be equal.
-	if len(x) > numWords {
-		_, rr = rr.div(rr, x, m)
-	} else if len(x) < numWords {
-		rr = rr.make(numWords)
-		rr.clear()
-		for i := range x {
-			rr[i] = x[i]
-		}
-	} else {
-		rr = x
-	}
-	x = rr
-
-	// Ideally the precomputations would be performed outside, and reused
-	// k0 = -mˆ-1 mod 2ˆ_W. Algorithm from: Dumas, J.G. "On Newton–Raphson
-	// Iteration for Multiplicative Inverses Modulo Prime Powers".
-	k0 := 2 - m[0]
-	t := m[0] - 1
-	for i := 1; i < _W; i <<= 1 {
-		t *= t
-		k0 *= (t + 1)
-	}
-	k0 = -k0
-
-	// RR = 2ˆ(2*_W*len(m)) mod m
-	RR = RR.setWord(1)
-	zz = zz.shl(RR, uint(2*numWords*_W))
-	_, RR = RR.div(RR, zz, m)
-	if len(RR) < numWords {
-		zz = zz.make(numWords)
-		copy(zz, RR)
-		RR = zz
-	}
-	// one = 1, with equal length to that of m
-	one = one.make(numWords)
-	one.clear()
-	one[0] = 1
-
-	const n = 4
-	// powers[i] contains x^i
-	var powers [1 << n]nat
-	powers[0] = powers[0].montgomery(one, RR, m, k0, numWords)
-	powers[1] = powers[1].montgomery(x, RR, m, k0, numWords)
-	for i := 2; i < 1<<n; i++ {
-		powers[i] = powers[i].montgomery(powers[i-1], powers[1], m, k0, numWords)
-	}
-
-	// initialize z = 1 (Montgomery 1)
-	z = z.make(numWords)
-	copy(z, powers[0])
-
-	zz = zz.make(numWords)
-
-	// same windowed exponent, but with Montgomery multiplications
-	for i := len(y) - 1; i >= 0; i-- {
-		yi := y[i]
-		for j := 0; j < _W; j += n {
-			if i != len(y)-1 || j != 0 {
-				zz = zz.montgomery(z, z, m, k0, numWords)
-				z = z.montgomery(zz, zz, m, k0, numWords)
-				zz = zz.montgomery(z, z, m, k0, numWords)
-				z = z.montgomery(zz, zz, m, k0, numWords)
-			}
-			zz = zz.montgomery(z, powers[yi>>(_W-n)], m, k0, numWords)
-			z, zz = zz, z
-			yi <<= n
-		}
-	}
-	// convert to regular number
-	zz = zz.montgomery(z, one, m, k0, numWords)
-	return zz.norm()
-}
-
-// probablyPrime performs reps Miller-Rabin tests to check whether n is prime.
-// If it returns true, n is prime with probability 1 - 1/4^reps.
-// If it returns false, n is not prime.
-func (n nat) probablyPrime(reps int) bool {
-	if len(n) == 0 {
-		return false
-	}
-
-	if len(n) == 1 {
-		if n[0] < 2 {
-			return false
-		}
-
-		if n[0]%2 == 0 {
-			return n[0] == 2
-		}
-
-		// We have to exclude these cases because we reject all
-		// multiples of these numbers below.
-		switch n[0] {
-		case 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53:
-			return true
-		}
-	}
-
-	if n[0]&1 == 0 {
-		return false // n is even
-	}
-
-	const primesProduct32 = 0xC0CFD797         // Π {p ∈ primes, 2 < p <= 29}
-	const primesProduct64 = 0xE221F97C30E94E1D // Π {p ∈ primes, 2 < p <= 53}
-
-	var r Word
-	switch _W {
-	case 32:
-		r = n.modW(primesProduct32)
-	case 64:
-		r = n.modW(primesProduct64 & _M)
-	default:
-		panic("Unknown word size")
-	}
-
-	if r%3 == 0 || r%5 == 0 || r%7 == 0 || r%11 == 0 ||
-		r%13 == 0 || r%17 == 0 || r%19 == 0 || r%23 == 0 || r%29 == 0 {
-		return false
-	}
-
-	if _W == 64 && (r%31 == 0 || r%37 == 0 || r%41 == 0 ||
-		r%43 == 0 || r%47 == 0 || r%53 == 0) {
-		return false
-	}
-
-	nm1 := nat(nil).sub(n, natOne)
-	// determine q, k such that nm1 = q << k
-	k := nm1.trailingZeroBits()
-	q := nat(nil).shr(nm1, k)
-
-	nm3 := nat(nil).sub(nm1, natTwo)
-	rand := rand.New(rand.NewSource(int64(n[0])))
-
-	var x, y, quotient nat
-	nm3Len := nm3.bitLen()
-
-NextRandom:
-	for i := 0; i < reps; i++ {
-		x = x.random(rand, nm3, nm3Len)
-		x = x.add(x, natTwo)
-		y = y.expNN(x, q, n)
-		if y.cmp(natOne) == 0 || y.cmp(nm1) == 0 {
-			continue
-		}
-		for j := uint(1); j < k; j++ {
-			y = y.mul(y, y)
-			quotient, y = quotient.div(y, y, n)
-			if y.cmp(nm1) == 0 {
-				continue NextRandom
-			}
-			if y.cmp(natOne) == 0 {
-				return false
-			}
-		}
-		return false
-	}
-
-	return true
-}
-
-// bytes writes the value of z into buf using big-endian encoding.
-// len(buf) must be >= len(z)*_S. The value of z is encoded in the
-// slice buf[i:]. The number i of unused bytes at the beginning of
-// buf is returned as result.
-func (z nat) bytes(buf []byte) (i int) {
-	i = len(buf)
-	for _, d := range z {
-		for j := 0; j < _S; j++ {
-			i--
-			buf[i] = byte(d)
-			d >>= 8
-		}
-	}
-
-	for i < len(buf) && buf[i] == 0 {
-		i++
-	}
-
-	return
-}
-
-// setBytes interprets buf as the bytes of a big-endian unsigned
-// integer, sets z to that value, and returns z.
-func (z nat) setBytes(buf []byte) nat {
-	z = z.make((len(buf) + _S - 1) / _S)
-
-	k := 0
-	s := uint(0)
-	var d Word
-	for i := len(buf); i > 0; i-- {
-		d |= Word(buf[i-1]) << s
-		if s += 8; s == _S*8 {
-			z[k] = d
-			k++
-			s = 0
-			d = 0
-		}
-	}
-	if k < len(z) {
-		z[k] = d
-	}
-
-	return z.norm()
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/nat_test.go b/third_party/gofrontend/libgo/go/math/big/nat_test.go
deleted file mode 100644
index 7ac3cb8..0000000
--- a/third_party/gofrontend/libgo/go/math/big/nat_test.go
+++ /dev/null
@@ -1,579 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package big
-
-import (
-	"runtime"
-	"strings"
-	"testing"
-)
-
-var cmpTests = []struct {
-	x, y nat
-	r    int
-}{
-	{nil, nil, 0},
-	{nil, nat(nil), 0},
-	{nat(nil), nil, 0},
-	{nat(nil), nat(nil), 0},
-	{nat{0}, nat{0}, 0},
-	{nat{0}, nat{1}, -1},
-	{nat{1}, nat{0}, 1},
-	{nat{1}, nat{1}, 0},
-	{nat{0, _M}, nat{1}, 1},
-	{nat{1}, nat{0, _M}, -1},
-	{nat{1, _M}, nat{0, _M}, 1},
-	{nat{0, _M}, nat{1, _M}, -1},
-	{nat{16, 571956, 8794, 68}, nat{837, 9146, 1, 754489}, -1},
-	{nat{34986, 41, 105, 1957}, nat{56, 7458, 104, 1957}, 1},
-}
-
-func TestCmp(t *testing.T) {
-	for i, a := range cmpTests {
-		r := a.x.cmp(a.y)
-		if r != a.r {
-			t.Errorf("#%d got r = %v; want %v", i, r, a.r)
-		}
-	}
-}
-
-type funNN func(z, x, y nat) nat
-type argNN struct {
-	z, x, y nat
-}
-
-var sumNN = []argNN{
-	{},
-	{nat{1}, nil, nat{1}},
-	{nat{1111111110}, nat{123456789}, nat{987654321}},
-	{nat{0, 0, 0, 1}, nil, nat{0, 0, 0, 1}},
-	{nat{0, 0, 0, 1111111110}, nat{0, 0, 0, 123456789}, nat{0, 0, 0, 987654321}},
-	{nat{0, 0, 0, 1}, nat{0, 0, _M}, nat{0, 0, 1}},
-}
-
-var prodNN = []argNN{
-	{},
-	{nil, nil, nil},
-	{nil, nat{991}, nil},
-	{nat{991}, nat{991}, nat{1}},
-	{nat{991 * 991}, nat{991}, nat{991}},
-	{nat{0, 0, 991 * 991}, nat{0, 991}, nat{0, 991}},
-	{nat{1 * 991, 2 * 991, 3 * 991, 4 * 991}, nat{1, 2, 3, 4}, nat{991}},
-	{nat{4, 11, 20, 30, 20, 11, 4}, nat{1, 2, 3, 4}, nat{4, 3, 2, 1}},
-	// 3^100 * 3^28 = 3^128
-	{
-		natFromString("11790184577738583171520872861412518665678211592275841109096961"),
-		natFromString("515377520732011331036461129765621272702107522001"),
-		natFromString("22876792454961"),
-	},
-	// z = 111....1 (70000 digits)
-	// x = 10^(99*700) + ... + 10^1400 + 10^700 + 1
-	// y = 111....1 (700 digits, larger than Karatsuba threshold on 32-bit and 64-bit)
-	{
-		natFromString(strings.Repeat("1", 70000)),
-		natFromString("1" + strings.Repeat(strings.Repeat("0", 699)+"1", 99)),
-		natFromString(strings.Repeat("1", 700)),
-	},
-	// z = 111....1 (20000 digits)
-	// x = 10^10000 + 1
-	// y = 111....1 (10000 digits)
-	{
-		natFromString(strings.Repeat("1", 20000)),
-		natFromString("1" + strings.Repeat("0", 9999) + "1"),
-		natFromString(strings.Repeat("1", 10000)),
-	},
-}
-
-func natFromString(s string) nat {
-	x, _, _, err := nat(nil).scan(strings.NewReader(s), 0, false)
-	if err != nil {
-		panic(err)
-	}
-	return x
-}
-
-func TestSet(t *testing.T) {
-	for _, a := range sumNN {
-		z := nat(nil).set(a.z)
-		if z.cmp(a.z) != 0 {
-			t.Errorf("got z = %v; want %v", z, a.z)
-		}
-	}
-}
-
-func testFunNN(t *testing.T, msg string, f funNN, a argNN) {
-	z := f(nil, a.x, a.y)
-	if z.cmp(a.z) != 0 {
-		t.Errorf("%s%+v\n\tgot z = %v; want %v", msg, a, z, a.z)
-	}
-}
-
-func TestFunNN(t *testing.T) {
-	for _, a := range sumNN {
-		arg := a
-		testFunNN(t, "add", nat.add, arg)
-
-		arg = argNN{a.z, a.y, a.x}
-		testFunNN(t, "add symmetric", nat.add, arg)
-
-		arg = argNN{a.x, a.z, a.y}
-		testFunNN(t, "sub", nat.sub, arg)
-
-		arg = argNN{a.y, a.z, a.x}
-		testFunNN(t, "sub symmetric", nat.sub, arg)
-	}
-
-	for _, a := range prodNN {
-		arg := a
-		testFunNN(t, "mul", nat.mul, arg)
-
-		arg = argNN{a.z, a.y, a.x}
-		testFunNN(t, "mul symmetric", nat.mul, arg)
-	}
-}
-
-var mulRangesN = []struct {
-	a, b uint64
-	prod string
-}{
-	{0, 0, "0"},
-	{1, 1, "1"},
-	{1, 2, "2"},
-	{1, 3, "6"},
-	{10, 10, "10"},
-	{0, 100, "0"},
-	{0, 1e9, "0"},
-	{1, 0, "1"},                    // empty range
-	{100, 1, "1"},                  // empty range
-	{1, 10, "3628800"},             // 10!
-	{1, 20, "2432902008176640000"}, // 20!
-	{1, 100,
-		"933262154439441526816992388562667004907159682643816214685929" +
-			"638952175999932299156089414639761565182862536979208272237582" +
-			"51185210916864000000000000000000000000", // 100!
-	},
-}
-
-func TestMulRangeN(t *testing.T) {
-	for i, r := range mulRangesN {
-		prod := nat(nil).mulRange(r.a, r.b).decimalString()
-		if prod != r.prod {
-			t.Errorf("#%d: got %s; want %s", i, prod, r.prod)
-		}
-	}
-}
-
-// allocBytes returns the number of bytes allocated by invoking f.
-func allocBytes(f func()) uint64 {
-	var stats runtime.MemStats
-	runtime.ReadMemStats(&stats)
-	t := stats.TotalAlloc
-	f()
-	runtime.ReadMemStats(&stats)
-	return stats.TotalAlloc - t
-}
-
-// TestMulUnbalanced tests that multiplying numbers of different lengths
-// does not cause deep recursion and in turn allocate too much memory.
-// Test case for issue 3807.
-func TestMulUnbalanced(t *testing.T) {
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1))
-	x := rndNat(50000)
-	y := rndNat(40)
-	allocSize := allocBytes(func() {
-		nat(nil).mul(x, y)
-	})
-	inputSize := uint64(len(x)+len(y)) * _S
-	if ratio := allocSize / uint64(inputSize); ratio > 10 {
-		t.Errorf("multiplication uses too much memory (%d > %d times the size of inputs)", allocSize, ratio)
-	}
-}
-
-func rndNat(n int) nat {
-	return nat(rndV(n)).norm()
-}
-
-func BenchmarkMul(b *testing.B) {
-	mulx := rndNat(1e4)
-	muly := rndNat(1e4)
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		var z nat
-		z.mul(mulx, muly)
-	}
-}
-
-func TestNLZ(t *testing.T) {
-	var x Word = _B >> 1
-	for i := 0; i <= _W; i++ {
-		if int(nlz(x)) != i {
-			t.Errorf("failed at %x: got %d want %d", x, nlz(x), i)
-		}
-		x >>= 1
-	}
-}
-
-type shiftTest struct {
-	in    nat
-	shift uint
-	out   nat
-}
-
-var leftShiftTests = []shiftTest{
-	{nil, 0, nil},
-	{nil, 1, nil},
-	{natOne, 0, natOne},
-	{natOne, 1, natTwo},
-	{nat{1 << (_W - 1)}, 1, nat{0}},
-	{nat{1 << (_W - 1), 0}, 1, nat{0, 1}},
-}
-
-func TestShiftLeft(t *testing.T) {
-	for i, test := range leftShiftTests {
-		var z nat
-		z = z.shl(test.in, test.shift)
-		for j, d := range test.out {
-			if j >= len(z) || z[j] != d {
-				t.Errorf("#%d: got: %v want: %v", i, z, test.out)
-				break
-			}
-		}
-	}
-}
-
-var rightShiftTests = []shiftTest{
-	{nil, 0, nil},
-	{nil, 1, nil},
-	{natOne, 0, natOne},
-	{natOne, 1, nil},
-	{natTwo, 1, natOne},
-	{nat{0, 1}, 1, nat{1 << (_W - 1)}},
-	{nat{2, 1, 1}, 1, nat{1<<(_W-1) + 1, 1 << (_W - 1)}},
-}
-
-func TestShiftRight(t *testing.T) {
-	for i, test := range rightShiftTests {
-		var z nat
-		z = z.shr(test.in, test.shift)
-		for j, d := range test.out {
-			if j >= len(z) || z[j] != d {
-				t.Errorf("#%d: got: %v want: %v", i, z, test.out)
-				break
-			}
-		}
-	}
-}
-
-type modWTest struct {
-	in       string
-	dividend string
-	out      string
-}
-
-var modWTests32 = []modWTest{
-	{"23492635982634928349238759823742", "252341", "220170"},
-}
-
-var modWTests64 = []modWTest{
-	{"6527895462947293856291561095690465243862946", "524326975699234", "375066989628668"},
-}
-
-func runModWTests(t *testing.T, tests []modWTest) {
-	for i, test := range tests {
-		in, _ := new(Int).SetString(test.in, 10)
-		d, _ := new(Int).SetString(test.dividend, 10)
-		out, _ := new(Int).SetString(test.out, 10)
-
-		r := in.abs.modW(d.abs[0])
-		if r != out.abs[0] {
-			t.Errorf("#%d failed: got %d want %s", i, r, out)
-		}
-	}
-}
-
-func TestModW(t *testing.T) {
-	if _W >= 32 {
-		runModWTests(t, modWTests32)
-	}
-	if _W >= 64 {
-		runModWTests(t, modWTests64)
-	}
-}
-
-func TestTrailingZeroBits(t *testing.T) {
-	// test 0 case explicitly
-	if n := trailingZeroBits(0); n != 0 {
-		t.Errorf("got trailingZeroBits(0) = %d; want 0", n)
-	}
-
-	x := Word(1)
-	for i := uint(0); i < _W; i++ {
-		n := trailingZeroBits(x)
-		if n != i {
-			t.Errorf("got trailingZeroBits(%#x) = %d; want %d", x, n, i%_W)
-		}
-		x <<= 1
-	}
-
-	// test 0 case explicitly
-	if n := nat(nil).trailingZeroBits(); n != 0 {
-		t.Errorf("got nat(nil).trailingZeroBits() = %d; want 0", n)
-	}
-
-	y := nat(nil).set(natOne)
-	for i := uint(0); i <= 3*_W; i++ {
-		n := y.trailingZeroBits()
-		if n != i {
-			t.Errorf("got 0x%s.trailingZeroBits() = %d; want %d", y.hexString(), n, i)
-		}
-		y = y.shl(y, 1)
-	}
-}
-
-var montgomeryTests = []struct {
-	x, y, m      string
-	k0           uint64
-	out32, out64 string
-}{
-	{
-		"0xffffffffffffffffffffffffffffffffffffffffffffffffe",
-		"0xffffffffffffffffffffffffffffffffffffffffffffffffe",
-		"0xfffffffffffffffffffffffffffffffffffffffffffffffff",
-		0x0000000000000000,
-		"0xffffffffffffffffffffffffffffffffffffffffff",
-		"0xffffffffffffffffffffffffffffffffff",
-	},
-	{
-		"0x0000000080000000",
-		"0x00000000ffffffff",
-		"0x0000000010000001",
-		0xff0000000fffffff,
-		"0x0000000088000000",
-		"0x0000000007800001",
-	},
-	{
-		"0xffffffffffffffffffffffffffffffff00000000000022222223333333333444444444",
-		"0xffffffffffffffffffffffffffffffff999999999999999aaabbbbbbbbcccccccccccc",
-		"0x33377fffffffffffffffffffffffffffffffffffffffffffff0000000000022222eee1",
-		0xdecc8f1249812adf,
-		"0x22bb05b6d95eaaeca2bb7c05e51f807bce9064b5fbad177161695e4558f9474e91cd79",
-		"0x14beb58d230f85b6d95eaaeca2bb7c05e51f807bce9064b5fb45669afa695f228e48cd",
-	},
-	{
-		"0x10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000022222223333333333444444444",
-		"0x10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff999999999999999aaabbbbbbbbcccccccccccc",
-		"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff33377fffffffffffffffffffffffffffffffffffffffffffff0000000000022222eee1",
-		0xdecc8f1249812adf,
-		"0x5c0d52f451aec609b15da8e5e5626c4eaa88723bdeac9d25ca9b961269400410ca208a16af9c2fb07d7a11c7772cba02c22f9711078d51a3797eb18e691295293284d988e349fa6deba46b25a4ecd9f715",
-		"0x92fcad4b5c0d52f451aec609b15da8e5e5626c4eaa88723bdeac9d25ca9b961269400410ca208a16af9c2fb07d799c32fe2f3cc5422f9711078d51a3797eb18e691295293284d8f5e69caf6decddfe1df6",
-	},
-}
-
-func TestMontgomery(t *testing.T) {
-	for i, test := range montgomeryTests {
-		x := natFromString(test.x)
-		y := natFromString(test.y)
-		m := natFromString(test.m)
-
-		var out nat
-		if _W == 32 {
-			out = natFromString(test.out32)
-		} else {
-			out = natFromString(test.out64)
-		}
-
-		k0 := Word(test.k0 & _M) // mask k0 to ensure that it fits for 32-bit systems.
-		z := nat(nil).montgomery(x, y, m, k0, len(m))
-		z = z.norm()
-		if z.cmp(out) != 0 {
-			t.Errorf("#%d got %s want %s", i, z.decimalString(), out.decimalString())
-		}
-	}
-}
-
-var expNNTests = []struct {
-	x, y, m string
-	out     string
-}{
-	{"0", "0", "0", "1"},
-	{"0", "0", "1", "0"},
-	{"1", "1", "1", "0"},
-	{"2", "1", "1", "0"},
-	{"2", "2", "1", "0"},
-	{"10", "100000000000", "1", "0"},
-	{"0x8000000000000000", "2", "", "0x40000000000000000000000000000000"},
-	{"0x8000000000000000", "2", "6719", "4944"},
-	{"0x8000000000000000", "3", "6719", "5447"},
-	{"0x8000000000000000", "1000", "6719", "1603"},
-	{"0x8000000000000000", "1000000", "6719", "3199"},
-	{
-		"2938462938472983472983659726349017249287491026512746239764525612965293865296239471239874193284792387498274256129746192347",
-		"298472983472983471903246121093472394872319615612417471234712061",
-		"29834729834729834729347290846729561262544958723956495615629569234729836259263598127342374289365912465901365498236492183464",
-		"23537740700184054162508175125554701713153216681790245129157191391322321508055833908509185839069455749219131480588829346291",
-	},
-}
-
-func TestExpNN(t *testing.T) {
-	for i, test := range expNNTests {
-		x := natFromString(test.x)
-		y := natFromString(test.y)
-		out := natFromString(test.out)
-
-		var m nat
-		if len(test.m) > 0 {
-			m = natFromString(test.m)
-		}
-
-		z := nat(nil).expNN(x, y, m)
-		if z.cmp(out) != 0 {
-			t.Errorf("#%d got %s want %s", i, z.decimalString(), out.decimalString())
-		}
-	}
-}
-
-func ExpHelper(b *testing.B, x, y Word) {
-	var z nat
-	for i := 0; i < b.N; i++ {
-		z.expWW(x, y)
-	}
-}
-
-func BenchmarkExp3Power0x10(b *testing.B)     { ExpHelper(b, 3, 0x10) }
-func BenchmarkExp3Power0x40(b *testing.B)     { ExpHelper(b, 3, 0x40) }
-func BenchmarkExp3Power0x100(b *testing.B)    { ExpHelper(b, 3, 0x100) }
-func BenchmarkExp3Power0x400(b *testing.B)    { ExpHelper(b, 3, 0x400) }
-func BenchmarkExp3Power0x1000(b *testing.B)   { ExpHelper(b, 3, 0x1000) }
-func BenchmarkExp3Power0x4000(b *testing.B)   { ExpHelper(b, 3, 0x4000) }
-func BenchmarkExp3Power0x10000(b *testing.B)  { ExpHelper(b, 3, 0x10000) }
-func BenchmarkExp3Power0x40000(b *testing.B)  { ExpHelper(b, 3, 0x40000) }
-func BenchmarkExp3Power0x100000(b *testing.B) { ExpHelper(b, 3, 0x100000) }
-func BenchmarkExp3Power0x400000(b *testing.B) { ExpHelper(b, 3, 0x400000) }
-
-func fibo(n int) nat {
-	switch n {
-	case 0:
-		return nil
-	case 1:
-		return nat{1}
-	}
-	f0 := fibo(0)
-	f1 := fibo(1)
-	var f2 nat
-	for i := 1; i < n; i++ {
-		f2 = f2.add(f0, f1)
-		f0, f1, f2 = f1, f2, f0
-	}
-	return f1
-}
-
-var fiboNums = []string{
-	"0",
-	"55",
-	"6765",
-	"832040",
-	"102334155",
-	"12586269025",
-	"1548008755920",
-	"190392490709135",
-	"23416728348467685",
-	"2880067194370816120",
-	"354224848179261915075",
-}
-
-func TestFibo(t *testing.T) {
-	for i, want := range fiboNums {
-		n := i * 10
-		got := fibo(n).decimalString()
-		if got != want {
-			t.Errorf("fibo(%d) failed: got %s want %s", n, got, want)
-		}
-	}
-}
-
-func BenchmarkFibo(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		fibo(1e0)
-		fibo(1e1)
-		fibo(1e2)
-		fibo(1e3)
-		fibo(1e4)
-		fibo(1e5)
-	}
-}
-
-var bitTests = []struct {
-	x    string
-	i    uint
-	want uint
-}{
-	{"0", 0, 0},
-	{"0", 1, 0},
-	{"0", 1000, 0},
-
-	{"0x1", 0, 1},
-	{"0x10", 0, 0},
-	{"0x10", 3, 0},
-	{"0x10", 4, 1},
-	{"0x10", 5, 0},
-
-	{"0x8000000000000000", 62, 0},
-	{"0x8000000000000000", 63, 1},
-	{"0x8000000000000000", 64, 0},
-
-	{"0x3" + strings.Repeat("0", 32), 127, 0},
-	{"0x3" + strings.Repeat("0", 32), 128, 1},
-	{"0x3" + strings.Repeat("0", 32), 129, 1},
-	{"0x3" + strings.Repeat("0", 32), 130, 0},
-}
-
-func TestBit(t *testing.T) {
-	for i, test := range bitTests {
-		x := natFromString(test.x)
-		if got := x.bit(test.i); got != test.want {
-			t.Errorf("#%d: %s.bit(%d) = %v; want %v", i, test.x, test.i, got, test.want)
-		}
-	}
-}
-
-var stickyTests = []struct {
-	x    string
-	i    uint
-	want uint
-}{
-	{"0", 0, 0},
-	{"0", 1, 0},
-	{"0", 1000, 0},
-
-	{"0x1", 0, 0},
-	{"0x1", 1, 1},
-
-	{"0x1350", 0, 0},
-	{"0x1350", 4, 0},
-	{"0x1350", 5, 1},
-
-	{"0x8000000000000000", 63, 0},
-	{"0x8000000000000000", 64, 1},
-
-	{"0x1" + strings.Repeat("0", 100), 400, 0},
-	{"0x1" + strings.Repeat("0", 100), 401, 1},
-}
-
-func TestSticky(t *testing.T) {
-	for i, test := range stickyTests {
-		x := natFromString(test.x)
-		if got := x.sticky(test.i); got != test.want {
-			t.Errorf("#%d: %s.sticky(%d) = %v; want %v", i, test.x, test.i, got, test.want)
-		}
-		if test.want == 1 {
-			// all subsequent i's should also return 1
-			for d := uint(1); d <= 3; d++ {
-				if got := x.sticky(test.i + d); got != 1 {
-					t.Errorf("#%d: %s.sticky(%d) = %v; want %v", i, test.x, test.i+d, got, 1)
-				}
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/natconv.go b/third_party/gofrontend/libgo/go/math/big/natconv.go
deleted file mode 100644
index 022dcfe..0000000
--- a/third_party/gofrontend/libgo/go/math/big/natconv.go
+++ /dev/null
@@ -1,495 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements nat-to-string conversion functions.
-
-package big
-
-import (
-	"errors"
-	"fmt"
-	"io"
-	"math"
-	"sync"
-)
-
-// MaxBase is the largest number base accepted for string conversions.
-const MaxBase = 'z' - 'a' + 10 + 1
-
-// maxPow returns (b**n, n) such that b**n is the largest power b**n <= _M.
-// For instance maxPow(10) == (1e19, 19) for 19 decimal digits in a 64bit Word.
-// In other words, at most n digits in base b fit into a Word.
-// TODO(gri) replace this with a table, generated at build time.
-func maxPow(b Word) (p Word, n int) {
-	p, n = b, 1 // assuming b <= _M
-	for max := _M / b; p <= max; {
-		// p == b**n && p <= max
-		p *= b
-		n++
-	}
-	// p == b**n && p <= _M
-	return
-}
-
-// pow returns x**n for n > 0, and 1 otherwise.
-func pow(x Word, n int) (p Word) {
-	// n == sum of bi * 2**i, for 0 <= i < imax, and bi is 0 or 1
-	// thus x**n == product of x**(2**i) for all i where bi == 1
-	// (Russian Peasant Method for exponentiation)
-	p = 1
-	for n > 0 {
-		if n&1 != 0 {
-			p *= x
-		}
-		x *= x
-		n >>= 1
-	}
-	return
-}
-
-// scan scans the number corresponding to the longest possible prefix
-// from r representing an unsigned number in a given conversion base.
-// It returns the corresponding natural number res, the actual base b,
-// a digit count, and a read or syntax error err, if any.
-//
-//	number   = [ prefix ] mantissa .
-//	prefix   = "0" [ "x" | "X" | "b" | "B" ] .
-//      mantissa = digits | digits "." [ digits ] | "." digits .
-//	digits   = digit { digit } .
-//	digit    = "0" ... "9" | "a" ... "z" | "A" ... "Z" .
-//
-// Unless fracOk is set, the base argument must be 0 or a value between
-// 2 and MaxBase. If fracOk is set, the base argument must be one of
-// 0, 2, 10, or 16. Providing an invalid base argument leads to a run-
-// time panic.
-//
-// For base 0, the number prefix determines the actual base: A prefix of
-// ``0x'' or ``0X'' selects base 16; if fracOk is not set, the ``0'' prefix
-// selects base 8, and a ``0b'' or ``0B'' prefix selects base 2. Otherwise
-// the selected base is 10 and no prefix is accepted.
-//
-// If fracOk is set, an octal prefix is ignored (a leading ``0'' simply
-// stands for a zero digit), and a period followed by a fractional part
-// is permitted. The result value is computed as if there were no period
-// present; and the count value is used to determine the fractional part.
-//
-// A result digit count > 0 corresponds to the number of (non-prefix) digits
-// parsed. A digit count <= 0 indicates the presence of a period (if fracOk
-// is set, only), and -count is the number of fractional digits found.
-// In this case, the actual value of the scanned number is res * b**count.
-//
-func (z nat) scan(r io.ByteScanner, base int, fracOk bool) (res nat, b, count int, err error) {
-	// reject illegal bases
-	baseOk := base == 0 ||
-		!fracOk && 2 <= base && base <= MaxBase ||
-		fracOk && (base == 2 || base == 10 || base == 16)
-	if !baseOk {
-		panic(fmt.Sprintf("illegal number base %d", base))
-	}
-
-	// one char look-ahead
-	ch, err := r.ReadByte()
-	if err != nil {
-		return
-	}
-
-	// determine actual base
-	b = base
-	if base == 0 {
-		// actual base is 10 unless there's a base prefix
-		b = 10
-		if ch == '0' {
-			count = 1
-			switch ch, err = r.ReadByte(); err {
-			case nil:
-				// possibly one of 0x, 0X, 0b, 0B
-				if !fracOk {
-					b = 8
-				}
-				switch ch {
-				case 'x', 'X':
-					b = 16
-				case 'b', 'B':
-					b = 2
-				}
-				switch b {
-				case 16, 2:
-					count = 0 // prefix is not counted
-					if ch, err = r.ReadByte(); err != nil {
-						// io.EOF is also an error in this case
-						return
-					}
-				case 8:
-					count = 0 // prefix is not counted
-				}
-			case io.EOF:
-				// input is "0"
-				res = z[:0]
-				err = nil
-				return
-			default:
-				// read error
-				return
-			}
-		}
-	}
-
-	// convert string
-	// Algorithm: Collect digits in groups of at most n digits in di
-	// and then use mulAddWW for every such group to add them to the
-	// result.
-	z = z[:0]
-	b1 := Word(b)
-	bn, n := maxPow(b1) // at most n digits in base b1 fit into Word
-	di := Word(0)       // 0 <= di < b1**i < bn
-	i := 0              // 0 <= i < n
-	dp := -1            // position of decimal point
-	for {
-		if fracOk && ch == '.' {
-			fracOk = false
-			dp = count
-			// advance
-			if ch, err = r.ReadByte(); err != nil {
-				if err == io.EOF {
-					err = nil
-					break
-				}
-				return
-			}
-		}
-
-		// convert rune into digit value d1
-		var d1 Word
-		switch {
-		case '0' <= ch && ch <= '9':
-			d1 = Word(ch - '0')
-		case 'a' <= ch && ch <= 'z':
-			d1 = Word(ch - 'a' + 10)
-		case 'A' <= ch && ch <= 'Z':
-			d1 = Word(ch - 'A' + 10)
-		default:
-			d1 = MaxBase + 1
-		}
-		if d1 >= b1 {
-			r.UnreadByte() // ch does not belong to number anymore
-			break
-		}
-		count++
-
-		// collect d1 in di
-		di = di*b1 + d1
-		i++
-
-		// if di is "full", add it to the result
-		if i == n {
-			z = z.mulAddWW(z, bn, di)
-			di = 0
-			i = 0
-		}
-
-		// advance
-		if ch, err = r.ReadByte(); err != nil {
-			if err == io.EOF {
-				err = nil
-				break
-			}
-			return
-		}
-	}
-
-	if count == 0 {
-		// no digits found
-		switch {
-		case base == 0 && b == 8:
-			// there was only the octal prefix 0 (possibly followed by digits > 7);
-			// count as one digit and return base 10, not 8
-			count = 1
-			b = 10
-		case base != 0 || b != 8:
-			// there was neither a mantissa digit nor the octal prefix 0
-			err = errors.New("syntax error scanning number")
-		}
-		return
-	}
-	// count > 0
-
-	// add remaining digits to result
-	if i > 0 {
-		z = z.mulAddWW(z, pow(b1, i), di)
-	}
-	res = z.norm()
-
-	// adjust for fraction, if any
-	if dp >= 0 {
-		// 0 <= dp <= count > 0
-		count = dp - count
-	}
-
-	return
-}
-
-// Character sets for string conversion.
-const (
-	lowercaseDigits = "0123456789abcdefghijklmnopqrstuvwxyz"
-	uppercaseDigits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-)
-
-// decimalString returns a decimal representation of x.
-// It calls x.string with the charset "0123456789".
-func (x nat) decimalString() string {
-	return x.string(lowercaseDigits[:10])
-}
-
-// hexString returns a hexadecimal representation of x.
-// It calls x.string with the charset "0123456789abcdef".
-func (x nat) hexString() string {
-	return x.string(lowercaseDigits[:16])
-}
-
-// string converts x to a string using digits from a charset; a digit with
-// value d is represented by charset[d]. The conversion base is determined
-// by len(charset), which must be >= 2 and <= 256.
-func (x nat) string(charset string) string {
-	b := Word(len(charset))
-
-	// special cases
-	switch {
-	case b < 2 || b > 256:
-		panic("invalid character set length")
-	case len(x) == 0:
-		return string(charset[0])
-	}
-
-	// allocate buffer for conversion
-	i := int(float64(x.bitLen())/math.Log2(float64(b))) + 1 // off by one at most
-	s := make([]byte, i)
-
-	// convert power of two and non power of two bases separately
-	if b == b&-b {
-		// shift is base-b digit size in bits
-		shift := trailingZeroBits(b) // shift > 0 because b >= 2
-		mask := Word(1)<<shift - 1
-		w := x[0]
-		nbits := uint(_W) // number of unprocessed bits in w
-
-		// convert less-significant words
-		for k := 1; k < len(x); k++ {
-			// convert full digits
-			for nbits >= shift {
-				i--
-				s[i] = charset[w&mask]
-				w >>= shift
-				nbits -= shift
-			}
-
-			// convert any partial leading digit and advance to next word
-			if nbits == 0 {
-				// no partial digit remaining, just advance
-				w = x[k]
-				nbits = _W
-			} else {
-				// partial digit in current (k-1) and next (k) word
-				w |= x[k] << nbits
-				i--
-				s[i] = charset[w&mask]
-
-				// advance
-				w = x[k] >> (shift - nbits)
-				nbits = _W - (shift - nbits)
-			}
-		}
-
-		// convert digits of most-significant word (omit leading zeros)
-		for nbits >= 0 && w != 0 {
-			i--
-			s[i] = charset[w&mask]
-			w >>= shift
-			nbits -= shift
-		}
-
-	} else {
-		bb, ndigits := maxPow(Word(b))
-
-		// construct table of successive squares of bb*leafSize to use in subdivisions
-		// result (table != nil) <=> (len(x) > leafSize > 0)
-		table := divisors(len(x), b, ndigits, bb)
-
-		// preserve x, create local copy for use by convertWords
-		q := nat(nil).set(x)
-
-		// convert q to string s in base b
-		q.convertWords(s, charset, b, ndigits, bb, table)
-
-		// strip leading zeros
-		// (x != 0; thus s must contain at least one non-zero digit
-		// and the loop will terminate)
-		i = 0
-		for zero := charset[0]; s[i] == zero; {
-			i++
-		}
-	}
-
-	return string(s[i:])
-}
-
-// Convert words of q to base b digits in s. If q is large, it is recursively "split in half"
-// by nat/nat division using tabulated divisors. Otherwise, it is converted iteratively using
-// repeated nat/Word division.
-//
-// The iterative method processes n Words by n divW() calls, each of which visits every Word in the
-// incrementally shortened q for a total of n + (n-1) + (n-2) ... + 2 + 1, or n(n+1)/2 divW()'s.
-// Recursive conversion divides q by its approximate square root, yielding two parts, each half
-// the size of q. Using the iterative method on both halves means 2 * (n/2)(n/2 + 1)/2 divW()'s
-// plus the expensive long div(). Asymptotically, the ratio is favorable at 1/2 the divW()'s, and
-// is made better by splitting the subblocks recursively. Best is to split blocks until one more
-// split would take longer (because of the nat/nat div()) than the twice as many divW()'s of the
-// iterative approach. This threshold is represented by leafSize. Benchmarking of leafSize in the
-// range 2..64 shows that values of 8 and 16 work well, with a 4x speedup at medium lengths and
-// ~30x for 20000 digits. Use nat_test.go's BenchmarkLeafSize tests to optimize leafSize for
-// specific hardware.
-//
-func (q nat) convertWords(s []byte, charset string, b Word, ndigits int, bb Word, table []divisor) {
-	// split larger blocks recursively
-	if table != nil {
-		// len(q) > leafSize > 0
-		var r nat
-		index := len(table) - 1
-		for len(q) > leafSize {
-			// find divisor close to sqrt(q) if possible, but in any case < q
-			maxLength := q.bitLen()     // ~= log2 q, or at of least largest possible q of this bit length
-			minLength := maxLength >> 1 // ~= log2 sqrt(q)
-			for index > 0 && table[index-1].nbits > minLength {
-				index-- // desired
-			}
-			if table[index].nbits >= maxLength && table[index].bbb.cmp(q) >= 0 {
-				index--
-				if index < 0 {
-					panic("internal inconsistency")
-				}
-			}
-
-			// split q into the two digit number (q'*bbb + r) to form independent subblocks
-			q, r = q.div(r, q, table[index].bbb)
-
-			// convert subblocks and collect results in s[:h] and s[h:]
-			h := len(s) - table[index].ndigits
-			r.convertWords(s[h:], charset, b, ndigits, bb, table[0:index])
-			s = s[:h] // == q.convertWords(s, charset, b, ndigits, bb, table[0:index+1])
-		}
-	}
-
-	// having split any large blocks now process the remaining (small) block iteratively
-	i := len(s)
-	var r Word
-	if b == 10 {
-		// hard-coding for 10 here speeds this up by 1.25x (allows for / and % by constants)
-		for len(q) > 0 {
-			// extract least significant, base bb "digit"
-			q, r = q.divW(q, bb)
-			for j := 0; j < ndigits && i > 0; j++ {
-				i--
-				// avoid % computation since r%10 == r - int(r/10)*10;
-				// this appears to be faster for BenchmarkString10000Base10
-				// and smaller strings (but a bit slower for larger ones)
-				t := r / 10
-				s[i] = charset[r-t<<3-t-t] // TODO(gri) replace w/ t*10 once compiler produces better code
-				r = t
-			}
-		}
-	} else {
-		for len(q) > 0 {
-			// extract least significant, base bb "digit"
-			q, r = q.divW(q, bb)
-			for j := 0; j < ndigits && i > 0; j++ {
-				i--
-				s[i] = charset[r%b]
-				r /= b
-			}
-		}
-	}
-
-	// prepend high-order zeroes
-	zero := charset[0]
-	for i > 0 { // while need more leading zeroes
-		i--
-		s[i] = zero
-	}
-}
-
-// Split blocks greater than leafSize Words (or set to 0 to disable recursive conversion)
-// Benchmark and configure leafSize using: go test -bench="Leaf"
-//   8 and 16 effective on 3.0 GHz Xeon "Clovertown" CPU (128 byte cache lines)
-//   8 and 16 effective on 2.66 GHz Core 2 Duo "Penryn" CPU
-var leafSize int = 8 // number of Word-size binary values treat as a monolithic block
-
-type divisor struct {
-	bbb     nat // divisor
-	nbits   int // bit length of divisor (discounting leading zeroes) ~= log2(bbb)
-	ndigits int // digit length of divisor in terms of output base digits
-}
-
-var cacheBase10 struct {
-	sync.Mutex
-	table [64]divisor // cached divisors for base 10
-}
-
-// expWW computes x**y
-func (z nat) expWW(x, y Word) nat {
-	return z.expNN(nat(nil).setWord(x), nat(nil).setWord(y), nil)
-}
-
-// construct table of powers of bb*leafSize to use in subdivisions
-func divisors(m int, b Word, ndigits int, bb Word) []divisor {
-	// only compute table when recursive conversion is enabled and x is large
-	if leafSize == 0 || m <= leafSize {
-		return nil
-	}
-
-	// determine k where (bb**leafSize)**(2**k) >= sqrt(x)
-	k := 1
-	for words := leafSize; words < m>>1 && k < len(cacheBase10.table); words <<= 1 {
-		k++
-	}
-
-	// reuse and extend existing table of divisors or create new table as appropriate
-	var table []divisor // for b == 10, table overlaps with cacheBase10.table
-	if b == 10 {
-		cacheBase10.Lock()
-		table = cacheBase10.table[0:k] // reuse old table for this conversion
-	} else {
-		table = make([]divisor, k) // create new table for this conversion
-	}
-
-	// extend table
-	if table[k-1].ndigits == 0 {
-		// add new entries as needed
-		var larger nat
-		for i := 0; i < k; i++ {
-			if table[i].ndigits == 0 {
-				if i == 0 {
-					table[0].bbb = nat(nil).expWW(bb, Word(leafSize))
-					table[0].ndigits = ndigits * leafSize
-				} else {
-					table[i].bbb = nat(nil).mul(table[i-1].bbb, table[i-1].bbb)
-					table[i].ndigits = 2 * table[i-1].ndigits
-				}
-
-				// optimization: exploit aggregated extra bits in macro blocks
-				larger = nat(nil).set(table[i].bbb)
-				for mulAddVWW(larger, larger, b, 0) == 0 {
-					table[i].bbb = table[i].bbb.set(larger)
-					table[i].ndigits++
-				}
-
-				table[i].nbits = table[i].bbb.bitLen()
-			}
-		}
-	}
-
-	if b == 10 {
-		cacheBase10.Unlock()
-	}
-
-	return table
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/natconv_test.go b/third_party/gofrontend/libgo/go/math/big/natconv_test.go
deleted file mode 100644
index f321fbc..0000000
--- a/third_party/gofrontend/libgo/go/math/big/natconv_test.go
+++ /dev/null
@@ -1,425 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package big
-
-import (
-	"io"
-	"strings"
-	"testing"
-)
-
-func toString(x nat, charset string) string {
-	base := len(charset)
-
-	// special cases
-	switch {
-	case base < 2:
-		panic("illegal base")
-	case len(x) == 0:
-		return string(charset[0])
-	}
-
-	// allocate buffer for conversion
-	i := x.bitLen()/log2(Word(base)) + 1 // +1: round up
-	s := make([]byte, i)
-
-	// don't destroy x
-	q := nat(nil).set(x)
-
-	// convert
-	for len(q) > 0 {
-		i--
-		var r Word
-		q, r = q.divW(q, Word(base))
-		s[i] = charset[r]
-	}
-
-	return string(s[i:])
-}
-
-var strTests = []struct {
-	x nat    // nat value to be converted
-	c string // conversion charset
-	s string // expected result
-}{
-	{nil, "01", "0"},
-	{nat{1}, "01", "1"},
-	{nat{0xc5}, "01", "11000101"},
-	{nat{03271}, lowercaseDigits[:8], "3271"},
-	{nat{10}, lowercaseDigits[:10], "10"},
-	{nat{1234567890}, uppercaseDigits[:10], "1234567890"},
-	{nat{0xdeadbeef}, lowercaseDigits[:16], "deadbeef"},
-	{nat{0xdeadbeef}, uppercaseDigits[:16], "DEADBEEF"},
-	{nat{0x229be7}, lowercaseDigits[:17], "1a2b3c"},
-	{nat{0x309663e6}, uppercaseDigits[:32], "O9COV6"},
-}
-
-func TestString(t *testing.T) {
-	// test invalid character set explicitly
-	var panicStr string
-	func() {
-		defer func() {
-			panicStr = recover().(string)
-		}()
-		natOne.string("0")
-	}()
-	if panicStr != "invalid character set length" {
-		t.Errorf("expected panic for invalid character set")
-	}
-
-	for _, a := range strTests {
-		s := a.x.string(a.c)
-		if s != a.s {
-			t.Errorf("string%+v\n\tgot s = %s; want %s", a, s, a.s)
-		}
-
-		x, b, _, err := nat(nil).scan(strings.NewReader(a.s), len(a.c), false)
-		if x.cmp(a.x) != 0 {
-			t.Errorf("scan%+v\n\tgot z = %v; want %v", a, x, a.x)
-		}
-		if b != len(a.c) {
-			t.Errorf("scan%+v\n\tgot b = %d; want %d", a, b, len(a.c))
-		}
-		if err != nil {
-			t.Errorf("scan%+v\n\tgot error = %s", a, err)
-		}
-	}
-}
-
-var natScanTests = []struct {
-	s     string // string to be scanned
-	base  int    // input base
-	frac  bool   // fraction ok
-	x     nat    // expected nat
-	b     int    // expected base
-	count int    // expected digit count
-	ok    bool   // expected success
-	next  rune   // next character (or 0, if at EOF)
-}{
-	// error: no mantissa
-	{},
-	{s: "?"},
-	{base: 10},
-	{base: 36},
-	{s: "?", base: 10},
-	{s: "0x"},
-	{s: "345", base: 2},
-
-	// error: incorrect use of decimal point
-	{s: ".0"},
-	{s: ".0", base: 10},
-	{s: ".", base: 0},
-	{s: "0x.0"},
-
-	// no errors
-	{"0", 0, false, nil, 10, 1, true, 0},
-	{"0", 10, false, nil, 10, 1, true, 0},
-	{"0", 36, false, nil, 36, 1, true, 0},
-	{"1", 0, false, nat{1}, 10, 1, true, 0},
-	{"1", 10, false, nat{1}, 10, 1, true, 0},
-	{"0 ", 0, false, nil, 10, 1, true, ' '},
-	{"08", 0, false, nil, 10, 1, true, '8'},
-	{"08", 10, false, nat{8}, 10, 2, true, 0},
-	{"018", 0, false, nat{1}, 8, 1, true, '8'},
-	{"0b1", 0, false, nat{1}, 2, 1, true, 0},
-	{"0b11000101", 0, false, nat{0xc5}, 2, 8, true, 0},
-	{"03271", 0, false, nat{03271}, 8, 4, true, 0},
-	{"10ab", 0, false, nat{10}, 10, 2, true, 'a'},
-	{"1234567890", 0, false, nat{1234567890}, 10, 10, true, 0},
-	{"xyz", 36, false, nat{(33*36+34)*36 + 35}, 36, 3, true, 0},
-	{"xyz?", 36, false, nat{(33*36+34)*36 + 35}, 36, 3, true, '?'},
-	{"0x", 16, false, nil, 16, 1, true, 'x'},
-	{"0xdeadbeef", 0, false, nat{0xdeadbeef}, 16, 8, true, 0},
-	{"0XDEADBEEF", 0, false, nat{0xdeadbeef}, 16, 8, true, 0},
-
-	// no errors, decimal point
-	{"0.", 0, false, nil, 10, 1, true, '.'},
-	{"0.", 10, true, nil, 10, 0, true, 0},
-	{"0.1.2", 10, true, nat{1}, 10, -1, true, '.'},
-	{".000", 10, true, nil, 10, -3, true, 0},
-	{"12.3", 10, true, nat{123}, 10, -1, true, 0},
-	{"012.345", 10, true, nat{12345}, 10, -3, true, 0},
-}
-
-func TestScanBase(t *testing.T) {
-	for _, a := range natScanTests {
-		r := strings.NewReader(a.s)
-		x, b, count, err := nat(nil).scan(r, a.base, a.frac)
-		if err == nil && !a.ok {
-			t.Errorf("scan%+v\n\texpected error", a)
-		}
-		if err != nil {
-			if a.ok {
-				t.Errorf("scan%+v\n\tgot error = %s", a, err)
-			}
-			continue
-		}
-		if x.cmp(a.x) != 0 {
-			t.Errorf("scan%+v\n\tgot z = %v; want %v", a, x, a.x)
-		}
-		if b != a.b {
-			t.Errorf("scan%+v\n\tgot b = %d; want %d", a, b, a.base)
-		}
-		if count != a.count {
-			t.Errorf("scan%+v\n\tgot count = %d; want %d", a, count, a.count)
-		}
-		next, _, err := r.ReadRune()
-		if err == io.EOF {
-			next = 0
-			err = nil
-		}
-		if err == nil && next != a.next {
-			t.Errorf("scan%+v\n\tgot next = %q; want %q", a, next, a.next)
-		}
-	}
-}
-
-var pi = "3" +
-	"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651" +
-	"32823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461" +
-	"28475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920" +
-	"96282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179" +
-	"31051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798" +
-	"60943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901" +
-	"22495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837" +
-	"29780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083" +
-	"81420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909" +
-	"21642019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151" +
-	"55748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035" +
-	"63707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104" +
-	"75216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992" +
-	"45863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818" +
-	"34797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548" +
-	"16136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179" +
-	"04946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886" +
-	"26945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645" +
-	"99581339047802759009946576407895126946839835259570982582262052248940772671947826848260147699090264013639443745" +
-	"53050682034962524517493996514314298091906592509372216964615157098583874105978859597729754989301617539284681382" +
-	"68683868942774155991855925245953959431049972524680845987273644695848653836736222626099124608051243884390451244" +
-	"13654976278079771569143599770012961608944169486855584840635342207222582848864815845602850601684273945226746767" +
-	"88952521385225499546667278239864565961163548862305774564980355936345681743241125150760694794510965960940252288" +
-	"79710893145669136867228748940560101503308617928680920874760917824938589009714909675985261365549781893129784821" +
-	"68299894872265880485756401427047755513237964145152374623436454285844479526586782105114135473573952311342716610" +
-	"21359695362314429524849371871101457654035902799344037420073105785390621983874478084784896833214457138687519435" +
-	"06430218453191048481005370614680674919278191197939952061419663428754440643745123718192179998391015919561814675" +
-	"14269123974894090718649423196156794520809514655022523160388193014209376213785595663893778708303906979207734672" +
-	"21825625996615014215030680384477345492026054146659252014974428507325186660021324340881907104863317346496514539" +
-	"05796268561005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007" +
-	"23055876317635942187312514712053292819182618612586732157919841484882916447060957527069572209175671167229109816" +
-	"90915280173506712748583222871835209353965725121083579151369882091444210067510334671103141267111369908658516398" +
-	"31501970165151168517143765761835155650884909989859982387345528331635507647918535893226185489632132933089857064" +
-	"20467525907091548141654985946163718027098199430992448895757128289059232332609729971208443357326548938239119325" +
-	"97463667305836041428138830320382490375898524374417029132765618093773444030707469211201913020330380197621101100" +
-	"44929321516084244485963766983895228684783123552658213144957685726243344189303968642624341077322697802807318915" +
-	"44110104468232527162010526522721116603966655730925471105578537634668206531098965269186205647693125705863566201" +
-	"85581007293606598764861179104533488503461136576867532494416680396265797877185560845529654126654085306143444318" +
-	"58676975145661406800700237877659134401712749470420562230538994561314071127000407854733269939081454664645880797" +
-	"27082668306343285878569830523580893306575740679545716377525420211495576158140025012622859413021647155097925923" +
-	"09907965473761255176567513575178296664547791745011299614890304639947132962107340437518957359614589019389713111" +
-	"79042978285647503203198691514028708085990480109412147221317947647772622414254854540332157185306142288137585043" +
-	"06332175182979866223717215916077166925474873898665494945011465406284336639379003976926567214638530673609657120" +
-	"91807638327166416274888800786925602902284721040317211860820419000422966171196377921337575114959501566049631862" +
-	"94726547364252308177036751590673502350728354056704038674351362222477158915049530984448933309634087807693259939" +
-	"78054193414473774418426312986080998886874132604721569516239658645730216315981931951673538129741677294786724229" +
-	"24654366800980676928238280689964004824354037014163149658979409243237896907069779422362508221688957383798623001" +
-	"59377647165122893578601588161755782973523344604281512627203734314653197777416031990665541876397929334419521541" +
-	"34189948544473456738316249934191318148092777710386387734317720754565453220777092120190516609628049092636019759" +
-	"88281613323166636528619326686336062735676303544776280350450777235547105859548702790814356240145171806246436267" +
-	"94561275318134078330336254232783944975382437205835311477119926063813346776879695970309833913077109870408591337"
-
-// Test case for BenchmarkScanPi.
-func TestScanPi(t *testing.T) {
-	var x nat
-	z, _, _, err := x.scan(strings.NewReader(pi), 10, false)
-	if err != nil {
-		t.Errorf("scanning pi: %s", err)
-	}
-	if s := z.decimalString(); s != pi {
-		t.Errorf("scanning pi: got %s", s)
-	}
-}
-
-func TestScanPiParallel(t *testing.T) {
-	const n = 2
-	c := make(chan int)
-	for i := 0; i < n; i++ {
-		go func() {
-			TestScanPi(t)
-			c <- 0
-		}()
-	}
-	for i := 0; i < n; i++ {
-		<-c
-	}
-}
-
-func BenchmarkScanPi(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		var x nat
-		x.scan(strings.NewReader(pi), 10, false)
-	}
-}
-
-func BenchmarkStringPiParallel(b *testing.B) {
-	var x nat
-	x, _, _, _ = x.scan(strings.NewReader(pi), 0, false)
-	if x.decimalString() != pi {
-		panic("benchmark incorrect: conversion failed")
-	}
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			x.decimalString()
-		}
-	})
-}
-
-func BenchmarkScan10Base2(b *testing.B)     { ScanHelper(b, 2, 10, 10) }
-func BenchmarkScan100Base2(b *testing.B)    { ScanHelper(b, 2, 10, 100) }
-func BenchmarkScan1000Base2(b *testing.B)   { ScanHelper(b, 2, 10, 1000) }
-func BenchmarkScan10000Base2(b *testing.B)  { ScanHelper(b, 2, 10, 10000) }
-func BenchmarkScan100000Base2(b *testing.B) { ScanHelper(b, 2, 10, 100000) }
-
-func BenchmarkScan10Base8(b *testing.B)     { ScanHelper(b, 8, 10, 10) }
-func BenchmarkScan100Base8(b *testing.B)    { ScanHelper(b, 8, 10, 100) }
-func BenchmarkScan1000Base8(b *testing.B)   { ScanHelper(b, 8, 10, 1000) }
-func BenchmarkScan10000Base8(b *testing.B)  { ScanHelper(b, 8, 10, 10000) }
-func BenchmarkScan100000Base8(b *testing.B) { ScanHelper(b, 8, 10, 100000) }
-
-func BenchmarkScan10Base10(b *testing.B)     { ScanHelper(b, 10, 10, 10) }
-func BenchmarkScan100Base10(b *testing.B)    { ScanHelper(b, 10, 10, 100) }
-func BenchmarkScan1000Base10(b *testing.B)   { ScanHelper(b, 10, 10, 1000) }
-func BenchmarkScan10000Base10(b *testing.B)  { ScanHelper(b, 10, 10, 10000) }
-func BenchmarkScan100000Base10(b *testing.B) { ScanHelper(b, 10, 10, 100000) }
-
-func BenchmarkScan10Base16(b *testing.B)     { ScanHelper(b, 16, 10, 10) }
-func BenchmarkScan100Base16(b *testing.B)    { ScanHelper(b, 16, 10, 100) }
-func BenchmarkScan1000Base16(b *testing.B)   { ScanHelper(b, 16, 10, 1000) }
-func BenchmarkScan10000Base16(b *testing.B)  { ScanHelper(b, 16, 10, 10000) }
-func BenchmarkScan100000Base16(b *testing.B) { ScanHelper(b, 16, 10, 100000) }
-
-func ScanHelper(b *testing.B, base int, x, y Word) {
-	b.StopTimer()
-	var z nat
-	z = z.expWW(x, y)
-
-	var s string
-	s = z.string(lowercaseDigits[:base])
-	if t := toString(z, lowercaseDigits[:base]); t != s {
-		b.Fatalf("scanning: got %s; want %s", s, t)
-	}
-	b.StartTimer()
-
-	for i := 0; i < b.N; i++ {
-		z.scan(strings.NewReader(s), base, false)
-	}
-}
-
-func BenchmarkString10Base2(b *testing.B)     { StringHelper(b, 2, 10, 10) }
-func BenchmarkString100Base2(b *testing.B)    { StringHelper(b, 2, 10, 100) }
-func BenchmarkString1000Base2(b *testing.B)   { StringHelper(b, 2, 10, 1000) }
-func BenchmarkString10000Base2(b *testing.B)  { StringHelper(b, 2, 10, 10000) }
-func BenchmarkString100000Base2(b *testing.B) { StringHelper(b, 2, 10, 100000) }
-
-func BenchmarkString10Base8(b *testing.B)     { StringHelper(b, 8, 10, 10) }
-func BenchmarkString100Base8(b *testing.B)    { StringHelper(b, 8, 10, 100) }
-func BenchmarkString1000Base8(b *testing.B)   { StringHelper(b, 8, 10, 1000) }
-func BenchmarkString10000Base8(b *testing.B)  { StringHelper(b, 8, 10, 10000) }
-func BenchmarkString100000Base8(b *testing.B) { StringHelper(b, 8, 10, 100000) }
-
-func BenchmarkString10Base10(b *testing.B)     { StringHelper(b, 10, 10, 10) }
-func BenchmarkString100Base10(b *testing.B)    { StringHelper(b, 10, 10, 100) }
-func BenchmarkString1000Base10(b *testing.B)   { StringHelper(b, 10, 10, 1000) }
-func BenchmarkString10000Base10(b *testing.B)  { StringHelper(b, 10, 10, 10000) }
-func BenchmarkString100000Base10(b *testing.B) { StringHelper(b, 10, 10, 100000) }
-
-func BenchmarkString10Base16(b *testing.B)     { StringHelper(b, 16, 10, 10) }
-func BenchmarkString100Base16(b *testing.B)    { StringHelper(b, 16, 10, 100) }
-func BenchmarkString1000Base16(b *testing.B)   { StringHelper(b, 16, 10, 1000) }
-func BenchmarkString10000Base16(b *testing.B)  { StringHelper(b, 16, 10, 10000) }
-func BenchmarkString100000Base16(b *testing.B) { StringHelper(b, 16, 10, 100000) }
-
-func StringHelper(b *testing.B, base int, x, y Word) {
-	b.StopTimer()
-	var z nat
-	z = z.expWW(x, y)
-	z.string(lowercaseDigits[:base]) // warm divisor cache
-	b.StartTimer()
-
-	for i := 0; i < b.N; i++ {
-		_ = z.string(lowercaseDigits[:base])
-	}
-}
-
-func BenchmarkLeafSize0(b *testing.B)  { LeafSizeHelper(b, 10, 0) } // test without splitting
-func BenchmarkLeafSize1(b *testing.B)  { LeafSizeHelper(b, 10, 1) }
-func BenchmarkLeafSize2(b *testing.B)  { LeafSizeHelper(b, 10, 2) }
-func BenchmarkLeafSize3(b *testing.B)  { LeafSizeHelper(b, 10, 3) }
-func BenchmarkLeafSize4(b *testing.B)  { LeafSizeHelper(b, 10, 4) }
-func BenchmarkLeafSize5(b *testing.B)  { LeafSizeHelper(b, 10, 5) }
-func BenchmarkLeafSize6(b *testing.B)  { LeafSizeHelper(b, 10, 6) }
-func BenchmarkLeafSize7(b *testing.B)  { LeafSizeHelper(b, 10, 7) }
-func BenchmarkLeafSize8(b *testing.B)  { LeafSizeHelper(b, 10, 8) }
-func BenchmarkLeafSize9(b *testing.B)  { LeafSizeHelper(b, 10, 9) }
-func BenchmarkLeafSize10(b *testing.B) { LeafSizeHelper(b, 10, 10) }
-func BenchmarkLeafSize11(b *testing.B) { LeafSizeHelper(b, 10, 11) }
-func BenchmarkLeafSize12(b *testing.B) { LeafSizeHelper(b, 10, 12) }
-func BenchmarkLeafSize13(b *testing.B) { LeafSizeHelper(b, 10, 13) }
-func BenchmarkLeafSize14(b *testing.B) { LeafSizeHelper(b, 10, 14) }
-func BenchmarkLeafSize15(b *testing.B) { LeafSizeHelper(b, 10, 15) }
-func BenchmarkLeafSize16(b *testing.B) { LeafSizeHelper(b, 10, 16) }
-func BenchmarkLeafSize32(b *testing.B) { LeafSizeHelper(b, 10, 32) } // try some large lengths
-func BenchmarkLeafSize64(b *testing.B) { LeafSizeHelper(b, 10, 64) }
-
-func LeafSizeHelper(b *testing.B, base Word, size int) {
-	b.StopTimer()
-	originalLeafSize := leafSize
-	resetTable(cacheBase10.table[:])
-	leafSize = size
-	b.StartTimer()
-
-	for d := 1; d <= 10000; d *= 10 {
-		b.StopTimer()
-		var z nat
-		z = z.expWW(base, Word(d))           // build target number
-		_ = z.string(lowercaseDigits[:base]) // warm divisor cache
-		b.StartTimer()
-
-		for i := 0; i < b.N; i++ {
-			_ = z.string(lowercaseDigits[:base])
-		}
-	}
-
-	b.StopTimer()
-	resetTable(cacheBase10.table[:])
-	leafSize = originalLeafSize
-	b.StartTimer()
-}
-
-func resetTable(table []divisor) {
-	if table != nil && table[0].bbb != nil {
-		for i := 0; i < len(table); i++ {
-			table[i].bbb = nil
-			table[i].nbits = 0
-			table[i].ndigits = 0
-		}
-	}
-}
-
-func TestStringPowers(t *testing.T) {
-	var b, p Word
-	for b = 2; b <= 16; b++ {
-		for p = 0; p <= 512; p++ {
-			x := nat(nil).expWW(b, p)
-			xs := x.string(lowercaseDigits[:b])
-			xs2 := toString(x, lowercaseDigits[:b])
-			if xs != xs2 {
-				t.Errorf("failed at %d ** %d in base %d: %s != %s", b, p, b, xs, xs2)
-			}
-		}
-		if b >= 3 && testing.Short() {
-			break
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/rat.go b/third_party/gofrontend/libgo/go/math/big/rat.go
deleted file mode 100644
index fb16f18..0000000
--- a/third_party/gofrontend/libgo/go/math/big/rat.go
+++ /dev/null
@@ -1,570 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements multi-precision rational numbers.
-
-package big
-
-import (
-	"encoding/binary"
-	"errors"
-	"fmt"
-	"math"
-)
-
-// A Rat represents a quotient a/b of arbitrary precision.
-// The zero value for a Rat represents the value 0.
-type Rat struct {
-	// To make zero values for Rat work w/o initialization,
-	// a zero value of b (len(b) == 0) acts like b == 1.
-	// a.neg determines the sign of the Rat, b.neg is ignored.
-	a, b Int
-}
-
-// NewRat creates a new Rat with numerator a and denominator b.
-func NewRat(a, b int64) *Rat {
-	return new(Rat).SetFrac64(a, b)
-}
-
-// SetFloat64 sets z to exactly f and returns z.
-// If f is not finite, SetFloat returns nil.
-func (z *Rat) SetFloat64(f float64) *Rat {
-	const expMask = 1<<11 - 1
-	bits := math.Float64bits(f)
-	mantissa := bits & (1<<52 - 1)
-	exp := int((bits >> 52) & expMask)
-	switch exp {
-	case expMask: // non-finite
-		return nil
-	case 0: // denormal
-		exp -= 1022
-	default: // normal
-		mantissa |= 1 << 52
-		exp -= 1023
-	}
-
-	shift := 52 - exp
-
-	// Optimization (?): partially pre-normalise.
-	for mantissa&1 == 0 && shift > 0 {
-		mantissa >>= 1
-		shift--
-	}
-
-	z.a.SetUint64(mantissa)
-	z.a.neg = f < 0
-	z.b.Set(intOne)
-	if shift > 0 {
-		z.b.Lsh(&z.b, uint(shift))
-	} else {
-		z.a.Lsh(&z.a, uint(-shift))
-	}
-	return z.norm()
-}
-
-// quotToFloat32 returns the non-negative float32 value
-// nearest to the quotient a/b, using round-to-even in
-// halfway cases.  It does not mutate its arguments.
-// Preconditions: b is non-zero; a and b have no common factors.
-func quotToFloat32(a, b nat) (f float32, exact bool) {
-	const (
-		// float size in bits
-		Fsize = 32
-
-		// mantissa
-		Msize  = 23
-		Msize1 = Msize + 1 // incl. implicit 1
-		Msize2 = Msize1 + 1
-
-		// exponent
-		Esize = Fsize - Msize1
-		Ebias = 1<<(Esize-1) - 1
-		Emin  = 1 - Ebias
-		Emax  = Ebias
-	)
-
-	// TODO(adonovan): specialize common degenerate cases: 1.0, integers.
-	alen := a.bitLen()
-	if alen == 0 {
-		return 0, true
-	}
-	blen := b.bitLen()
-	if blen == 0 {
-		panic("division by zero")
-	}
-
-	// 1. Left-shift A or B such that quotient A/B is in [1<<Msize1, 1<<(Msize2+1)
-	// (Msize2 bits if A < B when they are left-aligned, Msize2+1 bits if A >= B).
-	// This is 2 or 3 more than the float32 mantissa field width of Msize:
-	// - the optional extra bit is shifted away in step 3 below.
-	// - the high-order 1 is omitted in "normal" representation;
-	// - the low-order 1 will be used during rounding then discarded.
-	exp := alen - blen
-	var a2, b2 nat
-	a2 = a2.set(a)
-	b2 = b2.set(b)
-	if shift := Msize2 - exp; shift > 0 {
-		a2 = a2.shl(a2, uint(shift))
-	} else if shift < 0 {
-		b2 = b2.shl(b2, uint(-shift))
-	}
-
-	// 2. Compute quotient and remainder (q, r).  NB: due to the
-	// extra shift, the low-order bit of q is logically the
-	// high-order bit of r.
-	var q nat
-	q, r := q.div(a2, a2, b2) // (recycle a2)
-	mantissa := low32(q)
-	haveRem := len(r) > 0 // mantissa&1 && !haveRem => remainder is exactly half
-
-	// 3. If quotient didn't fit in Msize2 bits, redo division by b2<<1
-	// (in effect---we accomplish this incrementally).
-	if mantissa>>Msize2 == 1 {
-		if mantissa&1 == 1 {
-			haveRem = true
-		}
-		mantissa >>= 1
-		exp++
-	}
-	if mantissa>>Msize1 != 1 {
-		panic(fmt.Sprintf("expected exactly %d bits of result", Msize2))
-	}
-
-	// 4. Rounding.
-	if Emin-Msize <= exp && exp <= Emin {
-		// Denormal case; lose 'shift' bits of precision.
-		shift := uint(Emin - (exp - 1)) // [1..Esize1)
-		lostbits := mantissa & (1<<shift - 1)
-		haveRem = haveRem || lostbits != 0
-		mantissa >>= shift
-		exp = 2 - Ebias // == exp + shift
-	}
-	// Round q using round-half-to-even.
-	exact = !haveRem
-	if mantissa&1 != 0 {
-		exact = false
-		if haveRem || mantissa&2 != 0 {
-			if mantissa++; mantissa >= 1<<Msize2 {
-				// Complete rollover 11...1 => 100...0, so shift is safe
-				mantissa >>= 1
-				exp++
-			}
-		}
-	}
-	mantissa >>= 1 // discard rounding bit.  Mantissa now scaled by 1<<Msize1.
-
-	f = float32(math.Ldexp(float64(mantissa), exp-Msize1))
-	if math.IsInf(float64(f), 0) {
-		exact = false
-	}
-	return
-}
-
-// quotToFloat64 returns the non-negative float64 value
-// nearest to the quotient a/b, using round-to-even in
-// halfway cases.  It does not mutate its arguments.
-// Preconditions: b is non-zero; a and b have no common factors.
-func quotToFloat64(a, b nat) (f float64, exact bool) {
-	const (
-		// float size in bits
-		Fsize = 64
-
-		// mantissa
-		Msize  = 52
-		Msize1 = Msize + 1 // incl. implicit 1
-		Msize2 = Msize1 + 1
-
-		// exponent
-		Esize = Fsize - Msize1
-		Ebias = 1<<(Esize-1) - 1
-		Emin  = 1 - Ebias
-		Emax  = Ebias
-	)
-
-	// TODO(adonovan): specialize common degenerate cases: 1.0, integers.
-	alen := a.bitLen()
-	if alen == 0 {
-		return 0, true
-	}
-	blen := b.bitLen()
-	if blen == 0 {
-		panic("division by zero")
-	}
-
-	// 1. Left-shift A or B such that quotient A/B is in [1<<Msize1, 1<<(Msize2+1)
-	// (Msize2 bits if A < B when they are left-aligned, Msize2+1 bits if A >= B).
-	// This is 2 or 3 more than the float64 mantissa field width of Msize:
-	// - the optional extra bit is shifted away in step 3 below.
-	// - the high-order 1 is omitted in "normal" representation;
-	// - the low-order 1 will be used during rounding then discarded.
-	exp := alen - blen
-	var a2, b2 nat
-	a2 = a2.set(a)
-	b2 = b2.set(b)
-	if shift := Msize2 - exp; shift > 0 {
-		a2 = a2.shl(a2, uint(shift))
-	} else if shift < 0 {
-		b2 = b2.shl(b2, uint(-shift))
-	}
-
-	// 2. Compute quotient and remainder (q, r).  NB: due to the
-	// extra shift, the low-order bit of q is logically the
-	// high-order bit of r.
-	var q nat
-	q, r := q.div(a2, a2, b2) // (recycle a2)
-	mantissa := low64(q)
-	haveRem := len(r) > 0 // mantissa&1 && !haveRem => remainder is exactly half
-
-	// 3. If quotient didn't fit in Msize2 bits, redo division by b2<<1
-	// (in effect---we accomplish this incrementally).
-	if mantissa>>Msize2 == 1 {
-		if mantissa&1 == 1 {
-			haveRem = true
-		}
-		mantissa >>= 1
-		exp++
-	}
-	if mantissa>>Msize1 != 1 {
-		panic(fmt.Sprintf("expected exactly %d bits of result", Msize2))
-	}
-
-	// 4. Rounding.
-	if Emin-Msize <= exp && exp <= Emin {
-		// Denormal case; lose 'shift' bits of precision.
-		shift := uint(Emin - (exp - 1)) // [1..Esize1)
-		lostbits := mantissa & (1<<shift - 1)
-		haveRem = haveRem || lostbits != 0
-		mantissa >>= shift
-		exp = 2 - Ebias // == exp + shift
-	}
-	// Round q using round-half-to-even.
-	exact = !haveRem
-	if mantissa&1 != 0 {
-		exact = false
-		if haveRem || mantissa&2 != 0 {
-			if mantissa++; mantissa >= 1<<Msize2 {
-				// Complete rollover 11...1 => 100...0, so shift is safe
-				mantissa >>= 1
-				exp++
-			}
-		}
-	}
-	mantissa >>= 1 // discard rounding bit.  Mantissa now scaled by 1<<Msize1.
-
-	f = math.Ldexp(float64(mantissa), exp-Msize1)
-	if math.IsInf(f, 0) {
-		exact = false
-	}
-	return
-}
-
-// Float32 returns the nearest float32 value for x and a bool indicating
-// whether f represents x exactly. If the magnitude of x is too large to
-// be represented by a float32, f is an infinity and exact is false.
-// The sign of f always matches the sign of x, even if f == 0.
-func (x *Rat) Float32() (f float32, exact bool) {
-	b := x.b.abs
-	if len(b) == 0 {
-		b = b.set(natOne) // materialize denominator
-	}
-	f, exact = quotToFloat32(x.a.abs, b)
-	if x.a.neg {
-		f = -f
-	}
-	return
-}
-
-// Float64 returns the nearest float64 value for x and a bool indicating
-// whether f represents x exactly. If the magnitude of x is too large to
-// be represented by a float64, f is an infinity and exact is false.
-// The sign of f always matches the sign of x, even if f == 0.
-func (x *Rat) Float64() (f float64, exact bool) {
-	b := x.b.abs
-	if len(b) == 0 {
-		b = b.set(natOne) // materialize denominator
-	}
-	f, exact = quotToFloat64(x.a.abs, b)
-	if x.a.neg {
-		f = -f
-	}
-	return
-}
-
-// SetFrac sets z to a/b and returns z.
-func (z *Rat) SetFrac(a, b *Int) *Rat {
-	z.a.neg = a.neg != b.neg
-	babs := b.abs
-	if len(babs) == 0 {
-		panic("division by zero")
-	}
-	if &z.a == b || alias(z.a.abs, babs) {
-		babs = nat(nil).set(babs) // make a copy
-	}
-	z.a.abs = z.a.abs.set(a.abs)
-	z.b.abs = z.b.abs.set(babs)
-	return z.norm()
-}
-
-// SetFrac64 sets z to a/b and returns z.
-func (z *Rat) SetFrac64(a, b int64) *Rat {
-	z.a.SetInt64(a)
-	if b == 0 {
-		panic("division by zero")
-	}
-	if b < 0 {
-		b = -b
-		z.a.neg = !z.a.neg
-	}
-	z.b.abs = z.b.abs.setUint64(uint64(b))
-	return z.norm()
-}
-
-// SetInt sets z to x (by making a copy of x) and returns z.
-func (z *Rat) SetInt(x *Int) *Rat {
-	z.a.Set(x)
-	z.b.abs = z.b.abs[:0]
-	return z
-}
-
-// SetInt64 sets z to x and returns z.
-func (z *Rat) SetInt64(x int64) *Rat {
-	z.a.SetInt64(x)
-	z.b.abs = z.b.abs[:0]
-	return z
-}
-
-// Set sets z to x (by making a copy of x) and returns z.
-func (z *Rat) Set(x *Rat) *Rat {
-	if z != x {
-		z.a.Set(&x.a)
-		z.b.Set(&x.b)
-	}
-	return z
-}
-
-// Abs sets z to |x| (the absolute value of x) and returns z.
-func (z *Rat) Abs(x *Rat) *Rat {
-	z.Set(x)
-	z.a.neg = false
-	return z
-}
-
-// Neg sets z to -x and returns z.
-func (z *Rat) Neg(x *Rat) *Rat {
-	z.Set(x)
-	z.a.neg = len(z.a.abs) > 0 && !z.a.neg // 0 has no sign
-	return z
-}
-
-// Inv sets z to 1/x and returns z.
-func (z *Rat) Inv(x *Rat) *Rat {
-	if len(x.a.abs) == 0 {
-		panic("division by zero")
-	}
-	z.Set(x)
-	a := z.b.abs
-	if len(a) == 0 {
-		a = a.set(natOne) // materialize numerator
-	}
-	b := z.a.abs
-	if b.cmp(natOne) == 0 {
-		b = b[:0] // normalize denominator
-	}
-	z.a.abs, z.b.abs = a, b // sign doesn't change
-	return z
-}
-
-// Sign returns:
-//
-//	-1 if x <  0
-//	 0 if x == 0
-//	+1 if x >  0
-//
-func (x *Rat) Sign() int {
-	return x.a.Sign()
-}
-
-// IsInt reports whether the denominator of x is 1.
-func (x *Rat) IsInt() bool {
-	return len(x.b.abs) == 0 || x.b.abs.cmp(natOne) == 0
-}
-
-// Num returns the numerator of x; it may be <= 0.
-// The result is a reference to x's numerator; it
-// may change if a new value is assigned to x, and vice versa.
-// The sign of the numerator corresponds to the sign of x.
-func (x *Rat) Num() *Int {
-	return &x.a
-}
-
-// Denom returns the denominator of x; it is always > 0.
-// The result is a reference to x's denominator; it
-// may change if a new value is assigned to x, and vice versa.
-func (x *Rat) Denom() *Int {
-	x.b.neg = false // the result is always >= 0
-	if len(x.b.abs) == 0 {
-		x.b.abs = x.b.abs.set(natOne) // materialize denominator
-	}
-	return &x.b
-}
-
-func (z *Rat) norm() *Rat {
-	switch {
-	case len(z.a.abs) == 0:
-		// z == 0 - normalize sign and denominator
-		z.a.neg = false
-		z.b.abs = z.b.abs[:0]
-	case len(z.b.abs) == 0:
-		// z is normalized int - nothing to do
-	case z.b.abs.cmp(natOne) == 0:
-		// z is int - normalize denominator
-		z.b.abs = z.b.abs[:0]
-	default:
-		neg := z.a.neg
-		z.a.neg = false
-		z.b.neg = false
-		if f := NewInt(0).binaryGCD(&z.a, &z.b); f.Cmp(intOne) != 0 {
-			z.a.abs, _ = z.a.abs.div(nil, z.a.abs, f.abs)
-			z.b.abs, _ = z.b.abs.div(nil, z.b.abs, f.abs)
-			if z.b.abs.cmp(natOne) == 0 {
-				// z is int - normalize denominator
-				z.b.abs = z.b.abs[:0]
-			}
-		}
-		z.a.neg = neg
-	}
-	return z
-}
-
-// mulDenom sets z to the denominator product x*y (by taking into
-// account that 0 values for x or y must be interpreted as 1) and
-// returns z.
-func mulDenom(z, x, y nat) nat {
-	switch {
-	case len(x) == 0:
-		return z.set(y)
-	case len(y) == 0:
-		return z.set(x)
-	}
-	return z.mul(x, y)
-}
-
-// scaleDenom computes x*f.
-// If f == 0 (zero value of denominator), the result is (a copy of) x.
-func scaleDenom(x *Int, f nat) *Int {
-	var z Int
-	if len(f) == 0 {
-		return z.Set(x)
-	}
-	z.abs = z.abs.mul(x.abs, f)
-	z.neg = x.neg
-	return &z
-}
-
-// Cmp compares x and y and returns:
-//
-//   -1 if x <  y
-//    0 if x == y
-//   +1 if x >  y
-//
-func (x *Rat) Cmp(y *Rat) int {
-	return scaleDenom(&x.a, y.b.abs).Cmp(scaleDenom(&y.a, x.b.abs))
-}
-
-// Add sets z to the sum x+y and returns z.
-func (z *Rat) Add(x, y *Rat) *Rat {
-	a1 := scaleDenom(&x.a, y.b.abs)
-	a2 := scaleDenom(&y.a, x.b.abs)
-	z.a.Add(a1, a2)
-	z.b.abs = mulDenom(z.b.abs, x.b.abs, y.b.abs)
-	return z.norm()
-}
-
-// Sub sets z to the difference x-y and returns z.
-func (z *Rat) Sub(x, y *Rat) *Rat {
-	a1 := scaleDenom(&x.a, y.b.abs)
-	a2 := scaleDenom(&y.a, x.b.abs)
-	z.a.Sub(a1, a2)
-	z.b.abs = mulDenom(z.b.abs, x.b.abs, y.b.abs)
-	return z.norm()
-}
-
-// Mul sets z to the product x*y and returns z.
-func (z *Rat) Mul(x, y *Rat) *Rat {
-	z.a.Mul(&x.a, &y.a)
-	z.b.abs = mulDenom(z.b.abs, x.b.abs, y.b.abs)
-	return z.norm()
-}
-
-// Quo sets z to the quotient x/y and returns z.
-// If y == 0, a division-by-zero run-time panic occurs.
-func (z *Rat) Quo(x, y *Rat) *Rat {
-	if len(y.a.abs) == 0 {
-		panic("division by zero")
-	}
-	a := scaleDenom(&x.a, y.b.abs)
-	b := scaleDenom(&y.a, x.b.abs)
-	z.a.abs = a.abs
-	z.b.abs = b.abs
-	z.a.neg = a.neg != b.neg
-	return z.norm()
-}
-
-// Gob codec version. Permits backward-compatible changes to the encoding.
-const ratGobVersion byte = 1
-
-// GobEncode implements the gob.GobEncoder interface.
-func (x *Rat) GobEncode() ([]byte, error) {
-	if x == nil {
-		return nil, nil
-	}
-	buf := make([]byte, 1+4+(len(x.a.abs)+len(x.b.abs))*_S) // extra bytes for version and sign bit (1), and numerator length (4)
-	i := x.b.abs.bytes(buf)
-	j := x.a.abs.bytes(buf[:i])
-	n := i - j
-	if int(uint32(n)) != n {
-		// this should never happen
-		return nil, errors.New("Rat.GobEncode: numerator too large")
-	}
-	binary.BigEndian.PutUint32(buf[j-4:j], uint32(n))
-	j -= 1 + 4
-	b := ratGobVersion << 1 // make space for sign bit
-	if x.a.neg {
-		b |= 1
-	}
-	buf[j] = b
-	return buf[j:], nil
-}
-
-// GobDecode implements the gob.GobDecoder interface.
-func (z *Rat) GobDecode(buf []byte) error {
-	if len(buf) == 0 {
-		// Other side sent a nil or default value.
-		*z = Rat{}
-		return nil
-	}
-	b := buf[0]
-	if b>>1 != ratGobVersion {
-		return fmt.Errorf("Rat.GobDecode: encoding version %d not supported", b>>1)
-	}
-	const j = 1 + 4
-	i := j + binary.BigEndian.Uint32(buf[j-4:j])
-	z.a.neg = b&1 != 0
-	z.a.abs = z.a.abs.setBytes(buf[j:i])
-	z.b.abs = z.b.abs.setBytes(buf[i:])
-	return nil
-}
-
-// MarshalText implements the encoding.TextMarshaler interface.
-func (r *Rat) MarshalText() (text []byte, err error) {
-	return []byte(r.RatString()), nil
-}
-
-// UnmarshalText implements the encoding.TextUnmarshaler interface.
-func (r *Rat) UnmarshalText(text []byte) error {
-	if _, ok := r.SetString(string(text)); !ok {
-		return fmt.Errorf("math/big: cannot unmarshal %q into a *big.Rat", text)
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/rat_test.go b/third_party/gofrontend/libgo/go/math/big/rat_test.go
deleted file mode 100644
index 012d0c4..0000000
--- a/third_party/gofrontend/libgo/go/math/big/rat_test.go
+++ /dev/null
@@ -1,736 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package big
-
-import (
-	"bytes"
-	"encoding/gob"
-	"encoding/json"
-	"encoding/xml"
-	"math"
-	"testing"
-)
-
-func TestZeroRat(t *testing.T) {
-	var x, y, z Rat
-	y.SetFrac64(0, 42)
-
-	if x.Cmp(&y) != 0 {
-		t.Errorf("x and y should be both equal and zero")
-	}
-
-	if s := x.String(); s != "0/1" {
-		t.Errorf("got x = %s, want 0/1", s)
-	}
-
-	if s := x.RatString(); s != "0" {
-		t.Errorf("got x = %s, want 0", s)
-	}
-
-	z.Add(&x, &y)
-	if s := z.RatString(); s != "0" {
-		t.Errorf("got x+y = %s, want 0", s)
-	}
-
-	z.Sub(&x, &y)
-	if s := z.RatString(); s != "0" {
-		t.Errorf("got x-y = %s, want 0", s)
-	}
-
-	z.Mul(&x, &y)
-	if s := z.RatString(); s != "0" {
-		t.Errorf("got x*y = %s, want 0", s)
-	}
-
-	// check for division by zero
-	defer func() {
-		if s := recover(); s == nil || s.(string) != "division by zero" {
-			panic(s)
-		}
-	}()
-	z.Quo(&x, &y)
-}
-
-func TestRatSign(t *testing.T) {
-	zero := NewRat(0, 1)
-	for _, a := range setStringTests {
-		x, ok := new(Rat).SetString(a.in)
-		if !ok {
-			continue
-		}
-		s := x.Sign()
-		e := x.Cmp(zero)
-		if s != e {
-			t.Errorf("got %d; want %d for z = %v", s, e, &x)
-		}
-	}
-}
-
-var ratCmpTests = []struct {
-	rat1, rat2 string
-	out        int
-}{
-	{"0", "0/1", 0},
-	{"1/1", "1", 0},
-	{"-1", "-2/2", 0},
-	{"1", "0", 1},
-	{"0/1", "1/1", -1},
-	{"-5/1434770811533343057144", "-5/1434770811533343057145", -1},
-	{"49832350382626108453/8964749413", "49832350382626108454/8964749413", -1},
-	{"-37414950961700930/7204075375675961", "37414950961700930/7204075375675961", -1},
-	{"37414950961700930/7204075375675961", "74829901923401860/14408150751351922", 0},
-}
-
-func TestRatCmp(t *testing.T) {
-	for i, test := range ratCmpTests {
-		x, _ := new(Rat).SetString(test.rat1)
-		y, _ := new(Rat).SetString(test.rat2)
-
-		out := x.Cmp(y)
-		if out != test.out {
-			t.Errorf("#%d got out = %v; want %v", i, out, test.out)
-		}
-	}
-}
-
-func TestIsInt(t *testing.T) {
-	one := NewInt(1)
-	for _, a := range setStringTests {
-		x, ok := new(Rat).SetString(a.in)
-		if !ok {
-			continue
-		}
-		i := x.IsInt()
-		e := x.Denom().Cmp(one) == 0
-		if i != e {
-			t.Errorf("got IsInt(%v) == %v; want %v", x, i, e)
-		}
-	}
-}
-
-func TestRatAbs(t *testing.T) {
-	zero := new(Rat)
-	for _, a := range setStringTests {
-		x, ok := new(Rat).SetString(a.in)
-		if !ok {
-			continue
-		}
-		e := new(Rat).Set(x)
-		if e.Cmp(zero) < 0 {
-			e.Sub(zero, e)
-		}
-		z := new(Rat).Abs(x)
-		if z.Cmp(e) != 0 {
-			t.Errorf("got Abs(%v) = %v; want %v", x, z, e)
-		}
-	}
-}
-
-func TestRatNeg(t *testing.T) {
-	zero := new(Rat)
-	for _, a := range setStringTests {
-		x, ok := new(Rat).SetString(a.in)
-		if !ok {
-			continue
-		}
-		e := new(Rat).Sub(zero, x)
-		z := new(Rat).Neg(x)
-		if z.Cmp(e) != 0 {
-			t.Errorf("got Neg(%v) = %v; want %v", x, z, e)
-		}
-	}
-}
-
-func TestRatInv(t *testing.T) {
-	zero := new(Rat)
-	for _, a := range setStringTests {
-		x, ok := new(Rat).SetString(a.in)
-		if !ok {
-			continue
-		}
-		if x.Cmp(zero) == 0 {
-			continue // avoid division by zero
-		}
-		e := new(Rat).SetFrac(x.Denom(), x.Num())
-		z := new(Rat).Inv(x)
-		if z.Cmp(e) != 0 {
-			t.Errorf("got Inv(%v) = %v; want %v", x, z, e)
-		}
-	}
-}
-
-type ratBinFun func(z, x, y *Rat) *Rat
-type ratBinArg struct {
-	x, y, z string
-}
-
-func testRatBin(t *testing.T, i int, name string, f ratBinFun, a ratBinArg) {
-	x, _ := new(Rat).SetString(a.x)
-	y, _ := new(Rat).SetString(a.y)
-	z, _ := new(Rat).SetString(a.z)
-	out := f(new(Rat), x, y)
-
-	if out.Cmp(z) != 0 {
-		t.Errorf("%s #%d got %s want %s", name, i, out, z)
-	}
-}
-
-var ratBinTests = []struct {
-	x, y      string
-	sum, prod string
-}{
-	{"0", "0", "0", "0"},
-	{"0", "1", "1", "0"},
-	{"-1", "0", "-1", "0"},
-	{"-1", "1", "0", "-1"},
-	{"1", "1", "2", "1"},
-	{"1/2", "1/2", "1", "1/4"},
-	{"1/4", "1/3", "7/12", "1/12"},
-	{"2/5", "-14/3", "-64/15", "-28/15"},
-	{"4707/49292519774798173060", "-3367/70976135186689855734", "84058377121001851123459/1749296273614329067191168098769082663020", "-1760941/388732505247628681598037355282018369560"},
-	{"-61204110018146728334/3", "-31052192278051565633/2", "-215564796870448153567/6", "950260896245257153059642991192710872711/3"},
-	{"-854857841473707320655/4237645934602118692642972629634714039", "-18/31750379913563777419", "-27/133467566250814981", "15387441146526731771790/134546868362786310073779084329032722548987800600710485341"},
-	{"618575745270541348005638912139/19198433543745179392300736", "-19948846211000086/637313996471", "27674141753240653/30123979153216", "-6169936206128396568797607742807090270137721977/6117715203873571641674006593837351328"},
-	{"-3/26206484091896184128", "5/2848423294177090248", "15310893822118706237/9330894968229805033368778458685147968", "-5/24882386581946146755650075889827061248"},
-	{"26946729/330400702820", "41563965/225583428284", "1238218672302860271/4658307703098666660055", "224002580204097/14906584649915733312176"},
-	{"-8259900599013409474/7", "-84829337473700364773/56707961321161574960", "-468402123685491748914621885145127724451/396955729248131024720", "350340947706464153265156004876107029701/198477864624065512360"},
-	{"575775209696864/1320203974639986246357", "29/712593081308", "410331716733912717985762465/940768218243776489278275419794956", "808/45524274987585732633"},
-	{"1786597389946320496771/2066653520653241", "6269770/1992362624741777", "3559549865190272133656109052308126637/4117523232840525481453983149257", "8967230/3296219033"},
-	{"-36459180403360509753/32150500941194292113930", "9381566963714/9633539", "301622077145533298008420642898530153/309723104686531919656937098270", "-3784609207827/3426986245"},
-}
-
-func TestRatBin(t *testing.T) {
-	for i, test := range ratBinTests {
-		arg := ratBinArg{test.x, test.y, test.sum}
-		testRatBin(t, i, "Add", (*Rat).Add, arg)
-
-		arg = ratBinArg{test.y, test.x, test.sum}
-		testRatBin(t, i, "Add symmetric", (*Rat).Add, arg)
-
-		arg = ratBinArg{test.sum, test.x, test.y}
-		testRatBin(t, i, "Sub", (*Rat).Sub, arg)
-
-		arg = ratBinArg{test.sum, test.y, test.x}
-		testRatBin(t, i, "Sub symmetric", (*Rat).Sub, arg)
-
-		arg = ratBinArg{test.x, test.y, test.prod}
-		testRatBin(t, i, "Mul", (*Rat).Mul, arg)
-
-		arg = ratBinArg{test.y, test.x, test.prod}
-		testRatBin(t, i, "Mul symmetric", (*Rat).Mul, arg)
-
-		if test.x != "0" {
-			arg = ratBinArg{test.prod, test.x, test.y}
-			testRatBin(t, i, "Quo", (*Rat).Quo, arg)
-		}
-
-		if test.y != "0" {
-			arg = ratBinArg{test.prod, test.y, test.x}
-			testRatBin(t, i, "Quo symmetric", (*Rat).Quo, arg)
-		}
-	}
-}
-
-func TestIssue820(t *testing.T) {
-	x := NewRat(3, 1)
-	y := NewRat(2, 1)
-	z := y.Quo(x, y)
-	q := NewRat(3, 2)
-	if z.Cmp(q) != 0 {
-		t.Errorf("got %s want %s", z, q)
-	}
-
-	y = NewRat(3, 1)
-	x = NewRat(2, 1)
-	z = y.Quo(x, y)
-	q = NewRat(2, 3)
-	if z.Cmp(q) != 0 {
-		t.Errorf("got %s want %s", z, q)
-	}
-
-	x = NewRat(3, 1)
-	z = x.Quo(x, x)
-	q = NewRat(3, 3)
-	if z.Cmp(q) != 0 {
-		t.Errorf("got %s want %s", z, q)
-	}
-}
-
-var setFrac64Tests = []struct {
-	a, b int64
-	out  string
-}{
-	{0, 1, "0"},
-	{0, -1, "0"},
-	{1, 1, "1"},
-	{-1, 1, "-1"},
-	{1, -1, "-1"},
-	{-1, -1, "1"},
-	{-9223372036854775808, -9223372036854775808, "1"},
-}
-
-func TestRatSetFrac64Rat(t *testing.T) {
-	for i, test := range setFrac64Tests {
-		x := new(Rat).SetFrac64(test.a, test.b)
-		if x.RatString() != test.out {
-			t.Errorf("#%d got %s want %s", i, x.RatString(), test.out)
-		}
-	}
-}
-
-func TestRatGobEncoding(t *testing.T) {
-	var medium bytes.Buffer
-	enc := gob.NewEncoder(&medium)
-	dec := gob.NewDecoder(&medium)
-	for _, test := range encodingTests {
-		medium.Reset() // empty buffer for each test case (in case of failures)
-		var tx Rat
-		tx.SetString(test + ".14159265")
-		if err := enc.Encode(&tx); err != nil {
-			t.Errorf("encoding of %s failed: %s", &tx, err)
-		}
-		var rx Rat
-		if err := dec.Decode(&rx); err != nil {
-			t.Errorf("decoding of %s failed: %s", &tx, err)
-		}
-		if rx.Cmp(&tx) != 0 {
-			t.Errorf("transmission of %s failed: got %s want %s", &tx, &rx, &tx)
-		}
-	}
-}
-
-// Sending a nil Rat pointer (inside a slice) on a round trip through gob should yield a zero.
-// TODO: top-level nils.
-func TestGobEncodingNilRatInSlice(t *testing.T) {
-	buf := new(bytes.Buffer)
-	enc := gob.NewEncoder(buf)
-	dec := gob.NewDecoder(buf)
-
-	var in = make([]*Rat, 1)
-	err := enc.Encode(&in)
-	if err != nil {
-		t.Errorf("gob encode failed: %q", err)
-	}
-	var out []*Rat
-	err = dec.Decode(&out)
-	if err != nil {
-		t.Fatalf("gob decode failed: %q", err)
-	}
-	if len(out) != 1 {
-		t.Fatalf("wrong len; want 1 got %d", len(out))
-	}
-	var zero Rat
-	if out[0].Cmp(&zero) != 0 {
-		t.Errorf("transmission of (*Int)(nill) failed: got %s want 0", out)
-	}
-}
-
-var ratNums = []string{
-	"-141592653589793238462643383279502884197169399375105820974944592307816406286",
-	"-1415926535897932384626433832795028841971",
-	"-141592653589793",
-	"-1",
-	"0",
-	"1",
-	"141592653589793",
-	"1415926535897932384626433832795028841971",
-	"141592653589793238462643383279502884197169399375105820974944592307816406286",
-}
-
-var ratDenoms = []string{
-	"1",
-	"718281828459045",
-	"7182818284590452353602874713526624977572",
-	"718281828459045235360287471352662497757247093699959574966967627724076630353",
-}
-
-func TestRatJSONEncoding(t *testing.T) {
-	for _, num := range ratNums {
-		for _, denom := range ratDenoms {
-			var tx Rat
-			tx.SetString(num + "/" + denom)
-			b, err := json.Marshal(&tx)
-			if err != nil {
-				t.Errorf("marshaling of %s failed: %s", &tx, err)
-				continue
-			}
-			var rx Rat
-			if err := json.Unmarshal(b, &rx); err != nil {
-				t.Errorf("unmarshaling of %s failed: %s", &tx, err)
-				continue
-			}
-			if rx.Cmp(&tx) != 0 {
-				t.Errorf("JSON encoding of %s failed: got %s want %s", &tx, &rx, &tx)
-			}
-		}
-	}
-}
-
-func TestRatXMLEncoding(t *testing.T) {
-	for _, num := range ratNums {
-		for _, denom := range ratDenoms {
-			var tx Rat
-			tx.SetString(num + "/" + denom)
-			b, err := xml.Marshal(&tx)
-			if err != nil {
-				t.Errorf("marshaling of %s failed: %s", &tx, err)
-				continue
-			}
-			var rx Rat
-			if err := xml.Unmarshal(b, &rx); err != nil {
-				t.Errorf("unmarshaling of %s failed: %s", &tx, err)
-				continue
-			}
-			if rx.Cmp(&tx) != 0 {
-				t.Errorf("XML encoding of %s failed: got %s want %s", &tx, &rx, &tx)
-			}
-		}
-	}
-}
-
-func TestIssue2379(t *testing.T) {
-	// 1) no aliasing
-	q := NewRat(3, 2)
-	x := new(Rat)
-	x.SetFrac(NewInt(3), NewInt(2))
-	if x.Cmp(q) != 0 {
-		t.Errorf("1) got %s want %s", x, q)
-	}
-
-	// 2) aliasing of numerator
-	x = NewRat(2, 3)
-	x.SetFrac(NewInt(3), x.Num())
-	if x.Cmp(q) != 0 {
-		t.Errorf("2) got %s want %s", x, q)
-	}
-
-	// 3) aliasing of denominator
-	x = NewRat(2, 3)
-	x.SetFrac(x.Denom(), NewInt(2))
-	if x.Cmp(q) != 0 {
-		t.Errorf("3) got %s want %s", x, q)
-	}
-
-	// 4) aliasing of numerator and denominator
-	x = NewRat(2, 3)
-	x.SetFrac(x.Denom(), x.Num())
-	if x.Cmp(q) != 0 {
-		t.Errorf("4) got %s want %s", x, q)
-	}
-
-	// 5) numerator and denominator are the same
-	q = NewRat(1, 1)
-	x = new(Rat)
-	n := NewInt(7)
-	x.SetFrac(n, n)
-	if x.Cmp(q) != 0 {
-		t.Errorf("5) got %s want %s", x, q)
-	}
-}
-
-func TestIssue3521(t *testing.T) {
-	a := new(Int)
-	b := new(Int)
-	a.SetString("64375784358435883458348587", 0)
-	b.SetString("4789759874531", 0)
-
-	// 0) a raw zero value has 1 as denominator
-	zero := new(Rat)
-	one := NewInt(1)
-	if zero.Denom().Cmp(one) != 0 {
-		t.Errorf("0) got %s want %s", zero.Denom(), one)
-	}
-
-	// 1a) a zero value remains zero independent of denominator
-	x := new(Rat)
-	x.Denom().Set(new(Int).Neg(b))
-	if x.Cmp(zero) != 0 {
-		t.Errorf("1a) got %s want %s", x, zero)
-	}
-
-	// 1b) a zero value may have a denominator != 0 and != 1
-	x.Num().Set(a)
-	qab := new(Rat).SetFrac(a, b)
-	if x.Cmp(qab) != 0 {
-		t.Errorf("1b) got %s want %s", x, qab)
-	}
-
-	// 2a) an integral value becomes a fraction depending on denominator
-	x.SetFrac64(10, 2)
-	x.Denom().SetInt64(3)
-	q53 := NewRat(5, 3)
-	if x.Cmp(q53) != 0 {
-		t.Errorf("2a) got %s want %s", x, q53)
-	}
-
-	// 2b) an integral value becomes a fraction depending on denominator
-	x = NewRat(10, 2)
-	x.Denom().SetInt64(3)
-	if x.Cmp(q53) != 0 {
-		t.Errorf("2b) got %s want %s", x, q53)
-	}
-
-	// 3) changing the numerator/denominator of a Rat changes the Rat
-	x.SetFrac(a, b)
-	a = x.Num()
-	b = x.Denom()
-	a.SetInt64(5)
-	b.SetInt64(3)
-	if x.Cmp(q53) != 0 {
-		t.Errorf("3) got %s want %s", x, q53)
-	}
-}
-
-func TestFloat32Distribution(t *testing.T) {
-	// Generate a distribution of (sign, mantissa, exp) values
-	// broader than the float32 range, and check Rat.Float32()
-	// always picks the closest float32 approximation.
-	var add = []int64{
-		0,
-		1,
-		3,
-		5,
-		7,
-		9,
-		11,
-	}
-	var winc, einc = uint64(1), 1 // soak test (~1.5s on x86-64)
-	if testing.Short() {
-		winc, einc = 5, 15 // quick test (~60ms on x86-64)
-	}
-
-	for _, sign := range "+-" {
-		for _, a := range add {
-			for wid := uint64(0); wid < 30; wid += winc {
-				b := 1<<wid + a
-				if sign == '-' {
-					b = -b
-				}
-				for exp := -150; exp < 150; exp += einc {
-					num, den := NewInt(b), NewInt(1)
-					if exp > 0 {
-						num.Lsh(num, uint(exp))
-					} else {
-						den.Lsh(den, uint(-exp))
-					}
-					r := new(Rat).SetFrac(num, den)
-					f, _ := r.Float32()
-
-					if !checkIsBestApprox32(t, f, r) {
-						// Append context information.
-						t.Errorf("(input was mantissa %#x, exp %d; f = %g (%b); f ~ %g; r = %v)",
-							b, exp, f, f, math.Ldexp(float64(b), exp), r)
-					}
-
-					checkNonLossyRoundtrip32(t, f)
-				}
-			}
-		}
-	}
-}
-
-func TestFloat64Distribution(t *testing.T) {
-	// Generate a distribution of (sign, mantissa, exp) values
-	// broader than the float64 range, and check Rat.Float64()
-	// always picks the closest float64 approximation.
-	var add = []int64{
-		0,
-		1,
-		3,
-		5,
-		7,
-		9,
-		11,
-	}
-	var winc, einc = uint64(1), 1 // soak test (~75s on x86-64)
-	if testing.Short() {
-		winc, einc = 10, 500 // quick test (~12ms on x86-64)
-	}
-
-	for _, sign := range "+-" {
-		for _, a := range add {
-			for wid := uint64(0); wid < 60; wid += winc {
-				b := 1<<wid + a
-				if sign == '-' {
-					b = -b
-				}
-				for exp := -1100; exp < 1100; exp += einc {
-					num, den := NewInt(b), NewInt(1)
-					if exp > 0 {
-						num.Lsh(num, uint(exp))
-					} else {
-						den.Lsh(den, uint(-exp))
-					}
-					r := new(Rat).SetFrac(num, den)
-					f, _ := r.Float64()
-
-					if !checkIsBestApprox64(t, f, r) {
-						// Append context information.
-						t.Errorf("(input was mantissa %#x, exp %d; f = %g (%b); f ~ %g; r = %v)",
-							b, exp, f, f, math.Ldexp(float64(b), exp), r)
-					}
-
-					checkNonLossyRoundtrip64(t, f)
-				}
-			}
-		}
-	}
-}
-
-// TestSetFloat64NonFinite checks that SetFloat64 of a non-finite value
-// returns nil.
-func TestSetFloat64NonFinite(t *testing.T) {
-	for _, f := range []float64{math.NaN(), math.Inf(+1), math.Inf(-1)} {
-		var r Rat
-		if r2 := r.SetFloat64(f); r2 != nil {
-			t.Errorf("SetFloat64(%g) was %v, want nil", f, r2)
-		}
-	}
-}
-
-// checkNonLossyRoundtrip32 checks that a float->Rat->float roundtrip is
-// non-lossy for finite f.
-func checkNonLossyRoundtrip32(t *testing.T, f float32) {
-	if !isFinite(float64(f)) {
-		return
-	}
-	r := new(Rat).SetFloat64(float64(f))
-	if r == nil {
-		t.Errorf("Rat.SetFloat64(float64(%g) (%b)) == nil", f, f)
-		return
-	}
-	f2, exact := r.Float32()
-	if f != f2 || !exact {
-		t.Errorf("Rat.SetFloat64(float64(%g)).Float32() = %g (%b), %v, want %g (%b), %v; delta = %b",
-			f, f2, f2, exact, f, f, true, f2-f)
-	}
-}
-
-// checkNonLossyRoundtrip64 checks that a float->Rat->float roundtrip is
-// non-lossy for finite f.
-func checkNonLossyRoundtrip64(t *testing.T, f float64) {
-	if !isFinite(f) {
-		return
-	}
-	r := new(Rat).SetFloat64(f)
-	if r == nil {
-		t.Errorf("Rat.SetFloat64(%g (%b)) == nil", f, f)
-		return
-	}
-	f2, exact := r.Float64()
-	if f != f2 || !exact {
-		t.Errorf("Rat.SetFloat64(%g).Float64() = %g (%b), %v, want %g (%b), %v; delta = %b",
-			f, f2, f2, exact, f, f, true, f2-f)
-	}
-}
-
-// delta returns the absolute difference between r and f.
-func delta(r *Rat, f float64) *Rat {
-	d := new(Rat).Sub(r, new(Rat).SetFloat64(f))
-	return d.Abs(d)
-}
-
-// checkIsBestApprox32 checks that f is the best possible float32
-// approximation of r.
-// Returns true on success.
-func checkIsBestApprox32(t *testing.T, f float32, r *Rat) bool {
-	if math.Abs(float64(f)) >= math.MaxFloat32 {
-		// Cannot check +Inf, -Inf, nor the float next to them (MaxFloat32).
-		// But we have tests for these special cases.
-		return true
-	}
-
-	// r must be strictly between f0 and f1, the floats bracketing f.
-	f0 := math.Nextafter32(f, float32(math.Inf(-1)))
-	f1 := math.Nextafter32(f, float32(math.Inf(+1)))
-
-	// For f to be correct, r must be closer to f than to f0 or f1.
-	df := delta(r, float64(f))
-	df0 := delta(r, float64(f0))
-	df1 := delta(r, float64(f1))
-	if df.Cmp(df0) > 0 {
-		t.Errorf("Rat(%v).Float32() = %g (%b), but previous float32 %g (%b) is closer", r, f, f, f0, f0)
-		return false
-	}
-	if df.Cmp(df1) > 0 {
-		t.Errorf("Rat(%v).Float32() = %g (%b), but next float32 %g (%b) is closer", r, f, f, f1, f1)
-		return false
-	}
-	if df.Cmp(df0) == 0 && !isEven32(f) {
-		t.Errorf("Rat(%v).Float32() = %g (%b); halfway should have rounded to %g (%b) instead", r, f, f, f0, f0)
-		return false
-	}
-	if df.Cmp(df1) == 0 && !isEven32(f) {
-		t.Errorf("Rat(%v).Float32() = %g (%b); halfway should have rounded to %g (%b) instead", r, f, f, f1, f1)
-		return false
-	}
-	return true
-}
-
-// checkIsBestApprox64 checks that f is the best possible float64
-// approximation of r.
-// Returns true on success.
-func checkIsBestApprox64(t *testing.T, f float64, r *Rat) bool {
-	if math.Abs(f) >= math.MaxFloat64 {
-		// Cannot check +Inf, -Inf, nor the float next to them (MaxFloat64).
-		// But we have tests for these special cases.
-		return true
-	}
-
-	// r must be strictly between f0 and f1, the floats bracketing f.
-	f0 := math.Nextafter(f, math.Inf(-1))
-	f1 := math.Nextafter(f, math.Inf(+1))
-
-	// For f to be correct, r must be closer to f than to f0 or f1.
-	df := delta(r, f)
-	df0 := delta(r, f0)
-	df1 := delta(r, f1)
-	if df.Cmp(df0) > 0 {
-		t.Errorf("Rat(%v).Float64() = %g (%b), but previous float64 %g (%b) is closer", r, f, f, f0, f0)
-		return false
-	}
-	if df.Cmp(df1) > 0 {
-		t.Errorf("Rat(%v).Float64() = %g (%b), but next float64 %g (%b) is closer", r, f, f, f1, f1)
-		return false
-	}
-	if df.Cmp(df0) == 0 && !isEven64(f) {
-		t.Errorf("Rat(%v).Float64() = %g (%b); halfway should have rounded to %g (%b) instead", r, f, f, f0, f0)
-		return false
-	}
-	if df.Cmp(df1) == 0 && !isEven64(f) {
-		t.Errorf("Rat(%v).Float64() = %g (%b); halfway should have rounded to %g (%b) instead", r, f, f, f1, f1)
-		return false
-	}
-	return true
-}
-
-func isEven32(f float32) bool { return math.Float32bits(f)&1 == 0 }
-func isEven64(f float64) bool { return math.Float64bits(f)&1 == 0 }
-
-func TestIsFinite(t *testing.T) {
-	finites := []float64{
-		1.0 / 3,
-		4891559871276714924261e+222,
-		math.MaxFloat64,
-		math.SmallestNonzeroFloat64,
-		-math.MaxFloat64,
-		-math.SmallestNonzeroFloat64,
-	}
-	for _, f := range finites {
-		if !isFinite(f) {
-			t.Errorf("!IsFinite(%g (%b))", f, f)
-		}
-	}
-	nonfinites := []float64{
-		math.NaN(),
-		math.Inf(-1),
-		math.Inf(+1),
-	}
-	for _, f := range nonfinites {
-		if isFinite(f) {
-			t.Errorf("IsFinite(%g, (%b))", f, f)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/ratconv.go b/third_party/gofrontend/libgo/go/math/big/ratconv.go
deleted file mode 100644
index 961ff64..0000000
--- a/third_party/gofrontend/libgo/go/math/big/ratconv.go
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements rat-to-string conversion functions.
-
-package big
-
-import (
-	"errors"
-	"fmt"
-	"io"
-	"strconv"
-	"strings"
-)
-
-func ratTok(ch rune) bool {
-	return strings.IndexRune("+-/0123456789.eE", ch) >= 0
-}
-
-// Scan is a support routine for fmt.Scanner. It accepts the formats
-// 'e', 'E', 'f', 'F', 'g', 'G', and 'v'. All formats are equivalent.
-func (z *Rat) Scan(s fmt.ScanState, ch rune) error {
-	tok, err := s.Token(true, ratTok)
-	if err != nil {
-		return err
-	}
-	if strings.IndexRune("efgEFGv", ch) < 0 {
-		return errors.New("Rat.Scan: invalid verb")
-	}
-	if _, ok := z.SetString(string(tok)); !ok {
-		return errors.New("Rat.Scan: invalid syntax")
-	}
-	return nil
-}
-
-// SetString sets z to the value of s and returns z and a boolean indicating
-// success. s can be given as a fraction "a/b" or as a floating-point number
-// optionally followed by an exponent. If the operation failed, the value of
-// z is undefined but the returned value is nil.
-func (z *Rat) SetString(s string) (*Rat, bool) {
-	if len(s) == 0 {
-		return nil, false
-	}
-	// len(s) > 0
-
-	// parse fraction a/b, if any
-	if sep := strings.Index(s, "/"); sep >= 0 {
-		if _, ok := z.a.SetString(s[:sep], 0); !ok {
-			return nil, false
-		}
-		s = s[sep+1:]
-		var err error
-		if z.b.abs, _, _, err = z.b.abs.scan(strings.NewReader(s), 0, false); err != nil {
-			return nil, false
-		}
-		if len(z.b.abs) == 0 {
-			return nil, false
-		}
-		return z.norm(), true
-	}
-
-	// parse floating-point number
-	r := strings.NewReader(s)
-
-	// sign
-	neg, err := scanSign(r)
-	if err != nil {
-		return nil, false
-	}
-
-	// mantissa
-	var ecorr int
-	z.a.abs, _, ecorr, err = z.a.abs.scan(r, 10, true)
-	if err != nil {
-		return nil, false
-	}
-
-	// exponent
-	var exp int64
-	exp, _, err = scanExponent(r, false)
-	if err != nil {
-		return nil, false
-	}
-
-	// there should be no unread characters left
-	if _, err = r.ReadByte(); err != io.EOF {
-		return nil, false
-	}
-
-	// correct exponent
-	if ecorr < 0 {
-		exp += int64(ecorr)
-	}
-
-	// compute exponent power
-	expabs := exp
-	if expabs < 0 {
-		expabs = -expabs
-	}
-	powTen := nat(nil).expNN(natTen, nat(nil).setWord(Word(expabs)), nil)
-
-	// complete fraction
-	if exp < 0 {
-		z.b.abs = powTen
-		z.norm()
-	} else {
-		z.a.abs = z.a.abs.mul(z.a.abs, powTen)
-		z.b.abs = z.b.abs[:0]
-	}
-
-	z.a.neg = neg && len(z.a.abs) > 0 // 0 has no sign
-
-	return z, true
-}
-
-// scanExponent scans the longest possible prefix of r representing a decimal
-// ('e', 'E') or binary ('p') exponent, if any. It returns the exponent, the
-// exponent base (10 or 2), or a read or syntax error, if any.
-//
-//	exponent = ( "E" | "e" | "p" ) [ sign ] digits .
-//	sign     = "+" | "-" .
-//	digits   = digit { digit } .
-//	digit    = "0" ... "9" .
-//
-// A binary exponent is only permitted if binExpOk is set.
-func scanExponent(r io.ByteScanner, binExpOk bool) (exp int64, base int, err error) {
-	base = 10
-
-	var ch byte
-	if ch, err = r.ReadByte(); err != nil {
-		if err == io.EOF {
-			err = nil // no exponent; same as e0
-		}
-		return
-	}
-
-	switch ch {
-	case 'e', 'E':
-		// ok
-	case 'p':
-		if binExpOk {
-			base = 2
-			break // ok
-		}
-		fallthrough // binary exponent not permitted
-	default:
-		r.UnreadByte()
-		return // no exponent; same as e0
-	}
-
-	var neg bool
-	if neg, err = scanSign(r); err != nil {
-		return
-	}
-
-	var digits []byte
-	if neg {
-		digits = append(digits, '-')
-	}
-
-	// no need to use nat.scan for exponent digits
-	// since we only care about int64 values - the
-	// from-scratch scan is easy enough and faster
-	for i := 0; ; i++ {
-		if ch, err = r.ReadByte(); err != nil {
-			if err != io.EOF || i == 0 {
-				return
-			}
-			err = nil
-			break // i > 0
-		}
-		if ch < '0' || '9' < ch {
-			if i == 0 {
-				r.UnreadByte()
-				err = fmt.Errorf("invalid exponent (missing digits)")
-				return
-			}
-			break // i > 0
-		}
-		digits = append(digits, byte(ch))
-	}
-	// i > 0 => we have at least one digit
-
-	exp, err = strconv.ParseInt(string(digits), 10, 64)
-	return
-}
-
-// String returns a string representation of x in the form "a/b" (even if b == 1).
-func (x *Rat) String() string {
-	s := "/1"
-	if len(x.b.abs) != 0 {
-		s = "/" + x.b.abs.decimalString()
-	}
-	return x.a.String() + s
-}
-
-// RatString returns a string representation of x in the form "a/b" if b != 1,
-// and in the form "a" if b == 1.
-func (x *Rat) RatString() string {
-	if x.IsInt() {
-		return x.a.String()
-	}
-	return x.String()
-}
-
-// FloatString returns a string representation of x in decimal form with prec
-// digits of precision after the decimal point. The last digit is rounded to
-// nearest, with halves rounded away from zero.
-func (x *Rat) FloatString(prec int) string {
-	if x.IsInt() {
-		s := x.a.String()
-		if prec > 0 {
-			s += "." + strings.Repeat("0", prec)
-		}
-		return s
-	}
-	// x.b.abs != 0
-
-	q, r := nat(nil).div(nat(nil), x.a.abs, x.b.abs)
-
-	p := natOne
-	if prec > 0 {
-		p = nat(nil).expNN(natTen, nat(nil).setUint64(uint64(prec)), nil)
-	}
-
-	r = r.mul(r, p)
-	r, r2 := r.div(nat(nil), r, x.b.abs)
-
-	// see if we need to round up
-	r2 = r2.add(r2, r2)
-	if x.b.abs.cmp(r2) <= 0 {
-		r = r.add(r, natOne)
-		if r.cmp(p) >= 0 {
-			q = nat(nil).add(q, natOne)
-			r = nat(nil).sub(r, p)
-		}
-	}
-
-	s := q.decimalString()
-	if x.a.neg {
-		s = "-" + s
-	}
-
-	if prec > 0 {
-		rs := r.decimalString()
-		leadingZeros := prec - len(rs)
-		s += "." + strings.Repeat("0", leadingZeros) + rs
-	}
-
-	return s
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/ratconv_test.go b/third_party/gofrontend/libgo/go/math/big/ratconv_test.go
deleted file mode 100644
index da2fdab..0000000
--- a/third_party/gofrontend/libgo/go/math/big/ratconv_test.go
+++ /dev/null
@@ -1,453 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package big
-
-import (
-	"bytes"
-	"fmt"
-	"math"
-	"strconv"
-	"strings"
-	"testing"
-)
-
-type StringTest struct {
-	in, out string
-	ok      bool
-}
-
-var setStringTests = []StringTest{
-	{"0", "0", true},
-	{"-0", "0", true},
-	{"1", "1", true},
-	{"-1", "-1", true},
-	{"1.", "1", true},
-	{"1e0", "1", true},
-	{"1.e1", "10", true},
-	{in: "1e"},
-	{in: "1.e"},
-	{in: "1e+14e-5"},
-	{in: "1e4.5"},
-	{in: "r"},
-	{in: "a/b"},
-	{in: "a.b"},
-	{"-0.1", "-1/10", true},
-	{"-.1", "-1/10", true},
-	{"2/4", "1/2", true},
-	{".25", "1/4", true},
-	{"-1/5", "-1/5", true},
-	{"8129567.7690E14", "812956776900000000000", true},
-	{"78189e+4", "781890000", true},
-	{"553019.8935e+8", "55301989350000", true},
-	{"98765432109876543210987654321e-10", "98765432109876543210987654321/10000000000", true},
-	{"9877861857500000E-7", "3951144743/4", true},
-	{"2169378.417e-3", "2169378417/1000000", true},
-	{"884243222337379604041632732738665534", "884243222337379604041632732738665534", true},
-	{"53/70893980658822810696", "53/70893980658822810696", true},
-	{"106/141787961317645621392", "53/70893980658822810696", true},
-	{"204211327800791583.81095", "4084226556015831676219/20000", true},
-	{in: "1/0"},
-}
-
-// These are not supported by fmt.Fscanf.
-var setStringTests2 = []StringTest{
-	{"0x10", "16", true},
-	{"-010/1", "-8", true}, // TODO(gri) should we even permit octal here?
-	{"-010.", "-10", true},
-	{"0x10/0x20", "1/2", true},
-	{"0b1000/3", "8/3", true},
-	// TODO(gri) add more tests
-}
-
-func TestRatSetString(t *testing.T) {
-	var tests []StringTest
-	tests = append(tests, setStringTests...)
-	tests = append(tests, setStringTests2...)
-
-	for i, test := range tests {
-		x, ok := new(Rat).SetString(test.in)
-
-		if ok {
-			if !test.ok {
-				t.Errorf("#%d SetString(%q) expected failure", i, test.in)
-			} else if x.RatString() != test.out {
-				t.Errorf("#%d SetString(%q) got %s want %s", i, test.in, x.RatString(), test.out)
-			}
-		} else if x != nil {
-			t.Errorf("#%d SetString(%q) got %p want nil", i, test.in, x)
-		}
-	}
-}
-
-func TestRatScan(t *testing.T) {
-	var buf bytes.Buffer
-	for i, test := range setStringTests {
-		x := new(Rat)
-		buf.Reset()
-		buf.WriteString(test.in)
-
-		_, err := fmt.Fscanf(&buf, "%v", x)
-		if err == nil != test.ok {
-			if test.ok {
-				t.Errorf("#%d (%s) error: %s", i, test.in, err)
-			} else {
-				t.Errorf("#%d (%s) expected error", i, test.in)
-			}
-			continue
-		}
-		if err == nil && x.RatString() != test.out {
-			t.Errorf("#%d got %s want %s", i, x.RatString(), test.out)
-		}
-	}
-}
-
-var floatStringTests = []struct {
-	in   string
-	prec int
-	out  string
-}{
-	{"0", 0, "0"},
-	{"0", 4, "0.0000"},
-	{"1", 0, "1"},
-	{"1", 2, "1.00"},
-	{"-1", 0, "-1"},
-	{"0.05", 1, "0.1"},
-	{"-0.05", 1, "-0.1"},
-	{".25", 2, "0.25"},
-	{".25", 1, "0.3"},
-	{".25", 3, "0.250"},
-	{"-1/3", 3, "-0.333"},
-	{"-2/3", 4, "-0.6667"},
-	{"0.96", 1, "1.0"},
-	{"0.999", 2, "1.00"},
-	{"0.9", 0, "1"},
-	{".25", -1, "0"},
-	{".55", -1, "1"},
-}
-
-func TestFloatString(t *testing.T) {
-	for i, test := range floatStringTests {
-		x, _ := new(Rat).SetString(test.in)
-
-		if x.FloatString(test.prec) != test.out {
-			t.Errorf("#%d got %s want %s", i, x.FloatString(test.prec), test.out)
-		}
-	}
-}
-
-// Test inputs to Rat.SetString.  The prefix "long:" causes the test
-// to be skipped in --test.short mode.  (The threshold is about 500us.)
-var float64inputs = []string{
-	// Constants plundered from strconv/testfp.txt.
-
-	// Table 1: Stress Inputs for Conversion to 53-bit Binary, < 1/2 ULP
-	"5e+125",
-	"69e+267",
-	"999e-026",
-	"7861e-034",
-	"75569e-254",
-	"928609e-261",
-	"9210917e+080",
-	"84863171e+114",
-	"653777767e+273",
-	"5232604057e-298",
-	"27235667517e-109",
-	"653532977297e-123",
-	"3142213164987e-294",
-	"46202199371337e-072",
-	"231010996856685e-073",
-	"9324754620109615e+212",
-	"78459735791271921e+049",
-	"272104041512242479e+200",
-	"6802601037806061975e+198",
-	"20505426358836677347e-221",
-	"836168422905420598437e-234",
-	"4891559871276714924261e+222",
-
-	// Table 2: Stress Inputs for Conversion to 53-bit Binary, > 1/2 ULP
-	"9e-265",
-	"85e-037",
-	"623e+100",
-	"3571e+263",
-	"81661e+153",
-	"920657e-023",
-	"4603285e-024",
-	"87575437e-309",
-	"245540327e+122",
-	"6138508175e+120",
-	"83356057653e+193",
-	"619534293513e+124",
-	"2335141086879e+218",
-	"36167929443327e-159",
-	"609610927149051e-255",
-	"3743626360493413e-165",
-	"94080055902682397e-242",
-	"899810892172646163e+283",
-	"7120190517612959703e+120",
-	"25188282901709339043e-252",
-	"308984926168550152811e-052",
-	"6372891218502368041059e+064",
-
-	// Table 14: Stress Inputs for Conversion to 24-bit Binary, <1/2 ULP
-	"5e-20",
-	"67e+14",
-	"985e+15",
-	"7693e-42",
-	"55895e-16",
-	"996622e-44",
-	"7038531e-32",
-	"60419369e-46",
-	"702990899e-20",
-	"6930161142e-48",
-	"25933168707e+13",
-	"596428896559e+20",
-
-	// Table 15: Stress Inputs for Conversion to 24-bit Binary, >1/2 ULP
-	"3e-23",
-	"57e+18",
-	"789e-35",
-	"2539e-18",
-	"76173e+28",
-	"887745e-11",
-	"5382571e-37",
-	"82381273e-35",
-	"750486563e-38",
-	"3752432815e-39",
-	"75224575729e-45",
-	"459926601011e+15",
-
-	// Constants plundered from strconv/atof_test.go.
-
-	"0",
-	"1",
-	"+1",
-	"1e23",
-	"1E23",
-	"100000000000000000000000",
-	"1e-100",
-	"123456700",
-	"99999999999999974834176",
-	"100000000000000000000001",
-	"100000000000000008388608",
-	"100000000000000016777215",
-	"100000000000000016777216",
-	"-1",
-	"-0.1",
-	"-0", // NB: exception made for this input
-	"1e-20",
-	"625e-3",
-
-	// largest float64
-	"1.7976931348623157e308",
-	"-1.7976931348623157e308",
-	// next float64 - too large
-	"1.7976931348623159e308",
-	"-1.7976931348623159e308",
-	// the border is ...158079
-	// borderline - okay
-	"1.7976931348623158e308",
-	"-1.7976931348623158e308",
-	// borderline - too large
-	"1.797693134862315808e308",
-	"-1.797693134862315808e308",
-
-	// a little too large
-	"1e308",
-	"2e308",
-	"1e309",
-
-	// way too large
-	"1e310",
-	"-1e310",
-	"1e400",
-	"-1e400",
-	"long:1e400000",
-	"long:-1e400000",
-
-	// denormalized
-	"1e-305",
-	"1e-306",
-	"1e-307",
-	"1e-308",
-	"1e-309",
-	"1e-310",
-	"1e-322",
-	// smallest denormal
-	"5e-324",
-	"4e-324",
-	"3e-324",
-	// too small
-	"2e-324",
-	// way too small
-	"1e-350",
-	"long:1e-400000",
-	// way too small, negative
-	"-1e-350",
-	"long:-1e-400000",
-
-	// try to overflow exponent
-	// [Disabled: too slow and memory-hungry with rationals.]
-	// "1e-4294967296",
-	// "1e+4294967296",
-	// "1e-18446744073709551616",
-	// "1e+18446744073709551616",
-
-	// http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
-	"2.2250738585072012e-308",
-	// http://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/
-	"2.2250738585072011e-308",
-
-	// A very large number (initially wrongly parsed by the fast algorithm).
-	"4.630813248087435e+307",
-
-	// A different kind of very large number.
-	"22.222222222222222",
-	"long:2." + strings.Repeat("2", 4000) + "e+1",
-
-	// Exactly halfway between 1 and math.Nextafter(1, 2).
-	// Round to even (down).
-	"1.00000000000000011102230246251565404236316680908203125",
-	// Slightly lower; still round down.
-	"1.00000000000000011102230246251565404236316680908203124",
-	// Slightly higher; round up.
-	"1.00000000000000011102230246251565404236316680908203126",
-	// Slightly higher, but you have to read all the way to the end.
-	"long:1.00000000000000011102230246251565404236316680908203125" + strings.Repeat("0", 10000) + "1",
-
-	// Smallest denormal, 2^(-1022-52)
-	"4.940656458412465441765687928682213723651e-324",
-	// Half of smallest denormal, 2^(-1022-53)
-	"2.470328229206232720882843964341106861825e-324",
-	// A little more than the exact half of smallest denormal
-	// 2^-1075 + 2^-1100.  (Rounds to 1p-1074.)
-	"2.470328302827751011111470718709768633275e-324",
-	// The exact halfway between smallest normal and largest denormal:
-	// 2^-1022 - 2^-1075.  (Rounds to 2^-1022.)
-	"2.225073858507201136057409796709131975935e-308",
-
-	"1152921504606846975",  //   1<<60 - 1
-	"-1152921504606846975", // -(1<<60 - 1)
-	"1152921504606846977",  //   1<<60 + 1
-	"-1152921504606846977", // -(1<<60 + 1)
-
-	"1/3",
-}
-
-// isFinite reports whether f represents a finite rational value.
-// It is equivalent to !math.IsNan(f) && !math.IsInf(f, 0).
-func isFinite(f float64) bool {
-	return math.Abs(f) <= math.MaxFloat64
-}
-
-func TestFloat32SpecialCases(t *testing.T) {
-	for _, input := range float64inputs {
-		if strings.HasPrefix(input, "long:") {
-			if testing.Short() {
-				continue
-			}
-			input = input[len("long:"):]
-		}
-
-		r, ok := new(Rat).SetString(input)
-		if !ok {
-			t.Errorf("Rat.SetString(%q) failed", input)
-			continue
-		}
-		f, exact := r.Float32()
-
-		// 1. Check string -> Rat -> float32 conversions are
-		// consistent with strconv.ParseFloat.
-		// Skip this check if the input uses "a/b" rational syntax.
-		if !strings.Contains(input, "/") {
-			e64, _ := strconv.ParseFloat(input, 32)
-			e := float32(e64)
-
-			// Careful: negative Rats too small for
-			// float64 become -0, but Rat obviously cannot
-			// preserve the sign from SetString("-0").
-			switch {
-			case math.Float32bits(e) == math.Float32bits(f):
-				// Ok: bitwise equal.
-			case f == 0 && r.Num().BitLen() == 0:
-				// Ok: Rat(0) is equivalent to both +/- float64(0).
-			default:
-				t.Errorf("strconv.ParseFloat(%q) = %g (%b), want %g (%b); delta = %g", input, e, e, f, f, f-e)
-			}
-		}
-
-		if !isFinite(float64(f)) {
-			continue
-		}
-
-		// 2. Check f is best approximation to r.
-		if !checkIsBestApprox32(t, f, r) {
-			// Append context information.
-			t.Errorf("(input was %q)", input)
-		}
-
-		// 3. Check f->R->f roundtrip is non-lossy.
-		checkNonLossyRoundtrip32(t, f)
-
-		// 4. Check exactness using slow algorithm.
-		if wasExact := new(Rat).SetFloat64(float64(f)).Cmp(r) == 0; wasExact != exact {
-			t.Errorf("Rat.SetString(%q).Float32().exact = %t, want %t", input, exact, wasExact)
-		}
-	}
-}
-
-func TestFloat64SpecialCases(t *testing.T) {
-	for _, input := range float64inputs {
-		if strings.HasPrefix(input, "long:") {
-			if testing.Short() {
-				continue
-			}
-			input = input[len("long:"):]
-		}
-
-		r, ok := new(Rat).SetString(input)
-		if !ok {
-			t.Errorf("Rat.SetString(%q) failed", input)
-			continue
-		}
-		f, exact := r.Float64()
-
-		// 1. Check string -> Rat -> float64 conversions are
-		// consistent with strconv.ParseFloat.
-		// Skip this check if the input uses "a/b" rational syntax.
-		if !strings.Contains(input, "/") {
-			e, _ := strconv.ParseFloat(input, 64)
-
-			// Careful: negative Rats too small for
-			// float64 become -0, but Rat obviously cannot
-			// preserve the sign from SetString("-0").
-			switch {
-			case math.Float64bits(e) == math.Float64bits(f):
-				// Ok: bitwise equal.
-			case f == 0 && r.Num().BitLen() == 0:
-				// Ok: Rat(0) is equivalent to both +/- float64(0).
-			default:
-				t.Errorf("strconv.ParseFloat(%q) = %g (%b), want %g (%b); delta = %g", input, e, e, f, f, f-e)
-			}
-		}
-
-		if !isFinite(f) {
-			continue
-		}
-
-		// 2. Check f is best approximation to r.
-		if !checkIsBestApprox64(t, f, r) {
-			// Append context information.
-			t.Errorf("(input was %q)", input)
-		}
-
-		// 3. Check f->R->f roundtrip is non-lossy.
-		checkNonLossyRoundtrip64(t, f)
-
-		// 4. Check exactness using slow algorithm.
-		if wasExact := new(Rat).SetFloat64(f).Cmp(r) == 0; wasExact != exact {
-			t.Errorf("Rat.SetString(%q).Float64().exact = %t, want %t", input, exact, wasExact)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/big/roundingmode_string.go b/third_party/gofrontend/libgo/go/math/big/roundingmode_string.go
deleted file mode 100644
index 05024b8..0000000
--- a/third_party/gofrontend/libgo/go/math/big/roundingmode_string.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// generated by stringer -type=RoundingMode; DO NOT EDIT
-
-package big
-
-import "fmt"
-
-const _RoundingMode_name = "ToNearestEvenToNearestAwayToZeroAwayFromZeroToNegativeInfToPositiveInf"
-
-var _RoundingMode_index = [...]uint8{0, 13, 26, 32, 44, 57, 70}
-
-func (i RoundingMode) String() string {
-	if i+1 >= RoundingMode(len(_RoundingMode_index)) {
-		return fmt.Sprintf("RoundingMode(%d)", i)
-	}
-	return _RoundingMode_name[_RoundingMode_index[i]:_RoundingMode_index[i+1]]
-}
diff --git a/third_party/gofrontend/libgo/go/math/bits.go b/third_party/gofrontend/libgo/go/math/bits.go
deleted file mode 100644
index d85ee9c..0000000
--- a/third_party/gofrontend/libgo/go/math/bits.go
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-const (
-	uvnan    = 0x7FF8000000000001
-	uvinf    = 0x7FF0000000000000
-	uvneginf = 0xFFF0000000000000
-	mask     = 0x7FF
-	shift    = 64 - 11 - 1
-	bias     = 1023
-)
-
-// Inf returns positive infinity if sign >= 0, negative infinity if sign < 0.
-func Inf(sign int) float64 {
-	var v uint64
-	if sign >= 0 {
-		v = uvinf
-	} else {
-		v = uvneginf
-	}
-	return Float64frombits(v)
-}
-
-// NaN returns an IEEE 754 ``not-a-number'' value.
-func NaN() float64 { return Float64frombits(uvnan) }
-
-// IsNaN reports whether f is an IEEE 754 ``not-a-number'' value.
-func IsNaN(f float64) (is bool) {
-	// IEEE 754 says that only NaNs satisfy f != f.
-	// To avoid the floating-point hardware, could use:
-	//	x := Float64bits(f);
-	//	return uint32(x>>shift)&mask == mask && x != uvinf && x != uvneginf
-	return f != f
-}
-
-// IsInf reports whether f is an infinity, according to sign.
-// If sign > 0, IsInf reports whether f is positive infinity.
-// If sign < 0, IsInf reports whether f is negative infinity.
-// If sign == 0, IsInf reports whether f is either infinity.
-func IsInf(f float64, sign int) bool {
-	// Test for infinity by comparing against maximum float.
-	// To avoid the floating-point hardware, could use:
-	//	x := Float64bits(f);
-	//	return sign >= 0 && x == uvinf || sign <= 0 && x == uvneginf;
-	return sign >= 0 && f > MaxFloat64 || sign <= 0 && f < -MaxFloat64
-}
-
-// normalize returns a normal number y and exponent exp
-// satisfying x == y × 2**exp. It assumes x is finite and non-zero.
-func normalize(x float64) (y float64, exp int) {
-	const SmallestNormal = 2.2250738585072014e-308 // 2**-1022
-	if Abs(x) < SmallestNormal {
-		return x * (1 << 52), -52
-	}
-	return x, 0
-}
diff --git a/third_party/gofrontend/libgo/go/math/cbrt.go b/third_party/gofrontend/libgo/go/math/cbrt.go
deleted file mode 100644
index f009faf..0000000
--- a/third_party/gofrontend/libgo/go/math/cbrt.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// The go code is a modified version of the original C code from
-// http://www.netlib.org/fdlibm/s_cbrt.c and came with this notice.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunSoft, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-
-// Cbrt returns the cube root of x.
-//
-// Special cases are:
-//	Cbrt(±0) = ±0
-//	Cbrt(±Inf) = ±Inf
-//	Cbrt(NaN) = NaN
-func Cbrt(x float64) float64 {
-	const (
-		B1             = 715094163                   // (682-0.03306235651)*2**20
-		B2             = 696219795                   // (664-0.03306235651)*2**20
-		C              = 5.42857142857142815906e-01  // 19/35     = 0x3FE15F15F15F15F1
-		D              = -7.05306122448979611050e-01 // -864/1225 = 0xBFE691DE2532C834
-		E              = 1.41428571428571436819e+00  // 99/70     = 0x3FF6A0EA0EA0EA0F
-		F              = 1.60714285714285720630e+00  // 45/28     = 0x3FF9B6DB6DB6DB6E
-		G              = 3.57142857142857150787e-01  // 5/14      = 0x3FD6DB6DB6DB6DB7
-		SmallestNormal = 2.22507385850720138309e-308 // 2**-1022  = 0x0010000000000000
-	)
-	// special cases
-	switch {
-	case x == 0 || IsNaN(x) || IsInf(x, 0):
-		return x
-	}
-
-	sign := false
-	if x < 0 {
-		x = -x
-		sign = true
-	}
-
-	// rough cbrt to 5 bits
-	t := Float64frombits(Float64bits(x)/3 + B1<<32)
-	if x < SmallestNormal {
-		// subnormal number
-		t = float64(1 << 54) // set t= 2**54
-		t *= x
-		t = Float64frombits(Float64bits(t)/3 + B2<<32)
-	}
-
-	// new cbrt to 23 bits
-	r := t * t / x
-	s := C + r*t
-	t *= G + F/(s+E+D/s)
-
-	// chop to 22 bits, make larger than cbrt(x)
-	t = Float64frombits(Float64bits(t)&(0xFFFFFFFFC<<28) + 1<<30)
-
-	// one step newton iteration to 53 bits with error less than 0.667ulps
-	s = t * t // t*t is exact
-	r = x / s
-	w := t + t
-	r = (r - t) / (w + r) // r-s is exact
-	t = t + t*r
-
-	// restore the sign bit
-	if sign {
-		t = -t
-	}
-	return t
-}
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/abs.go b/third_party/gofrontend/libgo/go/math/cmplx/abs.go
deleted file mode 100644
index f3cd107..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/abs.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package cmplx provides basic constants and mathematical functions for
-// complex numbers.
-package cmplx
-
-import "math"
-
-// Abs returns the absolute value (also called the modulus) of x.
-func Abs(x complex128) float64 { return math.Hypot(real(x), imag(x)) }
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/asin.go b/third_party/gofrontend/libgo/go/math/cmplx/asin.go
deleted file mode 100644
index 61880a2..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/asin.go
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-import "math"
-
-// The original C code, the long comment, and the constants
-// below are from http://netlib.sandia.gov/cephes/c9x-complex/clog.c.
-// The go code is a simplified version of the original C.
-//
-// Cephes Math Library Release 2.8:  June, 2000
-// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
-//
-// The readme file at http://netlib.sandia.gov/cephes/ says:
-//    Some software in this archive may be from the book _Methods and
-// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
-// International, 1989) or from the Cephes Mathematical Library, a
-// commercial product. In either event, it is copyrighted by the author.
-// What you see here may be used freely but it comes with no support or
-// guarantee.
-//
-//   The two known misprints in the book are repaired here in the
-// source listings for the gamma function and the incomplete beta
-// integral.
-//
-//   Stephen L. Moshier
-//   moshier@na-net.ornl.gov
-
-// Complex circular arc sine
-//
-// DESCRIPTION:
-//
-// Inverse complex sine:
-//                               2
-// w = -i clog( iz + csqrt( 1 - z ) ).
-//
-// casin(z) = -i casinh(iz)
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    DEC       -10,+10     10100       2.1e-15     3.4e-16
-//    IEEE      -10,+10     30000       2.2e-14     2.7e-15
-// Larger relative error can be observed for z near zero.
-// Also tested by csin(casin(z)) = z.
-
-// Asin returns the inverse sine of x.
-func Asin(x complex128) complex128 {
-	if imag(x) == 0 {
-		if math.Abs(real(x)) > 1 {
-			return complex(math.Pi/2, 0) // DOMAIN error
-		}
-		return complex(math.Asin(real(x)), 0)
-	}
-	ct := complex(-imag(x), real(x)) // i * x
-	xx := x * x
-	x1 := complex(1-real(xx), -imag(xx)) // 1 - x*x
-	x2 := Sqrt(x1)                       // x2 = sqrt(1 - x*x)
-	w := Log(ct + x2)
-	return complex(imag(w), -real(w)) // -i * w
-}
-
-// Asinh returns the inverse hyperbolic sine of x.
-func Asinh(x complex128) complex128 {
-	// TODO check range
-	if imag(x) == 0 {
-		if math.Abs(real(x)) > 1 {
-			return complex(math.Pi/2, 0) // DOMAIN error
-		}
-		return complex(math.Asinh(real(x)), 0)
-	}
-	xx := x * x
-	x1 := complex(1+real(xx), imag(xx)) // 1 + x*x
-	return Log(x + Sqrt(x1))            // log(x + sqrt(1 + x*x))
-}
-
-// Complex circular arc cosine
-//
-// DESCRIPTION:
-//
-// w = arccos z  =  PI/2 - arcsin z.
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    DEC       -10,+10      5200      1.6e-15      2.8e-16
-//    IEEE      -10,+10     30000      1.8e-14      2.2e-15
-
-// Acos returns the inverse cosine of x.
-func Acos(x complex128) complex128 {
-	w := Asin(x)
-	return complex(math.Pi/2-real(w), -imag(w))
-}
-
-// Acosh returns the inverse hyperbolic cosine of x.
-func Acosh(x complex128) complex128 {
-	w := Acos(x)
-	if imag(w) <= 0 {
-		return complex(-imag(w), real(w)) // i * w
-	}
-	return complex(imag(w), -real(w)) // -i * w
-}
-
-// Complex circular arc tangent
-//
-// DESCRIPTION:
-//
-// If
-//     z = x + iy,
-//
-// then
-//          1       (    2x     )
-// Re w  =  - arctan(-----------)  +  k PI
-//          2       (     2    2)
-//                  (1 - x  - y )
-//
-//               ( 2         2)
-//          1    (x  +  (y+1) )
-// Im w  =  - log(------------)
-//          4    ( 2         2)
-//               (x  +  (y-1) )
-//
-// Where k is an arbitrary integer.
-//
-// catan(z) = -i catanh(iz).
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    DEC       -10,+10      5900       1.3e-16     7.8e-18
-//    IEEE      -10,+10     30000       2.3e-15     8.5e-17
-// The check catan( ctan(z) )  =  z, with |x| and |y| < PI/2,
-// had peak relative error 1.5e-16, rms relative error
-// 2.9e-17.  See also clog().
-
-// Atan returns the inverse tangent of x.
-func Atan(x complex128) complex128 {
-	if real(x) == 0 && imag(x) > 1 {
-		return NaN()
-	}
-
-	x2 := real(x) * real(x)
-	a := 1 - x2 - imag(x)*imag(x)
-	if a == 0 {
-		return NaN()
-	}
-	t := 0.5 * math.Atan2(2*real(x), a)
-	w := reducePi(t)
-
-	t = imag(x) - 1
-	b := x2 + t*t
-	if b == 0 {
-		return NaN()
-	}
-	t = imag(x) + 1
-	c := (x2 + t*t) / b
-	return complex(w, 0.25*math.Log(c))
-}
-
-// Atanh returns the inverse hyperbolic tangent of x.
-func Atanh(x complex128) complex128 {
-	z := complex(-imag(x), real(x)) // z = i * x
-	z = Atan(z)
-	return complex(imag(z), -real(z)) // z = -i * z
-}
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/cmath_test.go b/third_party/gofrontend/libgo/go/math/cmplx/cmath_test.go
deleted file mode 100644
index f285646..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/cmath_test.go
+++ /dev/null
@@ -1,866 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-import (
-	"math"
-	"testing"
-)
-
-var vc26 = []complex128{
-	(4.97901192488367350108546816 + 7.73887247457810456552351752i),
-	(7.73887247457810456552351752 - 0.27688005719200159404635997i),
-	(-0.27688005719200159404635997 - 5.01060361827107492160848778i),
-	(-5.01060361827107492160848778 + 9.63629370719841737980004837i),
-	(9.63629370719841737980004837 + 2.92637723924396464525443662i),
-	(2.92637723924396464525443662 + 5.22908343145930665230025625i),
-	(5.22908343145930665230025625 + 2.72793991043601025126008608i),
-	(2.72793991043601025126008608 + 1.82530809168085506044576505i),
-	(1.82530809168085506044576505 - 8.68592476857560136238589621i),
-	(-8.68592476857560136238589621 + 4.97901192488367350108546816i),
-}
-var vc = []complex128{
-	(4.9790119248836735e+00 + 7.7388724745781045e+00i),
-	(7.7388724745781045e+00 - 2.7688005719200159e-01i),
-	(-2.7688005719200159e-01 - 5.0106036182710749e+00i),
-	(-5.0106036182710749e+00 + 9.6362937071984173e+00i),
-	(9.6362937071984173e+00 + 2.9263772392439646e+00i),
-	(2.9263772392439646e+00 + 5.2290834314593066e+00i),
-	(5.2290834314593066e+00 + 2.7279399104360102e+00i),
-	(2.7279399104360102e+00 + 1.8253080916808550e+00i),
-	(1.8253080916808550e+00 - 8.6859247685756013e+00i),
-	(-8.6859247685756013e+00 + 4.9790119248836735e+00i),
-}
-
-// The expected results below were computed by the high precision calculators
-// at http://keisan.casio.com/.  More exact input values (array vc[], above)
-// were obtained by printing them with "%.26f".  The answers were calculated
-// to 26 digits (by using the "Digit number" drop-down control of each
-// calculator).
-
-var abs = []float64{
-	9.2022120669932650313380972e+00,
-	7.7438239742296106616261394e+00,
-	5.0182478202557746902556648e+00,
-	1.0861137372799545160704002e+01,
-	1.0070841084922199607011905e+01,
-	5.9922447613166942183705192e+00,
-	5.8978784056736762299945176e+00,
-	3.2822866700678709020367184e+00,
-	8.8756430028990417290744307e+00,
-	1.0011785496777731986390856e+01,
-}
-
-var acos = []complex128{
-	(1.0017679804707456328694569 - 2.9138232718554953784519807i),
-	(0.03606427612041407369636057 + 2.7358584434576260925091256i),
-	(1.6249365462333796703711823 + 2.3159537454335901187730929i),
-	(2.0485650849650740120660391 - 3.0795576791204117911123886i),
-	(0.29621132089073067282488147 - 3.0007392508200622519398814i),
-	(1.0664555914934156601503632 - 2.4872865024796011364747111i),
-	(0.48681307452231387690013905 - 2.463655912283054555225301i),
-	(0.6116977071277574248407752 - 1.8734458851737055262693056i),
-	(1.3649311280370181331184214 + 2.8793528632328795424123832i),
-	(2.6189310485682988308904501 - 2.9956543302898767795858704i),
-}
-var acosh = []complex128{
-	(2.9138232718554953784519807 + 1.0017679804707456328694569i),
-	(2.7358584434576260925091256 - 0.03606427612041407369636057i),
-	(2.3159537454335901187730929 - 1.6249365462333796703711823i),
-	(3.0795576791204117911123886 + 2.0485650849650740120660391i),
-	(3.0007392508200622519398814 + 0.29621132089073067282488147i),
-	(2.4872865024796011364747111 + 1.0664555914934156601503632i),
-	(2.463655912283054555225301 + 0.48681307452231387690013905i),
-	(1.8734458851737055262693056 + 0.6116977071277574248407752i),
-	(2.8793528632328795424123832 - 1.3649311280370181331184214i),
-	(2.9956543302898767795858704 + 2.6189310485682988308904501i),
-}
-var asin = []complex128{
-	(0.56902834632415098636186476 + 2.9138232718554953784519807i),
-	(1.5347320506744825455349611 - 2.7358584434576260925091256i),
-	(-0.054140219438483051139860579 - 2.3159537454335901187730929i),
-	(-0.47776875817017739283471738 + 3.0795576791204117911123886i),
-	(1.2745850059041659464064402 + 3.0007392508200622519398814i),
-	(0.50434073530148095908095852 + 2.4872865024796011364747111i),
-	(1.0839832522725827423311826 + 2.463655912283054555225301i),
-	(0.9590986196671391943905465 + 1.8734458851737055262693056i),
-	(0.20586519875787848611290031 - 2.8793528632328795424123832i),
-	(-1.0481347217734022116591284 + 2.9956543302898767795858704i),
-}
-var asinh = []complex128{
-	(2.9113760469415295679342185 + 0.99639459545704326759805893i),
-	(2.7441755423994259061579029 - 0.035468308789000500601119392i),
-	(-2.2962136462520690506126678 - 1.5144663565690151885726707i),
-	(-3.0771233459295725965402455 + 1.0895577967194013849422294i),
-	(3.0048366100923647417557027 + 0.29346979169819220036454168i),
-	(2.4800059370795363157364643 + 1.0545868606049165710424232i),
-	(2.4718773838309585611141821 + 0.47502344364250803363708842i),
-	(1.8910743588080159144378396 + 0.56882925572563602341139174i),
-	(2.8735426423367341878069406 - 1.362376149648891420997548i),
-	(-2.9981750586172477217567878 + 0.5183571985225367505624207i),
-}
-var atan = []complex128{
-	(1.5115747079332741358607654 + 0.091324403603954494382276776i),
-	(1.4424504323482602560806727 - 0.0045416132642803911503770933i),
-	(-1.5593488703630532674484026 - 0.20163295409248362456446431i),
-	(-1.5280619472445889867794105 + 0.081721556230672003746956324i),
-	(1.4759909163240799678221039 + 0.028602969320691644358773586i),
-	(1.4877353772046548932715555 + 0.14566877153207281663773599i),
-	(1.4206983927779191889826 + 0.076830486127880702249439993i),
-	(1.3162236060498933364869556 + 0.16031313000467530644933363i),
-	(1.5473450684303703578810093 - 0.11064907507939082484935782i),
-	(-1.4841462340185253987375812 + 0.049341850305024399493142411i),
-}
-var atanh = []complex128{
-	(0.058375027938968509064640438 + 1.4793488495105334458167782i),
-	(0.12977343497790381229915667 - 1.5661009410463561327262499i),
-	(-0.010576456067347252072200088 - 1.3743698658402284549750563i),
-	(-0.042218595678688358882784918 + 1.4891433968166405606692604i),
-	(0.095218997991316722061828397 + 1.5416884098777110330499698i),
-	(0.079965459366890323857556487 + 1.4252510353873192700350435i),
-	(0.15051245471980726221708301 + 1.4907432533016303804884461i),
-	(0.25082072933993987714470373 + 1.392057665392187516442986i),
-	(0.022896108815797135846276662 - 1.4609224989282864208963021i),
-	(-0.08665624101841876130537396 + 1.5207902036935093480142159i),
-}
-var conj = []complex128{
-	(4.9790119248836735e+00 - 7.7388724745781045e+00i),
-	(7.7388724745781045e+00 + 2.7688005719200159e-01i),
-	(-2.7688005719200159e-01 + 5.0106036182710749e+00i),
-	(-5.0106036182710749e+00 - 9.6362937071984173e+00i),
-	(9.6362937071984173e+00 - 2.9263772392439646e+00i),
-	(2.9263772392439646e+00 - 5.2290834314593066e+00i),
-	(5.2290834314593066e+00 - 2.7279399104360102e+00i),
-	(2.7279399104360102e+00 - 1.8253080916808550e+00i),
-	(1.8253080916808550e+00 + 8.6859247685756013e+00i),
-	(-8.6859247685756013e+00 - 4.9790119248836735e+00i),
-}
-var cos = []complex128{
-	(3.024540920601483938336569e+02 + 1.1073797572517071650045357e+03i),
-	(1.192858682649064973252758e-01 + 2.7857554122333065540970207e-01i),
-	(7.2144394304528306603857962e+01 - 2.0500129667076044169954205e+01i),
-	(2.24921952538403984190541e+03 - 7.317363745602773587049329e+03i),
-	(-9.148222970032421760015498e+00 + 1.953124661113563541862227e+00i),
-	(-9.116081175857732248227078e+01 - 1.992669213569952232487371e+01i),
-	(3.795639179042704640002918e+00 + 6.623513350981458399309662e+00i),
-	(-2.9144840732498869560679084e+00 - 1.214620271628002917638748e+00i),
-	(-7.45123482501299743872481e+02 + 2.8641692314488080814066734e+03i),
-	(-5.371977967039319076416747e+01 + 4.893348341339375830564624e+01i),
-}
-var cosh = []complex128{
-	(8.34638383523018249366948e+00 + 7.2181057886425846415112064e+01i),
-	(1.10421967379919366952251e+03 - 3.1379638689277575379469861e+02i),
-	(3.051485206773701584738512e-01 - 2.6805384730105297848044485e-01i),
-	(-7.33294728684187933370938e+01 + 1.574445942284918251038144e+01i),
-	(-7.478643293945957535757355e+03 + 1.6348382209913353929473321e+03i),
-	(4.622316522966235701630926e+00 - 8.088695185566375256093098e+00i),
-	(-8.544333183278877406197712e+01 + 3.7505836120128166455231717e+01i),
-	(-1.934457815021493925115198e+00 + 7.3725859611767228178358673e+00i),
-	(-2.352958770061749348353548e+00 - 2.034982010440878358915409e+00i),
-	(7.79756457532134748165069e+02 + 2.8549350716819176560377717e+03i),
-}
-var exp = []complex128{
-	(1.669197736864670815125146e+01 + 1.4436895109507663689174096e+02i),
-	(2.2084389286252583447276212e+03 - 6.2759289284909211238261917e+02i),
-	(2.227538273122775173434327e-01 + 7.2468284028334191250470034e-01i),
-	(-6.5182985958153548997881627e-03 - 1.39965837915193860879044e-03i),
-	(-1.4957286524084015746110777e+04 + 3.269676455931135688988042e+03i),
-	(9.218158701983105935659273e+00 - 1.6223985291084956009304582e+01i),
-	(-1.7088175716853040841444505e+02 + 7.501382609870410713795546e+01i),
-	(-3.852461315830959613132505e+00 + 1.4808420423156073221970892e+01i),
-	(-4.586775503301407379786695e+00 - 4.178501081246873415144744e+00i),
-	(4.451337963005453491095747e-05 - 1.62977574205442915935263e-04i),
-}
-var log = []complex128{
-	(2.2194438972179194425697051e+00 + 9.9909115046919291062461269e-01i),
-	(2.0468956191154167256337289e+00 - 3.5762575021856971295156489e-02i),
-	(1.6130808329853860438751244e+00 - 1.6259990074019058442232221e+00i),
-	(2.3851910394823008710032651e+00 + 2.0502936359659111755031062e+00i),
-	(2.3096442270679923004800651e+00 + 2.9483213155446756211881774e-01i),
-	(1.7904660933974656106951860e+00 + 1.0605860367252556281902109e+00i),
-	(1.7745926939841751666177512e+00 + 4.8084556083358307819310911e-01i),
-	(1.1885403350045342425648780e+00 + 5.8969634164776659423195222e-01i),
-	(2.1833107837679082586772505e+00 - 1.3636647724582455028314573e+00i),
-	(2.3037629487273259170991671e+00 + 2.6210913895386013290915234e+00i),
-}
-var log10 = []complex128{
-	(9.6389223745559042474184943e-01 + 4.338997735671419492599631e-01i),
-	(8.8895547241376579493490892e-01 - 1.5531488990643548254864806e-02i),
-	(7.0055210462945412305244578e-01 - 7.0616239649481243222248404e-01i),
-	(1.0358753067322445311676952e+00 + 8.9043121238134980156490909e-01i),
-	(1.003065742975330237172029e+00 + 1.2804396782187887479857811e-01i),
-	(7.7758954439739162532085157e-01 + 4.6060666333341810869055108e-01i),
-	(7.7069581462315327037689152e-01 + 2.0882857371769952195512475e-01i),
-	(5.1617650901191156135137239e-01 + 2.5610186717615977620363299e-01i),
-	(9.4819982567026639742663212e-01 - 5.9223208584446952284914289e-01i),
-	(1.0005115362454417135973429e+00 + 1.1383255270407412817250921e+00i),
-}
-
-type ff struct {
-	r, theta float64
-}
-
-var polar = []ff{
-	{9.2022120669932650313380972e+00, 9.9909115046919291062461269e-01},
-	{7.7438239742296106616261394e+00, -3.5762575021856971295156489e-02},
-	{5.0182478202557746902556648e+00, -1.6259990074019058442232221e+00},
-	{1.0861137372799545160704002e+01, 2.0502936359659111755031062e+00},
-	{1.0070841084922199607011905e+01, 2.9483213155446756211881774e-01},
-	{5.9922447613166942183705192e+00, 1.0605860367252556281902109e+00},
-	{5.8978784056736762299945176e+00, 4.8084556083358307819310911e-01},
-	{3.2822866700678709020367184e+00, 5.8969634164776659423195222e-01},
-	{8.8756430028990417290744307e+00, -1.3636647724582455028314573e+00},
-	{1.0011785496777731986390856e+01, 2.6210913895386013290915234e+00},
-}
-var pow = []complex128{
-	(-2.499956739197529585028819e+00 + 1.759751724335650228957144e+00i),
-	(7.357094338218116311191939e+04 - 5.089973412479151648145882e+04i),
-	(1.320777296067768517259592e+01 - 3.165621914333901498921986e+01i),
-	(-3.123287828297300934072149e-07 - 1.9849567521490553032502223E-7i),
-	(8.0622651468477229614813e+04 - 7.80028727944573092944363e+04i),
-	(-1.0268824572103165858577141e+00 - 4.716844738244989776610672e-01i),
-	(-4.35953819012244175753187e+01 + 2.2036445974645306917648585e+02i),
-	(8.3556092283250594950239e-01 - 1.2261571947167240272593282e+01i),
-	(1.582292972120769306069625e+03 + 1.273564263524278244782512e+04i),
-	(6.592208301642122149025369e-08 + 2.584887236651661903526389e-08i),
-}
-var sin = []complex128{
-	(-1.1073801774240233539648544e+03 + 3.024539773002502192425231e+02i),
-	(1.0317037521400759359744682e+00 - 3.2208979799929570242818e-02i),
-	(-2.0501952097271429804261058e+01 - 7.2137981348240798841800967e+01i),
-	(7.3173638080346338642193078e+03 + 2.249219506193664342566248e+03i),
-	(-1.964375633631808177565226e+00 - 9.0958264713870404464159683e+00i),
-	(1.992783647158514838337674e+01 - 9.11555769410191350416942e+01i),
-	(-6.680335650741921444300349e+00 + 3.763353833142432513086117e+00i),
-	(1.2794028166657459148245993e+00 - 2.7669092099795781155109602e+00i),
-	(2.8641693949535259594188879e+03 + 7.451234399649871202841615e+02i),
-	(-4.893811726244659135553033e+01 - 5.371469305562194635957655e+01i),
-}
-var sinh = []complex128{
-	(8.34559353341652565758198e+00 + 7.2187893208650790476628899e+01i),
-	(1.1042192548260646752051112e+03 - 3.1379650595631635858792056e+02i),
-	(-8.239469336509264113041849e-02 + 9.9273668758439489098514519e-01i),
-	(7.332295456982297798219401e+01 - 1.574585908122833444899023e+01i),
-	(-7.4786432301380582103534216e+03 + 1.63483823493980029604071e+03i),
-	(4.595842179016870234028347e+00 - 8.135290105518580753211484e+00i),
-	(-8.543842533574163435246793e+01 + 3.750798997857594068272375e+01i),
-	(-1.918003500809465688017307e+00 + 7.4358344619793504041350251e+00i),
-	(-2.233816733239658031433147e+00 - 2.143519070805995056229335e+00i),
-	(-7.797564130187551181105341e+02 - 2.8549352346594918614806877e+03i),
-}
-var sqrt = []complex128{
-	(2.6628203086086130543813948e+00 + 1.4531345674282185229796902e+00i),
-	(2.7823278427251986247149295e+00 - 4.9756907317005224529115567e-02i),
-	(1.5397025302089642757361015e+00 - 1.6271336573016637535695727e+00i),
-	(1.7103411581506875260277898e+00 + 2.8170677122737589676157029e+00i),
-	(3.1390392472953103383607947e+00 + 4.6612625849858653248980849e-01i),
-	(2.1117080764822417640789287e+00 + 1.2381170223514273234967850e+00i),
-	(2.3587032281672256703926939e+00 + 5.7827111903257349935720172e-01i),
-	(1.7335262588873410476661577e+00 + 5.2647258220721269141550382e-01i),
-	(2.3131094974708716531499282e+00 - 1.8775429304303785570775490e+00i),
-	(8.1420535745048086240947359e-01 + 3.0575897587277248522656113e+00i),
-}
-var tan = []complex128{
-	(-1.928757919086441129134525e-07 + 1.0000003267499169073251826e+00i),
-	(1.242412685364183792138948e+00 - 3.17149693883133370106696e+00i),
-	(-4.6745126251587795225571826e-05 - 9.9992439225263959286114298e-01i),
-	(4.792363401193648192887116e-09 + 1.0000000070589333451557723e+00i),
-	(2.345740824080089140287315e-03 + 9.947733046570988661022763e-01i),
-	(-2.396030789494815566088809e-05 + 9.9994781345418591429826779e-01i),
-	(-7.370204836644931340905303e-03 + 1.0043553413417138987717748e+00i),
-	(-3.691803847992048527007457e-02 + 9.6475071993469548066328894e-01i),
-	(-2.781955256713729368401878e-08 - 1.000000049848910609006646e+00i),
-	(9.4281590064030478879791249e-05 + 9.9999119340863718183758545e-01i),
-}
-var tanh = []complex128{
-	(1.0000921981225144748819918e+00 + 2.160986245871518020231507e-05i),
-	(9.9999967727531993209562591e-01 - 1.9953763222959658873657676e-07i),
-	(-1.765485739548037260789686e+00 + 1.7024216325552852445168471e+00i),
-	(-9.999189442732736452807108e-01 + 3.64906070494473701938098e-05i),
-	(9.9999999224622333738729767e-01 - 3.560088949517914774813046e-09i),
-	(1.0029324933367326862499343e+00 - 4.948790309797102353137528e-03i),
-	(9.9996113064788012488693567e-01 - 4.226995742097032481451259e-05i),
-	(1.0074784189316340029873945e+00 - 4.194050814891697808029407e-03i),
-	(9.9385534229718327109131502e-01 + 5.144217985914355502713437e-02i),
-	(-1.0000000491604982429364892e+00 - 2.901873195374433112227349e-08i),
-}
-
-// special cases
-var vcAbsSC = []complex128{
-	NaN(),
-}
-var absSC = []float64{
-	math.NaN(),
-}
-var vcAcosSC = []complex128{
-	NaN(),
-}
-var acosSC = []complex128{
-	NaN(),
-}
-var vcAcoshSC = []complex128{
-	NaN(),
-}
-var acoshSC = []complex128{
-	NaN(),
-}
-var vcAsinSC = []complex128{
-	NaN(),
-}
-var asinSC = []complex128{
-	NaN(),
-}
-var vcAsinhSC = []complex128{
-	NaN(),
-}
-var asinhSC = []complex128{
-	NaN(),
-}
-var vcAtanSC = []complex128{
-	NaN(),
-}
-var atanSC = []complex128{
-	NaN(),
-}
-var vcAtanhSC = []complex128{
-	NaN(),
-}
-var atanhSC = []complex128{
-	NaN(),
-}
-var vcConjSC = []complex128{
-	NaN(),
-}
-var conjSC = []complex128{
-	NaN(),
-}
-var vcCosSC = []complex128{
-	NaN(),
-}
-var cosSC = []complex128{
-	NaN(),
-}
-var vcCoshSC = []complex128{
-	NaN(),
-}
-var coshSC = []complex128{
-	NaN(),
-}
-var vcExpSC = []complex128{
-	NaN(),
-}
-var expSC = []complex128{
-	NaN(),
-}
-var vcIsNaNSC = []complex128{
-	complex(math.Inf(-1), math.Inf(-1)),
-	complex(math.Inf(-1), math.NaN()),
-	complex(math.NaN(), math.Inf(-1)),
-	complex(0, math.NaN()),
-	complex(math.NaN(), 0),
-	complex(math.Inf(1), math.Inf(1)),
-	complex(math.Inf(1), math.NaN()),
-	complex(math.NaN(), math.Inf(1)),
-	complex(math.NaN(), math.NaN()),
-}
-var isNaNSC = []bool{
-	false,
-	false,
-	false,
-	true,
-	true,
-	false,
-	false,
-	false,
-	true,
-}
-var vcLogSC = []complex128{
-	NaN(),
-}
-var logSC = []complex128{
-	NaN(),
-}
-var vcLog10SC = []complex128{
-	NaN(),
-}
-var log10SC = []complex128{
-	NaN(),
-}
-var vcPolarSC = []complex128{
-	NaN(),
-}
-var polarSC = []ff{
-	{math.NaN(), math.NaN()},
-}
-var vcPowSC = [][2]complex128{
-	{NaN(), NaN()},
-}
-var powSC = []complex128{
-	NaN(),
-}
-var vcSinSC = []complex128{
-	NaN(),
-}
-var sinSC = []complex128{
-	NaN(),
-}
-var vcSinhSC = []complex128{
-	NaN(),
-}
-var sinhSC = []complex128{
-	NaN(),
-}
-var vcSqrtSC = []complex128{
-	NaN(),
-}
-var sqrtSC = []complex128{
-	NaN(),
-}
-var vcTanSC = []complex128{
-	NaN(),
-}
-var tanSC = []complex128{
-	NaN(),
-}
-var vcTanhSC = []complex128{
-	NaN(),
-}
-var tanhSC = []complex128{
-	NaN(),
-}
-
-// functions borrowed from pkg/math/all_test.go
-func tolerance(a, b, e float64) bool {
-	d := a - b
-	if d < 0 {
-		d = -d
-	}
-
-	if a != 0 {
-		e = e * a
-		if e < 0 {
-			e = -e
-		}
-	}
-	return d < e
-}
-func soclose(a, b, e float64) bool { return tolerance(a, b, e) }
-func veryclose(a, b float64) bool  { return tolerance(a, b, 4e-16) }
-func alike(a, b float64) bool {
-	switch {
-	case a != a && b != b: // math.IsNaN(a) && math.IsNaN(b):
-		return true
-	case a == b:
-		return math.Signbit(a) == math.Signbit(b)
-	}
-	return false
-}
-
-func cTolerance(a, b complex128, e float64) bool {
-	d := Abs(a - b)
-	if a != 0 {
-		e = e * Abs(a)
-		if e < 0 {
-			e = -e
-		}
-	}
-	return d < e
-}
-func cSoclose(a, b complex128, e float64) bool { return cTolerance(a, b, e) }
-func cVeryclose(a, b complex128) bool          { return cTolerance(a, b, 4e-16) }
-func cAlike(a, b complex128) bool {
-	switch {
-	case IsNaN(a) && IsNaN(b):
-		return true
-	case a == b:
-		return math.Signbit(real(a)) == math.Signbit(real(b)) && math.Signbit(imag(a)) == math.Signbit(imag(b))
-	}
-	return false
-}
-
-func TestAbs(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Abs(vc[i]); !veryclose(abs[i], f) {
-			t.Errorf("Abs(%g) = %g, want %g", vc[i], f, abs[i])
-		}
-	}
-	for i := 0; i < len(vcAbsSC); i++ {
-		if f := Abs(vcAbsSC[i]); !alike(absSC[i], f) {
-			t.Errorf("Abs(%g) = %g, want %g", vcAbsSC[i], f, absSC[i])
-		}
-	}
-}
-func TestAcos(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Acos(vc[i]); !cSoclose(acos[i], f, 1e-14) {
-			t.Errorf("Acos(%g) = %g, want %g", vc[i], f, acos[i])
-		}
-	}
-	for i := 0; i < len(vcAcosSC); i++ {
-		if f := Acos(vcAcosSC[i]); !cAlike(acosSC[i], f) {
-			t.Errorf("Acos(%g) = %g, want %g", vcAcosSC[i], f, acosSC[i])
-		}
-	}
-}
-func TestAcosh(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Acosh(vc[i]); !cSoclose(acosh[i], f, 1e-14) {
-			t.Errorf("Acosh(%g) = %g, want %g", vc[i], f, acosh[i])
-		}
-	}
-	for i := 0; i < len(vcAcoshSC); i++ {
-		if f := Acosh(vcAcoshSC[i]); !cAlike(acoshSC[i], f) {
-			t.Errorf("Acosh(%g) = %g, want %g", vcAcoshSC[i], f, acoshSC[i])
-		}
-	}
-}
-func TestAsin(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Asin(vc[i]); !cSoclose(asin[i], f, 1e-14) {
-			t.Errorf("Asin(%g) = %g, want %g", vc[i], f, asin[i])
-		}
-	}
-	for i := 0; i < len(vcAsinSC); i++ {
-		if f := Asin(vcAsinSC[i]); !cAlike(asinSC[i], f) {
-			t.Errorf("Asin(%g) = %g, want %g", vcAsinSC[i], f, asinSC[i])
-		}
-	}
-}
-func TestAsinh(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Asinh(vc[i]); !cSoclose(asinh[i], f, 4e-15) {
-			t.Errorf("Asinh(%g) = %g, want %g", vc[i], f, asinh[i])
-		}
-	}
-	for i := 0; i < len(vcAsinhSC); i++ {
-		if f := Asinh(vcAsinhSC[i]); !cAlike(asinhSC[i], f) {
-			t.Errorf("Asinh(%g) = %g, want %g", vcAsinhSC[i], f, asinhSC[i])
-		}
-	}
-}
-func TestAtan(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Atan(vc[i]); !cVeryclose(atan[i], f) {
-			t.Errorf("Atan(%g) = %g, want %g", vc[i], f, atan[i])
-		}
-	}
-	for i := 0; i < len(vcAtanSC); i++ {
-		if f := Atan(vcAtanSC[i]); !cAlike(atanSC[i], f) {
-			t.Errorf("Atan(%g) = %g, want %g", vcAtanSC[i], f, atanSC[i])
-		}
-	}
-}
-func TestAtanh(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Atanh(vc[i]); !cVeryclose(atanh[i], f) {
-			t.Errorf("Atanh(%g) = %g, want %g", vc[i], f, atanh[i])
-		}
-	}
-	for i := 0; i < len(vcAtanhSC); i++ {
-		if f := Atanh(vcAtanhSC[i]); !cAlike(atanhSC[i], f) {
-			t.Errorf("Atanh(%g) = %g, want %g", vcAtanhSC[i], f, atanhSC[i])
-		}
-	}
-}
-func TestConj(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Conj(vc[i]); !cVeryclose(conj[i], f) {
-			t.Errorf("Conj(%g) = %g, want %g", vc[i], f, conj[i])
-		}
-	}
-	for i := 0; i < len(vcConjSC); i++ {
-		if f := Conj(vcConjSC[i]); !cAlike(conjSC[i], f) {
-			t.Errorf("Conj(%g) = %g, want %g", vcConjSC[i], f, conjSC[i])
-		}
-	}
-}
-func TestCos(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Cos(vc[i]); !cSoclose(cos[i], f, 3e-15) {
-			t.Errorf("Cos(%g) = %g, want %g", vc[i], f, cos[i])
-		}
-	}
-	for i := 0; i < len(vcCosSC); i++ {
-		if f := Cos(vcCosSC[i]); !cAlike(cosSC[i], f) {
-			t.Errorf("Cos(%g) = %g, want %g", vcCosSC[i], f, cosSC[i])
-		}
-	}
-}
-func TestCosh(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Cosh(vc[i]); !cSoclose(cosh[i], f, 2e-15) {
-			t.Errorf("Cosh(%g) = %g, want %g", vc[i], f, cosh[i])
-		}
-	}
-	for i := 0; i < len(vcCoshSC); i++ {
-		if f := Cosh(vcCoshSC[i]); !cAlike(coshSC[i], f) {
-			t.Errorf("Cosh(%g) = %g, want %g", vcCoshSC[i], f, coshSC[i])
-		}
-	}
-}
-func TestExp(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Exp(vc[i]); !cSoclose(exp[i], f, 1e-15) {
-			t.Errorf("Exp(%g) = %g, want %g", vc[i], f, exp[i])
-		}
-	}
-	for i := 0; i < len(vcExpSC); i++ {
-		if f := Exp(vcExpSC[i]); !cAlike(expSC[i], f) {
-			t.Errorf("Exp(%g) = %g, want %g", vcExpSC[i], f, expSC[i])
-		}
-	}
-}
-func TestIsNaN(t *testing.T) {
-	for i := 0; i < len(vcIsNaNSC); i++ {
-		if f := IsNaN(vcIsNaNSC[i]); isNaNSC[i] != f {
-			t.Errorf("IsNaN(%v) = %v, want %v", vcIsNaNSC[i], f, isNaNSC[i])
-		}
-	}
-}
-func TestLog(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Log(vc[i]); !cVeryclose(log[i], f) {
-			t.Errorf("Log(%g) = %g, want %g", vc[i], f, log[i])
-		}
-	}
-	for i := 0; i < len(vcLogSC); i++ {
-		if f := Log(vcLogSC[i]); !cAlike(logSC[i], f) {
-			t.Errorf("Log(%g) = %g, want %g", vcLogSC[i], f, logSC[i])
-		}
-	}
-}
-func TestLog10(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Log10(vc[i]); !cVeryclose(log10[i], f) {
-			t.Errorf("Log10(%g) = %g, want %g", vc[i], f, log10[i])
-		}
-	}
-	for i := 0; i < len(vcLog10SC); i++ {
-		if f := Log10(vcLog10SC[i]); !cAlike(log10SC[i], f) {
-			t.Errorf("Log10(%g) = %g, want %g", vcLog10SC[i], f, log10SC[i])
-		}
-	}
-}
-func TestPolar(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if r, theta := Polar(vc[i]); !veryclose(polar[i].r, r) && !veryclose(polar[i].theta, theta) {
-			t.Errorf("Polar(%g) = %g, %g want %g, %g", vc[i], r, theta, polar[i].r, polar[i].theta)
-		}
-	}
-	for i := 0; i < len(vcPolarSC); i++ {
-		if r, theta := Polar(vcPolarSC[i]); !alike(polarSC[i].r, r) && !alike(polarSC[i].theta, theta) {
-			t.Errorf("Polar(%g) = %g, %g, want %g, %g", vcPolarSC[i], r, theta, polarSC[i].r, polarSC[i].theta)
-		}
-	}
-}
-func TestPow(t *testing.T) {
-	// Special cases for Pow(0, c).
-	var zero = complex(0, 0)
-	zeroPowers := [][2]complex128{
-		{0, 1 + 0i},
-		{1.5, 0 + 0i},
-		{-1.5, complex(math.Inf(0), 0)},
-		{-1.5 + 1.5i, Inf()},
-	}
-	for _, zp := range zeroPowers {
-		if f := Pow(zero, zp[0]); f != zp[1] {
-			t.Errorf("Pow(%g, %g) = %g, want %g", zero, zp[0], f, zp[1])
-		}
-	}
-	var a = complex(3.0, 3.0)
-	for i := 0; i < len(vc); i++ {
-		if f := Pow(a, vc[i]); !cSoclose(pow[i], f, 4e-15) {
-			t.Errorf("Pow(%g, %g) = %g, want %g", a, vc[i], f, pow[i])
-		}
-	}
-	for i := 0; i < len(vcPowSC); i++ {
-		if f := Pow(vcPowSC[i][0], vcPowSC[i][0]); !cAlike(powSC[i], f) {
-			t.Errorf("Pow(%g, %g) = %g, want %g", vcPowSC[i][0], vcPowSC[i][0], f, powSC[i])
-		}
-	}
-}
-func TestRect(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Rect(polar[i].r, polar[i].theta); !cVeryclose(vc[i], f) {
-			t.Errorf("Rect(%g, %g) = %g want %g", polar[i].r, polar[i].theta, f, vc[i])
-		}
-	}
-	for i := 0; i < len(vcPolarSC); i++ {
-		if f := Rect(polarSC[i].r, polarSC[i].theta); !cAlike(vcPolarSC[i], f) {
-			t.Errorf("Rect(%g, %g) = %g, want %g", polarSC[i].r, polarSC[i].theta, f, vcPolarSC[i])
-		}
-	}
-}
-func TestSin(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Sin(vc[i]); !cSoclose(sin[i], f, 2e-15) {
-			t.Errorf("Sin(%g) = %g, want %g", vc[i], f, sin[i])
-		}
-	}
-	for i := 0; i < len(vcSinSC); i++ {
-		if f := Sin(vcSinSC[i]); !cAlike(sinSC[i], f) {
-			t.Errorf("Sin(%g) = %g, want %g", vcSinSC[i], f, sinSC[i])
-		}
-	}
-}
-func TestSinh(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Sinh(vc[i]); !cSoclose(sinh[i], f, 2e-15) {
-			t.Errorf("Sinh(%g) = %g, want %g", vc[i], f, sinh[i])
-		}
-	}
-	for i := 0; i < len(vcSinhSC); i++ {
-		if f := Sinh(vcSinhSC[i]); !cAlike(sinhSC[i], f) {
-			t.Errorf("Sinh(%g) = %g, want %g", vcSinhSC[i], f, sinhSC[i])
-		}
-	}
-}
-func TestSqrt(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Sqrt(vc[i]); !cVeryclose(sqrt[i], f) {
-			t.Errorf("Sqrt(%g) = %g, want %g", vc[i], f, sqrt[i])
-		}
-	}
-	for i := 0; i < len(vcSqrtSC); i++ {
-		if f := Sqrt(vcSqrtSC[i]); !cAlike(sqrtSC[i], f) {
-			t.Errorf("Sqrt(%g) = %g, want %g", vcSqrtSC[i], f, sqrtSC[i])
-		}
-	}
-}
-func TestTan(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Tan(vc[i]); !cSoclose(tan[i], f, 3e-15) {
-			t.Errorf("Tan(%g) = %g, want %g", vc[i], f, tan[i])
-		}
-	}
-	for i := 0; i < len(vcTanSC); i++ {
-		if f := Tan(vcTanSC[i]); !cAlike(tanSC[i], f) {
-			t.Errorf("Tan(%g) = %g, want %g", vcTanSC[i], f, tanSC[i])
-		}
-	}
-}
-func TestTanh(t *testing.T) {
-	for i := 0; i < len(vc); i++ {
-		if f := Tanh(vc[i]); !cSoclose(tanh[i], f, 2e-15) {
-			t.Errorf("Tanh(%g) = %g, want %g", vc[i], f, tanh[i])
-		}
-	}
-	for i := 0; i < len(vcTanhSC); i++ {
-		if f := Tanh(vcTanhSC[i]); !cAlike(tanhSC[i], f) {
-			t.Errorf("Tanh(%g) = %g, want %g", vcTanhSC[i], f, tanhSC[i])
-		}
-	}
-}
-
-func BenchmarkAbs(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Abs(complex(2.5, 3.5))
-	}
-}
-func BenchmarkAcos(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Acos(complex(2.5, 3.5))
-	}
-}
-func BenchmarkAcosh(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Acosh(complex(2.5, 3.5))
-	}
-}
-func BenchmarkAsin(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Asin(complex(2.5, 3.5))
-	}
-}
-func BenchmarkAsinh(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Asinh(complex(2.5, 3.5))
-	}
-}
-func BenchmarkAtan(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Atan(complex(2.5, 3.5))
-	}
-}
-func BenchmarkAtanh(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Atanh(complex(2.5, 3.5))
-	}
-}
-func BenchmarkConj(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Conj(complex(2.5, 3.5))
-	}
-}
-func BenchmarkCos(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Cos(complex(2.5, 3.5))
-	}
-}
-func BenchmarkCosh(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Cosh(complex(2.5, 3.5))
-	}
-}
-func BenchmarkExp(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Exp(complex(2.5, 3.5))
-	}
-}
-func BenchmarkLog(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Log(complex(2.5, 3.5))
-	}
-}
-func BenchmarkLog10(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Log10(complex(2.5, 3.5))
-	}
-}
-func BenchmarkPhase(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Phase(complex(2.5, 3.5))
-	}
-}
-func BenchmarkPolar(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Polar(complex(2.5, 3.5))
-	}
-}
-func BenchmarkPow(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Pow(complex(2.5, 3.5), complex(2.5, 3.5))
-	}
-}
-func BenchmarkRect(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Rect(2.5, 1.5)
-	}
-}
-func BenchmarkSin(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Sin(complex(2.5, 3.5))
-	}
-}
-func BenchmarkSinh(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Sinh(complex(2.5, 3.5))
-	}
-}
-func BenchmarkSqrt(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Sqrt(complex(2.5, 3.5))
-	}
-}
-func BenchmarkTan(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Tan(complex(2.5, 3.5))
-	}
-}
-func BenchmarkTanh(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Tanh(complex(2.5, 3.5))
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/conj.go b/third_party/gofrontend/libgo/go/math/cmplx/conj.go
deleted file mode 100644
index 34a4277..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/conj.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-// Conj returns the complex conjugate of x.
-func Conj(x complex128) complex128 { return complex(real(x), -imag(x)) }
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/exp.go b/third_party/gofrontend/libgo/go/math/cmplx/exp.go
deleted file mode 100644
index 485ed2c..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/exp.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-import "math"
-
-// The original C code, the long comment, and the constants
-// below are from http://netlib.sandia.gov/cephes/c9x-complex/clog.c.
-// The go code is a simplified version of the original C.
-//
-// Cephes Math Library Release 2.8:  June, 2000
-// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
-//
-// The readme file at http://netlib.sandia.gov/cephes/ says:
-//    Some software in this archive may be from the book _Methods and
-// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
-// International, 1989) or from the Cephes Mathematical Library, a
-// commercial product. In either event, it is copyrighted by the author.
-// What you see here may be used freely but it comes with no support or
-// guarantee.
-//
-//   The two known misprints in the book are repaired here in the
-// source listings for the gamma function and the incomplete beta
-// integral.
-//
-//   Stephen L. Moshier
-//   moshier@na-net.ornl.gov
-
-// Complex exponential function
-//
-// DESCRIPTION:
-//
-// Returns the complex exponential of the complex argument z.
-//
-// If
-//     z = x + iy,
-//     r = exp(x),
-// then
-//     w = r cos y + i r sin y.
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    DEC       -10,+10      8700       3.7e-17     1.1e-17
-//    IEEE      -10,+10     30000       3.0e-16     8.7e-17
-
-// Exp returns e**x, the base-e exponential of x.
-func Exp(x complex128) complex128 {
-	r := math.Exp(real(x))
-	s, c := math.Sincos(imag(x))
-	return complex(r*c, r*s)
-}
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/isinf.go b/third_party/gofrontend/libgo/go/math/cmplx/isinf.go
deleted file mode 100644
index d5a65b4..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/isinf.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-import "math"
-
-// IsInf returns true if either real(x) or imag(x) is an infinity.
-func IsInf(x complex128) bool {
-	if math.IsInf(real(x), 0) || math.IsInf(imag(x), 0) {
-		return true
-	}
-	return false
-}
-
-// Inf returns a complex infinity, complex(+Inf, +Inf).
-func Inf() complex128 {
-	inf := math.Inf(1)
-	return complex(inf, inf)
-}
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/isnan.go b/third_party/gofrontend/libgo/go/math/cmplx/isnan.go
deleted file mode 100644
index 05d0cce..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/isnan.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-import "math"
-
-// IsNaN returns true if either real(x) or imag(x) is NaN
-// and neither is an infinity.
-func IsNaN(x complex128) bool {
-	switch {
-	case math.IsInf(real(x), 0) || math.IsInf(imag(x), 0):
-		return false
-	case math.IsNaN(real(x)) || math.IsNaN(imag(x)):
-		return true
-	}
-	return false
-}
-
-// NaN returns a complex ``not-a-number'' value.
-func NaN() complex128 {
-	nan := math.NaN()
-	return complex(nan, nan)
-}
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/log.go b/third_party/gofrontend/libgo/go/math/cmplx/log.go
deleted file mode 100644
index 881a064..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/log.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-import "math"
-
-// The original C code, the long comment, and the constants
-// below are from http://netlib.sandia.gov/cephes/c9x-complex/clog.c.
-// The go code is a simplified version of the original C.
-//
-// Cephes Math Library Release 2.8:  June, 2000
-// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
-//
-// The readme file at http://netlib.sandia.gov/cephes/ says:
-//    Some software in this archive may be from the book _Methods and
-// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
-// International, 1989) or from the Cephes Mathematical Library, a
-// commercial product. In either event, it is copyrighted by the author.
-// What you see here may be used freely but it comes with no support or
-// guarantee.
-//
-//   The two known misprints in the book are repaired here in the
-// source listings for the gamma function and the incomplete beta
-// integral.
-//
-//   Stephen L. Moshier
-//   moshier@na-net.ornl.gov
-
-// Complex natural logarithm
-//
-// DESCRIPTION:
-//
-// Returns complex logarithm to the base e (2.718...) of
-// the complex argument z.
-//
-// If
-//       z = x + iy, r = sqrt( x**2 + y**2 ),
-// then
-//       w = log(r) + i arctan(y/x).
-//
-// The arctangent ranges from -PI to +PI.
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    DEC       -10,+10      7000       8.5e-17     1.9e-17
-//    IEEE      -10,+10     30000       5.0e-15     1.1e-16
-//
-// Larger relative error can be observed for z near 1 +i0.
-// In IEEE arithmetic the peak absolute error is 5.2e-16, rms
-// absolute error 1.0e-16.
-
-// Log returns the natural logarithm of x.
-func Log(x complex128) complex128 {
-	return complex(math.Log(Abs(x)), Phase(x))
-}
-
-// Log10 returns the decimal logarithm of x.
-func Log10(x complex128) complex128 {
-	return math.Log10E * Log(x)
-}
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/phase.go b/third_party/gofrontend/libgo/go/math/cmplx/phase.go
deleted file mode 100644
index 03cece8..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/phase.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-import "math"
-
-// Phase returns the phase (also called the argument) of x.
-// The returned value is in the range [-Pi, Pi].
-func Phase(x complex128) float64 { return math.Atan2(imag(x), real(x)) }
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/polar.go b/third_party/gofrontend/libgo/go/math/cmplx/polar.go
deleted file mode 100644
index 9b192bc..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/polar.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-// Polar returns the absolute value r and phase θ of x,
-// such that x = r * e**θi.
-// The phase is in the range [-Pi, Pi].
-func Polar(x complex128) (r, θ float64) {
-	return Abs(x), Phase(x)
-}
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/pow.go b/third_party/gofrontend/libgo/go/math/cmplx/pow.go
deleted file mode 100644
index 1630b87..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/pow.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-import "math"
-
-// The original C code, the long comment, and the constants
-// below are from http://netlib.sandia.gov/cephes/c9x-complex/clog.c.
-// The go code is a simplified version of the original C.
-//
-// Cephes Math Library Release 2.8:  June, 2000
-// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
-//
-// The readme file at http://netlib.sandia.gov/cephes/ says:
-//    Some software in this archive may be from the book _Methods and
-// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
-// International, 1989) or from the Cephes Mathematical Library, a
-// commercial product. In either event, it is copyrighted by the author.
-// What you see here may be used freely but it comes with no support or
-// guarantee.
-//
-//   The two known misprints in the book are repaired here in the
-// source listings for the gamma function and the incomplete beta
-// integral.
-//
-//   Stephen L. Moshier
-//   moshier@na-net.ornl.gov
-
-// Complex power function
-//
-// DESCRIPTION:
-//
-// Raises complex A to the complex Zth power.
-// Definition is per AMS55 # 4.2.8,
-// analytically equivalent to cpow(a,z) = cexp(z clog(a)).
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    IEEE      -10,+10     30000       9.4e-15     1.5e-15
-
-// Pow returns x**y, the base-x exponential of y.
-// For generalized compatibility with math.Pow:
-//	Pow(0, ±0) returns 1+0i
-//	Pow(0, c) for real(c)<0 returns Inf+0i if imag(c) is zero, otherwise Inf+Inf i.
-func Pow(x, y complex128) complex128 {
-	if x == 0 { // Guaranteed also true for x == -0.
-		r, i := real(y), imag(y)
-		switch {
-		case r == 0:
-			return 1
-		case r < 0:
-			if i == 0 {
-				return complex(math.Inf(1), 0)
-			}
-			return Inf()
-		case r > 0:
-			return 0
-		}
-		panic("not reached")
-	}
-	modulus := Abs(x)
-	if modulus == 0 {
-		return complex(0, 0)
-	}
-	r := math.Pow(modulus, real(y))
-	arg := Phase(x)
-	theta := real(y) * arg
-	if imag(y) != 0 {
-		r *= math.Exp(-imag(y) * arg)
-		theta += imag(y) * math.Log(modulus)
-	}
-	s, c := math.Sincos(theta)
-	return complex(r*c, r*s)
-}
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/rect.go b/third_party/gofrontend/libgo/go/math/cmplx/rect.go
deleted file mode 100644
index bf94d78..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/rect.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-import "math"
-
-// Rect returns the complex number x with polar coordinates r, θ.
-func Rect(r, θ float64) complex128 {
-	s, c := math.Sincos(θ)
-	return complex(r*c, r*s)
-}
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/sin.go b/third_party/gofrontend/libgo/go/math/cmplx/sin.go
deleted file mode 100644
index 2c57536..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/sin.go
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-import "math"
-
-// The original C code, the long comment, and the constants
-// below are from http://netlib.sandia.gov/cephes/c9x-complex/clog.c.
-// The go code is a simplified version of the original C.
-//
-// Cephes Math Library Release 2.8:  June, 2000
-// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
-//
-// The readme file at http://netlib.sandia.gov/cephes/ says:
-//    Some software in this archive may be from the book _Methods and
-// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
-// International, 1989) or from the Cephes Mathematical Library, a
-// commercial product. In either event, it is copyrighted by the author.
-// What you see here may be used freely but it comes with no support or
-// guarantee.
-//
-//   The two known misprints in the book are repaired here in the
-// source listings for the gamma function and the incomplete beta
-// integral.
-//
-//   Stephen L. Moshier
-//   moshier@na-net.ornl.gov
-
-// Complex circular sine
-//
-// DESCRIPTION:
-//
-// If
-//     z = x + iy,
-//
-// then
-//
-//     w = sin x  cosh y  +  i cos x sinh y.
-//
-// csin(z) = -i csinh(iz).
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    DEC       -10,+10      8400       5.3e-17     1.3e-17
-//    IEEE      -10,+10     30000       3.8e-16     1.0e-16
-// Also tested by csin(casin(z)) = z.
-
-// Sin returns the sine of x.
-func Sin(x complex128) complex128 {
-	s, c := math.Sincos(real(x))
-	sh, ch := sinhcosh(imag(x))
-	return complex(s*ch, c*sh)
-}
-
-// Complex hyperbolic sine
-//
-// DESCRIPTION:
-//
-// csinh z = (cexp(z) - cexp(-z))/2
-//         = sinh x * cos y  +  i cosh x * sin y .
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    IEEE      -10,+10     30000       3.1e-16     8.2e-17
-
-// Sinh returns the hyperbolic sine of x.
-func Sinh(x complex128) complex128 {
-	s, c := math.Sincos(imag(x))
-	sh, ch := sinhcosh(real(x))
-	return complex(c*sh, s*ch)
-}
-
-// Complex circular cosine
-//
-// DESCRIPTION:
-//
-// If
-//     z = x + iy,
-//
-// then
-//
-//     w = cos x  cosh y  -  i sin x sinh y.
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    DEC       -10,+10      8400       4.5e-17     1.3e-17
-//    IEEE      -10,+10     30000       3.8e-16     1.0e-16
-
-// Cos returns the cosine of x.
-func Cos(x complex128) complex128 {
-	s, c := math.Sincos(real(x))
-	sh, ch := sinhcosh(imag(x))
-	return complex(c*ch, -s*sh)
-}
-
-// Complex hyperbolic cosine
-//
-// DESCRIPTION:
-//
-// ccosh(z) = cosh x  cos y + i sinh x sin y .
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    IEEE      -10,+10     30000       2.9e-16     8.1e-17
-
-// Cosh returns the hyperbolic cosine of x.
-func Cosh(x complex128) complex128 {
-	s, c := math.Sincos(imag(x))
-	sh, ch := sinhcosh(real(x))
-	return complex(c*ch, s*sh)
-}
-
-// calculate sinh and cosh
-func sinhcosh(x float64) (sh, ch float64) {
-	if math.Abs(x) <= 0.5 {
-		return math.Sinh(x), math.Cosh(x)
-	}
-	e := math.Exp(x)
-	ei := 0.5 / e
-	e *= 0.5
-	return e - ei, e + ei
-}
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/sqrt.go b/third_party/gofrontend/libgo/go/math/cmplx/sqrt.go
deleted file mode 100644
index 4ef6807..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/sqrt.go
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-import "math"
-
-// The original C code, the long comment, and the constants
-// below are from http://netlib.sandia.gov/cephes/c9x-complex/clog.c.
-// The go code is a simplified version of the original C.
-//
-// Cephes Math Library Release 2.8:  June, 2000
-// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
-//
-// The readme file at http://netlib.sandia.gov/cephes/ says:
-//    Some software in this archive may be from the book _Methods and
-// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
-// International, 1989) or from the Cephes Mathematical Library, a
-// commercial product. In either event, it is copyrighted by the author.
-// What you see here may be used freely but it comes with no support or
-// guarantee.
-//
-//   The two known misprints in the book are repaired here in the
-// source listings for the gamma function and the incomplete beta
-// integral.
-//
-//   Stephen L. Moshier
-//   moshier@na-net.ornl.gov
-
-// Complex square root
-//
-// DESCRIPTION:
-//
-// If z = x + iy,  r = |z|, then
-//
-//                       1/2
-// Re w  =  [ (r + x)/2 ]   ,
-//
-//                       1/2
-// Im w  =  [ (r - x)/2 ]   .
-//
-// Cancellation error in r-x or r+x is avoided by using the
-// identity  2 Re w Im w  =  y.
-//
-// Note that -w is also a square root of z.  The root chosen
-// is always in the right half plane and Im w has the same sign as y.
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    DEC       -10,+10     25000       3.2e-17     9.6e-18
-//    IEEE      -10,+10   1,000,000     2.9e-16     6.1e-17
-
-// Sqrt returns the square root of x.
-// The result r is chosen so that real(r) ≥ 0 and imag(r) has the same sign as imag(x).
-func Sqrt(x complex128) complex128 {
-	if imag(x) == 0 {
-		if real(x) == 0 {
-			return complex(0, 0)
-		}
-		if real(x) < 0 {
-			return complex(0, math.Sqrt(-real(x)))
-		}
-		return complex(math.Sqrt(real(x)), 0)
-	}
-	if real(x) == 0 {
-		if imag(x) < 0 {
-			r := math.Sqrt(-0.5 * imag(x))
-			return complex(r, -r)
-		}
-		r := math.Sqrt(0.5 * imag(x))
-		return complex(r, r)
-	}
-	a := real(x)
-	b := imag(x)
-	var scale float64
-	// Rescale to avoid internal overflow or underflow.
-	if math.Abs(a) > 4 || math.Abs(b) > 4 {
-		a *= 0.25
-		b *= 0.25
-		scale = 2
-	} else {
-		a *= 1.8014398509481984e16 // 2**54
-		b *= 1.8014398509481984e16
-		scale = 7.450580596923828125e-9 // 2**-27
-	}
-	r := math.Hypot(a, b)
-	var t float64
-	if a > 0 {
-		t = math.Sqrt(0.5*r + 0.5*a)
-		r = scale * math.Abs((0.5*b)/t)
-		t *= scale
-	} else {
-		r = math.Sqrt(0.5*r - 0.5*a)
-		t = scale * math.Abs((0.5*b)/r)
-		r *= scale
-	}
-	if b < 0 {
-		return complex(t, -r)
-	}
-	return complex(t, r)
-}
diff --git a/third_party/gofrontend/libgo/go/math/cmplx/tan.go b/third_party/gofrontend/libgo/go/math/cmplx/tan.go
deleted file mode 100644
index 9485315..0000000
--- a/third_party/gofrontend/libgo/go/math/cmplx/tan.go
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cmplx
-
-import "math"
-
-// The original C code, the long comment, and the constants
-// below are from http://netlib.sandia.gov/cephes/c9x-complex/clog.c.
-// The go code is a simplified version of the original C.
-//
-// Cephes Math Library Release 2.8:  June, 2000
-// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
-//
-// The readme file at http://netlib.sandia.gov/cephes/ says:
-//    Some software in this archive may be from the book _Methods and
-// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
-// International, 1989) or from the Cephes Mathematical Library, a
-// commercial product. In either event, it is copyrighted by the author.
-// What you see here may be used freely but it comes with no support or
-// guarantee.
-//
-//   The two known misprints in the book are repaired here in the
-// source listings for the gamma function and the incomplete beta
-// integral.
-//
-//   Stephen L. Moshier
-//   moshier@na-net.ornl.gov
-
-// Complex circular tangent
-//
-// DESCRIPTION:
-//
-// If
-//     z = x + iy,
-//
-// then
-//
-//           sin 2x  +  i sinh 2y
-//     w  =  --------------------.
-//            cos 2x  +  cosh 2y
-//
-// On the real axis the denominator is zero at odd multiples
-// of PI/2.  The denominator is evaluated by its Taylor
-// series near these points.
-//
-// ctan(z) = -i ctanh(iz).
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    DEC       -10,+10      5200       7.1e-17     1.6e-17
-//    IEEE      -10,+10     30000       7.2e-16     1.2e-16
-// Also tested by ctan * ccot = 1 and catan(ctan(z))  =  z.
-
-// Tan returns the tangent of x.
-func Tan(x complex128) complex128 {
-	d := math.Cos(2*real(x)) + math.Cosh(2*imag(x))
-	if math.Abs(d) < 0.25 {
-		d = tanSeries(x)
-	}
-	if d == 0 {
-		return Inf()
-	}
-	return complex(math.Sin(2*real(x))/d, math.Sinh(2*imag(x))/d)
-}
-
-// Complex hyperbolic tangent
-//
-// DESCRIPTION:
-//
-// tanh z = (sinh 2x  +  i sin 2y) / (cosh 2x + cos 2y) .
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    IEEE      -10,+10     30000       1.7e-14     2.4e-16
-
-// Tanh returns the hyperbolic tangent of x.
-func Tanh(x complex128) complex128 {
-	d := math.Cosh(2*real(x)) + math.Cos(2*imag(x))
-	if d == 0 {
-		return Inf()
-	}
-	return complex(math.Sinh(2*real(x))/d, math.Sin(2*imag(x))/d)
-}
-
-// Program to subtract nearest integer multiple of PI
-func reducePi(x float64) float64 {
-	const (
-		// extended precision value of PI:
-		DP1 = 3.14159265160560607910E0   // ?? 0x400921fb54000000
-		DP2 = 1.98418714791870343106E-9  // ?? 0x3e210b4610000000
-		DP3 = 1.14423774522196636802E-17 // ?? 0x3c6a62633145c06e
-	)
-	t := x / math.Pi
-	if t >= 0 {
-		t += 0.5
-	} else {
-		t -= 0.5
-	}
-	t = float64(int64(t)) // int64(t) = the multiple
-	return ((x - t*DP1) - t*DP2) - t*DP3
-}
-
-// Taylor series expansion for cosh(2y) - cos(2x)
-func tanSeries(z complex128) float64 {
-	const MACHEP = 1.0 / (1 << 53)
-	x := math.Abs(2 * real(z))
-	y := math.Abs(2 * imag(z))
-	x = reducePi(x)
-	x = x * x
-	y = y * y
-	x2 := 1.0
-	y2 := 1.0
-	f := 1.0
-	rn := 0.0
-	d := 0.0
-	for {
-		rn += 1
-		f *= rn
-		rn += 1
-		f *= rn
-		x2 *= x
-		y2 *= y
-		t := y2 + x2
-		t /= f
-		d += t
-
-		rn += 1
-		f *= rn
-		rn += 1
-		f *= rn
-		x2 *= x
-		y2 *= y
-		t = y2 - x2
-		t /= f
-		d += t
-		if math.Abs(t/d) <= MACHEP {
-			break
-		}
-	}
-	return d
-}
-
-// Complex circular cotangent
-//
-// DESCRIPTION:
-//
-// If
-//     z = x + iy,
-//
-// then
-//
-//           sin 2x  -  i sinh 2y
-//     w  =  --------------------.
-//            cosh 2y  -  cos 2x
-//
-// On the real axis, the denominator has zeros at even
-// multiples of PI/2.  Near these points it is evaluated
-// by a Taylor series.
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    DEC       -10,+10      3000       6.5e-17     1.6e-17
-//    IEEE      -10,+10     30000       9.2e-16     1.2e-16
-// Also tested by ctan * ccot = 1 + i0.
-
-// Cot returns the cotangent of x.
-func Cot(x complex128) complex128 {
-	d := math.Cosh(2*imag(x)) - math.Cos(2*real(x))
-	if math.Abs(d) < 0.25 {
-		d = tanSeries(x)
-	}
-	if d == 0 {
-		return Inf()
-	}
-	return complex(math.Sin(2*real(x))/d, -math.Sinh(2*imag(x))/d)
-}
diff --git a/third_party/gofrontend/libgo/go/math/const.go b/third_party/gofrontend/libgo/go/math/const.go
deleted file mode 100644
index b440538..0000000
--- a/third_party/gofrontend/libgo/go/math/const.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package math provides basic constants and mathematical functions.
-package math
-
-// Mathematical constants.
-const (
-	E   = 2.71828182845904523536028747135266249775724709369995957496696763 // http://oeis.org/A001113
-	Pi  = 3.14159265358979323846264338327950288419716939937510582097494459 // http://oeis.org/A000796
-	Phi = 1.61803398874989484820458683436563811772030917980576286213544862 // http://oeis.org/A001622
-
-	Sqrt2   = 1.41421356237309504880168872420969807856967187537694807317667974 // http://oeis.org/A002193
-	SqrtE   = 1.64872127070012814684865078781416357165377610071014801157507931 // http://oeis.org/A019774
-	SqrtPi  = 1.77245385090551602729816748334114518279754945612238712821380779 // http://oeis.org/A002161
-	SqrtPhi = 1.27201964951406896425242246173749149171560804184009624861664038 // http://oeis.org/A139339
-
-	Ln2    = 0.693147180559945309417232121458176568075500134360255254120680009 // http://oeis.org/A002162
-	Log2E  = 1 / Ln2
-	Ln10   = 2.30258509299404568401799145468436420760110148862877297603332790 // http://oeis.org/A002392
-	Log10E = 1 / Ln10
-)
-
-// Floating-point limit values.
-// Max is the largest finite value representable by the type.
-// SmallestNonzero is the smallest positive, non-zero value representable by the type.
-const (
-	MaxFloat32             = 3.40282346638528859811704183484516925440e+38  // 2**127 * (2**24 - 1) / 2**23
-	SmallestNonzeroFloat32 = 1.401298464324817070923729583289916131280e-45 // 1 / 2**(127 - 1 + 23)
-
-	MaxFloat64             = 1.797693134862315708145274237317043567981e+308 // 2**1023 * (2**53 - 1) / 2**52
-	SmallestNonzeroFloat64 = 4.940656458412465441765687928682213723651e-324 // 1 / 2**(1023 - 1 + 52)
-)
-
-// Integer limit values.
-const (
-	MaxInt8   = 1<<7 - 1
-	MinInt8   = -1 << 7
-	MaxInt16  = 1<<15 - 1
-	MinInt16  = -1 << 15
-	MaxInt32  = 1<<31 - 1
-	MinInt32  = -1 << 31
-	MaxInt64  = 1<<63 - 1
-	MinInt64  = -1 << 63
-	MaxUint8  = 1<<8 - 1
-	MaxUint16 = 1<<16 - 1
-	MaxUint32 = 1<<32 - 1
-	MaxUint64 = 1<<64 - 1
-)
diff --git a/third_party/gofrontend/libgo/go/math/copysign.go b/third_party/gofrontend/libgo/go/math/copysign.go
deleted file mode 100644
index 719c64b..0000000
--- a/third_party/gofrontend/libgo/go/math/copysign.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Copysign returns a value with the magnitude
-// of x and the sign of y.
-func Copysign(x, y float64) float64 {
-	const sign = 1 << 63
-	return Float64frombits(Float64bits(x)&^sign | Float64bits(y)&sign)
-}
diff --git a/third_party/gofrontend/libgo/go/math/dim.go b/third_party/gofrontend/libgo/go/math/dim.go
deleted file mode 100644
index 37ab538..0000000
--- a/third_party/gofrontend/libgo/go/math/dim.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Dim returns the maximum of x-y or 0.
-//
-// Special cases are:
-//	Dim(+Inf, +Inf) = NaN
-//	Dim(-Inf, -Inf) = NaN
-//	Dim(x, NaN) = Dim(NaN, x) = NaN
-func Dim(x, y float64) float64 {
-	return dim(x, y)
-}
-
-func dim(x, y float64) float64 {
-	return max(x-y, 0)
-}
-
-// Max returns the larger of x or y.
-//
-// Special cases are:
-//	Max(x, +Inf) = Max(+Inf, x) = +Inf
-//	Max(x, NaN) = Max(NaN, x) = NaN
-//	Max(+0, ±0) = Max(±0, +0) = +0
-//	Max(-0, -0) = -0
-func Max(x, y float64) float64 {
-	return max(x, y)
-}
-
-func max(x, y float64) float64 {
-	// special cases
-	switch {
-	case IsInf(x, 1) || IsInf(y, 1):
-		return Inf(1)
-	case IsNaN(x) || IsNaN(y):
-		return NaN()
-	case x == 0 && x == y:
-		if Signbit(x) {
-			return y
-		}
-		return x
-	}
-	if x > y {
-		return x
-	}
-	return y
-}
-
-// Min returns the smaller of x or y.
-//
-// Special cases are:
-//	Min(x, -Inf) = Min(-Inf, x) = -Inf
-//	Min(x, NaN) = Min(NaN, x) = NaN
-//	Min(-0, ±0) = Min(±0, -0) = -0
-func Min(x, y float64) float64 {
-	return min(x, y)
-}
-
-func min(x, y float64) float64 {
-	// special cases
-	switch {
-	case IsInf(x, -1) || IsInf(y, -1):
-		return Inf(-1)
-	case IsNaN(x) || IsNaN(y):
-		return NaN()
-	case x == 0 && x == y:
-		if Signbit(x) {
-			return x
-		}
-		return y
-	}
-	if x < y {
-		return x
-	}
-	return y
-}
diff --git a/third_party/gofrontend/libgo/go/math/erf.go b/third_party/gofrontend/libgo/go/math/erf.go
deleted file mode 100644
index 4cd80f8..0000000
--- a/third_party/gofrontend/libgo/go/math/erf.go
+++ /dev/null
@@ -1,335 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-/*
-	Floating-point error function and complementary error function.
-*/
-
-// The original C code and the long comment below are
-// from FreeBSD's /usr/src/lib/msun/src/s_erf.c and
-// came with this notice.  The go code is a simplified
-// version of the original C.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunPro, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-//
-// double erf(double x)
-// double erfc(double x)
-//                           x
-//                    2      |\
-//     erf(x)  =  ---------  | exp(-t*t)dt
-//                 sqrt(pi) \|
-//                           0
-//
-//     erfc(x) =  1-erf(x)
-//  Note that
-//              erf(-x) = -erf(x)
-//              erfc(-x) = 2 - erfc(x)
-//
-// Method:
-//      1. For |x| in [0, 0.84375]
-//          erf(x)  = x + x*R(x**2)
-//          erfc(x) = 1 - erf(x)           if x in [-.84375,0.25]
-//                  = 0.5 + ((0.5-x)-x*R)  if x in [0.25,0.84375]
-//         where R = P/Q where P is an odd poly of degree 8 and
-//         Q is an odd poly of degree 10.
-//                                               -57.90
-//                      | R - (erf(x)-x)/x | <= 2
-//
-//
-//         Remark. The formula is derived by noting
-//          erf(x) = (2/sqrt(pi))*(x - x**3/3 + x**5/10 - x**7/42 + ....)
-//         and that
-//          2/sqrt(pi) = 1.128379167095512573896158903121545171688
-//         is close to one. The interval is chosen because the fix
-//         point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is
-//         near 0.6174), and by some experiment, 0.84375 is chosen to
-//         guarantee the error is less than one ulp for erf.
-//
-//      2. For |x| in [0.84375,1.25], let s = |x| - 1, and
-//         c = 0.84506291151 rounded to single (24 bits)
-//              erf(x)  = sign(x) * (c  + P1(s)/Q1(s))
-//              erfc(x) = (1-c)  - P1(s)/Q1(s) if x > 0
-//                        1+(c+P1(s)/Q1(s))    if x < 0
-//              |P1/Q1 - (erf(|x|)-c)| <= 2**-59.06
-//         Remark: here we use the taylor series expansion at x=1.
-//              erf(1+s) = erf(1) + s*Poly(s)
-//                       = 0.845.. + P1(s)/Q1(s)
-//         That is, we use rational approximation to approximate
-//                      erf(1+s) - (c = (single)0.84506291151)
-//         Note that |P1/Q1|< 0.078 for x in [0.84375,1.25]
-//         where
-//              P1(s) = degree 6 poly in s
-//              Q1(s) = degree 6 poly in s
-//
-//      3. For x in [1.25,1/0.35(~2.857143)],
-//              erfc(x) = (1/x)*exp(-x*x-0.5625+R1/S1)
-//              erf(x)  = 1 - erfc(x)
-//         where
-//              R1(z) = degree 7 poly in z, (z=1/x**2)
-//              S1(z) = degree 8 poly in z
-//
-//      4. For x in [1/0.35,28]
-//              erfc(x) = (1/x)*exp(-x*x-0.5625+R2/S2) if x > 0
-//                      = 2.0 - (1/x)*exp(-x*x-0.5625+R2/S2) if -6<x<0
-//                      = 2.0 - tiny            (if x <= -6)
-//              erf(x)  = sign(x)*(1.0 - erfc(x)) if x < 6, else
-//              erf(x)  = sign(x)*(1.0 - tiny)
-//         where
-//              R2(z) = degree 6 poly in z, (z=1/x**2)
-//              S2(z) = degree 7 poly in z
-//
-//      Note1:
-//         To compute exp(-x*x-0.5625+R/S), let s be a single
-//         precision number and s := x; then
-//              -x*x = -s*s + (s-x)*(s+x)
-//              exp(-x*x-0.5626+R/S) =
-//                      exp(-s*s-0.5625)*exp((s-x)*(s+x)+R/S);
-//      Note2:
-//         Here 4 and 5 make use of the asymptotic series
-//                        exp(-x*x)
-//              erfc(x) ~ ---------- * ( 1 + Poly(1/x**2) )
-//                        x*sqrt(pi)
-//         We use rational approximation to approximate
-//              g(s)=f(1/x**2) = log(erfc(x)*x) - x*x + 0.5625
-//         Here is the error bound for R1/S1 and R2/S2
-//              |R1/S1 - f(x)|  < 2**(-62.57)
-//              |R2/S2 - f(x)|  < 2**(-61.52)
-//
-//      5. For inf > x >= 28
-//              erf(x)  = sign(x) *(1 - tiny)  (raise inexact)
-//              erfc(x) = tiny*tiny (raise underflow) if x > 0
-//                      = 2 - tiny if x<0
-//
-//      7. Special case:
-//              erf(0)  = 0, erf(inf)  = 1, erf(-inf) = -1,
-//              erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2,
-//              erfc/erf(NaN) is NaN
-
-const (
-	erx = 8.45062911510467529297e-01 // 0x3FEB0AC160000000
-	// Coefficients for approximation to  erf in [0, 0.84375]
-	efx  = 1.28379167095512586316e-01  // 0x3FC06EBA8214DB69
-	efx8 = 1.02703333676410069053e+00  // 0x3FF06EBA8214DB69
-	pp0  = 1.28379167095512558561e-01  // 0x3FC06EBA8214DB68
-	pp1  = -3.25042107247001499370e-01 // 0xBFD4CD7D691CB913
-	pp2  = -2.84817495755985104766e-02 // 0xBF9D2A51DBD7194F
-	pp3  = -5.77027029648944159157e-03 // 0xBF77A291236668E4
-	pp4  = -2.37630166566501626084e-05 // 0xBEF8EAD6120016AC
-	qq1  = 3.97917223959155352819e-01  // 0x3FD97779CDDADC09
-	qq2  = 6.50222499887672944485e-02  // 0x3FB0A54C5536CEBA
-	qq3  = 5.08130628187576562776e-03  // 0x3F74D022C4D36B0F
-	qq4  = 1.32494738004321644526e-04  // 0x3F215DC9221C1A10
-	qq5  = -3.96022827877536812320e-06 // 0xBED09C4342A26120
-	// Coefficients for approximation to  erf  in [0.84375, 1.25]
-	pa0 = -2.36211856075265944077e-03 // 0xBF6359B8BEF77538
-	pa1 = 4.14856118683748331666e-01  // 0x3FDA8D00AD92B34D
-	pa2 = -3.72207876035701323847e-01 // 0xBFD7D240FBB8C3F1
-	pa3 = 3.18346619901161753674e-01  // 0x3FD45FCA805120E4
-	pa4 = -1.10894694282396677476e-01 // 0xBFBC63983D3E28EC
-	pa5 = 3.54783043256182359371e-02  // 0x3FA22A36599795EB
-	pa6 = -2.16637559486879084300e-03 // 0xBF61BF380A96073F
-	qa1 = 1.06420880400844228286e-01  // 0x3FBB3E6618EEE323
-	qa2 = 5.40397917702171048937e-01  // 0x3FE14AF092EB6F33
-	qa3 = 7.18286544141962662868e-02  // 0x3FB2635CD99FE9A7
-	qa4 = 1.26171219808761642112e-01  // 0x3FC02660E763351F
-	qa5 = 1.36370839120290507362e-02  // 0x3F8BEDC26B51DD1C
-	qa6 = 1.19844998467991074170e-02  // 0x3F888B545735151D
-	// Coefficients for approximation to  erfc in [1.25, 1/0.35]
-	ra0 = -9.86494403484714822705e-03 // 0xBF843412600D6435
-	ra1 = -6.93858572707181764372e-01 // 0xBFE63416E4BA7360
-	ra2 = -1.05586262253232909814e+01 // 0xC0251E0441B0E726
-	ra3 = -6.23753324503260060396e+01 // 0xC04F300AE4CBA38D
-	ra4 = -1.62396669462573470355e+02 // 0xC0644CB184282266
-	ra5 = -1.84605092906711035994e+02 // 0xC067135CEBCCABB2
-	ra6 = -8.12874355063065934246e+01 // 0xC054526557E4D2F2
-	ra7 = -9.81432934416914548592e+00 // 0xC023A0EFC69AC25C
-	sa1 = 1.96512716674392571292e+01  // 0x4033A6B9BD707687
-	sa2 = 1.37657754143519042600e+02  // 0x4061350C526AE721
-	sa3 = 4.34565877475229228821e+02  // 0x407B290DD58A1A71
-	sa4 = 6.45387271733267880336e+02  // 0x40842B1921EC2868
-	sa5 = 4.29008140027567833386e+02  // 0x407AD02157700314
-	sa6 = 1.08635005541779435134e+02  // 0x405B28A3EE48AE2C
-	sa7 = 6.57024977031928170135e+00  // 0x401A47EF8E484A93
-	sa8 = -6.04244152148580987438e-02 // 0xBFAEEFF2EE749A62
-	// Coefficients for approximation to  erfc in [1/.35, 28]
-	rb0 = -9.86494292470009928597e-03 // 0xBF84341239E86F4A
-	rb1 = -7.99283237680523006574e-01 // 0xBFE993BA70C285DE
-	rb2 = -1.77579549177547519889e+01 // 0xC031C209555F995A
-	rb3 = -1.60636384855821916062e+02 // 0xC064145D43C5ED98
-	rb4 = -6.37566443368389627722e+02 // 0xC083EC881375F228
-	rb5 = -1.02509513161107724954e+03 // 0xC09004616A2E5992
-	rb6 = -4.83519191608651397019e+02 // 0xC07E384E9BDC383F
-	sb1 = 3.03380607434824582924e+01  // 0x403E568B261D5190
-	sb2 = 3.25792512996573918826e+02  // 0x40745CAE221B9F0A
-	sb3 = 1.53672958608443695994e+03  // 0x409802EB189D5118
-	sb4 = 3.19985821950859553908e+03  // 0x40A8FFB7688C246A
-	sb5 = 2.55305040643316442583e+03  // 0x40A3F219CEDF3BE6
-	sb6 = 4.74528541206955367215e+02  // 0x407DA874E79FE763
-	sb7 = -2.24409524465858183362e+01 // 0xC03670E242712D62
-)
-
-// Erf returns the error function of x.
-//
-// Special cases are:
-//	Erf(+Inf) = 1
-//	Erf(-Inf) = -1
-//	Erf(NaN) = NaN
-func Erf(x float64) float64 {
-	const (
-		VeryTiny = 2.848094538889218e-306 // 0x0080000000000000
-		Small    = 1.0 / (1 << 28)        // 2**-28
-	)
-	// special cases
-	switch {
-	case IsNaN(x):
-		return NaN()
-	case IsInf(x, 1):
-		return 1
-	case IsInf(x, -1):
-		return -1
-	}
-	sign := false
-	if x < 0 {
-		x = -x
-		sign = true
-	}
-	if x < 0.84375 { // |x| < 0.84375
-		var temp float64
-		if x < Small { // |x| < 2**-28
-			if x < VeryTiny {
-				temp = 0.125 * (8.0*x + efx8*x) // avoid underflow
-			} else {
-				temp = x + efx*x
-			}
-		} else {
-			z := x * x
-			r := pp0 + z*(pp1+z*(pp2+z*(pp3+z*pp4)))
-			s := 1 + z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))))
-			y := r / s
-			temp = x + x*y
-		}
-		if sign {
-			return -temp
-		}
-		return temp
-	}
-	if x < 1.25 { // 0.84375 <= |x| < 1.25
-		s := x - 1
-		P := pa0 + s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))))
-		Q := 1 + s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))))
-		if sign {
-			return -erx - P/Q
-		}
-		return erx + P/Q
-	}
-	if x >= 6 { // inf > |x| >= 6
-		if sign {
-			return -1
-		}
-		return 1
-	}
-	s := 1 / (x * x)
-	var R, S float64
-	if x < 1/0.35 { // |x| < 1 / 0.35  ~ 2.857143
-		R = ra0 + s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*ra7))))))
-		S = 1 + s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+s*sa8)))))))
-	} else { // |x| >= 1 / 0.35  ~ 2.857143
-		R = rb0 + s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*rb6)))))
-		S = 1 + s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))))
-	}
-	z := Float64frombits(Float64bits(x) & 0xffffffff00000000) // pseudo-single (20-bit) precision x
-	r := Exp(-z*z-0.5625) * Exp((z-x)*(z+x)+R/S)
-	if sign {
-		return r/x - 1
-	}
-	return 1 - r/x
-}
-
-// Erfc returns the complementary error function of x.
-//
-// Special cases are:
-//	Erfc(+Inf) = 0
-//	Erfc(-Inf) = 2
-//	Erfc(NaN) = NaN
-func Erfc(x float64) float64 {
-	const Tiny = 1.0 / (1 << 56) // 2**-56
-	// special cases
-	switch {
-	case IsNaN(x):
-		return NaN()
-	case IsInf(x, 1):
-		return 0
-	case IsInf(x, -1):
-		return 2
-	}
-	sign := false
-	if x < 0 {
-		x = -x
-		sign = true
-	}
-	if x < 0.84375 { // |x| < 0.84375
-		var temp float64
-		if x < Tiny { // |x| < 2**-56
-			temp = x
-		} else {
-			z := x * x
-			r := pp0 + z*(pp1+z*(pp2+z*(pp3+z*pp4)))
-			s := 1 + z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))))
-			y := r / s
-			if x < 0.25 { // |x| < 1/4
-				temp = x + x*y
-			} else {
-				temp = 0.5 + (x*y + (x - 0.5))
-			}
-		}
-		if sign {
-			return 1 + temp
-		}
-		return 1 - temp
-	}
-	if x < 1.25 { // 0.84375 <= |x| < 1.25
-		s := x - 1
-		P := pa0 + s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))))
-		Q := 1 + s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))))
-		if sign {
-			return 1 + erx + P/Q
-		}
-		return 1 - erx - P/Q
-
-	}
-	if x < 28 { // |x| < 28
-		s := 1 / (x * x)
-		var R, S float64
-		if x < 1/0.35 { // |x| < 1 / 0.35 ~ 2.857143
-			R = ra0 + s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(ra5+s*(ra6+s*ra7))))))
-			S = 1 + s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(sa5+s*(sa6+s*(sa7+s*sa8)))))))
-		} else { // |x| >= 1 / 0.35 ~ 2.857143
-			if sign && x > 6 {
-				return 2 // x < -6
-			}
-			R = rb0 + s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+s*rb6)))))
-			S = 1 + s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(sb5+s*(sb6+s*sb7))))))
-		}
-		z := Float64frombits(Float64bits(x) & 0xffffffff00000000) // pseudo-single (20-bit) precision x
-		r := Exp(-z*z-0.5625) * Exp((z-x)*(z+x)+R/S)
-		if sign {
-			return 2 - r/x
-		}
-		return r / x
-	}
-	if sign {
-		return 2
-	}
-	return 0
-}
diff --git a/third_party/gofrontend/libgo/go/math/exp.go b/third_party/gofrontend/libgo/go/math/exp.go
deleted file mode 100644
index 51330c2..0000000
--- a/third_party/gofrontend/libgo/go/math/exp.go
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Exp returns e**x, the base-e exponential of x.
-//
-// Special cases are:
-//	Exp(+Inf) = +Inf
-//	Exp(NaN) = NaN
-// Very large values overflow to 0 or +Inf.
-// Very small values underflow to 1.
-
-//extern exp
-func libc_exp(float64) float64
-
-func Exp(x float64) float64 {
-	return libc_exp(x)
-}
-
-// The original C code, the long comment, and the constants
-// below are from FreeBSD's /usr/src/lib/msun/src/e_exp.c
-// and came with this notice.  The go code is a simplified
-// version of the original C.
-//
-// ====================================================
-// Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
-//
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-//
-// exp(x)
-// Returns the exponential of x.
-//
-// Method
-//   1. Argument reduction:
-//      Reduce x to an r so that |r| <= 0.5*ln2 ~ 0.34658.
-//      Given x, find r and integer k such that
-//
-//               x = k*ln2 + r,  |r| <= 0.5*ln2.
-//
-//      Here r will be represented as r = hi-lo for better
-//      accuracy.
-//
-//   2. Approximation of exp(r) by a special rational function on
-//      the interval [0,0.34658]:
-//      Write
-//          R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ...
-//      We use a special Remes algorithm on [0,0.34658] to generate
-//      a polynomial of degree 5 to approximate R. The maximum error
-//      of this polynomial approximation is bounded by 2**-59. In
-//      other words,
-//          R(z) ~ 2.0 + P1*z + P2*z**2 + P3*z**3 + P4*z**4 + P5*z**5
-//      (where z=r*r, and the values of P1 to P5 are listed below)
-//      and
-//          |                  5          |     -59
-//          | 2.0+P1*z+...+P5*z   -  R(z) | <= 2
-//          |                             |
-//      The computation of exp(r) thus becomes
-//                             2*r
-//              exp(r) = 1 + -------
-//                            R - r
-//                                 r*R1(r)
-//                     = 1 + r + ----------- (for better accuracy)
-//                                2 - R1(r)
-//      where
-//                               2       4             10
-//              R1(r) = r - (P1*r  + P2*r  + ... + P5*r   ).
-//
-//   3. Scale back to obtain exp(x):
-//      From step 1, we have
-//         exp(x) = 2**k * exp(r)
-//
-// Special cases:
-//      exp(INF) is INF, exp(NaN) is NaN;
-//      exp(-INF) is 0, and
-//      for finite argument, only exp(0)=1 is exact.
-//
-// Accuracy:
-//      according to an error analysis, the error is always less than
-//      1 ulp (unit in the last place).
-//
-// Misc. info.
-//      For IEEE double
-//          if x >  7.09782712893383973096e+02 then exp(x) overflow
-//          if x < -7.45133219101941108420e+02 then exp(x) underflow
-//
-// Constants:
-// The hexadecimal values are the intended ones for the following
-// constants. The decimal values may be used, provided that the
-// compiler will convert from decimal to binary accurately enough
-// to produce the hexadecimal values shown.
-
-func exp(x float64) float64 {
-	const (
-		Ln2Hi = 6.93147180369123816490e-01
-		Ln2Lo = 1.90821492927058770002e-10
-		Log2e = 1.44269504088896338700e+00
-
-		Overflow  = 7.09782712893383973096e+02
-		Underflow = -7.45133219101941108420e+02
-		NearZero  = 1.0 / (1 << 28) // 2**-28
-	)
-
-	// special cases
-	switch {
-	case IsNaN(x) || IsInf(x, 1):
-		return x
-	case IsInf(x, -1):
-		return 0
-	case x > Overflow:
-		return Inf(1)
-	case x < Underflow:
-		return 0
-	case -NearZero < x && x < NearZero:
-		return 1 + x
-	}
-
-	// reduce; computed as r = hi - lo for extra precision.
-	var k int
-	switch {
-	case x < 0:
-		k = int(Log2e*x - 0.5)
-	case x > 0:
-		k = int(Log2e*x + 0.5)
-	}
-	hi := x - float64(k)*Ln2Hi
-	lo := float64(k) * Ln2Lo
-
-	// compute
-	return expmulti(hi, lo, k)
-}
-
-// Exp2 returns 2**x, the base-2 exponential of x.
-//
-// Special cases are the same as Exp.
-func Exp2(x float64) float64 {
-	return exp2(x)
-}
-
-func exp2(x float64) float64 {
-	const (
-		Ln2Hi = 6.93147180369123816490e-01
-		Ln2Lo = 1.90821492927058770002e-10
-
-		Overflow  = 1.0239999999999999e+03
-		Underflow = -1.0740e+03
-	)
-
-	// special cases
-	switch {
-	case IsNaN(x) || IsInf(x, 1):
-		return x
-	case IsInf(x, -1):
-		return 0
-	case x > Overflow:
-		return Inf(1)
-	case x < Underflow:
-		return 0
-	}
-
-	// argument reduction; x = r×lg(e) + k with |r| ≤ ln(2)/2.
-	// computed as r = hi - lo for extra precision.
-	var k int
-	switch {
-	case x > 0:
-		k = int(x + 0.5)
-	case x < 0:
-		k = int(x - 0.5)
-	}
-	t := x - float64(k)
-	hi := t * Ln2Hi
-	lo := -t * Ln2Lo
-
-	// compute
-	return expmulti(hi, lo, k)
-}
-
-// exp1 returns e**r × 2**k where r = hi - lo and |r| ≤ ln(2)/2.
-func expmulti(hi, lo float64, k int) float64 {
-	const (
-		P1 = 1.66666666666666019037e-01  /* 0x3FC55555; 0x5555553E */
-		P2 = -2.77777777770155933842e-03 /* 0xBF66C16C; 0x16BEBD93 */
-		P3 = 6.61375632143793436117e-05  /* 0x3F11566A; 0xAF25DE2C */
-		P4 = -1.65339022054652515390e-06 /* 0xBEBBBD41; 0xC5D26BF1 */
-		P5 = 4.13813679705723846039e-08  /* 0x3E663769; 0x72BEA4D0 */
-	)
-
-	r := hi - lo
-	t := r * r
-	c := r - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))))
-	y := 1 - ((lo - (r*c)/(2-c)) - hi)
-	// TODO(rsc): make sure Ldexp can handle boundary k
-	return Ldexp(y, k)
-}
diff --git a/third_party/gofrontend/libgo/go/math/expm1.go b/third_party/gofrontend/libgo/go/math/expm1.go
deleted file mode 100644
index 8d7b3d3..0000000
--- a/third_party/gofrontend/libgo/go/math/expm1.go
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// The original C code, the long comment, and the constants
-// below are from FreeBSD's /usr/src/lib/msun/src/s_expm1.c
-// and came with this notice.  The go code is a simplified
-// version of the original C.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunPro, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-// expm1(x)
-// Returns exp(x)-1, the exponential of x minus 1.
-//
-// Method
-//   1. Argument reduction:
-//      Given x, find r and integer k such that
-//
-//               x = k*ln2 + r,  |r| <= 0.5*ln2 ~ 0.34658
-//
-//      Here a correction term c will be computed to compensate
-//      the error in r when rounded to a floating-point number.
-//
-//   2. Approximating expm1(r) by a special rational function on
-//      the interval [0,0.34658]:
-//      Since
-//          r*(exp(r)+1)/(exp(r)-1) = 2+ r**2/6 - r**4/360 + ...
-//      we define R1(r*r) by
-//          r*(exp(r)+1)/(exp(r)-1) = 2+ r**2/6 * R1(r*r)
-//      That is,
-//          R1(r**2) = 6/r *((exp(r)+1)/(exp(r)-1) - 2/r)
-//                   = 6/r * ( 1 + 2.0*(1/(exp(r)-1) - 1/r))
-//                   = 1 - r**2/60 + r**4/2520 - r**6/100800 + ...
-//      We use a special Reme algorithm on [0,0.347] to generate
-//      a polynomial of degree 5 in r*r to approximate R1. The
-//      maximum error of this polynomial approximation is bounded
-//      by 2**-61. In other words,
-//          R1(z) ~ 1.0 + Q1*z + Q2*z**2 + Q3*z**3 + Q4*z**4 + Q5*z**5
-//      where   Q1  =  -1.6666666666666567384E-2,
-//              Q2  =   3.9682539681370365873E-4,
-//              Q3  =  -9.9206344733435987357E-6,
-//              Q4  =   2.5051361420808517002E-7,
-//              Q5  =  -6.2843505682382617102E-9;
-//      (where z=r*r, and the values of Q1 to Q5 are listed below)
-//      with error bounded by
-//          |                  5           |     -61
-//          | 1.0+Q1*z+...+Q5*z   -  R1(z) | <= 2
-//          |                              |
-//
-//      expm1(r) = exp(r)-1 is then computed by the following
-//      specific way which minimize the accumulation rounding error:
-//                             2     3
-//                            r     r    [ 3 - (R1 + R1*r/2)  ]
-//            expm1(r) = r + --- + --- * [--------------------]
-//                            2     2    [ 6 - r*(3 - R1*r/2) ]
-//
-//      To compensate the error in the argument reduction, we use
-//              expm1(r+c) = expm1(r) + c + expm1(r)*c
-//                         ~ expm1(r) + c + r*c
-//      Thus c+r*c will be added in as the correction terms for
-//      expm1(r+c). Now rearrange the term to avoid optimization
-//      screw up:
-//                      (      2                                    2 )
-//                      ({  ( r    [ R1 -  (3 - R1*r/2) ]  )  }    r  )
-//       expm1(r+c)~r - ({r*(--- * [--------------------]-c)-c} - --- )
-//                      ({  ( 2    [ 6 - r*(3 - R1*r/2) ]  )  }    2  )
-//                      (                                             )
-//
-//                 = r - E
-//   3. Scale back to obtain expm1(x):
-//      From step 1, we have
-//         expm1(x) = either 2**k*[expm1(r)+1] - 1
-//                  = or     2**k*[expm1(r) + (1-2**-k)]
-//   4. Implementation notes:
-//      (A). To save one multiplication, we scale the coefficient Qi
-//           to Qi*2**i, and replace z by (x**2)/2.
-//      (B). To achieve maximum accuracy, we compute expm1(x) by
-//        (i)   if x < -56*ln2, return -1.0, (raise inexact if x!=inf)
-//        (ii)  if k=0, return r-E
-//        (iii) if k=-1, return 0.5*(r-E)-0.5
-//        (iv)  if k=1 if r < -0.25, return 2*((r+0.5)- E)
-//                     else          return  1.0+2.0*(r-E);
-//        (v)   if (k<-2||k>56) return 2**k(1-(E-r)) - 1 (or exp(x)-1)
-//        (vi)  if k <= 20, return 2**k((1-2**-k)-(E-r)), else
-//        (vii) return 2**k(1-((E+2**-k)-r))
-//
-// Special cases:
-//      expm1(INF) is INF, expm1(NaN) is NaN;
-//      expm1(-INF) is -1, and
-//      for finite argument, only expm1(0)=0 is exact.
-//
-// Accuracy:
-//      according to an error analysis, the error is always less than
-//      1 ulp (unit in the last place).
-//
-// Misc. info.
-//      For IEEE double
-//          if x >  7.09782712893383973096e+02 then expm1(x) overflow
-//
-// Constants:
-// The hexadecimal values are the intended ones for the following
-// constants. The decimal values may be used, provided that the
-// compiler will convert from decimal to binary accurately enough
-// to produce the hexadecimal values shown.
-//
-
-// Expm1 returns e**x - 1, the base-e exponential of x minus 1.
-// It is more accurate than Exp(x) - 1 when x is near zero.
-//
-// Special cases are:
-//	Expm1(+Inf) = +Inf
-//	Expm1(-Inf) = -1
-//	Expm1(NaN) = NaN
-// Very large values overflow to -1 or +Inf.
-
-//extern expm1
-func libc_expm1(float64) float64
-
-func Expm1(x float64) float64 {
-	return libc_expm1(x)
-}
-
-func expm1(x float64) float64 {
-	const (
-		Othreshold = 7.09782712893383973096e+02 // 0x40862E42FEFA39EF
-		Ln2X56     = 3.88162421113569373274e+01 // 0x4043687a9f1af2b1
-		Ln2HalfX3  = 1.03972077083991796413e+00 // 0x3ff0a2b23f3bab73
-		Ln2Half    = 3.46573590279972654709e-01 // 0x3fd62e42fefa39ef
-		Ln2Hi      = 6.93147180369123816490e-01 // 0x3fe62e42fee00000
-		Ln2Lo      = 1.90821492927058770002e-10 // 0x3dea39ef35793c76
-		InvLn2     = 1.44269504088896338700e+00 // 0x3ff71547652b82fe
-		Tiny       = 1.0 / (1 << 54)            // 2**-54 = 0x3c90000000000000
-		// scaled coefficients related to expm1
-		Q1 = -3.33333333333331316428e-02 // 0xBFA11111111110F4
-		Q2 = 1.58730158725481460165e-03  // 0x3F5A01A019FE5585
-		Q3 = -7.93650757867487942473e-05 // 0xBF14CE199EAADBB7
-		Q4 = 4.00821782732936239552e-06  // 0x3ED0CFCA86E65239
-		Q5 = -2.01099218183624371326e-07 // 0xBE8AFDB76E09C32D
-	)
-
-	// special cases
-	switch {
-	case IsInf(x, 1) || IsNaN(x):
-		return x
-	case IsInf(x, -1):
-		return -1
-	}
-
-	absx := x
-	sign := false
-	if x < 0 {
-		absx = -absx
-		sign = true
-	}
-
-	// filter out huge argument
-	if absx >= Ln2X56 { // if |x| >= 56 * ln2
-		if sign {
-			return -1 // x < -56*ln2, return -1
-		}
-		if absx >= Othreshold { // if |x| >= 709.78...
-			return Inf(1)
-		}
-	}
-
-	// argument reduction
-	var c float64
-	var k int
-	if absx > Ln2Half { // if  |x| > 0.5 * ln2
-		var hi, lo float64
-		if absx < Ln2HalfX3 { // and |x| < 1.5 * ln2
-			if !sign {
-				hi = x - Ln2Hi
-				lo = Ln2Lo
-				k = 1
-			} else {
-				hi = x + Ln2Hi
-				lo = -Ln2Lo
-				k = -1
-			}
-		} else {
-			if !sign {
-				k = int(InvLn2*x + 0.5)
-			} else {
-				k = int(InvLn2*x - 0.5)
-			}
-			t := float64(k)
-			hi = x - t*Ln2Hi // t * Ln2Hi is exact here
-			lo = t * Ln2Lo
-		}
-		x = hi - lo
-		c = (hi - x) - lo
-	} else if absx < Tiny { // when |x| < 2**-54, return x
-		return x
-	} else {
-		k = 0
-	}
-
-	// x is now in primary range
-	hfx := 0.5 * x
-	hxs := x * hfx
-	r1 := 1 + hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5))))
-	t := 3 - r1*hfx
-	e := hxs * ((r1 - t) / (6.0 - x*t))
-	if k != 0 {
-		e = (x*(e-c) - c)
-		e -= hxs
-		switch {
-		case k == -1:
-			return 0.5*(x-e) - 0.5
-		case k == 1:
-			if x < -0.25 {
-				return -2 * (e - (x + 0.5))
-			}
-			return 1 + 2*(x-e)
-		case k <= -2 || k > 56: // suffice to return exp(x)-1
-			y := 1 - (e - x)
-			y = Float64frombits(Float64bits(y) + uint64(k)<<52) // add k to y's exponent
-			return y - 1
-		}
-		if k < 20 {
-			t := Float64frombits(0x3ff0000000000000 - (0x20000000000000 >> uint(k))) // t=1-2**-k
-			y := t - (e - x)
-			y = Float64frombits(Float64bits(y) + uint64(k)<<52) // add k to y's exponent
-			return y
-		}
-		t := Float64frombits(uint64((0x3ff - k) << 52)) // 2**-k
-		y := x - (e + t)
-		y += 1
-		y = Float64frombits(Float64bits(y) + uint64(k)<<52) // add k to y's exponent
-		return y
-	}
-	return x - (x*e - hxs) // c is 0
-}
diff --git a/third_party/gofrontend/libgo/go/math/export_test.go b/third_party/gofrontend/libgo/go/math/export_test.go
deleted file mode 100644
index 02992d7..0000000
--- a/third_party/gofrontend/libgo/go/math/export_test.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Export internal functions for testing.
-var ExpGo = exp
-var Exp2Go = exp2
-var HypotGo = hypot
-var SqrtGo = sqrt
diff --git a/third_party/gofrontend/libgo/go/math/floor.go b/third_party/gofrontend/libgo/go/math/floor.go
deleted file mode 100644
index c40be41..0000000
--- a/third_party/gofrontend/libgo/go/math/floor.go
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2009-2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Floor returns the greatest integer value less than or equal to x.
-//
-// Special cases are:
-//	Floor(±0) = ±0
-//	Floor(±Inf) = ±Inf
-//	Floor(NaN) = NaN
-
-//extern floor
-func libc_floor(float64) float64
-
-func Floor(x float64) float64 {
-	return libc_floor(x)
-}
-
-func floor(x float64) float64 {
-	if x == 0 || IsNaN(x) || IsInf(x, 0) {
-		return x
-	}
-	if x < 0 {
-		d, fract := Modf(-x)
-		if fract != 0.0 {
-			d = d + 1
-		}
-		return -d
-	}
-	d, _ := Modf(x)
-	return d
-}
-
-// Ceil returns the least integer value greater than or equal to x.
-//
-// Special cases are:
-//	Ceil(±0) = ±0
-//	Ceil(±Inf) = ±Inf
-//	Ceil(NaN) = NaN
-
-//extern ceil
-func libc_ceil(float64) float64
-
-func Ceil(x float64) float64 {
-	return libc_ceil(x)
-}
-
-func ceil(x float64) float64 {
-	return -Floor(-x)
-}
-
-// Trunc returns the integer value of x.
-//
-// Special cases are:
-//	Trunc(±0) = ±0
-//	Trunc(±Inf) = ±Inf
-//	Trunc(NaN) = NaN
-
-func Trunc(x float64) float64 {
-	return trunc(x)
-}
-
-func trunc(x float64) float64 {
-	if x == 0 || IsNaN(x) || IsInf(x, 0) {
-		return x
-	}
-	d, _ := Modf(x)
-	return d
-}
diff --git a/third_party/gofrontend/libgo/go/math/frexp.go b/third_party/gofrontend/libgo/go/math/frexp.go
deleted file mode 100644
index 4ad0aee..0000000
--- a/third_party/gofrontend/libgo/go/math/frexp.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Frexp breaks f into a normalized fraction
-// and an integral power of two.
-// It returns frac and exp satisfying f == frac × 2**exp,
-// with the absolute value of frac in the interval [½, 1).
-//
-// Special cases are:
-//	Frexp(±0) = ±0, 0
-//	Frexp(±Inf) = ±Inf, 0
-//	Frexp(NaN) = NaN, 0
-func Frexp(f float64) (frac float64, exp int) {
-	return frexp(f)
-}
-
-func frexp(f float64) (frac float64, exp int) {
-	// special cases
-	switch {
-	case f == 0:
-		return f, 0 // correctly return -0
-	case IsInf(f, 0) || IsNaN(f):
-		return f, 0
-	}
-	f, exp = normalize(f)
-	x := Float64bits(f)
-	exp += int((x>>shift)&mask) - bias + 1
-	x &^= mask << shift
-	x |= (-1 + bias) << shift
-	frac = Float64frombits(x)
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/math/gamma.go b/third_party/gofrontend/libgo/go/math/gamma.go
deleted file mode 100644
index 164f54f..0000000
--- a/third_party/gofrontend/libgo/go/math/gamma.go
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// The original C code, the long comment, and the constants
-// below are from http://netlib.sandia.gov/cephes/cprob/gamma.c.
-// The go code is a simplified version of the original C.
-//
-//      tgamma.c
-//
-//      Gamma function
-//
-// SYNOPSIS:
-//
-// double x, y, tgamma();
-// extern int signgam;
-//
-// y = tgamma( x );
-//
-// DESCRIPTION:
-//
-// Returns gamma function of the argument.  The result is
-// correctly signed, and the sign (+1 or -1) is also
-// returned in a global (extern) variable named signgam.
-// This variable is also filled in by the logarithmic gamma
-// function lgamma().
-//
-// Arguments |x| <= 34 are reduced by recurrence and the function
-// approximated by a rational function of degree 6/7 in the
-// interval (2,3).  Large arguments are handled by Stirling's
-// formula. Large negative arguments are made positive using
-// a reflection formula.
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    DEC      -34, 34      10000       1.3e-16     2.5e-17
-//    IEEE    -170,-33      20000       2.3e-15     3.3e-16
-//    IEEE     -33,  33     20000       9.4e-16     2.2e-16
-//    IEEE      33, 171.6   20000       2.3e-15     3.2e-16
-//
-// Error for arguments outside the test range will be larger
-// owing to error amplification by the exponential function.
-//
-// Cephes Math Library Release 2.8:  June, 2000
-// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
-//
-// The readme file at http://netlib.sandia.gov/cephes/ says:
-//    Some software in this archive may be from the book _Methods and
-// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
-// International, 1989) or from the Cephes Mathematical Library, a
-// commercial product. In either event, it is copyrighted by the author.
-// What you see here may be used freely but it comes with no support or
-// guarantee.
-//
-//   The two known misprints in the book are repaired here in the
-// source listings for the gamma function and the incomplete beta
-// integral.
-//
-//   Stephen L. Moshier
-//   moshier@na-net.ornl.gov
-
-var _gamP = [...]float64{
-	1.60119522476751861407e-04,
-	1.19135147006586384913e-03,
-	1.04213797561761569935e-02,
-	4.76367800457137231464e-02,
-	2.07448227648435975150e-01,
-	4.94214826801497100753e-01,
-	9.99999999999999996796e-01,
-}
-var _gamQ = [...]float64{
-	-2.31581873324120129819e-05,
-	5.39605580493303397842e-04,
-	-4.45641913851797240494e-03,
-	1.18139785222060435552e-02,
-	3.58236398605498653373e-02,
-	-2.34591795718243348568e-01,
-	7.14304917030273074085e-02,
-	1.00000000000000000320e+00,
-}
-var _gamS = [...]float64{
-	7.87311395793093628397e-04,
-	-2.29549961613378126380e-04,
-	-2.68132617805781232825e-03,
-	3.47222221605458667310e-03,
-	8.33333333333482257126e-02,
-}
-
-// Gamma function computed by Stirling's formula.
-// The polynomial is valid for 33 <= x <= 172.
-func stirling(x float64) float64 {
-	const (
-		SqrtTwoPi   = 2.506628274631000502417
-		MaxStirling = 143.01608
-	)
-	w := 1 / x
-	w = 1 + w*((((_gamS[0]*w+_gamS[1])*w+_gamS[2])*w+_gamS[3])*w+_gamS[4])
-	y := Exp(x)
-	if x > MaxStirling { // avoid Pow() overflow
-		v := Pow(x, 0.5*x-0.25)
-		y = v * (v / y)
-	} else {
-		y = Pow(x, x-0.5) / y
-	}
-	y = SqrtTwoPi * y * w
-	return y
-}
-
-// Gamma returns the Gamma function of x.
-//
-// Special cases are:
-//	Gamma(+Inf) = +Inf
-//	Gamma(+0) = +Inf
-//	Gamma(-0) = -Inf
-//	Gamma(x) = NaN for integer x < 0
-//	Gamma(-Inf) = NaN
-//	Gamma(NaN) = NaN
-func Gamma(x float64) float64 {
-	const Euler = 0.57721566490153286060651209008240243104215933593992 // A001620
-	// special cases
-	switch {
-	case isNegInt(x) || IsInf(x, -1) || IsNaN(x):
-		return NaN()
-	case x == 0:
-		if Signbit(x) {
-			return Inf(-1)
-		}
-		return Inf(1)
-	case x < -170.5674972726612 || x > 171.61447887182298:
-		return Inf(1)
-	}
-	q := Abs(x)
-	p := Floor(q)
-	if q > 33 {
-		if x >= 0 {
-			return stirling(x)
-		}
-		signgam := 1
-		if ip := int(p); ip&1 == 0 {
-			signgam = -1
-		}
-		z := q - p
-		if z > 0.5 {
-			p = p + 1
-			z = q - p
-		}
-		z = q * Sin(Pi*z)
-		if z == 0 {
-			return Inf(signgam)
-		}
-		z = Pi / (Abs(z) * stirling(q))
-		return float64(signgam) * z
-	}
-
-	// Reduce argument
-	z := 1.0
-	for x >= 3 {
-		x = x - 1
-		z = z * x
-	}
-	for x < 0 {
-		if x > -1e-09 {
-			goto small
-		}
-		z = z / x
-		x = x + 1
-	}
-	for x < 2 {
-		if x < 1e-09 {
-			goto small
-		}
-		z = z / x
-		x = x + 1
-	}
-
-	if x == 2 {
-		return z
-	}
-
-	x = x - 2
-	p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6]
-	q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7]
-	return z * p / q
-
-small:
-	if x == 0 {
-		return Inf(1)
-	}
-	return z / ((1 + Euler*x) * x)
-}
-
-func isNegInt(x float64) bool {
-	if x < 0 {
-		_, xf := Modf(x)
-		return xf == 0
-	}
-	return false
-}
diff --git a/third_party/gofrontend/libgo/go/math/hypot.go b/third_party/gofrontend/libgo/go/math/hypot.go
deleted file mode 100644
index 59b9c74..0000000
--- a/third_party/gofrontend/libgo/go/math/hypot.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-/*
-	Hypot -- sqrt(p*p + q*q), but overflows only if the result does.
-*/
-
-// Hypot returns Sqrt(p*p + q*q), taking care to avoid
-// unnecessary overflow and underflow.
-//
-// Special cases are:
-//	Hypot(±Inf, q) = +Inf
-//	Hypot(p, ±Inf) = +Inf
-//	Hypot(NaN, q) = NaN
-//	Hypot(p, NaN) = NaN
-func Hypot(p, q float64) float64 {
-	return hypot(p, q)
-}
-
-func hypot(p, q float64) float64 {
-	// special cases
-	switch {
-	case IsInf(p, 0) || IsInf(q, 0):
-		return Inf(1)
-	case IsNaN(p) || IsNaN(q):
-		return NaN()
-	}
-	if p < 0 {
-		p = -p
-	}
-	if q < 0 {
-		q = -q
-	}
-	if p < q {
-		p, q = q, p
-	}
-	if p == 0 {
-		return 0
-	}
-	q = q / p
-	return p * Sqrt(1+q*q)
-}
diff --git a/third_party/gofrontend/libgo/go/math/j0.go b/third_party/gofrontend/libgo/go/math/j0.go
deleted file mode 100644
index c20a9b2..0000000
--- a/third_party/gofrontend/libgo/go/math/j0.go
+++ /dev/null
@@ -1,429 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-/*
-	Bessel function of the first and second kinds of order zero.
-*/
-
-// The original C code and the long comment below are
-// from FreeBSD's /usr/src/lib/msun/src/e_j0.c and
-// came with this notice.  The go code is a simplified
-// version of the original C.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunPro, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-// __ieee754_j0(x), __ieee754_y0(x)
-// Bessel function of the first and second kinds of order zero.
-// Method -- j0(x):
-//      1. For tiny x, we use j0(x) = 1 - x**2/4 + x**4/64 - ...
-//      2. Reduce x to |x| since j0(x)=j0(-x),  and
-//         for x in (0,2)
-//              j0(x) = 1-z/4+ z**2*R0/S0,  where z = x*x;
-//         (precision:  |j0-1+z/4-z**2R0/S0 |<2**-63.67 )
-//         for x in (2,inf)
-//              j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0))
-//         where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
-//         as follow:
-//              cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
-//                      = 1/sqrt(2) * (cos(x) + sin(x))
-//              sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4)
-//                      = 1/sqrt(2) * (sin(x) - cos(x))
-//         (To avoid cancellation, use
-//              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
-//         to compute the worse one.)
-//
-//      3 Special cases
-//              j0(nan)= nan
-//              j0(0) = 1
-//              j0(inf) = 0
-//
-// Method -- y0(x):
-//      1. For x<2.
-//         Since
-//              y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x**2/4 - ...)
-//         therefore y0(x)-2/pi*j0(x)*ln(x) is an even function.
-//         We use the following function to approximate y0,
-//              y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x**2
-//         where
-//              U(z) = u00 + u01*z + ... + u06*z**6
-//              V(z) = 1  + v01*z + ... + v04*z**4
-//         with absolute approximation error bounded by 2**-72.
-//         Note: For tiny x, U/V = u0 and j0(x)~1, hence
-//              y0(tiny) = u0 + (2/pi)*ln(tiny), (choose tiny<2**-27)
-//      2. For x>=2.
-//              y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0))
-//         where x0 = x-pi/4. It is better to compute sin(x0),cos(x0)
-//         by the method mentioned above.
-//      3. Special cases: y0(0)=-inf, y0(x<0)=NaN, y0(inf)=0.
-//
-
-// J0 returns the order-zero Bessel function of the first kind.
-//
-// Special cases are:
-//	J0(±Inf) = 0
-//	J0(0) = 1
-//	J0(NaN) = NaN
-func J0(x float64) float64 {
-	const (
-		Huge   = 1e300
-		TwoM27 = 1.0 / (1 << 27) // 2**-27 0x3e40000000000000
-		TwoM13 = 1.0 / (1 << 13) // 2**-13 0x3f20000000000000
-		Two129 = 1 << 129        // 2**129 0x4800000000000000
-		// R0/S0 on [0, 2]
-		R02 = 1.56249999999999947958e-02  // 0x3F8FFFFFFFFFFFFD
-		R03 = -1.89979294238854721751e-04 // 0xBF28E6A5B61AC6E9
-		R04 = 1.82954049532700665670e-06  // 0x3EBEB1D10C503919
-		R05 = -4.61832688532103189199e-09 // 0xBE33D5E773D63FCE
-		S01 = 1.56191029464890010492e-02  // 0x3F8FFCE882C8C2A4
-		S02 = 1.16926784663337450260e-04  // 0x3F1EA6D2DD57DBF4
-		S03 = 5.13546550207318111446e-07  // 0x3EA13B54CE84D5A9
-		S04 = 1.16614003333790000205e-09  // 0x3E1408BCF4745D8F
-	)
-	// special cases
-	switch {
-	case IsNaN(x):
-		return x
-	case IsInf(x, 0):
-		return 0
-	case x == 0:
-		return 1
-	}
-
-	if x < 0 {
-		x = -x
-	}
-	if x >= 2 {
-		s, c := Sincos(x)
-		ss := s - c
-		cc := s + c
-
-		// make sure x+x does not overflow
-		if x < MaxFloat64/2 {
-			z := -Cos(x + x)
-			if s*c < 0 {
-				cc = z / ss
-			} else {
-				ss = z / cc
-			}
-		}
-
-		// j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
-		// y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
-
-		var z float64
-		if x > Two129 { // |x| > ~6.8056e+38
-			z = (1 / SqrtPi) * cc / Sqrt(x)
-		} else {
-			u := pzero(x)
-			v := qzero(x)
-			z = (1 / SqrtPi) * (u*cc - v*ss) / Sqrt(x)
-		}
-		return z // |x| >= 2.0
-	}
-	if x < TwoM13 { // |x| < ~1.2207e-4
-		if x < TwoM27 {
-			return 1 // |x| < ~7.4506e-9
-		}
-		return 1 - 0.25*x*x // ~7.4506e-9 < |x| < ~1.2207e-4
-	}
-	z := x * x
-	r := z * (R02 + z*(R03+z*(R04+z*R05)))
-	s := 1 + z*(S01+z*(S02+z*(S03+z*S04)))
-	if x < 1 {
-		return 1 + z*(-0.25+(r/s)) // |x| < 1.00
-	}
-	u := 0.5 * x
-	return (1+u)*(1-u) + z*(r/s) // 1.0 < |x| < 2.0
-}
-
-// Y0 returns the order-zero Bessel function of the second kind.
-//
-// Special cases are:
-//	Y0(+Inf) = 0
-//	Y0(0) = -Inf
-//	Y0(x < 0) = NaN
-//	Y0(NaN) = NaN
-func Y0(x float64) float64 {
-	const (
-		TwoM27 = 1.0 / (1 << 27)             // 2**-27 0x3e40000000000000
-		Two129 = 1 << 129                    // 2**129 0x4800000000000000
-		U00    = -7.38042951086872317523e-02 // 0xBFB2E4D699CBD01F
-		U01    = 1.76666452509181115538e-01  // 0x3FC69D019DE9E3FC
-		U02    = -1.38185671945596898896e-02 // 0xBF8C4CE8B16CFA97
-		U03    = 3.47453432093683650238e-04  // 0x3F36C54D20B29B6B
-		U04    = -3.81407053724364161125e-06 // 0xBECFFEA773D25CAD
-		U05    = 1.95590137035022920206e-08  // 0x3E5500573B4EABD4
-		U06    = -3.98205194132103398453e-11 // 0xBDC5E43D693FB3C8
-		V01    = 1.27304834834123699328e-02  // 0x3F8A127091C9C71A
-		V02    = 7.60068627350353253702e-05  // 0x3F13ECBBF578C6C1
-		V03    = 2.59150851840457805467e-07  // 0x3E91642D7FF202FD
-		V04    = 4.41110311332675467403e-10  // 0x3DFE50183BD6D9EF
-	)
-	// special cases
-	switch {
-	case x < 0 || IsNaN(x):
-		return NaN()
-	case IsInf(x, 1):
-		return 0
-	case x == 0:
-		return Inf(-1)
-	}
-
-	if x >= 2 { // |x| >= 2.0
-
-		// y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
-		//     where x0 = x-pi/4
-		// Better formula:
-		//     cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4)
-		//             =  1/sqrt(2) * (sin(x) + cos(x))
-		//     sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
-		//             =  1/sqrt(2) * (sin(x) - cos(x))
-		// To avoid cancellation, use
-		//     sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
-		// to compute the worse one.
-
-		s, c := Sincos(x)
-		ss := s - c
-		cc := s + c
-
-		// j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
-		// y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
-
-		// make sure x+x does not overflow
-		if x < MaxFloat64/2 {
-			z := -Cos(x + x)
-			if s*c < 0 {
-				cc = z / ss
-			} else {
-				ss = z / cc
-			}
-		}
-		var z float64
-		if x > Two129 { // |x| > ~6.8056e+38
-			z = (1 / SqrtPi) * ss / Sqrt(x)
-		} else {
-			u := pzero(x)
-			v := qzero(x)
-			z = (1 / SqrtPi) * (u*ss + v*cc) / Sqrt(x)
-		}
-		return z // |x| >= 2.0
-	}
-	if x <= TwoM27 {
-		return U00 + (2/Pi)*Log(x) // |x| < ~7.4506e-9
-	}
-	z := x * x
-	u := U00 + z*(U01+z*(U02+z*(U03+z*(U04+z*(U05+z*U06)))))
-	v := 1 + z*(V01+z*(V02+z*(V03+z*V04)))
-	return u/v + (2/Pi)*J0(x)*Log(x) // ~7.4506e-9 < |x| < 2.0
-}
-
-// The asymptotic expansions of pzero is
-//      1 - 9/128 s**2 + 11025/98304 s**4 - ..., where s = 1/x.
-// For x >= 2, We approximate pzero by
-// 	pzero(x) = 1 + (R/S)
-// where  R = pR0 + pR1*s**2 + pR2*s**4 + ... + pR5*s**10
-// 	  S = 1 + pS0*s**2 + ... + pS4*s**10
-// and
-//      | pzero(x)-1-R/S | <= 2  ** ( -60.26)
-
-// for x in [inf, 8]=1/[0,0.125]
-var p0R8 = [6]float64{
-	0.00000000000000000000e+00,  // 0x0000000000000000
-	-7.03124999999900357484e-02, // 0xBFB1FFFFFFFFFD32
-	-8.08167041275349795626e+00, // 0xC02029D0B44FA779
-	-2.57063105679704847262e+02, // 0xC07011027B19E863
-	-2.48521641009428822144e+03, // 0xC0A36A6ECD4DCAFC
-	-5.25304380490729545272e+03, // 0xC0B4850B36CC643D
-}
-var p0S8 = [5]float64{
-	1.16534364619668181717e+02, // 0x405D223307A96751
-	3.83374475364121826715e+03, // 0x40ADF37D50596938
-	4.05978572648472545552e+04, // 0x40E3D2BB6EB6B05F
-	1.16752972564375915681e+05, // 0x40FC810F8F9FA9BD
-	4.76277284146730962675e+04, // 0x40E741774F2C49DC
-}
-
-// for x in [8,4.5454]=1/[0.125,0.22001]
-var p0R5 = [6]float64{
-	-1.14125464691894502584e-11, // 0xBDA918B147E495CC
-	-7.03124940873599280078e-02, // 0xBFB1FFFFE69AFBC6
-	-4.15961064470587782438e+00, // 0xC010A370F90C6BBF
-	-6.76747652265167261021e+01, // 0xC050EB2F5A7D1783
-	-3.31231299649172967747e+02, // 0xC074B3B36742CC63
-	-3.46433388365604912451e+02, // 0xC075A6EF28A38BD7
-}
-var p0S5 = [5]float64{
-	6.07539382692300335975e+01, // 0x404E60810C98C5DE
-	1.05125230595704579173e+03, // 0x40906D025C7E2864
-	5.97897094333855784498e+03, // 0x40B75AF88FBE1D60
-	9.62544514357774460223e+03, // 0x40C2CCB8FA76FA38
-	2.40605815922939109441e+03, // 0x40A2CC1DC70BE864
-}
-
-// for x in [4.547,2.8571]=1/[0.2199,0.35001]
-var p0R3 = [6]float64{
-	-2.54704601771951915620e-09, // 0xBE25E1036FE1AA86
-	-7.03119616381481654654e-02, // 0xBFB1FFF6F7C0E24B
-	-2.40903221549529611423e+00, // 0xC00345B2AEA48074
-	-2.19659774734883086467e+01, // 0xC035F74A4CB94E14
-	-5.80791704701737572236e+01, // 0xC04D0A22420A1A45
-	-3.14479470594888503854e+01, // 0xC03F72ACA892D80F
-}
-var p0S3 = [5]float64{
-	3.58560338055209726349e+01, // 0x4041ED9284077DD3
-	3.61513983050303863820e+02, // 0x40769839464A7C0E
-	1.19360783792111533330e+03, // 0x4092A66E6D1061D6
-	1.12799679856907414432e+03, // 0x40919FFCB8C39B7E
-	1.73580930813335754692e+02, // 0x4065B296FC379081
-}
-
-// for x in [2.8570,2]=1/[0.3499,0.5]
-var p0R2 = [6]float64{
-	-8.87534333032526411254e-08, // 0xBE77D316E927026D
-	-7.03030995483624743247e-02, // 0xBFB1FF62495E1E42
-	-1.45073846780952986357e+00, // 0xBFF736398A24A843
-	-7.63569613823527770791e+00, // 0xC01E8AF3EDAFA7F3
-	-1.11931668860356747786e+01, // 0xC02662E6C5246303
-	-3.23364579351335335033e+00, // 0xC009DE81AF8FE70F
-}
-var p0S2 = [5]float64{
-	2.22202997532088808441e+01, // 0x40363865908B5959
-	1.36206794218215208048e+02, // 0x4061069E0EE8878F
-	2.70470278658083486789e+02, // 0x4070E78642EA079B
-	1.53875394208320329881e+02, // 0x40633C033AB6FAFF
-	1.46576176948256193810e+01, // 0x402D50B344391809
-}
-
-func pzero(x float64) float64 {
-	var p [6]float64
-	var q [5]float64
-	if x >= 8 {
-		p = p0R8
-		q = p0S8
-	} else if x >= 4.5454 {
-		p = p0R5
-		q = p0S5
-	} else if x >= 2.8571 {
-		p = p0R3
-		q = p0S3
-	} else if x >= 2 {
-		p = p0R2
-		q = p0S2
-	}
-	z := 1 / (x * x)
-	r := p[0] + z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))))
-	s := 1 + z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))))
-	return 1 + r/s
-}
-
-// For x >= 8, the asymptotic expansions of qzero is
-//      -1/8 s + 75/1024 s**3 - ..., where s = 1/x.
-// We approximate pzero by
-//      qzero(x) = s*(-1.25 + (R/S))
-// where R = qR0 + qR1*s**2 + qR2*s**4 + ... + qR5*s**10
-//       S = 1 + qS0*s**2 + ... + qS5*s**12
-// and
-//      | qzero(x)/s +1.25-R/S | <= 2**(-61.22)
-
-// for x in [inf, 8]=1/[0,0.125]
-var q0R8 = [6]float64{
-	0.00000000000000000000e+00, // 0x0000000000000000
-	7.32421874999935051953e-02, // 0x3FB2BFFFFFFFFE2C
-	1.17682064682252693899e+01, // 0x402789525BB334D6
-	5.57673380256401856059e+02, // 0x40816D6315301825
-	8.85919720756468632317e+03, // 0x40C14D993E18F46D
-	3.70146267776887834771e+04, // 0x40E212D40E901566
-}
-var q0S8 = [6]float64{
-	1.63776026895689824414e+02,  // 0x406478D5365B39BC
-	8.09834494656449805916e+03,  // 0x40BFA2584E6B0563
-	1.42538291419120476348e+05,  // 0x4101665254D38C3F
-	8.03309257119514397345e+05,  // 0x412883DA83A52B43
-	8.40501579819060512818e+05,  // 0x4129A66B28DE0B3D
-	-3.43899293537866615225e+05, // 0xC114FD6D2C9530C5
-}
-
-// for x in [8,4.5454]=1/[0.125,0.22001]
-var q0R5 = [6]float64{
-	1.84085963594515531381e-11, // 0x3DB43D8F29CC8CD9
-	7.32421766612684765896e-02, // 0x3FB2BFFFD172B04C
-	5.83563508962056953777e+00, // 0x401757B0B9953DD3
-	1.35111577286449829671e+02, // 0x4060E3920A8788E9
-	1.02724376596164097464e+03, // 0x40900CF99DC8C481
-	1.98997785864605384631e+03, // 0x409F17E953C6E3A6
-}
-var q0S5 = [6]float64{
-	8.27766102236537761883e+01,  // 0x4054B1B3FB5E1543
-	2.07781416421392987104e+03,  // 0x40A03BA0DA21C0CE
-	1.88472887785718085070e+04,  // 0x40D267D27B591E6D
-	5.67511122894947329769e+04,  // 0x40EBB5E397E02372
-	3.59767538425114471465e+04,  // 0x40E191181F7A54A0
-	-5.35434275601944773371e+03, // 0xC0B4EA57BEDBC609
-}
-
-// for x in [4.547,2.8571]=1/[0.2199,0.35001]
-var q0R3 = [6]float64{
-	4.37741014089738620906e-09, // 0x3E32CD036ADECB82
-	7.32411180042911447163e-02, // 0x3FB2BFEE0E8D0842
-	3.34423137516170720929e+00, // 0x400AC0FC61149CF5
-	4.26218440745412650017e+01, // 0x40454F98962DAEDD
-	1.70808091340565596283e+02, // 0x406559DBE25EFD1F
-	1.66733948696651168575e+02, // 0x4064D77C81FA21E0
-}
-var q0S3 = [6]float64{
-	4.87588729724587182091e+01,  // 0x40486122BFE343A6
-	7.09689221056606015736e+02,  // 0x40862D8386544EB3
-	3.70414822620111362994e+03,  // 0x40ACF04BE44DFC63
-	6.46042516752568917582e+03,  // 0x40B93C6CD7C76A28
-	2.51633368920368957333e+03,  // 0x40A3A8AAD94FB1C0
-	-1.49247451836156386662e+02, // 0xC062A7EB201CF40F
-}
-
-// for x in [2.8570,2]=1/[0.3499,0.5]
-var q0R2 = [6]float64{
-	1.50444444886983272379e-07, // 0x3E84313B54F76BDB
-	7.32234265963079278272e-02, // 0x3FB2BEC53E883E34
-	1.99819174093815998816e+00, // 0x3FFFF897E727779C
-	1.44956029347885735348e+01, // 0x402CFDBFAAF96FE5
-	3.16662317504781540833e+01, // 0x403FAA8E29FBDC4A
-	1.62527075710929267416e+01, // 0x403040B171814BB4
-}
-var q0S2 = [6]float64{
-	3.03655848355219184498e+01,  // 0x403E5D96F7C07AED
-	2.69348118608049844624e+02,  // 0x4070D591E4D14B40
-	8.44783757595320139444e+02,  // 0x408A664522B3BF22
-	8.82935845112488550512e+02,  // 0x408B977C9C5CC214
-	2.12666388511798828631e+02,  // 0x406A95530E001365
-	-5.31095493882666946917e+00, // 0xC0153E6AF8B32931
-}
-
-func qzero(x float64) float64 {
-	var p, q [6]float64
-	if x >= 8 {
-		p = q0R8
-		q = q0S8
-	} else if x >= 4.5454 {
-		p = q0R5
-		q = q0S5
-	} else if x >= 2.8571 {
-		p = q0R3
-		q = q0S3
-	} else if x >= 2 {
-		p = q0R2
-		q = q0S2
-	}
-	z := 1 / (x * x)
-	r := p[0] + z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))))
-	s := 1 + z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))))
-	return (-0.125 + r/s) / x
-}
diff --git a/third_party/gofrontend/libgo/go/math/j1.go b/third_party/gofrontend/libgo/go/math/j1.go
deleted file mode 100644
index 7ac186b..0000000
--- a/third_party/gofrontend/libgo/go/math/j1.go
+++ /dev/null
@@ -1,422 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-/*
-	Bessel function of the first and second kinds of order one.
-*/
-
-// The original C code and the long comment below are
-// from FreeBSD's /usr/src/lib/msun/src/e_j1.c and
-// came with this notice.  The go code is a simplified
-// version of the original C.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunPro, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-// __ieee754_j1(x), __ieee754_y1(x)
-// Bessel function of the first and second kinds of order one.
-// Method -- j1(x):
-//      1. For tiny x, we use j1(x) = x/2 - x**3/16 + x**5/384 - ...
-//      2. Reduce x to |x| since j1(x)=-j1(-x),  and
-//         for x in (0,2)
-//              j1(x) = x/2 + x*z*R0/S0,  where z = x*x;
-//         (precision:  |j1/x - 1/2 - R0/S0 |<2**-61.51 )
-//         for x in (2,inf)
-//              j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1))
-//              y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
-//         where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
-//         as follow:
-//              cos(x1) =  cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
-//                      =  1/sqrt(2) * (sin(x) - cos(x))
-//              sin(x1) =  sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
-//                      = -1/sqrt(2) * (sin(x) + cos(x))
-//         (To avoid cancellation, use
-//              sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
-//         to compute the worse one.)
-//
-//      3 Special cases
-//              j1(nan)= nan
-//              j1(0) = 0
-//              j1(inf) = 0
-//
-// Method -- y1(x):
-//      1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN
-//      2. For x<2.
-//         Since
-//              y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x**3-...)
-//         therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function.
-//         We use the following function to approximate y1,
-//              y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x**2
-//         where for x in [0,2] (abs err less than 2**-65.89)
-//              U(z) = U0[0] + U0[1]*z + ... + U0[4]*z**4
-//              V(z) = 1  + v0[0]*z + ... + v0[4]*z**5
-//         Note: For tiny x, 1/x dominate y1 and hence
-//              y1(tiny) = -2/pi/tiny, (choose tiny<2**-54)
-//      3. For x>=2.
-//               y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1))
-//         where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1)
-//         by method mentioned above.
-
-// J1 returns the order-one Bessel function of the first kind.
-//
-// Special cases are:
-//	J1(±Inf) = 0
-//	J1(NaN) = NaN
-func J1(x float64) float64 {
-	const (
-		TwoM27 = 1.0 / (1 << 27) // 2**-27 0x3e40000000000000
-		Two129 = 1 << 129        // 2**129 0x4800000000000000
-		// R0/S0 on [0, 2]
-		R00 = -6.25000000000000000000e-02 // 0xBFB0000000000000
-		R01 = 1.40705666955189706048e-03  // 0x3F570D9F98472C61
-		R02 = -1.59955631084035597520e-05 // 0xBEF0C5C6BA169668
-		R03 = 4.96727999609584448412e-08  // 0x3E6AAAFA46CA0BD9
-		S01 = 1.91537599538363460805e-02  // 0x3F939D0B12637E53
-		S02 = 1.85946785588630915560e-04  // 0x3F285F56B9CDF664
-		S03 = 1.17718464042623683263e-06  // 0x3EB3BFF8333F8498
-		S04 = 5.04636257076217042715e-09  // 0x3E35AC88C97DFF2C
-		S05 = 1.23542274426137913908e-11  // 0x3DAB2ACFCFB97ED8
-	)
-	// special cases
-	switch {
-	case IsNaN(x):
-		return x
-	case IsInf(x, 0) || x == 0:
-		return 0
-	}
-
-	sign := false
-	if x < 0 {
-		x = -x
-		sign = true
-	}
-	if x >= 2 {
-		s, c := Sincos(x)
-		ss := -s - c
-		cc := s - c
-
-		// make sure x+x does not overflow
-		if x < MaxFloat64/2 {
-			z := Cos(x + x)
-			if s*c > 0 {
-				cc = z / ss
-			} else {
-				ss = z / cc
-			}
-		}
-
-		// j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
-		// y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
-
-		var z float64
-		if x > Two129 {
-			z = (1 / SqrtPi) * cc / Sqrt(x)
-		} else {
-			u := pone(x)
-			v := qone(x)
-			z = (1 / SqrtPi) * (u*cc - v*ss) / Sqrt(x)
-		}
-		if sign {
-			return -z
-		}
-		return z
-	}
-	if x < TwoM27 { // |x|<2**-27
-		return 0.5 * x // inexact if x!=0 necessary
-	}
-	z := x * x
-	r := z * (R00 + z*(R01+z*(R02+z*R03)))
-	s := 1.0 + z*(S01+z*(S02+z*(S03+z*(S04+z*S05))))
-	r *= x
-	z = 0.5*x + r/s
-	if sign {
-		return -z
-	}
-	return z
-}
-
-// Y1 returns the order-one Bessel function of the second kind.
-//
-// Special cases are:
-//	Y1(+Inf) = 0
-//	Y1(0) = -Inf
-//	Y1(x < 0) = NaN
-//	Y1(NaN) = NaN
-func Y1(x float64) float64 {
-	const (
-		TwoM54 = 1.0 / (1 << 54)             // 2**-54 0x3c90000000000000
-		Two129 = 1 << 129                    // 2**129 0x4800000000000000
-		U00    = -1.96057090646238940668e-01 // 0xBFC91866143CBC8A
-		U01    = 5.04438716639811282616e-02  // 0x3FA9D3C776292CD1
-		U02    = -1.91256895875763547298e-03 // 0xBF5F55E54844F50F
-		U03    = 2.35252600561610495928e-05  // 0x3EF8AB038FA6B88E
-		U04    = -9.19099158039878874504e-08 // 0xBE78AC00569105B8
-		V00    = 1.99167318236649903973e-02  // 0x3F94650D3F4DA9F0
-		V01    = 2.02552581025135171496e-04  // 0x3F2A8C896C257764
-		V02    = 1.35608801097516229404e-06  // 0x3EB6C05A894E8CA6
-		V03    = 6.22741452364621501295e-09  // 0x3E3ABF1D5BA69A86
-		V04    = 1.66559246207992079114e-11  // 0x3DB25039DACA772A
-	)
-	// special cases
-	switch {
-	case x < 0 || IsNaN(x):
-		return NaN()
-	case IsInf(x, 1):
-		return 0
-	case x == 0:
-		return Inf(-1)
-	}
-
-	if x >= 2 {
-		s, c := Sincos(x)
-		ss := -s - c
-		cc := s - c
-
-		// make sure x+x does not overflow
-		if x < MaxFloat64/2 {
-			z := Cos(x + x)
-			if s*c > 0 {
-				cc = z / ss
-			} else {
-				ss = z / cc
-			}
-		}
-		// y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x0)+q1(x)*cos(x0))
-		// where x0 = x-3pi/4
-		//     Better formula:
-		//         cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4)
-		//                 =  1/sqrt(2) * (sin(x) - cos(x))
-		//         sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4)
-		//                 = -1/sqrt(2) * (cos(x) + sin(x))
-		// To avoid cancellation, use
-		//     sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
-		// to compute the worse one.
-
-		var z float64
-		if x > Two129 {
-			z = (1 / SqrtPi) * ss / Sqrt(x)
-		} else {
-			u := pone(x)
-			v := qone(x)
-			z = (1 / SqrtPi) * (u*ss + v*cc) / Sqrt(x)
-		}
-		return z
-	}
-	if x <= TwoM54 { // x < 2**-54
-		return -(2 / Pi) / x
-	}
-	z := x * x
-	u := U00 + z*(U01+z*(U02+z*(U03+z*U04)))
-	v := 1 + z*(V00+z*(V01+z*(V02+z*(V03+z*V04))))
-	return x*(u/v) + (2/Pi)*(J1(x)*Log(x)-1/x)
-}
-
-// For x >= 8, the asymptotic expansions of pone is
-//      1 + 15/128 s**2 - 4725/2**15 s**4 - ..., where s = 1/x.
-// We approximate pone by
-//      pone(x) = 1 + (R/S)
-// where R = pr0 + pr1*s**2 + pr2*s**4 + ... + pr5*s**10
-//       S = 1 + ps0*s**2 + ... + ps4*s**10
-// and
-//      | pone(x)-1-R/S | <= 2**(-60.06)
-
-// for x in [inf, 8]=1/[0,0.125]
-var p1R8 = [6]float64{
-	0.00000000000000000000e+00, // 0x0000000000000000
-	1.17187499999988647970e-01, // 0x3FBDFFFFFFFFFCCE
-	1.32394806593073575129e+01, // 0x402A7A9D357F7FCE
-	4.12051854307378562225e+02, // 0x4079C0D4652EA590
-	3.87474538913960532227e+03, // 0x40AE457DA3A532CC
-	7.91447954031891731574e+03, // 0x40BEEA7AC32782DD
-}
-var p1S8 = [5]float64{
-	1.14207370375678408436e+02, // 0x405C8D458E656CAC
-	3.65093083420853463394e+03, // 0x40AC85DC964D274F
-	3.69562060269033463555e+04, // 0x40E20B8697C5BB7F
-	9.76027935934950801311e+04, // 0x40F7D42CB28F17BB
-	3.08042720627888811578e+04, // 0x40DE1511697A0B2D
-}
-
-// for x in [8,4.5454] = 1/[0.125,0.22001]
-var p1R5 = [6]float64{
-	1.31990519556243522749e-11, // 0x3DAD0667DAE1CA7D
-	1.17187493190614097638e-01, // 0x3FBDFFFFE2C10043
-	6.80275127868432871736e+00, // 0x401B36046E6315E3
-	1.08308182990189109773e+02, // 0x405B13B9452602ED
-	5.17636139533199752805e+02, // 0x40802D16D052D649
-	5.28715201363337541807e+02, // 0x408085B8BB7E0CB7
-}
-var p1S5 = [5]float64{
-	5.92805987221131331921e+01, // 0x404DA3EAA8AF633D
-	9.91401418733614377743e+02, // 0x408EFB361B066701
-	5.35326695291487976647e+03, // 0x40B4E9445706B6FB
-	7.84469031749551231769e+03, // 0x40BEA4B0B8A5BB15
-	1.50404688810361062679e+03, // 0x40978030036F5E51
-}
-
-// for x in[4.5453,2.8571] = 1/[0.2199,0.35001]
-var p1R3 = [6]float64{
-	3.02503916137373618024e-09, // 0x3E29FC21A7AD9EDD
-	1.17186865567253592491e-01, // 0x3FBDFFF55B21D17B
-	3.93297750033315640650e+00, // 0x400F76BCE85EAD8A
-	3.51194035591636932736e+01, // 0x40418F489DA6D129
-	9.10550110750781271918e+01, // 0x4056C3854D2C1837
-	4.85590685197364919645e+01, // 0x4048478F8EA83EE5
-}
-var p1S3 = [5]float64{
-	3.47913095001251519989e+01, // 0x40416549A134069C
-	3.36762458747825746741e+02, // 0x40750C3307F1A75F
-	1.04687139975775130551e+03, // 0x40905B7C5037D523
-	8.90811346398256432622e+02, // 0x408BD67DA32E31E9
-	1.03787932439639277504e+02, // 0x4059F26D7C2EED53
-}
-
-// for x in [2.8570,2] = 1/[0.3499,0.5]
-var p1R2 = [6]float64{
-	1.07710830106873743082e-07, // 0x3E7CE9D4F65544F4
-	1.17176219462683348094e-01, // 0x3FBDFF42BE760D83
-	2.36851496667608785174e+00, // 0x4002F2B7F98FAEC0
-	1.22426109148261232917e+01, // 0x40287C377F71A964
-	1.76939711271687727390e+01, // 0x4031B1A8177F8EE2
-	5.07352312588818499250e+00, // 0x40144B49A574C1FE
-}
-var p1S2 = [5]float64{
-	2.14364859363821409488e+01, // 0x40356FBD8AD5ECDC
-	1.25290227168402751090e+02, // 0x405F529314F92CD5
-	2.32276469057162813669e+02, // 0x406D08D8D5A2DBD9
-	1.17679373287147100768e+02, // 0x405D6B7ADA1884A9
-	8.36463893371618283368e+00, // 0x4020BAB1F44E5192
-}
-
-func pone(x float64) float64 {
-	var p [6]float64
-	var q [5]float64
-	if x >= 8 {
-		p = p1R8
-		q = p1S8
-	} else if x >= 4.5454 {
-		p = p1R5
-		q = p1S5
-	} else if x >= 2.8571 {
-		p = p1R3
-		q = p1S3
-	} else if x >= 2 {
-		p = p1R2
-		q = p1S2
-	}
-	z := 1 / (x * x)
-	r := p[0] + z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))))
-	s := 1.0 + z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))))
-	return 1 + r/s
-}
-
-// For x >= 8, the asymptotic expansions of qone is
-//      3/8 s - 105/1024 s**3 - ..., where s = 1/x.
-// We approximate qone by
-//      qone(x) = s*(0.375 + (R/S))
-// where R = qr1*s**2 + qr2*s**4 + ... + qr5*s**10
-//       S = 1 + qs1*s**2 + ... + qs6*s**12
-// and
-//      | qone(x)/s -0.375-R/S | <= 2**(-61.13)
-
-// for x in [inf, 8] = 1/[0,0.125]
-var q1R8 = [6]float64{
-	0.00000000000000000000e+00,  // 0x0000000000000000
-	-1.02539062499992714161e-01, // 0xBFBA3FFFFFFFFDF3
-	-1.62717534544589987888e+01, // 0xC0304591A26779F7
-	-7.59601722513950107896e+02, // 0xC087BCD053E4B576
-	-1.18498066702429587167e+04, // 0xC0C724E740F87415
-	-4.84385124285750353010e+04, // 0xC0E7A6D065D09C6A
-}
-var q1S8 = [6]float64{
-	1.61395369700722909556e+02,  // 0x40642CA6DE5BCDE5
-	7.82538599923348465381e+03,  // 0x40BE9162D0D88419
-	1.33875336287249578163e+05,  // 0x4100579AB0B75E98
-	7.19657723683240939863e+05,  // 0x4125F65372869C19
-	6.66601232617776375264e+05,  // 0x412457D27719AD5C
-	-2.94490264303834643215e+05, // 0xC111F9690EA5AA18
-}
-
-// for x in [8,4.5454] = 1/[0.125,0.22001]
-var q1R5 = [6]float64{
-	-2.08979931141764104297e-11, // 0xBDB6FA431AA1A098
-	-1.02539050241375426231e-01, // 0xBFBA3FFFCB597FEF
-	-8.05644828123936029840e+00, // 0xC0201CE6CA03AD4B
-	-1.83669607474888380239e+02, // 0xC066F56D6CA7B9B0
-	-1.37319376065508163265e+03, // 0xC09574C66931734F
-	-2.61244440453215656817e+03, // 0xC0A468E388FDA79D
-}
-var q1S5 = [6]float64{
-	8.12765501384335777857e+01,  // 0x405451B2FF5A11B2
-	1.99179873460485964642e+03,  // 0x409F1F31E77BF839
-	1.74684851924908907677e+04,  // 0x40D10F1F0D64CE29
-	4.98514270910352279316e+04,  // 0x40E8576DAABAD197
-	2.79480751638918118260e+04,  // 0x40DB4B04CF7C364B
-	-4.71918354795128470869e+03, // 0xC0B26F2EFCFFA004
-}
-
-// for x in [4.5454,2.8571] = 1/[0.2199,0.35001] ???
-var q1R3 = [6]float64{
-	-5.07831226461766561369e-09, // 0xBE35CFA9D38FC84F
-	-1.02537829820837089745e-01, // 0xBFBA3FEB51AEED54
-	-4.61011581139473403113e+00, // 0xC01270C23302D9FF
-	-5.78472216562783643212e+01, // 0xC04CEC71C25D16DA
-	-2.28244540737631695038e+02, // 0xC06C87D34718D55F
-	-2.19210128478909325622e+02, // 0xC06B66B95F5C1BF6
-}
-var q1S3 = [6]float64{
-	4.76651550323729509273e+01,  // 0x4047D523CCD367E4
-	6.73865112676699709482e+02,  // 0x40850EEBC031EE3E
-	3.38015286679526343505e+03,  // 0x40AA684E448E7C9A
-	5.54772909720722782367e+03,  // 0x40B5ABBAA61D54A6
-	1.90311919338810798763e+03,  // 0x409DBC7A0DD4DF4B
-	-1.35201191444307340817e+02, // 0xC060E670290A311F
-}
-
-// for x in [2.8570,2] = 1/[0.3499,0.5]
-var q1R2 = [6]float64{
-	-1.78381727510958865572e-07, // 0xBE87F12644C626D2
-	-1.02517042607985553460e-01, // 0xBFBA3E8E9148B010
-	-2.75220568278187460720e+00, // 0xC006048469BB4EDA
-	-1.96636162643703720221e+01, // 0xC033A9E2C168907F
-	-4.23253133372830490089e+01, // 0xC04529A3DE104AAA
-	-2.13719211703704061733e+01, // 0xC0355F3639CF6E52
-}
-var q1S2 = [6]float64{
-	2.95333629060523854548e+01,  // 0x403D888A78AE64FF
-	2.52981549982190529136e+02,  // 0x406F9F68DB821CBA
-	7.57502834868645436472e+02,  // 0x4087AC05CE49A0F7
-	7.39393205320467245656e+02,  // 0x40871B2548D4C029
-	1.55949003336666123687e+02,  // 0x40637E5E3C3ED8D4
-	-4.95949898822628210127e+00, // 0xC013D686E71BE86B
-}
-
-func qone(x float64) float64 {
-	var p, q [6]float64
-	if x >= 8 {
-		p = q1R8
-		q = q1S8
-	} else if x >= 4.5454 {
-		p = q1R5
-		q = q1S5
-	} else if x >= 2.8571 {
-		p = q1R3
-		q = q1S3
-	} else if x >= 2 {
-		p = q1R2
-		q = q1S2
-	}
-	z := 1 / (x * x)
-	r := p[0] + z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))))
-	s := 1 + z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))))
-	return (0.375 + r/s) / x
-}
diff --git a/third_party/gofrontend/libgo/go/math/jn.go b/third_party/gofrontend/libgo/go/math/jn.go
deleted file mode 100644
index a7909eb..0000000
--- a/third_party/gofrontend/libgo/go/math/jn.go
+++ /dev/null
@@ -1,306 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-/*
-	Bessel function of the first and second kinds of order n.
-*/
-
-// The original C code and the long comment below are
-// from FreeBSD's /usr/src/lib/msun/src/e_jn.c and
-// came with this notice.  The go code is a simplified
-// version of the original C.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunPro, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-// __ieee754_jn(n, x), __ieee754_yn(n, x)
-// floating point Bessel's function of the 1st and 2nd kind
-// of order n
-//
-// Special cases:
-//      y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
-//      y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
-// Note 2. About jn(n,x), yn(n,x)
-//      For n=0, j0(x) is called,
-//      for n=1, j1(x) is called,
-//      for n<x, forward recursion is used starting
-//      from values of j0(x) and j1(x).
-//      for n>x, a continued fraction approximation to
-//      j(n,x)/j(n-1,x) is evaluated and then backward
-//      recursion is used starting from a supposed value
-//      for j(n,x). The resulting value of j(0,x) is
-//      compared with the actual value to correct the
-//      supposed value of j(n,x).
-//
-//      yn(n,x) is similar in all respects, except
-//      that forward recursion is used for all
-//      values of n>1.
-
-// Jn returns the order-n Bessel function of the first kind.
-//
-// Special cases are:
-//	Jn(n, ±Inf) = 0
-//	Jn(n, NaN) = NaN
-func Jn(n int, x float64) float64 {
-	const (
-		TwoM29 = 1.0 / (1 << 29) // 2**-29 0x3e10000000000000
-		Two302 = 1 << 302        // 2**302 0x52D0000000000000
-	)
-	// special cases
-	switch {
-	case IsNaN(x):
-		return x
-	case IsInf(x, 0):
-		return 0
-	}
-	// J(-n, x) = (-1)**n * J(n, x), J(n, -x) = (-1)**n * J(n, x)
-	// Thus, J(-n, x) = J(n, -x)
-
-	if n == 0 {
-		return J0(x)
-	}
-	if x == 0 {
-		return 0
-	}
-	if n < 0 {
-		n, x = -n, -x
-	}
-	if n == 1 {
-		return J1(x)
-	}
-	sign := false
-	if x < 0 {
-		x = -x
-		if n&1 == 1 {
-			sign = true // odd n and negative x
-		}
-	}
-	var b float64
-	if float64(n) <= x {
-		// Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x)
-		if x >= Two302 { // x > 2**302
-
-			// (x >> n**2)
-			//          Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
-			//          Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
-			//          Let s=sin(x), c=cos(x),
-			//              xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
-			//
-			//                 n    sin(xn)*sqt2    cos(xn)*sqt2
-			//              ----------------------------------
-			//                 0     s-c             c+s
-			//                 1    -s-c            -c+s
-			//                 2    -s+c            -c-s
-			//                 3     s+c             c-s
-
-			var temp float64
-			switch n & 3 {
-			case 0:
-				temp = Cos(x) + Sin(x)
-			case 1:
-				temp = -Cos(x) + Sin(x)
-			case 2:
-				temp = -Cos(x) - Sin(x)
-			case 3:
-				temp = Cos(x) - Sin(x)
-			}
-			b = (1 / SqrtPi) * temp / Sqrt(x)
-		} else {
-			b = J1(x)
-			for i, a := 1, J0(x); i < n; i++ {
-				a, b = b, b*(float64(i+i)/x)-a // avoid underflow
-			}
-		}
-	} else {
-		if x < TwoM29 { // x < 2**-29
-			// x is tiny, return the first Taylor expansion of J(n,x)
-			// J(n,x) = 1/n!*(x/2)**n  - ...
-
-			if n > 33 { // underflow
-				b = 0
-			} else {
-				temp := x * 0.5
-				b = temp
-				a := 1.0
-				for i := 2; i <= n; i++ {
-					a *= float64(i) // a = n!
-					b *= temp       // b = (x/2)**n
-				}
-				b /= a
-			}
-		} else {
-			// use backward recurrence
-			//                      x      x**2      x**2
-			//  J(n,x)/J(n-1,x) =  ----   ------   ------   .....
-			//                      2n  - 2(n+1) - 2(n+2)
-			//
-			//                      1      1        1
-			//  (for large x)   =  ----  ------   ------   .....
-			//                      2n   2(n+1)   2(n+2)
-			//                      -- - ------ - ------ -
-			//                       x     x         x
-			//
-			// Let w = 2n/x and h=2/x, then the above quotient
-			// is equal to the continued fraction:
-			//                  1
-			//      = -----------------------
-			//                     1
-			//         w - -----------------
-			//                        1
-			//              w+h - ---------
-			//                     w+2h - ...
-			//
-			// To determine how many terms needed, let
-			// Q(0) = w, Q(1) = w(w+h) - 1,
-			// Q(k) = (w+k*h)*Q(k-1) - Q(k-2),
-			// When Q(k) > 1e4	good for single
-			// When Q(k) > 1e9	good for double
-			// When Q(k) > 1e17	good for quadruple
-
-			// determine k
-			w := float64(n+n) / x
-			h := 2 / x
-			q0 := w
-			z := w + h
-			q1 := w*z - 1
-			k := 1
-			for q1 < 1e9 {
-				k += 1
-				z += h
-				q0, q1 = q1, z*q1-q0
-			}
-			m := n + n
-			t := 0.0
-			for i := 2 * (n + k); i >= m; i -= 2 {
-				t = 1 / (float64(i)/x - t)
-			}
-			a := t
-			b = 1
-			//  estimate log((2/x)**n*n!) = n*log(2/x)+n*ln(n)
-			//  Hence, if n*(log(2n/x)) > ...
-			//  single 8.8722839355e+01
-			//  double 7.09782712893383973096e+02
-			//  long double 1.1356523406294143949491931077970765006170e+04
-			//  then recurrent value may overflow and the result is
-			//  likely underflow to zero
-
-			tmp := float64(n)
-			v := 2 / x
-			tmp = tmp * Log(Abs(v*tmp))
-			if tmp < 7.09782712893383973096e+02 {
-				for i := n - 1; i > 0; i-- {
-					di := float64(i + i)
-					a, b = b, b*di/x-a
-					di -= 2
-				}
-			} else {
-				for i := n - 1; i > 0; i-- {
-					di := float64(i + i)
-					a, b = b, b*di/x-a
-					di -= 2
-					// scale b to avoid spurious overflow
-					if b > 1e100 {
-						a /= b
-						t /= b
-						b = 1
-					}
-				}
-			}
-			b = t * J0(x) / b
-		}
-	}
-	if sign {
-		return -b
-	}
-	return b
-}
-
-// Yn returns the order-n Bessel function of the second kind.
-//
-// Special cases are:
-//	Yn(n, +Inf) = 0
-//	Yn(n > 0, 0) = -Inf
-//	Yn(n < 0, 0) = +Inf if n is odd, -Inf if n is even
-//	Y1(n, x < 0) = NaN
-//	Y1(n, NaN) = NaN
-func Yn(n int, x float64) float64 {
-	const Two302 = 1 << 302 // 2**302 0x52D0000000000000
-	// special cases
-	switch {
-	case x < 0 || IsNaN(x):
-		return NaN()
-	case IsInf(x, 1):
-		return 0
-	}
-
-	if n == 0 {
-		return Y0(x)
-	}
-	if x == 0 {
-		if n < 0 && n&1 == 1 {
-			return Inf(1)
-		}
-		return Inf(-1)
-	}
-	sign := false
-	if n < 0 {
-		n = -n
-		if n&1 == 1 {
-			sign = true // sign true if n < 0 && |n| odd
-		}
-	}
-	if n == 1 {
-		if sign {
-			return -Y1(x)
-		}
-		return Y1(x)
-	}
-	var b float64
-	if x >= Two302 { // x > 2**302
-		// (x >> n**2)
-		//	    Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi)
-		//	    Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi)
-		//	    Let s=sin(x), c=cos(x),
-		//		xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then
-		//
-		//		   n	sin(xn)*sqt2	cos(xn)*sqt2
-		//		----------------------------------
-		//		   0	 s-c		 c+s
-		//		   1	-s-c 		-c+s
-		//		   2	-s+c		-c-s
-		//		   3	 s+c		 c-s
-
-		var temp float64
-		switch n & 3 {
-		case 0:
-			temp = Sin(x) - Cos(x)
-		case 1:
-			temp = -Sin(x) - Cos(x)
-		case 2:
-			temp = -Sin(x) + Cos(x)
-		case 3:
-			temp = Sin(x) + Cos(x)
-		}
-		b = (1 / SqrtPi) * temp / Sqrt(x)
-	} else {
-		a := Y0(x)
-		b = Y1(x)
-		// quit if b is -inf
-		for i := 1; i < n && !IsInf(b, -1); i++ {
-			a, b = b, (float64(i+i)/x)*b-a
-		}
-	}
-	if sign {
-		return -b
-	}
-	return b
-}
diff --git a/third_party/gofrontend/libgo/go/math/ldexp.go b/third_party/gofrontend/libgo/go/math/ldexp.go
deleted file mode 100644
index 2898f5d..0000000
--- a/third_party/gofrontend/libgo/go/math/ldexp.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Ldexp is the inverse of Frexp.
-// It returns frac × 2**exp.
-//
-// Special cases are:
-//	Ldexp(±0, exp) = ±0
-//	Ldexp(±Inf, exp) = ±Inf
-//	Ldexp(NaN, exp) = NaN
-
-//extern ldexp
-func libc_ldexp(float64, int) float64
-
-func Ldexp(frac float64, exp int) float64 {
-	r := libc_ldexp(frac, exp)
-	return r
-}
-
-func ldexp(frac float64, exp int) float64 {
-	// special cases
-	switch {
-	case frac == 0:
-		return frac // correctly return -0
-	case IsInf(frac, 0) || IsNaN(frac):
-		return frac
-	}
-	frac, e := normalize(frac)
-	exp += e
-	x := Float64bits(frac)
-	exp += int(x>>shift)&mask - bias
-	if exp < -1074 {
-		return Copysign(0, frac) // underflow
-	}
-	if exp > 1023 { // overflow
-		if frac < 0 {
-			return Inf(-1)
-		}
-		return Inf(1)
-	}
-	var m float64 = 1
-	if exp < -1022 { // denormal
-		exp += 52
-		m = 1.0 / (1 << 52) // 2**-52
-	}
-	x &^= mask << shift
-	x |= uint64(exp+bias) << shift
-	return m * Float64frombits(x)
-}
diff --git a/third_party/gofrontend/libgo/go/math/lgamma.go b/third_party/gofrontend/libgo/go/math/lgamma.go
deleted file mode 100644
index 6a02c41..0000000
--- a/third_party/gofrontend/libgo/go/math/lgamma.go
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-/*
-	Floating-point logarithm of the Gamma function.
-*/
-
-// The original C code and the long comment below are
-// from FreeBSD's /usr/src/lib/msun/src/e_lgamma_r.c and
-// came with this notice.  The go code is a simplified
-// version of the original C.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunPro, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-// __ieee754_lgamma_r(x, signgamp)
-// Reentrant version of the logarithm of the Gamma function
-// with user provided pointer for the sign of Gamma(x).
-//
-// Method:
-//   1. Argument Reduction for 0 < x <= 8
-//      Since gamma(1+s)=s*gamma(s), for x in [0,8], we may
-//      reduce x to a number in [1.5,2.5] by
-//              lgamma(1+s) = log(s) + lgamma(s)
-//      for example,
-//              lgamma(7.3) = log(6.3) + lgamma(6.3)
-//                          = log(6.3*5.3) + lgamma(5.3)
-//                          = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3)
-//   2. Polynomial approximation of lgamma around its
-//      minimum (ymin=1.461632144968362245) to maintain monotonicity.
-//      On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use
-//              Let z = x-ymin;
-//              lgamma(x) = -1.214862905358496078218 + z**2*poly(z)
-//              poly(z) is a 14 degree polynomial.
-//   2. Rational approximation in the primary interval [2,3]
-//      We use the following approximation:
-//              s = x-2.0;
-//              lgamma(x) = 0.5*s + s*P(s)/Q(s)
-//      with accuracy
-//              |P/Q - (lgamma(x)-0.5s)| < 2**-61.71
-//      Our algorithms are based on the following observation
-//
-//                             zeta(2)-1    2    zeta(3)-1    3
-// lgamma(2+s) = s*(1-Euler) + --------- * s  -  --------- * s  + ...
-//                                 2                 3
-//
-//      where Euler = 0.5772156649... is the Euler constant, which
-//      is very close to 0.5.
-//
-//   3. For x>=8, we have
-//      lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+....
-//      (better formula:
-//         lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...)
-//      Let z = 1/x, then we approximation
-//              f(z) = lgamma(x) - (x-0.5)(log(x)-1)
-//      by
-//                                  3       5             11
-//              w = w0 + w1*z + w2*z  + w3*z  + ... + w6*z
-//      where
-//              |w - f(z)| < 2**-58.74
-//
-//   4. For negative x, since (G is gamma function)
-//              -x*G(-x)*G(x) = pi/sin(pi*x),
-//      we have
-//              G(x) = pi/(sin(pi*x)*(-x)*G(-x))
-//      since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0
-//      Hence, for x<0, signgam = sign(sin(pi*x)) and
-//              lgamma(x) = log(|Gamma(x)|)
-//                        = log(pi/(|x*sin(pi*x)|)) - lgamma(-x);
-//      Note: one should avoid computing pi*(-x) directly in the
-//            computation of sin(pi*(-x)).
-//
-//   5. Special Cases
-//              lgamma(2+s) ~ s*(1-Euler) for tiny s
-//              lgamma(1)=lgamma(2)=0
-//              lgamma(x) ~ -log(x) for tiny x
-//              lgamma(0) = lgamma(inf) = inf
-//              lgamma(-integer) = +-inf
-//
-//
-
-var _lgamA = [...]float64{
-	7.72156649015328655494e-02, // 0x3FB3C467E37DB0C8
-	3.22467033424113591611e-01, // 0x3FD4A34CC4A60FAD
-	6.73523010531292681824e-02, // 0x3FB13E001A5562A7
-	2.05808084325167332806e-02, // 0x3F951322AC92547B
-	7.38555086081402883957e-03, // 0x3F7E404FB68FEFE8
-	2.89051383673415629091e-03, // 0x3F67ADD8CCB7926B
-	1.19270763183362067845e-03, // 0x3F538A94116F3F5D
-	5.10069792153511336608e-04, // 0x3F40B6C689B99C00
-	2.20862790713908385557e-04, // 0x3F2CF2ECED10E54D
-	1.08011567247583939954e-04, // 0x3F1C5088987DFB07
-	2.52144565451257326939e-05, // 0x3EFA7074428CFA52
-	4.48640949618915160150e-05, // 0x3F07858E90A45837
-}
-var _lgamR = [...]float64{
-	1.0, // placeholder
-	1.39200533467621045958e+00, // 0x3FF645A762C4AB74
-	7.21935547567138069525e-01, // 0x3FE71A1893D3DCDC
-	1.71933865632803078993e-01, // 0x3FC601EDCCFBDF27
-	1.86459191715652901344e-02, // 0x3F9317EA742ED475
-	7.77942496381893596434e-04, // 0x3F497DDACA41A95B
-	7.32668430744625636189e-06, // 0x3EDEBAF7A5B38140
-}
-var _lgamS = [...]float64{
-	-7.72156649015328655494e-02, // 0xBFB3C467E37DB0C8
-	2.14982415960608852501e-01,  // 0x3FCB848B36E20878
-	3.25778796408930981787e-01,  // 0x3FD4D98F4F139F59
-	1.46350472652464452805e-01,  // 0x3FC2BB9CBEE5F2F7
-	2.66422703033638609560e-02,  // 0x3F9B481C7E939961
-	1.84028451407337715652e-03,  // 0x3F5E26B67368F239
-	3.19475326584100867617e-05,  // 0x3F00BFECDD17E945
-}
-var _lgamT = [...]float64{
-	4.83836122723810047042e-01,  // 0x3FDEF72BC8EE38A2
-	-1.47587722994593911752e-01, // 0xBFC2E4278DC6C509
-	6.46249402391333854778e-02,  // 0x3FB08B4294D5419B
-	-3.27885410759859649565e-02, // 0xBFA0C9A8DF35B713
-	1.79706750811820387126e-02,  // 0x3F9266E7970AF9EC
-	-1.03142241298341437450e-02, // 0xBF851F9FBA91EC6A
-	6.10053870246291332635e-03,  // 0x3F78FCE0E370E344
-	-3.68452016781138256760e-03, // 0xBF6E2EFFB3E914D7
-	2.25964780900612472250e-03,  // 0x3F6282D32E15C915
-	-1.40346469989232843813e-03, // 0xBF56FE8EBF2D1AF1
-	8.81081882437654011382e-04,  // 0x3F4CDF0CEF61A8E9
-	-5.38595305356740546715e-04, // 0xBF41A6109C73E0EC
-	3.15632070903625950361e-04,  // 0x3F34AF6D6C0EBBF7
-	-3.12754168375120860518e-04, // 0xBF347F24ECC38C38
-	3.35529192635519073543e-04,  // 0x3F35FD3EE8C2D3F4
-}
-var _lgamU = [...]float64{
-	-7.72156649015328655494e-02, // 0xBFB3C467E37DB0C8
-	6.32827064025093366517e-01,  // 0x3FE4401E8B005DFF
-	1.45492250137234768737e+00,  // 0x3FF7475CD119BD6F
-	9.77717527963372745603e-01,  // 0x3FEF497644EA8450
-	2.28963728064692451092e-01,  // 0x3FCD4EAEF6010924
-	1.33810918536787660377e-02,  // 0x3F8B678BBF2BAB09
-}
-var _lgamV = [...]float64{
-	1.0,
-	2.45597793713041134822e+00, // 0x4003A5D7C2BD619C
-	2.12848976379893395361e+00, // 0x40010725A42B18F5
-	7.69285150456672783825e-01, // 0x3FE89DFBE45050AF
-	1.04222645593369134254e-01, // 0x3FBAAE55D6537C88
-	3.21709242282423911810e-03, // 0x3F6A5ABB57D0CF61
-}
-var _lgamW = [...]float64{
-	4.18938533204672725052e-01,  // 0x3FDACFE390C97D69
-	8.33333333333329678849e-02,  // 0x3FB555555555553B
-	-2.77777777728775536470e-03, // 0xBF66C16C16B02E5C
-	7.93650558643019558500e-04,  // 0x3F4A019F98CF38B6
-	-5.95187557450339963135e-04, // 0xBF4380CB8C0FE741
-	8.36339918996282139126e-04,  // 0x3F4B67BA4CDAD5D1
-	-1.63092934096575273989e-03, // 0xBF5AB89D0B9E43E4
-}
-
-// Lgamma returns the natural logarithm and sign (-1 or +1) of Gamma(x).
-//
-// Special cases are:
-//	Lgamma(+Inf) = +Inf
-//	Lgamma(0) = +Inf
-//	Lgamma(-integer) = +Inf
-//	Lgamma(-Inf) = -Inf
-//	Lgamma(NaN) = NaN
-func Lgamma(x float64) (lgamma float64, sign int) {
-	const (
-		Ymin  = 1.461632144968362245
-		Two52 = 1 << 52                     // 0x4330000000000000 ~4.5036e+15
-		Two53 = 1 << 53                     // 0x4340000000000000 ~9.0072e+15
-		Two58 = 1 << 58                     // 0x4390000000000000 ~2.8823e+17
-		Tiny  = 1.0 / (1 << 70)             // 0x3b90000000000000 ~8.47033e-22
-		Tc    = 1.46163214496836224576e+00  // 0x3FF762D86356BE3F
-		Tf    = -1.21486290535849611461e-01 // 0xBFBF19B9BCC38A42
-		// Tt = -(tail of Tf)
-		Tt = -3.63867699703950536541e-18 // 0xBC50C7CAA48A971F
-	)
-	// special cases
-	sign = 1
-	switch {
-	case IsNaN(x):
-		lgamma = x
-		return
-	case IsInf(x, 0):
-		lgamma = x
-		return
-	case x == 0:
-		lgamma = Inf(1)
-		return
-	}
-
-	neg := false
-	if x < 0 {
-		x = -x
-		neg = true
-	}
-
-	if x < Tiny { // if |x| < 2**-70, return -log(|x|)
-		if neg {
-			sign = -1
-		}
-		lgamma = -Log(x)
-		return
-	}
-	var nadj float64
-	if neg {
-		if x >= Two52 { // |x| >= 2**52, must be -integer
-			lgamma = Inf(1)
-			return
-		}
-		t := sinPi(x)
-		if t == 0 {
-			lgamma = Inf(1) // -integer
-			return
-		}
-		nadj = Log(Pi / Abs(t*x))
-		if t < 0 {
-			sign = -1
-		}
-	}
-
-	switch {
-	case x == 1 || x == 2: // purge off 1 and 2
-		lgamma = 0
-		return
-	case x < 2: // use lgamma(x) = lgamma(x+1) - log(x)
-		var y float64
-		var i int
-		if x <= 0.9 {
-			lgamma = -Log(x)
-			switch {
-			case x >= (Ymin - 1 + 0.27): // 0.7316 <= x <=  0.9
-				y = 1 - x
-				i = 0
-			case x >= (Ymin - 1 - 0.27): // 0.2316 <= x < 0.7316
-				y = x - (Tc - 1)
-				i = 1
-			default: // 0 < x < 0.2316
-				y = x
-				i = 2
-			}
-		} else {
-			lgamma = 0
-			switch {
-			case x >= (Ymin + 0.27): // 1.7316 <= x < 2
-				y = 2 - x
-				i = 0
-			case x >= (Ymin - 0.27): // 1.2316 <= x < 1.7316
-				y = x - Tc
-				i = 1
-			default: // 0.9 < x < 1.2316
-				y = x - 1
-				i = 2
-			}
-		}
-		switch i {
-		case 0:
-			z := y * y
-			p1 := _lgamA[0] + z*(_lgamA[2]+z*(_lgamA[4]+z*(_lgamA[6]+z*(_lgamA[8]+z*_lgamA[10]))))
-			p2 := z * (_lgamA[1] + z*(+_lgamA[3]+z*(_lgamA[5]+z*(_lgamA[7]+z*(_lgamA[9]+z*_lgamA[11])))))
-			p := y*p1 + p2
-			lgamma += (p - 0.5*y)
-		case 1:
-			z := y * y
-			w := z * y
-			p1 := _lgamT[0] + w*(_lgamT[3]+w*(_lgamT[6]+w*(_lgamT[9]+w*_lgamT[12]))) // parallel comp
-			p2 := _lgamT[1] + w*(_lgamT[4]+w*(_lgamT[7]+w*(_lgamT[10]+w*_lgamT[13])))
-			p3 := _lgamT[2] + w*(_lgamT[5]+w*(_lgamT[8]+w*(_lgamT[11]+w*_lgamT[14])))
-			p := z*p1 - (Tt - w*(p2+y*p3))
-			lgamma += (Tf + p)
-		case 2:
-			p1 := y * (_lgamU[0] + y*(_lgamU[1]+y*(_lgamU[2]+y*(_lgamU[3]+y*(_lgamU[4]+y*_lgamU[5])))))
-			p2 := 1 + y*(_lgamV[1]+y*(_lgamV[2]+y*(_lgamV[3]+y*(_lgamV[4]+y*_lgamV[5]))))
-			lgamma += (-0.5*y + p1/p2)
-		}
-	case x < 8: // 2 <= x < 8
-		i := int(x)
-		y := x - float64(i)
-		p := y * (_lgamS[0] + y*(_lgamS[1]+y*(_lgamS[2]+y*(_lgamS[3]+y*(_lgamS[4]+y*(_lgamS[5]+y*_lgamS[6]))))))
-		q := 1 + y*(_lgamR[1]+y*(_lgamR[2]+y*(_lgamR[3]+y*(_lgamR[4]+y*(_lgamR[5]+y*_lgamR[6])))))
-		lgamma = 0.5*y + p/q
-		z := 1.0 // Lgamma(1+s) = Log(s) + Lgamma(s)
-		switch i {
-		case 7:
-			z *= (y + 6)
-			fallthrough
-		case 6:
-			z *= (y + 5)
-			fallthrough
-		case 5:
-			z *= (y + 4)
-			fallthrough
-		case 4:
-			z *= (y + 3)
-			fallthrough
-		case 3:
-			z *= (y + 2)
-			lgamma += Log(z)
-		}
-	case x < Two58: // 8 <= x < 2**58
-		t := Log(x)
-		z := 1 / x
-		y := z * z
-		w := _lgamW[0] + z*(_lgamW[1]+y*(_lgamW[2]+y*(_lgamW[3]+y*(_lgamW[4]+y*(_lgamW[5]+y*_lgamW[6])))))
-		lgamma = (x-0.5)*(t-1) + w
-	default: // 2**58 <= x <= Inf
-		lgamma = x * (Log(x) - 1)
-	}
-	if neg {
-		lgamma = nadj - lgamma
-	}
-	return
-}
-
-// sinPi(x) is a helper function for negative x
-func sinPi(x float64) float64 {
-	const (
-		Two52 = 1 << 52 // 0x4330000000000000 ~4.5036e+15
-		Two53 = 1 << 53 // 0x4340000000000000 ~9.0072e+15
-	)
-	if x < 0.25 {
-		return -Sin(Pi * x)
-	}
-
-	// argument reduction
-	z := Floor(x)
-	var n int
-	if z != x { // inexact
-		x = Mod(x, 2)
-		n = int(x * 4)
-	} else {
-		if x >= Two53 { // x must be even
-			x = 0
-			n = 0
-		} else {
-			if x < Two52 {
-				z = x + Two52 // exact
-			}
-			n = int(1 & Float64bits(z))
-			x = float64(n)
-			n <<= 2
-		}
-	}
-	switch n {
-	case 0:
-		x = Sin(Pi * x)
-	case 1, 2:
-		x = Cos(Pi * (0.5 - x))
-	case 3, 4:
-		x = Sin(Pi * (1 - x))
-	case 5, 6:
-		x = -Cos(Pi * (x - 1.5))
-	default:
-		x = Sin(Pi * (x - 2))
-	}
-	return -x
-}
diff --git a/third_party/gofrontend/libgo/go/math/log.go b/third_party/gofrontend/libgo/go/math/log.go
deleted file mode 100644
index 60b5755..0000000
--- a/third_party/gofrontend/libgo/go/math/log.go
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-/*
-	Floating-point logarithm.
-*/
-
-// The original C code, the long comment, and the constants
-// below are from FreeBSD's /usr/src/lib/msun/src/e_log.c
-// and came with this notice.  The go code is a simpler
-// version of the original C.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunPro, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-// __ieee754_log(x)
-// Return the logarithm of x
-//
-// Method :
-//   1. Argument Reduction: find k and f such that
-//			x = 2**k * (1+f),
-//	   where  sqrt(2)/2 < 1+f < sqrt(2) .
-//
-//   2. Approximation of log(1+f).
-//	Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
-//		 = 2s + 2/3 s**3 + 2/5 s**5 + .....,
-//	     	 = 2s + s*R
-//      We use a special Reme algorithm on [0,0.1716] to generate
-//	a polynomial of degree 14 to approximate R.  The maximum error
-//	of this polynomial approximation is bounded by 2**-58.45. In
-//	other words,
-//		        2      4      6      8      10      12      14
-//	    R(z) ~ L1*s +L2*s +L3*s +L4*s +L5*s  +L6*s  +L7*s
-//	(the values of L1 to L7 are listed in the program) and
-//	    |      2          14          |     -58.45
-//	    | L1*s +...+L7*s    -  R(z) | <= 2
-//	    |                             |
-//	Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
-//	In order to guarantee error in log below 1ulp, we compute log by
-//		log(1+f) = f - s*(f - R)		(if f is not too large)
-//		log(1+f) = f - (hfsq - s*(hfsq+R)).	(better accuracy)
-//
-//	3. Finally,  log(x) = k*Ln2 + log(1+f).
-//			    = k*Ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*Ln2_lo)))
-//	   Here Ln2 is split into two floating point number:
-//			Ln2_hi + Ln2_lo,
-//	   where n*Ln2_hi is always exact for |n| < 2000.
-//
-// Special cases:
-//	log(x) is NaN with signal if x < 0 (including -INF) ;
-//	log(+INF) is +INF; log(0) is -INF with signal;
-//	log(NaN) is that NaN with no signal.
-//
-// Accuracy:
-//	according to an error analysis, the error is always less than
-//	1 ulp (unit in the last place).
-//
-// Constants:
-// The hexadecimal values are the intended ones for the following
-// constants. The decimal values may be used, provided that the
-// compiler will convert from decimal to binary accurately enough
-// to produce the hexadecimal values shown.
-
-// Log returns the natural logarithm of x.
-//
-// Special cases are:
-//	Log(+Inf) = +Inf
-//	Log(0) = -Inf
-//	Log(x < 0) = NaN
-//	Log(NaN) = NaN
-
-//extern log
-func libc_log(float64) float64
-
-func Log(x float64) float64 {
-	return libc_log(x)
-}
-
-func log(x float64) float64 {
-	const (
-		Ln2Hi = 6.93147180369123816490e-01 /* 3fe62e42 fee00000 */
-		Ln2Lo = 1.90821492927058770002e-10 /* 3dea39ef 35793c76 */
-		L1    = 6.666666666666735130e-01   /* 3FE55555 55555593 */
-		L2    = 3.999999999940941908e-01   /* 3FD99999 9997FA04 */
-		L3    = 2.857142874366239149e-01   /* 3FD24924 94229359 */
-		L4    = 2.222219843214978396e-01   /* 3FCC71C5 1D8E78AF */
-		L5    = 1.818357216161805012e-01   /* 3FC74664 96CB03DE */
-		L6    = 1.531383769920937332e-01   /* 3FC39A09 D078C69F */
-		L7    = 1.479819860511658591e-01   /* 3FC2F112 DF3E5244 */
-	)
-
-	// special cases
-	switch {
-	case IsNaN(x) || IsInf(x, 1):
-		return x
-	case x < 0:
-		return NaN()
-	case x == 0:
-		return Inf(-1)
-	}
-
-	// reduce
-	f1, ki := Frexp(x)
-	if f1 < Sqrt2/2 {
-		f1 *= 2
-		ki--
-	}
-	f := f1 - 1
-	k := float64(ki)
-
-	// compute
-	s := f / (2 + f)
-	s2 := s * s
-	s4 := s2 * s2
-	t1 := s2 * (L1 + s4*(L3+s4*(L5+s4*L7)))
-	t2 := s4 * (L2 + s4*(L4+s4*L6))
-	R := t1 + t2
-	hfsq := 0.5 * f * f
-	return k*Ln2Hi - ((hfsq - (s*(hfsq+R) + k*Ln2Lo)) - f)
-}
diff --git a/third_party/gofrontend/libgo/go/math/log10.go b/third_party/gofrontend/libgo/go/math/log10.go
deleted file mode 100644
index 2c09d88..0000000
--- a/third_party/gofrontend/libgo/go/math/log10.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Log10 returns the decimal logarithm of x.
-// The special cases are the same as for Log.
-
-//extern log10
-func libc_log10(float64) float64
-
-func Log10(x float64) float64 {
-	return libc_log10(x)
-}
-
-func log10(x float64) float64 {
-	return Log(x) * (1 / Ln10)
-}
-
-// Log2 returns the binary logarithm of x.
-// The special cases are the same as for Log.
-
-func Log2(x float64) float64 {
-	return log2(x)
-}
-
-func log2(x float64) float64 {
-	frac, exp := Frexp(x)
-	// Make sure exact powers of two give an exact answer.
-	// Don't depend on Log(0.5)*(1/Ln2)+exp being exactly exp-1.
-	if frac == 0.5 {
-		return float64(exp - 1)
-	}
-	return Log(frac)*(1/Ln2) + float64(exp)
-}
diff --git a/third_party/gofrontend/libgo/go/math/log1p.go b/third_party/gofrontend/libgo/go/math/log1p.go
deleted file mode 100644
index c8daaaa..0000000
--- a/third_party/gofrontend/libgo/go/math/log1p.go
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// The original C code, the long comment, and the constants
-// below are from FreeBSD's /usr/src/lib/msun/src/s_log1p.c
-// and came with this notice.  The go code is a simplified
-// version of the original C.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunPro, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-//
-// double log1p(double x)
-//
-// Method :
-//   1. Argument Reduction: find k and f such that
-//                      1+x = 2**k * (1+f),
-//         where  sqrt(2)/2 < 1+f < sqrt(2) .
-//
-//      Note. If k=0, then f=x is exact. However, if k!=0, then f
-//      may not be representable exactly. In that case, a correction
-//      term is need. Let u=1+x rounded. Let c = (1+x)-u, then
-//      log(1+x) - log(u) ~ c/u. Thus, we proceed to compute log(u),
-//      and add back the correction term c/u.
-//      (Note: when x > 2**53, one can simply return log(x))
-//
-//   2. Approximation of log1p(f).
-//      Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
-//               = 2s + 2/3 s**3 + 2/5 s**5 + .....,
-//               = 2s + s*R
-//      We use a special Reme algorithm on [0,0.1716] to generate
-//      a polynomial of degree 14 to approximate R The maximum error
-//      of this polynomial approximation is bounded by 2**-58.45. In
-//      other words,
-//                      2      4      6      8      10      12      14
-//          R(z) ~ Lp1*s +Lp2*s +Lp3*s +Lp4*s +Lp5*s  +Lp6*s  +Lp7*s
-//      (the values of Lp1 to Lp7 are listed in the program)
-//      and
-//          |      2          14          |     -58.45
-//          | Lp1*s +...+Lp7*s    -  R(z) | <= 2
-//          |                             |
-//      Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
-//      In order to guarantee error in log below 1ulp, we compute log
-//      by
-//              log1p(f) = f - (hfsq - s*(hfsq+R)).
-//
-//   3. Finally, log1p(x) = k*ln2 + log1p(f).
-//                        = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
-//      Here ln2 is split into two floating point number:
-//                   ln2_hi + ln2_lo,
-//      where n*ln2_hi is always exact for |n| < 2000.
-//
-// Special cases:
-//      log1p(x) is NaN with signal if x < -1 (including -INF) ;
-//      log1p(+INF) is +INF; log1p(-1) is -INF with signal;
-//      log1p(NaN) is that NaN with no signal.
-//
-// Accuracy:
-//      according to an error analysis, the error is always less than
-//      1 ulp (unit in the last place).
-//
-// Constants:
-// The hexadecimal values are the intended ones for the following
-// constants. The decimal values may be used, provided that the
-// compiler will convert from decimal to binary accurately enough
-// to produce the hexadecimal values shown.
-//
-// Note: Assuming log() return accurate answer, the following
-//       algorithm can be used to compute log1p(x) to within a few ULP:
-//
-//              u = 1+x;
-//              if(u==1.0) return x ; else
-//                         return log(u)*(x/(u-1.0));
-//
-//       See HP-15C Advanced Functions Handbook, p.193.
-
-// Log1p returns the natural logarithm of 1 plus its argument x.
-// It is more accurate than Log(1 + x) when x is near zero.
-//
-// Special cases are:
-//	Log1p(+Inf) = +Inf
-//	Log1p(±0) = ±0
-//	Log1p(-1) = -Inf
-//	Log1p(x < -1) = NaN
-//	Log1p(NaN) = NaN
-
-//extern log1p
-func libc_log1p(float64) float64
-
-func Log1p(x float64) float64 {
-	return libc_log1p(x)
-}
-
-func log1p(x float64) float64 {
-	const (
-		Sqrt2M1     = 4.142135623730950488017e-01  // Sqrt(2)-1 = 0x3fda827999fcef34
-		Sqrt2HalfM1 = -2.928932188134524755992e-01 // Sqrt(2)/2-1 = 0xbfd2bec333018866
-		Small       = 1.0 / (1 << 29)              // 2**-29 = 0x3e20000000000000
-		Tiny        = 1.0 / (1 << 54)              // 2**-54
-		Two53       = 1 << 53                      // 2**53
-		Ln2Hi       = 6.93147180369123816490e-01   // 3fe62e42fee00000
-		Ln2Lo       = 1.90821492927058770002e-10   // 3dea39ef35793c76
-		Lp1         = 6.666666666666735130e-01     // 3FE5555555555593
-		Lp2         = 3.999999999940941908e-01     // 3FD999999997FA04
-		Lp3         = 2.857142874366239149e-01     // 3FD2492494229359
-		Lp4         = 2.222219843214978396e-01     // 3FCC71C51D8E78AF
-		Lp5         = 1.818357216161805012e-01     // 3FC7466496CB03DE
-		Lp6         = 1.531383769920937332e-01     // 3FC39A09D078C69F
-		Lp7         = 1.479819860511658591e-01     // 3FC2F112DF3E5244
-	)
-
-	// special cases
-	switch {
-	case x < -1 || IsNaN(x): // includes -Inf
-		return NaN()
-	case x == -1:
-		return Inf(-1)
-	case IsInf(x, 1):
-		return Inf(1)
-	}
-
-	absx := x
-	if absx < 0 {
-		absx = -absx
-	}
-
-	var f float64
-	var iu uint64
-	k := 1
-	if absx < Sqrt2M1 { //  |x| < Sqrt(2)-1
-		if absx < Small { // |x| < 2**-29
-			if absx < Tiny { // |x| < 2**-54
-				return x
-			}
-			return x - x*x*0.5
-		}
-		if x > Sqrt2HalfM1 { // Sqrt(2)/2-1 < x
-			// (Sqrt(2)/2-1) < x < (Sqrt(2)-1)
-			k = 0
-			f = x
-			iu = 1
-		}
-	}
-	var c float64
-	if k != 0 {
-		var u float64
-		if absx < Two53 { // 1<<53
-			u = 1.0 + x
-			iu = Float64bits(u)
-			k = int((iu >> 52) - 1023)
-			if k > 0 {
-				c = 1.0 - (u - x)
-			} else {
-				c = x - (u - 1.0) // correction term
-				c /= u
-			}
-		} else {
-			u = x
-			iu = Float64bits(u)
-			k = int((iu >> 52) - 1023)
-			c = 0
-		}
-		iu &= 0x000fffffffffffff
-		if iu < 0x0006a09e667f3bcd { // mantissa of Sqrt(2)
-			u = Float64frombits(iu | 0x3ff0000000000000) // normalize u
-		} else {
-			k += 1
-			u = Float64frombits(iu | 0x3fe0000000000000) // normalize u/2
-			iu = (0x0010000000000000 - iu) >> 2
-		}
-		f = u - 1.0 // Sqrt(2)/2 < u < Sqrt(2)
-	}
-	hfsq := 0.5 * f * f
-	var s, R, z float64
-	if iu == 0 { // |f| < 2**-20
-		if f == 0 {
-			if k == 0 {
-				return 0
-			} else {
-				c += float64(k) * Ln2Lo
-				return float64(k)*Ln2Hi + c
-			}
-		}
-		R = hfsq * (1.0 - 0.66666666666666666*f) // avoid division
-		if k == 0 {
-			return f - R
-		}
-		return float64(k)*Ln2Hi - ((R - (float64(k)*Ln2Lo + c)) - f)
-	}
-	s = f / (2.0 + f)
-	z = s * s
-	R = z * (Lp1 + z*(Lp2+z*(Lp3+z*(Lp4+z*(Lp5+z*(Lp6+z*Lp7))))))
-	if k == 0 {
-		return f - (hfsq - s*(hfsq+R))
-	}
-	return float64(k)*Ln2Hi - ((hfsq - (s*(hfsq+R) + (float64(k)*Ln2Lo + c))) - f)
-}
diff --git a/third_party/gofrontend/libgo/go/math/logb.go b/third_party/gofrontend/libgo/go/math/logb.go
deleted file mode 100644
index f2769d4..0000000
--- a/third_party/gofrontend/libgo/go/math/logb.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Logb returns the binary exponent of x.
-//
-// Special cases are:
-//	Logb(±Inf) = +Inf
-//	Logb(0) = -Inf
-//	Logb(NaN) = NaN
-func Logb(x float64) float64 {
-	// special cases
-	switch {
-	case x == 0:
-		return Inf(-1)
-	case IsInf(x, 0):
-		return Inf(1)
-	case IsNaN(x):
-		return x
-	}
-	return float64(ilogb(x))
-}
-
-// Ilogb returns the binary exponent of x as an integer.
-//
-// Special cases are:
-//	Ilogb(±Inf) = MaxInt32
-//	Ilogb(0) = MinInt32
-//	Ilogb(NaN) = MaxInt32
-func Ilogb(x float64) int {
-	// special cases
-	switch {
-	case x == 0:
-		return MinInt32
-	case IsNaN(x):
-		return MaxInt32
-	case IsInf(x, 0):
-		return MaxInt32
-	}
-	return ilogb(x)
-}
-
-// logb returns the binary exponent of x. It assumes x is finite and
-// non-zero.
-func ilogb(x float64) int {
-	x, exp := normalize(x)
-	return int((Float64bits(x)>>shift)&mask) - bias + exp
-}
diff --git a/third_party/gofrontend/libgo/go/math/mod.go b/third_party/gofrontend/libgo/go/math/mod.go
deleted file mode 100644
index 0b208f4..0000000
--- a/third_party/gofrontend/libgo/go/math/mod.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2009-2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-/*
-	Floating-point mod function.
-*/
-
-// Mod returns the floating-point remainder of x/y.
-// The magnitude of the result is less than y and its
-// sign agrees with that of x.
-//
-// Special cases are:
-//	Mod(±Inf, y) = NaN
-//	Mod(NaN, y) = NaN
-//	Mod(x, 0) = NaN
-//	Mod(x, ±Inf) = x
-//	Mod(x, NaN) = NaN
-
-//extern fmod
-func libc_fmod(float64, float64) float64
-
-func Mod(x, y float64) float64 {
-	return libc_fmod(x, y)
-}
-
-func mod(x, y float64) float64 {
-	if y == 0 || IsInf(x, 0) || IsNaN(x) || IsNaN(y) {
-		return NaN()
-	}
-	if y < 0 {
-		y = -y
-	}
-
-	yfr, yexp := Frexp(y)
-	sign := false
-	r := x
-	if x < 0 {
-		r = -x
-		sign = true
-	}
-
-	for r >= y {
-		rfr, rexp := Frexp(r)
-		if rfr < yfr {
-			rexp = rexp - 1
-		}
-		r = r - Ldexp(y, rexp-yexp)
-	}
-	if sign {
-		r = -r
-	}
-	return r
-}
diff --git a/third_party/gofrontend/libgo/go/math/modf.go b/third_party/gofrontend/libgo/go/math/modf.go
deleted file mode 100644
index ecec4b7..0000000
--- a/third_party/gofrontend/libgo/go/math/modf.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Modf returns integer and fractional floating-point numbers
-// that sum to f.  Both values have the same sign as f.
-//
-// Special cases are:
-//	Modf(±Inf) = ±Inf, NaN
-//	Modf(NaN) = NaN, NaN
-func Modf(f float64) (int float64, frac float64) {
-	return modf(f)
-}
-
-func modf(f float64) (int float64, frac float64) {
-	if f < 1 {
-		if f < 0 {
-			int, frac = Modf(-f)
-			return -int, -frac
-		}
-		return 0, f
-	}
-
-	x := Float64bits(f)
-	e := uint(x>>shift)&mask - bias
-
-	// Keep the top 12+e bits, the integer part; clear the rest.
-	if e < 64-12 {
-		x &^= 1<<(64-12-e) - 1
-	}
-	int = Float64frombits(x)
-	frac = f - int
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/math/nextafter.go b/third_party/gofrontend/libgo/go/math/nextafter.go
deleted file mode 100644
index 9088e4d..0000000
--- a/third_party/gofrontend/libgo/go/math/nextafter.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Nextafter32 returns the next representable float32 value after x towards y.
-//
-// Special cases are:
-//	Nextafter32(x, x)   = x
-//	Nextafter32(NaN, y) = NaN
-//	Nextafter32(x, NaN) = NaN
-func Nextafter32(x, y float32) (r float32) {
-	switch {
-	case IsNaN(float64(x)) || IsNaN(float64(y)): // special case
-		r = float32(NaN())
-	case x == y:
-		r = x
-	case x == 0:
-		r = float32(Copysign(float64(Float32frombits(1)), float64(y)))
-	case (y > x) == (x > 0):
-		r = Float32frombits(Float32bits(x) + 1)
-	default:
-		r = Float32frombits(Float32bits(x) - 1)
-	}
-	return
-}
-
-// Nextafter returns the next representable float64 value after x towards y.
-//
-// Special cases are:
-//	Nextafter(x, x)   = x
-//	Nextafter(NaN, y) = NaN
-//	Nextafter(x, NaN) = NaN
-func Nextafter(x, y float64) (r float64) {
-	switch {
-	case IsNaN(x) || IsNaN(y): // special case
-		r = NaN()
-	case x == y:
-		r = x
-	case x == 0:
-		r = Copysign(Float64frombits(1), y)
-	case (y > x) == (x > 0):
-		r = Float64frombits(Float64bits(x) + 1)
-	default:
-		r = Float64frombits(Float64bits(x) - 1)
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/math/pow.go b/third_party/gofrontend/libgo/go/math/pow.go
deleted file mode 100644
index 77af256..0000000
--- a/third_party/gofrontend/libgo/go/math/pow.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-func isOddInt(x float64) bool {
-	xi, xf := Modf(x)
-	return xf == 0 && int64(xi)&1 == 1
-}
-
-// Special cases taken from FreeBSD's /usr/src/lib/msun/src/e_pow.c
-// updated by IEEE Std. 754-2008 "Section 9.2.1 Special values".
-
-// Pow returns x**y, the base-x exponential of y.
-//
-// Special cases are (in order):
-//	Pow(x, ±0) = 1 for any x
-//	Pow(1, y) = 1 for any y
-//	Pow(x, 1) = x for any x
-//	Pow(NaN, y) = NaN
-//	Pow(x, NaN) = NaN
-//	Pow(±0, y) = ±Inf for y an odd integer < 0
-//	Pow(±0, -Inf) = +Inf
-//	Pow(±0, +Inf) = +0
-//	Pow(±0, y) = +Inf for finite y < 0 and not an odd integer
-//	Pow(±0, y) = ±0 for y an odd integer > 0
-//	Pow(±0, y) = +0 for finite y > 0 and not an odd integer
-//	Pow(-1, ±Inf) = 1
-//	Pow(x, +Inf) = +Inf for |x| > 1
-//	Pow(x, -Inf) = +0 for |x| > 1
-//	Pow(x, +Inf) = +0 for |x| < 1
-//	Pow(x, -Inf) = +Inf for |x| < 1
-//	Pow(+Inf, y) = +Inf for y > 0
-//	Pow(+Inf, y) = +0 for y < 0
-//	Pow(-Inf, y) = Pow(-0, -y)
-//	Pow(x, y) = NaN for finite x < 0 and finite non-integer y
-func Pow(x, y float64) float64 {
-	switch {
-	case y == 0 || x == 1:
-		return 1
-	case y == 1:
-		return x
-	case y == 0.5:
-		return Sqrt(x)
-	case y == -0.5:
-		return 1 / Sqrt(x)
-	case IsNaN(x) || IsNaN(y):
-		return NaN()
-	case x == 0:
-		switch {
-		case y < 0:
-			if isOddInt(y) {
-				return Copysign(Inf(1), x)
-			}
-			return Inf(1)
-		case y > 0:
-			if isOddInt(y) {
-				return x
-			}
-			return 0
-		}
-	case IsInf(y, 0):
-		switch {
-		case x == -1:
-			return 1
-		case (Abs(x) < 1) == IsInf(y, 1):
-			return 0
-		default:
-			return Inf(1)
-		}
-	case IsInf(x, 0):
-		if IsInf(x, -1) {
-			return Pow(1/x, -y) // Pow(-0, -y)
-		}
-		switch {
-		case y < 0:
-			return 0
-		case y > 0:
-			return Inf(1)
-		}
-	}
-
-	absy := y
-	flip := false
-	if absy < 0 {
-		absy = -absy
-		flip = true
-	}
-	yi, yf := Modf(absy)
-	if yf != 0 && x < 0 {
-		return NaN()
-	}
-	if yi >= 1<<63 {
-		return Exp(y * Log(x))
-	}
-
-	// ans = a1 * 2**ae (= 1 for now).
-	a1 := 1.0
-	ae := 0
-
-	// ans *= x**yf
-	if yf != 0 {
-		if yf > 0.5 {
-			yf--
-			yi++
-		}
-		a1 = Exp(yf * Log(x))
-	}
-
-	// ans *= x**yi
-	// by multiplying in successive squarings
-	// of x according to bits of yi.
-	// accumulate powers of two into exp.
-	x1, xe := Frexp(x)
-	for i := int64(yi); i != 0; i >>= 1 {
-		if i&1 == 1 {
-			a1 *= x1
-			ae += xe
-		}
-		x1 *= x1
-		xe <<= 1
-		if x1 < .5 {
-			x1 += x1
-			xe--
-		}
-	}
-
-	// ans = a1*2**ae
-	// if flip { ans = 1 / ans }
-	// but in the opposite order
-	if flip {
-		a1 = 1 / a1
-		ae = -ae
-	}
-	return Ldexp(a1, ae)
-}
diff --git a/third_party/gofrontend/libgo/go/math/pow10.go b/third_party/gofrontend/libgo/go/math/pow10.go
deleted file mode 100644
index f5ad28b..0000000
--- a/third_party/gofrontend/libgo/go/math/pow10.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// This table might overflow 127-bit exponent representations.
-// In that case, truncate it after 1.0e38.
-var pow10tab [70]float64
-
-// Pow10 returns 10**e, the base-10 exponential of e.
-//
-// Special cases are:
-//	Pow10(e) = +Inf for e > 309
-//	Pow10(e) = 0 for e < -324
-func Pow10(e int) float64 {
-	if e <= -325 {
-		return 0
-	} else if e > 309 {
-		return Inf(1)
-	}
-
-	if e < 0 {
-		return 1 / Pow10(-e)
-	}
-	if e < len(pow10tab) {
-		return pow10tab[e]
-	}
-	m := e / 2
-	return Pow10(m) * Pow10(e-m)
-}
-
-func init() {
-	pow10tab[0] = 1.0e0
-	pow10tab[1] = 1.0e1
-	for i := 2; i < len(pow10tab); i++ {
-		m := i / 2
-		pow10tab[i] = pow10tab[m] * pow10tab[i-m]
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/rand/exp.go b/third_party/gofrontend/libgo/go/math/rand/exp.go
deleted file mode 100644
index 4bc110f..0000000
--- a/third_party/gofrontend/libgo/go/math/rand/exp.go
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rand
-
-import (
-	"math"
-)
-
-/*
- * Exponential distribution
- *
- * See "The Ziggurat Method for Generating Random Variables"
- * (Marsaglia & Tsang, 2000)
- * http://www.jstatsoft.org/v05/i08/paper [pdf]
- */
-
-const (
-	re = 7.69711747013104972
-)
-
-// ExpFloat64 returns an exponentially distributed float64 in the range
-// (0, +math.MaxFloat64] with an exponential distribution whose rate parameter
-// (lambda) is 1 and whose mean is 1/lambda (1).
-// To produce a distribution with a different rate parameter,
-// callers can adjust the output using:
-//
-//  sample = ExpFloat64() / desiredRateParameter
-//
-func (r *Rand) ExpFloat64() float64 {
-	for {
-		j := r.Uint32()
-		i := j & 0xFF
-		x := float64(j) * float64(we[i])
-		if j < ke[i] {
-			return x
-		}
-		if i == 0 {
-			return re - math.Log(r.Float64())
-		}
-		if fe[i]+float32(r.Float64())*(fe[i-1]-fe[i]) < float32(math.Exp(-x)) {
-			return x
-		}
-	}
-}
-
-var ke = [256]uint32{
-	0xe290a139, 0x0, 0x9beadebc, 0xc377ac71, 0xd4ddb990,
-	0xde893fb8, 0xe4a8e87c, 0xe8dff16a, 0xebf2deab, 0xee49a6e8,
-	0xf0204efd, 0xf19bdb8e, 0xf2d458bb, 0xf3da104b, 0xf4b86d78,
-	0xf577ad8a, 0xf61de83d, 0xf6afb784, 0xf730a573, 0xf7a37651,
-	0xf80a5bb6, 0xf867189d, 0xf8bb1b4f, 0xf9079062, 0xf94d70ca,
-	0xf98d8c7d, 0xf9c8928a, 0xf9ff175b, 0xfa319996, 0xfa6085f8,
-	0xfa8c3a62, 0xfab5084e, 0xfadb36c8, 0xfaff0410, 0xfb20a6ea,
-	0xfb404fb4, 0xfb5e2951, 0xfb7a59e9, 0xfb95038c, 0xfbae44ba,
-	0xfbc638d8, 0xfbdcf892, 0xfbf29a30, 0xfc0731df, 0xfc1ad1ed,
-	0xfc2d8b02, 0xfc3f6c4d, 0xfc5083ac, 0xfc60ddd1, 0xfc708662,
-	0xfc7f8810, 0xfc8decb4, 0xfc9bbd62, 0xfca9027c, 0xfcb5c3c3,
-	0xfcc20864, 0xfccdd70a, 0xfcd935e3, 0xfce42ab0, 0xfceebace,
-	0xfcf8eb3b, 0xfd02c0a0, 0xfd0c3f59, 0xfd156b7b, 0xfd1e48d6,
-	0xfd26daff, 0xfd2f2552, 0xfd372af7, 0xfd3eeee5, 0xfd4673e7,
-	0xfd4dbc9e, 0xfd54cb85, 0xfd5ba2f2, 0xfd62451b, 0xfd68b415,
-	0xfd6ef1da, 0xfd750047, 0xfd7ae120, 0xfd809612, 0xfd8620b4,
-	0xfd8b8285, 0xfd90bcf5, 0xfd95d15e, 0xfd9ac10b, 0xfd9f8d36,
-	0xfda43708, 0xfda8bf9e, 0xfdad2806, 0xfdb17141, 0xfdb59c46,
-	0xfdb9a9fd, 0xfdbd9b46, 0xfdc170f6, 0xfdc52bd8, 0xfdc8ccac,
-	0xfdcc542d, 0xfdcfc30b, 0xfdd319ef, 0xfdd6597a, 0xfdd98245,
-	0xfddc94e5, 0xfddf91e6, 0xfde279ce, 0xfde54d1f, 0xfde80c52,
-	0xfdeab7de, 0xfded5034, 0xfdefd5be, 0xfdf248e3, 0xfdf4aa06,
-	0xfdf6f984, 0xfdf937b6, 0xfdfb64f4, 0xfdfd818d, 0xfdff8dd0,
-	0xfe018a08, 0xfe03767a, 0xfe05536c, 0xfe07211c, 0xfe08dfc9,
-	0xfe0a8fab, 0xfe0c30fb, 0xfe0dc3ec, 0xfe0f48b1, 0xfe10bf76,
-	0xfe122869, 0xfe1383b4, 0xfe14d17c, 0xfe1611e7, 0xfe174516,
-	0xfe186b2a, 0xfe19843e, 0xfe1a9070, 0xfe1b8fd6, 0xfe1c8289,
-	0xfe1d689b, 0xfe1e4220, 0xfe1f0f26, 0xfe1fcfbc, 0xfe2083ed,
-	0xfe212bc3, 0xfe21c745, 0xfe225678, 0xfe22d95f, 0xfe234ffb,
-	0xfe23ba4a, 0xfe241849, 0xfe2469f2, 0xfe24af3c, 0xfe24e81e,
-	0xfe25148b, 0xfe253474, 0xfe2547c7, 0xfe254e70, 0xfe25485a,
-	0xfe25356a, 0xfe251586, 0xfe24e88f, 0xfe24ae64, 0xfe2466e1,
-	0xfe2411df, 0xfe23af34, 0xfe233eb4, 0xfe22c02c, 0xfe22336b,
-	0xfe219838, 0xfe20ee58, 0xfe20358c, 0xfe1f6d92, 0xfe1e9621,
-	0xfe1daef0, 0xfe1cb7ac, 0xfe1bb002, 0xfe1a9798, 0xfe196e0d,
-	0xfe1832fd, 0xfe16e5fe, 0xfe15869d, 0xfe141464, 0xfe128ed3,
-	0xfe10f565, 0xfe0f478c, 0xfe0d84b1, 0xfe0bac36, 0xfe09bd73,
-	0xfe07b7b5, 0xfe059a40, 0xfe03644c, 0xfe011504, 0xfdfeab88,
-	0xfdfc26e9, 0xfdf98629, 0xfdf6c83b, 0xfdf3ec01, 0xfdf0f04a,
-	0xfdedd3d1, 0xfdea953d, 0xfde7331e, 0xfde3abe9, 0xfddffdfb,
-	0xfddc2791, 0xfdd826cd, 0xfdd3f9a8, 0xfdcf9dfc, 0xfdcb1176,
-	0xfdc65198, 0xfdc15bb3, 0xfdbc2ce2, 0xfdb6c206, 0xfdb117be,
-	0xfdab2a63, 0xfda4f5fd, 0xfd9e7640, 0xfd97a67a, 0xfd908192,
-	0xfd8901f2, 0xfd812182, 0xfd78d98e, 0xfd7022bb, 0xfd66f4ed,
-	0xfd5d4732, 0xfd530f9c, 0xfd48432b, 0xfd3cd59a, 0xfd30b936,
-	0xfd23dea4, 0xfd16349e, 0xfd07a7a3, 0xfcf8219b, 0xfce7895b,
-	0xfcd5c220, 0xfcc2aadb, 0xfcae1d5e, 0xfc97ed4e, 0xfc7fe6d4,
-	0xfc65ccf3, 0xfc495762, 0xfc2a2fc8, 0xfc07ee19, 0xfbe213c1,
-	0xfbb8051a, 0xfb890078, 0xfb5411a5, 0xfb180005, 0xfad33482,
-	0xfa839276, 0xfa263b32, 0xf9b72d1c, 0xf930a1a2, 0xf889f023,
-	0xf7b577d2, 0xf69c650c, 0xf51530f0, 0xf2cb0e3c, 0xeeefb15d,
-	0xe6da6ecf,
-}
-var we = [256]float32{
-	2.0249555e-09, 1.486674e-11, 2.4409617e-11, 3.1968806e-11,
-	3.844677e-11, 4.4228204e-11, 4.9516443e-11, 5.443359e-11,
-	5.905944e-11, 6.344942e-11, 6.7643814e-11, 7.1672945e-11,
-	7.556032e-11, 7.932458e-11, 8.298079e-11, 8.654132e-11,
-	9.0016515e-11, 9.3415074e-11, 9.674443e-11, 1.0001099e-10,
-	1.03220314e-10, 1.06377254e-10, 1.09486115e-10, 1.1255068e-10,
-	1.1557435e-10, 1.1856015e-10, 1.2151083e-10, 1.2442886e-10,
-	1.2731648e-10, 1.3017575e-10, 1.3300853e-10, 1.3581657e-10,
-	1.3860142e-10, 1.4136457e-10, 1.4410738e-10, 1.4683108e-10,
-	1.4953687e-10, 1.5222583e-10, 1.54899e-10, 1.5755733e-10,
-	1.6020171e-10, 1.6283301e-10, 1.6545203e-10, 1.6805951e-10,
-	1.7065617e-10, 1.732427e-10, 1.7581973e-10, 1.7838787e-10,
-	1.8094774e-10, 1.8349985e-10, 1.8604476e-10, 1.8858298e-10,
-	1.9111498e-10, 1.9364126e-10, 1.9616223e-10, 1.9867835e-10,
-	2.0119004e-10, 2.0369768e-10, 2.0620168e-10, 2.087024e-10,
-	2.1120022e-10, 2.136955e-10, 2.1618855e-10, 2.1867974e-10,
-	2.2116936e-10, 2.2365775e-10, 2.261452e-10, 2.2863202e-10,
-	2.311185e-10, 2.3360494e-10, 2.360916e-10, 2.3857874e-10,
-	2.4106667e-10, 2.4355562e-10, 2.4604588e-10, 2.485377e-10,
-	2.5103128e-10, 2.5352695e-10, 2.560249e-10, 2.585254e-10,
-	2.6102867e-10, 2.6353494e-10, 2.6604446e-10, 2.6855745e-10,
-	2.7107416e-10, 2.7359479e-10, 2.761196e-10, 2.7864877e-10,
-	2.8118255e-10, 2.8372119e-10, 2.8626485e-10, 2.888138e-10,
-	2.9136826e-10, 2.939284e-10, 2.9649452e-10, 2.9906677e-10,
-	3.016454e-10, 3.0423064e-10, 3.0682268e-10, 3.0942177e-10,
-	3.1202813e-10, 3.1464195e-10, 3.1726352e-10, 3.19893e-10,
-	3.2253064e-10, 3.251767e-10, 3.2783135e-10, 3.3049485e-10,
-	3.3316744e-10, 3.3584938e-10, 3.3854083e-10, 3.4124212e-10,
-	3.4395342e-10, 3.46675e-10, 3.4940711e-10, 3.5215003e-10,
-	3.5490397e-10, 3.5766917e-10, 3.6044595e-10, 3.6323455e-10,
-	3.660352e-10, 3.6884823e-10, 3.7167386e-10, 3.745124e-10,
-	3.773641e-10, 3.802293e-10, 3.8310827e-10, 3.860013e-10,
-	3.8890866e-10, 3.918307e-10, 3.9476775e-10, 3.9772008e-10,
-	4.0068804e-10, 4.0367196e-10, 4.0667217e-10, 4.09689e-10,
-	4.1272286e-10, 4.1577405e-10, 4.1884296e-10, 4.2192994e-10,
-	4.250354e-10, 4.281597e-10, 4.313033e-10, 4.3446652e-10,
-	4.3764986e-10, 4.408537e-10, 4.4407847e-10, 4.4732465e-10,
-	4.5059267e-10, 4.5388301e-10, 4.571962e-10, 4.6053267e-10,
-	4.6389292e-10, 4.6727755e-10, 4.70687e-10, 4.741219e-10,
-	4.7758275e-10, 4.810702e-10, 4.845848e-10, 4.8812715e-10,
-	4.9169796e-10, 4.9529775e-10, 4.989273e-10, 5.0258725e-10,
-	5.0627835e-10, 5.100013e-10, 5.1375687e-10, 5.1754584e-10,
-	5.21369e-10, 5.2522725e-10, 5.2912136e-10, 5.330522e-10,
-	5.370208e-10, 5.4102806e-10, 5.45075e-10, 5.491625e-10,
-	5.532918e-10, 5.5746385e-10, 5.616799e-10, 5.6594107e-10,
-	5.7024857e-10, 5.746037e-10, 5.7900773e-10, 5.834621e-10,
-	5.8796823e-10, 5.925276e-10, 5.971417e-10, 6.018122e-10,
-	6.065408e-10, 6.113292e-10, 6.1617933e-10, 6.2109295e-10,
-	6.260722e-10, 6.3111916e-10, 6.3623595e-10, 6.4142497e-10,
-	6.4668854e-10, 6.5202926e-10, 6.5744976e-10, 6.6295286e-10,
-	6.6854156e-10, 6.742188e-10, 6.79988e-10, 6.858526e-10,
-	6.9181616e-10, 6.978826e-10, 7.04056e-10, 7.103407e-10,
-	7.167412e-10, 7.2326256e-10, 7.2990985e-10, 7.366886e-10,
-	7.4360473e-10, 7.5066453e-10, 7.5787476e-10, 7.6524265e-10,
-	7.7277595e-10, 7.80483e-10, 7.883728e-10, 7.9645507e-10,
-	8.047402e-10, 8.1323964e-10, 8.219657e-10, 8.309319e-10,
-	8.401528e-10, 8.496445e-10, 8.594247e-10, 8.6951274e-10,
-	8.799301e-10, 8.9070046e-10, 9.018503e-10, 9.134092e-10,
-	9.254101e-10, 9.378904e-10, 9.508923e-10, 9.644638e-10,
-	9.786603e-10, 9.935448e-10, 1.0091913e-09, 1.025686e-09,
-	1.0431306e-09, 1.0616465e-09, 1.08138e-09, 1.1025096e-09,
-	1.1252564e-09, 1.1498986e-09, 1.1767932e-09, 1.206409e-09,
-	1.2393786e-09, 1.276585e-09, 1.3193139e-09, 1.3695435e-09,
-	1.4305498e-09, 1.508365e-09, 1.6160854e-09, 1.7921248e-09,
-}
-var fe = [256]float32{
-	1, 0.9381437, 0.90046996, 0.87170434, 0.8477855, 0.8269933,
-	0.8084217, 0.7915276, 0.77595687, 0.7614634, 0.7478686,
-	0.7350381, 0.72286767, 0.71127474, 0.70019263, 0.6895665,
-	0.67935055, 0.6695063, 0.66000086, 0.65080583, 0.6418967,
-	0.63325197, 0.6248527, 0.6166822, 0.60872537, 0.60096896,
-	0.5934009, 0.58601034, 0.5787874, 0.57172304, 0.5648092,
-	0.5580383, 0.5514034, 0.5448982, 0.5385169, 0.53225386,
-	0.5261042, 0.52006316, 0.5141264, 0.50828975, 0.5025495,
-	0.496902, 0.49134386, 0.485872, 0.48048335, 0.4751752,
-	0.46994483, 0.46478975, 0.45970762, 0.45469615, 0.44975325,
-	0.44487688, 0.44006512, 0.43531612, 0.43062815, 0.42599955,
-	0.42142874, 0.4169142, 0.41245446, 0.40804818, 0.403694,
-	0.3993907, 0.39513698, 0.39093173, 0.38677382, 0.38266218,
-	0.37859577, 0.37457356, 0.37059465, 0.3666581, 0.362763,
-	0.35890847, 0.35509375, 0.351318, 0.3475805, 0.34388044,
-	0.34021714, 0.3365899, 0.33299807, 0.32944095, 0.32591796,
-	0.3224285, 0.3189719, 0.31554767, 0.31215525, 0.30879408,
-	0.3054636, 0.3021634, 0.29889292, 0.2956517, 0.29243928,
-	0.28925523, 0.28609908, 0.28297043, 0.27986884, 0.27679393,
-	0.2737453, 0.2707226, 0.2677254, 0.26475343, 0.26180625,
-	0.25888354, 0.25598502, 0.2531103, 0.25025907, 0.24743107,
-	0.24462597, 0.24184346, 0.23908329, 0.23634516, 0.23362878,
-	0.23093392, 0.2282603, 0.22560766, 0.22297576, 0.22036438,
-	0.21777324, 0.21520215, 0.21265087, 0.21011916, 0.20760682,
-	0.20511365, 0.20263945, 0.20018397, 0.19774707, 0.19532852,
-	0.19292815, 0.19054577, 0.1881812, 0.18583426, 0.18350479,
-	0.1811926, 0.17889754, 0.17661946, 0.17435817, 0.17211354,
-	0.1698854, 0.16767362, 0.16547804, 0.16329853, 0.16113494,
-	0.15898713, 0.15685499, 0.15473837, 0.15263714, 0.15055119,
-	0.14848037, 0.14642459, 0.14438373, 0.14235765, 0.14034624,
-	0.13834943, 0.13636707, 0.13439907, 0.13244532, 0.13050574,
-	0.1285802, 0.12666863, 0.12477092, 0.12288698, 0.12101672,
-	0.119160056, 0.1173169, 0.115487166, 0.11367077, 0.11186763,
-	0.11007768, 0.10830083, 0.10653701, 0.10478614, 0.10304816,
-	0.101323, 0.09961058, 0.09791085, 0.09622374, 0.09454919,
-	0.09288713, 0.091237515, 0.08960028, 0.087975375, 0.08636274,
-	0.08476233, 0.083174095, 0.081597984, 0.08003395, 0.07848195,
-	0.076941945, 0.07541389, 0.07389775, 0.072393484, 0.07090106,
-	0.069420435, 0.06795159, 0.066494495, 0.06504912, 0.063615434,
-	0.062193416, 0.060783047, 0.059384305, 0.057997175,
-	0.05662164, 0.05525769, 0.053905312, 0.052564494, 0.051235236,
-	0.049917534, 0.048611384, 0.047316793, 0.046033762, 0.0447623,
-	0.043502413, 0.042254124, 0.041017443, 0.039792392,
-	0.038578995, 0.037377283, 0.036187284, 0.035009038,
-	0.033842582, 0.032687962, 0.031545233, 0.030414443, 0.02929566,
-	0.02818895, 0.027094385, 0.026012046, 0.024942026, 0.023884421,
-	0.022839336, 0.021806888, 0.020787204, 0.019780423, 0.0187867,
-	0.0178062, 0.016839107, 0.015885621, 0.014945968, 0.014020392,
-	0.013109165, 0.012212592, 0.011331013, 0.01046481, 0.009614414,
-	0.008780315, 0.007963077, 0.0071633533, 0.006381906,
-	0.0056196423, 0.0048776558, 0.004157295, 0.0034602648,
-	0.0027887989, 0.0021459677, 0.0015362998, 0.0009672693,
-	0.00045413437,
-}
diff --git a/third_party/gofrontend/libgo/go/math/rand/normal.go b/third_party/gofrontend/libgo/go/math/rand/normal.go
deleted file mode 100644
index ba4ea54..0000000
--- a/third_party/gofrontend/libgo/go/math/rand/normal.go
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rand
-
-import (
-	"math"
-)
-
-/*
- * Normal distribution
- *
- * See "The Ziggurat Method for Generating Random Variables"
- * (Marsaglia & Tsang, 2000)
- * http://www.jstatsoft.org/v05/i08/paper [pdf]
- */
-
-const (
-	rn = 3.442619855899
-)
-
-func absInt32(i int32) uint32 {
-	if i < 0 {
-		return uint32(-i)
-	}
-	return uint32(i)
-}
-
-// NormFloat64 returns a normally distributed float64 in the range
-// [-math.MaxFloat64, +math.MaxFloat64] with
-// standard normal distribution (mean = 0, stddev = 1).
-// To produce a different normal distribution, callers can
-// adjust the output using:
-//
-//  sample = NormFloat64() * desiredStdDev + desiredMean
-//
-func (r *Rand) NormFloat64() float64 {
-	for {
-		j := int32(r.Uint32()) // Possibly negative
-		i := j & 0x7F
-		x := float64(j) * float64(wn[i])
-		if absInt32(j) < kn[i] {
-			// This case should be hit better than 99% of the time.
-			return x
-		}
-
-		if i == 0 {
-			// This extra work is only required for the base strip.
-			for {
-				x = -math.Log(r.Float64()) * (1.0 / rn)
-				y := -math.Log(r.Float64())
-				if y+y >= x*x {
-					break
-				}
-			}
-			if j > 0 {
-				return rn + x
-			}
-			return -rn - x
-		}
-		if fn[i]+float32(r.Float64())*(fn[i-1]-fn[i]) < float32(math.Exp(-.5*x*x)) {
-			return x
-		}
-	}
-}
-
-var kn = [128]uint32{
-	0x76ad2212, 0x0, 0x600f1b53, 0x6ce447a6, 0x725b46a2,
-	0x7560051d, 0x774921eb, 0x789a25bd, 0x799045c3, 0x7a4bce5d,
-	0x7adf629f, 0x7b5682a6, 0x7bb8a8c6, 0x7c0ae722, 0x7c50cce7,
-	0x7c8cec5b, 0x7cc12cd6, 0x7ceefed2, 0x7d177e0b, 0x7d3b8883,
-	0x7d5bce6c, 0x7d78dd64, 0x7d932886, 0x7dab0e57, 0x7dc0dd30,
-	0x7dd4d688, 0x7de73185, 0x7df81cea, 0x7e07c0a3, 0x7e163efa,
-	0x7e23b587, 0x7e303dfd, 0x7e3beec2, 0x7e46db77, 0x7e51155d,
-	0x7e5aabb3, 0x7e63abf7, 0x7e6c222c, 0x7e741906, 0x7e7b9a18,
-	0x7e82adfa, 0x7e895c63, 0x7e8fac4b, 0x7e95a3fb, 0x7e9b4924,
-	0x7ea0a0ef, 0x7ea5b00d, 0x7eaa7ac3, 0x7eaf04f3, 0x7eb3522a,
-	0x7eb765a5, 0x7ebb4259, 0x7ebeeafd, 0x7ec2620a, 0x7ec5a9c4,
-	0x7ec8c441, 0x7ecbb365, 0x7ece78ed, 0x7ed11671, 0x7ed38d62,
-	0x7ed5df12, 0x7ed80cb4, 0x7eda175c, 0x7edc0005, 0x7eddc78e,
-	0x7edf6ebf, 0x7ee0f647, 0x7ee25ebe, 0x7ee3a8a9, 0x7ee4d473,
-	0x7ee5e276, 0x7ee6d2f5, 0x7ee7a620, 0x7ee85c10, 0x7ee8f4cd,
-	0x7ee97047, 0x7ee9ce59, 0x7eea0eca, 0x7eea3147, 0x7eea3568,
-	0x7eea1aab, 0x7ee9e071, 0x7ee98602, 0x7ee90a88, 0x7ee86d08,
-	0x7ee7ac6a, 0x7ee6c769, 0x7ee5bc9c, 0x7ee48a67, 0x7ee32efc,
-	0x7ee1a857, 0x7edff42f, 0x7ede0ffa, 0x7edbf8d9, 0x7ed9ab94,
-	0x7ed7248d, 0x7ed45fae, 0x7ed1585c, 0x7ece095f, 0x7eca6ccb,
-	0x7ec67be2, 0x7ec22eee, 0x7ebd7d1a, 0x7eb85c35, 0x7eb2c075,
-	0x7eac9c20, 0x7ea5df27, 0x7e9e769f, 0x7e964c16, 0x7e8d44ba,
-	0x7e834033, 0x7e781728, 0x7e6b9933, 0x7e5d8a1a, 0x7e4d9ded,
-	0x7e3b737a, 0x7e268c2f, 0x7e0e3ff5, 0x7df1aa5d, 0x7dcf8c72,
-	0x7da61a1e, 0x7d72a0fb, 0x7d30e097, 0x7cd9b4ab, 0x7c600f1a,
-	0x7ba90bdc, 0x7a722176, 0x77d664e5,
-}
-var wn = [128]float32{
-	1.7290405e-09, 1.2680929e-10, 1.6897518e-10, 1.9862688e-10,
-	2.2232431e-10, 2.4244937e-10, 2.601613e-10, 2.7611988e-10,
-	2.9073963e-10, 3.042997e-10, 3.1699796e-10, 3.289802e-10,
-	3.4035738e-10, 3.5121603e-10, 3.616251e-10, 3.7164058e-10,
-	3.8130857e-10, 3.9066758e-10, 3.9975012e-10, 4.08584e-10,
-	4.1719309e-10, 4.2559822e-10, 4.338176e-10, 4.418672e-10,
-	4.497613e-10, 4.5751258e-10, 4.651324e-10, 4.7263105e-10,
-	4.8001775e-10, 4.87301e-10, 4.944885e-10, 5.015873e-10,
-	5.0860405e-10, 5.155446e-10, 5.2241467e-10, 5.2921934e-10,
-	5.359635e-10, 5.426517e-10, 5.4928817e-10, 5.5587696e-10,
-	5.624219e-10, 5.6892646e-10, 5.753941e-10, 5.818282e-10,
-	5.882317e-10, 5.946077e-10, 6.00959e-10, 6.072884e-10,
-	6.135985e-10, 6.19892e-10, 6.2617134e-10, 6.3243905e-10,
-	6.386974e-10, 6.449488e-10, 6.511956e-10, 6.5744005e-10,
-	6.6368433e-10, 6.699307e-10, 6.7618144e-10, 6.824387e-10,
-	6.8870465e-10, 6.949815e-10, 7.012715e-10, 7.075768e-10,
-	7.1389966e-10, 7.202424e-10, 7.266073e-10, 7.329966e-10,
-	7.394128e-10, 7.4585826e-10, 7.5233547e-10, 7.58847e-10,
-	7.653954e-10, 7.719835e-10, 7.7861395e-10, 7.852897e-10,
-	7.920138e-10, 7.987892e-10, 8.0561924e-10, 8.125073e-10,
-	8.194569e-10, 8.2647167e-10, 8.3355556e-10, 8.407127e-10,
-	8.479473e-10, 8.55264e-10, 8.6266755e-10, 8.7016316e-10,
-	8.777562e-10, 8.8545243e-10, 8.932582e-10, 9.0117996e-10,
-	9.09225e-10, 9.174008e-10, 9.2571584e-10, 9.341788e-10,
-	9.427997e-10, 9.515889e-10, 9.605579e-10, 9.697193e-10,
-	9.790869e-10, 9.88676e-10, 9.985036e-10, 1.0085882e-09,
-	1.0189509e-09, 1.0296151e-09, 1.0406069e-09, 1.0519566e-09,
-	1.063698e-09, 1.0758702e-09, 1.0885183e-09, 1.1016947e-09,
-	1.1154611e-09, 1.1298902e-09, 1.1450696e-09, 1.1611052e-09,
-	1.1781276e-09, 1.1962995e-09, 1.2158287e-09, 1.2369856e-09,
-	1.2601323e-09, 1.2857697e-09, 1.3146202e-09, 1.347784e-09,
-	1.3870636e-09, 1.4357403e-09, 1.5008659e-09, 1.6030948e-09,
-}
-var fn = [128]float32{
-	1, 0.9635997, 0.9362827, 0.9130436, 0.89228165, 0.87324303,
-	0.8555006, 0.8387836, 0.8229072, 0.8077383, 0.793177,
-	0.7791461, 0.7655842, 0.7524416, 0.73967725, 0.7272569,
-	0.7151515, 0.7033361, 0.69178915, 0.68049186, 0.6694277,
-	0.658582, 0.6479418, 0.63749546, 0.6272325, 0.6171434,
-	0.6072195, 0.5974532, 0.58783704, 0.5783647, 0.56903,
-	0.5598274, 0.5507518, 0.54179835, 0.5329627, 0.52424055,
-	0.5156282, 0.50712204, 0.49871865, 0.49041483, 0.48220766,
-	0.4740943, 0.46607214, 0.4581387, 0.45029163, 0.44252872,
-	0.43484783, 0.427247, 0.41972435, 0.41227803, 0.40490642,
-	0.39760786, 0.3903808, 0.3832238, 0.37613547, 0.36911446,
-	0.3621595, 0.35526937, 0.34844297, 0.34167916, 0.33497685,
-	0.3283351, 0.3217529, 0.3152294, 0.30876362, 0.30235484,
-	0.29600215, 0.28970486, 0.2834622, 0.2772735, 0.27113807,
-	0.2650553, 0.25902456, 0.2530453, 0.24711695, 0.241239,
-	0.23541094, 0.22963232, 0.2239027, 0.21822165, 0.21258877,
-	0.20700371, 0.20146611, 0.19597565, 0.19053204, 0.18513499,
-	0.17978427, 0.17447963, 0.1692209, 0.16400786, 0.15884037,
-	0.15371831, 0.14864157, 0.14361008, 0.13862377, 0.13368265,
-	0.12878671, 0.12393598, 0.119130544, 0.11437051, 0.10965602,
-	0.104987256, 0.10036444, 0.095787846, 0.0912578, 0.08677467,
-	0.0823389, 0.077950984, 0.073611505, 0.06932112, 0.06508058,
-	0.06089077, 0.056752663, 0.0526674, 0.048636295, 0.044660863,
-	0.040742867, 0.03688439, 0.033087887, 0.029356318,
-	0.025693292, 0.022103304, 0.018592102, 0.015167298,
-	0.011839478, 0.008624485, 0.005548995, 0.0026696292,
-}
diff --git a/third_party/gofrontend/libgo/go/math/rand/rand.go b/third_party/gofrontend/libgo/go/math/rand/rand.go
deleted file mode 100644
index 6360128..0000000
--- a/third_party/gofrontend/libgo/go/math/rand/rand.go
+++ /dev/null
@@ -1,249 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package rand implements pseudo-random number generators.
-//
-// Random numbers are generated by a Source. Top-level functions, such as
-// Float64 and Int, use a default shared Source that produces a deterministic
-// sequence of values each time a program is run. Use the Seed function to
-// initialize the default Source if different behavior is required for each run.
-// The default Source is safe for concurrent use by multiple goroutines.
-//
-// For random numbers suitable for security-sensitive work, see the crypto/rand
-// package.
-package rand
-
-import "sync"
-
-// A Source represents a source of uniformly-distributed
-// pseudo-random int64 values in the range [0, 1<<63).
-type Source interface {
-	Int63() int64
-	Seed(seed int64)
-}
-
-// NewSource returns a new pseudo-random Source seeded with the given value.
-func NewSource(seed int64) Source {
-	var rng rngSource
-	rng.Seed(seed)
-	return &rng
-}
-
-// A Rand is a source of random numbers.
-type Rand struct {
-	src Source
-}
-
-// New returns a new Rand that uses random values from src
-// to generate other random values.
-func New(src Source) *Rand { return &Rand{src} }
-
-// Seed uses the provided seed value to initialize the generator to a deterministic state.
-func (r *Rand) Seed(seed int64) { r.src.Seed(seed) }
-
-// Int63 returns a non-negative pseudo-random 63-bit integer as an int64.
-func (r *Rand) Int63() int64 { return r.src.Int63() }
-
-// Uint32 returns a pseudo-random 32-bit value as a uint32.
-func (r *Rand) Uint32() uint32 { return uint32(r.Int63() >> 31) }
-
-// Int31 returns a non-negative pseudo-random 31-bit integer as an int32.
-func (r *Rand) Int31() int32 { return int32(r.Int63() >> 32) }
-
-// Int returns a non-negative pseudo-random int.
-func (r *Rand) Int() int {
-	u := uint(r.Int63())
-	return int(u << 1 >> 1) // clear sign bit if int == int32
-}
-
-// Int63n returns, as an int64, a non-negative pseudo-random number in [0,n).
-// It panics if n <= 0.
-func (r *Rand) Int63n(n int64) int64 {
-	if n <= 0 {
-		panic("invalid argument to Int63n")
-	}
-	if n&(n-1) == 0 { // n is power of two, can mask
-		return r.Int63() & (n - 1)
-	}
-	max := int64((1 << 63) - 1 - (1<<63)%uint64(n))
-	v := r.Int63()
-	for v > max {
-		v = r.Int63()
-	}
-	return v % n
-}
-
-// Int31n returns, as an int32, a non-negative pseudo-random number in [0,n).
-// It panics if n <= 0.
-func (r *Rand) Int31n(n int32) int32 {
-	if n <= 0 {
-		panic("invalid argument to Int31n")
-	}
-	if n&(n-1) == 0 { // n is power of two, can mask
-		return r.Int31() & (n - 1)
-	}
-	max := int32((1 << 31) - 1 - (1<<31)%uint32(n))
-	v := r.Int31()
-	for v > max {
-		v = r.Int31()
-	}
-	return v % n
-}
-
-// Intn returns, as an int, a non-negative pseudo-random number in [0,n).
-// It panics if n <= 0.
-func (r *Rand) Intn(n int) int {
-	if n <= 0 {
-		panic("invalid argument to Intn")
-	}
-	if n <= 1<<31-1 {
-		return int(r.Int31n(int32(n)))
-	}
-	return int(r.Int63n(int64(n)))
-}
-
-// Float64 returns, as a float64, a pseudo-random number in [0.0,1.0).
-func (r *Rand) Float64() float64 {
-	// A clearer, simpler implementation would be:
-	//	return float64(r.Int63n(1<<53)) / (1<<53)
-	// However, Go 1 shipped with
-	//	return float64(r.Int63()) / (1 << 63)
-	// and we want to preserve that value stream.
-	//
-	// There is one bug in the value stream: r.Int63() may be so close
-	// to 1<<63 that the division rounds up to 1.0, and we've guaranteed
-	// that the result is always less than 1.0. To fix that, we treat the
-	// range as cyclic and map 1 back to 0. This is justified by observing
-	// that while some of the values rounded down to 0, nothing was
-	// rounding up to 0, so 0 was underrepresented in the results.
-	// Mapping 1 back to zero restores some balance.
-	// (The balance is not perfect because the implementation
-	// returns denormalized numbers for very small r.Int63(),
-	// and those steal from what would normally be 0 results.)
-	// The remapping only happens 1/2⁵³ of the time, so most clients
-	// will not observe it anyway.
-	f := float64(r.Int63()) / (1 << 63)
-	if f == 1 {
-		f = 0
-	}
-	return f
-}
-
-// Float32 returns, as a float32, a pseudo-random number in [0.0,1.0).
-func (r *Rand) Float32() float32 {
-	// Same rationale as in Float64: we want to preserve the Go 1 value
-	// stream except we want to fix it not to return 1.0
-	// There is a double rounding going on here, but the argument for
-	// mapping 1 to 0 still applies: 0 was underrepresented before,
-	// so mapping 1 to 0 doesn't cause too many 0s.
-	// This only happens 1/2²⁴ of the time (plus the 1/2⁵³ of the time in Float64).
-	f := float32(r.Float64())
-	if f == 1 {
-		f = 0
-	}
-	return f
-}
-
-// Perm returns, as a slice of n ints, a pseudo-random permutation of the integers [0,n).
-func (r *Rand) Perm(n int) []int {
-	m := make([]int, n)
-	for i := 0; i < n; i++ {
-		j := r.Intn(i + 1)
-		m[i] = m[j]
-		m[j] = i
-	}
-	return m
-}
-
-/*
- * Top-level convenience functions
- */
-
-var globalRand = New(&lockedSource{src: NewSource(1)})
-
-// Seed uses the provided seed value to initialize the default Source to a
-// deterministic state. If Seed is not called, the generator behaves as
-// if seeded by Seed(1).
-func Seed(seed int64) { globalRand.Seed(seed) }
-
-// Int63 returns a non-negative pseudo-random 63-bit integer as an int64
-// from the default Source.
-func Int63() int64 { return globalRand.Int63() }
-
-// Uint32 returns a pseudo-random 32-bit value as a uint32
-// from the default Source.
-func Uint32() uint32 { return globalRand.Uint32() }
-
-// Int31 returns a non-negative pseudo-random 31-bit integer as an int32
-// from the default Source.
-func Int31() int32 { return globalRand.Int31() }
-
-// Int returns a non-negative pseudo-random int from the default Source.
-func Int() int { return globalRand.Int() }
-
-// Int63n returns, as an int64, a non-negative pseudo-random number in [0,n)
-// from the default Source.
-// It panics if n <= 0.
-func Int63n(n int64) int64 { return globalRand.Int63n(n) }
-
-// Int31n returns, as an int32, a non-negative pseudo-random number in [0,n)
-// from the default Source.
-// It panics if n <= 0.
-func Int31n(n int32) int32 { return globalRand.Int31n(n) }
-
-// Intn returns, as an int, a non-negative pseudo-random number in [0,n)
-// from the default Source.
-// It panics if n <= 0.
-func Intn(n int) int { return globalRand.Intn(n) }
-
-// Float64 returns, as a float64, a pseudo-random number in [0.0,1.0)
-// from the default Source.
-func Float64() float64 { return globalRand.Float64() }
-
-// Float32 returns, as a float32, a pseudo-random number in [0.0,1.0)
-// from the default Source.
-func Float32() float32 { return globalRand.Float32() }
-
-// Perm returns, as a slice of n ints, a pseudo-random permutation of the integers [0,n)
-// from the default Source.
-func Perm(n int) []int { return globalRand.Perm(n) }
-
-// NormFloat64 returns a normally distributed float64 in the range
-// [-math.MaxFloat64, +math.MaxFloat64] with
-// standard normal distribution (mean = 0, stddev = 1)
-// from the default Source.
-// To produce a different normal distribution, callers can
-// adjust the output using:
-//
-//  sample = NormFloat64() * desiredStdDev + desiredMean
-//
-func NormFloat64() float64 { return globalRand.NormFloat64() }
-
-// ExpFloat64 returns an exponentially distributed float64 in the range
-// (0, +math.MaxFloat64] with an exponential distribution whose rate parameter
-// (lambda) is 1 and whose mean is 1/lambda (1) from the default Source.
-// To produce a distribution with a different rate parameter,
-// callers can adjust the output using:
-//
-//  sample = ExpFloat64() / desiredRateParameter
-//
-func ExpFloat64() float64 { return globalRand.ExpFloat64() }
-
-type lockedSource struct {
-	lk  sync.Mutex
-	src Source
-}
-
-func (r *lockedSource) Int63() (n int64) {
-	r.lk.Lock()
-	n = r.src.Int63()
-	r.lk.Unlock()
-	return
-}
-
-func (r *lockedSource) Seed(seed int64) {
-	r.lk.Lock()
-	r.src.Seed(seed)
-	r.lk.Unlock()
-}
diff --git a/third_party/gofrontend/libgo/go/math/rand/rand_test.go b/third_party/gofrontend/libgo/go/math/rand/rand_test.go
deleted file mode 100644
index c61494f..0000000
--- a/third_party/gofrontend/libgo/go/math/rand/rand_test.go
+++ /dev/null
@@ -1,407 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rand
-
-import (
-	"errors"
-	"fmt"
-	"math"
-	"os"
-	"runtime"
-	"testing"
-)
-
-const (
-	numTestSamples = 10000
-)
-
-type statsResults struct {
-	mean        float64
-	stddev      float64
-	closeEnough float64
-	maxError    float64
-}
-
-func max(a, b float64) float64 {
-	if a > b {
-		return a
-	}
-	return b
-}
-
-func nearEqual(a, b, closeEnough, maxError float64) bool {
-	absDiff := math.Abs(a - b)
-	if absDiff < closeEnough { // Necessary when one value is zero and one value is close to zero.
-		return true
-	}
-	return absDiff/max(math.Abs(a), math.Abs(b)) < maxError
-}
-
-var testSeeds = []int64{1, 1754801282, 1698661970, 1550503961}
-
-// checkSimilarDistribution returns success if the mean and stddev of the
-// two statsResults are similar.
-func (this *statsResults) checkSimilarDistribution(expected *statsResults) error {
-	if !nearEqual(this.mean, expected.mean, expected.closeEnough, expected.maxError) {
-		s := fmt.Sprintf("mean %v != %v (allowed error %v, %v)", this.mean, expected.mean, expected.closeEnough, expected.maxError)
-		fmt.Println(s)
-		return errors.New(s)
-	}
-	if !nearEqual(this.stddev, expected.stddev, 0, expected.maxError) {
-		s := fmt.Sprintf("stddev %v != %v (allowed error %v, %v)", this.stddev, expected.stddev, expected.closeEnough, expected.maxError)
-		fmt.Println(s)
-		return errors.New(s)
-	}
-	return nil
-}
-
-func getStatsResults(samples []float64) *statsResults {
-	res := new(statsResults)
-	var sum, squaresum float64
-	for _, s := range samples {
-		sum += s
-		squaresum += s * s
-	}
-	res.mean = sum / float64(len(samples))
-	res.stddev = math.Sqrt(squaresum/float64(len(samples)) - res.mean*res.mean)
-	return res
-}
-
-func checkSampleDistribution(t *testing.T, samples []float64, expected *statsResults) {
-	actual := getStatsResults(samples)
-	err := actual.checkSimilarDistribution(expected)
-	if err != nil {
-		t.Errorf(err.Error())
-	}
-}
-
-func checkSampleSliceDistributions(t *testing.T, samples []float64, nslices int, expected *statsResults) {
-	chunk := len(samples) / nslices
-	for i := 0; i < nslices; i++ {
-		low := i * chunk
-		var high int
-		if i == nslices-1 {
-			high = len(samples) - 1
-		} else {
-			high = (i + 1) * chunk
-		}
-		checkSampleDistribution(t, samples[low:high], expected)
-	}
-}
-
-//
-// Normal distribution tests
-//
-
-func generateNormalSamples(nsamples int, mean, stddev float64, seed int64) []float64 {
-	r := New(NewSource(seed))
-	samples := make([]float64, nsamples)
-	for i := range samples {
-		samples[i] = r.NormFloat64()*stddev + mean
-	}
-	return samples
-}
-
-func testNormalDistribution(t *testing.T, nsamples int, mean, stddev float64, seed int64) {
-	//fmt.Printf("testing nsamples=%v mean=%v stddev=%v seed=%v\n", nsamples, mean, stddev, seed);
-
-	samples := generateNormalSamples(nsamples, mean, stddev, seed)
-	errorScale := max(1.0, stddev) // Error scales with stddev
-	expected := &statsResults{mean, stddev, 0.10 * errorScale, 0.08 * errorScale}
-
-	// Make sure that the entire set matches the expected distribution.
-	checkSampleDistribution(t, samples, expected)
-
-	// Make sure that each half of the set matches the expected distribution.
-	checkSampleSliceDistributions(t, samples, 2, expected)
-
-	// Make sure that each 7th of the set matches the expected distribution.
-	checkSampleSliceDistributions(t, samples, 7, expected)
-}
-
-// Actual tests
-
-func TestStandardNormalValues(t *testing.T) {
-	for _, seed := range testSeeds {
-		testNormalDistribution(t, numTestSamples, 0, 1, seed)
-	}
-}
-
-func TestNonStandardNormalValues(t *testing.T) {
-	sdmax := 1000.0
-	mmax := 1000.0
-	if testing.Short() {
-		sdmax = 5
-		mmax = 5
-	}
-	for sd := 0.5; sd < sdmax; sd *= 2 {
-		for m := 0.5; m < mmax; m *= 2 {
-			for _, seed := range testSeeds {
-				testNormalDistribution(t, numTestSamples, m, sd, seed)
-				if testing.Short() {
-					break
-				}
-			}
-		}
-	}
-}
-
-//
-// Exponential distribution tests
-//
-
-func generateExponentialSamples(nsamples int, rate float64, seed int64) []float64 {
-	r := New(NewSource(seed))
-	samples := make([]float64, nsamples)
-	for i := range samples {
-		samples[i] = r.ExpFloat64() / rate
-	}
-	return samples
-}
-
-func testExponentialDistribution(t *testing.T, nsamples int, rate float64, seed int64) {
-	//fmt.Printf("testing nsamples=%v rate=%v seed=%v\n", nsamples, rate, seed);
-
-	mean := 1 / rate
-	stddev := mean
-
-	samples := generateExponentialSamples(nsamples, rate, seed)
-	errorScale := max(1.0, 1/rate) // Error scales with the inverse of the rate
-	expected := &statsResults{mean, stddev, 0.10 * errorScale, 0.20 * errorScale}
-
-	// Make sure that the entire set matches the expected distribution.
-	checkSampleDistribution(t, samples, expected)
-
-	// Make sure that each half of the set matches the expected distribution.
-	checkSampleSliceDistributions(t, samples, 2, expected)
-
-	// Make sure that each 7th of the set matches the expected distribution.
-	checkSampleSliceDistributions(t, samples, 7, expected)
-}
-
-// Actual tests
-
-func TestStandardExponentialValues(t *testing.T) {
-	for _, seed := range testSeeds {
-		testExponentialDistribution(t, numTestSamples, 1, seed)
-	}
-}
-
-func TestNonStandardExponentialValues(t *testing.T) {
-	for rate := 0.05; rate < 10; rate *= 2 {
-		for _, seed := range testSeeds {
-			testExponentialDistribution(t, numTestSamples, rate, seed)
-			if testing.Short() {
-				break
-			}
-		}
-	}
-}
-
-//
-// Table generation tests
-//
-
-func initNorm() (testKn []uint32, testWn, testFn []float32) {
-	const m1 = 1 << 31
-	var (
-		dn float64 = rn
-		tn         = dn
-		vn float64 = 9.91256303526217e-3
-	)
-
-	testKn = make([]uint32, 128)
-	testWn = make([]float32, 128)
-	testFn = make([]float32, 128)
-
-	q := vn / math.Exp(-0.5*dn*dn)
-	testKn[0] = uint32((dn / q) * m1)
-	testKn[1] = 0
-	testWn[0] = float32(q / m1)
-	testWn[127] = float32(dn / m1)
-	testFn[0] = 1.0
-	testFn[127] = float32(math.Exp(-0.5 * dn * dn))
-	for i := 126; i >= 1; i-- {
-		dn = math.Sqrt(-2.0 * math.Log(vn/dn+math.Exp(-0.5*dn*dn)))
-		testKn[i+1] = uint32((dn / tn) * m1)
-		tn = dn
-		testFn[i] = float32(math.Exp(-0.5 * dn * dn))
-		testWn[i] = float32(dn / m1)
-	}
-	return
-}
-
-func initExp() (testKe []uint32, testWe, testFe []float32) {
-	const m2 = 1 << 32
-	var (
-		de float64 = re
-		te         = de
-		ve float64 = 3.9496598225815571993e-3
-	)
-
-	testKe = make([]uint32, 256)
-	testWe = make([]float32, 256)
-	testFe = make([]float32, 256)
-
-	q := ve / math.Exp(-de)
-	testKe[0] = uint32((de / q) * m2)
-	testKe[1] = 0
-	testWe[0] = float32(q / m2)
-	testWe[255] = float32(de / m2)
-	testFe[0] = 1.0
-	testFe[255] = float32(math.Exp(-de))
-	for i := 254; i >= 1; i-- {
-		de = -math.Log(ve/de + math.Exp(-de))
-		testKe[i+1] = uint32((de / te) * m2)
-		te = de
-		testFe[i] = float32(math.Exp(-de))
-		testWe[i] = float32(de / m2)
-	}
-	return
-}
-
-// compareUint32Slices returns the first index where the two slices
-// disagree, or <0 if the lengths are the same and all elements
-// are identical.
-func compareUint32Slices(s1, s2 []uint32) int {
-	if len(s1) != len(s2) {
-		if len(s1) > len(s2) {
-			return len(s2) + 1
-		}
-		return len(s1) + 1
-	}
-	for i := range s1 {
-		if s1[i] != s2[i] {
-			return i
-		}
-	}
-	return -1
-}
-
-// compareFloat32Slices returns the first index where the two slices
-// disagree, or <0 if the lengths are the same and all elements
-// are identical.
-func compareFloat32Slices(s1, s2 []float32) int {
-	if len(s1) != len(s2) {
-		if len(s1) > len(s2) {
-			return len(s2) + 1
-		}
-		return len(s1) + 1
-	}
-	for i := range s1 {
-		if !nearEqual(float64(s1[i]), float64(s2[i]), 0, 1e-7) {
-			return i
-		}
-	}
-	return -1
-}
-
-func TestNormTables(t *testing.T) {
-	testKn, testWn, testFn := initNorm()
-	if i := compareUint32Slices(kn[0:], testKn); i >= 0 {
-		t.Errorf("kn disagrees at index %v; %v != %v", i, kn[i], testKn[i])
-	}
-	if i := compareFloat32Slices(wn[0:], testWn); i >= 0 {
-		t.Errorf("wn disagrees at index %v; %v != %v", i, wn[i], testWn[i])
-	}
-	if i := compareFloat32Slices(fn[0:], testFn); i >= 0 {
-		t.Errorf("fn disagrees at index %v; %v != %v", i, fn[i], testFn[i])
-	}
-}
-
-func TestExpTables(t *testing.T) {
-	testKe, testWe, testFe := initExp()
-	if i := compareUint32Slices(ke[0:], testKe); i >= 0 {
-		t.Errorf("ke disagrees at index %v; %v != %v", i, ke[i], testKe[i])
-	}
-	if i := compareFloat32Slices(we[0:], testWe); i >= 0 {
-		t.Errorf("we disagrees at index %v; %v != %v", i, we[i], testWe[i])
-	}
-	if i := compareFloat32Slices(fe[0:], testFe); i >= 0 {
-		t.Errorf("fe disagrees at index %v; %v != %v", i, fe[i], testFe[i])
-	}
-}
-
-func TestFloat32(t *testing.T) {
-	// For issue 6721, the problem came after 7533753 calls, so check 10e6.
-	num := int(10e6)
-	// But ARM5 floating point emulation is slow (Issue 10749), so
-	// do less for that builder:
-	if testing.Short() && runtime.GOARCH == "arm" && os.Getenv("GOARM") == "5" {
-		num /= 100 // 1.72 seconds instead of 172 seconds
-	}
-
-	r := New(NewSource(1))
-	for ct := 0; ct < num; ct++ {
-		f := r.Float32()
-		if f >= 1 {
-			t.Fatal("Float32() should be in range [0,1). ct:", ct, "f:", f)
-		}
-	}
-}
-
-// Benchmarks
-
-func BenchmarkInt63Threadsafe(b *testing.B) {
-	for n := b.N; n > 0; n-- {
-		Int63()
-	}
-}
-
-func BenchmarkInt63Unthreadsafe(b *testing.B) {
-	r := New(NewSource(1))
-	for n := b.N; n > 0; n-- {
-		r.Int63()
-	}
-}
-
-func BenchmarkIntn1000(b *testing.B) {
-	r := New(NewSource(1))
-	for n := b.N; n > 0; n-- {
-		r.Intn(1000)
-	}
-}
-
-func BenchmarkInt63n1000(b *testing.B) {
-	r := New(NewSource(1))
-	for n := b.N; n > 0; n-- {
-		r.Int63n(1000)
-	}
-}
-
-func BenchmarkInt31n1000(b *testing.B) {
-	r := New(NewSource(1))
-	for n := b.N; n > 0; n-- {
-		r.Int31n(1000)
-	}
-}
-
-func BenchmarkFloat32(b *testing.B) {
-	r := New(NewSource(1))
-	for n := b.N; n > 0; n-- {
-		r.Float32()
-	}
-}
-
-func BenchmarkFloat64(b *testing.B) {
-	r := New(NewSource(1))
-	for n := b.N; n > 0; n-- {
-		r.Float64()
-	}
-}
-
-func BenchmarkPerm3(b *testing.B) {
-	r := New(NewSource(1))
-	for n := b.N; n > 0; n-- {
-		r.Perm(3)
-	}
-}
-
-func BenchmarkPerm30(b *testing.B) {
-	r := New(NewSource(1))
-	for n := b.N; n > 0; n-- {
-		r.Perm(30)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/math/rand/regress_test.go b/third_party/gofrontend/libgo/go/math/rand/regress_test.go
deleted file mode 100644
index 2b012af..0000000
--- a/third_party/gofrontend/libgo/go/math/rand/regress_test.go
+++ /dev/null
@@ -1,355 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that random number sequences generated by a specific seed
-// do not change from version to version.
-//
-// Do NOT make changes to the golden outputs. If bugs need to be fixed
-// in the underlying code, find ways to fix them that do not affect the
-// outputs.
-
-package rand_test
-
-import (
-	"flag"
-	"fmt"
-	. "math/rand"
-	"reflect"
-	"testing"
-)
-
-var printgolden = flag.Bool("printgolden", false, "print golden results for regression test")
-
-func TestRegress(t *testing.T) {
-	var int32s = []int32{1, 10, 32, 1 << 20, 1<<20 + 1, 1000000000, 1 << 30, 1<<31 - 2, 1<<31 - 1}
-	var int64s = []int64{1, 10, 32, 1 << 20, 1<<20 + 1, 1000000000, 1 << 30, 1<<31 - 2, 1<<31 - 1, 1000000000000000000, 1 << 60, 1<<63 - 2, 1<<63 - 1}
-	var permSizes = []int{0, 1, 5, 8, 9, 10, 16}
-	r := New(NewSource(0))
-
-	rv := reflect.ValueOf(r)
-	n := rv.NumMethod()
-	p := 0
-	if *printgolden {
-		fmt.Printf("var regressGolden = []interface{}{\n")
-	}
-	for i := 0; i < n; i++ {
-		m := rv.Type().Method(i)
-		mv := rv.Method(i)
-		mt := mv.Type()
-		if mt.NumOut() == 0 {
-			continue
-		}
-		if mt.NumOut() != 1 {
-			t.Fatalf("unexpected result count for r.%s", m.Name)
-		}
-		r.Seed(0)
-		for repeat := 0; repeat < 20; repeat++ {
-			var args []reflect.Value
-			var argstr string
-			if mt.NumIn() == 1 {
-				var x interface{}
-				switch mt.In(0).Kind() {
-				default:
-					t.Fatalf("unexpected argument type for r.%s", m.Name)
-
-				case reflect.Int:
-					if m.Name == "Perm" {
-						x = permSizes[repeat%len(permSizes)]
-						break
-					}
-					big := int64s[repeat%len(int64s)]
-					if int64(int(big)) != big {
-						r.Int63n(big) // what would happen on 64-bit machine, to keep stream in sync
-						if *printgolden {
-							fmt.Printf("\tskipped, // must run printgolden on 64-bit machine\n")
-						}
-						p++
-						continue
-					}
-					x = int(big)
-
-				case reflect.Int32:
-					x = int32s[repeat%len(int32s)]
-
-				case reflect.Int64:
-					x = int64s[repeat%len(int64s)]
-				}
-				argstr = fmt.Sprint(x)
-				args = append(args, reflect.ValueOf(x))
-			}
-			out := mv.Call(args)[0].Interface()
-			if m.Name == "Int" || m.Name == "Intn" {
-				out = int64(out.(int))
-			}
-			if *printgolden {
-				var val string
-				big := int64(1 << 60)
-				if int64(int(big)) != big && (m.Name == "Int" || m.Name == "Intn") {
-					// 32-bit machine cannot print 64-bit results
-					val = "truncated"
-				} else if reflect.TypeOf(out).Kind() == reflect.Slice {
-					val = fmt.Sprintf("%#v", out)
-				} else {
-					val = fmt.Sprintf("%T(%v)", out, out)
-				}
-				fmt.Printf("\t%s, // %s(%s)\n", val, m.Name, argstr)
-			} else {
-				want := regressGolden[p]
-				if m.Name == "Int" {
-					want = int64(int(uint(want.(int64)) << 1 >> 1))
-				}
-				if !reflect.DeepEqual(out, want) {
-					t.Errorf("r.%s(%s) = %v, want %v", m.Name, argstr, out, want)
-				}
-			}
-			p++
-		}
-	}
-	if *printgolden {
-		fmt.Printf("}\n")
-	}
-}
-
-var regressGolden = []interface{}{
-	float64(4.668112973579268),    // ExpFloat64()
-	float64(0.1601593871172866),   // ExpFloat64()
-	float64(3.0465834105636),      // ExpFloat64()
-	float64(0.06385839451671879),  // ExpFloat64()
-	float64(1.8578917487258961),   // ExpFloat64()
-	float64(0.784676123472182),    // ExpFloat64()
-	float64(0.11225477361256932),  // ExpFloat64()
-	float64(0.20173283329802255),  // ExpFloat64()
-	float64(0.3468619496201105),   // ExpFloat64()
-	float64(0.35601103454384536),  // ExpFloat64()
-	float64(0.888376329507869),    // ExpFloat64()
-	float64(1.4081362450365698),   // ExpFloat64()
-	float64(1.0077753823151994),   // ExpFloat64()
-	float64(0.23594100766227588),  // ExpFloat64()
-	float64(2.777245612300007),    // ExpFloat64()
-	float64(0.5202997830662377),   // ExpFloat64()
-	float64(1.2842705247770294),   // ExpFloat64()
-	float64(0.030307408362776206), // ExpFloat64()
-	float64(2.204156824853721),    // ExpFloat64()
-	float64(2.09891923895058),     // ExpFloat64()
-	float32(0.94519615),           // Float32()
-	float32(0.24496509),           // Float32()
-	float32(0.65595627),           // Float32()
-	float32(0.05434384),           // Float32()
-	float32(0.3675872),            // Float32()
-	float32(0.28948045),           // Float32()
-	float32(0.1924386),            // Float32()
-	float32(0.65533215),           // Float32()
-	float32(0.8971697),            // Float32()
-	float32(0.16735445),           // Float32()
-	float32(0.28858566),           // Float32()
-	float32(0.9026048),            // Float32()
-	float32(0.84978026),           // Float32()
-	float32(0.2730468),            // Float32()
-	float32(0.6090802),            // Float32()
-	float32(0.253656),             // Float32()
-	float32(0.7746542),            // Float32()
-	float32(0.017480763),          // Float32()
-	float32(0.78707397),           // Float32()
-	float32(0.7993937),            // Float32()
-	float64(0.9451961492941164),   // Float64()
-	float64(0.24496508529377975),  // Float64()
-	float64(0.6559562651954052),   // Float64()
-	float64(0.05434383959970039),  // Float64()
-	float64(0.36758720663245853),  // Float64()
-	float64(0.2894804331565928),   // Float64()
-	float64(0.19243860967493215),  // Float64()
-	float64(0.6553321508148324),   // Float64()
-	float64(0.897169713149801),    // Float64()
-	float64(0.16735444255905835),  // Float64()
-	float64(0.2885856518054551),   // Float64()
-	float64(0.9026048462705047),   // Float64()
-	float64(0.8497802817628735),   // Float64()
-	float64(0.2730468047134829),   // Float64()
-	float64(0.6090801919903561),   // Float64()
-	float64(0.25365600644283687),  // Float64()
-	float64(0.7746542391859803),   // Float64()
-	float64(0.017480762156647272), // Float64()
-	float64(0.7870739563039942),   // Float64()
-	float64(0.7993936979594545),   // Float64()
-	int64(8717895732742165505),    // Int()
-	int64(2259404117704393152),    // Int()
-	int64(6050128673802995827),    // Int()
-	int64(501233450539197794),     // Int()
-	int64(3390393562759376202),    // Int()
-	int64(2669985732393126063),    // Int()
-	int64(1774932891286980153),    // Int()
-	int64(6044372234677422456),    // Int()
-	int64(8274930044578894929),    // Int()
-	int64(1543572285742637646),    // Int()
-	int64(2661732831099943416),    // Int()
-	int64(8325060299420976708),    // Int()
-	int64(7837839688282259259),    // Int()
-	int64(2518412263346885298),    // Int()
-	int64(5617773211005988520),    // Int()
-	int64(2339563716805116249),    // Int()
-	int64(7144924247938981575),    // Int()
-	int64(161231572858529631),     // Int()
-	int64(7259475919510918339),    // Int()
-	int64(7373105480197164748),    // Int()
-	int32(2029793274),             // Int31()
-	int32(526058514),              // Int31()
-	int32(1408655353),             // Int31()
-	int32(116702506),              // Int31()
-	int32(789387515),              // Int31()
-	int32(621654496),              // Int31()
-	int32(413258767),              // Int31()
-	int32(1407315077),             // Int31()
-	int32(1926657288),             // Int31()
-	int32(359390928),              // Int31()
-	int32(619732968),              // Int31()
-	int32(1938329147),             // Int31()
-	int32(1824889259),             // Int31()
-	int32(586363548),              // Int31()
-	int32(1307989752),             // Int31()
-	int32(544722126),              // Int31()
-	int32(1663557311),             // Int31()
-	int32(37539650),               // Int31()
-	int32(1690228450),             // Int31()
-	int32(1716684894),             // Int31()
-	int32(0),                      // Int31n(1)
-	int32(4),                      // Int31n(10)
-	int32(25),                     // Int31n(32)
-	int32(310570),                 // Int31n(1048576)
-	int32(857611),                 // Int31n(1048577)
-	int32(621654496),              // Int31n(1000000000)
-	int32(413258767),              // Int31n(1073741824)
-	int32(1407315077),             // Int31n(2147483646)
-	int32(1926657288),             // Int31n(2147483647)
-	int32(0),                      // Int31n(1)
-	int32(8),                      // Int31n(10)
-	int32(27),                     // Int31n(32)
-	int32(367019),                 // Int31n(1048576)
-	int32(209005),                 // Int31n(1048577)
-	int32(307989752),              // Int31n(1000000000)
-	int32(544722126),              // Int31n(1073741824)
-	int32(1663557311),             // Int31n(2147483646)
-	int32(37539650),               // Int31n(2147483647)
-	int32(0),                      // Int31n(1)
-	int32(4),                      // Int31n(10)
-	int64(8717895732742165505),    // Int63()
-	int64(2259404117704393152),    // Int63()
-	int64(6050128673802995827),    // Int63()
-	int64(501233450539197794),     // Int63()
-	int64(3390393562759376202),    // Int63()
-	int64(2669985732393126063),    // Int63()
-	int64(1774932891286980153),    // Int63()
-	int64(6044372234677422456),    // Int63()
-	int64(8274930044578894929),    // Int63()
-	int64(1543572285742637646),    // Int63()
-	int64(2661732831099943416),    // Int63()
-	int64(8325060299420976708),    // Int63()
-	int64(7837839688282259259),    // Int63()
-	int64(2518412263346885298),    // Int63()
-	int64(5617773211005988520),    // Int63()
-	int64(2339563716805116249),    // Int63()
-	int64(7144924247938981575),    // Int63()
-	int64(161231572858529631),     // Int63()
-	int64(7259475919510918339),    // Int63()
-	int64(7373105480197164748),    // Int63()
-	int64(0),                      // Int63n(1)
-	int64(2),                      // Int63n(10)
-	int64(19),                     // Int63n(32)
-	int64(959842),                 // Int63n(1048576)
-	int64(688912),                 // Int63n(1048577)
-	int64(393126063),              // Int63n(1000000000)
-	int64(89212473),               // Int63n(1073741824)
-	int64(834026388),              // Int63n(2147483646)
-	int64(1577188963),             // Int63n(2147483647)
-	int64(543572285742637646),     // Int63n(1000000000000000000)
-	int64(355889821886249464),     // Int63n(1152921504606846976)
-	int64(8325060299420976708),    // Int63n(9223372036854775806)
-	int64(7837839688282259259),    // Int63n(9223372036854775807)
-	int64(0),                      // Int63n(1)
-	int64(0),                      // Int63n(10)
-	int64(25),                     // Int63n(32)
-	int64(679623),                 // Int63n(1048576)
-	int64(882178),                 // Int63n(1048577)
-	int64(510918339),              // Int63n(1000000000)
-	int64(782454476),              // Int63n(1073741824)
-	int64(0),                      // Intn(1)
-	int64(4),                      // Intn(10)
-	int64(25),                     // Intn(32)
-	int64(310570),                 // Intn(1048576)
-	int64(857611),                 // Intn(1048577)
-	int64(621654496),              // Intn(1000000000)
-	int64(413258767),              // Intn(1073741824)
-	int64(1407315077),             // Intn(2147483646)
-	int64(1926657288),             // Intn(2147483647)
-	int64(543572285742637646),     // Intn(1000000000000000000)
-	int64(355889821886249464),     // Intn(1152921504606846976)
-	int64(8325060299420976708),    // Intn(9223372036854775806)
-	int64(7837839688282259259),    // Intn(9223372036854775807)
-	int64(0),                      // Intn(1)
-	int64(2),                      // Intn(10)
-	int64(14),                     // Intn(32)
-	int64(515775),                 // Intn(1048576)
-	int64(839455),                 // Intn(1048577)
-	int64(690228450),              // Intn(1000000000)
-	int64(642943070),              // Intn(1073741824)
-	float64(-0.28158587086436215), // NormFloat64()
-	float64(0.570933095808067),    // NormFloat64()
-	float64(-1.6920196326157044),  // NormFloat64()
-	float64(0.1996229111693099),   // NormFloat64()
-	float64(1.9195199291234621),   // NormFloat64()
-	float64(0.8954838794918353),   // NormFloat64()
-	float64(0.41457072128813166),  // NormFloat64()
-	float64(-0.48700161491544713), // NormFloat64()
-	float64(-0.1684059662402393),  // NormFloat64()
-	float64(0.37056410998929545),  // NormFloat64()
-	float64(1.0156889027029008),   // NormFloat64()
-	float64(-0.5174422210625114),  // NormFloat64()
-	float64(-0.5565834214413804),  // NormFloat64()
-	float64(0.778320596648391),    // NormFloat64()
-	float64(-1.8970718197702225),  // NormFloat64()
-	float64(0.5229525761688676),   // NormFloat64()
-	float64(-1.5515595563231523),  // NormFloat64()
-	float64(0.0182029289376123),   // NormFloat64()
-	float64(-0.6820951356608795),  // NormFloat64()
-	float64(-0.5987943422687668),  // NormFloat64()
-	[]int{},                                                     // Perm(0)
-	[]int{0},                                                    // Perm(1)
-	[]int{0, 4, 1, 3, 2},                                        // Perm(5)
-	[]int{3, 1, 0, 4, 7, 5, 2, 6},                               // Perm(8)
-	[]int{5, 0, 3, 6, 7, 4, 2, 1, 8},                            // Perm(9)
-	[]int{4, 5, 0, 2, 6, 9, 3, 1, 8, 7},                         // Perm(10)
-	[]int{14, 2, 0, 8, 3, 5, 13, 12, 1, 4, 6, 7, 11, 9, 15, 10}, // Perm(16)
-	[]int{},                                                     // Perm(0)
-	[]int{0},                                                    // Perm(1)
-	[]int{3, 0, 1, 2, 4},                                        // Perm(5)
-	[]int{5, 1, 2, 0, 4, 7, 3, 6},                               // Perm(8)
-	[]int{4, 0, 6, 8, 1, 5, 2, 7, 3},                            // Perm(9)
-	[]int{8, 6, 1, 7, 5, 4, 3, 2, 9, 0},                         // Perm(10)
-	[]int{0, 3, 13, 2, 15, 4, 10, 1, 8, 14, 7, 6, 12, 9, 5, 11}, // Perm(16)
-	[]int{},                             // Perm(0)
-	[]int{0},                            // Perm(1)
-	[]int{0, 4, 2, 1, 3},                // Perm(5)
-	[]int{2, 1, 7, 0, 6, 3, 4, 5},       // Perm(8)
-	[]int{8, 7, 5, 3, 4, 6, 0, 1, 2},    // Perm(9)
-	[]int{1, 0, 2, 5, 7, 6, 9, 8, 3, 4}, // Perm(10)
-	uint32(4059586549),                  // Uint32()
-	uint32(1052117029),                  // Uint32()
-	uint32(2817310706),                  // Uint32()
-	uint32(233405013),                   // Uint32()
-	uint32(1578775030),                  // Uint32()
-	uint32(1243308993),                  // Uint32()
-	uint32(826517535),                   // Uint32()
-	uint32(2814630155),                  // Uint32()
-	uint32(3853314576),                  // Uint32()
-	uint32(718781857),                   // Uint32()
-	uint32(1239465936),                  // Uint32()
-	uint32(3876658295),                  // Uint32()
-	uint32(3649778518),                  // Uint32()
-	uint32(1172727096),                  // Uint32()
-	uint32(2615979505),                  // Uint32()
-	uint32(1089444252),                  // Uint32()
-	uint32(3327114623),                  // Uint32()
-	uint32(75079301),                    // Uint32()
-	uint32(3380456901),                  // Uint32()
-	uint32(3433369789),                  // Uint32()
-}
diff --git a/third_party/gofrontend/libgo/go/math/rand/rng.go b/third_party/gofrontend/libgo/go/math/rand/rng.go
deleted file mode 100644
index 947c49f..0000000
--- a/third_party/gofrontend/libgo/go/math/rand/rng.go
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rand
-
-/*
- * Uniform distribution
- *
- * algorithm by
- * DP Mitchell and JA Reeds
- */
-
-const (
-	_LEN  = 607
-	_TAP  = 273
-	_MAX  = 1 << 63
-	_MASK = _MAX - 1
-	_A    = 48271
-	_M    = (1 << 31) - 1
-	_Q    = 44488
-	_R    = 3399
-)
-
-var (
-	// cooked random numbers
-	// the state of the rng
-	// after 780e10 iterations
-	rng_cooked [_LEN]int64 = [...]int64{
-		5041579894721019882, 4646389086726545243, 1395769623340756751, 5333664234075297259,
-		2875692520355975054, 9033628115061424579, 7143218595135194537, 4812947590706362721,
-		7937252194349799378, 5307299880338848416, 8209348851763925077, 2115741599318814044,
-		4593015457530856296, 8140875735541888011, 3319429241265089026, 8619815648190321034,
-		1727074043483619500, 113108499721038619, 4569519971459345583, 5062833859075314731,
-		2387618771259064424, 2716131344356686112, 6559392774825876886, 7650093201692370310,
-		7684323884043752161, 257867835996031390, 6593456519409015164, 271327514973697897,
-		2789386447340118284, 1065192797246149621, 3344507881999356393, 4459797941780066633,
-		7465081662728599889, 1014950805555097187, 4449440729345990775, 3481109366438502643,
-		2418672789110888383, 5796562887576294778, 4484266064449540171, 3738982361971787048,
-		4523597184512354423, 10530508058128498, 8633833783282346118, 2625309929628791628,
-		8660405965245884302, 10162832508971942, 6540714680961817391, 7031802312784620857,
-		6240911277345944669, 831864355460801054, 8004434137542152891, 2116287251661052151,
-		2202309800992166967, 9161020366945053561, 4069299552407763864, 4936383537992622449,
-		457351505131524928, 342195045928179354, 2847771682816600509, 2068020115986376518,
-		4368649989588021065, 887231587095185257, 5563591506886576496, 6816225200251950296,
-		5616972787034086048, 8471809303394836566, 1686575021641186857, 4045484338074262002,
-		4244156215201778923, 7848217333783577387, 5632136521049761902, 833283142057835272,
-		9029726508369077193, 3243583134664087292, 4316371101804477087, 8937849979965997980,
-		6446940406810434101, 1679342092332374735, 6050638460742422078, 6993520719509581582,
-		7640877852514293609, 5881353426285907985, 812786550756860885, 4541845584483343330,
-		2725470216277009086, 4980675660146853729, 5210769080603236061, 8894283318990530821,
-		6326442804750084282, 1495812843684243920, 7069751578799128019, 7370257291860230865,
-		6756929275356942261, 4706794511633873654, 7824520467827898663, 8549875090542453214,
-		33650829478596156, 1328918435751322643, 7297902601803624459, 1011190183918857495,
-		2238025036817854944, 5147159997473910359, 896512091560522982, 2659470849286379941,
-		6097729358393448602, 1731725986304753684, 4106255841983812711, 8327155210721535508,
-		8477511620686074402, 5803876044675762232, 8435417780860221662, 5988852856651071244,
-		4715837297103951910, 7566171971264485114, 505808562678895611, 5070098180695063370,
-		842110666775871513, 572156825025677802, 1791881013492340891, 3393267094866038768,
-		3778721850472236509, 2352769483186201278, 1292459583847367458, 8897907043675088419,
-		5781809037144163536, 2733958794029492513, 5092019688680754699, 8996124554772526841,
-		4234737173186232084, 5027558287275472836, 4635198586344772304, 8687338893267139351,
-		5907508150730407386, 784756255473944452, 972392927514829904, 5422057694808175112,
-		5158420642969283891, 9048531678558643225, 2407211146698877100, 7583282216521099569,
-		3940796514530962282, 3341174631045206375, 3095313889586102949, 7405321895688238710,
-		5832080132947175283, 7890064875145919662, 8184139210799583195, 1149859861409226130,
-		1464597243840211302, 4641648007187991873, 3516491885471466898, 956288521791657692,
-		6657089965014657519, 5220884358887979358, 1796677326474620641, 5340761970648932916,
-		1147977171614181568, 5066037465548252321, 2574765911837859848, 1085848279845204775,
-		3350107529868390359, 6116438694366558490, 2107701075971293812, 1803294065921269267,
-		2469478054175558874, 7368243281019965984, 3791908367843677526, 185046971116456637,
-		2257095756513439648, 7217693971077460129, 909049953079504259, 7196649268545224266,
-		5637660345400869599, 3955544945427965183, 8057528650917418961, 4139268440301127643,
-		6621926588513568059, 1373361136802681441, 6527366231383600011, 3507654575162700890,
-		9202058512774729859, 1954818376891585542, 6640380907130175705, 8299563319178235687,
-		3901867355218954373, 7046310742295574065, 6847195391333990232, 1572638100518868053,
-		8850422670118399721, 3631909142291992901, 5158881091950831288, 2882958317343121593,
-		4763258931815816403, 6280052734341785344, 4243789408204964850, 2043464728020827976,
-		6545300466022085465, 4562580375758598164, 5495451168795427352, 1738312861590151095,
-		553004618757816492, 6895160632757959823, 8233623922264685171, 7139506338801360852,
-		8550891222387991669, 5535668688139305547, 2430933853350256242, 5401941257863201076,
-		8159640039107728799, 6157493831600770366, 7632066283658143750, 6308328381617103346,
-		3681878764086140361, 3289686137190109749, 6587997200611086848, 244714774258135476,
-		4079788377417136100, 8090302575944624335, 2945117363431356361, 864324395848741045,
-		3009039260312620700, 8430027460082534031, 401084700045993341, 7254622446438694921,
-		4707864159563588614, 5640248530963493951, 5982507712689997893, 3315098242282210105,
-		5503847578771918426, 3941971367175193882, 8118566580304798074, 3839261274019871296,
-		7062410411742090847, 741381002980207668, 6027994129690250817, 2497829994150063930,
-		6251390334426228834, 1368930247903518833, 8809096399316380241, 6492004350391900708,
-		2462145737463489636, 404828418920299174, 4153026434231690595, 261785715255475940,
-		5464715384600071357, 592710404378763017, 6764129236657751224, 8513655718539357449,
-		5820343663801914208, 385298524683789911, 5224135003438199467, 6303131641338802145,
-		7150122561309371392, 368107899140673753, 3115186834558311558, 2915636353584281051,
-		4782583894627718279, 6718292300699989587, 8387085186914375220, 3387513132024756289,
-		4654329375432538231, 8930667561363381602, 5374373436876319273, 7623042350483453954,
-		7725442901813263321, 9186225467561587250, 4091027289597503355, 2357631606492579800,
-		2530936820058611833, 1636551876240043639, 5564664674334965799, 1452244145334316253,
-		2061642381019690829, 1279580266495294036, 9108481583171221009, 6023278686734049809,
-		5007630032676973346, 2153168792952589781, 6720334534964750538, 6041546491134794105,
-		3433922409283786309, 2285479922797300912, 3110614940896576130, 6366559590722842893,
-		5418791419666136509, 7163298419643543757, 4891138053923696990, 580618510277907015,
-		1684034065251686769, 4429514767357295841, 330346578555450005, 1119637995812174675,
-		7177515271653460134, 4589042248470800257, 7693288629059004563, 143607045258444228,
-		246994305896273627, 866417324803099287, 6473547110565816071, 3092379936208876896,
-		2058427839513754051, 5133784708526867938, 8785882556301281247, 6149332666841167611,
-		8585842181454472135, 6137678347805511274, 2070447184436970006, 5708223427705576541,
-		5999657892458244504, 4358391411789012426, 325123008708389849, 6837621693887290924,
-		4843721905315627004, 6010651222149276415, 5398352198963874652, 4602025990114250980,
-		1044646352569048800, 9106614159853161675, 829256115228593269, 4919284369102997000,
-		2681532557646850893, 3681559472488511871, 5307999518958214035, 6334130388442829274,
-		2658708232916537604, 1163313865052186287, 581945337509520675, 3648778920718647903,
-		4423673246306544414, 1620799783996955743, 220828013409515943, 8150384699999389761,
-		4287360518296753003, 4590000184845883843, 5513660857261085186, 6964829100392774275,
-		478991688350776035, 8746140185685648781, 228500091334420247, 1356187007457302238,
-		3019253992034194581, 3152601605678500003, 430152752706002213, 5559581553696971176,
-		4916432985369275664, 663574931734554391, 3420773838927732076, 2868348622579915573,
-		1999319134044418520, 3328689518636282723, 2587672709781371173, 1517255313529399333,
-		3092343956317362483, 3662252519007064108, 972445599196498113, 7664865435875959367,
-		1708913533482282562, 6917817162668868494, 3217629022545312900, 2570043027221707107,
-		8739788839543624613, 2488075924621352812, 4694002395387436668, 4559628481798514356,
-		2997203966153298104, 1282559373026354493, 240113143146674385, 8665713329246516443,
-		628141331766346752, 4571950817186770476, 1472811188152235408, 7596648026010355826,
-		6091219417754424743, 7834161864828164065, 7103445518877254909, 4390861237357459201,
-		4442653864240571734, 8903482404847331368, 622261699494173647, 6037261250297213248,
-		504404948065709118, 7275215526217113061, 1011176780856001400, 2194750105623461063,
-		2623071828615234808, 5157313728073836108, 3738405111966602044, 2539767524076729570,
-		2467284396349269342, 5256026990536851868, 7841086888628396109, 6640857538655893162,
-		1202087339038317498, 2113514992440715978, 7534350895342931403, 4925284734898484745,
-		5145623771477493805, 8225140880134972332, 2719520354384050532, 9132346697815513771,
-		4332154495710163773, 7137789594094346916, 6994721091344268833, 6667228574869048934,
-		655440045726677499, 59934747298466858, 6124974028078036405, 8957774780655365418,
-		2332206071942466437, 1701056712286369627, 3154897383618636503, 1637766181387607527,
-		2460521277767576533, 197309393502684135, 643677854385267315, 2543179307861934850,
-		4350769010207485119, 4754652089410667672, 2015595502641514512, 7999059458976458608,
-		4287946071480840813, 8362686366770308971, 6486469209321732151, 3617727845841796026,
-		7554353525834302244, 4450022655153542367, 1605195740213535749, 5327014565305508387,
-		4626575813550328320, 2692222020597705149, 241045573717249868, 5098046974627094010,
-		7916882295460730264, 884817090297530579, 5329160409530630596, 7790979528857726136,
-		4955070238059373407, 4918537275422674302, 3008076183950404629, 3007769226071157901,
-		2470346235617803020, 8928702772696731736, 7856187920214445904, 4474874585391974885,
-		7900176660600710914, 2140571127916226672, 2425445057265199971, 2486055153341847830,
-		4186670094382025798, 1883939007446035042, 8808666044074867985, 3734134241178479257,
-		4065968871360089196, 6953124200385847784, 1305686814738899057, 1637739099014457647,
-		3656125660947993209, 3966759634633167020, 3106378204088556331, 6328899822778449810,
-		4565385105440252958, 1979884289539493806, 2331793186920865425, 3783206694208922581,
-		8464961209802336085, 2843963751609577687, 3030678195484896323, 4793717574095772604,
-		4459239494808162889, 402587895800087237, 8057891408711167515, 4541888170938985079,
-		1042662272908816815, 5557303057122568958, 2647678726283249984, 2144477441549833761,
-		5806352215355387087, 7117771003473903623, 5916597177708541638, 462597715452321361,
-		8833658097025758785, 5970273481425315300, 563813119381731307, 2768349550652697015,
-		1598828206250873866, 5206393647403558110, 6235043485709261823, 3152217402014639496,
-		8469693267274066490, 125672920241807416, 5311079624024060938, 6663754932310491587,
-		8736848295048751716, 4488039774992061878, 5923302823487327109, 140891791083103236,
-		7414942793393574290, 7990420780896957397, 4317817392807076702, 3625184369705367340,
-		2740722765288122703, 5743100009702758344, 5997898640509039159, 8854493341352484163,
-		5242208035432907801, 701338899890987198, 7609280429197514109, 3020985755112334161,
-		6651322707055512866, 2635195723621160615, 5144520864246028816, 1035086515727829828,
-		1567242097116389047, 8172389260191636581, 6337820351429292273, 2163012566996458925,
-		2743190902890262681, 1906367633221323427, 6011544915663598137, 5932255307352610768,
-		2241128460406315459, 895504896216695588, 3094483003111372717, 4583857460292963101,
-		9079887171656594975, 8839289181930711403, 5762740387243057873, 4225072055348026230,
-		1838220598389033063, 3801620336801580414, 8823526620080073856, 1776617605585100335,
-		7899055018877642622, 5421679761463003041, 5521102963086275121, 4248279443559365898,
-		8735487530905098534, 1760527091573692978, 7142485049657745894, 8222656872927218123,
-		4969531564923704323, 3394475942196872480, 6424174453260338141, 359248545074932887,
-		3273651282831730598, 6797106199797138596, 3030918217665093212, 145600834617314036,
-		6036575856065626233, 740416251634527158, 7080427635449935582, 6951781370868335478,
-		399922722363687927, 294902314447253185, 7844950936339178523, 880320858634709042,
-		6192655680808675579, 411604686384710388, 9026808440365124461, 6440783557497587732,
-		4615674634722404292, 539897290441580544, 2096238225866883852, 8751955639408182687,
-		1907224908052289603, 7381039757301768559, 6157238513393239656, 7749994231914157575,
-		8629571604380892756, 5280433031239081479, 7101611890139813254, 2479018537985767835,
-		7169176924412769570, 7942066497793203302, 1357759729055557688, 2278447439451174845,
-		3625338785743880657, 6477479539006708521, 8976185375579272206, 5511371554711836120,
-		1326024180520890843, 7537449876596048829, 5464680203499696154, 3189671183162196045,
-		6346751753565857109, 241159987320630307, 3095793449658682053, 8978332846736310159,
-		2902794662273147216, 7208698530190629697, 7276901792339343736, 1732385229314443140,
-		4133292154170828382, 2918308698224194548, 1519461397937144458, 5293934712616591764,
-		4922828954023452664, 2879211533496425641, 5896236396443472108, 8465043815351752425,
-		7329020396871624740, 8915471717014488588, 2944902635677463047, 7052079073493465134,
-		8382142935188824023, 9103922860780351547, 4152330101494654406,
-	}
-)
-
-type rngSource struct {
-	tap  int         // index into vec
-	feed int         // index into vec
-	vec  [_LEN]int64 // current feedback register
-}
-
-// seed rng x[n+1] = 48271 * x[n] mod (2**31 - 1)
-func seedrand(x int32) int32 {
-	hi := x / _Q
-	lo := x % _Q
-	x = _A*lo - _R*hi
-	if x < 0 {
-		x += _M
-	}
-	return x
-}
-
-// Seed uses the provided seed value to initialize the generator to a deterministic state.
-func (rng *rngSource) Seed(seed int64) {
-	rng.tap = 0
-	rng.feed = _LEN - _TAP
-
-	seed = seed % _M
-	if seed < 0 {
-		seed += _M
-	}
-	if seed == 0 {
-		seed = 89482311
-	}
-
-	x := int32(seed)
-	for i := -20; i < _LEN; i++ {
-		x = seedrand(x)
-		if i >= 0 {
-			var u int64
-			u = int64(x) << 40
-			x = seedrand(x)
-			u ^= int64(x) << 20
-			x = seedrand(x)
-			u ^= int64(x)
-			u ^= rng_cooked[i]
-			rng.vec[i] = u & _MASK
-		}
-	}
-}
-
-// Int63 returns a non-negative pseudo-random 63-bit integer as an int64.
-func (rng *rngSource) Int63() int64 {
-	rng.tap--
-	if rng.tap < 0 {
-		rng.tap += _LEN
-	}
-
-	rng.feed--
-	if rng.feed < 0 {
-		rng.feed += _LEN
-	}
-
-	x := (rng.vec[rng.feed] + rng.vec[rng.tap]) & _MASK
-	rng.vec[rng.feed] = x
-	return x
-}
diff --git a/third_party/gofrontend/libgo/go/math/rand/zipf.go b/third_party/gofrontend/libgo/go/math/rand/zipf.go
deleted file mode 100644
index f04c814..0000000
--- a/third_party/gofrontend/libgo/go/math/rand/zipf.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// W.Hormann, G.Derflinger:
-// "Rejection-Inversion to Generate Variates
-// from Monotone Discrete Distributions"
-// http://eeyore.wu-wien.ac.at/papers/96-04-04.wh-der.ps.gz
-
-package rand
-
-import "math"
-
-// A Zipf generates Zipf distributed variates.
-type Zipf struct {
-	r            *Rand
-	imax         float64
-	v            float64
-	q            float64
-	s            float64
-	oneminusQ    float64
-	oneminusQinv float64
-	hxm          float64
-	hx0minusHxm  float64
-}
-
-func (z *Zipf) h(x float64) float64 {
-	return math.Exp(z.oneminusQ*math.Log(z.v+x)) * z.oneminusQinv
-}
-
-func (z *Zipf) hinv(x float64) float64 {
-	return math.Exp(z.oneminusQinv*math.Log(z.oneminusQ*x)) - z.v
-}
-
-// NewZipf returns a Zipf variate generator.
-// The generator generates values k ∈ [0, imax]
-// such that P(k) is proportional to (v + k) ** (-s).
-// Requirements: s > 1 and v >= 1.
-func NewZipf(r *Rand, s float64, v float64, imax uint64) *Zipf {
-	z := new(Zipf)
-	if s <= 1.0 || v < 1 {
-		return nil
-	}
-	z.r = r
-	z.imax = float64(imax)
-	z.v = v
-	z.q = s
-	z.oneminusQ = 1.0 - z.q
-	z.oneminusQinv = 1.0 / z.oneminusQ
-	z.hxm = z.h(z.imax + 0.5)
-	z.hx0minusHxm = z.h(0.5) - math.Exp(math.Log(z.v)*(-z.q)) - z.hxm
-	z.s = 1 - z.hinv(z.h(1.5)-math.Exp(-z.q*math.Log(z.v+1.0)))
-	return z
-}
-
-// Uint64 returns a value drawn from the Zipf distribution described
-// by the Zipf object.
-func (z *Zipf) Uint64() uint64 {
-	if z == nil {
-		panic("rand: nil Zipf")
-	}
-	k := 0.0
-
-	for {
-		r := z.r.Float64() // r on [0,1]
-		ur := z.hxm + r*z.hx0minusHxm
-		x := z.hinv(ur)
-		k = math.Floor(x + 0.5)
-		if k-x <= z.s {
-			break
-		}
-		if ur >= z.h(k+0.5)-math.Exp(-math.Log(k+z.v)*z.q) {
-			break
-		}
-	}
-	return uint64(k)
-}
diff --git a/third_party/gofrontend/libgo/go/math/remainder.go b/third_party/gofrontend/libgo/go/math/remainder.go
deleted file mode 100644
index 98bb04d..0000000
--- a/third_party/gofrontend/libgo/go/math/remainder.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// The original C code and the comment below are from
-// FreeBSD's /usr/src/lib/msun/src/e_remainder.c and came
-// with this notice.  The go code is a simplified version of
-// the original C.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunPro, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-// __ieee754_remainder(x,y)
-// Return :
-//      returns  x REM y  =  x - [x/y]*y  as if in infinite
-//      precision arithmetic, where [x/y] is the (infinite bit)
-//      integer nearest x/y (in half way cases, choose the even one).
-// Method :
-//      Based on Mod() returning  x - [x/y]chopped * y  exactly.
-
-// Remainder returns the IEEE 754 floating-point remainder of x/y.
-//
-// Special cases are:
-//	Remainder(±Inf, y) = NaN
-//	Remainder(NaN, y) = NaN
-//	Remainder(x, 0) = NaN
-//	Remainder(x, ±Inf) = x
-//	Remainder(x, NaN) = NaN
-func Remainder(x, y float64) float64 {
-	return remainder(x, y)
-}
-
-func remainder(x, y float64) float64 {
-	const (
-		Tiny    = 4.45014771701440276618e-308 // 0x0020000000000000
-		HalfMax = MaxFloat64 / 2
-	)
-	// special cases
-	switch {
-	case IsNaN(x) || IsNaN(y) || IsInf(x, 0) || y == 0:
-		return NaN()
-	case IsInf(y, 0):
-		return x
-	}
-	sign := false
-	if x < 0 {
-		x = -x
-		sign = true
-	}
-	if y < 0 {
-		y = -y
-	}
-	if x == y {
-		return 0
-	}
-	if y <= HalfMax {
-		x = Mod(x, y+y) // now x < 2y
-	}
-	if y < Tiny {
-		if x+x > y {
-			x -= y
-			if x+x >= y {
-				x -= y
-			}
-		}
-	} else {
-		yHalf := 0.5 * y
-		if x > yHalf {
-			x -= y
-			if x >= yHalf {
-				x -= y
-			}
-		}
-	}
-	if sign {
-		x = -x
-	}
-	return x
-}
diff --git a/third_party/gofrontend/libgo/go/math/signbit.go b/third_party/gofrontend/libgo/go/math/signbit.go
deleted file mode 100644
index 670cc1a..0000000
--- a/third_party/gofrontend/libgo/go/math/signbit.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Signbit returns true if x is negative or negative zero.
-func Signbit(x float64) bool {
-	return Float64bits(x)&(1<<63) != 0
-}
diff --git a/third_party/gofrontend/libgo/go/math/sin.go b/third_party/gofrontend/libgo/go/math/sin.go
deleted file mode 100644
index 1c5491f..0000000
--- a/third_party/gofrontend/libgo/go/math/sin.go
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-/*
-	Floating-point sine and cosine.
-*/
-
-// The original C code, the long comment, and the constants
-// below were from http://netlib.sandia.gov/cephes/cmath/sin.c,
-// available from http://www.netlib.org/cephes/cmath.tgz.
-// The go code is a simplified version of the original C.
-//
-//      sin.c
-//
-//      Circular sine
-//
-// SYNOPSIS:
-//
-// double x, y, sin();
-// y = sin( x );
-//
-// DESCRIPTION:
-//
-// Range reduction is into intervals of pi/4.  The reduction error is nearly
-// eliminated by contriving an extended precision modular arithmetic.
-//
-// Two polynomial approximating functions are employed.
-// Between 0 and pi/4 the sine is approximated by
-//      x  +  x**3 P(x**2).
-// Between pi/4 and pi/2 the cosine is represented as
-//      1  -  x**2 Q(x**2).
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain      # trials      peak         rms
-//    DEC       0, 10       150000       3.0e-17     7.8e-18
-//    IEEE -1.07e9,+1.07e9  130000       2.1e-16     5.4e-17
-//
-// Partial loss of accuracy begins to occur at x = 2**30 = 1.074e9.  The loss
-// is not gradual, but jumps suddenly to about 1 part in 10e7.  Results may
-// be meaningless for x > 2**49 = 5.6e14.
-//
-//      cos.c
-//
-//      Circular cosine
-//
-// SYNOPSIS:
-//
-// double x, y, cos();
-// y = cos( x );
-//
-// DESCRIPTION:
-//
-// Range reduction is into intervals of pi/4.  The reduction error is nearly
-// eliminated by contriving an extended precision modular arithmetic.
-//
-// Two polynomial approximating functions are employed.
-// Between 0 and pi/4 the cosine is approximated by
-//      1  -  x**2 Q(x**2).
-// Between pi/4 and pi/2 the sine is represented as
-//      x  +  x**3 P(x**2).
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain      # trials      peak         rms
-//    IEEE -1.07e9,+1.07e9  130000       2.1e-16     5.4e-17
-//    DEC        0,+1.07e9   17000       3.0e-17     7.2e-18
-//
-// Cephes Math Library Release 2.8:  June, 2000
-// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
-//
-// The readme file at http://netlib.sandia.gov/cephes/ says:
-//    Some software in this archive may be from the book _Methods and
-// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
-// International, 1989) or from the Cephes Mathematical Library, a
-// commercial product. In either event, it is copyrighted by the author.
-// What you see here may be used freely but it comes with no support or
-// guarantee.
-//
-//   The two known misprints in the book are repaired here in the
-// source listings for the gamma function and the incomplete beta
-// integral.
-//
-//   Stephen L. Moshier
-//   moshier@na-net.ornl.gov
-
-// sin coefficients
-var _sin = [...]float64{
-	1.58962301576546568060E-10, // 0x3de5d8fd1fd19ccd
-	-2.50507477628578072866E-8, // 0xbe5ae5e5a9291f5d
-	2.75573136213857245213E-6,  // 0x3ec71de3567d48a1
-	-1.98412698295895385996E-4, // 0xbf2a01a019bfdf03
-	8.33333333332211858878E-3,  // 0x3f8111111110f7d0
-	-1.66666666666666307295E-1, // 0xbfc5555555555548
-}
-
-// cos coefficients
-var _cos = [...]float64{
-	-1.13585365213876817300E-11, // 0xbda8fa49a0861a9b
-	2.08757008419747316778E-9,   // 0x3e21ee9d7b4e3f05
-	-2.75573141792967388112E-7,  // 0xbe927e4f7eac4bc6
-	2.48015872888517045348E-5,   // 0x3efa01a019c844f5
-	-1.38888888888730564116E-3,  // 0xbf56c16c16c14f91
-	4.16666666666665929218E-2,   // 0x3fa555555555554b
-}
-
-// Cos returns the cosine of the radian argument x.
-//
-// Special cases are:
-//	Cos(±Inf) = NaN
-//	Cos(NaN) = NaN
-
-//extern cos
-func libc_cos(float64) float64
-
-func Cos(x float64) float64 {
-	return libc_cos(x)
-}
-
-func cos(x float64) float64 {
-	const (
-		PI4A = 7.85398125648498535156E-1                             // 0x3fe921fb40000000, Pi/4 split into three parts
-		PI4B = 3.77489470793079817668E-8                             // 0x3e64442d00000000,
-		PI4C = 2.69515142907905952645E-15                            // 0x3ce8469898cc5170,
-		M4PI = 1.273239544735162542821171882678754627704620361328125 // 4/pi
-	)
-	// special cases
-	switch {
-	case IsNaN(x) || IsInf(x, 0):
-		return NaN()
-	}
-
-	// make argument positive
-	sign := false
-	if x < 0 {
-		x = -x
-	}
-
-	j := int64(x * M4PI) // integer part of x/(Pi/4), as integer for tests on the phase angle
-	y := float64(j)      // integer part of x/(Pi/4), as float
-
-	// map zeros to origin
-	if j&1 == 1 {
-		j += 1
-		y += 1
-	}
-	j &= 7 // octant modulo 2Pi radians (360 degrees)
-	if j > 3 {
-		j -= 4
-		sign = !sign
-	}
-	if j > 1 {
-		sign = !sign
-	}
-
-	z := ((x - y*PI4A) - y*PI4B) - y*PI4C // Extended precision modular arithmetic
-	zz := z * z
-	if j == 1 || j == 2 {
-		y = z + z*zz*((((((_sin[0]*zz)+_sin[1])*zz+_sin[2])*zz+_sin[3])*zz+_sin[4])*zz+_sin[5])
-	} else {
-		y = 1.0 - 0.5*zz + zz*zz*((((((_cos[0]*zz)+_cos[1])*zz+_cos[2])*zz+_cos[3])*zz+_cos[4])*zz+_cos[5])
-	}
-	if sign {
-		y = -y
-	}
-	return y
-}
-
-// Sin returns the sine of the radian argument x.
-//
-// Special cases are:
-//	Sin(±0) = ±0
-//	Sin(±Inf) = NaN
-//	Sin(NaN) = NaN
-
-//extern sin
-func libc_sin(float64) float64
-
-func Sin(x float64) float64 {
-	return libc_sin(x)
-}
-
-func sin(x float64) float64 {
-	const (
-		PI4A = 7.85398125648498535156E-1                             // 0x3fe921fb40000000, Pi/4 split into three parts
-		PI4B = 3.77489470793079817668E-8                             // 0x3e64442d00000000,
-		PI4C = 2.69515142907905952645E-15                            // 0x3ce8469898cc5170,
-		M4PI = 1.273239544735162542821171882678754627704620361328125 // 4/pi
-	)
-	// special cases
-	switch {
-	case x == 0 || IsNaN(x):
-		return x // return ±0 || NaN()
-	case IsInf(x, 0):
-		return NaN()
-	}
-
-	// make argument positive but save the sign
-	sign := false
-	if x < 0 {
-		x = -x
-		sign = true
-	}
-
-	j := int64(x * M4PI) // integer part of x/(Pi/4), as integer for tests on the phase angle
-	y := float64(j)      // integer part of x/(Pi/4), as float
-
-	// map zeros to origin
-	if j&1 == 1 {
-		j += 1
-		y += 1
-	}
-	j &= 7 // octant modulo 2Pi radians (360 degrees)
-	// reflect in x axis
-	if j > 3 {
-		sign = !sign
-		j -= 4
-	}
-
-	z := ((x - y*PI4A) - y*PI4B) - y*PI4C // Extended precision modular arithmetic
-	zz := z * z
-	if j == 1 || j == 2 {
-		y = 1.0 - 0.5*zz + zz*zz*((((((_cos[0]*zz)+_cos[1])*zz+_cos[2])*zz+_cos[3])*zz+_cos[4])*zz+_cos[5])
-	} else {
-		y = z + z*zz*((((((_sin[0]*zz)+_sin[1])*zz+_sin[2])*zz+_sin[3])*zz+_sin[4])*zz+_sin[5])
-	}
-	if sign {
-		y = -y
-	}
-	return y
-}
diff --git a/third_party/gofrontend/libgo/go/math/sincos.go b/third_party/gofrontend/libgo/go/math/sincos.go
deleted file mode 100644
index b3a2f8a..0000000
--- a/third_party/gofrontend/libgo/go/math/sincos.go
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// Coefficients _sin[] and _cos[] are found in pkg/math/sin.go.
-
-// Sincos returns Sin(x), Cos(x).
-//
-// Special cases are:
-//	Sincos(±0) = ±0, 1
-//	Sincos(±Inf) = NaN, NaN
-//	Sincos(NaN) = NaN, NaN
-func Sincos(x float64) (sin, cos float64) {
-	return sincos(x)
-}
-
-func sincos(x float64) (sin, cos float64) {
-	const (
-		PI4A = 7.85398125648498535156E-1                             // 0x3fe921fb40000000, Pi/4 split into three parts
-		PI4B = 3.77489470793079817668E-8                             // 0x3e64442d00000000,
-		PI4C = 2.69515142907905952645E-15                            // 0x3ce8469898cc5170,
-		M4PI = 1.273239544735162542821171882678754627704620361328125 // 4/pi
-	)
-	// special cases
-	switch {
-	case x == 0:
-		return x, 1 // return ±0.0, 1.0
-	case IsNaN(x) || IsInf(x, 0):
-		return NaN(), NaN()
-	}
-
-	// make argument positive
-	sinSign, cosSign := false, false
-	if x < 0 {
-		x = -x
-		sinSign = true
-	}
-
-	j := int64(x * M4PI) // integer part of x/(Pi/4), as integer for tests on the phase angle
-	y := float64(j)      // integer part of x/(Pi/4), as float
-
-	if j&1 == 1 { // map zeros to origin
-		j += 1
-		y += 1
-	}
-	j &= 7     // octant modulo 2Pi radians (360 degrees)
-	if j > 3 { // reflect in x axis
-		j -= 4
-		sinSign, cosSign = !sinSign, !cosSign
-	}
-	if j > 1 {
-		cosSign = !cosSign
-	}
-
-	z := ((x - y*PI4A) - y*PI4B) - y*PI4C // Extended precision modular arithmetic
-	zz := z * z
-	cos = 1.0 - 0.5*zz + zz*zz*((((((_cos[0]*zz)+_cos[1])*zz+_cos[2])*zz+_cos[3])*zz+_cos[4])*zz+_cos[5])
-	sin = z + z*zz*((((((_sin[0]*zz)+_sin[1])*zz+_sin[2])*zz+_sin[3])*zz+_sin[4])*zz+_sin[5])
-	if j == 1 || j == 2 {
-		sin, cos = cos, sin
-	}
-	if cosSign {
-		cos = -cos
-	}
-	if sinSign {
-		sin = -sin
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/math/sinh.go b/third_party/gofrontend/libgo/go/math/sinh.go
deleted file mode 100644
index 139b911..0000000
--- a/third_party/gofrontend/libgo/go/math/sinh.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-/*
-	Floating-point hyperbolic sine and cosine.
-
-	The exponential func is called for arguments
-	greater in magnitude than 0.5.
-
-	A series is used for arguments smaller in magnitude than 0.5.
-
-	Cosh(x) is computed from the exponential func for
-	all arguments.
-*/
-
-// Sinh returns the hyperbolic sine of x.
-//
-// Special cases are:
-//	Sinh(±0) = ±0
-//	Sinh(±Inf) = ±Inf
-//	Sinh(NaN) = NaN
-func Sinh(x float64) float64 {
-	// The coefficients are #2029 from Hart & Cheney. (20.36D)
-	const (
-		P0 = -0.6307673640497716991184787251e+6
-		P1 = -0.8991272022039509355398013511e+5
-		P2 = -0.2894211355989563807284660366e+4
-		P3 = -0.2630563213397497062819489e+2
-		Q0 = -0.6307673640497716991212077277e+6
-		Q1 = 0.1521517378790019070696485176e+5
-		Q2 = -0.173678953558233699533450911e+3
-	)
-
-	sign := false
-	if x < 0 {
-		x = -x
-		sign = true
-	}
-
-	var temp float64
-	switch true {
-	case x > 21:
-		temp = Exp(x) / 2
-
-	case x > 0.5:
-		temp = (Exp(x) - Exp(-x)) / 2
-
-	default:
-		sq := x * x
-		temp = (((P3*sq+P2)*sq+P1)*sq + P0) * x
-		temp = temp / (((sq+Q2)*sq+Q1)*sq + Q0)
-	}
-
-	if sign {
-		temp = -temp
-	}
-	return temp
-}
-
-// Cosh returns the hyperbolic cosine of x.
-//
-// Special cases are:
-//	Cosh(±0) = 1
-//	Cosh(±Inf) = +Inf
-//	Cosh(NaN) = NaN
-func Cosh(x float64) float64 {
-	if x < 0 {
-		x = -x
-	}
-	if x > 21 {
-		return Exp(x) / 2
-	}
-	return (Exp(x) + Exp(-x)) / 2
-}
diff --git a/third_party/gofrontend/libgo/go/math/sqrt.go b/third_party/gofrontend/libgo/go/math/sqrt.go
deleted file mode 100644
index 215d648..0000000
--- a/third_party/gofrontend/libgo/go/math/sqrt.go
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-//extern sqrt
-func libc_sqrt(float64) float64
-
-func Sqrt(x float64) float64 {
-	return libc_sqrt(x)
-}
-
-// The original C code and the long comment below are
-// from FreeBSD's /usr/src/lib/msun/src/e_sqrt.c and
-// came with this notice.  The go code is a simplified
-// version of the original C.
-//
-// ====================================================
-// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
-//
-// Developed at SunPro, a Sun Microsystems, Inc. business.
-// Permission to use, copy, modify, and distribute this
-// software is freely granted, provided that this notice
-// is preserved.
-// ====================================================
-//
-// __ieee754_sqrt(x)
-// Return correctly rounded sqrt.
-//           -----------------------------------------
-//           | Use the hardware sqrt if you have one |
-//           -----------------------------------------
-// Method:
-//   Bit by bit method using integer arithmetic. (Slow, but portable)
-//   1. Normalization
-//      Scale x to y in [1,4) with even powers of 2:
-//      find an integer k such that  1 <= (y=x*2**(2k)) < 4, then
-//              sqrt(x) = 2**k * sqrt(y)
-//   2. Bit by bit computation
-//      Let q  = sqrt(y) truncated to i bit after binary point (q = 1),
-//           i                                                   0
-//                                     i+1         2
-//          s  = 2*q , and      y  =  2   * ( y - q  ).          (1)
-//           i      i            i                 i
-//
-//      To compute q    from q , one checks whether
-//                  i+1       i
-//
-//                            -(i+1) 2
-//                      (q + 2      )  <= y.                     (2)
-//                        i
-//                                                            -(i+1)
-//      If (2) is false, then q   = q ; otherwise q   = q  + 2      .
-//                             i+1   i             i+1   i
-//
-//      With some algebraic manipulation, it is not difficult to see
-//      that (2) is equivalent to
-//                             -(i+1)
-//                      s  +  2       <= y                       (3)
-//                       i                i
-//
-//      The advantage of (3) is that s  and y  can be computed by
-//                                    i      i
-//      the following recurrence formula:
-//          if (3) is false
-//
-//          s     =  s  ,       y    = y   ;                     (4)
-//           i+1      i          i+1    i
-//
-//      otherwise,
-//                         -i                      -(i+1)
-//          s     =  s  + 2  ,  y    = y  -  s  - 2              (5)
-//           i+1      i          i+1    i     i
-//
-//      One may easily use induction to prove (4) and (5).
-//      Note. Since the left hand side of (3) contain only i+2 bits,
-//            it does not necessary to do a full (53-bit) comparison
-//            in (3).
-//   3. Final rounding
-//      After generating the 53 bits result, we compute one more bit.
-//      Together with the remainder, we can decide whether the
-//      result is exact, bigger than 1/2ulp, or less than 1/2ulp
-//      (it will never equal to 1/2ulp).
-//      The rounding mode can be detected by checking whether
-//      huge + tiny is equal to huge, and whether huge - tiny is
-//      equal to huge for some floating point number "huge" and "tiny".
-//
-//
-// Notes:  Rounding mode detection omitted.  The constants "mask", "shift",
-// and "bias" are found in src/math/bits.go
-
-// Sqrt returns the square root of x.
-//
-// Special cases are:
-//	Sqrt(+Inf) = +Inf
-//	Sqrt(±0) = ±0
-//	Sqrt(x < 0) = NaN
-//	Sqrt(NaN) = NaN
-
-// Note: Sqrt is implemented in assembly on some systems.
-// Others have assembly stubs that jump to func sqrt below.
-// On systems where Sqrt is a single instruction, the compiler
-// may turn a direct call into a direct use of that instruction instead.
-
-func sqrt(x float64) float64 {
-	// special cases
-	switch {
-	case x == 0 || IsNaN(x) || IsInf(x, 1):
-		return x
-	case x < 0:
-		return NaN()
-	}
-	ix := Float64bits(x)
-	// normalize x
-	exp := int((ix >> shift) & mask)
-	if exp == 0 { // subnormal x
-		for ix&1<<shift == 0 {
-			ix <<= 1
-			exp--
-		}
-		exp++
-	}
-	exp -= bias // unbias exponent
-	ix &^= mask << shift
-	ix |= 1 << shift
-	if exp&1 == 1 { // odd exp, double x to make it even
-		ix <<= 1
-	}
-	exp >>= 1 // exp = exp/2, exponent of square root
-	// generate sqrt(x) bit by bit
-	ix <<= 1
-	var q, s uint64               // q = sqrt(x)
-	r := uint64(1 << (shift + 1)) // r = moving bit from MSB to LSB
-	for r != 0 {
-		t := s + r
-		if t <= ix {
-			s = t + r
-			ix -= t
-			q += r
-		}
-		ix <<= 1
-		r >>= 1
-	}
-	// final rounding
-	if ix != 0 { // remainder, result not exact
-		q += q & 1 // round according to extra bit
-	}
-	ix = q>>1 + uint64(exp-1+bias)<<shift // significand + biased exponent
-	return Float64frombits(ix)
-}
-
-func sqrtC(f float64, r *float64) {
-	*r = sqrt(f)
-}
diff --git a/third_party/gofrontend/libgo/go/math/tan.go b/third_party/gofrontend/libgo/go/math/tan.go
deleted file mode 100644
index e544b27..0000000
--- a/third_party/gofrontend/libgo/go/math/tan.go
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-/*
-	Floating-point tangent.
-*/
-
-// The original C code, the long comment, and the constants
-// below were from http://netlib.sandia.gov/cephes/cmath/sin.c,
-// available from http://www.netlib.org/cephes/cmath.tgz.
-// The go code is a simplified version of the original C.
-//
-//      tan.c
-//
-//      Circular tangent
-//
-// SYNOPSIS:
-//
-// double x, y, tan();
-// y = tan( x );
-//
-// DESCRIPTION:
-//
-// Returns the circular tangent of the radian argument x.
-//
-// Range reduction is modulo pi/4.  A rational function
-//       x + x**3 P(x**2)/Q(x**2)
-// is employed in the basic interval [0, pi/4].
-//
-// ACCURACY:
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    DEC      +-1.07e9      44000      4.1e-17     1.0e-17
-//    IEEE     +-1.07e9      30000      2.9e-16     8.1e-17
-//
-// Partial loss of accuracy begins to occur at x = 2**30 = 1.074e9.  The loss
-// is not gradual, but jumps suddenly to about 1 part in 10e7.  Results may
-// be meaningless for x > 2**49 = 5.6e14.
-// [Accuracy loss statement from sin.go comments.]
-//
-// Cephes Math Library Release 2.8:  June, 2000
-// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
-//
-// The readme file at http://netlib.sandia.gov/cephes/ says:
-//    Some software in this archive may be from the book _Methods and
-// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
-// International, 1989) or from the Cephes Mathematical Library, a
-// commercial product. In either event, it is copyrighted by the author.
-// What you see here may be used freely but it comes with no support or
-// guarantee.
-//
-//   The two known misprints in the book are repaired here in the
-// source listings for the gamma function and the incomplete beta
-// integral.
-//
-//   Stephen L. Moshier
-//   moshier@na-net.ornl.gov
-
-// tan coefficients
-var _tanP = [...]float64{
-	-1.30936939181383777646E4, // 0xc0c992d8d24f3f38
-	1.15351664838587416140E6,  // 0x413199eca5fc9ddd
-	-1.79565251976484877988E7, // 0xc1711fead3299176
-}
-var _tanQ = [...]float64{
-	1.00000000000000000000E0,
-	1.36812963470692954678E4,  //0x40cab8a5eeb36572
-	-1.32089234440210967447E6, //0xc13427bc582abc96
-	2.50083801823357915839E7,  //0x4177d98fc2ead8ef
-	-5.38695755929454629881E7, //0xc189afe03cbe5a31
-}
-
-// Tan returns the tangent of the radian argument x.
-//
-// Special cases are:
-//	Tan(±0) = ±0
-//	Tan(±Inf) = NaN
-//	Tan(NaN) = NaN
-
-//extern tan
-func libc_tan(float64) float64
-
-func Tan(x float64) float64 {
-	return libc_tan(x)
-}
-
-func tan(x float64) float64 {
-	const (
-		PI4A = 7.85398125648498535156E-1                             // 0x3fe921fb40000000, Pi/4 split into three parts
-		PI4B = 3.77489470793079817668E-8                             // 0x3e64442d00000000,
-		PI4C = 2.69515142907905952645E-15                            // 0x3ce8469898cc5170,
-		M4PI = 1.273239544735162542821171882678754627704620361328125 // 4/pi
-	)
-	// special cases
-	switch {
-	case x == 0 || IsNaN(x):
-		return x // return ±0 || NaN()
-	case IsInf(x, 0):
-		return NaN()
-	}
-
-	// make argument positive but save the sign
-	sign := false
-	if x < 0 {
-		x = -x
-		sign = true
-	}
-
-	j := int64(x * M4PI) // integer part of x/(Pi/4), as integer for tests on the phase angle
-	y := float64(j)      // integer part of x/(Pi/4), as float
-
-	/* map zeros and singularities to origin */
-	if j&1 == 1 {
-		j += 1
-		y += 1
-	}
-
-	z := ((x - y*PI4A) - y*PI4B) - y*PI4C
-	zz := z * z
-
-	if zz > 1e-14 {
-		y = z + z*(zz*(((_tanP[0]*zz)+_tanP[1])*zz+_tanP[2])/((((zz+_tanQ[1])*zz+_tanQ[2])*zz+_tanQ[3])*zz+_tanQ[4]))
-	} else {
-		y = z
-	}
-	if j&2 == 2 {
-		y = -1 / y
-	}
-	if sign {
-		y = -y
-	}
-	return y
-}
diff --git a/third_party/gofrontend/libgo/go/math/tanh.go b/third_party/gofrontend/libgo/go/math/tanh.go
deleted file mode 100644
index cf0ffa1..0000000
--- a/third_party/gofrontend/libgo/go/math/tanh.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-// The original C code, the long comment, and the constants
-// below were from http://netlib.sandia.gov/cephes/cmath/sin.c,
-// available from http://www.netlib.org/cephes/cmath.tgz.
-// The go code is a simplified version of the original C.
-//      tanh.c
-//
-//      Hyperbolic tangent
-//
-// SYNOPSIS:
-//
-// double x, y, tanh();
-//
-// y = tanh( x );
-//
-// DESCRIPTION:
-//
-// Returns hyperbolic tangent of argument in the range MINLOG to MAXLOG.
-//      MAXLOG = 8.8029691931113054295988e+01 = log(2**127)
-//      MINLOG = -8.872283911167299960540e+01 = log(2**-128)
-//
-// A rational function is used for |x| < 0.625.  The form
-// x + x**3 P(x)/Q(x) of Cody & Waite is employed.
-// Otherwise,
-//      tanh(x) = sinh(x)/cosh(x) = 1  -  2/(exp(2x) + 1).
-//
-// ACCURACY:
-//
-//                      Relative error:
-// arithmetic   domain     # trials      peak         rms
-//    IEEE      -2,2        30000       2.5e-16     5.8e-17
-//
-// Cephes Math Library Release 2.8:  June, 2000
-// Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
-//
-// The readme file at http://netlib.sandia.gov/cephes/ says:
-//    Some software in this archive may be from the book _Methods and
-// Programs for Mathematical Functions_ (Prentice-Hall or Simon & Schuster
-// International, 1989) or from the Cephes Mathematical Library, a
-// commercial product. In either event, it is copyrighted by the author.
-// What you see here may be used freely but it comes with no support or
-// guarantee.
-//
-//   The two known misprints in the book are repaired here in the
-// source listings for the gamma function and the incomplete beta
-// integral.
-//
-//   Stephen L. Moshier
-//   moshier@na-net.ornl.gov
-//
-
-var tanhP = [...]float64{
-	-9.64399179425052238628E-1,
-	-9.92877231001918586564E1,
-	-1.61468768441708447952E3,
-}
-var tanhQ = [...]float64{
-	1.12811678491632931402E2,
-	2.23548839060100448583E3,
-	4.84406305325125486048E3,
-}
-
-// Tanh returns the hyperbolic tangent of x.
-//
-// Special cases are:
-//	Tanh(±0) = ±0
-//	Tanh(±Inf) = ±1
-//	Tanh(NaN) = NaN
-func Tanh(x float64) float64 {
-	const MAXLOG = 8.8029691931113054295988e+01 // log(2**127)
-	z := Abs(x)
-	switch {
-	case z > 0.5*MAXLOG:
-		if x < 0 {
-			return -1
-		}
-		return 1
-	case z >= 0.625:
-		s := Exp(2 * z)
-		z = 1 - 2/(s+1)
-		if x < 0 {
-			z = -z
-		}
-	default:
-		if x == 0 {
-			return x
-		}
-		s := x * x
-		z = x + x*s*((tanhP[0]*s+tanhP[1])*s+tanhP[2])/(((s+tanhQ[0])*s+tanhQ[1])*s+tanhQ[2])
-	}
-	return z
-}
diff --git a/third_party/gofrontend/libgo/go/math/unsafe.go b/third_party/gofrontend/libgo/go/math/unsafe.go
deleted file mode 100644
index 5ae6742..0000000
--- a/third_party/gofrontend/libgo/go/math/unsafe.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package math
-
-import "unsafe"
-
-// Float32bits returns the IEEE 754 binary representation of f.
-func Float32bits(f float32) uint32 { return *(*uint32)(unsafe.Pointer(&f)) }
-
-// Float32frombits returns the floating point number corresponding
-// to the IEEE 754 binary representation b.
-func Float32frombits(b uint32) float32 { return *(*float32)(unsafe.Pointer(&b)) }
-
-// Float64bits returns the IEEE 754 binary representation of f.
-func Float64bits(f float64) uint64 { return *(*uint64)(unsafe.Pointer(&f)) }
-
-// Float64frombits returns the floating point number corresponding
-// the IEEE 754 binary representation b.
-func Float64frombits(b uint64) float64 { return *(*float64)(unsafe.Pointer(&b)) }
diff --git a/third_party/gofrontend/libgo/go/mime/encodedword.go b/third_party/gofrontend/libgo/go/mime/encodedword.go
deleted file mode 100644
index 9796f50..0000000
--- a/third_party/gofrontend/libgo/go/mime/encodedword.go
+++ /dev/null
@@ -1,329 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mime
-
-import (
-	"bytes"
-	"encoding/base64"
-	"errors"
-	"fmt"
-	"io"
-	"strings"
-	"sync"
-	"unicode"
-	"unicode/utf8"
-)
-
-// A WordEncoder is a RFC 2047 encoded-word encoder.
-type WordEncoder byte
-
-const (
-	// BEncoding represents Base64 encoding scheme as defined by RFC 2045.
-	BEncoding = WordEncoder('b')
-	// QEncoding represents the Q-encoding scheme as defined by RFC 2047.
-	QEncoding = WordEncoder('q')
-)
-
-var (
-	errInvalidWord = errors.New("mime: invalid RFC 2047 encoded-word")
-)
-
-// Encode returns the encoded-word form of s. If s is ASCII without special
-// characters, it is returned unchanged. The provided charset is the IANA
-// charset name of s. It is case insensitive.
-func (e WordEncoder) Encode(charset, s string) string {
-	if !needsEncoding(s) {
-		return s
-	}
-	return e.encodeWord(charset, s)
-}
-
-func needsEncoding(s string) bool {
-	for _, b := range s {
-		if (b < ' ' || b > '~') && b != '\t' {
-			return true
-		}
-	}
-	return false
-}
-
-// encodeWord encodes a string into an encoded-word.
-func (e WordEncoder) encodeWord(charset, s string) string {
-	buf := getBuffer()
-	defer putBuffer(buf)
-
-	buf.WriteString("=?")
-	buf.WriteString(charset)
-	buf.WriteByte('?')
-	buf.WriteByte(byte(e))
-	buf.WriteByte('?')
-
-	if e == BEncoding {
-		w := base64.NewEncoder(base64.StdEncoding, buf)
-		io.WriteString(w, s)
-		w.Close()
-	} else {
-		enc := make([]byte, 3)
-		for i := 0; i < len(s); i++ {
-			b := s[i]
-			switch {
-			case b == ' ':
-				buf.WriteByte('_')
-			case b <= '~' && b >= '!' && b != '=' && b != '?' && b != '_':
-				buf.WriteByte(b)
-			default:
-				enc[0] = '='
-				enc[1] = upperhex[b>>4]
-				enc[2] = upperhex[b&0x0f]
-				buf.Write(enc)
-			}
-		}
-	}
-	buf.WriteString("?=")
-	return buf.String()
-}
-
-const upperhex = "0123456789ABCDEF"
-
-// A WordDecoder decodes MIME headers containing RFC 2047 encoded-words.
-type WordDecoder struct {
-	// CharsetReader, if non-nil, defines a function to generate
-	// charset-conversion readers, converting from the provided
-	// charset into UTF-8.
-	// Charsets are always lower-case. utf-8, iso-8859-1 and us-ascii charsets
-	// are handled by default.
-	// One of the the CharsetReader's result values must be non-nil.
-	CharsetReader func(charset string, input io.Reader) (io.Reader, error)
-}
-
-// Decode decodes an encoded-word. If word is not a valid RFC 2047 encoded-word,
-// word is returned unchanged.
-func (d *WordDecoder) Decode(word string) (string, error) {
-	fields := strings.Split(word, "?") // TODO: remove allocation?
-	if len(fields) != 5 || fields[0] != "=" || fields[4] != "=" || len(fields[2]) != 1 {
-		return "", errInvalidWord
-	}
-
-	content, err := decode(fields[2][0], fields[3])
-	if err != nil {
-		return "", err
-	}
-
-	buf := getBuffer()
-	defer putBuffer(buf)
-
-	if err := d.convert(buf, fields[1], content); err != nil {
-		return "", err
-	}
-
-	return buf.String(), nil
-}
-
-// DecodeHeader decodes all encoded-words of the given string. It returns an
-// error if and only if CharsetReader of d returns an error.
-func (d *WordDecoder) DecodeHeader(header string) (string, error) {
-	// If there is no encoded-word, returns before creating a buffer.
-	i := strings.Index(header, "=?")
-	if i == -1 {
-		return header, nil
-	}
-
-	buf := getBuffer()
-	defer putBuffer(buf)
-
-	buf.WriteString(header[:i])
-	header = header[i:]
-
-	betweenWords := false
-	for {
-		start := strings.Index(header, "=?")
-		if start == -1 {
-			break
-		}
-		cur := start + len("=?")
-
-		i := strings.Index(header[cur:], "?")
-		if i == -1 {
-			break
-		}
-		charset := header[cur : cur+i]
-		cur += i + len("?")
-
-		if len(header) < cur+len("Q??=") {
-			break
-		}
-		encoding := header[cur]
-		cur++
-
-		if header[cur] != '?' {
-			break
-		}
-		cur++
-
-		j := strings.Index(header[cur:], "?=")
-		if j == -1 {
-			break
-		}
-		text := header[cur : cur+j]
-		end := cur + j + len("?=")
-
-		content, err := decode(encoding, text)
-		if err != nil {
-			betweenWords = false
-			buf.WriteString(header[:start+2])
-			header = header[start+2:]
-			continue
-		}
-
-		// Write characters before the encoded-word. White-space and newline
-		// characters separating two encoded-words must be deleted.
-		if start > 0 && (!betweenWords || hasNonWhitespace(header[:start])) {
-			buf.WriteString(header[:start])
-		}
-
-		if err := d.convert(buf, charset, content); err != nil {
-			return "", err
-		}
-
-		header = header[end:]
-		betweenWords = true
-	}
-
-	if len(header) > 0 {
-		buf.WriteString(header)
-	}
-
-	return buf.String(), nil
-}
-
-func decode(encoding byte, text string) ([]byte, error) {
-	switch encoding {
-	case 'B', 'b':
-		return base64.StdEncoding.DecodeString(text)
-	case 'Q', 'q':
-		return qDecode(text)
-	default:
-		return nil, errInvalidWord
-	}
-}
-
-func (d *WordDecoder) convert(buf *bytes.Buffer, charset string, content []byte) error {
-	switch {
-	case strings.EqualFold("utf-8", charset):
-		buf.Write(content)
-	case strings.EqualFold("iso-8859-1", charset):
-		for _, c := range content {
-			buf.WriteRune(rune(c))
-		}
-	case strings.EqualFold("us-ascii", charset):
-		for _, c := range content {
-			if c >= utf8.RuneSelf {
-				buf.WriteRune(unicode.ReplacementChar)
-			} else {
-				buf.WriteByte(c)
-			}
-		}
-	default:
-		if d.CharsetReader == nil {
-			return fmt.Errorf("mime: unhandled charset %q", charset)
-		}
-		r, err := d.CharsetReader(strings.ToLower(charset), bytes.NewReader(content))
-		if err != nil {
-			return err
-		}
-		if _, err = buf.ReadFrom(r); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// hasNonWhitespace reports whether s (assumed to be ASCII) contains at least
-// one byte of non-whitespace.
-func hasNonWhitespace(s string) bool {
-	for _, b := range s {
-		switch b {
-		// Encoded-words can only be separated by linear white spaces which does
-		// not include vertical tabs (\v).
-		case ' ', '\t', '\n', '\r':
-		default:
-			return true
-		}
-	}
-	return false
-}
-
-// qDecode decodes a Q encoded string.
-func qDecode(s string) ([]byte, error) {
-	dec := make([]byte, len(s))
-	n := 0
-	for i := 0; i < len(s); i++ {
-		switch c := s[i]; {
-		case c == '_':
-			dec[n] = ' '
-		case c == '=':
-			if i+2 >= len(s) {
-				return nil, errInvalidWord
-			}
-			b, err := readHexByte(s[i+1], s[i+2])
-			if err != nil {
-				return nil, err
-			}
-			dec[n] = b
-			i += 2
-		case (c <= '~' && c >= ' ') || c == '\n' || c == '\r' || c == '\t':
-			dec[n] = c
-		default:
-			return nil, errInvalidWord
-		}
-		n++
-	}
-
-	return dec[:n], nil
-}
-
-// readHexByte returns the byte from its quoted-printable representation.
-func readHexByte(a, b byte) (byte, error) {
-	var hb, lb byte
-	var err error
-	if hb, err = fromHex(a); err != nil {
-		return 0, err
-	}
-	if lb, err = fromHex(b); err != nil {
-		return 0, err
-	}
-	return hb<<4 | lb, nil
-}
-
-func fromHex(b byte) (byte, error) {
-	switch {
-	case b >= '0' && b <= '9':
-		return b - '0', nil
-	case b >= 'A' && b <= 'F':
-		return b - 'A' + 10, nil
-	// Accept badly encoded bytes.
-	case b >= 'a' && b <= 'f':
-		return b - 'a' + 10, nil
-	}
-	return 0, fmt.Errorf("mime: invalid hex byte %#02x", b)
-}
-
-var bufPool = sync.Pool{
-	New: func() interface{} {
-		return new(bytes.Buffer)
-	},
-}
-
-func getBuffer() *bytes.Buffer {
-	return bufPool.Get().(*bytes.Buffer)
-}
-
-func putBuffer(buf *bytes.Buffer) {
-	if buf.Len() > 1024 {
-		return
-	}
-	buf.Reset()
-	bufPool.Put(buf)
-}
diff --git a/third_party/gofrontend/libgo/go/mime/encodedword_test.go b/third_party/gofrontend/libgo/go/mime/encodedword_test.go
deleted file mode 100644
index 2beff5d..0000000
--- a/third_party/gofrontend/libgo/go/mime/encodedword_test.go
+++ /dev/null
@@ -1,287 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mime
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"strings"
-	"testing"
-)
-
-func ExampleWordEncoder_Encode() {
-	fmt.Println(QEncoding.Encode("utf-8", "¡Hola, señor!"))
-	fmt.Println(QEncoding.Encode("utf-8", "Hello!"))
-	fmt.Println(BEncoding.Encode("UTF-8", "¡Hola, señor!"))
-	fmt.Println(QEncoding.Encode("ISO-8859-1", "Caf\xE9"))
-	// Output:
-	// =?utf-8?q?=C2=A1Hola,_se=C3=B1or!?=
-	// Hello!
-	// =?UTF-8?b?wqFIb2xhLCBzZcOxb3Ih?=
-	// =?ISO-8859-1?q?Caf=E9?=
-}
-
-func ExampleWordDecoder_Decode() {
-	dec := new(WordDecoder)
-	header, err := dec.Decode("=?utf-8?q?=C2=A1Hola,_se=C3=B1or!?=")
-	if err != nil {
-		panic(err)
-	}
-	fmt.Println(header)
-
-	dec.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) {
-		switch charset {
-		case "x-case":
-			// Fake character set for example.
-			// Real use would integrate with packages such
-			// as code.google.com/p/go-charset
-			content, err := ioutil.ReadAll(input)
-			if err != nil {
-				return nil, err
-			}
-			return bytes.NewReader(bytes.ToUpper(content)), nil
-		default:
-			return nil, fmt.Errorf("unhandled charset %q", charset)
-		}
-	}
-	header, err = dec.Decode("=?x-case?q?hello!?=")
-	if err != nil {
-		panic(err)
-	}
-	fmt.Println(header)
-	// Output:
-	// ¡Hola, señor!
-	// HELLO!
-}
-
-func ExampleWordDecoder_DecodeHeader() {
-	dec := new(WordDecoder)
-	header, err := dec.DecodeHeader("=?utf-8?q?=C3=89ric?= <eric@example.org>, =?utf-8?q?Ana=C3=AFs?= <anais@example.org>")
-	if err != nil {
-		panic(err)
-	}
-	fmt.Println(header)
-
-	header, err = dec.DecodeHeader("=?utf-8?q?=C2=A1Hola,?= =?utf-8?q?_se=C3=B1or!?=")
-	if err != nil {
-		panic(err)
-	}
-	fmt.Println(header)
-
-	dec.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) {
-		switch charset {
-		case "x-case":
-			// Fake character set for example.
-			// Real use would integrate with packages such
-			// as code.google.com/p/go-charset
-			content, err := ioutil.ReadAll(input)
-			if err != nil {
-				return nil, err
-			}
-			return bytes.NewReader(bytes.ToUpper(content)), nil
-		default:
-			return nil, fmt.Errorf("unhandled charset %q", charset)
-		}
-	}
-	header, err = dec.DecodeHeader("=?x-case?q?hello_?= =?x-case?q?world!?=")
-	if err != nil {
-		panic(err)
-	}
-	fmt.Println(header)
-	// Output:
-	// Éric <eric@example.org>, Anaïs <anais@example.org>
-	// ¡Hola, señor!
-	// HELLO WORLD!
-}
-
-func TestEncodeWord(t *testing.T) {
-	utf8, iso88591 := "utf-8", "iso-8859-1"
-	tests := []struct {
-		enc      WordEncoder
-		charset  string
-		src, exp string
-	}{
-		{QEncoding, utf8, "François-Jérôme", "=?utf-8?q?Fran=C3=A7ois-J=C3=A9r=C3=B4me?="},
-		{BEncoding, utf8, "Café", "=?utf-8?b?Q2Fmw6k=?="},
-		{QEncoding, iso88591, "La Seleção", "=?iso-8859-1?q?La_Sele=C3=A7=C3=A3o?="},
-		{QEncoding, utf8, "", ""},
-		{QEncoding, utf8, "A", "A"},
-		{QEncoding, iso88591, "a", "a"},
-		{QEncoding, utf8, "123 456", "123 456"},
-		{QEncoding, utf8, "\t !\"#$%&'()*+,-./ :;<>?@[\\]^_`{|}~", "\t !\"#$%&'()*+,-./ :;<>?@[\\]^_`{|}~"},
-	}
-
-	for _, test := range tests {
-		if s := test.enc.Encode(test.charset, test.src); s != test.exp {
-			t.Errorf("Encode(%q) = %q, want %q", test.src, s, test.exp)
-		}
-	}
-}
-
-func TestDecodeWord(t *testing.T) {
-	tests := []struct {
-		src, exp string
-		hasErr   bool
-	}{
-		{"=?UTF-8?Q?=C2=A1Hola,_se=C3=B1or!?=", "¡Hola, señor!", false},
-		{"=?UTF-8?Q?Fran=C3=A7ois-J=C3=A9r=C3=B4me?=", "François-Jérôme", false},
-		{"=?UTF-8?q?ascii?=", "ascii", false},
-		{"=?utf-8?B?QW5kcsOp?=", "André", false},
-		{"=?ISO-8859-1?Q?Rapha=EBl_Dupont?=", "Raphaël Dupont", false},
-		{"=?utf-8?b?IkFudG9uaW8gSm9zw6kiIDxqb3NlQGV4YW1wbGUub3JnPg==?=", `"Antonio José" <jose@example.org>`, false},
-		{"=?UTF-8?A?Test?=", "", true},
-		{"=?UTF-8?Q?A=B?=", "", true},
-		{"=?UTF-8?Q?=A?=", "", true},
-		{"=?UTF-8?A?A?=", "", true},
-	}
-
-	for _, test := range tests {
-		dec := new(WordDecoder)
-		s, err := dec.Decode(test.src)
-		if test.hasErr && err == nil {
-			t.Errorf("Decode(%q) should return an error", test.src)
-			continue
-		}
-		if !test.hasErr && err != nil {
-			t.Errorf("Decode(%q): %v", test.src, err)
-			continue
-		}
-		if s != test.exp {
-			t.Errorf("Decode(%q) = %q, want %q", test.src, s, test.exp)
-		}
-	}
-}
-
-func TestDecodeHeader(t *testing.T) {
-	tests := []struct {
-		src, exp string
-	}{
-		{"=?UTF-8?Q?=C2=A1Hola,_se=C3=B1or!?=", "¡Hola, señor!"},
-		{"=?UTF-8?Q?Fran=C3=A7ois-J=C3=A9r=C3=B4me?=", "François-Jérôme"},
-		{"=?UTF-8?q?ascii?=", "ascii"},
-		{"=?utf-8?B?QW5kcsOp?=", "André"},
-		{"=?ISO-8859-1?Q?Rapha=EBl_Dupont?=", "Raphaël Dupont"},
-		{"Jean", "Jean"},
-		{"=?utf-8?b?IkFudG9uaW8gSm9zw6kiIDxqb3NlQGV4YW1wbGUub3JnPg==?=", `"Antonio José" <jose@example.org>`},
-		{"=?UTF-8?A?Test?=", "=?UTF-8?A?Test?="},
-		{"=?UTF-8?Q?A=B?=", "=?UTF-8?Q?A=B?="},
-		{"=?UTF-8?Q?=A?=", "=?UTF-8?Q?=A?="},
-		{"=?UTF-8?A?A?=", "=?UTF-8?A?A?="},
-		// Incomplete words
-		{"=?", "=?"},
-		{"=?UTF-8?", "=?UTF-8?"},
-		{"=?UTF-8?=", "=?UTF-8?="},
-		{"=?UTF-8?Q", "=?UTF-8?Q"},
-		{"=?UTF-8?Q?", "=?UTF-8?Q?"},
-		{"=?UTF-8?Q?=", "=?UTF-8?Q?="},
-		{"=?UTF-8?Q?A", "=?UTF-8?Q?A"},
-		{"=?UTF-8?Q?A?", "=?UTF-8?Q?A?"},
-		// Tests from RFC 2047
-		{"=?ISO-8859-1?Q?a?=", "a"},
-		{"=?ISO-8859-1?Q?a?= b", "a b"},
-		{"=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=", "ab"},
-		{"=?ISO-8859-1?Q?a?=  =?ISO-8859-1?Q?b?=", "ab"},
-		{"=?ISO-8859-1?Q?a?= \r\n\t =?ISO-8859-1?Q?b?=", "ab"},
-		{"=?ISO-8859-1?Q?a_b?=", "a b"},
-	}
-
-	for _, test := range tests {
-		dec := new(WordDecoder)
-		s, err := dec.DecodeHeader(test.src)
-		if err != nil {
-			t.Errorf("DecodeHeader(%q): %v", test.src, err)
-		}
-		if s != test.exp {
-			t.Errorf("DecodeHeader(%q) = %q, want %q", test.src, s, test.exp)
-		}
-	}
-}
-
-func TestCharsetDecoder(t *testing.T) {
-	tests := []struct {
-		src      string
-		want     string
-		charsets []string
-		content  []string
-	}{
-		{"=?utf-8?b?Q2Fmw6k=?=", "Café", nil, nil},
-		{"=?ISO-8859-1?Q?caf=E9?=", "café", nil, nil},
-		{"=?US-ASCII?Q?foo_bar?=", "foo bar", nil, nil},
-		{"=?utf-8?Q?=?=", "=?utf-8?Q?=?=", nil, nil},
-		{"=?utf-8?Q?=A?=", "=?utf-8?Q?=A?=", nil, nil},
-		{
-			"=?ISO-8859-15?Q?f=F5=F6?=  =?windows-1252?Q?b=E0r?=",
-			"f\xf5\xf6b\xe0r",
-			[]string{"iso-8859-15", "windows-1252"},
-			[]string{"f\xf5\xf6", "b\xe0r"},
-		},
-	}
-
-	for _, test := range tests {
-		i := 0
-		dec := &WordDecoder{
-			CharsetReader: func(charset string, input io.Reader) (io.Reader, error) {
-				if charset != test.charsets[i] {
-					t.Errorf("DecodeHeader(%q), got charset %q, want %q", test.src, charset, test.charsets[i])
-				}
-				content, err := ioutil.ReadAll(input)
-				if err != nil {
-					t.Errorf("DecodeHeader(%q), error in reader: %v", test.src, err)
-				}
-				got := string(content)
-				if got != test.content[i] {
-					t.Errorf("DecodeHeader(%q), got content %q, want %q", test.src, got, test.content[i])
-				}
-				i++
-
-				return strings.NewReader(got), nil
-			},
-		}
-		got, err := dec.DecodeHeader(test.src)
-		if err != nil {
-			t.Errorf("DecodeHeader(%q): %v", test.src, err)
-		}
-		if got != test.want {
-			t.Errorf("DecodeHeader(%q) = %q, want %q", test.src, got, test.want)
-		}
-	}
-}
-
-func TestCharsetDecoderError(t *testing.T) {
-	dec := &WordDecoder{
-		CharsetReader: func(charset string, input io.Reader) (io.Reader, error) {
-			return nil, errors.New("Test error")
-		},
-	}
-
-	if _, err := dec.DecodeHeader("=?charset?Q?foo?="); err == nil {
-		t.Error("DecodeHeader should return an error")
-	}
-}
-
-func BenchmarkQEncodeWord(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		QEncoding.Encode("UTF-8", "¡Hola, señor!")
-	}
-}
-
-func BenchmarkQDecodeWord(b *testing.B) {
-	dec := new(WordDecoder)
-
-	for i := 0; i < b.N; i++ {
-		dec.Decode("=?utf-8?q?=C2=A1Hola,_se=C3=B1or!?=")
-	}
-}
-
-func BenchmarkQDecodeHeader(b *testing.B) {
-	dec := new(WordDecoder)
-
-	for i := 0; i < b.N; i++ {
-		dec.Decode("=?utf-8?q?=C2=A1Hola,_se=C3=B1or!?=")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/mime/grammar.go b/third_party/gofrontend/libgo/go/mime/grammar.go
deleted file mode 100644
index 31b66e8..0000000
--- a/third_party/gofrontend/libgo/go/mime/grammar.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mime
-
-import (
-	"strings"
-)
-
-// isTSpecial reports whether rune is in 'tspecials' as defined by RFC
-// 1521 and RFC 2045.
-func isTSpecial(r rune) bool {
-	return strings.IndexRune(`()<>@,;:\"/[]?=`, r) != -1
-}
-
-// isTokenChar reports whether rune is in 'token' as defined by RFC
-// 1521 and RFC 2045.
-func isTokenChar(r rune) bool {
-	// token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
-	//             or tspecials>
-	return r > 0x20 && r < 0x7f && !isTSpecial(r)
-}
-
-// isToken reports whether s is a 'token' as defined by RFC 1521
-// and RFC 2045.
-func isToken(s string) bool {
-	if s == "" {
-		return false
-	}
-	return strings.IndexFunc(s, isNotTokenChar) < 0
-}
diff --git a/third_party/gofrontend/libgo/go/mime/mediatype.go b/third_party/gofrontend/libgo/go/mime/mediatype.go
deleted file mode 100644
index ad63f9b..0000000
--- a/third_party/gofrontend/libgo/go/mime/mediatype.go
+++ /dev/null
@@ -1,358 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mime
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"sort"
-	"strings"
-	"unicode"
-)
-
-// FormatMediaType serializes mediatype t and the parameters
-// param as a media type conforming to RFC 2045 and RFC 2616.
-// The type and parameter names are written in lower-case.
-// When any of the arguments result in a standard violation then
-// FormatMediaType returns the empty string.
-func FormatMediaType(t string, param map[string]string) string {
-	slash := strings.Index(t, "/")
-	if slash == -1 {
-		return ""
-	}
-	major, sub := t[:slash], t[slash+1:]
-	if !isToken(major) || !isToken(sub) {
-		return ""
-	}
-	var b bytes.Buffer
-	b.WriteString(strings.ToLower(major))
-	b.WriteByte('/')
-	b.WriteString(strings.ToLower(sub))
-
-	attrs := make([]string, 0, len(param))
-	for a := range param {
-		attrs = append(attrs, a)
-	}
-	sort.Strings(attrs)
-
-	for _, attribute := range attrs {
-		value := param[attribute]
-		b.WriteByte(';')
-		b.WriteByte(' ')
-		if !isToken(attribute) {
-			return ""
-		}
-		b.WriteString(strings.ToLower(attribute))
-		b.WriteByte('=')
-		if isToken(value) {
-			b.WriteString(value)
-			continue
-		}
-
-		b.WriteByte('"')
-		offset := 0
-		for index, character := range value {
-			if character == '"' || character == '\\' {
-				b.WriteString(value[offset:index])
-				offset = index
-				b.WriteByte('\\')
-			}
-			if character&0x80 != 0 {
-				return ""
-			}
-		}
-		b.WriteString(value[offset:])
-		b.WriteByte('"')
-	}
-	return b.String()
-}
-
-func checkMediaTypeDisposition(s string) error {
-	typ, rest := consumeToken(s)
-	if typ == "" {
-		return errors.New("mime: no media type")
-	}
-	if rest == "" {
-		return nil
-	}
-	if !strings.HasPrefix(rest, "/") {
-		return errors.New("mime: expected slash after first token")
-	}
-	subtype, rest := consumeToken(rest[1:])
-	if subtype == "" {
-		return errors.New("mime: expected token after slash")
-	}
-	if rest != "" {
-		return errors.New("mime: unexpected content after media subtype")
-	}
-	return nil
-}
-
-// ParseMediaType parses a media type value and any optional
-// parameters, per RFC 1521.  Media types are the values in
-// Content-Type and Content-Disposition headers (RFC 2183).
-// On success, ParseMediaType returns the media type converted
-// to lowercase and trimmed of white space and a non-nil map.
-// The returned map, params, maps from the lowercase
-// attribute to the attribute value with its case preserved.
-func ParseMediaType(v string) (mediatype string, params map[string]string, err error) {
-	i := strings.Index(v, ";")
-	if i == -1 {
-		i = len(v)
-	}
-	mediatype = strings.TrimSpace(strings.ToLower(v[0:i]))
-
-	err = checkMediaTypeDisposition(mediatype)
-	if err != nil {
-		return "", nil, err
-	}
-
-	params = make(map[string]string)
-
-	// Map of base parameter name -> parameter name -> value
-	// for parameters containing a '*' character.
-	// Lazily initialized.
-	var continuation map[string]map[string]string
-
-	v = v[i:]
-	for len(v) > 0 {
-		v = strings.TrimLeftFunc(v, unicode.IsSpace)
-		if len(v) == 0 {
-			break
-		}
-		key, value, rest := consumeMediaParam(v)
-		if key == "" {
-			if strings.TrimSpace(rest) == ";" {
-				// Ignore trailing semicolons.
-				// Not an error.
-				return
-			}
-			// Parse error.
-			return "", nil, errors.New("mime: invalid media parameter")
-		}
-
-		pmap := params
-		if idx := strings.Index(key, "*"); idx != -1 {
-			baseName := key[:idx]
-			if continuation == nil {
-				continuation = make(map[string]map[string]string)
-			}
-			var ok bool
-			if pmap, ok = continuation[baseName]; !ok {
-				continuation[baseName] = make(map[string]string)
-				pmap = continuation[baseName]
-			}
-		}
-		if _, exists := pmap[key]; exists {
-			// Duplicate parameter name is bogus.
-			return "", nil, errors.New("mime: duplicate parameter name")
-		}
-		pmap[key] = value
-		v = rest
-	}
-
-	// Stitch together any continuations or things with stars
-	// (i.e. RFC 2231 things with stars: "foo*0" or "foo*")
-	var buf bytes.Buffer
-	for key, pieceMap := range continuation {
-		singlePartKey := key + "*"
-		if v, ok := pieceMap[singlePartKey]; ok {
-			decv := decode2231Enc(v)
-			params[key] = decv
-			continue
-		}
-
-		buf.Reset()
-		valid := false
-		for n := 0; ; n++ {
-			simplePart := fmt.Sprintf("%s*%d", key, n)
-			if v, ok := pieceMap[simplePart]; ok {
-				valid = true
-				buf.WriteString(v)
-				continue
-			}
-			encodedPart := simplePart + "*"
-			if v, ok := pieceMap[encodedPart]; ok {
-				valid = true
-				if n == 0 {
-					buf.WriteString(decode2231Enc(v))
-				} else {
-					decv, _ := percentHexUnescape(v)
-					buf.WriteString(decv)
-				}
-			} else {
-				break
-			}
-		}
-		if valid {
-			params[key] = buf.String()
-		}
-	}
-
-	return
-}
-
-func decode2231Enc(v string) string {
-	sv := strings.SplitN(v, "'", 3)
-	if len(sv) != 3 {
-		return ""
-	}
-	// TODO: ignoring lang in sv[1] for now. If anybody needs it we'll
-	// need to decide how to expose it in the API. But I'm not sure
-	// anybody uses it in practice.
-	charset := strings.ToLower(sv[0])
-	if charset != "us-ascii" && charset != "utf-8" {
-		// TODO: unsupported encoding
-		return ""
-	}
-	encv, _ := percentHexUnescape(sv[2])
-	return encv
-}
-
-func isNotTokenChar(r rune) bool {
-	return !isTokenChar(r)
-}
-
-// consumeToken consumes a token from the beginning of provided
-// string, per RFC 2045 section 5.1 (referenced from 2183), and return
-// the token consumed and the rest of the string.  Returns ("", v) on
-// failure to consume at least one character.
-func consumeToken(v string) (token, rest string) {
-	notPos := strings.IndexFunc(v, isNotTokenChar)
-	if notPos == -1 {
-		return v, ""
-	}
-	if notPos == 0 {
-		return "", v
-	}
-	return v[0:notPos], v[notPos:]
-}
-
-// consumeValue consumes a "value" per RFC 2045, where a value is
-// either a 'token' or a 'quoted-string'.  On success, consumeValue
-// returns the value consumed (and de-quoted/escaped, if a
-// quoted-string) and the rest of the string.  On failure, returns
-// ("", v).
-func consumeValue(v string) (value, rest string) {
-	if !strings.HasPrefix(v, `"`) && !strings.HasPrefix(v, `'`) {
-		return consumeToken(v)
-	}
-
-	leadQuote := rune(v[0])
-
-	// parse a quoted-string
-	rest = v[1:] // consume the leading quote
-	buffer := new(bytes.Buffer)
-	var idx int
-	var r rune
-	var nextIsLiteral bool
-	for idx, r = range rest {
-		switch {
-		case nextIsLiteral:
-			buffer.WriteRune(r)
-			nextIsLiteral = false
-		case r == leadQuote:
-			return buffer.String(), rest[idx+1:]
-		case r == '\\':
-			nextIsLiteral = true
-		case r != '\r' && r != '\n':
-			buffer.WriteRune(r)
-		default:
-			return "", v
-		}
-	}
-	return "", v
-}
-
-func consumeMediaParam(v string) (param, value, rest string) {
-	rest = strings.TrimLeftFunc(v, unicode.IsSpace)
-	if !strings.HasPrefix(rest, ";") {
-		return "", "", v
-	}
-
-	rest = rest[1:] // consume semicolon
-	rest = strings.TrimLeftFunc(rest, unicode.IsSpace)
-	param, rest = consumeToken(rest)
-	param = strings.ToLower(param)
-	if param == "" {
-		return "", "", v
-	}
-
-	rest = strings.TrimLeftFunc(rest, unicode.IsSpace)
-	if !strings.HasPrefix(rest, "=") {
-		return "", "", v
-	}
-	rest = rest[1:] // consume equals sign
-	rest = strings.TrimLeftFunc(rest, unicode.IsSpace)
-	value, rest = consumeValue(rest)
-	if value == "" {
-		return "", "", v
-	}
-	return param, value, rest
-}
-
-func percentHexUnescape(s string) (string, error) {
-	// Count %, check that they're well-formed.
-	percents := 0
-	for i := 0; i < len(s); {
-		if s[i] != '%' {
-			i++
-			continue
-		}
-		percents++
-		if i+2 >= len(s) || !ishex(s[i+1]) || !ishex(s[i+2]) {
-			s = s[i:]
-			if len(s) > 3 {
-				s = s[0:3]
-			}
-			return "", fmt.Errorf("mime: bogus characters after %%: %q", s)
-		}
-		i += 3
-	}
-	if percents == 0 {
-		return s, nil
-	}
-
-	t := make([]byte, len(s)-2*percents)
-	j := 0
-	for i := 0; i < len(s); {
-		switch s[i] {
-		case '%':
-			t[j] = unhex(s[i+1])<<4 | unhex(s[i+2])
-			j++
-			i += 3
-		default:
-			t[j] = s[i]
-			j++
-			i++
-		}
-	}
-	return string(t), nil
-}
-
-func ishex(c byte) bool {
-	switch {
-	case '0' <= c && c <= '9':
-		return true
-	case 'a' <= c && c <= 'f':
-		return true
-	case 'A' <= c && c <= 'F':
-		return true
-	}
-	return false
-}
-
-func unhex(c byte) byte {
-	switch {
-	case '0' <= c && c <= '9':
-		return c - '0'
-	case 'a' <= c && c <= 'f':
-		return c - 'a' + 10
-	case 'A' <= c && c <= 'F':
-		return c - 'A' + 10
-	}
-	return 0
-}
diff --git a/third_party/gofrontend/libgo/go/mime/mediatype_test.go b/third_party/gofrontend/libgo/go/mime/mediatype_test.go
deleted file mode 100644
index 026bfa4..0000000
--- a/third_party/gofrontend/libgo/go/mime/mediatype_test.go
+++ /dev/null
@@ -1,306 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mime
-
-import (
-	"reflect"
-	"testing"
-)
-
-func TestConsumeToken(t *testing.T) {
-	tests := [...][3]string{
-		{"foo bar", "foo", " bar"},
-		{"bar", "bar", ""},
-		{"", "", ""},
-		{" foo", "", " foo"},
-	}
-	for _, test := range tests {
-		token, rest := consumeToken(test[0])
-		expectedToken := test[1]
-		expectedRest := test[2]
-		if token != expectedToken {
-			t.Errorf("expected to consume token '%s', not '%s' from '%s'",
-				expectedToken, token, test[0])
-		} else if rest != expectedRest {
-			t.Errorf("expected to have left '%s', not '%s' after reading token '%s' from '%s'",
-				expectedRest, rest, token, test[0])
-		}
-	}
-}
-
-func TestConsumeValue(t *testing.T) {
-	tests := [...][3]string{
-		{"foo bar", "foo", " bar"},
-		{"bar", "bar", ""},
-		{" bar ", "", " bar "},
-		{`"My value"end`, "My value", "end"},
-		{`"My value" end`, "My value", " end"},
-		{`"\\" rest`, "\\", " rest"},
-		{`"My \" value"end`, "My \" value", "end"},
-		{`"\" rest`, "", `"\" rest`},
-	}
-	for _, test := range tests {
-		value, rest := consumeValue(test[0])
-		expectedValue := test[1]
-		expectedRest := test[2]
-		if value != expectedValue {
-			t.Errorf("expected to consume value [%s], not [%s] from [%s]",
-				expectedValue, value, test[0])
-		} else if rest != expectedRest {
-			t.Errorf("expected to have left [%s], not [%s] after reading value [%s] from [%s]",
-				expectedRest, rest, value, test[0])
-		}
-	}
-}
-
-func TestConsumeMediaParam(t *testing.T) {
-	tests := [...][4]string{
-		{" ; foo=bar", "foo", "bar", ""},
-		{"; foo=bar", "foo", "bar", ""},
-		{";foo=bar", "foo", "bar", ""},
-		{";FOO=bar", "foo", "bar", ""},
-		{`;foo="bar"`, "foo", "bar", ""},
-		{`;foo="bar"; `, "foo", "bar", "; "},
-		{`;foo="bar"; foo=baz`, "foo", "bar", "; foo=baz"},
-		{` ; boundary=----CUT;`, "boundary", "----CUT", ";"},
-		{` ; key=value;  blah="value";name="foo" `, "key", "value", `;  blah="value";name="foo" `},
-		{`;  blah="value";name="foo" `, "blah", "value", `;name="foo" `},
-		{`;name="foo" `, "name", "foo", ` `},
-	}
-	for _, test := range tests {
-		param, value, rest := consumeMediaParam(test[0])
-		expectedParam := test[1]
-		expectedValue := test[2]
-		expectedRest := test[3]
-		if param != expectedParam {
-			t.Errorf("expected to consume param [%s], not [%s] from [%s]",
-				expectedParam, param, test[0])
-		} else if value != expectedValue {
-			t.Errorf("expected to consume value [%s], not [%s] from [%s]",
-				expectedValue, value, test[0])
-		} else if rest != expectedRest {
-			t.Errorf("expected to have left [%s], not [%s] after reading [%s/%s] from [%s]",
-				expectedRest, rest, param, value, test[0])
-		}
-	}
-}
-
-type mediaTypeTest struct {
-	in string
-	t  string
-	p  map[string]string
-}
-
-func TestParseMediaType(t *testing.T) {
-	// Convenience map initializer
-	m := func(s ...string) map[string]string {
-		sm := make(map[string]string)
-		for i := 0; i < len(s); i += 2 {
-			sm[s[i]] = s[i+1]
-		}
-		return sm
-	}
-
-	nameFoo := map[string]string{"name": "foo"}
-	tests := []mediaTypeTest{
-		{`form-data; name="foo"`, "form-data", nameFoo},
-		{` form-data ; name=foo`, "form-data", nameFoo},
-		{`FORM-DATA;name="foo"`, "form-data", nameFoo},
-		{` FORM-DATA ; name="foo"`, "form-data", nameFoo},
-		{` FORM-DATA ; name="foo"`, "form-data", nameFoo},
-
-		{`form-data; key=value;  blah="value";name="foo" `,
-			"form-data",
-			m("key", "value", "blah", "value", "name", "foo")},
-
-		{`foo; key=val1; key=the-key-appears-again-which-is-bogus`,
-			"", m()},
-
-		// From RFC 2231:
-		{`application/x-stuff; title*=us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A`,
-			"application/x-stuff",
-			m("title", "This is ***fun***")},
-
-		{`message/external-body; access-type=URL; ` +
-			`URL*0="ftp://";` +
-			`URL*1="cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar"`,
-			"message/external-body",
-			m("access-type", "URL",
-				"url", "ftp://cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar")},
-
-		{`application/x-stuff; ` +
-			`title*0*=us-ascii'en'This%20is%20even%20more%20; ` +
-			`title*1*=%2A%2A%2Afun%2A%2A%2A%20; ` +
-			`title*2="isn't it!"`,
-			"application/x-stuff",
-			m("title", "This is even more ***fun*** isn't it!")},
-
-		// Tests from http://greenbytes.de/tech/tc2231/
-		// TODO(bradfitz): add the rest of the tests from that site.
-		{`attachment; filename="f\oo.html"`,
-			"attachment",
-			m("filename", "foo.html")},
-		{`attachment; filename="\"quoting\" tested.html"`,
-			"attachment",
-			m("filename", `"quoting" tested.html`)},
-		{`attachment; filename="Here's a semicolon;.html"`,
-			"attachment",
-			m("filename", "Here's a semicolon;.html")},
-		{`attachment; foo="\"\\";filename="foo.html"`,
-			"attachment",
-			m("foo", "\"\\", "filename", "foo.html")},
-		{`attachment; filename=foo.html`,
-			"attachment",
-			m("filename", "foo.html")},
-		{`attachment; filename=foo.html ;`,
-			"attachment",
-			m("filename", "foo.html")},
-		{`attachment; filename='foo.html'`,
-			"attachment",
-			m("filename", "foo.html")},
-		{`attachment; filename="foo-%41.html"`,
-			"attachment",
-			m("filename", "foo-%41.html")},
-		{`attachment; filename="foo-%\41.html"`,
-			"attachment",
-			m("filename", "foo-%41.html")},
-		{`filename=foo.html`,
-			"", m()},
-		{`x=y; filename=foo.html`,
-			"", m()},
-		{`"foo; filename=bar;baz"; filename=qux`,
-			"", m()},
-		{`inline; attachment; filename=foo.html`,
-			"", m()},
-		{`attachment; filename="foo.html".txt`,
-			"", m()},
-		{`attachment; filename="bar`,
-			"", m()},
-		{`attachment; creation-date="Wed, 12 Feb 1997 16:29:51 -0500"`,
-			"attachment",
-			m("creation-date", "Wed, 12 Feb 1997 16:29:51 -0500")},
-		{`foobar`, "foobar", m()},
-		{`attachment; filename* =UTF-8''foo-%c3%a4.html`,
-			"attachment",
-			m("filename", "foo-ä.html")},
-		{`attachment; filename*=UTF-8''A-%2541.html`,
-			"attachment",
-			m("filename", "A-%41.html")},
-		{`attachment; filename*0="foo."; filename*1="html"`,
-			"attachment",
-			m("filename", "foo.html")},
-		{`attachment; filename*0*=UTF-8''foo-%c3%a4; filename*1=".html"`,
-			"attachment",
-			m("filename", "foo-ä.html")},
-		{`attachment; filename*0="foo"; filename*01="bar"`,
-			"attachment",
-			m("filename", "foo")},
-		{`attachment; filename*0="foo"; filename*2="bar"`,
-			"attachment",
-			m("filename", "foo")},
-		{`attachment; filename*1="foo"; filename*2="bar"`,
-			"attachment", m()},
-		{`attachment; filename*1="bar"; filename*0="foo"`,
-			"attachment",
-			m("filename", "foobar")},
-		{`attachment; filename="foo-ae.html"; filename*=UTF-8''foo-%c3%a4.html`,
-			"attachment",
-			m("filename", "foo-ä.html")},
-		{`attachment; filename*=UTF-8''foo-%c3%a4.html; filename="foo-ae.html"`,
-			"attachment",
-			m("filename", "foo-ä.html")},
-
-		// Browsers also just send UTF-8 directly without RFC 2231,
-		// at least when the source page is served with UTF-8.
-		{`form-data; firstname="Брэд"; lastname="Фицпатрик"`,
-			"form-data",
-			m("firstname", "Брэд", "lastname", "Фицпатрик")},
-	}
-	for _, test := range tests {
-		mt, params, err := ParseMediaType(test.in)
-		if err != nil {
-			if test.t != "" {
-				t.Errorf("for input %q, unexpected error: %v", test.in, err)
-				continue
-			}
-			continue
-		}
-		if g, e := mt, test.t; g != e {
-			t.Errorf("for input %q, expected type %q, got %q",
-				test.in, e, g)
-			continue
-		}
-		if len(params) == 0 && len(test.p) == 0 {
-			continue
-		}
-		if !reflect.DeepEqual(params, test.p) {
-			t.Errorf("for input %q, wrong params.\n"+
-				"expected: %#v\n"+
-				"     got: %#v",
-				test.in, test.p, params)
-		}
-	}
-}
-
-type badMediaTypeTest struct {
-	in  string
-	err string
-}
-
-var badMediaTypeTests = []badMediaTypeTest{
-	{"bogus ;=========", "mime: invalid media parameter"},
-	{"bogus/<script>alert</script>", "mime: expected token after slash"},
-	{"bogus/bogus<script>alert</script>", "mime: unexpected content after media subtype"},
-}
-
-func TestParseMediaTypeBogus(t *testing.T) {
-	for _, tt := range badMediaTypeTests {
-		mt, params, err := ParseMediaType(tt.in)
-		if err == nil {
-			t.Errorf("ParseMediaType(%q) = nil error; want parse error", tt.in)
-			continue
-		}
-		if err.Error() != tt.err {
-			t.Errorf("ParseMediaType(%q) = err %q; want %q", tt.in, err.Error(), tt.err)
-		}
-		if params != nil {
-			t.Errorf("ParseMediaType(%q): got non-nil params on error", tt.in)
-		}
-		if mt != "" {
-			t.Errorf("ParseMediaType(%q): got non-empty media type string on error", tt.in)
-		}
-	}
-}
-
-type formatTest struct {
-	typ    string
-	params map[string]string
-	want   string
-}
-
-var formatTests = []formatTest{
-	{"noslash", nil, ""},
-	{"foo bar/baz", nil, ""},
-	{"foo/bar baz", nil, ""},
-	{"foo/BAR", nil, "foo/bar"},
-	{"foo/BAR", map[string]string{"X": "Y"}, "foo/bar; x=Y"},
-	{"foo/BAR", map[string]string{"space": "With space"}, `foo/bar; space="With space"`},
-	{"foo/BAR", map[string]string{"quote": `With "quote`}, `foo/bar; quote="With \"quote"`},
-	{"foo/BAR", map[string]string{"bslash": `With \backslash`}, `foo/bar; bslash="With \\backslash"`},
-	{"foo/BAR", map[string]string{"both": `With \backslash and "quote`}, `foo/bar; both="With \\backslash and \"quote"`},
-	{"foo/BAR", map[string]string{"": "empty attribute"}, ""},
-	{"foo/BAR", map[string]string{"bad attribute": "baz"}, ""},
-	{"foo/BAR", map[string]string{"nonascii": "not an ascii character: ä"}, ""},
-	{"foo/bar", map[string]string{"a": "av", "b": "bv", "c": "cv"}, "foo/bar; a=av; b=bv; c=cv"},
-}
-
-func TestFormatMediaType(t *testing.T) {
-	for i, tt := range formatTests {
-		got := FormatMediaType(tt.typ, tt.params)
-		if got != tt.want {
-			t.Errorf("%d. FormatMediaType(%q, %v) = %q; want %q", i, tt.typ, tt.params, got, tt.want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/mime/multipart/formdata.go b/third_party/gofrontend/libgo/go/mime/multipart/formdata.go
deleted file mode 100644
index eee53fc..0000000
--- a/third_party/gofrontend/libgo/go/mime/multipart/formdata.go
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package multipart
-
-import (
-	"bytes"
-	"errors"
-	"io"
-	"io/ioutil"
-	"net/textproto"
-	"os"
-)
-
-// TODO(adg,bradfitz): find a way to unify the DoS-prevention strategy here
-// with that of the http package's ParseForm.
-
-// ReadForm parses an entire multipart message whose parts have
-// a Content-Disposition of "form-data".
-// It stores up to maxMemory bytes of the file parts in memory
-// and the remainder on disk in temporary files.
-func (r *Reader) ReadForm(maxMemory int64) (f *Form, err error) {
-	form := &Form{make(map[string][]string), make(map[string][]*FileHeader)}
-	defer func() {
-		if err != nil {
-			form.RemoveAll()
-		}
-	}()
-
-	maxValueBytes := int64(10 << 20) // 10 MB is a lot of text.
-	for {
-		p, err := r.NextPart()
-		if err == io.EOF {
-			break
-		}
-		if err != nil {
-			return nil, err
-		}
-
-		name := p.FormName()
-		if name == "" {
-			continue
-		}
-		filename := p.FileName()
-
-		var b bytes.Buffer
-
-		if filename == "" {
-			// value, store as string in memory
-			n, err := io.CopyN(&b, p, maxValueBytes)
-			if err != nil && err != io.EOF {
-				return nil, err
-			}
-			maxValueBytes -= n
-			if maxValueBytes == 0 {
-				return nil, errors.New("multipart: message too large")
-			}
-			form.Value[name] = append(form.Value[name], b.String())
-			continue
-		}
-
-		// file, store in memory or on disk
-		fh := &FileHeader{
-			Filename: filename,
-			Header:   p.Header,
-		}
-		n, err := io.CopyN(&b, p, maxMemory+1)
-		if err != nil && err != io.EOF {
-			return nil, err
-		}
-		if n > maxMemory {
-			// too big, write to disk and flush buffer
-			file, err := ioutil.TempFile("", "multipart-")
-			if err != nil {
-				return nil, err
-			}
-			defer file.Close()
-			_, err = io.Copy(file, io.MultiReader(&b, p))
-			if err != nil {
-				os.Remove(file.Name())
-				return nil, err
-			}
-			fh.tmpfile = file.Name()
-		} else {
-			fh.content = b.Bytes()
-			maxMemory -= n
-		}
-		form.File[name] = append(form.File[name], fh)
-	}
-
-	return form, nil
-}
-
-// Form is a parsed multipart form.
-// Its File parts are stored either in memory or on disk,
-// and are accessible via the *FileHeader's Open method.
-// Its Value parts are stored as strings.
-// Both are keyed by field name.
-type Form struct {
-	Value map[string][]string
-	File  map[string][]*FileHeader
-}
-
-// RemoveAll removes any temporary files associated with a Form.
-func (f *Form) RemoveAll() error {
-	var err error
-	for _, fhs := range f.File {
-		for _, fh := range fhs {
-			if fh.tmpfile != "" {
-				e := os.Remove(fh.tmpfile)
-				if e != nil && err == nil {
-					err = e
-				}
-			}
-		}
-	}
-	return err
-}
-
-// A FileHeader describes a file part of a multipart request.
-type FileHeader struct {
-	Filename string
-	Header   textproto.MIMEHeader
-
-	content []byte
-	tmpfile string
-}
-
-// Open opens and returns the FileHeader's associated File.
-func (fh *FileHeader) Open() (File, error) {
-	if b := fh.content; b != nil {
-		r := io.NewSectionReader(bytes.NewReader(b), 0, int64(len(b)))
-		return sectionReadCloser{r}, nil
-	}
-	return os.Open(fh.tmpfile)
-}
-
-// File is an interface to access the file part of a multipart message.
-// Its contents may be either stored in memory or on disk.
-// If stored on disk, the File's underlying concrete type will be an *os.File.
-type File interface {
-	io.Reader
-	io.ReaderAt
-	io.Seeker
-	io.Closer
-}
-
-// helper types to turn a []byte into a File
-
-type sectionReadCloser struct {
-	*io.SectionReader
-}
-
-func (rc sectionReadCloser) Close() error {
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/mime/multipart/formdata_test.go b/third_party/gofrontend/libgo/go/mime/multipart/formdata_test.go
deleted file mode 100644
index 6e2388b..0000000
--- a/third_party/gofrontend/libgo/go/mime/multipart/formdata_test.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package multipart
-
-import (
-	"bytes"
-	"io"
-	"os"
-	"regexp"
-	"strings"
-	"testing"
-)
-
-func TestReadForm(t *testing.T) {
-	testBody := regexp.MustCompile("\n").ReplaceAllString(message, "\r\n")
-	b := strings.NewReader(testBody)
-	r := NewReader(b, boundary)
-	f, err := r.ReadForm(25)
-	if err != nil {
-		t.Fatal("ReadForm:", err)
-	}
-	defer f.RemoveAll()
-	if g, e := f.Value["texta"][0], textaValue; g != e {
-		t.Errorf("texta value = %q, want %q", g, e)
-	}
-	if g, e := f.Value["textb"][0], textbValue; g != e {
-		t.Errorf("texta value = %q, want %q", g, e)
-	}
-	fd := testFile(t, f.File["filea"][0], "filea.txt", fileaContents)
-	if _, ok := fd.(*os.File); ok {
-		t.Error("file is *os.File, should not be")
-	}
-	fd.Close()
-	fd = testFile(t, f.File["fileb"][0], "fileb.txt", filebContents)
-	if _, ok := fd.(*os.File); !ok {
-		t.Errorf("file has unexpected underlying type %T", fd)
-	}
-	fd.Close()
-}
-
-func testFile(t *testing.T, fh *FileHeader, efn, econtent string) File {
-	if fh.Filename != efn {
-		t.Errorf("filename = %q, want %q", fh.Filename, efn)
-	}
-	f, err := fh.Open()
-	if err != nil {
-		t.Fatal("opening file:", err)
-	}
-	b := new(bytes.Buffer)
-	_, err = io.Copy(b, f)
-	if err != nil {
-		t.Fatal("copying contents:", err)
-	}
-	if g := b.String(); g != econtent {
-		t.Errorf("contents = %q, want %q", g, econtent)
-	}
-	return f
-}
-
-const (
-	fileaContents = "This is a test file."
-	filebContents = "Another test file."
-	textaValue    = "foo"
-	textbValue    = "bar"
-	boundary      = `MyBoundary`
-)
-
-const message = `
---MyBoundary
-Content-Disposition: form-data; name="filea"; filename="filea.txt"
-Content-Type: text/plain
-
-` + fileaContents + `
---MyBoundary
-Content-Disposition: form-data; name="fileb"; filename="fileb.txt"
-Content-Type: text/plain
-
-` + filebContents + `
---MyBoundary
-Content-Disposition: form-data; name="texta"
-
-` + textaValue + `
---MyBoundary
-Content-Disposition: form-data; name="textb"
-
-` + textbValue + `
---MyBoundary--
-`
diff --git a/third_party/gofrontend/libgo/go/mime/multipart/multipart.go b/third_party/gofrontend/libgo/go/mime/multipart/multipart.go
deleted file mode 100644
index 6f65a55..0000000
--- a/third_party/gofrontend/libgo/go/mime/multipart/multipart.go
+++ /dev/null
@@ -1,378 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-//
-
-/*
-Package multipart implements MIME multipart parsing, as defined in RFC
-2046.
-
-The implementation is sufficient for HTTP (RFC 2388) and the multipart
-bodies generated by popular browsers.
-*/
-package multipart
-
-import (
-	"bufio"
-	"bytes"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"mime"
-	"mime/quotedprintable"
-	"net/textproto"
-)
-
-var emptyParams = make(map[string]string)
-
-// A Part represents a single part in a multipart body.
-type Part struct {
-	// The headers of the body, if any, with the keys canonicalized
-	// in the same fashion that the Go http.Request headers are.
-	// For example, "foo-bar" changes case to "Foo-Bar"
-	//
-	// As a special case, if the "Content-Transfer-Encoding" header
-	// has a value of "quoted-printable", that header is instead
-	// hidden from this map and the body is transparently decoded
-	// during Read calls.
-	Header textproto.MIMEHeader
-
-	buffer    *bytes.Buffer
-	mr        *Reader
-	bytesRead int
-
-	disposition       string
-	dispositionParams map[string]string
-
-	// r is either a reader directly reading from mr, or it's a
-	// wrapper around such a reader, decoding the
-	// Content-Transfer-Encoding
-	r io.Reader
-}
-
-// FormName returns the name parameter if p has a Content-Disposition
-// of type "form-data".  Otherwise it returns the empty string.
-func (p *Part) FormName() string {
-	// See http://tools.ietf.org/html/rfc2183 section 2 for EBNF
-	// of Content-Disposition value format.
-	if p.dispositionParams == nil {
-		p.parseContentDisposition()
-	}
-	if p.disposition != "form-data" {
-		return ""
-	}
-	return p.dispositionParams["name"]
-}
-
-// FileName returns the filename parameter of the Part's
-// Content-Disposition header.
-func (p *Part) FileName() string {
-	if p.dispositionParams == nil {
-		p.parseContentDisposition()
-	}
-	return p.dispositionParams["filename"]
-}
-
-func (p *Part) parseContentDisposition() {
-	v := p.Header.Get("Content-Disposition")
-	var err error
-	p.disposition, p.dispositionParams, err = mime.ParseMediaType(v)
-	if err != nil {
-		p.dispositionParams = emptyParams
-	}
-}
-
-// NewReader creates a new multipart Reader reading from r using the
-// given MIME boundary.
-//
-// The boundary is usually obtained from the "boundary" parameter of
-// the message's "Content-Type" header. Use mime.ParseMediaType to
-// parse such headers.
-func NewReader(r io.Reader, boundary string) *Reader {
-	b := []byte("\r\n--" + boundary + "--")
-	return &Reader{
-		bufReader:        bufio.NewReader(r),
-		nl:               b[:2],
-		nlDashBoundary:   b[:len(b)-2],
-		dashBoundaryDash: b[2:],
-		dashBoundary:     b[2 : len(b)-2],
-	}
-}
-
-func newPart(mr *Reader) (*Part, error) {
-	bp := &Part{
-		Header: make(map[string][]string),
-		mr:     mr,
-		buffer: new(bytes.Buffer),
-	}
-	if err := bp.populateHeaders(); err != nil {
-		return nil, err
-	}
-	bp.r = partReader{bp}
-	const cte = "Content-Transfer-Encoding"
-	if bp.Header.Get(cte) == "quoted-printable" {
-		bp.Header.Del(cte)
-		bp.r = quotedprintable.NewReader(bp.r)
-	}
-	return bp, nil
-}
-
-func (bp *Part) populateHeaders() error {
-	r := textproto.NewReader(bp.mr.bufReader)
-	header, err := r.ReadMIMEHeader()
-	if err == nil {
-		bp.Header = header
-	}
-	return err
-}
-
-// Read reads the body of a part, after its headers and before the
-// next part (if any) begins.
-func (p *Part) Read(d []byte) (n int, err error) {
-	return p.r.Read(d)
-}
-
-// partReader implements io.Reader by reading raw bytes directly from the
-// wrapped *Part, without doing any Transfer-Encoding decoding.
-type partReader struct {
-	p *Part
-}
-
-func (pr partReader) Read(d []byte) (n int, err error) {
-	p := pr.p
-	defer func() {
-		p.bytesRead += n
-	}()
-	if p.buffer.Len() >= len(d) {
-		// Internal buffer of unconsumed data is large enough for
-		// the read request.  No need to parse more at the moment.
-		return p.buffer.Read(d)
-	}
-	peek, err := p.mr.bufReader.Peek(4096) // TODO(bradfitz): add buffer size accessor
-
-	// Look for an immediate empty part without a leading \r\n
-	// before the boundary separator.  Some MIME code makes empty
-	// parts like this. Most browsers, however, write the \r\n
-	// before the subsequent boundary even for empty parts and
-	// won't hit this path.
-	if p.bytesRead == 0 && p.mr.peekBufferIsEmptyPart(peek) {
-		return 0, io.EOF
-	}
-	unexpectedEOF := err == io.EOF
-	if err != nil && !unexpectedEOF {
-		return 0, fmt.Errorf("multipart: Part Read: %v", err)
-	}
-	if peek == nil {
-		panic("nil peek buf")
-	}
-	// Search the peek buffer for "\r\n--boundary". If found,
-	// consume everything up to the boundary. If not, consume only
-	// as much of the peek buffer as cannot hold the boundary
-	// string.
-	nCopy := 0
-	foundBoundary := false
-	if idx, isEnd := p.mr.peekBufferSeparatorIndex(peek); idx != -1 {
-		nCopy = idx
-		foundBoundary = isEnd
-		if !isEnd && nCopy == 0 {
-			nCopy = 1 // make some progress.
-		}
-	} else if safeCount := len(peek) - len(p.mr.nlDashBoundary); safeCount > 0 {
-		nCopy = safeCount
-	} else if unexpectedEOF {
-		// If we've run out of peek buffer and the boundary
-		// wasn't found (and can't possibly fit), we must have
-		// hit the end of the file unexpectedly.
-		return 0, io.ErrUnexpectedEOF
-	}
-	if nCopy > 0 {
-		if _, err := io.CopyN(p.buffer, p.mr.bufReader, int64(nCopy)); err != nil {
-			return 0, err
-		}
-	}
-	n, err = p.buffer.Read(d)
-	if err == io.EOF && !foundBoundary {
-		// If the boundary hasn't been reached there's more to
-		// read, so don't pass through an EOF from the buffer
-		err = nil
-	}
-	return
-}
-
-func (p *Part) Close() error {
-	io.Copy(ioutil.Discard, p)
-	return nil
-}
-
-// Reader is an iterator over parts in a MIME multipart body.
-// Reader's underlying parser consumes its input as needed.  Seeking
-// isn't supported.
-type Reader struct {
-	bufReader *bufio.Reader
-
-	currentPart *Part
-	partsRead   int
-
-	nl               []byte // "\r\n" or "\n" (set after seeing first boundary line)
-	nlDashBoundary   []byte // nl + "--boundary"
-	dashBoundaryDash []byte // "--boundary--"
-	dashBoundary     []byte // "--boundary"
-}
-
-// NextPart returns the next part in the multipart or an error.
-// When there are no more parts, the error io.EOF is returned.
-func (r *Reader) NextPart() (*Part, error) {
-	if r.currentPart != nil {
-		r.currentPart.Close()
-	}
-
-	expectNewPart := false
-	for {
-		line, err := r.bufReader.ReadSlice('\n')
-		if err == io.EOF && r.isFinalBoundary(line) {
-			// If the buffer ends in "--boundary--" without the
-			// trailing "\r\n", ReadSlice will return an error
-			// (since it's missing the '\n'), but this is a valid
-			// multipart EOF so we need to return io.EOF instead of
-			// a fmt-wrapped one.
-			return nil, io.EOF
-		}
-		if err != nil {
-			return nil, fmt.Errorf("multipart: NextPart: %v", err)
-		}
-
-		if r.isBoundaryDelimiterLine(line) {
-			r.partsRead++
-			bp, err := newPart(r)
-			if err != nil {
-				return nil, err
-			}
-			r.currentPart = bp
-			return bp, nil
-		}
-
-		if r.isFinalBoundary(line) {
-			// Expected EOF
-			return nil, io.EOF
-		}
-
-		if expectNewPart {
-			return nil, fmt.Errorf("multipart: expecting a new Part; got line %q", string(line))
-		}
-
-		if r.partsRead == 0 {
-			// skip line
-			continue
-		}
-
-		// Consume the "\n" or "\r\n" separator between the
-		// body of the previous part and the boundary line we
-		// now expect will follow. (either a new part or the
-		// end boundary)
-		if bytes.Equal(line, r.nl) {
-			expectNewPart = true
-			continue
-		}
-
-		return nil, fmt.Errorf("multipart: unexpected line in Next(): %q", line)
-	}
-}
-
-// isFinalBoundary reports whether line is the final boundary line
-// indicating that all parts are over.
-// It matches `^--boundary--[ \t]*(\r\n)?$`
-func (mr *Reader) isFinalBoundary(line []byte) bool {
-	if !bytes.HasPrefix(line, mr.dashBoundaryDash) {
-		return false
-	}
-	rest := line[len(mr.dashBoundaryDash):]
-	rest = skipLWSPChar(rest)
-	return len(rest) == 0 || bytes.Equal(rest, mr.nl)
-}
-
-func (mr *Reader) isBoundaryDelimiterLine(line []byte) (ret bool) {
-	// http://tools.ietf.org/html/rfc2046#section-5.1
-	//   The boundary delimiter line is then defined as a line
-	//   consisting entirely of two hyphen characters ("-",
-	//   decimal value 45) followed by the boundary parameter
-	//   value from the Content-Type header field, optional linear
-	//   whitespace, and a terminating CRLF.
-	if !bytes.HasPrefix(line, mr.dashBoundary) {
-		return false
-	}
-	rest := line[len(mr.dashBoundary):]
-	rest = skipLWSPChar(rest)
-
-	// On the first part, see our lines are ending in \n instead of \r\n
-	// and switch into that mode if so.  This is a violation of the spec,
-	// but occurs in practice.
-	if mr.partsRead == 0 && len(rest) == 1 && rest[0] == '\n' {
-		mr.nl = mr.nl[1:]
-		mr.nlDashBoundary = mr.nlDashBoundary[1:]
-	}
-	return bytes.Equal(rest, mr.nl)
-}
-
-// peekBufferIsEmptyPart reports whether the provided peek-ahead
-// buffer represents an empty part. It is called only if we've not
-// already read any bytes in this part and checks for the case of MIME
-// software not writing the \r\n on empty parts. Some does, some
-// doesn't.
-//
-// This checks that what follows the "--boundary" is actually the end
-// ("--boundary--" with optional whitespace) or optional whitespace
-// and then a newline, so we don't catch "--boundaryFAKE", in which
-// case the whole line is part of the data.
-func (mr *Reader) peekBufferIsEmptyPart(peek []byte) bool {
-	// End of parts case.
-	// Test whether peek matches `^--boundary--[ \t]*(?:\r\n|$)`
-	if bytes.HasPrefix(peek, mr.dashBoundaryDash) {
-		rest := peek[len(mr.dashBoundaryDash):]
-		rest = skipLWSPChar(rest)
-		return bytes.HasPrefix(rest, mr.nl) || len(rest) == 0
-	}
-	if !bytes.HasPrefix(peek, mr.dashBoundary) {
-		return false
-	}
-	// Test whether rest matches `^[ \t]*\r\n`)
-	rest := peek[len(mr.dashBoundary):]
-	rest = skipLWSPChar(rest)
-	return bytes.HasPrefix(rest, mr.nl)
-}
-
-// peekBufferSeparatorIndex returns the index of mr.nlDashBoundary in
-// peek and whether it is a real boundary (and not a prefix of an
-// unrelated separator). To be the end, the peek buffer must contain a
-// newline after the boundary.
-func (mr *Reader) peekBufferSeparatorIndex(peek []byte) (idx int, isEnd bool) {
-	idx = bytes.Index(peek, mr.nlDashBoundary)
-	if idx == -1 {
-		return
-	}
-	peek = peek[idx+len(mr.nlDashBoundary):]
-	if len(peek) > 1 && peek[0] == '-' && peek[1] == '-' {
-		return idx, true
-	}
-	peek = skipLWSPChar(peek)
-	// Don't have a complete line after the peek.
-	if bytes.IndexByte(peek, '\n') == -1 {
-		return -1, false
-	}
-	if len(peek) > 0 && peek[0] == '\n' {
-		return idx, true
-	}
-	if len(peek) > 1 && peek[0] == '\r' && peek[1] == '\n' {
-		return idx, true
-	}
-	return idx, false
-}
-
-// skipLWSPChar returns b with leading spaces and tabs removed.
-// RFC 822 defines:
-//    LWSP-char = SPACE / HTAB
-func skipLWSPChar(b []byte) []byte {
-	for len(b) > 0 && (b[0] == ' ' || b[0] == '\t') {
-		b = b[1:]
-	}
-	return b
-}
diff --git a/third_party/gofrontend/libgo/go/mime/multipart/multipart_test.go b/third_party/gofrontend/libgo/go/mime/multipart/multipart_test.go
deleted file mode 100644
index 30452d1..0000000
--- a/third_party/gofrontend/libgo/go/mime/multipart/multipart_test.go
+++ /dev/null
@@ -1,686 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package multipart
-
-import (
-	"bytes"
-	"encoding/json"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net/textproto"
-	"os"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-func TestBoundaryLine(t *testing.T) {
-	mr := NewReader(strings.NewReader(""), "myBoundary")
-	if !mr.isBoundaryDelimiterLine([]byte("--myBoundary\r\n")) {
-		t.Error("expected")
-	}
-	if !mr.isBoundaryDelimiterLine([]byte("--myBoundary \r\n")) {
-		t.Error("expected")
-	}
-	if !mr.isBoundaryDelimiterLine([]byte("--myBoundary \n")) {
-		t.Error("expected")
-	}
-	if mr.isBoundaryDelimiterLine([]byte("--myBoundary bogus \n")) {
-		t.Error("expected fail")
-	}
-	if mr.isBoundaryDelimiterLine([]byte("--myBoundary bogus--")) {
-		t.Error("expected fail")
-	}
-}
-
-func escapeString(v string) string {
-	bytes, _ := json.Marshal(v)
-	return string(bytes)
-}
-
-func expectEq(t *testing.T, expected, actual, what string) {
-	if expected == actual {
-		return
-	}
-	t.Errorf("Unexpected value for %s; got %s (len %d) but expected: %s (len %d)",
-		what, escapeString(actual), len(actual), escapeString(expected), len(expected))
-}
-
-func TestNameAccessors(t *testing.T) {
-	tests := [...][3]string{
-		{`form-data; name="foo"`, "foo", ""},
-		{` form-data ; name=foo`, "foo", ""},
-		{`FORM-DATA;name="foo"`, "foo", ""},
-		{` FORM-DATA ; name="foo"`, "foo", ""},
-		{` FORM-DATA ; name="foo"`, "foo", ""},
-		{` FORM-DATA ; name=foo`, "foo", ""},
-		{` FORM-DATA ; filename="foo.txt"; name=foo; baz=quux`, "foo", "foo.txt"},
-		{` not-form-data ; filename="bar.txt"; name=foo; baz=quux`, "", "bar.txt"},
-	}
-	for i, test := range tests {
-		p := &Part{Header: make(map[string][]string)}
-		p.Header.Set("Content-Disposition", test[0])
-		if g, e := p.FormName(), test[1]; g != e {
-			t.Errorf("test %d: FormName() = %q; want %q", i, g, e)
-		}
-		if g, e := p.FileName(), test[2]; g != e {
-			t.Errorf("test %d: FileName() = %q; want %q", i, g, e)
-		}
-	}
-}
-
-var longLine = strings.Repeat("\n\n\r\r\r\n\r\000", (1<<20)/8)
-
-func testMultipartBody(sep string) string {
-	testBody := `
-This is a multi-part message.  This line is ignored.
---MyBoundary
-Header1: value1
-HEADER2: value2
-foo-bar: baz
-
-My value
-The end.
---MyBoundary
-name: bigsection
-
-[longline]
---MyBoundary
-Header1: value1b
-HEADER2: value2b
-foo-bar: bazb
-
-Line 1
-Line 2
-Line 3 ends in a newline, but just one.
-
---MyBoundary
-
-never read data
---MyBoundary--
-
-
-useless trailer
-`
-	testBody = strings.Replace(testBody, "\n", sep, -1)
-	return strings.Replace(testBody, "[longline]", longLine, 1)
-}
-
-func TestMultipart(t *testing.T) {
-	bodyReader := strings.NewReader(testMultipartBody("\r\n"))
-	testMultipart(t, bodyReader, false)
-}
-
-func TestMultipartOnlyNewlines(t *testing.T) {
-	bodyReader := strings.NewReader(testMultipartBody("\n"))
-	testMultipart(t, bodyReader, true)
-}
-
-func TestMultipartSlowInput(t *testing.T) {
-	bodyReader := strings.NewReader(testMultipartBody("\r\n"))
-	testMultipart(t, &slowReader{bodyReader}, false)
-}
-
-func testMultipart(t *testing.T, r io.Reader, onlyNewlines bool) {
-	reader := NewReader(r, "MyBoundary")
-	buf := new(bytes.Buffer)
-
-	// Part1
-	part, err := reader.NextPart()
-	if part == nil || err != nil {
-		t.Error("Expected part1")
-		return
-	}
-	if x := part.Header.Get("Header1"); x != "value1" {
-		t.Errorf("part.Header.Get(%q) = %q, want %q", "Header1", x, "value1")
-	}
-	if x := part.Header.Get("foo-bar"); x != "baz" {
-		t.Errorf("part.Header.Get(%q) = %q, want %q", "foo-bar", x, "baz")
-	}
-	if x := part.Header.Get("Foo-Bar"); x != "baz" {
-		t.Errorf("part.Header.Get(%q) = %q, want %q", "Foo-Bar", x, "baz")
-	}
-	buf.Reset()
-	if _, err := io.Copy(buf, part); err != nil {
-		t.Errorf("part 1 copy: %v", err)
-	}
-
-	adjustNewlines := func(s string) string {
-		if onlyNewlines {
-			return strings.Replace(s, "\r\n", "\n", -1)
-		}
-		return s
-	}
-
-	expectEq(t, adjustNewlines("My value\r\nThe end."), buf.String(), "Value of first part")
-
-	// Part2
-	part, err = reader.NextPart()
-	if err != nil {
-		t.Fatalf("Expected part2; got: %v", err)
-		return
-	}
-	if e, g := "bigsection", part.Header.Get("name"); e != g {
-		t.Errorf("part2's name header: expected %q, got %q", e, g)
-	}
-	buf.Reset()
-	if _, err := io.Copy(buf, part); err != nil {
-		t.Errorf("part 2 copy: %v", err)
-	}
-	s := buf.String()
-	if len(s) != len(longLine) {
-		t.Errorf("part2 body expected long line of length %d; got length %d",
-			len(longLine), len(s))
-	}
-	if s != longLine {
-		t.Errorf("part2 long body didn't match")
-	}
-
-	// Part3
-	part, err = reader.NextPart()
-	if part == nil || err != nil {
-		t.Error("Expected part3")
-		return
-	}
-	if part.Header.Get("foo-bar") != "bazb" {
-		t.Error("Expected foo-bar: bazb")
-	}
-	buf.Reset()
-	if _, err := io.Copy(buf, part); err != nil {
-		t.Errorf("part 3 copy: %v", err)
-	}
-	expectEq(t, adjustNewlines("Line 1\r\nLine 2\r\nLine 3 ends in a newline, but just one.\r\n"),
-		buf.String(), "body of part 3")
-
-	// Part4
-	part, err = reader.NextPart()
-	if part == nil || err != nil {
-		t.Error("Expected part 4 without errors")
-		return
-	}
-
-	// Non-existent part5
-	part, err = reader.NextPart()
-	if part != nil {
-		t.Error("Didn't expect a fifth part.")
-	}
-	if err != io.EOF {
-		t.Errorf("On fifth part expected io.EOF; got %v", err)
-	}
-}
-
-func TestVariousTextLineEndings(t *testing.T) {
-	tests := [...]string{
-		"Foo\nBar",
-		"Foo\nBar\n",
-		"Foo\r\nBar",
-		"Foo\r\nBar\r\n",
-		"Foo\rBar",
-		"Foo\rBar\r",
-		"\x00\x01\x02\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10",
-	}
-
-	for testNum, expectedBody := range tests {
-		body := "--BOUNDARY\r\n" +
-			"Content-Disposition: form-data; name=\"value\"\r\n" +
-			"\r\n" +
-			expectedBody +
-			"\r\n--BOUNDARY--\r\n"
-		bodyReader := strings.NewReader(body)
-
-		reader := NewReader(bodyReader, "BOUNDARY")
-		buf := new(bytes.Buffer)
-		part, err := reader.NextPart()
-		if part == nil {
-			t.Errorf("Expected a body part on text %d", testNum)
-			continue
-		}
-		if err != nil {
-			t.Errorf("Unexpected error on text %d: %v", testNum, err)
-			continue
-		}
-		written, err := io.Copy(buf, part)
-		expectEq(t, expectedBody, buf.String(), fmt.Sprintf("test %d", testNum))
-		if err != nil {
-			t.Errorf("Error copying multipart; bytes=%v, error=%v", written, err)
-		}
-
-		part, err = reader.NextPart()
-		if part != nil {
-			t.Errorf("Unexpected part in test %d", testNum)
-		}
-		if err != io.EOF {
-			t.Errorf("On test %d expected io.EOF; got %v", testNum, err)
-		}
-
-	}
-}
-
-type maliciousReader struct {
-	t *testing.T
-	n int
-}
-
-const maxReadThreshold = 1 << 20
-
-func (mr *maliciousReader) Read(b []byte) (n int, err error) {
-	mr.n += len(b)
-	if mr.n >= maxReadThreshold {
-		mr.t.Fatal("too much was read")
-		return 0, io.EOF
-	}
-	return len(b), nil
-}
-
-func TestLineLimit(t *testing.T) {
-	mr := &maliciousReader{t: t}
-	r := NewReader(mr, "fooBoundary")
-	part, err := r.NextPart()
-	if part != nil {
-		t.Errorf("unexpected part read")
-	}
-	if err == nil {
-		t.Errorf("expected an error")
-	}
-	if mr.n >= maxReadThreshold {
-		t.Errorf("expected to read < %d bytes; read %d", maxReadThreshold, mr.n)
-	}
-}
-
-func TestMultipartTruncated(t *testing.T) {
-	testBody := `
-This is a multi-part message.  This line is ignored.
---MyBoundary
-foo-bar: baz
-
-Oh no, premature EOF!
-`
-	body := strings.Replace(testBody, "\n", "\r\n", -1)
-	bodyReader := strings.NewReader(body)
-	r := NewReader(bodyReader, "MyBoundary")
-
-	part, err := r.NextPart()
-	if err != nil {
-		t.Fatalf("didn't get a part")
-	}
-	_, err = io.Copy(ioutil.Discard, part)
-	if err != io.ErrUnexpectedEOF {
-		t.Fatalf("expected error io.ErrUnexpectedEOF; got %v", err)
-	}
-}
-
-type slowReader struct {
-	r io.Reader
-}
-
-func (s *slowReader) Read(p []byte) (int, error) {
-	if len(p) == 0 {
-		return s.r.Read(p)
-	}
-	return s.r.Read(p[:1])
-}
-
-func TestLineContinuation(t *testing.T) {
-	// This body, extracted from an email, contains headers that span multiple
-	// lines.
-
-	// TODO: The original mail ended with a double-newline before the
-	// final delimiter; this was manually edited to use a CRLF.
-	testBody :=
-		"\n--Apple-Mail-2-292336769\nContent-Transfer-Encoding: 7bit\nContent-Type: text/plain;\n\tcharset=US-ASCII;\n\tdelsp=yes;\n\tformat=flowed\n\nI'm finding the same thing happening on my system (10.4.1).\n\n\n--Apple-Mail-2-292336769\nContent-Transfer-Encoding: quoted-printable\nContent-Type: text/html;\n\tcharset=ISO-8859-1\n\n<HTML><BODY>I'm finding the same thing =\nhappening on my system (10.4.1).=A0 But I built it with XCode =\n2.0.</BODY></=\nHTML>=\n\r\n--Apple-Mail-2-292336769--\n"
-
-	r := NewReader(strings.NewReader(testBody), "Apple-Mail-2-292336769")
-
-	for i := 0; i < 2; i++ {
-		part, err := r.NextPart()
-		if err != nil {
-			t.Fatalf("didn't get a part")
-		}
-		var buf bytes.Buffer
-		n, err := io.Copy(&buf, part)
-		if err != nil {
-			t.Errorf("error reading part: %v\nread so far: %q", err, buf.String())
-		}
-		if n <= 0 {
-			t.Errorf("read %d bytes; expected >0", n)
-		}
-	}
-}
-
-func TestQuotedPrintableEncoding(t *testing.T) {
-	// From https://golang.org/issue/4411
-	body := "--0016e68ee29c5d515f04cedf6733\r\nContent-Type: text/plain; charset=ISO-8859-1\r\nContent-Disposition: form-data; name=text\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nwords words words words words words words words words words words words wor=\r\nds words words words words words words words words words words words words =\r\nwords words words words words words words words words words words words wor=\r\nds words words words words words words words words words words words words =\r\nwords words words words words words words words words\r\n--0016e68ee29c5d515f04cedf6733\r\nContent-Type: text/plain; charset=ISO-8859-1\r\nContent-Disposition: form-data; name=submit\r\n\r\nSubmit\r\n--0016e68ee29c5d515f04cedf6733--"
-	r := NewReader(strings.NewReader(body), "0016e68ee29c5d515f04cedf6733")
-	part, err := r.NextPart()
-	if err != nil {
-		t.Fatal(err)
-	}
-	if te, ok := part.Header["Content-Transfer-Encoding"]; ok {
-		t.Errorf("unexpected Content-Transfer-Encoding of %q", te)
-	}
-	var buf bytes.Buffer
-	_, err = io.Copy(&buf, part)
-	if err != nil {
-		t.Error(err)
-	}
-	got := buf.String()
-	want := "words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words words"
-	if got != want {
-		t.Errorf("wrong part value:\n got: %q\nwant: %q", got, want)
-	}
-}
-
-// Test parsing an image attachment from gmail, which previously failed.
-func TestNested(t *testing.T) {
-	// nested-mime is the body part of a multipart/mixed email
-	// with boundary e89a8ff1c1e83553e304be640612
-	f, err := os.Open("testdata/nested-mime")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer f.Close()
-	mr := NewReader(f, "e89a8ff1c1e83553e304be640612")
-	p, err := mr.NextPart()
-	if err != nil {
-		t.Fatalf("error reading first section (alternative): %v", err)
-	}
-
-	// Read the inner text/plain and text/html sections of the multipart/alternative.
-	mr2 := NewReader(p, "e89a8ff1c1e83553e004be640610")
-	p, err = mr2.NextPart()
-	if err != nil {
-		t.Fatalf("reading text/plain part: %v", err)
-	}
-	if b, err := ioutil.ReadAll(p); string(b) != "*body*\r\n" || err != nil {
-		t.Fatalf("reading text/plain part: got %q, %v", b, err)
-	}
-	p, err = mr2.NextPart()
-	if err != nil {
-		t.Fatalf("reading text/html part: %v", err)
-	}
-	if b, err := ioutil.ReadAll(p); string(b) != "<b>body</b>\r\n" || err != nil {
-		t.Fatalf("reading text/html part: got %q, %v", b, err)
-	}
-
-	p, err = mr2.NextPart()
-	if err != io.EOF {
-		t.Fatalf("final inner NextPart = %v; want io.EOF", err)
-	}
-
-	// Back to the outer multipart/mixed, reading the image attachment.
-	_, err = mr.NextPart()
-	if err != nil {
-		t.Fatalf("error reading the image attachment at the end: %v", err)
-	}
-
-	_, err = mr.NextPart()
-	if err != io.EOF {
-		t.Fatalf("final outer NextPart = %v; want io.EOF", err)
-	}
-}
-
-type headerBody struct {
-	header textproto.MIMEHeader
-	body   string
-}
-
-func formData(key, value string) headerBody {
-	return headerBody{
-		textproto.MIMEHeader{
-			"Content-Type":        {"text/plain; charset=ISO-8859-1"},
-			"Content-Disposition": {"form-data; name=" + key},
-		},
-		value,
-	}
-}
-
-type parseTest struct {
-	name    string
-	in, sep string
-	want    []headerBody
-}
-
-var parseTests = []parseTest{
-	// Actual body from App Engine on a blob upload. The final part (the
-	// Content-Type: message/external-body) is what App Engine replaces
-	// the uploaded file with.  The other form fields (prefixed with
-	// "other" in their form-data name) are unchanged.  A bug was
-	// reported with blob uploads failing when the other fields were
-	// empty. This was the MIME POST body that previously failed.
-	{
-		name: "App Engine post",
-		sep:  "00151757727e9583fd04bfbca4c6",
-		in:   "--00151757727e9583fd04bfbca4c6\r\nContent-Type: text/plain; charset=ISO-8859-1\r\nContent-Disposition: form-data; name=otherEmpty1\r\n\r\n--00151757727e9583fd04bfbca4c6\r\nContent-Type: text/plain; charset=ISO-8859-1\r\nContent-Disposition: form-data; name=otherFoo1\r\n\r\nfoo\r\n--00151757727e9583fd04bfbca4c6\r\nContent-Type: text/plain; charset=ISO-8859-1\r\nContent-Disposition: form-data; name=otherFoo2\r\n\r\nfoo\r\n--00151757727e9583fd04bfbca4c6\r\nContent-Type: text/plain; charset=ISO-8859-1\r\nContent-Disposition: form-data; name=otherEmpty2\r\n\r\n--00151757727e9583fd04bfbca4c6\r\nContent-Type: text/plain; charset=ISO-8859-1\r\nContent-Disposition: form-data; name=otherRepeatFoo\r\n\r\nfoo\r\n--00151757727e9583fd04bfbca4c6\r\nContent-Type: text/plain; charset=ISO-8859-1\r\nContent-Disposition: form-data; name=otherRepeatFoo\r\n\r\nfoo\r\n--00151757727e9583fd04bfbca4c6\r\nContent-Type: text/plain; charset=ISO-8859-1\r\nContent-Disposition: form-data; name=otherRepeatEmpty\r\n\r\n--00151757727e9583fd04bfbca4c6\r\nContent-Type: text/plain; charset=ISO-8859-1\r\nContent-Disposition: form-data; name=otherRepeatEmpty\r\n\r\n--00151757727e9583fd04bfbca4c6\r\nContent-Type: text/plain; charset=ISO-8859-1\r\nContent-Disposition: form-data; name=submit\r\n\r\nSubmit\r\n--00151757727e9583fd04bfbca4c6\r\nContent-Type: message/external-body; charset=ISO-8859-1; blob-key=AHAZQqG84qllx7HUqO_oou5EvdYQNS3Mbbkb0RjjBoM_Kc1UqEN2ygDxWiyCPulIhpHRPx-VbpB6RX4MrsqhWAi_ZxJ48O9P2cTIACbvATHvg7IgbvZytyGMpL7xO1tlIvgwcM47JNfv_tGhy1XwyEUO8oldjPqg5Q\r\nContent-Disposition: form-data; name=file; filename=\"fall.png\"\r\n\r\nContent-Type: image/png\r\nContent-Length: 232303\r\nX-AppEngine-Upload-Creation: 2012-05-10 23:14:02.715173\r\nContent-MD5: MzRjODU1ZDZhZGU1NmRlOWEwZmMwMDdlODBmZTA0NzA=\r\nContent-Disposition: form-data; name=file; filename=\"fall.png\"\r\n\r\n\r\n--00151757727e9583fd04bfbca4c6--",
-		want: []headerBody{
-			formData("otherEmpty1", ""),
-			formData("otherFoo1", "foo"),
-			formData("otherFoo2", "foo"),
-			formData("otherEmpty2", ""),
-			formData("otherRepeatFoo", "foo"),
-			formData("otherRepeatFoo", "foo"),
-			formData("otherRepeatEmpty", ""),
-			formData("otherRepeatEmpty", ""),
-			formData("submit", "Submit"),
-			{textproto.MIMEHeader{
-				"Content-Type":        {"message/external-body; charset=ISO-8859-1; blob-key=AHAZQqG84qllx7HUqO_oou5EvdYQNS3Mbbkb0RjjBoM_Kc1UqEN2ygDxWiyCPulIhpHRPx-VbpB6RX4MrsqhWAi_ZxJ48O9P2cTIACbvATHvg7IgbvZytyGMpL7xO1tlIvgwcM47JNfv_tGhy1XwyEUO8oldjPqg5Q"},
-				"Content-Disposition": {"form-data; name=file; filename=\"fall.png\""},
-			}, "Content-Type: image/png\r\nContent-Length: 232303\r\nX-AppEngine-Upload-Creation: 2012-05-10 23:14:02.715173\r\nContent-MD5: MzRjODU1ZDZhZGU1NmRlOWEwZmMwMDdlODBmZTA0NzA=\r\nContent-Disposition: form-data; name=file; filename=\"fall.png\"\r\n\r\n"},
-		},
-	},
-
-	// Single empty part, ended with --boundary immediately after headers.
-	{
-		name: "single empty part, --boundary",
-		sep:  "abc",
-		in:   "--abc\r\nFoo: bar\r\n\r\n--abc--",
-		want: []headerBody{
-			{textproto.MIMEHeader{"Foo": {"bar"}}, ""},
-		},
-	},
-
-	// Single empty part, ended with \r\n--boundary immediately after headers.
-	{
-		name: "single empty part, \r\n--boundary",
-		sep:  "abc",
-		in:   "--abc\r\nFoo: bar\r\n\r\n\r\n--abc--",
-		want: []headerBody{
-			{textproto.MIMEHeader{"Foo": {"bar"}}, ""},
-		},
-	},
-
-	// Final part empty.
-	{
-		name: "final part empty",
-		sep:  "abc",
-		in:   "--abc\r\nFoo: bar\r\n\r\n--abc\r\nFoo2: bar2\r\n\r\n--abc--",
-		want: []headerBody{
-			{textproto.MIMEHeader{"Foo": {"bar"}}, ""},
-			{textproto.MIMEHeader{"Foo2": {"bar2"}}, ""},
-		},
-	},
-
-	// Final part empty with newlines after final separator.
-	{
-		name: "final part empty then crlf",
-		sep:  "abc",
-		in:   "--abc\r\nFoo: bar\r\n\r\n--abc--\r\n",
-		want: []headerBody{
-			{textproto.MIMEHeader{"Foo": {"bar"}}, ""},
-		},
-	},
-
-	// Final part empty with lwsp-chars after final separator.
-	{
-		name: "final part empty then lwsp",
-		sep:  "abc",
-		in:   "--abc\r\nFoo: bar\r\n\r\n--abc-- \t",
-		want: []headerBody{
-			{textproto.MIMEHeader{"Foo": {"bar"}}, ""},
-		},
-	},
-
-	// No parts (empty form as submitted by Chrome)
-	{
-		name: "no parts",
-		sep:  "----WebKitFormBoundaryQfEAfzFOiSemeHfA",
-		in:   "------WebKitFormBoundaryQfEAfzFOiSemeHfA--\r\n",
-		want: []headerBody{},
-	},
-
-	// Part containing data starting with the boundary, but with additional suffix.
-	{
-		name: "fake separator as data",
-		sep:  "sep",
-		in:   "--sep\r\nFoo: bar\r\n\r\n--sepFAKE\r\n--sep--",
-		want: []headerBody{
-			{textproto.MIMEHeader{"Foo": {"bar"}}, "--sepFAKE"},
-		},
-	},
-
-	// Part containing a boundary with whitespace following it.
-	{
-		name: "boundary with whitespace",
-		sep:  "sep",
-		in:   "--sep \r\nFoo: bar\r\n\r\ntext\r\n--sep--",
-		want: []headerBody{
-			{textproto.MIMEHeader{"Foo": {"bar"}}, "text"},
-		},
-	},
-
-	// With ignored leading line.
-	{
-		name: "leading line",
-		sep:  "MyBoundary",
-		in: strings.Replace(`This is a multi-part message.  This line is ignored.
---MyBoundary
-foo: bar
-
-
---MyBoundary--`, "\n", "\r\n", -1),
-		want: []headerBody{
-			{textproto.MIMEHeader{"Foo": {"bar"}}, ""},
-		},
-	},
-
-	// Issue 10616; minimal
-	{
-		name: "issue 10616 minimal",
-		sep:  "sep",
-		in: "--sep \r\nFoo: bar\r\n\r\n" +
-			"a\r\n" +
-			"--sep_alt\r\n" +
-			"b\r\n" +
-			"\r\n--sep--",
-		want: []headerBody{
-			{textproto.MIMEHeader{"Foo": {"bar"}}, "a\r\n--sep_alt\r\nb\r\n"},
-		},
-	},
-
-	// Issue 10616; full example from bug.
-	{
-		name: "nested separator prefix is outer separator",
-		sep:  "----=_NextPart_4c2fbafd7ec4c8bf08034fe724b608d9",
-		in: strings.Replace(`------=_NextPart_4c2fbafd7ec4c8bf08034fe724b608d9
-Content-Type: multipart/alternative; boundary="----=_NextPart_4c2fbafd7ec4c8bf08034fe724b608d9_alt"
-
-------=_NextPart_4c2fbafd7ec4c8bf08034fe724b608d9_alt
-Content-Type: text/plain; charset="utf-8"
-Content-Transfer-Encoding: 8bit
-
-This is a multi-part message in MIME format.
-
-------=_NextPart_4c2fbafd7ec4c8bf08034fe724b608d9_alt
-Content-Type: text/html; charset="utf-8"
-Content-Transfer-Encoding: 8bit
-
-html things
-------=_NextPart_4c2fbafd7ec4c8bf08034fe724b608d9_alt--
-------=_NextPart_4c2fbafd7ec4c8bf08034fe724b608d9--`, "\n", "\r\n", -1),
-		want: []headerBody{
-			{textproto.MIMEHeader{"Content-Type": {`multipart/alternative; boundary="----=_NextPart_4c2fbafd7ec4c8bf08034fe724b608d9_alt"`}},
-				strings.Replace(`------=_NextPart_4c2fbafd7ec4c8bf08034fe724b608d9_alt
-Content-Type: text/plain; charset="utf-8"
-Content-Transfer-Encoding: 8bit
-
-This is a multi-part message in MIME format.
-
-------=_NextPart_4c2fbafd7ec4c8bf08034fe724b608d9_alt
-Content-Type: text/html; charset="utf-8"
-Content-Transfer-Encoding: 8bit
-
-html things
-------=_NextPart_4c2fbafd7ec4c8bf08034fe724b608d9_alt--`, "\n", "\r\n", -1),
-			},
-		},
-	},
-
-	roundTripParseTest(),
-}
-
-func TestParse(t *testing.T) {
-Cases:
-	for _, tt := range parseTests {
-		r := NewReader(strings.NewReader(tt.in), tt.sep)
-		got := []headerBody{}
-		for {
-			p, err := r.NextPart()
-			if err == io.EOF {
-				break
-			}
-			if err != nil {
-				t.Errorf("in test %q, NextPart: %v", tt.name, err)
-				continue Cases
-			}
-			pbody, err := ioutil.ReadAll(p)
-			if err != nil {
-				t.Errorf("in test %q, error reading part: %v", tt.name, err)
-				continue Cases
-			}
-			got = append(got, headerBody{p.Header, string(pbody)})
-		}
-		if !reflect.DeepEqual(tt.want, got) {
-			t.Errorf("test %q:\n got: %v\nwant: %v", tt.name, got, tt.want)
-			if len(tt.want) != len(got) {
-				t.Errorf("test %q: got %d parts, want %d", tt.name, len(got), len(tt.want))
-			} else if len(got) > 1 {
-				for pi, wantPart := range tt.want {
-					if !reflect.DeepEqual(wantPart, got[pi]) {
-						t.Errorf("test %q, part %d:\n got: %v\nwant: %v", tt.name, pi, got[pi], wantPart)
-					}
-				}
-			}
-		}
-	}
-}
-
-func roundTripParseTest() parseTest {
-	t := parseTest{
-		name: "round trip",
-		want: []headerBody{
-			formData("empty", ""),
-			formData("lf", "\n"),
-			formData("cr", "\r"),
-			formData("crlf", "\r\n"),
-			formData("foo", "bar"),
-		},
-	}
-	var buf bytes.Buffer
-	w := NewWriter(&buf)
-	for _, p := range t.want {
-		pw, err := w.CreatePart(p.header)
-		if err != nil {
-			panic(err)
-		}
-		_, err = pw.Write([]byte(p.body))
-		if err != nil {
-			panic(err)
-		}
-	}
-	w.Close()
-	t.in = buf.String()
-	t.sep = w.Boundary()
-	return t
-}
diff --git a/third_party/gofrontend/libgo/go/mime/multipart/testdata/nested-mime b/third_party/gofrontend/libgo/go/mime/multipart/testdata/nested-mime
deleted file mode 100644
index 71c238e..0000000
--- a/third_party/gofrontend/libgo/go/mime/multipart/testdata/nested-mime
+++ /dev/null
@@ -1,29 +0,0 @@
---e89a8ff1c1e83553e304be640612

-Content-Type: multipart/alternative; boundary=e89a8ff1c1e83553e004be640610

-

---e89a8ff1c1e83553e004be640610

-Content-Type: text/plain; charset=UTF-8

-

-*body*

-

---e89a8ff1c1e83553e004be640610

-Content-Type: text/html; charset=UTF-8

-

-<b>body</b>

-

---e89a8ff1c1e83553e004be640610--

---e89a8ff1c1e83553e304be640612

-Content-Type: image/png; name="x.png"

-Content-Disposition: attachment; 

-	filename="x.png"

-Content-Transfer-Encoding: base64

-X-Attachment-Id: f_h1edgigu0

-

-iVBORw0KGgoAAAANSUhEUgAAAagAAADrCAIAAACza5XhAAAKMWlDQ1BJQ0MgUHJvZmlsZQAASImd

-lndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUB

-8b2kqeGaj4aTNftesu5mob4pr07ecMywRwLBvDCJOksqlUyldAZD7g9fxIZRWWPMvXRNJROJRBIG

-Y7Vx0mva1HAwYqibdKONXye3dW4iUonhWFJnqK7OaanU1gGkErFYEgaj0cg8wK+zVPh2ziwnHy07

-U8lYTNapezSzOuevRwLB7CFkqQQCwaJDiBQIBIJFhwh8AoFg0SHUqQUCASRJKkwkhMy/JfODWPEJ

-BIJFhwh8AoFg0TFnQqQ55GtPFopcJsN97e1nYtNuIBYeGBgYCmYrmE3jZ05iaGAoMX0xzxkWz6Hv

-yO7WvrlwzA0uLzrD+VkKqViwl9IfTBVNFMyc/x9alloiPPlqhQAAAABJRU5ErkJggg==

---e89a8ff1c1e83553e304be640612--

diff --git a/third_party/gofrontend/libgo/go/mime/multipart/writer.go b/third_party/gofrontend/libgo/go/mime/multipart/writer.go
deleted file mode 100644
index 8096093..0000000
--- a/third_party/gofrontend/libgo/go/mime/multipart/writer.go
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package multipart
-
-import (
-	"bytes"
-	"crypto/rand"
-	"errors"
-	"fmt"
-	"io"
-	"net/textproto"
-	"strings"
-)
-
-// A Writer generates multipart messages.
-type Writer struct {
-	w        io.Writer
-	boundary string
-	lastpart *part
-}
-
-// NewWriter returns a new multipart Writer with a random boundary,
-// writing to w.
-func NewWriter(w io.Writer) *Writer {
-	return &Writer{
-		w:        w,
-		boundary: randomBoundary(),
-	}
-}
-
-// Boundary returns the Writer's boundary.
-func (w *Writer) Boundary() string {
-	return w.boundary
-}
-
-// SetBoundary overrides the Writer's default randomly-generated
-// boundary separator with an explicit value.
-//
-// SetBoundary must be called before any parts are created, may only
-// contain certain ASCII characters, and must be non-empty and
-// at most 69 bytes long.
-func (w *Writer) SetBoundary(boundary string) error {
-	if w.lastpart != nil {
-		return errors.New("mime: SetBoundary called after write")
-	}
-	// rfc2046#section-5.1.1
-	if len(boundary) < 1 || len(boundary) > 69 {
-		return errors.New("mime: invalid boundary length")
-	}
-	for _, b := range boundary {
-		if 'A' <= b && b <= 'Z' || 'a' <= b && b <= 'z' || '0' <= b && b <= '9' {
-			continue
-		}
-		switch b {
-		case '\'', '(', ')', '+', '_', ',', '-', '.', '/', ':', '=', '?':
-			continue
-		}
-		return errors.New("mime: invalid boundary character")
-	}
-	w.boundary = boundary
-	return nil
-}
-
-// FormDataContentType returns the Content-Type for an HTTP
-// multipart/form-data with this Writer's Boundary.
-func (w *Writer) FormDataContentType() string {
-	return "multipart/form-data; boundary=" + w.boundary
-}
-
-func randomBoundary() string {
-	var buf [30]byte
-	_, err := io.ReadFull(rand.Reader, buf[:])
-	if err != nil {
-		panic(err)
-	}
-	return fmt.Sprintf("%x", buf[:])
-}
-
-// CreatePart creates a new multipart section with the provided
-// header. The body of the part should be written to the returned
-// Writer. After calling CreatePart, any previous part may no longer
-// be written to.
-func (w *Writer) CreatePart(header textproto.MIMEHeader) (io.Writer, error) {
-	if w.lastpart != nil {
-		if err := w.lastpart.close(); err != nil {
-			return nil, err
-		}
-	}
-	var b bytes.Buffer
-	if w.lastpart != nil {
-		fmt.Fprintf(&b, "\r\n--%s\r\n", w.boundary)
-	} else {
-		fmt.Fprintf(&b, "--%s\r\n", w.boundary)
-	}
-	// TODO(bradfitz): move this to textproto.MimeHeader.Write(w), have it sort
-	// and clean, like http.Header.Write(w) does.
-	for k, vv := range header {
-		for _, v := range vv {
-			fmt.Fprintf(&b, "%s: %s\r\n", k, v)
-		}
-	}
-	fmt.Fprintf(&b, "\r\n")
-	_, err := io.Copy(w.w, &b)
-	if err != nil {
-		return nil, err
-	}
-	p := &part{
-		mw: w,
-	}
-	w.lastpart = p
-	return p, nil
-}
-
-var quoteEscaper = strings.NewReplacer("\\", "\\\\", `"`, "\\\"")
-
-func escapeQuotes(s string) string {
-	return quoteEscaper.Replace(s)
-}
-
-// CreateFormFile is a convenience wrapper around CreatePart. It creates
-// a new form-data header with the provided field name and file name.
-func (w *Writer) CreateFormFile(fieldname, filename string) (io.Writer, error) {
-	h := make(textproto.MIMEHeader)
-	h.Set("Content-Disposition",
-		fmt.Sprintf(`form-data; name="%s"; filename="%s"`,
-			escapeQuotes(fieldname), escapeQuotes(filename)))
-	h.Set("Content-Type", "application/octet-stream")
-	return w.CreatePart(h)
-}
-
-// CreateFormField calls CreatePart with a header using the
-// given field name.
-func (w *Writer) CreateFormField(fieldname string) (io.Writer, error) {
-	h := make(textproto.MIMEHeader)
-	h.Set("Content-Disposition",
-		fmt.Sprintf(`form-data; name="%s"`, escapeQuotes(fieldname)))
-	return w.CreatePart(h)
-}
-
-// WriteField calls CreateFormField and then writes the given value.
-func (w *Writer) WriteField(fieldname, value string) error {
-	p, err := w.CreateFormField(fieldname)
-	if err != nil {
-		return err
-	}
-	_, err = p.Write([]byte(value))
-	return err
-}
-
-// Close finishes the multipart message and writes the trailing
-// boundary end line to the output.
-func (w *Writer) Close() error {
-	if w.lastpart != nil {
-		if err := w.lastpart.close(); err != nil {
-			return err
-		}
-		w.lastpart = nil
-	}
-	_, err := fmt.Fprintf(w.w, "\r\n--%s--\r\n", w.boundary)
-	return err
-}
-
-type part struct {
-	mw     *Writer
-	closed bool
-	we     error // last error that occurred writing
-}
-
-func (p *part) close() error {
-	p.closed = true
-	return p.we
-}
-
-func (p *part) Write(d []byte) (n int, err error) {
-	if p.closed {
-		return 0, errors.New("multipart: can't write to finished part")
-	}
-	n, err = p.mw.w.Write(d)
-	if err != nil {
-		p.we = err
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/mime/multipart/writer_test.go b/third_party/gofrontend/libgo/go/mime/multipart/writer_test.go
deleted file mode 100644
index ba00c97..0000000
--- a/third_party/gofrontend/libgo/go/mime/multipart/writer_test.go
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package multipart
-
-import (
-	"bytes"
-	"io/ioutil"
-	"strings"
-	"testing"
-)
-
-func TestWriter(t *testing.T) {
-	fileContents := []byte("my file contents")
-
-	var b bytes.Buffer
-	w := NewWriter(&b)
-	{
-		part, err := w.CreateFormFile("myfile", "my-file.txt")
-		if err != nil {
-			t.Fatalf("CreateFormFile: %v", err)
-		}
-		part.Write(fileContents)
-		err = w.WriteField("key", "val")
-		if err != nil {
-			t.Fatalf("WriteField: %v", err)
-		}
-		part.Write([]byte("val"))
-		err = w.Close()
-		if err != nil {
-			t.Fatalf("Close: %v", err)
-		}
-		s := b.String()
-		if len(s) == 0 {
-			t.Fatal("String: unexpected empty result")
-		}
-		if s[0] == '\r' || s[0] == '\n' {
-			t.Fatal("String: unexpected newline")
-		}
-	}
-
-	r := NewReader(&b, w.Boundary())
-
-	part, err := r.NextPart()
-	if err != nil {
-		t.Fatalf("part 1: %v", err)
-	}
-	if g, e := part.FormName(), "myfile"; g != e {
-		t.Errorf("part 1: want form name %q, got %q", e, g)
-	}
-	slurp, err := ioutil.ReadAll(part)
-	if err != nil {
-		t.Fatalf("part 1: ReadAll: %v", err)
-	}
-	if e, g := string(fileContents), string(slurp); e != g {
-		t.Errorf("part 1: want contents %q, got %q", e, g)
-	}
-
-	part, err = r.NextPart()
-	if err != nil {
-		t.Fatalf("part 2: %v", err)
-	}
-	if g, e := part.FormName(), "key"; g != e {
-		t.Errorf("part 2: want form name %q, got %q", e, g)
-	}
-	slurp, err = ioutil.ReadAll(part)
-	if err != nil {
-		t.Fatalf("part 2: ReadAll: %v", err)
-	}
-	if e, g := "val", string(slurp); e != g {
-		t.Errorf("part 2: want contents %q, got %q", e, g)
-	}
-
-	part, err = r.NextPart()
-	if part != nil || err == nil {
-		t.Fatalf("expected end of parts; got %v, %v", part, err)
-	}
-}
-
-func TestWriterSetBoundary(t *testing.T) {
-	var b bytes.Buffer
-	w := NewWriter(&b)
-	tests := []struct {
-		b  string
-		ok bool
-	}{
-		{"abc", true},
-		{"", false},
-		{"ungültig", false},
-		{"!", false},
-		{strings.Repeat("x", 69), true},
-		{strings.Repeat("x", 70), false},
-		{"bad!ascii!", false},
-		{"my-separator", true},
-	}
-	for i, tt := range tests {
-		err := w.SetBoundary(tt.b)
-		got := err == nil
-		if got != tt.ok {
-			t.Errorf("%d. boundary %q = %v (%v); want %v", i, tt.b, got, err, tt.ok)
-		} else if tt.ok {
-			got := w.Boundary()
-			if got != tt.b {
-				t.Errorf("boundary = %q; want %q", got, tt.b)
-			}
-		}
-	}
-	w.Close()
-	if got := b.String(); !strings.Contains(got, "\r\n--my-separator--\r\n") {
-		t.Errorf("expected my-separator in output. got: %q", got)
-	}
-}
-
-func TestWriterBoundaryGoroutines(t *testing.T) {
-	// Verify there's no data race accessing any lazy boundary if it's used by
-	// different goroutines. This was previously broken by
-	// https://codereview.appspot.com/95760043/ and reverted in
-	// https://codereview.appspot.com/117600043/
-	w := NewWriter(ioutil.Discard)
-	done := make(chan int)
-	go func() {
-		w.CreateFormField("foo")
-		done <- 1
-	}()
-	w.Boundary()
-	<-done
-}
diff --git a/third_party/gofrontend/libgo/go/mime/quotedprintable/reader.go b/third_party/gofrontend/libgo/go/mime/quotedprintable/reader.go
deleted file mode 100644
index 3bd6833..0000000
--- a/third_party/gofrontend/libgo/go/mime/quotedprintable/reader.go
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package quotedprintable implements quoted-printable encoding as specified by
-// RFC 2045.
-package quotedprintable
-
-import (
-	"bufio"
-	"bytes"
-	"fmt"
-	"io"
-)
-
-// Reader is a quoted-printable decoder.
-type Reader struct {
-	br   *bufio.Reader
-	rerr error  // last read error
-	line []byte // to be consumed before more of br
-}
-
-// NewReader returns a quoted-printable reader, decoding from r.
-func NewReader(r io.Reader) *Reader {
-	return &Reader{
-		br: bufio.NewReader(r),
-	}
-}
-
-func fromHex(b byte) (byte, error) {
-	switch {
-	case b >= '0' && b <= '9':
-		return b - '0', nil
-	case b >= 'A' && b <= 'F':
-		return b - 'A' + 10, nil
-	// Accept badly encoded bytes.
-	case b >= 'a' && b <= 'f':
-		return b - 'a' + 10, nil
-	}
-	return 0, fmt.Errorf("quotedprintable: invalid hex byte 0x%02x", b)
-}
-
-func readHexByte(v []byte) (b byte, err error) {
-	if len(v) < 2 {
-		return 0, io.ErrUnexpectedEOF
-	}
-	var hb, lb byte
-	if hb, err = fromHex(v[0]); err != nil {
-		return 0, err
-	}
-	if lb, err = fromHex(v[1]); err != nil {
-		return 0, err
-	}
-	return hb<<4 | lb, nil
-}
-
-func isQPDiscardWhitespace(r rune) bool {
-	switch r {
-	case '\n', '\r', ' ', '\t':
-		return true
-	}
-	return false
-}
-
-var (
-	crlf       = []byte("\r\n")
-	lf         = []byte("\n")
-	softSuffix = []byte("=")
-)
-
-// Read reads and decodes quoted-printable data from the underlying reader.
-func (r *Reader) Read(p []byte) (n int, err error) {
-	// Deviations from RFC 2045:
-	// 1. in addition to "=\r\n", "=\n" is also treated as soft line break.
-	// 2. it will pass through a '\r' or '\n' not preceded by '=', consistent
-	//    with other broken QP encoders & decoders.
-	for len(p) > 0 {
-		if len(r.line) == 0 {
-			if r.rerr != nil {
-				return n, r.rerr
-			}
-			r.line, r.rerr = r.br.ReadSlice('\n')
-
-			// Does the line end in CRLF instead of just LF?
-			hasLF := bytes.HasSuffix(r.line, lf)
-			hasCR := bytes.HasSuffix(r.line, crlf)
-			wholeLine := r.line
-			r.line = bytes.TrimRightFunc(wholeLine, isQPDiscardWhitespace)
-			if bytes.HasSuffix(r.line, softSuffix) {
-				rightStripped := wholeLine[len(r.line):]
-				r.line = r.line[:len(r.line)-1]
-				if !bytes.HasPrefix(rightStripped, lf) && !bytes.HasPrefix(rightStripped, crlf) {
-					r.rerr = fmt.Errorf("quotedprintable: invalid bytes after =: %q", rightStripped)
-				}
-			} else if hasLF {
-				if hasCR {
-					r.line = append(r.line, '\r', '\n')
-				} else {
-					r.line = append(r.line, '\n')
-				}
-			}
-			continue
-		}
-		b := r.line[0]
-
-		switch {
-		case b == '=':
-			b, err = readHexByte(r.line[1:])
-			if err != nil {
-				return n, err
-			}
-			r.line = r.line[2:] // 2 of the 3; other 1 is done below
-		case b == '\t' || b == '\r' || b == '\n':
-			break
-		case b < ' ' || b > '~':
-			return n, fmt.Errorf("quotedprintable: invalid unescaped byte 0x%02x in body", b)
-		}
-		p[0] = b
-		p = p[1:]
-		r.line = r.line[1:]
-		n++
-	}
-	return n, nil
-}
diff --git a/third_party/gofrontend/libgo/go/mime/quotedprintable/reader_test.go b/third_party/gofrontend/libgo/go/mime/quotedprintable/reader_test.go
deleted file mode 100644
index e77b261..0000000
--- a/third_party/gofrontend/libgo/go/mime/quotedprintable/reader_test.go
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package quotedprintable
-
-import (
-	"bufio"
-	"bytes"
-	"errors"
-	"flag"
-	"fmt"
-	"io"
-	"os/exec"
-	"regexp"
-	"sort"
-	"strings"
-	"testing"
-	"time"
-)
-
-func TestReader(t *testing.T) {
-	tests := []struct {
-		in, want string
-		err      interface{}
-	}{
-		{in: "", want: ""},
-		{in: "foo bar", want: "foo bar"},
-		{in: "foo bar=3D", want: "foo bar="},
-		{in: "foo bar=3d", want: "foo bar="}, // lax.
-		{in: "foo bar=\n", want: "foo bar"},
-		{in: "foo bar\n", want: "foo bar\n"}, // somewhat lax.
-		{in: "foo bar=0", want: "foo bar", err: io.ErrUnexpectedEOF},
-		{in: "foo bar=0D=0A", want: "foo bar\r\n"},
-		{in: " A B        \r\n C ", want: " A B\r\n C"},
-		{in: " A B =\r\n C ", want: " A B  C"},
-		{in: " A B =\n C ", want: " A B  C"}, // lax. treating LF as CRLF
-		{in: "foo=\nbar", want: "foobar"},
-		{in: "foo\x00bar", want: "foo", err: "quotedprintable: invalid unescaped byte 0x00 in body"},
-		{in: "foo bar\xff", want: "foo bar", err: "quotedprintable: invalid unescaped byte 0xff in body"},
-
-		// Equal sign.
-		{in: "=3D30\n", want: "=30\n"},
-		{in: "=00=FF0=\n", want: "\x00\xff0"},
-
-		// Trailing whitespace
-		{in: "foo  \n", want: "foo\n"},
-		{in: "foo  \n\nfoo =\n\nfoo=20\n\n", want: "foo\n\nfoo \nfoo \n\n"},
-
-		// Tests that we allow bare \n and \r through, despite it being strictly
-		// not permitted per RFC 2045, Section 6.7 Page 22 bullet (4).
-		{in: "foo\nbar", want: "foo\nbar"},
-		{in: "foo\rbar", want: "foo\rbar"},
-		{in: "foo\r\nbar", want: "foo\r\nbar"},
-
-		// Different types of soft line-breaks.
-		{in: "foo=\r\nbar", want: "foobar"},
-		{in: "foo=\nbar", want: "foobar"},
-		{in: "foo=\rbar", want: "foo", err: "quotedprintable: invalid hex byte 0x0d"},
-		{in: "foo=\r\r\r \nbar", want: "foo", err: `quotedprintable: invalid bytes after =: "\r\r\r \n"`},
-
-		// Example from RFC 2045:
-		{in: "Now's the time =\n" + "for all folk to come=\n" + " to the aid of their country.",
-			want: "Now's the time for all folk to come to the aid of their country."},
-	}
-	for _, tt := range tests {
-		var buf bytes.Buffer
-		_, err := io.Copy(&buf, NewReader(strings.NewReader(tt.in)))
-		if got := buf.String(); got != tt.want {
-			t.Errorf("for %q, got %q; want %q", tt.in, got, tt.want)
-		}
-		switch verr := tt.err.(type) {
-		case nil:
-			if err != nil {
-				t.Errorf("for %q, got unexpected error: %v", tt.in, err)
-			}
-		case string:
-			if got := fmt.Sprint(err); got != verr {
-				t.Errorf("for %q, got error %q; want %q", tt.in, got, verr)
-			}
-		case error:
-			if err != verr {
-				t.Errorf("for %q, got error %q; want %q", tt.in, err, verr)
-			}
-		}
-	}
-
-}
-
-func everySequence(base, alpha string, length int, fn func(string)) {
-	if len(base) == length {
-		fn(base)
-		return
-	}
-	for i := 0; i < len(alpha); i++ {
-		everySequence(base+alpha[i:i+1], alpha, length, fn)
-	}
-}
-
-var useQprint = flag.Bool("qprint", false, "Compare against the 'qprint' program.")
-
-var badSoftRx = regexp.MustCompile(`=([^\r\n]+?\n)|([^\r\n]+$)|(\r$)|(\r[^\n]+\n)|( \r\n)`)
-
-func TestExhaustive(t *testing.T) {
-	if *useQprint {
-		_, err := exec.LookPath("qprint")
-		if err != nil {
-			t.Fatalf("Error looking for qprint: %v", err)
-		}
-	}
-
-	var buf bytes.Buffer
-	res := make(map[string]int)
-	everySequence("", "0A \r\n=", 6, func(s string) {
-		if strings.HasSuffix(s, "=") || strings.Contains(s, "==") {
-			return
-		}
-		buf.Reset()
-		_, err := io.Copy(&buf, NewReader(strings.NewReader(s)))
-		if err != nil {
-			errStr := err.Error()
-			if strings.Contains(errStr, "invalid bytes after =:") {
-				errStr = "invalid bytes after ="
-			}
-			res[errStr]++
-			if strings.Contains(errStr, "invalid hex byte ") {
-				if strings.HasSuffix(errStr, "0x20") && (strings.Contains(s, "=0 ") || strings.Contains(s, "=A ") || strings.Contains(s, "= ")) {
-					return
-				}
-				if strings.HasSuffix(errStr, "0x3d") && (strings.Contains(s, "=0=") || strings.Contains(s, "=A=")) {
-					return
-				}
-				if strings.HasSuffix(errStr, "0x0a") || strings.HasSuffix(errStr, "0x0d") {
-					// bunch of cases; since whitespace at the end of a line before \n is removed.
-					return
-				}
-			}
-			if strings.Contains(errStr, "unexpected EOF") {
-				return
-			}
-			if errStr == "invalid bytes after =" && badSoftRx.MatchString(s) {
-				return
-			}
-			t.Errorf("decode(%q) = %v", s, err)
-			return
-		}
-		if *useQprint {
-			cmd := exec.Command("qprint", "-d")
-			cmd.Stdin = strings.NewReader(s)
-			stderr, err := cmd.StderrPipe()
-			if err != nil {
-				panic(err)
-			}
-			qpres := make(chan interface{}, 2)
-			go func() {
-				br := bufio.NewReader(stderr)
-				s, _ := br.ReadString('\n')
-				if s != "" {
-					qpres <- errors.New(s)
-					if cmd.Process != nil {
-						// It can get stuck on invalid input, like:
-						// echo -n "0000= " | qprint -d
-						cmd.Process.Kill()
-					}
-				}
-			}()
-			go func() {
-				want, err := cmd.Output()
-				if err == nil {
-					qpres <- want
-				}
-			}()
-			select {
-			case got := <-qpres:
-				if want, ok := got.([]byte); ok {
-					if string(want) != buf.String() {
-						t.Errorf("go decode(%q) = %q; qprint = %q", s, want, buf.String())
-					}
-				} else {
-					t.Logf("qprint -d(%q) = %v", s, got)
-				}
-			case <-time.After(5 * time.Second):
-				t.Logf("qprint timeout on %q", s)
-			}
-		}
-		res["OK"]++
-	})
-	var outcomes []string
-	for k, v := range res {
-		outcomes = append(outcomes, fmt.Sprintf("%v: %d", k, v))
-	}
-	sort.Strings(outcomes)
-	got := strings.Join(outcomes, "\n")
-	want := `OK: 21576
-invalid bytes after =: 3397
-quotedprintable: invalid hex byte 0x0a: 1400
-quotedprintable: invalid hex byte 0x0d: 2700
-quotedprintable: invalid hex byte 0x20: 2490
-quotedprintable: invalid hex byte 0x3d: 440
-unexpected EOF: 3122`
-	if got != want {
-		t.Errorf("Got:\n%s\nWant:\n%s", got, want)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/mime/quotedprintable/writer.go b/third_party/gofrontend/libgo/go/mime/quotedprintable/writer.go
deleted file mode 100644
index 16ea0bf..0000000
--- a/third_party/gofrontend/libgo/go/mime/quotedprintable/writer.go
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package quotedprintable
-
-import "io"
-
-const lineMaxLen = 76
-
-// A Writer is a quoted-printable writer that implements io.WriteCloser.
-type Writer struct {
-	// Binary mode treats the writer's input as pure binary and processes end of
-	// line bytes as binary data.
-	Binary bool
-
-	w    io.Writer
-	i    int
-	line [78]byte
-	cr   bool
-}
-
-// NewWriter returns a new Writer that writes to w.
-func NewWriter(w io.Writer) *Writer {
-	return &Writer{w: w}
-}
-
-// Write encodes p using quoted-printable encoding and writes it to the
-// underlying io.Writer. It limits line length to 76 characters. The encoded
-// bytes are not necessarily flushed until the Writer is closed.
-func (w *Writer) Write(p []byte) (n int, err error) {
-	for i, b := range p {
-		switch {
-		// Simple writes are done in batch.
-		case b >= '!' && b <= '~' && b != '=':
-			continue
-		case isWhitespace(b) || !w.Binary && (b == '\n' || b == '\r'):
-			continue
-		}
-
-		if i > n {
-			if err := w.write(p[n:i]); err != nil {
-				return n, err
-			}
-			n = i
-		}
-
-		if err := w.encode(b); err != nil {
-			return n, err
-		}
-		n++
-	}
-
-	if n == len(p) {
-		return n, nil
-	}
-
-	if err := w.write(p[n:]); err != nil {
-		return n, err
-	}
-
-	return len(p), nil
-}
-
-// Close closes the Writer, flushing any unwritten data to the underlying
-// io.Writer, but does not close the underlying io.Writer.
-func (w *Writer) Close() error {
-	if err := w.checkLastByte(); err != nil {
-		return err
-	}
-
-	return w.flush()
-}
-
-// write limits text encoded in quoted-printable to 76 characters per line.
-func (w *Writer) write(p []byte) error {
-	for _, b := range p {
-		if b == '\n' || b == '\r' {
-			// If the previous byte was \r, the CRLF has already been inserted.
-			if w.cr && b == '\n' {
-				w.cr = false
-				continue
-			}
-
-			if b == '\r' {
-				w.cr = true
-			}
-
-			if err := w.checkLastByte(); err != nil {
-				return err
-			}
-			if err := w.insertCRLF(); err != nil {
-				return err
-			}
-			continue
-		}
-
-		if w.i == lineMaxLen-1 {
-			if err := w.insertSoftLineBreak(); err != nil {
-				return err
-			}
-		}
-
-		w.line[w.i] = b
-		w.i++
-		w.cr = false
-	}
-
-	return nil
-}
-
-func (w *Writer) encode(b byte) error {
-	if lineMaxLen-1-w.i < 3 {
-		if err := w.insertSoftLineBreak(); err != nil {
-			return err
-		}
-	}
-
-	w.line[w.i] = '='
-	w.line[w.i+1] = upperhex[b>>4]
-	w.line[w.i+2] = upperhex[b&0x0f]
-	w.i += 3
-
-	return nil
-}
-
-const upperhex = "0123456789ABCDEF"
-
-// checkLastByte encodes the last buffered byte if it is a space or a tab.
-func (w *Writer) checkLastByte() error {
-	if w.i == 0 {
-		return nil
-	}
-
-	b := w.line[w.i-1]
-	if isWhitespace(b) {
-		w.i--
-		if err := w.encode(b); err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
-
-func (w *Writer) insertSoftLineBreak() error {
-	w.line[w.i] = '='
-	w.i++
-
-	return w.insertCRLF()
-}
-
-func (w *Writer) insertCRLF() error {
-	w.line[w.i] = '\r'
-	w.line[w.i+1] = '\n'
-	w.i += 2
-
-	return w.flush()
-}
-
-func (w *Writer) flush() error {
-	if _, err := w.w.Write(w.line[:w.i]); err != nil {
-		return err
-	}
-
-	w.i = 0
-	return nil
-}
-
-func isWhitespace(b byte) bool {
-	return b == ' ' || b == '\t'
-}
diff --git a/third_party/gofrontend/libgo/go/mime/quotedprintable/writer_test.go b/third_party/gofrontend/libgo/go/mime/quotedprintable/writer_test.go
deleted file mode 100644
index a9b77b3..0000000
--- a/third_party/gofrontend/libgo/go/mime/quotedprintable/writer_test.go
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package quotedprintable
-
-import (
-	"bytes"
-	"io/ioutil"
-	"strings"
-	"testing"
-)
-
-func TestWriter(t *testing.T) {
-	testWriter(t, false)
-}
-
-func TestWriterBinary(t *testing.T) {
-	testWriter(t, true)
-}
-
-func testWriter(t *testing.T, binary bool) {
-	tests := []struct {
-		in, want, wantB string
-	}{
-		{in: "", want: ""},
-		{in: "foo bar", want: "foo bar"},
-		{in: "foo bar=", want: "foo bar=3D"},
-		{in: "foo bar\r", want: "foo bar\r\n", wantB: "foo bar=0D"},
-		{in: "foo bar\r\r", want: "foo bar\r\n\r\n", wantB: "foo bar=0D=0D"},
-		{in: "foo bar\n", want: "foo bar\r\n", wantB: "foo bar=0A"},
-		{in: "foo bar\r\n", want: "foo bar\r\n", wantB: "foo bar=0D=0A"},
-		{in: "foo bar\r\r\n", want: "foo bar\r\n\r\n", wantB: "foo bar=0D=0D=0A"},
-		{in: "foo bar ", want: "foo bar=20"},
-		{in: "foo bar\t", want: "foo bar=09"},
-		{in: "foo bar  ", want: "foo bar =20"},
-		{in: "foo bar \n", want: "foo bar=20\r\n", wantB: "foo bar =0A"},
-		{in: "foo bar \r", want: "foo bar=20\r\n", wantB: "foo bar =0D"},
-		{in: "foo bar \r\n", want: "foo bar=20\r\n", wantB: "foo bar =0D=0A"},
-		{in: "foo bar  \n", want: "foo bar =20\r\n", wantB: "foo bar  =0A"},
-		{in: "foo bar  \n ", want: "foo bar =20\r\n=20", wantB: "foo bar  =0A=20"},
-		{in: "¡Hola Señor!", want: "=C2=A1Hola Se=C3=B1or!"},
-		{
-			in:   "\t !\"#$%&'()*+,-./ :;<>?@[\\]^_`{|}~",
-			want: "\t !\"#$%&'()*+,-./ :;<>?@[\\]^_`{|}~",
-		},
-		{
-			in:   strings.Repeat("a", 75),
-			want: strings.Repeat("a", 75),
-		},
-		{
-			in:   strings.Repeat("a", 76),
-			want: strings.Repeat("a", 75) + "=\r\na",
-		},
-		{
-			in:   strings.Repeat("a", 72) + "=",
-			want: strings.Repeat("a", 72) + "=3D",
-		},
-		{
-			in:   strings.Repeat("a", 73) + "=",
-			want: strings.Repeat("a", 73) + "=\r\n=3D",
-		},
-		{
-			in:   strings.Repeat("a", 74) + "=",
-			want: strings.Repeat("a", 74) + "=\r\n=3D",
-		},
-		{
-			in:   strings.Repeat("a", 75) + "=",
-			want: strings.Repeat("a", 75) + "=\r\n=3D",
-		},
-		{
-			in:   strings.Repeat(" ", 73),
-			want: strings.Repeat(" ", 72) + "=20",
-		},
-		{
-			in:   strings.Repeat(" ", 74),
-			want: strings.Repeat(" ", 73) + "=\r\n=20",
-		},
-		{
-			in:   strings.Repeat(" ", 75),
-			want: strings.Repeat(" ", 74) + "=\r\n=20",
-		},
-		{
-			in:   strings.Repeat(" ", 76),
-			want: strings.Repeat(" ", 75) + "=\r\n=20",
-		},
-		{
-			in:   strings.Repeat(" ", 77),
-			want: strings.Repeat(" ", 75) + "=\r\n =20",
-		},
-	}
-
-	for _, tt := range tests {
-		buf := new(bytes.Buffer)
-		w := NewWriter(buf)
-
-		want := tt.want
-		if binary {
-			w.Binary = true
-			if tt.wantB != "" {
-				want = tt.wantB
-			}
-		}
-
-		if _, err := w.Write([]byte(tt.in)); err != nil {
-			t.Errorf("Write(%q): %v", tt.in, err)
-			continue
-		}
-		if err := w.Close(); err != nil {
-			t.Errorf("Close(): %v", err)
-			continue
-		}
-		got := buf.String()
-		if got != want {
-			t.Errorf("Write(%q), got:\n%q\nwant:\n%q", tt.in, got, want)
-		}
-	}
-}
-
-func TestRoundTrip(t *testing.T) {
-	buf := new(bytes.Buffer)
-	w := NewWriter(buf)
-	if _, err := w.Write(testMsg); err != nil {
-		t.Fatalf("Write: %v", err)
-	}
-	if err := w.Close(); err != nil {
-		t.Fatalf("Close: %v", err)
-	}
-
-	r := NewReader(buf)
-	gotBytes, err := ioutil.ReadAll(r)
-	if err != nil {
-		t.Fatalf("Error while reading from Reader: %v", err)
-	}
-	got := string(gotBytes)
-	if got != string(testMsg) {
-		t.Errorf("Encoding and decoding changed the message, got:\n%s", got)
-	}
-}
-
-// From http://fr.wikipedia.org/wiki/Quoted-Printable
-var testMsg = []byte("Quoted-Printable (QP) est un format d'encodage de données codées sur 8 bits, qui utilise exclusivement les caractères alphanumériques imprimables du code ASCII (7 bits).\r\n" +
-	"\r\n" +
-	"En effet, les différents codages comprennent de nombreux caractères qui ne sont pas représentables en ASCII (par exemple les caractères accentués), ainsi que des caractères dits « non-imprimables ».\r\n" +
-	"\r\n" +
-	"L'encodage Quoted-Printable permet de remédier à ce problème, en procédant de la manière suivante :\r\n" +
-	"\r\n" +
-	"Un octet correspondant à un caractère imprimable de l'ASCII sauf le signe égal (donc un caractère de code ASCII entre 33 et 60 ou entre 62 et 126) ou aux caractères de saut de ligne (codes ASCII 13 et 10) ou une suite de tabulations et espaces non situées en fin de ligne (de codes ASCII respectifs 9 et 32) est représenté tel quel.\r\n" +
-	"Un octet qui ne correspond pas à la définition ci-dessus (caractère non imprimable de l'ASCII, tabulation ou espaces non suivies d'un caractère imprimable avant la fin de la ligne ou signe égal) est représenté par un signe égal, suivi de son numéro, exprimé en hexadécimal.\r\n" +
-	"Enfin, un signe égal suivi par un saut de ligne (donc la suite des trois caractères de codes ASCII 61, 13 et 10) peut être inséré n'importe où, afin de limiter la taille des lignes produites si nécessaire. Une limite de 76 caractères par ligne est généralement respectée.\r\n")
-
-func BenchmarkWriter(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		w := NewWriter(ioutil.Discard)
-		w.Write(testMsg)
-		w.Close()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/mime/test.types b/third_party/gofrontend/libgo/go/mime/test.types
deleted file mode 100644
index 9b040ed..0000000
--- a/third_party/gofrontend/libgo/go/mime/test.types
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright 2010 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-
- # mime package test
-application/test	t1	# Simple test
-text/test		t2	# Text test
diff --git a/third_party/gofrontend/libgo/go/mime/testdata/test.types b/third_party/gofrontend/libgo/go/mime/testdata/test.types
deleted file mode 100644
index 9b040ed..0000000
--- a/third_party/gofrontend/libgo/go/mime/testdata/test.types
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright 2010 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-
- # mime package test
-application/test	t1	# Simple test
-text/test		t2	# Text test
diff --git a/third_party/gofrontend/libgo/go/mime/type.go b/third_party/gofrontend/libgo/go/mime/type.go
deleted file mode 100644
index d369259..0000000
--- a/third_party/gofrontend/libgo/go/mime/type.go
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package mime implements parts of the MIME spec.
-package mime
-
-import (
-	"fmt"
-	"strings"
-	"sync"
-)
-
-var (
-	mimeLock       sync.RWMutex      // guards following 3 maps
-	mimeTypes      map[string]string // ".Z" => "application/x-compress"
-	mimeTypesLower map[string]string // ".z" => "application/x-compress"
-
-	// extensions maps from MIME type to list of lowercase file
-	// extensions: "image/jpeg" => [".jpg", ".jpeg"]
-	extensions map[string][]string
-)
-
-// setMimeTypes is used by initMime's non-test path, and by tests.
-// The two maps must not be the same, or nil.
-func setMimeTypes(lowerExt, mixExt map[string]string) {
-	if lowerExt == nil || mixExt == nil {
-		panic("nil map")
-	}
-	mimeTypesLower = lowerExt
-	mimeTypes = mixExt
-	extensions = invert(lowerExt)
-}
-
-var builtinTypesLower = map[string]string{
-	".css":  "text/css; charset=utf-8",
-	".gif":  "image/gif",
-	".htm":  "text/html; charset=utf-8",
-	".html": "text/html; charset=utf-8",
-	".jpg":  "image/jpeg",
-	".js":   "application/x-javascript",
-	".pdf":  "application/pdf",
-	".png":  "image/png",
-	".svg":  "image/svg+xml",
-	".xml":  "text/xml; charset=utf-8",
-}
-
-func clone(m map[string]string) map[string]string {
-	m2 := make(map[string]string, len(m))
-	for k, v := range m {
-		m2[k] = v
-		if strings.ToLower(k) != k {
-			panic("keys in builtinTypesLower must be lowercase")
-		}
-	}
-	return m2
-}
-
-func invert(m map[string]string) map[string][]string {
-	m2 := make(map[string][]string, len(m))
-	for k, v := range m {
-		justType, _, err := ParseMediaType(v)
-		if err != nil {
-			panic(err)
-		}
-		m2[justType] = append(m2[justType], k)
-	}
-	return m2
-}
-
-var once sync.Once // guards initMime
-
-var testInitMime, osInitMime func()
-
-func initMime() {
-	if fn := testInitMime; fn != nil {
-		fn()
-	} else {
-		setMimeTypes(builtinTypesLower, clone(builtinTypesLower))
-		osInitMime()
-	}
-}
-
-// TypeByExtension returns the MIME type associated with the file extension ext.
-// The extension ext should begin with a leading dot, as in ".html".
-// When ext has no associated type, TypeByExtension returns "".
-//
-// Extensions are looked up first case-sensitively, then case-insensitively.
-//
-// The built-in table is small but on unix it is augmented by the local
-// system's mime.types file(s) if available under one or more of these
-// names:
-//
-//   /etc/mime.types
-//   /etc/apache2/mime.types
-//   /etc/apache/mime.types
-//
-// On Windows, MIME types are extracted from the registry.
-//
-// Text types have the charset parameter set to "utf-8" by default.
-func TypeByExtension(ext string) string {
-	once.Do(initMime)
-	mimeLock.RLock()
-	defer mimeLock.RUnlock()
-
-	// Case-sensitive lookup.
-	if v := mimeTypes[ext]; v != "" {
-		return v
-	}
-
-	// Case-insensitive lookup.
-	// Optimistically assume a short ASCII extension and be
-	// allocation-free in that case.
-	var buf [10]byte
-	lower := buf[:0]
-	const utf8RuneSelf = 0x80 // from utf8 package, but not importing it.
-	for i := 0; i < len(ext); i++ {
-		c := ext[i]
-		if c >= utf8RuneSelf {
-			// Slow path.
-			return mimeTypesLower[strings.ToLower(ext)]
-		}
-		if 'A' <= c && c <= 'Z' {
-			lower = append(lower, c+('a'-'A'))
-		} else {
-			lower = append(lower, c)
-		}
-	}
-	// The conversion from []byte to string doesn't allocate in
-	// a map lookup.
-	return mimeTypesLower[string(lower)]
-}
-
-// ExtensionsByType returns the extensions known to be associated with the MIME
-// type typ. The returned extensions will each begin with a leading dot, as in
-// ".html". When typ has no associated extensions, ExtensionsByType returns an
-// nil slice.
-func ExtensionsByType(typ string) ([]string, error) {
-	justType, _, err := ParseMediaType(typ)
-	if err != nil {
-		return nil, err
-	}
-
-	once.Do(initMime)
-	mimeLock.RLock()
-	defer mimeLock.RUnlock()
-	s, ok := extensions[justType]
-	if !ok {
-		return nil, nil
-	}
-	return append([]string{}, s...), nil
-}
-
-// AddExtensionType sets the MIME type associated with
-// the extension ext to typ. The extension should begin with
-// a leading dot, as in ".html".
-func AddExtensionType(ext, typ string) error {
-	if !strings.HasPrefix(ext, ".") {
-		return fmt.Errorf("mime: extension %q missing leading dot", ext)
-	}
-	once.Do(initMime)
-	return setExtensionType(ext, typ)
-}
-
-func setExtensionType(extension, mimeType string) error {
-	justType, param, err := ParseMediaType(mimeType)
-	if err != nil {
-		return err
-	}
-	if strings.HasPrefix(mimeType, "text/") && param["charset"] == "" {
-		param["charset"] = "utf-8"
-		mimeType = FormatMediaType(mimeType, param)
-	}
-	extLower := strings.ToLower(extension)
-
-	mimeLock.Lock()
-	defer mimeLock.Unlock()
-	mimeTypes[extension] = mimeType
-	mimeTypesLower[extLower] = mimeType
-	for _, v := range extensions[justType] {
-		if v == extLower {
-			return nil
-		}
-	}
-	extensions[justType] = append(extensions[justType], extLower)
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/mime/type_dragonfly.go b/third_party/gofrontend/libgo/go/mime/type_dragonfly.go
deleted file mode 100644
index d09d74a..0000000
--- a/third_party/gofrontend/libgo/go/mime/type_dragonfly.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mime
-
-func init() {
-	typeFiles = append(typeFiles, "/usr/local/etc/mime.types")
-}
diff --git a/third_party/gofrontend/libgo/go/mime/type_freebsd.go b/third_party/gofrontend/libgo/go/mime/type_freebsd.go
deleted file mode 100644
index d09d74a..0000000
--- a/third_party/gofrontend/libgo/go/mime/type_freebsd.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mime
-
-func init() {
-	typeFiles = append(typeFiles, "/usr/local/etc/mime.types")
-}
diff --git a/third_party/gofrontend/libgo/go/mime/type_openbsd.go b/third_party/gofrontend/libgo/go/mime/type_openbsd.go
deleted file mode 100644
index c3b1abb..0000000
--- a/third_party/gofrontend/libgo/go/mime/type_openbsd.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mime
-
-func init() {
-	typeFiles = append(typeFiles, "/usr/share/misc/mime.types")
-}
diff --git a/third_party/gofrontend/libgo/go/mime/type_plan9.go b/third_party/gofrontend/libgo/go/mime/type_plan9.go
deleted file mode 100644
index c3ba186..0000000
--- a/third_party/gofrontend/libgo/go/mime/type_plan9.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mime
-
-import (
-	"bufio"
-	"os"
-	"strings"
-)
-
-func init() {
-	osInitMime = initMimePlan9
-}
-
-func initMimePlan9() {
-	for _, filename := range typeFiles {
-		loadMimeFile(filename)
-	}
-}
-
-var typeFiles = []string{
-	"/sys/lib/mimetypes",
-}
-
-func initMimeForTests() map[string]string {
-	typeFiles = []string{"testdata/test.types.plan9"}
-	return map[string]string{
-		".t1":  "application/test",
-		".t2":  "text/test; charset=utf-8",
-		".pNg": "image/png",
-	}
-}
-
-func loadMimeFile(filename string) {
-	f, err := os.Open(filename)
-	if err != nil {
-		return
-	}
-	defer f.Close()
-
-	scanner := bufio.NewScanner(f)
-	for scanner.Scan() {
-		fields := strings.Fields(scanner.Text())
-		if len(fields) <= 2 || fields[0][0] != '.' {
-			continue
-		}
-		if fields[1] == "-" || fields[2] == "-" {
-			continue
-		}
-		setExtensionType(fields[0], fields[1]+"/"+fields[2])
-	}
-	if err := scanner.Err(); err != nil {
-		panic(err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/mime/type_test.go b/third_party/gofrontend/libgo/go/mime/type_test.go
deleted file mode 100644
index 48735ef..0000000
--- a/third_party/gofrontend/libgo/go/mime/type_test.go
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mime
-
-import (
-	"reflect"
-	"strings"
-	"sync"
-	"testing"
-)
-
-func setMimeInit(fn func()) (cleanup func()) {
-	once = sync.Once{}
-	testInitMime = fn
-	return func() { testInitMime = nil }
-}
-
-func clearMimeTypes() {
-	setMimeTypes(map[string]string{}, map[string]string{})
-}
-
-func setType(ext, typ string) {
-	if !strings.HasPrefix(ext, ".") {
-		panic("missing leading dot")
-	}
-	if err := setExtensionType(ext, typ); err != nil {
-		panic("bad test data: " + err.Error())
-	}
-}
-
-func TestTypeByExtension(t *testing.T) {
-	once = sync.Once{}
-	// initMimeForTests returns the platform-specific extension =>
-	// type tests. On Unix and Plan 9, this also tests the parsing
-	// of MIME text files (in testdata/*). On Windows, we test the
-	// real registry on the machine and assume that ".png" exists
-	// there, which empirically it always has, for all versions of
-	// Windows.
-	typeTests := initMimeForTests()
-
-	for ext, want := range typeTests {
-		val := TypeByExtension(ext)
-		if val != want {
-			t.Errorf("TypeByExtension(%q) = %q, want %q", ext, val, want)
-		}
-	}
-}
-
-func TestTypeByExtension_LocalData(t *testing.T) {
-	cleanup := setMimeInit(func() {
-		clearMimeTypes()
-		setType(".foo", "x/foo")
-		setType(".bar", "x/bar")
-		setType(".Bar", "x/bar; capital=1")
-	})
-	defer cleanup()
-
-	tests := map[string]string{
-		".foo":          "x/foo",
-		".bar":          "x/bar",
-		".Bar":          "x/bar; capital=1",
-		".sdlkfjskdlfj": "",
-		".t1":           "", // testdata shouldn't be used
-	}
-
-	for ext, want := range tests {
-		val := TypeByExtension(ext)
-		if val != want {
-			t.Errorf("TypeByExtension(%q) = %q, want %q", ext, val, want)
-		}
-	}
-}
-
-func TestTypeByExtensionCase(t *testing.T) {
-	const custom = "test/test; charset=iso-8859-1"
-	const caps = "test/test; WAS=ALLCAPS"
-
-	cleanup := setMimeInit(func() {
-		clearMimeTypes()
-		setType(".TEST", caps)
-		setType(".tesT", custom)
-	})
-	defer cleanup()
-
-	// case-sensitive lookup
-	if got := TypeByExtension(".tesT"); got != custom {
-		t.Fatalf("for .tesT, got %q; want %q", got, custom)
-	}
-	if got := TypeByExtension(".TEST"); got != caps {
-		t.Fatalf("for .TEST, got %q; want %s", got, caps)
-	}
-
-	// case-insensitive
-	if got := TypeByExtension(".TesT"); got != custom {
-		t.Fatalf("for .TesT, got %q; want %q", got, custom)
-	}
-}
-
-func TestExtensionsByType(t *testing.T) {
-	cleanup := setMimeInit(func() {
-		clearMimeTypes()
-		setType(".gif", "image/gif")
-		setType(".a", "foo/letter")
-		setType(".b", "foo/letter")
-		setType(".B", "foo/letter")
-		setType(".PNG", "image/png")
-	})
-	defer cleanup()
-
-	tests := []struct {
-		typ     string
-		want    []string
-		wantErr string
-	}{
-		{typ: "image/gif", want: []string{".gif"}},
-		{typ: "image/png", want: []string{".png"}}, // lowercase
-		{typ: "foo/letter", want: []string{".a", ".b"}},
-		{typ: "x/unknown", want: nil},
-	}
-
-	for _, tt := range tests {
-		got, err := ExtensionsByType(tt.typ)
-		if err != nil && tt.wantErr != "" && strings.Contains(err.Error(), tt.wantErr) {
-			continue
-		}
-		if err != nil {
-			t.Errorf("ExtensionsByType(%q) error: %v", tt.typ, err)
-			continue
-		}
-		if tt.wantErr != "" {
-			t.Errorf("ExtensionsByType(%q) = %q, %v; want error substring %q", tt.typ, got, err, tt.wantErr)
-			continue
-		}
-		if !reflect.DeepEqual(got, tt.want) {
-			t.Errorf("ExtensionsByType(%q) = %q; want %q", tt.typ, got, tt.want)
-		}
-	}
-}
-
-func TestLookupMallocs(t *testing.T) {
-	t.Skip("skipping test on gccgo until it has better escape analysis")
-	n := testing.AllocsPerRun(10000, func() {
-		TypeByExtension(".html")
-		TypeByExtension(".HtML")
-	})
-	if n > 0 {
-		t.Errorf("allocs = %v; want 0", n)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/mime/type_unix.go b/third_party/gofrontend/libgo/go/mime/type_unix.go
deleted file mode 100644
index bb06a77..0000000
--- a/third_party/gofrontend/libgo/go/mime/type_unix.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package mime
-
-import (
-	"bufio"
-	"os"
-	"strings"
-)
-
-func init() {
-	osInitMime = initMimeUnix
-}
-
-var typeFiles = []string{
-	"/etc/mime.types",
-	"/etc/apache2/mime.types",
-	"/etc/apache/mime.types",
-}
-
-func loadMimeFile(filename string) {
-	f, err := os.Open(filename)
-	if err != nil {
-		return
-	}
-	defer f.Close()
-
-	scanner := bufio.NewScanner(f)
-	for scanner.Scan() {
-		fields := strings.Fields(scanner.Text())
-		if len(fields) <= 1 || fields[0][0] == '#' {
-			continue
-		}
-		mimeType := fields[0]
-		for _, ext := range fields[1:] {
-			if ext[0] == '#' {
-				break
-			}
-			setExtensionType("."+ext, mimeType)
-		}
-	}
-	if err := scanner.Err(); err != nil {
-		panic(err)
-	}
-}
-
-func initMimeUnix() {
-	for _, filename := range typeFiles {
-		loadMimeFile(filename)
-	}
-}
-
-func initMimeForTests() map[string]string {
-	typeFiles = []string{"testdata/test.types"}
-	return map[string]string{
-		".T1":  "application/test",
-		".t2":  "text/test; charset=utf-8",
-		".png": "image/png",
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/mime/type_windows.go b/third_party/gofrontend/libgo/go/mime/type_windows.go
deleted file mode 100644
index 97b9aeb..0000000
--- a/third_party/gofrontend/libgo/go/mime/type_windows.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mime
-
-import (
-	"internal/syscall/windows/registry"
-)
-
-func init() {
-	osInitMime = initMimeWindows
-}
-
-func initMimeWindows() {
-	names, err := registry.CLASSES_ROOT.ReadSubKeyNames(-1)
-	if err != nil {
-		return
-	}
-	for _, name := range names {
-		if len(name) < 2 || name[0] != '.' { // looking for extensions only
-			continue
-		}
-		k, err := registry.OpenKey(registry.CLASSES_ROOT, name, registry.READ)
-		if err != nil {
-			continue
-		}
-		v, _, err := k.GetStringValue("Content Type")
-		k.Close()
-		if err != nil {
-			continue
-		}
-		setExtensionType(name, v)
-	}
-}
-
-func initMimeForTests() map[string]string {
-	return map[string]string{
-		".PnG": "image/png",
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/addrselect.go b/third_party/gofrontend/libgo/go/net/addrselect.go
deleted file mode 100644
index e22fbac..0000000
--- a/third_party/gofrontend/libgo/go/net/addrselect.go
+++ /dev/null
@@ -1,388 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-// Minimal RFC 6724 address selection.
-
-package net
-
-import "sort"
-
-func sortByRFC6724(addrs []IPAddr) {
-	if len(addrs) < 2 {
-		return
-	}
-	sortByRFC6724withSrcs(addrs, srcAddrs(addrs))
-}
-
-func sortByRFC6724withSrcs(addrs []IPAddr, srcs []IP) {
-	if len(addrs) != len(srcs) {
-		panic("internal error")
-	}
-	addrAttr := make([]ipAttr, len(addrs))
-	srcAttr := make([]ipAttr, len(srcs))
-	for i, v := range addrs {
-		addrAttr[i] = ipAttrOf(v.IP)
-		srcAttr[i] = ipAttrOf(srcs[i])
-	}
-	sort.Stable(&byRFC6724{
-		addrs:    addrs,
-		addrAttr: addrAttr,
-		srcs:     srcs,
-		srcAttr:  srcAttr,
-	})
-}
-
-// srcsAddrs tries to UDP-connect to each address to see if it has a
-// route. (This doesn't send any packets). The destination port
-// number is irrelevant.
-func srcAddrs(addrs []IPAddr) []IP {
-	srcs := make([]IP, len(addrs))
-	dst := UDPAddr{Port: 9}
-	for i := range addrs {
-		dst.IP = addrs[i].IP
-		dst.Zone = addrs[i].Zone
-		c, err := DialUDP("udp", nil, &dst)
-		if err == nil {
-			if src, ok := c.LocalAddr().(*UDPAddr); ok {
-				srcs[i] = src.IP
-			}
-			c.Close()
-		}
-	}
-	return srcs
-}
-
-type ipAttr struct {
-	Scope      scope
-	Precedence uint8
-	Label      uint8
-}
-
-func ipAttrOf(ip IP) ipAttr {
-	if ip == nil {
-		return ipAttr{}
-	}
-	match := rfc6724policyTable.Classify(ip)
-	return ipAttr{
-		Scope:      classifyScope(ip),
-		Precedence: match.Precedence,
-		Label:      match.Label,
-	}
-}
-
-type byRFC6724 struct {
-	addrs    []IPAddr // addrs to sort
-	addrAttr []ipAttr
-	srcs     []IP // or nil if unreachable
-	srcAttr  []ipAttr
-}
-
-func (s *byRFC6724) Len() int { return len(s.addrs) }
-
-func (s *byRFC6724) Swap(i, j int) {
-	s.addrs[i], s.addrs[j] = s.addrs[j], s.addrs[i]
-	s.srcs[i], s.srcs[j] = s.srcs[j], s.srcs[i]
-	s.addrAttr[i], s.addrAttr[j] = s.addrAttr[j], s.addrAttr[i]
-	s.srcAttr[i], s.srcAttr[j] = s.srcAttr[j], s.srcAttr[i]
-}
-
-// Less reports whether i is a better destination address for this
-// host than j.
-//
-// The algorithm and variable names comes from RFC 6724 section 6.
-func (s *byRFC6724) Less(i, j int) bool {
-	DA := s.addrs[i].IP
-	DB := s.addrs[j].IP
-	SourceDA := s.srcs[i]
-	SourceDB := s.srcs[j]
-	attrDA := &s.addrAttr[i]
-	attrDB := &s.addrAttr[j]
-	attrSourceDA := &s.srcAttr[i]
-	attrSourceDB := &s.srcAttr[j]
-
-	const preferDA = true
-	const preferDB = false
-
-	// Rule 1: Avoid unusable destinations.
-	// If DB is known to be unreachable or if Source(DB) is undefined, then
-	// prefer DA.  Similarly, if DA is known to be unreachable or if
-	// Source(DA) is undefined, then prefer DB.
-	if SourceDA == nil && SourceDB == nil {
-		return false // "equal"
-	}
-	if SourceDB == nil {
-		return preferDA
-	}
-	if SourceDA == nil {
-		return preferDB
-	}
-
-	// Rule 2: Prefer matching scope.
-	// If Scope(DA) = Scope(Source(DA)) and Scope(DB) <> Scope(Source(DB)),
-	// then prefer DA.  Similarly, if Scope(DA) <> Scope(Source(DA)) and
-	// Scope(DB) = Scope(Source(DB)), then prefer DB.
-	if attrDA.Scope == attrSourceDA.Scope && attrDB.Scope != attrSourceDB.Scope {
-		return preferDA
-	}
-	if attrDA.Scope != attrSourceDA.Scope && attrDB.Scope == attrSourceDB.Scope {
-		return preferDB
-	}
-
-	// Rule 3: Avoid deprecated addresses.
-	// If Source(DA) is deprecated and Source(DB) is not, then prefer DB.
-	// Similarly, if Source(DA) is not deprecated and Source(DB) is
-	// deprecated, then prefer DA.
-
-	// TODO(bradfitz): implement? low priority for now.
-
-	// Rule 4: Prefer home addresses.
-	// If Source(DA) is simultaneously a home address and care-of address
-	// and Source(DB) is not, then prefer DA.  Similarly, if Source(DB) is
-	// simultaneously a home address and care-of address and Source(DA) is
-	// not, then prefer DB.
-
-	// TODO(bradfitz): implement? low priority for now.
-
-	// Rule 5: Prefer matching label.
-	// If Label(Source(DA)) = Label(DA) and Label(Source(DB)) <> Label(DB),
-	// then prefer DA.  Similarly, if Label(Source(DA)) <> Label(DA) and
-	// Label(Source(DB)) = Label(DB), then prefer DB.
-	if attrSourceDA.Label == attrDA.Label &&
-		attrSourceDB.Label != attrDB.Label {
-		return preferDA
-	}
-	if attrSourceDA.Label != attrDA.Label &&
-		attrSourceDB.Label == attrDB.Label {
-		return preferDB
-	}
-
-	// Rule 6: Prefer higher precedence.
-	// If Precedence(DA) > Precedence(DB), then prefer DA.  Similarly, if
-	// Precedence(DA) < Precedence(DB), then prefer DB.
-	if attrDA.Precedence > attrDB.Precedence {
-		return preferDA
-	}
-	if attrDA.Precedence < attrDB.Precedence {
-		return preferDB
-	}
-
-	// Rule 7: Prefer native transport.
-	// If DA is reached via an encapsulating transition mechanism (e.g.,
-	// IPv6 in IPv4) and DB is not, then prefer DB.  Similarly, if DB is
-	// reached via encapsulation and DA is not, then prefer DA.
-
-	// TODO(bradfitz): implement? low priority for now.
-
-	// Rule 8: Prefer smaller scope.
-	// If Scope(DA) < Scope(DB), then prefer DA.  Similarly, if Scope(DA) >
-	// Scope(DB), then prefer DB.
-	if attrDA.Scope < attrDB.Scope {
-		return preferDA
-	}
-	if attrDA.Scope > attrDB.Scope {
-		return preferDB
-	}
-
-	// Rule 9: Use longest matching prefix.
-	// When DA and DB belong to the same address family (both are IPv6 or
-	// both are IPv4): If CommonPrefixLen(Source(DA), DA) >
-	// CommonPrefixLen(Source(DB), DB), then prefer DA.  Similarly, if
-	// CommonPrefixLen(Source(DA), DA) < CommonPrefixLen(Source(DB), DB),
-	// then prefer DB.
-	da4 := DA.To4() != nil
-	db4 := DB.To4() != nil
-	if da4 == db4 {
-		commonA := commonPrefixLen(SourceDA, DA)
-		commonB := commonPrefixLen(SourceDB, DB)
-		if commonA > commonB {
-			return preferDA
-		}
-		if commonA < commonB {
-			return preferDB
-		}
-	}
-
-	// Rule 10: Otherwise, leave the order unchanged.
-	// If DA preceded DB in the original list, prefer DA.
-	// Otherwise, prefer DB.
-	return false // "equal"
-}
-
-type policyTableEntry struct {
-	Prefix     *IPNet
-	Precedence uint8
-	Label      uint8
-}
-
-type policyTable []policyTableEntry
-
-// RFC 6724 section 2.1.
-var rfc6724policyTable = policyTable{
-	{
-		Prefix:     mustCIDR("::1/128"),
-		Precedence: 50,
-		Label:      0,
-	},
-	{
-		Prefix:     mustCIDR("::/0"),
-		Precedence: 40,
-		Label:      1,
-	},
-	{
-		// IPv4-compatible, etc.
-		Prefix:     mustCIDR("::ffff:0:0/96"),
-		Precedence: 35,
-		Label:      4,
-	},
-	{
-		// 6to4
-		Prefix:     mustCIDR("2002::/16"),
-		Precedence: 30,
-		Label:      2,
-	},
-	{
-		// Teredo
-		Prefix:     mustCIDR("2001::/32"),
-		Precedence: 5,
-		Label:      5,
-	},
-	{
-		Prefix:     mustCIDR("fc00::/7"),
-		Precedence: 3,
-		Label:      13,
-	},
-	{
-		Prefix:     mustCIDR("::/96"),
-		Precedence: 1,
-		Label:      3,
-	},
-	{
-		Prefix:     mustCIDR("fec0::/10"),
-		Precedence: 1,
-		Label:      11,
-	},
-	{
-		Prefix:     mustCIDR("3ffe::/16"),
-		Precedence: 1,
-		Label:      12,
-	},
-}
-
-func init() {
-	sort.Sort(sort.Reverse(byMaskLength(rfc6724policyTable)))
-}
-
-// byMaskLength sorts policyTableEntry by the size of their Prefix.Mask.Size,
-// from smallest mask, to largest.
-type byMaskLength []policyTableEntry
-
-func (s byMaskLength) Len() int      { return len(s) }
-func (s byMaskLength) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-func (s byMaskLength) Less(i, j int) bool {
-	isize, _ := s[i].Prefix.Mask.Size()
-	jsize, _ := s[j].Prefix.Mask.Size()
-	return isize < jsize
-}
-
-// mustCIDR calls ParseCIDR and panics on any error, or if the network
-// is not IPv6.
-func mustCIDR(s string) *IPNet {
-	ip, ipNet, err := ParseCIDR(s)
-	if err != nil {
-		panic(err.Error())
-	}
-	if len(ip) != IPv6len {
-		panic("unexpected IP length")
-	}
-	return ipNet
-}
-
-// Classify returns the policyTableEntry of the entry with the longest
-// matching prefix that contains ip.
-// The table t must be sorted from largest mask size to smallest.
-func (t policyTable) Classify(ip IP) policyTableEntry {
-	for _, ent := range t {
-		if ent.Prefix.Contains(ip) {
-			return ent
-		}
-	}
-	return policyTableEntry{}
-}
-
-// RFC 6724 section 3.1.
-type scope uint8
-
-const (
-	scopeInterfaceLocal scope = 0x1
-	scopeLinkLocal      scope = 0x2
-	scopeAdminLocal     scope = 0x4
-	scopeSiteLocal      scope = 0x5
-	scopeOrgLocal       scope = 0x8
-	scopeGlobal         scope = 0xe
-)
-
-func classifyScope(ip IP) scope {
-	if ip.IsLoopback() || ip.IsLinkLocalUnicast() {
-		return scopeLinkLocal
-	}
-	ipv6 := len(ip) == IPv6len && ip.To4() == nil
-	if ipv6 && ip.IsMulticast() {
-		return scope(ip[1] & 0xf)
-	}
-	// Site-local addresses are defined in RFC 3513 section 2.5.6
-	// (and deprecated in RFC 3879).
-	if ipv6 && ip[0] == 0xfe && ip[1]&0xc0 == 0xc0 {
-		return scopeSiteLocal
-	}
-	return scopeGlobal
-}
-
-// commonPrefixLen reports the length of the longest prefix (looking
-// at the most significant, or leftmost, bits) that the
-// two addresses have in common, up to the length of a's prefix (i.e.,
-// the portion of the address not including the interface ID).
-//
-// If a or b is an IPv4 address as an IPv6 address, the IPv4 addresses
-// are compared (with max common prefix length of 32).
-// If a and b are different IP versions, 0 is returned.
-//
-// See https://tools.ietf.org/html/rfc6724#section-2.2
-func commonPrefixLen(a, b IP) (cpl int) {
-	if a4 := a.To4(); a4 != nil {
-		a = a4
-	}
-	if b4 := b.To4(); b4 != nil {
-		b = b4
-	}
-	if len(a) != len(b) {
-		return 0
-	}
-	// If IPv6, only up to the prefix (first 64 bits)
-	if len(a) > 8 {
-		a = a[:8]
-		b = b[:8]
-	}
-	for len(a) > 0 {
-		if a[0] == b[0] {
-			cpl += 8
-			a = a[1:]
-			b = b[1:]
-			continue
-		}
-		bits := 8
-		ab, bb := a[0], b[0]
-		for {
-			ab >>= 1
-			bb >>= 1
-			bits--
-			if ab == bb {
-				cpl += bits
-				return
-			}
-		}
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/net/addrselect_test.go b/third_party/gofrontend/libgo/go/net/addrselect_test.go
deleted file mode 100644
index 5620227..0000000
--- a/third_party/gofrontend/libgo/go/net/addrselect_test.go
+++ /dev/null
@@ -1,219 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package net
-
-import (
-	"reflect"
-	"testing"
-)
-
-func TestSortByRFC6724(t *testing.T) {
-	tests := []struct {
-		in      []IPAddr
-		srcs    []IP
-		want    []IPAddr
-		reverse bool // also test it starting backwards
-	}{
-		// Examples from RFC 6724 section 10.2:
-
-		// Prefer matching scope.
-		{
-			in: []IPAddr{
-				{IP: ParseIP("2001:db8:1::1")},
-				{IP: ParseIP("198.51.100.121")},
-			},
-			srcs: []IP{
-				ParseIP("2001:db8:1::2"),
-				ParseIP("169.254.13.78"),
-			},
-			want: []IPAddr{
-				{IP: ParseIP("2001:db8:1::1")},
-				{IP: ParseIP("198.51.100.121")},
-			},
-			reverse: true,
-		},
-
-		// Prefer matching scope.
-		{
-			in: []IPAddr{
-				{IP: ParseIP("2001:db8:1::1")},
-				{IP: ParseIP("198.51.100.121")},
-			},
-			srcs: []IP{
-				ParseIP("fe80::1"),
-				ParseIP("198.51.100.117"),
-			},
-			want: []IPAddr{
-				{IP: ParseIP("198.51.100.121")},
-				{IP: ParseIP("2001:db8:1::1")},
-			},
-			reverse: true,
-		},
-
-		// Prefer higher precedence.
-		{
-			in: []IPAddr{
-				{IP: ParseIP("2001:db8:1::1")},
-				{IP: ParseIP("10.1.2.3")},
-			},
-			srcs: []IP{
-				ParseIP("2001:db8:1::2"),
-				ParseIP("10.1.2.4"),
-			},
-			want: []IPAddr{
-				{IP: ParseIP("2001:db8:1::1")},
-				{IP: ParseIP("10.1.2.3")},
-			},
-			reverse: true,
-		},
-
-		// Prefer smaller scope.
-		{
-			in: []IPAddr{
-				{IP: ParseIP("2001:db8:1::1")},
-				{IP: ParseIP("fe80::1")},
-			},
-			srcs: []IP{
-				ParseIP("2001:db8:1::2"),
-				ParseIP("fe80::2"),
-			},
-			want: []IPAddr{
-				{IP: ParseIP("fe80::1")},
-				{IP: ParseIP("2001:db8:1::1")},
-			},
-			reverse: true,
-		},
-	}
-	for i, tt := range tests {
-		inCopy := make([]IPAddr, len(tt.in))
-		copy(inCopy, tt.in)
-		srcCopy := make([]IP, len(tt.in))
-		copy(srcCopy, tt.srcs)
-		sortByRFC6724withSrcs(inCopy, srcCopy)
-		if !reflect.DeepEqual(inCopy, tt.want) {
-			t.Errorf("test %d:\nin = %s\ngot: %s\nwant: %s\n", i, tt.in, inCopy, tt.want)
-		}
-		if tt.reverse {
-			copy(inCopy, tt.in)
-			copy(srcCopy, tt.srcs)
-			for j := 0; j < len(inCopy)/2; j++ {
-				k := len(inCopy) - j - 1
-				inCopy[j], inCopy[k] = inCopy[k], inCopy[j]
-				srcCopy[j], srcCopy[k] = srcCopy[k], srcCopy[j]
-			}
-			sortByRFC6724withSrcs(inCopy, srcCopy)
-			if !reflect.DeepEqual(inCopy, tt.want) {
-				t.Errorf("test %d, starting backwards:\nin = %s\ngot: %s\nwant: %s\n", i, tt.in, inCopy, tt.want)
-			}
-		}
-
-	}
-
-}
-
-func TestRFC6724PolicyTableClassify(t *testing.T) {
-	tests := []struct {
-		ip   IP
-		want policyTableEntry
-	}{
-		{
-			ip: ParseIP("127.0.0.1"),
-			want: policyTableEntry{
-				Prefix:     &IPNet{IP: ParseIP("::ffff:0:0"), Mask: CIDRMask(96, 128)},
-				Precedence: 35,
-				Label:      4,
-			},
-		},
-		{
-			ip: ParseIP("2601:645:8002:a500:986f:1db8:c836:bd65"),
-			want: policyTableEntry{
-				Prefix:     &IPNet{IP: ParseIP("::"), Mask: CIDRMask(0, 128)},
-				Precedence: 40,
-				Label:      1,
-			},
-		},
-		{
-			ip: ParseIP("::1"),
-			want: policyTableEntry{
-				Prefix:     &IPNet{IP: ParseIP("::1"), Mask: CIDRMask(128, 128)},
-				Precedence: 50,
-				Label:      0,
-			},
-		},
-		{
-			ip: ParseIP("2002::ab12"),
-			want: policyTableEntry{
-				Prefix:     &IPNet{IP: ParseIP("2002::"), Mask: CIDRMask(16, 128)},
-				Precedence: 30,
-				Label:      2,
-			},
-		},
-	}
-	for i, tt := range tests {
-		got := rfc6724policyTable.Classify(tt.ip)
-		if !reflect.DeepEqual(got, tt.want) {
-			t.Errorf("%d. Classify(%s) = %v; want %v", i, tt.ip, got, tt.want)
-		}
-	}
-}
-
-func TestRFC6724ClassifyScope(t *testing.T) {
-	tests := []struct {
-		ip   IP
-		want scope
-	}{
-		{ParseIP("127.0.0.1"), scopeLinkLocal},   // rfc6724#section-3.2
-		{ParseIP("::1"), scopeLinkLocal},         // rfc4007#section-4
-		{ParseIP("169.254.1.2"), scopeLinkLocal}, // rfc6724#section-3.2
-		{ParseIP("fec0::1"), scopeSiteLocal},
-		{ParseIP("8.8.8.8"), scopeGlobal},
-
-		{ParseIP("ff02::"), scopeLinkLocal},  // IPv6 multicast
-		{ParseIP("ff05::"), scopeSiteLocal},  // IPv6 multicast
-		{ParseIP("ff04::"), scopeAdminLocal}, // IPv6 multicast
-		{ParseIP("ff0e::"), scopeGlobal},     // IPv6 multicast
-
-		{IPv4(0xe0, 0, 0, 0), scopeGlobal},       // IPv4 link-local multicast as 16 bytes
-		{IPv4(0xe0, 2, 2, 2), scopeGlobal},       // IPv4 global multicast as 16 bytes
-		{IPv4(0xe0, 0, 0, 0).To4(), scopeGlobal}, // IPv4 link-local multicast as 4 bytes
-		{IPv4(0xe0, 2, 2, 2).To4(), scopeGlobal}, // IPv4 global multicast as 4 bytes
-	}
-	for i, tt := range tests {
-		got := classifyScope(tt.ip)
-		if got != tt.want {
-			t.Errorf("%d. classifyScope(%s) = %x; want %x", i, tt.ip, got, tt.want)
-		}
-	}
-}
-
-func TestRFC6724CommonPrefixLength(t *testing.T) {
-	tests := []struct {
-		a, b IP
-		want int
-	}{
-		{ParseIP("fe80::1"), ParseIP("fe80::2"), 64},
-		{ParseIP("fe81::1"), ParseIP("fe80::2"), 15},
-		{ParseIP("127.0.0.1"), ParseIP("fe80::1"), 0}, // diff size
-		{IPv4(1, 2, 3, 4), IP{1, 2, 3, 4}, 32},
-		{IP{1, 2, 255, 255}, IP{1, 2, 0, 0}, 16},
-		{IP{1, 2, 127, 255}, IP{1, 2, 0, 0}, 17},
-		{IP{1, 2, 63, 255}, IP{1, 2, 0, 0}, 18},
-		{IP{1, 2, 31, 255}, IP{1, 2, 0, 0}, 19},
-		{IP{1, 2, 15, 255}, IP{1, 2, 0, 0}, 20},
-		{IP{1, 2, 7, 255}, IP{1, 2, 0, 0}, 21},
-		{IP{1, 2, 3, 255}, IP{1, 2, 0, 0}, 22},
-		{IP{1, 2, 1, 255}, IP{1, 2, 0, 0}, 23},
-		{IP{1, 2, 0, 255}, IP{1, 2, 0, 0}, 24},
-	}
-	for i, tt := range tests {
-		got := commonPrefixLen(tt.a, tt.b)
-		if got != tt.want {
-			t.Errorf("%d. commonPrefixLen(%s, %s) = %d; want %d", i, tt.a, tt.b, got, tt.want)
-		}
-	}
-
-}
diff --git a/third_party/gofrontend/libgo/go/net/cgo_android.go b/third_party/gofrontend/libgo/go/net/cgo_android.go
deleted file mode 100644
index fe9925b..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_android.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo,!netgo
-
-package net
-
-//#include <netdb.h>
-import "C"
-
-const cgoAddrInfoFlags = C.AI_CANONNAME
diff --git a/third_party/gofrontend/libgo/go/net/cgo_bsd.go b/third_party/gofrontend/libgo/go/net/cgo_bsd.go
deleted file mode 100644
index ae1054b..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_bsd.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo,!netgo
-// +build darwin dragonfly freebsd
-
-package net
-
-/*
-#include <netdb.h>
-*/
-
-import "syscall"
-
-const cgoAddrInfoFlags = (syscall.AI_CANONNAME | syscall.AI_V4MAPPED | syscall.AI_ALL) & syscall.AI_MASK
diff --git a/third_party/gofrontend/libgo/go/net/cgo_linux.go b/third_party/gofrontend/libgo/go/net/cgo_linux.go
deleted file mode 100644
index baf2072..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_linux.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !android,cgo,!netgo
-
-package net
-
-/*
-#include <netdb.h>
-*/
-
-import "syscall"
-
-// NOTE(rsc): In theory there are approximately balanced
-// arguments for and against including AI_ADDRCONFIG
-// in the flags (it includes IPv4 results only on IPv4 systems,
-// and similarly for IPv6), but in practice setting it causes
-// getaddrinfo to return the wrong canonical name on Linux.
-// So definitely leave it out.
-const cgoAddrInfoFlags = syscall.AI_CANONNAME | syscall.AI_V4MAPPED | syscall.AI_ALL
diff --git a/third_party/gofrontend/libgo/go/net/cgo_netbsd.go b/third_party/gofrontend/libgo/go/net/cgo_netbsd.go
deleted file mode 100644
index 8a16871..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_netbsd.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo,!netgo
-
-package net
-
-/*
-#include <netdb.h>
-*/
-import "syscall"
-
-const cgoAddrInfoFlags = syscall.AI_CANONNAME
diff --git a/third_party/gofrontend/libgo/go/net/cgo_openbsd.go b/third_party/gofrontend/libgo/go/net/cgo_openbsd.go
deleted file mode 100644
index 1830913..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_openbsd.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo,!netgo
-
-package net
-
-/*
-#include <netdb.h>
-*/
-import "C"
-
-const cgoAddrInfoFlags = C.AI_CANONNAME
diff --git a/third_party/gofrontend/libgo/go/net/cgo_resnew.go b/third_party/gofrontend/libgo/go/net/cgo_resnew.go
deleted file mode 100644
index ebca1bd..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_resnew.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo,!netgo
-// +build darwin linux,!android netbsd solaris
-
-package net
-
-/*
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <netdb.h>
-*/
-
-import (
-	"syscall"
-)
-
-//extern getnameinfo
-func libc_getnameinfo(*syscall.RawSockaddr, syscall.Socklen_t, *byte, syscall.Size_t, *byte, syscall.Size_t, int) int
-
-func cgoNameinfoPTR(b []byte, sa *syscall.RawSockaddr, salen syscall.Socklen_t) (int, error) {
-	syscall.Entersyscall()
-	gerrno := libc_getnameinfo(sa, salen, &b[0], syscall.Size_t(len(b)), nil, 0, syscall.NI_NAMEREQD)
-	syscall.Exitsyscall()
-	var err error
-	if gerrno == syscall.EAI_SYSTEM {
-		errno := syscall.GetErrno()
-		if errno != 0 {
-			err = errno
-		}
-	}
-	return gerrno, err
-}
diff --git a/third_party/gofrontend/libgo/go/net/cgo_resold.go b/third_party/gofrontend/libgo/go/net/cgo_resold.go
deleted file mode 100644
index 8e13e41..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_resold.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo,!netgo
-// +build android freebsd dragonfly openbsd
-
-package net
-
-/*
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <netdb.h>
-*/
-
-import (
-	"syscall"
-)
-
-//extern getnameinfo
-func libc_getnameinfo(*syscall.RawSockaddr, syscall.Socklen_t, *byte, syscall.Size_t, *byte, syscall.Size_t, int) int
-
-func cgoNameinfoPTR(b []byte, sa *syscall.RawSockaddr, salen syscall.Socklen_t) (int, error) {
-	syscall.Entersyscall()
-	gerrno := libc_getnameinfo(sa, salen, &b[0], syscall.Size(len(b)), nil, 0, syscall.NI_NAMEREQD)
-	syscall.Exitsyscall()
-	var err error
-	if gerrno == syscall.EAI_SYSTEM {
-		errno := syscall.GetErrno()
-		if errno != 0 {
-			err = errno
-		}
-	}
-	return gerrno, err
-}
diff --git a/third_party/gofrontend/libgo/go/net/cgo_socknew.go b/third_party/gofrontend/libgo/go/net/cgo_socknew.go
deleted file mode 100644
index 81816c6..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_socknew.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo,!netgo
-// +build android linux solaris
-
-package net
-
-/*
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-*/
-
-import (
-	"syscall"
-	"unsafe"
-)
-
-func cgoSockaddrInet4(ip IP) *syscall.RawSockaddr {
-	sa := syscall.RawSockaddrInet4{Family: syscall.AF_INET}
-	copy(sa.Addr[:], ip)
-	return (*syscall.RawSockaddr)(unsafe.Pointer(&sa))
-}
-
-func cgoSockaddrInet6(ip IP) *syscall.RawSockaddr {
-	sa := syscall.RawSockaddrInet6{Family: syscall.AF_INET6}
-	copy(sa.Addr[:], ip)
-	return (*syscall.RawSockaddr)(unsafe.Pointer(&sa))
-}
diff --git a/third_party/gofrontend/libgo/go/net/cgo_sockold.go b/third_party/gofrontend/libgo/go/net/cgo_sockold.go
deleted file mode 100644
index e80e03b..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_sockold.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo,!netgo
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package net
-
-/*
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-*/
-
-import (
-	"syscall"
-	"unsafe"
-)
-
-func cgoSockaddrInet4(ip IP) *syscall.RawSockaddr {
-	sa := syscall.RawSockaddrInet4{Len: syscall.SizeofSockaddrInet4, Family: syscall.AF_INET}
-	copy(sa.Addr[:], ip)
-	return (*syscall.RawSockaddr)(unsafe.Pointer(&sa))
-}
-
-func cgoSockaddrInet6(ip IP) *syscall.RawSockaddr {
-	sa := syscall.RawSockaddrInet6{Len: syscall.SizeofSockaddrInet6, Family: syscall.AF_INET6}
-	copy(sa.Addr[:], ip)
-	return (*syscall.RawSockaddr)(unsafe.Pointer(&sa))
-}
diff --git a/third_party/gofrontend/libgo/go/net/cgo_solaris.go b/third_party/gofrontend/libgo/go/net/cgo_solaris.go
deleted file mode 100644
index 05811c6..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_solaris.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo,!netgo
-
-package net
-
-/*
-#cgo LDFLAGS: -lsocket -lnsl -lsendfile
-#include <netdb.h>
-*/
-
-import "syscall"
-
-const cgoAddrInfoFlags = syscall.AI_CANONNAME | syscall.AI_V4MAPPED | syscall.AI_ALL
diff --git a/third_party/gofrontend/libgo/go/net/cgo_stub.go b/third_party/gofrontend/libgo/go/net/cgo_stub.go
deleted file mode 100644
index b86ff7d..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_stub.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !cgo netgo
-
-package net
-
-func init() { netGo = true }
-
-type addrinfoErrno int
-
-func (eai addrinfoErrno) Error() string   { return "<nil>" }
-func (eai addrinfoErrno) Temporary() bool { return false }
-func (eai addrinfoErrno) Timeout() bool   { return false }
-
-func cgoLookupHost(name string) (addrs []string, err error, completed bool) {
-	return nil, nil, false
-}
-
-func cgoLookupPort(network, service string) (port int, err error, completed bool) {
-	return 0, nil, false
-}
-
-func cgoLookupIP(name string) (addrs []IPAddr, err error, completed bool) {
-	return nil, nil, false
-}
-
-func cgoLookupCNAME(name string) (cname string, err error, completed bool) {
-	return "", nil, false
-}
-
-func cgoLookupPTR(addr string) (ptrs []string, err error, completed bool) {
-	return nil, nil, false
-}
diff --git a/third_party/gofrontend/libgo/go/net/cgo_unix.go b/third_party/gofrontend/libgo/go/net/cgo_unix.go
deleted file mode 100644
index 8eafa8c..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_unix.go
+++ /dev/null
@@ -1,275 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo,!netgo
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package net
-
-/*
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-*/
-
-import (
-	"syscall"
-	"unsafe"
-)
-
-//extern getaddrinfo
-func libc_getaddrinfo(node *byte, service *byte, hints *syscall.Addrinfo, res **syscall.Addrinfo) int
-
-//extern freeaddrinfo
-func libc_freeaddrinfo(res *syscall.Addrinfo)
-
-//extern gai_strerror
-func libc_gai_strerror(errcode int) *byte
-
-// bytePtrToString takes a NUL-terminated array of bytes and convert
-// it to a Go string.
-func bytePtrToString(p *byte) string {
-	a := (*[10000]byte)(unsafe.Pointer(p))
-	i := 0
-	for a[i] != 0 {
-		i++
-	}
-	return string(a[:i])
-}
-
-// An addrinfoErrno represents a getaddrinfo, getnameinfo-specific
-// error number. It's a signed number and a zero value is a non-error
-// by convention.
-type addrinfoErrno int
-
-func (eai addrinfoErrno) Error() string   { return bytePtrToString(libc_gai_strerror(int(eai))) }
-func (eai addrinfoErrno) Temporary() bool { return eai == syscall.EAI_AGAIN }
-func (eai addrinfoErrno) Timeout() bool   { return false }
-
-func cgoLookupHost(name string) (hosts []string, err error, completed bool) {
-	addrs, err, completed := cgoLookupIP(name)
-	for _, addr := range addrs {
-		hosts = append(hosts, addr.String())
-	}
-	return
-}
-
-func cgoLookupPort(network, service string) (port int, err error, completed bool) {
-	acquireThread()
-	defer releaseThread()
-
-	var hints syscall.Addrinfo
-	switch network {
-	case "": // no hints
-	case "tcp", "tcp4", "tcp6":
-		hints.Ai_socktype = syscall.SOCK_STREAM
-		hints.Ai_protocol = syscall.IPPROTO_TCP
-	case "udp", "udp4", "udp6":
-		hints.Ai_socktype = syscall.SOCK_DGRAM
-		hints.Ai_protocol = syscall.IPPROTO_UDP
-	default:
-		return 0, &DNSError{Err: "unknown network", Name: network + "/" + service}, true
-	}
-	if len(network) >= 4 {
-		switch network[3] {
-		case '4':
-			hints.Ai_family = syscall.AF_INET
-		case '6':
-			hints.Ai_family = syscall.AF_INET6
-		}
-	}
-
-	s := syscall.StringBytePtr(service)
-	var res *syscall.Addrinfo
-	syscall.Entersyscall()
-	gerrno := libc_getaddrinfo(nil, s, &hints, &res)
-	syscall.Exitsyscall()
-	if gerrno != 0 {
-		switch gerrno {
-		case syscall.EAI_SYSTEM:
-			errno := syscall.GetErrno()
-			if errno == 0 { // see golang.org/issue/6232
-				errno = syscall.EMFILE
-			}
-			err = errno
-		default:
-			err = addrinfoErrno(gerrno)
-		}
-		return 0, &DNSError{Err: err.Error(), Name: network + "/" + service}, true
-	}
-	defer libc_freeaddrinfo(res)
-
-	for r := res; r != nil; r = r.Ai_next {
-		switch r.Ai_family {
-		case syscall.AF_INET:
-			sa := (*syscall.RawSockaddrInet4)(unsafe.Pointer(r.Ai_addr))
-			p := (*[2]byte)(unsafe.Pointer(&sa.Port))
-			return int(p[0])<<8 | int(p[1]), nil, true
-		case syscall.AF_INET6:
-			sa := (*syscall.RawSockaddrInet6)(unsafe.Pointer(r.Ai_addr))
-			p := (*[2]byte)(unsafe.Pointer(&sa.Port))
-			return int(p[0])<<8 | int(p[1]), nil, true
-		}
-	}
-	return 0, &DNSError{Err: "unknown port", Name: network + "/" + service}, true
-}
-
-func cgoLookupIPCNAME(name string) (addrs []IPAddr, cname string, err error, completed bool) {
-	acquireThread()
-	defer releaseThread()
-
-	var hints syscall.Addrinfo
-	hints.Ai_flags = int32(cgoAddrInfoFlags)
-	hints.Ai_socktype = syscall.SOCK_STREAM
-
-	h := syscall.StringBytePtr(name)
-	var res *syscall.Addrinfo
-	syscall.Entersyscall()
-	gerrno := libc_getaddrinfo(h, nil, &hints, &res)
-	syscall.Exitsyscall()
-	if gerrno != 0 {
-		switch gerrno {
-		case syscall.EAI_SYSTEM:
-			errno := syscall.GetErrno()
-			if errno == 0 {
-				// err should not be nil, but sometimes getaddrinfo returns
-				// gerrno == C.EAI_SYSTEM with err == nil on Linux.
-				// The report claims that it happens when we have too many
-				// open files, so use syscall.EMFILE (too many open files in system).
-				// Most system calls would return ENFILE (too many open files),
-				// so at the least EMFILE should be easy to recognize if this
-				// comes up again. golang.org/issue/6232.
-				errno = syscall.EMFILE
-			}
-			err = errno
-		case syscall.EAI_NONAME:
-			err = errNoSuchHost
-		default:
-			err = addrinfoErrno(gerrno)
-		}
-		return nil, "", &DNSError{Err: err.Error(), Name: name}, true
-	}
-	defer libc_freeaddrinfo(res)
-
-	if res != nil {
-		cname = bytePtrToString((*byte)(unsafe.Pointer(res.Ai_canonname)))
-		if cname == "" {
-			cname = name
-		}
-		if len(cname) > 0 && cname[len(cname)-1] != '.' {
-			cname += "."
-		}
-	}
-	for r := res; r != nil; r = r.Ai_next {
-		// We only asked for SOCK_STREAM, but check anyhow.
-		if r.Ai_socktype != syscall.SOCK_STREAM {
-			continue
-		}
-		switch r.Ai_family {
-		case syscall.AF_INET:
-			sa := (*syscall.RawSockaddrInet4)(unsafe.Pointer(r.Ai_addr))
-			addr := IPAddr{IP: copyIP(sa.Addr[:])}
-			addrs = append(addrs, addr)
-		case syscall.AF_INET6:
-			sa := (*syscall.RawSockaddrInet6)(unsafe.Pointer(r.Ai_addr))
-			addr := IPAddr{IP: copyIP(sa.Addr[:]), Zone: zoneToString(int(sa.Scope_id))}
-			addrs = append(addrs, addr)
-		}
-	}
-	return addrs, cname, nil, true
-}
-
-func cgoLookupIP(name string) (addrs []IPAddr, err error, completed bool) {
-	addrs, _, err, completed = cgoLookupIPCNAME(name)
-	return
-}
-
-func cgoLookupCNAME(name string) (cname string, err error, completed bool) {
-	_, cname, err, completed = cgoLookupIPCNAME(name)
-	return
-}
-
-// These are roughly enough for the following:
-//
-// Source		Encoding			Maximum length of single name entry
-// Unicast DNS		ASCII or			<=253 + a NUL terminator
-//			Unicode in RFC 5892		252 * total number of labels + delimiters + a NUL terminator
-// Multicast DNS	UTF-8 in RFC 5198 or		<=253 + a NUL terminator
-//			the same as unicast DNS ASCII	<=253 + a NUL terminator
-// Local database	various				depends on implementation
-const (
-	nameinfoLen    = 64
-	maxNameinfoLen = 4096
-)
-
-func cgoLookupPTR(addr string) ([]string, error, bool) {
-	acquireThread()
-	defer releaseThread()
-
-	ip := ParseIP(addr)
-	if ip == nil {
-		return nil, &DNSError{Err: "invalid address", Name: addr}, true
-	}
-	sa, salen := cgoSockaddr(ip)
-	if sa == nil {
-		return nil, &DNSError{Err: "invalid address " + ip.String(), Name: addr}, true
-	}
-	var err error
-	var b []byte
-	var gerrno int
-	for l := nameinfoLen; l <= maxNameinfoLen; l *= 2 {
-		b = make([]byte, l)
-		gerrno, err = cgoNameinfoPTR(b, sa, salen)
-		if gerrno == 0 || gerrno != syscall.EAI_OVERFLOW {
-			break
-		}
-	}
-	if gerrno != 0 {
-		switch gerrno {
-		case syscall.EAI_SYSTEM:
-			if err == nil { // see golang.org/issue/6232
-				err = syscall.EMFILE
-			}
-		default:
-			err = addrinfoErrno(gerrno)
-		}
-		return nil, &DNSError{Err: err.Error(), Name: addr}, true
-	}
-
-	for i := 0; i < len(b); i++ {
-		if b[i] == 0 {
-			b = b[:i]
-			break
-		}
-	}
-	// Add trailing dot to match pure Go reverse resolver
-	// and all other lookup routines. See golang.org/issue/12189.
-	if len(b) > 0 && b[len(b)-1] != '.' {
-		b = append(b, '.')
-	}
-	return []string{string(b)}, nil, true
-}
-
-func cgoSockaddr(ip IP) (*syscall.RawSockaddr, syscall.Socklen_t) {
-	if ip4 := ip.To4(); ip4 != nil {
-		return cgoSockaddrInet4(ip4), syscall.Socklen_t(syscall.SizeofSockaddrInet4)
-	}
-	if ip6 := ip.To16(); ip6 != nil {
-		return cgoSockaddrInet6(ip6), syscall.Socklen_t(syscall.SizeofSockaddrInet6)
-	}
-	return nil, 0
-}
-
-func copyIP(x IP) IP {
-	if len(x) < 16 {
-		return x.To16()
-	}
-	y := make(IP, len(x))
-	copy(y, x)
-	return y
-}
diff --git a/third_party/gofrontend/libgo/go/net/cgo_unix_test.go b/third_party/gofrontend/libgo/go/net/cgo_unix_test.go
deleted file mode 100644
index 4d5ab23..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_unix_test.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo,!netgo
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package net
-
-import "testing"
-
-func TestCgoLookupIP(t *testing.T) {
-	host := "localhost"
-	_, err, ok := cgoLookupIP(host)
-	if !ok {
-		t.Errorf("cgoLookupIP must not be a placeholder")
-	}
-	if err != nil {
-		t.Error(err)
-	}
-	if _, err := goLookupIP(host); err != nil {
-		t.Error(err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/cgo_windows.go b/third_party/gofrontend/libgo/go/net/cgo_windows.go
deleted file mode 100644
index 8968b75..0000000
--- a/third_party/gofrontend/libgo/go/net/cgo_windows.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo,!netgo
-
-package net
-
-type addrinfoErrno int
-
-func (eai addrinfoErrno) Error() string   { return "<nil>" }
-func (eai addrinfoErrno) Temporary() bool { return false }
-func (eai addrinfoErrno) Timeout() bool   { return false }
diff --git a/third_party/gofrontend/libgo/go/net/conf.go b/third_party/gofrontend/libgo/go/net/conf.go
deleted file mode 100644
index c92e579..0000000
--- a/third_party/gofrontend/libgo/go/net/conf.go
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package net
-
-import (
-	"os"
-	"runtime"
-	"strconv"
-	"sync"
-	"syscall"
-)
-
-// conf represents a system's network configuration.
-type conf struct {
-	// forceCgoLookupHost forces CGO to always be used, if available.
-	forceCgoLookupHost bool
-
-	netGo  bool // go DNS resolution forced
-	netCgo bool // cgo DNS resolution forced
-
-	// machine has an /etc/mdns.allow file
-	hasMDNSAllow bool
-
-	goos          string // the runtime.GOOS, to ease testing
-	dnsDebugLevel int
-
-	nss    *nssConf
-	resolv *dnsConfig
-}
-
-var (
-	confOnce sync.Once // guards init of confVal via initConfVal
-	confVal  = &conf{goos: runtime.GOOS}
-)
-
-// systemConf returns the machine's network configuration.
-func systemConf() *conf {
-	confOnce.Do(initConfVal)
-	return confVal
-}
-
-func initConfVal() {
-	dnsMode, debugLevel := goDebugNetDNS()
-	confVal.dnsDebugLevel = debugLevel
-	confVal.netGo = netGo || dnsMode == "go"
-	confVal.netCgo = netCgo || dnsMode == "cgo"
-
-	if confVal.dnsDebugLevel > 0 {
-		defer func() {
-			switch {
-			case confVal.netGo:
-				if netGo {
-					println("go package net: built with netgo build tag; using Go's DNS resolver")
-				} else {
-					println("go package net: GODEBUG setting forcing use of Go's resolver")
-				}
-			case confVal.forceCgoLookupHost:
-				println("go package net: using cgo DNS resolver")
-			default:
-				println("go package net: dynamic selection of DNS resolver")
-			}
-		}()
-	}
-
-	// Darwin pops up annoying dialog boxes if programs try to do
-	// their own DNS requests. So always use cgo instead, which
-	// avoids that.
-	if runtime.GOOS == "darwin" {
-		confVal.forceCgoLookupHost = true
-		return
-	}
-
-	// If any environment-specified resolver options are specified,
-	// force cgo. Note that LOCALDOMAIN can change behavior merely
-	// by being specified with the empty string.
-	_, localDomainDefined := syscall.Getenv("LOCALDOMAIN")
-	if os.Getenv("RES_OPTIONS") != "" ||
-		os.Getenv("HOSTALIASES") != "" ||
-		confVal.netCgo ||
-		localDomainDefined {
-		confVal.forceCgoLookupHost = true
-		return
-	}
-
-	// OpenBSD apparently lets you override the location of resolv.conf
-	// with ASR_CONFIG. If we notice that, defer to libc.
-	if runtime.GOOS == "openbsd" && os.Getenv("ASR_CONFIG") != "" {
-		confVal.forceCgoLookupHost = true
-		return
-	}
-
-	if runtime.GOOS != "openbsd" {
-		confVal.nss = parseNSSConfFile("/etc/nsswitch.conf")
-	}
-
-	confVal.resolv = dnsReadConfig("/etc/resolv.conf")
-	if confVal.resolv.err != nil && !os.IsNotExist(confVal.resolv.err) &&
-		!os.IsPermission(confVal.resolv.err) {
-		// If we can't read the resolv.conf file, assume it
-		// had something important in it and defer to cgo.
-		// libc's resolver might then fail too, but at least
-		// it wasn't our fault.
-		confVal.forceCgoLookupHost = true
-	}
-
-	if _, err := os.Stat("/etc/mdns.allow"); err == nil {
-		confVal.hasMDNSAllow = true
-	}
-}
-
-// canUseCgo reports whether calling cgo functions is allowed
-// for non-hostname lookups.
-func (c *conf) canUseCgo() bool {
-	return c.hostLookupOrder("") == hostLookupCgo
-}
-
-// hostLookupOrder determines which strategy to use to resolve hostname.
-func (c *conf) hostLookupOrder(hostname string) (ret hostLookupOrder) {
-	if c.dnsDebugLevel > 1 {
-		defer func() {
-			print("go package net: hostLookupOrder(", hostname, ") = ", ret.String(), "\n")
-		}()
-	}
-	if c.netGo {
-		return hostLookupFilesDNS
-	}
-	if c.forceCgoLookupHost || c.resolv.unknownOpt || c.goos == "android" {
-		return hostLookupCgo
-	}
-	if byteIndex(hostname, '\\') != -1 || byteIndex(hostname, '%') != -1 {
-		// Don't deal with special form hostnames with backslashes
-		// or '%'.
-		return hostLookupCgo
-	}
-
-	// OpenBSD is unique and doesn't use nsswitch.conf.
-	// It also doesn't support mDNS.
-	if c.goos == "openbsd" {
-		// OpenBSD's resolv.conf manpage says that a non-existent
-		// resolv.conf means "lookup" defaults to only "files",
-		// without DNS lookups.
-		if os.IsNotExist(c.resolv.err) {
-			return hostLookupFiles
-		}
-		lookup := c.resolv.lookup
-		if len(lookup) == 0 {
-			// http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man5/resolv.conf.5
-			// "If the lookup keyword is not used in the
-			// system's resolv.conf file then the assumed
-			// order is 'bind file'"
-			return hostLookupDNSFiles
-		}
-		if len(lookup) < 1 || len(lookup) > 2 {
-			return hostLookupCgo
-		}
-		switch lookup[0] {
-		case "bind":
-			if len(lookup) == 2 {
-				if lookup[1] == "file" {
-					return hostLookupDNSFiles
-				}
-				return hostLookupCgo
-			}
-			return hostLookupDNS
-		case "file":
-			if len(lookup) == 2 {
-				if lookup[1] == "bind" {
-					return hostLookupFilesDNS
-				}
-				return hostLookupCgo
-			}
-			return hostLookupFiles
-		default:
-			return hostLookupCgo
-		}
-	}
-
-	hasDot := byteIndex(hostname, '.') != -1
-
-	// Canonicalize the hostname by removing any trailing dot.
-	if stringsHasSuffix(hostname, ".") {
-		hostname = hostname[:len(hostname)-1]
-	}
-	if stringsHasSuffixFold(hostname, ".local") {
-		// Per RFC 6762, the ".local" TLD is special.  And
-		// because Go's native resolver doesn't do mDNS or
-		// similar local resolution mechanisms, assume that
-		// libc might (via Avahi, etc) and use cgo.
-		return hostLookupCgo
-	}
-
-	nss := c.nss
-	srcs := nss.sources["hosts"]
-	// If /etc/nsswitch.conf doesn't exist or doesn't specify any
-	// sources for "hosts", assume Go's DNS will work fine.
-	if os.IsNotExist(nss.err) || (nss.err == nil && len(srcs) == 0) {
-		if c.goos == "solaris" {
-			// illumos defaults to "nis [NOTFOUND=return] files"
-			return hostLookupCgo
-		}
-		if c.goos == "linux" {
-			// glibc says the default is "dns [!UNAVAIL=return] files"
-			// http://www.gnu.org/software/libc/manual/html_node/Notes-on-NSS-Configuration-File.html.
-			return hostLookupDNSFiles
-		}
-		return hostLookupFilesDNS
-	}
-	if nss.err != nil {
-		// We failed to parse or open nsswitch.conf, so
-		// conservatively assume we should use cgo if it's
-		// available.
-		return hostLookupCgo
-	}
-
-	var mdnsSource, filesSource, dnsSource bool
-	var first string
-	for _, src := range srcs {
-		if src.source == "myhostname" {
-			if hasDot {
-				continue
-			}
-			return hostLookupCgo
-		}
-		if src.source == "files" || src.source == "dns" {
-			if !src.standardCriteria() {
-				return hostLookupCgo // non-standard; let libc deal with it.
-			}
-			if src.source == "files" {
-				filesSource = true
-			} else if src.source == "dns" {
-				dnsSource = true
-			}
-			if first == "" {
-				first = src.source
-			}
-			continue
-		}
-		if stringsHasPrefix(src.source, "mdns") {
-			// e.g. "mdns4", "mdns4_minimal"
-			// We already returned true before if it was *.local.
-			// libc wouldn't have found a hit on this anyway.
-			mdnsSource = true
-			continue
-		}
-		// Some source we don't know how to deal with.
-		return hostLookupCgo
-	}
-
-	// We don't parse mdns.allow files. They're rare. If one
-	// exists, it might list other TLDs (besides .local) or even
-	// '*', so just let libc deal with it.
-	if mdnsSource && c.hasMDNSAllow {
-		return hostLookupCgo
-	}
-
-	// Cases where Go can handle it without cgo and C thread
-	// overhead.
-	switch {
-	case filesSource && dnsSource:
-		if first == "files" {
-			return hostLookupFilesDNS
-		} else {
-			return hostLookupDNSFiles
-		}
-	case filesSource:
-		return hostLookupFiles
-	case dnsSource:
-		return hostLookupDNS
-	}
-
-	// Something weird. Let libc deal with it.
-	return hostLookupCgo
-}
-
-// goDebugNetDNS parses the value of the GODEBUG "netdns" value.
-// The netdns value can be of the form:
-//    1       // debug level 1
-//    2       // debug level 2
-//    cgo     // use cgo for DNS lookups
-//    go      // use go for DNS lookups
-//    cgo+1   // use cgo for DNS lookups + debug level 1
-//    1+cgo   // same
-//    cgo+2   // same, but debug level 2
-// etc.
-func goDebugNetDNS() (dnsMode string, debugLevel int) {
-	goDebug := goDebugString("netdns")
-	parsePart := func(s string) {
-		if s == "" {
-			return
-		}
-		if '0' <= s[0] && s[0] <= '9' {
-			debugLevel, _ = strconv.Atoi(s)
-		} else {
-			dnsMode = s
-		}
-	}
-	if i := byteIndex(goDebug, '+'); i != -1 {
-		parsePart(goDebug[:i])
-		parsePart(goDebug[i+1:])
-		return
-	}
-	parsePart(goDebug)
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/net/conf_netcgo.go b/third_party/gofrontend/libgo/go/net/conf_netcgo.go
deleted file mode 100644
index b66bae3..0000000
--- a/third_party/gofrontend/libgo/go/net/conf_netcgo.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build netcgo
-
-package net
-
-/*
-
-// Fail if cgo isn't available.
-
-*/
-
-// The build tag "netcgo" forces use of the cgo DNS resolver.
-// It is the opposite of "netgo".
-func init() { netCgo = true }
diff --git a/third_party/gofrontend/libgo/go/net/conf_test.go b/third_party/gofrontend/libgo/go/net/conf_test.go
deleted file mode 100644
index 86904bf..0000000
--- a/third_party/gofrontend/libgo/go/net/conf_test.go
+++ /dev/null
@@ -1,301 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package net
-
-import (
-	"os"
-	"strings"
-	"testing"
-)
-
-type nssHostTest struct {
-	host string
-	want hostLookupOrder
-}
-
-func nssStr(s string) *nssConf { return parseNSSConf(strings.NewReader(s)) }
-
-// represents a dnsConfig returned by parsing a nonexistent resolv.conf
-var defaultResolvConf = &dnsConfig{
-	servers:  defaultNS,
-	ndots:    1,
-	timeout:  5,
-	attempts: 2,
-	err:      os.ErrNotExist,
-}
-
-func TestConfHostLookupOrder(t *testing.T) {
-	tests := []struct {
-		name      string
-		c         *conf
-		goos      string
-		hostTests []nssHostTest
-	}{
-		{
-			name: "force",
-			c: &conf{
-				forceCgoLookupHost: true,
-				nss:                nssStr("foo: bar"),
-				resolv:             defaultResolvConf,
-			},
-			hostTests: []nssHostTest{
-				{"foo.local", hostLookupCgo},
-				{"google.com", hostLookupCgo},
-			},
-		},
-		{
-			name: "ubuntu_trusty_avahi",
-			c: &conf{
-				nss:    nssStr("hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4"),
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{
-				{"foo.local", hostLookupCgo},
-				{"foo.local.", hostLookupCgo},
-				{"foo.LOCAL", hostLookupCgo},
-				{"foo.LOCAL.", hostLookupCgo},
-				{"google.com", hostLookupFilesDNS},
-			},
-		},
-		{
-			name: "freebsdlinux_no_resolv_conf",
-			c: &conf{
-				goos:   "freebsd",
-				nss:    nssStr("foo: bar"),
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{{"google.com", hostLookupFilesDNS}},
-		},
-		// On OpenBSD, no resolv.conf means no DNS.
-		{
-			name: "openbsd_no_resolv_conf",
-			c: &conf{
-				goos:   "openbsd",
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{{"google.com", hostLookupFiles}},
-		},
-		{
-			name: "solaris_no_nsswitch",
-			c: &conf{
-				goos:   "solaris",
-				nss:    &nssConf{err: os.ErrNotExist},
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{{"google.com", hostLookupCgo}},
-		},
-		{
-			name: "openbsd_lookup_bind_file",
-			c: &conf{
-				goos:   "openbsd",
-				resolv: &dnsConfig{lookup: []string{"bind", "file"}},
-			},
-			hostTests: []nssHostTest{
-				{"google.com", hostLookupDNSFiles},
-				{"foo.local", hostLookupDNSFiles},
-			},
-		},
-		{
-			name: "openbsd_lookup_file_bind",
-			c: &conf{
-				goos:   "openbsd",
-				resolv: &dnsConfig{lookup: []string{"file", "bind"}},
-			},
-			hostTests: []nssHostTest{{"google.com", hostLookupFilesDNS}},
-		},
-		{
-			name: "openbsd_lookup_bind",
-			c: &conf{
-				goos:   "openbsd",
-				resolv: &dnsConfig{lookup: []string{"bind"}},
-			},
-			hostTests: []nssHostTest{{"google.com", hostLookupDNS}},
-		},
-		{
-			name: "openbsd_lookup_file",
-			c: &conf{
-				goos:   "openbsd",
-				resolv: &dnsConfig{lookup: []string{"file"}},
-			},
-			hostTests: []nssHostTest{{"google.com", hostLookupFiles}},
-		},
-		{
-			name: "openbsd_lookup_yp",
-			c: &conf{
-				goos:   "openbsd",
-				resolv: &dnsConfig{lookup: []string{"file", "bind", "yp"}},
-			},
-			hostTests: []nssHostTest{{"google.com", hostLookupCgo}},
-		},
-		{
-			name: "openbsd_lookup_two",
-			c: &conf{
-				goos:   "openbsd",
-				resolv: &dnsConfig{lookup: []string{"file", "foo"}},
-			},
-			hostTests: []nssHostTest{{"google.com", hostLookupCgo}},
-		},
-		{
-			name: "openbsd_lookup_empty",
-			c: &conf{
-				goos:   "openbsd",
-				resolv: &dnsConfig{lookup: nil},
-			},
-			hostTests: []nssHostTest{{"google.com", hostLookupDNSFiles}},
-		},
-		// glibc lacking an nsswitch.conf, per
-		// http://www.gnu.org/software/libc/manual/html_node/Notes-on-NSS-Configuration-File.html
-		{
-			name: "linux_no_nsswitch.conf",
-			c: &conf{
-				goos:   "linux",
-				nss:    &nssConf{err: os.ErrNotExist},
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{{"google.com", hostLookupDNSFiles}},
-		},
-		{
-			name: "files_mdns_dns",
-			c: &conf{
-				nss:    nssStr("hosts: files mdns dns"),
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{
-				{"x.com", hostLookupFilesDNS},
-				{"x.local", hostLookupCgo},
-			},
-		},
-		{
-			name: "dns_special_hostnames",
-			c: &conf{
-				nss:    nssStr("hosts: dns"),
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{
-				{"x.com", hostLookupDNS},
-				{"x\\.com", hostLookupCgo},     // punt on weird glibc escape
-				{"foo.com%en0", hostLookupCgo}, // and IPv6 zones
-			},
-		},
-		{
-			name: "mdns_allow",
-			c: &conf{
-				nss:          nssStr("hosts: files mdns dns"),
-				resolv:       defaultResolvConf,
-				hasMDNSAllow: true,
-			},
-			hostTests: []nssHostTest{
-				{"x.com", hostLookupCgo},
-				{"x.local", hostLookupCgo},
-			},
-		},
-		{
-			name: "files_dns",
-			c: &conf{
-				nss:    nssStr("hosts: files dns"),
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{
-				{"x.com", hostLookupFilesDNS},
-				{"x", hostLookupFilesDNS},
-				{"x.local", hostLookupCgo},
-			},
-		},
-		{
-			name: "dns_files",
-			c: &conf{
-				nss:    nssStr("hosts: dns files"),
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{
-				{"x.com", hostLookupDNSFiles},
-				{"x", hostLookupDNSFiles},
-				{"x.local", hostLookupCgo},
-			},
-		},
-		{
-			name: "something_custom",
-			c: &conf{
-				nss:    nssStr("hosts: dns files something_custom"),
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{
-				{"x.com", hostLookupCgo},
-			},
-		},
-		{
-			name: "myhostname",
-			c: &conf{
-				nss:    nssStr("hosts: files dns myhostname"),
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{
-				{"x.com", hostLookupFilesDNS},
-				{"somehostname", hostLookupCgo},
-			},
-		},
-		{
-			name: "ubuntu14.04.02",
-			c: &conf{
-				nss:    nssStr("hosts: files myhostname mdns4_minimal [NOTFOUND=return] dns mdns4"),
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{
-				{"x.com", hostLookupFilesDNS},
-				{"somehostname", hostLookupCgo},
-			},
-		},
-		// Debian Squeeze is just "dns,files", but lists all
-		// the default criteria for dns, but then has a
-		// non-standard but redundant notfound=return for the
-		// files.
-		{
-			name: "debian_squeeze",
-			c: &conf{
-				nss:    nssStr("hosts: dns [success=return notfound=continue unavail=continue tryagain=continue] files [notfound=return]"),
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{
-				{"x.com", hostLookupDNSFiles},
-				{"somehostname", hostLookupDNSFiles},
-			},
-		},
-		{
-			name: "resolv.conf-unknown",
-			c: &conf{
-				nss:    nssStr("foo: bar"),
-				resolv: &dnsConfig{servers: defaultNS, ndots: 1, timeout: 5, attempts: 2, unknownOpt: true},
-			},
-			hostTests: []nssHostTest{{"google.com", hostLookupCgo}},
-		},
-		// Android should always use cgo.
-		{
-			name: "android",
-			c: &conf{
-				goos:   "android",
-				nss:    nssStr(""),
-				resolv: defaultResolvConf,
-			},
-			hostTests: []nssHostTest{
-				{"x.com", hostLookupCgo},
-			},
-		},
-	}
-	for _, tt := range tests {
-		for _, ht := range tt.hostTests {
-			gotOrder := tt.c.hostLookupOrder(ht.host)
-			if gotOrder != ht.want {
-				t.Errorf("%s: hostLookupOrder(%q) = %v; want %v", tt.name, ht.host, gotOrder, ht.want)
-			}
-		}
-	}
-
-}
-
-func TestSystemConf(t *testing.T) {
-	systemConf()
-}
diff --git a/third_party/gofrontend/libgo/go/net/conn_test.go b/third_party/gofrontend/libgo/go/net/conn_test.go
deleted file mode 100644
index 6995c11..0000000
--- a/third_party/gofrontend/libgo/go/net/conn_test.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements API tests across platforms and will never have a build
-// tag.
-
-package net
-
-import (
-	"testing"
-	"time"
-)
-
-// someTimeout is used just to test that net.Conn implementations
-// don't explode when their SetFooDeadline methods are called.
-// It isn't actually used for testing timeouts.
-const someTimeout = 10 * time.Second
-
-func TestConnAndListener(t *testing.T) {
-	for i, network := range []string{"tcp", "unix", "unixpacket"} {
-		if !testableNetwork(network) {
-			t.Logf("skipping %s test", network)
-			continue
-		}
-
-		ls, err := newLocalServer(network)
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer ls.teardown()
-		ch := make(chan error, 1)
-		handler := func(ls *localServer, ln Listener) { transponder(ln, ch) }
-		if err := ls.buildup(handler); err != nil {
-			t.Fatal(err)
-		}
-		if ls.Listener.Addr().Network() != network {
-			t.Fatalf("got %s; want %s", ls.Listener.Addr().Network(), network)
-		}
-
-		c, err := Dial(ls.Listener.Addr().Network(), ls.Listener.Addr().String())
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer c.Close()
-		if c.LocalAddr().Network() != network || c.LocalAddr().Network() != network {
-			t.Fatalf("got %s->%s; want %s->%s", c.LocalAddr().Network(), c.RemoteAddr().Network(), network, network)
-		}
-		c.SetDeadline(time.Now().Add(someTimeout))
-		c.SetReadDeadline(time.Now().Add(someTimeout))
-		c.SetWriteDeadline(time.Now().Add(someTimeout))
-
-		if _, err := c.Write([]byte("CONN AND LISTENER TEST")); err != nil {
-			t.Fatal(err)
-		}
-		rb := make([]byte, 128)
-		if _, err := c.Read(rb); err != nil {
-			t.Fatal(err)
-		}
-
-		for err := range ch {
-			t.Errorf("#%d: %v", i, err)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/dial.go b/third_party/gofrontend/libgo/go/net/dial.go
deleted file mode 100644
index cb4ec21..0000000
--- a/third_party/gofrontend/libgo/go/net/dial.go
+++ /dev/null
@@ -1,431 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"errors"
-	"time"
-)
-
-// A Dialer contains options for connecting to an address.
-//
-// The zero value for each field is equivalent to dialing
-// without that option. Dialing with the zero value of Dialer
-// is therefore equivalent to just calling the Dial function.
-type Dialer struct {
-	// Timeout is the maximum amount of time a dial will wait for
-	// a connect to complete. If Deadline is also set, it may fail
-	// earlier.
-	//
-	// The default is no timeout.
-	//
-	// When dialing a name with multiple IP addresses, the timeout
-	// may be divided between them.
-	//
-	// With or without a timeout, the operating system may impose
-	// its own earlier timeout. For instance, TCP timeouts are
-	// often around 3 minutes.
-	Timeout time.Duration
-
-	// Deadline is the absolute point in time after which dials
-	// will fail. If Timeout is set, it may fail earlier.
-	// Zero means no deadline, or dependent on the operating system
-	// as with the Timeout option.
-	Deadline time.Time
-
-	// LocalAddr is the local address to use when dialing an
-	// address. The address must be of a compatible type for the
-	// network being dialed.
-	// If nil, a local address is automatically chosen.
-	LocalAddr Addr
-
-	// DualStack enables RFC 6555-compliant "Happy Eyeballs" dialing
-	// when the network is "tcp" and the destination is a host name
-	// with both IPv4 and IPv6 addresses. This allows a client to
-	// tolerate networks where one address family is silently broken.
-	DualStack bool
-
-	// FallbackDelay specifies the length of time to wait before
-	// spawning a fallback connection, when DualStack is enabled.
-	// If zero, a default delay of 300ms is used.
-	FallbackDelay time.Duration
-
-	// KeepAlive specifies the keep-alive period for an active
-	// network connection.
-	// If zero, keep-alives are not enabled. Network protocols
-	// that do not support keep-alives ignore this field.
-	KeepAlive time.Duration
-}
-
-// Return either now+Timeout or Deadline, whichever comes first.
-// Or zero, if neither is set.
-func (d *Dialer) deadline(now time.Time) time.Time {
-	if d.Timeout == 0 {
-		return d.Deadline
-	}
-	timeoutDeadline := now.Add(d.Timeout)
-	if d.Deadline.IsZero() || timeoutDeadline.Before(d.Deadline) {
-		return timeoutDeadline
-	} else {
-		return d.Deadline
-	}
-}
-
-// partialDeadline returns the deadline to use for a single address,
-// when multiple addresses are pending.
-func partialDeadline(now, deadline time.Time, addrsRemaining int) (time.Time, error) {
-	if deadline.IsZero() {
-		return deadline, nil
-	}
-	timeRemaining := deadline.Sub(now)
-	if timeRemaining <= 0 {
-		return time.Time{}, errTimeout
-	}
-	// Tentatively allocate equal time to each remaining address.
-	timeout := timeRemaining / time.Duration(addrsRemaining)
-	// If the time per address is too short, steal from the end of the list.
-	const saneMinimum = 2 * time.Second
-	if timeout < saneMinimum {
-		if timeRemaining < saneMinimum {
-			timeout = timeRemaining
-		} else {
-			timeout = saneMinimum
-		}
-	}
-	return now.Add(timeout), nil
-}
-
-func (d *Dialer) fallbackDelay() time.Duration {
-	if d.FallbackDelay > 0 {
-		return d.FallbackDelay
-	} else {
-		return 300 * time.Millisecond
-	}
-}
-
-func parseNetwork(net string) (afnet string, proto int, err error) {
-	i := last(net, ':')
-	if i < 0 { // no colon
-		switch net {
-		case "tcp", "tcp4", "tcp6":
-		case "udp", "udp4", "udp6":
-		case "ip", "ip4", "ip6":
-		case "unix", "unixgram", "unixpacket":
-		default:
-			return "", 0, UnknownNetworkError(net)
-		}
-		return net, 0, nil
-	}
-	afnet = net[:i]
-	switch afnet {
-	case "ip", "ip4", "ip6":
-		protostr := net[i+1:]
-		proto, i, ok := dtoi(protostr, 0)
-		if !ok || i != len(protostr) {
-			proto, err = lookupProtocol(protostr)
-			if err != nil {
-				return "", 0, err
-			}
-		}
-		return afnet, proto, nil
-	}
-	return "", 0, UnknownNetworkError(net)
-}
-
-func resolveAddrList(op, net, addr string, deadline time.Time) (addrList, error) {
-	afnet, _, err := parseNetwork(net)
-	if err != nil {
-		return nil, err
-	}
-	if op == "dial" && addr == "" {
-		return nil, errMissingAddress
-	}
-	switch afnet {
-	case "unix", "unixgram", "unixpacket":
-		addr, err := ResolveUnixAddr(afnet, addr)
-		if err != nil {
-			return nil, err
-		}
-		return addrList{addr}, nil
-	}
-	return internetAddrList(afnet, addr, deadline)
-}
-
-// Dial connects to the address on the named network.
-//
-// Known networks are "tcp", "tcp4" (IPv4-only), "tcp6" (IPv6-only),
-// "udp", "udp4" (IPv4-only), "udp6" (IPv6-only), "ip", "ip4"
-// (IPv4-only), "ip6" (IPv6-only), "unix", "unixgram" and
-// "unixpacket".
-//
-// For TCP and UDP networks, addresses have the form host:port.
-// If host is a literal IPv6 address it must be enclosed
-// in square brackets as in "[::1]:80" or "[ipv6-host%zone]:80".
-// The functions JoinHostPort and SplitHostPort manipulate addresses
-// in this form.
-//
-// Examples:
-//	Dial("tcp", "12.34.56.78:80")
-//	Dial("tcp", "google.com:http")
-//	Dial("tcp", "[2001:db8::1]:http")
-//	Dial("tcp", "[fe80::1%lo0]:80")
-//
-// For IP networks, the network must be "ip", "ip4" or "ip6" followed
-// by a colon and a protocol number or name and the addr must be a
-// literal IP address.
-//
-// Examples:
-//	Dial("ip4:1", "127.0.0.1")
-//	Dial("ip6:ospf", "::1")
-//
-// For Unix networks, the address must be a file system path.
-func Dial(network, address string) (Conn, error) {
-	var d Dialer
-	return d.Dial(network, address)
-}
-
-// DialTimeout acts like Dial but takes a timeout.
-// The timeout includes name resolution, if required.
-func DialTimeout(network, address string, timeout time.Duration) (Conn, error) {
-	d := Dialer{Timeout: timeout}
-	return d.Dial(network, address)
-}
-
-// dialContext holds common state for all dial operations.
-type dialContext struct {
-	Dialer
-	network, address string
-	finalDeadline    time.Time
-}
-
-// Dial connects to the address on the named network.
-//
-// See func Dial for a description of the network and address
-// parameters.
-func (d *Dialer) Dial(network, address string) (Conn, error) {
-	finalDeadline := d.deadline(time.Now())
-	addrs, err := resolveAddrList("dial", network, address, finalDeadline)
-	if err != nil {
-		return nil, &OpError{Op: "dial", Net: network, Source: nil, Addr: nil, Err: err}
-	}
-
-	ctx := &dialContext{
-		Dialer:        *d,
-		network:       network,
-		address:       address,
-		finalDeadline: finalDeadline,
-	}
-
-	var primaries, fallbacks addrList
-	if d.DualStack && network == "tcp" {
-		primaries, fallbacks = addrs.partition(isIPv4)
-	} else {
-		primaries = addrs
-	}
-
-	var c Conn
-	if len(fallbacks) == 0 {
-		// dialParallel can accept an empty fallbacks list,
-		// but this shortcut avoids the goroutine/channel overhead.
-		c, err = dialSerial(ctx, primaries, nil)
-	} else {
-		c, err = dialParallel(ctx, primaries, fallbacks)
-	}
-
-	if d.KeepAlive > 0 && err == nil {
-		if tc, ok := c.(*TCPConn); ok {
-			setKeepAlive(tc.fd, true)
-			setKeepAlivePeriod(tc.fd, d.KeepAlive)
-			testHookSetKeepAlive()
-		}
-	}
-	return c, err
-}
-
-// dialParallel races two copies of dialSerial, giving the first a
-// head start. It returns the first established connection and
-// closes the others. Otherwise it returns an error from the first
-// primary address.
-func dialParallel(ctx *dialContext, primaries, fallbacks addrList) (Conn, error) {
-	results := make(chan dialResult) // unbuffered, so dialSerialAsync can detect race loss & cleanup
-	cancel := make(chan struct{})
-	defer close(cancel)
-
-	// Spawn the primary racer.
-	go dialSerialAsync(ctx, primaries, nil, cancel, results)
-
-	// Spawn the fallback racer.
-	fallbackTimer := time.NewTimer(ctx.fallbackDelay())
-	go dialSerialAsync(ctx, fallbacks, fallbackTimer, cancel, results)
-
-	var primaryErr error
-	for nracers := 2; nracers > 0; nracers-- {
-		res := <-results
-		// If we're still waiting for a connection, then hasten the delay.
-		// Otherwise, disable the Timer and let cancel take over.
-		if fallbackTimer.Stop() && res.error != nil {
-			fallbackTimer.Reset(0)
-		}
-		if res.error == nil {
-			return res.Conn, nil
-		}
-		if res.primary {
-			primaryErr = res.error
-		}
-	}
-	return nil, primaryErr
-}
-
-type dialResult struct {
-	Conn
-	error
-	primary bool
-}
-
-// dialSerialAsync runs dialSerial after some delay, and returns the
-// resulting connection through a channel. When racing two connections,
-// the primary goroutine uses a nil timer to omit the delay.
-func dialSerialAsync(ctx *dialContext, ras addrList, timer *time.Timer, cancel <-chan struct{}, results chan<- dialResult) {
-	if timer != nil {
-		// We're in the fallback goroutine; sleep before connecting.
-		select {
-		case <-timer.C:
-		case <-cancel:
-			return
-		}
-	}
-	c, err := dialSerial(ctx, ras, cancel)
-	select {
-	case results <- dialResult{c, err, timer == nil}:
-		// We won the race.
-	case <-cancel:
-		// The other goroutine won the race.
-		if c != nil {
-			c.Close()
-		}
-	}
-}
-
-// dialSerial connects to a list of addresses in sequence, returning
-// either the first successful connection, or the first error.
-func dialSerial(ctx *dialContext, ras addrList, cancel <-chan struct{}) (Conn, error) {
-	var firstErr error // The error from the first address is most relevant.
-
-	for i, ra := range ras {
-		select {
-		case <-cancel:
-			return nil, &OpError{Op: "dial", Net: ctx.network, Source: ctx.LocalAddr, Addr: ra, Err: errCanceled}
-		default:
-		}
-
-		partialDeadline, err := partialDeadline(time.Now(), ctx.finalDeadline, len(ras)-i)
-		if err != nil {
-			// Ran out of time.
-			if firstErr == nil {
-				firstErr = &OpError{Op: "dial", Net: ctx.network, Source: ctx.LocalAddr, Addr: ra, Err: err}
-			}
-			break
-		}
-
-		// dialTCP does not support cancelation (see golang.org/issue/11225),
-		// so if cancel fires, we'll continue trying to connect until the next
-		// timeout, or return a spurious connection for the caller to close.
-		dialer := func(d time.Time) (Conn, error) {
-			return dialSingle(ctx, ra, d)
-		}
-		c, err := dial(ctx.network, ra, dialer, partialDeadline)
-		if err == nil {
-			return c, nil
-		}
-		if firstErr == nil {
-			firstErr = err
-		}
-	}
-
-	if firstErr == nil {
-		firstErr = &OpError{Op: "dial", Net: ctx.network, Source: nil, Addr: nil, Err: errMissingAddress}
-	}
-	return nil, firstErr
-}
-
-// dialSingle attempts to establish and returns a single connection to
-// the destination address. This must be called through the OS-specific
-// dial function, because some OSes don't implement the deadline feature.
-func dialSingle(ctx *dialContext, ra Addr, deadline time.Time) (c Conn, err error) {
-	la := ctx.LocalAddr
-	if la != nil && la.Network() != ra.Network() {
-		return nil, &OpError{Op: "dial", Net: ctx.network, Source: la, Addr: ra, Err: errors.New("mismatched local address type " + la.Network())}
-	}
-	switch ra := ra.(type) {
-	case *TCPAddr:
-		la, _ := la.(*TCPAddr)
-		c, err = testHookDialTCP(ctx.network, la, ra, deadline)
-	case *UDPAddr:
-		la, _ := la.(*UDPAddr)
-		c, err = dialUDP(ctx.network, la, ra, deadline)
-	case *IPAddr:
-		la, _ := la.(*IPAddr)
-		c, err = dialIP(ctx.network, la, ra, deadline)
-	case *UnixAddr:
-		la, _ := la.(*UnixAddr)
-		c, err = dialUnix(ctx.network, la, ra, deadline)
-	default:
-		return nil, &OpError{Op: "dial", Net: ctx.network, Source: la, Addr: ra, Err: &AddrError{Err: "unexpected address type", Addr: ctx.address}}
-	}
-	if err != nil {
-		return nil, err // c is non-nil interface containing nil pointer
-	}
-	return c, nil
-}
-
-// Listen announces on the local network address laddr.
-// The network net must be a stream-oriented network: "tcp", "tcp4",
-// "tcp6", "unix" or "unixpacket".
-// See Dial for the syntax of laddr.
-func Listen(net, laddr string) (Listener, error) {
-	addrs, err := resolveAddrList("listen", net, laddr, noDeadline)
-	if err != nil {
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: nil, Err: err}
-	}
-	var l Listener
-	switch la := addrs.first(isIPv4).(type) {
-	case *TCPAddr:
-		l, err = ListenTCP(net, la)
-	case *UnixAddr:
-		l, err = ListenUnix(net, la)
-	default:
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: la, Err: &AddrError{Err: "unexpected address type", Addr: laddr}}
-	}
-	if err != nil {
-		return nil, err // l is non-nil interface containing nil pointer
-	}
-	return l, nil
-}
-
-// ListenPacket announces on the local network address laddr.
-// The network net must be a packet-oriented network: "udp", "udp4",
-// "udp6", "ip", "ip4", "ip6" or "unixgram".
-// See Dial for the syntax of laddr.
-func ListenPacket(net, laddr string) (PacketConn, error) {
-	addrs, err := resolveAddrList("listen", net, laddr, noDeadline)
-	if err != nil {
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: nil, Err: err}
-	}
-	var l PacketConn
-	switch la := addrs.first(isIPv4).(type) {
-	case *UDPAddr:
-		l, err = ListenUDP(net, la)
-	case *IPAddr:
-		l, err = ListenIP(net, la)
-	case *UnixAddr:
-		l, err = ListenUnixgram(net, la)
-	default:
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: la, Err: &AddrError{Err: "unexpected address type", Addr: laddr}}
-	}
-	if err != nil {
-		return nil, err // l is non-nil interface containing nil pointer
-	}
-	return l, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/dial_gen.go b/third_party/gofrontend/libgo/go/net/dial_gen.go
deleted file mode 100644
index a628f71..0000000
--- a/third_party/gofrontend/libgo/go/net/dial_gen.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build windows plan9
-
-package net
-
-import "time"
-
-// dialChannel is the simple pure-Go implementation of dial, still
-// used on operating systems where the deadline hasn't been pushed
-// down into the pollserver. (Plan 9 and some old versions of Windows)
-func dialChannel(net string, ra Addr, dialer func(time.Time) (Conn, error), deadline time.Time) (Conn, error) {
-	if deadline.IsZero() {
-		return dialer(noDeadline)
-	}
-	timeout := deadline.Sub(time.Now())
-	if timeout <= 0 {
-		return nil, &OpError{Op: "dial", Net: net, Source: nil, Addr: ra, Err: errTimeout}
-	}
-	t := time.NewTimer(timeout)
-	defer t.Stop()
-	type racer struct {
-		Conn
-		error
-	}
-	ch := make(chan racer, 1)
-	go func() {
-		testHookDialChannel()
-		c, err := dialer(noDeadline)
-		ch <- racer{c, err}
-	}()
-	select {
-	case <-t.C:
-		return nil, &OpError{Op: "dial", Net: net, Source: nil, Addr: ra, Err: errTimeout}
-	case racer := <-ch:
-		return racer.Conn, racer.error
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/dial_test.go b/third_party/gofrontend/libgo/go/net/dial_test.go
deleted file mode 100644
index ed6d7cc..0000000
--- a/third_party/gofrontend/libgo/go/net/dial_test.go
+++ /dev/null
@@ -1,715 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"io"
-	"net/internal/socktest"
-	"runtime"
-	"sync"
-	"testing"
-	"time"
-)
-
-var prohibitionaryDialArgTests = []struct {
-	network string
-	address string
-}{
-	{"tcp6", "127.0.0.1"},
-	{"tcp6", "::ffff:127.0.0.1"},
-}
-
-func TestProhibitionaryDialArg(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv4map {
-		t.Skip("mapping ipv4 address inside ipv6 address not supported")
-	}
-
-	ln, err := Listen("tcp", "[::]:0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-
-	_, port, err := SplitHostPort(ln.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	for i, tt := range prohibitionaryDialArgTests {
-		c, err := Dial(tt.network, JoinHostPort(tt.address, port))
-		if err == nil {
-			c.Close()
-			t.Errorf("#%d: %v", i, err)
-		}
-	}
-}
-
-func TestSelfConnect(t *testing.T) {
-	if runtime.GOOS == "windows" {
-		// TODO(brainman): do not know why it hangs.
-		t.Skip("known-broken test on windows")
-	}
-
-	// Test that Dial does not honor self-connects.
-	// See the comment in DialTCP.
-
-	// Find a port that would be used as a local address.
-	l, err := Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	c, err := Dial("tcp", l.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	addr := c.LocalAddr().String()
-	c.Close()
-	l.Close()
-
-	// Try to connect to that address repeatedly.
-	n := 100000
-	if testing.Short() {
-		n = 1000
-	}
-	switch runtime.GOOS {
-	case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd", "plan9", "solaris", "windows":
-		// Non-Linux systems take a long time to figure
-		// out that there is nothing listening on localhost.
-		n = 100
-	}
-	for i := 0; i < n; i++ {
-		c, err := DialTimeout("tcp", addr, time.Millisecond)
-		if err == nil {
-			if c.LocalAddr().String() == addr {
-				t.Errorf("#%d: Dial %q self-connect", i, addr)
-			} else {
-				t.Logf("#%d: Dial %q succeeded - possibly racing with other listener", i, addr)
-			}
-			c.Close()
-		}
-	}
-}
-
-func TestDialTimeoutFDLeak(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("%s does not have full support of socktest", runtime.GOOS)
-	}
-
-	const T = 100 * time.Millisecond
-
-	switch runtime.GOOS {
-	case "plan9", "windows":
-		origTestHookDialChannel := testHookDialChannel
-		testHookDialChannel = func() { time.Sleep(2 * T) }
-		defer func() { testHookDialChannel = origTestHookDialChannel }()
-		if runtime.GOOS == "plan9" {
-			break
-		}
-		fallthrough
-	default:
-		sw.Set(socktest.FilterConnect, func(so *socktest.Status) (socktest.AfterFilter, error) {
-			time.Sleep(2 * T)
-			return nil, errTimeout
-		})
-		defer sw.Set(socktest.FilterConnect, nil)
-	}
-
-	// Avoid tracking open-close jitterbugs between netFD and
-	// socket that leads to confusion of information inside
-	// socktest.Switch.
-	// It may happen when the Dial call bumps against TCP
-	// simultaneous open. See selfConnect in tcpsock_posix.go.
-	defer func() {
-		sw.Set(socktest.FilterClose, nil)
-		forceCloseSockets()
-	}()
-	var mu sync.Mutex
-	var attempts int
-	sw.Set(socktest.FilterClose, func(so *socktest.Status) (socktest.AfterFilter, error) {
-		mu.Lock()
-		attempts++
-		mu.Unlock()
-		return nil, errTimedout
-	})
-
-	const N = 100
-	var wg sync.WaitGroup
-	wg.Add(N)
-	for i := 0; i < N; i++ {
-		go func() {
-			defer wg.Done()
-			// This dial never starts to send any SYN
-			// segment because of above socket filter and
-			// test hook.
-			c, err := DialTimeout("tcp", "127.0.0.1:0", T)
-			if err == nil {
-				t.Errorf("unexpectedly established: tcp:%s->%s", c.LocalAddr(), c.RemoteAddr())
-				c.Close()
-			}
-		}()
-	}
-	wg.Wait()
-	if attempts < N {
-		t.Errorf("got %d; want >= %d", attempts, N)
-	}
-}
-
-func TestDialerDualStackFDLeak(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("%s does not have full support of socktest", runtime.GOOS)
-	case "windows":
-		t.Skipf("not implemented a way to cancel dial racers in TCP SYN-SENT state on %s", runtime.GOOS)
-	}
-	if !supportsIPv4 || !supportsIPv6 {
-		t.Skip("both IPv4 and IPv6 are required")
-	}
-
-	origTestHookLookupIP := testHookLookupIP
-	defer func() { testHookLookupIP = origTestHookLookupIP }()
-	testHookLookupIP = lookupLocalhost
-	handler := func(dss *dualStackServer, ln Listener) {
-		for {
-			c, err := ln.Accept()
-			if err != nil {
-				return
-			}
-			c.Close()
-		}
-	}
-	dss, err := newDualStackServer([]streamListener{
-		{network: "tcp4", address: "127.0.0.1"},
-		{network: "tcp6", address: "::1"},
-	})
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer dss.teardown()
-	if err := dss.buildup(handler); err != nil {
-		t.Fatal(err)
-	}
-
-	before := sw.Sockets()
-	const T = 100 * time.Millisecond
-	const N = 10
-	var wg sync.WaitGroup
-	wg.Add(N)
-	d := &Dialer{DualStack: true, Timeout: T}
-	for i := 0; i < N; i++ {
-		go func() {
-			defer wg.Done()
-			c, err := d.Dial("tcp", JoinHostPort("localhost", dss.port))
-			if err != nil {
-				t.Error(err)
-				return
-			}
-			c.Close()
-		}()
-	}
-	wg.Wait()
-	time.Sleep(2 * T) // wait for the dial racers to stop
-	after := sw.Sockets()
-	if len(after) != len(before) {
-		t.Errorf("got %d; want %d", len(after), len(before))
-	}
-}
-
-// Define a pair of blackholed (IPv4, IPv6) addresses, for which dialTCP is
-// expected to hang until the timeout elapses. These addresses are reserved
-// for benchmarking by RFC 6890.
-const (
-	slowDst4    = "192.18.0.254"
-	slowDst6    = "2001:2::254"
-	slowTimeout = 1 * time.Second
-)
-
-// In some environments, the slow IPs may be explicitly unreachable, and fail
-// more quickly than expected. This test hook prevents dialTCP from returning
-// before the deadline.
-func slowDialTCP(net string, laddr, raddr *TCPAddr, deadline time.Time) (*TCPConn, error) {
-	c, err := dialTCP(net, laddr, raddr, deadline)
-	if ParseIP(slowDst4).Equal(raddr.IP) || ParseIP(slowDst6).Equal(raddr.IP) {
-		time.Sleep(deadline.Sub(time.Now()))
-	}
-	return c, err
-}
-
-func dialClosedPort() (actual, expected time.Duration) {
-	// Estimate the expected time for this platform.
-	// On Windows, dialing a closed port takes roughly 1 second,
-	// but other platforms should be instantaneous.
-	if runtime.GOOS == "windows" {
-		expected = 1500 * time.Millisecond
-	} else {
-		expected = 95 * time.Millisecond
-	}
-
-	l, err := Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		return 999 * time.Hour, expected
-	}
-	addr := l.Addr().String()
-	l.Close()
-	// On OpenBSD, interference from TestSelfConnect is mysteriously
-	// causing the first attempt to hang for a few seconds, so we throw
-	// away the first result and keep the second.
-	for i := 1; ; i++ {
-		startTime := time.Now()
-		c, err := Dial("tcp", addr)
-		if err == nil {
-			c.Close()
-		}
-		elapsed := time.Now().Sub(startTime)
-		if i == 2 {
-			return elapsed, expected
-		}
-	}
-}
-
-func TestDialParallel(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv4 || !supportsIPv6 {
-		t.Skip("both IPv4 and IPv6 are required")
-	}
-
-	closedPortDelay, expectClosedPortDelay := dialClosedPort()
-	if closedPortDelay > expectClosedPortDelay {
-		t.Errorf("got %v; want <= %v", closedPortDelay, expectClosedPortDelay)
-	}
-
-	const instant time.Duration = 0
-	const fallbackDelay = 200 * time.Millisecond
-
-	// Some cases will run quickly when "connection refused" is fast,
-	// or trigger the fallbackDelay on Windows.  This value holds the
-	// lesser of the two delays.
-	var closedPortOrFallbackDelay time.Duration
-	if closedPortDelay < fallbackDelay {
-		closedPortOrFallbackDelay = closedPortDelay
-	} else {
-		closedPortOrFallbackDelay = fallbackDelay
-	}
-
-	origTestHookDialTCP := testHookDialTCP
-	defer func() { testHookDialTCP = origTestHookDialTCP }()
-	testHookDialTCP = slowDialTCP
-
-	nCopies := func(s string, n int) []string {
-		out := make([]string, n)
-		for i := 0; i < n; i++ {
-			out[i] = s
-		}
-		return out
-	}
-
-	var testCases = []struct {
-		primaries       []string
-		fallbacks       []string
-		teardownNetwork string
-		expectOk        bool
-		expectElapsed   time.Duration
-	}{
-		// These should just work on the first try.
-		{[]string{"127.0.0.1"}, []string{}, "", true, instant},
-		{[]string{"::1"}, []string{}, "", true, instant},
-		{[]string{"127.0.0.1", "::1"}, []string{slowDst6}, "tcp6", true, instant},
-		{[]string{"::1", "127.0.0.1"}, []string{slowDst4}, "tcp4", true, instant},
-		// Primary is slow; fallback should kick in.
-		{[]string{slowDst4}, []string{"::1"}, "", true, fallbackDelay},
-		// Skip a "connection refused" in the primary thread.
-		{[]string{"127.0.0.1", "::1"}, []string{}, "tcp4", true, closedPortDelay},
-		{[]string{"::1", "127.0.0.1"}, []string{}, "tcp6", true, closedPortDelay},
-		// Skip a "connection refused" in the fallback thread.
-		{[]string{slowDst4, slowDst6}, []string{"::1", "127.0.0.1"}, "tcp6", true, fallbackDelay + closedPortDelay},
-		// Primary refused, fallback without delay.
-		{[]string{"127.0.0.1"}, []string{"::1"}, "tcp4", true, closedPortOrFallbackDelay},
-		{[]string{"::1"}, []string{"127.0.0.1"}, "tcp6", true, closedPortOrFallbackDelay},
-		// Everything is refused.
-		{[]string{"127.0.0.1"}, []string{}, "tcp4", false, closedPortDelay},
-		// Nothing to do; fail instantly.
-		{[]string{}, []string{}, "", false, instant},
-		// Connecting to tons of addresses should not trip the deadline.
-		{nCopies("::1", 1000), []string{}, "", true, instant},
-	}
-
-	handler := func(dss *dualStackServer, ln Listener) {
-		for {
-			c, err := ln.Accept()
-			if err != nil {
-				return
-			}
-			c.Close()
-		}
-	}
-
-	// Convert a list of IP strings into TCPAddrs.
-	makeAddrs := func(ips []string, port string) addrList {
-		var out addrList
-		for _, ip := range ips {
-			addr, err := ResolveTCPAddr("tcp", JoinHostPort(ip, port))
-			if err != nil {
-				t.Fatal(err)
-			}
-			out = append(out, addr)
-		}
-		return out
-	}
-
-	for i, tt := range testCases {
-		dss, err := newDualStackServer([]streamListener{
-			{network: "tcp4", address: "127.0.0.1"},
-			{network: "tcp6", address: "::1"},
-		})
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer dss.teardown()
-		if err := dss.buildup(handler); err != nil {
-			t.Fatal(err)
-		}
-		if tt.teardownNetwork != "" {
-			// Destroy one of the listening sockets, creating an unreachable port.
-			dss.teardownNetwork(tt.teardownNetwork)
-		}
-
-		primaries := makeAddrs(tt.primaries, dss.port)
-		fallbacks := makeAddrs(tt.fallbacks, dss.port)
-		d := Dialer{
-			FallbackDelay: fallbackDelay,
-			Timeout:       slowTimeout,
-		}
-		ctx := &dialContext{
-			Dialer:        d,
-			network:       "tcp",
-			address:       "?",
-			finalDeadline: d.deadline(time.Now()),
-		}
-		startTime := time.Now()
-		c, err := dialParallel(ctx, primaries, fallbacks)
-		elapsed := time.Now().Sub(startTime)
-
-		if c != nil {
-			c.Close()
-		}
-
-		if tt.expectOk && err != nil {
-			t.Errorf("#%d: got %v; want nil", i, err)
-		} else if !tt.expectOk && err == nil {
-			t.Errorf("#%d: got nil; want non-nil", i)
-		}
-
-		expectElapsedMin := tt.expectElapsed - 95*time.Millisecond
-		expectElapsedMax := tt.expectElapsed + 95*time.Millisecond
-		if !(elapsed >= expectElapsedMin) {
-			t.Errorf("#%d: got %v; want >= %v", i, elapsed, expectElapsedMin)
-		} else if !(elapsed <= expectElapsedMax) {
-			t.Errorf("#%d: got %v; want <= %v", i, elapsed, expectElapsedMax)
-		}
-	}
-	// Wait for any slowDst4/slowDst6 connections to timeout.
-	time.Sleep(slowTimeout * 3 / 2)
-}
-
-func lookupSlowFast(fn func(string) ([]IPAddr, error), host string) ([]IPAddr, error) {
-	switch host {
-	case "slow6loopback4":
-		// Returns a slow IPv6 address, and a local IPv4 address.
-		return []IPAddr{
-			{IP: ParseIP(slowDst6)},
-			{IP: ParseIP("127.0.0.1")},
-		}, nil
-	default:
-		return fn(host)
-	}
-}
-
-func TestDialerFallbackDelay(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv4 || !supportsIPv6 {
-		t.Skip("both IPv4 and IPv6 are required")
-	}
-
-	origTestHookLookupIP := testHookLookupIP
-	defer func() { testHookLookupIP = origTestHookLookupIP }()
-	testHookLookupIP = lookupSlowFast
-
-	origTestHookDialTCP := testHookDialTCP
-	defer func() { testHookDialTCP = origTestHookDialTCP }()
-	testHookDialTCP = slowDialTCP
-
-	var testCases = []struct {
-		dualstack     bool
-		delay         time.Duration
-		expectElapsed time.Duration
-	}{
-		// Use a very brief delay, which should fallback immediately.
-		{true, 1 * time.Nanosecond, 0},
-		// Use a 200ms explicit timeout.
-		{true, 200 * time.Millisecond, 200 * time.Millisecond},
-		// The default is 300ms.
-		{true, 0, 300 * time.Millisecond},
-		// This case is last, in order to wait for hanging slowDst6 connections.
-		{false, 0, slowTimeout},
-	}
-
-	handler := func(dss *dualStackServer, ln Listener) {
-		for {
-			c, err := ln.Accept()
-			if err != nil {
-				return
-			}
-			c.Close()
-		}
-	}
-	dss, err := newDualStackServer([]streamListener{
-		{network: "tcp", address: "127.0.0.1"},
-	})
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer dss.teardown()
-	if err := dss.buildup(handler); err != nil {
-		t.Fatal(err)
-	}
-
-	for i, tt := range testCases {
-		d := &Dialer{DualStack: tt.dualstack, FallbackDelay: tt.delay, Timeout: slowTimeout}
-
-		startTime := time.Now()
-		c, err := d.Dial("tcp", JoinHostPort("slow6loopback4", dss.port))
-		elapsed := time.Now().Sub(startTime)
-		if err == nil {
-			c.Close()
-		} else if tt.dualstack {
-			t.Error(err)
-		}
-		expectMin := tt.expectElapsed - 1*time.Millisecond
-		expectMax := tt.expectElapsed + 95*time.Millisecond
-		if !(elapsed >= expectMin) {
-			t.Errorf("#%d: got %v; want >= %v", i, elapsed, expectMin)
-		}
-		if !(elapsed <= expectMax) {
-			t.Errorf("#%d: got %v; want <= %v", i, elapsed, expectMax)
-		}
-	}
-}
-
-func TestDialSerialAsyncSpuriousConnection(t *testing.T) {
-	ln, err := newLocalListener("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-
-	d := Dialer{}
-	ctx := &dialContext{
-		Dialer:        d,
-		network:       "tcp",
-		address:       "?",
-		finalDeadline: d.deadline(time.Now()),
-	}
-
-	results := make(chan dialResult)
-	cancel := make(chan struct{})
-
-	// Spawn a connection in the background.
-	go dialSerialAsync(ctx, addrList{ln.Addr()}, nil, cancel, results)
-
-	// Receive it at the server.
-	c, err := ln.Accept()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	// Tell dialSerialAsync that someone else won the race.
-	close(cancel)
-
-	// The connection should close itself, without sending data.
-	c.SetReadDeadline(time.Now().Add(1 * time.Second))
-	var b [1]byte
-	if _, err := c.Read(b[:]); err != io.EOF {
-		t.Errorf("got %v; want %v", err, io.EOF)
-	}
-}
-
-func TestDialerPartialDeadline(t *testing.T) {
-	now := time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC)
-	var testCases = []struct {
-		now            time.Time
-		deadline       time.Time
-		addrs          int
-		expectDeadline time.Time
-		expectErr      error
-	}{
-		// Regular division.
-		{now, now.Add(12 * time.Second), 1, now.Add(12 * time.Second), nil},
-		{now, now.Add(12 * time.Second), 2, now.Add(6 * time.Second), nil},
-		{now, now.Add(12 * time.Second), 3, now.Add(4 * time.Second), nil},
-		// Bump against the 2-second sane minimum.
-		{now, now.Add(12 * time.Second), 999, now.Add(2 * time.Second), nil},
-		// Total available is now below the sane minimum.
-		{now, now.Add(1900 * time.Millisecond), 999, now.Add(1900 * time.Millisecond), nil},
-		// Null deadline.
-		{now, noDeadline, 1, noDeadline, nil},
-		// Step the clock forward and cross the deadline.
-		{now.Add(-1 * time.Millisecond), now, 1, now, nil},
-		{now.Add(0 * time.Millisecond), now, 1, noDeadline, errTimeout},
-		{now.Add(1 * time.Millisecond), now, 1, noDeadline, errTimeout},
-	}
-	for i, tt := range testCases {
-		deadline, err := partialDeadline(tt.now, tt.deadline, tt.addrs)
-		if err != tt.expectErr {
-			t.Errorf("#%d: got %v; want %v", i, err, tt.expectErr)
-		}
-		if deadline != tt.expectDeadline {
-			t.Errorf("#%d: got %v; want %v", i, deadline, tt.expectDeadline)
-		}
-	}
-}
-
-func TestDialerLocalAddr(t *testing.T) {
-	ch := make(chan error, 1)
-	handler := func(ls *localServer, ln Listener) {
-		c, err := ln.Accept()
-		if err != nil {
-			ch <- err
-			return
-		}
-		defer c.Close()
-		ch <- nil
-	}
-	ls, err := newLocalServer("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ls.teardown()
-	if err := ls.buildup(handler); err != nil {
-		t.Fatal(err)
-	}
-
-	laddr, err := ResolveTCPAddr(ls.Listener.Addr().Network(), ls.Listener.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	laddr.Port = 0
-	d := &Dialer{LocalAddr: laddr}
-	c, err := d.Dial(ls.Listener.Addr().Network(), ls.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-	c.Read(make([]byte, 1))
-	err = <-ch
-	if err != nil {
-		t.Error(err)
-	}
-}
-
-func TestDialerDualStack(t *testing.T) {
-	if !supportsIPv4 || !supportsIPv6 {
-		t.Skip("both IPv4 and IPv6 are required")
-	}
-
-	closedPortDelay, expectClosedPortDelay := dialClosedPort()
-	if closedPortDelay > expectClosedPortDelay {
-		t.Errorf("got %v; want <= %v", closedPortDelay, expectClosedPortDelay)
-	}
-
-	origTestHookLookupIP := testHookLookupIP
-	defer func() { testHookLookupIP = origTestHookLookupIP }()
-	testHookLookupIP = lookupLocalhost
-	handler := func(dss *dualStackServer, ln Listener) {
-		for {
-			c, err := ln.Accept()
-			if err != nil {
-				return
-			}
-			c.Close()
-		}
-	}
-
-	var timeout = 100*time.Millisecond + closedPortDelay
-	for _, dualstack := range []bool{false, true} {
-		dss, err := newDualStackServer([]streamListener{
-			{network: "tcp4", address: "127.0.0.1"},
-			{network: "tcp6", address: "::1"},
-		})
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer dss.teardown()
-		if err := dss.buildup(handler); err != nil {
-			t.Fatal(err)
-		}
-
-		d := &Dialer{DualStack: dualstack, Timeout: timeout}
-		for range dss.lns {
-			c, err := d.Dial("tcp", JoinHostPort("localhost", dss.port))
-			if err != nil {
-				t.Error(err)
-				continue
-			}
-			switch addr := c.LocalAddr().(*TCPAddr); {
-			case addr.IP.To4() != nil:
-				dss.teardownNetwork("tcp4")
-			case addr.IP.To16() != nil && addr.IP.To4() == nil:
-				dss.teardownNetwork("tcp6")
-			}
-			c.Close()
-		}
-	}
-	time.Sleep(timeout * 3 / 2) // wait for the dial racers to stop
-}
-
-func TestDialerKeepAlive(t *testing.T) {
-	handler := func(ls *localServer, ln Listener) {
-		for {
-			c, err := ln.Accept()
-			if err != nil {
-				return
-			}
-			c.Close()
-		}
-	}
-	ls, err := newLocalServer("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ls.teardown()
-	if err := ls.buildup(handler); err != nil {
-		t.Fatal(err)
-	}
-	defer func() { testHookSetKeepAlive = func() {} }()
-
-	for _, keepAlive := range []bool{false, true} {
-		got := false
-		testHookSetKeepAlive = func() { got = true }
-		var d Dialer
-		if keepAlive {
-			d.KeepAlive = 30 * time.Second
-		}
-		c, err := d.Dial("tcp", ls.Listener.Addr().String())
-		if err != nil {
-			t.Fatal(err)
-		}
-		c.Close()
-		if got != keepAlive {
-			t.Errorf("Dialer.KeepAlive = %v: SetKeepAlive called = %v, want %v", d.KeepAlive, got, !got)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/dnsclient.go b/third_party/gofrontend/libgo/go/net/dnsclient.go
deleted file mode 100644
index ce48521..0000000
--- a/third_party/gofrontend/libgo/go/net/dnsclient.go
+++ /dev/null
@@ -1,238 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"math/rand"
-	"sort"
-)
-
-// reverseaddr returns the in-addr.arpa. or ip6.arpa. hostname of the IP
-// address addr suitable for rDNS (PTR) record lookup or an error if it fails
-// to parse the IP address.
-func reverseaddr(addr string) (arpa string, err error) {
-	ip := ParseIP(addr)
-	if ip == nil {
-		return "", &DNSError{Err: "unrecognized address", Name: addr}
-	}
-	if ip.To4() != nil {
-		return uitoa(uint(ip[15])) + "." + uitoa(uint(ip[14])) + "." + uitoa(uint(ip[13])) + "." + uitoa(uint(ip[12])) + ".in-addr.arpa.", nil
-	}
-	// Must be IPv6
-	buf := make([]byte, 0, len(ip)*4+len("ip6.arpa."))
-	// Add it, in reverse, to the buffer
-	for i := len(ip) - 1; i >= 0; i-- {
-		v := ip[i]
-		buf = append(buf, hexDigit[v&0xF])
-		buf = append(buf, '.')
-		buf = append(buf, hexDigit[v>>4])
-		buf = append(buf, '.')
-	}
-	// Append "ip6.arpa." and return (buf already has the final .)
-	buf = append(buf, "ip6.arpa."...)
-	return string(buf), nil
-}
-
-// Find answer for name in dns message.
-// On return, if err == nil, addrs != nil.
-func answer(name, server string, dns *dnsMsg, qtype uint16) (cname string, addrs []dnsRR, err error) {
-	addrs = make([]dnsRR, 0, len(dns.answer))
-
-	if dns.rcode == dnsRcodeNameError && dns.recursion_available {
-		return "", nil, &DNSError{Err: errNoSuchHost.Error(), Name: name, Server: server}
-	}
-	if dns.rcode != dnsRcodeSuccess {
-		// None of the error codes make sense
-		// for the query we sent.  If we didn't get
-		// a name error and we didn't get success,
-		// the server is behaving incorrectly.
-		return "", nil, &DNSError{Err: "server misbehaving", Name: name, Server: server}
-	}
-
-	// Look for the name.
-	// Presotto says it's okay to assume that servers listed in
-	// /etc/resolv.conf are recursive resolvers.
-	// We asked for recursion, so it should have included
-	// all the answers we need in this one packet.
-Cname:
-	for cnameloop := 0; cnameloop < 10; cnameloop++ {
-		addrs = addrs[0:0]
-		for _, rr := range dns.answer {
-			if _, justHeader := rr.(*dnsRR_Header); justHeader {
-				// Corrupt record: we only have a
-				// header. That header might say it's
-				// of type qtype, but we don't
-				// actually have it. Skip.
-				continue
-			}
-			h := rr.Header()
-			if h.Class == dnsClassINET && equalASCIILabel(h.Name, name) {
-				switch h.Rrtype {
-				case qtype:
-					addrs = append(addrs, rr)
-				case dnsTypeCNAME:
-					// redirect to cname
-					name = rr.(*dnsRR_CNAME).Cname
-					continue Cname
-				}
-			}
-		}
-		if len(addrs) == 0 {
-			return "", nil, &DNSError{Err: errNoSuchHost.Error(), Name: name, Server: server}
-		}
-		return name, addrs, nil
-	}
-
-	return "", nil, &DNSError{Err: "too many redirects", Name: name, Server: server}
-}
-
-func equalASCIILabel(x, y string) bool {
-	if len(x) != len(y) {
-		return false
-	}
-	for i := 0; i < len(x); i++ {
-		a := x[i]
-		b := y[i]
-		if 'A' <= a && a <= 'Z' {
-			a += 0x20
-		}
-		if 'A' <= b && b <= 'Z' {
-			b += 0x20
-		}
-		if a != b {
-			return false
-		}
-	}
-	return true
-}
-
-func isDomainName(s string) bool {
-	// See RFC 1035, RFC 3696.
-	if len(s) == 0 {
-		return false
-	}
-	if len(s) > 255 {
-		return false
-	}
-
-	last := byte('.')
-	ok := false // Ok once we've seen a letter.
-	partlen := 0
-	for i := 0; i < len(s); i++ {
-		c := s[i]
-		switch {
-		default:
-			return false
-		case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || c == '_':
-			ok = true
-			partlen++
-		case '0' <= c && c <= '9':
-			// fine
-			partlen++
-		case c == '-':
-			// Byte before dash cannot be dot.
-			if last == '.' {
-				return false
-			}
-			partlen++
-		case c == '.':
-			// Byte before dot cannot be dot, dash.
-			if last == '.' || last == '-' {
-				return false
-			}
-			if partlen > 63 || partlen == 0 {
-				return false
-			}
-			partlen = 0
-		}
-		last = c
-	}
-	if last == '-' || partlen > 63 {
-		return false
-	}
-
-	return ok
-}
-
-// An SRV represents a single DNS SRV record.
-type SRV struct {
-	Target   string
-	Port     uint16
-	Priority uint16
-	Weight   uint16
-}
-
-// byPriorityWeight sorts SRV records by ascending priority and weight.
-type byPriorityWeight []*SRV
-
-func (s byPriorityWeight) Len() int { return len(s) }
-func (s byPriorityWeight) Less(i, j int) bool {
-	return s[i].Priority < s[j].Priority || (s[i].Priority == s[j].Priority && s[i].Weight < s[j].Weight)
-}
-func (s byPriorityWeight) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-
-// shuffleByWeight shuffles SRV records by weight using the algorithm
-// described in RFC 2782.
-func (addrs byPriorityWeight) shuffleByWeight() {
-	sum := 0
-	for _, addr := range addrs {
-		sum += int(addr.Weight)
-	}
-	for sum > 0 && len(addrs) > 1 {
-		s := 0
-		n := rand.Intn(sum)
-		for i := range addrs {
-			s += int(addrs[i].Weight)
-			if s > n {
-				if i > 0 {
-					addrs[0], addrs[i] = addrs[i], addrs[0]
-				}
-				break
-			}
-		}
-		sum -= int(addrs[0].Weight)
-		addrs = addrs[1:]
-	}
-}
-
-// sort reorders SRV records as specified in RFC 2782.
-func (addrs byPriorityWeight) sort() {
-	sort.Sort(addrs)
-	i := 0
-	for j := 1; j < len(addrs); j++ {
-		if addrs[i].Priority != addrs[j].Priority {
-			addrs[i:j].shuffleByWeight()
-			i = j
-		}
-	}
-	addrs[i:].shuffleByWeight()
-}
-
-// An MX represents a single DNS MX record.
-type MX struct {
-	Host string
-	Pref uint16
-}
-
-// byPref implements sort.Interface to sort MX records by preference
-type byPref []*MX
-
-func (s byPref) Len() int           { return len(s) }
-func (s byPref) Less(i, j int) bool { return s[i].Pref < s[j].Pref }
-func (s byPref) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
-
-// sort reorders MX records as specified in RFC 5321.
-func (s byPref) sort() {
-	for i := range s {
-		j := rand.Intn(i + 1)
-		s[i], s[j] = s[j], s[i]
-	}
-	sort.Sort(s)
-}
-
-// An NS represents a single DNS NS record.
-type NS struct {
-	Host string
-}
diff --git a/third_party/gofrontend/libgo/go/net/dnsclient_test.go b/third_party/gofrontend/libgo/go/net/dnsclient_test.go
deleted file mode 100644
index 3ab2b83..0000000
--- a/third_party/gofrontend/libgo/go/net/dnsclient_test.go
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"math/rand"
-	"testing"
-)
-
-func checkDistribution(t *testing.T, data []*SRV, margin float64) {
-	sum := 0
-	for _, srv := range data {
-		sum += int(srv.Weight)
-	}
-
-	results := make(map[string]int)
-
-	count := 1000
-	for j := 0; j < count; j++ {
-		d := make([]*SRV, len(data))
-		copy(d, data)
-		byPriorityWeight(d).shuffleByWeight()
-		key := d[0].Target
-		results[key] = results[key] + 1
-	}
-
-	actual := results[data[0].Target]
-	expected := float64(count) * float64(data[0].Weight) / float64(sum)
-	diff := float64(actual) - expected
-	t.Logf("actual: %v diff: %v e: %v m: %v", actual, diff, expected, margin)
-	if diff < 0 {
-		diff = -diff
-	}
-	if diff > (expected * margin) {
-		t.Errorf("missed target weight: expected %v, %v", expected, actual)
-	}
-}
-
-func testUniformity(t *testing.T, size int, margin float64) {
-	rand.Seed(1)
-	data := make([]*SRV, size)
-	for i := 0; i < size; i++ {
-		data[i] = &SRV{Target: string('a' + i), Weight: 1}
-	}
-	checkDistribution(t, data, margin)
-}
-
-func TestDNSSRVUniformity(t *testing.T) {
-	testUniformity(t, 2, 0.05)
-	testUniformity(t, 3, 0.10)
-	testUniformity(t, 10, 0.20)
-	testWeighting(t, 0.05)
-}
-
-func testWeighting(t *testing.T, margin float64) {
-	rand.Seed(1)
-	data := []*SRV{
-		{Target: "a", Weight: 60},
-		{Target: "b", Weight: 30},
-		{Target: "c", Weight: 10},
-	}
-	checkDistribution(t, data, margin)
-}
-
-func TestWeighting(t *testing.T) {
-	testWeighting(t, 0.05)
-}
diff --git a/third_party/gofrontend/libgo/go/net/dnsclient_unix.go b/third_party/gofrontend/libgo/go/net/dnsclient_unix.go
deleted file mode 100644
index c03c1b1..0000000
--- a/third_party/gofrontend/libgo/go/net/dnsclient_unix.go
+++ /dev/null
@@ -1,524 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-// DNS client: see RFC 1035.
-// Has to be linked into package net for Dial.
-
-// TODO(rsc):
-//	Could potentially handle many outstanding lookups faster.
-//	Could have a small cache.
-//	Random UDP source port (net.Dial should do that for us).
-//	Random request IDs.
-
-package net
-
-import (
-	"errors"
-	"io"
-	"math/rand"
-	"os"
-	"strconv"
-	"sync"
-	"time"
-)
-
-// A dnsConn represents a DNS transport endpoint.
-type dnsConn interface {
-	Conn
-
-	// readDNSResponse reads a DNS response message from the DNS
-	// transport endpoint and returns the received DNS response
-	// message.
-	readDNSResponse() (*dnsMsg, error)
-
-	// writeDNSQuery writes a DNS query message to the DNS
-	// connection endpoint.
-	writeDNSQuery(*dnsMsg) error
-}
-
-func (c *UDPConn) readDNSResponse() (*dnsMsg, error) {
-	b := make([]byte, 512) // see RFC 1035
-	n, err := c.Read(b)
-	if err != nil {
-		return nil, err
-	}
-	msg := &dnsMsg{}
-	if !msg.Unpack(b[:n]) {
-		return nil, errors.New("cannot unmarshal DNS message")
-	}
-	return msg, nil
-}
-
-func (c *UDPConn) writeDNSQuery(msg *dnsMsg) error {
-	b, ok := msg.Pack()
-	if !ok {
-		return errors.New("cannot marshal DNS message")
-	}
-	if _, err := c.Write(b); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (c *TCPConn) readDNSResponse() (*dnsMsg, error) {
-	b := make([]byte, 1280) // 1280 is a reasonable initial size for IP over Ethernet, see RFC 4035
-	if _, err := io.ReadFull(c, b[:2]); err != nil {
-		return nil, err
-	}
-	l := int(b[0])<<8 | int(b[1])
-	if l > len(b) {
-		b = make([]byte, l)
-	}
-	n, err := io.ReadFull(c, b[:l])
-	if err != nil {
-		return nil, err
-	}
-	msg := &dnsMsg{}
-	if !msg.Unpack(b[:n]) {
-		return nil, errors.New("cannot unmarshal DNS message")
-	}
-	return msg, nil
-}
-
-func (c *TCPConn) writeDNSQuery(msg *dnsMsg) error {
-	b, ok := msg.Pack()
-	if !ok {
-		return errors.New("cannot marshal DNS message")
-	}
-	l := uint16(len(b))
-	b = append([]byte{byte(l >> 8), byte(l)}, b...)
-	if _, err := c.Write(b); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *Dialer) dialDNS(network, server string) (dnsConn, error) {
-	switch network {
-	case "tcp", "tcp4", "tcp6", "udp", "udp4", "udp6":
-	default:
-		return nil, UnknownNetworkError(network)
-	}
-	// Calling Dial here is scary -- we have to be sure not to
-	// dial a name that will require a DNS lookup, or Dial will
-	// call back here to translate it. The DNS config parser has
-	// already checked that all the cfg.servers[i] are IP
-	// addresses, which Dial will use without a DNS lookup.
-	c, err := d.Dial(network, server)
-	if err != nil {
-		return nil, err
-	}
-	switch network {
-	case "tcp", "tcp4", "tcp6":
-		return c.(*TCPConn), nil
-	case "udp", "udp4", "udp6":
-		return c.(*UDPConn), nil
-	}
-	panic("unreachable")
-}
-
-// exchange sends a query on the connection and hopes for a response.
-func exchange(server, name string, qtype uint16, timeout time.Duration) (*dnsMsg, error) {
-	d := Dialer{Timeout: timeout}
-	out := dnsMsg{
-		dnsMsgHdr: dnsMsgHdr{
-			recursion_desired: true,
-		},
-		question: []dnsQuestion{
-			{name, qtype, dnsClassINET},
-		},
-	}
-	for _, network := range []string{"udp", "tcp"} {
-		c, err := d.dialDNS(network, server)
-		if err != nil {
-			return nil, err
-		}
-		defer c.Close()
-		if timeout > 0 {
-			c.SetDeadline(time.Now().Add(timeout))
-		}
-		out.id = uint16(rand.Int()) ^ uint16(time.Now().UnixNano())
-		if err := c.writeDNSQuery(&out); err != nil {
-			return nil, err
-		}
-		in, err := c.readDNSResponse()
-		if err != nil {
-			return nil, err
-		}
-		if in.id != out.id {
-			return nil, errors.New("DNS message ID mismatch")
-		}
-		if in.truncated { // see RFC 5966
-			continue
-		}
-		return in, nil
-	}
-	return nil, errors.New("no answer from DNS server")
-}
-
-// Do a lookup for a single name, which must be rooted
-// (otherwise answer will not find the answers).
-func tryOneName(cfg *dnsConfig, name string, qtype uint16) (string, []dnsRR, error) {
-	if len(cfg.servers) == 0 {
-		return "", nil, &DNSError{Err: "no DNS servers", Name: name}
-	}
-	if len(name) >= 256 {
-		return "", nil, &DNSError{Err: "DNS name too long", Name: name}
-	}
-	timeout := time.Duration(cfg.timeout) * time.Second
-	var lastErr error
-	for i := 0; i < cfg.attempts; i++ {
-		for _, server := range cfg.servers {
-			server = JoinHostPort(server, "53")
-			msg, err := exchange(server, name, qtype, timeout)
-			if err != nil {
-				lastErr = &DNSError{
-					Err:    err.Error(),
-					Name:   name,
-					Server: server,
-				}
-				if nerr, ok := err.(Error); ok && nerr.Timeout() {
-					lastErr.(*DNSError).IsTimeout = true
-				}
-				continue
-			}
-			cname, rrs, err := answer(name, server, msg, qtype)
-			if err == nil || msg.rcode == dnsRcodeSuccess || msg.rcode == dnsRcodeNameError && msg.recursion_available {
-				return cname, rrs, err
-			}
-			lastErr = err
-		}
-	}
-	return "", nil, lastErr
-}
-
-// addrRecordList converts and returns a list of IP addresses from DNS
-// address records (both A and AAAA). Other record types are ignored.
-func addrRecordList(rrs []dnsRR) []IPAddr {
-	addrs := make([]IPAddr, 0, 4)
-	for _, rr := range rrs {
-		switch rr := rr.(type) {
-		case *dnsRR_A:
-			addrs = append(addrs, IPAddr{IP: IPv4(byte(rr.A>>24), byte(rr.A>>16), byte(rr.A>>8), byte(rr.A))})
-		case *dnsRR_AAAA:
-			ip := make(IP, IPv6len)
-			copy(ip, rr.AAAA[:])
-			addrs = append(addrs, IPAddr{IP: ip})
-		}
-	}
-	return addrs
-}
-
-// A resolverConfig represents a DNS stub resolver configuration.
-type resolverConfig struct {
-	initOnce sync.Once // guards init of resolverConfig
-
-	// ch is used as a semaphore that only allows one lookup at a
-	// time to recheck resolv.conf.
-	ch          chan struct{} // guards lastChecked and modTime
-	lastChecked time.Time     // last time resolv.conf was checked
-	modTime     time.Time     // time of resolv.conf modification
-
-	mu        sync.RWMutex // protects dnsConfig
-	dnsConfig *dnsConfig   // parsed resolv.conf structure used in lookups
-}
-
-var resolvConf resolverConfig
-
-// init initializes conf and is only called via conf.initOnce.
-func (conf *resolverConfig) init() {
-	// Set dnsConfig, modTime, and lastChecked so we don't parse
-	// resolv.conf twice the first time.
-	conf.dnsConfig = systemConf().resolv
-	if conf.dnsConfig == nil {
-		conf.dnsConfig = dnsReadConfig("/etc/resolv.conf")
-	}
-
-	if fi, err := os.Stat("/etc/resolv.conf"); err == nil {
-		conf.modTime = fi.ModTime()
-	}
-	conf.lastChecked = time.Now()
-
-	// Prepare ch so that only one update of resolverConfig may
-	// run at once.
-	conf.ch = make(chan struct{}, 1)
-}
-
-// tryUpdate tries to update conf with the named resolv.conf file.
-// The name variable only exists for testing. It is otherwise always
-// "/etc/resolv.conf".
-func (conf *resolverConfig) tryUpdate(name string) {
-	conf.initOnce.Do(conf.init)
-
-	// Ensure only one update at a time checks resolv.conf.
-	if !conf.tryAcquireSema() {
-		return
-	}
-	defer conf.releaseSema()
-
-	now := time.Now()
-	if conf.lastChecked.After(now.Add(-5 * time.Second)) {
-		return
-	}
-	conf.lastChecked = now
-
-	if fi, err := os.Stat(name); err == nil {
-		if fi.ModTime().Equal(conf.modTime) {
-			return
-		}
-		conf.modTime = fi.ModTime()
-	} else {
-		// If modTime wasn't set prior, assume nothing has changed.
-		if conf.modTime.IsZero() {
-			return
-		}
-		conf.modTime = time.Time{}
-	}
-
-	dnsConf := dnsReadConfig(name)
-	conf.mu.Lock()
-	conf.dnsConfig = dnsConf
-	conf.mu.Unlock()
-}
-
-func (conf *resolverConfig) tryAcquireSema() bool {
-	select {
-	case conf.ch <- struct{}{}:
-		return true
-	default:
-		return false
-	}
-}
-
-func (conf *resolverConfig) releaseSema() {
-	<-conf.ch
-}
-
-func lookup(name string, qtype uint16) (cname string, rrs []dnsRR, err error) {
-	if !isDomainName(name) {
-		return "", nil, &DNSError{Err: "invalid domain name", Name: name}
-	}
-	resolvConf.tryUpdate("/etc/resolv.conf")
-	resolvConf.mu.RLock()
-	conf := resolvConf.dnsConfig
-	resolvConf.mu.RUnlock()
-	for _, fqdn := range conf.nameList(name) {
-		cname, rrs, err = tryOneName(conf, fqdn, qtype)
-		if err == nil {
-			break
-		}
-	}
-	if err, ok := err.(*DNSError); ok {
-		// Show original name passed to lookup, not suffixed one.
-		// In general we might have tried many suffixes; showing
-		// just one is misleading. See also golang.org/issue/6324.
-		err.Name = name
-	}
-	return
-}
-
-// nameList returns a list of names for sequential DNS queries.
-func (conf *dnsConfig) nameList(name string) []string {
-	// If name is rooted (trailing dot), try only that name.
-	rooted := len(name) > 0 && name[len(name)-1] == '.'
-	if rooted {
-		return []string{name}
-	}
-	// Build list of search choices.
-	names := make([]string, 0, 1+len(conf.search))
-	// If name has enough dots, try unsuffixed first.
-	if count(name, '.') >= conf.ndots {
-		names = append(names, name+".")
-	}
-	// Try suffixes.
-	for _, suffix := range conf.search {
-		suffixed := name + "." + suffix
-		if suffixed[len(suffixed)-1] != '.' {
-			suffixed += "."
-		}
-		names = append(names, suffixed)
-	}
-	// Try unsuffixed, if not tried first above.
-	if count(name, '.') < conf.ndots {
-		names = append(names, name+".")
-	}
-	return names
-}
-
-// hostLookupOrder specifies the order of LookupHost lookup strategies.
-// It is basically a simplified representation of nsswitch.conf.
-// "files" means /etc/hosts.
-type hostLookupOrder int
-
-const (
-	// hostLookupCgo means defer to cgo.
-	hostLookupCgo      hostLookupOrder = iota
-	hostLookupFilesDNS                 // files first
-	hostLookupDNSFiles                 // dns first
-	hostLookupFiles                    // only files
-	hostLookupDNS                      // only DNS
-)
-
-var lookupOrderName = map[hostLookupOrder]string{
-	hostLookupCgo:      "cgo",
-	hostLookupFilesDNS: "files,dns",
-	hostLookupDNSFiles: "dns,files",
-	hostLookupFiles:    "files",
-	hostLookupDNS:      "dns",
-}
-
-func (o hostLookupOrder) String() string {
-	if s, ok := lookupOrderName[o]; ok {
-		return s
-	}
-	return "hostLookupOrder=" + strconv.Itoa(int(o)) + "??"
-}
-
-// goLookupHost is the native Go implementation of LookupHost.
-// Used only if cgoLookupHost refuses to handle the request
-// (that is, only if cgoLookupHost is the stub in cgo_stub.go).
-// Normally we let cgo use the C library resolver instead of
-// depending on our lookup code, so that Go and C get the same
-// answers.
-func goLookupHost(name string) (addrs []string, err error) {
-	return goLookupHostOrder(name, hostLookupFilesDNS)
-}
-
-func goLookupHostOrder(name string, order hostLookupOrder) (addrs []string, err error) {
-	if order == hostLookupFilesDNS || order == hostLookupFiles {
-		// Use entries from /etc/hosts if they match.
-		addrs = lookupStaticHost(name)
-		if len(addrs) > 0 || order == hostLookupFiles {
-			return
-		}
-	}
-	ips, err := goLookupIPOrder(name, order)
-	if err != nil {
-		return
-	}
-	addrs = make([]string, 0, len(ips))
-	for _, ip := range ips {
-		addrs = append(addrs, ip.String())
-	}
-	return
-}
-
-// lookup entries from /etc/hosts
-func goLookupIPFiles(name string) (addrs []IPAddr) {
-	for _, haddr := range lookupStaticHost(name) {
-		haddr, zone := splitHostZone(haddr)
-		if ip := ParseIP(haddr); ip != nil {
-			addr := IPAddr{IP: ip, Zone: zone}
-			addrs = append(addrs, addr)
-		}
-	}
-	sortByRFC6724(addrs)
-	return
-}
-
-// goLookupIP is the native Go implementation of LookupIP.
-// The libc versions are in cgo_*.go.
-func goLookupIP(name string) (addrs []IPAddr, err error) {
-	return goLookupIPOrder(name, hostLookupFilesDNS)
-}
-
-func goLookupIPOrder(name string, order hostLookupOrder) (addrs []IPAddr, err error) {
-	if order == hostLookupFilesDNS || order == hostLookupFiles {
-		addrs = goLookupIPFiles(name)
-		if len(addrs) > 0 || order == hostLookupFiles {
-			return addrs, nil
-		}
-	}
-	if !isDomainName(name) {
-		return nil, &DNSError{Err: "invalid domain name", Name: name}
-	}
-	resolvConf.tryUpdate("/etc/resolv.conf")
-	resolvConf.mu.RLock()
-	conf := resolvConf.dnsConfig
-	resolvConf.mu.RUnlock()
-	type racer struct {
-		rrs []dnsRR
-		error
-	}
-	lane := make(chan racer, 1)
-	qtypes := [...]uint16{dnsTypeA, dnsTypeAAAA}
-	var lastErr error
-	for _, fqdn := range conf.nameList(name) {
-		for _, qtype := range qtypes {
-			go func(qtype uint16) {
-				_, rrs, err := tryOneName(conf, fqdn, qtype)
-				lane <- racer{rrs, err}
-			}(qtype)
-		}
-		for range qtypes {
-			racer := <-lane
-			if racer.error != nil {
-				lastErr = racer.error
-				continue
-			}
-			addrs = append(addrs, addrRecordList(racer.rrs)...)
-		}
-		if len(addrs) > 0 {
-			break
-		}
-	}
-	if lastErr, ok := lastErr.(*DNSError); ok {
-		// Show original name passed to lookup, not suffixed one.
-		// In general we might have tried many suffixes; showing
-		// just one is misleading. See also golang.org/issue/6324.
-		lastErr.Name = name
-	}
-	sortByRFC6724(addrs)
-	if len(addrs) == 0 {
-		if lastErr != nil {
-			return nil, lastErr
-		}
-		if order == hostLookupDNSFiles {
-			addrs = goLookupIPFiles(name)
-		}
-	}
-	return addrs, nil
-}
-
-// goLookupCNAME is the native Go implementation of LookupCNAME.
-// Used only if cgoLookupCNAME refuses to handle the request
-// (that is, only if cgoLookupCNAME is the stub in cgo_stub.go).
-// Normally we let cgo use the C library resolver instead of
-// depending on our lookup code, so that Go and C get the same
-// answers.
-func goLookupCNAME(name string) (cname string, err error) {
-	_, rrs, err := lookup(name, dnsTypeCNAME)
-	if err != nil {
-		return
-	}
-	cname = rrs[0].(*dnsRR_CNAME).Cname
-	return
-}
-
-// goLookupPTR is the native Go implementation of LookupAddr.
-// Used only if cgoLookupPTR refuses to handle the request (that is,
-// only if cgoLookupPTR is the stub in cgo_stub.go).
-// Normally we let cgo use the C library resolver instead of depending
-// on our lookup code, so that Go and C get the same answers.
-func goLookupPTR(addr string) ([]string, error) {
-	names := lookupStaticAddr(addr)
-	if len(names) > 0 {
-		return names, nil
-	}
-	arpa, err := reverseaddr(addr)
-	if err != nil {
-		return nil, err
-	}
-	_, rrs, err := lookup(arpa, dnsTypePTR)
-	if err != nil {
-		return nil, err
-	}
-	ptrs := make([]string, len(rrs))
-	for i, rr := range rrs {
-		ptrs[i] = rr.(*dnsRR_PTR).Ptr
-	}
-	return ptrs, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/dnsclient_unix_test.go b/third_party/gofrontend/libgo/go/net/dnsclient_unix_test.go
deleted file mode 100644
index a999f8f..0000000
--- a/third_party/gofrontend/libgo/go/net/dnsclient_unix_test.go
+++ /dev/null
@@ -1,417 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package net
-
-import (
-	"fmt"
-	"io/ioutil"
-	"os"
-	"path"
-	"reflect"
-	"strings"
-	"sync"
-	"testing"
-	"time"
-)
-
-var dnsTransportFallbackTests = []struct {
-	server  string
-	name    string
-	qtype   uint16
-	timeout int
-	rcode   int
-}{
-	// Querying "com." with qtype=255 usually makes an answer
-	// which requires more than 512 bytes.
-	{"8.8.8.8:53", "com.", dnsTypeALL, 2, dnsRcodeSuccess},
-	{"8.8.4.4:53", "com.", dnsTypeALL, 4, dnsRcodeSuccess},
-}
-
-func TestDNSTransportFallback(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-
-	for _, tt := range dnsTransportFallbackTests {
-		timeout := time.Duration(tt.timeout) * time.Second
-		msg, err := exchange(tt.server, tt.name, tt.qtype, timeout)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-		switch msg.rcode {
-		case tt.rcode, dnsRcodeServerFailure:
-		default:
-			t.Errorf("got %v from %v; want %v", msg.rcode, tt.server, tt.rcode)
-			continue
-		}
-	}
-}
-
-// See RFC 6761 for further information about the reserved, pseudo
-// domain names.
-var specialDomainNameTests = []struct {
-	name  string
-	qtype uint16
-	rcode int
-}{
-	// Name resolution APIs and libraries should not recognize the
-	// followings as special.
-	{"1.0.168.192.in-addr.arpa.", dnsTypePTR, dnsRcodeNameError},
-	{"test.", dnsTypeALL, dnsRcodeNameError},
-	{"example.com.", dnsTypeALL, dnsRcodeSuccess},
-
-	// Name resolution APIs and libraries should recognize the
-	// followings as special and should not send any queries.
-	// Though, we test those names here for verifying nagative
-	// answers at DNS query-response interaction level.
-	{"localhost.", dnsTypeALL, dnsRcodeNameError},
-	{"invalid.", dnsTypeALL, dnsRcodeNameError},
-}
-
-func TestSpecialDomainName(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-
-	server := "8.8.8.8:53"
-	for _, tt := range specialDomainNameTests {
-		msg, err := exchange(server, tt.name, tt.qtype, 0)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-		switch msg.rcode {
-		case tt.rcode, dnsRcodeServerFailure:
-		default:
-			t.Errorf("got %v from %v; want %v", msg.rcode, server, tt.rcode)
-			continue
-		}
-	}
-}
-
-type resolvConfTest struct {
-	dir  string
-	path string
-	*resolverConfig
-}
-
-func newResolvConfTest() (*resolvConfTest, error) {
-	dir, err := ioutil.TempDir("", "go-resolvconftest")
-	if err != nil {
-		return nil, err
-	}
-	conf := &resolvConfTest{
-		dir:            dir,
-		path:           path.Join(dir, "resolv.conf"),
-		resolverConfig: &resolvConf,
-	}
-	conf.initOnce.Do(conf.init)
-	return conf, nil
-}
-
-func (conf *resolvConfTest) writeAndUpdate(lines []string) error {
-	f, err := os.OpenFile(conf.path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0600)
-	if err != nil {
-		return err
-	}
-	if _, err := f.WriteString(strings.Join(lines, "\n")); err != nil {
-		f.Close()
-		return err
-	}
-	f.Close()
-	if err := conf.forceUpdate(conf.path); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (conf *resolvConfTest) forceUpdate(name string) error {
-	dnsConf := dnsReadConfig(name)
-	conf.mu.Lock()
-	conf.dnsConfig = dnsConf
-	conf.mu.Unlock()
-	for i := 0; i < 5; i++ {
-		if conf.tryAcquireSema() {
-			conf.lastChecked = time.Time{}
-			conf.releaseSema()
-			return nil
-		}
-	}
-	return fmt.Errorf("tryAcquireSema for %s failed", name)
-}
-
-func (conf *resolvConfTest) servers() []string {
-	conf.mu.RLock()
-	servers := conf.dnsConfig.servers
-	conf.mu.RUnlock()
-	return servers
-}
-
-func (conf *resolvConfTest) teardown() error {
-	err := conf.forceUpdate("/etc/resolv.conf")
-	os.RemoveAll(conf.dir)
-	return err
-}
-
-var updateResolvConfTests = []struct {
-	name    string   // query name
-	lines   []string // resolver configuration lines
-	servers []string // expected name servers
-}{
-	{
-		name:    "golang.org",
-		lines:   []string{"nameserver 8.8.8.8"},
-		servers: []string{"8.8.8.8"},
-	},
-	{
-		name:    "",
-		lines:   nil, // an empty resolv.conf should use defaultNS as name servers
-		servers: defaultNS,
-	},
-	{
-		name:    "www.example.com",
-		lines:   []string{"nameserver 8.8.4.4"},
-		servers: []string{"8.8.4.4"},
-	},
-}
-
-func TestUpdateResolvConf(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-
-	conf, err := newResolvConfTest()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer conf.teardown()
-
-	for i, tt := range updateResolvConfTests {
-		if err := conf.writeAndUpdate(tt.lines); err != nil {
-			t.Error(err)
-			continue
-		}
-		if tt.name != "" {
-			var wg sync.WaitGroup
-			const N = 10
-			wg.Add(N)
-			for j := 0; j < N; j++ {
-				go func(name string) {
-					defer wg.Done()
-					ips, err := goLookupIP(name)
-					if err != nil {
-						t.Error(err)
-						return
-					}
-					if len(ips) == 0 {
-						t.Errorf("no records for %s", name)
-						return
-					}
-				}(tt.name)
-			}
-			wg.Wait()
-		}
-		servers := conf.servers()
-		if !reflect.DeepEqual(servers, tt.servers) {
-			t.Errorf("#%d: got %v; want %v", i, servers, tt.servers)
-			continue
-		}
-	}
-}
-
-var goLookupIPWithResolverConfigTests = []struct {
-	name  string
-	lines []string // resolver configuration lines
-	error
-	a, aaaa bool // whether response contains A, AAAA-record
-}{
-	// no records, transport timeout
-	{
-		"jgahvsekduiv9bw4b3qhn4ykdfgj0493iohkrjfhdvhjiu4j",
-		[]string{
-			"options timeout:1 attempts:1",
-			"nameserver 255.255.255.255", // please forgive us for abuse of limited broadcast address
-		},
-		&DNSError{Name: "jgahvsekduiv9bw4b3qhn4ykdfgj0493iohkrjfhdvhjiu4j", Server: "255.255.255.255:53", IsTimeout: true},
-		false, false,
-	},
-
-	// no records, non-existent domain
-	{
-		"jgahvsekduiv9bw4b3qhn4ykdfgj0493iohkrjfhdvhjiu4j",
-		[]string{
-			"options timeout:3 attempts:1",
-			"nameserver 8.8.8.8",
-		},
-		&DNSError{Name: "jgahvsekduiv9bw4b3qhn4ykdfgj0493iohkrjfhdvhjiu4j", Server: "8.8.8.8:53", IsTimeout: false},
-		false, false,
-	},
-
-	// a few A records, no AAAA records
-	{
-		"ipv4.google.com.",
-		[]string{
-			"nameserver 8.8.8.8",
-			"nameserver 2001:4860:4860::8888",
-		},
-		nil,
-		true, false,
-	},
-	{
-		"ipv4.google.com",
-		[]string{
-			"domain golang.org",
-			"nameserver 2001:4860:4860::8888",
-			"nameserver 8.8.8.8",
-		},
-		nil,
-		true, false,
-	},
-	{
-		"ipv4.google.com",
-		[]string{
-			"search x.golang.org y.golang.org",
-			"nameserver 2001:4860:4860::8888",
-			"nameserver 8.8.8.8",
-		},
-		nil,
-		true, false,
-	},
-
-	// no A records, a few AAAA records
-	{
-		"ipv6.google.com.",
-		[]string{
-			"nameserver 2001:4860:4860::8888",
-			"nameserver 8.8.8.8",
-		},
-		nil,
-		false, true,
-	},
-	{
-		"ipv6.google.com",
-		[]string{
-			"domain golang.org",
-			"nameserver 8.8.8.8",
-			"nameserver 2001:4860:4860::8888",
-		},
-		nil,
-		false, true,
-	},
-	{
-		"ipv6.google.com",
-		[]string{
-			"search x.golang.org y.golang.org",
-			"nameserver 8.8.8.8",
-			"nameserver 2001:4860:4860::8888",
-		},
-		nil,
-		false, true,
-	},
-
-	// both A and AAAA records
-	{
-		"hostname.as112.net", // see RFC 7534
-		[]string{
-			"domain golang.org",
-			"nameserver 2001:4860:4860::8888",
-			"nameserver 8.8.8.8",
-		},
-		nil,
-		true, true,
-	},
-	{
-		"hostname.as112.net", // see RFC 7534
-		[]string{
-			"search x.golang.org y.golang.org",
-			"nameserver 2001:4860:4860::8888",
-			"nameserver 8.8.8.8",
-		},
-		nil,
-		true, true,
-	},
-}
-
-func TestGoLookupIPWithResolverConfig(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-
-	conf, err := newResolvConfTest()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer conf.teardown()
-
-	for _, tt := range goLookupIPWithResolverConfigTests {
-		if err := conf.writeAndUpdate(tt.lines); err != nil {
-			t.Error(err)
-			continue
-		}
-		conf.tryUpdate(conf.path)
-		addrs, err := goLookupIP(tt.name)
-		if err != nil {
-			if err, ok := err.(*DNSError); !ok || (err.Name != tt.error.(*DNSError).Name || err.Server != tt.error.(*DNSError).Server || err.IsTimeout != tt.error.(*DNSError).IsTimeout) {
-				t.Errorf("got %v; want %v", err, tt.error)
-			}
-			continue
-		}
-		if len(addrs) == 0 {
-			t.Errorf("no records for %s", tt.name)
-		}
-		if !tt.a && !tt.aaaa && len(addrs) > 0 {
-			t.Errorf("unexpected %v for %s", addrs, tt.name)
-		}
-		for _, addr := range addrs {
-			if !tt.a && addr.IP.To4() != nil {
-				t.Errorf("got %v; must not be IPv4 address", addr)
-			}
-			if !tt.aaaa && addr.IP.To16() != nil && addr.IP.To4() == nil {
-				t.Errorf("got %v; must not be IPv6 address", addr)
-			}
-		}
-	}
-}
-
-func BenchmarkGoLookupIP(b *testing.B) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	for i := 0; i < b.N; i++ {
-		goLookupIP("www.example.com")
-	}
-}
-
-func BenchmarkGoLookupIPNoSuchHost(b *testing.B) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	for i := 0; i < b.N; i++ {
-		goLookupIP("some.nonexistent")
-	}
-}
-
-func BenchmarkGoLookupIPWithBrokenNameServer(b *testing.B) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	conf, err := newResolvConfTest()
-	if err != nil {
-		b.Fatal(err)
-	}
-	defer conf.teardown()
-
-	lines := []string{
-		"nameserver 203.0.113.254", // use TEST-NET-3 block, see RFC 5737
-		"nameserver 8.8.8.8",
-	}
-	if err := conf.writeAndUpdate(lines); err != nil {
-		b.Fatal(err)
-	}
-
-	for i := 0; i < b.N; i++ {
-		goLookupIP("www.example.com")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/dnsconfig_unix.go b/third_party/gofrontend/libgo/go/net/dnsconfig_unix.go
deleted file mode 100644
index 6073fdb..0000000
--- a/third_party/gofrontend/libgo/go/net/dnsconfig_unix.go
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-// Read system DNS config from /etc/resolv.conf
-
-package net
-
-var defaultNS = []string{"127.0.0.1", "::1"}
-
-type dnsConfig struct {
-	servers    []string // servers to use
-	search     []string // suffixes to append to local name
-	ndots      int      // number of dots in name to trigger absolute lookup
-	timeout    int      // seconds before giving up on packet
-	attempts   int      // lost packets before giving up on server
-	rotate     bool     // round robin among servers
-	unknownOpt bool     // anything unknown was encountered
-	lookup     []string // OpenBSD top-level database "lookup" order
-	err        error    // any error that occurs during open of resolv.conf
-}
-
-// See resolv.conf(5) on a Linux machine.
-// TODO(rsc): Supposed to call uname() and chop the beginning
-// of the host name to get the default search domain.
-func dnsReadConfig(filename string) *dnsConfig {
-	conf := &dnsConfig{
-		ndots:    1,
-		timeout:  5,
-		attempts: 2,
-	}
-	file, err := open(filename)
-	if err != nil {
-		conf.servers = defaultNS
-		conf.err = err
-		return conf
-	}
-	defer file.close()
-	for line, ok := file.readLine(); ok; line, ok = file.readLine() {
-		if len(line) > 0 && (line[0] == ';' || line[0] == '#') {
-			// comment.
-			continue
-		}
-		f := getFields(line)
-		if len(f) < 1 {
-			continue
-		}
-		switch f[0] {
-		case "nameserver": // add one name server
-			if len(f) > 1 && len(conf.servers) < 3 { // small, but the standard limit
-				// One more check: make sure server name is
-				// just an IP address.  Otherwise we need DNS
-				// to look it up.
-				if parseIPv4(f[1]) != nil {
-					conf.servers = append(conf.servers, f[1])
-				} else if ip, _ := parseIPv6(f[1], true); ip != nil {
-					conf.servers = append(conf.servers, f[1])
-				}
-			}
-
-		case "domain": // set search path to just this domain
-			if len(f) > 1 {
-				conf.search = []string{f[1]}
-			}
-
-		case "search": // set search path to given servers
-			conf.search = make([]string, len(f)-1)
-			for i := 0; i < len(conf.search); i++ {
-				conf.search[i] = f[i+1]
-			}
-
-		case "options": // magic options
-			for _, s := range f[1:] {
-				switch {
-				case hasPrefix(s, "ndots:"):
-					n, _, _ := dtoi(s, 6)
-					if n < 1 {
-						n = 1
-					}
-					conf.ndots = n
-				case hasPrefix(s, "timeout:"):
-					n, _, _ := dtoi(s, 8)
-					if n < 1 {
-						n = 1
-					}
-					conf.timeout = n
-				case hasPrefix(s, "attempts:"):
-					n, _, _ := dtoi(s, 9)
-					if n < 1 {
-						n = 1
-					}
-					conf.attempts = n
-				case s == "rotate":
-					conf.rotate = true
-				default:
-					conf.unknownOpt = true
-				}
-			}
-
-		case "lookup":
-			// OpenBSD option:
-			// http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man5/resolv.conf.5
-			// "the legal space-separated values are: bind, file, yp"
-			conf.lookup = f[1:]
-
-		default:
-			conf.unknownOpt = true
-		}
-	}
-	if len(conf.servers) == 0 {
-		conf.servers = defaultNS
-	}
-	return conf
-}
-
-func hasPrefix(s, prefix string) bool {
-	return len(s) >= len(prefix) && s[:len(prefix)] == prefix
-}
diff --git a/third_party/gofrontend/libgo/go/net/dnsconfig_unix_test.go b/third_party/gofrontend/libgo/go/net/dnsconfig_unix_test.go
deleted file mode 100644
index c8eed61..0000000
--- a/third_party/gofrontend/libgo/go/net/dnsconfig_unix_test.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package net
-
-import (
-	"os"
-	"reflect"
-	"testing"
-)
-
-var dnsReadConfigTests = []struct {
-	name string
-	want *dnsConfig
-}{
-	{
-		name: "testdata/resolv.conf",
-		want: &dnsConfig{
-			servers:    []string{"8.8.8.8", "2001:4860:4860::8888", "fe80::1%lo0"},
-			search:     []string{"localdomain"},
-			ndots:      5,
-			timeout:    10,
-			attempts:   3,
-			rotate:     true,
-			unknownOpt: true, // the "options attempts 3" line
-		},
-	},
-	{
-		name: "testdata/domain-resolv.conf",
-		want: &dnsConfig{
-			servers:  []string{"8.8.8.8"},
-			search:   []string{"localdomain"},
-			ndots:    1,
-			timeout:  5,
-			attempts: 2,
-		},
-	},
-	{
-		name: "testdata/search-resolv.conf",
-		want: &dnsConfig{
-			servers:  []string{"8.8.8.8"},
-			search:   []string{"test", "invalid"},
-			ndots:    1,
-			timeout:  5,
-			attempts: 2,
-		},
-	},
-	{
-		name: "testdata/empty-resolv.conf",
-		want: &dnsConfig{
-			servers:  defaultNS,
-			ndots:    1,
-			timeout:  5,
-			attempts: 2,
-		},
-	},
-	{
-		name: "testdata/openbsd-resolv.conf",
-		want: &dnsConfig{
-			ndots:    1,
-			timeout:  5,
-			attempts: 2,
-			lookup:   []string{"file", "bind"},
-			servers:  []string{"169.254.169.254", "10.240.0.1"},
-			search:   []string{"c.symbolic-datum-552.internal."},
-		},
-	},
-}
-
-func TestDNSReadConfig(t *testing.T) {
-	for _, tt := range dnsReadConfigTests {
-		conf := dnsReadConfig(tt.name)
-		if conf.err != nil {
-			t.Fatal(conf.err)
-		}
-		if !reflect.DeepEqual(conf, tt.want) {
-			t.Errorf("%s:\ngot: %+v\nwant: %+v", tt.name, conf, tt.want)
-		}
-	}
-}
-
-func TestDNSReadMissingFile(t *testing.T) {
-	conf := dnsReadConfig("a-nonexistent-file")
-	if !os.IsNotExist(conf.err) {
-		t.Errorf("missing resolv.conf:\ngot: %v\nwant: %v", conf.err, os.ErrNotExist)
-	}
-	conf.err = nil
-	want := &dnsConfig{
-		servers:  defaultNS,
-		ndots:    1,
-		timeout:  5,
-		attempts: 2,
-	}
-	if !reflect.DeepEqual(conf, want) {
-		t.Errorf("missing resolv.conf:\ngot: %+v\nwant: %+v", conf, want)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/dnsmsg.go b/third_party/gofrontend/libgo/go/net/dnsmsg.go
deleted file mode 100644
index 6ecaa94..0000000
--- a/third_party/gofrontend/libgo/go/net/dnsmsg.go
+++ /dev/null
@@ -1,903 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// DNS packet assembly.  See RFC 1035.
-//
-// This is intended to support name resolution during Dial.
-// It doesn't have to be blazing fast.
-//
-// Each message structure has a Walk method that is used by
-// a generic pack/unpack routine. Thus, if in the future we need
-// to define new message structs, no new pack/unpack/printing code
-// needs to be written.
-//
-// The first half of this file defines the DNS message formats.
-// The second half implements the conversion to and from wire format.
-// A few of the structure elements have string tags to aid the
-// generic pack/unpack routines.
-//
-// TODO(rsc):  There are enough names defined in this file that they're all
-// prefixed with dns.  Perhaps put this in its own package later.
-
-package net
-
-// Packet formats
-
-// Wire constants.
-const (
-	// valid dnsRR_Header.Rrtype and dnsQuestion.qtype
-	dnsTypeA     = 1
-	dnsTypeNS    = 2
-	dnsTypeMD    = 3
-	dnsTypeMF    = 4
-	dnsTypeCNAME = 5
-	dnsTypeSOA   = 6
-	dnsTypeMB    = 7
-	dnsTypeMG    = 8
-	dnsTypeMR    = 9
-	dnsTypeNULL  = 10
-	dnsTypeWKS   = 11
-	dnsTypePTR   = 12
-	dnsTypeHINFO = 13
-	dnsTypeMINFO = 14
-	dnsTypeMX    = 15
-	dnsTypeTXT   = 16
-	dnsTypeAAAA  = 28
-	dnsTypeSRV   = 33
-
-	// valid dnsQuestion.qtype only
-	dnsTypeAXFR  = 252
-	dnsTypeMAILB = 253
-	dnsTypeMAILA = 254
-	dnsTypeALL   = 255
-
-	// valid dnsQuestion.qclass
-	dnsClassINET   = 1
-	dnsClassCSNET  = 2
-	dnsClassCHAOS  = 3
-	dnsClassHESIOD = 4
-	dnsClassANY    = 255
-
-	// dnsMsg.rcode
-	dnsRcodeSuccess        = 0
-	dnsRcodeFormatError    = 1
-	dnsRcodeServerFailure  = 2
-	dnsRcodeNameError      = 3
-	dnsRcodeNotImplemented = 4
-	dnsRcodeRefused        = 5
-)
-
-// A dnsStruct describes how to iterate over its fields to emulate
-// reflective marshalling.
-type dnsStruct interface {
-	// Walk iterates over fields of a structure and calls f
-	// with a reference to that field, the name of the field
-	// and a tag ("", "domain", "ipv4", "ipv6") specifying
-	// particular encodings. Possible concrete types
-	// for v are *uint16, *uint32, *string, or []byte, and
-	// *int, *bool in the case of dnsMsgHdr.
-	// Whenever f returns false, Walk must stop and return
-	// false, and otherwise return true.
-	Walk(f func(v interface{}, name, tag string) (ok bool)) (ok bool)
-}
-
-// The wire format for the DNS packet header.
-type dnsHeader struct {
-	Id                                 uint16
-	Bits                               uint16
-	Qdcount, Ancount, Nscount, Arcount uint16
-}
-
-func (h *dnsHeader) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return f(&h.Id, "Id", "") &&
-		f(&h.Bits, "Bits", "") &&
-		f(&h.Qdcount, "Qdcount", "") &&
-		f(&h.Ancount, "Ancount", "") &&
-		f(&h.Nscount, "Nscount", "") &&
-		f(&h.Arcount, "Arcount", "")
-}
-
-const (
-	// dnsHeader.Bits
-	_QR = 1 << 15 // query/response (response=1)
-	_AA = 1 << 10 // authoritative
-	_TC = 1 << 9  // truncated
-	_RD = 1 << 8  // recursion desired
-	_RA = 1 << 7  // recursion available
-)
-
-// DNS queries.
-type dnsQuestion struct {
-	Name   string `net:"domain-name"` // `net:"domain-name"` specifies encoding; see packers below
-	Qtype  uint16
-	Qclass uint16
-}
-
-func (q *dnsQuestion) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return f(&q.Name, "Name", "domain") &&
-		f(&q.Qtype, "Qtype", "") &&
-		f(&q.Qclass, "Qclass", "")
-}
-
-// DNS responses (resource records).
-// There are many types of messages,
-// but they all share the same header.
-type dnsRR_Header struct {
-	Name     string `net:"domain-name"`
-	Rrtype   uint16
-	Class    uint16
-	Ttl      uint32
-	Rdlength uint16 // length of data after header
-}
-
-func (h *dnsRR_Header) Header() *dnsRR_Header {
-	return h
-}
-
-func (h *dnsRR_Header) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return f(&h.Name, "Name", "domain") &&
-		f(&h.Rrtype, "Rrtype", "") &&
-		f(&h.Class, "Class", "") &&
-		f(&h.Ttl, "Ttl", "") &&
-		f(&h.Rdlength, "Rdlength", "")
-}
-
-type dnsRR interface {
-	dnsStruct
-	Header() *dnsRR_Header
-}
-
-// Specific DNS RR formats for each query type.
-
-type dnsRR_CNAME struct {
-	Hdr   dnsRR_Header
-	Cname string `net:"domain-name"`
-}
-
-func (rr *dnsRR_CNAME) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_CNAME) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return rr.Hdr.Walk(f) && f(&rr.Cname, "Cname", "domain")
-}
-
-type dnsRR_HINFO struct {
-	Hdr dnsRR_Header
-	Cpu string
-	Os  string
-}
-
-func (rr *dnsRR_HINFO) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_HINFO) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return rr.Hdr.Walk(f) && f(&rr.Cpu, "Cpu", "") && f(&rr.Os, "Os", "")
-}
-
-type dnsRR_MB struct {
-	Hdr dnsRR_Header
-	Mb  string `net:"domain-name"`
-}
-
-func (rr *dnsRR_MB) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_MB) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return rr.Hdr.Walk(f) && f(&rr.Mb, "Mb", "domain")
-}
-
-type dnsRR_MG struct {
-	Hdr dnsRR_Header
-	Mg  string `net:"domain-name"`
-}
-
-func (rr *dnsRR_MG) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_MG) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return rr.Hdr.Walk(f) && f(&rr.Mg, "Mg", "domain")
-}
-
-type dnsRR_MINFO struct {
-	Hdr   dnsRR_Header
-	Rmail string `net:"domain-name"`
-	Email string `net:"domain-name"`
-}
-
-func (rr *dnsRR_MINFO) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_MINFO) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return rr.Hdr.Walk(f) && f(&rr.Rmail, "Rmail", "domain") && f(&rr.Email, "Email", "domain")
-}
-
-type dnsRR_MR struct {
-	Hdr dnsRR_Header
-	Mr  string `net:"domain-name"`
-}
-
-func (rr *dnsRR_MR) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_MR) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return rr.Hdr.Walk(f) && f(&rr.Mr, "Mr", "domain")
-}
-
-type dnsRR_MX struct {
-	Hdr  dnsRR_Header
-	Pref uint16
-	Mx   string `net:"domain-name"`
-}
-
-func (rr *dnsRR_MX) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_MX) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return rr.Hdr.Walk(f) && f(&rr.Pref, "Pref", "") && f(&rr.Mx, "Mx", "domain")
-}
-
-type dnsRR_NS struct {
-	Hdr dnsRR_Header
-	Ns  string `net:"domain-name"`
-}
-
-func (rr *dnsRR_NS) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_NS) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return rr.Hdr.Walk(f) && f(&rr.Ns, "Ns", "domain")
-}
-
-type dnsRR_PTR struct {
-	Hdr dnsRR_Header
-	Ptr string `net:"domain-name"`
-}
-
-func (rr *dnsRR_PTR) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_PTR) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return rr.Hdr.Walk(f) && f(&rr.Ptr, "Ptr", "domain")
-}
-
-type dnsRR_SOA struct {
-	Hdr     dnsRR_Header
-	Ns      string `net:"domain-name"`
-	Mbox    string `net:"domain-name"`
-	Serial  uint32
-	Refresh uint32
-	Retry   uint32
-	Expire  uint32
-	Minttl  uint32
-}
-
-func (rr *dnsRR_SOA) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_SOA) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return rr.Hdr.Walk(f) &&
-		f(&rr.Ns, "Ns", "domain") &&
-		f(&rr.Mbox, "Mbox", "domain") &&
-		f(&rr.Serial, "Serial", "") &&
-		f(&rr.Refresh, "Refresh", "") &&
-		f(&rr.Retry, "Retry", "") &&
-		f(&rr.Expire, "Expire", "") &&
-		f(&rr.Minttl, "Minttl", "")
-}
-
-type dnsRR_TXT struct {
-	Hdr dnsRR_Header
-	Txt string // not domain name
-}
-
-func (rr *dnsRR_TXT) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_TXT) Walk(f func(v interface{}, name, tag string) bool) bool {
-	if !rr.Hdr.Walk(f) {
-		return false
-	}
-	var n uint16 = 0
-	for n < rr.Hdr.Rdlength {
-		var txt string
-		if !f(&txt, "Txt", "") {
-			return false
-		}
-		// more bytes than rr.Hdr.Rdlength said there woudld be
-		if rr.Hdr.Rdlength-n < uint16(len(txt))+1 {
-			return false
-		}
-		n += uint16(len(txt)) + 1
-		rr.Txt += txt
-	}
-	return true
-}
-
-type dnsRR_SRV struct {
-	Hdr      dnsRR_Header
-	Priority uint16
-	Weight   uint16
-	Port     uint16
-	Target   string `net:"domain-name"`
-}
-
-func (rr *dnsRR_SRV) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_SRV) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return rr.Hdr.Walk(f) &&
-		f(&rr.Priority, "Priority", "") &&
-		f(&rr.Weight, "Weight", "") &&
-		f(&rr.Port, "Port", "") &&
-		f(&rr.Target, "Target", "domain")
-}
-
-type dnsRR_A struct {
-	Hdr dnsRR_Header
-	A   uint32 `net:"ipv4"`
-}
-
-func (rr *dnsRR_A) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_A) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return rr.Hdr.Walk(f) && f(&rr.A, "A", "ipv4")
-}
-
-type dnsRR_AAAA struct {
-	Hdr  dnsRR_Header
-	AAAA [16]byte `net:"ipv6"`
-}
-
-func (rr *dnsRR_AAAA) Header() *dnsRR_Header {
-	return &rr.Hdr
-}
-
-func (rr *dnsRR_AAAA) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return rr.Hdr.Walk(f) && f(rr.AAAA[:], "AAAA", "ipv6")
-}
-
-// Packing and unpacking.
-//
-// All the packers and unpackers take a (msg []byte, off int)
-// and return (off1 int, ok bool).  If they return ok==false, they
-// also return off1==len(msg), so that the next unpacker will
-// also fail.  This lets us avoid checks of ok until the end of a
-// packing sequence.
-
-// Map of constructors for each RR wire type.
-var rr_mk = map[int]func() dnsRR{
-	dnsTypeCNAME: func() dnsRR { return new(dnsRR_CNAME) },
-	dnsTypeHINFO: func() dnsRR { return new(dnsRR_HINFO) },
-	dnsTypeMB:    func() dnsRR { return new(dnsRR_MB) },
-	dnsTypeMG:    func() dnsRR { return new(dnsRR_MG) },
-	dnsTypeMINFO: func() dnsRR { return new(dnsRR_MINFO) },
-	dnsTypeMR:    func() dnsRR { return new(dnsRR_MR) },
-	dnsTypeMX:    func() dnsRR { return new(dnsRR_MX) },
-	dnsTypeNS:    func() dnsRR { return new(dnsRR_NS) },
-	dnsTypePTR:   func() dnsRR { return new(dnsRR_PTR) },
-	dnsTypeSOA:   func() dnsRR { return new(dnsRR_SOA) },
-	dnsTypeTXT:   func() dnsRR { return new(dnsRR_TXT) },
-	dnsTypeSRV:   func() dnsRR { return new(dnsRR_SRV) },
-	dnsTypeA:     func() dnsRR { return new(dnsRR_A) },
-	dnsTypeAAAA:  func() dnsRR { return new(dnsRR_AAAA) },
-}
-
-// Pack a domain name s into msg[off:].
-// Domain names are a sequence of counted strings
-// split at the dots.  They end with a zero-length string.
-func packDomainName(s string, msg []byte, off int) (off1 int, ok bool) {
-	// Add trailing dot to canonicalize name.
-	if n := len(s); n == 0 || s[n-1] != '.' {
-		s += "."
-	}
-
-	// Each dot ends a segment of the name.
-	// We trade each dot byte for a length byte.
-	// There is also a trailing zero.
-	// Check that we have all the space we need.
-	tot := len(s) + 1
-	if off+tot > len(msg) {
-		return len(msg), false
-	}
-
-	// Emit sequence of counted strings, chopping at dots.
-	begin := 0
-	for i := 0; i < len(s); i++ {
-		if s[i] == '.' {
-			if i-begin >= 1<<6 { // top two bits of length must be clear
-				return len(msg), false
-			}
-			msg[off] = byte(i - begin)
-			off++
-			for j := begin; j < i; j++ {
-				msg[off] = s[j]
-				off++
-			}
-			begin = i + 1
-		}
-	}
-	msg[off] = 0
-	off++
-	return off, true
-}
-
-// Unpack a domain name.
-// In addition to the simple sequences of counted strings above,
-// domain names are allowed to refer to strings elsewhere in the
-// packet, to avoid repeating common suffixes when returning
-// many entries in a single domain.  The pointers are marked
-// by a length byte with the top two bits set.  Ignoring those
-// two bits, that byte and the next give a 14 bit offset from msg[0]
-// where we should pick up the trail.
-// Note that if we jump elsewhere in the packet,
-// we return off1 == the offset after the first pointer we found,
-// which is where the next record will start.
-// In theory, the pointers are only allowed to jump backward.
-// We let them jump anywhere and stop jumping after a while.
-func unpackDomainName(msg []byte, off int) (s string, off1 int, ok bool) {
-	s = ""
-	ptr := 0 // number of pointers followed
-Loop:
-	for {
-		if off >= len(msg) {
-			return "", len(msg), false
-		}
-		c := int(msg[off])
-		off++
-		switch c & 0xC0 {
-		case 0x00:
-			if c == 0x00 {
-				// end of name
-				break Loop
-			}
-			// literal string
-			if off+c > len(msg) {
-				return "", len(msg), false
-			}
-			s += string(msg[off:off+c]) + "."
-			off += c
-		case 0xC0:
-			// pointer to somewhere else in msg.
-			// remember location after first ptr,
-			// since that's how many bytes we consumed.
-			// also, don't follow too many pointers --
-			// maybe there's a loop.
-			if off >= len(msg) {
-				return "", len(msg), false
-			}
-			c1 := msg[off]
-			off++
-			if ptr == 0 {
-				off1 = off
-			}
-			if ptr++; ptr > 10 {
-				return "", len(msg), false
-			}
-			off = (c^0xC0)<<8 | int(c1)
-		default:
-			// 0x80 and 0x40 are reserved
-			return "", len(msg), false
-		}
-	}
-	if ptr == 0 {
-		off1 = off
-	}
-	return s, off1, true
-}
-
-// packStruct packs a structure into msg at specified offset off, and
-// returns off1 such that msg[off:off1] is the encoded data.
-func packStruct(any dnsStruct, msg []byte, off int) (off1 int, ok bool) {
-	ok = any.Walk(func(field interface{}, name, tag string) bool {
-		switch fv := field.(type) {
-		default:
-			println("net: dns: unknown packing type")
-			return false
-		case *uint16:
-			i := *fv
-			if off+2 > len(msg) {
-				return false
-			}
-			msg[off] = byte(i >> 8)
-			msg[off+1] = byte(i)
-			off += 2
-		case *uint32:
-			i := *fv
-			msg[off] = byte(i >> 24)
-			msg[off+1] = byte(i >> 16)
-			msg[off+2] = byte(i >> 8)
-			msg[off+3] = byte(i)
-			off += 4
-		case []byte:
-			n := len(fv)
-			if off+n > len(msg) {
-				return false
-			}
-			copy(msg[off:off+n], fv)
-			off += n
-		case *string:
-			s := *fv
-			switch tag {
-			default:
-				println("net: dns: unknown string tag", tag)
-				return false
-			case "domain":
-				off, ok = packDomainName(s, msg, off)
-				if !ok {
-					return false
-				}
-			case "":
-				// Counted string: 1 byte length.
-				if len(s) > 255 || off+1+len(s) > len(msg) {
-					return false
-				}
-				msg[off] = byte(len(s))
-				off++
-				off += copy(msg[off:], s)
-			}
-		}
-		return true
-	})
-	if !ok {
-		return len(msg), false
-	}
-	return off, true
-}
-
-// unpackStruct decodes msg[off:] into the given structure, and
-// returns off1 such that msg[off:off1] is the encoded data.
-func unpackStruct(any dnsStruct, msg []byte, off int) (off1 int, ok bool) {
-	ok = any.Walk(func(field interface{}, name, tag string) bool {
-		switch fv := field.(type) {
-		default:
-			println("net: dns: unknown packing type")
-			return false
-		case *uint16:
-			if off+2 > len(msg) {
-				return false
-			}
-			*fv = uint16(msg[off])<<8 | uint16(msg[off+1])
-			off += 2
-		case *uint32:
-			if off+4 > len(msg) {
-				return false
-			}
-			*fv = uint32(msg[off])<<24 | uint32(msg[off+1])<<16 |
-				uint32(msg[off+2])<<8 | uint32(msg[off+3])
-			off += 4
-		case []byte:
-			n := len(fv)
-			if off+n > len(msg) {
-				return false
-			}
-			copy(fv, msg[off:off+n])
-			off += n
-		case *string:
-			var s string
-			switch tag {
-			default:
-				println("net: dns: unknown string tag", tag)
-				return false
-			case "domain":
-				s, off, ok = unpackDomainName(msg, off)
-				if !ok {
-					return false
-				}
-			case "":
-				if off >= len(msg) || off+1+int(msg[off]) > len(msg) {
-					return false
-				}
-				n := int(msg[off])
-				off++
-				b := make([]byte, n)
-				for i := 0; i < n; i++ {
-					b[i] = msg[off+i]
-				}
-				off += n
-				s = string(b)
-			}
-			*fv = s
-		}
-		return true
-	})
-	if !ok {
-		return len(msg), false
-	}
-	return off, true
-}
-
-// Generic struct printer. Prints fields with tag "ipv4" or "ipv6"
-// as IP addresses.
-func printStruct(any dnsStruct) string {
-	s := "{"
-	i := 0
-	any.Walk(func(val interface{}, name, tag string) bool {
-		i++
-		if i > 1 {
-			s += ", "
-		}
-		s += name + "="
-		switch tag {
-		case "ipv4":
-			i := *val.(*uint32)
-			s += IPv4(byte(i>>24), byte(i>>16), byte(i>>8), byte(i)).String()
-		case "ipv6":
-			i := val.([]byte)
-			s += IP(i).String()
-		default:
-			var i int64
-			switch v := val.(type) {
-			default:
-				// can't really happen.
-				s += "<unknown type>"
-				return true
-			case *string:
-				s += *v
-				return true
-			case []byte:
-				s += string(v)
-				return true
-			case *bool:
-				if *v {
-					s += "true"
-				} else {
-					s += "false"
-				}
-				return true
-			case *int:
-				i = int64(*v)
-			case *uint:
-				i = int64(*v)
-			case *uint8:
-				i = int64(*v)
-			case *uint16:
-				i = int64(*v)
-			case *uint32:
-				i = int64(*v)
-			case *uint64:
-				i = int64(*v)
-			case *uintptr:
-				i = int64(*v)
-			}
-			s += itoa(int(i))
-		}
-		return true
-	})
-	s += "}"
-	return s
-}
-
-// Resource record packer.
-func packRR(rr dnsRR, msg []byte, off int) (off2 int, ok bool) {
-	var off1 int
-	// pack twice, once to find end of header
-	// and again to find end of packet.
-	// a bit inefficient but this doesn't need to be fast.
-	// off1 is end of header
-	// off2 is end of rr
-	off1, ok = packStruct(rr.Header(), msg, off)
-	off2, ok = packStruct(rr, msg, off)
-	if !ok {
-		return len(msg), false
-	}
-	// pack a third time; redo header with correct data length
-	rr.Header().Rdlength = uint16(off2 - off1)
-	packStruct(rr.Header(), msg, off)
-	return off2, true
-}
-
-// Resource record unpacker.
-func unpackRR(msg []byte, off int) (rr dnsRR, off1 int, ok bool) {
-	// unpack just the header, to find the rr type and length
-	var h dnsRR_Header
-	off0 := off
-	if off, ok = unpackStruct(&h, msg, off); !ok {
-		return nil, len(msg), false
-	}
-	end := off + int(h.Rdlength)
-
-	// make an rr of that type and re-unpack.
-	// again inefficient but doesn't need to be fast.
-	mk, known := rr_mk[int(h.Rrtype)]
-	if !known {
-		return &h, end, true
-	}
-	rr = mk()
-	off, ok = unpackStruct(rr, msg, off0)
-	if off != end {
-		return &h, end, true
-	}
-	return rr, off, ok
-}
-
-// Usable representation of a DNS packet.
-
-// A manually-unpacked version of (id, bits).
-// This is in its own struct for easy printing.
-type dnsMsgHdr struct {
-	id                  uint16
-	response            bool
-	opcode              int
-	authoritative       bool
-	truncated           bool
-	recursion_desired   bool
-	recursion_available bool
-	rcode               int
-}
-
-func (h *dnsMsgHdr) Walk(f func(v interface{}, name, tag string) bool) bool {
-	return f(&h.id, "id", "") &&
-		f(&h.response, "response", "") &&
-		f(&h.opcode, "opcode", "") &&
-		f(&h.authoritative, "authoritative", "") &&
-		f(&h.truncated, "truncated", "") &&
-		f(&h.recursion_desired, "recursion_desired", "") &&
-		f(&h.recursion_available, "recursion_available", "") &&
-		f(&h.rcode, "rcode", "")
-}
-
-type dnsMsg struct {
-	dnsMsgHdr
-	question []dnsQuestion
-	answer   []dnsRR
-	ns       []dnsRR
-	extra    []dnsRR
-}
-
-func (dns *dnsMsg) Pack() (msg []byte, ok bool) {
-	var dh dnsHeader
-
-	// Convert convenient dnsMsg into wire-like dnsHeader.
-	dh.Id = dns.id
-	dh.Bits = uint16(dns.opcode)<<11 | uint16(dns.rcode)
-	if dns.recursion_available {
-		dh.Bits |= _RA
-	}
-	if dns.recursion_desired {
-		dh.Bits |= _RD
-	}
-	if dns.truncated {
-		dh.Bits |= _TC
-	}
-	if dns.authoritative {
-		dh.Bits |= _AA
-	}
-	if dns.response {
-		dh.Bits |= _QR
-	}
-
-	// Prepare variable sized arrays.
-	question := dns.question
-	answer := dns.answer
-	ns := dns.ns
-	extra := dns.extra
-
-	dh.Qdcount = uint16(len(question))
-	dh.Ancount = uint16(len(answer))
-	dh.Nscount = uint16(len(ns))
-	dh.Arcount = uint16(len(extra))
-
-	// Could work harder to calculate message size,
-	// but this is far more than we need and not
-	// big enough to hurt the allocator.
-	msg = make([]byte, 2000)
-
-	// Pack it in: header and then the pieces.
-	off := 0
-	off, ok = packStruct(&dh, msg, off)
-	for i := 0; i < len(question); i++ {
-		off, ok = packStruct(&question[i], msg, off)
-	}
-	for i := 0; i < len(answer); i++ {
-		off, ok = packRR(answer[i], msg, off)
-	}
-	for i := 0; i < len(ns); i++ {
-		off, ok = packRR(ns[i], msg, off)
-	}
-	for i := 0; i < len(extra); i++ {
-		off, ok = packRR(extra[i], msg, off)
-	}
-	if !ok {
-		return nil, false
-	}
-	return msg[0:off], true
-}
-
-func (dns *dnsMsg) Unpack(msg []byte) bool {
-	// Header.
-	var dh dnsHeader
-	off := 0
-	var ok bool
-	if off, ok = unpackStruct(&dh, msg, off); !ok {
-		return false
-	}
-	dns.id = dh.Id
-	dns.response = (dh.Bits & _QR) != 0
-	dns.opcode = int(dh.Bits>>11) & 0xF
-	dns.authoritative = (dh.Bits & _AA) != 0
-	dns.truncated = (dh.Bits & _TC) != 0
-	dns.recursion_desired = (dh.Bits & _RD) != 0
-	dns.recursion_available = (dh.Bits & _RA) != 0
-	dns.rcode = int(dh.Bits & 0xF)
-
-	// Arrays.
-	dns.question = make([]dnsQuestion, dh.Qdcount)
-	dns.answer = make([]dnsRR, 0, dh.Ancount)
-	dns.ns = make([]dnsRR, 0, dh.Nscount)
-	dns.extra = make([]dnsRR, 0, dh.Arcount)
-
-	var rec dnsRR
-
-	for i := 0; i < len(dns.question); i++ {
-		off, ok = unpackStruct(&dns.question[i], msg, off)
-	}
-	for i := 0; i < int(dh.Ancount); i++ {
-		rec, off, ok = unpackRR(msg, off)
-		if !ok {
-			return false
-		}
-		dns.answer = append(dns.answer, rec)
-	}
-	for i := 0; i < int(dh.Nscount); i++ {
-		rec, off, ok = unpackRR(msg, off)
-		if !ok {
-			return false
-		}
-		dns.ns = append(dns.ns, rec)
-	}
-	for i := 0; i < int(dh.Arcount); i++ {
-		rec, off, ok = unpackRR(msg, off)
-		if !ok {
-			return false
-		}
-		dns.extra = append(dns.extra, rec)
-	}
-	//	if off != len(msg) {
-	//		println("extra bytes in dns packet", off, "<", len(msg));
-	//	}
-	return true
-}
-
-func (dns *dnsMsg) String() string {
-	s := "DNS: " + printStruct(&dns.dnsMsgHdr) + "\n"
-	if len(dns.question) > 0 {
-		s += "-- Questions\n"
-		for i := 0; i < len(dns.question); i++ {
-			s += printStruct(&dns.question[i]) + "\n"
-		}
-	}
-	if len(dns.answer) > 0 {
-		s += "-- Answers\n"
-		for i := 0; i < len(dns.answer); i++ {
-			s += printStruct(dns.answer[i]) + "\n"
-		}
-	}
-	if len(dns.ns) > 0 {
-		s += "-- Name servers\n"
-		for i := 0; i < len(dns.ns); i++ {
-			s += printStruct(dns.ns[i]) + "\n"
-		}
-	}
-	if len(dns.extra) > 0 {
-		s += "-- Extra\n"
-		for i := 0; i < len(dns.extra); i++ {
-			s += printStruct(dns.extra[i]) + "\n"
-		}
-	}
-	return s
-}
diff --git a/third_party/gofrontend/libgo/go/net/dnsmsg_test.go b/third_party/gofrontend/libgo/go/net/dnsmsg_test.go
deleted file mode 100644
index 1078d77..0000000
--- a/third_party/gofrontend/libgo/go/net/dnsmsg_test.go
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"encoding/hex"
-	"reflect"
-	"testing"
-)
-
-func TestDNSParseSRVReply(t *testing.T) {
-	data, err := hex.DecodeString(dnsSRVReply)
-	if err != nil {
-		t.Fatal(err)
-	}
-	msg := new(dnsMsg)
-	ok := msg.Unpack(data)
-	if !ok {
-		t.Fatal("unpacking packet failed")
-	}
-	msg.String() // exercise this code path
-	if g, e := len(msg.answer), 5; g != e {
-		t.Errorf("len(msg.answer) = %d; want %d", g, e)
-	}
-	for idx, rr := range msg.answer {
-		if g, e := rr.Header().Rrtype, uint16(dnsTypeSRV); g != e {
-			t.Errorf("rr[%d].Header().Rrtype = %d; want %d", idx, g, e)
-		}
-		if _, ok := rr.(*dnsRR_SRV); !ok {
-			t.Errorf("answer[%d] = %T; want *dnsRR_SRV", idx, rr)
-		}
-	}
-	for _, name := range [...]string{
-		"_xmpp-server._tcp.google.com.",
-		"_XMPP-Server._TCP.Google.COM.",
-		"_XMPP-SERVER._TCP.GOOGLE.COM.",
-	} {
-		_, addrs, err := answer(name, "foo:53", msg, uint16(dnsTypeSRV))
-		if err != nil {
-			t.Error(err)
-		}
-		if g, e := len(addrs), 5; g != e {
-			t.Errorf("len(addrs) = %d; want %d", g, e)
-			t.Logf("addrs = %#v", addrs)
-		}
-	}
-	// repack and unpack.
-	data2, ok := msg.Pack()
-	msg2 := new(dnsMsg)
-	msg2.Unpack(data2)
-	switch {
-	case !ok:
-		t.Error("failed to repack message")
-	case !reflect.DeepEqual(msg, msg2):
-		t.Error("repacked message differs from original")
-	}
-}
-
-func TestDNSParseCorruptSRVReply(t *testing.T) {
-	data, err := hex.DecodeString(dnsSRVCorruptReply)
-	if err != nil {
-		t.Fatal(err)
-	}
-	msg := new(dnsMsg)
-	ok := msg.Unpack(data)
-	if !ok {
-		t.Fatal("unpacking packet failed")
-	}
-	msg.String() // exercise this code path
-	if g, e := len(msg.answer), 5; g != e {
-		t.Errorf("len(msg.answer) = %d; want %d", g, e)
-	}
-	for idx, rr := range msg.answer {
-		if g, e := rr.Header().Rrtype, uint16(dnsTypeSRV); g != e {
-			t.Errorf("rr[%d].Header().Rrtype = %d; want %d", idx, g, e)
-		}
-		if idx == 4 {
-			if _, ok := rr.(*dnsRR_Header); !ok {
-				t.Errorf("answer[%d] = %T; want *dnsRR_Header", idx, rr)
-			}
-		} else {
-			if _, ok := rr.(*dnsRR_SRV); !ok {
-				t.Errorf("answer[%d] = %T; want *dnsRR_SRV", idx, rr)
-			}
-		}
-	}
-	_, addrs, err := answer("_xmpp-server._tcp.google.com.", "foo:53", msg, uint16(dnsTypeSRV))
-	if err != nil {
-		t.Fatalf("answer: %v", err)
-	}
-	if g, e := len(addrs), 4; g != e {
-		t.Errorf("len(addrs) = %d; want %d", g, e)
-		t.Logf("addrs = %#v", addrs)
-	}
-}
-
-func TestDNSParseTXTReply(t *testing.T) {
-	expectedTxt1 := "v=spf1 redirect=_spf.google.com"
-	expectedTxt2 := "v=spf1 ip4:69.63.179.25 ip4:69.63.178.128/25 ip4:69.63.184.0/25 " +
-		"ip4:66.220.144.128/25 ip4:66.220.155.0/24 " +
-		"ip4:69.171.232.0/25 ip4:66.220.157.0/25 " +
-		"ip4:69.171.244.0/24 mx -all"
-
-	replies := []string{dnsTXTReply1, dnsTXTReply2}
-	expectedTxts := []string{expectedTxt1, expectedTxt2}
-
-	for i := range replies {
-		data, err := hex.DecodeString(replies[i])
-		if err != nil {
-			t.Fatal(err)
-		}
-
-		msg := new(dnsMsg)
-		ok := msg.Unpack(data)
-		if !ok {
-			t.Errorf("test %d: unpacking packet failed", i)
-			continue
-		}
-
-		if len(msg.answer) != 1 {
-			t.Errorf("test %d: len(rr.answer) = %d; want 1", i, len(msg.answer))
-			continue
-		}
-
-		rr := msg.answer[0]
-		rrTXT, ok := rr.(*dnsRR_TXT)
-		if !ok {
-			t.Errorf("test %d: answer[0] = %T; want *dnsRR_TXT", i, rr)
-			continue
-		}
-
-		if rrTXT.Txt != expectedTxts[i] {
-			t.Errorf("test %d: Txt = %s; want %s", i, rrTXT.Txt, expectedTxts[i])
-		}
-	}
-}
-
-func TestDNSParseTXTCorruptDataLengthReply(t *testing.T) {
-	replies := []string{dnsTXTCorruptDataLengthReply1, dnsTXTCorruptDataLengthReply2}
-
-	for i := range replies {
-		data, err := hex.DecodeString(replies[i])
-		if err != nil {
-			t.Fatal(err)
-		}
-
-		msg := new(dnsMsg)
-		ok := msg.Unpack(data)
-		if ok {
-			t.Errorf("test %d: expected to fail on unpacking corrupt packet", i)
-		}
-	}
-}
-
-func TestDNSParseTXTCorruptTXTLengthReply(t *testing.T) {
-	replies := []string{dnsTXTCorruptTXTLengthReply1, dnsTXTCorruptTXTLengthReply2}
-
-	for i := range replies {
-		data, err := hex.DecodeString(replies[i])
-		if err != nil {
-			t.Fatal(err)
-		}
-
-		msg := new(dnsMsg)
-		ok := msg.Unpack(data)
-		// Unpacking should succeed, but we should just get the header.
-		if !ok {
-			t.Errorf("test %d: unpacking packet failed", i)
-			continue
-		}
-
-		if len(msg.answer) != 1 {
-			t.Errorf("test %d: len(rr.answer) = %d; want 1", i, len(msg.answer))
-			continue
-		}
-
-		rr := msg.answer[0]
-		if _, justHeader := rr.(*dnsRR_Header); !justHeader {
-			t.Errorf("test %d: rr = %T; expected *dnsRR_Header", i, rr)
-		}
-	}
-}
-
-// Valid DNS SRV reply
-const dnsSRVReply = "0901818000010005000000000c5f786d70702d736572766572045f74637006676f6f67" +
-	"6c6503636f6d0000210001c00c002100010000012c00210014000014950c786d70702d" +
-	"73657276657234016c06676f6f676c6503636f6d00c00c002100010000012c00210014" +
-	"000014950c786d70702d73657276657232016c06676f6f676c6503636f6d00c00c0021" +
-	"00010000012c00210014000014950c786d70702d73657276657233016c06676f6f676c" +
-	"6503636f6d00c00c002100010000012c00200005000014950b786d70702d7365727665" +
-	"72016c06676f6f676c6503636f6d00c00c002100010000012c00210014000014950c78" +
-	"6d70702d73657276657231016c06676f6f676c6503636f6d00"
-
-// Corrupt DNS SRV reply, with its final RR having a bogus length
-// (perhaps it was truncated, or it's malicious) The mutation is the
-// capital "FF" below, instead of the proper "21".
-const dnsSRVCorruptReply = "0901818000010005000000000c5f786d70702d736572766572045f74637006676f6f67" +
-	"6c6503636f6d0000210001c00c002100010000012c00210014000014950c786d70702d" +
-	"73657276657234016c06676f6f676c6503636f6d00c00c002100010000012c00210014" +
-	"000014950c786d70702d73657276657232016c06676f6f676c6503636f6d00c00c0021" +
-	"00010000012c00210014000014950c786d70702d73657276657233016c06676f6f676c" +
-	"6503636f6d00c00c002100010000012c00200005000014950b786d70702d7365727665" +
-	"72016c06676f6f676c6503636f6d00c00c002100010000012c00FF0014000014950c78" +
-	"6d70702d73657276657231016c06676f6f676c6503636f6d00"
-
-// TXT reply with one <character-string>
-const dnsTXTReply1 = "b3458180000100010004000505676d61696c03636f6d0000100001c00c001000010000012c00" +
-	"201f763d737066312072656469726563743d5f7370662e676f6f676c652e636f6dc00" +
-	"c0002000100025d4c000d036e733406676f6f676c65c012c00c0002000100025d4c00" +
-	"06036e7331c057c00c0002000100025d4c0006036e7333c057c00c0002000100025d4" +
-	"c0006036e7332c057c06c00010001000248b50004d8ef200ac09000010001000248b5" +
-	"0004d8ef220ac07e00010001000248b50004d8ef240ac05300010001000248b50004d" +
-	"8ef260a0000291000000000000000"
-
-// TXT reply with more than one <character-string>.
-// See https://tools.ietf.org/html/rfc1035#section-3.3.14
-const dnsTXTReply2 = "a0a381800001000100020002045f7370660866616365626f6f6b03636f6d0000100001c00c0010000" +
-	"100000e1000af7f763d73706631206970343a36392e36332e3137392e3235206970343a36392e" +
-	"36332e3137382e3132382f3235206970343a36392e36332e3138342e302f3235206970343a363" +
-	"62e3232302e3134342e3132382f3235206970343a36362e3232302e3135352e302f3234206970" +
-	"343a36392e3137312e3233322e302f323520692e70343a36362e3232302e3135372e302f32352" +
-	"06970343a36392e3137312e3234342e302f3234206d78202d616c6cc0110002000100025d1500" +
-	"070161026e73c011c0110002000100025d1500040162c0ecc0ea0001000100025d15000445abe" +
-	"f0cc0fd0001000100025d15000445abff0c"
-
-// DataLength field should be sum of all TXT fields. In this case it's less.
-const dnsTXTCorruptDataLengthReply1 = "a0a381800001000100020002045f7370660866616365626f6f6b03636f6d0000100001c00c0010000" +
-	"100000e1000967f763d73706631206970343a36392e36332e3137392e3235206970343a36392e" +
-	"36332e3137382e3132382f3235206970343a36392e36332e3138342e302f3235206970343a363" +
-	"62e3232302e3134342e3132382f3235206970343a36362e3232302e3135352e302f3234206970" +
-	"343a36392e3137312e3233322e302f323520692e70343a36362e3232302e3135372e302f32352" +
-	"06970343a36392e3137312e3234342e302f3234206d78202d616c6cc0110002000100025d1500" +
-	"070161026e73c011c0110002000100025d1500040162c0ecc0ea0001000100025d15000445abe" +
-	"f0cc0fd0001000100025d15000445abff0c"
-
-// Same as above but DataLength is more than sum of TXT fields.
-const dnsTXTCorruptDataLengthReply2 = "a0a381800001000100020002045f7370660866616365626f6f6b03636f6d0000100001c00c0010000" +
-	"100000e1001227f763d73706631206970343a36392e36332e3137392e3235206970343a36392e" +
-	"36332e3137382e3132382f3235206970343a36392e36332e3138342e302f3235206970343a363" +
-	"62e3232302e3134342e3132382f3235206970343a36362e3232302e3135352e302f3234206970" +
-	"343a36392e3137312e3233322e302f323520692e70343a36362e3232302e3135372e302f32352" +
-	"06970343a36392e3137312e3234342e302f3234206d78202d616c6cc0110002000100025d1500" +
-	"070161026e73c011c0110002000100025d1500040162c0ecc0ea0001000100025d15000445abe" +
-	"f0cc0fd0001000100025d15000445abff0c"
-
-// TXT Length field is less than actual length.
-const dnsTXTCorruptTXTLengthReply1 = "a0a381800001000100020002045f7370660866616365626f6f6b03636f6d0000100001c00c0010000" +
-	"100000e1000af7f763d73706631206970343a36392e36332e3137392e3235206970343a36392e" +
-	"36332e3137382e3132382f3235206970343a36392e36332e3138342e302f3235206970343a363" +
-	"62e3232302e3134342e3132382f3235206970343a36362e3232302e3135352e302f3234206970" +
-	"343a36392e3137312e3233322e302f323520691470343a36362e3232302e3135372e302f32352" +
-	"06970343a36392e3137312e3234342e302f3234206d78202d616c6cc0110002000100025d1500" +
-	"070161026e73c011c0110002000100025d1500040162c0ecc0ea0001000100025d15000445abe" +
-	"f0cc0fd0001000100025d15000445abff0c"
-
-// TXT Length field is more than actual length.
-const dnsTXTCorruptTXTLengthReply2 = "a0a381800001000100020002045f7370660866616365626f6f6b03636f6d0000100001c00c0010000" +
-	"100000e1000af7f763d73706631206970343a36392e36332e3137392e3235206970343a36392e" +
-	"36332e3137382e3132382f3235206970343a36392e36332e3138342e302f3235206970343a363" +
-	"62e3232302e3134342e3132382f3235206970343a36362e3232302e3135352e302f3234206970" +
-	"343a36392e3137312e3233322e302f323520693370343a36362e3232302e3135372e302f32352" +
-	"06970343a36392e3137312e3234342e302f3234206d78202d616c6cc0110002000100025d1500" +
-	"070161026e73c011c0110002000100025d1500040162c0ecc0ea0001000100025d15000445abe" +
-	"f0cc0fd0001000100025d15000445abff0c"
diff --git a/third_party/gofrontend/libgo/go/net/dnsname_test.go b/third_party/gofrontend/libgo/go/net/dnsname_test.go
deleted file mode 100644
index be07dc6..0000000
--- a/third_party/gofrontend/libgo/go/net/dnsname_test.go
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"strings"
-	"testing"
-)
-
-type dnsNameTest struct {
-	name   string
-	result bool
-}
-
-var dnsNameTests = []dnsNameTest{
-	// RFC2181, section 11.
-	{"_xmpp-server._tcp.google.com", true},
-	{"foo.com", true},
-	{"1foo.com", true},
-	{"26.0.0.73.com", true},
-	{"fo-o.com", true},
-	{"fo1o.com", true},
-	{"foo1.com", true},
-	{"a.b..com", false},
-	{"a.b-.com", false},
-	{"a.b.com-", false},
-	{"a.b..", false},
-	{"b.com.", true},
-}
-
-func emitDNSNameTest(ch chan<- dnsNameTest) {
-	defer close(ch)
-	var char59 = ""
-	var char63 = ""
-	var char64 = ""
-	for i := 0; i < 59; i++ {
-		char59 += "a"
-	}
-	char63 = char59 + "aaaa"
-	char64 = char63 + "a"
-
-	for _, tc := range dnsNameTests {
-		ch <- tc
-	}
-
-	ch <- dnsNameTest{char63 + ".com", true}
-	ch <- dnsNameTest{char64 + ".com", false}
-	// 255 char name is fine:
-	ch <- dnsNameTest{char59 + "." + char63 + "." + char63 + "." +
-		char63 + ".com",
-		true}
-	// 256 char name is bad:
-	ch <- dnsNameTest{char59 + "a." + char63 + "." + char63 + "." +
-		char63 + ".com",
-		false}
-}
-
-func TestDNSName(t *testing.T) {
-	ch := make(chan dnsNameTest)
-	go emitDNSNameTest(ch)
-	for tc := range ch {
-		if isDomainName(tc.name) != tc.result {
-			t.Errorf("isDomainName(%q) = %v; want %v", tc.name, !tc.result, tc.result)
-		}
-	}
-}
-
-func BenchmarkDNSName(b *testing.B) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	benchmarks := append(dnsNameTests, []dnsNameTest{
-		{strings.Repeat("a", 63), true},
-		{strings.Repeat("a", 64), false},
-	}...)
-	for n := 0; n < b.N; n++ {
-		for _, tc := range benchmarks {
-			if isDomainName(tc.name) != tc.result {
-				b.Errorf("isDomainName(%q) = %v; want %v", tc.name, !tc.result, tc.result)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/error_plan9_test.go b/third_party/gofrontend/libgo/go/net/error_plan9_test.go
deleted file mode 100644
index 495ea96..0000000
--- a/third_party/gofrontend/libgo/go/net/error_plan9_test.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import "syscall"
-
-var (
-	errTimedout       = syscall.ETIMEDOUT
-	errOpNotSupported = syscall.EPLAN9
-)
-
-func isPlatformError(err error) bool {
-	_, ok := err.(syscall.ErrorString)
-	return ok
-}
diff --git a/third_party/gofrontend/libgo/go/net/error_posix_test.go b/third_party/gofrontend/libgo/go/net/error_posix_test.go
deleted file mode 100644
index 981cc83..0000000
--- a/third_party/gofrontend/libgo/go/net/error_posix_test.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package net
-
-import (
-	"os"
-	"syscall"
-	"testing"
-)
-
-var (
-	errTimedout       = syscall.ETIMEDOUT
-	errOpNotSupported = syscall.EOPNOTSUPP
-)
-
-func isPlatformError(err error) bool {
-	_, ok := err.(syscall.Errno)
-	return ok
-}
-
-func TestSpuriousENOTAVAIL(t *testing.T) {
-	for _, tt := range []struct {
-		error
-		ok bool
-	}{
-		{syscall.EADDRNOTAVAIL, true},
-		{&os.SyscallError{Syscall: "syscall", Err: syscall.EADDRNOTAVAIL}, true},
-		{&OpError{Op: "op", Err: syscall.EADDRNOTAVAIL}, true},
-		{&OpError{Op: "op", Err: &os.SyscallError{Syscall: "syscall", Err: syscall.EADDRNOTAVAIL}}, true},
-
-		{syscall.EINVAL, false},
-		{&os.SyscallError{Syscall: "syscall", Err: syscall.EINVAL}, false},
-		{&OpError{Op: "op", Err: syscall.EINVAL}, false},
-		{&OpError{Op: "op", Err: &os.SyscallError{Syscall: "syscall", Err: syscall.EINVAL}}, false},
-	} {
-		if ok := spuriousENOTAVAIL(tt.error); ok != tt.ok {
-			t.Errorf("spuriousENOTAVAIL(%v) = %v; want %v", tt.error, ok, tt.ok)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/error_test.go b/third_party/gofrontend/libgo/go/net/error_test.go
deleted file mode 100644
index bf95ff6..0000000
--- a/third_party/gofrontend/libgo/go/net/error_test.go
+++ /dev/null
@@ -1,673 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net/internal/socktest"
-	"os"
-	"runtime"
-	"testing"
-	"time"
-)
-
-func (e *OpError) isValid() error {
-	if e.Op == "" {
-		return fmt.Errorf("OpError.Op is empty: %v", e)
-	}
-	if e.Net == "" {
-		return fmt.Errorf("OpError.Net is empty: %v", e)
-	}
-	for _, addr := range []Addr{e.Source, e.Addr} {
-		switch addr := addr.(type) {
-		case nil:
-		case *TCPAddr:
-			if addr == nil {
-				return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
-			}
-		case *UDPAddr:
-			if addr == nil {
-				return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
-			}
-		case *IPAddr:
-			if addr == nil {
-				return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
-			}
-		case *IPNet:
-			if addr == nil {
-				return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
-			}
-		case *UnixAddr:
-			if addr == nil {
-				return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
-			}
-		case *pipeAddr:
-			if addr == nil {
-				return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
-			}
-		case fileAddr:
-			if addr == "" {
-				return fmt.Errorf("OpError.Source or Addr is empty: %#v, %v", addr, e)
-			}
-		default:
-			return fmt.Errorf("OpError.Source or Addr is unknown type: %T, %v", addr, e)
-		}
-	}
-	if e.Err == nil {
-		return fmt.Errorf("OpError.Err is empty: %v", e)
-	}
-	return nil
-}
-
-// parseDialError parses nestedErr and reports whether it is a valid
-// error value from Dial, Listen functions.
-// It returns nil when nestedErr is valid.
-func parseDialError(nestedErr error) error {
-	if nestedErr == nil {
-		return nil
-	}
-
-	switch err := nestedErr.(type) {
-	case *OpError:
-		if err := err.isValid(); err != nil {
-			return err
-		}
-		nestedErr = err.Err
-		goto second
-	}
-	return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
-
-second:
-	if isPlatformError(nestedErr) {
-		return nil
-	}
-	switch err := nestedErr.(type) {
-	case *AddrError, addrinfoErrno, *DNSError, InvalidAddrError, *ParseError, *timeoutError, UnknownNetworkError:
-		return nil
-	case *os.SyscallError:
-		nestedErr = err.Err
-		goto third
-	}
-	switch nestedErr {
-	case errClosing, errMissingAddress:
-		return nil
-	}
-	return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
-
-third:
-	if isPlatformError(nestedErr) {
-		return nil
-	}
-	return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
-}
-
-var dialErrorTests = []struct {
-	network, address string
-}{
-	{"foo", ""},
-	{"bar", "baz"},
-	{"datakit", "mh/astro/r70"},
-	{"tcp", ""},
-	{"tcp", "127.0.0.1:☺"},
-	{"tcp", "no-such-name:80"},
-	{"tcp", "mh/astro/r70:http"},
-
-	{"tcp", "127.0.0.1:0"},
-	{"udp", "127.0.0.1:0"},
-	{"ip:icmp", "127.0.0.1"},
-
-	{"unix", "/path/to/somewhere"},
-	{"unixgram", "/path/to/somewhere"},
-	{"unixpacket", "/path/to/somewhere"},
-}
-
-func TestDialError(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("%s does not have full support of socktest", runtime.GOOS)
-	}
-
-	origTestHookLookupIP := testHookLookupIP
-	defer func() { testHookLookupIP = origTestHookLookupIP }()
-	testHookLookupIP = func(fn func(string) ([]IPAddr, error), host string) ([]IPAddr, error) {
-		return nil, &DNSError{Err: "dial error test", Name: "name", Server: "server", IsTimeout: true}
-	}
-	sw.Set(socktest.FilterConnect, func(so *socktest.Status) (socktest.AfterFilter, error) {
-		return nil, errOpNotSupported
-	})
-	defer sw.Set(socktest.FilterConnect, nil)
-
-	d := Dialer{Timeout: someTimeout}
-	for i, tt := range dialErrorTests {
-		c, err := d.Dial(tt.network, tt.address)
-		if err == nil {
-			t.Errorf("#%d: should fail; %s:%s->%s", i, tt.network, c.LocalAddr(), c.RemoteAddr())
-			c.Close()
-			continue
-		}
-		if c != nil {
-			t.Errorf("Dial returned non-nil interface %T(%v) with err != nil", c, c)
-		}
-		if err = parseDialError(err); err != nil {
-			t.Errorf("#%d: %v", i, err)
-			continue
-		}
-	}
-}
-
-func TestProtocolDialError(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "solaris":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	for _, network := range []string{"tcp", "udp", "ip:4294967296", "unix", "unixpacket", "unixgram"} {
-		var err error
-		switch network {
-		case "tcp":
-			_, err = DialTCP(network, nil, &TCPAddr{Port: 1 << 16})
-		case "udp":
-			_, err = DialUDP(network, nil, &UDPAddr{Port: 1 << 16})
-		case "ip:4294967296":
-			_, err = DialIP(network, nil, nil)
-		case "unix", "unixpacket", "unixgram":
-			_, err = DialUnix(network, nil, &UnixAddr{Name: "//"})
-		}
-		if err == nil {
-			t.Errorf("%s: should fail", network)
-			continue
-		}
-		if err = parseDialError(err); err != nil {
-			t.Errorf("%s: %v", network, err)
-			continue
-		}
-	}
-}
-
-var listenErrorTests = []struct {
-	network, address string
-}{
-	{"foo", ""},
-	{"bar", "baz"},
-	{"datakit", "mh/astro/r70"},
-	{"tcp", "127.0.0.1:☺"},
-	{"tcp", "no-such-name:80"},
-	{"tcp", "mh/astro/r70:http"},
-
-	{"tcp", "127.0.0.1:0"},
-
-	{"unix", "/path/to/somewhere"},
-	{"unixpacket", "/path/to/somewhere"},
-}
-
-func TestListenError(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("%s does not have full support of socktest", runtime.GOOS)
-	}
-
-	origTestHookLookupIP := testHookLookupIP
-	defer func() { testHookLookupIP = origTestHookLookupIP }()
-	testHookLookupIP = func(fn func(string) ([]IPAddr, error), host string) ([]IPAddr, error) {
-		return nil, &DNSError{Err: "listen error test", Name: "name", Server: "server", IsTimeout: true}
-	}
-	sw.Set(socktest.FilterListen, func(so *socktest.Status) (socktest.AfterFilter, error) {
-		return nil, errOpNotSupported
-	})
-	defer sw.Set(socktest.FilterListen, nil)
-
-	for i, tt := range listenErrorTests {
-		ln, err := Listen(tt.network, tt.address)
-		if err == nil {
-			t.Errorf("#%d: should fail; %s:%s->", i, tt.network, ln.Addr())
-			ln.Close()
-			continue
-		}
-		if ln != nil {
-			t.Errorf("Listen returned non-nil interface %T(%v) with err != nil", ln, ln)
-		}
-		if err = parseDialError(err); err != nil {
-			t.Errorf("#%d: %v", i, err)
-			continue
-		}
-	}
-}
-
-var listenPacketErrorTests = []struct {
-	network, address string
-}{
-	{"foo", ""},
-	{"bar", "baz"},
-	{"datakit", "mh/astro/r70"},
-	{"udp", "127.0.0.1:☺"},
-	{"udp", "no-such-name:80"},
-	{"udp", "mh/astro/r70:http"},
-}
-
-func TestListenPacketError(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("%s does not have full support of socktest", runtime.GOOS)
-	}
-
-	origTestHookLookupIP := testHookLookupIP
-	defer func() { testHookLookupIP = origTestHookLookupIP }()
-	testHookLookupIP = func(fn func(string) ([]IPAddr, error), host string) ([]IPAddr, error) {
-		return nil, &DNSError{Err: "listen error test", Name: "name", Server: "server", IsTimeout: true}
-	}
-
-	for i, tt := range listenPacketErrorTests {
-		c, err := ListenPacket(tt.network, tt.address)
-		if err == nil {
-			t.Errorf("#%d: should fail; %s:%s->", i, tt.network, c.LocalAddr())
-			c.Close()
-			continue
-		}
-		if c != nil {
-			t.Errorf("ListenPacket returned non-nil interface %T(%v) with err != nil", c, c)
-		}
-		if err = parseDialError(err); err != nil {
-			t.Errorf("#%d: %v", i, err)
-			continue
-		}
-	}
-}
-
-func TestProtocolListenError(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	for _, network := range []string{"tcp", "udp", "ip:4294967296", "unix", "unixpacket", "unixgram"} {
-		var err error
-		switch network {
-		case "tcp":
-			_, err = ListenTCP(network, &TCPAddr{Port: 1 << 16})
-		case "udp":
-			_, err = ListenUDP(network, &UDPAddr{Port: 1 << 16})
-		case "ip:4294967296":
-			_, err = ListenIP(network, nil)
-		case "unix", "unixpacket":
-			_, err = ListenUnix(network, &UnixAddr{Name: "//"})
-		case "unixgram":
-			_, err = ListenUnixgram(network, &UnixAddr{Name: "//"})
-		}
-		if err == nil {
-			t.Errorf("%s: should fail", network)
-			continue
-		}
-		if err = parseDialError(err); err != nil {
-			t.Errorf("%s: %v", network, err)
-			continue
-		}
-	}
-}
-
-// parseReadError parses nestedErr and reports whether it is a valid
-// error value from Read functions.
-// It returns nil when nestedErr is valid.
-func parseReadError(nestedErr error) error {
-	if nestedErr == nil {
-		return nil
-	}
-
-	switch err := nestedErr.(type) {
-	case *OpError:
-		if err := err.isValid(); err != nil {
-			return err
-		}
-		nestedErr = err.Err
-		goto second
-	}
-	if nestedErr == io.EOF {
-		return nil
-	}
-	return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
-
-second:
-	if isPlatformError(nestedErr) {
-		return nil
-	}
-	switch err := nestedErr.(type) {
-	case *os.SyscallError:
-		nestedErr = err.Err
-		goto third
-	}
-	switch nestedErr {
-	case errClosing, errTimeout:
-		return nil
-	}
-	return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
-
-third:
-	if isPlatformError(nestedErr) {
-		return nil
-	}
-	return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
-}
-
-// parseWriteError parses nestedErr and reports whether it is a valid
-// error value from Write functions.
-// It returns nil when nestedErr is valid.
-func parseWriteError(nestedErr error) error {
-	if nestedErr == nil {
-		return nil
-	}
-
-	switch err := nestedErr.(type) {
-	case *OpError:
-		if err := err.isValid(); err != nil {
-			return err
-		}
-		nestedErr = err.Err
-		goto second
-	}
-	return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
-
-second:
-	if isPlatformError(nestedErr) {
-		return nil
-	}
-	switch err := nestedErr.(type) {
-	case *AddrError, addrinfoErrno, *DNSError, InvalidAddrError, *ParseError, *timeoutError, UnknownNetworkError:
-		return nil
-	case *os.SyscallError:
-		nestedErr = err.Err
-		goto third
-	}
-	switch nestedErr {
-	case errClosing, errTimeout, ErrWriteToConnected, io.ErrUnexpectedEOF:
-		return nil
-	}
-	return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
-
-third:
-	if isPlatformError(nestedErr) {
-		return nil
-	}
-	return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
-}
-
-// parseCloseError parses nestedErr and reports whether it is a valid
-// error value from Close functions.
-// It returns nil when nestedErr is valid.
-func parseCloseError(nestedErr error) error {
-	if nestedErr == nil {
-		return nil
-	}
-
-	switch err := nestedErr.(type) {
-	case *OpError:
-		if err := err.isValid(); err != nil {
-			return err
-		}
-		nestedErr = err.Err
-		goto second
-	}
-	return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
-
-second:
-	if isPlatformError(nestedErr) {
-		return nil
-	}
-	switch err := nestedErr.(type) {
-	case *os.SyscallError:
-		nestedErr = err.Err
-		goto third
-	case *os.PathError: // for Plan 9
-		nestedErr = err.Err
-		goto third
-	}
-	switch nestedErr {
-	case errClosing:
-		return nil
-	}
-	return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
-
-third:
-	if isPlatformError(nestedErr) {
-		return nil
-	}
-	return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
-}
-
-func TestCloseError(t *testing.T) {
-	ln, err := newLocalListener("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-	c, err := Dial(ln.Addr().Network(), ln.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	for i := 0; i < 3; i++ {
-		err = c.(*TCPConn).CloseRead()
-		if perr := parseCloseError(err); perr != nil {
-			t.Errorf("#%d: %v", i, perr)
-		}
-	}
-	for i := 0; i < 3; i++ {
-		err = c.(*TCPConn).CloseWrite()
-		if perr := parseCloseError(err); perr != nil {
-			t.Errorf("#%d: %v", i, perr)
-		}
-	}
-	for i := 0; i < 3; i++ {
-		err = c.Close()
-		if perr := parseCloseError(err); perr != nil {
-			t.Errorf("#%d: %v", i, perr)
-		}
-		err = ln.Close()
-		if perr := parseCloseError(err); perr != nil {
-			t.Errorf("#%d: %v", i, perr)
-		}
-	}
-
-	pc, err := ListenPacket("udp", "127.0.0.1:0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer pc.Close()
-
-	for i := 0; i < 3; i++ {
-		err = pc.Close()
-		if perr := parseCloseError(err); perr != nil {
-			t.Errorf("#%d: %v", i, perr)
-		}
-	}
-}
-
-// parseAcceptError parses nestedErr and reports whether it is a valid
-// error value from Accept functions.
-// It returns nil when nestedErr is valid.
-func parseAcceptError(nestedErr error) error {
-	if nestedErr == nil {
-		return nil
-	}
-
-	switch err := nestedErr.(type) {
-	case *OpError:
-		if err := err.isValid(); err != nil {
-			return err
-		}
-		nestedErr = err.Err
-		goto second
-	}
-	return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
-
-second:
-	if isPlatformError(nestedErr) {
-		return nil
-	}
-	switch err := nestedErr.(type) {
-	case *os.SyscallError:
-		nestedErr = err.Err
-		goto third
-	}
-	switch nestedErr {
-	case errClosing, errTimeout:
-		return nil
-	}
-	return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
-
-third:
-	if isPlatformError(nestedErr) {
-		return nil
-	}
-	return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
-}
-
-func TestAcceptError(t *testing.T) {
-	handler := func(ls *localServer, ln Listener) {
-		for {
-			ln.(*TCPListener).SetDeadline(time.Now().Add(5 * time.Millisecond))
-			c, err := ln.Accept()
-			if perr := parseAcceptError(err); perr != nil {
-				t.Error(perr)
-			}
-			if err != nil {
-				if c != nil {
-					t.Errorf("Accept returned non-nil interface %T(%v) with err != nil", c, c)
-				}
-				if nerr, ok := err.(Error); !ok || (!nerr.Timeout() && !nerr.Temporary()) {
-					return
-				}
-				continue
-			}
-			c.Close()
-		}
-	}
-	ls, err := newLocalServer("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err := ls.buildup(handler); err != nil {
-		ls.teardown()
-		t.Fatal(err)
-	}
-
-	time.Sleep(100 * time.Millisecond)
-	ls.teardown()
-}
-
-// parseCommonError parses nestedErr and reports whether it is a valid
-// error value from miscellaneous functions.
-// It returns nil when nestedErr is valid.
-func parseCommonError(nestedErr error) error {
-	if nestedErr == nil {
-		return nil
-	}
-
-	switch err := nestedErr.(type) {
-	case *OpError:
-		if err := err.isValid(); err != nil {
-			return err
-		}
-		nestedErr = err.Err
-		goto second
-	}
-	return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
-
-second:
-	if isPlatformError(nestedErr) {
-		return nil
-	}
-	switch err := nestedErr.(type) {
-	case *os.SyscallError:
-		nestedErr = err.Err
-		goto third
-	case *os.LinkError:
-		nestedErr = err.Err
-		goto third
-	case *os.PathError:
-		nestedErr = err.Err
-		goto third
-	}
-	switch nestedErr {
-	case errClosing:
-		return nil
-	}
-	return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
-
-third:
-	if isPlatformError(nestedErr) {
-		return nil
-	}
-	return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
-}
-
-func TestFileError(t *testing.T) {
-	switch runtime.GOOS {
-	case "windows":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	f, err := ioutil.TempFile("", "go-nettest")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.Remove(f.Name())
-	defer f.Close()
-
-	c, err := FileConn(f)
-	if err != nil {
-		if c != nil {
-			t.Errorf("FileConn returned non-nil interface %T(%v) with err != nil", c, c)
-		}
-		if perr := parseCommonError(err); perr != nil {
-			t.Error(perr)
-		}
-	} else {
-		c.Close()
-		t.Error("should fail")
-	}
-	ln, err := FileListener(f)
-	if err != nil {
-		if ln != nil {
-			t.Errorf("FileListener returned non-nil interface %T(%v) with err != nil", ln, ln)
-		}
-		if perr := parseCommonError(err); perr != nil {
-			t.Error(perr)
-		}
-	} else {
-		ln.Close()
-		t.Error("should fail")
-	}
-	pc, err := FilePacketConn(f)
-	if err != nil {
-		if pc != nil {
-			t.Errorf("FilePacketConn returned non-nil interface %T(%v) with err != nil", pc, pc)
-		}
-		if perr := parseCommonError(err); perr != nil {
-			t.Error(perr)
-		}
-	} else {
-		pc.Close()
-		t.Error("should fail")
-	}
-
-	ln, err = newLocalListener("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	for i := 0; i < 3; i++ {
-		f, err := ln.(*TCPListener).File()
-		if err != nil {
-			if perr := parseCommonError(err); perr != nil {
-				t.Error(perr)
-			}
-		} else {
-			f.Close()
-		}
-		ln.Close()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/external_test.go b/third_party/gofrontend/libgo/go/net/external_test.go
deleted file mode 100644
index d5ff2be..0000000
--- a/third_party/gofrontend/libgo/go/net/external_test.go
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"fmt"
-	"io"
-	"strings"
-	"testing"
-)
-
-func TestResolveGoogle(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv4 || !supportsIPv6 || !*testIPv4 || !*testIPv6 {
-		t.Skip("both IPv4 and IPv6 are required")
-	}
-
-	for _, network := range []string{"tcp", "tcp4", "tcp6"} {
-		addr, err := ResolveTCPAddr(network, "www.google.com:http")
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-		switch {
-		case network == "tcp" && addr.IP.To4() == nil:
-			fallthrough
-		case network == "tcp4" && addr.IP.To4() == nil:
-			t.Errorf("got %v; want an IPv4 address on %s", addr, network)
-		case network == "tcp6" && (addr.IP.To16() == nil || addr.IP.To4() != nil):
-			t.Errorf("got %v; want an IPv6 address on %s", addr, network)
-		}
-	}
-}
-
-var dialGoogleTests = []struct {
-	dial               func(string, string) (Conn, error)
-	unreachableNetwork string
-	networks           []string
-	addrs              []string
-}{
-	{
-		dial:     (&Dialer{DualStack: true}).Dial,
-		networks: []string{"tcp", "tcp4", "tcp6"},
-		addrs:    []string{"www.google.com:http"},
-	},
-	{
-		dial:               Dial,
-		unreachableNetwork: "tcp6",
-		networks:           []string{"tcp", "tcp4"},
-	},
-	{
-		dial:               Dial,
-		unreachableNetwork: "tcp4",
-		networks:           []string{"tcp", "tcp6"},
-	},
-}
-
-func TestDialGoogle(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv4 || !supportsIPv6 || !*testIPv4 || !*testIPv6 {
-		t.Skip("both IPv4 and IPv6 are required")
-	}
-
-	var err error
-	dialGoogleTests[1].addrs, dialGoogleTests[2].addrs, err = googleLiteralAddrs()
-	if err != nil {
-		t.Error(err)
-	}
-	for _, tt := range dialGoogleTests {
-		for _, network := range tt.networks {
-			disableSocketConnect(tt.unreachableNetwork)
-			for _, addr := range tt.addrs {
-				if err := fetchGoogle(tt.dial, network, addr); err != nil {
-					t.Error(err)
-				}
-			}
-			enableSocketConnect()
-		}
-	}
-}
-
-var (
-	literalAddrs4 = [...]string{
-		"%d.%d.%d.%d:80",
-		"www.google.com:80",
-		"%d.%d.%d.%d:http",
-		"www.google.com:http",
-		"%03d.%03d.%03d.%03d:0080",
-		"[::ffff:%d.%d.%d.%d]:80",
-		"[::ffff:%02x%02x:%02x%02x]:80",
-		"[0:0:0:0:0000:ffff:%d.%d.%d.%d]:80",
-		"[0:0:0:0:000000:ffff:%d.%d.%d.%d]:80",
-		"[0:0:0:0::ffff:%d.%d.%d.%d]:80",
-	}
-	literalAddrs6 = [...]string{
-		"[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]:80",
-		"ipv6.google.com:80",
-		"[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]:http",
-		"ipv6.google.com:http",
-	}
-)
-
-func googleLiteralAddrs() (lits4, lits6 []string, err error) {
-	ips, err := LookupIP("www.google.com")
-	if err != nil {
-		return nil, nil, err
-	}
-	if len(ips) == 0 {
-		return nil, nil, nil
-	}
-	var ip4, ip6 IP
-	for _, ip := range ips {
-		if ip4 == nil && ip.To4() != nil {
-			ip4 = ip.To4()
-		}
-		if ip6 == nil && ip.To16() != nil && ip.To4() == nil {
-			ip6 = ip.To16()
-		}
-		if ip4 != nil && ip6 != nil {
-			break
-		}
-	}
-	if ip4 != nil {
-		for i, lit4 := range literalAddrs4 {
-			if strings.Contains(lit4, "%") {
-				literalAddrs4[i] = fmt.Sprintf(lit4, ip4[0], ip4[1], ip4[2], ip4[3])
-			}
-		}
-		lits4 = literalAddrs4[:]
-	}
-	if ip6 != nil {
-		for i, lit6 := range literalAddrs6 {
-			if strings.Contains(lit6, "%") {
-				literalAddrs6[i] = fmt.Sprintf(lit6, ip6[0], ip6[1], ip6[2], ip6[3], ip6[4], ip6[5], ip6[6], ip6[7], ip6[8], ip6[9], ip6[10], ip6[11], ip6[12], ip6[13], ip6[14], ip6[15])
-			}
-		}
-		lits6 = literalAddrs6[:]
-	}
-	return
-}
-
-func fetchGoogle(dial func(string, string) (Conn, error), network, address string) error {
-	c, err := dial(network, address)
-	if err != nil {
-		return err
-	}
-	defer c.Close()
-	req := []byte("GET /robots.txt HTTP/1.0\r\nHost: www.google.com\r\n\r\n")
-	if _, err := c.Write(req); err != nil {
-		return err
-	}
-	b := make([]byte, 1000)
-	n, err := io.ReadFull(c, b)
-	if err != nil {
-		return err
-	}
-	if n < 1000 {
-		return fmt.Errorf("short read from %s:%s->%s", network, c.RemoteAddr(), c.LocalAddr())
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/fd_mutex.go b/third_party/gofrontend/libgo/go/net/fd_mutex.go
deleted file mode 100644
index 6d5509d..0000000
--- a/third_party/gofrontend/libgo/go/net/fd_mutex.go
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import "sync/atomic"
-
-// fdMutex is a specialized synchronization primitive
-// that manages lifetime of an fd and serializes access
-// to Read and Write methods on netFD.
-type fdMutex struct {
-	state uint64
-	rsema uint32
-	wsema uint32
-}
-
-// fdMutex.state is organized as follows:
-// 1 bit - whether netFD is closed, if set all subsequent lock operations will fail.
-// 1 bit - lock for read operations.
-// 1 bit - lock for write operations.
-// 20 bits - total number of references (read+write+misc).
-// 20 bits - number of outstanding read waiters.
-// 20 bits - number of outstanding write waiters.
-const (
-	mutexClosed  = 1 << 0
-	mutexRLock   = 1 << 1
-	mutexWLock   = 1 << 2
-	mutexRef     = 1 << 3
-	mutexRefMask = (1<<20 - 1) << 3
-	mutexRWait   = 1 << 23
-	mutexRMask   = (1<<20 - 1) << 23
-	mutexWWait   = 1 << 43
-	mutexWMask   = (1<<20 - 1) << 43
-)
-
-// Read operations must do RWLock(true)/RWUnlock(true).
-// Write operations must do RWLock(false)/RWUnlock(false).
-// Misc operations must do Incref/Decref. Misc operations include functions like
-// setsockopt and setDeadline. They need to use Incref/Decref to ensure that
-// they operate on the correct fd in presence of a concurrent Close call
-// (otherwise fd can be closed under their feet).
-// Close operation must do IncrefAndClose/Decref.
-
-// RWLock/Incref return whether fd is open.
-// RWUnlock/Decref return whether fd is closed and there are no remaining references.
-
-func (mu *fdMutex) Incref() bool {
-	for {
-		old := atomic.LoadUint64(&mu.state)
-		if old&mutexClosed != 0 {
-			return false
-		}
-		new := old + mutexRef
-		if new&mutexRefMask == 0 {
-			panic("net: inconsistent fdMutex")
-		}
-		if atomic.CompareAndSwapUint64(&mu.state, old, new) {
-			return true
-		}
-	}
-}
-
-func (mu *fdMutex) IncrefAndClose() bool {
-	for {
-		old := atomic.LoadUint64(&mu.state)
-		if old&mutexClosed != 0 {
-			return false
-		}
-		// Mark as closed and acquire a reference.
-		new := (old | mutexClosed) + mutexRef
-		if new&mutexRefMask == 0 {
-			panic("net: inconsistent fdMutex")
-		}
-		// Remove all read and write waiters.
-		new &^= mutexRMask | mutexWMask
-		if atomic.CompareAndSwapUint64(&mu.state, old, new) {
-			// Wake all read and write waiters,
-			// they will observe closed flag after wakeup.
-			for old&mutexRMask != 0 {
-				old -= mutexRWait
-				runtime_Semrelease(&mu.rsema)
-			}
-			for old&mutexWMask != 0 {
-				old -= mutexWWait
-				runtime_Semrelease(&mu.wsema)
-			}
-			return true
-		}
-	}
-}
-
-func (mu *fdMutex) Decref() bool {
-	for {
-		old := atomic.LoadUint64(&mu.state)
-		if old&mutexRefMask == 0 {
-			panic("net: inconsistent fdMutex")
-		}
-		new := old - mutexRef
-		if atomic.CompareAndSwapUint64(&mu.state, old, new) {
-			return new&(mutexClosed|mutexRefMask) == mutexClosed
-		}
-	}
-}
-
-func (mu *fdMutex) RWLock(read bool) bool {
-	var mutexBit, mutexWait, mutexMask uint64
-	var mutexSema *uint32
-	if read {
-		mutexBit = mutexRLock
-		mutexWait = mutexRWait
-		mutexMask = mutexRMask
-		mutexSema = &mu.rsema
-	} else {
-		mutexBit = mutexWLock
-		mutexWait = mutexWWait
-		mutexMask = mutexWMask
-		mutexSema = &mu.wsema
-	}
-	for {
-		old := atomic.LoadUint64(&mu.state)
-		if old&mutexClosed != 0 {
-			return false
-		}
-		var new uint64
-		if old&mutexBit == 0 {
-			// Lock is free, acquire it.
-			new = (old | mutexBit) + mutexRef
-			if new&mutexRefMask == 0 {
-				panic("net: inconsistent fdMutex")
-			}
-		} else {
-			// Wait for lock.
-			new = old + mutexWait
-			if new&mutexMask == 0 {
-				panic("net: inconsistent fdMutex")
-			}
-		}
-		if atomic.CompareAndSwapUint64(&mu.state, old, new) {
-			if old&mutexBit == 0 {
-				return true
-			}
-			runtime_Semacquire(mutexSema)
-			// The signaller has subtracted mutexWait.
-		}
-	}
-}
-
-func (mu *fdMutex) RWUnlock(read bool) bool {
-	var mutexBit, mutexWait, mutexMask uint64
-	var mutexSema *uint32
-	if read {
-		mutexBit = mutexRLock
-		mutexWait = mutexRWait
-		mutexMask = mutexRMask
-		mutexSema = &mu.rsema
-	} else {
-		mutexBit = mutexWLock
-		mutexWait = mutexWWait
-		mutexMask = mutexWMask
-		mutexSema = &mu.wsema
-	}
-	for {
-		old := atomic.LoadUint64(&mu.state)
-		if old&mutexBit == 0 || old&mutexRefMask == 0 {
-			panic("net: inconsistent fdMutex")
-		}
-		// Drop lock, drop reference and wake read waiter if present.
-		new := (old &^ mutexBit) - mutexRef
-		if old&mutexMask != 0 {
-			new -= mutexWait
-		}
-		if atomic.CompareAndSwapUint64(&mu.state, old, new) {
-			if old&mutexMask != 0 {
-				runtime_Semrelease(mutexSema)
-			}
-			return new&(mutexClosed|mutexRefMask) == mutexClosed
-		}
-	}
-}
-
-// Implemented in runtime package.
-func runtime_Semacquire(sema *uint32)
-func runtime_Semrelease(sema *uint32)
diff --git a/third_party/gofrontend/libgo/go/net/fd_mutex_test.go b/third_party/gofrontend/libgo/go/net/fd_mutex_test.go
deleted file mode 100644
index c34ec59..0000000
--- a/third_party/gofrontend/libgo/go/net/fd_mutex_test.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"math/rand"
-	"runtime"
-	"testing"
-	"time"
-)
-
-func TestMutexLock(t *testing.T) {
-	var mu fdMutex
-
-	if !mu.Incref() {
-		t.Fatal("broken")
-	}
-	if mu.Decref() {
-		t.Fatal("broken")
-	}
-
-	if !mu.RWLock(true) {
-		t.Fatal("broken")
-	}
-	if mu.RWUnlock(true) {
-		t.Fatal("broken")
-	}
-
-	if !mu.RWLock(false) {
-		t.Fatal("broken")
-	}
-	if mu.RWUnlock(false) {
-		t.Fatal("broken")
-	}
-}
-
-func TestMutexClose(t *testing.T) {
-	var mu fdMutex
-	if !mu.IncrefAndClose() {
-		t.Fatal("broken")
-	}
-
-	if mu.Incref() {
-		t.Fatal("broken")
-	}
-	if mu.RWLock(true) {
-		t.Fatal("broken")
-	}
-	if mu.RWLock(false) {
-		t.Fatal("broken")
-	}
-	if mu.IncrefAndClose() {
-		t.Fatal("broken")
-	}
-}
-
-func TestMutexCloseUnblock(t *testing.T) {
-	c := make(chan bool)
-	var mu fdMutex
-	mu.RWLock(true)
-	for i := 0; i < 4; i++ {
-		go func() {
-			if mu.RWLock(true) {
-				t.Error("broken")
-				return
-			}
-			c <- true
-		}()
-	}
-	// Concurrent goroutines must not be able to read lock the mutex.
-	time.Sleep(time.Millisecond)
-	select {
-	case <-c:
-		t.Fatal("broken")
-	default:
-	}
-	mu.IncrefAndClose() // Must unblock the readers.
-	for i := 0; i < 4; i++ {
-		select {
-		case <-c:
-		case <-time.After(10 * time.Second):
-			t.Fatal("broken")
-		}
-	}
-	if mu.Decref() {
-		t.Fatal("broken")
-	}
-	if !mu.RWUnlock(true) {
-		t.Fatal("broken")
-	}
-}
-
-func TestMutexPanic(t *testing.T) {
-	ensurePanics := func(f func()) {
-		defer func() {
-			if recover() == nil {
-				t.Fatal("does not panic")
-			}
-		}()
-		f()
-	}
-
-	var mu fdMutex
-	ensurePanics(func() { mu.Decref() })
-	ensurePanics(func() { mu.RWUnlock(true) })
-	ensurePanics(func() { mu.RWUnlock(false) })
-
-	ensurePanics(func() { mu.Incref(); mu.Decref(); mu.Decref() })
-	ensurePanics(func() { mu.RWLock(true); mu.RWUnlock(true); mu.RWUnlock(true) })
-	ensurePanics(func() { mu.RWLock(false); mu.RWUnlock(false); mu.RWUnlock(false) })
-
-	// ensure that it's still not broken
-	mu.Incref()
-	mu.Decref()
-	mu.RWLock(true)
-	mu.RWUnlock(true)
-	mu.RWLock(false)
-	mu.RWUnlock(false)
-}
-
-func TestMutexStress(t *testing.T) {
-	P := 8
-	N := int(1e6)
-	if testing.Short() {
-		P = 4
-		N = 1e4
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(P))
-	done := make(chan bool)
-	var mu fdMutex
-	var readState [2]uint64
-	var writeState [2]uint64
-	for p := 0; p < P; p++ {
-		go func() {
-			r := rand.New(rand.NewSource(rand.Int63()))
-			for i := 0; i < N; i++ {
-				switch r.Intn(3) {
-				case 0:
-					if !mu.Incref() {
-						t.Error("broken")
-						return
-					}
-					if mu.Decref() {
-						t.Error("broken")
-						return
-					}
-				case 1:
-					if !mu.RWLock(true) {
-						t.Error("broken")
-						return
-					}
-					// Ensure that it provides mutual exclusion for readers.
-					if readState[0] != readState[1] {
-						t.Error("broken")
-						return
-					}
-					readState[0]++
-					readState[1]++
-					if mu.RWUnlock(true) {
-						t.Error("broken")
-						return
-					}
-				case 2:
-					if !mu.RWLock(false) {
-						t.Error("broken")
-						return
-					}
-					// Ensure that it provides mutual exclusion for writers.
-					if writeState[0] != writeState[1] {
-						t.Error("broken")
-						return
-					}
-					writeState[0]++
-					writeState[1]++
-					if mu.RWUnlock(false) {
-						t.Error("broken")
-						return
-					}
-				}
-			}
-			done <- true
-		}()
-	}
-	for p := 0; p < P; p++ {
-		<-done
-	}
-	if !mu.IncrefAndClose() {
-		t.Fatal("broken")
-	}
-	if !mu.Decref() {
-		t.Fatal("broken")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/fd_plan9.go b/third_party/gofrontend/libgo/go/net/fd_plan9.go
deleted file mode 100644
index 32766f5..0000000
--- a/third_party/gofrontend/libgo/go/net/fd_plan9.go
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"io"
-	"os"
-	"syscall"
-	"time"
-)
-
-// Network file descriptor.
-type netFD struct {
-	// locking/lifetime of sysfd + serialize access to Read and Write methods
-	fdmu fdMutex
-
-	// immutable until Close
-	net          string
-	n            string
-	dir          string
-	ctl, data    *os.File
-	laddr, raddr Addr
-}
-
-var (
-	netdir string // default network
-)
-
-func sysInit() {
-	netdir = "/net"
-}
-
-func dial(net string, ra Addr, dialer func(time.Time) (Conn, error), deadline time.Time) (Conn, error) {
-	// On plan9, use the relatively inefficient
-	// goroutine-racing implementation.
-	return dialChannel(net, ra, dialer, deadline)
-}
-
-func newFD(net, name string, ctl, data *os.File, laddr, raddr Addr) (*netFD, error) {
-	return &netFD{net: net, n: name, dir: netdir + "/" + net + "/" + name, ctl: ctl, data: data, laddr: laddr, raddr: raddr}, nil
-}
-
-func (fd *netFD) init() error {
-	// stub for future fd.pd.Init(fd)
-	return nil
-}
-
-func (fd *netFD) name() string {
-	var ls, rs string
-	if fd.laddr != nil {
-		ls = fd.laddr.String()
-	}
-	if fd.raddr != nil {
-		rs = fd.raddr.String()
-	}
-	return fd.net + ":" + ls + "->" + rs
-}
-
-func (fd *netFD) ok() bool { return fd != nil && fd.ctl != nil }
-
-func (fd *netFD) destroy() {
-	if !fd.ok() {
-		return
-	}
-	err := fd.ctl.Close()
-	if fd.data != nil {
-		if err1 := fd.data.Close(); err1 != nil && err == nil {
-			err = err1
-		}
-	}
-	fd.ctl = nil
-	fd.data = nil
-}
-
-// Add a reference to this fd.
-// Returns an error if the fd cannot be used.
-func (fd *netFD) incref() error {
-	if !fd.fdmu.Incref() {
-		return errClosing
-	}
-	return nil
-}
-
-// Remove a reference to this FD and close if we've been asked to do so
-// (and there are no references left).
-func (fd *netFD) decref() {
-	if fd.fdmu.Decref() {
-		fd.destroy()
-	}
-}
-
-// Add a reference to this fd and lock for reading.
-// Returns an error if the fd cannot be used.
-func (fd *netFD) readLock() error {
-	if !fd.fdmu.RWLock(true) {
-		return errClosing
-	}
-	return nil
-}
-
-// Unlock for reading and remove a reference to this FD.
-func (fd *netFD) readUnlock() {
-	if fd.fdmu.RWUnlock(true) {
-		fd.destroy()
-	}
-}
-
-// Add a reference to this fd and lock for writing.
-// Returns an error if the fd cannot be used.
-func (fd *netFD) writeLock() error {
-	if !fd.fdmu.RWLock(false) {
-		return errClosing
-	}
-	return nil
-}
-
-// Unlock for writing and remove a reference to this FD.
-func (fd *netFD) writeUnlock() {
-	if fd.fdmu.RWUnlock(false) {
-		fd.destroy()
-	}
-}
-
-func (fd *netFD) Read(b []byte) (n int, err error) {
-	if !fd.ok() || fd.data == nil {
-		return 0, syscall.EINVAL
-	}
-	if err := fd.readLock(); err != nil {
-		return 0, err
-	}
-	defer fd.readUnlock()
-	n, err = fd.data.Read(b)
-	if fd.net == "udp" && err == io.EOF {
-		n = 0
-		err = nil
-	}
-	return
-}
-
-func (fd *netFD) Write(b []byte) (n int, err error) {
-	if !fd.ok() || fd.data == nil {
-		return 0, syscall.EINVAL
-	}
-	if err := fd.writeLock(); err != nil {
-		return 0, err
-	}
-	defer fd.writeUnlock()
-	return fd.data.Write(b)
-}
-
-func (fd *netFD) closeRead() error {
-	if !fd.ok() {
-		return syscall.EINVAL
-	}
-	return syscall.EPLAN9
-}
-
-func (fd *netFD) closeWrite() error {
-	if !fd.ok() {
-		return syscall.EINVAL
-	}
-	return syscall.EPLAN9
-}
-
-func (fd *netFD) Close() error {
-	if !fd.fdmu.IncrefAndClose() {
-		return errClosing
-	}
-	if !fd.ok() {
-		return syscall.EINVAL
-	}
-	err := fd.ctl.Close()
-	if fd.data != nil {
-		if err1 := fd.data.Close(); err1 != nil && err == nil {
-			err = err1
-		}
-	}
-	fd.ctl = nil
-	fd.data = nil
-	return err
-}
-
-// This method is only called via Conn.
-func (fd *netFD) dup() (*os.File, error) {
-	if !fd.ok() || fd.data == nil {
-		return nil, syscall.EINVAL
-	}
-	return fd.file(fd.data, fd.dir+"/data")
-}
-
-func (l *TCPListener) dup() (*os.File, error) {
-	if !l.fd.ok() {
-		return nil, syscall.EINVAL
-	}
-	return l.fd.file(l.fd.ctl, l.fd.dir+"/ctl")
-}
-
-func (fd *netFD) file(f *os.File, s string) (*os.File, error) {
-	syscall.ForkLock.RLock()
-	dfd, err := syscall.Dup(int(f.Fd()), -1)
-	syscall.ForkLock.RUnlock()
-	if err != nil {
-		return nil, os.NewSyscallError("dup", err)
-	}
-	return os.NewFile(uintptr(dfd), s), nil
-}
-
-func (fd *netFD) setDeadline(t time.Time) error {
-	return syscall.EPLAN9
-}
-
-func (fd *netFD) setReadDeadline(t time.Time) error {
-	return syscall.EPLAN9
-}
-
-func (fd *netFD) setWriteDeadline(t time.Time) error {
-	return syscall.EPLAN9
-}
-
-func setReadBuffer(fd *netFD, bytes int) error {
-	return syscall.EPLAN9
-}
-
-func setWriteBuffer(fd *netFD, bytes int) error {
-	return syscall.EPLAN9
-}
diff --git a/third_party/gofrontend/libgo/go/net/fd_poll_nacl.go b/third_party/gofrontend/libgo/go/net/fd_poll_nacl.go
deleted file mode 100644
index cdf14e3..0000000
--- a/third_party/gofrontend/libgo/go/net/fd_poll_nacl.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"syscall"
-	"time"
-)
-
-type pollDesc struct {
-	fd      *netFD
-	closing bool
-}
-
-func (pd *pollDesc) Init(fd *netFD) error { pd.fd = fd; return nil }
-
-func (pd *pollDesc) Close() {}
-
-func (pd *pollDesc) Evict() {
-	pd.closing = true
-	if pd.fd != nil {
-		syscall.StopIO(pd.fd.sysfd)
-	}
-}
-
-func (pd *pollDesc) Prepare(mode int) error {
-	if pd.closing {
-		return errClosing
-	}
-	return nil
-}
-
-func (pd *pollDesc) PrepareRead() error { return pd.Prepare('r') }
-
-func (pd *pollDesc) PrepareWrite() error { return pd.Prepare('w') }
-
-func (pd *pollDesc) Wait(mode int) error {
-	if pd.closing {
-		return errClosing
-	}
-	return errTimeout
-}
-
-func (pd *pollDesc) WaitRead() error { return pd.Wait('r') }
-
-func (pd *pollDesc) WaitWrite() error { return pd.Wait('w') }
-
-func (pd *pollDesc) WaitCanceled(mode int) {}
-
-func (pd *pollDesc) WaitCanceledRead() {}
-
-func (pd *pollDesc) WaitCanceledWrite() {}
-
-func (fd *netFD) setDeadline(t time.Time) error {
-	return setDeadlineImpl(fd, t, 'r'+'w')
-}
-
-func (fd *netFD) setReadDeadline(t time.Time) error {
-	return setDeadlineImpl(fd, t, 'r')
-}
-
-func (fd *netFD) setWriteDeadline(t time.Time) error {
-	return setDeadlineImpl(fd, t, 'w')
-}
-
-func setDeadlineImpl(fd *netFD, t time.Time, mode int) error {
-	d := t.UnixNano()
-	if t.IsZero() {
-		d = 0
-	}
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	switch mode {
-	case 'r':
-		syscall.SetReadDeadline(fd.sysfd, d)
-	case 'w':
-		syscall.SetWriteDeadline(fd.sysfd, d)
-	case 'r' + 'w':
-		syscall.SetReadDeadline(fd.sysfd, d)
-		syscall.SetWriteDeadline(fd.sysfd, d)
-	}
-	fd.decref()
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/fd_poll_runtime.go b/third_party/gofrontend/libgo/go/net/fd_poll_runtime.go
deleted file mode 100644
index 8522cce..0000000
--- a/third_party/gofrontend/libgo/go/net/fd_poll_runtime.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd windows solaris
-
-package net
-
-import (
-	"sync"
-	"syscall"
-	"time"
-)
-
-// runtimeNano returns the current value of the runtime clock in nanoseconds.
-func runtimeNano() int64
-
-func runtime_pollServerInit()
-func runtime_pollOpen(fd uintptr) (uintptr, int)
-func runtime_pollClose(ctx uintptr)
-func runtime_pollWait(ctx uintptr, mode int) int
-func runtime_pollWaitCanceled(ctx uintptr, mode int) int
-func runtime_pollReset(ctx uintptr, mode int) int
-func runtime_pollSetDeadline(ctx uintptr, d int64, mode int)
-func runtime_pollUnblock(ctx uintptr)
-
-type pollDesc struct {
-	runtimeCtx uintptr
-}
-
-var serverInit sync.Once
-
-func (pd *pollDesc) Init(fd *netFD) error {
-	serverInit.Do(runtime_pollServerInit)
-	ctx, errno := runtime_pollOpen(uintptr(fd.sysfd))
-	if errno != 0 {
-		return syscall.Errno(errno)
-	}
-	pd.runtimeCtx = ctx
-	return nil
-}
-
-func (pd *pollDesc) Close() {
-	if pd.runtimeCtx == 0 {
-		return
-	}
-	runtime_pollClose(pd.runtimeCtx)
-	pd.runtimeCtx = 0
-}
-
-// Evict evicts fd from the pending list, unblocking any I/O running on fd.
-func (pd *pollDesc) Evict() {
-	if pd.runtimeCtx == 0 {
-		return
-	}
-	runtime_pollUnblock(pd.runtimeCtx)
-}
-
-func (pd *pollDesc) Prepare(mode int) error {
-	res := runtime_pollReset(pd.runtimeCtx, mode)
-	return convertErr(res)
-}
-
-func (pd *pollDesc) PrepareRead() error {
-	return pd.Prepare('r')
-}
-
-func (pd *pollDesc) PrepareWrite() error {
-	return pd.Prepare('w')
-}
-
-func (pd *pollDesc) Wait(mode int) error {
-	res := runtime_pollWait(pd.runtimeCtx, mode)
-	return convertErr(res)
-}
-
-func (pd *pollDesc) WaitRead() error {
-	return pd.Wait('r')
-}
-
-func (pd *pollDesc) WaitWrite() error {
-	return pd.Wait('w')
-}
-
-func (pd *pollDesc) WaitCanceled(mode int) {
-	runtime_pollWaitCanceled(pd.runtimeCtx, mode)
-}
-
-func (pd *pollDesc) WaitCanceledRead() {
-	pd.WaitCanceled('r')
-}
-
-func (pd *pollDesc) WaitCanceledWrite() {
-	pd.WaitCanceled('w')
-}
-
-func convertErr(res int) error {
-	switch res {
-	case 0:
-		return nil
-	case 1:
-		return errClosing
-	case 2:
-		return errTimeout
-	}
-	println("unreachable: ", res)
-	panic("unreachable")
-}
-
-func (fd *netFD) setDeadline(t time.Time) error {
-	return setDeadlineImpl(fd, t, 'r'+'w')
-}
-
-func (fd *netFD) setReadDeadline(t time.Time) error {
-	return setDeadlineImpl(fd, t, 'r')
-}
-
-func (fd *netFD) setWriteDeadline(t time.Time) error {
-	return setDeadlineImpl(fd, t, 'w')
-}
-
-func setDeadlineImpl(fd *netFD, t time.Time, mode int) error {
-	d := runtimeNano() + int64(t.Sub(time.Now()))
-	if t.IsZero() {
-		d = 0
-	}
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	runtime_pollSetDeadline(fd.pd.runtimeCtx, d, mode)
-	fd.decref()
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/fd_posix.go b/third_party/gofrontend/libgo/go/net/fd_posix.go
deleted file mode 100644
index b4b908a..0000000
--- a/third_party/gofrontend/libgo/go/net/fd_posix.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
-
-package net
-
-import (
-	"io"
-	"syscall"
-)
-
-// eofError returns io.EOF when fd is available for reading end of
-// file.
-func (fd *netFD) eofError(n int, err error) error {
-	if n == 0 && err == nil && fd.sotype != syscall.SOCK_DGRAM && fd.sotype != syscall.SOCK_RAW {
-		return io.EOF
-	}
-	return err
-}
diff --git a/third_party/gofrontend/libgo/go/net/fd_posix_test.go b/third_party/gofrontend/libgo/go/net/fd_posix_test.go
deleted file mode 100644
index 85711ef..0000000
--- a/third_party/gofrontend/libgo/go/net/fd_posix_test.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
-
-package net
-
-import (
-	"io"
-	"syscall"
-	"testing"
-)
-
-var eofErrorTests = []struct {
-	n        int
-	err      error
-	fd       *netFD
-	expected error
-}{
-	{100, nil, &netFD{sotype: syscall.SOCK_STREAM}, nil},
-	{100, io.EOF, &netFD{sotype: syscall.SOCK_STREAM}, io.EOF},
-	{100, errClosing, &netFD{sotype: syscall.SOCK_STREAM}, errClosing},
-	{0, nil, &netFD{sotype: syscall.SOCK_STREAM}, io.EOF},
-	{0, io.EOF, &netFD{sotype: syscall.SOCK_STREAM}, io.EOF},
-	{0, errClosing, &netFD{sotype: syscall.SOCK_STREAM}, errClosing},
-
-	{100, nil, &netFD{sotype: syscall.SOCK_DGRAM}, nil},
-	{100, io.EOF, &netFD{sotype: syscall.SOCK_DGRAM}, io.EOF},
-	{100, errClosing, &netFD{sotype: syscall.SOCK_DGRAM}, errClosing},
-	{0, nil, &netFD{sotype: syscall.SOCK_DGRAM}, nil},
-	{0, io.EOF, &netFD{sotype: syscall.SOCK_DGRAM}, io.EOF},
-	{0, errClosing, &netFD{sotype: syscall.SOCK_DGRAM}, errClosing},
-
-	{100, nil, &netFD{sotype: syscall.SOCK_SEQPACKET}, nil},
-	{100, io.EOF, &netFD{sotype: syscall.SOCK_SEQPACKET}, io.EOF},
-	{100, errClosing, &netFD{sotype: syscall.SOCK_SEQPACKET}, errClosing},
-	{0, nil, &netFD{sotype: syscall.SOCK_SEQPACKET}, io.EOF},
-	{0, io.EOF, &netFD{sotype: syscall.SOCK_SEQPACKET}, io.EOF},
-	{0, errClosing, &netFD{sotype: syscall.SOCK_SEQPACKET}, errClosing},
-
-	{100, nil, &netFD{sotype: syscall.SOCK_RAW}, nil},
-	{100, io.EOF, &netFD{sotype: syscall.SOCK_RAW}, io.EOF},
-	{100, errClosing, &netFD{sotype: syscall.SOCK_RAW}, errClosing},
-	{0, nil, &netFD{sotype: syscall.SOCK_RAW}, nil},
-	{0, io.EOF, &netFD{sotype: syscall.SOCK_RAW}, io.EOF},
-	{0, errClosing, &netFD{sotype: syscall.SOCK_RAW}, errClosing},
-}
-
-func TestEOFError(t *testing.T) {
-	for _, tt := range eofErrorTests {
-		actual := tt.fd.eofError(tt.n, tt.err)
-		if actual != tt.expected {
-			t.Errorf("eofError(%v, %v, %v): expected %v, actual %v", tt.n, tt.err, tt.fd.sotype, tt.expected, actual)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/fd_select.go b/third_party/gofrontend/libgo/go/net/fd_select.go
deleted file mode 100644
index 4103c57..0000000
--- a/third_party/gofrontend/libgo/go/net/fd_select.go
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Waiting for FDs via select(2).
-
-package net
-
-import (
-	"errors"
-	"os"
-	"syscall"
-)
-
-type pollster struct {
-	readFds, writeFds, repeatFds *syscall.FdSet
-	maxFd                        int
-	readyReadFds, readyWriteFds  *syscall.FdSet
-	nReady                       int
-	lastFd                       int
-	closed                       bool
-}
-
-func newpollster() (p *pollster, err error) {
-	p = new(pollster)
-	p.readFds = new(syscall.FdSet)
-	p.writeFds = new(syscall.FdSet)
-	p.repeatFds = new(syscall.FdSet)
-	p.readyReadFds = new(syscall.FdSet)
-	p.readyWriteFds = new(syscall.FdSet)
-	p.maxFd = -1
-	p.nReady = 0
-	p.lastFd = 0
-	return p, nil
-}
-
-func (p *pollster) AddFD(fd int, mode int, repeat bool) (bool, error) {
-	// pollServer is locked.
-
-	if p.closed {
-		return false, errors.New("pollster closed")
-	}
-
-	if mode == 'r' {
-		syscall.FDSet(fd, p.readFds)
-	} else {
-		syscall.FDSet(fd, p.writeFds)
-	}
-
-	if repeat {
-		syscall.FDSet(fd, p.repeatFds)
-	}
-
-	if fd > p.maxFd {
-		p.maxFd = fd
-	}
-
-	return true, nil
-}
-
-func (p *pollster) DelFD(fd int, mode int) bool {
-	// pollServer is locked.
-
-	if p.closed {
-		return false
-	}
-
-	if mode == 'r' {
-		if !syscall.FDIsSet(fd, p.readFds) {
-			print("Select unexpected fd=", fd, " for read\n")
-			return false
-		}
-		syscall.FDClr(fd, p.readFds)
-	} else {
-		if !syscall.FDIsSet(fd, p.writeFds) {
-			print("Select unexpected fd=", fd, " for write\n")
-			return false
-		}
-		syscall.FDClr(fd, p.writeFds)
-	}
-
-	// Doesn't matter if not already present.
-	syscall.FDClr(fd, p.repeatFds)
-
-	// We don't worry about maxFd here.
-
-	return true
-}
-
-func (p *pollster) WaitFD(s *pollServer, nsec int64) (fd int, mode int, err error) {
-	if p.nReady == 0 {
-		var timeout *syscall.Timeval
-		var tv syscall.Timeval
-		timeout = nil
-		if nsec > 0 {
-			tv = syscall.NsecToTimeval(nsec)
-			timeout = &tv
-		}
-
-		var n int
-		var e error
-		var tmpReadFds, tmpWriteFds syscall.FdSet
-		for {
-			if p.closed {
-				return -1, 0, errors.New("pollster closed")
-			}
-
-			// Temporary syscall.FdSet's into which the values are copied
-			// because select mutates the values.
-			tmpReadFds = *p.readFds
-			tmpWriteFds = *p.writeFds
-
-			s.Unlock()
-			n, e = syscall.Select(p.maxFd+1, &tmpReadFds, &tmpWriteFds, nil, timeout)
-			s.Lock()
-
-			if e != syscall.EINTR {
-				break
-			}
-		}
-		if e == syscall.EBADF {
-			// Some file descriptor has been closed.
-			tmpReadFds = syscall.FdSet{}
-			tmpWriteFds = syscall.FdSet{}
-			n = 0
-			for i := 0; i < p.maxFd+1; i++ {
-				if syscall.FDIsSet(i, p.readFds) {
-					var s syscall.Stat_t
-					if syscall.Fstat(i, &s) == syscall.EBADF {
-						syscall.FDSet(i, &tmpReadFds)
-						n++
-					}
-				} else if syscall.FDIsSet(i, p.writeFds) {
-					var s syscall.Stat_t
-					if syscall.Fstat(i, &s) == syscall.EBADF {
-						syscall.FDSet(i, &tmpWriteFds)
-						n++
-					}
-				}
-			}
-		} else if e != nil {
-			return -1, 0, os.NewSyscallError("select", e)
-		}
-		if n == 0 {
-			return -1, 0, nil
-		}
-
-		p.nReady = n
-		*p.readyReadFds = tmpReadFds
-		*p.readyWriteFds = tmpWriteFds
-		p.lastFd = 0
-	}
-
-	flag := false
-	for i := p.lastFd; i < p.maxFd+1; i++ {
-		if syscall.FDIsSet(i, p.readyReadFds) {
-			flag = true
-			mode = 'r'
-			syscall.FDClr(i, p.readyReadFds)
-		} else if syscall.FDIsSet(i, p.readyWriteFds) {
-			flag = true
-			mode = 'w'
-			syscall.FDClr(i, p.readyWriteFds)
-		}
-		if flag {
-			if !syscall.FDIsSet(i, p.repeatFds) {
-				p.DelFD(i, mode)
-			}
-			p.nReady--
-			p.lastFd = i
-			return i, mode, nil
-		}
-	}
-
-	// Will not reach here.  Just to shut up the compiler.
-	return -1, 0, nil
-}
-
-func (p *pollster) Close() error {
-	p.closed = true
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/fd_unix.go b/third_party/gofrontend/libgo/go/net/fd_unix.go
deleted file mode 100644
index 465023f..0000000
--- a/third_party/gofrontend/libgo/go/net/fd_unix.go
+++ /dev/null
@@ -1,506 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package net
-
-import (
-	"io"
-	"os"
-	"runtime"
-	"sync/atomic"
-	"syscall"
-	"time"
-)
-
-// Network file descriptor.
-type netFD struct {
-	// locking/lifetime of sysfd + serialize access to Read and Write methods
-	fdmu fdMutex
-
-	// immutable until Close
-	sysfd       int
-	family      int
-	sotype      int
-	isConnected bool
-	net         string
-	laddr       Addr
-	raddr       Addr
-
-	// wait server
-	pd pollDesc
-}
-
-func sysInit() {
-}
-
-func dial(network string, ra Addr, dialer func(time.Time) (Conn, error), deadline time.Time) (Conn, error) {
-	return dialer(deadline)
-}
-
-func newFD(sysfd, family, sotype int, net string) (*netFD, error) {
-	return &netFD{sysfd: sysfd, family: family, sotype: sotype, net: net}, nil
-}
-
-func (fd *netFD) init() error {
-	if err := fd.pd.Init(fd); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (fd *netFD) setAddr(laddr, raddr Addr) {
-	fd.laddr = laddr
-	fd.raddr = raddr
-	runtime.SetFinalizer(fd, (*netFD).Close)
-}
-
-func (fd *netFD) name() string {
-	var ls, rs string
-	if fd.laddr != nil {
-		ls = fd.laddr.String()
-	}
-	if fd.raddr != nil {
-		rs = fd.raddr.String()
-	}
-	return fd.net + ":" + ls + "->" + rs
-}
-
-func (fd *netFD) connect(la, ra syscall.Sockaddr, deadline time.Time) error {
-	// Do not need to call fd.writeLock here,
-	// because fd is not yet accessible to user,
-	// so no concurrent operations are possible.
-	switch err := connectFunc(fd.sysfd, ra); err {
-	case syscall.EINPROGRESS, syscall.EALREADY, syscall.EINTR:
-	case nil, syscall.EISCONN:
-		if !deadline.IsZero() && deadline.Before(time.Now()) {
-			return errTimeout
-		}
-		if err := fd.init(); err != nil {
-			return err
-		}
-		return nil
-	case syscall.EINVAL:
-		// On Solaris we can see EINVAL if the socket has
-		// already been accepted and closed by the server.
-		// Treat this as a successful connection--writes to
-		// the socket will see EOF.  For details and a test
-		// case in C see https://golang.org/issue/6828.
-		if runtime.GOOS == "solaris" {
-			return nil
-		}
-		fallthrough
-	default:
-		return os.NewSyscallError("connect", err)
-	}
-	if err := fd.init(); err != nil {
-		return err
-	}
-	if !deadline.IsZero() {
-		fd.setWriteDeadline(deadline)
-		defer fd.setWriteDeadline(noDeadline)
-	}
-	for {
-		// Performing multiple connect system calls on a
-		// non-blocking socket under Unix variants does not
-		// necessarily result in earlier errors being
-		// returned. Instead, once runtime-integrated network
-		// poller tells us that the socket is ready, get the
-		// SO_ERROR socket option to see if the connection
-		// succeeded or failed. See issue 7474 for further
-		// details.
-		if err := fd.pd.WaitWrite(); err != nil {
-			return err
-		}
-		nerr, err := getsockoptIntFunc(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_ERROR)
-		if err != nil {
-			return os.NewSyscallError("getsockopt", err)
-		}
-		switch err := syscall.Errno(nerr); err {
-		case syscall.EINPROGRESS, syscall.EALREADY, syscall.EINTR:
-		case syscall.Errno(0), syscall.EISCONN:
-			return nil
-		default:
-			return os.NewSyscallError("getsockopt", err)
-		}
-	}
-}
-
-func (fd *netFD) destroy() {
-	// Poller may want to unregister fd in readiness notification mechanism,
-	// so this must be executed before closeFunc.
-	fd.pd.Close()
-	closeFunc(fd.sysfd)
-	fd.sysfd = -1
-	runtime.SetFinalizer(fd, nil)
-}
-
-// Add a reference to this fd.
-// Returns an error if the fd cannot be used.
-func (fd *netFD) incref() error {
-	if !fd.fdmu.Incref() {
-		return errClosing
-	}
-	return nil
-}
-
-// Remove a reference to this FD and close if we've been asked to do so
-// (and there are no references left).
-func (fd *netFD) decref() {
-	if fd.fdmu.Decref() {
-		fd.destroy()
-	}
-}
-
-// Add a reference to this fd and lock for reading.
-// Returns an error if the fd cannot be used.
-func (fd *netFD) readLock() error {
-	if !fd.fdmu.RWLock(true) {
-		return errClosing
-	}
-	return nil
-}
-
-// Unlock for reading and remove a reference to this FD.
-func (fd *netFD) readUnlock() {
-	if fd.fdmu.RWUnlock(true) {
-		fd.destroy()
-	}
-}
-
-// Add a reference to this fd and lock for writing.
-// Returns an error if the fd cannot be used.
-func (fd *netFD) writeLock() error {
-	if !fd.fdmu.RWLock(false) {
-		return errClosing
-	}
-	return nil
-}
-
-// Unlock for writing and remove a reference to this FD.
-func (fd *netFD) writeUnlock() {
-	if fd.fdmu.RWUnlock(false) {
-		fd.destroy()
-	}
-}
-
-func (fd *netFD) Close() error {
-	if !fd.fdmu.IncrefAndClose() {
-		return errClosing
-	}
-	// Unblock any I/O.  Once it all unblocks and returns,
-	// so that it cannot be referring to fd.sysfd anymore,
-	// the final decref will close fd.sysfd.  This should happen
-	// fairly quickly, since all the I/O is non-blocking, and any
-	// attempts to block in the pollDesc will return errClosing.
-	fd.pd.Evict()
-	fd.decref()
-	return nil
-}
-
-func (fd *netFD) shutdown(how int) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("shutdown", syscall.Shutdown(fd.sysfd, how))
-}
-
-func (fd *netFD) closeRead() error {
-	return fd.shutdown(syscall.SHUT_RD)
-}
-
-func (fd *netFD) closeWrite() error {
-	return fd.shutdown(syscall.SHUT_WR)
-}
-
-func (fd *netFD) Read(p []byte) (n int, err error) {
-	if err := fd.readLock(); err != nil {
-		return 0, err
-	}
-	defer fd.readUnlock()
-	if err := fd.pd.PrepareRead(); err != nil {
-		return 0, err
-	}
-	for {
-		n, err = syscall.Read(fd.sysfd, p)
-		if err != nil {
-			n = 0
-			if err == syscall.EAGAIN {
-				if err = fd.pd.WaitRead(); err == nil {
-					continue
-				}
-			}
-		}
-		err = fd.eofError(n, err)
-		break
-	}
-	if _, ok := err.(syscall.Errno); ok {
-		err = os.NewSyscallError("read", err)
-	}
-	return
-}
-
-func (fd *netFD) readFrom(p []byte) (n int, sa syscall.Sockaddr, err error) {
-	if err := fd.readLock(); err != nil {
-		return 0, nil, err
-	}
-	defer fd.readUnlock()
-	if err := fd.pd.PrepareRead(); err != nil {
-		return 0, nil, err
-	}
-	for {
-		n, sa, err = syscall.Recvfrom(fd.sysfd, p, 0)
-		if err != nil {
-			n = 0
-			if err == syscall.EAGAIN {
-				if err = fd.pd.WaitRead(); err == nil {
-					continue
-				}
-			}
-		}
-		err = fd.eofError(n, err)
-		break
-	}
-	if _, ok := err.(syscall.Errno); ok {
-		err = os.NewSyscallError("recvfrom", err)
-	}
-	return
-}
-
-func (fd *netFD) readMsg(p []byte, oob []byte) (n, oobn, flags int, sa syscall.Sockaddr, err error) {
-	if err := fd.readLock(); err != nil {
-		return 0, 0, 0, nil, err
-	}
-	defer fd.readUnlock()
-	if err := fd.pd.PrepareRead(); err != nil {
-		return 0, 0, 0, nil, err
-	}
-	for {
-		n, oobn, flags, sa, err = syscall.Recvmsg(fd.sysfd, p, oob, 0)
-		if err != nil {
-			// TODO(dfc) should n and oobn be set to 0
-			if err == syscall.EAGAIN {
-				if err = fd.pd.WaitRead(); err == nil {
-					continue
-				}
-			}
-		}
-		err = fd.eofError(n, err)
-		break
-	}
-	if _, ok := err.(syscall.Errno); ok {
-		err = os.NewSyscallError("recvmsg", err)
-	}
-	return
-}
-
-func (fd *netFD) Write(p []byte) (nn int, err error) {
-	if err := fd.writeLock(); err != nil {
-		return 0, err
-	}
-	defer fd.writeUnlock()
-	if err := fd.pd.PrepareWrite(); err != nil {
-		return 0, err
-	}
-	for {
-		var n int
-		n, err = syscall.Write(fd.sysfd, p[nn:])
-		if n > 0 {
-			nn += n
-		}
-		if nn == len(p) {
-			break
-		}
-		if err == syscall.EAGAIN {
-			if err = fd.pd.WaitWrite(); err == nil {
-				continue
-			}
-		}
-		if err != nil {
-			break
-		}
-		if n == 0 {
-			err = io.ErrUnexpectedEOF
-			break
-		}
-	}
-	if _, ok := err.(syscall.Errno); ok {
-		err = os.NewSyscallError("write", err)
-	}
-	return nn, err
-}
-
-func (fd *netFD) writeTo(p []byte, sa syscall.Sockaddr) (n int, err error) {
-	if err := fd.writeLock(); err != nil {
-		return 0, err
-	}
-	defer fd.writeUnlock()
-	if err := fd.pd.PrepareWrite(); err != nil {
-		return 0, err
-	}
-	for {
-		err = syscall.Sendto(fd.sysfd, p, 0, sa)
-		if err == syscall.EAGAIN {
-			if err = fd.pd.WaitWrite(); err == nil {
-				continue
-			}
-		}
-		break
-	}
-	if err == nil {
-		n = len(p)
-	}
-	if _, ok := err.(syscall.Errno); ok {
-		err = os.NewSyscallError("sendto", err)
-	}
-	return
-}
-
-func (fd *netFD) writeMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int, oobn int, err error) {
-	if err := fd.writeLock(); err != nil {
-		return 0, 0, err
-	}
-	defer fd.writeUnlock()
-	if err := fd.pd.PrepareWrite(); err != nil {
-		return 0, 0, err
-	}
-	for {
-		n, err = syscall.SendmsgN(fd.sysfd, p, oob, sa, 0)
-		if err == syscall.EAGAIN {
-			if err = fd.pd.WaitWrite(); err == nil {
-				continue
-			}
-		}
-		break
-	}
-	if err == nil {
-		oobn = len(oob)
-	}
-	if _, ok := err.(syscall.Errno); ok {
-		err = os.NewSyscallError("sendmsg", err)
-	}
-	return
-}
-
-func (fd *netFD) accept() (netfd *netFD, err error) {
-	if err := fd.readLock(); err != nil {
-		return nil, err
-	}
-	defer fd.readUnlock()
-
-	var s int
-	var rsa syscall.Sockaddr
-	if err = fd.pd.PrepareRead(); err != nil {
-		return nil, err
-	}
-	for {
-		s, rsa, err = accept(fd.sysfd)
-		if err != nil {
-			nerr, ok := err.(*os.SyscallError)
-			if !ok {
-				return nil, err
-			}
-			switch nerr.Err {
-			case syscall.EAGAIN:
-				if err = fd.pd.WaitRead(); err == nil {
-					continue
-				}
-			case syscall.ECONNABORTED:
-				// This means that a socket on the
-				// listen queue was closed before we
-				// Accept()ed it; it's a silly error,
-				// so try again.
-				continue
-			}
-			return nil, err
-		}
-		break
-	}
-
-	if netfd, err = newFD(s, fd.family, fd.sotype, fd.net); err != nil {
-		closeFunc(s)
-		return nil, err
-	}
-	if err = netfd.init(); err != nil {
-		fd.Close()
-		return nil, err
-	}
-	lsa, _ := syscall.Getsockname(netfd.sysfd)
-	netfd.setAddr(netfd.addrFunc()(lsa), netfd.addrFunc()(rsa))
-	return netfd, nil
-}
-
-// Use a helper function to call fcntl.  This is defined in C in
-// libgo/runtime.
-//extern __go_fcntl_uintptr
-func fcntl(uintptr, uintptr, uintptr) (uintptr, uintptr)
-
-// tryDupCloexec indicates whether F_DUPFD_CLOEXEC should be used.
-// If the kernel doesn't support it, this is set to 0.
-var tryDupCloexec = int32(1)
-
-func dupCloseOnExec(fd int) (newfd int, err error) {
-	if atomic.LoadInt32(&tryDupCloexec) == 1 && syscall.F_DUPFD_CLOEXEC != 0 {
-		syscall.Entersyscall()
-		r0, errno := fcntl(uintptr(fd), syscall.F_DUPFD_CLOEXEC, 0)
-		syscall.Exitsyscall()
-		e1 := syscall.Errno(errno)
-		if runtime.GOOS == "darwin" && e1 == syscall.EBADF {
-			// On OS X 10.6 and below (but we only support
-			// >= 10.6), F_DUPFD_CLOEXEC is unsupported
-			// and fcntl there falls back (undocumented)
-			// to doing an ioctl instead, returning EBADF
-			// in this case because fd is not of the
-			// expected device fd type.  Treat it as
-			// EINVAL instead, so we fall back to the
-			// normal dup path.
-			// TODO: only do this on 10.6 if we can detect 10.6
-			// cheaply.
-			e1 = syscall.EINVAL
-		}
-		switch e1 {
-		case 0:
-			return int(r0), nil
-		case syscall.EINVAL:
-			// Old kernel. Fall back to the portable way
-			// from now on.
-			atomic.StoreInt32(&tryDupCloexec, 0)
-		default:
-			return -1, os.NewSyscallError("fcntl", e1)
-		}
-	}
-	return dupCloseOnExecOld(fd)
-}
-
-// dupCloseOnExecUnixOld is the traditional way to dup an fd and
-// set its O_CLOEXEC bit, using two system calls.
-func dupCloseOnExecOld(fd int) (newfd int, err error) {
-	syscall.ForkLock.RLock()
-	defer syscall.ForkLock.RUnlock()
-	newfd, err = syscall.Dup(fd)
-	if err != nil {
-		return -1, os.NewSyscallError("dup", err)
-	}
-	syscall.CloseOnExec(newfd)
-	return
-}
-
-func (fd *netFD) dup() (f *os.File, err error) {
-	ns, err := dupCloseOnExec(fd.sysfd)
-	if err != nil {
-		return nil, err
-	}
-
-	// We want blocking mode for the new fd, hence the double negative.
-	// This also puts the old fd into blocking mode, meaning that
-	// I/O will block the thread instead of letting us use the epoll server.
-	// Everything will still work, just with more threads.
-	if err = syscall.SetNonblock(ns, false); err != nil {
-		return nil, os.NewSyscallError("setnonblock", err)
-	}
-
-	return os.NewFile(uintptr(ns), fd.name()), nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/fd_windows.go b/third_party/gofrontend/libgo/go/net/fd_windows.go
deleted file mode 100644
index 205daff..0000000
--- a/third_party/gofrontend/libgo/go/net/fd_windows.go
+++ /dev/null
@@ -1,644 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"runtime"
-	"sync"
-	"syscall"
-	"time"
-	"unsafe"
-)
-
-var (
-	initErr error
-	ioSync  uint64
-)
-
-// CancelIo Windows API cancels all outstanding IO for a particular
-// socket on current thread. To overcome that limitation, we run
-// special goroutine, locked to OS single thread, that both starts
-// and cancels IO. It means, there are 2 unavoidable thread switches
-// for every IO.
-// Some newer versions of Windows has new CancelIoEx API, that does
-// not have that limitation and can be used from any thread. This
-// package uses CancelIoEx API, if present, otherwise it fallback
-// to CancelIo.
-
-var (
-	canCancelIO                               bool // determines if CancelIoEx API is present
-	skipSyncNotif                             bool
-	hasLoadSetFileCompletionNotificationModes bool
-)
-
-func sysInit() {
-	var d syscall.WSAData
-	e := syscall.WSAStartup(uint32(0x202), &d)
-	if e != nil {
-		initErr = os.NewSyscallError("wsastartup", e)
-	}
-	canCancelIO = syscall.LoadCancelIoEx() == nil
-	if syscall.LoadGetAddrInfo() == nil {
-		lookupPort = newLookupPort
-		lookupIP = newLookupIP
-	}
-
-	hasLoadSetFileCompletionNotificationModes = syscall.LoadSetFileCompletionNotificationModes() == nil
-	if hasLoadSetFileCompletionNotificationModes {
-		// It's not safe to use FILE_SKIP_COMPLETION_PORT_ON_SUCCESS if non IFS providers are installed:
-		// http://support.microsoft.com/kb/2568167
-		skipSyncNotif = true
-		protos := [2]int32{syscall.IPPROTO_TCP, 0}
-		var buf [32]syscall.WSAProtocolInfo
-		len := uint32(unsafe.Sizeof(buf))
-		n, err := syscall.WSAEnumProtocols(&protos[0], &buf[0], &len)
-		if err != nil {
-			skipSyncNotif = false
-		} else {
-			for i := int32(0); i < n; i++ {
-				if buf[i].ServiceFlags1&syscall.XP1_IFS_HANDLES == 0 {
-					skipSyncNotif = false
-					break
-				}
-			}
-		}
-	}
-}
-
-func canUseConnectEx(net string) bool {
-	switch net {
-	case "udp", "udp4", "udp6", "ip", "ip4", "ip6":
-		// ConnectEx windows API does not support connectionless sockets.
-		return false
-	}
-	return syscall.LoadConnectEx() == nil
-}
-
-func dial(net string, ra Addr, dialer func(time.Time) (Conn, error), deadline time.Time) (Conn, error) {
-	if !canUseConnectEx(net) {
-		// Use the relatively inefficient goroutine-racing
-		// implementation of DialTimeout.
-		return dialChannel(net, ra, dialer, deadline)
-	}
-	return dialer(deadline)
-}
-
-// operation contains superset of data necessary to perform all async IO.
-type operation struct {
-	// Used by IOCP interface, it must be first field
-	// of the struct, as our code rely on it.
-	o syscall.Overlapped
-
-	// fields used by runtime.netpoll
-	runtimeCtx uintptr
-	mode       int32
-	errno      int32
-	qty        uint32
-
-	// fields used only by net package
-	fd     *netFD
-	errc   chan error
-	buf    syscall.WSABuf
-	sa     syscall.Sockaddr
-	rsa    *syscall.RawSockaddrAny
-	rsan   int32
-	handle syscall.Handle
-	flags  uint32
-}
-
-func (o *operation) InitBuf(buf []byte) {
-	o.buf.Len = uint32(len(buf))
-	o.buf.Buf = nil
-	if len(buf) != 0 {
-		o.buf.Buf = &buf[0]
-	}
-}
-
-// ioSrv executes net IO requests.
-type ioSrv struct {
-	req chan ioSrvReq
-}
-
-type ioSrvReq struct {
-	o      *operation
-	submit func(o *operation) error // if nil, cancel the operation
-}
-
-// ProcessRemoteIO will execute submit IO requests on behalf
-// of other goroutines, all on a single os thread, so it can
-// cancel them later. Results of all operations will be sent
-// back to their requesters via channel supplied in request.
-// It is used only when the CancelIoEx API is unavailable.
-func (s *ioSrv) ProcessRemoteIO() {
-	runtime.LockOSThread()
-	defer runtime.UnlockOSThread()
-	for r := range s.req {
-		if r.submit != nil {
-			r.o.errc <- r.submit(r.o)
-		} else {
-			r.o.errc <- syscall.CancelIo(r.o.fd.sysfd)
-		}
-	}
-}
-
-// ExecIO executes a single IO operation o. It submits and cancels
-// IO in the current thread for systems where Windows CancelIoEx API
-// is available. Alternatively, it passes the request onto
-// runtime netpoll and waits for completion or cancels request.
-func (s *ioSrv) ExecIO(o *operation, name string, submit func(o *operation) error) (int, error) {
-	fd := o.fd
-	// Notify runtime netpoll about starting IO.
-	err := fd.pd.Prepare(int(o.mode))
-	if err != nil {
-		return 0, err
-	}
-	// Start IO.
-	if canCancelIO {
-		err = submit(o)
-	} else {
-		// Send request to a special dedicated thread,
-		// so it can stop the IO with CancelIO later.
-		s.req <- ioSrvReq{o, submit}
-		err = <-o.errc
-	}
-	switch err {
-	case nil:
-		// IO completed immediately
-		if o.fd.skipSyncNotif {
-			// No completion message will follow, so return immediately.
-			return int(o.qty), nil
-		}
-		// Need to get our completion message anyway.
-	case syscall.ERROR_IO_PENDING:
-		// IO started, and we have to wait for its completion.
-		err = nil
-	default:
-		return 0, err
-	}
-	// Wait for our request to complete.
-	err = fd.pd.Wait(int(o.mode))
-	if err == nil {
-		// All is good. Extract our IO results and return.
-		if o.errno != 0 {
-			err = syscall.Errno(o.errno)
-			return 0, err
-		}
-		return int(o.qty), nil
-	}
-	// IO is interrupted by "close" or "timeout"
-	netpollErr := err
-	switch netpollErr {
-	case errClosing, errTimeout:
-		// will deal with those.
-	default:
-		panic("net: unexpected runtime.netpoll error: " + netpollErr.Error())
-	}
-	// Cancel our request.
-	if canCancelIO {
-		err := syscall.CancelIoEx(fd.sysfd, &o.o)
-		// Assuming ERROR_NOT_FOUND is returned, if IO is completed.
-		if err != nil && err != syscall.ERROR_NOT_FOUND {
-			// TODO(brainman): maybe do something else, but panic.
-			panic(err)
-		}
-	} else {
-		s.req <- ioSrvReq{o, nil}
-		<-o.errc
-	}
-	// Wait for cancellation to complete.
-	fd.pd.WaitCanceled(int(o.mode))
-	if o.errno != 0 {
-		err = syscall.Errno(o.errno)
-		if err == syscall.ERROR_OPERATION_ABORTED { // IO Canceled
-			err = netpollErr
-		}
-		return 0, err
-	}
-	// We issued cancellation request. But, it seems, IO operation succeeded
-	// before cancellation request run. We need to treat IO operation as
-	// succeeded (the bytes are actually sent/recv from network).
-	return int(o.qty), nil
-}
-
-// Start helper goroutines.
-var rsrv, wsrv *ioSrv
-var onceStartServer sync.Once
-
-func startServer() {
-	rsrv = new(ioSrv)
-	wsrv = new(ioSrv)
-	if !canCancelIO {
-		// Only CancelIo API is available. Lets start two special goroutines
-		// locked to an OS thread, that both starts and cancels IO. One will
-		// process read requests, while other will do writes.
-		rsrv.req = make(chan ioSrvReq)
-		go rsrv.ProcessRemoteIO()
-		wsrv.req = make(chan ioSrvReq)
-		go wsrv.ProcessRemoteIO()
-	}
-}
-
-// Network file descriptor.
-type netFD struct {
-	// locking/lifetime of sysfd + serialize access to Read and Write methods
-	fdmu fdMutex
-
-	// immutable until Close
-	sysfd         syscall.Handle
-	family        int
-	sotype        int
-	isConnected   bool
-	skipSyncNotif bool
-	net           string
-	laddr         Addr
-	raddr         Addr
-
-	rop operation // read operation
-	wop operation // write operation
-
-	// wait server
-	pd pollDesc
-}
-
-func newFD(sysfd syscall.Handle, family, sotype int, net string) (*netFD, error) {
-	if initErr != nil {
-		return nil, initErr
-	}
-	onceStartServer.Do(startServer)
-	return &netFD{sysfd: sysfd, family: family, sotype: sotype, net: net}, nil
-}
-
-func (fd *netFD) init() error {
-	if err := fd.pd.Init(fd); err != nil {
-		return err
-	}
-	if hasLoadSetFileCompletionNotificationModes {
-		// We do not use events, so we can skip them always.
-		flags := uint8(syscall.FILE_SKIP_SET_EVENT_ON_HANDLE)
-		// It's not safe to skip completion notifications for UDP:
-		// http://blogs.technet.com/b/winserverperformance/archive/2008/06/26/designing-applications-for-high-performance-part-iii.aspx
-		if skipSyncNotif && fd.net == "tcp" {
-			flags |= syscall.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
-		}
-		err := syscall.SetFileCompletionNotificationModes(fd.sysfd, flags)
-		if err == nil && flags&syscall.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS != 0 {
-			fd.skipSyncNotif = true
-		}
-	}
-	// Disable SIO_UDP_CONNRESET behavior.
-	// http://support.microsoft.com/kb/263823
-	switch fd.net {
-	case "udp", "udp4", "udp6":
-		ret := uint32(0)
-		flag := uint32(0)
-		size := uint32(unsafe.Sizeof(flag))
-		err := syscall.WSAIoctl(fd.sysfd, syscall.SIO_UDP_CONNRESET, (*byte)(unsafe.Pointer(&flag)), size, nil, 0, &ret, nil, 0)
-		if err != nil {
-			return os.NewSyscallError("wsaioctl", err)
-		}
-	}
-	fd.rop.mode = 'r'
-	fd.wop.mode = 'w'
-	fd.rop.fd = fd
-	fd.wop.fd = fd
-	fd.rop.runtimeCtx = fd.pd.runtimeCtx
-	fd.wop.runtimeCtx = fd.pd.runtimeCtx
-	if !canCancelIO {
-		fd.rop.errc = make(chan error)
-		fd.wop.errc = make(chan error)
-	}
-	return nil
-}
-
-func (fd *netFD) setAddr(laddr, raddr Addr) {
-	fd.laddr = laddr
-	fd.raddr = raddr
-	runtime.SetFinalizer(fd, (*netFD).Close)
-}
-
-func (fd *netFD) connect(la, ra syscall.Sockaddr, deadline time.Time) error {
-	// Do not need to call fd.writeLock here,
-	// because fd is not yet accessible to user,
-	// so no concurrent operations are possible.
-	if err := fd.init(); err != nil {
-		return err
-	}
-	if !deadline.IsZero() {
-		fd.setWriteDeadline(deadline)
-		defer fd.setWriteDeadline(noDeadline)
-	}
-	if !canUseConnectEx(fd.net) {
-		return os.NewSyscallError("connect", connectFunc(fd.sysfd, ra))
-	}
-	// ConnectEx windows API requires an unconnected, previously bound socket.
-	if la == nil {
-		switch ra.(type) {
-		case *syscall.SockaddrInet4:
-			la = &syscall.SockaddrInet4{}
-		case *syscall.SockaddrInet6:
-			la = &syscall.SockaddrInet6{}
-		default:
-			panic("unexpected type in connect")
-		}
-		if err := syscall.Bind(fd.sysfd, la); err != nil {
-			return os.NewSyscallError("bind", err)
-		}
-	}
-	// Call ConnectEx API.
-	o := &fd.wop
-	o.sa = ra
-	_, err := wsrv.ExecIO(o, "ConnectEx", func(o *operation) error {
-		return connectExFunc(o.fd.sysfd, o.sa, nil, 0, nil, &o.o)
-	})
-	if err != nil {
-		if _, ok := err.(syscall.Errno); ok {
-			err = os.NewSyscallError("connectex", err)
-		}
-		return err
-	}
-	// Refresh socket properties.
-	return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_UPDATE_CONNECT_CONTEXT, (*byte)(unsafe.Pointer(&fd.sysfd)), int32(unsafe.Sizeof(fd.sysfd))))
-}
-
-func (fd *netFD) destroy() {
-	if fd.sysfd == syscall.InvalidHandle {
-		return
-	}
-	// Poller may want to unregister fd in readiness notification mechanism,
-	// so this must be executed before closeFunc.
-	fd.pd.Close()
-	closeFunc(fd.sysfd)
-	fd.sysfd = syscall.InvalidHandle
-	// no need for a finalizer anymore
-	runtime.SetFinalizer(fd, nil)
-}
-
-// Add a reference to this fd.
-// Returns an error if the fd cannot be used.
-func (fd *netFD) incref() error {
-	if !fd.fdmu.Incref() {
-		return errClosing
-	}
-	return nil
-}
-
-// Remove a reference to this FD and close if we've been asked to do so
-// (and there are no references left).
-func (fd *netFD) decref() {
-	if fd.fdmu.Decref() {
-		fd.destroy()
-	}
-}
-
-// Add a reference to this fd and lock for reading.
-// Returns an error if the fd cannot be used.
-func (fd *netFD) readLock() error {
-	if !fd.fdmu.RWLock(true) {
-		return errClosing
-	}
-	return nil
-}
-
-// Unlock for reading and remove a reference to this FD.
-func (fd *netFD) readUnlock() {
-	if fd.fdmu.RWUnlock(true) {
-		fd.destroy()
-	}
-}
-
-// Add a reference to this fd and lock for writing.
-// Returns an error if the fd cannot be used.
-func (fd *netFD) writeLock() error {
-	if !fd.fdmu.RWLock(false) {
-		return errClosing
-	}
-	return nil
-}
-
-// Unlock for writing and remove a reference to this FD.
-func (fd *netFD) writeUnlock() {
-	if fd.fdmu.RWUnlock(false) {
-		fd.destroy()
-	}
-}
-
-func (fd *netFD) Close() error {
-	if !fd.fdmu.IncrefAndClose() {
-		return errClosing
-	}
-	// unblock pending reader and writer
-	fd.pd.Evict()
-	fd.decref()
-	return nil
-}
-
-func (fd *netFD) shutdown(how int) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return syscall.Shutdown(fd.sysfd, how)
-}
-
-func (fd *netFD) closeRead() error {
-	return fd.shutdown(syscall.SHUT_RD)
-}
-
-func (fd *netFD) closeWrite() error {
-	return fd.shutdown(syscall.SHUT_WR)
-}
-
-func (fd *netFD) Read(buf []byte) (int, error) {
-	if err := fd.readLock(); err != nil {
-		return 0, err
-	}
-	defer fd.readUnlock()
-	o := &fd.rop
-	o.InitBuf(buf)
-	n, err := rsrv.ExecIO(o, "WSARecv", func(o *operation) error {
-		return syscall.WSARecv(o.fd.sysfd, &o.buf, 1, &o.qty, &o.flags, &o.o, nil)
-	})
-	if raceenabled {
-		raceAcquire(unsafe.Pointer(&ioSync))
-	}
-	err = fd.eofError(n, err)
-	if _, ok := err.(syscall.Errno); ok {
-		err = os.NewSyscallError("wsarecv", err)
-	}
-	return n, err
-}
-
-func (fd *netFD) readFrom(buf []byte) (int, syscall.Sockaddr, error) {
-	if len(buf) == 0 {
-		return 0, nil, nil
-	}
-	if err := fd.readLock(); err != nil {
-		return 0, nil, err
-	}
-	defer fd.readUnlock()
-	o := &fd.rop
-	o.InitBuf(buf)
-	n, err := rsrv.ExecIO(o, "WSARecvFrom", func(o *operation) error {
-		if o.rsa == nil {
-			o.rsa = new(syscall.RawSockaddrAny)
-		}
-		o.rsan = int32(unsafe.Sizeof(*o.rsa))
-		return syscall.WSARecvFrom(o.fd.sysfd, &o.buf, 1, &o.qty, &o.flags, o.rsa, &o.rsan, &o.o, nil)
-	})
-	err = fd.eofError(n, err)
-	if _, ok := err.(syscall.Errno); ok {
-		err = os.NewSyscallError("wsarecvfrom", err)
-	}
-	if err != nil {
-		return n, nil, err
-	}
-	sa, _ := o.rsa.Sockaddr()
-	return n, sa, nil
-}
-
-func (fd *netFD) Write(buf []byte) (int, error) {
-	if err := fd.writeLock(); err != nil {
-		return 0, err
-	}
-	defer fd.writeUnlock()
-	if raceenabled {
-		raceReleaseMerge(unsafe.Pointer(&ioSync))
-	}
-	o := &fd.wop
-	o.InitBuf(buf)
-	n, err := wsrv.ExecIO(o, "WSASend", func(o *operation) error {
-		return syscall.WSASend(o.fd.sysfd, &o.buf, 1, &o.qty, 0, &o.o, nil)
-	})
-	if _, ok := err.(syscall.Errno); ok {
-		err = os.NewSyscallError("wsasend", err)
-	}
-	return n, err
-}
-
-func (fd *netFD) writeTo(buf []byte, sa syscall.Sockaddr) (int, error) {
-	if len(buf) == 0 {
-		return 0, nil
-	}
-	if err := fd.writeLock(); err != nil {
-		return 0, err
-	}
-	defer fd.writeUnlock()
-	o := &fd.wop
-	o.InitBuf(buf)
-	o.sa = sa
-	n, err := wsrv.ExecIO(o, "WSASendto", func(o *operation) error {
-		return syscall.WSASendto(o.fd.sysfd, &o.buf, 1, &o.qty, 0, o.sa, &o.o, nil)
-	})
-	if _, ok := err.(syscall.Errno); ok {
-		err = os.NewSyscallError("wsasendto", err)
-	}
-	return n, err
-}
-
-func (fd *netFD) acceptOne(rawsa []syscall.RawSockaddrAny, o *operation) (*netFD, error) {
-	// Get new socket.
-	s, err := sysSocket(fd.family, fd.sotype, 0)
-	if err != nil {
-		return nil, err
-	}
-
-	// Associate our new socket with IOCP.
-	netfd, err := newFD(s, fd.family, fd.sotype, fd.net)
-	if err != nil {
-		closeFunc(s)
-		return nil, err
-	}
-	if err := netfd.init(); err != nil {
-		fd.Close()
-		return nil, err
-	}
-
-	// Submit accept request.
-	o.handle = s
-	o.rsan = int32(unsafe.Sizeof(rawsa[0]))
-	_, err = rsrv.ExecIO(o, "AcceptEx", func(o *operation) error {
-		return syscall.AcceptEx(o.fd.sysfd, o.handle, (*byte)(unsafe.Pointer(&rawsa[0])), 0, uint32(o.rsan), uint32(o.rsan), &o.qty, &o.o)
-	})
-	if err != nil {
-		netfd.Close()
-		if _, ok := err.(syscall.Errno); ok {
-			err = os.NewSyscallError("acceptex", err)
-		}
-		return nil, err
-	}
-
-	// Inherit properties of the listening socket.
-	err = syscall.Setsockopt(s, syscall.SOL_SOCKET, syscall.SO_UPDATE_ACCEPT_CONTEXT, (*byte)(unsafe.Pointer(&fd.sysfd)), int32(unsafe.Sizeof(fd.sysfd)))
-	if err != nil {
-		netfd.Close()
-		return nil, os.NewSyscallError("setsockopt", err)
-	}
-
-	return netfd, nil
-}
-
-func (fd *netFD) accept() (*netFD, error) {
-	if err := fd.readLock(); err != nil {
-		return nil, err
-	}
-	defer fd.readUnlock()
-
-	o := &fd.rop
-	var netfd *netFD
-	var err error
-	var rawsa [2]syscall.RawSockaddrAny
-	for {
-		netfd, err = fd.acceptOne(rawsa[:], o)
-		if err == nil {
-			break
-		}
-		// Sometimes we see WSAECONNRESET and ERROR_NETNAME_DELETED is
-		// returned here. These happen if connection reset is received
-		// before AcceptEx could complete. These errors relate to new
-		// connection, not to AcceptEx, so ignore broken connection and
-		// try AcceptEx again for more connections.
-		nerr, ok := err.(*os.SyscallError)
-		if !ok {
-			return nil, err
-		}
-		errno, ok := nerr.Err.(syscall.Errno)
-		if !ok {
-			return nil, err
-		}
-		switch errno {
-		case syscall.ERROR_NETNAME_DELETED, syscall.WSAECONNRESET:
-			// ignore these and try again
-		default:
-			return nil, err
-		}
-	}
-
-	// Get local and peer addr out of AcceptEx buffer.
-	var lrsa, rrsa *syscall.RawSockaddrAny
-	var llen, rlen int32
-	syscall.GetAcceptExSockaddrs((*byte)(unsafe.Pointer(&rawsa[0])),
-		0, uint32(o.rsan), uint32(o.rsan), &lrsa, &llen, &rrsa, &rlen)
-	lsa, _ := lrsa.Sockaddr()
-	rsa, _ := rrsa.Sockaddr()
-
-	netfd.setAddr(netfd.addrFunc()(lsa), netfd.addrFunc()(rsa))
-	return netfd, nil
-}
-
-// Unimplemented functions.
-
-func (fd *netFD) dup() (*os.File, error) {
-	// TODO: Implement this
-	return nil, syscall.EWINDOWS
-}
-
-func (fd *netFD) readMsg(p []byte, oob []byte) (n, oobn, flags int, sa syscall.Sockaddr, err error) {
-	return 0, 0, 0, nil, syscall.EWINDOWS
-}
-
-func (fd *netFD) writeMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int, oobn int, err error) {
-	return 0, 0, syscall.EWINDOWS
-}
diff --git a/third_party/gofrontend/libgo/go/net/file.go b/third_party/gofrontend/libgo/go/net/file.go
deleted file mode 100644
index 1aad477..0000000
--- a/third_party/gofrontend/libgo/go/net/file.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import "os"
-
-type fileAddr string
-
-func (fileAddr) Network() string  { return "file+net" }
-func (f fileAddr) String() string { return string(f) }
-
-// FileConn returns a copy of the network connection corresponding to
-// the open file f.
-// It is the caller's responsibility to close f when finished.
-// Closing c does not affect f, and closing f does not affect c.
-func FileConn(f *os.File) (c Conn, err error) {
-	c, err = fileConn(f)
-	if err != nil {
-		err = &OpError{Op: "file", Net: "file+net", Source: nil, Addr: fileAddr(f.Name()), Err: err}
-	}
-	return
-}
-
-// FileListener returns a copy of the network listener corresponding
-// to the open file f.
-// It is the caller's responsibility to close ln when finished.
-// Closing ln does not affect f, and closing f does not affect ln.
-func FileListener(f *os.File) (ln Listener, err error) {
-	ln, err = fileListener(f)
-	if err != nil {
-		err = &OpError{Op: "file", Net: "file+net", Source: nil, Addr: fileAddr(f.Name()), Err: err}
-	}
-	return
-}
-
-// FilePacketConn returns a copy of the packet network connection
-// corresponding to the open file f.
-// It is the caller's responsibility to close f when finished.
-// Closing c does not affect f, and closing f does not affect c.
-func FilePacketConn(f *os.File) (c PacketConn, err error) {
-	c, err = filePacketConn(f)
-	if err != nil {
-		err = &OpError{Op: "file", Net: "file+net", Source: nil, Addr: fileAddr(f.Name()), Err: err}
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/net/file_plan9.go b/third_party/gofrontend/libgo/go/net/file_plan9.go
deleted file mode 100644
index 892775a..0000000
--- a/third_party/gofrontend/libgo/go/net/file_plan9.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"errors"
-	"io"
-	"os"
-	"syscall"
-)
-
-func (fd *netFD) status(ln int) (string, error) {
-	if !fd.ok() {
-		return "", syscall.EINVAL
-	}
-
-	status, err := os.Open(fd.dir + "/status")
-	if err != nil {
-		return "", err
-	}
-	defer status.Close()
-	buf := make([]byte, ln)
-	n, err := io.ReadFull(status, buf[:])
-	if err != nil {
-		return "", err
-	}
-	return string(buf[:n]), nil
-}
-
-func newFileFD(f *os.File) (net *netFD, err error) {
-	var ctl *os.File
-	close := func(fd int) {
-		if err != nil {
-			syscall.Close(fd)
-		}
-	}
-
-	path, err := syscall.Fd2path(int(f.Fd()))
-	if err != nil {
-		return nil, os.NewSyscallError("fd2path", err)
-	}
-	comp := splitAtBytes(path, "/")
-	n := len(comp)
-	if n < 3 || comp[0][0:3] != "net" {
-		return nil, syscall.EPLAN9
-	}
-
-	name := comp[2]
-	switch file := comp[n-1]; file {
-	case "ctl", "clone":
-		syscall.ForkLock.RLock()
-		fd, err := syscall.Dup(int(f.Fd()), -1)
-		syscall.ForkLock.RUnlock()
-		if err != nil {
-			return nil, os.NewSyscallError("dup", err)
-		}
-		defer close(fd)
-
-		dir := netdir + "/" + comp[n-2]
-		ctl = os.NewFile(uintptr(fd), dir+"/"+file)
-		ctl.Seek(0, 0)
-		var buf [16]byte
-		n, err := ctl.Read(buf[:])
-		if err != nil {
-			return nil, err
-		}
-		name = string(buf[:n])
-	default:
-		if len(comp) < 4 {
-			return nil, errors.New("could not find control file for connection")
-		}
-		dir := netdir + "/" + comp[1] + "/" + name
-		ctl, err = os.OpenFile(dir+"/ctl", os.O_RDWR, 0)
-		if err != nil {
-			return nil, err
-		}
-		defer close(int(ctl.Fd()))
-	}
-	dir := netdir + "/" + comp[1] + "/" + name
-	laddr, err := readPlan9Addr(comp[1], dir+"/local")
-	if err != nil {
-		return nil, err
-	}
-	return newFD(comp[1], name, ctl, nil, laddr, nil)
-}
-
-func fileConn(f *os.File) (Conn, error) {
-	fd, err := newFileFD(f)
-	if err != nil {
-		return nil, err
-	}
-	if !fd.ok() {
-		return nil, syscall.EINVAL
-	}
-
-	fd.data, err = os.OpenFile(fd.dir+"/data", os.O_RDWR, 0)
-	if err != nil {
-		return nil, err
-	}
-
-	switch fd.laddr.(type) {
-	case *TCPAddr:
-		return newTCPConn(fd), nil
-	case *UDPAddr:
-		return newUDPConn(fd), nil
-	}
-	return nil, syscall.EPLAN9
-}
-
-func fileListener(f *os.File) (Listener, error) {
-	fd, err := newFileFD(f)
-	if err != nil {
-		return nil, err
-	}
-	switch fd.laddr.(type) {
-	case *TCPAddr:
-	default:
-		return nil, syscall.EPLAN9
-	}
-
-	// check that file corresponds to a listener
-	s, err := fd.status(len("Listen"))
-	if err != nil {
-		return nil, err
-	}
-	if s != "Listen" {
-		return nil, errors.New("file does not represent a listener")
-	}
-
-	return &TCPListener{fd}, nil
-}
-
-func filePacketConn(f *os.File) (PacketConn, error) {
-	return nil, syscall.EPLAN9
-}
diff --git a/third_party/gofrontend/libgo/go/net/file_stub.go b/third_party/gofrontend/libgo/go/net/file_stub.go
deleted file mode 100644
index 0f7460c..0000000
--- a/third_party/gofrontend/libgo/go/net/file_stub.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build nacl
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-func fileConn(f *os.File) (Conn, error)             { return nil, syscall.ENOPROTOOPT }
-func fileListener(f *os.File) (Listener, error)     { return nil, syscall.ENOPROTOOPT }
-func filePacketConn(f *os.File) (PacketConn, error) { return nil, syscall.ENOPROTOOPT }
diff --git a/third_party/gofrontend/libgo/go/net/file_test.go b/third_party/gofrontend/libgo/go/net/file_test.go
deleted file mode 100644
index 003dbb2..0000000
--- a/third_party/gofrontend/libgo/go/net/file_test.go
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"reflect"
-	"runtime"
-	"testing"
-)
-
-type listenerFile interface {
-	Listener
-	File() (f *os.File, err error)
-}
-
-type packetConnFile interface {
-	PacketConn
-	File() (f *os.File, err error)
-}
-
-type connFile interface {
-	Conn
-	File() (f *os.File, err error)
-}
-
-func testFileListener(t *testing.T, net, laddr string) {
-	l, err := Listen(net, laddr)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer l.Close()
-	lf := l.(listenerFile)
-	f, err := lf.File()
-	if err != nil {
-		t.Fatal(err)
-	}
-	c, err := FileListener(f)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !reflect.DeepEqual(l.Addr(), c.Addr()) {
-		t.Fatalf("got %#v; want%#v", l.Addr(), c.Addr())
-	}
-	if err := c.Close(); err != nil {
-		t.Fatal(err)
-	}
-	if err := f.Close(); err != nil {
-		t.Fatal(err)
-	}
-}
-
-var fileListenerTests = []struct {
-	net   string
-	laddr string
-}{
-	{net: "tcp", laddr: ":0"},
-	{net: "tcp", laddr: "0.0.0.0:0"},
-	{net: "tcp", laddr: "[::ffff:0.0.0.0]:0"},
-	{net: "tcp", laddr: "[::]:0"},
-
-	{net: "tcp", laddr: "127.0.0.1:0"},
-	{net: "tcp", laddr: "[::ffff:127.0.0.1]:0"},
-	{net: "tcp", laddr: "[::1]:0"},
-
-	{net: "tcp4", laddr: ":0"},
-	{net: "tcp4", laddr: "0.0.0.0:0"},
-	{net: "tcp4", laddr: "[::ffff:0.0.0.0]:0"},
-
-	{net: "tcp4", laddr: "127.0.0.1:0"},
-	{net: "tcp4", laddr: "[::ffff:127.0.0.1]:0"},
-
-	{net: "tcp6", laddr: ":0"},
-	{net: "tcp6", laddr: "[::]:0"},
-
-	{net: "tcp6", laddr: "[::1]:0"},
-
-	{net: "unix", laddr: "@gotest/net"},
-	{net: "unixpacket", laddr: "@gotest/net"},
-}
-
-func TestFileListener(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "windows":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	for _, tt := range fileListenerTests {
-		if !testableListenArgs(tt.net, tt.laddr, "") {
-			t.Logf("skipping %s test", tt.net+" "+tt.laddr)
-			continue
-		}
-		testFileListener(t, tt.net, tt.laddr)
-	}
-}
-
-func testFilePacketConn(t *testing.T, pcf packetConnFile, listen bool) {
-	f, err := pcf.File()
-	if err != nil {
-		t.Fatal(err)
-	}
-	c, err := FilePacketConn(f)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !reflect.DeepEqual(pcf.LocalAddr(), c.LocalAddr()) {
-		t.Fatalf("got %#v; want %#v", pcf.LocalAddr(), c.LocalAddr())
-	}
-	if listen {
-		if _, err := c.WriteTo([]byte{}, c.LocalAddr()); err != nil {
-			t.Fatal(err)
-		}
-	}
-	if err := c.Close(); err != nil {
-		t.Fatal(err)
-	}
-	if err := f.Close(); err != nil {
-		t.Fatal(err)
-	}
-}
-
-func testFilePacketConnListen(t *testing.T, net, laddr string) {
-	l, err := ListenPacket(net, laddr)
-	if err != nil {
-		t.Fatal(err)
-	}
-	testFilePacketConn(t, l.(packetConnFile), true)
-	if err := l.Close(); err != nil {
-		t.Fatal(err)
-	}
-}
-
-func testFilePacketConnDial(t *testing.T, net, raddr string) {
-	c, err := Dial(net, raddr)
-	if err != nil {
-		t.Fatal(err)
-	}
-	testFilePacketConn(t, c.(packetConnFile), false)
-	if err := c.Close(); err != nil {
-		t.Fatal(err)
-	}
-}
-
-var filePacketConnTests = []struct {
-	net  string
-	addr string
-}{
-	{net: "udp", addr: "127.0.0.1:0"},
-	{net: "udp", addr: "[::ffff:127.0.0.1]:0"},
-	{net: "udp", addr: "[::1]:0"},
-
-	{net: "udp4", addr: "127.0.0.1:0"},
-	{net: "udp4", addr: "[::ffff:127.0.0.1]:0"},
-
-	{net: "udp6", addr: "[::1]:0"},
-
-	// TODO(mikioh,bradfitz): reenable once 10730 is fixed
-	// {net: "ip4:icmp", addr: "127.0.0.1"},
-
-	{net: "unixgram", addr: "@gotest3/net"},
-}
-
-func TestFilePacketConn(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "plan9", "windows":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	for _, tt := range filePacketConnTests {
-		if !testableListenArgs(tt.net, tt.addr, "") {
-			t.Logf("skipping %s test", tt.net+" "+tt.addr)
-			continue
-		}
-		if os.Getuid() != 0 && tt.net == "ip4:icmp" {
-			t.Log("skipping test; must be root")
-			continue
-		}
-		testFilePacketConnListen(t, tt.net, tt.addr)
-		switch tt.net {
-		case "udp", "udp4", "udp6":
-			host, _, err := SplitHostPort(tt.addr)
-			if err != nil {
-				t.Error(err)
-				continue
-			}
-			testFilePacketConnDial(t, tt.net, JoinHostPort(host, "12345"))
-		case "ip4:icmp":
-			testFilePacketConnDial(t, tt.net, tt.addr)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/file_unix.go b/third_party/gofrontend/libgo/go/net/file_unix.go
deleted file mode 100644
index 5b24c7d..0000000
--- a/third_party/gofrontend/libgo/go/net/file_unix.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-func dupSocket(f *os.File) (int, error) {
-	s, err := dupCloseOnExec(int(f.Fd()))
-	if err != nil {
-		return -1, err
-	}
-	if err := syscall.SetNonblock(s, true); err != nil {
-		closeFunc(s)
-		return -1, os.NewSyscallError("setnonblock", err)
-	}
-	return s, nil
-}
-
-func newFileFD(f *os.File) (*netFD, error) {
-	s, err := dupSocket(f)
-	if err != nil {
-		return nil, err
-	}
-	family := syscall.AF_UNSPEC
-	sotype, err := syscall.GetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_TYPE)
-	if err != nil {
-		closeFunc(s)
-		return nil, os.NewSyscallError("getsockopt", err)
-	}
-	lsa, _ := syscall.Getsockname(s)
-	rsa, _ := syscall.Getpeername(s)
-	switch lsa.(type) {
-	case *syscall.SockaddrInet4:
-		family = syscall.AF_INET
-	case *syscall.SockaddrInet6:
-		family = syscall.AF_INET6
-	case *syscall.SockaddrUnix:
-		family = syscall.AF_UNIX
-	default:
-		closeFunc(s)
-		return nil, syscall.EPROTONOSUPPORT
-	}
-	fd, err := newFD(s, family, sotype, "")
-	if err != nil {
-		closeFunc(s)
-		return nil, err
-	}
-	laddr := fd.addrFunc()(lsa)
-	raddr := fd.addrFunc()(rsa)
-	fd.net = laddr.Network()
-	if err := fd.init(); err != nil {
-		fd.Close()
-		return nil, err
-	}
-	fd.setAddr(laddr, raddr)
-	return fd, nil
-}
-
-func fileConn(f *os.File) (Conn, error) {
-	fd, err := newFileFD(f)
-	if err != nil {
-		return nil, err
-	}
-	switch fd.laddr.(type) {
-	case *TCPAddr:
-		return newTCPConn(fd), nil
-	case *UDPAddr:
-		return newUDPConn(fd), nil
-	case *IPAddr:
-		return newIPConn(fd), nil
-	case *UnixAddr:
-		return newUnixConn(fd), nil
-	}
-	fd.Close()
-	return nil, syscall.EINVAL
-}
-
-func fileListener(f *os.File) (Listener, error) {
-	fd, err := newFileFD(f)
-	if err != nil {
-		return nil, err
-	}
-	switch laddr := fd.laddr.(type) {
-	case *TCPAddr:
-		return &TCPListener{fd}, nil
-	case *UnixAddr:
-		return &UnixListener{fd, laddr.Name}, nil
-	}
-	fd.Close()
-	return nil, syscall.EINVAL
-}
-
-func filePacketConn(f *os.File) (PacketConn, error) {
-	fd, err := newFileFD(f)
-	if err != nil {
-		return nil, err
-	}
-	switch fd.laddr.(type) {
-	case *UDPAddr:
-		return newUDPConn(fd), nil
-	case *IPAddr:
-		return newIPConn(fd), nil
-	case *UnixAddr:
-		return newUnixConn(fd), nil
-	}
-	fd.Close()
-	return nil, syscall.EINVAL
-}
diff --git a/third_party/gofrontend/libgo/go/net/file_windows.go b/third_party/gofrontend/libgo/go/net/file_windows.go
deleted file mode 100644
index 241fa17..0000000
--- a/third_party/gofrontend/libgo/go/net/file_windows.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-func fileConn(f *os.File) (Conn, error) {
-	// TODO: Implement this
-	return nil, syscall.EWINDOWS
-}
-
-func fileListener(f *os.File) (Listener, error) {
-	// TODO: Implement this
-	return nil, syscall.EWINDOWS
-}
-
-func filePacketConn(f *os.File) (PacketConn, error) {
-	// TODO: Implement this
-	return nil, syscall.EWINDOWS
-}
diff --git a/third_party/gofrontend/libgo/go/net/hook.go b/third_party/gofrontend/libgo/go/net/hook.go
deleted file mode 100644
index 9ab34c0..0000000
--- a/third_party/gofrontend/libgo/go/net/hook.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-var (
-	testHookDialTCP      = dialTCP
-	testHookHostsPath    = "/etc/hosts"
-	testHookLookupIP     = func(fn func(string) ([]IPAddr, error), host string) ([]IPAddr, error) { return fn(host) }
-	testHookSetKeepAlive = func() {}
-)
diff --git a/third_party/gofrontend/libgo/go/net/hook_cloexec.go b/third_party/gofrontend/libgo/go/net/hook_cloexec.go
deleted file mode 100644
index 870f0d7..0000000
--- a/third_party/gofrontend/libgo/go/net/hook_cloexec.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build freebsd linux
-
-package net
-
-import "syscall"
-
-var (
-	// Placeholders for socket system calls.
-	accept4Func func(int, int) (int, syscall.Sockaddr, error) = syscall.Accept4
-)
diff --git a/third_party/gofrontend/libgo/go/net/hook_plan9.go b/third_party/gofrontend/libgo/go/net/hook_plan9.go
deleted file mode 100644
index e053348..0000000
--- a/third_party/gofrontend/libgo/go/net/hook_plan9.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import "time"
-
-var testHookDialChannel = func() { time.Sleep(time.Millisecond) } // see golang.org/issue/5349
diff --git a/third_party/gofrontend/libgo/go/net/hook_unix.go b/third_party/gofrontend/libgo/go/net/hook_unix.go
deleted file mode 100644
index 361ca59..0000000
--- a/third_party/gofrontend/libgo/go/net/hook_unix.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package net
-
-import "syscall"
-
-var (
-	testHookDialChannel = func() {} // see golang.org/issue/5349
-
-	// Placeholders for socket system calls.
-	socketFunc        func(int, int, int) (int, error)         = syscall.Socket
-	closeFunc         func(int) error                          = syscall.Close
-	connectFunc       func(int, syscall.Sockaddr) error        = syscall.Connect
-	listenFunc        func(int, int) error                     = syscall.Listen
-	acceptFunc        func(int) (int, syscall.Sockaddr, error) = syscall.Accept
-	getsockoptIntFunc func(int, int, int) (int, error)         = syscall.GetsockoptInt
-)
diff --git a/third_party/gofrontend/libgo/go/net/hook_windows.go b/third_party/gofrontend/libgo/go/net/hook_windows.go
deleted file mode 100644
index 126b0eb..0000000
--- a/third_party/gofrontend/libgo/go/net/hook_windows.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"syscall"
-	"time"
-)
-
-var (
-	testHookDialChannel = func() { time.Sleep(time.Millisecond) } // see golang.org/issue/5349
-
-	// Placeholders for socket system calls.
-	socketFunc    func(int, int, int) (syscall.Handle, error)                                               = syscall.Socket
-	closeFunc     func(syscall.Handle) error                                                                = syscall.Closesocket
-	connectFunc   func(syscall.Handle, syscall.Sockaddr) error                                              = syscall.Connect
-	connectExFunc func(syscall.Handle, syscall.Sockaddr, *byte, uint32, *uint32, *syscall.Overlapped) error = syscall.ConnectEx
-	listenFunc    func(syscall.Handle, int) error                                                           = syscall.Listen
-)
diff --git a/third_party/gofrontend/libgo/go/net/hosts.go b/third_party/gofrontend/libgo/go/net/hosts.go
deleted file mode 100644
index 27958c7..0000000
--- a/third_party/gofrontend/libgo/go/net/hosts.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"sync"
-	"time"
-)
-
-const cacheMaxAge = 5 * time.Minute
-
-func parseLiteralIP(addr string) string {
-	var ip IP
-	var zone string
-	ip = parseIPv4(addr)
-	if ip == nil {
-		ip, zone = parseIPv6(addr, true)
-	}
-	if ip == nil {
-		return ""
-	}
-	if zone == "" {
-		return ip.String()
-	}
-	return ip.String() + "%" + zone
-}
-
-// Simple cache.
-var hosts struct {
-	sync.Mutex
-	byName map[string][]string
-	byAddr map[string][]string
-	expire time.Time
-	path   string
-}
-
-func readHosts() {
-	now := time.Now()
-	hp := testHookHostsPath
-	if len(hosts.byName) == 0 || now.After(hosts.expire) || hosts.path != hp {
-		hs := make(map[string][]string)
-		is := make(map[string][]string)
-		var file *file
-		if file, _ = open(hp); file == nil {
-			return
-		}
-		for line, ok := file.readLine(); ok; line, ok = file.readLine() {
-			if i := byteIndex(line, '#'); i >= 0 {
-				// Discard comments.
-				line = line[0:i]
-			}
-			f := getFields(line)
-			if len(f) < 2 {
-				continue
-			}
-			addr := parseLiteralIP(f[0])
-			if addr == "" {
-				continue
-			}
-			for i := 1; i < len(f); i++ {
-				h := f[i]
-				hs[h] = append(hs[h], addr)
-				is[addr] = append(is[addr], h)
-			}
-		}
-		// Update the data cache.
-		hosts.expire = now.Add(cacheMaxAge)
-		hosts.path = hp
-		hosts.byName = hs
-		hosts.byAddr = is
-		file.close()
-	}
-}
-
-// lookupStaticHost looks up the addresses for the given host from /etc/hosts.
-func lookupStaticHost(host string) []string {
-	hosts.Lock()
-	defer hosts.Unlock()
-	readHosts()
-	if len(hosts.byName) != 0 {
-		if ips, ok := hosts.byName[host]; ok {
-			return ips
-		}
-	}
-	return nil
-}
-
-// lookupStaticAddr looks up the hosts for the given address from /etc/hosts.
-func lookupStaticAddr(addr string) []string {
-	hosts.Lock()
-	defer hosts.Unlock()
-	readHosts()
-	addr = parseLiteralIP(addr)
-	if addr == "" {
-		return nil
-	}
-	if len(hosts.byAddr) != 0 {
-		if hosts, ok := hosts.byAddr[addr]; ok {
-			return hosts
-		}
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/hosts_test.go b/third_party/gofrontend/libgo/go/net/hosts_test.go
deleted file mode 100644
index aca64c3..0000000
--- a/third_party/gofrontend/libgo/go/net/hosts_test.go
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"reflect"
-	"testing"
-)
-
-type staticHostEntry struct {
-	in  string
-	out []string
-}
-
-var lookupStaticHostTests = []struct {
-	name string
-	ents []staticHostEntry
-}{
-	{
-		"testdata/hosts",
-		[]staticHostEntry{
-			{"odin", []string{"127.0.0.2", "127.0.0.3", "::2"}},
-			{"thor", []string{"127.1.1.1"}},
-			{"ullr", []string{"127.1.1.2"}},
-			{"ullrhost", []string{"127.1.1.2"}},
-			{"localhost", []string{"fe80::1%lo0"}},
-		},
-	},
-	{
-		"testdata/singleline-hosts", // see golang.org/issue/6646
-		[]staticHostEntry{
-			{"odin", []string{"127.0.0.2"}},
-		},
-	},
-	{
-		"testdata/ipv4-hosts", // see golang.org/issue/8996
-		[]staticHostEntry{
-			{"localhost", []string{"127.0.0.1", "127.0.0.2", "127.0.0.3"}},
-			{"localhost.localdomain", []string{"127.0.0.3"}},
-		},
-	},
-	{
-		"testdata/ipv6-hosts", // see golang.org/issue/8996
-		[]staticHostEntry{
-			{"localhost", []string{"::1", "fe80::1", "fe80::2%lo0", "fe80::3%lo0"}},
-			{"localhost.localdomain", []string{"fe80::3%lo0"}},
-		},
-	},
-}
-
-func TestLookupStaticHost(t *testing.T) {
-	defer func(orig string) { testHookHostsPath = orig }(testHookHostsPath)
-
-	for _, tt := range lookupStaticHostTests {
-		testHookHostsPath = tt.name
-		for _, ent := range tt.ents {
-			addrs := lookupStaticHost(ent.in)
-			if !reflect.DeepEqual(addrs, ent.out) {
-				t.Errorf("%s, lookupStaticHost(%s) = %v; want %v", tt.name, ent.in, addrs, ent.out)
-			}
-		}
-	}
-}
-
-var lookupStaticAddrTests = []struct {
-	name string
-	ents []staticHostEntry
-}{
-	{
-		"testdata/hosts",
-		[]staticHostEntry{
-			{"255.255.255.255", []string{"broadcasthost"}},
-			{"127.0.0.2", []string{"odin"}},
-			{"127.0.0.3", []string{"odin"}},
-			{"::2", []string{"odin"}},
-			{"127.1.1.1", []string{"thor"}},
-			{"127.1.1.2", []string{"ullr", "ullrhost"}},
-			{"fe80::1%lo0", []string{"localhost"}},
-		},
-	},
-	{
-		"testdata/singleline-hosts", // see golang.org/issue/6646
-		[]staticHostEntry{
-			{"127.0.0.2", []string{"odin"}},
-		},
-	},
-	{
-		"testdata/ipv4-hosts", // see golang.org/issue/8996
-		[]staticHostEntry{
-			{"127.0.0.1", []string{"localhost"}},
-			{"127.0.0.2", []string{"localhost"}},
-			{"127.0.0.3", []string{"localhost", "localhost.localdomain"}},
-		},
-	},
-	{
-		"testdata/ipv6-hosts", // see golang.org/issue/8996
-		[]staticHostEntry{
-			{"::1", []string{"localhost"}},
-			{"fe80::1", []string{"localhost"}},
-			{"fe80::2%lo0", []string{"localhost"}},
-			{"fe80::3%lo0", []string{"localhost", "localhost.localdomain"}},
-		},
-	},
-}
-
-func TestLookupStaticAddr(t *testing.T) {
-	defer func(orig string) { testHookHostsPath = orig }(testHookHostsPath)
-
-	for _, tt := range lookupStaticAddrTests {
-		testHookHostsPath = tt.name
-		for _, ent := range tt.ents {
-			hosts := lookupStaticAddr(ent.in)
-			if !reflect.DeepEqual(hosts, ent.out) {
-				t.Errorf("%s, lookupStaticAddr(%s) = %v; want %v", tt.name, ent.in, hosts, ent.out)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/hosts_testdata b/third_party/gofrontend/libgo/go/net/hosts_testdata
deleted file mode 100644
index b601763..0000000
--- a/third_party/gofrontend/libgo/go/net/hosts_testdata
+++ /dev/null
@@ -1,12 +0,0 @@
-255.255.255.255	broadcasthost
-127.0.0.2	odin
-127.0.0.3	odin  # inline comment 
-::2             odin
-127.1.1.1	thor
-# aliases
-127.1.1.2	ullr ullrhost
-# Bogus entries that must be ignored.
-123.123.123	loki
-321.321.321.321
-# TODO(yvesj): Should we be able to parse this? From a Darwin system.
-fe80::1%lo0	localhost
diff --git a/third_party/gofrontend/libgo/go/net/http/cgi/child.go b/third_party/gofrontend/libgo/go/net/http/cgi/child.go
deleted file mode 100644
index ec10108..0000000
--- a/third_party/gofrontend/libgo/go/net/http/cgi/child.go
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements CGI from the perspective of a child
-// process.
-
-package cgi
-
-import (
-	"bufio"
-	"crypto/tls"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net"
-	"net/http"
-	"net/url"
-	"os"
-	"strconv"
-	"strings"
-)
-
-// Request returns the HTTP request as represented in the current
-// environment. This assumes the current program is being run
-// by a web server in a CGI environment.
-// The returned Request's Body is populated, if applicable.
-func Request() (*http.Request, error) {
-	r, err := RequestFromMap(envMap(os.Environ()))
-	if err != nil {
-		return nil, err
-	}
-	if r.ContentLength > 0 {
-		r.Body = ioutil.NopCloser(io.LimitReader(os.Stdin, r.ContentLength))
-	}
-	return r, nil
-}
-
-func envMap(env []string) map[string]string {
-	m := make(map[string]string)
-	for _, kv := range env {
-		if idx := strings.Index(kv, "="); idx != -1 {
-			m[kv[:idx]] = kv[idx+1:]
-		}
-	}
-	return m
-}
-
-// RequestFromMap creates an http.Request from CGI variables.
-// The returned Request's Body field is not populated.
-func RequestFromMap(params map[string]string) (*http.Request, error) {
-	r := new(http.Request)
-	r.Method = params["REQUEST_METHOD"]
-	if r.Method == "" {
-		return nil, errors.New("cgi: no REQUEST_METHOD in environment")
-	}
-
-	r.Proto = params["SERVER_PROTOCOL"]
-	var ok bool
-	r.ProtoMajor, r.ProtoMinor, ok = http.ParseHTTPVersion(r.Proto)
-	if !ok {
-		return nil, errors.New("cgi: invalid SERVER_PROTOCOL version")
-	}
-
-	r.Close = true
-	r.Trailer = http.Header{}
-	r.Header = http.Header{}
-
-	r.Host = params["HTTP_HOST"]
-
-	if lenstr := params["CONTENT_LENGTH"]; lenstr != "" {
-		clen, err := strconv.ParseInt(lenstr, 10, 64)
-		if err != nil {
-			return nil, errors.New("cgi: bad CONTENT_LENGTH in environment: " + lenstr)
-		}
-		r.ContentLength = clen
-	}
-
-	if ct := params["CONTENT_TYPE"]; ct != "" {
-		r.Header.Set("Content-Type", ct)
-	}
-
-	// Copy "HTTP_FOO_BAR" variables to "Foo-Bar" Headers
-	for k, v := range params {
-		if !strings.HasPrefix(k, "HTTP_") || k == "HTTP_HOST" {
-			continue
-		}
-		r.Header.Add(strings.Replace(k[5:], "_", "-", -1), v)
-	}
-
-	// TODO: cookies.  parsing them isn't exported, though.
-
-	uriStr := params["REQUEST_URI"]
-	if uriStr == "" {
-		// Fallback to SCRIPT_NAME, PATH_INFO and QUERY_STRING.
-		uriStr = params["SCRIPT_NAME"] + params["PATH_INFO"]
-		s := params["QUERY_STRING"]
-		if s != "" {
-			uriStr += "?" + s
-		}
-	}
-
-	// There's apparently a de-facto standard for this.
-	// http://docstore.mik.ua/orelly/linux/cgi/ch03_02.htm#ch03-35636
-	if s := params["HTTPS"]; s == "on" || s == "ON" || s == "1" {
-		r.TLS = &tls.ConnectionState{HandshakeComplete: true}
-	}
-
-	if r.Host != "" {
-		// Hostname is provided, so we can reasonably construct a URL.
-		rawurl := r.Host + uriStr
-		if r.TLS == nil {
-			rawurl = "http://" + rawurl
-		} else {
-			rawurl = "https://" + rawurl
-		}
-		url, err := url.Parse(rawurl)
-		if err != nil {
-			return nil, errors.New("cgi: failed to parse host and REQUEST_URI into a URL: " + rawurl)
-		}
-		r.URL = url
-	}
-	// Fallback logic if we don't have a Host header or the URL
-	// failed to parse
-	if r.URL == nil {
-		url, err := url.Parse(uriStr)
-		if err != nil {
-			return nil, errors.New("cgi: failed to parse REQUEST_URI into a URL: " + uriStr)
-		}
-		r.URL = url
-	}
-
-	// Request.RemoteAddr has its port set by Go's standard http
-	// server, so we do here too.
-	remotePort, _ := strconv.Atoi(params["REMOTE_PORT"]) // zero if unset or invalid
-	r.RemoteAddr = net.JoinHostPort(params["REMOTE_ADDR"], strconv.Itoa(remotePort))
-
-	return r, nil
-}
-
-// Serve executes the provided Handler on the currently active CGI
-// request, if any. If there's no current CGI environment
-// an error is returned. The provided handler may be nil to use
-// http.DefaultServeMux.
-func Serve(handler http.Handler) error {
-	req, err := Request()
-	if err != nil {
-		return err
-	}
-	if handler == nil {
-		handler = http.DefaultServeMux
-	}
-	rw := &response{
-		req:    req,
-		header: make(http.Header),
-		bufw:   bufio.NewWriter(os.Stdout),
-	}
-	handler.ServeHTTP(rw, req)
-	rw.Write(nil) // make sure a response is sent
-	if err = rw.bufw.Flush(); err != nil {
-		return err
-	}
-	return nil
-}
-
-type response struct {
-	req        *http.Request
-	header     http.Header
-	bufw       *bufio.Writer
-	headerSent bool
-}
-
-func (r *response) Flush() {
-	r.bufw.Flush()
-}
-
-func (r *response) Header() http.Header {
-	return r.header
-}
-
-func (r *response) Write(p []byte) (n int, err error) {
-	if !r.headerSent {
-		r.WriteHeader(http.StatusOK)
-	}
-	return r.bufw.Write(p)
-}
-
-func (r *response) WriteHeader(code int) {
-	if r.headerSent {
-		// Note: explicitly using Stderr, as Stdout is our HTTP output.
-		fmt.Fprintf(os.Stderr, "CGI attempted to write header twice on request for %s", r.req.URL)
-		return
-	}
-	r.headerSent = true
-	fmt.Fprintf(r.bufw, "Status: %d %s\r\n", code, http.StatusText(code))
-
-	// Set a default Content-Type
-	if _, hasType := r.header["Content-Type"]; !hasType {
-		r.header.Add("Content-Type", "text/html; charset=utf-8")
-	}
-
-	r.header.Write(r.bufw)
-	r.bufw.WriteString("\r\n")
-	r.bufw.Flush()
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/cgi/child_test.go b/third_party/gofrontend/libgo/go/net/http/cgi/child_test.go
deleted file mode 100644
index 14e0af4..0000000
--- a/third_party/gofrontend/libgo/go/net/http/cgi/child_test.go
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Tests for CGI (the child process perspective)
-
-package cgi
-
-import (
-	"testing"
-)
-
-func TestRequest(t *testing.T) {
-	env := map[string]string{
-		"SERVER_PROTOCOL": "HTTP/1.1",
-		"REQUEST_METHOD":  "GET",
-		"HTTP_HOST":       "example.com",
-		"HTTP_REFERER":    "elsewhere",
-		"HTTP_USER_AGENT": "goclient",
-		"HTTP_FOO_BAR":    "baz",
-		"REQUEST_URI":     "/path?a=b",
-		"CONTENT_LENGTH":  "123",
-		"CONTENT_TYPE":    "text/xml",
-		"REMOTE_ADDR":     "5.6.7.8",
-		"REMOTE_PORT":     "54321",
-	}
-	req, err := RequestFromMap(env)
-	if err != nil {
-		t.Fatalf("RequestFromMap: %v", err)
-	}
-	if g, e := req.UserAgent(), "goclient"; e != g {
-		t.Errorf("expected UserAgent %q; got %q", e, g)
-	}
-	if g, e := req.Method, "GET"; e != g {
-		t.Errorf("expected Method %q; got %q", e, g)
-	}
-	if g, e := req.Header.Get("Content-Type"), "text/xml"; e != g {
-		t.Errorf("expected Content-Type %q; got %q", e, g)
-	}
-	if g, e := req.ContentLength, int64(123); e != g {
-		t.Errorf("expected ContentLength %d; got %d", e, g)
-	}
-	if g, e := req.Referer(), "elsewhere"; e != g {
-		t.Errorf("expected Referer %q; got %q", e, g)
-	}
-	if req.Header == nil {
-		t.Fatalf("unexpected nil Header")
-	}
-	if g, e := req.Header.Get("Foo-Bar"), "baz"; e != g {
-		t.Errorf("expected Foo-Bar %q; got %q", e, g)
-	}
-	if g, e := req.URL.String(), "http://example.com/path?a=b"; e != g {
-		t.Errorf("expected URL %q; got %q", e, g)
-	}
-	if g, e := req.FormValue("a"), "b"; e != g {
-		t.Errorf("expected FormValue(a) %q; got %q", e, g)
-	}
-	if req.Trailer == nil {
-		t.Errorf("unexpected nil Trailer")
-	}
-	if req.TLS != nil {
-		t.Errorf("expected nil TLS")
-	}
-	if e, g := "5.6.7.8:54321", req.RemoteAddr; e != g {
-		t.Errorf("RemoteAddr: got %q; want %q", g, e)
-	}
-}
-
-func TestRequestWithTLS(t *testing.T) {
-	env := map[string]string{
-		"SERVER_PROTOCOL": "HTTP/1.1",
-		"REQUEST_METHOD":  "GET",
-		"HTTP_HOST":       "example.com",
-		"HTTP_REFERER":    "elsewhere",
-		"REQUEST_URI":     "/path?a=b",
-		"CONTENT_TYPE":    "text/xml",
-		"HTTPS":           "1",
-		"REMOTE_ADDR":     "5.6.7.8",
-	}
-	req, err := RequestFromMap(env)
-	if err != nil {
-		t.Fatalf("RequestFromMap: %v", err)
-	}
-	if g, e := req.URL.String(), "https://example.com/path?a=b"; e != g {
-		t.Errorf("expected URL %q; got %q", e, g)
-	}
-	if req.TLS == nil {
-		t.Errorf("expected non-nil TLS")
-	}
-}
-
-func TestRequestWithoutHost(t *testing.T) {
-	env := map[string]string{
-		"SERVER_PROTOCOL": "HTTP/1.1",
-		"HTTP_HOST":       "",
-		"REQUEST_METHOD":  "GET",
-		"REQUEST_URI":     "/path?a=b",
-		"CONTENT_LENGTH":  "123",
-	}
-	req, err := RequestFromMap(env)
-	if err != nil {
-		t.Fatalf("RequestFromMap: %v", err)
-	}
-	if req.URL == nil {
-		t.Fatalf("unexpected nil URL")
-	}
-	if g, e := req.URL.String(), "/path?a=b"; e != g {
-		t.Errorf("URL = %q; want %q", g, e)
-	}
-}
-
-func TestRequestWithoutRequestURI(t *testing.T) {
-	env := map[string]string{
-		"SERVER_PROTOCOL": "HTTP/1.1",
-		"HTTP_HOST":       "example.com",
-		"REQUEST_METHOD":  "GET",
-		"SCRIPT_NAME":     "/dir/scriptname",
-		"PATH_INFO":       "/p1/p2",
-		"QUERY_STRING":    "a=1&b=2",
-		"CONTENT_LENGTH":  "123",
-	}
-	req, err := RequestFromMap(env)
-	if err != nil {
-		t.Fatalf("RequestFromMap: %v", err)
-	}
-	if req.URL == nil {
-		t.Fatalf("unexpected nil URL")
-	}
-	if g, e := req.URL.String(), "http://example.com/dir/scriptname/p1/p2?a=1&b=2"; e != g {
-		t.Errorf("URL = %q; want %q", g, e)
-	}
-}
-
-func TestRequestWithoutRemotePort(t *testing.T) {
-	env := map[string]string{
-		"SERVER_PROTOCOL": "HTTP/1.1",
-		"HTTP_HOST":       "example.com",
-		"REQUEST_METHOD":  "GET",
-		"REQUEST_URI":     "/path?a=b",
-		"CONTENT_LENGTH":  "123",
-		"REMOTE_ADDR":     "5.6.7.8",
-	}
-	req, err := RequestFromMap(env)
-	if err != nil {
-		t.Fatalf("RequestFromMap: %v", err)
-	}
-	if e, g := "5.6.7.8:0", req.RemoteAddr; e != g {
-		t.Errorf("RemoteAddr: got %q; want %q", g, e)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/cgi/host.go b/third_party/gofrontend/libgo/go/net/http/cgi/host.go
deleted file mode 100644
index 4efbe7a..0000000
--- a/third_party/gofrontend/libgo/go/net/http/cgi/host.go
+++ /dev/null
@@ -1,383 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements the host side of CGI (being the webserver
-// parent process).
-
-// Package cgi implements CGI (Common Gateway Interface) as specified
-// in RFC 3875.
-//
-// Note that using CGI means starting a new process to handle each
-// request, which is typically less efficient than using a
-// long-running server.  This package is intended primarily for
-// compatibility with existing systems.
-package cgi
-
-import (
-	"bufio"
-	"fmt"
-	"io"
-	"log"
-	"net"
-	"net/http"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"regexp"
-	"runtime"
-	"strconv"
-	"strings"
-)
-
-var trailingPort = regexp.MustCompile(`:([0-9]+)$`)
-
-var osDefaultInheritEnv = map[string][]string{
-	"darwin":  {"DYLD_LIBRARY_PATH"},
-	"freebsd": {"LD_LIBRARY_PATH"},
-	"hpux":    {"LD_LIBRARY_PATH", "SHLIB_PATH"},
-	"irix":    {"LD_LIBRARY_PATH", "LD_LIBRARYN32_PATH", "LD_LIBRARY64_PATH"},
-	"linux":   {"LD_LIBRARY_PATH"},
-	"openbsd": {"LD_LIBRARY_PATH"},
-	"solaris": {"LD_LIBRARY_PATH", "LD_LIBRARY_PATH_32", "LD_LIBRARY_PATH_64"},
-	"windows": {"SystemRoot", "COMSPEC", "PATHEXT", "WINDIR"},
-}
-
-// Handler runs an executable in a subprocess with a CGI environment.
-type Handler struct {
-	Path string // path to the CGI executable
-	Root string // root URI prefix of handler or empty for "/"
-
-	// Dir specifies the CGI executable's working directory.
-	// If Dir is empty, the base directory of Path is used.
-	// If Path has no base directory, the current working
-	// directory is used.
-	Dir string
-
-	Env        []string    // extra environment variables to set, if any, as "key=value"
-	InheritEnv []string    // environment variables to inherit from host, as "key"
-	Logger     *log.Logger // optional log for errors or nil to use log.Print
-	Args       []string    // optional arguments to pass to child process
-
-	// PathLocationHandler specifies the root http Handler that
-	// should handle internal redirects when the CGI process
-	// returns a Location header value starting with a "/", as
-	// specified in RFC 3875 § 6.3.2. This will likely be
-	// http.DefaultServeMux.
-	//
-	// If nil, a CGI response with a local URI path is instead sent
-	// back to the client and not redirected internally.
-	PathLocationHandler http.Handler
-}
-
-// removeLeadingDuplicates remove leading duplicate in environments.
-// It's possible to override environment like following.
-//    cgi.Handler{
-//      ...
-//      Env: []string{"SCRIPT_FILENAME=foo.php"},
-//    }
-func removeLeadingDuplicates(env []string) (ret []string) {
-	n := len(env)
-	for i := 0; i < n; i++ {
-		e := env[i]
-		s := strings.SplitN(e, "=", 2)[0]
-		found := false
-		for j := i + 1; j < n; j++ {
-			if s == strings.SplitN(env[j], "=", 2)[0] {
-				found = true
-				break
-			}
-		}
-		if !found {
-			ret = append(ret, e)
-		}
-	}
-	return
-}
-
-func (h *Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
-	root := h.Root
-	if root == "" {
-		root = "/"
-	}
-
-	if len(req.TransferEncoding) > 0 && req.TransferEncoding[0] == "chunked" {
-		rw.WriteHeader(http.StatusBadRequest)
-		rw.Write([]byte("Chunked request bodies are not supported by CGI."))
-		return
-	}
-
-	pathInfo := req.URL.Path
-	if root != "/" && strings.HasPrefix(pathInfo, root) {
-		pathInfo = pathInfo[len(root):]
-	}
-
-	port := "80"
-	if matches := trailingPort.FindStringSubmatch(req.Host); len(matches) != 0 {
-		port = matches[1]
-	}
-
-	env := []string{
-		"SERVER_SOFTWARE=go",
-		"SERVER_NAME=" + req.Host,
-		"SERVER_PROTOCOL=HTTP/1.1",
-		"HTTP_HOST=" + req.Host,
-		"GATEWAY_INTERFACE=CGI/1.1",
-		"REQUEST_METHOD=" + req.Method,
-		"QUERY_STRING=" + req.URL.RawQuery,
-		"REQUEST_URI=" + req.URL.RequestURI(),
-		"PATH_INFO=" + pathInfo,
-		"SCRIPT_NAME=" + root,
-		"SCRIPT_FILENAME=" + h.Path,
-		"SERVER_PORT=" + port,
-	}
-
-	if remoteIP, remotePort, err := net.SplitHostPort(req.RemoteAddr); err == nil {
-		env = append(env, "REMOTE_ADDR="+remoteIP, "REMOTE_HOST="+remoteIP, "REMOTE_PORT="+remotePort)
-	} else {
-		// could not parse ip:port, let's use whole RemoteAddr and leave REMOTE_PORT undefined
-		env = append(env, "REMOTE_ADDR="+req.RemoteAddr, "REMOTE_HOST="+req.RemoteAddr)
-	}
-
-	if req.TLS != nil {
-		env = append(env, "HTTPS=on")
-	}
-
-	for k, v := range req.Header {
-		k = strings.Map(upperCaseAndUnderscore, k)
-		joinStr := ", "
-		if k == "COOKIE" {
-			joinStr = "; "
-		}
-		env = append(env, "HTTP_"+k+"="+strings.Join(v, joinStr))
-	}
-
-	if req.ContentLength > 0 {
-		env = append(env, fmt.Sprintf("CONTENT_LENGTH=%d", req.ContentLength))
-	}
-	if ctype := req.Header.Get("Content-Type"); ctype != "" {
-		env = append(env, "CONTENT_TYPE="+ctype)
-	}
-
-	if h.Env != nil {
-		env = append(env, h.Env...)
-	}
-
-	envPath := os.Getenv("PATH")
-	if envPath == "" {
-		envPath = "/bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin"
-	}
-	env = append(env, "PATH="+envPath)
-
-	for _, e := range h.InheritEnv {
-		if v := os.Getenv(e); v != "" {
-			env = append(env, e+"="+v)
-		}
-	}
-
-	for _, e := range osDefaultInheritEnv[runtime.GOOS] {
-		if v := os.Getenv(e); v != "" {
-			env = append(env, e+"="+v)
-		}
-	}
-
-	env = removeLeadingDuplicates(env)
-
-	var cwd, path string
-	if h.Dir != "" {
-		path = h.Path
-		cwd = h.Dir
-	} else {
-		cwd, path = filepath.Split(h.Path)
-	}
-	if cwd == "" {
-		cwd = "."
-	}
-
-	internalError := func(err error) {
-		rw.WriteHeader(http.StatusInternalServerError)
-		h.printf("CGI error: %v", err)
-	}
-
-	cmd := &exec.Cmd{
-		Path:   path,
-		Args:   append([]string{h.Path}, h.Args...),
-		Dir:    cwd,
-		Env:    env,
-		Stderr: os.Stderr, // for now
-	}
-	if req.ContentLength != 0 {
-		cmd.Stdin = req.Body
-	}
-	stdoutRead, err := cmd.StdoutPipe()
-	if err != nil {
-		internalError(err)
-		return
-	}
-
-	err = cmd.Start()
-	if err != nil {
-		internalError(err)
-		return
-	}
-	if hook := testHookStartProcess; hook != nil {
-		hook(cmd.Process)
-	}
-	defer cmd.Wait()
-	defer stdoutRead.Close()
-
-	linebody := bufio.NewReaderSize(stdoutRead, 1024)
-	headers := make(http.Header)
-	statusCode := 0
-	headerLines := 0
-	sawBlankLine := false
-	for {
-		line, isPrefix, err := linebody.ReadLine()
-		if isPrefix {
-			rw.WriteHeader(http.StatusInternalServerError)
-			h.printf("cgi: long header line from subprocess.")
-			return
-		}
-		if err == io.EOF {
-			break
-		}
-		if err != nil {
-			rw.WriteHeader(http.StatusInternalServerError)
-			h.printf("cgi: error reading headers: %v", err)
-			return
-		}
-		if len(line) == 0 {
-			sawBlankLine = true
-			break
-		}
-		headerLines++
-		parts := strings.SplitN(string(line), ":", 2)
-		if len(parts) < 2 {
-			h.printf("cgi: bogus header line: %s", string(line))
-			continue
-		}
-		header, val := parts[0], parts[1]
-		header = strings.TrimSpace(header)
-		val = strings.TrimSpace(val)
-		switch {
-		case header == "Status":
-			if len(val) < 3 {
-				h.printf("cgi: bogus status (short): %q", val)
-				return
-			}
-			code, err := strconv.Atoi(val[0:3])
-			if err != nil {
-				h.printf("cgi: bogus status: %q", val)
-				h.printf("cgi: line was %q", line)
-				return
-			}
-			statusCode = code
-		default:
-			headers.Add(header, val)
-		}
-	}
-	if headerLines == 0 || !sawBlankLine {
-		rw.WriteHeader(http.StatusInternalServerError)
-		h.printf("cgi: no headers")
-		return
-	}
-
-	if loc := headers.Get("Location"); loc != "" {
-		if strings.HasPrefix(loc, "/") && h.PathLocationHandler != nil {
-			h.handleInternalRedirect(rw, req, loc)
-			return
-		}
-		if statusCode == 0 {
-			statusCode = http.StatusFound
-		}
-	}
-
-	if statusCode == 0 && headers.Get("Content-Type") == "" {
-		rw.WriteHeader(http.StatusInternalServerError)
-		h.printf("cgi: missing required Content-Type in headers")
-		return
-	}
-
-	if statusCode == 0 {
-		statusCode = http.StatusOK
-	}
-
-	// Copy headers to rw's headers, after we've decided not to
-	// go into handleInternalRedirect, which won't want its rw
-	// headers to have been touched.
-	for k, vv := range headers {
-		for _, v := range vv {
-			rw.Header().Add(k, v)
-		}
-	}
-
-	rw.WriteHeader(statusCode)
-
-	_, err = io.Copy(rw, linebody)
-	if err != nil {
-		h.printf("cgi: copy error: %v", err)
-		// And kill the child CGI process so we don't hang on
-		// the deferred cmd.Wait above if the error was just
-		// the client (rw) going away. If it was a read error
-		// (because the child died itself), then the extra
-		// kill of an already-dead process is harmless (the PID
-		// won't be reused until the Wait above).
-		cmd.Process.Kill()
-	}
-}
-
-func (h *Handler) printf(format string, v ...interface{}) {
-	if h.Logger != nil {
-		h.Logger.Printf(format, v...)
-	} else {
-		log.Printf(format, v...)
-	}
-}
-
-func (h *Handler) handleInternalRedirect(rw http.ResponseWriter, req *http.Request, path string) {
-	url, err := req.URL.Parse(path)
-	if err != nil {
-		rw.WriteHeader(http.StatusInternalServerError)
-		h.printf("cgi: error resolving local URI path %q: %v", path, err)
-		return
-	}
-	// TODO: RFC 3875 isn't clear if only GET is supported, but it
-	// suggests so: "Note that any message-body attached to the
-	// request (such as for a POST request) may not be available
-	// to the resource that is the target of the redirect."  We
-	// should do some tests against Apache to see how it handles
-	// POST, HEAD, etc. Does the internal redirect get the same
-	// method or just GET? What about incoming headers?
-	// (e.g. Cookies) Which headers, if any, are copied into the
-	// second request?
-	newReq := &http.Request{
-		Method:     "GET",
-		URL:        url,
-		Proto:      "HTTP/1.1",
-		ProtoMajor: 1,
-		ProtoMinor: 1,
-		Header:     make(http.Header),
-		Host:       url.Host,
-		RemoteAddr: req.RemoteAddr,
-		TLS:        req.TLS,
-	}
-	h.PathLocationHandler.ServeHTTP(rw, newReq)
-}
-
-func upperCaseAndUnderscore(r rune) rune {
-	switch {
-	case r >= 'a' && r <= 'z':
-		return r - ('a' - 'A')
-	case r == '-':
-		return '_'
-	case r == '=':
-		// Maybe not part of the CGI 'spec' but would mess up
-		// the environment in any case, as Go represents the
-		// environment as a slice of "key=value" strings.
-		return '_'
-	}
-	// TODO: other transformations in spec or practice?
-	return r
-}
-
-var testHookStartProcess func(*os.Process) // nil except for some tests
diff --git a/third_party/gofrontend/libgo/go/net/http/cgi/host_test.go b/third_party/gofrontend/libgo/go/net/http/cgi/host_test.go
deleted file mode 100644
index f341110..0000000
--- a/third_party/gofrontend/libgo/go/net/http/cgi/host_test.go
+++ /dev/null
@@ -1,499 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Tests for package cgi
-
-package cgi
-
-import (
-	"bufio"
-	"fmt"
-	"io"
-	"net"
-	"net/http"
-	"net/http/httptest"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"strconv"
-	"strings"
-	"testing"
-	"time"
-)
-
-func newRequest(httpreq string) *http.Request {
-	buf := bufio.NewReader(strings.NewReader(httpreq))
-	req, err := http.ReadRequest(buf)
-	if err != nil {
-		panic("cgi: bogus http request in test: " + httpreq)
-	}
-	req.RemoteAddr = "1.2.3.4:1234"
-	return req
-}
-
-func runCgiTest(t *testing.T, h *Handler, httpreq string, expectedMap map[string]string) *httptest.ResponseRecorder {
-	rw := httptest.NewRecorder()
-	req := newRequest(httpreq)
-	h.ServeHTTP(rw, req)
-	runResponseChecks(t, rw, expectedMap)
-	return rw
-}
-
-func runResponseChecks(t *testing.T, rw *httptest.ResponseRecorder, expectedMap map[string]string) {
-	// Make a map to hold the test map that the CGI returns.
-	m := make(map[string]string)
-	m["_body"] = rw.Body.String()
-	linesRead := 0
-readlines:
-	for {
-		line, err := rw.Body.ReadString('\n')
-		switch {
-		case err == io.EOF:
-			break readlines
-		case err != nil:
-			t.Fatalf("unexpected error reading from CGI: %v", err)
-		}
-		linesRead++
-		trimmedLine := strings.TrimRight(line, "\r\n")
-		split := strings.SplitN(trimmedLine, "=", 2)
-		if len(split) != 2 {
-			t.Fatalf("Unexpected %d parts from invalid line number %v: %q; existing map=%v",
-				len(split), linesRead, line, m)
-		}
-		m[split[0]] = split[1]
-	}
-
-	for key, expected := range expectedMap {
-		got := m[key]
-		if key == "cwd" {
-			// For Windows. golang.org/issue/4645.
-			fi1, _ := os.Stat(got)
-			fi2, _ := os.Stat(expected)
-			if os.SameFile(fi1, fi2) {
-				got = expected
-			}
-		}
-		if got != expected {
-			t.Errorf("for key %q got %q; expected %q", key, got, expected)
-		}
-	}
-}
-
-var cgiTested, cgiWorks bool
-
-func check(t *testing.T) {
-	if !cgiTested {
-		cgiTested = true
-		cgiWorks = exec.Command("./testdata/test.cgi").Run() == nil
-	}
-	if !cgiWorks {
-		// No Perl on Windows, needed by test.cgi
-		// TODO: make the child process be Go, not Perl.
-		t.Skip("Skipping test: test.cgi failed.")
-	}
-}
-
-func TestCGIBasicGet(t *testing.T) {
-	check(t)
-	h := &Handler{
-		Path: "testdata/test.cgi",
-		Root: "/test.cgi",
-	}
-	expectedMap := map[string]string{
-		"test":                  "Hello CGI",
-		"param-a":               "b",
-		"param-foo":             "bar",
-		"env-GATEWAY_INTERFACE": "CGI/1.1",
-		"env-HTTP_HOST":         "example.com",
-		"env-PATH_INFO":         "",
-		"env-QUERY_STRING":      "foo=bar&a=b",
-		"env-REMOTE_ADDR":       "1.2.3.4",
-		"env-REMOTE_HOST":       "1.2.3.4",
-		"env-REMOTE_PORT":       "1234",
-		"env-REQUEST_METHOD":    "GET",
-		"env-REQUEST_URI":       "/test.cgi?foo=bar&a=b",
-		"env-SCRIPT_FILENAME":   "testdata/test.cgi",
-		"env-SCRIPT_NAME":       "/test.cgi",
-		"env-SERVER_NAME":       "example.com",
-		"env-SERVER_PORT":       "80",
-		"env-SERVER_SOFTWARE":   "go",
-	}
-	replay := runCgiTest(t, h, "GET /test.cgi?foo=bar&a=b HTTP/1.0\nHost: example.com\n\n", expectedMap)
-
-	if expected, got := "text/html", replay.Header().Get("Content-Type"); got != expected {
-		t.Errorf("got a Content-Type of %q; expected %q", got, expected)
-	}
-	if expected, got := "X-Test-Value", replay.Header().Get("X-Test-Header"); got != expected {
-		t.Errorf("got a X-Test-Header of %q; expected %q", got, expected)
-	}
-}
-
-func TestCGIEnvIPv6(t *testing.T) {
-	check(t)
-	h := &Handler{
-		Path: "testdata/test.cgi",
-		Root: "/test.cgi",
-	}
-	expectedMap := map[string]string{
-		"test":                  "Hello CGI",
-		"param-a":               "b",
-		"param-foo":             "bar",
-		"env-GATEWAY_INTERFACE": "CGI/1.1",
-		"env-HTTP_HOST":         "example.com",
-		"env-PATH_INFO":         "",
-		"env-QUERY_STRING":      "foo=bar&a=b",
-		"env-REMOTE_ADDR":       "2000::3000",
-		"env-REMOTE_HOST":       "2000::3000",
-		"env-REMOTE_PORT":       "12345",
-		"env-REQUEST_METHOD":    "GET",
-		"env-REQUEST_URI":       "/test.cgi?foo=bar&a=b",
-		"env-SCRIPT_FILENAME":   "testdata/test.cgi",
-		"env-SCRIPT_NAME":       "/test.cgi",
-		"env-SERVER_NAME":       "example.com",
-		"env-SERVER_PORT":       "80",
-		"env-SERVER_SOFTWARE":   "go",
-	}
-
-	rw := httptest.NewRecorder()
-	req := newRequest("GET /test.cgi?foo=bar&a=b HTTP/1.0\nHost: example.com\n\n")
-	req.RemoteAddr = "[2000::3000]:12345"
-	h.ServeHTTP(rw, req)
-	runResponseChecks(t, rw, expectedMap)
-}
-
-func TestCGIBasicGetAbsPath(t *testing.T) {
-	check(t)
-	pwd, err := os.Getwd()
-	if err != nil {
-		t.Fatalf("getwd error: %v", err)
-	}
-	h := &Handler{
-		Path: pwd + "/testdata/test.cgi",
-		Root: "/test.cgi",
-	}
-	expectedMap := map[string]string{
-		"env-REQUEST_URI":     "/test.cgi?foo=bar&a=b",
-		"env-SCRIPT_FILENAME": pwd + "/testdata/test.cgi",
-		"env-SCRIPT_NAME":     "/test.cgi",
-	}
-	runCgiTest(t, h, "GET /test.cgi?foo=bar&a=b HTTP/1.0\nHost: example.com\n\n", expectedMap)
-}
-
-func TestPathInfo(t *testing.T) {
-	check(t)
-	h := &Handler{
-		Path: "testdata/test.cgi",
-		Root: "/test.cgi",
-	}
-	expectedMap := map[string]string{
-		"param-a":             "b",
-		"env-PATH_INFO":       "/extrapath",
-		"env-QUERY_STRING":    "a=b",
-		"env-REQUEST_URI":     "/test.cgi/extrapath?a=b",
-		"env-SCRIPT_FILENAME": "testdata/test.cgi",
-		"env-SCRIPT_NAME":     "/test.cgi",
-	}
-	runCgiTest(t, h, "GET /test.cgi/extrapath?a=b HTTP/1.0\nHost: example.com\n\n", expectedMap)
-}
-
-func TestPathInfoDirRoot(t *testing.T) {
-	check(t)
-	h := &Handler{
-		Path: "testdata/test.cgi",
-		Root: "/myscript/",
-	}
-	expectedMap := map[string]string{
-		"env-PATH_INFO":       "bar",
-		"env-QUERY_STRING":    "a=b",
-		"env-REQUEST_URI":     "/myscript/bar?a=b",
-		"env-SCRIPT_FILENAME": "testdata/test.cgi",
-		"env-SCRIPT_NAME":     "/myscript/",
-	}
-	runCgiTest(t, h, "GET /myscript/bar?a=b HTTP/1.0\nHost: example.com\n\n", expectedMap)
-}
-
-func TestDupHeaders(t *testing.T) {
-	check(t)
-	h := &Handler{
-		Path: "testdata/test.cgi",
-	}
-	expectedMap := map[string]string{
-		"env-REQUEST_URI":     "/myscript/bar?a=b",
-		"env-SCRIPT_FILENAME": "testdata/test.cgi",
-		"env-HTTP_COOKIE":     "nom=NOM; yum=YUM",
-		"env-HTTP_X_FOO":      "val1, val2",
-	}
-	runCgiTest(t, h, "GET /myscript/bar?a=b HTTP/1.0\n"+
-		"Cookie: nom=NOM\n"+
-		"Cookie: yum=YUM\n"+
-		"X-Foo: val1\n"+
-		"X-Foo: val2\n"+
-		"Host: example.com\n\n",
-		expectedMap)
-}
-
-func TestPathInfoNoRoot(t *testing.T) {
-	check(t)
-	h := &Handler{
-		Path: "testdata/test.cgi",
-		Root: "",
-	}
-	expectedMap := map[string]string{
-		"env-PATH_INFO":       "/bar",
-		"env-QUERY_STRING":    "a=b",
-		"env-REQUEST_URI":     "/bar?a=b",
-		"env-SCRIPT_FILENAME": "testdata/test.cgi",
-		"env-SCRIPT_NAME":     "/",
-	}
-	runCgiTest(t, h, "GET /bar?a=b HTTP/1.0\nHost: example.com\n\n", expectedMap)
-}
-
-func TestCGIBasicPost(t *testing.T) {
-	check(t)
-	postReq := `POST /test.cgi?a=b HTTP/1.0
-Host: example.com
-Content-Type: application/x-www-form-urlencoded
-Content-Length: 15
-
-postfoo=postbar`
-	h := &Handler{
-		Path: "testdata/test.cgi",
-		Root: "/test.cgi",
-	}
-	expectedMap := map[string]string{
-		"test":               "Hello CGI",
-		"param-postfoo":      "postbar",
-		"env-REQUEST_METHOD": "POST",
-		"env-CONTENT_LENGTH": "15",
-		"env-REQUEST_URI":    "/test.cgi?a=b",
-	}
-	runCgiTest(t, h, postReq, expectedMap)
-}
-
-func chunk(s string) string {
-	return fmt.Sprintf("%x\r\n%s\r\n", len(s), s)
-}
-
-// The CGI spec doesn't allow chunked requests.
-func TestCGIPostChunked(t *testing.T) {
-	check(t)
-	postReq := `POST /test.cgi?a=b HTTP/1.1
-Host: example.com
-Content-Type: application/x-www-form-urlencoded
-Transfer-Encoding: chunked
-
-` + chunk("postfoo") + chunk("=") + chunk("postbar") + chunk("")
-
-	h := &Handler{
-		Path: "testdata/test.cgi",
-		Root: "/test.cgi",
-	}
-	expectedMap := map[string]string{}
-	resp := runCgiTest(t, h, postReq, expectedMap)
-	if got, expected := resp.Code, http.StatusBadRequest; got != expected {
-		t.Fatalf("Expected %v response code from chunked request body; got %d",
-			expected, got)
-	}
-}
-
-func TestRedirect(t *testing.T) {
-	check(t)
-	h := &Handler{
-		Path: "testdata/test.cgi",
-		Root: "/test.cgi",
-	}
-	rec := runCgiTest(t, h, "GET /test.cgi?loc=http://foo.com/ HTTP/1.0\nHost: example.com\n\n", nil)
-	if e, g := 302, rec.Code; e != g {
-		t.Errorf("expected status code %d; got %d", e, g)
-	}
-	if e, g := "http://foo.com/", rec.Header().Get("Location"); e != g {
-		t.Errorf("expected Location header of %q; got %q", e, g)
-	}
-}
-
-func TestInternalRedirect(t *testing.T) {
-	check(t)
-	baseHandler := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
-		fmt.Fprintf(rw, "basepath=%s\n", req.URL.Path)
-		fmt.Fprintf(rw, "remoteaddr=%s\n", req.RemoteAddr)
-	})
-	h := &Handler{
-		Path:                "testdata/test.cgi",
-		Root:                "/test.cgi",
-		PathLocationHandler: baseHandler,
-	}
-	expectedMap := map[string]string{
-		"basepath":   "/foo",
-		"remoteaddr": "1.2.3.4:1234",
-	}
-	runCgiTest(t, h, "GET /test.cgi?loc=/foo HTTP/1.0\nHost: example.com\n\n", expectedMap)
-}
-
-// TestCopyError tests that we kill the process if there's an error copying
-// its output. (for example, from the client having gone away)
-func TestCopyError(t *testing.T) {
-	check(t)
-	if runtime.GOOS == "windows" {
-		t.Skipf("skipping test on %q", runtime.GOOS)
-	}
-	h := &Handler{
-		Path: "testdata/test.cgi",
-		Root: "/test.cgi",
-	}
-	ts := httptest.NewServer(h)
-	defer ts.Close()
-
-	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	req, _ := http.NewRequest("GET", "http://example.com/test.cgi?bigresponse=1", nil)
-	err = req.Write(conn)
-	if err != nil {
-		t.Fatalf("Write: %v", err)
-	}
-
-	res, err := http.ReadResponse(bufio.NewReader(conn), req)
-	if err != nil {
-		t.Fatalf("ReadResponse: %v", err)
-	}
-
-	pidstr := res.Header.Get("X-CGI-Pid")
-	if pidstr == "" {
-		t.Fatalf("expected an X-CGI-Pid header in response")
-	}
-	pid, err := strconv.Atoi(pidstr)
-	if err != nil {
-		t.Fatalf("invalid X-CGI-Pid value")
-	}
-
-	var buf [5000]byte
-	n, err := io.ReadFull(res.Body, buf[:])
-	if err != nil {
-		t.Fatalf("ReadFull: %d bytes, %v", n, err)
-	}
-
-	childRunning := func() bool {
-		return isProcessRunning(t, pid)
-	}
-
-	if !childRunning() {
-		t.Fatalf("pre-conn.Close, expected child to be running")
-	}
-	conn.Close()
-
-	tries := 0
-	for tries < 25 && childRunning() {
-		time.Sleep(50 * time.Millisecond * time.Duration(tries))
-		tries++
-	}
-	if childRunning() {
-		t.Fatalf("post-conn.Close, expected child to be gone")
-	}
-}
-
-func TestDirUnix(t *testing.T) {
-	check(t)
-	if runtime.GOOS == "windows" {
-		t.Skipf("skipping test on %q", runtime.GOOS)
-	}
-	cwd, _ := os.Getwd()
-	h := &Handler{
-		Path: "testdata/test.cgi",
-		Root: "/test.cgi",
-		Dir:  cwd,
-	}
-	expectedMap := map[string]string{
-		"cwd": cwd,
-	}
-	runCgiTest(t, h, "GET /test.cgi HTTP/1.0\nHost: example.com\n\n", expectedMap)
-
-	cwd, _ = os.Getwd()
-	cwd = filepath.Join(cwd, "testdata")
-	h = &Handler{
-		Path: "testdata/test.cgi",
-		Root: "/test.cgi",
-	}
-	abswd, _ := filepath.EvalSymlinks(cwd)
-	expectedMap = map[string]string{
-		"cwd": abswd,
-	}
-	runCgiTest(t, h, "GET /test.cgi HTTP/1.0\nHost: example.com\n\n", expectedMap)
-}
-
-func TestDirWindows(t *testing.T) {
-	if runtime.GOOS != "windows" {
-		t.Skip("Skipping windows specific test.")
-	}
-
-	cgifile, _ := filepath.Abs("testdata/test.cgi")
-
-	var perl string
-	var err error
-	perl, err = exec.LookPath("perl")
-	if err != nil {
-		t.Skip("Skipping test: perl not found.")
-	}
-	perl, _ = filepath.Abs(perl)
-
-	cwd, _ := os.Getwd()
-	h := &Handler{
-		Path: perl,
-		Root: "/test.cgi",
-		Dir:  cwd,
-		Args: []string{cgifile},
-		Env:  []string{"SCRIPT_FILENAME=" + cgifile},
-	}
-	expectedMap := map[string]string{
-		"cwd": cwd,
-	}
-	runCgiTest(t, h, "GET /test.cgi HTTP/1.0\nHost: example.com\n\n", expectedMap)
-
-	// If not specify Dir on windows, working directory should be
-	// base directory of perl.
-	cwd, _ = filepath.Split(perl)
-	if cwd != "" && cwd[len(cwd)-1] == filepath.Separator {
-		cwd = cwd[:len(cwd)-1]
-	}
-	h = &Handler{
-		Path: perl,
-		Root: "/test.cgi",
-		Args: []string{cgifile},
-		Env:  []string{"SCRIPT_FILENAME=" + cgifile},
-	}
-	expectedMap = map[string]string{
-		"cwd": cwd,
-	}
-	runCgiTest(t, h, "GET /test.cgi HTTP/1.0\nHost: example.com\n\n", expectedMap)
-}
-
-func TestEnvOverride(t *testing.T) {
-	cgifile, _ := filepath.Abs("testdata/test.cgi")
-
-	var perl string
-	var err error
-	perl, err = exec.LookPath("perl")
-	if err != nil {
-		t.Skipf("Skipping test: perl not found.")
-	}
-	perl, _ = filepath.Abs(perl)
-
-	cwd, _ := os.Getwd()
-	h := &Handler{
-		Path: perl,
-		Root: "/test.cgi",
-		Dir:  cwd,
-		Args: []string{cgifile},
-		Env: []string{
-			"SCRIPT_FILENAME=" + cgifile,
-			"REQUEST_URI=/foo/bar"},
-	}
-	expectedMap := map[string]string{
-		"cwd": cwd,
-		"env-SCRIPT_FILENAME": cgifile,
-		"env-REQUEST_URI":     "/foo/bar",
-	}
-	runCgiTest(t, h, "GET /test.cgi HTTP/1.0\nHost: example.com\n\n", expectedMap)
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/cgi/matryoshka_test.go b/third_party/gofrontend/libgo/go/net/http/cgi/matryoshka_test.go
deleted file mode 100644
index 32d59c0..0000000
--- a/third_party/gofrontend/libgo/go/net/http/cgi/matryoshka_test.go
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Tests a Go CGI program running under a Go CGI host process.
-// Further, the two programs are the same binary, just checking
-// their environment to figure out what mode to run in.
-
-package cgi
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"internal/testenv"
-	"io"
-	"net/http"
-	"net/http/httptest"
-	"os"
-	"testing"
-	"time"
-)
-
-// This test is a CGI host (testing host.go) that runs its own binary
-// as a child process testing the other half of CGI (child.go).
-func TestHostingOurselves(t *testing.T) {
-	testenv.MustHaveExec(t)
-
-	h := &Handler{
-		Path: os.Args[0],
-		Root: "/test.go",
-		Args: []string{"-test.run=TestBeChildCGIProcess"},
-	}
-	expectedMap := map[string]string{
-		"test":                  "Hello CGI-in-CGI",
-		"param-a":               "b",
-		"param-foo":             "bar",
-		"env-GATEWAY_INTERFACE": "CGI/1.1",
-		"env-HTTP_HOST":         "example.com",
-		"env-PATH_INFO":         "",
-		"env-QUERY_STRING":      "foo=bar&a=b",
-		"env-REMOTE_ADDR":       "1.2.3.4",
-		"env-REMOTE_HOST":       "1.2.3.4",
-		"env-REMOTE_PORT":       "1234",
-		"env-REQUEST_METHOD":    "GET",
-		"env-REQUEST_URI":       "/test.go?foo=bar&a=b",
-		"env-SCRIPT_FILENAME":   os.Args[0],
-		"env-SCRIPT_NAME":       "/test.go",
-		"env-SERVER_NAME":       "example.com",
-		"env-SERVER_PORT":       "80",
-		"env-SERVER_SOFTWARE":   "go",
-	}
-	replay := runCgiTest(t, h, "GET /test.go?foo=bar&a=b HTTP/1.0\nHost: example.com\n\n", expectedMap)
-
-	if expected, got := "text/html; charset=utf-8", replay.Header().Get("Content-Type"); got != expected {
-		t.Errorf("got a Content-Type of %q; expected %q", got, expected)
-	}
-	if expected, got := "X-Test-Value", replay.Header().Get("X-Test-Header"); got != expected {
-		t.Errorf("got a X-Test-Header of %q; expected %q", got, expected)
-	}
-}
-
-type customWriterRecorder struct {
-	w io.Writer
-	*httptest.ResponseRecorder
-}
-
-func (r *customWriterRecorder) Write(p []byte) (n int, err error) {
-	return r.w.Write(p)
-}
-
-type limitWriter struct {
-	w io.Writer
-	n int
-}
-
-func (w *limitWriter) Write(p []byte) (n int, err error) {
-	if len(p) > w.n {
-		p = p[:w.n]
-	}
-	if len(p) > 0 {
-		n, err = w.w.Write(p)
-		w.n -= n
-	}
-	if w.n == 0 {
-		err = errors.New("past write limit")
-	}
-	return
-}
-
-// If there's an error copying the child's output to the parent, test
-// that we kill the child.
-func TestKillChildAfterCopyError(t *testing.T) {
-	testenv.MustHaveExec(t)
-
-	defer func() { testHookStartProcess = nil }()
-	proc := make(chan *os.Process, 1)
-	testHookStartProcess = func(p *os.Process) {
-		proc <- p
-	}
-
-	h := &Handler{
-		Path: os.Args[0],
-		Root: "/test.go",
-		Args: []string{"-test.run=TestBeChildCGIProcess"},
-	}
-	req, _ := http.NewRequest("GET", "http://example.com/test.cgi?write-forever=1", nil)
-	rec := httptest.NewRecorder()
-	var out bytes.Buffer
-	const writeLen = 50 << 10
-	rw := &customWriterRecorder{&limitWriter{&out, writeLen}, rec}
-
-	donec := make(chan bool, 1)
-	go func() {
-		h.ServeHTTP(rw, req)
-		donec <- true
-	}()
-
-	select {
-	case <-donec:
-		if out.Len() != writeLen || out.Bytes()[0] != 'a' {
-			t.Errorf("unexpected output: %q", out.Bytes())
-		}
-	case <-time.After(5 * time.Second):
-		t.Errorf("timeout. ServeHTTP hung and didn't kill the child process?")
-		select {
-		case p := <-proc:
-			p.Kill()
-			t.Logf("killed process")
-		default:
-			t.Logf("didn't kill process")
-		}
-	}
-}
-
-// Test that a child handler writing only headers works.
-// golang.org/issue/7196
-func TestChildOnlyHeaders(t *testing.T) {
-	testenv.MustHaveExec(t)
-
-	h := &Handler{
-		Path: os.Args[0],
-		Root: "/test.go",
-		Args: []string{"-test.run=TestBeChildCGIProcess"},
-	}
-	expectedMap := map[string]string{
-		"_body": "",
-	}
-	replay := runCgiTest(t, h, "GET /test.go?no-body=1 HTTP/1.0\nHost: example.com\n\n", expectedMap)
-	if expected, got := "X-Test-Value", replay.Header().Get("X-Test-Header"); got != expected {
-		t.Errorf("got a X-Test-Header of %q; expected %q", got, expected)
-	}
-}
-
-// golang.org/issue/7198
-func Test500WithNoHeaders(t *testing.T)     { want500Test(t, "/immediate-disconnect") }
-func Test500WithNoContentType(t *testing.T) { want500Test(t, "/no-content-type") }
-func Test500WithEmptyHeaders(t *testing.T)  { want500Test(t, "/empty-headers") }
-
-func want500Test(t *testing.T, path string) {
-	h := &Handler{
-		Path: os.Args[0],
-		Root: "/test.go",
-		Args: []string{"-test.run=TestBeChildCGIProcess"},
-	}
-	expectedMap := map[string]string{
-		"_body": "",
-	}
-	replay := runCgiTest(t, h, "GET "+path+" HTTP/1.0\nHost: example.com\n\n", expectedMap)
-	if replay.Code != 500 {
-		t.Errorf("Got code %d; want 500", replay.Code)
-	}
-}
-
-type neverEnding byte
-
-func (b neverEnding) Read(p []byte) (n int, err error) {
-	for i := range p {
-		p[i] = byte(b)
-	}
-	return len(p), nil
-}
-
-// Note: not actually a test.
-func TestBeChildCGIProcess(t *testing.T) {
-	if os.Getenv("REQUEST_METHOD") == "" {
-		// Not in a CGI environment; skipping test.
-		return
-	}
-	switch os.Getenv("REQUEST_URI") {
-	case "/immediate-disconnect":
-		os.Exit(0)
-	case "/no-content-type":
-		fmt.Printf("Content-Length: 6\n\nHello\n")
-		os.Exit(0)
-	case "/empty-headers":
-		fmt.Printf("\nHello")
-		os.Exit(0)
-	}
-	Serve(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
-		rw.Header().Set("X-Test-Header", "X-Test-Value")
-		req.ParseForm()
-		if req.FormValue("no-body") == "1" {
-			return
-		}
-		if req.FormValue("write-forever") == "1" {
-			io.Copy(rw, neverEnding('a'))
-			for {
-				time.Sleep(5 * time.Second) // hang forever, until killed
-			}
-		}
-		fmt.Fprintf(rw, "test=Hello CGI-in-CGI\n")
-		for k, vv := range req.Form {
-			for _, v := range vv {
-				fmt.Fprintf(rw, "param-%s=%s\n", k, v)
-			}
-		}
-		for _, kv := range os.Environ() {
-			fmt.Fprintf(rw, "env-%s\n", kv)
-		}
-	}))
-	os.Exit(0)
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/cgi/posix_test.go b/third_party/gofrontend/libgo/go/net/http/cgi/posix_test.go
deleted file mode 100644
index 5ff9e7d..0000000
--- a/third_party/gofrontend/libgo/go/net/http/cgi/posix_test.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package cgi
-
-import (
-	"os"
-	"syscall"
-	"testing"
-)
-
-func isProcessRunning(t *testing.T, pid int) bool {
-	p, err := os.FindProcess(pid)
-	if err != nil {
-		return false
-	}
-	return p.Signal(syscall.Signal(0)) == nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/cgi/testdata/test.cgi b/third_party/gofrontend/libgo/go/net/http/cgi/testdata/test.cgi
deleted file mode 100755
index ec7ee6f..0000000
--- a/third_party/gofrontend/libgo/go/net/http/cgi/testdata/test.cgi
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/perl
-# Copyright 2011 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-#
-# Test script run as a child process under cgi_test.go
-
-use strict;
-use Cwd;
-
-binmode STDOUT;
-
-my $q = MiniCGI->new;
-my $params = $q->Vars;
-
-if ($params->{"loc"}) {
-    print "Location: $params->{loc}\r\n\r\n";
-    exit(0);
-}
-
-print "Content-Type: text/html\r\n";
-print "X-CGI-Pid: $$\r\n";
-print "X-Test-Header: X-Test-Value\r\n";
-print "\r\n";
-
-if ($params->{"bigresponse"}) {
-    # 17 MB, for OS X: golang.org/issue/4958
-    for (1..(17 * 1024)) {
-        print "A" x 1024, "\r\n";
-    }
-    exit 0;
-}
-
-print "test=Hello CGI\r\n";
-
-foreach my $k (sort keys %$params) {
-    print "param-$k=$params->{$k}\r\n";
-}
-
-foreach my $k (sort keys %ENV) {
-    my $clean_env = $ENV{$k};
-    $clean_env =~ s/[\n\r]//g;
-    print "env-$k=$clean_env\r\n";
-}
-
-# NOTE: msys perl returns /c/go/src/... not C:\go\....
-my $dir = getcwd();
-if ($^O eq 'MSWin32' || $^O eq 'msys' || $^O eq 'cygwin') {
-    if ($dir =~ /^.:/) {
-        $dir =~ s!/!\\!g;
-    } else {
-        my $cmd = $ENV{'COMSPEC'} || 'c:\\windows\\system32\\cmd.exe';
-        $cmd =~ s!\\!/!g;
-        $dir = `$cmd /c cd`;
-        chomp $dir;
-    }
-}
-print "cwd=$dir\r\n";
-
-# A minimal version of CGI.pm, for people without the perl-modules
-# package installed.  (CGI.pm used to be part of the Perl core, but
-# some distros now bundle perl-base and perl-modules separately...)
-package MiniCGI;
-
-sub new {
-    my $class = shift;
-    return bless {}, $class;
-}
-
-sub Vars {
-    my $self = shift;
-    my $pairs;
-    if ($ENV{CONTENT_LENGTH}) {
-        $pairs = do { local $/; <STDIN> };
-    } else {
-        $pairs = $ENV{QUERY_STRING};
-    }
-    my $vars = {};
-    foreach my $kv (split(/&/, $pairs)) {
-        my ($k, $v) = split(/=/, $kv, 2);
-        $vars->{_urldecode($k)} = _urldecode($v);
-    }
-    return $vars;
-}
-
-sub _urldecode {
-    my $v = shift;
-    $v =~ tr/+/ /;
-    $v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
-    return $v;
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/client.go b/third_party/gofrontend/libgo/go/net/http/client.go
deleted file mode 100644
index 7f2fbb4..0000000
--- a/third_party/gofrontend/libgo/go/net/http/client.go
+++ /dev/null
@@ -1,557 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// HTTP client. See RFC 2616.
-//
-// This is the high-level Client interface.
-// The low-level implementation is in transport.go.
-
-package http
-
-import (
-	"encoding/base64"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	"net/url"
-	"strings"
-	"sync"
-	"sync/atomic"
-	"time"
-)
-
-// A Client is an HTTP client. Its zero value (DefaultClient) is a
-// usable client that uses DefaultTransport.
-//
-// The Client's Transport typically has internal state (cached TCP
-// connections), so Clients should be reused instead of created as
-// needed. Clients are safe for concurrent use by multiple goroutines.
-//
-// A Client is higher-level than a RoundTripper (such as Transport)
-// and additionally handles HTTP details such as cookies and
-// redirects.
-type Client struct {
-	// Transport specifies the mechanism by which individual
-	// HTTP requests are made.
-	// If nil, DefaultTransport is used.
-	Transport RoundTripper
-
-	// CheckRedirect specifies the policy for handling redirects.
-	// If CheckRedirect is not nil, the client calls it before
-	// following an HTTP redirect. The arguments req and via are
-	// the upcoming request and the requests made already, oldest
-	// first. If CheckRedirect returns an error, the Client's Get
-	// method returns both the previous Response and
-	// CheckRedirect's error (wrapped in a url.Error) instead of
-	// issuing the Request req.
-	//
-	// If CheckRedirect is nil, the Client uses its default policy,
-	// which is to stop after 10 consecutive requests.
-	CheckRedirect func(req *Request, via []*Request) error
-
-	// Jar specifies the cookie jar.
-	// If Jar is nil, cookies are not sent in requests and ignored
-	// in responses.
-	Jar CookieJar
-
-	// Timeout specifies a time limit for requests made by this
-	// Client. The timeout includes connection time, any
-	// redirects, and reading the response body. The timer remains
-	// running after Get, Head, Post, or Do return and will
-	// interrupt reading of the Response.Body.
-	//
-	// A Timeout of zero means no timeout.
-	//
-	// The Client's Transport must support the CancelRequest
-	// method or Client will return errors when attempting to make
-	// a request with Get, Head, Post, or Do. Client's default
-	// Transport (DefaultTransport) supports CancelRequest.
-	Timeout time.Duration
-}
-
-// DefaultClient is the default Client and is used by Get, Head, and Post.
-var DefaultClient = &Client{}
-
-// RoundTripper is an interface representing the ability to execute a
-// single HTTP transaction, obtaining the Response for a given Request.
-//
-// A RoundTripper must be safe for concurrent use by multiple
-// goroutines.
-type RoundTripper interface {
-	// RoundTrip executes a single HTTP transaction, returning
-	// the Response for the request req.  RoundTrip should not
-	// attempt to interpret the response.  In particular,
-	// RoundTrip must return err == nil if it obtained a response,
-	// regardless of the response's HTTP status code.  A non-nil
-	// err should be reserved for failure to obtain a response.
-	// Similarly, RoundTrip should not attempt to handle
-	// higher-level protocol details such as redirects,
-	// authentication, or cookies.
-	//
-	// RoundTrip should not modify the request, except for
-	// consuming and closing the Body, including on errors. The
-	// request's URL and Header fields are guaranteed to be
-	// initialized.
-	RoundTrip(*Request) (*Response, error)
-}
-
-// Given a string of the form "host", "host:port", or "[ipv6::address]:port",
-// return true if the string includes a port.
-func hasPort(s string) bool { return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") }
-
-// refererForURL returns a referer without any authentication info or
-// an empty string if lastReq scheme is https and newReq scheme is http.
-func refererForURL(lastReq, newReq *url.URL) string {
-	// https://tools.ietf.org/html/rfc7231#section-5.5.2
-	//   "Clients SHOULD NOT include a Referer header field in a
-	//    (non-secure) HTTP request if the referring page was
-	//    transferred with a secure protocol."
-	if lastReq.Scheme == "https" && newReq.Scheme == "http" {
-		return ""
-	}
-	referer := lastReq.String()
-	if lastReq.User != nil {
-		// This is not very efficient, but is the best we can
-		// do without:
-		// - introducing a new method on URL
-		// - creating a race condition
-		// - copying the URL struct manually, which would cause
-		//   maintenance problems down the line
-		auth := lastReq.User.String() + "@"
-		referer = strings.Replace(referer, auth, "", 1)
-	}
-	return referer
-}
-
-// Used in Send to implement io.ReadCloser by bundling together the
-// bufio.Reader through which we read the response, and the underlying
-// network connection.
-type readClose struct {
-	io.Reader
-	io.Closer
-}
-
-func (c *Client) send(req *Request) (*Response, error) {
-	if c.Jar != nil {
-		for _, cookie := range c.Jar.Cookies(req.URL) {
-			req.AddCookie(cookie)
-		}
-	}
-	resp, err := send(req, c.transport())
-	if err != nil {
-		return nil, err
-	}
-	if c.Jar != nil {
-		if rc := resp.Cookies(); len(rc) > 0 {
-			c.Jar.SetCookies(req.URL, rc)
-		}
-	}
-	return resp, err
-}
-
-// Do sends an HTTP request and returns an HTTP response, following
-// policy (e.g. redirects, cookies, auth) as configured on the client.
-//
-// An error is returned if caused by client policy (such as
-// CheckRedirect), or if there was an HTTP protocol error.
-// A non-2xx response doesn't cause an error.
-//
-// When err is nil, resp always contains a non-nil resp.Body.
-//
-// Callers should close resp.Body when done reading from it. If
-// resp.Body is not closed, the Client's underlying RoundTripper
-// (typically Transport) may not be able to re-use a persistent TCP
-// connection to the server for a subsequent "keep-alive" request.
-//
-// The request Body, if non-nil, will be closed by the underlying
-// Transport, even on errors.
-//
-// Generally Get, Post, or PostForm will be used instead of Do.
-func (c *Client) Do(req *Request) (resp *Response, err error) {
-	if req.Method == "GET" || req.Method == "HEAD" {
-		return c.doFollowingRedirects(req, shouldRedirectGet)
-	}
-	if req.Method == "POST" || req.Method == "PUT" {
-		return c.doFollowingRedirects(req, shouldRedirectPost)
-	}
-	return c.send(req)
-}
-
-func (c *Client) transport() RoundTripper {
-	if c.Transport != nil {
-		return c.Transport
-	}
-	return DefaultTransport
-}
-
-// send issues an HTTP request.
-// Caller should close resp.Body when done reading from it.
-func send(req *Request, t RoundTripper) (resp *Response, err error) {
-	if t == nil {
-		req.closeBody()
-		return nil, errors.New("http: no Client.Transport or DefaultTransport")
-	}
-
-	if req.URL == nil {
-		req.closeBody()
-		return nil, errors.New("http: nil Request.URL")
-	}
-
-	if req.RequestURI != "" {
-		req.closeBody()
-		return nil, errors.New("http: Request.RequestURI can't be set in client requests.")
-	}
-
-	// Most the callers of send (Get, Post, et al) don't need
-	// Headers, leaving it uninitialized.  We guarantee to the
-	// Transport that this has been initialized, though.
-	if req.Header == nil {
-		req.Header = make(Header)
-	}
-
-	if u := req.URL.User; u != nil && req.Header.Get("Authorization") == "" {
-		username := u.Username()
-		password, _ := u.Password()
-		req.Header.Set("Authorization", "Basic "+basicAuth(username, password))
-	}
-	resp, err = t.RoundTrip(req)
-	if err != nil {
-		if resp != nil {
-			log.Printf("RoundTripper returned a response & error; ignoring response")
-		}
-		return nil, err
-	}
-	return resp, nil
-}
-
-// See 2 (end of page 4) http://www.ietf.org/rfc/rfc2617.txt
-// "To receive authorization, the client sends the userid and password,
-// separated by a single colon (":") character, within a base64
-// encoded string in the credentials."
-// It is not meant to be urlencoded.
-func basicAuth(username, password string) string {
-	auth := username + ":" + password
-	return base64.StdEncoding.EncodeToString([]byte(auth))
-}
-
-// True if the specified HTTP status code is one for which the Get utility should
-// automatically redirect.
-func shouldRedirectGet(statusCode int) bool {
-	switch statusCode {
-	case StatusMovedPermanently, StatusFound, StatusSeeOther, StatusTemporaryRedirect:
-		return true
-	}
-	return false
-}
-
-// True if the specified HTTP status code is one for which the Post utility should
-// automatically redirect.
-func shouldRedirectPost(statusCode int) bool {
-	switch statusCode {
-	case StatusFound, StatusSeeOther:
-		return true
-	}
-	return false
-}
-
-// Get issues a GET to the specified URL. If the response is one of
-// the following redirect codes, Get follows the redirect, up to a
-// maximum of 10 redirects:
-//
-//    301 (Moved Permanently)
-//    302 (Found)
-//    303 (See Other)
-//    307 (Temporary Redirect)
-//
-// An error is returned if there were too many redirects or if there
-// was an HTTP protocol error. A non-2xx response doesn't cause an
-// error.
-//
-// When err is nil, resp always contains a non-nil resp.Body.
-// Caller should close resp.Body when done reading from it.
-//
-// Get is a wrapper around DefaultClient.Get.
-//
-// To make a request with custom headers, use NewRequest and
-// DefaultClient.Do.
-func Get(url string) (resp *Response, err error) {
-	return DefaultClient.Get(url)
-}
-
-// Get issues a GET to the specified URL. If the response is one of the
-// following redirect codes, Get follows the redirect after calling the
-// Client's CheckRedirect function:
-//
-//    301 (Moved Permanently)
-//    302 (Found)
-//    303 (See Other)
-//    307 (Temporary Redirect)
-//
-// An error is returned if the Client's CheckRedirect function fails
-// or if there was an HTTP protocol error. A non-2xx response doesn't
-// cause an error.
-//
-// When err is nil, resp always contains a non-nil resp.Body.
-// Caller should close resp.Body when done reading from it.
-//
-// To make a request with custom headers, use NewRequest and Client.Do.
-func (c *Client) Get(url string) (resp *Response, err error) {
-	req, err := NewRequest("GET", url, nil)
-	if err != nil {
-		return nil, err
-	}
-	return c.doFollowingRedirects(req, shouldRedirectGet)
-}
-
-func alwaysFalse() bool { return false }
-
-func (c *Client) doFollowingRedirects(ireq *Request, shouldRedirect func(int) bool) (resp *Response, err error) {
-	var base *url.URL
-	redirectChecker := c.CheckRedirect
-	if redirectChecker == nil {
-		redirectChecker = defaultCheckRedirect
-	}
-	var via []*Request
-
-	if ireq.URL == nil {
-		ireq.closeBody()
-		return nil, errors.New("http: nil Request.URL")
-	}
-
-	var reqmu sync.Mutex // guards req
-	req := ireq
-
-	var timer *time.Timer
-	var atomicWasCanceled int32 // atomic bool (1 or 0)
-	var wasCanceled = alwaysFalse
-	if c.Timeout > 0 {
-		wasCanceled = func() bool { return atomic.LoadInt32(&atomicWasCanceled) != 0 }
-		type canceler interface {
-			CancelRequest(*Request)
-		}
-		tr, ok := c.transport().(canceler)
-		if !ok {
-			return nil, fmt.Errorf("net/http: Client Transport of type %T doesn't support CancelRequest; Timeout not supported", c.transport())
-		}
-		timer = time.AfterFunc(c.Timeout, func() {
-			atomic.StoreInt32(&atomicWasCanceled, 1)
-			reqmu.Lock()
-			defer reqmu.Unlock()
-			tr.CancelRequest(req)
-		})
-	}
-
-	urlStr := "" // next relative or absolute URL to fetch (after first request)
-	redirectFailed := false
-	for redirect := 0; ; redirect++ {
-		if redirect != 0 {
-			nreq := new(Request)
-			nreq.Method = ireq.Method
-			if ireq.Method == "POST" || ireq.Method == "PUT" {
-				nreq.Method = "GET"
-			}
-			nreq.Header = make(Header)
-			nreq.URL, err = base.Parse(urlStr)
-			if err != nil {
-				break
-			}
-			if len(via) > 0 {
-				// Add the Referer header.
-				lastReq := via[len(via)-1]
-				if ref := refererForURL(lastReq.URL, nreq.URL); ref != "" {
-					nreq.Header.Set("Referer", ref)
-				}
-
-				err = redirectChecker(nreq, via)
-				if err != nil {
-					redirectFailed = true
-					break
-				}
-			}
-			reqmu.Lock()
-			req = nreq
-			reqmu.Unlock()
-		}
-
-		urlStr = req.URL.String()
-		if resp, err = c.send(req); err != nil {
-			if wasCanceled() {
-				err = &httpError{
-					err:     err.Error() + " (Client.Timeout exceeded while awaiting headers)",
-					timeout: true,
-				}
-			}
-			break
-		}
-
-		if shouldRedirect(resp.StatusCode) {
-			// Read the body if small so underlying TCP connection will be re-used.
-			// No need to check for errors: if it fails, Transport won't reuse it anyway.
-			const maxBodySlurpSize = 2 << 10
-			if resp.ContentLength == -1 || resp.ContentLength <= maxBodySlurpSize {
-				io.CopyN(ioutil.Discard, resp.Body, maxBodySlurpSize)
-			}
-			resp.Body.Close()
-			if urlStr = resp.Header.Get("Location"); urlStr == "" {
-				err = fmt.Errorf("%d response missing Location header", resp.StatusCode)
-				break
-			}
-			base = req.URL
-			via = append(via, req)
-			continue
-		}
-		if timer != nil {
-			resp.Body = &cancelTimerBody{
-				t:              timer,
-				rc:             resp.Body,
-				reqWasCanceled: wasCanceled,
-			}
-		}
-		return resp, nil
-	}
-
-	method := ireq.Method
-	urlErr := &url.Error{
-		Op:  method[0:1] + strings.ToLower(method[1:]),
-		URL: urlStr,
-		Err: err,
-	}
-
-	if redirectFailed {
-		// Special case for Go 1 compatibility: return both the response
-		// and an error if the CheckRedirect function failed.
-		// See https://golang.org/issue/3795
-		return resp, urlErr
-	}
-
-	if resp != nil {
-		resp.Body.Close()
-	}
-	return nil, urlErr
-}
-
-func defaultCheckRedirect(req *Request, via []*Request) error {
-	if len(via) >= 10 {
-		return errors.New("stopped after 10 redirects")
-	}
-	return nil
-}
-
-// Post issues a POST to the specified URL.
-//
-// Caller should close resp.Body when done reading from it.
-//
-// If the provided body is an io.Closer, it is closed after the
-// request.
-//
-// Post is a wrapper around DefaultClient.Post.
-//
-// To set custom headers, use NewRequest and DefaultClient.Do.
-func Post(url string, bodyType string, body io.Reader) (resp *Response, err error) {
-	return DefaultClient.Post(url, bodyType, body)
-}
-
-// Post issues a POST to the specified URL.
-//
-// Caller should close resp.Body when done reading from it.
-//
-// If the provided body is an io.Closer, it is closed after the
-// request.
-//
-// To set custom headers, use NewRequest and Client.Do.
-func (c *Client) Post(url string, bodyType string, body io.Reader) (resp *Response, err error) {
-	req, err := NewRequest("POST", url, body)
-	if err != nil {
-		return nil, err
-	}
-	req.Header.Set("Content-Type", bodyType)
-	return c.doFollowingRedirects(req, shouldRedirectPost)
-}
-
-// PostForm issues a POST to the specified URL, with data's keys and
-// values URL-encoded as the request body.
-//
-// The Content-Type header is set to application/x-www-form-urlencoded.
-// To set other headers, use NewRequest and DefaultClient.Do.
-//
-// When err is nil, resp always contains a non-nil resp.Body.
-// Caller should close resp.Body when done reading from it.
-//
-// PostForm is a wrapper around DefaultClient.PostForm.
-func PostForm(url string, data url.Values) (resp *Response, err error) {
-	return DefaultClient.PostForm(url, data)
-}
-
-// PostForm issues a POST to the specified URL,
-// with data's keys and values URL-encoded as the request body.
-//
-// The Content-Type header is set to application/x-www-form-urlencoded.
-// To set other headers, use NewRequest and DefaultClient.Do.
-//
-// When err is nil, resp always contains a non-nil resp.Body.
-// Caller should close resp.Body when done reading from it.
-func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error) {
-	return c.Post(url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode()))
-}
-
-// Head issues a HEAD to the specified URL.  If the response is one of
-// the following redirect codes, Head follows the redirect, up to a
-// maximum of 10 redirects:
-//
-//    301 (Moved Permanently)
-//    302 (Found)
-//    303 (See Other)
-//    307 (Temporary Redirect)
-//
-// Head is a wrapper around DefaultClient.Head
-func Head(url string) (resp *Response, err error) {
-	return DefaultClient.Head(url)
-}
-
-// Head issues a HEAD to the specified URL.  If the response is one of the
-// following redirect codes, Head follows the redirect after calling the
-// Client's CheckRedirect function:
-//
-//    301 (Moved Permanently)
-//    302 (Found)
-//    303 (See Other)
-//    307 (Temporary Redirect)
-func (c *Client) Head(url string) (resp *Response, err error) {
-	req, err := NewRequest("HEAD", url, nil)
-	if err != nil {
-		return nil, err
-	}
-	return c.doFollowingRedirects(req, shouldRedirectGet)
-}
-
-// cancelTimerBody is an io.ReadCloser that wraps rc with two features:
-// 1) on Read EOF or Close, the timer t is Stopped,
-// 2) On Read failure, if reqWasCanceled is true, the error is wrapped and
-//    marked as net.Error that hit its timeout.
-type cancelTimerBody struct {
-	t              *time.Timer
-	rc             io.ReadCloser
-	reqWasCanceled func() bool
-}
-
-func (b *cancelTimerBody) Read(p []byte) (n int, err error) {
-	n, err = b.rc.Read(p)
-	if err == io.EOF {
-		b.t.Stop()
-	} else if err != nil && b.reqWasCanceled() {
-		return n, &httpError{
-			err:     err.Error() + " (Client.Timeout exceeded while reading body)",
-			timeout: true,
-		}
-	}
-	return
-}
-
-func (b *cancelTimerBody) Close() error {
-	err := b.rc.Close()
-	b.t.Stop()
-	return err
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/client_test.go b/third_party/gofrontend/libgo/go/net/http/client_test.go
deleted file mode 100644
index 7b524d3..0000000
--- a/third_party/gofrontend/libgo/go/net/http/client_test.go
+++ /dev/null
@@ -1,1155 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Tests for client.go
-
-package http_test
-
-import (
-	"bytes"
-	"crypto/tls"
-	"crypto/x509"
-	"encoding/base64"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	"net"
-	. "net/http"
-	"net/http/httptest"
-	"net/url"
-	"reflect"
-	"sort"
-	"strconv"
-	"strings"
-	"sync"
-	"testing"
-	"time"
-)
-
-var robotsTxtHandler = HandlerFunc(func(w ResponseWriter, r *Request) {
-	w.Header().Set("Last-Modified", "sometime")
-	fmt.Fprintf(w, "User-agent: go\nDisallow: /something/")
-})
-
-// pedanticReadAll works like ioutil.ReadAll but additionally
-// verifies that r obeys the documented io.Reader contract.
-func pedanticReadAll(r io.Reader) (b []byte, err error) {
-	var bufa [64]byte
-	buf := bufa[:]
-	for {
-		n, err := r.Read(buf)
-		if n == 0 && err == nil {
-			return nil, fmt.Errorf("Read: n=0 with err=nil")
-		}
-		b = append(b, buf[:n]...)
-		if err == io.EOF {
-			n, err := r.Read(buf)
-			if n != 0 || err != io.EOF {
-				return nil, fmt.Errorf("Read: n=%d err=%#v after EOF", n, err)
-			}
-			return b, nil
-		}
-		if err != nil {
-			return b, err
-		}
-	}
-}
-
-type chanWriter chan string
-
-func (w chanWriter) Write(p []byte) (n int, err error) {
-	w <- string(p)
-	return len(p), nil
-}
-
-func TestClient(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(robotsTxtHandler)
-	defer ts.Close()
-
-	r, err := Get(ts.URL)
-	var b []byte
-	if err == nil {
-		b, err = pedanticReadAll(r.Body)
-		r.Body.Close()
-	}
-	if err != nil {
-		t.Error(err)
-	} else if s := string(b); !strings.HasPrefix(s, "User-agent:") {
-		t.Errorf("Incorrect page body (did not begin with User-agent): %q", s)
-	}
-}
-
-func TestClientHead(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(robotsTxtHandler)
-	defer ts.Close()
-
-	r, err := Head(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if _, ok := r.Header["Last-Modified"]; !ok {
-		t.Error("Last-Modified header not found.")
-	}
-}
-
-type recordingTransport struct {
-	req *Request
-}
-
-func (t *recordingTransport) RoundTrip(req *Request) (resp *Response, err error) {
-	t.req = req
-	return nil, errors.New("dummy impl")
-}
-
-func TestGetRequestFormat(t *testing.T) {
-	defer afterTest(t)
-	tr := &recordingTransport{}
-	client := &Client{Transport: tr}
-	url := "http://dummy.faketld/"
-	client.Get(url) // Note: doesn't hit network
-	if tr.req.Method != "GET" {
-		t.Errorf("expected method %q; got %q", "GET", tr.req.Method)
-	}
-	if tr.req.URL.String() != url {
-		t.Errorf("expected URL %q; got %q", url, tr.req.URL.String())
-	}
-	if tr.req.Header == nil {
-		t.Errorf("expected non-nil request Header")
-	}
-}
-
-func TestPostRequestFormat(t *testing.T) {
-	defer afterTest(t)
-	tr := &recordingTransport{}
-	client := &Client{Transport: tr}
-
-	url := "http://dummy.faketld/"
-	json := `{"key":"value"}`
-	b := strings.NewReader(json)
-	client.Post(url, "application/json", b) // Note: doesn't hit network
-
-	if tr.req.Method != "POST" {
-		t.Errorf("got method %q, want %q", tr.req.Method, "POST")
-	}
-	if tr.req.URL.String() != url {
-		t.Errorf("got URL %q, want %q", tr.req.URL.String(), url)
-	}
-	if tr.req.Header == nil {
-		t.Fatalf("expected non-nil request Header")
-	}
-	if tr.req.Close {
-		t.Error("got Close true, want false")
-	}
-	if g, e := tr.req.ContentLength, int64(len(json)); g != e {
-		t.Errorf("got ContentLength %d, want %d", g, e)
-	}
-}
-
-func TestPostFormRequestFormat(t *testing.T) {
-	defer afterTest(t)
-	tr := &recordingTransport{}
-	client := &Client{Transport: tr}
-
-	urlStr := "http://dummy.faketld/"
-	form := make(url.Values)
-	form.Set("foo", "bar")
-	form.Add("foo", "bar2")
-	form.Set("bar", "baz")
-	client.PostForm(urlStr, form) // Note: doesn't hit network
-
-	if tr.req.Method != "POST" {
-		t.Errorf("got method %q, want %q", tr.req.Method, "POST")
-	}
-	if tr.req.URL.String() != urlStr {
-		t.Errorf("got URL %q, want %q", tr.req.URL.String(), urlStr)
-	}
-	if tr.req.Header == nil {
-		t.Fatalf("expected non-nil request Header")
-	}
-	if g, e := tr.req.Header.Get("Content-Type"), "application/x-www-form-urlencoded"; g != e {
-		t.Errorf("got Content-Type %q, want %q", g, e)
-	}
-	if tr.req.Close {
-		t.Error("got Close true, want false")
-	}
-	// Depending on map iteration, body can be either of these.
-	expectedBody := "foo=bar&foo=bar2&bar=baz"
-	expectedBody1 := "bar=baz&foo=bar&foo=bar2"
-	if g, e := tr.req.ContentLength, int64(len(expectedBody)); g != e {
-		t.Errorf("got ContentLength %d, want %d", g, e)
-	}
-	bodyb, err := ioutil.ReadAll(tr.req.Body)
-	if err != nil {
-		t.Fatalf("ReadAll on req.Body: %v", err)
-	}
-	if g := string(bodyb); g != expectedBody && g != expectedBody1 {
-		t.Errorf("got body %q, want %q or %q", g, expectedBody, expectedBody1)
-	}
-}
-
-func TestClientRedirects(t *testing.T) {
-	defer afterTest(t)
-	var ts *httptest.Server
-	ts = httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		n, _ := strconv.Atoi(r.FormValue("n"))
-		// Test Referer header. (7 is arbitrary position to test at)
-		if n == 7 {
-			if g, e := r.Referer(), ts.URL+"/?n=6"; e != g {
-				t.Errorf("on request ?n=7, expected referer of %q; got %q", e, g)
-			}
-		}
-		if n < 15 {
-			Redirect(w, r, fmt.Sprintf("/?n=%d", n+1), StatusFound)
-			return
-		}
-		fmt.Fprintf(w, "n=%d", n)
-	}))
-	defer ts.Close()
-
-	c := &Client{}
-	_, err := c.Get(ts.URL)
-	if e, g := "Get /?n=10: stopped after 10 redirects", fmt.Sprintf("%v", err); e != g {
-		t.Errorf("with default client Get, expected error %q, got %q", e, g)
-	}
-
-	// HEAD request should also have the ability to follow redirects.
-	_, err = c.Head(ts.URL)
-	if e, g := "Head /?n=10: stopped after 10 redirects", fmt.Sprintf("%v", err); e != g {
-		t.Errorf("with default client Head, expected error %q, got %q", e, g)
-	}
-
-	// Do should also follow redirects.
-	greq, _ := NewRequest("GET", ts.URL, nil)
-	_, err = c.Do(greq)
-	if e, g := "Get /?n=10: stopped after 10 redirects", fmt.Sprintf("%v", err); e != g {
-		t.Errorf("with default client Do, expected error %q, got %q", e, g)
-	}
-
-	var checkErr error
-	var lastVia []*Request
-	c = &Client{CheckRedirect: func(_ *Request, via []*Request) error {
-		lastVia = via
-		return checkErr
-	}}
-	res, err := c.Get(ts.URL)
-	if err != nil {
-		t.Fatalf("Get error: %v", err)
-	}
-	res.Body.Close()
-	finalUrl := res.Request.URL.String()
-	if e, g := "<nil>", fmt.Sprintf("%v", err); e != g {
-		t.Errorf("with custom client, expected error %q, got %q", e, g)
-	}
-	if !strings.HasSuffix(finalUrl, "/?n=15") {
-		t.Errorf("expected final url to end in /?n=15; got url %q", finalUrl)
-	}
-	if e, g := 15, len(lastVia); e != g {
-		t.Errorf("expected lastVia to have contained %d elements; got %d", e, g)
-	}
-
-	checkErr = errors.New("no redirects allowed")
-	res, err = c.Get(ts.URL)
-	if urlError, ok := err.(*url.Error); !ok || urlError.Err != checkErr {
-		t.Errorf("with redirects forbidden, expected a *url.Error with our 'no redirects allowed' error inside; got %#v (%q)", err, err)
-	}
-	if res == nil {
-		t.Fatalf("Expected a non-nil Response on CheckRedirect failure (https://golang.org/issue/3795)")
-	}
-	res.Body.Close()
-	if res.Header.Get("Location") == "" {
-		t.Errorf("no Location header in Response")
-	}
-}
-
-func TestPostRedirects(t *testing.T) {
-	defer afterTest(t)
-	var log struct {
-		sync.Mutex
-		bytes.Buffer
-	}
-	var ts *httptest.Server
-	ts = httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		log.Lock()
-		fmt.Fprintf(&log.Buffer, "%s %s ", r.Method, r.RequestURI)
-		log.Unlock()
-		if v := r.URL.Query().Get("code"); v != "" {
-			code, _ := strconv.Atoi(v)
-			if code/100 == 3 {
-				w.Header().Set("Location", ts.URL)
-			}
-			w.WriteHeader(code)
-		}
-	}))
-	defer ts.Close()
-	tests := []struct {
-		suffix string
-		want   int // response code
-	}{
-		{"/", 200},
-		{"/?code=301", 301},
-		{"/?code=302", 200},
-		{"/?code=303", 200},
-		{"/?code=404", 404},
-	}
-	for _, tt := range tests {
-		res, err := Post(ts.URL+tt.suffix, "text/plain", strings.NewReader("Some content"))
-		if err != nil {
-			t.Fatal(err)
-		}
-		if res.StatusCode != tt.want {
-			t.Errorf("POST %s: status code = %d; want %d", tt.suffix, res.StatusCode, tt.want)
-		}
-	}
-	log.Lock()
-	got := log.String()
-	log.Unlock()
-	want := "POST / POST /?code=301 POST /?code=302 GET / POST /?code=303 GET / POST /?code=404 "
-	if got != want {
-		t.Errorf("Log differs.\n Got: %q\nWant: %q", got, want)
-	}
-}
-
-var expectedCookies = []*Cookie{
-	{Name: "ChocolateChip", Value: "tasty"},
-	{Name: "First", Value: "Hit"},
-	{Name: "Second", Value: "Hit"},
-}
-
-var echoCookiesRedirectHandler = HandlerFunc(func(w ResponseWriter, r *Request) {
-	for _, cookie := range r.Cookies() {
-		SetCookie(w, cookie)
-	}
-	if r.URL.Path == "/" {
-		SetCookie(w, expectedCookies[1])
-		Redirect(w, r, "/second", StatusMovedPermanently)
-	} else {
-		SetCookie(w, expectedCookies[2])
-		w.Write([]byte("hello"))
-	}
-})
-
-func TestClientSendsCookieFromJar(t *testing.T) {
-	defer afterTest(t)
-	tr := &recordingTransport{}
-	client := &Client{Transport: tr}
-	client.Jar = &TestJar{perURL: make(map[string][]*Cookie)}
-	us := "http://dummy.faketld/"
-	u, _ := url.Parse(us)
-	client.Jar.SetCookies(u, expectedCookies)
-
-	client.Get(us) // Note: doesn't hit network
-	matchReturnedCookies(t, expectedCookies, tr.req.Cookies())
-
-	client.Head(us) // Note: doesn't hit network
-	matchReturnedCookies(t, expectedCookies, tr.req.Cookies())
-
-	client.Post(us, "text/plain", strings.NewReader("body")) // Note: doesn't hit network
-	matchReturnedCookies(t, expectedCookies, tr.req.Cookies())
-
-	client.PostForm(us, url.Values{}) // Note: doesn't hit network
-	matchReturnedCookies(t, expectedCookies, tr.req.Cookies())
-
-	req, _ := NewRequest("GET", us, nil)
-	client.Do(req) // Note: doesn't hit network
-	matchReturnedCookies(t, expectedCookies, tr.req.Cookies())
-
-	req, _ = NewRequest("POST", us, nil)
-	client.Do(req) // Note: doesn't hit network
-	matchReturnedCookies(t, expectedCookies, tr.req.Cookies())
-}
-
-// Just enough correctness for our redirect tests. Uses the URL.Host as the
-// scope of all cookies.
-type TestJar struct {
-	m      sync.Mutex
-	perURL map[string][]*Cookie
-}
-
-func (j *TestJar) SetCookies(u *url.URL, cookies []*Cookie) {
-	j.m.Lock()
-	defer j.m.Unlock()
-	if j.perURL == nil {
-		j.perURL = make(map[string][]*Cookie)
-	}
-	j.perURL[u.Host] = cookies
-}
-
-func (j *TestJar) Cookies(u *url.URL) []*Cookie {
-	j.m.Lock()
-	defer j.m.Unlock()
-	return j.perURL[u.Host]
-}
-
-func TestRedirectCookiesJar(t *testing.T) {
-	defer afterTest(t)
-	var ts *httptest.Server
-	ts = httptest.NewServer(echoCookiesRedirectHandler)
-	defer ts.Close()
-	c := &Client{
-		Jar: new(TestJar),
-	}
-	u, _ := url.Parse(ts.URL)
-	c.Jar.SetCookies(u, []*Cookie{expectedCookies[0]})
-	resp, err := c.Get(ts.URL)
-	if err != nil {
-		t.Fatalf("Get: %v", err)
-	}
-	resp.Body.Close()
-	matchReturnedCookies(t, expectedCookies, resp.Cookies())
-}
-
-func matchReturnedCookies(t *testing.T, expected, given []*Cookie) {
-	if len(given) != len(expected) {
-		t.Logf("Received cookies: %v", given)
-		t.Errorf("Expected %d cookies, got %d", len(expected), len(given))
-	}
-	for _, ec := range expected {
-		foundC := false
-		for _, c := range given {
-			if ec.Name == c.Name && ec.Value == c.Value {
-				foundC = true
-				break
-			}
-		}
-		if !foundC {
-			t.Errorf("Missing cookie %v", ec)
-		}
-	}
-}
-
-func TestJarCalls(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		pathSuffix := r.RequestURI[1:]
-		if r.RequestURI == "/nosetcookie" {
-			return // don't set cookies for this path
-		}
-		SetCookie(w, &Cookie{Name: "name" + pathSuffix, Value: "val" + pathSuffix})
-		if r.RequestURI == "/" {
-			Redirect(w, r, "http://secondhost.fake/secondpath", 302)
-		}
-	}))
-	defer ts.Close()
-	jar := new(RecordingJar)
-	c := &Client{
-		Jar: jar,
-		Transport: &Transport{
-			Dial: func(_ string, _ string) (net.Conn, error) {
-				return net.Dial("tcp", ts.Listener.Addr().String())
-			},
-		},
-	}
-	_, err := c.Get("http://firsthost.fake/")
-	if err != nil {
-		t.Fatal(err)
-	}
-	_, err = c.Get("http://firsthost.fake/nosetcookie")
-	if err != nil {
-		t.Fatal(err)
-	}
-	got := jar.log.String()
-	want := `Cookies("http://firsthost.fake/")
-SetCookie("http://firsthost.fake/", [name=val])
-Cookies("http://secondhost.fake/secondpath")
-SetCookie("http://secondhost.fake/secondpath", [namesecondpath=valsecondpath])
-Cookies("http://firsthost.fake/nosetcookie")
-`
-	if got != want {
-		t.Errorf("Got Jar calls:\n%s\nWant:\n%s", got, want)
-	}
-}
-
-// RecordingJar keeps a log of calls made to it, without
-// tracking any cookies.
-type RecordingJar struct {
-	mu  sync.Mutex
-	log bytes.Buffer
-}
-
-func (j *RecordingJar) SetCookies(u *url.URL, cookies []*Cookie) {
-	j.logf("SetCookie(%q, %v)\n", u, cookies)
-}
-
-func (j *RecordingJar) Cookies(u *url.URL) []*Cookie {
-	j.logf("Cookies(%q)\n", u)
-	return nil
-}
-
-func (j *RecordingJar) logf(format string, args ...interface{}) {
-	j.mu.Lock()
-	defer j.mu.Unlock()
-	fmt.Fprintf(&j.log, format, args...)
-}
-
-func TestStreamingGet(t *testing.T) {
-	defer afterTest(t)
-	say := make(chan string)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.(Flusher).Flush()
-		for str := range say {
-			w.Write([]byte(str))
-			w.(Flusher).Flush()
-		}
-	}))
-	defer ts.Close()
-
-	c := &Client{}
-	res, err := c.Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	var buf [10]byte
-	for _, str := range []string{"i", "am", "also", "known", "as", "comet"} {
-		say <- str
-		n, err := io.ReadFull(res.Body, buf[0:len(str)])
-		if err != nil {
-			t.Fatalf("ReadFull on %q: %v", str, err)
-		}
-		if n != len(str) {
-			t.Fatalf("Receiving %q, only read %d bytes", str, n)
-		}
-		got := string(buf[0:n])
-		if got != str {
-			t.Fatalf("Expected %q, got %q", str, got)
-		}
-	}
-	close(say)
-	_, err = io.ReadFull(res.Body, buf[0:1])
-	if err != io.EOF {
-		t.Fatalf("at end expected EOF, got %v", err)
-	}
-}
-
-type writeCountingConn struct {
-	net.Conn
-	count *int
-}
-
-func (c *writeCountingConn) Write(p []byte) (int, error) {
-	*c.count++
-	return c.Conn.Write(p)
-}
-
-// TestClientWrites verifies that client requests are buffered and we
-// don't send a TCP packet per line of the http request + body.
-func TestClientWrites(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-	}))
-	defer ts.Close()
-
-	writes := 0
-	dialer := func(netz string, addr string) (net.Conn, error) {
-		c, err := net.Dial(netz, addr)
-		if err == nil {
-			c = &writeCountingConn{c, &writes}
-		}
-		return c, err
-	}
-	c := &Client{Transport: &Transport{Dial: dialer}}
-
-	_, err := c.Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if writes != 1 {
-		t.Errorf("Get request did %d Write calls, want 1", writes)
-	}
-
-	writes = 0
-	_, err = c.PostForm(ts.URL, url.Values{"foo": {"bar"}})
-	if err != nil {
-		t.Fatal(err)
-	}
-	if writes != 1 {
-		t.Errorf("Post request did %d Write calls, want 1", writes)
-	}
-}
-
-func TestClientInsecureTransport(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Write([]byte("Hello"))
-	}))
-	errc := make(chanWriter, 10) // but only expecting 1
-	ts.Config.ErrorLog = log.New(errc, "", 0)
-	defer ts.Close()
-
-	// TODO(bradfitz): add tests for skipping hostname checks too?
-	// would require a new cert for testing, and probably
-	// redundant with these tests.
-	for _, insecure := range []bool{true, false} {
-		tr := &Transport{
-			TLSClientConfig: &tls.Config{
-				InsecureSkipVerify: insecure,
-			},
-		}
-		defer tr.CloseIdleConnections()
-		c := &Client{Transport: tr}
-		res, err := c.Get(ts.URL)
-		if (err == nil) != insecure {
-			t.Errorf("insecure=%v: got unexpected err=%v", insecure, err)
-		}
-		if res != nil {
-			res.Body.Close()
-		}
-	}
-
-	select {
-	case v := <-errc:
-		if !strings.Contains(v, "TLS handshake error") {
-			t.Errorf("expected an error log message containing 'TLS handshake error'; got %q", v)
-		}
-	case <-time.After(5 * time.Second):
-		t.Errorf("timeout waiting for logged error")
-	}
-
-}
-
-func TestClientErrorWithRequestURI(t *testing.T) {
-	defer afterTest(t)
-	req, _ := NewRequest("GET", "http://localhost:1234/", nil)
-	req.RequestURI = "/this/field/is/illegal/and/should/error/"
-	_, err := DefaultClient.Do(req)
-	if err == nil {
-		t.Fatalf("expected an error")
-	}
-	if !strings.Contains(err.Error(), "RequestURI") {
-		t.Errorf("wanted error mentioning RequestURI; got error: %v", err)
-	}
-}
-
-func newTLSTransport(t *testing.T, ts *httptest.Server) *Transport {
-	certs := x509.NewCertPool()
-	for _, c := range ts.TLS.Certificates {
-		roots, err := x509.ParseCertificates(c.Certificate[len(c.Certificate)-1])
-		if err != nil {
-			t.Fatalf("error parsing server's root cert: %v", err)
-		}
-		for _, root := range roots {
-			certs.AddCert(root)
-		}
-	}
-	return &Transport{
-		TLSClientConfig: &tls.Config{RootCAs: certs},
-	}
-}
-
-func TestClientWithCorrectTLSServerName(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		if r.TLS.ServerName != "127.0.0.1" {
-			t.Errorf("expected client to set ServerName 127.0.0.1, got: %q", r.TLS.ServerName)
-		}
-	}))
-	defer ts.Close()
-
-	c := &Client{Transport: newTLSTransport(t, ts)}
-	if _, err := c.Get(ts.URL); err != nil {
-		t.Fatalf("expected successful TLS connection, got error: %v", err)
-	}
-}
-
-func TestClientWithIncorrectTLSServerName(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
-	defer ts.Close()
-	errc := make(chanWriter, 10) // but only expecting 1
-	ts.Config.ErrorLog = log.New(errc, "", 0)
-
-	trans := newTLSTransport(t, ts)
-	trans.TLSClientConfig.ServerName = "badserver"
-	c := &Client{Transport: trans}
-	_, err := c.Get(ts.URL)
-	if err == nil {
-		t.Fatalf("expected an error")
-	}
-	if !strings.Contains(err.Error(), "127.0.0.1") || !strings.Contains(err.Error(), "badserver") {
-		t.Errorf("wanted error mentioning 127.0.0.1 and badserver; got error: %v", err)
-	}
-	select {
-	case v := <-errc:
-		if !strings.Contains(v, "TLS handshake error") {
-			t.Errorf("expected an error log message containing 'TLS handshake error'; got %q", v)
-		}
-	case <-time.After(5 * time.Second):
-		t.Errorf("timeout waiting for logged error")
-	}
-}
-
-// Test for golang.org/issue/5829; the Transport should respect TLSClientConfig.ServerName
-// when not empty.
-//
-// tls.Config.ServerName (non-empty, set to "example.com") takes
-// precedence over "some-other-host.tld" which previously incorrectly
-// took precedence. We don't actually connect to (or even resolve)
-// "some-other-host.tld", though, because of the Transport.Dial hook.
-//
-// The httptest.Server has a cert with "example.com" as its name.
-func TestTransportUsesTLSConfigServerName(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Write([]byte("Hello"))
-	}))
-	defer ts.Close()
-
-	tr := newTLSTransport(t, ts)
-	tr.TLSClientConfig.ServerName = "example.com" // one of httptest's Server cert names
-	tr.Dial = func(netw, addr string) (net.Conn, error) {
-		return net.Dial(netw, ts.Listener.Addr().String())
-	}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
-	res, err := c.Get("https://some-other-host.tld/")
-	if err != nil {
-		t.Fatal(err)
-	}
-	res.Body.Close()
-}
-
-func TestResponseSetsTLSConnectionState(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Write([]byte("Hello"))
-	}))
-	defer ts.Close()
-
-	tr := newTLSTransport(t, ts)
-	tr.TLSClientConfig.CipherSuites = []uint16{tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA}
-	tr.Dial = func(netw, addr string) (net.Conn, error) {
-		return net.Dial(netw, ts.Listener.Addr().String())
-	}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
-	res, err := c.Get("https://example.com/")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer res.Body.Close()
-	if res.TLS == nil {
-		t.Fatal("Response didn't set TLS Connection State.")
-	}
-	if got, want := res.TLS.CipherSuite, tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA; got != want {
-		t.Errorf("TLS Cipher Suite = %d; want %d", got, want)
-	}
-}
-
-// Verify Response.ContentLength is populated. https://golang.org/issue/4126
-func TestClientHeadContentLength(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		if v := r.FormValue("cl"); v != "" {
-			w.Header().Set("Content-Length", v)
-		}
-	}))
-	defer ts.Close()
-	tests := []struct {
-		suffix string
-		want   int64
-	}{
-		{"/?cl=1234", 1234},
-		{"/?cl=0", 0},
-		{"", -1},
-	}
-	for _, tt := range tests {
-		req, _ := NewRequest("HEAD", ts.URL+tt.suffix, nil)
-		res, err := DefaultClient.Do(req)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if res.ContentLength != tt.want {
-			t.Errorf("Content-Length = %d; want %d", res.ContentLength, tt.want)
-		}
-		bs, err := ioutil.ReadAll(res.Body)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if len(bs) != 0 {
-			t.Errorf("Unexpected content: %q", bs)
-		}
-	}
-}
-
-func TestEmptyPasswordAuth(t *testing.T) {
-	defer afterTest(t)
-	gopher := "gopher"
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		auth := r.Header.Get("Authorization")
-		if strings.HasPrefix(auth, "Basic ") {
-			encoded := auth[6:]
-			decoded, err := base64.StdEncoding.DecodeString(encoded)
-			if err != nil {
-				t.Fatal(err)
-			}
-			expected := gopher + ":"
-			s := string(decoded)
-			if expected != s {
-				t.Errorf("Invalid Authorization header. Got %q, wanted %q", s, expected)
-			}
-		} else {
-			t.Errorf("Invalid auth %q", auth)
-		}
-	}))
-	defer ts.Close()
-	c := &Client{}
-	req, err := NewRequest("GET", ts.URL, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	req.URL.User = url.User(gopher)
-	resp, err := c.Do(req)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer resp.Body.Close()
-}
-
-func TestBasicAuth(t *testing.T) {
-	defer afterTest(t)
-	tr := &recordingTransport{}
-	client := &Client{Transport: tr}
-
-	url := "http://My%20User:My%20Pass@dummy.faketld/"
-	expected := "My User:My Pass"
-	client.Get(url)
-
-	if tr.req.Method != "GET" {
-		t.Errorf("got method %q, want %q", tr.req.Method, "GET")
-	}
-	if tr.req.URL.String() != url {
-		t.Errorf("got URL %q, want %q", tr.req.URL.String(), url)
-	}
-	if tr.req.Header == nil {
-		t.Fatalf("expected non-nil request Header")
-	}
-	auth := tr.req.Header.Get("Authorization")
-	if strings.HasPrefix(auth, "Basic ") {
-		encoded := auth[6:]
-		decoded, err := base64.StdEncoding.DecodeString(encoded)
-		if err != nil {
-			t.Fatal(err)
-		}
-		s := string(decoded)
-		if expected != s {
-			t.Errorf("Invalid Authorization header. Got %q, wanted %q", s, expected)
-		}
-	} else {
-		t.Errorf("Invalid auth %q", auth)
-	}
-}
-
-func TestBasicAuthHeadersPreserved(t *testing.T) {
-	defer afterTest(t)
-	tr := &recordingTransport{}
-	client := &Client{Transport: tr}
-
-	// If Authorization header is provided, username in URL should not override it
-	url := "http://My%20User@dummy.faketld/"
-	req, err := NewRequest("GET", url, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	req.SetBasicAuth("My User", "My Pass")
-	expected := "My User:My Pass"
-	client.Do(req)
-
-	if tr.req.Method != "GET" {
-		t.Errorf("got method %q, want %q", tr.req.Method, "GET")
-	}
-	if tr.req.URL.String() != url {
-		t.Errorf("got URL %q, want %q", tr.req.URL.String(), url)
-	}
-	if tr.req.Header == nil {
-		t.Fatalf("expected non-nil request Header")
-	}
-	auth := tr.req.Header.Get("Authorization")
-	if strings.HasPrefix(auth, "Basic ") {
-		encoded := auth[6:]
-		decoded, err := base64.StdEncoding.DecodeString(encoded)
-		if err != nil {
-			t.Fatal(err)
-		}
-		s := string(decoded)
-		if expected != s {
-			t.Errorf("Invalid Authorization header. Got %q, wanted %q", s, expected)
-		}
-	} else {
-		t.Errorf("Invalid auth %q", auth)
-	}
-
-}
-
-func TestClientTimeout(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in short mode")
-	}
-	defer afterTest(t)
-	sawRoot := make(chan bool, 1)
-	sawSlow := make(chan bool, 1)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		if r.URL.Path == "/" {
-			sawRoot <- true
-			Redirect(w, r, "/slow", StatusFound)
-			return
-		}
-		if r.URL.Path == "/slow" {
-			w.Write([]byte("Hello"))
-			w.(Flusher).Flush()
-			sawSlow <- true
-			time.Sleep(2 * time.Second)
-			return
-		}
-	}))
-	defer ts.Close()
-	const timeout = 500 * time.Millisecond
-	c := &Client{
-		Timeout: timeout,
-	}
-
-	res, err := c.Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	select {
-	case <-sawRoot:
-		// good.
-	default:
-		t.Fatal("handler never got / request")
-	}
-
-	select {
-	case <-sawSlow:
-		// good.
-	default:
-		t.Fatal("handler never got /slow request")
-	}
-
-	errc := make(chan error, 1)
-	go func() {
-		_, err := ioutil.ReadAll(res.Body)
-		errc <- err
-		res.Body.Close()
-	}()
-
-	const failTime = timeout * 2
-	select {
-	case err := <-errc:
-		if err == nil {
-			t.Fatal("expected error from ReadAll")
-		}
-		ne, ok := err.(net.Error)
-		if !ok {
-			t.Errorf("error value from ReadAll was %T; expected some net.Error", err)
-		} else if !ne.Timeout() {
-			t.Errorf("net.Error.Timeout = false; want true")
-		}
-		if got := ne.Error(); !strings.Contains(got, "Client.Timeout exceeded") {
-			t.Errorf("error string = %q; missing timeout substring", got)
-		}
-	case <-time.After(failTime):
-		t.Errorf("timeout after %v waiting for timeout of %v", failTime, timeout)
-	}
-}
-
-// Client.Timeout firing before getting to the body
-func TestClientTimeout_Headers(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in short mode")
-	}
-	defer afterTest(t)
-	donec := make(chan bool)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		<-donec
-	}))
-	defer ts.Close()
-	// Note that we use a channel send here and not a close.
-	// The race detector doesn't know that we're waiting for a timeout
-	// and thinks that the waitgroup inside httptest.Server is added to concurrently
-	// with us closing it. If we timed out immediately, we could close the testserver
-	// before we entered the handler. We're not timing out immediately and there's
-	// no way we would be done before we entered the handler, but the race detector
-	// doesn't know this, so synchronize explicitly.
-	defer func() { donec <- true }()
-
-	c := &Client{Timeout: 500 * time.Millisecond}
-
-	_, err := c.Get(ts.URL)
-	if err == nil {
-		t.Fatal("got response from Get; expected error")
-	}
-	ue, ok := err.(*url.Error)
-	if !ok {
-		t.Fatalf("Got error of type %T; want *url.Error", err)
-	}
-	ne, ok := ue.Err.(net.Error)
-	if !ok {
-		t.Fatalf("Got url.Error.Err of type %T; want some net.Error", err)
-	}
-	if !ne.Timeout() {
-		t.Error("net.Error.Timeout = false; want true")
-	}
-	if got := ne.Error(); !strings.Contains(got, "Client.Timeout exceeded") {
-		t.Errorf("error string = %q; missing timeout substring", got)
-	}
-}
-
-func TestClientRedirectEatsBody(t *testing.T) {
-	defer afterTest(t)
-	saw := make(chan string, 2)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		saw <- r.RemoteAddr
-		if r.URL.Path == "/" {
-			Redirect(w, r, "/foo", StatusFound) // which includes a body
-		}
-	}))
-	defer ts.Close()
-
-	res, err := Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	_, err = ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Fatal(err)
-	}
-	res.Body.Close()
-
-	var first string
-	select {
-	case first = <-saw:
-	default:
-		t.Fatal("server didn't see a request")
-	}
-
-	var second string
-	select {
-	case second = <-saw:
-	default:
-		t.Fatal("server didn't see a second request")
-	}
-
-	if first != second {
-		t.Fatal("server saw different client ports before & after the redirect")
-	}
-}
-
-// eofReaderFunc is an io.Reader that runs itself, and then returns io.EOF.
-type eofReaderFunc func()
-
-func (f eofReaderFunc) Read(p []byte) (n int, err error) {
-	f()
-	return 0, io.EOF
-}
-
-func TestClientTrailers(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Connection", "close")
-		w.Header().Set("Trailer", "Server-Trailer-A, Server-Trailer-B")
-		w.Header().Add("Trailer", "Server-Trailer-C")
-
-		var decl []string
-		for k := range r.Trailer {
-			decl = append(decl, k)
-		}
-		sort.Strings(decl)
-
-		slurp, err := ioutil.ReadAll(r.Body)
-		if err != nil {
-			t.Errorf("Server reading request body: %v", err)
-		}
-		if string(slurp) != "foo" {
-			t.Errorf("Server read request body %q; want foo", slurp)
-		}
-		if r.Trailer == nil {
-			io.WriteString(w, "nil Trailer")
-		} else {
-			fmt.Fprintf(w, "decl: %v, vals: %s, %s",
-				decl,
-				r.Trailer.Get("Client-Trailer-A"),
-				r.Trailer.Get("Client-Trailer-B"))
-		}
-
-		// How handlers set Trailers: declare it ahead of time
-		// with the Trailer header, and then mutate the
-		// Header() of those values later, after the response
-		// has been written (we wrote to w above).
-		w.Header().Set("Server-Trailer-A", "valuea")
-		w.Header().Set("Server-Trailer-C", "valuec") // skipping B
-	}))
-	defer ts.Close()
-
-	var req *Request
-	req, _ = NewRequest("POST", ts.URL, io.MultiReader(
-		eofReaderFunc(func() {
-			req.Trailer["Client-Trailer-A"] = []string{"valuea"}
-		}),
-		strings.NewReader("foo"),
-		eofReaderFunc(func() {
-			req.Trailer["Client-Trailer-B"] = []string{"valueb"}
-		}),
-	))
-	req.Trailer = Header{
-		"Client-Trailer-A": nil, //  to be set later
-		"Client-Trailer-B": nil, //  to be set later
-	}
-	req.ContentLength = -1
-	res, err := DefaultClient.Do(req)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err := wantBody(res, err, "decl: [Client-Trailer-A Client-Trailer-B], vals: valuea, valueb"); err != nil {
-		t.Error(err)
-	}
-	want := Header{
-		"Server-Trailer-A": []string{"valuea"},
-		"Server-Trailer-B": nil,
-		"Server-Trailer-C": []string{"valuec"},
-	}
-	if !reflect.DeepEqual(res.Trailer, want) {
-		t.Errorf("Response trailers = %#v; want %#v", res.Trailer, want)
-	}
-}
-
-func TestReferer(t *testing.T) {
-	tests := []struct {
-		lastReq, newReq string // from -> to URLs
-		want            string
-	}{
-		// don't send user:
-		{"http://gopher@test.com", "http://link.com", "http://test.com"},
-		{"https://gopher@test.com", "https://link.com", "https://test.com"},
-
-		// don't send a user and password:
-		{"http://gopher:go@test.com", "http://link.com", "http://test.com"},
-		{"https://gopher:go@test.com", "https://link.com", "https://test.com"},
-
-		// nothing to do:
-		{"http://test.com", "http://link.com", "http://test.com"},
-		{"https://test.com", "https://link.com", "https://test.com"},
-
-		// https to http doesn't send a referer:
-		{"https://test.com", "http://link.com", ""},
-		{"https://gopher:go@test.com", "http://link.com", ""},
-	}
-	for _, tt := range tests {
-		l, err := url.Parse(tt.lastReq)
-		if err != nil {
-			t.Fatal(err)
-		}
-		n, err := url.Parse(tt.newReq)
-		if err != nil {
-			t.Fatal(err)
-		}
-		r := ExportRefererForURL(l, n)
-		if r != tt.want {
-			t.Errorf("refererForURL(%q, %q) = %q; want %q", tt.lastReq, tt.newReq, r, tt.want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/cookie.go b/third_party/gofrontend/libgo/go/net/http/cookie.go
deleted file mode 100644
index 648709d..0000000
--- a/third_party/gofrontend/libgo/go/net/http/cookie.go
+++ /dev/null
@@ -1,373 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"bytes"
-	"fmt"
-	"log"
-	"net"
-	"strconv"
-	"strings"
-	"time"
-)
-
-// A Cookie represents an HTTP cookie as sent in the Set-Cookie header of an
-// HTTP response or the Cookie header of an HTTP request.
-//
-// See http://tools.ietf.org/html/rfc6265 for details.
-type Cookie struct {
-	Name  string
-	Value string
-
-	Path       string    // optional
-	Domain     string    // optional
-	Expires    time.Time // optional
-	RawExpires string    // for reading cookies only
-
-	// MaxAge=0 means no 'Max-Age' attribute specified.
-	// MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
-	// MaxAge>0 means Max-Age attribute present and given in seconds
-	MaxAge   int
-	Secure   bool
-	HttpOnly bool
-	Raw      string
-	Unparsed []string // Raw text of unparsed attribute-value pairs
-}
-
-// readSetCookies parses all "Set-Cookie" values from
-// the header h and returns the successfully parsed Cookies.
-func readSetCookies(h Header) []*Cookie {
-	cookies := []*Cookie{}
-	for _, line := range h["Set-Cookie"] {
-		parts := strings.Split(strings.TrimSpace(line), ";")
-		if len(parts) == 1 && parts[0] == "" {
-			continue
-		}
-		parts[0] = strings.TrimSpace(parts[0])
-		j := strings.Index(parts[0], "=")
-		if j < 0 {
-			continue
-		}
-		name, value := parts[0][:j], parts[0][j+1:]
-		if !isCookieNameValid(name) {
-			continue
-		}
-		value, success := parseCookieValue(value, true)
-		if !success {
-			continue
-		}
-		c := &Cookie{
-			Name:  name,
-			Value: value,
-			Raw:   line,
-		}
-		for i := 1; i < len(parts); i++ {
-			parts[i] = strings.TrimSpace(parts[i])
-			if len(parts[i]) == 0 {
-				continue
-			}
-
-			attr, val := parts[i], ""
-			if j := strings.Index(attr, "="); j >= 0 {
-				attr, val = attr[:j], attr[j+1:]
-			}
-			lowerAttr := strings.ToLower(attr)
-			val, success = parseCookieValue(val, false)
-			if !success {
-				c.Unparsed = append(c.Unparsed, parts[i])
-				continue
-			}
-			switch lowerAttr {
-			case "secure":
-				c.Secure = true
-				continue
-			case "httponly":
-				c.HttpOnly = true
-				continue
-			case "domain":
-				c.Domain = val
-				continue
-			case "max-age":
-				secs, err := strconv.Atoi(val)
-				if err != nil || secs != 0 && val[0] == '0' {
-					break
-				}
-				if secs <= 0 {
-					c.MaxAge = -1
-				} else {
-					c.MaxAge = secs
-				}
-				continue
-			case "expires":
-				c.RawExpires = val
-				exptime, err := time.Parse(time.RFC1123, val)
-				if err != nil {
-					exptime, err = time.Parse("Mon, 02-Jan-2006 15:04:05 MST", val)
-					if err != nil {
-						c.Expires = time.Time{}
-						break
-					}
-				}
-				c.Expires = exptime.UTC()
-				continue
-			case "path":
-				c.Path = val
-				continue
-			}
-			c.Unparsed = append(c.Unparsed, parts[i])
-		}
-		cookies = append(cookies, c)
-	}
-	return cookies
-}
-
-// SetCookie adds a Set-Cookie header to the provided ResponseWriter's headers.
-// The provided cookie must have a valid Name. Invalid cookies may be
-// silently dropped.
-func SetCookie(w ResponseWriter, cookie *Cookie) {
-	if v := cookie.String(); v != "" {
-		w.Header().Add("Set-Cookie", v)
-	}
-}
-
-// String returns the serialization of the cookie for use in a Cookie
-// header (if only Name and Value are set) or a Set-Cookie response
-// header (if other fields are set).
-// If c is nil or c.Name is invalid, the empty string is returned.
-func (c *Cookie) String() string {
-	if c == nil || !isCookieNameValid(c.Name) {
-		return ""
-	}
-	var b bytes.Buffer
-	fmt.Fprintf(&b, "%s=%s", sanitizeCookieName(c.Name), sanitizeCookieValue(c.Value))
-	if len(c.Path) > 0 {
-		fmt.Fprintf(&b, "; Path=%s", sanitizeCookiePath(c.Path))
-	}
-	if len(c.Domain) > 0 {
-		if validCookieDomain(c.Domain) {
-			// A c.Domain containing illegal characters is not
-			// sanitized but simply dropped which turns the cookie
-			// into a host-only cookie. A leading dot is okay
-			// but won't be sent.
-			d := c.Domain
-			if d[0] == '.' {
-				d = d[1:]
-			}
-			fmt.Fprintf(&b, "; Domain=%s", d)
-		} else {
-			log.Printf("net/http: invalid Cookie.Domain %q; dropping domain attribute",
-				c.Domain)
-		}
-	}
-	if c.Expires.Unix() > 0 {
-		fmt.Fprintf(&b, "; Expires=%s", c.Expires.UTC().Format(TimeFormat))
-	}
-	if c.MaxAge > 0 {
-		fmt.Fprintf(&b, "; Max-Age=%d", c.MaxAge)
-	} else if c.MaxAge < 0 {
-		fmt.Fprintf(&b, "; Max-Age=0")
-	}
-	if c.HttpOnly {
-		fmt.Fprintf(&b, "; HttpOnly")
-	}
-	if c.Secure {
-		fmt.Fprintf(&b, "; Secure")
-	}
-	return b.String()
-}
-
-// readCookies parses all "Cookie" values from the header h and
-// returns the successfully parsed Cookies.
-//
-// if filter isn't empty, only cookies of that name are returned
-func readCookies(h Header, filter string) []*Cookie {
-	cookies := []*Cookie{}
-	lines, ok := h["Cookie"]
-	if !ok {
-		return cookies
-	}
-
-	for _, line := range lines {
-		parts := strings.Split(strings.TrimSpace(line), ";")
-		if len(parts) == 1 && parts[0] == "" {
-			continue
-		}
-		// Per-line attributes
-		parsedPairs := 0
-		for i := 0; i < len(parts); i++ {
-			parts[i] = strings.TrimSpace(parts[i])
-			if len(parts[i]) == 0 {
-				continue
-			}
-			name, val := parts[i], ""
-			if j := strings.Index(name, "="); j >= 0 {
-				name, val = name[:j], name[j+1:]
-			}
-			if !isCookieNameValid(name) {
-				continue
-			}
-			if filter != "" && filter != name {
-				continue
-			}
-			val, success := parseCookieValue(val, true)
-			if !success {
-				continue
-			}
-			cookies = append(cookies, &Cookie{Name: name, Value: val})
-			parsedPairs++
-		}
-	}
-	return cookies
-}
-
-// validCookieDomain returns wheter v is a valid cookie domain-value.
-func validCookieDomain(v string) bool {
-	if isCookieDomainName(v) {
-		return true
-	}
-	if net.ParseIP(v) != nil && !strings.Contains(v, ":") {
-		return true
-	}
-	return false
-}
-
-// isCookieDomainName returns whether s is a valid domain name or a valid
-// domain name with a leading dot '.'.  It is almost a direct copy of
-// package net's isDomainName.
-func isCookieDomainName(s string) bool {
-	if len(s) == 0 {
-		return false
-	}
-	if len(s) > 255 {
-		return false
-	}
-
-	if s[0] == '.' {
-		// A cookie a domain attribute may start with a leading dot.
-		s = s[1:]
-	}
-	last := byte('.')
-	ok := false // Ok once we've seen a letter.
-	partlen := 0
-	for i := 0; i < len(s); i++ {
-		c := s[i]
-		switch {
-		default:
-			return false
-		case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z':
-			// No '_' allowed here (in contrast to package net).
-			ok = true
-			partlen++
-		case '0' <= c && c <= '9':
-			// fine
-			partlen++
-		case c == '-':
-			// Byte before dash cannot be dot.
-			if last == '.' {
-				return false
-			}
-			partlen++
-		case c == '.':
-			// Byte before dot cannot be dot, dash.
-			if last == '.' || last == '-' {
-				return false
-			}
-			if partlen > 63 || partlen == 0 {
-				return false
-			}
-			partlen = 0
-		}
-		last = c
-	}
-	if last == '-' || partlen > 63 {
-		return false
-	}
-
-	return ok
-}
-
-var cookieNameSanitizer = strings.NewReplacer("\n", "-", "\r", "-")
-
-func sanitizeCookieName(n string) string {
-	return cookieNameSanitizer.Replace(n)
-}
-
-// http://tools.ietf.org/html/rfc6265#section-4.1.1
-// cookie-value      = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
-// cookie-octet      = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
-//           ; US-ASCII characters excluding CTLs,
-//           ; whitespace DQUOTE, comma, semicolon,
-//           ; and backslash
-// We loosen this as spaces and commas are common in cookie values
-// but we produce a quoted cookie-value in when value starts or ends
-// with a comma or space.
-// See https://golang.org/issue/7243 for the discussion.
-func sanitizeCookieValue(v string) string {
-	v = sanitizeOrWarn("Cookie.Value", validCookieValueByte, v)
-	if len(v) == 0 {
-		return v
-	}
-	if v[0] == ' ' || v[0] == ',' || v[len(v)-1] == ' ' || v[len(v)-1] == ',' {
-		return `"` + v + `"`
-	}
-	return v
-}
-
-func validCookieValueByte(b byte) bool {
-	return 0x20 <= b && b < 0x7f && b != '"' && b != ';' && b != '\\'
-}
-
-// path-av           = "Path=" path-value
-// path-value        = <any CHAR except CTLs or ";">
-func sanitizeCookiePath(v string) string {
-	return sanitizeOrWarn("Cookie.Path", validCookiePathByte, v)
-}
-
-func validCookiePathByte(b byte) bool {
-	return 0x20 <= b && b < 0x7f && b != ';'
-}
-
-func sanitizeOrWarn(fieldName string, valid func(byte) bool, v string) string {
-	ok := true
-	for i := 0; i < len(v); i++ {
-		if valid(v[i]) {
-			continue
-		}
-		log.Printf("net/http: invalid byte %q in %s; dropping invalid bytes", v[i], fieldName)
-		ok = false
-		break
-	}
-	if ok {
-		return v
-	}
-	buf := make([]byte, 0, len(v))
-	for i := 0; i < len(v); i++ {
-		if b := v[i]; valid(b) {
-			buf = append(buf, b)
-		}
-	}
-	return string(buf)
-}
-
-func parseCookieValue(raw string, allowDoubleQuote bool) (string, bool) {
-	// Strip the quotes, if present.
-	if allowDoubleQuote && len(raw) > 1 && raw[0] == '"' && raw[len(raw)-1] == '"' {
-		raw = raw[1 : len(raw)-1]
-	}
-	for i := 0; i < len(raw); i++ {
-		if !validCookieValueByte(raw[i]) {
-			return "", false
-		}
-	}
-	return raw, true
-}
-
-func isCookieNameValid(raw string) bool {
-	if raw == "" {
-		return false
-	}
-	return strings.IndexFunc(raw, isNotToken) < 0
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/cookie_test.go b/third_party/gofrontend/libgo/go/net/http/cookie_test.go
deleted file mode 100644
index d474f31..0000000
--- a/third_party/gofrontend/libgo/go/net/http/cookie_test.go
+++ /dev/null
@@ -1,428 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"bytes"
-	"encoding/json"
-	"fmt"
-	"log"
-	"os"
-	"reflect"
-	"strings"
-	"testing"
-	"time"
-)
-
-var writeSetCookiesTests = []struct {
-	Cookie *Cookie
-	Raw    string
-}{
-	{
-		&Cookie{Name: "cookie-1", Value: "v$1"},
-		"cookie-1=v$1",
-	},
-	{
-		&Cookie{Name: "cookie-2", Value: "two", MaxAge: 3600},
-		"cookie-2=two; Max-Age=3600",
-	},
-	{
-		&Cookie{Name: "cookie-3", Value: "three", Domain: ".example.com"},
-		"cookie-3=three; Domain=example.com",
-	},
-	{
-		&Cookie{Name: "cookie-4", Value: "four", Path: "/restricted/"},
-		"cookie-4=four; Path=/restricted/",
-	},
-	{
-		&Cookie{Name: "cookie-5", Value: "five", Domain: "wrong;bad.abc"},
-		"cookie-5=five",
-	},
-	{
-		&Cookie{Name: "cookie-6", Value: "six", Domain: "bad-.abc"},
-		"cookie-6=six",
-	},
-	{
-		&Cookie{Name: "cookie-7", Value: "seven", Domain: "127.0.0.1"},
-		"cookie-7=seven; Domain=127.0.0.1",
-	},
-	{
-		&Cookie{Name: "cookie-8", Value: "eight", Domain: "::1"},
-		"cookie-8=eight",
-	},
-	{
-		&Cookie{Name: "cookie-9", Value: "expiring", Expires: time.Unix(1257894000, 0)},
-		"cookie-9=expiring; Expires=Tue, 10 Nov 2009 23:00:00 GMT",
-	},
-	// The "special" cookies have values containing commas or spaces which
-	// are disallowed by RFC 6265 but are common in the wild.
-	{
-		&Cookie{Name: "special-1", Value: "a z"},
-		`special-1=a z`,
-	},
-	{
-		&Cookie{Name: "special-2", Value: " z"},
-		`special-2=" z"`,
-	},
-	{
-		&Cookie{Name: "special-3", Value: "a "},
-		`special-3="a "`,
-	},
-	{
-		&Cookie{Name: "special-4", Value: " "},
-		`special-4=" "`,
-	},
-	{
-		&Cookie{Name: "special-5", Value: "a,z"},
-		`special-5=a,z`,
-	},
-	{
-		&Cookie{Name: "special-6", Value: ",z"},
-		`special-6=",z"`,
-	},
-	{
-		&Cookie{Name: "special-7", Value: "a,"},
-		`special-7="a,"`,
-	},
-	{
-		&Cookie{Name: "special-8", Value: ","},
-		`special-8=","`,
-	},
-	{
-		&Cookie{Name: "empty-value", Value: ""},
-		`empty-value=`,
-	},
-	{
-		nil,
-		``,
-	},
-	{
-		&Cookie{Name: ""},
-		``,
-	},
-	{
-		&Cookie{Name: "\t"},
-		``,
-	},
-}
-
-func TestWriteSetCookies(t *testing.T) {
-	defer log.SetOutput(os.Stderr)
-	var logbuf bytes.Buffer
-	log.SetOutput(&logbuf)
-
-	for i, tt := range writeSetCookiesTests {
-		if g, e := tt.Cookie.String(), tt.Raw; g != e {
-			t.Errorf("Test %d, expecting:\n%s\nGot:\n%s\n", i, e, g)
-			continue
-		}
-	}
-
-	if got, sub := logbuf.String(), "dropping domain attribute"; !strings.Contains(got, sub) {
-		t.Errorf("Expected substring %q in log output. Got:\n%s", sub, got)
-	}
-}
-
-type headerOnlyResponseWriter Header
-
-func (ho headerOnlyResponseWriter) Header() Header {
-	return Header(ho)
-}
-
-func (ho headerOnlyResponseWriter) Write([]byte) (int, error) {
-	panic("NOIMPL")
-}
-
-func (ho headerOnlyResponseWriter) WriteHeader(int) {
-	panic("NOIMPL")
-}
-
-func TestSetCookie(t *testing.T) {
-	m := make(Header)
-	SetCookie(headerOnlyResponseWriter(m), &Cookie{Name: "cookie-1", Value: "one", Path: "/restricted/"})
-	SetCookie(headerOnlyResponseWriter(m), &Cookie{Name: "cookie-2", Value: "two", MaxAge: 3600})
-	if l := len(m["Set-Cookie"]); l != 2 {
-		t.Fatalf("expected %d cookies, got %d", 2, l)
-	}
-	if g, e := m["Set-Cookie"][0], "cookie-1=one; Path=/restricted/"; g != e {
-		t.Errorf("cookie #1: want %q, got %q", e, g)
-	}
-	if g, e := m["Set-Cookie"][1], "cookie-2=two; Max-Age=3600"; g != e {
-		t.Errorf("cookie #2: want %q, got %q", e, g)
-	}
-}
-
-var addCookieTests = []struct {
-	Cookies []*Cookie
-	Raw     string
-}{
-	{
-		[]*Cookie{},
-		"",
-	},
-	{
-		[]*Cookie{{Name: "cookie-1", Value: "v$1"}},
-		"cookie-1=v$1",
-	},
-	{
-		[]*Cookie{
-			{Name: "cookie-1", Value: "v$1"},
-			{Name: "cookie-2", Value: "v$2"},
-			{Name: "cookie-3", Value: "v$3"},
-		},
-		"cookie-1=v$1; cookie-2=v$2; cookie-3=v$3",
-	},
-}
-
-func TestAddCookie(t *testing.T) {
-	for i, tt := range addCookieTests {
-		req, _ := NewRequest("GET", "http://example.com/", nil)
-		for _, c := range tt.Cookies {
-			req.AddCookie(c)
-		}
-		if g := req.Header.Get("Cookie"); g != tt.Raw {
-			t.Errorf("Test %d:\nwant: %s\n got: %s\n", i, tt.Raw, g)
-			continue
-		}
-	}
-}
-
-var readSetCookiesTests = []struct {
-	Header  Header
-	Cookies []*Cookie
-}{
-	{
-		Header{"Set-Cookie": {"Cookie-1=v$1"}},
-		[]*Cookie{{Name: "Cookie-1", Value: "v$1", Raw: "Cookie-1=v$1"}},
-	},
-	{
-		Header{"Set-Cookie": {"NID=99=YsDT5i3E-CXax-; expires=Wed, 23-Nov-2011 01:05:03 GMT; path=/; domain=.google.ch; HttpOnly"}},
-		[]*Cookie{{
-			Name:       "NID",
-			Value:      "99=YsDT5i3E-CXax-",
-			Path:       "/",
-			Domain:     ".google.ch",
-			HttpOnly:   true,
-			Expires:    time.Date(2011, 11, 23, 1, 5, 3, 0, time.UTC),
-			RawExpires: "Wed, 23-Nov-2011 01:05:03 GMT",
-			Raw:        "NID=99=YsDT5i3E-CXax-; expires=Wed, 23-Nov-2011 01:05:03 GMT; path=/; domain=.google.ch; HttpOnly",
-		}},
-	},
-	{
-		Header{"Set-Cookie": {".ASPXAUTH=7E3AA; expires=Wed, 07-Mar-2012 14:25:06 GMT; path=/; HttpOnly"}},
-		[]*Cookie{{
-			Name:       ".ASPXAUTH",
-			Value:      "7E3AA",
-			Path:       "/",
-			Expires:    time.Date(2012, 3, 7, 14, 25, 6, 0, time.UTC),
-			RawExpires: "Wed, 07-Mar-2012 14:25:06 GMT",
-			HttpOnly:   true,
-			Raw:        ".ASPXAUTH=7E3AA; expires=Wed, 07-Mar-2012 14:25:06 GMT; path=/; HttpOnly",
-		}},
-	},
-	{
-		Header{"Set-Cookie": {"ASP.NET_SessionId=foo; path=/; HttpOnly"}},
-		[]*Cookie{{
-			Name:     "ASP.NET_SessionId",
-			Value:    "foo",
-			Path:     "/",
-			HttpOnly: true,
-			Raw:      "ASP.NET_SessionId=foo; path=/; HttpOnly",
-		}},
-	},
-	// Make sure we can properly read back the Set-Cookie headers we create
-	// for values containing spaces or commas:
-	{
-		Header{"Set-Cookie": {`special-1=a z`}},
-		[]*Cookie{{Name: "special-1", Value: "a z", Raw: `special-1=a z`}},
-	},
-	{
-		Header{"Set-Cookie": {`special-2=" z"`}},
-		[]*Cookie{{Name: "special-2", Value: " z", Raw: `special-2=" z"`}},
-	},
-	{
-		Header{"Set-Cookie": {`special-3="a "`}},
-		[]*Cookie{{Name: "special-3", Value: "a ", Raw: `special-3="a "`}},
-	},
-	{
-		Header{"Set-Cookie": {`special-4=" "`}},
-		[]*Cookie{{Name: "special-4", Value: " ", Raw: `special-4=" "`}},
-	},
-	{
-		Header{"Set-Cookie": {`special-5=a,z`}},
-		[]*Cookie{{Name: "special-5", Value: "a,z", Raw: `special-5=a,z`}},
-	},
-	{
-		Header{"Set-Cookie": {`special-6=",z"`}},
-		[]*Cookie{{Name: "special-6", Value: ",z", Raw: `special-6=",z"`}},
-	},
-	{
-		Header{"Set-Cookie": {`special-7=a,`}},
-		[]*Cookie{{Name: "special-7", Value: "a,", Raw: `special-7=a,`}},
-	},
-	{
-		Header{"Set-Cookie": {`special-8=","`}},
-		[]*Cookie{{Name: "special-8", Value: ",", Raw: `special-8=","`}},
-	},
-
-	// TODO(bradfitz): users have reported seeing this in the
-	// wild, but do browsers handle it? RFC 6265 just says "don't
-	// do that" (section 3) and then never mentions header folding
-	// again.
-	// Header{"Set-Cookie": {"ASP.NET_SessionId=foo; path=/; HttpOnly, .ASPXAUTH=7E3AA; expires=Wed, 07-Mar-2012 14:25:06 GMT; path=/; HttpOnly"}},
-}
-
-func toJSON(v interface{}) string {
-	b, err := json.Marshal(v)
-	if err != nil {
-		return fmt.Sprintf("%#v", v)
-	}
-	return string(b)
-}
-
-func TestReadSetCookies(t *testing.T) {
-	for i, tt := range readSetCookiesTests {
-		for n := 0; n < 2; n++ { // to verify readSetCookies doesn't mutate its input
-			c := readSetCookies(tt.Header)
-			if !reflect.DeepEqual(c, tt.Cookies) {
-				t.Errorf("#%d readSetCookies: have\n%s\nwant\n%s\n", i, toJSON(c), toJSON(tt.Cookies))
-				continue
-			}
-		}
-	}
-}
-
-var readCookiesTests = []struct {
-	Header  Header
-	Filter  string
-	Cookies []*Cookie
-}{
-	{
-		Header{"Cookie": {"Cookie-1=v$1", "c2=v2"}},
-		"",
-		[]*Cookie{
-			{Name: "Cookie-1", Value: "v$1"},
-			{Name: "c2", Value: "v2"},
-		},
-	},
-	{
-		Header{"Cookie": {"Cookie-1=v$1", "c2=v2"}},
-		"c2",
-		[]*Cookie{
-			{Name: "c2", Value: "v2"},
-		},
-	},
-	{
-		Header{"Cookie": {"Cookie-1=v$1; c2=v2"}},
-		"",
-		[]*Cookie{
-			{Name: "Cookie-1", Value: "v$1"},
-			{Name: "c2", Value: "v2"},
-		},
-	},
-	{
-		Header{"Cookie": {"Cookie-1=v$1; c2=v2"}},
-		"c2",
-		[]*Cookie{
-			{Name: "c2", Value: "v2"},
-		},
-	},
-	{
-		Header{"Cookie": {`Cookie-1="v$1"; c2="v2"`}},
-		"",
-		[]*Cookie{
-			{Name: "Cookie-1", Value: "v$1"},
-			{Name: "c2", Value: "v2"},
-		},
-	},
-}
-
-func TestReadCookies(t *testing.T) {
-	for i, tt := range readCookiesTests {
-		for n := 0; n < 2; n++ { // to verify readCookies doesn't mutate its input
-			c := readCookies(tt.Header, tt.Filter)
-			if !reflect.DeepEqual(c, tt.Cookies) {
-				t.Errorf("#%d readCookies:\nhave: %s\nwant: %s\n", i, toJSON(c), toJSON(tt.Cookies))
-				continue
-			}
-		}
-	}
-}
-
-func TestSetCookieDoubleQuotes(t *testing.T) {
-	res := &Response{Header: Header{}}
-	res.Header.Add("Set-Cookie", `quoted0=none; max-age=30`)
-	res.Header.Add("Set-Cookie", `quoted1="cookieValue"; max-age=31`)
-	res.Header.Add("Set-Cookie", `quoted2=cookieAV; max-age="32"`)
-	res.Header.Add("Set-Cookie", `quoted3="both"; max-age="33"`)
-	got := res.Cookies()
-	want := []*Cookie{
-		{Name: "quoted0", Value: "none", MaxAge: 30},
-		{Name: "quoted1", Value: "cookieValue", MaxAge: 31},
-		{Name: "quoted2", Value: "cookieAV"},
-		{Name: "quoted3", Value: "both"},
-	}
-	if len(got) != len(want) {
-		t.Fatalf("got %d cookies, want %d", len(got), len(want))
-	}
-	for i, w := range want {
-		g := got[i]
-		if g.Name != w.Name || g.Value != w.Value || g.MaxAge != w.MaxAge {
-			t.Errorf("cookie #%d:\ngot  %v\nwant %v", i, g, w)
-		}
-	}
-}
-
-func TestCookieSanitizeValue(t *testing.T) {
-	defer log.SetOutput(os.Stderr)
-	var logbuf bytes.Buffer
-	log.SetOutput(&logbuf)
-
-	tests := []struct {
-		in, want string
-	}{
-		{"foo", "foo"},
-		{"foo;bar", "foobar"},
-		{"foo\\bar", "foobar"},
-		{"foo\"bar", "foobar"},
-		{"\x00\x7e\x7f\x80", "\x7e"},
-		{`"withquotes"`, "withquotes"},
-		{"a z", "a z"},
-		{" z", `" z"`},
-		{"a ", `"a "`},
-	}
-	for _, tt := range tests {
-		if got := sanitizeCookieValue(tt.in); got != tt.want {
-			t.Errorf("sanitizeCookieValue(%q) = %q; want %q", tt.in, got, tt.want)
-		}
-	}
-
-	if got, sub := logbuf.String(), "dropping invalid bytes"; !strings.Contains(got, sub) {
-		t.Errorf("Expected substring %q in log output. Got:\n%s", sub, got)
-	}
-}
-
-func TestCookieSanitizePath(t *testing.T) {
-	defer log.SetOutput(os.Stderr)
-	var logbuf bytes.Buffer
-	log.SetOutput(&logbuf)
-
-	tests := []struct {
-		in, want string
-	}{
-		{"/path", "/path"},
-		{"/path with space/", "/path with space/"},
-		{"/just;no;semicolon\x00orstuff/", "/justnosemicolonorstuff/"},
-	}
-	for _, tt := range tests {
-		if got := sanitizeCookiePath(tt.in); got != tt.want {
-			t.Errorf("sanitizeCookiePath(%q) = %q; want %q", tt.in, got, tt.want)
-		}
-	}
-
-	if got, sub := logbuf.String(), "dropping invalid bytes"; !strings.Contains(got, sub) {
-		t.Errorf("Expected substring %q in log output. Got:\n%s", sub, got)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/cookiejar/jar.go b/third_party/gofrontend/libgo/go/net/http/cookiejar/jar.go
deleted file mode 100644
index 0e0fac9..0000000
--- a/third_party/gofrontend/libgo/go/net/http/cookiejar/jar.go
+++ /dev/null
@@ -1,497 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package cookiejar implements an in-memory RFC 6265-compliant http.CookieJar.
-package cookiejar
-
-import (
-	"errors"
-	"fmt"
-	"net"
-	"net/http"
-	"net/url"
-	"sort"
-	"strings"
-	"sync"
-	"time"
-)
-
-// PublicSuffixList provides the public suffix of a domain. For example:
-//      - the public suffix of "example.com" is "com",
-//      - the public suffix of "foo1.foo2.foo3.co.uk" is "co.uk", and
-//      - the public suffix of "bar.pvt.k12.ma.us" is "pvt.k12.ma.us".
-//
-// Implementations of PublicSuffixList must be safe for concurrent use by
-// multiple goroutines.
-//
-// An implementation that always returns "" is valid and may be useful for
-// testing but it is not secure: it means that the HTTP server for foo.com can
-// set a cookie for bar.com.
-//
-// A public suffix list implementation is in the package
-// golang.org/x/net/publicsuffix.
-type PublicSuffixList interface {
-	// PublicSuffix returns the public suffix of domain.
-	//
-	// TODO: specify which of the caller and callee is responsible for IP
-	// addresses, for leading and trailing dots, for case sensitivity, and
-	// for IDN/Punycode.
-	PublicSuffix(domain string) string
-
-	// String returns a description of the source of this public suffix
-	// list. The description will typically contain something like a time
-	// stamp or version number.
-	String() string
-}
-
-// Options are the options for creating a new Jar.
-type Options struct {
-	// PublicSuffixList is the public suffix list that determines whether
-	// an HTTP server can set a cookie for a domain.
-	//
-	// A nil value is valid and may be useful for testing but it is not
-	// secure: it means that the HTTP server for foo.co.uk can set a cookie
-	// for bar.co.uk.
-	PublicSuffixList PublicSuffixList
-}
-
-// Jar implements the http.CookieJar interface from the net/http package.
-type Jar struct {
-	psList PublicSuffixList
-
-	// mu locks the remaining fields.
-	mu sync.Mutex
-
-	// entries is a set of entries, keyed by their eTLD+1 and subkeyed by
-	// their name/domain/path.
-	entries map[string]map[string]entry
-
-	// nextSeqNum is the next sequence number assigned to a new cookie
-	// created SetCookies.
-	nextSeqNum uint64
-}
-
-// New returns a new cookie jar. A nil *Options is equivalent to a zero
-// Options.
-func New(o *Options) (*Jar, error) {
-	jar := &Jar{
-		entries: make(map[string]map[string]entry),
-	}
-	if o != nil {
-		jar.psList = o.PublicSuffixList
-	}
-	return jar, nil
-}
-
-// entry is the internal representation of a cookie.
-//
-// This struct type is not used outside of this package per se, but the exported
-// fields are those of RFC 6265.
-type entry struct {
-	Name       string
-	Value      string
-	Domain     string
-	Path       string
-	Secure     bool
-	HttpOnly   bool
-	Persistent bool
-	HostOnly   bool
-	Expires    time.Time
-	Creation   time.Time
-	LastAccess time.Time
-
-	// seqNum is a sequence number so that Cookies returns cookies in a
-	// deterministic order, even for cookies that have equal Path length and
-	// equal Creation time. This simplifies testing.
-	seqNum uint64
-}
-
-// Id returns the domain;path;name triple of e as an id.
-func (e *entry) id() string {
-	return fmt.Sprintf("%s;%s;%s", e.Domain, e.Path, e.Name)
-}
-
-// shouldSend determines whether e's cookie qualifies to be included in a
-// request to host/path. It is the caller's responsibility to check if the
-// cookie is expired.
-func (e *entry) shouldSend(https bool, host, path string) bool {
-	return e.domainMatch(host) && e.pathMatch(path) && (https || !e.Secure)
-}
-
-// domainMatch implements "domain-match" of RFC 6265 section 5.1.3.
-func (e *entry) domainMatch(host string) bool {
-	if e.Domain == host {
-		return true
-	}
-	return !e.HostOnly && hasDotSuffix(host, e.Domain)
-}
-
-// pathMatch implements "path-match" according to RFC 6265 section 5.1.4.
-func (e *entry) pathMatch(requestPath string) bool {
-	if requestPath == e.Path {
-		return true
-	}
-	if strings.HasPrefix(requestPath, e.Path) {
-		if e.Path[len(e.Path)-1] == '/' {
-			return true // The "/any/" matches "/any/path" case.
-		} else if requestPath[len(e.Path)] == '/' {
-			return true // The "/any" matches "/any/path" case.
-		}
-	}
-	return false
-}
-
-// hasDotSuffix reports whether s ends in "."+suffix.
-func hasDotSuffix(s, suffix string) bool {
-	return len(s) > len(suffix) && s[len(s)-len(suffix)-1] == '.' && s[len(s)-len(suffix):] == suffix
-}
-
-// byPathLength is a []entry sort.Interface that sorts according to RFC 6265
-// section 5.4 point 2: by longest path and then by earliest creation time.
-type byPathLength []entry
-
-func (s byPathLength) Len() int { return len(s) }
-
-func (s byPathLength) Less(i, j int) bool {
-	if len(s[i].Path) != len(s[j].Path) {
-		return len(s[i].Path) > len(s[j].Path)
-	}
-	if !s[i].Creation.Equal(s[j].Creation) {
-		return s[i].Creation.Before(s[j].Creation)
-	}
-	return s[i].seqNum < s[j].seqNum
-}
-
-func (s byPathLength) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-
-// Cookies implements the Cookies method of the http.CookieJar interface.
-//
-// It returns an empty slice if the URL's scheme is not HTTP or HTTPS.
-func (j *Jar) Cookies(u *url.URL) (cookies []*http.Cookie) {
-	return j.cookies(u, time.Now())
-}
-
-// cookies is like Cookies but takes the current time as a parameter.
-func (j *Jar) cookies(u *url.URL, now time.Time) (cookies []*http.Cookie) {
-	if u.Scheme != "http" && u.Scheme != "https" {
-		return cookies
-	}
-	host, err := canonicalHost(u.Host)
-	if err != nil {
-		return cookies
-	}
-	key := jarKey(host, j.psList)
-
-	j.mu.Lock()
-	defer j.mu.Unlock()
-
-	submap := j.entries[key]
-	if submap == nil {
-		return cookies
-	}
-
-	https := u.Scheme == "https"
-	path := u.Path
-	if path == "" {
-		path = "/"
-	}
-
-	modified := false
-	var selected []entry
-	for id, e := range submap {
-		if e.Persistent && !e.Expires.After(now) {
-			delete(submap, id)
-			modified = true
-			continue
-		}
-		if !e.shouldSend(https, host, path) {
-			continue
-		}
-		e.LastAccess = now
-		submap[id] = e
-		selected = append(selected, e)
-		modified = true
-	}
-	if modified {
-		if len(submap) == 0 {
-			delete(j.entries, key)
-		} else {
-			j.entries[key] = submap
-		}
-	}
-
-	sort.Sort(byPathLength(selected))
-	for _, e := range selected {
-		cookies = append(cookies, &http.Cookie{Name: e.Name, Value: e.Value})
-	}
-
-	return cookies
-}
-
-// SetCookies implements the SetCookies method of the http.CookieJar interface.
-//
-// It does nothing if the URL's scheme is not HTTP or HTTPS.
-func (j *Jar) SetCookies(u *url.URL, cookies []*http.Cookie) {
-	j.setCookies(u, cookies, time.Now())
-}
-
-// setCookies is like SetCookies but takes the current time as parameter.
-func (j *Jar) setCookies(u *url.URL, cookies []*http.Cookie, now time.Time) {
-	if len(cookies) == 0 {
-		return
-	}
-	if u.Scheme != "http" && u.Scheme != "https" {
-		return
-	}
-	host, err := canonicalHost(u.Host)
-	if err != nil {
-		return
-	}
-	key := jarKey(host, j.psList)
-	defPath := defaultPath(u.Path)
-
-	j.mu.Lock()
-	defer j.mu.Unlock()
-
-	submap := j.entries[key]
-
-	modified := false
-	for _, cookie := range cookies {
-		e, remove, err := j.newEntry(cookie, now, defPath, host)
-		if err != nil {
-			continue
-		}
-		id := e.id()
-		if remove {
-			if submap != nil {
-				if _, ok := submap[id]; ok {
-					delete(submap, id)
-					modified = true
-				}
-			}
-			continue
-		}
-		if submap == nil {
-			submap = make(map[string]entry)
-		}
-
-		if old, ok := submap[id]; ok {
-			e.Creation = old.Creation
-			e.seqNum = old.seqNum
-		} else {
-			e.Creation = now
-			e.seqNum = j.nextSeqNum
-			j.nextSeqNum++
-		}
-		e.LastAccess = now
-		submap[id] = e
-		modified = true
-	}
-
-	if modified {
-		if len(submap) == 0 {
-			delete(j.entries, key)
-		} else {
-			j.entries[key] = submap
-		}
-	}
-}
-
-// canonicalHost strips port from host if present and returns the canonicalized
-// host name.
-func canonicalHost(host string) (string, error) {
-	var err error
-	host = strings.ToLower(host)
-	if hasPort(host) {
-		host, _, err = net.SplitHostPort(host)
-		if err != nil {
-			return "", err
-		}
-	}
-	if strings.HasSuffix(host, ".") {
-		// Strip trailing dot from fully qualified domain names.
-		host = host[:len(host)-1]
-	}
-	return toASCII(host)
-}
-
-// hasPort reports whether host contains a port number. host may be a host
-// name, an IPv4 or an IPv6 address.
-func hasPort(host string) bool {
-	colons := strings.Count(host, ":")
-	if colons == 0 {
-		return false
-	}
-	if colons == 1 {
-		return true
-	}
-	return host[0] == '[' && strings.Contains(host, "]:")
-}
-
-// jarKey returns the key to use for a jar.
-func jarKey(host string, psl PublicSuffixList) string {
-	if isIP(host) {
-		return host
-	}
-
-	var i int
-	if psl == nil {
-		i = strings.LastIndex(host, ".")
-		if i == -1 {
-			return host
-		}
-	} else {
-		suffix := psl.PublicSuffix(host)
-		if suffix == host {
-			return host
-		}
-		i = len(host) - len(suffix)
-		if i <= 0 || host[i-1] != '.' {
-			// The provided public suffix list psl is broken.
-			// Storing cookies under host is a safe stopgap.
-			return host
-		}
-	}
-	prevDot := strings.LastIndex(host[:i-1], ".")
-	return host[prevDot+1:]
-}
-
-// isIP reports whether host is an IP address.
-func isIP(host string) bool {
-	return net.ParseIP(host) != nil
-}
-
-// defaultPath returns the directory part of an URL's path according to
-// RFC 6265 section 5.1.4.
-func defaultPath(path string) string {
-	if len(path) == 0 || path[0] != '/' {
-		return "/" // Path is empty or malformed.
-	}
-
-	i := strings.LastIndex(path, "/") // Path starts with "/", so i != -1.
-	if i == 0 {
-		return "/" // Path has the form "/abc".
-	}
-	return path[:i] // Path is either of form "/abc/xyz" or "/abc/xyz/".
-}
-
-// newEntry creates an entry from a http.Cookie c. now is the current time and
-// is compared to c.Expires to determine deletion of c. defPath and host are the
-// default-path and the canonical host name of the URL c was received from.
-//
-// remove records whether the jar should delete this cookie, as it has already
-// expired with respect to now. In this case, e may be incomplete, but it will
-// be valid to call e.id (which depends on e's Name, Domain and Path).
-//
-// A malformed c.Domain will result in an error.
-func (j *Jar) newEntry(c *http.Cookie, now time.Time, defPath, host string) (e entry, remove bool, err error) {
-	e.Name = c.Name
-
-	if c.Path == "" || c.Path[0] != '/' {
-		e.Path = defPath
-	} else {
-		e.Path = c.Path
-	}
-
-	e.Domain, e.HostOnly, err = j.domainAndType(host, c.Domain)
-	if err != nil {
-		return e, false, err
-	}
-
-	// MaxAge takes precedence over Expires.
-	if c.MaxAge < 0 {
-		return e, true, nil
-	} else if c.MaxAge > 0 {
-		e.Expires = now.Add(time.Duration(c.MaxAge) * time.Second)
-		e.Persistent = true
-	} else {
-		if c.Expires.IsZero() {
-			e.Expires = endOfTime
-			e.Persistent = false
-		} else {
-			if !c.Expires.After(now) {
-				return e, true, nil
-			}
-			e.Expires = c.Expires
-			e.Persistent = true
-		}
-	}
-
-	e.Value = c.Value
-	e.Secure = c.Secure
-	e.HttpOnly = c.HttpOnly
-
-	return e, false, nil
-}
-
-var (
-	errIllegalDomain   = errors.New("cookiejar: illegal cookie domain attribute")
-	errMalformedDomain = errors.New("cookiejar: malformed cookie domain attribute")
-	errNoHostname      = errors.New("cookiejar: no host name available (IP only)")
-)
-
-// endOfTime is the time when session (non-persistent) cookies expire.
-// This instant is representable in most date/time formats (not just
-// Go's time.Time) and should be far enough in the future.
-var endOfTime = time.Date(9999, 12, 31, 23, 59, 59, 0, time.UTC)
-
-// domainAndType determines the cookie's domain and hostOnly attribute.
-func (j *Jar) domainAndType(host, domain string) (string, bool, error) {
-	if domain == "" {
-		// No domain attribute in the SetCookie header indicates a
-		// host cookie.
-		return host, true, nil
-	}
-
-	if isIP(host) {
-		// According to RFC 6265 domain-matching includes not being
-		// an IP address.
-		// TODO: This might be relaxed as in common browsers.
-		return "", false, errNoHostname
-	}
-
-	// From here on: If the cookie is valid, it is a domain cookie (with
-	// the one exception of a public suffix below).
-	// See RFC 6265 section 5.2.3.
-	if domain[0] == '.' {
-		domain = domain[1:]
-	}
-
-	if len(domain) == 0 || domain[0] == '.' {
-		// Received either "Domain=." or "Domain=..some.thing",
-		// both are illegal.
-		return "", false, errMalformedDomain
-	}
-	domain = strings.ToLower(domain)
-
-	if domain[len(domain)-1] == '.' {
-		// We received stuff like "Domain=www.example.com.".
-		// Browsers do handle such stuff (actually differently) but
-		// RFC 6265 seems to be clear here (e.g. section 4.1.2.3) in
-		// requiring a reject.  4.1.2.3 is not normative, but
-		// "Domain Matching" (5.1.3) and "Canonicalized Host Names"
-		// (5.1.2) are.
-		return "", false, errMalformedDomain
-	}
-
-	// See RFC 6265 section 5.3 #5.
-	if j.psList != nil {
-		if ps := j.psList.PublicSuffix(domain); ps != "" && !hasDotSuffix(domain, ps) {
-			if host == domain {
-				// This is the one exception in which a cookie
-				// with a domain attribute is a host cookie.
-				return host, true, nil
-			}
-			return "", false, errIllegalDomain
-		}
-	}
-
-	// The domain must domain-match host: www.mycompany.com cannot
-	// set cookies for .ourcompetitors.com.
-	if host != domain && !hasDotSuffix(host, domain) {
-		return "", false, errIllegalDomain
-	}
-
-	return domain, false, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/cookiejar/jar_test.go b/third_party/gofrontend/libgo/go/net/http/cookiejar/jar_test.go
deleted file mode 100644
index 3aa6015..0000000
--- a/third_party/gofrontend/libgo/go/net/http/cookiejar/jar_test.go
+++ /dev/null
@@ -1,1267 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cookiejar
-
-import (
-	"fmt"
-	"net/http"
-	"net/url"
-	"sort"
-	"strings"
-	"testing"
-	"time"
-)
-
-// tNow is the synthetic current time used as now during testing.
-var tNow = time.Date(2013, 1, 1, 12, 0, 0, 0, time.UTC)
-
-// testPSL implements PublicSuffixList with just two rules: "co.uk"
-// and the default rule "*".
-type testPSL struct{}
-
-func (testPSL) String() string {
-	return "testPSL"
-}
-func (testPSL) PublicSuffix(d string) string {
-	if d == "co.uk" || strings.HasSuffix(d, ".co.uk") {
-		return "co.uk"
-	}
-	return d[strings.LastIndex(d, ".")+1:]
-}
-
-// newTestJar creates an empty Jar with testPSL as the public suffix list.
-func newTestJar() *Jar {
-	jar, err := New(&Options{PublicSuffixList: testPSL{}})
-	if err != nil {
-		panic(err)
-	}
-	return jar
-}
-
-var hasDotSuffixTests = [...]struct {
-	s, suffix string
-}{
-	{"", ""},
-	{"", "."},
-	{"", "x"},
-	{".", ""},
-	{".", "."},
-	{".", ".."},
-	{".", "x"},
-	{".", "x."},
-	{".", ".x"},
-	{".", ".x."},
-	{"x", ""},
-	{"x", "."},
-	{"x", ".."},
-	{"x", "x"},
-	{"x", "x."},
-	{"x", ".x"},
-	{"x", ".x."},
-	{".x", ""},
-	{".x", "."},
-	{".x", ".."},
-	{".x", "x"},
-	{".x", "x."},
-	{".x", ".x"},
-	{".x", ".x."},
-	{"x.", ""},
-	{"x.", "."},
-	{"x.", ".."},
-	{"x.", "x"},
-	{"x.", "x."},
-	{"x.", ".x"},
-	{"x.", ".x."},
-	{"com", ""},
-	{"com", "m"},
-	{"com", "om"},
-	{"com", "com"},
-	{"com", ".com"},
-	{"com", "x.com"},
-	{"com", "xcom"},
-	{"com", "xorg"},
-	{"com", "org"},
-	{"com", "rg"},
-	{"foo.com", ""},
-	{"foo.com", "m"},
-	{"foo.com", "om"},
-	{"foo.com", "com"},
-	{"foo.com", ".com"},
-	{"foo.com", "o.com"},
-	{"foo.com", "oo.com"},
-	{"foo.com", "foo.com"},
-	{"foo.com", ".foo.com"},
-	{"foo.com", "x.foo.com"},
-	{"foo.com", "xfoo.com"},
-	{"foo.com", "xfoo.org"},
-	{"foo.com", "foo.org"},
-	{"foo.com", "oo.org"},
-	{"foo.com", "o.org"},
-	{"foo.com", ".org"},
-	{"foo.com", "org"},
-	{"foo.com", "rg"},
-}
-
-func TestHasDotSuffix(t *testing.T) {
-	for _, tc := range hasDotSuffixTests {
-		got := hasDotSuffix(tc.s, tc.suffix)
-		want := strings.HasSuffix(tc.s, "."+tc.suffix)
-		if got != want {
-			t.Errorf("s=%q, suffix=%q: got %v, want %v", tc.s, tc.suffix, got, want)
-		}
-	}
-}
-
-var canonicalHostTests = map[string]string{
-	"www.example.com":         "www.example.com",
-	"WWW.EXAMPLE.COM":         "www.example.com",
-	"wWw.eXAmple.CoM":         "www.example.com",
-	"www.example.com:80":      "www.example.com",
-	"192.168.0.10":            "192.168.0.10",
-	"192.168.0.5:8080":        "192.168.0.5",
-	"2001:4860:0:2001::68":    "2001:4860:0:2001::68",
-	"[2001:4860:0:::68]:8080": "2001:4860:0:::68",
-	"www.bücher.de":           "www.xn--bcher-kva.de",
-	"www.example.com.":        "www.example.com",
-	"[bad.unmatched.bracket:": "error",
-}
-
-func TestCanonicalHost(t *testing.T) {
-	for h, want := range canonicalHostTests {
-		got, err := canonicalHost(h)
-		if want == "error" {
-			if err == nil {
-				t.Errorf("%q: got nil error, want non-nil", h)
-			}
-			continue
-		}
-		if err != nil {
-			t.Errorf("%q: %v", h, err)
-			continue
-		}
-		if got != want {
-			t.Errorf("%q: got %q, want %q", h, got, want)
-			continue
-		}
-	}
-}
-
-var hasPortTests = map[string]bool{
-	"www.example.com":      false,
-	"www.example.com:80":   true,
-	"127.0.0.1":            false,
-	"127.0.0.1:8080":       true,
-	"2001:4860:0:2001::68": false,
-	"[2001::0:::68]:80":    true,
-}
-
-func TestHasPort(t *testing.T) {
-	for host, want := range hasPortTests {
-		if got := hasPort(host); got != want {
-			t.Errorf("%q: got %t, want %t", host, got, want)
-		}
-	}
-}
-
-var jarKeyTests = map[string]string{
-	"foo.www.example.com": "example.com",
-	"www.example.com":     "example.com",
-	"example.com":         "example.com",
-	"com":                 "com",
-	"foo.www.bbc.co.uk":   "bbc.co.uk",
-	"www.bbc.co.uk":       "bbc.co.uk",
-	"bbc.co.uk":           "bbc.co.uk",
-	"co.uk":               "co.uk",
-	"uk":                  "uk",
-	"192.168.0.5":         "192.168.0.5",
-}
-
-func TestJarKey(t *testing.T) {
-	for host, want := range jarKeyTests {
-		if got := jarKey(host, testPSL{}); got != want {
-			t.Errorf("%q: got %q, want %q", host, got, want)
-		}
-	}
-}
-
-var jarKeyNilPSLTests = map[string]string{
-	"foo.www.example.com": "example.com",
-	"www.example.com":     "example.com",
-	"example.com":         "example.com",
-	"com":                 "com",
-	"foo.www.bbc.co.uk":   "co.uk",
-	"www.bbc.co.uk":       "co.uk",
-	"bbc.co.uk":           "co.uk",
-	"co.uk":               "co.uk",
-	"uk":                  "uk",
-	"192.168.0.5":         "192.168.0.5",
-}
-
-func TestJarKeyNilPSL(t *testing.T) {
-	for host, want := range jarKeyNilPSLTests {
-		if got := jarKey(host, nil); got != want {
-			t.Errorf("%q: got %q, want %q", host, got, want)
-		}
-	}
-}
-
-var isIPTests = map[string]bool{
-	"127.0.0.1":            true,
-	"1.2.3.4":              true,
-	"2001:4860:0:2001::68": true,
-	"example.com":          false,
-	"1.1.1.300":            false,
-	"www.foo.bar.net":      false,
-	"123.foo.bar.net":      false,
-}
-
-func TestIsIP(t *testing.T) {
-	for host, want := range isIPTests {
-		if got := isIP(host); got != want {
-			t.Errorf("%q: got %t, want %t", host, got, want)
-		}
-	}
-}
-
-var defaultPathTests = map[string]string{
-	"/":           "/",
-	"/abc":        "/",
-	"/abc/":       "/abc",
-	"/abc/xyz":    "/abc",
-	"/abc/xyz/":   "/abc/xyz",
-	"/a/b/c.html": "/a/b",
-	"":            "/",
-	"strange":     "/",
-	"//":          "/",
-	"/a//b":       "/a/",
-	"/a/./b":      "/a/.",
-	"/a/../b":     "/a/..",
-}
-
-func TestDefaultPath(t *testing.T) {
-	for path, want := range defaultPathTests {
-		if got := defaultPath(path); got != want {
-			t.Errorf("%q: got %q, want %q", path, got, want)
-		}
-	}
-}
-
-var domainAndTypeTests = [...]struct {
-	host         string // host Set-Cookie header was received from
-	domain       string // domain attribute in Set-Cookie header
-	wantDomain   string // expected domain of cookie
-	wantHostOnly bool   // expected host-cookie flag
-	wantErr      error  // expected error
-}{
-	{"www.example.com", "", "www.example.com", true, nil},
-	{"127.0.0.1", "", "127.0.0.1", true, nil},
-	{"2001:4860:0:2001::68", "", "2001:4860:0:2001::68", true, nil},
-	{"www.example.com", "example.com", "example.com", false, nil},
-	{"www.example.com", ".example.com", "example.com", false, nil},
-	{"www.example.com", "www.example.com", "www.example.com", false, nil},
-	{"www.example.com", ".www.example.com", "www.example.com", false, nil},
-	{"foo.sso.example.com", "sso.example.com", "sso.example.com", false, nil},
-	{"bar.co.uk", "bar.co.uk", "bar.co.uk", false, nil},
-	{"foo.bar.co.uk", ".bar.co.uk", "bar.co.uk", false, nil},
-	{"127.0.0.1", "127.0.0.1", "", false, errNoHostname},
-	{"2001:4860:0:2001::68", "2001:4860:0:2001::68", "2001:4860:0:2001::68", false, errNoHostname},
-	{"www.example.com", ".", "", false, errMalformedDomain},
-	{"www.example.com", "..", "", false, errMalformedDomain},
-	{"www.example.com", "other.com", "", false, errIllegalDomain},
-	{"www.example.com", "com", "", false, errIllegalDomain},
-	{"www.example.com", ".com", "", false, errIllegalDomain},
-	{"foo.bar.co.uk", ".co.uk", "", false, errIllegalDomain},
-	{"127.www.0.0.1", "127.0.0.1", "", false, errIllegalDomain},
-	{"com", "", "com", true, nil},
-	{"com", "com", "com", true, nil},
-	{"com", ".com", "com", true, nil},
-	{"co.uk", "", "co.uk", true, nil},
-	{"co.uk", "co.uk", "co.uk", true, nil},
-	{"co.uk", ".co.uk", "co.uk", true, nil},
-}
-
-func TestDomainAndType(t *testing.T) {
-	jar := newTestJar()
-	for _, tc := range domainAndTypeTests {
-		domain, hostOnly, err := jar.domainAndType(tc.host, tc.domain)
-		if err != tc.wantErr {
-			t.Errorf("%q/%q: got %q error, want %q",
-				tc.host, tc.domain, err, tc.wantErr)
-			continue
-		}
-		if err != nil {
-			continue
-		}
-		if domain != tc.wantDomain || hostOnly != tc.wantHostOnly {
-			t.Errorf("%q/%q: got %q/%t want %q/%t",
-				tc.host, tc.domain, domain, hostOnly,
-				tc.wantDomain, tc.wantHostOnly)
-		}
-	}
-}
-
-// expiresIn creates an expires attribute delta seconds from tNow.
-func expiresIn(delta int) string {
-	t := tNow.Add(time.Duration(delta) * time.Second)
-	return "expires=" + t.Format(time.RFC1123)
-}
-
-// mustParseURL parses s to an URL and panics on error.
-func mustParseURL(s string) *url.URL {
-	u, err := url.Parse(s)
-	if err != nil || u.Scheme == "" || u.Host == "" {
-		panic(fmt.Sprintf("Unable to parse URL %s.", s))
-	}
-	return u
-}
-
-// jarTest encapsulates the following actions on a jar:
-//   1. Perform SetCookies with fromURL and the cookies from setCookies.
-//      (Done at time tNow + 0 ms.)
-//   2. Check that the entries in the jar matches content.
-//      (Done at time tNow + 1001 ms.)
-//   3. For each query in tests: Check that Cookies with toURL yields the
-//      cookies in want.
-//      (Query n done at tNow + (n+2)*1001 ms.)
-type jarTest struct {
-	description string   // The description of what this test is supposed to test
-	fromURL     string   // The full URL of the request from which Set-Cookie headers where received
-	setCookies  []string // All the cookies received from fromURL
-	content     string   // The whole (non-expired) content of the jar
-	queries     []query  // Queries to test the Jar.Cookies method
-}
-
-// query contains one test of the cookies returned from Jar.Cookies.
-type query struct {
-	toURL string // the URL in the Cookies call
-	want  string // the expected list of cookies (order matters)
-}
-
-// run runs the jarTest.
-func (test jarTest) run(t *testing.T, jar *Jar) {
-	now := tNow
-
-	// Populate jar with cookies.
-	setCookies := make([]*http.Cookie, len(test.setCookies))
-	for i, cs := range test.setCookies {
-		cookies := (&http.Response{Header: http.Header{"Set-Cookie": {cs}}}).Cookies()
-		if len(cookies) != 1 {
-			panic(fmt.Sprintf("Wrong cookie line %q: %#v", cs, cookies))
-		}
-		setCookies[i] = cookies[0]
-	}
-	jar.setCookies(mustParseURL(test.fromURL), setCookies, now)
-	now = now.Add(1001 * time.Millisecond)
-
-	// Serialize non-expired entries in the form "name1=val1 name2=val2".
-	var cs []string
-	for _, submap := range jar.entries {
-		for _, cookie := range submap {
-			if !cookie.Expires.After(now) {
-				continue
-			}
-			cs = append(cs, cookie.Name+"="+cookie.Value)
-		}
-	}
-	sort.Strings(cs)
-	got := strings.Join(cs, " ")
-
-	// Make sure jar content matches our expectations.
-	if got != test.content {
-		t.Errorf("Test %q Content\ngot  %q\nwant %q",
-			test.description, got, test.content)
-	}
-
-	// Test different calls to Cookies.
-	for i, query := range test.queries {
-		now = now.Add(1001 * time.Millisecond)
-		var s []string
-		for _, c := range jar.cookies(mustParseURL(query.toURL), now) {
-			s = append(s, c.Name+"="+c.Value)
-		}
-		if got := strings.Join(s, " "); got != query.want {
-			t.Errorf("Test %q #%d\ngot  %q\nwant %q", test.description, i, got, query.want)
-		}
-	}
-}
-
-// basicsTests contains fundamental tests. Each jarTest has to be performed on
-// a fresh, empty Jar.
-var basicsTests = [...]jarTest{
-	{
-		"Retrieval of a plain host cookie.",
-		"http://www.host.test/",
-		[]string{"A=a"},
-		"A=a",
-		[]query{
-			{"http://www.host.test", "A=a"},
-			{"http://www.host.test/", "A=a"},
-			{"http://www.host.test/some/path", "A=a"},
-			{"https://www.host.test", "A=a"},
-			{"https://www.host.test/", "A=a"},
-			{"https://www.host.test/some/path", "A=a"},
-			{"ftp://www.host.test", ""},
-			{"ftp://www.host.test/", ""},
-			{"ftp://www.host.test/some/path", ""},
-			{"http://www.other.org", ""},
-			{"http://sibling.host.test", ""},
-			{"http://deep.www.host.test", ""},
-		},
-	},
-	{
-		"Secure cookies are not returned to http.",
-		"http://www.host.test/",
-		[]string{"A=a; secure"},
-		"A=a",
-		[]query{
-			{"http://www.host.test", ""},
-			{"http://www.host.test/", ""},
-			{"http://www.host.test/some/path", ""},
-			{"https://www.host.test", "A=a"},
-			{"https://www.host.test/", "A=a"},
-			{"https://www.host.test/some/path", "A=a"},
-		},
-	},
-	{
-		"Explicit path.",
-		"http://www.host.test/",
-		[]string{"A=a; path=/some/path"},
-		"A=a",
-		[]query{
-			{"http://www.host.test", ""},
-			{"http://www.host.test/", ""},
-			{"http://www.host.test/some", ""},
-			{"http://www.host.test/some/", ""},
-			{"http://www.host.test/some/path", "A=a"},
-			{"http://www.host.test/some/paths", ""},
-			{"http://www.host.test/some/path/foo", "A=a"},
-			{"http://www.host.test/some/path/foo/", "A=a"},
-		},
-	},
-	{
-		"Implicit path #1: path is a directory.",
-		"http://www.host.test/some/path/",
-		[]string{"A=a"},
-		"A=a",
-		[]query{
-			{"http://www.host.test", ""},
-			{"http://www.host.test/", ""},
-			{"http://www.host.test/some", ""},
-			{"http://www.host.test/some/", ""},
-			{"http://www.host.test/some/path", "A=a"},
-			{"http://www.host.test/some/paths", ""},
-			{"http://www.host.test/some/path/foo", "A=a"},
-			{"http://www.host.test/some/path/foo/", "A=a"},
-		},
-	},
-	{
-		"Implicit path #2: path is not a directory.",
-		"http://www.host.test/some/path/index.html",
-		[]string{"A=a"},
-		"A=a",
-		[]query{
-			{"http://www.host.test", ""},
-			{"http://www.host.test/", ""},
-			{"http://www.host.test/some", ""},
-			{"http://www.host.test/some/", ""},
-			{"http://www.host.test/some/path", "A=a"},
-			{"http://www.host.test/some/paths", ""},
-			{"http://www.host.test/some/path/foo", "A=a"},
-			{"http://www.host.test/some/path/foo/", "A=a"},
-		},
-	},
-	{
-		"Implicit path #3: no path in URL at all.",
-		"http://www.host.test",
-		[]string{"A=a"},
-		"A=a",
-		[]query{
-			{"http://www.host.test", "A=a"},
-			{"http://www.host.test/", "A=a"},
-			{"http://www.host.test/some/path", "A=a"},
-		},
-	},
-	{
-		"Cookies are sorted by path length.",
-		"http://www.host.test/",
-		[]string{
-			"A=a; path=/foo/bar",
-			"B=b; path=/foo/bar/baz/qux",
-			"C=c; path=/foo/bar/baz",
-			"D=d; path=/foo"},
-		"A=a B=b C=c D=d",
-		[]query{
-			{"http://www.host.test/foo/bar/baz/qux", "B=b C=c A=a D=d"},
-			{"http://www.host.test/foo/bar/baz/", "C=c A=a D=d"},
-			{"http://www.host.test/foo/bar", "A=a D=d"},
-		},
-	},
-	{
-		"Creation time determines sorting on same length paths.",
-		"http://www.host.test/",
-		[]string{
-			"A=a; path=/foo/bar",
-			"X=x; path=/foo/bar",
-			"Y=y; path=/foo/bar/baz/qux",
-			"B=b; path=/foo/bar/baz/qux",
-			"C=c; path=/foo/bar/baz",
-			"W=w; path=/foo/bar/baz",
-			"Z=z; path=/foo",
-			"D=d; path=/foo"},
-		"A=a B=b C=c D=d W=w X=x Y=y Z=z",
-		[]query{
-			{"http://www.host.test/foo/bar/baz/qux", "Y=y B=b C=c W=w A=a X=x Z=z D=d"},
-			{"http://www.host.test/foo/bar/baz/", "C=c W=w A=a X=x Z=z D=d"},
-			{"http://www.host.test/foo/bar", "A=a X=x Z=z D=d"},
-		},
-	},
-	{
-		"Sorting of same-name cookies.",
-		"http://www.host.test/",
-		[]string{
-			"A=1; path=/",
-			"A=2; path=/path",
-			"A=3; path=/quux",
-			"A=4; path=/path/foo",
-			"A=5; domain=.host.test; path=/path",
-			"A=6; domain=.host.test; path=/quux",
-			"A=7; domain=.host.test; path=/path/foo",
-		},
-		"A=1 A=2 A=3 A=4 A=5 A=6 A=7",
-		[]query{
-			{"http://www.host.test/path", "A=2 A=5 A=1"},
-			{"http://www.host.test/path/foo", "A=4 A=7 A=2 A=5 A=1"},
-		},
-	},
-	{
-		"Disallow domain cookie on public suffix.",
-		"http://www.bbc.co.uk",
-		[]string{
-			"a=1",
-			"b=2; domain=co.uk",
-		},
-		"a=1",
-		[]query{{"http://www.bbc.co.uk", "a=1"}},
-	},
-	{
-		"Host cookie on IP.",
-		"http://192.168.0.10",
-		[]string{"a=1"},
-		"a=1",
-		[]query{{"http://192.168.0.10", "a=1"}},
-	},
-	{
-		"Port is ignored #1.",
-		"http://www.host.test/",
-		[]string{"a=1"},
-		"a=1",
-		[]query{
-			{"http://www.host.test", "a=1"},
-			{"http://www.host.test:8080/", "a=1"},
-		},
-	},
-	{
-		"Port is ignored #2.",
-		"http://www.host.test:8080/",
-		[]string{"a=1"},
-		"a=1",
-		[]query{
-			{"http://www.host.test", "a=1"},
-			{"http://www.host.test:8080/", "a=1"},
-			{"http://www.host.test:1234/", "a=1"},
-		},
-	},
-}
-
-func TestBasics(t *testing.T) {
-	for _, test := range basicsTests {
-		jar := newTestJar()
-		test.run(t, jar)
-	}
-}
-
-// updateAndDeleteTests contains jarTests which must be performed on the same
-// Jar.
-var updateAndDeleteTests = [...]jarTest{
-	{
-		"Set initial cookies.",
-		"http://www.host.test",
-		[]string{
-			"a=1",
-			"b=2; secure",
-			"c=3; httponly",
-			"d=4; secure; httponly"},
-		"a=1 b=2 c=3 d=4",
-		[]query{
-			{"http://www.host.test", "a=1 c=3"},
-			{"https://www.host.test", "a=1 b=2 c=3 d=4"},
-		},
-	},
-	{
-		"Update value via http.",
-		"http://www.host.test",
-		[]string{
-			"a=w",
-			"b=x; secure",
-			"c=y; httponly",
-			"d=z; secure; httponly"},
-		"a=w b=x c=y d=z",
-		[]query{
-			{"http://www.host.test", "a=w c=y"},
-			{"https://www.host.test", "a=w b=x c=y d=z"},
-		},
-	},
-	{
-		"Clear Secure flag from a http.",
-		"http://www.host.test/",
-		[]string{
-			"b=xx",
-			"d=zz; httponly"},
-		"a=w b=xx c=y d=zz",
-		[]query{{"http://www.host.test", "a=w b=xx c=y d=zz"}},
-	},
-	{
-		"Delete all.",
-		"http://www.host.test/",
-		[]string{
-			"a=1; max-Age=-1",                    // delete via MaxAge
-			"b=2; " + expiresIn(-10),             // delete via Expires
-			"c=2; max-age=-1; " + expiresIn(-10), // delete via both
-			"d=4; max-age=-1; " + expiresIn(10)}, // MaxAge takes precedence
-		"",
-		[]query{{"http://www.host.test", ""}},
-	},
-	{
-		"Refill #1.",
-		"http://www.host.test",
-		[]string{
-			"A=1",
-			"A=2; path=/foo",
-			"A=3; domain=.host.test",
-			"A=4; path=/foo; domain=.host.test"},
-		"A=1 A=2 A=3 A=4",
-		[]query{{"http://www.host.test/foo", "A=2 A=4 A=1 A=3"}},
-	},
-	{
-		"Refill #2.",
-		"http://www.google.com",
-		[]string{
-			"A=6",
-			"A=7; path=/foo",
-			"A=8; domain=.google.com",
-			"A=9; path=/foo; domain=.google.com"},
-		"A=1 A=2 A=3 A=4 A=6 A=7 A=8 A=9",
-		[]query{
-			{"http://www.host.test/foo", "A=2 A=4 A=1 A=3"},
-			{"http://www.google.com/foo", "A=7 A=9 A=6 A=8"},
-		},
-	},
-	{
-		"Delete A7.",
-		"http://www.google.com",
-		[]string{"A=; path=/foo; max-age=-1"},
-		"A=1 A=2 A=3 A=4 A=6 A=8 A=9",
-		[]query{
-			{"http://www.host.test/foo", "A=2 A=4 A=1 A=3"},
-			{"http://www.google.com/foo", "A=9 A=6 A=8"},
-		},
-	},
-	{
-		"Delete A4.",
-		"http://www.host.test",
-		[]string{"A=; path=/foo; domain=host.test; max-age=-1"},
-		"A=1 A=2 A=3 A=6 A=8 A=9",
-		[]query{
-			{"http://www.host.test/foo", "A=2 A=1 A=3"},
-			{"http://www.google.com/foo", "A=9 A=6 A=8"},
-		},
-	},
-	{
-		"Delete A6.",
-		"http://www.google.com",
-		[]string{"A=; max-age=-1"},
-		"A=1 A=2 A=3 A=8 A=9",
-		[]query{
-			{"http://www.host.test/foo", "A=2 A=1 A=3"},
-			{"http://www.google.com/foo", "A=9 A=8"},
-		},
-	},
-	{
-		"Delete A3.",
-		"http://www.host.test",
-		[]string{"A=; domain=host.test; max-age=-1"},
-		"A=1 A=2 A=8 A=9",
-		[]query{
-			{"http://www.host.test/foo", "A=2 A=1"},
-			{"http://www.google.com/foo", "A=9 A=8"},
-		},
-	},
-	{
-		"No cross-domain delete.",
-		"http://www.host.test",
-		[]string{
-			"A=; domain=google.com; max-age=-1",
-			"A=; path=/foo; domain=google.com; max-age=-1"},
-		"A=1 A=2 A=8 A=9",
-		[]query{
-			{"http://www.host.test/foo", "A=2 A=1"},
-			{"http://www.google.com/foo", "A=9 A=8"},
-		},
-	},
-	{
-		"Delete A8 and A9.",
-		"http://www.google.com",
-		[]string{
-			"A=; domain=google.com; max-age=-1",
-			"A=; path=/foo; domain=google.com; max-age=-1"},
-		"A=1 A=2",
-		[]query{
-			{"http://www.host.test/foo", "A=2 A=1"},
-			{"http://www.google.com/foo", ""},
-		},
-	},
-}
-
-func TestUpdateAndDelete(t *testing.T) {
-	jar := newTestJar()
-	for _, test := range updateAndDeleteTests {
-		test.run(t, jar)
-	}
-}
-
-func TestExpiration(t *testing.T) {
-	jar := newTestJar()
-	jarTest{
-		"Expiration.",
-		"http://www.host.test",
-		[]string{
-			"a=1",
-			"b=2; max-age=3",
-			"c=3; " + expiresIn(3),
-			"d=4; max-age=5",
-			"e=5; " + expiresIn(5),
-			"f=6; max-age=100",
-		},
-		"a=1 b=2 c=3 d=4 e=5 f=6", // executed at t0 + 1001 ms
-		[]query{
-			{"http://www.host.test", "a=1 b=2 c=3 d=4 e=5 f=6"}, // t0 + 2002 ms
-			{"http://www.host.test", "a=1 d=4 e=5 f=6"},         // t0 + 3003 ms
-			{"http://www.host.test", "a=1 d=4 e=5 f=6"},         // t0 + 4004 ms
-			{"http://www.host.test", "a=1 f=6"},                 // t0 + 5005 ms
-			{"http://www.host.test", "a=1 f=6"},                 // t0 + 6006 ms
-		},
-	}.run(t, jar)
-}
-
-//
-// Tests derived from Chromium's cookie_store_unittest.h.
-//
-
-// See http://src.chromium.org/viewvc/chrome/trunk/src/net/cookies/cookie_store_unittest.h?revision=159685&content-type=text/plain
-// Some of the original tests are in a bad condition (e.g.
-// DomainWithTrailingDotTest) or are not RFC 6265 conforming (e.g.
-// TestNonDottedAndTLD #1 and #6) and have not been ported.
-
-// chromiumBasicsTests contains fundamental tests. Each jarTest has to be
-// performed on a fresh, empty Jar.
-var chromiumBasicsTests = [...]jarTest{
-	{
-		"DomainWithTrailingDotTest.",
-		"http://www.google.com/",
-		[]string{
-			"a=1; domain=.www.google.com.",
-			"b=2; domain=.www.google.com.."},
-		"",
-		[]query{
-			{"http://www.google.com", ""},
-		},
-	},
-	{
-		"ValidSubdomainTest #1.",
-		"http://a.b.c.d.com",
-		[]string{
-			"a=1; domain=.a.b.c.d.com",
-			"b=2; domain=.b.c.d.com",
-			"c=3; domain=.c.d.com",
-			"d=4; domain=.d.com"},
-		"a=1 b=2 c=3 d=4",
-		[]query{
-			{"http://a.b.c.d.com", "a=1 b=2 c=3 d=4"},
-			{"http://b.c.d.com", "b=2 c=3 d=4"},
-			{"http://c.d.com", "c=3 d=4"},
-			{"http://d.com", "d=4"},
-		},
-	},
-	{
-		"ValidSubdomainTest #2.",
-		"http://a.b.c.d.com",
-		[]string{
-			"a=1; domain=.a.b.c.d.com",
-			"b=2; domain=.b.c.d.com",
-			"c=3; domain=.c.d.com",
-			"d=4; domain=.d.com",
-			"X=bcd; domain=.b.c.d.com",
-			"X=cd; domain=.c.d.com"},
-		"X=bcd X=cd a=1 b=2 c=3 d=4",
-		[]query{
-			{"http://b.c.d.com", "b=2 c=3 d=4 X=bcd X=cd"},
-			{"http://c.d.com", "c=3 d=4 X=cd"},
-		},
-	},
-	{
-		"InvalidDomainTest #1.",
-		"http://foo.bar.com",
-		[]string{
-			"a=1; domain=.yo.foo.bar.com",
-			"b=2; domain=.foo.com",
-			"c=3; domain=.bar.foo.com",
-			"d=4; domain=.foo.bar.com.net",
-			"e=5; domain=ar.com",
-			"f=6; domain=.",
-			"g=7; domain=/",
-			"h=8; domain=http://foo.bar.com",
-			"i=9; domain=..foo.bar.com",
-			"j=10; domain=..bar.com",
-			"k=11; domain=.foo.bar.com?blah",
-			"l=12; domain=.foo.bar.com/blah",
-			"m=12; domain=.foo.bar.com:80",
-			"n=14; domain=.foo.bar.com:",
-			"o=15; domain=.foo.bar.com#sup",
-		},
-		"", // Jar is empty.
-		[]query{{"http://foo.bar.com", ""}},
-	},
-	{
-		"InvalidDomainTest #2.",
-		"http://foo.com.com",
-		[]string{"a=1; domain=.foo.com.com.com"},
-		"",
-		[]query{{"http://foo.bar.com", ""}},
-	},
-	{
-		"DomainWithoutLeadingDotTest #1.",
-		"http://manage.hosted.filefront.com",
-		[]string{"a=1; domain=filefront.com"},
-		"a=1",
-		[]query{{"http://www.filefront.com", "a=1"}},
-	},
-	{
-		"DomainWithoutLeadingDotTest #2.",
-		"http://www.google.com",
-		[]string{"a=1; domain=www.google.com"},
-		"a=1",
-		[]query{
-			{"http://www.google.com", "a=1"},
-			{"http://sub.www.google.com", "a=1"},
-			{"http://something-else.com", ""},
-		},
-	},
-	{
-		"CaseInsensitiveDomainTest.",
-		"http://www.google.com",
-		[]string{
-			"a=1; domain=.GOOGLE.COM",
-			"b=2; domain=.www.gOOgLE.coM"},
-		"a=1 b=2",
-		[]query{{"http://www.google.com", "a=1 b=2"}},
-	},
-	{
-		"TestIpAddress #1.",
-		"http://1.2.3.4/foo",
-		[]string{"a=1; path=/"},
-		"a=1",
-		[]query{{"http://1.2.3.4/foo", "a=1"}},
-	},
-	{
-		"TestIpAddress #2.",
-		"http://1.2.3.4/foo",
-		[]string{
-			"a=1; domain=.1.2.3.4",
-			"b=2; domain=.3.4"},
-		"",
-		[]query{{"http://1.2.3.4/foo", ""}},
-	},
-	{
-		"TestIpAddress #3.",
-		"http://1.2.3.4/foo",
-		[]string{"a=1; domain=1.2.3.4"},
-		"",
-		[]query{{"http://1.2.3.4/foo", ""}},
-	},
-	{
-		"TestNonDottedAndTLD #2.",
-		"http://com./index.html",
-		[]string{"a=1"},
-		"a=1",
-		[]query{
-			{"http://com./index.html", "a=1"},
-			{"http://no-cookies.com./index.html", ""},
-		},
-	},
-	{
-		"TestNonDottedAndTLD #3.",
-		"http://a.b",
-		[]string{
-			"a=1; domain=.b",
-			"b=2; domain=b"},
-		"",
-		[]query{{"http://bar.foo", ""}},
-	},
-	{
-		"TestNonDottedAndTLD #4.",
-		"http://google.com",
-		[]string{
-			"a=1; domain=.com",
-			"b=2; domain=com"},
-		"",
-		[]query{{"http://google.com", ""}},
-	},
-	{
-		"TestNonDottedAndTLD #5.",
-		"http://google.co.uk",
-		[]string{
-			"a=1; domain=.co.uk",
-			"b=2; domain=.uk"},
-		"",
-		[]query{
-			{"http://google.co.uk", ""},
-			{"http://else.co.com", ""},
-			{"http://else.uk", ""},
-		},
-	},
-	{
-		"TestHostEndsWithDot.",
-		"http://www.google.com",
-		[]string{
-			"a=1",
-			"b=2; domain=.www.google.com."},
-		"a=1",
-		[]query{{"http://www.google.com", "a=1"}},
-	},
-	{
-		"PathTest",
-		"http://www.google.izzle",
-		[]string{"a=1; path=/wee"},
-		"a=1",
-		[]query{
-			{"http://www.google.izzle/wee", "a=1"},
-			{"http://www.google.izzle/wee/", "a=1"},
-			{"http://www.google.izzle/wee/war", "a=1"},
-			{"http://www.google.izzle/wee/war/more/more", "a=1"},
-			{"http://www.google.izzle/weehee", ""},
-			{"http://www.google.izzle/", ""},
-		},
-	},
-}
-
-func TestChromiumBasics(t *testing.T) {
-	for _, test := range chromiumBasicsTests {
-		jar := newTestJar()
-		test.run(t, jar)
-	}
-}
-
-// chromiumDomainTests contains jarTests which must be executed all on the
-// same Jar.
-var chromiumDomainTests = [...]jarTest{
-	{
-		"Fill #1.",
-		"http://www.google.izzle",
-		[]string{"A=B"},
-		"A=B",
-		[]query{{"http://www.google.izzle", "A=B"}},
-	},
-	{
-		"Fill #2.",
-		"http://www.google.izzle",
-		[]string{"C=D; domain=.google.izzle"},
-		"A=B C=D",
-		[]query{{"http://www.google.izzle", "A=B C=D"}},
-	},
-	{
-		"Verify A is a host cookie and not accessible from subdomain.",
-		"http://unused.nil",
-		[]string{},
-		"A=B C=D",
-		[]query{{"http://foo.www.google.izzle", "C=D"}},
-	},
-	{
-		"Verify domain cookies are found on proper domain.",
-		"http://www.google.izzle",
-		[]string{"E=F; domain=.www.google.izzle"},
-		"A=B C=D E=F",
-		[]query{{"http://www.google.izzle", "A=B C=D E=F"}},
-	},
-	{
-		"Leading dots in domain attributes are optional.",
-		"http://www.google.izzle",
-		[]string{"G=H; domain=www.google.izzle"},
-		"A=B C=D E=F G=H",
-		[]query{{"http://www.google.izzle", "A=B C=D E=F G=H"}},
-	},
-	{
-		"Verify domain enforcement works #1.",
-		"http://www.google.izzle",
-		[]string{"K=L; domain=.bar.www.google.izzle"},
-		"A=B C=D E=F G=H",
-		[]query{{"http://bar.www.google.izzle", "C=D E=F G=H"}},
-	},
-	{
-		"Verify domain enforcement works #2.",
-		"http://unused.nil",
-		[]string{},
-		"A=B C=D E=F G=H",
-		[]query{{"http://www.google.izzle", "A=B C=D E=F G=H"}},
-	},
-}
-
-func TestChromiumDomain(t *testing.T) {
-	jar := newTestJar()
-	for _, test := range chromiumDomainTests {
-		test.run(t, jar)
-	}
-
-}
-
-// chromiumDeletionTests must be performed all on the same Jar.
-var chromiumDeletionTests = [...]jarTest{
-	{
-		"Create session cookie a1.",
-		"http://www.google.com",
-		[]string{"a=1"},
-		"a=1",
-		[]query{{"http://www.google.com", "a=1"}},
-	},
-	{
-		"Delete sc a1 via MaxAge.",
-		"http://www.google.com",
-		[]string{"a=1; max-age=-1"},
-		"",
-		[]query{{"http://www.google.com", ""}},
-	},
-	{
-		"Create session cookie b2.",
-		"http://www.google.com",
-		[]string{"b=2"},
-		"b=2",
-		[]query{{"http://www.google.com", "b=2"}},
-	},
-	{
-		"Delete sc b2 via Expires.",
-		"http://www.google.com",
-		[]string{"b=2; " + expiresIn(-10)},
-		"",
-		[]query{{"http://www.google.com", ""}},
-	},
-	{
-		"Create persistent cookie c3.",
-		"http://www.google.com",
-		[]string{"c=3; max-age=3600"},
-		"c=3",
-		[]query{{"http://www.google.com", "c=3"}},
-	},
-	{
-		"Delete pc c3 via MaxAge.",
-		"http://www.google.com",
-		[]string{"c=3; max-age=-1"},
-		"",
-		[]query{{"http://www.google.com", ""}},
-	},
-	{
-		"Create persistent cookie d4.",
-		"http://www.google.com",
-		[]string{"d=4; max-age=3600"},
-		"d=4",
-		[]query{{"http://www.google.com", "d=4"}},
-	},
-	{
-		"Delete pc d4 via Expires.",
-		"http://www.google.com",
-		[]string{"d=4; " + expiresIn(-10)},
-		"",
-		[]query{{"http://www.google.com", ""}},
-	},
-}
-
-func TestChromiumDeletion(t *testing.T) {
-	jar := newTestJar()
-	for _, test := range chromiumDeletionTests {
-		test.run(t, jar)
-	}
-}
-
-// domainHandlingTests tests and documents the rules for domain handling.
-// Each test must be performed on an empty new Jar.
-var domainHandlingTests = [...]jarTest{
-	{
-		"Host cookie",
-		"http://www.host.test",
-		[]string{"a=1"},
-		"a=1",
-		[]query{
-			{"http://www.host.test", "a=1"},
-			{"http://host.test", ""},
-			{"http://bar.host.test", ""},
-			{"http://foo.www.host.test", ""},
-			{"http://other.test", ""},
-			{"http://test", ""},
-		},
-	},
-	{
-		"Domain cookie #1",
-		"http://www.host.test",
-		[]string{"a=1; domain=host.test"},
-		"a=1",
-		[]query{
-			{"http://www.host.test", "a=1"},
-			{"http://host.test", "a=1"},
-			{"http://bar.host.test", "a=1"},
-			{"http://foo.www.host.test", "a=1"},
-			{"http://other.test", ""},
-			{"http://test", ""},
-		},
-	},
-	{
-		"Domain cookie #2",
-		"http://www.host.test",
-		[]string{"a=1; domain=.host.test"},
-		"a=1",
-		[]query{
-			{"http://www.host.test", "a=1"},
-			{"http://host.test", "a=1"},
-			{"http://bar.host.test", "a=1"},
-			{"http://foo.www.host.test", "a=1"},
-			{"http://other.test", ""},
-			{"http://test", ""},
-		},
-	},
-	{
-		"Host cookie on IDNA domain #1",
-		"http://www.bücher.test",
-		[]string{"a=1"},
-		"a=1",
-		[]query{
-			{"http://www.bücher.test", "a=1"},
-			{"http://www.xn--bcher-kva.test", "a=1"},
-			{"http://bücher.test", ""},
-			{"http://xn--bcher-kva.test", ""},
-			{"http://bar.bücher.test", ""},
-			{"http://bar.xn--bcher-kva.test", ""},
-			{"http://foo.www.bücher.test", ""},
-			{"http://foo.www.xn--bcher-kva.test", ""},
-			{"http://other.test", ""},
-			{"http://test", ""},
-		},
-	},
-	{
-		"Host cookie on IDNA domain #2",
-		"http://www.xn--bcher-kva.test",
-		[]string{"a=1"},
-		"a=1",
-		[]query{
-			{"http://www.bücher.test", "a=1"},
-			{"http://www.xn--bcher-kva.test", "a=1"},
-			{"http://bücher.test", ""},
-			{"http://xn--bcher-kva.test", ""},
-			{"http://bar.bücher.test", ""},
-			{"http://bar.xn--bcher-kva.test", ""},
-			{"http://foo.www.bücher.test", ""},
-			{"http://foo.www.xn--bcher-kva.test", ""},
-			{"http://other.test", ""},
-			{"http://test", ""},
-		},
-	},
-	{
-		"Domain cookie on IDNA domain #1",
-		"http://www.bücher.test",
-		[]string{"a=1; domain=xn--bcher-kva.test"},
-		"a=1",
-		[]query{
-			{"http://www.bücher.test", "a=1"},
-			{"http://www.xn--bcher-kva.test", "a=1"},
-			{"http://bücher.test", "a=1"},
-			{"http://xn--bcher-kva.test", "a=1"},
-			{"http://bar.bücher.test", "a=1"},
-			{"http://bar.xn--bcher-kva.test", "a=1"},
-			{"http://foo.www.bücher.test", "a=1"},
-			{"http://foo.www.xn--bcher-kva.test", "a=1"},
-			{"http://other.test", ""},
-			{"http://test", ""},
-		},
-	},
-	{
-		"Domain cookie on IDNA domain #2",
-		"http://www.xn--bcher-kva.test",
-		[]string{"a=1; domain=xn--bcher-kva.test"},
-		"a=1",
-		[]query{
-			{"http://www.bücher.test", "a=1"},
-			{"http://www.xn--bcher-kva.test", "a=1"},
-			{"http://bücher.test", "a=1"},
-			{"http://xn--bcher-kva.test", "a=1"},
-			{"http://bar.bücher.test", "a=1"},
-			{"http://bar.xn--bcher-kva.test", "a=1"},
-			{"http://foo.www.bücher.test", "a=1"},
-			{"http://foo.www.xn--bcher-kva.test", "a=1"},
-			{"http://other.test", ""},
-			{"http://test", ""},
-		},
-	},
-	{
-		"Host cookie on TLD.",
-		"http://com",
-		[]string{"a=1"},
-		"a=1",
-		[]query{
-			{"http://com", "a=1"},
-			{"http://any.com", ""},
-			{"http://any.test", ""},
-		},
-	},
-	{
-		"Domain cookie on TLD becomes a host cookie.",
-		"http://com",
-		[]string{"a=1; domain=com"},
-		"a=1",
-		[]query{
-			{"http://com", "a=1"},
-			{"http://any.com", ""},
-			{"http://any.test", ""},
-		},
-	},
-	{
-		"Host cookie on public suffix.",
-		"http://co.uk",
-		[]string{"a=1"},
-		"a=1",
-		[]query{
-			{"http://co.uk", "a=1"},
-			{"http://uk", ""},
-			{"http://some.co.uk", ""},
-			{"http://foo.some.co.uk", ""},
-			{"http://any.uk", ""},
-		},
-	},
-	{
-		"Domain cookie on public suffix is ignored.",
-		"http://some.co.uk",
-		[]string{"a=1; domain=co.uk"},
-		"",
-		[]query{
-			{"http://co.uk", ""},
-			{"http://uk", ""},
-			{"http://some.co.uk", ""},
-			{"http://foo.some.co.uk", ""},
-			{"http://any.uk", ""},
-		},
-	},
-}
-
-func TestDomainHandling(t *testing.T) {
-	for _, test := range domainHandlingTests {
-		jar := newTestJar()
-		test.run(t, jar)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/cookiejar/punycode.go b/third_party/gofrontend/libgo/go/net/http/cookiejar/punycode.go
deleted file mode 100644
index ea7ceb5..0000000
--- a/third_party/gofrontend/libgo/go/net/http/cookiejar/punycode.go
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cookiejar
-
-// This file implements the Punycode algorithm from RFC 3492.
-
-import (
-	"fmt"
-	"strings"
-	"unicode/utf8"
-)
-
-// These parameter values are specified in section 5.
-//
-// All computation is done with int32s, so that overflow behavior is identical
-// regardless of whether int is 32-bit or 64-bit.
-const (
-	base        int32 = 36
-	damp        int32 = 700
-	initialBias int32 = 72
-	initialN    int32 = 128
-	skew        int32 = 38
-	tmax        int32 = 26
-	tmin        int32 = 1
-)
-
-// encode encodes a string as specified in section 6.3 and prepends prefix to
-// the result.
-//
-// The "while h < length(input)" line in the specification becomes "for
-// remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes.
-func encode(prefix, s string) (string, error) {
-	output := make([]byte, len(prefix), len(prefix)+1+2*len(s))
-	copy(output, prefix)
-	delta, n, bias := int32(0), initialN, initialBias
-	b, remaining := int32(0), int32(0)
-	for _, r := range s {
-		if r < 0x80 {
-			b++
-			output = append(output, byte(r))
-		} else {
-			remaining++
-		}
-	}
-	h := b
-	if b > 0 {
-		output = append(output, '-')
-	}
-	for remaining != 0 {
-		m := int32(0x7fffffff)
-		for _, r := range s {
-			if m > r && r >= n {
-				m = r
-			}
-		}
-		delta += (m - n) * (h + 1)
-		if delta < 0 {
-			return "", fmt.Errorf("cookiejar: invalid label %q", s)
-		}
-		n = m
-		for _, r := range s {
-			if r < n {
-				delta++
-				if delta < 0 {
-					return "", fmt.Errorf("cookiejar: invalid label %q", s)
-				}
-				continue
-			}
-			if r > n {
-				continue
-			}
-			q := delta
-			for k := base; ; k += base {
-				t := k - bias
-				if t < tmin {
-					t = tmin
-				} else if t > tmax {
-					t = tmax
-				}
-				if q < t {
-					break
-				}
-				output = append(output, encodeDigit(t+(q-t)%(base-t)))
-				q = (q - t) / (base - t)
-			}
-			output = append(output, encodeDigit(q))
-			bias = adapt(delta, h+1, h == b)
-			delta = 0
-			h++
-			remaining--
-		}
-		delta++
-		n++
-	}
-	return string(output), nil
-}
-
-func encodeDigit(digit int32) byte {
-	switch {
-	case 0 <= digit && digit < 26:
-		return byte(digit + 'a')
-	case 26 <= digit && digit < 36:
-		return byte(digit + ('0' - 26))
-	}
-	panic("cookiejar: internal error in punycode encoding")
-}
-
-// adapt is the bias adaptation function specified in section 6.1.
-func adapt(delta, numPoints int32, firstTime bool) int32 {
-	if firstTime {
-		delta /= damp
-	} else {
-		delta /= 2
-	}
-	delta += delta / numPoints
-	k := int32(0)
-	for delta > ((base-tmin)*tmax)/2 {
-		delta /= base - tmin
-		k += base
-	}
-	return k + (base-tmin+1)*delta/(delta+skew)
-}
-
-// Strictly speaking, the remaining code below deals with IDNA (RFC 5890 and
-// friends) and not Punycode (RFC 3492) per se.
-
-// acePrefix is the ASCII Compatible Encoding prefix.
-const acePrefix = "xn--"
-
-// toASCII converts a domain or domain label to its ASCII form. For example,
-// toASCII("bücher.example.com") is "xn--bcher-kva.example.com", and
-// toASCII("golang") is "golang".
-func toASCII(s string) (string, error) {
-	if ascii(s) {
-		return s, nil
-	}
-	labels := strings.Split(s, ".")
-	for i, label := range labels {
-		if !ascii(label) {
-			a, err := encode(acePrefix, label)
-			if err != nil {
-				return "", err
-			}
-			labels[i] = a
-		}
-	}
-	return strings.Join(labels, "."), nil
-}
-
-func ascii(s string) bool {
-	for i := 0; i < len(s); i++ {
-		if s[i] >= utf8.RuneSelf {
-			return false
-		}
-	}
-	return true
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/cookiejar/punycode_test.go b/third_party/gofrontend/libgo/go/net/http/cookiejar/punycode_test.go
deleted file mode 100644
index 0301de1..0000000
--- a/third_party/gofrontend/libgo/go/net/http/cookiejar/punycode_test.go
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cookiejar
-
-import (
-	"testing"
-)
-
-var punycodeTestCases = [...]struct {
-	s, encoded string
-}{
-	{"", ""},
-	{"-", "--"},
-	{"-a", "-a-"},
-	{"-a-", "-a--"},
-	{"a", "a-"},
-	{"a-", "a--"},
-	{"a-b", "a-b-"},
-	{"books", "books-"},
-	{"bücher", "bcher-kva"},
-	{"Hello世界", "Hello-ck1hg65u"},
-	{"ü", "tda"},
-	{"üý", "tdac"},
-
-	// The test cases below come from RFC 3492 section 7.1 with Errata 3026.
-	{
-		// (A) Arabic (Egyptian).
-		"\u0644\u064A\u0647\u0645\u0627\u0628\u062A\u0643\u0644" +
-			"\u0645\u0648\u0634\u0639\u0631\u0628\u064A\u061F",
-		"egbpdaj6bu4bxfgehfvwxn",
-	},
-	{
-		// (B) Chinese (simplified).
-		"\u4ED6\u4EEC\u4E3A\u4EC0\u4E48\u4E0D\u8BF4\u4E2D\u6587",
-		"ihqwcrb4cv8a8dqg056pqjye",
-	},
-	{
-		// (C) Chinese (traditional).
-		"\u4ED6\u5011\u7232\u4EC0\u9EBD\u4E0D\u8AAA\u4E2D\u6587",
-		"ihqwctvzc91f659drss3x8bo0yb",
-	},
-	{
-		// (D) Czech.
-		"\u0050\u0072\u006F\u010D\u0070\u0072\u006F\u0073\u0074" +
-			"\u011B\u006E\u0065\u006D\u006C\u0075\u0076\u00ED\u010D" +
-			"\u0065\u0073\u006B\u0079",
-		"Proprostnemluvesky-uyb24dma41a",
-	},
-	{
-		// (E) Hebrew.
-		"\u05DC\u05DE\u05D4\u05D4\u05DD\u05E4\u05E9\u05D5\u05D8" +
-			"\u05DC\u05D0\u05DE\u05D3\u05D1\u05E8\u05D9\u05DD\u05E2" +
-			"\u05D1\u05E8\u05D9\u05EA",
-		"4dbcagdahymbxekheh6e0a7fei0b",
-	},
-	{
-		// (F) Hindi (Devanagari).
-		"\u092F\u0939\u0932\u094B\u0917\u0939\u093F\u0928\u094D" +
-			"\u0926\u0940\u0915\u094D\u092F\u094B\u0902\u0928\u0939" +
-			"\u0940\u0902\u092C\u094B\u0932\u0938\u0915\u0924\u0947" +
-			"\u0939\u0948\u0902",
-		"i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd",
-	},
-	{
-		// (G) Japanese (kanji and hiragana).
-		"\u306A\u305C\u307F\u3093\u306A\u65E5\u672C\u8A9E\u3092" +
-			"\u8A71\u3057\u3066\u304F\u308C\u306A\u3044\u306E\u304B",
-		"n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa",
-	},
-	{
-		// (H) Korean (Hangul syllables).
-		"\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774" +
-			"\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74" +
-			"\uC5BC\uB9C8\uB098\uC88B\uC744\uAE4C",
-		"989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5j" +
-			"psd879ccm6fea98c",
-	},
-	{
-		// (I) Russian (Cyrillic).
-		"\u043F\u043E\u0447\u0435\u043C\u0443\u0436\u0435\u043E" +
-			"\u043D\u0438\u043D\u0435\u0433\u043E\u0432\u043E\u0440" +
-			"\u044F\u0442\u043F\u043E\u0440\u0443\u0441\u0441\u043A" +
-			"\u0438",
-		"b1abfaaepdrnnbgefbadotcwatmq2g4l",
-	},
-	{
-		// (J) Spanish.
-		"\u0050\u006F\u0072\u0071\u0075\u00E9\u006E\u006F\u0070" +
-			"\u0075\u0065\u0064\u0065\u006E\u0073\u0069\u006D\u0070" +
-			"\u006C\u0065\u006D\u0065\u006E\u0074\u0065\u0068\u0061" +
-			"\u0062\u006C\u0061\u0072\u0065\u006E\u0045\u0073\u0070" +
-			"\u0061\u00F1\u006F\u006C",
-		"PorqunopuedensimplementehablarenEspaol-fmd56a",
-	},
-	{
-		// (K) Vietnamese.
-		"\u0054\u1EA1\u0069\u0073\u0061\u006F\u0068\u1ECD\u006B" +
-			"\u0068\u00F4\u006E\u0067\u0074\u0068\u1EC3\u0063\u0068" +
-			"\u1EC9\u006E\u00F3\u0069\u0074\u0069\u1EBF\u006E\u0067" +
-			"\u0056\u0069\u1EC7\u0074",
-		"TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g",
-	},
-	{
-		// (L) 3<nen>B<gumi><kinpachi><sensei>.
-		"\u0033\u5E74\u0042\u7D44\u91D1\u516B\u5148\u751F",
-		"3B-ww4c5e180e575a65lsy2b",
-	},
-	{
-		// (M) <amuro><namie>-with-SUPER-MONKEYS.
-		"\u5B89\u5BA4\u5948\u7F8E\u6075\u002D\u0077\u0069\u0074" +
-			"\u0068\u002D\u0053\u0055\u0050\u0045\u0052\u002D\u004D" +
-			"\u004F\u004E\u004B\u0045\u0059\u0053",
-		"-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n",
-	},
-	{
-		// (N) Hello-Another-Way-<sorezore><no><basho>.
-		"\u0048\u0065\u006C\u006C\u006F\u002D\u0041\u006E\u006F" +
-			"\u0074\u0068\u0065\u0072\u002D\u0057\u0061\u0079\u002D" +
-			"\u305D\u308C\u305E\u308C\u306E\u5834\u6240",
-		"Hello-Another-Way--fc4qua05auwb3674vfr0b",
-	},
-	{
-		// (O) <hitotsu><yane><no><shita>2.
-		"\u3072\u3068\u3064\u5C4B\u6839\u306E\u4E0B\u0032",
-		"2-u9tlzr9756bt3uc0v",
-	},
-	{
-		// (P) Maji<de>Koi<suru>5<byou><mae>
-		"\u004D\u0061\u006A\u0069\u3067\u004B\u006F\u0069\u3059" +
-			"\u308B\u0035\u79D2\u524D",
-		"MajiKoi5-783gue6qz075azm5e",
-	},
-	{
-		// (Q) <pafii>de<runba>
-		"\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0",
-		"de-jg4avhby1noc0d",
-	},
-	{
-		// (R) <sono><supiido><de>
-		"\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067",
-		"d9juau41awczczp",
-	},
-	{
-		// (S) -> $1.00 <-
-		"\u002D\u003E\u0020\u0024\u0031\u002E\u0030\u0030\u0020" +
-			"\u003C\u002D",
-		"-> $1.00 <--",
-	},
-}
-
-func TestPunycode(t *testing.T) {
-	for _, tc := range punycodeTestCases {
-		if got, err := encode("", tc.s); err != nil {
-			t.Errorf(`encode("", %q): %v`, tc.s, err)
-		} else if got != tc.encoded {
-			t.Errorf(`encode("", %q): got %q, want %q`, tc.s, got, tc.encoded)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/doc.go b/third_party/gofrontend/libgo/go/net/http/doc.go
deleted file mode 100644
index b1216e8..0000000
--- a/third_party/gofrontend/libgo/go/net/http/doc.go
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package http provides HTTP client and server implementations.
-
-Get, Head, Post, and PostForm make HTTP (or HTTPS) requests:
-
-	resp, err := http.Get("http://example.com/")
-	...
-	resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf)
-	...
-	resp, err := http.PostForm("http://example.com/form",
-		url.Values{"key": {"Value"}, "id": {"123"}})
-
-The client must close the response body when finished with it:
-
-	resp, err := http.Get("http://example.com/")
-	if err != nil {
-		// handle error
-	}
-	defer resp.Body.Close()
-	body, err := ioutil.ReadAll(resp.Body)
-	// ...
-
-For control over HTTP client headers, redirect policy, and other
-settings, create a Client:
-
-	client := &http.Client{
-		CheckRedirect: redirectPolicyFunc,
-	}
-
-	resp, err := client.Get("http://example.com")
-	// ...
-
-	req, err := http.NewRequest("GET", "http://example.com", nil)
-	// ...
-	req.Header.Add("If-None-Match", `W/"wyzzy"`)
-	resp, err := client.Do(req)
-	// ...
-
-For control over proxies, TLS configuration, keep-alives,
-compression, and other settings, create a Transport:
-
-	tr := &http.Transport{
-		TLSClientConfig:    &tls.Config{RootCAs: pool},
-		DisableCompression: true,
-	}
-	client := &http.Client{Transport: tr}
-	resp, err := client.Get("https://example.com")
-
-Clients and Transports are safe for concurrent use by multiple
-goroutines and for efficiency should only be created once and re-used.
-
-ListenAndServe starts an HTTP server with a given address and handler.
-The handler is usually nil, which means to use DefaultServeMux.
-Handle and HandleFunc add handlers to DefaultServeMux:
-
-	http.Handle("/foo", fooHandler)
-
-	http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
-		fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
-	})
-
-	log.Fatal(http.ListenAndServe(":8080", nil))
-
-More control over the server's behavior is available by creating a
-custom Server:
-
-	s := &http.Server{
-		Addr:           ":8080",
-		Handler:        myHandler,
-		ReadTimeout:    10 * time.Second,
-		WriteTimeout:   10 * time.Second,
-		MaxHeaderBytes: 1 << 20,
-	}
-	log.Fatal(s.ListenAndServe())
-*/
-package http
diff --git a/third_party/gofrontend/libgo/go/net/http/example_test.go b/third_party/gofrontend/libgo/go/net/http/example_test.go
deleted file mode 100644
index 1774795..0000000
--- a/third_party/gofrontend/libgo/go/net/http/example_test.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http_test
-
-import (
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	"net/http"
-)
-
-func ExampleHijacker() {
-	http.HandleFunc("/hijack", func(w http.ResponseWriter, r *http.Request) {
-		hj, ok := w.(http.Hijacker)
-		if !ok {
-			http.Error(w, "webserver doesn't support hijacking", http.StatusInternalServerError)
-			return
-		}
-		conn, bufrw, err := hj.Hijack()
-		if err != nil {
-			http.Error(w, err.Error(), http.StatusInternalServerError)
-			return
-		}
-		// Don't forget to close the connection:
-		defer conn.Close()
-		bufrw.WriteString("Now we're speaking raw TCP. Say hi: ")
-		bufrw.Flush()
-		s, err := bufrw.ReadString('\n')
-		if err != nil {
-			log.Printf("error reading string: %v", err)
-			return
-		}
-		fmt.Fprintf(bufrw, "You said: %q\nBye.\n", s)
-		bufrw.Flush()
-	})
-}
-
-func ExampleGet() {
-	res, err := http.Get("http://www.google.com/robots.txt")
-	if err != nil {
-		log.Fatal(err)
-	}
-	robots, err := ioutil.ReadAll(res.Body)
-	res.Body.Close()
-	if err != nil {
-		log.Fatal(err)
-	}
-	fmt.Printf("%s", robots)
-}
-
-func ExampleFileServer() {
-	// Simple static webserver:
-	log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir("/usr/share/doc"))))
-}
-
-func ExampleFileServer_stripPrefix() {
-	// To serve a directory on disk (/tmp) under an alternate URL
-	// path (/tmpfiles/), use StripPrefix to modify the request
-	// URL's path before the FileServer sees it:
-	http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
-}
-
-func ExampleStripPrefix() {
-	// To serve a directory on disk (/tmp) under an alternate URL
-	// path (/tmpfiles/), use StripPrefix to modify the request
-	// URL's path before the FileServer sees it:
-	http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
-}
-
-type apiHandler struct{}
-
-func (apiHandler) ServeHTTP(http.ResponseWriter, *http.Request) {}
-
-func ExampleServeMux_Handle() {
-	mux := http.NewServeMux()
-	mux.Handle("/api/", apiHandler{})
-	mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
-		// The "/" pattern matches everything, so we need to check
-		// that we're at the root here.
-		if req.URL.Path != "/" {
-			http.NotFound(w, req)
-			return
-		}
-		fmt.Fprintf(w, "Welcome to the home page!")
-	})
-}
-
-// HTTP Trailers are a set of key/value pairs like headers that come
-// after the HTTP response, instead of before.
-func ExampleResponseWriter_trailers() {
-	mux := http.NewServeMux()
-	mux.HandleFunc("/sendstrailers", func(w http.ResponseWriter, req *http.Request) {
-		// Before any call to WriteHeader or Write, declare
-		// the trailers you will set during the HTTP
-		// response. These three headers are actually sent in
-		// the trailer.
-		w.Header().Set("Trailer", "AtEnd1, AtEnd2")
-		w.Header().Add("Trailer", "AtEnd3")
-
-		w.Header().Set("Content-Type", "text/plain; charset=utf-8") // normal header
-		w.WriteHeader(http.StatusOK)
-
-		w.Header().Set("AtEnd1", "value 1")
-		io.WriteString(w, "This HTTP response has both headers before this text and trailers at the end.\n")
-		w.Header().Set("AtEnd2", "value 2")
-		w.Header().Set("AtEnd3", "value 3") // These will appear as trailers.
-	})
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/export_test.go b/third_party/gofrontend/libgo/go/net/http/export_test.go
deleted file mode 100644
index 0457be5..0000000
--- a/third_party/gofrontend/libgo/go/net/http/export_test.go
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Bridge package to expose http internals to tests in the http_test
-// package.
-
-package http
-
-import (
-	"net"
-	"net/url"
-	"sync"
-	"time"
-)
-
-func init() {
-	// We only want to pay for this cost during testing.
-	// When not under test, these values are always nil
-	// and never assigned to.
-	testHookMu = new(sync.Mutex)
-}
-
-func NewLoggingConn(baseName string, c net.Conn) net.Conn {
-	return newLoggingConn(baseName, c)
-}
-
-var ExportAppendTime = appendTime
-
-func (t *Transport) NumPendingRequestsForTesting() int {
-	t.reqMu.Lock()
-	defer t.reqMu.Unlock()
-	return len(t.reqCanceler)
-}
-
-func (t *Transport) IdleConnKeysForTesting() (keys []string) {
-	keys = make([]string, 0)
-	t.idleMu.Lock()
-	defer t.idleMu.Unlock()
-	if t.idleConn == nil {
-		return
-	}
-	for key := range t.idleConn {
-		keys = append(keys, key.String())
-	}
-	return
-}
-
-func (t *Transport) IdleConnCountForTesting(cacheKey string) int {
-	t.idleMu.Lock()
-	defer t.idleMu.Unlock()
-	if t.idleConn == nil {
-		return 0
-	}
-	for k, conns := range t.idleConn {
-		if k.String() == cacheKey {
-			return len(conns)
-		}
-	}
-	return 0
-}
-
-func (t *Transport) IdleConnChMapSizeForTesting() int {
-	t.idleMu.Lock()
-	defer t.idleMu.Unlock()
-	return len(t.idleConnCh)
-}
-
-func (t *Transport) IsIdleForTesting() bool {
-	t.idleMu.Lock()
-	defer t.idleMu.Unlock()
-	return t.wantIdle
-}
-
-func (t *Transport) RequestIdleConnChForTesting() {
-	t.getIdleConnCh(connectMethod{nil, "http", "example.com"})
-}
-
-func (t *Transport) PutIdleTestConn() bool {
-	c, _ := net.Pipe()
-	return t.putIdleConn(&persistConn{
-		t:        t,
-		conn:     c,                   // dummy
-		closech:  make(chan struct{}), // so it can be closed
-		cacheKey: connectMethodKey{"", "http", "example.com"},
-	})
-}
-
-func SetInstallConnClosedHook(f func()) {
-	testHookPersistConnClosedGotRes = f
-}
-
-func SetEnterRoundTripHook(f func()) {
-	testHookEnterRoundTrip = f
-}
-
-func SetReadLoopBeforeNextReadHook(f func()) {
-	testHookMu.Lock()
-	defer testHookMu.Unlock()
-	testHookReadLoopBeforeNextRead = f
-}
-
-func NewTestTimeoutHandler(handler Handler, ch <-chan time.Time) Handler {
-	f := func() <-chan time.Time {
-		return ch
-	}
-	return &timeoutHandler{handler, f, ""}
-}
-
-func ResetCachedEnvironment() {
-	httpProxyEnv.reset()
-	httpsProxyEnv.reset()
-	noProxyEnv.reset()
-}
-
-var DefaultUserAgent = defaultUserAgent
-
-func ExportRefererForURL(lastReq, newReq *url.URL) string {
-	return refererForURL(lastReq, newReq)
-}
-
-// SetPendingDialHooks sets the hooks that run before and after handling
-// pending dials.
-func SetPendingDialHooks(before, after func()) {
-	prePendingDial, postPendingDial = before, after
-}
-
-var ExportServerNewConn = (*Server).newConn
-
-var ExportCloseWriteAndWait = (*conn).closeWriteAndWait
-
-var ExportErrRequestCanceled = errRequestCanceled
diff --git a/third_party/gofrontend/libgo/go/net/http/fcgi/child.go b/third_party/gofrontend/libgo/go/net/http/fcgi/child.go
deleted file mode 100644
index da824ed..0000000
--- a/third_party/gofrontend/libgo/go/net/http/fcgi/child.go
+++ /dev/null
@@ -1,328 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package fcgi
-
-// This file implements FastCGI from the perspective of a child process.
-
-import (
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net"
-	"net/http"
-	"net/http/cgi"
-	"os"
-	"strings"
-	"sync"
-	"time"
-)
-
-// request holds the state for an in-progress request. As soon as it's complete,
-// it's converted to an http.Request.
-type request struct {
-	pw        *io.PipeWriter
-	reqId     uint16
-	params    map[string]string
-	buf       [1024]byte
-	rawParams []byte
-	keepConn  bool
-}
-
-func newRequest(reqId uint16, flags uint8) *request {
-	r := &request{
-		reqId:    reqId,
-		params:   map[string]string{},
-		keepConn: flags&flagKeepConn != 0,
-	}
-	r.rawParams = r.buf[:0]
-	return r
-}
-
-// parseParams reads an encoded []byte into Params.
-func (r *request) parseParams() {
-	text := r.rawParams
-	r.rawParams = nil
-	for len(text) > 0 {
-		keyLen, n := readSize(text)
-		if n == 0 {
-			return
-		}
-		text = text[n:]
-		valLen, n := readSize(text)
-		if n == 0 {
-			return
-		}
-		text = text[n:]
-		key := readString(text, keyLen)
-		text = text[keyLen:]
-		val := readString(text, valLen)
-		text = text[valLen:]
-		r.params[key] = val
-	}
-}
-
-// response implements http.ResponseWriter.
-type response struct {
-	req         *request
-	header      http.Header
-	w           *bufWriter
-	wroteHeader bool
-}
-
-func newResponse(c *child, req *request) *response {
-	return &response{
-		req:    req,
-		header: http.Header{},
-		w:      newWriter(c.conn, typeStdout, req.reqId),
-	}
-}
-
-func (r *response) Header() http.Header {
-	return r.header
-}
-
-func (r *response) Write(data []byte) (int, error) {
-	if !r.wroteHeader {
-		r.WriteHeader(http.StatusOK)
-	}
-	return r.w.Write(data)
-}
-
-func (r *response) WriteHeader(code int) {
-	if r.wroteHeader {
-		return
-	}
-	r.wroteHeader = true
-	if code == http.StatusNotModified {
-		// Must not have body.
-		r.header.Del("Content-Type")
-		r.header.Del("Content-Length")
-		r.header.Del("Transfer-Encoding")
-	} else if r.header.Get("Content-Type") == "" {
-		r.header.Set("Content-Type", "text/html; charset=utf-8")
-	}
-
-	if r.header.Get("Date") == "" {
-		r.header.Set("Date", time.Now().UTC().Format(http.TimeFormat))
-	}
-
-	fmt.Fprintf(r.w, "Status: %d %s\r\n", code, http.StatusText(code))
-	r.header.Write(r.w)
-	r.w.WriteString("\r\n")
-}
-
-func (r *response) Flush() {
-	if !r.wroteHeader {
-		r.WriteHeader(http.StatusOK)
-	}
-	r.w.Flush()
-}
-
-func (r *response) Close() error {
-	r.Flush()
-	return r.w.Close()
-}
-
-type child struct {
-	conn    *conn
-	handler http.Handler
-
-	mu       sync.Mutex          // protects requests:
-	requests map[uint16]*request // keyed by request ID
-}
-
-func newChild(rwc io.ReadWriteCloser, handler http.Handler) *child {
-	return &child{
-		conn:     newConn(rwc),
-		handler:  handler,
-		requests: make(map[uint16]*request),
-	}
-}
-
-func (c *child) serve() {
-	defer c.conn.Close()
-	defer c.cleanUp()
-	var rec record
-	for {
-		if err := rec.read(c.conn.rwc); err != nil {
-			return
-		}
-		if err := c.handleRecord(&rec); err != nil {
-			return
-		}
-	}
-}
-
-var errCloseConn = errors.New("fcgi: connection should be closed")
-
-var emptyBody = ioutil.NopCloser(strings.NewReader(""))
-
-// ErrRequestAborted is returned by Read when a handler attempts to read the
-// body of a request that has been aborted by the web server.
-var ErrRequestAborted = errors.New("fcgi: request aborted by web server")
-
-// ErrConnClosed is returned by Read when a handler attempts to read the body of
-// a request after the connection to the web server has been closed.
-var ErrConnClosed = errors.New("fcgi: connection to web server closed")
-
-func (c *child) handleRecord(rec *record) error {
-	c.mu.Lock()
-	req, ok := c.requests[rec.h.Id]
-	c.mu.Unlock()
-	if !ok && rec.h.Type != typeBeginRequest && rec.h.Type != typeGetValues {
-		// The spec says to ignore unknown request IDs.
-		return nil
-	}
-
-	switch rec.h.Type {
-	case typeBeginRequest:
-		if req != nil {
-			// The server is trying to begin a request with the same ID
-			// as an in-progress request. This is an error.
-			return errors.New("fcgi: received ID that is already in-flight")
-		}
-
-		var br beginRequest
-		if err := br.read(rec.content()); err != nil {
-			return err
-		}
-		if br.role != roleResponder {
-			c.conn.writeEndRequest(rec.h.Id, 0, statusUnknownRole)
-			return nil
-		}
-		req = newRequest(rec.h.Id, br.flags)
-		c.mu.Lock()
-		c.requests[rec.h.Id] = req
-		c.mu.Unlock()
-		return nil
-	case typeParams:
-		// NOTE(eds): Technically a key-value pair can straddle the boundary
-		// between two packets. We buffer until we've received all parameters.
-		if len(rec.content()) > 0 {
-			req.rawParams = append(req.rawParams, rec.content()...)
-			return nil
-		}
-		req.parseParams()
-		return nil
-	case typeStdin:
-		content := rec.content()
-		if req.pw == nil {
-			var body io.ReadCloser
-			if len(content) > 0 {
-				// body could be an io.LimitReader, but it shouldn't matter
-				// as long as both sides are behaving.
-				body, req.pw = io.Pipe()
-			} else {
-				body = emptyBody
-			}
-			go c.serveRequest(req, body)
-		}
-		if len(content) > 0 {
-			// TODO(eds): This blocks until the handler reads from the pipe.
-			// If the handler takes a long time, it might be a problem.
-			req.pw.Write(content)
-		} else if req.pw != nil {
-			req.pw.Close()
-		}
-		return nil
-	case typeGetValues:
-		values := map[string]string{"FCGI_MPXS_CONNS": "1"}
-		c.conn.writePairs(typeGetValuesResult, 0, values)
-		return nil
-	case typeData:
-		// If the filter role is implemented, read the data stream here.
-		return nil
-	case typeAbortRequest:
-		c.mu.Lock()
-		delete(c.requests, rec.h.Id)
-		c.mu.Unlock()
-		c.conn.writeEndRequest(rec.h.Id, 0, statusRequestComplete)
-		if req.pw != nil {
-			req.pw.CloseWithError(ErrRequestAborted)
-		}
-		if !req.keepConn {
-			// connection will close upon return
-			return errCloseConn
-		}
-		return nil
-	default:
-		b := make([]byte, 8)
-		b[0] = byte(rec.h.Type)
-		c.conn.writeRecord(typeUnknownType, 0, b)
-		return nil
-	}
-}
-
-func (c *child) serveRequest(req *request, body io.ReadCloser) {
-	r := newResponse(c, req)
-	httpReq, err := cgi.RequestFromMap(req.params)
-	if err != nil {
-		// there was an error reading the request
-		r.WriteHeader(http.StatusInternalServerError)
-		c.conn.writeRecord(typeStderr, req.reqId, []byte(err.Error()))
-	} else {
-		httpReq.Body = body
-		c.handler.ServeHTTP(r, httpReq)
-	}
-	r.Close()
-	c.mu.Lock()
-	delete(c.requests, req.reqId)
-	c.mu.Unlock()
-	c.conn.writeEndRequest(req.reqId, 0, statusRequestComplete)
-
-	// Consume the entire body, so the host isn't still writing to
-	// us when we close the socket below in the !keepConn case,
-	// otherwise we'd send a RST. (golang.org/issue/4183)
-	// TODO(bradfitz): also bound this copy in time. Or send
-	// some sort of abort request to the host, so the host
-	// can properly cut off the client sending all the data.
-	// For now just bound it a little and
-	io.CopyN(ioutil.Discard, body, 100<<20)
-	body.Close()
-
-	if !req.keepConn {
-		c.conn.Close()
-	}
-}
-
-func (c *child) cleanUp() {
-	c.mu.Lock()
-	defer c.mu.Unlock()
-	for _, req := range c.requests {
-		if req.pw != nil {
-			// race with call to Close in c.serveRequest doesn't matter because
-			// Pipe(Reader|Writer).Close are idempotent
-			req.pw.CloseWithError(ErrConnClosed)
-		}
-	}
-}
-
-// Serve accepts incoming FastCGI connections on the listener l, creating a new
-// goroutine for each. The goroutine reads requests and then calls handler
-// to reply to them.
-// If l is nil, Serve accepts connections from os.Stdin.
-// If handler is nil, http.DefaultServeMux is used.
-func Serve(l net.Listener, handler http.Handler) error {
-	if l == nil {
-		var err error
-		l, err = net.FileListener(os.Stdin)
-		if err != nil {
-			return err
-		}
-		defer l.Close()
-	}
-	if handler == nil {
-		handler = http.DefaultServeMux
-	}
-	for {
-		rw, err := l.Accept()
-		if err != nil {
-			return err
-		}
-		c := newChild(rw, handler)
-		go c.serve()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/fcgi/fcgi.go b/third_party/gofrontend/libgo/go/net/http/fcgi/fcgi.go
deleted file mode 100644
index 06bba04..0000000
--- a/third_party/gofrontend/libgo/go/net/http/fcgi/fcgi.go
+++ /dev/null
@@ -1,274 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package fcgi implements the FastCGI protocol.
-// Currently only the responder role is supported.
-// The protocol is defined at http://www.fastcgi.com/drupal/node/6?q=node/22
-package fcgi
-
-// This file defines the raw protocol and some utilities used by the child and
-// the host.
-
-import (
-	"bufio"
-	"bytes"
-	"encoding/binary"
-	"errors"
-	"io"
-	"sync"
-)
-
-// recType is a record type, as defined by
-// http://www.fastcgi.com/devkit/doc/fcgi-spec.html#S8
-type recType uint8
-
-const (
-	typeBeginRequest    recType = 1
-	typeAbortRequest    recType = 2
-	typeEndRequest      recType = 3
-	typeParams          recType = 4
-	typeStdin           recType = 5
-	typeStdout          recType = 6
-	typeStderr          recType = 7
-	typeData            recType = 8
-	typeGetValues       recType = 9
-	typeGetValuesResult recType = 10
-	typeUnknownType     recType = 11
-)
-
-// keep the connection between web-server and responder open after request
-const flagKeepConn = 1
-
-const (
-	maxWrite = 65535 // maximum record body
-	maxPad   = 255
-)
-
-const (
-	roleResponder = iota + 1 // only Responders are implemented.
-	roleAuthorizer
-	roleFilter
-)
-
-const (
-	statusRequestComplete = iota
-	statusCantMultiplex
-	statusOverloaded
-	statusUnknownRole
-)
-
-const headerLen = 8
-
-type header struct {
-	Version       uint8
-	Type          recType
-	Id            uint16
-	ContentLength uint16
-	PaddingLength uint8
-	Reserved      uint8
-}
-
-type beginRequest struct {
-	role     uint16
-	flags    uint8
-	reserved [5]uint8
-}
-
-func (br *beginRequest) read(content []byte) error {
-	if len(content) != 8 {
-		return errors.New("fcgi: invalid begin request record")
-	}
-	br.role = binary.BigEndian.Uint16(content)
-	br.flags = content[2]
-	return nil
-}
-
-// for padding so we don't have to allocate all the time
-// not synchronized because we don't care what the contents are
-var pad [maxPad]byte
-
-func (h *header) init(recType recType, reqId uint16, contentLength int) {
-	h.Version = 1
-	h.Type = recType
-	h.Id = reqId
-	h.ContentLength = uint16(contentLength)
-	h.PaddingLength = uint8(-contentLength & 7)
-}
-
-// conn sends records over rwc
-type conn struct {
-	mutex sync.Mutex
-	rwc   io.ReadWriteCloser
-
-	// to avoid allocations
-	buf bytes.Buffer
-	h   header
-}
-
-func newConn(rwc io.ReadWriteCloser) *conn {
-	return &conn{rwc: rwc}
-}
-
-func (c *conn) Close() error {
-	c.mutex.Lock()
-	defer c.mutex.Unlock()
-	return c.rwc.Close()
-}
-
-type record struct {
-	h   header
-	buf [maxWrite + maxPad]byte
-}
-
-func (rec *record) read(r io.Reader) (err error) {
-	if err = binary.Read(r, binary.BigEndian, &rec.h); err != nil {
-		return err
-	}
-	if rec.h.Version != 1 {
-		return errors.New("fcgi: invalid header version")
-	}
-	n := int(rec.h.ContentLength) + int(rec.h.PaddingLength)
-	if _, err = io.ReadFull(r, rec.buf[:n]); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (r *record) content() []byte {
-	return r.buf[:r.h.ContentLength]
-}
-
-// writeRecord writes and sends a single record.
-func (c *conn) writeRecord(recType recType, reqId uint16, b []byte) error {
-	c.mutex.Lock()
-	defer c.mutex.Unlock()
-	c.buf.Reset()
-	c.h.init(recType, reqId, len(b))
-	if err := binary.Write(&c.buf, binary.BigEndian, c.h); err != nil {
-		return err
-	}
-	if _, err := c.buf.Write(b); err != nil {
-		return err
-	}
-	if _, err := c.buf.Write(pad[:c.h.PaddingLength]); err != nil {
-		return err
-	}
-	_, err := c.rwc.Write(c.buf.Bytes())
-	return err
-}
-
-func (c *conn) writeBeginRequest(reqId uint16, role uint16, flags uint8) error {
-	b := [8]byte{byte(role >> 8), byte(role), flags}
-	return c.writeRecord(typeBeginRequest, reqId, b[:])
-}
-
-func (c *conn) writeEndRequest(reqId uint16, appStatus int, protocolStatus uint8) error {
-	b := make([]byte, 8)
-	binary.BigEndian.PutUint32(b, uint32(appStatus))
-	b[4] = protocolStatus
-	return c.writeRecord(typeEndRequest, reqId, b)
-}
-
-func (c *conn) writePairs(recType recType, reqId uint16, pairs map[string]string) error {
-	w := newWriter(c, recType, reqId)
-	b := make([]byte, 8)
-	for k, v := range pairs {
-		n := encodeSize(b, uint32(len(k)))
-		n += encodeSize(b[n:], uint32(len(v)))
-		if _, err := w.Write(b[:n]); err != nil {
-			return err
-		}
-		if _, err := w.WriteString(k); err != nil {
-			return err
-		}
-		if _, err := w.WriteString(v); err != nil {
-			return err
-		}
-	}
-	w.Close()
-	return nil
-}
-
-func readSize(s []byte) (uint32, int) {
-	if len(s) == 0 {
-		return 0, 0
-	}
-	size, n := uint32(s[0]), 1
-	if size&(1<<7) != 0 {
-		if len(s) < 4 {
-			return 0, 0
-		}
-		n = 4
-		size = binary.BigEndian.Uint32(s)
-		size &^= 1 << 31
-	}
-	return size, n
-}
-
-func readString(s []byte, size uint32) string {
-	if size > uint32(len(s)) {
-		return ""
-	}
-	return string(s[:size])
-}
-
-func encodeSize(b []byte, size uint32) int {
-	if size > 127 {
-		size |= 1 << 31
-		binary.BigEndian.PutUint32(b, size)
-		return 4
-	}
-	b[0] = byte(size)
-	return 1
-}
-
-// bufWriter encapsulates bufio.Writer but also closes the underlying stream when
-// Closed.
-type bufWriter struct {
-	closer io.Closer
-	*bufio.Writer
-}
-
-func (w *bufWriter) Close() error {
-	if err := w.Writer.Flush(); err != nil {
-		w.closer.Close()
-		return err
-	}
-	return w.closer.Close()
-}
-
-func newWriter(c *conn, recType recType, reqId uint16) *bufWriter {
-	s := &streamWriter{c: c, recType: recType, reqId: reqId}
-	w := bufio.NewWriterSize(s, maxWrite)
-	return &bufWriter{s, w}
-}
-
-// streamWriter abstracts out the separation of a stream into discrete records.
-// It only writes maxWrite bytes at a time.
-type streamWriter struct {
-	c       *conn
-	recType recType
-	reqId   uint16
-}
-
-func (w *streamWriter) Write(p []byte) (int, error) {
-	nn := 0
-	for len(p) > 0 {
-		n := len(p)
-		if n > maxWrite {
-			n = maxWrite
-		}
-		if err := w.c.writeRecord(w.recType, w.reqId, p[:n]); err != nil {
-			return nn, err
-		}
-		nn += n
-		p = p[n:]
-	}
-	return nn, nil
-}
-
-func (w *streamWriter) Close() error {
-	// send empty record to close the stream
-	return w.c.writeRecord(w.recType, w.reqId, nil)
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/fcgi/fcgi_test.go b/third_party/gofrontend/libgo/go/net/http/fcgi/fcgi_test.go
deleted file mode 100644
index de0f7f8..0000000
--- a/third_party/gofrontend/libgo/go/net/http/fcgi/fcgi_test.go
+++ /dev/null
@@ -1,256 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package fcgi
-
-import (
-	"bytes"
-	"errors"
-	"io"
-	"io/ioutil"
-	"net/http"
-	"testing"
-)
-
-var sizeTests = []struct {
-	size  uint32
-	bytes []byte
-}{
-	{0, []byte{0x00}},
-	{127, []byte{0x7F}},
-	{128, []byte{0x80, 0x00, 0x00, 0x80}},
-	{1000, []byte{0x80, 0x00, 0x03, 0xE8}},
-	{33554431, []byte{0x81, 0xFF, 0xFF, 0xFF}},
-}
-
-func TestSize(t *testing.T) {
-	b := make([]byte, 4)
-	for i, test := range sizeTests {
-		n := encodeSize(b, test.size)
-		if !bytes.Equal(b[:n], test.bytes) {
-			t.Errorf("%d expected %x, encoded %x", i, test.bytes, b)
-		}
-		size, n := readSize(test.bytes)
-		if size != test.size {
-			t.Errorf("%d expected %d, read %d", i, test.size, size)
-		}
-		if len(test.bytes) != n {
-			t.Errorf("%d did not consume all the bytes", i)
-		}
-	}
-}
-
-var streamTests = []struct {
-	desc    string
-	recType recType
-	reqId   uint16
-	content []byte
-	raw     []byte
-}{
-	{"single record", typeStdout, 1, nil,
-		[]byte{1, byte(typeStdout), 0, 1, 0, 0, 0, 0},
-	},
-	// this data will have to be split into two records
-	{"two records", typeStdin, 300, make([]byte, 66000),
-		bytes.Join([][]byte{
-			// header for the first record
-			{1, byte(typeStdin), 0x01, 0x2C, 0xFF, 0xFF, 1, 0},
-			make([]byte, 65536),
-			// header for the second
-			{1, byte(typeStdin), 0x01, 0x2C, 0x01, 0xD1, 7, 0},
-			make([]byte, 472),
-			// header for the empty record
-			{1, byte(typeStdin), 0x01, 0x2C, 0, 0, 0, 0},
-		},
-			nil),
-	},
-}
-
-type nilCloser struct {
-	io.ReadWriter
-}
-
-func (c *nilCloser) Close() error { return nil }
-
-func TestStreams(t *testing.T) {
-	var rec record
-outer:
-	for _, test := range streamTests {
-		buf := bytes.NewBuffer(test.raw)
-		var content []byte
-		for buf.Len() > 0 {
-			if err := rec.read(buf); err != nil {
-				t.Errorf("%s: error reading record: %v", test.desc, err)
-				continue outer
-			}
-			content = append(content, rec.content()...)
-		}
-		if rec.h.Type != test.recType {
-			t.Errorf("%s: got type %d expected %d", test.desc, rec.h.Type, test.recType)
-			continue
-		}
-		if rec.h.Id != test.reqId {
-			t.Errorf("%s: got request ID %d expected %d", test.desc, rec.h.Id, test.reqId)
-			continue
-		}
-		if !bytes.Equal(content, test.content) {
-			t.Errorf("%s: read wrong content", test.desc)
-			continue
-		}
-		buf.Reset()
-		c := newConn(&nilCloser{buf})
-		w := newWriter(c, test.recType, test.reqId)
-		if _, err := w.Write(test.content); err != nil {
-			t.Errorf("%s: error writing record: %v", test.desc, err)
-			continue
-		}
-		if err := w.Close(); err != nil {
-			t.Errorf("%s: error closing stream: %v", test.desc, err)
-			continue
-		}
-		if !bytes.Equal(buf.Bytes(), test.raw) {
-			t.Errorf("%s: wrote wrong content", test.desc)
-		}
-	}
-}
-
-type writeOnlyConn struct {
-	buf []byte
-}
-
-func (c *writeOnlyConn) Write(p []byte) (int, error) {
-	c.buf = append(c.buf, p...)
-	return len(p), nil
-}
-
-func (c *writeOnlyConn) Read(p []byte) (int, error) {
-	return 0, errors.New("conn is write-only")
-}
-
-func (c *writeOnlyConn) Close() error {
-	return nil
-}
-
-func TestGetValues(t *testing.T) {
-	var rec record
-	rec.h.Type = typeGetValues
-
-	wc := new(writeOnlyConn)
-	c := newChild(wc, nil)
-	err := c.handleRecord(&rec)
-	if err != nil {
-		t.Fatalf("handleRecord: %v", err)
-	}
-
-	const want = "\x01\n\x00\x00\x00\x12\x06\x00" +
-		"\x0f\x01FCGI_MPXS_CONNS1" +
-		"\x00\x00\x00\x00\x00\x00\x01\n\x00\x00\x00\x00\x00\x00"
-	if got := string(wc.buf); got != want {
-		t.Errorf(" got: %q\nwant: %q\n", got, want)
-	}
-}
-
-func nameValuePair11(nameData, valueData string) []byte {
-	return bytes.Join(
-		[][]byte{
-			{byte(len(nameData)), byte(len(valueData))},
-			[]byte(nameData),
-			[]byte(valueData),
-		},
-		nil,
-	)
-}
-
-func makeRecord(
-	recordType recType,
-	requestId uint16,
-	contentData []byte,
-) []byte {
-	requestIdB1 := byte(requestId >> 8)
-	requestIdB0 := byte(requestId)
-
-	contentLength := len(contentData)
-	contentLengthB1 := byte(contentLength >> 8)
-	contentLengthB0 := byte(contentLength)
-	return bytes.Join([][]byte{
-		{1, byte(recordType), requestIdB1, requestIdB0, contentLengthB1,
-			contentLengthB0, 0, 0},
-		contentData,
-	},
-		nil)
-}
-
-// a series of FastCGI records that start a request and begin sending the
-// request body
-var streamBeginTypeStdin = bytes.Join([][]byte{
-	// set up request 1
-	makeRecord(typeBeginRequest, 1,
-		[]byte{0, byte(roleResponder), 0, 0, 0, 0, 0, 0}),
-	// add required parameters to request 1
-	makeRecord(typeParams, 1, nameValuePair11("REQUEST_METHOD", "GET")),
-	makeRecord(typeParams, 1, nameValuePair11("SERVER_PROTOCOL", "HTTP/1.1")),
-	makeRecord(typeParams, 1, nil),
-	// begin sending body of request 1
-	makeRecord(typeStdin, 1, []byte("0123456789abcdef")),
-},
-	nil)
-
-var cleanUpTests = []struct {
-	input []byte
-	err   error
-}{
-	// confirm that child.handleRecord closes req.pw after aborting req
-	{
-		bytes.Join([][]byte{
-			streamBeginTypeStdin,
-			makeRecord(typeAbortRequest, 1, nil),
-		},
-			nil),
-		ErrRequestAborted,
-	},
-	// confirm that child.serve closes all pipes after error reading record
-	{
-		bytes.Join([][]byte{
-			streamBeginTypeStdin,
-			nil,
-		},
-			nil),
-		ErrConnClosed,
-	},
-}
-
-type nopWriteCloser struct {
-	io.ReadWriter
-}
-
-func (nopWriteCloser) Close() error {
-	return nil
-}
-
-// Test that child.serve closes the bodies of aborted requests and closes the
-// bodies of all requests before returning. Causes deadlock if either condition
-// isn't met. See issue 6934.
-func TestChildServeCleansUp(t *testing.T) {
-	for _, tt := range cleanUpTests {
-		input := make([]byte, len(tt.input))
-		copy(input, tt.input)
-		rc := nopWriteCloser{bytes.NewBuffer(input)}
-		done := make(chan bool)
-		c := newChild(rc, http.HandlerFunc(func(
-			w http.ResponseWriter,
-			r *http.Request,
-		) {
-			// block on reading body of request
-			_, err := io.Copy(ioutil.Discard, r.Body)
-			if err != tt.err {
-				t.Errorf("Expected %#v, got %#v", tt.err, err)
-			}
-			// not reached if body of request isn't closed
-			done <- true
-		}))
-		go c.serve()
-		// wait for body of request to be closed or all goroutines to block
-		<-done
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/filetransport.go b/third_party/gofrontend/libgo/go/net/http/filetransport.go
deleted file mode 100644
index 821787e..0000000
--- a/third_party/gofrontend/libgo/go/net/http/filetransport.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"fmt"
-	"io"
-)
-
-// fileTransport implements RoundTripper for the 'file' protocol.
-type fileTransport struct {
-	fh fileHandler
-}
-
-// NewFileTransport returns a new RoundTripper, serving the provided
-// FileSystem. The returned RoundTripper ignores the URL host in its
-// incoming requests, as well as most other properties of the
-// request.
-//
-// The typical use case for NewFileTransport is to register the "file"
-// protocol with a Transport, as in:
-//
-//   t := &http.Transport{}
-//   t.RegisterProtocol("file", http.NewFileTransport(http.Dir("/")))
-//   c := &http.Client{Transport: t}
-//   res, err := c.Get("file:///etc/passwd")
-//   ...
-func NewFileTransport(fs FileSystem) RoundTripper {
-	return fileTransport{fileHandler{fs}}
-}
-
-func (t fileTransport) RoundTrip(req *Request) (resp *Response, err error) {
-	// We start ServeHTTP in a goroutine, which may take a long
-	// time if the file is large.  The newPopulateResponseWriter
-	// call returns a channel which either ServeHTTP or finish()
-	// sends our *Response on, once the *Response itself has been
-	// populated (even if the body itself is still being
-	// written to the res.Body, a pipe)
-	rw, resc := newPopulateResponseWriter()
-	go func() {
-		t.fh.ServeHTTP(rw, req)
-		rw.finish()
-	}()
-	return <-resc, nil
-}
-
-func newPopulateResponseWriter() (*populateResponse, <-chan *Response) {
-	pr, pw := io.Pipe()
-	rw := &populateResponse{
-		ch: make(chan *Response),
-		pw: pw,
-		res: &Response{
-			Proto:      "HTTP/1.0",
-			ProtoMajor: 1,
-			Header:     make(Header),
-			Close:      true,
-			Body:       pr,
-		},
-	}
-	return rw, rw.ch
-}
-
-// populateResponse is a ResponseWriter that populates the *Response
-// in res, and writes its body to a pipe connected to the response
-// body. Once writes begin or finish() is called, the response is sent
-// on ch.
-type populateResponse struct {
-	res          *Response
-	ch           chan *Response
-	wroteHeader  bool
-	hasContent   bool
-	sentResponse bool
-	pw           *io.PipeWriter
-}
-
-func (pr *populateResponse) finish() {
-	if !pr.wroteHeader {
-		pr.WriteHeader(500)
-	}
-	if !pr.sentResponse {
-		pr.sendResponse()
-	}
-	pr.pw.Close()
-}
-
-func (pr *populateResponse) sendResponse() {
-	if pr.sentResponse {
-		return
-	}
-	pr.sentResponse = true
-
-	if pr.hasContent {
-		pr.res.ContentLength = -1
-	}
-	pr.ch <- pr.res
-}
-
-func (pr *populateResponse) Header() Header {
-	return pr.res.Header
-}
-
-func (pr *populateResponse) WriteHeader(code int) {
-	if pr.wroteHeader {
-		return
-	}
-	pr.wroteHeader = true
-
-	pr.res.StatusCode = code
-	pr.res.Status = fmt.Sprintf("%d %s", code, StatusText(code))
-}
-
-func (pr *populateResponse) Write(p []byte) (n int, err error) {
-	if !pr.wroteHeader {
-		pr.WriteHeader(StatusOK)
-	}
-	pr.hasContent = true
-	if !pr.sentResponse {
-		pr.sendResponse()
-	}
-	return pr.pw.Write(p)
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/filetransport_test.go b/third_party/gofrontend/libgo/go/net/http/filetransport_test.go
deleted file mode 100644
index 6f1a537..0000000
--- a/third_party/gofrontend/libgo/go/net/http/filetransport_test.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"testing"
-)
-
-func checker(t *testing.T) func(string, error) {
-	return func(call string, err error) {
-		if err == nil {
-			return
-		}
-		t.Fatalf("%s: %v", call, err)
-	}
-}
-
-func TestFileTransport(t *testing.T) {
-	check := checker(t)
-
-	dname, err := ioutil.TempDir("", "")
-	check("TempDir", err)
-	fname := filepath.Join(dname, "foo.txt")
-	err = ioutil.WriteFile(fname, []byte("Bar"), 0644)
-	check("WriteFile", err)
-	defer os.Remove(dname)
-	defer os.Remove(fname)
-
-	tr := &Transport{}
-	tr.RegisterProtocol("file", NewFileTransport(Dir(dname)))
-	c := &Client{Transport: tr}
-
-	fooURLs := []string{"file:///foo.txt", "file://../foo.txt"}
-	for _, urlstr := range fooURLs {
-		res, err := c.Get(urlstr)
-		check("Get "+urlstr, err)
-		if res.StatusCode != 200 {
-			t.Errorf("for %s, StatusCode = %d, want 200", urlstr, res.StatusCode)
-		}
-		if res.ContentLength != -1 {
-			t.Errorf("for %s, ContentLength = %d, want -1", urlstr, res.ContentLength)
-		}
-		if res.Body == nil {
-			t.Fatalf("for %s, nil Body", urlstr)
-		}
-		slurp, err := ioutil.ReadAll(res.Body)
-		check("ReadAll "+urlstr, err)
-		if string(slurp) != "Bar" {
-			t.Errorf("for %s, got content %q, want %q", urlstr, string(slurp), "Bar")
-		}
-	}
-
-	const badURL = "file://../no-exist.txt"
-	res, err := c.Get(badURL)
-	check("Get "+badURL, err)
-	if res.StatusCode != 404 {
-		t.Errorf("for %s, StatusCode = %d, want 404", badURL, res.StatusCode)
-	}
-	res.Body.Close()
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/fs.go b/third_party/gofrontend/libgo/go/net/http/fs.go
deleted file mode 100644
index 7572023..0000000
--- a/third_party/gofrontend/libgo/go/net/http/fs.go
+++ /dev/null
@@ -1,587 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// HTTP file system request handler
-
-package http
-
-import (
-	"errors"
-	"fmt"
-	"io"
-	"mime"
-	"mime/multipart"
-	"net/textproto"
-	"net/url"
-	"os"
-	"path"
-	"path/filepath"
-	"strconv"
-	"strings"
-	"time"
-)
-
-// A Dir implements FileSystem using the native file system restricted to a
-// specific directory tree.
-//
-// While the FileSystem.Open method takes '/'-separated paths, a Dir's string
-// value is a filename on the native file system, not a URL, so it is separated
-// by filepath.Separator, which isn't necessarily '/'.
-//
-// An empty Dir is treated as ".".
-type Dir string
-
-func (d Dir) Open(name string) (File, error) {
-	if filepath.Separator != '/' && strings.IndexRune(name, filepath.Separator) >= 0 ||
-		strings.Contains(name, "\x00") {
-		return nil, errors.New("http: invalid character in file path")
-	}
-	dir := string(d)
-	if dir == "" {
-		dir = "."
-	}
-	f, err := os.Open(filepath.Join(dir, filepath.FromSlash(path.Clean("/"+name))))
-	if err != nil {
-		return nil, err
-	}
-	return f, nil
-}
-
-// A FileSystem implements access to a collection of named files.
-// The elements in a file path are separated by slash ('/', U+002F)
-// characters, regardless of host operating system convention.
-type FileSystem interface {
-	Open(name string) (File, error)
-}
-
-// A File is returned by a FileSystem's Open method and can be
-// served by the FileServer implementation.
-//
-// The methods should behave the same as those on an *os.File.
-type File interface {
-	io.Closer
-	io.Reader
-	Readdir(count int) ([]os.FileInfo, error)
-	Seek(offset int64, whence int) (int64, error)
-	Stat() (os.FileInfo, error)
-}
-
-func dirList(w ResponseWriter, f File) {
-	w.Header().Set("Content-Type", "text/html; charset=utf-8")
-	fmt.Fprintf(w, "<pre>\n")
-	for {
-		dirs, err := f.Readdir(100)
-		if err != nil || len(dirs) == 0 {
-			break
-		}
-		for _, d := range dirs {
-			name := d.Name()
-			if d.IsDir() {
-				name += "/"
-			}
-			// name may contain '?' or '#', which must be escaped to remain
-			// part of the URL path, and not indicate the start of a query
-			// string or fragment.
-			url := url.URL{Path: name}
-			fmt.Fprintf(w, "<a href=\"%s\">%s</a>\n", url.String(), htmlReplacer.Replace(name))
-		}
-	}
-	fmt.Fprintf(w, "</pre>\n")
-}
-
-// ServeContent replies to the request using the content in the
-// provided ReadSeeker.  The main benefit of ServeContent over io.Copy
-// is that it handles Range requests properly, sets the MIME type, and
-// handles If-Modified-Since requests.
-//
-// If the response's Content-Type header is not set, ServeContent
-// first tries to deduce the type from name's file extension and,
-// if that fails, falls back to reading the first block of the content
-// and passing it to DetectContentType.
-// The name is otherwise unused; in particular it can be empty and is
-// never sent in the response.
-//
-// If modtime is not the zero time or Unix epoch, ServeContent
-// includes it in a Last-Modified header in the response.  If the
-// request includes an If-Modified-Since header, ServeContent uses
-// modtime to decide whether the content needs to be sent at all.
-//
-// The content's Seek method must work: ServeContent uses
-// a seek to the end of the content to determine its size.
-//
-// If the caller has set w's ETag header, ServeContent uses it to
-// handle requests using If-Range and If-None-Match.
-//
-// Note that *os.File implements the io.ReadSeeker interface.
-func ServeContent(w ResponseWriter, req *Request, name string, modtime time.Time, content io.ReadSeeker) {
-	sizeFunc := func() (int64, error) {
-		size, err := content.Seek(0, os.SEEK_END)
-		if err != nil {
-			return 0, errSeeker
-		}
-		_, err = content.Seek(0, os.SEEK_SET)
-		if err != nil {
-			return 0, errSeeker
-		}
-		return size, nil
-	}
-	serveContent(w, req, name, modtime, sizeFunc, content)
-}
-
-// errSeeker is returned by ServeContent's sizeFunc when the content
-// doesn't seek properly. The underlying Seeker's error text isn't
-// included in the sizeFunc reply so it's not sent over HTTP to end
-// users.
-var errSeeker = errors.New("seeker can't seek")
-
-// if name is empty, filename is unknown. (used for mime type, before sniffing)
-// if modtime.IsZero(), modtime is unknown.
-// content must be seeked to the beginning of the file.
-// The sizeFunc is called at most once. Its error, if any, is sent in the HTTP response.
-func serveContent(w ResponseWriter, r *Request, name string, modtime time.Time, sizeFunc func() (int64, error), content io.ReadSeeker) {
-	if checkLastModified(w, r, modtime) {
-		return
-	}
-	rangeReq, done := checkETag(w, r, modtime)
-	if done {
-		return
-	}
-
-	code := StatusOK
-
-	// If Content-Type isn't set, use the file's extension to find it, but
-	// if the Content-Type is unset explicitly, do not sniff the type.
-	ctypes, haveType := w.Header()["Content-Type"]
-	var ctype string
-	if !haveType {
-		ctype = mime.TypeByExtension(filepath.Ext(name))
-		if ctype == "" {
-			// read a chunk to decide between utf-8 text and binary
-			var buf [sniffLen]byte
-			n, _ := io.ReadFull(content, buf[:])
-			ctype = DetectContentType(buf[:n])
-			_, err := content.Seek(0, os.SEEK_SET) // rewind to output whole file
-			if err != nil {
-				Error(w, "seeker can't seek", StatusInternalServerError)
-				return
-			}
-		}
-		w.Header().Set("Content-Type", ctype)
-	} else if len(ctypes) > 0 {
-		ctype = ctypes[0]
-	}
-
-	size, err := sizeFunc()
-	if err != nil {
-		Error(w, err.Error(), StatusInternalServerError)
-		return
-	}
-
-	// handle Content-Range header.
-	sendSize := size
-	var sendContent io.Reader = content
-	if size >= 0 {
-		ranges, err := parseRange(rangeReq, size)
-		if err != nil {
-			Error(w, err.Error(), StatusRequestedRangeNotSatisfiable)
-			return
-		}
-		if sumRangesSize(ranges) > size {
-			// The total number of bytes in all the ranges
-			// is larger than the size of the file by
-			// itself, so this is probably an attack, or a
-			// dumb client.  Ignore the range request.
-			ranges = nil
-		}
-		switch {
-		case len(ranges) == 1:
-			// RFC 2616, Section 14.16:
-			// "When an HTTP message includes the content of a single
-			// range (for example, a response to a request for a
-			// single range, or to a request for a set of ranges
-			// that overlap without any holes), this content is
-			// transmitted with a Content-Range header, and a
-			// Content-Length header showing the number of bytes
-			// actually transferred.
-			// ...
-			// A response to a request for a single range MUST NOT
-			// be sent using the multipart/byteranges media type."
-			ra := ranges[0]
-			if _, err := content.Seek(ra.start, os.SEEK_SET); err != nil {
-				Error(w, err.Error(), StatusRequestedRangeNotSatisfiable)
-				return
-			}
-			sendSize = ra.length
-			code = StatusPartialContent
-			w.Header().Set("Content-Range", ra.contentRange(size))
-		case len(ranges) > 1:
-			sendSize = rangesMIMESize(ranges, ctype, size)
-			code = StatusPartialContent
-
-			pr, pw := io.Pipe()
-			mw := multipart.NewWriter(pw)
-			w.Header().Set("Content-Type", "multipart/byteranges; boundary="+mw.Boundary())
-			sendContent = pr
-			defer pr.Close() // cause writing goroutine to fail and exit if CopyN doesn't finish.
-			go func() {
-				for _, ra := range ranges {
-					part, err := mw.CreatePart(ra.mimeHeader(ctype, size))
-					if err != nil {
-						pw.CloseWithError(err)
-						return
-					}
-					if _, err := content.Seek(ra.start, os.SEEK_SET); err != nil {
-						pw.CloseWithError(err)
-						return
-					}
-					if _, err := io.CopyN(part, content, ra.length); err != nil {
-						pw.CloseWithError(err)
-						return
-					}
-				}
-				mw.Close()
-				pw.Close()
-			}()
-		}
-
-		w.Header().Set("Accept-Ranges", "bytes")
-		if w.Header().Get("Content-Encoding") == "" {
-			w.Header().Set("Content-Length", strconv.FormatInt(sendSize, 10))
-		}
-	}
-
-	w.WriteHeader(code)
-
-	if r.Method != "HEAD" {
-		io.CopyN(w, sendContent, sendSize)
-	}
-}
-
-var unixEpochTime = time.Unix(0, 0)
-
-// modtime is the modification time of the resource to be served, or IsZero().
-// return value is whether this request is now complete.
-func checkLastModified(w ResponseWriter, r *Request, modtime time.Time) bool {
-	if modtime.IsZero() || modtime.Equal(unixEpochTime) {
-		// If the file doesn't have a modtime (IsZero), or the modtime
-		// is obviously garbage (Unix time == 0), then ignore modtimes
-		// and don't process the If-Modified-Since header.
-		return false
-	}
-
-	// The Date-Modified header truncates sub-second precision, so
-	// use mtime < t+1s instead of mtime <= t to check for unmodified.
-	if t, err := time.Parse(TimeFormat, r.Header.Get("If-Modified-Since")); err == nil && modtime.Before(t.Add(1*time.Second)) {
-		h := w.Header()
-		delete(h, "Content-Type")
-		delete(h, "Content-Length")
-		w.WriteHeader(StatusNotModified)
-		return true
-	}
-	w.Header().Set("Last-Modified", modtime.UTC().Format(TimeFormat))
-	return false
-}
-
-// checkETag implements If-None-Match and If-Range checks.
-//
-// The ETag or modtime must have been previously set in the
-// ResponseWriter's headers.  The modtime is only compared at second
-// granularity and may be the zero value to mean unknown.
-//
-// The return value is the effective request "Range" header to use and
-// whether this request is now considered done.
-func checkETag(w ResponseWriter, r *Request, modtime time.Time) (rangeReq string, done bool) {
-	etag := w.Header().get("Etag")
-	rangeReq = r.Header.get("Range")
-
-	// Invalidate the range request if the entity doesn't match the one
-	// the client was expecting.
-	// "If-Range: version" means "ignore the Range: header unless version matches the
-	// current file."
-	// We only support ETag versions.
-	// The caller must have set the ETag on the response already.
-	if ir := r.Header.get("If-Range"); ir != "" && ir != etag {
-		// The If-Range value is typically the ETag value, but it may also be
-		// the modtime date. See golang.org/issue/8367.
-		timeMatches := false
-		if !modtime.IsZero() {
-			if t, err := ParseTime(ir); err == nil && t.Unix() == modtime.Unix() {
-				timeMatches = true
-			}
-		}
-		if !timeMatches {
-			rangeReq = ""
-		}
-	}
-
-	if inm := r.Header.get("If-None-Match"); inm != "" {
-		// Must know ETag.
-		if etag == "" {
-			return rangeReq, false
-		}
-
-		// TODO(bradfitz): non-GET/HEAD requests require more work:
-		// sending a different status code on matches, and
-		// also can't use weak cache validators (those with a "W/
-		// prefix).  But most users of ServeContent will be using
-		// it on GET or HEAD, so only support those for now.
-		if r.Method != "GET" && r.Method != "HEAD" {
-			return rangeReq, false
-		}
-
-		// TODO(bradfitz): deal with comma-separated or multiple-valued
-		// list of If-None-match values.  For now just handle the common
-		// case of a single item.
-		if inm == etag || inm == "*" {
-			h := w.Header()
-			delete(h, "Content-Type")
-			delete(h, "Content-Length")
-			w.WriteHeader(StatusNotModified)
-			return "", true
-		}
-	}
-	return rangeReq, false
-}
-
-// name is '/'-separated, not filepath.Separator.
-func serveFile(w ResponseWriter, r *Request, fs FileSystem, name string, redirect bool) {
-	const indexPage = "/index.html"
-
-	// redirect .../index.html to .../
-	// can't use Redirect() because that would make the path absolute,
-	// which would be a problem running under StripPrefix
-	if strings.HasSuffix(r.URL.Path, indexPage) {
-		localRedirect(w, r, "./")
-		return
-	}
-
-	f, err := fs.Open(name)
-	if err != nil {
-		msg, code := toHTTPError(err)
-		Error(w, msg, code)
-		return
-	}
-	defer f.Close()
-
-	d, err1 := f.Stat()
-	if err1 != nil {
-		msg, code := toHTTPError(err)
-		Error(w, msg, code)
-		return
-	}
-
-	if redirect {
-		// redirect to canonical path: / at end of directory url
-		// r.URL.Path always begins with /
-		url := r.URL.Path
-		if d.IsDir() {
-			if url[len(url)-1] != '/' {
-				localRedirect(w, r, path.Base(url)+"/")
-				return
-			}
-		} else {
-			if url[len(url)-1] == '/' {
-				localRedirect(w, r, "../"+path.Base(url))
-				return
-			}
-		}
-	}
-
-	// use contents of index.html for directory, if present
-	if d.IsDir() {
-		index := strings.TrimSuffix(name, "/") + indexPage
-		ff, err := fs.Open(index)
-		if err == nil {
-			defer ff.Close()
-			dd, err := ff.Stat()
-			if err == nil {
-				name = index
-				d = dd
-				f = ff
-			}
-		}
-	}
-
-	// Still a directory? (we didn't find an index.html file)
-	if d.IsDir() {
-		if checkLastModified(w, r, d.ModTime()) {
-			return
-		}
-		dirList(w, f)
-		return
-	}
-
-	// serveContent will check modification time
-	sizeFunc := func() (int64, error) { return d.Size(), nil }
-	serveContent(w, r, d.Name(), d.ModTime(), sizeFunc, f)
-}
-
-// toHTTPError returns a non-specific HTTP error message and status code
-// for a given non-nil error value. It's important that toHTTPError does not
-// actually return err.Error(), since msg and httpStatus are returned to users,
-// and historically Go's ServeContent always returned just "404 Not Found" for
-// all errors. We don't want to start leaking information in error messages.
-func toHTTPError(err error) (msg string, httpStatus int) {
-	if os.IsNotExist(err) {
-		return "404 page not found", StatusNotFound
-	}
-	if os.IsPermission(err) {
-		return "403 Forbidden", StatusForbidden
-	}
-	// Default:
-	return "500 Internal Server Error", StatusInternalServerError
-}
-
-// localRedirect gives a Moved Permanently response.
-// It does not convert relative paths to absolute paths like Redirect does.
-func localRedirect(w ResponseWriter, r *Request, newPath string) {
-	if q := r.URL.RawQuery; q != "" {
-		newPath += "?" + q
-	}
-	w.Header().Set("Location", newPath)
-	w.WriteHeader(StatusMovedPermanently)
-}
-
-// ServeFile replies to the request with the contents of the named
-// file or directory.
-//
-// As a special case, ServeFile redirects any request where r.URL.Path
-// ends in "/index.html" to the same path, without the final
-// "index.html". To avoid such redirects either modify the path or
-// use ServeContent.
-func ServeFile(w ResponseWriter, r *Request, name string) {
-	dir, file := filepath.Split(name)
-	serveFile(w, r, Dir(dir), file, false)
-}
-
-type fileHandler struct {
-	root FileSystem
-}
-
-// FileServer returns a handler that serves HTTP requests
-// with the contents of the file system rooted at root.
-//
-// To use the operating system's file system implementation,
-// use http.Dir:
-//
-//     http.Handle("/", http.FileServer(http.Dir("/tmp")))
-//
-// As a special case, the returned file server redirects any request
-// ending in "/index.html" to the same path, without the final
-// "index.html".
-func FileServer(root FileSystem) Handler {
-	return &fileHandler{root}
-}
-
-func (f *fileHandler) ServeHTTP(w ResponseWriter, r *Request) {
-	upath := r.URL.Path
-	if !strings.HasPrefix(upath, "/") {
-		upath = "/" + upath
-		r.URL.Path = upath
-	}
-	serveFile(w, r, f.root, path.Clean(upath), true)
-}
-
-// httpRange specifies the byte range to be sent to the client.
-type httpRange struct {
-	start, length int64
-}
-
-func (r httpRange) contentRange(size int64) string {
-	return fmt.Sprintf("bytes %d-%d/%d", r.start, r.start+r.length-1, size)
-}
-
-func (r httpRange) mimeHeader(contentType string, size int64) textproto.MIMEHeader {
-	return textproto.MIMEHeader{
-		"Content-Range": {r.contentRange(size)},
-		"Content-Type":  {contentType},
-	}
-}
-
-// parseRange parses a Range header string as per RFC 2616.
-func parseRange(s string, size int64) ([]httpRange, error) {
-	if s == "" {
-		return nil, nil // header not present
-	}
-	const b = "bytes="
-	if !strings.HasPrefix(s, b) {
-		return nil, errors.New("invalid range")
-	}
-	var ranges []httpRange
-	for _, ra := range strings.Split(s[len(b):], ",") {
-		ra = strings.TrimSpace(ra)
-		if ra == "" {
-			continue
-		}
-		i := strings.Index(ra, "-")
-		if i < 0 {
-			return nil, errors.New("invalid range")
-		}
-		start, end := strings.TrimSpace(ra[:i]), strings.TrimSpace(ra[i+1:])
-		var r httpRange
-		if start == "" {
-			// If no start is specified, end specifies the
-			// range start relative to the end of the file.
-			i, err := strconv.ParseInt(end, 10, 64)
-			if err != nil {
-				return nil, errors.New("invalid range")
-			}
-			if i > size {
-				i = size
-			}
-			r.start = size - i
-			r.length = size - r.start
-		} else {
-			i, err := strconv.ParseInt(start, 10, 64)
-			if err != nil || i >= size || i < 0 {
-				return nil, errors.New("invalid range")
-			}
-			r.start = i
-			if end == "" {
-				// If no end is specified, range extends to end of the file.
-				r.length = size - r.start
-			} else {
-				i, err := strconv.ParseInt(end, 10, 64)
-				if err != nil || r.start > i {
-					return nil, errors.New("invalid range")
-				}
-				if i >= size {
-					i = size - 1
-				}
-				r.length = i - r.start + 1
-			}
-		}
-		ranges = append(ranges, r)
-	}
-	return ranges, nil
-}
-
-// countingWriter counts how many bytes have been written to it.
-type countingWriter int64
-
-func (w *countingWriter) Write(p []byte) (n int, err error) {
-	*w += countingWriter(len(p))
-	return len(p), nil
-}
-
-// rangesMIMESize returns the number of bytes it takes to encode the
-// provided ranges as a multipart response.
-func rangesMIMESize(ranges []httpRange, contentType string, contentSize int64) (encSize int64) {
-	var w countingWriter
-	mw := multipart.NewWriter(&w)
-	for _, ra := range ranges {
-		mw.CreatePart(ra.mimeHeader(contentType, contentSize))
-		encSize += ra.length
-	}
-	mw.Close()
-	encSize += int64(w)
-	return
-}
-
-func sumRangesSize(ranges []httpRange) (size int64) {
-	for _, ra := range ranges {
-		size += ra.length
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/fs_test.go b/third_party/gofrontend/libgo/go/net/http/fs_test.go
deleted file mode 100644
index 538f34d..0000000
--- a/third_party/gofrontend/libgo/go/net/http/fs_test.go
+++ /dev/null
@@ -1,965 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http_test
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"mime"
-	"mime/multipart"
-	"net"
-	. "net/http"
-	"net/http/httptest"
-	"net/url"
-	"os"
-	"os/exec"
-	"path"
-	"path/filepath"
-	"reflect"
-	"regexp"
-	"runtime"
-	"strconv"
-	"strings"
-	"testing"
-	"time"
-)
-
-const (
-	testFile    = "testdata/file"
-	testFileLen = 11
-)
-
-type wantRange struct {
-	start, end int64 // range [start,end)
-}
-
-var itoa = strconv.Itoa
-
-var ServeFileRangeTests = []struct {
-	r      string
-	code   int
-	ranges []wantRange
-}{
-	{r: "", code: StatusOK},
-	{r: "bytes=0-4", code: StatusPartialContent, ranges: []wantRange{{0, 5}}},
-	{r: "bytes=2-", code: StatusPartialContent, ranges: []wantRange{{2, testFileLen}}},
-	{r: "bytes=-5", code: StatusPartialContent, ranges: []wantRange{{testFileLen - 5, testFileLen}}},
-	{r: "bytes=3-7", code: StatusPartialContent, ranges: []wantRange{{3, 8}}},
-	{r: "bytes=0-0,-2", code: StatusPartialContent, ranges: []wantRange{{0, 1}, {testFileLen - 2, testFileLen}}},
-	{r: "bytes=0-1,5-8", code: StatusPartialContent, ranges: []wantRange{{0, 2}, {5, 9}}},
-	{r: "bytes=0-1,5-", code: StatusPartialContent, ranges: []wantRange{{0, 2}, {5, testFileLen}}},
-	{r: "bytes=5-1000", code: StatusPartialContent, ranges: []wantRange{{5, testFileLen}}},
-	{r: "bytes=0-,1-,2-,3-,4-", code: StatusOK}, // ignore wasteful range request
-	{r: "bytes=0-9", code: StatusPartialContent, ranges: []wantRange{{0, testFileLen - 1}}},
-	{r: "bytes=0-10", code: StatusPartialContent, ranges: []wantRange{{0, testFileLen}}},
-	{r: "bytes=0-11", code: StatusPartialContent, ranges: []wantRange{{0, testFileLen}}},
-	{r: "bytes=10-11", code: StatusPartialContent, ranges: []wantRange{{testFileLen - 1, testFileLen}}},
-	{r: "bytes=10-", code: StatusPartialContent, ranges: []wantRange{{testFileLen - 1, testFileLen}}},
-	{r: "bytes=11-", code: StatusRequestedRangeNotSatisfiable},
-	{r: "bytes=11-12", code: StatusRequestedRangeNotSatisfiable},
-	{r: "bytes=12-12", code: StatusRequestedRangeNotSatisfiable},
-	{r: "bytes=11-100", code: StatusRequestedRangeNotSatisfiable},
-	{r: "bytes=12-100", code: StatusRequestedRangeNotSatisfiable},
-	{r: "bytes=100-", code: StatusRequestedRangeNotSatisfiable},
-	{r: "bytes=100-1000", code: StatusRequestedRangeNotSatisfiable},
-}
-
-func TestServeFile(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		ServeFile(w, r, "testdata/file")
-	}))
-	defer ts.Close()
-
-	var err error
-
-	file, err := ioutil.ReadFile(testFile)
-	if err != nil {
-		t.Fatal("reading file:", err)
-	}
-
-	// set up the Request (re-used for all tests)
-	var req Request
-	req.Header = make(Header)
-	if req.URL, err = url.Parse(ts.URL); err != nil {
-		t.Fatal("ParseURL:", err)
-	}
-	req.Method = "GET"
-
-	// straight GET
-	_, body := getBody(t, "straight get", req)
-	if !bytes.Equal(body, file) {
-		t.Fatalf("body mismatch: got %q, want %q", body, file)
-	}
-
-	// Range tests
-Cases:
-	for _, rt := range ServeFileRangeTests {
-		if rt.r != "" {
-			req.Header.Set("Range", rt.r)
-		}
-		resp, body := getBody(t, fmt.Sprintf("range test %q", rt.r), req)
-		if resp.StatusCode != rt.code {
-			t.Errorf("range=%q: StatusCode=%d, want %d", rt.r, resp.StatusCode, rt.code)
-		}
-		if rt.code == StatusRequestedRangeNotSatisfiable {
-			continue
-		}
-		wantContentRange := ""
-		if len(rt.ranges) == 1 {
-			rng := rt.ranges[0]
-			wantContentRange = fmt.Sprintf("bytes %d-%d/%d", rng.start, rng.end-1, testFileLen)
-		}
-		cr := resp.Header.Get("Content-Range")
-		if cr != wantContentRange {
-			t.Errorf("range=%q: Content-Range = %q, want %q", rt.r, cr, wantContentRange)
-		}
-		ct := resp.Header.Get("Content-Type")
-		if len(rt.ranges) == 1 {
-			rng := rt.ranges[0]
-			wantBody := file[rng.start:rng.end]
-			if !bytes.Equal(body, wantBody) {
-				t.Errorf("range=%q: body = %q, want %q", rt.r, body, wantBody)
-			}
-			if strings.HasPrefix(ct, "multipart/byteranges") {
-				t.Errorf("range=%q content-type = %q; unexpected multipart/byteranges", rt.r, ct)
-			}
-		}
-		if len(rt.ranges) > 1 {
-			typ, params, err := mime.ParseMediaType(ct)
-			if err != nil {
-				t.Errorf("range=%q content-type = %q; %v", rt.r, ct, err)
-				continue
-			}
-			if typ != "multipart/byteranges" {
-				t.Errorf("range=%q content-type = %q; want multipart/byteranges", rt.r, typ)
-				continue
-			}
-			if params["boundary"] == "" {
-				t.Errorf("range=%q content-type = %q; lacks boundary", rt.r, ct)
-				continue
-			}
-			if g, w := resp.ContentLength, int64(len(body)); g != w {
-				t.Errorf("range=%q Content-Length = %d; want %d", rt.r, g, w)
-				continue
-			}
-			mr := multipart.NewReader(bytes.NewReader(body), params["boundary"])
-			for ri, rng := range rt.ranges {
-				part, err := mr.NextPart()
-				if err != nil {
-					t.Errorf("range=%q, reading part index %d: %v", rt.r, ri, err)
-					continue Cases
-				}
-				wantContentRange = fmt.Sprintf("bytes %d-%d/%d", rng.start, rng.end-1, testFileLen)
-				if g, w := part.Header.Get("Content-Range"), wantContentRange; g != w {
-					t.Errorf("range=%q: part Content-Range = %q; want %q", rt.r, g, w)
-				}
-				body, err := ioutil.ReadAll(part)
-				if err != nil {
-					t.Errorf("range=%q, reading part index %d body: %v", rt.r, ri, err)
-					continue Cases
-				}
-				wantBody := file[rng.start:rng.end]
-				if !bytes.Equal(body, wantBody) {
-					t.Errorf("range=%q: body = %q, want %q", rt.r, body, wantBody)
-				}
-			}
-			_, err = mr.NextPart()
-			if err != io.EOF {
-				t.Errorf("range=%q; expected final error io.EOF; got %v", rt.r, err)
-			}
-		}
-	}
-}
-
-var fsRedirectTestData = []struct {
-	original, redirect string
-}{
-	{"/test/index.html", "/test/"},
-	{"/test/testdata", "/test/testdata/"},
-	{"/test/testdata/file/", "/test/testdata/file"},
-}
-
-func TestFSRedirect(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(StripPrefix("/test", FileServer(Dir("."))))
-	defer ts.Close()
-
-	for _, data := range fsRedirectTestData {
-		res, err := Get(ts.URL + data.original)
-		if err != nil {
-			t.Fatal(err)
-		}
-		res.Body.Close()
-		if g, e := res.Request.URL.Path, data.redirect; g != e {
-			t.Errorf("redirect from %s: got %s, want %s", data.original, g, e)
-		}
-	}
-}
-
-type testFileSystem struct {
-	open func(name string) (File, error)
-}
-
-func (fs *testFileSystem) Open(name string) (File, error) {
-	return fs.open(name)
-}
-
-func TestFileServerCleans(t *testing.T) {
-	defer afterTest(t)
-	ch := make(chan string, 1)
-	fs := FileServer(&testFileSystem{func(name string) (File, error) {
-		ch <- name
-		return nil, errors.New("file does not exist")
-	}})
-	tests := []struct {
-		reqPath, openArg string
-	}{
-		{"/foo.txt", "/foo.txt"},
-		{"//foo.txt", "/foo.txt"},
-		{"/../foo.txt", "/foo.txt"},
-	}
-	req, _ := NewRequest("GET", "http://example.com", nil)
-	for n, test := range tests {
-		rec := httptest.NewRecorder()
-		req.URL.Path = test.reqPath
-		fs.ServeHTTP(rec, req)
-		if got := <-ch; got != test.openArg {
-			t.Errorf("test %d: got %q, want %q", n, got, test.openArg)
-		}
-	}
-}
-
-func TestFileServerEscapesNames(t *testing.T) {
-	defer afterTest(t)
-	const dirListPrefix = "<pre>\n"
-	const dirListSuffix = "\n</pre>\n"
-	tests := []struct {
-		name, escaped string
-	}{
-		{`simple_name`, `<a href="simple_name">simple_name</a>`},
-		{`"'<>&`, `<a href="%22%27%3C%3E&">&#34;&#39;&lt;&gt;&amp;</a>`},
-		{`?foo=bar#baz`, `<a href="%3Ffoo=bar%23baz">?foo=bar#baz</a>`},
-		{`<combo>?foo`, `<a href="%3Ccombo%3E%3Ffoo">&lt;combo&gt;?foo</a>`},
-	}
-
-	// We put each test file in its own directory in the fakeFS so we can look at it in isolation.
-	fs := make(fakeFS)
-	for i, test := range tests {
-		testFile := &fakeFileInfo{basename: test.name}
-		fs[fmt.Sprintf("/%d", i)] = &fakeFileInfo{
-			dir:     true,
-			modtime: time.Unix(1000000000, 0).UTC(),
-			ents:    []*fakeFileInfo{testFile},
-		}
-		fs[fmt.Sprintf("/%d/%s", i, test.name)] = testFile
-	}
-
-	ts := httptest.NewServer(FileServer(&fs))
-	defer ts.Close()
-	for i, test := range tests {
-		url := fmt.Sprintf("%s/%d", ts.URL, i)
-		res, err := Get(url)
-		if err != nil {
-			t.Fatalf("test %q: Get: %v", test.name, err)
-		}
-		b, err := ioutil.ReadAll(res.Body)
-		if err != nil {
-			t.Fatalf("test %q: read Body: %v", test.name, err)
-		}
-		s := string(b)
-		if !strings.HasPrefix(s, dirListPrefix) || !strings.HasSuffix(s, dirListSuffix) {
-			t.Errorf("test %q: listing dir, full output is %q, want prefix %q and suffix %q", test.name, s, dirListPrefix, dirListSuffix)
-		}
-		if trimmed := strings.TrimSuffix(strings.TrimPrefix(s, dirListPrefix), dirListSuffix); trimmed != test.escaped {
-			t.Errorf("test %q: listing dir, filename escaped to %q, want %q", test.name, trimmed, test.escaped)
-		}
-		res.Body.Close()
-	}
-}
-
-func mustRemoveAll(dir string) {
-	err := os.RemoveAll(dir)
-	if err != nil {
-		panic(err)
-	}
-}
-
-func TestFileServerImplicitLeadingSlash(t *testing.T) {
-	defer afterTest(t)
-	tempDir, err := ioutil.TempDir("", "")
-	if err != nil {
-		t.Fatalf("TempDir: %v", err)
-	}
-	defer mustRemoveAll(tempDir)
-	if err := ioutil.WriteFile(filepath.Join(tempDir, "foo.txt"), []byte("Hello world"), 0644); err != nil {
-		t.Fatalf("WriteFile: %v", err)
-	}
-	ts := httptest.NewServer(StripPrefix("/bar/", FileServer(Dir(tempDir))))
-	defer ts.Close()
-	get := func(suffix string) string {
-		res, err := Get(ts.URL + suffix)
-		if err != nil {
-			t.Fatalf("Get %s: %v", suffix, err)
-		}
-		b, err := ioutil.ReadAll(res.Body)
-		if err != nil {
-			t.Fatalf("ReadAll %s: %v", suffix, err)
-		}
-		res.Body.Close()
-		return string(b)
-	}
-	if s := get("/bar/"); !strings.Contains(s, ">foo.txt<") {
-		t.Logf("expected a directory listing with foo.txt, got %q", s)
-	}
-	if s := get("/bar/foo.txt"); s != "Hello world" {
-		t.Logf("expected %q, got %q", "Hello world", s)
-	}
-}
-
-func TestDirJoin(t *testing.T) {
-	if runtime.GOOS == "windows" {
-		t.Skip("skipping test on windows")
-	}
-	wfi, err := os.Stat("/etc/hosts")
-	if err != nil {
-		t.Skip("skipping test; no /etc/hosts file")
-	}
-	test := func(d Dir, name string) {
-		f, err := d.Open(name)
-		if err != nil {
-			t.Fatalf("open of %s: %v", name, err)
-		}
-		defer f.Close()
-		gfi, err := f.Stat()
-		if err != nil {
-			t.Fatalf("stat of %s: %v", name, err)
-		}
-		if !os.SameFile(gfi, wfi) {
-			t.Errorf("%s got different file", name)
-		}
-	}
-	test(Dir("/etc/"), "/hosts")
-	test(Dir("/etc/"), "hosts")
-	test(Dir("/etc/"), "../../../../hosts")
-	test(Dir("/etc"), "/hosts")
-	test(Dir("/etc"), "hosts")
-	test(Dir("/etc"), "../../../../hosts")
-
-	// Not really directories, but since we use this trick in
-	// ServeFile, test it:
-	test(Dir("/etc/hosts"), "")
-	test(Dir("/etc/hosts"), "/")
-	test(Dir("/etc/hosts"), "../")
-}
-
-func TestEmptyDirOpenCWD(t *testing.T) {
-	test := func(d Dir) {
-		name := "fs_test.go"
-		f, err := d.Open(name)
-		if err != nil {
-			t.Fatalf("open of %s: %v", name, err)
-		}
-		defer f.Close()
-	}
-	test(Dir(""))
-	test(Dir("."))
-	test(Dir("./"))
-}
-
-func TestServeFileContentType(t *testing.T) {
-	defer afterTest(t)
-	const ctype = "icecream/chocolate"
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		switch r.FormValue("override") {
-		case "1":
-			w.Header().Set("Content-Type", ctype)
-		case "2":
-			// Explicitly inhibit sniffing.
-			w.Header()["Content-Type"] = []string{}
-		}
-		ServeFile(w, r, "testdata/file")
-	}))
-	defer ts.Close()
-	get := func(override string, want []string) {
-		resp, err := Get(ts.URL + "?override=" + override)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if h := resp.Header["Content-Type"]; !reflect.DeepEqual(h, want) {
-			t.Errorf("Content-Type mismatch: got %v, want %v", h, want)
-		}
-		resp.Body.Close()
-	}
-	get("0", []string{"text/plain; charset=utf-8"})
-	get("1", []string{ctype})
-	get("2", nil)
-}
-
-func TestServeFileMimeType(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		ServeFile(w, r, "testdata/style.css")
-	}))
-	defer ts.Close()
-	resp, err := Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	resp.Body.Close()
-	want := "text/css; charset=utf-8"
-	if h := resp.Header.Get("Content-Type"); h != want {
-		t.Errorf("Content-Type mismatch: got %q, want %q", h, want)
-	}
-}
-
-func TestServeFileFromCWD(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		ServeFile(w, r, "fs_test.go")
-	}))
-	defer ts.Close()
-	r, err := Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	r.Body.Close()
-	if r.StatusCode != 200 {
-		t.Fatalf("expected 200 OK, got %s", r.Status)
-	}
-}
-
-func TestServeFileWithContentEncoding(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Content-Encoding", "foo")
-		ServeFile(w, r, "testdata/file")
-	}))
-	defer ts.Close()
-	resp, err := Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	resp.Body.Close()
-	if g, e := resp.ContentLength, int64(-1); g != e {
-		t.Errorf("Content-Length mismatch: got %d, want %d", g, e)
-	}
-}
-
-func TestServeIndexHtml(t *testing.T) {
-	defer afterTest(t)
-	const want = "index.html says hello\n"
-	ts := httptest.NewServer(FileServer(Dir(".")))
-	defer ts.Close()
-
-	for _, path := range []string{"/testdata/", "/testdata/index.html"} {
-		res, err := Get(ts.URL + path)
-		if err != nil {
-			t.Fatal(err)
-		}
-		b, err := ioutil.ReadAll(res.Body)
-		if err != nil {
-			t.Fatal("reading Body:", err)
-		}
-		if s := string(b); s != want {
-			t.Errorf("for path %q got %q, want %q", path, s, want)
-		}
-		res.Body.Close()
-	}
-}
-
-func TestFileServerZeroByte(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(FileServer(Dir(".")))
-	defer ts.Close()
-
-	res, err := Get(ts.URL + "/..\x00")
-	if err != nil {
-		t.Fatal(err)
-	}
-	b, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Fatal("reading Body:", err)
-	}
-	if res.StatusCode == 200 {
-		t.Errorf("got status 200; want an error. Body is:\n%s", string(b))
-	}
-}
-
-type fakeFileInfo struct {
-	dir      bool
-	basename string
-	modtime  time.Time
-	ents     []*fakeFileInfo
-	contents string
-	err      error
-}
-
-func (f *fakeFileInfo) Name() string       { return f.basename }
-func (f *fakeFileInfo) Sys() interface{}   { return nil }
-func (f *fakeFileInfo) ModTime() time.Time { return f.modtime }
-func (f *fakeFileInfo) IsDir() bool        { return f.dir }
-func (f *fakeFileInfo) Size() int64        { return int64(len(f.contents)) }
-func (f *fakeFileInfo) Mode() os.FileMode {
-	if f.dir {
-		return 0755 | os.ModeDir
-	}
-	return 0644
-}
-
-type fakeFile struct {
-	io.ReadSeeker
-	fi     *fakeFileInfo
-	path   string // as opened
-	entpos int
-}
-
-func (f *fakeFile) Close() error               { return nil }
-func (f *fakeFile) Stat() (os.FileInfo, error) { return f.fi, nil }
-func (f *fakeFile) Readdir(count int) ([]os.FileInfo, error) {
-	if !f.fi.dir {
-		return nil, os.ErrInvalid
-	}
-	var fis []os.FileInfo
-
-	limit := f.entpos + count
-	if count <= 0 || limit > len(f.fi.ents) {
-		limit = len(f.fi.ents)
-	}
-	for ; f.entpos < limit; f.entpos++ {
-		fis = append(fis, f.fi.ents[f.entpos])
-	}
-
-	if len(fis) == 0 && count > 0 {
-		return fis, io.EOF
-	} else {
-		return fis, nil
-	}
-}
-
-type fakeFS map[string]*fakeFileInfo
-
-func (fs fakeFS) Open(name string) (File, error) {
-	name = path.Clean(name)
-	f, ok := fs[name]
-	if !ok {
-		return nil, os.ErrNotExist
-	}
-	if f.err != nil {
-		return nil, f.err
-	}
-	return &fakeFile{ReadSeeker: strings.NewReader(f.contents), fi: f, path: name}, nil
-}
-
-func TestDirectoryIfNotModified(t *testing.T) {
-	defer afterTest(t)
-	const indexContents = "I am a fake index.html file"
-	fileMod := time.Unix(1000000000, 0).UTC()
-	fileModStr := fileMod.Format(TimeFormat)
-	dirMod := time.Unix(123, 0).UTC()
-	indexFile := &fakeFileInfo{
-		basename: "index.html",
-		modtime:  fileMod,
-		contents: indexContents,
-	}
-	fs := fakeFS{
-		"/": &fakeFileInfo{
-			dir:     true,
-			modtime: dirMod,
-			ents:    []*fakeFileInfo{indexFile},
-		},
-		"/index.html": indexFile,
-	}
-
-	ts := httptest.NewServer(FileServer(fs))
-	defer ts.Close()
-
-	res, err := Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	b, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if string(b) != indexContents {
-		t.Fatalf("Got body %q; want %q", b, indexContents)
-	}
-	res.Body.Close()
-
-	lastMod := res.Header.Get("Last-Modified")
-	if lastMod != fileModStr {
-		t.Fatalf("initial Last-Modified = %q; want %q", lastMod, fileModStr)
-	}
-
-	req, _ := NewRequest("GET", ts.URL, nil)
-	req.Header.Set("If-Modified-Since", lastMod)
-
-	res, err = DefaultClient.Do(req)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if res.StatusCode != 304 {
-		t.Fatalf("Code after If-Modified-Since request = %v; want 304", res.StatusCode)
-	}
-	res.Body.Close()
-
-	// Advance the index.html file's modtime, but not the directory's.
-	indexFile.modtime = indexFile.modtime.Add(1 * time.Hour)
-
-	res, err = DefaultClient.Do(req)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if res.StatusCode != 200 {
-		t.Fatalf("Code after second If-Modified-Since request = %v; want 200; res is %#v", res.StatusCode, res)
-	}
-	res.Body.Close()
-}
-
-func mustStat(t *testing.T, fileName string) os.FileInfo {
-	fi, err := os.Stat(fileName)
-	if err != nil {
-		t.Fatal(err)
-	}
-	return fi
-}
-
-func TestServeContent(t *testing.T) {
-	defer afterTest(t)
-	type serveParam struct {
-		name        string
-		modtime     time.Time
-		content     io.ReadSeeker
-		contentType string
-		etag        string
-	}
-	servec := make(chan serveParam, 1)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		p := <-servec
-		if p.etag != "" {
-			w.Header().Set("ETag", p.etag)
-		}
-		if p.contentType != "" {
-			w.Header().Set("Content-Type", p.contentType)
-		}
-		ServeContent(w, r, p.name, p.modtime, p.content)
-	}))
-	defer ts.Close()
-
-	type testCase struct {
-		// One of file or content must be set:
-		file    string
-		content io.ReadSeeker
-
-		modtime          time.Time
-		serveETag        string // optional
-		serveContentType string // optional
-		reqHeader        map[string]string
-		wantLastMod      string
-		wantContentType  string
-		wantStatus       int
-	}
-	htmlModTime := mustStat(t, "testdata/index.html").ModTime()
-	tests := map[string]testCase{
-		"no_last_modified": {
-			file:            "testdata/style.css",
-			wantContentType: "text/css; charset=utf-8",
-			wantStatus:      200,
-		},
-		"with_last_modified": {
-			file:            "testdata/index.html",
-			wantContentType: "text/html; charset=utf-8",
-			modtime:         htmlModTime,
-			wantLastMod:     htmlModTime.UTC().Format(TimeFormat),
-			wantStatus:      200,
-		},
-		"not_modified_modtime": {
-			file:    "testdata/style.css",
-			modtime: htmlModTime,
-			reqHeader: map[string]string{
-				"If-Modified-Since": htmlModTime.UTC().Format(TimeFormat),
-			},
-			wantStatus: 304,
-		},
-		"not_modified_modtime_with_contenttype": {
-			file:             "testdata/style.css",
-			serveContentType: "text/css", // explicit content type
-			modtime:          htmlModTime,
-			reqHeader: map[string]string{
-				"If-Modified-Since": htmlModTime.UTC().Format(TimeFormat),
-			},
-			wantStatus: 304,
-		},
-		"not_modified_etag": {
-			file:      "testdata/style.css",
-			serveETag: `"foo"`,
-			reqHeader: map[string]string{
-				"If-None-Match": `"foo"`,
-			},
-			wantStatus: 304,
-		},
-		"not_modified_etag_no_seek": {
-			content:   panicOnSeek{nil}, // should never be called
-			serveETag: `"foo"`,
-			reqHeader: map[string]string{
-				"If-None-Match": `"foo"`,
-			},
-			wantStatus: 304,
-		},
-		"range_good": {
-			file:      "testdata/style.css",
-			serveETag: `"A"`,
-			reqHeader: map[string]string{
-				"Range": "bytes=0-4",
-			},
-			wantStatus:      StatusPartialContent,
-			wantContentType: "text/css; charset=utf-8",
-		},
-		// An If-Range resource for entity "A", but entity "B" is now current.
-		// The Range request should be ignored.
-		"range_no_match": {
-			file:      "testdata/style.css",
-			serveETag: `"A"`,
-			reqHeader: map[string]string{
-				"Range":    "bytes=0-4",
-				"If-Range": `"B"`,
-			},
-			wantStatus:      200,
-			wantContentType: "text/css; charset=utf-8",
-		},
-		"range_with_modtime": {
-			file:    "testdata/style.css",
-			modtime: time.Date(2014, 6, 25, 17, 12, 18, 0 /* nanos */, time.UTC),
-			reqHeader: map[string]string{
-				"Range":    "bytes=0-4",
-				"If-Range": "Wed, 25 Jun 2014 17:12:18 GMT",
-			},
-			wantStatus:      StatusPartialContent,
-			wantContentType: "text/css; charset=utf-8",
-			wantLastMod:     "Wed, 25 Jun 2014 17:12:18 GMT",
-		},
-		"range_with_modtime_nanos": {
-			file:    "testdata/style.css",
-			modtime: time.Date(2014, 6, 25, 17, 12, 18, 123 /* nanos */, time.UTC),
-			reqHeader: map[string]string{
-				"Range":    "bytes=0-4",
-				"If-Range": "Wed, 25 Jun 2014 17:12:18 GMT",
-			},
-			wantStatus:      StatusPartialContent,
-			wantContentType: "text/css; charset=utf-8",
-			wantLastMod:     "Wed, 25 Jun 2014 17:12:18 GMT",
-		},
-		"unix_zero_modtime": {
-			content:         strings.NewReader("<html>foo"),
-			modtime:         time.Unix(0, 0),
-			wantStatus:      StatusOK,
-			wantContentType: "text/html; charset=utf-8",
-		},
-	}
-	for testName, tt := range tests {
-		var content io.ReadSeeker
-		if tt.file != "" {
-			f, err := os.Open(tt.file)
-			if err != nil {
-				t.Fatalf("test %q: %v", testName, err)
-			}
-			defer f.Close()
-			content = f
-		} else {
-			content = tt.content
-		}
-
-		servec <- serveParam{
-			name:        filepath.Base(tt.file),
-			content:     content,
-			modtime:     tt.modtime,
-			etag:        tt.serveETag,
-			contentType: tt.serveContentType,
-		}
-		req, err := NewRequest("GET", ts.URL, nil)
-		if err != nil {
-			t.Fatal(err)
-		}
-		for k, v := range tt.reqHeader {
-			req.Header.Set(k, v)
-		}
-		res, err := DefaultClient.Do(req)
-		if err != nil {
-			t.Fatal(err)
-		}
-		io.Copy(ioutil.Discard, res.Body)
-		res.Body.Close()
-		if res.StatusCode != tt.wantStatus {
-			t.Errorf("test %q: status = %d; want %d", testName, res.StatusCode, tt.wantStatus)
-		}
-		if g, e := res.Header.Get("Content-Type"), tt.wantContentType; g != e {
-			t.Errorf("test %q: content-type = %q, want %q", testName, g, e)
-		}
-		if g, e := res.Header.Get("Last-Modified"), tt.wantLastMod; g != e {
-			t.Errorf("test %q: last-modified = %q, want %q", testName, g, e)
-		}
-	}
-}
-
-func TestServeContentErrorMessages(t *testing.T) {
-	defer afterTest(t)
-	fs := fakeFS{
-		"/500": &fakeFileInfo{
-			err: errors.New("random error"),
-		},
-		"/403": &fakeFileInfo{
-			err: &os.PathError{Err: os.ErrPermission},
-		},
-	}
-	ts := httptest.NewServer(FileServer(fs))
-	defer ts.Close()
-	for _, code := range []int{403, 404, 500} {
-		res, err := DefaultClient.Get(fmt.Sprintf("%s/%d", ts.URL, code))
-		if err != nil {
-			t.Errorf("Error fetching /%d: %v", code, err)
-			continue
-		}
-		if res.StatusCode != code {
-			t.Errorf("For /%d, status code = %d; want %d", code, res.StatusCode, code)
-		}
-		res.Body.Close()
-	}
-}
-
-// verifies that sendfile is being used on Linux
-func TestLinuxSendfile(t *testing.T) {
-	defer afterTest(t)
-	if runtime.GOOS != "linux" {
-		t.Skip("skipping; linux-only test")
-	}
-	if _, err := exec.LookPath("strace"); err != nil {
-		t.Skip("skipping; strace not found in path")
-	}
-
-	ln, err := net.Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	lnf, err := ln.(*net.TCPListener).File()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-
-	trace := "trace=sendfile"
-	if runtime.GOARCH != "alpha" {
-		trace = trace + ",sendfile64"
-	}
-
-	var buf bytes.Buffer
-	child := exec.Command("strace", "-f", "-q", "-e", trace, os.Args[0], "-test.run=TestLinuxSendfileChild")
-	child.ExtraFiles = append(child.ExtraFiles, lnf)
-	child.Env = append([]string{"GO_WANT_HELPER_PROCESS=1"}, os.Environ()...)
-	child.Stdout = &buf
-	child.Stderr = &buf
-	if err := child.Start(); err != nil {
-		t.Skipf("skipping; failed to start straced child: %v", err)
-	}
-
-	res, err := Get(fmt.Sprintf("http://%s/", ln.Addr()))
-	if err != nil {
-		t.Fatalf("http client error: %v", err)
-	}
-	_, err = io.Copy(ioutil.Discard, res.Body)
-	if err != nil {
-		t.Fatalf("client body read error: %v", err)
-	}
-	res.Body.Close()
-
-	// Force child to exit cleanly.
-	Get(fmt.Sprintf("http://%s/quit", ln.Addr()))
-	child.Wait()
-
-	rx := regexp.MustCompile(`sendfile(64)?\(\d+,\s*\d+,\s*NULL,\s*\d+\)\s*=\s*\d+\s*\n`)
-	rxResume := regexp.MustCompile(`<\.\.\. sendfile(64)? resumed> \)\s*=\s*\d+\s*\n`)
-	out := buf.String()
-	if !rx.MatchString(out) && !rxResume.MatchString(out) {
-		t.Errorf("no sendfile system call found in:\n%s", out)
-	}
-}
-
-func getBody(t *testing.T, testName string, req Request) (*Response, []byte) {
-	r, err := DefaultClient.Do(&req)
-	if err != nil {
-		t.Fatalf("%s: for URL %q, send error: %v", testName, req.URL.String(), err)
-	}
-	b, err := ioutil.ReadAll(r.Body)
-	if err != nil {
-		t.Fatalf("%s: for URL %q, reading body: %v", testName, req.URL.String(), err)
-	}
-	return r, b
-}
-
-// TestLinuxSendfileChild isn't a real test. It's used as a helper process
-// for TestLinuxSendfile.
-func TestLinuxSendfileChild(*testing.T) {
-	if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
-		return
-	}
-	defer os.Exit(0)
-	fd3 := os.NewFile(3, "ephemeral-port-listener")
-	ln, err := net.FileListener(fd3)
-	if err != nil {
-		panic(err)
-	}
-	mux := NewServeMux()
-	mux.Handle("/", FileServer(Dir("testdata")))
-	mux.HandleFunc("/quit", func(ResponseWriter, *Request) {
-		os.Exit(0)
-	})
-	s := &Server{Handler: mux}
-	err = s.Serve(ln)
-	if err != nil {
-		panic(err)
-	}
-}
-
-func TestFileServerCleanPath(t *testing.T) {
-	tests := []struct {
-		path     string
-		wantCode int
-		wantOpen []string
-	}{
-		{"/", 200, []string{"/", "/index.html"}},
-		{"/dir", 301, []string{"/dir"}},
-		{"/dir/", 200, []string{"/dir", "/dir/index.html"}},
-	}
-	for _, tt := range tests {
-		var log []string
-		rr := httptest.NewRecorder()
-		req, _ := NewRequest("GET", "http://foo.localhost"+tt.path, nil)
-		FileServer(fileServerCleanPathDir{&log}).ServeHTTP(rr, req)
-		if !reflect.DeepEqual(log, tt.wantOpen) {
-			t.Logf("For %s: Opens = %q; want %q", tt.path, log, tt.wantOpen)
-		}
-		if rr.Code != tt.wantCode {
-			t.Logf("For %s: Response code = %d; want %d", tt.path, rr.Code, tt.wantCode)
-		}
-	}
-}
-
-type fileServerCleanPathDir struct {
-	log *[]string
-}
-
-func (d fileServerCleanPathDir) Open(path string) (File, error) {
-	*(d.log) = append(*(d.log), path)
-	if path == "/" || path == "/dir" || path == "/dir/" {
-		// Just return back something that's a directory.
-		return Dir(".").Open(".")
-	}
-	return nil, os.ErrNotExist
-}
-
-type panicOnSeek struct{ io.ReadSeeker }
diff --git a/third_party/gofrontend/libgo/go/net/http/header.go b/third_party/gofrontend/libgo/go/net/http/header.go
deleted file mode 100644
index d847b13..0000000
--- a/third_party/gofrontend/libgo/go/net/http/header.go
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"io"
-	"net/textproto"
-	"sort"
-	"strings"
-	"sync"
-	"time"
-)
-
-var raceEnabled = false // set by race.go
-
-// A Header represents the key-value pairs in an HTTP header.
-type Header map[string][]string
-
-// Add adds the key, value pair to the header.
-// It appends to any existing values associated with key.
-func (h Header) Add(key, value string) {
-	textproto.MIMEHeader(h).Add(key, value)
-}
-
-// Set sets the header entries associated with key to
-// the single element value.  It replaces any existing
-// values associated with key.
-func (h Header) Set(key, value string) {
-	textproto.MIMEHeader(h).Set(key, value)
-}
-
-// Get gets the first value associated with the given key.
-// If there are no values associated with the key, Get returns "".
-// To access multiple values of a key, access the map directly
-// with CanonicalHeaderKey.
-func (h Header) Get(key string) string {
-	return textproto.MIMEHeader(h).Get(key)
-}
-
-// get is like Get, but key must already be in CanonicalHeaderKey form.
-func (h Header) get(key string) string {
-	if v := h[key]; len(v) > 0 {
-		return v[0]
-	}
-	return ""
-}
-
-// Del deletes the values associated with key.
-func (h Header) Del(key string) {
-	textproto.MIMEHeader(h).Del(key)
-}
-
-// Write writes a header in wire format.
-func (h Header) Write(w io.Writer) error {
-	return h.WriteSubset(w, nil)
-}
-
-func (h Header) clone() Header {
-	h2 := make(Header, len(h))
-	for k, vv := range h {
-		vv2 := make([]string, len(vv))
-		copy(vv2, vv)
-		h2[k] = vv2
-	}
-	return h2
-}
-
-var timeFormats = []string{
-	TimeFormat,
-	time.RFC850,
-	time.ANSIC,
-}
-
-// ParseTime parses a time header (such as the Date: header),
-// trying each of the three formats allowed by HTTP/1.1:
-// TimeFormat, time.RFC850, and time.ANSIC.
-func ParseTime(text string) (t time.Time, err error) {
-	for _, layout := range timeFormats {
-		t, err = time.Parse(layout, text)
-		if err == nil {
-			return
-		}
-	}
-	return
-}
-
-var headerNewlineToSpace = strings.NewReplacer("\n", " ", "\r", " ")
-
-type writeStringer interface {
-	WriteString(string) (int, error)
-}
-
-// stringWriter implements WriteString on a Writer.
-type stringWriter struct {
-	w io.Writer
-}
-
-func (w stringWriter) WriteString(s string) (n int, err error) {
-	return w.w.Write([]byte(s))
-}
-
-type keyValues struct {
-	key    string
-	values []string
-}
-
-// A headerSorter implements sort.Interface by sorting a []keyValues
-// by key. It's used as a pointer, so it can fit in a sort.Interface
-// interface value without allocation.
-type headerSorter struct {
-	kvs []keyValues
-}
-
-func (s *headerSorter) Len() int           { return len(s.kvs) }
-func (s *headerSorter) Swap(i, j int)      { s.kvs[i], s.kvs[j] = s.kvs[j], s.kvs[i] }
-func (s *headerSorter) Less(i, j int) bool { return s.kvs[i].key < s.kvs[j].key }
-
-var headerSorterPool = sync.Pool{
-	New: func() interface{} { return new(headerSorter) },
-}
-
-// sortedKeyValues returns h's keys sorted in the returned kvs
-// slice. The headerSorter used to sort is also returned, for possible
-// return to headerSorterCache.
-func (h Header) sortedKeyValues(exclude map[string]bool) (kvs []keyValues, hs *headerSorter) {
-	hs = headerSorterPool.Get().(*headerSorter)
-	if cap(hs.kvs) < len(h) {
-		hs.kvs = make([]keyValues, 0, len(h))
-	}
-	kvs = hs.kvs[:0]
-	for k, vv := range h {
-		if !exclude[k] {
-			kvs = append(kvs, keyValues{k, vv})
-		}
-	}
-	hs.kvs = kvs
-	sort.Sort(hs)
-	return kvs, hs
-}
-
-// WriteSubset writes a header in wire format.
-// If exclude is not nil, keys where exclude[key] == true are not written.
-func (h Header) WriteSubset(w io.Writer, exclude map[string]bool) error {
-	ws, ok := w.(writeStringer)
-	if !ok {
-		ws = stringWriter{w}
-	}
-	kvs, sorter := h.sortedKeyValues(exclude)
-	for _, kv := range kvs {
-		for _, v := range kv.values {
-			v = headerNewlineToSpace.Replace(v)
-			v = textproto.TrimString(v)
-			for _, s := range []string{kv.key, ": ", v, "\r\n"} {
-				if _, err := ws.WriteString(s); err != nil {
-					return err
-				}
-			}
-		}
-	}
-	headerSorterPool.Put(sorter)
-	return nil
-}
-
-// CanonicalHeaderKey returns the canonical format of the
-// header key s.  The canonicalization converts the first
-// letter and any letter following a hyphen to upper case;
-// the rest are converted to lowercase.  For example, the
-// canonical key for "accept-encoding" is "Accept-Encoding".
-// If s contains a space or invalid header field bytes, it is
-// returned without modifications.
-func CanonicalHeaderKey(s string) string { return textproto.CanonicalMIMEHeaderKey(s) }
-
-// hasToken reports whether token appears with v, ASCII
-// case-insensitive, with space or comma boundaries.
-// token must be all lowercase.
-// v may contain mixed cased.
-func hasToken(v, token string) bool {
-	if len(token) > len(v) || token == "" {
-		return false
-	}
-	if v == token {
-		return true
-	}
-	for sp := 0; sp <= len(v)-len(token); sp++ {
-		// Check that first character is good.
-		// The token is ASCII, so checking only a single byte
-		// is sufficient.  We skip this potential starting
-		// position if both the first byte and its potential
-		// ASCII uppercase equivalent (b|0x20) don't match.
-		// False positives ('^' => '~') are caught by EqualFold.
-		if b := v[sp]; b != token[0] && b|0x20 != token[0] {
-			continue
-		}
-		// Check that start pos is on a valid token boundary.
-		if sp > 0 && !isTokenBoundary(v[sp-1]) {
-			continue
-		}
-		// Check that end pos is on a valid token boundary.
-		if endPos := sp + len(token); endPos != len(v) && !isTokenBoundary(v[endPos]) {
-			continue
-		}
-		if strings.EqualFold(v[sp:sp+len(token)], token) {
-			return true
-		}
-	}
-	return false
-}
-
-func isTokenBoundary(b byte) bool {
-	return b == ' ' || b == ',' || b == '\t'
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/header_test.go b/third_party/gofrontend/libgo/go/net/http/header_test.go
deleted file mode 100644
index 299576b..0000000
--- a/third_party/gofrontend/libgo/go/net/http/header_test.go
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"bytes"
-	"runtime"
-	"testing"
-	"time"
-)
-
-var headerWriteTests = []struct {
-	h        Header
-	exclude  map[string]bool
-	expected string
-}{
-	{Header{}, nil, ""},
-	{
-		Header{
-			"Content-Type":   {"text/html; charset=UTF-8"},
-			"Content-Length": {"0"},
-		},
-		nil,
-		"Content-Length: 0\r\nContent-Type: text/html; charset=UTF-8\r\n",
-	},
-	{
-		Header{
-			"Content-Length": {"0", "1", "2"},
-		},
-		nil,
-		"Content-Length: 0\r\nContent-Length: 1\r\nContent-Length: 2\r\n",
-	},
-	{
-		Header{
-			"Expires":          {"-1"},
-			"Content-Length":   {"0"},
-			"Content-Encoding": {"gzip"},
-		},
-		map[string]bool{"Content-Length": true},
-		"Content-Encoding: gzip\r\nExpires: -1\r\n",
-	},
-	{
-		Header{
-			"Expires":          {"-1"},
-			"Content-Length":   {"0", "1", "2"},
-			"Content-Encoding": {"gzip"},
-		},
-		map[string]bool{"Content-Length": true},
-		"Content-Encoding: gzip\r\nExpires: -1\r\n",
-	},
-	{
-		Header{
-			"Expires":          {"-1"},
-			"Content-Length":   {"0"},
-			"Content-Encoding": {"gzip"},
-		},
-		map[string]bool{"Content-Length": true, "Expires": true, "Content-Encoding": true},
-		"",
-	},
-	{
-		Header{
-			"Nil":          nil,
-			"Empty":        {},
-			"Blank":        {""},
-			"Double-Blank": {"", ""},
-		},
-		nil,
-		"Blank: \r\nDouble-Blank: \r\nDouble-Blank: \r\n",
-	},
-	// Tests header sorting when over the insertion sort threshold side:
-	{
-		Header{
-			"k1": {"1a", "1b"},
-			"k2": {"2a", "2b"},
-			"k3": {"3a", "3b"},
-			"k4": {"4a", "4b"},
-			"k5": {"5a", "5b"},
-			"k6": {"6a", "6b"},
-			"k7": {"7a", "7b"},
-			"k8": {"8a", "8b"},
-			"k9": {"9a", "9b"},
-		},
-		map[string]bool{"k5": true},
-		"k1: 1a\r\nk1: 1b\r\nk2: 2a\r\nk2: 2b\r\nk3: 3a\r\nk3: 3b\r\n" +
-			"k4: 4a\r\nk4: 4b\r\nk6: 6a\r\nk6: 6b\r\n" +
-			"k7: 7a\r\nk7: 7b\r\nk8: 8a\r\nk8: 8b\r\nk9: 9a\r\nk9: 9b\r\n",
-	},
-}
-
-func TestHeaderWrite(t *testing.T) {
-	var buf bytes.Buffer
-	for i, test := range headerWriteTests {
-		test.h.WriteSubset(&buf, test.exclude)
-		if buf.String() != test.expected {
-			t.Errorf("#%d:\n got: %q\nwant: %q", i, buf.String(), test.expected)
-		}
-		buf.Reset()
-	}
-}
-
-var parseTimeTests = []struct {
-	h   Header
-	err bool
-}{
-	{Header{"Date": {""}}, true},
-	{Header{"Date": {"invalid"}}, true},
-	{Header{"Date": {"1994-11-06T08:49:37Z00:00"}}, true},
-	{Header{"Date": {"Sun, 06 Nov 1994 08:49:37 GMT"}}, false},
-	{Header{"Date": {"Sunday, 06-Nov-94 08:49:37 GMT"}}, false},
-	{Header{"Date": {"Sun Nov  6 08:49:37 1994"}}, false},
-}
-
-func TestParseTime(t *testing.T) {
-	expect := time.Date(1994, 11, 6, 8, 49, 37, 0, time.UTC)
-	for i, test := range parseTimeTests {
-		d, err := ParseTime(test.h.Get("Date"))
-		if err != nil {
-			if !test.err {
-				t.Errorf("#%d:\n got err: %v", i, err)
-			}
-			continue
-		}
-		if test.err {
-			t.Errorf("#%d:\n  should err", i)
-			continue
-		}
-		if !expect.Equal(d) {
-			t.Errorf("#%d:\n got: %v\nwant: %v", i, d, expect)
-		}
-	}
-}
-
-type hasTokenTest struct {
-	header string
-	token  string
-	want   bool
-}
-
-var hasTokenTests = []hasTokenTest{
-	{"", "", false},
-	{"", "foo", false},
-	{"foo", "foo", true},
-	{"foo ", "foo", true},
-	{" foo", "foo", true},
-	{" foo ", "foo", true},
-	{"foo,bar", "foo", true},
-	{"bar,foo", "foo", true},
-	{"bar, foo", "foo", true},
-	{"bar,foo, baz", "foo", true},
-	{"bar, foo,baz", "foo", true},
-	{"bar,foo, baz", "foo", true},
-	{"bar, foo, baz", "foo", true},
-	{"FOO", "foo", true},
-	{"FOO ", "foo", true},
-	{" FOO", "foo", true},
-	{" FOO ", "foo", true},
-	{"FOO,BAR", "foo", true},
-	{"BAR,FOO", "foo", true},
-	{"BAR, FOO", "foo", true},
-	{"BAR,FOO, baz", "foo", true},
-	{"BAR, FOO,BAZ", "foo", true},
-	{"BAR,FOO, BAZ", "foo", true},
-	{"BAR, FOO, BAZ", "foo", true},
-	{"foobar", "foo", false},
-	{"barfoo ", "foo", false},
-}
-
-func TestHasToken(t *testing.T) {
-	for _, tt := range hasTokenTests {
-		if hasToken(tt.header, tt.token) != tt.want {
-			t.Errorf("hasToken(%q, %q) = %v; want %v", tt.header, tt.token, !tt.want, tt.want)
-		}
-	}
-}
-
-var testHeader = Header{
-	"Content-Length": {"123"},
-	"Content-Type":   {"text/plain"},
-	"Date":           {"some date at some time Z"},
-	"Server":         {DefaultUserAgent},
-}
-
-var buf bytes.Buffer
-
-func BenchmarkHeaderWriteSubset(b *testing.B) {
-	b.ReportAllocs()
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		testHeader.WriteSubset(&buf, nil)
-	}
-}
-
-func TestHeaderWriteSubsetAllocs(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping alloc test in short mode")
-	}
-	if raceEnabled {
-		t.Skip("skipping test under race detector")
-	}
-	t.Skip("Skipping alloc count test on gccgo")
-	if runtime.GOMAXPROCS(0) > 1 {
-		t.Skip("skipping; GOMAXPROCS>1")
-	}
-	n := testing.AllocsPerRun(100, func() {
-		buf.Reset()
-		testHeader.WriteSubset(&buf, nil)
-	})
-	if n > 0 {
-		t.Errorf("allocs = %g; want 0", n)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/http_test.go b/third_party/gofrontend/libgo/go/net/http/http_test.go
deleted file mode 100644
index dead3b0..0000000
--- a/third_party/gofrontend/libgo/go/net/http/http_test.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Tests of internal functions with no better homes.
-
-package http
-
-import (
-	"reflect"
-	"testing"
-)
-
-func TestForeachHeaderElement(t *testing.T) {
-	tests := []struct {
-		in   string
-		want []string
-	}{
-		{"Foo", []string{"Foo"}},
-		{" Foo", []string{"Foo"}},
-		{"Foo ", []string{"Foo"}},
-		{" Foo ", []string{"Foo"}},
-
-		{"foo", []string{"foo"}},
-		{"anY-cAsE", []string{"anY-cAsE"}},
-
-		{"", nil},
-		{",,,,  ,  ,,   ,,, ,", nil},
-
-		{" Foo,Bar, Baz,lower,,Quux ", []string{"Foo", "Bar", "Baz", "lower", "Quux"}},
-	}
-	for _, tt := range tests {
-		var got []string
-		foreachHeaderElement(tt.in, func(v string) {
-			got = append(got, v)
-		})
-		if !reflect.DeepEqual(got, tt.want) {
-			t.Errorf("foreachHeaderElement(%q) = %q; want %q", tt.in, got, tt.want)
-		}
-	}
-}
-
-func TestCleanHost(t *testing.T) {
-	tests := []struct {
-		in, want string
-	}{
-		{"www.google.com", "www.google.com"},
-		{"www.google.com foo", "www.google.com"},
-		{"www.google.com/foo", "www.google.com"},
-		{" first character is a space", ""},
-	}
-	for _, tt := range tests {
-		got := cleanHost(tt.in)
-		if tt.want != got {
-			t.Errorf("cleanHost(%q) = %q, want %q", tt.in, got, tt.want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/httptest/recorder.go b/third_party/gofrontend/libgo/go/net/http/httptest/recorder.go
deleted file mode 100644
index 5451f54..0000000
--- a/third_party/gofrontend/libgo/go/net/http/httptest/recorder.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package httptest provides utilities for HTTP testing.
-package httptest
-
-import (
-	"bytes"
-	"net/http"
-)
-
-// ResponseRecorder is an implementation of http.ResponseWriter that
-// records its mutations for later inspection in tests.
-type ResponseRecorder struct {
-	Code      int           // the HTTP response code from WriteHeader
-	HeaderMap http.Header   // the HTTP response headers
-	Body      *bytes.Buffer // if non-nil, the bytes.Buffer to append written data to
-	Flushed   bool
-
-	wroteHeader bool
-}
-
-// NewRecorder returns an initialized ResponseRecorder.
-func NewRecorder() *ResponseRecorder {
-	return &ResponseRecorder{
-		HeaderMap: make(http.Header),
-		Body:      new(bytes.Buffer),
-		Code:      200,
-	}
-}
-
-// DefaultRemoteAddr is the default remote address to return in RemoteAddr if
-// an explicit DefaultRemoteAddr isn't set on ResponseRecorder.
-const DefaultRemoteAddr = "1.2.3.4"
-
-// Header returns the response headers.
-func (rw *ResponseRecorder) Header() http.Header {
-	m := rw.HeaderMap
-	if m == nil {
-		m = make(http.Header)
-		rw.HeaderMap = m
-	}
-	return m
-}
-
-// Write always succeeds and writes to rw.Body, if not nil.
-func (rw *ResponseRecorder) Write(buf []byte) (int, error) {
-	if !rw.wroteHeader {
-		rw.WriteHeader(200)
-	}
-	if rw.Body != nil {
-		rw.Body.Write(buf)
-	}
-	return len(buf), nil
-}
-
-// WriteHeader sets rw.Code.
-func (rw *ResponseRecorder) WriteHeader(code int) {
-	if !rw.wroteHeader {
-		rw.Code = code
-	}
-	rw.wroteHeader = true
-}
-
-// Flush sets rw.Flushed to true.
-func (rw *ResponseRecorder) Flush() {
-	if !rw.wroteHeader {
-		rw.WriteHeader(200)
-	}
-	rw.Flushed = true
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/httptest/recorder_test.go b/third_party/gofrontend/libgo/go/net/http/httptest/recorder_test.go
deleted file mode 100644
index 2b56326..0000000
--- a/third_party/gofrontend/libgo/go/net/http/httptest/recorder_test.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package httptest
-
-import (
-	"fmt"
-	"net/http"
-	"testing"
-)
-
-func TestRecorder(t *testing.T) {
-	type checkFunc func(*ResponseRecorder) error
-	check := func(fns ...checkFunc) []checkFunc { return fns }
-
-	hasStatus := func(wantCode int) checkFunc {
-		return func(rec *ResponseRecorder) error {
-			if rec.Code != wantCode {
-				return fmt.Errorf("Status = %d; want %d", rec.Code, wantCode)
-			}
-			return nil
-		}
-	}
-	hasContents := func(want string) checkFunc {
-		return func(rec *ResponseRecorder) error {
-			if rec.Body.String() != want {
-				return fmt.Errorf("wrote = %q; want %q", rec.Body.String(), want)
-			}
-			return nil
-		}
-	}
-	hasFlush := func(want bool) checkFunc {
-		return func(rec *ResponseRecorder) error {
-			if rec.Flushed != want {
-				return fmt.Errorf("Flushed = %v; want %v", rec.Flushed, want)
-			}
-			return nil
-		}
-	}
-
-	tests := []struct {
-		name   string
-		h      func(w http.ResponseWriter, r *http.Request)
-		checks []checkFunc
-	}{
-		{
-			"200 default",
-			func(w http.ResponseWriter, r *http.Request) {},
-			check(hasStatus(200), hasContents("")),
-		},
-		{
-			"first code only",
-			func(w http.ResponseWriter, r *http.Request) {
-				w.WriteHeader(201)
-				w.WriteHeader(202)
-				w.Write([]byte("hi"))
-			},
-			check(hasStatus(201), hasContents("hi")),
-		},
-		{
-			"write sends 200",
-			func(w http.ResponseWriter, r *http.Request) {
-				w.Write([]byte("hi first"))
-				w.WriteHeader(201)
-				w.WriteHeader(202)
-			},
-			check(hasStatus(200), hasContents("hi first"), hasFlush(false)),
-		},
-		{
-			"flush",
-			func(w http.ResponseWriter, r *http.Request) {
-				w.(http.Flusher).Flush() // also sends a 200
-				w.WriteHeader(201)
-			},
-			check(hasStatus(200), hasFlush(true)),
-		},
-	}
-	r, _ := http.NewRequest("GET", "http://foo.com/", nil)
-	for _, tt := range tests {
-		h := http.HandlerFunc(tt.h)
-		rec := NewRecorder()
-		h.ServeHTTP(rec, r)
-		for _, check := range tt.checks {
-			if err := check(rec); err != nil {
-				t.Errorf("%s: %v", tt.name, err)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/httptest/server.go b/third_party/gofrontend/libgo/go/net/http/httptest/server.go
deleted file mode 100644
index 96eb0ef..0000000
--- a/third_party/gofrontend/libgo/go/net/http/httptest/server.go
+++ /dev/null
@@ -1,238 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Implementation of Server
-
-package httptest
-
-import (
-	"crypto/tls"
-	"flag"
-	"fmt"
-	"net"
-	"net/http"
-	"os"
-	"sync"
-)
-
-// A Server is an HTTP server listening on a system-chosen port on the
-// local loopback interface, for use in end-to-end HTTP tests.
-type Server struct {
-	URL      string // base URL of form http://ipaddr:port with no trailing slash
-	Listener net.Listener
-
-	// TLS is the optional TLS configuration, populated with a new config
-	// after TLS is started. If set on an unstarted server before StartTLS
-	// is called, existing fields are copied into the new config.
-	TLS *tls.Config
-
-	// Config may be changed after calling NewUnstartedServer and
-	// before Start or StartTLS.
-	Config *http.Server
-
-	// wg counts the number of outstanding HTTP requests on this server.
-	// Close blocks until all requests are finished.
-	wg sync.WaitGroup
-}
-
-// historyListener keeps track of all connections that it's ever
-// accepted.
-type historyListener struct {
-	net.Listener
-	sync.Mutex // protects history
-	history    []net.Conn
-}
-
-func (hs *historyListener) Accept() (c net.Conn, err error) {
-	c, err = hs.Listener.Accept()
-	if err == nil {
-		hs.Lock()
-		hs.history = append(hs.history, c)
-		hs.Unlock()
-	}
-	return
-}
-
-func newLocalListener() net.Listener {
-	if *serve != "" {
-		l, err := net.Listen("tcp", *serve)
-		if err != nil {
-			panic(fmt.Sprintf("httptest: failed to listen on %v: %v", *serve, err))
-		}
-		return l
-	}
-	l, err := net.Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		if l, err = net.Listen("tcp6", "[::1]:0"); err != nil {
-			panic(fmt.Sprintf("httptest: failed to listen on a port: %v", err))
-		}
-	}
-	return l
-}
-
-// When debugging a particular http server-based test,
-// this flag lets you run
-//	go test -run=BrokenTest -httptest.serve=127.0.0.1:8000
-// to start the broken server so you can interact with it manually.
-var serve = flag.String("httptest.serve", "", "if non-empty, httptest.NewServer serves on this address and blocks")
-
-// NewServer starts and returns a new Server.
-// The caller should call Close when finished, to shut it down.
-func NewServer(handler http.Handler) *Server {
-	ts := NewUnstartedServer(handler)
-	ts.Start()
-	return ts
-}
-
-// NewUnstartedServer returns a new Server but doesn't start it.
-//
-// After changing its configuration, the caller should call Start or
-// StartTLS.
-//
-// The caller should call Close when finished, to shut it down.
-func NewUnstartedServer(handler http.Handler) *Server {
-	return &Server{
-		Listener: newLocalListener(),
-		Config:   &http.Server{Handler: handler},
-	}
-}
-
-// Start starts a server from NewUnstartedServer.
-func (s *Server) Start() {
-	if s.URL != "" {
-		panic("Server already started")
-	}
-	s.Listener = &historyListener{Listener: s.Listener}
-	s.URL = "http://" + s.Listener.Addr().String()
-	s.wrapHandler()
-	go s.Config.Serve(s.Listener)
-	if *serve != "" {
-		fmt.Fprintln(os.Stderr, "httptest: serving on", s.URL)
-		select {}
-	}
-}
-
-// StartTLS starts TLS on a server from NewUnstartedServer.
-func (s *Server) StartTLS() {
-	if s.URL != "" {
-		panic("Server already started")
-	}
-	cert, err := tls.X509KeyPair(localhostCert, localhostKey)
-	if err != nil {
-		panic(fmt.Sprintf("httptest: NewTLSServer: %v", err))
-	}
-
-	existingConfig := s.TLS
-	s.TLS = new(tls.Config)
-	if existingConfig != nil {
-		*s.TLS = *existingConfig
-	}
-	if s.TLS.NextProtos == nil {
-		s.TLS.NextProtos = []string{"http/1.1"}
-	}
-	if len(s.TLS.Certificates) == 0 {
-		s.TLS.Certificates = []tls.Certificate{cert}
-	}
-	tlsListener := tls.NewListener(s.Listener, s.TLS)
-
-	s.Listener = &historyListener{Listener: tlsListener}
-	s.URL = "https://" + s.Listener.Addr().String()
-	s.wrapHandler()
-	go s.Config.Serve(s.Listener)
-}
-
-func (s *Server) wrapHandler() {
-	h := s.Config.Handler
-	if h == nil {
-		h = http.DefaultServeMux
-	}
-	s.Config.Handler = &waitGroupHandler{
-		s: s,
-		h: h,
-	}
-}
-
-// NewTLSServer starts and returns a new Server using TLS.
-// The caller should call Close when finished, to shut it down.
-func NewTLSServer(handler http.Handler) *Server {
-	ts := NewUnstartedServer(handler)
-	ts.StartTLS()
-	return ts
-}
-
-// Close shuts down the server and blocks until all outstanding
-// requests on this server have completed.
-func (s *Server) Close() {
-	s.Listener.Close()
-	s.wg.Wait()
-	s.CloseClientConnections()
-	if t, ok := http.DefaultTransport.(*http.Transport); ok {
-		t.CloseIdleConnections()
-	}
-}
-
-// CloseClientConnections closes any currently open HTTP connections
-// to the test Server.
-func (s *Server) CloseClientConnections() {
-	hl, ok := s.Listener.(*historyListener)
-	if !ok {
-		return
-	}
-	hl.Lock()
-	for _, conn := range hl.history {
-		conn.Close()
-	}
-	hl.Unlock()
-}
-
-// waitGroupHandler wraps a handler, incrementing and decrementing a
-// sync.WaitGroup on each request, to enable Server.Close to block
-// until outstanding requests are finished.
-type waitGroupHandler struct {
-	s *Server
-	h http.Handler // non-nil
-}
-
-func (h *waitGroupHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-	h.s.wg.Add(1)
-	defer h.s.wg.Done() // a defer, in case ServeHTTP below panics
-	h.h.ServeHTTP(w, r)
-}
-
-// localhostCert is a PEM-encoded TLS cert with SAN IPs
-// "127.0.0.1" and "[::1]", expiring at the last second of 2049 (the end
-// of ASN.1 time).
-// generated from src/crypto/tls:
-// go run generate_cert.go  --rsa-bits 1024 --host 127.0.0.1,::1,example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h
-var localhostCert = []byte(`-----BEGIN CERTIFICATE-----
-MIICEzCCAXygAwIBAgIQMIMChMLGrR+QvmQvpwAU6zANBgkqhkiG9w0BAQsFADAS
-MRAwDgYDVQQKEwdBY21lIENvMCAXDTcwMDEwMTAwMDAwMFoYDzIwODQwMTI5MTYw
-MDAwWjASMRAwDgYDVQQKEwdBY21lIENvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
-iQKBgQDuLnQAI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9SjY1bIw4
-iA5sBBZzHi3z0h1YV8QPuxEbi4nW91IJm2gsvvZhIrCHS3l6afab4pZBl2+XsDul
-rKBxKKtD1rGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTvqJQIDAQABo2gwZjAO
-BgNVHQ8BAf8EBAMCAqQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUw
-AwEB/zAuBgNVHREEJzAlggtleGFtcGxlLmNvbYcEfwAAAYcQAAAAAAAAAAAAAAAA
-AAAAATANBgkqhkiG9w0BAQsFAAOBgQCEcetwO59EWk7WiJsG4x8SY+UIAA+flUI9
-tyC4lNhbcF2Idq9greZwbYCqTTTr2XiRNSMLCOjKyI7ukPoPjo16ocHj+P3vZGfs
-h1fIw3cSS2OolhloGw/XM6RWPWtPAlGykKLciQrBru5NAPvCMsb/I1DAceTiotQM
-fblo6RBxUQ==
------END CERTIFICATE-----`)
-
-// localhostKey is the private key for localhostCert.
-var localhostKey = []byte(`-----BEGIN RSA PRIVATE KEY-----
-MIICXgIBAAKBgQDuLnQAI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9
-SjY1bIw4iA5sBBZzHi3z0h1YV8QPuxEbi4nW91IJm2gsvvZhIrCHS3l6afab4pZB
-l2+XsDulrKBxKKtD1rGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTvqJQIDAQAB
-AoGAGRzwwir7XvBOAy5tM/uV6e+Zf6anZzus1s1Y1ClbjbE6HXbnWWF/wbZGOpet
-3Zm4vD6MXc7jpTLryzTQIvVdfQbRc6+MUVeLKwZatTXtdZrhu+Jk7hx0nTPy8Jcb
-uJqFk541aEw+mMogY/xEcfbWd6IOkp+4xqjlFLBEDytgbIECQQDvH/E6nk+hgN4H
-qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLmQcj2PprIMmPcQrooz8vp
-jy4SHEg1AkEA/v13/5M47K9vCxmb8QeD/asydfsgS5TeuNi8DoUBEmiSJwma7FXY
-fFUtxuvL7XvjwjN5B30pNEbc6Iuyt7y4MQJBAIt21su4b3sjXNueLKH85Q+phy2U
-fQtuUE9txblTu14q3N7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xlp/DoCzjA0CQQDU
-y2ptGsuSmgUtWj3NM9xuwYPm+Z/F84K6+ARYiZ6PYj013sovGKUFfYAqVXVlxtIX
-qyUBnu3X9ps8ZfjLZO7BAkEAlT4R5Yl6cGhaJQYZHOde3JEMhNRcVFMO8dJDaFeo
-f9Oeos0UUothgiDktdQHxdNEwLjQf7lJJBzV+5OtwswCWA==
------END RSA PRIVATE KEY-----`)
diff --git a/third_party/gofrontend/libgo/go/net/http/httptest/server_test.go b/third_party/gofrontend/libgo/go/net/http/httptest/server_test.go
deleted file mode 100644
index 500a9f0..0000000
--- a/third_party/gofrontend/libgo/go/net/http/httptest/server_test.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package httptest
-
-import (
-	"io/ioutil"
-	"net/http"
-	"testing"
-)
-
-func TestServer(t *testing.T) {
-	ts := NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		w.Write([]byte("hello"))
-	}))
-	defer ts.Close()
-	res, err := http.Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	got, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if string(got) != "hello" {
-		t.Errorf("got %q, want hello", string(got))
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/httputil/dump.go b/third_party/gofrontend/libgo/go/net/http/httputil/dump.go
deleted file mode 100644
index ca2d1cd..0000000
--- a/third_party/gofrontend/libgo/go/net/http/httputil/dump.go
+++ /dev/null
@@ -1,285 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package httputil
-
-import (
-	"bufio"
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net"
-	"net/http"
-	"net/url"
-	"strings"
-	"time"
-)
-
-// One of the copies, say from b to r2, could be avoided by using a more
-// elaborate trick where the other copy is made during Request/Response.Write.
-// This would complicate things too much, given that these functions are for
-// debugging only.
-func drainBody(b io.ReadCloser) (r1, r2 io.ReadCloser, err error) {
-	var buf bytes.Buffer
-	if _, err = buf.ReadFrom(b); err != nil {
-		return nil, nil, err
-	}
-	if err = b.Close(); err != nil {
-		return nil, nil, err
-	}
-	return ioutil.NopCloser(&buf), ioutil.NopCloser(bytes.NewReader(buf.Bytes())), nil
-}
-
-// dumpConn is a net.Conn which writes to Writer and reads from Reader
-type dumpConn struct {
-	io.Writer
-	io.Reader
-}
-
-func (c *dumpConn) Close() error                       { return nil }
-func (c *dumpConn) LocalAddr() net.Addr                { return nil }
-func (c *dumpConn) RemoteAddr() net.Addr               { return nil }
-func (c *dumpConn) SetDeadline(t time.Time) error      { return nil }
-func (c *dumpConn) SetReadDeadline(t time.Time) error  { return nil }
-func (c *dumpConn) SetWriteDeadline(t time.Time) error { return nil }
-
-type neverEnding byte
-
-func (b neverEnding) Read(p []byte) (n int, err error) {
-	for i := range p {
-		p[i] = byte(b)
-	}
-	return len(p), nil
-}
-
-// DumpRequestOut is like DumpRequest but includes
-// headers that the standard http.Transport adds,
-// such as User-Agent.
-func DumpRequestOut(req *http.Request, body bool) ([]byte, error) {
-	save := req.Body
-	dummyBody := false
-	if !body || req.Body == nil {
-		req.Body = nil
-		if req.ContentLength != 0 {
-			req.Body = ioutil.NopCloser(io.LimitReader(neverEnding('x'), req.ContentLength))
-			dummyBody = true
-		}
-	} else {
-		var err error
-		save, req.Body, err = drainBody(req.Body)
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	// Since we're using the actual Transport code to write the request,
-	// switch to http so the Transport doesn't try to do an SSL
-	// negotiation with our dumpConn and its bytes.Buffer & pipe.
-	// The wire format for https and http are the same, anyway.
-	reqSend := req
-	if req.URL.Scheme == "https" {
-		reqSend = new(http.Request)
-		*reqSend = *req
-		reqSend.URL = new(url.URL)
-		*reqSend.URL = *req.URL
-		reqSend.URL.Scheme = "http"
-	}
-
-	// Use the actual Transport code to record what we would send
-	// on the wire, but not using TCP.  Use a Transport with a
-	// custom dialer that returns a fake net.Conn that waits
-	// for the full input (and recording it), and then responds
-	// with a dummy response.
-	var buf bytes.Buffer // records the output
-	pr, pw := io.Pipe()
-	defer pr.Close()
-	defer pw.Close()
-	dr := &delegateReader{c: make(chan io.Reader)}
-
-	t := &http.Transport{
-		Dial: func(net, addr string) (net.Conn, error) {
-			return &dumpConn{io.MultiWriter(&buf, pw), dr}, nil
-		},
-	}
-	defer t.CloseIdleConnections()
-
-	// Wait for the request before replying with a dummy response:
-	go func() {
-		req, err := http.ReadRequest(bufio.NewReader(pr))
-		if err == nil {
-			// Ensure all the body is read; otherwise
-			// we'll get a partial dump.
-			io.Copy(ioutil.Discard, req.Body)
-			req.Body.Close()
-		}
-		dr.c <- strings.NewReader("HTTP/1.1 204 No Content\r\nConnection: close\r\n\r\n")
-	}()
-
-	_, err := t.RoundTrip(reqSend)
-
-	req.Body = save
-	if err != nil {
-		return nil, err
-	}
-	dump := buf.Bytes()
-
-	// If we used a dummy body above, remove it now.
-	// TODO: if the req.ContentLength is large, we allocate memory
-	// unnecessarily just to slice it off here.  But this is just
-	// a debug function, so this is acceptable for now. We could
-	// discard the body earlier if this matters.
-	if dummyBody {
-		if i := bytes.Index(dump, []byte("\r\n\r\n")); i >= 0 {
-			dump = dump[:i+4]
-		}
-	}
-	return dump, nil
-}
-
-// delegateReader is a reader that delegates to another reader,
-// once it arrives on a channel.
-type delegateReader struct {
-	c chan io.Reader
-	r io.Reader // nil until received from c
-}
-
-func (r *delegateReader) Read(p []byte) (int, error) {
-	if r.r == nil {
-		r.r = <-r.c
-	}
-	return r.r.Read(p)
-}
-
-// Return value if nonempty, def otherwise.
-func valueOrDefault(value, def string) string {
-	if value != "" {
-		return value
-	}
-	return def
-}
-
-var reqWriteExcludeHeaderDump = map[string]bool{
-	"Host":              true, // not in Header map anyway
-	"Content-Length":    true,
-	"Transfer-Encoding": true,
-	"Trailer":           true,
-}
-
-// dumpAsReceived writes req to w in the form as it was received, or
-// at least as accurately as possible from the information retained in
-// the request.
-func dumpAsReceived(req *http.Request, w io.Writer) error {
-	return nil
-}
-
-// DumpRequest returns the as-received wire representation of req,
-// optionally including the request body, for debugging.
-// DumpRequest is semantically a no-op, but in order to
-// dump the body, it reads the body data into memory and
-// changes req.Body to refer to the in-memory copy.
-// The documentation for http.Request.Write details which fields
-// of req are used.
-func DumpRequest(req *http.Request, body bool) (dump []byte, err error) {
-	save := req.Body
-	if !body || req.Body == nil {
-		req.Body = nil
-	} else {
-		save, req.Body, err = drainBody(req.Body)
-		if err != nil {
-			return
-		}
-	}
-
-	var b bytes.Buffer
-
-	fmt.Fprintf(&b, "%s %s HTTP/%d.%d\r\n", valueOrDefault(req.Method, "GET"),
-		req.URL.RequestURI(), req.ProtoMajor, req.ProtoMinor)
-
-	host := req.Host
-	if host == "" && req.URL != nil {
-		host = req.URL.Host
-	}
-	if host != "" {
-		fmt.Fprintf(&b, "Host: %s\r\n", host)
-	}
-
-	chunked := len(req.TransferEncoding) > 0 && req.TransferEncoding[0] == "chunked"
-	if len(req.TransferEncoding) > 0 {
-		fmt.Fprintf(&b, "Transfer-Encoding: %s\r\n", strings.Join(req.TransferEncoding, ","))
-	}
-	if req.Close {
-		fmt.Fprintf(&b, "Connection: close\r\n")
-	}
-
-	err = req.Header.WriteSubset(&b, reqWriteExcludeHeaderDump)
-	if err != nil {
-		return
-	}
-
-	io.WriteString(&b, "\r\n")
-
-	if req.Body != nil {
-		var dest io.Writer = &b
-		if chunked {
-			dest = NewChunkedWriter(dest)
-		}
-		_, err = io.Copy(dest, req.Body)
-		if chunked {
-			dest.(io.Closer).Close()
-			io.WriteString(&b, "\r\n")
-		}
-	}
-
-	req.Body = save
-	if err != nil {
-		return
-	}
-	dump = b.Bytes()
-	return
-}
-
-// errNoBody is a sentinel error value used by failureToReadBody so we can detect
-// that the lack of body was intentional.
-var errNoBody = errors.New("sentinel error value")
-
-// failureToReadBody is a io.ReadCloser that just returns errNoBody on
-// Read.  It's swapped in when we don't actually want to consume the
-// body, but need a non-nil one, and want to distinguish the error
-// from reading the dummy body.
-type failureToReadBody struct{}
-
-func (failureToReadBody) Read([]byte) (int, error) { return 0, errNoBody }
-func (failureToReadBody) Close() error             { return nil }
-
-var emptyBody = ioutil.NopCloser(strings.NewReader(""))
-
-// DumpResponse is like DumpRequest but dumps a response.
-func DumpResponse(resp *http.Response, body bool) (dump []byte, err error) {
-	var b bytes.Buffer
-	save := resp.Body
-	savecl := resp.ContentLength
-
-	if !body {
-		resp.Body = failureToReadBody{}
-	} else if resp.Body == nil {
-		resp.Body = emptyBody
-	} else {
-		save, resp.Body, err = drainBody(resp.Body)
-		if err != nil {
-			return
-		}
-	}
-	err = resp.Write(&b)
-	if err == errNoBody {
-		err = nil
-	}
-	resp.Body = save
-	resp.ContentLength = savecl
-	if err != nil {
-		return nil, err
-	}
-	return b.Bytes(), nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/httputil/dump_test.go b/third_party/gofrontend/libgo/go/net/http/httputil/dump_test.go
deleted file mode 100644
index ae67e98..0000000
--- a/third_party/gofrontend/libgo/go/net/http/httputil/dump_test.go
+++ /dev/null
@@ -1,291 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package httputil
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net/http"
-	"net/url"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-type dumpTest struct {
-	Req  http.Request
-	Body interface{} // optional []byte or func() io.ReadCloser to populate Req.Body
-
-	WantDump    string
-	WantDumpOut string
-	NoBody      bool // if true, set DumpRequest{,Out} body to false
-}
-
-var dumpTests = []dumpTest{
-
-	// HTTP/1.1 => chunked coding; body; empty trailer
-	{
-		Req: http.Request{
-			Method: "GET",
-			URL: &url.URL{
-				Scheme: "http",
-				Host:   "www.google.com",
-				Path:   "/search",
-			},
-			ProtoMajor:       1,
-			ProtoMinor:       1,
-			TransferEncoding: []string{"chunked"},
-		},
-
-		Body: []byte("abcdef"),
-
-		WantDump: "GET /search HTTP/1.1\r\n" +
-			"Host: www.google.com\r\n" +
-			"Transfer-Encoding: chunked\r\n\r\n" +
-			chunk("abcdef") + chunk(""),
-	},
-
-	// Verify that DumpRequest preserves the HTTP version number, doesn't add a Host,
-	// and doesn't add a User-Agent.
-	{
-		Req: http.Request{
-			Method:     "GET",
-			URL:        mustParseURL("/foo"),
-			ProtoMajor: 1,
-			ProtoMinor: 0,
-			Header: http.Header{
-				"X-Foo": []string{"X-Bar"},
-			},
-		},
-
-		WantDump: "GET /foo HTTP/1.0\r\n" +
-			"X-Foo: X-Bar\r\n\r\n",
-	},
-
-	{
-		Req: *mustNewRequest("GET", "http://example.com/foo", nil),
-
-		WantDumpOut: "GET /foo HTTP/1.1\r\n" +
-			"Host: example.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Accept-Encoding: gzip\r\n\r\n",
-	},
-
-	// Test that an https URL doesn't try to do an SSL negotiation
-	// with a bytes.Buffer and hang with all goroutines not
-	// runnable.
-	{
-		Req: *mustNewRequest("GET", "https://example.com/foo", nil),
-
-		WantDumpOut: "GET /foo HTTP/1.1\r\n" +
-			"Host: example.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Accept-Encoding: gzip\r\n\r\n",
-	},
-
-	// Request with Body, but Dump requested without it.
-	{
-		Req: http.Request{
-			Method: "POST",
-			URL: &url.URL{
-				Scheme: "http",
-				Host:   "post.tld",
-				Path:   "/",
-			},
-			ContentLength: 6,
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-		},
-
-		Body: []byte("abcdef"),
-
-		WantDumpOut: "POST / HTTP/1.1\r\n" +
-			"Host: post.tld\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Content-Length: 6\r\n" +
-			"Accept-Encoding: gzip\r\n\r\n",
-
-		NoBody: true,
-	},
-
-	// Request with Body > 8196 (default buffer size)
-	{
-		Req: http.Request{
-			Method: "POST",
-			URL: &url.URL{
-				Scheme: "http",
-				Host:   "post.tld",
-				Path:   "/",
-			},
-			ContentLength: 8193,
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-		},
-
-		Body: bytes.Repeat([]byte("a"), 8193),
-
-		WantDumpOut: "POST / HTTP/1.1\r\n" +
-			"Host: post.tld\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Content-Length: 8193\r\n" +
-			"Accept-Encoding: gzip\r\n\r\n" +
-			strings.Repeat("a", 8193),
-	},
-}
-
-func TestDumpRequest(t *testing.T) {
-	numg0 := runtime.NumGoroutine()
-	for i, tt := range dumpTests {
-		setBody := func() {
-			if tt.Body == nil {
-				return
-			}
-			switch b := tt.Body.(type) {
-			case []byte:
-				tt.Req.Body = ioutil.NopCloser(bytes.NewReader(b))
-			case func() io.ReadCloser:
-				tt.Req.Body = b()
-			default:
-				t.Fatalf("Test %d: unsupported Body of %T", i, tt.Body)
-			}
-		}
-		setBody()
-		if tt.Req.Header == nil {
-			tt.Req.Header = make(http.Header)
-		}
-
-		if tt.WantDump != "" {
-			setBody()
-			dump, err := DumpRequest(&tt.Req, !tt.NoBody)
-			if err != nil {
-				t.Errorf("DumpRequest #%d: %s", i, err)
-				continue
-			}
-			if string(dump) != tt.WantDump {
-				t.Errorf("DumpRequest %d, expecting:\n%s\nGot:\n%s\n", i, tt.WantDump, string(dump))
-				continue
-			}
-		}
-
-		if tt.WantDumpOut != "" {
-			setBody()
-			dump, err := DumpRequestOut(&tt.Req, !tt.NoBody)
-			if err != nil {
-				t.Errorf("DumpRequestOut #%d: %s", i, err)
-				continue
-			}
-			if string(dump) != tt.WantDumpOut {
-				t.Errorf("DumpRequestOut %d, expecting:\n%s\nGot:\n%s\n", i, tt.WantDumpOut, string(dump))
-				continue
-			}
-		}
-	}
-	if dg := runtime.NumGoroutine() - numg0; dg > 4 {
-		buf := make([]byte, 4096)
-		buf = buf[:runtime.Stack(buf, true)]
-		t.Errorf("Unexpectedly large number of new goroutines: %d new: %s", dg, buf)
-	}
-}
-
-func chunk(s string) string {
-	return fmt.Sprintf("%x\r\n%s\r\n", len(s), s)
-}
-
-func mustParseURL(s string) *url.URL {
-	u, err := url.Parse(s)
-	if err != nil {
-		panic(fmt.Sprintf("Error parsing URL %q: %v", s, err))
-	}
-	return u
-}
-
-func mustNewRequest(method, url string, body io.Reader) *http.Request {
-	req, err := http.NewRequest(method, url, body)
-	if err != nil {
-		panic(fmt.Sprintf("NewRequest(%q, %q, %p) err = %v", method, url, body, err))
-	}
-	return req
-}
-
-var dumpResTests = []struct {
-	res  *http.Response
-	body bool
-	want string
-}{
-	{
-		res: &http.Response{
-			Status:        "200 OK",
-			StatusCode:    200,
-			Proto:         "HTTP/1.1",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			ContentLength: 50,
-			Header: http.Header{
-				"Foo": []string{"Bar"},
-			},
-			Body: ioutil.NopCloser(strings.NewReader("foo")), // shouldn't be used
-		},
-		body: false, // to verify we see 50, not empty or 3.
-		want: `HTTP/1.1 200 OK
-Content-Length: 50
-Foo: Bar`,
-	},
-
-	{
-		res: &http.Response{
-			Status:        "200 OK",
-			StatusCode:    200,
-			Proto:         "HTTP/1.1",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			ContentLength: 3,
-			Body:          ioutil.NopCloser(strings.NewReader("foo")),
-		},
-		body: true,
-		want: `HTTP/1.1 200 OK
-Content-Length: 3
-
-foo`,
-	},
-
-	{
-		res: &http.Response{
-			Status:           "200 OK",
-			StatusCode:       200,
-			Proto:            "HTTP/1.1",
-			ProtoMajor:       1,
-			ProtoMinor:       1,
-			ContentLength:    -1,
-			Body:             ioutil.NopCloser(strings.NewReader("foo")),
-			TransferEncoding: []string{"chunked"},
-		},
-		body: true,
-		want: `HTTP/1.1 200 OK
-Transfer-Encoding: chunked
-
-3
-foo
-0`,
-	},
-}
-
-func TestDumpResponse(t *testing.T) {
-	for i, tt := range dumpResTests {
-		gotb, err := DumpResponse(tt.res, tt.body)
-		if err != nil {
-			t.Errorf("%d. DumpResponse = %v", i, err)
-			continue
-		}
-		got := string(gotb)
-		got = strings.TrimSpace(got)
-		got = strings.Replace(got, "\r", "", -1)
-
-		if got != tt.want {
-			t.Errorf("%d.\nDumpResponse got:\n%s\n\nWant:\n%s\n", i, got, tt.want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/httputil/httputil.go b/third_party/gofrontend/libgo/go/net/http/httputil/httputil.go
deleted file mode 100644
index 2e523e9..0000000
--- a/third_party/gofrontend/libgo/go/net/http/httputil/httputil.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package httputil provides HTTP utility functions, complementing the
-// more common ones in the net/http package.
-package httputil
-
-import (
-	"io"
-	"net/http/internal"
-)
-
-// NewChunkedReader returns a new chunkedReader that translates the data read from r
-// out of HTTP "chunked" format before returning it.
-// The chunkedReader returns io.EOF when the final 0-length chunk is read.
-//
-// NewChunkedReader is not needed by normal applications. The http package
-// automatically decodes chunking when reading response bodies.
-func NewChunkedReader(r io.Reader) io.Reader {
-	return internal.NewChunkedReader(r)
-}
-
-// NewChunkedWriter returns a new chunkedWriter that translates writes into HTTP
-// "chunked" format before writing them to w. Closing the returned chunkedWriter
-// sends the final 0-length chunk that marks the end of the stream.
-//
-// NewChunkedWriter is not needed by normal applications. The http
-// package adds chunking automatically if handlers don't set a
-// Content-Length header. Using NewChunkedWriter inside a handler
-// would result in double chunking or chunking with a Content-Length
-// length, both of which are wrong.
-func NewChunkedWriter(w io.Writer) io.WriteCloser {
-	return internal.NewChunkedWriter(w)
-}
-
-// ErrLineTooLong is returned when reading malformed chunked data
-// with lines that are too long.
-var ErrLineTooLong = internal.ErrLineTooLong
diff --git a/third_party/gofrontend/libgo/go/net/http/httputil/persist.go b/third_party/gofrontend/libgo/go/net/http/httputil/persist.go
deleted file mode 100644
index 987bcc9..0000000
--- a/third_party/gofrontend/libgo/go/net/http/httputil/persist.go
+++ /dev/null
@@ -1,429 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package httputil
-
-import (
-	"bufio"
-	"errors"
-	"io"
-	"net"
-	"net/http"
-	"net/textproto"
-	"sync"
-)
-
-var (
-	ErrPersistEOF = &http.ProtocolError{ErrorString: "persistent connection closed"}
-	ErrClosed     = &http.ProtocolError{ErrorString: "connection closed by user"}
-	ErrPipeline   = &http.ProtocolError{ErrorString: "pipeline error"}
-)
-
-// This is an API usage error - the local side is closed.
-// ErrPersistEOF (above) reports that the remote side is closed.
-var errClosed = errors.New("i/o operation on closed connection")
-
-// A ServerConn reads requests and sends responses over an underlying
-// connection, until the HTTP keepalive logic commands an end. ServerConn
-// also allows hijacking the underlying connection by calling Hijack
-// to regain control over the connection. ServerConn supports pipe-lining,
-// i.e. requests can be read out of sync (but in the same order) while the
-// respective responses are sent.
-//
-// ServerConn is low-level and old. Applications should instead use Server
-// in the net/http package.
-type ServerConn struct {
-	lk              sync.Mutex // read-write protects the following fields
-	c               net.Conn
-	r               *bufio.Reader
-	re, we          error // read/write errors
-	lastbody        io.ReadCloser
-	nread, nwritten int
-	pipereq         map[*http.Request]uint
-
-	pipe textproto.Pipeline
-}
-
-// NewServerConn returns a new ServerConn reading and writing c. If r is not
-// nil, it is the buffer to use when reading c.
-//
-// ServerConn is low-level and old. Applications should instead use Server
-// in the net/http package.
-func NewServerConn(c net.Conn, r *bufio.Reader) *ServerConn {
-	if r == nil {
-		r = bufio.NewReader(c)
-	}
-	return &ServerConn{c: c, r: r, pipereq: make(map[*http.Request]uint)}
-}
-
-// Hijack detaches the ServerConn and returns the underlying connection as well
-// as the read-side bufio which may have some left over data. Hijack may be
-// called before Read has signaled the end of the keep-alive logic. The user
-// should not call Hijack while Read or Write is in progress.
-func (sc *ServerConn) Hijack() (c net.Conn, r *bufio.Reader) {
-	sc.lk.Lock()
-	defer sc.lk.Unlock()
-	c = sc.c
-	r = sc.r
-	sc.c = nil
-	sc.r = nil
-	return
-}
-
-// Close calls Hijack and then also closes the underlying connection
-func (sc *ServerConn) Close() error {
-	c, _ := sc.Hijack()
-	if c != nil {
-		return c.Close()
-	}
-	return nil
-}
-
-// Read returns the next request on the wire. An ErrPersistEOF is returned if
-// it is gracefully determined that there are no more requests (e.g. after the
-// first request on an HTTP/1.0 connection, or after a Connection:close on a
-// HTTP/1.1 connection).
-func (sc *ServerConn) Read() (req *http.Request, err error) {
-
-	// Ensure ordered execution of Reads and Writes
-	id := sc.pipe.Next()
-	sc.pipe.StartRequest(id)
-	defer func() {
-		sc.pipe.EndRequest(id)
-		if req == nil {
-			sc.pipe.StartResponse(id)
-			sc.pipe.EndResponse(id)
-		} else {
-			// Remember the pipeline id of this request
-			sc.lk.Lock()
-			sc.pipereq[req] = id
-			sc.lk.Unlock()
-		}
-	}()
-
-	sc.lk.Lock()
-	if sc.we != nil { // no point receiving if write-side broken or closed
-		defer sc.lk.Unlock()
-		return nil, sc.we
-	}
-	if sc.re != nil {
-		defer sc.lk.Unlock()
-		return nil, sc.re
-	}
-	if sc.r == nil { // connection closed by user in the meantime
-		defer sc.lk.Unlock()
-		return nil, errClosed
-	}
-	r := sc.r
-	lastbody := sc.lastbody
-	sc.lastbody = nil
-	sc.lk.Unlock()
-
-	// Make sure body is fully consumed, even if user does not call body.Close
-	if lastbody != nil {
-		// body.Close is assumed to be idempotent and multiple calls to
-		// it should return the error that its first invocation
-		// returned.
-		err = lastbody.Close()
-		if err != nil {
-			sc.lk.Lock()
-			defer sc.lk.Unlock()
-			sc.re = err
-			return nil, err
-		}
-	}
-
-	req, err = http.ReadRequest(r)
-	sc.lk.Lock()
-	defer sc.lk.Unlock()
-	if err != nil {
-		if err == io.ErrUnexpectedEOF {
-			// A close from the opposing client is treated as a
-			// graceful close, even if there was some unparse-able
-			// data before the close.
-			sc.re = ErrPersistEOF
-			return nil, sc.re
-		} else {
-			sc.re = err
-			return req, err
-		}
-	}
-	sc.lastbody = req.Body
-	sc.nread++
-	if req.Close {
-		sc.re = ErrPersistEOF
-		return req, sc.re
-	}
-	return req, err
-}
-
-// Pending returns the number of unanswered requests
-// that have been received on the connection.
-func (sc *ServerConn) Pending() int {
-	sc.lk.Lock()
-	defer sc.lk.Unlock()
-	return sc.nread - sc.nwritten
-}
-
-// Write writes resp in response to req. To close the connection gracefully, set the
-// Response.Close field to true. Write should be considered operational until
-// it returns an error, regardless of any errors returned on the Read side.
-func (sc *ServerConn) Write(req *http.Request, resp *http.Response) error {
-
-	// Retrieve the pipeline ID of this request/response pair
-	sc.lk.Lock()
-	id, ok := sc.pipereq[req]
-	delete(sc.pipereq, req)
-	if !ok {
-		sc.lk.Unlock()
-		return ErrPipeline
-	}
-	sc.lk.Unlock()
-
-	// Ensure pipeline order
-	sc.pipe.StartResponse(id)
-	defer sc.pipe.EndResponse(id)
-
-	sc.lk.Lock()
-	if sc.we != nil {
-		defer sc.lk.Unlock()
-		return sc.we
-	}
-	if sc.c == nil { // connection closed by user in the meantime
-		defer sc.lk.Unlock()
-		return ErrClosed
-	}
-	c := sc.c
-	if sc.nread <= sc.nwritten {
-		defer sc.lk.Unlock()
-		return errors.New("persist server pipe count")
-	}
-	if resp.Close {
-		// After signaling a keep-alive close, any pipelined unread
-		// requests will be lost. It is up to the user to drain them
-		// before signaling.
-		sc.re = ErrPersistEOF
-	}
-	sc.lk.Unlock()
-
-	err := resp.Write(c)
-	sc.lk.Lock()
-	defer sc.lk.Unlock()
-	if err != nil {
-		sc.we = err
-		return err
-	}
-	sc.nwritten++
-
-	return nil
-}
-
-// A ClientConn sends request and receives headers over an underlying
-// connection, while respecting the HTTP keepalive logic. ClientConn
-// supports hijacking the connection calling Hijack to
-// regain control of the underlying net.Conn and deal with it as desired.
-//
-// ClientConn is low-level and old. Applications should instead use
-// Client or Transport in the net/http package.
-type ClientConn struct {
-	lk              sync.Mutex // read-write protects the following fields
-	c               net.Conn
-	r               *bufio.Reader
-	re, we          error // read/write errors
-	lastbody        io.ReadCloser
-	nread, nwritten int
-	pipereq         map[*http.Request]uint
-
-	pipe     textproto.Pipeline
-	writeReq func(*http.Request, io.Writer) error
-}
-
-// NewClientConn returns a new ClientConn reading and writing c.  If r is not
-// nil, it is the buffer to use when reading c.
-//
-// ClientConn is low-level and old. Applications should use Client or
-// Transport in the net/http package.
-func NewClientConn(c net.Conn, r *bufio.Reader) *ClientConn {
-	if r == nil {
-		r = bufio.NewReader(c)
-	}
-	return &ClientConn{
-		c:        c,
-		r:        r,
-		pipereq:  make(map[*http.Request]uint),
-		writeReq: (*http.Request).Write,
-	}
-}
-
-// NewProxyClientConn works like NewClientConn but writes Requests
-// using Request's WriteProxy method.
-//
-// New code should not use NewProxyClientConn. See Client or
-// Transport in the net/http package instead.
-func NewProxyClientConn(c net.Conn, r *bufio.Reader) *ClientConn {
-	cc := NewClientConn(c, r)
-	cc.writeReq = (*http.Request).WriteProxy
-	return cc
-}
-
-// Hijack detaches the ClientConn and returns the underlying connection as well
-// as the read-side bufio which may have some left over data. Hijack may be
-// called before the user or Read have signaled the end of the keep-alive
-// logic. The user should not call Hijack while Read or Write is in progress.
-func (cc *ClientConn) Hijack() (c net.Conn, r *bufio.Reader) {
-	cc.lk.Lock()
-	defer cc.lk.Unlock()
-	c = cc.c
-	r = cc.r
-	cc.c = nil
-	cc.r = nil
-	return
-}
-
-// Close calls Hijack and then also closes the underlying connection
-func (cc *ClientConn) Close() error {
-	c, _ := cc.Hijack()
-	if c != nil {
-		return c.Close()
-	}
-	return nil
-}
-
-// Write writes a request. An ErrPersistEOF error is returned if the connection
-// has been closed in an HTTP keepalive sense. If req.Close equals true, the
-// keepalive connection is logically closed after this request and the opposing
-// server is informed. An ErrUnexpectedEOF indicates the remote closed the
-// underlying TCP connection, which is usually considered as graceful close.
-func (cc *ClientConn) Write(req *http.Request) (err error) {
-
-	// Ensure ordered execution of Writes
-	id := cc.pipe.Next()
-	cc.pipe.StartRequest(id)
-	defer func() {
-		cc.pipe.EndRequest(id)
-		if err != nil {
-			cc.pipe.StartResponse(id)
-			cc.pipe.EndResponse(id)
-		} else {
-			// Remember the pipeline id of this request
-			cc.lk.Lock()
-			cc.pipereq[req] = id
-			cc.lk.Unlock()
-		}
-	}()
-
-	cc.lk.Lock()
-	if cc.re != nil { // no point sending if read-side closed or broken
-		defer cc.lk.Unlock()
-		return cc.re
-	}
-	if cc.we != nil {
-		defer cc.lk.Unlock()
-		return cc.we
-	}
-	if cc.c == nil { // connection closed by user in the meantime
-		defer cc.lk.Unlock()
-		return errClosed
-	}
-	c := cc.c
-	if req.Close {
-		// We write the EOF to the write-side error, because there
-		// still might be some pipelined reads
-		cc.we = ErrPersistEOF
-	}
-	cc.lk.Unlock()
-
-	err = cc.writeReq(req, c)
-	cc.lk.Lock()
-	defer cc.lk.Unlock()
-	if err != nil {
-		cc.we = err
-		return err
-	}
-	cc.nwritten++
-
-	return nil
-}
-
-// Pending returns the number of unanswered requests
-// that have been sent on the connection.
-func (cc *ClientConn) Pending() int {
-	cc.lk.Lock()
-	defer cc.lk.Unlock()
-	return cc.nwritten - cc.nread
-}
-
-// Read reads the next response from the wire. A valid response might be
-// returned together with an ErrPersistEOF, which means that the remote
-// requested that this be the last request serviced. Read can be called
-// concurrently with Write, but not with another Read.
-func (cc *ClientConn) Read(req *http.Request) (resp *http.Response, err error) {
-	// Retrieve the pipeline ID of this request/response pair
-	cc.lk.Lock()
-	id, ok := cc.pipereq[req]
-	delete(cc.pipereq, req)
-	if !ok {
-		cc.lk.Unlock()
-		return nil, ErrPipeline
-	}
-	cc.lk.Unlock()
-
-	// Ensure pipeline order
-	cc.pipe.StartResponse(id)
-	defer cc.pipe.EndResponse(id)
-
-	cc.lk.Lock()
-	if cc.re != nil {
-		defer cc.lk.Unlock()
-		return nil, cc.re
-	}
-	if cc.r == nil { // connection closed by user in the meantime
-		defer cc.lk.Unlock()
-		return nil, errClosed
-	}
-	r := cc.r
-	lastbody := cc.lastbody
-	cc.lastbody = nil
-	cc.lk.Unlock()
-
-	// Make sure body is fully consumed, even if user does not call body.Close
-	if lastbody != nil {
-		// body.Close is assumed to be idempotent and multiple calls to
-		// it should return the error that its first invocation
-		// returned.
-		err = lastbody.Close()
-		if err != nil {
-			cc.lk.Lock()
-			defer cc.lk.Unlock()
-			cc.re = err
-			return nil, err
-		}
-	}
-
-	resp, err = http.ReadResponse(r, req)
-	cc.lk.Lock()
-	defer cc.lk.Unlock()
-	if err != nil {
-		cc.re = err
-		return resp, err
-	}
-	cc.lastbody = resp.Body
-
-	cc.nread++
-
-	if resp.Close {
-		cc.re = ErrPersistEOF // don't send any more requests
-		return resp, cc.re
-	}
-	return resp, err
-}
-
-// Do is convenience method that writes a request and reads a response.
-func (cc *ClientConn) Do(req *http.Request) (resp *http.Response, err error) {
-	err = cc.Write(req)
-	if err != nil {
-		return
-	}
-	return cc.Read(req)
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/httputil/reverseproxy.go b/third_party/gofrontend/libgo/go/net/http/httputil/reverseproxy.go
deleted file mode 100644
index c8e1132..0000000
--- a/third_party/gofrontend/libgo/go/net/http/httputil/reverseproxy.go
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// HTTP reverse proxy handler
-
-package httputil
-
-import (
-	"io"
-	"log"
-	"net"
-	"net/http"
-	"net/url"
-	"strings"
-	"sync"
-	"time"
-)
-
-// onExitFlushLoop is a callback set by tests to detect the state of the
-// flushLoop() goroutine.
-var onExitFlushLoop func()
-
-// ReverseProxy is an HTTP Handler that takes an incoming request and
-// sends it to another server, proxying the response back to the
-// client.
-type ReverseProxy struct {
-	// Director must be a function which modifies
-	// the request into a new request to be sent
-	// using Transport. Its response is then copied
-	// back to the original client unmodified.
-	Director func(*http.Request)
-
-	// The transport used to perform proxy requests.
-	// If nil, http.DefaultTransport is used.
-	Transport http.RoundTripper
-
-	// FlushInterval specifies the flush interval
-	// to flush to the client while copying the
-	// response body.
-	// If zero, no periodic flushing is done.
-	FlushInterval time.Duration
-
-	// ErrorLog specifies an optional logger for errors
-	// that occur when attempting to proxy the request.
-	// If nil, logging goes to os.Stderr via the log package's
-	// standard logger.
-	ErrorLog *log.Logger
-}
-
-func singleJoiningSlash(a, b string) string {
-	aslash := strings.HasSuffix(a, "/")
-	bslash := strings.HasPrefix(b, "/")
-	switch {
-	case aslash && bslash:
-		return a + b[1:]
-	case !aslash && !bslash:
-		return a + "/" + b
-	}
-	return a + b
-}
-
-// NewSingleHostReverseProxy returns a new ReverseProxy that rewrites
-// URLs to the scheme, host, and base path provided in target. If the
-// target's path is "/base" and the incoming request was for "/dir",
-// the target request will be for /base/dir.
-func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy {
-	targetQuery := target.RawQuery
-	director := func(req *http.Request) {
-		req.URL.Scheme = target.Scheme
-		req.URL.Host = target.Host
-		req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path)
-		if targetQuery == "" || req.URL.RawQuery == "" {
-			req.URL.RawQuery = targetQuery + req.URL.RawQuery
-		} else {
-			req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery
-		}
-	}
-	return &ReverseProxy{Director: director}
-}
-
-func copyHeader(dst, src http.Header) {
-	for k, vv := range src {
-		for _, v := range vv {
-			dst.Add(k, v)
-		}
-	}
-}
-
-// Hop-by-hop headers. These are removed when sent to the backend.
-// http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
-var hopHeaders = []string{
-	"Connection",
-	"Keep-Alive",
-	"Proxy-Authenticate",
-	"Proxy-Authorization",
-	"Te", // canonicalized version of "TE"
-	"Trailers",
-	"Transfer-Encoding",
-	"Upgrade",
-}
-
-type requestCanceler interface {
-	CancelRequest(*http.Request)
-}
-
-type runOnFirstRead struct {
-	io.Reader // optional; nil means empty body
-
-	fn func() // Run before first Read, then set to nil
-}
-
-func (c *runOnFirstRead) Read(bs []byte) (int, error) {
-	if c.fn != nil {
-		c.fn()
-		c.fn = nil
-	}
-	if c.Reader == nil {
-		return 0, io.EOF
-	}
-	return c.Reader.Read(bs)
-}
-
-func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
-	transport := p.Transport
-	if transport == nil {
-		transport = http.DefaultTransport
-	}
-
-	outreq := new(http.Request)
-	*outreq = *req // includes shallow copies of maps, but okay
-
-	if closeNotifier, ok := rw.(http.CloseNotifier); ok {
-		if requestCanceler, ok := transport.(requestCanceler); ok {
-			reqDone := make(chan struct{})
-			defer close(reqDone)
-
-			clientGone := closeNotifier.CloseNotify()
-
-			outreq.Body = struct {
-				io.Reader
-				io.Closer
-			}{
-				Reader: &runOnFirstRead{
-					Reader: outreq.Body,
-					fn: func() {
-						go func() {
-							select {
-							case <-clientGone:
-								requestCanceler.CancelRequest(outreq)
-							case <-reqDone:
-							}
-						}()
-					},
-				},
-				Closer: outreq.Body,
-			}
-		}
-	}
-
-	p.Director(outreq)
-	outreq.Proto = "HTTP/1.1"
-	outreq.ProtoMajor = 1
-	outreq.ProtoMinor = 1
-	outreq.Close = false
-
-	// Remove hop-by-hop headers to the backend.  Especially
-	// important is "Connection" because we want a persistent
-	// connection, regardless of what the client sent to us.  This
-	// is modifying the same underlying map from req (shallow
-	// copied above) so we only copy it if necessary.
-	copiedHeaders := false
-	for _, h := range hopHeaders {
-		if outreq.Header.Get(h) != "" {
-			if !copiedHeaders {
-				outreq.Header = make(http.Header)
-				copyHeader(outreq.Header, req.Header)
-				copiedHeaders = true
-			}
-			outreq.Header.Del(h)
-		}
-	}
-
-	if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
-		// If we aren't the first proxy retain prior
-		// X-Forwarded-For information as a comma+space
-		// separated list and fold multiple headers into one.
-		if prior, ok := outreq.Header["X-Forwarded-For"]; ok {
-			clientIP = strings.Join(prior, ", ") + ", " + clientIP
-		}
-		outreq.Header.Set("X-Forwarded-For", clientIP)
-	}
-
-	res, err := transport.RoundTrip(outreq)
-	if err != nil {
-		p.logf("http: proxy error: %v", err)
-		rw.WriteHeader(http.StatusInternalServerError)
-		return
-	}
-
-	for _, h := range hopHeaders {
-		res.Header.Del(h)
-	}
-
-	copyHeader(rw.Header(), res.Header)
-
-	// The "Trailer" header isn't included in the Transport's response,
-	// at least for *http.Transport. Build it up from Trailer.
-	if len(res.Trailer) > 0 {
-		var trailerKeys []string
-		for k := range res.Trailer {
-			trailerKeys = append(trailerKeys, k)
-		}
-		rw.Header().Add("Trailer", strings.Join(trailerKeys, ", "))
-	}
-
-	rw.WriteHeader(res.StatusCode)
-	if len(res.Trailer) > 0 {
-		// Force chunking if we saw a response trailer.
-		// This prevents net/http from calculating the length for short
-		// bodies and adding a Content-Length.
-		if fl, ok := rw.(http.Flusher); ok {
-			fl.Flush()
-		}
-	}
-	p.copyResponse(rw, res.Body)
-	res.Body.Close() // close now, instead of defer, to populate res.Trailer
-	copyHeader(rw.Header(), res.Trailer)
-}
-
-func (p *ReverseProxy) copyResponse(dst io.Writer, src io.Reader) {
-	if p.FlushInterval != 0 {
-		if wf, ok := dst.(writeFlusher); ok {
-			mlw := &maxLatencyWriter{
-				dst:     wf,
-				latency: p.FlushInterval,
-				done:    make(chan bool),
-			}
-			go mlw.flushLoop()
-			defer mlw.stop()
-			dst = mlw
-		}
-	}
-
-	io.Copy(dst, src)
-}
-
-func (p *ReverseProxy) logf(format string, args ...interface{}) {
-	if p.ErrorLog != nil {
-		p.ErrorLog.Printf(format, args...)
-	} else {
-		log.Printf(format, args...)
-	}
-}
-
-type writeFlusher interface {
-	io.Writer
-	http.Flusher
-}
-
-type maxLatencyWriter struct {
-	dst     writeFlusher
-	latency time.Duration
-
-	lk   sync.Mutex // protects Write + Flush
-	done chan bool
-}
-
-func (m *maxLatencyWriter) Write(p []byte) (int, error) {
-	m.lk.Lock()
-	defer m.lk.Unlock()
-	return m.dst.Write(p)
-}
-
-func (m *maxLatencyWriter) flushLoop() {
-	t := time.NewTicker(m.latency)
-	defer t.Stop()
-	for {
-		select {
-		case <-m.done:
-			if onExitFlushLoop != nil {
-				onExitFlushLoop()
-			}
-			return
-		case <-t.C:
-			m.lk.Lock()
-			m.dst.Flush()
-			m.lk.Unlock()
-		}
-	}
-}
-
-func (m *maxLatencyWriter) stop() { m.done <- true }
diff --git a/third_party/gofrontend/libgo/go/net/http/httputil/reverseproxy_test.go b/third_party/gofrontend/libgo/go/net/http/httputil/reverseproxy_test.go
deleted file mode 100644
index 80a26ab..0000000
--- a/third_party/gofrontend/libgo/go/net/http/httputil/reverseproxy_test.go
+++ /dev/null
@@ -1,322 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Reverse proxy tests.
-
-package httputil
-
-import (
-	"bufio"
-	"io/ioutil"
-	"log"
-	"net/http"
-	"net/http/httptest"
-	"net/url"
-	"reflect"
-	"runtime"
-	"strings"
-	"testing"
-	"time"
-)
-
-const fakeHopHeader = "X-Fake-Hop-Header-For-Test"
-
-func init() {
-	hopHeaders = append(hopHeaders, fakeHopHeader)
-}
-
-func TestReverseProxy(t *testing.T) {
-	const backendResponse = "I am the backend"
-	const backendStatus = 404
-	backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		if len(r.TransferEncoding) > 0 {
-			t.Errorf("backend got unexpected TransferEncoding: %v", r.TransferEncoding)
-		}
-		if r.Header.Get("X-Forwarded-For") == "" {
-			t.Errorf("didn't get X-Forwarded-For header")
-		}
-		if c := r.Header.Get("Connection"); c != "" {
-			t.Errorf("handler got Connection header value %q", c)
-		}
-		if c := r.Header.Get("Upgrade"); c != "" {
-			t.Errorf("handler got Upgrade header value %q", c)
-		}
-		if g, e := r.Host, "some-name"; g != e {
-			t.Errorf("backend got Host header %q, want %q", g, e)
-		}
-		w.Header().Set("Trailer", "X-Trailer")
-		w.Header().Set("X-Foo", "bar")
-		w.Header().Set("Upgrade", "foo")
-		w.Header().Set(fakeHopHeader, "foo")
-		w.Header().Add("X-Multi-Value", "foo")
-		w.Header().Add("X-Multi-Value", "bar")
-		http.SetCookie(w, &http.Cookie{Name: "flavor", Value: "chocolateChip"})
-		w.WriteHeader(backendStatus)
-		w.Write([]byte(backendResponse))
-		w.Header().Set("X-Trailer", "trailer_value")
-	}))
-	defer backend.Close()
-	backendURL, err := url.Parse(backend.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	proxyHandler := NewSingleHostReverseProxy(backendURL)
-	frontend := httptest.NewServer(proxyHandler)
-	defer frontend.Close()
-
-	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
-	getReq.Host = "some-name"
-	getReq.Header.Set("Connection", "close")
-	getReq.Header.Set("Upgrade", "foo")
-	getReq.Close = true
-	res, err := http.DefaultClient.Do(getReq)
-	if err != nil {
-		t.Fatalf("Get: %v", err)
-	}
-	if g, e := res.StatusCode, backendStatus; g != e {
-		t.Errorf("got res.StatusCode %d; expected %d", g, e)
-	}
-	if g, e := res.Header.Get("X-Foo"), "bar"; g != e {
-		t.Errorf("got X-Foo %q; expected %q", g, e)
-	}
-	if c := res.Header.Get(fakeHopHeader); c != "" {
-		t.Errorf("got %s header value %q", fakeHopHeader, c)
-	}
-	if g, e := len(res.Header["X-Multi-Value"]), 2; g != e {
-		t.Errorf("got %d X-Multi-Value header values; expected %d", g, e)
-	}
-	if g, e := len(res.Header["Set-Cookie"]), 1; g != e {
-		t.Fatalf("got %d SetCookies, want %d", g, e)
-	}
-	if g, e := res.Trailer, (http.Header{"X-Trailer": nil}); !reflect.DeepEqual(g, e) {
-		t.Errorf("before reading body, Trailer = %#v; want %#v", g, e)
-	}
-	if cookie := res.Cookies()[0]; cookie.Name != "flavor" {
-		t.Errorf("unexpected cookie %q", cookie.Name)
-	}
-	bodyBytes, _ := ioutil.ReadAll(res.Body)
-	if g, e := string(bodyBytes), backendResponse; g != e {
-		t.Errorf("got body %q; expected %q", g, e)
-	}
-	if g, e := res.Trailer.Get("X-Trailer"), "trailer_value"; g != e {
-		t.Errorf("Trailer(X-Trailer) = %q ; want %q", g, e)
-	}
-
-}
-
-func TestXForwardedFor(t *testing.T) {
-	const prevForwardedFor = "client ip"
-	const backendResponse = "I am the backend"
-	const backendStatus = 404
-	backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		if r.Header.Get("X-Forwarded-For") == "" {
-			t.Errorf("didn't get X-Forwarded-For header")
-		}
-		if !strings.Contains(r.Header.Get("X-Forwarded-For"), prevForwardedFor) {
-			t.Errorf("X-Forwarded-For didn't contain prior data")
-		}
-		w.WriteHeader(backendStatus)
-		w.Write([]byte(backendResponse))
-	}))
-	defer backend.Close()
-	backendURL, err := url.Parse(backend.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	proxyHandler := NewSingleHostReverseProxy(backendURL)
-	frontend := httptest.NewServer(proxyHandler)
-	defer frontend.Close()
-
-	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
-	getReq.Host = "some-name"
-	getReq.Header.Set("Connection", "close")
-	getReq.Header.Set("X-Forwarded-For", prevForwardedFor)
-	getReq.Close = true
-	res, err := http.DefaultClient.Do(getReq)
-	if err != nil {
-		t.Fatalf("Get: %v", err)
-	}
-	if g, e := res.StatusCode, backendStatus; g != e {
-		t.Errorf("got res.StatusCode %d; expected %d", g, e)
-	}
-	bodyBytes, _ := ioutil.ReadAll(res.Body)
-	if g, e := string(bodyBytes), backendResponse; g != e {
-		t.Errorf("got body %q; expected %q", g, e)
-	}
-}
-
-var proxyQueryTests = []struct {
-	baseSuffix string // suffix to add to backend URL
-	reqSuffix  string // suffix to add to frontend's request URL
-	want       string // what backend should see for final request URL (without ?)
-}{
-	{"", "", ""},
-	{"?sta=tic", "?us=er", "sta=tic&us=er"},
-	{"", "?us=er", "us=er"},
-	{"?sta=tic", "", "sta=tic"},
-}
-
-func TestReverseProxyQuery(t *testing.T) {
-	backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		w.Header().Set("X-Got-Query", r.URL.RawQuery)
-		w.Write([]byte("hi"))
-	}))
-	defer backend.Close()
-
-	for i, tt := range proxyQueryTests {
-		backendURL, err := url.Parse(backend.URL + tt.baseSuffix)
-		if err != nil {
-			t.Fatal(err)
-		}
-		frontend := httptest.NewServer(NewSingleHostReverseProxy(backendURL))
-		req, _ := http.NewRequest("GET", frontend.URL+tt.reqSuffix, nil)
-		req.Close = true
-		res, err := http.DefaultClient.Do(req)
-		if err != nil {
-			t.Fatalf("%d. Get: %v", i, err)
-		}
-		if g, e := res.Header.Get("X-Got-Query"), tt.want; g != e {
-			t.Errorf("%d. got query %q; expected %q", i, g, e)
-		}
-		res.Body.Close()
-		frontend.Close()
-	}
-}
-
-func TestReverseProxyFlushInterval(t *testing.T) {
-	const expected = "hi"
-	backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		w.Write([]byte(expected))
-	}))
-	defer backend.Close()
-
-	backendURL, err := url.Parse(backend.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	proxyHandler := NewSingleHostReverseProxy(backendURL)
-	proxyHandler.FlushInterval = time.Microsecond
-
-	done := make(chan bool)
-	onExitFlushLoop = func() { done <- true }
-	defer func() { onExitFlushLoop = nil }()
-
-	frontend := httptest.NewServer(proxyHandler)
-	defer frontend.Close()
-
-	req, _ := http.NewRequest("GET", frontend.URL, nil)
-	req.Close = true
-	res, err := http.DefaultClient.Do(req)
-	if err != nil {
-		t.Fatalf("Get: %v", err)
-	}
-	defer res.Body.Close()
-	if bodyBytes, _ := ioutil.ReadAll(res.Body); string(bodyBytes) != expected {
-		t.Errorf("got body %q; expected %q", bodyBytes, expected)
-	}
-
-	select {
-	case <-done:
-		// OK
-	case <-time.After(5 * time.Second):
-		t.Error("maxLatencyWriter flushLoop() never exited")
-	}
-}
-
-func TestReverseProxyCancellation(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping test; see https://golang.org/issue/9554")
-	}
-	const backendResponse = "I am the backend"
-
-	reqInFlight := make(chan struct{})
-	backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		close(reqInFlight)
-
-		select {
-		case <-time.After(10 * time.Second):
-			// Note: this should only happen in broken implementations, and the
-			// closenotify case should be instantaneous.
-			t.Log("Failed to close backend connection")
-			t.Fail()
-		case <-w.(http.CloseNotifier).CloseNotify():
-		}
-
-		w.WriteHeader(http.StatusOK)
-		w.Write([]byte(backendResponse))
-	}))
-
-	defer backend.Close()
-
-	backend.Config.ErrorLog = log.New(ioutil.Discard, "", 0)
-
-	backendURL, err := url.Parse(backend.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	proxyHandler := NewSingleHostReverseProxy(backendURL)
-
-	// Discards errors of the form:
-	// http: proxy error: read tcp 127.0.0.1:44643: use of closed network connection
-	proxyHandler.ErrorLog = log.New(ioutil.Discard, "", 0)
-
-	frontend := httptest.NewServer(proxyHandler)
-	defer frontend.Close()
-
-	getReq, _ := http.NewRequest("GET", frontend.URL, nil)
-	go func() {
-		<-reqInFlight
-		http.DefaultTransport.(*http.Transport).CancelRequest(getReq)
-	}()
-	res, err := http.DefaultClient.Do(getReq)
-	if res != nil {
-		t.Fatal("Non-nil response")
-	}
-	if err == nil {
-		// This should be an error like:
-		// Get http://127.0.0.1:58079: read tcp 127.0.0.1:58079:
-		//    use of closed network connection
-		t.Fatal("DefaultClient.Do() returned nil error")
-	}
-}
-
-func req(t *testing.T, v string) *http.Request {
-	req, err := http.ReadRequest(bufio.NewReader(strings.NewReader(v)))
-	if err != nil {
-		t.Fatal(err)
-	}
-	return req
-}
-
-// Issue 12344
-func TestNilBody(t *testing.T) {
-	backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		w.Write([]byte("hi"))
-	}))
-	defer backend.Close()
-
-	frontend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
-		backURL, _ := url.Parse(backend.URL)
-		rp := NewSingleHostReverseProxy(backURL)
-		r := req(t, "GET / HTTP/1.0\r\n\r\n")
-		r.Body = nil // this accidentally worked in Go 1.4 and below, so keep it working
-		rp.ServeHTTP(w, r)
-	}))
-	defer frontend.Close()
-
-	res, err := http.Get(frontend.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer res.Body.Close()
-	slurp, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if string(slurp) != "hi" {
-		t.Errorf("Got %q; want %q", slurp, "hi")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/internal/chunked.go b/third_party/gofrontend/libgo/go/net/http/internal/chunked.go
deleted file mode 100644
index 6d7c698..0000000
--- a/third_party/gofrontend/libgo/go/net/http/internal/chunked.go
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The wire protocol for HTTP's "chunked" Transfer-Encoding.
-
-// Package internal contains HTTP internals shared by net/http and
-// net/http/httputil.
-package internal
-
-import (
-	"bufio"
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-)
-
-const maxLineLength = 4096 // assumed <= bufio.defaultBufSize
-
-var ErrLineTooLong = errors.New("header line too long")
-
-// NewChunkedReader returns a new chunkedReader that translates the data read from r
-// out of HTTP "chunked" format before returning it.
-// The chunkedReader returns io.EOF when the final 0-length chunk is read.
-//
-// NewChunkedReader is not needed by normal applications. The http package
-// automatically decodes chunking when reading response bodies.
-func NewChunkedReader(r io.Reader) io.Reader {
-	br, ok := r.(*bufio.Reader)
-	if !ok {
-		br = bufio.NewReader(r)
-	}
-	return &chunkedReader{r: br}
-}
-
-type chunkedReader struct {
-	r   *bufio.Reader
-	n   uint64 // unread bytes in chunk
-	err error
-	buf [2]byte
-}
-
-func (cr *chunkedReader) beginChunk() {
-	// chunk-size CRLF
-	var line []byte
-	line, cr.err = readLine(cr.r)
-	if cr.err != nil {
-		return
-	}
-	cr.n, cr.err = parseHexUint(line)
-	if cr.err != nil {
-		return
-	}
-	if cr.n == 0 {
-		cr.err = io.EOF
-	}
-}
-
-func (cr *chunkedReader) chunkHeaderAvailable() bool {
-	n := cr.r.Buffered()
-	if n > 0 {
-		peek, _ := cr.r.Peek(n)
-		return bytes.IndexByte(peek, '\n') >= 0
-	}
-	return false
-}
-
-func (cr *chunkedReader) Read(b []uint8) (n int, err error) {
-	for cr.err == nil {
-		if cr.n == 0 {
-			if n > 0 && !cr.chunkHeaderAvailable() {
-				// We've read enough. Don't potentially block
-				// reading a new chunk header.
-				break
-			}
-			cr.beginChunk()
-			continue
-		}
-		if len(b) == 0 {
-			break
-		}
-		rbuf := b
-		if uint64(len(rbuf)) > cr.n {
-			rbuf = rbuf[:cr.n]
-		}
-		var n0 int
-		n0, cr.err = cr.r.Read(rbuf)
-		n += n0
-		b = b[n0:]
-		cr.n -= uint64(n0)
-		// If we're at the end of a chunk, read the next two
-		// bytes to verify they are "\r\n".
-		if cr.n == 0 && cr.err == nil {
-			if _, cr.err = io.ReadFull(cr.r, cr.buf[:2]); cr.err == nil {
-				if cr.buf[0] != '\r' || cr.buf[1] != '\n' {
-					cr.err = errors.New("malformed chunked encoding")
-				}
-			}
-		}
-	}
-	return n, cr.err
-}
-
-// Read a line of bytes (up to \n) from b.
-// Give up if the line exceeds maxLineLength.
-// The returned bytes are a pointer into storage in
-// the bufio, so they are only valid until the next bufio read.
-func readLine(b *bufio.Reader) (p []byte, err error) {
-	if p, err = b.ReadSlice('\n'); err != nil {
-		// We always know when EOF is coming.
-		// If the caller asked for a line, there should be a line.
-		if err == io.EOF {
-			err = io.ErrUnexpectedEOF
-		} else if err == bufio.ErrBufferFull {
-			err = ErrLineTooLong
-		}
-		return nil, err
-	}
-	if len(p) >= maxLineLength {
-		return nil, ErrLineTooLong
-	}
-	return trimTrailingWhitespace(p), nil
-}
-
-func trimTrailingWhitespace(b []byte) []byte {
-	for len(b) > 0 && isASCIISpace(b[len(b)-1]) {
-		b = b[:len(b)-1]
-	}
-	return b
-}
-
-func isASCIISpace(b byte) bool {
-	return b == ' ' || b == '\t' || b == '\n' || b == '\r'
-}
-
-// NewChunkedWriter returns a new chunkedWriter that translates writes into HTTP
-// "chunked" format before writing them to w. Closing the returned chunkedWriter
-// sends the final 0-length chunk that marks the end of the stream.
-//
-// NewChunkedWriter is not needed by normal applications. The http
-// package adds chunking automatically if handlers don't set a
-// Content-Length header. Using newChunkedWriter inside a handler
-// would result in double chunking or chunking with a Content-Length
-// length, both of which are wrong.
-func NewChunkedWriter(w io.Writer) io.WriteCloser {
-	return &chunkedWriter{w}
-}
-
-// Writing to chunkedWriter translates to writing in HTTP chunked Transfer
-// Encoding wire format to the underlying Wire chunkedWriter.
-type chunkedWriter struct {
-	Wire io.Writer
-}
-
-// Write the contents of data as one chunk to Wire.
-// NOTE: Note that the corresponding chunk-writing procedure in Conn.Write has
-// a bug since it does not check for success of io.WriteString
-func (cw *chunkedWriter) Write(data []byte) (n int, err error) {
-
-	// Don't send 0-length data. It looks like EOF for chunked encoding.
-	if len(data) == 0 {
-		return 0, nil
-	}
-
-	if _, err = fmt.Fprintf(cw.Wire, "%x\r\n", len(data)); err != nil {
-		return 0, err
-	}
-	if n, err = cw.Wire.Write(data); err != nil {
-		return
-	}
-	if n != len(data) {
-		err = io.ErrShortWrite
-		return
-	}
-	if _, err = io.WriteString(cw.Wire, "\r\n"); err != nil {
-		return
-	}
-	if bw, ok := cw.Wire.(*FlushAfterChunkWriter); ok {
-		err = bw.Flush()
-	}
-	return
-}
-
-func (cw *chunkedWriter) Close() error {
-	_, err := io.WriteString(cw.Wire, "0\r\n")
-	return err
-}
-
-// FlushAfterChunkWriter signals from the caller of NewChunkedWriter
-// that each chunk should be followed by a flush. It is used by the
-// http.Transport code to keep the buffering behavior for headers and
-// trailers, but flush out chunks aggressively in the middle for
-// request bodies which may be generated slowly. See Issue 6574.
-type FlushAfterChunkWriter struct {
-	*bufio.Writer
-}
-
-func parseHexUint(v []byte) (n uint64, err error) {
-	for _, b := range v {
-		n <<= 4
-		switch {
-		case '0' <= b && b <= '9':
-			b = b - '0'
-		case 'a' <= b && b <= 'f':
-			b = b - 'a' + 10
-		case 'A' <= b && b <= 'F':
-			b = b - 'A' + 10
-		default:
-			return 0, errors.New("invalid byte in chunk length")
-		}
-		n |= uint64(b)
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/internal/chunked_test.go b/third_party/gofrontend/libgo/go/net/http/internal/chunked_test.go
deleted file mode 100644
index ebc626e..0000000
--- a/third_party/gofrontend/libgo/go/net/http/internal/chunked_test.go
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package internal
-
-import (
-	"bufio"
-	"bytes"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"strings"
-	"testing"
-)
-
-func TestChunk(t *testing.T) {
-	var b bytes.Buffer
-
-	w := NewChunkedWriter(&b)
-	const chunk1 = "hello, "
-	const chunk2 = "world! 0123456789abcdef"
-	w.Write([]byte(chunk1))
-	w.Write([]byte(chunk2))
-	w.Close()
-
-	if g, e := b.String(), "7\r\nhello, \r\n17\r\nworld! 0123456789abcdef\r\n0\r\n"; g != e {
-		t.Fatalf("chunk writer wrote %q; want %q", g, e)
-	}
-
-	r := NewChunkedReader(&b)
-	data, err := ioutil.ReadAll(r)
-	if err != nil {
-		t.Logf(`data: "%s"`, data)
-		t.Fatalf("ReadAll from reader: %v", err)
-	}
-	if g, e := string(data), chunk1+chunk2; g != e {
-		t.Errorf("chunk reader read %q; want %q", g, e)
-	}
-}
-
-func TestChunkReadMultiple(t *testing.T) {
-	// Bunch of small chunks, all read together.
-	{
-		var b bytes.Buffer
-		w := NewChunkedWriter(&b)
-		w.Write([]byte("foo"))
-		w.Write([]byte("bar"))
-		w.Close()
-
-		r := NewChunkedReader(&b)
-		buf := make([]byte, 10)
-		n, err := r.Read(buf)
-		if n != 6 || err != io.EOF {
-			t.Errorf("Read = %d, %v; want 6, EOF", n, err)
-		}
-		buf = buf[:n]
-		if string(buf) != "foobar" {
-			t.Errorf("Read = %q; want %q", buf, "foobar")
-		}
-	}
-
-	// One big chunk followed by a little chunk, but the small bufio.Reader size
-	// should prevent the second chunk header from being read.
-	{
-		var b bytes.Buffer
-		w := NewChunkedWriter(&b)
-		// fillBufChunk is 11 bytes + 3 bytes header + 2 bytes footer = 16 bytes,
-		// the same as the bufio ReaderSize below (the minimum), so even
-		// though we're going to try to Read with a buffer larger enough to also
-		// receive "foo", the second chunk header won't be read yet.
-		const fillBufChunk = "0123456789a"
-		const shortChunk = "foo"
-		w.Write([]byte(fillBufChunk))
-		w.Write([]byte(shortChunk))
-		w.Close()
-
-		r := NewChunkedReader(bufio.NewReaderSize(&b, 16))
-		buf := make([]byte, len(fillBufChunk)+len(shortChunk))
-		n, err := r.Read(buf)
-		if n != len(fillBufChunk) || err != nil {
-			t.Errorf("Read = %d, %v; want %d, nil", n, err, len(fillBufChunk))
-		}
-		buf = buf[:n]
-		if string(buf) != fillBufChunk {
-			t.Errorf("Read = %q; want %q", buf, fillBufChunk)
-		}
-
-		n, err = r.Read(buf)
-		if n != len(shortChunk) || err != io.EOF {
-			t.Errorf("Read = %d, %v; want %d, EOF", n, err, len(shortChunk))
-		}
-	}
-
-	// And test that we see an EOF chunk, even though our buffer is already full:
-	{
-		r := NewChunkedReader(bufio.NewReader(strings.NewReader("3\r\nfoo\r\n0\r\n")))
-		buf := make([]byte, 3)
-		n, err := r.Read(buf)
-		if n != 3 || err != io.EOF {
-			t.Errorf("Read = %d, %v; want 3, EOF", n, err)
-		}
-		if string(buf) != "foo" {
-			t.Errorf("buf = %q; want foo", buf)
-		}
-	}
-}
-
-func TestChunkReaderAllocs(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in short mode")
-	}
-	var buf bytes.Buffer
-	w := NewChunkedWriter(&buf)
-	a, b, c := []byte("aaaaaa"), []byte("bbbbbbbbbbbb"), []byte("cccccccccccccccccccccccc")
-	w.Write(a)
-	w.Write(b)
-	w.Write(c)
-	w.Close()
-
-	readBuf := make([]byte, len(a)+len(b)+len(c)+1)
-	byter := bytes.NewReader(buf.Bytes())
-	bufr := bufio.NewReader(byter)
-	mallocs := testing.AllocsPerRun(100, func() {
-		byter.Seek(0, 0)
-		bufr.Reset(byter)
-		r := NewChunkedReader(bufr)
-		n, err := io.ReadFull(r, readBuf)
-		if n != len(readBuf)-1 {
-			t.Fatalf("read %d bytes; want %d", n, len(readBuf)-1)
-		}
-		if err != io.ErrUnexpectedEOF {
-			t.Fatalf("read error = %v; want ErrUnexpectedEOF", err)
-		}
-	})
-	if mallocs > 1.5 {
-		t.Errorf("mallocs = %v; want 1", mallocs)
-	}
-}
-
-func TestParseHexUint(t *testing.T) {
-	for i := uint64(0); i <= 1234; i++ {
-		line := []byte(fmt.Sprintf("%x", i))
-		got, err := parseHexUint(line)
-		if err != nil {
-			t.Fatalf("on %d: %v", i, err)
-		}
-		if got != i {
-			t.Errorf("for input %q = %d; want %d", line, got, i)
-		}
-	}
-	_, err := parseHexUint([]byte("bogus"))
-	if err == nil {
-		t.Error("expected error on bogus input")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/jar.go b/third_party/gofrontend/libgo/go/net/http/jar.go
deleted file mode 100644
index 5c3de0d..0000000
--- a/third_party/gofrontend/libgo/go/net/http/jar.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"net/url"
-)
-
-// A CookieJar manages storage and use of cookies in HTTP requests.
-//
-// Implementations of CookieJar must be safe for concurrent use by multiple
-// goroutines.
-//
-// The net/http/cookiejar package provides a CookieJar implementation.
-type CookieJar interface {
-	// SetCookies handles the receipt of the cookies in a reply for the
-	// given URL.  It may or may not choose to save the cookies, depending
-	// on the jar's policy and implementation.
-	SetCookies(u *url.URL, cookies []*Cookie)
-
-	// Cookies returns the cookies to send in a request for the given URL.
-	// It is up to the implementation to honor the standard cookie use
-	// restrictions such as in RFC 6265.
-	Cookies(u *url.URL) []*Cookie
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/lex.go b/third_party/gofrontend/libgo/go/net/http/lex.go
deleted file mode 100644
index 50b14f8..0000000
--- a/third_party/gofrontend/libgo/go/net/http/lex.go
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"strings"
-	"unicode/utf8"
-)
-
-// This file deals with lexical matters of HTTP
-
-var isTokenTable = [127]bool{
-	'!':  true,
-	'#':  true,
-	'$':  true,
-	'%':  true,
-	'&':  true,
-	'\'': true,
-	'*':  true,
-	'+':  true,
-	'-':  true,
-	'.':  true,
-	'0':  true,
-	'1':  true,
-	'2':  true,
-	'3':  true,
-	'4':  true,
-	'5':  true,
-	'6':  true,
-	'7':  true,
-	'8':  true,
-	'9':  true,
-	'A':  true,
-	'B':  true,
-	'C':  true,
-	'D':  true,
-	'E':  true,
-	'F':  true,
-	'G':  true,
-	'H':  true,
-	'I':  true,
-	'J':  true,
-	'K':  true,
-	'L':  true,
-	'M':  true,
-	'N':  true,
-	'O':  true,
-	'P':  true,
-	'Q':  true,
-	'R':  true,
-	'S':  true,
-	'T':  true,
-	'U':  true,
-	'W':  true,
-	'V':  true,
-	'X':  true,
-	'Y':  true,
-	'Z':  true,
-	'^':  true,
-	'_':  true,
-	'`':  true,
-	'a':  true,
-	'b':  true,
-	'c':  true,
-	'd':  true,
-	'e':  true,
-	'f':  true,
-	'g':  true,
-	'h':  true,
-	'i':  true,
-	'j':  true,
-	'k':  true,
-	'l':  true,
-	'm':  true,
-	'n':  true,
-	'o':  true,
-	'p':  true,
-	'q':  true,
-	'r':  true,
-	's':  true,
-	't':  true,
-	'u':  true,
-	'v':  true,
-	'w':  true,
-	'x':  true,
-	'y':  true,
-	'z':  true,
-	'|':  true,
-	'~':  true,
-}
-
-func isToken(r rune) bool {
-	i := int(r)
-	return i < len(isTokenTable) && isTokenTable[i]
-}
-
-func isNotToken(r rune) bool {
-	return !isToken(r)
-}
-
-// headerValuesContainsToken reports whether any string in values
-// contains the provided token, ASCII case-insensitively.
-func headerValuesContainsToken(values []string, token string) bool {
-	for _, v := range values {
-		if headerValueContainsToken(v, token) {
-			return true
-		}
-	}
-	return false
-}
-
-// isOWS reports whether b is an optional whitespace byte, as defined
-// by RFC 7230 section 3.2.3.
-func isOWS(b byte) bool { return b == ' ' || b == '\t' }
-
-// trimOWS returns x with all optional whitespace removes from the
-// beginning and end.
-func trimOWS(x string) string {
-	// TODO: consider using strings.Trim(x, " \t") instead,
-	// if and when it's fast enough. See issue 10292.
-	// But this ASCII-only code will probably always beat UTF-8
-	// aware code.
-	for len(x) > 0 && isOWS(x[0]) {
-		x = x[1:]
-	}
-	for len(x) > 0 && isOWS(x[len(x)-1]) {
-		x = x[:len(x)-1]
-	}
-	return x
-}
-
-// headerValueContainsToken reports whether v (assumed to be a
-// 0#element, in the ABNF extension described in RFC 7230 section 7)
-// contains token amongst its comma-separated tokens, ASCII
-// case-insensitively.
-func headerValueContainsToken(v string, token string) bool {
-	v = trimOWS(v)
-	if comma := strings.IndexByte(v, ','); comma != -1 {
-		return tokenEqual(trimOWS(v[:comma]), token) || headerValueContainsToken(v[comma+1:], token)
-	}
-	return tokenEqual(v, token)
-}
-
-// lowerASCII returns the ASCII lowercase version of b.
-func lowerASCII(b byte) byte {
-	if 'A' <= b && b <= 'Z' {
-		return b + ('a' - 'A')
-	}
-	return b
-}
-
-// tokenEqual reports whether t1 and t2 are equal, ASCII case-insensitively.
-func tokenEqual(t1, t2 string) bool {
-	if len(t1) != len(t2) {
-		return false
-	}
-	for i, b := range t1 {
-		if b >= utf8.RuneSelf {
-			// No UTF-8 or non-ASCII allowed in tokens.
-			return false
-		}
-		if lowerASCII(byte(b)) != lowerASCII(t2[i]) {
-			return false
-		}
-	}
-	return true
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/lex_test.go b/third_party/gofrontend/libgo/go/net/http/lex_test.go
deleted file mode 100644
index 986fda1..0000000
--- a/third_party/gofrontend/libgo/go/net/http/lex_test.go
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"testing"
-)
-
-func isChar(c rune) bool { return c <= 127 }
-
-func isCtl(c rune) bool { return c <= 31 || c == 127 }
-
-func isSeparator(c rune) bool {
-	switch c {
-	case '(', ')', '<', '>', '@', ',', ';', ':', '\\', '"', '/', '[', ']', '?', '=', '{', '}', ' ', '\t':
-		return true
-	}
-	return false
-}
-
-func TestIsToken(t *testing.T) {
-	for i := 0; i <= 130; i++ {
-		r := rune(i)
-		expected := isChar(r) && !isCtl(r) && !isSeparator(r)
-		if isToken(r) != expected {
-			t.Errorf("isToken(0x%x) = %v", r, !expected)
-		}
-	}
-}
-
-func TestHeaderValuesContainsToken(t *testing.T) {
-	tests := []struct {
-		vals  []string
-		token string
-		want  bool
-	}{
-		{
-			vals:  []string{"foo"},
-			token: "foo",
-			want:  true,
-		},
-		{
-			vals:  []string{"bar", "foo"},
-			token: "foo",
-			want:  true,
-		},
-		{
-			vals:  []string{"foo"},
-			token: "FOO",
-			want:  true,
-		},
-		{
-			vals:  []string{"foo"},
-			token: "bar",
-			want:  false,
-		},
-		{
-			vals:  []string{" foo "},
-			token: "FOO",
-			want:  true,
-		},
-		{
-			vals:  []string{"foo,bar"},
-			token: "FOO",
-			want:  true,
-		},
-		{
-			vals:  []string{"bar,foo,bar"},
-			token: "FOO",
-			want:  true,
-		},
-		{
-			vals:  []string{"bar , foo"},
-			token: "FOO",
-			want:  true,
-		},
-		{
-			vals:  []string{"foo ,bar "},
-			token: "FOO",
-			want:  true,
-		},
-		{
-			vals:  []string{"bar, foo ,bar"},
-			token: "FOO",
-			want:  true,
-		},
-		{
-			vals:  []string{"bar , foo"},
-			token: "FOO",
-			want:  true,
-		},
-	}
-	for _, tt := range tests {
-		got := headerValuesContainsToken(tt.vals, tt.token)
-		if got != tt.want {
-			t.Errorf("headerValuesContainsToken(%q, %q) = %v; want %v", tt.vals, tt.token, got, tt.want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/main_test.go b/third_party/gofrontend/libgo/go/net/http/main_test.go
deleted file mode 100644
index 12eea6f..0000000
--- a/third_party/gofrontend/libgo/go/net/http/main_test.go
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http_test
-
-import (
-	"fmt"
-	"net/http"
-	"os"
-	"runtime"
-	"sort"
-	"strings"
-	"testing"
-	"time"
-)
-
-func TestMain(m *testing.M) {
-	v := m.Run()
-	if v == 0 && goroutineLeaked() {
-		os.Exit(1)
-	}
-	os.Exit(v)
-}
-
-func interestingGoroutines() (gs []string) {
-	buf := make([]byte, 2<<20)
-	buf = buf[:runtime.Stack(buf, true)]
-	for _, g := range strings.Split(string(buf), "\n\n") {
-		sl := strings.SplitN(g, "\n", 2)
-		if len(sl) != 2 {
-			continue
-		}
-		stack := strings.TrimSpace(sl[1])
-		if stack == "" ||
-			strings.Contains(stack, "created by net.startServer") ||
-			strings.Contains(stack, "created by testing.RunTests") ||
-			strings.Contains(stack, "closeWriteAndWait") ||
-			strings.Contains(stack, "testing.Main(") ||
-			// These only show up with GOTRACEBACK=2; Issue 5005 (comment 28)
-			strings.Contains(stack, "runtime.goexit") ||
-			strings.Contains(stack, "created by runtime.gc") ||
-			strings.Contains(stack, "net/http_test.interestingGoroutines") ||
-			strings.Contains(stack, "runtime.MHeap_Scavenger") {
-			continue
-		}
-		gs = append(gs, stack)
-	}
-	sort.Strings(gs)
-	return
-}
-
-// Verify the other tests didn't leave any goroutines running.
-func goroutineLeaked() bool {
-	if testing.Short() {
-		// not counting goroutines for leakage in -short mode
-		return false
-	}
-
-	var stackCount map[string]int
-	for i := 0; i < 5; i++ {
-		n := 0
-		stackCount = make(map[string]int)
-		gs := interestingGoroutines()
-		for _, g := range gs {
-			stackCount[g]++
-			n++
-		}
-		if n == 0 {
-			return false
-		}
-		// Wait for goroutines to schedule and die off:
-		time.Sleep(100 * time.Millisecond)
-	}
-	fmt.Fprintf(os.Stderr, "Too many goroutines running after net/http test(s).\n")
-	for stack, count := range stackCount {
-		fmt.Fprintf(os.Stderr, "%d instances of:\n%s\n", count, stack)
-	}
-	return true
-}
-
-func afterTest(t testing.TB) {
-	http.DefaultTransport.(*http.Transport).CloseIdleConnections()
-	if testing.Short() {
-		return
-	}
-	var bad string
-	badSubstring := map[string]string{
-		").readLoop(":                                  "a Transport",
-		").writeLoop(":                                 "a Transport",
-		"created by net/http/httptest.(*Server).Start": "an httptest.Server",
-		"timeoutHandler":                               "a TimeoutHandler",
-		"net.(*netFD).connect(":                        "a timing out dial",
-		").noteClientGone(":                            "a closenotifier sender",
-	}
-	var stacks string
-	for i := 0; i < 4; i++ {
-		bad = ""
-		stacks = strings.Join(interestingGoroutines(), "\n\n")
-		for substr, what := range badSubstring {
-			if strings.Contains(stacks, substr) {
-				bad = what
-			}
-		}
-		if bad == "" {
-			return
-		}
-		// Bad stuff found, but goroutines might just still be
-		// shutting down, so give it some time.
-		time.Sleep(250 * time.Millisecond)
-	}
-	t.Errorf("Test appears to have leaked %s:\n%s", bad, stacks)
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/npn_test.go b/third_party/gofrontend/libgo/go/net/http/npn_test.go
deleted file mode 100644
index e2e911d..0000000
--- a/third_party/gofrontend/libgo/go/net/http/npn_test.go
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http_test
-
-import (
-	"bufio"
-	"bytes"
-	"crypto/tls"
-	"fmt"
-	"io"
-	"io/ioutil"
-	. "net/http"
-	"net/http/httptest"
-	"strings"
-	"testing"
-)
-
-func TestNextProtoUpgrade(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		fmt.Fprintf(w, "path=%s,proto=", r.URL.Path)
-		if r.TLS != nil {
-			w.Write([]byte(r.TLS.NegotiatedProtocol))
-		}
-		if r.RemoteAddr == "" {
-			t.Error("request with no RemoteAddr")
-		}
-		if r.Body == nil {
-			t.Errorf("request with nil Body")
-		}
-	}))
-	ts.TLS = &tls.Config{
-		NextProtos: []string{"unhandled-proto", "tls-0.9"},
-	}
-	ts.Config.TLSNextProto = map[string]func(*Server, *tls.Conn, Handler){
-		"tls-0.9": handleTLSProtocol09,
-	}
-	ts.StartTLS()
-	defer ts.Close()
-
-	// Normal request, without NPN.
-	{
-		tr := newTLSTransport(t, ts)
-		defer tr.CloseIdleConnections()
-		c := &Client{Transport: tr}
-
-		res, err := c.Get(ts.URL)
-		if err != nil {
-			t.Fatal(err)
-		}
-		body, err := ioutil.ReadAll(res.Body)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if want := "path=/,proto="; string(body) != want {
-			t.Errorf("plain request = %q; want %q", body, want)
-		}
-	}
-
-	// Request to an advertised but unhandled NPN protocol.
-	// Server will hang up.
-	{
-		tr := newTLSTransport(t, ts)
-		tr.TLSClientConfig.NextProtos = []string{"unhandled-proto"}
-		defer tr.CloseIdleConnections()
-		c := &Client{Transport: tr}
-
-		res, err := c.Get(ts.URL)
-		if err == nil {
-			defer res.Body.Close()
-			var buf bytes.Buffer
-			res.Write(&buf)
-			t.Errorf("expected error on unhandled-proto request; got: %s", buf.Bytes())
-		}
-	}
-
-	// Request using the "tls-0.9" protocol, which we register here.
-	// It is HTTP/0.9 over TLS.
-	{
-		tlsConfig := newTLSTransport(t, ts).TLSClientConfig
-		tlsConfig.NextProtos = []string{"tls-0.9"}
-		conn, err := tls.Dial("tcp", ts.Listener.Addr().String(), tlsConfig)
-		if err != nil {
-			t.Fatal(err)
-		}
-		conn.Write([]byte("GET /foo\n"))
-		body, err := ioutil.ReadAll(conn)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if want := "path=/foo,proto=tls-0.9"; string(body) != want {
-			t.Errorf("plain request = %q; want %q", body, want)
-		}
-	}
-}
-
-// handleTLSProtocol09 implements the HTTP/0.9 protocol over TLS, for the
-// TestNextProtoUpgrade test.
-func handleTLSProtocol09(srv *Server, conn *tls.Conn, h Handler) {
-	br := bufio.NewReader(conn)
-	line, err := br.ReadString('\n')
-	if err != nil {
-		return
-	}
-	line = strings.TrimSpace(line)
-	path := strings.TrimPrefix(line, "GET ")
-	if path == line {
-		return
-	}
-	req, _ := NewRequest("GET", path, nil)
-	req.Proto = "HTTP/0.9"
-	req.ProtoMajor = 0
-	req.ProtoMinor = 9
-	rw := &http09Writer{conn, make(Header)}
-	h.ServeHTTP(rw, req)
-}
-
-type http09Writer struct {
-	io.Writer
-	h Header
-}
-
-func (w http09Writer) Header() Header  { return w.h }
-func (w http09Writer) WriteHeader(int) {} // no headers
diff --git a/third_party/gofrontend/libgo/go/net/http/pprof/pprof.go b/third_party/gofrontend/libgo/go/net/http/pprof/pprof.go
deleted file mode 100644
index 8994392..0000000
--- a/third_party/gofrontend/libgo/go/net/http/pprof/pprof.go
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package pprof serves via its HTTP server runtime profiling data
-// in the format expected by the pprof visualization tool.
-// For more information about pprof, see
-// http://code.google.com/p/google-perftools/.
-//
-// The package is typically only imported for the side effect of
-// registering its HTTP handlers.
-// The handled paths all begin with /debug/pprof/.
-//
-// To use pprof, link this package into your program:
-//	import _ "net/http/pprof"
-//
-// If your application is not already running an http server, you
-// need to start one.  Add "net/http" and "log" to your imports and
-// the following code to your main function:
-//
-// 	go func() {
-// 		log.Println(http.ListenAndServe("localhost:6060", nil))
-// 	}()
-//
-// Then use the pprof tool to look at the heap profile:
-//
-//	go tool pprof http://localhost:6060/debug/pprof/heap
-//
-// Or to look at a 30-second CPU profile:
-//
-//	go tool pprof http://localhost:6060/debug/pprof/profile
-//
-// Or to look at the goroutine blocking profile:
-//
-//	go tool pprof http://localhost:6060/debug/pprof/block
-//
-// Or to collect a 5-second execution trace:
-//
-//	wget http://localhost:6060/debug/pprof/trace?seconds=5
-//
-// To view all available profiles, open http://localhost:6060/debug/pprof/
-// in your browser.
-//
-// For a study of the facility in action, visit
-//
-//	https://blog.golang.org/2011/06/profiling-go-programs.html
-//
-package pprof
-
-import (
-	"bufio"
-	"bytes"
-	"fmt"
-	"html/template"
-	"io"
-	"log"
-	"net/http"
-	"os"
-	"runtime"
-	"runtime/pprof"
-	"strconv"
-	"strings"
-	"time"
-)
-
-func init() {
-	http.Handle("/debug/pprof/", http.HandlerFunc(Index))
-	http.Handle("/debug/pprof/cmdline", http.HandlerFunc(Cmdline))
-	http.Handle("/debug/pprof/profile", http.HandlerFunc(Profile))
-	http.Handle("/debug/pprof/symbol", http.HandlerFunc(Symbol))
-	http.Handle("/debug/pprof/trace", http.HandlerFunc(Trace))
-}
-
-// Cmdline responds with the running program's
-// command line, with arguments separated by NUL bytes.
-// The package initialization registers it as /debug/pprof/cmdline.
-func Cmdline(w http.ResponseWriter, r *http.Request) {
-	w.Header().Set("Content-Type", "text/plain; charset=utf-8")
-	fmt.Fprintf(w, strings.Join(os.Args, "\x00"))
-}
-
-// Profile responds with the pprof-formatted cpu profile.
-// The package initialization registers it as /debug/pprof/profile.
-func Profile(w http.ResponseWriter, r *http.Request) {
-	sec, _ := strconv.ParseInt(r.FormValue("seconds"), 10, 64)
-	if sec == 0 {
-		sec = 30
-	}
-
-	// Set Content Type assuming StartCPUProfile will work,
-	// because if it does it starts writing.
-	w.Header().Set("Content-Type", "application/octet-stream")
-	if err := pprof.StartCPUProfile(w); err != nil {
-		// StartCPUProfile failed, so no writes yet.
-		// Can change header back to text content
-		// and send error code.
-		w.Header().Set("Content-Type", "text/plain; charset=utf-8")
-		w.WriteHeader(http.StatusInternalServerError)
-		fmt.Fprintf(w, "Could not enable CPU profiling: %s\n", err)
-		return
-	}
-	time.Sleep(time.Duration(sec) * time.Second)
-	pprof.StopCPUProfile()
-}
-
-// Trace responds with the execution trace in binary form.
-// Tracing lasts for duration specified in seconds GET parameter, or for 1 second if not specified.
-// The package initialization registers it as /debug/pprof/trace.
-func Trace(w http.ResponseWriter, r *http.Request) {
-	sec, _ := strconv.ParseInt(r.FormValue("seconds"), 10, 64)
-	if sec == 0 {
-		sec = 1
-	}
-
-	// Set Content Type assuming trace.Start will work,
-	// because if it does it starts writing.
-	w.Header().Set("Content-Type", "application/octet-stream")
-	w.Write([]byte("tracing not yet supported with gccgo"))
-	/*
-		if err := trace.Start(w); err != nil {
-			// trace.Start failed, so no writes yet.
-			// Can change header back to text content and send error code.
-			w.Header().Set("Content-Type", "text/plain; charset=utf-8")
-			w.WriteHeader(http.StatusInternalServerError)
-			fmt.Fprintf(w, "Could not enable tracing: %s\n", err)
-			return
-		}
-		time.Sleep(time.Duration(sec) * time.Second)
-		trace.Stop()
-	*/
-}
-
-// Symbol looks up the program counters listed in the request,
-// responding with a table mapping program counters to function names.
-// The package initialization registers it as /debug/pprof/symbol.
-func Symbol(w http.ResponseWriter, r *http.Request) {
-	w.Header().Set("Content-Type", "text/plain; charset=utf-8")
-
-	// We have to read the whole POST body before
-	// writing any output.  Buffer the output here.
-	var buf bytes.Buffer
-
-	// We don't know how many symbols we have, but we
-	// do have symbol information.  Pprof only cares whether
-	// this number is 0 (no symbols available) or > 0.
-	fmt.Fprintf(&buf, "num_symbols: 1\n")
-
-	var b *bufio.Reader
-	if r.Method == "POST" {
-		b = bufio.NewReader(r.Body)
-	} else {
-		b = bufio.NewReader(strings.NewReader(r.URL.RawQuery))
-	}
-
-	for {
-		word, err := b.ReadSlice('+')
-		if err == nil {
-			word = word[0 : len(word)-1] // trim +
-		}
-		pc, _ := strconv.ParseUint(string(word), 0, 64)
-		if pc != 0 {
-			f := runtime.FuncForPC(uintptr(pc))
-			if f != nil {
-				fmt.Fprintf(&buf, "%#x %s\n", pc, f.Name())
-			}
-		}
-
-		// Wait until here to check for err; the last
-		// symbol will have an err because it doesn't end in +.
-		if err != nil {
-			if err != io.EOF {
-				fmt.Fprintf(&buf, "reading request: %v\n", err)
-			}
-			break
-		}
-	}
-
-	w.Write(buf.Bytes())
-}
-
-// Handler returns an HTTP handler that serves the named profile.
-func Handler(name string) http.Handler {
-	return handler(name)
-}
-
-type handler string
-
-func (name handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-	w.Header().Set("Content-Type", "text/plain; charset=utf-8")
-	debug, _ := strconv.Atoi(r.FormValue("debug"))
-	p := pprof.Lookup(string(name))
-	if p == nil {
-		w.WriteHeader(404)
-		fmt.Fprintf(w, "Unknown profile: %s\n", name)
-		return
-	}
-	gc, _ := strconv.Atoi(r.FormValue("gc"))
-	if name == "heap" && gc > 0 {
-		runtime.GC()
-	}
-	p.WriteTo(w, debug)
-	return
-}
-
-// Index responds with the pprof-formatted profile named by the request.
-// For example, "/debug/pprof/heap" serves the "heap" profile.
-// Index responds to a request for "/debug/pprof/" with an HTML page
-// listing the available profiles.
-func Index(w http.ResponseWriter, r *http.Request) {
-	if strings.HasPrefix(r.URL.Path, "/debug/pprof/") {
-		name := strings.TrimPrefix(r.URL.Path, "/debug/pprof/")
-		if name != "" {
-			handler(name).ServeHTTP(w, r)
-			return
-		}
-	}
-
-	profiles := pprof.Profiles()
-	if err := indexTmpl.Execute(w, profiles); err != nil {
-		log.Print(err)
-	}
-}
-
-var indexTmpl = template.Must(template.New("index").Parse(`<html>
-<head>
-<title>/debug/pprof/</title>
-</head>
-<body>
-/debug/pprof/<br>
-<br>
-profiles:<br>
-<table>
-{{range .}}
-<tr><td align=right>{{.Count}}<td><a href="{{.Name}}?debug=1">{{.Name}}</a>
-{{end}}
-</table>
-<br>
-<a href="goroutine?debug=2">full goroutine stack dump</a><br>
-</body>
-</html>
-`))
diff --git a/third_party/gofrontend/libgo/go/net/http/proxy_test.go b/third_party/gofrontend/libgo/go/net/http/proxy_test.go
deleted file mode 100644
index 823d144..0000000
--- a/third_party/gofrontend/libgo/go/net/http/proxy_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"net/url"
-	"os"
-	"testing"
-)
-
-// TODO(mattn):
-//	test ProxyAuth
-
-var UseProxyTests = []struct {
-	host  string
-	match bool
-}{
-	// Never proxy localhost:
-	{"localhost", false},
-	{"127.0.0.1", false},
-	{"127.0.0.2", false},
-	{"[::1]", false},
-	{"[::2]", true}, // not a loopback address
-
-	{"barbaz.net", false},     // match as .barbaz.net
-	{"foobar.com", false},     // have a port but match
-	{"foofoobar.com", true},   // not match as a part of foobar.com
-	{"baz.com", true},         // not match as a part of barbaz.com
-	{"localhost.net", true},   // not match as suffix of address
-	{"local.localhost", true}, // not match as prefix as address
-	{"barbarbaz.net", true},   // not match because NO_PROXY have a '.'
-	{"www.foobar.com", false}, // match because NO_PROXY includes "foobar.com"
-}
-
-func TestUseProxy(t *testing.T) {
-	ResetProxyEnv()
-	os.Setenv("NO_PROXY", "foobar.com, .barbaz.net")
-	for _, test := range UseProxyTests {
-		if useProxy(test.host+":80") != test.match {
-			t.Errorf("useProxy(%v) = %v, want %v", test.host, !test.match, test.match)
-		}
-	}
-}
-
-var cacheKeysTests = []struct {
-	proxy  string
-	scheme string
-	addr   string
-	key    string
-}{
-	{"", "http", "foo.com", "|http|foo.com"},
-	{"", "https", "foo.com", "|https|foo.com"},
-	{"http://foo.com", "http", "foo.com", "http://foo.com|http|"},
-	{"http://foo.com", "https", "foo.com", "http://foo.com|https|foo.com"},
-}
-
-func TestCacheKeys(t *testing.T) {
-	for _, tt := range cacheKeysTests {
-		var proxy *url.URL
-		if tt.proxy != "" {
-			u, err := url.Parse(tt.proxy)
-			if err != nil {
-				t.Fatal(err)
-			}
-			proxy = u
-		}
-		cm := connectMethod{proxy, tt.scheme, tt.addr}
-		if got := cm.key().String(); got != tt.key {
-			t.Fatalf("{%q, %q, %q} cache key = %q; want %q", tt.proxy, tt.scheme, tt.addr, got, tt.key)
-		}
-	}
-}
-
-func ResetProxyEnv() {
-	for _, v := range []string{"HTTP_PROXY", "http_proxy", "NO_PROXY", "no_proxy"} {
-		os.Setenv(v, "")
-	}
-	ResetCachedEnvironment()
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/race.go b/third_party/gofrontend/libgo/go/net/http/race.go
deleted file mode 100644
index 7665039..0000000
--- a/third_party/gofrontend/libgo/go/net/http/race.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build race
-
-package http
-
-func init() {
-	raceEnabled = true
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/range_test.go b/third_party/gofrontend/libgo/go/net/http/range_test.go
deleted file mode 100644
index ef911af..0000000
--- a/third_party/gofrontend/libgo/go/net/http/range_test.go
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"testing"
-)
-
-var ParseRangeTests = []struct {
-	s      string
-	length int64
-	r      []httpRange
-}{
-	{"", 0, nil},
-	{"", 1000, nil},
-	{"foo", 0, nil},
-	{"bytes=", 0, nil},
-	{"bytes=7", 10, nil},
-	{"bytes= 7 ", 10, nil},
-	{"bytes=1-", 0, nil},
-	{"bytes=5-4", 10, nil},
-	{"bytes=0-2,5-4", 10, nil},
-	{"bytes=2-5,4-3", 10, nil},
-	{"bytes=--5,4--3", 10, nil},
-	{"bytes=A-", 10, nil},
-	{"bytes=A- ", 10, nil},
-	{"bytes=A-Z", 10, nil},
-	{"bytes= -Z", 10, nil},
-	{"bytes=5-Z", 10, nil},
-	{"bytes=Ran-dom, garbage", 10, nil},
-	{"bytes=0x01-0x02", 10, nil},
-	{"bytes=         ", 10, nil},
-	{"bytes= , , ,   ", 10, nil},
-
-	{"bytes=0-9", 10, []httpRange{{0, 10}}},
-	{"bytes=0-", 10, []httpRange{{0, 10}}},
-	{"bytes=5-", 10, []httpRange{{5, 5}}},
-	{"bytes=0-20", 10, []httpRange{{0, 10}}},
-	{"bytes=15-,0-5", 10, nil},
-	{"bytes=1-2,5-", 10, []httpRange{{1, 2}, {5, 5}}},
-	{"bytes=-2 , 7-", 11, []httpRange{{9, 2}, {7, 4}}},
-	{"bytes=0-0 ,2-2, 7-", 11, []httpRange{{0, 1}, {2, 1}, {7, 4}}},
-	{"bytes=-5", 10, []httpRange{{5, 5}}},
-	{"bytes=-15", 10, []httpRange{{0, 10}}},
-	{"bytes=0-499", 10000, []httpRange{{0, 500}}},
-	{"bytes=500-999", 10000, []httpRange{{500, 500}}},
-	{"bytes=-500", 10000, []httpRange{{9500, 500}}},
-	{"bytes=9500-", 10000, []httpRange{{9500, 500}}},
-	{"bytes=0-0,-1", 10000, []httpRange{{0, 1}, {9999, 1}}},
-	{"bytes=500-600,601-999", 10000, []httpRange{{500, 101}, {601, 399}}},
-	{"bytes=500-700,601-999", 10000, []httpRange{{500, 201}, {601, 399}}},
-
-	// Match Apache laxity:
-	{"bytes=   1 -2   ,  4- 5, 7 - 8 , ,,", 11, []httpRange{{1, 2}, {4, 2}, {7, 2}}},
-}
-
-func TestParseRange(t *testing.T) {
-	for _, test := range ParseRangeTests {
-		r := test.r
-		ranges, err := parseRange(test.s, test.length)
-		if err != nil && r != nil {
-			t.Errorf("parseRange(%q) returned error %q", test.s, err)
-		}
-		if len(ranges) != len(r) {
-			t.Errorf("len(parseRange(%q)) = %d, want %d", test.s, len(ranges), len(r))
-			continue
-		}
-		for i := range r {
-			if ranges[i].start != r[i].start {
-				t.Errorf("parseRange(%q)[%d].start = %d, want %d", test.s, i, ranges[i].start, r[i].start)
-			}
-			if ranges[i].length != r[i].length {
-				t.Errorf("parseRange(%q)[%d].length = %d, want %d", test.s, i, ranges[i].length, r[i].length)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/readrequest_test.go b/third_party/gofrontend/libgo/go/net/http/readrequest_test.go
deleted file mode 100644
index 60e2be4..0000000
--- a/third_party/gofrontend/libgo/go/net/http/readrequest_test.go
+++ /dev/null
@@ -1,446 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"bufio"
-	"bytes"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net/url"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-type reqTest struct {
-	Raw     string
-	Req     *Request
-	Body    string
-	Trailer Header
-	Error   string
-}
-
-var noError = ""
-var noBody = ""
-var noTrailer Header = nil
-
-var reqTests = []reqTest{
-	// Baseline test; All Request fields included for template use
-	{
-		"GET http://www.techcrunch.com/ HTTP/1.1\r\n" +
-			"Host: www.techcrunch.com\r\n" +
-			"User-Agent: Fake\r\n" +
-			"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" +
-			"Accept-Language: en-us,en;q=0.5\r\n" +
-			"Accept-Encoding: gzip,deflate\r\n" +
-			"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" +
-			"Keep-Alive: 300\r\n" +
-			"Content-Length: 7\r\n" +
-			"Proxy-Connection: keep-alive\r\n\r\n" +
-			"abcdef\n???",
-
-		&Request{
-			Method: "GET",
-			URL: &url.URL{
-				Scheme: "http",
-				Host:   "www.techcrunch.com",
-				Path:   "/",
-			},
-			Proto:      "HTTP/1.1",
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Header: Header{
-				"Accept":           {"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"},
-				"Accept-Language":  {"en-us,en;q=0.5"},
-				"Accept-Encoding":  {"gzip,deflate"},
-				"Accept-Charset":   {"ISO-8859-1,utf-8;q=0.7,*;q=0.7"},
-				"Keep-Alive":       {"300"},
-				"Proxy-Connection": {"keep-alive"},
-				"Content-Length":   {"7"},
-				"User-Agent":       {"Fake"},
-			},
-			Close:         false,
-			ContentLength: 7,
-			Host:          "www.techcrunch.com",
-			RequestURI:    "http://www.techcrunch.com/",
-		},
-
-		"abcdef\n",
-
-		noTrailer,
-		noError,
-	},
-
-	// GET request with no body (the normal case)
-	{
-		"GET / HTTP/1.1\r\n" +
-			"Host: foo.com\r\n\r\n",
-
-		&Request{
-			Method: "GET",
-			URL: &url.URL{
-				Path: "/",
-			},
-			Proto:         "HTTP/1.1",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			Header:        Header{},
-			Close:         false,
-			ContentLength: 0,
-			Host:          "foo.com",
-			RequestURI:    "/",
-		},
-
-		noBody,
-		noTrailer,
-		noError,
-	},
-
-	// Tests that we don't parse a path that looks like a
-	// scheme-relative URI as a scheme-relative URI.
-	{
-		"GET //user@host/is/actually/a/path/ HTTP/1.1\r\n" +
-			"Host: test\r\n\r\n",
-
-		&Request{
-			Method: "GET",
-			URL: &url.URL{
-				Path: "//user@host/is/actually/a/path/",
-			},
-			Proto:         "HTTP/1.1",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			Header:        Header{},
-			Close:         false,
-			ContentLength: 0,
-			Host:          "test",
-			RequestURI:    "//user@host/is/actually/a/path/",
-		},
-
-		noBody,
-		noTrailer,
-		noError,
-	},
-
-	// Tests a bogus abs_path on the Request-Line (RFC 2616 section 5.1.2)
-	{
-		"GET ../../../../etc/passwd HTTP/1.1\r\n" +
-			"Host: test\r\n\r\n",
-		nil,
-		noBody,
-		noTrailer,
-		"parse ../../../../etc/passwd: invalid URI for request",
-	},
-
-	// Tests missing URL:
-	{
-		"GET  HTTP/1.1\r\n" +
-			"Host: test\r\n\r\n",
-		nil,
-		noBody,
-		noTrailer,
-		"parse : empty url",
-	},
-
-	// Tests chunked body with trailer:
-	{
-		"POST / HTTP/1.1\r\n" +
-			"Host: foo.com\r\n" +
-			"Transfer-Encoding: chunked\r\n\r\n" +
-			"3\r\nfoo\r\n" +
-			"3\r\nbar\r\n" +
-			"0\r\n" +
-			"Trailer-Key: Trailer-Value\r\n" +
-			"\r\n",
-		&Request{
-			Method: "POST",
-			URL: &url.URL{
-				Path: "/",
-			},
-			TransferEncoding: []string{"chunked"},
-			Proto:            "HTTP/1.1",
-			ProtoMajor:       1,
-			ProtoMinor:       1,
-			Header:           Header{},
-			ContentLength:    -1,
-			Host:             "foo.com",
-			RequestURI:       "/",
-		},
-
-		"foobar",
-		Header{
-			"Trailer-Key": {"Trailer-Value"},
-		},
-		noError,
-	},
-
-	// Tests chunked body and a bogus Content-Length which should be deleted.
-	{
-		"POST / HTTP/1.1\r\n" +
-			"Host: foo.com\r\n" +
-			"Transfer-Encoding: chunked\r\n" +
-			"Content-Length: 9999\r\n\r\n" + // to be removed.
-			"3\r\nfoo\r\n" +
-			"3\r\nbar\r\n" +
-			"0\r\n" +
-			"\r\n",
-		&Request{
-			Method: "POST",
-			URL: &url.URL{
-				Path: "/",
-			},
-			TransferEncoding: []string{"chunked"},
-			Proto:            "HTTP/1.1",
-			ProtoMajor:       1,
-			ProtoMinor:       1,
-			Header:           Header{},
-			ContentLength:    -1,
-			Host:             "foo.com",
-			RequestURI:       "/",
-		},
-
-		"foobar",
-		noTrailer,
-		noError,
-	},
-
-	// CONNECT request with domain name:
-	{
-		"CONNECT www.google.com:443 HTTP/1.1\r\n\r\n",
-
-		&Request{
-			Method: "CONNECT",
-			URL: &url.URL{
-				Host: "www.google.com:443",
-			},
-			Proto:         "HTTP/1.1",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			Header:        Header{},
-			Close:         false,
-			ContentLength: 0,
-			Host:          "www.google.com:443",
-			RequestURI:    "www.google.com:443",
-		},
-
-		noBody,
-		noTrailer,
-		noError,
-	},
-
-	// CONNECT request with IP address:
-	{
-		"CONNECT 127.0.0.1:6060 HTTP/1.1\r\n\r\n",
-
-		&Request{
-			Method: "CONNECT",
-			URL: &url.URL{
-				Host: "127.0.0.1:6060",
-			},
-			Proto:         "HTTP/1.1",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			Header:        Header{},
-			Close:         false,
-			ContentLength: 0,
-			Host:          "127.0.0.1:6060",
-			RequestURI:    "127.0.0.1:6060",
-		},
-
-		noBody,
-		noTrailer,
-		noError,
-	},
-
-	// CONNECT request for RPC:
-	{
-		"CONNECT /_goRPC_ HTTP/1.1\r\n\r\n",
-
-		&Request{
-			Method: "CONNECT",
-			URL: &url.URL{
-				Path: "/_goRPC_",
-			},
-			Proto:         "HTTP/1.1",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			Header:        Header{},
-			Close:         false,
-			ContentLength: 0,
-			Host:          "",
-			RequestURI:    "/_goRPC_",
-		},
-
-		noBody,
-		noTrailer,
-		noError,
-	},
-
-	// SSDP Notify request. golang.org/issue/3692
-	{
-		"NOTIFY * HTTP/1.1\r\nServer: foo\r\n\r\n",
-		&Request{
-			Method: "NOTIFY",
-			URL: &url.URL{
-				Path: "*",
-			},
-			Proto:      "HTTP/1.1",
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Header: Header{
-				"Server": []string{"foo"},
-			},
-			Close:         false,
-			ContentLength: 0,
-			RequestURI:    "*",
-		},
-
-		noBody,
-		noTrailer,
-		noError,
-	},
-
-	// OPTIONS request. Similar to golang.org/issue/3692
-	{
-		"OPTIONS * HTTP/1.1\r\nServer: foo\r\n\r\n",
-		&Request{
-			Method: "OPTIONS",
-			URL: &url.URL{
-				Path: "*",
-			},
-			Proto:      "HTTP/1.1",
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Header: Header{
-				"Server": []string{"foo"},
-			},
-			Close:         false,
-			ContentLength: 0,
-			RequestURI:    "*",
-		},
-
-		noBody,
-		noTrailer,
-		noError,
-	},
-
-	// Connection: close. golang.org/issue/8261
-	{
-		"GET / HTTP/1.1\r\nHost: issue8261.com\r\nConnection: close\r\n\r\n",
-		&Request{
-			Method: "GET",
-			URL: &url.URL{
-				Path: "/",
-			},
-			Header: Header{
-				// This wasn't removed from Go 1.0 to
-				// Go 1.3, so locking it in that we
-				// keep this:
-				"Connection": []string{"close"},
-			},
-			Host:       "issue8261.com",
-			Proto:      "HTTP/1.1",
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Close:      true,
-			RequestURI: "/",
-		},
-
-		noBody,
-		noTrailer,
-		noError,
-	},
-
-	// HEAD with Content-Length 0. Make sure this is permitted,
-	// since I think we used to send it.
-	{
-		"HEAD / HTTP/1.1\r\nHost: issue8261.com\r\nConnection: close\r\nContent-Length: 0\r\n\r\n",
-		&Request{
-			Method: "HEAD",
-			URL: &url.URL{
-				Path: "/",
-			},
-			Header: Header{
-				"Connection":     []string{"close"},
-				"Content-Length": []string{"0"},
-			},
-			Host:       "issue8261.com",
-			Proto:      "HTTP/1.1",
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Close:      true,
-			RequestURI: "/",
-		},
-
-		noBody,
-		noTrailer,
-		noError,
-	},
-}
-
-func TestReadRequest(t *testing.T) {
-	for i := range reqTests {
-		tt := &reqTests[i]
-		req, err := ReadRequest(bufio.NewReader(strings.NewReader(tt.Raw)))
-		if err != nil {
-			if err.Error() != tt.Error {
-				t.Errorf("#%d: error %q, want error %q", i, err.Error(), tt.Error)
-			}
-			continue
-		}
-		rbody := req.Body
-		req.Body = nil
-		testName := fmt.Sprintf("Test %d (%q)", i, tt.Raw)
-		diff(t, testName, req, tt.Req)
-		var bout bytes.Buffer
-		if rbody != nil {
-			_, err := io.Copy(&bout, rbody)
-			if err != nil {
-				t.Fatalf("%s: copying body: %v", testName, err)
-			}
-			rbody.Close()
-		}
-		body := bout.String()
-		if body != tt.Body {
-			t.Errorf("%s: Body = %q want %q", testName, body, tt.Body)
-		}
-		if !reflect.DeepEqual(tt.Trailer, req.Trailer) {
-			t.Errorf("%s: Trailers differ.\n got: %v\nwant: %v", testName, req.Trailer, tt.Trailer)
-		}
-	}
-}
-
-// reqBytes treats req as a request (with \n delimiters) and returns it with \r\n delimiters,
-// ending in \r\n\r\n
-func reqBytes(req string) []byte {
-	return []byte(strings.Replace(strings.TrimSpace(req), "\n", "\r\n", -1) + "\r\n\r\n")
-}
-
-var badRequestTests = []struct {
-	name string
-	req  []byte
-}{
-	{"bad_connect_host", reqBytes("CONNECT []%20%48%54%54%50%2f%31%2e%31%0a%4d%79%48%65%61%64%65%72%3a%20%31%32%33%0a%0a HTTP/1.0")},
-	{"smuggle_two_contentlen", reqBytes(`POST / HTTP/1.1
-Content-Length: 3
-Content-Length: 4
-
-abc`)},
-	{"smuggle_content_len_head", reqBytes(`HEAD / HTTP/1.1
-Host: foo
-Content-Length: 5`)},
-}
-
-func TestReadRequest_Bad(t *testing.T) {
-	for _, tt := range badRequestTests {
-		got, err := ReadRequest(bufio.NewReader(bytes.NewReader(tt.req)))
-		if err == nil {
-			all, err := ioutil.ReadAll(got.Body)
-			t.Errorf("%s: got unexpected request = %#v\n  Body = %q, %v", tt.name, got, all, err)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/request.go b/third_party/gofrontend/libgo/go/net/http/request.go
deleted file mode 100644
index 31fe45a..0000000
--- a/third_party/gofrontend/libgo/go/net/http/request.go
+++ /dev/null
@@ -1,1008 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// HTTP Request reading and parsing.
-
-package http
-
-import (
-	"bufio"
-	"bytes"
-	"crypto/tls"
-	"encoding/base64"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"mime"
-	"mime/multipart"
-	"net/textproto"
-	"net/url"
-	"strconv"
-	"strings"
-	"sync"
-)
-
-const (
-	defaultMaxMemory = 32 << 20 // 32 MB
-)
-
-// ErrMissingFile is returned by FormFile when the provided file field name
-// is either not present in the request or not a file field.
-var ErrMissingFile = errors.New("http: no such file")
-
-// HTTP request parsing errors.
-type ProtocolError struct {
-	ErrorString string
-}
-
-func (err *ProtocolError) Error() string { return err.ErrorString }
-
-var (
-	ErrHeaderTooLong        = &ProtocolError{"header too long"}
-	ErrShortBody            = &ProtocolError{"entity body too short"}
-	ErrNotSupported         = &ProtocolError{"feature not supported"}
-	ErrUnexpectedTrailer    = &ProtocolError{"trailer header without chunked transfer encoding"}
-	ErrMissingContentLength = &ProtocolError{"missing ContentLength in HEAD response"}
-	ErrNotMultipart         = &ProtocolError{"request Content-Type isn't multipart/form-data"}
-	ErrMissingBoundary      = &ProtocolError{"no multipart boundary param in Content-Type"}
-)
-
-type badStringError struct {
-	what string
-	str  string
-}
-
-func (e *badStringError) Error() string { return fmt.Sprintf("%s %q", e.what, e.str) }
-
-// Headers that Request.Write handles itself and should be skipped.
-var reqWriteExcludeHeader = map[string]bool{
-	"Host":              true, // not in Header map anyway
-	"User-Agent":        true,
-	"Content-Length":    true,
-	"Transfer-Encoding": true,
-	"Trailer":           true,
-}
-
-// A Request represents an HTTP request received by a server
-// or to be sent by a client.
-//
-// The field semantics differ slightly between client and server
-// usage. In addition to the notes on the fields below, see the
-// documentation for Request.Write and RoundTripper.
-type Request struct {
-	// Method specifies the HTTP method (GET, POST, PUT, etc.).
-	// For client requests an empty string means GET.
-	Method string
-
-	// URL specifies either the URI being requested (for server
-	// requests) or the URL to access (for client requests).
-	//
-	// For server requests the URL is parsed from the URI
-	// supplied on the Request-Line as stored in RequestURI.  For
-	// most requests, fields other than Path and RawQuery will be
-	// empty. (See RFC 2616, Section 5.1.2)
-	//
-	// For client requests, the URL's Host specifies the server to
-	// connect to, while the Request's Host field optionally
-	// specifies the Host header value to send in the HTTP
-	// request.
-	URL *url.URL
-
-	// The protocol version for incoming requests.
-	// Client requests always use HTTP/1.1.
-	Proto      string // "HTTP/1.0"
-	ProtoMajor int    // 1
-	ProtoMinor int    // 0
-
-	// A header maps request lines to their values.
-	// If the header says
-	//
-	//	accept-encoding: gzip, deflate
-	//	Accept-Language: en-us
-	//	Connection: keep-alive
-	//
-	// then
-	//
-	//	Header = map[string][]string{
-	//		"Accept-Encoding": {"gzip, deflate"},
-	//		"Accept-Language": {"en-us"},
-	//		"Connection": {"keep-alive"},
-	//	}
-	//
-	// HTTP defines that header names are case-insensitive.
-	// The request parser implements this by canonicalizing the
-	// name, making the first character and any characters
-	// following a hyphen uppercase and the rest lowercase.
-	//
-	// For client requests certain headers are automatically
-	// added and may override values in Header.
-	//
-	// See the documentation for the Request.Write method.
-	Header Header
-
-	// Body is the request's body.
-	//
-	// For client requests a nil body means the request has no
-	// body, such as a GET request. The HTTP Client's Transport
-	// is responsible for calling the Close method.
-	//
-	// For server requests the Request Body is always non-nil
-	// but will return EOF immediately when no body is present.
-	// The Server will close the request body. The ServeHTTP
-	// Handler does not need to.
-	Body io.ReadCloser
-
-	// ContentLength records the length of the associated content.
-	// The value -1 indicates that the length is unknown.
-	// Values >= 0 indicate that the given number of bytes may
-	// be read from Body.
-	// For client requests, a value of 0 means unknown if Body is not nil.
-	ContentLength int64
-
-	// TransferEncoding lists the transfer encodings from outermost to
-	// innermost. An empty list denotes the "identity" encoding.
-	// TransferEncoding can usually be ignored; chunked encoding is
-	// automatically added and removed as necessary when sending and
-	// receiving requests.
-	TransferEncoding []string
-
-	// Close indicates whether to close the connection after
-	// replying to this request (for servers) or after sending
-	// the request (for clients).
-	Close bool
-
-	// For server requests Host specifies the host on which the
-	// URL is sought. Per RFC 2616, this is either the value of
-	// the "Host" header or the host name given in the URL itself.
-	// It may be of the form "host:port".
-	//
-	// For client requests Host optionally overrides the Host
-	// header to send. If empty, the Request.Write method uses
-	// the value of URL.Host.
-	Host string
-
-	// Form contains the parsed form data, including both the URL
-	// field's query parameters and the POST or PUT form data.
-	// This field is only available after ParseForm is called.
-	// The HTTP client ignores Form and uses Body instead.
-	Form url.Values
-
-	// PostForm contains the parsed form data from POST, PATCH,
-	// or PUT body parameters.
-	//
-	// This field is only available after ParseForm is called.
-	// The HTTP client ignores PostForm and uses Body instead.
-	PostForm url.Values
-
-	// MultipartForm is the parsed multipart form, including file uploads.
-	// This field is only available after ParseMultipartForm is called.
-	// The HTTP client ignores MultipartForm and uses Body instead.
-	MultipartForm *multipart.Form
-
-	// Trailer specifies additional headers that are sent after the request
-	// body.
-	//
-	// For server requests the Trailer map initially contains only the
-	// trailer keys, with nil values. (The client declares which trailers it
-	// will later send.)  While the handler is reading from Body, it must
-	// not reference Trailer. After reading from Body returns EOF, Trailer
-	// can be read again and will contain non-nil values, if they were sent
-	// by the client.
-	//
-	// For client requests Trailer must be initialized to a map containing
-	// the trailer keys to later send. The values may be nil or their final
-	// values. The ContentLength must be 0 or -1, to send a chunked request.
-	// After the HTTP request is sent the map values can be updated while
-	// the request body is read. Once the body returns EOF, the caller must
-	// not mutate Trailer.
-	//
-	// Few HTTP clients, servers, or proxies support HTTP trailers.
-	Trailer Header
-
-	// RemoteAddr allows HTTP servers and other software to record
-	// the network address that sent the request, usually for
-	// logging. This field is not filled in by ReadRequest and
-	// has no defined format. The HTTP server in this package
-	// sets RemoteAddr to an "IP:port" address before invoking a
-	// handler.
-	// This field is ignored by the HTTP client.
-	RemoteAddr string
-
-	// RequestURI is the unmodified Request-URI of the
-	// Request-Line (RFC 2616, Section 5.1) as sent by the client
-	// to a server. Usually the URL field should be used instead.
-	// It is an error to set this field in an HTTP client request.
-	RequestURI string
-
-	// TLS allows HTTP servers and other software to record
-	// information about the TLS connection on which the request
-	// was received. This field is not filled in by ReadRequest.
-	// The HTTP server in this package sets the field for
-	// TLS-enabled connections before invoking a handler;
-	// otherwise it leaves the field nil.
-	// This field is ignored by the HTTP client.
-	TLS *tls.ConnectionState
-
-	// Cancel is an optional channel whose closure indicates that the client
-	// request should be regarded as canceled. Not all implementations of
-	// RoundTripper may support Cancel.
-	//
-	// For server requests, this field is not applicable.
-	Cancel <-chan struct{}
-}
-
-// ProtoAtLeast reports whether the HTTP protocol used
-// in the request is at least major.minor.
-func (r *Request) ProtoAtLeast(major, minor int) bool {
-	return r.ProtoMajor > major ||
-		r.ProtoMajor == major && r.ProtoMinor >= minor
-}
-
-// UserAgent returns the client's User-Agent, if sent in the request.
-func (r *Request) UserAgent() string {
-	return r.Header.Get("User-Agent")
-}
-
-// Cookies parses and returns the HTTP cookies sent with the request.
-func (r *Request) Cookies() []*Cookie {
-	return readCookies(r.Header, "")
-}
-
-// ErrNoCookie is returned by Request's Cookie method when a cookie is not found.
-var ErrNoCookie = errors.New("http: named cookie not present")
-
-// Cookie returns the named cookie provided in the request or
-// ErrNoCookie if not found.
-func (r *Request) Cookie(name string) (*Cookie, error) {
-	for _, c := range readCookies(r.Header, name) {
-		return c, nil
-	}
-	return nil, ErrNoCookie
-}
-
-// AddCookie adds a cookie to the request.  Per RFC 6265 section 5.4,
-// AddCookie does not attach more than one Cookie header field.  That
-// means all cookies, if any, are written into the same line,
-// separated by semicolon.
-func (r *Request) AddCookie(c *Cookie) {
-	s := fmt.Sprintf("%s=%s", sanitizeCookieName(c.Name), sanitizeCookieValue(c.Value))
-	if c := r.Header.Get("Cookie"); c != "" {
-		r.Header.Set("Cookie", c+"; "+s)
-	} else {
-		r.Header.Set("Cookie", s)
-	}
-}
-
-// Referer returns the referring URL, if sent in the request.
-//
-// Referer is misspelled as in the request itself, a mistake from the
-// earliest days of HTTP.  This value can also be fetched from the
-// Header map as Header["Referer"]; the benefit of making it available
-// as a method is that the compiler can diagnose programs that use the
-// alternate (correct English) spelling req.Referrer() but cannot
-// diagnose programs that use Header["Referrer"].
-func (r *Request) Referer() string {
-	return r.Header.Get("Referer")
-}
-
-// multipartByReader is a sentinel value.
-// Its presence in Request.MultipartForm indicates that parsing of the request
-// body has been handed off to a MultipartReader instead of ParseMultipartFrom.
-var multipartByReader = &multipart.Form{
-	Value: make(map[string][]string),
-	File:  make(map[string][]*multipart.FileHeader),
-}
-
-// MultipartReader returns a MIME multipart reader if this is a
-// multipart/form-data POST request, else returns nil and an error.
-// Use this function instead of ParseMultipartForm to
-// process the request body as a stream.
-func (r *Request) MultipartReader() (*multipart.Reader, error) {
-	if r.MultipartForm == multipartByReader {
-		return nil, errors.New("http: MultipartReader called twice")
-	}
-	if r.MultipartForm != nil {
-		return nil, errors.New("http: multipart handled by ParseMultipartForm")
-	}
-	r.MultipartForm = multipartByReader
-	return r.multipartReader()
-}
-
-func (r *Request) multipartReader() (*multipart.Reader, error) {
-	v := r.Header.Get("Content-Type")
-	if v == "" {
-		return nil, ErrNotMultipart
-	}
-	d, params, err := mime.ParseMediaType(v)
-	if err != nil || d != "multipart/form-data" {
-		return nil, ErrNotMultipart
-	}
-	boundary, ok := params["boundary"]
-	if !ok {
-		return nil, ErrMissingBoundary
-	}
-	return multipart.NewReader(r.Body, boundary), nil
-}
-
-// Return value if nonempty, def otherwise.
-func valueOrDefault(value, def string) string {
-	if value != "" {
-		return value
-	}
-	return def
-}
-
-// NOTE: This is not intended to reflect the actual Go version being used.
-// It was changed at the time of Go 1.1 release because the former User-Agent
-// had ended up on a blacklist for some intrusion detection systems.
-// See https://codereview.appspot.com/7532043.
-const defaultUserAgent = "Go-http-client/1.1"
-
-// Write writes an HTTP/1.1 request, which is the header and body, in wire format.
-// This method consults the following fields of the request:
-//	Host
-//	URL
-//	Method (defaults to "GET")
-//	Header
-//	ContentLength
-//	TransferEncoding
-//	Body
-//
-// If Body is present, Content-Length is <= 0 and TransferEncoding
-// hasn't been set to "identity", Write adds "Transfer-Encoding:
-// chunked" to the header. Body is closed after it is sent.
-func (r *Request) Write(w io.Writer) error {
-	return r.write(w, false, nil)
-}
-
-// WriteProxy is like Write but writes the request in the form
-// expected by an HTTP proxy.  In particular, WriteProxy writes the
-// initial Request-URI line of the request with an absolute URI, per
-// section 5.1.2 of RFC 2616, including the scheme and host.
-// In either case, WriteProxy also writes a Host header, using
-// either r.Host or r.URL.Host.
-func (r *Request) WriteProxy(w io.Writer) error {
-	return r.write(w, true, nil)
-}
-
-// extraHeaders may be nil
-func (req *Request) write(w io.Writer, usingProxy bool, extraHeaders Header) error {
-	// Find the target host. Prefer the Host: header, but if that
-	// is not given, use the host from the request URL.
-	//
-	// Clean the host, in case it arrives with unexpected stuff in it.
-	host := cleanHost(req.Host)
-	if host == "" {
-		if req.URL == nil {
-			return errors.New("http: Request.Write on Request with no Host or URL set")
-		}
-		host = cleanHost(req.URL.Host)
-	}
-
-	// According to RFC 6874, an HTTP client, proxy, or other
-	// intermediary must remove any IPv6 zone identifier attached
-	// to an outgoing URI.
-	host = removeZone(host)
-
-	ruri := req.URL.RequestURI()
-	if usingProxy && req.URL.Scheme != "" && req.URL.Opaque == "" {
-		ruri = req.URL.Scheme + "://" + host + ruri
-	} else if req.Method == "CONNECT" && req.URL.Path == "" {
-		// CONNECT requests normally give just the host and port, not a full URL.
-		ruri = host
-	}
-	// TODO(bradfitz): escape at least newlines in ruri?
-
-	// Wrap the writer in a bufio Writer if it's not already buffered.
-	// Don't always call NewWriter, as that forces a bytes.Buffer
-	// and other small bufio Writers to have a minimum 4k buffer
-	// size.
-	var bw *bufio.Writer
-	if _, ok := w.(io.ByteWriter); !ok {
-		bw = bufio.NewWriter(w)
-		w = bw
-	}
-
-	_, err := fmt.Fprintf(w, "%s %s HTTP/1.1\r\n", valueOrDefault(req.Method, "GET"), ruri)
-	if err != nil {
-		return err
-	}
-
-	// Header lines
-	_, err = fmt.Fprintf(w, "Host: %s\r\n", host)
-	if err != nil {
-		return err
-	}
-
-	// Use the defaultUserAgent unless the Header contains one, which
-	// may be blank to not send the header.
-	userAgent := defaultUserAgent
-	if req.Header != nil {
-		if ua := req.Header["User-Agent"]; len(ua) > 0 {
-			userAgent = ua[0]
-		}
-	}
-	if userAgent != "" {
-		_, err = fmt.Fprintf(w, "User-Agent: %s\r\n", userAgent)
-		if err != nil {
-			return err
-		}
-	}
-
-	// Process Body,ContentLength,Close,Trailer
-	tw, err := newTransferWriter(req)
-	if err != nil {
-		return err
-	}
-	err = tw.WriteHeader(w)
-	if err != nil {
-		return err
-	}
-
-	err = req.Header.WriteSubset(w, reqWriteExcludeHeader)
-	if err != nil {
-		return err
-	}
-
-	if extraHeaders != nil {
-		err = extraHeaders.Write(w)
-		if err != nil {
-			return err
-		}
-	}
-
-	_, err = io.WriteString(w, "\r\n")
-	if err != nil {
-		return err
-	}
-
-	// Write body and trailer
-	err = tw.WriteBody(w)
-	if err != nil {
-		return err
-	}
-
-	if bw != nil {
-		return bw.Flush()
-	}
-	return nil
-}
-
-// cleanHost strips anything after '/' or ' '.
-// Ideally we'd clean the Host header according to the spec:
-//   https://tools.ietf.org/html/rfc7230#section-5.4 (Host = uri-host [ ":" port ]")
-//   https://tools.ietf.org/html/rfc7230#section-2.7 (uri-host -> rfc3986's host)
-//   https://tools.ietf.org/html/rfc3986#section-3.2.2 (definition of host)
-// But practically, what we are trying to avoid is the situation in
-// issue 11206, where a malformed Host header used in the proxy context
-// would create a bad request. So it is enough to just truncate at the
-// first offending character.
-func cleanHost(in string) string {
-	if i := strings.IndexAny(in, " /"); i != -1 {
-		return in[:i]
-	}
-	return in
-}
-
-// removeZone removes IPv6 zone identifer from host.
-// E.g., "[fe80::1%en0]:8080" to "[fe80::1]:8080"
-func removeZone(host string) string {
-	if !strings.HasPrefix(host, "[") {
-		return host
-	}
-	i := strings.LastIndex(host, "]")
-	if i < 0 {
-		return host
-	}
-	j := strings.LastIndex(host[:i], "%")
-	if j < 0 {
-		return host
-	}
-	return host[:j] + host[i:]
-}
-
-// ParseHTTPVersion parses a HTTP version string.
-// "HTTP/1.0" returns (1, 0, true).
-func ParseHTTPVersion(vers string) (major, minor int, ok bool) {
-	const Big = 1000000 // arbitrary upper bound
-	switch vers {
-	case "HTTP/1.1":
-		return 1, 1, true
-	case "HTTP/1.0":
-		return 1, 0, true
-	}
-	if !strings.HasPrefix(vers, "HTTP/") {
-		return 0, 0, false
-	}
-	dot := strings.Index(vers, ".")
-	if dot < 0 {
-		return 0, 0, false
-	}
-	major, err := strconv.Atoi(vers[5:dot])
-	if err != nil || major < 0 || major > Big {
-		return 0, 0, false
-	}
-	minor, err = strconv.Atoi(vers[dot+1:])
-	if err != nil || minor < 0 || minor > Big {
-		return 0, 0, false
-	}
-	return major, minor, true
-}
-
-// NewRequest returns a new Request given a method, URL, and optional body.
-//
-// If the provided body is also an io.Closer, the returned
-// Request.Body is set to body and will be closed by the Client
-// methods Do, Post, and PostForm, and Transport.RoundTrip.
-//
-// NewRequest returns a Request suitable for use with Client.Do or
-// Transport.RoundTrip.
-// To create a request for use with testing a Server Handler use either
-// ReadRequest or manually update the Request fields. See the Request
-// type's documentation for the difference between inbound and outbound
-// request fields.
-func NewRequest(method, urlStr string, body io.Reader) (*Request, error) {
-	u, err := url.Parse(urlStr)
-	if err != nil {
-		return nil, err
-	}
-	rc, ok := body.(io.ReadCloser)
-	if !ok && body != nil {
-		rc = ioutil.NopCloser(body)
-	}
-	req := &Request{
-		Method:     method,
-		URL:        u,
-		Proto:      "HTTP/1.1",
-		ProtoMajor: 1,
-		ProtoMinor: 1,
-		Header:     make(Header),
-		Body:       rc,
-		Host:       u.Host,
-	}
-	if body != nil {
-		switch v := body.(type) {
-		case *bytes.Buffer:
-			req.ContentLength = int64(v.Len())
-		case *bytes.Reader:
-			req.ContentLength = int64(v.Len())
-		case *strings.Reader:
-			req.ContentLength = int64(v.Len())
-		}
-	}
-
-	return req, nil
-}
-
-// BasicAuth returns the username and password provided in the request's
-// Authorization header, if the request uses HTTP Basic Authentication.
-// See RFC 2617, Section 2.
-func (r *Request) BasicAuth() (username, password string, ok bool) {
-	auth := r.Header.Get("Authorization")
-	if auth == "" {
-		return
-	}
-	return parseBasicAuth(auth)
-}
-
-// parseBasicAuth parses an HTTP Basic Authentication string.
-// "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" returns ("Aladdin", "open sesame", true).
-func parseBasicAuth(auth string) (username, password string, ok bool) {
-	const prefix = "Basic "
-	if !strings.HasPrefix(auth, prefix) {
-		return
-	}
-	c, err := base64.StdEncoding.DecodeString(auth[len(prefix):])
-	if err != nil {
-		return
-	}
-	cs := string(c)
-	s := strings.IndexByte(cs, ':')
-	if s < 0 {
-		return
-	}
-	return cs[:s], cs[s+1:], true
-}
-
-// SetBasicAuth sets the request's Authorization header to use HTTP
-// Basic Authentication with the provided username and password.
-//
-// With HTTP Basic Authentication the provided username and password
-// are not encrypted.
-func (r *Request) SetBasicAuth(username, password string) {
-	r.Header.Set("Authorization", "Basic "+basicAuth(username, password))
-}
-
-// parseRequestLine parses "GET /foo HTTP/1.1" into its three parts.
-func parseRequestLine(line string) (method, requestURI, proto string, ok bool) {
-	s1 := strings.Index(line, " ")
-	s2 := strings.Index(line[s1+1:], " ")
-	if s1 < 0 || s2 < 0 {
-		return
-	}
-	s2 += s1 + 1
-	return line[:s1], line[s1+1 : s2], line[s2+1:], true
-}
-
-var textprotoReaderPool sync.Pool
-
-func newTextprotoReader(br *bufio.Reader) *textproto.Reader {
-	if v := textprotoReaderPool.Get(); v != nil {
-		tr := v.(*textproto.Reader)
-		tr.R = br
-		return tr
-	}
-	return textproto.NewReader(br)
-}
-
-func putTextprotoReader(r *textproto.Reader) {
-	r.R = nil
-	textprotoReaderPool.Put(r)
-}
-
-// ReadRequest reads and parses an incoming request from b.
-func ReadRequest(b *bufio.Reader) (req *Request, err error) {
-
-	tp := newTextprotoReader(b)
-	req = new(Request)
-
-	// First line: GET /index.html HTTP/1.0
-	var s string
-	if s, err = tp.ReadLine(); err != nil {
-		return nil, err
-	}
-	defer func() {
-		putTextprotoReader(tp)
-		if err == io.EOF {
-			err = io.ErrUnexpectedEOF
-		}
-	}()
-
-	var ok bool
-	req.Method, req.RequestURI, req.Proto, ok = parseRequestLine(s)
-	if !ok {
-		return nil, &badStringError{"malformed HTTP request", s}
-	}
-	rawurl := req.RequestURI
-	if req.ProtoMajor, req.ProtoMinor, ok = ParseHTTPVersion(req.Proto); !ok {
-		return nil, &badStringError{"malformed HTTP version", req.Proto}
-	}
-
-	// CONNECT requests are used two different ways, and neither uses a full URL:
-	// The standard use is to tunnel HTTPS through an HTTP proxy.
-	// It looks like "CONNECT www.google.com:443 HTTP/1.1", and the parameter is
-	// just the authority section of a URL. This information should go in req.URL.Host.
-	//
-	// The net/rpc package also uses CONNECT, but there the parameter is a path
-	// that starts with a slash. It can be parsed with the regular URL parser,
-	// and the path will end up in req.URL.Path, where it needs to be in order for
-	// RPC to work.
-	justAuthority := req.Method == "CONNECT" && !strings.HasPrefix(rawurl, "/")
-	if justAuthority {
-		rawurl = "http://" + rawurl
-	}
-
-	if req.URL, err = url.ParseRequestURI(rawurl); err != nil {
-		return nil, err
-	}
-
-	if justAuthority {
-		// Strip the bogus "http://" back off.
-		req.URL.Scheme = ""
-	}
-
-	// Subsequent lines: Key: value.
-	mimeHeader, err := tp.ReadMIMEHeader()
-	if err != nil {
-		return nil, err
-	}
-	req.Header = Header(mimeHeader)
-
-	// RFC2616: Must treat
-	//	GET /index.html HTTP/1.1
-	//	Host: www.google.com
-	// and
-	//	GET http://www.google.com/index.html HTTP/1.1
-	//	Host: doesntmatter
-	// the same.  In the second case, any Host line is ignored.
-	req.Host = req.URL.Host
-	if req.Host == "" {
-		req.Host = req.Header.get("Host")
-	}
-	delete(req.Header, "Host")
-
-	fixPragmaCacheControl(req.Header)
-
-	req.Close = shouldClose(req.ProtoMajor, req.ProtoMinor, req.Header, false)
-
-	err = readTransfer(req, b)
-	if err != nil {
-		return nil, err
-	}
-
-	return req, nil
-}
-
-// MaxBytesReader is similar to io.LimitReader but is intended for
-// limiting the size of incoming request bodies. In contrast to
-// io.LimitReader, MaxBytesReader's result is a ReadCloser, returns a
-// non-EOF error for a Read beyond the limit, and closes the
-// underlying reader when its Close method is called.
-//
-// MaxBytesReader prevents clients from accidentally or maliciously
-// sending a large request and wasting server resources.
-func MaxBytesReader(w ResponseWriter, r io.ReadCloser, n int64) io.ReadCloser {
-	return &maxBytesReader{w: w, r: r, n: n}
-}
-
-type maxBytesReader struct {
-	w       ResponseWriter
-	r       io.ReadCloser // underlying reader
-	n       int64         // max bytes remaining
-	stopped bool
-	sawEOF  bool
-}
-
-func (l *maxBytesReader) tooLarge() (n int, err error) {
-	if !l.stopped {
-		l.stopped = true
-		if res, ok := l.w.(*response); ok {
-			res.requestTooLarge()
-		}
-	}
-	return 0, errors.New("http: request body too large")
-}
-
-func (l *maxBytesReader) Read(p []byte) (n int, err error) {
-	toRead := l.n
-	if l.n == 0 {
-		if l.sawEOF {
-			return l.tooLarge()
-		}
-		// The underlying io.Reader may not return (0, io.EOF)
-		// at EOF if the requested size is 0, so read 1 byte
-		// instead. The io.Reader docs are a bit ambiguous
-		// about the return value of Read when 0 bytes are
-		// requested, and {bytes,strings}.Reader gets it wrong
-		// too (it returns (0, nil) even at EOF).
-		toRead = 1
-	}
-	if int64(len(p)) > toRead {
-		p = p[:toRead]
-	}
-	n, err = l.r.Read(p)
-	if err == io.EOF {
-		l.sawEOF = true
-	}
-	if l.n == 0 {
-		// If we had zero bytes to read remaining (but hadn't seen EOF)
-		// and we get a byte here, that means we went over our limit.
-		if n > 0 {
-			return l.tooLarge()
-		}
-		return 0, err
-	}
-	l.n -= int64(n)
-	if l.n < 0 {
-		l.n = 0
-	}
-	return
-}
-
-func (l *maxBytesReader) Close() error {
-	return l.r.Close()
-}
-
-func copyValues(dst, src url.Values) {
-	for k, vs := range src {
-		for _, value := range vs {
-			dst.Add(k, value)
-		}
-	}
-}
-
-func parsePostForm(r *Request) (vs url.Values, err error) {
-	if r.Body == nil {
-		err = errors.New("missing form body")
-		return
-	}
-	ct := r.Header.Get("Content-Type")
-	// RFC 2616, section 7.2.1 - empty type
-	//   SHOULD be treated as application/octet-stream
-	if ct == "" {
-		ct = "application/octet-stream"
-	}
-	ct, _, err = mime.ParseMediaType(ct)
-	switch {
-	case ct == "application/x-www-form-urlencoded":
-		var reader io.Reader = r.Body
-		maxFormSize := int64(1<<63 - 1)
-		if _, ok := r.Body.(*maxBytesReader); !ok {
-			maxFormSize = int64(10 << 20) // 10 MB is a lot of text.
-			reader = io.LimitReader(r.Body, maxFormSize+1)
-		}
-		b, e := ioutil.ReadAll(reader)
-		if e != nil {
-			if err == nil {
-				err = e
-			}
-			break
-		}
-		if int64(len(b)) > maxFormSize {
-			err = errors.New("http: POST too large")
-			return
-		}
-		vs, e = url.ParseQuery(string(b))
-		if err == nil {
-			err = e
-		}
-	case ct == "multipart/form-data":
-		// handled by ParseMultipartForm (which is calling us, or should be)
-		// TODO(bradfitz): there are too many possible
-		// orders to call too many functions here.
-		// Clean this up and write more tests.
-		// request_test.go contains the start of this,
-		// in TestParseMultipartFormOrder and others.
-	}
-	return
-}
-
-// ParseForm parses the raw query from the URL and updates r.Form.
-//
-// For POST or PUT requests, it also parses the request body as a form and
-// put the results into both r.PostForm and r.Form.
-// POST and PUT body parameters take precedence over URL query string values
-// in r.Form.
-//
-// If the request Body's size has not already been limited by MaxBytesReader,
-// the size is capped at 10MB.
-//
-// ParseMultipartForm calls ParseForm automatically.
-// It is idempotent.
-func (r *Request) ParseForm() error {
-	var err error
-	if r.PostForm == nil {
-		if r.Method == "POST" || r.Method == "PUT" || r.Method == "PATCH" {
-			r.PostForm, err = parsePostForm(r)
-		}
-		if r.PostForm == nil {
-			r.PostForm = make(url.Values)
-		}
-	}
-	if r.Form == nil {
-		if len(r.PostForm) > 0 {
-			r.Form = make(url.Values)
-			copyValues(r.Form, r.PostForm)
-		}
-		var newValues url.Values
-		if r.URL != nil {
-			var e error
-			newValues, e = url.ParseQuery(r.URL.RawQuery)
-			if err == nil {
-				err = e
-			}
-		}
-		if newValues == nil {
-			newValues = make(url.Values)
-		}
-		if r.Form == nil {
-			r.Form = newValues
-		} else {
-			copyValues(r.Form, newValues)
-		}
-	}
-	return err
-}
-
-// ParseMultipartForm parses a request body as multipart/form-data.
-// The whole request body is parsed and up to a total of maxMemory bytes of
-// its file parts are stored in memory, with the remainder stored on
-// disk in temporary files.
-// ParseMultipartForm calls ParseForm if necessary.
-// After one call to ParseMultipartForm, subsequent calls have no effect.
-func (r *Request) ParseMultipartForm(maxMemory int64) error {
-	if r.MultipartForm == multipartByReader {
-		return errors.New("http: multipart handled by MultipartReader")
-	}
-	if r.Form == nil {
-		err := r.ParseForm()
-		if err != nil {
-			return err
-		}
-	}
-	if r.MultipartForm != nil {
-		return nil
-	}
-
-	mr, err := r.multipartReader()
-	if err != nil {
-		return err
-	}
-
-	f, err := mr.ReadForm(maxMemory)
-	if err != nil {
-		return err
-	}
-	for k, v := range f.Value {
-		r.Form[k] = append(r.Form[k], v...)
-	}
-	r.MultipartForm = f
-
-	return nil
-}
-
-// FormValue returns the first value for the named component of the query.
-// POST and PUT body parameters take precedence over URL query string values.
-// FormValue calls ParseMultipartForm and ParseForm if necessary and ignores
-// any errors returned by these functions.
-// If key is not present, FormValue returns the empty string.
-// To access multiple values of the same key, call ParseForm and
-// then inspect Request.Form directly.
-func (r *Request) FormValue(key string) string {
-	if r.Form == nil {
-		r.ParseMultipartForm(defaultMaxMemory)
-	}
-	if vs := r.Form[key]; len(vs) > 0 {
-		return vs[0]
-	}
-	return ""
-}
-
-// PostFormValue returns the first value for the named component of the POST
-// or PUT request body. URL query parameters are ignored.
-// PostFormValue calls ParseMultipartForm and ParseForm if necessary and ignores
-// any errors returned by these functions.
-// If key is not present, PostFormValue returns the empty string.
-func (r *Request) PostFormValue(key string) string {
-	if r.PostForm == nil {
-		r.ParseMultipartForm(defaultMaxMemory)
-	}
-	if vs := r.PostForm[key]; len(vs) > 0 {
-		return vs[0]
-	}
-	return ""
-}
-
-// FormFile returns the first file for the provided form key.
-// FormFile calls ParseMultipartForm and ParseForm if necessary.
-func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error) {
-	if r.MultipartForm == multipartByReader {
-		return nil, nil, errors.New("http: multipart handled by MultipartReader")
-	}
-	if r.MultipartForm == nil {
-		err := r.ParseMultipartForm(defaultMaxMemory)
-		if err != nil {
-			return nil, nil, err
-		}
-	}
-	if r.MultipartForm != nil && r.MultipartForm.File != nil {
-		if fhs := r.MultipartForm.File[key]; len(fhs) > 0 {
-			f, err := fhs[0].Open()
-			return f, fhs[0], err
-		}
-	}
-	return nil, nil, ErrMissingFile
-}
-
-func (r *Request) expectsContinue() bool {
-	return hasToken(r.Header.get("Expect"), "100-continue")
-}
-
-func (r *Request) wantsHttp10KeepAlive() bool {
-	if r.ProtoMajor != 1 || r.ProtoMinor != 0 {
-		return false
-	}
-	return hasToken(r.Header.get("Connection"), "keep-alive")
-}
-
-func (r *Request) wantsClose() bool {
-	return hasToken(r.Header.get("Connection"), "close")
-}
-
-func (r *Request) closeBody() {
-	if r.Body != nil {
-		r.Body.Close()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/request_test.go b/third_party/gofrontend/libgo/go/net/http/request_test.go
deleted file mode 100644
index 627620c..0000000
--- a/third_party/gofrontend/libgo/go/net/http/request_test.go
+++ /dev/null
@@ -1,773 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http_test
-
-import (
-	"bufio"
-	"bytes"
-	"encoding/base64"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"mime/multipart"
-	. "net/http"
-	"net/http/httptest"
-	"net/url"
-	"os"
-	"reflect"
-	"regexp"
-	"strings"
-	"testing"
-)
-
-func TestQuery(t *testing.T) {
-	req := &Request{Method: "GET"}
-	req.URL, _ = url.Parse("http://www.google.com/search?q=foo&q=bar")
-	if q := req.FormValue("q"); q != "foo" {
-		t.Errorf(`req.FormValue("q") = %q, want "foo"`, q)
-	}
-}
-
-func TestPostQuery(t *testing.T) {
-	req, _ := NewRequest("POST", "http://www.google.com/search?q=foo&q=bar&both=x&prio=1&empty=not",
-		strings.NewReader("z=post&both=y&prio=2&empty="))
-	req.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value")
-
-	if q := req.FormValue("q"); q != "foo" {
-		t.Errorf(`req.FormValue("q") = %q, want "foo"`, q)
-	}
-	if z := req.FormValue("z"); z != "post" {
-		t.Errorf(`req.FormValue("z") = %q, want "post"`, z)
-	}
-	if bq, found := req.PostForm["q"]; found {
-		t.Errorf(`req.PostForm["q"] = %q, want no entry in map`, bq)
-	}
-	if bz := req.PostFormValue("z"); bz != "post" {
-		t.Errorf(`req.PostFormValue("z") = %q, want "post"`, bz)
-	}
-	if qs := req.Form["q"]; !reflect.DeepEqual(qs, []string{"foo", "bar"}) {
-		t.Errorf(`req.Form["q"] = %q, want ["foo", "bar"]`, qs)
-	}
-	if both := req.Form["both"]; !reflect.DeepEqual(both, []string{"y", "x"}) {
-		t.Errorf(`req.Form["both"] = %q, want ["y", "x"]`, both)
-	}
-	if prio := req.FormValue("prio"); prio != "2" {
-		t.Errorf(`req.FormValue("prio") = %q, want "2" (from body)`, prio)
-	}
-	if empty := req.FormValue("empty"); empty != "" {
-		t.Errorf(`req.FormValue("empty") = %q, want "" (from body)`, empty)
-	}
-}
-
-func TestPatchQuery(t *testing.T) {
-	req, _ := NewRequest("PATCH", "http://www.google.com/search?q=foo&q=bar&both=x&prio=1&empty=not",
-		strings.NewReader("z=post&both=y&prio=2&empty="))
-	req.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value")
-
-	if q := req.FormValue("q"); q != "foo" {
-		t.Errorf(`req.FormValue("q") = %q, want "foo"`, q)
-	}
-	if z := req.FormValue("z"); z != "post" {
-		t.Errorf(`req.FormValue("z") = %q, want "post"`, z)
-	}
-	if bq, found := req.PostForm["q"]; found {
-		t.Errorf(`req.PostForm["q"] = %q, want no entry in map`, bq)
-	}
-	if bz := req.PostFormValue("z"); bz != "post" {
-		t.Errorf(`req.PostFormValue("z") = %q, want "post"`, bz)
-	}
-	if qs := req.Form["q"]; !reflect.DeepEqual(qs, []string{"foo", "bar"}) {
-		t.Errorf(`req.Form["q"] = %q, want ["foo", "bar"]`, qs)
-	}
-	if both := req.Form["both"]; !reflect.DeepEqual(both, []string{"y", "x"}) {
-		t.Errorf(`req.Form["both"] = %q, want ["y", "x"]`, both)
-	}
-	if prio := req.FormValue("prio"); prio != "2" {
-		t.Errorf(`req.FormValue("prio") = %q, want "2" (from body)`, prio)
-	}
-	if empty := req.FormValue("empty"); empty != "" {
-		t.Errorf(`req.FormValue("empty") = %q, want "" (from body)`, empty)
-	}
-}
-
-type stringMap map[string][]string
-type parseContentTypeTest struct {
-	shouldError bool
-	contentType stringMap
-}
-
-var parseContentTypeTests = []parseContentTypeTest{
-	{false, stringMap{"Content-Type": {"text/plain"}}},
-	// Empty content type is legal - shoult be treated as
-	// application/octet-stream (RFC 2616, section 7.2.1)
-	{false, stringMap{}},
-	{true, stringMap{"Content-Type": {"text/plain; boundary="}}},
-	{false, stringMap{"Content-Type": {"application/unknown"}}},
-}
-
-func TestParseFormUnknownContentType(t *testing.T) {
-	for i, test := range parseContentTypeTests {
-		req := &Request{
-			Method: "POST",
-			Header: Header(test.contentType),
-			Body:   ioutil.NopCloser(strings.NewReader("body")),
-		}
-		err := req.ParseForm()
-		switch {
-		case err == nil && test.shouldError:
-			t.Errorf("test %d should have returned error", i)
-		case err != nil && !test.shouldError:
-			t.Errorf("test %d should not have returned error, got %v", i, err)
-		}
-	}
-}
-
-func TestParseFormInitializeOnError(t *testing.T) {
-	nilBody, _ := NewRequest("POST", "http://www.google.com/search?q=foo", nil)
-	tests := []*Request{
-		nilBody,
-		{Method: "GET", URL: nil},
-	}
-	for i, req := range tests {
-		err := req.ParseForm()
-		if req.Form == nil {
-			t.Errorf("%d. Form not initialized, error %v", i, err)
-		}
-		if req.PostForm == nil {
-			t.Errorf("%d. PostForm not initialized, error %v", i, err)
-		}
-	}
-}
-
-func TestMultipartReader(t *testing.T) {
-	req := &Request{
-		Method: "POST",
-		Header: Header{"Content-Type": {`multipart/form-data; boundary="foo123"`}},
-		Body:   ioutil.NopCloser(new(bytes.Buffer)),
-	}
-	multipart, err := req.MultipartReader()
-	if multipart == nil {
-		t.Errorf("expected multipart; error: %v", err)
-	}
-
-	req.Header = Header{"Content-Type": {"text/plain"}}
-	multipart, err = req.MultipartReader()
-	if multipart != nil {
-		t.Error("unexpected multipart for text/plain")
-	}
-}
-
-func TestParseMultipartForm(t *testing.T) {
-	req := &Request{
-		Method: "POST",
-		Header: Header{"Content-Type": {`multipart/form-data; boundary="foo123"`}},
-		Body:   ioutil.NopCloser(new(bytes.Buffer)),
-	}
-	err := req.ParseMultipartForm(25)
-	if err == nil {
-		t.Error("expected multipart EOF, got nil")
-	}
-
-	req.Header = Header{"Content-Type": {"text/plain"}}
-	err = req.ParseMultipartForm(25)
-	if err != ErrNotMultipart {
-		t.Error("expected ErrNotMultipart for text/plain")
-	}
-}
-
-func TestRedirect(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		switch r.URL.Path {
-		case "/":
-			w.Header().Set("Location", "/foo/")
-			w.WriteHeader(StatusSeeOther)
-		case "/foo/":
-			fmt.Fprintf(w, "foo")
-		default:
-			w.WriteHeader(StatusBadRequest)
-		}
-	}))
-	defer ts.Close()
-
-	var end = regexp.MustCompile("/foo/$")
-	r, err := Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	r.Body.Close()
-	url := r.Request.URL.String()
-	if r.StatusCode != 200 || !end.MatchString(url) {
-		t.Fatalf("Get got status %d at %q, want 200 matching /foo/$", r.StatusCode, url)
-	}
-}
-
-func TestSetBasicAuth(t *testing.T) {
-	r, _ := NewRequest("GET", "http://example.com/", nil)
-	r.SetBasicAuth("Aladdin", "open sesame")
-	if g, e := r.Header.Get("Authorization"), "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="; g != e {
-		t.Errorf("got header %q, want %q", g, e)
-	}
-}
-
-func TestMultipartRequest(t *testing.T) {
-	// Test that we can read the values and files of a
-	// multipart request with FormValue and FormFile,
-	// and that ParseMultipartForm can be called multiple times.
-	req := newTestMultipartRequest(t)
-	if err := req.ParseMultipartForm(25); err != nil {
-		t.Fatal("ParseMultipartForm first call:", err)
-	}
-	defer req.MultipartForm.RemoveAll()
-	validateTestMultipartContents(t, req, false)
-	if err := req.ParseMultipartForm(25); err != nil {
-		t.Fatal("ParseMultipartForm second call:", err)
-	}
-	validateTestMultipartContents(t, req, false)
-}
-
-func TestMultipartRequestAuto(t *testing.T) {
-	// Test that FormValue and FormFile automatically invoke
-	// ParseMultipartForm and return the right values.
-	req := newTestMultipartRequest(t)
-	defer func() {
-		if req.MultipartForm != nil {
-			req.MultipartForm.RemoveAll()
-		}
-	}()
-	validateTestMultipartContents(t, req, true)
-}
-
-func TestMissingFileMultipartRequest(t *testing.T) {
-	// Test that FormFile returns an error if
-	// the named file is missing.
-	req := newTestMultipartRequest(t)
-	testMissingFile(t, req)
-}
-
-// Test that FormValue invokes ParseMultipartForm.
-func TestFormValueCallsParseMultipartForm(t *testing.T) {
-	req, _ := NewRequest("POST", "http://www.google.com/", strings.NewReader("z=post"))
-	req.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value")
-	if req.Form != nil {
-		t.Fatal("Unexpected request Form, want nil")
-	}
-	req.FormValue("z")
-	if req.Form == nil {
-		t.Fatal("ParseMultipartForm not called by FormValue")
-	}
-}
-
-// Test that FormFile invokes ParseMultipartForm.
-func TestFormFileCallsParseMultipartForm(t *testing.T) {
-	req := newTestMultipartRequest(t)
-	if req.Form != nil {
-		t.Fatal("Unexpected request Form, want nil")
-	}
-	req.FormFile("")
-	if req.Form == nil {
-		t.Fatal("ParseMultipartForm not called by FormFile")
-	}
-}
-
-// Test that ParseMultipartForm errors if called
-// after MultipartReader on the same request.
-func TestParseMultipartFormOrder(t *testing.T) {
-	req := newTestMultipartRequest(t)
-	if _, err := req.MultipartReader(); err != nil {
-		t.Fatalf("MultipartReader: %v", err)
-	}
-	if err := req.ParseMultipartForm(1024); err == nil {
-		t.Fatal("expected an error from ParseMultipartForm after call to MultipartReader")
-	}
-}
-
-// Test that MultipartReader errors if called
-// after ParseMultipartForm on the same request.
-func TestMultipartReaderOrder(t *testing.T) {
-	req := newTestMultipartRequest(t)
-	if err := req.ParseMultipartForm(25); err != nil {
-		t.Fatalf("ParseMultipartForm: %v", err)
-	}
-	defer req.MultipartForm.RemoveAll()
-	if _, err := req.MultipartReader(); err == nil {
-		t.Fatal("expected an error from MultipartReader after call to ParseMultipartForm")
-	}
-}
-
-// Test that FormFile errors if called after
-// MultipartReader on the same request.
-func TestFormFileOrder(t *testing.T) {
-	req := newTestMultipartRequest(t)
-	if _, err := req.MultipartReader(); err != nil {
-		t.Fatalf("MultipartReader: %v", err)
-	}
-	if _, _, err := req.FormFile(""); err == nil {
-		t.Fatal("expected an error from FormFile after call to MultipartReader")
-	}
-}
-
-var readRequestErrorTests = []struct {
-	in  string
-	err error
-}{
-	{"GET / HTTP/1.1\r\nheader:foo\r\n\r\n", nil},
-	{"GET / HTTP/1.1\r\nheader:foo\r\n", io.ErrUnexpectedEOF},
-	{"", io.EOF},
-}
-
-func TestReadRequestErrors(t *testing.T) {
-	for i, tt := range readRequestErrorTests {
-		_, err := ReadRequest(bufio.NewReader(strings.NewReader(tt.in)))
-		if err != tt.err {
-			t.Errorf("%d. got error = %v; want %v", i, err, tt.err)
-		}
-	}
-}
-
-var newRequestHostTests = []struct {
-	in, out string
-}{
-	{"http://www.example.com/", "www.example.com"},
-	{"http://www.example.com:8080/", "www.example.com:8080"},
-
-	{"http://192.168.0.1/", "192.168.0.1"},
-	{"http://192.168.0.1:8080/", "192.168.0.1:8080"},
-
-	{"http://[fe80::1]/", "[fe80::1]"},
-	{"http://[fe80::1]:8080/", "[fe80::1]:8080"},
-	{"http://[fe80::1%25en0]/", "[fe80::1%en0]"},
-	{"http://[fe80::1%25en0]:8080/", "[fe80::1%en0]:8080"},
-}
-
-func TestNewRequestHost(t *testing.T) {
-	for i, tt := range newRequestHostTests {
-		req, err := NewRequest("GET", tt.in, nil)
-		if err != nil {
-			t.Errorf("#%v: %v", i, err)
-			continue
-		}
-		if req.Host != tt.out {
-			t.Errorf("got %q; want %q", req.Host, tt.out)
-		}
-	}
-}
-
-func TestNewRequestContentLength(t *testing.T) {
-	readByte := func(r io.Reader) io.Reader {
-		var b [1]byte
-		r.Read(b[:])
-		return r
-	}
-	tests := []struct {
-		r    io.Reader
-		want int64
-	}{
-		{bytes.NewReader([]byte("123")), 3},
-		{bytes.NewBuffer([]byte("1234")), 4},
-		{strings.NewReader("12345"), 5},
-		// Not detected:
-		{struct{ io.Reader }{strings.NewReader("xyz")}, 0},
-		{io.NewSectionReader(strings.NewReader("x"), 0, 6), 0},
-		{readByte(io.NewSectionReader(strings.NewReader("xy"), 0, 6)), 0},
-	}
-	for _, tt := range tests {
-		req, err := NewRequest("POST", "http://localhost/", tt.r)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if req.ContentLength != tt.want {
-			t.Errorf("ContentLength(%T) = %d; want %d", tt.r, req.ContentLength, tt.want)
-		}
-	}
-}
-
-var parseHTTPVersionTests = []struct {
-	vers         string
-	major, minor int
-	ok           bool
-}{
-	{"HTTP/0.9", 0, 9, true},
-	{"HTTP/1.0", 1, 0, true},
-	{"HTTP/1.1", 1, 1, true},
-	{"HTTP/3.14", 3, 14, true},
-
-	{"HTTP", 0, 0, false},
-	{"HTTP/one.one", 0, 0, false},
-	{"HTTP/1.1/", 0, 0, false},
-	{"HTTP/-1,0", 0, 0, false},
-	{"HTTP/0,-1", 0, 0, false},
-	{"HTTP/", 0, 0, false},
-	{"HTTP/1,1", 0, 0, false},
-}
-
-func TestParseHTTPVersion(t *testing.T) {
-	for _, tt := range parseHTTPVersionTests {
-		major, minor, ok := ParseHTTPVersion(tt.vers)
-		if ok != tt.ok || major != tt.major || minor != tt.minor {
-			type version struct {
-				major, minor int
-				ok           bool
-			}
-			t.Errorf("failed to parse %q, expected: %#v, got %#v", tt.vers, version{tt.major, tt.minor, tt.ok}, version{major, minor, ok})
-		}
-	}
-}
-
-type getBasicAuthTest struct {
-	username, password string
-	ok                 bool
-}
-
-type basicAuthCredentialsTest struct {
-	username, password string
-}
-
-var getBasicAuthTests = []struct {
-	username, password string
-	ok                 bool
-}{
-	{"Aladdin", "open sesame", true},
-	{"Aladdin", "open:sesame", true},
-	{"", "", true},
-}
-
-func TestGetBasicAuth(t *testing.T) {
-	for _, tt := range getBasicAuthTests {
-		r, _ := NewRequest("GET", "http://example.com/", nil)
-		r.SetBasicAuth(tt.username, tt.password)
-		username, password, ok := r.BasicAuth()
-		if ok != tt.ok || username != tt.username || password != tt.password {
-			t.Errorf("BasicAuth() = %#v, want %#v", getBasicAuthTest{username, password, ok},
-				getBasicAuthTest{tt.username, tt.password, tt.ok})
-		}
-	}
-	// Unauthenticated request.
-	r, _ := NewRequest("GET", "http://example.com/", nil)
-	username, password, ok := r.BasicAuth()
-	if ok {
-		t.Errorf("expected false from BasicAuth when the request is unauthenticated")
-	}
-	want := basicAuthCredentialsTest{"", ""}
-	if username != want.username || password != want.password {
-		t.Errorf("expected credentials: %#v when the request is unauthenticated, got %#v",
-			want, basicAuthCredentialsTest{username, password})
-	}
-}
-
-var parseBasicAuthTests = []struct {
-	header, username, password string
-	ok                         bool
-}{
-	{"Basic " + base64.StdEncoding.EncodeToString([]byte("Aladdin:open sesame")), "Aladdin", "open sesame", true},
-	{"Basic " + base64.StdEncoding.EncodeToString([]byte("Aladdin:open:sesame")), "Aladdin", "open:sesame", true},
-	{"Basic " + base64.StdEncoding.EncodeToString([]byte(":")), "", "", true},
-	{"Basic" + base64.StdEncoding.EncodeToString([]byte("Aladdin:open sesame")), "", "", false},
-	{base64.StdEncoding.EncodeToString([]byte("Aladdin:open sesame")), "", "", false},
-	{"Basic ", "", "", false},
-	{"Basic Aladdin:open sesame", "", "", false},
-	{`Digest username="Aladdin"`, "", "", false},
-}
-
-func TestParseBasicAuth(t *testing.T) {
-	for _, tt := range parseBasicAuthTests {
-		r, _ := NewRequest("GET", "http://example.com/", nil)
-		r.Header.Set("Authorization", tt.header)
-		username, password, ok := r.BasicAuth()
-		if ok != tt.ok || username != tt.username || password != tt.password {
-			t.Errorf("BasicAuth() = %#v, want %#v", getBasicAuthTest{username, password, ok},
-				getBasicAuthTest{tt.username, tt.password, tt.ok})
-		}
-	}
-}
-
-type logWrites struct {
-	t   *testing.T
-	dst *[]string
-}
-
-func (l logWrites) WriteByte(c byte) error {
-	l.t.Fatalf("unexpected WriteByte call")
-	return nil
-}
-
-func (l logWrites) Write(p []byte) (n int, err error) {
-	*l.dst = append(*l.dst, string(p))
-	return len(p), nil
-}
-
-func TestRequestWriteBufferedWriter(t *testing.T) {
-	got := []string{}
-	req, _ := NewRequest("GET", "http://foo.com/", nil)
-	req.Write(logWrites{t, &got})
-	want := []string{
-		"GET / HTTP/1.1\r\n",
-		"Host: foo.com\r\n",
-		"User-Agent: " + DefaultUserAgent + "\r\n",
-		"\r\n",
-	}
-	if !reflect.DeepEqual(got, want) {
-		t.Errorf("Writes = %q\n  Want = %q", got, want)
-	}
-}
-
-func TestRequestBadHost(t *testing.T) {
-	got := []string{}
-	req, err := NewRequest("GET", "http://foo.com with spaces/after", nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	req.Write(logWrites{t, &got})
-	want := []string{
-		"GET /after HTTP/1.1\r\n",
-		"Host: foo.com\r\n",
-		"User-Agent: " + DefaultUserAgent + "\r\n",
-		"\r\n",
-	}
-	if !reflect.DeepEqual(got, want) {
-		t.Errorf("Writes = %q\n  Want = %q", got, want)
-	}
-}
-
-func TestStarRequest(t *testing.T) {
-	req, err := ReadRequest(bufio.NewReader(strings.NewReader("M-SEARCH * HTTP/1.1\r\n\r\n")))
-	if err != nil {
-		return
-	}
-	var out bytes.Buffer
-	if err := req.Write(&out); err != nil {
-		t.Fatal(err)
-	}
-	back, err := ReadRequest(bufio.NewReader(&out))
-	if err != nil {
-		t.Fatal(err)
-	}
-	// Ignore the Headers (the User-Agent breaks the deep equal,
-	// but we don't care about it)
-	req.Header = nil
-	back.Header = nil
-	if !reflect.DeepEqual(req, back) {
-		t.Errorf("Original request doesn't match Request read back.")
-		t.Logf("Original: %#v", req)
-		t.Logf("Original.URL: %#v", req.URL)
-		t.Logf("Wrote: %s", out.Bytes())
-		t.Logf("Read back (doesn't match Original): %#v", back)
-	}
-}
-
-type responseWriterJustWriter struct {
-	io.Writer
-}
-
-func (responseWriterJustWriter) Header() Header  { panic("should not be called") }
-func (responseWriterJustWriter) WriteHeader(int) { panic("should not be called") }
-
-// delayedEOFReader never returns (n > 0, io.EOF), instead putting
-// off the io.EOF until a subsequent Read call.
-type delayedEOFReader struct {
-	r io.Reader
-}
-
-func (dr delayedEOFReader) Read(p []byte) (n int, err error) {
-	n, err = dr.r.Read(p)
-	if n > 0 && err == io.EOF {
-		err = nil
-	}
-	return
-}
-
-func TestIssue10884_MaxBytesEOF(t *testing.T) {
-	dst := ioutil.Discard
-	_, err := io.Copy(dst, MaxBytesReader(
-		responseWriterJustWriter{dst},
-		ioutil.NopCloser(delayedEOFReader{strings.NewReader("12345")}),
-		5))
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func testMissingFile(t *testing.T, req *Request) {
-	f, fh, err := req.FormFile("missing")
-	if f != nil {
-		t.Errorf("FormFile file = %v, want nil", f)
-	}
-	if fh != nil {
-		t.Errorf("FormFile file header = %q, want nil", fh)
-	}
-	if err != ErrMissingFile {
-		t.Errorf("FormFile err = %q, want ErrMissingFile", err)
-	}
-}
-
-func newTestMultipartRequest(t *testing.T) *Request {
-	b := strings.NewReader(strings.Replace(message, "\n", "\r\n", -1))
-	req, err := NewRequest("POST", "/", b)
-	if err != nil {
-		t.Fatal("NewRequest:", err)
-	}
-	ctype := fmt.Sprintf(`multipart/form-data; boundary="%s"`, boundary)
-	req.Header.Set("Content-type", ctype)
-	return req
-}
-
-func validateTestMultipartContents(t *testing.T, req *Request, allMem bool) {
-	if g, e := req.FormValue("texta"), textaValue; g != e {
-		t.Errorf("texta value = %q, want %q", g, e)
-	}
-	if g, e := req.FormValue("textb"), textbValue; g != e {
-		t.Errorf("textb value = %q, want %q", g, e)
-	}
-	if g := req.FormValue("missing"); g != "" {
-		t.Errorf("missing value = %q, want empty string", g)
-	}
-
-	assertMem := func(n string, fd multipart.File) {
-		if _, ok := fd.(*os.File); ok {
-			t.Error(n, " is *os.File, should not be")
-		}
-	}
-	fda := testMultipartFile(t, req, "filea", "filea.txt", fileaContents)
-	defer fda.Close()
-	assertMem("filea", fda)
-	fdb := testMultipartFile(t, req, "fileb", "fileb.txt", filebContents)
-	defer fdb.Close()
-	if allMem {
-		assertMem("fileb", fdb)
-	} else {
-		if _, ok := fdb.(*os.File); !ok {
-			t.Errorf("fileb has unexpected underlying type %T", fdb)
-		}
-	}
-
-	testMissingFile(t, req)
-}
-
-func testMultipartFile(t *testing.T, req *Request, key, expectFilename, expectContent string) multipart.File {
-	f, fh, err := req.FormFile(key)
-	if err != nil {
-		t.Fatalf("FormFile(%q): %q", key, err)
-	}
-	if fh.Filename != expectFilename {
-		t.Errorf("filename = %q, want %q", fh.Filename, expectFilename)
-	}
-	var b bytes.Buffer
-	_, err = io.Copy(&b, f)
-	if err != nil {
-		t.Fatal("copying contents:", err)
-	}
-	if g := b.String(); g != expectContent {
-		t.Errorf("contents = %q, want %q", g, expectContent)
-	}
-	return f
-}
-
-const (
-	fileaContents = "This is a test file."
-	filebContents = "Another test file."
-	textaValue    = "foo"
-	textbValue    = "bar"
-	boundary      = `MyBoundary`
-)
-
-const message = `
---MyBoundary
-Content-Disposition: form-data; name="filea"; filename="filea.txt"
-Content-Type: text/plain
-
-` + fileaContents + `
---MyBoundary
-Content-Disposition: form-data; name="fileb"; filename="fileb.txt"
-Content-Type: text/plain
-
-` + filebContents + `
---MyBoundary
-Content-Disposition: form-data; name="texta"
-
-` + textaValue + `
---MyBoundary
-Content-Disposition: form-data; name="textb"
-
-` + textbValue + `
---MyBoundary--
-`
-
-func benchmarkReadRequest(b *testing.B, request string) {
-	request = request + "\n"                             // final \n
-	request = strings.Replace(request, "\n", "\r\n", -1) // expand \n to \r\n
-	b.SetBytes(int64(len(request)))
-	r := bufio.NewReader(&infiniteReader{buf: []byte(request)})
-	b.ReportAllocs()
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		_, err := ReadRequest(r)
-		if err != nil {
-			b.Fatalf("failed to read request: %v", err)
-		}
-	}
-}
-
-// infiniteReader satisfies Read requests as if the contents of buf
-// loop indefinitely.
-type infiniteReader struct {
-	buf    []byte
-	offset int
-}
-
-func (r *infiniteReader) Read(b []byte) (int, error) {
-	n := copy(b, r.buf[r.offset:])
-	r.offset = (r.offset + n) % len(r.buf)
-	return n, nil
-}
-
-func BenchmarkReadRequestChrome(b *testing.B) {
-	// https://github.com/felixge/node-http-perf/blob/master/fixtures/get.http
-	benchmarkReadRequest(b, `GET / HTTP/1.1
-Host: localhost:8080
-Connection: keep-alive
-Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17
-Accept-Encoding: gzip,deflate,sdch
-Accept-Language: en-US,en;q=0.8
-Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
-Cookie: __utma=1.1978842379.1323102373.1323102373.1323102373.1; EPi:NumberOfVisits=1,2012-02-28T13:42:18; CrmSession=5b707226b9563e1bc69084d07a107c98; plushContainerWidth=100%25; plushNoTopMenu=0; hudson_auto_refresh=false
-`)
-}
-
-func BenchmarkReadRequestCurl(b *testing.B) {
-	// curl http://localhost:8080/
-	benchmarkReadRequest(b, `GET / HTTP/1.1
-User-Agent: curl/7.27.0
-Host: localhost:8080
-Accept: */*
-`)
-}
-
-func BenchmarkReadRequestApachebench(b *testing.B) {
-	// ab -n 1 -c 1 http://localhost:8080/
-	benchmarkReadRequest(b, `GET / HTTP/1.0
-Host: localhost:8080
-User-Agent: ApacheBench/2.3
-Accept: */*
-`)
-}
-
-func BenchmarkReadRequestSiege(b *testing.B) {
-	// siege -r 1 -c 1 http://localhost:8080/
-	benchmarkReadRequest(b, `GET / HTTP/1.1
-Host: localhost:8080
-Accept: */*
-Accept-Encoding: gzip
-User-Agent: JoeDog/1.00 [en] (X11; I; Siege 2.70)
-Connection: keep-alive
-`)
-}
-
-func BenchmarkReadRequestWrk(b *testing.B) {
-	// wrk -t 1 -r 1 -c 1 http://localhost:8080/
-	benchmarkReadRequest(b, `GET / HTTP/1.1
-Host: localhost:8080
-`)
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/requestwrite_test.go b/third_party/gofrontend/libgo/go/net/http/requestwrite_test.go
deleted file mode 100644
index cfb95b0..0000000
--- a/third_party/gofrontend/libgo/go/net/http/requestwrite_test.go
+++ /dev/null
@@ -1,654 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net/url"
-	"strings"
-	"testing"
-)
-
-type reqWriteTest struct {
-	Req  Request
-	Body interface{} // optional []byte or func() io.ReadCloser to populate Req.Body
-
-	// Any of these three may be empty to skip that test.
-	WantWrite string // Request.Write
-	WantProxy string // Request.WriteProxy
-
-	WantError error // wanted error from Request.Write
-}
-
-var reqWriteTests = []reqWriteTest{
-	// HTTP/1.1 => chunked coding; no body; no trailer
-	{
-		Req: Request{
-			Method: "GET",
-			URL: &url.URL{
-				Scheme: "http",
-				Host:   "www.techcrunch.com",
-				Path:   "/",
-			},
-			Proto:      "HTTP/1.1",
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Header: Header{
-				"Accept":           {"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"},
-				"Accept-Charset":   {"ISO-8859-1,utf-8;q=0.7,*;q=0.7"},
-				"Accept-Encoding":  {"gzip,deflate"},
-				"Accept-Language":  {"en-us,en;q=0.5"},
-				"Keep-Alive":       {"300"},
-				"Proxy-Connection": {"keep-alive"},
-				"User-Agent":       {"Fake"},
-			},
-			Body:  nil,
-			Close: false,
-			Host:  "www.techcrunch.com",
-			Form:  map[string][]string{},
-		},
-
-		WantWrite: "GET / HTTP/1.1\r\n" +
-			"Host: www.techcrunch.com\r\n" +
-			"User-Agent: Fake\r\n" +
-			"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" +
-			"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" +
-			"Accept-Encoding: gzip,deflate\r\n" +
-			"Accept-Language: en-us,en;q=0.5\r\n" +
-			"Keep-Alive: 300\r\n" +
-			"Proxy-Connection: keep-alive\r\n\r\n",
-
-		WantProxy: "GET http://www.techcrunch.com/ HTTP/1.1\r\n" +
-			"Host: www.techcrunch.com\r\n" +
-			"User-Agent: Fake\r\n" +
-			"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" +
-			"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" +
-			"Accept-Encoding: gzip,deflate\r\n" +
-			"Accept-Language: en-us,en;q=0.5\r\n" +
-			"Keep-Alive: 300\r\n" +
-			"Proxy-Connection: keep-alive\r\n\r\n",
-	},
-	// HTTP/1.1 => chunked coding; body; empty trailer
-	{
-		Req: Request{
-			Method: "GET",
-			URL: &url.URL{
-				Scheme: "http",
-				Host:   "www.google.com",
-				Path:   "/search",
-			},
-			ProtoMajor:       1,
-			ProtoMinor:       1,
-			Header:           Header{},
-			TransferEncoding: []string{"chunked"},
-		},
-
-		Body: []byte("abcdef"),
-
-		WantWrite: "GET /search HTTP/1.1\r\n" +
-			"Host: www.google.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Transfer-Encoding: chunked\r\n\r\n" +
-			chunk("abcdef") + chunk(""),
-
-		WantProxy: "GET http://www.google.com/search HTTP/1.1\r\n" +
-			"Host: www.google.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Transfer-Encoding: chunked\r\n\r\n" +
-			chunk("abcdef") + chunk(""),
-	},
-	// HTTP/1.1 POST => chunked coding; body; empty trailer
-	{
-		Req: Request{
-			Method: "POST",
-			URL: &url.URL{
-				Scheme: "http",
-				Host:   "www.google.com",
-				Path:   "/search",
-			},
-			ProtoMajor:       1,
-			ProtoMinor:       1,
-			Header:           Header{},
-			Close:            true,
-			TransferEncoding: []string{"chunked"},
-		},
-
-		Body: []byte("abcdef"),
-
-		WantWrite: "POST /search HTTP/1.1\r\n" +
-			"Host: www.google.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Connection: close\r\n" +
-			"Transfer-Encoding: chunked\r\n\r\n" +
-			chunk("abcdef") + chunk(""),
-
-		WantProxy: "POST http://www.google.com/search HTTP/1.1\r\n" +
-			"Host: www.google.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Connection: close\r\n" +
-			"Transfer-Encoding: chunked\r\n\r\n" +
-			chunk("abcdef") + chunk(""),
-	},
-
-	// HTTP/1.1 POST with Content-Length, no chunking
-	{
-		Req: Request{
-			Method: "POST",
-			URL: &url.URL{
-				Scheme: "http",
-				Host:   "www.google.com",
-				Path:   "/search",
-			},
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			Header:        Header{},
-			Close:         true,
-			ContentLength: 6,
-		},
-
-		Body: []byte("abcdef"),
-
-		WantWrite: "POST /search HTTP/1.1\r\n" +
-			"Host: www.google.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Connection: close\r\n" +
-			"Content-Length: 6\r\n" +
-			"\r\n" +
-			"abcdef",
-
-		WantProxy: "POST http://www.google.com/search HTTP/1.1\r\n" +
-			"Host: www.google.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Connection: close\r\n" +
-			"Content-Length: 6\r\n" +
-			"\r\n" +
-			"abcdef",
-	},
-
-	// HTTP/1.1 POST with Content-Length in headers
-	{
-		Req: Request{
-			Method: "POST",
-			URL:    mustParseURL("http://example.com/"),
-			Host:   "example.com",
-			Header: Header{
-				"Content-Length": []string{"10"}, // ignored
-			},
-			ContentLength: 6,
-		},
-
-		Body: []byte("abcdef"),
-
-		WantWrite: "POST / HTTP/1.1\r\n" +
-			"Host: example.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Content-Length: 6\r\n" +
-			"\r\n" +
-			"abcdef",
-
-		WantProxy: "POST http://example.com/ HTTP/1.1\r\n" +
-			"Host: example.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Content-Length: 6\r\n" +
-			"\r\n" +
-			"abcdef",
-	},
-
-	// default to HTTP/1.1
-	{
-		Req: Request{
-			Method: "GET",
-			URL:    mustParseURL("/search"),
-			Host:   "www.google.com",
-		},
-
-		WantWrite: "GET /search HTTP/1.1\r\n" +
-			"Host: www.google.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"\r\n",
-	},
-
-	// Request with a 0 ContentLength and a 0 byte body.
-	{
-		Req: Request{
-			Method:        "POST",
-			URL:           mustParseURL("/"),
-			Host:          "example.com",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			ContentLength: 0, // as if unset by user
-		},
-
-		Body: func() io.ReadCloser { return ioutil.NopCloser(io.LimitReader(strings.NewReader("xx"), 0)) },
-
-		// RFC 2616 Section 14.13 says Content-Length should be specified
-		// unless body is prohibited by the request method.
-		// Also, nginx expects it for POST and PUT.
-		WantWrite: "POST / HTTP/1.1\r\n" +
-			"Host: example.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Content-Length: 0\r\n" +
-			"\r\n",
-
-		WantProxy: "POST / HTTP/1.1\r\n" +
-			"Host: example.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Content-Length: 0\r\n" +
-			"\r\n",
-	},
-
-	// Request with a 0 ContentLength and a 1 byte body.
-	{
-		Req: Request{
-			Method:        "POST",
-			URL:           mustParseURL("/"),
-			Host:          "example.com",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			ContentLength: 0, // as if unset by user
-		},
-
-		Body: func() io.ReadCloser { return ioutil.NopCloser(io.LimitReader(strings.NewReader("xx"), 1)) },
-
-		WantWrite: "POST / HTTP/1.1\r\n" +
-			"Host: example.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Transfer-Encoding: chunked\r\n\r\n" +
-			chunk("x") + chunk(""),
-
-		WantProxy: "POST / HTTP/1.1\r\n" +
-			"Host: example.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"Transfer-Encoding: chunked\r\n\r\n" +
-			chunk("x") + chunk(""),
-	},
-
-	// Request with a ContentLength of 10 but a 5 byte body.
-	{
-		Req: Request{
-			Method:        "POST",
-			URL:           mustParseURL("/"),
-			Host:          "example.com",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			ContentLength: 10, // but we're going to send only 5 bytes
-		},
-		Body:      []byte("12345"),
-		WantError: errors.New("http: ContentLength=10 with Body length 5"),
-	},
-
-	// Request with a ContentLength of 4 but an 8 byte body.
-	{
-		Req: Request{
-			Method:        "POST",
-			URL:           mustParseURL("/"),
-			Host:          "example.com",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			ContentLength: 4, // but we're going to try to send 8 bytes
-		},
-		Body:      []byte("12345678"),
-		WantError: errors.New("http: ContentLength=4 with Body length 8"),
-	},
-
-	// Request with a 5 ContentLength and nil body.
-	{
-		Req: Request{
-			Method:        "POST",
-			URL:           mustParseURL("/"),
-			Host:          "example.com",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			ContentLength: 5, // but we'll omit the body
-		},
-		WantError: errors.New("http: Request.ContentLength=5 with nil Body"),
-	},
-
-	// Request with a 0 ContentLength and a body with 1 byte content and an error.
-	{
-		Req: Request{
-			Method:        "POST",
-			URL:           mustParseURL("/"),
-			Host:          "example.com",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			ContentLength: 0, // as if unset by user
-		},
-
-		Body: func() io.ReadCloser {
-			err := errors.New("Custom reader error")
-			errReader := &errorReader{err}
-			return ioutil.NopCloser(io.MultiReader(strings.NewReader("x"), errReader))
-		},
-
-		WantError: errors.New("Custom reader error"),
-	},
-
-	// Request with a 0 ContentLength and a body without content and an error.
-	{
-		Req: Request{
-			Method:        "POST",
-			URL:           mustParseURL("/"),
-			Host:          "example.com",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			ContentLength: 0, // as if unset by user
-		},
-
-		Body: func() io.ReadCloser {
-			err := errors.New("Custom reader error")
-			errReader := &errorReader{err}
-			return ioutil.NopCloser(errReader)
-		},
-
-		WantError: errors.New("Custom reader error"),
-	},
-
-	// Verify that DumpRequest preserves the HTTP version number, doesn't add a Host,
-	// and doesn't add a User-Agent.
-	{
-		Req: Request{
-			Method:     "GET",
-			URL:        mustParseURL("/foo"),
-			ProtoMajor: 1,
-			ProtoMinor: 0,
-			Header: Header{
-				"X-Foo": []string{"X-Bar"},
-			},
-		},
-
-		WantWrite: "GET /foo HTTP/1.1\r\n" +
-			"Host: \r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"X-Foo: X-Bar\r\n\r\n",
-	},
-
-	// If no Request.Host and no Request.URL.Host, we send
-	// an empty Host header, and don't use
-	// Request.Header["Host"]. This is just testing that
-	// we don't change Go 1.0 behavior.
-	{
-		Req: Request{
-			Method: "GET",
-			Host:   "",
-			URL: &url.URL{
-				Scheme: "http",
-				Host:   "",
-				Path:   "/search",
-			},
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Header: Header{
-				"Host": []string{"bad.example.com"},
-			},
-		},
-
-		WantWrite: "GET /search HTTP/1.1\r\n" +
-			"Host: \r\n" +
-			"User-Agent: Go-http-client/1.1\r\n\r\n",
-	},
-
-	// Opaque test #1 from golang.org/issue/4860
-	{
-		Req: Request{
-			Method: "GET",
-			URL: &url.URL{
-				Scheme: "http",
-				Host:   "www.google.com",
-				Opaque: "/%2F/%2F/",
-			},
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Header:     Header{},
-		},
-
-		WantWrite: "GET /%2F/%2F/ HTTP/1.1\r\n" +
-			"Host: www.google.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n\r\n",
-	},
-
-	// Opaque test #2 from golang.org/issue/4860
-	{
-		Req: Request{
-			Method: "GET",
-			URL: &url.URL{
-				Scheme: "http",
-				Host:   "x.google.com",
-				Opaque: "//y.google.com/%2F/%2F/",
-			},
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Header:     Header{},
-		},
-
-		WantWrite: "GET http://y.google.com/%2F/%2F/ HTTP/1.1\r\n" +
-			"Host: x.google.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n\r\n",
-	},
-
-	// Testing custom case in header keys. Issue 5022.
-	{
-		Req: Request{
-			Method: "GET",
-			URL: &url.URL{
-				Scheme: "http",
-				Host:   "www.google.com",
-				Path:   "/",
-			},
-			Proto:      "HTTP/1.1",
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Header: Header{
-				"ALL-CAPS": {"x"},
-			},
-		},
-
-		WantWrite: "GET / HTTP/1.1\r\n" +
-			"Host: www.google.com\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"ALL-CAPS: x\r\n" +
-			"\r\n",
-	},
-
-	// Request with host header field; IPv6 address with zone identifier
-	{
-		Req: Request{
-			Method: "GET",
-			URL: &url.URL{
-				Host: "[fe80::1%en0]",
-			},
-		},
-
-		WantWrite: "GET / HTTP/1.1\r\n" +
-			"Host: [fe80::1]\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"\r\n",
-	},
-
-	// Request with optional host header field; IPv6 address with zone identifier
-	{
-		Req: Request{
-			Method: "GET",
-			URL: &url.URL{
-				Host: "www.example.com",
-			},
-			Host: "[fe80::1%en0]:8080",
-		},
-
-		WantWrite: "GET / HTTP/1.1\r\n" +
-			"Host: [fe80::1]:8080\r\n" +
-			"User-Agent: Go-http-client/1.1\r\n" +
-			"\r\n",
-	},
-}
-
-func TestRequestWrite(t *testing.T) {
-	for i := range reqWriteTests {
-		tt := &reqWriteTests[i]
-
-		setBody := func() {
-			if tt.Body == nil {
-				return
-			}
-			switch b := tt.Body.(type) {
-			case []byte:
-				tt.Req.Body = ioutil.NopCloser(bytes.NewReader(b))
-			case func() io.ReadCloser:
-				tt.Req.Body = b()
-			}
-		}
-		setBody()
-		if tt.Req.Header == nil {
-			tt.Req.Header = make(Header)
-		}
-
-		var braw bytes.Buffer
-		err := tt.Req.Write(&braw)
-		if g, e := fmt.Sprintf("%v", err), fmt.Sprintf("%v", tt.WantError); g != e {
-			t.Errorf("writing #%d, err = %q, want %q", i, g, e)
-			continue
-		}
-		if err != nil {
-			continue
-		}
-
-		if tt.WantWrite != "" {
-			sraw := braw.String()
-			if sraw != tt.WantWrite {
-				t.Errorf("Test %d, expecting:\n%s\nGot:\n%s\n", i, tt.WantWrite, sraw)
-				continue
-			}
-		}
-
-		if tt.WantProxy != "" {
-			setBody()
-			var praw bytes.Buffer
-			err = tt.Req.WriteProxy(&praw)
-			if err != nil {
-				t.Errorf("WriteProxy #%d: %s", i, err)
-				continue
-			}
-			sraw := praw.String()
-			if sraw != tt.WantProxy {
-				t.Errorf("Test Proxy %d, expecting:\n%s\nGot:\n%s\n", i, tt.WantProxy, sraw)
-				continue
-			}
-		}
-	}
-}
-
-type closeChecker struct {
-	io.Reader
-	closed bool
-}
-
-func (rc *closeChecker) Close() error {
-	rc.closed = true
-	return nil
-}
-
-// TestRequestWriteClosesBody tests that Request.Write does close its request.Body.
-// It also indirectly tests NewRequest and that it doesn't wrap an existing Closer
-// inside a NopCloser, and that it serializes it correctly.
-func TestRequestWriteClosesBody(t *testing.T) {
-	rc := &closeChecker{Reader: strings.NewReader("my body")}
-	req, _ := NewRequest("POST", "http://foo.com/", rc)
-	if req.ContentLength != 0 {
-		t.Errorf("got req.ContentLength %d, want 0", req.ContentLength)
-	}
-	buf := new(bytes.Buffer)
-	req.Write(buf)
-	if !rc.closed {
-		t.Error("body not closed after write")
-	}
-	expected := "POST / HTTP/1.1\r\n" +
-		"Host: foo.com\r\n" +
-		"User-Agent: Go-http-client/1.1\r\n" +
-		"Transfer-Encoding: chunked\r\n\r\n" +
-		// TODO: currently we don't buffer before chunking, so we get a
-		// single "m" chunk before the other chunks, as this was the 1-byte
-		// read from our MultiReader where we stiched the Body back together
-		// after sniffing whether the Body was 0 bytes or not.
-		chunk("m") +
-		chunk("y body") +
-		chunk("")
-	if buf.String() != expected {
-		t.Errorf("write:\n got: %s\nwant: %s", buf.String(), expected)
-	}
-}
-
-func chunk(s string) string {
-	return fmt.Sprintf("%x\r\n%s\r\n", len(s), s)
-}
-
-func mustParseURL(s string) *url.URL {
-	u, err := url.Parse(s)
-	if err != nil {
-		panic(fmt.Sprintf("Error parsing URL %q: %v", s, err))
-	}
-	return u
-}
-
-type writerFunc func([]byte) (int, error)
-
-func (f writerFunc) Write(p []byte) (int, error) { return f(p) }
-
-// TestRequestWriteError tests the Write err != nil checks in (*Request).write.
-func TestRequestWriteError(t *testing.T) {
-	failAfter, writeCount := 0, 0
-	errFail := errors.New("fake write failure")
-
-	// w is the buffered io.Writer to write the request to.  It
-	// fails exactly once on its Nth Write call, as controlled by
-	// failAfter. It also tracks the number of calls in
-	// writeCount.
-	w := struct {
-		io.ByteWriter // to avoid being wrapped by a bufio.Writer
-		io.Writer
-	}{
-		nil,
-		writerFunc(func(p []byte) (n int, err error) {
-			writeCount++
-			if failAfter == 0 {
-				err = errFail
-			}
-			failAfter--
-			return len(p), err
-		}),
-	}
-
-	req, _ := NewRequest("GET", "http://example.com/", nil)
-	const writeCalls = 4 // number of Write calls in current implementation
-	sawGood := false
-	for n := 0; n <= writeCalls+2; n++ {
-		failAfter = n
-		writeCount = 0
-		err := req.Write(w)
-		var wantErr error
-		if n < writeCalls {
-			wantErr = errFail
-		}
-		if err != wantErr {
-			t.Errorf("for fail-after %d Writes, err = %v; want %v", n, err, wantErr)
-			continue
-		}
-		if err == nil {
-			sawGood = true
-			if writeCount != writeCalls {
-				t.Fatalf("writeCalls constant is outdated in test")
-			}
-		}
-		if writeCount > writeCalls || writeCount > n+1 {
-			t.Errorf("for fail-after %d, saw unexpectedly high (%d) write calls", n, writeCount)
-		}
-	}
-	if !sawGood {
-		t.Fatalf("writeCalls constant is outdated in test")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/response.go b/third_party/gofrontend/libgo/go/net/http/response.go
deleted file mode 100644
index 76b8538..0000000
--- a/third_party/gofrontend/libgo/go/net/http/response.go
+++ /dev/null
@@ -1,298 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// HTTP Response reading and parsing.
-
-package http
-
-import (
-	"bufio"
-	"bytes"
-	"crypto/tls"
-	"errors"
-	"io"
-	"net/textproto"
-	"net/url"
-	"strconv"
-	"strings"
-)
-
-var respExcludeHeader = map[string]bool{
-	"Content-Length":    true,
-	"Transfer-Encoding": true,
-	"Trailer":           true,
-}
-
-// Response represents the response from an HTTP request.
-//
-type Response struct {
-	Status     string // e.g. "200 OK"
-	StatusCode int    // e.g. 200
-	Proto      string // e.g. "HTTP/1.0"
-	ProtoMajor int    // e.g. 1
-	ProtoMinor int    // e.g. 0
-
-	// Header maps header keys to values.  If the response had multiple
-	// headers with the same key, they may be concatenated, with comma
-	// delimiters.  (Section 4.2 of RFC 2616 requires that multiple headers
-	// be semantically equivalent to a comma-delimited sequence.) Values
-	// duplicated by other fields in this struct (e.g., ContentLength) are
-	// omitted from Header.
-	//
-	// Keys in the map are canonicalized (see CanonicalHeaderKey).
-	Header Header
-
-	// Body represents the response body.
-	//
-	// The http Client and Transport guarantee that Body is always
-	// non-nil, even on responses without a body or responses with
-	// a zero-length body. It is the caller's responsibility to
-	// close Body. The default HTTP client's Transport does not
-	// attempt to reuse HTTP/1.0 or HTTP/1.1 TCP connections
-	// ("keep-alive") unless the Body is read to completion and is
-	// closed.
-	//
-	// The Body is automatically dechunked if the server replied
-	// with a "chunked" Transfer-Encoding.
-	Body io.ReadCloser
-
-	// ContentLength records the length of the associated content.  The
-	// value -1 indicates that the length is unknown.  Unless Request.Method
-	// is "HEAD", values >= 0 indicate that the given number of bytes may
-	// be read from Body.
-	ContentLength int64
-
-	// Contains transfer encodings from outer-most to inner-most. Value is
-	// nil, means that "identity" encoding is used.
-	TransferEncoding []string
-
-	// Close records whether the header directed that the connection be
-	// closed after reading Body.  The value is advice for clients: neither
-	// ReadResponse nor Response.Write ever closes a connection.
-	Close bool
-
-	// Trailer maps trailer keys to values, in the same
-	// format as the header.
-	Trailer Header
-
-	// The Request that was sent to obtain this Response.
-	// Request's Body is nil (having already been consumed).
-	// This is only populated for Client requests.
-	Request *Request
-
-	// TLS contains information about the TLS connection on which the
-	// response was received. It is nil for unencrypted responses.
-	// The pointer is shared between responses and should not be
-	// modified.
-	TLS *tls.ConnectionState
-}
-
-// Cookies parses and returns the cookies set in the Set-Cookie headers.
-func (r *Response) Cookies() []*Cookie {
-	return readSetCookies(r.Header)
-}
-
-// ErrNoLocation is returned by Response's Location method
-// when no Location header is present.
-var ErrNoLocation = errors.New("http: no Location header in response")
-
-// Location returns the URL of the response's "Location" header,
-// if present.  Relative redirects are resolved relative to
-// the Response's Request.  ErrNoLocation is returned if no
-// Location header is present.
-func (r *Response) Location() (*url.URL, error) {
-	lv := r.Header.Get("Location")
-	if lv == "" {
-		return nil, ErrNoLocation
-	}
-	if r.Request != nil && r.Request.URL != nil {
-		return r.Request.URL.Parse(lv)
-	}
-	return url.Parse(lv)
-}
-
-// ReadResponse reads and returns an HTTP response from r.
-// The req parameter optionally specifies the Request that corresponds
-// to this Response. If nil, a GET request is assumed.
-// Clients must call resp.Body.Close when finished reading resp.Body.
-// After that call, clients can inspect resp.Trailer to find key/value
-// pairs included in the response trailer.
-func ReadResponse(r *bufio.Reader, req *Request) (*Response, error) {
-	tp := textproto.NewReader(r)
-	resp := &Response{
-		Request: req,
-	}
-
-	// Parse the first line of the response.
-	line, err := tp.ReadLine()
-	if err != nil {
-		if err == io.EOF {
-			err = io.ErrUnexpectedEOF
-		}
-		return nil, err
-	}
-	f := strings.SplitN(line, " ", 3)
-	if len(f) < 2 {
-		return nil, &badStringError{"malformed HTTP response", line}
-	}
-	reasonPhrase := ""
-	if len(f) > 2 {
-		reasonPhrase = f[2]
-	}
-	resp.Status = f[1] + " " + reasonPhrase
-	resp.StatusCode, err = strconv.Atoi(f[1])
-	if err != nil {
-		return nil, &badStringError{"malformed HTTP status code", f[1]}
-	}
-
-	resp.Proto = f[0]
-	var ok bool
-	if resp.ProtoMajor, resp.ProtoMinor, ok = ParseHTTPVersion(resp.Proto); !ok {
-		return nil, &badStringError{"malformed HTTP version", resp.Proto}
-	}
-
-	// Parse the response headers.
-	mimeHeader, err := tp.ReadMIMEHeader()
-	if err != nil {
-		if err == io.EOF {
-			err = io.ErrUnexpectedEOF
-		}
-		return nil, err
-	}
-	resp.Header = Header(mimeHeader)
-
-	fixPragmaCacheControl(resp.Header)
-
-	err = readTransfer(resp, r)
-	if err != nil {
-		return nil, err
-	}
-
-	return resp, nil
-}
-
-// RFC2616: Should treat
-//	Pragma: no-cache
-// like
-//	Cache-Control: no-cache
-func fixPragmaCacheControl(header Header) {
-	if hp, ok := header["Pragma"]; ok && len(hp) > 0 && hp[0] == "no-cache" {
-		if _, presentcc := header["Cache-Control"]; !presentcc {
-			header["Cache-Control"] = []string{"no-cache"}
-		}
-	}
-}
-
-// ProtoAtLeast reports whether the HTTP protocol used
-// in the response is at least major.minor.
-func (r *Response) ProtoAtLeast(major, minor int) bool {
-	return r.ProtoMajor > major ||
-		r.ProtoMajor == major && r.ProtoMinor >= minor
-}
-
-// Write writes r to w in the HTTP/1.n server response format,
-// including the status line, headers, body, and optional trailer.
-//
-// This method consults the following fields of the response r:
-//
-//  StatusCode
-//  ProtoMajor
-//  ProtoMinor
-//  Request.Method
-//  TransferEncoding
-//  Trailer
-//  Body
-//  ContentLength
-//  Header, values for non-canonical keys will have unpredictable behavior
-//
-// The Response Body is closed after it is sent.
-func (r *Response) Write(w io.Writer) error {
-	// Status line
-	text := r.Status
-	if text == "" {
-		var ok bool
-		text, ok = statusText[r.StatusCode]
-		if !ok {
-			text = "status code " + strconv.Itoa(r.StatusCode)
-		}
-	}
-	protoMajor, protoMinor := strconv.Itoa(r.ProtoMajor), strconv.Itoa(r.ProtoMinor)
-	statusCode := strconv.Itoa(r.StatusCode) + " "
-	text = strings.TrimPrefix(text, statusCode)
-	if _, err := io.WriteString(w, "HTTP/"+protoMajor+"."+protoMinor+" "+statusCode+text+"\r\n"); err != nil {
-		return err
-	}
-
-	// Clone it, so we can modify r1 as needed.
-	r1 := new(Response)
-	*r1 = *r
-	if r1.ContentLength == 0 && r1.Body != nil {
-		// Is it actually 0 length? Or just unknown?
-		var buf [1]byte
-		n, err := r1.Body.Read(buf[:])
-		if err != nil && err != io.EOF {
-			return err
-		}
-		if n == 0 {
-			// Reset it to a known zero reader, in case underlying one
-			// is unhappy being read repeatedly.
-			r1.Body = eofReader
-		} else {
-			r1.ContentLength = -1
-			r1.Body = struct {
-				io.Reader
-				io.Closer
-			}{
-				io.MultiReader(bytes.NewReader(buf[:1]), r.Body),
-				r.Body,
-			}
-		}
-	}
-	// If we're sending a non-chunked HTTP/1.1 response without a
-	// content-length, the only way to do that is the old HTTP/1.0
-	// way, by noting the EOF with a connection close, so we need
-	// to set Close.
-	if r1.ContentLength == -1 && !r1.Close && r1.ProtoAtLeast(1, 1) && !chunked(r1.TransferEncoding) {
-		r1.Close = true
-	}
-
-	// Process Body,ContentLength,Close,Trailer
-	tw, err := newTransferWriter(r1)
-	if err != nil {
-		return err
-	}
-	err = tw.WriteHeader(w)
-	if err != nil {
-		return err
-	}
-
-	// Rest of header
-	err = r.Header.WriteSubset(w, respExcludeHeader)
-	if err != nil {
-		return err
-	}
-
-	// contentLengthAlreadySent may have been already sent for
-	// POST/PUT requests, even if zero length. See Issue 8180.
-	contentLengthAlreadySent := tw.shouldSendContentLength()
-	if r1.ContentLength == 0 && !chunked(r1.TransferEncoding) && !contentLengthAlreadySent {
-		if _, err := io.WriteString(w, "Content-Length: 0\r\n"); err != nil {
-			return err
-		}
-	}
-
-	// End-of-header
-	if _, err := io.WriteString(w, "\r\n"); err != nil {
-		return err
-	}
-
-	// Write body and trailer
-	err = tw.WriteBody(w)
-	if err != nil {
-		return err
-	}
-
-	// Success
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/response_test.go b/third_party/gofrontend/libgo/go/net/http/response_test.go
deleted file mode 100644
index 421cf55..0000000
--- a/third_party/gofrontend/libgo/go/net/http/response_test.go
+++ /dev/null
@@ -1,725 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"bufio"
-	"bytes"
-	"compress/gzip"
-	"crypto/rand"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net/http/internal"
-	"net/url"
-	"reflect"
-	"regexp"
-	"strings"
-	"testing"
-)
-
-type respTest struct {
-	Raw  string
-	Resp Response
-	Body string
-}
-
-func dummyReq(method string) *Request {
-	return &Request{Method: method}
-}
-
-func dummyReq11(method string) *Request {
-	return &Request{Method: method, Proto: "HTTP/1.1", ProtoMajor: 1, ProtoMinor: 1}
-}
-
-var respTests = []respTest{
-	// Unchunked response without Content-Length.
-	{
-		"HTTP/1.0 200 OK\r\n" +
-			"Connection: close\r\n" +
-			"\r\n" +
-			"Body here\n",
-
-		Response{
-			Status:     "200 OK",
-			StatusCode: 200,
-			Proto:      "HTTP/1.0",
-			ProtoMajor: 1,
-			ProtoMinor: 0,
-			Request:    dummyReq("GET"),
-			Header: Header{
-				"Connection": {"close"}, // TODO(rsc): Delete?
-			},
-			Close:         true,
-			ContentLength: -1,
-		},
-
-		"Body here\n",
-	},
-
-	// Unchunked HTTP/1.1 response without Content-Length or
-	// Connection headers.
-	{
-		"HTTP/1.1 200 OK\r\n" +
-			"\r\n" +
-			"Body here\n",
-
-		Response{
-			Status:        "200 OK",
-			StatusCode:    200,
-			Proto:         "HTTP/1.1",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			Header:        Header{},
-			Request:       dummyReq("GET"),
-			Close:         true,
-			ContentLength: -1,
-		},
-
-		"Body here\n",
-	},
-
-	// Unchunked HTTP/1.1 204 response without Content-Length.
-	{
-		"HTTP/1.1 204 No Content\r\n" +
-			"\r\n" +
-			"Body should not be read!\n",
-
-		Response{
-			Status:        "204 No Content",
-			StatusCode:    204,
-			Proto:         "HTTP/1.1",
-			ProtoMajor:    1,
-			ProtoMinor:    1,
-			Header:        Header{},
-			Request:       dummyReq("GET"),
-			Close:         false,
-			ContentLength: 0,
-		},
-
-		"",
-	},
-
-	// Unchunked response with Content-Length.
-	{
-		"HTTP/1.0 200 OK\r\n" +
-			"Content-Length: 10\r\n" +
-			"Connection: close\r\n" +
-			"\r\n" +
-			"Body here\n",
-
-		Response{
-			Status:     "200 OK",
-			StatusCode: 200,
-			Proto:      "HTTP/1.0",
-			ProtoMajor: 1,
-			ProtoMinor: 0,
-			Request:    dummyReq("GET"),
-			Header: Header{
-				"Connection":     {"close"},
-				"Content-Length": {"10"},
-			},
-			Close:         true,
-			ContentLength: 10,
-		},
-
-		"Body here\n",
-	},
-
-	// Chunked response without Content-Length.
-	{
-		"HTTP/1.1 200 OK\r\n" +
-			"Transfer-Encoding: chunked\r\n" +
-			"\r\n" +
-			"0a\r\n" +
-			"Body here\n\r\n" +
-			"09\r\n" +
-			"continued\r\n" +
-			"0\r\n" +
-			"\r\n",
-
-		Response{
-			Status:           "200 OK",
-			StatusCode:       200,
-			Proto:            "HTTP/1.1",
-			ProtoMajor:       1,
-			ProtoMinor:       1,
-			Request:          dummyReq("GET"),
-			Header:           Header{},
-			Close:            false,
-			ContentLength:    -1,
-			TransferEncoding: []string{"chunked"},
-		},
-
-		"Body here\ncontinued",
-	},
-
-	// Chunked response with Content-Length.
-	{
-		"HTTP/1.1 200 OK\r\n" +
-			"Transfer-Encoding: chunked\r\n" +
-			"Content-Length: 10\r\n" +
-			"\r\n" +
-			"0a\r\n" +
-			"Body here\n\r\n" +
-			"0\r\n" +
-			"\r\n",
-
-		Response{
-			Status:           "200 OK",
-			StatusCode:       200,
-			Proto:            "HTTP/1.1",
-			ProtoMajor:       1,
-			ProtoMinor:       1,
-			Request:          dummyReq("GET"),
-			Header:           Header{},
-			Close:            false,
-			ContentLength:    -1,
-			TransferEncoding: []string{"chunked"},
-		},
-
-		"Body here\n",
-	},
-
-	// Chunked response in response to a HEAD request
-	{
-		"HTTP/1.1 200 OK\r\n" +
-			"Transfer-Encoding: chunked\r\n" +
-			"\r\n",
-
-		Response{
-			Status:           "200 OK",
-			StatusCode:       200,
-			Proto:            "HTTP/1.1",
-			ProtoMajor:       1,
-			ProtoMinor:       1,
-			Request:          dummyReq("HEAD"),
-			Header:           Header{},
-			TransferEncoding: []string{"chunked"},
-			Close:            false,
-			ContentLength:    -1,
-		},
-
-		"",
-	},
-
-	// Content-Length in response to a HEAD request
-	{
-		"HTTP/1.0 200 OK\r\n" +
-			"Content-Length: 256\r\n" +
-			"\r\n",
-
-		Response{
-			Status:           "200 OK",
-			StatusCode:       200,
-			Proto:            "HTTP/1.0",
-			ProtoMajor:       1,
-			ProtoMinor:       0,
-			Request:          dummyReq("HEAD"),
-			Header:           Header{"Content-Length": {"256"}},
-			TransferEncoding: nil,
-			Close:            true,
-			ContentLength:    256,
-		},
-
-		"",
-	},
-
-	// Content-Length in response to a HEAD request with HTTP/1.1
-	{
-		"HTTP/1.1 200 OK\r\n" +
-			"Content-Length: 256\r\n" +
-			"\r\n",
-
-		Response{
-			Status:           "200 OK",
-			StatusCode:       200,
-			Proto:            "HTTP/1.1",
-			ProtoMajor:       1,
-			ProtoMinor:       1,
-			Request:          dummyReq("HEAD"),
-			Header:           Header{"Content-Length": {"256"}},
-			TransferEncoding: nil,
-			Close:            false,
-			ContentLength:    256,
-		},
-
-		"",
-	},
-
-	// No Content-Length or Chunked in response to a HEAD request
-	{
-		"HTTP/1.0 200 OK\r\n" +
-			"\r\n",
-
-		Response{
-			Status:           "200 OK",
-			StatusCode:       200,
-			Proto:            "HTTP/1.0",
-			ProtoMajor:       1,
-			ProtoMinor:       0,
-			Request:          dummyReq("HEAD"),
-			Header:           Header{},
-			TransferEncoding: nil,
-			Close:            true,
-			ContentLength:    -1,
-		},
-
-		"",
-	},
-
-	// explicit Content-Length of 0.
-	{
-		"HTTP/1.1 200 OK\r\n" +
-			"Content-Length: 0\r\n" +
-			"\r\n",
-
-		Response{
-			Status:     "200 OK",
-			StatusCode: 200,
-			Proto:      "HTTP/1.1",
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Request:    dummyReq("GET"),
-			Header: Header{
-				"Content-Length": {"0"},
-			},
-			Close:         false,
-			ContentLength: 0,
-		},
-
-		"",
-	},
-
-	// Status line without a Reason-Phrase, but trailing space.
-	// (permitted by RFC 2616)
-	{
-		"HTTP/1.0 303 \r\n\r\n",
-		Response{
-			Status:        "303 ",
-			StatusCode:    303,
-			Proto:         "HTTP/1.0",
-			ProtoMajor:    1,
-			ProtoMinor:    0,
-			Request:       dummyReq("GET"),
-			Header:        Header{},
-			Close:         true,
-			ContentLength: -1,
-		},
-
-		"",
-	},
-
-	// Status line without a Reason-Phrase, and no trailing space.
-	// (not permitted by RFC 2616, but we'll accept it anyway)
-	{
-		"HTTP/1.0 303\r\n\r\n",
-		Response{
-			Status:        "303 ",
-			StatusCode:    303,
-			Proto:         "HTTP/1.0",
-			ProtoMajor:    1,
-			ProtoMinor:    0,
-			Request:       dummyReq("GET"),
-			Header:        Header{},
-			Close:         true,
-			ContentLength: -1,
-		},
-
-		"",
-	},
-
-	// golang.org/issue/4767: don't special-case multipart/byteranges responses
-	{
-		`HTTP/1.1 206 Partial Content
-Connection: close
-Content-Type: multipart/byteranges; boundary=18a75608c8f47cef
-
-some body`,
-		Response{
-			Status:     "206 Partial Content",
-			StatusCode: 206,
-			Proto:      "HTTP/1.1",
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Request:    dummyReq("GET"),
-			Header: Header{
-				"Content-Type": []string{"multipart/byteranges; boundary=18a75608c8f47cef"},
-			},
-			Close:         true,
-			ContentLength: -1,
-		},
-
-		"some body",
-	},
-
-	// Unchunked response without Content-Length, Request is nil
-	{
-		"HTTP/1.0 200 OK\r\n" +
-			"Connection: close\r\n" +
-			"\r\n" +
-			"Body here\n",
-
-		Response{
-			Status:     "200 OK",
-			StatusCode: 200,
-			Proto:      "HTTP/1.0",
-			ProtoMajor: 1,
-			ProtoMinor: 0,
-			Header: Header{
-				"Connection": {"close"}, // TODO(rsc): Delete?
-			},
-			Close:         true,
-			ContentLength: -1,
-		},
-
-		"Body here\n",
-	},
-
-	// 206 Partial Content. golang.org/issue/8923
-	{
-		"HTTP/1.1 206 Partial Content\r\n" +
-			"Content-Type: text/plain; charset=utf-8\r\n" +
-			"Accept-Ranges: bytes\r\n" +
-			"Content-Range: bytes 0-5/1862\r\n" +
-			"Content-Length: 6\r\n\r\n" +
-			"foobar",
-
-		Response{
-			Status:     "206 Partial Content",
-			StatusCode: 206,
-			Proto:      "HTTP/1.1",
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Request:    dummyReq("GET"),
-			Header: Header{
-				"Accept-Ranges":  []string{"bytes"},
-				"Content-Length": []string{"6"},
-				"Content-Type":   []string{"text/plain; charset=utf-8"},
-				"Content-Range":  []string{"bytes 0-5/1862"},
-			},
-			ContentLength: 6,
-		},
-
-		"foobar",
-	},
-
-	// Both keep-alive and close, on the same Connection line. (Issue 8840)
-	{
-		"HTTP/1.1 200 OK\r\n" +
-			"Content-Length: 256\r\n" +
-			"Connection: keep-alive, close\r\n" +
-			"\r\n",
-
-		Response{
-			Status:     "200 OK",
-			StatusCode: 200,
-			Proto:      "HTTP/1.1",
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Request:    dummyReq("HEAD"),
-			Header: Header{
-				"Content-Length": {"256"},
-			},
-			TransferEncoding: nil,
-			Close:            true,
-			ContentLength:    256,
-		},
-
-		"",
-	},
-
-	// Both keep-alive and close, on different Connection lines. (Issue 8840)
-	{
-		"HTTP/1.1 200 OK\r\n" +
-			"Content-Length: 256\r\n" +
-			"Connection: keep-alive\r\n" +
-			"Connection: close\r\n" +
-			"\r\n",
-
-		Response{
-			Status:     "200 OK",
-			StatusCode: 200,
-			Proto:      "HTTP/1.1",
-			ProtoMajor: 1,
-			ProtoMinor: 1,
-			Request:    dummyReq("HEAD"),
-			Header: Header{
-				"Content-Length": {"256"},
-			},
-			TransferEncoding: nil,
-			Close:            true,
-			ContentLength:    256,
-		},
-
-		"",
-	},
-}
-
-func TestReadResponse(t *testing.T) {
-	for i, tt := range respTests {
-		resp, err := ReadResponse(bufio.NewReader(strings.NewReader(tt.Raw)), tt.Resp.Request)
-		if err != nil {
-			t.Errorf("#%d: %v", i, err)
-			continue
-		}
-		rbody := resp.Body
-		resp.Body = nil
-		diff(t, fmt.Sprintf("#%d Response", i), resp, &tt.Resp)
-		var bout bytes.Buffer
-		if rbody != nil {
-			_, err = io.Copy(&bout, rbody)
-			if err != nil {
-				t.Errorf("#%d: %v", i, err)
-				continue
-			}
-			rbody.Close()
-		}
-		body := bout.String()
-		if body != tt.Body {
-			t.Errorf("#%d: Body = %q want %q", i, body, tt.Body)
-		}
-	}
-}
-
-func TestWriteResponse(t *testing.T) {
-	for i, tt := range respTests {
-		resp, err := ReadResponse(bufio.NewReader(strings.NewReader(tt.Raw)), tt.Resp.Request)
-		if err != nil {
-			t.Errorf("#%d: %v", i, err)
-			continue
-		}
-		err = resp.Write(ioutil.Discard)
-		if err != nil {
-			t.Errorf("#%d: %v", i, err)
-			continue
-		}
-	}
-}
-
-var readResponseCloseInMiddleTests = []struct {
-	chunked, compressed bool
-}{
-	{false, false},
-	{true, false},
-	{true, true},
-}
-
-// TestReadResponseCloseInMiddle tests that closing a body after
-// reading only part of its contents advances the read to the end of
-// the request, right up until the next request.
-func TestReadResponseCloseInMiddle(t *testing.T) {
-	for _, test := range readResponseCloseInMiddleTests {
-		fatalf := func(format string, args ...interface{}) {
-			args = append([]interface{}{test.chunked, test.compressed}, args...)
-			t.Fatalf("on test chunked=%v, compressed=%v: "+format, args...)
-		}
-		checkErr := func(err error, msg string) {
-			if err == nil {
-				return
-			}
-			fatalf(msg+": %v", err)
-		}
-		var buf bytes.Buffer
-		buf.WriteString("HTTP/1.1 200 OK\r\n")
-		if test.chunked {
-			buf.WriteString("Transfer-Encoding: chunked\r\n")
-		} else {
-			buf.WriteString("Content-Length: 1000000\r\n")
-		}
-		var wr io.Writer = &buf
-		if test.chunked {
-			wr = internal.NewChunkedWriter(wr)
-		}
-		if test.compressed {
-			buf.WriteString("Content-Encoding: gzip\r\n")
-			wr = gzip.NewWriter(wr)
-		}
-		buf.WriteString("\r\n")
-
-		chunk := bytes.Repeat([]byte{'x'}, 1000)
-		for i := 0; i < 1000; i++ {
-			if test.compressed {
-				// Otherwise this compresses too well.
-				_, err := io.ReadFull(rand.Reader, chunk)
-				checkErr(err, "rand.Reader ReadFull")
-			}
-			wr.Write(chunk)
-		}
-		if test.compressed {
-			err := wr.(*gzip.Writer).Close()
-			checkErr(err, "compressor close")
-		}
-		if test.chunked {
-			buf.WriteString("0\r\n\r\n")
-		}
-		buf.WriteString("Next Request Here")
-
-		bufr := bufio.NewReader(&buf)
-		resp, err := ReadResponse(bufr, dummyReq("GET"))
-		checkErr(err, "ReadResponse")
-		expectedLength := int64(-1)
-		if !test.chunked {
-			expectedLength = 1000000
-		}
-		if resp.ContentLength != expectedLength {
-			fatalf("expected response length %d, got %d", expectedLength, resp.ContentLength)
-		}
-		if resp.Body == nil {
-			fatalf("nil body")
-		}
-		if test.compressed {
-			gzReader, err := gzip.NewReader(resp.Body)
-			checkErr(err, "gzip.NewReader")
-			resp.Body = &readerAndCloser{gzReader, resp.Body}
-		}
-
-		rbuf := make([]byte, 2500)
-		n, err := io.ReadFull(resp.Body, rbuf)
-		checkErr(err, "2500 byte ReadFull")
-		if n != 2500 {
-			fatalf("ReadFull only read %d bytes", n)
-		}
-		if test.compressed == false && !bytes.Equal(bytes.Repeat([]byte{'x'}, 2500), rbuf) {
-			fatalf("ReadFull didn't read 2500 'x'; got %q", string(rbuf))
-		}
-		resp.Body.Close()
-
-		rest, err := ioutil.ReadAll(bufr)
-		checkErr(err, "ReadAll on remainder")
-		if e, g := "Next Request Here", string(rest); e != g {
-			g = regexp.MustCompile(`(xx+)`).ReplaceAllStringFunc(g, func(match string) string {
-				return fmt.Sprintf("x(repeated x%d)", len(match))
-			})
-			fatalf("remainder = %q, expected %q", g, e)
-		}
-	}
-}
-
-func diff(t *testing.T, prefix string, have, want interface{}) {
-	hv := reflect.ValueOf(have).Elem()
-	wv := reflect.ValueOf(want).Elem()
-	if hv.Type() != wv.Type() {
-		t.Errorf("%s: type mismatch %v want %v", prefix, hv.Type(), wv.Type())
-	}
-	for i := 0; i < hv.NumField(); i++ {
-		hf := hv.Field(i).Interface()
-		wf := wv.Field(i).Interface()
-		if !reflect.DeepEqual(hf, wf) {
-			t.Errorf("%s: %s = %v want %v", prefix, hv.Type().Field(i).Name, hf, wf)
-		}
-	}
-}
-
-type responseLocationTest struct {
-	location string // Response's Location header or ""
-	requrl   string // Response.Request.URL or ""
-	want     string
-	wantErr  error
-}
-
-var responseLocationTests = []responseLocationTest{
-	{"/foo", "http://bar.com/baz", "http://bar.com/foo", nil},
-	{"http://foo.com/", "http://bar.com/baz", "http://foo.com/", nil},
-	{"", "http://bar.com/baz", "", ErrNoLocation},
-}
-
-func TestLocationResponse(t *testing.T) {
-	for i, tt := range responseLocationTests {
-		res := new(Response)
-		res.Header = make(Header)
-		res.Header.Set("Location", tt.location)
-		if tt.requrl != "" {
-			res.Request = &Request{}
-			var err error
-			res.Request.URL, err = url.Parse(tt.requrl)
-			if err != nil {
-				t.Fatalf("bad test URL %q: %v", tt.requrl, err)
-			}
-		}
-
-		got, err := res.Location()
-		if tt.wantErr != nil {
-			if err == nil {
-				t.Errorf("%d. err=nil; want %q", i, tt.wantErr)
-				continue
-			}
-			if g, e := err.Error(), tt.wantErr.Error(); g != e {
-				t.Errorf("%d. err=%q; want %q", i, g, e)
-				continue
-			}
-			continue
-		}
-		if err != nil {
-			t.Errorf("%d. err=%q", i, err)
-			continue
-		}
-		if g, e := got.String(), tt.want; g != e {
-			t.Errorf("%d. Location=%q; want %q", i, g, e)
-		}
-	}
-}
-
-func TestResponseStatusStutter(t *testing.T) {
-	r := &Response{
-		Status:     "123 some status",
-		StatusCode: 123,
-		ProtoMajor: 1,
-		ProtoMinor: 3,
-	}
-	var buf bytes.Buffer
-	r.Write(&buf)
-	if strings.Contains(buf.String(), "123 123") {
-		t.Errorf("stutter in status: %s", buf.String())
-	}
-}
-
-func TestResponseContentLengthShortBody(t *testing.T) {
-	const shortBody = "Short body, not 123 bytes."
-	br := bufio.NewReader(strings.NewReader("HTTP/1.1 200 OK\r\n" +
-		"Content-Length: 123\r\n" +
-		"\r\n" +
-		shortBody))
-	res, err := ReadResponse(br, &Request{Method: "GET"})
-	if err != nil {
-		t.Fatal(err)
-	}
-	if res.ContentLength != 123 {
-		t.Fatalf("Content-Length = %d; want 123", res.ContentLength)
-	}
-	var buf bytes.Buffer
-	n, err := io.Copy(&buf, res.Body)
-	if n != int64(len(shortBody)) {
-		t.Errorf("Copied %d bytes; want %d, len(%q)", n, len(shortBody), shortBody)
-	}
-	if buf.String() != shortBody {
-		t.Errorf("Read body %q; want %q", buf.String(), shortBody)
-	}
-	if err != io.ErrUnexpectedEOF {
-		t.Errorf("io.Copy error = %#v; want io.ErrUnexpectedEOF", err)
-	}
-}
-
-func TestReadResponseUnexpectedEOF(t *testing.T) {
-	br := bufio.NewReader(strings.NewReader("HTTP/1.1 301 Moved Permanently\r\n" +
-		"Location: http://example.com"))
-	_, err := ReadResponse(br, nil)
-	if err != io.ErrUnexpectedEOF {
-		t.Errorf("ReadResponse = %v; want io.ErrUnexpectedEOF", err)
-	}
-}
-
-func TestNeedsSniff(t *testing.T) {
-	// needsSniff returns true with an empty response.
-	r := &response{}
-	if got, want := r.needsSniff(), true; got != want {
-		t.Errorf("needsSniff = %t; want %t", got, want)
-	}
-	// needsSniff returns false when Content-Type = nil.
-	r.handlerHeader = Header{"Content-Type": nil}
-	if got, want := r.needsSniff(), false; got != want {
-		t.Errorf("needsSniff empty Content-Type = %t; want %t", got, want)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/responsewrite_test.go b/third_party/gofrontend/libgo/go/net/http/responsewrite_test.go
deleted file mode 100644
index 5b8d47a..0000000
--- a/third_party/gofrontend/libgo/go/net/http/responsewrite_test.go
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"bytes"
-	"io/ioutil"
-	"strings"
-	"testing"
-)
-
-type respWriteTest struct {
-	Resp Response
-	Raw  string
-}
-
-func TestResponseWrite(t *testing.T) {
-	respWriteTests := []respWriteTest{
-		// HTTP/1.0, identity coding; no trailer
-		{
-			Response{
-				StatusCode:    503,
-				ProtoMajor:    1,
-				ProtoMinor:    0,
-				Request:       dummyReq("GET"),
-				Header:        Header{},
-				Body:          ioutil.NopCloser(strings.NewReader("abcdef")),
-				ContentLength: 6,
-			},
-
-			"HTTP/1.0 503 Service Unavailable\r\n" +
-				"Content-Length: 6\r\n\r\n" +
-				"abcdef",
-		},
-		// Unchunked response without Content-Length.
-		{
-			Response{
-				StatusCode:    200,
-				ProtoMajor:    1,
-				ProtoMinor:    0,
-				Request:       dummyReq("GET"),
-				Header:        Header{},
-				Body:          ioutil.NopCloser(strings.NewReader("abcdef")),
-				ContentLength: -1,
-			},
-			"HTTP/1.0 200 OK\r\n" +
-				"\r\n" +
-				"abcdef",
-		},
-		// HTTP/1.1 response with unknown length and Connection: close
-		{
-			Response{
-				StatusCode:    200,
-				ProtoMajor:    1,
-				ProtoMinor:    1,
-				Request:       dummyReq("GET"),
-				Header:        Header{},
-				Body:          ioutil.NopCloser(strings.NewReader("abcdef")),
-				ContentLength: -1,
-				Close:         true,
-			},
-			"HTTP/1.1 200 OK\r\n" +
-				"Connection: close\r\n" +
-				"\r\n" +
-				"abcdef",
-		},
-		// HTTP/1.1 response with unknown length and not setting connection: close
-		{
-			Response{
-				StatusCode:    200,
-				ProtoMajor:    1,
-				ProtoMinor:    1,
-				Request:       dummyReq11("GET"),
-				Header:        Header{},
-				Body:          ioutil.NopCloser(strings.NewReader("abcdef")),
-				ContentLength: -1,
-				Close:         false,
-			},
-			"HTTP/1.1 200 OK\r\n" +
-				"Connection: close\r\n" +
-				"\r\n" +
-				"abcdef",
-		},
-		// HTTP/1.1 response with unknown length and not setting connection: close, but
-		// setting chunked.
-		{
-			Response{
-				StatusCode:       200,
-				ProtoMajor:       1,
-				ProtoMinor:       1,
-				Request:          dummyReq11("GET"),
-				Header:           Header{},
-				Body:             ioutil.NopCloser(strings.NewReader("abcdef")),
-				ContentLength:    -1,
-				TransferEncoding: []string{"chunked"},
-				Close:            false,
-			},
-			"HTTP/1.1 200 OK\r\n" +
-				"Transfer-Encoding: chunked\r\n\r\n" +
-				"6\r\nabcdef\r\n0\r\n\r\n",
-		},
-		// HTTP/1.1 response 0 content-length, and nil body
-		{
-			Response{
-				StatusCode:    200,
-				ProtoMajor:    1,
-				ProtoMinor:    1,
-				Request:       dummyReq11("GET"),
-				Header:        Header{},
-				Body:          nil,
-				ContentLength: 0,
-				Close:         false,
-			},
-			"HTTP/1.1 200 OK\r\n" +
-				"Content-Length: 0\r\n" +
-				"\r\n",
-		},
-		// HTTP/1.1 response 0 content-length, and non-nil empty body
-		{
-			Response{
-				StatusCode:    200,
-				ProtoMajor:    1,
-				ProtoMinor:    1,
-				Request:       dummyReq11("GET"),
-				Header:        Header{},
-				Body:          ioutil.NopCloser(strings.NewReader("")),
-				ContentLength: 0,
-				Close:         false,
-			},
-			"HTTP/1.1 200 OK\r\n" +
-				"Content-Length: 0\r\n" +
-				"\r\n",
-		},
-		// HTTP/1.1 response 0 content-length, and non-nil non-empty body
-		{
-			Response{
-				StatusCode:    200,
-				ProtoMajor:    1,
-				ProtoMinor:    1,
-				Request:       dummyReq11("GET"),
-				Header:        Header{},
-				Body:          ioutil.NopCloser(strings.NewReader("foo")),
-				ContentLength: 0,
-				Close:         false,
-			},
-			"HTTP/1.1 200 OK\r\n" +
-				"Connection: close\r\n" +
-				"\r\nfoo",
-		},
-		// HTTP/1.1, chunked coding; empty trailer; close
-		{
-			Response{
-				StatusCode:       200,
-				ProtoMajor:       1,
-				ProtoMinor:       1,
-				Request:          dummyReq("GET"),
-				Header:           Header{},
-				Body:             ioutil.NopCloser(strings.NewReader("abcdef")),
-				ContentLength:    6,
-				TransferEncoding: []string{"chunked"},
-				Close:            true,
-			},
-
-			"HTTP/1.1 200 OK\r\n" +
-				"Connection: close\r\n" +
-				"Transfer-Encoding: chunked\r\n\r\n" +
-				"6\r\nabcdef\r\n0\r\n\r\n",
-		},
-
-		// Header value with a newline character (Issue 914).
-		// Also tests removal of leading and trailing whitespace.
-		{
-			Response{
-				StatusCode: 204,
-				ProtoMajor: 1,
-				ProtoMinor: 1,
-				Request:    dummyReq("GET"),
-				Header: Header{
-					"Foo": []string{" Bar\nBaz "},
-				},
-				Body:             nil,
-				ContentLength:    0,
-				TransferEncoding: []string{"chunked"},
-				Close:            true,
-			},
-
-			"HTTP/1.1 204 No Content\r\n" +
-				"Connection: close\r\n" +
-				"Foo: Bar Baz\r\n" +
-				"\r\n",
-		},
-
-		// Want a single Content-Length header. Fixing issue 8180 where
-		// there were two.
-		{
-			Response{
-				StatusCode:       StatusOK,
-				ProtoMajor:       1,
-				ProtoMinor:       1,
-				Request:          &Request{Method: "POST"},
-				Header:           Header{},
-				ContentLength:    0,
-				TransferEncoding: nil,
-				Body:             nil,
-			},
-			"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n",
-		},
-
-		// When a response to a POST has Content-Length: -1, make sure we don't
-		// write the Content-Length as -1.
-		{
-			Response{
-				StatusCode:    StatusOK,
-				ProtoMajor:    1,
-				ProtoMinor:    1,
-				Request:       &Request{Method: "POST"},
-				Header:        Header{},
-				ContentLength: -1,
-				Body:          ioutil.NopCloser(strings.NewReader("abcdef")),
-			},
-			"HTTP/1.1 200 OK\r\nConnection: close\r\n\r\nabcdef",
-		},
-	}
-
-	for i := range respWriteTests {
-		tt := &respWriteTests[i]
-		var braw bytes.Buffer
-		err := tt.Resp.Write(&braw)
-		if err != nil {
-			t.Errorf("error writing #%d: %s", i, err)
-			continue
-		}
-		sraw := braw.String()
-		if sraw != tt.Raw {
-			t.Errorf("Test %d, expecting:\n%q\nGot:\n%q\n", i, tt.Raw, sraw)
-			continue
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/serve_test.go b/third_party/gofrontend/libgo/go/net/http/serve_test.go
deleted file mode 100644
index d51417e..0000000
--- a/third_party/gofrontend/libgo/go/net/http/serve_test.go
+++ /dev/null
@@ -1,3687 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// End-to-end serving tests
-
-package http_test
-
-import (
-	"bufio"
-	"bytes"
-	"crypto/tls"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	"math/rand"
-	"net"
-	. "net/http"
-	"net/http/httptest"
-	"net/http/httputil"
-	"net/http/internal"
-	"net/url"
-	"os"
-	"os/exec"
-	"reflect"
-	"runtime"
-	"strconv"
-	"strings"
-	"sync"
-	"sync/atomic"
-	"syscall"
-	"testing"
-	"time"
-)
-
-type dummyAddr string
-type oneConnListener struct {
-	conn net.Conn
-}
-
-func (l *oneConnListener) Accept() (c net.Conn, err error) {
-	c = l.conn
-	if c == nil {
-		err = io.EOF
-		return
-	}
-	err = nil
-	l.conn = nil
-	return
-}
-
-func (l *oneConnListener) Close() error {
-	return nil
-}
-
-func (l *oneConnListener) Addr() net.Addr {
-	return dummyAddr("test-address")
-}
-
-func (a dummyAddr) Network() string {
-	return string(a)
-}
-
-func (a dummyAddr) String() string {
-	return string(a)
-}
-
-type noopConn struct{}
-
-func (noopConn) LocalAddr() net.Addr                { return dummyAddr("local-addr") }
-func (noopConn) RemoteAddr() net.Addr               { return dummyAddr("remote-addr") }
-func (noopConn) SetDeadline(t time.Time) error      { return nil }
-func (noopConn) SetReadDeadline(t time.Time) error  { return nil }
-func (noopConn) SetWriteDeadline(t time.Time) error { return nil }
-
-type rwTestConn struct {
-	io.Reader
-	io.Writer
-	noopConn
-
-	closeFunc func() error // called if non-nil
-	closec    chan bool    // else, if non-nil, send value to it on close
-}
-
-func (c *rwTestConn) Close() error {
-	if c.closeFunc != nil {
-		return c.closeFunc()
-	}
-	select {
-	case c.closec <- true:
-	default:
-	}
-	return nil
-}
-
-type testConn struct {
-	readBuf  bytes.Buffer
-	writeBuf bytes.Buffer
-	closec   chan bool // if non-nil, send value to it on close
-	noopConn
-}
-
-func (c *testConn) Read(b []byte) (int, error) {
-	return c.readBuf.Read(b)
-}
-
-func (c *testConn) Write(b []byte) (int, error) {
-	return c.writeBuf.Write(b)
-}
-
-func (c *testConn) Close() error {
-	select {
-	case c.closec <- true:
-	default:
-	}
-	return nil
-}
-
-// reqBytes treats req as a request (with \n delimiters) and returns it with \r\n delimiters,
-// ending in \r\n\r\n
-func reqBytes(req string) []byte {
-	return []byte(strings.Replace(strings.TrimSpace(req), "\n", "\r\n", -1) + "\r\n\r\n")
-}
-
-type handlerTest struct {
-	handler Handler
-}
-
-func newHandlerTest(h Handler) handlerTest {
-	return handlerTest{h}
-}
-
-func (ht handlerTest) rawResponse(req string) string {
-	reqb := reqBytes(req)
-	var output bytes.Buffer
-	conn := &rwTestConn{
-		Reader: bytes.NewReader(reqb),
-		Writer: &output,
-		closec: make(chan bool, 1),
-	}
-	ln := &oneConnListener{conn: conn}
-	go Serve(ln, ht.handler)
-	<-conn.closec
-	return output.String()
-}
-
-func TestConsumingBodyOnNextConn(t *testing.T) {
-	defer afterTest(t)
-	conn := new(testConn)
-	for i := 0; i < 2; i++ {
-		conn.readBuf.Write([]byte(
-			"POST / HTTP/1.1\r\n" +
-				"Host: test\r\n" +
-				"Content-Length: 11\r\n" +
-				"\r\n" +
-				"foo=1&bar=1"))
-	}
-
-	reqNum := 0
-	ch := make(chan *Request)
-	servech := make(chan error)
-	listener := &oneConnListener{conn}
-	handler := func(res ResponseWriter, req *Request) {
-		reqNum++
-		ch <- req
-	}
-
-	go func() {
-		servech <- Serve(listener, HandlerFunc(handler))
-	}()
-
-	var req *Request
-	req = <-ch
-	if req == nil {
-		t.Fatal("Got nil first request.")
-	}
-	if req.Method != "POST" {
-		t.Errorf("For request #1's method, got %q; expected %q",
-			req.Method, "POST")
-	}
-
-	req = <-ch
-	if req == nil {
-		t.Fatal("Got nil first request.")
-	}
-	if req.Method != "POST" {
-		t.Errorf("For request #2's method, got %q; expected %q",
-			req.Method, "POST")
-	}
-
-	if serveerr := <-servech; serveerr != io.EOF {
-		t.Errorf("Serve returned %q; expected EOF", serveerr)
-	}
-}
-
-type stringHandler string
-
-func (s stringHandler) ServeHTTP(w ResponseWriter, r *Request) {
-	w.Header().Set("Result", string(s))
-}
-
-var handlers = []struct {
-	pattern string
-	msg     string
-}{
-	{"/", "Default"},
-	{"/someDir/", "someDir"},
-	{"/#/", "hash"},
-	{"someHost.com/someDir/", "someHost.com/someDir"},
-}
-
-var vtests = []struct {
-	url      string
-	expected string
-}{
-	{"http://localhost/someDir/apage", "someDir"},
-	{"http://localhost/%23/apage", "hash"},
-	{"http://localhost/otherDir/apage", "Default"},
-	{"http://someHost.com/someDir/apage", "someHost.com/someDir"},
-	{"http://otherHost.com/someDir/apage", "someDir"},
-	{"http://otherHost.com/aDir/apage", "Default"},
-	// redirections for trees
-	{"http://localhost/someDir", "/someDir/"},
-	{"http://localhost/%23", "/%23/"},
-	{"http://someHost.com/someDir", "/someDir/"},
-}
-
-func TestHostHandlers(t *testing.T) {
-	defer afterTest(t)
-	mux := NewServeMux()
-	for _, h := range handlers {
-		mux.Handle(h.pattern, stringHandler(h.msg))
-	}
-	ts := httptest.NewServer(mux)
-	defer ts.Close()
-
-	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer conn.Close()
-	cc := httputil.NewClientConn(conn, nil)
-	for _, vt := range vtests {
-		var r *Response
-		var req Request
-		if req.URL, err = url.Parse(vt.url); err != nil {
-			t.Errorf("cannot parse url: %v", err)
-			continue
-		}
-		if err := cc.Write(&req); err != nil {
-			t.Errorf("writing request: %v", err)
-			continue
-		}
-		r, err := cc.Read(&req)
-		if err != nil {
-			t.Errorf("reading response: %v", err)
-			continue
-		}
-		switch r.StatusCode {
-		case StatusOK:
-			s := r.Header.Get("Result")
-			if s != vt.expected {
-				t.Errorf("Get(%q) = %q, want %q", vt.url, s, vt.expected)
-			}
-		case StatusMovedPermanently:
-			s := r.Header.Get("Location")
-			if s != vt.expected {
-				t.Errorf("Get(%q) = %q, want %q", vt.url, s, vt.expected)
-			}
-		default:
-			t.Errorf("Get(%q) unhandled status code %d", vt.url, r.StatusCode)
-		}
-	}
-}
-
-var serveMuxRegister = []struct {
-	pattern string
-	h       Handler
-}{
-	{"/dir/", serve(200)},
-	{"/search", serve(201)},
-	{"codesearch.google.com/search", serve(202)},
-	{"codesearch.google.com/", serve(203)},
-	{"example.com/", HandlerFunc(checkQueryStringHandler)},
-}
-
-// serve returns a handler that sends a response with the given code.
-func serve(code int) HandlerFunc {
-	return func(w ResponseWriter, r *Request) {
-		w.WriteHeader(code)
-	}
-}
-
-// checkQueryStringHandler checks if r.URL.RawQuery has the same value
-// as the URL excluding the scheme and the query string and sends 200
-// response code if it is, 500 otherwise.
-func checkQueryStringHandler(w ResponseWriter, r *Request) {
-	u := *r.URL
-	u.Scheme = "http"
-	u.Host = r.Host
-	u.RawQuery = ""
-	if "http://"+r.URL.RawQuery == u.String() {
-		w.WriteHeader(200)
-	} else {
-		w.WriteHeader(500)
-	}
-}
-
-var serveMuxTests = []struct {
-	method  string
-	host    string
-	path    string
-	code    int
-	pattern string
-}{
-	{"GET", "google.com", "/", 404, ""},
-	{"GET", "google.com", "/dir", 301, "/dir/"},
-	{"GET", "google.com", "/dir/", 200, "/dir/"},
-	{"GET", "google.com", "/dir/file", 200, "/dir/"},
-	{"GET", "google.com", "/search", 201, "/search"},
-	{"GET", "google.com", "/search/", 404, ""},
-	{"GET", "google.com", "/search/foo", 404, ""},
-	{"GET", "codesearch.google.com", "/search", 202, "codesearch.google.com/search"},
-	{"GET", "codesearch.google.com", "/search/", 203, "codesearch.google.com/"},
-	{"GET", "codesearch.google.com", "/search/foo", 203, "codesearch.google.com/"},
-	{"GET", "codesearch.google.com", "/", 203, "codesearch.google.com/"},
-	{"GET", "images.google.com", "/search", 201, "/search"},
-	{"GET", "images.google.com", "/search/", 404, ""},
-	{"GET", "images.google.com", "/search/foo", 404, ""},
-	{"GET", "google.com", "/../search", 301, "/search"},
-	{"GET", "google.com", "/dir/..", 301, ""},
-	{"GET", "google.com", "/dir/..", 301, ""},
-	{"GET", "google.com", "/dir/./file", 301, "/dir/"},
-
-	// The /foo -> /foo/ redirect applies to CONNECT requests
-	// but the path canonicalization does not.
-	{"CONNECT", "google.com", "/dir", 301, "/dir/"},
-	{"CONNECT", "google.com", "/../search", 404, ""},
-	{"CONNECT", "google.com", "/dir/..", 200, "/dir/"},
-	{"CONNECT", "google.com", "/dir/..", 200, "/dir/"},
-	{"CONNECT", "google.com", "/dir/./file", 200, "/dir/"},
-}
-
-func TestServeMuxHandler(t *testing.T) {
-	mux := NewServeMux()
-	for _, e := range serveMuxRegister {
-		mux.Handle(e.pattern, e.h)
-	}
-
-	for _, tt := range serveMuxTests {
-		r := &Request{
-			Method: tt.method,
-			Host:   tt.host,
-			URL: &url.URL{
-				Path: tt.path,
-			},
-		}
-		h, pattern := mux.Handler(r)
-		rr := httptest.NewRecorder()
-		h.ServeHTTP(rr, r)
-		if pattern != tt.pattern || rr.Code != tt.code {
-			t.Errorf("%s %s %s = %d, %q, want %d, %q", tt.method, tt.host, tt.path, rr.Code, pattern, tt.code, tt.pattern)
-		}
-	}
-}
-
-var serveMuxTests2 = []struct {
-	method  string
-	host    string
-	url     string
-	code    int
-	redirOk bool
-}{
-	{"GET", "google.com", "/", 404, false},
-	{"GET", "example.com", "/test/?example.com/test/", 200, false},
-	{"GET", "example.com", "test/?example.com/test/", 200, true},
-}
-
-// TestServeMuxHandlerRedirects tests that automatic redirects generated by
-// mux.Handler() shouldn't clear the request's query string.
-func TestServeMuxHandlerRedirects(t *testing.T) {
-	mux := NewServeMux()
-	for _, e := range serveMuxRegister {
-		mux.Handle(e.pattern, e.h)
-	}
-
-	for _, tt := range serveMuxTests2 {
-		tries := 1
-		turl := tt.url
-		for tries > 0 {
-			u, e := url.Parse(turl)
-			if e != nil {
-				t.Fatal(e)
-			}
-			r := &Request{
-				Method: tt.method,
-				Host:   tt.host,
-				URL:    u,
-			}
-			h, _ := mux.Handler(r)
-			rr := httptest.NewRecorder()
-			h.ServeHTTP(rr, r)
-			if rr.Code != 301 {
-				if rr.Code != tt.code {
-					t.Errorf("%s %s %s = %d, want %d", tt.method, tt.host, tt.url, rr.Code, tt.code)
-				}
-				break
-			}
-			if !tt.redirOk {
-				t.Errorf("%s %s %s, unexpected redirect", tt.method, tt.host, tt.url)
-				break
-			}
-			turl = rr.HeaderMap.Get("Location")
-			tries--
-		}
-		if tries < 0 {
-			t.Errorf("%s %s %s, too many redirects", tt.method, tt.host, tt.url)
-		}
-	}
-}
-
-// Tests for https://golang.org/issue/900
-func TestMuxRedirectLeadingSlashes(t *testing.T) {
-	paths := []string{"//foo.txt", "///foo.txt", "/../../foo.txt"}
-	for _, path := range paths {
-		req, err := ReadRequest(bufio.NewReader(strings.NewReader("GET " + path + " HTTP/1.1\r\nHost: test\r\n\r\n")))
-		if err != nil {
-			t.Errorf("%s", err)
-		}
-		mux := NewServeMux()
-		resp := httptest.NewRecorder()
-
-		mux.ServeHTTP(resp, req)
-
-		if loc, expected := resp.Header().Get("Location"), "/foo.txt"; loc != expected {
-			t.Errorf("Expected Location header set to %q; got %q", expected, loc)
-			return
-		}
-
-		if code, expected := resp.Code, StatusMovedPermanently; code != expected {
-			t.Errorf("Expected response code of StatusMovedPermanently; got %d", code)
-			return
-		}
-	}
-}
-
-func TestServerTimeouts(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping test; see https://golang.org/issue/7237")
-	}
-	defer afterTest(t)
-	reqNum := 0
-	ts := httptest.NewUnstartedServer(HandlerFunc(func(res ResponseWriter, req *Request) {
-		reqNum++
-		fmt.Fprintf(res, "req=%d", reqNum)
-	}))
-	ts.Config.ReadTimeout = 250 * time.Millisecond
-	ts.Config.WriteTimeout = 250 * time.Millisecond
-	ts.Start()
-	defer ts.Close()
-
-	// Hit the HTTP server successfully.
-	tr := &Transport{DisableKeepAlives: true} // they interfere with this test
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
-	r, err := c.Get(ts.URL)
-	if err != nil {
-		t.Fatalf("http Get #1: %v", err)
-	}
-	got, _ := ioutil.ReadAll(r.Body)
-	expected := "req=1"
-	if string(got) != expected {
-		t.Errorf("Unexpected response for request #1; got %q; expected %q",
-			string(got), expected)
-	}
-
-	// Slow client that should timeout.
-	t1 := time.Now()
-	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
-	if err != nil {
-		t.Fatalf("Dial: %v", err)
-	}
-	buf := make([]byte, 1)
-	n, err := conn.Read(buf)
-	latency := time.Since(t1)
-	if n != 0 || err != io.EOF {
-		t.Errorf("Read = %v, %v, wanted %v, %v", n, err, 0, io.EOF)
-	}
-	if latency < 200*time.Millisecond /* fudge from 250 ms above */ {
-		t.Errorf("got EOF after %s, want >= %s", latency, 200*time.Millisecond)
-	}
-
-	// Hit the HTTP server successfully again, verifying that the
-	// previous slow connection didn't run our handler.  (that we
-	// get "req=2", not "req=3")
-	r, err = Get(ts.URL)
-	if err != nil {
-		t.Fatalf("http Get #2: %v", err)
-	}
-	got, _ = ioutil.ReadAll(r.Body)
-	expected = "req=2"
-	if string(got) != expected {
-		t.Errorf("Get #2 got %q, want %q", string(got), expected)
-	}
-
-	if !testing.Short() {
-		conn, err := net.Dial("tcp", ts.Listener.Addr().String())
-		if err != nil {
-			t.Fatalf("Dial: %v", err)
-		}
-		defer conn.Close()
-		go io.Copy(ioutil.Discard, conn)
-		for i := 0; i < 5; i++ {
-			_, err := conn.Write([]byte("GET / HTTP/1.1\r\nHost: foo\r\n\r\n"))
-			if err != nil {
-				t.Fatalf("on write %d: %v", i, err)
-			}
-			time.Sleep(ts.Config.ReadTimeout / 2)
-		}
-	}
-}
-
-// golang.org/issue/4741 -- setting only a write timeout that triggers
-// shouldn't cause a handler to block forever on reads (next HTTP
-// request) that will never happen.
-func TestOnlyWriteTimeout(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping test; see https://golang.org/issue/7237")
-	}
-	defer afterTest(t)
-	var conn net.Conn
-	var afterTimeoutErrc = make(chan error, 1)
-	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, req *Request) {
-		buf := make([]byte, 512<<10)
-		_, err := w.Write(buf)
-		if err != nil {
-			t.Errorf("handler Write error: %v", err)
-			return
-		}
-		conn.SetWriteDeadline(time.Now().Add(-30 * time.Second))
-		_, err = w.Write(buf)
-		afterTimeoutErrc <- err
-	}))
-	ts.Listener = trackLastConnListener{ts.Listener, &conn}
-	ts.Start()
-	defer ts.Close()
-
-	tr := &Transport{DisableKeepAlives: false}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
-
-	errc := make(chan error)
-	go func() {
-		res, err := c.Get(ts.URL)
-		if err != nil {
-			errc <- err
-			return
-		}
-		_, err = io.Copy(ioutil.Discard, res.Body)
-		errc <- err
-	}()
-	select {
-	case err := <-errc:
-		if err == nil {
-			t.Errorf("expected an error from Get request")
-		}
-	case <-time.After(5 * time.Second):
-		t.Fatal("timeout waiting for Get error")
-	}
-	if err := <-afterTimeoutErrc; err == nil {
-		t.Error("expected write error after timeout")
-	}
-}
-
-// trackLastConnListener tracks the last net.Conn that was accepted.
-type trackLastConnListener struct {
-	net.Listener
-	last *net.Conn // destination
-}
-
-func (l trackLastConnListener) Accept() (c net.Conn, err error) {
-	c, err = l.Listener.Accept()
-	*l.last = c
-	return
-}
-
-// TestIdentityResponse verifies that a handler can unset
-func TestIdentityResponse(t *testing.T) {
-	defer afterTest(t)
-	handler := HandlerFunc(func(rw ResponseWriter, req *Request) {
-		rw.Header().Set("Content-Length", "3")
-		rw.Header().Set("Transfer-Encoding", req.FormValue("te"))
-		switch {
-		case req.FormValue("overwrite") == "1":
-			_, err := rw.Write([]byte("foo TOO LONG"))
-			if err != ErrContentLength {
-				t.Errorf("expected ErrContentLength; got %v", err)
-			}
-		case req.FormValue("underwrite") == "1":
-			rw.Header().Set("Content-Length", "500")
-			rw.Write([]byte("too short"))
-		default:
-			rw.Write([]byte("foo"))
-		}
-	})
-
-	ts := httptest.NewServer(handler)
-	defer ts.Close()
-
-	// Note: this relies on the assumption (which is true) that
-	// Get sends HTTP/1.1 or greater requests.  Otherwise the
-	// server wouldn't have the choice to send back chunked
-	// responses.
-	for _, te := range []string{"", "identity"} {
-		url := ts.URL + "/?te=" + te
-		res, err := Get(url)
-		if err != nil {
-			t.Fatalf("error with Get of %s: %v", url, err)
-		}
-		if cl, expected := res.ContentLength, int64(3); cl != expected {
-			t.Errorf("for %s expected res.ContentLength of %d; got %d", url, expected, cl)
-		}
-		if cl, expected := res.Header.Get("Content-Length"), "3"; cl != expected {
-			t.Errorf("for %s expected Content-Length header of %q; got %q", url, expected, cl)
-		}
-		if tl, expected := len(res.TransferEncoding), 0; tl != expected {
-			t.Errorf("for %s expected len(res.TransferEncoding) of %d; got %d (%v)",
-				url, expected, tl, res.TransferEncoding)
-		}
-		res.Body.Close()
-	}
-
-	// Verify that ErrContentLength is returned
-	url := ts.URL + "/?overwrite=1"
-	res, err := Get(url)
-	if err != nil {
-		t.Fatalf("error with Get of %s: %v", url, err)
-	}
-	res.Body.Close()
-
-	// Verify that the connection is closed when the declared Content-Length
-	// is larger than what the handler wrote.
-	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
-	if err != nil {
-		t.Fatalf("error dialing: %v", err)
-	}
-	_, err = conn.Write([]byte("GET /?underwrite=1 HTTP/1.1\r\nHost: foo\r\n\r\n"))
-	if err != nil {
-		t.Fatalf("error writing: %v", err)
-	}
-
-	// The ReadAll will hang for a failing test, so use a Timer to
-	// fail explicitly.
-	goTimeout(t, 2*time.Second, func() {
-		got, _ := ioutil.ReadAll(conn)
-		expectedSuffix := "\r\n\r\ntoo short"
-		if !strings.HasSuffix(string(got), expectedSuffix) {
-			t.Errorf("Expected output to end with %q; got response body %q",
-				expectedSuffix, string(got))
-		}
-	})
-}
-
-func testTCPConnectionCloses(t *testing.T, req string, h Handler) {
-	defer afterTest(t)
-	s := httptest.NewServer(h)
-	defer s.Close()
-
-	conn, err := net.Dial("tcp", s.Listener.Addr().String())
-	if err != nil {
-		t.Fatal("dial error:", err)
-	}
-	defer conn.Close()
-
-	_, err = fmt.Fprint(conn, req)
-	if err != nil {
-		t.Fatal("print error:", err)
-	}
-
-	r := bufio.NewReader(conn)
-	res, err := ReadResponse(r, &Request{Method: "GET"})
-	if err != nil {
-		t.Fatal("ReadResponse error:", err)
-	}
-
-	didReadAll := make(chan bool, 1)
-	go func() {
-		select {
-		case <-time.After(5 * time.Second):
-			t.Error("body not closed after 5s")
-			return
-		case <-didReadAll:
-		}
-	}()
-
-	_, err = ioutil.ReadAll(r)
-	if err != nil {
-		t.Fatal("read error:", err)
-	}
-	didReadAll <- true
-
-	if !res.Close {
-		t.Errorf("Response.Close = false; want true")
-	}
-}
-
-// TestServeHTTP10Close verifies that HTTP/1.0 requests won't be kept alive.
-func TestServeHTTP10Close(t *testing.T) {
-	testTCPConnectionCloses(t, "GET / HTTP/1.0\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
-		ServeFile(w, r, "testdata/file")
-	}))
-}
-
-// TestClientCanClose verifies that clients can also force a connection to close.
-func TestClientCanClose(t *testing.T) {
-	testTCPConnectionCloses(t, "GET / HTTP/1.1\r\nConnection: close\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
-		// Nothing.
-	}))
-}
-
-// TestHandlersCanSetConnectionClose verifies that handlers can force a connection to close,
-// even for HTTP/1.1 requests.
-func TestHandlersCanSetConnectionClose11(t *testing.T) {
-	testTCPConnectionCloses(t, "GET / HTTP/1.1\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Connection", "close")
-	}))
-}
-
-func TestHandlersCanSetConnectionClose10(t *testing.T) {
-	testTCPConnectionCloses(t, "GET / HTTP/1.0\r\nConnection: keep-alive\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Connection", "close")
-	}))
-}
-
-func TestSetsRemoteAddr(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		fmt.Fprintf(w, "%s", r.RemoteAddr)
-	}))
-	defer ts.Close()
-
-	res, err := Get(ts.URL)
-	if err != nil {
-		t.Fatalf("Get error: %v", err)
-	}
-	body, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Fatalf("ReadAll error: %v", err)
-	}
-	ip := string(body)
-	if !strings.HasPrefix(ip, "127.0.0.1:") && !strings.HasPrefix(ip, "[::1]:") {
-		t.Fatalf("Expected local addr; got %q", ip)
-	}
-}
-
-func TestChunkedResponseHeaders(t *testing.T) {
-	defer afterTest(t)
-	log.SetOutput(ioutil.Discard) // is noisy otherwise
-	defer log.SetOutput(os.Stderr)
-
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Content-Length", "intentional gibberish") // we check that this is deleted
-		w.(Flusher).Flush()
-		fmt.Fprintf(w, "I am a chunked response.")
-	}))
-	defer ts.Close()
-
-	res, err := Get(ts.URL)
-	if err != nil {
-		t.Fatalf("Get error: %v", err)
-	}
-	defer res.Body.Close()
-	if g, e := res.ContentLength, int64(-1); g != e {
-		t.Errorf("expected ContentLength of %d; got %d", e, g)
-	}
-	if g, e := res.TransferEncoding, []string{"chunked"}; !reflect.DeepEqual(g, e) {
-		t.Errorf("expected TransferEncoding of %v; got %v", e, g)
-	}
-	if _, haveCL := res.Header["Content-Length"]; haveCL {
-		t.Errorf("Unexpected Content-Length")
-	}
-}
-
-func TestIdentityResponseHeaders(t *testing.T) {
-	defer afterTest(t)
-	log.SetOutput(ioutil.Discard) // is noisy otherwise
-	defer log.SetOutput(os.Stderr)
-
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Transfer-Encoding", "identity")
-		w.(Flusher).Flush()
-		fmt.Fprintf(w, "I am an identity response.")
-	}))
-	defer ts.Close()
-
-	res, err := Get(ts.URL)
-	if err != nil {
-		t.Fatalf("Get error: %v", err)
-	}
-	defer res.Body.Close()
-
-	if g, e := res.TransferEncoding, []string(nil); !reflect.DeepEqual(g, e) {
-		t.Errorf("expected TransferEncoding of %v; got %v", e, g)
-	}
-	if _, haveCL := res.Header["Content-Length"]; haveCL {
-		t.Errorf("Unexpected Content-Length")
-	}
-	if !res.Close {
-		t.Errorf("expected Connection: close; got %v", res.Close)
-	}
-}
-
-// Test304Responses verifies that 304s don't declare that they're
-// chunking in their response headers and aren't allowed to produce
-// output.
-func Test304Responses(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.WriteHeader(StatusNotModified)
-		_, err := w.Write([]byte("illegal body"))
-		if err != ErrBodyNotAllowed {
-			t.Errorf("on Write, expected ErrBodyNotAllowed, got %v", err)
-		}
-	}))
-	defer ts.Close()
-	res, err := Get(ts.URL)
-	if err != nil {
-		t.Error(err)
-	}
-	if len(res.TransferEncoding) > 0 {
-		t.Errorf("expected no TransferEncoding; got %v", res.TransferEncoding)
-	}
-	body, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Error(err)
-	}
-	if len(body) > 0 {
-		t.Errorf("got unexpected body %q", string(body))
-	}
-}
-
-// TestHeadResponses verifies that all MIME type sniffing and Content-Length
-// counting of GET requests also happens on HEAD requests.
-func TestHeadResponses(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		_, err := w.Write([]byte("<html>"))
-		if err != nil {
-			t.Errorf("ResponseWriter.Write: %v", err)
-		}
-
-		// Also exercise the ReaderFrom path
-		_, err = io.Copy(w, strings.NewReader("789a"))
-		if err != nil {
-			t.Errorf("Copy(ResponseWriter, ...): %v", err)
-		}
-	}))
-	defer ts.Close()
-	res, err := Head(ts.URL)
-	if err != nil {
-		t.Error(err)
-	}
-	if len(res.TransferEncoding) > 0 {
-		t.Errorf("expected no TransferEncoding; got %v", res.TransferEncoding)
-	}
-	if ct := res.Header.Get("Content-Type"); ct != "text/html; charset=utf-8" {
-		t.Errorf("Content-Type: %q; want text/html; charset=utf-8", ct)
-	}
-	if v := res.ContentLength; v != 10 {
-		t.Errorf("Content-Length: %d; want 10", v)
-	}
-	body, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Error(err)
-	}
-	if len(body) > 0 {
-		t.Errorf("got unexpected body %q", string(body))
-	}
-}
-
-func TestTLSHandshakeTimeout(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping test; see https://golang.org/issue/7237")
-	}
-	defer afterTest(t)
-	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
-	errc := make(chanWriter, 10) // but only expecting 1
-	ts.Config.ReadTimeout = 250 * time.Millisecond
-	ts.Config.ErrorLog = log.New(errc, "", 0)
-	ts.StartTLS()
-	defer ts.Close()
-	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
-	if err != nil {
-		t.Fatalf("Dial: %v", err)
-	}
-	defer conn.Close()
-	goTimeout(t, 10*time.Second, func() {
-		var buf [1]byte
-		n, err := conn.Read(buf[:])
-		if err == nil || n != 0 {
-			t.Errorf("Read = %d, %v; want an error and no bytes", n, err)
-		}
-	})
-	select {
-	case v := <-errc:
-		if !strings.Contains(v, "timeout") && !strings.Contains(v, "TLS handshake") {
-			t.Errorf("expected a TLS handshake timeout error; got %q", v)
-		}
-	case <-time.After(5 * time.Second):
-		t.Errorf("timeout waiting for logged error")
-	}
-}
-
-func TestTLSServer(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		if r.TLS != nil {
-			w.Header().Set("X-TLS-Set", "true")
-			if r.TLS.HandshakeComplete {
-				w.Header().Set("X-TLS-HandshakeComplete", "true")
-			}
-		}
-	}))
-	ts.Config.ErrorLog = log.New(ioutil.Discard, "", 0)
-	defer ts.Close()
-
-	// Connect an idle TCP connection to this server before we run
-	// our real tests.  This idle connection used to block forever
-	// in the TLS handshake, preventing future connections from
-	// being accepted. It may prevent future accidental blocking
-	// in newConn.
-	idleConn, err := net.Dial("tcp", ts.Listener.Addr().String())
-	if err != nil {
-		t.Fatalf("Dial: %v", err)
-	}
-	defer idleConn.Close()
-	goTimeout(t, 10*time.Second, func() {
-		if !strings.HasPrefix(ts.URL, "https://") {
-			t.Errorf("expected test TLS server to start with https://, got %q", ts.URL)
-			return
-		}
-		noVerifyTransport := &Transport{
-			TLSClientConfig: &tls.Config{
-				InsecureSkipVerify: true,
-			},
-		}
-		client := &Client{Transport: noVerifyTransport}
-		res, err := client.Get(ts.URL)
-		if err != nil {
-			t.Error(err)
-			return
-		}
-		if res == nil {
-			t.Errorf("got nil Response")
-			return
-		}
-		defer res.Body.Close()
-		if res.Header.Get("X-TLS-Set") != "true" {
-			t.Errorf("expected X-TLS-Set response header")
-			return
-		}
-		if res.Header.Get("X-TLS-HandshakeComplete") != "true" {
-			t.Errorf("expected X-TLS-HandshakeComplete header")
-		}
-	})
-}
-
-type serverExpectTest struct {
-	contentLength    int // of request body
-	chunked          bool
-	expectation      string // e.g. "100-continue"
-	readBody         bool   // whether handler should read the body (if false, sends StatusUnauthorized)
-	expectedResponse string // expected substring in first line of http response
-}
-
-func expectTest(contentLength int, expectation string, readBody bool, expectedResponse string) serverExpectTest {
-	return serverExpectTest{
-		contentLength:    contentLength,
-		expectation:      expectation,
-		readBody:         readBody,
-		expectedResponse: expectedResponse,
-	}
-}
-
-var serverExpectTests = []serverExpectTest{
-	// Normal 100-continues, case-insensitive.
-	expectTest(100, "100-continue", true, "100 Continue"),
-	expectTest(100, "100-cOntInUE", true, "100 Continue"),
-
-	// No 100-continue.
-	expectTest(100, "", true, "200 OK"),
-
-	// 100-continue but requesting client to deny us,
-	// so it never reads the body.
-	expectTest(100, "100-continue", false, "401 Unauthorized"),
-	// Likewise without 100-continue:
-	expectTest(100, "", false, "401 Unauthorized"),
-
-	// Non-standard expectations are failures
-	expectTest(0, "a-pony", false, "417 Expectation Failed"),
-
-	// Expect-100 requested but no body (is apparently okay: Issue 7625)
-	expectTest(0, "100-continue", true, "200 OK"),
-	// Expect-100 requested but handler doesn't read the body
-	expectTest(0, "100-continue", false, "401 Unauthorized"),
-	// Expect-100 continue with no body, but a chunked body.
-	{
-		expectation:      "100-continue",
-		readBody:         true,
-		chunked:          true,
-		expectedResponse: "100 Continue",
-	},
-}
-
-// Tests that the server responds to the "Expect" request header
-// correctly.
-func TestServerExpect(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		// Note using r.FormValue("readbody") because for POST
-		// requests that would read from r.Body, which we only
-		// conditionally want to do.
-		if strings.Contains(r.URL.RawQuery, "readbody=true") {
-			ioutil.ReadAll(r.Body)
-			w.Write([]byte("Hi"))
-		} else {
-			w.WriteHeader(StatusUnauthorized)
-		}
-	}))
-	defer ts.Close()
-
-	runTest := func(test serverExpectTest) {
-		conn, err := net.Dial("tcp", ts.Listener.Addr().String())
-		if err != nil {
-			t.Fatalf("Dial: %v", err)
-		}
-		defer conn.Close()
-
-		// Only send the body immediately if we're acting like an HTTP client
-		// that doesn't send 100-continue expectations.
-		writeBody := test.contentLength != 0 && strings.ToLower(test.expectation) != "100-continue"
-
-		go func() {
-			contentLen := fmt.Sprintf("Content-Length: %d", test.contentLength)
-			if test.chunked {
-				contentLen = "Transfer-Encoding: chunked"
-			}
-			_, err := fmt.Fprintf(conn, "POST /?readbody=%v HTTP/1.1\r\n"+
-				"Connection: close\r\n"+
-				"%s\r\n"+
-				"Expect: %s\r\nHost: foo\r\n\r\n",
-				test.readBody, contentLen, test.expectation)
-			if err != nil {
-				t.Errorf("On test %#v, error writing request headers: %v", test, err)
-				return
-			}
-			if writeBody {
-				var targ io.WriteCloser = struct {
-					io.Writer
-					io.Closer
-				}{
-					conn,
-					ioutil.NopCloser(nil),
-				}
-				if test.chunked {
-					targ = httputil.NewChunkedWriter(conn)
-				}
-				body := strings.Repeat("A", test.contentLength)
-				_, err = fmt.Fprint(targ, body)
-				if err == nil {
-					err = targ.Close()
-				}
-				if err != nil {
-					if !test.readBody {
-						// Server likely already hung up on us.
-						// See larger comment below.
-						t.Logf("On test %#v, acceptable error writing request body: %v", test, err)
-						return
-					}
-					t.Errorf("On test %#v, error writing request body: %v", test, err)
-				}
-			}
-		}()
-		bufr := bufio.NewReader(conn)
-		line, err := bufr.ReadString('\n')
-		if err != nil {
-			if writeBody && !test.readBody {
-				// This is an acceptable failure due to a possible TCP race:
-				// We were still writing data and the server hung up on us. A TCP
-				// implementation may send a RST if our request body data was known
-				// to be lost, which may trigger our reads to fail.
-				// See RFC 1122 page 88.
-				t.Logf("On test %#v, acceptable error from ReadString: %v", test, err)
-				return
-			}
-			t.Fatalf("On test %#v, ReadString: %v", test, err)
-		}
-		if !strings.Contains(line, test.expectedResponse) {
-			t.Errorf("On test %#v, got first line = %q; want %q", test, line, test.expectedResponse)
-		}
-	}
-
-	for _, test := range serverExpectTests {
-		runTest(test)
-	}
-}
-
-// Under a ~256KB (maxPostHandlerReadBytes) threshold, the server
-// should consume client request bodies that a handler didn't read.
-func TestServerUnreadRequestBodyLittle(t *testing.T) {
-	defer afterTest(t)
-	conn := new(testConn)
-	body := strings.Repeat("x", 100<<10)
-	conn.readBuf.Write([]byte(fmt.Sprintf(
-		"POST / HTTP/1.1\r\n"+
-			"Host: test\r\n"+
-			"Content-Length: %d\r\n"+
-			"\r\n", len(body))))
-	conn.readBuf.Write([]byte(body))
-
-	done := make(chan bool)
-
-	ls := &oneConnListener{conn}
-	go Serve(ls, HandlerFunc(func(rw ResponseWriter, req *Request) {
-		defer close(done)
-		if conn.readBuf.Len() < len(body)/2 {
-			t.Errorf("on request, read buffer length is %d; expected about 100 KB", conn.readBuf.Len())
-		}
-		rw.WriteHeader(200)
-		rw.(Flusher).Flush()
-		if g, e := conn.readBuf.Len(), 0; g != e {
-			t.Errorf("after WriteHeader, read buffer length is %d; want %d", g, e)
-		}
-		if c := rw.Header().Get("Connection"); c != "" {
-			t.Errorf(`Connection header = %q; want ""`, c)
-		}
-	}))
-	<-done
-}
-
-// Over a ~256KB (maxPostHandlerReadBytes) threshold, the server
-// should ignore client request bodies that a handler didn't read
-// and close the connection.
-func TestServerUnreadRequestBodyLarge(t *testing.T) {
-	conn := new(testConn)
-	body := strings.Repeat("x", 1<<20)
-	conn.readBuf.Write([]byte(fmt.Sprintf(
-		"POST / HTTP/1.1\r\n"+
-			"Host: test\r\n"+
-			"Content-Length: %d\r\n"+
-			"\r\n", len(body))))
-	conn.readBuf.Write([]byte(body))
-	conn.closec = make(chan bool, 1)
-
-	ls := &oneConnListener{conn}
-	go Serve(ls, HandlerFunc(func(rw ResponseWriter, req *Request) {
-		if conn.readBuf.Len() < len(body)/2 {
-			t.Errorf("on request, read buffer length is %d; expected about 1MB", conn.readBuf.Len())
-		}
-		rw.WriteHeader(200)
-		rw.(Flusher).Flush()
-		if conn.readBuf.Len() < len(body)/2 {
-			t.Errorf("post-WriteHeader, read buffer length is %d; expected about 1MB", conn.readBuf.Len())
-		}
-	}))
-	<-conn.closec
-
-	if res := conn.writeBuf.String(); !strings.Contains(res, "Connection: close") {
-		t.Errorf("Expected a Connection: close header; got response: %s", res)
-	}
-}
-
-type handlerBodyCloseTest struct {
-	bodySize     int
-	bodyChunked  bool
-	reqConnClose bool
-
-	wantEOFSearch bool // should Handler's Body.Close do Reads, looking for EOF?
-	wantNextReq   bool // should it find the next request on the same conn?
-}
-
-func (t handlerBodyCloseTest) connectionHeader() string {
-	if t.reqConnClose {
-		return "Connection: close\r\n"
-	}
-	return ""
-}
-
-var handlerBodyCloseTests = [...]handlerBodyCloseTest{
-	// Small enough to slurp past to the next request +
-	// has Content-Length.
-	0: {
-		bodySize:      20 << 10,
-		bodyChunked:   false,
-		reqConnClose:  false,
-		wantEOFSearch: true,
-		wantNextReq:   true,
-	},
-
-	// Small enough to slurp past to the next request +
-	// is chunked.
-	1: {
-		bodySize:      20 << 10,
-		bodyChunked:   true,
-		reqConnClose:  false,
-		wantEOFSearch: true,
-		wantNextReq:   true,
-	},
-
-	// Small enough to slurp past to the next request +
-	// has Content-Length +
-	// declares Connection: close (so pointless to read more).
-	2: {
-		bodySize:      20 << 10,
-		bodyChunked:   false,
-		reqConnClose:  true,
-		wantEOFSearch: false,
-		wantNextReq:   false,
-	},
-
-	// Small enough to slurp past to the next request +
-	// declares Connection: close,
-	// but chunked, so it might have trailers.
-	// TODO: maybe skip this search if no trailers were declared
-	// in the headers.
-	3: {
-		bodySize:      20 << 10,
-		bodyChunked:   true,
-		reqConnClose:  true,
-		wantEOFSearch: true,
-		wantNextReq:   false,
-	},
-
-	// Big with Content-Length, so give up immediately if we know it's too big.
-	4: {
-		bodySize:      1 << 20,
-		bodyChunked:   false, // has a Content-Length
-		reqConnClose:  false,
-		wantEOFSearch: false,
-		wantNextReq:   false,
-	},
-
-	// Big chunked, so read a bit before giving up.
-	5: {
-		bodySize:      1 << 20,
-		bodyChunked:   true,
-		reqConnClose:  false,
-		wantEOFSearch: true,
-		wantNextReq:   false,
-	},
-
-	// Big with Connection: close, but chunked, so search for trailers.
-	// TODO: maybe skip this search if no trailers were declared
-	// in the headers.
-	6: {
-		bodySize:      1 << 20,
-		bodyChunked:   true,
-		reqConnClose:  true,
-		wantEOFSearch: true,
-		wantNextReq:   false,
-	},
-
-	// Big with Connection: close, so don't do any reads on Close.
-	// With Content-Length.
-	7: {
-		bodySize:      1 << 20,
-		bodyChunked:   false,
-		reqConnClose:  true,
-		wantEOFSearch: false,
-		wantNextReq:   false,
-	},
-}
-
-func TestHandlerBodyClose(t *testing.T) {
-	for i, tt := range handlerBodyCloseTests {
-		testHandlerBodyClose(t, i, tt)
-	}
-}
-
-func testHandlerBodyClose(t *testing.T, i int, tt handlerBodyCloseTest) {
-	conn := new(testConn)
-	body := strings.Repeat("x", tt.bodySize)
-	if tt.bodyChunked {
-		conn.readBuf.WriteString("POST / HTTP/1.1\r\n" +
-			"Host: test\r\n" +
-			tt.connectionHeader() +
-			"Transfer-Encoding: chunked\r\n" +
-			"\r\n")
-		cw := internal.NewChunkedWriter(&conn.readBuf)
-		io.WriteString(cw, body)
-		cw.Close()
-		conn.readBuf.WriteString("\r\n")
-	} else {
-		conn.readBuf.Write([]byte(fmt.Sprintf(
-			"POST / HTTP/1.1\r\n"+
-				"Host: test\r\n"+
-				tt.connectionHeader()+
-				"Content-Length: %d\r\n"+
-				"\r\n", len(body))))
-		conn.readBuf.Write([]byte(body))
-	}
-	if !tt.reqConnClose {
-		conn.readBuf.WriteString("GET / HTTP/1.1\r\nHost: test\r\n\r\n")
-	}
-	conn.closec = make(chan bool, 1)
-
-	ls := &oneConnListener{conn}
-	var numReqs int
-	var size0, size1 int
-	go Serve(ls, HandlerFunc(func(rw ResponseWriter, req *Request) {
-		numReqs++
-		if numReqs == 1 {
-			size0 = conn.readBuf.Len()
-			req.Body.Close()
-			size1 = conn.readBuf.Len()
-		}
-	}))
-	<-conn.closec
-	if numReqs < 1 || numReqs > 2 {
-		t.Fatalf("%d. bug in test. unexpected number of requests = %d", i, numReqs)
-	}
-	didSearch := size0 != size1
-	if didSearch != tt.wantEOFSearch {
-		t.Errorf("%d. did EOF search = %v; want %v (size went from %d to %d)", i, didSearch, !didSearch, size0, size1)
-	}
-	if tt.wantNextReq && numReqs != 2 {
-		t.Errorf("%d. numReq = %d; want 2", i, numReqs)
-	}
-}
-
-// testHandlerBodyConsumer represents a function injected into a test handler to
-// vary work done on a request Body.
-type testHandlerBodyConsumer struct {
-	name string
-	f    func(io.ReadCloser)
-}
-
-var testHandlerBodyConsumers = []testHandlerBodyConsumer{
-	{"nil", func(io.ReadCloser) {}},
-	{"close", func(r io.ReadCloser) { r.Close() }},
-	{"discard", func(r io.ReadCloser) { io.Copy(ioutil.Discard, r) }},
-}
-
-func TestRequestBodyReadErrorClosesConnection(t *testing.T) {
-	defer afterTest(t)
-	for _, handler := range testHandlerBodyConsumers {
-		conn := new(testConn)
-		conn.readBuf.WriteString("POST /public HTTP/1.1\r\n" +
-			"Host: test\r\n" +
-			"Transfer-Encoding: chunked\r\n" +
-			"\r\n" +
-			"hax\r\n" + // Invalid chunked encoding
-			"GET /secret HTTP/1.1\r\n" +
-			"Host: test\r\n" +
-			"\r\n")
-
-		conn.closec = make(chan bool, 1)
-		ls := &oneConnListener{conn}
-		var numReqs int
-		go Serve(ls, HandlerFunc(func(_ ResponseWriter, req *Request) {
-			numReqs++
-			if strings.Contains(req.URL.Path, "secret") {
-				t.Error("Request for /secret encountered, should not have happened.")
-			}
-			handler.f(req.Body)
-		}))
-		<-conn.closec
-		if numReqs != 1 {
-			t.Errorf("Handler %v: got %d reqs; want 1", handler.name, numReqs)
-		}
-	}
-}
-
-func TestInvalidTrailerClosesConnection(t *testing.T) {
-	defer afterTest(t)
-	for _, handler := range testHandlerBodyConsumers {
-		conn := new(testConn)
-		conn.readBuf.WriteString("POST /public HTTP/1.1\r\n" +
-			"Host: test\r\n" +
-			"Trailer: hack\r\n" +
-			"Transfer-Encoding: chunked\r\n" +
-			"\r\n" +
-			"3\r\n" +
-			"hax\r\n" +
-			"0\r\n" +
-			"I'm not a valid trailer\r\n" +
-			"GET /secret HTTP/1.1\r\n" +
-			"Host: test\r\n" +
-			"\r\n")
-
-		conn.closec = make(chan bool, 1)
-		ln := &oneConnListener{conn}
-		var numReqs int
-		go Serve(ln, HandlerFunc(func(_ ResponseWriter, req *Request) {
-			numReqs++
-			if strings.Contains(req.URL.Path, "secret") {
-				t.Errorf("Handler %s, Request for /secret encountered, should not have happened.", handler.name)
-			}
-			handler.f(req.Body)
-		}))
-		<-conn.closec
-		if numReqs != 1 {
-			t.Errorf("Handler %s: got %d reqs; want 1", handler.name, numReqs)
-		}
-	}
-}
-
-// slowTestConn is a net.Conn that provides a means to simulate parts of a
-// request being received piecemeal. Deadlines can be set and enforced in both
-// Read and Write.
-type slowTestConn struct {
-	// over multiple calls to Read, time.Durations are slept, strings are read.
-	script []interface{}
-	closec chan bool
-	rd, wd time.Time // read, write deadline
-	noopConn
-}
-
-func (c *slowTestConn) SetDeadline(t time.Time) error {
-	c.SetReadDeadline(t)
-	c.SetWriteDeadline(t)
-	return nil
-}
-
-func (c *slowTestConn) SetReadDeadline(t time.Time) error {
-	c.rd = t
-	return nil
-}
-
-func (c *slowTestConn) SetWriteDeadline(t time.Time) error {
-	c.wd = t
-	return nil
-}
-
-func (c *slowTestConn) Read(b []byte) (n int, err error) {
-restart:
-	if !c.rd.IsZero() && time.Now().After(c.rd) {
-		return 0, syscall.ETIMEDOUT
-	}
-	if len(c.script) == 0 {
-		return 0, io.EOF
-	}
-
-	switch cue := c.script[0].(type) {
-	case time.Duration:
-		if !c.rd.IsZero() {
-			// If the deadline falls in the middle of our sleep window, deduct
-			// part of the sleep, then return a timeout.
-			if remaining := c.rd.Sub(time.Now()); remaining < cue {
-				c.script[0] = cue - remaining
-				time.Sleep(remaining)
-				return 0, syscall.ETIMEDOUT
-			}
-		}
-		c.script = c.script[1:]
-		time.Sleep(cue)
-		goto restart
-
-	case string:
-		n = copy(b, cue)
-		// If cue is too big for the buffer, leave the end for the next Read.
-		if len(cue) > n {
-			c.script[0] = cue[n:]
-		} else {
-			c.script = c.script[1:]
-		}
-
-	default:
-		panic("unknown cue in slowTestConn script")
-	}
-
-	return
-}
-
-func (c *slowTestConn) Close() error {
-	select {
-	case c.closec <- true:
-	default:
-	}
-	return nil
-}
-
-func (c *slowTestConn) Write(b []byte) (int, error) {
-	if !c.wd.IsZero() && time.Now().After(c.wd) {
-		return 0, syscall.ETIMEDOUT
-	}
-	return len(b), nil
-}
-
-func TestRequestBodyTimeoutClosesConnection(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in -short mode")
-	}
-	defer afterTest(t)
-	for _, handler := range testHandlerBodyConsumers {
-		conn := &slowTestConn{
-			script: []interface{}{
-				"POST /public HTTP/1.1\r\n" +
-					"Host: test\r\n" +
-					"Content-Length: 10000\r\n" +
-					"\r\n",
-				"foo bar baz",
-				600 * time.Millisecond, // Request deadline should hit here
-				"GET /secret HTTP/1.1\r\n" +
-					"Host: test\r\n" +
-					"\r\n",
-			},
-			closec: make(chan bool, 1),
-		}
-		ls := &oneConnListener{conn}
-
-		var numReqs int
-		s := Server{
-			Handler: HandlerFunc(func(_ ResponseWriter, req *Request) {
-				numReqs++
-				if strings.Contains(req.URL.Path, "secret") {
-					t.Error("Request for /secret encountered, should not have happened.")
-				}
-				handler.f(req.Body)
-			}),
-			ReadTimeout: 400 * time.Millisecond,
-		}
-		go s.Serve(ls)
-		<-conn.closec
-
-		if numReqs != 1 {
-			t.Errorf("Handler %v: got %d reqs; want 1", handler.name, numReqs)
-		}
-	}
-}
-
-func TestTimeoutHandler(t *testing.T) {
-	defer afterTest(t)
-	sendHi := make(chan bool, 1)
-	writeErrors := make(chan error, 1)
-	sayHi := HandlerFunc(func(w ResponseWriter, r *Request) {
-		<-sendHi
-		_, werr := w.Write([]byte("hi"))
-		writeErrors <- werr
-	})
-	timeout := make(chan time.Time, 1) // write to this to force timeouts
-	ts := httptest.NewServer(NewTestTimeoutHandler(sayHi, timeout))
-	defer ts.Close()
-
-	// Succeed without timing out:
-	sendHi <- true
-	res, err := Get(ts.URL)
-	if err != nil {
-		t.Error(err)
-	}
-	if g, e := res.StatusCode, StatusOK; g != e {
-		t.Errorf("got res.StatusCode %d; expected %d", g, e)
-	}
-	body, _ := ioutil.ReadAll(res.Body)
-	if g, e := string(body), "hi"; g != e {
-		t.Errorf("got body %q; expected %q", g, e)
-	}
-	if g := <-writeErrors; g != nil {
-		t.Errorf("got unexpected Write error on first request: %v", g)
-	}
-
-	// Times out:
-	timeout <- time.Time{}
-	res, err = Get(ts.URL)
-	if err != nil {
-		t.Error(err)
-	}
-	if g, e := res.StatusCode, StatusServiceUnavailable; g != e {
-		t.Errorf("got res.StatusCode %d; expected %d", g, e)
-	}
-	body, _ = ioutil.ReadAll(res.Body)
-	if !strings.Contains(string(body), "<title>Timeout</title>") {
-		t.Errorf("expected timeout body; got %q", string(body))
-	}
-
-	// Now make the previously-timed out handler speak again,
-	// which verifies the panic is handled:
-	sendHi <- true
-	if g, e := <-writeErrors, ErrHandlerTimeout; g != e {
-		t.Errorf("expected Write error of %v; got %v", e, g)
-	}
-}
-
-// See issues 8209 and 8414.
-func TestTimeoutHandlerRace(t *testing.T) {
-	defer afterTest(t)
-
-	delayHi := HandlerFunc(func(w ResponseWriter, r *Request) {
-		ms, _ := strconv.Atoi(r.URL.Path[1:])
-		if ms == 0 {
-			ms = 1
-		}
-		for i := 0; i < ms; i++ {
-			w.Write([]byte("hi"))
-			time.Sleep(time.Millisecond)
-		}
-	})
-
-	ts := httptest.NewServer(TimeoutHandler(delayHi, 20*time.Millisecond, ""))
-	defer ts.Close()
-
-	var wg sync.WaitGroup
-	gate := make(chan bool, 10)
-	n := 50
-	if testing.Short() {
-		n = 10
-		gate = make(chan bool, 3)
-	}
-	for i := 0; i < n; i++ {
-		gate <- true
-		wg.Add(1)
-		go func() {
-			defer wg.Done()
-			defer func() { <-gate }()
-			res, err := Get(fmt.Sprintf("%s/%d", ts.URL, rand.Intn(50)))
-			if err == nil {
-				io.Copy(ioutil.Discard, res.Body)
-				res.Body.Close()
-			}
-		}()
-	}
-	wg.Wait()
-}
-
-// See issues 8209 and 8414.
-func TestTimeoutHandlerRaceHeader(t *testing.T) {
-	defer afterTest(t)
-
-	delay204 := HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.WriteHeader(204)
-	})
-
-	ts := httptest.NewServer(TimeoutHandler(delay204, time.Nanosecond, ""))
-	defer ts.Close()
-
-	var wg sync.WaitGroup
-	gate := make(chan bool, 50)
-	n := 500
-	if testing.Short() {
-		n = 10
-	}
-	for i := 0; i < n; i++ {
-		gate <- true
-		wg.Add(1)
-		go func() {
-			defer wg.Done()
-			defer func() { <-gate }()
-			res, err := Get(ts.URL)
-			if err != nil {
-				t.Error(err)
-				return
-			}
-			defer res.Body.Close()
-			io.Copy(ioutil.Discard, res.Body)
-		}()
-	}
-	wg.Wait()
-}
-
-// Verifies we don't path.Clean() on the wrong parts in redirects.
-func TestRedirectMunging(t *testing.T) {
-	req, _ := NewRequest("GET", "http://example.com/", nil)
-
-	resp := httptest.NewRecorder()
-	Redirect(resp, req, "/foo?next=http://bar.com/", 302)
-	if g, e := resp.Header().Get("Location"), "/foo?next=http://bar.com/"; g != e {
-		t.Errorf("Location header was %q; want %q", g, e)
-	}
-
-	resp = httptest.NewRecorder()
-	Redirect(resp, req, "http://localhost:8080/_ah/login?continue=http://localhost:8080/", 302)
-	if g, e := resp.Header().Get("Location"), "http://localhost:8080/_ah/login?continue=http://localhost:8080/"; g != e {
-		t.Errorf("Location header was %q; want %q", g, e)
-	}
-}
-
-func TestRedirectBadPath(t *testing.T) {
-	// This used to crash. It's not valid input (bad path), but it
-	// shouldn't crash.
-	rr := httptest.NewRecorder()
-	req := &Request{
-		Method: "GET",
-		URL: &url.URL{
-			Scheme: "http",
-			Path:   "not-empty-but-no-leading-slash", // bogus
-		},
-	}
-	Redirect(rr, req, "", 304)
-	if rr.Code != 304 {
-		t.Errorf("Code = %d; want 304", rr.Code)
-	}
-}
-
-// TestZeroLengthPostAndResponse exercises an optimization done by the Transport:
-// when there is no body (either because the method doesn't permit a body, or an
-// explicit Content-Length of zero is present), then the transport can re-use the
-// connection immediately. But when it re-uses the connection, it typically closes
-// the previous request's body, which is not optimal for zero-lengthed bodies,
-// as the client would then see http.ErrBodyReadAfterClose and not 0, io.EOF.
-func TestZeroLengthPostAndResponse(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, r *Request) {
-		all, err := ioutil.ReadAll(r.Body)
-		if err != nil {
-			t.Fatalf("handler ReadAll: %v", err)
-		}
-		if len(all) != 0 {
-			t.Errorf("handler got %d bytes; expected 0", len(all))
-		}
-		rw.Header().Set("Content-Length", "0")
-	}))
-	defer ts.Close()
-
-	req, err := NewRequest("POST", ts.URL, strings.NewReader(""))
-	if err != nil {
-		t.Fatal(err)
-	}
-	req.ContentLength = 0
-
-	var resp [5]*Response
-	for i := range resp {
-		resp[i], err = DefaultClient.Do(req)
-		if err != nil {
-			t.Fatalf("client post #%d: %v", i, err)
-		}
-	}
-
-	for i := range resp {
-		all, err := ioutil.ReadAll(resp[i].Body)
-		if err != nil {
-			t.Fatalf("req #%d: client ReadAll: %v", i, err)
-		}
-		if len(all) != 0 {
-			t.Errorf("req #%d: client got %d bytes; expected 0", i, len(all))
-		}
-	}
-}
-
-func TestHandlerPanicNil(t *testing.T) {
-	testHandlerPanic(t, false, nil)
-}
-
-func TestHandlerPanic(t *testing.T) {
-	testHandlerPanic(t, false, "intentional death for testing")
-}
-
-func TestHandlerPanicWithHijack(t *testing.T) {
-	testHandlerPanic(t, true, "intentional death for testing")
-}
-
-func testHandlerPanic(t *testing.T, withHijack bool, panicValue interface{}) {
-	defer afterTest(t)
-	// Unlike the other tests that set the log output to ioutil.Discard
-	// to quiet the output, this test uses a pipe.  The pipe serves three
-	// purposes:
-	//
-	//   1) The log.Print from the http server (generated by the caught
-	//      panic) will go to the pipe instead of stderr, making the
-	//      output quiet.
-	//
-	//   2) We read from the pipe to verify that the handler
-	//      actually caught the panic and logged something.
-	//
-	//   3) The blocking Read call prevents this TestHandlerPanic
-	//      function from exiting before the HTTP server handler
-	//      finishes crashing. If this text function exited too
-	//      early (and its defer log.SetOutput(os.Stderr) ran),
-	//      then the crash output could spill into the next test.
-	pr, pw := io.Pipe()
-	log.SetOutput(pw)
-	defer log.SetOutput(os.Stderr)
-	defer pw.Close()
-
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		if withHijack {
-			rwc, _, err := w.(Hijacker).Hijack()
-			if err != nil {
-				t.Logf("unexpected error: %v", err)
-			}
-			defer rwc.Close()
-		}
-		panic(panicValue)
-	}))
-	defer ts.Close()
-
-	// Do a blocking read on the log output pipe so its logging
-	// doesn't bleed into the next test.  But wait only 5 seconds
-	// for it.
-	done := make(chan bool, 1)
-	go func() {
-		buf := make([]byte, 4<<10)
-		_, err := pr.Read(buf)
-		pr.Close()
-		if err != nil && err != io.EOF {
-			t.Error(err)
-		}
-		done <- true
-	}()
-
-	_, err := Get(ts.URL)
-	if err == nil {
-		t.Logf("expected an error")
-	}
-
-	if panicValue == nil {
-		return
-	}
-
-	select {
-	case <-done:
-		return
-	case <-time.After(5 * time.Second):
-		t.Fatal("expected server handler to log an error")
-	}
-}
-
-func TestServerNoDate(t *testing.T)        { testServerNoHeader(t, "Date") }
-func TestServerNoContentType(t *testing.T) { testServerNoHeader(t, "Content-Type") }
-
-func testServerNoHeader(t *testing.T, header string) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header()[header] = nil
-		io.WriteString(w, "<html>foo</html>") // non-empty
-	}))
-	defer ts.Close()
-	res, err := Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	res.Body.Close()
-	if got, ok := res.Header[header]; ok {
-		t.Fatalf("Expected no %s header; got %q", header, got)
-	}
-}
-
-func TestStripPrefix(t *testing.T) {
-	defer afterTest(t)
-	h := HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("X-Path", r.URL.Path)
-	})
-	ts := httptest.NewServer(StripPrefix("/foo", h))
-	defer ts.Close()
-
-	res, err := Get(ts.URL + "/foo/bar")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if g, e := res.Header.Get("X-Path"), "/bar"; g != e {
-		t.Errorf("test 1: got %s, want %s", g, e)
-	}
-	res.Body.Close()
-
-	res, err = Get(ts.URL + "/bar")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if g, e := res.StatusCode, 404; g != e {
-		t.Errorf("test 2: got status %v, want %v", g, e)
-	}
-	res.Body.Close()
-}
-
-func TestRequestLimit(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		t.Fatalf("didn't expect to get request in Handler")
-	}))
-	defer ts.Close()
-	req, _ := NewRequest("GET", ts.URL, nil)
-	var bytesPerHeader = len("header12345: val12345\r\n")
-	for i := 0; i < ((DefaultMaxHeaderBytes+4096)/bytesPerHeader)+1; i++ {
-		req.Header.Set(fmt.Sprintf("header%05d", i), fmt.Sprintf("val%05d", i))
-	}
-	res, err := DefaultClient.Do(req)
-	if err != nil {
-		// Some HTTP clients may fail on this undefined behavior (server replying and
-		// closing the connection while the request is still being written), but
-		// we do support it (at least currently), so we expect a response below.
-		t.Fatalf("Do: %v", err)
-	}
-	defer res.Body.Close()
-	if res.StatusCode != 413 {
-		t.Fatalf("expected 413 response status; got: %d %s", res.StatusCode, res.Status)
-	}
-}
-
-type neverEnding byte
-
-func (b neverEnding) Read(p []byte) (n int, err error) {
-	for i := range p {
-		p[i] = byte(b)
-	}
-	return len(p), nil
-}
-
-type countReader struct {
-	r io.Reader
-	n *int64
-}
-
-func (cr countReader) Read(p []byte) (n int, err error) {
-	n, err = cr.r.Read(p)
-	atomic.AddInt64(cr.n, int64(n))
-	return
-}
-
-func TestRequestBodyLimit(t *testing.T) {
-	defer afterTest(t)
-	const limit = 1 << 20
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		r.Body = MaxBytesReader(w, r.Body, limit)
-		n, err := io.Copy(ioutil.Discard, r.Body)
-		if err == nil {
-			t.Errorf("expected error from io.Copy")
-		}
-		if n != limit {
-			t.Errorf("io.Copy = %d, want %d", n, limit)
-		}
-	}))
-	defer ts.Close()
-
-	nWritten := new(int64)
-	req, _ := NewRequest("POST", ts.URL, io.LimitReader(countReader{neverEnding('a'), nWritten}, limit*200))
-
-	// Send the POST, but don't care it succeeds or not.  The
-	// remote side is going to reply and then close the TCP
-	// connection, and HTTP doesn't really define if that's
-	// allowed or not.  Some HTTP clients will get the response
-	// and some (like ours, currently) will complain that the
-	// request write failed, without reading the response.
-	//
-	// But that's okay, since what we're really testing is that
-	// the remote side hung up on us before we wrote too much.
-	_, _ = DefaultClient.Do(req)
-
-	if atomic.LoadInt64(nWritten) > limit*100 {
-		t.Errorf("handler restricted the request body to %d bytes, but client managed to write %d",
-			limit, nWritten)
-	}
-}
-
-// TestClientWriteShutdown tests that if the client shuts down the write
-// side of their TCP connection, the server doesn't send a 400 Bad Request.
-func TestClientWriteShutdown(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping test; see https://golang.org/issue/7237")
-	}
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
-	defer ts.Close()
-	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
-	if err != nil {
-		t.Fatalf("Dial: %v", err)
-	}
-	err = conn.(*net.TCPConn).CloseWrite()
-	if err != nil {
-		t.Fatalf("Dial: %v", err)
-	}
-	donec := make(chan bool)
-	go func() {
-		defer close(donec)
-		bs, err := ioutil.ReadAll(conn)
-		if err != nil {
-			t.Fatalf("ReadAll: %v", err)
-		}
-		got := string(bs)
-		if got != "" {
-			t.Errorf("read %q from server; want nothing", got)
-		}
-	}()
-	select {
-	case <-donec:
-	case <-time.After(10 * time.Second):
-		t.Fatalf("timeout")
-	}
-}
-
-// Tests that chunked server responses that write 1 byte at a time are
-// buffered before chunk headers are added, not after chunk headers.
-func TestServerBufferedChunking(t *testing.T) {
-	conn := new(testConn)
-	conn.readBuf.Write([]byte("GET / HTTP/1.1\r\n\r\n"))
-	conn.closec = make(chan bool, 1)
-	ls := &oneConnListener{conn}
-	go Serve(ls, HandlerFunc(func(rw ResponseWriter, req *Request) {
-		rw.(Flusher).Flush() // force the Header to be sent, in chunking mode, not counting the length
-		rw.Write([]byte{'x'})
-		rw.Write([]byte{'y'})
-		rw.Write([]byte{'z'})
-	}))
-	<-conn.closec
-	if !bytes.HasSuffix(conn.writeBuf.Bytes(), []byte("\r\n\r\n3\r\nxyz\r\n0\r\n\r\n")) {
-		t.Errorf("response didn't end with a single 3 byte 'xyz' chunk; got:\n%q",
-			conn.writeBuf.Bytes())
-	}
-}
-
-// Tests that the server flushes its response headers out when it's
-// ignoring the response body and waits a bit before forcefully
-// closing the TCP connection, causing the client to get a RST.
-// See https://golang.org/issue/3595
-func TestServerGracefulClose(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		Error(w, "bye", StatusUnauthorized)
-	}))
-	defer ts.Close()
-
-	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer conn.Close()
-	const bodySize = 5 << 20
-	req := []byte(fmt.Sprintf("POST / HTTP/1.1\r\nHost: foo.com\r\nContent-Length: %d\r\n\r\n", bodySize))
-	for i := 0; i < bodySize; i++ {
-		req = append(req, 'x')
-	}
-	writeErr := make(chan error)
-	go func() {
-		_, err := conn.Write(req)
-		writeErr <- err
-	}()
-	br := bufio.NewReader(conn)
-	lineNum := 0
-	for {
-		line, err := br.ReadString('\n')
-		if err == io.EOF {
-			break
-		}
-		if err != nil {
-			t.Fatalf("ReadLine: %v", err)
-		}
-		lineNum++
-		if lineNum == 1 && !strings.Contains(line, "401 Unauthorized") {
-			t.Errorf("Response line = %q; want a 401", line)
-		}
-	}
-	// Wait for write to finish. This is a broken pipe on both
-	// Darwin and Linux, but checking this isn't the point of
-	// the test.
-	<-writeErr
-}
-
-func TestCaseSensitiveMethod(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		if r.Method != "get" {
-			t.Errorf(`Got method %q; want "get"`, r.Method)
-		}
-	}))
-	defer ts.Close()
-	req, _ := NewRequest("get", ts.URL, nil)
-	res, err := DefaultClient.Do(req)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	res.Body.Close()
-}
-
-// TestContentLengthZero tests that for both an HTTP/1.0 and HTTP/1.1
-// request (both keep-alive), when a Handler never writes any
-// response, the net/http package adds a "Content-Length: 0" response
-// header.
-func TestContentLengthZero(t *testing.T) {
-	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {}))
-	defer ts.Close()
-
-	for _, version := range []string{"HTTP/1.0", "HTTP/1.1"} {
-		conn, err := net.Dial("tcp", ts.Listener.Addr().String())
-		if err != nil {
-			t.Fatalf("error dialing: %v", err)
-		}
-		_, err = fmt.Fprintf(conn, "GET / %v\r\nConnection: keep-alive\r\nHost: foo\r\n\r\n", version)
-		if err != nil {
-			t.Fatalf("error writing: %v", err)
-		}
-		req, _ := NewRequest("GET", "/", nil)
-		res, err := ReadResponse(bufio.NewReader(conn), req)
-		if err != nil {
-			t.Fatalf("error reading response: %v", err)
-		}
-		if te := res.TransferEncoding; len(te) > 0 {
-			t.Errorf("For version %q, Transfer-Encoding = %q; want none", version, te)
-		}
-		if cl := res.ContentLength; cl != 0 {
-			t.Errorf("For version %q, Content-Length = %v; want 0", version, cl)
-		}
-		conn.Close()
-	}
-}
-
-func TestCloseNotifier(t *testing.T) {
-	defer afterTest(t)
-	gotReq := make(chan bool, 1)
-	sawClose := make(chan bool, 1)
-	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
-		gotReq <- true
-		cc := rw.(CloseNotifier).CloseNotify()
-		<-cc
-		sawClose <- true
-	}))
-	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
-	if err != nil {
-		t.Fatalf("error dialing: %v", err)
-	}
-	diec := make(chan bool)
-	go func() {
-		_, err = fmt.Fprintf(conn, "GET / HTTP/1.1\r\nConnection: keep-alive\r\nHost: foo\r\n\r\n")
-		if err != nil {
-			t.Fatal(err)
-		}
-		<-diec
-		conn.Close()
-	}()
-For:
-	for {
-		select {
-		case <-gotReq:
-			diec <- true
-		case <-sawClose:
-			break For
-		case <-time.After(5 * time.Second):
-			t.Fatal("timeout")
-		}
-	}
-	ts.Close()
-}
-
-func TestCloseNotifierChanLeak(t *testing.T) {
-	defer afterTest(t)
-	req := reqBytes("GET / HTTP/1.0\nHost: golang.org")
-	for i := 0; i < 20; i++ {
-		var output bytes.Buffer
-		conn := &rwTestConn{
-			Reader: bytes.NewReader(req),
-			Writer: &output,
-			closec: make(chan bool, 1),
-		}
-		ln := &oneConnListener{conn: conn}
-		handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
-			// Ignore the return value and never read from
-			// it, testing that we don't leak goroutines
-			// on the sending side:
-			_ = rw.(CloseNotifier).CloseNotify()
-		})
-		go Serve(ln, handler)
-		<-conn.closec
-	}
-}
-
-func TestOptions(t *testing.T) {
-	uric := make(chan string, 2) // only expect 1, but leave space for 2
-	mux := NewServeMux()
-	mux.HandleFunc("/", func(w ResponseWriter, r *Request) {
-		uric <- r.RequestURI
-	})
-	ts := httptest.NewServer(mux)
-	defer ts.Close()
-
-	conn, err := net.Dial("tcp", ts.Listener.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer conn.Close()
-
-	// An OPTIONS * request should succeed.
-	_, err = conn.Write([]byte("OPTIONS * HTTP/1.1\r\nHost: foo.com\r\n\r\n"))
-	if err != nil {
-		t.Fatal(err)
-	}
-	br := bufio.NewReader(conn)
-	res, err := ReadResponse(br, &Request{Method: "OPTIONS"})
-	if err != nil {
-		t.Fatal(err)
-	}
-	if res.StatusCode != 200 {
-		t.Errorf("Got non-200 response to OPTIONS *: %#v", res)
-	}
-
-	// A GET * request on a ServeMux should fail.
-	_, err = conn.Write([]byte("GET * HTTP/1.1\r\nHost: foo.com\r\n\r\n"))
-	if err != nil {
-		t.Fatal(err)
-	}
-	res, err = ReadResponse(br, &Request{Method: "GET"})
-	if err != nil {
-		t.Fatal(err)
-	}
-	if res.StatusCode != 400 {
-		t.Errorf("Got non-400 response to GET *: %#v", res)
-	}
-
-	res, err = Get(ts.URL + "/second")
-	if err != nil {
-		t.Fatal(err)
-	}
-	res.Body.Close()
-	if got := <-uric; got != "/second" {
-		t.Errorf("Handler saw request for %q; want /second", got)
-	}
-}
-
-// Tests regarding the ordering of Write, WriteHeader, Header, and
-// Flush calls.  In Go 1.0, rw.WriteHeader immediately flushed the
-// (*response).header to the wire. In Go 1.1, the actual wire flush is
-// delayed, so we could maybe tack on a Content-Length and better
-// Content-Type after we see more (or all) of the output. To preserve
-// compatibility with Go 1, we need to be careful to track which
-// headers were live at the time of WriteHeader, so we write the same
-// ones, even if the handler modifies them (~erroneously) after the
-// first Write.
-func TestHeaderToWire(t *testing.T) {
-	tests := []struct {
-		name    string
-		handler func(ResponseWriter, *Request)
-		check   func(output string) error
-	}{
-		{
-			name: "write without Header",
-			handler: func(rw ResponseWriter, r *Request) {
-				rw.Write([]byte("hello world"))
-			},
-			check: func(got string) error {
-				if !strings.Contains(got, "Content-Length:") {
-					return errors.New("no content-length")
-				}
-				if !strings.Contains(got, "Content-Type: text/plain") {
-					return errors.New("no content-length")
-				}
-				return nil
-			},
-		},
-		{
-			name: "Header mutation before write",
-			handler: func(rw ResponseWriter, r *Request) {
-				h := rw.Header()
-				h.Set("Content-Type", "some/type")
-				rw.Write([]byte("hello world"))
-				h.Set("Too-Late", "bogus")
-			},
-			check: func(got string) error {
-				if !strings.Contains(got, "Content-Length:") {
-					return errors.New("no content-length")
-				}
-				if !strings.Contains(got, "Content-Type: some/type") {
-					return errors.New("wrong content-type")
-				}
-				if strings.Contains(got, "Too-Late") {
-					return errors.New("don't want too-late header")
-				}
-				return nil
-			},
-		},
-		{
-			name: "write then useless Header mutation",
-			handler: func(rw ResponseWriter, r *Request) {
-				rw.Write([]byte("hello world"))
-				rw.Header().Set("Too-Late", "Write already wrote headers")
-			},
-			check: func(got string) error {
-				if strings.Contains(got, "Too-Late") {
-					return errors.New("header appeared from after WriteHeader")
-				}
-				return nil
-			},
-		},
-		{
-			name: "flush then write",
-			handler: func(rw ResponseWriter, r *Request) {
-				rw.(Flusher).Flush()
-				rw.Write([]byte("post-flush"))
-				rw.Header().Set("Too-Late", "Write already wrote headers")
-			},
-			check: func(got string) error {
-				if !strings.Contains(got, "Transfer-Encoding: chunked") {
-					return errors.New("not chunked")
-				}
-				if strings.Contains(got, "Too-Late") {
-					return errors.New("header appeared from after WriteHeader")
-				}
-				return nil
-			},
-		},
-		{
-			name: "header then flush",
-			handler: func(rw ResponseWriter, r *Request) {
-				rw.Header().Set("Content-Type", "some/type")
-				rw.(Flusher).Flush()
-				rw.Write([]byte("post-flush"))
-				rw.Header().Set("Too-Late", "Write already wrote headers")
-			},
-			check: func(got string) error {
-				if !strings.Contains(got, "Transfer-Encoding: chunked") {
-					return errors.New("not chunked")
-				}
-				if strings.Contains(got, "Too-Late") {
-					return errors.New("header appeared from after WriteHeader")
-				}
-				if !strings.Contains(got, "Content-Type: some/type") {
-					return errors.New("wrong content-length")
-				}
-				return nil
-			},
-		},
-		{
-			name: "sniff-on-first-write content-type",
-			handler: func(rw ResponseWriter, r *Request) {
-				rw.Write([]byte("<html><head></head><body>some html</body></html>"))
-				rw.Header().Set("Content-Type", "x/wrong")
-			},
-			check: func(got string) error {
-				if !strings.Contains(got, "Content-Type: text/html") {
-					return errors.New("wrong content-length; want html")
-				}
-				return nil
-			},
-		},
-		{
-			name: "explicit content-type wins",
-			handler: func(rw ResponseWriter, r *Request) {
-				rw.Header().Set("Content-Type", "some/type")
-				rw.Write([]byte("<html><head></head><body>some html</body></html>"))
-			},
-			check: func(got string) error {
-				if !strings.Contains(got, "Content-Type: some/type") {
-					return errors.New("wrong content-length; want html")
-				}
-				return nil
-			},
-		},
-		{
-			name: "empty handler",
-			handler: func(rw ResponseWriter, r *Request) {
-			},
-			check: func(got string) error {
-				if !strings.Contains(got, "Content-Type: text/plain") {
-					return errors.New("wrong content-length; want text/plain")
-				}
-				if !strings.Contains(got, "Content-Length: 0") {
-					return errors.New("want 0 content-length")
-				}
-				return nil
-			},
-		},
-		{
-			name: "only Header, no write",
-			handler: func(rw ResponseWriter, r *Request) {
-				rw.Header().Set("Some-Header", "some-value")
-			},
-			check: func(got string) error {
-				if !strings.Contains(got, "Some-Header") {
-					return errors.New("didn't get header")
-				}
-				return nil
-			},
-		},
-		{
-			name: "WriteHeader call",
-			handler: func(rw ResponseWriter, r *Request) {
-				rw.WriteHeader(404)
-				rw.Header().Set("Too-Late", "some-value")
-			},
-			check: func(got string) error {
-				if !strings.Contains(got, "404") {
-					return errors.New("wrong status")
-				}
-				if strings.Contains(got, "Some-Header") {
-					return errors.New("shouldn't have seen Too-Late")
-				}
-				return nil
-			},
-		},
-	}
-	for _, tc := range tests {
-		ht := newHandlerTest(HandlerFunc(tc.handler))
-		got := ht.rawResponse("GET / HTTP/1.1\nHost: golang.org")
-		if err := tc.check(got); err != nil {
-			t.Errorf("%s: %v\nGot response:\n%s", tc.name, err, got)
-		}
-	}
-}
-
-// goTimeout runs f, failing t if f takes more than ns to complete.
-func goTimeout(t *testing.T, d time.Duration, f func()) {
-	ch := make(chan bool, 2)
-	timer := time.AfterFunc(d, func() {
-		t.Errorf("Timeout expired after %v", d)
-		ch <- true
-	})
-	defer timer.Stop()
-	go func() {
-		defer func() { ch <- true }()
-		f()
-	}()
-	<-ch
-}
-
-type errorListener struct {
-	errs []error
-}
-
-func (l *errorListener) Accept() (c net.Conn, err error) {
-	if len(l.errs) == 0 {
-		return nil, io.EOF
-	}
-	err = l.errs[0]
-	l.errs = l.errs[1:]
-	return
-}
-
-func (l *errorListener) Close() error {
-	return nil
-}
-
-func (l *errorListener) Addr() net.Addr {
-	return dummyAddr("test-address")
-}
-
-func TestAcceptMaxFds(t *testing.T) {
-	log.SetOutput(ioutil.Discard) // is noisy otherwise
-	defer log.SetOutput(os.Stderr)
-
-	ln := &errorListener{[]error{
-		&net.OpError{
-			Op:  "accept",
-			Err: syscall.EMFILE,
-		}}}
-	err := Serve(ln, HandlerFunc(HandlerFunc(func(ResponseWriter, *Request) {})))
-	if err != io.EOF {
-		t.Errorf("got error %v, want EOF", err)
-	}
-}
-
-func TestWriteAfterHijack(t *testing.T) {
-	req := reqBytes("GET / HTTP/1.1\nHost: golang.org")
-	var buf bytes.Buffer
-	wrotec := make(chan bool, 1)
-	conn := &rwTestConn{
-		Reader: bytes.NewReader(req),
-		Writer: &buf,
-		closec: make(chan bool, 1),
-	}
-	handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
-		conn, bufrw, err := rw.(Hijacker).Hijack()
-		if err != nil {
-			t.Error(err)
-			return
-		}
-		go func() {
-			bufrw.Write([]byte("[hijack-to-bufw]"))
-			bufrw.Flush()
-			conn.Write([]byte("[hijack-to-conn]"))
-			conn.Close()
-			wrotec <- true
-		}()
-	})
-	ln := &oneConnListener{conn: conn}
-	go Serve(ln, handler)
-	<-conn.closec
-	<-wrotec
-	if g, w := buf.String(), "[hijack-to-bufw][hijack-to-conn]"; g != w {
-		t.Errorf("wrote %q; want %q", g, w)
-	}
-}
-
-func TestDoubleHijack(t *testing.T) {
-	req := reqBytes("GET / HTTP/1.1\nHost: golang.org")
-	var buf bytes.Buffer
-	conn := &rwTestConn{
-		Reader: bytes.NewReader(req),
-		Writer: &buf,
-		closec: make(chan bool, 1),
-	}
-	handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
-		conn, _, err := rw.(Hijacker).Hijack()
-		if err != nil {
-			t.Error(err)
-			return
-		}
-		_, _, err = rw.(Hijacker).Hijack()
-		if err == nil {
-			t.Errorf("got err = nil;  want err != nil")
-		}
-		conn.Close()
-	})
-	ln := &oneConnListener{conn: conn}
-	go Serve(ln, handler)
-	<-conn.closec
-}
-
-// https://golang.org/issue/5955
-// Note that this does not test the "request too large"
-// exit path from the http server. This is intentional;
-// not sending Connection: close is just a minor wire
-// optimization and is pointless if dealing with a
-// badly behaved client.
-func TestHTTP10ConnectionHeader(t *testing.T) {
-	defer afterTest(t)
-
-	mux := NewServeMux()
-	mux.Handle("/", HandlerFunc(func(resp ResponseWriter, req *Request) {}))
-	ts := httptest.NewServer(mux)
-	defer ts.Close()
-
-	// net/http uses HTTP/1.1 for requests, so write requests manually
-	tests := []struct {
-		req    string   // raw http request
-		expect []string // expected Connection header(s)
-	}{
-		{
-			req:    "GET / HTTP/1.0\r\n\r\n",
-			expect: nil,
-		},
-		{
-			req:    "OPTIONS * HTTP/1.0\r\n\r\n",
-			expect: nil,
-		},
-		{
-			req:    "GET / HTTP/1.0\r\nConnection: keep-alive\r\n\r\n",
-			expect: []string{"keep-alive"},
-		},
-	}
-
-	for _, tt := range tests {
-		conn, err := net.Dial("tcp", ts.Listener.Addr().String())
-		if err != nil {
-			t.Fatal("dial err:", err)
-		}
-
-		_, err = fmt.Fprint(conn, tt.req)
-		if err != nil {
-			t.Fatal("conn write err:", err)
-		}
-
-		resp, err := ReadResponse(bufio.NewReader(conn), &Request{Method: "GET"})
-		if err != nil {
-			t.Fatal("ReadResponse err:", err)
-		}
-		conn.Close()
-		resp.Body.Close()
-
-		got := resp.Header["Connection"]
-		if !reflect.DeepEqual(got, tt.expect) {
-			t.Errorf("wrong Connection headers for request %q. Got %q expect %q", tt.req, got, tt.expect)
-		}
-	}
-}
-
-// See golang.org/issue/5660
-func TestServerReaderFromOrder(t *testing.T) {
-	defer afterTest(t)
-	pr, pw := io.Pipe()
-	const size = 3 << 20
-	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
-		rw.Header().Set("Content-Type", "text/plain") // prevent sniffing path
-		done := make(chan bool)
-		go func() {
-			io.Copy(rw, pr)
-			close(done)
-		}()
-		time.Sleep(25 * time.Millisecond) // give Copy a chance to break things
-		n, err := io.Copy(ioutil.Discard, req.Body)
-		if err != nil {
-			t.Errorf("handler Copy: %v", err)
-			return
-		}
-		if n != size {
-			t.Errorf("handler Copy = %d; want %d", n, size)
-		}
-		pw.Write([]byte("hi"))
-		pw.Close()
-		<-done
-	}))
-	defer ts.Close()
-
-	req, err := NewRequest("POST", ts.URL, io.LimitReader(neverEnding('a'), size))
-	if err != nil {
-		t.Fatal(err)
-	}
-	res, err := DefaultClient.Do(req)
-	if err != nil {
-		t.Fatal(err)
-	}
-	all, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Fatal(err)
-	}
-	res.Body.Close()
-	if string(all) != "hi" {
-		t.Errorf("Body = %q; want hi", all)
-	}
-}
-
-// Issue 6157, Issue 6685
-func TestCodesPreventingContentTypeAndBody(t *testing.T) {
-	for _, code := range []int{StatusNotModified, StatusNoContent, StatusContinue} {
-		ht := newHandlerTest(HandlerFunc(func(w ResponseWriter, r *Request) {
-			if r.URL.Path == "/header" {
-				w.Header().Set("Content-Length", "123")
-			}
-			w.WriteHeader(code)
-			if r.URL.Path == "/more" {
-				w.Write([]byte("stuff"))
-			}
-		}))
-		for _, req := range []string{
-			"GET / HTTP/1.0",
-			"GET /header HTTP/1.0",
-			"GET /more HTTP/1.0",
-			"GET / HTTP/1.1",
-			"GET /header HTTP/1.1",
-			"GET /more HTTP/1.1",
-		} {
-			got := ht.rawResponse(req)
-			wantStatus := fmt.Sprintf("%d %s", code, StatusText(code))
-			if !strings.Contains(got, wantStatus) {
-				t.Errorf("Code %d: Wanted %q Modified for %q: %s", code, wantStatus, req, got)
-			} else if strings.Contains(got, "Content-Length") {
-				t.Errorf("Code %d: Got a Content-Length from %q: %s", code, req, got)
-			} else if strings.Contains(got, "stuff") {
-				t.Errorf("Code %d: Response contains a body from %q: %s", code, req, got)
-			}
-		}
-	}
-}
-
-func TestContentTypeOkayOn204(t *testing.T) {
-	ht := newHandlerTest(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Content-Length", "123") // suppressed
-		w.Header().Set("Content-Type", "foo/bar")
-		w.WriteHeader(204)
-	}))
-	got := ht.rawResponse("GET / HTTP/1.1")
-	if !strings.Contains(got, "Content-Type: foo/bar") {
-		t.Errorf("Response = %q; want Content-Type: foo/bar", got)
-	}
-	if strings.Contains(got, "Content-Length: 123") {
-		t.Errorf("Response = %q; don't want a Content-Length", got)
-	}
-}
-
-// Issue 6995
-// A server Handler can receive a Request, and then turn around and
-// give a copy of that Request.Body out to the Transport (e.g. any
-// proxy).  So then two people own that Request.Body (both the server
-// and the http client), and both think they can close it on failure.
-// Therefore, all incoming server requests Bodies need to be thread-safe.
-func TestTransportAndServerSharedBodyRace(t *testing.T) {
-	defer afterTest(t)
-
-	const bodySize = 1 << 20
-
-	unblockBackend := make(chan bool)
-	backend := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
-		io.CopyN(rw, req.Body, bodySize)
-		<-unblockBackend
-	}))
-	defer backend.Close()
-
-	backendRespc := make(chan *Response, 1)
-	proxy := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
-		req2, _ := NewRequest("POST", backend.URL, req.Body)
-		req2.ContentLength = bodySize
-
-		bresp, err := DefaultClient.Do(req2)
-		if err != nil {
-			t.Errorf("Proxy outbound request: %v", err)
-			return
-		}
-		_, err = io.CopyN(ioutil.Discard, bresp.Body, bodySize/2)
-		if err != nil {
-			t.Errorf("Proxy copy error: %v", err)
-			return
-		}
-		backendRespc <- bresp // to close later
-
-		// Try to cause a race: Both the DefaultTransport and the proxy handler's Server
-		// will try to read/close req.Body (aka req2.Body)
-		DefaultTransport.(*Transport).CancelRequest(req2)
-		rw.Write([]byte("OK"))
-	}))
-	defer proxy.Close()
-
-	defer close(unblockBackend)
-	req, _ := NewRequest("POST", proxy.URL, io.LimitReader(neverEnding('a'), bodySize))
-	res, err := DefaultClient.Do(req)
-	if err != nil {
-		t.Fatalf("Original request: %v", err)
-	}
-
-	// Cleanup, so we don't leak goroutines.
-	res.Body.Close()
-	select {
-	case res := <-backendRespc:
-		res.Body.Close()
-	default:
-		// We failed earlier. (e.g. on DefaultClient.Do(req2))
-	}
-}
-
-// Test that a hanging Request.Body.Read from another goroutine can't
-// cause the Handler goroutine's Request.Body.Close to block.
-func TestRequestBodyCloseDoesntBlock(t *testing.T) {
-	t.Skipf("Skipping known issue; see golang.org/issue/7121")
-	if testing.Short() {
-		t.Skip("skipping in -short mode")
-	}
-	defer afterTest(t)
-
-	readErrCh := make(chan error, 1)
-	errCh := make(chan error, 2)
-
-	server := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
-		go func(body io.Reader) {
-			_, err := body.Read(make([]byte, 100))
-			readErrCh <- err
-		}(req.Body)
-		time.Sleep(500 * time.Millisecond)
-	}))
-	defer server.Close()
-
-	closeConn := make(chan bool)
-	defer close(closeConn)
-	go func() {
-		conn, err := net.Dial("tcp", server.Listener.Addr().String())
-		if err != nil {
-			errCh <- err
-			return
-		}
-		defer conn.Close()
-		_, err = conn.Write([]byte("POST / HTTP/1.1\r\nConnection: close\r\nHost: foo\r\nContent-Length: 100000\r\n\r\n"))
-		if err != nil {
-			errCh <- err
-			return
-		}
-		// And now just block, making the server block on our
-		// 100000 bytes of body that will never arrive.
-		<-closeConn
-	}()
-	select {
-	case err := <-readErrCh:
-		if err == nil {
-			t.Error("Read was nil. Expected error.")
-		}
-	case err := <-errCh:
-		t.Error(err)
-	case <-time.After(5 * time.Second):
-		t.Error("timeout")
-	}
-}
-
-// test that ResponseWriter implements io.stringWriter.
-func TestResponseWriterWriteString(t *testing.T) {
-	okc := make(chan bool, 1)
-	ht := newHandlerTest(HandlerFunc(func(w ResponseWriter, r *Request) {
-		type stringWriter interface {
-			WriteString(s string) (n int, err error)
-		}
-		_, ok := w.(stringWriter)
-		okc <- ok
-	}))
-	ht.rawResponse("GET / HTTP/1.0")
-	select {
-	case ok := <-okc:
-		if !ok {
-			t.Error("ResponseWriter did not implement io.stringWriter")
-		}
-	default:
-		t.Error("handler was never called")
-	}
-}
-
-func TestAppendTime(t *testing.T) {
-	var b [len(TimeFormat)]byte
-	t1 := time.Date(2013, 9, 21, 15, 41, 0, 0, time.FixedZone("CEST", 2*60*60))
-	res := ExportAppendTime(b[:0], t1)
-	t2, err := ParseTime(string(res))
-	if err != nil {
-		t.Fatalf("Error parsing time: %s", err)
-	}
-	if !t1.Equal(t2) {
-		t.Fatalf("Times differ; expected: %v, got %v (%s)", t1, t2, string(res))
-	}
-}
-
-func TestServerConnState(t *testing.T) {
-	defer afterTest(t)
-	handler := map[string]func(w ResponseWriter, r *Request){
-		"/": func(w ResponseWriter, r *Request) {
-			fmt.Fprintf(w, "Hello.")
-		},
-		"/close": func(w ResponseWriter, r *Request) {
-			w.Header().Set("Connection", "close")
-			fmt.Fprintf(w, "Hello.")
-		},
-		"/hijack": func(w ResponseWriter, r *Request) {
-			c, _, _ := w.(Hijacker).Hijack()
-			c.Write([]byte("HTTP/1.0 200 OK\r\nConnection: close\r\n\r\nHello."))
-			c.Close()
-		},
-		"/hijack-panic": func(w ResponseWriter, r *Request) {
-			c, _, _ := w.(Hijacker).Hijack()
-			c.Write([]byte("HTTP/1.0 200 OK\r\nConnection: close\r\n\r\nHello."))
-			c.Close()
-			panic("intentional panic")
-		},
-	}
-	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		handler[r.URL.Path](w, r)
-	}))
-	defer ts.Close()
-
-	var mu sync.Mutex // guard stateLog and connID
-	var stateLog = map[int][]ConnState{}
-	var connID = map[net.Conn]int{}
-
-	ts.Config.ErrorLog = log.New(ioutil.Discard, "", 0)
-	ts.Config.ConnState = func(c net.Conn, state ConnState) {
-		if c == nil {
-			t.Errorf("nil conn seen in state %s", state)
-			return
-		}
-		mu.Lock()
-		defer mu.Unlock()
-		id, ok := connID[c]
-		if !ok {
-			id = len(connID) + 1
-			connID[c] = id
-		}
-		stateLog[id] = append(stateLog[id], state)
-	}
-	ts.Start()
-
-	mustGet(t, ts.URL+"/")
-	mustGet(t, ts.URL+"/close")
-
-	mustGet(t, ts.URL+"/")
-	mustGet(t, ts.URL+"/", "Connection", "close")
-
-	mustGet(t, ts.URL+"/hijack")
-	mustGet(t, ts.URL+"/hijack-panic")
-
-	// New->Closed
-	{
-		c, err := net.Dial("tcp", ts.Listener.Addr().String())
-		if err != nil {
-			t.Fatal(err)
-		}
-		c.Close()
-	}
-
-	// New->Active->Closed
-	{
-		c, err := net.Dial("tcp", ts.Listener.Addr().String())
-		if err != nil {
-			t.Fatal(err)
-		}
-		if _, err := io.WriteString(c, "BOGUS REQUEST\r\n\r\n"); err != nil {
-			t.Fatal(err)
-		}
-		c.Close()
-	}
-
-	// New->Idle->Closed
-	{
-		c, err := net.Dial("tcp", ts.Listener.Addr().String())
-		if err != nil {
-			t.Fatal(err)
-		}
-		if _, err := io.WriteString(c, "GET / HTTP/1.1\r\nHost: foo\r\n\r\n"); err != nil {
-			t.Fatal(err)
-		}
-		res, err := ReadResponse(bufio.NewReader(c), nil)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if _, err := io.Copy(ioutil.Discard, res.Body); err != nil {
-			t.Fatal(err)
-		}
-		c.Close()
-	}
-
-	want := map[int][]ConnState{
-		1: {StateNew, StateActive, StateIdle, StateActive, StateClosed},
-		2: {StateNew, StateActive, StateIdle, StateActive, StateClosed},
-		3: {StateNew, StateActive, StateHijacked},
-		4: {StateNew, StateActive, StateHijacked},
-		5: {StateNew, StateClosed},
-		6: {StateNew, StateActive, StateClosed},
-		7: {StateNew, StateActive, StateIdle, StateClosed},
-	}
-	logString := func(m map[int][]ConnState) string {
-		var b bytes.Buffer
-		for id, l := range m {
-			fmt.Fprintf(&b, "Conn %d: ", id)
-			for _, s := range l {
-				fmt.Fprintf(&b, "%s ", s)
-			}
-			b.WriteString("\n")
-		}
-		return b.String()
-	}
-
-	for i := 0; i < 5; i++ {
-		time.Sleep(time.Duration(i) * 50 * time.Millisecond)
-		mu.Lock()
-		match := reflect.DeepEqual(stateLog, want)
-		mu.Unlock()
-		if match {
-			return
-		}
-	}
-
-	mu.Lock()
-	t.Errorf("Unexpected events.\nGot log: %s\n   Want: %s\n", logString(stateLog), logString(want))
-	mu.Unlock()
-}
-
-func mustGet(t *testing.T, url string, headers ...string) {
-	req, err := NewRequest("GET", url, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	for len(headers) > 0 {
-		req.Header.Add(headers[0], headers[1])
-		headers = headers[2:]
-	}
-	res, err := DefaultClient.Do(req)
-	if err != nil {
-		t.Errorf("Error fetching %s: %v", url, err)
-		return
-	}
-	_, err = ioutil.ReadAll(res.Body)
-	defer res.Body.Close()
-	if err != nil {
-		t.Errorf("Error reading %s: %v", url, err)
-	}
-}
-
-func TestServerKeepAlivesEnabled(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
-	ts.Config.SetKeepAlivesEnabled(false)
-	ts.Start()
-	defer ts.Close()
-	res, err := Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer res.Body.Close()
-	if !res.Close {
-		t.Errorf("Body.Close == false; want true")
-	}
-}
-
-// golang.org/issue/7856
-func TestServerEmptyBodyRace(t *testing.T) {
-	defer afterTest(t)
-	var n int32
-	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
-		atomic.AddInt32(&n, 1)
-	}))
-	defer ts.Close()
-	var wg sync.WaitGroup
-	const reqs = 20
-	for i := 0; i < reqs; i++ {
-		wg.Add(1)
-		go func() {
-			defer wg.Done()
-			res, err := Get(ts.URL)
-			if err != nil {
-				t.Error(err)
-				return
-			}
-			defer res.Body.Close()
-			_, err = io.Copy(ioutil.Discard, res.Body)
-			if err != nil {
-				t.Error(err)
-				return
-			}
-		}()
-	}
-	wg.Wait()
-	if got := atomic.LoadInt32(&n); got != reqs {
-		t.Errorf("handler ran %d times; want %d", got, reqs)
-	}
-}
-
-func TestServerConnStateNew(t *testing.T) {
-	sawNew := false // if the test is buggy, we'll race on this variable.
-	srv := &Server{
-		ConnState: func(c net.Conn, state ConnState) {
-			if state == StateNew {
-				sawNew = true // testing that this write isn't racy
-			}
-		},
-		Handler: HandlerFunc(func(w ResponseWriter, r *Request) {}), // irrelevant
-	}
-	srv.Serve(&oneConnListener{
-		conn: &rwTestConn{
-			Reader: strings.NewReader("GET / HTTP/1.1\r\nHost: foo\r\n\r\n"),
-			Writer: ioutil.Discard,
-		},
-	})
-	if !sawNew { // testing that this read isn't racy
-		t.Error("StateNew not seen")
-	}
-}
-
-type closeWriteTestConn struct {
-	rwTestConn
-	didCloseWrite bool
-}
-
-func (c *closeWriteTestConn) CloseWrite() error {
-	c.didCloseWrite = true
-	return nil
-}
-
-func TestCloseWrite(t *testing.T) {
-	var srv Server
-	var testConn closeWriteTestConn
-	c, err := ExportServerNewConn(&srv, &testConn)
-	if err != nil {
-		t.Fatal(err)
-	}
-	ExportCloseWriteAndWait(c)
-	if !testConn.didCloseWrite {
-		t.Error("didn't see CloseWrite call")
-	}
-}
-
-// This verifies that a handler can Flush and then Hijack.
-//
-// An similar test crashed once during development, but it was only
-// testing this tangentially and temporarily until another TODO was
-// fixed.
-//
-// So add an explicit test for this.
-func TestServerFlushAndHijack(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		io.WriteString(w, "Hello, ")
-		w.(Flusher).Flush()
-		conn, buf, _ := w.(Hijacker).Hijack()
-		buf.WriteString("6\r\nworld!\r\n0\r\n\r\n")
-		if err := buf.Flush(); err != nil {
-			t.Error(err)
-		}
-		if err := conn.Close(); err != nil {
-			t.Error(err)
-		}
-	}))
-	defer ts.Close()
-	res, err := Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer res.Body.Close()
-	all, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if want := "Hello, world!"; string(all) != want {
-		t.Errorf("Got %q; want %q", all, want)
-	}
-}
-
-// golang.org/issue/8534 -- the Server shouldn't reuse a connection
-// for keep-alive after it's seen any Write error (e.g. a timeout) on
-// that net.Conn.
-//
-// To test, verify we don't timeout or see fewer unique client
-// addresses (== unique connections) than requests.
-func TestServerKeepAliveAfterWriteError(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in -short mode")
-	}
-	defer afterTest(t)
-	const numReq = 3
-	addrc := make(chan string, numReq)
-	ts := httptest.NewUnstartedServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		addrc <- r.RemoteAddr
-		time.Sleep(500 * time.Millisecond)
-		w.(Flusher).Flush()
-	}))
-	ts.Config.WriteTimeout = 250 * time.Millisecond
-	ts.Start()
-	defer ts.Close()
-
-	errc := make(chan error, numReq)
-	go func() {
-		defer close(errc)
-		for i := 0; i < numReq; i++ {
-			res, err := Get(ts.URL)
-			if res != nil {
-				res.Body.Close()
-			}
-			errc <- err
-		}
-	}()
-
-	timeout := time.NewTimer(numReq * 2 * time.Second) // 4x overkill
-	defer timeout.Stop()
-	addrSeen := map[string]bool{}
-	numOkay := 0
-	for {
-		select {
-		case v := <-addrc:
-			addrSeen[v] = true
-		case err, ok := <-errc:
-			if !ok {
-				if len(addrSeen) != numReq {
-					t.Errorf("saw %d unique client addresses; want %d", len(addrSeen), numReq)
-				}
-				if numOkay != 0 {
-					t.Errorf("got %d successful client requests; want 0", numOkay)
-				}
-				return
-			}
-			if err == nil {
-				numOkay++
-			}
-		case <-timeout.C:
-			t.Fatal("timeout waiting for requests to complete")
-		}
-	}
-}
-
-// Issue 9987: shouldn't add automatic Content-Length (or
-// Content-Type) if a Transfer-Encoding was set by the handler.
-func TestNoContentLengthIfTransferEncoding(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Transfer-Encoding", "foo")
-		io.WriteString(w, "<html>")
-	}))
-	defer ts.Close()
-	c, err := net.Dial("tcp", ts.Listener.Addr().String())
-	if err != nil {
-		t.Fatalf("Dial: %v", err)
-	}
-	defer c.Close()
-	if _, err := io.WriteString(c, "GET / HTTP/1.1\r\nHost: foo\r\n\r\n"); err != nil {
-		t.Fatal(err)
-	}
-	bs := bufio.NewScanner(c)
-	var got bytes.Buffer
-	for bs.Scan() {
-		if strings.TrimSpace(bs.Text()) == "" {
-			break
-		}
-		got.WriteString(bs.Text())
-		got.WriteByte('\n')
-	}
-	if err := bs.Err(); err != nil {
-		t.Fatal(err)
-	}
-	if strings.Contains(got.String(), "Content-Length") {
-		t.Errorf("Unexpected Content-Length in response headers: %s", got.String())
-	}
-	if strings.Contains(got.String(), "Content-Type") {
-		t.Errorf("Unexpected Content-Type in response headers: %s", got.String())
-	}
-}
-
-// tolerate extra CRLF(s) before Request-Line on subsequent requests on a conn
-// Issue 10876.
-func TestTolerateCRLFBeforeRequestLine(t *testing.T) {
-	req := []byte("POST / HTTP/1.1\r\nHost: golang.org\r\nContent-Length: 3\r\n\r\nABC" +
-		"\r\n\r\n" + // <-- this stuff is bogus, but we'll ignore it
-		"GET / HTTP/1.1\r\nHost: golang.org\r\n\r\n")
-	var buf bytes.Buffer
-	conn := &rwTestConn{
-		Reader: bytes.NewReader(req),
-		Writer: &buf,
-		closec: make(chan bool, 1),
-	}
-	ln := &oneConnListener{conn: conn}
-	numReq := 0
-	go Serve(ln, HandlerFunc(func(rw ResponseWriter, r *Request) {
-		numReq++
-	}))
-	<-conn.closec
-	if numReq != 2 {
-		t.Errorf("num requests = %d; want 2", numReq)
-		t.Logf("Res: %s", buf.Bytes())
-	}
-}
-
-func TestIssue11549_Expect100(t *testing.T) {
-	req := reqBytes(`PUT /readbody HTTP/1.1
-User-Agent: PycURL/7.22.0
-Host: 127.0.0.1:9000
-Accept: */*
-Expect: 100-continue
-Content-Length: 10
-
-HelloWorldPUT /noreadbody HTTP/1.1
-User-Agent: PycURL/7.22.0
-Host: 127.0.0.1:9000
-Accept: */*
-Expect: 100-continue
-Content-Length: 10
-
-GET /should-be-ignored HTTP/1.1
-Host: foo
-
-`)
-	var buf bytes.Buffer
-	conn := &rwTestConn{
-		Reader: bytes.NewReader(req),
-		Writer: &buf,
-		closec: make(chan bool, 1),
-	}
-	ln := &oneConnListener{conn: conn}
-	numReq := 0
-	go Serve(ln, HandlerFunc(func(w ResponseWriter, r *Request) {
-		numReq++
-		if r.URL.Path == "/readbody" {
-			ioutil.ReadAll(r.Body)
-		}
-		io.WriteString(w, "Hello world!")
-	}))
-	<-conn.closec
-	if numReq != 2 {
-		t.Errorf("num requests = %d; want 2", numReq)
-	}
-	if !strings.Contains(buf.String(), "Connection: close\r\n") {
-		t.Errorf("expected 'Connection: close' in response; got: %s", buf.String())
-	}
-}
-
-// If a Handler finishes and there's an unread request body,
-// verify the server try to do implicit read on it before replying.
-func TestHandlerFinishSkipBigContentLengthRead(t *testing.T) {
-	conn := &testConn{closec: make(chan bool)}
-	conn.readBuf.Write([]byte(fmt.Sprintf(
-		"POST / HTTP/1.1\r\n" +
-			"Host: test\r\n" +
-			"Content-Length: 9999999999\r\n" +
-			"\r\n" + strings.Repeat("a", 1<<20))))
-
-	ls := &oneConnListener{conn}
-	var inHandlerLen int
-	go Serve(ls, HandlerFunc(func(rw ResponseWriter, req *Request) {
-		inHandlerLen = conn.readBuf.Len()
-		rw.WriteHeader(404)
-	}))
-	<-conn.closec
-	afterHandlerLen := conn.readBuf.Len()
-
-	if afterHandlerLen != inHandlerLen {
-		t.Errorf("unexpected implicit read. Read buffer went from %d -> %d", inHandlerLen, afterHandlerLen)
-	}
-}
-
-func BenchmarkClientServer(b *testing.B) {
-	b.ReportAllocs()
-	b.StopTimer()
-	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, r *Request) {
-		fmt.Fprintf(rw, "Hello world.\n")
-	}))
-	defer ts.Close()
-	b.StartTimer()
-
-	for i := 0; i < b.N; i++ {
-		res, err := Get(ts.URL)
-		if err != nil {
-			b.Fatal("Get:", err)
-		}
-		all, err := ioutil.ReadAll(res.Body)
-		res.Body.Close()
-		if err != nil {
-			b.Fatal("ReadAll:", err)
-		}
-		body := string(all)
-		if body != "Hello world.\n" {
-			b.Fatal("Got body:", body)
-		}
-	}
-
-	b.StopTimer()
-}
-
-func BenchmarkClientServerParallel4(b *testing.B) {
-	benchmarkClientServerParallel(b, 4, false)
-}
-
-func BenchmarkClientServerParallel64(b *testing.B) {
-	benchmarkClientServerParallel(b, 64, false)
-}
-
-func BenchmarkClientServerParallelTLS4(b *testing.B) {
-	benchmarkClientServerParallel(b, 4, true)
-}
-
-func BenchmarkClientServerParallelTLS64(b *testing.B) {
-	benchmarkClientServerParallel(b, 64, true)
-}
-
-func benchmarkClientServerParallel(b *testing.B, parallelism int, useTLS bool) {
-	b.ReportAllocs()
-	ts := httptest.NewUnstartedServer(HandlerFunc(func(rw ResponseWriter, r *Request) {
-		fmt.Fprintf(rw, "Hello world.\n")
-	}))
-	if useTLS {
-		ts.StartTLS()
-	} else {
-		ts.Start()
-	}
-	defer ts.Close()
-	b.ResetTimer()
-	b.SetParallelism(parallelism)
-	b.RunParallel(func(pb *testing.PB) {
-		noVerifyTransport := &Transport{
-			TLSClientConfig: &tls.Config{
-				InsecureSkipVerify: true,
-			},
-		}
-		defer noVerifyTransport.CloseIdleConnections()
-		client := &Client{Transport: noVerifyTransport}
-		for pb.Next() {
-			res, err := client.Get(ts.URL)
-			if err != nil {
-				b.Logf("Get: %v", err)
-				continue
-			}
-			all, err := ioutil.ReadAll(res.Body)
-			res.Body.Close()
-			if err != nil {
-				b.Logf("ReadAll: %v", err)
-				continue
-			}
-			body := string(all)
-			if body != "Hello world.\n" {
-				panic("Got body: " + body)
-			}
-		}
-	})
-}
-
-// A benchmark for profiling the server without the HTTP client code.
-// The client code runs in a subprocess.
-//
-// For use like:
-//   $ go test -c
-//   $ ./http.test -test.run=XX -test.bench=BenchmarkServer -test.benchtime=15s -test.cpuprofile=http.prof
-//   $ go tool pprof http.test http.prof
-//   (pprof) web
-func BenchmarkServer(b *testing.B) {
-	b.ReportAllocs()
-	// Child process mode;
-	if url := os.Getenv("TEST_BENCH_SERVER_URL"); url != "" {
-		n, err := strconv.Atoi(os.Getenv("TEST_BENCH_CLIENT_N"))
-		if err != nil {
-			panic(err)
-		}
-		for i := 0; i < n; i++ {
-			res, err := Get(url)
-			if err != nil {
-				log.Panicf("Get: %v", err)
-			}
-			all, err := ioutil.ReadAll(res.Body)
-			res.Body.Close()
-			if err != nil {
-				log.Panicf("ReadAll: %v", err)
-			}
-			body := string(all)
-			if body != "Hello world.\n" {
-				log.Panicf("Got body: %q", body)
-			}
-		}
-		os.Exit(0)
-		return
-	}
-
-	var res = []byte("Hello world.\n")
-	b.StopTimer()
-	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, r *Request) {
-		rw.Header().Set("Content-Type", "text/html; charset=utf-8")
-		rw.Write(res)
-	}))
-	defer ts.Close()
-	b.StartTimer()
-
-	cmd := exec.Command(os.Args[0], "-test.run=XXXX", "-test.bench=BenchmarkServer$")
-	cmd.Env = append([]string{
-		fmt.Sprintf("TEST_BENCH_CLIENT_N=%d", b.N),
-		fmt.Sprintf("TEST_BENCH_SERVER_URL=%s", ts.URL),
-	}, os.Environ()...)
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		b.Errorf("Test failure: %v, with output: %s", err, out)
-	}
-}
-
-// getNoBody wraps Get but closes any Response.Body before returning the response.
-func getNoBody(urlStr string) (*Response, error) {
-	res, err := Get(urlStr)
-	if err != nil {
-		return nil, err
-	}
-	res.Body.Close()
-	return res, nil
-}
-
-// A benchmark for profiling the client without the HTTP server code.
-// The server code runs in a subprocess.
-func BenchmarkClient(b *testing.B) {
-	b.ReportAllocs()
-	b.StopTimer()
-	defer afterTest(b)
-
-	port := os.Getenv("TEST_BENCH_SERVER_PORT") // can be set by user
-	if port == "" {
-		port = "39207"
-	}
-	var data = []byte("Hello world.\n")
-	if server := os.Getenv("TEST_BENCH_SERVER"); server != "" {
-		// Server process mode.
-		HandleFunc("/", func(w ResponseWriter, r *Request) {
-			r.ParseForm()
-			if r.Form.Get("stop") != "" {
-				os.Exit(0)
-			}
-			w.Header().Set("Content-Type", "text/html; charset=utf-8")
-			w.Write(data)
-		})
-		log.Fatal(ListenAndServe("localhost:"+port, nil))
-	}
-
-	// Start server process.
-	cmd := exec.Command(os.Args[0], "-test.run=XXXX", "-test.bench=BenchmarkClient$")
-	cmd.Env = append(os.Environ(), "TEST_BENCH_SERVER=yes")
-	if err := cmd.Start(); err != nil {
-		b.Fatalf("subprocess failed to start: %v", err)
-	}
-	defer cmd.Process.Kill()
-	done := make(chan error)
-	go func() {
-		done <- cmd.Wait()
-	}()
-
-	// Wait for the server process to respond.
-	url := "http://localhost:" + port + "/"
-	for i := 0; i < 100; i++ {
-		time.Sleep(50 * time.Millisecond)
-		if _, err := getNoBody(url); err == nil {
-			break
-		}
-		if i == 99 {
-			b.Fatalf("subprocess does not respond")
-		}
-	}
-
-	// Do b.N requests to the server.
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		res, err := Get(url)
-		if err != nil {
-			b.Fatalf("Get: %v", err)
-		}
-		body, err := ioutil.ReadAll(res.Body)
-		res.Body.Close()
-		if err != nil {
-			b.Fatalf("ReadAll: %v", err)
-		}
-		if bytes.Compare(body, data) != 0 {
-			b.Fatalf("Got body: %q", body)
-		}
-	}
-	b.StopTimer()
-
-	// Instruct server process to stop.
-	getNoBody(url + "?stop=yes")
-	select {
-	case err := <-done:
-		if err != nil {
-			b.Fatalf("subprocess failed: %v", err)
-		}
-	case <-time.After(5 * time.Second):
-		b.Fatalf("subprocess did not stop")
-	}
-}
-
-func BenchmarkServerFakeConnNoKeepAlive(b *testing.B) {
-	b.ReportAllocs()
-	req := reqBytes(`GET / HTTP/1.0
-Host: golang.org
-Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17
-Accept-Encoding: gzip,deflate,sdch
-Accept-Language: en-US,en;q=0.8
-Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
-`)
-	res := []byte("Hello world!\n")
-
-	conn := &testConn{
-		// testConn.Close will not push into the channel
-		// if it's full.
-		closec: make(chan bool, 1),
-	}
-	handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
-		rw.Header().Set("Content-Type", "text/html; charset=utf-8")
-		rw.Write(res)
-	})
-	ln := new(oneConnListener)
-	for i := 0; i < b.N; i++ {
-		conn.readBuf.Reset()
-		conn.writeBuf.Reset()
-		conn.readBuf.Write(req)
-		ln.conn = conn
-		Serve(ln, handler)
-		<-conn.closec
-	}
-}
-
-// repeatReader reads content count times, then EOFs.
-type repeatReader struct {
-	content []byte
-	count   int
-	off     int
-}
-
-func (r *repeatReader) Read(p []byte) (n int, err error) {
-	if r.count <= 0 {
-		return 0, io.EOF
-	}
-	n = copy(p, r.content[r.off:])
-	r.off += n
-	if r.off == len(r.content) {
-		r.count--
-		r.off = 0
-	}
-	return
-}
-
-func BenchmarkServerFakeConnWithKeepAlive(b *testing.B) {
-	b.ReportAllocs()
-
-	req := reqBytes(`GET / HTTP/1.1
-Host: golang.org
-Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
-User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17
-Accept-Encoding: gzip,deflate,sdch
-Accept-Language: en-US,en;q=0.8
-Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
-`)
-	res := []byte("Hello world!\n")
-
-	conn := &rwTestConn{
-		Reader: &repeatReader{content: req, count: b.N},
-		Writer: ioutil.Discard,
-		closec: make(chan bool, 1),
-	}
-	handled := 0
-	handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
-		handled++
-		rw.Header().Set("Content-Type", "text/html; charset=utf-8")
-		rw.Write(res)
-	})
-	ln := &oneConnListener{conn: conn}
-	go Serve(ln, handler)
-	<-conn.closec
-	if b.N != handled {
-		b.Errorf("b.N=%d but handled %d", b.N, handled)
-	}
-}
-
-// same as above, but representing the most simple possible request
-// and handler. Notably: the handler does not call rw.Header().
-func BenchmarkServerFakeConnWithKeepAliveLite(b *testing.B) {
-	b.ReportAllocs()
-
-	req := reqBytes(`GET / HTTP/1.1
-Host: golang.org
-`)
-	res := []byte("Hello world!\n")
-
-	conn := &rwTestConn{
-		Reader: &repeatReader{content: req, count: b.N},
-		Writer: ioutil.Discard,
-		closec: make(chan bool, 1),
-	}
-	handled := 0
-	handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
-		handled++
-		rw.Write(res)
-	})
-	ln := &oneConnListener{conn: conn}
-	go Serve(ln, handler)
-	<-conn.closec
-	if b.N != handled {
-		b.Errorf("b.N=%d but handled %d", b.N, handled)
-	}
-}
-
-const someResponse = "<html>some response</html>"
-
-// A Response that's just no bigger than 2KB, the buffer-before-chunking threshold.
-var response = bytes.Repeat([]byte(someResponse), 2<<10/len(someResponse))
-
-// Both Content-Type and Content-Length set. Should be no buffering.
-func BenchmarkServerHandlerTypeLen(b *testing.B) {
-	benchmarkHandler(b, HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Content-Type", "text/html")
-		w.Header().Set("Content-Length", strconv.Itoa(len(response)))
-		w.Write(response)
-	}))
-}
-
-// A Content-Type is set, but no length. No sniffing, but will count the Content-Length.
-func BenchmarkServerHandlerNoLen(b *testing.B) {
-	benchmarkHandler(b, HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Content-Type", "text/html")
-		w.Write(response)
-	}))
-}
-
-// A Content-Length is set, but the Content-Type will be sniffed.
-func BenchmarkServerHandlerNoType(b *testing.B) {
-	benchmarkHandler(b, HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Content-Length", strconv.Itoa(len(response)))
-		w.Write(response)
-	}))
-}
-
-// Neither a Content-Type or Content-Length, so sniffed and counted.
-func BenchmarkServerHandlerNoHeader(b *testing.B) {
-	benchmarkHandler(b, HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Write(response)
-	}))
-}
-
-func benchmarkHandler(b *testing.B, h Handler) {
-	b.ReportAllocs()
-	req := reqBytes(`GET / HTTP/1.1
-Host: golang.org
-`)
-	conn := &rwTestConn{
-		Reader: &repeatReader{content: req, count: b.N},
-		Writer: ioutil.Discard,
-		closec: make(chan bool, 1),
-	}
-	handled := 0
-	handler := HandlerFunc(func(rw ResponseWriter, r *Request) {
-		handled++
-		h.ServeHTTP(rw, r)
-	})
-	ln := &oneConnListener{conn: conn}
-	go Serve(ln, handler)
-	<-conn.closec
-	if b.N != handled {
-		b.Errorf("b.N=%d but handled %d", b.N, handled)
-	}
-}
-
-func BenchmarkServerHijack(b *testing.B) {
-	b.ReportAllocs()
-	req := reqBytes(`GET / HTTP/1.1
-Host: golang.org
-`)
-	h := HandlerFunc(func(w ResponseWriter, r *Request) {
-		conn, _, err := w.(Hijacker).Hijack()
-		if err != nil {
-			panic(err)
-		}
-		conn.Close()
-	})
-	conn := &rwTestConn{
-		Writer: ioutil.Discard,
-		closec: make(chan bool, 1),
-	}
-	ln := &oneConnListener{conn: conn}
-	for i := 0; i < b.N; i++ {
-		conn.Reader = bytes.NewReader(req)
-		ln.conn = conn
-		Serve(ln, h)
-		<-conn.closec
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/server.go b/third_party/gofrontend/libgo/go/net/http/server.go
deleted file mode 100644
index a3e4355..0000000
--- a/third_party/gofrontend/libgo/go/net/http/server.go
+++ /dev/null
@@ -1,2267 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// HTTP server.  See RFC 2616.
-
-package http
-
-import (
-	"bufio"
-	"crypto/tls"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	"net"
-	"net/textproto"
-	"net/url"
-	"os"
-	"path"
-	"runtime"
-	"strconv"
-	"strings"
-	"sync"
-	"sync/atomic"
-	"time"
-)
-
-// Errors introduced by the HTTP server.
-var (
-	ErrWriteAfterFlush = errors.New("Conn.Write called after Flush")
-	ErrBodyNotAllowed  = errors.New("http: request method or response status code does not allow body")
-	ErrHijacked        = errors.New("Conn has been hijacked")
-	ErrContentLength   = errors.New("Conn.Write wrote more than the declared Content-Length")
-)
-
-// Objects implementing the Handler interface can be
-// registered to serve a particular path or subtree
-// in the HTTP server.
-//
-// ServeHTTP should write reply headers and data to the ResponseWriter
-// and then return.  Returning signals that the request is finished
-// and that the HTTP server can move on to the next request on
-// the connection.
-//
-// If ServeHTTP panics, the server (the caller of ServeHTTP) assumes
-// that the effect of the panic was isolated to the active request.
-// It recovers the panic, logs a stack trace to the server error log,
-// and hangs up the connection.
-//
-type Handler interface {
-	ServeHTTP(ResponseWriter, *Request)
-}
-
-// A ResponseWriter interface is used by an HTTP handler to
-// construct an HTTP response.
-type ResponseWriter interface {
-	// Header returns the header map that will be sent by
-	// WriteHeader. Changing the header after a call to
-	// WriteHeader (or Write) has no effect unless the modified
-	// headers were declared as trailers by setting the
-	// "Trailer" header before the call to WriteHeader (see example).
-	// To suppress implicit response headers, set their value to nil.
-	Header() Header
-
-	// Write writes the data to the connection as part of an HTTP reply.
-	// If WriteHeader has not yet been called, Write calls WriteHeader(http.StatusOK)
-	// before writing the data.  If the Header does not contain a
-	// Content-Type line, Write adds a Content-Type set to the result of passing
-	// the initial 512 bytes of written data to DetectContentType.
-	Write([]byte) (int, error)
-
-	// WriteHeader sends an HTTP response header with status code.
-	// If WriteHeader is not called explicitly, the first call to Write
-	// will trigger an implicit WriteHeader(http.StatusOK).
-	// Thus explicit calls to WriteHeader are mainly used to
-	// send error codes.
-	WriteHeader(int)
-}
-
-// The Flusher interface is implemented by ResponseWriters that allow
-// an HTTP handler to flush buffered data to the client.
-//
-// Note that even for ResponseWriters that support Flush,
-// if the client is connected through an HTTP proxy,
-// the buffered data may not reach the client until the response
-// completes.
-type Flusher interface {
-	// Flush sends any buffered data to the client.
-	Flush()
-}
-
-// The Hijacker interface is implemented by ResponseWriters that allow
-// an HTTP handler to take over the connection.
-type Hijacker interface {
-	// Hijack lets the caller take over the connection.
-	// After a call to Hijack(), the HTTP server library
-	// will not do anything else with the connection.
-	//
-	// It becomes the caller's responsibility to manage
-	// and close the connection.
-	//
-	// The returned net.Conn may have read or write deadlines
-	// already set, depending on the configuration of the
-	// Server. It is the caller's responsibility to set
-	// or clear those deadlines as needed.
-	Hijack() (net.Conn, *bufio.ReadWriter, error)
-}
-
-// The CloseNotifier interface is implemented by ResponseWriters which
-// allow detecting when the underlying connection has gone away.
-//
-// This mechanism can be used to cancel long operations on the server
-// if the client has disconnected before the response is ready.
-type CloseNotifier interface {
-	// CloseNotify returns a channel that receives a single value
-	// when the client connection has gone away.
-	CloseNotify() <-chan bool
-}
-
-// A conn represents the server side of an HTTP connection.
-type conn struct {
-	remoteAddr string               // network address of remote side
-	server     *Server              // the Server on which the connection arrived
-	rwc        net.Conn             // i/o connection
-	w          io.Writer            // checkConnErrorWriter's copy of wrc, not zeroed on Hijack
-	werr       error                // any errors writing to w
-	sr         liveSwitchReader     // where the LimitReader reads from; usually the rwc
-	lr         *io.LimitedReader    // io.LimitReader(sr)
-	buf        *bufio.ReadWriter    // buffered(lr,rwc), reading from bufio->limitReader->sr->rwc
-	tlsState   *tls.ConnectionState // or nil when not using TLS
-	lastMethod string               // method of previous request, or ""
-
-	mu           sync.Mutex // guards the following
-	clientGone   bool       // if client has disconnected mid-request
-	closeNotifyc chan bool  // made lazily
-	hijackedv    bool       // connection has been hijacked by handler
-}
-
-func (c *conn) hijacked() bool {
-	c.mu.Lock()
-	defer c.mu.Unlock()
-	return c.hijackedv
-}
-
-func (c *conn) hijack() (rwc net.Conn, buf *bufio.ReadWriter, err error) {
-	c.mu.Lock()
-	defer c.mu.Unlock()
-	if c.hijackedv {
-		return nil, nil, ErrHijacked
-	}
-	if c.closeNotifyc != nil {
-		return nil, nil, errors.New("http: Hijack is incompatible with use of CloseNotifier")
-	}
-	c.hijackedv = true
-	rwc = c.rwc
-	buf = c.buf
-	c.rwc = nil
-	c.buf = nil
-	c.setState(rwc, StateHijacked)
-	return
-}
-
-func (c *conn) closeNotify() <-chan bool {
-	c.mu.Lock()
-	defer c.mu.Unlock()
-	if c.closeNotifyc == nil {
-		c.closeNotifyc = make(chan bool, 1)
-		if c.hijackedv {
-			// to obey the function signature, even though
-			// it'll never receive a value.
-			return c.closeNotifyc
-		}
-		pr, pw := io.Pipe()
-
-		readSource := c.sr.r
-		c.sr.Lock()
-		c.sr.r = pr
-		c.sr.Unlock()
-		go func() {
-			_, err := io.Copy(pw, readSource)
-			if err == nil {
-				err = io.EOF
-			}
-			pw.CloseWithError(err)
-			c.noteClientGone()
-		}()
-	}
-	return c.closeNotifyc
-}
-
-func (c *conn) noteClientGone() {
-	c.mu.Lock()
-	defer c.mu.Unlock()
-	if c.closeNotifyc != nil && !c.clientGone {
-		c.closeNotifyc <- true
-	}
-	c.clientGone = true
-}
-
-// A switchWriter can have its Writer changed at runtime.
-// It's not safe for concurrent Writes and switches.
-type switchWriter struct {
-	io.Writer
-}
-
-// A liveSwitchReader can have its Reader changed at runtime. It's
-// safe for concurrent reads and switches, if its mutex is held.
-type liveSwitchReader struct {
-	sync.Mutex
-	r io.Reader
-}
-
-func (sr *liveSwitchReader) Read(p []byte) (n int, err error) {
-	sr.Lock()
-	r := sr.r
-	sr.Unlock()
-	return r.Read(p)
-}
-
-// This should be >= 512 bytes for DetectContentType,
-// but otherwise it's somewhat arbitrary.
-const bufferBeforeChunkingSize = 2048
-
-// chunkWriter writes to a response's conn buffer, and is the writer
-// wrapped by the response.bufw buffered writer.
-//
-// chunkWriter also is responsible for finalizing the Header, including
-// conditionally setting the Content-Type and setting a Content-Length
-// in cases where the handler's final output is smaller than the buffer
-// size. It also conditionally adds chunk headers, when in chunking mode.
-//
-// See the comment above (*response).Write for the entire write flow.
-type chunkWriter struct {
-	res *response
-
-	// header is either nil or a deep clone of res.handlerHeader
-	// at the time of res.WriteHeader, if res.WriteHeader is
-	// called and extra buffering is being done to calculate
-	// Content-Type and/or Content-Length.
-	header Header
-
-	// wroteHeader tells whether the header's been written to "the
-	// wire" (or rather: w.conn.buf). this is unlike
-	// (*response).wroteHeader, which tells only whether it was
-	// logically written.
-	wroteHeader bool
-
-	// set by the writeHeader method:
-	chunking bool // using chunked transfer encoding for reply body
-}
-
-var (
-	crlf       = []byte("\r\n")
-	colonSpace = []byte(": ")
-)
-
-func (cw *chunkWriter) Write(p []byte) (n int, err error) {
-	if !cw.wroteHeader {
-		cw.writeHeader(p)
-	}
-	if cw.res.req.Method == "HEAD" {
-		// Eat writes.
-		return len(p), nil
-	}
-	if cw.chunking {
-		_, err = fmt.Fprintf(cw.res.conn.buf, "%x\r\n", len(p))
-		if err != nil {
-			cw.res.conn.rwc.Close()
-			return
-		}
-	}
-	n, err = cw.res.conn.buf.Write(p)
-	if cw.chunking && err == nil {
-		_, err = cw.res.conn.buf.Write(crlf)
-	}
-	if err != nil {
-		cw.res.conn.rwc.Close()
-	}
-	return
-}
-
-func (cw *chunkWriter) flush() {
-	if !cw.wroteHeader {
-		cw.writeHeader(nil)
-	}
-	cw.res.conn.buf.Flush()
-}
-
-func (cw *chunkWriter) close() {
-	if !cw.wroteHeader {
-		cw.writeHeader(nil)
-	}
-	if cw.chunking {
-		bw := cw.res.conn.buf // conn's bufio writer
-		// zero chunk to mark EOF
-		bw.WriteString("0\r\n")
-		if len(cw.res.trailers) > 0 {
-			trailers := make(Header)
-			for _, h := range cw.res.trailers {
-				if vv := cw.res.handlerHeader[h]; len(vv) > 0 {
-					trailers[h] = vv
-				}
-			}
-			trailers.Write(bw) // the writer handles noting errors
-		}
-		// final blank line after the trailers (whether
-		// present or not)
-		bw.WriteString("\r\n")
-	}
-}
-
-// A response represents the server side of an HTTP response.
-type response struct {
-	conn          *conn
-	req           *Request // request for this response
-	wroteHeader   bool     // reply header has been (logically) written
-	wroteContinue bool     // 100 Continue response was written
-
-	w  *bufio.Writer // buffers output in chunks to chunkWriter
-	cw chunkWriter
-	sw *switchWriter // of the bufio.Writer, for return to putBufioWriter
-
-	// handlerHeader is the Header that Handlers get access to,
-	// which may be retained and mutated even after WriteHeader.
-	// handlerHeader is copied into cw.header at WriteHeader
-	// time, and privately mutated thereafter.
-	handlerHeader Header
-	calledHeader  bool // handler accessed handlerHeader via Header
-
-	written       int64 // number of bytes written in body
-	contentLength int64 // explicitly-declared Content-Length; or -1
-	status        int   // status code passed to WriteHeader
-
-	// close connection after this reply.  set on request and
-	// updated after response from handler if there's a
-	// "Connection: keep-alive" response header and a
-	// Content-Length.
-	closeAfterReply bool
-
-	// requestBodyLimitHit is set by requestTooLarge when
-	// maxBytesReader hits its max size. It is checked in
-	// WriteHeader, to make sure we don't consume the
-	// remaining request body to try to advance to the next HTTP
-	// request. Instead, when this is set, we stop reading
-	// subsequent requests on this connection and stop reading
-	// input from it.
-	requestBodyLimitHit bool
-
-	// trailers are the headers to be sent after the handler
-	// finishes writing the body.  This field is initialized from
-	// the Trailer response header when the response header is
-	// written.
-	trailers []string
-
-	handlerDone bool // set true when the handler exits
-
-	// Buffers for Date and Content-Length
-	dateBuf [len(TimeFormat)]byte
-	clenBuf [10]byte
-}
-
-// declareTrailer is called for each Trailer header when the
-// response header is written. It notes that a header will need to be
-// written in the trailers at the end of the response.
-func (w *response) declareTrailer(k string) {
-	k = CanonicalHeaderKey(k)
-	switch k {
-	case "Transfer-Encoding", "Content-Length", "Trailer":
-		// Forbidden by RFC 2616 14.40.
-		return
-	}
-	w.trailers = append(w.trailers, k)
-}
-
-// requestTooLarge is called by maxBytesReader when too much input has
-// been read from the client.
-func (w *response) requestTooLarge() {
-	w.closeAfterReply = true
-	w.requestBodyLimitHit = true
-	if !w.wroteHeader {
-		w.Header().Set("Connection", "close")
-	}
-}
-
-// needsSniff reports whether a Content-Type still needs to be sniffed.
-func (w *response) needsSniff() bool {
-	_, haveType := w.handlerHeader["Content-Type"]
-	return !w.cw.wroteHeader && !haveType && w.written < sniffLen
-}
-
-// writerOnly hides an io.Writer value's optional ReadFrom method
-// from io.Copy.
-type writerOnly struct {
-	io.Writer
-}
-
-func srcIsRegularFile(src io.Reader) (isRegular bool, err error) {
-	switch v := src.(type) {
-	case *os.File:
-		fi, err := v.Stat()
-		if err != nil {
-			return false, err
-		}
-		return fi.Mode().IsRegular(), nil
-	case *io.LimitedReader:
-		return srcIsRegularFile(v.R)
-	default:
-		return
-	}
-}
-
-// ReadFrom is here to optimize copying from an *os.File regular file
-// to a *net.TCPConn with sendfile.
-func (w *response) ReadFrom(src io.Reader) (n int64, err error) {
-	// Our underlying w.conn.rwc is usually a *TCPConn (with its
-	// own ReadFrom method). If not, or if our src isn't a regular
-	// file, just fall back to the normal copy method.
-	rf, ok := w.conn.rwc.(io.ReaderFrom)
-	regFile, err := srcIsRegularFile(src)
-	if err != nil {
-		return 0, err
-	}
-	if !ok || !regFile {
-		return io.Copy(writerOnly{w}, src)
-	}
-
-	// sendfile path:
-
-	if !w.wroteHeader {
-		w.WriteHeader(StatusOK)
-	}
-
-	if w.needsSniff() {
-		n0, err := io.Copy(writerOnly{w}, io.LimitReader(src, sniffLen))
-		n += n0
-		if err != nil {
-			return n, err
-		}
-	}
-
-	w.w.Flush()  // get rid of any previous writes
-	w.cw.flush() // make sure Header is written; flush data to rwc
-
-	// Now that cw has been flushed, its chunking field is guaranteed initialized.
-	if !w.cw.chunking && w.bodyAllowed() {
-		n0, err := rf.ReadFrom(src)
-		n += n0
-		w.written += n0
-		return n, err
-	}
-
-	n0, err := io.Copy(writerOnly{w}, src)
-	n += n0
-	return n, err
-}
-
-// noLimit is an effective infinite upper bound for io.LimitedReader
-const noLimit int64 = (1 << 63) - 1
-
-// debugServerConnections controls whether all server connections are wrapped
-// with a verbose logging wrapper.
-const debugServerConnections = false
-
-// Create new connection from rwc.
-func (srv *Server) newConn(rwc net.Conn) (c *conn, err error) {
-	c = new(conn)
-	c.remoteAddr = rwc.RemoteAddr().String()
-	c.server = srv
-	c.rwc = rwc
-	c.w = rwc
-	if debugServerConnections {
-		c.rwc = newLoggingConn("server", c.rwc)
-	}
-	c.sr.r = c.rwc
-	c.lr = io.LimitReader(&c.sr, noLimit).(*io.LimitedReader)
-	br := newBufioReader(c.lr)
-	bw := newBufioWriterSize(checkConnErrorWriter{c}, 4<<10)
-	c.buf = bufio.NewReadWriter(br, bw)
-	return c, nil
-}
-
-var (
-	bufioReaderPool   sync.Pool
-	bufioWriter2kPool sync.Pool
-	bufioWriter4kPool sync.Pool
-)
-
-func bufioWriterPool(size int) *sync.Pool {
-	switch size {
-	case 2 << 10:
-		return &bufioWriter2kPool
-	case 4 << 10:
-		return &bufioWriter4kPool
-	}
-	return nil
-}
-
-func newBufioReader(r io.Reader) *bufio.Reader {
-	if v := bufioReaderPool.Get(); v != nil {
-		br := v.(*bufio.Reader)
-		br.Reset(r)
-		return br
-	}
-	// Note: if this reader size is every changed, update
-	// TestHandlerBodyClose's assumptions.
-	return bufio.NewReader(r)
-}
-
-func putBufioReader(br *bufio.Reader) {
-	br.Reset(nil)
-	bufioReaderPool.Put(br)
-}
-
-func newBufioWriterSize(w io.Writer, size int) *bufio.Writer {
-	pool := bufioWriterPool(size)
-	if pool != nil {
-		if v := pool.Get(); v != nil {
-			bw := v.(*bufio.Writer)
-			bw.Reset(w)
-			return bw
-		}
-	}
-	return bufio.NewWriterSize(w, size)
-}
-
-func putBufioWriter(bw *bufio.Writer) {
-	bw.Reset(nil)
-	if pool := bufioWriterPool(bw.Available()); pool != nil {
-		pool.Put(bw)
-	}
-}
-
-// DefaultMaxHeaderBytes is the maximum permitted size of the headers
-// in an HTTP request.
-// This can be overridden by setting Server.MaxHeaderBytes.
-const DefaultMaxHeaderBytes = 1 << 20 // 1 MB
-
-func (srv *Server) maxHeaderBytes() int {
-	if srv.MaxHeaderBytes > 0 {
-		return srv.MaxHeaderBytes
-	}
-	return DefaultMaxHeaderBytes
-}
-
-func (srv *Server) initialLimitedReaderSize() int64 {
-	return int64(srv.maxHeaderBytes()) + 4096 // bufio slop
-}
-
-// wrapper around io.ReaderCloser which on first read, sends an
-// HTTP/1.1 100 Continue header
-type expectContinueReader struct {
-	resp       *response
-	readCloser io.ReadCloser
-	closed     bool
-	sawEOF     bool
-}
-
-func (ecr *expectContinueReader) Read(p []byte) (n int, err error) {
-	if ecr.closed {
-		return 0, ErrBodyReadAfterClose
-	}
-	if !ecr.resp.wroteContinue && !ecr.resp.conn.hijacked() {
-		ecr.resp.wroteContinue = true
-		ecr.resp.conn.buf.WriteString("HTTP/1.1 100 Continue\r\n\r\n")
-		ecr.resp.conn.buf.Flush()
-	}
-	n, err = ecr.readCloser.Read(p)
-	if err == io.EOF {
-		ecr.sawEOF = true
-	}
-	return
-}
-
-func (ecr *expectContinueReader) Close() error {
-	ecr.closed = true
-	return ecr.readCloser.Close()
-}
-
-// TimeFormat is the time format to use with
-// time.Parse and time.Time.Format when parsing
-// or generating times in HTTP headers.
-// It is like time.RFC1123 but hard codes GMT as the time zone.
-const TimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT"
-
-// appendTime is a non-allocating version of []byte(t.UTC().Format(TimeFormat))
-func appendTime(b []byte, t time.Time) []byte {
-	const days = "SunMonTueWedThuFriSat"
-	const months = "JanFebMarAprMayJunJulAugSepOctNovDec"
-
-	t = t.UTC()
-	yy, mm, dd := t.Date()
-	hh, mn, ss := t.Clock()
-	day := days[3*t.Weekday():]
-	mon := months[3*(mm-1):]
-
-	return append(b,
-		day[0], day[1], day[2], ',', ' ',
-		byte('0'+dd/10), byte('0'+dd%10), ' ',
-		mon[0], mon[1], mon[2], ' ',
-		byte('0'+yy/1000), byte('0'+(yy/100)%10), byte('0'+(yy/10)%10), byte('0'+yy%10), ' ',
-		byte('0'+hh/10), byte('0'+hh%10), ':',
-		byte('0'+mn/10), byte('0'+mn%10), ':',
-		byte('0'+ss/10), byte('0'+ss%10), ' ',
-		'G', 'M', 'T')
-}
-
-var errTooLarge = errors.New("http: request too large")
-
-// Read next request from connection.
-func (c *conn) readRequest() (w *response, err error) {
-	if c.hijacked() {
-		return nil, ErrHijacked
-	}
-
-	if d := c.server.ReadTimeout; d != 0 {
-		c.rwc.SetReadDeadline(time.Now().Add(d))
-	}
-	if d := c.server.WriteTimeout; d != 0 {
-		defer func() {
-			c.rwc.SetWriteDeadline(time.Now().Add(d))
-		}()
-	}
-
-	c.lr.N = c.server.initialLimitedReaderSize()
-	if c.lastMethod == "POST" {
-		// RFC 2616 section 4.1 tolerance for old buggy clients.
-		peek, _ := c.buf.Reader.Peek(4) // ReadRequest will get err below
-		c.buf.Reader.Discard(numLeadingCRorLF(peek))
-	}
-	var req *Request
-	if req, err = ReadRequest(c.buf.Reader); err != nil {
-		if c.lr.N == 0 {
-			return nil, errTooLarge
-		}
-		return nil, err
-	}
-	c.lr.N = noLimit
-	c.lastMethod = req.Method
-
-	req.RemoteAddr = c.remoteAddr
-	req.TLS = c.tlsState
-	if body, ok := req.Body.(*body); ok {
-		body.doEarlyClose = true
-	}
-
-	w = &response{
-		conn:          c,
-		req:           req,
-		handlerHeader: make(Header),
-		contentLength: -1,
-	}
-	w.cw.res = w
-	w.w = newBufioWriterSize(&w.cw, bufferBeforeChunkingSize)
-	return w, nil
-}
-
-func (w *response) Header() Header {
-	if w.cw.header == nil && w.wroteHeader && !w.cw.wroteHeader {
-		// Accessing the header between logically writing it
-		// and physically writing it means we need to allocate
-		// a clone to snapshot the logically written state.
-		w.cw.header = w.handlerHeader.clone()
-	}
-	w.calledHeader = true
-	return w.handlerHeader
-}
-
-// maxPostHandlerReadBytes is the max number of Request.Body bytes not
-// consumed by a handler that the server will read from the client
-// in order to keep a connection alive.  If there are more bytes than
-// this then the server to be paranoid instead sends a "Connection:
-// close" response.
-//
-// This number is approximately what a typical machine's TCP buffer
-// size is anyway.  (if we have the bytes on the machine, we might as
-// well read them)
-const maxPostHandlerReadBytes = 256 << 10
-
-func (w *response) WriteHeader(code int) {
-	if w.conn.hijacked() {
-		w.conn.server.logf("http: response.WriteHeader on hijacked connection")
-		return
-	}
-	if w.wroteHeader {
-		w.conn.server.logf("http: multiple response.WriteHeader calls")
-		return
-	}
-	w.wroteHeader = true
-	w.status = code
-
-	if w.calledHeader && w.cw.header == nil {
-		w.cw.header = w.handlerHeader.clone()
-	}
-
-	if cl := w.handlerHeader.get("Content-Length"); cl != "" {
-		v, err := strconv.ParseInt(cl, 10, 64)
-		if err == nil && v >= 0 {
-			w.contentLength = v
-		} else {
-			w.conn.server.logf("http: invalid Content-Length of %q", cl)
-			w.handlerHeader.Del("Content-Length")
-		}
-	}
-}
-
-// extraHeader is the set of headers sometimes added by chunkWriter.writeHeader.
-// This type is used to avoid extra allocations from cloning and/or populating
-// the response Header map and all its 1-element slices.
-type extraHeader struct {
-	contentType      string
-	connection       string
-	transferEncoding string
-	date             []byte // written if not nil
-	contentLength    []byte // written if not nil
-}
-
-// Sorted the same as extraHeader.Write's loop.
-var extraHeaderKeys = [][]byte{
-	[]byte("Content-Type"),
-	[]byte("Connection"),
-	[]byte("Transfer-Encoding"),
-}
-
-var (
-	headerContentLength = []byte("Content-Length: ")
-	headerDate          = []byte("Date: ")
-)
-
-// Write writes the headers described in h to w.
-//
-// This method has a value receiver, despite the somewhat large size
-// of h, because it prevents an allocation. The escape analysis isn't
-// smart enough to realize this function doesn't mutate h.
-func (h extraHeader) Write(w *bufio.Writer) {
-	if h.date != nil {
-		w.Write(headerDate)
-		w.Write(h.date)
-		w.Write(crlf)
-	}
-	if h.contentLength != nil {
-		w.Write(headerContentLength)
-		w.Write(h.contentLength)
-		w.Write(crlf)
-	}
-	for i, v := range []string{h.contentType, h.connection, h.transferEncoding} {
-		if v != "" {
-			w.Write(extraHeaderKeys[i])
-			w.Write(colonSpace)
-			w.WriteString(v)
-			w.Write(crlf)
-		}
-	}
-}
-
-// writeHeader finalizes the header sent to the client and writes it
-// to cw.res.conn.buf.
-//
-// p is not written by writeHeader, but is the first chunk of the body
-// that will be written.  It is sniffed for a Content-Type if none is
-// set explicitly.  It's also used to set the Content-Length, if the
-// total body size was small and the handler has already finished
-// running.
-func (cw *chunkWriter) writeHeader(p []byte) {
-	if cw.wroteHeader {
-		return
-	}
-	cw.wroteHeader = true
-
-	w := cw.res
-	keepAlivesEnabled := w.conn.server.doKeepAlives()
-	isHEAD := w.req.Method == "HEAD"
-
-	// header is written out to w.conn.buf below. Depending on the
-	// state of the handler, we either own the map or not. If we
-	// don't own it, the exclude map is created lazily for
-	// WriteSubset to remove headers. The setHeader struct holds
-	// headers we need to add.
-	header := cw.header
-	owned := header != nil
-	if !owned {
-		header = w.handlerHeader
-	}
-	var excludeHeader map[string]bool
-	delHeader := func(key string) {
-		if owned {
-			header.Del(key)
-			return
-		}
-		if _, ok := header[key]; !ok {
-			return
-		}
-		if excludeHeader == nil {
-			excludeHeader = make(map[string]bool)
-		}
-		excludeHeader[key] = true
-	}
-	var setHeader extraHeader
-
-	trailers := false
-	for _, v := range cw.header["Trailer"] {
-		trailers = true
-		foreachHeaderElement(v, cw.res.declareTrailer)
-	}
-
-	te := header.get("Transfer-Encoding")
-	hasTE := te != ""
-
-	// If the handler is done but never sent a Content-Length
-	// response header and this is our first (and last) write, set
-	// it, even to zero. This helps HTTP/1.0 clients keep their
-	// "keep-alive" connections alive.
-	// Exceptions: 304/204/1xx responses never get Content-Length, and if
-	// it was a HEAD request, we don't know the difference between
-	// 0 actual bytes and 0 bytes because the handler noticed it
-	// was a HEAD request and chose not to write anything.  So for
-	// HEAD, the handler should either write the Content-Length or
-	// write non-zero bytes.  If it's actually 0 bytes and the
-	// handler never looked at the Request.Method, we just don't
-	// send a Content-Length header.
-	// Further, we don't send an automatic Content-Length if they
-	// set a Transfer-Encoding, because they're generally incompatible.
-	if w.handlerDone && !trailers && !hasTE && bodyAllowedForStatus(w.status) && header.get("Content-Length") == "" && (!isHEAD || len(p) > 0) {
-		w.contentLength = int64(len(p))
-		setHeader.contentLength = strconv.AppendInt(cw.res.clenBuf[:0], int64(len(p)), 10)
-	}
-
-	// If this was an HTTP/1.0 request with keep-alive and we sent a
-	// Content-Length back, we can make this a keep-alive response ...
-	if w.req.wantsHttp10KeepAlive() && keepAlivesEnabled {
-		sentLength := header.get("Content-Length") != ""
-		if sentLength && header.get("Connection") == "keep-alive" {
-			w.closeAfterReply = false
-		}
-	}
-
-	// Check for a explicit (and valid) Content-Length header.
-	hasCL := w.contentLength != -1
-
-	if w.req.wantsHttp10KeepAlive() && (isHEAD || hasCL) {
-		_, connectionHeaderSet := header["Connection"]
-		if !connectionHeaderSet {
-			setHeader.connection = "keep-alive"
-		}
-	} else if !w.req.ProtoAtLeast(1, 1) || w.req.wantsClose() {
-		w.closeAfterReply = true
-	}
-
-	if header.get("Connection") == "close" || !keepAlivesEnabled {
-		w.closeAfterReply = true
-	}
-
-	// If the client wanted a 100-continue but we never sent it to
-	// them (or, more strictly: we never finished reading their
-	// request body), don't reuse this connection because it's now
-	// in an unknown state: we might be sending this response at
-	// the same time the client is now sending its request body
-	// after a timeout.  (Some HTTP clients send Expect:
-	// 100-continue but knowing that some servers don't support
-	// it, the clients set a timer and send the body later anyway)
-	// If we haven't seen EOF, we can't skip over the unread body
-	// because we don't know if the next bytes on the wire will be
-	// the body-following-the-timer or the subsequent request.
-	// See Issue 11549.
-	if ecr, ok := w.req.Body.(*expectContinueReader); ok && !ecr.sawEOF {
-		w.closeAfterReply = true
-	}
-
-	// Per RFC 2616, we should consume the request body before
-	// replying, if the handler hasn't already done so.  But we
-	// don't want to do an unbounded amount of reading here for
-	// DoS reasons, so we only try up to a threshold.
-	if w.req.ContentLength != 0 && !w.closeAfterReply {
-		var discard, tooBig bool
-
-		switch bdy := w.req.Body.(type) {
-		case *expectContinueReader:
-			if bdy.resp.wroteContinue {
-				discard = true
-			}
-		case *body:
-			bdy.mu.Lock()
-			switch {
-			case bdy.closed:
-				if !bdy.sawEOF {
-					// Body was closed in handler with non-EOF error.
-					w.closeAfterReply = true
-				}
-			case bdy.unreadDataSizeLocked() >= maxPostHandlerReadBytes:
-				tooBig = true
-			default:
-				discard = true
-			}
-			bdy.mu.Unlock()
-		default:
-			discard = true
-		}
-
-		if discard {
-			_, err := io.CopyN(ioutil.Discard, w.req.Body, maxPostHandlerReadBytes+1)
-			switch err {
-			case nil:
-				// There must be even more data left over.
-				tooBig = true
-			case ErrBodyReadAfterClose:
-				// Body was already consumed and closed.
-			case io.EOF:
-				// The remaining body was just consumed, close it.
-				err = w.req.Body.Close()
-				if err != nil {
-					w.closeAfterReply = true
-				}
-			default:
-				// Some other kind of error occured, like a read timeout, or
-				// corrupt chunked encoding. In any case, whatever remains
-				// on the wire must not be parsed as another HTTP request.
-				w.closeAfterReply = true
-			}
-		}
-
-		if tooBig {
-			w.requestTooLarge()
-			delHeader("Connection")
-			setHeader.connection = "close"
-		}
-	}
-
-	code := w.status
-	if bodyAllowedForStatus(code) {
-		// If no content type, apply sniffing algorithm to body.
-		_, haveType := header["Content-Type"]
-		if !haveType && !hasTE {
-			setHeader.contentType = DetectContentType(p)
-		}
-	} else {
-		for _, k := range suppressedHeaders(code) {
-			delHeader(k)
-		}
-	}
-
-	if _, ok := header["Date"]; !ok {
-		setHeader.date = appendTime(cw.res.dateBuf[:0], time.Now())
-	}
-
-	if hasCL && hasTE && te != "identity" {
-		// TODO: return an error if WriteHeader gets a return parameter
-		// For now just ignore the Content-Length.
-		w.conn.server.logf("http: WriteHeader called with both Transfer-Encoding of %q and a Content-Length of %d",
-			te, w.contentLength)
-		delHeader("Content-Length")
-		hasCL = false
-	}
-
-	if w.req.Method == "HEAD" || !bodyAllowedForStatus(code) {
-		// do nothing
-	} else if code == StatusNoContent {
-		delHeader("Transfer-Encoding")
-	} else if hasCL {
-		delHeader("Transfer-Encoding")
-	} else if w.req.ProtoAtLeast(1, 1) {
-		// HTTP/1.1 or greater: Transfer-Encoding has been set to identity,  and no
-		// content-length has been provided. The connection must be closed after the
-		// reply is written, and no chunking is to be done. This is the setup
-		// recommended in the Server-Sent Events candidate recommendation 11,
-		// section 8.
-		if hasTE && te == "identity" {
-			cw.chunking = false
-			w.closeAfterReply = true
-		} else {
-			// HTTP/1.1 or greater: use chunked transfer encoding
-			// to avoid closing the connection at EOF.
-			cw.chunking = true
-			setHeader.transferEncoding = "chunked"
-		}
-	} else {
-		// HTTP version < 1.1: cannot do chunked transfer
-		// encoding and we don't know the Content-Length so
-		// signal EOF by closing connection.
-		w.closeAfterReply = true
-		delHeader("Transfer-Encoding") // in case already set
-	}
-
-	// Cannot use Content-Length with non-identity Transfer-Encoding.
-	if cw.chunking {
-		delHeader("Content-Length")
-	}
-	if !w.req.ProtoAtLeast(1, 0) {
-		return
-	}
-
-	if w.closeAfterReply && (!keepAlivesEnabled || !hasToken(cw.header.get("Connection"), "close")) {
-		delHeader("Connection")
-		if w.req.ProtoAtLeast(1, 1) {
-			setHeader.connection = "close"
-		}
-	}
-
-	w.conn.buf.WriteString(statusLine(w.req, code))
-	cw.header.WriteSubset(w.conn.buf, excludeHeader)
-	setHeader.Write(w.conn.buf.Writer)
-	w.conn.buf.Write(crlf)
-}
-
-// foreachHeaderElement splits v according to the "#rule" construction
-// in RFC 2616 section 2.1 and calls fn for each non-empty element.
-func foreachHeaderElement(v string, fn func(string)) {
-	v = textproto.TrimString(v)
-	if v == "" {
-		return
-	}
-	if !strings.Contains(v, ",") {
-		fn(v)
-		return
-	}
-	for _, f := range strings.Split(v, ",") {
-		if f = textproto.TrimString(f); f != "" {
-			fn(f)
-		}
-	}
-}
-
-// statusLines is a cache of Status-Line strings, keyed by code (for
-// HTTP/1.1) or negative code (for HTTP/1.0). This is faster than a
-// map keyed by struct of two fields. This map's max size is bounded
-// by 2*len(statusText), two protocol types for each known official
-// status code in the statusText map.
-var (
-	statusMu    sync.RWMutex
-	statusLines = make(map[int]string)
-)
-
-// statusLine returns a response Status-Line (RFC 2616 Section 6.1)
-// for the given request and response status code.
-func statusLine(req *Request, code int) string {
-	// Fast path:
-	key := code
-	proto11 := req.ProtoAtLeast(1, 1)
-	if !proto11 {
-		key = -key
-	}
-	statusMu.RLock()
-	line, ok := statusLines[key]
-	statusMu.RUnlock()
-	if ok {
-		return line
-	}
-
-	// Slow path:
-	proto := "HTTP/1.0"
-	if proto11 {
-		proto = "HTTP/1.1"
-	}
-	codestring := strconv.Itoa(code)
-	text, ok := statusText[code]
-	if !ok {
-		text = "status code " + codestring
-	}
-	line = proto + " " + codestring + " " + text + "\r\n"
-	if ok {
-		statusMu.Lock()
-		defer statusMu.Unlock()
-		statusLines[key] = line
-	}
-	return line
-}
-
-// bodyAllowed reports whether a Write is allowed for this response type.
-// It's illegal to call this before the header has been flushed.
-func (w *response) bodyAllowed() bool {
-	if !w.wroteHeader {
-		panic("")
-	}
-	return bodyAllowedForStatus(w.status)
-}
-
-// The Life Of A Write is like this:
-//
-// Handler starts. No header has been sent. The handler can either
-// write a header, or just start writing.  Writing before sending a header
-// sends an implicitly empty 200 OK header.
-//
-// If the handler didn't declare a Content-Length up front, we either
-// go into chunking mode or, if the handler finishes running before
-// the chunking buffer size, we compute a Content-Length and send that
-// in the header instead.
-//
-// Likewise, if the handler didn't set a Content-Type, we sniff that
-// from the initial chunk of output.
-//
-// The Writers are wired together like:
-//
-// 1. *response (the ResponseWriter) ->
-// 2. (*response).w, a *bufio.Writer of bufferBeforeChunkingSize bytes
-// 3. chunkWriter.Writer (whose writeHeader finalizes Content-Length/Type)
-//    and which writes the chunk headers, if needed.
-// 4. conn.buf, a bufio.Writer of default (4kB) bytes, writing to ->
-// 5. checkConnErrorWriter{c}, which notes any non-nil error on Write
-//    and populates c.werr with it if so. but otherwise writes to:
-// 6. the rwc, the net.Conn.
-//
-// TODO(bradfitz): short-circuit some of the buffering when the
-// initial header contains both a Content-Type and Content-Length.
-// Also short-circuit in (1) when the header's been sent and not in
-// chunking mode, writing directly to (4) instead, if (2) has no
-// buffered data.  More generally, we could short-circuit from (1) to
-// (3) even in chunking mode if the write size from (1) is over some
-// threshold and nothing is in (2).  The answer might be mostly making
-// bufferBeforeChunkingSize smaller and having bufio's fast-paths deal
-// with this instead.
-func (w *response) Write(data []byte) (n int, err error) {
-	return w.write(len(data), data, "")
-}
-
-func (w *response) WriteString(data string) (n int, err error) {
-	return w.write(len(data), nil, data)
-}
-
-// either dataB or dataS is non-zero.
-func (w *response) write(lenData int, dataB []byte, dataS string) (n int, err error) {
-	if w.conn.hijacked() {
-		w.conn.server.logf("http: response.Write on hijacked connection")
-		return 0, ErrHijacked
-	}
-	if !w.wroteHeader {
-		w.WriteHeader(StatusOK)
-	}
-	if lenData == 0 {
-		return 0, nil
-	}
-	if !w.bodyAllowed() {
-		return 0, ErrBodyNotAllowed
-	}
-
-	w.written += int64(lenData) // ignoring errors, for errorKludge
-	if w.contentLength != -1 && w.written > w.contentLength {
-		return 0, ErrContentLength
-	}
-	if dataB != nil {
-		return w.w.Write(dataB)
-	} else {
-		return w.w.WriteString(dataS)
-	}
-}
-
-func (w *response) finishRequest() {
-	w.handlerDone = true
-
-	if !w.wroteHeader {
-		w.WriteHeader(StatusOK)
-	}
-
-	w.w.Flush()
-	putBufioWriter(w.w)
-	w.cw.close()
-	w.conn.buf.Flush()
-
-	// Close the body (regardless of w.closeAfterReply) so we can
-	// re-use its bufio.Reader later safely.
-	w.req.Body.Close()
-
-	if w.req.MultipartForm != nil {
-		w.req.MultipartForm.RemoveAll()
-	}
-}
-
-// shouldReuseConnection reports whether the underlying TCP connection can be reused.
-// It must only be called after the handler is done executing.
-func (w *response) shouldReuseConnection() bool {
-	if w.closeAfterReply {
-		// The request or something set while executing the
-		// handler indicated we shouldn't reuse this
-		// connection.
-		return false
-	}
-
-	if w.req.Method != "HEAD" && w.contentLength != -1 && w.bodyAllowed() && w.contentLength != w.written {
-		// Did not write enough. Avoid getting out of sync.
-		return false
-	}
-
-	// There was some error writing to the underlying connection
-	// during the request, so don't re-use this conn.
-	if w.conn.werr != nil {
-		return false
-	}
-
-	if w.closedRequestBodyEarly() {
-		return false
-	}
-
-	return true
-}
-
-func (w *response) closedRequestBodyEarly() bool {
-	body, ok := w.req.Body.(*body)
-	return ok && body.didEarlyClose()
-}
-
-func (w *response) Flush() {
-	if !w.wroteHeader {
-		w.WriteHeader(StatusOK)
-	}
-	w.w.Flush()
-	w.cw.flush()
-}
-
-func (c *conn) finalFlush() {
-	if c.buf != nil {
-		c.buf.Flush()
-
-		// Steal the bufio.Reader (~4KB worth of memory) and its associated
-		// reader for a future connection.
-		putBufioReader(c.buf.Reader)
-
-		// Steal the bufio.Writer (~4KB worth of memory) and its associated
-		// writer for a future connection.
-		putBufioWriter(c.buf.Writer)
-
-		c.buf = nil
-	}
-}
-
-// Close the connection.
-func (c *conn) close() {
-	c.finalFlush()
-	if c.rwc != nil {
-		c.rwc.Close()
-		c.rwc = nil
-	}
-}
-
-// rstAvoidanceDelay is the amount of time we sleep after closing the
-// write side of a TCP connection before closing the entire socket.
-// By sleeping, we increase the chances that the client sees our FIN
-// and processes its final data before they process the subsequent RST
-// from closing a connection with known unread data.
-// This RST seems to occur mostly on BSD systems. (And Windows?)
-// This timeout is somewhat arbitrary (~latency around the planet).
-const rstAvoidanceDelay = 500 * time.Millisecond
-
-type closeWriter interface {
-	CloseWrite() error
-}
-
-var _ closeWriter = (*net.TCPConn)(nil)
-
-// closeWrite flushes any outstanding data and sends a FIN packet (if
-// client is connected via TCP), signalling that we're done.  We then
-// pause for a bit, hoping the client processes it before any
-// subsequent RST.
-//
-// See https://golang.org/issue/3595
-func (c *conn) closeWriteAndWait() {
-	c.finalFlush()
-	if tcp, ok := c.rwc.(closeWriter); ok {
-		tcp.CloseWrite()
-	}
-	time.Sleep(rstAvoidanceDelay)
-}
-
-// validNPN reports whether the proto is not a blacklisted Next
-// Protocol Negotiation protocol.  Empty and built-in protocol types
-// are blacklisted and can't be overridden with alternate
-// implementations.
-func validNPN(proto string) bool {
-	switch proto {
-	case "", "http/1.1", "http/1.0":
-		return false
-	}
-	return true
-}
-
-func (c *conn) setState(nc net.Conn, state ConnState) {
-	if hook := c.server.ConnState; hook != nil {
-		hook(nc, state)
-	}
-}
-
-// Serve a new connection.
-func (c *conn) serve() {
-	origConn := c.rwc // copy it before it's set nil on Close or Hijack
-	defer func() {
-		if err := recover(); err != nil {
-			const size = 64 << 10
-			buf := make([]byte, size)
-			buf = buf[:runtime.Stack(buf, false)]
-			c.server.logf("http: panic serving %v: %v\n%s", c.remoteAddr, err, buf)
-		}
-		if !c.hijacked() {
-			c.close()
-			c.setState(origConn, StateClosed)
-		}
-	}()
-
-	if tlsConn, ok := c.rwc.(*tls.Conn); ok {
-		if d := c.server.ReadTimeout; d != 0 {
-			c.rwc.SetReadDeadline(time.Now().Add(d))
-		}
-		if d := c.server.WriteTimeout; d != 0 {
-			c.rwc.SetWriteDeadline(time.Now().Add(d))
-		}
-		if err := tlsConn.Handshake(); err != nil {
-			c.server.logf("http: TLS handshake error from %s: %v", c.rwc.RemoteAddr(), err)
-			return
-		}
-		c.tlsState = new(tls.ConnectionState)
-		*c.tlsState = tlsConn.ConnectionState()
-		if proto := c.tlsState.NegotiatedProtocol; validNPN(proto) {
-			if fn := c.server.TLSNextProto[proto]; fn != nil {
-				h := initNPNRequest{tlsConn, serverHandler{c.server}}
-				fn(c.server, tlsConn, h)
-			}
-			return
-		}
-	}
-
-	for {
-		w, err := c.readRequest()
-		if c.lr.N != c.server.initialLimitedReaderSize() {
-			// If we read any bytes off the wire, we're active.
-			c.setState(c.rwc, StateActive)
-		}
-		if err != nil {
-			if err == errTooLarge {
-				// Their HTTP client may or may not be
-				// able to read this if we're
-				// responding to them and hanging up
-				// while they're still writing their
-				// request.  Undefined behavior.
-				io.WriteString(c.rwc, "HTTP/1.1 413 Request Entity Too Large\r\n\r\n")
-				c.closeWriteAndWait()
-				break
-			} else if err == io.EOF {
-				break // Don't reply
-			} else if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
-				break // Don't reply
-			}
-			io.WriteString(c.rwc, "HTTP/1.1 400 Bad Request\r\n\r\n")
-			break
-		}
-
-		// Expect 100 Continue support
-		req := w.req
-		if req.expectsContinue() {
-			if req.ProtoAtLeast(1, 1) && req.ContentLength != 0 {
-				// Wrap the Body reader with one that replies on the connection
-				req.Body = &expectContinueReader{readCloser: req.Body, resp: w}
-			}
-			req.Header.Del("Expect")
-		} else if req.Header.get("Expect") != "" {
-			w.sendExpectationFailed()
-			break
-		}
-
-		// HTTP cannot have multiple simultaneous active requests.[*]
-		// Until the server replies to this request, it can't read another,
-		// so we might as well run the handler in this goroutine.
-		// [*] Not strictly true: HTTP pipelining.  We could let them all process
-		// in parallel even if their responses need to be serialized.
-		serverHandler{c.server}.ServeHTTP(w, w.req)
-		if c.hijacked() {
-			return
-		}
-		w.finishRequest()
-		if !w.shouldReuseConnection() {
-			if w.requestBodyLimitHit || w.closedRequestBodyEarly() {
-				c.closeWriteAndWait()
-			}
-			break
-		}
-		c.setState(c.rwc, StateIdle)
-	}
-}
-
-func (w *response) sendExpectationFailed() {
-	// TODO(bradfitz): let ServeHTTP handlers handle
-	// requests with non-standard expectation[s]? Seems
-	// theoretical at best, and doesn't fit into the
-	// current ServeHTTP model anyway.  We'd need to
-	// make the ResponseWriter an optional
-	// "ExpectReplier" interface or something.
-	//
-	// For now we'll just obey RFC 2616 14.20 which says
-	// "If a server receives a request containing an
-	// Expect field that includes an expectation-
-	// extension that it does not support, it MUST
-	// respond with a 417 (Expectation Failed) status."
-	w.Header().Set("Connection", "close")
-	w.WriteHeader(StatusExpectationFailed)
-	w.finishRequest()
-}
-
-// Hijack implements the Hijacker.Hijack method. Our response is both a ResponseWriter
-// and a Hijacker.
-func (w *response) Hijack() (rwc net.Conn, buf *bufio.ReadWriter, err error) {
-	if w.wroteHeader {
-		w.cw.flush()
-	}
-	// Release the bufioWriter that writes to the chunk writer, it is not
-	// used after a connection has been hijacked.
-	rwc, buf, err = w.conn.hijack()
-	if err == nil {
-		putBufioWriter(w.w)
-		w.w = nil
-	}
-	return rwc, buf, err
-}
-
-func (w *response) CloseNotify() <-chan bool {
-	return w.conn.closeNotify()
-}
-
-// The HandlerFunc type is an adapter to allow the use of
-// ordinary functions as HTTP handlers.  If f is a function
-// with the appropriate signature, HandlerFunc(f) is a
-// Handler object that calls f.
-type HandlerFunc func(ResponseWriter, *Request)
-
-// ServeHTTP calls f(w, r).
-func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
-	f(w, r)
-}
-
-// Helper handlers
-
-// Error replies to the request with the specified error message and HTTP code.
-// The error message should be plain text.
-func Error(w ResponseWriter, error string, code int) {
-	w.Header().Set("Content-Type", "text/plain; charset=utf-8")
-	w.Header().Set("X-Content-Type-Options", "nosniff")
-	w.WriteHeader(code)
-	fmt.Fprintln(w, error)
-}
-
-// NotFound replies to the request with an HTTP 404 not found error.
-func NotFound(w ResponseWriter, r *Request) { Error(w, "404 page not found", StatusNotFound) }
-
-// NotFoundHandler returns a simple request handler
-// that replies to each request with a ``404 page not found'' reply.
-func NotFoundHandler() Handler { return HandlerFunc(NotFound) }
-
-// StripPrefix returns a handler that serves HTTP requests
-// by removing the given prefix from the request URL's Path
-// and invoking the handler h. StripPrefix handles a
-// request for a path that doesn't begin with prefix by
-// replying with an HTTP 404 not found error.
-func StripPrefix(prefix string, h Handler) Handler {
-	if prefix == "" {
-		return h
-	}
-	return HandlerFunc(func(w ResponseWriter, r *Request) {
-		if p := strings.TrimPrefix(r.URL.Path, prefix); len(p) < len(r.URL.Path) {
-			r.URL.Path = p
-			h.ServeHTTP(w, r)
-		} else {
-			NotFound(w, r)
-		}
-	})
-}
-
-// Redirect replies to the request with a redirect to url,
-// which may be a path relative to the request path.
-func Redirect(w ResponseWriter, r *Request, urlStr string, code int) {
-	if u, err := url.Parse(urlStr); err == nil {
-		// If url was relative, make absolute by
-		// combining with request path.
-		// The browser would probably do this for us,
-		// but doing it ourselves is more reliable.
-
-		// NOTE(rsc): RFC 2616 says that the Location
-		// line must be an absolute URI, like
-		// "http://www.google.com/redirect/",
-		// not a path like "/redirect/".
-		// Unfortunately, we don't know what to
-		// put in the host name section to get the
-		// client to connect to us again, so we can't
-		// know the right absolute URI to send back.
-		// Because of this problem, no one pays attention
-		// to the RFC; they all send back just a new path.
-		// So do we.
-		oldpath := r.URL.Path
-		if oldpath == "" { // should not happen, but avoid a crash if it does
-			oldpath = "/"
-		}
-		if u.Scheme == "" {
-			// no leading http://server
-			if urlStr == "" || urlStr[0] != '/' {
-				// make relative path absolute
-				olddir, _ := path.Split(oldpath)
-				urlStr = olddir + urlStr
-			}
-
-			var query string
-			if i := strings.Index(urlStr, "?"); i != -1 {
-				urlStr, query = urlStr[:i], urlStr[i:]
-			}
-
-			// clean up but preserve trailing slash
-			trailing := strings.HasSuffix(urlStr, "/")
-			urlStr = path.Clean(urlStr)
-			if trailing && !strings.HasSuffix(urlStr, "/") {
-				urlStr += "/"
-			}
-			urlStr += query
-		}
-	}
-
-	w.Header().Set("Location", urlStr)
-	w.WriteHeader(code)
-
-	// RFC2616 recommends that a short note "SHOULD" be included in the
-	// response because older user agents may not understand 301/307.
-	// Shouldn't send the response for POST or HEAD; that leaves GET.
-	if r.Method == "GET" {
-		note := "<a href=\"" + htmlEscape(urlStr) + "\">" + statusText[code] + "</a>.\n"
-		fmt.Fprintln(w, note)
-	}
-}
-
-var htmlReplacer = strings.NewReplacer(
-	"&", "&amp;",
-	"<", "&lt;",
-	">", "&gt;",
-	// "&#34;" is shorter than "&quot;".
-	`"`, "&#34;",
-	// "&#39;" is shorter than "&apos;" and apos was not in HTML until HTML5.
-	"'", "&#39;",
-)
-
-func htmlEscape(s string) string {
-	return htmlReplacer.Replace(s)
-}
-
-// Redirect to a fixed URL
-type redirectHandler struct {
-	url  string
-	code int
-}
-
-func (rh *redirectHandler) ServeHTTP(w ResponseWriter, r *Request) {
-	Redirect(w, r, rh.url, rh.code)
-}
-
-// RedirectHandler returns a request handler that redirects
-// each request it receives to the given url using the given
-// status code.
-func RedirectHandler(url string, code int) Handler {
-	return &redirectHandler{url, code}
-}
-
-// ServeMux is an HTTP request multiplexer.
-// It matches the URL of each incoming request against a list of registered
-// patterns and calls the handler for the pattern that
-// most closely matches the URL.
-//
-// Patterns name fixed, rooted paths, like "/favicon.ico",
-// or rooted subtrees, like "/images/" (note the trailing slash).
-// Longer patterns take precedence over shorter ones, so that
-// if there are handlers registered for both "/images/"
-// and "/images/thumbnails/", the latter handler will be
-// called for paths beginning "/images/thumbnails/" and the
-// former will receive requests for any other paths in the
-// "/images/" subtree.
-//
-// Note that since a pattern ending in a slash names a rooted subtree,
-// the pattern "/" matches all paths not matched by other registered
-// patterns, not just the URL with Path == "/".
-//
-// Patterns may optionally begin with a host name, restricting matches to
-// URLs on that host only.  Host-specific patterns take precedence over
-// general patterns, so that a handler might register for the two patterns
-// "/codesearch" and "codesearch.google.com/" without also taking over
-// requests for "http://www.google.com/".
-//
-// ServeMux also takes care of sanitizing the URL request path,
-// redirecting any request containing . or .. elements to an
-// equivalent .- and ..-free URL.
-type ServeMux struct {
-	mu    sync.RWMutex
-	m     map[string]muxEntry
-	hosts bool // whether any patterns contain hostnames
-}
-
-type muxEntry struct {
-	explicit bool
-	h        Handler
-	pattern  string
-}
-
-// NewServeMux allocates and returns a new ServeMux.
-func NewServeMux() *ServeMux { return &ServeMux{m: make(map[string]muxEntry)} }
-
-// DefaultServeMux is the default ServeMux used by Serve.
-var DefaultServeMux = NewServeMux()
-
-// Does path match pattern?
-func pathMatch(pattern, path string) bool {
-	if len(pattern) == 0 {
-		// should not happen
-		return false
-	}
-	n := len(pattern)
-	if pattern[n-1] != '/' {
-		return pattern == path
-	}
-	return len(path) >= n && path[0:n] == pattern
-}
-
-// Return the canonical path for p, eliminating . and .. elements.
-func cleanPath(p string) string {
-	if p == "" {
-		return "/"
-	}
-	if p[0] != '/' {
-		p = "/" + p
-	}
-	np := path.Clean(p)
-	// path.Clean removes trailing slash except for root;
-	// put the trailing slash back if necessary.
-	if p[len(p)-1] == '/' && np != "/" {
-		np += "/"
-	}
-	return np
-}
-
-// Find a handler on a handler map given a path string
-// Most-specific (longest) pattern wins
-func (mux *ServeMux) match(path string) (h Handler, pattern string) {
-	var n = 0
-	for k, v := range mux.m {
-		if !pathMatch(k, path) {
-			continue
-		}
-		if h == nil || len(k) > n {
-			n = len(k)
-			h = v.h
-			pattern = v.pattern
-		}
-	}
-	return
-}
-
-// Handler returns the handler to use for the given request,
-// consulting r.Method, r.Host, and r.URL.Path. It always returns
-// a non-nil handler. If the path is not in its canonical form, the
-// handler will be an internally-generated handler that redirects
-// to the canonical path.
-//
-// Handler also returns the registered pattern that matches the
-// request or, in the case of internally-generated redirects,
-// the pattern that will match after following the redirect.
-//
-// If there is no registered handler that applies to the request,
-// Handler returns a ``page not found'' handler and an empty pattern.
-func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string) {
-	if r.Method != "CONNECT" {
-		if p := cleanPath(r.URL.Path); p != r.URL.Path {
-			_, pattern = mux.handler(r.Host, p)
-			url := *r.URL
-			url.Path = p
-			return RedirectHandler(url.String(), StatusMovedPermanently), pattern
-		}
-	}
-
-	return mux.handler(r.Host, r.URL.Path)
-}
-
-// handler is the main implementation of Handler.
-// The path is known to be in canonical form, except for CONNECT methods.
-func (mux *ServeMux) handler(host, path string) (h Handler, pattern string) {
-	mux.mu.RLock()
-	defer mux.mu.RUnlock()
-
-	// Host-specific pattern takes precedence over generic ones
-	if mux.hosts {
-		h, pattern = mux.match(host + path)
-	}
-	if h == nil {
-		h, pattern = mux.match(path)
-	}
-	if h == nil {
-		h, pattern = NotFoundHandler(), ""
-	}
-	return
-}
-
-// ServeHTTP dispatches the request to the handler whose
-// pattern most closely matches the request URL.
-func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request) {
-	if r.RequestURI == "*" {
-		if r.ProtoAtLeast(1, 1) {
-			w.Header().Set("Connection", "close")
-		}
-		w.WriteHeader(StatusBadRequest)
-		return
-	}
-	h, _ := mux.Handler(r)
-	h.ServeHTTP(w, r)
-}
-
-// Handle registers the handler for the given pattern.
-// If a handler already exists for pattern, Handle panics.
-func (mux *ServeMux) Handle(pattern string, handler Handler) {
-	mux.mu.Lock()
-	defer mux.mu.Unlock()
-
-	if pattern == "" {
-		panic("http: invalid pattern " + pattern)
-	}
-	if handler == nil {
-		panic("http: nil handler")
-	}
-	if mux.m[pattern].explicit {
-		panic("http: multiple registrations for " + pattern)
-	}
-
-	mux.m[pattern] = muxEntry{explicit: true, h: handler, pattern: pattern}
-
-	if pattern[0] != '/' {
-		mux.hosts = true
-	}
-
-	// Helpful behavior:
-	// If pattern is /tree/, insert an implicit permanent redirect for /tree.
-	// It can be overridden by an explicit registration.
-	n := len(pattern)
-	if n > 0 && pattern[n-1] == '/' && !mux.m[pattern[0:n-1]].explicit {
-		// If pattern contains a host name, strip it and use remaining
-		// path for redirect.
-		path := pattern
-		if pattern[0] != '/' {
-			// In pattern, at least the last character is a '/', so
-			// strings.Index can't be -1.
-			path = pattern[strings.Index(pattern, "/"):]
-		}
-		url := &url.URL{Path: path}
-		mux.m[pattern[0:n-1]] = muxEntry{h: RedirectHandler(url.String(), StatusMovedPermanently), pattern: pattern}
-	}
-}
-
-// HandleFunc registers the handler function for the given pattern.
-func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
-	mux.Handle(pattern, HandlerFunc(handler))
-}
-
-// Handle registers the handler for the given pattern
-// in the DefaultServeMux.
-// The documentation for ServeMux explains how patterns are matched.
-func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
-
-// HandleFunc registers the handler function for the given pattern
-// in the DefaultServeMux.
-// The documentation for ServeMux explains how patterns are matched.
-func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
-	DefaultServeMux.HandleFunc(pattern, handler)
-}
-
-// Serve accepts incoming HTTP connections on the listener l,
-// creating a new service goroutine for each.  The service goroutines
-// read requests and then call handler to reply to them.
-// Handler is typically nil, in which case the DefaultServeMux is used.
-func Serve(l net.Listener, handler Handler) error {
-	srv := &Server{Handler: handler}
-	return srv.Serve(l)
-}
-
-// A Server defines parameters for running an HTTP server.
-// The zero value for Server is a valid configuration.
-type Server struct {
-	Addr           string        // TCP address to listen on, ":http" if empty
-	Handler        Handler       // handler to invoke, http.DefaultServeMux if nil
-	ReadTimeout    time.Duration // maximum duration before timing out read of the request
-	WriteTimeout   time.Duration // maximum duration before timing out write of the response
-	MaxHeaderBytes int           // maximum size of request headers, DefaultMaxHeaderBytes if 0
-	TLSConfig      *tls.Config   // optional TLS config, used by ListenAndServeTLS
-
-	// TLSNextProto optionally specifies a function to take over
-	// ownership of the provided TLS connection when an NPN
-	// protocol upgrade has occurred.  The map key is the protocol
-	// name negotiated. The Handler argument should be used to
-	// handle HTTP requests and will initialize the Request's TLS
-	// and RemoteAddr if not already set.  The connection is
-	// automatically closed when the function returns.
-	TLSNextProto map[string]func(*Server, *tls.Conn, Handler)
-
-	// ConnState specifies an optional callback function that is
-	// called when a client connection changes state. See the
-	// ConnState type and associated constants for details.
-	ConnState func(net.Conn, ConnState)
-
-	// ErrorLog specifies an optional logger for errors accepting
-	// connections and unexpected behavior from handlers.
-	// If nil, logging goes to os.Stderr via the log package's
-	// standard logger.
-	ErrorLog *log.Logger
-
-	disableKeepAlives int32 // accessed atomically.
-}
-
-// A ConnState represents the state of a client connection to a server.
-// It's used by the optional Server.ConnState hook.
-type ConnState int
-
-const (
-	// StateNew represents a new connection that is expected to
-	// send a request immediately. Connections begin at this
-	// state and then transition to either StateActive or
-	// StateClosed.
-	StateNew ConnState = iota
-
-	// StateActive represents a connection that has read 1 or more
-	// bytes of a request. The Server.ConnState hook for
-	// StateActive fires before the request has entered a handler
-	// and doesn't fire again until the request has been
-	// handled. After the request is handled, the state
-	// transitions to StateClosed, StateHijacked, or StateIdle.
-	StateActive
-
-	// StateIdle represents a connection that has finished
-	// handling a request and is in the keep-alive state, waiting
-	// for a new request. Connections transition from StateIdle
-	// to either StateActive or StateClosed.
-	StateIdle
-
-	// StateHijacked represents a hijacked connection.
-	// This is a terminal state. It does not transition to StateClosed.
-	StateHijacked
-
-	// StateClosed represents a closed connection.
-	// This is a terminal state. Hijacked connections do not
-	// transition to StateClosed.
-	StateClosed
-)
-
-var stateName = map[ConnState]string{
-	StateNew:      "new",
-	StateActive:   "active",
-	StateIdle:     "idle",
-	StateHijacked: "hijacked",
-	StateClosed:   "closed",
-}
-
-func (c ConnState) String() string {
-	return stateName[c]
-}
-
-// serverHandler delegates to either the server's Handler or
-// DefaultServeMux and also handles "OPTIONS *" requests.
-type serverHandler struct {
-	srv *Server
-}
-
-func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) {
-	handler := sh.srv.Handler
-	if handler == nil {
-		handler = DefaultServeMux
-	}
-	if req.RequestURI == "*" && req.Method == "OPTIONS" {
-		handler = globalOptionsHandler{}
-	}
-	handler.ServeHTTP(rw, req)
-}
-
-// ListenAndServe listens on the TCP network address srv.Addr and then
-// calls Serve to handle requests on incoming connections.  If
-// srv.Addr is blank, ":http" is used.
-func (srv *Server) ListenAndServe() error {
-	addr := srv.Addr
-	if addr == "" {
-		addr = ":http"
-	}
-	ln, err := net.Listen("tcp", addr)
-	if err != nil {
-		return err
-	}
-	return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})
-}
-
-// Serve accepts incoming connections on the Listener l, creating a
-// new service goroutine for each.  The service goroutines read requests and
-// then call srv.Handler to reply to them.
-func (srv *Server) Serve(l net.Listener) error {
-	defer l.Close()
-	var tempDelay time.Duration // how long to sleep on accept failure
-	for {
-		rw, e := l.Accept()
-		if e != nil {
-			if ne, ok := e.(net.Error); ok && ne.Temporary() {
-				if tempDelay == 0 {
-					tempDelay = 5 * time.Millisecond
-				} else {
-					tempDelay *= 2
-				}
-				if max := 1 * time.Second; tempDelay > max {
-					tempDelay = max
-				}
-				srv.logf("http: Accept error: %v; retrying in %v", e, tempDelay)
-				time.Sleep(tempDelay)
-				continue
-			}
-			return e
-		}
-		tempDelay = 0
-		c, err := srv.newConn(rw)
-		if err != nil {
-			continue
-		}
-		c.setState(c.rwc, StateNew) // before Serve can return
-		go c.serve()
-	}
-}
-
-func (s *Server) doKeepAlives() bool {
-	return atomic.LoadInt32(&s.disableKeepAlives) == 0
-}
-
-// SetKeepAlivesEnabled controls whether HTTP keep-alives are enabled.
-// By default, keep-alives are always enabled. Only very
-// resource-constrained environments or servers in the process of
-// shutting down should disable them.
-func (srv *Server) SetKeepAlivesEnabled(v bool) {
-	if v {
-		atomic.StoreInt32(&srv.disableKeepAlives, 0)
-	} else {
-		atomic.StoreInt32(&srv.disableKeepAlives, 1)
-	}
-}
-
-func (s *Server) logf(format string, args ...interface{}) {
-	if s.ErrorLog != nil {
-		s.ErrorLog.Printf(format, args...)
-	} else {
-		log.Printf(format, args...)
-	}
-}
-
-// ListenAndServe listens on the TCP network address addr
-// and then calls Serve with handler to handle requests
-// on incoming connections.  Handler is typically nil,
-// in which case the DefaultServeMux is used.
-//
-// A trivial example server is:
-//
-//	package main
-//
-//	import (
-//		"io"
-//		"net/http"
-//		"log"
-//	)
-//
-//	// hello world, the web server
-//	func HelloServer(w http.ResponseWriter, req *http.Request) {
-//		io.WriteString(w, "hello, world!\n")
-//	}
-//
-//	func main() {
-//		http.HandleFunc("/hello", HelloServer)
-//		err := http.ListenAndServe(":12345", nil)
-//		if err != nil {
-//			log.Fatal("ListenAndServe: ", err)
-//		}
-//	}
-func ListenAndServe(addr string, handler Handler) error {
-	server := &Server{Addr: addr, Handler: handler}
-	return server.ListenAndServe()
-}
-
-// ListenAndServeTLS acts identically to ListenAndServe, except that it
-// expects HTTPS connections. Additionally, files containing a certificate and
-// matching private key for the server must be provided. If the certificate
-// is signed by a certificate authority, the certFile should be the concatenation
-// of the server's certificate, any intermediates, and the CA's certificate.
-//
-// A trivial example server is:
-//
-//	import (
-//		"log"
-//		"net/http"
-//	)
-//
-//	func handler(w http.ResponseWriter, req *http.Request) {
-//		w.Header().Set("Content-Type", "text/plain")
-//		w.Write([]byte("This is an example server.\n"))
-//	}
-//
-//	func main() {
-//		http.HandleFunc("/", handler)
-//		log.Printf("About to listen on 10443. Go to https://127.0.0.1:10443/")
-//		err := http.ListenAndServeTLS(":10443", "cert.pem", "key.pem", nil)
-//		if err != nil {
-//			log.Fatal(err)
-//		}
-//	}
-//
-// One can use generate_cert.go in crypto/tls to generate cert.pem and key.pem.
-func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) error {
-	server := &Server{Addr: addr, Handler: handler}
-	return server.ListenAndServeTLS(certFile, keyFile)
-}
-
-// ListenAndServeTLS listens on the TCP network address srv.Addr and
-// then calls Serve to handle requests on incoming TLS connections.
-//
-// Filenames containing a certificate and matching private key for the
-// server must be provided if the Server's TLSConfig.Certificates is
-// not populated. If the certificate is signed by a certificate
-// authority, the certFile should be the concatenation of the server's
-// certificate, any intermediates, and the CA's certificate.
-//
-// If srv.Addr is blank, ":https" is used.
-func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error {
-	addr := srv.Addr
-	if addr == "" {
-		addr = ":https"
-	}
-	config := cloneTLSConfig(srv.TLSConfig)
-	if config.NextProtos == nil {
-		config.NextProtos = []string{"http/1.1"}
-	}
-
-	if len(config.Certificates) == 0 || certFile != "" || keyFile != "" {
-		var err error
-		config.Certificates = make([]tls.Certificate, 1)
-		config.Certificates[0], err = tls.LoadX509KeyPair(certFile, keyFile)
-		if err != nil {
-			return err
-		}
-	}
-
-	ln, err := net.Listen("tcp", addr)
-	if err != nil {
-		return err
-	}
-
-	tlsListener := tls.NewListener(tcpKeepAliveListener{ln.(*net.TCPListener)}, config)
-	return srv.Serve(tlsListener)
-}
-
-// TimeoutHandler returns a Handler that runs h with the given time limit.
-//
-// The new Handler calls h.ServeHTTP to handle each request, but if a
-// call runs for longer than its time limit, the handler responds with
-// a 503 Service Unavailable error and the given message in its body.
-// (If msg is empty, a suitable default message will be sent.)
-// After such a timeout, writes by h to its ResponseWriter will return
-// ErrHandlerTimeout.
-func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler {
-	f := func() <-chan time.Time {
-		return time.After(dt)
-	}
-	return &timeoutHandler{h, f, msg}
-}
-
-// ErrHandlerTimeout is returned on ResponseWriter Write calls
-// in handlers which have timed out.
-var ErrHandlerTimeout = errors.New("http: Handler timeout")
-
-type timeoutHandler struct {
-	handler Handler
-	timeout func() <-chan time.Time // returns channel producing a timeout
-	body    string
-}
-
-func (h *timeoutHandler) errorBody() string {
-	if h.body != "" {
-		return h.body
-	}
-	return "<html><head><title>Timeout</title></head><body><h1>Timeout</h1></body></html>"
-}
-
-func (h *timeoutHandler) ServeHTTP(w ResponseWriter, r *Request) {
-	done := make(chan bool, 1)
-	tw := &timeoutWriter{w: w}
-	go func() {
-		h.handler.ServeHTTP(tw, r)
-		done <- true
-	}()
-	select {
-	case <-done:
-		return
-	case <-h.timeout():
-		tw.mu.Lock()
-		defer tw.mu.Unlock()
-		if !tw.wroteHeader {
-			tw.w.WriteHeader(StatusServiceUnavailable)
-			tw.w.Write([]byte(h.errorBody()))
-		}
-		tw.timedOut = true
-	}
-}
-
-type timeoutWriter struct {
-	w ResponseWriter
-
-	mu          sync.Mutex
-	timedOut    bool
-	wroteHeader bool
-}
-
-func (tw *timeoutWriter) Header() Header {
-	return tw.w.Header()
-}
-
-func (tw *timeoutWriter) Write(p []byte) (int, error) {
-	tw.mu.Lock()
-	defer tw.mu.Unlock()
-	tw.wroteHeader = true // implicitly at least
-	if tw.timedOut {
-		return 0, ErrHandlerTimeout
-	}
-	return tw.w.Write(p)
-}
-
-func (tw *timeoutWriter) WriteHeader(code int) {
-	tw.mu.Lock()
-	defer tw.mu.Unlock()
-	if tw.timedOut || tw.wroteHeader {
-		return
-	}
-	tw.wroteHeader = true
-	tw.w.WriteHeader(code)
-}
-
-// tcpKeepAliveListener sets TCP keep-alive timeouts on accepted
-// connections. It's used by ListenAndServe and ListenAndServeTLS so
-// dead TCP connections (e.g. closing laptop mid-download) eventually
-// go away.
-type tcpKeepAliveListener struct {
-	*net.TCPListener
-}
-
-func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) {
-	tc, err := ln.AcceptTCP()
-	if err != nil {
-		return
-	}
-	tc.SetKeepAlive(true)
-	tc.SetKeepAlivePeriod(3 * time.Minute)
-	return tc, nil
-}
-
-// globalOptionsHandler responds to "OPTIONS *" requests.
-type globalOptionsHandler struct{}
-
-func (globalOptionsHandler) ServeHTTP(w ResponseWriter, r *Request) {
-	w.Header().Set("Content-Length", "0")
-	if r.ContentLength != 0 {
-		// Read up to 4KB of OPTIONS body (as mentioned in the
-		// spec as being reserved for future use), but anything
-		// over that is considered a waste of server resources
-		// (or an attack) and we abort and close the connection,
-		// courtesy of MaxBytesReader's EOF behavior.
-		mb := MaxBytesReader(w, r.Body, 4<<10)
-		io.Copy(ioutil.Discard, mb)
-	}
-}
-
-type eofReaderWithWriteTo struct{}
-
-func (eofReaderWithWriteTo) WriteTo(io.Writer) (int64, error) { return 0, nil }
-func (eofReaderWithWriteTo) Read([]byte) (int, error)         { return 0, io.EOF }
-
-// eofReader is a non-nil io.ReadCloser that always returns EOF.
-// It has a WriteTo method so io.Copy won't need a buffer.
-var eofReader = &struct {
-	eofReaderWithWriteTo
-	io.Closer
-}{
-	eofReaderWithWriteTo{},
-	ioutil.NopCloser(nil),
-}
-
-// Verify that an io.Copy from an eofReader won't require a buffer.
-var _ io.WriterTo = eofReader
-
-// initNPNRequest is an HTTP handler that initializes certain
-// uninitialized fields in its *Request. Such partially-initialized
-// Requests come from NPN protocol handlers.
-type initNPNRequest struct {
-	c *tls.Conn
-	h serverHandler
-}
-
-func (h initNPNRequest) ServeHTTP(rw ResponseWriter, req *Request) {
-	if req.TLS == nil {
-		req.TLS = &tls.ConnectionState{}
-		*req.TLS = h.c.ConnectionState()
-	}
-	if req.Body == nil {
-		req.Body = eofReader
-	}
-	if req.RemoteAddr == "" {
-		req.RemoteAddr = h.c.RemoteAddr().String()
-	}
-	h.h.ServeHTTP(rw, req)
-}
-
-// loggingConn is used for debugging.
-type loggingConn struct {
-	name string
-	net.Conn
-}
-
-var (
-	uniqNameMu   sync.Mutex
-	uniqNameNext = make(map[string]int)
-)
-
-func newLoggingConn(baseName string, c net.Conn) net.Conn {
-	uniqNameMu.Lock()
-	defer uniqNameMu.Unlock()
-	uniqNameNext[baseName]++
-	return &loggingConn{
-		name: fmt.Sprintf("%s-%d", baseName, uniqNameNext[baseName]),
-		Conn: c,
-	}
-}
-
-func (c *loggingConn) Write(p []byte) (n int, err error) {
-	log.Printf("%s.Write(%d) = ....", c.name, len(p))
-	n, err = c.Conn.Write(p)
-	log.Printf("%s.Write(%d) = %d, %v", c.name, len(p), n, err)
-	return
-}
-
-func (c *loggingConn) Read(p []byte) (n int, err error) {
-	log.Printf("%s.Read(%d) = ....", c.name, len(p))
-	n, err = c.Conn.Read(p)
-	log.Printf("%s.Read(%d) = %d, %v", c.name, len(p), n, err)
-	return
-}
-
-func (c *loggingConn) Close() (err error) {
-	log.Printf("%s.Close() = ...", c.name)
-	err = c.Conn.Close()
-	log.Printf("%s.Close() = %v", c.name, err)
-	return
-}
-
-// checkConnErrorWriter writes to c.rwc and records any write errors to c.werr.
-// It only contains one field (and a pointer field at that), so it
-// fits in an interface value without an extra allocation.
-type checkConnErrorWriter struct {
-	c *conn
-}
-
-func (w checkConnErrorWriter) Write(p []byte) (n int, err error) {
-	n, err = w.c.w.Write(p) // c.w == c.rwc, except after a hijack, when rwc is nil.
-	if err != nil && w.c.werr == nil {
-		w.c.werr = err
-	}
-	return
-}
-
-func numLeadingCRorLF(v []byte) (n int) {
-	for _, b := range v {
-		if b == '\r' || b == '\n' {
-			n++
-			continue
-		}
-		break
-	}
-	return
-
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/sniff.go b/third_party/gofrontend/libgo/go/net/http/sniff.go
deleted file mode 100644
index 3be8c86..0000000
--- a/third_party/gofrontend/libgo/go/net/http/sniff.go
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"bytes"
-	"encoding/binary"
-)
-
-// The algorithm uses at most sniffLen bytes to make its decision.
-const sniffLen = 512
-
-// DetectContentType implements the algorithm described
-// at http://mimesniff.spec.whatwg.org/ to determine the
-// Content-Type of the given data.  It considers at most the
-// first 512 bytes of data.  DetectContentType always returns
-// a valid MIME type: if it cannot determine a more specific one, it
-// returns "application/octet-stream".
-func DetectContentType(data []byte) string {
-	if len(data) > sniffLen {
-		data = data[:sniffLen]
-	}
-
-	// Index of the first non-whitespace byte in data.
-	firstNonWS := 0
-	for ; firstNonWS < len(data) && isWS(data[firstNonWS]); firstNonWS++ {
-	}
-
-	for _, sig := range sniffSignatures {
-		if ct := sig.match(data, firstNonWS); ct != "" {
-			return ct
-		}
-	}
-
-	return "application/octet-stream" // fallback
-}
-
-func isWS(b byte) bool {
-	switch b {
-	case '\t', '\n', '\x0c', '\r', ' ':
-		return true
-	}
-	return false
-}
-
-type sniffSig interface {
-	// match returns the MIME type of the data, or "" if unknown.
-	match(data []byte, firstNonWS int) string
-}
-
-// Data matching the table in section 6.
-var sniffSignatures = []sniffSig{
-	htmlSig("<!DOCTYPE HTML"),
-	htmlSig("<HTML"),
-	htmlSig("<HEAD"),
-	htmlSig("<SCRIPT"),
-	htmlSig("<IFRAME"),
-	htmlSig("<H1"),
-	htmlSig("<DIV"),
-	htmlSig("<FONT"),
-	htmlSig("<TABLE"),
-	htmlSig("<A"),
-	htmlSig("<STYLE"),
-	htmlSig("<TITLE"),
-	htmlSig("<B"),
-	htmlSig("<BODY"),
-	htmlSig("<BR"),
-	htmlSig("<P"),
-	htmlSig("<!--"),
-
-	&maskedSig{mask: []byte("\xFF\xFF\xFF\xFF\xFF"), pat: []byte("<?xml"), skipWS: true, ct: "text/xml; charset=utf-8"},
-
-	&exactSig{[]byte("%PDF-"), "application/pdf"},
-	&exactSig{[]byte("%!PS-Adobe-"), "application/postscript"},
-
-	// UTF BOMs.
-	&maskedSig{mask: []byte("\xFF\xFF\x00\x00"), pat: []byte("\xFE\xFF\x00\x00"), ct: "text/plain; charset=utf-16be"},
-	&maskedSig{mask: []byte("\xFF\xFF\x00\x00"), pat: []byte("\xFF\xFE\x00\x00"), ct: "text/plain; charset=utf-16le"},
-	&maskedSig{mask: []byte("\xFF\xFF\xFF\x00"), pat: []byte("\xEF\xBB\xBF\x00"), ct: "text/plain; charset=utf-8"},
-
-	&exactSig{[]byte("GIF87a"), "image/gif"},
-	&exactSig{[]byte("GIF89a"), "image/gif"},
-	&exactSig{[]byte("\x89\x50\x4E\x47\x0D\x0A\x1A\x0A"), "image/png"},
-	&exactSig{[]byte("\xFF\xD8\xFF"), "image/jpeg"},
-	&exactSig{[]byte("BM"), "image/bmp"},
-	&maskedSig{
-		mask: []byte("\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"),
-		pat:  []byte("RIFF\x00\x00\x00\x00WEBPVP"),
-		ct:   "image/webp",
-	},
-	&exactSig{[]byte("\x00\x00\x01\x00"), "image/vnd.microsoft.icon"},
-	&exactSig{[]byte("\x4F\x67\x67\x53\x00"), "application/ogg"},
-	&maskedSig{
-		mask: []byte("\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF"),
-		pat:  []byte("RIFF\x00\x00\x00\x00WAVE"),
-		ct:   "audio/wave",
-	},
-	&exactSig{[]byte("\x1A\x45\xDF\xA3"), "video/webm"},
-	&exactSig{[]byte("\x52\x61\x72\x20\x1A\x07\x00"), "application/x-rar-compressed"},
-	&exactSig{[]byte("\x50\x4B\x03\x04"), "application/zip"},
-	&exactSig{[]byte("\x1F\x8B\x08"), "application/x-gzip"},
-
-	// TODO(dsymonds): Re-enable this when the spec is sorted w.r.t. MP4.
-	//mp4Sig(0),
-
-	textSig(0), // should be last
-}
-
-type exactSig struct {
-	sig []byte
-	ct  string
-}
-
-func (e *exactSig) match(data []byte, firstNonWS int) string {
-	if bytes.HasPrefix(data, e.sig) {
-		return e.ct
-	}
-	return ""
-}
-
-type maskedSig struct {
-	mask, pat []byte
-	skipWS    bool
-	ct        string
-}
-
-func (m *maskedSig) match(data []byte, firstNonWS int) string {
-	if m.skipWS {
-		data = data[firstNonWS:]
-	}
-	if len(data) < len(m.mask) {
-		return ""
-	}
-	for i, mask := range m.mask {
-		db := data[i] & mask
-		if db != m.pat[i] {
-			return ""
-		}
-	}
-	return m.ct
-}
-
-type htmlSig []byte
-
-func (h htmlSig) match(data []byte, firstNonWS int) string {
-	data = data[firstNonWS:]
-	if len(data) < len(h)+1 {
-		return ""
-	}
-	for i, b := range h {
-		db := data[i]
-		if 'A' <= b && b <= 'Z' {
-			db &= 0xDF
-		}
-		if b != db {
-			return ""
-		}
-	}
-	// Next byte must be space or right angle bracket.
-	if db := data[len(h)]; db != ' ' && db != '>' {
-		return ""
-	}
-	return "text/html; charset=utf-8"
-}
-
-var mp4ftype = []byte("ftyp")
-
-type mp4Sig int
-
-func (mp4Sig) match(data []byte, firstNonWS int) string {
-	// c.f. section 6.1.
-	if len(data) < 8 {
-		return ""
-	}
-	boxSize := int(binary.BigEndian.Uint32(data[:4]))
-	if boxSize%4 != 0 || len(data) < boxSize {
-		return ""
-	}
-	if !bytes.Equal(data[4:8], mp4ftype) {
-		return ""
-	}
-	for st := 8; st < boxSize; st += 4 {
-		if st == 12 {
-			// minor version number
-			continue
-		}
-		seg := string(data[st : st+3])
-		switch seg {
-		case "mp4", "iso", "M4V", "M4P", "M4B":
-			return "video/mp4"
-			/* The remainder are not in the spec.
-			case "M4A":
-				return "audio/mp4"
-			case "3gp":
-				return "video/3gpp"
-			case "jp2":
-				return "image/jp2" // JPEG 2000
-			*/
-		}
-	}
-	return ""
-}
-
-type textSig int
-
-func (textSig) match(data []byte, firstNonWS int) string {
-	// c.f. section 5, step 4.
-	for _, b := range data[firstNonWS:] {
-		switch {
-		case 0x00 <= b && b <= 0x08,
-			b == 0x0B,
-			0x0E <= b && b <= 0x1A,
-			0x1C <= b && b <= 0x1F:
-			return ""
-		}
-	}
-	return "text/plain; charset=utf-8"
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/sniff_test.go b/third_party/gofrontend/libgo/go/net/http/sniff_test.go
deleted file mode 100644
index 24ca27a..0000000
--- a/third_party/gofrontend/libgo/go/net/http/sniff_test.go
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http_test
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	. "net/http"
-	"net/http/httptest"
-	"reflect"
-	"strconv"
-	"strings"
-	"testing"
-)
-
-var sniffTests = []struct {
-	desc        string
-	data        []byte
-	contentType string
-}{
-	// Some nonsense.
-	{"Empty", []byte{}, "text/plain; charset=utf-8"},
-	{"Binary", []byte{1, 2, 3}, "application/octet-stream"},
-
-	{"HTML document #1", []byte(`<HtMl><bOdY>blah blah blah</body></html>`), "text/html; charset=utf-8"},
-	{"HTML document #2", []byte(`<HTML></HTML>`), "text/html; charset=utf-8"},
-	{"HTML document #3 (leading whitespace)", []byte(`   <!DOCTYPE HTML>...`), "text/html; charset=utf-8"},
-	{"HTML document #4 (leading CRLF)", []byte("\r\n<html>..."), "text/html; charset=utf-8"},
-
-	{"Plain text", []byte(`This is not HTML. It has ☃ though.`), "text/plain; charset=utf-8"},
-
-	{"XML", []byte("\n<?xml!"), "text/xml; charset=utf-8"},
-
-	// Image types.
-	{"GIF 87a", []byte(`GIF87a`), "image/gif"},
-	{"GIF 89a", []byte(`GIF89a...`), "image/gif"},
-
-	// TODO(dsymonds): Re-enable this when the spec is sorted w.r.t. MP4.
-	//{"MP4 video", []byte("\x00\x00\x00\x18ftypmp42\x00\x00\x00\x00mp42isom<\x06t\xbfmdat"), "video/mp4"},
-	//{"MP4 audio", []byte("\x00\x00\x00\x20ftypM4A \x00\x00\x00\x00M4A mp42isom\x00\x00\x00\x00"), "audio/mp4"},
-}
-
-func TestDetectContentType(t *testing.T) {
-	for _, tt := range sniffTests {
-		ct := DetectContentType(tt.data)
-		if ct != tt.contentType {
-			t.Errorf("%v: DetectContentType = %q, want %q", tt.desc, ct, tt.contentType)
-		}
-	}
-}
-
-func TestServerContentType(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		i, _ := strconv.Atoi(r.FormValue("i"))
-		tt := sniffTests[i]
-		n, err := w.Write(tt.data)
-		if n != len(tt.data) || err != nil {
-			log.Fatalf("%v: Write(%q) = %v, %v want %d, nil", tt.desc, tt.data, n, err, len(tt.data))
-		}
-	}))
-	defer ts.Close()
-
-	for i, tt := range sniffTests {
-		resp, err := Get(ts.URL + "/?i=" + strconv.Itoa(i))
-		if err != nil {
-			t.Errorf("%v: %v", tt.desc, err)
-			continue
-		}
-		if ct := resp.Header.Get("Content-Type"); ct != tt.contentType {
-			t.Errorf("%v: Content-Type = %q, want %q", tt.desc, ct, tt.contentType)
-		}
-		data, err := ioutil.ReadAll(resp.Body)
-		if err != nil {
-			t.Errorf("%v: reading body: %v", tt.desc, err)
-		} else if !bytes.Equal(data, tt.data) {
-			t.Errorf("%v: data is %q, want %q", tt.desc, data, tt.data)
-		}
-		resp.Body.Close()
-	}
-}
-
-// Issue 5953: shouldn't sniff if the handler set a Content-Type header,
-// even if it's the empty string.
-func TestServerIssue5953(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header()["Content-Type"] = []string{""}
-		fmt.Fprintf(w, "<html><head></head><body>hi</body></html>")
-	}))
-	defer ts.Close()
-
-	resp, err := Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	got := resp.Header["Content-Type"]
-	want := []string{""}
-	if !reflect.DeepEqual(got, want) {
-		t.Errorf("Content-Type = %q; want %q", got, want)
-	}
-	resp.Body.Close()
-}
-
-func TestContentTypeWithCopy(t *testing.T) {
-	defer afterTest(t)
-
-	const (
-		input    = "\n<html>\n\t<head>\n"
-		expected = "text/html; charset=utf-8"
-	)
-
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		// Use io.Copy from a bytes.Buffer to trigger ReadFrom.
-		buf := bytes.NewBuffer([]byte(input))
-		n, err := io.Copy(w, buf)
-		if int(n) != len(input) || err != nil {
-			t.Errorf("io.Copy(w, %q) = %v, %v want %d, nil", input, n, err, len(input))
-		}
-	}))
-	defer ts.Close()
-
-	resp, err := Get(ts.URL)
-	if err != nil {
-		t.Fatalf("Get: %v", err)
-	}
-	if ct := resp.Header.Get("Content-Type"); ct != expected {
-		t.Errorf("Content-Type = %q, want %q", ct, expected)
-	}
-	data, err := ioutil.ReadAll(resp.Body)
-	if err != nil {
-		t.Errorf("reading body: %v", err)
-	} else if !bytes.Equal(data, []byte(input)) {
-		t.Errorf("data is %q, want %q", data, input)
-	}
-	resp.Body.Close()
-}
-
-func TestSniffWriteSize(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		size, _ := strconv.Atoi(r.FormValue("size"))
-		written, err := io.WriteString(w, strings.Repeat("a", size))
-		if err != nil {
-			t.Errorf("write of %d bytes: %v", size, err)
-			return
-		}
-		if written != size {
-			t.Errorf("write of %d bytes wrote %d bytes", size, written)
-		}
-	}))
-	defer ts.Close()
-	for _, size := range []int{0, 1, 200, 600, 999, 1000, 1023, 1024, 512 << 10, 1 << 20} {
-		res, err := Get(fmt.Sprintf("%s/?size=%d", ts.URL, size))
-		if err != nil {
-			t.Fatalf("size %d: %v", size, err)
-		}
-		if _, err := io.Copy(ioutil.Discard, res.Body); err != nil {
-			t.Fatalf("size %d: io.Copy of body = %v", size, err)
-		}
-		if err := res.Body.Close(); err != nil {
-			t.Fatalf("size %d: body Close = %v", size, err)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/status.go b/third_party/gofrontend/libgo/go/net/http/status.go
deleted file mode 100644
index d253bd5..0000000
--- a/third_party/gofrontend/libgo/go/net/http/status.go
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-// HTTP status codes, defined in RFC 2616.
-const (
-	StatusContinue           = 100
-	StatusSwitchingProtocols = 101
-
-	StatusOK                   = 200
-	StatusCreated              = 201
-	StatusAccepted             = 202
-	StatusNonAuthoritativeInfo = 203
-	StatusNoContent            = 204
-	StatusResetContent         = 205
-	StatusPartialContent       = 206
-
-	StatusMultipleChoices   = 300
-	StatusMovedPermanently  = 301
-	StatusFound             = 302
-	StatusSeeOther          = 303
-	StatusNotModified       = 304
-	StatusUseProxy          = 305
-	StatusTemporaryRedirect = 307
-
-	StatusBadRequest                   = 400
-	StatusUnauthorized                 = 401
-	StatusPaymentRequired              = 402
-	StatusForbidden                    = 403
-	StatusNotFound                     = 404
-	StatusMethodNotAllowed             = 405
-	StatusNotAcceptable                = 406
-	StatusProxyAuthRequired            = 407
-	StatusRequestTimeout               = 408
-	StatusConflict                     = 409
-	StatusGone                         = 410
-	StatusLengthRequired               = 411
-	StatusPreconditionFailed           = 412
-	StatusRequestEntityTooLarge        = 413
-	StatusRequestURITooLong            = 414
-	StatusUnsupportedMediaType         = 415
-	StatusRequestedRangeNotSatisfiable = 416
-	StatusExpectationFailed            = 417
-	StatusTeapot                       = 418
-
-	StatusInternalServerError     = 500
-	StatusNotImplemented          = 501
-	StatusBadGateway              = 502
-	StatusServiceUnavailable      = 503
-	StatusGatewayTimeout          = 504
-	StatusHTTPVersionNotSupported = 505
-
-	// New HTTP status codes from RFC 6585. Not exported yet in Go 1.1.
-	// See discussion at https://codereview.appspot.com/7678043/
-	statusPreconditionRequired          = 428
-	statusTooManyRequests               = 429
-	statusRequestHeaderFieldsTooLarge   = 431
-	statusNetworkAuthenticationRequired = 511
-)
-
-var statusText = map[int]string{
-	StatusContinue:           "Continue",
-	StatusSwitchingProtocols: "Switching Protocols",
-
-	StatusOK:                   "OK",
-	StatusCreated:              "Created",
-	StatusAccepted:             "Accepted",
-	StatusNonAuthoritativeInfo: "Non-Authoritative Information",
-	StatusNoContent:            "No Content",
-	StatusResetContent:         "Reset Content",
-	StatusPartialContent:       "Partial Content",
-
-	StatusMultipleChoices:   "Multiple Choices",
-	StatusMovedPermanently:  "Moved Permanently",
-	StatusFound:             "Found",
-	StatusSeeOther:          "See Other",
-	StatusNotModified:       "Not Modified",
-	StatusUseProxy:          "Use Proxy",
-	StatusTemporaryRedirect: "Temporary Redirect",
-
-	StatusBadRequest:                   "Bad Request",
-	StatusUnauthorized:                 "Unauthorized",
-	StatusPaymentRequired:              "Payment Required",
-	StatusForbidden:                    "Forbidden",
-	StatusNotFound:                     "Not Found",
-	StatusMethodNotAllowed:             "Method Not Allowed",
-	StatusNotAcceptable:                "Not Acceptable",
-	StatusProxyAuthRequired:            "Proxy Authentication Required",
-	StatusRequestTimeout:               "Request Timeout",
-	StatusConflict:                     "Conflict",
-	StatusGone:                         "Gone",
-	StatusLengthRequired:               "Length Required",
-	StatusPreconditionFailed:           "Precondition Failed",
-	StatusRequestEntityTooLarge:        "Request Entity Too Large",
-	StatusRequestURITooLong:            "Request URI Too Long",
-	StatusUnsupportedMediaType:         "Unsupported Media Type",
-	StatusRequestedRangeNotSatisfiable: "Requested Range Not Satisfiable",
-	StatusExpectationFailed:            "Expectation Failed",
-	StatusTeapot:                       "I'm a teapot",
-
-	StatusInternalServerError:     "Internal Server Error",
-	StatusNotImplemented:          "Not Implemented",
-	StatusBadGateway:              "Bad Gateway",
-	StatusServiceUnavailable:      "Service Unavailable",
-	StatusGatewayTimeout:          "Gateway Timeout",
-	StatusHTTPVersionNotSupported: "HTTP Version Not Supported",
-
-	statusPreconditionRequired:          "Precondition Required",
-	statusTooManyRequests:               "Too Many Requests",
-	statusRequestHeaderFieldsTooLarge:   "Request Header Fields Too Large",
-	statusNetworkAuthenticationRequired: "Network Authentication Required",
-}
-
-// StatusText returns a text for the HTTP status code. It returns the empty
-// string if the code is unknown.
-func StatusText(code int) string {
-	return statusText[code]
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/testdata/file b/third_party/gofrontend/libgo/go/net/http/testdata/file
deleted file mode 100644
index 11f11f9..0000000
--- a/third_party/gofrontend/libgo/go/net/http/testdata/file
+++ /dev/null
@@ -1 +0,0 @@
-0123456789
diff --git a/third_party/gofrontend/libgo/go/net/http/testdata/index.html b/third_party/gofrontend/libgo/go/net/http/testdata/index.html
deleted file mode 100644
index da8e1e9..0000000
--- a/third_party/gofrontend/libgo/go/net/http/testdata/index.html
+++ /dev/null
@@ -1 +0,0 @@
-index.html says hello
diff --git a/third_party/gofrontend/libgo/go/net/http/testdata/style.css b/third_party/gofrontend/libgo/go/net/http/testdata/style.css
deleted file mode 100644
index 208d16d..0000000
--- a/third_party/gofrontend/libgo/go/net/http/testdata/style.css
+++ /dev/null
@@ -1 +0,0 @@
-body {}
diff --git a/third_party/gofrontend/libgo/go/net/http/transfer.go b/third_party/gofrontend/libgo/go/net/http/transfer.go
deleted file mode 100644
index a8736b2..0000000
--- a/third_party/gofrontend/libgo/go/net/http/transfer.go
+++ /dev/null
@@ -1,829 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"bufio"
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net/http/internal"
-	"net/textproto"
-	"sort"
-	"strconv"
-	"strings"
-	"sync"
-)
-
-// ErrLineTooLong is returned when reading request or response bodies
-// with malformed chunked encoding.
-var ErrLineTooLong = internal.ErrLineTooLong
-
-type errorReader struct {
-	err error
-}
-
-func (r errorReader) Read(p []byte) (n int, err error) {
-	return 0, r.err
-}
-
-// transferWriter inspects the fields of a user-supplied Request or Response,
-// sanitizes them without changing the user object and provides methods for
-// writing the respective header, body and trailer in wire format.
-type transferWriter struct {
-	Method           string
-	Body             io.Reader
-	BodyCloser       io.Closer
-	ResponseToHEAD   bool
-	ContentLength    int64 // -1 means unknown, 0 means exactly none
-	Close            bool
-	TransferEncoding []string
-	Trailer          Header
-	IsResponse       bool
-}
-
-func newTransferWriter(r interface{}) (t *transferWriter, err error) {
-	t = &transferWriter{}
-
-	// Extract relevant fields
-	atLeastHTTP11 := false
-	switch rr := r.(type) {
-	case *Request:
-		if rr.ContentLength != 0 && rr.Body == nil {
-			return nil, fmt.Errorf("http: Request.ContentLength=%d with nil Body", rr.ContentLength)
-		}
-		t.Method = rr.Method
-		t.Body = rr.Body
-		t.BodyCloser = rr.Body
-		t.ContentLength = rr.ContentLength
-		t.Close = rr.Close
-		t.TransferEncoding = rr.TransferEncoding
-		t.Trailer = rr.Trailer
-		atLeastHTTP11 = rr.ProtoAtLeast(1, 1)
-		if t.Body != nil && len(t.TransferEncoding) == 0 && atLeastHTTP11 {
-			if t.ContentLength == 0 {
-				// Test to see if it's actually zero or just unset.
-				var buf [1]byte
-				n, rerr := io.ReadFull(t.Body, buf[:])
-				if rerr != nil && rerr != io.EOF {
-					t.ContentLength = -1
-					t.Body = errorReader{rerr}
-				} else if n == 1 {
-					// Oh, guess there is data in this Body Reader after all.
-					// The ContentLength field just wasn't set.
-					// Stich the Body back together again, re-attaching our
-					// consumed byte.
-					t.ContentLength = -1
-					t.Body = io.MultiReader(bytes.NewReader(buf[:]), t.Body)
-				} else {
-					// Body is actually empty.
-					t.Body = nil
-					t.BodyCloser = nil
-				}
-			}
-			if t.ContentLength < 0 {
-				t.TransferEncoding = []string{"chunked"}
-			}
-		}
-	case *Response:
-		t.IsResponse = true
-		if rr.Request != nil {
-			t.Method = rr.Request.Method
-		}
-		t.Body = rr.Body
-		t.BodyCloser = rr.Body
-		t.ContentLength = rr.ContentLength
-		t.Close = rr.Close
-		t.TransferEncoding = rr.TransferEncoding
-		t.Trailer = rr.Trailer
-		atLeastHTTP11 = rr.ProtoAtLeast(1, 1)
-		t.ResponseToHEAD = noBodyExpected(t.Method)
-	}
-
-	// Sanitize Body,ContentLength,TransferEncoding
-	if t.ResponseToHEAD {
-		t.Body = nil
-		if chunked(t.TransferEncoding) {
-			t.ContentLength = -1
-		}
-	} else {
-		if !atLeastHTTP11 || t.Body == nil {
-			t.TransferEncoding = nil
-		}
-		if chunked(t.TransferEncoding) {
-			t.ContentLength = -1
-		} else if t.Body == nil { // no chunking, no body
-			t.ContentLength = 0
-		}
-	}
-
-	// Sanitize Trailer
-	if !chunked(t.TransferEncoding) {
-		t.Trailer = nil
-	}
-
-	return t, nil
-}
-
-func noBodyExpected(requestMethod string) bool {
-	return requestMethod == "HEAD"
-}
-
-func (t *transferWriter) shouldSendContentLength() bool {
-	if chunked(t.TransferEncoding) {
-		return false
-	}
-	if t.ContentLength > 0 {
-		return true
-	}
-	if t.ContentLength < 0 {
-		return false
-	}
-	// Many servers expect a Content-Length for these methods
-	if t.Method == "POST" || t.Method == "PUT" {
-		return true
-	}
-	if t.ContentLength == 0 && isIdentity(t.TransferEncoding) {
-		if t.Method == "GET" || t.Method == "HEAD" {
-			return false
-		}
-		return true
-	}
-
-	return false
-}
-
-func (t *transferWriter) WriteHeader(w io.Writer) error {
-	if t.Close {
-		if _, err := io.WriteString(w, "Connection: close\r\n"); err != nil {
-			return err
-		}
-	}
-
-	// Write Content-Length and/or Transfer-Encoding whose values are a
-	// function of the sanitized field triple (Body, ContentLength,
-	// TransferEncoding)
-	if t.shouldSendContentLength() {
-		if _, err := io.WriteString(w, "Content-Length: "); err != nil {
-			return err
-		}
-		if _, err := io.WriteString(w, strconv.FormatInt(t.ContentLength, 10)+"\r\n"); err != nil {
-			return err
-		}
-	} else if chunked(t.TransferEncoding) {
-		if _, err := io.WriteString(w, "Transfer-Encoding: chunked\r\n"); err != nil {
-			return err
-		}
-	}
-
-	// Write Trailer header
-	if t.Trailer != nil {
-		keys := make([]string, 0, len(t.Trailer))
-		for k := range t.Trailer {
-			k = CanonicalHeaderKey(k)
-			switch k {
-			case "Transfer-Encoding", "Trailer", "Content-Length":
-				return &badStringError{"invalid Trailer key", k}
-			}
-			keys = append(keys, k)
-		}
-		if len(keys) > 0 {
-			sort.Strings(keys)
-			// TODO: could do better allocation-wise here, but trailers are rare,
-			// so being lazy for now.
-			if _, err := io.WriteString(w, "Trailer: "+strings.Join(keys, ",")+"\r\n"); err != nil {
-				return err
-			}
-		}
-	}
-
-	return nil
-}
-
-func (t *transferWriter) WriteBody(w io.Writer) error {
-	var err error
-	var ncopy int64
-
-	// Write body
-	if t.Body != nil {
-		if chunked(t.TransferEncoding) {
-			if bw, ok := w.(*bufio.Writer); ok && !t.IsResponse {
-				w = &internal.FlushAfterChunkWriter{bw}
-			}
-			cw := internal.NewChunkedWriter(w)
-			_, err = io.Copy(cw, t.Body)
-			if err == nil {
-				err = cw.Close()
-			}
-		} else if t.ContentLength == -1 {
-			ncopy, err = io.Copy(w, t.Body)
-		} else {
-			ncopy, err = io.Copy(w, io.LimitReader(t.Body, t.ContentLength))
-			if err != nil {
-				return err
-			}
-			var nextra int64
-			nextra, err = io.Copy(ioutil.Discard, t.Body)
-			ncopy += nextra
-		}
-		if err != nil {
-			return err
-		}
-		if err = t.BodyCloser.Close(); err != nil {
-			return err
-		}
-	}
-
-	if !t.ResponseToHEAD && t.ContentLength != -1 && t.ContentLength != ncopy {
-		return fmt.Errorf("http: ContentLength=%d with Body length %d",
-			t.ContentLength, ncopy)
-	}
-
-	if chunked(t.TransferEncoding) {
-		// Write Trailer header
-		if t.Trailer != nil {
-			if err := t.Trailer.Write(w); err != nil {
-				return err
-			}
-		}
-		// Last chunk, empty trailer
-		_, err = io.WriteString(w, "\r\n")
-	}
-	return err
-}
-
-type transferReader struct {
-	// Input
-	Header        Header
-	StatusCode    int
-	RequestMethod string
-	ProtoMajor    int
-	ProtoMinor    int
-	// Output
-	Body             io.ReadCloser
-	ContentLength    int64
-	TransferEncoding []string
-	Close            bool
-	Trailer          Header
-}
-
-// bodyAllowedForStatus reports whether a given response status code
-// permits a body.  See RFC2616, section 4.4.
-func bodyAllowedForStatus(status int) bool {
-	switch {
-	case status >= 100 && status <= 199:
-		return false
-	case status == 204:
-		return false
-	case status == 304:
-		return false
-	}
-	return true
-}
-
-var (
-	suppressedHeaders304    = []string{"Content-Type", "Content-Length", "Transfer-Encoding"}
-	suppressedHeadersNoBody = []string{"Content-Length", "Transfer-Encoding"}
-)
-
-func suppressedHeaders(status int) []string {
-	switch {
-	case status == 304:
-		// RFC 2616 section 10.3.5: "the response MUST NOT include other entity-headers"
-		return suppressedHeaders304
-	case !bodyAllowedForStatus(status):
-		return suppressedHeadersNoBody
-	}
-	return nil
-}
-
-// msg is *Request or *Response.
-func readTransfer(msg interface{}, r *bufio.Reader) (err error) {
-	t := &transferReader{RequestMethod: "GET"}
-
-	// Unify input
-	isResponse := false
-	switch rr := msg.(type) {
-	case *Response:
-		t.Header = rr.Header
-		t.StatusCode = rr.StatusCode
-		t.ProtoMajor = rr.ProtoMajor
-		t.ProtoMinor = rr.ProtoMinor
-		t.Close = shouldClose(t.ProtoMajor, t.ProtoMinor, t.Header, true)
-		isResponse = true
-		if rr.Request != nil {
-			t.RequestMethod = rr.Request.Method
-		}
-	case *Request:
-		t.Header = rr.Header
-		t.RequestMethod = rr.Method
-		t.ProtoMajor = rr.ProtoMajor
-		t.ProtoMinor = rr.ProtoMinor
-		// Transfer semantics for Requests are exactly like those for
-		// Responses with status code 200, responding to a GET method
-		t.StatusCode = 200
-		t.Close = rr.Close
-	default:
-		panic("unexpected type")
-	}
-
-	// Default to HTTP/1.1
-	if t.ProtoMajor == 0 && t.ProtoMinor == 0 {
-		t.ProtoMajor, t.ProtoMinor = 1, 1
-	}
-
-	// Transfer encoding, content length
-	t.TransferEncoding, err = fixTransferEncoding(isResponse, t.RequestMethod, t.Header)
-	if err != nil {
-		return err
-	}
-
-	realLength, err := fixLength(isResponse, t.StatusCode, t.RequestMethod, t.Header, t.TransferEncoding)
-	if err != nil {
-		return err
-	}
-	if isResponse && t.RequestMethod == "HEAD" {
-		if n, err := parseContentLength(t.Header.get("Content-Length")); err != nil {
-			return err
-		} else {
-			t.ContentLength = n
-		}
-	} else {
-		t.ContentLength = realLength
-	}
-
-	// Trailer
-	t.Trailer, err = fixTrailer(t.Header, t.TransferEncoding)
-	if err != nil {
-		return err
-	}
-
-	// If there is no Content-Length or chunked Transfer-Encoding on a *Response
-	// and the status is not 1xx, 204 or 304, then the body is unbounded.
-	// See RFC2616, section 4.4.
-	switch msg.(type) {
-	case *Response:
-		if realLength == -1 &&
-			!chunked(t.TransferEncoding) &&
-			bodyAllowedForStatus(t.StatusCode) {
-			// Unbounded body.
-			t.Close = true
-		}
-	}
-
-	// Prepare body reader.  ContentLength < 0 means chunked encoding
-	// or close connection when finished, since multipart is not supported yet
-	switch {
-	case chunked(t.TransferEncoding):
-		if noBodyExpected(t.RequestMethod) {
-			t.Body = eofReader
-		} else {
-			t.Body = &body{src: internal.NewChunkedReader(r), hdr: msg, r: r, closing: t.Close}
-		}
-	case realLength == 0:
-		t.Body = eofReader
-	case realLength > 0:
-		t.Body = &body{src: io.LimitReader(r, realLength), closing: t.Close}
-	default:
-		// realLength < 0, i.e. "Content-Length" not mentioned in header
-		if t.Close {
-			// Close semantics (i.e. HTTP/1.0)
-			t.Body = &body{src: r, closing: t.Close}
-		} else {
-			// Persistent connection (i.e. HTTP/1.1)
-			t.Body = eofReader
-		}
-	}
-
-	// Unify output
-	switch rr := msg.(type) {
-	case *Request:
-		rr.Body = t.Body
-		rr.ContentLength = t.ContentLength
-		rr.TransferEncoding = t.TransferEncoding
-		rr.Close = t.Close
-		rr.Trailer = t.Trailer
-	case *Response:
-		rr.Body = t.Body
-		rr.ContentLength = t.ContentLength
-		rr.TransferEncoding = t.TransferEncoding
-		rr.Close = t.Close
-		rr.Trailer = t.Trailer
-	}
-
-	return nil
-}
-
-// Checks whether chunked is part of the encodings stack
-func chunked(te []string) bool { return len(te) > 0 && te[0] == "chunked" }
-
-// Checks whether the encoding is explicitly "identity".
-func isIdentity(te []string) bool { return len(te) == 1 && te[0] == "identity" }
-
-// Sanitize transfer encoding
-func fixTransferEncoding(isResponse bool, requestMethod string, header Header) ([]string, error) {
-	raw, present := header["Transfer-Encoding"]
-	if !present {
-		return nil, nil
-	}
-	delete(header, "Transfer-Encoding")
-
-	encodings := strings.Split(raw[0], ",")
-	te := make([]string, 0, len(encodings))
-	// TODO: Even though we only support "identity" and "chunked"
-	// encodings, the loop below is designed with foresight. One
-	// invariant that must be maintained is that, if present,
-	// chunked encoding must always come first.
-	for _, encoding := range encodings {
-		encoding = strings.ToLower(strings.TrimSpace(encoding))
-		// "identity" encoding is not recorded
-		if encoding == "identity" {
-			break
-		}
-		if encoding != "chunked" {
-			return nil, &badStringError{"unsupported transfer encoding", encoding}
-		}
-		te = te[0 : len(te)+1]
-		te[len(te)-1] = encoding
-	}
-	if len(te) > 1 {
-		return nil, &badStringError{"too many transfer encodings", strings.Join(te, ",")}
-	}
-	if len(te) > 0 {
-		// RFC 7230 3.3.2 says "A sender MUST NOT send a
-		// Content-Length header field in any message that
-		// contains a Transfer-Encoding header field."
-		//
-		// but also:
-		// "If a message is received with both a
-		// Transfer-Encoding and a Content-Length header
-		// field, the Transfer-Encoding overrides the
-		// Content-Length. Such a message might indicate an
-		// attempt to perform request smuggling (Section 9.5)
-		// or response splitting (Section 9.4) and ought to be
-		// handled as an error. A sender MUST remove the
-		// received Content-Length field prior to forwarding
-		// such a message downstream."
-		//
-		// Reportedly, these appear in the wild.
-		delete(header, "Content-Length")
-		return te, nil
-	}
-
-	return nil, nil
-}
-
-// Determine the expected body length, using RFC 2616 Section 4.4. This
-// function is not a method, because ultimately it should be shared by
-// ReadResponse and ReadRequest.
-func fixLength(isResponse bool, status int, requestMethod string, header Header, te []string) (int64, error) {
-	contentLens := header["Content-Length"]
-	isRequest := !isResponse
-	// Logic based on response type or status
-	if noBodyExpected(requestMethod) {
-		// For HTTP requests, as part of hardening against request
-		// smuggling (RFC 7230), don't allow a Content-Length header for
-		// methods which don't permit bodies. As an exception, allow
-		// exactly one Content-Length header if its value is "0".
-		if isRequest && len(contentLens) > 0 && !(len(contentLens) == 1 && contentLens[0] == "0") {
-			return 0, fmt.Errorf("http: method cannot contain a Content-Length; got %q", contentLens)
-		}
-		return 0, nil
-	}
-	if status/100 == 1 {
-		return 0, nil
-	}
-	switch status {
-	case 204, 304:
-		return 0, nil
-	}
-
-	if len(contentLens) > 1 {
-		// harden against HTTP request smuggling. See RFC 7230.
-		return 0, errors.New("http: message cannot contain multiple Content-Length headers")
-	}
-
-	// Logic based on Transfer-Encoding
-	if chunked(te) {
-		return -1, nil
-	}
-
-	// Logic based on Content-Length
-	var cl string
-	if len(contentLens) == 1 {
-		cl = strings.TrimSpace(contentLens[0])
-	}
-	if cl != "" {
-		n, err := parseContentLength(cl)
-		if err != nil {
-			return -1, err
-		}
-		return n, nil
-	} else {
-		header.Del("Content-Length")
-	}
-
-	if !isResponse {
-		// RFC 2616 neither explicitly permits nor forbids an
-		// entity-body on a GET request so we permit one if
-		// declared, but we default to 0 here (not -1 below)
-		// if there's no mention of a body.
-		// Likewise, all other request methods are assumed to have
-		// no body if neither Transfer-Encoding chunked nor a
-		// Content-Length are set.
-		return 0, nil
-	}
-
-	// Body-EOF logic based on other methods (like closing, or chunked coding)
-	return -1, nil
-}
-
-// Determine whether to hang up after sending a request and body, or
-// receiving a response and body
-// 'header' is the request headers
-func shouldClose(major, minor int, header Header, removeCloseHeader bool) bool {
-	if major < 1 {
-		return true
-	} else if major == 1 && minor == 0 {
-		vv := header["Connection"]
-		if headerValuesContainsToken(vv, "close") || !headerValuesContainsToken(vv, "keep-alive") {
-			return true
-		}
-		return false
-	} else {
-		if headerValuesContainsToken(header["Connection"], "close") {
-			if removeCloseHeader {
-				header.Del("Connection")
-			}
-			return true
-		}
-	}
-	return false
-}
-
-// Parse the trailer header
-func fixTrailer(header Header, te []string) (Header, error) {
-	raw := header.get("Trailer")
-	if raw == "" {
-		return nil, nil
-	}
-
-	header.Del("Trailer")
-	trailer := make(Header)
-	keys := strings.Split(raw, ",")
-	for _, key := range keys {
-		key = CanonicalHeaderKey(strings.TrimSpace(key))
-		switch key {
-		case "Transfer-Encoding", "Trailer", "Content-Length":
-			return nil, &badStringError{"bad trailer key", key}
-		}
-		trailer[key] = nil
-	}
-	if len(trailer) == 0 {
-		return nil, nil
-	}
-	if !chunked(te) {
-		// Trailer and no chunking
-		return nil, ErrUnexpectedTrailer
-	}
-	return trailer, nil
-}
-
-// body turns a Reader into a ReadCloser.
-// Close ensures that the body has been fully read
-// and then reads the trailer if necessary.
-type body struct {
-	src          io.Reader
-	hdr          interface{}   // non-nil (Response or Request) value means read trailer
-	r            *bufio.Reader // underlying wire-format reader for the trailer
-	closing      bool          // is the connection to be closed after reading body?
-	doEarlyClose bool          // whether Close should stop early
-
-	mu         sync.Mutex // guards closed, and calls to Read and Close
-	sawEOF     bool
-	closed     bool
-	earlyClose bool // Close called and we didn't read to the end of src
-}
-
-// ErrBodyReadAfterClose is returned when reading a Request or Response
-// Body after the body has been closed. This typically happens when the body is
-// read after an HTTP Handler calls WriteHeader or Write on its
-// ResponseWriter.
-var ErrBodyReadAfterClose = errors.New("http: invalid Read on closed Body")
-
-func (b *body) Read(p []byte) (n int, err error) {
-	b.mu.Lock()
-	defer b.mu.Unlock()
-	if b.closed {
-		return 0, ErrBodyReadAfterClose
-	}
-	return b.readLocked(p)
-}
-
-// Must hold b.mu.
-func (b *body) readLocked(p []byte) (n int, err error) {
-	if b.sawEOF {
-		return 0, io.EOF
-	}
-	n, err = b.src.Read(p)
-
-	if err == io.EOF {
-		b.sawEOF = true
-		// Chunked case. Read the trailer.
-		if b.hdr != nil {
-			if e := b.readTrailer(); e != nil {
-				err = e
-				// Something went wrong in the trailer, we must not allow any
-				// further reads of any kind to succeed from body, nor any
-				// subsequent requests on the server connection. See
-				// golang.org/issue/12027
-				b.sawEOF = false
-				b.closed = true
-			}
-			b.hdr = nil
-		} else {
-			// If the server declared the Content-Length, our body is a LimitedReader
-			// and we need to check whether this EOF arrived early.
-			if lr, ok := b.src.(*io.LimitedReader); ok && lr.N > 0 {
-				err = io.ErrUnexpectedEOF
-			}
-		}
-	}
-
-	// If we can return an EOF here along with the read data, do
-	// so. This is optional per the io.Reader contract, but doing
-	// so helps the HTTP transport code recycle its connection
-	// earlier (since it will see this EOF itself), even if the
-	// client doesn't do future reads or Close.
-	if err == nil && n > 0 {
-		if lr, ok := b.src.(*io.LimitedReader); ok && lr.N == 0 {
-			err = io.EOF
-			b.sawEOF = true
-		}
-	}
-
-	return n, err
-}
-
-var (
-	singleCRLF = []byte("\r\n")
-	doubleCRLF = []byte("\r\n\r\n")
-)
-
-func seeUpcomingDoubleCRLF(r *bufio.Reader) bool {
-	for peekSize := 4; ; peekSize++ {
-		// This loop stops when Peek returns an error,
-		// which it does when r's buffer has been filled.
-		buf, err := r.Peek(peekSize)
-		if bytes.HasSuffix(buf, doubleCRLF) {
-			return true
-		}
-		if err != nil {
-			break
-		}
-	}
-	return false
-}
-
-var errTrailerEOF = errors.New("http: unexpected EOF reading trailer")
-
-func (b *body) readTrailer() error {
-	// The common case, since nobody uses trailers.
-	buf, err := b.r.Peek(2)
-	if bytes.Equal(buf, singleCRLF) {
-		b.r.Discard(2)
-		return nil
-	}
-	if len(buf) < 2 {
-		return errTrailerEOF
-	}
-	if err != nil {
-		return err
-	}
-
-	// Make sure there's a header terminator coming up, to prevent
-	// a DoS with an unbounded size Trailer.  It's not easy to
-	// slip in a LimitReader here, as textproto.NewReader requires
-	// a concrete *bufio.Reader.  Also, we can't get all the way
-	// back up to our conn's LimitedReader that *might* be backing
-	// this bufio.Reader.  Instead, a hack: we iteratively Peek up
-	// to the bufio.Reader's max size, looking for a double CRLF.
-	// This limits the trailer to the underlying buffer size, typically 4kB.
-	if !seeUpcomingDoubleCRLF(b.r) {
-		return errors.New("http: suspiciously long trailer after chunked body")
-	}
-
-	hdr, err := textproto.NewReader(b.r).ReadMIMEHeader()
-	if err != nil {
-		if err == io.EOF {
-			return errTrailerEOF
-		}
-		return err
-	}
-	switch rr := b.hdr.(type) {
-	case *Request:
-		mergeSetHeader(&rr.Trailer, Header(hdr))
-	case *Response:
-		mergeSetHeader(&rr.Trailer, Header(hdr))
-	}
-	return nil
-}
-
-func mergeSetHeader(dst *Header, src Header) {
-	if *dst == nil {
-		*dst = src
-		return
-	}
-	for k, vv := range src {
-		(*dst)[k] = vv
-	}
-}
-
-// unreadDataSizeLocked returns the number of bytes of unread input.
-// It returns -1 if unknown.
-// b.mu must be held.
-func (b *body) unreadDataSizeLocked() int64 {
-	if lr, ok := b.src.(*io.LimitedReader); ok {
-		return lr.N
-	}
-	return -1
-}
-
-func (b *body) Close() error {
-	b.mu.Lock()
-	defer b.mu.Unlock()
-	if b.closed {
-		return nil
-	}
-	var err error
-	switch {
-	case b.sawEOF:
-		// Already saw EOF, so no need going to look for it.
-	case b.hdr == nil && b.closing:
-		// no trailer and closing the connection next.
-		// no point in reading to EOF.
-	case b.doEarlyClose:
-		// Read up to maxPostHandlerReadBytes bytes of the body, looking for
-		// for EOF (and trailers), so we can re-use this connection.
-		if lr, ok := b.src.(*io.LimitedReader); ok && lr.N > maxPostHandlerReadBytes {
-			// There was a declared Content-Length, and we have more bytes remaining
-			// than our maxPostHandlerReadBytes tolerance. So, give up.
-			b.earlyClose = true
-		} else {
-			var n int64
-			// Consume the body, or, which will also lead to us reading
-			// the trailer headers after the body, if present.
-			n, err = io.CopyN(ioutil.Discard, bodyLocked{b}, maxPostHandlerReadBytes)
-			if err == io.EOF {
-				err = nil
-			}
-			if n == maxPostHandlerReadBytes {
-				b.earlyClose = true
-			}
-		}
-	default:
-		// Fully consume the body, which will also lead to us reading
-		// the trailer headers after the body, if present.
-		_, err = io.Copy(ioutil.Discard, bodyLocked{b})
-	}
-	b.closed = true
-	return err
-}
-
-func (b *body) didEarlyClose() bool {
-	b.mu.Lock()
-	defer b.mu.Unlock()
-	return b.earlyClose
-}
-
-// bodyLocked is a io.Reader reading from a *body when its mutex is
-// already held.
-type bodyLocked struct {
-	b *body
-}
-
-func (bl bodyLocked) Read(p []byte) (n int, err error) {
-	if bl.b.closed {
-		return 0, ErrBodyReadAfterClose
-	}
-	return bl.b.readLocked(p)
-}
-
-// parseContentLength trims whitespace from s and returns -1 if no value
-// is set, or the value if it's >= 0.
-func parseContentLength(cl string) (int64, error) {
-	cl = strings.TrimSpace(cl)
-	if cl == "" {
-		return -1, nil
-	}
-	n, err := strconv.ParseInt(cl, 10, 64)
-	if err != nil || n < 0 {
-		return 0, &badStringError{"bad Content-Length", cl}
-	}
-	return n, nil
-
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/transfer_test.go b/third_party/gofrontend/libgo/go/net/http/transfer_test.go
deleted file mode 100644
index 48cd540..0000000
--- a/third_party/gofrontend/libgo/go/net/http/transfer_test.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package http
-
-import (
-	"bufio"
-	"io"
-	"strings"
-	"testing"
-)
-
-func TestBodyReadBadTrailer(t *testing.T) {
-	b := &body{
-		src: strings.NewReader("foobar"),
-		hdr: true, // force reading the trailer
-		r:   bufio.NewReader(strings.NewReader("")),
-	}
-	buf := make([]byte, 7)
-	n, err := b.Read(buf[:3])
-	got := string(buf[:n])
-	if got != "foo" || err != nil {
-		t.Fatalf(`first Read = %d (%q), %v; want 3 ("foo")`, n, got, err)
-	}
-
-	n, err = b.Read(buf[:])
-	got = string(buf[:n])
-	if got != "bar" || err != nil {
-		t.Fatalf(`second Read = %d (%q), %v; want 3 ("bar")`, n, got, err)
-	}
-
-	n, err = b.Read(buf[:])
-	got = string(buf[:n])
-	if err == nil {
-		t.Errorf("final Read was successful (%q), expected error from trailer read", got)
-	}
-}
-
-func TestFinalChunkedBodyReadEOF(t *testing.T) {
-	res, err := ReadResponse(bufio.NewReader(strings.NewReader(
-		"HTTP/1.1 200 OK\r\n"+
-			"Transfer-Encoding: chunked\r\n"+
-			"\r\n"+
-			"0a\r\n"+
-			"Body here\n\r\n"+
-			"09\r\n"+
-			"continued\r\n"+
-			"0\r\n"+
-			"\r\n")), nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	want := "Body here\ncontinued"
-	buf := make([]byte, len(want))
-	n, err := res.Body.Read(buf)
-	if n != len(want) || err != io.EOF {
-		t.Logf("body = %#v", res.Body)
-		t.Errorf("Read = %v, %v; want %d, EOF", n, err, len(want))
-	}
-	if string(buf) != want {
-		t.Errorf("buf = %q; want %q", buf, want)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/transport.go b/third_party/gofrontend/libgo/go/net/http/transport.go
deleted file mode 100644
index 70d1864..0000000
--- a/third_party/gofrontend/libgo/go/net/http/transport.go
+++ /dev/null
@@ -1,1461 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// HTTP client implementation. See RFC 2616.
-//
-// This is the low-level Transport implementation of RoundTripper.
-// The high-level interface is in client.go.
-
-package http
-
-import (
-	"bufio"
-	"compress/gzip"
-	"crypto/tls"
-	"errors"
-	"fmt"
-	"io"
-	"log"
-	"net"
-	"net/url"
-	"os"
-	"strings"
-	"sync"
-	"time"
-)
-
-// DefaultTransport is the default implementation of Transport and is
-// used by DefaultClient. It establishes network connections as needed
-// and caches them for reuse by subsequent calls. It uses HTTP proxies
-// as directed by the $HTTP_PROXY and $NO_PROXY (or $http_proxy and
-// $no_proxy) environment variables.
-var DefaultTransport RoundTripper = &Transport{
-	Proxy: ProxyFromEnvironment,
-	Dial: (&net.Dialer{
-		Timeout:   30 * time.Second,
-		KeepAlive: 30 * time.Second,
-	}).Dial,
-	TLSHandshakeTimeout: 10 * time.Second,
-}
-
-// DefaultMaxIdleConnsPerHost is the default value of Transport's
-// MaxIdleConnsPerHost.
-const DefaultMaxIdleConnsPerHost = 2
-
-// Transport is an implementation of RoundTripper that supports HTTP,
-// HTTPS, and HTTP proxies (for either HTTP or HTTPS with CONNECT).
-// Transport can also cache connections for future re-use.
-type Transport struct {
-	idleMu     sync.Mutex
-	wantIdle   bool // user has requested to close all idle conns
-	idleConn   map[connectMethodKey][]*persistConn
-	idleConnCh map[connectMethodKey]chan *persistConn
-
-	reqMu       sync.Mutex
-	reqCanceler map[*Request]func()
-
-	altMu    sync.RWMutex
-	altProto map[string]RoundTripper // nil or map of URI scheme => RoundTripper
-
-	// Proxy specifies a function to return a proxy for a given
-	// Request. If the function returns a non-nil error, the
-	// request is aborted with the provided error.
-	// If Proxy is nil or returns a nil *URL, no proxy is used.
-	Proxy func(*Request) (*url.URL, error)
-
-	// Dial specifies the dial function for creating unencrypted
-	// TCP connections.
-	// If Dial is nil, net.Dial is used.
-	Dial func(network, addr string) (net.Conn, error)
-
-	// DialTLS specifies an optional dial function for creating
-	// TLS connections for non-proxied HTTPS requests.
-	//
-	// If DialTLS is nil, Dial and TLSClientConfig are used.
-	//
-	// If DialTLS is set, the Dial hook is not used for HTTPS
-	// requests and the TLSClientConfig and TLSHandshakeTimeout
-	// are ignored. The returned net.Conn is assumed to already be
-	// past the TLS handshake.
-	DialTLS func(network, addr string) (net.Conn, error)
-
-	// TLSClientConfig specifies the TLS configuration to use with
-	// tls.Client. If nil, the default configuration is used.
-	TLSClientConfig *tls.Config
-
-	// TLSHandshakeTimeout specifies the maximum amount of time waiting to
-	// wait for a TLS handshake. Zero means no timeout.
-	TLSHandshakeTimeout time.Duration
-
-	// DisableKeepAlives, if true, prevents re-use of TCP connections
-	// between different HTTP requests.
-	DisableKeepAlives bool
-
-	// DisableCompression, if true, prevents the Transport from
-	// requesting compression with an "Accept-Encoding: gzip"
-	// request header when the Request contains no existing
-	// Accept-Encoding value. If the Transport requests gzip on
-	// its own and gets a gzipped response, it's transparently
-	// decoded in the Response.Body. However, if the user
-	// explicitly requested gzip it is not automatically
-	// uncompressed.
-	DisableCompression bool
-
-	// MaxIdleConnsPerHost, if non-zero, controls the maximum idle
-	// (keep-alive) to keep per-host.  If zero,
-	// DefaultMaxIdleConnsPerHost is used.
-	MaxIdleConnsPerHost int
-
-	// ResponseHeaderTimeout, if non-zero, specifies the amount of
-	// time to wait for a server's response headers after fully
-	// writing the request (including its body, if any). This
-	// time does not include the time to read the response body.
-	ResponseHeaderTimeout time.Duration
-
-	// TODO: tunable on global max cached connections
-	// TODO: tunable on timeout on cached connections
-}
-
-// ProxyFromEnvironment returns the URL of the proxy to use for a
-// given request, as indicated by the environment variables
-// HTTP_PROXY, HTTPS_PROXY and NO_PROXY (or the lowercase versions
-// thereof). HTTPS_PROXY takes precedence over HTTP_PROXY for https
-// requests.
-//
-// The environment values may be either a complete URL or a
-// "host[:port]", in which case the "http" scheme is assumed.
-// An error is returned if the value is a different form.
-//
-// A nil URL and nil error are returned if no proxy is defined in the
-// environment, or a proxy should not be used for the given request,
-// as defined by NO_PROXY.
-//
-// As a special case, if req.URL.Host is "localhost" (with or without
-// a port number), then a nil URL and nil error will be returned.
-func ProxyFromEnvironment(req *Request) (*url.URL, error) {
-	var proxy string
-	if req.URL.Scheme == "https" {
-		proxy = httpsProxyEnv.Get()
-	}
-	if proxy == "" {
-		proxy = httpProxyEnv.Get()
-	}
-	if proxy == "" {
-		return nil, nil
-	}
-	if !useProxy(canonicalAddr(req.URL)) {
-		return nil, nil
-	}
-	proxyURL, err := url.Parse(proxy)
-	if err != nil || !strings.HasPrefix(proxyURL.Scheme, "http") {
-		// proxy was bogus. Try prepending "http://" to it and
-		// see if that parses correctly. If not, we fall
-		// through and complain about the original one.
-		if proxyURL, err := url.Parse("http://" + proxy); err == nil {
-			return proxyURL, nil
-		}
-	}
-	if err != nil {
-		return nil, fmt.Errorf("invalid proxy address %q: %v", proxy, err)
-	}
-	return proxyURL, nil
-}
-
-// ProxyURL returns a proxy function (for use in a Transport)
-// that always returns the same URL.
-func ProxyURL(fixedURL *url.URL) func(*Request) (*url.URL, error) {
-	return func(*Request) (*url.URL, error) {
-		return fixedURL, nil
-	}
-}
-
-// transportRequest is a wrapper around a *Request that adds
-// optional extra headers to write.
-type transportRequest struct {
-	*Request        // original request, not to be mutated
-	extra    Header // extra headers to write, or nil
-}
-
-func (tr *transportRequest) extraHeaders() Header {
-	if tr.extra == nil {
-		tr.extra = make(Header)
-	}
-	return tr.extra
-}
-
-// RoundTrip implements the RoundTripper interface.
-//
-// For higher-level HTTP client support (such as handling of cookies
-// and redirects), see Get, Post, and the Client type.
-func (t *Transport) RoundTrip(req *Request) (resp *Response, err error) {
-	if req.URL == nil {
-		req.closeBody()
-		return nil, errors.New("http: nil Request.URL")
-	}
-	if req.Header == nil {
-		req.closeBody()
-		return nil, errors.New("http: nil Request.Header")
-	}
-	if req.URL.Scheme != "http" && req.URL.Scheme != "https" {
-		t.altMu.RLock()
-		var rt RoundTripper
-		if t.altProto != nil {
-			rt = t.altProto[req.URL.Scheme]
-		}
-		t.altMu.RUnlock()
-		if rt == nil {
-			req.closeBody()
-			return nil, &badStringError{"unsupported protocol scheme", req.URL.Scheme}
-		}
-		return rt.RoundTrip(req)
-	}
-	if req.URL.Host == "" {
-		req.closeBody()
-		return nil, errors.New("http: no Host in request URL")
-	}
-	treq := &transportRequest{Request: req}
-	cm, err := t.connectMethodForRequest(treq)
-	if err != nil {
-		req.closeBody()
-		return nil, err
-	}
-
-	// Get the cached or newly-created connection to either the
-	// host (for http or https), the http proxy, or the http proxy
-	// pre-CONNECTed to https server.  In any case, we'll be ready
-	// to send it requests.
-	pconn, err := t.getConn(req, cm)
-	if err != nil {
-		t.setReqCanceler(req, nil)
-		req.closeBody()
-		return nil, err
-	}
-
-	return pconn.roundTrip(treq)
-}
-
-// RegisterProtocol registers a new protocol with scheme.
-// The Transport will pass requests using the given scheme to rt.
-// It is rt's responsibility to simulate HTTP request semantics.
-//
-// RegisterProtocol can be used by other packages to provide
-// implementations of protocol schemes like "ftp" or "file".
-func (t *Transport) RegisterProtocol(scheme string, rt RoundTripper) {
-	if scheme == "http" || scheme == "https" {
-		panic("protocol " + scheme + " already registered")
-	}
-	t.altMu.Lock()
-	defer t.altMu.Unlock()
-	if t.altProto == nil {
-		t.altProto = make(map[string]RoundTripper)
-	}
-	if _, exists := t.altProto[scheme]; exists {
-		panic("protocol " + scheme + " already registered")
-	}
-	t.altProto[scheme] = rt
-}
-
-// CloseIdleConnections closes any connections which were previously
-// connected from previous requests but are now sitting idle in
-// a "keep-alive" state. It does not interrupt any connections currently
-// in use.
-func (t *Transport) CloseIdleConnections() {
-	t.idleMu.Lock()
-	m := t.idleConn
-	t.idleConn = nil
-	t.idleConnCh = nil
-	t.wantIdle = true
-	t.idleMu.Unlock()
-	for _, conns := range m {
-		for _, pconn := range conns {
-			pconn.close()
-		}
-	}
-}
-
-// CancelRequest cancels an in-flight request by closing its connection.
-// CancelRequest should only be called after RoundTrip has returned.
-func (t *Transport) CancelRequest(req *Request) {
-	t.reqMu.Lock()
-	cancel := t.reqCanceler[req]
-	delete(t.reqCanceler, req)
-	t.reqMu.Unlock()
-	if cancel != nil {
-		cancel()
-	}
-}
-
-//
-// Private implementation past this point.
-//
-
-var (
-	httpProxyEnv = &envOnce{
-		names: []string{"HTTP_PROXY", "http_proxy"},
-	}
-	httpsProxyEnv = &envOnce{
-		names: []string{"HTTPS_PROXY", "https_proxy"},
-	}
-	noProxyEnv = &envOnce{
-		names: []string{"NO_PROXY", "no_proxy"},
-	}
-)
-
-// envOnce looks up an environment variable (optionally by multiple
-// names) once. It mitigates expensive lookups on some platforms
-// (e.g. Windows).
-type envOnce struct {
-	names []string
-	once  sync.Once
-	val   string
-}
-
-func (e *envOnce) Get() string {
-	e.once.Do(e.init)
-	return e.val
-}
-
-func (e *envOnce) init() {
-	for _, n := range e.names {
-		e.val = os.Getenv(n)
-		if e.val != "" {
-			return
-		}
-	}
-}
-
-// reset is used by tests
-func (e *envOnce) reset() {
-	e.once = sync.Once{}
-	e.val = ""
-}
-
-func (t *Transport) connectMethodForRequest(treq *transportRequest) (cm connectMethod, err error) {
-	cm.targetScheme = treq.URL.Scheme
-	cm.targetAddr = canonicalAddr(treq.URL)
-	if t.Proxy != nil {
-		cm.proxyURL, err = t.Proxy(treq.Request)
-	}
-	return cm, err
-}
-
-// proxyAuth returns the Proxy-Authorization header to set
-// on requests, if applicable.
-func (cm *connectMethod) proxyAuth() string {
-	if cm.proxyURL == nil {
-		return ""
-	}
-	if u := cm.proxyURL.User; u != nil {
-		username := u.Username()
-		password, _ := u.Password()
-		return "Basic " + basicAuth(username, password)
-	}
-	return ""
-}
-
-// putIdleConn adds pconn to the list of idle persistent connections awaiting
-// a new request.
-// If pconn is no longer needed or not in a good state, putIdleConn
-// returns false.
-func (t *Transport) putIdleConn(pconn *persistConn) bool {
-	if t.DisableKeepAlives || t.MaxIdleConnsPerHost < 0 {
-		pconn.close()
-		return false
-	}
-	if pconn.isBroken() {
-		return false
-	}
-	key := pconn.cacheKey
-	max := t.MaxIdleConnsPerHost
-	if max == 0 {
-		max = DefaultMaxIdleConnsPerHost
-	}
-	t.idleMu.Lock()
-
-	waitingDialer := t.idleConnCh[key]
-	select {
-	case waitingDialer <- pconn:
-		// We're done with this pconn and somebody else is
-		// currently waiting for a conn of this type (they're
-		// actively dialing, but this conn is ready
-		// first). Chrome calls this socket late binding.  See
-		// https://insouciant.org/tech/connection-management-in-chromium/
-		t.idleMu.Unlock()
-		return true
-	default:
-		if waitingDialer != nil {
-			// They had populated this, but their dial won
-			// first, so we can clean up this map entry.
-			delete(t.idleConnCh, key)
-		}
-	}
-	if t.wantIdle {
-		t.idleMu.Unlock()
-		pconn.close()
-		return false
-	}
-	if t.idleConn == nil {
-		t.idleConn = make(map[connectMethodKey][]*persistConn)
-	}
-	if len(t.idleConn[key]) >= max {
-		t.idleMu.Unlock()
-		pconn.close()
-		return false
-	}
-	for _, exist := range t.idleConn[key] {
-		if exist == pconn {
-			log.Fatalf("dup idle pconn %p in freelist", pconn)
-		}
-	}
-	t.idleConn[key] = append(t.idleConn[key], pconn)
-	t.idleMu.Unlock()
-	return true
-}
-
-// getIdleConnCh returns a channel to receive and return idle
-// persistent connection for the given connectMethod.
-// It may return nil, if persistent connections are not being used.
-func (t *Transport) getIdleConnCh(cm connectMethod) chan *persistConn {
-	if t.DisableKeepAlives {
-		return nil
-	}
-	key := cm.key()
-	t.idleMu.Lock()
-	defer t.idleMu.Unlock()
-	t.wantIdle = false
-	if t.idleConnCh == nil {
-		t.idleConnCh = make(map[connectMethodKey]chan *persistConn)
-	}
-	ch, ok := t.idleConnCh[key]
-	if !ok {
-		ch = make(chan *persistConn)
-		t.idleConnCh[key] = ch
-	}
-	return ch
-}
-
-func (t *Transport) getIdleConn(cm connectMethod) (pconn *persistConn) {
-	key := cm.key()
-	t.idleMu.Lock()
-	defer t.idleMu.Unlock()
-	if t.idleConn == nil {
-		return nil
-	}
-	for {
-		pconns, ok := t.idleConn[key]
-		if !ok {
-			return nil
-		}
-		if len(pconns) == 1 {
-			pconn = pconns[0]
-			delete(t.idleConn, key)
-		} else {
-			// 2 or more cached connections; pop last
-			// TODO: queue?
-			pconn = pconns[len(pconns)-1]
-			t.idleConn[key] = pconns[:len(pconns)-1]
-		}
-		if !pconn.isBroken() {
-			return
-		}
-	}
-}
-
-func (t *Transport) setReqCanceler(r *Request, fn func()) {
-	t.reqMu.Lock()
-	defer t.reqMu.Unlock()
-	if t.reqCanceler == nil {
-		t.reqCanceler = make(map[*Request]func())
-	}
-	if fn != nil {
-		t.reqCanceler[r] = fn
-	} else {
-		delete(t.reqCanceler, r)
-	}
-}
-
-// replaceReqCanceler replaces an existing cancel function. If there is no cancel function
-// for the request, we don't set the function and return false.
-// Since CancelRequest will clear the canceler, we can use the return value to detect if
-// the request was canceled since the last setReqCancel call.
-func (t *Transport) replaceReqCanceler(r *Request, fn func()) bool {
-	t.reqMu.Lock()
-	defer t.reqMu.Unlock()
-	_, ok := t.reqCanceler[r]
-	if !ok {
-		return false
-	}
-	if fn != nil {
-		t.reqCanceler[r] = fn
-	} else {
-		delete(t.reqCanceler, r)
-	}
-	return true
-}
-
-func (t *Transport) dial(network, addr string) (c net.Conn, err error) {
-	if t.Dial != nil {
-		return t.Dial(network, addr)
-	}
-	return net.Dial(network, addr)
-}
-
-// Testing hooks:
-var prePendingDial, postPendingDial func()
-
-// getConn dials and creates a new persistConn to the target as
-// specified in the connectMethod.  This includes doing a proxy CONNECT
-// and/or setting up TLS.  If this doesn't return an error, the persistConn
-// is ready to write requests to.
-func (t *Transport) getConn(req *Request, cm connectMethod) (*persistConn, error) {
-	if pc := t.getIdleConn(cm); pc != nil {
-		// set request canceler to some non-nil function so we
-		// can detect whether it was cleared between now and when
-		// we enter roundTrip
-		t.setReqCanceler(req, func() {})
-		return pc, nil
-	}
-
-	type dialRes struct {
-		pc  *persistConn
-		err error
-	}
-	dialc := make(chan dialRes)
-
-	// Copy these hooks so we don't race on the postPendingDial in
-	// the goroutine we launch. Issue 11136.
-	prePendingDial := prePendingDial
-	postPendingDial := postPendingDial
-
-	handlePendingDial := func() {
-		if prePendingDial != nil {
-			prePendingDial()
-		}
-		go func() {
-			if v := <-dialc; v.err == nil {
-				t.putIdleConn(v.pc)
-			}
-			if postPendingDial != nil {
-				postPendingDial()
-			}
-		}()
-	}
-
-	cancelc := make(chan struct{})
-	t.setReqCanceler(req, func() { close(cancelc) })
-
-	go func() {
-		pc, err := t.dialConn(cm)
-		dialc <- dialRes{pc, err}
-	}()
-
-	idleConnCh := t.getIdleConnCh(cm)
-	select {
-	case v := <-dialc:
-		// Our dial finished.
-		return v.pc, v.err
-	case pc := <-idleConnCh:
-		// Another request finished first and its net.Conn
-		// became available before our dial. Or somebody
-		// else's dial that they didn't use.
-		// But our dial is still going, so give it away
-		// when it finishes:
-		handlePendingDial()
-		return pc, nil
-	case <-req.Cancel:
-		handlePendingDial()
-		return nil, errors.New("net/http: request canceled while waiting for connection")
-	case <-cancelc:
-		handlePendingDial()
-		return nil, errors.New("net/http: request canceled while waiting for connection")
-	}
-}
-
-func (t *Transport) dialConn(cm connectMethod) (*persistConn, error) {
-	pconn := &persistConn{
-		t:          t,
-		cacheKey:   cm.key(),
-		reqch:      make(chan requestAndChan, 1),
-		writech:    make(chan writeRequest, 1),
-		closech:    make(chan struct{}),
-		writeErrCh: make(chan error, 1),
-	}
-	tlsDial := t.DialTLS != nil && cm.targetScheme == "https" && cm.proxyURL == nil
-	if tlsDial {
-		var err error
-		pconn.conn, err = t.DialTLS("tcp", cm.addr())
-		if err != nil {
-			return nil, err
-		}
-		if tc, ok := pconn.conn.(*tls.Conn); ok {
-			cs := tc.ConnectionState()
-			pconn.tlsState = &cs
-		}
-	} else {
-		conn, err := t.dial("tcp", cm.addr())
-		if err != nil {
-			if cm.proxyURL != nil {
-				err = fmt.Errorf("http: error connecting to proxy %s: %v", cm.proxyURL, err)
-			}
-			return nil, err
-		}
-		pconn.conn = conn
-	}
-
-	// Proxy setup.
-	switch {
-	case cm.proxyURL == nil:
-		// Do nothing. Not using a proxy.
-	case cm.targetScheme == "http":
-		pconn.isProxy = true
-		if pa := cm.proxyAuth(); pa != "" {
-			pconn.mutateHeaderFunc = func(h Header) {
-				h.Set("Proxy-Authorization", pa)
-			}
-		}
-	case cm.targetScheme == "https":
-		conn := pconn.conn
-		connectReq := &Request{
-			Method: "CONNECT",
-			URL:    &url.URL{Opaque: cm.targetAddr},
-			Host:   cm.targetAddr,
-			Header: make(Header),
-		}
-		if pa := cm.proxyAuth(); pa != "" {
-			connectReq.Header.Set("Proxy-Authorization", pa)
-		}
-		connectReq.Write(conn)
-
-		// Read response.
-		// Okay to use and discard buffered reader here, because
-		// TLS server will not speak until spoken to.
-		br := bufio.NewReader(conn)
-		resp, err := ReadResponse(br, connectReq)
-		if err != nil {
-			conn.Close()
-			return nil, err
-		}
-		if resp.StatusCode != 200 {
-			f := strings.SplitN(resp.Status, " ", 2)
-			conn.Close()
-			return nil, errors.New(f[1])
-		}
-	}
-
-	if cm.targetScheme == "https" && !tlsDial {
-		// Initiate TLS and check remote host name against certificate.
-		cfg := cloneTLSClientConfig(t.TLSClientConfig)
-		if cfg.ServerName == "" {
-			cfg.ServerName = cm.tlsHost()
-		}
-		plainConn := pconn.conn
-		tlsConn := tls.Client(plainConn, cfg)
-		errc := make(chan error, 2)
-		var timer *time.Timer // for canceling TLS handshake
-		if d := t.TLSHandshakeTimeout; d != 0 {
-			timer = time.AfterFunc(d, func() {
-				errc <- tlsHandshakeTimeoutError{}
-			})
-		}
-		go func() {
-			err := tlsConn.Handshake()
-			if timer != nil {
-				timer.Stop()
-			}
-			errc <- err
-		}()
-		if err := <-errc; err != nil {
-			plainConn.Close()
-			return nil, err
-		}
-		if !cfg.InsecureSkipVerify {
-			if err := tlsConn.VerifyHostname(cfg.ServerName); err != nil {
-				plainConn.Close()
-				return nil, err
-			}
-		}
-		cs := tlsConn.ConnectionState()
-		pconn.tlsState = &cs
-		pconn.conn = tlsConn
-	}
-
-	pconn.br = bufio.NewReader(noteEOFReader{pconn.conn, &pconn.sawEOF})
-	pconn.bw = bufio.NewWriter(pconn.conn)
-	go pconn.readLoop()
-	go pconn.writeLoop()
-	return pconn, nil
-}
-
-// useProxy reports whether requests to addr should use a proxy,
-// according to the NO_PROXY or no_proxy environment variable.
-// addr is always a canonicalAddr with a host and port.
-func useProxy(addr string) bool {
-	if len(addr) == 0 {
-		return true
-	}
-	host, _, err := net.SplitHostPort(addr)
-	if err != nil {
-		return false
-	}
-	if host == "localhost" {
-		return false
-	}
-	if ip := net.ParseIP(host); ip != nil {
-		if ip.IsLoopback() {
-			return false
-		}
-	}
-
-	no_proxy := noProxyEnv.Get()
-	if no_proxy == "*" {
-		return false
-	}
-
-	addr = strings.ToLower(strings.TrimSpace(addr))
-	if hasPort(addr) {
-		addr = addr[:strings.LastIndex(addr, ":")]
-	}
-
-	for _, p := range strings.Split(no_proxy, ",") {
-		p = strings.ToLower(strings.TrimSpace(p))
-		if len(p) == 0 {
-			continue
-		}
-		if hasPort(p) {
-			p = p[:strings.LastIndex(p, ":")]
-		}
-		if addr == p {
-			return false
-		}
-		if p[0] == '.' && (strings.HasSuffix(addr, p) || addr == p[1:]) {
-			// no_proxy ".foo.com" matches "bar.foo.com" or "foo.com"
-			return false
-		}
-		if p[0] != '.' && strings.HasSuffix(addr, p) && addr[len(addr)-len(p)-1] == '.' {
-			// no_proxy "foo.com" matches "bar.foo.com"
-			return false
-		}
-	}
-	return true
-}
-
-// connectMethod is the map key (in its String form) for keeping persistent
-// TCP connections alive for subsequent HTTP requests.
-//
-// A connect method may be of the following types:
-//
-// Cache key form                Description
-// -----------------             -------------------------
-// |http|foo.com                 http directly to server, no proxy
-// |https|foo.com                https directly to server, no proxy
-// http://proxy.com|https|foo.com  http to proxy, then CONNECT to foo.com
-// http://proxy.com|http           http to proxy, http to anywhere after that
-//
-// Note: no support to https to the proxy yet.
-//
-type connectMethod struct {
-	proxyURL     *url.URL // nil for no proxy, else full proxy URL
-	targetScheme string   // "http" or "https"
-	targetAddr   string   // Not used if proxy + http targetScheme (4th example in table)
-}
-
-func (cm *connectMethod) key() connectMethodKey {
-	proxyStr := ""
-	targetAddr := cm.targetAddr
-	if cm.proxyURL != nil {
-		proxyStr = cm.proxyURL.String()
-		if cm.targetScheme == "http" {
-			targetAddr = ""
-		}
-	}
-	return connectMethodKey{
-		proxy:  proxyStr,
-		scheme: cm.targetScheme,
-		addr:   targetAddr,
-	}
-}
-
-// addr returns the first hop "host:port" to which we need to TCP connect.
-func (cm *connectMethod) addr() string {
-	if cm.proxyURL != nil {
-		return canonicalAddr(cm.proxyURL)
-	}
-	return cm.targetAddr
-}
-
-// tlsHost returns the host name to match against the peer's
-// TLS certificate.
-func (cm *connectMethod) tlsHost() string {
-	h := cm.targetAddr
-	if hasPort(h) {
-		h = h[:strings.LastIndex(h, ":")]
-	}
-	return h
-}
-
-// connectMethodKey is the map key version of connectMethod, with a
-// stringified proxy URL (or the empty string) instead of a pointer to
-// a URL.
-type connectMethodKey struct {
-	proxy, scheme, addr string
-}
-
-func (k connectMethodKey) String() string {
-	// Only used by tests.
-	return fmt.Sprintf("%s|%s|%s", k.proxy, k.scheme, k.addr)
-}
-
-// persistConn wraps a connection, usually a persistent one
-// (but may be used for non-keep-alive requests as well)
-type persistConn struct {
-	t        *Transport
-	cacheKey connectMethodKey
-	conn     net.Conn
-	tlsState *tls.ConnectionState
-	br       *bufio.Reader       // from conn
-	sawEOF   bool                // whether we've seen EOF from conn; owned by readLoop
-	bw       *bufio.Writer       // to conn
-	reqch    chan requestAndChan // written by roundTrip; read by readLoop
-	writech  chan writeRequest   // written by roundTrip; read by writeLoop
-	closech  chan struct{}       // closed when conn closed
-	isProxy  bool
-	// writeErrCh passes the request write error (usually nil)
-	// from the writeLoop goroutine to the readLoop which passes
-	// it off to the res.Body reader, which then uses it to decide
-	// whether or not a connection can be reused. Issue 7569.
-	writeErrCh chan error
-
-	lk                   sync.Mutex // guards following fields
-	numExpectedResponses int
-	closed               bool // whether conn has been closed
-	broken               bool // an error has happened on this connection; marked broken so it's not reused.
-	canceled             bool // whether this conn was broken due a CancelRequest
-	// mutateHeaderFunc is an optional func to modify extra
-	// headers on each outbound request before it's written. (the
-	// original Request given to RoundTrip is not modified)
-	mutateHeaderFunc func(Header)
-}
-
-// isBroken reports whether this connection is in a known broken state.
-func (pc *persistConn) isBroken() bool {
-	pc.lk.Lock()
-	b := pc.broken
-	pc.lk.Unlock()
-	return b
-}
-
-// isCanceled reports whether this connection was closed due to CancelRequest.
-func (pc *persistConn) isCanceled() bool {
-	pc.lk.Lock()
-	defer pc.lk.Unlock()
-	return pc.canceled
-}
-
-func (pc *persistConn) cancelRequest() {
-	pc.lk.Lock()
-	defer pc.lk.Unlock()
-	pc.canceled = true
-	pc.closeLocked()
-}
-
-func (pc *persistConn) readLoop() {
-	// eofc is used to block http.Handler goroutines reading from Response.Body
-	// at EOF until this goroutines has (potentially) added the connection
-	// back to the idle pool.
-	eofc := make(chan struct{})
-	defer close(eofc) // unblock reader on errors
-
-	// Read this once, before loop starts. (to avoid races in tests)
-	testHookMu.Lock()
-	testHookReadLoopBeforeNextRead := testHookReadLoopBeforeNextRead
-	testHookMu.Unlock()
-
-	alive := true
-	for alive {
-		pb, err := pc.br.Peek(1)
-
-		pc.lk.Lock()
-		if pc.numExpectedResponses == 0 {
-			if !pc.closed {
-				pc.closeLocked()
-				if len(pb) > 0 {
-					log.Printf("Unsolicited response received on idle HTTP channel starting with %q; err=%v",
-						string(pb), err)
-				}
-			}
-			pc.lk.Unlock()
-			return
-		}
-		pc.lk.Unlock()
-
-		rc := <-pc.reqch
-
-		var resp *Response
-		if err == nil {
-			resp, err = ReadResponse(pc.br, rc.req)
-			if err == nil && resp.StatusCode == 100 {
-				// Skip any 100-continue for now.
-				// TODO(bradfitz): if rc.req had "Expect: 100-continue",
-				// actually block the request body write and signal the
-				// writeLoop now to begin sending it. (Issue 2184) For now we
-				// eat it, since we're never expecting one.
-				resp, err = ReadResponse(pc.br, rc.req)
-			}
-		}
-
-		if resp != nil {
-			resp.TLS = pc.tlsState
-		}
-
-		hasBody := resp != nil && rc.req.Method != "HEAD" && resp.ContentLength != 0
-
-		if err != nil {
-			pc.close()
-		} else {
-			if rc.addedGzip && hasBody && resp.Header.Get("Content-Encoding") == "gzip" {
-				resp.Header.Del("Content-Encoding")
-				resp.Header.Del("Content-Length")
-				resp.ContentLength = -1
-				resp.Body = &gzipReader{body: resp.Body}
-			}
-			resp.Body = &bodyEOFSignal{body: resp.Body}
-		}
-
-		if err != nil || resp.Close || rc.req.Close || resp.StatusCode <= 199 {
-			// Don't do keep-alive on error if either party requested a close
-			// or we get an unexpected informational (1xx) response.
-			// StatusCode 100 is already handled above.
-			alive = false
-		}
-
-		var waitForBodyRead chan bool // channel is nil when there's no body
-		if hasBody {
-			waitForBodyRead = make(chan bool, 2)
-			resp.Body.(*bodyEOFSignal).earlyCloseFn = func() error {
-				waitForBodyRead <- false
-				return nil
-			}
-			resp.Body.(*bodyEOFSignal).fn = func(err error) error {
-				isEOF := err == io.EOF
-				waitForBodyRead <- isEOF
-				if isEOF {
-					<-eofc // see comment at top
-				} else if err != nil && pc.isCanceled() {
-					return errRequestCanceled
-				}
-				return err
-			}
-		} else {
-			// Before send on rc.ch, as client might re-use the
-			// same *Request pointer, and we don't want to set this
-			// on t from this persistConn while the Transport
-			// potentially spins up a different persistConn for the
-			// caller's subsequent request.
-			pc.t.setReqCanceler(rc.req, nil)
-		}
-
-		pc.lk.Lock()
-		pc.numExpectedResponses--
-		pc.lk.Unlock()
-
-		// The connection might be going away when we put the
-		// idleConn below. When that happens, we close the response channel to signal
-		// to roundTrip that the connection is gone. roundTrip waits for
-		// both closing and a response in a select, so it might choose
-		// the close channel, rather than the response.
-		// We send the response first so that roundTrip can check
-		// if there is a pending one with a non-blocking select
-		// on the response channel before erroring out.
-		rc.ch <- responseAndError{resp, err}
-
-		if hasBody {
-			// To avoid a race, wait for the just-returned
-			// response body to be fully consumed before peek on
-			// the underlying bufio reader.
-			select {
-			case <-rc.req.Cancel:
-				alive = false
-				pc.t.CancelRequest(rc.req)
-			case bodyEOF := <-waitForBodyRead:
-				pc.t.setReqCanceler(rc.req, nil) // before pc might return to idle pool
-				alive = alive &&
-					bodyEOF &&
-					!pc.sawEOF &&
-					pc.wroteRequest() &&
-					pc.t.putIdleConn(pc)
-				if bodyEOF {
-					eofc <- struct{}{}
-				}
-			case <-pc.closech:
-				alive = false
-			}
-		} else {
-			alive = alive &&
-				!pc.sawEOF &&
-				pc.wroteRequest() &&
-				pc.t.putIdleConn(pc)
-		}
-
-		if hook := testHookReadLoopBeforeNextRead; hook != nil {
-			hook()
-		}
-	}
-	pc.close()
-}
-
-func (pc *persistConn) writeLoop() {
-	for {
-		select {
-		case wr := <-pc.writech:
-			if pc.isBroken() {
-				wr.ch <- errors.New("http: can't write HTTP request on broken connection")
-				continue
-			}
-			err := wr.req.Request.write(pc.bw, pc.isProxy, wr.req.extra)
-			if err == nil {
-				err = pc.bw.Flush()
-			}
-			if err != nil {
-				pc.markBroken()
-				wr.req.Request.closeBody()
-			}
-			pc.writeErrCh <- err // to the body reader, which might recycle us
-			wr.ch <- err         // to the roundTrip function
-		case <-pc.closech:
-			return
-		}
-	}
-}
-
-// wroteRequest is a check before recycling a connection that the previous write
-// (from writeLoop above) happened and was successful.
-func (pc *persistConn) wroteRequest() bool {
-	select {
-	case err := <-pc.writeErrCh:
-		// Common case: the write happened well before the response, so
-		// avoid creating a timer.
-		return err == nil
-	default:
-		// Rare case: the request was written in writeLoop above but
-		// before it could send to pc.writeErrCh, the reader read it
-		// all, processed it, and called us here. In this case, give the
-		// write goroutine a bit of time to finish its send.
-		//
-		// Less rare case: We also get here in the legitimate case of
-		// Issue 7569, where the writer is still writing (or stalled),
-		// but the server has already replied. In this case, we don't
-		// want to wait too long, and we want to return false so this
-		// connection isn't re-used.
-		select {
-		case err := <-pc.writeErrCh:
-			return err == nil
-		case <-time.After(50 * time.Millisecond):
-			return false
-		}
-	}
-}
-
-type responseAndError struct {
-	res *Response
-	err error
-}
-
-type requestAndChan struct {
-	req *Request
-	ch  chan responseAndError
-
-	// did the Transport (as opposed to the client code) add an
-	// Accept-Encoding gzip header? only if it we set it do
-	// we transparently decode the gzip.
-	addedGzip bool
-}
-
-// A writeRequest is sent by the readLoop's goroutine to the
-// writeLoop's goroutine to write a request while the read loop
-// concurrently waits on both the write response and the server's
-// reply.
-type writeRequest struct {
-	req *transportRequest
-	ch  chan<- error
-}
-
-type httpError struct {
-	err     string
-	timeout bool
-}
-
-func (e *httpError) Error() string   { return e.err }
-func (e *httpError) Timeout() bool   { return e.timeout }
-func (e *httpError) Temporary() bool { return true }
-
-var errTimeout error = &httpError{err: "net/http: timeout awaiting response headers", timeout: true}
-var errClosed error = &httpError{err: "net/http: transport closed before response was received"}
-var errRequestCanceled = errors.New("net/http: request canceled")
-
-// nil except for tests
-var (
-	testHookPersistConnClosedGotRes func()
-	testHookEnterRoundTrip          func()
-	testHookMu                      sync.Locker = fakeLocker{} // guards following
-	testHookReadLoopBeforeNextRead  func()
-)
-
-func (pc *persistConn) roundTrip(req *transportRequest) (resp *Response, err error) {
-	if hook := testHookEnterRoundTrip; hook != nil {
-		hook()
-	}
-	if !pc.t.replaceReqCanceler(req.Request, pc.cancelRequest) {
-		pc.t.putIdleConn(pc)
-		return nil, errRequestCanceled
-	}
-	pc.lk.Lock()
-	pc.numExpectedResponses++
-	headerFn := pc.mutateHeaderFunc
-	pc.lk.Unlock()
-
-	if headerFn != nil {
-		headerFn(req.extraHeaders())
-	}
-
-	// Ask for a compressed version if the caller didn't set their
-	// own value for Accept-Encoding. We only attempt to
-	// uncompress the gzip stream if we were the layer that
-	// requested it.
-	requestedGzip := false
-	if !pc.t.DisableCompression &&
-		req.Header.Get("Accept-Encoding") == "" &&
-		req.Header.Get("Range") == "" &&
-		req.Method != "HEAD" {
-		// Request gzip only, not deflate. Deflate is ambiguous and
-		// not as universally supported anyway.
-		// See: http://www.gzip.org/zlib/zlib_faq.html#faq38
-		//
-		// Note that we don't request this for HEAD requests,
-		// due to a bug in nginx:
-		//   http://trac.nginx.org/nginx/ticket/358
-		//   https://golang.org/issue/5522
-		//
-		// We don't request gzip if the request is for a range, since
-		// auto-decoding a portion of a gzipped document will just fail
-		// anyway. See https://golang.org/issue/8923
-		requestedGzip = true
-		req.extraHeaders().Set("Accept-Encoding", "gzip")
-	}
-
-	if pc.t.DisableKeepAlives {
-		req.extraHeaders().Set("Connection", "close")
-	}
-
-	// Write the request concurrently with waiting for a response,
-	// in case the server decides to reply before reading our full
-	// request body.
-	writeErrCh := make(chan error, 1)
-	pc.writech <- writeRequest{req, writeErrCh}
-
-	resc := make(chan responseAndError, 1)
-	pc.reqch <- requestAndChan{req.Request, resc, requestedGzip}
-
-	var re responseAndError
-	var respHeaderTimer <-chan time.Time
-	cancelChan := req.Request.Cancel
-WaitResponse:
-	for {
-		select {
-		case err := <-writeErrCh:
-			if isNetWriteError(err) {
-				// Issue 11745. If we failed to write the request
-				// body, it's possible the server just heard enough
-				// and already wrote to us. Prioritize the server's
-				// response over returning a body write error.
-				select {
-				case re = <-resc:
-					pc.close()
-					break WaitResponse
-				case <-time.After(50 * time.Millisecond):
-					// Fall through.
-				}
-			}
-			if err != nil {
-				re = responseAndError{nil, err}
-				pc.close()
-				break WaitResponse
-			}
-			if d := pc.t.ResponseHeaderTimeout; d > 0 {
-				timer := time.NewTimer(d)
-				defer timer.Stop() // prevent leaks
-				respHeaderTimer = timer.C
-			}
-		case <-pc.closech:
-			// The persist connection is dead. This shouldn't
-			// usually happen (only with Connection: close responses
-			// with no response bodies), but if it does happen it
-			// means either a) the remote server hung up on us
-			// prematurely, or b) the readLoop sent us a response &
-			// closed its closech at roughly the same time, and we
-			// selected this case first. If we got a response, readLoop makes sure
-			// to send it before it puts the conn and closes the channel.
-			// That way, we can fetch the response, if there is one,
-			// with a non-blocking receive.
-			select {
-			case re = <-resc:
-				if fn := testHookPersistConnClosedGotRes; fn != nil {
-					fn()
-				}
-			default:
-				re = responseAndError{err: errClosed}
-				if pc.isCanceled() {
-					re = responseAndError{err: errRequestCanceled}
-				}
-			}
-			break WaitResponse
-		case <-respHeaderTimer:
-			pc.close()
-			re = responseAndError{err: errTimeout}
-			break WaitResponse
-		case re = <-resc:
-			break WaitResponse
-		case <-cancelChan:
-			pc.t.CancelRequest(req.Request)
-			cancelChan = nil
-		}
-	}
-
-	if re.err != nil {
-		pc.t.setReqCanceler(req.Request, nil)
-	}
-	return re.res, re.err
-}
-
-// markBroken marks a connection as broken (so it's not reused).
-// It differs from close in that it doesn't close the underlying
-// connection for use when it's still being read.
-func (pc *persistConn) markBroken() {
-	pc.lk.Lock()
-	defer pc.lk.Unlock()
-	pc.broken = true
-}
-
-func (pc *persistConn) close() {
-	pc.lk.Lock()
-	defer pc.lk.Unlock()
-	pc.closeLocked()
-}
-
-func (pc *persistConn) closeLocked() {
-	pc.broken = true
-	if !pc.closed {
-		pc.conn.Close()
-		pc.closed = true
-		close(pc.closech)
-	}
-	pc.mutateHeaderFunc = nil
-}
-
-var portMap = map[string]string{
-	"http":  "80",
-	"https": "443",
-}
-
-// canonicalAddr returns url.Host but always with a ":port" suffix
-func canonicalAddr(url *url.URL) string {
-	addr := url.Host
-	if !hasPort(addr) {
-		return addr + ":" + portMap[url.Scheme]
-	}
-	return addr
-}
-
-// bodyEOFSignal wraps a ReadCloser but runs fn (if non-nil) at most
-// once, right before its final (error-producing) Read or Close call
-// returns. fn should return the new error to return from Read or Close.
-//
-// If earlyCloseFn is non-nil and Close is called before io.EOF is
-// seen, earlyCloseFn is called instead of fn, and its return value is
-// the return value from Close.
-type bodyEOFSignal struct {
-	body         io.ReadCloser
-	mu           sync.Mutex        // guards following 4 fields
-	closed       bool              // whether Close has been called
-	rerr         error             // sticky Read error
-	fn           func(error) error // err will be nil on Read io.EOF
-	earlyCloseFn func() error      // optional alt Close func used if io.EOF not seen
-}
-
-func (es *bodyEOFSignal) Read(p []byte) (n int, err error) {
-	es.mu.Lock()
-	closed, rerr := es.closed, es.rerr
-	es.mu.Unlock()
-	if closed {
-		return 0, errors.New("http: read on closed response body")
-	}
-	if rerr != nil {
-		return 0, rerr
-	}
-
-	n, err = es.body.Read(p)
-	if err != nil {
-		es.mu.Lock()
-		defer es.mu.Unlock()
-		if es.rerr == nil {
-			es.rerr = err
-		}
-		err = es.condfn(err)
-	}
-	return
-}
-
-func (es *bodyEOFSignal) Close() error {
-	es.mu.Lock()
-	defer es.mu.Unlock()
-	if es.closed {
-		return nil
-	}
-	es.closed = true
-	if es.earlyCloseFn != nil && es.rerr != io.EOF {
-		return es.earlyCloseFn()
-	}
-	err := es.body.Close()
-	return es.condfn(err)
-}
-
-// caller must hold es.mu.
-func (es *bodyEOFSignal) condfn(err error) error {
-	if es.fn == nil {
-		return err
-	}
-	err = es.fn(err)
-	es.fn = nil
-	return err
-}
-
-// gzipReader wraps a response body so it can lazily
-// call gzip.NewReader on the first call to Read
-type gzipReader struct {
-	body io.ReadCloser // underlying Response.Body
-	zr   io.Reader     // lazily-initialized gzip reader
-}
-
-func (gz *gzipReader) Read(p []byte) (n int, err error) {
-	if gz.zr == nil {
-		gz.zr, err = gzip.NewReader(gz.body)
-		if err != nil {
-			return 0, err
-		}
-	}
-	return gz.zr.Read(p)
-}
-
-func (gz *gzipReader) Close() error {
-	return gz.body.Close()
-}
-
-type readerAndCloser struct {
-	io.Reader
-	io.Closer
-}
-
-type tlsHandshakeTimeoutError struct{}
-
-func (tlsHandshakeTimeoutError) Timeout() bool   { return true }
-func (tlsHandshakeTimeoutError) Temporary() bool { return true }
-func (tlsHandshakeTimeoutError) Error() string   { return "net/http: TLS handshake timeout" }
-
-type noteEOFReader struct {
-	r      io.Reader
-	sawEOF *bool
-}
-
-func (nr noteEOFReader) Read(p []byte) (n int, err error) {
-	n, err = nr.r.Read(p)
-	if err == io.EOF {
-		*nr.sawEOF = true
-	}
-	return
-}
-
-// fakeLocker is a sync.Locker which does nothing. It's used to guard
-// test-only fields when not under test, to avoid runtime atomic
-// overhead.
-type fakeLocker struct{}
-
-func (fakeLocker) Lock()   {}
-func (fakeLocker) Unlock() {}
-
-func isNetWriteError(err error) bool {
-	switch e := err.(type) {
-	case *url.Error:
-		return isNetWriteError(e.Err)
-	case *net.OpError:
-		return e.Op == "write"
-	default:
-		return false
-	}
-}
-
-// cloneTLSConfig returns a shallow clone of the exported
-// fields of cfg, ignoring the unexported sync.Once, which
-// contains a mutex and must not be copied.
-//
-// The cfg must not be in active use by tls.Server, or else
-// there can still be a race with tls.Server updating SessionTicketKey
-// and our copying it, and also a race with the server setting
-// SessionTicketsDisabled=false on failure to set the random
-// ticket key.
-//
-// If cfg is nil, a new zero tls.Config is returned.
-func cloneTLSConfig(cfg *tls.Config) *tls.Config {
-	if cfg == nil {
-		return &tls.Config{}
-	}
-	return &tls.Config{
-		Rand:                     cfg.Rand,
-		Time:                     cfg.Time,
-		Certificates:             cfg.Certificates,
-		NameToCertificate:        cfg.NameToCertificate,
-		GetCertificate:           cfg.GetCertificate,
-		RootCAs:                  cfg.RootCAs,
-		NextProtos:               cfg.NextProtos,
-		ServerName:               cfg.ServerName,
-		ClientAuth:               cfg.ClientAuth,
-		ClientCAs:                cfg.ClientCAs,
-		InsecureSkipVerify:       cfg.InsecureSkipVerify,
-		CipherSuites:             cfg.CipherSuites,
-		PreferServerCipherSuites: cfg.PreferServerCipherSuites,
-		SessionTicketsDisabled:   cfg.SessionTicketsDisabled,
-		SessionTicketKey:         cfg.SessionTicketKey,
-		ClientSessionCache:       cfg.ClientSessionCache,
-		MinVersion:               cfg.MinVersion,
-		MaxVersion:               cfg.MaxVersion,
-		CurvePreferences:         cfg.CurvePreferences,
-	}
-}
-
-// cloneTLSClientConfig is like cloneTLSConfig but omits
-// the fields SessionTicketsDisabled and SessionTicketKey.
-// This makes it safe to call cloneTLSClientConfig on a config
-// in active use by a server.
-func cloneTLSClientConfig(cfg *tls.Config) *tls.Config {
-	if cfg == nil {
-		return &tls.Config{}
-	}
-	return &tls.Config{
-		Rand:                     cfg.Rand,
-		Time:                     cfg.Time,
-		Certificates:             cfg.Certificates,
-		NameToCertificate:        cfg.NameToCertificate,
-		GetCertificate:           cfg.GetCertificate,
-		RootCAs:                  cfg.RootCAs,
-		NextProtos:               cfg.NextProtos,
-		ServerName:               cfg.ServerName,
-		ClientAuth:               cfg.ClientAuth,
-		ClientCAs:                cfg.ClientCAs,
-		InsecureSkipVerify:       cfg.InsecureSkipVerify,
-		CipherSuites:             cfg.CipherSuites,
-		PreferServerCipherSuites: cfg.PreferServerCipherSuites,
-		ClientSessionCache:       cfg.ClientSessionCache,
-		MinVersion:               cfg.MinVersion,
-		MaxVersion:               cfg.MaxVersion,
-		CurvePreferences:         cfg.CurvePreferences,
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/transport_test.go b/third_party/gofrontend/libgo/go/net/http/transport_test.go
deleted file mode 100644
index c21d4af..0000000
--- a/third_party/gofrontend/libgo/go/net/http/transport_test.go
+++ /dev/null
@@ -1,2810 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Tests for transport.go
-
-package http_test
-
-import (
-	"bufio"
-	"bytes"
-	"compress/gzip"
-	"crypto/rand"
-	"crypto/tls"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	"net"
-	. "net/http"
-	"net/http/httptest"
-	"net/url"
-	"os"
-	"reflect"
-	"runtime"
-	"strconv"
-	"strings"
-	"sync"
-	"testing"
-	"time"
-)
-
-// TODO: test 5 pipelined requests with responses: 1) OK, 2) OK, Connection: Close
-//       and then verify that the final 2 responses get errors back.
-
-// hostPortHandler writes back the client's "host:port".
-var hostPortHandler = HandlerFunc(func(w ResponseWriter, r *Request) {
-	if r.FormValue("close") == "true" {
-		w.Header().Set("Connection", "close")
-	}
-	w.Header().Set("X-Saw-Close", fmt.Sprint(r.Close))
-	w.Write([]byte(r.RemoteAddr))
-})
-
-// testCloseConn is a net.Conn tracked by a testConnSet.
-type testCloseConn struct {
-	net.Conn
-	set *testConnSet
-}
-
-func (c *testCloseConn) Close() error {
-	c.set.remove(c)
-	return c.Conn.Close()
-}
-
-// testConnSet tracks a set of TCP connections and whether they've
-// been closed.
-type testConnSet struct {
-	t      *testing.T
-	mu     sync.Mutex // guards closed and list
-	closed map[net.Conn]bool
-	list   []net.Conn // in order created
-}
-
-func (tcs *testConnSet) insert(c net.Conn) {
-	tcs.mu.Lock()
-	defer tcs.mu.Unlock()
-	tcs.closed[c] = false
-	tcs.list = append(tcs.list, c)
-}
-
-func (tcs *testConnSet) remove(c net.Conn) {
-	tcs.mu.Lock()
-	defer tcs.mu.Unlock()
-	tcs.closed[c] = true
-}
-
-// some tests use this to manage raw tcp connections for later inspection
-func makeTestDial(t *testing.T) (*testConnSet, func(n, addr string) (net.Conn, error)) {
-	connSet := &testConnSet{
-		t:      t,
-		closed: make(map[net.Conn]bool),
-	}
-	dial := func(n, addr string) (net.Conn, error) {
-		c, err := net.Dial(n, addr)
-		if err != nil {
-			return nil, err
-		}
-		tc := &testCloseConn{c, connSet}
-		connSet.insert(tc)
-		return tc, nil
-	}
-	return connSet, dial
-}
-
-func (tcs *testConnSet) check(t *testing.T) {
-	tcs.mu.Lock()
-	defer tcs.mu.Unlock()
-	for i := 4; i >= 0; i-- {
-		for i, c := range tcs.list {
-			if tcs.closed[c] {
-				continue
-			}
-			if i != 0 {
-				tcs.mu.Unlock()
-				time.Sleep(50 * time.Millisecond)
-				tcs.mu.Lock()
-				continue
-			}
-			t.Errorf("TCP connection #%d, %p (of %d total) was not closed", i+1, c, len(tcs.list))
-		}
-	}
-}
-
-// Two subsequent requests and verify their response is the same.
-// The response from the server is our own IP:port
-func TestTransportKeepAlives(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(hostPortHandler)
-	defer ts.Close()
-
-	for _, disableKeepAlive := range []bool{false, true} {
-		tr := &Transport{DisableKeepAlives: disableKeepAlive}
-		defer tr.CloseIdleConnections()
-		c := &Client{Transport: tr}
-
-		fetch := func(n int) string {
-			res, err := c.Get(ts.URL)
-			if err != nil {
-				t.Fatalf("error in disableKeepAlive=%v, req #%d, GET: %v", disableKeepAlive, n, err)
-			}
-			body, err := ioutil.ReadAll(res.Body)
-			if err != nil {
-				t.Fatalf("error in disableKeepAlive=%v, req #%d, ReadAll: %v", disableKeepAlive, n, err)
-			}
-			return string(body)
-		}
-
-		body1 := fetch(1)
-		body2 := fetch(2)
-
-		bodiesDiffer := body1 != body2
-		if bodiesDiffer != disableKeepAlive {
-			t.Errorf("error in disableKeepAlive=%v. unexpected bodiesDiffer=%v; body1=%q; body2=%q",
-				disableKeepAlive, bodiesDiffer, body1, body2)
-		}
-	}
-}
-
-func TestTransportConnectionCloseOnResponse(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(hostPortHandler)
-	defer ts.Close()
-
-	connSet, testDial := makeTestDial(t)
-
-	for _, connectionClose := range []bool{false, true} {
-		tr := &Transport{
-			Dial: testDial,
-		}
-		c := &Client{Transport: tr}
-
-		fetch := func(n int) string {
-			req := new(Request)
-			var err error
-			req.URL, err = url.Parse(ts.URL + fmt.Sprintf("/?close=%v", connectionClose))
-			if err != nil {
-				t.Fatalf("URL parse error: %v", err)
-			}
-			req.Method = "GET"
-			req.Proto = "HTTP/1.1"
-			req.ProtoMajor = 1
-			req.ProtoMinor = 1
-
-			res, err := c.Do(req)
-			if err != nil {
-				t.Fatalf("error in connectionClose=%v, req #%d, Do: %v", connectionClose, n, err)
-			}
-			defer res.Body.Close()
-			body, err := ioutil.ReadAll(res.Body)
-			if err != nil {
-				t.Fatalf("error in connectionClose=%v, req #%d, ReadAll: %v", connectionClose, n, err)
-			}
-			return string(body)
-		}
-
-		body1 := fetch(1)
-		body2 := fetch(2)
-		bodiesDiffer := body1 != body2
-		if bodiesDiffer != connectionClose {
-			t.Errorf("error in connectionClose=%v. unexpected bodiesDiffer=%v; body1=%q; body2=%q",
-				connectionClose, bodiesDiffer, body1, body2)
-		}
-
-		tr.CloseIdleConnections()
-	}
-
-	connSet.check(t)
-}
-
-func TestTransportConnectionCloseOnRequest(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(hostPortHandler)
-	defer ts.Close()
-
-	connSet, testDial := makeTestDial(t)
-
-	for _, connectionClose := range []bool{false, true} {
-		tr := &Transport{
-			Dial: testDial,
-		}
-		c := &Client{Transport: tr}
-
-		fetch := func(n int) string {
-			req := new(Request)
-			var err error
-			req.URL, err = url.Parse(ts.URL)
-			if err != nil {
-				t.Fatalf("URL parse error: %v", err)
-			}
-			req.Method = "GET"
-			req.Proto = "HTTP/1.1"
-			req.ProtoMajor = 1
-			req.ProtoMinor = 1
-			req.Close = connectionClose
-
-			res, err := c.Do(req)
-			if err != nil {
-				t.Fatalf("error in connectionClose=%v, req #%d, Do: %v", connectionClose, n, err)
-			}
-			if got, want := res.Header.Get("X-Saw-Close"), fmt.Sprint(connectionClose); got != want {
-				t.Errorf("For connectionClose = %v; handler's X-Saw-Close was %v; want %v",
-					connectionClose, got, !connectionClose)
-			}
-			body, err := ioutil.ReadAll(res.Body)
-			if err != nil {
-				t.Fatalf("error in connectionClose=%v, req #%d, ReadAll: %v", connectionClose, n, err)
-			}
-			return string(body)
-		}
-
-		body1 := fetch(1)
-		body2 := fetch(2)
-		bodiesDiffer := body1 != body2
-		if bodiesDiffer != connectionClose {
-			t.Errorf("error in connectionClose=%v. unexpected bodiesDiffer=%v; body1=%q; body2=%q",
-				connectionClose, bodiesDiffer, body1, body2)
-		}
-
-		tr.CloseIdleConnections()
-	}
-
-	connSet.check(t)
-}
-
-// if the Transport's DisableKeepAlives is set, all requests should
-// send Connection: close.
-func TestTransportConnectionCloseOnRequestDisableKeepAlive(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(hostPortHandler)
-	defer ts.Close()
-
-	tr := &Transport{
-		DisableKeepAlives: true,
-	}
-	c := &Client{Transport: tr}
-	res, err := c.Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	res.Body.Close()
-	if res.Header.Get("X-Saw-Close") != "true" {
-		t.Errorf("handler didn't see Connection: close ")
-	}
-}
-
-func TestTransportIdleCacheKeys(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(hostPortHandler)
-	defer ts.Close()
-
-	tr := &Transport{DisableKeepAlives: false}
-	c := &Client{Transport: tr}
-
-	if e, g := 0, len(tr.IdleConnKeysForTesting()); e != g {
-		t.Errorf("After CloseIdleConnections expected %d idle conn cache keys; got %d", e, g)
-	}
-
-	resp, err := c.Get(ts.URL)
-	if err != nil {
-		t.Error(err)
-	}
-	ioutil.ReadAll(resp.Body)
-
-	keys := tr.IdleConnKeysForTesting()
-	if e, g := 1, len(keys); e != g {
-		t.Fatalf("After Get expected %d idle conn cache keys; got %d", e, g)
-	}
-
-	if e := "|http|" + ts.Listener.Addr().String(); keys[0] != e {
-		t.Errorf("Expected idle cache key %q; got %q", e, keys[0])
-	}
-
-	tr.CloseIdleConnections()
-	if e, g := 0, len(tr.IdleConnKeysForTesting()); e != g {
-		t.Errorf("After CloseIdleConnections expected %d idle conn cache keys; got %d", e, g)
-	}
-}
-
-// Tests that the HTTP transport re-uses connections when a client
-// reads to the end of a response Body without closing it.
-func TestTransportReadToEndReusesConn(t *testing.T) {
-	defer afterTest(t)
-	const msg = "foobar"
-
-	var addrSeen map[string]int
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		addrSeen[r.RemoteAddr]++
-		if r.URL.Path == "/chunked/" {
-			w.WriteHeader(200)
-			w.(Flusher).Flush()
-		} else {
-			w.Header().Set("Content-Type", strconv.Itoa(len(msg)))
-			w.WriteHeader(200)
-		}
-		w.Write([]byte(msg))
-	}))
-	defer ts.Close()
-
-	buf := make([]byte, len(msg))
-
-	for pi, path := range []string{"/content-length/", "/chunked/"} {
-		wantLen := []int{len(msg), -1}[pi]
-		addrSeen = make(map[string]int)
-		for i := 0; i < 3; i++ {
-			res, err := Get(ts.URL + path)
-			if err != nil {
-				t.Errorf("Get %s: %v", path, err)
-				continue
-			}
-			// We want to close this body eventually (before the
-			// defer afterTest at top runs), but not before the
-			// len(addrSeen) check at the bottom of this test,
-			// since Closing this early in the loop would risk
-			// making connections be re-used for the wrong reason.
-			defer res.Body.Close()
-
-			if res.ContentLength != int64(wantLen) {
-				t.Errorf("%s res.ContentLength = %d; want %d", path, res.ContentLength, wantLen)
-			}
-			n, err := res.Body.Read(buf)
-			if n != len(msg) || err != io.EOF {
-				t.Errorf("%s Read = %v, %v; want %d, EOF", path, n, err, len(msg))
-			}
-		}
-		if len(addrSeen) != 1 {
-			t.Errorf("for %s, server saw %d distinct client addresses; want 1", path, len(addrSeen))
-		}
-	}
-}
-
-func TestTransportMaxPerHostIdleConns(t *testing.T) {
-	defer afterTest(t)
-	resch := make(chan string)
-	gotReq := make(chan bool)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		gotReq <- true
-		msg := <-resch
-		_, err := w.Write([]byte(msg))
-		if err != nil {
-			t.Fatalf("Write: %v", err)
-		}
-	}))
-	defer ts.Close()
-	maxIdleConns := 2
-	tr := &Transport{DisableKeepAlives: false, MaxIdleConnsPerHost: maxIdleConns}
-	c := &Client{Transport: tr}
-
-	// Start 3 outstanding requests and wait for the server to get them.
-	// Their responses will hang until we write to resch, though.
-	donech := make(chan bool)
-	doReq := func() {
-		resp, err := c.Get(ts.URL)
-		if err != nil {
-			t.Error(err)
-			return
-		}
-		if _, err := ioutil.ReadAll(resp.Body); err != nil {
-			t.Errorf("ReadAll: %v", err)
-			return
-		}
-		donech <- true
-	}
-	go doReq()
-	<-gotReq
-	go doReq()
-	<-gotReq
-	go doReq()
-	<-gotReq
-
-	if e, g := 0, len(tr.IdleConnKeysForTesting()); e != g {
-		t.Fatalf("Before writes, expected %d idle conn cache keys; got %d", e, g)
-	}
-
-	resch <- "res1"
-	<-donech
-	keys := tr.IdleConnKeysForTesting()
-	if e, g := 1, len(keys); e != g {
-		t.Fatalf("after first response, expected %d idle conn cache keys; got %d", e, g)
-	}
-	cacheKey := "|http|" + ts.Listener.Addr().String()
-	if keys[0] != cacheKey {
-		t.Fatalf("Expected idle cache key %q; got %q", cacheKey, keys[0])
-	}
-	if e, g := 1, tr.IdleConnCountForTesting(cacheKey); e != g {
-		t.Errorf("after first response, expected %d idle conns; got %d", e, g)
-	}
-
-	resch <- "res2"
-	<-donech
-	if e, g := 2, tr.IdleConnCountForTesting(cacheKey); e != g {
-		t.Errorf("after second response, expected %d idle conns; got %d", e, g)
-	}
-
-	resch <- "res3"
-	<-donech
-	if e, g := maxIdleConns, tr.IdleConnCountForTesting(cacheKey); e != g {
-		t.Errorf("after third response, still expected %d idle conns; got %d", e, g)
-	}
-}
-
-func TestTransportServerClosingUnexpectedly(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(hostPortHandler)
-	defer ts.Close()
-
-	tr := &Transport{}
-	c := &Client{Transport: tr}
-
-	fetch := func(n, retries int) string {
-		condFatalf := func(format string, arg ...interface{}) {
-			if retries <= 0 {
-				t.Fatalf(format, arg...)
-			}
-			t.Logf("retrying shortly after expected error: "+format, arg...)
-			time.Sleep(time.Second / time.Duration(retries))
-		}
-		for retries >= 0 {
-			retries--
-			res, err := c.Get(ts.URL)
-			if err != nil {
-				condFatalf("error in req #%d, GET: %v", n, err)
-				continue
-			}
-			body, err := ioutil.ReadAll(res.Body)
-			if err != nil {
-				condFatalf("error in req #%d, ReadAll: %v", n, err)
-				continue
-			}
-			res.Body.Close()
-			return string(body)
-		}
-		panic("unreachable")
-	}
-
-	body1 := fetch(1, 0)
-	body2 := fetch(2, 0)
-
-	ts.CloseClientConnections() // surprise!
-
-	// This test has an expected race. Sleeping for 25 ms prevents
-	// it on most fast machines, causing the next fetch() call to
-	// succeed quickly.  But if we do get errors, fetch() will retry 5
-	// times with some delays between.
-	time.Sleep(25 * time.Millisecond)
-
-	body3 := fetch(3, 5)
-
-	if body1 != body2 {
-		t.Errorf("expected body1 and body2 to be equal")
-	}
-	if body2 == body3 {
-		t.Errorf("expected body2 and body3 to be different")
-	}
-}
-
-// Test for https://golang.org/issue/2616 (appropriate issue number)
-// This fails pretty reliably with GOMAXPROCS=100 or something high.
-func TestStressSurpriseServerCloses(t *testing.T) {
-	defer afterTest(t)
-	if testing.Short() {
-		t.Skip("skipping test in short mode")
-	}
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Content-Length", "5")
-		w.Header().Set("Content-Type", "text/plain")
-		w.Write([]byte("Hello"))
-		w.(Flusher).Flush()
-		conn, buf, _ := w.(Hijacker).Hijack()
-		buf.Flush()
-		conn.Close()
-	}))
-	defer ts.Close()
-
-	tr := &Transport{DisableKeepAlives: false}
-	c := &Client{Transport: tr}
-	defer tr.CloseIdleConnections()
-
-	// Do a bunch of traffic from different goroutines. Send to activityc
-	// after each request completes, regardless of whether it failed.
-	// If these are too high, OS X exhausts its ephemeral ports
-	// and hangs waiting for them to transition TCP states. That's
-	// not what we want to test.  TODO(bradfitz): use an io.Pipe
-	// dialer for this test instead?
-	const (
-		numClients    = 20
-		reqsPerClient = 25
-	)
-	activityc := make(chan bool)
-	for i := 0; i < numClients; i++ {
-		go func() {
-			for i := 0; i < reqsPerClient; i++ {
-				res, err := c.Get(ts.URL)
-				if err == nil {
-					// We expect errors since the server is
-					// hanging up on us after telling us to
-					// send more requests, so we don't
-					// actually care what the error is.
-					// But we want to close the body in cases
-					// where we won the race.
-					res.Body.Close()
-				}
-				activityc <- true
-			}
-		}()
-	}
-
-	// Make sure all the request come back, one way or another.
-	for i := 0; i < numClients*reqsPerClient; i++ {
-		select {
-		case <-activityc:
-		case <-time.After(5 * time.Second):
-			t.Fatalf("presumed deadlock; no HTTP client activity seen in awhile")
-		}
-	}
-}
-
-// TestTransportHeadResponses verifies that we deal with Content-Lengths
-// with no bodies properly
-func TestTransportHeadResponses(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		if r.Method != "HEAD" {
-			panic("expected HEAD; got " + r.Method)
-		}
-		w.Header().Set("Content-Length", "123")
-		w.WriteHeader(200)
-	}))
-	defer ts.Close()
-
-	tr := &Transport{DisableKeepAlives: false}
-	c := &Client{Transport: tr}
-	for i := 0; i < 2; i++ {
-		res, err := c.Head(ts.URL)
-		if err != nil {
-			t.Errorf("error on loop %d: %v", i, err)
-			continue
-		}
-		if e, g := "123", res.Header.Get("Content-Length"); e != g {
-			t.Errorf("loop %d: expected Content-Length header of %q, got %q", i, e, g)
-		}
-		if e, g := int64(123), res.ContentLength; e != g {
-			t.Errorf("loop %d: expected res.ContentLength of %v, got %v", i, e, g)
-		}
-		if all, err := ioutil.ReadAll(res.Body); err != nil {
-			t.Errorf("loop %d: Body ReadAll: %v", i, err)
-		} else if len(all) != 0 {
-			t.Errorf("Bogus body %q", all)
-		}
-	}
-}
-
-// TestTransportHeadChunkedResponse verifies that we ignore chunked transfer-encoding
-// on responses to HEAD requests.
-func TestTransportHeadChunkedResponse(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		if r.Method != "HEAD" {
-			panic("expected HEAD; got " + r.Method)
-		}
-		w.Header().Set("Transfer-Encoding", "chunked") // client should ignore
-		w.Header().Set("x-client-ipport", r.RemoteAddr)
-		w.WriteHeader(200)
-	}))
-	defer ts.Close()
-
-	tr := &Transport{DisableKeepAlives: false}
-	c := &Client{Transport: tr}
-
-	// Ensure that we wait for the readLoop to complete before
-	// calling Head again
-	didRead := make(chan bool)
-	SetReadLoopBeforeNextReadHook(func() { didRead <- true })
-	defer SetReadLoopBeforeNextReadHook(nil)
-
-	res1, err := c.Head(ts.URL)
-	<-didRead
-
-	if err != nil {
-		t.Fatalf("request 1 error: %v", err)
-	}
-
-	res2, err := c.Head(ts.URL)
-	<-didRead
-
-	if err != nil {
-		t.Fatalf("request 2 error: %v", err)
-	}
-	if v1, v2 := res1.Header.Get("x-client-ipport"), res2.Header.Get("x-client-ipport"); v1 != v2 {
-		t.Errorf("ip/ports differed between head requests: %q vs %q", v1, v2)
-	}
-}
-
-var roundTripTests = []struct {
-	accept       string
-	expectAccept string
-	compressed   bool
-}{
-	// Requests with no accept-encoding header use transparent compression
-	{"", "gzip", false},
-	// Requests with other accept-encoding should pass through unmodified
-	{"foo", "foo", false},
-	// Requests with accept-encoding == gzip should be passed through
-	{"gzip", "gzip", true},
-}
-
-// Test that the modification made to the Request by the RoundTripper is cleaned up
-func TestRoundTripGzip(t *testing.T) {
-	defer afterTest(t)
-	const responseBody = "test response body"
-	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
-		accept := req.Header.Get("Accept-Encoding")
-		if expect := req.FormValue("expect_accept"); accept != expect {
-			t.Errorf("in handler, test %v: Accept-Encoding = %q, want %q",
-				req.FormValue("testnum"), accept, expect)
-		}
-		if accept == "gzip" {
-			rw.Header().Set("Content-Encoding", "gzip")
-			gz := gzip.NewWriter(rw)
-			gz.Write([]byte(responseBody))
-			gz.Close()
-		} else {
-			rw.Header().Set("Content-Encoding", accept)
-			rw.Write([]byte(responseBody))
-		}
-	}))
-	defer ts.Close()
-
-	for i, test := range roundTripTests {
-		// Test basic request (no accept-encoding)
-		req, _ := NewRequest("GET", fmt.Sprintf("%s/?testnum=%d&expect_accept=%s", ts.URL, i, test.expectAccept), nil)
-		if test.accept != "" {
-			req.Header.Set("Accept-Encoding", test.accept)
-		}
-		res, err := DefaultTransport.RoundTrip(req)
-		var body []byte
-		if test.compressed {
-			var r *gzip.Reader
-			r, err = gzip.NewReader(res.Body)
-			if err != nil {
-				t.Errorf("%d. gzip NewReader: %v", i, err)
-				continue
-			}
-			body, err = ioutil.ReadAll(r)
-			res.Body.Close()
-		} else {
-			body, err = ioutil.ReadAll(res.Body)
-		}
-		if err != nil {
-			t.Errorf("%d. Error: %q", i, err)
-			continue
-		}
-		if g, e := string(body), responseBody; g != e {
-			t.Errorf("%d. body = %q; want %q", i, g, e)
-		}
-		if g, e := req.Header.Get("Accept-Encoding"), test.accept; g != e {
-			t.Errorf("%d. Accept-Encoding = %q; want %q (it was mutated, in violation of RoundTrip contract)", i, g, e)
-		}
-		if g, e := res.Header.Get("Content-Encoding"), test.accept; g != e {
-			t.Errorf("%d. Content-Encoding = %q; want %q", i, g, e)
-		}
-	}
-
-}
-
-func TestTransportGzip(t *testing.T) {
-	defer afterTest(t)
-	const testString = "The test string aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
-	const nRandBytes = 1024 * 1024
-	ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) {
-		if req.Method == "HEAD" {
-			if g := req.Header.Get("Accept-Encoding"); g != "" {
-				t.Errorf("HEAD request sent with Accept-Encoding of %q; want none", g)
-			}
-			return
-		}
-		if g, e := req.Header.Get("Accept-Encoding"), "gzip"; g != e {
-			t.Errorf("Accept-Encoding = %q, want %q", g, e)
-		}
-		rw.Header().Set("Content-Encoding", "gzip")
-
-		var w io.Writer = rw
-		var buf bytes.Buffer
-		if req.FormValue("chunked") == "0" {
-			w = &buf
-			defer io.Copy(rw, &buf)
-			defer func() {
-				rw.Header().Set("Content-Length", strconv.Itoa(buf.Len()))
-			}()
-		}
-		gz := gzip.NewWriter(w)
-		gz.Write([]byte(testString))
-		if req.FormValue("body") == "large" {
-			io.CopyN(gz, rand.Reader, nRandBytes)
-		}
-		gz.Close()
-	}))
-	defer ts.Close()
-
-	for _, chunked := range []string{"1", "0"} {
-		c := &Client{Transport: &Transport{}}
-
-		// First fetch something large, but only read some of it.
-		res, err := c.Get(ts.URL + "/?body=large&chunked=" + chunked)
-		if err != nil {
-			t.Fatalf("large get: %v", err)
-		}
-		buf := make([]byte, len(testString))
-		n, err := io.ReadFull(res.Body, buf)
-		if err != nil {
-			t.Fatalf("partial read of large response: size=%d, %v", n, err)
-		}
-		if e, g := testString, string(buf); e != g {
-			t.Errorf("partial read got %q, expected %q", g, e)
-		}
-		res.Body.Close()
-		// Read on the body, even though it's closed
-		n, err = res.Body.Read(buf)
-		if n != 0 || err == nil {
-			t.Errorf("expected error post-closed large Read; got = %d, %v", n, err)
-		}
-
-		// Then something small.
-		res, err = c.Get(ts.URL + "/?chunked=" + chunked)
-		if err != nil {
-			t.Fatal(err)
-		}
-		body, err := ioutil.ReadAll(res.Body)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if g, e := string(body), testString; g != e {
-			t.Fatalf("body = %q; want %q", g, e)
-		}
-		if g, e := res.Header.Get("Content-Encoding"), ""; g != e {
-			t.Fatalf("Content-Encoding = %q; want %q", g, e)
-		}
-
-		// Read on the body after it's been fully read:
-		n, err = res.Body.Read(buf)
-		if n != 0 || err == nil {
-			t.Errorf("expected Read error after exhausted reads; got %d, %v", n, err)
-		}
-		res.Body.Close()
-		n, err = res.Body.Read(buf)
-		if n != 0 || err == nil {
-			t.Errorf("expected Read error after Close; got %d, %v", n, err)
-		}
-	}
-
-	// And a HEAD request too, because they're always weird.
-	c := &Client{Transport: &Transport{}}
-	res, err := c.Head(ts.URL)
-	if err != nil {
-		t.Fatalf("Head: %v", err)
-	}
-	if res.StatusCode != 200 {
-		t.Errorf("Head status=%d; want=200", res.StatusCode)
-	}
-}
-
-func TestTransportProxy(t *testing.T) {
-	defer afterTest(t)
-	ch := make(chan string, 1)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		ch <- "real server"
-	}))
-	defer ts.Close()
-	proxy := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		ch <- "proxy for " + r.URL.String()
-	}))
-	defer proxy.Close()
-
-	pu, err := url.Parse(proxy.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	c := &Client{Transport: &Transport{Proxy: ProxyURL(pu)}}
-	c.Head(ts.URL)
-	got := <-ch
-	want := "proxy for " + ts.URL + "/"
-	if got != want {
-		t.Errorf("want %q, got %q", want, got)
-	}
-}
-
-// TestTransportGzipRecursive sends a gzip quine and checks that the
-// client gets the same value back. This is more cute than anything,
-// but checks that we don't recurse forever, and checks that
-// Content-Encoding is removed.
-func TestTransportGzipRecursive(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Content-Encoding", "gzip")
-		w.Write(rgz)
-	}))
-	defer ts.Close()
-
-	c := &Client{Transport: &Transport{}}
-	res, err := c.Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	body, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !bytes.Equal(body, rgz) {
-		t.Fatalf("Incorrect result from recursive gz:\nhave=%x\nwant=%x",
-			body, rgz)
-	}
-	if g, e := res.Header.Get("Content-Encoding"), ""; g != e {
-		t.Fatalf("Content-Encoding = %q; want %q", g, e)
-	}
-}
-
-// golang.org/issue/7750: request fails when server replies with
-// a short gzip body
-func TestTransportGzipShort(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Content-Encoding", "gzip")
-		w.Write([]byte{0x1f, 0x8b})
-	}))
-	defer ts.Close()
-
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
-	res, err := c.Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer res.Body.Close()
-	_, err = ioutil.ReadAll(res.Body)
-	if err == nil {
-		t.Fatal("Expect an error from reading a body.")
-	}
-	if err != io.ErrUnexpectedEOF {
-		t.Errorf("ReadAll error = %v; want io.ErrUnexpectedEOF", err)
-	}
-}
-
-// tests that persistent goroutine connections shut down when no longer desired.
-func TestTransportPersistConnLeak(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping test; see https://golang.org/issue/7237")
-	}
-	defer afterTest(t)
-	gotReqCh := make(chan bool)
-	unblockCh := make(chan bool)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		gotReqCh <- true
-		<-unblockCh
-		w.Header().Set("Content-Length", "0")
-		w.WriteHeader(204)
-	}))
-	defer ts.Close()
-
-	tr := &Transport{}
-	c := &Client{Transport: tr}
-
-	n0 := runtime.NumGoroutine()
-
-	const numReq = 25
-	didReqCh := make(chan bool)
-	for i := 0; i < numReq; i++ {
-		go func() {
-			res, err := c.Get(ts.URL)
-			didReqCh <- true
-			if err != nil {
-				t.Errorf("client fetch error: %v", err)
-				return
-			}
-			res.Body.Close()
-		}()
-	}
-
-	// Wait for all goroutines to be stuck in the Handler.
-	for i := 0; i < numReq; i++ {
-		<-gotReqCh
-	}
-
-	nhigh := runtime.NumGoroutine()
-
-	// Tell all handlers to unblock and reply.
-	for i := 0; i < numReq; i++ {
-		unblockCh <- true
-	}
-
-	// Wait for all HTTP clients to be done.
-	for i := 0; i < numReq; i++ {
-		<-didReqCh
-	}
-
-	tr.CloseIdleConnections()
-	time.Sleep(100 * time.Millisecond)
-	runtime.GC()
-	runtime.GC() // even more.
-	nfinal := runtime.NumGoroutine()
-
-	growth := nfinal - n0
-
-	// We expect 0 or 1 extra goroutine, empirically.  Allow up to 5.
-	// Previously we were leaking one per numReq.
-	if int(growth) > 5 {
-		t.Logf("goroutine growth: %d -> %d -> %d (delta: %d)", n0, nhigh, nfinal, growth)
-		t.Error("too many new goroutines")
-	}
-}
-
-// golang.org/issue/4531: Transport leaks goroutines when
-// request.ContentLength is explicitly short
-func TestTransportPersistConnLeakShortBody(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping test; see https://golang.org/issue/7237")
-	}
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-	}))
-	defer ts.Close()
-
-	tr := &Transport{}
-	c := &Client{Transport: tr}
-
-	n0 := runtime.NumGoroutine()
-	body := []byte("Hello")
-	for i := 0; i < 20; i++ {
-		req, err := NewRequest("POST", ts.URL, bytes.NewReader(body))
-		if err != nil {
-			t.Fatal(err)
-		}
-		req.ContentLength = int64(len(body) - 2) // explicitly short
-		_, err = c.Do(req)
-		if err == nil {
-			t.Fatal("Expect an error from writing too long of a body.")
-		}
-	}
-	nhigh := runtime.NumGoroutine()
-	tr.CloseIdleConnections()
-	time.Sleep(400 * time.Millisecond)
-	runtime.GC()
-	nfinal := runtime.NumGoroutine()
-
-	growth := nfinal - n0
-
-	// We expect 0 or 1 extra goroutine, empirically.  Allow up to 5.
-	// Previously we were leaking one per numReq.
-	t.Logf("goroutine growth: %d -> %d -> %d (delta: %d)", n0, nhigh, nfinal, growth)
-	if int(growth) > 5 {
-		t.Error("too many new goroutines")
-	}
-}
-
-// This used to crash; https://golang.org/issue/3266
-func TestTransportIdleConnCrash(t *testing.T) {
-	defer afterTest(t)
-	tr := &Transport{}
-	c := &Client{Transport: tr}
-
-	unblockCh := make(chan bool, 1)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		<-unblockCh
-		tr.CloseIdleConnections()
-	}))
-	defer ts.Close()
-
-	didreq := make(chan bool)
-	go func() {
-		res, err := c.Get(ts.URL)
-		if err != nil {
-			t.Error(err)
-		} else {
-			res.Body.Close() // returns idle conn
-		}
-		didreq <- true
-	}()
-	unblockCh <- true
-	<-didreq
-}
-
-// Test that the transport doesn't close the TCP connection early,
-// before the response body has been read.  This was a regression
-// which sadly lacked a triggering test.  The large response body made
-// the old race easier to trigger.
-func TestIssue3644(t *testing.T) {
-	defer afterTest(t)
-	const numFoos = 5000
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.Header().Set("Connection", "close")
-		for i := 0; i < numFoos; i++ {
-			w.Write([]byte("foo "))
-		}
-	}))
-	defer ts.Close()
-	tr := &Transport{}
-	c := &Client{Transport: tr}
-	res, err := c.Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer res.Body.Close()
-	bs, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if len(bs) != numFoos*len("foo ") {
-		t.Errorf("unexpected response length")
-	}
-}
-
-// Test that a client receives a server's reply, even if the server doesn't read
-// the entire request body.
-func TestIssue3595(t *testing.T) {
-	defer afterTest(t)
-	const deniedMsg = "sorry, denied."
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		Error(w, deniedMsg, StatusUnauthorized)
-	}))
-	defer ts.Close()
-	tr := &Transport{}
-	c := &Client{Transport: tr}
-	res, err := c.Post(ts.URL, "application/octet-stream", neverEnding('a'))
-	if err != nil {
-		t.Errorf("Post: %v", err)
-		return
-	}
-	got, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Fatalf("Body ReadAll: %v", err)
-	}
-	if !strings.Contains(string(got), deniedMsg) {
-		t.Errorf("Known bug: response %q does not contain %q", got, deniedMsg)
-	}
-}
-
-// From https://golang.org/issue/4454 ,
-// "client fails to handle requests with no body and chunked encoding"
-func TestChunkedNoContent(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		w.WriteHeader(StatusNoContent)
-	}))
-	defer ts.Close()
-
-	for _, closeBody := range []bool{true, false} {
-		c := &Client{Transport: &Transport{}}
-		const n = 4
-		for i := 1; i <= n; i++ {
-			res, err := c.Get(ts.URL)
-			if err != nil {
-				t.Errorf("closingBody=%v, req %d/%d: %v", closeBody, i, n, err)
-			} else {
-				if closeBody {
-					res.Body.Close()
-				}
-			}
-		}
-	}
-}
-
-func TestTransportConcurrency(t *testing.T) {
-	defer afterTest(t)
-	maxProcs, numReqs := 16, 500
-	if testing.Short() {
-		maxProcs, numReqs = 4, 50
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(maxProcs))
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		fmt.Fprintf(w, "%v", r.FormValue("echo"))
-	}))
-	defer ts.Close()
-
-	var wg sync.WaitGroup
-	wg.Add(numReqs)
-
-	// Due to the Transport's "socket late binding" (see
-	// idleConnCh in transport.go), the numReqs HTTP requests
-	// below can finish with a dial still outstanding.  To keep
-	// the leak checker happy, keep track of pending dials and
-	// wait for them to finish (and be closed or returned to the
-	// idle pool) before we close idle connections.
-	SetPendingDialHooks(func() { wg.Add(1) }, wg.Done)
-	defer SetPendingDialHooks(nil, nil)
-
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-
-	c := &Client{Transport: tr}
-	reqs := make(chan string)
-	defer close(reqs)
-
-	for i := 0; i < maxProcs*2; i++ {
-		go func() {
-			for req := range reqs {
-				res, err := c.Get(ts.URL + "/?echo=" + req)
-				if err != nil {
-					t.Errorf("error on req %s: %v", req, err)
-					wg.Done()
-					continue
-				}
-				all, err := ioutil.ReadAll(res.Body)
-				if err != nil {
-					t.Errorf("read error on req %s: %v", req, err)
-					wg.Done()
-					continue
-				}
-				if string(all) != req {
-					t.Errorf("body of req %s = %q; want %q", req, all, req)
-				}
-				res.Body.Close()
-				wg.Done()
-			}
-		}()
-	}
-	for i := 0; i < numReqs; i++ {
-		reqs <- fmt.Sprintf("request-%d", i)
-	}
-	wg.Wait()
-}
-
-func TestIssue4191_InfiniteGetTimeout(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping test; see https://golang.org/issue/7237")
-	}
-	defer afterTest(t)
-	const debug = false
-	mux := NewServeMux()
-	mux.HandleFunc("/get", func(w ResponseWriter, r *Request) {
-		io.Copy(w, neverEnding('a'))
-	})
-	ts := httptest.NewServer(mux)
-	timeout := 100 * time.Millisecond
-
-	client := &Client{
-		Transport: &Transport{
-			Dial: func(n, addr string) (net.Conn, error) {
-				conn, err := net.Dial(n, addr)
-				if err != nil {
-					return nil, err
-				}
-				conn.SetDeadline(time.Now().Add(timeout))
-				if debug {
-					conn = NewLoggingConn("client", conn)
-				}
-				return conn, nil
-			},
-			DisableKeepAlives: true,
-		},
-	}
-
-	getFailed := false
-	nRuns := 5
-	if testing.Short() {
-		nRuns = 1
-	}
-	for i := 0; i < nRuns; i++ {
-		if debug {
-			println("run", i+1, "of", nRuns)
-		}
-		sres, err := client.Get(ts.URL + "/get")
-		if err != nil {
-			if !getFailed {
-				// Make the timeout longer, once.
-				getFailed = true
-				t.Logf("increasing timeout")
-				i--
-				timeout *= 10
-				continue
-			}
-			t.Errorf("Error issuing GET: %v", err)
-			break
-		}
-		_, err = io.Copy(ioutil.Discard, sres.Body)
-		if err == nil {
-			t.Errorf("Unexpected successful copy")
-			break
-		}
-	}
-	if debug {
-		println("tests complete; waiting for handlers to finish")
-	}
-	ts.Close()
-}
-
-func TestIssue4191_InfiniteGetToPutTimeout(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping test; see https://golang.org/issue/7237")
-	}
-	defer afterTest(t)
-	const debug = false
-	mux := NewServeMux()
-	mux.HandleFunc("/get", func(w ResponseWriter, r *Request) {
-		io.Copy(w, neverEnding('a'))
-	})
-	mux.HandleFunc("/put", func(w ResponseWriter, r *Request) {
-		defer r.Body.Close()
-		io.Copy(ioutil.Discard, r.Body)
-	})
-	ts := httptest.NewServer(mux)
-	timeout := 100 * time.Millisecond
-
-	client := &Client{
-		Transport: &Transport{
-			Dial: func(n, addr string) (net.Conn, error) {
-				conn, err := net.Dial(n, addr)
-				if err != nil {
-					return nil, err
-				}
-				conn.SetDeadline(time.Now().Add(timeout))
-				if debug {
-					conn = NewLoggingConn("client", conn)
-				}
-				return conn, nil
-			},
-			DisableKeepAlives: true,
-		},
-	}
-
-	getFailed := false
-	nRuns := 5
-	if testing.Short() {
-		nRuns = 1
-	}
-	for i := 0; i < nRuns; i++ {
-		if debug {
-			println("run", i+1, "of", nRuns)
-		}
-		sres, err := client.Get(ts.URL + "/get")
-		if err != nil {
-			if !getFailed {
-				// Make the timeout longer, once.
-				getFailed = true
-				t.Logf("increasing timeout")
-				i--
-				timeout *= 10
-				continue
-			}
-			t.Errorf("Error issuing GET: %v", err)
-			break
-		}
-		req, _ := NewRequest("PUT", ts.URL+"/put", sres.Body)
-		_, err = client.Do(req)
-		if err == nil {
-			sres.Body.Close()
-			t.Errorf("Unexpected successful PUT")
-			break
-		}
-		sres.Body.Close()
-	}
-	if debug {
-		println("tests complete; waiting for handlers to finish")
-	}
-	ts.Close()
-}
-
-func TestTransportResponseHeaderTimeout(t *testing.T) {
-	defer afterTest(t)
-	if testing.Short() {
-		t.Skip("skipping timeout test in -short mode")
-	}
-	inHandler := make(chan bool, 1)
-	mux := NewServeMux()
-	mux.HandleFunc("/fast", func(w ResponseWriter, r *Request) {
-		inHandler <- true
-	})
-	mux.HandleFunc("/slow", func(w ResponseWriter, r *Request) {
-		inHandler <- true
-		time.Sleep(2 * time.Second)
-	})
-	ts := httptest.NewServer(mux)
-	defer ts.Close()
-
-	tr := &Transport{
-		ResponseHeaderTimeout: 500 * time.Millisecond,
-	}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
-
-	tests := []struct {
-		path    string
-		want    int
-		wantErr string
-	}{
-		{path: "/fast", want: 200},
-		{path: "/slow", wantErr: "timeout awaiting response headers"},
-		{path: "/fast", want: 200},
-	}
-	for i, tt := range tests {
-		res, err := c.Get(ts.URL + tt.path)
-		select {
-		case <-inHandler:
-		case <-time.After(5 * time.Second):
-			t.Errorf("never entered handler for test index %d, %s", i, tt.path)
-			continue
-		}
-		if err != nil {
-			uerr, ok := err.(*url.Error)
-			if !ok {
-				t.Errorf("error is not an url.Error; got: %#v", err)
-				continue
-			}
-			nerr, ok := uerr.Err.(net.Error)
-			if !ok {
-				t.Errorf("error does not satisfy net.Error interface; got: %#v", err)
-				continue
-			}
-			if !nerr.Timeout() {
-				t.Errorf("want timeout error; got: %q", nerr)
-				continue
-			}
-			if strings.Contains(err.Error(), tt.wantErr) {
-				continue
-			}
-			t.Errorf("%d. unexpected error: %v", i, err)
-			continue
-		}
-		if tt.wantErr != "" {
-			t.Errorf("%d. no error. expected error: %v", i, tt.wantErr)
-			continue
-		}
-		if res.StatusCode != tt.want {
-			t.Errorf("%d for path %q status = %d; want %d", i, tt.path, res.StatusCode, tt.want)
-		}
-	}
-}
-
-func TestTransportCancelRequest(t *testing.T) {
-	defer afterTest(t)
-	if testing.Short() {
-		t.Skip("skipping test in -short mode")
-	}
-	unblockc := make(chan bool)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		fmt.Fprintf(w, "Hello")
-		w.(Flusher).Flush() // send headers and some body
-		<-unblockc
-	}))
-	defer ts.Close()
-	defer close(unblockc)
-
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
-
-	req, _ := NewRequest("GET", ts.URL, nil)
-	res, err := c.Do(req)
-	if err != nil {
-		t.Fatal(err)
-	}
-	go func() {
-		time.Sleep(1 * time.Second)
-		tr.CancelRequest(req)
-	}()
-	t0 := time.Now()
-	body, err := ioutil.ReadAll(res.Body)
-	d := time.Since(t0)
-
-	if err != ExportErrRequestCanceled {
-		t.Errorf("Body.Read error = %v; want errRequestCanceled", err)
-	}
-	if string(body) != "Hello" {
-		t.Errorf("Body = %q; want Hello", body)
-	}
-	if d < 500*time.Millisecond {
-		t.Errorf("expected ~1 second delay; got %v", d)
-	}
-	// Verify no outstanding requests after readLoop/writeLoop
-	// goroutines shut down.
-	for tries := 5; tries > 0; tries-- {
-		n := tr.NumPendingRequestsForTesting()
-		if n == 0 {
-			break
-		}
-		time.Sleep(100 * time.Millisecond)
-		if tries == 1 {
-			t.Errorf("pending requests = %d; want 0", n)
-		}
-	}
-}
-
-func TestTransportCancelRequestInDial(t *testing.T) {
-	defer afterTest(t)
-	if testing.Short() {
-		t.Skip("skipping test in -short mode")
-	}
-	var logbuf bytes.Buffer
-	eventLog := log.New(&logbuf, "", 0)
-
-	unblockDial := make(chan bool)
-	defer close(unblockDial)
-
-	inDial := make(chan bool)
-	tr := &Transport{
-		Dial: func(network, addr string) (net.Conn, error) {
-			eventLog.Println("dial: blocking")
-			inDial <- true
-			<-unblockDial
-			return nil, errors.New("nope")
-		},
-	}
-	cl := &Client{Transport: tr}
-	gotres := make(chan bool)
-	req, _ := NewRequest("GET", "http://something.no-network.tld/", nil)
-	go func() {
-		_, err := cl.Do(req)
-		eventLog.Printf("Get = %v", err)
-		gotres <- true
-	}()
-
-	select {
-	case <-inDial:
-	case <-time.After(5 * time.Second):
-		t.Fatal("timeout; never saw blocking dial")
-	}
-
-	eventLog.Printf("canceling")
-	tr.CancelRequest(req)
-	tr.CancelRequest(req) // used to panic on second call
-
-	select {
-	case <-gotres:
-	case <-time.After(5 * time.Second):
-		panic("hang. events are: " + logbuf.String())
-	}
-
-	got := logbuf.String()
-	want := `dial: blocking
-canceling
-Get = Get http://something.no-network.tld/: net/http: request canceled while waiting for connection
-`
-	if got != want {
-		t.Errorf("Got events:\n%s\nWant:\n%s", got, want)
-	}
-}
-
-func TestCancelRequestWithChannel(t *testing.T) {
-	defer afterTest(t)
-	if testing.Short() {
-		t.Skip("skipping test in -short mode")
-	}
-	unblockc := make(chan bool)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		fmt.Fprintf(w, "Hello")
-		w.(Flusher).Flush() // send headers and some body
-		<-unblockc
-	}))
-	defer ts.Close()
-	defer close(unblockc)
-
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
-
-	req, _ := NewRequest("GET", ts.URL, nil)
-	ch := make(chan struct{})
-	req.Cancel = ch
-
-	res, err := c.Do(req)
-	if err != nil {
-		t.Fatal(err)
-	}
-	go func() {
-		time.Sleep(1 * time.Second)
-		close(ch)
-	}()
-	t0 := time.Now()
-	body, err := ioutil.ReadAll(res.Body)
-	d := time.Since(t0)
-
-	if err != ExportErrRequestCanceled {
-		t.Errorf("Body.Read error = %v; want errRequestCanceled", err)
-	}
-	if string(body) != "Hello" {
-		t.Errorf("Body = %q; want Hello", body)
-	}
-	if d < 500*time.Millisecond {
-		t.Errorf("expected ~1 second delay; got %v", d)
-	}
-	// Verify no outstanding requests after readLoop/writeLoop
-	// goroutines shut down.
-	for tries := 5; tries > 0; tries-- {
-		n := tr.NumPendingRequestsForTesting()
-		if n == 0 {
-			break
-		}
-		time.Sleep(100 * time.Millisecond)
-		if tries == 1 {
-			t.Errorf("pending requests = %d; want 0", n)
-		}
-	}
-}
-
-func TestCancelRequestWithChannelBeforeDo(t *testing.T) {
-	defer afterTest(t)
-	unblockc := make(chan bool)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		<-unblockc
-	}))
-	defer ts.Close()
-	defer close(unblockc)
-
-	// Don't interfere with the next test on plan9.
-	// Cf. https://golang.org/issues/11476
-	if runtime.GOOS == "plan9" {
-		defer time.Sleep(500 * time.Millisecond)
-	}
-
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
-
-	req, _ := NewRequest("GET", ts.URL, nil)
-	ch := make(chan struct{})
-	req.Cancel = ch
-	close(ch)
-
-	_, err := c.Do(req)
-	if err == nil || !strings.Contains(err.Error(), "canceled") {
-		t.Errorf("Do error = %v; want cancelation", err)
-	}
-}
-
-// Issue 11020. The returned error message should be errRequestCanceled
-func TestTransportCancelBeforeResponseHeaders(t *testing.T) {
-	t.Skip("Skipping flaky test; see Issue 11894")
-	defer afterTest(t)
-
-	serverConnCh := make(chan net.Conn, 1)
-	tr := &Transport{
-		Dial: func(network, addr string) (net.Conn, error) {
-			cc, sc := net.Pipe()
-			serverConnCh <- sc
-			return cc, nil
-		},
-	}
-	defer tr.CloseIdleConnections()
-	errc := make(chan error, 1)
-	req, _ := NewRequest("GET", "http://example.com/", nil)
-	go func() {
-		_, err := tr.RoundTrip(req)
-		errc <- err
-	}()
-
-	sc := <-serverConnCh
-	verb := make([]byte, 3)
-	if _, err := io.ReadFull(sc, verb); err != nil {
-		t.Errorf("Error reading HTTP verb from server: %v", err)
-	}
-	if string(verb) != "GET" {
-		t.Errorf("server received %q; want GET", verb)
-	}
-	defer sc.Close()
-
-	tr.CancelRequest(req)
-
-	err := <-errc
-	if err == nil {
-		t.Fatalf("unexpected success from RoundTrip")
-	}
-	if err != ExportErrRequestCanceled {
-		t.Errorf("RoundTrip error = %v; want ExportErrRequestCanceled", err)
-	}
-}
-
-// golang.org/issue/3672 -- Client can't close HTTP stream
-// Calling Close on a Response.Body used to just read until EOF.
-// Now it actually closes the TCP connection.
-func TestTransportCloseResponseBody(t *testing.T) {
-	defer afterTest(t)
-	writeErr := make(chan error, 1)
-	msg := []byte("young\n")
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		for {
-			_, err := w.Write(msg)
-			if err != nil {
-				writeErr <- err
-				return
-			}
-			w.(Flusher).Flush()
-		}
-	}))
-	defer ts.Close()
-
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
-
-	req, _ := NewRequest("GET", ts.URL, nil)
-	defer tr.CancelRequest(req)
-
-	res, err := c.Do(req)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	const repeats = 3
-	buf := make([]byte, len(msg)*repeats)
-	want := bytes.Repeat(msg, repeats)
-
-	_, err = io.ReadFull(res.Body, buf)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !bytes.Equal(buf, want) {
-		t.Fatalf("read %q; want %q", buf, want)
-	}
-	didClose := make(chan error, 1)
-	go func() {
-		didClose <- res.Body.Close()
-	}()
-	select {
-	case err := <-didClose:
-		if err != nil {
-			t.Errorf("Close = %v", err)
-		}
-	case <-time.After(10 * time.Second):
-		t.Fatal("too long waiting for close")
-	}
-	select {
-	case err := <-writeErr:
-		if err == nil {
-			t.Errorf("expected non-nil write error")
-		}
-	case <-time.After(10 * time.Second):
-		t.Fatal("too long waiting for write error")
-	}
-}
-
-type fooProto struct{}
-
-func (fooProto) RoundTrip(req *Request) (*Response, error) {
-	res := &Response{
-		Status:     "200 OK",
-		StatusCode: 200,
-		Header:     make(Header),
-		Body:       ioutil.NopCloser(strings.NewReader("You wanted " + req.URL.String())),
-	}
-	return res, nil
-}
-
-func TestTransportAltProto(t *testing.T) {
-	defer afterTest(t)
-	tr := &Transport{}
-	c := &Client{Transport: tr}
-	tr.RegisterProtocol("foo", fooProto{})
-	res, err := c.Get("foo://bar.com/path")
-	if err != nil {
-		t.Fatal(err)
-	}
-	bodyb, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		t.Fatal(err)
-	}
-	body := string(bodyb)
-	if e := "You wanted foo://bar.com/path"; body != e {
-		t.Errorf("got response %q, want %q", body, e)
-	}
-}
-
-func TestTransportNoHost(t *testing.T) {
-	defer afterTest(t)
-	tr := &Transport{}
-	_, err := tr.RoundTrip(&Request{
-		Header: make(Header),
-		URL: &url.URL{
-			Scheme: "http",
-		},
-	})
-	want := "http: no Host in request URL"
-	if got := fmt.Sprint(err); got != want {
-		t.Errorf("error = %v; want %q", err, want)
-	}
-}
-
-func TestTransportSocketLateBinding(t *testing.T) {
-	defer afterTest(t)
-
-	mux := NewServeMux()
-	fooGate := make(chan bool, 1)
-	mux.HandleFunc("/foo", func(w ResponseWriter, r *Request) {
-		w.Header().Set("foo-ipport", r.RemoteAddr)
-		w.(Flusher).Flush()
-		<-fooGate
-	})
-	mux.HandleFunc("/bar", func(w ResponseWriter, r *Request) {
-		w.Header().Set("bar-ipport", r.RemoteAddr)
-	})
-	ts := httptest.NewServer(mux)
-	defer ts.Close()
-
-	dialGate := make(chan bool, 1)
-	tr := &Transport{
-		Dial: func(n, addr string) (net.Conn, error) {
-			if <-dialGate {
-				return net.Dial(n, addr)
-			}
-			return nil, errors.New("manually closed")
-		},
-		DisableKeepAlives: false,
-	}
-	defer tr.CloseIdleConnections()
-	c := &Client{
-		Transport: tr,
-	}
-
-	dialGate <- true // only allow one dial
-	fooRes, err := c.Get(ts.URL + "/foo")
-	if err != nil {
-		t.Fatal(err)
-	}
-	fooAddr := fooRes.Header.Get("foo-ipport")
-	if fooAddr == "" {
-		t.Fatal("No addr on /foo request")
-	}
-	time.AfterFunc(200*time.Millisecond, func() {
-		// let the foo response finish so we can use its
-		// connection for /bar
-		fooGate <- true
-		io.Copy(ioutil.Discard, fooRes.Body)
-		fooRes.Body.Close()
-	})
-
-	barRes, err := c.Get(ts.URL + "/bar")
-	if err != nil {
-		t.Fatal(err)
-	}
-	barAddr := barRes.Header.Get("bar-ipport")
-	if barAddr != fooAddr {
-		t.Fatalf("/foo came from conn %q; /bar came from %q instead", fooAddr, barAddr)
-	}
-	barRes.Body.Close()
-	dialGate <- false
-}
-
-// Issue 2184
-func TestTransportReading100Continue(t *testing.T) {
-	defer afterTest(t)
-
-	const numReqs = 5
-	reqBody := func(n int) string { return fmt.Sprintf("request body %d", n) }
-	reqID := func(n int) string { return fmt.Sprintf("REQ-ID-%d", n) }
-
-	send100Response := func(w *io.PipeWriter, r *io.PipeReader) {
-		defer w.Close()
-		defer r.Close()
-		br := bufio.NewReader(r)
-		n := 0
-		for {
-			n++
-			req, err := ReadRequest(br)
-			if err == io.EOF {
-				return
-			}
-			if err != nil {
-				t.Error(err)
-				return
-			}
-			slurp, err := ioutil.ReadAll(req.Body)
-			if err != nil {
-				t.Errorf("Server request body slurp: %v", err)
-				return
-			}
-			id := req.Header.Get("Request-Id")
-			resCode := req.Header.Get("X-Want-Response-Code")
-			if resCode == "" {
-				resCode = "100 Continue"
-				if string(slurp) != reqBody(n) {
-					t.Errorf("Server got %q, %v; want %q", slurp, err, reqBody(n))
-				}
-			}
-			body := fmt.Sprintf("Response number %d", n)
-			v := []byte(strings.Replace(fmt.Sprintf(`HTTP/1.1 %s
-Date: Thu, 28 Feb 2013 17:55:41 GMT
-
-HTTP/1.1 200 OK
-Content-Type: text/html
-Echo-Request-Id: %s
-Content-Length: %d
-
-%s`, resCode, id, len(body), body), "\n", "\r\n", -1))
-			w.Write(v)
-			if id == reqID(numReqs) {
-				return
-			}
-		}
-
-	}
-
-	tr := &Transport{
-		Dial: func(n, addr string) (net.Conn, error) {
-			sr, sw := io.Pipe() // server read/write
-			cr, cw := io.Pipe() // client read/write
-			conn := &rwTestConn{
-				Reader: cr,
-				Writer: sw,
-				closeFunc: func() error {
-					sw.Close()
-					cw.Close()
-					return nil
-				},
-			}
-			go send100Response(cw, sr)
-			return conn, nil
-		},
-		DisableKeepAlives: false,
-	}
-	defer tr.CloseIdleConnections()
-	c := &Client{Transport: tr}
-
-	testResponse := func(req *Request, name string, wantCode int) {
-		res, err := c.Do(req)
-		if err != nil {
-			t.Fatalf("%s: Do: %v", name, err)
-		}
-		if res.StatusCode != wantCode {
-			t.Fatalf("%s: Response Statuscode=%d; want %d", name, res.StatusCode, wantCode)
-		}
-		if id, idBack := req.Header.Get("Request-Id"), res.Header.Get("Echo-Request-Id"); id != "" && id != idBack {
-			t.Errorf("%s: response id %q != request id %q", name, idBack, id)
-		}
-		_, err = ioutil.ReadAll(res.Body)
-		if err != nil {
-			t.Fatalf("%s: Slurp error: %v", name, err)
-		}
-	}
-
-	// Few 100 responses, making sure we're not off-by-one.
-	for i := 1; i <= numReqs; i++ {
-		req, _ := NewRequest("POST", "http://dummy.tld/", strings.NewReader(reqBody(i)))
-		req.Header.Set("Request-Id", reqID(i))
-		testResponse(req, fmt.Sprintf("100, %d/%d", i, numReqs), 200)
-	}
-
-	// And some other informational 1xx but non-100 responses, to test
-	// we return them but don't re-use the connection.
-	for i := 1; i <= numReqs; i++ {
-		req, _ := NewRequest("POST", "http://other.tld/", strings.NewReader(reqBody(i)))
-		req.Header.Set("X-Want-Response-Code", "123 Sesame Street")
-		testResponse(req, fmt.Sprintf("123, %d/%d", i, numReqs), 123)
-	}
-}
-
-type proxyFromEnvTest struct {
-	req string // URL to fetch; blank means "http://example.com"
-
-	env      string // HTTP_PROXY
-	httpsenv string // HTTPS_PROXY
-	noenv    string // NO_RPXY
-
-	want    string
-	wanterr error
-}
-
-func (t proxyFromEnvTest) String() string {
-	var buf bytes.Buffer
-	space := func() {
-		if buf.Len() > 0 {
-			buf.WriteByte(' ')
-		}
-	}
-	if t.env != "" {
-		fmt.Fprintf(&buf, "http_proxy=%q", t.env)
-	}
-	if t.httpsenv != "" {
-		space()
-		fmt.Fprintf(&buf, "https_proxy=%q", t.httpsenv)
-	}
-	if t.noenv != "" {
-		space()
-		fmt.Fprintf(&buf, "no_proxy=%q", t.noenv)
-	}
-	req := "http://example.com"
-	if t.req != "" {
-		req = t.req
-	}
-	space()
-	fmt.Fprintf(&buf, "req=%q", req)
-	return strings.TrimSpace(buf.String())
-}
-
-var proxyFromEnvTests = []proxyFromEnvTest{
-	{env: "127.0.0.1:8080", want: "http://127.0.0.1:8080"},
-	{env: "cache.corp.example.com:1234", want: "http://cache.corp.example.com:1234"},
-	{env: "cache.corp.example.com", want: "http://cache.corp.example.com"},
-	{env: "https://cache.corp.example.com", want: "https://cache.corp.example.com"},
-	{env: "http://127.0.0.1:8080", want: "http://127.0.0.1:8080"},
-	{env: "https://127.0.0.1:8080", want: "https://127.0.0.1:8080"},
-
-	// Don't use secure for http
-	{req: "http://insecure.tld/", env: "http.proxy.tld", httpsenv: "secure.proxy.tld", want: "http://http.proxy.tld"},
-	// Use secure for https.
-	{req: "https://secure.tld/", env: "http.proxy.tld", httpsenv: "secure.proxy.tld", want: "http://secure.proxy.tld"},
-	{req: "https://secure.tld/", env: "http.proxy.tld", httpsenv: "https://secure.proxy.tld", want: "https://secure.proxy.tld"},
-
-	{want: "<nil>"},
-
-	{noenv: "example.com", req: "http://example.com/", env: "proxy", want: "<nil>"},
-	{noenv: ".example.com", req: "http://example.com/", env: "proxy", want: "<nil>"},
-	{noenv: "ample.com", req: "http://example.com/", env: "proxy", want: "http://proxy"},
-	{noenv: "example.com", req: "http://foo.example.com/", env: "proxy", want: "<nil>"},
-	{noenv: ".foo.com", req: "http://example.com/", env: "proxy", want: "http://proxy"},
-}
-
-func TestProxyFromEnvironment(t *testing.T) {
-	ResetProxyEnv()
-	for _, tt := range proxyFromEnvTests {
-		os.Setenv("HTTP_PROXY", tt.env)
-		os.Setenv("HTTPS_PROXY", tt.httpsenv)
-		os.Setenv("NO_PROXY", tt.noenv)
-		ResetCachedEnvironment()
-		reqURL := tt.req
-		if reqURL == "" {
-			reqURL = "http://example.com"
-		}
-		req, _ := NewRequest("GET", reqURL, nil)
-		url, err := ProxyFromEnvironment(req)
-		if g, e := fmt.Sprintf("%v", err), fmt.Sprintf("%v", tt.wanterr); g != e {
-			t.Errorf("%v: got error = %q, want %q", tt, g, e)
-			continue
-		}
-		if got := fmt.Sprintf("%s", url); got != tt.want {
-			t.Errorf("%v: got URL = %q, want %q", tt, url, tt.want)
-		}
-	}
-}
-
-func TestIdleConnChannelLeak(t *testing.T) {
-	var mu sync.Mutex
-	var n int
-
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		mu.Lock()
-		n++
-		mu.Unlock()
-	}))
-	defer ts.Close()
-
-	const nReqs = 5
-	didRead := make(chan bool, nReqs)
-	SetReadLoopBeforeNextReadHook(func() { didRead <- true })
-	defer SetReadLoopBeforeNextReadHook(nil)
-
-	tr := &Transport{
-		Dial: func(netw, addr string) (net.Conn, error) {
-			return net.Dial(netw, ts.Listener.Addr().String())
-		},
-	}
-	defer tr.CloseIdleConnections()
-
-	c := &Client{Transport: tr}
-
-	// First, without keep-alives.
-	for _, disableKeep := range []bool{true, false} {
-		tr.DisableKeepAlives = disableKeep
-		for i := 0; i < nReqs; i++ {
-			_, err := c.Get(fmt.Sprintf("http://foo-host-%d.tld/", i))
-			if err != nil {
-				t.Fatal(err)
-			}
-			// Note: no res.Body.Close is needed here, since the
-			// response Content-Length is zero. Perhaps the test
-			// should be more explicit and use a HEAD, but tests
-			// elsewhere guarantee that zero byte responses generate
-			// a "Content-Length: 0" instead of chunking.
-		}
-
-		// At this point, each of the 5 Transport.readLoop goroutines
-		// are scheduling noting that there are no response bodies (see
-		// earlier comment), and are then calling putIdleConn, which
-		// decrements this count. Usually that happens quickly, which is
-		// why this test has seemed to work for ages. But it's still
-		// racey: we have wait for them to finish first. See Issue 10427
-		for i := 0; i < nReqs; i++ {
-			<-didRead
-		}
-
-		if got := tr.IdleConnChMapSizeForTesting(); got != 0 {
-			t.Fatalf("ForDisableKeepAlives = %v, map size = %d; want 0", disableKeep, got)
-		}
-	}
-}
-
-// Verify the status quo: that the Client.Post function coerces its
-// body into a ReadCloser if it's a Closer, and that the Transport
-// then closes it.
-func TestTransportClosesRequestBody(t *testing.T) {
-	defer afterTest(t)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		io.Copy(ioutil.Discard, r.Body)
-	}))
-	defer ts.Close()
-
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	cl := &Client{Transport: tr}
-
-	closes := 0
-
-	res, err := cl.Post(ts.URL, "text/plain", countCloseReader{&closes, strings.NewReader("hello")})
-	if err != nil {
-		t.Fatal(err)
-	}
-	res.Body.Close()
-	if closes != 1 {
-		t.Errorf("closes = %d; want 1", closes)
-	}
-}
-
-func TestTransportTLSHandshakeTimeout(t *testing.T) {
-	defer afterTest(t)
-	if testing.Short() {
-		t.Skip("skipping in short mode")
-	}
-	ln := newLocalListener(t)
-	defer ln.Close()
-	testdonec := make(chan struct{})
-	defer close(testdonec)
-
-	go func() {
-		c, err := ln.Accept()
-		if err != nil {
-			t.Error(err)
-			return
-		}
-		<-testdonec
-		c.Close()
-	}()
-
-	getdonec := make(chan struct{})
-	go func() {
-		defer close(getdonec)
-		tr := &Transport{
-			Dial: func(_, _ string) (net.Conn, error) {
-				return net.Dial("tcp", ln.Addr().String())
-			},
-			TLSHandshakeTimeout: 250 * time.Millisecond,
-		}
-		cl := &Client{Transport: tr}
-		_, err := cl.Get("https://dummy.tld/")
-		if err == nil {
-			t.Error("expected error")
-			return
-		}
-		ue, ok := err.(*url.Error)
-		if !ok {
-			t.Errorf("expected url.Error; got %#v", err)
-			return
-		}
-		ne, ok := ue.Err.(net.Error)
-		if !ok {
-			t.Errorf("expected net.Error; got %#v", err)
-			return
-		}
-		if !ne.Timeout() {
-			t.Errorf("expected timeout error; got %v", err)
-		}
-		if !strings.Contains(err.Error(), "handshake timeout") {
-			t.Errorf("expected 'handshake timeout' in error; got %v", err)
-		}
-	}()
-	select {
-	case <-getdonec:
-	case <-time.After(5 * time.Second):
-		t.Error("test timeout; TLS handshake hung?")
-	}
-}
-
-// Trying to repro golang.org/issue/3514
-func TestTLSServerClosesConnection(t *testing.T) {
-	defer afterTest(t)
-	if runtime.GOOS == "windows" {
-		t.Skip("skipping flaky test on Windows; golang.org/issue/7634")
-	}
-	closedc := make(chan bool, 1)
-	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		if strings.Contains(r.URL.Path, "/keep-alive-then-die") {
-			conn, _, _ := w.(Hijacker).Hijack()
-			conn.Write([]byte("HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nfoo"))
-			conn.Close()
-			closedc <- true
-			return
-		}
-		fmt.Fprintf(w, "hello")
-	}))
-	defer ts.Close()
-	tr := &Transport{
-		TLSClientConfig: &tls.Config{
-			InsecureSkipVerify: true,
-		},
-	}
-	defer tr.CloseIdleConnections()
-	client := &Client{Transport: tr}
-
-	var nSuccess = 0
-	var errs []error
-	const trials = 20
-	for i := 0; i < trials; i++ {
-		tr.CloseIdleConnections()
-		res, err := client.Get(ts.URL + "/keep-alive-then-die")
-		if err != nil {
-			t.Fatal(err)
-		}
-		<-closedc
-		slurp, err := ioutil.ReadAll(res.Body)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if string(slurp) != "foo" {
-			t.Errorf("Got %q, want foo", slurp)
-		}
-
-		// Now try again and see if we successfully
-		// pick a new connection.
-		res, err = client.Get(ts.URL + "/")
-		if err != nil {
-			errs = append(errs, err)
-			continue
-		}
-		slurp, err = ioutil.ReadAll(res.Body)
-		if err != nil {
-			errs = append(errs, err)
-			continue
-		}
-		nSuccess++
-	}
-	if nSuccess > 0 {
-		t.Logf("successes = %d of %d", nSuccess, trials)
-	} else {
-		t.Errorf("All runs failed:")
-	}
-	for _, err := range errs {
-		t.Logf("  err: %v", err)
-	}
-}
-
-// byteFromChanReader is an io.Reader that reads a single byte at a
-// time from the channel.  When the channel is closed, the reader
-// returns io.EOF.
-type byteFromChanReader chan byte
-
-func (c byteFromChanReader) Read(p []byte) (n int, err error) {
-	if len(p) == 0 {
-		return
-	}
-	b, ok := <-c
-	if !ok {
-		return 0, io.EOF
-	}
-	p[0] = b
-	return 1, nil
-}
-
-// Verifies that the Transport doesn't reuse a connection in the case
-// where the server replies before the request has been fully
-// written. We still honor that reply (see TestIssue3595), but don't
-// send future requests on the connection because it's then in a
-// questionable state.
-// golang.org/issue/7569
-func TestTransportNoReuseAfterEarlyResponse(t *testing.T) {
-	defer afterTest(t)
-	var sconn struct {
-		sync.Mutex
-		c net.Conn
-	}
-	var getOkay bool
-	closeConn := func() {
-		sconn.Lock()
-		defer sconn.Unlock()
-		if sconn.c != nil {
-			sconn.c.Close()
-			sconn.c = nil
-			if !getOkay {
-				t.Logf("Closed server connection")
-			}
-		}
-	}
-	defer closeConn()
-
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		if r.Method == "GET" {
-			io.WriteString(w, "bar")
-			return
-		}
-		conn, _, _ := w.(Hijacker).Hijack()
-		sconn.Lock()
-		sconn.c = conn
-		sconn.Unlock()
-		conn.Write([]byte("HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nfoo")) // keep-alive
-		go io.Copy(ioutil.Discard, conn)
-	}))
-	defer ts.Close()
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	client := &Client{Transport: tr}
-
-	const bodySize = 256 << 10
-	finalBit := make(byteFromChanReader, 1)
-	req, _ := NewRequest("POST", ts.URL, io.MultiReader(io.LimitReader(neverEnding('x'), bodySize-1), finalBit))
-	req.ContentLength = bodySize
-	res, err := client.Do(req)
-	if err := wantBody(res, err, "foo"); err != nil {
-		t.Errorf("POST response: %v", err)
-	}
-	donec := make(chan bool)
-	go func() {
-		defer close(donec)
-		res, err = client.Get(ts.URL)
-		if err := wantBody(res, err, "bar"); err != nil {
-			t.Errorf("GET response: %v", err)
-			return
-		}
-		getOkay = true // suppress test noise
-	}()
-	time.AfterFunc(5*time.Second, closeConn)
-	select {
-	case <-donec:
-		finalBit <- 'x' // unblock the writeloop of the first Post
-		close(finalBit)
-	case <-time.After(7 * time.Second):
-		t.Fatal("timeout waiting for GET request to finish")
-	}
-}
-
-// Tests that we don't leak Transport persistConn.readLoop goroutines
-// when a server hangs up immediately after saying it would keep-alive.
-func TestTransportIssue10457(t *testing.T) {
-	defer afterTest(t) // used to fail in goroutine leak check
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		// Send a response with no body, keep-alive
-		// (implicit), and then lie and immediately close the
-		// connection. This forces the Transport's readLoop to
-		// immediately Peek an io.EOF and get to the point
-		// that used to hang.
-		conn, _, _ := w.(Hijacker).Hijack()
-		conn.Write([]byte("HTTP/1.1 200 OK\r\nFoo: Bar\r\nContent-Length: 0\r\n\r\n")) // keep-alive
-		conn.Close()
-	}))
-	defer ts.Close()
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-	cl := &Client{Transport: tr}
-	res, err := cl.Get(ts.URL)
-	if err != nil {
-		t.Fatalf("Get: %v", err)
-	}
-	defer res.Body.Close()
-
-	// Just a sanity check that we at least get the response. The real
-	// test here is that the "defer afterTest" above doesn't find any
-	// leaked goroutines.
-	if got, want := res.Header.Get("Foo"), "Bar"; got != want {
-		t.Errorf("Foo header = %q; want %q", got, want)
-	}
-}
-
-type errorReader struct {
-	err error
-}
-
-func (e errorReader) Read(p []byte) (int, error) { return 0, e.err }
-
-type closerFunc func() error
-
-func (f closerFunc) Close() error { return f() }
-
-// Issue 6981
-func TestTransportClosesBodyOnError(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping test; see https://golang.org/issue/7782")
-	}
-	defer afterTest(t)
-	readBody := make(chan error, 1)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		_, err := ioutil.ReadAll(r.Body)
-		readBody <- err
-	}))
-	defer ts.Close()
-	fakeErr := errors.New("fake error")
-	didClose := make(chan bool, 1)
-	req, _ := NewRequest("POST", ts.URL, struct {
-		io.Reader
-		io.Closer
-	}{
-		io.MultiReader(io.LimitReader(neverEnding('x'), 1<<20), errorReader{fakeErr}),
-		closerFunc(func() error {
-			select {
-			case didClose <- true:
-			default:
-			}
-			return nil
-		}),
-	})
-	res, err := DefaultClient.Do(req)
-	if res != nil {
-		defer res.Body.Close()
-	}
-	if err == nil || !strings.Contains(err.Error(), fakeErr.Error()) {
-		t.Fatalf("Do error = %v; want something containing %q", err, fakeErr.Error())
-	}
-	select {
-	case err := <-readBody:
-		if err == nil {
-			t.Errorf("Unexpected success reading request body from handler; want 'unexpected EOF reading trailer'")
-		}
-	case <-time.After(5 * time.Second):
-		t.Error("timeout waiting for server handler to complete")
-	}
-	select {
-	case <-didClose:
-	default:
-		t.Errorf("didn't see Body.Close")
-	}
-}
-
-func TestTransportDialTLS(t *testing.T) {
-	var mu sync.Mutex // guards following
-	var gotReq, didDial bool
-
-	ts := httptest.NewTLSServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		mu.Lock()
-		gotReq = true
-		mu.Unlock()
-	}))
-	defer ts.Close()
-	tr := &Transport{
-		DialTLS: func(netw, addr string) (net.Conn, error) {
-			mu.Lock()
-			didDial = true
-			mu.Unlock()
-			c, err := tls.Dial(netw, addr, &tls.Config{
-				InsecureSkipVerify: true,
-			})
-			if err != nil {
-				return nil, err
-			}
-			return c, c.Handshake()
-		},
-	}
-	defer tr.CloseIdleConnections()
-	client := &Client{Transport: tr}
-	res, err := client.Get(ts.URL)
-	if err != nil {
-		t.Fatal(err)
-	}
-	res.Body.Close()
-	mu.Lock()
-	if !gotReq {
-		t.Error("didn't get request")
-	}
-	if !didDial {
-		t.Error("didn't use dial hook")
-	}
-}
-
-// Test for issue 8755
-// Ensure that if a proxy returns an error, it is exposed by RoundTrip
-func TestRoundTripReturnsProxyError(t *testing.T) {
-	badProxy := func(*Request) (*url.URL, error) {
-		return nil, errors.New("errorMessage")
-	}
-
-	tr := &Transport{Proxy: badProxy}
-
-	req, _ := NewRequest("GET", "http://example.com", nil)
-
-	_, err := tr.RoundTrip(req)
-
-	if err == nil {
-		t.Error("Expected proxy error to be returned by RoundTrip")
-	}
-}
-
-// tests that putting an idle conn after a call to CloseIdleConns does return it
-func TestTransportCloseIdleConnsThenReturn(t *testing.T) {
-	tr := &Transport{}
-	wantIdle := func(when string, n int) bool {
-		got := tr.IdleConnCountForTesting("|http|example.com") // key used by PutIdleTestConn
-		if got == n {
-			return true
-		}
-		t.Errorf("%s: idle conns = %d; want %d", when, got, n)
-		return false
-	}
-	wantIdle("start", 0)
-	if !tr.PutIdleTestConn() {
-		t.Fatal("put failed")
-	}
-	if !tr.PutIdleTestConn() {
-		t.Fatal("second put failed")
-	}
-	wantIdle("after put", 2)
-	tr.CloseIdleConnections()
-	if !tr.IsIdleForTesting() {
-		t.Error("should be idle after CloseIdleConnections")
-	}
-	wantIdle("after close idle", 0)
-	if tr.PutIdleTestConn() {
-		t.Fatal("put didn't fail")
-	}
-	wantIdle("after second put", 0)
-
-	tr.RequestIdleConnChForTesting() // should toggle the transport out of idle mode
-	if tr.IsIdleForTesting() {
-		t.Error("shouldn't be idle after RequestIdleConnChForTesting")
-	}
-	if !tr.PutIdleTestConn() {
-		t.Fatal("after re-activation")
-	}
-	wantIdle("after final put", 1)
-}
-
-// This tests that an client requesting a content range won't also
-// implicitly ask for gzip support. If they want that, they need to do it
-// on their own.
-// golang.org/issue/8923
-func TestTransportRangeAndGzip(t *testing.T) {
-	defer afterTest(t)
-	reqc := make(chan *Request, 1)
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		reqc <- r
-	}))
-	defer ts.Close()
-
-	req, _ := NewRequest("GET", ts.URL, nil)
-	req.Header.Set("Range", "bytes=7-11")
-	res, err := DefaultClient.Do(req)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	select {
-	case r := <-reqc:
-		if strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
-			t.Error("Transport advertised gzip support in the Accept header")
-		}
-		if r.Header.Get("Range") == "" {
-			t.Error("no Range in request")
-		}
-	case <-time.After(10 * time.Second):
-		t.Fatal("timeout")
-	}
-	res.Body.Close()
-}
-
-// Previously, we used to handle a logical race within RoundTrip by waiting for 100ms
-// in the case of an error. Changing the order of the channel operations got rid of this
-// race.
-//
-// In order to test that the channel op reordering works, we install a hook into the
-// roundTrip function which gets called if we saw the connection go away and
-// we subsequently received a response.
-func TestTransportResponseCloseRace(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in short mode")
-	}
-	defer afterTest(t)
-
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-	}))
-	defer ts.Close()
-	sawRace := false
-	SetInstallConnClosedHook(func() {
-		sawRace = true
-	})
-	defer SetInstallConnClosedHook(nil)
-	tr := &Transport{
-		DisableKeepAlives: true,
-	}
-	req, err := NewRequest("GET", ts.URL, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	// selects are not deterministic, so do this a bunch
-	// and see if we handle the logical race at least once.
-	for i := 0; i < 10000; i++ {
-		resp, err := tr.RoundTrip(req)
-		if err != nil {
-			t.Fatalf("unexpected error: %s", err)
-			continue
-		}
-		resp.Body.Close()
-		if sawRace {
-			break
-		}
-	}
-	if !sawRace {
-		t.Errorf("didn't see response/connection going away race")
-	}
-}
-
-// Test for issue 10474
-func TestTransportResponseCancelRace(t *testing.T) {
-	defer afterTest(t)
-
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		// important that this response has a body.
-		var b [1024]byte
-		w.Write(b[:])
-	}))
-	defer ts.Close()
-
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-
-	req, err := NewRequest("GET", ts.URL, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	res, err := tr.RoundTrip(req)
-	if err != nil {
-		t.Fatal(err)
-	}
-	// If we do an early close, Transport just throws the connection away and
-	// doesn't reuse it. In order to trigger the bug, it has to reuse the connection
-	// so read the body
-	if _, err := io.Copy(ioutil.Discard, res.Body); err != nil {
-		t.Fatal(err)
-	}
-
-	req2, err := NewRequest("GET", ts.URL, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	tr.CancelRequest(req)
-	res, err = tr.RoundTrip(req2)
-	if err != nil {
-		t.Fatal(err)
-	}
-	res.Body.Close()
-}
-
-func TestTransportDialCancelRace(t *testing.T) {
-	defer afterTest(t)
-
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
-	defer ts.Close()
-
-	tr := &Transport{}
-	defer tr.CloseIdleConnections()
-
-	req, err := NewRequest("GET", ts.URL, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	SetEnterRoundTripHook(func() {
-		tr.CancelRequest(req)
-	})
-	defer SetEnterRoundTripHook(nil)
-	res, err := tr.RoundTrip(req)
-	if err != ExportErrRequestCanceled {
-		t.Errorf("expected canceled request error; got %v", err)
-		if err == nil {
-			res.Body.Close()
-		}
-	}
-}
-
-// logWritesConn is a net.Conn that logs each Write call to writes
-// and then proxies to w.
-// It proxies Read calls to a reader it receives from rch.
-type logWritesConn struct {
-	net.Conn // nil. crash on use.
-
-	w io.Writer
-
-	rch <-chan io.Reader
-	r   io.Reader // nil until received by rch
-
-	mu     sync.Mutex
-	writes []string
-}
-
-func (c *logWritesConn) Write(p []byte) (n int, err error) {
-	c.mu.Lock()
-	defer c.mu.Unlock()
-	c.writes = append(c.writes, string(p))
-	return c.w.Write(p)
-}
-
-func (c *logWritesConn) Read(p []byte) (n int, err error) {
-	if c.r == nil {
-		c.r = <-c.rch
-	}
-	return c.r.Read(p)
-}
-
-func (c *logWritesConn) Close() error { return nil }
-
-// Issue 6574
-func TestTransportFlushesBodyChunks(t *testing.T) {
-	defer afterTest(t)
-	resBody := make(chan io.Reader, 1)
-	connr, connw := io.Pipe() // connection pipe pair
-	lw := &logWritesConn{
-		rch: resBody,
-		w:   connw,
-	}
-	tr := &Transport{
-		Dial: func(network, addr string) (net.Conn, error) {
-			return lw, nil
-		},
-	}
-	bodyr, bodyw := io.Pipe() // body pipe pair
-	go func() {
-		defer bodyw.Close()
-		for i := 0; i < 3; i++ {
-			fmt.Fprintf(bodyw, "num%d\n", i)
-		}
-	}()
-	resc := make(chan *Response)
-	go func() {
-		req, _ := NewRequest("POST", "http://localhost:8080", bodyr)
-		req.Header.Set("User-Agent", "x") // known value for test
-		res, err := tr.RoundTrip(req)
-		if err != nil {
-			t.Error("RoundTrip: %v", err)
-			close(resc)
-			return
-		}
-		resc <- res
-
-	}()
-	// Fully consume the request before checking the Write log vs. want.
-	req, err := ReadRequest(bufio.NewReader(connr))
-	if err != nil {
-		t.Fatal(err)
-	}
-	io.Copy(ioutil.Discard, req.Body)
-
-	// Unblock the transport's roundTrip goroutine.
-	resBody <- strings.NewReader("HTTP/1.1 204 No Content\r\nConnection: close\r\n\r\n")
-	res, ok := <-resc
-	if !ok {
-		return
-	}
-	defer res.Body.Close()
-
-	want := []string{
-		// Because Request.ContentLength = 0, the body is sniffed for 1 byte to determine whether there's content.
-		// That explains the initial "num0" being split into "n" and "um0".
-		// The first byte is included with the request headers Write. Perhaps in the future
-		// we will want to flush the headers out early if the first byte of the request body is
-		// taking a long time to arrive. But not yet.
-		"POST / HTTP/1.1\r\nHost: localhost:8080\r\nUser-Agent: x\r\nTransfer-Encoding: chunked\r\nAccept-Encoding: gzip\r\n\r\n" +
-			"1\r\nn\r\n",
-		"4\r\num0\n\r\n",
-		"5\r\nnum1\n\r\n",
-		"5\r\nnum2\n\r\n",
-		"0\r\n\r\n",
-	}
-	if !reflect.DeepEqual(lw.writes, want) {
-		t.Errorf("Writes differed.\n Got: %q\nWant: %q\n", lw.writes, want)
-	}
-}
-
-// Issue 11745.
-func TestTransportPrefersResponseOverWriteError(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in short mode")
-	}
-	defer afterTest(t)
-	const contentLengthLimit = 1024 * 1024 // 1MB
-	ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
-		if r.ContentLength >= contentLengthLimit {
-			w.WriteHeader(StatusBadRequest)
-			r.Body.Close()
-			return
-		}
-		w.WriteHeader(StatusOK)
-	}))
-	defer ts.Close()
-
-	fail := 0
-	count := 100
-	bigBody := strings.Repeat("a", contentLengthLimit*2)
-	for i := 0; i < count; i++ {
-		req, err := NewRequest("PUT", ts.URL, strings.NewReader(bigBody))
-		if err != nil {
-			t.Fatal(err)
-		}
-		tr := new(Transport)
-		defer tr.CloseIdleConnections()
-		client := &Client{Transport: tr}
-		resp, err := client.Do(req)
-		if err != nil {
-			fail++
-			t.Logf("%d = %#v", i, err)
-			if ue, ok := err.(*url.Error); ok {
-				t.Logf("urlErr = %#v", ue.Err)
-				if ne, ok := ue.Err.(*net.OpError); ok {
-					t.Logf("netOpError = %#v", ne.Err)
-				}
-			}
-		} else {
-			resp.Body.Close()
-			if resp.StatusCode != 400 {
-				t.Errorf("Expected status code 400, got %v", resp.Status)
-			}
-		}
-	}
-	if fail > 0 {
-		t.Errorf("Failed %v out of %v\n", fail, count)
-	}
-}
-
-func wantBody(res *Response, err error, want string) error {
-	if err != nil {
-		return err
-	}
-	slurp, err := ioutil.ReadAll(res.Body)
-	if err != nil {
-		return fmt.Errorf("error reading body: %v", err)
-	}
-	if string(slurp) != want {
-		return fmt.Errorf("body = %q; want %q", slurp, want)
-	}
-	if err := res.Body.Close(); err != nil {
-		return fmt.Errorf("body Close = %v", err)
-	}
-	return nil
-}
-
-func newLocalListener(t *testing.T) net.Listener {
-	ln, err := net.Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		ln, err = net.Listen("tcp6", "[::1]:0")
-	}
-	if err != nil {
-		t.Fatal(err)
-	}
-	return ln
-}
-
-type countCloseReader struct {
-	n *int
-	io.Reader
-}
-
-func (cr countCloseReader) Close() error {
-	(*cr.n)++
-	return nil
-}
-
-// rgz is a gzip quine that uncompresses to itself.
-var rgz = []byte{
-	0x1f, 0x8b, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73,
-	0x69, 0x76, 0x65, 0x00, 0x92, 0xef, 0xe6, 0xe0,
-	0x60, 0x00, 0x83, 0xa2, 0xd4, 0xe4, 0xd2, 0xa2,
-	0xe2, 0xcc, 0xb2, 0x54, 0x06, 0x00, 0x00, 0x17,
-	0x00, 0xe8, 0xff, 0x92, 0xef, 0xe6, 0xe0, 0x60,
-	0x00, 0x83, 0xa2, 0xd4, 0xe4, 0xd2, 0xa2, 0xe2,
-	0xcc, 0xb2, 0x54, 0x06, 0x00, 0x00, 0x17, 0x00,
-	0xe8, 0xff, 0x42, 0x12, 0x46, 0x16, 0x06, 0x00,
-	0x05, 0x00, 0xfa, 0xff, 0x42, 0x12, 0x46, 0x16,
-	0x06, 0x00, 0x05, 0x00, 0xfa, 0xff, 0x00, 0x05,
-	0x00, 0xfa, 0xff, 0x00, 0x14, 0x00, 0xeb, 0xff,
-	0x42, 0x12, 0x46, 0x16, 0x06, 0x00, 0x05, 0x00,
-	0xfa, 0xff, 0x00, 0x05, 0x00, 0xfa, 0xff, 0x00,
-	0x14, 0x00, 0xeb, 0xff, 0x42, 0x88, 0x21, 0xc4,
-	0x00, 0x00, 0x14, 0x00, 0xeb, 0xff, 0x42, 0x88,
-	0x21, 0xc4, 0x00, 0x00, 0x14, 0x00, 0xeb, 0xff,
-	0x42, 0x88, 0x21, 0xc4, 0x00, 0x00, 0x14, 0x00,
-	0xeb, 0xff, 0x42, 0x88, 0x21, 0xc4, 0x00, 0x00,
-	0x14, 0x00, 0xeb, 0xff, 0x42, 0x88, 0x21, 0xc4,
-	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-	0x00, 0xff, 0xff, 0x00, 0x17, 0x00, 0xe8, 0xff,
-	0x42, 0x88, 0x21, 0xc4, 0x00, 0x00, 0x00, 0x00,
-	0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
-	0x17, 0x00, 0xe8, 0xff, 0x42, 0x12, 0x46, 0x16,
-	0x06, 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x08,
-	0x00, 0xf7, 0xff, 0x3d, 0xb1, 0x20, 0x85, 0xfa,
-	0x00, 0x00, 0x00, 0x42, 0x12, 0x46, 0x16, 0x06,
-	0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x08, 0x00,
-	0xf7, 0xff, 0x3d, 0xb1, 0x20, 0x85, 0xfa, 0x00,
-	0x00, 0x00, 0x3d, 0xb1, 0x20, 0x85, 0xfa, 0x00,
-	0x00, 0x00,
-}
diff --git a/third_party/gofrontend/libgo/go/net/http/triv.go b/third_party/gofrontend/libgo/go/net/http/triv.go
deleted file mode 100644
index 232d650..0000000
--- a/third_party/gofrontend/libgo/go/net/http/triv.go
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package main
-
-import (
-	"bytes"
-	"expvar"
-	"flag"
-	"fmt"
-	"io"
-	"log"
-	"net/http"
-	"os"
-	"os/exec"
-	"strconv"
-	"sync"
-)
-
-// hello world, the web server
-var helloRequests = expvar.NewInt("hello-requests")
-
-func HelloServer(w http.ResponseWriter, req *http.Request) {
-	helloRequests.Add(1)
-	io.WriteString(w, "hello, world!\n")
-}
-
-// Simple counter server. POSTing to it will set the value.
-type Counter struct {
-	mu sync.Mutex // protects n
-	n  int
-}
-
-// This makes Counter satisfy the expvar.Var interface, so we can export
-// it directly.
-func (ctr *Counter) String() string {
-	ctr.mu.Lock()
-	defer ctr.mu.Unlock()
-	return fmt.Sprintf("%d", ctr.n)
-}
-
-func (ctr *Counter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
-	ctr.mu.Lock()
-	defer ctr.mu.Unlock()
-	switch req.Method {
-	case "GET":
-		ctr.n++
-	case "POST":
-		buf := new(bytes.Buffer)
-		io.Copy(buf, req.Body)
-		body := buf.String()
-		if n, err := strconv.Atoi(body); err != nil {
-			fmt.Fprintf(w, "bad POST: %v\nbody: [%v]\n", err, body)
-		} else {
-			ctr.n = n
-			fmt.Fprint(w, "counter reset\n")
-		}
-	}
-	fmt.Fprintf(w, "counter = %d\n", ctr.n)
-}
-
-// simple flag server
-var booleanflag = flag.Bool("boolean", true, "another flag for testing")
-
-func FlagServer(w http.ResponseWriter, req *http.Request) {
-	w.Header().Set("Content-Type", "text/plain; charset=utf-8")
-	fmt.Fprint(w, "Flags:\n")
-	flag.VisitAll(func(f *flag.Flag) {
-		if f.Value.String() != f.DefValue {
-			fmt.Fprintf(w, "%s = %s [default = %s]\n", f.Name, f.Value.String(), f.DefValue)
-		} else {
-			fmt.Fprintf(w, "%s = %s\n", f.Name, f.Value.String())
-		}
-	})
-}
-
-// simple argument server
-func ArgServer(w http.ResponseWriter, req *http.Request) {
-	for _, s := range os.Args {
-		fmt.Fprint(w, s, " ")
-	}
-}
-
-// a channel (just for the fun of it)
-type Chan chan int
-
-func ChanCreate() Chan {
-	c := make(Chan)
-	go func(c Chan) {
-		for x := 0; ; x++ {
-			c <- x
-		}
-	}(c)
-	return c
-}
-
-func (ch Chan) ServeHTTP(w http.ResponseWriter, req *http.Request) {
-	io.WriteString(w, fmt.Sprintf("channel send #%d\n", <-ch))
-}
-
-// exec a program, redirecting output
-func DateServer(rw http.ResponseWriter, req *http.Request) {
-	rw.Header().Set("Content-Type", "text/plain; charset=utf-8")
-
-	date, err := exec.Command("/bin/date").Output()
-	if err != nil {
-		http.Error(rw, err.Error(), 500)
-		return
-	}
-	rw.Write(date)
-}
-
-func Logger(w http.ResponseWriter, req *http.Request) {
-	log.Print(req.URL)
-	http.Error(w, "oops", 404)
-}
-
-var webroot = flag.String("root", os.Getenv("HOME"), "web root directory")
-
-func main() {
-	flag.Parse()
-
-	// The counter is published as a variable directly.
-	ctr := new(Counter)
-	expvar.Publish("counter", ctr)
-	http.Handle("/counter", ctr)
-	http.Handle("/", http.HandlerFunc(Logger))
-	http.Handle("/go/", http.StripPrefix("/go/", http.FileServer(http.Dir(*webroot))))
-	http.Handle("/chan", ChanCreate())
-	http.HandleFunc("/flags", FlagServer)
-	http.HandleFunc("/args", ArgServer)
-	http.HandleFunc("/go/hello", HelloServer)
-	http.HandleFunc("/date", DateServer)
-	err := http.ListenAndServe(":12345", nil)
-	if err != nil {
-		log.Panicln("ListenAndServe:", err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/interface.go b/third_party/gofrontend/libgo/go/net/interface.go
deleted file mode 100644
index 9c7b5da..0000000
--- a/third_party/gofrontend/libgo/go/net/interface.go
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import "errors"
-
-var (
-	errInvalidInterface         = errors.New("invalid network interface")
-	errInvalidInterfaceIndex    = errors.New("invalid network interface index")
-	errInvalidInterfaceName     = errors.New("invalid network interface name")
-	errNoSuchInterface          = errors.New("no such network interface")
-	errNoSuchMulticastInterface = errors.New("no such multicast network interface")
-)
-
-// Interface represents a mapping between network interface name
-// and index.  It also represents network interface facility
-// information.
-type Interface struct {
-	Index        int          // positive integer that starts at one, zero is never used
-	MTU          int          // maximum transmission unit
-	Name         string       // e.g., "en0", "lo0", "eth0.100"
-	HardwareAddr HardwareAddr // IEEE MAC-48, EUI-48 and EUI-64 form
-	Flags        Flags        // e.g., FlagUp, FlagLoopback, FlagMulticast
-}
-
-type Flags uint
-
-const (
-	FlagUp           Flags = 1 << iota // interface is up
-	FlagBroadcast                      // interface supports broadcast access capability
-	FlagLoopback                       // interface is a loopback interface
-	FlagPointToPoint                   // interface belongs to a point-to-point link
-	FlagMulticast                      // interface supports multicast access capability
-)
-
-var flagNames = []string{
-	"up",
-	"broadcast",
-	"loopback",
-	"pointtopoint",
-	"multicast",
-}
-
-func (f Flags) String() string {
-	s := ""
-	for i, name := range flagNames {
-		if f&(1<<uint(i)) != 0 {
-			if s != "" {
-				s += "|"
-			}
-			s += name
-		}
-	}
-	if s == "" {
-		s = "0"
-	}
-	return s
-}
-
-// Addrs returns interface addresses for a specific interface.
-func (ifi *Interface) Addrs() ([]Addr, error) {
-	if ifi == nil {
-		return nil, &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: errInvalidInterface}
-	}
-	ifat, err := interfaceAddrTable(ifi)
-	if err != nil {
-		err = &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: err}
-	}
-	return ifat, err
-}
-
-// MulticastAddrs returns multicast, joined group addresses for
-// a specific interface.
-func (ifi *Interface) MulticastAddrs() ([]Addr, error) {
-	if ifi == nil {
-		return nil, &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: errInvalidInterface}
-	}
-	ifat, err := interfaceMulticastAddrTable(ifi)
-	if err != nil {
-		err = &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: err}
-	}
-	return ifat, err
-}
-
-// Interfaces returns a list of the system's network interfaces.
-func Interfaces() ([]Interface, error) {
-	ift, err := interfaceTable(0)
-	if err != nil {
-		err = &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: err}
-	}
-	return ift, err
-}
-
-// InterfaceAddrs returns a list of the system's network interface
-// addresses.
-func InterfaceAddrs() ([]Addr, error) {
-	ifat, err := interfaceAddrTable(nil)
-	if err != nil {
-		err = &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: err}
-	}
-	return ifat, err
-}
-
-// InterfaceByIndex returns the interface specified by index.
-func InterfaceByIndex(index int) (*Interface, error) {
-	if index <= 0 {
-		return nil, &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: errInvalidInterfaceIndex}
-	}
-	ift, err := interfaceTable(index)
-	if err != nil {
-		return nil, &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: err}
-	}
-	ifi, err := interfaceByIndex(ift, index)
-	if err != nil {
-		err = &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: err}
-	}
-	return ifi, err
-}
-
-func interfaceByIndex(ift []Interface, index int) (*Interface, error) {
-	for _, ifi := range ift {
-		if index == ifi.Index {
-			return &ifi, nil
-		}
-	}
-	return nil, errNoSuchInterface
-}
-
-// InterfaceByName returns the interface specified by name.
-func InterfaceByName(name string) (*Interface, error) {
-	if name == "" {
-		return nil, &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: errInvalidInterfaceName}
-	}
-	ift, err := interfaceTable(0)
-	if err != nil {
-		return nil, &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: err}
-	}
-	for _, ifi := range ift {
-		if name == ifi.Name {
-			return &ifi, nil
-		}
-	}
-	return nil, &OpError{Op: "route", Net: "ip+net", Source: nil, Addr: nil, Err: errNoSuchInterface}
-}
diff --git a/third_party/gofrontend/libgo/go/net/interface_bsd.go b/third_party/gofrontend/libgo/go/net/interface_bsd.go
deleted file mode 100644
index 208f37f..0000000
--- a/third_party/gofrontend/libgo/go/net/interface_bsd.go
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package net
-
-import (
-	"os"
-	"syscall"
-	"unsafe"
-)
-
-// If the ifindex is zero, interfaceTable returns mappings of all
-// network interfaces.  Otherwise it returns a mapping of a specific
-// interface.
-func interfaceTable(ifindex int) ([]Interface, error) {
-	tab, err := syscall.RouteRIB(syscall.NET_RT_IFLIST, ifindex)
-	if err != nil {
-		return nil, os.NewSyscallError("routerib", err)
-	}
-	msgs, err := syscall.ParseRoutingMessage(tab)
-	if err != nil {
-		return nil, os.NewSyscallError("parseroutingmessage", err)
-	}
-	return parseInterfaceTable(ifindex, msgs)
-}
-
-func parseInterfaceTable(ifindex int, msgs []syscall.RoutingMessage) ([]Interface, error) {
-	var ift []Interface
-loop:
-	for _, m := range msgs {
-		switch m := m.(type) {
-		case *syscall.InterfaceMessage:
-			if ifindex == 0 || ifindex == int(m.Header.Index) {
-				ifi, err := newLink(m)
-				if err != nil {
-					return nil, err
-				}
-				ift = append(ift, *ifi)
-				if ifindex == int(m.Header.Index) {
-					break loop
-				}
-			}
-		}
-	}
-	return ift, nil
-}
-
-func newLink(m *syscall.InterfaceMessage) (*Interface, error) {
-	sas, err := syscall.ParseRoutingSockaddr(m)
-	if err != nil {
-		return nil, os.NewSyscallError("parseroutingsockaddr", err)
-	}
-	ifi := &Interface{Index: int(m.Header.Index), Flags: linkFlags(m.Header.Flags)}
-	sa, _ := sas[syscall.RTAX_IFP].(*syscall.SockaddrDatalink)
-	if sa != nil {
-		// NOTE: SockaddrDatalink.Data is minimum work area,
-		// can be larger.
-		m.Data = m.Data[unsafe.Offsetof(sa.Data):]
-		var name [syscall.IFNAMSIZ]byte
-		for i := 0; i < int(sa.Nlen); i++ {
-			name[i] = byte(m.Data[i])
-		}
-		ifi.Name = string(name[:sa.Nlen])
-		ifi.MTU = int(m.Header.Data.Mtu)
-		addr := make([]byte, sa.Alen)
-		for i := 0; i < int(sa.Alen); i++ {
-			addr[i] = byte(m.Data[int(sa.Nlen)+i])
-		}
-		ifi.HardwareAddr = addr[:sa.Alen]
-	}
-	return ifi, nil
-}
-
-func linkFlags(rawFlags int32) Flags {
-	var f Flags
-	if rawFlags&syscall.IFF_UP != 0 {
-		f |= FlagUp
-	}
-	if rawFlags&syscall.IFF_BROADCAST != 0 {
-		f |= FlagBroadcast
-	}
-	if rawFlags&syscall.IFF_LOOPBACK != 0 {
-		f |= FlagLoopback
-	}
-	if rawFlags&syscall.IFF_POINTOPOINT != 0 {
-		f |= FlagPointToPoint
-	}
-	if rawFlags&syscall.IFF_MULTICAST != 0 {
-		f |= FlagMulticast
-	}
-	return f
-}
-
-// If the ifi is nil, interfaceAddrTable returns addresses for all
-// network interfaces.  Otherwise it returns addresses for a specific
-// interface.
-func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
-	index := 0
-	if ifi != nil {
-		index = ifi.Index
-	}
-	tab, err := syscall.RouteRIB(syscall.NET_RT_IFLIST, index)
-	if err != nil {
-		return nil, os.NewSyscallError("routerib", err)
-	}
-	msgs, err := syscall.ParseRoutingMessage(tab)
-	if err != nil {
-		return nil, os.NewSyscallError("parseroutingmessage", err)
-	}
-	var ift []Interface
-	if index == 0 {
-		ift, err = parseInterfaceTable(index, msgs)
-		if err != nil {
-			return nil, err
-		}
-	}
-	var ifat []Addr
-	for _, m := range msgs {
-		switch m := m.(type) {
-		case *syscall.InterfaceAddrMessage:
-			if index == 0 || index == int(m.Header.Index) {
-				if index == 0 {
-					var err error
-					ifi, err = interfaceByIndex(ift, int(m.Header.Index))
-					if err != nil {
-						return nil, err
-					}
-				}
-				ifa, err := newAddr(ifi, m)
-				if err != nil {
-					return nil, err
-				}
-				if ifa != nil {
-					ifat = append(ifat, ifa)
-				}
-			}
-		}
-	}
-	return ifat, nil
-}
-
-func newAddr(ifi *Interface, m *syscall.InterfaceAddrMessage) (*IPNet, error) {
-	sas, err := syscall.ParseRoutingSockaddr(m)
-	if err != nil {
-		return nil, os.NewSyscallError("parseroutingsockaddr", err)
-	}
-	ifa := &IPNet{}
-	switch sa := sas[syscall.RTAX_NETMASK].(type) {
-	case *syscall.SockaddrInet4:
-		ifa.Mask = IPv4Mask(sa.Addr[0], sa.Addr[1], sa.Addr[2], sa.Addr[3])
-	case *syscall.SockaddrInet6:
-		ifa.Mask = make(IPMask, IPv6len)
-		copy(ifa.Mask, sa.Addr[:])
-	}
-	switch sa := sas[syscall.RTAX_IFA].(type) {
-	case *syscall.SockaddrInet4:
-		ifa.IP = IPv4(sa.Addr[0], sa.Addr[1], sa.Addr[2], sa.Addr[3])
-	case *syscall.SockaddrInet6:
-		ifa.IP = make(IP, IPv6len)
-		copy(ifa.IP, sa.Addr[:])
-		// NOTE: KAME based IPv6 protcol stack usually embeds
-		// the interface index in the interface-local or
-		// link-local address as the kernel-internal form.
-		if ifa.IP.IsLinkLocalUnicast() {
-			ifa.IP[2], ifa.IP[3] = 0, 0
-		}
-	}
-	if ifa.IP == nil || ifa.Mask == nil {
-		return nil, nil // Sockaddrs contain syscall.SockaddrDatalink on NetBSD
-	}
-	return ifa, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/interface_darwin.go b/third_party/gofrontend/libgo/go/net/interface_darwin.go
deleted file mode 100644
index b7a3338..0000000
--- a/third_party/gofrontend/libgo/go/net/interface_darwin.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-// interfaceMulticastAddrTable returns addresses for a specific
-// interface.
-func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
-	tab, err := syscall.RouteRIB(syscall.NET_RT_IFLIST2, ifi.Index)
-	if err != nil {
-		return nil, os.NewSyscallError("routerib", err)
-	}
-	msgs, err := syscall.ParseRoutingMessage(tab)
-	if err != nil {
-		return nil, os.NewSyscallError("parseroutingmessage", err)
-	}
-	var ifmat []Addr
-	for _, m := range msgs {
-		switch m := m.(type) {
-		case *syscall.InterfaceMulticastAddrMessage:
-			if ifi.Index == int(m.Header.Index) {
-				ifma, err := newMulticastAddr(ifi, m)
-				if err != nil {
-					return nil, err
-				}
-				if ifma != nil {
-					ifmat = append(ifmat, ifma)
-				}
-			}
-		}
-	}
-	return ifmat, nil
-}
-
-func newMulticastAddr(ifi *Interface, m *syscall.InterfaceMulticastAddrMessage) (*IPAddr, error) {
-	sas, err := syscall.ParseRoutingSockaddr(m)
-	if err != nil {
-		return nil, os.NewSyscallError("parseroutingsockaddr", err)
-	}
-	switch sa := sas[syscall.RTAX_IFA].(type) {
-	case *syscall.SockaddrInet4:
-		return &IPAddr{IP: IPv4(sa.Addr[0], sa.Addr[1], sa.Addr[2], sa.Addr[3])}, nil
-	case *syscall.SockaddrInet6:
-		ifma := IPAddr{IP: make(IP, IPv6len)}
-		copy(ifma.IP, sa.Addr[:])
-		// NOTE: KAME based IPv6 protcol stack usually embeds
-		// the interface index in the interface-local or
-		// link-local address as the kernel-internal form.
-		if ifma.IP.IsInterfaceLocalMulticast() || ifma.IP.IsLinkLocalMulticast() {
-			ifma.IP[2], ifma.IP[3] = 0, 0
-		}
-		return &ifma, nil
-	default:
-		return nil, nil
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/interface_dragonfly.go b/third_party/gofrontend/libgo/go/net/interface_dragonfly.go
deleted file mode 100644
index c9ce5a7..0000000
--- a/third_party/gofrontend/libgo/go/net/interface_dragonfly.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-// interfaceMulticastAddrTable returns addresses for a specific
-// interface.
-func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
-	// TODO(mikio): Implement this like other platforms.
-	return nil, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/interface_freebsd.go b/third_party/gofrontend/libgo/go/net/interface_freebsd.go
deleted file mode 100644
index c42d90b..0000000
--- a/third_party/gofrontend/libgo/go/net/interface_freebsd.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-// interfaceMulticastAddrTable returns addresses for a specific
-// interface.
-func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
-	tab, err := syscall.RouteRIB(syscall.NET_RT_IFMALIST, ifi.Index)
-	if err != nil {
-		return nil, os.NewSyscallError("routerib", err)
-	}
-	msgs, err := syscall.ParseRoutingMessage(tab)
-	if err != nil {
-		return nil, os.NewSyscallError("parseroutingmessage", err)
-	}
-	var ifmat []Addr
-	for _, m := range msgs {
-		switch m := m.(type) {
-		case *syscall.InterfaceMulticastAddrMessage:
-			if ifi.Index == int(m.Header.Index) {
-				ifma, err := newMulticastAddr(ifi, m)
-				if err != nil {
-					return nil, err
-				}
-				if ifma != nil {
-					ifmat = append(ifmat, ifma)
-				}
-			}
-		}
-	}
-	return ifmat, nil
-}
-
-func newMulticastAddr(ifi *Interface, m *syscall.InterfaceMulticastAddrMessage) (*IPAddr, error) {
-	sas, err := syscall.ParseRoutingSockaddr(m)
-	if err != nil {
-		return nil, os.NewSyscallError("parseroutingsockaddr", err)
-	}
-	switch sa := sas[syscall.RTAX_IFA].(type) {
-	case *syscall.SockaddrInet4:
-		return &IPAddr{IP: IPv4(sa.Addr[0], sa.Addr[1], sa.Addr[2], sa.Addr[3])}, nil
-	case *syscall.SockaddrInet6:
-		ifma := IPAddr{IP: make(IP, IPv6len)}
-		copy(ifma.IP, sa.Addr[:])
-		// NOTE: KAME based IPv6 protcol stack usually embeds
-		// the interface index in the interface-local or
-		// link-local address as the kernel-internal form.
-		if ifma.IP.IsInterfaceLocalMulticast() || ifma.IP.IsLinkLocalMulticast() {
-			ifma.IP[2], ifma.IP[3] = 0, 0
-		}
-		return &ifma, nil
-	default:
-		return nil, nil
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/interface_linux.go b/third_party/gofrontend/libgo/go/net/interface_linux.go
deleted file mode 100644
index ef20429..0000000
--- a/third_party/gofrontend/libgo/go/net/interface_linux.go
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-	"unsafe"
-)
-
-// If the ifindex is zero, interfaceTable returns mappings of all
-// network interfaces.  Otherwise it returns a mapping of a specific
-// interface.
-func interfaceTable(ifindex int) ([]Interface, error) {
-	tab, err := syscall.NetlinkRIB(syscall.RTM_GETLINK, syscall.AF_UNSPEC)
-	if err != nil {
-		return nil, os.NewSyscallError("netlinkrib", err)
-	}
-	msgs, err := syscall.ParseNetlinkMessage(tab)
-	if err != nil {
-		return nil, os.NewSyscallError("parsenetlinkmessage", err)
-	}
-	var ift []Interface
-loop:
-	for _, m := range msgs {
-		switch m.Header.Type {
-		case syscall.NLMSG_DONE:
-			break loop
-		case syscall.RTM_NEWLINK:
-			ifim := (*syscall.IfInfomsg)(unsafe.Pointer(&m.Data[0]))
-			if ifindex == 0 || ifindex == int(ifim.Index) {
-				attrs, err := syscall.ParseNetlinkRouteAttr(&m)
-				if err != nil {
-					return nil, os.NewSyscallError("parsenetlinkrouteattr", err)
-				}
-				ift = append(ift, *newLink(ifim, attrs))
-				if ifindex == int(ifim.Index) {
-					break loop
-				}
-			}
-		}
-	}
-	return ift, nil
-}
-
-const (
-	// See linux/if_arp.h.
-	// Note that Linux doesn't support IPv4 over IPv6 tunneling.
-	sysARPHardwareIPv4IPv4 = 768 // IPv4 over IPv4 tunneling
-	sysARPHardwareIPv6IPv6 = 769 // IPv6 over IPv6 tunneling
-	sysARPHardwareIPv6IPv4 = 776 // IPv6 over IPv4 tunneling
-	sysARPHardwareGREIPv4  = 778 // any over GRE over IPv4 tunneling
-	sysARPHardwareGREIPv6  = 823 // any over GRE over IPv6 tunneling
-)
-
-func newLink(ifim *syscall.IfInfomsg, attrs []syscall.NetlinkRouteAttr) *Interface {
-	ifi := &Interface{Index: int(ifim.Index), Flags: linkFlags(ifim.Flags)}
-	for _, a := range attrs {
-		switch a.Attr.Type {
-		case syscall.IFLA_ADDRESS:
-			// We never return any /32 or /128 IP address
-			// prefix on any IP tunnel interface as the
-			// hardware address.
-			switch len(a.Value) {
-			case IPv4len:
-				switch ifim.Type {
-				case sysARPHardwareIPv4IPv4, sysARPHardwareGREIPv4, sysARPHardwareIPv6IPv4:
-					continue
-				}
-			case IPv6len:
-				switch ifim.Type {
-				case sysARPHardwareIPv6IPv6, sysARPHardwareGREIPv6:
-					continue
-				}
-			}
-			var nonzero bool
-			for _, b := range a.Value {
-				if b != 0 {
-					nonzero = true
-					break
-				}
-			}
-			if nonzero {
-				ifi.HardwareAddr = a.Value[:]
-			}
-		case syscall.IFLA_IFNAME:
-			ifi.Name = string(a.Value[:len(a.Value)-1])
-		case syscall.IFLA_MTU:
-			ifi.MTU = int(*(*uint32)(unsafe.Pointer(&a.Value[:4][0])))
-		}
-	}
-	return ifi
-}
-
-func linkFlags(rawFlags uint32) Flags {
-	var f Flags
-	if rawFlags&syscall.IFF_UP != 0 {
-		f |= FlagUp
-	}
-	if rawFlags&syscall.IFF_BROADCAST != 0 {
-		f |= FlagBroadcast
-	}
-	if rawFlags&syscall.IFF_LOOPBACK != 0 {
-		f |= FlagLoopback
-	}
-	if rawFlags&syscall.IFF_POINTOPOINT != 0 {
-		f |= FlagPointToPoint
-	}
-	if rawFlags&syscall.IFF_MULTICAST != 0 {
-		f |= FlagMulticast
-	}
-	return f
-}
-
-// If the ifi is nil, interfaceAddrTable returns addresses for all
-// network interfaces.  Otherwise it returns addresses for a specific
-// interface.
-func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
-	tab, err := syscall.NetlinkRIB(syscall.RTM_GETADDR, syscall.AF_UNSPEC)
-	if err != nil {
-		return nil, os.NewSyscallError("netlinkrib", err)
-	}
-	msgs, err := syscall.ParseNetlinkMessage(tab)
-	if err != nil {
-		return nil, os.NewSyscallError("parsenetlinkmessage", err)
-	}
-	var ift []Interface
-	if ifi == nil {
-		var err error
-		ift, err = interfaceTable(0)
-		if err != nil {
-			return nil, err
-		}
-	}
-	ifat, err := addrTable(ift, ifi, msgs)
-	if err != nil {
-		return nil, err
-	}
-	return ifat, nil
-}
-
-func addrTable(ift []Interface, ifi *Interface, msgs []syscall.NetlinkMessage) ([]Addr, error) {
-	var ifat []Addr
-loop:
-	for _, m := range msgs {
-		switch m.Header.Type {
-		case syscall.NLMSG_DONE:
-			break loop
-		case syscall.RTM_NEWADDR:
-			ifam := (*syscall.IfAddrmsg)(unsafe.Pointer(&m.Data[0]))
-			if len(ift) != 0 || ifi.Index == int(ifam.Index) {
-				if len(ift) != 0 {
-					var err error
-					ifi, err = interfaceByIndex(ift, int(ifam.Index))
-					if err != nil {
-						return nil, err
-					}
-				}
-				attrs, err := syscall.ParseNetlinkRouteAttr(&m)
-				if err != nil {
-					return nil, os.NewSyscallError("parsenetlinkrouteattr", err)
-				}
-				ifa := newAddr(ifi, ifam, attrs)
-				if ifa != nil {
-					ifat = append(ifat, ifa)
-				}
-			}
-		}
-	}
-	return ifat, nil
-}
-
-func newAddr(ifi *Interface, ifam *syscall.IfAddrmsg, attrs []syscall.NetlinkRouteAttr) Addr {
-	var ipPointToPoint bool
-	// Seems like we need to make sure whether the IP interface
-	// stack consists of IP point-to-point numbered or unnumbered
-	// addressing.
-	for _, a := range attrs {
-		if a.Attr.Type == syscall.IFA_LOCAL {
-			ipPointToPoint = true
-			break
-		}
-	}
-	for _, a := range attrs {
-		if ipPointToPoint && a.Attr.Type == syscall.IFA_ADDRESS {
-			continue
-		}
-		switch ifam.Family {
-		case syscall.AF_INET:
-			return &IPNet{IP: IPv4(a.Value[0], a.Value[1], a.Value[2], a.Value[3]), Mask: CIDRMask(int(ifam.Prefixlen), 8*IPv4len)}
-		case syscall.AF_INET6:
-			ifa := &IPNet{IP: make(IP, IPv6len), Mask: CIDRMask(int(ifam.Prefixlen), 8*IPv6len)}
-			copy(ifa.IP, a.Value[:])
-			return ifa
-		}
-	}
-	return nil
-}
-
-// interfaceMulticastAddrTable returns addresses for a specific
-// interface.
-func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
-	ifmat4 := parseProcNetIGMP("/proc/net/igmp", ifi)
-	ifmat6 := parseProcNetIGMP6("/proc/net/igmp6", ifi)
-	return append(ifmat4, ifmat6...), nil
-}
-
-func parseProcNetIGMP(path string, ifi *Interface) []Addr {
-	fd, err := open(path)
-	if err != nil {
-		return nil
-	}
-	defer fd.close()
-	var (
-		ifmat []Addr
-		name  string
-	)
-	fd.readLine() // skip first line
-	b := make([]byte, IPv4len)
-	for l, ok := fd.readLine(); ok; l, ok = fd.readLine() {
-		f := splitAtBytes(l, " :\r\t\n")
-		if len(f) < 4 {
-			continue
-		}
-		switch {
-		case l[0] != ' ' && l[0] != '\t': // new interface line
-			name = f[1]
-		case len(f[0]) == 8:
-			if ifi == nil || name == ifi.Name {
-				// The Linux kernel puts the IP
-				// address in /proc/net/igmp in native
-				// endianness.
-				for i := 0; i+1 < len(f[0]); i += 2 {
-					b[i/2], _ = xtoi2(f[0][i:i+2], 0)
-				}
-				i := *(*uint32)(unsafe.Pointer(&b[:4][0]))
-				ifma := &IPAddr{IP: IPv4(byte(i>>24), byte(i>>16), byte(i>>8), byte(i))}
-				ifmat = append(ifmat, ifma)
-			}
-		}
-	}
-	return ifmat
-}
-
-func parseProcNetIGMP6(path string, ifi *Interface) []Addr {
-	fd, err := open(path)
-	if err != nil {
-		return nil
-	}
-	defer fd.close()
-	var ifmat []Addr
-	b := make([]byte, IPv6len)
-	for l, ok := fd.readLine(); ok; l, ok = fd.readLine() {
-		f := splitAtBytes(l, " \r\t\n")
-		if len(f) < 6 {
-			continue
-		}
-		if ifi == nil || f[1] == ifi.Name {
-			for i := 0; i+1 < len(f[2]); i += 2 {
-				b[i/2], _ = xtoi2(f[2][i:i+2], 0)
-			}
-			ifma := &IPAddr{IP: IP{b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15]}}
-			ifmat = append(ifmat, ifma)
-		}
-	}
-	return ifmat
-}
diff --git a/third_party/gofrontend/libgo/go/net/interface_netbsd.go b/third_party/gofrontend/libgo/go/net/interface_netbsd.go
deleted file mode 100644
index c9ce5a7..0000000
--- a/third_party/gofrontend/libgo/go/net/interface_netbsd.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-// interfaceMulticastAddrTable returns addresses for a specific
-// interface.
-func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
-	// TODO(mikio): Implement this like other platforms.
-	return nil, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/interface_openbsd.go b/third_party/gofrontend/libgo/go/net/interface_openbsd.go
deleted file mode 100644
index c9ce5a7..0000000
--- a/third_party/gofrontend/libgo/go/net/interface_openbsd.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-// interfaceMulticastAddrTable returns addresses for a specific
-// interface.
-func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
-	// TODO(mikio): Implement this like other platforms.
-	return nil, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/interface_stub.go b/third_party/gofrontend/libgo/go/net/interface_stub.go
deleted file mode 100644
index c38fb7f..0000000
--- a/third_party/gofrontend/libgo/go/net/interface_stub.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build nacl plan9 solaris
-
-package net
-
-// If the ifindex is zero, interfaceTable returns mappings of all
-// network interfaces.  Otherwise it returns a mapping of a specific
-// interface.
-func interfaceTable(ifindex int) ([]Interface, error) {
-	return nil, nil
-}
-
-// If the ifi is nil, interfaceAddrTable returns addresses for all
-// network interfaces.  Otherwise it returns addresses for a specific
-// interface.
-func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
-	return nil, nil
-}
-
-// interfaceMulticastAddrTable returns addresses for a specific
-// interface.
-func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
-	return nil, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/interface_test.go b/third_party/gofrontend/libgo/go/net/interface_test.go
deleted file mode 100644
index 567d18d..0000000
--- a/third_party/gofrontend/libgo/go/net/interface_test.go
+++ /dev/null
@@ -1,305 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"reflect"
-	"runtime"
-	"testing"
-)
-
-// loopbackInterface returns an available logical network interface
-// for loopback tests.  It returns nil if no suitable interface is
-// found.
-func loopbackInterface() *Interface {
-	ift, err := Interfaces()
-	if err != nil {
-		return nil
-	}
-	for _, ifi := range ift {
-		if ifi.Flags&FlagLoopback != 0 && ifi.Flags&FlagUp != 0 {
-			return &ifi
-		}
-	}
-	return nil
-}
-
-// ipv6LinkLocalUnicastAddr returns an IPv6 link-local unicast address
-// on the given network interface for tests. It returns "" if no
-// suitable address is found.
-func ipv6LinkLocalUnicastAddr(ifi *Interface) string {
-	if ifi == nil {
-		return ""
-	}
-	ifat, err := ifi.Addrs()
-	if err != nil {
-		return ""
-	}
-	for _, ifa := range ifat {
-		if ifa, ok := ifa.(*IPNet); ok {
-			if ifa.IP.To4() == nil && ifa.IP.IsLinkLocalUnicast() {
-				return ifa.IP.String()
-			}
-		}
-	}
-	return ""
-}
-
-type routeStats struct {
-	loop  int // # of active loopback interfaces
-	other int // # of active other interfaces
-
-	uni4, uni6     int // # of active connected unicast, anycast routes
-	multi4, multi6 int // # of active connected multicast route clones
-}
-
-func TestInterfaces(t *testing.T) {
-	ift, err := Interfaces()
-	if err != nil {
-		t.Fatal(err)
-	}
-	var stats routeStats
-	for _, ifi := range ift {
-		ifxi, err := InterfaceByIndex(ifi.Index)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if !reflect.DeepEqual(ifxi, &ifi) {
-			t.Errorf("got %v; want %v", ifxi, ifi)
-		}
-		ifxn, err := InterfaceByName(ifi.Name)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if !reflect.DeepEqual(ifxn, &ifi) {
-			t.Errorf("got %v; want %v", ifxn, ifi)
-		}
-		t.Logf("%q: flags %q, ifindex %v, mtu %v", ifi.Name, ifi.Flags.String(), ifi.Index, ifi.MTU)
-		t.Logf("hardware address %q", ifi.HardwareAddr.String())
-		if ifi.Flags&FlagUp != 0 {
-			if ifi.Flags&FlagLoopback != 0 {
-				stats.loop++
-			} else {
-				stats.other++
-			}
-		}
-		n4, n6 := testInterfaceAddrs(t, &ifi)
-		stats.uni4 += n4
-		stats.uni6 += n6
-		n4, n6 = testInterfaceMulticastAddrs(t, &ifi)
-		stats.multi4 += n4
-		stats.multi6 += n6
-	}
-	switch runtime.GOOS {
-	case "nacl", "plan9", "solaris":
-	default:
-		// Test the existence of connected unicast routes for
-		// IPv4.
-		if supportsIPv4 && stats.loop+stats.other > 0 && stats.uni4 == 0 {
-			t.Errorf("num IPv4 unicast routes = 0; want >0; summary: %+v", stats)
-		}
-		// Test the existence of connected unicast routes for
-		// IPv6. We can assume the existence of ::1/128 when
-		// at least one looopback interface is installed.
-		if supportsIPv6 && stats.loop > 0 && stats.uni6 == 0 {
-			t.Errorf("num IPv6 unicast routes = 0; want >0; summary: %+v", stats)
-		}
-	}
-	switch runtime.GOOS {
-	case "dragonfly", "nacl", "netbsd", "openbsd", "plan9", "solaris":
-	default:
-		// Test the existence of connected multicast route
-		// clones for IPv4. Unlike IPv6, IPv4 multicast
-		// capability is not a mandatory feature, and so this
-		// test is disabled.
-		//if supportsIPv4 && stats.loop > 0 && stats.uni4 > 1 && stats.multi4 == 0 {
-		//	t.Errorf("num IPv4 multicast route clones = 0; want >0; summary: %+v", stats)
-		//}
-		// Test the existence of connected multicast route
-		// clones for IPv6. Some platform never uses loopback
-		// interface as the nexthop for multicast routing.
-		// We can assume the existence of connected multicast
-		// route clones when at least two connected unicast
-		// routes, ::1/128 and other, are installed.
-		if supportsIPv6 && stats.loop > 0 && stats.uni6 > 1 && stats.multi6 == 0 {
-			t.Errorf("num IPv6 multicast route clones = 0; want >0; summary: %+v", stats)
-		}
-	}
-}
-
-func TestInterfaceAddrs(t *testing.T) {
-	ift, err := Interfaces()
-	if err != nil {
-		t.Fatal(err)
-	}
-	var stats routeStats
-	for _, ifi := range ift {
-		if ifi.Flags&FlagUp != 0 {
-			if ifi.Flags&FlagLoopback != 0 {
-				stats.loop++
-			} else {
-				stats.other++
-			}
-		}
-	}
-	ifat, err := InterfaceAddrs()
-	if err != nil {
-		t.Fatal(err)
-	}
-	stats.uni4, stats.uni6 = testAddrs(t, ifat)
-	// Test the existence of connected unicast routes for IPv4.
-	if supportsIPv4 && stats.loop+stats.other > 0 && stats.uni4 == 0 {
-		t.Errorf("num IPv4 unicast routes = 0; want >0; summary: %+v", stats)
-	}
-	// Test the existence of connected unicast routes for IPv6.
-	// We can assume the existence of ::1/128 when at least one
-	// looopback interface is installed.
-	if supportsIPv6 && stats.loop > 0 && stats.uni6 == 0 {
-		t.Errorf("num IPv6 unicast routes = 0; want >0; summary: %+v", stats)
-	}
-}
-
-func testInterfaceAddrs(t *testing.T, ifi *Interface) (naf4, naf6 int) {
-	ifat, err := ifi.Addrs()
-	if err != nil {
-		t.Fatal(err)
-	}
-	return testAddrs(t, ifat)
-}
-
-func testInterfaceMulticastAddrs(t *testing.T, ifi *Interface) (nmaf4, nmaf6 int) {
-	ifmat, err := ifi.MulticastAddrs()
-	if err != nil {
-		t.Fatal(err)
-	}
-	return testMulticastAddrs(t, ifmat)
-}
-
-func testAddrs(t *testing.T, ifat []Addr) (naf4, naf6 int) {
-	for _, ifa := range ifat {
-		switch ifa := ifa.(type) {
-		case *IPNet:
-			if ifa == nil || ifa.IP == nil || ifa.IP.IsUnspecified() || ifa.IP.IsMulticast() || ifa.Mask == nil {
-				t.Errorf("unexpected value: %#v", ifa)
-				continue
-			}
-			prefixLen, maxPrefixLen := ifa.Mask.Size()
-			if ifa.IP.To4() != nil {
-				if 0 >= prefixLen || prefixLen > 8*IPv4len || maxPrefixLen != 8*IPv4len {
-					t.Errorf("unexpected prefix length: %v/%v", prefixLen, maxPrefixLen)
-					continue
-				}
-				naf4++
-			} else if ifa.IP.To16() != nil {
-				if 0 >= prefixLen || prefixLen > 8*IPv6len || maxPrefixLen != 8*IPv6len {
-					t.Errorf("unexpected prefix length: %v/%v", prefixLen, maxPrefixLen)
-					continue
-				}
-				naf6++
-			}
-			t.Logf("interface address %q", ifa.String())
-		default:
-			t.Errorf("unexpected type: %T", ifa)
-		}
-	}
-	return
-}
-
-func testMulticastAddrs(t *testing.T, ifmat []Addr) (nmaf4, nmaf6 int) {
-	for _, ifma := range ifmat {
-		switch ifma := ifma.(type) {
-		case *IPAddr:
-			if ifma == nil || ifma.IP == nil || ifma.IP.IsUnspecified() || !ifma.IP.IsMulticast() {
-				t.Errorf("unexpected value: %#v", ifma)
-				continue
-			}
-			if ifma.IP.To4() != nil {
-				nmaf4++
-			} else if ifma.IP.To16() != nil {
-				nmaf6++
-			}
-			t.Logf("joined group address %q", ifma.String())
-		default:
-			t.Errorf("unexpected type: %T", ifma)
-		}
-	}
-	return
-}
-
-func BenchmarkInterfaces(b *testing.B) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	for i := 0; i < b.N; i++ {
-		if _, err := Interfaces(); err != nil {
-			b.Fatal(err)
-		}
-	}
-}
-
-func BenchmarkInterfaceByIndex(b *testing.B) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	ifi := loopbackInterface()
-	if ifi == nil {
-		b.Skip("loopback interface not found")
-	}
-	for i := 0; i < b.N; i++ {
-		if _, err := InterfaceByIndex(ifi.Index); err != nil {
-			b.Fatal(err)
-		}
-	}
-}
-
-func BenchmarkInterfaceByName(b *testing.B) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	ifi := loopbackInterface()
-	if ifi == nil {
-		b.Skip("loopback interface not found")
-	}
-	for i := 0; i < b.N; i++ {
-		if _, err := InterfaceByName(ifi.Name); err != nil {
-			b.Fatal(err)
-		}
-	}
-}
-
-func BenchmarkInterfaceAddrs(b *testing.B) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	for i := 0; i < b.N; i++ {
-		if _, err := InterfaceAddrs(); err != nil {
-			b.Fatal(err)
-		}
-	}
-}
-
-func BenchmarkInterfacesAndAddrs(b *testing.B) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	ifi := loopbackInterface()
-	if ifi == nil {
-		b.Skip("loopback interface not found")
-	}
-	for i := 0; i < b.N; i++ {
-		if _, err := ifi.Addrs(); err != nil {
-			b.Fatal(err)
-		}
-	}
-}
-
-func BenchmarkInterfacesAndMulticastAddrs(b *testing.B) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	ifi := loopbackInterface()
-	if ifi == nil {
-		b.Skip("loopback interface not found")
-	}
-	for i := 0; i < b.N; i++ {
-		if _, err := ifi.MulticastAddrs(); err != nil {
-			b.Fatal(err)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/interface_windows.go b/third_party/gofrontend/libgo/go/net/interface_windows.go
deleted file mode 100644
index e25c1ed..0000000
--- a/third_party/gofrontend/libgo/go/net/interface_windows.go
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"internal/syscall/windows"
-	"os"
-	"syscall"
-	"unsafe"
-)
-
-func getAdapters() (*windows.IpAdapterAddresses, error) {
-	block := uint32(unsafe.Sizeof(windows.IpAdapterAddresses{}))
-
-	// pre-allocate a 15KB working buffer pointed to by the AdapterAddresses
-	// parameter.
-	// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365915(v=vs.85).aspx
-	size := uint32(15000)
-
-	var addrs []windows.IpAdapterAddresses
-	for {
-		addrs = make([]windows.IpAdapterAddresses, size/block+1)
-		err := windows.GetAdaptersAddresses(syscall.AF_UNSPEC, windows.GAA_FLAG_INCLUDE_PREFIX, 0, &addrs[0], &size)
-		if err == nil {
-			break
-		}
-		if err.(syscall.Errno) != syscall.ERROR_BUFFER_OVERFLOW {
-			return nil, os.NewSyscallError("getadaptersaddresses", err)
-		}
-	}
-	return &addrs[0], nil
-}
-
-func getInterfaceInfos() ([]syscall.InterfaceInfo, error) {
-	s, err := sysSocket(syscall.AF_INET, syscall.SOCK_DGRAM, syscall.IPPROTO_UDP)
-	if err != nil {
-		return nil, err
-	}
-	defer closeFunc(s)
-
-	iia := [20]syscall.InterfaceInfo{}
-	ret := uint32(0)
-	size := uint32(unsafe.Sizeof(iia))
-	err = syscall.WSAIoctl(s, syscall.SIO_GET_INTERFACE_LIST, nil, 0, (*byte)(unsafe.Pointer(&iia[0])), size, &ret, nil, 0)
-	if err != nil {
-		return nil, os.NewSyscallError("wsaioctl", err)
-	}
-	iilen := ret / uint32(unsafe.Sizeof(iia[0]))
-	return iia[:iilen-1], nil
-}
-
-func bytesEqualIP(a []byte, b []int8) bool {
-	for i := 0; i < len(a); i++ {
-		if a[i] != byte(b[i]) {
-			return false
-		}
-	}
-	return true
-}
-
-func findInterfaceInfo(iis []syscall.InterfaceInfo, paddr *windows.IpAdapterAddresses) *syscall.InterfaceInfo {
-	for _, ii := range iis {
-		iaddr := (*syscall.RawSockaddr)(unsafe.Pointer(&ii.Address))
-		puni := paddr.FirstUnicastAddress
-		for ; puni != nil; puni = puni.Next {
-			if iaddr.Family == puni.Address.Sockaddr.Addr.Family {
-				switch iaddr.Family {
-				case syscall.AF_INET:
-					a := (*syscall.RawSockaddrInet4)(unsafe.Pointer(&ii.Address)).Addr
-					if bytesEqualIP(a[:], puni.Address.Sockaddr.Addr.Data[2:]) {
-						return &ii
-					}
-				case syscall.AF_INET6:
-					a := (*syscall.RawSockaddrInet6)(unsafe.Pointer(&ii.Address)).Addr
-					if bytesEqualIP(a[:], puni.Address.Sockaddr.Addr.Data[2:]) {
-						return &ii
-					}
-				default:
-					continue
-				}
-			}
-		}
-	}
-	return nil
-}
-
-// If the ifindex is zero, interfaceTable returns mappings of all
-// network interfaces.  Otherwise it returns a mapping of a specific
-// interface.
-func interfaceTable(ifindex int) ([]Interface, error) {
-	paddr, err := getAdapters()
-	if err != nil {
-		return nil, err
-	}
-
-	iis, err := getInterfaceInfos()
-	if err != nil {
-		return nil, err
-	}
-
-	var ift []Interface
-	for ; paddr != nil; paddr = paddr.Next {
-		index := paddr.IfIndex
-		if paddr.Ipv6IfIndex != 0 {
-			index = paddr.Ipv6IfIndex
-		}
-		if ifindex == 0 || ifindex == int(index) {
-			ii := findInterfaceInfo(iis, paddr)
-			if ii == nil {
-				continue
-			}
-			var flags Flags
-			if paddr.Flags&windows.IfOperStatusUp != 0 {
-				flags |= FlagUp
-			}
-			if paddr.IfType&windows.IF_TYPE_SOFTWARE_LOOPBACK != 0 {
-				flags |= FlagLoopback
-			}
-			if ii.Flags&syscall.IFF_BROADCAST != 0 {
-				flags |= FlagBroadcast
-			}
-			if ii.Flags&syscall.IFF_POINTTOPOINT != 0 {
-				flags |= FlagPointToPoint
-			}
-			if ii.Flags&syscall.IFF_MULTICAST != 0 {
-				flags |= FlagMulticast
-			}
-			ifi := Interface{
-				Index:        int(index),
-				MTU:          int(paddr.Mtu),
-				Name:         syscall.UTF16ToString((*(*[10000]uint16)(unsafe.Pointer(paddr.FriendlyName)))[:]),
-				HardwareAddr: HardwareAddr(paddr.PhysicalAddress[:]),
-				Flags:        flags,
-			}
-			ift = append(ift, ifi)
-			if ifindex == int(ifi.Index) {
-				break
-			}
-		}
-	}
-	return ift, nil
-}
-
-// If the ifi is nil, interfaceAddrTable returns addresses for all
-// network interfaces.  Otherwise it returns addresses for a specific
-// interface.
-func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
-	paddr, err := getAdapters()
-	if err != nil {
-		return nil, err
-	}
-
-	var ifat []Addr
-	for ; paddr != nil; paddr = paddr.Next {
-		index := paddr.IfIndex
-		if paddr.Ipv6IfIndex != 0 {
-			index = paddr.Ipv6IfIndex
-		}
-		if ifi == nil || ifi.Index == int(index) {
-			puni := paddr.FirstUnicastAddress
-			for ; puni != nil; puni = puni.Next {
-				if sa, err := puni.Address.Sockaddr.Sockaddr(); err == nil {
-					switch sav := sa.(type) {
-					case *syscall.SockaddrInet4:
-						ifa := &IPNet{IP: make(IP, IPv4len), Mask: CIDRMask(int(puni.Address.SockaddrLength), 8*IPv4len)}
-						copy(ifa.IP, sav.Addr[:])
-						ifat = append(ifat, ifa)
-					case *syscall.SockaddrInet6:
-						ifa := &IPNet{IP: make(IP, IPv6len), Mask: CIDRMask(int(puni.Address.SockaddrLength), 8*IPv6len)}
-						copy(ifa.IP, sav.Addr[:])
-						ifat = append(ifat, ifa)
-					}
-				}
-			}
-			pany := paddr.FirstAnycastAddress
-			for ; pany != nil; pany = pany.Next {
-				if sa, err := pany.Address.Sockaddr.Sockaddr(); err == nil {
-					switch sav := sa.(type) {
-					case *syscall.SockaddrInet4:
-						ifa := &IPNet{IP: make(IP, IPv4len), Mask: CIDRMask(int(pany.Address.SockaddrLength), 8*IPv4len)}
-						copy(ifa.IP, sav.Addr[:])
-						ifat = append(ifat, ifa)
-					case *syscall.SockaddrInet6:
-						ifa := &IPNet{IP: make(IP, IPv6len), Mask: CIDRMask(int(pany.Address.SockaddrLength), 8*IPv6len)}
-						copy(ifa.IP, sav.Addr[:])
-						ifat = append(ifat, ifa)
-					}
-				}
-			}
-		}
-	}
-
-	return ifat, nil
-}
-
-// interfaceMulticastAddrTable returns addresses for a specific
-// interface.
-func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
-	paddr, err := getAdapters()
-	if err != nil {
-		return nil, err
-	}
-
-	var ifat []Addr
-	for ; paddr != nil; paddr = paddr.Next {
-		index := paddr.IfIndex
-		if paddr.Ipv6IfIndex != 0 {
-			index = paddr.Ipv6IfIndex
-		}
-		if ifi == nil || ifi.Index == int(index) {
-			pmul := paddr.FirstMulticastAddress
-			for ; pmul != nil; pmul = pmul.Next {
-				if sa, err := pmul.Address.Sockaddr.Sockaddr(); err == nil {
-					switch sav := sa.(type) {
-					case *syscall.SockaddrInet4:
-						ifa := &IPAddr{IP: make(IP, IPv4len)}
-						copy(ifa.IP, sav.Addr[:])
-						ifat = append(ifat, ifa)
-					case *syscall.SockaddrInet6:
-						ifa := &IPAddr{IP: make(IP, IPv6len)}
-						copy(ifa.IP, sav.Addr[:])
-						ifat = append(ifat, ifa)
-					}
-				}
-			}
-		}
-	}
-
-	return ifat, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/internal/socktest/main_test.go b/third_party/gofrontend/libgo/go/net/internal/socktest/main_test.go
deleted file mode 100644
index 60e581f..0000000
--- a/third_party/gofrontend/libgo/go/net/internal/socktest/main_test.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package socktest_test
-
-import (
-	"net/internal/socktest"
-	"os"
-	"sync"
-	"syscall"
-	"testing"
-)
-
-var sw socktest.Switch
-
-func TestMain(m *testing.M) {
-	installTestHooks()
-
-	st := m.Run()
-
-	for s := range sw.Sockets() {
-		closeFunc(s)
-	}
-	uninstallTestHooks()
-	os.Exit(st)
-}
-
-func TestSwitch(t *testing.T) {
-	const N = 10
-	var wg sync.WaitGroup
-	wg.Add(N)
-	for i := 0; i < N; i++ {
-		go func() {
-			defer wg.Done()
-			for _, family := range []int{syscall.AF_INET, syscall.AF_INET6} {
-				socketFunc(family, syscall.SOCK_STREAM, syscall.IPPROTO_TCP)
-			}
-		}()
-	}
-	wg.Wait()
-}
-
-func TestSocket(t *testing.T) {
-	for _, f := range []socktest.Filter{
-		func(st *socktest.Status) (socktest.AfterFilter, error) { return nil, nil },
-		nil,
-	} {
-		sw.Set(socktest.FilterSocket, f)
-		for _, family := range []int{syscall.AF_INET, syscall.AF_INET6} {
-			socketFunc(family, syscall.SOCK_STREAM, syscall.IPPROTO_TCP)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/internal/socktest/main_unix_test.go b/third_party/gofrontend/libgo/go/net/internal/socktest/main_unix_test.go
deleted file mode 100644
index b8eebc2..0000000
--- a/third_party/gofrontend/libgo/go/net/internal/socktest/main_unix_test.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9,!windows
-
-package socktest_test
-
-import "syscall"
-
-var (
-	socketFunc func(int, int, int) (int, error)
-	closeFunc  func(int) error
-)
-
-func installTestHooks() {
-	socketFunc = sw.Socket
-	closeFunc = sw.Close
-}
-
-func uninstallTestHooks() {
-	socketFunc = syscall.Socket
-	closeFunc = syscall.Close
-}
diff --git a/third_party/gofrontend/libgo/go/net/internal/socktest/main_windows_test.go b/third_party/gofrontend/libgo/go/net/internal/socktest/main_windows_test.go
deleted file mode 100644
index df1cb97..0000000
--- a/third_party/gofrontend/libgo/go/net/internal/socktest/main_windows_test.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package socktest_test
-
-import "syscall"
-
-var (
-	socketFunc func(int, int, int) (syscall.Handle, error)
-	closeFunc  func(syscall.Handle) error
-)
-
-func installTestHooks() {
-	socketFunc = sw.Socket
-	closeFunc = sw.Closesocket
-}
-
-func uninstallTestHooks() {
-	socketFunc = syscall.Socket
-	closeFunc = syscall.Closesocket
-}
diff --git a/third_party/gofrontend/libgo/go/net/internal/socktest/switch.go b/third_party/gofrontend/libgo/go/net/internal/socktest/switch.go
deleted file mode 100644
index 4e38c7a..0000000
--- a/third_party/gofrontend/libgo/go/net/internal/socktest/switch.go
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package socktest provides utilities for socket testing.
-package socktest
-
-import (
-	"fmt"
-	"sync"
-)
-
-// A Switch represents a callpath point switch for socket system
-// calls.
-type Switch struct {
-	once sync.Once
-
-	fmu   sync.RWMutex
-	fltab map[FilterType]Filter
-
-	smu   sync.RWMutex
-	sotab Sockets
-	stats stats
-}
-
-func (sw *Switch) init() {
-	sw.fltab = make(map[FilterType]Filter)
-	sw.sotab = make(Sockets)
-	sw.stats = make(stats)
-}
-
-// Stats returns a list of per-cookie socket statistics.
-func (sw *Switch) Stats() []Stat {
-	var st []Stat
-	sw.smu.RLock()
-	for _, s := range sw.stats {
-		ns := *s
-		st = append(st, ns)
-	}
-	sw.smu.RUnlock()
-	return st
-}
-
-// Sockets returns mappings of socket descriptor to socket status.
-func (sw *Switch) Sockets() Sockets {
-	sw.smu.RLock()
-	tab := make(Sockets, len(sw.sotab))
-	for i, s := range sw.sotab {
-		tab[i] = s
-	}
-	sw.smu.RUnlock()
-	return tab
-}
-
-// A Cookie represents a 3-tuple of a socket; address family, socket
-// type and protocol number.
-type Cookie uint64
-
-// Family returns an address family.
-func (c Cookie) Family() int { return int(c >> 48) }
-
-// Type returns a socket type.
-func (c Cookie) Type() int { return int(c << 16 >> 32) }
-
-// Protocol returns a protocol number.
-func (c Cookie) Protocol() int { return int(c & 0xff) }
-
-func cookie(family, sotype, proto int) Cookie {
-	return Cookie(family)<<48 | Cookie(sotype)&0xffffffff<<16 | Cookie(proto)&0xff
-}
-
-// A Status represents the status of a socket.
-type Status struct {
-	Cookie    Cookie
-	Err       error // error status of socket system call
-	SocketErr error // error status of socket by SO_ERROR
-}
-
-func (so Status) String() string {
-	return fmt.Sprintf("(%s, %s, %s): syscallerr=%v, socketerr=%v", familyString(so.Cookie.Family()), typeString(so.Cookie.Type()), protocolString(so.Cookie.Protocol()), so.Err, so.SocketErr)
-}
-
-// A Stat represents a per-cookie socket statistics.
-type Stat struct {
-	Family   int // address family
-	Type     int // socket type
-	Protocol int // protocol number
-
-	Opened    uint64 // number of sockets opened
-	Connected uint64 // number of sockets connected
-	Listened  uint64 // number of sockets listened
-	Accepted  uint64 // number of sockets accepted
-	Closed    uint64 // number of sockets closed
-
-	OpenFailed    uint64 // number of sockets open failed
-	ConnectFailed uint64 // number of sockets connect failed
-	ListenFailed  uint64 // number of sockets listen failed
-	AcceptFailed  uint64 // number of sockets accept failed
-	CloseFailed   uint64 // number of sockets close failed
-}
-
-func (st Stat) String() string {
-	return fmt.Sprintf("(%s, %s, %s): opened=%d, connected=%d, listened=%d, accepted=%d, closed=%d, openfailed=%d, connectfailed=%d, listenfailed=%d, acceptfailed=%d, closefailed=%d", familyString(st.Family), typeString(st.Type), protocolString(st.Protocol), st.Opened, st.Connected, st.Listened, st.Accepted, st.Closed, st.OpenFailed, st.ConnectFailed, st.ListenFailed, st.AcceptFailed, st.CloseFailed)
-}
-
-type stats map[Cookie]*Stat
-
-func (st stats) getLocked(c Cookie) *Stat {
-	s, ok := st[c]
-	if !ok {
-		s = &Stat{Family: c.Family(), Type: c.Type(), Protocol: c.Protocol()}
-		st[c] = s
-	}
-	return s
-}
-
-// A FilterType represents a filter type.
-type FilterType int
-
-const (
-	FilterSocket        FilterType = iota // for Socket
-	FilterConnect                         // for Connect or ConnectEx
-	FilterListen                          // for Listen
-	FilterAccept                          // for Accept or Accept4
-	FilterGetsockoptInt                   // for GetsockoptInt
-	FilterClose                           // for Close or Closesocket
-)
-
-// A Filter represents a socket system call filter.
-//
-// It will only be executed before a system call for a socket that has
-// an entry in internal table.
-// If the filter returns a non-nil error, the execution of system call
-// will be canceled and the system call function returns the non-nil
-// error.
-// It can return a non-nil AfterFilter for filtering after the
-// execution of the system call.
-type Filter func(*Status) (AfterFilter, error)
-
-func (f Filter) apply(st *Status) (AfterFilter, error) {
-	if f == nil {
-		return nil, nil
-	}
-	return f(st)
-}
-
-// An AfterFilter represents a socket system call filter after an
-// execution of a system call.
-//
-// It will only be executed after a system call for a socket that has
-// an entry in internal table.
-// If the filter returns a non-nil error, the system call function
-// returns the non-nil error.
-type AfterFilter func(*Status) error
-
-func (f AfterFilter) apply(st *Status) error {
-	if f == nil {
-		return nil
-	}
-	return f(st)
-}
-
-// Set deploys the socket system call filter f for the filter type t.
-func (sw *Switch) Set(t FilterType, f Filter) {
-	sw.once.Do(sw.init)
-	sw.fmu.Lock()
-	sw.fltab[t] = f
-	sw.fmu.Unlock()
-}
diff --git a/third_party/gofrontend/libgo/go/net/internal/socktest/switch_posix.go b/third_party/gofrontend/libgo/go/net/internal/socktest/switch_posix.go
deleted file mode 100644
index 863edef..0000000
--- a/third_party/gofrontend/libgo/go/net/internal/socktest/switch_posix.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package socktest
-
-import (
-	"fmt"
-	"syscall"
-)
-
-func familyString(family int) string {
-	switch family {
-	case syscall.AF_INET:
-		return "inet4"
-	case syscall.AF_INET6:
-		return "inet6"
-	case syscall.AF_UNIX:
-		return "local"
-	default:
-		return fmt.Sprintf("%d", family)
-	}
-}
-
-func typeString(sotype int) string {
-	var s string
-	switch sotype & 0xff {
-	case syscall.SOCK_STREAM:
-		s = "stream"
-	case syscall.SOCK_DGRAM:
-		s = "datagram"
-	case syscall.SOCK_RAW:
-		s = "raw"
-	case syscall.SOCK_SEQPACKET:
-		s = "seqpacket"
-	default:
-		s = fmt.Sprintf("%d", sotype&0xff)
-	}
-	if flags := uint(sotype) & ^uint(0xff); flags != 0 {
-		s += fmt.Sprintf("|%#x", flags)
-	}
-	return s
-}
-
-func protocolString(proto int) string {
-	switch proto {
-	case 0:
-		return "default"
-	case syscall.IPPROTO_TCP:
-		return "tcp"
-	case syscall.IPPROTO_UDP:
-		return "udp"
-	default:
-		return fmt.Sprintf("%d", proto)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/internal/socktest/switch_stub.go b/third_party/gofrontend/libgo/go/net/internal/socktest/switch_stub.go
deleted file mode 100644
index 28ce72c..0000000
--- a/third_party/gofrontend/libgo/go/net/internal/socktest/switch_stub.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build plan9
-
-package socktest
-
-// Sockets maps a socket descriptor to the status of socket.
-type Sockets map[int]Status
-
-func familyString(family int) string { return "<nil>" }
-
-func typeString(sotype int) string { return "<nil>" }
-
-func protocolString(proto int) string { return "<nil>" }
diff --git a/third_party/gofrontend/libgo/go/net/internal/socktest/switch_unix.go b/third_party/gofrontend/libgo/go/net/internal/socktest/switch_unix.go
deleted file mode 100644
index 14c0c22..0000000
--- a/third_party/gofrontend/libgo/go/net/internal/socktest/switch_unix.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package socktest
-
-// Sockets maps a socket descriptor to the status of socket.
-type Sockets map[int]Status
-
-func (sw *Switch) sockso(s int) *Status {
-	sw.smu.RLock()
-	defer sw.smu.RUnlock()
-	so, ok := sw.sotab[s]
-	if !ok {
-		return nil
-	}
-	return &so
-}
-
-// addLocked returns a new Status without locking.
-// sw.smu must be held before call.
-func (sw *Switch) addLocked(s, family, sotype, proto int) *Status {
-	sw.once.Do(sw.init)
-	so := Status{Cookie: cookie(family, sotype, proto)}
-	sw.sotab[s] = so
-	return &so
-}
diff --git a/third_party/gofrontend/libgo/go/net/internal/socktest/switch_windows.go b/third_party/gofrontend/libgo/go/net/internal/socktest/switch_windows.go
deleted file mode 100644
index 4f1d597..0000000
--- a/third_party/gofrontend/libgo/go/net/internal/socktest/switch_windows.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package socktest
-
-import "syscall"
-
-// Sockets maps a socket descriptor to the status of socket.
-type Sockets map[syscall.Handle]Status
-
-func (sw *Switch) sockso(s syscall.Handle) *Status {
-	sw.smu.RLock()
-	defer sw.smu.RUnlock()
-	so, ok := sw.sotab[s]
-	if !ok {
-		return nil
-	}
-	return &so
-}
-
-// addLocked returns a new Status without locking.
-// sw.smu must be held before call.
-func (sw *Switch) addLocked(s syscall.Handle, family, sotype, proto int) *Status {
-	sw.once.Do(sw.init)
-	so := Status{Cookie: cookie(family, sotype, proto)}
-	sw.sotab[s] = so
-	return &so
-}
diff --git a/third_party/gofrontend/libgo/go/net/internal/socktest/sys_cloexec.go b/third_party/gofrontend/libgo/go/net/internal/socktest/sys_cloexec.go
deleted file mode 100644
index 340ff07..0000000
--- a/third_party/gofrontend/libgo/go/net/internal/socktest/sys_cloexec.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build freebsd linux
-
-package socktest
-
-import "syscall"
-
-// Accept4 wraps syscall.Accept4.
-func (sw *Switch) Accept4(s, flags int) (ns int, sa syscall.Sockaddr, err error) {
-	so := sw.sockso(s)
-	if so == nil {
-		return syscall.Accept4(s, flags)
-	}
-	sw.fmu.RLock()
-	f, _ := sw.fltab[FilterAccept]
-	sw.fmu.RUnlock()
-
-	af, err := f.apply(so)
-	if err != nil {
-		return -1, nil, err
-	}
-	ns, sa, so.Err = syscall.Accept4(s, flags)
-	if err = af.apply(so); err != nil {
-		if so.Err == nil {
-			syscall.Close(ns)
-		}
-		return -1, nil, err
-	}
-
-	sw.smu.Lock()
-	defer sw.smu.Unlock()
-	if so.Err != nil {
-		sw.stats.getLocked(so.Cookie).AcceptFailed++
-		return -1, nil, so.Err
-	}
-	nso := sw.addLocked(ns, so.Cookie.Family(), so.Cookie.Type(), so.Cookie.Protocol())
-	sw.stats.getLocked(nso.Cookie).Accepted++
-	return ns, sa, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/internal/socktest/sys_unix.go b/third_party/gofrontend/libgo/go/net/internal/socktest/sys_unix.go
deleted file mode 100644
index f983e26..0000000
--- a/third_party/gofrontend/libgo/go/net/internal/socktest/sys_unix.go
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package socktest
-
-import "syscall"
-
-// Socket wraps syscall.Socket.
-func (sw *Switch) Socket(family, sotype, proto int) (s int, err error) {
-	sw.once.Do(sw.init)
-
-	so := &Status{Cookie: cookie(family, sotype, proto)}
-	sw.fmu.RLock()
-	f, _ := sw.fltab[FilterSocket]
-	sw.fmu.RUnlock()
-
-	af, err := f.apply(so)
-	if err != nil {
-		return -1, err
-	}
-	s, so.Err = syscall.Socket(family, sotype, proto)
-	if err = af.apply(so); err != nil {
-		if so.Err == nil {
-			syscall.Close(s)
-		}
-		return -1, err
-	}
-
-	sw.smu.Lock()
-	defer sw.smu.Unlock()
-	if so.Err != nil {
-		sw.stats.getLocked(so.Cookie).OpenFailed++
-		return -1, so.Err
-	}
-	nso := sw.addLocked(s, family, sotype, proto)
-	sw.stats.getLocked(nso.Cookie).Opened++
-	return s, nil
-}
-
-// Close wraps syscall.Close.
-func (sw *Switch) Close(s int) (err error) {
-	so := sw.sockso(s)
-	if so == nil {
-		return syscall.Close(s)
-	}
-	sw.fmu.RLock()
-	f, _ := sw.fltab[FilterClose]
-	sw.fmu.RUnlock()
-
-	af, err := f.apply(so)
-	if err != nil {
-		return err
-	}
-	so.Err = syscall.Close(s)
-	if err = af.apply(so); err != nil {
-		return err
-	}
-
-	sw.smu.Lock()
-	defer sw.smu.Unlock()
-	if so.Err != nil {
-		sw.stats.getLocked(so.Cookie).CloseFailed++
-		return so.Err
-	}
-	delete(sw.sotab, s)
-	sw.stats.getLocked(so.Cookie).Closed++
-	return nil
-}
-
-// Connect wraps syscall.Connect.
-func (sw *Switch) Connect(s int, sa syscall.Sockaddr) (err error) {
-	so := sw.sockso(s)
-	if so == nil {
-		return syscall.Connect(s, sa)
-	}
-	sw.fmu.RLock()
-	f, _ := sw.fltab[FilterConnect]
-	sw.fmu.RUnlock()
-
-	af, err := f.apply(so)
-	if err != nil {
-		return err
-	}
-	so.Err = syscall.Connect(s, sa)
-	if err = af.apply(so); err != nil {
-		return err
-	}
-
-	sw.smu.Lock()
-	defer sw.smu.Unlock()
-	if so.Err != nil {
-		sw.stats.getLocked(so.Cookie).ConnectFailed++
-		return so.Err
-	}
-	sw.stats.getLocked(so.Cookie).Connected++
-	return nil
-}
-
-// Listen wraps syscall.Listen.
-func (sw *Switch) Listen(s, backlog int) (err error) {
-	so := sw.sockso(s)
-	if so == nil {
-		return syscall.Listen(s, backlog)
-	}
-	sw.fmu.RLock()
-	f, _ := sw.fltab[FilterListen]
-	sw.fmu.RUnlock()
-
-	af, err := f.apply(so)
-	if err != nil {
-		return err
-	}
-	so.Err = syscall.Listen(s, backlog)
-	if err = af.apply(so); err != nil {
-		return err
-	}
-
-	sw.smu.Lock()
-	defer sw.smu.Unlock()
-	if so.Err != nil {
-		sw.stats.getLocked(so.Cookie).ListenFailed++
-		return so.Err
-	}
-	sw.stats.getLocked(so.Cookie).Listened++
-	return nil
-}
-
-// Accept wraps syscall.Accept.
-func (sw *Switch) Accept(s int) (ns int, sa syscall.Sockaddr, err error) {
-	so := sw.sockso(s)
-	if so == nil {
-		return syscall.Accept(s)
-	}
-	sw.fmu.RLock()
-	f, _ := sw.fltab[FilterAccept]
-	sw.fmu.RUnlock()
-
-	af, err := f.apply(so)
-	if err != nil {
-		return -1, nil, err
-	}
-	ns, sa, so.Err = syscall.Accept(s)
-	if err = af.apply(so); err != nil {
-		if so.Err == nil {
-			syscall.Close(ns)
-		}
-		return -1, nil, err
-	}
-
-	sw.smu.Lock()
-	defer sw.smu.Unlock()
-	if so.Err != nil {
-		sw.stats.getLocked(so.Cookie).AcceptFailed++
-		return -1, nil, so.Err
-	}
-	nso := sw.addLocked(ns, so.Cookie.Family(), so.Cookie.Type(), so.Cookie.Protocol())
-	sw.stats.getLocked(nso.Cookie).Accepted++
-	return ns, sa, nil
-}
-
-// GetsockoptInt wraps syscall.GetsockoptInt.
-func (sw *Switch) GetsockoptInt(s, level, opt int) (soerr int, err error) {
-	so := sw.sockso(s)
-	if so == nil {
-		return syscall.GetsockoptInt(s, level, opt)
-	}
-	sw.fmu.RLock()
-	f, _ := sw.fltab[FilterGetsockoptInt]
-	sw.fmu.RUnlock()
-
-	af, err := f.apply(so)
-	if err != nil {
-		return -1, err
-	}
-	soerr, so.Err = syscall.GetsockoptInt(s, level, opt)
-	so.SocketErr = syscall.Errno(soerr)
-	if err = af.apply(so); err != nil {
-		return -1, err
-	}
-
-	if so.Err != nil {
-		return -1, so.Err
-	}
-	if opt == syscall.SO_ERROR && (so.SocketErr == syscall.Errno(0) || so.SocketErr == syscall.EISCONN) {
-		sw.smu.Lock()
-		sw.stats.getLocked(so.Cookie).Connected++
-		sw.smu.Unlock()
-	}
-	return soerr, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/internal/socktest/sys_windows.go b/third_party/gofrontend/libgo/go/net/internal/socktest/sys_windows.go
deleted file mode 100644
index e61bf2b..0000000
--- a/third_party/gofrontend/libgo/go/net/internal/socktest/sys_windows.go
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package socktest
-
-import "syscall"
-
-// Socket wraps syscall.Socket.
-func (sw *Switch) Socket(family, sotype, proto int) (s syscall.Handle, err error) {
-	sw.once.Do(sw.init)
-
-	so := &Status{Cookie: cookie(family, sotype, proto)}
-	sw.fmu.RLock()
-	f, _ := sw.fltab[FilterSocket]
-	sw.fmu.RUnlock()
-
-	af, err := f.apply(so)
-	if err != nil {
-		return syscall.InvalidHandle, err
-	}
-	s, so.Err = syscall.Socket(family, sotype, proto)
-	if err = af.apply(so); err != nil {
-		if so.Err == nil {
-			syscall.Closesocket(s)
-		}
-		return syscall.InvalidHandle, err
-	}
-
-	sw.smu.Lock()
-	defer sw.smu.Unlock()
-	if so.Err != nil {
-		sw.stats.getLocked(so.Cookie).OpenFailed++
-		return syscall.InvalidHandle, so.Err
-	}
-	nso := sw.addLocked(s, family, sotype, proto)
-	sw.stats.getLocked(nso.Cookie).Opened++
-	return s, nil
-}
-
-// Closesocket wraps syscall.Closesocket.
-func (sw *Switch) Closesocket(s syscall.Handle) (err error) {
-	so := sw.sockso(s)
-	if so == nil {
-		return syscall.Closesocket(s)
-	}
-	sw.fmu.RLock()
-	f, _ := sw.fltab[FilterClose]
-	sw.fmu.RUnlock()
-
-	af, err := f.apply(so)
-	if err != nil {
-		return err
-	}
-	so.Err = syscall.Closesocket(s)
-	if err = af.apply(so); err != nil {
-		return err
-	}
-
-	sw.smu.Lock()
-	defer sw.smu.Unlock()
-	if so.Err != nil {
-		sw.stats.getLocked(so.Cookie).CloseFailed++
-		return so.Err
-	}
-	delete(sw.sotab, s)
-	sw.stats.getLocked(so.Cookie).Closed++
-	return nil
-}
-
-// Connect wraps syscall.Connect.
-func (sw *Switch) Connect(s syscall.Handle, sa syscall.Sockaddr) (err error) {
-	so := sw.sockso(s)
-	if so == nil {
-		return syscall.Connect(s, sa)
-	}
-	sw.fmu.RLock()
-	f, _ := sw.fltab[FilterConnect]
-	sw.fmu.RUnlock()
-
-	af, err := f.apply(so)
-	if err != nil {
-		return err
-	}
-	so.Err = syscall.Connect(s, sa)
-	if err = af.apply(so); err != nil {
-		return err
-	}
-
-	sw.smu.Lock()
-	defer sw.smu.Unlock()
-	if so.Err != nil {
-		sw.stats.getLocked(so.Cookie).ConnectFailed++
-		return so.Err
-	}
-	sw.stats.getLocked(so.Cookie).Connected++
-	return nil
-}
-
-// ConnectEx wraps syscall.ConnectEx.
-func (sw *Switch) ConnectEx(s syscall.Handle, sa syscall.Sockaddr, b *byte, n uint32, nwr *uint32, o *syscall.Overlapped) (err error) {
-	so := sw.sockso(s)
-	if so == nil {
-		return syscall.ConnectEx(s, sa, b, n, nwr, o)
-	}
-	sw.fmu.RLock()
-	f, _ := sw.fltab[FilterConnect]
-	sw.fmu.RUnlock()
-
-	af, err := f.apply(so)
-	if err != nil {
-		return err
-	}
-	so.Err = syscall.ConnectEx(s, sa, b, n, nwr, o)
-	if err = af.apply(so); err != nil {
-		return err
-	}
-
-	sw.smu.Lock()
-	defer sw.smu.Unlock()
-	if so.Err != nil {
-		sw.stats.getLocked(so.Cookie).ConnectFailed++
-		return so.Err
-	}
-	sw.stats.getLocked(so.Cookie).Connected++
-	return nil
-}
-
-// Listen wraps syscall.Listen.
-func (sw *Switch) Listen(s syscall.Handle, backlog int) (err error) {
-	so := sw.sockso(s)
-	if so == nil {
-		return syscall.Listen(s, backlog)
-	}
-	sw.fmu.RLock()
-	f, _ := sw.fltab[FilterListen]
-	sw.fmu.RUnlock()
-
-	af, err := f.apply(so)
-	if err != nil {
-		return err
-	}
-	so.Err = syscall.Listen(s, backlog)
-	if err = af.apply(so); err != nil {
-		return err
-	}
-
-	sw.smu.Lock()
-	defer sw.smu.Unlock()
-	if so.Err != nil {
-		sw.stats.getLocked(so.Cookie).ListenFailed++
-		return so.Err
-	}
-	sw.stats.getLocked(so.Cookie).Listened++
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/ip.go b/third_party/gofrontend/libgo/go/net/ip.go
deleted file mode 100644
index cc004d6..0000000
--- a/third_party/gofrontend/libgo/go/net/ip.go
+++ /dev/null
@@ -1,676 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// IP address manipulations
-//
-// IPv4 addresses are 4 bytes; IPv6 addresses are 16 bytes.
-// An IPv4 address can be converted to an IPv6 address by
-// adding a canonical prefix (10 zeros, 2 0xFFs).
-// This library accepts either size of byte slice but always
-// returns 16-byte addresses.
-
-package net
-
-// IP address lengths (bytes).
-const (
-	IPv4len = 4
-	IPv6len = 16
-)
-
-// An IP is a single IP address, a slice of bytes.
-// Functions in this package accept either 4-byte (IPv4)
-// or 16-byte (IPv6) slices as input.
-//
-// Note that in this documentation, referring to an
-// IP address as an IPv4 address or an IPv6 address
-// is a semantic property of the address, not just the
-// length of the byte slice: a 16-byte slice can still
-// be an IPv4 address.
-type IP []byte
-
-// An IP mask is an IP address.
-type IPMask []byte
-
-// An IPNet represents an IP network.
-type IPNet struct {
-	IP   IP     // network number
-	Mask IPMask // network mask
-}
-
-// IPv4 returns the IP address (in 16-byte form) of the
-// IPv4 address a.b.c.d.
-func IPv4(a, b, c, d byte) IP {
-	p := make(IP, IPv6len)
-	copy(p, v4InV6Prefix)
-	p[12] = a
-	p[13] = b
-	p[14] = c
-	p[15] = d
-	return p
-}
-
-var v4InV6Prefix = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff}
-
-// IPv4Mask returns the IP mask (in 4-byte form) of the
-// IPv4 mask a.b.c.d.
-func IPv4Mask(a, b, c, d byte) IPMask {
-	p := make(IPMask, IPv4len)
-	p[0] = a
-	p[1] = b
-	p[2] = c
-	p[3] = d
-	return p
-}
-
-// CIDRMask returns an IPMask consisting of `ones' 1 bits
-// followed by 0s up to a total length of `bits' bits.
-// For a mask of this form, CIDRMask is the inverse of IPMask.Size.
-func CIDRMask(ones, bits int) IPMask {
-	if bits != 8*IPv4len && bits != 8*IPv6len {
-		return nil
-	}
-	if ones < 0 || ones > bits {
-		return nil
-	}
-	l := bits / 8
-	m := make(IPMask, l)
-	n := uint(ones)
-	for i := 0; i < l; i++ {
-		if n >= 8 {
-			m[i] = 0xff
-			n -= 8
-			continue
-		}
-		m[i] = ^byte(0xff >> n)
-		n = 0
-	}
-	return m
-}
-
-// Well-known IPv4 addresses
-var (
-	IPv4bcast     = IPv4(255, 255, 255, 255) // broadcast
-	IPv4allsys    = IPv4(224, 0, 0, 1)       // all systems
-	IPv4allrouter = IPv4(224, 0, 0, 2)       // all routers
-	IPv4zero      = IPv4(0, 0, 0, 0)         // all zeros
-)
-
-// Well-known IPv6 addresses
-var (
-	IPv6zero                   = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
-	IPv6unspecified            = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
-	IPv6loopback               = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}
-	IPv6interfacelocalallnodes = IP{0xff, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01}
-	IPv6linklocalallnodes      = IP{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01}
-	IPv6linklocalallrouters    = IP{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02}
-)
-
-// IsUnspecified reports whether ip is an unspecified address.
-func (ip IP) IsUnspecified() bool {
-	return ip.Equal(IPv4zero) || ip.Equal(IPv6unspecified)
-}
-
-// IsLoopback reports whether ip is a loopback address.
-func (ip IP) IsLoopback() bool {
-	if ip4 := ip.To4(); ip4 != nil {
-		return ip4[0] == 127
-	}
-	return ip.Equal(IPv6loopback)
-}
-
-// IsMulticast reports whether ip is a multicast address.
-func (ip IP) IsMulticast() bool {
-	if ip4 := ip.To4(); ip4 != nil {
-		return ip4[0]&0xf0 == 0xe0
-	}
-	return len(ip) == IPv6len && ip[0] == 0xff
-}
-
-// IsInterfaceLocalMulticast reports whether ip is
-// an interface-local multicast address.
-func (ip IP) IsInterfaceLocalMulticast() bool {
-	return len(ip) == IPv6len && ip[0] == 0xff && ip[1]&0x0f == 0x01
-}
-
-// IsLinkLocalMulticast reports whether ip is a link-local
-// multicast address.
-func (ip IP) IsLinkLocalMulticast() bool {
-	if ip4 := ip.To4(); ip4 != nil {
-		return ip4[0] == 224 && ip4[1] == 0 && ip4[2] == 0
-	}
-	return len(ip) == IPv6len && ip[0] == 0xff && ip[1]&0x0f == 0x02
-}
-
-// IsLinkLocalUnicast reports whether ip is a link-local
-// unicast address.
-func (ip IP) IsLinkLocalUnicast() bool {
-	if ip4 := ip.To4(); ip4 != nil {
-		return ip4[0] == 169 && ip4[1] == 254
-	}
-	return len(ip) == IPv6len && ip[0] == 0xfe && ip[1]&0xc0 == 0x80
-}
-
-// IsGlobalUnicast reports whether ip is a global unicast
-// address.
-func (ip IP) IsGlobalUnicast() bool {
-	return (len(ip) == IPv4len || len(ip) == IPv6len) &&
-		!ip.Equal(IPv4bcast) &&
-		!ip.IsUnspecified() &&
-		!ip.IsLoopback() &&
-		!ip.IsMulticast() &&
-		!ip.IsLinkLocalUnicast()
-}
-
-// Is p all zeros?
-func isZeros(p IP) bool {
-	for i := 0; i < len(p); i++ {
-		if p[i] != 0 {
-			return false
-		}
-	}
-	return true
-}
-
-// To4 converts the IPv4 address ip to a 4-byte representation.
-// If ip is not an IPv4 address, To4 returns nil.
-func (ip IP) To4() IP {
-	if len(ip) == IPv4len {
-		return ip
-	}
-	if len(ip) == IPv6len &&
-		isZeros(ip[0:10]) &&
-		ip[10] == 0xff &&
-		ip[11] == 0xff {
-		return ip[12:16]
-	}
-	return nil
-}
-
-// To16 converts the IP address ip to a 16-byte representation.
-// If ip is not an IP address (it is the wrong length), To16 returns nil.
-func (ip IP) To16() IP {
-	if len(ip) == IPv4len {
-		return IPv4(ip[0], ip[1], ip[2], ip[3])
-	}
-	if len(ip) == IPv6len {
-		return ip
-	}
-	return nil
-}
-
-// Default route masks for IPv4.
-var (
-	classAMask = IPv4Mask(0xff, 0, 0, 0)
-	classBMask = IPv4Mask(0xff, 0xff, 0, 0)
-	classCMask = IPv4Mask(0xff, 0xff, 0xff, 0)
-)
-
-// DefaultMask returns the default IP mask for the IP address ip.
-// Only IPv4 addresses have default masks; DefaultMask returns
-// nil if ip is not a valid IPv4 address.
-func (ip IP) DefaultMask() IPMask {
-	if ip = ip.To4(); ip == nil {
-		return nil
-	}
-	switch true {
-	case ip[0] < 0x80:
-		return classAMask
-	case ip[0] < 0xC0:
-		return classBMask
-	default:
-		return classCMask
-	}
-}
-
-func allFF(b []byte) bool {
-	for _, c := range b {
-		if c != 0xff {
-			return false
-		}
-	}
-	return true
-}
-
-// Mask returns the result of masking the IP address ip with mask.
-func (ip IP) Mask(mask IPMask) IP {
-	if len(mask) == IPv6len && len(ip) == IPv4len && allFF(mask[:12]) {
-		mask = mask[12:]
-	}
-	if len(mask) == IPv4len && len(ip) == IPv6len && bytesEqual(ip[:12], v4InV6Prefix) {
-		ip = ip[12:]
-	}
-	n := len(ip)
-	if n != len(mask) {
-		return nil
-	}
-	out := make(IP, n)
-	for i := 0; i < n; i++ {
-		out[i] = ip[i] & mask[i]
-	}
-	return out
-}
-
-// String returns the string form of the IP address ip.
-// If the address is an IPv4 address, the string representation
-// is dotted decimal ("74.125.19.99").  Otherwise the representation
-// is IPv6 ("2001:4860:0:2001::68").
-func (ip IP) String() string {
-	p := ip
-
-	if len(ip) == 0 {
-		return "<nil>"
-	}
-
-	// If IPv4, use dotted notation.
-	if p4 := p.To4(); len(p4) == IPv4len {
-		return uitoa(uint(p4[0])) + "." +
-			uitoa(uint(p4[1])) + "." +
-			uitoa(uint(p4[2])) + "." +
-			uitoa(uint(p4[3]))
-	}
-	if len(p) != IPv6len {
-		return "?"
-	}
-
-	// Find longest run of zeros.
-	e0 := -1
-	e1 := -1
-	for i := 0; i < IPv6len; i += 2 {
-		j := i
-		for j < IPv6len && p[j] == 0 && p[j+1] == 0 {
-			j += 2
-		}
-		if j > i && j-i > e1-e0 {
-			e0 = i
-			e1 = j
-			i = j
-		}
-	}
-	// The symbol "::" MUST NOT be used to shorten just one 16 bit 0 field.
-	if e1-e0 <= 2 {
-		e0 = -1
-		e1 = -1
-	}
-
-	const maxLen = len("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")
-	b := make([]byte, 0, maxLen)
-
-	// Print with possible :: in place of run of zeros
-	for i := 0; i < IPv6len; i += 2 {
-		if i == e0 {
-			b = append(b, ':', ':')
-			i = e1
-			if i >= IPv6len {
-				break
-			}
-		} else if i > 0 {
-			b = append(b, ':')
-		}
-		b = appendHex(b, (uint32(p[i])<<8)|uint32(p[i+1]))
-	}
-	return string(b)
-}
-
-// ipEmptyString is like ip.String except that it returns
-// an empty string when ip is unset.
-func ipEmptyString(ip IP) string {
-	if len(ip) == 0 {
-		return ""
-	}
-	return ip.String()
-}
-
-// MarshalText implements the encoding.TextMarshaler interface.
-// The encoding is the same as returned by String.
-func (ip IP) MarshalText() ([]byte, error) {
-	if len(ip) == 0 {
-		return []byte(""), nil
-	}
-	if len(ip) != IPv4len && len(ip) != IPv6len {
-		return nil, &AddrError{Err: "invalid IP address", Addr: ip.String()}
-	}
-	return []byte(ip.String()), nil
-}
-
-// UnmarshalText implements the encoding.TextUnmarshaler interface.
-// The IP address is expected in a form accepted by ParseIP.
-func (ip *IP) UnmarshalText(text []byte) error {
-	if len(text) == 0 {
-		*ip = nil
-		return nil
-	}
-	s := string(text)
-	x := ParseIP(s)
-	if x == nil {
-		return &ParseError{Type: "IP address", Text: s}
-	}
-	*ip = x
-	return nil
-}
-
-// Equal reports whether ip and x are the same IP address.
-// An IPv4 address and that same address in IPv6 form are
-// considered to be equal.
-func (ip IP) Equal(x IP) bool {
-	if len(ip) == len(x) {
-		return bytesEqual(ip, x)
-	}
-	if len(ip) == IPv4len && len(x) == IPv6len {
-		return bytesEqual(x[0:12], v4InV6Prefix) && bytesEqual(ip, x[12:])
-	}
-	if len(ip) == IPv6len && len(x) == IPv4len {
-		return bytesEqual(ip[0:12], v4InV6Prefix) && bytesEqual(ip[12:], x)
-	}
-	return false
-}
-
-func bytesEqual(x, y []byte) bool {
-	if len(x) != len(y) {
-		return false
-	}
-	for i, b := range x {
-		if y[i] != b {
-			return false
-		}
-	}
-	return true
-}
-
-// If mask is a sequence of 1 bits followed by 0 bits,
-// return the number of 1 bits.
-func simpleMaskLength(mask IPMask) int {
-	var n int
-	for i, v := range mask {
-		if v == 0xff {
-			n += 8
-			continue
-		}
-		// found non-ff byte
-		// count 1 bits
-		for v&0x80 != 0 {
-			n++
-			v <<= 1
-		}
-		// rest must be 0 bits
-		if v != 0 {
-			return -1
-		}
-		for i++; i < len(mask); i++ {
-			if mask[i] != 0 {
-				return -1
-			}
-		}
-		break
-	}
-	return n
-}
-
-// Size returns the number of leading ones and total bits in the mask.
-// If the mask is not in the canonical form--ones followed by zeros--then
-// Size returns 0, 0.
-func (m IPMask) Size() (ones, bits int) {
-	ones, bits = simpleMaskLength(m), len(m)*8
-	if ones == -1 {
-		return 0, 0
-	}
-	return
-}
-
-// String returns the hexadecimal form of m, with no punctuation.
-func (m IPMask) String() string {
-	if len(m) == 0 {
-		return "<nil>"
-	}
-	buf := make([]byte, len(m)*2)
-	for i, b := range m {
-		buf[i*2], buf[i*2+1] = hexDigit[b>>4], hexDigit[b&0xf]
-	}
-	return string(buf)
-}
-
-func networkNumberAndMask(n *IPNet) (ip IP, m IPMask) {
-	if ip = n.IP.To4(); ip == nil {
-		ip = n.IP
-		if len(ip) != IPv6len {
-			return nil, nil
-		}
-	}
-	m = n.Mask
-	switch len(m) {
-	case IPv4len:
-		if len(ip) != IPv4len {
-			return nil, nil
-		}
-	case IPv6len:
-		if len(ip) == IPv4len {
-			m = m[12:]
-		}
-	default:
-		return nil, nil
-	}
-	return
-}
-
-// Contains reports whether the network includes ip.
-func (n *IPNet) Contains(ip IP) bool {
-	nn, m := networkNumberAndMask(n)
-	if x := ip.To4(); x != nil {
-		ip = x
-	}
-	l := len(ip)
-	if l != len(nn) {
-		return false
-	}
-	for i := 0; i < l; i++ {
-		if nn[i]&m[i] != ip[i]&m[i] {
-			return false
-		}
-	}
-	return true
-}
-
-// Network returns the address's network name, "ip+net".
-func (n *IPNet) Network() string { return "ip+net" }
-
-// String returns the CIDR notation of n like "192.168.100.1/24"
-// or "2001:DB8::/48" as defined in RFC 4632 and RFC 4291.
-// If the mask is not in the canonical form, it returns the
-// string which consists of an IP address, followed by a slash
-// character and a mask expressed as hexadecimal form with no
-// punctuation like "192.168.100.1/c000ff00".
-func (n *IPNet) String() string {
-	nn, m := networkNumberAndMask(n)
-	if nn == nil || m == nil {
-		return "<nil>"
-	}
-	l := simpleMaskLength(m)
-	if l == -1 {
-		return nn.String() + "/" + m.String()
-	}
-	return nn.String() + "/" + uitoa(uint(l))
-}
-
-// Parse IPv4 address (d.d.d.d).
-func parseIPv4(s string) IP {
-	var p [IPv4len]byte
-	i := 0
-	for j := 0; j < IPv4len; j++ {
-		if i >= len(s) {
-			// Missing octets.
-			return nil
-		}
-		if j > 0 {
-			if s[i] != '.' {
-				return nil
-			}
-			i++
-		}
-		var (
-			n  int
-			ok bool
-		)
-		n, i, ok = dtoi(s, i)
-		if !ok || n > 0xFF {
-			return nil
-		}
-		p[j] = byte(n)
-	}
-	if i != len(s) {
-		return nil
-	}
-	return IPv4(p[0], p[1], p[2], p[3])
-}
-
-// parseIPv6 parses s as a literal IPv6 address described in RFC 4291
-// and RFC 5952.  It can also parse a literal scoped IPv6 address with
-// zone identifier which is described in RFC 4007 when zoneAllowed is
-// true.
-func parseIPv6(s string, zoneAllowed bool) (ip IP, zone string) {
-	ip = make(IP, IPv6len)
-	ellipsis := -1 // position of ellipsis in p
-	i := 0         // index in string s
-
-	if zoneAllowed {
-		s, zone = splitHostZone(s)
-	}
-
-	// Might have leading ellipsis
-	if len(s) >= 2 && s[0] == ':' && s[1] == ':' {
-		ellipsis = 0
-		i = 2
-		// Might be only ellipsis
-		if i == len(s) {
-			return ip, zone
-		}
-	}
-
-	// Loop, parsing hex numbers followed by colon.
-	j := 0
-	for j < IPv6len {
-		// Hex number.
-		n, i1, ok := xtoi(s, i)
-		if !ok || n > 0xFFFF {
-			return nil, zone
-		}
-
-		// If followed by dot, might be in trailing IPv4.
-		if i1 < len(s) && s[i1] == '.' {
-			if ellipsis < 0 && j != IPv6len-IPv4len {
-				// Not the right place.
-				return nil, zone
-			}
-			if j+IPv4len > IPv6len {
-				// Not enough room.
-				return nil, zone
-			}
-			ip4 := parseIPv4(s[i:])
-			if ip4 == nil {
-				return nil, zone
-			}
-			ip[j] = ip4[12]
-			ip[j+1] = ip4[13]
-			ip[j+2] = ip4[14]
-			ip[j+3] = ip4[15]
-			i = len(s)
-			j += IPv4len
-			break
-		}
-
-		// Save this 16-bit chunk.
-		ip[j] = byte(n >> 8)
-		ip[j+1] = byte(n)
-		j += 2
-
-		// Stop at end of string.
-		i = i1
-		if i == len(s) {
-			break
-		}
-
-		// Otherwise must be followed by colon and more.
-		if s[i] != ':' || i+1 == len(s) {
-			return nil, zone
-		}
-		i++
-
-		// Look for ellipsis.
-		if s[i] == ':' {
-			if ellipsis >= 0 { // already have one
-				return nil, zone
-			}
-			ellipsis = j
-			if i++; i == len(s) { // can be at end
-				break
-			}
-		}
-	}
-
-	// Must have used entire string.
-	if i != len(s) {
-		return nil, zone
-	}
-
-	// If didn't parse enough, expand ellipsis.
-	if j < IPv6len {
-		if ellipsis < 0 {
-			return nil, zone
-		}
-		n := IPv6len - j
-		for k := j - 1; k >= ellipsis; k-- {
-			ip[k+n] = ip[k]
-		}
-		for k := ellipsis + n - 1; k >= ellipsis; k-- {
-			ip[k] = 0
-		}
-	} else if ellipsis >= 0 {
-		// Ellipsis must represent at least one 0 group.
-		return nil, zone
-	}
-	return ip, zone
-}
-
-// ParseIP parses s as an IP address, returning the result.
-// The string s can be in dotted decimal ("74.125.19.99")
-// or IPv6 ("2001:4860:0:2001::68") form.
-// If s is not a valid textual representation of an IP address,
-// ParseIP returns nil.
-func ParseIP(s string) IP {
-	for i := 0; i < len(s); i++ {
-		switch s[i] {
-		case '.':
-			return parseIPv4(s)
-		case ':':
-			ip, _ := parseIPv6(s, false)
-			return ip
-		}
-	}
-	return nil
-}
-
-// ParseCIDR parses s as a CIDR notation IP address and mask,
-// like "192.168.100.1/24" or "2001:DB8::/48", as defined in
-// RFC 4632 and RFC 4291.
-//
-// It returns the IP address and the network implied by the IP
-// and mask.  For example, ParseCIDR("192.168.100.1/16") returns
-// the IP address 192.168.100.1 and the network 192.168.0.0/16.
-func ParseCIDR(s string) (IP, *IPNet, error) {
-	i := byteIndex(s, '/')
-	if i < 0 {
-		return nil, nil, &ParseError{Type: "CIDR address", Text: s}
-	}
-	addr, mask := s[:i], s[i+1:]
-	iplen := IPv4len
-	ip := parseIPv4(addr)
-	if ip == nil {
-		iplen = IPv6len
-		ip, _ = parseIPv6(addr, false)
-	}
-	n, i, ok := dtoi(mask, 0)
-	if ip == nil || !ok || i != len(mask) || n < 0 || n > 8*iplen {
-		return nil, nil, &ParseError{Type: "CIDR address", Text: s}
-	}
-	m := CIDRMask(n, 8*iplen)
-	return ip, &IPNet{IP: ip.Mask(m), Mask: m}, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/ip_test.go b/third_party/gofrontend/libgo/go/net/ip_test.go
deleted file mode 100644
index 3d95a73..0000000
--- a/third_party/gofrontend/libgo/go/net/ip_test.go
+++ /dev/null
@@ -1,542 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"reflect"
-	"runtime"
-	"testing"
-)
-
-var parseIPTests = []struct {
-	in  string
-	out IP
-}{
-	{"127.0.1.2", IPv4(127, 0, 1, 2)},
-	{"127.0.0.1", IPv4(127, 0, 0, 1)},
-	{"127.001.002.003", IPv4(127, 1, 2, 3)},
-	{"::ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
-	{"::ffff:127.001.002.003", IPv4(127, 1, 2, 3)},
-	{"::ffff:7f01:0203", IPv4(127, 1, 2, 3)},
-	{"0:0:0:0:0000:ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
-	{"0:0:0:0:000000:ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
-	{"0:0:0:0::ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
-
-	{"2001:4860:0:2001::68", IP{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68}},
-	{"2001:4860:0000:2001:0000:0000:0000:0068", IP{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68}},
-
-	{"127.0.0.256", nil},
-	{"abc", nil},
-	{"123:", nil},
-	{"fe80::1%lo0", nil},
-	{"fe80::1%911", nil},
-	{"", nil},
-	{"a1:a2:a3:a4::b1:b2:b3:b4", nil}, // Issue 6628
-}
-
-func TestParseIP(t *testing.T) {
-	for _, tt := range parseIPTests {
-		if out := ParseIP(tt.in); !reflect.DeepEqual(out, tt.out) {
-			t.Errorf("ParseIP(%q) = %v, want %v", tt.in, out, tt.out)
-		}
-		if tt.in == "" {
-			// Tested in TestMarshalEmptyIP below.
-			continue
-		}
-		var out IP
-		if err := out.UnmarshalText([]byte(tt.in)); !reflect.DeepEqual(out, tt.out) || (tt.out == nil) != (err != nil) {
-			t.Errorf("IP.UnmarshalText(%q) = %v, %v, want %v", tt.in, out, err, tt.out)
-		}
-	}
-}
-
-func TestLookupWithIP(t *testing.T) {
-	_, err := LookupIP("")
-	if err == nil {
-		t.Errorf(`LookupIP("") succeeded, should fail`)
-	}
-	_, err = LookupHost("")
-	if err == nil {
-		t.Errorf(`LookupIP("") succeeded, should fail`)
-	}
-
-	// Test that LookupHost and LookupIP, which normally
-	// expect host names, work with IP addresses.
-	for _, tt := range parseIPTests {
-		if tt.out != nil {
-			addrs, err := LookupHost(tt.in)
-			if len(addrs) != 1 || addrs[0] != tt.in || err != nil {
-				t.Errorf("LookupHost(%q) = %v, %v, want %v, nil", tt.in, addrs, err, []string{tt.in})
-			}
-		} else if !testing.Short() {
-			// We can't control what the host resolver does; if it can resolve, say,
-			// 127.0.0.256 or fe80::1%911 or a host named 'abc', who are we to judge?
-			// Warn about these discrepancies but don't fail the test.
-			addrs, err := LookupHost(tt.in)
-			if err == nil {
-				t.Logf("warning: LookupHost(%q) = %v, want error", tt.in, addrs)
-			}
-		}
-
-		if tt.out != nil {
-			ips, err := LookupIP(tt.in)
-			if len(ips) != 1 || !reflect.DeepEqual(ips[0], tt.out) || err != nil {
-				t.Errorf("LookupIP(%q) = %v, %v, want %v, nil", tt.in, ips, err, []IP{tt.out})
-			}
-		} else if !testing.Short() {
-			ips, err := LookupIP(tt.in)
-			// We can't control what the host resolver does. See above.
-			if err == nil {
-				t.Logf("warning: LookupIP(%q) = %v, want error", tt.in, ips)
-			}
-		}
-	}
-}
-
-func BenchmarkParseIP(b *testing.B) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	for i := 0; i < b.N; i++ {
-		for _, tt := range parseIPTests {
-			ParseIP(tt.in)
-		}
-	}
-}
-
-// Issue 6339
-func TestMarshalEmptyIP(t *testing.T) {
-	for _, in := range [][]byte{nil, []byte("")} {
-		var out = IP{1, 2, 3, 4}
-		if err := out.UnmarshalText(in); err != nil || out != nil {
-			t.Errorf("UnmarshalText(%v) = %v, %v; want nil, nil", in, out, err)
-		}
-	}
-	var ip IP
-	got, err := ip.MarshalText()
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !reflect.DeepEqual(got, []byte("")) {
-		t.Errorf(`got %#v, want []byte("")`, got)
-	}
-}
-
-var ipStringTests = []struct {
-	in  IP
-	out string // see RFC 5952
-}{
-	{IP{0x20, 0x1, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0x1, 0x23, 0, 0x12, 0, 0x1}, "2001:db8::123:12:1"},
-	{IP{0x20, 0x1, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1}, "2001:db8::1"},
-	{IP{0x20, 0x1, 0xd, 0xb8, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x1}, "2001:db8:0:1:0:1:0:1"},
-	{IP{0x20, 0x1, 0xd, 0xb8, 0, 0x1, 0, 0, 0, 0x1, 0, 0, 0, 0x1, 0, 0}, "2001:db8:1:0:1:0:1:0"},
-	{IP{0x20, 0x1, 0, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0x1}, "2001::1:0:0:1"},
-	{IP{0x20, 0x1, 0xd, 0xb8, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0}, "2001:db8:0:0:1::"},
-	{IP{0x20, 0x1, 0xd, 0xb8, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0x1}, "2001:db8::1:0:0:1"},
-	{IP{0x20, 0x1, 0xD, 0xB8, 0, 0, 0, 0, 0, 0xA, 0, 0xB, 0, 0xC, 0, 0xD}, "2001:db8::a:b:c:d"},
-	{IPv4(192, 168, 0, 1), "192.168.0.1"},
-	{nil, ""},
-}
-
-func TestIPString(t *testing.T) {
-	for _, tt := range ipStringTests {
-		if tt.in != nil {
-			if out := tt.in.String(); out != tt.out {
-				t.Errorf("IP.String(%v) = %q, want %q", tt.in, out, tt.out)
-			}
-		}
-		if out, err := tt.in.MarshalText(); string(out) != tt.out || err != nil {
-			t.Errorf("IP.MarshalText(%v) = %q, %v, want %q, nil", tt.in, out, err, tt.out)
-		}
-	}
-}
-
-func BenchmarkIPString(b *testing.B) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	for i := 0; i < b.N; i++ {
-		for _, tt := range ipStringTests {
-			if tt.in != nil {
-				tt.in.String()
-			}
-		}
-	}
-}
-
-var ipMaskTests = []struct {
-	in   IP
-	mask IPMask
-	out  IP
-}{
-	{IPv4(192, 168, 1, 127), IPv4Mask(255, 255, 255, 128), IPv4(192, 168, 1, 0)},
-	{IPv4(192, 168, 1, 127), IPMask(ParseIP("255.255.255.192")), IPv4(192, 168, 1, 64)},
-	{IPv4(192, 168, 1, 127), IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffe0")), IPv4(192, 168, 1, 96)},
-	{IPv4(192, 168, 1, 127), IPv4Mask(255, 0, 255, 0), IPv4(192, 0, 1, 0)},
-	{ParseIP("2001:db8::1"), IPMask(ParseIP("ffff:ff80::")), ParseIP("2001:d80::")},
-	{ParseIP("2001:db8::1"), IPMask(ParseIP("f0f0:0f0f::")), ParseIP("2000:d08::")},
-}
-
-func TestIPMask(t *testing.T) {
-	for _, tt := range ipMaskTests {
-		if out := tt.in.Mask(tt.mask); out == nil || !tt.out.Equal(out) {
-			t.Errorf("IP(%v).Mask(%v) = %v, want %v", tt.in, tt.mask, out, tt.out)
-		}
-	}
-}
-
-var ipMaskStringTests = []struct {
-	in  IPMask
-	out string
-}{
-	{IPv4Mask(255, 255, 255, 240), "fffffff0"},
-	{IPv4Mask(255, 0, 128, 0), "ff008000"},
-	{IPMask(ParseIP("ffff:ff80::")), "ffffff80000000000000000000000000"},
-	{IPMask(ParseIP("ef00:ff80::cafe:0")), "ef00ff800000000000000000cafe0000"},
-	{nil, "<nil>"},
-}
-
-func TestIPMaskString(t *testing.T) {
-	for _, tt := range ipMaskStringTests {
-		if out := tt.in.String(); out != tt.out {
-			t.Errorf("IPMask.String(%v) = %q, want %q", tt.in, out, tt.out)
-		}
-	}
-}
-
-func BenchmarkIPMaskString(b *testing.B) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	for i := 0; i < b.N; i++ {
-		for _, tt := range ipMaskStringTests {
-			tt.in.String()
-		}
-	}
-}
-
-var parseCIDRTests = []struct {
-	in  string
-	ip  IP
-	net *IPNet
-	err error
-}{
-	{"135.104.0.0/32", IPv4(135, 104, 0, 0), &IPNet{IP: IPv4(135, 104, 0, 0), Mask: IPv4Mask(255, 255, 255, 255)}, nil},
-	{"0.0.0.0/24", IPv4(0, 0, 0, 0), &IPNet{IP: IPv4(0, 0, 0, 0), Mask: IPv4Mask(255, 255, 255, 0)}, nil},
-	{"135.104.0.0/24", IPv4(135, 104, 0, 0), &IPNet{IP: IPv4(135, 104, 0, 0), Mask: IPv4Mask(255, 255, 255, 0)}, nil},
-	{"135.104.0.1/32", IPv4(135, 104, 0, 1), &IPNet{IP: IPv4(135, 104, 0, 1), Mask: IPv4Mask(255, 255, 255, 255)}, nil},
-	{"135.104.0.1/24", IPv4(135, 104, 0, 1), &IPNet{IP: IPv4(135, 104, 0, 0), Mask: IPv4Mask(255, 255, 255, 0)}, nil},
-	{"::1/128", ParseIP("::1"), &IPNet{IP: ParseIP("::1"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))}, nil},
-	{"abcd:2345::/127", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe"))}, nil},
-	{"abcd:2345::/65", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:8000::"))}, nil},
-	{"abcd:2345::/64", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff::"))}, nil},
-	{"abcd:2345::/63", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:fffe::"))}, nil},
-	{"abcd:2345::/33", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:8000::"))}, nil},
-	{"abcd:2345::/32", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff::"))}, nil},
-	{"abcd:2344::/31", ParseIP("abcd:2344::"), &IPNet{IP: ParseIP("abcd:2344::"), Mask: IPMask(ParseIP("ffff:fffe::"))}, nil},
-	{"abcd:2300::/24", ParseIP("abcd:2300::"), &IPNet{IP: ParseIP("abcd:2300::"), Mask: IPMask(ParseIP("ffff:ff00::"))}, nil},
-	{"abcd:2345::/24", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2300::"), Mask: IPMask(ParseIP("ffff:ff00::"))}, nil},
-	{"2001:DB8::/48", ParseIP("2001:DB8::"), &IPNet{IP: ParseIP("2001:DB8::"), Mask: IPMask(ParseIP("ffff:ffff:ffff::"))}, nil},
-	{"2001:DB8::1/48", ParseIP("2001:DB8::1"), &IPNet{IP: ParseIP("2001:DB8::"), Mask: IPMask(ParseIP("ffff:ffff:ffff::"))}, nil},
-	{"192.168.1.1/255.255.255.0", nil, nil, &ParseError{Type: "CIDR address", Text: "192.168.1.1/255.255.255.0"}},
-	{"192.168.1.1/35", nil, nil, &ParseError{Type: "CIDR address", Text: "192.168.1.1/35"}},
-	{"2001:db8::1/-1", nil, nil, &ParseError{Type: "CIDR address", Text: "2001:db8::1/-1"}},
-	{"", nil, nil, &ParseError{Type: "CIDR address", Text: ""}},
-}
-
-func TestParseCIDR(t *testing.T) {
-	for _, tt := range parseCIDRTests {
-		ip, net, err := ParseCIDR(tt.in)
-		if !reflect.DeepEqual(err, tt.err) {
-			t.Errorf("ParseCIDR(%q) = %v, %v; want %v, %v", tt.in, ip, net, tt.ip, tt.net)
-		}
-		if err == nil && (!tt.ip.Equal(ip) || !tt.net.IP.Equal(net.IP) || !reflect.DeepEqual(net.Mask, tt.net.Mask)) {
-			t.Errorf("ParseCIDR(%q) = %v, {%v, %v}; want %v, {%v, %v}", tt.in, ip, net.IP, net.Mask, tt.ip, tt.net.IP, tt.net.Mask)
-		}
-	}
-}
-
-var ipNetContainsTests = []struct {
-	ip  IP
-	net *IPNet
-	ok  bool
-}{
-	{IPv4(172, 16, 1, 1), &IPNet{IP: IPv4(172, 16, 0, 0), Mask: CIDRMask(12, 32)}, true},
-	{IPv4(172, 24, 0, 1), &IPNet{IP: IPv4(172, 16, 0, 0), Mask: CIDRMask(13, 32)}, false},
-	{IPv4(192, 168, 0, 3), &IPNet{IP: IPv4(192, 168, 0, 0), Mask: IPv4Mask(0, 0, 255, 252)}, true},
-	{IPv4(192, 168, 0, 4), &IPNet{IP: IPv4(192, 168, 0, 0), Mask: IPv4Mask(0, 255, 0, 252)}, false},
-	{ParseIP("2001:db8:1:2::1"), &IPNet{IP: ParseIP("2001:db8:1::"), Mask: CIDRMask(47, 128)}, true},
-	{ParseIP("2001:db8:1:2::1"), &IPNet{IP: ParseIP("2001:db8:2::"), Mask: CIDRMask(47, 128)}, false},
-	{ParseIP("2001:db8:1:2::1"), &IPNet{IP: ParseIP("2001:db8:1::"), Mask: IPMask(ParseIP("ffff:0:ffff::"))}, true},
-	{ParseIP("2001:db8:1:2::1"), &IPNet{IP: ParseIP("2001:db8:1::"), Mask: IPMask(ParseIP("0:0:0:ffff::"))}, false},
-}
-
-func TestIPNetContains(t *testing.T) {
-	for _, tt := range ipNetContainsTests {
-		if ok := tt.net.Contains(tt.ip); ok != tt.ok {
-			t.Errorf("IPNet(%v).Contains(%v) = %v, want %v", tt.net, tt.ip, ok, tt.ok)
-		}
-	}
-}
-
-var ipNetStringTests = []struct {
-	in  *IPNet
-	out string
-}{
-	{&IPNet{IP: IPv4(192, 168, 1, 0), Mask: CIDRMask(26, 32)}, "192.168.1.0/26"},
-	{&IPNet{IP: IPv4(192, 168, 1, 0), Mask: IPv4Mask(255, 0, 255, 0)}, "192.168.1.0/ff00ff00"},
-	{&IPNet{IP: ParseIP("2001:db8::"), Mask: CIDRMask(55, 128)}, "2001:db8::/55"},
-	{&IPNet{IP: ParseIP("2001:db8::"), Mask: IPMask(ParseIP("8000:f123:0:cafe::"))}, "2001:db8::/8000f1230000cafe0000000000000000"},
-}
-
-func TestIPNetString(t *testing.T) {
-	for _, tt := range ipNetStringTests {
-		if out := tt.in.String(); out != tt.out {
-			t.Errorf("IPNet.String(%v) = %q, want %q", tt.in, out, tt.out)
-		}
-	}
-}
-
-var cidrMaskTests = []struct {
-	ones int
-	bits int
-	out  IPMask
-}{
-	{0, 32, IPv4Mask(0, 0, 0, 0)},
-	{12, 32, IPv4Mask(255, 240, 0, 0)},
-	{24, 32, IPv4Mask(255, 255, 255, 0)},
-	{32, 32, IPv4Mask(255, 255, 255, 255)},
-	{0, 128, IPMask{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
-	{4, 128, IPMask{0xf0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
-	{48, 128, IPMask{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
-	{128, 128, IPMask{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
-	{33, 32, nil},
-	{32, 33, nil},
-	{-1, 128, nil},
-	{128, -1, nil},
-}
-
-func TestCIDRMask(t *testing.T) {
-	for _, tt := range cidrMaskTests {
-		if out := CIDRMask(tt.ones, tt.bits); !reflect.DeepEqual(out, tt.out) {
-			t.Errorf("CIDRMask(%v, %v) = %v, want %v", tt.ones, tt.bits, out, tt.out)
-		}
-	}
-}
-
-var (
-	v4addr         = IP{192, 168, 0, 1}
-	v4mappedv6addr = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 192, 168, 0, 1}
-	v6addr         = IP{0x20, 0x1, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0x1, 0x23, 0, 0x12, 0, 0x1}
-	v4mask         = IPMask{255, 255, 255, 0}
-	v4mappedv6mask = IPMask{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 255, 255, 255, 0}
-	v6mask         = IPMask{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0}
-	badaddr        = IP{192, 168, 0}
-	badmask        = IPMask{255, 255, 0}
-	v4maskzero     = IPMask{0, 0, 0, 0}
-)
-
-var networkNumberAndMaskTests = []struct {
-	in  IPNet
-	out IPNet
-}{
-	{IPNet{IP: v4addr, Mask: v4mask}, IPNet{IP: v4addr, Mask: v4mask}},
-	{IPNet{IP: v4addr, Mask: v4mappedv6mask}, IPNet{IP: v4addr, Mask: v4mask}},
-	{IPNet{IP: v4mappedv6addr, Mask: v4mappedv6mask}, IPNet{IP: v4addr, Mask: v4mask}},
-	{IPNet{IP: v4mappedv6addr, Mask: v6mask}, IPNet{IP: v4addr, Mask: v4maskzero}},
-	{IPNet{IP: v4addr, Mask: v6mask}, IPNet{IP: v4addr, Mask: v4maskzero}},
-	{IPNet{IP: v6addr, Mask: v6mask}, IPNet{IP: v6addr, Mask: v6mask}},
-	{IPNet{IP: v6addr, Mask: v4mappedv6mask}, IPNet{IP: v6addr, Mask: v4mappedv6mask}},
-	{in: IPNet{IP: v6addr, Mask: v4mask}},
-	{in: IPNet{IP: v4addr, Mask: badmask}},
-	{in: IPNet{IP: v4mappedv6addr, Mask: badmask}},
-	{in: IPNet{IP: v6addr, Mask: badmask}},
-	{in: IPNet{IP: badaddr, Mask: v4mask}},
-	{in: IPNet{IP: badaddr, Mask: v4mappedv6mask}},
-	{in: IPNet{IP: badaddr, Mask: v6mask}},
-	{in: IPNet{IP: badaddr, Mask: badmask}},
-}
-
-func TestNetworkNumberAndMask(t *testing.T) {
-	for _, tt := range networkNumberAndMaskTests {
-		ip, m := networkNumberAndMask(&tt.in)
-		out := &IPNet{IP: ip, Mask: m}
-		if !reflect.DeepEqual(&tt.out, out) {
-			t.Errorf("networkNumberAndMask(%v) = %v, want %v", tt.in, out, &tt.out)
-		}
-	}
-}
-
-var splitJoinTests = []struct {
-	host string
-	port string
-	join string
-}{
-	{"www.google.com", "80", "www.google.com:80"},
-	{"127.0.0.1", "1234", "127.0.0.1:1234"},
-	{"::1", "80", "[::1]:80"},
-	{"fe80::1%lo0", "80", "[fe80::1%lo0]:80"},
-	{"localhost%lo0", "80", "[localhost%lo0]:80"},
-	{"", "0", ":0"},
-
-	{"google.com", "https%foo", "google.com:https%foo"}, // Go 1.0 behavior
-	{"127.0.0.1", "", "127.0.0.1:"},                     // Go 1.0 behaviour
-	{"www.google.com", "", "www.google.com:"},           // Go 1.0 behaviour
-}
-
-var splitFailureTests = []struct {
-	hostPort string
-	err      string
-}{
-	{"www.google.com", "missing port in address"},
-	{"127.0.0.1", "missing port in address"},
-	{"[::1]", "missing port in address"},
-	{"[fe80::1%lo0]", "missing port in address"},
-	{"[localhost%lo0]", "missing port in address"},
-	{"localhost%lo0", "missing port in address"},
-
-	{"::1", "too many colons in address"},
-	{"fe80::1%lo0", "too many colons in address"},
-	{"fe80::1%lo0:80", "too many colons in address"},
-
-	{"localhost%lo0:80", "missing brackets in address"},
-
-	// Test cases that didn't fail in Go 1.0
-
-	{"[foo:bar]", "missing port in address"},
-	{"[foo:bar]baz", "missing port in address"},
-	{"[foo]bar:baz", "missing port in address"},
-
-	{"[foo]:[bar]:baz", "too many colons in address"},
-
-	{"[foo]:[bar]baz", "unexpected '[' in address"},
-	{"foo[bar]:baz", "unexpected '[' in address"},
-
-	{"foo]bar:baz", "unexpected ']' in address"},
-}
-
-func TestSplitHostPort(t *testing.T) {
-	for _, tt := range splitJoinTests {
-		if host, port, err := SplitHostPort(tt.join); host != tt.host || port != tt.port || err != nil {
-			t.Errorf("SplitHostPort(%q) = %q, %q, %v; want %q, %q, nil", tt.join, host, port, err, tt.host, tt.port)
-		}
-	}
-	for _, tt := range splitFailureTests {
-		if _, _, err := SplitHostPort(tt.hostPort); err == nil {
-			t.Errorf("SplitHostPort(%q) should have failed", tt.hostPort)
-		} else {
-			e := err.(*AddrError)
-			if e.Err != tt.err {
-				t.Errorf("SplitHostPort(%q) = _, _, %q; want %q", tt.hostPort, e.Err, tt.err)
-			}
-		}
-	}
-}
-
-func TestJoinHostPort(t *testing.T) {
-	for _, tt := range splitJoinTests {
-		if join := JoinHostPort(tt.host, tt.port); join != tt.join {
-			t.Errorf("JoinHostPort(%q, %q) = %q; want %q", tt.host, tt.port, join, tt.join)
-		}
-	}
-}
-
-var ipAddrFamilyTests = []struct {
-	in  IP
-	af4 bool
-	af6 bool
-}{
-	{IPv4bcast, true, false},
-	{IPv4allsys, true, false},
-	{IPv4allrouter, true, false},
-	{IPv4zero, true, false},
-	{IPv4(224, 0, 0, 1), true, false},
-	{IPv4(127, 0, 0, 1), true, false},
-	{IPv4(240, 0, 0, 1), true, false},
-	{IPv6unspecified, false, true},
-	{IPv6loopback, false, true},
-	{IPv6interfacelocalallnodes, false, true},
-	{IPv6linklocalallnodes, false, true},
-	{IPv6linklocalallrouters, false, true},
-	{ParseIP("ff05::a:b:c:d"), false, true},
-	{ParseIP("fe80::1:2:3:4"), false, true},
-	{ParseIP("2001:db8::123:12:1"), false, true},
-}
-
-func TestIPAddrFamily(t *testing.T) {
-	for _, tt := range ipAddrFamilyTests {
-		if af := tt.in.To4() != nil; af != tt.af4 {
-			t.Errorf("verifying IPv4 address family for %q = %v, want %v", tt.in, af, tt.af4)
-		}
-		if af := len(tt.in) == IPv6len && tt.in.To4() == nil; af != tt.af6 {
-			t.Errorf("verifying IPv6 address family for %q = %v, want %v", tt.in, af, tt.af6)
-		}
-	}
-}
-
-var ipAddrScopeTests = []struct {
-	scope func(IP) bool
-	in    IP
-	ok    bool
-}{
-	{IP.IsUnspecified, IPv4zero, true},
-	{IP.IsUnspecified, IPv4(127, 0, 0, 1), false},
-	{IP.IsUnspecified, IPv6unspecified, true},
-	{IP.IsUnspecified, IPv6interfacelocalallnodes, false},
-	{IP.IsUnspecified, nil, false},
-	{IP.IsLoopback, IPv4(127, 0, 0, 1), true},
-	{IP.IsLoopback, IPv4(127, 255, 255, 254), true},
-	{IP.IsLoopback, IPv4(128, 1, 2, 3), false},
-	{IP.IsLoopback, IPv6loopback, true},
-	{IP.IsLoopback, IPv6linklocalallrouters, false},
-	{IP.IsLoopback, nil, false},
-	{IP.IsMulticast, IPv4(224, 0, 0, 0), true},
-	{IP.IsMulticast, IPv4(239, 0, 0, 0), true},
-	{IP.IsMulticast, IPv4(240, 0, 0, 0), false},
-	{IP.IsMulticast, IPv6linklocalallnodes, true},
-	{IP.IsMulticast, IP{0xff, 0x05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, true},
-	{IP.IsMulticast, IP{0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, false},
-	{IP.IsMulticast, nil, false},
-	{IP.IsInterfaceLocalMulticast, IPv4(224, 0, 0, 0), false},
-	{IP.IsInterfaceLocalMulticast, IPv4(0xff, 0x01, 0, 0), false},
-	{IP.IsInterfaceLocalMulticast, IPv6interfacelocalallnodes, true},
-	{IP.IsInterfaceLocalMulticast, nil, false},
-	{IP.IsLinkLocalMulticast, IPv4(224, 0, 0, 0), true},
-	{IP.IsLinkLocalMulticast, IPv4(239, 0, 0, 0), false},
-	{IP.IsLinkLocalMulticast, IPv4(0xff, 0x02, 0, 0), false},
-	{IP.IsLinkLocalMulticast, IPv6linklocalallrouters, true},
-	{IP.IsLinkLocalMulticast, IP{0xff, 0x05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, false},
-	{IP.IsLinkLocalMulticast, nil, false},
-	{IP.IsLinkLocalUnicast, IPv4(169, 254, 0, 0), true},
-	{IP.IsLinkLocalUnicast, IPv4(169, 255, 0, 0), false},
-	{IP.IsLinkLocalUnicast, IPv4(0xfe, 0x80, 0, 0), false},
-	{IP.IsLinkLocalUnicast, IP{0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, true},
-	{IP.IsLinkLocalUnicast, IP{0xfe, 0xc0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, false},
-	{IP.IsLinkLocalUnicast, nil, false},
-	{IP.IsGlobalUnicast, IPv4(240, 0, 0, 0), true},
-	{IP.IsGlobalUnicast, IPv4(232, 0, 0, 0), false},
-	{IP.IsGlobalUnicast, IPv4(169, 254, 0, 0), false},
-	{IP.IsGlobalUnicast, IPv4bcast, false},
-	{IP.IsGlobalUnicast, IP{0x20, 0x1, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0x1, 0x23, 0, 0x12, 0, 0x1}, true},
-	{IP.IsGlobalUnicast, IP{0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, false},
-	{IP.IsGlobalUnicast, IP{0xff, 0x05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, false},
-	{IP.IsGlobalUnicast, nil, false},
-}
-
-func name(f interface{}) string {
-	return runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name()
-}
-
-func TestIPAddrScope(t *testing.T) {
-	for _, tt := range ipAddrScopeTests {
-		if ok := tt.scope(tt.in); ok != tt.ok {
-			t.Errorf("%s(%q) = %v, want %v", name(tt.scope), tt.in, ok, tt.ok)
-		}
-		ip := tt.in.To4()
-		if ip == nil {
-			continue
-		}
-		if ok := tt.scope(ip); ok != tt.ok {
-			t.Errorf("%s(%q) = %v, want %v", name(tt.scope), ip, ok, tt.ok)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/ipraw_test.go b/third_party/gofrontend/libgo/go/net/ipraw_test.go
deleted file mode 100644
index 5d86a9d..0000000
--- a/third_party/gofrontend/libgo/go/net/ipraw_test.go
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"reflect"
-	"testing"
-)
-
-// The full stack test cases for IPConn have been moved to the
-// following:
-//	golang.org/x/net/ipv4
-//	golang.org/x/net/ipv6
-//	golang.org/x/net/icmp
-
-type resolveIPAddrTest struct {
-	network       string
-	litAddrOrName string
-	addr          *IPAddr
-	err           error
-}
-
-var resolveIPAddrTests = []resolveIPAddrTest{
-	{"ip", "127.0.0.1", &IPAddr{IP: IPv4(127, 0, 0, 1)}, nil},
-	{"ip4", "127.0.0.1", &IPAddr{IP: IPv4(127, 0, 0, 1)}, nil},
-	{"ip4:icmp", "127.0.0.1", &IPAddr{IP: IPv4(127, 0, 0, 1)}, nil},
-
-	{"ip", "::1", &IPAddr{IP: ParseIP("::1")}, nil},
-	{"ip6", "::1", &IPAddr{IP: ParseIP("::1")}, nil},
-	{"ip6:ipv6-icmp", "::1", &IPAddr{IP: ParseIP("::1")}, nil},
-	{"ip6:IPv6-ICMP", "::1", &IPAddr{IP: ParseIP("::1")}, nil},
-
-	{"ip", "::1%en0", &IPAddr{IP: ParseIP("::1"), Zone: "en0"}, nil},
-	{"ip6", "::1%911", &IPAddr{IP: ParseIP("::1"), Zone: "911"}, nil},
-
-	{"", "127.0.0.1", &IPAddr{IP: IPv4(127, 0, 0, 1)}, nil}, // Go 1.0 behavior
-	{"", "::1", &IPAddr{IP: ParseIP("::1")}, nil},           // Go 1.0 behavior
-
-	{"ip4:icmp", "", &IPAddr{}, nil},
-
-	{"l2tp", "127.0.0.1", nil, UnknownNetworkError("l2tp")},
-	{"l2tp:gre", "127.0.0.1", nil, UnknownNetworkError("l2tp:gre")},
-	{"tcp", "1.2.3.4:123", nil, UnknownNetworkError("tcp")},
-}
-
-func TestResolveIPAddr(t *testing.T) {
-	if !testableNetwork("ip+nopriv") {
-		t.Skip("ip+nopriv test")
-	}
-
-	origTestHookLookupIP := testHookLookupIP
-	defer func() { testHookLookupIP = origTestHookLookupIP }()
-	testHookLookupIP = lookupLocalhost
-
-	for i, tt := range resolveIPAddrTests {
-		addr, err := ResolveIPAddr(tt.network, tt.litAddrOrName)
-		if err != tt.err {
-			t.Errorf("#%d: %v", i, err)
-		} else if !reflect.DeepEqual(addr, tt.addr) {
-			t.Errorf("#%d: got %#v; want %#v", i, addr, tt.addr)
-		}
-		if err != nil {
-			continue
-		}
-		rtaddr, err := ResolveIPAddr(addr.Network(), addr.String())
-		if err != nil {
-			t.Errorf("#%d: %v", i, err)
-		} else if !reflect.DeepEqual(rtaddr, addr) {
-			t.Errorf("#%d: got %#v; want %#v", i, rtaddr, addr)
-		}
-	}
-}
-
-var ipConnLocalNameTests = []struct {
-	net   string
-	laddr *IPAddr
-}{
-	{"ip4:icmp", &IPAddr{IP: IPv4(127, 0, 0, 1)}},
-	{"ip4:icmp", &IPAddr{}},
-	{"ip4:icmp", nil},
-}
-
-func TestIPConnLocalName(t *testing.T) {
-	for _, tt := range ipConnLocalNameTests {
-		if !testableNetwork(tt.net) {
-			t.Logf("skipping %s test", tt.net)
-			continue
-		}
-		c, err := ListenIP(tt.net, tt.laddr)
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer c.Close()
-		if la := c.LocalAddr(); la == nil {
-			t.Fatal("should not fail")
-		}
-	}
-}
-
-func TestIPConnRemoteName(t *testing.T) {
-	if !testableNetwork("ip:tcp") {
-		t.Skip("ip:tcp test")
-	}
-
-	raddr := &IPAddr{IP: IPv4(127, 0, 0, 1).To4()}
-	c, err := DialIP("ip:tcp", &IPAddr{IP: IPv4(127, 0, 0, 1)}, raddr)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-	if !reflect.DeepEqual(raddr, c.RemoteAddr()) {
-		t.Fatalf("got %#v; want %#v", c.RemoteAddr(), raddr)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/iprawsock.go b/third_party/gofrontend/libgo/go/net/iprawsock.go
deleted file mode 100644
index f02df7f..0000000
--- a/third_party/gofrontend/libgo/go/net/iprawsock.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-// IPAddr represents the address of an IP end point.
-type IPAddr struct {
-	IP   IP
-	Zone string // IPv6 scoped addressing zone
-}
-
-// Network returns the address's network name, "ip".
-func (a *IPAddr) Network() string { return "ip" }
-
-func (a *IPAddr) String() string {
-	if a == nil {
-		return "<nil>"
-	}
-	ip := ipEmptyString(a.IP)
-	if a.Zone != "" {
-		return ip + "%" + a.Zone
-	}
-	return ip
-}
-
-func (a *IPAddr) isWildcard() bool {
-	if a == nil || a.IP == nil {
-		return true
-	}
-	return a.IP.IsUnspecified()
-}
-
-func (a *IPAddr) opAddr() Addr {
-	if a == nil {
-		return nil
-	}
-	return a
-}
-
-// ResolveIPAddr parses addr as an IP address of the form "host" or
-// "ipv6-host%zone" and resolves the domain name on the network net,
-// which must be "ip", "ip4" or "ip6".
-func ResolveIPAddr(net, addr string) (*IPAddr, error) {
-	if net == "" { // a hint wildcard for Go 1.0 undocumented behavior
-		net = "ip"
-	}
-	afnet, _, err := parseNetwork(net)
-	if err != nil {
-		return nil, err
-	}
-	switch afnet {
-	case "ip", "ip4", "ip6":
-	default:
-		return nil, UnknownNetworkError(net)
-	}
-	addrs, err := internetAddrList(afnet, addr, noDeadline)
-	if err != nil {
-		return nil, err
-	}
-	return addrs.first(isIPv4).(*IPAddr), nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/iprawsock_plan9.go b/third_party/gofrontend/libgo/go/net/iprawsock_plan9.go
deleted file mode 100644
index b027adc..0000000
--- a/third_party/gofrontend/libgo/go/net/iprawsock_plan9.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"syscall"
-	"time"
-)
-
-// IPConn is the implementation of the Conn and PacketConn interfaces
-// for IP network connections.
-type IPConn struct {
-	conn
-}
-
-// ReadFromIP reads an IP packet from c, copying the payload into b.
-// It returns the number of bytes copied into b and the return address
-// that was on the packet.
-//
-// ReadFromIP can be made to time out and return an error with
-// Timeout() == true after a fixed time limit; see SetDeadline and
-// SetReadDeadline.
-func (c *IPConn) ReadFromIP(b []byte) (int, *IPAddr, error) {
-	return 0, nil, &OpError{Op: "read", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
-}
-
-// ReadFrom implements the PacketConn ReadFrom method.
-func (c *IPConn) ReadFrom(b []byte) (int, Addr, error) {
-	return 0, nil, &OpError{Op: "read", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
-}
-
-// ReadMsgIP reads a packet from c, copying the payload into b and the
-// associated out-of-band data into oob.  It returns the number of
-// bytes copied into b, the number of bytes copied into oob, the flags
-// that were set on the packet and the source address of the packet.
-func (c *IPConn) ReadMsgIP(b, oob []byte) (n, oobn, flags int, addr *IPAddr, err error) {
-	return 0, 0, 0, nil, &OpError{Op: "read", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
-}
-
-// WriteToIP writes an IP packet to addr via c, copying the payload
-// from b.
-//
-// WriteToIP can be made to time out and return an error with
-// Timeout() == true after a fixed time limit; see SetDeadline and
-// SetWriteDeadline.  On packet-oriented connections, write timeouts
-// are rare.
-func (c *IPConn) WriteToIP(b []byte, addr *IPAddr) (int, error) {
-	return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EPLAN9}
-}
-
-// WriteTo implements the PacketConn WriteTo method.
-func (c *IPConn) WriteTo(b []byte, addr Addr) (int, error) {
-	return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr, Err: syscall.EPLAN9}
-}
-
-// WriteMsgIP writes a packet to addr via c, copying the payload from
-// b and the associated out-of-band data from oob.  It returns the
-// number of payload and out-of-band bytes written.
-func (c *IPConn) WriteMsgIP(b, oob []byte, addr *IPAddr) (n, oobn int, err error) {
-	return 0, 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EPLAN9}
-}
-
-// DialIP connects to the remote address raddr on the network protocol
-// netProto, which must be "ip", "ip4", or "ip6" followed by a colon
-// and a protocol number or name.
-func DialIP(netProto string, laddr, raddr *IPAddr) (*IPConn, error) {
-	return dialIP(netProto, laddr, raddr, noDeadline)
-}
-
-func dialIP(netProto string, laddr, raddr *IPAddr, deadline time.Time) (*IPConn, error) {
-	return nil, &OpError{Op: "dial", Net: netProto, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: syscall.EPLAN9}
-}
-
-// ListenIP listens for incoming IP packets addressed to the local
-// address laddr.  The returned connection's ReadFrom and WriteTo
-// methods can be used to receive and send IP packets with per-packet
-// addressing.
-func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error) {
-	return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr.opAddr(), Err: syscall.EPLAN9}
-}
diff --git a/third_party/gofrontend/libgo/go/net/iprawsock_posix.go b/third_party/gofrontend/libgo/go/net/iprawsock_posix.go
deleted file mode 100644
index 9417606..0000000
--- a/third_party/gofrontend/libgo/go/net/iprawsock_posix.go
+++ /dev/null
@@ -1,249 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
-
-package net
-
-import (
-	"syscall"
-	"time"
-)
-
-// BUG(mikio): On every POSIX platform, reads from the "ip4" network
-// using the ReadFrom or ReadFromIP method might not return a complete
-// IPv4 packet, including its header, even if there is space
-// available. This can occur even in cases where Read or ReadMsgIP
-// could return a complete packet. For this reason, it is recommended
-// that you do not uses these methods if it is important to receive a
-// full packet.
-//
-// The Go 1 compatibility guidelines make it impossible for us to
-// change the behavior of these methods; use Read or ReadMsgIP
-// instead.
-
-func sockaddrToIP(sa syscall.Sockaddr) Addr {
-	switch sa := sa.(type) {
-	case *syscall.SockaddrInet4:
-		return &IPAddr{IP: sa.Addr[0:]}
-	case *syscall.SockaddrInet6:
-		return &IPAddr{IP: sa.Addr[0:], Zone: zoneToString(int(sa.ZoneId))}
-	}
-	return nil
-}
-
-func (a *IPAddr) family() int {
-	if a == nil || len(a.IP) <= IPv4len {
-		return syscall.AF_INET
-	}
-	if a.IP.To4() != nil {
-		return syscall.AF_INET
-	}
-	return syscall.AF_INET6
-}
-
-func (a *IPAddr) sockaddr(family int) (syscall.Sockaddr, error) {
-	if a == nil {
-		return nil, nil
-	}
-	return ipToSockaddr(family, a.IP, 0, a.Zone)
-}
-
-// IPConn is the implementation of the Conn and PacketConn interfaces
-// for IP network connections.
-type IPConn struct {
-	conn
-}
-
-func newIPConn(fd *netFD) *IPConn { return &IPConn{conn{fd}} }
-
-// ReadFromIP reads an IP packet from c, copying the payload into b.
-// It returns the number of bytes copied into b and the return address
-// that was on the packet.
-//
-// ReadFromIP can be made to time out and return an error with
-// Timeout() == true after a fixed time limit; see SetDeadline and
-// SetReadDeadline.
-func (c *IPConn) ReadFromIP(b []byte) (int, *IPAddr, error) {
-	if !c.ok() {
-		return 0, nil, syscall.EINVAL
-	}
-	// TODO(cw,rsc): consider using readv if we know the family
-	// type to avoid the header trim/copy
-	var addr *IPAddr
-	n, sa, err := c.fd.readFrom(b)
-	switch sa := sa.(type) {
-	case *syscall.SockaddrInet4:
-		addr = &IPAddr{IP: sa.Addr[0:]}
-		n = stripIPv4Header(n, b)
-	case *syscall.SockaddrInet6:
-		addr = &IPAddr{IP: sa.Addr[0:], Zone: zoneToString(int(sa.ZoneId))}
-	}
-	if err != nil {
-		err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return n, addr, err
-}
-
-func stripIPv4Header(n int, b []byte) int {
-	if len(b) < 20 {
-		return n
-	}
-	l := int(b[0]&0x0f) << 2
-	if 20 > l || l > len(b) {
-		return n
-	}
-	if b[0]>>4 != 4 {
-		return n
-	}
-	copy(b, b[l:])
-	return n - l
-}
-
-// ReadFrom implements the PacketConn ReadFrom method.
-func (c *IPConn) ReadFrom(b []byte) (int, Addr, error) {
-	if !c.ok() {
-		return 0, nil, syscall.EINVAL
-	}
-	n, addr, err := c.ReadFromIP(b)
-	if addr == nil {
-		return n, nil, err
-	}
-	return n, addr, err
-}
-
-// ReadMsgIP reads a packet from c, copying the payload into b and the
-// associated out-of-band data into oob.  It returns the number of
-// bytes copied into b, the number of bytes copied into oob, the flags
-// that were set on the packet and the source address of the packet.
-func (c *IPConn) ReadMsgIP(b, oob []byte) (n, oobn, flags int, addr *IPAddr, err error) {
-	if !c.ok() {
-		return 0, 0, 0, nil, syscall.EINVAL
-	}
-	var sa syscall.Sockaddr
-	n, oobn, flags, sa, err = c.fd.readMsg(b, oob)
-	switch sa := sa.(type) {
-	case *syscall.SockaddrInet4:
-		addr = &IPAddr{IP: sa.Addr[0:]}
-	case *syscall.SockaddrInet6:
-		addr = &IPAddr{IP: sa.Addr[0:], Zone: zoneToString(int(sa.ZoneId))}
-	}
-	if err != nil {
-		err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return
-}
-
-// WriteToIP writes an IP packet to addr via c, copying the payload
-// from b.
-//
-// WriteToIP can be made to time out and return an error with
-// Timeout() == true after a fixed time limit; see SetDeadline and
-// SetWriteDeadline.  On packet-oriented connections, write timeouts
-// are rare.
-func (c *IPConn) WriteToIP(b []byte, addr *IPAddr) (int, error) {
-	if !c.ok() {
-		return 0, syscall.EINVAL
-	}
-	if c.fd.isConnected {
-		return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: ErrWriteToConnected}
-	}
-	if addr == nil {
-		return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: nil, Err: errMissingAddress}
-	}
-	sa, err := addr.sockaddr(c.fd.family)
-	if err != nil {
-		return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
-	}
-	n, err := c.fd.writeTo(b, sa)
-	if err != nil {
-		err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
-	}
-	return n, err
-}
-
-// WriteTo implements the PacketConn WriteTo method.
-func (c *IPConn) WriteTo(b []byte, addr Addr) (int, error) {
-	if !c.ok() {
-		return 0, syscall.EINVAL
-	}
-	a, ok := addr.(*IPAddr)
-	if !ok {
-		return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: syscall.EINVAL}
-	}
-	return c.WriteToIP(b, a)
-}
-
-// WriteMsgIP writes a packet to addr via c, copying the payload from
-// b and the associated out-of-band data from oob.  It returns the
-// number of payload and out-of-band bytes written.
-func (c *IPConn) WriteMsgIP(b, oob []byte, addr *IPAddr) (n, oobn int, err error) {
-	if !c.ok() {
-		return 0, 0, syscall.EINVAL
-	}
-	if c.fd.isConnected {
-		return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: ErrWriteToConnected}
-	}
-	if addr == nil {
-		return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: nil, Err: errMissingAddress}
-	}
-	var sa syscall.Sockaddr
-	sa, err = addr.sockaddr(c.fd.family)
-	if err != nil {
-		return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
-	}
-	n, oobn, err = c.fd.writeMsg(b, oob, sa)
-	if err != nil {
-		err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
-	}
-	return
-}
-
-// DialIP connects to the remote address raddr on the network protocol
-// netProto, which must be "ip", "ip4", or "ip6" followed by a colon
-// and a protocol number or name.
-func DialIP(netProto string, laddr, raddr *IPAddr) (*IPConn, error) {
-	return dialIP(netProto, laddr, raddr, noDeadline)
-}
-
-func dialIP(netProto string, laddr, raddr *IPAddr, deadline time.Time) (*IPConn, error) {
-	net, proto, err := parseNetwork(netProto)
-	if err != nil {
-		return nil, &OpError{Op: "dial", Net: netProto, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: err}
-	}
-	switch net {
-	case "ip", "ip4", "ip6":
-	default:
-		return nil, &OpError{Op: "dial", Net: netProto, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: UnknownNetworkError(netProto)}
-	}
-	if raddr == nil {
-		return nil, &OpError{Op: "dial", Net: netProto, Source: laddr.opAddr(), Addr: nil, Err: errMissingAddress}
-	}
-	fd, err := internetSocket(net, laddr, raddr, deadline, syscall.SOCK_RAW, proto, "dial")
-	if err != nil {
-		return nil, &OpError{Op: "dial", Net: netProto, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: err}
-	}
-	return newIPConn(fd), nil
-}
-
-// ListenIP listens for incoming IP packets addressed to the local
-// address laddr.  The returned connection's ReadFrom and WriteTo
-// methods can be used to receive and send IP packets with per-packet
-// addressing.
-func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error) {
-	net, proto, err := parseNetwork(netProto)
-	if err != nil {
-		return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr.opAddr(), Err: err}
-	}
-	switch net {
-	case "ip", "ip4", "ip6":
-	default:
-		return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(netProto)}
-	}
-	fd, err := internetSocket(net, laddr, nil, noDeadline, syscall.SOCK_RAW, proto, "listen")
-	if err != nil {
-		return nil, &OpError{Op: "listen", Net: netProto, Source: nil, Addr: laddr.opAddr(), Err: err}
-	}
-	return newIPConn(fd), nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/ipsock.go b/third_party/gofrontend/libgo/go/net/ipsock.go
deleted file mode 100644
index 6e75c33..0000000
--- a/third_party/gofrontend/libgo/go/net/ipsock.go
+++ /dev/null
@@ -1,285 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Internet protocol family sockets
-
-package net
-
-import (
-	"errors"
-	"time"
-)
-
-var (
-	// supportsIPv4 reports whether the platform supports IPv4
-	// networking functionality.
-	supportsIPv4 bool
-
-	// supportsIPv6 reports whether the platform supports IPv6
-	// networking functionality.
-	supportsIPv6 bool
-
-	// supportsIPv4map reports whether the platform supports
-	// mapping an IPv4 address inside an IPv6 address at transport
-	// layer protocols.  See RFC 4291, RFC 4038 and RFC 3493.
-	supportsIPv4map bool
-)
-
-// An addrList represents a list of network endpoint addresses.
-type addrList []Addr
-
-// isIPv4 returns true if the Addr contains an IPv4 address.
-func isIPv4(addr Addr) bool {
-	switch addr := addr.(type) {
-	case *TCPAddr:
-		return addr.IP.To4() != nil
-	case *UDPAddr:
-		return addr.IP.To4() != nil
-	case *IPAddr:
-		return addr.IP.To4() != nil
-	}
-	return false
-}
-
-// first returns the first address which satisfies strategy, or if
-// none do, then the first address of any kind.
-func (addrs addrList) first(strategy func(Addr) bool) Addr {
-	for _, addr := range addrs {
-		if strategy(addr) {
-			return addr
-		}
-	}
-	return addrs[0]
-}
-
-// partition divides an address list into two categories, using a
-// strategy function to assign a boolean label to each address.
-// The first address, and any with a matching label, are returned as
-// primaries, while addresses with the opposite label are returned
-// as fallbacks. For non-empty inputs, primaries is guaranteed to be
-// non-empty.
-func (addrs addrList) partition(strategy func(Addr) bool) (primaries, fallbacks addrList) {
-	var primaryLabel bool
-	for i, addr := range addrs {
-		label := strategy(addr)
-		if i == 0 || label == primaryLabel {
-			primaryLabel = label
-			primaries = append(primaries, addr)
-		} else {
-			fallbacks = append(fallbacks, addr)
-		}
-	}
-	return
-}
-
-var errNoSuitableAddress = errors.New("no suitable address found")
-
-// filterAddrList applies a filter to a list of IP addresses,
-// yielding a list of Addr objects. Known filters are nil, ipv4only,
-// and ipv6only. It returns every address when the filter is nil.
-// The result contains at least one address when error is nil.
-func filterAddrList(filter func(IPAddr) bool, ips []IPAddr, inetaddr func(IPAddr) Addr) (addrList, error) {
-	var addrs addrList
-	for _, ip := range ips {
-		if filter == nil || filter(ip) {
-			addrs = append(addrs, inetaddr(ip))
-		}
-	}
-	if len(addrs) == 0 {
-		return nil, errNoSuitableAddress
-	}
-	return addrs, nil
-}
-
-// ipv4only reports whether the kernel supports IPv4 addressing mode
-// and addr is an IPv4 address.
-func ipv4only(addr IPAddr) bool {
-	return supportsIPv4 && addr.IP.To4() != nil
-}
-
-// ipv6only reports whether the kernel supports IPv6 addressing mode
-// and addr is an IPv6 address except IPv4-mapped IPv6 address.
-func ipv6only(addr IPAddr) bool {
-	return supportsIPv6 && len(addr.IP) == IPv6len && addr.IP.To4() == nil
-}
-
-// SplitHostPort splits a network address of the form "host:port",
-// "[host]:port" or "[ipv6-host%zone]:port" into host or
-// ipv6-host%zone and port.  A literal address or host name for IPv6
-// must be enclosed in square brackets, as in "[::1]:80",
-// "[ipv6-host]:http" or "[ipv6-host%zone]:80".
-func SplitHostPort(hostport string) (host, port string, err error) {
-	j, k := 0, 0
-
-	// The port starts after the last colon.
-	i := last(hostport, ':')
-	if i < 0 {
-		goto missingPort
-	}
-
-	if hostport[0] == '[' {
-		// Expect the first ']' just before the last ':'.
-		end := byteIndex(hostport, ']')
-		if end < 0 {
-			err = &AddrError{Err: "missing ']' in address", Addr: hostport}
-			return
-		}
-		switch end + 1 {
-		case len(hostport):
-			// There can't be a ':' behind the ']' now.
-			goto missingPort
-		case i:
-			// The expected result.
-		default:
-			// Either ']' isn't followed by a colon, or it is
-			// followed by a colon that is not the last one.
-			if hostport[end+1] == ':' {
-				goto tooManyColons
-			}
-			goto missingPort
-		}
-		host = hostport[1:end]
-		j, k = 1, end+1 // there can't be a '[' resp. ']' before these positions
-	} else {
-		host = hostport[:i]
-		if byteIndex(host, ':') >= 0 {
-			goto tooManyColons
-		}
-		if byteIndex(host, '%') >= 0 {
-			goto missingBrackets
-		}
-	}
-	if byteIndex(hostport[j:], '[') >= 0 {
-		err = &AddrError{Err: "unexpected '[' in address", Addr: hostport}
-		return
-	}
-	if byteIndex(hostport[k:], ']') >= 0 {
-		err = &AddrError{Err: "unexpected ']' in address", Addr: hostport}
-		return
-	}
-
-	port = hostport[i+1:]
-	return
-
-missingPort:
-	err = &AddrError{Err: "missing port in address", Addr: hostport}
-	return
-
-tooManyColons:
-	err = &AddrError{Err: "too many colons in address", Addr: hostport}
-	return
-
-missingBrackets:
-	err = &AddrError{Err: "missing brackets in address", Addr: hostport}
-	return
-}
-
-func splitHostZone(s string) (host, zone string) {
-	// The IPv6 scoped addressing zone identifier starts after the
-	// last percent sign.
-	if i := last(s, '%'); i > 0 {
-		host, zone = s[:i], s[i+1:]
-	} else {
-		host = s
-	}
-	return
-}
-
-// JoinHostPort combines host and port into a network address of the
-// form "host:port" or, if host contains a colon or a percent sign,
-// "[host]:port".
-func JoinHostPort(host, port string) string {
-	// If host has colons or a percent sign, have to bracket it.
-	if byteIndex(host, ':') >= 0 || byteIndex(host, '%') >= 0 {
-		return "[" + host + "]:" + port
-	}
-	return host + ":" + port
-}
-
-// internetAddrList resolves addr, which may be a literal IP
-// address or a DNS name, and returns a list of internet protocol
-// family addresses. The result contains at least one address when
-// error is nil.
-func internetAddrList(net, addr string, deadline time.Time) (addrList, error) {
-	var (
-		err        error
-		host, port string
-		portnum    int
-	)
-	switch net {
-	case "tcp", "tcp4", "tcp6", "udp", "udp4", "udp6":
-		if addr != "" {
-			if host, port, err = SplitHostPort(addr); err != nil {
-				return nil, err
-			}
-			if portnum, err = parsePort(net, port); err != nil {
-				return nil, err
-			}
-		}
-	case "ip", "ip4", "ip6":
-		if addr != "" {
-			host = addr
-		}
-	default:
-		return nil, UnknownNetworkError(net)
-	}
-	inetaddr := func(ip IPAddr) Addr {
-		switch net {
-		case "tcp", "tcp4", "tcp6":
-			return &TCPAddr{IP: ip.IP, Port: portnum, Zone: ip.Zone}
-		case "udp", "udp4", "udp6":
-			return &UDPAddr{IP: ip.IP, Port: portnum, Zone: ip.Zone}
-		case "ip", "ip4", "ip6":
-			return &IPAddr{IP: ip.IP, Zone: ip.Zone}
-		default:
-			panic("unexpected network: " + net)
-		}
-	}
-	if host == "" {
-		return addrList{inetaddr(IPAddr{})}, nil
-	}
-	// Try as a literal IP address.
-	var ip IP
-	if ip = parseIPv4(host); ip != nil {
-		return addrList{inetaddr(IPAddr{IP: ip})}, nil
-	}
-	var zone string
-	if ip, zone = parseIPv6(host, true); ip != nil {
-		return addrList{inetaddr(IPAddr{IP: ip, Zone: zone})}, nil
-	}
-	// Try as a DNS name.
-	ips, err := lookupIPDeadline(host, deadline)
-	if err != nil {
-		return nil, err
-	}
-	var filter func(IPAddr) bool
-	if net != "" && net[len(net)-1] == '4' {
-		filter = ipv4only
-	}
-	if net != "" && net[len(net)-1] == '6' {
-		filter = ipv6only
-	}
-	return filterAddrList(filter, ips, inetaddr)
-}
-
-func zoneToString(zone int) string {
-	if zone == 0 {
-		return ""
-	}
-	if ifi, err := InterfaceByIndex(zone); err == nil {
-		return ifi.Name
-	}
-	return uitoa(uint(zone))
-}
-
-func zoneToInt(zone string) int {
-	if zone == "" {
-		return 0
-	}
-	if ifi, err := InterfaceByName(zone); err == nil {
-		return ifi.Index
-	}
-	n, _, _ := dtoi(zone, 0)
-	return n
-}
diff --git a/third_party/gofrontend/libgo/go/net/ipsock_plan9.go b/third_party/gofrontend/libgo/go/net/ipsock_plan9.go
deleted file mode 100644
index 9da6ec3..0000000
--- a/third_party/gofrontend/libgo/go/net/ipsock_plan9.go
+++ /dev/null
@@ -1,245 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Internet protocol family sockets for Plan 9
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-func probe(filename, query string) bool {
-	var file *file
-	var err error
-	if file, err = open(filename); err != nil {
-		return false
-	}
-
-	r := false
-	for line, ok := file.readLine(); ok && !r; line, ok = file.readLine() {
-		f := getFields(line)
-		if len(f) < 3 {
-			continue
-		}
-		for i := 0; i < len(f); i++ {
-			if query == f[i] {
-				r = true
-				break
-			}
-		}
-	}
-	file.close()
-	return r
-}
-
-func probeIPv4Stack() bool {
-	return probe(netdir+"/iproute", "4i")
-}
-
-// probeIPv6Stack returns two boolean values.  If the first boolean
-// value is true, kernel supports basic IPv6 functionality.  If the
-// second boolean value is true, kernel supports IPv6 IPv4-mapping.
-func probeIPv6Stack() (supportsIPv6, supportsIPv4map bool) {
-	// Plan 9 uses IPv6 natively, see ip(3).
-	r := probe(netdir+"/iproute", "6i")
-	v := false
-	if r {
-		v = probe(netdir+"/iproute", "4i")
-	}
-	return r, v
-}
-
-// parsePlan9Addr parses address of the form [ip!]port (e.g. 127.0.0.1!80).
-func parsePlan9Addr(s string) (ip IP, iport int, err error) {
-	addr := IPv4zero // address contains port only
-	i := byteIndex(s, '!')
-	if i >= 0 {
-		addr = ParseIP(s[:i])
-		if addr == nil {
-			return nil, 0, &ParseError{Type: "IP address", Text: s}
-		}
-	}
-	p, _, ok := dtoi(s[i+1:], 0)
-	if !ok {
-		return nil, 0, &ParseError{Type: "port", Text: s}
-	}
-	if p < 0 || p > 0xFFFF {
-		return nil, 0, &AddrError{Err: "invalid port", Addr: string(p)}
-	}
-	return addr, p, nil
-}
-
-func readPlan9Addr(proto, filename string) (addr Addr, err error) {
-	var buf [128]byte
-
-	f, err := os.Open(filename)
-	if err != nil {
-		return
-	}
-	defer f.Close()
-	n, err := f.Read(buf[:])
-	if err != nil {
-		return
-	}
-	ip, port, err := parsePlan9Addr(string(buf[:n]))
-	if err != nil {
-		return
-	}
-	switch proto {
-	case "tcp":
-		addr = &TCPAddr{IP: ip, Port: port}
-	case "udp":
-		addr = &UDPAddr{IP: ip, Port: port}
-	default:
-		return nil, UnknownNetworkError(proto)
-	}
-	return addr, nil
-}
-
-func startPlan9(net string, addr Addr) (ctl *os.File, dest, proto, name string, err error) {
-	var (
-		ip   IP
-		port int
-	)
-	switch a := addr.(type) {
-	case *TCPAddr:
-		proto = "tcp"
-		ip = a.IP
-		port = a.Port
-	case *UDPAddr:
-		proto = "udp"
-		ip = a.IP
-		port = a.Port
-	default:
-		err = UnknownNetworkError(net)
-		return
-	}
-
-	clone, dest, err := queryCS1(proto, ip, port)
-	if err != nil {
-		return
-	}
-	f, err := os.OpenFile(clone, os.O_RDWR, 0)
-	if err != nil {
-		return
-	}
-	var buf [16]byte
-	n, err := f.Read(buf[:])
-	if err != nil {
-		f.Close()
-		return
-	}
-	return f, dest, proto, string(buf[:n]), nil
-}
-
-func netErr(e error) {
-	oe, ok := e.(*OpError)
-	if !ok {
-		return
-	}
-	nonNilInterface := func(a Addr) bool {
-		switch a := a.(type) {
-		case *TCPAddr:
-			return a == nil
-		case *UDPAddr:
-			return a == nil
-		case *IPAddr:
-			return a == nil
-		default:
-			return false
-		}
-	}
-	if nonNilInterface(oe.Source) {
-		oe.Source = nil
-	}
-	if nonNilInterface(oe.Addr) {
-		oe.Addr = nil
-	}
-	if pe, ok := oe.Err.(*os.PathError); ok {
-		if _, ok = pe.Err.(syscall.ErrorString); ok {
-			oe.Err = pe.Err
-		}
-	}
-}
-
-func dialPlan9(net string, laddr, raddr Addr) (fd *netFD, err error) {
-	defer func() { netErr(err) }()
-	f, dest, proto, name, err := startPlan9(net, raddr)
-	if err != nil {
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: err}
-	}
-	_, err = f.WriteString("connect " + dest)
-	if err != nil {
-		f.Close()
-		return nil, &OpError{Op: "dial", Net: f.Name(), Source: laddr, Addr: raddr, Err: err}
-	}
-	data, err := os.OpenFile(netdir+"/"+proto+"/"+name+"/data", os.O_RDWR, 0)
-	if err != nil {
-		f.Close()
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr, Addr: raddr, Err: err}
-	}
-	laddr, err = readPlan9Addr(proto, netdir+"/"+proto+"/"+name+"/local")
-	if err != nil {
-		data.Close()
-		f.Close()
-		return nil, &OpError{Op: "dial", Net: proto, Source: laddr, Addr: raddr, Err: err}
-	}
-	return newFD(proto, name, f, data, laddr, raddr)
-}
-
-func listenPlan9(net string, laddr Addr) (fd *netFD, err error) {
-	defer func() { netErr(err) }()
-	f, dest, proto, name, err := startPlan9(net, laddr)
-	if err != nil {
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: err}
-	}
-	_, err = f.WriteString("announce " + dest)
-	if err != nil {
-		f.Close()
-		return nil, &OpError{Op: "announce", Net: proto, Source: nil, Addr: laddr, Err: err}
-	}
-	laddr, err = readPlan9Addr(proto, netdir+"/"+proto+"/"+name+"/local")
-	if err != nil {
-		f.Close()
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: err}
-	}
-	return newFD(proto, name, f, nil, laddr, nil)
-}
-
-func (fd *netFD) netFD() (*netFD, error) {
-	return newFD(fd.net, fd.n, fd.ctl, fd.data, fd.laddr, fd.raddr)
-}
-
-func (fd *netFD) acceptPlan9() (nfd *netFD, err error) {
-	defer func() { netErr(err) }()
-	if err := fd.readLock(); err != nil {
-		return nil, err
-	}
-	defer fd.readUnlock()
-	f, err := os.Open(fd.dir + "/listen")
-	if err != nil {
-		return nil, &OpError{Op: "accept", Net: fd.dir + "/listen", Source: nil, Addr: fd.laddr, Err: err}
-	}
-	var buf [16]byte
-	n, err := f.Read(buf[:])
-	if err != nil {
-		f.Close()
-		return nil, &OpError{Op: "accept", Net: fd.dir + "/listen", Source: nil, Addr: fd.laddr, Err: err}
-	}
-	name := string(buf[:n])
-	data, err := os.OpenFile(netdir+"/"+fd.net+"/"+name+"/data", os.O_RDWR, 0)
-	if err != nil {
-		f.Close()
-		return nil, &OpError{Op: "accept", Net: fd.net, Source: nil, Addr: fd.laddr, Err: err}
-	}
-	raddr, err := readPlan9Addr(fd.net, netdir+"/"+fd.net+"/"+name+"/remote")
-	if err != nil {
-		data.Close()
-		f.Close()
-		return nil, &OpError{Op: "accept", Net: fd.net, Source: nil, Addr: fd.laddr, Err: err}
-	}
-	return newFD(fd.net, name, f, data, fd.laddr, raddr)
-}
diff --git a/third_party/gofrontend/libgo/go/net/ipsock_posix.go b/third_party/gofrontend/libgo/go/net/ipsock_posix.go
deleted file mode 100644
index 83eaf85..0000000
--- a/third_party/gofrontend/libgo/go/net/ipsock_posix.go
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
-
-// Internet protocol family sockets for POSIX
-
-package net
-
-import (
-	"runtime"
-	"syscall"
-	"time"
-)
-
-// BUG(rsc,mikio): On DragonFly BSD and OpenBSD, listening on the
-// "tcp" and "udp" networks does not listen for both IPv4 and IPv6
-// connections. This is due to the fact that IPv4 traffic will not be
-// routed to an IPv6 socket - two separate sockets are required if
-// both address families are to be supported.
-// See inet6(4) for details.
-
-func probeIPv4Stack() bool {
-	s, err := socketFunc(syscall.AF_INET, syscall.SOCK_STREAM, syscall.IPPROTO_TCP)
-	switch err {
-	case syscall.EAFNOSUPPORT, syscall.EPROTONOSUPPORT:
-		return false
-	case nil:
-		closeFunc(s)
-	}
-	return true
-}
-
-// Should we try to use the IPv4 socket interface if we're
-// only dealing with IPv4 sockets?  As long as the host system
-// understands IPv6, it's okay to pass IPv4 addresses to the IPv6
-// interface.  That simplifies our code and is most general.
-// Unfortunately, we need to run on kernels built without IPv6
-// support too.  So probe the kernel to figure it out.
-//
-// probeIPv6Stack probes both basic IPv6 capability and IPv6 IPv4-
-// mapping capability which is controlled by IPV6_V6ONLY socket
-// option and/or kernel state "net.inet6.ip6.v6only".
-// It returns two boolean values.  If the first boolean value is
-// true, kernel supports basic IPv6 functionality.  If the second
-// boolean value is true, kernel supports IPv6 IPv4-mapping.
-func probeIPv6Stack() (supportsIPv6, supportsIPv4map bool) {
-	var probes = []struct {
-		laddr TCPAddr
-		value int
-	}{
-		// IPv6 communication capability
-		{laddr: TCPAddr{IP: ParseIP("::1")}, value: 1},
-		// IPv6 IPv4-mapped address communication capability
-		{laddr: TCPAddr{IP: IPv4(127, 0, 0, 1)}, value: 0},
-	}
-	var supps [2]bool
-	switch runtime.GOOS {
-	case "dragonfly", "openbsd":
-		// Some released versions of DragonFly BSD pretend to
-		// accept IPV6_V6ONLY=0 successfully, but the state
-		// still stays IPV6_V6ONLY=1. Eventually DragonFly BSD
-		// stops preteding, but the transition period would
-		// cause unpredictable behavior and we need to avoid
-		// it.
-		//
-		// OpenBSD also doesn't support IPV6_V6ONLY=0 but it
-		// never pretends to accept IPV6_V6OLY=0. It always
-		// returns an error and we don't need to probe the
-		// capability.
-		probes = probes[:1]
-	}
-
-	for i := range probes {
-		s, err := socketFunc(syscall.AF_INET6, syscall.SOCK_STREAM, syscall.IPPROTO_TCP)
-		if err != nil {
-			continue
-		}
-		defer closeFunc(s)
-		syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, probes[i].value)
-		sa, err := probes[i].laddr.sockaddr(syscall.AF_INET6)
-		if err != nil {
-			continue
-		}
-		if err := syscall.Bind(s, sa); err != nil {
-			continue
-		}
-		supps[i] = true
-	}
-
-	return supps[0], supps[1]
-}
-
-// favoriteAddrFamily returns the appropriate address family to
-// the given net, laddr, raddr and mode.  At first it figures
-// address family out from the net.  If mode indicates "listen"
-// and laddr is a wildcard, it assumes that the user wants to
-// make a passive connection with a wildcard address family, both
-// AF_INET and AF_INET6, and a wildcard address like following:
-//
-//	1. A wild-wild listen, "tcp" + ""
-//	If the platform supports both IPv6 and IPv6 IPv4-mapping
-//	capabilities, we assume that the user want to listen on
-//	both IPv4 and IPv6 wildcard address over an AF_INET6
-//	socket with IPV6_V6ONLY=0.  Otherwise we prefer an IPv4
-//	wildcard address listen over an AF_INET socket.
-//
-//	2. A wild-ipv4wild listen, "tcp" + "0.0.0.0"
-//	Same as 1.
-//
-//	3. A wild-ipv6wild listen, "tcp" + "[::]"
-//	Almost same as 1 but we prefer an IPv6 wildcard address
-//	listen over an AF_INET6 socket with IPV6_V6ONLY=0 when
-//	the platform supports IPv6 capability but not IPv6 IPv4-
-//	mapping capability.
-//
-//	4. A ipv4-ipv4wild listen, "tcp4" + "" or "0.0.0.0"
-//	We use an IPv4 (AF_INET) wildcard address listen.
-//
-//	5. A ipv6-ipv6wild listen, "tcp6" + "" or "[::]"
-//	We use an IPv6 (AF_INET6, IPV6_V6ONLY=1) wildcard address
-//	listen.
-//
-// Otherwise guess: if the addresses are IPv4 then returns AF_INET,
-// or else returns AF_INET6.  It also returns a boolean value what
-// designates IPV6_V6ONLY option.
-//
-// Note that OpenBSD allows neither "net.inet6.ip6.v6only=1" change
-// nor IPPROTO_IPV6 level IPV6_V6ONLY socket option setting.
-func favoriteAddrFamily(net string, laddr, raddr sockaddr, mode string) (family int, ipv6only bool) {
-	switch net[len(net)-1] {
-	case '4':
-		return syscall.AF_INET, false
-	case '6':
-		return syscall.AF_INET6, true
-	}
-
-	if mode == "listen" && (laddr == nil || laddr.isWildcard()) {
-		if supportsIPv4map {
-			return syscall.AF_INET6, false
-		}
-		if laddr == nil {
-			return syscall.AF_INET, false
-		}
-		return laddr.family(), false
-	}
-
-	if (laddr == nil || laddr.family() == syscall.AF_INET) &&
-		(raddr == nil || raddr.family() == syscall.AF_INET) {
-		return syscall.AF_INET, false
-	}
-	return syscall.AF_INET6, false
-}
-
-// Internet sockets (TCP, UDP, IP)
-
-func internetSocket(net string, laddr, raddr sockaddr, deadline time.Time, sotype, proto int, mode string) (fd *netFD, err error) {
-	family, ipv6only := favoriteAddrFamily(net, laddr, raddr, mode)
-	return socket(net, family, sotype, proto, ipv6only, laddr, raddr, deadline)
-}
-
-func ipToSockaddr(family int, ip IP, port int, zone string) (syscall.Sockaddr, error) {
-	switch family {
-	case syscall.AF_INET:
-		if len(ip) == 0 {
-			ip = IPv4zero
-		}
-		if ip = ip.To4(); ip == nil {
-			return nil, &AddrError{Err: "non-IPv4 address", Addr: ip.String()}
-		}
-		sa := new(syscall.SockaddrInet4)
-		for i := 0; i < IPv4len; i++ {
-			sa.Addr[i] = ip[i]
-		}
-		sa.Port = port
-		return sa, nil
-	case syscall.AF_INET6:
-		if len(ip) == 0 {
-			ip = IPv6zero
-		}
-		// IPv4 callers use 0.0.0.0 to mean "announce on any available address".
-		// In IPv6 mode, Linux treats that as meaning "announce on 0.0.0.0",
-		// which it refuses to do.  Rewrite to the IPv6 unspecified address.
-		if ip.Equal(IPv4zero) {
-			ip = IPv6zero
-		}
-		if ip = ip.To16(); ip == nil {
-			return nil, &AddrError{Err: "non-IPv6 address", Addr: ip.String()}
-		}
-		sa := new(syscall.SockaddrInet6)
-		for i := 0; i < IPv6len; i++ {
-			sa.Addr[i] = ip[i]
-		}
-		sa.Port = port
-		sa.ZoneId = uint32(zoneToInt(zone))
-		return sa, nil
-	}
-	return nil, &AddrError{Err: "invalid address family", Addr: ip.String()}
-}
diff --git a/third_party/gofrontend/libgo/go/net/ipsock_test.go b/third_party/gofrontend/libgo/go/net/ipsock_test.go
deleted file mode 100644
index b36557a..0000000
--- a/third_party/gofrontend/libgo/go/net/ipsock_test.go
+++ /dev/null
@@ -1,282 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"reflect"
-	"testing"
-)
-
-var testInetaddr = func(ip IPAddr) Addr { return &TCPAddr{IP: ip.IP, Port: 5682, Zone: ip.Zone} }
-
-var addrListTests = []struct {
-	filter    func(IPAddr) bool
-	ips       []IPAddr
-	inetaddr  func(IPAddr) Addr
-	first     Addr
-	primaries addrList
-	fallbacks addrList
-	err       error
-}{
-	{
-		nil,
-		[]IPAddr{
-			{IP: IPv4(127, 0, 0, 1)},
-			{IP: IPv6loopback},
-		},
-		testInetaddr,
-		&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-		addrList{&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682}},
-		addrList{&TCPAddr{IP: IPv6loopback, Port: 5682}},
-		nil,
-	},
-	{
-		nil,
-		[]IPAddr{
-			{IP: IPv6loopback},
-			{IP: IPv4(127, 0, 0, 1)},
-		},
-		testInetaddr,
-		&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-		addrList{&TCPAddr{IP: IPv6loopback, Port: 5682}},
-		addrList{&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682}},
-		nil,
-	},
-	{
-		nil,
-		[]IPAddr{
-			{IP: IPv4(127, 0, 0, 1)},
-			{IP: IPv4(192, 168, 0, 1)},
-		},
-		testInetaddr,
-		&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-		addrList{
-			&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-			&TCPAddr{IP: IPv4(192, 168, 0, 1), Port: 5682},
-		},
-		nil,
-		nil,
-	},
-	{
-		nil,
-		[]IPAddr{
-			{IP: IPv6loopback},
-			{IP: ParseIP("fe80::1"), Zone: "eth0"},
-		},
-		testInetaddr,
-		&TCPAddr{IP: IPv6loopback, Port: 5682},
-		addrList{
-			&TCPAddr{IP: IPv6loopback, Port: 5682},
-			&TCPAddr{IP: ParseIP("fe80::1"), Port: 5682, Zone: "eth0"},
-		},
-		nil,
-		nil,
-	},
-	{
-		nil,
-		[]IPAddr{
-			{IP: IPv4(127, 0, 0, 1)},
-			{IP: IPv4(192, 168, 0, 1)},
-			{IP: IPv6loopback},
-			{IP: ParseIP("fe80::1"), Zone: "eth0"},
-		},
-		testInetaddr,
-		&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-		addrList{
-			&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-			&TCPAddr{IP: IPv4(192, 168, 0, 1), Port: 5682},
-		},
-		addrList{
-			&TCPAddr{IP: IPv6loopback, Port: 5682},
-			&TCPAddr{IP: ParseIP("fe80::1"), Port: 5682, Zone: "eth0"},
-		},
-		nil,
-	},
-	{
-		nil,
-		[]IPAddr{
-			{IP: IPv6loopback},
-			{IP: ParseIP("fe80::1"), Zone: "eth0"},
-			{IP: IPv4(127, 0, 0, 1)},
-			{IP: IPv4(192, 168, 0, 1)},
-		},
-		testInetaddr,
-		&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-		addrList{
-			&TCPAddr{IP: IPv6loopback, Port: 5682},
-			&TCPAddr{IP: ParseIP("fe80::1"), Port: 5682, Zone: "eth0"},
-		},
-		addrList{
-			&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-			&TCPAddr{IP: IPv4(192, 168, 0, 1), Port: 5682},
-		},
-		nil,
-	},
-	{
-		nil,
-		[]IPAddr{
-			{IP: IPv4(127, 0, 0, 1)},
-			{IP: IPv6loopback},
-			{IP: IPv4(192, 168, 0, 1)},
-			{IP: ParseIP("fe80::1"), Zone: "eth0"},
-		},
-		testInetaddr,
-		&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-		addrList{
-			&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-			&TCPAddr{IP: IPv4(192, 168, 0, 1), Port: 5682},
-		},
-		addrList{
-			&TCPAddr{IP: IPv6loopback, Port: 5682},
-			&TCPAddr{IP: ParseIP("fe80::1"), Port: 5682, Zone: "eth0"},
-		},
-		nil,
-	},
-	{
-		nil,
-		[]IPAddr{
-			{IP: IPv6loopback},
-			{IP: IPv4(127, 0, 0, 1)},
-			{IP: ParseIP("fe80::1"), Zone: "eth0"},
-			{IP: IPv4(192, 168, 0, 1)},
-		},
-		testInetaddr,
-		&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-		addrList{
-			&TCPAddr{IP: IPv6loopback, Port: 5682},
-			&TCPAddr{IP: ParseIP("fe80::1"), Port: 5682, Zone: "eth0"},
-		},
-		addrList{
-			&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-			&TCPAddr{IP: IPv4(192, 168, 0, 1), Port: 5682},
-		},
-		nil,
-	},
-
-	{
-		ipv4only,
-		[]IPAddr{
-			{IP: IPv4(127, 0, 0, 1)},
-			{IP: IPv6loopback},
-		},
-		testInetaddr,
-		&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-		addrList{&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682}},
-		nil,
-		nil,
-	},
-	{
-		ipv4only,
-		[]IPAddr{
-			{IP: IPv6loopback},
-			{IP: IPv4(127, 0, 0, 1)},
-		},
-		testInetaddr,
-		&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682},
-		addrList{&TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682}},
-		nil,
-		nil,
-	},
-
-	{
-		ipv6only,
-		[]IPAddr{
-			{IP: IPv4(127, 0, 0, 1)},
-			{IP: IPv6loopback},
-		},
-		testInetaddr,
-		&TCPAddr{IP: IPv6loopback, Port: 5682},
-		addrList{&TCPAddr{IP: IPv6loopback, Port: 5682}},
-		nil,
-		nil,
-	},
-	{
-		ipv6only,
-		[]IPAddr{
-			{IP: IPv6loopback},
-			{IP: IPv4(127, 0, 0, 1)},
-		},
-		testInetaddr,
-		&TCPAddr{IP: IPv6loopback, Port: 5682},
-		addrList{&TCPAddr{IP: IPv6loopback, Port: 5682}},
-		nil,
-		nil,
-	},
-
-	{nil, nil, testInetaddr, nil, nil, nil, errNoSuitableAddress},
-
-	{ipv4only, nil, testInetaddr, nil, nil, nil, errNoSuitableAddress},
-	{ipv4only, []IPAddr{{IP: IPv6loopback}}, testInetaddr, nil, nil, nil, errNoSuitableAddress},
-
-	{ipv6only, nil, testInetaddr, nil, nil, nil, errNoSuitableAddress},
-	{ipv6only, []IPAddr{{IP: IPv4(127, 0, 0, 1)}}, testInetaddr, nil, nil, nil, errNoSuitableAddress},
-}
-
-func TestAddrList(t *testing.T) {
-	if !supportsIPv4 || !supportsIPv6 {
-		t.Skip("both IPv4 and IPv6 are required")
-	}
-
-	for i, tt := range addrListTests {
-		addrs, err := filterAddrList(tt.filter, tt.ips, tt.inetaddr)
-		if err != tt.err {
-			t.Errorf("#%v: got %v; want %v", i, err, tt.err)
-		}
-		if tt.err != nil {
-			if len(addrs) != 0 {
-				t.Errorf("#%v: got %v; want 0", i, len(addrs))
-			}
-			continue
-		}
-		first := addrs.first(isIPv4)
-		if !reflect.DeepEqual(first, tt.first) {
-			t.Errorf("#%v: got %v; want %v", i, first, tt.first)
-		}
-		primaries, fallbacks := addrs.partition(isIPv4)
-		if !reflect.DeepEqual(primaries, tt.primaries) {
-			t.Errorf("#%v: got %v; want %v", i, primaries, tt.primaries)
-		}
-		if !reflect.DeepEqual(fallbacks, tt.fallbacks) {
-			t.Errorf("#%v: got %v; want %v", i, fallbacks, tt.fallbacks)
-		}
-		expectedLen := len(primaries) + len(fallbacks)
-		if len(addrs) != expectedLen {
-			t.Errorf("#%v: got %v; want %v", i, len(addrs), expectedLen)
-		}
-	}
-}
-
-func TestAddrListPartition(t *testing.T) {
-	addrs := addrList{
-		&IPAddr{IP: ParseIP("fe80::"), Zone: "eth0"},
-		&IPAddr{IP: ParseIP("fe80::1"), Zone: "eth0"},
-		&IPAddr{IP: ParseIP("fe80::2"), Zone: "eth0"},
-	}
-	cases := []struct {
-		lastByte  byte
-		primaries addrList
-		fallbacks addrList
-	}{
-		{0, addrList{addrs[0]}, addrList{addrs[1], addrs[2]}},
-		{1, addrList{addrs[0], addrs[2]}, addrList{addrs[1]}},
-		{2, addrList{addrs[0], addrs[1]}, addrList{addrs[2]}},
-		{3, addrList{addrs[0], addrs[1], addrs[2]}, nil},
-	}
-	for i, tt := range cases {
-		// Inverting the function's output should not affect the outcome.
-		for _, invert := range []bool{false, true} {
-			primaries, fallbacks := addrs.partition(func(a Addr) bool {
-				ip := a.(*IPAddr).IP
-				return (ip[len(ip)-1] == tt.lastByte) != invert
-			})
-			if !reflect.DeepEqual(primaries, tt.primaries) {
-				t.Errorf("#%v: got %v; want %v", i, primaries, tt.primaries)
-			}
-			if !reflect.DeepEqual(fallbacks, tt.fallbacks) {
-				t.Errorf("#%v: got %v; want %v", i, fallbacks, tt.fallbacks)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/listen_test.go b/third_party/gofrontend/libgo/go/net/listen_test.go
deleted file mode 100644
index 51ffe67..0000000
--- a/third_party/gofrontend/libgo/go/net/listen_test.go
+++ /dev/null
@@ -1,685 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package net
-
-import (
-	"fmt"
-	"os"
-	"runtime"
-	"syscall"
-	"testing"
-)
-
-func (ln *TCPListener) port() string {
-	_, port, err := SplitHostPort(ln.Addr().String())
-	if err != nil {
-		return ""
-	}
-	return port
-}
-
-func (c *UDPConn) port() string {
-	_, port, err := SplitHostPort(c.LocalAddr().String())
-	if err != nil {
-		return ""
-	}
-	return port
-}
-
-var tcpListenerTests = []struct {
-	network string
-	address string
-}{
-	{"tcp", ""},
-	{"tcp", "0.0.0.0"},
-	{"tcp", "::ffff:0.0.0.0"},
-	{"tcp", "::"},
-
-	{"tcp", "127.0.0.1"},
-	{"tcp", "::ffff:127.0.0.1"},
-	{"tcp", "::1"},
-
-	{"tcp4", ""},
-	{"tcp4", "0.0.0.0"},
-	{"tcp4", "::ffff:0.0.0.0"},
-
-	{"tcp4", "127.0.0.1"},
-	{"tcp4", "::ffff:127.0.0.1"},
-
-	{"tcp6", ""},
-	{"tcp6", "::"},
-
-	{"tcp6", "::1"},
-}
-
-// TestTCPListener tests both single and double listen to a test
-// listener with same address family, same listening address and
-// same port.
-func TestTCPListener(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	for _, tt := range tcpListenerTests {
-		if !testableListenArgs(tt.network, JoinHostPort(tt.address, "0"), "") {
-			t.Logf("skipping %s test", tt.network+" "+tt.address)
-			continue
-		}
-
-		ln1, err := Listen(tt.network, JoinHostPort(tt.address, "0"))
-		if err != nil {
-			t.Fatal(err)
-		}
-		if err := checkFirstListener(tt.network, ln1); err != nil {
-			ln1.Close()
-			t.Fatal(err)
-		}
-		ln2, err := Listen(tt.network, JoinHostPort(tt.address, ln1.(*TCPListener).port()))
-		if err == nil {
-			ln2.Close()
-		}
-		if err := checkSecondListener(tt.network, tt.address, err); err != nil {
-			ln1.Close()
-			t.Fatal(err)
-		}
-		ln1.Close()
-	}
-}
-
-var udpListenerTests = []struct {
-	network string
-	address string
-}{
-	{"udp", ""},
-	{"udp", "0.0.0.0"},
-	{"udp", "::ffff:0.0.0.0"},
-	{"udp", "::"},
-
-	{"udp", "127.0.0.1"},
-	{"udp", "::ffff:127.0.0.1"},
-	{"udp", "::1"},
-
-	{"udp4", ""},
-	{"udp4", "0.0.0.0"},
-	{"udp4", "::ffff:0.0.0.0"},
-
-	{"udp4", "127.0.0.1"},
-	{"udp4", "::ffff:127.0.0.1"},
-
-	{"udp6", ""},
-	{"udp6", "::"},
-
-	{"udp6", "::1"},
-}
-
-// TestUDPListener tests both single and double listen to a test
-// listener with same address family, same listening address and
-// same port.
-func TestUDPListener(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	for _, tt := range udpListenerTests {
-		if !testableListenArgs(tt.network, JoinHostPort(tt.address, "0"), "") {
-			t.Logf("skipping %s test", tt.network+" "+tt.address)
-			continue
-		}
-
-		c1, err := ListenPacket(tt.network, JoinHostPort(tt.address, "0"))
-		if err != nil {
-			t.Fatal(err)
-		}
-		if err := checkFirstListener(tt.network, c1); err != nil {
-			c1.Close()
-			t.Fatal(err)
-		}
-		c2, err := ListenPacket(tt.network, JoinHostPort(tt.address, c1.(*UDPConn).port()))
-		if err == nil {
-			c2.Close()
-		}
-		if err := checkSecondListener(tt.network, tt.address, err); err != nil {
-			c1.Close()
-			t.Fatal(err)
-		}
-		c1.Close()
-	}
-}
-
-var dualStackTCPListenerTests = []struct {
-	network1, address1 string // first listener
-	network2, address2 string // second listener
-	xerr               error  // expected error value, nil or other
-}{
-	// Test cases and expected results for the attemping 2nd listen on the same port
-	// 1st listen                2nd listen                 darwin  freebsd  linux  openbsd
-	// ------------------------------------------------------------------------------------
-	// "tcp"  ""                 "tcp"  ""                    -        -       -       -
-	// "tcp"  ""                 "tcp"  "0.0.0.0"             -        -       -       -
-	// "tcp"  "0.0.0.0"          "tcp"  ""                    -        -       -       -
-	// ------------------------------------------------------------------------------------
-	// "tcp"  ""                 "tcp"  "[::]"                -        -       -       ok
-	// "tcp"  "[::]"             "tcp"  ""                    -        -       -       ok
-	// "tcp"  "0.0.0.0"          "tcp"  "[::]"                -        -       -       ok
-	// "tcp"  "[::]"             "tcp"  "0.0.0.0"             -        -       -       ok
-	// "tcp"  "[::ffff:0.0.0.0]" "tcp"  "[::]"                -        -       -       ok
-	// "tcp"  "[::]"             "tcp"  "[::ffff:0.0.0.0]"    -        -       -       ok
-	// ------------------------------------------------------------------------------------
-	// "tcp4" ""                 "tcp6" ""                    ok       ok      ok      ok
-	// "tcp6" ""                 "tcp4" ""                    ok       ok      ok      ok
-	// "tcp4" "0.0.0.0"          "tcp6" "[::]"                ok       ok      ok      ok
-	// "tcp6" "[::]"             "tcp4" "0.0.0.0"             ok       ok      ok      ok
-	// ------------------------------------------------------------------------------------
-	// "tcp"  "127.0.0.1"        "tcp"  "[::1]"               ok       ok      ok      ok
-	// "tcp"  "[::1]"            "tcp"  "127.0.0.1"           ok       ok      ok      ok
-	// "tcp4" "127.0.0.1"        "tcp6" "[::1]"               ok       ok      ok      ok
-	// "tcp6" "[::1]"            "tcp4" "127.0.0.1"           ok       ok      ok      ok
-	//
-	// Platform default configurations:
-	// darwin, kernel version 11.3.0
-	//	net.inet6.ip6.v6only=0 (overridable by sysctl or IPV6_V6ONLY option)
-	// freebsd, kernel version 8.2
-	//	net.inet6.ip6.v6only=1 (overridable by sysctl or IPV6_V6ONLY option)
-	// linux, kernel version 3.0.0
-	//	net.ipv6.bindv6only=0 (overridable by sysctl or IPV6_V6ONLY option)
-	// openbsd, kernel version 5.0
-	//	net.inet6.ip6.v6only=1 (overriding is prohibited)
-
-	{"tcp", "", "tcp", "", syscall.EADDRINUSE},
-	{"tcp", "", "tcp", "0.0.0.0", syscall.EADDRINUSE},
-	{"tcp", "0.0.0.0", "tcp", "", syscall.EADDRINUSE},
-
-	{"tcp", "", "tcp", "::", syscall.EADDRINUSE},
-	{"tcp", "::", "tcp", "", syscall.EADDRINUSE},
-	{"tcp", "0.0.0.0", "tcp", "::", syscall.EADDRINUSE},
-	{"tcp", "::", "tcp", "0.0.0.0", syscall.EADDRINUSE},
-	{"tcp", "::ffff:0.0.0.0", "tcp", "::", syscall.EADDRINUSE},
-	{"tcp", "::", "tcp", "::ffff:0.0.0.0", syscall.EADDRINUSE},
-
-	{"tcp4", "", "tcp6", "", nil},
-	{"tcp6", "", "tcp4", "", nil},
-	{"tcp4", "0.0.0.0", "tcp6", "::", nil},
-	{"tcp6", "::", "tcp4", "0.0.0.0", nil},
-
-	{"tcp", "127.0.0.1", "tcp", "::1", nil},
-	{"tcp", "::1", "tcp", "127.0.0.1", nil},
-	{"tcp4", "127.0.0.1", "tcp6", "::1", nil},
-	{"tcp6", "::1", "tcp4", "127.0.0.1", nil},
-}
-
-// TestDualStackTCPListener tests both single and double listen
-// to a test listener with various address families, different
-// listening address and same port.
-func TestDualStackTCPListener(t *testing.T) {
-	switch runtime.GOOS {
-	case "dragonfly", "nacl", "plan9": // re-enable on dragonfly once the new IP control block management has landed
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-	if !supportsIPv4 || !supportsIPv6 {
-		t.Skip("both IPv4 and IPv6 are required")
-	}
-
-	for _, tt := range dualStackTCPListenerTests {
-		if !testableListenArgs(tt.network1, JoinHostPort(tt.address1, "0"), "") {
-			t.Logf("skipping %s test", tt.network1+" "+tt.address1)
-			continue
-		}
-
-		if !supportsIPv4map && differentWildcardAddr(tt.address1, tt.address2) {
-			tt.xerr = nil
-		}
-		var firstErr, secondErr error
-		for i := 0; i < 5; i++ {
-			lns, err := newDualStackListener()
-			if err != nil {
-				t.Fatal(err)
-			}
-			port := lns[0].port()
-			for _, ln := range lns {
-				ln.Close()
-			}
-			var ln1 Listener
-			ln1, firstErr = Listen(tt.network1, JoinHostPort(tt.address1, port))
-			if firstErr != nil {
-				continue
-			}
-			if err := checkFirstListener(tt.network1, ln1); err != nil {
-				ln1.Close()
-				t.Fatal(err)
-			}
-			ln2, err := Listen(tt.network2, JoinHostPort(tt.address2, ln1.(*TCPListener).port()))
-			if err == nil {
-				ln2.Close()
-			}
-			if secondErr = checkDualStackSecondListener(tt.network2, tt.address2, err, tt.xerr); secondErr != nil {
-				ln1.Close()
-				continue
-			}
-			ln1.Close()
-			break
-		}
-		if firstErr != nil {
-			t.Error(firstErr)
-		}
-		if secondErr != nil {
-			t.Error(secondErr)
-		}
-	}
-}
-
-var dualStackUDPListenerTests = []struct {
-	network1, address1 string // first listener
-	network2, address2 string // second listener
-	xerr               error  // expected error value, nil or other
-}{
-	{"udp", "", "udp", "", syscall.EADDRINUSE},
-	{"udp", "", "udp", "0.0.0.0", syscall.EADDRINUSE},
-	{"udp", "0.0.0.0", "udp", "", syscall.EADDRINUSE},
-
-	{"udp", "", "udp", "::", syscall.EADDRINUSE},
-	{"udp", "::", "udp", "", syscall.EADDRINUSE},
-	{"udp", "0.0.0.0", "udp", "::", syscall.EADDRINUSE},
-	{"udp", "::", "udp", "0.0.0.0", syscall.EADDRINUSE},
-	{"udp", "::ffff:0.0.0.0", "udp", "::", syscall.EADDRINUSE},
-	{"udp", "::", "udp", "::ffff:0.0.0.0", syscall.EADDRINUSE},
-
-	{"udp4", "", "udp6", "", nil},
-	{"udp6", "", "udp4", "", nil},
-	{"udp4", "0.0.0.0", "udp6", "::", nil},
-	{"udp6", "::", "udp4", "0.0.0.0", nil},
-
-	{"udp", "127.0.0.1", "udp", "::1", nil},
-	{"udp", "::1", "udp", "127.0.0.1", nil},
-	{"udp4", "127.0.0.1", "udp6", "::1", nil},
-	{"udp6", "::1", "udp4", "127.0.0.1", nil},
-}
-
-// TestDualStackUDPListener tests both single and double listen
-// to a test listener with various address families, differnet
-// listening address and same port.
-func TestDualStackUDPListener(t *testing.T) {
-	switch runtime.GOOS {
-	case "dragonfly", "nacl", "plan9": // re-enable on dragonfly once the new IP control block management has landed
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-	if !supportsIPv4 || !supportsIPv6 {
-		t.Skip("both IPv4 and IPv6 are required")
-	}
-
-	for _, tt := range dualStackUDPListenerTests {
-		if !testableListenArgs(tt.network1, JoinHostPort(tt.address1, "0"), "") {
-			t.Logf("skipping %s test", tt.network1+" "+tt.address1)
-			continue
-		}
-
-		if !supportsIPv4map && differentWildcardAddr(tt.address1, tt.address2) {
-			tt.xerr = nil
-		}
-		var firstErr, secondErr error
-		for i := 0; i < 5; i++ {
-			cs, err := newDualStackPacketListener()
-			if err != nil {
-				t.Fatal(err)
-			}
-			port := cs[0].port()
-			for _, c := range cs {
-				c.Close()
-			}
-			var c1 PacketConn
-			c1, firstErr = ListenPacket(tt.network1, JoinHostPort(tt.address1, port))
-			if firstErr != nil {
-				continue
-			}
-			if err := checkFirstListener(tt.network1, c1); err != nil {
-				c1.Close()
-				t.Fatal(err)
-			}
-			c2, err := ListenPacket(tt.network2, JoinHostPort(tt.address2, c1.(*UDPConn).port()))
-			if err == nil {
-				c2.Close()
-			}
-			if secondErr = checkDualStackSecondListener(tt.network2, tt.address2, err, tt.xerr); secondErr != nil {
-				c1.Close()
-				continue
-			}
-			c1.Close()
-			break
-		}
-		if firstErr != nil {
-			t.Error(firstErr)
-		}
-		if secondErr != nil {
-			t.Error(secondErr)
-		}
-	}
-}
-
-func differentWildcardAddr(i, j string) bool {
-	if (i == "" || i == "0.0.0.0" || i == "::ffff:0.0.0.0") && (j == "" || j == "0.0.0.0" || j == "::ffff:0.0.0.0") {
-		return false
-	}
-	if i == "[::]" && j == "[::]" {
-		return false
-	}
-	return true
-}
-
-func checkFirstListener(network string, ln interface{}) error {
-	switch network {
-	case "tcp":
-		fd := ln.(*TCPListener).fd
-		if err := checkDualStackAddrFamily(fd); err != nil {
-			return err
-		}
-	case "tcp4":
-		fd := ln.(*TCPListener).fd
-		if fd.family != syscall.AF_INET {
-			return fmt.Errorf("%v got %v; want %v", fd.laddr, fd.family, syscall.AF_INET)
-		}
-	case "tcp6":
-		fd := ln.(*TCPListener).fd
-		if fd.family != syscall.AF_INET6 {
-			return fmt.Errorf("%v got %v; want %v", fd.laddr, fd.family, syscall.AF_INET6)
-		}
-	case "udp":
-		fd := ln.(*UDPConn).fd
-		if err := checkDualStackAddrFamily(fd); err != nil {
-			return err
-		}
-	case "udp4":
-		fd := ln.(*UDPConn).fd
-		if fd.family != syscall.AF_INET {
-			return fmt.Errorf("%v got %v; want %v", fd.laddr, fd.family, syscall.AF_INET)
-		}
-	case "udp6":
-		fd := ln.(*UDPConn).fd
-		if fd.family != syscall.AF_INET6 {
-			return fmt.Errorf("%v got %v; want %v", fd.laddr, fd.family, syscall.AF_INET6)
-		}
-	default:
-		return UnknownNetworkError(network)
-	}
-	return nil
-}
-
-func checkSecondListener(network, address string, err error) error {
-	switch network {
-	case "tcp", "tcp4", "tcp6":
-		if err == nil {
-			return fmt.Errorf("%s should fail", network+" "+address)
-		}
-	case "udp", "udp4", "udp6":
-		if err == nil {
-			return fmt.Errorf("%s should fail", network+" "+address)
-		}
-	default:
-		return UnknownNetworkError(network)
-	}
-	return nil
-}
-
-func checkDualStackSecondListener(network, address string, err, xerr error) error {
-	switch network {
-	case "tcp", "tcp4", "tcp6":
-		if xerr == nil && err != nil || xerr != nil && err == nil {
-			return fmt.Errorf("%s got %v; want %v", network+" "+address, err, xerr)
-		}
-	case "udp", "udp4", "udp6":
-		if xerr == nil && err != nil || xerr != nil && err == nil {
-			return fmt.Errorf("%s got %v; want %v", network+" "+address, err, xerr)
-		}
-	default:
-		return UnknownNetworkError(network)
-	}
-	return nil
-}
-
-func checkDualStackAddrFamily(fd *netFD) error {
-	switch a := fd.laddr.(type) {
-	case *TCPAddr:
-		// If a node under test supports both IPv6 capability
-		// and IPv6 IPv4-mapping capability, we can assume
-		// that the node listens on a wildcard address with an
-		// AF_INET6 socket.
-		if supportsIPv4map && fd.laddr.(*TCPAddr).isWildcard() {
-			if fd.family != syscall.AF_INET6 {
-				return fmt.Errorf("Listen(%s, %v) returns %v; want %v", fd.net, fd.laddr, fd.family, syscall.AF_INET6)
-			}
-		} else {
-			if fd.family != a.family() {
-				return fmt.Errorf("Listen(%s, %v) returns %v; want %v", fd.net, fd.laddr, fd.family, a.family())
-			}
-		}
-	case *UDPAddr:
-		// If a node under test supports both IPv6 capability
-		// and IPv6 IPv4-mapping capability, we can assume
-		// that the node listens on a wildcard address with an
-		// AF_INET6 socket.
-		if supportsIPv4map && fd.laddr.(*UDPAddr).isWildcard() {
-			if fd.family != syscall.AF_INET6 {
-				return fmt.Errorf("ListenPacket(%s, %v) returns %v; want %v", fd.net, fd.laddr, fd.family, syscall.AF_INET6)
-			}
-		} else {
-			if fd.family != a.family() {
-				return fmt.Errorf("ListenPacket(%s, %v) returns %v; want %v", fd.net, fd.laddr, fd.family, a.family())
-			}
-		}
-	default:
-		return fmt.Errorf("unexpected protocol address type: %T", a)
-	}
-	return nil
-}
-
-func TestWildWildcardListener(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-
-	defer func() {
-		if p := recover(); p != nil {
-			t.Fatalf("panicked: %v", p)
-		}
-	}()
-
-	if ln, err := Listen("tcp", ""); err == nil {
-		ln.Close()
-	}
-	if ln, err := ListenPacket("udp", ""); err == nil {
-		ln.Close()
-	}
-	if ln, err := ListenTCP("tcp", nil); err == nil {
-		ln.Close()
-	}
-	if ln, err := ListenUDP("udp", nil); err == nil {
-		ln.Close()
-	}
-	if ln, err := ListenIP("ip:icmp", nil); err == nil {
-		ln.Close()
-	}
-}
-
-var ipv4MulticastListenerTests = []struct {
-	net   string
-	gaddr *UDPAddr // see RFC 4727
-}{
-	{"udp", &UDPAddr{IP: IPv4(224, 0, 0, 254), Port: 12345}},
-
-	{"udp4", &UDPAddr{IP: IPv4(224, 0, 0, 254), Port: 12345}},
-}
-
-// TestIPv4MulticastListener tests both single and double listen to a
-// test listener with same address family, same group address and same
-// port.
-func TestIPv4MulticastListener(t *testing.T) {
-	switch runtime.GOOS {
-	case "android", "nacl", "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	case "solaris":
-		t.Skipf("not supported on solaris, see golang.org/issue/7399")
-	}
-
-	closer := func(cs []*UDPConn) {
-		for _, c := range cs {
-			if c != nil {
-				c.Close()
-			}
-		}
-	}
-
-	for _, ifi := range []*Interface{loopbackInterface(), nil} {
-		// Note that multicast interface assignment by system
-		// is not recommended because it usually relies on
-		// routing stuff for finding out an appropriate
-		// nexthop containing both network and link layer
-		// adjacencies.
-		if ifi == nil && (testing.Short() || !*testExternal) {
-			continue
-		}
-		for _, tt := range ipv4MulticastListenerTests {
-			var err error
-			cs := make([]*UDPConn, 2)
-			if cs[0], err = ListenMulticastUDP(tt.net, ifi, tt.gaddr); err != nil {
-				t.Fatal(err)
-			}
-			if err := checkMulticastListener(cs[0], tt.gaddr.IP); err != nil {
-				closer(cs)
-				t.Fatal(err)
-			}
-			if cs[1], err = ListenMulticastUDP(tt.net, ifi, tt.gaddr); err != nil {
-				closer(cs)
-				t.Fatal(err)
-			}
-			if err := checkMulticastListener(cs[1], tt.gaddr.IP); err != nil {
-				closer(cs)
-				t.Fatal(err)
-			}
-			closer(cs)
-		}
-	}
-}
-
-var ipv6MulticastListenerTests = []struct {
-	net   string
-	gaddr *UDPAddr // see RFC 4727
-}{
-	{"udp", &UDPAddr{IP: ParseIP("ff01::114"), Port: 12345}},
-	{"udp", &UDPAddr{IP: ParseIP("ff02::114"), Port: 12345}},
-	{"udp", &UDPAddr{IP: ParseIP("ff04::114"), Port: 12345}},
-	{"udp", &UDPAddr{IP: ParseIP("ff05::114"), Port: 12345}},
-	{"udp", &UDPAddr{IP: ParseIP("ff08::114"), Port: 12345}},
-	{"udp", &UDPAddr{IP: ParseIP("ff0e::114"), Port: 12345}},
-
-	{"udp6", &UDPAddr{IP: ParseIP("ff01::114"), Port: 12345}},
-	{"udp6", &UDPAddr{IP: ParseIP("ff02::114"), Port: 12345}},
-	{"udp6", &UDPAddr{IP: ParseIP("ff04::114"), Port: 12345}},
-	{"udp6", &UDPAddr{IP: ParseIP("ff05::114"), Port: 12345}},
-	{"udp6", &UDPAddr{IP: ParseIP("ff08::114"), Port: 12345}},
-	{"udp6", &UDPAddr{IP: ParseIP("ff0e::114"), Port: 12345}},
-}
-
-// TestIPv6MulticastListener tests both single and double listen to a
-// test listener with same address family, same group address and same
-// port.
-func TestIPv6MulticastListener(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	case "solaris":
-		t.Skipf("not supported on solaris, see issue 7399")
-	}
-	if !supportsIPv6 {
-		t.Skip("ipv6 is not supported")
-	}
-	if os.Getuid() != 0 {
-		t.Skip("must be root")
-	}
-
-	closer := func(cs []*UDPConn) {
-		for _, c := range cs {
-			if c != nil {
-				c.Close()
-			}
-		}
-	}
-
-	for _, ifi := range []*Interface{loopbackInterface(), nil} {
-		// Note that multicast interface assignment by system
-		// is not recommended because it usually relies on
-		// routing stuff for finding out an appropriate
-		// nexthop containing both network and link layer
-		// adjacencies.
-		if ifi == nil && (testing.Short() || !*testExternal || !*testIPv6) {
-			continue
-		}
-		for _, tt := range ipv6MulticastListenerTests {
-			var err error
-			cs := make([]*UDPConn, 2)
-			if cs[0], err = ListenMulticastUDP(tt.net, ifi, tt.gaddr); err != nil {
-				t.Fatal(err)
-			}
-			if err := checkMulticastListener(cs[0], tt.gaddr.IP); err != nil {
-				closer(cs)
-				t.Fatal(err)
-			}
-			if cs[1], err = ListenMulticastUDP(tt.net, ifi, tt.gaddr); err != nil {
-				closer(cs)
-				t.Fatal(err)
-			}
-			if err := checkMulticastListener(cs[1], tt.gaddr.IP); err != nil {
-				closer(cs)
-				t.Fatal(err)
-			}
-			closer(cs)
-		}
-	}
-}
-
-func checkMulticastListener(c *UDPConn, ip IP) error {
-	if ok, err := multicastRIBContains(ip); err != nil {
-		return err
-	} else if !ok {
-		return fmt.Errorf("%s not found in multicast rib", ip.String())
-	}
-	la := c.LocalAddr()
-	if la, ok := la.(*UDPAddr); !ok || la.Port == 0 {
-		return fmt.Errorf("got %v; want a proper address with non-zero port number", la)
-	}
-	return nil
-}
-
-func multicastRIBContains(ip IP) (bool, error) {
-	switch runtime.GOOS {
-	case "dragonfly", "netbsd", "openbsd", "plan9", "solaris", "windows":
-		return true, nil // not implemented yet
-	case "linux":
-		if runtime.GOARCH == "arm" || runtime.GOARCH == "alpha" {
-			return true, nil // not implemented yet
-		}
-	}
-	ift, err := Interfaces()
-	if err != nil {
-		return false, err
-	}
-	for _, ifi := range ift {
-		ifmat, err := ifi.MulticastAddrs()
-		if err != nil {
-			return false, err
-		}
-		for _, ifma := range ifmat {
-			if ifma.(*IPAddr).IP.Equal(ip) {
-				return true, nil
-			}
-		}
-	}
-	return false, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/lookup.go b/third_party/gofrontend/libgo/go/net/lookup.go
deleted file mode 100644
index 9008322..0000000
--- a/third_party/gofrontend/libgo/go/net/lookup.go
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"internal/singleflight"
-	"time"
-)
-
-// protocols contains minimal mappings between internet protocol
-// names and numbers for platforms that don't have a complete list of
-// protocol numbers.
-//
-// See http://www.iana.org/assignments/protocol-numbers
-var protocols = map[string]int{
-	"icmp": 1, "ICMP": 1,
-	"igmp": 2, "IGMP": 2,
-	"tcp": 6, "TCP": 6,
-	"udp": 17, "UDP": 17,
-	"ipv6-icmp": 58, "IPV6-ICMP": 58, "IPv6-ICMP": 58,
-}
-
-// LookupHost looks up the given host using the local resolver.
-// It returns an array of that host's addresses.
-func LookupHost(host string) (addrs []string, err error) {
-	// Make sure that no matter what we do later, host=="" is rejected.
-	// ParseIP, for example, does accept empty strings.
-	if host == "" {
-		return nil, &DNSError{Err: errNoSuchHost.Error(), Name: host}
-	}
-	if ip := ParseIP(host); ip != nil {
-		return []string{host}, nil
-	}
-	return lookupHost(host)
-}
-
-// LookupIP looks up host using the local resolver.
-// It returns an array of that host's IPv4 and IPv6 addresses.
-func LookupIP(host string) (ips []IP, err error) {
-	// Make sure that no matter what we do later, host=="" is rejected.
-	// ParseIP, for example, does accept empty strings.
-	if host == "" {
-		return nil, &DNSError{Err: errNoSuchHost.Error(), Name: host}
-	}
-	if ip := ParseIP(host); ip != nil {
-		return []IP{ip}, nil
-	}
-	addrs, err := lookupIPMerge(host)
-	if err != nil {
-		return
-	}
-	ips = make([]IP, len(addrs))
-	for i, addr := range addrs {
-		ips[i] = addr.IP
-	}
-	return
-}
-
-var lookupGroup singleflight.Group
-
-// lookupIPMerge wraps lookupIP, but makes sure that for any given
-// host, only one lookup is in-flight at a time. The returned memory
-// is always owned by the caller.
-func lookupIPMerge(host string) (addrs []IPAddr, err error) {
-	addrsi, err, shared := lookupGroup.Do(host, func() (interface{}, error) {
-		return testHookLookupIP(lookupIP, host)
-	})
-	return lookupIPReturn(addrsi, err, shared)
-}
-
-// lookupIPReturn turns the return values from singleflight.Do into
-// the return values from LookupIP.
-func lookupIPReturn(addrsi interface{}, err error, shared bool) ([]IPAddr, error) {
-	if err != nil {
-		return nil, err
-	}
-	addrs := addrsi.([]IPAddr)
-	if shared {
-		clone := make([]IPAddr, len(addrs))
-		copy(clone, addrs)
-		addrs = clone
-	}
-	return addrs, nil
-}
-
-// lookupIPDeadline looks up a hostname with a deadline.
-func lookupIPDeadline(host string, deadline time.Time) (addrs []IPAddr, err error) {
-	if deadline.IsZero() {
-		return lookupIPMerge(host)
-	}
-
-	// We could push the deadline down into the name resolution
-	// functions.  However, the most commonly used implementation
-	// calls getaddrinfo, which has no timeout.
-
-	timeout := deadline.Sub(time.Now())
-	if timeout <= 0 {
-		return nil, errTimeout
-	}
-	t := time.NewTimer(timeout)
-	defer t.Stop()
-
-	ch := lookupGroup.DoChan(host, func() (interface{}, error) {
-		return testHookLookupIP(lookupIP, host)
-	})
-
-	select {
-	case <-t.C:
-		// The DNS lookup timed out for some reason.  Force
-		// future requests to start the DNS lookup again
-		// rather than waiting for the current lookup to
-		// complete.  See issue 8602.
-		lookupGroup.Forget(host)
-
-		return nil, errTimeout
-
-	case r := <-ch:
-		return lookupIPReturn(r.Val, r.Err, r.Shared)
-	}
-}
-
-// LookupPort looks up the port for the given network and service.
-func LookupPort(network, service string) (port int, err error) {
-	if n, i, ok := dtoi(service, 0); ok && i == len(service) {
-		return n, nil
-	}
-	return lookupPort(network, service)
-}
-
-// LookupCNAME returns the canonical DNS host for the given name.
-// Callers that do not care about the canonical name can call
-// LookupHost or LookupIP directly; both take care of resolving
-// the canonical name as part of the lookup.
-func LookupCNAME(name string) (cname string, err error) {
-	return lookupCNAME(name)
-}
-
-// LookupSRV tries to resolve an SRV query of the given service,
-// protocol, and domain name.  The proto is "tcp" or "udp".
-// The returned records are sorted by priority and randomized
-// by weight within a priority.
-//
-// LookupSRV constructs the DNS name to look up following RFC 2782.
-// That is, it looks up _service._proto.name.  To accommodate services
-// publishing SRV records under non-standard names, if both service
-// and proto are empty strings, LookupSRV looks up name directly.
-func LookupSRV(service, proto, name string) (cname string, addrs []*SRV, err error) {
-	return lookupSRV(service, proto, name)
-}
-
-// LookupMX returns the DNS MX records for the given domain name sorted by preference.
-func LookupMX(name string) (mxs []*MX, err error) {
-	return lookupMX(name)
-}
-
-// LookupNS returns the DNS NS records for the given domain name.
-func LookupNS(name string) (nss []*NS, err error) {
-	return lookupNS(name)
-}
-
-// LookupTXT returns the DNS TXT records for the given domain name.
-func LookupTXT(name string) (txts []string, err error) {
-	return lookupTXT(name)
-}
-
-// LookupAddr performs a reverse lookup for the given address, returning a list
-// of names mapping to that address.
-func LookupAddr(addr string) (names []string, err error) {
-	return lookupAddr(addr)
-}
diff --git a/third_party/gofrontend/libgo/go/net/lookup_plan9.go b/third_party/gofrontend/libgo/go/net/lookup_plan9.go
deleted file mode 100644
index c627464..0000000
--- a/third_party/gofrontend/libgo/go/net/lookup_plan9.go
+++ /dev/null
@@ -1,298 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"errors"
-	"os"
-)
-
-func query(filename, query string, bufSize int) (res []string, err error) {
-	file, err := os.OpenFile(filename, os.O_RDWR, 0)
-	if err != nil {
-		return
-	}
-	defer file.Close()
-
-	_, err = file.Seek(0, 0)
-	if err != nil {
-		return
-	}
-	_, err = file.WriteString(query)
-	if err != nil {
-		return
-	}
-	_, err = file.Seek(0, 0)
-	if err != nil {
-		return
-	}
-	buf := make([]byte, bufSize)
-	for {
-		n, _ := file.Read(buf)
-		if n <= 0 {
-			break
-		}
-		res = append(res, string(buf[:n]))
-	}
-	return
-}
-
-func queryCS(net, host, service string) (res []string, err error) {
-	switch net {
-	case "tcp4", "tcp6":
-		net = "tcp"
-	case "udp4", "udp6":
-		net = "udp"
-	}
-	if host == "" {
-		host = "*"
-	}
-	return query(netdir+"/cs", net+"!"+host+"!"+service, 128)
-}
-
-func queryCS1(net string, ip IP, port int) (clone, dest string, err error) {
-	ips := "*"
-	if len(ip) != 0 && !ip.IsUnspecified() {
-		ips = ip.String()
-	}
-	lines, err := queryCS(net, ips, itoa(port))
-	if err != nil {
-		return
-	}
-	f := getFields(lines[0])
-	if len(f) < 2 {
-		return "", "", errors.New("bad response from ndb/cs")
-	}
-	clone, dest = f[0], f[1]
-	return
-}
-
-func queryDNS(addr string, typ string) (res []string, err error) {
-	return query(netdir+"/dns", addr+" "+typ, 1024)
-}
-
-// toLower returns a lower-case version of in. Restricting us to
-// ASCII is sufficient to handle the IP protocol names and allow
-// us to not depend on the strings and unicode packages.
-func toLower(in string) string {
-	for _, c := range in {
-		if 'A' <= c && c <= 'Z' {
-			// Has upper case; need to fix.
-			out := []byte(in)
-			for i := 0; i < len(in); i++ {
-				c := in[i]
-				if 'A' <= c && c <= 'Z' {
-					c += 'a' - 'A'
-				}
-				out[i] = c
-			}
-			return string(out)
-		}
-	}
-	return in
-}
-
-// lookupProtocol looks up IP protocol name and returns
-// the corresponding protocol number.
-func lookupProtocol(name string) (proto int, err error) {
-	lines, err := query(netdir+"/cs", "!protocol="+toLower(name), 128)
-	if err != nil {
-		return 0, err
-	}
-	if len(lines) == 0 {
-		return 0, UnknownNetworkError(name)
-	}
-	f := getFields(lines[0])
-	if len(f) < 2 {
-		return 0, UnknownNetworkError(name)
-	}
-	s := f[1]
-	if n, _, ok := dtoi(s, byteIndex(s, '=')+1); ok {
-		return n, nil
-	}
-	return 0, UnknownNetworkError(name)
-}
-
-func lookupHost(host string) (addrs []string, err error) {
-	// Use netdir/cs instead of netdir/dns because cs knows about
-	// host names in local network (e.g. from /lib/ndb/local)
-	lines, err := queryCS("net", host, "1")
-	if err != nil {
-		return
-	}
-loop:
-	for _, line := range lines {
-		f := getFields(line)
-		if len(f) < 2 {
-			continue
-		}
-		addr := f[1]
-		if i := byteIndex(addr, '!'); i >= 0 {
-			addr = addr[:i] // remove port
-		}
-		if ParseIP(addr) == nil {
-			continue
-		}
-		// only return unique addresses
-		for _, a := range addrs {
-			if a == addr {
-				continue loop
-			}
-		}
-		addrs = append(addrs, addr)
-	}
-	return
-}
-
-func lookupIP(host string) (addrs []IPAddr, err error) {
-	lits, err := LookupHost(host)
-	if err != nil {
-		return
-	}
-	for _, lit := range lits {
-		host, zone := splitHostZone(lit)
-		if ip := ParseIP(host); ip != nil {
-			addr := IPAddr{IP: ip, Zone: zone}
-			addrs = append(addrs, addr)
-		}
-	}
-	return
-}
-
-func lookupPort(network, service string) (port int, err error) {
-	switch network {
-	case "tcp4", "tcp6":
-		network = "tcp"
-	case "udp4", "udp6":
-		network = "udp"
-	}
-	lines, err := queryCS(network, "127.0.0.1", service)
-	if err != nil {
-		return
-	}
-	unknownPortError := &AddrError{Err: "unknown port", Addr: network + "/" + service}
-	if len(lines) == 0 {
-		return 0, unknownPortError
-	}
-	f := getFields(lines[0])
-	if len(f) < 2 {
-		return 0, unknownPortError
-	}
-	s := f[1]
-	if i := byteIndex(s, '!'); i >= 0 {
-		s = s[i+1:] // remove address
-	}
-	if n, _, ok := dtoi(s, 0); ok {
-		return n, nil
-	}
-	return 0, unknownPortError
-}
-
-func lookupCNAME(name string) (cname string, err error) {
-	lines, err := queryDNS(name, "cname")
-	if err != nil {
-		return
-	}
-	if len(lines) > 0 {
-		if f := getFields(lines[0]); len(f) >= 3 {
-			return f[2] + ".", nil
-		}
-	}
-	return "", errors.New("bad response from ndb/dns")
-}
-
-func lookupSRV(service, proto, name string) (cname string, addrs []*SRV, err error) {
-	var target string
-	if service == "" && proto == "" {
-		target = name
-	} else {
-		target = "_" + service + "._" + proto + "." + name
-	}
-	lines, err := queryDNS(target, "srv")
-	if err != nil {
-		return
-	}
-	for _, line := range lines {
-		f := getFields(line)
-		if len(f) < 6 {
-			continue
-		}
-		port, _, portOk := dtoi(f[4], 0)
-		priority, _, priorityOk := dtoi(f[3], 0)
-		weight, _, weightOk := dtoi(f[2], 0)
-		if !(portOk && priorityOk && weightOk) {
-			continue
-		}
-		addrs = append(addrs, &SRV{f[5], uint16(port), uint16(priority), uint16(weight)})
-		cname = f[0]
-	}
-	byPriorityWeight(addrs).sort()
-	return
-}
-
-func lookupMX(name string) (mx []*MX, err error) {
-	lines, err := queryDNS(name, "mx")
-	if err != nil {
-		return
-	}
-	for _, line := range lines {
-		f := getFields(line)
-		if len(f) < 4 {
-			continue
-		}
-		if pref, _, ok := dtoi(f[2], 0); ok {
-			mx = append(mx, &MX{f[3], uint16(pref)})
-		}
-	}
-	byPref(mx).sort()
-	return
-}
-
-func lookupNS(name string) (ns []*NS, err error) {
-	lines, err := queryDNS(name, "ns")
-	if err != nil {
-		return
-	}
-	for _, line := range lines {
-		f := getFields(line)
-		if len(f) < 3 {
-			continue
-		}
-		ns = append(ns, &NS{f[2]})
-	}
-	return
-}
-
-func lookupTXT(name string) (txt []string, err error) {
-	lines, err := queryDNS(name, "txt")
-	if err != nil {
-		return
-	}
-	for _, line := range lines {
-		if i := byteIndex(line, '\t'); i >= 0 {
-			txt = append(txt, line[i+1:])
-		}
-	}
-	return
-}
-
-func lookupAddr(addr string) (name []string, err error) {
-	arpa, err := reverseaddr(addr)
-	if err != nil {
-		return
-	}
-	lines, err := queryDNS(arpa, "ptr")
-	if err != nil {
-		return
-	}
-	for _, line := range lines {
-		f := getFields(line)
-		if len(f) < 3 {
-			continue
-		}
-		name = append(name, f[2])
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/net/lookup_stub.go b/third_party/gofrontend/libgo/go/net/lookup_stub.go
deleted file mode 100644
index 5636198..0000000
--- a/third_party/gofrontend/libgo/go/net/lookup_stub.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build nacl
-
-package net
-
-import "syscall"
-
-func lookupProtocol(name string) (proto int, err error) {
-	return 0, syscall.ENOPROTOOPT
-}
-
-func lookupHost(host string) (addrs []string, err error) {
-	return nil, syscall.ENOPROTOOPT
-}
-
-func lookupIP(host string) (addrs []IPAddr, err error) {
-	return nil, syscall.ENOPROTOOPT
-}
-
-func lookupPort(network, service string) (port int, err error) {
-	return 0, syscall.ENOPROTOOPT
-}
-
-func lookupCNAME(name string) (cname string, err error) {
-	return "", syscall.ENOPROTOOPT
-}
-
-func lookupSRV(service, proto, name string) (cname string, srvs []*SRV, err error) {
-	return "", nil, syscall.ENOPROTOOPT
-}
-
-func lookupMX(name string) (mxs []*MX, err error) {
-	return nil, syscall.ENOPROTOOPT
-}
-
-func lookupNS(name string) (nss []*NS, err error) {
-	return nil, syscall.ENOPROTOOPT
-}
-
-func lookupTXT(name string) (txts []string, err error) {
-	return nil, syscall.ENOPROTOOPT
-}
-
-func lookupAddr(addr string) (ptrs []string, err error) {
-	return nil, syscall.ENOPROTOOPT
-}
diff --git a/third_party/gofrontend/libgo/go/net/lookup_test.go b/third_party/gofrontend/libgo/go/net/lookup_test.go
deleted file mode 100644
index 86957b5..0000000
--- a/third_party/gofrontend/libgo/go/net/lookup_test.go
+++ /dev/null
@@ -1,503 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"bytes"
-	"fmt"
-	"strings"
-	"testing"
-	"time"
-)
-
-func lookupLocalhost(fn func(string) ([]IPAddr, error), host string) ([]IPAddr, error) {
-	switch host {
-	case "localhost":
-		return []IPAddr{
-			{IP: IPv4(127, 0, 0, 1)},
-			{IP: IPv6loopback},
-		}, nil
-	default:
-		return fn(host)
-	}
-}
-
-// The Lookup APIs use various sources such as local database, DNS or
-// mDNS, and may use platform-dependent DNS stub resolver if possible.
-// The APIs accept any of forms for a query; host name in various
-// encodings, UTF-8 encoded net name, domain name, FQDN or absolute
-// FQDN, but the result would be one of the forms and it depends on
-// the circumstances.
-
-var lookupGoogleSRVTests = []struct {
-	service, proto, name string
-	cname, target        string
-}{
-	{
-		"xmpp-server", "tcp", "google.com",
-		"google.com", "google.com",
-	},
-	{
-		"xmpp-server", "tcp", "google.com.",
-		"google.com", "google.com",
-	},
-
-	// non-standard back door
-	{
-		"", "", "_xmpp-server._tcp.google.com",
-		"google.com", "google.com",
-	},
-	{
-		"", "", "_xmpp-server._tcp.google.com.",
-		"google.com", "google.com",
-	},
-}
-
-func TestLookupGoogleSRV(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv4 || !*testIPv4 {
-		t.Skip("IPv4 is required")
-	}
-
-	for _, tt := range lookupGoogleSRVTests {
-		cname, srvs, err := LookupSRV(tt.service, tt.proto, tt.name)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if len(srvs) == 0 {
-			t.Error("got no record")
-		}
-		if !strings.HasSuffix(cname, tt.cname) && !strings.HasSuffix(cname, tt.cname+".") {
-			t.Errorf("got %s; want %s", cname, tt.cname)
-		}
-		for _, srv := range srvs {
-			if !strings.HasSuffix(srv.Target, tt.target) && !strings.HasSuffix(srv.Target, tt.target+".") {
-				t.Errorf("got %v; want a record containing %s", srv, tt.target)
-			}
-		}
-	}
-}
-
-var lookupGmailMXTests = []struct {
-	name, host string
-}{
-	{"gmail.com", "google.com"},
-	{"gmail.com.", "google.com"},
-}
-
-func TestLookupGmailMX(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv4 || !*testIPv4 {
-		t.Skip("IPv4 is required")
-	}
-
-	for _, tt := range lookupGmailMXTests {
-		mxs, err := LookupMX(tt.name)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if len(mxs) == 0 {
-			t.Error("got no record")
-		}
-		for _, mx := range mxs {
-			if !strings.HasSuffix(mx.Host, tt.host) && !strings.HasSuffix(mx.Host, tt.host+".") {
-				t.Errorf("got %v; want a record containing %s", mx, tt.host)
-			}
-		}
-	}
-}
-
-var lookupGmailNSTests = []struct {
-	name, host string
-}{
-	{"gmail.com", "google.com"},
-	{"gmail.com.", "google.com"},
-}
-
-func TestLookupGmailNS(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv4 || !*testIPv4 {
-		t.Skip("IPv4 is required")
-	}
-
-	for _, tt := range lookupGmailNSTests {
-		nss, err := LookupNS(tt.name)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if len(nss) == 0 {
-			t.Error("got no record")
-		}
-		for _, ns := range nss {
-			if !strings.HasSuffix(ns.Host, tt.host) && !strings.HasSuffix(ns.Host, tt.host+".") {
-				t.Errorf("got %v; want a record containing %s", ns, tt.host)
-			}
-		}
-	}
-}
-
-var lookupGmailTXTTests = []struct {
-	name, txt, host string
-}{
-	{"gmail.com", "spf", "google.com"},
-	{"gmail.com.", "spf", "google.com"},
-}
-
-func TestLookupGmailTXT(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv4 || !*testIPv4 {
-		t.Skip("IPv4 is required")
-	}
-
-	for _, tt := range lookupGmailTXTTests {
-		txts, err := LookupTXT(tt.name)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if len(txts) == 0 {
-			t.Error("got no record")
-		}
-		for _, txt := range txts {
-			if !strings.Contains(txt, tt.txt) || (!strings.HasSuffix(txt, tt.host) && !strings.HasSuffix(txt, tt.host+".")) {
-				t.Errorf("got %s; want a record containing %s, %s", txt, tt.txt, tt.host)
-			}
-		}
-	}
-}
-
-var lookupGooglePublicDNSAddrTests = []struct {
-	addr, name string
-}{
-	{"8.8.8.8", ".google.com"},
-	{"8.8.4.4", ".google.com"},
-	{"2001:4860:4860::8888", ".google.com"},
-	{"2001:4860:4860::8844", ".google.com"},
-}
-
-func TestLookupGooglePublicDNSAddr(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv4 || !supportsIPv6 || !*testIPv4 || !*testIPv6 {
-		t.Skip("both IPv4 and IPv6 are required")
-	}
-
-	for _, tt := range lookupGooglePublicDNSAddrTests {
-		names, err := LookupAddr(tt.addr)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if len(names) == 0 {
-			t.Error("got no record")
-		}
-		for _, name := range names {
-			if !strings.HasSuffix(name, tt.name) && !strings.HasSuffix(name, tt.name+".") {
-				t.Errorf("got %s; want a record containing %s", name, tt.name)
-			}
-		}
-	}
-}
-
-var lookupIANACNAMETests = []struct {
-	name, cname string
-}{
-	{"www.iana.org", "icann.org"},
-	{"www.iana.org.", "icann.org"},
-}
-
-func TestLookupIANACNAME(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv4 || !*testIPv4 {
-		t.Skip("IPv4 is required")
-	}
-
-	for _, tt := range lookupIANACNAMETests {
-		cname, err := LookupCNAME(tt.name)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if !strings.HasSuffix(cname, tt.cname) && !strings.HasSuffix(cname, tt.cname+".") {
-			t.Errorf("got %s; want a record containing %s", cname, tt.cname)
-		}
-	}
-}
-
-var lookupGoogleHostTests = []struct {
-	name string
-}{
-	{"google.com"},
-	{"google.com."},
-}
-
-func TestLookupGoogleHost(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv4 || !*testIPv4 {
-		t.Skip("IPv4 is required")
-	}
-
-	for _, tt := range lookupGoogleHostTests {
-		addrs, err := LookupHost(tt.name)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if len(addrs) == 0 {
-			t.Error("got no record")
-		}
-		for _, addr := range addrs {
-			if ParseIP(addr) == nil {
-				t.Errorf("got %q; want a literal IP address", addr)
-			}
-		}
-	}
-}
-
-var lookupGoogleIPTests = []struct {
-	name string
-}{
-	{"google.com"},
-	{"google.com."},
-}
-
-func TestLookupGoogleIP(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv4 || !*testIPv4 {
-		t.Skip("IPv4 is required")
-	}
-
-	for _, tt := range lookupGoogleIPTests {
-		ips, err := LookupIP(tt.name)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if len(ips) == 0 {
-			t.Error("got no record")
-		}
-		for _, ip := range ips {
-			if ip.To4() == nil && ip.To16() == nil {
-				t.Errorf("got %v; want an IP address", ip)
-			}
-		}
-	}
-}
-
-var revAddrTests = []struct {
-	Addr      string
-	Reverse   string
-	ErrPrefix string
-}{
-	{"1.2.3.4", "4.3.2.1.in-addr.arpa.", ""},
-	{"245.110.36.114", "114.36.110.245.in-addr.arpa.", ""},
-	{"::ffff:12.34.56.78", "78.56.34.12.in-addr.arpa.", ""},
-	{"::1", "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.", ""},
-	{"1::", "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.ip6.arpa.", ""},
-	{"1234:567::89a:bcde", "e.d.c.b.a.9.8.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.7.6.5.0.4.3.2.1.ip6.arpa.", ""},
-	{"1234:567:fefe:bcbc:adad:9e4a:89a:bcde", "e.d.c.b.a.9.8.0.a.4.e.9.d.a.d.a.c.b.c.b.e.f.e.f.7.6.5.0.4.3.2.1.ip6.arpa.", ""},
-	{"1.2.3", "", "unrecognized address"},
-	{"1.2.3.4.5", "", "unrecognized address"},
-	{"1234:567:bcbca::89a:bcde", "", "unrecognized address"},
-	{"1234:567::bcbc:adad::89a:bcde", "", "unrecognized address"},
-}
-
-func TestReverseAddress(t *testing.T) {
-	for i, tt := range revAddrTests {
-		a, err := reverseaddr(tt.Addr)
-		if len(tt.ErrPrefix) > 0 && err == nil {
-			t.Errorf("#%d: expected %q, got <nil> (error)", i, tt.ErrPrefix)
-			continue
-		}
-		if len(tt.ErrPrefix) == 0 && err != nil {
-			t.Errorf("#%d: expected <nil>, got %q (error)", i, err)
-		}
-		if err != nil && err.(*DNSError).Err != tt.ErrPrefix {
-			t.Errorf("#%d: expected %q, got %q (mismatched error)", i, tt.ErrPrefix, err.(*DNSError).Err)
-		}
-		if a != tt.Reverse {
-			t.Errorf("#%d: expected %q, got %q (reverse address)", i, tt.Reverse, a)
-		}
-	}
-}
-
-func TestLookupIPDeadline(t *testing.T) {
-	if !*testDNSFlood {
-		t.Skip("test disabled; use -dnsflood to enable")
-	}
-
-	const N = 5000
-	const timeout = 3 * time.Second
-	c := make(chan error, 2*N)
-	for i := 0; i < N; i++ {
-		name := fmt.Sprintf("%d.net-test.golang.org", i)
-		go func() {
-			_, err := lookupIPDeadline(name, time.Now().Add(timeout/2))
-			c <- err
-		}()
-		go func() {
-			_, err := lookupIPDeadline(name, time.Now().Add(timeout))
-			c <- err
-		}()
-	}
-	qstats := struct {
-		succeeded, failed         int
-		timeout, temporary, other int
-		unknown                   int
-	}{}
-	deadline := time.After(timeout + time.Second)
-	for i := 0; i < 2*N; i++ {
-		select {
-		case <-deadline:
-			t.Fatal("deadline exceeded")
-		case err := <-c:
-			switch err := err.(type) {
-			case nil:
-				qstats.succeeded++
-			case Error:
-				qstats.failed++
-				if err.Timeout() {
-					qstats.timeout++
-				}
-				if err.Temporary() {
-					qstats.temporary++
-				}
-				if !err.Timeout() && !err.Temporary() {
-					qstats.other++
-				}
-			default:
-				qstats.failed++
-				qstats.unknown++
-			}
-		}
-	}
-
-	// A high volume of DNS queries for sub-domain of golang.org
-	// would be coordinated by authoritative or recursive server,
-	// or stub resolver which implements query-response rate
-	// limitation, so we can expect some query successes and more
-	// failures including timeout, temporary and other here.
-	// As a rule, unknown must not be shown but it might possibly
-	// happen due to issue 4856 for now.
-	t.Logf("%v succeeded, %v failed (%v timeout, %v temporary, %v other, %v unknown)", qstats.succeeded, qstats.failed, qstats.timeout, qstats.temporary, qstats.other, qstats.unknown)
-}
-
-func TestLookupDots(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skipf("skipping external network test")
-	}
-
-	fixup := forceGoDNS()
-	defer fixup()
-	testDots(t, "go")
-
-	if forceCgoDNS() {
-		testDots(t, "cgo")
-	}
-}
-
-func testDots(t *testing.T, mode string) {
-	names, err := LookupAddr("8.8.8.8") // Google dns server
-	if err != nil {
-		t.Errorf("LookupAddr(8.8.8.8): %v (mode=%v)", err, mode)
-	} else {
-		for _, name := range names {
-			if !strings.HasSuffix(name, ".google.com.") {
-				t.Errorf("LookupAddr(8.8.8.8) = %v, want names ending in .google.com. with trailing dot (mode=%v)", names, mode)
-				break
-			}
-		}
-	}
-
-	cname, err := LookupCNAME("www.mit.edu")
-	if err != nil || !strings.HasSuffix(cname, ".") {
-		t.Errorf("LookupCNAME(www.mit.edu) = %v, %v, want cname ending in . with trailing dot (mode=%v)", cname, err, mode)
-	}
-
-	mxs, err := LookupMX("google.com")
-	if err != nil {
-		t.Errorf("LookupMX(google.com): %v (mode=%v)", err, mode)
-	} else {
-		for _, mx := range mxs {
-			if !strings.HasSuffix(mx.Host, ".google.com.") {
-				t.Errorf("LookupMX(google.com) = %v, want names ending in .google.com. with trailing dot (mode=%v)", mxString(mxs), mode)
-				break
-			}
-		}
-	}
-
-	nss, err := LookupNS("google.com")
-	if err != nil {
-		t.Errorf("LookupNS(google.com): %v (mode=%v)", err, mode)
-	} else {
-		for _, ns := range nss {
-			if !strings.HasSuffix(ns.Host, ".google.com.") {
-				t.Errorf("LookupNS(google.com) = %v, want names ending in .google.com. with trailing dot (mode=%v)", nsString(nss), mode)
-				break
-			}
-		}
-	}
-
-	cname, srvs, err := LookupSRV("xmpp-server", "tcp", "google.com")
-	if err != nil {
-		t.Errorf("LookupSRV(xmpp-server, tcp, google.com): %v (mode=%v)", err, mode)
-	} else {
-		if !strings.HasSuffix(cname, ".google.com.") {
-			t.Errorf("LookupSRV(xmpp-server, tcp, google.com) returned cname=%v, want name ending in .google.com. with trailing dot (mode=%v)", cname, mode)
-		}
-		for _, srv := range srvs {
-			if !strings.HasSuffix(srv.Target, ".google.com.") {
-				t.Errorf("LookupSRV(xmpp-server, tcp, google.com) returned addrs=%v, want names ending in .google.com. with trailing dot (mode=%v)", srvString(srvs), mode)
-				break
-			}
-		}
-	}
-}
-
-func mxString(mxs []*MX) string {
-	var buf bytes.Buffer
-	sep := ""
-	fmt.Fprintf(&buf, "[")
-	for _, mx := range mxs {
-		fmt.Fprintf(&buf, "%s%s:%d", sep, mx.Host, mx.Pref)
-		sep = " "
-	}
-	fmt.Fprintf(&buf, "]")
-	return buf.String()
-}
-
-func nsString(nss []*NS) string {
-	var buf bytes.Buffer
-	sep := ""
-	fmt.Fprintf(&buf, "[")
-	for _, ns := range nss {
-		fmt.Fprintf(&buf, "%s%s", sep, ns.Host)
-		sep = " "
-	}
-	fmt.Fprintf(&buf, "]")
-	return buf.String()
-}
-
-func srvString(srvs []*SRV) string {
-	var buf bytes.Buffer
-	sep := ""
-	fmt.Fprintf(&buf, "[")
-	for _, srv := range srvs {
-		fmt.Fprintf(&buf, "%s%s:%d:%d:%d", sep, srv.Target, srv.Port, srv.Priority, srv.Weight)
-		sep = " "
-	}
-	fmt.Fprintf(&buf, "]")
-	return buf.String()
-}
diff --git a/third_party/gofrontend/libgo/go/net/lookup_unix.go b/third_party/gofrontend/libgo/go/net/lookup_unix.go
deleted file mode 100644
index a64da8b..0000000
--- a/third_party/gofrontend/libgo/go/net/lookup_unix.go
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package net
-
-import "sync"
-
-var onceReadProtocols sync.Once
-
-// readProtocols loads contents of /etc/protocols into protocols map
-// for quick access.
-func readProtocols() {
-	if file, err := open("/etc/protocols"); err == nil {
-		for line, ok := file.readLine(); ok; line, ok = file.readLine() {
-			// tcp    6   TCP    # transmission control protocol
-			if i := byteIndex(line, '#'); i >= 0 {
-				line = line[0:i]
-			}
-			f := getFields(line)
-			if len(f) < 2 {
-				continue
-			}
-			if proto, _, ok := dtoi(f[1], 0); ok {
-				if _, ok := protocols[f[0]]; !ok {
-					protocols[f[0]] = proto
-				}
-				for _, alias := range f[2:] {
-					if _, ok := protocols[alias]; !ok {
-						protocols[alias] = proto
-					}
-				}
-			}
-		}
-		file.close()
-	}
-}
-
-// lookupProtocol looks up IP protocol name in /etc/protocols and
-// returns correspondent protocol number.
-func lookupProtocol(name string) (int, error) {
-	onceReadProtocols.Do(readProtocols)
-	proto, found := protocols[name]
-	if !found {
-		return 0, &AddrError{Err: "unknown IP protocol specified", Addr: name}
-	}
-	return proto, nil
-}
-
-func lookupHost(host string) (addrs []string, err error) {
-	order := systemConf().hostLookupOrder(host)
-	if order == hostLookupCgo {
-		if addrs, err, ok := cgoLookupHost(host); ok {
-			return addrs, err
-		}
-		// cgo not available (or netgo); fall back to Go's DNS resolver
-		order = hostLookupFilesDNS
-	}
-	return goLookupHostOrder(host, order)
-}
-
-func lookupIP(host string) (addrs []IPAddr, err error) {
-	order := systemConf().hostLookupOrder(host)
-	if order == hostLookupCgo {
-		if addrs, err, ok := cgoLookupIP(host); ok {
-			return addrs, err
-		}
-		// cgo not available (or netgo); fall back to Go's DNS resolver
-		order = hostLookupFilesDNS
-	}
-	return goLookupIPOrder(host, order)
-}
-
-func lookupPort(network, service string) (int, error) {
-	if systemConf().canUseCgo() {
-		if port, err, ok := cgoLookupPort(network, service); ok {
-			return port, err
-		}
-	}
-	return goLookupPort(network, service)
-}
-
-func lookupCNAME(name string) (string, error) {
-	if systemConf().canUseCgo() {
-		if cname, err, ok := cgoLookupCNAME(name); ok {
-			return cname, err
-		}
-	}
-	return goLookupCNAME(name)
-}
-
-func lookupSRV(service, proto, name string) (string, []*SRV, error) {
-	var target string
-	if service == "" && proto == "" {
-		target = name
-	} else {
-		target = "_" + service + "._" + proto + "." + name
-	}
-	cname, rrs, err := lookup(target, dnsTypeSRV)
-	if err != nil {
-		return "", nil, err
-	}
-	srvs := make([]*SRV, len(rrs))
-	for i, rr := range rrs {
-		rr := rr.(*dnsRR_SRV)
-		srvs[i] = &SRV{Target: rr.Target, Port: rr.Port, Priority: rr.Priority, Weight: rr.Weight}
-	}
-	byPriorityWeight(srvs).sort()
-	return cname, srvs, nil
-}
-
-func lookupMX(name string) ([]*MX, error) {
-	_, rrs, err := lookup(name, dnsTypeMX)
-	if err != nil {
-		return nil, err
-	}
-	mxs := make([]*MX, len(rrs))
-	for i, rr := range rrs {
-		rr := rr.(*dnsRR_MX)
-		mxs[i] = &MX{Host: rr.Mx, Pref: rr.Pref}
-	}
-	byPref(mxs).sort()
-	return mxs, nil
-}
-
-func lookupNS(name string) ([]*NS, error) {
-	_, rrs, err := lookup(name, dnsTypeNS)
-	if err != nil {
-		return nil, err
-	}
-	nss := make([]*NS, len(rrs))
-	for i, rr := range rrs {
-		nss[i] = &NS{Host: rr.(*dnsRR_NS).Ns}
-	}
-	return nss, nil
-}
-
-func lookupTXT(name string) ([]string, error) {
-	_, rrs, err := lookup(name, dnsTypeTXT)
-	if err != nil {
-		return nil, err
-	}
-	txts := make([]string, len(rrs))
-	for i, rr := range rrs {
-		txts[i] = rr.(*dnsRR_TXT).Txt
-	}
-	return txts, nil
-}
-
-func lookupAddr(addr string) ([]string, error) {
-	if systemConf().canUseCgo() {
-		if ptrs, err, ok := cgoLookupPTR(addr); ok {
-			return ptrs, err
-		}
-	}
-	return goLookupPTR(addr)
-}
diff --git a/third_party/gofrontend/libgo/go/net/lookup_windows.go b/third_party/gofrontend/libgo/go/net/lookup_windows.go
deleted file mode 100644
index 1b6d392..0000000
--- a/third_party/gofrontend/libgo/go/net/lookup_windows.go
+++ /dev/null
@@ -1,389 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"runtime"
-	"syscall"
-	"unsafe"
-)
-
-var (
-	lookupPort = oldLookupPort
-	lookupIP   = oldLookupIP
-)
-
-func getprotobyname(name string) (proto int, err error) {
-	p, err := syscall.GetProtoByName(name)
-	if err != nil {
-		return 0, os.NewSyscallError("getorotobyname", err)
-	}
-	return int(p.Proto), nil
-}
-
-// lookupProtocol looks up IP protocol name and returns correspondent protocol number.
-func lookupProtocol(name string) (int, error) {
-	// GetProtoByName return value is stored in thread local storage.
-	// Start new os thread before the call to prevent races.
-	type result struct {
-		proto int
-		err   error
-	}
-	ch := make(chan result)
-	go func() {
-		acquireThread()
-		defer releaseThread()
-		runtime.LockOSThread()
-		defer runtime.UnlockOSThread()
-		proto, err := getprotobyname(name)
-		ch <- result{proto: proto, err: err}
-	}()
-	r := <-ch
-	if r.err != nil {
-		if proto, ok := protocols[name]; ok {
-			return proto, nil
-		}
-		r.err = &DNSError{Err: r.err.Error(), Name: name}
-	}
-	return r.proto, r.err
-}
-
-func lookupHost(name string) ([]string, error) {
-	ips, err := LookupIP(name)
-	if err != nil {
-		return nil, err
-	}
-	addrs := make([]string, 0, len(ips))
-	for _, ip := range ips {
-		addrs = append(addrs, ip.String())
-	}
-	return addrs, nil
-}
-
-func gethostbyname(name string) (addrs []IPAddr, err error) {
-	// caller already acquired thread
-	h, err := syscall.GetHostByName(name)
-	if err != nil {
-		return nil, os.NewSyscallError("gethostbyname", err)
-	}
-	switch h.AddrType {
-	case syscall.AF_INET:
-		i := 0
-		addrs = make([]IPAddr, 100) // plenty of room to grow
-		for p := (*[100](*[4]byte))(unsafe.Pointer(h.AddrList)); i < cap(addrs) && p[i] != nil; i++ {
-			addrs[i] = IPAddr{IP: IPv4(p[i][0], p[i][1], p[i][2], p[i][3])}
-		}
-		addrs = addrs[0:i]
-	default: // TODO(vcc): Implement non IPv4 address lookups.
-		return nil, syscall.EWINDOWS
-	}
-	return addrs, nil
-}
-
-func oldLookupIP(name string) ([]IPAddr, error) {
-	// GetHostByName return value is stored in thread local storage.
-	// Start new os thread before the call to prevent races.
-	type result struct {
-		addrs []IPAddr
-		err   error
-	}
-	ch := make(chan result)
-	go func() {
-		acquireThread()
-		defer releaseThread()
-		runtime.LockOSThread()
-		defer runtime.UnlockOSThread()
-		addrs, err := gethostbyname(name)
-		ch <- result{addrs: addrs, err: err}
-	}()
-	r := <-ch
-	if r.err != nil {
-		r.err = &DNSError{Err: r.err.Error(), Name: name}
-	}
-	return r.addrs, r.err
-}
-
-func newLookupIP(name string) ([]IPAddr, error) {
-	acquireThread()
-	defer releaseThread()
-	hints := syscall.AddrinfoW{
-		Family:   syscall.AF_UNSPEC,
-		Socktype: syscall.SOCK_STREAM,
-		Protocol: syscall.IPPROTO_IP,
-	}
-	var result *syscall.AddrinfoW
-	e := syscall.GetAddrInfoW(syscall.StringToUTF16Ptr(name), nil, &hints, &result)
-	if e != nil {
-		return nil, &DNSError{Err: os.NewSyscallError("getaddrinfow", e).Error(), Name: name}
-	}
-	defer syscall.FreeAddrInfoW(result)
-	addrs := make([]IPAddr, 0, 5)
-	for ; result != nil; result = result.Next {
-		addr := unsafe.Pointer(result.Addr)
-		switch result.Family {
-		case syscall.AF_INET:
-			a := (*syscall.RawSockaddrInet4)(addr).Addr
-			addrs = append(addrs, IPAddr{IP: IPv4(a[0], a[1], a[2], a[3])})
-		case syscall.AF_INET6:
-			a := (*syscall.RawSockaddrInet6)(addr).Addr
-			zone := zoneToString(int((*syscall.RawSockaddrInet6)(addr).Scope_id))
-			addrs = append(addrs, IPAddr{IP: IP{a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]}, Zone: zone})
-		default:
-			return nil, &DNSError{Err: syscall.EWINDOWS.Error(), Name: name}
-		}
-	}
-	return addrs, nil
-}
-
-func getservbyname(network, service string) (int, error) {
-	acquireThread()
-	defer releaseThread()
-	switch network {
-	case "tcp4", "tcp6":
-		network = "tcp"
-	case "udp4", "udp6":
-		network = "udp"
-	}
-	s, err := syscall.GetServByName(service, network)
-	if err != nil {
-		return 0, os.NewSyscallError("getservbyname", err)
-	}
-	return int(syscall.Ntohs(s.Port)), nil
-}
-
-func oldLookupPort(network, service string) (int, error) {
-	// GetServByName return value is stored in thread local storage.
-	// Start new os thread before the call to prevent races.
-	type result struct {
-		port int
-		err  error
-	}
-	ch := make(chan result)
-	go func() {
-		acquireThread()
-		defer releaseThread()
-		runtime.LockOSThread()
-		defer runtime.UnlockOSThread()
-		port, err := getservbyname(network, service)
-		ch <- result{port: port, err: err}
-	}()
-	r := <-ch
-	if r.err != nil {
-		r.err = &DNSError{Err: r.err.Error(), Name: network + "/" + service}
-	}
-	return r.port, r.err
-}
-
-func newLookupPort(network, service string) (int, error) {
-	acquireThread()
-	defer releaseThread()
-	var stype int32
-	switch network {
-	case "tcp4", "tcp6":
-		stype = syscall.SOCK_STREAM
-	case "udp4", "udp6":
-		stype = syscall.SOCK_DGRAM
-	}
-	hints := syscall.AddrinfoW{
-		Family:   syscall.AF_UNSPEC,
-		Socktype: stype,
-		Protocol: syscall.IPPROTO_IP,
-	}
-	var result *syscall.AddrinfoW
-	e := syscall.GetAddrInfoW(nil, syscall.StringToUTF16Ptr(service), &hints, &result)
-	if e != nil {
-		return 0, &DNSError{Err: os.NewSyscallError("getaddrinfow", e).Error(), Name: network + "/" + service}
-	}
-	defer syscall.FreeAddrInfoW(result)
-	if result == nil {
-		return 0, &DNSError{Err: syscall.EINVAL.Error(), Name: network + "/" + service}
-	}
-	addr := unsafe.Pointer(result.Addr)
-	switch result.Family {
-	case syscall.AF_INET:
-		a := (*syscall.RawSockaddrInet4)(addr)
-		return int(syscall.Ntohs(a.Port)), nil
-	case syscall.AF_INET6:
-		a := (*syscall.RawSockaddrInet6)(addr)
-		return int(syscall.Ntohs(a.Port)), nil
-	}
-	return 0, &DNSError{Err: syscall.EINVAL.Error(), Name: network + "/" + service}
-}
-
-func lookupCNAME(name string) (string, error) {
-	acquireThread()
-	defer releaseThread()
-	var r *syscall.DNSRecord
-	e := syscall.DnsQuery(name, syscall.DNS_TYPE_CNAME, 0, nil, &r, nil)
-	// windows returns DNS_INFO_NO_RECORDS if there are no CNAME-s
-	if errno, ok := e.(syscall.Errno); ok && errno == syscall.DNS_INFO_NO_RECORDS {
-		// if there are no aliases, the canonical name is the input name
-		if name == "" || name[len(name)-1] != '.' {
-			return name + ".", nil
-		}
-		return name, nil
-	}
-	if e != nil {
-		return "", &DNSError{Err: os.NewSyscallError("dnsquery", e).Error(), Name: name}
-	}
-	defer syscall.DnsRecordListFree(r, 1)
-
-	resolved := resolveCNAME(syscall.StringToUTF16Ptr(name), r)
-	cname := syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(resolved))[:]) + "."
-	return cname, nil
-}
-
-func lookupSRV(service, proto, name string) (string, []*SRV, error) {
-	acquireThread()
-	defer releaseThread()
-	var target string
-	if service == "" && proto == "" {
-		target = name
-	} else {
-		target = "_" + service + "._" + proto + "." + name
-	}
-	var r *syscall.DNSRecord
-	e := syscall.DnsQuery(target, syscall.DNS_TYPE_SRV, 0, nil, &r, nil)
-	if e != nil {
-		return "", nil, &DNSError{Err: os.NewSyscallError("dnsquery", e).Error(), Name: target}
-	}
-	defer syscall.DnsRecordListFree(r, 1)
-
-	srvs := make([]*SRV, 0, 10)
-	for _, p := range validRecs(r, syscall.DNS_TYPE_SRV, target) {
-		v := (*syscall.DNSSRVData)(unsafe.Pointer(&p.Data[0]))
-		srvs = append(srvs, &SRV{syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(v.Target))[:]), v.Port, v.Priority, v.Weight})
-	}
-	byPriorityWeight(srvs).sort()
-	return name, srvs, nil
-}
-
-func lookupMX(name string) ([]*MX, error) {
-	acquireThread()
-	defer releaseThread()
-	var r *syscall.DNSRecord
-	e := syscall.DnsQuery(name, syscall.DNS_TYPE_MX, 0, nil, &r, nil)
-	if e != nil {
-		return nil, &DNSError{Err: os.NewSyscallError("dnsquery", e).Error(), Name: name}
-	}
-	defer syscall.DnsRecordListFree(r, 1)
-
-	mxs := make([]*MX, 0, 10)
-	for _, p := range validRecs(r, syscall.DNS_TYPE_MX, name) {
-		v := (*syscall.DNSMXData)(unsafe.Pointer(&p.Data[0]))
-		mxs = append(mxs, &MX{syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(v.NameExchange))[:]) + ".", v.Preference})
-	}
-	byPref(mxs).sort()
-	return mxs, nil
-}
-
-func lookupNS(name string) ([]*NS, error) {
-	acquireThread()
-	defer releaseThread()
-	var r *syscall.DNSRecord
-	e := syscall.DnsQuery(name, syscall.DNS_TYPE_NS, 0, nil, &r, nil)
-	if e != nil {
-		return nil, &DNSError{Err: os.NewSyscallError("dnsquery", e).Error(), Name: name}
-	}
-	defer syscall.DnsRecordListFree(r, 1)
-
-	nss := make([]*NS, 0, 10)
-	for _, p := range validRecs(r, syscall.DNS_TYPE_NS, name) {
-		v := (*syscall.DNSPTRData)(unsafe.Pointer(&p.Data[0]))
-		nss = append(nss, &NS{syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(v.Host))[:]) + "."})
-	}
-	return nss, nil
-}
-
-func lookupTXT(name string) ([]string, error) {
-	acquireThread()
-	defer releaseThread()
-	var r *syscall.DNSRecord
-	e := syscall.DnsQuery(name, syscall.DNS_TYPE_TEXT, 0, nil, &r, nil)
-	if e != nil {
-		return nil, &DNSError{Err: os.NewSyscallError("dnsquery", e).Error(), Name: name}
-	}
-	defer syscall.DnsRecordListFree(r, 1)
-
-	txts := make([]string, 0, 10)
-	for _, p := range validRecs(r, syscall.DNS_TYPE_TEXT, name) {
-		d := (*syscall.DNSTXTData)(unsafe.Pointer(&p.Data[0]))
-		for _, v := range (*[1 << 10]*uint16)(unsafe.Pointer(&(d.StringArray[0])))[:d.StringCount] {
-			s := syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(v))[:])
-			txts = append(txts, s)
-		}
-	}
-	return txts, nil
-}
-
-func lookupAddr(addr string) ([]string, error) {
-	acquireThread()
-	defer releaseThread()
-	arpa, err := reverseaddr(addr)
-	if err != nil {
-		return nil, err
-	}
-	var r *syscall.DNSRecord
-	e := syscall.DnsQuery(arpa, syscall.DNS_TYPE_PTR, 0, nil, &r, nil)
-	if e != nil {
-		return nil, &DNSError{Err: os.NewSyscallError("dnsquery", e).Error(), Name: addr}
-	}
-	defer syscall.DnsRecordListFree(r, 1)
-
-	ptrs := make([]string, 0, 10)
-	for _, p := range validRecs(r, syscall.DNS_TYPE_PTR, arpa) {
-		v := (*syscall.DNSPTRData)(unsafe.Pointer(&p.Data[0]))
-		ptrs = append(ptrs, syscall.UTF16ToString((*[256]uint16)(unsafe.Pointer(v.Host))[:]))
-	}
-	return ptrs, nil
-}
-
-const dnsSectionMask = 0x0003
-
-// returns only results applicable to name and resolves CNAME entries
-func validRecs(r *syscall.DNSRecord, dnstype uint16, name string) []*syscall.DNSRecord {
-	cname := syscall.StringToUTF16Ptr(name)
-	if dnstype != syscall.DNS_TYPE_CNAME {
-		cname = resolveCNAME(cname, r)
-	}
-	rec := make([]*syscall.DNSRecord, 0, 10)
-	for p := r; p != nil; p = p.Next {
-		if p.Dw&dnsSectionMask != syscall.DnsSectionAnswer {
-			continue
-		}
-		if p.Type != dnstype {
-			continue
-		}
-		if !syscall.DnsNameCompare(cname, p.Name) {
-			continue
-		}
-		rec = append(rec, p)
-	}
-	return rec
-}
-
-// returns the last CNAME in chain
-func resolveCNAME(name *uint16, r *syscall.DNSRecord) *uint16 {
-	// limit cname resolving to 10 in case of a infinite CNAME loop
-Cname:
-	for cnameloop := 0; cnameloop < 10; cnameloop++ {
-		for p := r; p != nil; p = p.Next {
-			if p.Dw&dnsSectionMask != syscall.DnsSectionAnswer {
-				continue
-			}
-			if p.Type != syscall.DNS_TYPE_CNAME {
-				continue
-			}
-			if !syscall.DnsNameCompare(name, p.Name) {
-				continue
-			}
-			name = (*syscall.DNSPTRData)(unsafe.Pointer(&r.Data[0])).Host
-			continue Cname
-		}
-		break
-	}
-	return name
-}
diff --git a/third_party/gofrontend/libgo/go/net/mac.go b/third_party/gofrontend/libgo/go/net/mac.go
deleted file mode 100644
index 8594a91..0000000
--- a/third_party/gofrontend/libgo/go/net/mac.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-const hexDigit = "0123456789abcdef"
-
-// A HardwareAddr represents a physical hardware address.
-type HardwareAddr []byte
-
-func (a HardwareAddr) String() string {
-	if len(a) == 0 {
-		return ""
-	}
-	buf := make([]byte, 0, len(a)*3-1)
-	for i, b := range a {
-		if i > 0 {
-			buf = append(buf, ':')
-		}
-		buf = append(buf, hexDigit[b>>4])
-		buf = append(buf, hexDigit[b&0xF])
-	}
-	return string(buf)
-}
-
-// ParseMAC parses s as an IEEE 802 MAC-48, EUI-48, or EUI-64 using one of the
-// following formats:
-//   01:23:45:67:89:ab
-//   01:23:45:67:89:ab:cd:ef
-//   01-23-45-67-89-ab
-//   01-23-45-67-89-ab-cd-ef
-//   0123.4567.89ab
-//   0123.4567.89ab.cdef
-func ParseMAC(s string) (hw HardwareAddr, err error) {
-	if len(s) < 14 {
-		goto error
-	}
-
-	if s[2] == ':' || s[2] == '-' {
-		if (len(s)+1)%3 != 0 {
-			goto error
-		}
-		n := (len(s) + 1) / 3
-		if n != 6 && n != 8 {
-			goto error
-		}
-		hw = make(HardwareAddr, n)
-		for x, i := 0, 0; i < n; i++ {
-			var ok bool
-			if hw[i], ok = xtoi2(s[x:], s[2]); !ok {
-				goto error
-			}
-			x += 3
-		}
-	} else if s[4] == '.' {
-		if (len(s)+1)%5 != 0 {
-			goto error
-		}
-		n := 2 * (len(s) + 1) / 5
-		if n != 6 && n != 8 {
-			goto error
-		}
-		hw = make(HardwareAddr, n)
-		for x, i := 0, 0; i < n; i += 2 {
-			var ok bool
-			if hw[i], ok = xtoi2(s[x:x+2], 0); !ok {
-				goto error
-			}
-			if hw[i+1], ok = xtoi2(s[x+2:], s[4]); !ok {
-				goto error
-			}
-			x += 5
-		}
-	} else {
-		goto error
-	}
-	return hw, nil
-
-error:
-	return nil, &AddrError{Err: "invalid MAC address", Addr: s}
-}
diff --git a/third_party/gofrontend/libgo/go/net/mac_test.go b/third_party/gofrontend/libgo/go/net/mac_test.go
deleted file mode 100644
index 0af0c01..0000000
--- a/third_party/gofrontend/libgo/go/net/mac_test.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"reflect"
-	"strings"
-	"testing"
-)
-
-var parseMACTests = []struct {
-	in  string
-	out HardwareAddr
-	err string
-}{
-	{"01:23:45:67:89:AB", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab}, ""},
-	{"01-23-45-67-89-AB", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab}, ""},
-	{"0123.4567.89AB", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab}, ""},
-	{"ab:cd:ef:AB:CD:EF", HardwareAddr{0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef}, ""},
-	{"01.02.03.04.05.06", nil, "invalid MAC address"},
-	{"01:02:03:04:05:06:", nil, "invalid MAC address"},
-	{"x1:02:03:04:05:06", nil, "invalid MAC address"},
-	{"01002:03:04:05:06", nil, "invalid MAC address"},
-	{"01:02003:04:05:06", nil, "invalid MAC address"},
-	{"01:02:03004:05:06", nil, "invalid MAC address"},
-	{"01:02:03:04005:06", nil, "invalid MAC address"},
-	{"01:02:03:04:05006", nil, "invalid MAC address"},
-	{"01-02:03:04:05:06", nil, "invalid MAC address"},
-	{"01:02-03-04-05-06", nil, "invalid MAC address"},
-	{"0123:4567:89AF", nil, "invalid MAC address"},
-	{"0123-4567-89AF", nil, "invalid MAC address"},
-	{"01:23:45:67:89:AB:CD:EF", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, ""},
-	{"01-23-45-67-89-AB-CD-EF", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, ""},
-	{"0123.4567.89AB.CDEF", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, ""},
-}
-
-func TestParseMAC(t *testing.T) {
-	match := func(err error, s string) bool {
-		if s == "" {
-			return err == nil
-		}
-		return err != nil && strings.Contains(err.Error(), s)
-	}
-
-	for i, tt := range parseMACTests {
-		out, err := ParseMAC(tt.in)
-		if !reflect.DeepEqual(out, tt.out) || !match(err, tt.err) {
-			t.Errorf("ParseMAC(%q) = %v, %v, want %v, %v", tt.in, out, err, tt.out, tt.err)
-		}
-		if tt.err == "" {
-			// Verify that serialization works too, and that it round-trips.
-			s := out.String()
-			out2, err := ParseMAC(s)
-			if err != nil {
-				t.Errorf("%d. ParseMAC(%q) = %v", i, s, err)
-				continue
-			}
-			if !reflect.DeepEqual(out2, out) {
-				t.Errorf("%d. ParseMAC(%q) = %v, want %v", i, s, out2, out)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/mail/example_test.go b/third_party/gofrontend/libgo/go/net/mail/example_test.go
deleted file mode 100644
index 972cfd6..0000000
--- a/third_party/gofrontend/libgo/go/net/mail/example_test.go
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package mail_test
-
-import (
-	"fmt"
-	"io/ioutil"
-	"log"
-	"net/mail"
-	"strings"
-)
-
-func ExampleParseAddressList() {
-	const list = "Alice <alice@example.com>, Bob <bob@example.com>, Eve <eve@example.com>"
-	emails, err := mail.ParseAddressList(list)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	for _, v := range emails {
-		fmt.Println(v.Name, v.Address)
-	}
-
-	// Output:
-	// Alice alice@example.com
-	// Bob bob@example.com
-	// Eve eve@example.com
-}
-
-func ExampleParseAddress() {
-	e, err := mail.ParseAddress("Alice <alice@example.com>")
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	fmt.Println(e.Name, e.Address)
-
-	// Output:
-	// Alice alice@example.com
-}
-
-func ExampleReadMessage() {
-	msg := `Date: Mon, 23 Jun 2015 11:40:36 -0400
-From: Gopher <from@example.com>
-To: Another Gopher <to@example.com>
-Subject: Gophers at Gophercon
-
-Message body
-`
-
-	r := strings.NewReader(msg)
-	m, err := mail.ReadMessage(r)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	header := m.Header
-	fmt.Println("Date:", header.Get("Date"))
-	fmt.Println("From:", header.Get("From"))
-	fmt.Println("To:", header.Get("To"))
-	fmt.Println("Subject:", header.Get("Subject"))
-
-	body, err := ioutil.ReadAll(m.Body)
-	if err != nil {
-		log.Fatal(err)
-	}
-	fmt.Printf("%s", body)
-
-	// Output:
-	// Date: Mon, 23 Jun 2015 11:40:36 -0400
-	// From: Gopher <from@example.com>
-	// To: Another Gopher <to@example.com>
-	// Subject: Gophers at Gophercon
-	// Message body
-}
diff --git a/third_party/gofrontend/libgo/go/net/mail/message.go b/third_party/gofrontend/libgo/go/net/mail/message.go
deleted file mode 100644
index 266ac50..0000000
--- a/third_party/gofrontend/libgo/go/net/mail/message.go
+++ /dev/null
@@ -1,576 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package mail implements parsing of mail messages.
-
-For the most part, this package follows the syntax as specified by RFC 5322.
-Notable divergences:
-	* Obsolete address formats are not parsed, including addresses with
-	  embedded route information.
-	* Group addresses are not parsed.
-	* The full range of spacing (the CFWS syntax element) is not supported,
-	  such as breaking addresses across lines.
-*/
-package mail
-
-import (
-	"bufio"
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"log"
-	"mime"
-	"net/textproto"
-	"strings"
-	"time"
-)
-
-var debug = debugT(false)
-
-type debugT bool
-
-func (d debugT) Printf(format string, args ...interface{}) {
-	if d {
-		log.Printf(format, args...)
-	}
-}
-
-// A Message represents a parsed mail message.
-type Message struct {
-	Header Header
-	Body   io.Reader
-}
-
-// ReadMessage reads a message from r.
-// The headers are parsed, and the body of the message will be available
-// for reading from r.
-func ReadMessage(r io.Reader) (msg *Message, err error) {
-	tp := textproto.NewReader(bufio.NewReader(r))
-
-	hdr, err := tp.ReadMIMEHeader()
-	if err != nil {
-		return nil, err
-	}
-
-	return &Message{
-		Header: Header(hdr),
-		Body:   tp.R,
-	}, nil
-}
-
-// Layouts suitable for passing to time.Parse.
-// These are tried in order.
-var dateLayouts []string
-
-func init() {
-	// Generate layouts based on RFC 5322, section 3.3.
-
-	dows := [...]string{"", "Mon, "}   // day-of-week
-	days := [...]string{"2", "02"}     // day = 1*2DIGIT
-	years := [...]string{"2006", "06"} // year = 4*DIGIT / 2*DIGIT
-	seconds := [...]string{":05", ""}  // second
-	// "-0700 (MST)" is not in RFC 5322, but is common.
-	zones := [...]string{"-0700", "MST", "-0700 (MST)"} // zone = (("+" / "-") 4DIGIT) / "GMT" / ...
-
-	for _, dow := range dows {
-		for _, day := range days {
-			for _, year := range years {
-				for _, second := range seconds {
-					for _, zone := range zones {
-						s := dow + day + " Jan " + year + " 15:04" + second + " " + zone
-						dateLayouts = append(dateLayouts, s)
-					}
-				}
-			}
-		}
-	}
-}
-
-func parseDate(date string) (time.Time, error) {
-	for _, layout := range dateLayouts {
-		t, err := time.Parse(layout, date)
-		if err == nil {
-			return t, nil
-		}
-	}
-	return time.Time{}, errors.New("mail: header could not be parsed")
-}
-
-// A Header represents the key-value pairs in a mail message header.
-type Header map[string][]string
-
-// Get gets the first value associated with the given key.
-// If there are no values associated with the key, Get returns "".
-func (h Header) Get(key string) string {
-	return textproto.MIMEHeader(h).Get(key)
-}
-
-var ErrHeaderNotPresent = errors.New("mail: header not in message")
-
-// Date parses the Date header field.
-func (h Header) Date() (time.Time, error) {
-	hdr := h.Get("Date")
-	if hdr == "" {
-		return time.Time{}, ErrHeaderNotPresent
-	}
-	return parseDate(hdr)
-}
-
-// AddressList parses the named header field as a list of addresses.
-func (h Header) AddressList(key string) ([]*Address, error) {
-	hdr := h.Get(key)
-	if hdr == "" {
-		return nil, ErrHeaderNotPresent
-	}
-	return ParseAddressList(hdr)
-}
-
-// Address represents a single mail address.
-// An address such as "Barry Gibbs <bg@example.com>" is represented
-// as Address{Name: "Barry Gibbs", Address: "bg@example.com"}.
-type Address struct {
-	Name    string // Proper name; may be empty.
-	Address string // user@domain
-}
-
-// Parses a single RFC 5322 address, e.g. "Barry Gibbs <bg@example.com>"
-func ParseAddress(address string) (*Address, error) {
-	return (&addrParser{s: address}).parseAddress()
-}
-
-// ParseAddressList parses the given string as a list of addresses.
-func ParseAddressList(list string) ([]*Address, error) {
-	return (&addrParser{s: list}).parseAddressList()
-}
-
-// An AddressParser is an RFC 5322 address parser.
-type AddressParser struct {
-	// WordDecoder optionally specifies a decoder for RFC 2047 encoded-words.
-	WordDecoder *mime.WordDecoder
-}
-
-// Parse parses a single RFC 5322 address of the
-// form "Gogh Fir <gf@example.com>" or "foo@example.com".
-func (p *AddressParser) Parse(address string) (*Address, error) {
-	return (&addrParser{s: address, dec: p.WordDecoder}).parseAddress()
-}
-
-// ParseList parses the given string as a list of comma-separated addresses
-// of the form "Gogh Fir <gf@example.com>" or "foo@example.com".
-func (p *AddressParser) ParseList(list string) ([]*Address, error) {
-	return (&addrParser{s: list, dec: p.WordDecoder}).parseAddressList()
-}
-
-// String formats the address as a valid RFC 5322 address.
-// If the address's name contains non-ASCII characters
-// the name will be rendered according to RFC 2047.
-func (a *Address) String() string {
-
-	// Format address local@domain
-	at := strings.LastIndex(a.Address, "@")
-	var local, domain string
-	if at < 0 {
-		// This is a malformed address ("@" is required in addr-spec);
-		// treat the whole address as local-part.
-		local = a.Address
-	} else {
-		local, domain = a.Address[:at], a.Address[at+1:]
-	}
-
-	// Add quotes if needed
-	// TODO: rendering quoted local part and rendering printable name
-	//       should be merged in helper function.
-	quoteLocal := false
-	for i := 0; i < len(local); i++ {
-		ch := local[i]
-		if isAtext(ch, false) {
-			continue
-		}
-		if ch == '.' {
-			// Dots are okay if they are surrounded by atext.
-			// We only need to check that the previous byte is
-			// not a dot, and this isn't the end of the string.
-			if i > 0 && local[i-1] != '.' && i < len(local)-1 {
-				continue
-			}
-		}
-		quoteLocal = true
-		break
-	}
-	if quoteLocal {
-		local = quoteString(local)
-
-	}
-
-	s := "<" + local + "@" + domain + ">"
-
-	if a.Name == "" {
-		return s
-	}
-
-	// If every character is printable ASCII, quoting is simple.
-	allPrintable := true
-	for i := 0; i < len(a.Name); i++ {
-		// isWSP here should actually be isFWS,
-		// but we don't support folding yet.
-		if !isVchar(a.Name[i]) && !isWSP(a.Name[i]) {
-			allPrintable = false
-			break
-		}
-	}
-	if allPrintable {
-		b := bytes.NewBufferString(`"`)
-		for i := 0; i < len(a.Name); i++ {
-			if !isQtext(a.Name[i]) && !isWSP(a.Name[i]) {
-				b.WriteByte('\\')
-			}
-			b.WriteByte(a.Name[i])
-		}
-		b.WriteString(`" `)
-		b.WriteString(s)
-		return b.String()
-	}
-
-	return mime.QEncoding.Encode("utf-8", a.Name) + " " + s
-}
-
-type addrParser struct {
-	s   string
-	dec *mime.WordDecoder // may be nil
-}
-
-func (p *addrParser) parseAddressList() ([]*Address, error) {
-	var list []*Address
-	for {
-		p.skipSpace()
-		addr, err := p.parseAddress()
-		if err != nil {
-			return nil, err
-		}
-		list = append(list, addr)
-
-		p.skipSpace()
-		if p.empty() {
-			break
-		}
-		if !p.consume(',') {
-			return nil, errors.New("mail: expected comma")
-		}
-	}
-	return list, nil
-}
-
-// parseAddress parses a single RFC 5322 address at the start of p.
-func (p *addrParser) parseAddress() (addr *Address, err error) {
-	debug.Printf("parseAddress: %q", p.s)
-	p.skipSpace()
-	if p.empty() {
-		return nil, errors.New("mail: no address")
-	}
-
-	// address = name-addr / addr-spec
-	// TODO(dsymonds): Support parsing group address.
-
-	// addr-spec has a more restricted grammar than name-addr,
-	// so try parsing it first, and fallback to name-addr.
-	// TODO(dsymonds): Is this really correct?
-	spec, err := p.consumeAddrSpec()
-	if err == nil {
-		return &Address{
-			Address: spec,
-		}, err
-	}
-	debug.Printf("parseAddress: not an addr-spec: %v", err)
-	debug.Printf("parseAddress: state is now %q", p.s)
-
-	// display-name
-	var displayName string
-	if p.peek() != '<' {
-		displayName, err = p.consumePhrase()
-		if err != nil {
-			return nil, err
-		}
-	}
-	debug.Printf("parseAddress: displayName=%q", displayName)
-
-	// angle-addr = "<" addr-spec ">"
-	p.skipSpace()
-	if !p.consume('<') {
-		return nil, errors.New("mail: no angle-addr")
-	}
-	spec, err = p.consumeAddrSpec()
-	if err != nil {
-		return nil, err
-	}
-	if !p.consume('>') {
-		return nil, errors.New("mail: unclosed angle-addr")
-	}
-	debug.Printf("parseAddress: spec=%q", spec)
-
-	return &Address{
-		Name:    displayName,
-		Address: spec,
-	}, nil
-}
-
-// consumeAddrSpec parses a single RFC 5322 addr-spec at the start of p.
-func (p *addrParser) consumeAddrSpec() (spec string, err error) {
-	debug.Printf("consumeAddrSpec: %q", p.s)
-
-	orig := *p
-	defer func() {
-		if err != nil {
-			*p = orig
-		}
-	}()
-
-	// local-part = dot-atom / quoted-string
-	var localPart string
-	p.skipSpace()
-	if p.empty() {
-		return "", errors.New("mail: no addr-spec")
-	}
-	if p.peek() == '"' {
-		// quoted-string
-		debug.Printf("consumeAddrSpec: parsing quoted-string")
-		localPart, err = p.consumeQuotedString()
-	} else {
-		// dot-atom
-		debug.Printf("consumeAddrSpec: parsing dot-atom")
-		localPart, err = p.consumeAtom(true, false)
-	}
-	if err != nil {
-		debug.Printf("consumeAddrSpec: failed: %v", err)
-		return "", err
-	}
-
-	if !p.consume('@') {
-		return "", errors.New("mail: missing @ in addr-spec")
-	}
-
-	// domain = dot-atom / domain-literal
-	var domain string
-	p.skipSpace()
-	if p.empty() {
-		return "", errors.New("mail: no domain in addr-spec")
-	}
-	// TODO(dsymonds): Handle domain-literal
-	domain, err = p.consumeAtom(true, false)
-	if err != nil {
-		return "", err
-	}
-
-	return localPart + "@" + domain, nil
-}
-
-// consumePhrase parses the RFC 5322 phrase at the start of p.
-func (p *addrParser) consumePhrase() (phrase string, err error) {
-	debug.Printf("consumePhrase: [%s]", p.s)
-	// phrase = 1*word
-	var words []string
-	for {
-		// word = atom / quoted-string
-		var word string
-		p.skipSpace()
-		if p.empty() {
-			return "", errors.New("mail: missing phrase")
-		}
-		if p.peek() == '"' {
-			// quoted-string
-			word, err = p.consumeQuotedString()
-		} else {
-			// atom
-			// We actually parse dot-atom here to be more permissive
-			// than what RFC 5322 specifies.
-			word, err = p.consumeAtom(true, true)
-		}
-
-		if err == nil {
-			word, err = p.decodeRFC2047Word(word)
-		}
-
-		if err != nil {
-			break
-		}
-		debug.Printf("consumePhrase: consumed %q", word)
-		words = append(words, word)
-	}
-	// Ignore any error if we got at least one word.
-	if err != nil && len(words) == 0 {
-		debug.Printf("consumePhrase: hit err: %v", err)
-		return "", fmt.Errorf("mail: missing word in phrase: %v", err)
-	}
-	phrase = strings.Join(words, " ")
-	return phrase, nil
-}
-
-// consumeQuotedString parses the quoted string at the start of p.
-func (p *addrParser) consumeQuotedString() (qs string, err error) {
-	// Assume first byte is '"'.
-	i := 1
-	qsb := make([]byte, 0, 10)
-Loop:
-	for {
-		if i >= p.len() {
-			return "", errors.New("mail: unclosed quoted-string")
-		}
-		switch c := p.s[i]; {
-		case c == '"':
-			break Loop
-		case c == '\\':
-			if i+1 == p.len() {
-				return "", errors.New("mail: unclosed quoted-string")
-			}
-			qsb = append(qsb, p.s[i+1])
-			i += 2
-		case isQtext(c), c == ' ':
-			// qtext (printable US-ASCII excluding " and \), or
-			// FWS (almost; we're ignoring CRLF)
-			qsb = append(qsb, c)
-			i++
-		default:
-			return "", fmt.Errorf("mail: bad character in quoted-string: %q", c)
-		}
-	}
-	p.s = p.s[i+1:]
-	if len(qsb) == 0 {
-		return "", errors.New("mail: empty quoted-string")
-	}
-	return string(qsb), nil
-}
-
-// consumeAtom parses an RFC 5322 atom at the start of p.
-// If dot is true, consumeAtom parses an RFC 5322 dot-atom instead.
-// If permissive is true, consumeAtom will not fail on
-// leading/trailing/double dots in the atom (see golang.org/issue/4938).
-func (p *addrParser) consumeAtom(dot bool, permissive bool) (atom string, err error) {
-	if !isAtext(p.peek(), false) {
-		return "", errors.New("mail: invalid string")
-	}
-	i := 1
-	for ; i < p.len() && isAtext(p.s[i], dot); i++ {
-	}
-	atom, p.s = string(p.s[:i]), p.s[i:]
-	if !permissive {
-		if strings.HasPrefix(atom, ".") {
-			return "", errors.New("mail: leading dot in atom")
-		}
-		if strings.Contains(atom, "..") {
-			return "", errors.New("mail: double dot in atom")
-		}
-		if strings.HasSuffix(atom, ".") {
-			return "", errors.New("mail: trailing dot in atom")
-		}
-	}
-	return atom, nil
-}
-
-func (p *addrParser) consume(c byte) bool {
-	if p.empty() || p.peek() != c {
-		return false
-	}
-	p.s = p.s[1:]
-	return true
-}
-
-// skipSpace skips the leading space and tab characters.
-func (p *addrParser) skipSpace() {
-	p.s = strings.TrimLeft(p.s, " \t")
-}
-
-func (p *addrParser) peek() byte {
-	return p.s[0]
-}
-
-func (p *addrParser) empty() bool {
-	return p.len() == 0
-}
-
-func (p *addrParser) len() int {
-	return len(p.s)
-}
-
-func (p *addrParser) decodeRFC2047Word(s string) (string, error) {
-	if p.dec != nil {
-		return p.dec.DecodeHeader(s)
-	}
-
-	dec, err := rfc2047Decoder.Decode(s)
-	if err == nil {
-		return dec, nil
-	}
-
-	if _, ok := err.(charsetError); ok {
-		return s, err
-	}
-
-	// Ignore invalid RFC 2047 encoded-word errors.
-	return s, nil
-}
-
-var rfc2047Decoder = mime.WordDecoder{
-	CharsetReader: func(charset string, input io.Reader) (io.Reader, error) {
-		return nil, charsetError(charset)
-	},
-}
-
-type charsetError string
-
-func (e charsetError) Error() string {
-	return fmt.Sprintf("charset not supported: %q", string(e))
-}
-
-var atextChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
-	"abcdefghijklmnopqrstuvwxyz" +
-	"0123456789" +
-	"!#$%&'*+-/=?^_`{|}~")
-
-// isAtext reports whether c is an RFC 5322 atext character.
-// If dot is true, period is included.
-func isAtext(c byte, dot bool) bool {
-	if dot && c == '.' {
-		return true
-	}
-	return bytes.IndexByte(atextChars, c) >= 0
-}
-
-// isQtext reports whether c is an RFC 5322 qtext character.
-func isQtext(c byte) bool {
-	// Printable US-ASCII, excluding backslash or quote.
-	if c == '\\' || c == '"' {
-		return false
-	}
-	return '!' <= c && c <= '~'
-}
-
-// quoteString renders a string as a RFC5322 quoted-string.
-func quoteString(s string) string {
-	var buf bytes.Buffer
-	buf.WriteByte('"')
-	for _, c := range s {
-		ch := byte(c)
-		if isQtext(ch) || isWSP(ch) {
-			buf.WriteByte(ch)
-		} else if isVchar(ch) {
-			buf.WriteByte('\\')
-			buf.WriteByte(ch)
-		}
-	}
-	buf.WriteByte('"')
-	return buf.String()
-}
-
-// isVchar reports whether c is an RFC 5322 VCHAR character.
-func isVchar(c byte) bool {
-	// Visible (printing) characters.
-	return '!' <= c && c <= '~'
-}
-
-// isWSP reports whether c is a WSP (white space).
-// WSP is a space or horizontal tab (RFC5234 Appendix B).
-func isWSP(c byte) bool {
-	return c == ' ' || c == '\t'
-}
diff --git a/third_party/gofrontend/libgo/go/net/mail/message_test.go b/third_party/gofrontend/libgo/go/net/mail/message_test.go
deleted file mode 100644
index 1b42274..0000000
--- a/third_party/gofrontend/libgo/go/net/mail/message_test.go
+++ /dev/null
@@ -1,588 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mail
-
-import (
-	"bytes"
-	"io"
-	"io/ioutil"
-	"mime"
-	"reflect"
-	"strings"
-	"testing"
-	"time"
-)
-
-var parseTests = []struct {
-	in     string
-	header Header
-	body   string
-}{
-	{
-		// RFC 5322, Appendix A.1.1
-		in: `From: John Doe <jdoe@machine.example>
-To: Mary Smith <mary@example.net>
-Subject: Saying Hello
-Date: Fri, 21 Nov 1997 09:55:06 -0600
-Message-ID: <1234@local.machine.example>
-
-This is a message just to say hello.
-So, "Hello".
-`,
-		header: Header{
-			"From":       []string{"John Doe <jdoe@machine.example>"},
-			"To":         []string{"Mary Smith <mary@example.net>"},
-			"Subject":    []string{"Saying Hello"},
-			"Date":       []string{"Fri, 21 Nov 1997 09:55:06 -0600"},
-			"Message-Id": []string{"<1234@local.machine.example>"},
-		},
-		body: "This is a message just to say hello.\nSo, \"Hello\".\n",
-	},
-}
-
-func TestParsing(t *testing.T) {
-	for i, test := range parseTests {
-		msg, err := ReadMessage(bytes.NewBuffer([]byte(test.in)))
-		if err != nil {
-			t.Errorf("test #%d: Failed parsing message: %v", i, err)
-			continue
-		}
-		if !headerEq(msg.Header, test.header) {
-			t.Errorf("test #%d: Incorrectly parsed message header.\nGot:\n%+v\nWant:\n%+v",
-				i, msg.Header, test.header)
-		}
-		body, err := ioutil.ReadAll(msg.Body)
-		if err != nil {
-			t.Errorf("test #%d: Failed reading body: %v", i, err)
-			continue
-		}
-		bodyStr := string(body)
-		if bodyStr != test.body {
-			t.Errorf("test #%d: Incorrectly parsed message body.\nGot:\n%+v\nWant:\n%+v",
-				i, bodyStr, test.body)
-		}
-	}
-}
-
-func headerEq(a, b Header) bool {
-	if len(a) != len(b) {
-		return false
-	}
-	for k, as := range a {
-		bs, ok := b[k]
-		if !ok {
-			return false
-		}
-		if !reflect.DeepEqual(as, bs) {
-			return false
-		}
-	}
-	return true
-}
-
-func TestDateParsing(t *testing.T) {
-	tests := []struct {
-		dateStr string
-		exp     time.Time
-	}{
-		// RFC 5322, Appendix A.1.1
-		{
-			"Fri, 21 Nov 1997 09:55:06 -0600",
-			time.Date(1997, 11, 21, 9, 55, 6, 0, time.FixedZone("", -6*60*60)),
-		},
-		// RFC5322, Appendix A.6.2
-		// Obsolete date.
-		{
-			"21 Nov 97 09:55:06 GMT",
-			time.Date(1997, 11, 21, 9, 55, 6, 0, time.FixedZone("GMT", 0)),
-		},
-		// Commonly found format not specified by RFC 5322.
-		{
-			"Fri, 21 Nov 1997 09:55:06 -0600 (MDT)",
-			time.Date(1997, 11, 21, 9, 55, 6, 0, time.FixedZone("", -6*60*60)),
-		},
-	}
-	for _, test := range tests {
-		hdr := Header{
-			"Date": []string{test.dateStr},
-		}
-		date, err := hdr.Date()
-		if err != nil {
-			t.Errorf("Failed parsing %q: %v", test.dateStr, err)
-			continue
-		}
-		if !date.Equal(test.exp) {
-			t.Errorf("Parse of %q: got %+v, want %+v", test.dateStr, date, test.exp)
-		}
-	}
-}
-
-func TestAddressParsingError(t *testing.T) {
-	const txt = "=?iso-8859-2?Q?Bogl=E1rka_Tak=E1cs?= <unknown@gmail.com>"
-	_, err := ParseAddress(txt)
-	if err == nil || !strings.Contains(err.Error(), "charset not supported") {
-		t.Errorf(`mail.ParseAddress(%q) err: %q, want ".*charset not supported.*"`, txt, err)
-	}
-}
-
-func TestAddressParsing(t *testing.T) {
-	tests := []struct {
-		addrsStr string
-		exp      []*Address
-	}{
-		// Bare address
-		{
-			`jdoe@machine.example`,
-			[]*Address{{
-				Address: "jdoe@machine.example",
-			}},
-		},
-		// RFC 5322, Appendix A.1.1
-		{
-			`John Doe <jdoe@machine.example>`,
-			[]*Address{{
-				Name:    "John Doe",
-				Address: "jdoe@machine.example",
-			}},
-		},
-		// RFC 5322, Appendix A.1.2
-		{
-			`"Joe Q. Public" <john.q.public@example.com>`,
-			[]*Address{{
-				Name:    "Joe Q. Public",
-				Address: "john.q.public@example.com",
-			}},
-		},
-		{
-			`Mary Smith <mary@x.test>, jdoe@example.org, Who? <one@y.test>`,
-			[]*Address{
-				{
-					Name:    "Mary Smith",
-					Address: "mary@x.test",
-				},
-				{
-					Address: "jdoe@example.org",
-				},
-				{
-					Name:    "Who?",
-					Address: "one@y.test",
-				},
-			},
-		},
-		{
-			`<boss@nil.test>, "Giant; \"Big\" Box" <sysservices@example.net>`,
-			[]*Address{
-				{
-					Address: "boss@nil.test",
-				},
-				{
-					Name:    `Giant; "Big" Box`,
-					Address: "sysservices@example.net",
-				},
-			},
-		},
-		// RFC 5322, Appendix A.1.3
-		// TODO(dsymonds): Group addresses.
-
-		// RFC 2047 "Q"-encoded ISO-8859-1 address.
-		{
-			`=?iso-8859-1?q?J=F6rg_Doe?= <joerg@example.com>`,
-			[]*Address{
-				{
-					Name:    `Jörg Doe`,
-					Address: "joerg@example.com",
-				},
-			},
-		},
-		// RFC 2047 "Q"-encoded US-ASCII address. Dumb but legal.
-		{
-			`=?us-ascii?q?J=6Frg_Doe?= <joerg@example.com>`,
-			[]*Address{
-				{
-					Name:    `Jorg Doe`,
-					Address: "joerg@example.com",
-				},
-			},
-		},
-		// RFC 2047 "Q"-encoded UTF-8 address.
-		{
-			`=?utf-8?q?J=C3=B6rg_Doe?= <joerg@example.com>`,
-			[]*Address{
-				{
-					Name:    `Jörg Doe`,
-					Address: "joerg@example.com",
-				},
-			},
-		},
-		// RFC 2047, Section 8.
-		{
-			`=?ISO-8859-1?Q?Andr=E9?= Pirard <PIRARD@vm1.ulg.ac.be>`,
-			[]*Address{
-				{
-					Name:    `André Pirard`,
-					Address: "PIRARD@vm1.ulg.ac.be",
-				},
-			},
-		},
-		// Custom example of RFC 2047 "B"-encoded ISO-8859-1 address.
-		{
-			`=?ISO-8859-1?B?SvZyZw==?= <joerg@example.com>`,
-			[]*Address{
-				{
-					Name:    `Jörg`,
-					Address: "joerg@example.com",
-				},
-			},
-		},
-		// Custom example of RFC 2047 "B"-encoded UTF-8 address.
-		{
-			`=?UTF-8?B?SsO2cmc=?= <joerg@example.com>`,
-			[]*Address{
-				{
-					Name:    `Jörg`,
-					Address: "joerg@example.com",
-				},
-			},
-		},
-		// Custom example with "." in name. For issue 4938
-		{
-			`Asem H. <noreply@example.com>`,
-			[]*Address{
-				{
-					Name:    `Asem H.`,
-					Address: "noreply@example.com",
-				},
-			},
-		},
-	}
-	for _, test := range tests {
-		if len(test.exp) == 1 {
-			addr, err := ParseAddress(test.addrsStr)
-			if err != nil {
-				t.Errorf("Failed parsing (single) %q: %v", test.addrsStr, err)
-				continue
-			}
-			if !reflect.DeepEqual([]*Address{addr}, test.exp) {
-				t.Errorf("Parse (single) of %q: got %+v, want %+v", test.addrsStr, addr, test.exp)
-			}
-		}
-
-		addrs, err := ParseAddressList(test.addrsStr)
-		if err != nil {
-			t.Errorf("Failed parsing (list) %q: %v", test.addrsStr, err)
-			continue
-		}
-		if !reflect.DeepEqual(addrs, test.exp) {
-			t.Errorf("Parse (list) of %q: got %+v, want %+v", test.addrsStr, addrs, test.exp)
-		}
-	}
-}
-
-func TestAddressParser(t *testing.T) {
-	tests := []struct {
-		addrsStr string
-		exp      []*Address
-	}{
-		// Bare address
-		{
-			`jdoe@machine.example`,
-			[]*Address{{
-				Address: "jdoe@machine.example",
-			}},
-		},
-		// RFC 5322, Appendix A.1.1
-		{
-			`John Doe <jdoe@machine.example>`,
-			[]*Address{{
-				Name:    "John Doe",
-				Address: "jdoe@machine.example",
-			}},
-		},
-		// RFC 5322, Appendix A.1.2
-		{
-			`"Joe Q. Public" <john.q.public@example.com>`,
-			[]*Address{{
-				Name:    "Joe Q. Public",
-				Address: "john.q.public@example.com",
-			}},
-		},
-		{
-			`Mary Smith <mary@x.test>, jdoe@example.org, Who? <one@y.test>`,
-			[]*Address{
-				{
-					Name:    "Mary Smith",
-					Address: "mary@x.test",
-				},
-				{
-					Address: "jdoe@example.org",
-				},
-				{
-					Name:    "Who?",
-					Address: "one@y.test",
-				},
-			},
-		},
-		{
-			`<boss@nil.test>, "Giant; \"Big\" Box" <sysservices@example.net>`,
-			[]*Address{
-				{
-					Address: "boss@nil.test",
-				},
-				{
-					Name:    `Giant; "Big" Box`,
-					Address: "sysservices@example.net",
-				},
-			},
-		},
-		// RFC 2047 "Q"-encoded ISO-8859-1 address.
-		{
-			`=?iso-8859-1?q?J=F6rg_Doe?= <joerg@example.com>`,
-			[]*Address{
-				{
-					Name:    `Jörg Doe`,
-					Address: "joerg@example.com",
-				},
-			},
-		},
-		// RFC 2047 "Q"-encoded US-ASCII address. Dumb but legal.
-		{
-			`=?us-ascii?q?J=6Frg_Doe?= <joerg@example.com>`,
-			[]*Address{
-				{
-					Name:    `Jorg Doe`,
-					Address: "joerg@example.com",
-				},
-			},
-		},
-		// RFC 2047 "Q"-encoded ISO-8859-15 address.
-		{
-			`=?ISO-8859-15?Q?J=F6rg_Doe?= <joerg@example.com>`,
-			[]*Address{
-				{
-					Name:    `Jörg Doe`,
-					Address: "joerg@example.com",
-				},
-			},
-		},
-		// RFC 2047 "B"-encoded windows-1252 address.
-		{
-			`=?windows-1252?q?Andr=E9?= Pirard <PIRARD@vm1.ulg.ac.be>`,
-			[]*Address{
-				{
-					Name:    `André Pirard`,
-					Address: "PIRARD@vm1.ulg.ac.be",
-				},
-			},
-		},
-		// Custom example of RFC 2047 "B"-encoded ISO-8859-15 address.
-		{
-			`=?ISO-8859-15?B?SvZyZw==?= <joerg@example.com>`,
-			[]*Address{
-				{
-					Name:    `Jörg`,
-					Address: "joerg@example.com",
-				},
-			},
-		},
-		// Custom example of RFC 2047 "B"-encoded UTF-8 address.
-		{
-			`=?UTF-8?B?SsO2cmc=?= <joerg@example.com>`,
-			[]*Address{
-				{
-					Name:    `Jörg`,
-					Address: "joerg@example.com",
-				},
-			},
-		},
-		// Custom example with "." in name. For issue 4938
-		{
-			`Asem H. <noreply@example.com>`,
-			[]*Address{
-				{
-					Name:    `Asem H.`,
-					Address: "noreply@example.com",
-				},
-			},
-		},
-	}
-
-	ap := AddressParser{WordDecoder: &mime.WordDecoder{
-		CharsetReader: func(charset string, input io.Reader) (io.Reader, error) {
-			in, err := ioutil.ReadAll(input)
-			if err != nil {
-				return nil, err
-			}
-
-			switch charset {
-			case "iso-8859-15":
-				in = bytes.Replace(in, []byte("\xf6"), []byte("ö"), -1)
-			case "windows-1252":
-				in = bytes.Replace(in, []byte("\xe9"), []byte("é"), -1)
-			}
-
-			return bytes.NewReader(in), nil
-		},
-	}}
-
-	for _, test := range tests {
-		if len(test.exp) == 1 {
-			addr, err := ap.Parse(test.addrsStr)
-			if err != nil {
-				t.Errorf("Failed parsing (single) %q: %v", test.addrsStr, err)
-				continue
-			}
-			if !reflect.DeepEqual([]*Address{addr}, test.exp) {
-				t.Errorf("Parse (single) of %q: got %+v, want %+v", test.addrsStr, addr, test.exp)
-			}
-		}
-
-		addrs, err := ap.ParseList(test.addrsStr)
-		if err != nil {
-			t.Errorf("Failed parsing (list) %q: %v", test.addrsStr, err)
-			continue
-		}
-		if !reflect.DeepEqual(addrs, test.exp) {
-			t.Errorf("Parse (list) of %q: got %+v, want %+v", test.addrsStr, addrs, test.exp)
-		}
-	}
-}
-
-func TestAddressFormatting(t *testing.T) {
-	tests := []struct {
-		addr *Address
-		exp  string
-	}{
-		{
-			&Address{Address: "bob@example.com"},
-			"<bob@example.com>",
-		},
-		{ // quoted local parts: RFC 5322, 3.4.1. and 3.2.4.
-			&Address{Address: `my@idiot@address@example.com`},
-			`<"my@idiot@address"@example.com>`,
-		},
-		{ // quoted local parts
-			&Address{Address: ` @example.com`},
-			`<" "@example.com>`,
-		},
-		{
-			&Address{Name: "Bob", Address: "bob@example.com"},
-			`"Bob" <bob@example.com>`,
-		},
-		{
-			// note the ö (o with an umlaut)
-			&Address{Name: "Böb", Address: "bob@example.com"},
-			`=?utf-8?q?B=C3=B6b?= <bob@example.com>`,
-		},
-		{
-			&Address{Name: "Bob Jane", Address: "bob@example.com"},
-			`"Bob Jane" <bob@example.com>`,
-		},
-		{
-			&Address{Name: "Böb Jacöb", Address: "bob@example.com"},
-			`=?utf-8?q?B=C3=B6b_Jac=C3=B6b?= <bob@example.com>`,
-		},
-		{ // https://golang.org/issue/12098
-			&Address{Name: "Rob", Address: ""},
-			`"Rob" <@>`,
-		},
-		{ // https://golang.org/issue/12098
-			&Address{Name: "Rob", Address: "@"},
-			`"Rob" <@>`,
-		},
-	}
-	for _, test := range tests {
-		s := test.addr.String()
-		if s != test.exp {
-			t.Errorf("Address%+v.String() = %v, want %v", *test.addr, s, test.exp)
-		}
-	}
-}
-
-// Check if all valid addresses can be parsed, formatted and parsed again
-func TestAddressParsingAndFormatting(t *testing.T) {
-
-	// Should pass
-	tests := []string{
-		`<Bob@example.com>`,
-		`<bob.bob@example.com>`,
-		`<".bob"@example.com>`,
-		`<" "@example.com>`,
-		`<some.mail-with-dash@example.com>`,
-		`<"dot.and space"@example.com>`,
-		`<"very.unusual.@.unusual.com"@example.com>`,
-		`<admin@mailserver1>`,
-		`<postmaster@localhost>`,
-		"<#!$%&'*+-/=?^_`{}|~@example.org>",
-		`<"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com>`, // escaped quotes
-		`<"()<>[]:,;@\\\"!#$%&'*+-/=?^_{}| ~.a"@example.org>`,                      // escaped backslashes
-		`<"Abc\\@def"@example.com>`,
-		`<"Joe\\Blow"@example.com>`,
-		`<test1/test2=test3@example.com>`,
-		`<def!xyz%abc@example.com>`,
-		`<_somename@example.com>`,
-		`<joe@uk>`,
-		`<~@example.com>`,
-		`<"..."@test.com>`,
-		`<"john..doe"@example.com>`,
-		`<"john.doe."@example.com>`,
-		`<".john.doe"@example.com>`,
-		`<"."@example.com>`,
-		`<".."@example.com>`,
-		`<"0:"@0>`,
-	}
-
-	for _, test := range tests {
-		addr, err := ParseAddress(test)
-		if err != nil {
-			t.Errorf("Couldn't parse address %s: %s", test, err.Error())
-			continue
-		}
-		str := addr.String()
-		addr, err = ParseAddress(str)
-		if err != nil {
-			t.Errorf("ParseAddr(%q) error: %v", test, err)
-			continue
-		}
-
-		if addr.String() != test {
-			t.Errorf("String() round-trip = %q; want %q", addr, test)
-			continue
-		}
-
-	}
-
-	// Should fail
-	badTests := []string{
-		`<Abc.example.com>`,
-		`<A@b@c@example.com>`,
-		`<a"b(c)d,e:f;g<h>i[j\k]l@example.com>`,
-		`<just"not"right@example.com>`,
-		`<this is"not\allowed@example.com>`,
-		`<this\ still\"not\\allowed@example.com>`,
-		`<john..doe@example.com>`,
-		`<john.doe@example..com>`,
-		`<john.doe@example..com>`,
-		`<john.doe.@example.com>`,
-		`<john.doe.@.example.com>`,
-		`<.john.doe@example.com>`,
-		`<@example.com>`,
-		`<.@example.com>`,
-		`<test@.>`,
-		`< @example.com>`,
-		`<""test""blah""@example.com>`,
-		`<""@0>`,
-		"<\"\t0\"@0>",
-	}
-
-	for _, test := range badTests {
-		_, err := ParseAddress(test)
-		if err == nil {
-			t.Errorf("Should have failed to parse address: %s", test)
-			continue
-		}
-
-	}
-
-}
diff --git a/third_party/gofrontend/libgo/go/net/main_cloexec_test.go b/third_party/gofrontend/libgo/go/net/main_cloexec_test.go
deleted file mode 100644
index 7903819..0000000
--- a/third_party/gofrontend/libgo/go/net/main_cloexec_test.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build freebsd linux
-
-package net
-
-func init() {
-	extraTestHookInstallers = append(extraTestHookInstallers, installAccept4TestHook)
-	extraTestHookUninstallers = append(extraTestHookUninstallers, uninstallAccept4TestHook)
-}
-
-var (
-	// Placeholders for saving original socket system calls.
-	origAccept4 = accept4Func
-)
-
-func installAccept4TestHook() {
-	accept4Func = sw.Accept4
-}
-
-func uninstallAccept4TestHook() {
-	accept4Func = origAccept4
-}
diff --git a/third_party/gofrontend/libgo/go/net/main_plan9_test.go b/third_party/gofrontend/libgo/go/net/main_plan9_test.go
deleted file mode 100644
index 94501ca..0000000
--- a/third_party/gofrontend/libgo/go/net/main_plan9_test.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-func installTestHooks() {}
-
-func uninstallTestHooks() {}
-
-func forceCloseSockets() {}
-
-func enableSocketConnect() {}
-
-func disableSocketConnect(network string) {}
diff --git a/third_party/gofrontend/libgo/go/net/main_posix_test.go b/third_party/gofrontend/libgo/go/net/main_posix_test.go
deleted file mode 100644
index ead311c..0000000
--- a/third_party/gofrontend/libgo/go/net/main_posix_test.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package net
-
-import (
-	"net/internal/socktest"
-	"strings"
-	"syscall"
-)
-
-func enableSocketConnect() {
-	sw.Set(socktest.FilterConnect, nil)
-}
-
-func disableSocketConnect(network string) {
-	ss := strings.Split(network, ":")
-	sw.Set(socktest.FilterConnect, func(so *socktest.Status) (socktest.AfterFilter, error) {
-		switch ss[0] {
-		case "tcp4":
-			if so.Cookie.Family() == syscall.AF_INET && so.Cookie.Type() == syscall.SOCK_STREAM {
-				return nil, syscall.EHOSTUNREACH
-			}
-		case "udp4":
-			if so.Cookie.Family() == syscall.AF_INET && so.Cookie.Type() == syscall.SOCK_DGRAM {
-				return nil, syscall.EHOSTUNREACH
-			}
-		case "ip4":
-			if so.Cookie.Family() == syscall.AF_INET && so.Cookie.Type() == syscall.SOCK_RAW {
-				return nil, syscall.EHOSTUNREACH
-			}
-		case "tcp6":
-			if so.Cookie.Family() == syscall.AF_INET6 && so.Cookie.Type() == syscall.SOCK_STREAM {
-				return nil, syscall.EHOSTUNREACH
-			}
-		case "udp6":
-			if so.Cookie.Family() == syscall.AF_INET6 && so.Cookie.Type() == syscall.SOCK_DGRAM {
-				return nil, syscall.EHOSTUNREACH
-			}
-		case "ip6":
-			if so.Cookie.Family() == syscall.AF_INET6 && so.Cookie.Type() == syscall.SOCK_RAW {
-				return nil, syscall.EHOSTUNREACH
-			}
-		}
-		return nil, nil
-	})
-}
diff --git a/third_party/gofrontend/libgo/go/net/main_test.go b/third_party/gofrontend/libgo/go/net/main_test.go
deleted file mode 100644
index f3f8b1a..0000000
--- a/third_party/gofrontend/libgo/go/net/main_test.go
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"flag"
-	"fmt"
-	"net/internal/socktest"
-	"os"
-	"runtime"
-	"sort"
-	"strings"
-	"sync"
-	"testing"
-)
-
-var (
-	sw socktest.Switch
-
-	// uninstallTestHooks runs just before a run of benchmarks.
-	testHookUninstaller sync.Once
-)
-
-var (
-	testDNSFlood = flag.Bool("dnsflood", false, "whether to test DNS query flooding")
-
-	testExternal = flag.Bool("external", true, "allow use of external networks during long test")
-
-	// If external IPv4 connectivity exists, we can try dialing
-	// non-node/interface local scope IPv4 addresses.
-	// On Windows, Lookup APIs may not return IPv4-related
-	// resource records when a node has no external IPv4
-	// connectivity.
-	testIPv4 = flag.Bool("ipv4", true, "assume external IPv4 connectivity exists")
-
-	// If external IPv6 connectivity exists, we can try dialing
-	// non-node/interface local scope IPv6 addresses.
-	// On Windows, Lookup APIs may not return IPv6-related
-	// resource records when a node has no external IPv6
-	// connectivity.
-	testIPv6 = flag.Bool("ipv6", false, "assume external IPv6 connectivity exists")
-)
-
-func TestMain(m *testing.M) {
-	setupTestData()
-	installTestHooks()
-
-	st := m.Run()
-
-	testHookUninstaller.Do(uninstallTestHooks)
-	if testing.Verbose() {
-		printRunningGoroutines()
-		printInflightSockets()
-		printSocketStats()
-	}
-	forceCloseSockets()
-	os.Exit(st)
-}
-
-type ipv6LinkLocalUnicastTest struct {
-	network, address string
-	nameLookup       bool
-}
-
-var (
-	ipv6LinkLocalUnicastTCPTests []ipv6LinkLocalUnicastTest
-	ipv6LinkLocalUnicastUDPTests []ipv6LinkLocalUnicastTest
-)
-
-func setupTestData() {
-	if supportsIPv4 {
-		resolveTCPAddrTests = append(resolveTCPAddrTests, []resolveTCPAddrTest{
-			{"tcp", "localhost:1", &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 1}, nil},
-			{"tcp4", "localhost:2", &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 2}, nil},
-		}...)
-		resolveUDPAddrTests = append(resolveUDPAddrTests, []resolveUDPAddrTest{
-			{"udp", "localhost:1", &UDPAddr{IP: IPv4(127, 0, 0, 1), Port: 1}, nil},
-			{"udp4", "localhost:2", &UDPAddr{IP: IPv4(127, 0, 0, 1), Port: 2}, nil},
-		}...)
-		resolveIPAddrTests = append(resolveIPAddrTests, []resolveIPAddrTest{
-			{"ip", "localhost", &IPAddr{IP: IPv4(127, 0, 0, 1)}, nil},
-			{"ip4", "localhost", &IPAddr{IP: IPv4(127, 0, 0, 1)}, nil},
-		}...)
-	}
-
-	if supportsIPv6 {
-		resolveTCPAddrTests = append(resolveTCPAddrTests, resolveTCPAddrTest{"tcp6", "localhost:3", &TCPAddr{IP: IPv6loopback, Port: 3}, nil})
-		resolveUDPAddrTests = append(resolveUDPAddrTests, resolveUDPAddrTest{"udp6", "localhost:3", &UDPAddr{IP: IPv6loopback, Port: 3}, nil})
-		resolveIPAddrTests = append(resolveIPAddrTests, resolveIPAddrTest{"ip6", "localhost", &IPAddr{IP: IPv6loopback}, nil})
-	}
-
-	ifi := loopbackInterface()
-	if ifi != nil {
-		index := fmt.Sprintf("%v", ifi.Index)
-		resolveTCPAddrTests = append(resolveTCPAddrTests, []resolveTCPAddrTest{
-			{"tcp6", "[fe80::1%" + ifi.Name + "]:1", &TCPAddr{IP: ParseIP("fe80::1"), Port: 1, Zone: zoneToString(ifi.Index)}, nil},
-			{"tcp6", "[fe80::1%" + index + "]:2", &TCPAddr{IP: ParseIP("fe80::1"), Port: 2, Zone: index}, nil},
-		}...)
-		resolveUDPAddrTests = append(resolveUDPAddrTests, []resolveUDPAddrTest{
-			{"udp6", "[fe80::1%" + ifi.Name + "]:1", &UDPAddr{IP: ParseIP("fe80::1"), Port: 1, Zone: zoneToString(ifi.Index)}, nil},
-			{"udp6", "[fe80::1%" + index + "]:2", &UDPAddr{IP: ParseIP("fe80::1"), Port: 2, Zone: index}, nil},
-		}...)
-		resolveIPAddrTests = append(resolveIPAddrTests, []resolveIPAddrTest{
-			{"ip6", "fe80::1%" + ifi.Name, &IPAddr{IP: ParseIP("fe80::1"), Zone: zoneToString(ifi.Index)}, nil},
-			{"ip6", "fe80::1%" + index, &IPAddr{IP: ParseIP("fe80::1"), Zone: index}, nil},
-		}...)
-	}
-
-	addr := ipv6LinkLocalUnicastAddr(ifi)
-	if addr != "" {
-		if runtime.GOOS != "dragonfly" {
-			ipv6LinkLocalUnicastTCPTests = append(ipv6LinkLocalUnicastTCPTests, []ipv6LinkLocalUnicastTest{
-				{"tcp", "[" + addr + "%" + ifi.Name + "]:0", false},
-			}...)
-			ipv6LinkLocalUnicastUDPTests = append(ipv6LinkLocalUnicastUDPTests, []ipv6LinkLocalUnicastTest{
-				{"udp", "[" + addr + "%" + ifi.Name + "]:0", false},
-			}...)
-		}
-		ipv6LinkLocalUnicastTCPTests = append(ipv6LinkLocalUnicastTCPTests, []ipv6LinkLocalUnicastTest{
-			{"tcp6", "[" + addr + "%" + ifi.Name + "]:0", false},
-		}...)
-		ipv6LinkLocalUnicastUDPTests = append(ipv6LinkLocalUnicastUDPTests, []ipv6LinkLocalUnicastTest{
-			{"udp6", "[" + addr + "%" + ifi.Name + "]:0", false},
-		}...)
-		switch runtime.GOOS {
-		case "darwin", "dragonfly", "freebsd", "openbsd", "netbsd":
-			ipv6LinkLocalUnicastTCPTests = append(ipv6LinkLocalUnicastTCPTests, []ipv6LinkLocalUnicastTest{
-				{"tcp", "[localhost%" + ifi.Name + "]:0", true},
-				{"tcp6", "[localhost%" + ifi.Name + "]:0", true},
-			}...)
-			ipv6LinkLocalUnicastUDPTests = append(ipv6LinkLocalUnicastUDPTests, []ipv6LinkLocalUnicastTest{
-				{"udp", "[localhost%" + ifi.Name + "]:0", true},
-				{"udp6", "[localhost%" + ifi.Name + "]:0", true},
-			}...)
-		case "linux":
-			ipv6LinkLocalUnicastTCPTests = append(ipv6LinkLocalUnicastTCPTests, []ipv6LinkLocalUnicastTest{
-				{"tcp", "[ip6-localhost%" + ifi.Name + "]:0", true},
-				{"tcp6", "[ip6-localhost%" + ifi.Name + "]:0", true},
-			}...)
-			ipv6LinkLocalUnicastUDPTests = append(ipv6LinkLocalUnicastUDPTests, []ipv6LinkLocalUnicastTest{
-				{"udp", "[ip6-localhost%" + ifi.Name + "]:0", true},
-				{"udp6", "[ip6-localhost%" + ifi.Name + "]:0", true},
-			}...)
-		}
-	}
-}
-
-func printRunningGoroutines() {
-	gss := runningGoroutines()
-	if len(gss) == 0 {
-		return
-	}
-	fmt.Fprintf(os.Stderr, "Running goroutines:\n")
-	for _, gs := range gss {
-		fmt.Fprintf(os.Stderr, "%v\n", gs)
-	}
-	fmt.Fprintf(os.Stderr, "\n")
-}
-
-// runningGoroutines returns a list of remaining goroutines.
-func runningGoroutines() []string {
-	var gss []string
-	b := make([]byte, 2<<20)
-	b = b[:runtime.Stack(b, true)]
-	for _, s := range strings.Split(string(b), "\n\n") {
-		ss := strings.SplitN(s, "\n", 2)
-		if len(ss) != 2 {
-			continue
-		}
-		stack := strings.TrimSpace(ss[1])
-		if !strings.Contains(stack, "created by net") {
-			continue
-		}
-		gss = append(gss, stack)
-	}
-	sort.Strings(gss)
-	return gss
-}
-
-func printInflightSockets() {
-	sos := sw.Sockets()
-	if len(sos) == 0 {
-		return
-	}
-	fmt.Fprintf(os.Stderr, "Inflight sockets:\n")
-	for s, so := range sos {
-		fmt.Fprintf(os.Stderr, "%v: %v\n", s, so)
-	}
-	fmt.Fprintf(os.Stderr, "\n")
-}
-
-func printSocketStats() {
-	sts := sw.Stats()
-	if len(sts) == 0 {
-		return
-	}
-	fmt.Fprintf(os.Stderr, "Socket statistical information:\n")
-	for _, st := range sts {
-		fmt.Fprintf(os.Stderr, "%v\n", st)
-	}
-	fmt.Fprintf(os.Stderr, "\n")
-}
diff --git a/third_party/gofrontend/libgo/go/net/main_unix_test.go b/third_party/gofrontend/libgo/go/net/main_unix_test.go
deleted file mode 100644
index bfb4cd0..0000000
--- a/third_party/gofrontend/libgo/go/net/main_unix_test.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package net
-
-var (
-	// Placeholders for saving original socket system calls.
-	origSocket        = socketFunc
-	origClose         = closeFunc
-	origConnect       = connectFunc
-	origListen        = listenFunc
-	origAccept        = acceptFunc
-	origGetsockoptInt = getsockoptIntFunc
-
-	extraTestHookInstallers   []func()
-	extraTestHookUninstallers []func()
-)
-
-func installTestHooks() {
-	socketFunc = sw.Socket
-	closeFunc = sw.Close
-	connectFunc = sw.Connect
-	listenFunc = sw.Listen
-	acceptFunc = sw.Accept
-	getsockoptIntFunc = sw.GetsockoptInt
-
-	for _, fn := range extraTestHookInstallers {
-		fn()
-	}
-}
-
-func uninstallTestHooks() {
-	socketFunc = origSocket
-	closeFunc = origClose
-	connectFunc = origConnect
-	listenFunc = origListen
-	acceptFunc = origAccept
-	getsockoptIntFunc = origGetsockoptInt
-
-	for _, fn := range extraTestHookUninstallers {
-		fn()
-	}
-}
-
-func forceCloseSockets() {
-	for s := range sw.Sockets() {
-		closeFunc(s)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/main_windows_test.go b/third_party/gofrontend/libgo/go/net/main_windows_test.go
deleted file mode 100644
index 2d82974..0000000
--- a/third_party/gofrontend/libgo/go/net/main_windows_test.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-var (
-	// Placeholders for saving original socket system calls.
-	origSocket      = socketFunc
-	origClosesocket = closeFunc
-	origConnect     = connectFunc
-	origConnectEx   = connectExFunc
-	origListen      = listenFunc
-)
-
-func installTestHooks() {
-	socketFunc = sw.Socket
-	closeFunc = sw.Closesocket
-	connectFunc = sw.Connect
-	connectExFunc = sw.ConnectEx
-	listenFunc = sw.Listen
-}
-
-func uninstallTestHooks() {
-	socketFunc = origSocket
-	closeFunc = origClosesocket
-	connectFunc = origConnect
-	connectExFunc = origConnectEx
-	listenFunc = origListen
-}
-
-func forceCloseSockets() {
-	for s := range sw.Sockets() {
-		closeFunc(s)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/mockserver_test.go b/third_party/gofrontend/libgo/go/net/mockserver_test.go
deleted file mode 100644
index dd6f4df..0000000
--- a/third_party/gofrontend/libgo/go/net/mockserver_test.go
+++ /dev/null
@@ -1,516 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"errors"
-	"fmt"
-	"io/ioutil"
-	"os"
-	"sync"
-	"testing"
-	"time"
-)
-
-// testUnixAddr uses ioutil.TempFile to get a name that is unique.
-// It also uses /tmp directory in case it is prohibited to create UNIX
-// sockets in TMPDIR.
-func testUnixAddr() string {
-	f, err := ioutil.TempFile("", "go-nettest")
-	if err != nil {
-		panic(err)
-	}
-	addr := f.Name()
-	f.Close()
-	os.Remove(addr)
-	return addr
-}
-
-func newLocalListener(network string) (Listener, error) {
-	switch network {
-	case "tcp", "tcp4", "tcp6":
-		if supportsIPv4 {
-			return Listen("tcp4", "127.0.0.1:0")
-		}
-		if supportsIPv6 {
-			return Listen("tcp6", "[::1]:0")
-		}
-	case "unix", "unixpacket":
-		return Listen(network, testUnixAddr())
-	}
-	return nil, fmt.Errorf("%s is not supported", network)
-}
-
-func newDualStackListener() (lns []*TCPListener, err error) {
-	var args = []struct {
-		network string
-		TCPAddr
-	}{
-		{"tcp4", TCPAddr{IP: IPv4(127, 0, 0, 1)}},
-		{"tcp6", TCPAddr{IP: IPv6loopback}},
-	}
-	for i := 0; i < 64; i++ {
-		var port int
-		var lns []*TCPListener
-		for _, arg := range args {
-			arg.TCPAddr.Port = port
-			ln, err := ListenTCP(arg.network, &arg.TCPAddr)
-			if err != nil {
-				continue
-			}
-			port = ln.Addr().(*TCPAddr).Port
-			lns = append(lns, ln)
-		}
-		if len(lns) != len(args) {
-			for _, ln := range lns {
-				ln.Close()
-			}
-			continue
-		}
-		return lns, nil
-	}
-	return nil, errors.New("no dualstack port available")
-}
-
-type localServer struct {
-	lnmu sync.RWMutex
-	Listener
-	done chan bool // signal that indicates server stopped
-}
-
-func (ls *localServer) buildup(handler func(*localServer, Listener)) error {
-	go func() {
-		handler(ls, ls.Listener)
-		close(ls.done)
-	}()
-	return nil
-}
-
-func (ls *localServer) teardown() error {
-	ls.lnmu.Lock()
-	if ls.Listener != nil {
-		network := ls.Listener.Addr().Network()
-		address := ls.Listener.Addr().String()
-		ls.Listener.Close()
-		<-ls.done
-		ls.Listener = nil
-		switch network {
-		case "unix", "unixpacket":
-			os.Remove(address)
-		}
-	}
-	ls.lnmu.Unlock()
-	return nil
-}
-
-func newLocalServer(network string) (*localServer, error) {
-	ln, err := newLocalListener(network)
-	if err != nil {
-		return nil, err
-	}
-	return &localServer{Listener: ln, done: make(chan bool)}, nil
-}
-
-type streamListener struct {
-	network, address string
-	Listener
-	done chan bool // signal that indicates server stopped
-}
-
-func (sl *streamListener) newLocalServer() (*localServer, error) {
-	return &localServer{Listener: sl.Listener, done: make(chan bool)}, nil
-}
-
-type dualStackServer struct {
-	lnmu sync.RWMutex
-	lns  []streamListener
-	port string
-
-	cmu sync.RWMutex
-	cs  []Conn // established connections at the passive open side
-}
-
-func (dss *dualStackServer) buildup(handler func(*dualStackServer, Listener)) error {
-	for i := range dss.lns {
-		go func(i int) {
-			handler(dss, dss.lns[i].Listener)
-			close(dss.lns[i].done)
-		}(i)
-	}
-	return nil
-}
-
-func (dss *dualStackServer) putConn(c Conn) error {
-	dss.cmu.Lock()
-	dss.cs = append(dss.cs, c)
-	dss.cmu.Unlock()
-	return nil
-}
-
-func (dss *dualStackServer) teardownNetwork(network string) error {
-	dss.lnmu.Lock()
-	for i := range dss.lns {
-		if network == dss.lns[i].network && dss.lns[i].Listener != nil {
-			dss.lns[i].Listener.Close()
-			<-dss.lns[i].done
-			dss.lns[i].Listener = nil
-		}
-	}
-	dss.lnmu.Unlock()
-	return nil
-}
-
-func (dss *dualStackServer) teardown() error {
-	dss.lnmu.Lock()
-	for i := range dss.lns {
-		if dss.lns[i].Listener != nil {
-			dss.lns[i].Listener.Close()
-			<-dss.lns[i].done
-		}
-	}
-	dss.lns = dss.lns[:0]
-	dss.lnmu.Unlock()
-	dss.cmu.Lock()
-	for _, c := range dss.cs {
-		c.Close()
-	}
-	dss.cs = dss.cs[:0]
-	dss.cmu.Unlock()
-	return nil
-}
-
-func newDualStackServer(lns []streamListener) (*dualStackServer, error) {
-	dss := &dualStackServer{lns: lns, port: "0"}
-	for i := range dss.lns {
-		ln, err := Listen(dss.lns[i].network, JoinHostPort(dss.lns[i].address, dss.port))
-		if err != nil {
-			for _, ln := range dss.lns[:i] {
-				ln.Listener.Close()
-			}
-			return nil, err
-		}
-		dss.lns[i].Listener = ln
-		dss.lns[i].done = make(chan bool)
-		if dss.port == "0" {
-			if _, dss.port, err = SplitHostPort(ln.Addr().String()); err != nil {
-				for _, ln := range dss.lns {
-					ln.Listener.Close()
-				}
-				return nil, err
-			}
-		}
-	}
-	return dss, nil
-}
-
-func transponder(ln Listener, ch chan<- error) {
-	defer close(ch)
-
-	switch ln := ln.(type) {
-	case *TCPListener:
-		ln.SetDeadline(time.Now().Add(someTimeout))
-	case *UnixListener:
-		ln.SetDeadline(time.Now().Add(someTimeout))
-	}
-	c, err := ln.Accept()
-	if err != nil {
-		if perr := parseAcceptError(err); perr != nil {
-			ch <- perr
-		}
-		ch <- err
-		return
-	}
-	defer c.Close()
-
-	network := ln.Addr().Network()
-	if c.LocalAddr().Network() != network || c.LocalAddr().Network() != network {
-		ch <- fmt.Errorf("got %v->%v; expected %v->%v", c.LocalAddr().Network(), c.RemoteAddr().Network(), network, network)
-		return
-	}
-	c.SetDeadline(time.Now().Add(someTimeout))
-	c.SetReadDeadline(time.Now().Add(someTimeout))
-	c.SetWriteDeadline(time.Now().Add(someTimeout))
-
-	b := make([]byte, 256)
-	n, err := c.Read(b)
-	if err != nil {
-		if perr := parseReadError(err); perr != nil {
-			ch <- perr
-		}
-		ch <- err
-		return
-	}
-	if _, err := c.Write(b[:n]); err != nil {
-		if perr := parseWriteError(err); perr != nil {
-			ch <- perr
-		}
-		ch <- err
-		return
-	}
-}
-
-func transceiver(c Conn, wb []byte, ch chan<- error) {
-	defer close(ch)
-
-	c.SetDeadline(time.Now().Add(someTimeout))
-	c.SetReadDeadline(time.Now().Add(someTimeout))
-	c.SetWriteDeadline(time.Now().Add(someTimeout))
-
-	n, err := c.Write(wb)
-	if err != nil {
-		if perr := parseWriteError(err); perr != nil {
-			ch <- perr
-		}
-		ch <- err
-		return
-	}
-	if n != len(wb) {
-		ch <- fmt.Errorf("wrote %d; want %d", n, len(wb))
-	}
-	rb := make([]byte, len(wb))
-	n, err = c.Read(rb)
-	if err != nil {
-		if perr := parseReadError(err); perr != nil {
-			ch <- perr
-		}
-		ch <- err
-		return
-	}
-	if n != len(wb) {
-		ch <- fmt.Errorf("read %d; want %d", n, len(wb))
-	}
-}
-
-func timeoutReceiver(c Conn, d, min, max time.Duration, ch chan<- error) {
-	var err error
-	defer func() { ch <- err }()
-
-	t0 := time.Now()
-	if err = c.SetReadDeadline(time.Now().Add(d)); err != nil {
-		return
-	}
-	b := make([]byte, 256)
-	var n int
-	n, err = c.Read(b)
-	t1 := time.Now()
-	if n != 0 || err == nil || !err.(Error).Timeout() {
-		err = fmt.Errorf("Read did not return (0, timeout): (%d, %v)", n, err)
-		return
-	}
-	if dt := t1.Sub(t0); min > dt || dt > max && !testing.Short() {
-		err = fmt.Errorf("Read took %s; expected %s", dt, d)
-		return
-	}
-}
-
-func timeoutTransmitter(c Conn, d, min, max time.Duration, ch chan<- error) {
-	var err error
-	defer func() { ch <- err }()
-
-	t0 := time.Now()
-	if err = c.SetWriteDeadline(time.Now().Add(d)); err != nil {
-		return
-	}
-	var n int
-	for {
-		n, err = c.Write([]byte("TIMEOUT TRANSMITTER"))
-		if err != nil {
-			break
-		}
-	}
-	t1 := time.Now()
-	if err == nil || !err.(Error).Timeout() {
-		err = fmt.Errorf("Write did not return (any, timeout): (%d, %v)", n, err)
-		return
-	}
-	if dt := t1.Sub(t0); min > dt || dt > max && !testing.Short() {
-		err = fmt.Errorf("Write took %s; expected %s", dt, d)
-		return
-	}
-}
-
-func newLocalPacketListener(network string) (PacketConn, error) {
-	switch network {
-	case "udp", "udp4", "udp6":
-		if supportsIPv4 {
-			return ListenPacket("udp4", "127.0.0.1:0")
-		}
-		if supportsIPv6 {
-			return ListenPacket("udp6", "[::1]:0")
-		}
-	case "unixgram":
-		return ListenPacket(network, testUnixAddr())
-	}
-	return nil, fmt.Errorf("%s is not supported", network)
-}
-
-func newDualStackPacketListener() (cs []*UDPConn, err error) {
-	var args = []struct {
-		network string
-		UDPAddr
-	}{
-		{"udp4", UDPAddr{IP: IPv4(127, 0, 0, 1)}},
-		{"udp6", UDPAddr{IP: IPv6loopback}},
-	}
-	for i := 0; i < 64; i++ {
-		var port int
-		var cs []*UDPConn
-		for _, arg := range args {
-			arg.UDPAddr.Port = port
-			c, err := ListenUDP(arg.network, &arg.UDPAddr)
-			if err != nil {
-				continue
-			}
-			port = c.LocalAddr().(*UDPAddr).Port
-			cs = append(cs, c)
-		}
-		if len(cs) != len(args) {
-			for _, c := range cs {
-				c.Close()
-			}
-			continue
-		}
-		return cs, nil
-	}
-	return nil, errors.New("no dualstack port available")
-}
-
-type localPacketServer struct {
-	pcmu sync.RWMutex
-	PacketConn
-	done chan bool // signal that indicates server stopped
-}
-
-func (ls *localPacketServer) buildup(handler func(*localPacketServer, PacketConn)) error {
-	go func() {
-		handler(ls, ls.PacketConn)
-		close(ls.done)
-	}()
-	return nil
-}
-
-func (ls *localPacketServer) teardown() error {
-	ls.pcmu.Lock()
-	if ls.PacketConn != nil {
-		network := ls.PacketConn.LocalAddr().Network()
-		address := ls.PacketConn.LocalAddr().String()
-		ls.PacketConn.Close()
-		<-ls.done
-		ls.PacketConn = nil
-		switch network {
-		case "unixgram":
-			os.Remove(address)
-		}
-	}
-	ls.pcmu.Unlock()
-	return nil
-}
-
-func newLocalPacketServer(network string) (*localPacketServer, error) {
-	c, err := newLocalPacketListener(network)
-	if err != nil {
-		return nil, err
-	}
-	return &localPacketServer{PacketConn: c, done: make(chan bool)}, nil
-}
-
-type packetListener struct {
-	PacketConn
-}
-
-func (pl *packetListener) newLocalServer() (*localPacketServer, error) {
-	return &localPacketServer{PacketConn: pl.PacketConn, done: make(chan bool)}, nil
-}
-
-func packetTransponder(c PacketConn, ch chan<- error) {
-	defer close(ch)
-
-	c.SetDeadline(time.Now().Add(someTimeout))
-	c.SetReadDeadline(time.Now().Add(someTimeout))
-	c.SetWriteDeadline(time.Now().Add(someTimeout))
-
-	b := make([]byte, 256)
-	n, peer, err := c.ReadFrom(b)
-	if err != nil {
-		if perr := parseReadError(err); perr != nil {
-			ch <- perr
-		}
-		ch <- err
-		return
-	}
-	if peer == nil { // for connected-mode sockets
-		switch c.LocalAddr().Network() {
-		case "udp":
-			peer, err = ResolveUDPAddr("udp", string(b[:n]))
-		case "unixgram":
-			peer, err = ResolveUnixAddr("unixgram", string(b[:n]))
-		}
-		if err != nil {
-			ch <- err
-			return
-		}
-	}
-	if _, err := c.WriteTo(b[:n], peer); err != nil {
-		if perr := parseWriteError(err); perr != nil {
-			ch <- perr
-		}
-		ch <- err
-		return
-	}
-}
-
-func packetTransceiver(c PacketConn, wb []byte, dst Addr, ch chan<- error) {
-	defer close(ch)
-
-	c.SetDeadline(time.Now().Add(someTimeout))
-	c.SetReadDeadline(time.Now().Add(someTimeout))
-	c.SetWriteDeadline(time.Now().Add(someTimeout))
-
-	n, err := c.WriteTo(wb, dst)
-	if err != nil {
-		if perr := parseWriteError(err); perr != nil {
-			ch <- perr
-		}
-		ch <- err
-		return
-	}
-	if n != len(wb) {
-		ch <- fmt.Errorf("wrote %d; want %d", n, len(wb))
-	}
-	rb := make([]byte, len(wb))
-	n, _, err = c.ReadFrom(rb)
-	if err != nil {
-		if perr := parseReadError(err); perr != nil {
-			ch <- perr
-		}
-		ch <- err
-		return
-	}
-	if n != len(wb) {
-		ch <- fmt.Errorf("read %d; want %d", n, len(wb))
-	}
-}
-
-func timeoutPacketReceiver(c PacketConn, d, min, max time.Duration, ch chan<- error) {
-	var err error
-	defer func() { ch <- err }()
-
-	t0 := time.Now()
-	if err = c.SetReadDeadline(time.Now().Add(d)); err != nil {
-		return
-	}
-	b := make([]byte, 256)
-	var n int
-	n, _, err = c.ReadFrom(b)
-	t1 := time.Now()
-	if n != 0 || err == nil || !err.(Error).Timeout() {
-		err = fmt.Errorf("ReadFrom did not return (0, timeout): (%d, %v)", n, err)
-		return
-	}
-	if dt := t1.Sub(t0); min > dt || dt > max && !testing.Short() {
-		err = fmt.Errorf("ReadFrom took %s; expected %s", dt, d)
-		return
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/net.go b/third_party/gofrontend/libgo/go/net/net.go
deleted file mode 100644
index 6e84c3a..0000000
--- a/third_party/gofrontend/libgo/go/net/net.go
+++ /dev/null
@@ -1,576 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package net provides a portable interface for network I/O, including
-TCP/IP, UDP, domain name resolution, and Unix domain sockets.
-
-Although the package provides access to low-level networking
-primitives, most clients will need only the basic interface provided
-by the Dial, Listen, and Accept functions and the associated
-Conn and Listener interfaces. The crypto/tls package uses
-the same interfaces and similar Dial and Listen functions.
-
-The Dial function connects to a server:
-
-	conn, err := net.Dial("tcp", "google.com:80")
-	if err != nil {
-		// handle error
-	}
-	fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
-	status, err := bufio.NewReader(conn).ReadString('\n')
-	// ...
-
-The Listen function creates servers:
-
-	ln, err := net.Listen("tcp", ":8080")
-	if err != nil {
-		// handle error
-	}
-	for {
-		conn, err := ln.Accept()
-		if err != nil {
-			// handle error
-		}
-		go handleConnection(conn)
-	}
-
-Name Resolution
-
-The method for resolving domain names, whether indirectly with functions like Dial
-or directly with functions like LookupHost and LookupAddr, varies by operating system.
-
-On Unix systems, the resolver has two options for resolving names.
-It can use a pure Go resolver that sends DNS requests directly to the servers
-listed in /etc/resolv.conf, or it can use a cgo-based resolver that calls C
-library routines such as getaddrinfo and getnameinfo.
-
-By default the pure Go resolver is used, because a blocked DNS request consumes
-only a goroutine, while a blocked C call consumes an operating system thread.
-When cgo is available, the cgo-based resolver is used instead under a variety of
-conditions: on systems that do not let programs make direct DNS requests (OS X),
-when the LOCALDOMAIN environment variable is present (even if empty),
-when the RES_OPTIONS or HOSTALIASES environment variable is non-empty,
-when the ASR_CONFIG environment variable is non-empty (OpenBSD only),
-when /etc/resolv.conf or /etc/nsswitch.conf specify the use of features that the
-Go resolver does not implement, and when the name being looked up ends in .local
-or is an mDNS name.
-
-The resolver decision can be overridden by setting the netdns value of the
-GODEBUG environment variable (see package runtime) to go or cgo, as in:
-
-	export GODEBUG=netdns=go    # force pure Go resolver
-	export GODEBUG=netdns=cgo   # force cgo resolver
-
-The decision can also be forced while building the Go source tree
-by setting the netgo or netcgo build tag.
-
-A numeric netdns setting, as in GODEBUG=netdns=1, causes the resolver
-to print debugging information about its decisions.
-To force a particular resolver while also printing debugging information,
-join the two settings by a plus sign, as in GODEBUG=netdns=go+1.
-
-On Plan 9, the resolver always accesses /net/cs and /net/dns.
-
-On Windows, the resolver always uses C library functions, such as GetAddrInfo and DnsQuery.
-
-*/
-package net
-
-import (
-	"errors"
-	"io"
-	"os"
-	"syscall"
-	"time"
-)
-
-// netGo and netCgo contain the state of the build tags used
-// to build this binary, and whether cgo is available.
-// conf.go mirrors these into conf for easier testing.
-var (
-	netGo  bool // set true in cgo_stub.go for build tag "netgo" (or no cgo)
-	netCgo bool // set true in conf_netcgo.go for build tag "netcgo"
-)
-
-func init() {
-	sysInit()
-	supportsIPv4 = probeIPv4Stack()
-	supportsIPv6, supportsIPv4map = probeIPv6Stack()
-}
-
-// Addr represents a network end point address.
-type Addr interface {
-	Network() string // name of the network
-	String() string  // string form of address
-}
-
-// Conn is a generic stream-oriented network connection.
-//
-// Multiple goroutines may invoke methods on a Conn simultaneously.
-type Conn interface {
-	// Read reads data from the connection.
-	// Read can be made to time out and return a Error with Timeout() == true
-	// after a fixed time limit; see SetDeadline and SetReadDeadline.
-	Read(b []byte) (n int, err error)
-
-	// Write writes data to the connection.
-	// Write can be made to time out and return a Error with Timeout() == true
-	// after a fixed time limit; see SetDeadline and SetWriteDeadline.
-	Write(b []byte) (n int, err error)
-
-	// Close closes the connection.
-	// Any blocked Read or Write operations will be unblocked and return errors.
-	Close() error
-
-	// LocalAddr returns the local network address.
-	LocalAddr() Addr
-
-	// RemoteAddr returns the remote network address.
-	RemoteAddr() Addr
-
-	// SetDeadline sets the read and write deadlines associated
-	// with the connection. It is equivalent to calling both
-	// SetReadDeadline and SetWriteDeadline.
-	//
-	// A deadline is an absolute time after which I/O operations
-	// fail with a timeout (see type Error) instead of
-	// blocking. The deadline applies to all future I/O, not just
-	// the immediately following call to Read or Write.
-	//
-	// An idle timeout can be implemented by repeatedly extending
-	// the deadline after successful Read or Write calls.
-	//
-	// A zero value for t means I/O operations will not time out.
-	SetDeadline(t time.Time) error
-
-	// SetReadDeadline sets the deadline for future Read calls.
-	// A zero value for t means Read will not time out.
-	SetReadDeadline(t time.Time) error
-
-	// SetWriteDeadline sets the deadline for future Write calls.
-	// Even if write times out, it may return n > 0, indicating that
-	// some of the data was successfully written.
-	// A zero value for t means Write will not time out.
-	SetWriteDeadline(t time.Time) error
-}
-
-type conn struct {
-	fd *netFD
-}
-
-func (c *conn) ok() bool { return c != nil && c.fd != nil }
-
-// Implementation of the Conn interface.
-
-// Read implements the Conn Read method.
-func (c *conn) Read(b []byte) (int, error) {
-	if !c.ok() {
-		return 0, syscall.EINVAL
-	}
-	n, err := c.fd.Read(b)
-	if err != nil && err != io.EOF {
-		err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return n, err
-}
-
-// Write implements the Conn Write method.
-func (c *conn) Write(b []byte) (int, error) {
-	if !c.ok() {
-		return 0, syscall.EINVAL
-	}
-	n, err := c.fd.Write(b)
-	if err != nil {
-		err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return n, err
-}
-
-// Close closes the connection.
-func (c *conn) Close() error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	err := c.fd.Close()
-	if err != nil {
-		err = &OpError{Op: "close", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return err
-}
-
-// LocalAddr returns the local network address.
-// The Addr returned is shared by all invocations of LocalAddr, so
-// do not modify it.
-func (c *conn) LocalAddr() Addr {
-	if !c.ok() {
-		return nil
-	}
-	return c.fd.laddr
-}
-
-// RemoteAddr returns the remote network address.
-// The Addr returned is shared by all invocations of RemoteAddr, so
-// do not modify it.
-func (c *conn) RemoteAddr() Addr {
-	if !c.ok() {
-		return nil
-	}
-	return c.fd.raddr
-}
-
-// SetDeadline implements the Conn SetDeadline method.
-func (c *conn) SetDeadline(t time.Time) error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	if err := c.fd.setDeadline(t); err != nil {
-		return &OpError{Op: "set", Net: c.fd.net, Source: nil, Addr: c.fd.laddr, Err: err}
-	}
-	return nil
-}
-
-// SetReadDeadline implements the Conn SetReadDeadline method.
-func (c *conn) SetReadDeadline(t time.Time) error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	if err := c.fd.setReadDeadline(t); err != nil {
-		return &OpError{Op: "set", Net: c.fd.net, Source: nil, Addr: c.fd.laddr, Err: err}
-	}
-	return nil
-}
-
-// SetWriteDeadline implements the Conn SetWriteDeadline method.
-func (c *conn) SetWriteDeadline(t time.Time) error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	if err := c.fd.setWriteDeadline(t); err != nil {
-		return &OpError{Op: "set", Net: c.fd.net, Source: nil, Addr: c.fd.laddr, Err: err}
-	}
-	return nil
-}
-
-// SetReadBuffer sets the size of the operating system's
-// receive buffer associated with the connection.
-func (c *conn) SetReadBuffer(bytes int) error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	if err := setReadBuffer(c.fd, bytes); err != nil {
-		return &OpError{Op: "set", Net: c.fd.net, Source: nil, Addr: c.fd.laddr, Err: err}
-	}
-	return nil
-}
-
-// SetWriteBuffer sets the size of the operating system's
-// transmit buffer associated with the connection.
-func (c *conn) SetWriteBuffer(bytes int) error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	if err := setWriteBuffer(c.fd, bytes); err != nil {
-		return &OpError{Op: "set", Net: c.fd.net, Source: nil, Addr: c.fd.laddr, Err: err}
-	}
-	return nil
-}
-
-// File sets the underlying os.File to blocking mode and returns a copy.
-// It is the caller's responsibility to close f when finished.
-// Closing c does not affect f, and closing f does not affect c.
-//
-// The returned os.File's file descriptor is different from the connection's.
-// Attempting to change properties of the original using this duplicate
-// may or may not have the desired effect.
-func (c *conn) File() (f *os.File, err error) {
-	f, err = c.fd.dup()
-	if err != nil {
-		err = &OpError{Op: "file", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return
-}
-
-// PacketConn is a generic packet-oriented network connection.
-//
-// Multiple goroutines may invoke methods on a PacketConn simultaneously.
-type PacketConn interface {
-	// ReadFrom reads a packet from the connection,
-	// copying the payload into b.  It returns the number of
-	// bytes copied into b and the return address that
-	// was on the packet.
-	// ReadFrom can be made to time out and return
-	// an error with Timeout() == true after a fixed time limit;
-	// see SetDeadline and SetReadDeadline.
-	ReadFrom(b []byte) (n int, addr Addr, err error)
-
-	// WriteTo writes a packet with payload b to addr.
-	// WriteTo can be made to time out and return
-	// an error with Timeout() == true after a fixed time limit;
-	// see SetDeadline and SetWriteDeadline.
-	// On packet-oriented connections, write timeouts are rare.
-	WriteTo(b []byte, addr Addr) (n int, err error)
-
-	// Close closes the connection.
-	// Any blocked ReadFrom or WriteTo operations will be unblocked and return errors.
-	Close() error
-
-	// LocalAddr returns the local network address.
-	LocalAddr() Addr
-
-	// SetDeadline sets the read and write deadlines associated
-	// with the connection.
-	SetDeadline(t time.Time) error
-
-	// SetReadDeadline sets the deadline for future Read calls.
-	// If the deadline is reached, Read will fail with a timeout
-	// (see type Error) instead of blocking.
-	// A zero value for t means Read will not time out.
-	SetReadDeadline(t time.Time) error
-
-	// SetWriteDeadline sets the deadline for future Write calls.
-	// If the deadline is reached, Write will fail with a timeout
-	// (see type Error) instead of blocking.
-	// A zero value for t means Write will not time out.
-	// Even if write times out, it may return n > 0, indicating that
-	// some of the data was successfully written.
-	SetWriteDeadline(t time.Time) error
-}
-
-var listenerBacklog = maxListenerBacklog()
-
-// A Listener is a generic network listener for stream-oriented protocols.
-//
-// Multiple goroutines may invoke methods on a Listener simultaneously.
-type Listener interface {
-	// Accept waits for and returns the next connection to the listener.
-	Accept() (c Conn, err error)
-
-	// Close closes the listener.
-	// Any blocked Accept operations will be unblocked and return errors.
-	Close() error
-
-	// Addr returns the listener's network address.
-	Addr() Addr
-}
-
-// An Error represents a network error.
-type Error interface {
-	error
-	Timeout() bool   // Is the error a timeout?
-	Temporary() bool // Is the error temporary?
-}
-
-// Various errors contained in OpError.
-var (
-	// For connection setup and write operations.
-	errMissingAddress = errors.New("missing address")
-
-	// For both read and write operations.
-	errTimeout          error = &timeoutError{}
-	errCanceled               = errors.New("operation was canceled")
-	errClosing                = errors.New("use of closed network connection")
-	ErrWriteToConnected       = errors.New("use of WriteTo with pre-connected connection")
-)
-
-// OpError is the error type usually returned by functions in the net
-// package. It describes the operation, network type, and address of
-// an error.
-type OpError struct {
-	// Op is the operation which caused the error, such as
-	// "read" or "write".
-	Op string
-
-	// Net is the network type on which this error occurred,
-	// such as "tcp" or "udp6".
-	Net string
-
-	// For operations involving a remote network connection, like
-	// Dial, Read, or Write, Source is the corresponding local
-	// network address.
-	Source Addr
-
-	// Addr is the network address for which this error occurred.
-	// For local operations, like Listen or SetDeadline, Addr is
-	// the address of the local endpoint being manipulated.
-	// For operations involving a remote network connection, like
-	// Dial, Read, or Write, Addr is the remote address of that
-	// connection.
-	Addr Addr
-
-	// Err is the error that occurred during the operation.
-	Err error
-}
-
-func (e *OpError) Error() string {
-	if e == nil {
-		return "<nil>"
-	}
-	s := e.Op
-	if e.Net != "" {
-		s += " " + e.Net
-	}
-	if e.Source != nil {
-		s += " " + e.Source.String()
-	}
-	if e.Addr != nil {
-		if e.Source != nil {
-			s += "->"
-		} else {
-			s += " "
-		}
-		s += e.Addr.String()
-	}
-	s += ": " + e.Err.Error()
-	return s
-}
-
-var noDeadline = time.Time{}
-
-type timeout interface {
-	Timeout() bool
-}
-
-func (e *OpError) Timeout() bool {
-	if ne, ok := e.Err.(*os.SyscallError); ok {
-		t, ok := ne.Err.(timeout)
-		return ok && t.Timeout()
-	}
-	t, ok := e.Err.(timeout)
-	return ok && t.Timeout()
-}
-
-type temporary interface {
-	Temporary() bool
-}
-
-func (e *OpError) Temporary() bool {
-	if ne, ok := e.Err.(*os.SyscallError); ok {
-		t, ok := ne.Err.(temporary)
-		return ok && t.Temporary()
-	}
-	t, ok := e.Err.(temporary)
-	return ok && t.Temporary()
-}
-
-type timeoutError struct{}
-
-func (e *timeoutError) Error() string   { return "i/o timeout" }
-func (e *timeoutError) Timeout() bool   { return true }
-func (e *timeoutError) Temporary() bool { return true }
-
-// A ParseError is the error type of literal network address parsers.
-type ParseError struct {
-	// Type is the type of string that was expected, such as
-	// "IP address", "CIDR address".
-	Type string
-
-	// Text is the malformed text string.
-	Text string
-}
-
-func (e *ParseError) Error() string { return "invalid " + e.Type + ": " + e.Text }
-
-type AddrError struct {
-	Err  string
-	Addr string
-}
-
-func (e *AddrError) Error() string {
-	if e == nil {
-		return "<nil>"
-	}
-	s := e.Err
-	if e.Addr != "" {
-		s += " " + e.Addr
-	}
-	return s
-}
-
-func (e *AddrError) Timeout() bool   { return false }
-func (e *AddrError) Temporary() bool { return false }
-
-type UnknownNetworkError string
-
-func (e UnknownNetworkError) Error() string   { return "unknown network " + string(e) }
-func (e UnknownNetworkError) Timeout() bool   { return false }
-func (e UnknownNetworkError) Temporary() bool { return false }
-
-type InvalidAddrError string
-
-func (e InvalidAddrError) Error() string   { return string(e) }
-func (e InvalidAddrError) Timeout() bool   { return false }
-func (e InvalidAddrError) Temporary() bool { return false }
-
-// DNSConfigError represents an error reading the machine's DNS configuration.
-// (No longer used; kept for compatibility.)
-type DNSConfigError struct {
-	Err error
-}
-
-func (e *DNSConfigError) Error() string   { return "error reading DNS config: " + e.Err.Error() }
-func (e *DNSConfigError) Timeout() bool   { return false }
-func (e *DNSConfigError) Temporary() bool { return false }
-
-// Various errors contained in DNSError.
-var (
-	errNoSuchHost = errors.New("no such host")
-)
-
-// DNSError represents a DNS lookup error.
-type DNSError struct {
-	Err       string // description of the error
-	Name      string // name looked for
-	Server    string // server used
-	IsTimeout bool   // if true, timed out; not all timeouts set this
-}
-
-func (e *DNSError) Error() string {
-	if e == nil {
-		return "<nil>"
-	}
-	s := "lookup " + e.Name
-	if e.Server != "" {
-		s += " on " + e.Server
-	}
-	s += ": " + e.Err
-	return s
-}
-
-// Timeout reports whether the DNS lookup is known to have timed out.
-// This is not always known; a DNS lookup may fail due to a timeout
-// and return a DNSError for which Timeout returns false.
-func (e *DNSError) Timeout() bool { return e.IsTimeout }
-
-// Temporary reports whether the DNS error is known to be temporary.
-// This is not always known; a DNS lookup may fail due to a temporary
-// error and return a DNSError for which Temporary returns false.
-func (e *DNSError) Temporary() bool { return e.IsTimeout }
-
-type writerOnly struct {
-	io.Writer
-}
-
-// Fallback implementation of io.ReaderFrom's ReadFrom, when sendfile isn't
-// applicable.
-func genericReadFrom(w io.Writer, r io.Reader) (n int64, err error) {
-	// Use wrapper to hide existing r.ReadFrom from io.Copy.
-	return io.Copy(writerOnly{w}, r)
-}
-
-// Limit the number of concurrent cgo-using goroutines, because
-// each will block an entire operating system thread. The usual culprit
-// is resolving many DNS names in separate goroutines but the DNS
-// server is not responding. Then the many lookups each use a different
-// thread, and the system or the program runs out of threads.
-
-var threadLimit = make(chan struct{}, 500)
-
-func acquireThread() {
-	threadLimit <- struct{}{}
-}
-
-func releaseThread() {
-	<-threadLimit
-}
diff --git a/third_party/gofrontend/libgo/go/net/net_test.go b/third_party/gofrontend/libgo/go/net/net_test.go
deleted file mode 100644
index 3907ce4..0000000
--- a/third_party/gofrontend/libgo/go/net/net_test.go
+++ /dev/null
@@ -1,256 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"io"
-	"os"
-	"runtime"
-	"testing"
-)
-
-func TestCloseRead(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	for _, network := range []string{"tcp", "unix", "unixpacket"} {
-		if !testableNetwork(network) {
-			t.Logf("skipping %s test", network)
-			continue
-		}
-
-		ln, err := newLocalListener(network)
-		if err != nil {
-			t.Fatal(err)
-		}
-		switch network {
-		case "unix", "unixpacket":
-			defer os.Remove(ln.Addr().String())
-		}
-		defer ln.Close()
-
-		c, err := Dial(ln.Addr().Network(), ln.Addr().String())
-		if err != nil {
-			t.Fatal(err)
-		}
-		switch network {
-		case "unix", "unixpacket":
-			defer os.Remove(c.LocalAddr().String())
-		}
-		defer c.Close()
-
-		switch c := c.(type) {
-		case *TCPConn:
-			err = c.CloseRead()
-		case *UnixConn:
-			err = c.CloseRead()
-		}
-		if err != nil {
-			if perr := parseCloseError(err); perr != nil {
-				t.Error(perr)
-			}
-			t.Fatal(err)
-		}
-		var b [1]byte
-		n, err := c.Read(b[:])
-		if n != 0 || err == nil {
-			t.Fatalf("got (%d, %v); want (0, error)", n, err)
-		}
-	}
-}
-
-func TestCloseWrite(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	handler := func(ls *localServer, ln Listener) {
-		c, err := ln.Accept()
-		if err != nil {
-			t.Error(err)
-			return
-		}
-		defer c.Close()
-
-		var b [1]byte
-		n, err := c.Read(b[:])
-		if n != 0 || err != io.EOF {
-			t.Errorf("got (%d, %v); want (0, io.EOF)", n, err)
-			return
-		}
-		switch c := c.(type) {
-		case *TCPConn:
-			err = c.CloseWrite()
-		case *UnixConn:
-			err = c.CloseWrite()
-		}
-		if err != nil {
-			if perr := parseCloseError(err); perr != nil {
-				t.Error(perr)
-			}
-			t.Error(err)
-			return
-		}
-		n, err = c.Write(b[:])
-		if err == nil {
-			t.Errorf("got (%d, %v); want (any, error)", n, err)
-			return
-		}
-	}
-
-	for _, network := range []string{"tcp", "unix", "unixpacket"} {
-		if !testableNetwork(network) {
-			t.Logf("skipping %s test", network)
-			continue
-		}
-
-		ls, err := newLocalServer(network)
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer ls.teardown()
-		if err := ls.buildup(handler); err != nil {
-			t.Fatal(err)
-		}
-
-		c, err := Dial(ls.Listener.Addr().Network(), ls.Listener.Addr().String())
-		if err != nil {
-			t.Fatal(err)
-		}
-		switch network {
-		case "unix", "unixpacket":
-			defer os.Remove(c.LocalAddr().String())
-		}
-		defer c.Close()
-
-		switch c := c.(type) {
-		case *TCPConn:
-			err = c.CloseWrite()
-		case *UnixConn:
-			err = c.CloseWrite()
-		}
-		if err != nil {
-			if perr := parseCloseError(err); perr != nil {
-				t.Error(perr)
-			}
-			t.Fatal(err)
-		}
-		var b [1]byte
-		n, err := c.Read(b[:])
-		if n != 0 || err != io.EOF {
-			t.Fatalf("got (%d, %v); want (0, io.EOF)", n, err)
-		}
-		n, err = c.Write(b[:])
-		if err == nil {
-			t.Fatalf("got (%d, %v); want (any, error)", n, err)
-		}
-	}
-}
-
-func TestConnClose(t *testing.T) {
-	for _, network := range []string{"tcp", "unix", "unixpacket"} {
-		if !testableNetwork(network) {
-			t.Logf("skipping %s test", network)
-			continue
-		}
-
-		ln, err := newLocalListener(network)
-		if err != nil {
-			t.Fatal(err)
-		}
-		switch network {
-		case "unix", "unixpacket":
-			defer os.Remove(ln.Addr().String())
-		}
-		defer ln.Close()
-
-		c, err := Dial(ln.Addr().Network(), ln.Addr().String())
-		if err != nil {
-			t.Fatal(err)
-		}
-		switch network {
-		case "unix", "unixpacket":
-			defer os.Remove(c.LocalAddr().String())
-		}
-		defer c.Close()
-
-		if err := c.Close(); err != nil {
-			if perr := parseCloseError(err); perr != nil {
-				t.Error(perr)
-			}
-			t.Fatal(err)
-		}
-		var b [1]byte
-		n, err := c.Read(b[:])
-		if n != 0 || err == nil {
-			t.Fatalf("got (%d, %v); want (0, error)", n, err)
-		}
-	}
-}
-
-func TestListenerClose(t *testing.T) {
-	for _, network := range []string{"tcp", "unix", "unixpacket"} {
-		if !testableNetwork(network) {
-			t.Logf("skipping %s test", network)
-			continue
-		}
-
-		ln, err := newLocalListener(network)
-		if err != nil {
-			t.Fatal(err)
-		}
-		switch network {
-		case "unix", "unixpacket":
-			defer os.Remove(ln.Addr().String())
-		}
-		defer ln.Close()
-
-		if err := ln.Close(); err != nil {
-			if perr := parseCloseError(err); perr != nil {
-				t.Error(perr)
-			}
-			t.Fatal(err)
-		}
-		c, err := ln.Accept()
-		if err == nil {
-			c.Close()
-			t.Fatal("should fail")
-		}
-	}
-}
-
-func TestPacketConnClose(t *testing.T) {
-	for _, network := range []string{"udp", "unixgram"} {
-		if !testableNetwork(network) {
-			t.Logf("skipping %s test", network)
-			continue
-		}
-
-		c, err := newLocalPacketListener(network)
-		if err != nil {
-			t.Fatal(err)
-		}
-		switch network {
-		case "unixgram":
-			defer os.Remove(c.LocalAddr().String())
-		}
-		defer c.Close()
-
-		if err := c.Close(); err != nil {
-			if perr := parseCloseError(err); perr != nil {
-				t.Error(perr)
-			}
-			t.Fatal(err)
-		}
-		var b [1]byte
-		n, _, err := c.ReadFrom(b[:])
-		if n != 0 || err == nil {
-			t.Fatalf("got (%d, %v); want (0, error)", n, err)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/newpollserver_rtems.go b/third_party/gofrontend/libgo/go/net/newpollserver_rtems.go
deleted file mode 100644
index 410f932..0000000
--- a/third_party/gofrontend/libgo/go/net/newpollserver_rtems.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-func selfConnectedTCPSocket() (pr, pw *os.File, err error) {
-	// See ../syscall/exec.go for description of ForkLock.
-	syscall.ForkLock.RLock()
-	sockfd, e := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0)
-	if e != 0 {
-		syscall.ForkLock.RUnlock()
-		return nil, nil, os.Errno(e)
-	}
-	syscall.CloseOnExec(sockfd)
-	syscall.ForkLock.RUnlock()
-
-	// Allow reuse of recently-used addresses.
-	syscall.SetsockoptInt(sockfd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
-
-	var laTCP *TCPAddr
-	var la syscall.Sockaddr
-	if laTCP, err = ResolveTCPAddr("127.0.0.1:0"); err != nil {
-	Error:
-		return nil, nil, err
-	}
-	if la, err = laTCP.sockaddr(syscall.AF_INET); err != nil {
-		goto Error
-	}
-	e = syscall.Bind(sockfd, la)
-	if e != 0 {
-	Errno:
-		syscall.Close(sockfd)
-		return nil, nil, os.Errno(e)
-	}
-
-	laddr, _ := syscall.Getsockname(sockfd)
-	e = syscall.Connect(sockfd, laddr)
-	if e != 0 {
-		goto Errno
-	}
-
-	fd := os.NewFile(sockfd, "wakeupSocket")
-	return fd, fd, nil
-}
-
-func newPollServer() (s *pollServer, err error) {
-	s = new(pollServer)
-	s.cr = make(chan *netFD, 1)
-	s.cw = make(chan *netFD, 1)
-	// s.pr and s.pw are indistinguishable.
-	if s.pr, s.pw, err = selfConnectedTCPSocket(); err != nil {
-		return nil, err
-	}
-	var e int
-	if e = syscall.SetNonblock(s.pr.Fd(), true); e != 0 {
-	Errno:
-		err = &os.PathError{"setnonblock", s.pr.Name(), os.Errno(e)}
-	Error:
-		s.pr.Close()
-		return nil, err
-	}
-	if s.poll, err = newpollster(); err != nil {
-		goto Error
-	}
-	if _, err = s.poll.AddFD(s.pr.Fd(), 'r', true); err != nil {
-		s.poll.Close()
-		goto Error
-	}
-	s.pending = make(map[int]*netFD)
-	go s.Run()
-	return s, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/non_unix_test.go b/third_party/gofrontend/libgo/go/net/non_unix_test.go
deleted file mode 100644
index eddca56..0000000
--- a/third_party/gofrontend/libgo/go/net/non_unix_test.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build nacl plan9 windows
-
-package net
-
-// See unix_test.go for what these (don't) do.
-func forceGoDNS() func() { return func() {} }
-func forceCgoDNS() bool  { return false }
diff --git a/third_party/gofrontend/libgo/go/net/nss.go b/third_party/gofrontend/libgo/go/net/nss.go
deleted file mode 100644
index 08c3e6a..0000000
--- a/third_party/gofrontend/libgo/go/net/nss.go
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package net
-
-import (
-	"errors"
-	"io"
-	"os"
-)
-
-// nssConf represents the state of the machine's /etc/nsswitch.conf file.
-type nssConf struct {
-	err     error                  // any error encountered opening or parsing the file
-	sources map[string][]nssSource // keyed by database (e.g. "hosts")
-}
-
-type nssSource struct {
-	source   string // e.g. "compat", "files", "mdns4_minimal"
-	criteria []nssCriterion
-}
-
-// standardCriteria reports all specified criteria have the default
-// status actions.
-func (s nssSource) standardCriteria() bool {
-	for i, crit := range s.criteria {
-		if !crit.standardStatusAction(i == len(s.criteria)-1) {
-			return false
-		}
-	}
-	return true
-}
-
-// nssCriterion is the parsed structure of one of the criteria in brackets
-// after an NSS source name.
-type nssCriterion struct {
-	negate bool   // if "!" was present
-	status string // e.g. "success", "unavail" (lowercase)
-	action string // e.g. "return", "continue" (lowercase)
-}
-
-// standardStatusAction reports whether c is equivalent to not
-// specifying the criterion at all. last is whether this criteria is the
-// last in the list.
-func (c nssCriterion) standardStatusAction(last bool) bool {
-	if c.negate {
-		return false
-	}
-	var def string
-	switch c.status {
-	case "success":
-		def = "return"
-	case "notfound", "unavail", "tryagain":
-		def = "continue"
-	default:
-		// Unknown status
-		return false
-	}
-	if last && c.action == "return" {
-		return true
-	}
-	return c.action == def
-}
-
-func parseNSSConfFile(file string) *nssConf {
-	f, err := os.Open(file)
-	if err != nil {
-		return &nssConf{err: err}
-	}
-	defer f.Close()
-	return parseNSSConf(f)
-}
-
-func parseNSSConf(r io.Reader) *nssConf {
-	slurp, err := readFull(r)
-	if err != nil {
-		return &nssConf{err: err}
-	}
-	conf := new(nssConf)
-	conf.err = foreachLine(slurp, func(line []byte) error {
-		line = trimSpace(removeComment(line))
-		if len(line) == 0 {
-			return nil
-		}
-		colon := bytesIndexByte(line, ':')
-		if colon == -1 {
-			return errors.New("no colon on line")
-		}
-		db := string(trimSpace(line[:colon]))
-		srcs := line[colon+1:]
-		for {
-			srcs = trimSpace(srcs)
-			if len(srcs) == 0 {
-				break
-			}
-			sp := bytesIndexByte(srcs, ' ')
-			var src string
-			if sp == -1 {
-				src = string(srcs)
-				srcs = nil // done
-			} else {
-				src = string(srcs[:sp])
-				srcs = trimSpace(srcs[sp+1:])
-			}
-			var criteria []nssCriterion
-			// See if there's a criteria block in brackets.
-			if len(srcs) > 0 && srcs[0] == '[' {
-				bclose := bytesIndexByte(srcs, ']')
-				if bclose == -1 {
-					return errors.New("unclosed criterion bracket")
-				}
-				var err error
-				criteria, err = parseCriteria(srcs[1:bclose])
-				if err != nil {
-					return errors.New("invalid criteria: " + string(srcs[1:bclose]))
-				}
-				srcs = srcs[bclose+1:]
-			}
-			if conf.sources == nil {
-				conf.sources = make(map[string][]nssSource)
-			}
-			conf.sources[db] = append(conf.sources[db], nssSource{
-				source:   src,
-				criteria: criteria,
-			})
-		}
-		return nil
-	})
-	return conf
-}
-
-// parses "foo=bar !foo=bar"
-func parseCriteria(x []byte) (c []nssCriterion, err error) {
-	err = foreachField(x, func(f []byte) error {
-		not := false
-		if len(f) > 0 && f[0] == '!' {
-			not = true
-			f = f[1:]
-		}
-		if len(f) < 3 {
-			return errors.New("criterion too short")
-		}
-		eq := bytesIndexByte(f, '=')
-		if eq == -1 {
-			return errors.New("criterion lacks equal sign")
-		}
-		lowerASCIIBytes(f)
-		c = append(c, nssCriterion{
-			negate: not,
-			status: string(f[:eq]),
-			action: string(f[eq+1:]),
-		})
-		return nil
-	})
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/net/nss_test.go b/third_party/gofrontend/libgo/go/net/nss_test.go
deleted file mode 100644
index 371deb5..0000000
--- a/third_party/gofrontend/libgo/go/net/nss_test.go
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package net
-
-import (
-	"reflect"
-	"strings"
-	"testing"
-)
-
-const ubuntuTrustyAvahi = `# /etc/nsswitch.conf
-#
-# Example configuration of GNU Name Service Switch functionality.
-# If you have the libc-doc-reference' and nfo' packages installed, try:
-# nfo libc "Name Service Switch"' for information about this file.
-
-passwd:         compat
-group:          compat
-shadow:         compat
-
-hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
-networks:       files
-
-protocols:      db files
-services:       db files
-ethers:         db files
-rpc:            db files
-
-netgroup:       nis
-`
-
-func TestParseNSSConf(t *testing.T) {
-	tests := []struct {
-		name string
-		in   string
-		want *nssConf
-	}{
-		{
-			name: "no_newline",
-			in:   "foo: a b",
-			want: &nssConf{
-				sources: map[string][]nssSource{
-					"foo": {{source: "a"}, {source: "b"}},
-				},
-			},
-		},
-		{
-			name: "newline",
-			in:   "foo: a b\n",
-			want: &nssConf{
-				sources: map[string][]nssSource{
-					"foo": {{source: "a"}, {source: "b"}},
-				},
-			},
-		},
-		{
-			name: "whitespace",
-			in:   "   foo:a    b    \n",
-			want: &nssConf{
-				sources: map[string][]nssSource{
-					"foo": {{source: "a"}, {source: "b"}},
-				},
-			},
-		},
-		{
-			name: "comment1",
-			in:   "   foo:a    b#c\n",
-			want: &nssConf{
-				sources: map[string][]nssSource{
-					"foo": {{source: "a"}, {source: "b"}},
-				},
-			},
-		},
-		{
-			name: "comment2",
-			in:   "   foo:a    b #c \n",
-			want: &nssConf{
-				sources: map[string][]nssSource{
-					"foo": {{source: "a"}, {source: "b"}},
-				},
-			},
-		},
-		{
-			name: "crit",
-			in:   "   foo:a    b [!a=b    X=Y ] c#d \n",
-			want: &nssConf{
-				sources: map[string][]nssSource{
-					"foo": {
-						{source: "a"},
-						{
-							source: "b",
-							criteria: []nssCriterion{
-								{
-									negate: true,
-									status: "a",
-									action: "b",
-								},
-								{
-									status: "x",
-									action: "y",
-								},
-							},
-						},
-						{source: "c"},
-					},
-				},
-			},
-		},
-
-		// Ubuntu Trusty w/ avahi-daemon, libavahi-* etc installed.
-		{
-			name: "ubuntu_trusty_avahi",
-			in:   ubuntuTrustyAvahi,
-			want: &nssConf{
-				sources: map[string][]nssSource{
-					"passwd": {{source: "compat"}},
-					"group":  {{source: "compat"}},
-					"shadow": {{source: "compat"}},
-					"hosts": {
-						{source: "files"},
-						{
-							source: "mdns4_minimal",
-							criteria: []nssCriterion{
-								{
-									negate: false,
-									status: "notfound",
-									action: "return",
-								},
-							},
-						},
-						{source: "dns"},
-						{source: "mdns4"},
-					},
-					"networks": {{source: "files"}},
-					"protocols": {
-						{source: "db"},
-						{source: "files"},
-					},
-					"services": {
-						{source: "db"},
-						{source: "files"},
-					},
-					"ethers": {
-						{source: "db"},
-						{source: "files"},
-					},
-					"rpc": {
-						{source: "db"},
-						{source: "files"},
-					},
-					"netgroup": {
-						{source: "nis"},
-					},
-				},
-			},
-		},
-	}
-
-	for _, tt := range tests {
-		gotConf := parseNSSConf(strings.NewReader(tt.in))
-		if !reflect.DeepEqual(gotConf, tt.want) {
-			t.Errorf("%s: mismatch\n got %#v\nwant %#v", tt.name, gotConf, tt.want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/packetconn_test.go b/third_party/gofrontend/libgo/go/net/packetconn_test.go
deleted file mode 100644
index 7f3ea8a..0000000
--- a/third_party/gofrontend/libgo/go/net/packetconn_test.go
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements API tests across platforms and will never have a build
-// tag.
-
-package net
-
-import (
-	"os"
-	"testing"
-	"time"
-)
-
-// The full stack test cases for IPConn have been moved to the
-// following:
-//	golang.org/x/net/ipv4
-//	golang.org/x/net/ipv6
-//	golang.org/x/net/icmp
-
-func packetConnTestData(t *testing.T, network string) ([]byte, func()) {
-	if !testableNetwork(network) {
-		return nil, func() { t.Logf("skipping %s test", network) }
-	}
-	return []byte("PACKETCONN TEST"), nil
-}
-
-var packetConnTests = []struct {
-	net   string
-	addr1 string
-	addr2 string
-}{
-	{"udp", "127.0.0.1:0", "127.0.0.1:0"},
-	{"unixgram", testUnixAddr(), testUnixAddr()},
-}
-
-func TestPacketConn(t *testing.T) {
-	closer := func(c PacketConn, net, addr1, addr2 string) {
-		c.Close()
-		switch net {
-		case "unixgram":
-			os.Remove(addr1)
-			os.Remove(addr2)
-		}
-	}
-
-	for _, tt := range packetConnTests {
-		wb, skipOrFatalFn := packetConnTestData(t, tt.net)
-		if skipOrFatalFn != nil {
-			skipOrFatalFn()
-			continue
-		}
-
-		c1, err := ListenPacket(tt.net, tt.addr1)
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer closer(c1, tt.net, tt.addr1, tt.addr2)
-		c1.LocalAddr()
-		c1.SetDeadline(time.Now().Add(500 * time.Millisecond))
-		c1.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
-		c1.SetWriteDeadline(time.Now().Add(500 * time.Millisecond))
-
-		c2, err := ListenPacket(tt.net, tt.addr2)
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer closer(c2, tt.net, tt.addr1, tt.addr2)
-		c2.LocalAddr()
-		c2.SetDeadline(time.Now().Add(500 * time.Millisecond))
-		c2.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
-		c2.SetWriteDeadline(time.Now().Add(500 * time.Millisecond))
-		rb2 := make([]byte, 128)
-
-		if _, err := c1.WriteTo(wb, c2.LocalAddr()); err != nil {
-			t.Fatal(err)
-		}
-		if _, _, err := c2.ReadFrom(rb2); err != nil {
-			t.Fatal(err)
-		}
-		if _, err := c2.WriteTo(wb, c1.LocalAddr()); err != nil {
-			t.Fatal(err)
-		}
-		rb1 := make([]byte, 128)
-		if _, _, err := c1.ReadFrom(rb1); err != nil {
-			t.Fatal(err)
-		}
-	}
-}
-
-func TestConnAndPacketConn(t *testing.T) {
-	closer := func(c PacketConn, net, addr1, addr2 string) {
-		c.Close()
-		switch net {
-		case "unixgram":
-			os.Remove(addr1)
-			os.Remove(addr2)
-		}
-	}
-
-	for _, tt := range packetConnTests {
-		var wb []byte
-		wb, skipOrFatalFn := packetConnTestData(t, tt.net)
-		if skipOrFatalFn != nil {
-			skipOrFatalFn()
-			continue
-		}
-
-		c1, err := ListenPacket(tt.net, tt.addr1)
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer closer(c1, tt.net, tt.addr1, tt.addr2)
-		c1.LocalAddr()
-		c1.SetDeadline(time.Now().Add(500 * time.Millisecond))
-		c1.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
-		c1.SetWriteDeadline(time.Now().Add(500 * time.Millisecond))
-
-		c2, err := Dial(tt.net, c1.LocalAddr().String())
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer c2.Close()
-		c2.LocalAddr()
-		c2.RemoteAddr()
-		c2.SetDeadline(time.Now().Add(500 * time.Millisecond))
-		c2.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
-		c2.SetWriteDeadline(time.Now().Add(500 * time.Millisecond))
-
-		if _, err := c2.Write(wb); err != nil {
-			t.Fatal(err)
-		}
-		rb1 := make([]byte, 128)
-		if _, _, err := c1.ReadFrom(rb1); err != nil {
-			t.Fatal(err)
-		}
-		var dst Addr
-		switch tt.net {
-		case "unixgram":
-			continue
-		default:
-			dst = c2.LocalAddr()
-		}
-		if _, err := c1.WriteTo(wb, dst); err != nil {
-			t.Fatal(err)
-		}
-		rb2 := make([]byte, 128)
-		if _, err := c2.Read(rb2); err != nil {
-			t.Fatal(err)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/parse.go b/third_party/gofrontend/libgo/go/net/parse.go
deleted file mode 100644
index c72e1c2..0000000
--- a/third_party/gofrontend/libgo/go/net/parse.go
+++ /dev/null
@@ -1,386 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Simple file i/o and string manipulation, to avoid
-// depending on strconv and bufio and strings.
-
-package net
-
-import (
-	"io"
-	"os"
-)
-
-type file struct {
-	file  *os.File
-	data  []byte
-	atEOF bool
-}
-
-func (f *file) close() { f.file.Close() }
-
-func (f *file) getLineFromData() (s string, ok bool) {
-	data := f.data
-	i := 0
-	for i = 0; i < len(data); i++ {
-		if data[i] == '\n' {
-			s = string(data[0:i])
-			ok = true
-			// move data
-			i++
-			n := len(data) - i
-			copy(data[0:], data[i:])
-			f.data = data[0:n]
-			return
-		}
-	}
-	if f.atEOF && len(f.data) > 0 {
-		// EOF, return all we have
-		s = string(data)
-		f.data = f.data[0:0]
-		ok = true
-	}
-	return
-}
-
-func (f *file) readLine() (s string, ok bool) {
-	if s, ok = f.getLineFromData(); ok {
-		return
-	}
-	if len(f.data) < cap(f.data) {
-		ln := len(f.data)
-		n, err := io.ReadFull(f.file, f.data[ln:cap(f.data)])
-		if n >= 0 {
-			f.data = f.data[0 : ln+n]
-		}
-		if err == io.EOF || err == io.ErrUnexpectedEOF {
-			f.atEOF = true
-		}
-	}
-	s, ok = f.getLineFromData()
-	return
-}
-
-func open(name string) (*file, error) {
-	fd, err := os.Open(name)
-	if err != nil {
-		return nil, err
-	}
-	return &file{fd, make([]byte, 0, os.Getpagesize()), false}, nil
-}
-
-func byteIndex(s string, c byte) int {
-	for i := 0; i < len(s); i++ {
-		if s[i] == c {
-			return i
-		}
-	}
-	return -1
-}
-
-// Count occurrences in s of any bytes in t.
-func countAnyByte(s string, t string) int {
-	n := 0
-	for i := 0; i < len(s); i++ {
-		if byteIndex(t, s[i]) >= 0 {
-			n++
-		}
-	}
-	return n
-}
-
-// Split s at any bytes in t.
-func splitAtBytes(s string, t string) []string {
-	a := make([]string, 1+countAnyByte(s, t))
-	n := 0
-	last := 0
-	for i := 0; i < len(s); i++ {
-		if byteIndex(t, s[i]) >= 0 {
-			if last < i {
-				a[n] = string(s[last:i])
-				n++
-			}
-			last = i + 1
-		}
-	}
-	if last < len(s) {
-		a[n] = string(s[last:])
-		n++
-	}
-	return a[0:n]
-}
-
-func getFields(s string) []string { return splitAtBytes(s, " \r\t\n") }
-
-// Bigger than we need, not too big to worry about overflow
-const big = 0xFFFFFF
-
-// Decimal to integer starting at &s[i0].
-// Returns number, new offset, success.
-func dtoi(s string, i0 int) (n int, i int, ok bool) {
-	n = 0
-	for i = i0; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
-		n = n*10 + int(s[i]-'0')
-		if n >= big {
-			return 0, i, false
-		}
-	}
-	if i == i0 {
-		return 0, i, false
-	}
-	return n, i, true
-}
-
-// Hexadecimal to integer starting at &s[i0].
-// Returns number, new offset, success.
-func xtoi(s string, i0 int) (n int, i int, ok bool) {
-	n = 0
-	for i = i0; i < len(s); i++ {
-		if '0' <= s[i] && s[i] <= '9' {
-			n *= 16
-			n += int(s[i] - '0')
-		} else if 'a' <= s[i] && s[i] <= 'f' {
-			n *= 16
-			n += int(s[i]-'a') + 10
-		} else if 'A' <= s[i] && s[i] <= 'F' {
-			n *= 16
-			n += int(s[i]-'A') + 10
-		} else {
-			break
-		}
-		if n >= big {
-			return 0, i, false
-		}
-	}
-	if i == i0 {
-		return 0, i, false
-	}
-	return n, i, true
-}
-
-// xtoi2 converts the next two hex digits of s into a byte.
-// If s is longer than 2 bytes then the third byte must be e.
-// If the first two bytes of s are not hex digits or the third byte
-// does not match e, false is returned.
-func xtoi2(s string, e byte) (byte, bool) {
-	if len(s) > 2 && s[2] != e {
-		return 0, false
-	}
-	n, ei, ok := xtoi(s[:2], 0)
-	return byte(n), ok && ei == 2
-}
-
-// Convert integer to decimal string.
-func itoa(val int) string {
-	if val < 0 {
-		return "-" + uitoa(uint(-val))
-	}
-	return uitoa(uint(val))
-}
-
-// Convert unsigned integer to decimal string.
-func uitoa(val uint) string {
-	if val == 0 { // avoid string allocation
-		return "0"
-	}
-	var buf [20]byte // big enough for 64bit value base 10
-	i := len(buf) - 1
-	for val >= 10 {
-		q := val / 10
-		buf[i] = byte('0' + val - q*10)
-		i--
-		val = q
-	}
-	// val < 10
-	buf[i] = byte('0' + val)
-	return string(buf[i:])
-}
-
-// Convert i to a hexadecimal string. Leading zeros are not printed.
-func appendHex(dst []byte, i uint32) []byte {
-	if i == 0 {
-		return append(dst, '0')
-	}
-	for j := 7; j >= 0; j-- {
-		v := i >> uint(j*4)
-		if v > 0 {
-			dst = append(dst, hexDigit[v&0xf])
-		}
-	}
-	return dst
-}
-
-// Number of occurrences of b in s.
-func count(s string, b byte) int {
-	n := 0
-	for i := 0; i < len(s); i++ {
-		if s[i] == b {
-			n++
-		}
-	}
-	return n
-}
-
-// Index of rightmost occurrence of b in s.
-func last(s string, b byte) int {
-	i := len(s)
-	for i--; i >= 0; i-- {
-		if s[i] == b {
-			break
-		}
-	}
-	return i
-}
-
-// lowerASCIIBytes makes x ASCII lowercase in-place.
-func lowerASCIIBytes(x []byte) {
-	for i, b := range x {
-		if 'A' <= b && b <= 'Z' {
-			x[i] += 'a' - 'A'
-		}
-	}
-}
-
-// lowerASCII returns the ASCII lowercase version of b.
-func lowerASCII(b byte) byte {
-	if 'A' <= b && b <= 'Z' {
-		return b + ('a' - 'A')
-	}
-	return b
-}
-
-// trimSpace returns x without any leading or trailing ASCII whitespace.
-func trimSpace(x []byte) []byte {
-	for len(x) > 0 && isSpace(x[0]) {
-		x = x[1:]
-	}
-	for len(x) > 0 && isSpace(x[len(x)-1]) {
-		x = x[:len(x)-1]
-	}
-	return x
-}
-
-// isSpace reports whether b is an ASCII space character.
-func isSpace(b byte) bool {
-	return b == ' ' || b == '\t' || b == '\n' || b == '\r'
-}
-
-// removeComment returns line, removing any '#' byte and any following
-// bytes.
-func removeComment(line []byte) []byte {
-	if i := bytesIndexByte(line, '#'); i != -1 {
-		return line[:i]
-	}
-	return line
-}
-
-// foreachLine runs fn on each line of x.
-// Each line (except for possibly the last) ends in '\n'.
-// It returns the first non-nil error returned by fn.
-func foreachLine(x []byte, fn func(line []byte) error) error {
-	for len(x) > 0 {
-		nl := bytesIndexByte(x, '\n')
-		if nl == -1 {
-			return fn(x)
-		}
-		line := x[:nl+1]
-		x = x[nl+1:]
-		if err := fn(line); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// foreachField runs fn on each non-empty run of non-space bytes in x.
-// It returns the first non-nil error returned by fn.
-func foreachField(x []byte, fn func(field []byte) error) error {
-	x = trimSpace(x)
-	for len(x) > 0 {
-		sp := bytesIndexByte(x, ' ')
-		if sp == -1 {
-			return fn(x)
-		}
-		if field := trimSpace(x[:sp]); len(field) > 0 {
-			if err := fn(field); err != nil {
-				return err
-			}
-		}
-		x = trimSpace(x[sp+1:])
-	}
-	return nil
-}
-
-// bytesIndexByte is bytes.IndexByte. It returns the index of the
-// first instance of c in s, or -1 if c is not present in s.
-func bytesIndexByte(s []byte, c byte) int {
-	for i, b := range s {
-		if b == c {
-			return i
-		}
-	}
-	return -1
-}
-
-// stringsHasSuffix is strings.HasSuffix. It reports whether s ends in
-// suffix.
-func stringsHasSuffix(s, suffix string) bool {
-	return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix
-}
-
-// stringsHasSuffixFold reports whether s ends in suffix,
-// ASCII-case-insensitively.
-func stringsHasSuffixFold(s, suffix string) bool {
-	if len(suffix) > len(s) {
-		return false
-	}
-	for i := 0; i < len(suffix); i++ {
-		if lowerASCII(suffix[i]) != lowerASCII(s[len(s)-len(suffix)+i]) {
-			return false
-		}
-	}
-	return true
-}
-
-// stringsHasPrefix is strings.HasPrefix. It reports whether s begins with prefix.
-func stringsHasPrefix(s, prefix string) bool {
-	return len(s) >= len(prefix) && s[:len(prefix)] == prefix
-}
-
-func readFull(r io.Reader) (all []byte, err error) {
-	buf := make([]byte, 1024)
-	for {
-		n, err := r.Read(buf)
-		all = append(all, buf[:n]...)
-		if err == io.EOF {
-			return all, nil
-		}
-		if err != nil {
-			return nil, err
-		}
-	}
-}
-
-// goDebugString returns the value of the named GODEBUG key.
-// GODEBUG is of the form "key=val,key2=val2"
-func goDebugString(key string) string {
-	s := os.Getenv("GODEBUG")
-	for i := 0; i < len(s)-len(key)-1; i++ {
-		if i > 0 && s[i-1] != ',' {
-			continue
-		}
-		afterKey := s[i+len(key):]
-		if afterKey[0] != '=' || s[i:i+len(key)] != key {
-			continue
-		}
-		val := afterKey[1:]
-		for i, b := range val {
-			if b == ',' {
-				return val[:i]
-			}
-		}
-		return val
-	}
-	return ""
-}
diff --git a/third_party/gofrontend/libgo/go/net/parse_test.go b/third_party/gofrontend/libgo/go/net/parse_test.go
deleted file mode 100644
index 0f048fc..0000000
--- a/third_party/gofrontend/libgo/go/net/parse_test.go
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"bufio"
-	"os"
-	"runtime"
-	"testing"
-)
-
-func TestReadLine(t *testing.T) {
-	// /etc/services file does not exist on android, plan9, windows.
-	switch runtime.GOOS {
-	case "android", "plan9", "windows":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-	filename := "/etc/services" // a nice big file
-
-	fd, err := os.Open(filename)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer fd.Close()
-	br := bufio.NewReader(fd)
-
-	file, err := open(filename)
-	if file == nil {
-		t.Fatal(err)
-	}
-	defer file.close()
-
-	lineno := 1
-	byteno := 0
-	for {
-		bline, berr := br.ReadString('\n')
-		if n := len(bline); n > 0 {
-			bline = bline[0 : n-1]
-		}
-		line, ok := file.readLine()
-		if (berr != nil) != !ok || bline != line {
-			t.Fatalf("%s:%d (#%d)\nbufio => %q, %v\nnet => %q, %v", filename, lineno, byteno, bline, berr, line, ok)
-		}
-		if !ok {
-			break
-		}
-		lineno++
-		byteno += len(line) + 1
-	}
-}
-
-func TestGoDebugString(t *testing.T) {
-	defer os.Setenv("GODEBUG", os.Getenv("GODEBUG"))
-	tests := []struct {
-		godebug string
-		key     string
-		want    string
-	}{
-		{"", "foo", ""},
-		{"foo=", "foo", ""},
-		{"foo=bar", "foo", "bar"},
-		{"foo=bar,", "foo", "bar"},
-		{"foo,foo=bar,", "foo", "bar"},
-		{"foo1=bar,foo=bar,", "foo", "bar"},
-		{"foo=bar,foo=bar,", "foo", "bar"},
-		{"foo=", "foo", ""},
-		{"foo", "foo", ""},
-		{",foo", "foo", ""},
-		{"foo=bar,baz", "loooooooong", ""},
-	}
-	for _, tt := range tests {
-		os.Setenv("GODEBUG", tt.godebug)
-		if got := goDebugString(tt.key); got != tt.want {
-			t.Errorf("for %q, goDebugString(%q) = %q; want %q", tt.godebug, tt.key, got, tt.want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/pipe.go b/third_party/gofrontend/libgo/go/net/pipe.go
deleted file mode 100644
index 5fc830b..0000000
--- a/third_party/gofrontend/libgo/go/net/pipe.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"errors"
-	"io"
-	"time"
-)
-
-// Pipe creates a synchronous, in-memory, full duplex
-// network connection; both ends implement the Conn interface.
-// Reads on one end are matched with writes on the other,
-// copying data directly between the two; there is no internal
-// buffering.
-func Pipe() (Conn, Conn) {
-	r1, w1 := io.Pipe()
-	r2, w2 := io.Pipe()
-
-	return &pipe{r1, w2}, &pipe{r2, w1}
-}
-
-type pipe struct {
-	*io.PipeReader
-	*io.PipeWriter
-}
-
-type pipeAddr int
-
-func (pipeAddr) Network() string {
-	return "pipe"
-}
-
-func (pipeAddr) String() string {
-	return "pipe"
-}
-
-func (p *pipe) Close() error {
-	err := p.PipeReader.Close()
-	err1 := p.PipeWriter.Close()
-	if err == nil {
-		err = err1
-	}
-	return err
-}
-
-func (p *pipe) LocalAddr() Addr {
-	return pipeAddr(0)
-}
-
-func (p *pipe) RemoteAddr() Addr {
-	return pipeAddr(0)
-}
-
-func (p *pipe) SetDeadline(t time.Time) error {
-	return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
-}
-
-func (p *pipe) SetReadDeadline(t time.Time) error {
-	return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
-}
-
-func (p *pipe) SetWriteDeadline(t time.Time) error {
-	return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
-}
diff --git a/third_party/gofrontend/libgo/go/net/pipe_test.go b/third_party/gofrontend/libgo/go/net/pipe_test.go
deleted file mode 100644
index 60c3920..0000000
--- a/third_party/gofrontend/libgo/go/net/pipe_test.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"bytes"
-	"io"
-	"testing"
-)
-
-func checkPipeWrite(t *testing.T, w io.Writer, data []byte, c chan int) {
-	n, err := w.Write(data)
-	if err != nil {
-		t.Error(err)
-	}
-	if n != len(data) {
-		t.Errorf("short write: %d != %d", n, len(data))
-	}
-	c <- 0
-}
-
-func checkPipeRead(t *testing.T, r io.Reader, data []byte, wantErr error) {
-	buf := make([]byte, len(data)+10)
-	n, err := r.Read(buf)
-	if err != wantErr {
-		t.Error(err)
-		return
-	}
-	if n != len(data) || !bytes.Equal(buf[0:n], data) {
-		t.Errorf("bad read: got %q", buf[0:n])
-		return
-	}
-}
-
-// TestPipe tests a simple read/write/close sequence.
-// Assumes that the underlying io.Pipe implementation
-// is solid and we're just testing the net wrapping.
-func TestPipe(t *testing.T) {
-	c := make(chan int)
-	cli, srv := Pipe()
-	go checkPipeWrite(t, cli, []byte("hello, world"), c)
-	checkPipeRead(t, srv, []byte("hello, world"), nil)
-	<-c
-	go checkPipeWrite(t, srv, []byte("line 2"), c)
-	checkPipeRead(t, cli, []byte("line 2"), nil)
-	<-c
-	go checkPipeWrite(t, cli, []byte("a third line"), c)
-	checkPipeRead(t, srv, []byte("a third line"), nil)
-	<-c
-	go srv.Close()
-	checkPipeRead(t, cli, nil, io.EOF)
-	cli.Close()
-}
diff --git a/third_party/gofrontend/libgo/go/net/platform_test.go b/third_party/gofrontend/libgo/go/net/platform_test.go
deleted file mode 100644
index d624852..0000000
--- a/third_party/gofrontend/libgo/go/net/platform_test.go
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-// testableNetwork reports whether network is testable on the current
-// platform configuration.
-func testableNetwork(network string) bool {
-	ss := strings.Split(network, ":")
-	switch ss[0] {
-	case "ip+nopriv":
-		switch runtime.GOOS {
-		case "nacl":
-			return false
-		}
-	case "ip", "ip4", "ip6":
-		switch runtime.GOOS {
-		case "nacl", "plan9":
-			return false
-		default:
-			if os.Getuid() != 0 {
-				return false
-			}
-		}
-	case "unix", "unixgram":
-		switch runtime.GOOS {
-		case "nacl", "plan9", "windows":
-			return false
-		}
-		// iOS does not support unix, unixgram.
-		if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
-			return false
-		}
-	case "unixpacket":
-		switch runtime.GOOS {
-		case "android", "darwin", "nacl", "plan9", "windows":
-			fallthrough
-		case "freebsd": // FreeBSD 8 and below don't support unixpacket
-			return false
-		}
-	}
-	switch ss[0] {
-	case "tcp4", "udp4", "ip4":
-		if !supportsIPv4 {
-			return false
-		}
-	case "tcp6", "udp6", "ip6":
-		if !supportsIPv6 {
-			return false
-		}
-	}
-	return true
-}
-
-// testableAddress reports whether address of network is testable on
-// the current platform configuration.
-func testableAddress(network, address string) bool {
-	switch ss := strings.Split(network, ":"); ss[0] {
-	case "unix", "unixgram", "unixpacket":
-		// Abstract unix domain sockets, a Linux-ism.
-		if address[0] == '@' && runtime.GOOS != "linux" {
-			return false
-		}
-	}
-	return true
-}
-
-// testableListenArgs reports whether arguments are testable on the
-// current platform configuration.
-func testableListenArgs(network, address, client string) bool {
-	if !testableNetwork(network) || !testableAddress(network, address) {
-		return false
-	}
-
-	var err error
-	var addr Addr
-	switch ss := strings.Split(network, ":"); ss[0] {
-	case "tcp", "tcp4", "tcp6":
-		addr, err = ResolveTCPAddr("tcp", address)
-	case "udp", "udp4", "udp6":
-		addr, err = ResolveUDPAddr("udp", address)
-	case "ip", "ip4", "ip6":
-		addr, err = ResolveIPAddr("ip", address)
-	default:
-		return true
-	}
-	if err != nil {
-		return false
-	}
-	var ip IP
-	var wildcard bool
-	switch addr := addr.(type) {
-	case *TCPAddr:
-		ip = addr.IP
-		wildcard = addr.isWildcard()
-	case *UDPAddr:
-		ip = addr.IP
-		wildcard = addr.isWildcard()
-	case *IPAddr:
-		ip = addr.IP
-		wildcard = addr.isWildcard()
-	}
-
-	// Test wildcard IP addresses.
-	if wildcard && (testing.Short() || !*testExternal) {
-		return false
-	}
-
-	// Test functionality of IPv4 communication using AF_INET and
-	// IPv6 communication using AF_INET6 sockets.
-	if !supportsIPv4 && ip.To4() != nil {
-		return false
-	}
-	if !supportsIPv6 && ip.To16() != nil && ip.To4() == nil {
-		return false
-	}
-	cip := ParseIP(client)
-	if cip != nil {
-		if !supportsIPv4 && cip.To4() != nil {
-			return false
-		}
-		if !supportsIPv6 && cip.To16() != nil && cip.To4() == nil {
-			return false
-		}
-	}
-
-	// Test functionality of IPv4 communication using AF_INET6
-	// sockets.
-	if !supportsIPv4map && (network == "tcp" || network == "udp" || network == "ip") && wildcard {
-		// At this point, we prefer IPv4 when ip is nil.
-		// See favoriteAddrFamily for further information.
-		if ip.To16() != nil && ip.To4() == nil && cip.To4() != nil { // a pair of IPv6 server and IPv4 client
-			return false
-		}
-		if (ip.To4() != nil || ip == nil) && cip.To16() != nil && cip.To4() == nil { // a pair of IPv4 server and IPv6 client
-			return false
-		}
-	}
-
-	return true
-}
-
-var condFatalf = func() func(*testing.T, string, ...interface{}) {
-	// A few APIs, File, Read/WriteMsg{UDP,IP}, are not
-	// implemented yet on both Plan 9 and Windows.
-	switch runtime.GOOS {
-	case "plan9", "windows":
-		return (*testing.T).Logf
-	}
-	return (*testing.T).Fatalf
-}()
diff --git a/third_party/gofrontend/libgo/go/net/port.go b/third_party/gofrontend/libgo/go/net/port.go
deleted file mode 100644
index a2a5387..0000000
--- a/third_party/gofrontend/libgo/go/net/port.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Network service port manipulations
-
-package net
-
-// parsePort parses port as a network service port number for both
-// TCP and UDP.
-func parsePort(net, port string) (int, error) {
-	p, i, ok := dtoi(port, 0)
-	if !ok || i != len(port) {
-		var err error
-		p, err = LookupPort(net, port)
-		if err != nil {
-			return 0, err
-		}
-	}
-	if p < 0 || p > 0xFFFF {
-		return 0, &AddrError{Err: "invalid port", Addr: port}
-	}
-	return p, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/port_test.go b/third_party/gofrontend/libgo/go/net/port_test.go
deleted file mode 100644
index 258a5bd..0000000
--- a/third_party/gofrontend/libgo/go/net/port_test.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"runtime"
-	"testing"
-)
-
-var portTests = []struct {
-	network string
-	name    string
-	port    int
-	ok      bool
-}{
-	{"tcp", "echo", 7, true},
-	{"tcp", "discard", 9, true},
-	{"tcp", "systat", 11, true},
-	{"tcp", "daytime", 13, true},
-	{"tcp", "chargen", 19, true},
-	{"tcp", "ftp-data", 20, true},
-	{"tcp", "ftp", 21, true},
-	{"tcp", "telnet", 23, true},
-	{"tcp", "smtp", 25, true},
-	{"tcp", "time", 37, true},
-	{"tcp", "domain", 53, true},
-	{"tcp", "finger", 79, true},
-	{"tcp", "42", 42, true},
-
-	{"udp", "echo", 7, true},
-	{"udp", "tftp", 69, true},
-	{"udp", "bootpc", 68, true},
-	{"udp", "bootps", 67, true},
-	{"udp", "domain", 53, true},
-	{"udp", "ntp", 123, true},
-	{"udp", "snmp", 161, true},
-	{"udp", "syslog", 514, true},
-	{"udp", "42", 42, true},
-
-	{"--badnet--", "zzz", 0, false},
-	{"tcp", "--badport--", 0, false},
-}
-
-func TestLookupPort(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	for _, tt := range portTests {
-		if port, err := LookupPort(tt.network, tt.name); port != tt.port || (err == nil) != tt.ok {
-			t.Errorf("LookupPort(%q, %q) = %v, %v; want %v", tt.network, tt.name, port, err, tt.port)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/port_unix.go b/third_party/gofrontend/libgo/go/net/port_unix.go
deleted file mode 100644
index badf8ab..0000000
--- a/third_party/gofrontend/libgo/go/net/port_unix.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-// Read system port mappings from /etc/services
-
-package net
-
-import "sync"
-
-// services contains minimal mappings between services names and port
-// numbers for platforms that don't have a complete list of port numbers
-// (some Solaris distros).
-var services = map[string]map[string]int{
-	"tcp": {"http": 80},
-}
-var servicesError error
-var onceReadServices sync.Once
-
-func readServices() {
-	var file *file
-	if file, servicesError = open("/etc/services"); servicesError != nil {
-		return
-	}
-	for line, ok := file.readLine(); ok; line, ok = file.readLine() {
-		// "http 80/tcp www www-http # World Wide Web HTTP"
-		if i := byteIndex(line, '#'); i >= 0 {
-			line = line[0:i]
-		}
-		f := getFields(line)
-		if len(f) < 2 {
-			continue
-		}
-		portnet := f[1] // "80/tcp"
-		port, j, ok := dtoi(portnet, 0)
-		if !ok || port <= 0 || j >= len(portnet) || portnet[j] != '/' {
-			continue
-		}
-		netw := portnet[j+1:] // "tcp"
-		m, ok1 := services[netw]
-		if !ok1 {
-			m = make(map[string]int)
-			services[netw] = m
-		}
-		for i := 0; i < len(f); i++ {
-			if i != 1 { // f[1] was port/net
-				m[f[i]] = port
-			}
-		}
-	}
-	file.close()
-}
-
-// goLookupPort is the native Go implementation of LookupPort.
-func goLookupPort(network, service string) (port int, err error) {
-	onceReadServices.Do(readServices)
-
-	switch network {
-	case "tcp4", "tcp6":
-		network = "tcp"
-	case "udp4", "udp6":
-		network = "udp"
-	}
-
-	if m, ok := services[network]; ok {
-		if port, ok = m[service]; ok {
-			return
-		}
-	}
-	return 0, &AddrError{Err: "unknown port", Addr: network + "/" + service}
-}
diff --git a/third_party/gofrontend/libgo/go/net/protoconn_test.go b/third_party/gofrontend/libgo/go/net/protoconn_test.go
deleted file mode 100644
index c6ef23b..0000000
--- a/third_party/gofrontend/libgo/go/net/protoconn_test.go
+++ /dev/null
@@ -1,350 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements API tests across platforms and will never have a build
-// tag.
-
-package net
-
-import (
-	"os"
-	"runtime"
-	"testing"
-	"time"
-)
-
-// The full stack test cases for IPConn have been moved to the
-// following:
-//	golang.org/x/net/ipv4
-//	golang.org/x/net/ipv6
-//	golang.org/x/net/icmp
-
-func TestTCPListenerSpecificMethods(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	la, err := ResolveTCPAddr("tcp4", "127.0.0.1:0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	ln, err := ListenTCP("tcp4", la)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-	ln.Addr()
-	ln.SetDeadline(time.Now().Add(30 * time.Nanosecond))
-
-	if c, err := ln.Accept(); err != nil {
-		if !err.(Error).Timeout() {
-			t.Fatal(err)
-		}
-	} else {
-		c.Close()
-	}
-	if c, err := ln.AcceptTCP(); err != nil {
-		if !err.(Error).Timeout() {
-			t.Fatal(err)
-		}
-	} else {
-		c.Close()
-	}
-
-	if f, err := ln.File(); err != nil {
-		condFatalf(t, "%v", err)
-	} else {
-		f.Close()
-	}
-}
-
-func TestTCPConnSpecificMethods(t *testing.T) {
-	la, err := ResolveTCPAddr("tcp4", "127.0.0.1:0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	ln, err := ListenTCP("tcp4", la)
-	if err != nil {
-		t.Fatal(err)
-	}
-	ch := make(chan error, 1)
-	handler := func(ls *localServer, ln Listener) { transponder(ls.Listener, ch) }
-	ls, err := (&streamListener{Listener: ln}).newLocalServer()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ls.teardown()
-	if err := ls.buildup(handler); err != nil {
-		t.Fatal(err)
-	}
-
-	ra, err := ResolveTCPAddr("tcp4", ls.Listener.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	c, err := DialTCP("tcp4", nil, ra)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-	c.SetKeepAlive(false)
-	c.SetKeepAlivePeriod(3 * time.Second)
-	c.SetLinger(0)
-	c.SetNoDelay(false)
-	c.LocalAddr()
-	c.RemoteAddr()
-	c.SetDeadline(time.Now().Add(someTimeout))
-	c.SetReadDeadline(time.Now().Add(someTimeout))
-	c.SetWriteDeadline(time.Now().Add(someTimeout))
-
-	if _, err := c.Write([]byte("TCPCONN TEST")); err != nil {
-		t.Fatal(err)
-	}
-	rb := make([]byte, 128)
-	if _, err := c.Read(rb); err != nil {
-		t.Fatal(err)
-	}
-
-	for err := range ch {
-		t.Error(err)
-	}
-}
-
-func TestUDPConnSpecificMethods(t *testing.T) {
-	la, err := ResolveUDPAddr("udp4", "127.0.0.1:0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	c, err := ListenUDP("udp4", la)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-	c.LocalAddr()
-	c.RemoteAddr()
-	c.SetDeadline(time.Now().Add(someTimeout))
-	c.SetReadDeadline(time.Now().Add(someTimeout))
-	c.SetWriteDeadline(time.Now().Add(someTimeout))
-	c.SetReadBuffer(2048)
-	c.SetWriteBuffer(2048)
-
-	wb := []byte("UDPCONN TEST")
-	rb := make([]byte, 128)
-	if _, err := c.WriteToUDP(wb, c.LocalAddr().(*UDPAddr)); err != nil {
-		t.Fatal(err)
-	}
-	if _, _, err := c.ReadFromUDP(rb); err != nil {
-		t.Fatal(err)
-	}
-	if _, _, err := c.WriteMsgUDP(wb, nil, c.LocalAddr().(*UDPAddr)); err != nil {
-		condFatalf(t, "%v", err)
-	}
-	if _, _, _, _, err := c.ReadMsgUDP(rb, nil); err != nil {
-		condFatalf(t, "%v", err)
-	}
-
-	if f, err := c.File(); err != nil {
-		condFatalf(t, "%v", err)
-	} else {
-		f.Close()
-	}
-
-	defer func() {
-		if p := recover(); p != nil {
-			t.Fatalf("panicked: %v", p)
-		}
-	}()
-
-	c.WriteToUDP(wb, nil)
-	c.WriteMsgUDP(wb, nil, nil)
-}
-
-func TestIPConnSpecificMethods(t *testing.T) {
-	if os.Getuid() != 0 {
-		t.Skip("must be root")
-	}
-
-	la, err := ResolveIPAddr("ip4", "127.0.0.1")
-	if err != nil {
-		t.Fatal(err)
-	}
-	c, err := ListenIP("ip4:icmp", la)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-	c.LocalAddr()
-	c.RemoteAddr()
-	c.SetDeadline(time.Now().Add(someTimeout))
-	c.SetReadDeadline(time.Now().Add(someTimeout))
-	c.SetWriteDeadline(time.Now().Add(someTimeout))
-	c.SetReadBuffer(2048)
-	c.SetWriteBuffer(2048)
-
-	if f, err := c.File(); err != nil {
-		condFatalf(t, "%v", err)
-	} else {
-		f.Close()
-	}
-
-	defer func() {
-		if p := recover(); p != nil {
-			t.Fatalf("panicked: %v", p)
-		}
-	}()
-
-	wb := []byte("IPCONN TEST")
-	c.WriteToIP(wb, nil)
-	c.WriteMsgIP(wb, nil, nil)
-}
-
-func TestUnixListenerSpecificMethods(t *testing.T) {
-	if !testableNetwork("unix") {
-		t.Skip("unix test")
-	}
-
-	addr := testUnixAddr()
-	la, err := ResolveUnixAddr("unix", addr)
-	if err != nil {
-		t.Fatal(err)
-	}
-	ln, err := ListenUnix("unix", la)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-	defer os.Remove(addr)
-	ln.Addr()
-	ln.SetDeadline(time.Now().Add(30 * time.Nanosecond))
-
-	if c, err := ln.Accept(); err != nil {
-		if !err.(Error).Timeout() {
-			t.Fatal(err)
-		}
-	} else {
-		c.Close()
-	}
-	if c, err := ln.AcceptUnix(); err != nil {
-		if !err.(Error).Timeout() {
-			t.Fatal(err)
-		}
-	} else {
-		c.Close()
-	}
-
-	if f, err := ln.File(); err != nil {
-		t.Fatal(err)
-	} else {
-		f.Close()
-	}
-}
-
-func TestUnixConnSpecificMethods(t *testing.T) {
-	if !testableNetwork("unixgram") {
-		t.Skip("unixgram test")
-	}
-
-	addr1, addr2, addr3 := testUnixAddr(), testUnixAddr(), testUnixAddr()
-
-	a1, err := ResolveUnixAddr("unixgram", addr1)
-	if err != nil {
-		t.Fatal(err)
-	}
-	c1, err := DialUnix("unixgram", a1, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c1.Close()
-	defer os.Remove(addr1)
-	c1.LocalAddr()
-	c1.RemoteAddr()
-	c1.SetDeadline(time.Now().Add(someTimeout))
-	c1.SetReadDeadline(time.Now().Add(someTimeout))
-	c1.SetWriteDeadline(time.Now().Add(someTimeout))
-	c1.SetReadBuffer(2048)
-	c1.SetWriteBuffer(2048)
-
-	a2, err := ResolveUnixAddr("unixgram", addr2)
-	if err != nil {
-		t.Fatal(err)
-	}
-	c2, err := DialUnix("unixgram", a2, nil)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c2.Close()
-	defer os.Remove(addr2)
-	c2.LocalAddr()
-	c2.RemoteAddr()
-	c2.SetDeadline(time.Now().Add(someTimeout))
-	c2.SetReadDeadline(time.Now().Add(someTimeout))
-	c2.SetWriteDeadline(time.Now().Add(someTimeout))
-	c2.SetReadBuffer(2048)
-	c2.SetWriteBuffer(2048)
-
-	a3, err := ResolveUnixAddr("unixgram", addr3)
-	if err != nil {
-		t.Fatal(err)
-	}
-	c3, err := ListenUnixgram("unixgram", a3)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c3.Close()
-	defer os.Remove(addr3)
-	c3.LocalAddr()
-	c3.RemoteAddr()
-	c3.SetDeadline(time.Now().Add(someTimeout))
-	c3.SetReadDeadline(time.Now().Add(someTimeout))
-	c3.SetWriteDeadline(time.Now().Add(someTimeout))
-	c3.SetReadBuffer(2048)
-	c3.SetWriteBuffer(2048)
-
-	wb := []byte("UNIXCONN TEST")
-	rb1 := make([]byte, 128)
-	rb2 := make([]byte, 128)
-	rb3 := make([]byte, 128)
-	if _, _, err := c1.WriteMsgUnix(wb, nil, a2); err != nil {
-		t.Fatal(err)
-	}
-	if _, _, _, _, err := c2.ReadMsgUnix(rb2, nil); err != nil {
-		t.Fatal(err)
-	}
-	if _, err := c2.WriteToUnix(wb, a1); err != nil {
-		t.Fatal(err)
-	}
-	if _, _, err := c1.ReadFromUnix(rb1); err != nil {
-		t.Fatal(err)
-	}
-	if _, err := c3.WriteToUnix(wb, a1); err != nil {
-		t.Fatal(err)
-	}
-	if _, _, err := c1.ReadFromUnix(rb1); err != nil {
-		t.Fatal(err)
-	}
-	if _, err := c2.WriteToUnix(wb, a3); err != nil {
-		t.Fatal(err)
-	}
-	if _, _, err := c3.ReadFromUnix(rb3); err != nil {
-		t.Fatal(err)
-	}
-
-	if f, err := c1.File(); err != nil {
-		t.Fatal(err)
-	} else {
-		f.Close()
-	}
-
-	defer func() {
-		if p := recover(); p != nil {
-			t.Fatalf("panicked: %v", p)
-		}
-	}()
-
-	c1.WriteToUnix(wb, nil)
-	c1.WriteMsgUnix(wb, nil, nil)
-	c3.WriteToUnix(wb, nil)
-	c3.WriteMsgUnix(wb, nil, nil)
-}
diff --git a/third_party/gofrontend/libgo/go/net/race.go b/third_party/gofrontend/libgo/go/net/race.go
deleted file mode 100644
index 2f02a6c..0000000
--- a/third_party/gofrontend/libgo/go/net/race.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build race
-// +build windows
-
-package net
-
-import (
-	"runtime"
-	"unsafe"
-)
-
-const raceenabled = true
-
-func raceAcquire(addr unsafe.Pointer) {
-	runtime.RaceAcquire(addr)
-}
-
-func raceReleaseMerge(addr unsafe.Pointer) {
-	runtime.RaceReleaseMerge(addr)
-}
-
-func raceReadRange(addr unsafe.Pointer, len int) {
-	runtime.RaceReadRange(addr, len)
-}
-
-func raceWriteRange(addr unsafe.Pointer, len int) {
-	runtime.RaceWriteRange(addr, len)
-}
diff --git a/third_party/gofrontend/libgo/go/net/race0.go b/third_party/gofrontend/libgo/go/net/race0.go
deleted file mode 100644
index f504297..0000000
--- a/third_party/gofrontend/libgo/go/net/race0.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !race
-// +build windows
-
-package net
-
-import (
-	"unsafe"
-)
-
-const raceenabled = false
-
-func raceAcquire(addr unsafe.Pointer) {
-}
-
-func raceReleaseMerge(addr unsafe.Pointer) {
-}
-
-func raceReadRange(addr unsafe.Pointer, len int) {
-}
-
-func raceWriteRange(addr unsafe.Pointer, len int) {
-}
diff --git a/third_party/gofrontend/libgo/go/net/rpc/client.go b/third_party/gofrontend/libgo/go/net/rpc/client.go
deleted file mode 100644
index d0c4a69..0000000
--- a/third_party/gofrontend/libgo/go/net/rpc/client.go
+++ /dev/null
@@ -1,317 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rpc
-
-import (
-	"bufio"
-	"encoding/gob"
-	"errors"
-	"io"
-	"log"
-	"net"
-	"net/http"
-	"sync"
-)
-
-// ServerError represents an error that has been returned from
-// the remote side of the RPC connection.
-type ServerError string
-
-func (e ServerError) Error() string {
-	return string(e)
-}
-
-var ErrShutdown = errors.New("connection is shut down")
-
-// Call represents an active RPC.
-type Call struct {
-	ServiceMethod string      // The name of the service and method to call.
-	Args          interface{} // The argument to the function (*struct).
-	Reply         interface{} // The reply from the function (*struct).
-	Error         error       // After completion, the error status.
-	Done          chan *Call  // Strobes when call is complete.
-}
-
-// Client represents an RPC Client.
-// There may be multiple outstanding Calls associated
-// with a single Client, and a Client may be used by
-// multiple goroutines simultaneously.
-type Client struct {
-	codec ClientCodec
-
-	reqMutex sync.Mutex // protects following
-	request  Request
-
-	mutex    sync.Mutex // protects following
-	seq      uint64
-	pending  map[uint64]*Call
-	closing  bool // user has called Close
-	shutdown bool // server has told us to stop
-}
-
-// A ClientCodec implements writing of RPC requests and
-// reading of RPC responses for the client side of an RPC session.
-// The client calls WriteRequest to write a request to the connection
-// and calls ReadResponseHeader and ReadResponseBody in pairs
-// to read responses.  The client calls Close when finished with the
-// connection. ReadResponseBody may be called with a nil
-// argument to force the body of the response to be read and then
-// discarded.
-type ClientCodec interface {
-	// WriteRequest must be safe for concurrent use by multiple goroutines.
-	WriteRequest(*Request, interface{}) error
-	ReadResponseHeader(*Response) error
-	ReadResponseBody(interface{}) error
-
-	Close() error
-}
-
-func (client *Client) send(call *Call) {
-	client.reqMutex.Lock()
-	defer client.reqMutex.Unlock()
-
-	// Register this call.
-	client.mutex.Lock()
-	if client.shutdown || client.closing {
-		call.Error = ErrShutdown
-		client.mutex.Unlock()
-		call.done()
-		return
-	}
-	seq := client.seq
-	client.seq++
-	client.pending[seq] = call
-	client.mutex.Unlock()
-
-	// Encode and send the request.
-	client.request.Seq = seq
-	client.request.ServiceMethod = call.ServiceMethod
-	err := client.codec.WriteRequest(&client.request, call.Args)
-	if err != nil {
-		client.mutex.Lock()
-		call = client.pending[seq]
-		delete(client.pending, seq)
-		client.mutex.Unlock()
-		if call != nil {
-			call.Error = err
-			call.done()
-		}
-	}
-}
-
-func (client *Client) input() {
-	var err error
-	var response Response
-	for err == nil {
-		response = Response{}
-		err = client.codec.ReadResponseHeader(&response)
-		if err != nil {
-			break
-		}
-		seq := response.Seq
-		client.mutex.Lock()
-		call := client.pending[seq]
-		delete(client.pending, seq)
-		client.mutex.Unlock()
-
-		switch {
-		case call == nil:
-			// We've got no pending call. That usually means that
-			// WriteRequest partially failed, and call was already
-			// removed; response is a server telling us about an
-			// error reading request body. We should still attempt
-			// to read error body, but there's no one to give it to.
-			err = client.codec.ReadResponseBody(nil)
-			if err != nil {
-				err = errors.New("reading error body: " + err.Error())
-			}
-		case response.Error != "":
-			// We've got an error response. Give this to the request;
-			// any subsequent requests will get the ReadResponseBody
-			// error if there is one.
-			call.Error = ServerError(response.Error)
-			err = client.codec.ReadResponseBody(nil)
-			if err != nil {
-				err = errors.New("reading error body: " + err.Error())
-			}
-			call.done()
-		default:
-			err = client.codec.ReadResponseBody(call.Reply)
-			if err != nil {
-				call.Error = errors.New("reading body " + err.Error())
-			}
-			call.done()
-		}
-	}
-	// Terminate pending calls.
-	client.reqMutex.Lock()
-	client.mutex.Lock()
-	client.shutdown = true
-	closing := client.closing
-	if err == io.EOF {
-		if closing {
-			err = ErrShutdown
-		} else {
-			err = io.ErrUnexpectedEOF
-		}
-	}
-	for _, call := range client.pending {
-		call.Error = err
-		call.done()
-	}
-	client.mutex.Unlock()
-	client.reqMutex.Unlock()
-	if debugLog && err != io.EOF && !closing {
-		log.Println("rpc: client protocol error:", err)
-	}
-}
-
-func (call *Call) done() {
-	select {
-	case call.Done <- call:
-		// ok
-	default:
-		// We don't want to block here.  It is the caller's responsibility to make
-		// sure the channel has enough buffer space. See comment in Go().
-		if debugLog {
-			log.Println("rpc: discarding Call reply due to insufficient Done chan capacity")
-		}
-	}
-}
-
-// NewClient returns a new Client to handle requests to the
-// set of services at the other end of the connection.
-// It adds a buffer to the write side of the connection so
-// the header and payload are sent as a unit.
-func NewClient(conn io.ReadWriteCloser) *Client {
-	encBuf := bufio.NewWriter(conn)
-	client := &gobClientCodec{conn, gob.NewDecoder(conn), gob.NewEncoder(encBuf), encBuf}
-	return NewClientWithCodec(client)
-}
-
-// NewClientWithCodec is like NewClient but uses the specified
-// codec to encode requests and decode responses.
-func NewClientWithCodec(codec ClientCodec) *Client {
-	client := &Client{
-		codec:   codec,
-		pending: make(map[uint64]*Call),
-	}
-	go client.input()
-	return client
-}
-
-type gobClientCodec struct {
-	rwc    io.ReadWriteCloser
-	dec    *gob.Decoder
-	enc    *gob.Encoder
-	encBuf *bufio.Writer
-}
-
-func (c *gobClientCodec) WriteRequest(r *Request, body interface{}) (err error) {
-	if err = c.enc.Encode(r); err != nil {
-		return
-	}
-	if err = c.enc.Encode(body); err != nil {
-		return
-	}
-	return c.encBuf.Flush()
-}
-
-func (c *gobClientCodec) ReadResponseHeader(r *Response) error {
-	return c.dec.Decode(r)
-}
-
-func (c *gobClientCodec) ReadResponseBody(body interface{}) error {
-	return c.dec.Decode(body)
-}
-
-func (c *gobClientCodec) Close() error {
-	return c.rwc.Close()
-}
-
-// DialHTTP connects to an HTTP RPC server at the specified network address
-// listening on the default HTTP RPC path.
-func DialHTTP(network, address string) (*Client, error) {
-	return DialHTTPPath(network, address, DefaultRPCPath)
-}
-
-// DialHTTPPath connects to an HTTP RPC server
-// at the specified network address and path.
-func DialHTTPPath(network, address, path string) (*Client, error) {
-	var err error
-	conn, err := net.Dial(network, address)
-	if err != nil {
-		return nil, err
-	}
-	io.WriteString(conn, "CONNECT "+path+" HTTP/1.0\n\n")
-
-	// Require successful HTTP response
-	// before switching to RPC protocol.
-	resp, err := http.ReadResponse(bufio.NewReader(conn), &http.Request{Method: "CONNECT"})
-	if err == nil && resp.Status == connected {
-		return NewClient(conn), nil
-	}
-	if err == nil {
-		err = errors.New("unexpected HTTP response: " + resp.Status)
-	}
-	conn.Close()
-	return nil, &net.OpError{
-		Op:   "dial-http",
-		Net:  network + " " + address,
-		Addr: nil,
-		Err:  err,
-	}
-}
-
-// Dial connects to an RPC server at the specified network address.
-func Dial(network, address string) (*Client, error) {
-	conn, err := net.Dial(network, address)
-	if err != nil {
-		return nil, err
-	}
-	return NewClient(conn), nil
-}
-
-func (client *Client) Close() error {
-	client.mutex.Lock()
-	if client.closing {
-		client.mutex.Unlock()
-		return ErrShutdown
-	}
-	client.closing = true
-	client.mutex.Unlock()
-	return client.codec.Close()
-}
-
-// Go invokes the function asynchronously.  It returns the Call structure representing
-// the invocation.  The done channel will signal when the call is complete by returning
-// the same Call object.  If done is nil, Go will allocate a new channel.
-// If non-nil, done must be buffered or Go will deliberately crash.
-func (client *Client) Go(serviceMethod string, args interface{}, reply interface{}, done chan *Call) *Call {
-	call := new(Call)
-	call.ServiceMethod = serviceMethod
-	call.Args = args
-	call.Reply = reply
-	if done == nil {
-		done = make(chan *Call, 10) // buffered.
-	} else {
-		// If caller passes done != nil, it must arrange that
-		// done has enough buffer for the number of simultaneous
-		// RPCs that will be using that channel.  If the channel
-		// is totally unbuffered, it's best not to run at all.
-		if cap(done) == 0 {
-			log.Panic("rpc: done channel is unbuffered")
-		}
-	}
-	call.Done = done
-	client.send(call)
-	return call
-}
-
-// Call invokes the named function, waits for it to complete, and returns its error status.
-func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error {
-	call := <-client.Go(serviceMethod, args, reply, make(chan *Call, 1)).Done
-	return call.Error
-}
diff --git a/third_party/gofrontend/libgo/go/net/rpc/client_test.go b/third_party/gofrontend/libgo/go/net/rpc/client_test.go
deleted file mode 100644
index ba11ff8..0000000
--- a/third_party/gofrontend/libgo/go/net/rpc/client_test.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rpc
-
-import (
-	"errors"
-	"fmt"
-	"net"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-type shutdownCodec struct {
-	responded chan int
-	closed    bool
-}
-
-func (c *shutdownCodec) WriteRequest(*Request, interface{}) error { return nil }
-func (c *shutdownCodec) ReadResponseBody(interface{}) error       { return nil }
-func (c *shutdownCodec) ReadResponseHeader(*Response) error {
-	c.responded <- 1
-	return errors.New("shutdownCodec ReadResponseHeader")
-}
-func (c *shutdownCodec) Close() error {
-	c.closed = true
-	return nil
-}
-
-func TestCloseCodec(t *testing.T) {
-	codec := &shutdownCodec{responded: make(chan int)}
-	client := NewClientWithCodec(codec)
-	<-codec.responded
-	client.Close()
-	if !codec.closed {
-		t.Error("client.Close did not close codec")
-	}
-}
-
-// Test that errors in gob shut down the connection. Issue 7689.
-
-type R struct {
-	msg []byte // Not exported, so R does not work with gob.
-}
-
-type S struct{}
-
-func (s *S) Recv(nul *struct{}, reply *R) error {
-	*reply = R{[]byte("foo")}
-	return nil
-}
-
-func TestGobError(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping test; see https://golang.org/issue/8908")
-	}
-	defer func() {
-		err := recover()
-		if err == nil {
-			t.Fatal("no error")
-		}
-		if !strings.Contains("reading body EOF", err.(error).Error()) {
-			t.Fatal("expected `reading body EOF', got", err)
-		}
-	}()
-	Register(new(S))
-
-	listen, err := net.Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		panic(err)
-	}
-	go Accept(listen)
-
-	client, err := Dial("tcp", listen.Addr().String())
-	if err != nil {
-		panic(err)
-	}
-
-	var reply Reply
-	err = client.Call("S.Recv", &struct{}{}, &reply)
-	if err != nil {
-		panic(err)
-	}
-
-	fmt.Printf("%#v\n", reply)
-	client.Close()
-
-	listen.Close()
-}
diff --git a/third_party/gofrontend/libgo/go/net/rpc/debug.go b/third_party/gofrontend/libgo/go/net/rpc/debug.go
deleted file mode 100644
index 98b2c1c..0000000
--- a/third_party/gofrontend/libgo/go/net/rpc/debug.go
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rpc
-
-/*
-	Some HTML presented at http://machine:port/debug/rpc
-	Lists services, their methods, and some statistics, still rudimentary.
-*/
-
-import (
-	"fmt"
-	"html/template"
-	"net/http"
-	"sort"
-)
-
-const debugText = `<html>
-	<body>
-	<title>Services</title>
-	{{range .}}
-	<hr>
-	Service {{.Name}}
-	<hr>
-		<table>
-		<th align=center>Method</th><th align=center>Calls</th>
-		{{range .Method}}
-			<tr>
-			<td align=left font=fixed>{{.Name}}({{.Type.ArgType}}, {{.Type.ReplyType}}) error</td>
-			<td align=center>{{.Type.NumCalls}}</td>
-			</tr>
-		{{end}}
-		</table>
-	{{end}}
-	</body>
-	</html>`
-
-var debug = template.Must(template.New("RPC debug").Parse(debugText))
-
-// If set, print log statements for internal and I/O errors.
-var debugLog = false
-
-type debugMethod struct {
-	Type *methodType
-	Name string
-}
-
-type methodArray []debugMethod
-
-type debugService struct {
-	Service *service
-	Name    string
-	Method  methodArray
-}
-
-type serviceArray []debugService
-
-func (s serviceArray) Len() int           { return len(s) }
-func (s serviceArray) Less(i, j int) bool { return s[i].Name < s[j].Name }
-func (s serviceArray) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
-
-func (m methodArray) Len() int           { return len(m) }
-func (m methodArray) Less(i, j int) bool { return m[i].Name < m[j].Name }
-func (m methodArray) Swap(i, j int)      { m[i], m[j] = m[j], m[i] }
-
-type debugHTTP struct {
-	*Server
-}
-
-// Runs at /debug/rpc
-func (server debugHTTP) ServeHTTP(w http.ResponseWriter, req *http.Request) {
-	// Build a sorted version of the data.
-	var services = make(serviceArray, len(server.serviceMap))
-	i := 0
-	server.mu.Lock()
-	for sname, service := range server.serviceMap {
-		services[i] = debugService{service, sname, make(methodArray, len(service.method))}
-		j := 0
-		for mname, method := range service.method {
-			services[i].Method[j] = debugMethod{method, mname}
-			j++
-		}
-		sort.Sort(services[i].Method)
-		i++
-	}
-	server.mu.Unlock()
-	sort.Sort(services)
-	err := debug.Execute(w, services)
-	if err != nil {
-		fmt.Fprintln(w, "rpc: error executing template:", err.Error())
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/rpc/jsonrpc/all_test.go b/third_party/gofrontend/libgo/go/net/rpc/jsonrpc/all_test.go
deleted file mode 100644
index a433a36..0000000
--- a/third_party/gofrontend/libgo/go/net/rpc/jsonrpc/all_test.go
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package jsonrpc
-
-import (
-	"bytes"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net"
-	"net/rpc"
-	"strings"
-	"testing"
-)
-
-type Args struct {
-	A, B int
-}
-
-type Reply struct {
-	C int
-}
-
-type Arith int
-
-type ArithAddResp struct {
-	Id     interface{} `json:"id"`
-	Result Reply       `json:"result"`
-	Error  interface{} `json:"error"`
-}
-
-func (t *Arith) Add(args *Args, reply *Reply) error {
-	reply.C = args.A + args.B
-	return nil
-}
-
-func (t *Arith) Mul(args *Args, reply *Reply) error {
-	reply.C = args.A * args.B
-	return nil
-}
-
-func (t *Arith) Div(args *Args, reply *Reply) error {
-	if args.B == 0 {
-		return errors.New("divide by zero")
-	}
-	reply.C = args.A / args.B
-	return nil
-}
-
-func (t *Arith) Error(args *Args, reply *Reply) error {
-	panic("ERROR")
-}
-
-func init() {
-	rpc.Register(new(Arith))
-}
-
-func TestServerNoParams(t *testing.T) {
-	cli, srv := net.Pipe()
-	defer cli.Close()
-	go ServeConn(srv)
-	dec := json.NewDecoder(cli)
-
-	fmt.Fprintf(cli, `{"method": "Arith.Add", "id": "123"}`)
-	var resp ArithAddResp
-	if err := dec.Decode(&resp); err != nil {
-		t.Fatalf("Decode after no params: %s", err)
-	}
-	if resp.Error == nil {
-		t.Fatalf("Expected error, got nil")
-	}
-}
-
-func TestServerEmptyMessage(t *testing.T) {
-	cli, srv := net.Pipe()
-	defer cli.Close()
-	go ServeConn(srv)
-	dec := json.NewDecoder(cli)
-
-	fmt.Fprintf(cli, "{}")
-	var resp ArithAddResp
-	if err := dec.Decode(&resp); err != nil {
-		t.Fatalf("Decode after empty: %s", err)
-	}
-	if resp.Error == nil {
-		t.Fatalf("Expected error, got nil")
-	}
-}
-
-func TestServer(t *testing.T) {
-	cli, srv := net.Pipe()
-	defer cli.Close()
-	go ServeConn(srv)
-	dec := json.NewDecoder(cli)
-
-	// Send hand-coded requests to server, parse responses.
-	for i := 0; i < 10; i++ {
-		fmt.Fprintf(cli, `{"method": "Arith.Add", "id": "\u%04d", "params": [{"A": %d, "B": %d}]}`, i, i, i+1)
-		var resp ArithAddResp
-		err := dec.Decode(&resp)
-		if err != nil {
-			t.Fatalf("Decode: %s", err)
-		}
-		if resp.Error != nil {
-			t.Fatalf("resp.Error: %s", resp.Error)
-		}
-		if resp.Id.(string) != string(i) {
-			t.Fatalf("resp: bad id %q want %q", resp.Id.(string), string(i))
-		}
-		if resp.Result.C != 2*i+1 {
-			t.Fatalf("resp: bad result: %d+%d=%d", i, i+1, resp.Result.C)
-		}
-	}
-}
-
-func TestClient(t *testing.T) {
-	// Assume server is okay (TestServer is above).
-	// Test client against server.
-	cli, srv := net.Pipe()
-	go ServeConn(srv)
-
-	client := NewClient(cli)
-	defer client.Close()
-
-	// Synchronous calls
-	args := &Args{7, 8}
-	reply := new(Reply)
-	err := client.Call("Arith.Add", args, reply)
-	if err != nil {
-		t.Errorf("Add: expected no error but got string %q", err.Error())
-	}
-	if reply.C != args.A+args.B {
-		t.Errorf("Add: got %d expected %d", reply.C, args.A+args.B)
-	}
-
-	args = &Args{7, 8}
-	reply = new(Reply)
-	err = client.Call("Arith.Mul", args, reply)
-	if err != nil {
-		t.Errorf("Mul: expected no error but got string %q", err.Error())
-	}
-	if reply.C != args.A*args.B {
-		t.Errorf("Mul: got %d expected %d", reply.C, args.A*args.B)
-	}
-
-	// Out of order.
-	args = &Args{7, 8}
-	mulReply := new(Reply)
-	mulCall := client.Go("Arith.Mul", args, mulReply, nil)
-	addReply := new(Reply)
-	addCall := client.Go("Arith.Add", args, addReply, nil)
-
-	addCall = <-addCall.Done
-	if addCall.Error != nil {
-		t.Errorf("Add: expected no error but got string %q", addCall.Error.Error())
-	}
-	if addReply.C != args.A+args.B {
-		t.Errorf("Add: got %d expected %d", addReply.C, args.A+args.B)
-	}
-
-	mulCall = <-mulCall.Done
-	if mulCall.Error != nil {
-		t.Errorf("Mul: expected no error but got string %q", mulCall.Error.Error())
-	}
-	if mulReply.C != args.A*args.B {
-		t.Errorf("Mul: got %d expected %d", mulReply.C, args.A*args.B)
-	}
-
-	// Error test
-	args = &Args{7, 0}
-	reply = new(Reply)
-	err = client.Call("Arith.Div", args, reply)
-	// expect an error: zero divide
-	if err == nil {
-		t.Error("Div: expected error")
-	} else if err.Error() != "divide by zero" {
-		t.Error("Div: expected divide by zero error; got", err)
-	}
-}
-
-func TestMalformedInput(t *testing.T) {
-	cli, srv := net.Pipe()
-	go cli.Write([]byte(`{id:1}`)) // invalid json
-	ServeConn(srv)                 // must return, not loop
-}
-
-func TestMalformedOutput(t *testing.T) {
-	cli, srv := net.Pipe()
-	go srv.Write([]byte(`{"id":0,"result":null,"error":null}`))
-	go ioutil.ReadAll(srv)
-
-	client := NewClient(cli)
-	defer client.Close()
-
-	args := &Args{7, 8}
-	reply := new(Reply)
-	err := client.Call("Arith.Add", args, reply)
-	if err == nil {
-		t.Error("expected error")
-	}
-}
-
-func TestServerErrorHasNullResult(t *testing.T) {
-	var out bytes.Buffer
-	sc := NewServerCodec(struct {
-		io.Reader
-		io.Writer
-		io.Closer
-	}{
-		Reader: strings.NewReader(`{"method": "Arith.Add", "id": "123", "params": []}`),
-		Writer: &out,
-		Closer: ioutil.NopCloser(nil),
-	})
-	r := new(rpc.Request)
-	if err := sc.ReadRequestHeader(r); err != nil {
-		t.Fatal(err)
-	}
-	const valueText = "the value we don't want to see"
-	const errorText = "some error"
-	err := sc.WriteResponse(&rpc.Response{
-		ServiceMethod: "Method",
-		Seq:           1,
-		Error:         errorText,
-	}, valueText)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !strings.Contains(out.String(), errorText) {
-		t.Fatalf("Response didn't contain expected error %q: %s", errorText, &out)
-	}
-	if strings.Contains(out.String(), valueText) {
-		t.Errorf("Response contains both an error and value: %s", &out)
-	}
-}
-
-func TestUnexpectedError(t *testing.T) {
-	cli, srv := myPipe()
-	go cli.PipeWriter.CloseWithError(errors.New("unexpected error!")) // reader will get this error
-	ServeConn(srv)                                                    // must return, not loop
-}
-
-// Copied from package net.
-func myPipe() (*pipe, *pipe) {
-	r1, w1 := io.Pipe()
-	r2, w2 := io.Pipe()
-
-	return &pipe{r1, w2}, &pipe{r2, w1}
-}
-
-type pipe struct {
-	*io.PipeReader
-	*io.PipeWriter
-}
-
-type pipeAddr int
-
-func (pipeAddr) Network() string {
-	return "pipe"
-}
-
-func (pipeAddr) String() string {
-	return "pipe"
-}
-
-func (p *pipe) Close() error {
-	err := p.PipeReader.Close()
-	err1 := p.PipeWriter.Close()
-	if err == nil {
-		err = err1
-	}
-	return err
-}
-
-func (p *pipe) LocalAddr() net.Addr {
-	return pipeAddr(0)
-}
-
-func (p *pipe) RemoteAddr() net.Addr {
-	return pipeAddr(0)
-}
-
-func (p *pipe) SetTimeout(nsec int64) error {
-	return errors.New("net.Pipe does not support timeouts")
-}
-
-func (p *pipe) SetReadTimeout(nsec int64) error {
-	return errors.New("net.Pipe does not support timeouts")
-}
-
-func (p *pipe) SetWriteTimeout(nsec int64) error {
-	return errors.New("net.Pipe does not support timeouts")
-}
diff --git a/third_party/gofrontend/libgo/go/net/rpc/jsonrpc/client.go b/third_party/gofrontend/libgo/go/net/rpc/jsonrpc/client.go
deleted file mode 100644
index 2194f21..0000000
--- a/third_party/gofrontend/libgo/go/net/rpc/jsonrpc/client.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package jsonrpc implements a JSON-RPC ClientCodec and ServerCodec
-// for the rpc package.
-package jsonrpc
-
-import (
-	"encoding/json"
-	"fmt"
-	"io"
-	"net"
-	"net/rpc"
-	"sync"
-)
-
-type clientCodec struct {
-	dec *json.Decoder // for reading JSON values
-	enc *json.Encoder // for writing JSON values
-	c   io.Closer
-
-	// temporary work space
-	req  clientRequest
-	resp clientResponse
-
-	// JSON-RPC responses include the request id but not the request method.
-	// Package rpc expects both.
-	// We save the request method in pending when sending a request
-	// and then look it up by request ID when filling out the rpc Response.
-	mutex   sync.Mutex        // protects pending
-	pending map[uint64]string // map request id to method name
-}
-
-// NewClientCodec returns a new rpc.ClientCodec using JSON-RPC on conn.
-func NewClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec {
-	return &clientCodec{
-		dec:     json.NewDecoder(conn),
-		enc:     json.NewEncoder(conn),
-		c:       conn,
-		pending: make(map[uint64]string),
-	}
-}
-
-type clientRequest struct {
-	Method string         `json:"method"`
-	Params [1]interface{} `json:"params"`
-	Id     uint64         `json:"id"`
-}
-
-func (c *clientCodec) WriteRequest(r *rpc.Request, param interface{}) error {
-	c.mutex.Lock()
-	c.pending[r.Seq] = r.ServiceMethod
-	c.mutex.Unlock()
-	c.req.Method = r.ServiceMethod
-	c.req.Params[0] = param
-	c.req.Id = r.Seq
-	return c.enc.Encode(&c.req)
-}
-
-type clientResponse struct {
-	Id     uint64           `json:"id"`
-	Result *json.RawMessage `json:"result"`
-	Error  interface{}      `json:"error"`
-}
-
-func (r *clientResponse) reset() {
-	r.Id = 0
-	r.Result = nil
-	r.Error = nil
-}
-
-func (c *clientCodec) ReadResponseHeader(r *rpc.Response) error {
-	c.resp.reset()
-	if err := c.dec.Decode(&c.resp); err != nil {
-		return err
-	}
-
-	c.mutex.Lock()
-	r.ServiceMethod = c.pending[c.resp.Id]
-	delete(c.pending, c.resp.Id)
-	c.mutex.Unlock()
-
-	r.Error = ""
-	r.Seq = c.resp.Id
-	if c.resp.Error != nil || c.resp.Result == nil {
-		x, ok := c.resp.Error.(string)
-		if !ok {
-			return fmt.Errorf("invalid error %v", c.resp.Error)
-		}
-		if x == "" {
-			x = "unspecified error"
-		}
-		r.Error = x
-	}
-	return nil
-}
-
-func (c *clientCodec) ReadResponseBody(x interface{}) error {
-	if x == nil {
-		return nil
-	}
-	return json.Unmarshal(*c.resp.Result, x)
-}
-
-func (c *clientCodec) Close() error {
-	return c.c.Close()
-}
-
-// NewClient returns a new rpc.Client to handle requests to the
-// set of services at the other end of the connection.
-func NewClient(conn io.ReadWriteCloser) *rpc.Client {
-	return rpc.NewClientWithCodec(NewClientCodec(conn))
-}
-
-// Dial connects to a JSON-RPC server at the specified network address.
-func Dial(network, address string) (*rpc.Client, error) {
-	conn, err := net.Dial(network, address)
-	if err != nil {
-		return nil, err
-	}
-	return NewClient(conn), err
-}
diff --git a/third_party/gofrontend/libgo/go/net/rpc/jsonrpc/server.go b/third_party/gofrontend/libgo/go/net/rpc/jsonrpc/server.go
deleted file mode 100644
index e6d37cf..0000000
--- a/third_party/gofrontend/libgo/go/net/rpc/jsonrpc/server.go
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package jsonrpc
-
-import (
-	"encoding/json"
-	"errors"
-	"io"
-	"net/rpc"
-	"sync"
-)
-
-var errMissingParams = errors.New("jsonrpc: request body missing params")
-
-type serverCodec struct {
-	dec *json.Decoder // for reading JSON values
-	enc *json.Encoder // for writing JSON values
-	c   io.Closer
-
-	// temporary work space
-	req serverRequest
-
-	// JSON-RPC clients can use arbitrary json values as request IDs.
-	// Package rpc expects uint64 request IDs.
-	// We assign uint64 sequence numbers to incoming requests
-	// but save the original request ID in the pending map.
-	// When rpc responds, we use the sequence number in
-	// the response to find the original request ID.
-	mutex   sync.Mutex // protects seq, pending
-	seq     uint64
-	pending map[uint64]*json.RawMessage
-}
-
-// NewServerCodec returns a new rpc.ServerCodec using JSON-RPC on conn.
-func NewServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec {
-	return &serverCodec{
-		dec:     json.NewDecoder(conn),
-		enc:     json.NewEncoder(conn),
-		c:       conn,
-		pending: make(map[uint64]*json.RawMessage),
-	}
-}
-
-type serverRequest struct {
-	Method string           `json:"method"`
-	Params *json.RawMessage `json:"params"`
-	Id     *json.RawMessage `json:"id"`
-}
-
-func (r *serverRequest) reset() {
-	r.Method = ""
-	r.Params = nil
-	r.Id = nil
-}
-
-type serverResponse struct {
-	Id     *json.RawMessage `json:"id"`
-	Result interface{}      `json:"result"`
-	Error  interface{}      `json:"error"`
-}
-
-func (c *serverCodec) ReadRequestHeader(r *rpc.Request) error {
-	c.req.reset()
-	if err := c.dec.Decode(&c.req); err != nil {
-		return err
-	}
-	r.ServiceMethod = c.req.Method
-
-	// JSON request id can be any JSON value;
-	// RPC package expects uint64.  Translate to
-	// internal uint64 and save JSON on the side.
-	c.mutex.Lock()
-	c.seq++
-	c.pending[c.seq] = c.req.Id
-	c.req.Id = nil
-	r.Seq = c.seq
-	c.mutex.Unlock()
-
-	return nil
-}
-
-func (c *serverCodec) ReadRequestBody(x interface{}) error {
-	if x == nil {
-		return nil
-	}
-	if c.req.Params == nil {
-		return errMissingParams
-	}
-	// JSON params is array value.
-	// RPC params is struct.
-	// Unmarshal into array containing struct for now.
-	// Should think about making RPC more general.
-	var params [1]interface{}
-	params[0] = x
-	return json.Unmarshal(*c.req.Params, &params)
-}
-
-var null = json.RawMessage([]byte("null"))
-
-func (c *serverCodec) WriteResponse(r *rpc.Response, x interface{}) error {
-	c.mutex.Lock()
-	b, ok := c.pending[r.Seq]
-	if !ok {
-		c.mutex.Unlock()
-		return errors.New("invalid sequence number in response")
-	}
-	delete(c.pending, r.Seq)
-	c.mutex.Unlock()
-
-	if b == nil {
-		// Invalid request so no id.  Use JSON null.
-		b = &null
-	}
-	resp := serverResponse{Id: b}
-	if r.Error == "" {
-		resp.Result = x
-	} else {
-		resp.Error = r.Error
-	}
-	return c.enc.Encode(resp)
-}
-
-func (c *serverCodec) Close() error {
-	return c.c.Close()
-}
-
-// ServeConn runs the JSON-RPC server on a single connection.
-// ServeConn blocks, serving the connection until the client hangs up.
-// The caller typically invokes ServeConn in a go statement.
-func ServeConn(conn io.ReadWriteCloser) {
-	rpc.ServeCodec(NewServerCodec(conn))
-}
diff --git a/third_party/gofrontend/libgo/go/net/rpc/server.go b/third_party/gofrontend/libgo/go/net/rpc/server.go
deleted file mode 100644
index 6e6e881..0000000
--- a/third_party/gofrontend/libgo/go/net/rpc/server.go
+++ /dev/null
@@ -1,710 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-	Package rpc provides access to the exported methods of an object across a
-	network or other I/O connection.  A server registers an object, making it visible
-	as a service with the name of the type of the object.  After registration, exported
-	methods of the object will be accessible remotely.  A server may register multiple
-	objects (services) of different types but it is an error to register multiple
-	objects of the same type.
-
-	Only methods that satisfy these criteria will be made available for remote access;
-	other methods will be ignored:
-
-		- the method's type is exported.
-		- the method is exported.
-		- the method has two arguments, both exported (or builtin) types.
-		- the method's second argument is a pointer.
-		- the method has return type error.
-
-	In effect, the method must look schematically like
-
-		func (t *T) MethodName(argType T1, replyType *T2) error
-
-	where T, T1 and T2 can be marshaled by encoding/gob.
-	These requirements apply even if a different codec is used.
-	(In the future, these requirements may soften for custom codecs.)
-
-	The method's first argument represents the arguments provided by the caller; the
-	second argument represents the result parameters to be returned to the caller.
-	The method's return value, if non-nil, is passed back as a string that the client
-	sees as if created by errors.New.  If an error is returned, the reply parameter
-	will not be sent back to the client.
-
-	The server may handle requests on a single connection by calling ServeConn.  More
-	typically it will create a network listener and call Accept or, for an HTTP
-	listener, HandleHTTP and http.Serve.
-
-	A client wishing to use the service establishes a connection and then invokes
-	NewClient on the connection.  The convenience function Dial (DialHTTP) performs
-	both steps for a raw network connection (an HTTP connection).  The resulting
-	Client object has two methods, Call and Go, that specify the service and method to
-	call, a pointer containing the arguments, and a pointer to receive the result
-	parameters.
-
-	The Call method waits for the remote call to complete while the Go method
-	launches the call asynchronously and signals completion using the Call
-	structure's Done channel.
-
-	Unless an explicit codec is set up, package encoding/gob is used to
-	transport the data.
-
-	Here is a simple example.  A server wishes to export an object of type Arith:
-
-		package server
-
-		type Args struct {
-			A, B int
-		}
-
-		type Quotient struct {
-			Quo, Rem int
-		}
-
-		type Arith int
-
-		func (t *Arith) Multiply(args *Args, reply *int) error {
-			*reply = args.A * args.B
-			return nil
-		}
-
-		func (t *Arith) Divide(args *Args, quo *Quotient) error {
-			if args.B == 0 {
-				return errors.New("divide by zero")
-			}
-			quo.Quo = args.A / args.B
-			quo.Rem = args.A % args.B
-			return nil
-		}
-
-	The server calls (for HTTP service):
-
-		arith := new(Arith)
-		rpc.Register(arith)
-		rpc.HandleHTTP()
-		l, e := net.Listen("tcp", ":1234")
-		if e != nil {
-			log.Fatal("listen error:", e)
-		}
-		go http.Serve(l, nil)
-
-	At this point, clients can see a service "Arith" with methods "Arith.Multiply" and
-	"Arith.Divide".  To invoke one, a client first dials the server:
-
-		client, err := rpc.DialHTTP("tcp", serverAddress + ":1234")
-		if err != nil {
-			log.Fatal("dialing:", err)
-		}
-
-	Then it can make a remote call:
-
-		// Synchronous call
-		args := &server.Args{7,8}
-		var reply int
-		err = client.Call("Arith.Multiply", args, &reply)
-		if err != nil {
-			log.Fatal("arith error:", err)
-		}
-		fmt.Printf("Arith: %d*%d=%d", args.A, args.B, reply)
-
-	or
-
-		// Asynchronous call
-		quotient := new(Quotient)
-		divCall := client.Go("Arith.Divide", args, quotient, nil)
-		replyCall := <-divCall.Done	// will be equal to divCall
-		// check errors, print, etc.
-
-	A server implementation will often provide a simple, type-safe wrapper for the
-	client.
-*/
-package rpc
-
-import (
-	"bufio"
-	"encoding/gob"
-	"errors"
-	"io"
-	"log"
-	"net"
-	"net/http"
-	"reflect"
-	"strings"
-	"sync"
-	"unicode"
-	"unicode/utf8"
-)
-
-const (
-	// Defaults used by HandleHTTP
-	DefaultRPCPath   = "/_goRPC_"
-	DefaultDebugPath = "/debug/rpc"
-)
-
-// Precompute the reflect type for error.  Can't use error directly
-// because Typeof takes an empty interface value.  This is annoying.
-var typeOfError = reflect.TypeOf((*error)(nil)).Elem()
-
-type methodType struct {
-	sync.Mutex // protects counters
-	method     reflect.Method
-	ArgType    reflect.Type
-	ReplyType  reflect.Type
-	numCalls   uint
-}
-
-type service struct {
-	name   string                 // name of service
-	rcvr   reflect.Value          // receiver of methods for the service
-	typ    reflect.Type           // type of the receiver
-	method map[string]*methodType // registered methods
-}
-
-// Request is a header written before every RPC call.  It is used internally
-// but documented here as an aid to debugging, such as when analyzing
-// network traffic.
-type Request struct {
-	ServiceMethod string   // format: "Service.Method"
-	Seq           uint64   // sequence number chosen by client
-	next          *Request // for free list in Server
-}
-
-// Response is a header written before every RPC return.  It is used internally
-// but documented here as an aid to debugging, such as when analyzing
-// network traffic.
-type Response struct {
-	ServiceMethod string    // echoes that of the Request
-	Seq           uint64    // echoes that of the request
-	Error         string    // error, if any.
-	next          *Response // for free list in Server
-}
-
-// Server represents an RPC Server.
-type Server struct {
-	mu         sync.RWMutex // protects the serviceMap
-	serviceMap map[string]*service
-	reqLock    sync.Mutex // protects freeReq
-	freeReq    *Request
-	respLock   sync.Mutex // protects freeResp
-	freeResp   *Response
-}
-
-// NewServer returns a new Server.
-func NewServer() *Server {
-	return &Server{serviceMap: make(map[string]*service)}
-}
-
-// DefaultServer is the default instance of *Server.
-var DefaultServer = NewServer()
-
-// Is this an exported - upper case - name?
-func isExported(name string) bool {
-	rune, _ := utf8.DecodeRuneInString(name)
-	return unicode.IsUpper(rune)
-}
-
-// Is this type exported or a builtin?
-func isExportedOrBuiltinType(t reflect.Type) bool {
-	for t.Kind() == reflect.Ptr {
-		t = t.Elem()
-	}
-	// PkgPath will be non-empty even for an exported type,
-	// so we need to check the type name as well.
-	return isExported(t.Name()) || t.PkgPath() == ""
-}
-
-// Register publishes in the server the set of methods of the
-// receiver value that satisfy the following conditions:
-//	- exported method of exported type
-//	- two arguments, both of exported type
-//	- the second argument is a pointer
-//	- one return value, of type error
-// It returns an error if the receiver is not an exported type or has
-// no suitable methods. It also logs the error using package log.
-// The client accesses each method using a string of the form "Type.Method",
-// where Type is the receiver's concrete type.
-func (server *Server) Register(rcvr interface{}) error {
-	return server.register(rcvr, "", false)
-}
-
-// RegisterName is like Register but uses the provided name for the type
-// instead of the receiver's concrete type.
-func (server *Server) RegisterName(name string, rcvr interface{}) error {
-	return server.register(rcvr, name, true)
-}
-
-func (server *Server) register(rcvr interface{}, name string, useName bool) error {
-	server.mu.Lock()
-	defer server.mu.Unlock()
-	if server.serviceMap == nil {
-		server.serviceMap = make(map[string]*service)
-	}
-	s := new(service)
-	s.typ = reflect.TypeOf(rcvr)
-	s.rcvr = reflect.ValueOf(rcvr)
-	sname := reflect.Indirect(s.rcvr).Type().Name()
-	if useName {
-		sname = name
-	}
-	if sname == "" {
-		s := "rpc.Register: no service name for type " + s.typ.String()
-		log.Print(s)
-		return errors.New(s)
-	}
-	if !isExported(sname) && !useName {
-		s := "rpc.Register: type " + sname + " is not exported"
-		log.Print(s)
-		return errors.New(s)
-	}
-	if _, present := server.serviceMap[sname]; present {
-		return errors.New("rpc: service already defined: " + sname)
-	}
-	s.name = sname
-
-	// Install the methods
-	s.method = suitableMethods(s.typ, true)
-
-	if len(s.method) == 0 {
-		str := ""
-
-		// To help the user, see if a pointer receiver would work.
-		method := suitableMethods(reflect.PtrTo(s.typ), false)
-		if len(method) != 0 {
-			str = "rpc.Register: type " + sname + " has no exported methods of suitable type (hint: pass a pointer to value of that type)"
-		} else {
-			str = "rpc.Register: type " + sname + " has no exported methods of suitable type"
-		}
-		log.Print(str)
-		return errors.New(str)
-	}
-	server.serviceMap[s.name] = s
-	return nil
-}
-
-// suitableMethods returns suitable Rpc methods of typ, it will report
-// error using log if reportErr is true.
-func suitableMethods(typ reflect.Type, reportErr bool) map[string]*methodType {
-	methods := make(map[string]*methodType)
-	for m := 0; m < typ.NumMethod(); m++ {
-		method := typ.Method(m)
-		mtype := method.Type
-		mname := method.Name
-		// Method must be exported.
-		if method.PkgPath != "" {
-			continue
-		}
-		// Method needs three ins: receiver, *args, *reply.
-		if mtype.NumIn() != 3 {
-			if reportErr {
-				log.Println("method", mname, "has wrong number of ins:", mtype.NumIn())
-			}
-			continue
-		}
-		// First arg need not be a pointer.
-		argType := mtype.In(1)
-		if !isExportedOrBuiltinType(argType) {
-			if reportErr {
-				log.Println(mname, "argument type not exported:", argType)
-			}
-			continue
-		}
-		// Second arg must be a pointer.
-		replyType := mtype.In(2)
-		if replyType.Kind() != reflect.Ptr {
-			if reportErr {
-				log.Println("method", mname, "reply type not a pointer:", replyType)
-			}
-			continue
-		}
-		// Reply type must be exported.
-		if !isExportedOrBuiltinType(replyType) {
-			if reportErr {
-				log.Println("method", mname, "reply type not exported:", replyType)
-			}
-			continue
-		}
-		// Method needs one out.
-		if mtype.NumOut() != 1 {
-			if reportErr {
-				log.Println("method", mname, "has wrong number of outs:", mtype.NumOut())
-			}
-			continue
-		}
-		// The return type of the method must be error.
-		if returnType := mtype.Out(0); returnType != typeOfError {
-			if reportErr {
-				log.Println("method", mname, "returns", returnType.String(), "not error")
-			}
-			continue
-		}
-		methods[mname] = &methodType{method: method, ArgType: argType, ReplyType: replyType}
-	}
-	return methods
-}
-
-// A value sent as a placeholder for the server's response value when the server
-// receives an invalid request. It is never decoded by the client since the Response
-// contains an error when it is used.
-var invalidRequest = struct{}{}
-
-func (server *Server) sendResponse(sending *sync.Mutex, req *Request, reply interface{}, codec ServerCodec, errmsg string) {
-	resp := server.getResponse()
-	// Encode the response header
-	resp.ServiceMethod = req.ServiceMethod
-	if errmsg != "" {
-		resp.Error = errmsg
-		reply = invalidRequest
-	}
-	resp.Seq = req.Seq
-	sending.Lock()
-	err := codec.WriteResponse(resp, reply)
-	if debugLog && err != nil {
-		log.Println("rpc: writing response:", err)
-	}
-	sending.Unlock()
-	server.freeResponse(resp)
-}
-
-func (m *methodType) NumCalls() (n uint) {
-	m.Lock()
-	n = m.numCalls
-	m.Unlock()
-	return n
-}
-
-func (s *service) call(server *Server, sending *sync.Mutex, mtype *methodType, req *Request, argv, replyv reflect.Value, codec ServerCodec) {
-	mtype.Lock()
-	mtype.numCalls++
-	mtype.Unlock()
-	function := mtype.method.Func
-	// Invoke the method, providing a new value for the reply.
-	returnValues := function.Call([]reflect.Value{s.rcvr, argv, replyv})
-	// The return value for the method is an error.
-	errInter := returnValues[0].Interface()
-	errmsg := ""
-	if errInter != nil {
-		errmsg = errInter.(error).Error()
-	}
-	server.sendResponse(sending, req, replyv.Interface(), codec, errmsg)
-	server.freeRequest(req)
-}
-
-type gobServerCodec struct {
-	rwc    io.ReadWriteCloser
-	dec    *gob.Decoder
-	enc    *gob.Encoder
-	encBuf *bufio.Writer
-	closed bool
-}
-
-func (c *gobServerCodec) ReadRequestHeader(r *Request) error {
-	return c.dec.Decode(r)
-}
-
-func (c *gobServerCodec) ReadRequestBody(body interface{}) error {
-	return c.dec.Decode(body)
-}
-
-func (c *gobServerCodec) WriteResponse(r *Response, body interface{}) (err error) {
-	if err = c.enc.Encode(r); err != nil {
-		if c.encBuf.Flush() == nil {
-			// Gob couldn't encode the header. Should not happen, so if it does,
-			// shut down the connection to signal that the connection is broken.
-			log.Println("rpc: gob error encoding response:", err)
-			c.Close()
-		}
-		return
-	}
-	if err = c.enc.Encode(body); err != nil {
-		if c.encBuf.Flush() == nil {
-			// Was a gob problem encoding the body but the header has been written.
-			// Shut down the connection to signal that the connection is broken.
-			log.Println("rpc: gob error encoding body:", err)
-			c.Close()
-		}
-		return
-	}
-	return c.encBuf.Flush()
-}
-
-func (c *gobServerCodec) Close() error {
-	if c.closed {
-		// Only call c.rwc.Close once; otherwise the semantics are undefined.
-		return nil
-	}
-	c.closed = true
-	return c.rwc.Close()
-}
-
-// ServeConn runs the server on a single connection.
-// ServeConn blocks, serving the connection until the client hangs up.
-// The caller typically invokes ServeConn in a go statement.
-// ServeConn uses the gob wire format (see package gob) on the
-// connection.  To use an alternate codec, use ServeCodec.
-func (server *Server) ServeConn(conn io.ReadWriteCloser) {
-	buf := bufio.NewWriter(conn)
-	srv := &gobServerCodec{
-		rwc:    conn,
-		dec:    gob.NewDecoder(conn),
-		enc:    gob.NewEncoder(buf),
-		encBuf: buf,
-	}
-	server.ServeCodec(srv)
-}
-
-// ServeCodec is like ServeConn but uses the specified codec to
-// decode requests and encode responses.
-func (server *Server) ServeCodec(codec ServerCodec) {
-	sending := new(sync.Mutex)
-	for {
-		service, mtype, req, argv, replyv, keepReading, err := server.readRequest(codec)
-		if err != nil {
-			if debugLog && err != io.EOF {
-				log.Println("rpc:", err)
-			}
-			if !keepReading {
-				break
-			}
-			// send a response if we actually managed to read a header.
-			if req != nil {
-				server.sendResponse(sending, req, invalidRequest, codec, err.Error())
-				server.freeRequest(req)
-			}
-			continue
-		}
-		go service.call(server, sending, mtype, req, argv, replyv, codec)
-	}
-	codec.Close()
-}
-
-// ServeRequest is like ServeCodec but synchronously serves a single request.
-// It does not close the codec upon completion.
-func (server *Server) ServeRequest(codec ServerCodec) error {
-	sending := new(sync.Mutex)
-	service, mtype, req, argv, replyv, keepReading, err := server.readRequest(codec)
-	if err != nil {
-		if !keepReading {
-			return err
-		}
-		// send a response if we actually managed to read a header.
-		if req != nil {
-			server.sendResponse(sending, req, invalidRequest, codec, err.Error())
-			server.freeRequest(req)
-		}
-		return err
-	}
-	service.call(server, sending, mtype, req, argv, replyv, codec)
-	return nil
-}
-
-func (server *Server) getRequest() *Request {
-	server.reqLock.Lock()
-	req := server.freeReq
-	if req == nil {
-		req = new(Request)
-	} else {
-		server.freeReq = req.next
-		*req = Request{}
-	}
-	server.reqLock.Unlock()
-	return req
-}
-
-func (server *Server) freeRequest(req *Request) {
-	server.reqLock.Lock()
-	req.next = server.freeReq
-	server.freeReq = req
-	server.reqLock.Unlock()
-}
-
-func (server *Server) getResponse() *Response {
-	server.respLock.Lock()
-	resp := server.freeResp
-	if resp == nil {
-		resp = new(Response)
-	} else {
-		server.freeResp = resp.next
-		*resp = Response{}
-	}
-	server.respLock.Unlock()
-	return resp
-}
-
-func (server *Server) freeResponse(resp *Response) {
-	server.respLock.Lock()
-	resp.next = server.freeResp
-	server.freeResp = resp
-	server.respLock.Unlock()
-}
-
-func (server *Server) readRequest(codec ServerCodec) (service *service, mtype *methodType, req *Request, argv, replyv reflect.Value, keepReading bool, err error) {
-	service, mtype, req, keepReading, err = server.readRequestHeader(codec)
-	if err != nil {
-		if !keepReading {
-			return
-		}
-		// discard body
-		codec.ReadRequestBody(nil)
-		return
-	}
-
-	// Decode the argument value.
-	argIsValue := false // if true, need to indirect before calling.
-	if mtype.ArgType.Kind() == reflect.Ptr {
-		argv = reflect.New(mtype.ArgType.Elem())
-	} else {
-		argv = reflect.New(mtype.ArgType)
-		argIsValue = true
-	}
-	// argv guaranteed to be a pointer now.
-	if err = codec.ReadRequestBody(argv.Interface()); err != nil {
-		return
-	}
-	if argIsValue {
-		argv = argv.Elem()
-	}
-
-	replyv = reflect.New(mtype.ReplyType.Elem())
-	return
-}
-
-func (server *Server) readRequestHeader(codec ServerCodec) (service *service, mtype *methodType, req *Request, keepReading bool, err error) {
-	// Grab the request header.
-	req = server.getRequest()
-	err = codec.ReadRequestHeader(req)
-	if err != nil {
-		req = nil
-		if err == io.EOF || err == io.ErrUnexpectedEOF {
-			return
-		}
-		err = errors.New("rpc: server cannot decode request: " + err.Error())
-		return
-	}
-
-	// We read the header successfully.  If we see an error now,
-	// we can still recover and move on to the next request.
-	keepReading = true
-
-	dot := strings.LastIndex(req.ServiceMethod, ".")
-	if dot < 0 {
-		err = errors.New("rpc: service/method request ill-formed: " + req.ServiceMethod)
-		return
-	}
-	serviceName := req.ServiceMethod[:dot]
-	methodName := req.ServiceMethod[dot+1:]
-
-	// Look up the request.
-	server.mu.RLock()
-	service = server.serviceMap[serviceName]
-	server.mu.RUnlock()
-	if service == nil {
-		err = errors.New("rpc: can't find service " + req.ServiceMethod)
-		return
-	}
-	mtype = service.method[methodName]
-	if mtype == nil {
-		err = errors.New("rpc: can't find method " + req.ServiceMethod)
-	}
-	return
-}
-
-// Accept accepts connections on the listener and serves requests
-// for each incoming connection.  Accept blocks; the caller typically
-// invokes it in a go statement.
-func (server *Server) Accept(lis net.Listener) {
-	for {
-		conn, err := lis.Accept()
-		if err != nil {
-			log.Fatal("rpc.Serve: accept:", err.Error()) // TODO(r): exit?
-		}
-		go server.ServeConn(conn)
-	}
-}
-
-// Register publishes the receiver's methods in the DefaultServer.
-func Register(rcvr interface{}) error { return DefaultServer.Register(rcvr) }
-
-// RegisterName is like Register but uses the provided name for the type
-// instead of the receiver's concrete type.
-func RegisterName(name string, rcvr interface{}) error {
-	return DefaultServer.RegisterName(name, rcvr)
-}
-
-// A ServerCodec implements reading of RPC requests and writing of
-// RPC responses for the server side of an RPC session.
-// The server calls ReadRequestHeader and ReadRequestBody in pairs
-// to read requests from the connection, and it calls WriteResponse to
-// write a response back.  The server calls Close when finished with the
-// connection. ReadRequestBody may be called with a nil
-// argument to force the body of the request to be read and discarded.
-type ServerCodec interface {
-	ReadRequestHeader(*Request) error
-	ReadRequestBody(interface{}) error
-	// WriteResponse must be safe for concurrent use by multiple goroutines.
-	WriteResponse(*Response, interface{}) error
-
-	Close() error
-}
-
-// ServeConn runs the DefaultServer on a single connection.
-// ServeConn blocks, serving the connection until the client hangs up.
-// The caller typically invokes ServeConn in a go statement.
-// ServeConn uses the gob wire format (see package gob) on the
-// connection.  To use an alternate codec, use ServeCodec.
-func ServeConn(conn io.ReadWriteCloser) {
-	DefaultServer.ServeConn(conn)
-}
-
-// ServeCodec is like ServeConn but uses the specified codec to
-// decode requests and encode responses.
-func ServeCodec(codec ServerCodec) {
-	DefaultServer.ServeCodec(codec)
-}
-
-// ServeRequest is like ServeCodec but synchronously serves a single request.
-// It does not close the codec upon completion.
-func ServeRequest(codec ServerCodec) error {
-	return DefaultServer.ServeRequest(codec)
-}
-
-// Accept accepts connections on the listener and serves requests
-// to DefaultServer for each incoming connection.
-// Accept blocks; the caller typically invokes it in a go statement.
-func Accept(lis net.Listener) { DefaultServer.Accept(lis) }
-
-// Can connect to RPC service using HTTP CONNECT to rpcPath.
-var connected = "200 Connected to Go RPC"
-
-// ServeHTTP implements an http.Handler that answers RPC requests.
-func (server *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
-	if req.Method != "CONNECT" {
-		w.Header().Set("Content-Type", "text/plain; charset=utf-8")
-		w.WriteHeader(http.StatusMethodNotAllowed)
-		io.WriteString(w, "405 must CONNECT\n")
-		return
-	}
-	conn, _, err := w.(http.Hijacker).Hijack()
-	if err != nil {
-		log.Print("rpc hijacking ", req.RemoteAddr, ": ", err.Error())
-		return
-	}
-	io.WriteString(conn, "HTTP/1.0 "+connected+"\n\n")
-	server.ServeConn(conn)
-}
-
-// HandleHTTP registers an HTTP handler for RPC messages on rpcPath,
-// and a debugging handler on debugPath.
-// It is still necessary to invoke http.Serve(), typically in a go statement.
-func (server *Server) HandleHTTP(rpcPath, debugPath string) {
-	http.Handle(rpcPath, server)
-	http.Handle(debugPath, debugHTTP{server})
-}
-
-// HandleHTTP registers an HTTP handler for RPC messages to DefaultServer
-// on DefaultRPCPath and a debugging handler on DefaultDebugPath.
-// It is still necessary to invoke http.Serve(), typically in a go statement.
-func HandleHTTP() {
-	DefaultServer.HandleHTTP(DefaultRPCPath, DefaultDebugPath)
-}
diff --git a/third_party/gofrontend/libgo/go/net/rpc/server_test.go b/third_party/gofrontend/libgo/go/net/rpc/server_test.go
deleted file mode 100644
index 0dc4ddc..0000000
--- a/third_party/gofrontend/libgo/go/net/rpc/server_test.go
+++ /dev/null
@@ -1,683 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rpc
-
-import (
-	"errors"
-	"fmt"
-	"io"
-	"log"
-	"net"
-	"net/http/httptest"
-	"runtime"
-	"strings"
-	"sync"
-	"sync/atomic"
-	"testing"
-	"time"
-)
-
-var (
-	newServer                 *Server
-	serverAddr, newServerAddr string
-	httpServerAddr            string
-	once, newOnce, httpOnce   sync.Once
-)
-
-const (
-	newHttpPath = "/foo"
-)
-
-type Args struct {
-	A, B int
-}
-
-type Reply struct {
-	C int
-}
-
-type Arith int
-
-// Some of Arith's methods have value args, some have pointer args. That's deliberate.
-
-func (t *Arith) Add(args Args, reply *Reply) error {
-	reply.C = args.A + args.B
-	return nil
-}
-
-func (t *Arith) Mul(args *Args, reply *Reply) error {
-	reply.C = args.A * args.B
-	return nil
-}
-
-func (t *Arith) Div(args Args, reply *Reply) error {
-	if args.B == 0 {
-		return errors.New("divide by zero")
-	}
-	reply.C = args.A / args.B
-	return nil
-}
-
-func (t *Arith) String(args *Args, reply *string) error {
-	*reply = fmt.Sprintf("%d+%d=%d", args.A, args.B, args.A+args.B)
-	return nil
-}
-
-func (t *Arith) Scan(args string, reply *Reply) (err error) {
-	_, err = fmt.Sscan(args, &reply.C)
-	return
-}
-
-func (t *Arith) Error(args *Args, reply *Reply) error {
-	panic("ERROR")
-}
-
-func listenTCP() (net.Listener, string) {
-	l, e := net.Listen("tcp", "127.0.0.1:0") // any available address
-	if e != nil {
-		log.Fatalf("net.Listen tcp :0: %v", e)
-	}
-	return l, l.Addr().String()
-}
-
-func startServer() {
-	Register(new(Arith))
-	RegisterName("net.rpc.Arith", new(Arith))
-
-	var l net.Listener
-	l, serverAddr = listenTCP()
-	log.Println("Test RPC server listening on", serverAddr)
-	go Accept(l)
-
-	HandleHTTP()
-	httpOnce.Do(startHttpServer)
-}
-
-func startNewServer() {
-	newServer = NewServer()
-	newServer.Register(new(Arith))
-	newServer.RegisterName("net.rpc.Arith", new(Arith))
-	newServer.RegisterName("newServer.Arith", new(Arith))
-
-	var l net.Listener
-	l, newServerAddr = listenTCP()
-	log.Println("NewServer test RPC server listening on", newServerAddr)
-	go newServer.Accept(l)
-
-	newServer.HandleHTTP(newHttpPath, "/bar")
-	httpOnce.Do(startHttpServer)
-}
-
-func startHttpServer() {
-	server := httptest.NewServer(nil)
-	httpServerAddr = server.Listener.Addr().String()
-	log.Println("Test HTTP RPC server listening on", httpServerAddr)
-}
-
-func TestRPC(t *testing.T) {
-	once.Do(startServer)
-	testRPC(t, serverAddr)
-	newOnce.Do(startNewServer)
-	testRPC(t, newServerAddr)
-	testNewServerRPC(t, newServerAddr)
-}
-
-func testRPC(t *testing.T, addr string) {
-	client, err := Dial("tcp", addr)
-	if err != nil {
-		t.Fatal("dialing", err)
-	}
-	defer client.Close()
-
-	// Synchronous calls
-	args := &Args{7, 8}
-	reply := new(Reply)
-	err = client.Call("Arith.Add", args, reply)
-	if err != nil {
-		t.Errorf("Add: expected no error but got string %q", err.Error())
-	}
-	if reply.C != args.A+args.B {
-		t.Errorf("Add: expected %d got %d", reply.C, args.A+args.B)
-	}
-
-	// Nonexistent method
-	args = &Args{7, 0}
-	reply = new(Reply)
-	err = client.Call("Arith.BadOperation", args, reply)
-	// expect an error
-	if err == nil {
-		t.Error("BadOperation: expected error")
-	} else if !strings.HasPrefix(err.Error(), "rpc: can't find method ") {
-		t.Errorf("BadOperation: expected can't find method error; got %q", err)
-	}
-
-	// Unknown service
-	args = &Args{7, 8}
-	reply = new(Reply)
-	err = client.Call("Arith.Unknown", args, reply)
-	if err == nil {
-		t.Error("expected error calling unknown service")
-	} else if strings.Index(err.Error(), "method") < 0 {
-		t.Error("expected error about method; got", err)
-	}
-
-	// Out of order.
-	args = &Args{7, 8}
-	mulReply := new(Reply)
-	mulCall := client.Go("Arith.Mul", args, mulReply, nil)
-	addReply := new(Reply)
-	addCall := client.Go("Arith.Add", args, addReply, nil)
-
-	addCall = <-addCall.Done
-	if addCall.Error != nil {
-		t.Errorf("Add: expected no error but got string %q", addCall.Error.Error())
-	}
-	if addReply.C != args.A+args.B {
-		t.Errorf("Add: expected %d got %d", addReply.C, args.A+args.B)
-	}
-
-	mulCall = <-mulCall.Done
-	if mulCall.Error != nil {
-		t.Errorf("Mul: expected no error but got string %q", mulCall.Error.Error())
-	}
-	if mulReply.C != args.A*args.B {
-		t.Errorf("Mul: expected %d got %d", mulReply.C, args.A*args.B)
-	}
-
-	// Error test
-	args = &Args{7, 0}
-	reply = new(Reply)
-	err = client.Call("Arith.Div", args, reply)
-	// expect an error: zero divide
-	if err == nil {
-		t.Error("Div: expected error")
-	} else if err.Error() != "divide by zero" {
-		t.Error("Div: expected divide by zero error; got", err)
-	}
-
-	// Bad type.
-	reply = new(Reply)
-	err = client.Call("Arith.Add", reply, reply) // args, reply would be the correct thing to use
-	if err == nil {
-		t.Error("expected error calling Arith.Add with wrong arg type")
-	} else if strings.Index(err.Error(), "type") < 0 {
-		t.Error("expected error about type; got", err)
-	}
-
-	// Non-struct argument
-	const Val = 12345
-	str := fmt.Sprint(Val)
-	reply = new(Reply)
-	err = client.Call("Arith.Scan", &str, reply)
-	if err != nil {
-		t.Errorf("Scan: expected no error but got string %q", err.Error())
-	} else if reply.C != Val {
-		t.Errorf("Scan: expected %d got %d", Val, reply.C)
-	}
-
-	// Non-struct reply
-	args = &Args{27, 35}
-	str = ""
-	err = client.Call("Arith.String", args, &str)
-	if err != nil {
-		t.Errorf("String: expected no error but got string %q", err.Error())
-	}
-	expect := fmt.Sprintf("%d+%d=%d", args.A, args.B, args.A+args.B)
-	if str != expect {
-		t.Errorf("String: expected %s got %s", expect, str)
-	}
-
-	args = &Args{7, 8}
-	reply = new(Reply)
-	err = client.Call("Arith.Mul", args, reply)
-	if err != nil {
-		t.Errorf("Mul: expected no error but got string %q", err.Error())
-	}
-	if reply.C != args.A*args.B {
-		t.Errorf("Mul: expected %d got %d", reply.C, args.A*args.B)
-	}
-
-	// ServiceName contain "." character
-	args = &Args{7, 8}
-	reply = new(Reply)
-	err = client.Call("net.rpc.Arith.Add", args, reply)
-	if err != nil {
-		t.Errorf("Add: expected no error but got string %q", err.Error())
-	}
-	if reply.C != args.A+args.B {
-		t.Errorf("Add: expected %d got %d", reply.C, args.A+args.B)
-	}
-}
-
-func testNewServerRPC(t *testing.T, addr string) {
-	client, err := Dial("tcp", addr)
-	if err != nil {
-		t.Fatal("dialing", err)
-	}
-	defer client.Close()
-
-	// Synchronous calls
-	args := &Args{7, 8}
-	reply := new(Reply)
-	err = client.Call("newServer.Arith.Add", args, reply)
-	if err != nil {
-		t.Errorf("Add: expected no error but got string %q", err.Error())
-	}
-	if reply.C != args.A+args.B {
-		t.Errorf("Add: expected %d got %d", reply.C, args.A+args.B)
-	}
-}
-
-func TestHTTP(t *testing.T) {
-	once.Do(startServer)
-	testHTTPRPC(t, "")
-	newOnce.Do(startNewServer)
-	testHTTPRPC(t, newHttpPath)
-}
-
-func testHTTPRPC(t *testing.T, path string) {
-	var client *Client
-	var err error
-	if path == "" {
-		client, err = DialHTTP("tcp", httpServerAddr)
-	} else {
-		client, err = DialHTTPPath("tcp", httpServerAddr, path)
-	}
-	if err != nil {
-		t.Fatal("dialing", err)
-	}
-	defer client.Close()
-
-	// Synchronous calls
-	args := &Args{7, 8}
-	reply := new(Reply)
-	err = client.Call("Arith.Add", args, reply)
-	if err != nil {
-		t.Errorf("Add: expected no error but got string %q", err.Error())
-	}
-	if reply.C != args.A+args.B {
-		t.Errorf("Add: expected %d got %d", reply.C, args.A+args.B)
-	}
-}
-
-// CodecEmulator provides a client-like api and a ServerCodec interface.
-// Can be used to test ServeRequest.
-type CodecEmulator struct {
-	server        *Server
-	serviceMethod string
-	args          *Args
-	reply         *Reply
-	err           error
-}
-
-func (codec *CodecEmulator) Call(serviceMethod string, args *Args, reply *Reply) error {
-	codec.serviceMethod = serviceMethod
-	codec.args = args
-	codec.reply = reply
-	codec.err = nil
-	var serverError error
-	if codec.server == nil {
-		serverError = ServeRequest(codec)
-	} else {
-		serverError = codec.server.ServeRequest(codec)
-	}
-	if codec.err == nil && serverError != nil {
-		codec.err = serverError
-	}
-	return codec.err
-}
-
-func (codec *CodecEmulator) ReadRequestHeader(req *Request) error {
-	req.ServiceMethod = codec.serviceMethod
-	req.Seq = 0
-	return nil
-}
-
-func (codec *CodecEmulator) ReadRequestBody(argv interface{}) error {
-	if codec.args == nil {
-		return io.ErrUnexpectedEOF
-	}
-	*(argv.(*Args)) = *codec.args
-	return nil
-}
-
-func (codec *CodecEmulator) WriteResponse(resp *Response, reply interface{}) error {
-	if resp.Error != "" {
-		codec.err = errors.New(resp.Error)
-	} else {
-		*codec.reply = *(reply.(*Reply))
-	}
-	return nil
-}
-
-func (codec *CodecEmulator) Close() error {
-	return nil
-}
-
-func TestServeRequest(t *testing.T) {
-	once.Do(startServer)
-	testServeRequest(t, nil)
-	newOnce.Do(startNewServer)
-	testServeRequest(t, newServer)
-}
-
-func testServeRequest(t *testing.T, server *Server) {
-	client := CodecEmulator{server: server}
-	defer client.Close()
-
-	args := &Args{7, 8}
-	reply := new(Reply)
-	err := client.Call("Arith.Add", args, reply)
-	if err != nil {
-		t.Errorf("Add: expected no error but got string %q", err.Error())
-	}
-	if reply.C != args.A+args.B {
-		t.Errorf("Add: expected %d got %d", reply.C, args.A+args.B)
-	}
-
-	err = client.Call("Arith.Add", nil, reply)
-	if err == nil {
-		t.Errorf("expected error calling Arith.Add with nil arg")
-	}
-}
-
-type ReplyNotPointer int
-type ArgNotPublic int
-type ReplyNotPublic int
-type NeedsPtrType int
-type local struct{}
-
-func (t *ReplyNotPointer) ReplyNotPointer(args *Args, reply Reply) error {
-	return nil
-}
-
-func (t *ArgNotPublic) ArgNotPublic(args *local, reply *Reply) error {
-	return nil
-}
-
-func (t *ReplyNotPublic) ReplyNotPublic(args *Args, reply *local) error {
-	return nil
-}
-
-func (t *NeedsPtrType) NeedsPtrType(args *Args, reply *Reply) error {
-	return nil
-}
-
-// Check that registration handles lots of bad methods and a type with no suitable methods.
-func TestRegistrationError(t *testing.T) {
-	err := Register(new(ReplyNotPointer))
-	if err == nil {
-		t.Error("expected error registering ReplyNotPointer")
-	}
-	err = Register(new(ArgNotPublic))
-	if err == nil {
-		t.Error("expected error registering ArgNotPublic")
-	}
-	err = Register(new(ReplyNotPublic))
-	if err == nil {
-		t.Error("expected error registering ReplyNotPublic")
-	}
-	err = Register(NeedsPtrType(0))
-	if err == nil {
-		t.Error("expected error registering NeedsPtrType")
-	} else if !strings.Contains(err.Error(), "pointer") {
-		t.Error("expected hint when registering NeedsPtrType")
-	}
-}
-
-type WriteFailCodec int
-
-func (WriteFailCodec) WriteRequest(*Request, interface{}) error {
-	// the panic caused by this error used to not unlock a lock.
-	return errors.New("fail")
-}
-
-func (WriteFailCodec) ReadResponseHeader(*Response) error {
-	select {}
-}
-
-func (WriteFailCodec) ReadResponseBody(interface{}) error {
-	select {}
-}
-
-func (WriteFailCodec) Close() error {
-	return nil
-}
-
-func TestSendDeadlock(t *testing.T) {
-	client := NewClientWithCodec(WriteFailCodec(0))
-	defer client.Close()
-
-	done := make(chan bool)
-	go func() {
-		testSendDeadlock(client)
-		testSendDeadlock(client)
-		done <- true
-	}()
-	select {
-	case <-done:
-		return
-	case <-time.After(5 * time.Second):
-		t.Fatal("deadlock")
-	}
-}
-
-func testSendDeadlock(client *Client) {
-	defer func() {
-		recover()
-	}()
-	args := &Args{7, 8}
-	reply := new(Reply)
-	client.Call("Arith.Add", args, reply)
-}
-
-func dialDirect() (*Client, error) {
-	return Dial("tcp", serverAddr)
-}
-
-func dialHTTP() (*Client, error) {
-	return DialHTTP("tcp", httpServerAddr)
-}
-
-func countMallocs(dial func() (*Client, error), t *testing.T) float64 {
-	once.Do(startServer)
-	client, err := dial()
-	if err != nil {
-		t.Fatal("error dialing", err)
-	}
-	defer client.Close()
-
-	args := &Args{7, 8}
-	reply := new(Reply)
-	return testing.AllocsPerRun(100, func() {
-		err := client.Call("Arith.Add", args, reply)
-		if err != nil {
-			t.Errorf("Add: expected no error but got string %q", err.Error())
-		}
-		if reply.C != args.A+args.B {
-			t.Errorf("Add: expected %d got %d", reply.C, args.A+args.B)
-		}
-	})
-}
-
-func TestCountMallocs(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping malloc count in short mode")
-	}
-	if runtime.GOMAXPROCS(0) > 1 {
-		t.Skip("skipping; GOMAXPROCS>1")
-	}
-	fmt.Printf("mallocs per rpc round trip: %v\n", countMallocs(dialDirect, t))
-}
-
-func TestCountMallocsOverHTTP(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping malloc count in short mode")
-	}
-	if runtime.GOMAXPROCS(0) > 1 {
-		t.Skip("skipping; GOMAXPROCS>1")
-	}
-	fmt.Printf("mallocs per HTTP rpc round trip: %v\n", countMallocs(dialHTTP, t))
-}
-
-type writeCrasher struct {
-	done chan bool
-}
-
-func (writeCrasher) Close() error {
-	return nil
-}
-
-func (w *writeCrasher) Read(p []byte) (int, error) {
-	<-w.done
-	return 0, io.EOF
-}
-
-func (writeCrasher) Write(p []byte) (int, error) {
-	return 0, errors.New("fake write failure")
-}
-
-func TestClientWriteError(t *testing.T) {
-	w := &writeCrasher{done: make(chan bool)}
-	c := NewClient(w)
-	defer c.Close()
-
-	res := false
-	err := c.Call("foo", 1, &res)
-	if err == nil {
-		t.Fatal("expected error")
-	}
-	if err.Error() != "fake write failure" {
-		t.Error("unexpected value of error:", err)
-	}
-	w.done <- true
-}
-
-func TestTCPClose(t *testing.T) {
-	once.Do(startServer)
-
-	client, err := dialHTTP()
-	if err != nil {
-		t.Fatalf("dialing: %v", err)
-	}
-	defer client.Close()
-
-	args := Args{17, 8}
-	var reply Reply
-	err = client.Call("Arith.Mul", args, &reply)
-	if err != nil {
-		t.Fatal("arith error:", err)
-	}
-	t.Logf("Arith: %d*%d=%d\n", args.A, args.B, reply)
-	if reply.C != args.A*args.B {
-		t.Errorf("Add: expected %d got %d", reply.C, args.A*args.B)
-	}
-}
-
-func TestErrorAfterClientClose(t *testing.T) {
-	once.Do(startServer)
-
-	client, err := dialHTTP()
-	if err != nil {
-		t.Fatalf("dialing: %v", err)
-	}
-	err = client.Close()
-	if err != nil {
-		t.Fatal("close error:", err)
-	}
-	err = client.Call("Arith.Add", &Args{7, 9}, new(Reply))
-	if err != ErrShutdown {
-		t.Errorf("Forever: expected ErrShutdown got %v", err)
-	}
-}
-
-func benchmarkEndToEnd(dial func() (*Client, error), b *testing.B) {
-	once.Do(startServer)
-	client, err := dial()
-	if err != nil {
-		b.Fatal("error dialing:", err)
-	}
-	defer client.Close()
-
-	// Synchronous calls
-	args := &Args{7, 8}
-	b.ResetTimer()
-
-	b.RunParallel(func(pb *testing.PB) {
-		reply := new(Reply)
-		for pb.Next() {
-			err := client.Call("Arith.Add", args, reply)
-			if err != nil {
-				b.Fatalf("rpc error: Add: expected no error but got string %q", err.Error())
-			}
-			if reply.C != args.A+args.B {
-				b.Fatalf("rpc error: Add: expected %d got %d", reply.C, args.A+args.B)
-			}
-		}
-	})
-}
-
-func benchmarkEndToEndAsync(dial func() (*Client, error), b *testing.B) {
-	const MaxConcurrentCalls = 100
-	once.Do(startServer)
-	client, err := dial()
-	if err != nil {
-		b.Fatal("error dialing:", err)
-	}
-	defer client.Close()
-
-	// Asynchronous calls
-	args := &Args{7, 8}
-	procs := 4 * runtime.GOMAXPROCS(-1)
-	send := int32(b.N)
-	recv := int32(b.N)
-	var wg sync.WaitGroup
-	wg.Add(procs)
-	gate := make(chan bool, MaxConcurrentCalls)
-	res := make(chan *Call, MaxConcurrentCalls)
-	b.ResetTimer()
-
-	for p := 0; p < procs; p++ {
-		go func() {
-			for atomic.AddInt32(&send, -1) >= 0 {
-				gate <- true
-				reply := new(Reply)
-				client.Go("Arith.Add", args, reply, res)
-			}
-		}()
-		go func() {
-			for call := range res {
-				A := call.Args.(*Args).A
-				B := call.Args.(*Args).B
-				C := call.Reply.(*Reply).C
-				if A+B != C {
-					b.Fatalf("incorrect reply: Add: expected %d got %d", A+B, C)
-				}
-				<-gate
-				if atomic.AddInt32(&recv, -1) == 0 {
-					close(res)
-				}
-			}
-			wg.Done()
-		}()
-	}
-	wg.Wait()
-}
-
-func BenchmarkEndToEnd(b *testing.B) {
-	benchmarkEndToEnd(dialDirect, b)
-}
-
-func BenchmarkEndToEndHTTP(b *testing.B) {
-	benchmarkEndToEnd(dialHTTP, b)
-}
-
-func BenchmarkEndToEndAsync(b *testing.B) {
-	benchmarkEndToEndAsync(dialDirect, b)
-}
-
-func BenchmarkEndToEndAsyncHTTP(b *testing.B) {
-	benchmarkEndToEndAsync(dialHTTP, b)
-}
diff --git a/third_party/gofrontend/libgo/go/net/sendfile_dragonfly.go b/third_party/gofrontend/libgo/go/net/sendfile_dragonfly.go
deleted file mode 100644
index a9cf3fe..0000000
--- a/third_party/gofrontend/libgo/go/net/sendfile_dragonfly.go
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"io"
-	"os"
-	"syscall"
-)
-
-// maxSendfileSize is the largest chunk size we ask the kernel to copy
-// at a time.
-const maxSendfileSize int = 4 << 20
-
-// sendFile copies the contents of r to c using the sendfile
-// system call to minimize copies.
-//
-// if handled == true, sendFile returns the number of bytes copied and any
-// non-EOF error.
-//
-// if handled == false, sendFile performed no work.
-func sendFile(c *netFD, r io.Reader) (written int64, err error, handled bool) {
-	// DragonFly uses 0 as the "until EOF" value. If you pass in more bytes than the
-	// file contains, it will loop back to the beginning ad nauseam until it's sent
-	// exactly the number of bytes told to. As such, we need to know exactly how many
-	// bytes to send.
-	var remain int64 = 0
-
-	lr, ok := r.(*io.LimitedReader)
-	if ok {
-		remain, r = lr.N, lr.R
-		if remain <= 0 {
-			return 0, nil, true
-		}
-	}
-	f, ok := r.(*os.File)
-	if !ok {
-		return 0, nil, false
-	}
-
-	if remain == 0 {
-		fi, err := f.Stat()
-		if err != nil {
-			return 0, err, false
-		}
-
-		remain = fi.Size()
-	}
-
-	// The other quirk with DragonFly's sendfile implementation is that it doesn't
-	// use the current position of the file -- if you pass it offset 0, it starts
-	// from offset 0. There's no way to tell it "start from current position", so
-	// we have to manage that explicitly.
-	pos, err := f.Seek(0, os.SEEK_CUR)
-	if err != nil {
-		return 0, err, false
-	}
-
-	if err := c.writeLock(); err != nil {
-		return 0, err, true
-	}
-	defer c.writeUnlock()
-
-	dst := c.sysfd
-	src := int(f.Fd())
-	for remain > 0 {
-		n := maxSendfileSize
-		if int64(n) > remain {
-			n = int(remain)
-		}
-		pos1 := pos
-		n, err1 := syscall.Sendfile(dst, src, &pos1, n)
-		if n > 0 {
-			pos += int64(n)
-			written += int64(n)
-			remain -= int64(n)
-		}
-		if n == 0 && err1 == nil {
-			break
-		}
-		if err1 == syscall.EAGAIN {
-			if err1 = c.pd.WaitWrite(); err1 == nil {
-				continue
-			}
-		}
-		if err1 == syscall.EINTR {
-			continue
-		}
-		if err1 != nil {
-			// This includes syscall.ENOSYS (no kernel
-			// support) and syscall.EINVAL (fd types which
-			// don't implement sendfile)
-			err = err1
-			break
-		}
-	}
-	if lr != nil {
-		lr.N = remain
-	}
-	if err != nil {
-		err = os.NewSyscallError("sendfile", err)
-	}
-	return written, err, written > 0
-}
diff --git a/third_party/gofrontend/libgo/go/net/sendfile_freebsd.go b/third_party/gofrontend/libgo/go/net/sendfile_freebsd.go
deleted file mode 100644
index d0bf603..0000000
--- a/third_party/gofrontend/libgo/go/net/sendfile_freebsd.go
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"io"
-	"os"
-	"syscall"
-)
-
-// maxSendfileSize is the largest chunk size we ask the kernel to copy
-// at a time.
-const maxSendfileSize int = 4 << 20
-
-// sendFile copies the contents of r to c using the sendfile
-// system call to minimize copies.
-//
-// if handled == true, sendFile returns the number of bytes copied and any
-// non-EOF error.
-//
-// if handled == false, sendFile performed no work.
-func sendFile(c *netFD, r io.Reader) (written int64, err error, handled bool) {
-	// FreeBSD uses 0 as the "until EOF" value. If you pass in more bytes than the
-	// file contains, it will loop back to the beginning ad nauseam until it's sent
-	// exactly the number of bytes told to. As such, we need to know exactly how many
-	// bytes to send.
-	var remain int64 = 0
-
-	lr, ok := r.(*io.LimitedReader)
-	if ok {
-		remain, r = lr.N, lr.R
-		if remain <= 0 {
-			return 0, nil, true
-		}
-	}
-	f, ok := r.(*os.File)
-	if !ok {
-		return 0, nil, false
-	}
-
-	if remain == 0 {
-		fi, err := f.Stat()
-		if err != nil {
-			return 0, err, false
-		}
-
-		remain = fi.Size()
-	}
-
-	// The other quirk with FreeBSD's sendfile implementation is that it doesn't
-	// use the current position of the file -- if you pass it offset 0, it starts
-	// from offset 0. There's no way to tell it "start from current position", so
-	// we have to manage that explicitly.
-	pos, err := f.Seek(0, os.SEEK_CUR)
-	if err != nil {
-		return 0, err, false
-	}
-
-	if err := c.writeLock(); err != nil {
-		return 0, err, true
-	}
-	defer c.writeUnlock()
-
-	dst := c.sysfd
-	src := int(f.Fd())
-	for remain > 0 {
-		n := maxSendfileSize
-		if int64(n) > remain {
-			n = int(remain)
-		}
-		pos1 := pos
-		n, err1 := syscall.Sendfile(dst, src, &pos1, n)
-		if n > 0 {
-			pos += int64(n)
-			written += int64(n)
-			remain -= int64(n)
-		}
-		if n == 0 && err1 == nil {
-			break
-		}
-		if err1 == syscall.EAGAIN {
-			if err1 = c.pd.WaitWrite(); err1 == nil {
-				continue
-			}
-		}
-		if err1 == syscall.EINTR {
-			continue
-		}
-		if err1 != nil {
-			// This includes syscall.ENOSYS (no kernel
-			// support) and syscall.EINVAL (fd types which
-			// don't implement sendfile)
-			err = err1
-			break
-		}
-	}
-	if lr != nil {
-		lr.N = remain
-	}
-	if err != nil {
-		err = os.NewSyscallError("sendfile", err)
-	}
-	return written, err, written > 0
-}
diff --git a/third_party/gofrontend/libgo/go/net/sendfile_linux.go b/third_party/gofrontend/libgo/go/net/sendfile_linux.go
deleted file mode 100644
index 5ca41c3..0000000
--- a/third_party/gofrontend/libgo/go/net/sendfile_linux.go
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"io"
-	"os"
-	"syscall"
-)
-
-// maxSendfileSize is the largest chunk size we ask the kernel to copy
-// at a time.
-const maxSendfileSize int = 4 << 20
-
-// sendFile copies the contents of r to c using the sendfile
-// system call to minimize copies.
-//
-// if handled == true, sendFile returns the number of bytes copied and any
-// non-EOF error.
-//
-// if handled == false, sendFile performed no work.
-func sendFile(c *netFD, r io.Reader) (written int64, err error, handled bool) {
-	var remain int64 = 1 << 62 // by default, copy until EOF
-
-	lr, ok := r.(*io.LimitedReader)
-	if ok {
-		remain, r = lr.N, lr.R
-		if remain <= 0 {
-			return 0, nil, true
-		}
-	}
-	f, ok := r.(*os.File)
-	if !ok {
-		return 0, nil, false
-	}
-
-	if err := c.writeLock(); err != nil {
-		return 0, err, true
-	}
-	defer c.writeUnlock()
-
-	dst := c.sysfd
-	src := int(f.Fd())
-	for remain > 0 {
-		n := maxSendfileSize
-		if int64(n) > remain {
-			n = int(remain)
-		}
-		n, err1 := syscall.Sendfile(dst, src, nil, n)
-		if n > 0 {
-			written += int64(n)
-			remain -= int64(n)
-		}
-		if n == 0 && err1 == nil {
-			break
-		}
-		if err1 == syscall.EAGAIN {
-			if err1 = c.pd.WaitWrite(); err1 == nil {
-				continue
-			}
-		}
-		if err1 != nil {
-			// This includes syscall.ENOSYS (no kernel
-			// support) and syscall.EINVAL (fd types which
-			// don't implement sendfile)
-			err = err1
-			break
-		}
-	}
-	if lr != nil {
-		lr.N = remain
-	}
-	if err != nil {
-		err = os.NewSyscallError("sendfile", err)
-	}
-	return written, err, written > 0
-}
diff --git a/third_party/gofrontend/libgo/go/net/sendfile_solaris.go b/third_party/gofrontend/libgo/go/net/sendfile_solaris.go
deleted file mode 100644
index 0966575..0000000
--- a/third_party/gofrontend/libgo/go/net/sendfile_solaris.go
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"io"
-	"os"
-	"syscall"
-)
-
-// Not strictly needed, but very helpful for debugging, see issue #10221.
-//go:cgo_import_dynamic _ _ "libsendfile.so"
-//go:cgo_import_dynamic _ _ "libsocket.so"
-
-// maxSendfileSize is the largest chunk size we ask the kernel to copy
-// at a time.
-const maxSendfileSize int = 4 << 20
-
-// sendFile copies the contents of r to c using the sendfile
-// system call to minimize copies.
-//
-// if handled == true, sendFile returns the number of bytes copied and any
-// non-EOF error.
-//
-// if handled == false, sendFile performed no work.
-func sendFile(c *netFD, r io.Reader) (written int64, err error, handled bool) {
-	// Solaris uses 0 as the "until EOF" value. If you pass in more bytes than the
-	// file contains, it will loop back to the beginning ad nauseam until it's sent
-	// exactly the number of bytes told to. As such, we need to know exactly how many
-	// bytes to send.
-	var remain int64 = 0
-
-	lr, ok := r.(*io.LimitedReader)
-	if ok {
-		remain, r = lr.N, lr.R
-		if remain <= 0 {
-			return 0, nil, true
-		}
-	}
-	f, ok := r.(*os.File)
-	if !ok {
-		return 0, nil, false
-	}
-
-	if remain == 0 {
-		fi, err := f.Stat()
-		if err != nil {
-			return 0, err, false
-		}
-
-		remain = fi.Size()
-	}
-
-	// The other quirk with Solaris's sendfile implementation is that it doesn't
-	// use the current position of the file -- if you pass it offset 0, it starts
-	// from offset 0. There's no way to tell it "start from current position", so
-	// we have to manage that explicitly.
-	pos, err := f.Seek(0, os.SEEK_CUR)
-	if err != nil {
-		return 0, err, false
-	}
-
-	if err := c.writeLock(); err != nil {
-		return 0, err, true
-	}
-	defer c.writeUnlock()
-
-	dst := c.sysfd
-	src := int(f.Fd())
-	for remain > 0 {
-		n := maxSendfileSize
-		if int64(n) > remain {
-			n = int(remain)
-		}
-		pos1 := pos
-		n, err1 := syscall.Sendfile(dst, src, &pos1, n)
-		if n > 0 {
-			pos += int64(n)
-			written += int64(n)
-			remain -= int64(n)
-		}
-		if n == 0 && err1 == nil {
-			break
-		}
-		if err1 == syscall.EAGAIN {
-			if err1 = c.pd.WaitWrite(); err1 == nil {
-				continue
-			}
-		}
-		if err1 == syscall.EINTR {
-			continue
-		}
-		if err1 != nil {
-			// This includes syscall.ENOSYS (no kernel
-			// support) and syscall.EINVAL (fd types which
-			// don't implement sendfile)
-			err = err1
-			break
-		}
-	}
-	if lr != nil {
-		lr.N = remain
-	}
-	if err != nil {
-		err = os.NewSyscallError("sendfile", err)
-	}
-	return written, err, written > 0
-}
diff --git a/third_party/gofrontend/libgo/go/net/sendfile_stub.go b/third_party/gofrontend/libgo/go/net/sendfile_stub.go
deleted file mode 100644
index a0760b4..0000000
--- a/third_party/gofrontend/libgo/go/net/sendfile_stub.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin nacl netbsd openbsd
-
-package net
-
-import "io"
-
-func sendFile(c *netFD, r io.Reader) (n int64, err error, handled bool) {
-	return 0, nil, false
-}
diff --git a/third_party/gofrontend/libgo/go/net/sendfile_windows.go b/third_party/gofrontend/libgo/go/net/sendfile_windows.go
deleted file mode 100644
index f3f3b54..0000000
--- a/third_party/gofrontend/libgo/go/net/sendfile_windows.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"io"
-	"os"
-	"syscall"
-)
-
-// sendFile copies the contents of r to c using the TransmitFile
-// system call to minimize copies.
-//
-// if handled == true, sendFile returns the number of bytes copied and any
-// non-EOF error.
-//
-// if handled == false, sendFile performed no work.
-//
-// Note that sendfile for windows does not suppport >2GB file.
-func sendFile(fd *netFD, r io.Reader) (written int64, err error, handled bool) {
-	var n int64 = 0 // by default, copy until EOF
-
-	lr, ok := r.(*io.LimitedReader)
-	if ok {
-		n, r = lr.N, lr.R
-		if n <= 0 {
-			return 0, nil, true
-		}
-	}
-	f, ok := r.(*os.File)
-	if !ok {
-		return 0, nil, false
-	}
-
-	if err := fd.writeLock(); err != nil {
-		return 0, err, true
-	}
-	defer fd.writeUnlock()
-
-	o := &fd.wop
-	o.qty = uint32(n)
-	o.handle = syscall.Handle(f.Fd())
-	done, err := wsrv.ExecIO(o, "TransmitFile", func(o *operation) error {
-		return syscall.TransmitFile(o.fd.sysfd, o.handle, o.qty, 0, &o.o, nil, syscall.TF_WRITE_BEHIND)
-	})
-	if err != nil {
-		return 0, os.NewSyscallError("transmitfile", err), false
-	}
-	if lr != nil {
-		lr.N -= int64(done)
-	}
-	return int64(done), nil, true
-}
diff --git a/third_party/gofrontend/libgo/go/net/server_test.go b/third_party/gofrontend/libgo/go/net/server_test.go
deleted file mode 100644
index fe0006b..0000000
--- a/third_party/gofrontend/libgo/go/net/server_test.go
+++ /dev/null
@@ -1,388 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"testing"
-)
-
-var tcpServerTests = []struct {
-	snet, saddr string // server endpoint
-	tnet, taddr string // target endpoint for client
-}{
-	{snet: "tcp", saddr: ":0", tnet: "tcp", taddr: "127.0.0.1"},
-	{snet: "tcp", saddr: "0.0.0.0:0", tnet: "tcp", taddr: "127.0.0.1"},
-	{snet: "tcp", saddr: "[::ffff:0.0.0.0]:0", tnet: "tcp", taddr: "127.0.0.1"},
-	{snet: "tcp", saddr: "[::]:0", tnet: "tcp", taddr: "::1"},
-
-	{snet: "tcp", saddr: ":0", tnet: "tcp", taddr: "::1"},
-	{snet: "tcp", saddr: "0.0.0.0:0", tnet: "tcp", taddr: "::1"},
-	{snet: "tcp", saddr: "[::ffff:0.0.0.0]:0", tnet: "tcp", taddr: "::1"},
-	{snet: "tcp", saddr: "[::]:0", tnet: "tcp", taddr: "127.0.0.1"},
-
-	{snet: "tcp", saddr: ":0", tnet: "tcp4", taddr: "127.0.0.1"},
-	{snet: "tcp", saddr: "0.0.0.0:0", tnet: "tcp4", taddr: "127.0.0.1"},
-	{snet: "tcp", saddr: "[::ffff:0.0.0.0]:0", tnet: "tcp4", taddr: "127.0.0.1"},
-	{snet: "tcp", saddr: "[::]:0", tnet: "tcp6", taddr: "::1"},
-
-	{snet: "tcp", saddr: ":0", tnet: "tcp6", taddr: "::1"},
-	{snet: "tcp", saddr: "0.0.0.0:0", tnet: "tcp6", taddr: "::1"},
-	{snet: "tcp", saddr: "[::ffff:0.0.0.0]:0", tnet: "tcp6", taddr: "::1"},
-	{snet: "tcp", saddr: "[::]:0", tnet: "tcp4", taddr: "127.0.0.1"},
-
-	{snet: "tcp", saddr: "127.0.0.1:0", tnet: "tcp", taddr: "127.0.0.1"},
-	{snet: "tcp", saddr: "[::ffff:127.0.0.1]:0", tnet: "tcp", taddr: "127.0.0.1"},
-	{snet: "tcp", saddr: "[::1]:0", tnet: "tcp", taddr: "::1"},
-
-	{snet: "tcp4", saddr: ":0", tnet: "tcp4", taddr: "127.0.0.1"},
-	{snet: "tcp4", saddr: "0.0.0.0:0", tnet: "tcp4", taddr: "127.0.0.1"},
-	{snet: "tcp4", saddr: "[::ffff:0.0.0.0]:0", tnet: "tcp4", taddr: "127.0.0.1"},
-
-	{snet: "tcp4", saddr: "127.0.0.1:0", tnet: "tcp4", taddr: "127.0.0.1"},
-
-	{snet: "tcp6", saddr: ":0", tnet: "tcp6", taddr: "::1"},
-	{snet: "tcp6", saddr: "[::]:0", tnet: "tcp6", taddr: "::1"},
-
-	{snet: "tcp6", saddr: "[::1]:0", tnet: "tcp6", taddr: "::1"},
-}
-
-// TestTCPServer tests concurrent accept-read-write servers.
-func TestTCPServer(t *testing.T) {
-	const N = 3
-
-	for i, tt := range tcpServerTests {
-		if !testableListenArgs(tt.snet, tt.saddr, tt.taddr) {
-			t.Logf("skipping %s test", tt.snet+" "+tt.saddr+"->"+tt.taddr)
-			continue
-		}
-
-		ln, err := Listen(tt.snet, tt.saddr)
-		if err != nil {
-			if perr := parseDialError(err); perr != nil {
-				t.Error(perr)
-			}
-			t.Fatal(err)
-		}
-
-		var lss []*localServer
-		var tpchs []chan error
-		defer func() {
-			for _, ls := range lss {
-				ls.teardown()
-			}
-		}()
-		for i := 0; i < N; i++ {
-			ls, err := (&streamListener{Listener: ln}).newLocalServer()
-			if err != nil {
-				t.Fatal(err)
-			}
-			lss = append(lss, ls)
-			tpchs = append(tpchs, make(chan error, 1))
-		}
-		for i := 0; i < N; i++ {
-			ch := tpchs[i]
-			handler := func(ls *localServer, ln Listener) { transponder(ln, ch) }
-			if err := lss[i].buildup(handler); err != nil {
-				t.Fatal(err)
-			}
-		}
-
-		var trchs []chan error
-		for i := 0; i < N; i++ {
-			_, port, err := SplitHostPort(lss[i].Listener.Addr().String())
-			if err != nil {
-				t.Fatal(err)
-			}
-			d := Dialer{Timeout: someTimeout}
-			c, err := d.Dial(tt.tnet, JoinHostPort(tt.taddr, port))
-			if err != nil {
-				if perr := parseDialError(err); perr != nil {
-					t.Error(perr)
-				}
-				t.Fatal(err)
-			}
-			defer c.Close()
-			trchs = append(trchs, make(chan error, 1))
-			go transceiver(c, []byte("TCP SERVER TEST"), trchs[i])
-		}
-
-		for _, ch := range trchs {
-			for err := range ch {
-				t.Errorf("#%d: %v", i, err)
-			}
-		}
-		for _, ch := range tpchs {
-			for err := range ch {
-				t.Errorf("#%d: %v", i, err)
-			}
-		}
-	}
-}
-
-var unixAndUnixpacketServerTests = []struct {
-	network, address string
-}{
-	{"unix", testUnixAddr()},
-	{"unix", "@nettest/go/unix"},
-
-	{"unixpacket", testUnixAddr()},
-	{"unixpacket", "@nettest/go/unixpacket"},
-}
-
-// TestUnixAndUnixpacketServer tests concurrent accept-read-write
-// servers
-func TestUnixAndUnixpacketServer(t *testing.T) {
-	const N = 3
-
-	for i, tt := range unixAndUnixpacketServerTests {
-		if !testableListenArgs(tt.network, tt.address, "") {
-			t.Logf("skipping %s test", tt.network+" "+tt.address)
-			continue
-		}
-
-		ln, err := Listen(tt.network, tt.address)
-		if err != nil {
-			if perr := parseDialError(err); perr != nil {
-				t.Error(perr)
-			}
-			t.Fatal(err)
-		}
-
-		var lss []*localServer
-		var tpchs []chan error
-		defer func() {
-			for _, ls := range lss {
-				ls.teardown()
-			}
-		}()
-		for i := 0; i < N; i++ {
-			ls, err := (&streamListener{Listener: ln}).newLocalServer()
-			if err != nil {
-				t.Fatal(err)
-			}
-			lss = append(lss, ls)
-			tpchs = append(tpchs, make(chan error, 1))
-		}
-		for i := 0; i < N; i++ {
-			ch := tpchs[i]
-			handler := func(ls *localServer, ln Listener) { transponder(ln, ch) }
-			if err := lss[i].buildup(handler); err != nil {
-				t.Fatal(err)
-			}
-		}
-
-		var trchs []chan error
-		for i := 0; i < N; i++ {
-			d := Dialer{Timeout: someTimeout}
-			c, err := d.Dial(lss[i].Listener.Addr().Network(), lss[i].Listener.Addr().String())
-			if err != nil {
-				if perr := parseDialError(err); perr != nil {
-					t.Error(perr)
-				}
-				t.Fatal(err)
-			}
-			defer os.Remove(c.LocalAddr().String())
-			defer c.Close()
-			trchs = append(trchs, make(chan error, 1))
-			go transceiver(c, []byte("UNIX AND UNIXPACKET SERVER TEST"), trchs[i])
-		}
-
-		for _, ch := range trchs {
-			for err := range ch {
-				t.Errorf("#%d: %v", i, err)
-			}
-		}
-		for _, ch := range tpchs {
-			for err := range ch {
-				t.Errorf("#%d: %v", i, err)
-			}
-		}
-	}
-}
-
-var udpServerTests = []struct {
-	snet, saddr string // server endpoint
-	tnet, taddr string // target endpoint for client
-	dial        bool   // test with Dial
-}{
-	{snet: "udp", saddr: ":0", tnet: "udp", taddr: "127.0.0.1"},
-	{snet: "udp", saddr: "0.0.0.0:0", tnet: "udp", taddr: "127.0.0.1"},
-	{snet: "udp", saddr: "[::ffff:0.0.0.0]:0", tnet: "udp", taddr: "127.0.0.1"},
-	{snet: "udp", saddr: "[::]:0", tnet: "udp", taddr: "::1"},
-
-	{snet: "udp", saddr: ":0", tnet: "udp", taddr: "::1"},
-	{snet: "udp", saddr: "0.0.0.0:0", tnet: "udp", taddr: "::1"},
-	{snet: "udp", saddr: "[::ffff:0.0.0.0]:0", tnet: "udp", taddr: "::1"},
-	{snet: "udp", saddr: "[::]:0", tnet: "udp", taddr: "127.0.0.1"},
-
-	{snet: "udp", saddr: ":0", tnet: "udp4", taddr: "127.0.0.1"},
-	{snet: "udp", saddr: "0.0.0.0:0", tnet: "udp4", taddr: "127.0.0.1"},
-	{snet: "udp", saddr: "[::ffff:0.0.0.0]:0", tnet: "udp4", taddr: "127.0.0.1"},
-	{snet: "udp", saddr: "[::]:0", tnet: "udp6", taddr: "::1"},
-
-	{snet: "udp", saddr: ":0", tnet: "udp6", taddr: "::1"},
-	{snet: "udp", saddr: "0.0.0.0:0", tnet: "udp6", taddr: "::1"},
-	{snet: "udp", saddr: "[::ffff:0.0.0.0]:0", tnet: "udp6", taddr: "::1"},
-	{snet: "udp", saddr: "[::]:0", tnet: "udp4", taddr: "127.0.0.1"},
-
-	{snet: "udp", saddr: "127.0.0.1:0", tnet: "udp", taddr: "127.0.0.1"},
-	{snet: "udp", saddr: "[::ffff:127.0.0.1]:0", tnet: "udp", taddr: "127.0.0.1"},
-	{snet: "udp", saddr: "[::1]:0", tnet: "udp", taddr: "::1"},
-
-	{snet: "udp4", saddr: ":0", tnet: "udp4", taddr: "127.0.0.1"},
-	{snet: "udp4", saddr: "0.0.0.0:0", tnet: "udp4", taddr: "127.0.0.1"},
-	{snet: "udp4", saddr: "[::ffff:0.0.0.0]:0", tnet: "udp4", taddr: "127.0.0.1"},
-
-	{snet: "udp4", saddr: "127.0.0.1:0", tnet: "udp4", taddr: "127.0.0.1"},
-
-	{snet: "udp6", saddr: ":0", tnet: "udp6", taddr: "::1"},
-	{snet: "udp6", saddr: "[::]:0", tnet: "udp6", taddr: "::1"},
-
-	{snet: "udp6", saddr: "[::1]:0", tnet: "udp6", taddr: "::1"},
-
-	{snet: "udp", saddr: "127.0.0.1:0", tnet: "udp", taddr: "127.0.0.1", dial: true},
-
-	{snet: "udp", saddr: "[::1]:0", tnet: "udp", taddr: "::1", dial: true},
-}
-
-func TestUDPServer(t *testing.T) {
-	for i, tt := range udpServerTests {
-		if !testableListenArgs(tt.snet, tt.saddr, tt.taddr) {
-			t.Logf("skipping %s test", tt.snet+" "+tt.saddr+"->"+tt.taddr)
-			continue
-		}
-
-		c1, err := ListenPacket(tt.snet, tt.saddr)
-		if err != nil {
-			if perr := parseDialError(err); perr != nil {
-				t.Error(perr)
-			}
-			t.Fatal(err)
-		}
-
-		ls, err := (&packetListener{PacketConn: c1}).newLocalServer()
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer ls.teardown()
-		tpch := make(chan error, 1)
-		handler := func(ls *localPacketServer, c PacketConn) { packetTransponder(c, tpch) }
-		if err := ls.buildup(handler); err != nil {
-			t.Fatal(err)
-		}
-
-		trch := make(chan error, 1)
-		_, port, err := SplitHostPort(ls.PacketConn.LocalAddr().String())
-		if err != nil {
-			t.Fatal(err)
-		}
-		if tt.dial {
-			d := Dialer{Timeout: someTimeout}
-			c2, err := d.Dial(tt.tnet, JoinHostPort(tt.taddr, port))
-			if err != nil {
-				if perr := parseDialError(err); perr != nil {
-					t.Error(perr)
-				}
-				t.Fatal(err)
-			}
-			defer c2.Close()
-			go transceiver(c2, []byte("UDP SERVER TEST"), trch)
-		} else {
-			c2, err := ListenPacket(tt.tnet, JoinHostPort(tt.taddr, "0"))
-			if err != nil {
-				if perr := parseDialError(err); perr != nil {
-					t.Error(perr)
-				}
-				t.Fatal(err)
-			}
-			defer c2.Close()
-			dst, err := ResolveUDPAddr(tt.tnet, JoinHostPort(tt.taddr, port))
-			if err != nil {
-				t.Fatal(err)
-			}
-			go packetTransceiver(c2, []byte("UDP SERVER TEST"), dst, trch)
-		}
-
-		for err := range trch {
-			t.Errorf("#%d: %v", i, err)
-		}
-		for err := range tpch {
-			t.Errorf("#%d: %v", i, err)
-		}
-	}
-}
-
-var unixgramServerTests = []struct {
-	saddr string // server endpoint
-	caddr string // client endpoint
-	dial  bool   // test with Dial
-}{
-	{saddr: testUnixAddr(), caddr: testUnixAddr()},
-	{saddr: testUnixAddr(), caddr: testUnixAddr(), dial: true},
-
-	{saddr: "@nettest/go/unixgram/server", caddr: "@nettest/go/unixgram/client"},
-}
-
-func TestUnixgramServer(t *testing.T) {
-	for i, tt := range unixgramServerTests {
-		if !testableListenArgs("unixgram", tt.saddr, "") {
-			t.Logf("skipping %s test", "unixgram "+tt.saddr+"->"+tt.caddr)
-			continue
-		}
-
-		c1, err := ListenPacket("unixgram", tt.saddr)
-		if err != nil {
-			if perr := parseDialError(err); perr != nil {
-				t.Error(perr)
-			}
-			t.Fatal(err)
-		}
-
-		ls, err := (&packetListener{PacketConn: c1}).newLocalServer()
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer ls.teardown()
-		tpch := make(chan error, 1)
-		handler := func(ls *localPacketServer, c PacketConn) { packetTransponder(c, tpch) }
-		if err := ls.buildup(handler); err != nil {
-			t.Fatal(err)
-		}
-
-		trch := make(chan error, 1)
-		if tt.dial {
-			d := Dialer{Timeout: someTimeout, LocalAddr: &UnixAddr{Net: "unixgram", Name: tt.caddr}}
-			c2, err := d.Dial("unixgram", ls.PacketConn.LocalAddr().String())
-			if err != nil {
-				if perr := parseDialError(err); perr != nil {
-					t.Error(perr)
-				}
-				t.Fatal(err)
-			}
-			defer os.Remove(c2.LocalAddr().String())
-			defer c2.Close()
-			go transceiver(c2, []byte(c2.LocalAddr().String()), trch)
-		} else {
-			c2, err := ListenPacket("unixgram", tt.caddr)
-			if err != nil {
-				if perr := parseDialError(err); perr != nil {
-					t.Error(perr)
-				}
-				t.Fatal(err)
-			}
-			defer os.Remove(c2.LocalAddr().String())
-			defer c2.Close()
-			go packetTransceiver(c2, []byte("UNIXGRAM SERVER TEST"), ls.PacketConn.LocalAddr(), trch)
-		}
-
-		for err := range trch {
-			t.Errorf("#%d: %v", i, err)
-		}
-		for err := range tpch {
-			t.Errorf("#%d: %v", i, err)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/smtp/auth.go b/third_party/gofrontend/libgo/go/net/smtp/auth.go
deleted file mode 100644
index 3f1339e..0000000
--- a/third_party/gofrontend/libgo/go/net/smtp/auth.go
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package smtp
-
-import (
-	"crypto/hmac"
-	"crypto/md5"
-	"errors"
-	"fmt"
-)
-
-// Auth is implemented by an SMTP authentication mechanism.
-type Auth interface {
-	// Start begins an authentication with a server.
-	// It returns the name of the authentication protocol
-	// and optionally data to include in the initial AUTH message
-	// sent to the server. It can return proto == "" to indicate
-	// that the authentication should be skipped.
-	// If it returns a non-nil error, the SMTP client aborts
-	// the authentication attempt and closes the connection.
-	Start(server *ServerInfo) (proto string, toServer []byte, err error)
-
-	// Next continues the authentication. The server has just sent
-	// the fromServer data. If more is true, the server expects a
-	// response, which Next should return as toServer; otherwise
-	// Next should return toServer == nil.
-	// If Next returns a non-nil error, the SMTP client aborts
-	// the authentication attempt and closes the connection.
-	Next(fromServer []byte, more bool) (toServer []byte, err error)
-}
-
-// ServerInfo records information about an SMTP server.
-type ServerInfo struct {
-	Name string   // SMTP server name
-	TLS  bool     // using TLS, with valid certificate for Name
-	Auth []string // advertised authentication mechanisms
-}
-
-type plainAuth struct {
-	identity, username, password string
-	host                         string
-}
-
-// PlainAuth returns an Auth that implements the PLAIN authentication
-// mechanism as defined in RFC 4616.
-// The returned Auth uses the given username and password to authenticate
-// on TLS connections to host and act as identity. Usually identity will be
-// left blank to act as username.
-func PlainAuth(identity, username, password, host string) Auth {
-	return &plainAuth{identity, username, password, host}
-}
-
-func (a *plainAuth) Start(server *ServerInfo) (string, []byte, error) {
-	if !server.TLS {
-		advertised := false
-		for _, mechanism := range server.Auth {
-			if mechanism == "PLAIN" {
-				advertised = true
-				break
-			}
-		}
-		if !advertised {
-			return "", nil, errors.New("unencrypted connection")
-		}
-	}
-	if server.Name != a.host {
-		return "", nil, errors.New("wrong host name")
-	}
-	resp := []byte(a.identity + "\x00" + a.username + "\x00" + a.password)
-	return "PLAIN", resp, nil
-}
-
-func (a *plainAuth) Next(fromServer []byte, more bool) ([]byte, error) {
-	if more {
-		// We've already sent everything.
-		return nil, errors.New("unexpected server challenge")
-	}
-	return nil, nil
-}
-
-type cramMD5Auth struct {
-	username, secret string
-}
-
-// CRAMMD5Auth returns an Auth that implements the CRAM-MD5 authentication
-// mechanism as defined in RFC 2195.
-// The returned Auth uses the given username and secret to authenticate
-// to the server using the challenge-response mechanism.
-func CRAMMD5Auth(username, secret string) Auth {
-	return &cramMD5Auth{username, secret}
-}
-
-func (a *cramMD5Auth) Start(server *ServerInfo) (string, []byte, error) {
-	return "CRAM-MD5", nil, nil
-}
-
-func (a *cramMD5Auth) Next(fromServer []byte, more bool) ([]byte, error) {
-	if more {
-		d := hmac.New(md5.New, []byte(a.secret))
-		d.Write(fromServer)
-		s := make([]byte, 0, d.Size())
-		return []byte(fmt.Sprintf("%s %x", a.username, d.Sum(s))), nil
-	}
-	return nil, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/smtp/smtp.go b/third_party/gofrontend/libgo/go/net/smtp/smtp.go
deleted file mode 100644
index 0988350..0000000
--- a/third_party/gofrontend/libgo/go/net/smtp/smtp.go
+++ /dev/null
@@ -1,384 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package smtp implements the Simple Mail Transfer Protocol as defined in RFC 5321.
-// It also implements the following extensions:
-//	8BITMIME  RFC 1652
-//	AUTH      RFC 2554
-//	STARTTLS  RFC 3207
-// Additional extensions may be handled by clients.
-package smtp
-
-import (
-	"crypto/tls"
-	"encoding/base64"
-	"errors"
-	"io"
-	"net"
-	"net/textproto"
-	"strings"
-)
-
-// A Client represents a client connection to an SMTP server.
-type Client struct {
-	// Text is the textproto.Conn used by the Client. It is exported to allow for
-	// clients to add extensions.
-	Text *textproto.Conn
-	// keep a reference to the connection so it can be used to create a TLS
-	// connection later
-	conn net.Conn
-	// whether the Client is using TLS
-	tls        bool
-	serverName string
-	// map of supported extensions
-	ext map[string]string
-	// supported auth mechanisms
-	auth       []string
-	localName  string // the name to use in HELO/EHLO
-	didHello   bool   // whether we've said HELO/EHLO
-	helloError error  // the error from the hello
-}
-
-// Dial returns a new Client connected to an SMTP server at addr.
-// The addr must include a port, as in "mail.example.com:smtp".
-func Dial(addr string) (*Client, error) {
-	conn, err := net.Dial("tcp", addr)
-	if err != nil {
-		return nil, err
-	}
-	host, _, _ := net.SplitHostPort(addr)
-	return NewClient(conn, host)
-}
-
-// NewClient returns a new Client using an existing connection and host as a
-// server name to be used when authenticating.
-func NewClient(conn net.Conn, host string) (*Client, error) {
-	text := textproto.NewConn(conn)
-	_, _, err := text.ReadResponse(220)
-	if err != nil {
-		text.Close()
-		return nil, err
-	}
-	c := &Client{Text: text, conn: conn, serverName: host, localName: "localhost"}
-	return c, nil
-}
-
-// Close closes the connection.
-func (c *Client) Close() error {
-	return c.Text.Close()
-}
-
-// hello runs a hello exchange if needed.
-func (c *Client) hello() error {
-	if !c.didHello {
-		c.didHello = true
-		err := c.ehlo()
-		if err != nil {
-			c.helloError = c.helo()
-		}
-	}
-	return c.helloError
-}
-
-// Hello sends a HELO or EHLO to the server as the given host name.
-// Calling this method is only necessary if the client needs control
-// over the host name used.  The client will introduce itself as "localhost"
-// automatically otherwise.  If Hello is called, it must be called before
-// any of the other methods.
-func (c *Client) Hello(localName string) error {
-	if c.didHello {
-		return errors.New("smtp: Hello called after other methods")
-	}
-	c.localName = localName
-	return c.hello()
-}
-
-// cmd is a convenience function that sends a command and returns the response
-func (c *Client) cmd(expectCode int, format string, args ...interface{}) (int, string, error) {
-	id, err := c.Text.Cmd(format, args...)
-	if err != nil {
-		return 0, "", err
-	}
-	c.Text.StartResponse(id)
-	defer c.Text.EndResponse(id)
-	code, msg, err := c.Text.ReadResponse(expectCode)
-	return code, msg, err
-}
-
-// helo sends the HELO greeting to the server. It should be used only when the
-// server does not support ehlo.
-func (c *Client) helo() error {
-	c.ext = nil
-	_, _, err := c.cmd(250, "HELO %s", c.localName)
-	return err
-}
-
-// ehlo sends the EHLO (extended hello) greeting to the server. It
-// should be the preferred greeting for servers that support it.
-func (c *Client) ehlo() error {
-	_, msg, err := c.cmd(250, "EHLO %s", c.localName)
-	if err != nil {
-		return err
-	}
-	ext := make(map[string]string)
-	extList := strings.Split(msg, "\n")
-	if len(extList) > 1 {
-		extList = extList[1:]
-		for _, line := range extList {
-			args := strings.SplitN(line, " ", 2)
-			if len(args) > 1 {
-				ext[args[0]] = args[1]
-			} else {
-				ext[args[0]] = ""
-			}
-		}
-	}
-	if mechs, ok := ext["AUTH"]; ok {
-		c.auth = strings.Split(mechs, " ")
-	}
-	c.ext = ext
-	return err
-}
-
-// StartTLS sends the STARTTLS command and encrypts all further communication.
-// Only servers that advertise the STARTTLS extension support this function.
-func (c *Client) StartTLS(config *tls.Config) error {
-	if err := c.hello(); err != nil {
-		return err
-	}
-	_, _, err := c.cmd(220, "STARTTLS")
-	if err != nil {
-		return err
-	}
-	c.conn = tls.Client(c.conn, config)
-	c.Text = textproto.NewConn(c.conn)
-	c.tls = true
-	return c.ehlo()
-}
-
-// TLSConnectionState returns the client's TLS connection state.
-// The return values are their zero values if StartTLS did
-// not succeed.
-func (c *Client) TLSConnectionState() (state tls.ConnectionState, ok bool) {
-	tc, ok := c.conn.(*tls.Conn)
-	if !ok {
-		return
-	}
-	return tc.ConnectionState(), true
-}
-
-// Verify checks the validity of an email address on the server.
-// If Verify returns nil, the address is valid. A non-nil return
-// does not necessarily indicate an invalid address. Many servers
-// will not verify addresses for security reasons.
-func (c *Client) Verify(addr string) error {
-	if err := c.hello(); err != nil {
-		return err
-	}
-	_, _, err := c.cmd(250, "VRFY %s", addr)
-	return err
-}
-
-// Auth authenticates a client using the provided authentication mechanism.
-// A failed authentication closes the connection.
-// Only servers that advertise the AUTH extension support this function.
-func (c *Client) Auth(a Auth) error {
-	if err := c.hello(); err != nil {
-		return err
-	}
-	encoding := base64.StdEncoding
-	mech, resp, err := a.Start(&ServerInfo{c.serverName, c.tls, c.auth})
-	if err != nil {
-		c.Quit()
-		return err
-	}
-	resp64 := make([]byte, encoding.EncodedLen(len(resp)))
-	encoding.Encode(resp64, resp)
-	code, msg64, err := c.cmd(0, "AUTH %s %s", mech, resp64)
-	for err == nil {
-		var msg []byte
-		switch code {
-		case 334:
-			msg, err = encoding.DecodeString(msg64)
-		case 235:
-			// the last message isn't base64 because it isn't a challenge
-			msg = []byte(msg64)
-		default:
-			err = &textproto.Error{Code: code, Msg: msg64}
-		}
-		if err == nil {
-			resp, err = a.Next(msg, code == 334)
-		}
-		if err != nil {
-			// abort the AUTH
-			c.cmd(501, "*")
-			c.Quit()
-			break
-		}
-		if resp == nil {
-			break
-		}
-		resp64 = make([]byte, encoding.EncodedLen(len(resp)))
-		encoding.Encode(resp64, resp)
-		code, msg64, err = c.cmd(0, string(resp64))
-	}
-	return err
-}
-
-// Mail issues a MAIL command to the server using the provided email address.
-// If the server supports the 8BITMIME extension, Mail adds the BODY=8BITMIME
-// parameter.
-// This initiates a mail transaction and is followed by one or more Rcpt calls.
-func (c *Client) Mail(from string) error {
-	if err := c.hello(); err != nil {
-		return err
-	}
-	cmdStr := "MAIL FROM:<%s>"
-	if c.ext != nil {
-		if _, ok := c.ext["8BITMIME"]; ok {
-			cmdStr += " BODY=8BITMIME"
-		}
-	}
-	_, _, err := c.cmd(250, cmdStr, from)
-	return err
-}
-
-// Rcpt issues a RCPT command to the server using the provided email address.
-// A call to Rcpt must be preceded by a call to Mail and may be followed by
-// a Data call or another Rcpt call.
-func (c *Client) Rcpt(to string) error {
-	_, _, err := c.cmd(25, "RCPT TO:<%s>", to)
-	return err
-}
-
-type dataCloser struct {
-	c *Client
-	io.WriteCloser
-}
-
-func (d *dataCloser) Close() error {
-	d.WriteCloser.Close()
-	_, _, err := d.c.Text.ReadResponse(250)
-	return err
-}
-
-// Data issues a DATA command to the server and returns a writer that
-// can be used to write the mail headers and body. The caller should
-// close the writer before calling any more methods on c.  A call to
-// Data must be preceded by one or more calls to Rcpt.
-func (c *Client) Data() (io.WriteCloser, error) {
-	_, _, err := c.cmd(354, "DATA")
-	if err != nil {
-		return nil, err
-	}
-	return &dataCloser{c, c.Text.DotWriter()}, nil
-}
-
-var testHookStartTLS func(*tls.Config) // nil, except for tests
-
-// SendMail connects to the server at addr, switches to TLS if
-// possible, authenticates with the optional mechanism a if possible,
-// and then sends an email from address from, to addresses to, with
-// message msg.
-// The addr must include a port, as in "mail.example.com:smtp".
-//
-// The addresses in the to parameter are the SMTP RCPT addresses.
-//
-// The msg parameter should be an RFC 822-style email with headers
-// first, a blank line, and then the message body. The lines of msg
-// should be CRLF terminated.  The msg headers should usually include
-// fields such as "From", "To", "Subject", and "Cc".  Sending "Bcc"
-// messages is accomplished by including an email address in the to
-// parameter but not including it in the msg headers.
-//
-// The SendMail function and the the net/smtp package are low-level
-// mechanisms and provide no support for DKIM signing, MIME
-// attachments (see the mime/multipart package), or other mail
-// functionality. Higher-level packages exist outside of the standard
-// library.
-func SendMail(addr string, a Auth, from string, to []string, msg []byte) error {
-	c, err := Dial(addr)
-	if err != nil {
-		return err
-	}
-	defer c.Close()
-	if err = c.hello(); err != nil {
-		return err
-	}
-	if ok, _ := c.Extension("STARTTLS"); ok {
-		config := &tls.Config{ServerName: c.serverName}
-		if testHookStartTLS != nil {
-			testHookStartTLS(config)
-		}
-		if err = c.StartTLS(config); err != nil {
-			return err
-		}
-	}
-	if a != nil && c.ext != nil {
-		if _, ok := c.ext["AUTH"]; ok {
-			if err = c.Auth(a); err != nil {
-				return err
-			}
-		}
-	}
-	if err = c.Mail(from); err != nil {
-		return err
-	}
-	for _, addr := range to {
-		if err = c.Rcpt(addr); err != nil {
-			return err
-		}
-	}
-	w, err := c.Data()
-	if err != nil {
-		return err
-	}
-	_, err = w.Write(msg)
-	if err != nil {
-		return err
-	}
-	err = w.Close()
-	if err != nil {
-		return err
-	}
-	return c.Quit()
-}
-
-// Extension reports whether an extension is support by the server.
-// The extension name is case-insensitive. If the extension is supported,
-// Extension also returns a string that contains any parameters the
-// server specifies for the extension.
-func (c *Client) Extension(ext string) (bool, string) {
-	if err := c.hello(); err != nil {
-		return false, ""
-	}
-	if c.ext == nil {
-		return false, ""
-	}
-	ext = strings.ToUpper(ext)
-	param, ok := c.ext[ext]
-	return ok, param
-}
-
-// Reset sends the RSET command to the server, aborting the current mail
-// transaction.
-func (c *Client) Reset() error {
-	if err := c.hello(); err != nil {
-		return err
-	}
-	_, _, err := c.cmd(250, "RSET")
-	return err
-}
-
-// Quit sends the QUIT command and closes the connection to the server.
-func (c *Client) Quit() error {
-	if err := c.hello(); err != nil {
-		return err
-	}
-	_, _, err := c.cmd(221, "QUIT")
-	if err != nil {
-		return err
-	}
-	return c.Text.Close()
-}
diff --git a/third_party/gofrontend/libgo/go/net/smtp/smtp_test.go b/third_party/gofrontend/libgo/go/net/smtp/smtp_test.go
deleted file mode 100644
index 3ae0d5b..0000000
--- a/third_party/gofrontend/libgo/go/net/smtp/smtp_test.go
+++ /dev/null
@@ -1,738 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package smtp
-
-import (
-	"bufio"
-	"bytes"
-	"crypto/tls"
-	"crypto/x509"
-	"io"
-	"net"
-	"net/textproto"
-	"strings"
-	"testing"
-	"time"
-)
-
-type authTest struct {
-	auth       Auth
-	challenges []string
-	name       string
-	responses  []string
-}
-
-var authTests = []authTest{
-	{PlainAuth("", "user", "pass", "testserver"), []string{}, "PLAIN", []string{"\x00user\x00pass"}},
-	{PlainAuth("foo", "bar", "baz", "testserver"), []string{}, "PLAIN", []string{"foo\x00bar\x00baz"}},
-	{CRAMMD5Auth("user", "pass"), []string{"<123456.1322876914@testserver>"}, "CRAM-MD5", []string{"", "user 287eb355114cf5c471c26a875f1ca4ae"}},
-}
-
-func TestAuth(t *testing.T) {
-testLoop:
-	for i, test := range authTests {
-		name, resp, err := test.auth.Start(&ServerInfo{"testserver", true, nil})
-		if name != test.name {
-			t.Errorf("#%d got name %s, expected %s", i, name, test.name)
-		}
-		if !bytes.Equal(resp, []byte(test.responses[0])) {
-			t.Errorf("#%d got response %s, expected %s", i, resp, test.responses[0])
-		}
-		if err != nil {
-			t.Errorf("#%d error: %s", i, err)
-		}
-		for j := range test.challenges {
-			challenge := []byte(test.challenges[j])
-			expected := []byte(test.responses[j+1])
-			resp, err := test.auth.Next(challenge, true)
-			if err != nil {
-				t.Errorf("#%d error: %s", i, err)
-				continue testLoop
-			}
-			if !bytes.Equal(resp, expected) {
-				t.Errorf("#%d got %s, expected %s", i, resp, expected)
-				continue testLoop
-			}
-		}
-	}
-}
-
-func TestAuthPlain(t *testing.T) {
-	auth := PlainAuth("foo", "bar", "baz", "servername")
-
-	tests := []struct {
-		server *ServerInfo
-		err    string
-	}{
-		{
-			server: &ServerInfo{Name: "servername", TLS: true},
-		},
-		{
-			// Okay; explicitly advertised by server.
-			server: &ServerInfo{Name: "servername", Auth: []string{"PLAIN"}},
-		},
-		{
-			server: &ServerInfo{Name: "servername", Auth: []string{"CRAM-MD5"}},
-			err:    "unencrypted connection",
-		},
-		{
-			server: &ServerInfo{Name: "attacker", TLS: true},
-			err:    "wrong host name",
-		},
-	}
-	for i, tt := range tests {
-		_, _, err := auth.Start(tt.server)
-		got := ""
-		if err != nil {
-			got = err.Error()
-		}
-		if got != tt.err {
-			t.Errorf("%d. got error = %q; want %q", i, got, tt.err)
-		}
-	}
-}
-
-type faker struct {
-	io.ReadWriter
-}
-
-func (f faker) Close() error                     { return nil }
-func (f faker) LocalAddr() net.Addr              { return nil }
-func (f faker) RemoteAddr() net.Addr             { return nil }
-func (f faker) SetDeadline(time.Time) error      { return nil }
-func (f faker) SetReadDeadline(time.Time) error  { return nil }
-func (f faker) SetWriteDeadline(time.Time) error { return nil }
-
-func TestBasic(t *testing.T) {
-	server := strings.Join(strings.Split(basicServer, "\n"), "\r\n")
-	client := strings.Join(strings.Split(basicClient, "\n"), "\r\n")
-
-	var cmdbuf bytes.Buffer
-	bcmdbuf := bufio.NewWriter(&cmdbuf)
-	var fake faker
-	fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
-	c := &Client{Text: textproto.NewConn(fake), localName: "localhost"}
-
-	if err := c.helo(); err != nil {
-		t.Fatalf("HELO failed: %s", err)
-	}
-	if err := c.ehlo(); err == nil {
-		t.Fatalf("Expected first EHLO to fail")
-	}
-	if err := c.ehlo(); err != nil {
-		t.Fatalf("Second EHLO failed: %s", err)
-	}
-
-	c.didHello = true
-	if ok, args := c.Extension("aUtH"); !ok || args != "LOGIN PLAIN" {
-		t.Fatalf("Expected AUTH supported")
-	}
-	if ok, _ := c.Extension("DSN"); ok {
-		t.Fatalf("Shouldn't support DSN")
-	}
-
-	if err := c.Mail("user@gmail.com"); err == nil {
-		t.Fatalf("MAIL should require authentication")
-	}
-
-	if err := c.Verify("user1@gmail.com"); err == nil {
-		t.Fatalf("First VRFY: expected no verification")
-	}
-	if err := c.Verify("user2@gmail.com"); err != nil {
-		t.Fatalf("Second VRFY: expected verification, got %s", err)
-	}
-
-	// fake TLS so authentication won't complain
-	c.tls = true
-	c.serverName = "smtp.google.com"
-	if err := c.Auth(PlainAuth("", "user", "pass", "smtp.google.com")); err != nil {
-		t.Fatalf("AUTH failed: %s", err)
-	}
-
-	if err := c.Mail("user@gmail.com"); err != nil {
-		t.Fatalf("MAIL failed: %s", err)
-	}
-	if err := c.Rcpt("golang-nuts@googlegroups.com"); err != nil {
-		t.Fatalf("RCPT failed: %s", err)
-	}
-	msg := `From: user@gmail.com
-To: golang-nuts@googlegroups.com
-Subject: Hooray for Go
-
-Line 1
-.Leading dot line .
-Goodbye.`
-	w, err := c.Data()
-	if err != nil {
-		t.Fatalf("DATA failed: %s", err)
-	}
-	if _, err := w.Write([]byte(msg)); err != nil {
-		t.Fatalf("Data write failed: %s", err)
-	}
-	if err := w.Close(); err != nil {
-		t.Fatalf("Bad data response: %s", err)
-	}
-
-	if err := c.Quit(); err != nil {
-		t.Fatalf("QUIT failed: %s", err)
-	}
-
-	bcmdbuf.Flush()
-	actualcmds := cmdbuf.String()
-	if client != actualcmds {
-		t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client)
-	}
-}
-
-var basicServer = `250 mx.google.com at your service
-502 Unrecognized command.
-250-mx.google.com at your service
-250-SIZE 35651584
-250-AUTH LOGIN PLAIN
-250 8BITMIME
-530 Authentication required
-252 Send some mail, I'll try my best
-250 User is valid
-235 Accepted
-250 Sender OK
-250 Receiver OK
-354 Go ahead
-250 Data OK
-221 OK
-`
-
-var basicClient = `HELO localhost
-EHLO localhost
-EHLO localhost
-MAIL FROM:<user@gmail.com> BODY=8BITMIME
-VRFY user1@gmail.com
-VRFY user2@gmail.com
-AUTH PLAIN AHVzZXIAcGFzcw==
-MAIL FROM:<user@gmail.com> BODY=8BITMIME
-RCPT TO:<golang-nuts@googlegroups.com>
-DATA
-From: user@gmail.com
-To: golang-nuts@googlegroups.com
-Subject: Hooray for Go
-
-Line 1
-..Leading dot line .
-Goodbye.
-.
-QUIT
-`
-
-func TestNewClient(t *testing.T) {
-	server := strings.Join(strings.Split(newClientServer, "\n"), "\r\n")
-	client := strings.Join(strings.Split(newClientClient, "\n"), "\r\n")
-
-	var cmdbuf bytes.Buffer
-	bcmdbuf := bufio.NewWriter(&cmdbuf)
-	out := func() string {
-		bcmdbuf.Flush()
-		return cmdbuf.String()
-	}
-	var fake faker
-	fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
-	c, err := NewClient(fake, "fake.host")
-	if err != nil {
-		t.Fatalf("NewClient: %v\n(after %v)", err, out())
-	}
-	defer c.Close()
-	if ok, args := c.Extension("aUtH"); !ok || args != "LOGIN PLAIN" {
-		t.Fatalf("Expected AUTH supported")
-	}
-	if ok, _ := c.Extension("DSN"); ok {
-		t.Fatalf("Shouldn't support DSN")
-	}
-	if err := c.Quit(); err != nil {
-		t.Fatalf("QUIT failed: %s", err)
-	}
-
-	actualcmds := out()
-	if client != actualcmds {
-		t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client)
-	}
-}
-
-var newClientServer = `220 hello world
-250-mx.google.com at your service
-250-SIZE 35651584
-250-AUTH LOGIN PLAIN
-250 8BITMIME
-221 OK
-`
-
-var newClientClient = `EHLO localhost
-QUIT
-`
-
-func TestNewClient2(t *testing.T) {
-	server := strings.Join(strings.Split(newClient2Server, "\n"), "\r\n")
-	client := strings.Join(strings.Split(newClient2Client, "\n"), "\r\n")
-
-	var cmdbuf bytes.Buffer
-	bcmdbuf := bufio.NewWriter(&cmdbuf)
-	var fake faker
-	fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
-	c, err := NewClient(fake, "fake.host")
-	if err != nil {
-		t.Fatalf("NewClient: %v", err)
-	}
-	defer c.Close()
-	if ok, _ := c.Extension("DSN"); ok {
-		t.Fatalf("Shouldn't support DSN")
-	}
-	if err := c.Quit(); err != nil {
-		t.Fatalf("QUIT failed: %s", err)
-	}
-
-	bcmdbuf.Flush()
-	actualcmds := cmdbuf.String()
-	if client != actualcmds {
-		t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client)
-	}
-}
-
-var newClient2Server = `220 hello world
-502 EH?
-250-mx.google.com at your service
-250-SIZE 35651584
-250-AUTH LOGIN PLAIN
-250 8BITMIME
-221 OK
-`
-
-var newClient2Client = `EHLO localhost
-HELO localhost
-QUIT
-`
-
-func TestHello(t *testing.T) {
-
-	if len(helloServer) != len(helloClient) {
-		t.Fatalf("Hello server and client size mismatch")
-	}
-
-	for i := 0; i < len(helloServer); i++ {
-		server := strings.Join(strings.Split(baseHelloServer+helloServer[i], "\n"), "\r\n")
-		client := strings.Join(strings.Split(baseHelloClient+helloClient[i], "\n"), "\r\n")
-		var cmdbuf bytes.Buffer
-		bcmdbuf := bufio.NewWriter(&cmdbuf)
-		var fake faker
-		fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
-		c, err := NewClient(fake, "fake.host")
-		if err != nil {
-			t.Fatalf("NewClient: %v", err)
-		}
-		defer c.Close()
-		c.localName = "customhost"
-		err = nil
-
-		switch i {
-		case 0:
-			err = c.Hello("customhost")
-		case 1:
-			err = c.StartTLS(nil)
-			if err.Error() == "502 Not implemented" {
-				err = nil
-			}
-		case 2:
-			err = c.Verify("test@example.com")
-		case 3:
-			c.tls = true
-			c.serverName = "smtp.google.com"
-			err = c.Auth(PlainAuth("", "user", "pass", "smtp.google.com"))
-		case 4:
-			err = c.Mail("test@example.com")
-		case 5:
-			ok, _ := c.Extension("feature")
-			if ok {
-				t.Errorf("Expected FEATURE not to be supported")
-			}
-		case 6:
-			err = c.Reset()
-		case 7:
-			err = c.Quit()
-		case 8:
-			err = c.Verify("test@example.com")
-			if err != nil {
-				err = c.Hello("customhost")
-				if err != nil {
-					t.Errorf("Want error, got none")
-				}
-			}
-		default:
-			t.Fatalf("Unhandled command")
-		}
-
-		if err != nil {
-			t.Errorf("Command %d failed: %v", i, err)
-		}
-
-		bcmdbuf.Flush()
-		actualcmds := cmdbuf.String()
-		if client != actualcmds {
-			t.Errorf("Got:\n%s\nExpected:\n%s", actualcmds, client)
-		}
-	}
-}
-
-var baseHelloServer = `220 hello world
-502 EH?
-250-mx.google.com at your service
-250 FEATURE
-`
-
-var helloServer = []string{
-	"",
-	"502 Not implemented\n",
-	"250 User is valid\n",
-	"235 Accepted\n",
-	"250 Sender ok\n",
-	"",
-	"250 Reset ok\n",
-	"221 Goodbye\n",
-	"250 Sender ok\n",
-}
-
-var baseHelloClient = `EHLO customhost
-HELO customhost
-`
-
-var helloClient = []string{
-	"",
-	"STARTTLS\n",
-	"VRFY test@example.com\n",
-	"AUTH PLAIN AHVzZXIAcGFzcw==\n",
-	"MAIL FROM:<test@example.com>\n",
-	"",
-	"RSET\n",
-	"QUIT\n",
-	"VRFY test@example.com\n",
-}
-
-func TestSendMail(t *testing.T) {
-	server := strings.Join(strings.Split(sendMailServer, "\n"), "\r\n")
-	client := strings.Join(strings.Split(sendMailClient, "\n"), "\r\n")
-	var cmdbuf bytes.Buffer
-	bcmdbuf := bufio.NewWriter(&cmdbuf)
-	l, err := net.Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		t.Fatalf("Unable to to create listener: %v", err)
-	}
-	defer l.Close()
-
-	// prevent data race on bcmdbuf
-	var done = make(chan struct{})
-	go func(data []string) {
-
-		defer close(done)
-
-		conn, err := l.Accept()
-		if err != nil {
-			t.Errorf("Accept error: %v", err)
-			return
-		}
-		defer conn.Close()
-
-		tc := textproto.NewConn(conn)
-		for i := 0; i < len(data) && data[i] != ""; i++ {
-			tc.PrintfLine(data[i])
-			for len(data[i]) >= 4 && data[i][3] == '-' {
-				i++
-				tc.PrintfLine(data[i])
-			}
-			if data[i] == "221 Goodbye" {
-				return
-			}
-			read := false
-			for !read || data[i] == "354 Go ahead" {
-				msg, err := tc.ReadLine()
-				bcmdbuf.Write([]byte(msg + "\r\n"))
-				read = true
-				if err != nil {
-					t.Errorf("Read error: %v", err)
-					return
-				}
-				if data[i] == "354 Go ahead" && msg == "." {
-					break
-				}
-			}
-		}
-	}(strings.Split(server, "\r\n"))
-
-	err = SendMail(l.Addr().String(), nil, "test@example.com", []string{"other@example.com"}, []byte(strings.Replace(`From: test@example.com
-To: other@example.com
-Subject: SendMail test
-
-SendMail is working for me.
-`, "\n", "\r\n", -1)))
-
-	if err != nil {
-		t.Errorf("%v", err)
-	}
-
-	<-done
-	bcmdbuf.Flush()
-	actualcmds := cmdbuf.String()
-	if client != actualcmds {
-		t.Errorf("Got:\n%s\nExpected:\n%s", actualcmds, client)
-	}
-}
-
-var sendMailServer = `220 hello world
-502 EH?
-250 mx.google.com at your service
-250 Sender ok
-250 Receiver ok
-354 Go ahead
-250 Data ok
-221 Goodbye
-`
-
-var sendMailClient = `EHLO localhost
-HELO localhost
-MAIL FROM:<test@example.com>
-RCPT TO:<other@example.com>
-DATA
-From: test@example.com
-To: other@example.com
-Subject: SendMail test
-
-SendMail is working for me.
-.
-QUIT
-`
-
-func TestAuthFailed(t *testing.T) {
-	server := strings.Join(strings.Split(authFailedServer, "\n"), "\r\n")
-	client := strings.Join(strings.Split(authFailedClient, "\n"), "\r\n")
-	var cmdbuf bytes.Buffer
-	bcmdbuf := bufio.NewWriter(&cmdbuf)
-	var fake faker
-	fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
-	c, err := NewClient(fake, "fake.host")
-	if err != nil {
-		t.Fatalf("NewClient: %v", err)
-	}
-	defer c.Close()
-
-	c.tls = true
-	c.serverName = "smtp.google.com"
-	err = c.Auth(PlainAuth("", "user", "pass", "smtp.google.com"))
-
-	if err == nil {
-		t.Error("Auth: expected error; got none")
-	} else if err.Error() != "535 Invalid credentials\nplease see www.example.com" {
-		t.Errorf("Auth: got error: %v, want: %s", err, "535 Invalid credentials\nplease see www.example.com")
-	}
-
-	bcmdbuf.Flush()
-	actualcmds := cmdbuf.String()
-	if client != actualcmds {
-		t.Errorf("Got:\n%s\nExpected:\n%s", actualcmds, client)
-	}
-}
-
-var authFailedServer = `220 hello world
-250-mx.google.com at your service
-250 AUTH LOGIN PLAIN
-535-Invalid credentials
-535 please see www.example.com
-221 Goodbye
-`
-
-var authFailedClient = `EHLO localhost
-AUTH PLAIN AHVzZXIAcGFzcw==
-*
-QUIT
-`
-
-func TestTLSClient(t *testing.T) {
-	ln := newLocalListener(t)
-	defer ln.Close()
-	errc := make(chan error)
-	go func() {
-		errc <- sendMail(ln.Addr().String())
-	}()
-	conn, err := ln.Accept()
-	if err != nil {
-		t.Fatalf("failed to accept connection: %v", err)
-	}
-	defer conn.Close()
-	if err := serverHandle(conn, t); err != nil {
-		t.Fatalf("failed to handle connection: %v", err)
-	}
-	if err := <-errc; err != nil {
-		t.Fatalf("client error: %v", err)
-	}
-}
-
-func TestTLSConnState(t *testing.T) {
-	ln := newLocalListener(t)
-	defer ln.Close()
-	clientDone := make(chan bool)
-	serverDone := make(chan bool)
-	go func() {
-		defer close(serverDone)
-		c, err := ln.Accept()
-		if err != nil {
-			t.Errorf("Server accept: %v", err)
-			return
-		}
-		defer c.Close()
-		if err := serverHandle(c, t); err != nil {
-			t.Errorf("server error: %v", err)
-		}
-	}()
-	go func() {
-		defer close(clientDone)
-		c, err := Dial(ln.Addr().String())
-		if err != nil {
-			t.Errorf("Client dial: %v", err)
-			return
-		}
-		defer c.Quit()
-		cfg := &tls.Config{ServerName: "example.com"}
-		testHookStartTLS(cfg) // set the RootCAs
-		if err := c.StartTLS(cfg); err != nil {
-			t.Errorf("StartTLS: %v", err)
-			return
-		}
-		cs, ok := c.TLSConnectionState()
-		if !ok {
-			t.Errorf("TLSConnectionState returned ok == false; want true")
-			return
-		}
-		if cs.Version == 0 || !cs.HandshakeComplete {
-			t.Errorf("ConnectionState = %#v; expect non-zero Version and HandshakeComplete", cs)
-		}
-	}()
-	<-clientDone
-	<-serverDone
-}
-
-func newLocalListener(t *testing.T) net.Listener {
-	ln, err := net.Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		ln, err = net.Listen("tcp6", "[::1]:0")
-	}
-	if err != nil {
-		t.Fatal(err)
-	}
-	return ln
-}
-
-type smtpSender struct {
-	w io.Writer
-}
-
-func (s smtpSender) send(f string) {
-	s.w.Write([]byte(f + "\r\n"))
-}
-
-// smtp server, finely tailored to deal with our own client only!
-func serverHandle(c net.Conn, t *testing.T) error {
-	send := smtpSender{c}.send
-	send("220 127.0.0.1 ESMTP service ready")
-	s := bufio.NewScanner(c)
-	for s.Scan() {
-		switch s.Text() {
-		case "EHLO localhost":
-			send("250-127.0.0.1 ESMTP offers a warm hug of welcome")
-			send("250-STARTTLS")
-			send("250 Ok")
-		case "STARTTLS":
-			send("220 Go ahead")
-			keypair, err := tls.X509KeyPair(localhostCert, localhostKey)
-			if err != nil {
-				return err
-			}
-			config := &tls.Config{Certificates: []tls.Certificate{keypair}}
-			c = tls.Server(c, config)
-			defer c.Close()
-			return serverHandleTLS(c, t)
-		default:
-			t.Fatalf("unrecognized command: %q", s.Text())
-		}
-	}
-	return s.Err()
-}
-
-func serverHandleTLS(c net.Conn, t *testing.T) error {
-	send := smtpSender{c}.send
-	s := bufio.NewScanner(c)
-	for s.Scan() {
-		switch s.Text() {
-		case "EHLO localhost":
-			send("250 Ok")
-		case "MAIL FROM:<joe1@example.com>":
-			send("250 Ok")
-		case "RCPT TO:<joe2@example.com>":
-			send("250 Ok")
-		case "DATA":
-			send("354 send the mail data, end with .")
-			send("250 Ok")
-		case "Subject: test":
-		case "":
-		case "howdy!":
-		case ".":
-		case "QUIT":
-			send("221 127.0.0.1 Service closing transmission channel")
-			return nil
-		default:
-			t.Fatalf("unrecognized command during TLS: %q", s.Text())
-		}
-	}
-	return s.Err()
-}
-
-func init() {
-	testRootCAs := x509.NewCertPool()
-	testRootCAs.AppendCertsFromPEM(localhostCert)
-	testHookStartTLS = func(config *tls.Config) {
-		config.RootCAs = testRootCAs
-	}
-}
-
-func sendMail(hostPort string) error {
-	host, _, err := net.SplitHostPort(hostPort)
-	if err != nil {
-		return err
-	}
-	auth := PlainAuth("", "", "", host)
-	from := "joe1@example.com"
-	to := []string{"joe2@example.com"}
-	return SendMail(hostPort, auth, from, to, []byte("Subject: test\n\nhowdy!"))
-}
-
-// (copied from net/http/httptest)
-// localhostCert is a PEM-encoded TLS cert with SAN IPs
-// "127.0.0.1" and "[::1]", expiring at the last second of 2049 (the end
-// of ASN.1 time).
-// generated from src/crypto/tls:
-// go run generate_cert.go  --rsa-bits 512 --host 127.0.0.1,::1,example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h
-var localhostCert = []byte(`-----BEGIN CERTIFICATE-----
-MIIBdzCCASOgAwIBAgIBADALBgkqhkiG9w0BAQUwEjEQMA4GA1UEChMHQWNtZSBD
-bzAeFw03MDAxMDEwMDAwMDBaFw00OTEyMzEyMzU5NTlaMBIxEDAOBgNVBAoTB0Fj
-bWUgQ28wWjALBgkqhkiG9w0BAQEDSwAwSAJBAN55NcYKZeInyTuhcCwFMhDHCmwa
-IUSdtXdcbItRB/yfXGBhiex00IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEA
-AaNoMGYwDgYDVR0PAQH/BAQDAgCkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1Ud
-EwEB/wQFMAMBAf8wLgYDVR0RBCcwJYILZXhhbXBsZS5jb22HBH8AAAGHEAAAAAAA
-AAAAAAAAAAAAAAEwCwYJKoZIhvcNAQEFA0EAAoQn/ytgqpiLcZu9XKbCJsJcvkgk
-Se6AbGXgSlq+ZCEVo0qIwSgeBqmsJxUu7NCSOwVJLYNEBO2DtIxoYVk+MA==
------END CERTIFICATE-----`)
-
-// localhostKey is the private key for localhostCert.
-var localhostKey = []byte(`-----BEGIN RSA PRIVATE KEY-----
-MIIBPAIBAAJBAN55NcYKZeInyTuhcCwFMhDHCmwaIUSdtXdcbItRB/yfXGBhiex0
-0IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEAAQJBAQdUx66rfh8sYsgfdcvV
-NoafYpnEcB5s4m/vSVe6SU7dCK6eYec9f9wpT353ljhDUHq3EbmE4foNzJngh35d
-AekCIQDhRQG5Li0Wj8TM4obOnnXUXf1jRv0UkzE9AHWLG5q3AwIhAPzSjpYUDjVW
-MCUXgckTpKCuGwbJk7424Nb8bLzf3kllAiA5mUBgjfr/WtFSJdWcPQ4Zt9KTMNKD
-EUO0ukpTwEIl6wIhAMbGqZK3zAAFdq8DD2jPx+UJXnh0rnOkZBzDtJ6/iN69AiEA
-1Aq8MJgTaYsDQWyU/hDq5YkDJc9e9DSCvUIzqxQWMQE=
------END RSA PRIVATE KEY-----`)
diff --git a/third_party/gofrontend/libgo/go/net/sock_bsd.go b/third_party/gofrontend/libgo/go/net/sock_bsd.go
deleted file mode 100644
index 6c37109..0000000
--- a/third_party/gofrontend/libgo/go/net/sock_bsd.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package net
-
-import (
-	"runtime"
-	"syscall"
-)
-
-func maxListenerBacklog() int {
-	var (
-		n   uint32
-		err error
-	)
-	switch runtime.GOOS {
-	case "darwin", "freebsd":
-		n, err = syscall.SysctlUint32("kern.ipc.somaxconn")
-	case "netbsd":
-		// NOTE: NetBSD has no somaxconn-like kernel state so far
-	case "openbsd":
-		n, err = syscall.SysctlUint32("kern.somaxconn")
-	}
-	if n == 0 || err != nil {
-		return syscall.SOMAXCONN
-	}
-	// FreeBSD stores the backlog in a uint16, as does Linux.
-	// Assume the other BSDs do too. Truncate number to avoid wrapping.
-	// See issue 5030.
-	if n > 1<<16-1 {
-		n = 1<<16 - 1
-	}
-	return int(n)
-}
diff --git a/third_party/gofrontend/libgo/go/net/sock_cloexec.go b/third_party/gofrontend/libgo/go/net/sock_cloexec.go
deleted file mode 100644
index 616a101..0000000
--- a/third_party/gofrontend/libgo/go/net/sock_cloexec.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements sysSocket and accept for platforms that
-// provide a fast path for setting SetNonblock and CloseOnExec.
-
-// +build freebsd linux
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-// Wrapper around the socket system call that marks the returned file
-// descriptor as nonblocking and close-on-exec.
-func sysSocket(family, sotype, proto int) (int, error) {
-	s, err := socketFunc(family, sotype|syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC, proto)
-	// On Linux the SOCK_NONBLOCK and SOCK_CLOEXEC flags were
-	// introduced in 2.6.27 kernel and on FreeBSD both flags were
-	// introduced in 10 kernel. If we get an EINVAL error on Linux
-	// or EPROTONOSUPPORT error on FreeBSD, fall back to using
-	// socket without them.
-	switch err {
-	case nil:
-		return s, nil
-	default:
-		return -1, os.NewSyscallError("socket", err)
-	case syscall.EPROTONOSUPPORT, syscall.EINVAL:
-	}
-
-	// See ../syscall/exec_unix.go for description of ForkLock.
-	syscall.ForkLock.RLock()
-	s, err = socketFunc(family, sotype, proto)
-	if err == nil {
-		syscall.CloseOnExec(s)
-	}
-	syscall.ForkLock.RUnlock()
-	if err != nil {
-		return -1, os.NewSyscallError("socket", err)
-	}
-	if err = syscall.SetNonblock(s, true); err != nil {
-		closeFunc(s)
-		return -1, os.NewSyscallError("setnonblock", err)
-	}
-	return s, nil
-}
-
-// Wrapper around the accept system call that marks the returned file
-// descriptor as nonblocking and close-on-exec.
-func accept(s int) (int, syscall.Sockaddr, error) {
-	ns, sa, err := accept4Func(s, syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC)
-	// On Linux the accept4 system call was introduced in 2.6.28
-	// kernel and on FreeBSD it was introduced in 10 kernel. If we
-	// get an ENOSYS error on both Linux and FreeBSD, or EINVAL
-	// error on Linux, fall back to using accept.
-	switch err {
-	case nil:
-		return ns, sa, nil
-	default: // errors other than the ones listed
-		return -1, sa, os.NewSyscallError("accept4", err)
-	case syscall.ENOSYS: // syscall missing
-	case syscall.EINVAL: // some Linux use this instead of ENOSYS
-	case syscall.EACCES: // some Linux use this instead of ENOSYS
-	case syscall.EFAULT: // some Linux use this instead of ENOSYS
-	}
-
-	// See ../syscall/exec_unix.go for description of ForkLock.
-	// It is probably okay to hold the lock across syscall.Accept
-	// because we have put fd.sysfd into non-blocking mode.
-	// However, a call to the File method will put it back into
-	// blocking mode. We can't take that risk, so no use of ForkLock here.
-	ns, sa, err = acceptFunc(s)
-	if err == nil {
-		syscall.CloseOnExec(ns)
-	}
-	if err != nil {
-		return -1, nil, os.NewSyscallError("accept", err)
-	}
-	if err = syscall.SetNonblock(ns, true); err != nil {
-		closeFunc(ns)
-		return -1, nil, os.NewSyscallError("setnonblock", err)
-	}
-	return ns, sa, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/sock_linux.go b/third_party/gofrontend/libgo/go/net/sock_linux.go
deleted file mode 100644
index cc5ce15..0000000
--- a/third_party/gofrontend/libgo/go/net/sock_linux.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import "syscall"
-
-func maxListenerBacklog() int {
-	fd, err := open("/proc/sys/net/core/somaxconn")
-	if err != nil {
-		return syscall.SOMAXCONN
-	}
-	defer fd.close()
-	l, ok := fd.readLine()
-	if !ok {
-		return syscall.SOMAXCONN
-	}
-	f := getFields(l)
-	n, _, ok := dtoi(f[0], 0)
-	if n == 0 || !ok {
-		return syscall.SOMAXCONN
-	}
-	// Linux stores the backlog in a uint16.
-	// Truncate number to avoid wrapping.
-	// See issue 5030.
-	if n > 1<<16-1 {
-		n = 1<<16 - 1
-	}
-	return n
-}
diff --git a/third_party/gofrontend/libgo/go/net/sock_plan9.go b/third_party/gofrontend/libgo/go/net/sock_plan9.go
deleted file mode 100644
index 88d9ed1..0000000
--- a/third_party/gofrontend/libgo/go/net/sock_plan9.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-func maxListenerBacklog() int {
-	// /sys/include/ape/sys/socket.h:/SOMAXCONN
-	return 5
-}
diff --git a/third_party/gofrontend/libgo/go/net/sock_posix.go b/third_party/gofrontend/libgo/go/net/sock_posix.go
deleted file mode 100644
index 4d2cfde..0000000
--- a/third_party/gofrontend/libgo/go/net/sock_posix.go
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
-
-package net
-
-import (
-	"os"
-	"syscall"
-	"time"
-)
-
-// A sockaddr represents a TCP, UDP, IP or Unix network endpoint
-// address that can be converted into a syscall.Sockaddr.
-type sockaddr interface {
-	Addr
-
-	// family returns the platform-dependent address family
-	// identifier.
-	family() int
-
-	// isWildcard reports whether the address is a wildcard
-	// address.
-	isWildcard() bool
-
-	// sockaddr returns the address converted into a syscall
-	// sockaddr type that implements syscall.Sockaddr
-	// interface. It returns a nil interface when the address is
-	// nil.
-	sockaddr(family int) (syscall.Sockaddr, error)
-}
-
-// socket returns a network file descriptor that is ready for
-// asynchronous I/O using the network poller.
-func socket(net string, family, sotype, proto int, ipv6only bool, laddr, raddr sockaddr, deadline time.Time) (fd *netFD, err error) {
-	s, err := sysSocket(family, sotype, proto)
-	if err != nil {
-		return nil, err
-	}
-	if err = setDefaultSockopts(s, family, sotype, ipv6only); err != nil {
-		closeFunc(s)
-		return nil, err
-	}
-	if fd, err = newFD(s, family, sotype, net); err != nil {
-		closeFunc(s)
-		return nil, err
-	}
-
-	// This function makes a network file descriptor for the
-	// following applications:
-	//
-	// - An endpoint holder that opens a passive stream
-	//   connection, known as a stream listener
-	//
-	// - An endpoint holder that opens a destination-unspecific
-	//   datagram connection, known as a datagram listener
-	//
-	// - An endpoint holder that opens an active stream or a
-	//   destination-specific datagram connection, known as a
-	//   dialer
-	//
-	// - An endpoint holder that opens the other connection, such
-	//   as talking to the protocol stack inside the kernel
-	//
-	// For stream and datagram listeners, they will only require
-	// named sockets, so we can assume that it's just a request
-	// from stream or datagram listeners when laddr is not nil but
-	// raddr is nil. Otherwise we assume it's just for dialers or
-	// the other connection holders.
-
-	if laddr != nil && raddr == nil {
-		switch sotype {
-		case syscall.SOCK_STREAM, syscall.SOCK_SEQPACKET:
-			if err := fd.listenStream(laddr, listenerBacklog); err != nil {
-				fd.Close()
-				return nil, err
-			}
-			return fd, nil
-		case syscall.SOCK_DGRAM:
-			if err := fd.listenDatagram(laddr); err != nil {
-				fd.Close()
-				return nil, err
-			}
-			return fd, nil
-		}
-	}
-	if err := fd.dial(laddr, raddr, deadline); err != nil {
-		fd.Close()
-		return nil, err
-	}
-	return fd, nil
-}
-
-func (fd *netFD) addrFunc() func(syscall.Sockaddr) Addr {
-	switch fd.family {
-	case syscall.AF_INET, syscall.AF_INET6:
-		switch fd.sotype {
-		case syscall.SOCK_STREAM:
-			return sockaddrToTCP
-		case syscall.SOCK_DGRAM:
-			return sockaddrToUDP
-		case syscall.SOCK_RAW:
-			return sockaddrToIP
-		}
-	case syscall.AF_UNIX:
-		switch fd.sotype {
-		case syscall.SOCK_STREAM:
-			return sockaddrToUnix
-		case syscall.SOCK_DGRAM:
-			return sockaddrToUnixgram
-		case syscall.SOCK_SEQPACKET:
-			return sockaddrToUnixpacket
-		}
-	}
-	return func(syscall.Sockaddr) Addr { return nil }
-}
-
-func (fd *netFD) dial(laddr, raddr sockaddr, deadline time.Time) error {
-	var err error
-	var lsa syscall.Sockaddr
-	if laddr != nil {
-		if lsa, err = laddr.sockaddr(fd.family); err != nil {
-			return err
-		} else if lsa != nil {
-			if err := syscall.Bind(fd.sysfd, lsa); err != nil {
-				return os.NewSyscallError("bind", err)
-			}
-		}
-	}
-	var rsa syscall.Sockaddr
-	if raddr != nil {
-		if rsa, err = raddr.sockaddr(fd.family); err != nil {
-			return err
-		}
-		if err := fd.connect(lsa, rsa, deadline); err != nil {
-			return err
-		}
-		fd.isConnected = true
-	} else {
-		if err := fd.init(); err != nil {
-			return err
-		}
-	}
-	lsa, _ = syscall.Getsockname(fd.sysfd)
-	if rsa, _ = syscall.Getpeername(fd.sysfd); rsa != nil {
-		fd.setAddr(fd.addrFunc()(lsa), fd.addrFunc()(rsa))
-	} else {
-		fd.setAddr(fd.addrFunc()(lsa), raddr)
-	}
-	return nil
-}
-
-func (fd *netFD) listenStream(laddr sockaddr, backlog int) error {
-	if err := setDefaultListenerSockopts(fd.sysfd); err != nil {
-		return err
-	}
-	if lsa, err := laddr.sockaddr(fd.family); err != nil {
-		return err
-	} else if lsa != nil {
-		if err := syscall.Bind(fd.sysfd, lsa); err != nil {
-			return os.NewSyscallError("bind", err)
-		}
-	}
-	if err := listenFunc(fd.sysfd, backlog); err != nil {
-		return os.NewSyscallError("listen", err)
-	}
-	if err := fd.init(); err != nil {
-		return err
-	}
-	lsa, _ := syscall.Getsockname(fd.sysfd)
-	fd.setAddr(fd.addrFunc()(lsa), nil)
-	return nil
-}
-
-func (fd *netFD) listenDatagram(laddr sockaddr) error {
-	switch addr := laddr.(type) {
-	case *UDPAddr:
-		// We provide a socket that listens to a wildcard
-		// address with reusable UDP port when the given laddr
-		// is an appropriate UDP multicast address prefix.
-		// This makes it possible for a single UDP listener to
-		// join multiple different group addresses, for
-		// multiple UDP listeners that listen on the same UDP
-		// port to join the same group address.
-		if addr.IP != nil && addr.IP.IsMulticast() {
-			if err := setDefaultMulticastSockopts(fd.sysfd); err != nil {
-				return err
-			}
-			addr := *addr
-			switch fd.family {
-			case syscall.AF_INET:
-				addr.IP = IPv4zero
-			case syscall.AF_INET6:
-				addr.IP = IPv6unspecified
-			}
-			laddr = &addr
-		}
-	}
-	if lsa, err := laddr.sockaddr(fd.family); err != nil {
-		return err
-	} else if lsa != nil {
-		if err := syscall.Bind(fd.sysfd, lsa); err != nil {
-			return os.NewSyscallError("bind", err)
-		}
-	}
-	if err := fd.init(); err != nil {
-		return err
-	}
-	lsa, _ := syscall.Getsockname(fd.sysfd)
-	fd.setAddr(fd.addrFunc()(lsa), nil)
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/sock_stub.go b/third_party/gofrontend/libgo/go/net/sock_stub.go
deleted file mode 100644
index ed6b089..0000000
--- a/third_party/gofrontend/libgo/go/net/sock_stub.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build nacl solaris
-
-package net
-
-import "syscall"
-
-func maxListenerBacklog() int {
-	// TODO: Implement this
-	// NOTE: Never return a number bigger than 1<<16 - 1. See issue 5030.
-	return syscall.SOMAXCONN
-}
diff --git a/third_party/gofrontend/libgo/go/net/sock_windows.go b/third_party/gofrontend/libgo/go/net/sock_windows.go
deleted file mode 100644
index 888e70b..0000000
--- a/third_party/gofrontend/libgo/go/net/sock_windows.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-func maxListenerBacklog() int {
-	// TODO: Implement this
-	// NOTE: Never return a number bigger than 1<<16 - 1. See issue 5030.
-	return syscall.SOMAXCONN
-}
-
-func sysSocket(family, sotype, proto int) (syscall.Handle, error) {
-	// See ../syscall/exec_unix.go for description of ForkLock.
-	syscall.ForkLock.RLock()
-	s, err := socketFunc(family, sotype, proto)
-	if err == nil {
-		syscall.CloseOnExec(s)
-	}
-	syscall.ForkLock.RUnlock()
-	if err != nil {
-		return syscall.InvalidHandle, os.NewSyscallError("socket", err)
-	}
-	return s, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/sockopt_bsd.go b/third_party/gofrontend/libgo/go/net/sockopt_bsd.go
deleted file mode 100644
index 52b2a5d..0000000
--- a/third_party/gofrontend/libgo/go/net/sockopt_bsd.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package net
-
-import (
-	"os"
-	"runtime"
-	"syscall"
-)
-
-func setDefaultSockopts(s, family, sotype int, ipv6only bool) error {
-	if runtime.GOOS == "dragonfly" && sotype != syscall.SOCK_RAW {
-		// On DragonFly BSD, we adjust the ephemeral port
-		// range because unlike other BSD systems its default
-		// port range doesn't conform to IANA recommendation
-		// as described in RFC 6056 and is pretty narrow.
-		switch family {
-		case syscall.AF_INET:
-			syscall.SetsockoptInt(s, syscall.IPPROTO_IP, syscall.IP_PORTRANGE, syscall.IP_PORTRANGE_HIGH)
-		case syscall.AF_INET6:
-			syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_PORTRANGE, syscall.IPV6_PORTRANGE_HIGH)
-		}
-	}
-	if supportsIPv4map && family == syscall.AF_INET6 && sotype != syscall.SOCK_RAW {
-		// Allow both IP versions even if the OS default
-		// is otherwise.  Note that some operating systems
-		// never admit this option.
-		syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only))
-	}
-	// Allow broadcast.
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
-}
-
-func setDefaultListenerSockopts(s int) error {
-	// Allow reuse of recently-used addresses.
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1))
-}
-
-func setDefaultMulticastSockopts(s int) error {
-	// Allow multicast UDP and raw IP datagram sockets to listen
-	// concurrently across multiple listeners.
-	if err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1); err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	// Allow reuse of recently-used ports.
-	// This option is supported only in descendants of 4.4BSD,
-	// to make an effective multicast application that requires
-	// quick draw possible.
-	if syscall.SO_REUSEPORT != 0 {
-		return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEPORT, 1))
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/sockopt_linux.go b/third_party/gofrontend/libgo/go/net/sockopt_linux.go
deleted file mode 100644
index 54c20b1..0000000
--- a/third_party/gofrontend/libgo/go/net/sockopt_linux.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-func setDefaultSockopts(s, family, sotype int, ipv6only bool) error {
-	if family == syscall.AF_INET6 && sotype != syscall.SOCK_RAW {
-		// Allow both IP versions even if the OS default
-		// is otherwise.  Note that some operating systems
-		// never admit this option.
-		syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only))
-	}
-	// Allow broadcast.
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
-}
-
-func setDefaultListenerSockopts(s int) error {
-	// Allow reuse of recently-used addresses.
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1))
-}
-
-func setDefaultMulticastSockopts(s int) error {
-	// Allow multicast UDP and raw IP datagram sockets to listen
-	// concurrently across multiple listeners.
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1))
-}
diff --git a/third_party/gofrontend/libgo/go/net/sockopt_plan9.go b/third_party/gofrontend/libgo/go/net/sockopt_plan9.go
deleted file mode 100644
index 8bc689b..0000000
--- a/third_party/gofrontend/libgo/go/net/sockopt_plan9.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-func setKeepAlive(fd *netFD, keepalive bool) error {
-	if keepalive {
-		_, e := fd.ctl.WriteAt([]byte("keepalive"), 0)
-		return e
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/sockopt_posix.go b/third_party/gofrontend/libgo/go/net/sockopt_posix.go
deleted file mode 100644
index 1654d1b..0000000
--- a/third_party/gofrontend/libgo/go/net/sockopt_posix.go
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-// Boolean to int.
-func boolint(b bool) int {
-	if b {
-		return 1
-	}
-	return 0
-}
-
-func ipv4AddrToInterface(ip IP) (*Interface, error) {
-	ift, err := Interfaces()
-	if err != nil {
-		return nil, err
-	}
-	for _, ifi := range ift {
-		ifat, err := ifi.Addrs()
-		if err != nil {
-			return nil, err
-		}
-		for _, ifa := range ifat {
-			switch v := ifa.(type) {
-			case *IPAddr:
-				if ip.Equal(v.IP) {
-					return &ifi, nil
-				}
-			case *IPNet:
-				if ip.Equal(v.IP) {
-					return &ifi, nil
-				}
-			}
-		}
-	}
-	if ip.Equal(IPv4zero) {
-		return nil, nil
-	}
-	return nil, errNoSuchInterface
-}
-
-func interfaceToIPv4Addr(ifi *Interface) (IP, error) {
-	if ifi == nil {
-		return IPv4zero, nil
-	}
-	ifat, err := ifi.Addrs()
-	if err != nil {
-		return nil, err
-	}
-	for _, ifa := range ifat {
-		switch v := ifa.(type) {
-		case *IPAddr:
-			if v.IP.To4() != nil {
-				return v.IP, nil
-			}
-		case *IPNet:
-			if v.IP.To4() != nil {
-				return v.IP, nil
-			}
-		}
-	}
-	return nil, errNoSuchInterface
-}
-
-func setIPv4MreqToInterface(mreq *syscall.IPMreq, ifi *Interface) error {
-	if ifi == nil {
-		return nil
-	}
-	ifat, err := ifi.Addrs()
-	if err != nil {
-		return err
-	}
-	for _, ifa := range ifat {
-		switch v := ifa.(type) {
-		case *IPAddr:
-			if a := v.IP.To4(); a != nil {
-				copy(mreq.Interface[:], a)
-				goto done
-			}
-		case *IPNet:
-			if a := v.IP.To4(); a != nil {
-				copy(mreq.Interface[:], a)
-				goto done
-			}
-		}
-	}
-done:
-	if bytesEqual(mreq.Multiaddr[:], IPv4zero.To4()) {
-		return errNoSuchMulticastInterface
-	}
-	return nil
-}
-
-func setReadBuffer(fd *netFD, bytes int) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes))
-}
-
-func setWriteBuffer(fd *netFD, bytes int) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes))
-}
-
-func setKeepAlive(fd *netFD, keepalive bool) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, boolint(keepalive)))
-}
-
-func setLinger(fd *netFD, sec int) error {
-	var l syscall.Linger
-	if sec >= 0 {
-		l.Onoff = 1
-		l.Linger = int32(sec)
-	} else {
-		l.Onoff = 0
-		l.Linger = 0
-	}
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptLinger(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_LINGER, &l))
-}
diff --git a/third_party/gofrontend/libgo/go/net/sockopt_solaris.go b/third_party/gofrontend/libgo/go/net/sockopt_solaris.go
deleted file mode 100644
index 54c20b1..0000000
--- a/third_party/gofrontend/libgo/go/net/sockopt_solaris.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-func setDefaultSockopts(s, family, sotype int, ipv6only bool) error {
-	if family == syscall.AF_INET6 && sotype != syscall.SOCK_RAW {
-		// Allow both IP versions even if the OS default
-		// is otherwise.  Note that some operating systems
-		// never admit this option.
-		syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only))
-	}
-	// Allow broadcast.
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
-}
-
-func setDefaultListenerSockopts(s int) error {
-	// Allow reuse of recently-used addresses.
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1))
-}
-
-func setDefaultMulticastSockopts(s int) error {
-	// Allow multicast UDP and raw IP datagram sockets to listen
-	// concurrently across multiple listeners.
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1))
-}
diff --git a/third_party/gofrontend/libgo/go/net/sockopt_stub.go b/third_party/gofrontend/libgo/go/net/sockopt_stub.go
deleted file mode 100644
index de5ee0b..0000000
--- a/third_party/gofrontend/libgo/go/net/sockopt_stub.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build nacl
-
-package net
-
-import "syscall"
-
-func setDefaultSockopts(s, family, sotype int, ipv6only bool) error {
-	return nil
-}
-
-func setDefaultListenerSockopts(s int) error {
-	return nil
-}
-
-func setDefaultMulticastSockopts(s int) error {
-	return nil
-}
-
-func setReadBuffer(fd *netFD, bytes int) error {
-	return syscall.ENOPROTOOPT
-}
-
-func setWriteBuffer(fd *netFD, bytes int) error {
-	return syscall.ENOPROTOOPT
-}
-
-func setKeepAlive(fd *netFD, keepalive bool) error {
-	return syscall.ENOPROTOOPT
-}
-
-func setLinger(fd *netFD, sec int) error {
-	return syscall.ENOPROTOOPT
-}
diff --git a/third_party/gofrontend/libgo/go/net/sockopt_windows.go b/third_party/gofrontend/libgo/go/net/sockopt_windows.go
deleted file mode 100644
index cb64a40..0000000
--- a/third_party/gofrontend/libgo/go/net/sockopt_windows.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-func setDefaultSockopts(s syscall.Handle, family, sotype int, ipv6only bool) error {
-	if family == syscall.AF_INET6 && sotype != syscall.SOCK_RAW {
-		// Allow both IP versions even if the OS default
-		// is otherwise.  Note that some operating systems
-		// never admit this option.
-		syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only))
-	}
-	// Allow broadcast.
-	syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1)
-	return nil
-}
-
-func setDefaultListenerSockopts(s syscall.Handle) error {
-	// Windows will reuse recently-used addresses by default.
-	// SO_REUSEADDR should not be used here, as it allows
-	// a socket to forcibly bind to a port in use by another socket.
-	// This could lead to a non-deterministic behavior, where
-	// connection requests over the port cannot be guaranteed
-	// to be handled by the correct socket.
-	return nil
-}
-
-func setDefaultMulticastSockopts(s syscall.Handle) error {
-	// Allow multicast UDP and raw IP datagram sockets to listen
-	// concurrently across multiple listeners.
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1))
-}
diff --git a/third_party/gofrontend/libgo/go/net/sockoptip_bsd.go b/third_party/gofrontend/libgo/go/net/sockoptip_bsd.go
deleted file mode 100644
index 2199e48..0000000
--- a/third_party/gofrontend/libgo/go/net/sockoptip_bsd.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error {
-	ip, err := interfaceToIPv4Addr(ifi)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	var a [4]byte
-	copy(a[:], ip.To4())
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInet4Addr(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, a))
-}
-
-func setIPv4MulticastLoopback(fd *netFD, v bool) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptByte(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, byte(boolint(v))))
-}
diff --git a/third_party/gofrontend/libgo/go/net/sockoptip_linux.go b/third_party/gofrontend/libgo/go/net/sockoptip_linux.go
deleted file mode 100644
index a69b778..0000000
--- a/third_party/gofrontend/libgo/go/net/sockoptip_linux.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error {
-	var v int32
-	if ifi != nil {
-		v = int32(ifi.Index)
-	}
-	mreq := &syscall.IPMreqn{Ifindex: v}
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreqn(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, mreq))
-}
-
-func setIPv4MulticastLoopback(fd *netFD, v bool) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, boolint(v)))
-}
diff --git a/third_party/gofrontend/libgo/go/net/sockoptip_posix.go b/third_party/gofrontend/libgo/go/net/sockoptip_posix.go
deleted file mode 100644
index c2579be..0000000
--- a/third_party/gofrontend/libgo/go/net/sockoptip_posix.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd windows
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-func joinIPv4Group(fd *netFD, ifi *Interface, ip IP) error {
-	mreq := &syscall.IPMreq{Multiaddr: [4]byte{ip[0], ip[1], ip[2], ip[3]}}
-	if err := setIPv4MreqToInterface(mreq, ifi); err != nil {
-		return err
-	}
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptIPMreq(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreq))
-}
-
-func setIPv6MulticastInterface(fd *netFD, ifi *Interface) error {
-	var v int
-	if ifi != nil {
-		v = ifi.Index
-	}
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_MULTICAST_IF, v))
-}
-
-func setIPv6MulticastLoopback(fd *netFD, v bool) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_MULTICAST_LOOP, boolint(v)))
-}
-
-func joinIPv6Group(fd *netFD, ifi *Interface, ip IP) error {
-	mreq := &syscall.IPv6Mreq{}
-	copy(mreq.Multiaddr[:], ip)
-	if ifi != nil {
-		mreq.Interface = uint32(ifi.Index)
-	}
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptIPv6Mreq(fd.sysfd, syscall.IPPROTO_IPV6, syscall.IPV6_JOIN_GROUP, mreq))
-}
diff --git a/third_party/gofrontend/libgo/go/net/sockoptip_stub.go b/third_party/gofrontend/libgo/go/net/sockoptip_stub.go
deleted file mode 100644
index 32ec5dd..0000000
--- a/third_party/gofrontend/libgo/go/net/sockoptip_stub.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build nacl solaris
-
-package net
-
-import "syscall"
-
-func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error {
-	// See golang.org/issue/7399.
-	return syscall.ENOPROTOOPT
-}
-
-func setIPv4MulticastLoopback(fd *netFD, v bool) error {
-	// See golang.org/issue/7399.
-	return syscall.ENOPROTOOPT
-}
-
-func joinIPv4Group(fd *netFD, ifi *Interface, ip IP) error {
-	// See golang.org/issue/7399.
-	return syscall.ENOPROTOOPT
-}
-
-func setIPv6MulticastInterface(fd *netFD, ifi *Interface) error {
-	// See golang.org/issue/7399.
-	return syscall.ENOPROTOOPT
-}
-
-func setIPv6MulticastLoopback(fd *netFD, v bool) error {
-	// See golang.org/issue/7399.
-	return syscall.ENOPROTOOPT
-}
-
-func joinIPv6Group(fd *netFD, ifi *Interface, ip IP) error {
-	// See golang.org/issue/7399.
-	return syscall.ENOPROTOOPT
-}
diff --git a/third_party/gofrontend/libgo/go/net/sockoptip_windows.go b/third_party/gofrontend/libgo/go/net/sockoptip_windows.go
deleted file mode 100644
index 7b11f20..0000000
--- a/third_party/gofrontend/libgo/go/net/sockoptip_windows.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-	"unsafe"
-)
-
-func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error {
-	ip, err := interfaceToIPv4Addr(ifi)
-	if err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	var a [4]byte
-	copy(a[:], ip.To4())
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, (*byte)(unsafe.Pointer(&a[0])), 4))
-}
-
-func setIPv4MulticastLoopback(fd *netFD, v bool) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, boolint(v)))
-}
diff --git a/third_party/gofrontend/libgo/go/net/sys_cloexec.go b/third_party/gofrontend/libgo/go/net/sys_cloexec.go
deleted file mode 100644
index ba266e6..0000000
--- a/third_party/gofrontend/libgo/go/net/sys_cloexec.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements sysSocket and accept for platforms that do not
-// provide a fast path for setting SetNonblock and CloseOnExec.
-
-// +build darwin dragonfly nacl netbsd openbsd solaris
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-// Wrapper around the socket system call that marks the returned file
-// descriptor as nonblocking and close-on-exec.
-func sysSocket(family, sotype, proto int) (int, error) {
-	// See ../syscall/exec_unix.go for description of ForkLock.
-	syscall.ForkLock.RLock()
-	s, err := socketFunc(family, sotype, proto)
-	if err == nil {
-		syscall.CloseOnExec(s)
-	}
-	syscall.ForkLock.RUnlock()
-	if err != nil {
-		return -1, os.NewSyscallError("socket", err)
-	}
-	if err = syscall.SetNonblock(s, true); err != nil {
-		closeFunc(s)
-		return -1, os.NewSyscallError("setnonblock", err)
-	}
-	return s, nil
-}
-
-// Wrapper around the accept system call that marks the returned file
-// descriptor as nonblocking and close-on-exec.
-func accept(s int) (int, syscall.Sockaddr, error) {
-	// See ../syscall/exec_unix.go for description of ForkLock.
-	// It is probably okay to hold the lock across syscall.Accept
-	// because we have put fd.sysfd into non-blocking mode.
-	// However, a call to the File method will put it back into
-	// blocking mode. We can't take that risk, so no use of ForkLock here.
-	ns, sa, err := acceptFunc(s)
-	if err == nil {
-		syscall.CloseOnExec(ns)
-	}
-	if err != nil {
-		return -1, nil, os.NewSyscallError("accept", err)
-	}
-	if err = syscall.SetNonblock(ns, true); err != nil {
-		closeFunc(ns)
-		return -1, nil, os.NewSyscallError("setnonblock", err)
-	}
-	return ns, sa, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/tcp_test.go b/third_party/gofrontend/libgo/go/net/tcp_test.go
deleted file mode 100644
index 25ae9b9..0000000
--- a/third_party/gofrontend/libgo/go/net/tcp_test.go
+++ /dev/null
@@ -1,587 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"io"
-	"reflect"
-	"runtime"
-	"sync"
-	"testing"
-	"time"
-)
-
-func BenchmarkTCP4OneShot(b *testing.B) {
-	benchmarkTCP(b, false, false, "127.0.0.1:0")
-}
-
-func BenchmarkTCP4OneShotTimeout(b *testing.B) {
-	benchmarkTCP(b, false, true, "127.0.0.1:0")
-}
-
-func BenchmarkTCP4Persistent(b *testing.B) {
-	benchmarkTCP(b, true, false, "127.0.0.1:0")
-}
-
-func BenchmarkTCP4PersistentTimeout(b *testing.B) {
-	benchmarkTCP(b, true, true, "127.0.0.1:0")
-}
-
-func BenchmarkTCP6OneShot(b *testing.B) {
-	if !supportsIPv6 {
-		b.Skip("ipv6 is not supported")
-	}
-	benchmarkTCP(b, false, false, "[::1]:0")
-}
-
-func BenchmarkTCP6OneShotTimeout(b *testing.B) {
-	if !supportsIPv6 {
-		b.Skip("ipv6 is not supported")
-	}
-	benchmarkTCP(b, false, true, "[::1]:0")
-}
-
-func BenchmarkTCP6Persistent(b *testing.B) {
-	if !supportsIPv6 {
-		b.Skip("ipv6 is not supported")
-	}
-	benchmarkTCP(b, true, false, "[::1]:0")
-}
-
-func BenchmarkTCP6PersistentTimeout(b *testing.B) {
-	if !supportsIPv6 {
-		b.Skip("ipv6 is not supported")
-	}
-	benchmarkTCP(b, true, true, "[::1]:0")
-}
-
-func benchmarkTCP(b *testing.B, persistent, timeout bool, laddr string) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	const msgLen = 512
-	conns := b.N
-	numConcurrent := runtime.GOMAXPROCS(-1) * 2
-	msgs := 1
-	if persistent {
-		conns = numConcurrent
-		msgs = b.N / conns
-		if msgs == 0 {
-			msgs = 1
-		}
-		if conns > b.N {
-			conns = b.N
-		}
-	}
-	sendMsg := func(c Conn, buf []byte) bool {
-		n, err := c.Write(buf)
-		if n != len(buf) || err != nil {
-			b.Log(err)
-			return false
-		}
-		return true
-	}
-	recvMsg := func(c Conn, buf []byte) bool {
-		for read := 0; read != len(buf); {
-			n, err := c.Read(buf)
-			read += n
-			if err != nil {
-				b.Log(err)
-				return false
-			}
-		}
-		return true
-	}
-	ln, err := Listen("tcp", laddr)
-	if err != nil {
-		b.Fatal(err)
-	}
-	defer ln.Close()
-	serverSem := make(chan bool, numConcurrent)
-	// Acceptor.
-	go func() {
-		for {
-			c, err := ln.Accept()
-			if err != nil {
-				break
-			}
-			serverSem <- true
-			// Server connection.
-			go func(c Conn) {
-				defer func() {
-					c.Close()
-					<-serverSem
-				}()
-				if timeout {
-					c.SetDeadline(time.Now().Add(time.Hour)) // Not intended to fire.
-				}
-				var buf [msgLen]byte
-				for m := 0; m < msgs; m++ {
-					if !recvMsg(c, buf[:]) || !sendMsg(c, buf[:]) {
-						break
-					}
-				}
-			}(c)
-		}
-	}()
-	clientSem := make(chan bool, numConcurrent)
-	for i := 0; i < conns; i++ {
-		clientSem <- true
-		// Client connection.
-		go func() {
-			defer func() {
-				<-clientSem
-			}()
-			c, err := Dial("tcp", ln.Addr().String())
-			if err != nil {
-				b.Log(err)
-				return
-			}
-			defer c.Close()
-			if timeout {
-				c.SetDeadline(time.Now().Add(time.Hour)) // Not intended to fire.
-			}
-			var buf [msgLen]byte
-			for m := 0; m < msgs; m++ {
-				if !sendMsg(c, buf[:]) || !recvMsg(c, buf[:]) {
-					break
-				}
-			}
-		}()
-	}
-	for i := 0; i < numConcurrent; i++ {
-		clientSem <- true
-		serverSem <- true
-	}
-}
-
-func BenchmarkTCP4ConcurrentReadWrite(b *testing.B) {
-	benchmarkTCPConcurrentReadWrite(b, "127.0.0.1:0")
-}
-
-func BenchmarkTCP6ConcurrentReadWrite(b *testing.B) {
-	if !supportsIPv6 {
-		b.Skip("ipv6 is not supported")
-	}
-	benchmarkTCPConcurrentReadWrite(b, "[::1]:0")
-}
-
-func benchmarkTCPConcurrentReadWrite(b *testing.B, laddr string) {
-	testHookUninstaller.Do(uninstallTestHooks)
-
-	// The benchmark creates GOMAXPROCS client/server pairs.
-	// Each pair creates 4 goroutines: client reader/writer and server reader/writer.
-	// The benchmark stresses concurrent reading and writing to the same connection.
-	// Such pattern is used in net/http and net/rpc.
-
-	b.StopTimer()
-
-	P := runtime.GOMAXPROCS(0)
-	N := b.N / P
-	W := 1000
-
-	// Setup P client/server connections.
-	clients := make([]Conn, P)
-	servers := make([]Conn, P)
-	ln, err := Listen("tcp", laddr)
-	if err != nil {
-		b.Fatal(err)
-	}
-	defer ln.Close()
-	done := make(chan bool)
-	go func() {
-		for p := 0; p < P; p++ {
-			s, err := ln.Accept()
-			if err != nil {
-				b.Error(err)
-				return
-			}
-			servers[p] = s
-		}
-		done <- true
-	}()
-	for p := 0; p < P; p++ {
-		c, err := Dial("tcp", ln.Addr().String())
-		if err != nil {
-			b.Fatal(err)
-		}
-		clients[p] = c
-	}
-	<-done
-
-	b.StartTimer()
-
-	var wg sync.WaitGroup
-	wg.Add(4 * P)
-	for p := 0; p < P; p++ {
-		// Client writer.
-		go func(c Conn) {
-			defer wg.Done()
-			var buf [1]byte
-			for i := 0; i < N; i++ {
-				v := byte(i)
-				for w := 0; w < W; w++ {
-					v *= v
-				}
-				buf[0] = v
-				_, err := c.Write(buf[:])
-				if err != nil {
-					b.Error(err)
-					return
-				}
-			}
-		}(clients[p])
-
-		// Pipe between server reader and server writer.
-		pipe := make(chan byte, 128)
-
-		// Server reader.
-		go func(s Conn) {
-			defer wg.Done()
-			var buf [1]byte
-			for i := 0; i < N; i++ {
-				_, err := s.Read(buf[:])
-				if err != nil {
-					b.Error(err)
-					return
-				}
-				pipe <- buf[0]
-			}
-		}(servers[p])
-
-		// Server writer.
-		go func(s Conn) {
-			defer wg.Done()
-			var buf [1]byte
-			for i := 0; i < N; i++ {
-				v := <-pipe
-				for w := 0; w < W; w++ {
-					v *= v
-				}
-				buf[0] = v
-				_, err := s.Write(buf[:])
-				if err != nil {
-					b.Error(err)
-					return
-				}
-			}
-			s.Close()
-		}(servers[p])
-
-		// Client reader.
-		go func(c Conn) {
-			defer wg.Done()
-			var buf [1]byte
-			for i := 0; i < N; i++ {
-				_, err := c.Read(buf[:])
-				if err != nil {
-					b.Error(err)
-					return
-				}
-			}
-			c.Close()
-		}(clients[p])
-	}
-	wg.Wait()
-}
-
-type resolveTCPAddrTest struct {
-	network       string
-	litAddrOrName string
-	addr          *TCPAddr
-	err           error
-}
-
-var resolveTCPAddrTests = []resolveTCPAddrTest{
-	{"tcp", "127.0.0.1:0", &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 0}, nil},
-	{"tcp4", "127.0.0.1:65535", &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 65535}, nil},
-
-	{"tcp", "[::1]:0", &TCPAddr{IP: ParseIP("::1"), Port: 0}, nil},
-	{"tcp6", "[::1]:65535", &TCPAddr{IP: ParseIP("::1"), Port: 65535}, nil},
-
-	{"tcp", "[::1%en0]:1", &TCPAddr{IP: ParseIP("::1"), Port: 1, Zone: "en0"}, nil},
-	{"tcp6", "[::1%911]:2", &TCPAddr{IP: ParseIP("::1"), Port: 2, Zone: "911"}, nil},
-
-	{"", "127.0.0.1:0", &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 0}, nil}, // Go 1.0 behavior
-	{"", "[::1]:0", &TCPAddr{IP: ParseIP("::1"), Port: 0}, nil},         // Go 1.0 behavior
-
-	{"tcp", ":12345", &TCPAddr{Port: 12345}, nil},
-
-	{"http", "127.0.0.1:0", nil, UnknownNetworkError("http")},
-}
-
-func TestResolveTCPAddr(t *testing.T) {
-	origTestHookLookupIP := testHookLookupIP
-	defer func() { testHookLookupIP = origTestHookLookupIP }()
-	testHookLookupIP = lookupLocalhost
-
-	for i, tt := range resolveTCPAddrTests {
-		addr, err := ResolveTCPAddr(tt.network, tt.litAddrOrName)
-		if err != tt.err {
-			t.Errorf("#%d: %v", i, err)
-		} else if !reflect.DeepEqual(addr, tt.addr) {
-			t.Errorf("#%d: got %#v; want %#v", i, addr, tt.addr)
-		}
-		if err != nil {
-			continue
-		}
-		rtaddr, err := ResolveTCPAddr(addr.Network(), addr.String())
-		if err != nil {
-			t.Errorf("#%d: %v", i, err)
-		} else if !reflect.DeepEqual(rtaddr, addr) {
-			t.Errorf("#%d: got %#v; want %#v", i, rtaddr, addr)
-		}
-	}
-}
-
-var tcpListenerNameTests = []struct {
-	net   string
-	laddr *TCPAddr
-}{
-	{"tcp4", &TCPAddr{IP: IPv4(127, 0, 0, 1)}},
-	{"tcp4", &TCPAddr{}},
-	{"tcp4", nil},
-}
-
-func TestTCPListenerName(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-
-	for _, tt := range tcpListenerNameTests {
-		ln, err := ListenTCP(tt.net, tt.laddr)
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer ln.Close()
-		la := ln.Addr()
-		if a, ok := la.(*TCPAddr); !ok || a.Port == 0 {
-			t.Fatalf("got %v; expected a proper address with non-zero port number", la)
-		}
-	}
-}
-
-func TestIPv6LinkLocalUnicastTCP(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv6 {
-		t.Skip("IPv6 is not supported")
-	}
-
-	for i, tt := range ipv6LinkLocalUnicastTCPTests {
-		ln, err := Listen(tt.network, tt.address)
-		if err != nil {
-			// It might return "LookupHost returned no
-			// suitable address" error on some platforms.
-			t.Log(err)
-			continue
-		}
-		ls, err := (&streamListener{Listener: ln}).newLocalServer()
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer ls.teardown()
-		ch := make(chan error, 1)
-		handler := func(ls *localServer, ln Listener) { transponder(ln, ch) }
-		if err := ls.buildup(handler); err != nil {
-			t.Fatal(err)
-		}
-		if la, ok := ln.Addr().(*TCPAddr); !ok || !tt.nameLookup && la.Zone == "" {
-			t.Fatalf("got %v; expected a proper address with zone identifier", la)
-		}
-
-		c, err := Dial(tt.network, ls.Listener.Addr().String())
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer c.Close()
-		if la, ok := c.LocalAddr().(*TCPAddr); !ok || !tt.nameLookup && la.Zone == "" {
-			t.Fatalf("got %v; expected a proper address with zone identifier", la)
-		}
-		if ra, ok := c.RemoteAddr().(*TCPAddr); !ok || !tt.nameLookup && ra.Zone == "" {
-			t.Fatalf("got %v; expected a proper address with zone identifier", ra)
-		}
-
-		if _, err := c.Write([]byte("TCP OVER IPV6 LINKLOCAL TEST")); err != nil {
-			t.Fatal(err)
-		}
-		b := make([]byte, 32)
-		if _, err := c.Read(b); err != nil {
-			t.Fatal(err)
-		}
-
-		for err := range ch {
-			t.Errorf("#%d: %v", i, err)
-		}
-	}
-}
-
-func TestTCPConcurrentAccept(t *testing.T) {
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
-	ln, err := Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	const N = 10
-	var wg sync.WaitGroup
-	wg.Add(N)
-	for i := 0; i < N; i++ {
-		go func() {
-			for {
-				c, err := ln.Accept()
-				if err != nil {
-					break
-				}
-				c.Close()
-			}
-			wg.Done()
-		}()
-	}
-	attempts := 10 * N
-	fails := 0
-	d := &Dialer{Timeout: 200 * time.Millisecond}
-	for i := 0; i < attempts; i++ {
-		c, err := d.Dial("tcp", ln.Addr().String())
-		if err != nil {
-			fails++
-		} else {
-			c.Close()
-		}
-	}
-	ln.Close()
-	wg.Wait()
-	if fails > attempts/9 { // see issues 7400 and 7541
-		t.Fatalf("too many Dial failed: %v", fails)
-	}
-	if fails > 0 {
-		t.Logf("# of failed Dials: %v", fails)
-	}
-}
-
-func TestTCPReadWriteAllocs(t *testing.T) {
-	t.Skip("skipping test on gccgo until escape analysis is turned on")
-	switch runtime.GOOS {
-	case "nacl", "windows":
-		// NaCl needs to allocate pseudo file descriptor
-		// stuff. See syscall/fd_nacl.go.
-		// Windows uses closures and channels for IO
-		// completion port-based netpoll. See fd_windows.go.
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	ln, err := Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-	var server Conn
-	errc := make(chan error)
-	go func() {
-		var err error
-		server, err = ln.Accept()
-		errc <- err
-	}()
-	client, err := Dial("tcp", ln.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer client.Close()
-	if err := <-errc; err != nil {
-		t.Fatal(err)
-	}
-	defer server.Close()
-	var buf [128]byte
-	allocs := testing.AllocsPerRun(1000, func() {
-		_, err := server.Write(buf[:])
-		if err != nil {
-			t.Fatal(err)
-		}
-		_, err = io.ReadFull(client, buf[:])
-		if err != nil {
-			t.Fatal(err)
-		}
-	})
-	if allocs > 0 {
-		t.Fatalf("got %v; want 0", allocs)
-	}
-}
-
-func TestTCPStress(t *testing.T) {
-	const conns = 2
-	const msgLen = 512
-	msgs := int(1e4)
-	if testing.Short() {
-		msgs = 1e2
-	}
-
-	sendMsg := func(c Conn, buf []byte) bool {
-		n, err := c.Write(buf)
-		if n != len(buf) || err != nil {
-			t.Log(err)
-			return false
-		}
-		return true
-	}
-	recvMsg := func(c Conn, buf []byte) bool {
-		for read := 0; read != len(buf); {
-			n, err := c.Read(buf)
-			read += n
-			if err != nil {
-				t.Log(err)
-				return false
-			}
-		}
-		return true
-	}
-
-	ln, err := Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-	// Acceptor.
-	go func() {
-		for {
-			c, err := ln.Accept()
-			if err != nil {
-				break
-			}
-			// Server connection.
-			go func(c Conn) {
-				defer c.Close()
-				var buf [msgLen]byte
-				for m := 0; m < msgs; m++ {
-					if !recvMsg(c, buf[:]) || !sendMsg(c, buf[:]) {
-						break
-					}
-				}
-			}(c)
-		}
-	}()
-	done := make(chan bool)
-	for i := 0; i < conns; i++ {
-		// Client connection.
-		go func() {
-			defer func() {
-				done <- true
-			}()
-			c, err := Dial("tcp", ln.Addr().String())
-			if err != nil {
-				t.Log(err)
-				return
-			}
-			defer c.Close()
-			var buf [msgLen]byte
-			for m := 0; m < msgs; m++ {
-				if !sendMsg(c, buf[:]) || !recvMsg(c, buf[:]) {
-					break
-				}
-			}
-		}()
-	}
-	for i := 0; i < conns; i++ {
-		<-done
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/tcpsock.go b/third_party/gofrontend/libgo/go/net/tcpsock.go
deleted file mode 100644
index 8765aff..0000000
--- a/third_party/gofrontend/libgo/go/net/tcpsock.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-// TCPAddr represents the address of a TCP end point.
-type TCPAddr struct {
-	IP   IP
-	Port int
-	Zone string // IPv6 scoped addressing zone
-}
-
-// Network returns the address's network name, "tcp".
-func (a *TCPAddr) Network() string { return "tcp" }
-
-func (a *TCPAddr) String() string {
-	if a == nil {
-		return "<nil>"
-	}
-	ip := ipEmptyString(a.IP)
-	if a.Zone != "" {
-		return JoinHostPort(ip+"%"+a.Zone, itoa(a.Port))
-	}
-	return JoinHostPort(ip, itoa(a.Port))
-}
-
-func (a *TCPAddr) isWildcard() bool {
-	if a == nil || a.IP == nil {
-		return true
-	}
-	return a.IP.IsUnspecified()
-}
-
-func (a *TCPAddr) opAddr() Addr {
-	if a == nil {
-		return nil
-	}
-	return a
-}
-
-// ResolveTCPAddr parses addr as a TCP address of the form "host:port"
-// or "[ipv6-host%zone]:port" and resolves a pair of domain name and
-// port name on the network net, which must be "tcp", "tcp4" or
-// "tcp6".  A literal address or host name for IPv6 must be enclosed
-// in square brackets, as in "[::1]:80", "[ipv6-host]:http" or
-// "[ipv6-host%zone]:80".
-func ResolveTCPAddr(net, addr string) (*TCPAddr, error) {
-	switch net {
-	case "tcp", "tcp4", "tcp6":
-	case "": // a hint wildcard for Go 1.0 undocumented behavior
-		net = "tcp"
-	default:
-		return nil, UnknownNetworkError(net)
-	}
-	addrs, err := internetAddrList(net, addr, noDeadline)
-	if err != nil {
-		return nil, err
-	}
-	return addrs.first(isIPv4).(*TCPAddr), nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/tcpsock_plan9.go b/third_party/gofrontend/libgo/go/net/tcpsock_plan9.go
deleted file mode 100644
index 9f23703..0000000
--- a/third_party/gofrontend/libgo/go/net/tcpsock_plan9.go
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"io"
-	"os"
-	"syscall"
-	"time"
-)
-
-// TCPConn is an implementation of the Conn interface for TCP network
-// connections.
-type TCPConn struct {
-	conn
-}
-
-func newTCPConn(fd *netFD) *TCPConn {
-	return &TCPConn{conn{fd}}
-}
-
-// ReadFrom implements the io.ReaderFrom ReadFrom method.
-func (c *TCPConn) ReadFrom(r io.Reader) (int64, error) {
-	n, err := genericReadFrom(c, r)
-	if err != nil && err != io.EOF {
-		err = &OpError{Op: "read", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return n, err
-}
-
-// CloseRead shuts down the reading side of the TCP connection.
-// Most callers should just use Close.
-func (c *TCPConn) CloseRead() error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	err := c.fd.closeRead()
-	if err != nil {
-		err = &OpError{Op: "close", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return err
-}
-
-// CloseWrite shuts down the writing side of the TCP connection.
-// Most callers should just use Close.
-func (c *TCPConn) CloseWrite() error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	err := c.fd.closeWrite()
-	if err != nil {
-		err = &OpError{Op: "close", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return err
-}
-
-// SetLinger sets the behavior of Close on a connection which still
-// has data waiting to be sent or to be acknowledged.
-//
-// If sec < 0 (the default), the operating system finishes sending the
-// data in the background.
-//
-// If sec == 0, the operating system discards any unsent or
-// unacknowledged data.
-//
-// If sec > 0, the data is sent in the background as with sec < 0. On
-// some operating systems after sec seconds have elapsed any remaining
-// unsent data may be discarded.
-func (c *TCPConn) SetLinger(sec int) error {
-	return &OpError{Op: "set", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
-}
-
-// SetKeepAlive sets whether the operating system should send
-// keepalive messages on the connection.
-func (c *TCPConn) SetKeepAlive(keepalive bool) error {
-	if !c.ok() {
-		return syscall.EPLAN9
-	}
-	if err := setKeepAlive(c.fd, keepalive); err != nil {
-		return &OpError{Op: "set", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return nil
-}
-
-// SetKeepAlivePeriod sets period between keep alives.
-func (c *TCPConn) SetKeepAlivePeriod(d time.Duration) error {
-	if !c.ok() {
-		return syscall.EPLAN9
-	}
-	if err := setKeepAlivePeriod(c.fd, d); err != nil {
-		return &OpError{Op: "set", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return nil
-}
-
-// SetNoDelay controls whether the operating system should delay
-// packet transmission in hopes of sending fewer packets (Nagle's
-// algorithm).  The default is true (no delay), meaning that data is
-// sent as soon as possible after a Write.
-func (c *TCPConn) SetNoDelay(noDelay bool) error {
-	return &OpError{Op: "set", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
-}
-
-// DialTCP connects to the remote address raddr on the network net,
-// which must be "tcp", "tcp4", or "tcp6".  If laddr is not nil, it is
-// used as the local address for the connection.
-func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error) {
-	return dialTCP(net, laddr, raddr, noDeadline)
-}
-
-func dialTCP(net string, laddr, raddr *TCPAddr, deadline time.Time) (*TCPConn, error) {
-	if !deadline.IsZero() {
-		panic("net.dialTCP: deadline not implemented on Plan 9")
-	}
-	switch net {
-	case "tcp", "tcp4", "tcp6":
-	default:
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: UnknownNetworkError(net)}
-	}
-	if raddr == nil {
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: nil, Err: errMissingAddress}
-	}
-	fd, err := dialPlan9(net, laddr, raddr)
-	if err != nil {
-		return nil, err
-	}
-	return newTCPConn(fd), nil
-}
-
-// TCPListener is a TCP network listener.  Clients should typically
-// use variables of type Listener instead of assuming TCP.
-type TCPListener struct {
-	fd *netFD
-}
-
-// AcceptTCP accepts the next incoming call and returns the new
-// connection.
-func (l *TCPListener) AcceptTCP() (*TCPConn, error) {
-	if l == nil || l.fd == nil || l.fd.ctl == nil {
-		return nil, syscall.EINVAL
-	}
-	fd, err := l.fd.acceptPlan9()
-	if err != nil {
-		return nil, err
-	}
-	return newTCPConn(fd), nil
-}
-
-// Accept implements the Accept method in the Listener interface; it
-// waits for the next call and returns a generic Conn.
-func (l *TCPListener) Accept() (Conn, error) {
-	if l == nil || l.fd == nil || l.fd.ctl == nil {
-		return nil, syscall.EINVAL
-	}
-	c, err := l.AcceptTCP()
-	if err != nil {
-		return nil, err
-	}
-	return c, nil
-}
-
-// Close stops listening on the TCP address.
-// Already Accepted connections are not closed.
-func (l *TCPListener) Close() error {
-	if l == nil || l.fd == nil || l.fd.ctl == nil {
-		return syscall.EINVAL
-	}
-	if _, err := l.fd.ctl.WriteString("hangup"); err != nil {
-		l.fd.ctl.Close()
-		return &OpError{Op: "close", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: err}
-	}
-	err := l.fd.ctl.Close()
-	if err != nil {
-		err = &OpError{Op: "close", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: err}
-	}
-	return err
-}
-
-// Addr returns the listener's network address, a *TCPAddr.
-// The Addr returned is shared by all invocations of Addr, so
-// do not modify it.
-func (l *TCPListener) Addr() Addr { return l.fd.laddr }
-
-// SetDeadline sets the deadline associated with the listener.
-// A zero time value disables the deadline.
-func (l *TCPListener) SetDeadline(t time.Time) error {
-	if l == nil || l.fd == nil || l.fd.ctl == nil {
-		return syscall.EINVAL
-	}
-	if err := l.fd.setDeadline(t); err != nil {
-		return &OpError{Op: "set", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: err}
-	}
-	return nil
-}
-
-// File returns a copy of the underlying os.File, set to blocking
-// mode.  It is the caller's responsibility to close f when finished.
-// Closing l does not affect f, and closing f does not affect l.
-//
-// The returned os.File's file descriptor is different from the
-// connection's.  Attempting to change properties of the original
-// using this duplicate may or may not have the desired effect.
-func (l *TCPListener) File() (f *os.File, err error) {
-	f, err = l.dup()
-	if err != nil {
-		err = &OpError{Op: "file", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: err}
-	}
-	return
-}
-
-// ListenTCP announces on the TCP address laddr and returns a TCP
-// listener.  Net must be "tcp", "tcp4", or "tcp6".  If laddr has a
-// port of 0, ListenTCP will choose an available port.  The caller can
-// use the Addr method of TCPListener to retrieve the chosen address.
-func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error) {
-	switch net {
-	case "tcp", "tcp4", "tcp6":
-	default:
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(net)}
-	}
-	if laddr == nil {
-		laddr = &TCPAddr{}
-	}
-	fd, err := listenPlan9(net, laddr)
-	if err != nil {
-		return nil, err
-	}
-	return &TCPListener{fd}, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/tcpsock_posix.go b/third_party/gofrontend/libgo/go/net/tcpsock_posix.go
deleted file mode 100644
index 7e49b76..0000000
--- a/third_party/gofrontend/libgo/go/net/tcpsock_posix.go
+++ /dev/null
@@ -1,334 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
-
-package net
-
-import (
-	"io"
-	"os"
-	"syscall"
-	"time"
-)
-
-func sockaddrToTCP(sa syscall.Sockaddr) Addr {
-	switch sa := sa.(type) {
-	case *syscall.SockaddrInet4:
-		return &TCPAddr{IP: sa.Addr[0:], Port: sa.Port}
-	case *syscall.SockaddrInet6:
-		return &TCPAddr{IP: sa.Addr[0:], Port: sa.Port, Zone: zoneToString(int(sa.ZoneId))}
-	}
-	return nil
-}
-
-func (a *TCPAddr) family() int {
-	if a == nil || len(a.IP) <= IPv4len {
-		return syscall.AF_INET
-	}
-	if a.IP.To4() != nil {
-		return syscall.AF_INET
-	}
-	return syscall.AF_INET6
-}
-
-func (a *TCPAddr) sockaddr(family int) (syscall.Sockaddr, error) {
-	if a == nil {
-		return nil, nil
-	}
-	return ipToSockaddr(family, a.IP, a.Port, a.Zone)
-}
-
-// TCPConn is an implementation of the Conn interface for TCP network
-// connections.
-type TCPConn struct {
-	conn
-}
-
-func newTCPConn(fd *netFD) *TCPConn {
-	c := &TCPConn{conn{fd}}
-	setNoDelay(c.fd, true)
-	return c
-}
-
-// ReadFrom implements the io.ReaderFrom ReadFrom method.
-func (c *TCPConn) ReadFrom(r io.Reader) (int64, error) {
-	if n, err, handled := sendFile(c.fd, r); handled {
-		if err != nil && err != io.EOF {
-			err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-		}
-		return n, err
-	}
-	n, err := genericReadFrom(c, r)
-	if err != nil && err != io.EOF {
-		err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return n, err
-}
-
-// CloseRead shuts down the reading side of the TCP connection.
-// Most callers should just use Close.
-func (c *TCPConn) CloseRead() error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	err := c.fd.closeRead()
-	if err != nil {
-		err = &OpError{Op: "close", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return err
-}
-
-// CloseWrite shuts down the writing side of the TCP connection.
-// Most callers should just use Close.
-func (c *TCPConn) CloseWrite() error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	err := c.fd.closeWrite()
-	if err != nil {
-		err = &OpError{Op: "close", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return err
-}
-
-// SetLinger sets the behavior of Close on a connection which still
-// has data waiting to be sent or to be acknowledged.
-//
-// If sec < 0 (the default), the operating system finishes sending the
-// data in the background.
-//
-// If sec == 0, the operating system discards any unsent or
-// unacknowledged data.
-//
-// If sec > 0, the data is sent in the background as with sec < 0. On
-// some operating systems after sec seconds have elapsed any remaining
-// unsent data may be discarded.
-func (c *TCPConn) SetLinger(sec int) error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	if err := setLinger(c.fd, sec); err != nil {
-		return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return nil
-}
-
-// SetKeepAlive sets whether the operating system should send
-// keepalive messages on the connection.
-func (c *TCPConn) SetKeepAlive(keepalive bool) error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	if err := setKeepAlive(c.fd, keepalive); err != nil {
-		return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return nil
-}
-
-// SetKeepAlivePeriod sets period between keep alives.
-func (c *TCPConn) SetKeepAlivePeriod(d time.Duration) error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	if err := setKeepAlivePeriod(c.fd, d); err != nil {
-		return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return nil
-}
-
-// SetNoDelay controls whether the operating system should delay
-// packet transmission in hopes of sending fewer packets (Nagle's
-// algorithm).  The default is true (no delay), meaning that data is
-// sent as soon as possible after a Write.
-func (c *TCPConn) SetNoDelay(noDelay bool) error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	if err := setNoDelay(c.fd, noDelay); err != nil {
-		return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return nil
-}
-
-// DialTCP connects to the remote address raddr on the network net,
-// which must be "tcp", "tcp4", or "tcp6".  If laddr is not nil, it is
-// used as the local address for the connection.
-func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error) {
-	switch net {
-	case "tcp", "tcp4", "tcp6":
-	default:
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: UnknownNetworkError(net)}
-	}
-	if raddr == nil {
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: nil, Err: errMissingAddress}
-	}
-	return dialTCP(net, laddr, raddr, noDeadline)
-}
-
-func dialTCP(net string, laddr, raddr *TCPAddr, deadline time.Time) (*TCPConn, error) {
-	fd, err := internetSocket(net, laddr, raddr, deadline, syscall.SOCK_STREAM, 0, "dial")
-
-	// TCP has a rarely used mechanism called a 'simultaneous connection' in
-	// which Dial("tcp", addr1, addr2) run on the machine at addr1 can
-	// connect to a simultaneous Dial("tcp", addr2, addr1) run on the machine
-	// at addr2, without either machine executing Listen.  If laddr == nil,
-	// it means we want the kernel to pick an appropriate originating local
-	// address.  Some Linux kernels cycle blindly through a fixed range of
-	// local ports, regardless of destination port.  If a kernel happens to
-	// pick local port 50001 as the source for a Dial("tcp", "", "localhost:50001"),
-	// then the Dial will succeed, having simultaneously connected to itself.
-	// This can only happen when we are letting the kernel pick a port (laddr == nil)
-	// and when there is no listener for the destination address.
-	// It's hard to argue this is anything other than a kernel bug.  If we
-	// see this happen, rather than expose the buggy effect to users, we
-	// close the fd and try again.  If it happens twice more, we relent and
-	// use the result.  See also:
-	//	https://golang.org/issue/2690
-	//	http://stackoverflow.com/questions/4949858/
-	//
-	// The opposite can also happen: if we ask the kernel to pick an appropriate
-	// originating local address, sometimes it picks one that is already in use.
-	// So if the error is EADDRNOTAVAIL, we have to try again too, just for
-	// a different reason.
-	//
-	// The kernel socket code is no doubt enjoying watching us squirm.
-	for i := 0; i < 2 && (laddr == nil || laddr.Port == 0) && (selfConnect(fd, err) || spuriousENOTAVAIL(err)); i++ {
-		if err == nil {
-			fd.Close()
-		}
-		fd, err = internetSocket(net, laddr, raddr, deadline, syscall.SOCK_STREAM, 0, "dial")
-	}
-
-	if err != nil {
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: err}
-	}
-	return newTCPConn(fd), nil
-}
-
-func selfConnect(fd *netFD, err error) bool {
-	// If the connect failed, we clearly didn't connect to ourselves.
-	if err != nil {
-		return false
-	}
-
-	// The socket constructor can return an fd with raddr nil under certain
-	// unknown conditions. The errors in the calls there to Getpeername
-	// are discarded, but we can't catch the problem there because those
-	// calls are sometimes legally erroneous with a "socket not connected".
-	// Since this code (selfConnect) is already trying to work around
-	// a problem, we make sure if this happens we recognize trouble and
-	// ask the DialTCP routine to try again.
-	// TODO: try to understand what's really going on.
-	if fd.laddr == nil || fd.raddr == nil {
-		return true
-	}
-	l := fd.laddr.(*TCPAddr)
-	r := fd.raddr.(*TCPAddr)
-	return l.Port == r.Port && l.IP.Equal(r.IP)
-}
-
-func spuriousENOTAVAIL(err error) bool {
-	if op, ok := err.(*OpError); ok {
-		err = op.Err
-	}
-	if sys, ok := err.(*os.SyscallError); ok {
-		err = sys.Err
-	}
-	return err == syscall.EADDRNOTAVAIL
-}
-
-// TCPListener is a TCP network listener.  Clients should typically
-// use variables of type Listener instead of assuming TCP.
-type TCPListener struct {
-	fd *netFD
-}
-
-// AcceptTCP accepts the next incoming call and returns the new
-// connection.
-func (l *TCPListener) AcceptTCP() (*TCPConn, error) {
-	if l == nil || l.fd == nil {
-		return nil, syscall.EINVAL
-	}
-	fd, err := l.fd.accept()
-	if err != nil {
-		return nil, &OpError{Op: "accept", Net: l.fd.net, Source: nil, Addr: l.fd.laddr, Err: err}
-	}
-	return newTCPConn(fd), nil
-}
-
-// Accept implements the Accept method in the Listener interface; it
-// waits for the next call and returns a generic Conn.
-func (l *TCPListener) Accept() (Conn, error) {
-	c, err := l.AcceptTCP()
-	if err != nil {
-		return nil, err
-	}
-	return c, nil
-}
-
-// Close stops listening on the TCP address.
-// Already Accepted connections are not closed.
-func (l *TCPListener) Close() error {
-	if l == nil || l.fd == nil {
-		return syscall.EINVAL
-	}
-	err := l.fd.Close()
-	if err != nil {
-		err = &OpError{Op: "close", Net: l.fd.net, Source: nil, Addr: l.fd.laddr, Err: err}
-	}
-	return err
-}
-
-// Addr returns the listener's network address, a *TCPAddr.
-// The Addr returned is shared by all invocations of Addr, so
-// do not modify it.
-func (l *TCPListener) Addr() Addr { return l.fd.laddr }
-
-// SetDeadline sets the deadline associated with the listener.
-// A zero time value disables the deadline.
-func (l *TCPListener) SetDeadline(t time.Time) error {
-	if l == nil || l.fd == nil {
-		return syscall.EINVAL
-	}
-	if err := l.fd.setDeadline(t); err != nil {
-		return &OpError{Op: "set", Net: l.fd.net, Source: nil, Addr: l.fd.laddr, Err: err}
-	}
-	return nil
-}
-
-// File returns a copy of the underlying os.File, set to blocking
-// mode.  It is the caller's responsibility to close f when finished.
-// Closing l does not affect f, and closing f does not affect l.
-//
-// The returned os.File's file descriptor is different from the
-// connection's.  Attempting to change properties of the original
-// using this duplicate may or may not have the desired effect.
-func (l *TCPListener) File() (f *os.File, err error) {
-	f, err = l.fd.dup()
-	if err != nil {
-		err = &OpError{Op: "file", Net: l.fd.net, Source: nil, Addr: l.fd.laddr, Err: err}
-	}
-	return
-}
-
-// ListenTCP announces on the TCP address laddr and returns a TCP
-// listener.  Net must be "tcp", "tcp4", or "tcp6".  If laddr has a
-// port of 0, ListenTCP will choose an available port.  The caller can
-// use the Addr method of TCPListener to retrieve the chosen address.
-func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error) {
-	switch net {
-	case "tcp", "tcp4", "tcp6":
-	default:
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(net)}
-	}
-	if laddr == nil {
-		laddr = &TCPAddr{}
-	}
-	fd, err := internetSocket(net, laddr, nil, noDeadline, syscall.SOCK_STREAM, 0, "listen")
-	if err != nil {
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: err}
-	}
-	return &TCPListener{fd}, nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/tcpsockopt_darwin.go b/third_party/gofrontend/libgo/go/net/tcpsockopt_darwin.go
deleted file mode 100644
index 1f16090..0000000
--- a/third_party/gofrontend/libgo/go/net/tcpsockopt_darwin.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-	"time"
-)
-
-const sysTCP_KEEPINTVL = 0x101
-
-func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	// The kernel expects seconds so round to next highest second.
-	d += (time.Second - time.Nanosecond)
-	secs := int(d.Seconds())
-	switch err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, sysTCP_KEEPINTVL, secs); err {
-	case nil, syscall.ENOPROTOOPT: // OS X 10.7 and earlier don't support this option
-	default:
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_KEEPALIVE, secs))
-}
diff --git a/third_party/gofrontend/libgo/go/net/tcpsockopt_dragonfly.go b/third_party/gofrontend/libgo/go/net/tcpsockopt_dragonfly.go
deleted file mode 100644
index 0aa2132..0000000
--- a/third_party/gofrontend/libgo/go/net/tcpsockopt_dragonfly.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-	"time"
-)
-
-func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	// The kernel expects milliseconds so round to next highest
-	// millisecond.
-	d += (time.Millisecond - time.Nanosecond)
-	msecs := int(d / time.Millisecond)
-	if err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_KEEPINTVL, msecs); err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_KEEPIDLE, msecs))
-}
diff --git a/third_party/gofrontend/libgo/go/net/tcpsockopt_openbsd.go b/third_party/gofrontend/libgo/go/net/tcpsockopt_openbsd.go
deleted file mode 100644
index 041e178..0000000
--- a/third_party/gofrontend/libgo/go/net/tcpsockopt_openbsd.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"syscall"
-	"time"
-)
-
-func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
-	// OpenBSD has no user-settable per-socket TCP keepalive
-	// options.
-	return syscall.ENOPROTOOPT
-}
diff --git a/third_party/gofrontend/libgo/go/net/tcpsockopt_plan9.go b/third_party/gofrontend/libgo/go/net/tcpsockopt_plan9.go
deleted file mode 100644
index 9abe186..0000000
--- a/third_party/gofrontend/libgo/go/net/tcpsockopt_plan9.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// TCP socket options for plan9
-
-package net
-
-import (
-	"strconv"
-	"time"
-)
-
-// Set keep alive period.
-func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
-	cmd := "keepalive " + strconv.Itoa(int(d/time.Millisecond))
-	_, e := fd.ctl.WriteAt([]byte(cmd), 0)
-	return e
-}
diff --git a/third_party/gofrontend/libgo/go/net/tcpsockopt_posix.go b/third_party/gofrontend/libgo/go/net/tcpsockopt_posix.go
deleted file mode 100644
index 0abf3f9..0000000
--- a/third_party/gofrontend/libgo/go/net/tcpsockopt_posix.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
-
-package net
-
-import (
-	"os"
-	"syscall"
-)
-
-func setNoDelay(fd *netFD, noDelay bool) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_NODELAY, boolint(noDelay)))
-}
diff --git a/third_party/gofrontend/libgo/go/net/tcpsockopt_solaris.go b/third_party/gofrontend/libgo/go/net/tcpsockopt_solaris.go
deleted file mode 100644
index eaab6b6..0000000
--- a/third_party/gofrontend/libgo/go/net/tcpsockopt_solaris.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// TCP socket options for solaris
-
-package net
-
-import (
-	"os"
-	"syscall"
-	"time"
-)
-
-// Set keep alive period.
-func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-
-	// The kernel expects seconds so round to next highest second.
-	d += (time.Second - time.Nanosecond)
-	secs := int(d.Seconds())
-
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.SO_KEEPALIVE, secs))
-}
diff --git a/third_party/gofrontend/libgo/go/net/tcpsockopt_stub.go b/third_party/gofrontend/libgo/go/net/tcpsockopt_stub.go
deleted file mode 100644
index b413a76..0000000
--- a/third_party/gofrontend/libgo/go/net/tcpsockopt_stub.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build nacl
-
-package net
-
-import (
-	"syscall"
-	"time"
-)
-
-func setNoDelay(fd *netFD, noDelay bool) error {
-	return syscall.ENOPROTOOPT
-}
-
-func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
-	return syscall.ENOPROTOOPT
-}
diff --git a/third_party/gofrontend/libgo/go/net/tcpsockopt_unix.go b/third_party/gofrontend/libgo/go/net/tcpsockopt_unix.go
deleted file mode 100644
index c8970d1..0000000
--- a/third_party/gofrontend/libgo/go/net/tcpsockopt_unix.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build freebsd linux netbsd
-
-package net
-
-import (
-	"os"
-	"syscall"
-	"time"
-)
-
-func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	// The kernel expects seconds so round to next highest second.
-	d += (time.Second - time.Nanosecond)
-	secs := int(d.Seconds())
-	if err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_KEEPINTVL, secs); err != nil {
-		return os.NewSyscallError("setsockopt", err)
-	}
-	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_TCP, syscall.TCP_KEEPIDLE, secs))
-}
diff --git a/third_party/gofrontend/libgo/go/net/tcpsockopt_windows.go b/third_party/gofrontend/libgo/go/net/tcpsockopt_windows.go
deleted file mode 100644
index ae2d7c8..0000000
--- a/third_party/gofrontend/libgo/go/net/tcpsockopt_windows.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-	"time"
-	"unsafe"
-)
-
-func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
-	if err := fd.incref(); err != nil {
-		return err
-	}
-	defer fd.decref()
-	// The kernel expects milliseconds so round to next highest
-	// millisecond.
-	d += (time.Millisecond - time.Nanosecond)
-	msecs := uint32(d / time.Millisecond)
-	ka := syscall.TCPKeepalive{
-		OnOff:    1,
-		Time:     msecs,
-		Interval: msecs,
-	}
-	ret := uint32(0)
-	size := uint32(unsafe.Sizeof(ka))
-	err := syscall.WSAIoctl(fd.sysfd, syscall.SIO_KEEPALIVE_VALS, (*byte)(unsafe.Pointer(&ka)), size, nil, 0, &ret, nil, 0)
-	return os.NewSyscallError("wsaioctl", err)
-}
diff --git a/third_party/gofrontend/libgo/go/net/testdata/domain-resolv.conf b/third_party/gofrontend/libgo/go/net/testdata/domain-resolv.conf
deleted file mode 100644
index ff26918..0000000
--- a/third_party/gofrontend/libgo/go/net/testdata/domain-resolv.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-# /etc/resolv.conf
-
-search test invalid
-domain localdomain
-nameserver 8.8.8.8
diff --git a/third_party/gofrontend/libgo/go/net/testdata/empty-resolv.conf b/third_party/gofrontend/libgo/go/net/testdata/empty-resolv.conf
deleted file mode 100644
index c4b2b57..0000000
--- a/third_party/gofrontend/libgo/go/net/testdata/empty-resolv.conf
+++ /dev/null
@@ -1 +0,0 @@
-# /etc/resolv.conf
diff --git a/third_party/gofrontend/libgo/go/net/testdata/hosts b/third_party/gofrontend/libgo/go/net/testdata/hosts
deleted file mode 100644
index b601763..0000000
--- a/third_party/gofrontend/libgo/go/net/testdata/hosts
+++ /dev/null
@@ -1,12 +0,0 @@
-255.255.255.255	broadcasthost
-127.0.0.2	odin
-127.0.0.3	odin  # inline comment 
-::2             odin
-127.1.1.1	thor
-# aliases
-127.1.1.2	ullr ullrhost
-# Bogus entries that must be ignored.
-123.123.123	loki
-321.321.321.321
-# TODO(yvesj): Should we be able to parse this? From a Darwin system.
-fe80::1%lo0	localhost
diff --git a/third_party/gofrontend/libgo/go/net/testdata/igmp b/third_party/gofrontend/libgo/go/net/testdata/igmp
deleted file mode 100644
index 5f380a2..0000000
--- a/third_party/gofrontend/libgo/go/net/testdata/igmp
+++ /dev/null
@@ -1,24 +0,0 @@
-Idx	Device    : Count Querier	Group    Users Timer	Reporter
-1	lo        :     1      V3
-				010000E0     1 0:00000000		0
-2	eth0      :     2      V2
-				FB0000E0     1 0:00000000		1
-				010000E0     1 0:00000000		0
-3	eth1      :     1      V3
-				010000E0     1 0:00000000		0
-4	eth2      :     1      V3
-				010000E0     1 0:00000000		0
-5	eth0.100  :     2      V3
-				FB0000E0     1 0:00000000		0
-				010000E0     1 0:00000000		0
-6	eth0.101  :     2      V3
-				FB0000E0     1 0:00000000		0
-				010000E0     1 0:00000000		0
-7	eth0.102  :     2      V3
-				FB0000E0     1 0:00000000		0
-				010000E0     1 0:00000000		0
-8	eth0.103  :     2      V3
-				FB0000E0     1 0:00000000		0
-				010000E0     1 0:00000000		0
-9	device1tap2:     1      V3
-				010000E0     1 0:00000000		0
diff --git a/third_party/gofrontend/libgo/go/net/testdata/igmp6 b/third_party/gofrontend/libgo/go/net/testdata/igmp6
deleted file mode 100644
index 6cd5a2d..0000000
--- a/third_party/gofrontend/libgo/go/net/testdata/igmp6
+++ /dev/null
@@ -1,18 +0,0 @@
-1    lo              ff020000000000000000000000000001     1 0000000C 0
-2    eth0            ff0200000000000000000001ffac891e     1 00000006 0
-2    eth0            ff020000000000000000000000000001     1 0000000C 0
-3    eth1            ff0200000000000000000001ffac8928     2 00000006 0
-3    eth1            ff020000000000000000000000000001     1 0000000C 0
-4    eth2            ff0200000000000000000001ffac8932     2 00000006 0
-4    eth2            ff020000000000000000000000000001     1 0000000C 0
-5    eth0.100        ff0200000000000000000001ffac891e     1 00000004 0
-5    eth0.100        ff020000000000000000000000000001     1 0000000C 0
-6    pan0            ff020000000000000000000000000001     1 0000000C 0
-7    eth0.101        ff0200000000000000000001ffac891e     1 00000004 0
-7    eth0.101        ff020000000000000000000000000001     1 0000000C 0
-8    eth0.102        ff0200000000000000000001ffac891e     1 00000004 0
-8    eth0.102        ff020000000000000000000000000001     1 0000000C 0
-9    eth0.103        ff0200000000000000000001ffac891e     1 00000004 0
-9    eth0.103        ff020000000000000000000000000001     1 0000000C 0
-10   device1tap2     ff0200000000000000000001ff4cc3a3     1 00000004 0
-10   device1tap2     ff020000000000000000000000000001     1 0000000C 0
diff --git a/third_party/gofrontend/libgo/go/net/testdata/ipv4-hosts b/third_party/gofrontend/libgo/go/net/testdata/ipv4-hosts
deleted file mode 100644
index 5208bb4..0000000
--- a/third_party/gofrontend/libgo/go/net/testdata/ipv4-hosts
+++ /dev/null
@@ -1,12 +0,0 @@
-# See https://tools.ietf.org/html/rfc1123.
-#
-# The literal IPv4 address parser in the net package is a relaxed
-# one. It may accept a literal IPv4 address in dotted-decimal notation
-# with leading zeros such as "001.2.003.4".
-
-# internet address and host name
-127.0.0.1	localhost	# inline comment separated by tab
-127.000.000.002	localhost       # inline comment separated by space
-
-# internet address, host name and aliases
-127.000.000.003	localhost	localhost.localdomain
diff --git a/third_party/gofrontend/libgo/go/net/testdata/ipv6-hosts b/third_party/gofrontend/libgo/go/net/testdata/ipv6-hosts
deleted file mode 100644
index f78b7fc..0000000
--- a/third_party/gofrontend/libgo/go/net/testdata/ipv6-hosts
+++ /dev/null
@@ -1,11 +0,0 @@
-# See https://tools.ietf.org/html/rfc5952, https://tools.ietf.org/html/rfc4007.
-
-# internet address and host name
-::1						localhost	# inline comment separated by tab
-fe80:0000:0000:0000:0000:0000:0000:0001		localhost       # inline comment separated by space
-
-# internet address with zone identifier and host name
-fe80:0000:0000:0000:0000:0000:0000:0002%lo0	localhost
-
-# internet address, host name and aliases
-fe80::3%lo0					localhost	localhost.localdomain
diff --git a/third_party/gofrontend/libgo/go/net/testdata/openbsd-resolv.conf b/third_party/gofrontend/libgo/go/net/testdata/openbsd-resolv.conf
deleted file mode 100644
index 8281a91..0000000
--- a/third_party/gofrontend/libgo/go/net/testdata/openbsd-resolv.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-# Generated by vio0 dhclient
-search c.symbolic-datum-552.internal.
-nameserver 169.254.169.254
-nameserver 10.240.0.1
-lookup file bind
diff --git a/third_party/gofrontend/libgo/go/net/testdata/resolv.conf b/third_party/gofrontend/libgo/go/net/testdata/resolv.conf
deleted file mode 100644
index 04e87ee..0000000
--- a/third_party/gofrontend/libgo/go/net/testdata/resolv.conf
+++ /dev/null
@@ -1,8 +0,0 @@
-# /etc/resolv.conf
-
-domain localdomain
-nameserver 8.8.8.8
-nameserver 2001:4860:4860::8888
-nameserver fe80::1%lo0
-options ndots:5 timeout:10 attempts:3 rotate
-options attempts 3
diff --git a/third_party/gofrontend/libgo/go/net/testdata/search-resolv.conf b/third_party/gofrontend/libgo/go/net/testdata/search-resolv.conf
deleted file mode 100644
index 1c846bf..0000000
--- a/third_party/gofrontend/libgo/go/net/testdata/search-resolv.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-# /etc/resolv.conf
-
-domain localdomain
-search test invalid
-nameserver 8.8.8.8
diff --git a/third_party/gofrontend/libgo/go/net/testdata/singleline-hosts b/third_party/gofrontend/libgo/go/net/testdata/singleline-hosts
deleted file mode 100644
index 5f5f74a..0000000
--- a/third_party/gofrontend/libgo/go/net/testdata/singleline-hosts
+++ /dev/null
@@ -1 +0,0 @@
-127.0.0.2	odin
\ No newline at end of file
diff --git a/third_party/gofrontend/libgo/go/net/textproto/header.go b/third_party/gofrontend/libgo/go/net/textproto/header.go
deleted file mode 100644
index 7fb32f8..0000000
--- a/third_party/gofrontend/libgo/go/net/textproto/header.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package textproto
-
-// A MIMEHeader represents a MIME-style header mapping
-// keys to sets of values.
-type MIMEHeader map[string][]string
-
-// Add adds the key, value pair to the header.
-// It appends to any existing values associated with key.
-func (h MIMEHeader) Add(key, value string) {
-	key = CanonicalMIMEHeaderKey(key)
-	h[key] = append(h[key], value)
-}
-
-// Set sets the header entries associated with key to
-// the single element value.  It replaces any existing
-// values associated with key.
-func (h MIMEHeader) Set(key, value string) {
-	h[CanonicalMIMEHeaderKey(key)] = []string{value}
-}
-
-// Get gets the first value associated with the given key.
-// If there are no values associated with the key, Get returns "".
-// Get is a convenience method.  For more complex queries,
-// access the map directly.
-func (h MIMEHeader) Get(key string) string {
-	if h == nil {
-		return ""
-	}
-	v := h[CanonicalMIMEHeaderKey(key)]
-	if len(v) == 0 {
-		return ""
-	}
-	return v[0]
-}
-
-// Del deletes the values associated with key.
-func (h MIMEHeader) Del(key string) {
-	delete(h, CanonicalMIMEHeaderKey(key))
-}
diff --git a/third_party/gofrontend/libgo/go/net/textproto/pipeline.go b/third_party/gofrontend/libgo/go/net/textproto/pipeline.go
deleted file mode 100644
index ca50edd..0000000
--- a/third_party/gofrontend/libgo/go/net/textproto/pipeline.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package textproto
-
-import (
-	"sync"
-)
-
-// A Pipeline manages a pipelined in-order request/response sequence.
-//
-// To use a Pipeline p to manage multiple clients on a connection,
-// each client should run:
-//
-//	id := p.Next()	// take a number
-//
-//	p.StartRequest(id)	// wait for turn to send request
-//	«send request»
-//	p.EndRequest(id)	// notify Pipeline that request is sent
-//
-//	p.StartResponse(id)	// wait for turn to read response
-//	«read response»
-//	p.EndResponse(id)	// notify Pipeline that response is read
-//
-// A pipelined server can use the same calls to ensure that
-// responses computed in parallel are written in the correct order.
-type Pipeline struct {
-	mu       sync.Mutex
-	id       uint
-	request  sequencer
-	response sequencer
-}
-
-// Next returns the next id for a request/response pair.
-func (p *Pipeline) Next() uint {
-	p.mu.Lock()
-	id := p.id
-	p.id++
-	p.mu.Unlock()
-	return id
-}
-
-// StartRequest blocks until it is time to send (or, if this is a server, receive)
-// the request with the given id.
-func (p *Pipeline) StartRequest(id uint) {
-	p.request.Start(id)
-}
-
-// EndRequest notifies p that the request with the given id has been sent
-// (or, if this is a server, received).
-func (p *Pipeline) EndRequest(id uint) {
-	p.request.End(id)
-}
-
-// StartResponse blocks until it is time to receive (or, if this is a server, send)
-// the request with the given id.
-func (p *Pipeline) StartResponse(id uint) {
-	p.response.Start(id)
-}
-
-// EndResponse notifies p that the response with the given id has been received
-// (or, if this is a server, sent).
-func (p *Pipeline) EndResponse(id uint) {
-	p.response.End(id)
-}
-
-// A sequencer schedules a sequence of numbered events that must
-// happen in order, one after the other.  The event numbering must start
-// at 0 and increment without skipping.  The event number wraps around
-// safely as long as there are not 2^32 simultaneous events pending.
-type sequencer struct {
-	mu   sync.Mutex
-	id   uint
-	wait map[uint]chan uint
-}
-
-// Start waits until it is time for the event numbered id to begin.
-// That is, except for the first event, it waits until End(id-1) has
-// been called.
-func (s *sequencer) Start(id uint) {
-	s.mu.Lock()
-	if s.id == id {
-		s.mu.Unlock()
-		return
-	}
-	c := make(chan uint)
-	if s.wait == nil {
-		s.wait = make(map[uint]chan uint)
-	}
-	s.wait[id] = c
-	s.mu.Unlock()
-	<-c
-}
-
-// End notifies the sequencer that the event numbered id has completed,
-// allowing it to schedule the event numbered id+1.  It is a run-time error
-// to call End with an id that is not the number of the active event.
-func (s *sequencer) End(id uint) {
-	s.mu.Lock()
-	if s.id != id {
-		panic("out of sync")
-	}
-	id++
-	s.id = id
-	if s.wait == nil {
-		s.wait = make(map[uint]chan uint)
-	}
-	c, ok := s.wait[id]
-	if ok {
-		delete(s.wait, id)
-	}
-	s.mu.Unlock()
-	if ok {
-		c <- 1
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/textproto/reader.go b/third_party/gofrontend/libgo/go/net/textproto/reader.go
deleted file mode 100644
index 91303fe..0000000
--- a/third_party/gofrontend/libgo/go/net/textproto/reader.go
+++ /dev/null
@@ -1,674 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package textproto
-
-import (
-	"bufio"
-	"bytes"
-	"io"
-	"io/ioutil"
-	"strconv"
-	"strings"
-)
-
-// A Reader implements convenience methods for reading requests
-// or responses from a text protocol network connection.
-type Reader struct {
-	R   *bufio.Reader
-	dot *dotReader
-	buf []byte // a re-usable buffer for readContinuedLineSlice
-}
-
-// NewReader returns a new Reader reading from r.
-//
-// To avoid denial of service attacks, the provided bufio.Reader
-// should be reading from an io.LimitReader or similar Reader to bound
-// the size of responses.
-func NewReader(r *bufio.Reader) *Reader {
-	return &Reader{R: r}
-}
-
-// ReadLine reads a single line from r,
-// eliding the final \n or \r\n from the returned string.
-func (r *Reader) ReadLine() (string, error) {
-	line, err := r.readLineSlice()
-	return string(line), err
-}
-
-// ReadLineBytes is like ReadLine but returns a []byte instead of a string.
-func (r *Reader) ReadLineBytes() ([]byte, error) {
-	line, err := r.readLineSlice()
-	if line != nil {
-		buf := make([]byte, len(line))
-		copy(buf, line)
-		line = buf
-	}
-	return line, err
-}
-
-func (r *Reader) readLineSlice() ([]byte, error) {
-	r.closeDot()
-	var line []byte
-	for {
-		l, more, err := r.R.ReadLine()
-		if err != nil {
-			return nil, err
-		}
-		// Avoid the copy if the first call produced a full line.
-		if line == nil && !more {
-			return l, nil
-		}
-		line = append(line, l...)
-		if !more {
-			break
-		}
-	}
-	return line, nil
-}
-
-// ReadContinuedLine reads a possibly continued line from r,
-// eliding the final trailing ASCII white space.
-// Lines after the first are considered continuations if they
-// begin with a space or tab character.  In the returned data,
-// continuation lines are separated from the previous line
-// only by a single space: the newline and leading white space
-// are removed.
-//
-// For example, consider this input:
-//
-//	Line 1
-//	  continued...
-//	Line 2
-//
-// The first call to ReadContinuedLine will return "Line 1 continued..."
-// and the second will return "Line 2".
-//
-// A line consisting of only white space is never continued.
-//
-func (r *Reader) ReadContinuedLine() (string, error) {
-	line, err := r.readContinuedLineSlice()
-	return string(line), err
-}
-
-// trim returns s with leading and trailing spaces and tabs removed.
-// It does not assume Unicode or UTF-8.
-func trim(s []byte) []byte {
-	i := 0
-	for i < len(s) && (s[i] == ' ' || s[i] == '\t') {
-		i++
-	}
-	n := len(s)
-	for n > i && (s[n-1] == ' ' || s[n-1] == '\t') {
-		n--
-	}
-	return s[i:n]
-}
-
-// ReadContinuedLineBytes is like ReadContinuedLine but
-// returns a []byte instead of a string.
-func (r *Reader) ReadContinuedLineBytes() ([]byte, error) {
-	line, err := r.readContinuedLineSlice()
-	if line != nil {
-		buf := make([]byte, len(line))
-		copy(buf, line)
-		line = buf
-	}
-	return line, err
-}
-
-func (r *Reader) readContinuedLineSlice() ([]byte, error) {
-	// Read the first line.
-	line, err := r.readLineSlice()
-	if err != nil {
-		return nil, err
-	}
-	if len(line) == 0 { // blank line - no continuation
-		return line, nil
-	}
-
-	// Optimistically assume that we have started to buffer the next line
-	// and it starts with an ASCII letter (the next header key), so we can
-	// avoid copying that buffered data around in memory and skipping over
-	// non-existent whitespace.
-	if r.R.Buffered() > 1 {
-		peek, err := r.R.Peek(1)
-		if err == nil && isASCIILetter(peek[0]) {
-			return trim(line), nil
-		}
-	}
-
-	// ReadByte or the next readLineSlice will flush the read buffer;
-	// copy the slice into buf.
-	r.buf = append(r.buf[:0], trim(line)...)
-
-	// Read continuation lines.
-	for r.skipSpace() > 0 {
-		line, err := r.readLineSlice()
-		if err != nil {
-			break
-		}
-		r.buf = append(r.buf, ' ')
-		r.buf = append(r.buf, line...)
-	}
-	return r.buf, nil
-}
-
-// skipSpace skips R over all spaces and returns the number of bytes skipped.
-func (r *Reader) skipSpace() int {
-	n := 0
-	for {
-		c, err := r.R.ReadByte()
-		if err != nil {
-			// Bufio will keep err until next read.
-			break
-		}
-		if c != ' ' && c != '\t' {
-			r.R.UnreadByte()
-			break
-		}
-		n++
-	}
-	return n
-}
-
-func (r *Reader) readCodeLine(expectCode int) (code int, continued bool, message string, err error) {
-	line, err := r.ReadLine()
-	if err != nil {
-		return
-	}
-	return parseCodeLine(line, expectCode)
-}
-
-func parseCodeLine(line string, expectCode int) (code int, continued bool, message string, err error) {
-	if len(line) < 4 || line[3] != ' ' && line[3] != '-' {
-		err = ProtocolError("short response: " + line)
-		return
-	}
-	continued = line[3] == '-'
-	code, err = strconv.Atoi(line[0:3])
-	if err != nil || code < 100 {
-		err = ProtocolError("invalid response code: " + line)
-		return
-	}
-	message = line[4:]
-	if 1 <= expectCode && expectCode < 10 && code/100 != expectCode ||
-		10 <= expectCode && expectCode < 100 && code/10 != expectCode ||
-		100 <= expectCode && expectCode < 1000 && code != expectCode {
-		err = &Error{code, message}
-	}
-	return
-}
-
-// ReadCodeLine reads a response code line of the form
-//	code message
-// where code is a three-digit status code and the message
-// extends to the rest of the line.  An example of such a line is:
-//	220 plan9.bell-labs.com ESMTP
-//
-// If the prefix of the status does not match the digits in expectCode,
-// ReadCodeLine returns with err set to &Error{code, message}.
-// For example, if expectCode is 31, an error will be returned if
-// the status is not in the range [310,319].
-//
-// If the response is multi-line, ReadCodeLine returns an error.
-//
-// An expectCode <= 0 disables the check of the status code.
-//
-func (r *Reader) ReadCodeLine(expectCode int) (code int, message string, err error) {
-	code, continued, message, err := r.readCodeLine(expectCode)
-	if err == nil && continued {
-		err = ProtocolError("unexpected multi-line response: " + message)
-	}
-	return
-}
-
-// ReadResponse reads a multi-line response of the form:
-//
-//	code-message line 1
-//	code-message line 2
-//	...
-//	code message line n
-//
-// where code is a three-digit status code. The first line starts with the
-// code and a hyphen. The response is terminated by a line that starts
-// with the same code followed by a space. Each line in message is
-// separated by a newline (\n).
-//
-// See page 36 of RFC 959 (http://www.ietf.org/rfc/rfc959.txt) for
-// details.
-//
-// If the prefix of the status does not match the digits in expectCode,
-// ReadResponse returns with err set to &Error{code, message}.
-// For example, if expectCode is 31, an error will be returned if
-// the status is not in the range [310,319].
-//
-// An expectCode <= 0 disables the check of the status code.
-//
-func (r *Reader) ReadResponse(expectCode int) (code int, message string, err error) {
-	code, continued, message, err := r.readCodeLine(expectCode)
-	for err == nil && continued {
-		line, err := r.ReadLine()
-		if err != nil {
-			return 0, "", err
-		}
-
-		var code2 int
-		var moreMessage string
-		code2, continued, moreMessage, err = parseCodeLine(line, expectCode)
-		if err != nil || code2 != code {
-			message += "\n" + strings.TrimRight(line, "\r\n")
-			continued = true
-			continue
-		}
-		message += "\n" + moreMessage
-	}
-	return
-}
-
-// DotReader returns a new Reader that satisfies Reads using the
-// decoded text of a dot-encoded block read from r.
-// The returned Reader is only valid until the next call
-// to a method on r.
-//
-// Dot encoding is a common framing used for data blocks
-// in text protocols such as SMTP.  The data consists of a sequence
-// of lines, each of which ends in "\r\n".  The sequence itself
-// ends at a line containing just a dot: ".\r\n".  Lines beginning
-// with a dot are escaped with an additional dot to avoid
-// looking like the end of the sequence.
-//
-// The decoded form returned by the Reader's Read method
-// rewrites the "\r\n" line endings into the simpler "\n",
-// removes leading dot escapes if present, and stops with error io.EOF
-// after consuming (and discarding) the end-of-sequence line.
-func (r *Reader) DotReader() io.Reader {
-	r.closeDot()
-	r.dot = &dotReader{r: r}
-	return r.dot
-}
-
-type dotReader struct {
-	r     *Reader
-	state int
-}
-
-// Read satisfies reads by decoding dot-encoded data read from d.r.
-func (d *dotReader) Read(b []byte) (n int, err error) {
-	// Run data through a simple state machine to
-	// elide leading dots, rewrite trailing \r\n into \n,
-	// and detect ending .\r\n line.
-	const (
-		stateBeginLine = iota // beginning of line; initial state; must be zero
-		stateDot              // read . at beginning of line
-		stateDotCR            // read .\r at beginning of line
-		stateCR               // read \r (possibly at end of line)
-		stateData             // reading data in middle of line
-		stateEOF              // reached .\r\n end marker line
-	)
-	br := d.r.R
-	for n < len(b) && d.state != stateEOF {
-		var c byte
-		c, err = br.ReadByte()
-		if err != nil {
-			if err == io.EOF {
-				err = io.ErrUnexpectedEOF
-			}
-			break
-		}
-		switch d.state {
-		case stateBeginLine:
-			if c == '.' {
-				d.state = stateDot
-				continue
-			}
-			if c == '\r' {
-				d.state = stateCR
-				continue
-			}
-			d.state = stateData
-
-		case stateDot:
-			if c == '\r' {
-				d.state = stateDotCR
-				continue
-			}
-			if c == '\n' {
-				d.state = stateEOF
-				continue
-			}
-			d.state = stateData
-
-		case stateDotCR:
-			if c == '\n' {
-				d.state = stateEOF
-				continue
-			}
-			// Not part of .\r\n.
-			// Consume leading dot and emit saved \r.
-			br.UnreadByte()
-			c = '\r'
-			d.state = stateData
-
-		case stateCR:
-			if c == '\n' {
-				d.state = stateBeginLine
-				break
-			}
-			// Not part of \r\n.  Emit saved \r
-			br.UnreadByte()
-			c = '\r'
-			d.state = stateData
-
-		case stateData:
-			if c == '\r' {
-				d.state = stateCR
-				continue
-			}
-			if c == '\n' {
-				d.state = stateBeginLine
-			}
-		}
-		b[n] = c
-		n++
-	}
-	if err == nil && d.state == stateEOF {
-		err = io.EOF
-	}
-	if err != nil && d.r.dot == d {
-		d.r.dot = nil
-	}
-	return
-}
-
-// closeDot drains the current DotReader if any,
-// making sure that it reads until the ending dot line.
-func (r *Reader) closeDot() {
-	if r.dot == nil {
-		return
-	}
-	buf := make([]byte, 128)
-	for r.dot != nil {
-		// When Read reaches EOF or an error,
-		// it will set r.dot == nil.
-		r.dot.Read(buf)
-	}
-}
-
-// ReadDotBytes reads a dot-encoding and returns the decoded data.
-//
-// See the documentation for the DotReader method for details about dot-encoding.
-func (r *Reader) ReadDotBytes() ([]byte, error) {
-	return ioutil.ReadAll(r.DotReader())
-}
-
-// ReadDotLines reads a dot-encoding and returns a slice
-// containing the decoded lines, with the final \r\n or \n elided from each.
-//
-// See the documentation for the DotReader method for details about dot-encoding.
-func (r *Reader) ReadDotLines() ([]string, error) {
-	// We could use ReadDotBytes and then Split it,
-	// but reading a line at a time avoids needing a
-	// large contiguous block of memory and is simpler.
-	var v []string
-	var err error
-	for {
-		var line string
-		line, err = r.ReadLine()
-		if err != nil {
-			if err == io.EOF {
-				err = io.ErrUnexpectedEOF
-			}
-			break
-		}
-
-		// Dot by itself marks end; otherwise cut one dot.
-		if len(line) > 0 && line[0] == '.' {
-			if len(line) == 1 {
-				break
-			}
-			line = line[1:]
-		}
-		v = append(v, line)
-	}
-	return v, err
-}
-
-// ReadMIMEHeader reads a MIME-style header from r.
-// The header is a sequence of possibly continued Key: Value lines
-// ending in a blank line.
-// The returned map m maps CanonicalMIMEHeaderKey(key) to a
-// sequence of values in the same order encountered in the input.
-//
-// For example, consider this input:
-//
-//	My-Key: Value 1
-//	Long-Key: Even
-//	       Longer Value
-//	My-Key: Value 2
-//
-// Given that input, ReadMIMEHeader returns the map:
-//
-//	map[string][]string{
-//		"My-Key": {"Value 1", "Value 2"},
-//		"Long-Key": {"Even Longer Value"},
-//	}
-//
-func (r *Reader) ReadMIMEHeader() (MIMEHeader, error) {
-	// Avoid lots of small slice allocations later by allocating one
-	// large one ahead of time which we'll cut up into smaller
-	// slices. If this isn't big enough later, we allocate small ones.
-	var strs []string
-	hint := r.upcomingHeaderNewlines()
-	if hint > 0 {
-		strs = make([]string, hint)
-	}
-
-	m := make(MIMEHeader, hint)
-	for {
-		kv, err := r.readContinuedLineSlice()
-		if len(kv) == 0 {
-			return m, err
-		}
-
-		// Key ends at first colon; should not have spaces but
-		// they appear in the wild, violating specs, so we
-		// remove them if present.
-		i := bytes.IndexByte(kv, ':')
-		if i < 0 {
-			return m, ProtocolError("malformed MIME header line: " + string(kv))
-		}
-		endKey := i
-		for endKey > 0 && kv[endKey-1] == ' ' {
-			endKey--
-		}
-		key := canonicalMIMEHeaderKey(kv[:endKey])
-
-		// As per RFC 7230 field-name is a token, tokens consist of one or more chars.
-		// We could return a ProtocolError here, but better to be liberal in what we
-		// accept, so if we get an empty key, skip it.
-		if key == "" {
-			continue
-		}
-
-		// Skip initial spaces in value.
-		i++ // skip colon
-		for i < len(kv) && (kv[i] == ' ' || kv[i] == '\t') {
-			i++
-		}
-		value := string(kv[i:])
-
-		vv := m[key]
-		if vv == nil && len(strs) > 0 {
-			// More than likely this will be a single-element key.
-			// Most headers aren't multi-valued.
-			// Set the capacity on strs[0] to 1, so any future append
-			// won't extend the slice into the other strings.
-			vv, strs = strs[:1:1], strs[1:]
-			vv[0] = value
-			m[key] = vv
-		} else {
-			m[key] = append(vv, value)
-		}
-
-		if err != nil {
-			return m, err
-		}
-	}
-}
-
-// upcomingHeaderNewlines returns an approximation of the number of newlines
-// that will be in this header. If it gets confused, it returns 0.
-func (r *Reader) upcomingHeaderNewlines() (n int) {
-	// Try to determine the 'hint' size.
-	r.R.Peek(1) // force a buffer load if empty
-	s := r.R.Buffered()
-	if s == 0 {
-		return
-	}
-	peek, _ := r.R.Peek(s)
-	for len(peek) > 0 {
-		i := bytes.IndexByte(peek, '\n')
-		if i < 3 {
-			// Not present (-1) or found within the next few bytes,
-			// implying we're at the end ("\r\n\r\n" or "\n\n")
-			return
-		}
-		n++
-		peek = peek[i+1:]
-	}
-	return
-}
-
-// CanonicalMIMEHeaderKey returns the canonical format of the
-// MIME header key s.  The canonicalization converts the first
-// letter and any letter following a hyphen to upper case;
-// the rest are converted to lowercase.  For example, the
-// canonical key for "accept-encoding" is "Accept-Encoding".
-// MIME header keys are assumed to be ASCII only.
-// If s contains a space or invalid header field bytes, it is
-// returned without modifications.
-func CanonicalMIMEHeaderKey(s string) string {
-	// Quick check for canonical encoding.
-	upper := true
-	for i := 0; i < len(s); i++ {
-		c := s[i]
-		if !validHeaderFieldByte(c) {
-			return s
-		}
-		if upper && 'a' <= c && c <= 'z' {
-			return canonicalMIMEHeaderKey([]byte(s))
-		}
-		if !upper && 'A' <= c && c <= 'Z' {
-			return canonicalMIMEHeaderKey([]byte(s))
-		}
-		upper = c == '-'
-	}
-	return s
-}
-
-const toLower = 'a' - 'A'
-
-// validHeaderFieldByte reports whether b is a valid byte in a header
-// field key. This is actually stricter than RFC 7230, which says:
-//   tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
-//           "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
-//   token = 1*tchar
-// TODO: revisit in Go 1.6+ and possibly expand this. But note that many
-// servers have historically dropped '_' to prevent ambiguities when mapping
-// to CGI environment variables.
-func validHeaderFieldByte(b byte) bool {
-	return ('A' <= b && b <= 'Z') ||
-		('a' <= b && b <= 'z') ||
-		('0' <= b && b <= '9') ||
-		b == '-'
-}
-
-// canonicalMIMEHeaderKey is like CanonicalMIMEHeaderKey but is
-// allowed to mutate the provided byte slice before returning the
-// string.
-//
-// For invalid inputs (if a contains spaces or non-token bytes), a
-// is unchanged and a string copy is returned.
-func canonicalMIMEHeaderKey(a []byte) string {
-	// See if a looks like a header key. If not, return it unchanged.
-	for _, c := range a {
-		if validHeaderFieldByte(c) {
-			continue
-		}
-		// Don't canonicalize.
-		return string(a)
-	}
-
-	upper := true
-	for i, c := range a {
-		// Canonicalize: first letter upper case
-		// and upper case after each dash.
-		// (Host, User-Agent, If-Modified-Since).
-		// MIME headers are ASCII only, so no Unicode issues.
-		if upper && 'a' <= c && c <= 'z' {
-			c -= toLower
-		} else if !upper && 'A' <= c && c <= 'Z' {
-			c += toLower
-		}
-		a[i] = c
-		upper = c == '-' // for next time
-	}
-	// The compiler recognizes m[string(byteSlice)] as a special
-	// case, so a copy of a's bytes into a new string does not
-	// happen in this map lookup:
-	if v := commonHeader[string(a)]; v != "" {
-		return v
-	}
-	return string(a)
-}
-
-// commonHeader interns common header strings.
-var commonHeader = make(map[string]string)
-
-func init() {
-	for _, v := range []string{
-		"Accept",
-		"Accept-Charset",
-		"Accept-Encoding",
-		"Accept-Language",
-		"Accept-Ranges",
-		"Cache-Control",
-		"Cc",
-		"Connection",
-		"Content-Id",
-		"Content-Language",
-		"Content-Length",
-		"Content-Transfer-Encoding",
-		"Content-Type",
-		"Cookie",
-		"Date",
-		"Dkim-Signature",
-		"Etag",
-		"Expires",
-		"From",
-		"Host",
-		"If-Modified-Since",
-		"If-None-Match",
-		"In-Reply-To",
-		"Last-Modified",
-		"Location",
-		"Message-Id",
-		"Mime-Version",
-		"Pragma",
-		"Received",
-		"Return-Path",
-		"Server",
-		"Set-Cookie",
-		"Subject",
-		"To",
-		"User-Agent",
-		"Via",
-		"X-Forwarded-For",
-		"X-Imforwards",
-		"X-Powered-By",
-	} {
-		commonHeader[v] = v
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/textproto/reader_test.go b/third_party/gofrontend/libgo/go/net/textproto/reader_test.go
deleted file mode 100644
index 91550f7..0000000
--- a/third_party/gofrontend/libgo/go/net/textproto/reader_test.go
+++ /dev/null
@@ -1,350 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package textproto
-
-import (
-	"bufio"
-	"bytes"
-	"io"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-type canonicalHeaderKeyTest struct {
-	in, out string
-}
-
-var canonicalHeaderKeyTests = []canonicalHeaderKeyTest{
-	{"a-b-c", "A-B-C"},
-	{"a-1-c", "A-1-C"},
-	{"User-Agent", "User-Agent"},
-	{"uSER-aGENT", "User-Agent"},
-	{"user-agent", "User-Agent"},
-	{"USER-AGENT", "User-Agent"},
-
-	// Non-ASCII or anything with spaces or non-token chars is unchanged:
-	{"üser-agenT", "üser-agenT"},
-	{"a B", "a B"},
-
-	// This caused a panic due to mishandling of a space:
-	{"C Ontent-Transfer-Encoding", "C Ontent-Transfer-Encoding"},
-	{"foo bar", "foo bar"},
-}
-
-func TestCanonicalMIMEHeaderKey(t *testing.T) {
-	for _, tt := range canonicalHeaderKeyTests {
-		if s := CanonicalMIMEHeaderKey(tt.in); s != tt.out {
-			t.Errorf("CanonicalMIMEHeaderKey(%q) = %q, want %q", tt.in, s, tt.out)
-		}
-	}
-}
-
-func reader(s string) *Reader {
-	return NewReader(bufio.NewReader(strings.NewReader(s)))
-}
-
-func TestReadLine(t *testing.T) {
-	r := reader("line1\nline2\n")
-	s, err := r.ReadLine()
-	if s != "line1" || err != nil {
-		t.Fatalf("Line 1: %s, %v", s, err)
-	}
-	s, err = r.ReadLine()
-	if s != "line2" || err != nil {
-		t.Fatalf("Line 2: %s, %v", s, err)
-	}
-	s, err = r.ReadLine()
-	if s != "" || err != io.EOF {
-		t.Fatalf("EOF: %s, %v", s, err)
-	}
-}
-
-func TestReadContinuedLine(t *testing.T) {
-	r := reader("line1\nline\n 2\nline3\n")
-	s, err := r.ReadContinuedLine()
-	if s != "line1" || err != nil {
-		t.Fatalf("Line 1: %s, %v", s, err)
-	}
-	s, err = r.ReadContinuedLine()
-	if s != "line 2" || err != nil {
-		t.Fatalf("Line 2: %s, %v", s, err)
-	}
-	s, err = r.ReadContinuedLine()
-	if s != "line3" || err != nil {
-		t.Fatalf("Line 3: %s, %v", s, err)
-	}
-	s, err = r.ReadContinuedLine()
-	if s != "" || err != io.EOF {
-		t.Fatalf("EOF: %s, %v", s, err)
-	}
-}
-
-func TestReadCodeLine(t *testing.T) {
-	r := reader("123 hi\n234 bye\n345 no way\n")
-	code, msg, err := r.ReadCodeLine(0)
-	if code != 123 || msg != "hi" || err != nil {
-		t.Fatalf("Line 1: %d, %s, %v", code, msg, err)
-	}
-	code, msg, err = r.ReadCodeLine(23)
-	if code != 234 || msg != "bye" || err != nil {
-		t.Fatalf("Line 2: %d, %s, %v", code, msg, err)
-	}
-	code, msg, err = r.ReadCodeLine(346)
-	if code != 345 || msg != "no way" || err == nil {
-		t.Fatalf("Line 3: %d, %s, %v", code, msg, err)
-	}
-	if e, ok := err.(*Error); !ok || e.Code != code || e.Msg != msg {
-		t.Fatalf("Line 3: wrong error %v\n", err)
-	}
-	code, msg, err = r.ReadCodeLine(1)
-	if code != 0 || msg != "" || err != io.EOF {
-		t.Fatalf("EOF: %d, %s, %v", code, msg, err)
-	}
-}
-
-func TestReadDotLines(t *testing.T) {
-	r := reader("dotlines\r\n.foo\r\n..bar\n...baz\nquux\r\n\r\n.\r\nanother\n")
-	s, err := r.ReadDotLines()
-	want := []string{"dotlines", "foo", ".bar", "..baz", "quux", ""}
-	if !reflect.DeepEqual(s, want) || err != nil {
-		t.Fatalf("ReadDotLines: %v, %v", s, err)
-	}
-
-	s, err = r.ReadDotLines()
-	want = []string{"another"}
-	if !reflect.DeepEqual(s, want) || err != io.ErrUnexpectedEOF {
-		t.Fatalf("ReadDotLines2: %v, %v", s, err)
-	}
-}
-
-func TestReadDotBytes(t *testing.T) {
-	r := reader("dotlines\r\n.foo\r\n..bar\n...baz\nquux\r\n\r\n.\r\nanot.her\r\n")
-	b, err := r.ReadDotBytes()
-	want := []byte("dotlines\nfoo\n.bar\n..baz\nquux\n\n")
-	if !reflect.DeepEqual(b, want) || err != nil {
-		t.Fatalf("ReadDotBytes: %q, %v", b, err)
-	}
-
-	b, err = r.ReadDotBytes()
-	want = []byte("anot.her\n")
-	if !reflect.DeepEqual(b, want) || err != io.ErrUnexpectedEOF {
-		t.Fatalf("ReadDotBytes2: %q, %v", b, err)
-	}
-}
-
-func TestReadMIMEHeader(t *testing.T) {
-	r := reader("my-key: Value 1  \r\nLong-key: Even \n Longer Value\r\nmy-Key: Value 2\r\n\n")
-	m, err := r.ReadMIMEHeader()
-	want := MIMEHeader{
-		"My-Key":   {"Value 1", "Value 2"},
-		"Long-Key": {"Even Longer Value"},
-	}
-	if !reflect.DeepEqual(m, want) || err != nil {
-		t.Fatalf("ReadMIMEHeader: %v, %v; want %v", m, err, want)
-	}
-}
-
-func TestReadMIMEHeaderSingle(t *testing.T) {
-	r := reader("Foo: bar\n\n")
-	m, err := r.ReadMIMEHeader()
-	want := MIMEHeader{"Foo": {"bar"}}
-	if !reflect.DeepEqual(m, want) || err != nil {
-		t.Fatalf("ReadMIMEHeader: %v, %v; want %v", m, err, want)
-	}
-}
-
-func TestReadMIMEHeaderNoKey(t *testing.T) {
-	r := reader(": bar\ntest-1: 1\n\n")
-	m, err := r.ReadMIMEHeader()
-	want := MIMEHeader{"Test-1": {"1"}}
-	if !reflect.DeepEqual(m, want) || err != nil {
-		t.Fatalf("ReadMIMEHeader: %v, %v; want %v", m, err, want)
-	}
-}
-
-func TestLargeReadMIMEHeader(t *testing.T) {
-	data := make([]byte, 16*1024)
-	for i := 0; i < len(data); i++ {
-		data[i] = 'x'
-	}
-	sdata := string(data)
-	r := reader("Cookie: " + sdata + "\r\n\n")
-	m, err := r.ReadMIMEHeader()
-	if err != nil {
-		t.Fatalf("ReadMIMEHeader: %v", err)
-	}
-	cookie := m.Get("Cookie")
-	if cookie != sdata {
-		t.Fatalf("ReadMIMEHeader: %v bytes, want %v bytes", len(cookie), len(sdata))
-	}
-}
-
-// Test that we read slightly-bogus MIME headers seen in the wild,
-// with spaces before colons, and spaces in keys.
-func TestReadMIMEHeaderNonCompliant(t *testing.T) {
-	// Invalid HTTP response header as sent by an Axis security
-	// camera: (this is handled by IE, Firefox, Chrome, curl, etc.)
-	r := reader("Foo: bar\r\n" +
-		"Content-Language: en\r\n" +
-		"SID : 0\r\n" +
-		"Audio Mode : None\r\n" +
-		"Privilege : 127\r\n\r\n")
-	m, err := r.ReadMIMEHeader()
-	want := MIMEHeader{
-		"Foo":              {"bar"},
-		"Content-Language": {"en"},
-		"Sid":              {"0"},
-		"Audio Mode":       {"None"},
-		"Privilege":        {"127"},
-	}
-	if !reflect.DeepEqual(m, want) || err != nil {
-		t.Fatalf("ReadMIMEHeader =\n%v, %v; want:\n%v", m, err, want)
-	}
-}
-
-type readResponseTest struct {
-	in       string
-	inCode   int
-	wantCode int
-	wantMsg  string
-}
-
-var readResponseTests = []readResponseTest{
-	{"230-Anonymous access granted, restrictions apply\n" +
-		"Read the file README.txt,\n" +
-		"230  please",
-		23,
-		230,
-		"Anonymous access granted, restrictions apply\nRead the file README.txt,\n please",
-	},
-
-	{"230 Anonymous access granted, restrictions apply\n",
-		23,
-		230,
-		"Anonymous access granted, restrictions apply",
-	},
-
-	{"400-A\n400-B\n400 C",
-		4,
-		400,
-		"A\nB\nC",
-	},
-
-	{"400-A\r\n400-B\r\n400 C\r\n",
-		4,
-		400,
-		"A\nB\nC",
-	},
-}
-
-// See http://www.ietf.org/rfc/rfc959.txt page 36.
-func TestRFC959Lines(t *testing.T) {
-	for i, tt := range readResponseTests {
-		r := reader(tt.in + "\nFOLLOWING DATA")
-		code, msg, err := r.ReadResponse(tt.inCode)
-		if err != nil {
-			t.Errorf("#%d: ReadResponse: %v", i, err)
-			continue
-		}
-		if code != tt.wantCode {
-			t.Errorf("#%d: code=%d, want %d", i, code, tt.wantCode)
-		}
-		if msg != tt.wantMsg {
-			t.Errorf("#%d: msg=%q, want %q", i, msg, tt.wantMsg)
-		}
-	}
-}
-
-func TestCommonHeaders(t *testing.T) {
-	for h := range commonHeader {
-		if h != CanonicalMIMEHeaderKey(h) {
-			t.Errorf("Non-canonical header %q in commonHeader", h)
-		}
-	}
-	t.Skip("gccgo escape analysis")
-	b := []byte("content-Length")
-	want := "Content-Length"
-	n := testing.AllocsPerRun(200, func() {
-		if x := canonicalMIMEHeaderKey(b); x != want {
-			t.Fatalf("canonicalMIMEHeaderKey(%q) = %q; want %q", b, x, want)
-		}
-	})
-	if n > 0 {
-		t.Errorf("canonicalMIMEHeaderKey allocs = %v; want 0", n)
-	}
-}
-
-var clientHeaders = strings.Replace(`Host: golang.org
-Connection: keep-alive
-Cache-Control: max-age=0
-Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
-User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3
-Accept-Encoding: gzip,deflate,sdch
-Accept-Language: en-US,en;q=0.8,fr-CH;q=0.6
-Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
-COOKIE: __utma=000000000.0000000000.0000000000.0000000000.0000000000.00; __utmb=000000000.0.00.0000000000; __utmc=000000000; __utmz=000000000.0000000000.00.0.utmcsr=code.google.com|utmccn=(referral)|utmcmd=referral|utmcct=/p/go/issues/detail
-Non-Interned: test
-
-`, "\n", "\r\n", -1)
-
-var serverHeaders = strings.Replace(`Content-Type: text/html; charset=utf-8
-Content-Encoding: gzip
-Date: Thu, 27 Sep 2012 09:03:33 GMT
-Server: Google Frontend
-Cache-Control: private
-Content-Length: 2298
-VIA: 1.1 proxy.example.com:80 (XXX/n.n.n-nnn)
-Connection: Close
-Non-Interned: test
-
-`, "\n", "\r\n", -1)
-
-func BenchmarkReadMIMEHeader(b *testing.B) {
-	b.ReportAllocs()
-	var buf bytes.Buffer
-	br := bufio.NewReader(&buf)
-	r := NewReader(br)
-	for i := 0; i < b.N; i++ {
-		var want int
-		var find string
-		if (i & 1) == 1 {
-			buf.WriteString(clientHeaders)
-			want = 10
-			find = "Cookie"
-		} else {
-			buf.WriteString(serverHeaders)
-			want = 9
-			find = "Via"
-		}
-		h, err := r.ReadMIMEHeader()
-		if err != nil {
-			b.Fatal(err)
-		}
-		if len(h) != want {
-			b.Fatalf("wrong number of headers: got %d, want %d", len(h), want)
-		}
-		if _, ok := h[find]; !ok {
-			b.Fatalf("did not find key %s", find)
-		}
-	}
-}
-
-func BenchmarkUncommon(b *testing.B) {
-	b.ReportAllocs()
-	var buf bytes.Buffer
-	br := bufio.NewReader(&buf)
-	r := NewReader(br)
-	for i := 0; i < b.N; i++ {
-		buf.WriteString("uncommon-header-for-benchmark: foo\r\n\r\n")
-		h, err := r.ReadMIMEHeader()
-		if err != nil {
-			b.Fatal(err)
-		}
-		if _, ok := h["Uncommon-Header-For-Benchmark"]; !ok {
-			b.Fatal("Missing result header.")
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/textproto/textproto.go b/third_party/gofrontend/libgo/go/net/textproto/textproto.go
deleted file mode 100644
index 026eb02..0000000
--- a/third_party/gofrontend/libgo/go/net/textproto/textproto.go
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package textproto implements generic support for text-based request/response
-// protocols in the style of HTTP, NNTP, and SMTP.
-//
-// The package provides:
-//
-// Error, which represents a numeric error response from
-// a server.
-//
-// Pipeline, to manage pipelined requests and responses
-// in a client.
-//
-// Reader, to read numeric response code lines,
-// key: value headers, lines wrapped with leading spaces
-// on continuation lines, and whole text blocks ending
-// with a dot on a line by itself.
-//
-// Writer, to write dot-encoded text blocks.
-//
-// Conn, a convenient packaging of Reader, Writer, and Pipeline for use
-// with a single network connection.
-//
-package textproto
-
-import (
-	"bufio"
-	"fmt"
-	"io"
-	"net"
-)
-
-// An Error represents a numeric error response from a server.
-type Error struct {
-	Code int
-	Msg  string
-}
-
-func (e *Error) Error() string {
-	return fmt.Sprintf("%03d %s", e.Code, e.Msg)
-}
-
-// A ProtocolError describes a protocol violation such
-// as an invalid response or a hung-up connection.
-type ProtocolError string
-
-func (p ProtocolError) Error() string {
-	return string(p)
-}
-
-// A Conn represents a textual network protocol connection.
-// It consists of a Reader and Writer to manage I/O
-// and a Pipeline to sequence concurrent requests on the connection.
-// These embedded types carry methods with them;
-// see the documentation of those types for details.
-type Conn struct {
-	Reader
-	Writer
-	Pipeline
-	conn io.ReadWriteCloser
-}
-
-// NewConn returns a new Conn using conn for I/O.
-func NewConn(conn io.ReadWriteCloser) *Conn {
-	return &Conn{
-		Reader: Reader{R: bufio.NewReader(conn)},
-		Writer: Writer{W: bufio.NewWriter(conn)},
-		conn:   conn,
-	}
-}
-
-// Close closes the connection.
-func (c *Conn) Close() error {
-	return c.conn.Close()
-}
-
-// Dial connects to the given address on the given network using net.Dial
-// and then returns a new Conn for the connection.
-func Dial(network, addr string) (*Conn, error) {
-	c, err := net.Dial(network, addr)
-	if err != nil {
-		return nil, err
-	}
-	return NewConn(c), nil
-}
-
-// Cmd is a convenience method that sends a command after
-// waiting its turn in the pipeline.  The command text is the
-// result of formatting format with args and appending \r\n.
-// Cmd returns the id of the command, for use with StartResponse and EndResponse.
-//
-// For example, a client might run a HELP command that returns a dot-body
-// by using:
-//
-//	id, err := c.Cmd("HELP")
-//	if err != nil {
-//		return nil, err
-//	}
-//
-//	c.StartResponse(id)
-//	defer c.EndResponse(id)
-//
-//	if _, _, err = c.ReadCodeLine(110); err != nil {
-//		return nil, err
-//	}
-//	text, err := c.ReadDotBytes()
-//	if err != nil {
-//		return nil, err
-//	}
-//	return c.ReadCodeLine(250)
-//
-func (c *Conn) Cmd(format string, args ...interface{}) (id uint, err error) {
-	id = c.Next()
-	c.StartRequest(id)
-	err = c.PrintfLine(format, args...)
-	c.EndRequest(id)
-	if err != nil {
-		return 0, err
-	}
-	return id, nil
-}
-
-// TrimString returns s without leading and trailing ASCII space.
-func TrimString(s string) string {
-	for len(s) > 0 && isASCIISpace(s[0]) {
-		s = s[1:]
-	}
-	for len(s) > 0 && isASCIISpace(s[len(s)-1]) {
-		s = s[:len(s)-1]
-	}
-	return s
-}
-
-// TrimBytes returns b without leading and trailing ASCII space.
-func TrimBytes(b []byte) []byte {
-	for len(b) > 0 && isASCIISpace(b[0]) {
-		b = b[1:]
-	}
-	for len(b) > 0 && isASCIISpace(b[len(b)-1]) {
-		b = b[:len(b)-1]
-	}
-	return b
-}
-
-func isASCIISpace(b byte) bool {
-	return b == ' ' || b == '\t' || b == '\n' || b == '\r'
-}
-
-func isASCIILetter(b byte) bool {
-	b |= 0x20 // make lower case
-	return 'a' <= b && b <= 'z'
-}
diff --git a/third_party/gofrontend/libgo/go/net/textproto/writer.go b/third_party/gofrontend/libgo/go/net/textproto/writer.go
deleted file mode 100644
index 03e2fd6..0000000
--- a/third_party/gofrontend/libgo/go/net/textproto/writer.go
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package textproto
-
-import (
-	"bufio"
-	"fmt"
-	"io"
-)
-
-// A Writer implements convenience methods for writing
-// requests or responses to a text protocol network connection.
-type Writer struct {
-	W   *bufio.Writer
-	dot *dotWriter
-}
-
-// NewWriter returns a new Writer writing to w.
-func NewWriter(w *bufio.Writer) *Writer {
-	return &Writer{W: w}
-}
-
-var crnl = []byte{'\r', '\n'}
-var dotcrnl = []byte{'.', '\r', '\n'}
-
-// PrintfLine writes the formatted output followed by \r\n.
-func (w *Writer) PrintfLine(format string, args ...interface{}) error {
-	w.closeDot()
-	fmt.Fprintf(w.W, format, args...)
-	w.W.Write(crnl)
-	return w.W.Flush()
-}
-
-// DotWriter returns a writer that can be used to write a dot-encoding to w.
-// It takes care of inserting leading dots when necessary,
-// translating line-ending \n into \r\n, and adding the final .\r\n line
-// when the DotWriter is closed.  The caller should close the
-// DotWriter before the next call to a method on w.
-//
-// See the documentation for Reader's DotReader method for details about dot-encoding.
-func (w *Writer) DotWriter() io.WriteCloser {
-	w.closeDot()
-	w.dot = &dotWriter{w: w}
-	return w.dot
-}
-
-func (w *Writer) closeDot() {
-	if w.dot != nil {
-		w.dot.Close() // sets w.dot = nil
-	}
-}
-
-type dotWriter struct {
-	w     *Writer
-	state int
-}
-
-const (
-	wstateBeginLine = iota // beginning of line; initial state; must be zero
-	wstateCR               // wrote \r (possibly at end of line)
-	wstateData             // writing data in middle of line
-)
-
-func (d *dotWriter) Write(b []byte) (n int, err error) {
-	bw := d.w.W
-	for n < len(b) {
-		c := b[n]
-		switch d.state {
-		case wstateBeginLine:
-			d.state = wstateData
-			if c == '.' {
-				// escape leading dot
-				bw.WriteByte('.')
-			}
-			fallthrough
-
-		case wstateData:
-			if c == '\r' {
-				d.state = wstateCR
-			}
-			if c == '\n' {
-				bw.WriteByte('\r')
-				d.state = wstateBeginLine
-			}
-
-		case wstateCR:
-			d.state = wstateData
-			if c == '\n' {
-				d.state = wstateBeginLine
-			}
-		}
-		if err = bw.WriteByte(c); err != nil {
-			break
-		}
-		n++
-	}
-	return
-}
-
-func (d *dotWriter) Close() error {
-	if d.w.dot == d {
-		d.w.dot = nil
-	}
-	bw := d.w.W
-	switch d.state {
-	default:
-		bw.WriteByte('\r')
-		fallthrough
-	case wstateCR:
-		bw.WriteByte('\n')
-		fallthrough
-	case wstateBeginLine:
-		bw.Write(dotcrnl)
-	}
-	return bw.Flush()
-}
diff --git a/third_party/gofrontend/libgo/go/net/textproto/writer_test.go b/third_party/gofrontend/libgo/go/net/textproto/writer_test.go
deleted file mode 100644
index e03ab5e..0000000
--- a/third_party/gofrontend/libgo/go/net/textproto/writer_test.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package textproto
-
-import (
-	"bufio"
-	"bytes"
-	"testing"
-)
-
-func TestPrintfLine(t *testing.T) {
-	var buf bytes.Buffer
-	w := NewWriter(bufio.NewWriter(&buf))
-	err := w.PrintfLine("foo %d", 123)
-	if s := buf.String(); s != "foo 123\r\n" || err != nil {
-		t.Fatalf("s=%q; err=%s", s, err)
-	}
-}
-
-func TestDotWriter(t *testing.T) {
-	var buf bytes.Buffer
-	w := NewWriter(bufio.NewWriter(&buf))
-	d := w.DotWriter()
-	n, err := d.Write([]byte("abc\n.def\n..ghi\n.jkl\n."))
-	if n != 21 || err != nil {
-		t.Fatalf("Write: %d, %s", n, err)
-	}
-	d.Close()
-	want := "abc\r\n..def\r\n...ghi\r\n..jkl\r\n..\r\n.\r\n"
-	if s := buf.String(); s != want {
-		t.Fatalf("wrote %q", s)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/timeout_test.go b/third_party/gofrontend/libgo/go/net/timeout_test.go
deleted file mode 100644
index ca94e24..0000000
--- a/third_party/gofrontend/libgo/go/net/timeout_test.go
+++ /dev/null
@@ -1,1010 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net/internal/socktest"
-	"runtime"
-	"sync"
-	"testing"
-	"time"
-)
-
-var dialTimeoutTests = []struct {
-	timeout time.Duration
-	delta   time.Duration // for deadline
-
-	guard time.Duration
-	max   time.Duration
-}{
-	// Tests that dial timeouts, deadlines in the past work.
-	{-5 * time.Second, 0, -5 * time.Second, 100 * time.Millisecond},
-	{0, -5 * time.Second, -5 * time.Second, 100 * time.Millisecond},
-	{-5 * time.Second, 5 * time.Second, -5 * time.Second, 100 * time.Millisecond}, // timeout over deadline
-
-	{50 * time.Millisecond, 0, 100 * time.Millisecond, time.Second},
-	{0, 50 * time.Millisecond, 100 * time.Millisecond, time.Second},
-	{50 * time.Millisecond, 5 * time.Second, 100 * time.Millisecond, time.Second}, // timeout over deadline
-}
-
-func TestDialTimeout(t *testing.T) {
-	origTestHookDialChannel := testHookDialChannel
-	defer func() { testHookDialChannel = origTestHookDialChannel }()
-	defer sw.Set(socktest.FilterConnect, nil)
-
-	// Avoid tracking open-close jitterbugs between netFD and
-	// socket that leads to confusion of information inside
-	// socktest.Switch.
-	// It may happen when the Dial call bumps against TCP
-	// simultaneous open. See selfConnect in tcpsock_posix.go.
-	defer func() {
-		sw.Set(socktest.FilterClose, nil)
-		forceCloseSockets()
-	}()
-	sw.Set(socktest.FilterClose, func(so *socktest.Status) (socktest.AfterFilter, error) {
-		return nil, errTimedout
-	})
-
-	for i, tt := range dialTimeoutTests {
-		switch runtime.GOOS {
-		case "plan9", "windows":
-			testHookDialChannel = func() { time.Sleep(tt.guard) }
-			if runtime.GOOS == "plan9" {
-				break
-			}
-			fallthrough
-		default:
-			sw.Set(socktest.FilterConnect, func(so *socktest.Status) (socktest.AfterFilter, error) {
-				time.Sleep(tt.guard)
-				return nil, errTimedout
-			})
-		}
-
-		ch := make(chan error)
-		d := Dialer{Timeout: tt.timeout}
-		if tt.delta != 0 {
-			d.Deadline = time.Now().Add(tt.delta)
-		}
-		max := time.NewTimer(tt.max)
-		defer max.Stop()
-		go func() {
-			// This dial never starts to send any TCP SYN
-			// segment because of above socket filter and
-			// test hook.
-			c, err := d.Dial("tcp", "127.0.0.1:0")
-			if err == nil {
-				err = fmt.Errorf("unexpectedly established: tcp:%s->%s", c.LocalAddr(), c.RemoteAddr())
-				c.Close()
-			}
-			ch <- err
-		}()
-
-		select {
-		case <-max.C:
-			t.Fatalf("#%d: Dial didn't return in an expected time", i)
-		case err := <-ch:
-			if perr := parseDialError(err); perr != nil {
-				t.Errorf("#%d: %v", i, perr)
-			}
-			if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
-				t.Fatalf("#%d: %v", i, err)
-			}
-		}
-	}
-}
-
-var acceptTimeoutTests = []struct {
-	timeout time.Duration
-	xerrs   [2]error // expected errors in transition
-}{
-	// Tests that accept deadlines in the past work, even if
-	// there's incoming connections available.
-	{-5 * time.Second, [2]error{errTimeout, errTimeout}},
-
-	{50 * time.Millisecond, [2]error{nil, errTimeout}},
-}
-
-func TestAcceptTimeout(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	ln, err := newLocalListener("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-
-	for i, tt := range acceptTimeoutTests {
-		if tt.timeout < 0 {
-			go func() {
-				c, err := Dial(ln.Addr().Network(), ln.Addr().String())
-				if err != nil {
-					t.Error(err)
-					return
-				}
-				var b [1]byte
-				c.Read(b[:])
-				c.Close()
-			}()
-		}
-
-		if err := ln.(*TCPListener).SetDeadline(time.Now().Add(tt.timeout)); err != nil {
-			t.Fatalf("$%d: %v", i, err)
-		}
-		for j, xerr := range tt.xerrs {
-			for {
-				c, err := ln.Accept()
-				if xerr != nil {
-					if perr := parseAcceptError(err); perr != nil {
-						t.Errorf("#%d/%d: %v", i, j, perr)
-					}
-					if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
-						t.Fatalf("#%d/%d: %v", i, j, err)
-					}
-				}
-				if err == nil {
-					c.Close()
-					time.Sleep(tt.timeout / 3)
-					continue
-				}
-				break
-			}
-		}
-	}
-}
-
-func TestAcceptTimeoutMustReturn(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	ln, err := newLocalListener("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-
-	max := time.NewTimer(time.Second)
-	defer max.Stop()
-	ch := make(chan error)
-	go func() {
-		if err := ln.(*TCPListener).SetDeadline(noDeadline); err != nil {
-			t.Error(err)
-		}
-		if err := ln.(*TCPListener).SetDeadline(time.Now().Add(10 * time.Millisecond)); err != nil {
-			t.Error(err)
-		}
-		c, err := ln.Accept()
-		if err == nil {
-			c.Close()
-		}
-		ch <- err
-	}()
-
-	select {
-	case <-max.C:
-		ln.Close()
-		<-ch // wait for tester goroutine to stop
-		t.Fatal("Accept didn't return in an expected time")
-	case err := <-ch:
-		if perr := parseAcceptError(err); perr != nil {
-			t.Error(perr)
-		}
-		if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
-			t.Fatal(err)
-		}
-	}
-}
-
-func TestAcceptTimeoutMustNotReturn(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	ln, err := newLocalListener("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-
-	max := time.NewTimer(100 * time.Millisecond)
-	defer max.Stop()
-	ch := make(chan error)
-	go func() {
-		if err := ln.(*TCPListener).SetDeadline(time.Now().Add(-5 * time.Second)); err != nil {
-			t.Error(err)
-		}
-		if err := ln.(*TCPListener).SetDeadline(noDeadline); err != nil {
-			t.Error(err)
-		}
-		_, err := ln.Accept()
-		ch <- err
-	}()
-
-	select {
-	case err := <-ch:
-		if perr := parseAcceptError(err); perr != nil {
-			t.Error(perr)
-		}
-		t.Fatalf("expected Accept to not return, but it returned with %v", err)
-	case <-max.C:
-		ln.Close()
-		<-ch // wait for tester goroutine to stop
-	}
-}
-
-var readTimeoutTests = []struct {
-	timeout time.Duration
-	xerrs   [2]error // expected errors in transition
-}{
-	// Tests that read deadlines work, even if there's data ready
-	// to be read.
-	{-5 * time.Second, [2]error{errTimeout, errTimeout}},
-
-	{50 * time.Millisecond, [2]error{nil, errTimeout}},
-}
-
-func TestReadTimeout(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	handler := func(ls *localServer, ln Listener) {
-		c, err := ln.Accept()
-		if err != nil {
-			t.Error(err)
-			return
-		}
-		c.Write([]byte("READ TIMEOUT TEST"))
-		defer c.Close()
-	}
-	ls, err := newLocalServer("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ls.teardown()
-	if err := ls.buildup(handler); err != nil {
-		t.Fatal(err)
-	}
-
-	c, err := Dial(ls.Listener.Addr().Network(), ls.Listener.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	for i, tt := range readTimeoutTests {
-		if err := c.SetReadDeadline(time.Now().Add(tt.timeout)); err != nil {
-			t.Fatalf("#%d: %v", i, err)
-		}
-		var b [1]byte
-		for j, xerr := range tt.xerrs {
-			for {
-				n, err := c.Read(b[:])
-				if xerr != nil {
-					if perr := parseReadError(err); perr != nil {
-						t.Errorf("#%d/%d: %v", i, j, perr)
-					}
-					if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
-						t.Fatalf("#%d/%d: %v", i, j, err)
-					}
-				}
-				if err == nil {
-					time.Sleep(tt.timeout / 3)
-					continue
-				}
-				if n != 0 {
-					t.Fatalf("#%d/%d: read %d; want 0", i, j, n)
-				}
-				break
-			}
-		}
-	}
-}
-
-func TestReadTimeoutMustNotReturn(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	ln, err := newLocalListener("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-
-	c, err := Dial(ln.Addr().Network(), ln.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	max := time.NewTimer(100 * time.Millisecond)
-	defer max.Stop()
-	ch := make(chan error)
-	go func() {
-		if err := c.SetDeadline(time.Now().Add(-5 * time.Second)); err != nil {
-			t.Error(err)
-		}
-		if err := c.SetWriteDeadline(time.Now().Add(-5 * time.Second)); err != nil {
-			t.Error(err)
-		}
-		if err := c.SetReadDeadline(noDeadline); err != nil {
-			t.Error(err)
-		}
-		var b [1]byte
-		_, err := c.Read(b[:])
-		ch <- err
-	}()
-
-	select {
-	case err := <-ch:
-		if perr := parseReadError(err); perr != nil {
-			t.Error(perr)
-		}
-		t.Fatalf("expected Read to not return, but it returned with %v", err)
-	case <-max.C:
-		c.Close()
-		err := <-ch // wait for tester goroutine to stop
-		if perr := parseReadError(err); perr != nil {
-			t.Error(perr)
-		}
-		if err == io.EOF && runtime.GOOS == "nacl" { // see golang.org/issue/8044
-			return
-		}
-		if nerr, ok := err.(Error); !ok || nerr.Timeout() || nerr.Temporary() {
-			t.Fatal(err)
-		}
-	}
-}
-
-var readFromTimeoutTests = []struct {
-	timeout time.Duration
-	xerrs   [2]error // expected errors in transition
-}{
-	// Tests that read deadlines work, even if there's data ready
-	// to be read.
-	{-5 * time.Second, [2]error{errTimeout, errTimeout}},
-
-	{50 * time.Millisecond, [2]error{nil, errTimeout}},
-}
-
-func TestReadFromTimeout(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS) // see golang.org/issue/8916
-	}
-
-	ch := make(chan Addr)
-	defer close(ch)
-	handler := func(ls *localPacketServer, c PacketConn) {
-		if dst, ok := <-ch; ok {
-			c.WriteTo([]byte("READFROM TIMEOUT TEST"), dst)
-		}
-	}
-	ls, err := newLocalPacketServer("udp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ls.teardown()
-	if err := ls.buildup(handler); err != nil {
-		t.Fatal(err)
-	}
-
-	host, _, err := SplitHostPort(ls.PacketConn.LocalAddr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	c, err := ListenPacket(ls.PacketConn.LocalAddr().Network(), JoinHostPort(host, "0"))
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-	ch <- c.LocalAddr()
-
-	for i, tt := range readFromTimeoutTests {
-		if err := c.SetReadDeadline(time.Now().Add(tt.timeout)); err != nil {
-			t.Fatalf("#%d: %v", i, err)
-		}
-		var b [1]byte
-		for j, xerr := range tt.xerrs {
-			for {
-				n, _, err := c.ReadFrom(b[:])
-				if xerr != nil {
-					if perr := parseReadError(err); perr != nil {
-						t.Errorf("#%d/%d: %v", i, j, perr)
-					}
-					if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
-						t.Fatalf("#%d/%d: %v", i, j, err)
-					}
-				}
-				if err == nil {
-					time.Sleep(tt.timeout / 3)
-					continue
-				}
-				if n != 0 {
-					t.Fatalf("#%d/%d: read %d; want 0", i, j, n)
-				}
-				break
-			}
-		}
-	}
-}
-
-var writeTimeoutTests = []struct {
-	timeout time.Duration
-	xerrs   [2]error // expected errors in transition
-}{
-	// Tests that write deadlines work, even if there's buffer
-	// space available to write.
-	{-5 * time.Second, [2]error{errTimeout, errTimeout}},
-
-	{10 * time.Millisecond, [2]error{nil, errTimeout}},
-}
-
-func TestWriteTimeout(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	ln, err := newLocalListener("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-
-	for i, tt := range writeTimeoutTests {
-		c, err := Dial(ln.Addr().Network(), ln.Addr().String())
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer c.Close()
-
-		if err := c.SetWriteDeadline(time.Now().Add(tt.timeout)); err != nil {
-			t.Fatalf("#%d: %v", i, err)
-		}
-		for j, xerr := range tt.xerrs {
-			for {
-				n, err := c.Write([]byte("WRITE TIMEOUT TEST"))
-				if xerr != nil {
-					if perr := parseWriteError(err); perr != nil {
-						t.Errorf("#%d/%d: %v", i, j, perr)
-					}
-					if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
-						t.Fatalf("#%d/%d: %v", i, j, err)
-					}
-				}
-				if err == nil {
-					time.Sleep(tt.timeout / 3)
-					continue
-				}
-				if n != 0 {
-					t.Fatalf("#%d/%d: wrote %d; want 0", i, j, n)
-				}
-				break
-			}
-		}
-	}
-}
-
-func TestWriteTimeoutMustNotReturn(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	ln, err := newLocalListener("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-
-	c, err := Dial(ln.Addr().Network(), ln.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	max := time.NewTimer(100 * time.Millisecond)
-	defer max.Stop()
-	ch := make(chan error)
-	go func() {
-		if err := c.SetDeadline(time.Now().Add(-5 * time.Second)); err != nil {
-			t.Error(err)
-		}
-		if err := c.SetReadDeadline(time.Now().Add(-5 * time.Second)); err != nil {
-			t.Error(err)
-		}
-		if err := c.SetWriteDeadline(noDeadline); err != nil {
-			t.Error(err)
-		}
-		var b [1]byte
-		for {
-			if _, err := c.Write(b[:]); err != nil {
-				ch <- err
-				break
-			}
-		}
-	}()
-
-	select {
-	case err := <-ch:
-		if perr := parseWriteError(err); perr != nil {
-			t.Error(perr)
-		}
-		t.Fatalf("expected Write to not return, but it returned with %v", err)
-	case <-max.C:
-		c.Close()
-		err := <-ch // wait for tester goroutine to stop
-		if perr := parseWriteError(err); perr != nil {
-			t.Error(perr)
-		}
-		if nerr, ok := err.(Error); !ok || nerr.Timeout() || nerr.Temporary() {
-			t.Fatal(err)
-		}
-	}
-}
-
-var writeToTimeoutTests = []struct {
-	timeout time.Duration
-	xerrs   [2]error // expected errors in transition
-}{
-	// Tests that write deadlines work, even if there's buffer
-	// space available to write.
-	{-5 * time.Second, [2]error{errTimeout, errTimeout}},
-
-	{10 * time.Millisecond, [2]error{nil, errTimeout}},
-}
-
-func TestWriteToTimeout(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	c1, err := newLocalPacketListener("udp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c1.Close()
-
-	host, _, err := SplitHostPort(c1.LocalAddr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	for i, tt := range writeToTimeoutTests {
-		c2, err := ListenPacket(c1.LocalAddr().Network(), JoinHostPort(host, "0"))
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer c2.Close()
-
-		if err := c2.SetWriteDeadline(time.Now().Add(tt.timeout)); err != nil {
-			t.Fatalf("#%d: %v", i, err)
-		}
-		for j, xerr := range tt.xerrs {
-			for {
-				n, err := c2.WriteTo([]byte("WRITETO TIMEOUT TEST"), c1.LocalAddr())
-				if xerr != nil {
-					if perr := parseWriteError(err); perr != nil {
-						t.Errorf("#%d/%d: %v", i, j, perr)
-					}
-					if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
-						t.Fatalf("#%d/%d: %v", i, j, err)
-					}
-				}
-				if err == nil {
-					time.Sleep(tt.timeout / 3)
-					continue
-				}
-				if n != 0 {
-					t.Fatalf("#%d/%d: wrote %d; want 0", i, j, n)
-				}
-				break
-			}
-		}
-	}
-}
-
-func TestReadTimeoutFluctuation(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	ln, err := newLocalListener("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-
-	c, err := Dial(ln.Addr().Network(), ln.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	max := time.NewTimer(time.Second)
-	defer max.Stop()
-	ch := make(chan error)
-	go timeoutReceiver(c, 100*time.Millisecond, 50*time.Millisecond, 250*time.Millisecond, ch)
-
-	select {
-	case <-max.C:
-		t.Fatal("Read took over 1s; expected 0.1s")
-	case err := <-ch:
-		if perr := parseReadError(err); perr != nil {
-			t.Error(perr)
-		}
-		if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
-			t.Fatal(err)
-		}
-	}
-}
-
-func TestReadFromTimeoutFluctuation(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	c1, err := newLocalPacketListener("udp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c1.Close()
-
-	c2, err := Dial(c1.LocalAddr().Network(), c1.LocalAddr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c2.Close()
-
-	max := time.NewTimer(time.Second)
-	defer max.Stop()
-	ch := make(chan error)
-	go timeoutPacketReceiver(c2.(PacketConn), 100*time.Millisecond, 50*time.Millisecond, 250*time.Millisecond, ch)
-
-	select {
-	case <-max.C:
-		t.Fatal("ReadFrom took over 1s; expected 0.1s")
-	case err := <-ch:
-		if perr := parseReadError(err); perr != nil {
-			t.Error(perr)
-		}
-		if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
-			t.Fatal(err)
-		}
-	}
-}
-
-func TestWriteTimeoutFluctuation(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	ln, err := newLocalListener("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-
-	c, err := Dial(ln.Addr().Network(), ln.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	d := time.Second
-	if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
-		d = 3 * time.Second // see golang.org/issue/10775
-	}
-	max := time.NewTimer(d)
-	defer max.Stop()
-	ch := make(chan error)
-	go timeoutTransmitter(c, 100*time.Millisecond, 50*time.Millisecond, 250*time.Millisecond, ch)
-
-	select {
-	case <-max.C:
-		t.Fatalf("Write took over %v; expected 0.1s", d)
-	case err := <-ch:
-		if perr := parseWriteError(err); perr != nil {
-			t.Error(perr)
-		}
-		if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
-			t.Fatal(err)
-		}
-	}
-}
-
-func TestVariousDeadlines1Proc(t *testing.T) {
-	testVariousDeadlines(t, 1)
-}
-
-func TestVariousDeadlines4Proc(t *testing.T) {
-	testVariousDeadlines(t, 4)
-}
-
-type neverEnding byte
-
-func (b neverEnding) Read(p []byte) (int, error) {
-	for i := range p {
-		p[i] = byte(b)
-	}
-	return len(p), nil
-}
-
-func testVariousDeadlines(t *testing.T, maxProcs int) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(maxProcs))
-
-	type result struct {
-		n   int64
-		err error
-		d   time.Duration
-	}
-
-	ch := make(chan error, 1)
-	pasvch := make(chan result)
-	handler := func(ls *localServer, ln Listener) {
-		for {
-			c, err := ln.Accept()
-			if err != nil {
-				ch <- err
-				return
-			}
-			// The server, with no timeouts of its own,
-			// sending bytes to clients as fast as it can.
-			go func() {
-				t0 := time.Now()
-				n, err := io.Copy(c, neverEnding('a'))
-				dt := time.Since(t0)
-				c.Close()
-				pasvch <- result{n, err, dt}
-			}()
-		}
-	}
-	ls, err := newLocalServer("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ls.teardown()
-	if err := ls.buildup(handler); err != nil {
-		t.Fatal(err)
-	}
-
-	for _, timeout := range []time.Duration{
-		1 * time.Nanosecond,
-		2 * time.Nanosecond,
-		5 * time.Nanosecond,
-		50 * time.Nanosecond,
-		100 * time.Nanosecond,
-		200 * time.Nanosecond,
-		500 * time.Nanosecond,
-		750 * time.Nanosecond,
-		1 * time.Microsecond,
-		5 * time.Microsecond,
-		25 * time.Microsecond,
-		250 * time.Microsecond,
-		500 * time.Microsecond,
-		1 * time.Millisecond,
-		5 * time.Millisecond,
-		100 * time.Millisecond,
-		250 * time.Millisecond,
-		500 * time.Millisecond,
-		1 * time.Second,
-	} {
-		numRuns := 3
-		if testing.Short() {
-			numRuns = 1
-			if timeout > 500*time.Microsecond {
-				continue
-			}
-		}
-		for run := 0; run < numRuns; run++ {
-			name := fmt.Sprintf("%v run %d/%d", timeout, run+1, numRuns)
-			t.Log(name)
-
-			c, err := Dial(ls.Listener.Addr().Network(), ls.Listener.Addr().String())
-			if err != nil {
-				t.Fatal(err)
-			}
-
-			tooLong := 5 * time.Second
-			max := time.NewTimer(tooLong)
-			defer max.Stop()
-			actvch := make(chan result)
-			go func() {
-				t0 := time.Now()
-				if err := c.SetDeadline(t0.Add(timeout)); err != nil {
-					t.Error(err)
-				}
-				n, err := io.Copy(ioutil.Discard, c)
-				dt := time.Since(t0)
-				c.Close()
-				actvch <- result{n, err, dt}
-			}()
-
-			select {
-			case res := <-actvch:
-				if nerr, ok := res.err.(Error); ok && nerr.Timeout() {
-					t.Logf("for %v, good client timeout after %v, reading %d bytes", name, res.d, res.n)
-				} else {
-					t.Fatalf("for %v, client Copy = %d, %v; want timeout", name, res.n, res.err)
-				}
-			case <-max.C:
-				t.Fatalf("for %v, timeout (%v) waiting for client to timeout (%v) reading", name, tooLong, timeout)
-			}
-
-			select {
-			case res := <-pasvch:
-				t.Logf("for %v, server in %v wrote %d: %v", name, res.d, res.n, res.err)
-			case err := <-ch:
-				t.Fatalf("for %v, Accept = %v", name, err)
-			case <-max.C:
-				t.Fatalf("for %v, timeout waiting for server to finish writing", name)
-			}
-		}
-	}
-}
-
-// TestReadWriteProlongedTimeout tests concurrent deadline
-// modification. Known to cause data races in the past.
-func TestReadWriteProlongedTimeout(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	handler := func(ls *localServer, ln Listener) {
-		c, err := ln.Accept()
-		if err != nil {
-			t.Error(err)
-			return
-		}
-		defer c.Close()
-
-		var wg sync.WaitGroup
-		wg.Add(2)
-		go func() {
-			defer wg.Done()
-			var b [1]byte
-			for {
-				if err := c.SetReadDeadline(time.Now().Add(time.Hour)); err != nil {
-					if perr := parseCommonError(err); perr != nil {
-						t.Error(perr)
-					}
-					t.Error(err)
-					return
-				}
-				if _, err := c.Read(b[:]); err != nil {
-					if perr := parseReadError(err); perr != nil {
-						t.Error(perr)
-					}
-					return
-				}
-			}
-		}()
-		go func() {
-			defer wg.Done()
-			var b [1]byte
-			for {
-				if err := c.SetWriteDeadline(time.Now().Add(time.Hour)); err != nil {
-					if perr := parseCommonError(err); perr != nil {
-						t.Error(perr)
-					}
-					t.Error(err)
-					return
-				}
-				if _, err := c.Write(b[:]); err != nil {
-					if perr := parseWriteError(err); perr != nil {
-						t.Error(perr)
-					}
-					return
-				}
-			}
-		}()
-		wg.Wait()
-	}
-	ls, err := newLocalServer("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ls.teardown()
-	if err := ls.buildup(handler); err != nil {
-		t.Fatal(err)
-	}
-
-	c, err := Dial(ls.Listener.Addr().Network(), ls.Listener.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	var b [1]byte
-	for i := 0; i < 1000; i++ {
-		c.Write(b[:])
-		c.Read(b[:])
-	}
-}
-
-func TestReadWriteDeadlineRace(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	N := 1000
-	if testing.Short() {
-		N = 50
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
-
-	ln, err := newLocalListener("tcp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-
-	c, err := Dial(ln.Addr().Network(), ln.Addr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	var wg sync.WaitGroup
-	wg.Add(3)
-	go func() {
-		defer wg.Done()
-		tic := time.NewTicker(2 * time.Microsecond)
-		defer tic.Stop()
-		for i := 0; i < N; i++ {
-			if err := c.SetReadDeadline(time.Now().Add(2 * time.Microsecond)); err != nil {
-				if perr := parseCommonError(err); perr != nil {
-					t.Error(perr)
-				}
-				break
-			}
-			if err := c.SetWriteDeadline(time.Now().Add(2 * time.Microsecond)); err != nil {
-				if perr := parseCommonError(err); perr != nil {
-					t.Error(perr)
-				}
-				break
-			}
-			<-tic.C
-		}
-	}()
-	go func() {
-		defer wg.Done()
-		var b [1]byte
-		for i := 0; i < N; i++ {
-			c.Read(b[:]) // ignore possible timeout errors
-		}
-	}()
-	go func() {
-		defer wg.Done()
-		var b [1]byte
-		for i := 0; i < N; i++ {
-			c.Write(b[:]) // ignore possible timeout errors
-		}
-	}()
-	wg.Wait() // wait for tester goroutine to stop
-}
diff --git a/third_party/gofrontend/libgo/go/net/udp_test.go b/third_party/gofrontend/libgo/go/net/udp_test.go
deleted file mode 100644
index b25f96a..0000000
--- a/third_party/gofrontend/libgo/go/net/udp_test.go
+++ /dev/null
@@ -1,364 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"reflect"
-	"runtime"
-	"testing"
-	"time"
-)
-
-type resolveUDPAddrTest struct {
-	network       string
-	litAddrOrName string
-	addr          *UDPAddr
-	err           error
-}
-
-var resolveUDPAddrTests = []resolveUDPAddrTest{
-	{"udp", "127.0.0.1:0", &UDPAddr{IP: IPv4(127, 0, 0, 1), Port: 0}, nil},
-	{"udp4", "127.0.0.1:65535", &UDPAddr{IP: IPv4(127, 0, 0, 1), Port: 65535}, nil},
-
-	{"udp", "[::1]:0", &UDPAddr{IP: ParseIP("::1"), Port: 0}, nil},
-	{"udp6", "[::1]:65535", &UDPAddr{IP: ParseIP("::1"), Port: 65535}, nil},
-
-	{"udp", "[::1%en0]:1", &UDPAddr{IP: ParseIP("::1"), Port: 1, Zone: "en0"}, nil},
-	{"udp6", "[::1%911]:2", &UDPAddr{IP: ParseIP("::1"), Port: 2, Zone: "911"}, nil},
-
-	{"", "127.0.0.1:0", &UDPAddr{IP: IPv4(127, 0, 0, 1), Port: 0}, nil}, // Go 1.0 behavior
-	{"", "[::1]:0", &UDPAddr{IP: ParseIP("::1"), Port: 0}, nil},         // Go 1.0 behavior
-
-	{"udp", ":12345", &UDPAddr{Port: 12345}, nil},
-
-	{"http", "127.0.0.1:0", nil, UnknownNetworkError("http")},
-}
-
-func TestResolveUDPAddr(t *testing.T) {
-	origTestHookLookupIP := testHookLookupIP
-	defer func() { testHookLookupIP = origTestHookLookupIP }()
-	testHookLookupIP = lookupLocalhost
-
-	for i, tt := range resolveUDPAddrTests {
-		addr, err := ResolveUDPAddr(tt.network, tt.litAddrOrName)
-		if err != tt.err {
-			t.Errorf("#%d: %v", i, err)
-		} else if !reflect.DeepEqual(addr, tt.addr) {
-			t.Errorf("#%d: got %#v; want %#v", i, addr, tt.addr)
-		}
-		if err != nil {
-			continue
-		}
-		rtaddr, err := ResolveUDPAddr(addr.Network(), addr.String())
-		if err != nil {
-			t.Errorf("#%d: %v", i, err)
-		} else if !reflect.DeepEqual(rtaddr, addr) {
-			t.Errorf("#%d: got %#v; want %#v", i, rtaddr, addr)
-		}
-	}
-}
-
-func TestWriteToUDP(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	c, err := ListenPacket("udp", "127.0.0.1:0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	testWriteToConn(t, c.LocalAddr().String())
-	testWriteToPacketConn(t, c.LocalAddr().String())
-}
-
-func testWriteToConn(t *testing.T, raddr string) {
-	c, err := Dial("udp", raddr)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	ra, err := ResolveUDPAddr("udp", raddr)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	b := []byte("CONNECTED-MODE SOCKET")
-	_, err = c.(*UDPConn).WriteToUDP(b, ra)
-	if err == nil {
-		t.Fatal("should fail")
-	}
-	if err != nil && err.(*OpError).Err != ErrWriteToConnected {
-		t.Fatalf("should fail as ErrWriteToConnected: %v", err)
-	}
-	_, err = c.(*UDPConn).WriteTo(b, ra)
-	if err == nil {
-		t.Fatal("should fail")
-	}
-	if err != nil && err.(*OpError).Err != ErrWriteToConnected {
-		t.Fatalf("should fail as ErrWriteToConnected: %v", err)
-	}
-	_, err = c.Write(b)
-	if err != nil {
-		t.Fatal(err)
-	}
-	_, _, err = c.(*UDPConn).WriteMsgUDP(b, nil, ra)
-	if err == nil {
-		t.Fatal("should fail")
-	}
-	if err != nil && err.(*OpError).Err != ErrWriteToConnected {
-		t.Fatalf("should fail as ErrWriteToConnected: %v", err)
-	}
-	_, _, err = c.(*UDPConn).WriteMsgUDP(b, nil, nil)
-	switch runtime.GOOS {
-	case "nacl", "windows": // see golang.org/issue/9252
-		t.Skipf("not implemented yet on %s", runtime.GOOS)
-	default:
-		if err != nil {
-			t.Fatal(err)
-		}
-	}
-}
-
-func testWriteToPacketConn(t *testing.T, raddr string) {
-	c, err := ListenPacket("udp", "127.0.0.1:0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	ra, err := ResolveUDPAddr("udp", raddr)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	b := []byte("UNCONNECTED-MODE SOCKET")
-	_, err = c.(*UDPConn).WriteToUDP(b, ra)
-	if err != nil {
-		t.Fatal(err)
-	}
-	_, err = c.WriteTo(b, ra)
-	if err != nil {
-		t.Fatal(err)
-	}
-	_, err = c.(*UDPConn).Write(b)
-	if err == nil {
-		t.Fatal("should fail")
-	}
-	_, _, err = c.(*UDPConn).WriteMsgUDP(b, nil, nil)
-	if err == nil {
-		t.Fatal("should fail")
-	}
-	if err != nil && err.(*OpError).Err != errMissingAddress {
-		t.Fatalf("should fail as errMissingAddress: %v", err)
-	}
-	_, _, err = c.(*UDPConn).WriteMsgUDP(b, nil, ra)
-	switch runtime.GOOS {
-	case "nacl", "windows": // see golang.org/issue/9252
-		t.Skipf("not implemented yet on %s", runtime.GOOS)
-	default:
-		if err != nil {
-			t.Fatal(err)
-		}
-	}
-}
-
-var udpConnLocalNameTests = []struct {
-	net   string
-	laddr *UDPAddr
-}{
-	{"udp4", &UDPAddr{IP: IPv4(127, 0, 0, 1)}},
-	{"udp4", &UDPAddr{}},
-	{"udp4", nil},
-}
-
-func TestUDPConnLocalName(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-
-	for _, tt := range udpConnLocalNameTests {
-		c, err := ListenUDP(tt.net, tt.laddr)
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer c.Close()
-		la := c.LocalAddr()
-		if a, ok := la.(*UDPAddr); !ok || a.Port == 0 {
-			t.Fatalf("got %v; expected a proper address with non-zero port number", la)
-		}
-	}
-}
-
-func TestUDPConnLocalAndRemoteNames(t *testing.T) {
-	for _, laddr := range []string{"", "127.0.0.1:0"} {
-		c1, err := ListenPacket("udp", "127.0.0.1:0")
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer c1.Close()
-
-		var la *UDPAddr
-		if laddr != "" {
-			var err error
-			if la, err = ResolveUDPAddr("udp", laddr); err != nil {
-				t.Fatal(err)
-			}
-		}
-		c2, err := DialUDP("udp", la, c1.LocalAddr().(*UDPAddr))
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer c2.Close()
-
-		var connAddrs = [4]struct {
-			got Addr
-			ok  bool
-		}{
-			{c1.LocalAddr(), true},
-			{c1.(*UDPConn).RemoteAddr(), false},
-			{c2.LocalAddr(), true},
-			{c2.RemoteAddr(), true},
-		}
-		for _, ca := range connAddrs {
-			if a, ok := ca.got.(*UDPAddr); ok != ca.ok || ok && a.Port == 0 {
-				t.Fatalf("got %v; expected a proper address with non-zero port number", ca.got)
-			}
-		}
-	}
-}
-
-func TestIPv6LinkLocalUnicastUDP(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Skip("avoid external network")
-	}
-	if !supportsIPv6 {
-		t.Skip("IPv6 is not supported")
-	}
-
-	for i, tt := range ipv6LinkLocalUnicastUDPTests {
-		c1, err := ListenPacket(tt.network, tt.address)
-		if err != nil {
-			// It might return "LookupHost returned no
-			// suitable address" error on some platforms.
-			t.Log(err)
-			continue
-		}
-		ls, err := (&packetListener{PacketConn: c1}).newLocalServer()
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer ls.teardown()
-		ch := make(chan error, 1)
-		handler := func(ls *localPacketServer, c PacketConn) { packetTransponder(c, ch) }
-		if err := ls.buildup(handler); err != nil {
-			t.Fatal(err)
-		}
-		if la, ok := c1.LocalAddr().(*UDPAddr); !ok || !tt.nameLookup && la.Zone == "" {
-			t.Fatalf("got %v; expected a proper address with zone identifier", la)
-		}
-
-		c2, err := Dial(tt.network, ls.PacketConn.LocalAddr().String())
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer c2.Close()
-		if la, ok := c2.LocalAddr().(*UDPAddr); !ok || !tt.nameLookup && la.Zone == "" {
-			t.Fatalf("got %v; expected a proper address with zone identifier", la)
-		}
-		if ra, ok := c2.RemoteAddr().(*UDPAddr); !ok || !tt.nameLookup && ra.Zone == "" {
-			t.Fatalf("got %v; expected a proper address with zone identifier", ra)
-		}
-
-		if _, err := c2.Write([]byte("UDP OVER IPV6 LINKLOCAL TEST")); err != nil {
-			t.Fatal(err)
-		}
-		b := make([]byte, 32)
-		if _, err := c2.Read(b); err != nil {
-			t.Fatal(err)
-		}
-
-		for err := range ch {
-			t.Errorf("#%d: %v", i, err)
-		}
-	}
-}
-
-func TestUDPZeroBytePayload(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	c, err := newLocalPacketListener("udp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	for _, genericRead := range []bool{false, true} {
-		n, err := c.WriteTo(nil, c.LocalAddr())
-		if err != nil {
-			t.Fatal(err)
-		}
-		if n != 0 {
-			t.Errorf("got %d; want 0", n)
-		}
-		c.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
-		var b [1]byte
-		if genericRead {
-			_, err = c.(Conn).Read(b[:])
-		} else {
-			_, _, err = c.ReadFrom(b[:])
-		}
-		switch err {
-		case nil: // ReadFrom succeeds
-		default: // Read may timeout, it depends on the platform
-			if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
-				t.Fatal(err)
-			}
-		}
-	}
-}
-
-func TestUDPZeroByteBuffer(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "plan9":
-		t.Skipf("not supported on %s", runtime.GOOS)
-	}
-
-	c, err := newLocalPacketListener("udp")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	b := []byte("UDP ZERO BYTE BUFFER TEST")
-	for _, genericRead := range []bool{false, true} {
-		n, err := c.WriteTo(b, c.LocalAddr())
-		if err != nil {
-			t.Fatal(err)
-		}
-		if n != len(b) {
-			t.Errorf("got %d; want %d", n, len(b))
-		}
-		c.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
-		if genericRead {
-			_, err = c.(Conn).Read(nil)
-		} else {
-			_, _, err = c.ReadFrom(nil)
-		}
-		switch err {
-		case nil: // ReadFrom succeeds
-		default: // Read may timeout, it depends on the platform
-			if nerr, ok := err.(Error); (!ok || !nerr.Timeout()) && runtime.GOOS != "windows" { // Windows retruns WSAEMSGSIZ
-				t.Fatal(err)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/udpsock.go b/third_party/gofrontend/libgo/go/net/udpsock.go
deleted file mode 100644
index 9292133..0000000
--- a/third_party/gofrontend/libgo/go/net/udpsock.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-// UDPAddr represents the address of a UDP end point.
-type UDPAddr struct {
-	IP   IP
-	Port int
-	Zone string // IPv6 scoped addressing zone
-}
-
-// Network returns the address's network name, "udp".
-func (a *UDPAddr) Network() string { return "udp" }
-
-func (a *UDPAddr) String() string {
-	if a == nil {
-		return "<nil>"
-	}
-	ip := ipEmptyString(a.IP)
-	if a.Zone != "" {
-		return JoinHostPort(ip+"%"+a.Zone, itoa(a.Port))
-	}
-	return JoinHostPort(ip, itoa(a.Port))
-}
-
-func (a *UDPAddr) isWildcard() bool {
-	if a == nil || a.IP == nil {
-		return true
-	}
-	return a.IP.IsUnspecified()
-}
-
-func (a *UDPAddr) opAddr() Addr {
-	if a == nil {
-		return nil
-	}
-	return a
-}
-
-// ResolveUDPAddr parses addr as a UDP address of the form "host:port"
-// or "[ipv6-host%zone]:port" and resolves a pair of domain name and
-// port name on the network net, which must be "udp", "udp4" or
-// "udp6".  A literal address or host name for IPv6 must be enclosed
-// in square brackets, as in "[::1]:80", "[ipv6-host]:http" or
-// "[ipv6-host%zone]:80".
-func ResolveUDPAddr(net, addr string) (*UDPAddr, error) {
-	switch net {
-	case "udp", "udp4", "udp6":
-	case "": // a hint wildcard for Go 1.0 undocumented behavior
-		net = "udp"
-	default:
-		return nil, UnknownNetworkError(net)
-	}
-	addrs, err := internetAddrList(net, addr, noDeadline)
-	if err != nil {
-		return nil, err
-	}
-	return addrs.first(isIPv4).(*UDPAddr), nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/udpsock_plan9.go b/third_party/gofrontend/libgo/go/net/udpsock_plan9.go
deleted file mode 100644
index 1ba57a2..0000000
--- a/third_party/gofrontend/libgo/go/net/udpsock_plan9.go
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"errors"
-	"os"
-	"syscall"
-	"time"
-)
-
-// UDPConn is the implementation of the Conn and PacketConn interfaces
-// for UDP network connections.
-type UDPConn struct {
-	conn
-}
-
-func newUDPConn(fd *netFD) *UDPConn { return &UDPConn{conn{fd}} }
-
-// ReadFromUDP reads a UDP packet from c, copying the payload into b.
-// It returns the number of bytes copied into b and the return address
-// that was on the packet.
-//
-// ReadFromUDP can be made to time out and return an error with
-// Timeout() == true after a fixed time limit; see SetDeadline and
-// SetReadDeadline.
-func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err error) {
-	if !c.ok() || c.fd.data == nil {
-		return 0, nil, syscall.EINVAL
-	}
-	buf := make([]byte, udpHeaderSize+len(b))
-	m, err := c.fd.data.Read(buf)
-	if err != nil {
-		return 0, nil, &OpError{Op: "read", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	if m < udpHeaderSize {
-		return 0, nil, &OpError{Op: "read", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: errors.New("short read reading UDP header")}
-	}
-	buf = buf[:m]
-
-	h, buf := unmarshalUDPHeader(buf)
-	n = copy(b, buf)
-	return n, &UDPAddr{IP: h.raddr, Port: int(h.rport)}, nil
-}
-
-// ReadFrom implements the PacketConn ReadFrom method.
-func (c *UDPConn) ReadFrom(b []byte) (int, Addr, error) {
-	if !c.ok() {
-		return 0, nil, syscall.EINVAL
-	}
-	return c.ReadFromUDP(b)
-}
-
-// ReadMsgUDP reads a packet from c, copying the payload into b and
-// the associated out-of-band data into oob.  It returns the number
-// of bytes copied into b, the number of bytes copied into oob, the
-// flags that were set on the packet and the source address of the
-// packet.
-func (c *UDPConn) ReadMsgUDP(b, oob []byte) (n, oobn, flags int, addr *UDPAddr, err error) {
-	return 0, 0, 0, nil, &OpError{Op: "read", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
-}
-
-// WriteToUDP writes a UDP packet to addr via c, copying the payload
-// from b.
-//
-// WriteToUDP can be made to time out and return an error with
-// Timeout() == true after a fixed time limit; see SetDeadline and
-// SetWriteDeadline.  On packet-oriented connections, write timeouts
-// are rare.
-func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error) {
-	if !c.ok() || c.fd.data == nil {
-		return 0, syscall.EINVAL
-	}
-	if addr == nil {
-		return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: nil, Err: errMissingAddress}
-	}
-	h := new(udpHeader)
-	h.raddr = addr.IP.To16()
-	h.laddr = c.fd.laddr.(*UDPAddr).IP.To16()
-	h.ifcaddr = IPv6zero // ignored (receive only)
-	h.rport = uint16(addr.Port)
-	h.lport = uint16(c.fd.laddr.(*UDPAddr).Port)
-
-	buf := make([]byte, udpHeaderSize+len(b))
-	i := copy(buf, h.Bytes())
-	copy(buf[i:], b)
-	if _, err := c.fd.data.Write(buf); err != nil {
-		return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
-	}
-	return len(b), nil
-}
-
-// WriteTo implements the PacketConn WriteTo method.
-func (c *UDPConn) WriteTo(b []byte, addr Addr) (int, error) {
-	if !c.ok() {
-		return 0, syscall.EINVAL
-	}
-	a, ok := addr.(*UDPAddr)
-	if !ok {
-		return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr, Err: syscall.EINVAL}
-	}
-	return c.WriteToUDP(b, a)
-}
-
-// WriteMsgUDP writes a packet to addr via c if c isn't connected, or
-// to c's remote destination address if c is connected (in which case
-// addr must be nil).  The payload is copied from b and the associated
-// out-of-band data is copied from oob.  It returns the number of
-// payload and out-of-band bytes written.
-func (c *UDPConn) WriteMsgUDP(b, oob []byte, addr *UDPAddr) (n, oobn int, err error) {
-	return 0, 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EPLAN9}
-}
-
-// DialUDP connects to the remote address raddr on the network net,
-// which must be "udp", "udp4", or "udp6".  If laddr is not nil, it is
-// used as the local address for the connection.
-func DialUDP(net string, laddr, raddr *UDPAddr) (*UDPConn, error) {
-	return dialUDP(net, laddr, raddr, noDeadline)
-}
-
-func dialUDP(net string, laddr, raddr *UDPAddr, deadline time.Time) (*UDPConn, error) {
-	if !deadline.IsZero() {
-		panic("net.dialUDP: deadline not implemented on Plan 9")
-	}
-	switch net {
-	case "udp", "udp4", "udp6":
-	default:
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: UnknownNetworkError(net)}
-	}
-	if raddr == nil {
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: nil, Err: errMissingAddress}
-	}
-	fd, err := dialPlan9(net, laddr, raddr)
-	if err != nil {
-		return nil, err
-	}
-	return newUDPConn(fd), nil
-}
-
-const udpHeaderSize = 16*3 + 2*2
-
-type udpHeader struct {
-	raddr, laddr, ifcaddr IP
-	rport, lport          uint16
-}
-
-func (h *udpHeader) Bytes() []byte {
-	b := make([]byte, udpHeaderSize)
-	i := 0
-	i += copy(b[i:i+16], h.raddr)
-	i += copy(b[i:i+16], h.laddr)
-	i += copy(b[i:i+16], h.ifcaddr)
-	b[i], b[i+1], i = byte(h.rport>>8), byte(h.rport), i+2
-	b[i], b[i+1], i = byte(h.lport>>8), byte(h.lport), i+2
-	return b
-}
-
-func unmarshalUDPHeader(b []byte) (*udpHeader, []byte) {
-	h := new(udpHeader)
-	h.raddr, b = IP(b[:16]), b[16:]
-	h.laddr, b = IP(b[:16]), b[16:]
-	h.ifcaddr, b = IP(b[:16]), b[16:]
-	h.rport, b = uint16(b[0])<<8|uint16(b[1]), b[2:]
-	h.lport, b = uint16(b[0])<<8|uint16(b[1]), b[2:]
-	return h, b
-}
-
-// ListenUDP listens for incoming UDP packets addressed to the local
-// address laddr.  Net must be "udp", "udp4", or "udp6".  If laddr has
-// a port of 0, ListenUDP will choose an available port.
-// The LocalAddr method of the returned UDPConn can be used to
-// discover the port.  The returned connection's ReadFrom and WriteTo
-// methods can be used to receive and send UDP packets with per-packet
-// addressing.
-func ListenUDP(net string, laddr *UDPAddr) (*UDPConn, error) {
-	switch net {
-	case "udp", "udp4", "udp6":
-	default:
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(net)}
-	}
-	if laddr == nil {
-		laddr = &UDPAddr{}
-	}
-	l, err := listenPlan9(net, laddr)
-	if err != nil {
-		return nil, err
-	}
-	_, err = l.ctl.WriteString("headers")
-	if err != nil {
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: err}
-	}
-	l.data, err = os.OpenFile(l.dir+"/data", os.O_RDWR, 0)
-	if err != nil {
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: err}
-	}
-	fd, err := l.netFD()
-	return newUDPConn(fd), err
-}
-
-// ListenMulticastUDP listens for incoming multicast UDP packets
-// addressed to the group address gaddr on the interface ifi.
-// Network must be "udp", "udp4" or "udp6".
-// ListenMulticastUDP uses the system-assigned multicast interface
-// when ifi is nil, although this is not recommended because the
-// assignment depends on platforms and sometimes it might require
-// routing configuration.
-//
-// ListenMulticastUDP is just for convenience of simple, small
-// applications. There are golang.org/x/net/ipv4 and
-// golang.org/x/net/ipv6 packages for general purpose uses.
-func ListenMulticastUDP(network string, ifi *Interface, gaddr *UDPAddr) (*UDPConn, error) {
-	return nil, &OpError{Op: "listen", Net: network, Source: nil, Addr: gaddr.opAddr(), Err: syscall.EPLAN9}
-}
diff --git a/third_party/gofrontend/libgo/go/net/udpsock_posix.go b/third_party/gofrontend/libgo/go/net/udpsock_posix.go
deleted file mode 100644
index 61868c4..0000000
--- a/third_party/gofrontend/libgo/go/net/udpsock_posix.go
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
-
-package net
-
-import (
-	"syscall"
-	"time"
-)
-
-func sockaddrToUDP(sa syscall.Sockaddr) Addr {
-	switch sa := sa.(type) {
-	case *syscall.SockaddrInet4:
-		return &UDPAddr{IP: sa.Addr[0:], Port: sa.Port}
-	case *syscall.SockaddrInet6:
-		return &UDPAddr{IP: sa.Addr[0:], Port: sa.Port, Zone: zoneToString(int(sa.ZoneId))}
-	}
-	return nil
-}
-
-func (a *UDPAddr) family() int {
-	if a == nil || len(a.IP) <= IPv4len {
-		return syscall.AF_INET
-	}
-	if a.IP.To4() != nil {
-		return syscall.AF_INET
-	}
-	return syscall.AF_INET6
-}
-
-func (a *UDPAddr) sockaddr(family int) (syscall.Sockaddr, error) {
-	if a == nil {
-		return nil, nil
-	}
-	return ipToSockaddr(family, a.IP, a.Port, a.Zone)
-}
-
-// UDPConn is the implementation of the Conn and PacketConn interfaces
-// for UDP network connections.
-type UDPConn struct {
-	conn
-}
-
-func newUDPConn(fd *netFD) *UDPConn { return &UDPConn{conn{fd}} }
-
-// ReadFromUDP reads a UDP packet from c, copying the payload into b.
-// It returns the number of bytes copied into b and the return address
-// that was on the packet.
-//
-// ReadFromUDP can be made to time out and return an error with
-// Timeout() == true after a fixed time limit; see SetDeadline and
-// SetReadDeadline.
-func (c *UDPConn) ReadFromUDP(b []byte) (int, *UDPAddr, error) {
-	if !c.ok() {
-		return 0, nil, syscall.EINVAL
-	}
-	var addr *UDPAddr
-	n, sa, err := c.fd.readFrom(b)
-	switch sa := sa.(type) {
-	case *syscall.SockaddrInet4:
-		addr = &UDPAddr{IP: sa.Addr[0:], Port: sa.Port}
-	case *syscall.SockaddrInet6:
-		addr = &UDPAddr{IP: sa.Addr[0:], Port: sa.Port, Zone: zoneToString(int(sa.ZoneId))}
-	}
-	if err != nil {
-		err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return n, addr, err
-}
-
-// ReadFrom implements the PacketConn ReadFrom method.
-func (c *UDPConn) ReadFrom(b []byte) (int, Addr, error) {
-	if !c.ok() {
-		return 0, nil, syscall.EINVAL
-	}
-	n, addr, err := c.ReadFromUDP(b)
-	if addr == nil {
-		return n, nil, err
-	}
-	return n, addr, err
-}
-
-// ReadMsgUDP reads a packet from c, copying the payload into b and
-// the associated out-of-band data into oob.  It returns the number
-// of bytes copied into b, the number of bytes copied into oob, the
-// flags that were set on the packet and the source address of the
-// packet.
-func (c *UDPConn) ReadMsgUDP(b, oob []byte) (n, oobn, flags int, addr *UDPAddr, err error) {
-	if !c.ok() {
-		return 0, 0, 0, nil, syscall.EINVAL
-	}
-	var sa syscall.Sockaddr
-	n, oobn, flags, sa, err = c.fd.readMsg(b, oob)
-	switch sa := sa.(type) {
-	case *syscall.SockaddrInet4:
-		addr = &UDPAddr{IP: sa.Addr[0:], Port: sa.Port}
-	case *syscall.SockaddrInet6:
-		addr = &UDPAddr{IP: sa.Addr[0:], Port: sa.Port, Zone: zoneToString(int(sa.ZoneId))}
-	}
-	if err != nil {
-		err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return
-}
-
-// WriteToUDP writes a UDP packet to addr via c, copying the payload
-// from b.
-//
-// WriteToUDP can be made to time out and return an error with
-// Timeout() == true after a fixed time limit; see SetDeadline and
-// SetWriteDeadline.  On packet-oriented connections, write timeouts
-// are rare.
-func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error) {
-	if !c.ok() {
-		return 0, syscall.EINVAL
-	}
-	if c.fd.isConnected {
-		return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: ErrWriteToConnected}
-	}
-	if addr == nil {
-		return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: nil, Err: errMissingAddress}
-	}
-	sa, err := addr.sockaddr(c.fd.family)
-	if err != nil {
-		return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
-	}
-	n, err := c.fd.writeTo(b, sa)
-	if err != nil {
-		err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
-	}
-	return n, err
-}
-
-// WriteTo implements the PacketConn WriteTo method.
-func (c *UDPConn) WriteTo(b []byte, addr Addr) (int, error) {
-	if !c.ok() {
-		return 0, syscall.EINVAL
-	}
-	a, ok := addr.(*UDPAddr)
-	if !ok {
-		return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: syscall.EINVAL}
-	}
-	return c.WriteToUDP(b, a)
-}
-
-// WriteMsgUDP writes a packet to addr via c if c isn't connected, or
-// to c's remote destination address if c is connected (in which case
-// addr must be nil).  The payload is copied from b and the associated
-// out-of-band data is copied from oob.  It returns the number of
-// payload and out-of-band bytes written.
-func (c *UDPConn) WriteMsgUDP(b, oob []byte, addr *UDPAddr) (n, oobn int, err error) {
-	if !c.ok() {
-		return 0, 0, syscall.EINVAL
-	}
-	if c.fd.isConnected && addr != nil {
-		return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: ErrWriteToConnected}
-	}
-	if !c.fd.isConnected && addr == nil {
-		return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: errMissingAddress}
-	}
-	var sa syscall.Sockaddr
-	sa, err = addr.sockaddr(c.fd.family)
-	if err != nil {
-		return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
-	}
-	n, oobn, err = c.fd.writeMsg(b, oob, sa)
-	if err != nil {
-		err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
-	}
-	return
-}
-
-// DialUDP connects to the remote address raddr on the network net,
-// which must be "udp", "udp4", or "udp6".  If laddr is not nil, it is
-// used as the local address for the connection.
-func DialUDP(net string, laddr, raddr *UDPAddr) (*UDPConn, error) {
-	switch net {
-	case "udp", "udp4", "udp6":
-	default:
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: UnknownNetworkError(net)}
-	}
-	if raddr == nil {
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: nil, Err: errMissingAddress}
-	}
-	return dialUDP(net, laddr, raddr, noDeadline)
-}
-
-func dialUDP(net string, laddr, raddr *UDPAddr, deadline time.Time) (*UDPConn, error) {
-	fd, err := internetSocket(net, laddr, raddr, deadline, syscall.SOCK_DGRAM, 0, "dial")
-	if err != nil {
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: err}
-	}
-	return newUDPConn(fd), nil
-}
-
-// ListenUDP listens for incoming UDP packets addressed to the local
-// address laddr.  Net must be "udp", "udp4", or "udp6".  If laddr has
-// a port of 0, ListenUDP will choose an available port.
-// The LocalAddr method of the returned UDPConn can be used to
-// discover the port.  The returned connection's ReadFrom and WriteTo
-// methods can be used to receive and send UDP packets with per-packet
-// addressing.
-func ListenUDP(net string, laddr *UDPAddr) (*UDPConn, error) {
-	switch net {
-	case "udp", "udp4", "udp6":
-	default:
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(net)}
-	}
-	if laddr == nil {
-		laddr = &UDPAddr{}
-	}
-	fd, err := internetSocket(net, laddr, nil, noDeadline, syscall.SOCK_DGRAM, 0, "listen")
-	if err != nil {
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr, Err: err}
-	}
-	return newUDPConn(fd), nil
-}
-
-// ListenMulticastUDP listens for incoming multicast UDP packets
-// addressed to the group address gaddr on the interface ifi.
-// Network must be "udp", "udp4" or "udp6".
-// ListenMulticastUDP uses the system-assigned multicast interface
-// when ifi is nil, although this is not recommended because the
-// assignment depends on platforms and sometimes it might require
-// routing configuration.
-//
-// ListenMulticastUDP is just for convenience of simple, small
-// applications. There are golang.org/x/net/ipv4 and
-// golang.org/x/net/ipv6 packages for general purpose uses.
-func ListenMulticastUDP(network string, ifi *Interface, gaddr *UDPAddr) (*UDPConn, error) {
-	switch network {
-	case "udp", "udp4", "udp6":
-	default:
-		return nil, &OpError{Op: "listen", Net: network, Source: nil, Addr: gaddr.opAddr(), Err: UnknownNetworkError(network)}
-	}
-	if gaddr == nil || gaddr.IP == nil {
-		return nil, &OpError{Op: "listen", Net: network, Source: nil, Addr: gaddr.opAddr(), Err: errMissingAddress}
-	}
-	fd, err := internetSocket(network, gaddr, nil, noDeadline, syscall.SOCK_DGRAM, 0, "listen")
-	if err != nil {
-		return nil, &OpError{Op: "listen", Net: network, Source: nil, Addr: gaddr, Err: err}
-	}
-	c := newUDPConn(fd)
-	if ip4 := gaddr.IP.To4(); ip4 != nil {
-		if err := listenIPv4MulticastUDP(c, ifi, ip4); err != nil {
-			c.Close()
-			return nil, &OpError{Op: "listen", Net: network, Source: c.fd.laddr, Addr: &IPAddr{IP: ip4}, Err: err}
-		}
-	} else {
-		if err := listenIPv6MulticastUDP(c, ifi, gaddr.IP); err != nil {
-			c.Close()
-			return nil, &OpError{Op: "listen", Net: network, Source: c.fd.laddr, Addr: &IPAddr{IP: gaddr.IP}, Err: err}
-		}
-	}
-	return c, nil
-}
-
-func listenIPv4MulticastUDP(c *UDPConn, ifi *Interface, ip IP) error {
-	if ifi != nil {
-		if err := setIPv4MulticastInterface(c.fd, ifi); err != nil {
-			return err
-		}
-	}
-	if err := setIPv4MulticastLoopback(c.fd, false); err != nil {
-		return err
-	}
-	if err := joinIPv4Group(c.fd, ifi, ip); err != nil {
-		return err
-	}
-	return nil
-}
-
-func listenIPv6MulticastUDP(c *UDPConn, ifi *Interface, ip IP) error {
-	if ifi != nil {
-		if err := setIPv6MulticastInterface(c.fd, ifi); err != nil {
-			return err
-		}
-	}
-	if err := setIPv6MulticastLoopback(c.fd, false); err != nil {
-		return err
-	}
-	if err := joinIPv6Group(c.fd, ifi, ip); err != nil {
-		return err
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/unix_test.go b/third_party/gofrontend/libgo/go/net/unix_test.go
deleted file mode 100644
index 358ff31..0000000
--- a/third_party/gofrontend/libgo/go/net/unix_test.go
+++ /dev/null
@@ -1,431 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !nacl,!plan9,!windows
-
-package net
-
-import (
-	"bytes"
-	"os"
-	"reflect"
-	"runtime"
-	"syscall"
-	"testing"
-	"time"
-)
-
-func TestReadUnixgramWithUnnamedSocket(t *testing.T) {
-	if !testableNetwork("unixgram") {
-		t.Skip("unixgram test")
-	}
-
-	addr := testUnixAddr()
-	la, err := ResolveUnixAddr("unixgram", addr)
-	if err != nil {
-		t.Fatal(err)
-	}
-	c, err := ListenUnixgram("unixgram", la)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer func() {
-		c.Close()
-		os.Remove(addr)
-	}()
-
-	off := make(chan bool)
-	data := [5]byte{1, 2, 3, 4, 5}
-	go func() {
-		defer func() { off <- true }()
-		s, err := syscall.Socket(syscall.AF_UNIX, syscall.SOCK_DGRAM, 0)
-		if err != nil {
-			t.Error(err)
-			return
-		}
-		defer syscall.Close(s)
-		rsa := &syscall.SockaddrUnix{Name: addr}
-		if err := syscall.Sendto(s, data[:], 0, rsa); err != nil {
-			t.Error(err)
-			return
-		}
-	}()
-
-	<-off
-	b := make([]byte, 64)
-	c.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
-	n, from, err := c.ReadFrom(b)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if from != nil {
-		t.Fatalf("unexpected peer address: %v", from)
-	}
-	if !bytes.Equal(b[:n], data[:]) {
-		t.Fatalf("got %v; want %v", b[:n], data[:])
-	}
-}
-
-func TestUnixgramZeroBytePayload(t *testing.T) {
-	if !testableNetwork("unixgram") {
-		t.Skip("unixgram test")
-	}
-
-	c1, err := newLocalPacketListener("unixgram")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.Remove(c1.LocalAddr().String())
-	defer c1.Close()
-
-	c2, err := Dial("unixgram", c1.LocalAddr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.Remove(c2.LocalAddr().String())
-	defer c2.Close()
-
-	for _, genericRead := range []bool{false, true} {
-		n, err := c2.Write(nil)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if n != 0 {
-			t.Errorf("got %d; want 0", n)
-		}
-		c1.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
-		var b [1]byte
-		var peer Addr
-		if genericRead {
-			_, err = c1.(Conn).Read(b[:])
-		} else {
-			_, peer, err = c1.ReadFrom(b[:])
-		}
-		switch err {
-		case nil: // ReadFrom succeeds
-			if peer != nil { // peer is connected-mode
-				t.Fatalf("unexpected peer address: %v", peer)
-			}
-		default: // Read may timeout, it depends on the platform
-			if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
-				t.Fatal(err)
-			}
-		}
-	}
-}
-
-func TestUnixgramZeroByteBuffer(t *testing.T) {
-	if !testableNetwork("unixgram") {
-		t.Skip("unixgram test")
-	}
-	// issue 4352: Recvfrom failed with "address family not
-	// supported by protocol family" if zero-length buffer provided
-
-	c1, err := newLocalPacketListener("unixgram")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.Remove(c1.LocalAddr().String())
-	defer c1.Close()
-
-	c2, err := Dial("unixgram", c1.LocalAddr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.Remove(c2.LocalAddr().String())
-	defer c2.Close()
-
-	b := []byte("UNIXGRAM ZERO BYTE BUFFER TEST")
-	for _, genericRead := range []bool{false, true} {
-		n, err := c2.Write(b)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if n != len(b) {
-			t.Errorf("got %d; want %d", n, len(b))
-		}
-		c1.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
-		var peer Addr
-		if genericRead {
-			_, err = c1.(Conn).Read(nil)
-		} else {
-			_, peer, err = c1.ReadFrom(nil)
-		}
-		switch err {
-		case nil: // ReadFrom succeeds
-			if peer != nil { // peer is connected-mode
-				t.Fatalf("unexpected peer address: %v", peer)
-			}
-		default: // Read may timeout, it depends on the platform
-			if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
-				t.Fatal(err)
-			}
-		}
-	}
-}
-
-func TestUnixgramAutobind(t *testing.T) {
-	if runtime.GOOS != "linux" {
-		t.Skip("autobind is linux only")
-	}
-
-	laddr := &UnixAddr{Name: "", Net: "unixgram"}
-	c1, err := ListenUnixgram("unixgram", laddr)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c1.Close()
-
-	// retrieve the autobind address
-	autoAddr := c1.LocalAddr().(*UnixAddr)
-	if len(autoAddr.Name) <= 1 {
-		t.Fatalf("invalid autobind address: %v", autoAddr)
-	}
-	if autoAddr.Name[0] != '@' {
-		t.Fatalf("invalid autobind address: %v", autoAddr)
-	}
-
-	c2, err := DialUnix("unixgram", nil, autoAddr)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c2.Close()
-
-	if !reflect.DeepEqual(c1.LocalAddr(), c2.RemoteAddr()) {
-		t.Fatalf("expected autobind address %v, got %v", c1.LocalAddr(), c2.RemoteAddr())
-	}
-}
-
-func TestUnixAutobindClose(t *testing.T) {
-	if runtime.GOOS != "linux" {
-		t.Skip("autobind is linux only")
-	}
-
-	laddr := &UnixAddr{Name: "", Net: "unix"}
-	ln, err := ListenUnix("unix", laddr)
-	if err != nil {
-		t.Fatal(err)
-	}
-	ln.Close()
-}
-
-func TestUnixgramWrite(t *testing.T) {
-	if !testableNetwork("unixgram") {
-		t.Skip("unixgram test")
-	}
-
-	addr := testUnixAddr()
-	laddr, err := ResolveUnixAddr("unixgram", addr)
-	if err != nil {
-		t.Fatal(err)
-	}
-	c, err := ListenPacket("unixgram", addr)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.Remove(addr)
-	defer c.Close()
-
-	testUnixgramWriteConn(t, laddr)
-	testUnixgramWritePacketConn(t, laddr)
-}
-
-func testUnixgramWriteConn(t *testing.T, raddr *UnixAddr) {
-	c, err := Dial("unixgram", raddr.String())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer c.Close()
-
-	b := []byte("CONNECTED-MODE SOCKET")
-	if _, err := c.(*UnixConn).WriteToUnix(b, raddr); err == nil {
-		t.Fatal("should fail")
-	} else if err.(*OpError).Err != ErrWriteToConnected {
-		t.Fatalf("should fail as ErrWriteToConnected: %v", err)
-	}
-	if _, err = c.(*UnixConn).WriteTo(b, raddr); err == nil {
-		t.Fatal("should fail")
-	} else if err.(*OpError).Err != ErrWriteToConnected {
-		t.Fatalf("should fail as ErrWriteToConnected: %v", err)
-	}
-	if _, _, err = c.(*UnixConn).WriteMsgUnix(b, nil, raddr); err == nil {
-		t.Fatal("should fail")
-	} else if err.(*OpError).Err != ErrWriteToConnected {
-		t.Fatalf("should fail as ErrWriteToConnected: %v", err)
-	}
-	if _, err := c.Write(b); err != nil {
-		t.Fatal(err)
-	}
-}
-
-func testUnixgramWritePacketConn(t *testing.T, raddr *UnixAddr) {
-	addr := testUnixAddr()
-	c, err := ListenPacket("unixgram", addr)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.Remove(addr)
-	defer c.Close()
-
-	b := []byte("UNCONNECTED-MODE SOCKET")
-	if _, err := c.(*UnixConn).WriteToUnix(b, raddr); err != nil {
-		t.Fatal(err)
-	}
-	if _, err := c.WriteTo(b, raddr); err != nil {
-		t.Fatal(err)
-	}
-	if _, _, err := c.(*UnixConn).WriteMsgUnix(b, nil, raddr); err != nil {
-		t.Fatal(err)
-	}
-	if _, err := c.(*UnixConn).Write(b); err == nil {
-		t.Fatal("should fail")
-	}
-}
-
-func TestUnixConnLocalAndRemoteNames(t *testing.T) {
-	if !testableNetwork("unix") {
-		t.Skip("unix test")
-	}
-
-	handler := func(ls *localServer, ln Listener) {}
-	for _, laddr := range []string{"", testUnixAddr()} {
-		laddr := laddr
-		taddr := testUnixAddr()
-		ta, err := ResolveUnixAddr("unix", taddr)
-		if err != nil {
-			t.Fatal(err)
-		}
-		ln, err := ListenUnix("unix", ta)
-		if err != nil {
-			t.Fatal(err)
-		}
-		ls, err := (&streamListener{Listener: ln}).newLocalServer()
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer ls.teardown()
-		if err := ls.buildup(handler); err != nil {
-			t.Fatal(err)
-		}
-
-		la, err := ResolveUnixAddr("unix", laddr)
-		if err != nil {
-			t.Fatal(err)
-		}
-		c, err := DialUnix("unix", la, ta)
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer func() {
-			c.Close()
-			if la != nil {
-				defer os.Remove(laddr)
-			}
-		}()
-		if _, err := c.Write([]byte("UNIXCONN LOCAL AND REMOTE NAME TEST")); err != nil {
-			t.Fatal(err)
-		}
-
-		switch runtime.GOOS {
-		case "android", "linux":
-			if laddr == "" {
-				laddr = "@" // autobind feature
-			}
-		}
-		var connAddrs = [3]struct{ got, want Addr }{
-			{ln.Addr(), ta},
-			{c.LocalAddr(), &UnixAddr{Name: laddr, Net: "unix"}},
-			{c.RemoteAddr(), ta},
-		}
-		for _, ca := range connAddrs {
-			if !reflect.DeepEqual(ca.got, ca.want) {
-				t.Fatalf("got %#v, expected %#v", ca.got, ca.want)
-			}
-		}
-	}
-}
-
-func TestUnixgramConnLocalAndRemoteNames(t *testing.T) {
-	if !testableNetwork("unixgram") {
-		t.Skip("unixgram test")
-	}
-
-	for _, laddr := range []string{"", testUnixAddr()} {
-		laddr := laddr
-		taddr := testUnixAddr()
-		ta, err := ResolveUnixAddr("unixgram", taddr)
-		if err != nil {
-			t.Fatal(err)
-		}
-		c1, err := ListenUnixgram("unixgram", ta)
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer func() {
-			c1.Close()
-			os.Remove(taddr)
-		}()
-
-		var la *UnixAddr
-		if laddr != "" {
-			if la, err = ResolveUnixAddr("unixgram", laddr); err != nil {
-				t.Fatal(err)
-			}
-		}
-		c2, err := DialUnix("unixgram", la, ta)
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer func() {
-			c2.Close()
-			if la != nil {
-				defer os.Remove(laddr)
-			}
-		}()
-
-		switch runtime.GOOS {
-		case "android", "linux":
-			if laddr == "" {
-				laddr = "@" // autobind feature
-			}
-		}
-
-		var connAddrs = [4]struct{ got, want Addr }{
-			{c1.LocalAddr(), ta},
-			{c1.RemoteAddr(), nil},
-			{c2.LocalAddr(), &UnixAddr{Name: laddr, Net: "unixgram"}},
-			{c2.RemoteAddr(), ta},
-		}
-		for _, ca := range connAddrs {
-			if !reflect.DeepEqual(ca.got, ca.want) {
-				t.Fatalf("got %#v; want %#v", ca.got, ca.want)
-			}
-		}
-	}
-}
-
-// forceGoDNS forces the resolver configuration to use the pure Go resolver
-// and returns a fixup function to restore the old settings.
-func forceGoDNS() func() {
-	c := systemConf()
-	oldGo := c.netGo
-	oldCgo := c.netCgo
-	fixup := func() {
-		c.netGo = oldGo
-		c.netCgo = oldCgo
-	}
-	c.netGo = true
-	c.netCgo = false
-	return fixup
-}
-
-// forceCgoDNS forces the resolver configuration to use the cgo resolver
-// and returns true to indicate that it did so.
-// (On non-Unix systems forceCgoDNS returns false.)
-func forceCgoDNS() bool {
-	c := systemConf()
-	c.netGo = false
-	c.netCgo = true
-	return true
-}
diff --git a/third_party/gofrontend/libgo/go/net/unixsock.go b/third_party/gofrontend/libgo/go/net/unixsock.go
deleted file mode 100644
index eb91d0d..0000000
--- a/third_party/gofrontend/libgo/go/net/unixsock.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-// UnixAddr represents the address of a Unix domain socket end point.
-type UnixAddr struct {
-	Name string
-	Net  string
-}
-
-// Network returns the address's network name, "unix", "unixgram" or
-// "unixpacket".
-func (a *UnixAddr) Network() string {
-	return a.Net
-}
-
-func (a *UnixAddr) String() string {
-	if a == nil {
-		return "<nil>"
-	}
-	return a.Name
-}
-
-func (a *UnixAddr) isWildcard() bool {
-	return a == nil || a.Name == ""
-}
-
-func (a *UnixAddr) opAddr() Addr {
-	if a == nil {
-		return nil
-	}
-	return a
-}
-
-// ResolveUnixAddr parses addr as a Unix domain socket address.
-// The string net gives the network name, "unix", "unixgram" or
-// "unixpacket".
-func ResolveUnixAddr(net, addr string) (*UnixAddr, error) {
-	switch net {
-	case "unix", "unixgram", "unixpacket":
-		return &UnixAddr{Name: addr, Net: net}, nil
-	default:
-		return nil, UnknownNetworkError(net)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/net/unixsock_plan9.go b/third_party/gofrontend/libgo/go/net/unixsock_plan9.go
deleted file mode 100644
index 84b6b60..0000000
--- a/third_party/gofrontend/libgo/go/net/unixsock_plan9.go
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package net
-
-import (
-	"os"
-	"syscall"
-	"time"
-)
-
-// UnixConn is an implementation of the Conn interface for connections
-// to Unix domain sockets.
-type UnixConn struct {
-	conn
-}
-
-// ReadFromUnix reads a packet from c, copying the payload into b.  It
-// returns the number of bytes copied into b and the source address of
-// the packet.
-//
-// ReadFromUnix can be made to time out and return an error with
-// Timeout() == true after a fixed time limit; see SetDeadline and
-// SetReadDeadline.
-func (c *UnixConn) ReadFromUnix(b []byte) (int, *UnixAddr, error) {
-	return 0, nil, &OpError{Op: "read", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
-}
-
-// ReadFrom implements the PacketConn ReadFrom method.
-func (c *UnixConn) ReadFrom(b []byte) (int, Addr, error) {
-	return 0, nil, &OpError{Op: "read", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
-}
-
-// ReadMsgUnix reads a packet from c, copying the payload into b and
-// the associated out-of-band data into oob.  It returns the number of
-// bytes copied into b, the number of bytes copied into oob, the flags
-// that were set on the packet, and the source address of the packet.
-func (c *UnixConn) ReadMsgUnix(b, oob []byte) (n, oobn, flags int, addr *UnixAddr, err error) {
-	return 0, 0, 0, nil, &OpError{Op: "read", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
-}
-
-// WriteToUnix writes a packet to addr via c, copying the payload from b.
-//
-// WriteToUnix can be made to time out and return an error with
-// Timeout() == true after a fixed time limit; see SetDeadline and
-// SetWriteDeadline.  On packet-oriented connections, write timeouts
-// are rare.
-func (c *UnixConn) WriteToUnix(b []byte, addr *UnixAddr) (int, error) {
-	return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EPLAN9}
-}
-
-// WriteTo implements the PacketConn WriteTo method.
-func (c *UnixConn) WriteTo(b []byte, addr Addr) (int, error) {
-	return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr, Err: syscall.EPLAN9}
-}
-
-// WriteMsgUnix writes a packet to addr via c, copying the payload
-// from b and the associated out-of-band data from oob.  It returns
-// the number of payload and out-of-band bytes written.
-func (c *UnixConn) WriteMsgUnix(b, oob []byte, addr *UnixAddr) (n, oobn int, err error) {
-	return 0, 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EPLAN9}
-}
-
-// CloseRead shuts down the reading side of the Unix domain connection.
-// Most callers should just use Close.
-func (c *UnixConn) CloseRead() error {
-	return &OpError{Op: "close", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
-}
-
-// CloseWrite shuts down the writing side of the Unix domain connection.
-// Most callers should just use Close.
-func (c *UnixConn) CloseWrite() error {
-	return &OpError{Op: "close", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
-}
-
-// DialUnix connects to the remote address raddr on the network net,
-// which must be "unix", "unixgram" or "unixpacket".  If laddr is not
-// nil, it is used as the local address for the connection.
-func DialUnix(net string, laddr, raddr *UnixAddr) (*UnixConn, error) {
-	return dialUnix(net, laddr, raddr, noDeadline)
-}
-
-func dialUnix(net string, laddr, raddr *UnixAddr, deadline time.Time) (*UnixConn, error) {
-	return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: syscall.EPLAN9}
-}
-
-// UnixListener is a Unix domain socket listener.  Clients should
-// typically use variables of type Listener instead of assuming Unix
-// domain sockets.
-type UnixListener struct {
-	fd *netFD
-}
-
-// ListenUnix announces on the Unix domain socket laddr and returns a
-// Unix listener.  The network net must be "unix" or "unixpacket".
-func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error) {
-	return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: syscall.EPLAN9}
-}
-
-// AcceptUnix accepts the next incoming call and returns the new
-// connection.
-func (l *UnixListener) AcceptUnix() (*UnixConn, error) {
-	return nil, &OpError{Op: "accept", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: syscall.EPLAN9}
-}
-
-// Accept implements the Accept method in the Listener interface; it
-// waits for the next call and returns a generic Conn.
-func (l *UnixListener) Accept() (Conn, error) {
-	return nil, &OpError{Op: "accept", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: syscall.EPLAN9}
-}
-
-// Close stops listening on the Unix address.  Already accepted
-// connections are not closed.
-func (l *UnixListener) Close() error {
-	return &OpError{Op: "close", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: syscall.EPLAN9}
-}
-
-// Addr returns the listener's network address.
-// The Addr returned is shared by all invocations of Addr, so
-// do not modify it.
-func (l *UnixListener) Addr() Addr { return nil }
-
-// SetDeadline sets the deadline associated with the listener.
-// A zero time value disables the deadline.
-func (l *UnixListener) SetDeadline(t time.Time) error {
-	return &OpError{Op: "set", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: syscall.EPLAN9}
-}
-
-// File returns a copy of the underlying os.File, set to blocking
-// mode.  It is the caller's responsibility to close f when finished.
-// Closing l does not affect f, and closing f does not affect l.
-//
-// The returned os.File's file descriptor is different from the
-// connection's.  Attempting to change properties of the original
-// using this duplicate may or may not have the desired effect.
-func (l *UnixListener) File() (*os.File, error) {
-	return nil, &OpError{Op: "file", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: syscall.EPLAN9}
-}
-
-// ListenUnixgram listens for incoming Unix datagram packets addressed
-// to the local address laddr.  The network net must be "unixgram".
-// The returned connection's ReadFrom and WriteTo methods can be used
-// to receive and send packets with per-packet addressing.
-func ListenUnixgram(net string, laddr *UnixAddr) (*UnixConn, error) {
-	return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: syscall.EPLAN9}
-}
diff --git a/third_party/gofrontend/libgo/go/net/unixsock_posix.go b/third_party/gofrontend/libgo/go/net/unixsock_posix.go
deleted file mode 100644
index 351d9b3..0000000
--- a/third_party/gofrontend/libgo/go/net/unixsock_posix.go
+++ /dev/null
@@ -1,398 +0,0 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
-
-package net
-
-import (
-	"errors"
-	"os"
-	"syscall"
-	"time"
-)
-
-func unixSocket(net string, laddr, raddr sockaddr, mode string, deadline time.Time) (*netFD, error) {
-	var sotype int
-	switch net {
-	case "unix":
-		sotype = syscall.SOCK_STREAM
-	case "unixgram":
-		sotype = syscall.SOCK_DGRAM
-	case "unixpacket":
-		sotype = syscall.SOCK_SEQPACKET
-	default:
-		return nil, UnknownNetworkError(net)
-	}
-
-	switch mode {
-	case "dial":
-		if laddr != nil && laddr.isWildcard() {
-			laddr = nil
-		}
-		if raddr != nil && raddr.isWildcard() {
-			raddr = nil
-		}
-		if raddr == nil && (sotype != syscall.SOCK_DGRAM || laddr == nil) {
-			return nil, errMissingAddress
-		}
-	case "listen":
-	default:
-		return nil, errors.New("unknown mode: " + mode)
-	}
-
-	fd, err := socket(net, syscall.AF_UNIX, sotype, 0, false, laddr, raddr, deadline)
-	if err != nil {
-		return nil, err
-	}
-	return fd, nil
-}
-
-func sockaddrToUnix(sa syscall.Sockaddr) Addr {
-	if s, ok := sa.(*syscall.SockaddrUnix); ok {
-		return &UnixAddr{Name: s.Name, Net: "unix"}
-	}
-	return nil
-}
-
-func sockaddrToUnixgram(sa syscall.Sockaddr) Addr {
-	if s, ok := sa.(*syscall.SockaddrUnix); ok {
-		return &UnixAddr{Name: s.Name, Net: "unixgram"}
-	}
-	return nil
-}
-
-func sockaddrToUnixpacket(sa syscall.Sockaddr) Addr {
-	if s, ok := sa.(*syscall.SockaddrUnix); ok {
-		return &UnixAddr{Name: s.Name, Net: "unixpacket"}
-	}
-	return nil
-}
-
-func sotypeToNet(sotype int) string {
-	switch sotype {
-	case syscall.SOCK_STREAM:
-		return "unix"
-	case syscall.SOCK_DGRAM:
-		return "unixgram"
-	case syscall.SOCK_SEQPACKET:
-		return "unixpacket"
-	default:
-		panic("sotypeToNet unknown socket type")
-	}
-}
-
-func (a *UnixAddr) family() int {
-	return syscall.AF_UNIX
-}
-
-func (a *UnixAddr) sockaddr(family int) (syscall.Sockaddr, error) {
-	if a == nil {
-		return nil, nil
-	}
-	return &syscall.SockaddrUnix{Name: a.Name}, nil
-}
-
-// UnixConn is an implementation of the Conn interface for connections
-// to Unix domain sockets.
-type UnixConn struct {
-	conn
-}
-
-func newUnixConn(fd *netFD) *UnixConn { return &UnixConn{conn{fd}} }
-
-// ReadFromUnix reads a packet from c, copying the payload into b.  It
-// returns the number of bytes copied into b and the source address of
-// the packet.
-//
-// ReadFromUnix can be made to time out and return an error with
-// Timeout() == true after a fixed time limit; see SetDeadline and
-// SetReadDeadline.
-func (c *UnixConn) ReadFromUnix(b []byte) (int, *UnixAddr, error) {
-	if !c.ok() {
-		return 0, nil, syscall.EINVAL
-	}
-	var addr *UnixAddr
-	n, sa, err := c.fd.readFrom(b)
-	switch sa := sa.(type) {
-	case *syscall.SockaddrUnix:
-		if sa.Name != "" {
-			addr = &UnixAddr{Name: sa.Name, Net: sotypeToNet(c.fd.sotype)}
-		}
-	}
-	if err != nil {
-		err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return n, addr, err
-}
-
-// ReadFrom implements the PacketConn ReadFrom method.
-func (c *UnixConn) ReadFrom(b []byte) (int, Addr, error) {
-	if !c.ok() {
-		return 0, nil, syscall.EINVAL
-	}
-	n, addr, err := c.ReadFromUnix(b)
-	if addr == nil {
-		return n, nil, err
-	}
-	return n, addr, err
-}
-
-// ReadMsgUnix reads a packet from c, copying the payload into b and
-// the associated out-of-band data into oob.  It returns the number of
-// bytes copied into b, the number of bytes copied into oob, the flags
-// that were set on the packet, and the source address of the packet.
-func (c *UnixConn) ReadMsgUnix(b, oob []byte) (n, oobn, flags int, addr *UnixAddr, err error) {
-	if !c.ok() {
-		return 0, 0, 0, nil, syscall.EINVAL
-	}
-	n, oobn, flags, sa, err := c.fd.readMsg(b, oob)
-	switch sa := sa.(type) {
-	case *syscall.SockaddrUnix:
-		if sa.Name != "" {
-			addr = &UnixAddr{Name: sa.Name, Net: sotypeToNet(c.fd.sotype)}
-		}
-	}
-	if err != nil {
-		err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return
-}
-
-// WriteToUnix writes a packet to addr via c, copying the payload from b.
-//
-// WriteToUnix can be made to time out and return an error with
-// Timeout() == true after a fixed time limit; see SetDeadline and
-// SetWriteDeadline.  On packet-oriented connections, write timeouts
-// are rare.
-func (c *UnixConn) WriteToUnix(b []byte, addr *UnixAddr) (int, error) {
-	if !c.ok() {
-		return 0, syscall.EINVAL
-	}
-	if c.fd.isConnected {
-		return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: ErrWriteToConnected}
-	}
-	if addr == nil {
-		return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: nil, Err: errMissingAddress}
-	}
-	if addr.Net != sotypeToNet(c.fd.sotype) {
-		return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EAFNOSUPPORT}
-	}
-	sa := &syscall.SockaddrUnix{Name: addr.Name}
-	n, err := c.fd.writeTo(b, sa)
-	if err != nil {
-		err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
-	}
-	return n, err
-}
-
-// WriteTo implements the PacketConn WriteTo method.
-func (c *UnixConn) WriteTo(b []byte, addr Addr) (n int, err error) {
-	if !c.ok() {
-		return 0, syscall.EINVAL
-	}
-	a, ok := addr.(*UnixAddr)
-	if !ok {
-		return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: syscall.EINVAL}
-	}
-	return c.WriteToUnix(b, a)
-}
-
-// WriteMsgUnix writes a packet to addr via c, copying the payload
-// from b and the associated out-of-band data from oob.  It returns
-// the number of payload and out-of-band bytes written.
-func (c *UnixConn) WriteMsgUnix(b, oob []byte, addr *UnixAddr) (n, oobn int, err error) {
-	if !c.ok() {
-		return 0, 0, syscall.EINVAL
-	}
-	if c.fd.sotype == syscall.SOCK_DGRAM && c.fd.isConnected {
-		return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: ErrWriteToConnected}
-	}
-	var sa syscall.Sockaddr
-	if addr != nil {
-		if addr.Net != sotypeToNet(c.fd.sotype) {
-			return 0, 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EAFNOSUPPORT}
-		}
-		sa = &syscall.SockaddrUnix{Name: addr.Name}
-	}
-	n, oobn, err = c.fd.writeMsg(b, oob, sa)
-	if err != nil {
-		err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
-	}
-	return
-}
-
-// CloseRead shuts down the reading side of the Unix domain connection.
-// Most callers should just use Close.
-func (c *UnixConn) CloseRead() error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	err := c.fd.closeRead()
-	if err != nil {
-		err = &OpError{Op: "close", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return err
-}
-
-// CloseWrite shuts down the writing side of the Unix domain connection.
-// Most callers should just use Close.
-func (c *UnixConn) CloseWrite() error {
-	if !c.ok() {
-		return syscall.EINVAL
-	}
-	err := c.fd.closeWrite()
-	if err != nil {
-		err = &OpError{Op: "close", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
-	}
-	return err
-}
-
-// DialUnix connects to the remote address raddr on the network net,
-// which must be "unix", "unixgram" or "unixpacket".  If laddr is not
-// nil, it is used as the local address for the connection.
-func DialUnix(net string, laddr, raddr *UnixAddr) (*UnixConn, error) {
-	switch net {
-	case "unix", "unixgram", "unixpacket":
-	default:
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: UnknownNetworkError(net)}
-	}
-	return dialUnix(net, laddr, raddr, noDeadline)
-}
-
-func dialUnix(net string, laddr, raddr *UnixAddr, deadline time.Time) (*UnixConn, error) {
-	fd, err := unixSocket(net, laddr, raddr, "dial", deadline)
-	if err != nil {
-		return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: err}
-	}
-	return newUnixConn(fd), nil
-}
-
-// UnixListener is a Unix domain socket listener.  Clients should
-// typically use variables of type Listener instead of assuming Unix
-// domain sockets.
-type UnixListener struct {
-	fd   *netFD
-	path string
-}
-
-// ListenUnix announces on the Unix domain socket laddr and returns a
-// Unix listener.  The network net must be "unix" or "unixpacket".
-func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error) {
-	switch net {
-	case "unix", "unixpacket":
-	default:
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(net)}
-	}
-	if laddr == nil {
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: errMissingAddress}
-	}
-	fd, err := unixSocket(net, laddr, nil, "listen", noDeadline)
-	if err != nil {
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: err}
-	}
-	return &UnixListener{fd: fd, path: fd.laddr.String()}, nil
-}
-
-// AcceptUnix accepts the next incoming call and returns the new
-// connection.
-func (l *UnixListener) AcceptUnix() (*UnixConn, error) {
-	if l == nil || l.fd == nil {
-		return nil, syscall.EINVAL
-	}
-	fd, err := l.fd.accept()
-	if err != nil {
-		return nil, &OpError{Op: "accept", Net: l.fd.net, Source: nil, Addr: l.fd.laddr, Err: err}
-	}
-	return newUnixConn(fd), nil
-}
-
-// Accept implements the Accept method in the Listener interface; it
-// waits for the next call and returns a generic Conn.
-func (l *UnixListener) Accept() (c Conn, err error) {
-	c1, err := l.AcceptUnix()
-	if err != nil {
-		return nil, err
-	}
-	return c1, nil
-}
-
-// Close stops listening on the Unix address.  Already accepted
-// connections are not closed.
-func (l *UnixListener) Close() error {
-	if l == nil || l.fd == nil {
-		return syscall.EINVAL
-	}
-
-	// The operating system doesn't clean up
-	// the file that announcing created, so
-	// we have to clean it up ourselves.
-	// There's a race here--we can't know for
-	// sure whether someone else has come along
-	// and replaced our socket name already--
-	// but this sequence (remove then close)
-	// is at least compatible with the auto-remove
-	// sequence in ListenUnix.  It's only non-Go
-	// programs that can mess us up.
-	if l.path[0] != '@' {
-		syscall.Unlink(l.path)
-	}
-	err := l.fd.Close()
-	if err != nil {
-		err = &OpError{Op: "close", Net: l.fd.net, Source: l.fd.laddr, Addr: l.fd.raddr, Err: err}
-	}
-	return err
-}
-
-// Addr returns the listener's network address.
-// The Addr returned is shared by all invocations of Addr, so
-// do not modify it.
-func (l *UnixListener) Addr() Addr { return l.fd.laddr }
-
-// SetDeadline sets the deadline associated with the listener.
-// A zero time value disables the deadline.
-func (l *UnixListener) SetDeadline(t time.Time) error {
-	if l == nil || l.fd == nil {
-		return syscall.EINVAL
-	}
-	if err := l.fd.setDeadline(t); err != nil {
-		return &OpError{Op: "set", Net: l.fd.net, Source: nil, Addr: l.fd.laddr, Err: err}
-	}
-	return nil
-}
-
-// File returns a copy of the underlying os.File, set to blocking
-// mode.  It is the caller's responsibility to close f when finished.
-// Closing l does not affect f, and closing f does not affect l.
-//
-// The returned os.File's file descriptor is different from the
-// connection's.  Attempting to change properties of the original
-// using this duplicate may or may not have the desired effect.
-func (l *UnixListener) File() (f *os.File, err error) {
-	f, err = l.fd.dup()
-	if err != nil {
-		err = &OpError{Op: "file", Net: l.fd.net, Source: nil, Addr: l.fd.laddr, Err: err}
-	}
-	return
-}
-
-// ListenUnixgram listens for incoming Unix datagram packets addressed
-// to the local address laddr.  The network net must be "unixgram".
-// The returned connection's ReadFrom and WriteTo methods can be used
-// to receive and send packets with per-packet addressing.
-func ListenUnixgram(net string, laddr *UnixAddr) (*UnixConn, error) {
-	switch net {
-	case "unixgram":
-	default:
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: UnknownNetworkError(net)}
-	}
-	if laddr == nil {
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: nil, Err: errMissingAddress}
-	}
-	fd, err := unixSocket(net, laddr, nil, "listen", noDeadline)
-	if err != nil {
-		return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: err}
-	}
-	return newUnixConn(fd), nil
-}
diff --git a/third_party/gofrontend/libgo/go/net/url/url.go b/third_party/gofrontend/libgo/go/net/url/url.go
deleted file mode 100644
index 8ffad66..0000000
--- a/third_party/gofrontend/libgo/go/net/url/url.go
+++ /dev/null
@@ -1,869 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package url parses URLs and implements query escaping.
-// See RFC 3986.
-package url
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"sort"
-	"strconv"
-	"strings"
-)
-
-// Error reports an error and the operation and URL that caused it.
-type Error struct {
-	Op  string
-	URL string
-	Err error
-}
-
-func (e *Error) Error() string { return e.Op + " " + e.URL + ": " + e.Err.Error() }
-
-func ishex(c byte) bool {
-	switch {
-	case '0' <= c && c <= '9':
-		return true
-	case 'a' <= c && c <= 'f':
-		return true
-	case 'A' <= c && c <= 'F':
-		return true
-	}
-	return false
-}
-
-func unhex(c byte) byte {
-	switch {
-	case '0' <= c && c <= '9':
-		return c - '0'
-	case 'a' <= c && c <= 'f':
-		return c - 'a' + 10
-	case 'A' <= c && c <= 'F':
-		return c - 'A' + 10
-	}
-	return 0
-}
-
-type encoding int
-
-const (
-	encodePath encoding = 1 + iota
-	encodeHost
-	encodeUserPassword
-	encodeQueryComponent
-	encodeFragment
-)
-
-type EscapeError string
-
-func (e EscapeError) Error() string {
-	return "invalid URL escape " + strconv.Quote(string(e))
-}
-
-// Return true if the specified character should be escaped when
-// appearing in a URL string, according to RFC 3986.
-//
-// Please be informed that for now shouldEscape does not check all
-// reserved characters correctly. See golang.org/issue/5684.
-func shouldEscape(c byte, mode encoding) bool {
-	// §2.3 Unreserved characters (alphanum)
-	if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' {
-		return false
-	}
-
-	if mode == encodeHost {
-		// §3.2.2 Host allows
-		//	sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
-		// as part of reg-name.
-		// We add : because we include :port as part of host.
-		// We add [ ] because we include [ipv6]:port as part of host
-		switch c {
-		case '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=', ':', '[', ']':
-			return false
-		}
-	}
-
-	switch c {
-	case '-', '_', '.', '~': // §2.3 Unreserved characters (mark)
-		return false
-
-	case '$', '&', '+', ',', '/', ':', ';', '=', '?', '@': // §2.2 Reserved characters (reserved)
-		// Different sections of the URL allow a few of
-		// the reserved characters to appear unescaped.
-		switch mode {
-		case encodePath: // §3.3
-			// The RFC allows : @ & = + $ but saves / ; , for assigning
-			// meaning to individual path segments. This package
-			// only manipulates the path as a whole, so we allow those
-			// last two as well. That leaves only ? to escape.
-			return c == '?'
-
-		case encodeUserPassword: // §3.2.1
-			// The RFC allows ';', ':', '&', '=', '+', '$', and ',' in
-			// userinfo, so we must escape only '@', '/', and '?'.
-			// The parsing of userinfo treats ':' as special so we must escape
-			// that too.
-			return c == '@' || c == '/' || c == '?' || c == ':'
-
-		case encodeQueryComponent: // §3.4
-			// The RFC reserves (so we must escape) everything.
-			return true
-
-		case encodeFragment: // §4.1
-			// The RFC text is silent but the grammar allows
-			// everything, so escape nothing.
-			return false
-		}
-	}
-
-	// Everything else must be escaped.
-	return true
-}
-
-// QueryUnescape does the inverse transformation of QueryEscape, converting
-// %AB into the byte 0xAB and '+' into ' ' (space). It returns an error if
-// any % is not followed by two hexadecimal digits.
-func QueryUnescape(s string) (string, error) {
-	return unescape(s, encodeQueryComponent)
-}
-
-// unescape unescapes a string; the mode specifies
-// which section of the URL string is being unescaped.
-func unescape(s string, mode encoding) (string, error) {
-	// Count %, check that they're well-formed.
-	n := 0
-	hasPlus := false
-	for i := 0; i < len(s); {
-		switch s[i] {
-		case '%':
-			n++
-			if i+2 >= len(s) || !ishex(s[i+1]) || !ishex(s[i+2]) {
-				s = s[i:]
-				if len(s) > 3 {
-					s = s[:3]
-				}
-				return "", EscapeError(s)
-			}
-			i += 3
-		case '+':
-			hasPlus = mode == encodeQueryComponent
-			i++
-		default:
-			i++
-		}
-	}
-
-	if n == 0 && !hasPlus {
-		return s, nil
-	}
-
-	t := make([]byte, len(s)-2*n)
-	j := 0
-	for i := 0; i < len(s); {
-		switch s[i] {
-		case '%':
-			t[j] = unhex(s[i+1])<<4 | unhex(s[i+2])
-			j++
-			i += 3
-		case '+':
-			if mode == encodeQueryComponent {
-				t[j] = ' '
-			} else {
-				t[j] = '+'
-			}
-			j++
-			i++
-		default:
-			t[j] = s[i]
-			j++
-			i++
-		}
-	}
-	return string(t), nil
-}
-
-// QueryEscape escapes the string so it can be safely placed
-// inside a URL query.
-func QueryEscape(s string) string {
-	return escape(s, encodeQueryComponent)
-}
-
-func escape(s string, mode encoding) string {
-	spaceCount, hexCount := 0, 0
-	for i := 0; i < len(s); i++ {
-		c := s[i]
-		if shouldEscape(c, mode) {
-			if c == ' ' && mode == encodeQueryComponent {
-				spaceCount++
-			} else {
-				hexCount++
-			}
-		}
-	}
-
-	if spaceCount == 0 && hexCount == 0 {
-		return s
-	}
-
-	t := make([]byte, len(s)+2*hexCount)
-	j := 0
-	for i := 0; i < len(s); i++ {
-		switch c := s[i]; {
-		case c == ' ' && mode == encodeQueryComponent:
-			t[j] = '+'
-			j++
-		case shouldEscape(c, mode):
-			t[j] = '%'
-			t[j+1] = "0123456789ABCDEF"[c>>4]
-			t[j+2] = "0123456789ABCDEF"[c&15]
-			j += 3
-		default:
-			t[j] = s[i]
-			j++
-		}
-	}
-	return string(t)
-}
-
-// A URL represents a parsed URL (technically, a URI reference).
-// The general form represented is:
-//
-//	scheme://[userinfo@]host/path[?query][#fragment]
-//
-// URLs that do not start with a slash after the scheme are interpreted as:
-//
-//	scheme:opaque[?query][#fragment]
-//
-// Note that the Path field is stored in decoded form: /%47%6f%2f becomes /Go/.
-// A consequence is that it is impossible to tell which slashes in the Path were
-// slashes in the raw URL and which were %2f. This distinction is rarely important,
-// but when it is, code must not use Path directly.
-//
-// Go 1.5 introduced the RawPath field to hold the encoded form of Path.
-// The Parse function sets both Path and RawPath in the URL it returns,
-// and URL's String method uses RawPath if it is a valid encoding of Path,
-// by calling the EncodedPath method.
-//
-// In earlier versions of Go, the more indirect workarounds were that an
-// HTTP server could consult req.RequestURI and an HTTP client could
-// construct a URL struct directly and set the Opaque field instead of Path.
-// These still work as well.
-type URL struct {
-	Scheme   string
-	Opaque   string    // encoded opaque data
-	User     *Userinfo // username and password information
-	Host     string    // host or host:port
-	Path     string
-	RawPath  string // encoded path hint (Go 1.5 and later only; see EscapedPath method)
-	RawQuery string // encoded query values, without '?'
-	Fragment string // fragment for references, without '#'
-}
-
-// User returns a Userinfo containing the provided username
-// and no password set.
-func User(username string) *Userinfo {
-	return &Userinfo{username, "", false}
-}
-
-// UserPassword returns a Userinfo containing the provided username
-// and password.
-// This functionality should only be used with legacy web sites.
-// RFC 2396 warns that interpreting Userinfo this way
-// ``is NOT RECOMMENDED, because the passing of authentication
-// information in clear text (such as URI) has proven to be a
-// security risk in almost every case where it has been used.''
-func UserPassword(username, password string) *Userinfo {
-	return &Userinfo{username, password, true}
-}
-
-// The Userinfo type is an immutable encapsulation of username and
-// password details for a URL. An existing Userinfo value is guaranteed
-// to have a username set (potentially empty, as allowed by RFC 2396),
-// and optionally a password.
-type Userinfo struct {
-	username    string
-	password    string
-	passwordSet bool
-}
-
-// Username returns the username.
-func (u *Userinfo) Username() string {
-	return u.username
-}
-
-// Password returns the password in case it is set, and whether it is set.
-func (u *Userinfo) Password() (string, bool) {
-	if u.passwordSet {
-		return u.password, true
-	}
-	return "", false
-}
-
-// String returns the encoded userinfo information in the standard form
-// of "username[:password]".
-func (u *Userinfo) String() string {
-	s := escape(u.username, encodeUserPassword)
-	if u.passwordSet {
-		s += ":" + escape(u.password, encodeUserPassword)
-	}
-	return s
-}
-
-// Maybe rawurl is of the form scheme:path.
-// (Scheme must be [a-zA-Z][a-zA-Z0-9+-.]*)
-// If so, return scheme, path; else return "", rawurl.
-func getscheme(rawurl string) (scheme, path string, err error) {
-	for i := 0; i < len(rawurl); i++ {
-		c := rawurl[i]
-		switch {
-		case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z':
-		// do nothing
-		case '0' <= c && c <= '9' || c == '+' || c == '-' || c == '.':
-			if i == 0 {
-				return "", rawurl, nil
-			}
-		case c == ':':
-			if i == 0 {
-				return "", "", errors.New("missing protocol scheme")
-			}
-			return rawurl[:i], rawurl[i+1:], nil
-		default:
-			// we have encountered an invalid character,
-			// so there is no valid scheme
-			return "", rawurl, nil
-		}
-	}
-	return "", rawurl, nil
-}
-
-// Maybe s is of the form t c u.
-// If so, return t, c u (or t, u if cutc == true).
-// If not, return s, "".
-func split(s string, c string, cutc bool) (string, string) {
-	i := strings.Index(s, c)
-	if i < 0 {
-		return s, ""
-	}
-	if cutc {
-		return s[:i], s[i+len(c):]
-	}
-	return s[:i], s[i:]
-}
-
-// Parse parses rawurl into a URL structure.
-// The rawurl may be relative or absolute.
-func Parse(rawurl string) (url *URL, err error) {
-	// Cut off #frag
-	u, frag := split(rawurl, "#", true)
-	if url, err = parse(u, false); err != nil {
-		return nil, err
-	}
-	if frag == "" {
-		return url, nil
-	}
-	if url.Fragment, err = unescape(frag, encodeFragment); err != nil {
-		return nil, &Error{"parse", rawurl, err}
-	}
-	return url, nil
-}
-
-// ParseRequestURI parses rawurl into a URL structure.  It assumes that
-// rawurl was received in an HTTP request, so the rawurl is interpreted
-// only as an absolute URI or an absolute path.
-// The string rawurl is assumed not to have a #fragment suffix.
-// (Web browsers strip #fragment before sending the URL to a web server.)
-func ParseRequestURI(rawurl string) (url *URL, err error) {
-	return parse(rawurl, true)
-}
-
-// parse parses a URL from a string in one of two contexts.  If
-// viaRequest is true, the URL is assumed to have arrived via an HTTP request,
-// in which case only absolute URLs or path-absolute relative URLs are allowed.
-// If viaRequest is false, all forms of relative URLs are allowed.
-func parse(rawurl string, viaRequest bool) (url *URL, err error) {
-	var rest string
-
-	if rawurl == "" && viaRequest {
-		err = errors.New("empty url")
-		goto Error
-	}
-	url = new(URL)
-
-	if rawurl == "*" {
-		url.Path = "*"
-		return
-	}
-
-	// Split off possible leading "http:", "mailto:", etc.
-	// Cannot contain escaped characters.
-	if url.Scheme, rest, err = getscheme(rawurl); err != nil {
-		goto Error
-	}
-	url.Scheme = strings.ToLower(url.Scheme)
-
-	rest, url.RawQuery = split(rest, "?", true)
-
-	if !strings.HasPrefix(rest, "/") {
-		if url.Scheme != "" {
-			// We consider rootless paths per RFC 3986 as opaque.
-			url.Opaque = rest
-			return url, nil
-		}
-		if viaRequest {
-			err = errors.New("invalid URI for request")
-			goto Error
-		}
-	}
-
-	if (url.Scheme != "" || !viaRequest && !strings.HasPrefix(rest, "///")) && strings.HasPrefix(rest, "//") {
-		var authority string
-		authority, rest = split(rest[2:], "/", false)
-		url.User, url.Host, err = parseAuthority(authority)
-		if err != nil {
-			goto Error
-		}
-	}
-	if url.Path, err = unescape(rest, encodePath); err != nil {
-		goto Error
-	}
-	// RawPath is a hint as to the encoding of Path to use
-	// in url.EncodedPath. If that method already gets the
-	// right answer without RawPath, leave it empty.
-	// This will help make sure that people don't rely on it in general.
-	if url.EscapedPath() != rest && validEncodedPath(rest) {
-		url.RawPath = rest
-	}
-	return url, nil
-
-Error:
-	return nil, &Error{"parse", rawurl, err}
-}
-
-func parseAuthority(authority string) (user *Userinfo, host string, err error) {
-	i := strings.LastIndex(authority, "@")
-	if i < 0 {
-		host, err = parseHost(authority)
-	} else {
-		host, err = parseHost(authority[i+1:])
-	}
-	if err != nil {
-		return nil, "", err
-	}
-	if i < 0 {
-		return nil, host, nil
-	}
-	userinfo := authority[:i]
-	if strings.Index(userinfo, ":") < 0 {
-		if userinfo, err = unescape(userinfo, encodeUserPassword); err != nil {
-			return nil, "", err
-		}
-		user = User(userinfo)
-	} else {
-		username, password := split(userinfo, ":", true)
-		if username, err = unescape(username, encodeUserPassword); err != nil {
-			return nil, "", err
-		}
-		if password, err = unescape(password, encodeUserPassword); err != nil {
-			return nil, "", err
-		}
-		user = UserPassword(username, password)
-	}
-	return user, host, nil
-}
-
-// parseHost parses host as an authority without user
-// information. That is, as host[:port].
-func parseHost(host string) (string, error) {
-	litOrName := host
-	if strings.HasPrefix(host, "[") {
-		// Parse an IP-Literal in RFC 3986 and RFC 6874.
-		// E.g., "[fe80::1], "[fe80::1%25en0]"
-		//
-		// RFC 4007 defines "%" as a delimiter character in
-		// the textual representation of IPv6 addresses.
-		// Per RFC 6874, in URIs that "%" is encoded as "%25".
-		i := strings.LastIndex(host, "]")
-		if i < 0 {
-			return "", errors.New("missing ']' in host")
-		}
-		colonPort := host[i+1:]
-		if !validOptionalPort(colonPort) {
-			return "", fmt.Errorf("invalid port %q after host", colonPort)
-		}
-		// Parse a host subcomponent without a ZoneID in RFC
-		// 6874 because the ZoneID is allowed to use the
-		// percent encoded form.
-		j := strings.Index(host[:i], "%25")
-		if j < 0 {
-			litOrName = host[1:i]
-		} else {
-			litOrName = host[1:j]
-		}
-	}
-
-	// A URI containing an IP-Literal without a ZoneID or
-	// IPv4address in RFC 3986 and RFC 6847 must not be
-	// percent-encoded.
-	//
-	// A URI containing a DNS registered name in RFC 3986 is
-	// allowed to be percent-encoded, though we don't use it for
-	// now to avoid messing up with the gap between allowed
-	// characters in URI and allowed characters in DNS.
-	// See golang.org/issue/7991.
-	if strings.Contains(litOrName, "%") {
-		return "", errors.New("percent-encoded characters in host")
-	}
-	var err error
-	if host, err = unescape(host, encodeHost); err != nil {
-		return "", err
-	}
-	return host, nil
-}
-
-// EscapedPath returns the escaped form of u.Path.
-// In general there are multiple possible escaped forms of any path.
-// EscapedPath returns u.RawPath when it is a valid escaping of u.Path.
-// Otherwise EscapedPath ignores u.RawPath and computes an escaped
-// form on its own.
-// The String and RequestURI methods use EscapedPath to construct
-// their results.
-// In general, code should call EscapedPath instead of
-// reading u.RawPath directly.
-func (u *URL) EscapedPath() string {
-	if u.RawPath != "" && validEncodedPath(u.RawPath) {
-		p, err := unescape(u.RawPath, encodePath)
-		if err == nil && p == u.Path {
-			return u.RawPath
-		}
-	}
-	if u.Path == "*" {
-		return "*" // don't escape (Issue 11202)
-	}
-	return escape(u.Path, encodePath)
-}
-
-// validEncodedPath reports whether s is a valid encoded path.
-// It must not contain any bytes that require escaping during path encoding.
-func validEncodedPath(s string) bool {
-	for i := 0; i < len(s); i++ {
-		// RFC 3986, Appendix A.
-		// pchar = unreserved / pct-encoded / sub-delims / ":" / "@".
-		// shouldEscape is not quite compliant with the RFC,
-		// so we check the sub-delims ourselves and let
-		// shouldEscape handle the others.
-		switch s[i] {
-		case '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=', ':', '@':
-			// ok
-		case '[', ']':
-			// ok - not specified in RFC 3986 but left alone by modern browsers
-		case '%':
-			// ok - percent encoded, will decode
-		default:
-			if shouldEscape(s[i], encodePath) {
-				return false
-			}
-		}
-	}
-	return true
-}
-
-// validOptionalPort reports whether port is either an empty string
-// or matches /^:\d+$/
-func validOptionalPort(port string) bool {
-	if port == "" {
-		return true
-	}
-	if port[0] != ':' || len(port) == 1 {
-		return false
-	}
-	for _, b := range port[1:] {
-		if b < '0' || b > '9' {
-			return false
-		}
-	}
-	return true
-}
-
-// String reassembles the URL into a valid URL string.
-// The general form of the result is one of:
-//
-//	scheme:opaque?query#fragment
-//	scheme://userinfo@host/path?query#fragment
-//
-// If u.Opaque is non-empty, String uses the first form;
-// otherwise it uses the second form.
-// To obtain the path, String uses u.EncodedPath().
-//
-// In the second form, the following rules apply:
-//	- if u.Scheme is empty, scheme: is omitted.
-//	- if u.User is nil, userinfo@ is omitted.
-//	- if u.Host is empty, host/ is omitted.
-//	- if u.Scheme and u.Host are empty and u.User is nil,
-//	   the entire scheme://userinfo@host/ is omitted.
-//	- if u.Host is non-empty and u.Path begins with a /,
-//	   the form host/path does not add its own /.
-//	- if u.RawQuery is empty, ?query is omitted.
-//	- if u.Fragment is empty, #fragment is omitted.
-func (u *URL) String() string {
-	var buf bytes.Buffer
-	if u.Scheme != "" {
-		buf.WriteString(u.Scheme)
-		buf.WriteByte(':')
-	}
-	if u.Opaque != "" {
-		buf.WriteString(u.Opaque)
-	} else {
-		if u.Scheme != "" || u.Host != "" || u.User != nil {
-			buf.WriteString("//")
-			if ui := u.User; ui != nil {
-				buf.WriteString(ui.String())
-				buf.WriteByte('@')
-			}
-			if h := u.Host; h != "" {
-				buf.WriteString(escape(h, encodeHost))
-			}
-		}
-		path := u.EscapedPath()
-		if path != "" && path[0] != '/' && u.Host != "" {
-			buf.WriteByte('/')
-		}
-		buf.WriteString(path)
-	}
-	if u.RawQuery != "" {
-		buf.WriteByte('?')
-		buf.WriteString(u.RawQuery)
-	}
-	if u.Fragment != "" {
-		buf.WriteByte('#')
-		buf.WriteString(escape(u.Fragment, encodeFragment))
-	}
-	return buf.String()
-}
-
-// Values maps a string key to a list of values.
-// It is typically used for query parameters and form values.
-// Unlike in the http.Header map, the keys in a Values map
-// are case-sensitive.
-type Values map[string][]string
-
-// Get gets the first value associated with the given key.
-// If there are no values associated with the key, Get returns
-// the empty string. To access multiple values, use the map
-// directly.
-func (v Values) Get(key string) string {
-	if v == nil {
-		return ""
-	}
-	vs, ok := v[key]
-	if !ok || len(vs) == 0 {
-		return ""
-	}
-	return vs[0]
-}
-
-// Set sets the key to value. It replaces any existing
-// values.
-func (v Values) Set(key, value string) {
-	v[key] = []string{value}
-}
-
-// Add adds the value to key. It appends to any existing
-// values associated with key.
-func (v Values) Add(key, value string) {
-	v[key] = append(v[key], value)
-}
-
-// Del deletes the values associated with key.
-func (v Values) Del(key string) {
-	delete(v, key)
-}
-
-// ParseQuery parses the URL-encoded query string and returns
-// a map listing the values specified for each key.
-// ParseQuery always returns a non-nil map containing all the
-// valid query parameters found; err describes the first decoding error
-// encountered, if any.
-func ParseQuery(query string) (m Values, err error) {
-	m = make(Values)
-	err = parseQuery(m, query)
-	return
-}
-
-func parseQuery(m Values, query string) (err error) {
-	for query != "" {
-		key := query
-		if i := strings.IndexAny(key, "&;"); i >= 0 {
-			key, query = key[:i], key[i+1:]
-		} else {
-			query = ""
-		}
-		if key == "" {
-			continue
-		}
-		value := ""
-		if i := strings.Index(key, "="); i >= 0 {
-			key, value = key[:i], key[i+1:]
-		}
-		key, err1 := QueryUnescape(key)
-		if err1 != nil {
-			if err == nil {
-				err = err1
-			}
-			continue
-		}
-		value, err1 = QueryUnescape(value)
-		if err1 != nil {
-			if err == nil {
-				err = err1
-			}
-			continue
-		}
-		m[key] = append(m[key], value)
-	}
-	return err
-}
-
-// Encode encodes the values into ``URL encoded'' form
-// ("bar=baz&foo=quux") sorted by key.
-func (v Values) Encode() string {
-	if v == nil {
-		return ""
-	}
-	var buf bytes.Buffer
-	keys := make([]string, 0, len(v))
-	for k := range v {
-		keys = append(keys, k)
-	}
-	sort.Strings(keys)
-	for _, k := range keys {
-		vs := v[k]
-		prefix := QueryEscape(k) + "="
-		for _, v := range vs {
-			if buf.Len() > 0 {
-				buf.WriteByte('&')
-			}
-			buf.WriteString(prefix)
-			buf.WriteString(QueryEscape(v))
-		}
-	}
-	return buf.String()
-}
-
-// resolvePath applies special path segments from refs and applies
-// them to base, per RFC 3986.
-func resolvePath(base, ref string) string {
-	var full string
-	if ref == "" {
-		full = base
-	} else if ref[0] != '/' {
-		i := strings.LastIndex(base, "/")
-		full = base[:i+1] + ref
-	} else {
-		full = ref
-	}
-	if full == "" {
-		return ""
-	}
-	var dst []string
-	src := strings.Split(full, "/")
-	for _, elem := range src {
-		switch elem {
-		case ".":
-			// drop
-		case "..":
-			if len(dst) > 0 {
-				dst = dst[:len(dst)-1]
-			}
-		default:
-			dst = append(dst, elem)
-		}
-	}
-	if last := src[len(src)-1]; last == "." || last == ".." {
-		// Add final slash to the joined path.
-		dst = append(dst, "")
-	}
-	return "/" + strings.TrimLeft(strings.Join(dst, "/"), "/")
-}
-
-// IsAbs reports whether the URL is absolute.
-func (u *URL) IsAbs() bool {
-	return u.Scheme != ""
-}
-
-// Parse parses a URL in the context of the receiver.  The provided URL
-// may be relative or absolute.  Parse returns nil, err on parse
-// failure, otherwise its return value is the same as ResolveReference.
-func (u *URL) Parse(ref string) (*URL, error) {
-	refurl, err := Parse(ref)
-	if err != nil {
-		return nil, err
-	}
-	return u.ResolveReference(refurl), nil
-}
-
-// ResolveReference resolves a URI reference to an absolute URI from
-// an absolute base URI, per RFC 3986 Section 5.2.  The URI reference
-// may be relative or absolute.  ResolveReference always returns a new
-// URL instance, even if the returned URL is identical to either the
-// base or reference. If ref is an absolute URL, then ResolveReference
-// ignores base and returns a copy of ref.
-func (u *URL) ResolveReference(ref *URL) *URL {
-	url := *ref
-	if ref.Scheme == "" {
-		url.Scheme = u.Scheme
-	}
-	if ref.Scheme != "" || ref.Host != "" || ref.User != nil {
-		// The "absoluteURI" or "net_path" cases.
-		url.Path = resolvePath(ref.Path, "")
-		return &url
-	}
-	if ref.Opaque != "" {
-		url.User = nil
-		url.Host = ""
-		url.Path = ""
-		return &url
-	}
-	if ref.Path == "" {
-		if ref.RawQuery == "" {
-			url.RawQuery = u.RawQuery
-			if ref.Fragment == "" {
-				url.Fragment = u.Fragment
-			}
-		}
-	}
-	// The "abs_path" or "rel_path" cases.
-	url.Host = u.Host
-	url.User = u.User
-	url.Path = resolvePath(u.Path, ref.Path)
-	return &url
-}
-
-// Query parses RawQuery and returns the corresponding values.
-func (u *URL) Query() Values {
-	v, _ := ParseQuery(u.RawQuery)
-	return v
-}
-
-// RequestURI returns the encoded path?query or opaque?query
-// string that would be used in an HTTP request for u.
-func (u *URL) RequestURI() string {
-	result := u.Opaque
-	if result == "" {
-		result = u.EscapedPath()
-		if result == "" {
-			result = "/"
-		}
-	} else {
-		if strings.HasPrefix(result, "//") {
-			result = u.Scheme + ":" + result
-		}
-	}
-	if u.RawQuery != "" {
-		result += "?" + u.RawQuery
-	}
-	return result
-}
diff --git a/third_party/gofrontend/libgo/go/net/url/url_test.go b/third_party/gofrontend/libgo/go/net/url/url_test.go
deleted file mode 100644
index ff6e9e4..0000000
--- a/third_party/gofrontend/libgo/go/net/url/url_test.go
+++ /dev/null
@@ -1,1231 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package url
-
-import (
-	"fmt"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-type URLTest struct {
-	in        string
-	out       *URL   // expected parse; RawPath="" means same as Path
-	roundtrip string // expected result of reserializing the URL; empty means same as "in".
-}
-
-var urltests = []URLTest{
-	// no path
-	{
-		"http://www.google.com",
-		&URL{
-			Scheme: "http",
-			Host:   "www.google.com",
-		},
-		"",
-	},
-	// path
-	{
-		"http://www.google.com/",
-		&URL{
-			Scheme: "http",
-			Host:   "www.google.com",
-			Path:   "/",
-		},
-		"",
-	},
-	// path with hex escaping
-	{
-		"http://www.google.com/file%20one%26two",
-		&URL{
-			Scheme:  "http",
-			Host:    "www.google.com",
-			Path:    "/file one&two",
-			RawPath: "/file%20one%26two",
-		},
-		"",
-	},
-	// user
-	{
-		"ftp://webmaster@www.google.com/",
-		&URL{
-			Scheme: "ftp",
-			User:   User("webmaster"),
-			Host:   "www.google.com",
-			Path:   "/",
-		},
-		"",
-	},
-	// escape sequence in username
-	{
-		"ftp://john%20doe@www.google.com/",
-		&URL{
-			Scheme: "ftp",
-			User:   User("john doe"),
-			Host:   "www.google.com",
-			Path:   "/",
-		},
-		"ftp://john%20doe@www.google.com/",
-	},
-	// query
-	{
-		"http://www.google.com/?q=go+language",
-		&URL{
-			Scheme:   "http",
-			Host:     "www.google.com",
-			Path:     "/",
-			RawQuery: "q=go+language",
-		},
-		"",
-	},
-	// query with hex escaping: NOT parsed
-	{
-		"http://www.google.com/?q=go%20language",
-		&URL{
-			Scheme:   "http",
-			Host:     "www.google.com",
-			Path:     "/",
-			RawQuery: "q=go%20language",
-		},
-		"",
-	},
-	// %20 outside query
-	{
-		"http://www.google.com/a%20b?q=c+d",
-		&URL{
-			Scheme:   "http",
-			Host:     "www.google.com",
-			Path:     "/a b",
-			RawQuery: "q=c+d",
-		},
-		"",
-	},
-	// path without leading /, so no parsing
-	{
-		"http:www.google.com/?q=go+language",
-		&URL{
-			Scheme:   "http",
-			Opaque:   "www.google.com/",
-			RawQuery: "q=go+language",
-		},
-		"http:www.google.com/?q=go+language",
-	},
-	// path without leading /, so no parsing
-	{
-		"http:%2f%2fwww.google.com/?q=go+language",
-		&URL{
-			Scheme:   "http",
-			Opaque:   "%2f%2fwww.google.com/",
-			RawQuery: "q=go+language",
-		},
-		"http:%2f%2fwww.google.com/?q=go+language",
-	},
-	// non-authority with path
-	{
-		"mailto:/webmaster@golang.org",
-		&URL{
-			Scheme: "mailto",
-			Path:   "/webmaster@golang.org",
-		},
-		"mailto:///webmaster@golang.org", // unfortunate compromise
-	},
-	// non-authority
-	{
-		"mailto:webmaster@golang.org",
-		&URL{
-			Scheme: "mailto",
-			Opaque: "webmaster@golang.org",
-		},
-		"",
-	},
-	// unescaped :// in query should not create a scheme
-	{
-		"/foo?query=http://bad",
-		&URL{
-			Path:     "/foo",
-			RawQuery: "query=http://bad",
-		},
-		"",
-	},
-	// leading // without scheme should create an authority
-	{
-		"//foo",
-		&URL{
-			Host: "foo",
-		},
-		"",
-	},
-	// leading // without scheme, with userinfo, path, and query
-	{
-		"//user@foo/path?a=b",
-		&URL{
-			User:     User("user"),
-			Host:     "foo",
-			Path:     "/path",
-			RawQuery: "a=b",
-		},
-		"",
-	},
-	// Three leading slashes isn't an authority, but doesn't return an error.
-	// (We can't return an error, as this code is also used via
-	// ServeHTTP -> ReadRequest -> Parse, which is arguably a
-	// different URL parsing context, but currently shares the
-	// same codepath)
-	{
-		"///threeslashes",
-		&URL{
-			Path: "///threeslashes",
-		},
-		"",
-	},
-	{
-		"http://user:password@google.com",
-		&URL{
-			Scheme: "http",
-			User:   UserPassword("user", "password"),
-			Host:   "google.com",
-		},
-		"http://user:password@google.com",
-	},
-	// unescaped @ in username should not confuse host
-	{
-		"http://j@ne:password@google.com",
-		&URL{
-			Scheme: "http",
-			User:   UserPassword("j@ne", "password"),
-			Host:   "google.com",
-		},
-		"http://j%40ne:password@google.com",
-	},
-	// unescaped @ in password should not confuse host
-	{
-		"http://jane:p@ssword@google.com",
-		&URL{
-			Scheme: "http",
-			User:   UserPassword("jane", "p@ssword"),
-			Host:   "google.com",
-		},
-		"http://jane:p%40ssword@google.com",
-	},
-	{
-		"http://j@ne:password@google.com/p@th?q=@go",
-		&URL{
-			Scheme:   "http",
-			User:     UserPassword("j@ne", "password"),
-			Host:     "google.com",
-			Path:     "/p@th",
-			RawQuery: "q=@go",
-		},
-		"http://j%40ne:password@google.com/p@th?q=@go",
-	},
-	{
-		"http://www.google.com/?q=go+language#foo",
-		&URL{
-			Scheme:   "http",
-			Host:     "www.google.com",
-			Path:     "/",
-			RawQuery: "q=go+language",
-			Fragment: "foo",
-		},
-		"",
-	},
-	{
-		"http://www.google.com/?q=go+language#foo%26bar",
-		&URL{
-			Scheme:   "http",
-			Host:     "www.google.com",
-			Path:     "/",
-			RawQuery: "q=go+language",
-			Fragment: "foo&bar",
-		},
-		"http://www.google.com/?q=go+language#foo&bar",
-	},
-	{
-		"file:///home/adg/rabbits",
-		&URL{
-			Scheme: "file",
-			Host:   "",
-			Path:   "/home/adg/rabbits",
-		},
-		"file:///home/adg/rabbits",
-	},
-	// "Windows" paths are no exception to the rule.
-	// See golang.org/issue/6027, especially comment #9.
-	{
-		"file:///C:/FooBar/Baz.txt",
-		&URL{
-			Scheme: "file",
-			Host:   "",
-			Path:   "/C:/FooBar/Baz.txt",
-		},
-		"file:///C:/FooBar/Baz.txt",
-	},
-	// case-insensitive scheme
-	{
-		"MaIlTo:webmaster@golang.org",
-		&URL{
-			Scheme: "mailto",
-			Opaque: "webmaster@golang.org",
-		},
-		"mailto:webmaster@golang.org",
-	},
-	// Relative path
-	{
-		"a/b/c",
-		&URL{
-			Path: "a/b/c",
-		},
-		"a/b/c",
-	},
-	// escaped '?' in username and password
-	{
-		"http://%3Fam:pa%3Fsword@google.com",
-		&URL{
-			Scheme: "http",
-			User:   UserPassword("?am", "pa?sword"),
-			Host:   "google.com",
-		},
-		"",
-	},
-	// host subcomponent; IPv4 address in RFC 3986
-	{
-		"http://192.168.0.1/",
-		&URL{
-			Scheme: "http",
-			Host:   "192.168.0.1",
-			Path:   "/",
-		},
-		"",
-	},
-	// host and port subcomponents; IPv4 address in RFC 3986
-	{
-		"http://192.168.0.1:8080/",
-		&URL{
-			Scheme: "http",
-			Host:   "192.168.0.1:8080",
-			Path:   "/",
-		},
-		"",
-	},
-	// host subcomponent; IPv6 address in RFC 3986
-	{
-		"http://[fe80::1]/",
-		&URL{
-			Scheme: "http",
-			Host:   "[fe80::1]",
-			Path:   "/",
-		},
-		"",
-	},
-	// host and port subcomponents; IPv6 address in RFC 3986
-	{
-		"http://[fe80::1]:8080/",
-		&URL{
-			Scheme: "http",
-			Host:   "[fe80::1]:8080",
-			Path:   "/",
-		},
-		"",
-	},
-	// host subcomponent; IPv6 address with zone identifier in RFC 6847
-	{
-		"http://[fe80::1%25en0]/", // alphanum zone identifier
-		&URL{
-			Scheme: "http",
-			Host:   "[fe80::1%en0]",
-			Path:   "/",
-		},
-		"",
-	},
-	// host and port subcomponents; IPv6 address with zone identifier in RFC 6847
-	{
-		"http://[fe80::1%25en0]:8080/", // alphanum zone identifier
-		&URL{
-			Scheme: "http",
-			Host:   "[fe80::1%en0]:8080",
-			Path:   "/",
-		},
-		"",
-	},
-	// host subcomponent; IPv6 address with zone identifier in RFC 6847
-	{
-		"http://[fe80::1%25%65%6e%301-._~]/", // percent-encoded+unreserved zone identifier
-		&URL{
-			Scheme: "http",
-			Host:   "[fe80::1%en01-._~]",
-			Path:   "/",
-		},
-		"http://[fe80::1%25en01-._~]/",
-	},
-	// host and port subcomponents; IPv6 address with zone identifier in RFC 6847
-	{
-		"http://[fe80::1%25%65%6e%301-._~]:8080/", // percent-encoded+unreserved zone identifier
-		&URL{
-			Scheme: "http",
-			Host:   "[fe80::1%en01-._~]:8080",
-			Path:   "/",
-		},
-		"http://[fe80::1%25en01-._~]:8080/",
-	},
-	// alternate escapings of path survive round trip
-	{
-		"http://rest.rsc.io/foo%2fbar/baz%2Fquux?alt=media",
-		&URL{
-			Scheme:   "http",
-			Host:     "rest.rsc.io",
-			Path:     "/foo/bar/baz/quux",
-			RawPath:  "/foo%2fbar/baz%2Fquux",
-			RawQuery: "alt=media",
-		},
-		"",
-	},
-	// issue 12036
-	{
-		"mysql://a,b,c/bar",
-		&URL{
-			Scheme: "mysql",
-			Host:   "a,b,c",
-			Path:   "/bar",
-		},
-		"",
-	},
-	// worst case host, still round trips
-	{
-		"scheme://!$&'()*+,;=hello!:port/path",
-		&URL{
-			Scheme: "scheme",
-			Host:   "!$&'()*+,;=hello!:port",
-			Path:   "/path",
-		},
-		"",
-	},
-	// worst case path, still round trips
-	{
-		"http://host/!$&'()*+,;=:@[hello]",
-		&URL{
-			Scheme:  "http",
-			Host:    "host",
-			Path:    "/!$&'()*+,;=:@[hello]",
-			RawPath: "/!$&'()*+,;=:@[hello]",
-		},
-		"",
-	},
-	// golang.org/issue/5684
-	{
-		"http://example.com/oid/[order_id]",
-		&URL{
-			Scheme:  "http",
-			Host:    "example.com",
-			Path:    "/oid/[order_id]",
-			RawPath: "/oid/[order_id]",
-		},
-		"",
-	},
-}
-
-// more useful string for debugging than fmt's struct printer
-func ufmt(u *URL) string {
-	var user, pass interface{}
-	if u.User != nil {
-		user = u.User.Username()
-		if p, ok := u.User.Password(); ok {
-			pass = p
-		}
-	}
-	return fmt.Sprintf("opaque=%q, scheme=%q, user=%#v, pass=%#v, host=%q, path=%q, rawpath=%q, rawq=%q, frag=%q",
-		u.Opaque, u.Scheme, user, pass, u.Host, u.Path, u.RawPath, u.RawQuery, u.Fragment)
-}
-
-func DoTest(t *testing.T, parse func(string) (*URL, error), name string, tests []URLTest) {
-	for _, tt := range tests {
-		u, err := parse(tt.in)
-		if err != nil {
-			t.Errorf("%s(%q) returned error %s", name, tt.in, err)
-			continue
-		}
-		if !reflect.DeepEqual(u, tt.out) {
-			t.Errorf("%s(%q):\n\thave %v\n\twant %v\n",
-				name, tt.in, ufmt(u), ufmt(tt.out))
-		}
-	}
-}
-
-func BenchmarkString(b *testing.B) {
-	b.StopTimer()
-	b.ReportAllocs()
-	for _, tt := range urltests {
-		u, err := Parse(tt.in)
-		if err != nil {
-			b.Errorf("Parse(%q) returned error %s", tt.in, err)
-			continue
-		}
-		if tt.roundtrip == "" {
-			continue
-		}
-		b.StartTimer()
-		var g string
-		for i := 0; i < b.N; i++ {
-			g = u.String()
-		}
-		b.StopTimer()
-		if w := tt.roundtrip; g != w {
-			b.Errorf("Parse(%q).String() == %q, want %q", tt.in, g, w)
-		}
-	}
-}
-
-func TestParse(t *testing.T) {
-	DoTest(t, Parse, "Parse", urltests)
-}
-
-const pathThatLooksSchemeRelative = "//not.a.user@not.a.host/just/a/path"
-
-var parseRequestURLTests = []struct {
-	url           string
-	expectedValid bool
-}{
-	{"http://foo.com", true},
-	{"http://foo.com/", true},
-	{"http://foo.com/path", true},
-	{"/", true},
-	{pathThatLooksSchemeRelative, true},
-	{"//not.a.user@%66%6f%6f.com/just/a/path/also", true},
-	{"*", true},
-	{"http://192.168.0.1/", true},
-	{"http://192.168.0.1:8080/", true},
-	{"http://[fe80::1]/", true},
-	{"http://[fe80::1]:8080/", true},
-
-	// Tests exercising RFC 6874 compliance:
-	{"http://[fe80::1%25en0]/", true},                 // with alphanum zone identifier
-	{"http://[fe80::1%25en0]:8080/", true},            // with alphanum zone identifier
-	{"http://[fe80::1%25%65%6e%301-._~]/", true},      // with percent-encoded+unreserved zone identifier
-	{"http://[fe80::1%25%65%6e%301-._~]:8080/", true}, // with percent-encoded+unreserved zone identifier
-
-	{"foo.html", false},
-	{"../dir/", false},
-	{"http://192.168.0.%31/", false},
-	{"http://192.168.0.%31:8080/", false},
-	{"http://[fe80::%31]/", false},
-	{"http://[fe80::%31]:8080/", false},
-	{"http://[fe80::%31%25en0]/", false},
-	{"http://[fe80::%31%25en0]:8080/", false},
-
-	// These two cases are valid as textual representations as
-	// described in RFC 4007, but are not valid as address
-	// literals with IPv6 zone identifiers in URIs as described in
-	// RFC 6874.
-	{"http://[fe80::1%en0]/", false},
-	{"http://[fe80::1%en0]:8080/", false},
-}
-
-func TestParseRequestURI(t *testing.T) {
-	for _, test := range parseRequestURLTests {
-		_, err := ParseRequestURI(test.url)
-		valid := err == nil
-		if valid != test.expectedValid {
-			t.Errorf("Expected valid=%v for %q; got %v", test.expectedValid, test.url, valid)
-		}
-	}
-
-	url, err := ParseRequestURI(pathThatLooksSchemeRelative)
-	if err != nil {
-		t.Fatalf("Unexpected error %v", err)
-	}
-	if url.Path != pathThatLooksSchemeRelative {
-		t.Errorf("Expected path %q; got %q", pathThatLooksSchemeRelative, url.Path)
-	}
-}
-
-func DoTestString(t *testing.T, parse func(string) (*URL, error), name string, tests []URLTest) {
-	for _, tt := range tests {
-		u, err := parse(tt.in)
-		if err != nil {
-			t.Errorf("%s(%q) returned error %s", name, tt.in, err)
-			continue
-		}
-		expected := tt.in
-		if len(tt.roundtrip) > 0 {
-			expected = tt.roundtrip
-		}
-		s := u.String()
-		if s != expected {
-			t.Errorf("%s(%q).String() == %q (expected %q)", name, tt.in, s, expected)
-		}
-	}
-}
-
-func TestURLString(t *testing.T) {
-	DoTestString(t, Parse, "Parse", urltests)
-
-	// no leading slash on path should prepend
-	// slash on String() call
-	noslash := URLTest{
-		"http://www.google.com/search",
-		&URL{
-			Scheme: "http",
-			Host:   "www.google.com",
-			Path:   "search",
-		},
-		"",
-	}
-	s := noslash.out.String()
-	if s != noslash.in {
-		t.Errorf("Expected %s; go %s", noslash.in, s)
-	}
-}
-
-type EscapeTest struct {
-	in  string
-	out string
-	err error
-}
-
-var unescapeTests = []EscapeTest{
-	{
-		"",
-		"",
-		nil,
-	},
-	{
-		"abc",
-		"abc",
-		nil,
-	},
-	{
-		"1%41",
-		"1A",
-		nil,
-	},
-	{
-		"1%41%42%43",
-		"1ABC",
-		nil,
-	},
-	{
-		"%4a",
-		"J",
-		nil,
-	},
-	{
-		"%6F",
-		"o",
-		nil,
-	},
-	{
-		"%", // not enough characters after %
-		"",
-		EscapeError("%"),
-	},
-	{
-		"%a", // not enough characters after %
-		"",
-		EscapeError("%a"),
-	},
-	{
-		"%1", // not enough characters after %
-		"",
-		EscapeError("%1"),
-	},
-	{
-		"123%45%6", // not enough characters after %
-		"",
-		EscapeError("%6"),
-	},
-	{
-		"%zzzzz", // invalid hex digits
-		"",
-		EscapeError("%zz"),
-	},
-}
-
-func TestUnescape(t *testing.T) {
-	for _, tt := range unescapeTests {
-		actual, err := QueryUnescape(tt.in)
-		if actual != tt.out || (err != nil) != (tt.err != nil) {
-			t.Errorf("QueryUnescape(%q) = %q, %s; want %q, %s", tt.in, actual, err, tt.out, tt.err)
-		}
-	}
-}
-
-var escapeTests = []EscapeTest{
-	{
-		"",
-		"",
-		nil,
-	},
-	{
-		"abc",
-		"abc",
-		nil,
-	},
-	{
-		"one two",
-		"one+two",
-		nil,
-	},
-	{
-		"10%",
-		"10%25",
-		nil,
-	},
-	{
-		" ?&=#+%!<>#\"{}|\\^[]`☺\t:/@$'()*,;",
-		"+%3F%26%3D%23%2B%25%21%3C%3E%23%22%7B%7D%7C%5C%5E%5B%5D%60%E2%98%BA%09%3A%2F%40%24%27%28%29%2A%2C%3B",
-		nil,
-	},
-}
-
-func TestEscape(t *testing.T) {
-	for _, tt := range escapeTests {
-		actual := QueryEscape(tt.in)
-		if tt.out != actual {
-			t.Errorf("QueryEscape(%q) = %q, want %q", tt.in, actual, tt.out)
-		}
-
-		// for bonus points, verify that escape:unescape is an identity.
-		roundtrip, err := QueryUnescape(actual)
-		if roundtrip != tt.in || err != nil {
-			t.Errorf("QueryUnescape(%q) = %q, %s; want %q, %s", actual, roundtrip, err, tt.in, "[no error]")
-		}
-	}
-}
-
-//var userinfoTests = []UserinfoTest{
-//	{"user", "password", "user:password"},
-//	{"foo:bar", "~!@#$%^&*()_+{}|[]\\-=`:;'\"<>?,./",
-//		"foo%3Abar:~!%40%23$%25%5E&*()_+%7B%7D%7C%5B%5D%5C-=%60%3A;'%22%3C%3E?,.%2F"},
-//}
-
-type EncodeQueryTest struct {
-	m        Values
-	expected string
-}
-
-var encodeQueryTests = []EncodeQueryTest{
-	{nil, ""},
-	{Values{"q": {"puppies"}, "oe": {"utf8"}}, "oe=utf8&q=puppies"},
-	{Values{"q": {"dogs", "&", "7"}}, "q=dogs&q=%26&q=7"},
-	{Values{
-		"a": {"a1", "a2", "a3"},
-		"b": {"b1", "b2", "b3"},
-		"c": {"c1", "c2", "c3"},
-	}, "a=a1&a=a2&a=a3&b=b1&b=b2&b=b3&c=c1&c=c2&c=c3"},
-}
-
-func TestEncodeQuery(t *testing.T) {
-	for _, tt := range encodeQueryTests {
-		if q := tt.m.Encode(); q != tt.expected {
-			t.Errorf(`EncodeQuery(%+v) = %q, want %q`, tt.m, q, tt.expected)
-		}
-	}
-}
-
-var resolvePathTests = []struct {
-	base, ref, expected string
-}{
-	{"a/b", ".", "/a/"},
-	{"a/b", "c", "/a/c"},
-	{"a/b", "..", "/"},
-	{"a/", "..", "/"},
-	{"a/", "../..", "/"},
-	{"a/b/c", "..", "/a/"},
-	{"a/b/c", "../d", "/a/d"},
-	{"a/b/c", ".././d", "/a/d"},
-	{"a/b", "./..", "/"},
-	{"a/./b", ".", "/a/"},
-	{"a/../", ".", "/"},
-	{"a/.././b", "c", "/c"},
-}
-
-func TestResolvePath(t *testing.T) {
-	for _, test := range resolvePathTests {
-		got := resolvePath(test.base, test.ref)
-		if got != test.expected {
-			t.Errorf("For %q + %q got %q; expected %q", test.base, test.ref, got, test.expected)
-		}
-	}
-}
-
-var resolveReferenceTests = []struct {
-	base, rel, expected string
-}{
-	// Absolute URL references
-	{"http://foo.com?a=b", "https://bar.com/", "https://bar.com/"},
-	{"http://foo.com/", "https://bar.com/?a=b", "https://bar.com/?a=b"},
-	{"http://foo.com/bar", "mailto:foo@example.com", "mailto:foo@example.com"},
-
-	// Path-absolute references
-	{"http://foo.com/bar", "/baz", "http://foo.com/baz"},
-	{"http://foo.com/bar?a=b#f", "/baz", "http://foo.com/baz"},
-	{"http://foo.com/bar?a=b", "/baz?c=d", "http://foo.com/baz?c=d"},
-
-	// Scheme-relative
-	{"https://foo.com/bar?a=b", "//bar.com/quux", "https://bar.com/quux"},
-
-	// Path-relative references:
-
-	// ... current directory
-	{"http://foo.com", ".", "http://foo.com/"},
-	{"http://foo.com/bar", ".", "http://foo.com/"},
-	{"http://foo.com/bar/", ".", "http://foo.com/bar/"},
-
-	// ... going down
-	{"http://foo.com", "bar", "http://foo.com/bar"},
-	{"http://foo.com/", "bar", "http://foo.com/bar"},
-	{"http://foo.com/bar/baz", "quux", "http://foo.com/bar/quux"},
-
-	// ... going up
-	{"http://foo.com/bar/baz", "../quux", "http://foo.com/quux"},
-	{"http://foo.com/bar/baz", "../../../../../quux", "http://foo.com/quux"},
-	{"http://foo.com/bar", "..", "http://foo.com/"},
-	{"http://foo.com/bar/baz", "./..", "http://foo.com/"},
-	// ".." in the middle (issue 3560)
-	{"http://foo.com/bar/baz", "quux/dotdot/../tail", "http://foo.com/bar/quux/tail"},
-	{"http://foo.com/bar/baz", "quux/./dotdot/../tail", "http://foo.com/bar/quux/tail"},
-	{"http://foo.com/bar/baz", "quux/./dotdot/.././tail", "http://foo.com/bar/quux/tail"},
-	{"http://foo.com/bar/baz", "quux/./dotdot/./../tail", "http://foo.com/bar/quux/tail"},
-	{"http://foo.com/bar/baz", "quux/./dotdot/dotdot/././../../tail", "http://foo.com/bar/quux/tail"},
-	{"http://foo.com/bar/baz", "quux/./dotdot/dotdot/./.././../tail", "http://foo.com/bar/quux/tail"},
-	{"http://foo.com/bar/baz", "quux/./dotdot/dotdot/dotdot/./../../.././././tail", "http://foo.com/bar/quux/tail"},
-	{"http://foo.com/bar/baz", "quux/./dotdot/../dotdot/../dot/./tail/..", "http://foo.com/bar/quux/dot/"},
-
-	// Remove any dot-segments prior to forming the target URI.
-	// http://tools.ietf.org/html/rfc3986#section-5.2.4
-	{"http://foo.com/dot/./dotdot/../foo/bar", "../baz", "http://foo.com/dot/baz"},
-
-	// Triple dot isn't special
-	{"http://foo.com/bar", "...", "http://foo.com/..."},
-
-	// Fragment
-	{"http://foo.com/bar", ".#frag", "http://foo.com/#frag"},
-
-	// RFC 3986: Normal Examples
-	// http://tools.ietf.org/html/rfc3986#section-5.4.1
-	{"http://a/b/c/d;p?q", "g:h", "g:h"},
-	{"http://a/b/c/d;p?q", "g", "http://a/b/c/g"},
-	{"http://a/b/c/d;p?q", "./g", "http://a/b/c/g"},
-	{"http://a/b/c/d;p?q", "g/", "http://a/b/c/g/"},
-	{"http://a/b/c/d;p?q", "/g", "http://a/g"},
-	{"http://a/b/c/d;p?q", "//g", "http://g"},
-	{"http://a/b/c/d;p?q", "?y", "http://a/b/c/d;p?y"},
-	{"http://a/b/c/d;p?q", "g?y", "http://a/b/c/g?y"},
-	{"http://a/b/c/d;p?q", "#s", "http://a/b/c/d;p?q#s"},
-	{"http://a/b/c/d;p?q", "g#s", "http://a/b/c/g#s"},
-	{"http://a/b/c/d;p?q", "g?y#s", "http://a/b/c/g?y#s"},
-	{"http://a/b/c/d;p?q", ";x", "http://a/b/c/;x"},
-	{"http://a/b/c/d;p?q", "g;x", "http://a/b/c/g;x"},
-	{"http://a/b/c/d;p?q", "g;x?y#s", "http://a/b/c/g;x?y#s"},
-	{"http://a/b/c/d;p?q", "", "http://a/b/c/d;p?q"},
-	{"http://a/b/c/d;p?q", ".", "http://a/b/c/"},
-	{"http://a/b/c/d;p?q", "./", "http://a/b/c/"},
-	{"http://a/b/c/d;p?q", "..", "http://a/b/"},
-	{"http://a/b/c/d;p?q", "../", "http://a/b/"},
-	{"http://a/b/c/d;p?q", "../g", "http://a/b/g"},
-	{"http://a/b/c/d;p?q", "../..", "http://a/"},
-	{"http://a/b/c/d;p?q", "../../", "http://a/"},
-	{"http://a/b/c/d;p?q", "../../g", "http://a/g"},
-
-	// RFC 3986: Abnormal Examples
-	// http://tools.ietf.org/html/rfc3986#section-5.4.2
-	{"http://a/b/c/d;p?q", "../../../g", "http://a/g"},
-	{"http://a/b/c/d;p?q", "../../../../g", "http://a/g"},
-	{"http://a/b/c/d;p?q", "/./g", "http://a/g"},
-	{"http://a/b/c/d;p?q", "/../g", "http://a/g"},
-	{"http://a/b/c/d;p?q", "g.", "http://a/b/c/g."},
-	{"http://a/b/c/d;p?q", ".g", "http://a/b/c/.g"},
-	{"http://a/b/c/d;p?q", "g..", "http://a/b/c/g.."},
-	{"http://a/b/c/d;p?q", "..g", "http://a/b/c/..g"},
-	{"http://a/b/c/d;p?q", "./../g", "http://a/b/g"},
-	{"http://a/b/c/d;p?q", "./g/.", "http://a/b/c/g/"},
-	{"http://a/b/c/d;p?q", "g/./h", "http://a/b/c/g/h"},
-	{"http://a/b/c/d;p?q", "g/../h", "http://a/b/c/h"},
-	{"http://a/b/c/d;p?q", "g;x=1/./y", "http://a/b/c/g;x=1/y"},
-	{"http://a/b/c/d;p?q", "g;x=1/../y", "http://a/b/c/y"},
-	{"http://a/b/c/d;p?q", "g?y/./x", "http://a/b/c/g?y/./x"},
-	{"http://a/b/c/d;p?q", "g?y/../x", "http://a/b/c/g?y/../x"},
-	{"http://a/b/c/d;p?q", "g#s/./x", "http://a/b/c/g#s/./x"},
-	{"http://a/b/c/d;p?q", "g#s/../x", "http://a/b/c/g#s/../x"},
-
-	// Extras.
-	{"https://a/b/c/d;p?q", "//g?q", "https://g?q"},
-	{"https://a/b/c/d;p?q", "//g#s", "https://g#s"},
-	{"https://a/b/c/d;p?q", "//g/d/e/f?y#s", "https://g/d/e/f?y#s"},
-	{"https://a/b/c/d;p#s", "?y", "https://a/b/c/d;p?y"},
-	{"https://a/b/c/d;p?q#s", "?y", "https://a/b/c/d;p?y"},
-}
-
-func TestResolveReference(t *testing.T) {
-	mustParse := func(url string) *URL {
-		u, err := Parse(url)
-		if err != nil {
-			t.Fatalf("Expected URL to parse: %q, got error: %v", url, err)
-		}
-		return u
-	}
-	opaque := &URL{Scheme: "scheme", Opaque: "opaque"}
-	for _, test := range resolveReferenceTests {
-		base := mustParse(test.base)
-		rel := mustParse(test.rel)
-		url := base.ResolveReference(rel)
-		if url.String() != test.expected {
-			t.Errorf("URL(%q).ResolveReference(%q) == %q, got %q", test.base, test.rel, test.expected, url.String())
-		}
-		// Ensure that new instances are returned.
-		if base == url {
-			t.Errorf("Expected URL.ResolveReference to return new URL instance.")
-		}
-		// Test the convenience wrapper too.
-		url, err := base.Parse(test.rel)
-		if err != nil {
-			t.Errorf("URL(%q).Parse(%q) failed: %v", test.base, test.rel, err)
-		} else if url.String() != test.expected {
-			t.Errorf("URL(%q).Parse(%q) == %q, got %q", test.base, test.rel, test.expected, url.String())
-		} else if base == url {
-			// Ensure that new instances are returned for the wrapper too.
-			t.Errorf("Expected URL.Parse to return new URL instance.")
-		}
-		// Ensure Opaque resets the URL.
-		url = base.ResolveReference(opaque)
-		if *url != *opaque {
-			t.Errorf("ResolveReference failed to resolve opaque URL: want %#v, got %#v", url, opaque)
-		}
-		// Test the convenience wrapper with an opaque URL too.
-		url, err = base.Parse("scheme:opaque")
-		if err != nil {
-			t.Errorf(`URL(%q).Parse("scheme:opaque") failed: %v`, test.base, err)
-		} else if *url != *opaque {
-			t.Errorf("Parse failed to resolve opaque URL: want %#v, got %#v", url, opaque)
-		} else if base == url {
-			// Ensure that new instances are returned, again.
-			t.Errorf("Expected URL.Parse to return new URL instance.")
-		}
-	}
-}
-
-func TestQueryValues(t *testing.T) {
-	u, _ := Parse("http://x.com?foo=bar&bar=1&bar=2")
-	v := u.Query()
-	if len(v) != 2 {
-		t.Errorf("got %d keys in Query values, want 2", len(v))
-	}
-	if g, e := v.Get("foo"), "bar"; g != e {
-		t.Errorf("Get(foo) = %q, want %q", g, e)
-	}
-	// Case sensitive:
-	if g, e := v.Get("Foo"), ""; g != e {
-		t.Errorf("Get(Foo) = %q, want %q", g, e)
-	}
-	if g, e := v.Get("bar"), "1"; g != e {
-		t.Errorf("Get(bar) = %q, want %q", g, e)
-	}
-	if g, e := v.Get("baz"), ""; g != e {
-		t.Errorf("Get(baz) = %q, want %q", g, e)
-	}
-	v.Del("bar")
-	if g, e := v.Get("bar"), ""; g != e {
-		t.Errorf("second Get(bar) = %q, want %q", g, e)
-	}
-}
-
-type parseTest struct {
-	query string
-	out   Values
-}
-
-var parseTests = []parseTest{
-	{
-		query: "a=1&b=2",
-		out:   Values{"a": []string{"1"}, "b": []string{"2"}},
-	},
-	{
-		query: "a=1&a=2&a=banana",
-		out:   Values{"a": []string{"1", "2", "banana"}},
-	},
-	{
-		query: "ascii=%3Ckey%3A+0x90%3E",
-		out:   Values{"ascii": []string{"<key: 0x90>"}},
-	},
-	{
-		query: "a=1;b=2",
-		out:   Values{"a": []string{"1"}, "b": []string{"2"}},
-	},
-	{
-		query: "a=1&a=2;a=banana",
-		out:   Values{"a": []string{"1", "2", "banana"}},
-	},
-}
-
-func TestParseQuery(t *testing.T) {
-	for i, test := range parseTests {
-		form, err := ParseQuery(test.query)
-		if err != nil {
-			t.Errorf("test %d: Unexpected error: %v", i, err)
-			continue
-		}
-		if len(form) != len(test.out) {
-			t.Errorf("test %d: len(form) = %d, want %d", i, len(form), len(test.out))
-		}
-		for k, evs := range test.out {
-			vs, ok := form[k]
-			if !ok {
-				t.Errorf("test %d: Missing key %q", i, k)
-				continue
-			}
-			if len(vs) != len(evs) {
-				t.Errorf("test %d: len(form[%q]) = %d, want %d", i, k, len(vs), len(evs))
-				continue
-			}
-			for j, ev := range evs {
-				if v := vs[j]; v != ev {
-					t.Errorf("test %d: form[%q][%d] = %q, want %q", i, k, j, v, ev)
-				}
-			}
-		}
-	}
-}
-
-type RequestURITest struct {
-	url *URL
-	out string
-}
-
-var requritests = []RequestURITest{
-	{
-		&URL{
-			Scheme: "http",
-			Host:   "example.com",
-			Path:   "",
-		},
-		"/",
-	},
-	{
-		&URL{
-			Scheme: "http",
-			Host:   "example.com",
-			Path:   "/a b",
-		},
-		"/a%20b",
-	},
-	// golang.org/issue/4860 variant 1
-	{
-		&URL{
-			Scheme: "http",
-			Host:   "example.com",
-			Opaque: "/%2F/%2F/",
-		},
-		"/%2F/%2F/",
-	},
-	// golang.org/issue/4860 variant 2
-	{
-		&URL{
-			Scheme: "http",
-			Host:   "example.com",
-			Opaque: "//other.example.com/%2F/%2F/",
-		},
-		"http://other.example.com/%2F/%2F/",
-	},
-	// better fix for issue 4860
-	{
-		&URL{
-			Scheme:  "http",
-			Host:    "example.com",
-			Path:    "/////",
-			RawPath: "/%2F/%2F/",
-		},
-		"/%2F/%2F/",
-	},
-	{
-		&URL{
-			Scheme:  "http",
-			Host:    "example.com",
-			Path:    "/////",
-			RawPath: "/WRONG/", // ignored because doesn't match Path
-		},
-		"/////",
-	},
-	{
-		&URL{
-			Scheme:   "http",
-			Host:     "example.com",
-			Path:     "/a b",
-			RawQuery: "q=go+language",
-		},
-		"/a%20b?q=go+language",
-	},
-	{
-		&URL{
-			Scheme:   "http",
-			Host:     "example.com",
-			Path:     "/a b",
-			RawPath:  "/a b", // ignored because invalid
-			RawQuery: "q=go+language",
-		},
-		"/a%20b?q=go+language",
-	},
-	{
-		&URL{
-			Scheme:   "http",
-			Host:     "example.com",
-			Path:     "/a?b",
-			RawPath:  "/a?b", // ignored because invalid
-			RawQuery: "q=go+language",
-		},
-		"/a%3Fb?q=go+language",
-	},
-	{
-		&URL{
-			Scheme: "myschema",
-			Opaque: "opaque",
-		},
-		"opaque",
-	},
-	{
-		&URL{
-			Scheme:   "myschema",
-			Opaque:   "opaque",
-			RawQuery: "q=go+language",
-		},
-		"opaque?q=go+language",
-	},
-}
-
-func TestRequestURI(t *testing.T) {
-	for _, tt := range requritests {
-		s := tt.url.RequestURI()
-		if s != tt.out {
-			t.Errorf("%#v.RequestURI() == %q (expected %q)", tt.url, s, tt.out)
-		}
-	}
-}
-
-func TestParseFailure(t *testing.T) {
-	// Test that the first parse error is returned.
-	const url = "%gh&%ij"
-	_, err := ParseQuery(url)
-	errStr := fmt.Sprint(err)
-	if !strings.Contains(errStr, "%gh") {
-		t.Errorf(`ParseQuery(%q) returned error %q, want something containing %q"`, url, errStr, "%gh")
-	}
-}
-
-func TestParseAuthority(t *testing.T) {
-	tests := []struct {
-		in      string
-		wantErr bool
-	}{
-		{"http://[::1]", false},
-		{"http://[::1]:80", false},
-		{"http://[::1]:namedport", true}, // rfc3986 3.2.3
-		{"http://[::1]/", false},
-		{"http://[::1]a", true},
-		{"http://[::1]%23", true},
-		{"http://[::1%25en0]", false},     // valid zone id
-		{"http://[::1]:", true},           // colon, but no port
-		{"http://[::1]:%38%30", true},     // no hex in port
-		{"http://[::1%25%10]", false},     // TODO: reject the %10 after the valid zone %25 separator?
-		{"http://[%10::1]", true},         // no %xx escapes in IP address
-		{"http://[::1]/%48", false},       // %xx in path is fine
-		{"http://%41:8080/", true},        // TODO: arguably we should accept reg-name with %xx
-		{"mysql://x@y(z:123)/foo", false}, // golang.org/issue/12023
-		{"mysql://x@y(1.2.3.4:123)/foo", false},
-		{"mysql://x@y([2001:db8::1]:123)/foo", false},
-		{"http://[]%20%48%54%54%50%2f%31%2e%31%0a%4d%79%48%65%61%64%65%72%3a%20%31%32%33%0a%0a/", true}, // golang.org/issue/11208
-	}
-	for _, tt := range tests {
-		u, err := Parse(tt.in)
-		if tt.wantErr {
-			if err == nil {
-				t.Errorf("Parse(%q) = %#v; want an error", tt.in, u)
-			}
-			continue
-		}
-		if err != nil {
-			t.Logf("Parse(%q) = %v; want no error", tt.in, err)
-		}
-	}
-}
-
-// Issue 11202
-func TestStarRequest(t *testing.T) {
-	u, err := Parse("*")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if got, want := u.RequestURI(), "*"; got != want {
-		t.Errorf("RequestURI = %q; want %q", got, want)
-	}
-}
-
-type shouldEscapeTest struct {
-	in     byte
-	mode   encoding
-	escape bool
-}
-
-var shouldEscapeTests = []shouldEscapeTest{
-	// Unreserved characters (§2.3)
-	{'a', encodePath, false},
-	{'a', encodeUserPassword, false},
-	{'a', encodeQueryComponent, false},
-	{'a', encodeFragment, false},
-	{'a', encodeHost, false},
-	{'z', encodePath, false},
-	{'A', encodePath, false},
-	{'Z', encodePath, false},
-	{'0', encodePath, false},
-	{'9', encodePath, false},
-	{'-', encodePath, false},
-	{'-', encodeUserPassword, false},
-	{'-', encodeQueryComponent, false},
-	{'-', encodeFragment, false},
-	{'.', encodePath, false},
-	{'_', encodePath, false},
-	{'~', encodePath, false},
-
-	// User information (§3.2.1)
-	{':', encodeUserPassword, true},
-	{'/', encodeUserPassword, true},
-	{'?', encodeUserPassword, true},
-	{'@', encodeUserPassword, true},
-	{'$', encodeUserPassword, false},
-	{'&', encodeUserPassword, false},
-	{'+', encodeUserPassword, false},
-	{',', encodeUserPassword, false},
-	{';', encodeUserPassword, false},
-	{'=', encodeUserPassword, false},
-
-	// Host (IP address, IPv6 address, registered name, port suffix; §3.2.2)
-	{'!', encodeHost, false},
-	{'$', encodeHost, false},
-	{'&', encodeHost, false},
-	{'\'', encodeHost, false},
-	{'(', encodeHost, false},
-	{')', encodeHost, false},
-	{'*', encodeHost, false},
-	{'+', encodeHost, false},
-	{',', encodeHost, false},
-	{';', encodeHost, false},
-	{'=', encodeHost, false},
-	{':', encodeHost, false},
-	{'[', encodeHost, false},
-	{']', encodeHost, false},
-	{'0', encodeHost, false},
-	{'9', encodeHost, false},
-	{'A', encodeHost, false},
-	{'z', encodeHost, false},
-	{'_', encodeHost, false},
-	{'-', encodeHost, false},
-	{'.', encodeHost, false},
-}
-
-func TestShouldEscape(t *testing.T) {
-	for _, tt := range shouldEscapeTests {
-		if shouldEscape(tt.in, tt.mode) != tt.escape {
-			t.Errorf("shouldEscape(%q, %v) returned %v; expected %v", tt.in, tt.mode, !tt.escape, tt.escape)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/old/regexp/all_test.go b/third_party/gofrontend/libgo/go/old/regexp/all_test.go
deleted file mode 100644
index 180dac4..0000000
--- a/third_party/gofrontend/libgo/go/old/regexp/all_test.go
+++ /dev/null
@@ -1,421 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package regexp
-
-import (
-	"strings"
-	"testing"
-)
-
-var good_re = []string{
-	``,
-	`.`,
-	`^.$`,
-	`a`,
-	`a*`,
-	`a+`,
-	`a?`,
-	`a|b`,
-	`a*|b*`,
-	`(a*|b)(c*|d)`,
-	`[a-z]`,
-	`[a-abc-c\-\]\[]`,
-	`[a-z]+`,
-	`[]`,
-	`[abc]`,
-	`[^1234]`,
-	`[^\n]`,
-	`\!\\`,
-}
-
-type stringError struct {
-	re  string
-	err error
-}
-
-var bad_re = []stringError{
-	{`*`, ErrBareClosure},
-	{`+`, ErrBareClosure},
-	{`?`, ErrBareClosure},
-	{`(abc`, ErrUnmatchedLpar},
-	{`abc)`, ErrUnmatchedRpar},
-	{`x[a-z`, ErrUnmatchedLbkt},
-	{`abc]`, ErrUnmatchedRbkt},
-	{`[z-a]`, ErrBadRange},
-	{`abc\`, ErrExtraneousBackslash},
-	{`a**`, ErrBadClosure},
-	{`a*+`, ErrBadClosure},
-	{`a??`, ErrBadClosure},
-	{`\x`, ErrBadBackslash},
-}
-
-func compileTest(t *testing.T, expr string, error error) *Regexp {
-	re, err := Compile(expr)
-	if err != error {
-		t.Error("compiling `", expr, "`; unexpected error: ", err.Error())
-	}
-	return re
-}
-
-func TestGoodCompile(t *testing.T) {
-	for i := 0; i < len(good_re); i++ {
-		compileTest(t, good_re[i], nil)
-	}
-}
-
-func TestBadCompile(t *testing.T) {
-	for i := 0; i < len(bad_re); i++ {
-		compileTest(t, bad_re[i].re, bad_re[i].err)
-	}
-}
-
-func matchTest(t *testing.T, test *FindTest) {
-	re := compileTest(t, test.pat, nil)
-	if re == nil {
-		return
-	}
-	m := re.MatchString(test.text)
-	if m != (len(test.matches) > 0) {
-		t.Errorf("MatchString failure on %s: %t should be %t", test, m, len(test.matches) > 0)
-	}
-	// now try bytes
-	m = re.Match([]byte(test.text))
-	if m != (len(test.matches) > 0) {
-		t.Errorf("Match failure on %s: %t should be %t", test, m, len(test.matches) > 0)
-	}
-}
-
-func TestMatch(t *testing.T) {
-	for _, test := range findTests {
-		matchTest(t, &test)
-	}
-}
-
-func matchFunctionTest(t *testing.T, test *FindTest) {
-	m, err := MatchString(test.pat, test.text)
-	if err == nil {
-		return
-	}
-	if m != (len(test.matches) > 0) {
-		t.Errorf("Match failure on %s: %t should be %t", test, m, len(test.matches) > 0)
-	}
-}
-
-func TestMatchFunction(t *testing.T) {
-	for _, test := range findTests {
-		matchFunctionTest(t, &test)
-	}
-}
-
-type ReplaceTest struct {
-	pattern, replacement, input, output string
-}
-
-var replaceTests = []ReplaceTest{
-	// Test empty input and/or replacement, with pattern that matches the empty string.
-	{"", "", "", ""},
-	{"", "x", "", "x"},
-	{"", "", "abc", "abc"},
-	{"", "x", "abc", "xaxbxcx"},
-
-	// Test empty input and/or replacement, with pattern that does not match the empty string.
-	{"b", "", "", ""},
-	{"b", "x", "", ""},
-	{"b", "", "abc", "ac"},
-	{"b", "x", "abc", "axc"},
-	{"y", "", "", ""},
-	{"y", "x", "", ""},
-	{"y", "", "abc", "abc"},
-	{"y", "x", "abc", "abc"},
-
-	// Multibyte characters -- verify that we don't try to match in the middle
-	// of a character.
-	{"[a-c]*", "x", "\u65e5", "x\u65e5x"},
-	{"[^\u65e5]", "x", "abc\u65e5def", "xxx\u65e5xxx"},
-
-	// Start and end of a string.
-	{"^[a-c]*", "x", "abcdabc", "xdabc"},
-	{"[a-c]*$", "x", "abcdabc", "abcdx"},
-	{"^[a-c]*$", "x", "abcdabc", "abcdabc"},
-	{"^[a-c]*", "x", "abc", "x"},
-	{"[a-c]*$", "x", "abc", "x"},
-	{"^[a-c]*$", "x", "abc", "x"},
-	{"^[a-c]*", "x", "dabce", "xdabce"},
-	{"[a-c]*$", "x", "dabce", "dabcex"},
-	{"^[a-c]*$", "x", "dabce", "dabce"},
-	{"^[a-c]*", "x", "", "x"},
-	{"[a-c]*$", "x", "", "x"},
-	{"^[a-c]*$", "x", "", "x"},
-
-	{"^[a-c]+", "x", "abcdabc", "xdabc"},
-	{"[a-c]+$", "x", "abcdabc", "abcdx"},
-	{"^[a-c]+$", "x", "abcdabc", "abcdabc"},
-	{"^[a-c]+", "x", "abc", "x"},
-	{"[a-c]+$", "x", "abc", "x"},
-	{"^[a-c]+$", "x", "abc", "x"},
-	{"^[a-c]+", "x", "dabce", "dabce"},
-	{"[a-c]+$", "x", "dabce", "dabce"},
-	{"^[a-c]+$", "x", "dabce", "dabce"},
-	{"^[a-c]+", "x", "", ""},
-	{"[a-c]+$", "x", "", ""},
-	{"^[a-c]+$", "x", "", ""},
-
-	// Other cases.
-	{"abc", "def", "abcdefg", "defdefg"},
-	{"bc", "BC", "abcbcdcdedef", "aBCBCdcdedef"},
-	{"abc", "", "abcdabc", "d"},
-	{"x", "xXx", "xxxXxxx", "xXxxXxxXxXxXxxXxxXx"},
-	{"abc", "d", "", ""},
-	{"abc", "d", "abc", "d"},
-	{".+", "x", "abc", "x"},
-	{"[a-c]*", "x", "def", "xdxexfx"},
-	{"[a-c]+", "x", "abcbcdcdedef", "xdxdedef"},
-	{"[a-c]*", "x", "abcbcdcdedef", "xdxdxexdxexfx"},
-}
-
-type ReplaceFuncTest struct {
-	pattern       string
-	replacement   func(string) string
-	input, output string
-}
-
-var replaceFuncTests = []ReplaceFuncTest{
-	{"[a-c]", func(s string) string { return "x" + s + "y" }, "defabcdef", "defxayxbyxcydef"},
-	{"[a-c]+", func(s string) string { return "x" + s + "y" }, "defabcdef", "defxabcydef"},
-	{"[a-c]*", func(s string) string { return "x" + s + "y" }, "defabcdef", "xydxyexyfxabcydxyexyfxy"},
-}
-
-func TestReplaceAll(t *testing.T) {
-	for _, tc := range replaceTests {
-		re, err := Compile(tc.pattern)
-		if err != nil {
-			t.Errorf("Unexpected error compiling %q: %v", tc.pattern, err)
-			continue
-		}
-		actual := re.ReplaceAllString(tc.input, tc.replacement)
-		if actual != tc.output {
-			t.Errorf("%q.Replace(%q,%q) = %q; want %q",
-				tc.pattern, tc.input, tc.replacement, actual, tc.output)
-		}
-		// now try bytes
-		actual = string(re.ReplaceAll([]byte(tc.input), []byte(tc.replacement)))
-		if actual != tc.output {
-			t.Errorf("%q.Replace(%q,%q) = %q; want %q",
-				tc.pattern, tc.input, tc.replacement, actual, tc.output)
-		}
-	}
-}
-
-func TestReplaceAllFunc(t *testing.T) {
-	for _, tc := range replaceFuncTests {
-		re, err := Compile(tc.pattern)
-		if err != nil {
-			t.Errorf("Unexpected error compiling %q: %v", tc.pattern, err)
-			continue
-		}
-		actual := re.ReplaceAllStringFunc(tc.input, tc.replacement)
-		if actual != tc.output {
-			t.Errorf("%q.ReplaceFunc(%q,%q) = %q; want %q",
-				tc.pattern, tc.input, tc.replacement, actual, tc.output)
-		}
-		// now try bytes
-		actual = string(re.ReplaceAllFunc([]byte(tc.input), func(s []byte) []byte { return []byte(tc.replacement(string(s))) }))
-		if actual != tc.output {
-			t.Errorf("%q.ReplaceFunc(%q,%q) = %q; want %q",
-				tc.pattern, tc.input, tc.replacement, actual, tc.output)
-		}
-	}
-}
-
-type MetaTest struct {
-	pattern, output, literal string
-	isLiteral                bool
-}
-
-var metaTests = []MetaTest{
-	{``, ``, ``, true},
-	{`foo`, `foo`, `foo`, true},
-	{`foo\.\$`, `foo\\\.\\\$`, `foo.$`, true}, // has meta but no operator
-	{`foo.\$`, `foo\.\\\$`, `foo`, false},     // has escaped operators and real operators
-	{`!@#$%^&*()_+-=[{]}\|,<.>/?~`, `!@#\$%\^&\*\(\)_\+-=\[{\]}\\\|,<\.>/\?~`, `!@#`, false},
-}
-
-func TestQuoteMeta(t *testing.T) {
-	for _, tc := range metaTests {
-		// Verify that QuoteMeta returns the expected string.
-		quoted := QuoteMeta(tc.pattern)
-		if quoted != tc.output {
-			t.Errorf("QuoteMeta(`%s`) = `%s`; want `%s`",
-				tc.pattern, quoted, tc.output)
-			continue
-		}
-
-		// Verify that the quoted string is in fact treated as expected
-		// by Compile -- i.e. that it matches the original, unquoted string.
-		if tc.pattern != "" {
-			re, err := Compile(quoted)
-			if err != nil {
-				t.Errorf("Unexpected error compiling QuoteMeta(`%s`): %v", tc.pattern, err)
-				continue
-			}
-			src := "abc" + tc.pattern + "def"
-			repl := "xyz"
-			replaced := re.ReplaceAllString(src, repl)
-			expected := "abcxyzdef"
-			if replaced != expected {
-				t.Errorf("QuoteMeta(`%s`).Replace(`%s`,`%s`) = `%s`; want `%s`",
-					tc.pattern, src, repl, replaced, expected)
-			}
-		}
-	}
-}
-
-func TestLiteralPrefix(t *testing.T) {
-	for _, tc := range metaTests {
-		// Literal method needs to scan the pattern.
-		re := MustCompile(tc.pattern)
-		str, complete := re.LiteralPrefix()
-		if complete != tc.isLiteral {
-			t.Errorf("LiteralPrefix(`%s`) = %t; want %t", tc.pattern, complete, tc.isLiteral)
-		}
-		if str != tc.literal {
-			t.Errorf("LiteralPrefix(`%s`) = `%s`; want `%s`", tc.pattern, str, tc.literal)
-		}
-	}
-}
-
-type numSubexpCase struct {
-	input    string
-	expected int
-}
-
-var numSubexpCases = []numSubexpCase{
-	{``, 0},
-	{`.*`, 0},
-	{`abba`, 0},
-	{`ab(b)a`, 1},
-	{`ab(.*)a`, 1},
-	{`(.*)ab(.*)a`, 2},
-	{`(.*)(ab)(.*)a`, 3},
-	{`(.*)((a)b)(.*)a`, 4},
-	{`(.*)(\(ab)(.*)a`, 3},
-	{`(.*)(\(a\)b)(.*)a`, 3},
-}
-
-func TestNumSubexp(t *testing.T) {
-	for _, c := range numSubexpCases {
-		re := MustCompile(c.input)
-		n := re.NumSubexp()
-		if n != c.expected {
-			t.Errorf("NumSubexp for %q returned %d, expected %d", c.input, n, c.expected)
-		}
-	}
-}
-
-func BenchmarkLiteral(b *testing.B) {
-	x := strings.Repeat("x", 50) + "y"
-	b.StopTimer()
-	re := MustCompile("y")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		if !re.MatchString(x) {
-			b.Fatal("no match!")
-		}
-	}
-}
-
-func BenchmarkNotLiteral(b *testing.B) {
-	x := strings.Repeat("x", 50) + "y"
-	b.StopTimer()
-	re := MustCompile(".y")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		if !re.MatchString(x) {
-			b.Fatal("no match!")
-		}
-	}
-}
-
-func BenchmarkMatchClass(b *testing.B) {
-	b.StopTimer()
-	x := strings.Repeat("xxxx", 20) + "w"
-	re := MustCompile("[abcdw]")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		if !re.MatchString(x) {
-			b.Fatal("no match!")
-		}
-	}
-}
-
-func BenchmarkMatchClass_InRange(b *testing.B) {
-	b.StopTimer()
-	// 'b' is between 'a' and 'c', so the charclass
-	// range checking is no help here.
-	x := strings.Repeat("bbbb", 20) + "c"
-	re := MustCompile("[ac]")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		if !re.MatchString(x) {
-			b.Fatal("no match!")
-		}
-	}
-}
-
-func BenchmarkReplaceAll(b *testing.B) {
-	x := "abcdefghijklmnopqrstuvwxyz"
-	b.StopTimer()
-	re := MustCompile("[cjrw]")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.ReplaceAllString(x, "")
-	}
-}
-
-func BenchmarkAnchoredLiteralShortNonMatch(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcdefghijklmnopqrstuvwxyz")
-	re := MustCompile("^zbc(d|e)")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
-
-func BenchmarkAnchoredLiteralLongNonMatch(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcdefghijklmnopqrstuvwxyz")
-	for i := 0; i < 15; i++ {
-		x = append(x, x...)
-	}
-	re := MustCompile("^zbc(d|e)")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
-
-func BenchmarkAnchoredShortMatch(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcdefghijklmnopqrstuvwxyz")
-	re := MustCompile("^.bc(d|e)")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
-
-func BenchmarkAnchoredLongMatch(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcdefghijklmnopqrstuvwxyz")
-	for i := 0; i < 15; i++ {
-		x = append(x, x...)
-	}
-	re := MustCompile("^.bc(d|e)")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/old/regexp/find_test.go b/third_party/gofrontend/libgo/go/old/regexp/find_test.go
deleted file mode 100644
index 83b249e..0000000
--- a/third_party/gofrontend/libgo/go/old/regexp/find_test.go
+++ /dev/null
@@ -1,472 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package regexp
-
-import (
-	"fmt"
-	"strings"
-	"testing"
-)
-
-// For each pattern/text pair, what is the expected output of each function?
-// We can derive the textual results from the indexed results, the non-submatch
-// results from the submatched results, the single results from the 'all' results,
-// and the byte results from the string results. Therefore the table includes
-// only the FindAllStringSubmatchIndex result.
-type FindTest struct {
-	pat     string
-	text    string
-	matches [][]int
-}
-
-func (t FindTest) String() string {
-	return fmt.Sprintf("pat: %#q text: %#q", t.pat, t.text)
-}
-
-var findTests = []FindTest{
-	{``, ``, build(1, 0, 0)},
-	{`^abcdefg`, "abcdefg", build(1, 0, 7)},
-	{`a+`, "baaab", build(1, 1, 4)},
-	{"abcd..", "abcdef", build(1, 0, 6)},
-	{`a`, "a", build(1, 0, 1)},
-	{`x`, "y", nil},
-	{`b`, "abc", build(1, 1, 2)},
-	{`.`, "a", build(1, 0, 1)},
-	{`.*`, "abcdef", build(1, 0, 6)},
-	{`^`, "abcde", build(1, 0, 0)},
-	{`$`, "abcde", build(1, 5, 5)},
-	{`^abcd$`, "abcd", build(1, 0, 4)},
-	{`^bcd'`, "abcdef", nil},
-	{`^abcd$`, "abcde", nil},
-	{`a+`, "baaab", build(1, 1, 4)},
-	{`a*`, "baaab", build(3, 0, 0, 1, 4, 5, 5)},
-	{`[a-z]+`, "abcd", build(1, 0, 4)},
-	{`[^a-z]+`, "ab1234cd", build(1, 2, 6)},
-	{`[a\-\]z]+`, "az]-bcz", build(2, 0, 4, 6, 7)},
-	{`[^\n]+`, "abcd\n", build(1, 0, 4)},
-	{`[日本語]+`, "日本語日本語", build(1, 0, 18)},
-	{`日本語+`, "日本語", build(1, 0, 9)},
-	{`日本語+`, "日本語語語語", build(1, 0, 18)},
-	{`()`, "", build(1, 0, 0, 0, 0)},
-	{`(a)`, "a", build(1, 0, 1, 0, 1)},
-	{`(.)(.)`, "日a", build(1, 0, 4, 0, 3, 3, 4)},
-	{`(.*)`, "", build(1, 0, 0, 0, 0)},
-	{`(.*)`, "abcd", build(1, 0, 4, 0, 4)},
-	{`(..)(..)`, "abcd", build(1, 0, 4, 0, 2, 2, 4)},
-	{`(([^xyz]*)(d))`, "abcd", build(1, 0, 4, 0, 4, 0, 3, 3, 4)},
-	{`((a|b|c)*(d))`, "abcd", build(1, 0, 4, 0, 4, 2, 3, 3, 4)},
-	{`(((a|b|c)*)(d))`, "abcd", build(1, 0, 4, 0, 4, 0, 3, 2, 3, 3, 4)},
-	{`\a\b\f\n\r\t\v`, "\a\b\f\n\r\t\v", build(1, 0, 7)},
-	{`[\a\b\f\n\r\t\v]+`, "\a\b\f\n\r\t\v", build(1, 0, 7)},
-
-	{`a*(|(b))c*`, "aacc", build(1, 0, 4, 2, 2, -1, -1)},
-	{`(.*).*`, "ab", build(1, 0, 2, 0, 2)},
-	{`[.]`, ".", build(1, 0, 1)},
-	{`/$`, "/abc/", build(1, 4, 5)},
-	{`/$`, "/abc", nil},
-
-	// multiple matches
-	{`.`, "abc", build(3, 0, 1, 1, 2, 2, 3)},
-	{`(.)`, "abc", build(3, 0, 1, 0, 1, 1, 2, 1, 2, 2, 3, 2, 3)},
-	{`.(.)`, "abcd", build(2, 0, 2, 1, 2, 2, 4, 3, 4)},
-	{`ab*`, "abbaab", build(3, 0, 3, 3, 4, 4, 6)},
-	{`a(b*)`, "abbaab", build(3, 0, 3, 1, 3, 3, 4, 4, 4, 4, 6, 5, 6)},
-
-	// fixed bugs
-	{`ab$`, "cab", build(1, 1, 3)},
-	{`axxb$`, "axxcb", nil},
-	{`data`, "daXY data", build(1, 5, 9)},
-	{`da(.)a$`, "daXY data", build(1, 5, 9, 7, 8)},
-	{`zx+`, "zzx", build(1, 1, 3)},
-
-	// can backslash-escape any punctuation
-	{`\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\{\|\}\~`,
-		`!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`, build(1, 0, 31)},
-	{`[\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\{\|\}\~]+`,
-		`!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`, build(1, 0, 31)},
-	{"\\`", "`", build(1, 0, 1)},
-	{"[\\`]+", "`", build(1, 0, 1)},
-
-	// long set of matches (longer than startSize)
-	{
-		".",
-		"qwertyuiopasdfghjklzxcvbnm1234567890",
-		build(36, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10,
-			10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20,
-			20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30,
-			30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36),
-	},
-}
-
-// build is a helper to construct a [][]int by extracting n sequences from x.
-// This represents n matches with len(x)/n submatches each.
-func build(n int, x ...int) [][]int {
-	ret := make([][]int, n)
-	runLength := len(x) / n
-	j := 0
-	for i := range ret {
-		ret[i] = make([]int, runLength)
-		copy(ret[i], x[j:])
-		j += runLength
-		if j > len(x) {
-			panic("invalid build entry")
-		}
-	}
-	return ret
-}
-
-// First the simple cases.
-
-func TestFind(t *testing.T) {
-	for _, test := range findTests {
-		re := MustCompile(test.pat)
-		if re.String() != test.pat {
-			t.Errorf("String() = `%s`; should be `%s`", re.String(), test.pat)
-		}
-		result := re.Find([]byte(test.text))
-		switch {
-		case len(test.matches) == 0 && len(result) == 0:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Errorf("expected match; got none: %s", test)
-		case test.matches != nil && result != nil:
-			expect := test.text[test.matches[0][0]:test.matches[0][1]]
-			if expect != string(result) {
-				t.Errorf("expected %q got %q: %s", expect, result, test)
-			}
-		}
-	}
-}
-
-func TestFindString(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindString(test.text)
-		switch {
-		case len(test.matches) == 0 && len(result) == 0:
-			// ok
-		case test.matches == nil && result != "":
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == "":
-			// Tricky because an empty result has two meanings: no match or empty match.
-			if test.matches[0][0] != test.matches[0][1] {
-				t.Errorf("expected match; got none: %s", test)
-			}
-		case test.matches != nil && result != "":
-			expect := test.text[test.matches[0][0]:test.matches[0][1]]
-			if expect != result {
-				t.Errorf("expected %q got %q: %s", expect, result, test)
-			}
-		}
-	}
-}
-
-func testFindIndex(test *FindTest, result []int, t *testing.T) {
-	switch {
-	case len(test.matches) == 0 && len(result) == 0:
-		// ok
-	case test.matches == nil && result != nil:
-		t.Errorf("expected no match; got one: %s", test)
-	case test.matches != nil && result == nil:
-		t.Errorf("expected match; got none: %s", test)
-	case test.matches != nil && result != nil:
-		expect := test.matches[0]
-		if expect[0] != result[0] || expect[1] != result[1] {
-			t.Errorf("expected %v got %v: %s", expect, result, test)
-		}
-	}
-}
-
-func TestFindIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindIndex(&test, MustCompile(test.pat).FindIndex([]byte(test.text)), t)
-	}
-}
-
-func TestFindStringIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindIndex(&test, MustCompile(test.pat).FindStringIndex(test.text), t)
-	}
-}
-
-func TestFindReaderIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindIndex(&test, MustCompile(test.pat).FindReaderIndex(strings.NewReader(test.text)), t)
-	}
-}
-
-// Now come the simple All cases.
-
-func TestFindAll(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindAll([]byte(test.text), -1)
-		switch {
-		case test.matches == nil && result == nil:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Errorf("expected match; got none: %s", test)
-		case test.matches != nil && result != nil:
-			if len(test.matches) != len(result) {
-				t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test)
-				continue
-			}
-			for k, e := range test.matches {
-				expect := test.text[e[0]:e[1]]
-				if expect != string(result[k]) {
-					t.Errorf("match %d: expected %q got %q: %s", k, expect, result[k], test)
-				}
-			}
-		}
-	}
-}
-
-func TestFindAllString(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindAllString(test.text, -1)
-		switch {
-		case test.matches == nil && result == nil:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Errorf("expected match; got none: %s", test)
-		case test.matches != nil && result != nil:
-			if len(test.matches) != len(result) {
-				t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test)
-				continue
-			}
-			for k, e := range test.matches {
-				expect := test.text[e[0]:e[1]]
-				if expect != result[k] {
-					t.Errorf("expected %q got %q: %s", expect, result, test)
-				}
-			}
-		}
-	}
-}
-
-func testFindAllIndex(test *FindTest, result [][]int, t *testing.T) {
-	switch {
-	case test.matches == nil && result == nil:
-		// ok
-	case test.matches == nil && result != nil:
-		t.Errorf("expected no match; got one: %s", test)
-	case test.matches != nil && result == nil:
-		t.Errorf("expected match; got none: %s", test)
-	case test.matches != nil && result != nil:
-		if len(test.matches) != len(result) {
-			t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test)
-			return
-		}
-		for k, e := range test.matches {
-			if e[0] != result[k][0] || e[1] != result[k][1] {
-				t.Errorf("match %d: expected %v got %v: %s", k, e, result[k], test)
-			}
-		}
-	}
-}
-
-func TestFindAllIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindAllIndex(&test, MustCompile(test.pat).FindAllIndex([]byte(test.text), -1), t)
-	}
-}
-
-func TestFindAllStringIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindAllIndex(&test, MustCompile(test.pat).FindAllStringIndex(test.text, -1), t)
-	}
-}
-
-// Now come the Submatch cases.
-
-func testSubmatchBytes(test *FindTest, n int, submatches []int, result [][]byte, t *testing.T) {
-	if len(submatches) != len(result)*2 {
-		t.Errorf("match %d: expected %d submatches; got %d: %s", n, len(submatches)/2, len(result), test)
-		return
-	}
-	for k := 0; k < len(submatches); k += 2 {
-		if submatches[k] == -1 {
-			if result[k/2] != nil {
-				t.Errorf("match %d: expected nil got %q: %s", n, result, test)
-			}
-			continue
-		}
-		expect := test.text[submatches[k]:submatches[k+1]]
-		if expect != string(result[k/2]) {
-			t.Errorf("match %d: expected %q got %q: %s", n, expect, result, test)
-			return
-		}
-	}
-}
-
-func TestFindSubmatch(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindSubmatch([]byte(test.text))
-		switch {
-		case test.matches == nil && result == nil:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Errorf("expected match; got none: %s", test)
-		case test.matches != nil && result != nil:
-			testSubmatchBytes(&test, 0, test.matches[0], result, t)
-		}
-	}
-}
-
-func testSubmatchString(test *FindTest, n int, submatches []int, result []string, t *testing.T) {
-	if len(submatches) != len(result)*2 {
-		t.Errorf("match %d: expected %d submatches; got %d: %s", n, len(submatches)/2, len(result), test)
-		return
-	}
-	for k := 0; k < len(submatches); k += 2 {
-		if submatches[k] == -1 {
-			if result[k/2] != "" {
-				t.Errorf("match %d: expected nil got %q: %s", n, result, test)
-			}
-			continue
-		}
-		expect := test.text[submatches[k]:submatches[k+1]]
-		if expect != result[k/2] {
-			t.Errorf("match %d: expected %q got %q: %s", n, expect, result, test)
-			return
-		}
-	}
-}
-
-func TestFindStringSubmatch(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindStringSubmatch(test.text)
-		switch {
-		case test.matches == nil && result == nil:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Errorf("expected match; got none: %s", test)
-		case test.matches != nil && result != nil:
-			testSubmatchString(&test, 0, test.matches[0], result, t)
-		}
-	}
-}
-
-func testSubmatchIndices(test *FindTest, n int, expect, result []int, t *testing.T) {
-	if len(expect) != len(result) {
-		t.Errorf("match %d: expected %d matches; got %d: %s", n, len(expect)/2, len(result)/2, test)
-		return
-	}
-	for k, e := range expect {
-		if e != result[k] {
-			t.Errorf("match %d: submatch error: expected %v got %v: %s", n, expect, result, test)
-		}
-	}
-}
-
-func testFindSubmatchIndex(test *FindTest, result []int, t *testing.T) {
-	switch {
-	case test.matches == nil && result == nil:
-		// ok
-	case test.matches == nil && result != nil:
-		t.Errorf("expected no match; got one: %s", test)
-	case test.matches != nil && result == nil:
-		t.Errorf("expected match; got none: %s", test)
-	case test.matches != nil && result != nil:
-		testSubmatchIndices(test, 0, test.matches[0], result, t)
-	}
-}
-
-func TestFindSubmatchIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindSubmatchIndex(&test, MustCompile(test.pat).FindSubmatchIndex([]byte(test.text)), t)
-	}
-}
-
-func TestFindStringSubmatchIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindSubmatchIndex(&test, MustCompile(test.pat).FindStringSubmatchIndex(test.text), t)
-	}
-}
-
-func TestFindReaderSubmatchIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindSubmatchIndex(&test, MustCompile(test.pat).FindReaderSubmatchIndex(strings.NewReader(test.text)), t)
-	}
-}
-
-// Now come the monster AllSubmatch cases.
-
-func TestFindAllSubmatch(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindAllSubmatch([]byte(test.text), -1)
-		switch {
-		case test.matches == nil && result == nil:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Errorf("expected match; got none: %s", test)
-		case len(test.matches) != len(result):
-			t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test)
-		case test.matches != nil && result != nil:
-			for k, match := range test.matches {
-				testSubmatchBytes(&test, k, match, result[k], t)
-			}
-		}
-	}
-}
-
-func TestFindAllStringSubmatch(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindAllStringSubmatch(test.text, -1)
-		switch {
-		case test.matches == nil && result == nil:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Errorf("expected match; got none: %s", test)
-		case len(test.matches) != len(result):
-			t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test)
-		case test.matches != nil && result != nil:
-			for k, match := range test.matches {
-				testSubmatchString(&test, k, match, result[k], t)
-			}
-		}
-	}
-}
-
-func testFindAllSubmatchIndex(test *FindTest, result [][]int, t *testing.T) {
-	switch {
-	case test.matches == nil && result == nil:
-		// ok
-	case test.matches == nil && result != nil:
-		t.Errorf("expected no match; got one: %s", test)
-	case test.matches != nil && result == nil:
-		t.Errorf("expected match; got none: %s", test)
-	case len(test.matches) != len(result):
-		t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test)
-	case test.matches != nil && result != nil:
-		for k, match := range test.matches {
-			testSubmatchIndices(test, k, match, result[k], t)
-		}
-	}
-}
-
-func TestFindAllSubmatchIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindAllSubmatchIndex(&test, MustCompile(test.pat).FindAllSubmatchIndex([]byte(test.text), -1), t)
-	}
-}
-
-func TestFindAllStringSubmatchIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindAllSubmatchIndex(&test, MustCompile(test.pat).FindAllStringSubmatchIndex(test.text, -1), t)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/old/regexp/regexp.go b/third_party/gofrontend/libgo/go/old/regexp/regexp.go
deleted file mode 100644
index d3044d0..0000000
--- a/third_party/gofrontend/libgo/go/old/regexp/regexp.go
+++ /dev/null
@@ -1,1488 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package regexp implements a simple regular expression library.
-//
-// The syntax of the regular expressions accepted is:
-//
-//	regexp:
-//		concatenation { '|' concatenation }
-//	concatenation:
-//		{ closure }
-//	closure:
-//		term [ '*' | '+' | '?' ]
-//	term:
-//		'^'
-//		'$'
-//		'.'
-//		character
-//		'[' [ '^' ] { character-range } ']'
-//		'(' regexp ')'
-//	character-range:
-//		character [ '-' character ]
-//
-// All characters are UTF-8-encoded code points.  Backslashes escape special
-// characters, including inside character classes.  The standard Go character
-// escapes are also recognized: \a \b \f \n \r \t \v.
-//
-// There are 16 methods of Regexp that match a regular expression and identify
-// the matched text.  Their names are matched by this regular expression:
-//
-//	Find(All)?(String)?(Submatch)?(Index)?
-//
-// If 'All' is present, the routine matches successive non-overlapping
-// matches of the entire expression.  Empty matches abutting a preceding
-// match are ignored.  The return value is a slice containing the successive
-// return values of the corresponding non-'All' routine.  These routines take
-// an extra integer argument, n; if n >= 0, the function returns at most n
-// matches/submatches.
-//
-// If 'String' is present, the argument is a string; otherwise it is a slice
-// of bytes; return values are adjusted as appropriate.
-//
-// If 'Submatch' is present, the return value is a slice identifying the
-// successive submatches of the expression.  Submatches are matches of
-// parenthesized subexpressions within the regular expression, numbered from
-// left to right in order of opening parenthesis.  Submatch 0 is the match of
-// the entire expression, submatch 1 the match of the first parenthesized
-// subexpression, and so on.
-//
-// If 'Index' is present, matches and submatches are identified by byte index
-// pairs within the input string: result[2*n:2*n+1] identifies the indexes of
-// the nth submatch.  The pair for n==0 identifies the match of the entire
-// expression.  If 'Index' is not present, the match is identified by the
-// text of the match/submatch.  If an index is negative, it means that
-// subexpression did not match any string in the input.
-//
-// There is also a subset of the methods that can be applied to text read
-// from a RuneReader:
-//
-//	MatchReader, FindReaderIndex, FindReaderSubmatchIndex
-//
-// This set may grow.  Note that regular expression matches may need to
-// examine text beyond the text returned by a match, so the methods that
-// match text from a RuneReader may read arbitrarily far into the input
-// before returning.
-//
-// (There are a few other methods that do not match this pattern.)
-//
-package regexp
-
-import (
-	"bytes"
-	"io"
-	"strings"
-	"unicode/utf8"
-)
-
-var debug = false
-
-// Error is the local type for a parsing error.
-type Error string
-
-func (e Error) Error() string {
-	return string(e)
-}
-
-// Error codes returned by failures to parse an expression.
-var (
-	ErrInternal            = Error("regexp: internal error")
-	ErrUnmatchedLpar       = Error("regexp: unmatched '('")
-	ErrUnmatchedRpar       = Error("regexp: unmatched ')'")
-	ErrUnmatchedLbkt       = Error("regexp: unmatched '['")
-	ErrUnmatchedRbkt       = Error("regexp: unmatched ']'")
-	ErrBadRange            = Error("regexp: bad range in character class")
-	ErrExtraneousBackslash = Error("regexp: extraneous backslash")
-	ErrBadClosure          = Error("regexp: repeated closure (**, ++, etc.)")
-	ErrBareClosure         = Error("regexp: closure applies to nothing")
-	ErrBadBackslash        = Error("regexp: illegal backslash escape")
-)
-
-const (
-	iStart     = iota // beginning of program
-	iEnd              // end of program: success
-	iBOT              // '^' beginning of text
-	iEOT              // '$' end of text
-	iChar             // 'a' regular character
-	iCharClass        // [a-z] character class
-	iAny              // '.' any character including newline
-	iNotNL            // [^\n] special case: any character but newline
-	iBra              // '(' parenthesized expression: 2*braNum for left, 2*braNum+1 for right
-	iAlt              // '|' alternation
-	iNop              // do nothing; makes it easy to link without patching
-)
-
-// An instruction executed by the NFA
-type instr struct {
-	kind  int    // the type of this instruction: iChar, iAny, etc.
-	index int    // used only in debugging; could be eliminated
-	next  *instr // the instruction to execute after this one
-	// Special fields valid only for some items.
-	char   rune       // iChar
-	braNum int        // iBra, iEbra
-	cclass *charClass // iCharClass
-	left   *instr     // iAlt, other branch
-}
-
-func (i *instr) print() {
-	switch i.kind {
-	case iStart:
-		print("start")
-	case iEnd:
-		print("end")
-	case iBOT:
-		print("bot")
-	case iEOT:
-		print("eot")
-	case iChar:
-		print("char ", string(i.char))
-	case iCharClass:
-		i.cclass.print()
-	case iAny:
-		print("any")
-	case iNotNL:
-		print("notnl")
-	case iBra:
-		if i.braNum&1 == 0 {
-			print("bra", i.braNum/2)
-		} else {
-			print("ebra", i.braNum/2)
-		}
-	case iAlt:
-		print("alt(", i.left.index, ")")
-	case iNop:
-		print("nop")
-	}
-}
-
-// Regexp is the representation of a compiled regular expression.
-// The public interface is entirely through methods.
-// A Regexp is safe for concurrent use by multiple goroutines.
-type Regexp struct {
-	expr        string // the original expression
-	prefix      string // initial plain text string
-	prefixBytes []byte // initial plain text bytes
-	inst        []*instr
-	start       *instr // first instruction of machine
-	prefixStart *instr // where to start if there is a prefix
-	nbra        int    // number of brackets in expression, for subexpressions
-}
-
-type charClass struct {
-	negate bool // is character class negated? ([^a-z])
-	// slice of int, stored pairwise: [a-z] is (a,z); x is (x,x):
-	ranges     []rune
-	cmin, cmax rune
-}
-
-func (cclass *charClass) print() {
-	print("charclass")
-	if cclass.negate {
-		print(" (negated)")
-	}
-	for i := 0; i < len(cclass.ranges); i += 2 {
-		l := cclass.ranges[i]
-		r := cclass.ranges[i+1]
-		if l == r {
-			print(" [", string(l), "]")
-		} else {
-			print(" [", string(l), "-", string(r), "]")
-		}
-	}
-}
-
-func (cclass *charClass) addRange(a, b rune) {
-	// range is a through b inclusive
-	cclass.ranges = append(cclass.ranges, a, b)
-	if a < cclass.cmin {
-		cclass.cmin = a
-	}
-	if b > cclass.cmax {
-		cclass.cmax = b
-	}
-}
-
-func (cclass *charClass) matches(c rune) bool {
-	if c < cclass.cmin || c > cclass.cmax {
-		return cclass.negate
-	}
-	ranges := cclass.ranges
-	for i := 0; i < len(ranges); i = i + 2 {
-		if ranges[i] <= c && c <= ranges[i+1] {
-			return !cclass.negate
-		}
-	}
-	return cclass.negate
-}
-
-func newCharClass() *instr {
-	i := &instr{kind: iCharClass}
-	i.cclass = new(charClass)
-	i.cclass.ranges = make([]rune, 0, 4)
-	i.cclass.cmin = 0x10FFFF + 1 // MaxRune + 1
-	i.cclass.cmax = -1
-	return i
-}
-
-func (re *Regexp) add(i *instr) *instr {
-	i.index = len(re.inst)
-	re.inst = append(re.inst, i)
-	return i
-}
-
-type parser struct {
-	re    *Regexp
-	nlpar int // number of unclosed lpars
-	pos   int
-	ch    rune
-}
-
-func (p *parser) error(err Error) {
-	panic(err)
-}
-
-const endOfText = -1
-
-func (p *parser) c() rune { return p.ch }
-
-func (p *parser) nextc() rune {
-	if p.pos >= len(p.re.expr) {
-		p.ch = endOfText
-	} else {
-		c, w := utf8.DecodeRuneInString(p.re.expr[p.pos:])
-		p.ch = c
-		p.pos += w
-	}
-	return p.ch
-}
-
-func newParser(re *Regexp) *parser {
-	p := new(parser)
-	p.re = re
-	p.nextc() // load p.ch
-	return p
-}
-
-func special(c rune) bool {
-	for _, r := range `\.+*?()|[]^$` {
-		if c == r {
-			return true
-		}
-	}
-	return false
-}
-
-func ispunct(c rune) bool {
-	for _, r := range "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" {
-		if c == r {
-			return true
-		}
-	}
-	return false
-}
-
-var escapes = []byte("abfnrtv")
-var escaped = []byte("\a\b\f\n\r\t\v")
-
-func escape(c rune) int {
-	for i, b := range escapes {
-		if rune(b) == c {
-			return i
-		}
-	}
-	return -1
-}
-
-func (p *parser) checkBackslash() rune {
-	c := p.c()
-	if c == '\\' {
-		c = p.nextc()
-		switch {
-		case c == endOfText:
-			p.error(ErrExtraneousBackslash)
-		case ispunct(c):
-			// c is as delivered
-		case escape(c) >= 0:
-			c = rune(escaped[escape(c)])
-		default:
-			p.error(ErrBadBackslash)
-		}
-	}
-	return c
-}
-
-func (p *parser) charClass() *instr {
-	i := newCharClass()
-	cc := i.cclass
-	if p.c() == '^' {
-		cc.negate = true
-		p.nextc()
-	}
-	left := rune(-1)
-	for {
-		switch c := p.c(); c {
-		case ']', endOfText:
-			if left >= 0 {
-				p.error(ErrBadRange)
-			}
-			// Is it [^\n]?
-			if cc.negate && len(cc.ranges) == 2 &&
-				cc.ranges[0] == '\n' && cc.ranges[1] == '\n' {
-				nl := &instr{kind: iNotNL}
-				p.re.add(nl)
-				return nl
-			}
-			// Special common case: "[a]" -> "a"
-			if !cc.negate && len(cc.ranges) == 2 && cc.ranges[0] == cc.ranges[1] {
-				c := &instr{kind: iChar, char: cc.ranges[0]}
-				p.re.add(c)
-				return c
-			}
-			p.re.add(i)
-			return i
-		case '-': // do this before backslash processing
-			p.error(ErrBadRange)
-		default:
-			c = p.checkBackslash()
-			p.nextc()
-			switch {
-			case left < 0: // first of pair
-				if p.c() == '-' { // range
-					p.nextc()
-					left = c
-				} else { // single char
-					cc.addRange(c, c)
-				}
-			case left <= c: // second of pair
-				cc.addRange(left, c)
-				left = -1
-			default:
-				p.error(ErrBadRange)
-			}
-		}
-	}
-	panic("unreachable")
-}
-
-func (p *parser) term() (start, end *instr) {
-	switch c := p.c(); c {
-	case '|', endOfText:
-		return nil, nil
-	case '*', '+', '?':
-		p.error(ErrBareClosure)
-	case ')':
-		if p.nlpar == 0 {
-			p.error(ErrUnmatchedRpar)
-		}
-		return nil, nil
-	case ']':
-		p.error(ErrUnmatchedRbkt)
-	case '^':
-		p.nextc()
-		start = p.re.add(&instr{kind: iBOT})
-		return start, start
-	case '$':
-		p.nextc()
-		start = p.re.add(&instr{kind: iEOT})
-		return start, start
-	case '.':
-		p.nextc()
-		start = p.re.add(&instr{kind: iAny})
-		return start, start
-	case '[':
-		p.nextc()
-		start = p.charClass()
-		if p.c() != ']' {
-			p.error(ErrUnmatchedLbkt)
-		}
-		p.nextc()
-		return start, start
-	case '(':
-		p.nextc()
-		p.nlpar++
-		p.re.nbra++ // increment first so first subexpr is \1
-		nbra := p.re.nbra
-		start, end = p.regexp()
-		if p.c() != ')' {
-			p.error(ErrUnmatchedLpar)
-		}
-		p.nlpar--
-		p.nextc()
-		bra := &instr{kind: iBra, braNum: 2 * nbra}
-		p.re.add(bra)
-		ebra := &instr{kind: iBra, braNum: 2*nbra + 1}
-		p.re.add(ebra)
-		if start == nil {
-			if end == nil {
-				p.error(ErrInternal)
-				return
-			}
-			start = ebra
-		} else {
-			end.next = ebra
-		}
-		bra.next = start
-		return bra, ebra
-	default:
-		c = p.checkBackslash()
-		p.nextc()
-		start = &instr{kind: iChar, char: c}
-		p.re.add(start)
-		return start, start
-	}
-	panic("unreachable")
-}
-
-func (p *parser) closure() (start, end *instr) {
-	start, end = p.term()
-	if start == nil {
-		return
-	}
-	switch p.c() {
-	case '*':
-		// (start,end)*:
-		alt := &instr{kind: iAlt}
-		p.re.add(alt)
-		end.next = alt   // after end, do alt
-		alt.left = start // alternate brach: return to start
-		start = alt      // alt becomes new (start, end)
-		end = alt
-	case '+':
-		// (start,end)+:
-		alt := &instr{kind: iAlt}
-		p.re.add(alt)
-		end.next = alt   // after end, do alt
-		alt.left = start // alternate brach: return to start
-		end = alt        // start is unchanged; end is alt
-	case '?':
-		// (start,end)?:
-		alt := &instr{kind: iAlt}
-		p.re.add(alt)
-		nop := &instr{kind: iNop}
-		p.re.add(nop)
-		alt.left = start // alternate branch is start
-		alt.next = nop   // follow on to nop
-		end.next = nop   // after end, go to nop
-		start = alt      // start is now alt
-		end = nop        // end is nop pointed to by both branches
-	default:
-		return
-	}
-	switch p.nextc() {
-	case '*', '+', '?':
-		p.error(ErrBadClosure)
-	}
-	return
-}
-
-func (p *parser) concatenation() (start, end *instr) {
-	for {
-		nstart, nend := p.closure()
-		switch {
-		case nstart == nil: // end of this concatenation
-			if start == nil { // this is the empty string
-				nop := p.re.add(&instr{kind: iNop})
-				return nop, nop
-			}
-			return
-		case start == nil: // this is first element of concatenation
-			start, end = nstart, nend
-		default:
-			end.next = nstart
-			end = nend
-		}
-	}
-	panic("unreachable")
-}
-
-func (p *parser) regexp() (start, end *instr) {
-	start, end = p.concatenation()
-	for {
-		switch p.c() {
-		default:
-			return
-		case '|':
-			p.nextc()
-			nstart, nend := p.concatenation()
-			alt := &instr{kind: iAlt}
-			p.re.add(alt)
-			alt.left = start
-			alt.next = nstart
-			nop := &instr{kind: iNop}
-			p.re.add(nop)
-			end.next = nop
-			nend.next = nop
-			start, end = alt, nop
-		}
-	}
-	panic("unreachable")
-}
-
-func unNop(i *instr) *instr {
-	for i.kind == iNop {
-		i = i.next
-	}
-	return i
-}
-
-func (re *Regexp) eliminateNops() {
-	for _, inst := range re.inst {
-		if inst.kind == iEnd {
-			continue
-		}
-		inst.next = unNop(inst.next)
-		if inst.kind == iAlt {
-			inst.left = unNop(inst.left)
-		}
-	}
-}
-
-func (re *Regexp) dump() {
-	print("prefix <", re.prefix, ">\n")
-	for _, inst := range re.inst {
-		print(inst.index, ": ")
-		inst.print()
-		if inst.kind != iEnd {
-			print(" -> ", inst.next.index)
-		}
-		print("\n")
-	}
-}
-
-func (re *Regexp) doParse() {
-	p := newParser(re)
-	start := &instr{kind: iStart}
-	re.add(start)
-	s, e := p.regexp()
-	start.next = s
-	re.start = start
-	e.next = re.add(&instr{kind: iEnd})
-
-	if debug {
-		re.dump()
-		println()
-	}
-
-	re.eliminateNops()
-	if debug {
-		re.dump()
-		println()
-	}
-	re.setPrefix()
-	if debug {
-		re.dump()
-		println()
-	}
-}
-
-// Extract regular text from the beginning of the pattern,
-// possibly after a leading iBOT.
-// That text can be used by doExecute to speed up matching.
-func (re *Regexp) setPrefix() {
-	var b []byte
-	var utf = make([]byte, utf8.UTFMax)
-	var inst *instr
-	// First instruction is start; skip that.  Also skip any initial iBOT.
-	inst = re.inst[0].next
-	for inst.kind == iBOT {
-		inst = inst.next
-	}
-Loop:
-	for ; inst.kind != iEnd; inst = inst.next {
-		// stop if this is not a char
-		if inst.kind != iChar {
-			break
-		}
-		// stop if this char can be followed by a match for an empty string,
-		// which includes closures, ^, and $.
-		switch inst.next.kind {
-		case iBOT, iEOT, iAlt:
-			break Loop
-		}
-		n := utf8.EncodeRune(utf, inst.char)
-		b = append(b, utf[0:n]...)
-	}
-	// point prefixStart instruction to first non-CHAR after prefix
-	re.prefixStart = inst
-	re.prefixBytes = b
-	re.prefix = string(b)
-}
-
-// String returns the source text used to compile the regular expression.
-func (re *Regexp) String() string {
-	return re.expr
-}
-
-// Compile parses a regular expression and returns, if successful, a Regexp
-// object that can be used to match against text.
-func Compile(str string) (regexp *Regexp, error error) {
-	regexp = new(Regexp)
-	// doParse will panic if there is a parse error.
-	defer func() {
-		if e := recover(); e != nil {
-			regexp = nil
-			error = e.(Error) // Will re-panic if error was not an Error, e.g. nil-pointer exception
-		}
-	}()
-	regexp.expr = str
-	regexp.inst = make([]*instr, 0, 10)
-	regexp.doParse()
-	return
-}
-
-// MustCompile is like Compile but panics if the expression cannot be parsed.
-// It simplifies safe initialization of global variables holding compiled regular
-// expressions.
-func MustCompile(str string) *Regexp {
-	regexp, error := Compile(str)
-	if error != nil {
-		panic(`regexp: compiling "` + str + `": ` + error.Error())
-	}
-	return regexp
-}
-
-// NumSubexp returns the number of parenthesized subexpressions in this Regexp.
-func (re *Regexp) NumSubexp() int { return re.nbra }
-
-// The match arena allows us to reduce the garbage generated by tossing
-// match vectors away as we execute.  Matches are ref counted and returned
-// to a free list when no longer active.  Increases a simple benchmark by 22X.
-type matchArena struct {
-	head  *matchVec
-	len   int // length of match vector
-	pos   int
-	atBOT bool // whether we're at beginning of text
-	atEOT bool // whether we're at end of text
-}
-
-type matchVec struct {
-	m    []int // pairs of bracketing submatches. 0th is start,end
-	ref  int
-	next *matchVec
-}
-
-func (a *matchArena) new() *matchVec {
-	if a.head == nil {
-		const N = 10
-		block := make([]matchVec, N)
-		for i := 0; i < N; i++ {
-			b := &block[i]
-			b.next = a.head
-			a.head = b
-		}
-	}
-	m := a.head
-	a.head = m.next
-	m.ref = 0
-	if m.m == nil {
-		m.m = make([]int, a.len)
-	}
-	return m
-}
-
-func (a *matchArena) free(m *matchVec) {
-	m.ref--
-	if m.ref == 0 {
-		m.next = a.head
-		a.head = m
-	}
-}
-
-func (a *matchArena) copy(m *matchVec) *matchVec {
-	m1 := a.new()
-	copy(m1.m, m.m)
-	return m1
-}
-
-func (a *matchArena) noMatch() *matchVec {
-	m := a.new()
-	for i := range m.m {
-		m.m[i] = -1 // no match seen; catches cases like "a(b)?c" on "ac"
-	}
-	m.ref = 1
-	return m
-}
-
-type state struct {
-	inst     *instr // next instruction to execute
-	prefixed bool   // this match began with a fixed prefix
-	match    *matchVec
-}
-
-// Append new state to to-do list.  Leftmost-longest wins so avoid
-// adding a state that's already active.  The matchVec will be inc-ref'ed
-// if it is assigned to a state.
-func (a *matchArena) addState(s []state, inst *instr, prefixed bool, match *matchVec) []state {
-	switch inst.kind {
-	case iBOT:
-		if a.atBOT {
-			s = a.addState(s, inst.next, prefixed, match)
-		}
-		return s
-	case iEOT:
-		if a.atEOT {
-			s = a.addState(s, inst.next, prefixed, match)
-		}
-		return s
-	case iBra:
-		match.m[inst.braNum] = a.pos
-		s = a.addState(s, inst.next, prefixed, match)
-		return s
-	}
-	l := len(s)
-	// States are inserted in order so it's sufficient to see if we have the same
-	// instruction; no need to see if existing match is earlier (it is).
-	for i := 0; i < l; i++ {
-		if s[i].inst == inst {
-			return s
-		}
-	}
-	s = append(s, state{inst, prefixed, match})
-	match.ref++
-	if inst.kind == iAlt {
-		s = a.addState(s, inst.left, prefixed, a.copy(match))
-		// give other branch a copy of this match vector
-		s = a.addState(s, inst.next, prefixed, a.copy(match))
-	}
-	return s
-}
-
-// input abstracts different representations of the input text. It provides
-// one-character lookahead.
-type input interface {
-	step(pos int) (r rune, width int) // advance one rune
-	canCheckPrefix() bool             // can we look ahead without losing info?
-	hasPrefix(re *Regexp) bool
-	index(re *Regexp, pos int) int
-}
-
-// inputString scans a string.
-type inputString struct {
-	str string
-}
-
-func newInputString(str string) *inputString {
-	return &inputString{str: str}
-}
-
-func (i *inputString) step(pos int) (rune, int) {
-	if pos < len(i.str) {
-		return utf8.DecodeRuneInString(i.str[pos:len(i.str)])
-	}
-	return endOfText, 0
-}
-
-func (i *inputString) canCheckPrefix() bool {
-	return true
-}
-
-func (i *inputString) hasPrefix(re *Regexp) bool {
-	return strings.HasPrefix(i.str, re.prefix)
-}
-
-func (i *inputString) index(re *Regexp, pos int) int {
-	return strings.Index(i.str[pos:], re.prefix)
-}
-
-// inputBytes scans a byte slice.
-type inputBytes struct {
-	str []byte
-}
-
-func newInputBytes(str []byte) *inputBytes {
-	return &inputBytes{str: str}
-}
-
-func (i *inputBytes) step(pos int) (rune, int) {
-	if pos < len(i.str) {
-		return utf8.DecodeRune(i.str[pos:len(i.str)])
-	}
-	return endOfText, 0
-}
-
-func (i *inputBytes) canCheckPrefix() bool {
-	return true
-}
-
-func (i *inputBytes) hasPrefix(re *Regexp) bool {
-	return bytes.HasPrefix(i.str, re.prefixBytes)
-}
-
-func (i *inputBytes) index(re *Regexp, pos int) int {
-	return bytes.Index(i.str[pos:], re.prefixBytes)
-}
-
-// inputReader scans a RuneReader.
-type inputReader struct {
-	r     io.RuneReader
-	atEOT bool
-	pos   int
-}
-
-func newInputReader(r io.RuneReader) *inputReader {
-	return &inputReader{r: r}
-}
-
-func (i *inputReader) step(pos int) (rune, int) {
-	if !i.atEOT && pos != i.pos {
-		return endOfText, 0
-
-	}
-	r, w, err := i.r.ReadRune()
-	if err != nil {
-		i.atEOT = true
-		return endOfText, 0
-	}
-	i.pos += w
-	return r, w
-}
-
-func (i *inputReader) canCheckPrefix() bool {
-	return false
-}
-
-func (i *inputReader) hasPrefix(re *Regexp) bool {
-	return false
-}
-
-func (i *inputReader) index(re *Regexp, pos int) int {
-	return -1
-}
-
-// Search match starting from pos bytes into the input.
-func (re *Regexp) doExecute(i input, pos int) []int {
-	var s [2][]state
-	s[0] = make([]state, 0, 10)
-	s[1] = make([]state, 0, 10)
-	in, out := 0, 1
-	var final state
-	found := false
-	anchored := re.inst[0].next.kind == iBOT
-	if anchored && pos > 0 {
-		return nil
-	}
-	// fast check for initial plain substring
-	if i.canCheckPrefix() && re.prefix != "" {
-		advance := 0
-		if anchored {
-			if !i.hasPrefix(re) {
-				return nil
-			}
-		} else {
-			advance = i.index(re, pos)
-			if advance == -1 {
-				return nil
-			}
-		}
-		pos += advance
-	}
-	// We look one character ahead so we can match $, which checks whether
-	// we are at EOT.
-	nextChar, nextWidth := i.step(pos)
-	arena := &matchArena{
-		len:   2 * (re.nbra + 1),
-		pos:   pos,
-		atBOT: pos == 0,
-		atEOT: nextChar == endOfText,
-	}
-	for c, startPos := rune(0), pos; c != endOfText; {
-		if !found && (pos == startPos || !anchored) {
-			// prime the pump if we haven't seen a match yet
-			match := arena.noMatch()
-			match.m[0] = pos
-			s[out] = arena.addState(s[out], re.start.next, false, match)
-			arena.free(match) // if addState saved it, ref was incremented
-		} else if len(s[out]) == 0 {
-			// machine has completed
-			break
-		}
-		in, out = out, in // old out state is new in state
-		// clear out old state
-		old := s[out]
-		for _, state := range old {
-			arena.free(state.match)
-		}
-		s[out] = old[0:0] // truncate state vector
-		c = nextChar
-		thisPos := pos
-		pos += nextWidth
-		nextChar, nextWidth = i.step(pos)
-		arena.atEOT = nextChar == endOfText
-		arena.atBOT = false
-		arena.pos = pos
-		for _, st := range s[in] {
-			switch st.inst.kind {
-			case iBOT:
-			case iEOT:
-			case iChar:
-				if c == st.inst.char {
-					s[out] = arena.addState(s[out], st.inst.next, st.prefixed, st.match)
-				}
-			case iCharClass:
-				if st.inst.cclass.matches(c) {
-					s[out] = arena.addState(s[out], st.inst.next, st.prefixed, st.match)
-				}
-			case iAny:
-				if c != endOfText {
-					s[out] = arena.addState(s[out], st.inst.next, st.prefixed, st.match)
-				}
-			case iNotNL:
-				if c != endOfText && c != '\n' {
-					s[out] = arena.addState(s[out], st.inst.next, st.prefixed, st.match)
-				}
-			case iBra:
-			case iAlt:
-			case iEnd:
-				// choose leftmost longest
-				if !found || // first
-					st.match.m[0] < final.match.m[0] || // leftmost
-					(st.match.m[0] == final.match.m[0] && thisPos > final.match.m[1]) { // longest
-					if final.match != nil {
-						arena.free(final.match)
-					}
-					final = st
-					final.match.ref++
-					final.match.m[1] = thisPos
-				}
-				found = true
-			default:
-				st.inst.print()
-				panic("unknown instruction in execute")
-			}
-		}
-	}
-	if final.match == nil {
-		return nil
-	}
-	// if match found, back up start of match by width of prefix.
-	if final.prefixed && len(final.match.m) > 0 {
-		final.match.m[0] -= len(re.prefix)
-	}
-	return final.match.m
-}
-
-// LiteralPrefix returns a literal string that must begin any match
-// of the regular expression re.  It returns the boolean true if the
-// literal string comprises the entire regular expression.
-func (re *Regexp) LiteralPrefix() (prefix string, complete bool) {
-	c := make([]rune, len(re.inst)-2) // minus start and end.
-	// First instruction is start; skip that.
-	i := 0
-	for inst := re.inst[0].next; inst.kind != iEnd; inst = inst.next {
-		// stop if this is not a char
-		if inst.kind != iChar {
-			return string(c[:i]), false
-		}
-		c[i] = inst.char
-		i++
-	}
-	return string(c[:i]), true
-}
-
-// MatchReader returns whether the Regexp matches the text read by the
-// RuneReader.  The return value is a boolean: true for match, false for no
-// match.
-func (re *Regexp) MatchReader(r io.RuneReader) bool {
-	return len(re.doExecute(newInputReader(r), 0)) > 0
-}
-
-// MatchString returns whether the Regexp matches the string s.
-// The return value is a boolean: true for match, false for no match.
-func (re *Regexp) MatchString(s string) bool { return len(re.doExecute(newInputString(s), 0)) > 0 }
-
-// Match returns whether the Regexp matches the byte slice b.
-// The return value is a boolean: true for match, false for no match.
-func (re *Regexp) Match(b []byte) bool { return len(re.doExecute(newInputBytes(b), 0)) > 0 }
-
-// MatchReader checks whether a textual regular expression matches the text
-// read by the RuneReader.  More complicated queries need to use Compile and
-// the full Regexp interface.
-func MatchReader(pattern string, r io.RuneReader) (matched bool, error error) {
-	re, err := Compile(pattern)
-	if err != nil {
-		return false, err
-	}
-	return re.MatchReader(r), nil
-}
-
-// MatchString checks whether a textual regular expression
-// matches a string.  More complicated queries need
-// to use Compile and the full Regexp interface.
-func MatchString(pattern string, s string) (matched bool, error error) {
-	re, err := Compile(pattern)
-	if err != nil {
-		return false, err
-	}
-	return re.MatchString(s), nil
-}
-
-// Match checks whether a textual regular expression
-// matches a byte slice.  More complicated queries need
-// to use Compile and the full Regexp interface.
-func Match(pattern string, b []byte) (matched bool, error error) {
-	re, err := Compile(pattern)
-	if err != nil {
-		return false, err
-	}
-	return re.Match(b), nil
-}
-
-// ReplaceAllString returns a copy of src in which all matches for the Regexp
-// have been replaced by repl.  No support is provided for expressions
-// (e.g. \1 or $1) in the replacement string.
-func (re *Regexp) ReplaceAllString(src, repl string) string {
-	return re.ReplaceAllStringFunc(src, func(string) string { return repl })
-}
-
-// ReplaceAllStringFunc returns a copy of src in which all matches for the
-// Regexp have been replaced by the return value of of function repl (whose
-// first argument is the matched string).  No support is provided for
-// expressions (e.g. \1 or $1) in the replacement string.
-func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string {
-	lastMatchEnd := 0 // end position of the most recent match
-	searchPos := 0    // position where we next look for a match
-	buf := new(bytes.Buffer)
-	for searchPos <= len(src) {
-		a := re.doExecute(newInputString(src), searchPos)
-		if len(a) == 0 {
-			break // no more matches
-		}
-
-		// Copy the unmatched characters before this match.
-		io.WriteString(buf, src[lastMatchEnd:a[0]])
-
-		// Now insert a copy of the replacement string, but not for a
-		// match of the empty string immediately after another match.
-		// (Otherwise, we get double replacement for patterns that
-		// match both empty and nonempty strings.)
-		if a[1] > lastMatchEnd || a[0] == 0 {
-			io.WriteString(buf, repl(src[a[0]:a[1]]))
-		}
-		lastMatchEnd = a[1]
-
-		// Advance past this match; always advance at least one character.
-		_, width := utf8.DecodeRuneInString(src[searchPos:])
-		if searchPos+width > a[1] {
-			searchPos += width
-		} else if searchPos+1 > a[1] {
-			// This clause is only needed at the end of the input
-			// string.  In that case, DecodeRuneInString returns width=0.
-			searchPos++
-		} else {
-			searchPos = a[1]
-		}
-	}
-
-	// Copy the unmatched characters after the last match.
-	io.WriteString(buf, src[lastMatchEnd:])
-
-	return buf.String()
-}
-
-// ReplaceAll returns a copy of src in which all matches for the Regexp
-// have been replaced by repl.  No support is provided for expressions
-// (e.g. \1 or $1) in the replacement text.
-func (re *Regexp) ReplaceAll(src, repl []byte) []byte {
-	return re.ReplaceAllFunc(src, func([]byte) []byte { return repl })
-}
-
-// ReplaceAllFunc returns a copy of src in which all matches for the
-// Regexp have been replaced by the return value of of function repl (whose
-// first argument is the matched []byte).  No support is provided for
-// expressions (e.g. \1 or $1) in the replacement string.
-func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte {
-	lastMatchEnd := 0 // end position of the most recent match
-	searchPos := 0    // position where we next look for a match
-	buf := new(bytes.Buffer)
-	for searchPos <= len(src) {
-		a := re.doExecute(newInputBytes(src), searchPos)
-		if len(a) == 0 {
-			break // no more matches
-		}
-
-		// Copy the unmatched characters before this match.
-		buf.Write(src[lastMatchEnd:a[0]])
-
-		// Now insert a copy of the replacement string, but not for a
-		// match of the empty string immediately after another match.
-		// (Otherwise, we get double replacement for patterns that
-		// match both empty and nonempty strings.)
-		if a[1] > lastMatchEnd || a[0] == 0 {
-			buf.Write(repl(src[a[0]:a[1]]))
-		}
-		lastMatchEnd = a[1]
-
-		// Advance past this match; always advance at least one character.
-		_, width := utf8.DecodeRune(src[searchPos:])
-		if searchPos+width > a[1] {
-			searchPos += width
-		} else if searchPos+1 > a[1] {
-			// This clause is only needed at the end of the input
-			// string.  In that case, DecodeRuneInString returns width=0.
-			searchPos++
-		} else {
-			searchPos = a[1]
-		}
-	}
-
-	// Copy the unmatched characters after the last match.
-	buf.Write(src[lastMatchEnd:])
-
-	return buf.Bytes()
-}
-
-// QuoteMeta returns a string that quotes all regular expression metacharacters
-// inside the argument text; the returned string is a regular expression matching
-// the literal text.  For example, QuoteMeta(`[foo]`) returns `\[foo\]`.
-func QuoteMeta(s string) string {
-	b := make([]byte, 2*len(s))
-
-	// A byte loop is correct because all metacharacters are ASCII.
-	j := 0
-	for i := 0; i < len(s); i++ {
-		if special(rune(s[i])) {
-			b[j] = '\\'
-			j++
-		}
-		b[j] = s[i]
-		j++
-	}
-	return string(b[0:j])
-}
-
-// Find matches in slice b if b is non-nil, otherwise find matches in string s.
-func (re *Regexp) allMatches(s string, b []byte, n int, deliver func([]int)) {
-	var end int
-	if b == nil {
-		end = len(s)
-	} else {
-		end = len(b)
-	}
-
-	for pos, i, prevMatchEnd := 0, 0, -1; i < n && pos <= end; {
-		var in input
-		if b == nil {
-			in = newInputString(s)
-		} else {
-			in = newInputBytes(b)
-		}
-		matches := re.doExecute(in, pos)
-		if len(matches) == 0 {
-			break
-		}
-
-		accept := true
-		if matches[1] == pos {
-			// We've found an empty match.
-			if matches[0] == prevMatchEnd {
-				// We don't allow an empty match right
-				// after a previous match, so ignore it.
-				accept = false
-			}
-			var width int
-			// TODO: use step()
-			if b == nil {
-				_, width = utf8.DecodeRuneInString(s[pos:end])
-			} else {
-				_, width = utf8.DecodeRune(b[pos:end])
-			}
-			if width > 0 {
-				pos += width
-			} else {
-				pos = end + 1
-			}
-		} else {
-			pos = matches[1]
-		}
-		prevMatchEnd = matches[1]
-
-		if accept {
-			deliver(matches)
-			i++
-		}
-	}
-}
-
-// Find returns a slice holding the text of the leftmost match in b of the regular expression.
-// A return value of nil indicates no match.
-func (re *Regexp) Find(b []byte) []byte {
-	a := re.doExecute(newInputBytes(b), 0)
-	if a == nil {
-		return nil
-	}
-	return b[a[0]:a[1]]
-}
-
-// FindIndex returns a two-element slice of integers defining the location of
-// the leftmost match in b of the regular expression.  The match itself is at
-// b[loc[0]:loc[1]].
-// A return value of nil indicates no match.
-func (re *Regexp) FindIndex(b []byte) (loc []int) {
-	a := re.doExecute(newInputBytes(b), 0)
-	if a == nil {
-		return nil
-	}
-	return a[0:2]
-}
-
-// FindString returns a string holding the text of the leftmost match in s of the regular
-// expression.  If there is no match, the return value is an empty string,
-// but it will also be empty if the regular expression successfully matches
-// an empty string.  Use FindStringIndex or FindStringSubmatch if it is
-// necessary to distinguish these cases.
-func (re *Regexp) FindString(s string) string {
-	a := re.doExecute(newInputString(s), 0)
-	if a == nil {
-		return ""
-	}
-	return s[a[0]:a[1]]
-}
-
-// FindStringIndex returns a two-element slice of integers defining the
-// location of the leftmost match in s of the regular expression.  The match
-// itself is at s[loc[0]:loc[1]].
-// A return value of nil indicates no match.
-func (re *Regexp) FindStringIndex(s string) []int {
-	a := re.doExecute(newInputString(s), 0)
-	if a == nil {
-		return nil
-	}
-	return a[0:2]
-}
-
-// FindReaderIndex returns a two-element slice of integers defining the
-// location of the leftmost match of the regular expression in text read from
-// the RuneReader.  The match itself is at s[loc[0]:loc[1]].  A return
-// value of nil indicates no match.
-func (re *Regexp) FindReaderIndex(r io.RuneReader) []int {
-	a := re.doExecute(newInputReader(r), 0)
-	if a == nil {
-		return nil
-	}
-	return a[0:2]
-}
-
-// FindSubmatch returns a slice of slices holding the text of the leftmost
-// match of the regular expression in b and the matches, if any, of its
-// subexpressions, as defined by the 'Submatch' descriptions in the package
-// comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindSubmatch(b []byte) [][]byte {
-	a := re.doExecute(newInputBytes(b), 0)
-	if a == nil {
-		return nil
-	}
-	ret := make([][]byte, len(a)/2)
-	for i := range ret {
-		if a[2*i] >= 0 {
-			ret[i] = b[a[2*i]:a[2*i+1]]
-		}
-	}
-	return ret
-}
-
-// FindSubmatchIndex returns a slice holding the index pairs identifying the
-// leftmost match of the regular expression in b and the matches, if any, of
-// its subexpressions, as defined by the 'Submatch' and 'Index' descriptions
-// in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindSubmatchIndex(b []byte) []int {
-	return re.doExecute(newInputBytes(b), 0)
-}
-
-// FindStringSubmatch returns a slice of strings holding the text of the
-// leftmost match of the regular expression in s and the matches, if any, of
-// its subexpressions, as defined by the 'Submatch' description in the
-// package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindStringSubmatch(s string) []string {
-	a := re.doExecute(newInputString(s), 0)
-	if a == nil {
-		return nil
-	}
-	ret := make([]string, len(a)/2)
-	for i := range ret {
-		if a[2*i] >= 0 {
-			ret[i] = s[a[2*i]:a[2*i+1]]
-		}
-	}
-	return ret
-}
-
-// FindStringSubmatchIndex returns a slice holding the index pairs
-// identifying the leftmost match of the regular expression in s and the
-// matches, if any, of its subexpressions, as defined by the 'Submatch' and
-// 'Index' descriptions in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindStringSubmatchIndex(s string) []int {
-	return re.doExecute(newInputString(s), 0)
-}
-
-// FindReaderSubmatchIndex returns a slice holding the index pairs
-// identifying the leftmost match of the regular expression of text read by
-// the RuneReader, and the matches, if any, of its subexpressions, as defined
-// by the 'Submatch' and 'Index' descriptions in the package comment.  A
-// return value of nil indicates no match.
-func (re *Regexp) FindReaderSubmatchIndex(r io.RuneReader) []int {
-	return re.doExecute(newInputReader(r), 0)
-}
-
-const startSize = 10 // The size at which to start a slice in the 'All' routines.
-
-// FindAll is the 'All' version of Find; it returns a slice of all successive
-// matches of the expression, as defined by the 'All' description in the
-// package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAll(b []byte, n int) [][]byte {
-	if n < 0 {
-		n = len(b) + 1
-	}
-	result := make([][]byte, 0, startSize)
-	re.allMatches("", b, n, func(match []int) {
-		result = append(result, b[match[0]:match[1]])
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllIndex is the 'All' version of FindIndex; it returns a slice of all
-// successive matches of the expression, as defined by the 'All' description
-// in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllIndex(b []byte, n int) [][]int {
-	if n < 0 {
-		n = len(b) + 1
-	}
-	result := make([][]int, 0, startSize)
-	re.allMatches("", b, n, func(match []int) {
-		result = append(result, match[0:2])
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllString is the 'All' version of FindString; it returns a slice of all
-// successive matches of the expression, as defined by the 'All' description
-// in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllString(s string, n int) []string {
-	if n < 0 {
-		n = len(s) + 1
-	}
-	result := make([]string, 0, startSize)
-	re.allMatches(s, nil, n, func(match []int) {
-		result = append(result, s[match[0]:match[1]])
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllStringIndex is the 'All' version of FindStringIndex; it returns a
-// slice of all successive matches of the expression, as defined by the 'All'
-// description in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllStringIndex(s string, n int) [][]int {
-	if n < 0 {
-		n = len(s) + 1
-	}
-	result := make([][]int, 0, startSize)
-	re.allMatches(s, nil, n, func(match []int) {
-		result = append(result, match[0:2])
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllSubmatch is the 'All' version of FindSubmatch; it returns a slice
-// of all successive matches of the expression, as defined by the 'All'
-// description in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]byte {
-	if n < 0 {
-		n = len(b) + 1
-	}
-	result := make([][][]byte, 0, startSize)
-	re.allMatches("", b, n, func(match []int) {
-		slice := make([][]byte, len(match)/2)
-		for j := range slice {
-			if match[2*j] >= 0 {
-				slice[j] = b[match[2*j]:match[2*j+1]]
-			}
-		}
-		result = append(result, slice)
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllSubmatchIndex is the 'All' version of FindSubmatchIndex; it returns
-// a slice of all successive matches of the expression, as defined by the
-// 'All' description in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int {
-	if n < 0 {
-		n = len(b) + 1
-	}
-	result := make([][]int, 0, startSize)
-	re.allMatches("", b, n, func(match []int) {
-		result = append(result, match)
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllStringSubmatch is the 'All' version of FindStringSubmatch; it
-// returns a slice of all successive matches of the expression, as defined by
-// the 'All' description in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string {
-	if n < 0 {
-		n = len(s) + 1
-	}
-	result := make([][]string, 0, startSize)
-	re.allMatches(s, nil, n, func(match []int) {
-		slice := make([]string, len(match)/2)
-		for j := range slice {
-			if match[2*j] >= 0 {
-				slice[j] = s[match[2*j]:match[2*j+1]]
-			}
-		}
-		result = append(result, slice)
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllStringSubmatchIndex is the 'All' version of
-// FindStringSubmatchIndex; it returns a slice of all successive matches of
-// the expression, as defined by the 'All' description in the package
-// comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int {
-	if n < 0 {
-		n = len(s) + 1
-	}
-	result := make([][]int, 0, startSize)
-	re.allMatches(s, nil, n, func(match []int) {
-		result = append(result, match)
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
diff --git a/third_party/gofrontend/libgo/go/old/template/doc.go b/third_party/gofrontend/libgo/go/old/template/doc.go
deleted file mode 100644
index e778d80..0000000
--- a/third_party/gofrontend/libgo/go/old/template/doc.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-	Package template implements data-driven templates for generating textual
-	output such as HTML.
-
-	Templates are executed by applying them to a data structure.
-	Annotations in the template refer to elements of the data
-	structure (typically a field of a struct or a key in a map)
-	to control execution and derive values to be displayed.
-	The template walks the structure as it executes and the
-	"cursor" @ represents the value at the current location
-	in the structure.
-
-	Data items may be values or pointers; the interface hides the
-	indirection.
-
-	In the following, 'Field' is one of several things, according to the data.
-
-		- The name of a field of a struct (result = data.Field),
-		- The value stored in a map under that key (result = data["Field"]), or
-		- The result of invoking a niladic single-valued method with that name
-		  (result = data.Field())
-
-	If Field is a struct field or method name, it must be an exported
-	(capitalized) name.
-
-	Major constructs ({} are the default delimiters for template actions;
-	[] are the notation in this comment for optional elements):
-
-		{# comment }
-
-	A one-line comment.
-
-		{.section field} XXX [ {.or} YYY ] {.end}
-
-	Set @ to the value of the field.  It may be an explicit @
-	to stay at the same point in the data. If the field is nil
-	or empty, execute YYY; otherwise execute XXX.
-
-		{.repeated section field} XXX [ {.alternates with} ZZZ ] [ {.or} YYY ] {.end}
-
-	Like .section, but field must be an array or slice.  XXX
-	is executed for each element.  If the array is nil or empty,
-	YYY is executed instead.  If the {.alternates with} marker
-	is present, ZZZ is executed between iterations of XXX.
-
-		{field}
-		{field1 field2 ...}
-		{field|formatter}
-		{field1 field2...|formatter}
-		{field|formatter1|formatter2}
-
-	Insert the value of the fields into the output. Each field is
-	first looked for in the cursor, as in .section and .repeated.
-	If it is not found, the search continues in outer sections
-	until the top level is reached.
-
-	If the field value is a pointer, leading asterisks indicate
-	that the value to be inserted should be evaluated through the
-	pointer.  For example, if x.p is of type *int, {x.p} will
-	insert the value of the pointer but {*x.p} will insert the
-	value of the underlying integer.  If the value is nil or not a
-	pointer, asterisks have no effect.
-
-	If a formatter is specified, it must be named in the formatter
-	map passed to the template set up routines or in the default
-	set ("html","str","") and is used to process the data for
-	output.  The formatter function has signature
-		func(wr io.Writer, formatter string, data ...interface{})
-	where wr is the destination for output, data holds the field
-	values at the instantiation, and formatter is its name at
-	the invocation site.  The default formatter just concatenates
-	the string representations of the fields.
-
-	Multiple formatters separated by the pipeline character | are
-	executed sequentially, with each formatter receiving the bytes
-	emitted by the one to its left.
-
-	As well as field names, one may use literals with Go syntax.
-	Integer, floating-point, and string literals are supported.
-	Raw strings may not span newlines.
-
-	The delimiter strings get their default value, "{" and "}", from
-	JSON-template.  They may be set to any non-empty, space-free
-	string using the SetDelims method.  Their value can be printed
-	in the output using {.meta-left} and {.meta-right}.
-*/
-package template
diff --git a/third_party/gofrontend/libgo/go/old/template/execute.go b/third_party/gofrontend/libgo/go/old/template/execute.go
deleted file mode 100644
index 464b620..0000000
--- a/third_party/gofrontend/libgo/go/old/template/execute.go
+++ /dev/null
@@ -1,346 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Code to execute a parsed template.
-
-package template
-
-import (
-	"bytes"
-	"io"
-	"reflect"
-	"strings"
-)
-
-// Internal state for executing a Template.  As we evaluate the struct,
-// the data item descends into the fields associated with sections, etc.
-// Parent is used to walk upwards to find variables higher in the tree.
-type state struct {
-	parent *state          // parent in hierarchy
-	data   reflect.Value   // the driver data for this section etc.
-	wr     io.Writer       // where to send output
-	buf    [2]bytes.Buffer // alternating buffers used when chaining formatters
-}
-
-func (parent *state) clone(data reflect.Value) *state {
-	return &state{parent: parent, data: data, wr: parent.wr}
-}
-
-// Evaluate interfaces and pointers looking for a value that can look up the name, via a
-// struct field, method, or map key, and return the result of the lookup.
-func (t *Template) lookup(st *state, v reflect.Value, name string) reflect.Value {
-	for v.IsValid() {
-		typ := v.Type()
-		if n := v.Type().NumMethod(); n > 0 {
-			for i := 0; i < n; i++ {
-				m := typ.Method(i)
-				mtyp := m.Type
-				if m.Name == name && mtyp.NumIn() == 1 && mtyp.NumOut() == 1 {
-					if !isExported(name) {
-						t.execError(st, t.linenum, "name not exported: %s in type %s", name, st.data.Type())
-					}
-					return v.Method(i).Call(nil)[0]
-				}
-			}
-		}
-		switch av := v; av.Kind() {
-		case reflect.Ptr:
-			v = av.Elem()
-		case reflect.Interface:
-			v = av.Elem()
-		case reflect.Struct:
-			if !isExported(name) {
-				t.execError(st, t.linenum, "name not exported: %s in type %s", name, st.data.Type())
-			}
-			return av.FieldByName(name)
-		case reflect.Map:
-			if v := av.MapIndex(reflect.ValueOf(name)); v.IsValid() {
-				return v
-			}
-			return reflect.Zero(typ.Elem())
-		default:
-			return reflect.Value{}
-		}
-	}
-	return v
-}
-
-// indirectPtr returns the item numLevels levels of indirection below the value.
-// It is forgiving: if the value is not a pointer, it returns it rather than giving
-// an error.  If the pointer is nil, it is returned as is.
-func indirectPtr(v reflect.Value, numLevels int) reflect.Value {
-	for i := numLevels; v.IsValid() && i > 0; i++ {
-		if p := v; p.Kind() == reflect.Ptr {
-			if p.IsNil() {
-				return v
-			}
-			v = p.Elem()
-		} else {
-			break
-		}
-	}
-	return v
-}
-
-// Walk v through pointers and interfaces, extracting the elements within.
-func indirect(v reflect.Value) reflect.Value {
-loop:
-	for v.IsValid() {
-		switch av := v; av.Kind() {
-		case reflect.Ptr:
-			v = av.Elem()
-		case reflect.Interface:
-			v = av.Elem()
-		default:
-			break loop
-		}
-	}
-	return v
-}
-
-// If the data for this template is a struct, find the named variable.
-// Names of the form a.b.c are walked down the data tree.
-// The special name "@" (the "cursor") denotes the current data.
-// The value coming in (st.data) might need indirecting to reach
-// a struct while the return value is not indirected - that is,
-// it represents the actual named field. Leading stars indicate
-// levels of indirection to be applied to the value.
-func (t *Template) findVar(st *state, s string) reflect.Value {
-	data := st.data
-	flattenedName := strings.TrimLeft(s, "*")
-	numStars := len(s) - len(flattenedName)
-	s = flattenedName
-	if s == "@" {
-		return indirectPtr(data, numStars)
-	}
-	for _, elem := range strings.Split(s, ".") {
-		// Look up field; data must be a struct or map.
-		data = t.lookup(st, data, elem)
-		if !data.IsValid() {
-			return reflect.Value{}
-		}
-	}
-	return indirectPtr(data, numStars)
-}
-
-// Is there no data to look at?
-func empty(v reflect.Value) bool {
-	v = indirect(v)
-	if !v.IsValid() {
-		return true
-	}
-	switch v.Kind() {
-	case reflect.Bool:
-		return v.Bool() == false
-	case reflect.String:
-		return v.String() == ""
-	case reflect.Struct:
-		return false
-	case reflect.Map:
-		return false
-	case reflect.Array:
-		return v.Len() == 0
-	case reflect.Slice:
-		return v.Len() == 0
-	}
-	return false
-}
-
-// Look up a variable or method, up through the parent if necessary.
-func (t *Template) varValue(name string, st *state) reflect.Value {
-	field := t.findVar(st, name)
-	if !field.IsValid() {
-		if st.parent == nil {
-			t.execError(st, t.linenum, "name not found: %s in type %s", name, st.data.Type())
-		}
-		return t.varValue(name, st.parent)
-	}
-	return field
-}
-
-func (t *Template) format(wr io.Writer, fmt string, val []interface{}, v *variableElement, st *state) {
-	fn := t.formatter(fmt)
-	if fn == nil {
-		t.execError(st, v.linenum, "missing formatter %s for variable", fmt)
-	}
-	fn(wr, fmt, val...)
-}
-
-// Evaluate a variable, looking up through the parent if necessary.
-// If it has a formatter attached ({var|formatter}) run that too.
-func (t *Template) writeVariable(v *variableElement, st *state) {
-	// Resolve field names
-	val := make([]interface{}, len(v.args))
-	for i, arg := range v.args {
-		if name, ok := arg.(fieldName); ok {
-			val[i] = t.varValue(string(name), st).Interface()
-		} else {
-			val[i] = arg
-		}
-	}
-	for i, fmt := range v.fmts[:len(v.fmts)-1] {
-		b := &st.buf[i&1]
-		b.Reset()
-		t.format(b, fmt, val, v, st)
-		val = val[0:1]
-		val[0] = b.Bytes()
-	}
-	t.format(st.wr, v.fmts[len(v.fmts)-1], val, v, st)
-}
-
-// Execute element i.  Return next index to execute.
-func (t *Template) executeElement(i int, st *state) int {
-	switch elem := t.elems[i].(type) {
-	case *textElement:
-		st.wr.Write(elem.text)
-		return i + 1
-	case *literalElement:
-		st.wr.Write(elem.text)
-		return i + 1
-	case *variableElement:
-		t.writeVariable(elem, st)
-		return i + 1
-	case *sectionElement:
-		t.executeSection(elem, st)
-		return elem.end
-	case *repeatedElement:
-		t.executeRepeated(elem, st)
-		return elem.end
-	}
-	e := t.elems[i]
-	t.execError(st, 0, "internal error: bad directive in execute: %v %T\n", reflect.ValueOf(e).Interface(), e)
-	return 0
-}
-
-// Execute the template.
-func (t *Template) execute(start, end int, st *state) {
-	for i := start; i < end; {
-		i = t.executeElement(i, st)
-	}
-}
-
-// Execute a .section
-func (t *Template) executeSection(s *sectionElement, st *state) {
-	// Find driver data for this section.  It must be in the current struct.
-	field := t.varValue(s.field, st)
-	if !field.IsValid() {
-		t.execError(st, s.linenum, ".section: cannot find field %s in %s", s.field, st.data.Type())
-	}
-	st = st.clone(field)
-	start, end := s.start, s.or
-	if !empty(field) {
-		// Execute the normal block.
-		if end < 0 {
-			end = s.end
-		}
-	} else {
-		// Execute the .or block.  If it's missing, do nothing.
-		start, end = s.or, s.end
-		if start < 0 {
-			return
-		}
-	}
-	for i := start; i < end; {
-		i = t.executeElement(i, st)
-	}
-}
-
-// Return the result of calling the Iter method on v, or nil.
-func iter(v reflect.Value) reflect.Value {
-	for j := 0; j < v.Type().NumMethod(); j++ {
-		mth := v.Type().Method(j)
-		fv := v.Method(j)
-		ft := fv.Type()
-		// TODO(rsc): NumIn() should return 0 here, because ft is from a curried FuncValue.
-		if mth.Name != "Iter" || ft.NumIn() != 1 || ft.NumOut() != 1 {
-			continue
-		}
-		ct := ft.Out(0)
-		if ct.Kind() != reflect.Chan ||
-			ct.ChanDir()&reflect.RecvDir == 0 {
-			continue
-		}
-		return fv.Call(nil)[0]
-	}
-	return reflect.Value{}
-}
-
-// Execute a .repeated section
-func (t *Template) executeRepeated(r *repeatedElement, st *state) {
-	// Find driver data for this section.  It must be in the current struct.
-	field := t.varValue(r.field, st)
-	if !field.IsValid() {
-		t.execError(st, r.linenum, ".repeated: cannot find field %s in %s", r.field, st.data.Type())
-	}
-	field = indirect(field)
-
-	start, end := r.start, r.or
-	if end < 0 {
-		end = r.end
-	}
-	if r.altstart >= 0 {
-		end = r.altstart
-	}
-	first := true
-
-	// Code common to all the loops.
-	loopBody := func(newst *state) {
-		// .alternates between elements
-		if !first && r.altstart >= 0 {
-			for i := r.altstart; i < r.altend; {
-				i = t.executeElement(i, newst)
-			}
-		}
-		first = false
-		for i := start; i < end; {
-			i = t.executeElement(i, newst)
-		}
-	}
-
-	if array := field; array.Kind() == reflect.Array || array.Kind() == reflect.Slice {
-		for j := 0; j < array.Len(); j++ {
-			loopBody(st.clone(array.Index(j)))
-		}
-	} else if m := field; m.Kind() == reflect.Map {
-		for _, key := range m.MapKeys() {
-			loopBody(st.clone(m.MapIndex(key)))
-		}
-	} else if ch := iter(field); ch.IsValid() {
-		for {
-			e, ok := ch.Recv()
-			if !ok {
-				break
-			}
-			loopBody(st.clone(e))
-		}
-	} else {
-		t.execError(st, r.linenum, ".repeated: cannot repeat %s (type %s)",
-			r.field, field.Type())
-	}
-
-	if first {
-		// Empty. Execute the .or block, once.  If it's missing, do nothing.
-		start, end := r.or, r.end
-		if start >= 0 {
-			newst := st.clone(field)
-			for i := start; i < end; {
-				i = t.executeElement(i, newst)
-			}
-		}
-		return
-	}
-}
-
-// A valid delimiter must contain no space and be non-empty.
-func validDelim(d []byte) bool {
-	if len(d) == 0 {
-		return false
-	}
-	for _, c := range d {
-		if isSpace(c) {
-			return false
-		}
-	}
-	return true
-}
diff --git a/third_party/gofrontend/libgo/go/old/template/format.go b/third_party/gofrontend/libgo/go/old/template/format.go
deleted file mode 100644
index 9156b08..0000000
--- a/third_party/gofrontend/libgo/go/old/template/format.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Template library: default formatters
-
-package template
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-)
-
-// StringFormatter formats into the default string representation.
-// It is stored under the name "str" and is the default formatter.
-// You can override the default formatter by storing your default
-// under the name "" in your custom formatter map.
-func StringFormatter(w io.Writer, format string, value ...interface{}) {
-	if len(value) == 1 {
-		if b, ok := value[0].([]byte); ok {
-			w.Write(b)
-			return
-		}
-	}
-	fmt.Fprint(w, value...)
-}
-
-var (
-	esc_quot = []byte("&#34;") // shorter than "&quot;"
-	esc_apos = []byte("&#39;") // shorter than "&apos;"
-	esc_amp  = []byte("&amp;")
-	esc_lt   = []byte("&lt;")
-	esc_gt   = []byte("&gt;")
-)
-
-// HTMLEscape writes to w the properly escaped HTML equivalent
-// of the plain text data s.
-func HTMLEscape(w io.Writer, s []byte) {
-	var esc []byte
-	last := 0
-	for i, c := range s {
-		switch c {
-		case '"':
-			esc = esc_quot
-		case '\'':
-			esc = esc_apos
-		case '&':
-			esc = esc_amp
-		case '<':
-			esc = esc_lt
-		case '>':
-			esc = esc_gt
-		default:
-			continue
-		}
-		w.Write(s[last:i])
-		w.Write(esc)
-		last = i + 1
-	}
-	w.Write(s[last:])
-}
-
-// HTMLFormatter formats arbitrary values for HTML
-func HTMLFormatter(w io.Writer, format string, value ...interface{}) {
-	ok := false
-	var b []byte
-	if len(value) == 1 {
-		b, ok = value[0].([]byte)
-	}
-	if !ok {
-		var buf bytes.Buffer
-		fmt.Fprint(&buf, value...)
-		b = buf.Bytes()
-	}
-	HTMLEscape(w, b)
-}
diff --git a/third_party/gofrontend/libgo/go/old/template/parse.go b/third_party/gofrontend/libgo/go/old/template/parse.go
deleted file mode 100644
index e1bfa47..0000000
--- a/third_party/gofrontend/libgo/go/old/template/parse.go
+++ /dev/null
@@ -1,742 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Code to parse a template.
-
-package template
-
-import (
-	"fmt"
-	"io"
-	"io/ioutil"
-	"reflect"
-	"strconv"
-	"strings"
-	"unicode"
-	"unicode/utf8"
-)
-
-// Errors returned during parsing and execution.  Users may extract the information and reformat
-// if they desire.
-type Error struct {
-	Line int
-	Msg  string
-}
-
-func (e *Error) Error() string { return fmt.Sprintf("line %d: %s", e.Line, e.Msg) }
-
-// checkError is a deferred function to turn a panic with type *Error into a plain error return.
-// Other panics are unexpected and so are re-enabled.
-func checkError(error *error) {
-	if v := recover(); v != nil {
-		if e, ok := v.(*Error); ok {
-			*error = e
-		} else {
-			// runtime errors should crash
-			panic(v)
-		}
-	}
-}
-
-// Most of the literals are aces.
-var lbrace = []byte{'{'}
-var rbrace = []byte{'}'}
-var space = []byte{' '}
-var tab = []byte{'\t'}
-
-// The various types of "tokens", which are plain text or (usually) brace-delimited descriptors
-const (
-	tokAlternates = iota
-	tokComment
-	tokEnd
-	tokLiteral
-	tokOr
-	tokRepeated
-	tokSection
-	tokText
-	tokVariable
-)
-
-// FormatterMap is the type describing the mapping from formatter
-// names to the functions that implement them.
-type FormatterMap map[string]func(io.Writer, string, ...interface{})
-
-// Built-in formatters.
-var builtins = FormatterMap{
-	"html": HTMLFormatter,
-	"str":  StringFormatter,
-	"":     StringFormatter,
-}
-
-// The parsed state of a template is a vector of xxxElement structs.
-// Sections have line numbers so errors can be reported better during execution.
-
-// Plain text.
-type textElement struct {
-	text []byte
-}
-
-// A literal such as .meta-left or .meta-right
-type literalElement struct {
-	text []byte
-}
-
-// A variable invocation to be evaluated
-type variableElement struct {
-	linenum int
-	args    []interface{} // The fields and literals in the invocation.
-	fmts    []string      // Names of formatters to apply. len(fmts) > 0
-}
-
-// A variableElement arg to be evaluated as a field name
-type fieldName string
-
-// A .section block, possibly with a .or
-type sectionElement struct {
-	linenum int    // of .section itself
-	field   string // cursor field for this block
-	start   int    // first element
-	or      int    // first element of .or block
-	end     int    // one beyond last element
-}
-
-// A .repeated block, possibly with a .or and a .alternates
-type repeatedElement struct {
-	sectionElement     // It has the same structure...
-	altstart       int // ... except for alternates
-	altend         int
-}
-
-// Template is the type that represents a template definition.
-// It is unchanged after parsing.
-type Template struct {
-	fmap FormatterMap // formatters for variables
-	// Used during parsing:
-	ldelim, rdelim []byte // delimiters; default {}
-	buf            []byte // input text to process
-	p              int    // position in buf
-	linenum        int    // position in input
-	// Parsed results:
-	elems []interface{}
-}
-
-// New creates a new template with the specified formatter map (which
-// may be nil) to define auxiliary functions for formatting variables.
-func New(fmap FormatterMap) *Template {
-	t := new(Template)
-	t.fmap = fmap
-	t.ldelim = lbrace
-	t.rdelim = rbrace
-	t.elems = make([]interface{}, 0, 16)
-	return t
-}
-
-// Report error and stop executing.  The line number must be provided explicitly.
-func (t *Template) execError(st *state, line int, err string, args ...interface{}) {
-	panic(&Error{line, fmt.Sprintf(err, args...)})
-}
-
-// Report error, panic to terminate parsing.
-// The line number comes from the template state.
-func (t *Template) parseError(err string, args ...interface{}) {
-	panic(&Error{t.linenum, fmt.Sprintf(err, args...)})
-}
-
-// Is this an exported - upper case - name?
-func isExported(name string) bool {
-	r, _ := utf8.DecodeRuneInString(name)
-	return unicode.IsUpper(r)
-}
-
-// -- Lexical analysis
-
-// Is c a space character?
-func isSpace(c uint8) bool { return c == ' ' || c == '\t' || c == '\r' || c == '\n' }
-
-// Safely, does s[n:n+len(t)] == t?
-func equal(s []byte, n int, t []byte) bool {
-	b := s[n:]
-	if len(t) > len(b) { // not enough space left for a match.
-		return false
-	}
-	for i, c := range t {
-		if c != b[i] {
-			return false
-		}
-	}
-	return true
-}
-
-// isQuote returns true if c is a string- or character-delimiting quote character.
-func isQuote(c byte) bool {
-	return c == '"' || c == '`' || c == '\''
-}
-
-// endQuote returns the end quote index for the quoted string that
-// starts at n, or -1 if no matching end quote is found before the end
-// of the line.
-func endQuote(s []byte, n int) int {
-	quote := s[n]
-	for n++; n < len(s); n++ {
-		switch s[n] {
-		case '\\':
-			if quote == '"' || quote == '\'' {
-				n++
-			}
-		case '\n':
-			return -1
-		case quote:
-			return n
-		}
-	}
-	return -1
-}
-
-// nextItem returns the next item from the input buffer.  If the returned
-// item is empty, we are at EOF.  The item will be either a
-// delimited string or a non-empty string between delimited
-// strings. Tokens stop at (but include, if plain text) a newline.
-// Action tokens on a line by themselves drop any space on
-// either side, up to and including the newline.
-func (t *Template) nextItem() []byte {
-	startOfLine := t.p == 0 || t.buf[t.p-1] == '\n'
-	start := t.p
-	var i int
-	newline := func() {
-		t.linenum++
-		i++
-	}
-	// Leading space up to but not including newline
-	for i = start; i < len(t.buf); i++ {
-		if t.buf[i] == '\n' || !isSpace(t.buf[i]) {
-			break
-		}
-	}
-	leadingSpace := i > start
-	// What's left is nothing, newline, delimited string, or plain text
-	switch {
-	case i == len(t.buf):
-		// EOF; nothing to do
-	case t.buf[i] == '\n':
-		newline()
-	case equal(t.buf, i, t.ldelim):
-		left := i         // Start of left delimiter.
-		right := -1       // Will be (immediately after) right delimiter.
-		haveText := false // Delimiters contain text.
-		i += len(t.ldelim)
-		// Find the end of the action.
-		for ; i < len(t.buf); i++ {
-			if t.buf[i] == '\n' {
-				break
-			}
-			if isQuote(t.buf[i]) {
-				i = endQuote(t.buf, i)
-				if i == -1 {
-					t.parseError("unmatched quote")
-					return nil
-				}
-				continue
-			}
-			if equal(t.buf, i, t.rdelim) {
-				i += len(t.rdelim)
-				right = i
-				break
-			}
-			haveText = true
-		}
-		if right < 0 {
-			t.parseError("unmatched opening delimiter")
-			return nil
-		}
-		// Is this a special action (starts with '.' or '#') and the only thing on the line?
-		if startOfLine && haveText {
-			firstChar := t.buf[left+len(t.ldelim)]
-			if firstChar == '.' || firstChar == '#' {
-				// It's special and the first thing on the line. Is it the last?
-				for j := right; j < len(t.buf) && isSpace(t.buf[j]); j++ {
-					if t.buf[j] == '\n' {
-						// Yes it is. Drop the surrounding space and return the {.foo}
-						t.linenum++
-						t.p = j + 1
-						return t.buf[left:right]
-					}
-				}
-			}
-		}
-		// No it's not. If there's leading space, return that.
-		if leadingSpace {
-			// not trimming space: return leading space if there is some.
-			t.p = left
-			return t.buf[start:left]
-		}
-		// Return the word, leave the trailing space.
-		start = left
-		break
-	default:
-		for ; i < len(t.buf); i++ {
-			if t.buf[i] == '\n' {
-				newline()
-				break
-			}
-			if equal(t.buf, i, t.ldelim) {
-				break
-			}
-		}
-	}
-	item := t.buf[start:i]
-	t.p = i
-	return item
-}
-
-// Turn a byte array into a space-split array of strings,
-// taking into account quoted strings.
-func words(buf []byte) []string {
-	s := make([]string, 0, 5)
-	for i := 0; i < len(buf); {
-		// One word per loop
-		for i < len(buf) && isSpace(buf[i]) {
-			i++
-		}
-		if i == len(buf) {
-			break
-		}
-		// Got a word
-		start := i
-		if isQuote(buf[i]) {
-			i = endQuote(buf, i)
-			if i < 0 {
-				i = len(buf)
-			} else {
-				i++
-			}
-		}
-		// Even with quotes, break on space only.  This handles input
-		// such as {""|} and catches quoting mistakes.
-		for i < len(buf) && !isSpace(buf[i]) {
-			i++
-		}
-		s = append(s, string(buf[start:i]))
-	}
-	return s
-}
-
-// Analyze an item and return its token type and, if it's an action item, an array of
-// its constituent words.
-func (t *Template) analyze(item []byte) (tok int, w []string) {
-	// item is known to be non-empty
-	if !equal(item, 0, t.ldelim) { // doesn't start with left delimiter
-		tok = tokText
-		return
-	}
-	if !equal(item, len(item)-len(t.rdelim), t.rdelim) { // doesn't end with right delimiter
-		t.parseError("internal error: unmatched opening delimiter") // lexing should prevent this
-		return
-	}
-	if len(item) <= len(t.ldelim)+len(t.rdelim) { // no contents
-		t.parseError("empty directive")
-		return
-	}
-	// Comment
-	if item[len(t.ldelim)] == '#' {
-		tok = tokComment
-		return
-	}
-	// Split into words
-	w = words(item[len(t.ldelim) : len(item)-len(t.rdelim)]) // drop final delimiter
-	if len(w) == 0 {
-		t.parseError("empty directive")
-		return
-	}
-	first := w[0]
-	if first[0] != '.' {
-		tok = tokVariable
-		return
-	}
-	if len(first) > 1 && first[1] >= '0' && first[1] <= '9' {
-		// Must be a float.
-		tok = tokVariable
-		return
-	}
-	switch first {
-	case ".meta-left", ".meta-right", ".space", ".tab":
-		tok = tokLiteral
-		return
-	case ".or":
-		tok = tokOr
-		return
-	case ".end":
-		tok = tokEnd
-		return
-	case ".section":
-		if len(w) != 2 {
-			t.parseError("incorrect fields for .section: %s", item)
-			return
-		}
-		tok = tokSection
-		return
-	case ".repeated":
-		if len(w) != 3 || w[1] != "section" {
-			t.parseError("incorrect fields for .repeated: %s", item)
-			return
-		}
-		tok = tokRepeated
-		return
-	case ".alternates":
-		if len(w) != 2 || w[1] != "with" {
-			t.parseError("incorrect fields for .alternates: %s", item)
-			return
-		}
-		tok = tokAlternates
-		return
-	}
-	t.parseError("bad directive: %s", item)
-	return
-}
-
-// formatter returns the Formatter with the given name in the Template, or nil if none exists.
-func (t *Template) formatter(name string) func(io.Writer, string, ...interface{}) {
-	if t.fmap != nil {
-		if fn := t.fmap[name]; fn != nil {
-			return fn
-		}
-	}
-	return builtins[name]
-}
-
-// -- Parsing
-
-// newVariable allocates a new variable-evaluation element.
-func (t *Template) newVariable(words []string) *variableElement {
-	formatters := extractFormatters(words)
-	args := make([]interface{}, len(words))
-
-	// Build argument list, processing any literals
-	for i, word := range words {
-		var lerr error
-		switch word[0] {
-		case '"', '`', '\'':
-			v, err := strconv.Unquote(word)
-			if err == nil && word[0] == '\'' {
-				args[i], _ = utf8.DecodeRuneInString(v)
-			} else {
-				args[i], lerr = v, err
-			}
-
-		case '.', '+', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
-			v, err := strconv.ParseInt(word, 0, 64)
-			if err == nil {
-				args[i] = v
-			} else {
-				v, err := strconv.ParseFloat(word, 64)
-				args[i], lerr = v, err
-			}
-
-		default:
-			args[i] = fieldName(word)
-		}
-		if lerr != nil {
-			t.parseError("invalid literal: %q: %s", word, lerr)
-		}
-	}
-
-	// We could remember the function address here and avoid the lookup later,
-	// but it's more dynamic to let the user change the map contents underfoot.
-	// We do require the name to be present, though.
-
-	// Is it in user-supplied map?
-	for _, f := range formatters {
-		if t.formatter(f) == nil {
-			t.parseError("unknown formatter: %q", f)
-		}
-	}
-
-	return &variableElement{t.linenum, args, formatters}
-}
-
-// extractFormatters extracts a list of formatters from words.
-// After the final space-separated argument in a variable, formatters may be
-// specified separated by pipe symbols. For example: {a b c|d|e}
-// The words parameter still has the formatters joined by '|' in the last word.
-// extractFormatters splits formatters, replaces the last word with the content
-// found before the first '|' within it, and returns the formatters obtained.
-// If no formatters are found in words, the default formatter is returned.
-func extractFormatters(words []string) (formatters []string) {
-	// "" is the default formatter.
-	formatters = []string{""}
-	if len(words) == 0 {
-		return
-	}
-	var bar int
-	lastWord := words[len(words)-1]
-	if isQuote(lastWord[0]) {
-		end := endQuote([]byte(lastWord), 0)
-		if end < 0 || end+1 == len(lastWord) || lastWord[end+1] != '|' {
-			return
-		}
-		bar = end + 1
-	} else {
-		bar = strings.IndexRune(lastWord, '|')
-		if bar < 0 {
-			return
-		}
-	}
-	words[len(words)-1] = lastWord[0:bar]
-	formatters = strings.Split(lastWord[bar+1:], "|")
-	return
-}
-
-// Grab the next item.  If it's simple, just append it to the template.
-// Otherwise return its details.
-func (t *Template) parseSimple(item []byte) (done bool, tok int, w []string) {
-	tok, w = t.analyze(item)
-	done = true // assume for simplicity
-	switch tok {
-	case tokComment:
-		return
-	case tokText:
-		t.elems = append(t.elems, &textElement{item})
-		return
-	case tokLiteral:
-		switch w[0] {
-		case ".meta-left":
-			t.elems = append(t.elems, &literalElement{t.ldelim})
-		case ".meta-right":
-			t.elems = append(t.elems, &literalElement{t.rdelim})
-		case ".space":
-			t.elems = append(t.elems, &literalElement{space})
-		case ".tab":
-			t.elems = append(t.elems, &literalElement{tab})
-		default:
-			t.parseError("internal error: unknown literal: %s", w[0])
-		}
-		return
-	case tokVariable:
-		t.elems = append(t.elems, t.newVariable(w))
-		return
-	}
-	return false, tok, w
-}
-
-// parseRepeated and parseSection are mutually recursive
-
-func (t *Template) parseRepeated(words []string) *repeatedElement {
-	r := new(repeatedElement)
-	t.elems = append(t.elems, r)
-	r.linenum = t.linenum
-	r.field = words[2]
-	// Scan section, collecting true and false (.or) blocks.
-	r.start = len(t.elems)
-	r.or = -1
-	r.altstart = -1
-	r.altend = -1
-Loop:
-	for {
-		item := t.nextItem()
-		if len(item) == 0 {
-			t.parseError("missing .end for .repeated section")
-			break
-		}
-		done, tok, w := t.parseSimple(item)
-		if done {
-			continue
-		}
-		switch tok {
-		case tokEnd:
-			break Loop
-		case tokOr:
-			if r.or >= 0 {
-				t.parseError("extra .or in .repeated section")
-				break Loop
-			}
-			r.altend = len(t.elems)
-			r.or = len(t.elems)
-		case tokSection:
-			t.parseSection(w)
-		case tokRepeated:
-			t.parseRepeated(w)
-		case tokAlternates:
-			if r.altstart >= 0 {
-				t.parseError("extra .alternates in .repeated section")
-				break Loop
-			}
-			if r.or >= 0 {
-				t.parseError(".alternates inside .or block in .repeated section")
-				break Loop
-			}
-			r.altstart = len(t.elems)
-		default:
-			t.parseError("internal error: unknown repeated section item: %s", item)
-			break Loop
-		}
-	}
-	if r.altend < 0 {
-		r.altend = len(t.elems)
-	}
-	r.end = len(t.elems)
-	return r
-}
-
-func (t *Template) parseSection(words []string) *sectionElement {
-	s := new(sectionElement)
-	t.elems = append(t.elems, s)
-	s.linenum = t.linenum
-	s.field = words[1]
-	// Scan section, collecting true and false (.or) blocks.
-	s.start = len(t.elems)
-	s.or = -1
-Loop:
-	for {
-		item := t.nextItem()
-		if len(item) == 0 {
-			t.parseError("missing .end for .section")
-			break
-		}
-		done, tok, w := t.parseSimple(item)
-		if done {
-			continue
-		}
-		switch tok {
-		case tokEnd:
-			break Loop
-		case tokOr:
-			if s.or >= 0 {
-				t.parseError("extra .or in .section")
-				break Loop
-			}
-			s.or = len(t.elems)
-		case tokSection:
-			t.parseSection(w)
-		case tokRepeated:
-			t.parseRepeated(w)
-		case tokAlternates:
-			t.parseError(".alternates not in .repeated")
-		default:
-			t.parseError("internal error: unknown section item: %s", item)
-		}
-	}
-	s.end = len(t.elems)
-	return s
-}
-
-func (t *Template) parse() {
-	for {
-		item := t.nextItem()
-		if len(item) == 0 {
-			break
-		}
-		done, tok, w := t.parseSimple(item)
-		if done {
-			continue
-		}
-		switch tok {
-		case tokOr, tokEnd, tokAlternates:
-			t.parseError("unexpected %s", w[0])
-		case tokSection:
-			t.parseSection(w)
-		case tokRepeated:
-			t.parseRepeated(w)
-		default:
-			t.parseError("internal error: bad directive in parse: %s", item)
-		}
-	}
-}
-
-// -- Execution
-
-// -- Public interface
-
-// Parse initializes a Template by parsing its definition.  The string
-// s contains the template text.  If any errors occur, Parse returns
-// the error.
-func (t *Template) Parse(s string) (err error) {
-	if t.elems == nil {
-		return &Error{1, "template not allocated with New"}
-	}
-	if !validDelim(t.ldelim) || !validDelim(t.rdelim) {
-		return &Error{1, fmt.Sprintf("bad delimiter strings %q %q", t.ldelim, t.rdelim)}
-	}
-	defer checkError(&err)
-	t.buf = []byte(s)
-	t.p = 0
-	t.linenum = 1
-	t.parse()
-	return nil
-}
-
-// ParseFile is like Parse but reads the template definition from the
-// named file.
-func (t *Template) ParseFile(filename string) (err error) {
-	b, err := ioutil.ReadFile(filename)
-	if err != nil {
-		return err
-	}
-	return t.Parse(string(b))
-}
-
-// Execute applies a parsed template to the specified data object,
-// generating output to wr.
-func (t *Template) Execute(wr io.Writer, data interface{}) (err error) {
-	// Extract the driver data.
-	val := reflect.ValueOf(data)
-	defer checkError(&err)
-	t.p = 0
-	t.execute(0, len(t.elems), &state{parent: nil, data: val, wr: wr})
-	return nil
-}
-
-// SetDelims sets the left and right delimiters for operations in the
-// template.  They are validated during parsing.  They could be
-// validated here but it's better to keep the routine simple.  The
-// delimiters are very rarely invalid and Parse has the necessary
-// error-handling interface already.
-func (t *Template) SetDelims(left, right string) {
-	t.ldelim = []byte(left)
-	t.rdelim = []byte(right)
-}
-
-// Parse creates a Template with default parameters (such as {} for
-// metacharacters).  The string s contains the template text while
-// the formatter map fmap, which may be nil, defines auxiliary functions
-// for formatting variables.  The template is returned. If any errors
-// occur, err will be non-nil.
-func Parse(s string, fmap FormatterMap) (t *Template, err error) {
-	t = New(fmap)
-	err = t.Parse(s)
-	if err != nil {
-		t = nil
-	}
-	return
-}
-
-// ParseFile is a wrapper function that creates a Template with default
-// parameters (such as {} for metacharacters).  The filename identifies
-// a file containing the template text, while the formatter map fmap, which
-// may be nil, defines auxiliary functions for formatting variables.
-// The template is returned. If any errors occur, err will be non-nil.
-func ParseFile(filename string, fmap FormatterMap) (t *Template, err error) {
-	b, err := ioutil.ReadFile(filename)
-	if err != nil {
-		return nil, err
-	}
-	return Parse(string(b), fmap)
-}
-
-// MustParse is like Parse but panics if the template cannot be parsed.
-func MustParse(s string, fmap FormatterMap) *Template {
-	t, err := Parse(s, fmap)
-	if err != nil {
-		panic("template.MustParse error: " + err.Error())
-	}
-	return t
-}
-
-// MustParseFile is like ParseFile but panics if the file cannot be read
-// or the template cannot be parsed.
-func MustParseFile(filename string, fmap FormatterMap) *Template {
-	b, err := ioutil.ReadFile(filename)
-	if err != nil {
-		panic("template.MustParseFile error: " + err.Error())
-	}
-	return MustParse(string(b), fmap)
-}
diff --git a/third_party/gofrontend/libgo/go/old/template/template_test.go b/third_party/gofrontend/libgo/go/old/template/template_test.go
deleted file mode 100644
index 854a548..0000000
--- a/third_party/gofrontend/libgo/go/old/template/template_test.go
+++ /dev/null
@@ -1,810 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"encoding/json"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"os"
-	"strings"
-	"testing"
-)
-
-type Test struct {
-	in, out, err string
-}
-
-type T struct {
-	Item  string
-	Value string
-}
-
-type U struct {
-	Mp map[string]int
-}
-
-type S struct {
-	Header        string
-	HeaderPtr     *string
-	Integer       int
-	IntegerPtr    *int
-	NilPtr        *int
-	InnerT        T
-	InnerPointerT *T
-	Data          []T
-	Pdata         []*T
-	Empty         []*T
-	Emptystring   string
-	Null          []*T
-	Vec           []interface{}
-	True          bool
-	False         bool
-	Mp            map[string]string
-	JSON          interface{}
-	Innermap      U
-	Stringmap     map[string]string
-	Ptrmap        map[string]*string
-	Iface         interface{}
-	Ifaceptr      interface{}
-}
-
-func (s *S) PointerMethod() string { return "ptrmethod!" }
-
-func (s S) ValueMethod() string { return "valmethod!" }
-
-var t1 = T{"ItemNumber1", "ValueNumber1"}
-var t2 = T{"ItemNumber2", "ValueNumber2"}
-
-func uppercase(v interface{}) string {
-	s := v.(string)
-	t := ""
-	for i := 0; i < len(s); i++ {
-		c := s[i]
-		if 'a' <= c && c <= 'z' {
-			c = c + 'A' - 'a'
-		}
-		t += string(c)
-	}
-	return t
-}
-
-func plus1(v interface{}) string {
-	i := v.(int)
-	return fmt.Sprint(i + 1)
-}
-
-func writer(f func(interface{}) string) func(io.Writer, string, ...interface{}) {
-	return func(w io.Writer, format string, v ...interface{}) {
-		if len(v) != 1 {
-			panic("test writer expected one arg")
-		}
-		io.WriteString(w, f(v[0]))
-	}
-}
-
-func multiword(w io.Writer, format string, value ...interface{}) {
-	for _, v := range value {
-		fmt.Fprintf(w, "<%v>", v)
-	}
-}
-
-func printf(w io.Writer, format string, v ...interface{}) {
-	io.WriteString(w, fmt.Sprintf(v[0].(string), v[1:]...))
-}
-
-var formatters = FormatterMap{
-	"uppercase": writer(uppercase),
-	"+1":        writer(plus1),
-	"multiword": multiword,
-	"printf":    printf,
-}
-
-var tests = []*Test{
-	// Simple
-	{"", "", ""},
-	{"abc", "abc", ""},
-	{"abc\ndef\n", "abc\ndef\n", ""},
-	{" {.meta-left}   \n", "{", ""},
-	{" {.meta-right}   \n", "}", ""},
-	{" {.space}   \n", " ", ""},
-	{" {.tab}   \n", "\t", ""},
-	{"     {#comment}   \n", "", ""},
-	{"\tSome Text\t\n", "\tSome Text\t\n", ""},
-	{" {.meta-right} {.meta-right} {.meta-right} \n", " } } } \n", ""},
-
-	// Variables at top level
-	{
-		in: "{Header}={Integer}\n",
-
-		out: "Header=77\n",
-	},
-
-	{
-		in: "Pointers: {*HeaderPtr}={*IntegerPtr}\n",
-
-		out: "Pointers: Header=77\n",
-	},
-
-	{
-		in: "Stars but not pointers: {*Header}={*Integer}\n",
-
-		out: "Stars but not pointers: Header=77\n",
-	},
-
-	{
-		in: "nil pointer: {*NilPtr}={*Integer}\n",
-
-		out: "nil pointer: <nil>=77\n",
-	},
-
-	{
-		in: `{"Strings" ":"} {""} {"|"} {"\t\u0123 \x23\\"} {"\"}{\\"}`,
-
-		out: "Strings:  | \t\u0123 \x23\\ \"}{\\",
-	},
-
-	{
-		in: "{`Raw strings` `:`} {``} {`|`} {`\\t\\u0123 \\x23\\`} {`}{\\`}",
-
-		out: "Raw strings:  | \\t\\u0123 \\x23\\ }{\\",
-	},
-
-	{
-		in: "Characters: {'a'} {'\\u0123'} {' '} {'{'} {'|'} {'}'}",
-
-		out: "Characters: 97 291 32 123 124 125",
-	},
-
-	{
-		in: "Integers: {1} {-2} {+42} {0777} {0x0a}",
-
-		out: "Integers: 1 -2 42 511 10",
-	},
-
-	{
-		in: "Floats: {.5} {-.5} {1.1} {-2.2} {+42.1} {1e10} {1.2e-3} {1.2e3} {-1.2e3}",
-
-		out: "Floats: 0.5 -0.5 1.1 -2.2 42.1 1e+10 0.0012 1200 -1200",
-	},
-
-	// Method at top level
-	{
-		in: "ptrmethod={PointerMethod}\n",
-
-		out: "ptrmethod=ptrmethod!\n",
-	},
-
-	{
-		in: "valmethod={ValueMethod}\n",
-
-		out: "valmethod=valmethod!\n",
-	},
-
-	// Section
-	{
-		in: "{.section Data }\n" +
-			"some text for the section\n" +
-			"{.end}\n",
-
-		out: "some text for the section\n",
-	},
-	{
-		in: "{.section Data }\n" +
-			"{Header}={Integer}\n" +
-			"{.end}\n",
-
-		out: "Header=77\n",
-	},
-	{
-		in: "{.section Pdata }\n" +
-			"{Header}={Integer}\n" +
-			"{.end}\n",
-
-		out: "Header=77\n",
-	},
-	{
-		in: "{.section Pdata }\n" +
-			"data present\n" +
-			"{.or}\n" +
-			"data not present\n" +
-			"{.end}\n",
-
-		out: "data present\n",
-	},
-	{
-		in: "{.section Empty }\n" +
-			"data present\n" +
-			"{.or}\n" +
-			"data not present\n" +
-			"{.end}\n",
-
-		out: "data not present\n",
-	},
-	{
-		in: "{.section Null }\n" +
-			"data present\n" +
-			"{.or}\n" +
-			"data not present\n" +
-			"{.end}\n",
-
-		out: "data not present\n",
-	},
-	{
-		in: "{.section Pdata }\n" +
-			"{Header}={Integer}\n" +
-			"{.section @ }\n" +
-			"{Header}={Integer}\n" +
-			"{.end}\n" +
-			"{.end}\n",
-
-		out: "Header=77\n" +
-			"Header=77\n",
-	},
-
-	{
-		in: "{.section Data}{.end} {Header}\n",
-
-		out: " Header\n",
-	},
-
-	{
-		in: "{.section Integer}{@}{.end}",
-
-		out: "77",
-	},
-
-	// Repeated
-	{
-		in: "{.section Pdata }\n" +
-			"{.repeated section @ }\n" +
-			"{Item}={Value}\n" +
-			"{.end}\n" +
-			"{.end}\n",
-
-		out: "ItemNumber1=ValueNumber1\n" +
-			"ItemNumber2=ValueNumber2\n",
-	},
-	{
-		in: "{.section Pdata }\n" +
-			"{.repeated section @ }\n" +
-			"{Item}={Value}\n" +
-			"{.or}\n" +
-			"this should not appear\n" +
-			"{.end}\n" +
-			"{.end}\n",
-
-		out: "ItemNumber1=ValueNumber1\n" +
-			"ItemNumber2=ValueNumber2\n",
-	},
-	{
-		in: "{.section @ }\n" +
-			"{.repeated section Empty }\n" +
-			"{Item}={Value}\n" +
-			"{.or}\n" +
-			"this should appear: empty field\n" +
-			"{.end}\n" +
-			"{.end}\n",
-
-		out: "this should appear: empty field\n",
-	},
-	{
-		in: "{.repeated section Pdata }\n" +
-			"{Item}\n" +
-			"{.alternates with}\n" +
-			"is\nover\nmultiple\nlines\n" +
-			"{.end}\n",
-
-		out: "ItemNumber1\n" +
-			"is\nover\nmultiple\nlines\n" +
-			"ItemNumber2\n",
-	},
-	{
-		in: "{.repeated section Pdata }\n" +
-			"{Item}\n" +
-			"{.alternates with}\n" +
-			"is\nover\nmultiple\nlines\n" +
-			" {.end}\n",
-
-		out: "ItemNumber1\n" +
-			"is\nover\nmultiple\nlines\n" +
-			"ItemNumber2\n",
-	},
-	{
-		in: "{.section Pdata }\n" +
-			"{.repeated section @ }\n" +
-			"{Item}={Value}\n" +
-			"{.alternates with}DIVIDER\n" +
-			"{.or}\n" +
-			"this should not appear\n" +
-			"{.end}\n" +
-			"{.end}\n",
-
-		out: "ItemNumber1=ValueNumber1\n" +
-			"DIVIDER\n" +
-			"ItemNumber2=ValueNumber2\n",
-	},
-	{
-		in: "{.repeated section Vec }\n" +
-			"{@}\n" +
-			"{.end}\n",
-
-		out: "elt1\n" +
-			"elt2\n",
-	},
-	// Same but with a space before {.end}: was a bug.
-	{
-		in: "{.repeated section Vec }\n" +
-			"{@} {.end}\n",
-
-		out: "elt1 elt2 \n",
-	},
-	{
-		in: "{.repeated section Integer}{.end}",
-
-		err: "line 1: .repeated: cannot repeat Integer (type int)",
-	},
-
-	// Nested names
-	{
-		in: "{.section @ }\n" +
-			"{InnerT.Item}={InnerT.Value}\n" +
-			"{.end}",
-
-		out: "ItemNumber1=ValueNumber1\n",
-	},
-	{
-		in: "{.section @ }\n" +
-			"{InnerT.Item}={.section InnerT}{.section Value}{@}{.end}{.end}\n" +
-			"{.end}",
-
-		out: "ItemNumber1=ValueNumber1\n",
-	},
-
-	{
-		in: "{.section Emptystring}emptystring{.end}\n" +
-			"{.section Header}header{.end}\n",
-
-		out: "\nheader\n",
-	},
-
-	{
-		in: "{.section True}1{.or}2{.end}\n" +
-			"{.section False}3{.or}4{.end}\n",
-
-		out: "1\n4\n",
-	},
-
-	// Maps
-
-	{
-		in: "{Mp.mapkey}\n",
-
-		out: "Ahoy!\n",
-	},
-	{
-		in: "{Innermap.Mp.innerkey}\n",
-
-		out: "55\n",
-	},
-	{
-		in: "{.section Innermap}{.section Mp}{innerkey}{.end}{.end}\n",
-
-		out: "55\n",
-	},
-	{
-		in: "{.section JSON}{.repeated section maps}{a}{b}{.end}{.end}\n",
-
-		out: "1234\n",
-	},
-	{
-		in: "{Stringmap.stringkey1}\n",
-
-		out: "stringresult\n",
-	},
-	{
-		in: "{.repeated section Stringmap}\n" +
-			"{@}\n" +
-			"{.end}",
-
-		out: "stringresult\n" +
-			"stringresult\n",
-	},
-	{
-		in: "{.repeated section Stringmap}\n" +
-			"\t{@}\n" +
-			"{.end}",
-
-		out: "\tstringresult\n" +
-			"\tstringresult\n",
-	},
-	{
-		in: "{*Ptrmap.stringkey1}\n",
-
-		out: "pointedToString\n",
-	},
-	{
-		in: "{.repeated section Ptrmap}\n" +
-			"{*@}\n" +
-			"{.end}",
-
-		out: "pointedToString\n" +
-			"pointedToString\n",
-	},
-
-	// Interface values
-
-	{
-		in: "{Iface}",
-
-		out: "[1 2 3]",
-	},
-	{
-		in: "{.repeated section Iface}{@}{.alternates with} {.end}",
-
-		out: "1 2 3",
-	},
-	{
-		in: "{.section Iface}{@}{.end}",
-
-		out: "[1 2 3]",
-	},
-	{
-		in: "{.section Ifaceptr}{Item} {Value}{.end}",
-
-		out: "Item Value",
-	},
-}
-
-func TestAll(t *testing.T) {
-	// Parse
-	testAll(t, func(test *Test) (*Template, error) { return Parse(test.in, formatters) })
-	// ParseFile
-	f, err := ioutil.TempFile("", "template-test")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer func() {
-		name := f.Name()
-		f.Close()
-		os.Remove(name)
-	}()
-	testAll(t, func(test *Test) (*Template, error) {
-		err := ioutil.WriteFile(f.Name(), []byte(test.in), 0600)
-		if err != nil {
-			t.Error("unexpected write error:", err)
-			return nil, err
-		}
-		return ParseFile(f.Name(), formatters)
-	})
-	// tmpl.ParseFile
-	testAll(t, func(test *Test) (*Template, error) {
-		err := ioutil.WriteFile(f.Name(), []byte(test.in), 0600)
-		if err != nil {
-			t.Error("unexpected write error:", err)
-			return nil, err
-		}
-		tmpl := New(formatters)
-		return tmpl, tmpl.ParseFile(f.Name())
-	})
-}
-
-func testAll(t *testing.T, parseFunc func(*Test) (*Template, error)) {
-	s := new(S)
-	// initialized by hand for clarity.
-	s.Header = "Header"
-	s.HeaderPtr = &s.Header
-	s.Integer = 77
-	s.IntegerPtr = &s.Integer
-	s.InnerT = t1
-	s.Data = []T{t1, t2}
-	s.Pdata = []*T{&t1, &t2}
-	s.Empty = []*T{}
-	s.Null = nil
-	s.Vec = []interface{}{"elt1", "elt2"}
-	s.True = true
-	s.False = false
-	s.Mp = make(map[string]string)
-	s.Mp["mapkey"] = "Ahoy!"
-	json.Unmarshal([]byte(`{"maps":[{"a":1,"b":2},{"a":3,"b":4}]}`), &s.JSON)
-	s.Innermap.Mp = make(map[string]int)
-	s.Innermap.Mp["innerkey"] = 55
-	s.Stringmap = make(map[string]string)
-	s.Stringmap["stringkey1"] = "stringresult" // the same value so repeated section is order-independent
-	s.Stringmap["stringkey2"] = "stringresult"
-	s.Ptrmap = make(map[string]*string)
-	x := "pointedToString"
-	s.Ptrmap["stringkey1"] = &x // the same value so repeated section is order-independent
-	s.Ptrmap["stringkey2"] = &x
-	s.Iface = []int{1, 2, 3}
-	s.Ifaceptr = &T{"Item", "Value"}
-
-	var buf bytes.Buffer
-	for _, test := range tests {
-		buf.Reset()
-		tmpl, err := parseFunc(test)
-		if err != nil {
-			t.Error("unexpected parse error: ", err)
-			continue
-		}
-		err = tmpl.Execute(&buf, s)
-		if test.err == "" {
-			if err != nil {
-				t.Error("unexpected execute error:", err)
-			}
-		} else {
-			if err == nil {
-				t.Errorf("expected execute error %q, got nil", test.err)
-			} else if err.Error() != test.err {
-				t.Errorf("expected execute error %q, got %q", test.err, err.Error())
-			}
-		}
-		if buf.String() != test.out {
-			t.Errorf("for %q: expected %q got %q", test.in, test.out, buf.String())
-		}
-	}
-}
-
-func TestMapDriverType(t *testing.T) {
-	mp := map[string]string{"footer": "Ahoy!"}
-	tmpl, err := Parse("template: {footer}", nil)
-	if err != nil {
-		t.Error("unexpected parse error:", err)
-	}
-	var b bytes.Buffer
-	err = tmpl.Execute(&b, mp)
-	if err != nil {
-		t.Error("unexpected execute error:", err)
-	}
-	s := b.String()
-	expect := "template: Ahoy!"
-	if s != expect {
-		t.Errorf("failed passing string as data: expected %q got %q", expect, s)
-	}
-}
-
-func TestMapNoEntry(t *testing.T) {
-	mp := make(map[string]int)
-	tmpl, err := Parse("template: {notthere}!", nil)
-	if err != nil {
-		t.Error("unexpected parse error:", err)
-	}
-	var b bytes.Buffer
-	err = tmpl.Execute(&b, mp)
-	if err != nil {
-		t.Error("unexpected execute error:", err)
-	}
-	s := b.String()
-	expect := "template: 0!"
-	if s != expect {
-		t.Errorf("failed passing string as data: expected %q got %q", expect, s)
-	}
-}
-
-func TestStringDriverType(t *testing.T) {
-	tmpl, err := Parse("template: {@}", nil)
-	if err != nil {
-		t.Error("unexpected parse error:", err)
-	}
-	var b bytes.Buffer
-	err = tmpl.Execute(&b, "hello")
-	if err != nil {
-		t.Error("unexpected execute error:", err)
-	}
-	s := b.String()
-	expect := "template: hello"
-	if s != expect {
-		t.Errorf("failed passing string as data: expected %q got %q", expect, s)
-	}
-}
-
-func TestTwice(t *testing.T) {
-	tmpl, err := Parse("template: {@}", nil)
-	if err != nil {
-		t.Error("unexpected parse error:", err)
-	}
-	var b bytes.Buffer
-	err = tmpl.Execute(&b, "hello")
-	if err != nil {
-		t.Error("unexpected parse error:", err)
-	}
-	s := b.String()
-	expect := "template: hello"
-	if s != expect {
-		t.Errorf("failed passing string as data: expected %q got %q", expect, s)
-	}
-	err = tmpl.Execute(&b, "hello")
-	if err != nil {
-		t.Error("unexpected parse error:", err)
-	}
-	s = b.String()
-	expect += expect
-	if s != expect {
-		t.Errorf("failed passing string as data: expected %q got %q", expect, s)
-	}
-}
-
-func TestCustomDelims(t *testing.T) {
-	// try various lengths.  zero should catch error.
-	for i := 0; i < 7; i++ {
-		for j := 0; j < 7; j++ {
-			tmpl := New(nil)
-			// first two chars deliberately the same to test equal left and right delims
-			ldelim := "$!#$%^&"[0:i]
-			rdelim := "$*&^%$!"[0:j]
-			tmpl.SetDelims(ldelim, rdelim)
-			// if braces, this would be template: {@}{.meta-left}{.meta-right}
-			text := "template: " +
-				ldelim + "@" + rdelim +
-				ldelim + ".meta-left" + rdelim +
-				ldelim + ".meta-right" + rdelim
-			err := tmpl.Parse(text)
-			if err != nil {
-				if i == 0 || j == 0 { // expected
-					continue
-				}
-				t.Error("unexpected parse error:", err)
-			} else if i == 0 || j == 0 {
-				t.Errorf("expected parse error for empty delimiter: %d %d %q %q", i, j, ldelim, rdelim)
-				continue
-			}
-			var b bytes.Buffer
-			err = tmpl.Execute(&b, "hello")
-			s := b.String()
-			if s != "template: hello"+ldelim+rdelim {
-				t.Errorf("failed delim check(%q %q) %q got %q", ldelim, rdelim, text, s)
-			}
-		}
-	}
-}
-
-// Test that a variable evaluates to the field itself and does not further indirection
-func TestVarIndirection(t *testing.T) {
-	s := new(S)
-	// initialized by hand for clarity.
-	s.InnerPointerT = &t1
-
-	var buf bytes.Buffer
-	input := "{.section @}{InnerPointerT}{.end}"
-	tmpl, err := Parse(input, nil)
-	if err != nil {
-		t.Fatal("unexpected parse error:", err)
-	}
-	err = tmpl.Execute(&buf, s)
-	if err != nil {
-		t.Fatal("unexpected execute error:", err)
-	}
-	expect := fmt.Sprintf("%v", &t1) // output should be hex address of t1
-	if buf.String() != expect {
-		t.Errorf("for %q: expected %q got %q", input, expect, buf.String())
-	}
-}
-
-func TestHTMLFormatterWithByte(t *testing.T) {
-	s := "Test string."
-	b := []byte(s)
-	var buf bytes.Buffer
-	HTMLFormatter(&buf, "", b)
-	bs := buf.String()
-	if bs != s {
-		t.Errorf("munged []byte, expected: %s got: %s", s, bs)
-	}
-}
-
-type UF struct {
-	I int
-	s string
-}
-
-func TestReferenceToUnexported(t *testing.T) {
-	u := &UF{3, "hello"}
-	var buf bytes.Buffer
-	input := "{.section @}{I}{s}{.end}"
-	tmpl, err := Parse(input, nil)
-	if err != nil {
-		t.Fatal("unexpected parse error:", err)
-	}
-	err = tmpl.Execute(&buf, u)
-	if err == nil {
-		t.Fatal("expected execute error, got none")
-	}
-	if strings.Index(err.Error(), "not exported") < 0 {
-		t.Fatal("expected unexported error; got", err)
-	}
-}
-
-var formatterTests = []Test{
-	{
-		in: "{Header|uppercase}={Integer|+1}\n" +
-			"{Header|html}={Integer|str}\n",
-
-		out: "HEADER=78\n" +
-			"Header=77\n",
-	},
-
-	{
-		in: "{Header|uppercase}={Integer Header|multiword}\n" +
-			"{Header|html}={Header Integer|multiword}\n" +
-			"{Header|html}={Header Integer}\n",
-
-		out: "HEADER=<77><Header>\n" +
-			"Header=<Header><77>\n" +
-			"Header=Header77\n",
-	},
-	{
-		in: "{Raw}\n" +
-			"{Raw|html}\n",
-
-		out: "a <&> b\n" +
-			"a &lt;&amp;&gt; b\n",
-	},
-	{
-		in:  "{Bytes}",
-		out: "hello",
-	},
-	{
-		in:  "{Raw|uppercase|html|html}",
-		out: "A &amp;lt;&amp;amp;&amp;gt; B",
-	},
-	{
-		in:  "{Header Integer|multiword|html}",
-		out: "&lt;Header&gt;&lt;77&gt;",
-	},
-	{
-		in:  "{Integer|no_formatter|html}",
-		err: `unknown formatter: "no_formatter"`,
-	},
-	{
-		in:  "{Integer|||||}", // empty string is a valid formatter
-		out: "77",
-	},
-	{
-		in:  `{"%.02f 0x%02X" 1.1 10|printf}`,
-		out: "1.10 0x0A",
-	},
-	{
-		in:  `{""|}{""||}{""|printf}`, // Issue #1896.
-		out: "",
-	},
-}
-
-func TestFormatters(t *testing.T) {
-	data := map[string]interface{}{
-		"Header":  "Header",
-		"Integer": 77,
-		"Raw":     "a <&> b",
-		"Bytes":   []byte("hello"),
-	}
-	for _, c := range formatterTests {
-		tmpl, err := Parse(c.in, formatters)
-		if err != nil {
-			if c.err == "" {
-				t.Error("unexpected parse error:", err)
-				continue
-			}
-			if strings.Index(err.Error(), c.err) < 0 {
-				t.Errorf("unexpected error: expected %q, got %q", c.err, err.Error())
-				continue
-			}
-		} else {
-			if c.err != "" {
-				t.Errorf("For %q, expected error, got none.", c.in)
-				continue
-			}
-			var buf bytes.Buffer
-			err = tmpl.Execute(&buf, data)
-			if err != nil {
-				t.Error("unexpected Execute error: ", err)
-				continue
-			}
-			actual := buf.String()
-			if actual != c.out {
-				t.Errorf("for %q: expected %q but got %q.", c.in, c.out, actual)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/os/dir.go b/third_party/gofrontend/libgo/go/os/dir.go
deleted file mode 100644
index d811c9f..0000000
--- a/third_party/gofrontend/libgo/go/os/dir.go
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"io"
-	"sync/atomic"
-	"syscall"
-	"unsafe"
-)
-
-//extern opendir
-func libc_opendir(*byte) *syscall.DIR
-
-//extern closedir
-func libc_closedir(*syscall.DIR) int
-
-// FIXME: pathconf returns long, not int.
-//extern pathconf
-func libc_pathconf(*byte, int) int
-
-func clen(n []byte) int {
-	for i := 0; i < len(n); i++ {
-		if n[i] == 0 {
-			return i
-		}
-	}
-	return len(n)
-}
-
-var nameMax int32
-
-func (file *File) readdirnames(n int) (names []string, err error) {
-	if file.dirinfo == nil {
-		p, err := syscall.BytePtrFromString(file.name)
-		if err != nil {
-			return nil, err
-		}
-
-		elen := int(atomic.LoadInt32(&nameMax))
-		if elen == 0 {
-			syscall.Entersyscall()
-			plen := libc_pathconf(p, syscall.PC_NAME_MAX)
-			syscall.Exitsyscall()
-			if plen < 1024 {
-				plen = 1024
-			}
-			var dummy syscall.Dirent
-			elen = int(unsafe.Offsetof(dummy.Name)) + plen + 1
-			atomic.StoreInt32(&nameMax, int32(elen))
-		}
-
-		syscall.Entersyscall()
-		r := libc_opendir(p)
-		errno := syscall.GetErrno()
-		syscall.Exitsyscall()
-		if r == nil {
-			return nil, &PathError{"opendir", file.name, errno}
-		}
-
-		file.dirinfo = new(dirInfo)
-		file.dirinfo.buf = make([]byte, elen)
-		file.dirinfo.dir = r
-	}
-
-	entryDirent := (*syscall.Dirent)(unsafe.Pointer(&file.dirinfo.buf[0]))
-
-	size := n
-	if size <= 0 {
-		size = 100
-		n = -1
-	}
-
-	names = make([]string, 0, size) // Empty with room to grow.
-
-	for n != 0 {
-		var dirent *syscall.Dirent
-		pr := &dirent
-		syscall.Entersyscall()
-		i := libc_readdir_r(file.dirinfo.dir, entryDirent, pr)
-		syscall.Exitsyscall()
-		if i != 0 {
-			return names, NewSyscallError("readdir_r", i)
-		}
-		if dirent == nil {
-			break // EOF
-		}
-		bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0]))
-		var name = string(bytes[0:clen(bytes[:])])
-		if name == "." || name == ".." { // Useless names
-			continue
-		}
-		names = append(names, name)
-		n--
-	}
-	if n >= 0 && len(names) == 0 {
-		return names, io.EOF
-	}
-	return names, nil
-}
diff --git a/third_party/gofrontend/libgo/go/os/dir_largefile.go b/third_party/gofrontend/libgo/go/os/dir_largefile.go
deleted file mode 100644
index 2555c7b..0000000
--- a/third_party/gofrontend/libgo/go/os/dir_largefile.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// dir_largefile.go -- For systems which use the large file interface for
-// readdir_r.
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import "syscall"
-
-//extern readdir64_r
-func libc_readdir_r(*syscall.DIR, *syscall.Dirent, **syscall.Dirent) syscall.Errno
diff --git a/third_party/gofrontend/libgo/go/os/dir_plan9.go b/third_party/gofrontend/libgo/go/os/dir_plan9.go
deleted file mode 100644
index 8195c02..0000000
--- a/third_party/gofrontend/libgo/go/os/dir_plan9.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"io"
-	"syscall"
-)
-
-func (file *File) readdir(n int) ([]FileInfo, error) {
-	// If this file has no dirinfo, create one.
-	if file.dirinfo == nil {
-		file.dirinfo = new(dirInfo)
-	}
-	d := file.dirinfo
-	size := n
-	if size <= 0 {
-		size = 100
-		n = -1
-	}
-	fi := make([]FileInfo, 0, size) // Empty with room to grow.
-	for n != 0 {
-		// Refill the buffer if necessary.
-		if d.bufp >= d.nbuf {
-			nb, err := file.Read(d.buf[:])
-
-			// Update the buffer state before checking for errors.
-			d.bufp, d.nbuf = 0, nb
-
-			if err != nil {
-				if err == io.EOF {
-					break
-				}
-				return fi, &PathError{"readdir", file.name, err}
-			}
-			if nb < syscall.STATFIXLEN {
-				return fi, &PathError{"readdir", file.name, syscall.ErrShortStat}
-			}
-		}
-
-		// Get a record from the buffer.
-		b := d.buf[d.bufp:]
-		m := int(uint16(b[0])|uint16(b[1])<<8) + 2
-		if m < syscall.STATFIXLEN {
-			return fi, &PathError{"readdir", file.name, syscall.ErrShortStat}
-		}
-
-		dir, err := syscall.UnmarshalDir(b[:m])
-		if err != nil {
-			return fi, &PathError{"readdir", file.name, err}
-		}
-		fi = append(fi, fileInfoFromStat(dir))
-
-		d.bufp += m
-		n--
-	}
-
-	if n >= 0 && len(fi) == 0 {
-		return fi, io.EOF
-	}
-	return fi, nil
-}
-
-func (file *File) readdirnames(n int) (names []string, err error) {
-	fi, err := file.Readdir(n)
-	names = make([]string, len(fi))
-	for i := range fi {
-		names[i] = fi[i].Name()
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/os/dir_regfile.go b/third_party/gofrontend/libgo/go/os/dir_regfile.go
deleted file mode 100644
index e5f7c57..0000000
--- a/third_party/gofrontend/libgo/go/os/dir_regfile.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// dir_regfile.go -- For systems which do not use the large file interface
-// for readdir_r.
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import "syscall"
-
-//extern readdir_r
-func libc_readdir_r(*syscall.DIR, *syscall.Dirent, **syscall.Dirent) syscall.Errno
diff --git a/third_party/gofrontend/libgo/go/os/dir_unix.go b/third_party/gofrontend/libgo/go/os/dir_unix.go
deleted file mode 100644
index 589db85..0000000
--- a/third_party/gofrontend/libgo/go/os/dir_unix.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package os
-
-import (
-	"io"
-	"syscall"
-)
-
-const (
-	blockSize = 4096
-)
-
-func (f *File) readdirnames(n int) (names []string, err error) {
-	// If this file has no dirinfo, create one.
-	if f.dirinfo == nil {
-		f.dirinfo = new(dirInfo)
-		// The buffer must be at least a block long.
-		f.dirinfo.buf = make([]byte, blockSize)
-	}
-	d := f.dirinfo
-
-	size := n
-	if size <= 0 {
-		size = 100
-		n = -1
-	}
-
-	names = make([]string, 0, size) // Empty with room to grow.
-	for n != 0 {
-		// Refill the buffer if necessary
-		if d.bufp >= d.nbuf {
-			d.bufp = 0
-			var errno error
-			d.nbuf, errno = fixCount(syscall.ReadDirent(f.fd, d.buf))
-			if errno != nil {
-				return names, NewSyscallError("readdirent", errno)
-			}
-			if d.nbuf <= 0 {
-				break // EOF
-			}
-		}
-
-		// Drain the buffer
-		var nb, nc int
-		nb, nc, names = syscall.ParseDirent(d.buf[d.bufp:d.nbuf], n, names)
-		d.bufp += nb
-		n -= nc
-	}
-	if n >= 0 && len(names) == 0 {
-		return names, io.EOF
-	}
-	return names, nil
-}
diff --git a/third_party/gofrontend/libgo/go/os/doc.go b/third_party/gofrontend/libgo/go/os/doc.go
deleted file mode 100644
index 389a8eb..0000000
--- a/third_party/gofrontend/libgo/go/os/doc.go
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import "time"
-
-// FindProcess looks for a running process by its pid.
-// The Process it returns can be used to obtain information
-// about the underlying operating system process.
-func FindProcess(pid int) (p *Process, err error) {
-	return findProcess(pid)
-}
-
-// StartProcess starts a new process with the program, arguments and attributes
-// specified by name, argv and attr.
-//
-// StartProcess is a low-level interface. The os/exec package provides
-// higher-level interfaces.
-//
-// If there is an error, it will be of type *PathError.
-func StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error) {
-	return startProcess(name, argv, attr)
-}
-
-// Release releases any resources associated with the Process p,
-// rendering it unusable in the future.
-// Release only needs to be called if Wait is not.
-func (p *Process) Release() error {
-	return p.release()
-}
-
-// Kill causes the Process to exit immediately.
-func (p *Process) Kill() error {
-	return p.kill()
-}
-
-// Wait waits for the Process to exit, and then returns a
-// ProcessState describing its status and an error, if any.
-// Wait releases any resources associated with the Process.
-// On most operating systems, the Process must be a child
-// of the current process or an error will be returned.
-func (p *Process) Wait() (*ProcessState, error) {
-	return p.wait()
-}
-
-// Signal sends a signal to the Process.
-// Sending Interrupt on Windows is not implemented.
-func (p *Process) Signal(sig Signal) error {
-	return p.signal(sig)
-}
-
-// UserTime returns the user CPU time of the exited process and its children.
-func (p *ProcessState) UserTime() time.Duration {
-	return p.userTime()
-}
-
-// SystemTime returns the system CPU time of the exited process and its children.
-func (p *ProcessState) SystemTime() time.Duration {
-	return p.systemTime()
-}
-
-// Exited reports whether the program has exited.
-func (p *ProcessState) Exited() bool {
-	return p.exited()
-}
-
-// Success reports whether the program exited successfully,
-// such as with exit status 0 on Unix.
-func (p *ProcessState) Success() bool {
-	return p.success()
-}
-
-// Sys returns system-dependent exit information about
-// the process.  Convert it to the appropriate underlying
-// type, such as syscall.WaitStatus on Unix, to access its contents.
-func (p *ProcessState) Sys() interface{} {
-	return p.sys()
-}
-
-// SysUsage returns system-dependent resource usage information about
-// the exited process.  Convert it to the appropriate underlying
-// type, such as *syscall.Rusage on Unix, to access its contents.
-// (On Unix, *syscall.Rusage matches struct rusage as defined in the
-// getrusage(2) manual page.)
-func (p *ProcessState) SysUsage() interface{} {
-	return p.sysUsage()
-}
-
-// Hostname returns the host name reported by the kernel.
-func Hostname() (name string, err error) {
-	return hostname()
-}
-
-// Readdir reads the contents of the directory associated with file and
-// returns a slice of up to n FileInfo values, as would be returned
-// by Lstat, in directory order. Subsequent calls on the same file will yield
-// further FileInfos.
-//
-// If n > 0, Readdir returns at most n FileInfo structures. In this case, if
-// Readdir returns an empty slice, it will return a non-nil error
-// explaining why. At the end of a directory, the error is io.EOF.
-//
-// If n <= 0, Readdir returns all the FileInfo from the directory in
-// a single slice. In this case, if Readdir succeeds (reads all
-// the way to the end of the directory), it returns the slice and a
-// nil error. If it encounters an error before the end of the
-// directory, Readdir returns the FileInfo read until that point
-// and a non-nil error.
-func (f *File) Readdir(n int) (fi []FileInfo, err error) {
-	if f == nil {
-		return nil, ErrInvalid
-	}
-	return f.readdir(n)
-}
-
-// Readdirnames reads and returns a slice of names from the directory f.
-//
-// If n > 0, Readdirnames returns at most n names. In this case, if
-// Readdirnames returns an empty slice, it will return a non-nil error
-// explaining why. At the end of a directory, the error is io.EOF.
-//
-// If n <= 0, Readdirnames returns all the names from the directory in
-// a single slice. In this case, if Readdirnames succeeds (reads all
-// the way to the end of the directory), it returns the slice and a
-// nil error. If it encounters an error before the end of the
-// directory, Readdirnames returns the names read until that point and
-// a non-nil error.
-func (f *File) Readdirnames(n int) (names []string, err error) {
-	if f == nil {
-		return nil, ErrInvalid
-	}
-	return f.readdirnames(n)
-}
diff --git a/third_party/gofrontend/libgo/go/os/env.go b/third_party/gofrontend/libgo/go/os/env.go
deleted file mode 100644
index a4ede15..0000000
--- a/third_party/gofrontend/libgo/go/os/env.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// General environment variables.
-
-package os
-
-import "syscall"
-
-// Expand replaces ${var} or $var in the string based on the mapping function.
-// For example, os.ExpandEnv(s) is equivalent to os.Expand(s, os.Getenv).
-func Expand(s string, mapping func(string) string) string {
-	buf := make([]byte, 0, 2*len(s))
-	// ${} is all ASCII, so bytes are fine for this operation.
-	i := 0
-	for j := 0; j < len(s); j++ {
-		if s[j] == '$' && j+1 < len(s) {
-			buf = append(buf, s[i:j]...)
-			name, w := getShellName(s[j+1:])
-			buf = append(buf, mapping(name)...)
-			j += w
-			i = j + 1
-		}
-	}
-	return string(buf) + s[i:]
-}
-
-// ExpandEnv replaces ${var} or $var in the string according to the values
-// of the current environment variables.  References to undefined
-// variables are replaced by the empty string.
-func ExpandEnv(s string) string {
-	return Expand(s, Getenv)
-}
-
-// isShellSpecialVar reports whether the character identifies a special
-// shell variable such as $*.
-func isShellSpecialVar(c uint8) bool {
-	switch c {
-	case '*', '#', '$', '@', '!', '?', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
-		return true
-	}
-	return false
-}
-
-// isAlphaNum reports whether the byte is an ASCII letter, number, or underscore
-func isAlphaNum(c uint8) bool {
-	return c == '_' || '0' <= c && c <= '9' || 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z'
-}
-
-// getShellName returns the name that begins the string and the number of bytes
-// consumed to extract it.  If the name is enclosed in {}, it's part of a ${}
-// expansion and two more bytes are needed than the length of the name.
-func getShellName(s string) (string, int) {
-	switch {
-	case s[0] == '{':
-		if len(s) > 2 && isShellSpecialVar(s[1]) && s[2] == '}' {
-			return s[1:2], 3
-		}
-		// Scan to closing brace
-		for i := 1; i < len(s); i++ {
-			if s[i] == '}' {
-				return s[1:i], i + 1
-			}
-		}
-		return "", 1 // Bad syntax; just eat the brace.
-	case isShellSpecialVar(s[0]):
-		return s[0:1], 1
-	}
-	// Scan alphanumerics.
-	var i int
-	for i = 0; i < len(s) && isAlphaNum(s[i]); i++ {
-	}
-	return s[:i], i
-}
-
-// Getenv retrieves the value of the environment variable named by the key.
-// It returns the value, which will be empty if the variable is not present.
-func Getenv(key string) string {
-	v, _ := syscall.Getenv(key)
-	return v
-}
-
-// LookupEnv retrieves the value of the environment variable named
-// by the key. If the variable is present in the environment the
-// value (which may be empty) is returned and the boolean is true.
-// Otherwise the returned value will be empty and the boolean will
-// be false.
-func LookupEnv(key string) (string, bool) {
-	return syscall.Getenv(key)
-}
-
-// Setenv sets the value of the environment variable named by the key.
-// It returns an error, if any.
-func Setenv(key, value string) error {
-	err := syscall.Setenv(key, value)
-	if err != nil {
-		return NewSyscallError("setenv", err)
-	}
-	return nil
-}
-
-// Unsetenv unsets a single environment variable.
-func Unsetenv(key string) error {
-	return syscall.Unsetenv(key)
-}
-
-// Clearenv deletes all environment variables.
-func Clearenv() {
-	syscall.Clearenv()
-}
-
-// Environ returns a copy of strings representing the environment,
-// in the form "key=value".
-func Environ() []string {
-	return syscall.Environ()
-}
diff --git a/third_party/gofrontend/libgo/go/os/env_test.go b/third_party/gofrontend/libgo/go/os/env_test.go
deleted file mode 100644
index d1074cd..0000000
--- a/third_party/gofrontend/libgo/go/os/env_test.go
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os_test
-
-import (
-	. "os"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-// testGetenv gives us a controlled set of variables for testing Expand.
-func testGetenv(s string) string {
-	switch s {
-	case "*":
-		return "all the args"
-	case "#":
-		return "NARGS"
-	case "$":
-		return "PID"
-	case "1":
-		return "ARGUMENT1"
-	case "HOME":
-		return "/usr/gopher"
-	case "H":
-		return "(Value of H)"
-	case "home_1":
-		return "/usr/foo"
-	case "_":
-		return "underscore"
-	}
-	return ""
-}
-
-var expandTests = []struct {
-	in, out string
-}{
-	{"", ""},
-	{"$*", "all the args"},
-	{"$$", "PID"},
-	{"${*}", "all the args"},
-	{"$1", "ARGUMENT1"},
-	{"${1}", "ARGUMENT1"},
-	{"now is the time", "now is the time"},
-	{"$HOME", "/usr/gopher"},
-	{"$home_1", "/usr/foo"},
-	{"${HOME}", "/usr/gopher"},
-	{"${H}OME", "(Value of H)OME"},
-	{"A$$$#$1$H$home_1*B", "APIDNARGSARGUMENT1(Value of H)/usr/foo*B"},
-}
-
-func TestExpand(t *testing.T) {
-	for _, test := range expandTests {
-		result := Expand(test.in, testGetenv)
-		if result != test.out {
-			t.Errorf("Expand(%q)=%q; expected %q", test.in, result, test.out)
-		}
-	}
-}
-
-func TestConsistentEnviron(t *testing.T) {
-	e0 := Environ()
-	for i := 0; i < 10; i++ {
-		e1 := Environ()
-		if !reflect.DeepEqual(e0, e1) {
-			t.Fatalf("environment changed")
-		}
-	}
-}
-
-func TestUnsetenv(t *testing.T) {
-	const testKey = "GO_TEST_UNSETENV"
-	set := func() bool {
-		prefix := testKey + "="
-		for _, key := range Environ() {
-			if strings.HasPrefix(key, prefix) {
-				return true
-			}
-		}
-		return false
-	}
-	if err := Setenv(testKey, "1"); err != nil {
-		t.Fatalf("Setenv: %v", err)
-	}
-	if !set() {
-		t.Error("Setenv didn't set TestUnsetenv")
-	}
-	if err := Unsetenv(testKey); err != nil {
-		t.Fatalf("Unsetenv: %v", err)
-	}
-	if set() {
-		t.Fatal("Unsetenv didn't clear TestUnsetenv")
-	}
-}
-
-func TestLookupEnv(t *testing.T) {
-	const smallpox = "SMALLPOX"      // No one has smallpox.
-	value, ok := LookupEnv(smallpox) // Should not exist.
-	if ok || value != "" {
-		t.Fatalf("%s=%q", smallpox, value)
-	}
-	defer Unsetenv(smallpox)
-	err := Setenv(smallpox, "virus")
-	if err != nil {
-		t.Fatalf("failed to release smallpox virus")
-	}
-	value, ok = LookupEnv(smallpox)
-	if !ok {
-		t.Errorf("smallpox release failed; world remains safe but LookupEnv is broken")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/os/env_unix_test.go b/third_party/gofrontend/libgo/go/os/env_unix_test.go
deleted file mode 100644
index 5ec07ee..0000000
--- a/third_party/gofrontend/libgo/go/os/env_unix_test.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package os_test
-
-import (
-	. "os"
-	"testing"
-)
-
-var setenvEinvalTests = []struct {
-	k, v string
-}{
-	{"", ""},      // empty key
-	{"k=v", ""},   // '=' in key
-	{"\x00", ""},  // '\x00' in key
-	{"k", "\x00"}, // '\x00' in value
-}
-
-func TestSetenvUnixEinval(t *testing.T) {
-	for _, tt := range setenvEinvalTests {
-		err := Setenv(tt.k, tt.v)
-		if err == nil {
-			t.Errorf(`Setenv(%q, %q) == nil, want error`, tt.k, tt.v)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/os/error.go b/third_party/gofrontend/libgo/go/os/error.go
deleted file mode 100644
index 8810e69..0000000
--- a/third_party/gofrontend/libgo/go/os/error.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"errors"
-)
-
-// Portable analogs of some common system call errors.
-var (
-	ErrInvalid    = errors.New("invalid argument")
-	ErrPermission = errors.New("permission denied")
-	ErrExist      = errors.New("file already exists")
-	ErrNotExist   = errors.New("file does not exist")
-)
-
-// PathError records an error and the operation and file path that caused it.
-type PathError struct {
-	Op   string
-	Path string
-	Err  error
-}
-
-func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() }
-
-// SyscallError records an error from a specific system call.
-type SyscallError struct {
-	Syscall string
-	Err     error
-}
-
-func (e *SyscallError) Error() string { return e.Syscall + ": " + e.Err.Error() }
-
-// NewSyscallError returns, as an error, a new SyscallError
-// with the given system call name and error details.
-// As a convenience, if err is nil, NewSyscallError returns nil.
-func NewSyscallError(syscall string, err error) error {
-	if err == nil {
-		return nil
-	}
-	return &SyscallError{syscall, err}
-}
-
-// IsExist returns a boolean indicating whether the error is known to report
-// that a file or directory already exists. It is satisfied by ErrExist as
-// well as some syscall errors.
-func IsExist(err error) bool {
-	return isExist(err)
-}
-
-// IsNotExist returns a boolean indicating whether the error is known to
-// report that a file or directory does not exist. It is satisfied by
-// ErrNotExist as well as some syscall errors.
-func IsNotExist(err error) bool {
-	return isNotExist(err)
-}
-
-// IsPermission returns a boolean indicating whether the error is known to
-// report that permission is denied. It is satisfied by ErrPermission as well
-// as some syscall errors.
-func IsPermission(err error) bool {
-	return isPermission(err)
-}
diff --git a/third_party/gofrontend/libgo/go/os/error_plan9.go b/third_party/gofrontend/libgo/go/os/error_plan9.go
deleted file mode 100644
index 001cdfc..0000000
--- a/third_party/gofrontend/libgo/go/os/error_plan9.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-func isExist(err error) bool {
-	switch pe := err.(type) {
-	case nil:
-		return false
-	case *PathError:
-		err = pe.Err
-	case *LinkError:
-		err = pe.Err
-	}
-	return contains(err.Error(), " exists")
-}
-
-func isNotExist(err error) bool {
-	switch pe := err.(type) {
-	case nil:
-		return false
-	case *PathError:
-		err = pe.Err
-	case *LinkError:
-		err = pe.Err
-	}
-	return contains(err.Error(), "does not exist") || contains(err.Error(), "not found") ||
-		contains(err.Error(), "has been removed") || contains(err.Error(), "no parent")
-}
-
-func isPermission(err error) bool {
-	switch pe := err.(type) {
-	case nil:
-		return false
-	case *PathError:
-		err = pe.Err
-	case *LinkError:
-		err = pe.Err
-	}
-	return contains(err.Error(), "permission denied")
-}
-
-// contains is a local version of strings.Contains. It knows len(sep) > 1.
-func contains(s, sep string) bool {
-	n := len(sep)
-	c := sep[0]
-	for i := 0; i+n <= len(s); i++ {
-		if s[i] == c && s[i:i+n] == sep {
-			return true
-		}
-	}
-	return false
-}
diff --git a/third_party/gofrontend/libgo/go/os/error_test.go b/third_party/gofrontend/libgo/go/os/error_test.go
deleted file mode 100644
index 02ed235..0000000
--- a/third_party/gofrontend/libgo/go/os/error_test.go
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os_test
-
-import (
-	"fmt"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"testing"
-)
-
-func TestErrIsExist(t *testing.T) {
-	f, err := ioutil.TempFile("", "_Go_ErrIsExist")
-	if err != nil {
-		t.Fatalf("open ErrIsExist tempfile: %s", err)
-		return
-	}
-	defer os.Remove(f.Name())
-	defer f.Close()
-	f2, err := os.OpenFile(f.Name(), os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600)
-	if err == nil {
-		f2.Close()
-		t.Fatal("Open should have failed")
-		return
-	}
-	if s := checkErrorPredicate("os.IsExist", os.IsExist, err); s != "" {
-		t.Fatal(s)
-		return
-	}
-}
-
-func testErrNotExist(name string) string {
-	f, err := os.Open(name)
-	if err == nil {
-		f.Close()
-		return "Open should have failed"
-	}
-	if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err); s != "" {
-		return s
-	}
-
-	err = os.Chdir(name)
-	if err == nil {
-		return "Chdir should have failed"
-	}
-	if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err); s != "" {
-		return s
-	}
-	return ""
-}
-
-func TestErrIsNotExist(t *testing.T) {
-	tmpDir, err := ioutil.TempDir("", "_Go_ErrIsNotExist")
-	if err != nil {
-		t.Fatalf("create ErrIsNotExist tempdir: %s", err)
-		return
-	}
-	defer os.RemoveAll(tmpDir)
-
-	name := filepath.Join(tmpDir, "NotExists")
-	if s := testErrNotExist(name); s != "" {
-		t.Fatal(s)
-		return
-	}
-
-	name = filepath.Join(name, "NotExists2")
-	if s := testErrNotExist(name); s != "" {
-		t.Fatal(s)
-		return
-	}
-}
-
-func checkErrorPredicate(predName string, pred func(error) bool, err error) string {
-	if !pred(err) {
-		return fmt.Sprintf("%s does not work as expected for %#v", predName, err)
-	}
-	return ""
-}
-
-var isExistTests = []struct {
-	err   error
-	is    bool
-	isnot bool
-}{
-	{&os.PathError{Err: os.ErrInvalid}, false, false},
-	{&os.PathError{Err: os.ErrPermission}, false, false},
-	{&os.PathError{Err: os.ErrExist}, true, false},
-	{&os.PathError{Err: os.ErrNotExist}, false, true},
-	{&os.LinkError{Err: os.ErrInvalid}, false, false},
-	{&os.LinkError{Err: os.ErrPermission}, false, false},
-	{&os.LinkError{Err: os.ErrExist}, true, false},
-	{&os.LinkError{Err: os.ErrNotExist}, false, true},
-	{nil, false, false},
-}
-
-func TestIsExist(t *testing.T) {
-	for _, tt := range isExistTests {
-		if is := os.IsExist(tt.err); is != tt.is {
-			t.Errorf("os.IsExist(%T %v) = %v, want %v", tt.err, tt.err, is, tt.is)
-		}
-		if isnot := os.IsNotExist(tt.err); isnot != tt.isnot {
-			t.Errorf("os.IsNotExist(%T %v) = %v, want %v", tt.err, tt.err, isnot, tt.isnot)
-		}
-	}
-}
-
-func TestErrPathNUL(t *testing.T) {
-	f, err := ioutil.TempFile("", "_Go_ErrPathNUL\x00")
-	if err == nil {
-		f.Close()
-		t.Fatal("TempFile should have failed")
-	}
-	f, err = ioutil.TempFile("", "_Go_ErrPathNUL")
-	if err != nil {
-		t.Fatalf("open ErrPathNUL tempfile: %s", err)
-	}
-	defer os.Remove(f.Name())
-	defer f.Close()
-	f2, err := os.OpenFile(f.Name(), os.O_RDWR, 0600)
-	if err != nil {
-		t.Fatalf("open ErrPathNUL: %s", err)
-	}
-	f2.Close()
-	f2, err = os.OpenFile(f.Name()+"\x00", os.O_RDWR, 0600)
-	if err == nil {
-		f2.Close()
-		t.Fatal("Open should have failed")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/os/error_unix.go b/third_party/gofrontend/libgo/go/os/error_unix.go
deleted file mode 100644
index f2aabbb..0000000
--- a/third_party/gofrontend/libgo/go/os/error_unix.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package os
-
-import "syscall"
-
-func isExist(err error) bool {
-	switch pe := err.(type) {
-	case nil:
-		return false
-	case *PathError:
-		err = pe.Err
-	case *LinkError:
-		err = pe.Err
-	}
-	return err == syscall.EEXIST || err == ErrExist
-}
-
-func isNotExist(err error) bool {
-	switch pe := err.(type) {
-	case nil:
-		return false
-	case *PathError:
-		err = pe.Err
-	case *LinkError:
-		err = pe.Err
-	}
-	return err == syscall.ENOENT || err == ErrNotExist
-}
-
-func isPermission(err error) bool {
-	switch pe := err.(type) {
-	case nil:
-		return false
-	case *PathError:
-		err = pe.Err
-	case *LinkError:
-		err = pe.Err
-	}
-	return err == syscall.EACCES || err == syscall.EPERM || err == ErrPermission
-}
diff --git a/third_party/gofrontend/libgo/go/os/error_windows.go b/third_party/gofrontend/libgo/go/os/error_windows.go
deleted file mode 100644
index 83db6c0..0000000
--- a/third_party/gofrontend/libgo/go/os/error_windows.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import "syscall"
-
-func isExist(err error) bool {
-	switch pe := err.(type) {
-	case nil:
-		return false
-	case *PathError:
-		err = pe.Err
-	case *LinkError:
-		err = pe.Err
-	}
-	return err == syscall.ERROR_ALREADY_EXISTS ||
-		err == syscall.ERROR_FILE_EXISTS || err == ErrExist
-}
-
-func isNotExist(err error) bool {
-	switch pe := err.(type) {
-	case nil:
-		return false
-	case *PathError:
-		err = pe.Err
-	case *LinkError:
-		err = pe.Err
-	}
-	return err == syscall.ERROR_FILE_NOT_FOUND ||
-		err == syscall.ERROR_PATH_NOT_FOUND || err == ErrNotExist
-}
-
-func isPermission(err error) bool {
-	switch pe := err.(type) {
-	case nil:
-		return false
-	case *PathError:
-		err = pe.Err
-	case *LinkError:
-		err = pe.Err
-	}
-	return err == syscall.ERROR_ACCESS_DENIED || err == ErrPermission
-}
diff --git a/third_party/gofrontend/libgo/go/os/exec.go b/third_party/gofrontend/libgo/go/os/exec.go
deleted file mode 100644
index 15e95b9..0000000
--- a/third_party/gofrontend/libgo/go/os/exec.go
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"runtime"
-	"sync/atomic"
-	"syscall"
-)
-
-// Process stores the information about a process created by StartProcess.
-type Process struct {
-	Pid    int
-	handle uintptr // handle is accessed atomically on Windows
-	isdone uint32  // process has been successfully waited on, non zero if true
-}
-
-func newProcess(pid int, handle uintptr) *Process {
-	p := &Process{Pid: pid, handle: handle}
-	runtime.SetFinalizer(p, (*Process).Release)
-	return p
-}
-
-func (p *Process) setDone() {
-	atomic.StoreUint32(&p.isdone, 1)
-}
-
-func (p *Process) done() bool {
-	return atomic.LoadUint32(&p.isdone) > 0
-}
-
-// ProcAttr holds the attributes that will be applied to a new process
-// started by StartProcess.
-type ProcAttr struct {
-	// If Dir is non-empty, the child changes into the directory before
-	// creating the process.
-	Dir string
-	// If Env is non-nil, it gives the environment variables for the
-	// new process in the form returned by Environ.
-	// If it is nil, the result of Environ will be used.
-	Env []string
-	// Files specifies the open files inherited by the new process.  The
-	// first three entries correspond to standard input, standard output, and
-	// standard error.  An implementation may support additional entries,
-	// depending on the underlying operating system.  A nil entry corresponds
-	// to that file being closed when the process starts.
-	Files []*File
-
-	// Operating system-specific process creation attributes.
-	// Note that setting this field means that your program
-	// may not execute properly or even compile on some
-	// operating systems.
-	Sys *syscall.SysProcAttr
-}
-
-// A Signal represents an operating system signal.
-// The usual underlying implementation is operating system-dependent:
-// on Unix it is syscall.Signal.
-type Signal interface {
-	String() string
-	Signal() // to distinguish from other Stringers
-}
-
-// Getpid returns the process id of the caller.
-func Getpid() int { return syscall.Getpid() }
-
-// Getppid returns the process id of the caller's parent.
-func Getppid() int { return syscall.Getppid() }
diff --git a/third_party/gofrontend/libgo/go/os/exec/exec.go b/third_party/gofrontend/libgo/go/os/exec/exec.go
deleted file mode 100644
index 8a84e26..0000000
--- a/third_party/gofrontend/libgo/go/os/exec/exec.go
+++ /dev/null
@@ -1,516 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package exec runs external commands. It wraps os.StartProcess to make it
-// easier to remap stdin and stdout, connect I/O with pipes, and do other
-// adjustments.
-package exec
-
-import (
-	"bytes"
-	"errors"
-	"io"
-	"os"
-	"path/filepath"
-	"runtime"
-	"strconv"
-	"strings"
-	"sync"
-	"syscall"
-)
-
-// Error records the name of a binary that failed to be executed
-// and the reason it failed.
-type Error struct {
-	Name string
-	Err  error
-}
-
-func (e *Error) Error() string {
-	return "exec: " + strconv.Quote(e.Name) + ": " + e.Err.Error()
-}
-
-// Cmd represents an external command being prepared or run.
-//
-// A Cmd cannot be reused after calling its Run, Output or CombinedOutput
-// methods.
-type Cmd struct {
-	// Path is the path of the command to run.
-	//
-	// This is the only field that must be set to a non-zero
-	// value. If Path is relative, it is evaluated relative
-	// to Dir.
-	Path string
-
-	// Args holds command line arguments, including the command as Args[0].
-	// If the Args field is empty or nil, Run uses {Path}.
-	//
-	// In typical use, both Path and Args are set by calling Command.
-	Args []string
-
-	// Env specifies the environment of the process.
-	// If Env is nil, Run uses the current process's environment.
-	Env []string
-
-	// Dir specifies the working directory of the command.
-	// If Dir is the empty string, Run runs the command in the
-	// calling process's current directory.
-	Dir string
-
-	// Stdin specifies the process's standard input.
-	// If Stdin is nil, the process reads from the null device (os.DevNull).
-	// If Stdin is an *os.File, the process's standard input is connected
-	// directly to that file.
-	// Otherwise, during the execution of the command a separate
-	// goroutine reads from Stdin and delivers that data to the command
-	// over a pipe. In this case, Wait does not complete until the goroutine
-	// stops copying, either because it has reached the end of Stdin
-	// (EOF or a read error) or because writing to the pipe returned an error.
-	Stdin io.Reader
-
-	// Stdout and Stderr specify the process's standard output and error.
-	//
-	// If either is nil, Run connects the corresponding file descriptor
-	// to the null device (os.DevNull).
-	//
-	// If Stdout and Stderr are the same writer, at most one
-	// goroutine at a time will call Write.
-	Stdout io.Writer
-	Stderr io.Writer
-
-	// ExtraFiles specifies additional open files to be inherited by the
-	// new process. It does not include standard input, standard output, or
-	// standard error. If non-nil, entry i becomes file descriptor 3+i.
-	//
-	// BUG(rsc): On OS X 10.6, child processes may sometimes inherit unwanted fds.
-	// https://golang.org/issue/2603
-	ExtraFiles []*os.File
-
-	// SysProcAttr holds optional, operating system-specific attributes.
-	// Run passes it to os.StartProcess as the os.ProcAttr's Sys field.
-	SysProcAttr *syscall.SysProcAttr
-
-	// Process is the underlying process, once started.
-	Process *os.Process
-
-	// ProcessState contains information about an exited process,
-	// available after a call to Wait or Run.
-	ProcessState *os.ProcessState
-
-	lookPathErr     error // LookPath error, if any.
-	finished        bool  // when Wait was called
-	childFiles      []*os.File
-	closeAfterStart []io.Closer
-	closeAfterWait  []io.Closer
-	goroutine       []func() error
-	errch           chan error // one send per goroutine
-}
-
-// Command returns the Cmd struct to execute the named program with
-// the given arguments.
-//
-// It sets only the Path and Args in the returned structure.
-//
-// If name contains no path separators, Command uses LookPath to
-// resolve the path to a complete name if possible. Otherwise it uses
-// name directly.
-//
-// The returned Cmd's Args field is constructed from the command name
-// followed by the elements of arg, so arg should not include the
-// command name itself. For example, Command("echo", "hello")
-func Command(name string, arg ...string) *Cmd {
-	cmd := &Cmd{
-		Path: name,
-		Args: append([]string{name}, arg...),
-	}
-	if filepath.Base(name) == name {
-		if lp, err := LookPath(name); err != nil {
-			cmd.lookPathErr = err
-		} else {
-			cmd.Path = lp
-		}
-	}
-	return cmd
-}
-
-// interfaceEqual protects against panics from doing equality tests on
-// two interfaces with non-comparable underlying types.
-func interfaceEqual(a, b interface{}) bool {
-	defer func() {
-		recover()
-	}()
-	return a == b
-}
-
-func (c *Cmd) envv() []string {
-	if c.Env != nil {
-		return c.Env
-	}
-	return os.Environ()
-}
-
-func (c *Cmd) argv() []string {
-	if len(c.Args) > 0 {
-		return c.Args
-	}
-	return []string{c.Path}
-}
-
-// skipStdinCopyError optionally specifies a function which reports
-// whether the provided the stdin copy error should be ignored.
-// It is non-nil everywhere but Plan 9, which lacks EPIPE. See exec_posix.go.
-var skipStdinCopyError func(error) bool
-
-func (c *Cmd) stdin() (f *os.File, err error) {
-	if c.Stdin == nil {
-		f, err = os.Open(os.DevNull)
-		if err != nil {
-			return
-		}
-		c.closeAfterStart = append(c.closeAfterStart, f)
-		return
-	}
-
-	if f, ok := c.Stdin.(*os.File); ok {
-		return f, nil
-	}
-
-	pr, pw, err := os.Pipe()
-	if err != nil {
-		return
-	}
-
-	c.closeAfterStart = append(c.closeAfterStart, pr)
-	c.closeAfterWait = append(c.closeAfterWait, pw)
-	c.goroutine = append(c.goroutine, func() error {
-		_, err := io.Copy(pw, c.Stdin)
-		if skip := skipStdinCopyError; skip != nil && skip(err) {
-			err = nil
-		}
-		if err1 := pw.Close(); err == nil {
-			err = err1
-		}
-		return err
-	})
-	return pr, nil
-}
-
-func (c *Cmd) stdout() (f *os.File, err error) {
-	return c.writerDescriptor(c.Stdout)
-}
-
-func (c *Cmd) stderr() (f *os.File, err error) {
-	if c.Stderr != nil && interfaceEqual(c.Stderr, c.Stdout) {
-		return c.childFiles[1], nil
-	}
-	return c.writerDescriptor(c.Stderr)
-}
-
-func (c *Cmd) writerDescriptor(w io.Writer) (f *os.File, err error) {
-	if w == nil {
-		f, err = os.OpenFile(os.DevNull, os.O_WRONLY, 0)
-		if err != nil {
-			return
-		}
-		c.closeAfterStart = append(c.closeAfterStart, f)
-		return
-	}
-
-	if f, ok := w.(*os.File); ok {
-		return f, nil
-	}
-
-	pr, pw, err := os.Pipe()
-	if err != nil {
-		return
-	}
-
-	c.closeAfterStart = append(c.closeAfterStart, pw)
-	c.closeAfterWait = append(c.closeAfterWait, pr)
-	c.goroutine = append(c.goroutine, func() error {
-		_, err := io.Copy(w, pr)
-		pr.Close() // in case io.Copy stopped due to write error
-		return err
-	})
-	return pw, nil
-}
-
-func (c *Cmd) closeDescriptors(closers []io.Closer) {
-	for _, fd := range closers {
-		fd.Close()
-	}
-}
-
-// Run starts the specified command and waits for it to complete.
-//
-// The returned error is nil if the command runs, has no problems
-// copying stdin, stdout, and stderr, and exits with a zero exit
-// status.
-//
-// If the command fails to run or doesn't complete successfully, the
-// error is of type *ExitError. Other error types may be
-// returned for I/O problems.
-func (c *Cmd) Run() error {
-	if err := c.Start(); err != nil {
-		return err
-	}
-	return c.Wait()
-}
-
-// lookExtensions finds windows executable by its dir and path.
-// It uses LookPath to try appropriate extensions.
-// lookExtensions does not search PATH, instead it converts `prog` into `.\prog`.
-func lookExtensions(path, dir string) (string, error) {
-	if filepath.Base(path) == path {
-		path = filepath.Join(".", path)
-	}
-	if dir == "" {
-		return LookPath(path)
-	}
-	if filepath.VolumeName(path) != "" {
-		return LookPath(path)
-	}
-	if len(path) > 1 && os.IsPathSeparator(path[0]) {
-		return LookPath(path)
-	}
-	dirandpath := filepath.Join(dir, path)
-	// We assume that LookPath will only add file extension.
-	lp, err := LookPath(dirandpath)
-	if err != nil {
-		return "", err
-	}
-	ext := strings.TrimPrefix(lp, dirandpath)
-	return path + ext, nil
-}
-
-// Start starts the specified command but does not wait for it to complete.
-//
-// The Wait method will return the exit code and release associated resources
-// once the command exits.
-func (c *Cmd) Start() error {
-	if c.lookPathErr != nil {
-		c.closeDescriptors(c.closeAfterStart)
-		c.closeDescriptors(c.closeAfterWait)
-		return c.lookPathErr
-	}
-	if runtime.GOOS == "windows" {
-		lp, err := lookExtensions(c.Path, c.Dir)
-		if err != nil {
-			c.closeDescriptors(c.closeAfterStart)
-			c.closeDescriptors(c.closeAfterWait)
-			return err
-		}
-		c.Path = lp
-	}
-	if c.Process != nil {
-		return errors.New("exec: already started")
-	}
-
-	type F func(*Cmd) (*os.File, error)
-	for _, setupFd := range []F{(*Cmd).stdin, (*Cmd).stdout, (*Cmd).stderr} {
-		fd, err := setupFd(c)
-		if err != nil {
-			c.closeDescriptors(c.closeAfterStart)
-			c.closeDescriptors(c.closeAfterWait)
-			return err
-		}
-		c.childFiles = append(c.childFiles, fd)
-	}
-	c.childFiles = append(c.childFiles, c.ExtraFiles...)
-
-	var err error
-	c.Process, err = os.StartProcess(c.Path, c.argv(), &os.ProcAttr{
-		Dir:   c.Dir,
-		Files: c.childFiles,
-		Env:   c.envv(),
-		Sys:   c.SysProcAttr,
-	})
-	if err != nil {
-		c.closeDescriptors(c.closeAfterStart)
-		c.closeDescriptors(c.closeAfterWait)
-		return err
-	}
-
-	c.closeDescriptors(c.closeAfterStart)
-
-	c.errch = make(chan error, len(c.goroutine))
-	for _, fn := range c.goroutine {
-		go func(fn func() error) {
-			c.errch <- fn()
-		}(fn)
-	}
-
-	return nil
-}
-
-// An ExitError reports an unsuccessful exit by a command.
-type ExitError struct {
-	*os.ProcessState
-}
-
-func (e *ExitError) Error() string {
-	return e.ProcessState.String()
-}
-
-// Wait waits for the command to exit.
-// It must have been started by Start.
-//
-// The returned error is nil if the command runs, has no problems
-// copying stdin, stdout, and stderr, and exits with a zero exit
-// status.
-//
-// If the command fails to run or doesn't complete successfully, the
-// error is of type *ExitError. Other error types may be
-// returned for I/O problems.
-//
-// If c.Stdin is not an *os.File, Wait also waits for the I/O loop
-// copying from c.Stdin into the process's standard input
-// to complete.
-//
-// Wait releases any resources associated with the Cmd.
-func (c *Cmd) Wait() error {
-	if c.Process == nil {
-		return errors.New("exec: not started")
-	}
-	if c.finished {
-		return errors.New("exec: Wait was already called")
-	}
-	c.finished = true
-	state, err := c.Process.Wait()
-	c.ProcessState = state
-
-	var copyError error
-	for range c.goroutine {
-		if err := <-c.errch; err != nil && copyError == nil {
-			copyError = err
-		}
-	}
-
-	c.closeDescriptors(c.closeAfterWait)
-
-	if err != nil {
-		return err
-	} else if !state.Success() {
-		return &ExitError{state}
-	}
-
-	return copyError
-}
-
-// Output runs the command and returns its standard output.
-func (c *Cmd) Output() ([]byte, error) {
-	if c.Stdout != nil {
-		return nil, errors.New("exec: Stdout already set")
-	}
-	var b bytes.Buffer
-	c.Stdout = &b
-	err := c.Run()
-	return b.Bytes(), err
-}
-
-// CombinedOutput runs the command and returns its combined standard
-// output and standard error.
-func (c *Cmd) CombinedOutput() ([]byte, error) {
-	if c.Stdout != nil {
-		return nil, errors.New("exec: Stdout already set")
-	}
-	if c.Stderr != nil {
-		return nil, errors.New("exec: Stderr already set")
-	}
-	var b bytes.Buffer
-	c.Stdout = &b
-	c.Stderr = &b
-	err := c.Run()
-	return b.Bytes(), err
-}
-
-// StdinPipe returns a pipe that will be connected to the command's
-// standard input when the command starts.
-// The pipe will be closed automatically after Wait sees the command exit.
-// A caller need only call Close to force the pipe to close sooner.
-// For example, if the command being run will not exit until standard input
-// is closed, the caller must close the pipe.
-func (c *Cmd) StdinPipe() (io.WriteCloser, error) {
-	if c.Stdin != nil {
-		return nil, errors.New("exec: Stdin already set")
-	}
-	if c.Process != nil {
-		return nil, errors.New("exec: StdinPipe after process started")
-	}
-	pr, pw, err := os.Pipe()
-	if err != nil {
-		return nil, err
-	}
-	c.Stdin = pr
-	c.closeAfterStart = append(c.closeAfterStart, pr)
-	wc := &closeOnce{File: pw}
-	c.closeAfterWait = append(c.closeAfterWait, wc)
-	return wc, nil
-}
-
-type closeOnce struct {
-	*os.File
-
-	once sync.Once
-	err  error
-}
-
-func (c *closeOnce) Close() error {
-	c.once.Do(c.close)
-	return c.err
-}
-
-func (c *closeOnce) close() {
-	c.err = c.File.Close()
-}
-
-// StdoutPipe returns a pipe that will be connected to the command's
-// standard output when the command starts.
-//
-// Wait will close the pipe after seeing the command exit, so most callers
-// need not close the pipe themselves; however, an implication is that
-// it is incorrect to call Wait before all reads from the pipe have completed.
-// For the same reason, it is incorrect to call Run when using StdoutPipe.
-// See the example for idiomatic usage.
-func (c *Cmd) StdoutPipe() (io.ReadCloser, error) {
-	if c.Stdout != nil {
-		return nil, errors.New("exec: Stdout already set")
-	}
-	if c.Process != nil {
-		return nil, errors.New("exec: StdoutPipe after process started")
-	}
-	pr, pw, err := os.Pipe()
-	if err != nil {
-		return nil, err
-	}
-	c.Stdout = pw
-	c.closeAfterStart = append(c.closeAfterStart, pw)
-	c.closeAfterWait = append(c.closeAfterWait, pr)
-	return pr, nil
-}
-
-// StderrPipe returns a pipe that will be connected to the command's
-// standard error when the command starts.
-//
-// Wait will close the pipe after seeing the command exit, so most callers
-// need not close the pipe themselves; however, an implication is that
-// it is incorrect to call Wait before all reads from the pipe have completed.
-// For the same reason, it is incorrect to use Run when using StderrPipe.
-// See the StdoutPipe example for idiomatic usage.
-func (c *Cmd) StderrPipe() (io.ReadCloser, error) {
-	if c.Stderr != nil {
-		return nil, errors.New("exec: Stderr already set")
-	}
-	if c.Process != nil {
-		return nil, errors.New("exec: StderrPipe after process started")
-	}
-	pr, pw, err := os.Pipe()
-	if err != nil {
-		return nil, err
-	}
-	c.Stderr = pw
-	c.closeAfterStart = append(c.closeAfterStart, pw)
-	c.closeAfterWait = append(c.closeAfterWait, pr)
-	return pr, nil
-}
diff --git a/third_party/gofrontend/libgo/go/os/exec/exec_posix.go b/third_party/gofrontend/libgo/go/os/exec/exec_posix.go
deleted file mode 100644
index 5e11137..0000000
--- a/third_party/gofrontend/libgo/go/os/exec/exec_posix.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-package exec
-
-import (
-	"os"
-	"syscall"
-)
-
-func init() {
-	skipStdinCopyError = func(err error) bool {
-		// Ignore EPIPE errors copying to stdin if the program
-		// completed successfully otherwise.
-		// See Issue 9173.
-		pe, ok := err.(*os.PathError)
-		return ok &&
-			pe.Op == "write" && pe.Path == "|1" &&
-			pe.Err == syscall.EPIPE
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/os/exec/exec_test.go b/third_party/gofrontend/libgo/go/os/exec/exec_test.go
deleted file mode 100644
index f4c025e..0000000
--- a/third_party/gofrontend/libgo/go/os/exec/exec_test.go
+++ /dev/null
@@ -1,822 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Use an external test to avoid os/exec -> net/http -> crypto/x509 -> os/exec
-// circular dependency on non-cgo darwin.
-
-package exec_test
-
-import (
-	"bufio"
-	"bytes"
-	"fmt"
-	"internal/testenv"
-	"io"
-	"io/ioutil"
-	"log"
-	"net"
-	"net/http"
-	"net/http/httptest"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"strconv"
-	"strings"
-	"testing"
-	"time"
-)
-
-func helperCommand(t *testing.T, s ...string) *exec.Cmd {
-	testenv.MustHaveExec(t)
-
-	cs := []string{"-test.run=TestHelperProcess", "--"}
-	cs = append(cs, s...)
-	cmd := exec.Command(os.Args[0], cs...)
-	cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"}
-	path := os.Getenv("LD_LIBRARY_PATH")
-	if path != "" {
-		cmd.Env = append(cmd.Env, "LD_LIBRARY_PATH="+path)
-	}
-	return cmd
-}
-
-func TestEcho(t *testing.T) {
-	bs, err := helperCommand(t, "echo", "foo bar", "baz").Output()
-	if err != nil {
-		t.Errorf("echo: %v", err)
-	}
-	if g, e := string(bs), "foo bar baz\n"; g != e {
-		t.Errorf("echo: want %q, got %q", e, g)
-	}
-}
-
-func TestCommandRelativeName(t *testing.T) {
-	testenv.MustHaveExec(t)
-
-	// Run our own binary as a relative path
-	// (e.g. "_test/exec.test") our parent directory.
-	base := filepath.Base(os.Args[0]) // "exec.test"
-	dir := filepath.Dir(os.Args[0])   // "/tmp/go-buildNNNN/os/exec/_test"
-	if dir == "." {
-		t.Skip("skipping; running test at root somehow")
-	}
-	parentDir := filepath.Dir(dir) // "/tmp/go-buildNNNN/os/exec"
-	dirBase := filepath.Base(dir)  // "_test"
-	if dirBase == "." {
-		t.Skipf("skipping; unexpected shallow dir of %q", dir)
-	}
-
-	cmd := exec.Command(filepath.Join(dirBase, base), "-test.run=TestHelperProcess", "--", "echo", "foo")
-	cmd.Dir = parentDir
-	cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"}
-
-	out, err := cmd.Output()
-	if err != nil {
-		t.Errorf("echo: %v", err)
-	}
-	if g, e := string(out), "foo\n"; g != e {
-		t.Errorf("echo: want %q, got %q", e, g)
-	}
-}
-
-func TestCatStdin(t *testing.T) {
-	// Cat, testing stdin and stdout.
-	input := "Input string\nLine 2"
-	p := helperCommand(t, "cat")
-	p.Stdin = strings.NewReader(input)
-	bs, err := p.Output()
-	if err != nil {
-		t.Errorf("cat: %v", err)
-	}
-	s := string(bs)
-	if s != input {
-		t.Errorf("cat: want %q, got %q", input, s)
-	}
-}
-
-func TestCatGoodAndBadFile(t *testing.T) {
-	// Testing combined output and error values.
-	bs, err := helperCommand(t, "cat", "/bogus/file.foo", "exec_test.go").CombinedOutput()
-	if _, ok := err.(*exec.ExitError); !ok {
-		t.Errorf("expected *exec.ExitError from cat combined; got %T: %v", err, err)
-	}
-	s := string(bs)
-	sp := strings.SplitN(s, "\n", 2)
-	if len(sp) != 2 {
-		t.Fatalf("expected two lines from cat; got %q", s)
-	}
-	errLine, body := sp[0], sp[1]
-	if !strings.HasPrefix(errLine, "Error: open /bogus/file.foo") {
-		t.Errorf("expected stderr to complain about file; got %q", errLine)
-	}
-	if !strings.Contains(body, "func TestHelperProcess(t *testing.T)") {
-		t.Errorf("expected test code; got %q (len %d)", body, len(body))
-	}
-}
-
-func TestNoExistBinary(t *testing.T) {
-	// Can't run a non-existent binary
-	err := exec.Command("/no-exist-binary").Run()
-	if err == nil {
-		t.Error("expected error from /no-exist-binary")
-	}
-}
-
-func TestExitStatus(t *testing.T) {
-	// Test that exit values are returned correctly
-	cmd := helperCommand(t, "exit", "42")
-	err := cmd.Run()
-	want := "exit status 42"
-	switch runtime.GOOS {
-	case "plan9":
-		want = fmt.Sprintf("exit status: '%s %d: 42'", filepath.Base(cmd.Path), cmd.ProcessState.Pid())
-	}
-	if werr, ok := err.(*exec.ExitError); ok {
-		if s := werr.Error(); s != want {
-			t.Errorf("from exit 42 got exit %q, want %q", s, want)
-		}
-	} else {
-		t.Fatalf("expected *exec.ExitError from exit 42; got %T: %v", err, err)
-	}
-}
-
-func TestPipes(t *testing.T) {
-	check := func(what string, err error) {
-		if err != nil {
-			t.Fatalf("%s: %v", what, err)
-		}
-	}
-	// Cat, testing stdin and stdout.
-	c := helperCommand(t, "pipetest")
-	stdin, err := c.StdinPipe()
-	check("StdinPipe", err)
-	stdout, err := c.StdoutPipe()
-	check("StdoutPipe", err)
-	stderr, err := c.StderrPipe()
-	check("StderrPipe", err)
-
-	outbr := bufio.NewReader(stdout)
-	errbr := bufio.NewReader(stderr)
-	line := func(what string, br *bufio.Reader) string {
-		line, _, err := br.ReadLine()
-		if err != nil {
-			t.Fatalf("%s: %v", what, err)
-		}
-		return string(line)
-	}
-
-	err = c.Start()
-	check("Start", err)
-
-	_, err = stdin.Write([]byte("O:I am output\n"))
-	check("first stdin Write", err)
-	if g, e := line("first output line", outbr), "O:I am output"; g != e {
-		t.Errorf("got %q, want %q", g, e)
-	}
-
-	_, err = stdin.Write([]byte("E:I am error\n"))
-	check("second stdin Write", err)
-	if g, e := line("first error line", errbr), "E:I am error"; g != e {
-		t.Errorf("got %q, want %q", g, e)
-	}
-
-	_, err = stdin.Write([]byte("O:I am output2\n"))
-	check("third stdin Write 3", err)
-	if g, e := line("second output line", outbr), "O:I am output2"; g != e {
-		t.Errorf("got %q, want %q", g, e)
-	}
-
-	stdin.Close()
-	err = c.Wait()
-	check("Wait", err)
-}
-
-const stdinCloseTestString = "Some test string."
-
-// Issue 6270.
-func TestStdinClose(t *testing.T) {
-	check := func(what string, err error) {
-		if err != nil {
-			t.Fatalf("%s: %v", what, err)
-		}
-	}
-	cmd := helperCommand(t, "stdinClose")
-	stdin, err := cmd.StdinPipe()
-	check("StdinPipe", err)
-	// Check that we can access methods of the underlying os.File.`
-	if _, ok := stdin.(interface {
-		Fd() uintptr
-	}); !ok {
-		t.Error("can't access methods of underlying *os.File")
-	}
-	check("Start", cmd.Start())
-	go func() {
-		_, err := io.Copy(stdin, strings.NewReader(stdinCloseTestString))
-		check("Copy", err)
-		// Before the fix, this next line would race with cmd.Wait.
-		check("Close", stdin.Close())
-	}()
-	check("Wait", cmd.Wait())
-}
-
-// Issue 5071
-func TestPipeLookPathLeak(t *testing.T) {
-	fd0, lsof0 := numOpenFDS(t)
-	for i := 0; i < 4; i++ {
-		cmd := exec.Command("something-that-does-not-exist-binary")
-		cmd.StdoutPipe()
-		cmd.StderrPipe()
-		cmd.StdinPipe()
-		if err := cmd.Run(); err == nil {
-			t.Fatal("unexpected success")
-		}
-	}
-	for triesLeft := 3; triesLeft >= 0; triesLeft-- {
-		open, lsof := numOpenFDS(t)
-		fdGrowth := open - fd0
-		if fdGrowth > 2 {
-			if triesLeft > 0 {
-				// Work around what appears to be a race with Linux's
-				// proc filesystem (as used by lsof). It seems to only
-				// be eventually consistent. Give it awhile to settle.
-				// See golang.org/issue/7808
-				time.Sleep(100 * time.Millisecond)
-				continue
-			}
-			t.Errorf("leaked %d fds; want ~0; have:\n%s\noriginally:\n%s", fdGrowth, lsof, lsof0)
-		}
-		break
-	}
-}
-
-func numOpenFDS(t *testing.T) (n int, lsof []byte) {
-	if runtime.GOOS == "android" {
-		// Android's stock lsof does not obey the -p option,
-		// so extra filtering is needed. (golang.org/issue/10206)
-		return numOpenFDsAndroid(t)
-	}
-
-	lsof, err := exec.Command("lsof", "-b", "-n", "-p", strconv.Itoa(os.Getpid())).Output()
-	if err != nil {
-		t.Skip("skipping test; error finding or running lsof")
-	}
-	return bytes.Count(lsof, []byte("\n")), lsof
-}
-
-func numOpenFDsAndroid(t *testing.T) (n int, lsof []byte) {
-	raw, err := exec.Command("lsof").Output()
-	if err != nil {
-		t.Skip("skipping test; error finding or running lsof")
-	}
-
-	// First find the PID column index by parsing the first line, and
-	// select lines containing pid in the column.
-	pid := []byte(strconv.Itoa(os.Getpid()))
-	pidCol := -1
-
-	s := bufio.NewScanner(bytes.NewReader(raw))
-	for s.Scan() {
-		line := s.Bytes()
-		fields := bytes.Fields(line)
-		if pidCol < 0 {
-			for i, v := range fields {
-				if bytes.Equal(v, []byte("PID")) {
-					pidCol = i
-					break
-				}
-			}
-			lsof = append(lsof, line...)
-			continue
-		}
-		if bytes.Equal(fields[pidCol], pid) {
-			lsof = append(lsof, '\n')
-			lsof = append(lsof, line...)
-		}
-	}
-	if pidCol < 0 {
-		t.Fatal("error processing lsof output: unexpected header format")
-	}
-	if err := s.Err(); err != nil {
-		t.Fatalf("error processing lsof output: %v", err)
-	}
-	return bytes.Count(lsof, []byte("\n")), lsof
-}
-
-var testedAlreadyLeaked = false
-
-// basefds returns the number of expected file descriptors
-// to be present in a process at start.
-func basefds() uintptr {
-	return os.Stderr.Fd() + 1
-}
-
-func closeUnexpectedFds(t *testing.T, m string) {
-	for fd := basefds(); fd <= 101; fd++ {
-		err := os.NewFile(fd, "").Close()
-		if err == nil {
-			t.Logf("%s: Something already leaked - closed fd %d", m, fd)
-		}
-	}
-}
-
-func TestExtraFilesFDShuffle(t *testing.T) {
-	t.Skip("flaky test; see https://golang.org/issue/5780")
-	switch runtime.GOOS {
-	case "darwin":
-		// TODO(cnicolaou): https://golang.org/issue/2603
-		// leads to leaked file descriptors in this test when it's
-		// run from a builder.
-		closeUnexpectedFds(t, "TestExtraFilesFDShuffle")
-	case "netbsd":
-		// https://golang.org/issue/3955
-		closeUnexpectedFds(t, "TestExtraFilesFDShuffle")
-	case "windows":
-		t.Skip("no operating system support; skipping")
-	}
-
-	// syscall.StartProcess maps all the FDs passed to it in
-	// ProcAttr.Files (the concatenation of stdin,stdout,stderr and
-	// ExtraFiles) into consecutive FDs in the child, that is:
-	// Files{11, 12, 6, 7, 9, 3} should result in the file
-	// represented by FD 11 in the parent being made available as 0
-	// in the child, 12 as 1, etc.
-	//
-	// We want to test that FDs in the child do not get overwritten
-	// by one another as this shuffle occurs. The original implementation
-	// was buggy in that in some data dependent cases it would ovewrite
-	// stderr in the child with one of the ExtraFile members.
-	// Testing for this case is difficult because it relies on using
-	// the same FD values as that case. In particular, an FD of 3
-	// must be at an index of 4 or higher in ProcAttr.Files and
-	// the FD of the write end of the Stderr pipe (as obtained by
-	// StderrPipe()) must be the same as the size of ProcAttr.Files;
-	// therefore we test that the read end of this pipe (which is what
-	// is returned to the parent by StderrPipe() being one less than
-	// the size of ProcAttr.Files, i.e. 3+len(cmd.ExtraFiles).
-	//
-	// Moving this test case around within the overall tests may
-	// affect the FDs obtained and hence the checks to catch these cases.
-	npipes := 2
-	c := helperCommand(t, "extraFilesAndPipes", strconv.Itoa(npipes+1))
-	rd, wr, _ := os.Pipe()
-	defer rd.Close()
-	if rd.Fd() != 3 {
-		t.Errorf("bad test value for test pipe: fd %d", rd.Fd())
-	}
-	stderr, _ := c.StderrPipe()
-	wr.WriteString("_LAST")
-	wr.Close()
-
-	pipes := make([]struct {
-		r, w *os.File
-	}, npipes)
-	data := []string{"a", "b"}
-
-	for i := 0; i < npipes; i++ {
-		r, w, err := os.Pipe()
-		if err != nil {
-			t.Fatalf("unexpected error creating pipe: %s", err)
-		}
-		pipes[i].r = r
-		pipes[i].w = w
-		w.WriteString(data[i])
-		c.ExtraFiles = append(c.ExtraFiles, pipes[i].r)
-		defer func() {
-			r.Close()
-			w.Close()
-		}()
-	}
-	// Put fd 3 at the end.
-	c.ExtraFiles = append(c.ExtraFiles, rd)
-
-	stderrFd := int(stderr.(*os.File).Fd())
-	if stderrFd != ((len(c.ExtraFiles) + 3) - 1) {
-		t.Errorf("bad test value for stderr pipe")
-	}
-
-	expected := "child: " + strings.Join(data, "") + "_LAST"
-
-	err := c.Start()
-	if err != nil {
-		t.Fatalf("Run: %v", err)
-	}
-	ch := make(chan string, 1)
-	go func(ch chan string) {
-		buf := make([]byte, 512)
-		n, err := stderr.Read(buf)
-		if err != nil {
-			t.Fatalf("Read: %s", err)
-			ch <- err.Error()
-		} else {
-			ch <- string(buf[:n])
-		}
-		close(ch)
-	}(ch)
-	select {
-	case m := <-ch:
-		if m != expected {
-			t.Errorf("Read: '%s' not '%s'", m, expected)
-		}
-	case <-time.After(5 * time.Second):
-		t.Errorf("Read timedout")
-	}
-	c.Wait()
-}
-
-func TestExtraFiles(t *testing.T) {
-	testenv.MustHaveExec(t)
-
-	if runtime.GOOS == "windows" {
-		t.Skipf("skipping test on %q", runtime.GOOS)
-	}
-
-	// Ensure that file descriptors have not already been leaked into
-	// our environment.
-	if !testedAlreadyLeaked {
-		testedAlreadyLeaked = true
-		closeUnexpectedFds(t, "TestExtraFiles")
-	}
-
-	// Force network usage, to verify the epoll (or whatever) fd
-	// doesn't leak to the child,
-	ln, err := net.Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln.Close()
-
-	// Make sure duplicated fds don't leak to the child.
-	f, err := ln.(*net.TCPListener).File()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer f.Close()
-	ln2, err := net.FileListener(f)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer ln2.Close()
-
-	// Force TLS root certs to be loaded (which might involve
-	// cgo), to make sure none of that potential C code leaks fds.
-	ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
-	// quiet expected TLS handshake error "remote error: bad certificate"
-	ts.Config.ErrorLog = log.New(ioutil.Discard, "", 0)
-	ts.StartTLS()
-	defer ts.Close()
-	_, err = http.Get(ts.URL)
-	if err == nil {
-		t.Errorf("success trying to fetch %s; want an error", ts.URL)
-	}
-
-	tf, err := ioutil.TempFile("", "")
-	if err != nil {
-		t.Fatalf("TempFile: %v", err)
-	}
-	defer os.Remove(tf.Name())
-	defer tf.Close()
-
-	const text = "Hello, fd 3!"
-	_, err = tf.Write([]byte(text))
-	if err != nil {
-		t.Fatalf("Write: %v", err)
-	}
-	_, err = tf.Seek(0, os.SEEK_SET)
-	if err != nil {
-		t.Fatalf("Seek: %v", err)
-	}
-
-	c := helperCommand(t, "read3")
-	var stdout, stderr bytes.Buffer
-	c.Stdout = &stdout
-	c.Stderr = &stderr
-	c.ExtraFiles = []*os.File{tf}
-	err = c.Run()
-	if err != nil {
-		t.Fatalf("Run: %v; stdout %q, stderr %q", err, stdout.Bytes(), stderr.Bytes())
-	}
-	if stdout.String() != text {
-		t.Errorf("got stdout %q, stderr %q; want %q on stdout", stdout.String(), stderr.String(), text)
-	}
-}
-
-func TestExtraFilesRace(t *testing.T) {
-	if runtime.GOOS == "windows" {
-		t.Skip("no operating system support; skipping")
-	}
-	listen := func() net.Listener {
-		ln, err := net.Listen("tcp", "127.0.0.1:0")
-		if err != nil {
-			t.Fatal(err)
-		}
-		return ln
-	}
-	listenerFile := func(ln net.Listener) *os.File {
-		f, err := ln.(*net.TCPListener).File()
-		if err != nil {
-			t.Fatal(err)
-		}
-		return f
-	}
-	runCommand := func(c *exec.Cmd, out chan<- string) {
-		bout, err := c.CombinedOutput()
-		if err != nil {
-			out <- "ERROR:" + err.Error()
-		} else {
-			out <- string(bout)
-		}
-	}
-
-	for i := 0; i < 10; i++ {
-		la := listen()
-		ca := helperCommand(t, "describefiles")
-		ca.ExtraFiles = []*os.File{listenerFile(la)}
-		lb := listen()
-		cb := helperCommand(t, "describefiles")
-		cb.ExtraFiles = []*os.File{listenerFile(lb)}
-		ares := make(chan string)
-		bres := make(chan string)
-		go runCommand(ca, ares)
-		go runCommand(cb, bres)
-		if got, want := <-ares, fmt.Sprintf("fd3: listener %s\n", la.Addr()); got != want {
-			t.Errorf("iteration %d, process A got:\n%s\nwant:\n%s\n", i, got, want)
-		}
-		if got, want := <-bres, fmt.Sprintf("fd3: listener %s\n", lb.Addr()); got != want {
-			t.Errorf("iteration %d, process B got:\n%s\nwant:\n%s\n", i, got, want)
-		}
-		la.Close()
-		lb.Close()
-		for _, f := range ca.ExtraFiles {
-			f.Close()
-		}
-		for _, f := range cb.ExtraFiles {
-			f.Close()
-		}
-
-	}
-}
-
-// TestHelperProcess isn't a real test. It's used as a helper process
-// for TestParameterRun.
-func TestHelperProcess(*testing.T) {
-	if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
-		return
-	}
-	defer os.Exit(0)
-
-	// Determine which command to use to display open files.
-	ofcmd := "lsof"
-	switch runtime.GOOS {
-	case "dragonfly", "freebsd", "netbsd", "openbsd":
-		ofcmd = "fstat"
-	case "plan9":
-		ofcmd = "/bin/cat"
-	}
-
-	args := os.Args
-	for len(args) > 0 {
-		if args[0] == "--" {
-			args = args[1:]
-			break
-		}
-		args = args[1:]
-	}
-	if len(args) == 0 {
-		fmt.Fprintf(os.Stderr, "No command\n")
-		os.Exit(2)
-	}
-
-	cmd, args := args[0], args[1:]
-	switch cmd {
-	case "echo":
-		iargs := []interface{}{}
-		for _, s := range args {
-			iargs = append(iargs, s)
-		}
-		fmt.Println(iargs...)
-	case "cat":
-		if len(args) == 0 {
-			io.Copy(os.Stdout, os.Stdin)
-			return
-		}
-		exit := 0
-		for _, fn := range args {
-			f, err := os.Open(fn)
-			if err != nil {
-				fmt.Fprintf(os.Stderr, "Error: %v\n", err)
-				exit = 2
-			} else {
-				defer f.Close()
-				io.Copy(os.Stdout, f)
-			}
-		}
-		os.Exit(exit)
-	case "pipetest":
-		bufr := bufio.NewReader(os.Stdin)
-		for {
-			line, _, err := bufr.ReadLine()
-			if err == io.EOF {
-				break
-			} else if err != nil {
-				os.Exit(1)
-			}
-			if bytes.HasPrefix(line, []byte("O:")) {
-				os.Stdout.Write(line)
-				os.Stdout.Write([]byte{'\n'})
-			} else if bytes.HasPrefix(line, []byte("E:")) {
-				os.Stderr.Write(line)
-				os.Stderr.Write([]byte{'\n'})
-			} else {
-				os.Exit(1)
-			}
-		}
-	case "stdinClose":
-		b, err := ioutil.ReadAll(os.Stdin)
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "Error: %v\n", err)
-			os.Exit(1)
-		}
-		if s := string(b); s != stdinCloseTestString {
-			fmt.Fprintf(os.Stderr, "Error: Read %q, want %q", s, stdinCloseTestString)
-			os.Exit(1)
-		}
-		os.Exit(0)
-	case "read3": // read fd 3
-		fd3 := os.NewFile(3, "fd3")
-		bs, err := ioutil.ReadAll(fd3)
-		if err != nil {
-			fmt.Printf("ReadAll from fd 3: %v", err)
-			os.Exit(1)
-		}
-		switch runtime.GOOS {
-		case "dragonfly":
-			// TODO(jsing): Determine why DragonFly is leaking
-			// file descriptors...
-		case "darwin":
-			// TODO(bradfitz): broken? Sometimes.
-			// https://golang.org/issue/2603
-			// Skip this additional part of the test for now.
-		case "netbsd":
-			// TODO(jsing): This currently fails on NetBSD due to
-			// the cloned file descriptors that result from opening
-			// /dev/urandom.
-			// https://golang.org/issue/3955
-		case "plan9":
-			// TODO(0intro): Determine why Plan 9 is leaking
-			// file descriptors.
-			// https://golang.org/issue/7118
-		case "solaris":
-			// TODO(aram): This fails on Solaris because libc opens
-			// its own files, as it sees fit. Darwin does the same,
-			// see: https://golang.org/issue/2603
-		default:
-			// Now verify that there are no other open fds.
-			var files []*os.File
-			for wantfd := basefds() + 1; wantfd <= 100; wantfd++ {
-				f, err := os.Open(os.Args[0])
-				if err != nil {
-					fmt.Printf("error opening file with expected fd %d: %v", wantfd, err)
-					os.Exit(1)
-				}
-				if got := f.Fd(); got != wantfd {
-					fmt.Printf("leaked parent file. fd = %d; want %d\n", got, wantfd)
-					var args []string
-					switch runtime.GOOS {
-					case "plan9":
-						args = []string{fmt.Sprintf("/proc/%d/fd", os.Getpid())}
-					default:
-						args = []string{"-p", fmt.Sprint(os.Getpid())}
-					}
-					out, _ := exec.Command(ofcmd, args...).CombinedOutput()
-					fmt.Print(string(out))
-					os.Exit(1)
-				}
-				files = append(files, f)
-			}
-			for _, f := range files {
-				f.Close()
-			}
-		}
-		// Referring to fd3 here ensures that it is not
-		// garbage collected, and therefore closed, while
-		// executing the wantfd loop above.  It doesn't matter
-		// what we do with fd3 as long as we refer to it;
-		// closing it is the easy choice.
-		fd3.Close()
-		os.Stdout.Write(bs)
-	case "exit":
-		n, _ := strconv.Atoi(args[0])
-		os.Exit(n)
-	case "describefiles":
-		f := os.NewFile(3, fmt.Sprintf("fd3"))
-		ln, err := net.FileListener(f)
-		if err == nil {
-			fmt.Printf("fd3: listener %s\n", ln.Addr())
-			ln.Close()
-		}
-		os.Exit(0)
-	case "extraFilesAndPipes":
-		n, _ := strconv.Atoi(args[0])
-		pipes := make([]*os.File, n)
-		for i := 0; i < n; i++ {
-			pipes[i] = os.NewFile(uintptr(3+i), strconv.Itoa(i))
-		}
-		response := ""
-		for i, r := range pipes {
-			ch := make(chan string, 1)
-			go func(c chan string) {
-				buf := make([]byte, 10)
-				n, err := r.Read(buf)
-				if err != nil {
-					fmt.Fprintf(os.Stderr, "Child: read error: %v on pipe %d\n", err, i)
-					os.Exit(1)
-				}
-				c <- string(buf[:n])
-				close(c)
-			}(ch)
-			select {
-			case m := <-ch:
-				response = response + m
-			case <-time.After(5 * time.Second):
-				fmt.Fprintf(os.Stderr, "Child: Timeout reading from pipe: %d\n", i)
-				os.Exit(1)
-			}
-		}
-		fmt.Fprintf(os.Stderr, "child: %s", response)
-		os.Exit(0)
-	case "exec":
-		cmd := exec.Command(args[1])
-		cmd.Dir = args[0]
-		output, err := cmd.CombinedOutput()
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "Child: %s %s", err, string(output))
-			os.Exit(1)
-		}
-		fmt.Printf("%s", string(output))
-		os.Exit(0)
-	case "lookpath":
-		p, err := exec.LookPath(args[0])
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "LookPath failed: %v\n", err)
-			os.Exit(1)
-		}
-		fmt.Print(p)
-		os.Exit(0)
-	default:
-		fmt.Fprintf(os.Stderr, "Unknown command %q\n", cmd)
-		os.Exit(2)
-	}
-}
-
-// Issue 9173: ignore stdin pipe writes if the program completes successfully.
-func TestIgnorePipeErrorOnSuccess(t *testing.T) {
-	testenv.MustHaveExec(t)
-
-	// We really only care about testing this on Unixy things.
-	if runtime.GOOS == "windows" || runtime.GOOS == "plan9" {
-		t.Skipf("skipping test on %q", runtime.GOOS)
-	}
-
-	cmd := helperCommand(t, "echo", "foo")
-	var out bytes.Buffer
-	cmd.Stdin = strings.NewReader(strings.Repeat("x", 10<<20))
-	cmd.Stdout = &out
-	if err := cmd.Run(); err != nil {
-		t.Fatal(err)
-	}
-	if got, want := out.String(), "foo\n"; got != want {
-		t.Errorf("output = %q; want %q", got, want)
-	}
-}
-
-type badWriter struct{}
-
-func (w *badWriter) Write(data []byte) (int, error) {
-	return 0, io.ErrUnexpectedEOF
-}
-
-func TestClosePipeOnCopyError(t *testing.T) {
-	testenv.MustHaveExec(t)
-
-	if runtime.GOOS == "windows" || runtime.GOOS == "plan9" {
-		t.Skipf("skipping test on %s - no yes command", runtime.GOOS)
-	}
-	cmd := exec.Command("yes")
-	cmd.Stdout = new(badWriter)
-	c := make(chan int, 1)
-	go func() {
-		err := cmd.Run()
-		if err == nil {
-			t.Errorf("yes completed successfully")
-		}
-		c <- 1
-	}()
-	select {
-	case <-c:
-		// ok
-	case <-time.After(5 * time.Second):
-		t.Fatalf("yes got stuck writing to bad writer")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/os/exec/lp_plan9.go b/third_party/gofrontend/libgo/go/os/exec/lp_plan9.go
deleted file mode 100644
index 5aa8a54..0000000
--- a/third_party/gofrontend/libgo/go/os/exec/lp_plan9.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package exec
-
-import (
-	"errors"
-	"os"
-	"strings"
-)
-
-// ErrNotFound is the error resulting if a path search failed to find an executable file.
-var ErrNotFound = errors.New("executable file not found in $path")
-
-func findExecutable(file string) error {
-	d, err := os.Stat(file)
-	if err != nil {
-		return err
-	}
-	if m := d.Mode(); !m.IsDir() && m&0111 != 0 {
-		return nil
-	}
-	return os.ErrPermission
-}
-
-// LookPath searches for an executable binary named file
-// in the directories named by the path environment variable.
-// If file begins with "/", "#", "./", or "../", it is tried
-// directly and the path is not consulted.
-// The result may be an absolute path or a path relative to the current directory.
-func LookPath(file string) (string, error) {
-	// skip the path lookup for these prefixes
-	skip := []string{"/", "#", "./", "../"}
-
-	for _, p := range skip {
-		if strings.HasPrefix(file, p) {
-			err := findExecutable(file)
-			if err == nil {
-				return file, nil
-			}
-			return "", &Error{file, err}
-		}
-	}
-
-	path := os.Getenv("path")
-	for _, dir := range strings.Split(path, "\000") {
-		if err := findExecutable(dir + "/" + file); err == nil {
-			return dir + "/" + file, nil
-		}
-	}
-	return "", &Error{file, ErrNotFound}
-}
diff --git a/third_party/gofrontend/libgo/go/os/exec/lp_test.go b/third_party/gofrontend/libgo/go/os/exec/lp_test.go
deleted file mode 100644
index 77d8e84..0000000
--- a/third_party/gofrontend/libgo/go/os/exec/lp_test.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package exec
-
-import (
-	"testing"
-)
-
-var nonExistentPaths = []string{
-	"some-non-existent-path",
-	"non-existent-path/slashed",
-}
-
-func TestLookPathNotFound(t *testing.T) {
-	for _, name := range nonExistentPaths {
-		path, err := LookPath(name)
-		if err == nil {
-			t.Fatalf("LookPath found %q in $PATH", name)
-		}
-		if path != "" {
-			t.Fatalf("LookPath path == %q when err != nil", path)
-		}
-		perr, ok := err.(*Error)
-		if !ok {
-			t.Fatal("LookPath error is not an exec.Error")
-		}
-		if perr.Name != name {
-			t.Fatalf("want Error name %q, got %q", name, perr.Name)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/os/exec/lp_unix.go b/third_party/gofrontend/libgo/go/os/exec/lp_unix.go
deleted file mode 100644
index 3f895d5..0000000
--- a/third_party/gofrontend/libgo/go/os/exec/lp_unix.go
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package exec
-
-import (
-	"errors"
-	"os"
-	"strings"
-)
-
-// ErrNotFound is the error resulting if a path search failed to find an executable file.
-var ErrNotFound = errors.New("executable file not found in $PATH")
-
-func findExecutable(file string) error {
-	d, err := os.Stat(file)
-	if err != nil {
-		return err
-	}
-	if m := d.Mode(); !m.IsDir() && m&0111 != 0 {
-		return nil
-	}
-	return os.ErrPermission
-}
-
-// LookPath searches for an executable binary named file
-// in the directories named by the PATH environment variable.
-// If file contains a slash, it is tried directly and the PATH is not consulted.
-// The result may be an absolute path or a path relative to the current directory.
-func LookPath(file string) (string, error) {
-	// NOTE(rsc): I wish we could use the Plan 9 behavior here
-	// (only bypass the path if file begins with / or ./ or ../)
-	// but that would not match all the Unix shells.
-
-	if strings.Contains(file, "/") {
-		err := findExecutable(file)
-		if err == nil {
-			return file, nil
-		}
-		return "", &Error{file, err}
-	}
-	pathenv := os.Getenv("PATH")
-	if pathenv == "" {
-		return "", &Error{file, ErrNotFound}
-	}
-	for _, dir := range strings.Split(pathenv, ":") {
-		if dir == "" {
-			// Unix shell semantics: path element "" means "."
-			dir = "."
-		}
-		path := dir + "/" + file
-		if err := findExecutable(path); err == nil {
-			return path, nil
-		}
-	}
-	return "", &Error{file, ErrNotFound}
-}
diff --git a/third_party/gofrontend/libgo/go/os/exec/lp_unix_test.go b/third_party/gofrontend/libgo/go/os/exec/lp_unix_test.go
deleted file mode 100644
index 051db66..0000000
--- a/third_party/gofrontend/libgo/go/os/exec/lp_unix_test.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package exec
-
-import (
-	"io/ioutil"
-	"os"
-	"testing"
-)
-
-func TestLookPathUnixEmptyPath(t *testing.T) {
-	tmp, err := ioutil.TempDir("", "TestLookPathUnixEmptyPath")
-	if err != nil {
-		t.Fatal("TempDir failed: ", err)
-	}
-	defer os.RemoveAll(tmp)
-	wd, err := os.Getwd()
-	if err != nil {
-		t.Fatal("Getwd failed: ", err)
-	}
-	err = os.Chdir(tmp)
-	if err != nil {
-		t.Fatal("Chdir failed: ", err)
-	}
-	defer os.Chdir(wd)
-
-	f, err := os.OpenFile("exec_me", os.O_CREATE|os.O_EXCL, 0700)
-	if err != nil {
-		t.Fatal("OpenFile failed: ", err)
-	}
-	err = f.Close()
-	if err != nil {
-		t.Fatal("Close failed: ", err)
-	}
-
-	pathenv := os.Getenv("PATH")
-	defer os.Setenv("PATH", pathenv)
-
-	err = os.Setenv("PATH", "")
-	if err != nil {
-		t.Fatal("Setenv failed: ", err)
-	}
-
-	path, err := LookPath("exec_me")
-	if err == nil {
-		t.Fatal("LookPath found exec_me in empty $PATH")
-	}
-	if path != "" {
-		t.Fatalf("LookPath path == %q when err != nil", path)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/os/exec/lp_windows.go b/third_party/gofrontend/libgo/go/os/exec/lp_windows.go
deleted file mode 100644
index c3efd67..0000000
--- a/third_party/gofrontend/libgo/go/os/exec/lp_windows.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package exec
-
-import (
-	"errors"
-	"os"
-	"strings"
-)
-
-// ErrNotFound is the error resulting if a path search failed to find an executable file.
-var ErrNotFound = errors.New("executable file not found in %PATH%")
-
-func chkStat(file string) error {
-	d, err := os.Stat(file)
-	if err != nil {
-		return err
-	}
-	if d.IsDir() {
-		return os.ErrPermission
-	}
-	return nil
-}
-
-func hasExt(file string) bool {
-	i := strings.LastIndex(file, ".")
-	if i < 0 {
-		return false
-	}
-	return strings.LastIndexAny(file, `:\/`) < i
-}
-
-func findExecutable(file string, exts []string) (string, error) {
-	if len(exts) == 0 {
-		return file, chkStat(file)
-	}
-	if hasExt(file) {
-		if chkStat(file) == nil {
-			return file, nil
-		}
-	}
-	for _, e := range exts {
-		if f := file + e; chkStat(f) == nil {
-			return f, nil
-		}
-	}
-	return ``, os.ErrNotExist
-}
-
-// LookPath searches for an executable binary named file
-// in the directories named by the PATH environment variable.
-// If file contains a slash, it is tried directly and the PATH is not consulted.
-// LookPath also uses PATHEXT environment variable to match
-// a suitable candidate.
-// The result may be an absolute path or a path relative to the current directory.
-func LookPath(file string) (f string, err error) {
-	x := os.Getenv(`PATHEXT`)
-	if x == `` {
-		x = `.COM;.EXE;.BAT;.CMD`
-	}
-	exts := []string{}
-	for _, e := range strings.Split(strings.ToLower(x), `;`) {
-		if e == "" {
-			continue
-		}
-		if e[0] != '.' {
-			e = "." + e
-		}
-		exts = append(exts, e)
-	}
-	if strings.IndexAny(file, `:\/`) != -1 {
-		if f, err = findExecutable(file, exts); err == nil {
-			return
-		}
-		return ``, &Error{file, err}
-	}
-	if f, err = findExecutable(`.\`+file, exts); err == nil {
-		return
-	}
-	if pathenv := os.Getenv(`PATH`); pathenv != `` {
-		for _, dir := range splitList(pathenv) {
-			if f, err = findExecutable(dir+`\`+file, exts); err == nil {
-				return
-			}
-		}
-	}
-	return ``, &Error{file, ErrNotFound}
-}
-
-func splitList(path string) []string {
-	// The same implementation is used in SplitList in path/filepath;
-	// consider changing path/filepath when changing this.
-
-	if path == "" {
-		return []string{}
-	}
-
-	// Split path, respecting but preserving quotes.
-	list := []string{}
-	start := 0
-	quo := false
-	for i := 0; i < len(path); i++ {
-		switch c := path[i]; {
-		case c == '"':
-			quo = !quo
-		case c == os.PathListSeparator && !quo:
-			list = append(list, path[start:i])
-			start = i + 1
-		}
-	}
-	list = append(list, path[start:])
-
-	// Remove quotes.
-	for i, s := range list {
-		if strings.Contains(s, `"`) {
-			list[i] = strings.Replace(s, `"`, ``, -1)
-		}
-	}
-
-	return list
-}
diff --git a/third_party/gofrontend/libgo/go/os/exec_plan9.go b/third_party/gofrontend/libgo/go/os/exec_plan9.go
deleted file mode 100644
index 676be36..0000000
--- a/third_party/gofrontend/libgo/go/os/exec_plan9.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"errors"
-	"runtime"
-	"syscall"
-	"time"
-)
-
-// The only signal values guaranteed to be present on all systems
-// are Interrupt (send the process an interrupt) and Kill (force
-// the process to exit).
-var (
-	Interrupt Signal = syscall.Note("interrupt")
-	Kill      Signal = syscall.Note("kill")
-)
-
-func startProcess(name string, argv []string, attr *ProcAttr) (p *Process, err error) {
-	sysattr := &syscall.ProcAttr{
-		Dir: attr.Dir,
-		Env: attr.Env,
-		Sys: attr.Sys,
-	}
-
-	for _, f := range attr.Files {
-		sysattr.Files = append(sysattr.Files, f.Fd())
-	}
-
-	pid, h, e := syscall.StartProcess(name, argv, sysattr)
-	if e != nil {
-		return nil, &PathError{"fork/exec", name, e}
-	}
-
-	return newProcess(pid, h), nil
-}
-
-func (p *Process) writeProcFile(file string, data string) error {
-	f, e := OpenFile("/proc/"+itoa(p.Pid)+"/"+file, O_WRONLY, 0)
-	if e != nil {
-		return e
-	}
-	defer f.Close()
-	_, e = f.Write([]byte(data))
-	return e
-}
-
-func (p *Process) signal(sig Signal) error {
-	if p.done() {
-		return errors.New("os: process already finished")
-	}
-	if e := p.writeProcFile("note", sig.String()); e != nil {
-		return NewSyscallError("signal", e)
-	}
-	return nil
-}
-
-func (p *Process) kill() error {
-	return p.signal(Kill)
-}
-
-func (p *Process) wait() (ps *ProcessState, err error) {
-	var waitmsg syscall.Waitmsg
-
-	if p.Pid == -1 {
-		return nil, ErrInvalid
-	}
-	err = syscall.WaitProcess(p.Pid, &waitmsg)
-	if err != nil {
-		return nil, NewSyscallError("wait", err)
-	}
-
-	p.setDone()
-	ps = &ProcessState{
-		pid:    waitmsg.Pid,
-		status: &waitmsg,
-	}
-	return ps, nil
-}
-
-func (p *Process) release() error {
-	// NOOP for Plan 9.
-	p.Pid = -1
-	// no need for a finalizer anymore
-	runtime.SetFinalizer(p, nil)
-	return nil
-}
-
-func findProcess(pid int) (p *Process, err error) {
-	// NOOP for Plan 9.
-	return newProcess(pid, 0), nil
-}
-
-// ProcessState stores information about a process, as reported by Wait.
-type ProcessState struct {
-	pid    int              // The process's id.
-	status *syscall.Waitmsg // System-dependent status info.
-}
-
-// Pid returns the process id of the exited process.
-func (p *ProcessState) Pid() int {
-	return p.pid
-}
-
-func (p *ProcessState) exited() bool {
-	return p.status.Exited()
-}
-
-func (p *ProcessState) success() bool {
-	return p.status.ExitStatus() == 0
-}
-
-func (p *ProcessState) sys() interface{} {
-	return p.status
-}
-
-func (p *ProcessState) sysUsage() interface{} {
-	return p.status
-}
-
-func (p *ProcessState) userTime() time.Duration {
-	return time.Duration(p.status.Time[0]) * time.Millisecond
-}
-
-func (p *ProcessState) systemTime() time.Duration {
-	return time.Duration(p.status.Time[1]) * time.Millisecond
-}
-
-func (p *ProcessState) String() string {
-	if p == nil {
-		return "<nil>"
-	}
-	return "exit status: " + p.status.Msg
-}
diff --git a/third_party/gofrontend/libgo/go/os/exec_posix.go b/third_party/gofrontend/libgo/go/os/exec_posix.go
deleted file mode 100644
index 94dd04b..0000000
--- a/third_party/gofrontend/libgo/go/os/exec_posix.go
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
-
-package os
-
-import (
-	"syscall"
-)
-
-// The only signal values guaranteed to be present on all systems
-// are Interrupt (send the process an interrupt) and Kill (force
-// the process to exit).
-var (
-	Interrupt Signal = syscall.SIGINT
-	Kill      Signal = syscall.SIGKILL
-)
-
-func startProcess(name string, argv []string, attr *ProcAttr) (p *Process, err error) {
-	// If there is no SysProcAttr (ie. no Chroot or changed
-	// UID/GID), double-check existence of the directory we want
-	// to chdir into.  We can make the error clearer this way.
-	if attr != nil && attr.Sys == nil && attr.Dir != "" {
-		if _, err := Stat(attr.Dir); err != nil {
-			pe := err.(*PathError)
-			pe.Op = "chdir"
-			return nil, pe
-		}
-	}
-
-	sysattr := &syscall.ProcAttr{
-		Dir: attr.Dir,
-		Env: attr.Env,
-		Sys: attr.Sys,
-	}
-	if sysattr.Env == nil {
-		sysattr.Env = Environ()
-	}
-	for _, f := range attr.Files {
-		sysattr.Files = append(sysattr.Files, f.Fd())
-	}
-
-	pid, h, e := syscall.StartProcess(name, argv, sysattr)
-	if e != nil {
-		return nil, &PathError{"fork/exec", name, e}
-	}
-	return newProcess(pid, h), nil
-}
-
-func (p *Process) kill() error {
-	return p.Signal(Kill)
-}
-
-// ProcessState stores information about a process, as reported by Wait.
-type ProcessState struct {
-	pid    int                // The process's id.
-	status syscall.WaitStatus // System-dependent status info.
-	rusage *syscall.Rusage
-}
-
-// Pid returns the process id of the exited process.
-func (p *ProcessState) Pid() int {
-	return p.pid
-}
-
-func (p *ProcessState) exited() bool {
-	return p.status.Exited()
-}
-
-func (p *ProcessState) success() bool {
-	return p.status.ExitStatus() == 0
-}
-
-func (p *ProcessState) sys() interface{} {
-	return p.status
-}
-
-func (p *ProcessState) sysUsage() interface{} {
-	return p.rusage
-}
-
-func (p *ProcessState) String() string {
-	if p == nil {
-		return "<nil>"
-	}
-	status := p.Sys().(syscall.WaitStatus)
-	res := ""
-	switch {
-	case status.Exited():
-		res = "exit status " + itoa(status.ExitStatus())
-	case status.Signaled():
-		res = "signal: " + status.Signal().String()
-	case status.Stopped():
-		res = "stop signal: " + status.StopSignal().String()
-		if status.StopSignal() == syscall.SIGTRAP && status.TrapCause() != 0 {
-			res += " (trap " + itoa(status.TrapCause()) + ")"
-		}
-	case status.Continued():
-		res = "continued"
-	}
-	if status.CoreDump() {
-		res += " (core dumped)"
-	}
-	return res
-}
diff --git a/third_party/gofrontend/libgo/go/os/exec_unix.go b/third_party/gofrontend/libgo/go/os/exec_unix.go
deleted file mode 100644
index ed97f85..0000000
--- a/third_party/gofrontend/libgo/go/os/exec_unix.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package os
-
-import (
-	"errors"
-	"runtime"
-	"syscall"
-	"time"
-)
-
-func (p *Process) wait() (ps *ProcessState, err error) {
-	if p.Pid == -1 {
-		return nil, syscall.EINVAL
-	}
-	var status syscall.WaitStatus
-	var rusage syscall.Rusage
-	pid1, e := syscall.Wait4(p.Pid, &status, 0, &rusage)
-	if e != nil {
-		return nil, NewSyscallError("wait", e)
-	}
-	if pid1 != 0 {
-		p.setDone()
-	}
-	ps = &ProcessState{
-		pid:    pid1,
-		status: status,
-		rusage: &rusage,
-	}
-	return ps, nil
-}
-
-var errFinished = errors.New("os: process already finished")
-
-func (p *Process) signal(sig Signal) error {
-	if p.Pid == -1 {
-		return errors.New("os: process already released")
-	}
-	if p.Pid == 0 {
-		return errors.New("os: process not initialized")
-	}
-	if p.done() {
-		return errFinished
-	}
-	s, ok := sig.(syscall.Signal)
-	if !ok {
-		return errors.New("os: unsupported signal type")
-	}
-	if e := syscall.Kill(p.Pid, s); e != nil {
-		if e == syscall.ESRCH {
-			return errFinished
-		}
-		return e
-	}
-	return nil
-}
-
-func (p *Process) release() error {
-	// NOOP for unix.
-	p.Pid = -1
-	// no need for a finalizer anymore
-	runtime.SetFinalizer(p, nil)
-	return nil
-}
-
-func findProcess(pid int) (p *Process, err error) {
-	// NOOP for unix.
-	return newProcess(pid, 0), nil
-}
-
-func (p *ProcessState) userTime() time.Duration {
-	return time.Duration(p.rusage.Utime.Nano()) * time.Nanosecond
-}
-
-func (p *ProcessState) systemTime() time.Duration {
-	return time.Duration(p.rusage.Stime.Nano()) * time.Nanosecond
-}
diff --git a/third_party/gofrontend/libgo/go/os/exec_windows.go b/third_party/gofrontend/libgo/go/os/exec_windows.go
deleted file mode 100644
index 3264271..0000000
--- a/third_party/gofrontend/libgo/go/os/exec_windows.go
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"errors"
-	"runtime"
-	"sync/atomic"
-	"syscall"
-	"time"
-	"unsafe"
-)
-
-func (p *Process) wait() (ps *ProcessState, err error) {
-	handle := atomic.LoadUintptr(&p.handle)
-	s, e := syscall.WaitForSingleObject(syscall.Handle(handle), syscall.INFINITE)
-	switch s {
-	case syscall.WAIT_OBJECT_0:
-		break
-	case syscall.WAIT_FAILED:
-		return nil, NewSyscallError("WaitForSingleObject", e)
-	default:
-		return nil, errors.New("os: unexpected result from WaitForSingleObject")
-	}
-	var ec uint32
-	e = syscall.GetExitCodeProcess(syscall.Handle(handle), &ec)
-	if e != nil {
-		return nil, NewSyscallError("GetExitCodeProcess", e)
-	}
-	var u syscall.Rusage
-	e = syscall.GetProcessTimes(syscall.Handle(handle), &u.CreationTime, &u.ExitTime, &u.KernelTime, &u.UserTime)
-	if e != nil {
-		return nil, NewSyscallError("GetProcessTimes", e)
-	}
-	p.setDone()
-	// NOTE(brainman): It seems that sometimes process is not dead
-	// when WaitForSingleObject returns. But we do not know any
-	// other way to wait for it. Sleeping for a while seems to do
-	// the trick sometimes. So we will sleep and smell the roses.
-	defer time.Sleep(5 * time.Millisecond)
-	defer p.Release()
-	return &ProcessState{p.Pid, syscall.WaitStatus{ExitCode: ec}, &u}, nil
-}
-
-func terminateProcess(pid, exitcode int) error {
-	h, e := syscall.OpenProcess(syscall.PROCESS_TERMINATE, false, uint32(pid))
-	if e != nil {
-		return NewSyscallError("OpenProcess", e)
-	}
-	defer syscall.CloseHandle(h)
-	e = syscall.TerminateProcess(h, uint32(exitcode))
-	return NewSyscallError("TerminateProcess", e)
-}
-
-func (p *Process) signal(sig Signal) error {
-	handle := atomic.LoadUintptr(&p.handle)
-	if handle == uintptr(syscall.InvalidHandle) {
-		return syscall.EINVAL
-	}
-	if p.done() {
-		return errors.New("os: process already finished")
-	}
-	if sig == Kill {
-		return terminateProcess(p.Pid, 1)
-	}
-	// TODO(rsc): Handle Interrupt too?
-	return syscall.Errno(syscall.EWINDOWS)
-}
-
-func (p *Process) release() error {
-	handle := atomic.LoadUintptr(&p.handle)
-	if handle == uintptr(syscall.InvalidHandle) {
-		return syscall.EINVAL
-	}
-	e := syscall.CloseHandle(syscall.Handle(handle))
-	if e != nil {
-		return NewSyscallError("CloseHandle", e)
-	}
-	atomic.StoreUintptr(&p.handle, uintptr(syscall.InvalidHandle))
-	// no need for a finalizer anymore
-	runtime.SetFinalizer(p, nil)
-	return nil
-}
-
-func findProcess(pid int) (p *Process, err error) {
-	const da = syscall.STANDARD_RIGHTS_READ |
-		syscall.PROCESS_QUERY_INFORMATION | syscall.SYNCHRONIZE
-	h, e := syscall.OpenProcess(da, false, uint32(pid))
-	if e != nil {
-		return nil, NewSyscallError("OpenProcess", e)
-	}
-	return newProcess(pid, uintptr(h)), nil
-}
-
-func init() {
-	var argc int32
-	cmd := syscall.GetCommandLine()
-	argv, e := syscall.CommandLineToArgv(cmd, &argc)
-	if e != nil {
-		return
-	}
-	defer syscall.LocalFree(syscall.Handle(uintptr(unsafe.Pointer(argv))))
-	Args = make([]string, argc)
-	for i, v := range (*argv)[:argc] {
-		Args[i] = string(syscall.UTF16ToString((*v)[:]))
-	}
-}
-
-func ftToDuration(ft *syscall.Filetime) time.Duration {
-	n := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime) // in 100-nanosecond intervals
-	return time.Duration(n*100) * time.Nanosecond
-}
-
-func (p *ProcessState) userTime() time.Duration {
-	return ftToDuration(&p.rusage.UserTime)
-}
-
-func (p *ProcessState) systemTime() time.Duration {
-	return ftToDuration(&p.rusage.KernelTime)
-}
diff --git a/third_party/gofrontend/libgo/go/os/export_test.go b/third_party/gofrontend/libgo/go/os/export_test.go
deleted file mode 100644
index 9fa7936..0000000
--- a/third_party/gofrontend/libgo/go/os/export_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-// Export for testing.
-
-var Atime = atime
-var LstatP = &lstat
diff --git a/third_party/gofrontend/libgo/go/os/file.go b/third_party/gofrontend/libgo/go/os/file.go
deleted file mode 100644
index 8c0e3ff..0000000
--- a/third_party/gofrontend/libgo/go/os/file.go
+++ /dev/null
@@ -1,274 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package os provides a platform-independent interface to operating system
-// functionality. The design is Unix-like, although the error handling is
-// Go-like; failing calls return values of type error rather than error numbers.
-// Often, more information is available within the error. For example,
-// if a call that takes a file name fails, such as Open or Stat, the error
-// will include the failing file name when printed and will be of type
-// *PathError, which may be unpacked for more information.
-//
-// The os interface is intended to be uniform across all operating systems.
-// Features not generally available appear in the system-specific package syscall.
-//
-// Here is a simple example, opening a file and reading some of it.
-//
-//	file, err := os.Open("file.go") // For read access.
-//	if err != nil {
-//		log.Fatal(err)
-//	}
-//
-// If the open fails, the error string will be self-explanatory, like
-//
-//	open file.go: no such file or directory
-//
-// The file's data can then be read into a slice of bytes. Read and
-// Write take their byte counts from the length of the argument slice.
-//
-//	data := make([]byte, 100)
-//	count, err := file.Read(data)
-//	if err != nil {
-//		log.Fatal(err)
-//	}
-//	fmt.Printf("read %d bytes: %q\n", count, data[:count])
-//
-package os
-
-import (
-	"io"
-	"syscall"
-)
-
-// Name returns the name of the file as presented to Open.
-func (f *File) Name() string { return f.name }
-
-// Stdin, Stdout, and Stderr are open Files pointing to the standard input,
-// standard output, and standard error file descriptors.
-var (
-	Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
-	Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
-	Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
-)
-
-// Flags to Open wrapping those of the underlying system. Not all flags
-// may be implemented on a given system.
-const (
-	O_RDONLY int = syscall.O_RDONLY // open the file read-only.
-	O_WRONLY int = syscall.O_WRONLY // open the file write-only.
-	O_RDWR   int = syscall.O_RDWR   // open the file read-write.
-	O_APPEND int = syscall.O_APPEND // append data to the file when writing.
-	O_CREATE int = syscall.O_CREAT  // create a new file if none exists.
-	O_EXCL   int = syscall.O_EXCL   // used with O_CREATE, file must not exist
-	O_SYNC   int = syscall.O_SYNC   // open for synchronous I/O.
-	O_TRUNC  int = syscall.O_TRUNC  // if possible, truncate file when opened.
-)
-
-// Seek whence values.
-const (
-	SEEK_SET int = 0 // seek relative to the origin of the file
-	SEEK_CUR int = 1 // seek relative to the current offset
-	SEEK_END int = 2 // seek relative to the end
-)
-
-// LinkError records an error during a link or symlink or rename
-// system call and the paths that caused it.
-type LinkError struct {
-	Op  string
-	Old string
-	New string
-	Err error
-}
-
-func (e *LinkError) Error() string {
-	return e.Op + " " + e.Old + " " + e.New + ": " + e.Err.Error()
-}
-
-// Read reads up to len(b) bytes from the File.
-// It returns the number of bytes read and an error, if any.
-// EOF is signaled by a zero count with err set to io.EOF.
-func (f *File) Read(b []byte) (n int, err error) {
-	if f == nil {
-		return 0, ErrInvalid
-	}
-	n, e := f.read(b)
-	if n < 0 {
-		n = 0
-	}
-	if n == 0 && len(b) > 0 && e == nil {
-		return 0, io.EOF
-	}
-	if e != nil {
-		err = &PathError{"read", f.name, e}
-	}
-	return n, err
-}
-
-// ReadAt reads len(b) bytes from the File starting at byte offset off.
-// It returns the number of bytes read and the error, if any.
-// ReadAt always returns a non-nil error when n < len(b).
-// At end of file, that error is io.EOF.
-func (f *File) ReadAt(b []byte, off int64) (n int, err error) {
-	if f == nil {
-		return 0, ErrInvalid
-	}
-	for len(b) > 0 {
-		m, e := f.pread(b, off)
-		if m == 0 && e == nil {
-			return n, io.EOF
-		}
-		if e != nil {
-			err = &PathError{"read", f.name, e}
-			break
-		}
-		n += m
-		b = b[m:]
-		off += int64(m)
-	}
-	return
-}
-
-// Write writes len(b) bytes to the File.
-// It returns the number of bytes written and an error, if any.
-// Write returns a non-nil error when n != len(b).
-func (f *File) Write(b []byte) (n int, err error) {
-	if f == nil {
-		return 0, ErrInvalid
-	}
-	n, e := f.write(b)
-	if n < 0 {
-		n = 0
-	}
-	if n != len(b) {
-		err = io.ErrShortWrite
-	}
-
-	epipecheck(f, e)
-
-	if e != nil {
-		err = &PathError{"write", f.name, e}
-	}
-	return n, err
-}
-
-// WriteAt writes len(b) bytes to the File starting at byte offset off.
-// It returns the number of bytes written and an error, if any.
-// WriteAt returns a non-nil error when n != len(b).
-func (f *File) WriteAt(b []byte, off int64) (n int, err error) {
-	if f == nil {
-		return 0, ErrInvalid
-	}
-	for len(b) > 0 {
-		m, e := f.pwrite(b, off)
-		if e != nil {
-			err = &PathError{"write", f.name, e}
-			break
-		}
-		n += m
-		b = b[m:]
-		off += int64(m)
-	}
-	return
-}
-
-// Seek sets the offset for the next Read or Write on file to offset, interpreted
-// according to whence: 0 means relative to the origin of the file, 1 means
-// relative to the current offset, and 2 means relative to the end.
-// It returns the new offset and an error, if any.
-func (f *File) Seek(offset int64, whence int) (ret int64, err error) {
-	if f == nil {
-		return 0, ErrInvalid
-	}
-	r, e := f.seek(offset, whence)
-	if e == nil && f.dirinfo != nil && r != 0 {
-		e = syscall.EISDIR
-	}
-	if e != nil {
-		return 0, &PathError{"seek", f.name, e}
-	}
-	return r, nil
-}
-
-// WriteString is like Write, but writes the contents of string s rather than
-// a slice of bytes.
-func (f *File) WriteString(s string) (n int, err error) {
-	if f == nil {
-		return 0, ErrInvalid
-	}
-	return f.Write([]byte(s))
-}
-
-// Mkdir creates a new directory with the specified name and permission bits.
-// If there is an error, it will be of type *PathError.
-func Mkdir(name string, perm FileMode) error {
-	e := syscall.Mkdir(name, syscallMode(perm))
-
-	if e != nil {
-		return &PathError{"mkdir", name, e}
-	}
-
-	// mkdir(2) itself won't handle the sticky bit on *BSD and Solaris
-	if !supportsCreateWithStickyBit && perm&ModeSticky != 0 {
-		Chmod(name, perm)
-	}
-
-	return nil
-}
-
-// Chdir changes the current working directory to the named directory.
-// If there is an error, it will be of type *PathError.
-func Chdir(dir string) error {
-	if e := syscall.Chdir(dir); e != nil {
-		return &PathError{"chdir", dir, e}
-	}
-	return nil
-}
-
-// Chdir changes the current working directory to the file,
-// which must be a directory.
-// If there is an error, it will be of type *PathError.
-func (f *File) Chdir() error {
-	if f == nil {
-		return ErrInvalid
-	}
-	if e := syscall.Fchdir(f.fd); e != nil {
-		return &PathError{"chdir", f.name, e}
-	}
-	return nil
-}
-
-// Open opens the named file for reading.  If successful, methods on
-// the returned file can be used for reading; the associated file
-// descriptor has mode O_RDONLY.
-// If there is an error, it will be of type *PathError.
-func Open(name string) (*File, error) {
-	return OpenFile(name, O_RDONLY, 0)
-}
-
-// Create creates the named file with mode 0666 (before umask), truncating
-// it if it already exists. If successful, methods on the returned
-// File can be used for I/O; the associated file descriptor has mode
-// O_RDWR.
-// If there is an error, it will be of type *PathError.
-func Create(name string) (*File, error) {
-	return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
-}
-
-// lstat is overridden in tests.
-var lstat = Lstat
-
-// Rename renames (moves) a file. OS-specific restrictions might apply.
-// If there is an error, it will be of type *LinkError.
-func Rename(oldpath, newpath string) error {
-	return rename(oldpath, newpath)
-}
-
-// Many functions in package syscall return a count of -1 instead of 0.
-// Using fixCount(call()) instead of call() corrects the count.
-func fixCount(n int, err error) (int, error) {
-	if n < 0 {
-		n = 0
-	}
-	return n, err
-}
diff --git a/third_party/gofrontend/libgo/go/os/file_plan9.go b/third_party/gofrontend/libgo/go/os/file_plan9.go
deleted file mode 100644
index 085ebc4..0000000
--- a/third_party/gofrontend/libgo/go/os/file_plan9.go
+++ /dev/null
@@ -1,469 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"runtime"
-	"syscall"
-	"time"
-)
-
-// File represents an open file descriptor.
-type File struct {
-	*file
-}
-
-// file is the real representation of *File.
-// The extra level of indirection ensures that no clients of os
-// can overwrite this data, which could cause the finalizer
-// to close the wrong file descriptor.
-type file struct {
-	fd      int
-	name    string
-	dirinfo *dirInfo // nil unless directory being read
-}
-
-// Fd returns the integer Plan 9 file descriptor referencing the open file.
-// The file descriptor is valid only until f.Close is called or f is garbage collected.
-func (f *File) Fd() uintptr {
-	if f == nil {
-		return ^(uintptr(0))
-	}
-	return uintptr(f.fd)
-}
-
-// NewFile returns a new File with the given file descriptor and name.
-func NewFile(fd uintptr, name string) *File {
-	fdi := int(fd)
-	if fdi < 0 {
-		return nil
-	}
-	f := &File{&file{fd: fdi, name: name}}
-	runtime.SetFinalizer(f.file, (*file).close)
-	return f
-}
-
-// Auxiliary information if the File describes a directory
-type dirInfo struct {
-	buf  [syscall.STATMAX]byte // buffer for directory I/O
-	nbuf int                   // length of buf; return value from Read
-	bufp int                   // location of next record in buf.
-}
-
-func epipecheck(file *File, e error) {
-}
-
-// DevNull is the name of the operating system's ``null device.''
-// On Unix-like systems, it is "/dev/null"; on Windows, "NUL".
-const DevNull = "/dev/null"
-
-// syscallMode returns the syscall-specific mode bits from Go's portable mode bits.
-func syscallMode(i FileMode) (o uint32) {
-	o |= uint32(i.Perm())
-	if i&ModeAppend != 0 {
-		o |= syscall.DMAPPEND
-	}
-	if i&ModeExclusive != 0 {
-		o |= syscall.DMEXCL
-	}
-	if i&ModeTemporary != 0 {
-		o |= syscall.DMTMP
-	}
-	return
-}
-
-// OpenFile is the generalized open call; most users will use Open
-// or Create instead.  It opens the named file with specified flag
-// (O_RDONLY etc.) and perm, (0666 etc.) if applicable.  If successful,
-// methods on the returned File can be used for I/O.
-// If there is an error, it will be of type *PathError.
-func OpenFile(name string, flag int, perm FileMode) (*File, error) {
-	var (
-		fd     int
-		e      error
-		create bool
-		excl   bool
-		trunc  bool
-		append bool
-	)
-
-	if flag&O_CREATE == O_CREATE {
-		flag = flag & ^O_CREATE
-		create = true
-	}
-	if flag&O_EXCL == O_EXCL {
-		excl = true
-	}
-	if flag&O_TRUNC == O_TRUNC {
-		trunc = true
-	}
-	// O_APPEND is emulated on Plan 9
-	if flag&O_APPEND == O_APPEND {
-		flag = flag &^ O_APPEND
-		append = true
-	}
-
-	if (create && trunc) || excl {
-		fd, e = syscall.Create(name, flag, syscallMode(perm))
-	} else {
-		fd, e = syscall.Open(name, flag)
-		if e != nil && create {
-			var e1 error
-			fd, e1 = syscall.Create(name, flag, syscallMode(perm))
-			if e1 == nil {
-				e = nil
-			}
-		}
-	}
-
-	if e != nil {
-		return nil, &PathError{"open", name, e}
-	}
-
-	if append {
-		if _, e = syscall.Seek(fd, 0, SEEK_END); e != nil {
-			return nil, &PathError{"seek", name, e}
-		}
-	}
-
-	return NewFile(uintptr(fd), name), nil
-}
-
-// Close closes the File, rendering it unusable for I/O.
-// It returns an error, if any.
-func (f *File) Close() error {
-	if f == nil {
-		return ErrInvalid
-	}
-	return f.file.close()
-}
-
-func (file *file) close() error {
-	if file == nil || file.fd < 0 {
-		return ErrInvalid
-	}
-	var err error
-	syscall.ForkLock.RLock()
-	if e := syscall.Close(file.fd); e != nil {
-		err = &PathError{"close", file.name, e}
-	}
-	syscall.ForkLock.RUnlock()
-	file.fd = -1 // so it can't be closed again
-
-	// no need for a finalizer anymore
-	runtime.SetFinalizer(file, nil)
-	return err
-}
-
-// Stat returns the FileInfo structure describing file.
-// If there is an error, it will be of type *PathError.
-func (f *File) Stat() (FileInfo, error) {
-	if f == nil {
-		return nil, ErrInvalid
-	}
-	d, err := dirstat(f)
-	if err != nil {
-		return nil, err
-	}
-	return fileInfoFromStat(d), nil
-}
-
-// Truncate changes the size of the file.
-// It does not change the I/O offset.
-// If there is an error, it will be of type *PathError.
-func (f *File) Truncate(size int64) error {
-	if f == nil {
-		return ErrInvalid
-	}
-
-	var d syscall.Dir
-	d.Null()
-	d.Length = size
-
-	var buf [syscall.STATFIXLEN]byte
-	n, err := d.Marshal(buf[:])
-	if err != nil {
-		return &PathError{"truncate", f.name, err}
-	}
-	if err = syscall.Fwstat(f.fd, buf[:n]); err != nil {
-		return &PathError{"truncate", f.name, err}
-	}
-	return nil
-}
-
-const chmodMask = uint32(syscall.DMAPPEND | syscall.DMEXCL | syscall.DMTMP | ModePerm)
-
-// Chmod changes the mode of the file to mode.
-// If there is an error, it will be of type *PathError.
-func (f *File) Chmod(mode FileMode) error {
-	if f == nil {
-		return ErrInvalid
-	}
-	var d syscall.Dir
-
-	odir, e := dirstat(f)
-	if e != nil {
-		return &PathError{"chmod", f.name, e}
-	}
-	d.Null()
-	d.Mode = odir.Mode&^chmodMask | syscallMode(mode)&chmodMask
-
-	var buf [syscall.STATFIXLEN]byte
-	n, err := d.Marshal(buf[:])
-	if err != nil {
-		return &PathError{"chmod", f.name, err}
-	}
-	if err = syscall.Fwstat(f.fd, buf[:n]); err != nil {
-		return &PathError{"chmod", f.name, err}
-	}
-	return nil
-}
-
-// Sync commits the current contents of the file to stable storage.
-// Typically, this means flushing the file system's in-memory copy
-// of recently written data to disk.
-func (f *File) Sync() error {
-	if f == nil {
-		return ErrInvalid
-	}
-	var d syscall.Dir
-	d.Null()
-
-	var buf [syscall.STATFIXLEN]byte
-	n, err := d.Marshal(buf[:])
-	if err != nil {
-		return NewSyscallError("fsync", err)
-	}
-	if err = syscall.Fwstat(f.fd, buf[:n]); err != nil {
-		return NewSyscallError("fsync", err)
-	}
-	return nil
-}
-
-// read reads up to len(b) bytes from the File.
-// It returns the number of bytes read and an error, if any.
-func (f *File) read(b []byte) (n int, err error) {
-	return fixCount(syscall.Read(f.fd, b))
-}
-
-// pread reads len(b) bytes from the File starting at byte offset off.
-// It returns the number of bytes read and the error, if any.
-// EOF is signaled by a zero count with err set to nil.
-func (f *File) pread(b []byte, off int64) (n int, err error) {
-	return fixCount(syscall.Pread(f.fd, b, off))
-}
-
-// write writes len(b) bytes to the File.
-// It returns the number of bytes written and an error, if any.
-// Since Plan 9 preserves message boundaries, never allow
-// a zero-byte write.
-func (f *File) write(b []byte) (n int, err error) {
-	if len(b) == 0 {
-		return 0, nil
-	}
-	return fixCount(syscall.Write(f.fd, b))
-}
-
-// pwrite writes len(b) bytes to the File starting at byte offset off.
-// It returns the number of bytes written and an error, if any.
-// Since Plan 9 preserves message boundaries, never allow
-// a zero-byte write.
-func (f *File) pwrite(b []byte, off int64) (n int, err error) {
-	if len(b) == 0 {
-		return 0, nil
-	}
-	return fixCount(syscall.Pwrite(f.fd, b, off))
-}
-
-// seek sets the offset for the next Read or Write on file to offset, interpreted
-// according to whence: 0 means relative to the origin of the file, 1 means
-// relative to the current offset, and 2 means relative to the end.
-// It returns the new offset and an error, if any.
-func (f *File) seek(offset int64, whence int) (ret int64, err error) {
-	return syscall.Seek(f.fd, offset, whence)
-}
-
-// Truncate changes the size of the named file.
-// If the file is a symbolic link, it changes the size of the link's target.
-// If there is an error, it will be of type *PathError.
-func Truncate(name string, size int64) error {
-	var d syscall.Dir
-
-	d.Null()
-	d.Length = size
-
-	var buf [syscall.STATFIXLEN]byte
-	n, err := d.Marshal(buf[:])
-	if err != nil {
-		return &PathError{"truncate", name, err}
-	}
-	if err = syscall.Wstat(name, buf[:n]); err != nil {
-		return &PathError{"truncate", name, err}
-	}
-	return nil
-}
-
-// Remove removes the named file or directory.
-// If there is an error, it will be of type *PathError.
-func Remove(name string) error {
-	if e := syscall.Remove(name); e != nil {
-		return &PathError{"remove", name, e}
-	}
-	return nil
-}
-
-// HasPrefix from the strings package.
-func hasPrefix(s, prefix string) bool {
-	return len(s) >= len(prefix) && s[0:len(prefix)] == prefix
-}
-
-// LastIndexByte from the strings package.
-func lastIndex(s string, sep byte) int {
-	for i := len(s) - 1; i >= 0; i-- {
-		if s[i] == sep {
-			return i
-		}
-	}
-	return -1
-}
-
-func rename(oldname, newname string) error {
-	dirname := oldname[:lastIndex(oldname, '/')+1]
-	if hasPrefix(newname, dirname) {
-		newname = newname[len(dirname):]
-	} else {
-		return &LinkError{"rename", oldname, newname, ErrInvalid}
-	}
-
-	// If newname still contains slashes after removing the oldname
-	// prefix, the rename is cross-directory and must be rejected.
-	// This case is caught by d.Marshal below.
-
-	var d syscall.Dir
-
-	d.Null()
-	d.Name = newname
-
-	buf := make([]byte, syscall.STATFIXLEN+len(d.Name))
-	n, err := d.Marshal(buf[:])
-	if err != nil {
-		return &LinkError{"rename", oldname, newname, err}
-	}
-	if err = syscall.Wstat(oldname, buf[:n]); err != nil {
-		return &LinkError{"rename", oldname, newname, err}
-	}
-	return nil
-}
-
-// Chmod changes the mode of the named file to mode.
-// If the file is a symbolic link, it changes the mode of the link's target.
-// If there is an error, it will be of type *PathError.
-func Chmod(name string, mode FileMode) error {
-	var d syscall.Dir
-
-	odir, e := dirstat(name)
-	if e != nil {
-		return &PathError{"chmod", name, e}
-	}
-	d.Null()
-	d.Mode = odir.Mode&^chmodMask | syscallMode(mode)&chmodMask
-
-	var buf [syscall.STATFIXLEN]byte
-	n, err := d.Marshal(buf[:])
-	if err != nil {
-		return &PathError{"chmod", name, err}
-	}
-	if err = syscall.Wstat(name, buf[:n]); err != nil {
-		return &PathError{"chmod", name, err}
-	}
-	return nil
-}
-
-// Chtimes changes the access and modification times of the named
-// file, similar to the Unix utime() or utimes() functions.
-//
-// The underlying filesystem may truncate or round the values to a
-// less precise time unit.
-// If there is an error, it will be of type *PathError.
-func Chtimes(name string, atime time.Time, mtime time.Time) error {
-	var d syscall.Dir
-
-	d.Null()
-	d.Atime = uint32(atime.Unix())
-	d.Mtime = uint32(mtime.Unix())
-
-	var buf [syscall.STATFIXLEN]byte
-	n, err := d.Marshal(buf[:])
-	if err != nil {
-		return &PathError{"chtimes", name, err}
-	}
-	if err = syscall.Wstat(name, buf[:n]); err != nil {
-		return &PathError{"chtimes", name, err}
-	}
-	return nil
-}
-
-// Pipe returns a connected pair of Files; reads from r return bytes
-// written to w. It returns the files and an error, if any.
-func Pipe() (r *File, w *File, err error) {
-	var p [2]int
-
-	syscall.ForkLock.RLock()
-	if e := syscall.Pipe(p[0:]); e != nil {
-		syscall.ForkLock.RUnlock()
-		return nil, nil, NewSyscallError("pipe", e)
-	}
-	syscall.ForkLock.RUnlock()
-
-	return NewFile(uintptr(p[0]), "|0"), NewFile(uintptr(p[1]), "|1"), nil
-}
-
-// not supported on Plan 9
-
-// Link creates newname as a hard link to the oldname file.
-// If there is an error, it will be of type *LinkError.
-func Link(oldname, newname string) error {
-	return &LinkError{"link", oldname, newname, syscall.EPLAN9}
-}
-
-// Symlink creates newname as a symbolic link to oldname.
-// If there is an error, it will be of type *LinkError.
-func Symlink(oldname, newname string) error {
-	return &LinkError{"symlink", oldname, newname, syscall.EPLAN9}
-}
-
-// Readlink returns the destination of the named symbolic link.
-// If there is an error, it will be of type *PathError.
-func Readlink(name string) (string, error) {
-	return "", &PathError{"readlink", name, syscall.EPLAN9}
-}
-
-// Chown changes the numeric uid and gid of the named file.
-// If the file is a symbolic link, it changes the uid and gid of the link's target.
-// If there is an error, it will be of type *PathError.
-func Chown(name string, uid, gid int) error {
-	return &PathError{"chown", name, syscall.EPLAN9}
-}
-
-// Lchown changes the numeric uid and gid of the named file.
-// If the file is a symbolic link, it changes the uid and gid of the link itself.
-// If there is an error, it will be of type *PathError.
-func Lchown(name string, uid, gid int) error {
-	return &PathError{"lchown", name, syscall.EPLAN9}
-}
-
-// Chown changes the numeric uid and gid of the named file.
-// If there is an error, it will be of type *PathError.
-func (f *File) Chown(uid, gid int) error {
-	if f == nil {
-		return ErrInvalid
-	}
-	return &PathError{"chown", f.name, syscall.EPLAN9}
-}
-
-// TempDir returns the default directory to use for temporary files.
-func TempDir() string {
-	return "/tmp"
-}
diff --git a/third_party/gofrontend/libgo/go/os/file_posix.go b/third_party/gofrontend/libgo/go/os/file_posix.go
deleted file mode 100644
index 6d8076f..0000000
--- a/third_party/gofrontend/libgo/go/os/file_posix.go
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
-
-package os
-
-import (
-	"syscall"
-	"time"
-)
-
-func sigpipe() // implemented in package runtime
-
-// Readlink returns the destination of the named symbolic link.
-// If there is an error, it will be of type *PathError.
-func Readlink(name string) (string, error) {
-	for len := 128; ; len *= 2 {
-		b := make([]byte, len)
-		n, e := fixCount(syscall.Readlink(name, b))
-		if e != nil {
-			return "", &PathError{"readlink", name, e}
-		}
-		if n < len {
-			return string(b[0:n]), nil
-		}
-	}
-}
-
-// syscallMode returns the syscall-specific mode bits from Go's portable mode bits.
-func syscallMode(i FileMode) (o uint32) {
-	o |= uint32(i.Perm())
-	if i&ModeSetuid != 0 {
-		o |= syscall.S_ISUID
-	}
-	if i&ModeSetgid != 0 {
-		o |= syscall.S_ISGID
-	}
-	if i&ModeSticky != 0 {
-		o |= syscall.S_ISVTX
-	}
-	// No mapping for Go's ModeTemporary (plan9 only).
-	return
-}
-
-// Chmod changes the mode of the named file to mode.
-// If the file is a symbolic link, it changes the mode of the link's target.
-// If there is an error, it will be of type *PathError.
-func Chmod(name string, mode FileMode) error {
-	if e := syscall.Chmod(name, syscallMode(mode)); e != nil {
-		return &PathError{"chmod", name, e}
-	}
-	return nil
-}
-
-// Chmod changes the mode of the file to mode.
-// If there is an error, it will be of type *PathError.
-func (f *File) Chmod(mode FileMode) error {
-	if f == nil {
-		return ErrInvalid
-	}
-	if e := syscall.Fchmod(f.fd, syscallMode(mode)); e != nil {
-		return &PathError{"chmod", f.name, e}
-	}
-	return nil
-}
-
-// Chown changes the numeric uid and gid of the named file.
-// If the file is a symbolic link, it changes the uid and gid of the link's target.
-// If there is an error, it will be of type *PathError.
-func Chown(name string, uid, gid int) error {
-	if e := syscall.Chown(name, uid, gid); e != nil {
-		return &PathError{"chown", name, e}
-	}
-	return nil
-}
-
-// Lchown changes the numeric uid and gid of the named file.
-// If the file is a symbolic link, it changes the uid and gid of the link itself.
-// If there is an error, it will be of type *PathError.
-func Lchown(name string, uid, gid int) error {
-	if e := syscall.Lchown(name, uid, gid); e != nil {
-		return &PathError{"lchown", name, e}
-	}
-	return nil
-}
-
-// Chown changes the numeric uid and gid of the named file.
-// If there is an error, it will be of type *PathError.
-func (f *File) Chown(uid, gid int) error {
-	if f == nil {
-		return ErrInvalid
-	}
-	if e := syscall.Fchown(f.fd, uid, gid); e != nil {
-		return &PathError{"chown", f.name, e}
-	}
-	return nil
-}
-
-// Truncate changes the size of the file.
-// It does not change the I/O offset.
-// If there is an error, it will be of type *PathError.
-func (f *File) Truncate(size int64) error {
-	if f == nil {
-		return ErrInvalid
-	}
-	if e := syscall.Ftruncate(f.fd, size); e != nil {
-		return &PathError{"truncate", f.name, e}
-	}
-	return nil
-}
-
-// Sync commits the current contents of the file to stable storage.
-// Typically, this means flushing the file system's in-memory copy
-// of recently written data to disk.
-func (f *File) Sync() error {
-	if f == nil {
-		return ErrInvalid
-	}
-	if e := syscall.Fsync(f.fd); e != nil {
-		return NewSyscallError("fsync", e)
-	}
-	return nil
-}
-
-// Chtimes changes the access and modification times of the named
-// file, similar to the Unix utime() or utimes() functions.
-//
-// The underlying filesystem may truncate or round the values to a
-// less precise time unit.
-// If there is an error, it will be of type *PathError.
-func Chtimes(name string, atime time.Time, mtime time.Time) error {
-	var utimes [2]syscall.Timespec
-	utimes[0] = syscall.NsecToTimespec(atime.UnixNano())
-	utimes[1] = syscall.NsecToTimespec(mtime.UnixNano())
-	if e := syscall.UtimesNano(name, utimes[0:]); e != nil {
-		return &PathError{"chtimes", name, e}
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/os/file_unix.go b/third_party/gofrontend/libgo/go/os/file_unix.go
deleted file mode 100644
index 7a18987..0000000
--- a/third_party/gofrontend/libgo/go/os/file_unix.go
+++ /dev/null
@@ -1,370 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package os
-
-import (
-	"runtime"
-	"sync/atomic"
-	"syscall"
-)
-
-func rename(oldname, newname string) error {
-	e := syscall.Rename(oldname, newname)
-	if e != nil {
-		return &LinkError{"rename", oldname, newname, e}
-	}
-	return nil
-}
-
-// File represents an open file descriptor.
-type File struct {
-	*file
-}
-
-// file is the real representation of *File.
-// The extra level of indirection ensures that no clients of os
-// can overwrite this data, which could cause the finalizer
-// to close the wrong file descriptor.
-type file struct {
-	fd      int
-	name    string
-	dirinfo *dirInfo // nil unless directory being read
-	nepipe  int32    // number of consecutive EPIPE in Write
-}
-
-// Fd returns the integer Unix file descriptor referencing the open file.
-// The file descriptor is valid only until f.Close is called or f is garbage collected.
-func (f *File) Fd() uintptr {
-	if f == nil {
-		return ^(uintptr(0))
-	}
-	return uintptr(f.fd)
-}
-
-// NewFile returns a new File with the given file descriptor and name.
-func NewFile(fd uintptr, name string) *File {
-	fdi := int(fd)
-	if fdi < 0 {
-		return nil
-	}
-	f := &File{&file{fd: fdi, name: name}}
-	runtime.SetFinalizer(f.file, (*file).close)
-	return f
-}
-
-// Auxiliary information if the File describes a directory
-type dirInfo struct {
-	buf []byte       // buffer for directory I/O
-	dir *syscall.DIR // from opendir
-}
-
-func epipecheck(file *File, e error) {
-	if e == syscall.EPIPE {
-		if atomic.AddInt32(&file.nepipe, 1) >= 10 {
-			sigpipe()
-		}
-	} else {
-		atomic.StoreInt32(&file.nepipe, 0)
-	}
-}
-
-// DevNull is the name of the operating system's ``null device.''
-// On Unix-like systems, it is "/dev/null"; on Windows, "NUL".
-const DevNull = "/dev/null"
-
-// OpenFile is the generalized open call; most users will use Open
-// or Create instead.  It opens the named file with specified flag
-// (O_RDONLY etc.) and perm, (0666 etc.) if applicable.  If successful,
-// methods on the returned File can be used for I/O.
-// If there is an error, it will be of type *PathError.
-func OpenFile(name string, flag int, perm FileMode) (*File, error) {
-	chmod := false
-	if !supportsCreateWithStickyBit && flag&O_CREATE != 0 && perm&ModeSticky != 0 {
-		if _, err := Stat(name); IsNotExist(err) {
-			chmod = true
-		}
-	}
-
-	r, e := syscall.Open(name, flag|syscall.O_CLOEXEC, syscallMode(perm))
-	if e != nil {
-		return nil, &PathError{"open", name, e}
-	}
-
-	// open(2) itself won't handle the sticky bit on *BSD and Solaris
-	if chmod {
-		Chmod(name, perm)
-	}
-
-	// There's a race here with fork/exec, which we are
-	// content to live with.  See ../syscall/exec_unix.go.
-	if !supportsCloseOnExec {
-		syscall.CloseOnExec(r)
-	}
-
-	return NewFile(uintptr(r), name), nil
-}
-
-// Close closes the File, rendering it unusable for I/O.
-// It returns an error, if any.
-func (f *File) Close() error {
-	if f == nil {
-		return ErrInvalid
-	}
-	return f.file.close()
-}
-
-func (file *file) close() error {
-	if file == nil || file.fd < 0 {
-		return syscall.EINVAL
-	}
-	var err error
-	if e := syscall.Close(file.fd); e != nil {
-		err = &PathError{"close", file.name, e}
-	}
-
-	if file.dirinfo != nil {
-		syscall.Entersyscall()
-		i := libc_closedir(file.dirinfo.dir)
-		errno := syscall.GetErrno()
-		syscall.Exitsyscall()
-		file.dirinfo = nil
-		if i < 0 && err == nil {
-			err = &PathError{"closedir", file.name, errno}
-		}
-	}
-
-	file.fd = -1 // so it can't be closed again
-
-	// no need for a finalizer anymore
-	runtime.SetFinalizer(file, nil)
-	return err
-}
-
-// Stat returns the FileInfo structure describing file.
-// If there is an error, it will be of type *PathError.
-func (f *File) Stat() (FileInfo, error) {
-	if f == nil {
-		return nil, ErrInvalid
-	}
-	var stat syscall.Stat_t
-	err := syscall.Fstat(f.fd, &stat)
-	if err != nil {
-		return nil, &PathError{"stat", f.name, err}
-	}
-	return fileInfoFromStat(&stat, f.name), nil
-}
-
-// Stat returns a FileInfo describing the named file.
-// If there is an error, it will be of type *PathError.
-func Stat(name string) (FileInfo, error) {
-	var stat syscall.Stat_t
-	err := syscall.Stat(name, &stat)
-	if err != nil {
-		return nil, &PathError{"stat", name, err}
-	}
-	return fileInfoFromStat(&stat, name), nil
-}
-
-// Lstat returns a FileInfo describing the named file.
-// If the file is a symbolic link, the returned FileInfo
-// describes the symbolic link.  Lstat makes no attempt to follow the link.
-// If there is an error, it will be of type *PathError.
-func Lstat(name string) (FileInfo, error) {
-	var stat syscall.Stat_t
-	err := syscall.Lstat(name, &stat)
-	if err != nil {
-		return nil, &PathError{"lstat", name, err}
-	}
-	return fileInfoFromStat(&stat, name), nil
-}
-
-func (f *File) readdir(n int) (fi []FileInfo, err error) {
-	dirname := f.name
-	if dirname == "" {
-		dirname = "."
-	}
-	names, err := f.Readdirnames(n)
-	fi = make([]FileInfo, 0, len(names))
-	for _, filename := range names {
-		fip, lerr := lstat(dirname + "/" + filename)
-		if IsNotExist(lerr) {
-			// File disappeared between readdir + stat.
-			// Just treat it as if it didn't exist.
-			continue
-		}
-		if lerr != nil {
-			return fi, lerr
-		}
-		fi = append(fi, fip)
-	}
-	return fi, err
-}
-
-// Darwin and FreeBSD can't read or write 2GB+ at a time,
-// even on 64-bit systems. See golang.org/issue/7812.
-// Use 1GB instead of, say, 2GB-1, to keep subsequent
-// reads aligned.
-const (
-	needsMaxRW = runtime.GOOS == "darwin" || runtime.GOOS == "freebsd"
-	maxRW      = 1 << 30
-)
-
-// read reads up to len(b) bytes from the File.
-// It returns the number of bytes read and an error, if any.
-func (f *File) read(b []byte) (n int, err error) {
-	if needsMaxRW && len(b) > maxRW {
-		b = b[:maxRW]
-	}
-	return fixCount(syscall.Read(f.fd, b))
-}
-
-// pread reads len(b) bytes from the File starting at byte offset off.
-// It returns the number of bytes read and the error, if any.
-// EOF is signaled by a zero count with err set to nil.
-func (f *File) pread(b []byte, off int64) (n int, err error) {
-	if needsMaxRW && len(b) > maxRW {
-		b = b[:maxRW]
-	}
-	return fixCount(syscall.Pread(f.fd, b, off))
-}
-
-// write writes len(b) bytes to the File.
-// It returns the number of bytes written and an error, if any.
-func (f *File) write(b []byte) (n int, err error) {
-	for {
-		bcap := b
-		if needsMaxRW && len(bcap) > maxRW {
-			bcap = bcap[:maxRW]
-		}
-		m, err := fixCount(syscall.Write(f.fd, bcap))
-		n += m
-
-		// If the syscall wrote some data but not all (short write)
-		// or it returned EINTR, then assume it stopped early for
-		// reasons that are uninteresting to the caller, and try again.
-		if 0 < m && m < len(bcap) || err == syscall.EINTR {
-			b = b[m:]
-			continue
-		}
-
-		if needsMaxRW && len(bcap) != len(b) && err == nil {
-			b = b[m:]
-			continue
-		}
-
-		return n, err
-	}
-}
-
-// pwrite writes len(b) bytes to the File starting at byte offset off.
-// It returns the number of bytes written and an error, if any.
-func (f *File) pwrite(b []byte, off int64) (n int, err error) {
-	if needsMaxRW && len(b) > maxRW {
-		b = b[:maxRW]
-	}
-	return fixCount(syscall.Pwrite(f.fd, b, off))
-}
-
-// seek sets the offset for the next Read or Write on file to offset, interpreted
-// according to whence: 0 means relative to the origin of the file, 1 means
-// relative to the current offset, and 2 means relative to the end.
-// It returns the new offset and an error, if any.
-func (f *File) seek(offset int64, whence int) (ret int64, err error) {
-	return syscall.Seek(f.fd, offset, whence)
-}
-
-// Truncate changes the size of the named file.
-// If the file is a symbolic link, it changes the size of the link's target.
-// If there is an error, it will be of type *PathError.
-func Truncate(name string, size int64) error {
-	if e := syscall.Truncate(name, size); e != nil {
-		return &PathError{"truncate", name, e}
-	}
-	return nil
-}
-
-// Remove removes the named file or directory.
-// If there is an error, it will be of type *PathError.
-func Remove(name string) error {
-	// System call interface forces us to know
-	// whether name is a file or directory.
-	// Try both: it is cheaper on average than
-	// doing a Stat plus the right one.
-	e := syscall.Unlink(name)
-	if e == nil {
-		return nil
-	}
-	e1 := syscall.Rmdir(name)
-	if e1 == nil {
-		return nil
-	}
-
-	// Both failed: figure out which error to return.
-	// OS X and Linux differ on whether unlink(dir)
-	// returns EISDIR, so can't use that.  However,
-	// both agree that rmdir(file) returns ENOTDIR,
-	// so we can use that to decide which error is real.
-	// Rmdir might also return ENOTDIR if given a bad
-	// file path, like /etc/passwd/foo, but in that case,
-	// both errors will be ENOTDIR, so it's okay to
-	// use the error from unlink.
-	if e1 != syscall.ENOTDIR {
-		e = e1
-	}
-	return &PathError{"remove", name, e}
-}
-
-// basename removes trailing slashes and the leading directory name from path name
-func basename(name string) string {
-	i := len(name) - 1
-	// Remove trailing slashes
-	for ; i > 0 && name[i] == '/'; i-- {
-		name = name[:i]
-	}
-	// Remove leading directory name
-	for i--; i >= 0; i-- {
-		if name[i] == '/' {
-			name = name[i+1:]
-			break
-		}
-	}
-
-	return name
-}
-
-// TempDir returns the default directory to use for temporary files.
-func TempDir() string {
-	dir := Getenv("TMPDIR")
-	if dir == "" {
-		if runtime.GOOS == "android" {
-			dir = "/data/local/tmp"
-		} else {
-			dir = "/tmp"
-		}
-	}
-	return dir
-}
-
-// Link creates newname as a hard link to the oldname file.
-// If there is an error, it will be of type *LinkError.
-func Link(oldname, newname string) error {
-	e := syscall.Link(oldname, newname)
-	if e != nil {
-		return &LinkError{"link", oldname, newname, e}
-	}
-	return nil
-}
-
-// Symlink creates newname as a symbolic link to oldname.
-// If there is an error, it will be of type *LinkError.
-func Symlink(oldname, newname string) error {
-	e := syscall.Symlink(oldname, newname)
-	if e != nil {
-		return &LinkError{"symlink", oldname, newname, e}
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/os/getwd.go b/third_party/gofrontend/libgo/go/os/getwd.go
deleted file mode 100644
index d5da53b..0000000
--- a/third_party/gofrontend/libgo/go/os/getwd.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"runtime"
-	"sync"
-	"syscall"
-)
-
-var getwdCache struct {
-	sync.Mutex
-	dir string
-}
-
-// useSyscallwd determines whether to use the return value of
-// syscall.Getwd based on its error.
-var useSyscallwd = func(error) bool { return true }
-
-// Getwd returns a rooted path name corresponding to the
-// current directory.  If the current directory can be
-// reached via multiple paths (due to symbolic links),
-// Getwd may return any one of them.
-func Getwd() (dir string, err error) {
-	if runtime.GOOS == "windows" {
-		return syscall.Getwd()
-	}
-
-	// Clumsy but widespread kludge:
-	// if $PWD is set and matches ".", use it.
-	dot, err := Stat(".")
-	if err != nil {
-		return "", err
-	}
-	dir = Getenv("PWD")
-	if len(dir) > 0 && dir[0] == '/' {
-		d, err := Stat(dir)
-		if err == nil && SameFile(dot, d) {
-			return dir, nil
-		}
-	}
-
-	// If the operating system provides a Getwd call, use it.
-	// Otherwise, we're trying to find our way back to ".".
-	if syscall.ImplementsGetwd {
-		s, e := syscall.Getwd()
-		if useSyscallwd(e) {
-			return s, NewSyscallError("getwd", e)
-		}
-	}
-
-	// Apply same kludge but to cached dir instead of $PWD.
-	getwdCache.Lock()
-	dir = getwdCache.dir
-	getwdCache.Unlock()
-	if len(dir) > 0 {
-		d, err := Stat(dir)
-		if err == nil && SameFile(dot, d) {
-			return dir, nil
-		}
-	}
-
-	// Root is a special case because it has no parent
-	// and ends in a slash.
-	root, err := Stat("/")
-	if err != nil {
-		// Can't stat root - no hope.
-		return "", err
-	}
-	if SameFile(root, dot) {
-		return "/", nil
-	}
-
-	// General algorithm: find name in parent
-	// and then find name of parent.  Each iteration
-	// adds /name to the beginning of dir.
-	dir = ""
-	for parent := ".."; ; parent = "../" + parent {
-		if len(parent) >= 1024 { // Sanity check
-			return "", syscall.ENAMETOOLONG
-		}
-		fd, err := Open(parent)
-		if err != nil {
-			return "", err
-		}
-
-		for {
-			names, err := fd.Readdirnames(100)
-			if err != nil {
-				fd.Close()
-				return "", err
-			}
-			for _, name := range names {
-				d, _ := Lstat(parent + "/" + name)
-				if SameFile(d, dot) {
-					dir = "/" + name + dir
-					goto Found
-				}
-			}
-		}
-
-	Found:
-		pd, err := fd.Stat()
-		if err != nil {
-			return "", err
-		}
-		fd.Close()
-		if SameFile(pd, root) {
-			break
-		}
-		// Set up for next round.
-		dot = pd
-	}
-
-	// Save answer as hint to avoid the expensive path next time.
-	getwdCache.Lock()
-	getwdCache.dir = dir
-	getwdCache.Unlock()
-
-	return dir, nil
-}
diff --git a/third_party/gofrontend/libgo/go/os/getwd_darwin.go b/third_party/gofrontend/libgo/go/os/getwd_darwin.go
deleted file mode 100644
index e51ffcd..0000000
--- a/third_party/gofrontend/libgo/go/os/getwd_darwin.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import "syscall"
-
-func init() {
-	useSyscallwd = useSyscallwdDarwin
-}
-
-func useSyscallwdDarwin(err error) bool {
-	return err != syscall.ENOTSUP
-}
diff --git a/third_party/gofrontend/libgo/go/os/os_test.go b/third_party/gofrontend/libgo/go/os/os_test.go
deleted file mode 100644
index 78201f2..0000000
--- a/third_party/gofrontend/libgo/go/os/os_test.go
+++ /dev/null
@@ -1,1709 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os_test
-
-import (
-	"bytes"
-	"errors"
-	"flag"
-	"fmt"
-	"internal/testenv"
-	"io"
-	"io/ioutil"
-	. "os"
-	osexec "os/exec"
-	"path/filepath"
-	"reflect"
-	"runtime"
-	"sort"
-	"strings"
-	"sync"
-	"syscall"
-	"testing"
-	"time"
-)
-
-var supportsSymlinks = true
-
-var dot = []string{
-	"dir_unix.go",
-	"env.go",
-	"error.go",
-	"file.go",
-	"os_test.go",
-	"types.go",
-}
-
-type sysDir struct {
-	name  string
-	files []string
-}
-
-var sysdir = func() *sysDir {
-	switch runtime.GOOS {
-	case "android":
-		return &sysDir{
-			"/system/etc",
-			[]string{
-				"audio_policy.conf",
-				"system_fonts.xml",
-			},
-		}
-	case "darwin":
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			wd, err := syscall.Getwd()
-			if err != nil {
-				wd = err.Error()
-			}
-			return &sysDir{
-				filepath.Join(wd, "..", ".."),
-				[]string{
-					"ResourceRules.plist",
-					"Info.plist",
-				},
-			}
-		}
-	case "windows":
-		return &sysDir{
-			Getenv("SystemRoot") + "\\system32\\drivers\\etc",
-			[]string{
-				"networks",
-				"protocol",
-				"services",
-			},
-		}
-	case "plan9":
-		return &sysDir{
-			"/lib/ndb",
-			[]string{
-				"common",
-				"local",
-			},
-		}
-	}
-	return &sysDir{
-		"/etc",
-		[]string{
-			"group",
-			"hosts",
-			"passwd",
-		},
-	}
-}()
-
-func size(name string, t *testing.T) int64 {
-	file, err := Open(name)
-	if err != nil {
-		t.Fatal("open failed:", err)
-	}
-	defer file.Close()
-	var buf [100]byte
-	len := 0
-	for {
-		n, e := file.Read(buf[0:])
-		len += n
-		if e == io.EOF {
-			break
-		}
-		if e != nil {
-			t.Fatal("read failed:", err)
-		}
-	}
-	return int64(len)
-}
-
-func equal(name1, name2 string) (r bool) {
-	switch runtime.GOOS {
-	case "windows":
-		r = strings.ToLower(name1) == strings.ToLower(name2)
-	default:
-		r = name1 == name2
-	}
-	return
-}
-
-// localTmp returns a local temporary directory not on NFS.
-func localTmp() string {
-	switch runtime.GOOS {
-	case "android", "windows":
-		return TempDir()
-	case "darwin":
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			return TempDir()
-		}
-	}
-	return "/tmp"
-}
-
-func newFile(testName string, t *testing.T) (f *File) {
-	f, err := ioutil.TempFile(localTmp(), "_Go_"+testName)
-	if err != nil {
-		t.Fatalf("TempFile %s: %s", testName, err)
-	}
-	return
-}
-
-func newDir(testName string, t *testing.T) (name string) {
-	name, err := ioutil.TempDir(localTmp(), "_Go_"+testName)
-	if err != nil {
-		t.Fatalf("TempDir %s: %s", testName, err)
-	}
-	return
-}
-
-var sfdir = sysdir.name
-var sfname = sysdir.files[0]
-
-func TestStat(t *testing.T) {
-	path := sfdir + "/" + sfname
-	dir, err := Stat(path)
-	if err != nil {
-		t.Fatal("stat failed:", err)
-	}
-	if !equal(sfname, dir.Name()) {
-		t.Error("name should be ", sfname, "; is", dir.Name())
-	}
-	filesize := size(path, t)
-	if dir.Size() != filesize {
-		t.Error("size should be", filesize, "; is", dir.Size())
-	}
-}
-
-func TestFstat(t *testing.T) {
-	path := sfdir + "/" + sfname
-	file, err1 := Open(path)
-	if err1 != nil {
-		t.Fatal("open failed:", err1)
-	}
-	defer file.Close()
-	dir, err2 := file.Stat()
-	if err2 != nil {
-		t.Fatal("fstat failed:", err2)
-	}
-	if !equal(sfname, dir.Name()) {
-		t.Error("name should be ", sfname, "; is", dir.Name())
-	}
-	filesize := size(path, t)
-	if dir.Size() != filesize {
-		t.Error("size should be", filesize, "; is", dir.Size())
-	}
-}
-
-func TestLstat(t *testing.T) {
-	path := sfdir + "/" + sfname
-	dir, err := Lstat(path)
-	if err != nil {
-		t.Fatal("lstat failed:", err)
-	}
-	if !equal(sfname, dir.Name()) {
-		t.Error("name should be ", sfname, "; is", dir.Name())
-	}
-	filesize := size(path, t)
-	if dir.Size() != filesize {
-		t.Error("size should be", filesize, "; is", dir.Size())
-	}
-}
-
-// Read with length 0 should not return EOF.
-func TestRead0(t *testing.T) {
-	path := sfdir + "/" + sfname
-	f, err := Open(path)
-	if err != nil {
-		t.Fatal("open failed:", err)
-	}
-	defer f.Close()
-
-	b := make([]byte, 0)
-	n, err := f.Read(b)
-	if n != 0 || err != nil {
-		t.Errorf("Read(0) = %d, %v, want 0, nil", n, err)
-	}
-	b = make([]byte, 100)
-	n, err = f.Read(b)
-	if n <= 0 || err != nil {
-		t.Errorf("Read(100) = %d, %v, want >0, nil", n, err)
-	}
-}
-
-func testReaddirnames(dir string, contents []string, t *testing.T) {
-	file, err := Open(dir)
-	if err != nil {
-		t.Fatalf("open %q failed: %v", dir, err)
-	}
-	defer file.Close()
-	s, err2 := file.Readdirnames(-1)
-	if err2 != nil {
-		t.Fatalf("readdirnames %q failed: %v", dir, err2)
-	}
-	for _, m := range contents {
-		found := false
-		for _, n := range s {
-			if n == "." || n == ".." {
-				t.Errorf("got %s in directory", n)
-			}
-			if equal(m, n) {
-				if found {
-					t.Error("present twice:", m)
-				}
-				found = true
-			}
-		}
-		if !found {
-			t.Error("could not find", m)
-		}
-	}
-}
-
-func testReaddir(dir string, contents []string, t *testing.T) {
-	file, err := Open(dir)
-	if err != nil {
-		t.Fatalf("open %q failed: %v", dir, err)
-	}
-	defer file.Close()
-	s, err2 := file.Readdir(-1)
-	if err2 != nil {
-		t.Fatalf("readdir %q failed: %v", dir, err2)
-	}
-	for _, m := range contents {
-		found := false
-		for _, n := range s {
-			if equal(m, n.Name()) {
-				if found {
-					t.Error("present twice:", m)
-				}
-				found = true
-			}
-		}
-		if !found {
-			t.Error("could not find", m)
-		}
-	}
-}
-
-func TestReaddirnames(t *testing.T) {
-	testReaddirnames(".", dot, t)
-	testReaddirnames(sysdir.name, sysdir.files, t)
-}
-
-func TestReaddir(t *testing.T) {
-	testReaddir(".", dot, t)
-	testReaddir(sysdir.name, sysdir.files, t)
-}
-
-// Read the directory one entry at a time.
-func smallReaddirnames(file *File, length int, t *testing.T) []string {
-	names := make([]string, length)
-	count := 0
-	for {
-		d, err := file.Readdirnames(1)
-		if err == io.EOF {
-			break
-		}
-		if err != nil {
-			t.Fatalf("readdirnames %q failed: %v", file.Name(), err)
-		}
-		if len(d) == 0 {
-			t.Fatalf("readdirnames %q returned empty slice and no error", file.Name())
-		}
-		names[count] = d[0]
-		count++
-	}
-	return names[0:count]
-}
-
-// Check that reading a directory one entry at a time gives the same result
-// as reading it all at once.
-func TestReaddirnamesOneAtATime(t *testing.T) {
-	// big directory that doesn't change often.
-	dir := "/usr/bin"
-	switch runtime.GOOS {
-	case "android":
-		dir = "/system/bin"
-	case "darwin":
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			wd, err := Getwd()
-			if err != nil {
-				t.Fatal(err)
-			}
-			dir = wd
-		}
-	case "plan9":
-		dir = "/bin"
-	case "windows":
-		dir = Getenv("SystemRoot") + "\\system32"
-	}
-	file, err := Open(dir)
-	if err != nil {
-		t.Fatalf("open %q failed: %v", dir, err)
-	}
-	defer file.Close()
-	all, err1 := file.Readdirnames(-1)
-	if err1 != nil {
-		t.Fatalf("readdirnames %q failed: %v", dir, err1)
-	}
-	file1, err2 := Open(dir)
-	if err2 != nil {
-		t.Fatalf("open %q failed: %v", dir, err2)
-	}
-	defer file1.Close()
-	small := smallReaddirnames(file1, len(all)+100, t) // +100 in case we screw up
-	if len(small) < len(all) {
-		t.Fatalf("len(small) is %d, less than %d", len(small), len(all))
-	}
-	for i, n := range all {
-		if small[i] != n {
-			t.Errorf("small read %q mismatch: %v", small[i], n)
-		}
-	}
-}
-
-func TestReaddirNValues(t *testing.T) {
-	if testing.Short() {
-		t.Skip("test.short; skipping")
-	}
-	dir, err := ioutil.TempDir("", "")
-	if err != nil {
-		t.Fatalf("TempDir: %v", err)
-	}
-	defer RemoveAll(dir)
-	for i := 1; i <= 105; i++ {
-		f, err := Create(filepath.Join(dir, fmt.Sprintf("%d", i)))
-		if err != nil {
-			t.Fatalf("Create: %v", err)
-		}
-		f.Write([]byte(strings.Repeat("X", i)))
-		f.Close()
-	}
-
-	var d *File
-	openDir := func() {
-		var err error
-		d, err = Open(dir)
-		if err != nil {
-			t.Fatalf("Open directory: %v", err)
-		}
-	}
-
-	readDirExpect := func(n, want int, wantErr error) {
-		fi, err := d.Readdir(n)
-		if err != wantErr {
-			t.Fatalf("Readdir of %d got error %v, want %v", n, err, wantErr)
-		}
-		if g, e := len(fi), want; g != e {
-			t.Errorf("Readdir of %d got %d files, want %d", n, g, e)
-		}
-	}
-
-	readDirNamesExpect := func(n, want int, wantErr error) {
-		fi, err := d.Readdirnames(n)
-		if err != wantErr {
-			t.Fatalf("Readdirnames of %d got error %v, want %v", n, err, wantErr)
-		}
-		if g, e := len(fi), want; g != e {
-			t.Errorf("Readdirnames of %d got %d files, want %d", n, g, e)
-		}
-	}
-
-	for _, fn := range []func(int, int, error){readDirExpect, readDirNamesExpect} {
-		// Test the slurp case
-		openDir()
-		fn(0, 105, nil)
-		fn(0, 0, nil)
-		d.Close()
-
-		// Slurp with -1 instead
-		openDir()
-		fn(-1, 105, nil)
-		fn(-2, 0, nil)
-		fn(0, 0, nil)
-		d.Close()
-
-		// Test the bounded case
-		openDir()
-		fn(1, 1, nil)
-		fn(2, 2, nil)
-		fn(105, 102, nil) // and tests buffer >100 case
-		fn(3, 0, io.EOF)
-		d.Close()
-	}
-}
-
-func touch(t *testing.T, name string) {
-	f, err := Create(name)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err := f.Close(); err != nil {
-		t.Fatal(err)
-	}
-}
-
-func TestReaddirStatFailures(t *testing.T) {
-	switch runtime.GOOS {
-	case "windows", "plan9":
-		// Windows and Plan 9 already do this correctly,
-		// but are structured with different syscalls such
-		// that they don't use Lstat, so the hook below for
-		// testing it wouldn't work.
-		t.Skipf("skipping test on %v", runtime.GOOS)
-	}
-	dir, err := ioutil.TempDir("", "")
-	if err != nil {
-		t.Fatalf("TempDir: %v", err)
-	}
-	defer RemoveAll(dir)
-	touch(t, filepath.Join(dir, "good1"))
-	touch(t, filepath.Join(dir, "x")) // will disappear or have an error
-	touch(t, filepath.Join(dir, "good2"))
-	defer func() {
-		*LstatP = Lstat
-	}()
-	var xerr error // error to return for x
-	*LstatP = func(path string) (FileInfo, error) {
-		if xerr != nil && strings.HasSuffix(path, "x") {
-			return nil, xerr
-		}
-		return Lstat(path)
-	}
-	readDir := func() ([]FileInfo, error) {
-		d, err := Open(dir)
-		if err != nil {
-			t.Fatal(err)
-		}
-		defer d.Close()
-		return d.Readdir(-1)
-	}
-	mustReadDir := func(testName string) []FileInfo {
-		fis, err := readDir()
-		if err != nil {
-			t.Fatalf("%s: Readdir: %v", testName, err)
-		}
-		return fis
-	}
-	names := func(fis []FileInfo) []string {
-		s := make([]string, len(fis))
-		for i, fi := range fis {
-			s[i] = fi.Name()
-		}
-		sort.Strings(s)
-		return s
-	}
-
-	if got, want := names(mustReadDir("inital readdir")),
-		[]string{"good1", "good2", "x"}; !reflect.DeepEqual(got, want) {
-		t.Errorf("initial readdir got %q; want %q", got, want)
-	}
-
-	xerr = ErrNotExist
-	if got, want := names(mustReadDir("with x disappearing")),
-		[]string{"good1", "good2"}; !reflect.DeepEqual(got, want) {
-		t.Errorf("with x disappearing, got %q; want %q", got, want)
-	}
-
-	xerr = errors.New("some real error")
-	if _, err := readDir(); err != xerr {
-		t.Errorf("with a non-ErrNotExist error, got error %v; want %v", err, xerr)
-	}
-}
-
-// Readdir on a regular file should fail.
-func TestReaddirOfFile(t *testing.T) {
-	f, err := ioutil.TempFile("", "_Go_ReaddirOfFile")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer Remove(f.Name())
-	f.Write([]byte("foo"))
-	f.Close()
-	reg, err := Open(f.Name())
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer reg.Close()
-
-	names, err := reg.Readdirnames(-1)
-	if err == nil {
-		t.Error("Readdirnames succeeded; want non-nil error")
-	}
-	if len(names) > 0 {
-		t.Errorf("unexpected dir names in regular file: %q", names)
-	}
-}
-
-func TestHardLink(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9, hardlinks not supported")
-	}
-	defer chtmpdir(t)()
-	from, to := "hardlinktestfrom", "hardlinktestto"
-	Remove(from) // Just in case.
-	file, err := Create(to)
-	if err != nil {
-		t.Fatalf("open %q failed: %v", to, err)
-	}
-	defer Remove(to)
-	if err = file.Close(); err != nil {
-		t.Errorf("close %q failed: %v", to, err)
-	}
-	err = Link(to, from)
-	if err != nil {
-		t.Fatalf("link %q, %q failed: %v", to, from, err)
-	}
-
-	none := "hardlinktestnone"
-	err = Link(none, none)
-	// Check the returned error is well-formed.
-	if lerr, ok := err.(*LinkError); !ok || lerr.Error() == "" {
-		t.Errorf("link %q, %q failed to return a valid error", none, none)
-	}
-
-	defer Remove(from)
-	tostat, err := Stat(to)
-	if err != nil {
-		t.Fatalf("stat %q failed: %v", to, err)
-	}
-	fromstat, err := Stat(from)
-	if err != nil {
-		t.Fatalf("stat %q failed: %v", from, err)
-	}
-	if !SameFile(tostat, fromstat) {
-		t.Errorf("link %q, %q did not create hard link", to, from)
-	}
-}
-
-// chtmpdir changes the working directory to a new temporary directory and
-// provides a cleanup function. Used when PWD is read-only.
-func chtmpdir(t *testing.T) func() {
-	if runtime.GOOS != "darwin" || (runtime.GOARCH != "arm" && runtime.GOARCH != "arm64") {
-		return func() {} // only needed on darwin/arm{,64}
-	}
-	oldwd, err := Getwd()
-	if err != nil {
-		t.Fatalf("chtmpdir: %v", err)
-	}
-	d, err := ioutil.TempDir("", "test")
-	if err != nil {
-		t.Fatalf("chtmpdir: %v", err)
-	}
-	if err := Chdir(d); err != nil {
-		t.Fatalf("chtmpdir: %v", err)
-	}
-	return func() {
-		if err := Chdir(oldwd); err != nil {
-			t.Fatalf("chtmpdir: %v", err)
-		}
-		RemoveAll(d)
-	}
-}
-
-func TestSymlink(t *testing.T) {
-	switch runtime.GOOS {
-	case "android", "nacl", "plan9":
-		t.Skipf("skipping on %s", runtime.GOOS)
-	case "windows":
-		if !supportsSymlinks {
-			t.Skipf("skipping on %s", runtime.GOOS)
-		}
-	}
-	defer chtmpdir(t)()
-	from, to := "symlinktestfrom", "symlinktestto"
-	Remove(from) // Just in case.
-	file, err := Create(to)
-	if err != nil {
-		t.Fatalf("open %q failed: %v", to, err)
-	}
-	defer Remove(to)
-	if err = file.Close(); err != nil {
-		t.Errorf("close %q failed: %v", to, err)
-	}
-	err = Symlink(to, from)
-	if err != nil {
-		t.Fatalf("symlink %q, %q failed: %v", to, from, err)
-	}
-	defer Remove(from)
-	tostat, err := Lstat(to)
-	if err != nil {
-		t.Fatalf("stat %q failed: %v", to, err)
-	}
-	if tostat.Mode()&ModeSymlink != 0 {
-		t.Fatalf("stat %q claims to have found a symlink", to)
-	}
-	fromstat, err := Stat(from)
-	if err != nil {
-		t.Fatalf("stat %q failed: %v", from, err)
-	}
-	if !SameFile(tostat, fromstat) {
-		t.Errorf("symlink %q, %q did not create symlink", to, from)
-	}
-	fromstat, err = Lstat(from)
-	if err != nil {
-		t.Fatalf("lstat %q failed: %v", from, err)
-	}
-	if fromstat.Mode()&ModeSymlink == 0 {
-		t.Fatalf("symlink %q, %q did not create symlink", to, from)
-	}
-	fromstat, err = Stat(from)
-	if err != nil {
-		t.Fatalf("stat %q failed: %v", from, err)
-	}
-	if fromstat.Mode()&ModeSymlink != 0 {
-		t.Fatalf("stat %q did not follow symlink", from)
-	}
-	s, err := Readlink(from)
-	if err != nil {
-		t.Fatalf("readlink %q failed: %v", from, err)
-	}
-	if s != to {
-		t.Fatalf("after symlink %q != %q", s, to)
-	}
-	file, err = Open(from)
-	if err != nil {
-		t.Fatalf("open %q failed: %v", from, err)
-	}
-	file.Close()
-}
-
-func TestLongSymlink(t *testing.T) {
-	switch runtime.GOOS {
-	case "plan9", "nacl":
-		t.Skipf("skipping on %s", runtime.GOOS)
-	case "windows":
-		if !supportsSymlinks {
-			t.Skipf("skipping on %s", runtime.GOOS)
-		}
-	}
-	defer chtmpdir(t)()
-	s := "0123456789abcdef"
-	// Long, but not too long: a common limit is 255.
-	s = s + s + s + s + s + s + s + s + s + s + s + s + s + s + s
-	from := "longsymlinktestfrom"
-	Remove(from) // Just in case.
-	err := Symlink(s, from)
-	if err != nil {
-		t.Fatalf("symlink %q, %q failed: %v", s, from, err)
-	}
-	defer Remove(from)
-	r, err := Readlink(from)
-	if err != nil {
-		t.Fatalf("readlink %q failed: %v", from, err)
-	}
-	if r != s {
-		t.Fatalf("after symlink %q != %q", r, s)
-	}
-}
-
-func TestRename(t *testing.T) {
-	defer chtmpdir(t)()
-	from, to := "renamefrom", "renameto"
-	// Ensure we are not testing the overwrite case here.
-	Remove(from)
-	Remove(to)
-
-	file, err := Create(from)
-	if err != nil {
-		t.Fatalf("open %q failed: %v", from, err)
-	}
-	if err = file.Close(); err != nil {
-		t.Errorf("close %q failed: %v", from, err)
-	}
-	err = Rename(from, to)
-	if err != nil {
-		t.Fatalf("rename %q, %q failed: %v", to, from, err)
-	}
-	defer Remove(to)
-	_, err = Stat(to)
-	if err != nil {
-		t.Errorf("stat %q failed: %v", to, err)
-	}
-}
-
-func TestRenameOverwriteDest(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skip("skipping on plan9")
-	}
-	defer chtmpdir(t)()
-	from, to := "renamefrom", "renameto"
-	// Just in case.
-	Remove(from)
-	Remove(to)
-
-	toData := []byte("to")
-	fromData := []byte("from")
-
-	err := ioutil.WriteFile(to, toData, 0777)
-	if err != nil {
-		t.Fatalf("write file %q failed: %v", to, err)
-	}
-
-	err = ioutil.WriteFile(from, fromData, 0777)
-	if err != nil {
-		t.Fatalf("write file %q failed: %v", from, err)
-	}
-	err = Rename(from, to)
-	if err != nil {
-		t.Fatalf("rename %q, %q failed: %v", to, from, err)
-	}
-	defer Remove(to)
-
-	_, err = Stat(from)
-	if err == nil {
-		t.Errorf("from file %q still exists", from)
-	}
-	if err != nil && !IsNotExist(err) {
-		t.Fatalf("stat from: %v", err)
-	}
-	toFi, err := Stat(to)
-	if err != nil {
-		t.Fatalf("stat %q failed: %v", to, err)
-	}
-	if toFi.Size() != int64(len(fromData)) {
-		t.Errorf(`"to" size = %d; want %d (old "from" size)`, toFi.Size(), len(fromData))
-	}
-}
-
-func TestRenameFailed(t *testing.T) {
-	defer chtmpdir(t)()
-	from, to := "renamefrom", "renameto"
-	// Ensure we are not testing the overwrite case here.
-	Remove(from)
-	Remove(to)
-
-	err := Rename(from, to)
-	switch err := err.(type) {
-	case *LinkError:
-		if err.Op != "rename" {
-			t.Errorf("rename %q, %q: err.Op: want %q, got %q", from, to, "rename", err.Op)
-		}
-		if err.Old != from {
-			t.Errorf("rename %q, %q: err.Old: want %q, got %q", from, to, from, err.Old)
-		}
-		if err.New != to {
-			t.Errorf("rename %q, %q: err.New: want %q, got %q", from, to, to, err.New)
-		}
-	case nil:
-		t.Errorf("rename %q, %q: expected error, got nil", from, to)
-
-		// cleanup whatever was placed in "renameto"
-		Remove(to)
-	default:
-		t.Errorf("rename %q, %q: expected %T, got %T %v", from, to, new(LinkError), err, err)
-	}
-}
-
-func exec(t *testing.T, dir, cmd string, args []string, expect string) {
-	r, w, err := Pipe()
-	if err != nil {
-		t.Fatalf("Pipe: %v", err)
-	}
-	defer r.Close()
-	attr := &ProcAttr{Dir: dir, Files: []*File{nil, w, Stderr}}
-	p, err := StartProcess(cmd, args, attr)
-	if err != nil {
-		t.Fatalf("StartProcess: %v", err)
-	}
-	w.Close()
-
-	var b bytes.Buffer
-	io.Copy(&b, r)
-	output := b.String()
-
-	fi1, _ := Stat(strings.TrimSpace(output))
-	fi2, _ := Stat(expect)
-	if !SameFile(fi1, fi2) {
-		t.Errorf("exec %q returned %q wanted %q",
-			strings.Join(append([]string{cmd}, args...), " "), output, expect)
-	}
-	p.Wait()
-}
-
-func TestStartProcess(t *testing.T) {
-	testenv.MustHaveExec(t)
-
-	var dir, cmd string
-	var args []string
-	switch runtime.GOOS {
-	case "android":
-		t.Skip("android doesn't have /bin/pwd")
-	case "windows":
-		cmd = Getenv("COMSPEC")
-		dir = Getenv("SystemRoot")
-		args = []string{"/c", "cd"}
-	default:
-		cmd = "/bin/pwd"
-		dir = "/"
-		args = []string{}
-	}
-	cmddir, cmdbase := filepath.Split(cmd)
-	args = append([]string{cmdbase}, args...)
-	// Test absolute executable path.
-	exec(t, dir, cmd, args, dir)
-	// Test relative executable path.
-	exec(t, cmddir, cmdbase, args, cmddir)
-}
-
-func checkMode(t *testing.T, path string, mode FileMode) {
-	dir, err := Stat(path)
-	if err != nil {
-		t.Fatalf("Stat %q (looking for mode %#o): %s", path, mode, err)
-	}
-	if dir.Mode()&0777 != mode {
-		t.Errorf("Stat %q: mode %#o want %#o", path, dir.Mode(), mode)
-	}
-}
-
-func TestChmod(t *testing.T) {
-	// Chmod is not supported under windows.
-	if runtime.GOOS == "windows" {
-		return
-	}
-	f := newFile("TestChmod", t)
-	defer Remove(f.Name())
-	defer f.Close()
-
-	if err := Chmod(f.Name(), 0456); err != nil {
-		t.Fatalf("chmod %s 0456: %s", f.Name(), err)
-	}
-	checkMode(t, f.Name(), 0456)
-
-	if err := f.Chmod(0123); err != nil {
-		t.Fatalf("chmod %s 0123: %s", f.Name(), err)
-	}
-	checkMode(t, f.Name(), 0123)
-}
-
-func checkSize(t *testing.T, f *File, size int64) {
-	dir, err := f.Stat()
-	if err != nil {
-		t.Fatalf("Stat %q (looking for size %d): %s", f.Name(), size, err)
-	}
-	if dir.Size() != size {
-		t.Errorf("Stat %q: size %d want %d", f.Name(), dir.Size(), size)
-	}
-}
-
-func TestFTruncate(t *testing.T) {
-	f := newFile("TestFTruncate", t)
-	defer Remove(f.Name())
-	defer f.Close()
-
-	checkSize(t, f, 0)
-	f.Write([]byte("hello, world\n"))
-	checkSize(t, f, 13)
-	f.Truncate(10)
-	checkSize(t, f, 10)
-	f.Truncate(1024)
-	checkSize(t, f, 1024)
-	f.Truncate(0)
-	checkSize(t, f, 0)
-	_, err := f.Write([]byte("surprise!"))
-	if err == nil {
-		checkSize(t, f, 13+9) // wrote at offset past where hello, world was.
-	}
-}
-
-func TestTruncate(t *testing.T) {
-	f := newFile("TestTruncate", t)
-	defer Remove(f.Name())
-	defer f.Close()
-
-	checkSize(t, f, 0)
-	f.Write([]byte("hello, world\n"))
-	checkSize(t, f, 13)
-	Truncate(f.Name(), 10)
-	checkSize(t, f, 10)
-	Truncate(f.Name(), 1024)
-	checkSize(t, f, 1024)
-	Truncate(f.Name(), 0)
-	checkSize(t, f, 0)
-	_, err := f.Write([]byte("surprise!"))
-	if err == nil {
-		checkSize(t, f, 13+9) // wrote at offset past where hello, world was.
-	}
-}
-
-// Use TempDir (via newFile) to make sure we're on a local file system,
-// so that timings are not distorted by latency and caching.
-// On NFS, timings can be off due to caching of meta-data on
-// NFS servers (Issue 848).
-func TestChtimes(t *testing.T) {
-	f := newFile("TestChtimes", t)
-	defer Remove(f.Name())
-
-	f.Write([]byte("hello, world\n"))
-	f.Close()
-
-	testChtimes(t, f.Name())
-}
-
-// Use TempDir (via newDir) to make sure we're on a local file system,
-// so that timings are not distorted by latency and caching.
-// On NFS, timings can be off due to caching of meta-data on
-// NFS servers (Issue 848).
-func TestChtimesDir(t *testing.T) {
-	name := newDir("TestChtimes", t)
-	defer RemoveAll(name)
-
-	testChtimes(t, name)
-}
-
-func testChtimes(t *testing.T, name string) {
-	st, err := Stat(name)
-	if err != nil {
-		t.Fatalf("Stat %s: %s", name, err)
-	}
-	preStat := st
-
-	// Move access and modification time back a second
-	at := Atime(preStat)
-	mt := preStat.ModTime()
-	err = Chtimes(name, at.Add(-time.Second), mt.Add(-time.Second))
-	if err != nil {
-		t.Fatalf("Chtimes %s: %s", name, err)
-	}
-
-	st, err = Stat(name)
-	if err != nil {
-		t.Fatalf("second Stat %s: %s", name, err)
-	}
-	postStat := st
-
-	/* Plan 9, NaCl:
-		Mtime is the time of the last change of content.  Similarly, atime is set whenever the
-	    contents are accessed; also, it is set whenever mtime is set.
-	*/
-	pat := Atime(postStat)
-	pmt := postStat.ModTime()
-	if !pat.Before(at) && runtime.GOOS != "plan9" && runtime.GOOS != "nacl" {
-		t.Errorf("AccessTime didn't go backwards; was=%d, after=%d", at, pat)
-	}
-
-	if !pmt.Before(mt) {
-		t.Errorf("ModTime didn't go backwards; was=%d, after=%d", mt, pmt)
-	}
-}
-
-func TestChdirAndGetwd(t *testing.T) {
-	// TODO(brainman): file.Chdir() is not implemented on windows.
-	if runtime.GOOS == "windows" {
-		return
-	}
-	fd, err := Open(".")
-	if err != nil {
-		t.Fatalf("Open .: %s", err)
-	}
-	// These are chosen carefully not to be symlinks on a Mac
-	// (unlike, say, /var, /etc), except /tmp, which we handle below.
-	dirs := []string{"/", "/usr/bin", "/tmp"}
-	// /usr/bin does not usually exist on Plan 9 or Android.
-	switch runtime.GOOS {
-	case "android":
-		dirs = []string{"/", "/system/bin"}
-	case "plan9":
-		dirs = []string{"/", "/usr"}
-	case "darwin":
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			d1, err := ioutil.TempDir("", "d1")
-			if err != nil {
-				t.Fatalf("TempDir: %v", err)
-			}
-			d2, err := ioutil.TempDir("", "d2")
-			if err != nil {
-				t.Fatalf("TempDir: %v", err)
-			}
-			dirs = []string{d1, d2}
-		}
-	}
-	oldwd := Getenv("PWD")
-	for mode := 0; mode < 2; mode++ {
-		for _, d := range dirs {
-			if mode == 0 {
-				err = Chdir(d)
-			} else {
-				fd1, err := Open(d)
-				if err != nil {
-					t.Errorf("Open %s: %s", d, err)
-					continue
-				}
-				err = fd1.Chdir()
-				fd1.Close()
-			}
-			if d == "/tmp" {
-				Setenv("PWD", "/tmp")
-			}
-			pwd, err1 := Getwd()
-			Setenv("PWD", oldwd)
-			err2 := fd.Chdir()
-			if err2 != nil {
-				// We changed the current directory and cannot go back.
-				// Don't let the tests continue; they'll scribble
-				// all over some other directory.
-				fmt.Fprintf(Stderr, "fchdir back to dot failed: %s\n", err2)
-				Exit(1)
-			}
-			if err != nil {
-				fd.Close()
-				t.Fatalf("Chdir %s: %s", d, err)
-			}
-			if err1 != nil {
-				fd.Close()
-				t.Fatalf("Getwd in %s: %s", d, err1)
-			}
-			if pwd != d {
-				fd.Close()
-				t.Fatalf("Getwd returned %q want %q", pwd, d)
-			}
-		}
-	}
-	fd.Close()
-}
-
-// Test that Chdir+Getwd is program-wide.
-func TestProgWideChdir(t *testing.T) {
-	const N = 10
-	c := make(chan bool)
-	cpwd := make(chan string)
-	for i := 0; i < N; i++ {
-		go func(i int) {
-			// Lock half the goroutines in their own operating system
-			// thread to exercise more scheduler possibilities.
-			if i%2 == 1 {
-				// On Plan 9, after calling LockOSThread, the goroutines
-				// run on different processes which don't share the working
-				// directory. This used to be an issue because Go expects
-				// the working directory to be program-wide.
-				// See issue 9428.
-				runtime.LockOSThread()
-			}
-			<-c
-			pwd, err := Getwd()
-			if err != nil {
-				t.Errorf("Getwd on goroutine %d: %v", i, err)
-				return
-			}
-			cpwd <- pwd
-		}(i)
-	}
-	oldwd, err := Getwd()
-	if err != nil {
-		t.Fatalf("Getwd: %v", err)
-	}
-	d, err := ioutil.TempDir("", "test")
-	if err != nil {
-		t.Fatalf("TempDir: %v", err)
-	}
-	defer func() {
-		if err := Chdir(oldwd); err != nil {
-			t.Fatalf("Chdir: %v", err)
-		}
-		RemoveAll(d)
-	}()
-	if err := Chdir(d); err != nil {
-		t.Fatalf("Chdir: %v", err)
-	}
-	// OS X sets TMPDIR to a symbolic link.
-	// So we resolve our working directory again before the test.
-	d, err = Getwd()
-	if err != nil {
-		t.Fatalf("Getwd: %v", err)
-	}
-	close(c)
-	for i := 0; i < N; i++ {
-		pwd := <-cpwd
-		if pwd != d {
-			t.Errorf("Getwd returned %q; want %q", pwd, d)
-		}
-	}
-}
-
-func TestSeek(t *testing.T) {
-	f := newFile("TestSeek", t)
-	defer Remove(f.Name())
-	defer f.Close()
-
-	const data = "hello, world\n"
-	io.WriteString(f, data)
-
-	type test struct {
-		in     int64
-		whence int
-		out    int64
-	}
-	var tests = []test{
-		{0, 1, int64(len(data))},
-		{0, 0, 0},
-		{5, 0, 5},
-		{0, 2, int64(len(data))},
-		{0, 0, 0},
-		{-1, 2, int64(len(data)) - 1},
-		{1 << 33, 0, 1 << 33},
-		{1 << 33, 2, 1<<33 + int64(len(data))},
-	}
-	for i, tt := range tests {
-		off, err := f.Seek(tt.in, tt.whence)
-		if off != tt.out || err != nil {
-			if e, ok := err.(*PathError); ok && e.Err == syscall.EINVAL && tt.out > 1<<32 {
-				// Reiserfs rejects the big seeks.
-				// https://golang.org/issue/91
-				break
-			}
-			t.Errorf("#%d: Seek(%v, %v) = %v, %v want %v, nil", i, tt.in, tt.whence, off, err, tt.out)
-		}
-	}
-}
-
-type openErrorTest struct {
-	path  string
-	mode  int
-	error error
-}
-
-var openErrorTests = []openErrorTest{
-	{
-		sfdir + "/no-such-file",
-		O_RDONLY,
-		syscall.ENOENT,
-	},
-	{
-		sfdir,
-		O_WRONLY,
-		syscall.EISDIR,
-	},
-	{
-		sfdir + "/" + sfname + "/no-such-file",
-		O_WRONLY,
-		syscall.ENOTDIR,
-	},
-}
-
-func TestOpenError(t *testing.T) {
-	for _, tt := range openErrorTests {
-		f, err := OpenFile(tt.path, tt.mode, 0)
-		if err == nil {
-			t.Errorf("Open(%q, %d) succeeded", tt.path, tt.mode)
-			f.Close()
-			continue
-		}
-		perr, ok := err.(*PathError)
-		if !ok {
-			t.Errorf("Open(%q, %d) returns error of %T type; want *PathError", tt.path, tt.mode, err)
-		}
-		if perr.Err != tt.error {
-			if runtime.GOOS == "plan9" {
-				syscallErrStr := perr.Err.Error()
-				expectedErrStr := strings.Replace(tt.error.Error(), "file ", "", 1)
-				if !strings.HasSuffix(syscallErrStr, expectedErrStr) {
-					// Some Plan 9 file servers incorrectly return
-					// EACCES rather than EISDIR when a directory is
-					// opened for write.
-					if tt.error == syscall.EISDIR && strings.HasSuffix(syscallErrStr, syscall.EACCES.Error()) {
-						continue
-					}
-					t.Errorf("Open(%q, %d) = _, %q; want suffix %q", tt.path, tt.mode, syscallErrStr, expectedErrStr)
-				}
-				continue
-			}
-			if runtime.GOOS == "dragonfly" {
-				// DragonFly incorrectly returns EACCES rather
-				// EISDIR when a directory is opened for write.
-				if tt.error == syscall.EISDIR && perr.Err == syscall.EACCES {
-					continue
-				}
-			}
-			t.Errorf("Open(%q, %d) = _, %q; want %q", tt.path, tt.mode, perr.Err.Error(), tt.error.Error())
-		}
-	}
-}
-
-func TestOpenNoName(t *testing.T) {
-	f, err := Open("")
-	if err == nil {
-		t.Fatal(`Open("") succeeded`)
-		f.Close()
-	}
-}
-
-func run(t *testing.T, cmd []string) string {
-	// Run /bin/hostname and collect output.
-	r, w, err := Pipe()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer r.Close()
-	p, err := StartProcess("/bin/hostname", []string{"hostname"}, &ProcAttr{Files: []*File{nil, w, Stderr}})
-	if err != nil {
-		t.Fatal(err)
-	}
-	w.Close()
-
-	var b bytes.Buffer
-	io.Copy(&b, r)
-	_, err = p.Wait()
-	if err != nil {
-		t.Fatalf("run hostname Wait: %v", err)
-	}
-	err = p.Kill()
-	if err == nil {
-		t.Errorf("expected an error from Kill running 'hostname'")
-	}
-	output := b.String()
-	if n := len(output); n > 0 && output[n-1] == '\n' {
-		output = output[0 : n-1]
-	}
-	if output == "" {
-		t.Fatalf("%v produced no output", cmd)
-	}
-
-	return output
-}
-
-func testWindowsHostname(t *testing.T) {
-	hostname, err := Hostname()
-	if err != nil {
-		t.Fatal(err)
-	}
-	cmd := osexec.Command("hostname")
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("Failed to execute hostname command: %v %s", err, out)
-	}
-	want := strings.Trim(string(out), "\r\n")
-	if hostname != want {
-		t.Fatalf("Hostname() = %q, want %q", hostname, want)
-	}
-}
-
-func TestHostname(t *testing.T) {
-	// There is no other way to fetch hostname on windows, but via winapi.
-	// On Plan 9 it can be taken from #c/sysname as Hostname() does.
-	switch runtime.GOOS {
-	case "android", "plan9":
-		t.Skipf("%s doesn't have /bin/hostname", runtime.GOOS)
-	case "windows":
-		testWindowsHostname(t)
-		return
-	}
-
-	testenv.MustHaveExec(t)
-
-	// Check internal Hostname() against the output of /bin/hostname.
-	// Allow that the internal Hostname returns a Fully Qualified Domain Name
-	// and the /bin/hostname only returns the first component
-	hostname, err := Hostname()
-	if err != nil {
-		t.Fatalf("%v", err)
-	}
-	want := run(t, []string{"/bin/hostname"})
-	if hostname != want {
-		i := strings.Index(hostname, ".")
-		if i < 0 || hostname[0:i] != want {
-			t.Errorf("Hostname() = %q, want %q", hostname, want)
-		}
-	}
-}
-
-func TestReadAt(t *testing.T) {
-	f := newFile("TestReadAt", t)
-	defer Remove(f.Name())
-	defer f.Close()
-
-	const data = "hello, world\n"
-	io.WriteString(f, data)
-
-	b := make([]byte, 5)
-	n, err := f.ReadAt(b, 7)
-	if err != nil || n != len(b) {
-		t.Fatalf("ReadAt 7: %d, %v", n, err)
-	}
-	if string(b) != "world" {
-		t.Fatalf("ReadAt 7: have %q want %q", string(b), "world")
-	}
-}
-
-func TestWriteAt(t *testing.T) {
-	f := newFile("TestWriteAt", t)
-	defer Remove(f.Name())
-	defer f.Close()
-
-	const data = "hello, world\n"
-	io.WriteString(f, data)
-
-	n, err := f.WriteAt([]byte("WORLD"), 7)
-	if err != nil || n != 5 {
-		t.Fatalf("WriteAt 7: %d, %v", n, err)
-	}
-
-	b, err := ioutil.ReadFile(f.Name())
-	if err != nil {
-		t.Fatalf("ReadFile %s: %v", f.Name(), err)
-	}
-	if string(b) != "hello, WORLD\n" {
-		t.Fatalf("after write: have %q want %q", string(b), "hello, WORLD\n")
-	}
-}
-
-func writeFile(t *testing.T, fname string, flag int, text string) string {
-	f, err := OpenFile(fname, flag, 0666)
-	if err != nil {
-		t.Fatalf("Open: %v", err)
-	}
-	n, err := io.WriteString(f, text)
-	if err != nil {
-		t.Fatalf("WriteString: %d, %v", n, err)
-	}
-	f.Close()
-	data, err := ioutil.ReadFile(fname)
-	if err != nil {
-		t.Fatalf("ReadFile: %v", err)
-	}
-	return string(data)
-}
-
-func TestAppend(t *testing.T) {
-	defer chtmpdir(t)()
-	const f = "append.txt"
-	defer Remove(f)
-	s := writeFile(t, f, O_CREATE|O_TRUNC|O_RDWR, "new")
-	if s != "new" {
-		t.Fatalf("writeFile: have %q want %q", s, "new")
-	}
-	s = writeFile(t, f, O_APPEND|O_RDWR, "|append")
-	if s != "new|append" {
-		t.Fatalf("writeFile: have %q want %q", s, "new|append")
-	}
-	s = writeFile(t, f, O_CREATE|O_APPEND|O_RDWR, "|append")
-	if s != "new|append|append" {
-		t.Fatalf("writeFile: have %q want %q", s, "new|append|append")
-	}
-	err := Remove(f)
-	if err != nil {
-		t.Fatalf("Remove: %v", err)
-	}
-	s = writeFile(t, f, O_CREATE|O_APPEND|O_RDWR, "new&append")
-	if s != "new&append" {
-		t.Fatalf("writeFile: after append have %q want %q", s, "new&append")
-	}
-	s = writeFile(t, f, O_CREATE|O_RDWR, "old")
-	if s != "old&append" {
-		t.Fatalf("writeFile: after create have %q want %q", s, "old&append")
-	}
-	s = writeFile(t, f, O_CREATE|O_TRUNC|O_RDWR, "new")
-	if s != "new" {
-		t.Fatalf("writeFile: after truncate have %q want %q", s, "new")
-	}
-}
-
-func TestStatDirWithTrailingSlash(t *testing.T) {
-	// Create new temporary directory and arrange to clean it up.
-	path, err := ioutil.TempDir("", "/_TestStatDirWithSlash_")
-	if err != nil {
-		t.Fatalf("TempDir: %s", err)
-	}
-	defer RemoveAll(path)
-
-	// Stat of path should succeed.
-	_, err = Stat(path)
-	if err != nil {
-		t.Fatalf("stat %s failed: %s", path, err)
-	}
-
-	// Stat of path+"/" should succeed too.
-	path += "/"
-	_, err = Stat(path)
-	if err != nil {
-		t.Fatalf("stat %s failed: %s", path, err)
-	}
-}
-
-func TestNilProcessStateString(t *testing.T) {
-	var ps *ProcessState
-	s := ps.String()
-	if s != "<nil>" {
-		t.Errorf("(*ProcessState)(nil).String() = %q, want %q", s, "<nil>")
-	}
-}
-
-func TestSameFile(t *testing.T) {
-	defer chtmpdir(t)()
-	fa, err := Create("a")
-	if err != nil {
-		t.Fatalf("Create(a): %v", err)
-	}
-	defer Remove(fa.Name())
-	fa.Close()
-	fb, err := Create("b")
-	if err != nil {
-		t.Fatalf("Create(b): %v", err)
-	}
-	defer Remove(fb.Name())
-	fb.Close()
-
-	ia1, err := Stat("a")
-	if err != nil {
-		t.Fatalf("Stat(a): %v", err)
-	}
-	ia2, err := Stat("a")
-	if err != nil {
-		t.Fatalf("Stat(a): %v", err)
-	}
-	if !SameFile(ia1, ia2) {
-		t.Errorf("files should be same")
-	}
-
-	ib, err := Stat("b")
-	if err != nil {
-		t.Fatalf("Stat(b): %v", err)
-	}
-	if SameFile(ia1, ib) {
-		t.Errorf("files should be different")
-	}
-}
-
-func TestDevNullFile(t *testing.T) {
-	f, err := Open(DevNull)
-	if err != nil {
-		t.Fatalf("Open(%s): %v", DevNull, err)
-	}
-	defer f.Close()
-	fi, err := f.Stat()
-	if err != nil {
-		t.Fatalf("Stat(%s): %v", DevNull, err)
-	}
-	name := filepath.Base(DevNull)
-	if fi.Name() != name {
-		t.Fatalf("wrong file name have %v want %v", fi.Name(), name)
-	}
-	if fi.Size() != 0 {
-		t.Fatalf("wrong file size have %d want 0", fi.Size())
-	}
-}
-
-var testLargeWrite = flag.Bool("large_write", false, "run TestLargeWriteToConsole test that floods console with output")
-
-func TestLargeWriteToConsole(t *testing.T) {
-	if !*testLargeWrite {
-		t.Skip("skipping console-flooding test; enable with -large_write")
-	}
-	b := make([]byte, 32000)
-	for i := range b {
-		b[i] = '.'
-	}
-	b[len(b)-1] = '\n'
-	n, err := Stdout.Write(b)
-	if err != nil {
-		t.Fatalf("Write to os.Stdout failed: %v", err)
-	}
-	if n != len(b) {
-		t.Errorf("Write to os.Stdout should return %d; got %d", len(b), n)
-	}
-	n, err = Stderr.Write(b)
-	if err != nil {
-		t.Fatalf("Write to os.Stderr failed: %v", err)
-	}
-	if n != len(b) {
-		t.Errorf("Write to os.Stderr should return %d; got %d", len(b), n)
-	}
-}
-
-func TestStatDirModeExec(t *testing.T) {
-	const mode = 0111
-
-	path, err := ioutil.TempDir("", "go-build")
-	if err != nil {
-		t.Fatalf("Failed to create temp directory: %v", err)
-	}
-	defer RemoveAll(path)
-
-	if err := Chmod(path, 0777); err != nil {
-		t.Fatalf("Chmod %q 0777: %v", path, err)
-	}
-
-	dir, err := Stat(path)
-	if err != nil {
-		t.Fatalf("Stat %q (looking for mode %#o): %s", path, mode, err)
-	}
-	if dir.Mode()&mode != mode {
-		t.Errorf("Stat %q: mode %#o want %#o", path, dir.Mode()&mode, mode)
-	}
-}
-
-func TestReadAtEOF(t *testing.T) {
-	f := newFile("TestReadAtEOF", t)
-	defer Remove(f.Name())
-	defer f.Close()
-
-	_, err := f.ReadAt(make([]byte, 10), 0)
-	switch err {
-	case io.EOF:
-		// all good
-	case nil:
-		t.Fatalf("ReadAt succeeded")
-	default:
-		t.Fatalf("ReadAt failed: %s", err)
-	}
-}
-
-func testKillProcess(t *testing.T, processKiller func(p *Process)) {
-	testenv.MustHaveExec(t)
-
-	// Re-exec the test binary itself to emulate "sleep 1".
-	cmd := osexec.Command(Args[0], "-test.run", "TestSleep")
-	err := cmd.Start()
-	if err != nil {
-		t.Fatalf("Failed to start test process: %v", err)
-	}
-	go func() {
-		time.Sleep(100 * time.Millisecond)
-		processKiller(cmd.Process)
-	}()
-	err = cmd.Wait()
-	if err == nil {
-		t.Errorf("Test process succeeded, but expected to fail")
-	}
-}
-
-// TestSleep emulates "sleep 1". It is a helper for testKillProcess, so we
-// don't have to rely on an external "sleep" command being available.
-func TestSleep(t *testing.T) {
-	if testing.Short() {
-		t.Skip("Skipping in short mode")
-	}
-	time.Sleep(time.Second)
-}
-
-func TestKillStartProcess(t *testing.T) {
-	testKillProcess(t, func(p *Process) {
-		err := p.Kill()
-		if err != nil {
-			t.Fatalf("Failed to kill test process: %v", err)
-		}
-	})
-}
-
-func TestGetppid(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		// TODO: golang.org/issue/8206
-		t.Skipf("skipping test on plan9; see issue 8206")
-	}
-
-	testenv.MustHaveExec(t)
-
-	if Getenv("GO_WANT_HELPER_PROCESS") == "1" {
-		fmt.Print(Getppid())
-		Exit(0)
-	}
-
-	cmd := osexec.Command(Args[0], "-test.run=TestGetppid")
-	cmd.Env = append(Environ(), "GO_WANT_HELPER_PROCESS=1")
-
-	// verify that Getppid() from the forked process reports our process id
-	output, err := cmd.CombinedOutput()
-	if err != nil {
-		t.Fatalf("Failed to spawn child process: %v %q", err, string(output))
-	}
-
-	childPpid := string(output)
-	ourPid := fmt.Sprintf("%d", Getpid())
-	if childPpid != ourPid {
-		t.Fatalf("Child process reports parent process id '%v', expected '%v'", childPpid, ourPid)
-	}
-}
-
-func TestKillFindProcess(t *testing.T) {
-	testKillProcess(t, func(p *Process) {
-		p2, err := FindProcess(p.Pid)
-		if err != nil {
-			t.Fatalf("Failed to find test process: %v", err)
-		}
-		err = p2.Kill()
-		if err != nil {
-			t.Fatalf("Failed to kill test process: %v", err)
-		}
-	})
-}
-
-var nilFileMethodTests = []struct {
-	name string
-	f    func(*File) error
-}{
-	{"Chdir", func(f *File) error { return f.Chdir() }},
-	{"Close", func(f *File) error { return f.Close() }},
-	{"Chmod", func(f *File) error { return f.Chmod(0) }},
-	{"Chown", func(f *File) error { return f.Chown(0, 0) }},
-	{"Read", func(f *File) error { _, err := f.Read(make([]byte, 0)); return err }},
-	{"ReadAt", func(f *File) error { _, err := f.ReadAt(make([]byte, 0), 0); return err }},
-	{"Readdir", func(f *File) error { _, err := f.Readdir(1); return err }},
-	{"Readdirnames", func(f *File) error { _, err := f.Readdirnames(1); return err }},
-	{"Seek", func(f *File) error { _, err := f.Seek(0, 0); return err }},
-	{"Stat", func(f *File) error { _, err := f.Stat(); return err }},
-	{"Sync", func(f *File) error { return f.Sync() }},
-	{"Truncate", func(f *File) error { return f.Truncate(0) }},
-	{"Write", func(f *File) error { _, err := f.Write(make([]byte, 0)); return err }},
-	{"WriteAt", func(f *File) error { _, err := f.WriteAt(make([]byte, 0), 0); return err }},
-	{"WriteString", func(f *File) error { _, err := f.WriteString(""); return err }},
-}
-
-// Test that all File methods give ErrInvalid if the receiver is nil.
-func TestNilFileMethods(t *testing.T) {
-	for _, tt := range nilFileMethodTests {
-		var file *File
-		got := tt.f(file)
-		if got != ErrInvalid {
-			t.Errorf("%v should fail when f is nil; got %v", tt.name, got)
-		}
-	}
-}
-
-func mkdirTree(t *testing.T, root string, level, max int) {
-	if level >= max {
-		return
-	}
-	level++
-	for i := 'a'; i < 'c'; i++ {
-		dir := filepath.Join(root, string(i))
-		if err := Mkdir(dir, 0700); err != nil {
-			t.Fatal(err)
-		}
-		mkdirTree(t, dir, level, max)
-	}
-}
-
-// Test that simultaneous RemoveAll do not report an error.
-// As long as it gets removed, we should be happy.
-func TestRemoveAllRace(t *testing.T) {
-	if runtime.GOOS == "windows" {
-		// Windows has very strict rules about things like
-		// removing directories while someone else has
-		// them open. The racing doesn't work out nicely
-		// like it does on Unix.
-		t.Skip("skipping on windows")
-	}
-
-	n := runtime.GOMAXPROCS(16)
-	defer runtime.GOMAXPROCS(n)
-	root, err := ioutil.TempDir("", "issue")
-	if err != nil {
-		t.Fatal(err)
-	}
-	mkdirTree(t, root, 1, 6)
-	hold := make(chan struct{})
-	var wg sync.WaitGroup
-	for i := 0; i < 4; i++ {
-		wg.Add(1)
-		go func() {
-			defer wg.Done()
-			<-hold
-			err := RemoveAll(root)
-			if err != nil {
-				t.Errorf("unexpected error: %T, %q", err, err)
-			}
-		}()
-	}
-	close(hold) // let workers race to remove root
-	wg.Wait()
-}
diff --git a/third_party/gofrontend/libgo/go/os/os_unix_test.go b/third_party/gofrontend/libgo/go/os/os_unix_test.go
deleted file mode 100644
index 2adc3b5..0000000
--- a/third_party/gofrontend/libgo/go/os/os_unix_test.go
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package os_test
-
-import (
-	. "os"
-	"runtime"
-	"syscall"
-	"testing"
-)
-
-func init() {
-	isReadonlyError = func(err error) bool { return err == syscall.EROFS }
-}
-
-func checkUidGid(t *testing.T, path string, uid, gid int) {
-	dir, err := Stat(path)
-	if err != nil {
-		t.Fatalf("Stat %q (looking for uid/gid %d/%d): %s", path, uid, gid, err)
-	}
-	sys := dir.Sys().(*syscall.Stat_t)
-	if int(sys.Uid) != uid {
-		t.Errorf("Stat %q: uid %d want %d", path, sys.Uid, uid)
-	}
-	if int(sys.Gid) != gid {
-		t.Errorf("Stat %q: gid %d want %d", path, sys.Gid, gid)
-	}
-}
-
-func TestChown(t *testing.T) {
-	// Chown is not supported under windows or Plan 9.
-	// Plan9 provides a native ChownPlan9 version instead.
-	if runtime.GOOS == "windows" || runtime.GOOS == "plan9" {
-		t.Skipf("%s does not support syscall.Chown", runtime.GOOS)
-	}
-	// Use TempDir() to make sure we're on a local file system,
-	// so that the group ids returned by Getgroups will be allowed
-	// on the file.  On NFS, the Getgroups groups are
-	// basically useless.
-	f := newFile("TestChown", t)
-	defer Remove(f.Name())
-	defer f.Close()
-	dir, err := f.Stat()
-	if err != nil {
-		t.Fatalf("stat %s: %s", f.Name(), err)
-	}
-
-	// Can't change uid unless root, but can try
-	// changing the group id.  First try our current group.
-	gid := Getgid()
-	t.Log("gid:", gid)
-	if err = Chown(f.Name(), -1, gid); err != nil {
-		t.Fatalf("chown %s -1 %d: %s", f.Name(), gid, err)
-	}
-	sys := dir.Sys().(*syscall.Stat_t)
-	checkUidGid(t, f.Name(), int(sys.Uid), gid)
-
-	// Then try all the auxiliary groups.
-	groups, err := Getgroups()
-	if err != nil {
-		t.Fatalf("getgroups: %s", err)
-	}
-	t.Log("groups: ", groups)
-	for _, g := range groups {
-		if err = Chown(f.Name(), -1, g); err != nil {
-			t.Fatalf("chown %s -1 %d: %s", f.Name(), g, err)
-		}
-		checkUidGid(t, f.Name(), int(sys.Uid), g)
-
-		// change back to gid to test fd.Chown
-		if err = f.Chown(-1, gid); err != nil {
-			t.Fatalf("fchown %s -1 %d: %s", f.Name(), gid, err)
-		}
-		checkUidGid(t, f.Name(), int(sys.Uid), gid)
-	}
-}
-
-func TestFileChown(t *testing.T) {
-	// Fchown is not supported under windows or Plan 9.
-	if runtime.GOOS == "windows" || runtime.GOOS == "plan9" {
-		t.Skipf("%s does not support syscall.Fchown", runtime.GOOS)
-	}
-	// Use TempDir() to make sure we're on a local file system,
-	// so that the group ids returned by Getgroups will be allowed
-	// on the file.  On NFS, the Getgroups groups are
-	// basically useless.
-	f := newFile("TestFileChown", t)
-	defer Remove(f.Name())
-	defer f.Close()
-	dir, err := f.Stat()
-	if err != nil {
-		t.Fatalf("stat %s: %s", f.Name(), err)
-	}
-
-	// Can't change uid unless root, but can try
-	// changing the group id.  First try our current group.
-	gid := Getgid()
-	t.Log("gid:", gid)
-	if err = f.Chown(-1, gid); err != nil {
-		t.Fatalf("fchown %s -1 %d: %s", f.Name(), gid, err)
-	}
-	sys := dir.Sys().(*syscall.Stat_t)
-	checkUidGid(t, f.Name(), int(sys.Uid), gid)
-
-	// Then try all the auxiliary groups.
-	groups, err := Getgroups()
-	if err != nil {
-		t.Fatalf("getgroups: %s", err)
-	}
-	t.Log("groups: ", groups)
-	for _, g := range groups {
-		if err = f.Chown(-1, g); err != nil {
-			t.Fatalf("fchown %s -1 %d: %s", f.Name(), g, err)
-		}
-		checkUidGid(t, f.Name(), int(sys.Uid), g)
-
-		// change back to gid to test fd.Chown
-		if err = f.Chown(-1, gid); err != nil {
-			t.Fatalf("fchown %s -1 %d: %s", f.Name(), gid, err)
-		}
-		checkUidGid(t, f.Name(), int(sys.Uid), gid)
-	}
-}
-
-func TestLchown(t *testing.T) {
-	// Lchown is not supported under windows or Plan 9.
-	if runtime.GOOS == "windows" || runtime.GOOS == "plan9" {
-		t.Skipf("%s does not support syscall.Lchown", runtime.GOOS)
-	}
-	// Use TempDir() to make sure we're on a local file system,
-	// so that the group ids returned by Getgroups will be allowed
-	// on the file.  On NFS, the Getgroups groups are
-	// basically useless.
-	f := newFile("TestLchown", t)
-	defer Remove(f.Name())
-	defer f.Close()
-	dir, err := f.Stat()
-	if err != nil {
-		t.Fatalf("stat %s: %s", f.Name(), err)
-	}
-
-	linkname := f.Name() + "2"
-	if err := Link(f.Name(), linkname); err != nil {
-		t.Fatalf("link %s -> %s: %v", f.Name(), linkname, err)
-	}
-	defer Remove(linkname)
-
-	f2, err := Open(linkname)
-	if err != nil {
-		t.Fatalf("open %s: %v", linkname, err)
-	}
-	defer f2.Close()
-
-	// Can't change uid unless root, but can try
-	// changing the group id.  First try our current group.
-	gid := Getgid()
-	t.Log("gid:", gid)
-	if err = Lchown(linkname, -1, gid); err != nil {
-		t.Fatalf("lchown %s -1 %d: %s", linkname, gid, err)
-	}
-	sys := dir.Sys().(*syscall.Stat_t)
-	checkUidGid(t, linkname, int(sys.Uid), gid)
-
-	// Then try all the auxiliary groups.
-	groups, err := Getgroups()
-	if err != nil {
-		t.Fatalf("getgroups: %s", err)
-	}
-	t.Log("groups: ", groups)
-	for _, g := range groups {
-		if err = Lchown(linkname, -1, g); err != nil {
-			t.Fatalf("lchown %s -1 %d: %s", linkname, g, err)
-		}
-		checkUidGid(t, linkname, int(sys.Uid), g)
-
-		// change back to gid to test fd.Chown
-		if err = f2.Chown(-1, gid); err != nil {
-			t.Fatalf("fchown %s -1 %d: %s", linkname, gid, err)
-		}
-		checkUidGid(t, linkname, int(sys.Uid), gid)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/os/path.go b/third_party/gofrontend/libgo/go/os/path.go
deleted file mode 100644
index 84a3be3..0000000
--- a/third_party/gofrontend/libgo/go/os/path.go
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"io"
-	"syscall"
-)
-
-// MkdirAll creates a directory named path,
-// along with any necessary parents, and returns nil,
-// or else returns an error.
-// The permission bits perm are used for all
-// directories that MkdirAll creates.
-// If path is already a directory, MkdirAll does nothing
-// and returns nil.
-func MkdirAll(path string, perm FileMode) error {
-	// Fast path: if we can tell whether path is a directory or file, stop with success or error.
-	dir, err := Stat(path)
-	if err == nil {
-		if dir.IsDir() {
-			return nil
-		}
-		return &PathError{"mkdir", path, syscall.ENOTDIR}
-	}
-
-	// Slow path: make sure parent exists and then call Mkdir for path.
-	i := len(path)
-	for i > 0 && IsPathSeparator(path[i-1]) { // Skip trailing path separator.
-		i--
-	}
-
-	j := i
-	for j > 0 && !IsPathSeparator(path[j-1]) { // Scan backward over element.
-		j--
-	}
-
-	if j > 1 {
-		// Create parent
-		err = MkdirAll(path[0:j-1], perm)
-		if err != nil {
-			return err
-		}
-	}
-
-	// Parent now exists; invoke Mkdir and use its result.
-	err = Mkdir(path, perm)
-	if err != nil {
-		// Handle arguments like "foo/." by
-		// double-checking that directory doesn't exist.
-		dir, err1 := Lstat(path)
-		if err1 == nil && dir.IsDir() {
-			return nil
-		}
-		return err
-	}
-	return nil
-}
-
-// RemoveAll removes path and any children it contains.
-// It removes everything it can but returns the first error
-// it encounters.  If the path does not exist, RemoveAll
-// returns nil (no error).
-func RemoveAll(path string) error {
-	// Simple case: if Remove works, we're done.
-	err := Remove(path)
-	if err == nil || IsNotExist(err) {
-		return nil
-	}
-
-	// Otherwise, is this a directory we need to recurse into?
-	dir, serr := Lstat(path)
-	if serr != nil {
-		if serr, ok := serr.(*PathError); ok && (IsNotExist(serr.Err) || serr.Err == syscall.ENOTDIR) {
-			return nil
-		}
-		return serr
-	}
-	if !dir.IsDir() {
-		// Not a directory; return the error from Remove.
-		return err
-	}
-
-	// Directory.
-	fd, err := Open(path)
-	if err != nil {
-		if IsNotExist(err) {
-			// Race. It was deleted between the Lstat and Open.
-			// Return nil per RemoveAll's docs.
-			return nil
-		}
-		return err
-	}
-
-	// Remove contents & return first error.
-	err = nil
-	for {
-		names, err1 := fd.Readdirnames(100)
-		for _, name := range names {
-			err1 := RemoveAll(path + string(PathSeparator) + name)
-			if err == nil {
-				err = err1
-			}
-		}
-		if err1 == io.EOF {
-			break
-		}
-		// If Readdirnames returned an error, use it.
-		if err == nil {
-			err = err1
-		}
-		if len(names) == 0 {
-			break
-		}
-	}
-
-	// Close directory, because windows won't remove opened directory.
-	fd.Close()
-
-	// Remove directory.
-	err1 := Remove(path)
-	if err1 == nil || IsNotExist(err1) {
-		return nil
-	}
-	if err == nil {
-		err = err1
-	}
-	return err
-}
diff --git a/third_party/gofrontend/libgo/go/os/path_plan9.go b/third_party/gofrontend/libgo/go/os/path_plan9.go
deleted file mode 100644
index b09b53a..0000000
--- a/third_party/gofrontend/libgo/go/os/path_plan9.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-const (
-	PathSeparator     = '/'    // OS-specific path separator
-	PathListSeparator = '\000' // OS-specific path list separator
-)
-
-// IsPathSeparator reports whether c is a directory separator character.
-func IsPathSeparator(c uint8) bool {
-	return PathSeparator == c
-}
diff --git a/third_party/gofrontend/libgo/go/os/path_test.go b/third_party/gofrontend/libgo/go/os/path_test.go
deleted file mode 100644
index f985381..0000000
--- a/third_party/gofrontend/libgo/go/os/path_test.go
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os_test
-
-import (
-	"io/ioutil"
-	. "os"
-	"path/filepath"
-	"runtime"
-	"syscall"
-	"testing"
-)
-
-var isReadonlyError = func(error) bool { return false }
-
-func TestMkdirAll(t *testing.T) {
-	tmpDir := TempDir()
-	path := tmpDir + "/_TestMkdirAll_/dir/./dir2"
-	err := MkdirAll(path, 0777)
-	if err != nil {
-		t.Fatalf("MkdirAll %q: %s", path, err)
-	}
-	defer RemoveAll(tmpDir + "/_TestMkdirAll_")
-
-	// Already exists, should succeed.
-	err = MkdirAll(path, 0777)
-	if err != nil {
-		t.Fatalf("MkdirAll %q (second time): %s", path, err)
-	}
-
-	// Make file.
-	fpath := path + "/file"
-	f, err := Create(fpath)
-	if err != nil {
-		t.Fatalf("create %q: %s", fpath, err)
-	}
-	defer f.Close()
-
-	// Can't make directory named after file.
-	err = MkdirAll(fpath, 0777)
-	if err == nil {
-		t.Fatalf("MkdirAll %q: no error", fpath)
-	}
-	perr, ok := err.(*PathError)
-	if !ok {
-		t.Fatalf("MkdirAll %q returned %T, not *PathError", fpath, err)
-	}
-	if filepath.Clean(perr.Path) != filepath.Clean(fpath) {
-		t.Fatalf("MkdirAll %q returned wrong error path: %q not %q", fpath, filepath.Clean(perr.Path), filepath.Clean(fpath))
-	}
-
-	// Can't make subdirectory of file.
-	ffpath := fpath + "/subdir"
-	err = MkdirAll(ffpath, 0777)
-	if err == nil {
-		t.Fatalf("MkdirAll %q: no error", ffpath)
-	}
-	perr, ok = err.(*PathError)
-	if !ok {
-		t.Fatalf("MkdirAll %q returned %T, not *PathError", ffpath, err)
-	}
-	if filepath.Clean(perr.Path) != filepath.Clean(fpath) {
-		t.Fatalf("MkdirAll %q returned wrong error path: %q not %q", ffpath, filepath.Clean(perr.Path), filepath.Clean(fpath))
-	}
-
-	if runtime.GOOS == "windows" {
-		path := tmpDir + `\_TestMkdirAll_\dir\.\dir2\`
-		err := MkdirAll(path, 0777)
-		if err != nil {
-			t.Fatalf("MkdirAll %q: %s", path, err)
-		}
-	}
-}
-
-func TestRemoveAll(t *testing.T) {
-	tmpDir := TempDir()
-	// Work directory.
-	path := tmpDir + "/_TestRemoveAll_"
-	fpath := path + "/file"
-	dpath := path + "/dir"
-
-	// Make directory with 1 file and remove.
-	if err := MkdirAll(path, 0777); err != nil {
-		t.Fatalf("MkdirAll %q: %s", path, err)
-	}
-	fd, err := Create(fpath)
-	if err != nil {
-		t.Fatalf("create %q: %s", fpath, err)
-	}
-	fd.Close()
-	if err = RemoveAll(path); err != nil {
-		t.Fatalf("RemoveAll %q (first): %s", path, err)
-	}
-	if _, err = Lstat(path); err == nil {
-		t.Fatalf("Lstat %q succeeded after RemoveAll (first)", path)
-	}
-
-	// Make directory with file and subdirectory and remove.
-	if err = MkdirAll(dpath, 0777); err != nil {
-		t.Fatalf("MkdirAll %q: %s", dpath, err)
-	}
-	fd, err = Create(fpath)
-	if err != nil {
-		t.Fatalf("create %q: %s", fpath, err)
-	}
-	fd.Close()
-	fd, err = Create(dpath + "/file")
-	if err != nil {
-		t.Fatalf("create %q: %s", fpath, err)
-	}
-	fd.Close()
-	if err = RemoveAll(path); err != nil {
-		t.Fatalf("RemoveAll %q (second): %s", path, err)
-	}
-	if _, err := Lstat(path); err == nil {
-		t.Fatalf("Lstat %q succeeded after RemoveAll (second)", path)
-	}
-
-	// Determine if we should run the following test.
-	testit := true
-	if runtime.GOOS == "windows" {
-		// Chmod is not supported under windows.
-		testit = false
-	} else {
-		// Test fails as root.
-		testit = Getuid() != 0
-	}
-	if testit {
-		// Make directory with file and subdirectory and trigger error.
-		if err = MkdirAll(dpath, 0777); err != nil {
-			t.Fatalf("MkdirAll %q: %s", dpath, err)
-		}
-
-		for _, s := range []string{fpath, dpath + "/file1", path + "/zzz"} {
-			fd, err = Create(s)
-			if err != nil {
-				t.Fatalf("create %q: %s", s, err)
-			}
-			fd.Close()
-		}
-		if err = Chmod(dpath, 0); err != nil {
-			t.Fatalf("Chmod %q 0: %s", dpath, err)
-		}
-
-		// No error checking here: either RemoveAll
-		// will or won't be able to remove dpath;
-		// either way we want to see if it removes fpath
-		// and path/zzz.  Reasons why RemoveAll might
-		// succeed in removing dpath as well include:
-		//	* running as root
-		//	* running on a file system without permissions (FAT)
-		RemoveAll(path)
-		Chmod(dpath, 0777)
-
-		for _, s := range []string{fpath, path + "/zzz"} {
-			if _, err = Lstat(s); err == nil {
-				t.Fatalf("Lstat %q succeeded after partial RemoveAll", s)
-			}
-		}
-	}
-	if err = RemoveAll(path); err != nil {
-		t.Fatalf("RemoveAll %q after partial RemoveAll: %s", path, err)
-	}
-	if _, err = Lstat(path); err == nil {
-		t.Fatalf("Lstat %q succeeded after RemoveAll (final)", path)
-	}
-}
-
-func TestMkdirAllWithSymlink(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "plan9":
-		t.Skipf("skipping on %s", runtime.GOOS)
-	case "windows":
-		if !supportsSymlinks {
-			t.Skipf("skipping on %s", runtime.GOOS)
-		}
-	}
-
-	tmpDir, err := ioutil.TempDir("", "TestMkdirAllWithSymlink-")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer RemoveAll(tmpDir)
-
-	dir := tmpDir + "/dir"
-	err = Mkdir(dir, 0755)
-	if err != nil {
-		t.Fatalf("Mkdir %s: %s", dir, err)
-	}
-
-	link := tmpDir + "/link"
-	err = Symlink("dir", link)
-	if err != nil {
-		t.Fatalf("Symlink %s: %s", link, err)
-	}
-
-	path := link + "/foo"
-	err = MkdirAll(path, 0755)
-	if err != nil {
-		t.Errorf("MkdirAll %q: %s", path, err)
-	}
-}
-
-func TestMkdirAllAtSlash(t *testing.T) {
-	switch runtime.GOOS {
-	case "android", "plan9", "windows":
-		t.Skipf("skipping on %s", runtime.GOOS)
-	case "darwin":
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			t.Skipf("skipping on darwin/%s, mkdir returns EPERM", runtime.GOARCH)
-		}
-	}
-	RemoveAll("/_go_os_test")
-	const dir = "/_go_os_test/dir"
-	err := MkdirAll(dir, 0777)
-	if err != nil {
-		pathErr, ok := err.(*PathError)
-		// common for users not to be able to write to /
-		if ok && (pathErr.Err == syscall.EACCES || isReadonlyError(pathErr.Err)) {
-			t.Skipf("could not create %v: %v", dir, err)
-		}
-		t.Fatalf(`MkdirAll "/_go_os_test/dir": %v, %s`, err, pathErr.Err)
-	}
-	RemoveAll("/_go_os_test")
-}
diff --git a/third_party/gofrontend/libgo/go/os/path_unix.go b/third_party/gofrontend/libgo/go/os/path_unix.go
deleted file mode 100644
index 36f8e61..0000000
--- a/third_party/gofrontend/libgo/go/os/path_unix.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package os
-
-const (
-	PathSeparator     = '/' // OS-specific path separator
-	PathListSeparator = ':' // OS-specific path list separator
-)
-
-// IsPathSeparator reports whether c is a directory separator character.
-func IsPathSeparator(c uint8) bool {
-	return PathSeparator == c
-}
diff --git a/third_party/gofrontend/libgo/go/os/path_windows.go b/third_party/gofrontend/libgo/go/os/path_windows.go
deleted file mode 100644
index c96f137..0000000
--- a/third_party/gofrontend/libgo/go/os/path_windows.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-const (
-	PathSeparator     = '\\' // OS-specific path separator
-	PathListSeparator = ';'  // OS-specific path list separator
-)
-
-// IsPathSeparator reports whether c is a directory separator character.
-func IsPathSeparator(c uint8) bool {
-	// NOTE: Windows accept / as path separator.
-	return c == '\\' || c == '/'
-}
diff --git a/third_party/gofrontend/libgo/go/os/pipe_bsd.go b/third_party/gofrontend/libgo/go/os/pipe_bsd.go
deleted file mode 100644
index 3b81ed2..0000000
--- a/third_party/gofrontend/libgo/go/os/pipe_bsd.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd nacl netbsd openbsd solaris
-
-package os
-
-import "syscall"
-
-// Pipe returns a connected pair of Files; reads from r return bytes written to w.
-// It returns the files and an error, if any.
-func Pipe() (r *File, w *File, err error) {
-	var p [2]int
-
-	// See ../syscall/exec.go for description of lock.
-	syscall.ForkLock.RLock()
-	e := syscall.Pipe(p[0:])
-	if e != nil {
-		syscall.ForkLock.RUnlock()
-		return nil, nil, NewSyscallError("pipe", e)
-	}
-	syscall.CloseOnExec(p[0])
-	syscall.CloseOnExec(p[1])
-	syscall.ForkLock.RUnlock()
-
-	return NewFile(uintptr(p[0]), "|0"), NewFile(uintptr(p[1]), "|1"), nil
-}
diff --git a/third_party/gofrontend/libgo/go/os/pipe_linux.go b/third_party/gofrontend/libgo/go/os/pipe_linux.go
deleted file mode 100644
index 9bafad8..0000000
--- a/third_party/gofrontend/libgo/go/os/pipe_linux.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import "syscall"
-
-// Pipe returns a connected pair of Files; reads from r return bytes written to w.
-// It returns the files and an error, if any.
-func Pipe() (r *File, w *File, err error) {
-	var p [2]int
-
-	e := syscall.Pipe2(p[0:], syscall.O_CLOEXEC)
-	// pipe2 was added in 2.6.27 and our minimum requirement is 2.6.23, so it
-	// might not be implemented.
-	if e == syscall.ENOSYS {
-		// See ../syscall/exec.go for description of lock.
-		syscall.ForkLock.RLock()
-		e = syscall.Pipe(p[0:])
-		if e != nil {
-			syscall.ForkLock.RUnlock()
-			return nil, nil, NewSyscallError("pipe", e)
-		}
-		syscall.CloseOnExec(p[0])
-		syscall.CloseOnExec(p[1])
-		syscall.ForkLock.RUnlock()
-	} else if e != nil {
-		return nil, nil, NewSyscallError("pipe2", e)
-	}
-
-	return NewFile(uintptr(p[0]), "|0"), NewFile(uintptr(p[1]), "|1"), nil
-}
diff --git a/third_party/gofrontend/libgo/go/os/proc.go b/third_party/gofrontend/libgo/go/os/proc.go
deleted file mode 100644
index 33a8b26..0000000
--- a/third_party/gofrontend/libgo/go/os/proc.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Process etc.
-
-package os
-
-import (
-	"runtime"
-	"syscall"
-)
-
-// Args hold the command-line arguments, starting with the program name.
-var Args []string
-
-func init() {
-	if runtime.GOOS == "windows" {
-		// Initialized in exec_windows.go.
-		return
-	}
-	Args = runtime_args()
-}
-
-func runtime_args() []string // in package runtime
-
-// Getuid returns the numeric user id of the caller.
-func Getuid() int { return syscall.Getuid() }
-
-// Geteuid returns the numeric effective user id of the caller.
-func Geteuid() int { return syscall.Geteuid() }
-
-// Getgid returns the numeric group id of the caller.
-func Getgid() int { return syscall.Getgid() }
-
-// Getegid returns the numeric effective group id of the caller.
-func Getegid() int { return syscall.Getegid() }
-
-// Getgroups returns a list of the numeric ids of groups that the caller belongs to.
-func Getgroups() ([]int, error) {
-	gids, e := syscall.Getgroups()
-	return gids, NewSyscallError("getgroups", e)
-}
-
-// Exit causes the current program to exit with the given status code.
-// Conventionally, code zero indicates success, non-zero an error.
-// The program terminates immediately; deferred functions are not run.
-func Exit(code int) {
-	if code == 0 {
-		// Give race detector a chance to fail the program.
-		// Racy programs do not have the right to finish successfully.
-		runtime_beforeExit()
-	}
-	syscall.Exit(code)
-}
-
-func runtime_beforeExit() // implemented in runtime
diff --git a/third_party/gofrontend/libgo/go/os/signal/signal.go b/third_party/gofrontend/libgo/go/os/signal/signal.go
deleted file mode 100644
index 1625786..0000000
--- a/third_party/gofrontend/libgo/go/os/signal/signal.go
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package signal implements access to incoming signals.
-package signal
-
-import (
-	"os"
-	"sync"
-)
-
-var handlers struct {
-	sync.Mutex
-	m   map[chan<- os.Signal]*handler
-	ref [numSig]int64
-}
-
-type handler struct {
-	mask [(numSig + 31) / 32]uint32
-}
-
-func (h *handler) want(sig int) bool {
-	return (h.mask[sig/32]>>uint(sig&31))&1 != 0
-}
-
-func (h *handler) set(sig int) {
-	h.mask[sig/32] |= 1 << uint(sig&31)
-}
-
-func (h *handler) clear(sig int) {
-	h.mask[sig/32] &^= 1 << uint(sig&31)
-}
-
-// Stop relaying the signals, sigs, to any channels previously registered to
-// receive them and either reset the signal handlers to their original values
-// (action=disableSignal) or ignore the signals (action=ignoreSignal).
-func cancel(sigs []os.Signal, action func(int)) {
-	handlers.Lock()
-	defer handlers.Unlock()
-
-	remove := func(n int) {
-		var zerohandler handler
-
-		for c, h := range handlers.m {
-			if h.want(n) {
-				handlers.ref[n]--
-				h.clear(n)
-				if h.mask == zerohandler.mask {
-					delete(handlers.m, c)
-				}
-			}
-		}
-
-		action(n)
-	}
-
-	if len(sigs) == 0 {
-		for n := 0; n < numSig; n++ {
-			remove(n)
-		}
-	} else {
-		for _, s := range sigs {
-			remove(signum(s))
-		}
-	}
-}
-
-// Ignore causes the provided signals to be ignored. If they are received by
-// the program, nothing will happen. Ignore undoes the effect of any prior
-// calls to Notify for the provided signals.
-// If no signals are provided, all incoming signals will be ignored.
-func Ignore(sig ...os.Signal) {
-	cancel(sig, ignoreSignal)
-}
-
-// Notify causes package signal to relay incoming signals to c.
-// If no signals are provided, all incoming signals will be relayed to c.
-// Otherwise, just the provided signals will.
-//
-// Package signal will not block sending to c: the caller must ensure
-// that c has sufficient buffer space to keep up with the expected
-// signal rate.  For a channel used for notification of just one signal value,
-// a buffer of size 1 is sufficient.
-//
-// It is allowed to call Notify multiple times with the same channel:
-// each call expands the set of signals sent to that channel.
-// The only way to remove signals from the set is to call Stop.
-//
-// It is allowed to call Notify multiple times with different channels
-// and the same signals: each channel receives copies of incoming
-// signals independently.
-func Notify(c chan<- os.Signal, sig ...os.Signal) {
-	if c == nil {
-		panic("os/signal: Notify using nil channel")
-	}
-
-	handlers.Lock()
-	defer handlers.Unlock()
-
-	h := handlers.m[c]
-	if h == nil {
-		if handlers.m == nil {
-			handlers.m = make(map[chan<- os.Signal]*handler)
-		}
-		h = new(handler)
-		handlers.m[c] = h
-	}
-
-	add := func(n int) {
-		if n < 0 {
-			return
-		}
-		if !h.want(n) {
-			h.set(n)
-			if handlers.ref[n] == 0 {
-				enableSignal(n)
-			}
-			handlers.ref[n]++
-		}
-	}
-
-	if len(sig) == 0 {
-		for n := 0; n < numSig; n++ {
-			add(n)
-		}
-	} else {
-		for _, s := range sig {
-			add(signum(s))
-		}
-	}
-}
-
-// Reset undoes the effect of any prior calls to Notify for the provided
-// signals.
-// If no signals are provided, all signal handlers will be reset.
-func Reset(sig ...os.Signal) {
-	cancel(sig, disableSignal)
-}
-
-// Stop causes package signal to stop relaying incoming signals to c.
-// It undoes the effect of all prior calls to Notify using c.
-// When Stop returns, it is guaranteed that c will receive no more signals.
-func Stop(c chan<- os.Signal) {
-	handlers.Lock()
-	defer handlers.Unlock()
-
-	h := handlers.m[c]
-	if h == nil {
-		return
-	}
-	delete(handlers.m, c)
-
-	for n := 0; n < numSig; n++ {
-		if h.want(n) {
-			handlers.ref[n]--
-			if handlers.ref[n] == 0 {
-				disableSignal(n)
-			}
-		}
-	}
-}
-
-func process(sig os.Signal) {
-	n := signum(sig)
-	if n < 0 {
-		return
-	}
-
-	handlers.Lock()
-	defer handlers.Unlock()
-
-	for c, h := range handlers.m {
-		if h.want(n) {
-			// send but do not block for it
-			select {
-			case c <- sig:
-			default:
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/os/signal/signal_plan9.go b/third_party/gofrontend/libgo/go/os/signal/signal_plan9.go
deleted file mode 100644
index b065ae5..0000000
--- a/third_party/gofrontend/libgo/go/os/signal/signal_plan9.go
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package signal
-
-import (
-	"os"
-	"syscall"
-)
-
-var sigtab = make(map[os.Signal]int)
-
-// In sig.s; jumps to runtime.
-func signal_disable(uint32)
-func signal_enable(uint32)
-func signal_ignore(uint32)
-func signal_recv() string
-
-func init() {
-	signal_enable(0) // first call - initialize
-	go loop()
-}
-
-func loop() {
-	for {
-		process(syscall.Note(signal_recv()))
-	}
-}
-
-const numSig = 256
-
-func signum(sig os.Signal) int {
-	switch sig := sig.(type) {
-	case syscall.Note:
-		n, ok := sigtab[sig]
-		if !ok {
-			n = len(sigtab) + 1
-			if n > numSig {
-				return -1
-			}
-			sigtab[sig] = n
-		}
-		return n
-	default:
-		return -1
-	}
-}
-
-func enableSignal(sig int) {
-	signal_enable(uint32(sig))
-}
-
-func disableSignal(sig int) {
-	signal_disable(uint32(sig))
-}
-
-func ignoreSignal(sig int) {
-	signal_ignore(uint32(sig))
-}
diff --git a/third_party/gofrontend/libgo/go/os/signal/signal_plan9_test.go b/third_party/gofrontend/libgo/go/os/signal/signal_plan9_test.go
deleted file mode 100644
index 10bfdc3..0000000
--- a/third_party/gofrontend/libgo/go/os/signal/signal_plan9_test.go
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package signal
-
-import (
-	"os"
-	"runtime"
-	"syscall"
-	"testing"
-	"time"
-)
-
-func waitSig(t *testing.T, c <-chan os.Signal, sig os.Signal) {
-	select {
-	case s := <-c:
-		if s != sig {
-			t.Fatalf("signal was %v, want %v", s, sig)
-		}
-	case <-time.After(1 * time.Second):
-		t.Fatalf("timeout waiting for %v", sig)
-	}
-}
-
-// Test that basic signal handling works.
-func TestSignal(t *testing.T) {
-	// Ask for hangup
-	c := make(chan os.Signal, 1)
-	Notify(c, syscall.Note("hangup"))
-	defer Stop(c)
-
-	// Send this process a hangup
-	t.Logf("hangup...")
-	postNote(syscall.Getpid(), "hangup")
-	waitSig(t, c, syscall.Note("hangup"))
-
-	// Ask for everything we can get.
-	c1 := make(chan os.Signal, 1)
-	Notify(c1)
-
-	// Send this process an alarm
-	t.Logf("alarm...")
-	postNote(syscall.Getpid(), "alarm")
-	waitSig(t, c1, syscall.Note("alarm"))
-
-	// Send two more hangups, to make sure that
-	// they get delivered on c1 and that not reading
-	// from c does not block everything.
-	t.Logf("hangup...")
-	postNote(syscall.Getpid(), "hangup")
-	waitSig(t, c1, syscall.Note("hangup"))
-	t.Logf("hangup...")
-	postNote(syscall.Getpid(), "hangup")
-	waitSig(t, c1, syscall.Note("hangup"))
-
-	// The first SIGHUP should be waiting for us on c.
-	waitSig(t, c, syscall.Note("hangup"))
-}
-
-func TestStress(t *testing.T) {
-	dur := 3 * time.Second
-	if testing.Short() {
-		dur = 100 * time.Millisecond
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
-	done := make(chan bool)
-	finished := make(chan bool)
-	go func() {
-		sig := make(chan os.Signal, 1)
-		Notify(sig, syscall.Note("alarm"))
-		defer Stop(sig)
-	Loop:
-		for {
-			select {
-			case <-sig:
-			case <-done:
-				break Loop
-			}
-		}
-		finished <- true
-	}()
-	go func() {
-	Loop:
-		for {
-			select {
-			case <-done:
-				break Loop
-			default:
-				postNote(syscall.Getpid(), "alarm")
-				runtime.Gosched()
-			}
-		}
-		finished <- true
-	}()
-	time.Sleep(dur)
-	close(done)
-	<-finished
-	<-finished
-	// When run with 'go test -cpu=1,2,4' alarm from this test can slip
-	// into subsequent TestSignal() causing failure.
-	// Sleep for a while to reduce the possibility of the failure.
-	time.Sleep(10 * time.Millisecond)
-}
-
-// Test that Stop cancels the channel's registrations.
-func TestStop(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in short mode")
-	}
-	sigs := []string{
-		"alarm",
-		"hangup",
-	}
-
-	for _, sig := range sigs {
-		// Send the signal.
-		// If it's alarm, we should not see it.
-		// If it's hangup, maybe we'll die. Let the flag tell us what to do.
-		if sig != "hangup" {
-			postNote(syscall.Getpid(), sig)
-		}
-		time.Sleep(100 * time.Millisecond)
-
-		// Ask for signal
-		c := make(chan os.Signal, 1)
-		Notify(c, syscall.Note(sig))
-		defer Stop(c)
-
-		// Send this process that signal
-		postNote(syscall.Getpid(), sig)
-		waitSig(t, c, syscall.Note(sig))
-
-		Stop(c)
-		select {
-		case s := <-c:
-			t.Fatalf("unexpected signal %v", s)
-		case <-time.After(100 * time.Millisecond):
-			// nothing to read - good
-		}
-
-		// Send the signal.
-		// If it's alarm, we should not see it.
-		// If it's hangup, maybe we'll die. Let the flag tell us what to do.
-		if sig != "hangup" {
-			postNote(syscall.Getpid(), sig)
-		}
-
-		select {
-		case s := <-c:
-			t.Fatalf("unexpected signal %v", s)
-		case <-time.After(100 * time.Millisecond):
-			// nothing to read - good
-		}
-	}
-}
-
-func itoa(val int) string {
-	if val < 0 {
-		return "-" + itoa(-val)
-	}
-	var buf [32]byte // big enough for int64
-	i := len(buf) - 1
-	for val >= 10 {
-		buf[i] = byte(val%10 + '0')
-		i--
-		val /= 10
-	}
-	buf[i] = byte(val + '0')
-	return string(buf[i:])
-}
-
-func postNote(pid int, note string) error {
-	f, err := os.OpenFile("/proc/"+itoa(pid)+"/note", os.O_WRONLY, 0)
-	if err != nil {
-		return err
-	}
-	defer f.Close()
-	_, err = f.Write([]byte(note))
-	return err
-}
diff --git a/third_party/gofrontend/libgo/go/os/signal/signal_test.go b/third_party/gofrontend/libgo/go/os/signal/signal_test.go
deleted file mode 100644
index a71633c..0000000
--- a/third_party/gofrontend/libgo/go/os/signal/signal_test.go
+++ /dev/null
@@ -1,274 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package signal
-
-import (
-	"flag"
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"runtime"
-	"strconv"
-	"syscall"
-	"testing"
-	"time"
-)
-
-func waitSig(t *testing.T, c <-chan os.Signal, sig os.Signal) {
-	select {
-	case s := <-c:
-		if s != sig {
-			t.Fatalf("signal was %v, want %v", s, sig)
-		}
-	case <-time.After(1 * time.Second):
-		t.Fatalf("timeout waiting for %v", sig)
-	}
-}
-
-// Test that basic signal handling works.
-func TestSignal(t *testing.T) {
-	// Ask for SIGHUP
-	c := make(chan os.Signal, 1)
-	Notify(c, syscall.SIGHUP)
-	defer Stop(c)
-
-	// Send this process a SIGHUP
-	t.Logf("sighup...")
-	syscall.Kill(syscall.Getpid(), syscall.SIGHUP)
-	waitSig(t, c, syscall.SIGHUP)
-
-	// Ask for everything we can get.
-	c1 := make(chan os.Signal, 1)
-	Notify(c1)
-
-	// Send this process a SIGWINCH
-	t.Logf("sigwinch...")
-	syscall.Kill(syscall.Getpid(), syscall.SIGWINCH)
-	waitSig(t, c1, syscall.SIGWINCH)
-
-	// Send two more SIGHUPs, to make sure that
-	// they get delivered on c1 and that not reading
-	// from c does not block everything.
-	t.Logf("sighup...")
-	syscall.Kill(syscall.Getpid(), syscall.SIGHUP)
-	waitSig(t, c1, syscall.SIGHUP)
-	t.Logf("sighup...")
-	syscall.Kill(syscall.Getpid(), syscall.SIGHUP)
-	waitSig(t, c1, syscall.SIGHUP)
-
-	// The first SIGHUP should be waiting for us on c.
-	waitSig(t, c, syscall.SIGHUP)
-}
-
-func TestStress(t *testing.T) {
-	dur := 3 * time.Second
-	if testing.Short() {
-		dur = 100 * time.Millisecond
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
-	done := make(chan bool)
-	finished := make(chan bool)
-	go func() {
-		sig := make(chan os.Signal, 1)
-		Notify(sig, syscall.SIGUSR1)
-		defer Stop(sig)
-	Loop:
-		for {
-			select {
-			case <-sig:
-			case <-done:
-				break Loop
-			}
-		}
-		finished <- true
-	}()
-	go func() {
-	Loop:
-		for {
-			select {
-			case <-done:
-				break Loop
-			default:
-				syscall.Kill(syscall.Getpid(), syscall.SIGUSR1)
-				runtime.Gosched()
-			}
-		}
-		finished <- true
-	}()
-	time.Sleep(dur)
-	close(done)
-	<-finished
-	<-finished
-	// When run with 'go test -cpu=1,2,4' SIGUSR1 from this test can slip
-	// into subsequent TestSignal() causing failure.
-	// Sleep for a while to reduce the possibility of the failure.
-	time.Sleep(10 * time.Millisecond)
-}
-
-func testCancel(t *testing.T, ignore bool) {
-	// Send SIGWINCH. By default this signal should be ignored.
-	syscall.Kill(syscall.Getpid(), syscall.SIGWINCH)
-	time.Sleep(100 * time.Millisecond)
-
-	// Ask to be notified on c1 when a SIGWINCH is received.
-	c1 := make(chan os.Signal, 1)
-	Notify(c1, syscall.SIGWINCH)
-	defer Stop(c1)
-
-	// Ask to be notified on c2 when a SIGHUP is received.
-	c2 := make(chan os.Signal, 1)
-	Notify(c2, syscall.SIGHUP)
-	defer Stop(c2)
-
-	// Send this process a SIGWINCH and wait for notification on c1.
-	syscall.Kill(syscall.Getpid(), syscall.SIGWINCH)
-	waitSig(t, c1, syscall.SIGWINCH)
-
-	// Send this process a SIGHUP and wait for notification on c2.
-	syscall.Kill(syscall.Getpid(), syscall.SIGHUP)
-	waitSig(t, c2, syscall.SIGHUP)
-
-	// Ignore, or reset the signal handlers for, SIGWINCH and SIGHUP.
-	if ignore {
-		Ignore(syscall.SIGWINCH, syscall.SIGHUP)
-	} else {
-		Reset(syscall.SIGWINCH, syscall.SIGHUP)
-	}
-
-	// Send this process a SIGWINCH. It should be ignored.
-	syscall.Kill(syscall.Getpid(), syscall.SIGWINCH)
-
-	// If ignoring, Send this process a SIGHUP. It should be ignored.
-	if ignore {
-		syscall.Kill(syscall.Getpid(), syscall.SIGHUP)
-	}
-
-	select {
-	case s := <-c1:
-		t.Fatalf("unexpected signal %v", s)
-	case <-time.After(100 * time.Millisecond):
-		// nothing to read - good
-	}
-
-	select {
-	case s := <-c2:
-		t.Fatalf("unexpected signal %v", s)
-	case <-time.After(100 * time.Millisecond):
-		// nothing to read - good
-	}
-
-	// Reset the signal handlers for all signals.
-	Reset()
-}
-
-// Test that Reset cancels registration for listed signals on all channels.
-func TestReset(t *testing.T) {
-	testCancel(t, false)
-}
-
-// Test that Ignore cancels registration for listed signals on all channels.
-func TestIgnore(t *testing.T) {
-	testCancel(t, true)
-}
-
-var sendUncaughtSighup = flag.Int("send_uncaught_sighup", 0, "send uncaught SIGHUP during TestStop")
-
-// Test that Stop cancels the channel's registrations.
-func TestStop(t *testing.T) {
-	sigs := []syscall.Signal{
-		syscall.SIGWINCH,
-		syscall.SIGHUP,
-	}
-
-	for _, sig := range sigs {
-		// Send the signal.
-		// If it's SIGWINCH, we should not see it.
-		// If it's SIGHUP, maybe we'll die. Let the flag tell us what to do.
-		if sig != syscall.SIGHUP || *sendUncaughtSighup == 1 {
-			syscall.Kill(syscall.Getpid(), sig)
-		}
-		time.Sleep(100 * time.Millisecond)
-
-		// Ask for signal
-		c := make(chan os.Signal, 1)
-		Notify(c, sig)
-		defer Stop(c)
-
-		// Send this process that signal
-		syscall.Kill(syscall.Getpid(), sig)
-		waitSig(t, c, sig)
-
-		Stop(c)
-		select {
-		case s := <-c:
-			t.Fatalf("unexpected signal %v", s)
-		case <-time.After(100 * time.Millisecond):
-			// nothing to read - good
-		}
-
-		// Send the signal.
-		// If it's SIGWINCH, we should not see it.
-		// If it's SIGHUP, maybe we'll die. Let the flag tell us what to do.
-		if sig != syscall.SIGHUP || *sendUncaughtSighup == 2 {
-			syscall.Kill(syscall.Getpid(), sig)
-		}
-
-		select {
-		case s := <-c:
-			t.Fatalf("unexpected signal %v", s)
-		case <-time.After(100 * time.Millisecond):
-			// nothing to read - good
-		}
-	}
-}
-
-// Test that when run under nohup, an uncaught SIGHUP does not kill the program,
-// but a
-func TestNohup(t *testing.T) {
-	// Ugly: ask for SIGHUP so that child will not have no-hup set
-	// even if test is running under nohup environment.
-	// We have no intention of reading from c.
-	c := make(chan os.Signal, 1)
-	Notify(c, syscall.SIGHUP)
-
-	// When run without nohup, the test should crash on an uncaught SIGHUP.
-	// When run under nohup, the test should ignore uncaught SIGHUPs,
-	// because the runtime is not supposed to be listening for them.
-	// Either way, TestStop should still be able to catch them when it wants them
-	// and then when it stops wanting them, the original behavior should resume.
-	//
-	// send_uncaught_sighup=1 sends the SIGHUP before starting to listen for SIGHUPs.
-	// send_uncaught_sighup=2 sends the SIGHUP after no longer listening for SIGHUPs.
-	//
-	// Both should fail without nohup and succeed with nohup.
-
-	for i := 1; i <= 2; i++ {
-		out, err := exec.Command(os.Args[0], "-test.run=TestStop", "-send_uncaught_sighup="+strconv.Itoa(i)).CombinedOutput()
-		if err == nil {
-			t.Fatalf("ran test with -send_uncaught_sighup=%d and it succeeded: expected failure.\nOutput:\n%s", i, out)
-		}
-	}
-
-	Stop(c)
-
-	// Again, this time with nohup, assuming we can find it.
-	_, err := os.Stat("/usr/bin/nohup")
-	if err != nil {
-		t.Skip("cannot find nohup; skipping second half of test")
-	}
-
-	for i := 1; i <= 2; i++ {
-		os.Remove("nohup.out")
-		out, err := exec.Command("/usr/bin/nohup", os.Args[0], "-test.run=TestStop", "-send_uncaught_sighup="+strconv.Itoa(i)).CombinedOutput()
-
-		data, _ := ioutil.ReadFile("nohup.out")
-		os.Remove("nohup.out")
-		if err != nil {
-			t.Fatalf("ran test with -send_uncaught_sighup=%d under nohup and it failed: expected success.\nError: %v\nOutput:\n%s%s", i, err, out, data)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/os/signal/signal_unix.go b/third_party/gofrontend/libgo/go/os/signal/signal_unix.go
deleted file mode 100644
index 1bdf1d7..0000000
--- a/third_party/gofrontend/libgo/go/os/signal/signal_unix.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
-
-package signal
-
-import (
-	"os"
-	"syscall"
-)
-
-// In assembly.
-func signal_disable(uint32)
-func signal_enable(uint32)
-func signal_ignore(uint32)
-func signal_recv() uint32
-
-func loop() {
-	for {
-		process(syscall.Signal(signal_recv()))
-	}
-}
-
-func init() {
-	signal_enable(0) // first call - initialize
-	go loop()
-}
-
-const (
-	numSig = 65 // max across all systems
-)
-
-func signum(sig os.Signal) int {
-	switch sig := sig.(type) {
-	case syscall.Signal:
-		i := int(sig)
-		if i < 0 || i >= numSig {
-			return -1
-		}
-		return i
-	default:
-		return -1
-	}
-}
-
-func enableSignal(sig int) {
-	signal_enable(uint32(sig))
-}
-
-func disableSignal(sig int) {
-	signal_disable(uint32(sig))
-}
-
-func ignoreSignal(sig int) {
-	signal_ignore(uint32(sig))
-}
diff --git a/third_party/gofrontend/libgo/go/os/stat.go b/third_party/gofrontend/libgo/go/os/stat.go
deleted file mode 100644
index 9758d33..0000000
--- a/third_party/gofrontend/libgo/go/os/stat.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"syscall"
-	"time"
-)
-
-func sameFile(fs1, fs2 *fileStat) bool {
-	stat1 := fs1.sys.(*syscall.Stat_t)
-	stat2 := fs2.sys.(*syscall.Stat_t)
-	return stat1.Dev == stat2.Dev && stat1.Ino == stat2.Ino
-}
-
-func fileInfoFromStat(st *syscall.Stat_t, name string) FileInfo {
-	fs := &fileStat{
-		name:    basename(name),
-		size:    int64(st.Size),
-		modTime: timespecToTime(st.Mtim),
-		sys:     st,
-	}
-	fs.mode = FileMode(st.Mode & 0777)
-	switch st.Mode & syscall.S_IFMT {
-	case syscall.S_IFBLK, syscall.S_IFCHR:
-		fs.mode |= ModeDevice
-	case syscall.S_IFDIR:
-		fs.mode |= ModeDir
-	case syscall.S_IFIFO:
-		fs.mode |= ModeNamedPipe
-	case syscall.S_IFLNK:
-		fs.mode |= ModeSymlink
-	case syscall.S_IFREG:
-		// nothing to do
-	case syscall.S_IFSOCK:
-		fs.mode |= ModeSocket
-	}
-	if st.Mode&syscall.S_ISGID != 0 {
-		fs.mode |= ModeSetgid
-	}
-	if st.Mode&syscall.S_ISUID != 0 {
-		fs.mode |= ModeSetuid
-	}
-	return fs
-}
-
-func timespecToTime(ts syscall.Timespec) time.Time {
-	return time.Unix(int64(ts.Sec), int64(ts.Nsec))
-}
-
-// For testing.
-func atime(fi FileInfo) time.Time {
-	return timespecToTime(fi.Sys().(*syscall.Stat_t).Atim)
-}
diff --git a/third_party/gofrontend/libgo/go/os/stat_atim.go b/third_party/gofrontend/libgo/go/os/stat_atim.go
deleted file mode 100644
index 605c1d9..0000000
--- a/third_party/gofrontend/libgo/go/os/stat_atim.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"syscall"
-	"time"
-)
-
-func sameFile(fs1, fs2 *fileStat) bool {
-	stat1 := fs1.sys.(*syscall.Stat_t)
-	stat2 := fs2.sys.(*syscall.Stat_t)
-	return stat1.Dev == stat2.Dev && stat1.Ino == stat2.Ino
-}
-
-func fileInfoFromStat(st *syscall.Stat_t, name string) FileInfo {
-	fs := &fileStat{
-		name:    basename(name),
-		size:    int64(st.Size),
-		modTime: timespecToTime(st.Mtim),
-		sys:     st,
-	}
-	fs.mode = FileMode(st.Mode & 0777)
-	switch st.Mode & syscall.S_IFMT {
-	case syscall.S_IFBLK:
-		fs.mode |= ModeDevice
-	case syscall.S_IFCHR:
-		fs.mode |= ModeDevice | ModeCharDevice
-	case syscall.S_IFDIR:
-		fs.mode |= ModeDir
-	case syscall.S_IFIFO:
-		fs.mode |= ModeNamedPipe
-	case syscall.S_IFLNK:
-		fs.mode |= ModeSymlink
-	case syscall.S_IFREG:
-		// nothing to do
-	case syscall.S_IFSOCK:
-		fs.mode |= ModeSocket
-	}
-	if st.Mode&syscall.S_ISGID != 0 {
-		fs.mode |= ModeSetgid
-	}
-	if st.Mode&syscall.S_ISUID != 0 {
-		fs.mode |= ModeSetuid
-	}
-	if st.Mode&syscall.S_ISVTX != 0 {
-		fs.mode |= ModeSticky
-	}
-	return fs
-}
-
-func timespecToTime(ts syscall.Timespec) time.Time {
-	return time.Unix(int64(ts.Sec), int64(ts.Nsec))
-}
-
-// For testing.
-func atime(fi FileInfo) time.Time {
-	return timespecToTime(fi.Sys().(*syscall.Stat_t).Atim)
-}
diff --git a/third_party/gofrontend/libgo/go/os/stat_atimespec.go b/third_party/gofrontend/libgo/go/os/stat_atimespec.go
deleted file mode 100644
index 2ffb60f..0000000
--- a/third_party/gofrontend/libgo/go/os/stat_atimespec.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"syscall"
-	"time"
-)
-
-func sameFile(fs1, fs2 *fileStat) bool {
-	stat1 := fs1.sys.(*syscall.Stat_t)
-	stat2 := fs2.sys.(*syscall.Stat_t)
-	return stat1.Dev == stat2.Dev && stat1.Ino == stat2.Ino
-}
-
-func fileInfoFromStat(st *syscall.Stat_t, name string) FileInfo {
-	fs := &fileStat{
-		name:    basename(name),
-		size:    int64(st.Size),
-		modTime: timespecToTime(st.Mtimespec),
-		sys:     st,
-	}
-	fs.mode = FileMode(st.Mode & 0777)
-	switch st.Mode & syscall.S_IFMT {
-	case syscall.S_IFBLK:
-		fs.mode |= ModeDevice
-	case syscall.S_IFCHR:
-		fs.mode |= ModeDevice | ModeCharDevice
-	case syscall.S_IFDIR:
-		fs.mode |= ModeDir
-	case syscall.S_IFIFO:
-		fs.mode |= ModeNamedPipe
-	case syscall.S_IFLNK:
-		fs.mode |= ModeSymlink
-	case syscall.S_IFREG:
-		// nothing to do
-	case syscall.S_IFSOCK:
-		fs.mode |= ModeSocket
-	}
-	if st.Mode&syscall.S_ISGID != 0 {
-		fs.mode |= ModeSetgid
-	}
-	if st.Mode&syscall.S_ISUID != 0 {
-		fs.mode |= ModeSetuid
-	}
-	if st.Mode&syscall.S_ISVTX != 0 {
-		fs.mode |= ModeSticky
-	}
-	return fs
-}
-
-func timespecToTime(ts syscall.Timespec) time.Time {
-	return time.Unix(int64(ts.Sec), int64(ts.Nsec))
-}
-
-// For testing.
-func atime(fi FileInfo) time.Time {
-	return timespecToTime(fi.Sys().(*syscall.Stat_t).Atimespec)
-}
diff --git a/third_party/gofrontend/libgo/go/os/stat_dragonfly.go b/third_party/gofrontend/libgo/go/os/stat_dragonfly.go
deleted file mode 100644
index 605c1d9..0000000
--- a/third_party/gofrontend/libgo/go/os/stat_dragonfly.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"syscall"
-	"time"
-)
-
-func sameFile(fs1, fs2 *fileStat) bool {
-	stat1 := fs1.sys.(*syscall.Stat_t)
-	stat2 := fs2.sys.(*syscall.Stat_t)
-	return stat1.Dev == stat2.Dev && stat1.Ino == stat2.Ino
-}
-
-func fileInfoFromStat(st *syscall.Stat_t, name string) FileInfo {
-	fs := &fileStat{
-		name:    basename(name),
-		size:    int64(st.Size),
-		modTime: timespecToTime(st.Mtim),
-		sys:     st,
-	}
-	fs.mode = FileMode(st.Mode & 0777)
-	switch st.Mode & syscall.S_IFMT {
-	case syscall.S_IFBLK:
-		fs.mode |= ModeDevice
-	case syscall.S_IFCHR:
-		fs.mode |= ModeDevice | ModeCharDevice
-	case syscall.S_IFDIR:
-		fs.mode |= ModeDir
-	case syscall.S_IFIFO:
-		fs.mode |= ModeNamedPipe
-	case syscall.S_IFLNK:
-		fs.mode |= ModeSymlink
-	case syscall.S_IFREG:
-		// nothing to do
-	case syscall.S_IFSOCK:
-		fs.mode |= ModeSocket
-	}
-	if st.Mode&syscall.S_ISGID != 0 {
-		fs.mode |= ModeSetgid
-	}
-	if st.Mode&syscall.S_ISUID != 0 {
-		fs.mode |= ModeSetuid
-	}
-	if st.Mode&syscall.S_ISVTX != 0 {
-		fs.mode |= ModeSticky
-	}
-	return fs
-}
-
-func timespecToTime(ts syscall.Timespec) time.Time {
-	return time.Unix(int64(ts.Sec), int64(ts.Nsec))
-}
-
-// For testing.
-func atime(fi FileInfo) time.Time {
-	return timespecToTime(fi.Sys().(*syscall.Stat_t).Atim)
-}
diff --git a/third_party/gofrontend/libgo/go/os/stat_nacl.go b/third_party/gofrontend/libgo/go/os/stat_nacl.go
deleted file mode 100644
index a503b59..0000000
--- a/third_party/gofrontend/libgo/go/os/stat_nacl.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"syscall"
-	"time"
-)
-
-func sameFile(fs1, fs2 *fileStat) bool {
-	stat1 := fs1.sys.(*syscall.Stat_t)
-	stat2 := fs2.sys.(*syscall.Stat_t)
-	return stat1.Dev == stat2.Dev && stat1.Ino == stat2.Ino
-}
-
-func fileInfoFromStat(st *syscall.Stat_t, name string) FileInfo {
-	fs := &fileStat{
-		name:    basename(name),
-		size:    int64(st.Size),
-		modTime: timespecToTime(st.Mtime, st.MtimeNsec),
-		sys:     st,
-	}
-	fs.mode = FileMode(st.Mode & 0777)
-	switch st.Mode & syscall.S_IFMT {
-	case syscall.S_IFBLK:
-		fs.mode |= ModeDevice
-	case syscall.S_IFCHR:
-		fs.mode |= ModeDevice | ModeCharDevice
-	case syscall.S_IFDIR:
-		fs.mode |= ModeDir
-	case syscall.S_IFIFO:
-		fs.mode |= ModeNamedPipe
-	case syscall.S_IFLNK:
-		fs.mode |= ModeSymlink
-	case syscall.S_IFREG:
-		// nothing to do
-	case syscall.S_IFSOCK:
-		fs.mode |= ModeSocket
-	}
-	if st.Mode&syscall.S_ISGID != 0 {
-		fs.mode |= ModeSetgid
-	}
-	if st.Mode&syscall.S_ISUID != 0 {
-		fs.mode |= ModeSetuid
-	}
-	if st.Mode&syscall.S_ISVTX != 0 {
-		fs.mode |= ModeSticky
-	}
-	return fs
-}
-
-func timespecToTime(sec, nsec int64) time.Time {
-	return time.Unix(sec, nsec)
-}
-
-// For testing.
-func atime(fi FileInfo) time.Time {
-	st := fi.Sys().(*syscall.Stat_t)
-	return timespecToTime(st.Atime, st.AtimeNsec)
-}
diff --git a/third_party/gofrontend/libgo/go/os/stat_plan9.go b/third_party/gofrontend/libgo/go/os/stat_plan9.go
deleted file mode 100644
index fa4bd83..0000000
--- a/third_party/gofrontend/libgo/go/os/stat_plan9.go
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"syscall"
-	"time"
-)
-
-const _BIT16SZ = 2
-
-func sameFile(fs1, fs2 *fileStat) bool {
-	a := fs1.sys.(*syscall.Dir)
-	b := fs2.sys.(*syscall.Dir)
-	return a.Qid.Path == b.Qid.Path && a.Type == b.Type && a.Dev == b.Dev
-}
-
-func fileInfoFromStat(d *syscall.Dir) FileInfo {
-	fs := &fileStat{
-		name:    d.Name,
-		size:    int64(d.Length),
-		modTime: time.Unix(int64(d.Mtime), 0),
-		sys:     d,
-	}
-	fs.mode = FileMode(d.Mode & 0777)
-	if d.Mode&syscall.DMDIR != 0 {
-		fs.mode |= ModeDir
-	}
-	if d.Mode&syscall.DMAPPEND != 0 {
-		fs.mode |= ModeAppend
-	}
-	if d.Mode&syscall.DMEXCL != 0 {
-		fs.mode |= ModeExclusive
-	}
-	if d.Mode&syscall.DMTMP != 0 {
-		fs.mode |= ModeTemporary
-	}
-	return fs
-}
-
-// arg is an open *File or a path string.
-func dirstat(arg interface{}) (*syscall.Dir, error) {
-	var name string
-	var err error
-
-	size := syscall.STATFIXLEN + 16*4
-
-	for i := 0; i < 2; i++ {
-		buf := make([]byte, _BIT16SZ+size)
-
-		var n int
-		switch a := arg.(type) {
-		case *File:
-			name = a.name
-			n, err = syscall.Fstat(a.fd, buf)
-		case string:
-			name = a
-			n, err = syscall.Stat(a, buf)
-		default:
-			panic("phase error in dirstat")
-		}
-
-		if n < _BIT16SZ {
-			return nil, &PathError{"stat", name, err}
-		}
-
-		// Pull the real size out of the stat message.
-		size = int(uint16(buf[0]) | uint16(buf[1])<<8)
-
-		// If the stat message is larger than our buffer we will
-		// go around the loop and allocate one that is big enough.
-		if size <= n {
-			d, err := syscall.UnmarshalDir(buf[:n])
-			if err != nil {
-				return nil, &PathError{"stat", name, err}
-			}
-			return d, nil
-		}
-
-	}
-
-	if err == nil {
-		err = syscall.ErrBadStat
-	}
-
-	return nil, &PathError{"stat", name, err}
-}
-
-// Stat returns a FileInfo describing the named file.
-// If there is an error, it will be of type *PathError.
-func Stat(name string) (FileInfo, error) {
-	d, err := dirstat(name)
-	if err != nil {
-		return nil, err
-	}
-	return fileInfoFromStat(d), nil
-}
-
-// Lstat returns a FileInfo describing the named file.
-// If the file is a symbolic link, the returned FileInfo
-// describes the symbolic link.  Lstat makes no attempt to follow the link.
-// If there is an error, it will be of type *PathError.
-func Lstat(name string) (FileInfo, error) {
-	return Stat(name)
-}
-
-// For testing.
-func atime(fi FileInfo) time.Time {
-	return time.Unix(int64(fi.Sys().(*syscall.Dir).Atime), 0)
-}
diff --git a/third_party/gofrontend/libgo/go/os/stat_solaris.go b/third_party/gofrontend/libgo/go/os/stat_solaris.go
deleted file mode 100644
index 3e88bd8..0000000
--- a/third_party/gofrontend/libgo/go/os/stat_solaris.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"syscall"
-	"time"
-)
-
-func sameFile(fs1, fs2 *fileStat) bool {
-	stat1 := fs1.sys.(*syscall.Stat_t)
-	stat2 := fs2.sys.(*syscall.Stat_t)
-	return stat1.Dev == stat2.Dev && stat1.Ino == stat2.Ino
-}
-
-func fileInfoFromStat(st *syscall.Stat_t, name string) FileInfo {
-	fs := &fileStat{
-		name:    basename(name),
-		size:    int64(st.Size),
-		modTime: timestrucToTime(st.Mtim),
-		sys:     st,
-	}
-	fs.mode = FileMode(st.Mode & 0777)
-	switch st.Mode & syscall.S_IFMT {
-	case syscall.S_IFBLK:
-		fs.mode |= ModeDevice
-	case syscall.S_IFCHR:
-		fs.mode |= ModeDevice | ModeCharDevice
-	case syscall.S_IFDIR:
-		fs.mode |= ModeDir
-	case syscall.S_IFIFO:
-		fs.mode |= ModeNamedPipe
-	case syscall.S_IFLNK:
-		fs.mode |= ModeSymlink
-	case syscall.S_IFREG:
-		// nothing to do
-	case syscall.S_IFSOCK:
-		fs.mode |= ModeSocket
-	}
-	if st.Mode&syscall.S_ISGID != 0 {
-		fs.mode |= ModeSetgid
-	}
-	if st.Mode&syscall.S_ISUID != 0 {
-		fs.mode |= ModeSetuid
-	}
-	if st.Mode&syscall.S_ISVTX != 0 {
-		fs.mode |= ModeSticky
-	}
-	return fs
-}
-
-func timestrucToTime(ts syscall.Timestruc) time.Time {
-	return time.Unix(int64(ts.Sec), int64(ts.Nsec))
-}
-
-// For testing.
-func atime(fi FileInfo) time.Time {
-	return timestrucToTime(fi.(*fileStat).Sys().(*syscall.Stat_t).Atim)
-}
diff --git a/third_party/gofrontend/libgo/go/os/sticky_bsd.go b/third_party/gofrontend/libgo/go/os/sticky_bsd.go
deleted file mode 100644
index 6b54c75..0000000
--- a/third_party/gofrontend/libgo/go/os/sticky_bsd.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd solaris
-
-package os
-
-// According to sticky(8), neither open(2) nor mkdir(2) will create
-// a file with the sticky bit set.
-const supportsCreateWithStickyBit = false
diff --git a/third_party/gofrontend/libgo/go/os/sticky_notbsd.go b/third_party/gofrontend/libgo/go/os/sticky_notbsd.go
deleted file mode 100644
index 834e79b..0000000
--- a/third_party/gofrontend/libgo/go/os/sticky_notbsd.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !darwin
-// +build !dragonfly
-// +build !freebsd
-// +build !netbsd
-// +build !openbsd
-// +build !solaris
-
-package os
-
-const supportsCreateWithStickyBit = true
diff --git a/third_party/gofrontend/libgo/go/os/str.go b/third_party/gofrontend/libgo/go/os/str.go
deleted file mode 100644
index d3e03e9..0000000
--- a/third_party/gofrontend/libgo/go/os/str.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Simple converions to avoid depending on strconv.
-
-package os
-
-// Convert integer to decimal string
-func itoa(val int) string {
-	if val < 0 {
-		return "-" + uitoa(uint(-val))
-	}
-	return uitoa(uint(val))
-}
-
-// Convert unsigned integer to decimal string
-func uitoa(val uint) string {
-	if val == 0 { // avoid string allocation
-		return "0"
-	}
-	var buf [20]byte // big enough for 64bit value base 10
-	i := len(buf) - 1
-	for val >= 10 {
-		q := val / 10
-		buf[i] = byte('0' + val - q*10)
-		i--
-		val = q
-	}
-	// val < 10
-	buf[i] = byte('0' + val)
-	return string(buf[i:])
-}
diff --git a/third_party/gofrontend/libgo/go/os/sys_bsd.go b/third_party/gofrontend/libgo/go/os/sys_bsd.go
deleted file mode 100644
index 8ad5e21..0000000
--- a/third_party/gofrontend/libgo/go/os/sys_bsd.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd nacl netbsd openbsd
-
-// os code shared between *BSD systems including OS X (Darwin)
-// and FreeBSD.
-
-package os
-
-import "syscall"
-
-func hostname() (name string, err error) {
-	name, err = syscall.Sysctl("kern.hostname")
-	if err != nil {
-		return "", NewSyscallError("sysctl kern.hostname", err)
-	}
-	return name, nil
-}
diff --git a/third_party/gofrontend/libgo/go/os/sys_darwin.go b/third_party/gofrontend/libgo/go/os/sys_darwin.go
deleted file mode 100644
index 7a8330a..0000000
--- a/third_party/gofrontend/libgo/go/os/sys_darwin.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import "syscall"
-
-// supportsCloseOnExec reports whether the platform supports the
-// O_CLOEXEC flag.
-var supportsCloseOnExec bool
-
-func init() {
-	// Seems like kern.osreldate is veiled on latest OS X. We use
-	// kern.osrelease instead.
-	osver, err := syscall.Sysctl("kern.osrelease")
-	if err != nil {
-		return
-	}
-	var i int
-	for i = range osver {
-		if osver[i] != '.' {
-			continue
-		}
-	}
-	// The O_CLOEXEC flag was introduced in OS X 10.7 (Darwin
-	// 11.0.0). See http://support.apple.com/kb/HT1633.
-	if i > 2 || i == 2 && osver[0] >= '1' && osver[1] >= '1' {
-		supportsCloseOnExec = true
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/os/sys_freebsd.go b/third_party/gofrontend/libgo/go/os/sys_freebsd.go
deleted file mode 100644
index 273c2df..0000000
--- a/third_party/gofrontend/libgo/go/os/sys_freebsd.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import "syscall"
-
-// supportsCloseOnExec reports whether the platform supports the
-// O_CLOEXEC flag.
-var supportsCloseOnExec bool
-
-func init() {
-	osrel, err := syscall.SysctlUint32("kern.osreldate")
-	if err != nil {
-		return
-	}
-	// The O_CLOEXEC flag was introduced in FreeBSD 8.3.
-	// See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html.
-	if osrel >= 803000 {
-		supportsCloseOnExec = true
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/os/sys_linux.go b/third_party/gofrontend/libgo/go/os/sys_linux.go
deleted file mode 100644
index 76cdf50..0000000
--- a/third_party/gofrontend/libgo/go/os/sys_linux.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Linux-specific
-
-package os
-
-func hostname() (name string, err error) {
-	f, err := Open("/proc/sys/kernel/hostname")
-	if err != nil {
-		return "", err
-	}
-	defer f.Close()
-
-	var buf [512]byte // Enough for a DNS name.
-	n, err := f.Read(buf[0:])
-	if err != nil {
-		return "", err
-	}
-
-	if n > 0 && buf[n-1] == '\n' {
-		n--
-	}
-	return string(buf[0:n]), nil
-}
diff --git a/third_party/gofrontend/libgo/go/os/sys_nacl.go b/third_party/gofrontend/libgo/go/os/sys_nacl.go
deleted file mode 100644
index 07907c8..0000000
--- a/third_party/gofrontend/libgo/go/os/sys_nacl.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-// supportsCloseOnExec reports whether the platform supports the
-// O_CLOEXEC flag.
-const supportsCloseOnExec = false
diff --git a/third_party/gofrontend/libgo/go/os/sys_plan9.go b/third_party/gofrontend/libgo/go/os/sys_plan9.go
deleted file mode 100644
index 07a7905..0000000
--- a/third_party/gofrontend/libgo/go/os/sys_plan9.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Plan 9-specific
-
-package os
-
-func hostname() (name string, err error) {
-	f, err := Open("#c/sysname")
-	if err != nil {
-		return "", err
-	}
-	defer f.Close()
-
-	var buf [128]byte
-	n, err := f.Read(buf[:len(buf)-1])
-
-	if err != nil {
-		return "", err
-	}
-	if n > 0 {
-		buf[n] = 0
-	}
-	return string(buf[0:n]), nil
-}
diff --git a/third_party/gofrontend/libgo/go/os/sys_uname.go b/third_party/gofrontend/libgo/go/os/sys_uname.go
deleted file mode 100644
index 16568b6..0000000
--- a/third_party/gofrontend/libgo/go/os/sys_uname.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// For systems which only store the hostname in uname (Solaris).
-
-package os
-
-import "syscall"
-
-func hostname() (name string, err error) {
-	var u syscall.Utsname
-	if errno := syscall.Uname(&u); errno != nil {
-		return "", NewSyscallError("uname", errno)
-	}
-	b := make([]byte, len(u.Nodename))
-	i := 0
-	for ; i < len(u.Nodename); i++ {
-		if u.Nodename[i] == 0 {
-			break
-		}
-		b[i] = byte(u.Nodename[i])
-	}
-	return string(b[:i]), nil
-}
diff --git a/third_party/gofrontend/libgo/go/os/sys_unix.go b/third_party/gofrontend/libgo/go/os/sys_unix.go
deleted file mode 100644
index 39c20dc..0000000
--- a/third_party/gofrontend/libgo/go/os/sys_unix.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build dragonfly linux netbsd openbsd solaris
-
-package os
-
-// supportsCloseOnExec reports whether the platform supports the
-// O_CLOEXEC flag.
-const supportsCloseOnExec = true
diff --git a/third_party/gofrontend/libgo/go/os/types.go b/third_party/gofrontend/libgo/go/os/types.go
deleted file mode 100644
index 9d6f8e1..0000000
--- a/third_party/gofrontend/libgo/go/os/types.go
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"syscall"
-	"time"
-)
-
-// Getpagesize returns the underlying system's memory page size.
-func Getpagesize() int { return syscall.Getpagesize() }
-
-// A FileInfo describes a file and is returned by Stat and Lstat.
-type FileInfo interface {
-	Name() string       // base name of the file
-	Size() int64        // length in bytes for regular files; system-dependent for others
-	Mode() FileMode     // file mode bits
-	ModTime() time.Time // modification time
-	IsDir() bool        // abbreviation for Mode().IsDir()
-	Sys() interface{}   // underlying data source (can return nil)
-}
-
-// A FileMode represents a file's mode and permission bits.
-// The bits have the same definition on all systems, so that
-// information about files can be moved from one system
-// to another portably.  Not all bits apply to all systems.
-// The only required bit is ModeDir for directories.
-type FileMode uint32
-
-// The defined file mode bits are the most significant bits of the FileMode.
-// The nine least-significant bits are the standard Unix rwxrwxrwx permissions.
-// The values of these bits should be considered part of the public API and
-// may be used in wire protocols or disk representations: they must not be
-// changed, although new bits might be added.
-const (
-	// The single letters are the abbreviations
-	// used by the String method's formatting.
-	ModeDir        FileMode = 1 << (32 - 1 - iota) // d: is a directory
-	ModeAppend                                     // a: append-only
-	ModeExclusive                                  // l: exclusive use
-	ModeTemporary                                  // T: temporary file (not backed up)
-	ModeSymlink                                    // L: symbolic link
-	ModeDevice                                     // D: device file
-	ModeNamedPipe                                  // p: named pipe (FIFO)
-	ModeSocket                                     // S: Unix domain socket
-	ModeSetuid                                     // u: setuid
-	ModeSetgid                                     // g: setgid
-	ModeCharDevice                                 // c: Unix character device, when ModeDevice is set
-	ModeSticky                                     // t: sticky
-
-	// Mask for the type bits. For regular files, none will be set.
-	ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice
-
-	ModePerm FileMode = 0777 // Unix permission bits
-)
-
-func (m FileMode) String() string {
-	const str = "dalTLDpSugct"
-	var buf [32]byte // Mode is uint32.
-	w := 0
-	for i, c := range str {
-		if m&(1<<uint(32-1-i)) != 0 {
-			buf[w] = byte(c)
-			w++
-		}
-	}
-	if w == 0 {
-		buf[w] = '-'
-		w++
-	}
-	const rwx = "rwxrwxrwx"
-	for i, c := range rwx {
-		if m&(1<<uint(9-1-i)) != 0 {
-			buf[w] = byte(c)
-		} else {
-			buf[w] = '-'
-		}
-		w++
-	}
-	return string(buf[:w])
-}
-
-// IsDir reports whether m describes a directory.
-// That is, it tests for the ModeDir bit being set in m.
-func (m FileMode) IsDir() bool {
-	return m&ModeDir != 0
-}
-
-// IsRegular reports whether m describes a regular file.
-// That is, it tests that no mode type bits are set.
-func (m FileMode) IsRegular() bool {
-	return m&ModeType == 0
-}
-
-// Perm returns the Unix permission bits in m.
-func (m FileMode) Perm() FileMode {
-	return m & ModePerm
-}
-
-func (fs *fileStat) Name() string { return fs.name }
-func (fs *fileStat) IsDir() bool  { return fs.Mode().IsDir() }
-
-// SameFile reports whether fi1 and fi2 describe the same file.
-// For example, on Unix this means that the device and inode fields
-// of the two underlying structures are identical; on other systems
-// the decision may be based on the path names.
-// SameFile only applies to results returned by this package's Stat.
-// It returns false in other cases.
-func SameFile(fi1, fi2 FileInfo) bool {
-	fs1, ok1 := fi1.(*fileStat)
-	fs2, ok2 := fi2.(*fileStat)
-	if !ok1 || !ok2 {
-		return false
-	}
-	return sameFile(fs1, fs2)
-}
diff --git a/third_party/gofrontend/libgo/go/os/types_notwin.go b/third_party/gofrontend/libgo/go/os/types_notwin.go
deleted file mode 100644
index ea1a073..0000000
--- a/third_party/gofrontend/libgo/go/os/types_notwin.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !windows
-
-package os
-
-import (
-	"time"
-)
-
-// A fileStat is the implementation of FileInfo returned by Stat and Lstat.
-type fileStat struct {
-	name    string
-	size    int64
-	mode    FileMode
-	modTime time.Time
-	sys     interface{}
-}
-
-func (fs *fileStat) Size() int64        { return fs.size }
-func (fs *fileStat) Mode() FileMode     { return fs.mode }
-func (fs *fileStat) ModTime() time.Time { return fs.modTime }
-func (fs *fileStat) Sys() interface{}   { return fs.sys }
diff --git a/third_party/gofrontend/libgo/go/os/types_windows.go b/third_party/gofrontend/libgo/go/os/types_windows.go
deleted file mode 100644
index 7b2e546..0000000
--- a/third_party/gofrontend/libgo/go/os/types_windows.go
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package os
-
-import (
-	"sync"
-	"syscall"
-	"time"
-)
-
-// A fileStat is the implementation of FileInfo returned by Stat and Lstat.
-type fileStat struct {
-	name string
-	sys  syscall.Win32FileAttributeData
-
-	// used to implement SameFile
-	sync.Mutex
-	path  string
-	vol   uint32
-	idxhi uint32
-	idxlo uint32
-}
-
-func (fs *fileStat) Size() int64 {
-	return int64(fs.sys.FileSizeHigh)<<32 + int64(fs.sys.FileSizeLow)
-}
-
-func (fs *fileStat) Mode() (m FileMode) {
-	if fs == &devNullStat {
-		return ModeDevice | ModeCharDevice | 0666
-	}
-	if fs.sys.FileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 {
-		m |= ModeDir | 0111
-	}
-	if fs.sys.FileAttributes&syscall.FILE_ATTRIBUTE_READONLY != 0 {
-		m |= 0444
-	} else {
-		m |= 0666
-	}
-	if fs.sys.FileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT != 0 {
-		m |= ModeSymlink
-	}
-	return m
-}
-
-func (fs *fileStat) ModTime() time.Time {
-	return time.Unix(0, fs.sys.LastWriteTime.Nanoseconds())
-}
-
-// Sys returns syscall.Win32FileAttributeData for file fs.
-func (fs *fileStat) Sys() interface{} { return &fs.sys }
-
-func (fs *fileStat) loadFileId() error {
-	fs.Lock()
-	defer fs.Unlock()
-	if fs.path == "" {
-		// already done
-		return nil
-	}
-	pathp, err := syscall.UTF16PtrFromString(fs.path)
-	if err != nil {
-		return err
-	}
-	h, err := syscall.CreateFile(pathp, 0, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_BACKUP_SEMANTICS, 0)
-	if err != nil {
-		return err
-	}
-	defer syscall.CloseHandle(h)
-	var i syscall.ByHandleFileInformation
-	err = syscall.GetFileInformationByHandle(syscall.Handle(h), &i)
-	if err != nil {
-		return err
-	}
-	fs.path = ""
-	fs.vol = i.VolumeSerialNumber
-	fs.idxhi = i.FileIndexHigh
-	fs.idxlo = i.FileIndexLow
-	return nil
-}
-
-// devNullStat is fileStat structure describing DevNull file ("NUL").
-var devNullStat = fileStat{
-	name: DevNull,
-	// hopefully this will work for SameFile
-	vol:   0,
-	idxhi: 0,
-	idxlo: 0,
-}
-
-func sameFile(fs1, fs2 *fileStat) bool {
-	e := fs1.loadFileId()
-	if e != nil {
-		return false
-	}
-	e = fs2.loadFileId()
-	if e != nil {
-		return false
-	}
-	return fs1.vol == fs2.vol && fs1.idxhi == fs2.idxhi && fs1.idxlo == fs2.idxlo
-}
-
-// For testing.
-func atime(fi FileInfo) time.Time {
-	return time.Unix(0, fi.Sys().(*syscall.Win32FileAttributeData).LastAccessTime.Nanoseconds())
-}
diff --git a/third_party/gofrontend/libgo/go/os/user/decls_solaris.go b/third_party/gofrontend/libgo/go/os/user/decls_solaris.go
deleted file mode 100644
index 788a00f..0000000
--- a/third_party/gofrontend/libgo/go/os/user/decls_solaris.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build solaris
-// +build cgo
-
-package user
-
-import "syscall"
-
-// Declarations for the libc functions on Solaris.
-
-//extern __posix_getpwnam_r
-func libc_getpwnam_r(name *byte, pwd *syscall.Passwd, buf *byte, buflen syscall.Size_t, result **syscall.Passwd) int
-
-//extern __posix_getpwuid_r
-func libc_getpwuid_r(uid syscall.Uid_t, pwd *syscall.Passwd, buf *byte, buflen syscall.Size_t, result **syscall.Passwd) int
diff --git a/third_party/gofrontend/libgo/go/os/user/decls_unix.go b/third_party/gofrontend/libgo/go/os/user/decls_unix.go
deleted file mode 100644
index f76e4c9..0000000
--- a/third_party/gofrontend/libgo/go/os/user/decls_unix.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd
-// +build cgo
-
-package user
-
-import "syscall"
-
-// Declarations for the libc functions on most Unix systems.
-
-//extern getpwnam_r
-func libc_getpwnam_r(name *byte, pwd *syscall.Passwd, buf *byte, buflen syscall.Size_t, result **syscall.Passwd) int
-
-//extern getpwuid_r
-func libc_getpwuid_r(uid syscall.Uid_t, pwd *syscall.Passwd, buf *byte, buflen syscall.Size_t, result **syscall.Passwd) int
diff --git a/third_party/gofrontend/libgo/go/os/user/lookup.go b/third_party/gofrontend/libgo/go/os/user/lookup.go
deleted file mode 100644
index 09f00c7..0000000
--- a/third_party/gofrontend/libgo/go/os/user/lookup.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package user
-
-// Current returns the current user.
-func Current() (*User, error) {
-	return current()
-}
-
-// Lookup looks up a user by username. If the user cannot be found, the
-// returned error is of type UnknownUserError.
-func Lookup(username string) (*User, error) {
-	return lookup(username)
-}
-
-// LookupId looks up a user by userid. If the user cannot be found, the
-// returned error is of type UnknownUserIdError.
-func LookupId(uid string) (*User, error) {
-	return lookupId(uid)
-}
diff --git a/third_party/gofrontend/libgo/go/os/user/lookup_plan9.go b/third_party/gofrontend/libgo/go/os/user/lookup_plan9.go
deleted file mode 100644
index f7ef348..0000000
--- a/third_party/gofrontend/libgo/go/os/user/lookup_plan9.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package user
-
-import (
-	"fmt"
-	"io/ioutil"
-	"os"
-	"syscall"
-)
-
-// Partial os/user support on Plan 9.
-// Supports Current(), but not Lookup()/LookupId().
-// The latter two would require parsing /adm/users.
-const (
-	userFile = "/dev/user"
-)
-
-func current() (*User, error) {
-	ubytes, err := ioutil.ReadFile(userFile)
-	if err != nil {
-		return nil, fmt.Errorf("user: %s", err)
-	}
-
-	uname := string(ubytes)
-
-	u := &User{
-		Uid:      uname,
-		Gid:      uname,
-		Username: uname,
-		Name:     uname,
-		HomeDir:  os.Getenv("home"),
-	}
-
-	return u, nil
-}
-
-func lookup(username string) (*User, error) {
-	return nil, syscall.EPLAN9
-}
-
-func lookupId(uid string) (*User, error) {
-	return nil, syscall.EPLAN9
-}
diff --git a/third_party/gofrontend/libgo/go/os/user/lookup_stubs.go b/third_party/gofrontend/libgo/go/os/user/lookup_stubs.go
deleted file mode 100644
index 4fb0e3c..0000000
--- a/third_party/gofrontend/libgo/go/os/user/lookup_stubs.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !cgo,!windows,!plan9 android
-
-package user
-
-import (
-	"fmt"
-	"runtime"
-)
-
-func init() {
-	implemented = false
-}
-
-func current() (*User, error) {
-	return nil, fmt.Errorf("user: Current not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
-}
-
-func lookup(username string) (*User, error) {
-	return nil, fmt.Errorf("user: Lookup not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
-}
-
-func lookupId(uid string) (*User, error) {
-	return nil, fmt.Errorf("user: LookupId not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
-}
diff --git a/third_party/gofrontend/libgo/go/os/user/lookup_unix.go b/third_party/gofrontend/libgo/go/os/user/lookup_unix.go
deleted file mode 100644
index bebb9e8..0000000
--- a/third_party/gofrontend/libgo/go/os/user/lookup_unix.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd !android,linux netbsd openbsd solaris
-// +build cgo
-
-package user
-
-import (
-	"fmt"
-	"strconv"
-	"strings"
-	"syscall"
-	"unsafe"
-)
-
-/*
-#cgo solaris CFLAGS: -D_POSIX_PTHREAD_SEMANTICS
-#include <unistd.h>
-#include <sys/types.h>
-#include <pwd.h>
-#include <stdlib.h>
-
-static int mygetpwuid_r(int uid, struct passwd *pwd,
-	char *buf, size_t buflen, struct passwd **result) {
-	return getpwuid_r(uid, pwd, buf, buflen, result);
-}
-
-static int mygetpwnam_r(const char *name, struct passwd *pwd,
-	char *buf, size_t buflen, struct passwd **result) {
-	return getpwnam_r(name, pwd, buf, buflen, result);
-}
-*/
-
-// bytePtrToString takes a NUL-terminated array of bytes and convert
-// it to a Go string.
-func bytePtrToString(p *byte) string {
-	a := (*[10000]byte)(unsafe.Pointer(p))
-	i := 0
-	for a[i] != 0 {
-		i++
-	}
-	return string(a[:i])
-}
-
-func current() (*User, error) {
-	return lookupUnix(syscall.Getuid(), "", false)
-}
-
-func lookup(username string) (*User, error) {
-	return lookupUnix(-1, username, true)
-}
-
-func lookupId(uid string) (*User, error) {
-	i, e := strconv.Atoi(uid)
-	if e != nil {
-		return nil, e
-	}
-	return lookupUnix(i, "", false)
-}
-
-func lookupUnix(uid int, username string, lookupByName bool) (*User, error) {
-	var pwd syscall.Passwd
-	var result *syscall.Passwd
-
-	// FIXME: Should let buf grow if necessary.
-	const bufSize = 1024
-	buf := make([]byte, bufSize)
-	if lookupByName {
-		nameC := syscall.StringBytePtr(username)
-		syscall.Entersyscall()
-		rv := libc_getpwnam_r(nameC,
-			&pwd,
-			&buf[0],
-			bufSize,
-			&result)
-		syscall.Exitsyscall()
-		if rv != 0 {
-			return nil, fmt.Errorf("user: lookup username %s: %s", username, syscall.GetErrno())
-		}
-		if result == nil {
-			return nil, UnknownUserError(username)
-		}
-	} else {
-		syscall.Entersyscall()
-		rv := libc_getpwuid_r(syscall.Uid_t(uid),
-			&pwd,
-			&buf[0],
-			bufSize,
-			&result)
-		syscall.Exitsyscall()
-		if rv != 0 {
-			return nil, fmt.Errorf("user: lookup userid %d: %s", uid, syscall.GetErrno())
-		}
-		if result == nil {
-			return nil, UnknownUserIdError(uid)
-		}
-	}
-	u := &User{
-		Uid:      strconv.Itoa(int(pwd.Pw_uid)),
-		Gid:      strconv.Itoa(int(pwd.Pw_gid)),
-		Username: bytePtrToString((*byte)(unsafe.Pointer(pwd.Pw_name))),
-		Name:     bytePtrToString((*byte)(unsafe.Pointer(pwd.Pw_gecos))),
-		HomeDir:  bytePtrToString((*byte)(unsafe.Pointer(pwd.Pw_dir))),
-	}
-	// The pw_gecos field isn't quite standardized.  Some docs
-	// say: "It is expected to be a comma separated list of
-	// personal data where the first item is the full name of the
-	// user."
-	if i := strings.Index(u.Name, ","); i >= 0 {
-		u.Name = u.Name[:i]
-	}
-	return u, nil
-}
diff --git a/third_party/gofrontend/libgo/go/os/user/lookup_windows.go b/third_party/gofrontend/libgo/go/os/user/lookup_windows.go
deleted file mode 100644
index 99c325f..0000000
--- a/third_party/gofrontend/libgo/go/os/user/lookup_windows.go
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package user
-
-import (
-	"fmt"
-	"syscall"
-	"unsafe"
-)
-
-func isDomainJoined() (bool, error) {
-	var domain *uint16
-	var status uint32
-	err := syscall.NetGetJoinInformation(nil, &domain, &status)
-	if err != nil {
-		return false, err
-	}
-	syscall.NetApiBufferFree((*byte)(unsafe.Pointer(domain)))
-	return status == syscall.NetSetupDomainName, nil
-}
-
-func lookupFullNameDomain(domainAndUser string) (string, error) {
-	return syscall.TranslateAccountName(domainAndUser,
-		syscall.NameSamCompatible, syscall.NameDisplay, 50)
-}
-
-func lookupFullNameServer(servername, username string) (string, error) {
-	s, e := syscall.UTF16PtrFromString(servername)
-	if e != nil {
-		return "", e
-	}
-	u, e := syscall.UTF16PtrFromString(username)
-	if e != nil {
-		return "", e
-	}
-	var p *byte
-	e = syscall.NetUserGetInfo(s, u, 10, &p)
-	if e != nil {
-		return "", e
-	}
-	defer syscall.NetApiBufferFree(p)
-	i := (*syscall.UserInfo10)(unsafe.Pointer(p))
-	if i.FullName == nil {
-		return "", nil
-	}
-	name := syscall.UTF16ToString((*[1024]uint16)(unsafe.Pointer(i.FullName))[:])
-	return name, nil
-}
-
-func lookupFullName(domain, username, domainAndUser string) (string, error) {
-	joined, err := isDomainJoined()
-	if err == nil && joined {
-		name, err := lookupFullNameDomain(domainAndUser)
-		if err == nil {
-			return name, nil
-		}
-	}
-	name, err := lookupFullNameServer(domain, username)
-	if err == nil {
-		return name, nil
-	}
-	// domain worked neigher as a domain nor as a server
-	// could be domain server unavailable
-	// pretend username is fullname
-	return username, nil
-}
-
-func newUser(usid *syscall.SID, gid, dir string) (*User, error) {
-	username, domain, t, e := usid.LookupAccount("")
-	if e != nil {
-		return nil, e
-	}
-	if t != syscall.SidTypeUser {
-		return nil, fmt.Errorf("user: should be user account type, not %d", t)
-	}
-	domainAndUser := domain + `\` + username
-	uid, e := usid.String()
-	if e != nil {
-		return nil, e
-	}
-	name, e := lookupFullName(domain, username, domainAndUser)
-	if e != nil {
-		return nil, e
-	}
-	u := &User{
-		Uid:      uid,
-		Gid:      gid,
-		Username: domainAndUser,
-		Name:     name,
-		HomeDir:  dir,
-	}
-	return u, nil
-}
-
-func current() (*User, error) {
-	t, e := syscall.OpenCurrentProcessToken()
-	if e != nil {
-		return nil, e
-	}
-	defer t.Close()
-	u, e := t.GetTokenUser()
-	if e != nil {
-		return nil, e
-	}
-	pg, e := t.GetTokenPrimaryGroup()
-	if e != nil {
-		return nil, e
-	}
-	gid, e := pg.PrimaryGroup.String()
-	if e != nil {
-		return nil, e
-	}
-	dir, e := t.GetUserProfileDirectory()
-	if e != nil {
-		return nil, e
-	}
-	return newUser(u.User.Sid, gid, dir)
-}
-
-// BUG(brainman): Lookup and LookupId functions do not set
-// Gid and HomeDir fields in the User struct returned on windows.
-
-func newUserFromSid(usid *syscall.SID) (*User, error) {
-	// TODO(brainman): do not know where to get gid and dir fields
-	gid := "unknown"
-	dir := "Unknown directory"
-	return newUser(usid, gid, dir)
-}
-
-func lookup(username string) (*User, error) {
-	sid, _, t, e := syscall.LookupSID("", username)
-	if e != nil {
-		return nil, e
-	}
-	if t != syscall.SidTypeUser {
-		return nil, fmt.Errorf("user: should be user account type, not %d", t)
-	}
-	return newUserFromSid(sid)
-}
-
-func lookupId(uid string) (*User, error) {
-	sid, e := syscall.StringToSid(uid)
-	if e != nil {
-		return nil, e
-	}
-	return newUserFromSid(sid)
-}
diff --git a/third_party/gofrontend/libgo/go/os/user/user.go b/third_party/gofrontend/libgo/go/os/user/user.go
deleted file mode 100644
index e8680fe..0000000
--- a/third_party/gofrontend/libgo/go/os/user/user.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package user allows user account lookups by name or id.
-package user
-
-import (
-	"strconv"
-)
-
-var implemented = true // set to false by lookup_stubs.go's init
-
-// User represents a user account.
-//
-// On posix systems Uid and Gid contain a decimal number
-// representing uid and gid. On windows Uid and Gid
-// contain security identifier (SID) in a string format.
-// On Plan 9, Uid, Gid, Username, and Name will be the
-// contents of /dev/user.
-type User struct {
-	Uid      string // user id
-	Gid      string // primary group id
-	Username string
-	Name     string
-	HomeDir  string
-}
-
-// UnknownUserIdError is returned by LookupId when
-// a user cannot be found.
-type UnknownUserIdError int
-
-func (e UnknownUserIdError) Error() string {
-	return "user: unknown userid " + strconv.Itoa(int(e))
-}
-
-// UnknownUserError is returned by Lookup when
-// a user cannot be found.
-type UnknownUserError string
-
-func (e UnknownUserError) Error() string {
-	return "user: unknown user " + string(e)
-}
diff --git a/third_party/gofrontend/libgo/go/os/user/user_test.go b/third_party/gofrontend/libgo/go/os/user/user_test.go
deleted file mode 100644
index 9d9420e..0000000
--- a/third_party/gofrontend/libgo/go/os/user/user_test.go
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package user
-
-import (
-	"runtime"
-	"testing"
-)
-
-func check(t *testing.T) {
-	if !implemented {
-		t.Skip("user: not implemented; skipping tests")
-	}
-}
-
-func TestCurrent(t *testing.T) {
-	check(t)
-
-	u, err := Current()
-	if err != nil {
-		t.Fatalf("Current: %v", err)
-	}
-	if u.HomeDir == "" {
-		t.Errorf("didn't get a HomeDir")
-	}
-	if u.Username == "" {
-		t.Errorf("didn't get a username")
-	}
-}
-
-func compare(t *testing.T, want, got *User) {
-	if want.Uid != got.Uid {
-		t.Errorf("got Uid=%q; want %q", got.Uid, want.Uid)
-	}
-	if want.Username != got.Username {
-		t.Errorf("got Username=%q; want %q", got.Username, want.Username)
-	}
-	if want.Name != got.Name {
-		t.Errorf("got Name=%q; want %q", got.Name, want.Name)
-	}
-	// TODO(brainman): fix it once we know how.
-	if runtime.GOOS == "windows" {
-		t.Skip("skipping Gid and HomeDir comparisons")
-	}
-	if want.Gid != got.Gid {
-		t.Errorf("got Gid=%q; want %q", got.Gid, want.Gid)
-	}
-	if want.HomeDir != got.HomeDir {
-		t.Errorf("got HomeDir=%q; want %q", got.HomeDir, want.HomeDir)
-	}
-}
-
-func TestLookup(t *testing.T) {
-	check(t)
-
-	if runtime.GOOS == "plan9" {
-		t.Skipf("Lookup not implemented on %q", runtime.GOOS)
-	}
-
-	want, err := Current()
-	if err != nil {
-		t.Fatalf("Current: %v", err)
-	}
-	got, err := Lookup(want.Username)
-	if err != nil {
-		t.Fatalf("Lookup: %v", err)
-	}
-	compare(t, want, got)
-}
-
-func TestLookupId(t *testing.T) {
-	check(t)
-
-	if runtime.GOOS == "plan9" {
-		t.Skipf("LookupId not implemented on %q", runtime.GOOS)
-	}
-
-	want, err := Current()
-	if err != nil {
-		t.Fatalf("Current: %v", err)
-	}
-	got, err := LookupId(want.Uid)
-	if err != nil {
-		t.Fatalf("LookupId: %v", err)
-	}
-	compare(t, want, got)
-}
diff --git a/third_party/gofrontend/libgo/go/path/example_test.go b/third_party/gofrontend/libgo/go/path/example_test.go
deleted file mode 100644
index ca18b32..0000000
--- a/third_party/gofrontend/libgo/go/path/example_test.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package path
-
-/* Commented out until gccgo has example support.
-
-import (
-	"fmt"
-	"path"
-)
-
-func ExampleBase() {
-	fmt.Println(path.Base("/a/b"))
-	// Output: b
-}
-
-func ExampleClean() {
-	paths := []string{
-		"a/c",
-		"a//c",
-		"a/c/.",
-		"a/c/b/..",
-		"/../a/c",
-		"/../a/b/../././/c",
-	}
-
-	for _, p := range paths {
-		fmt.Printf("Clean(%q) = %q\n", p, path.Clean(p))
-	}
-
-	// Output:
-	// Clean("a/c") = "a/c"
-	// Clean("a//c") = "a/c"
-	// Clean("a/c/.") = "a/c"
-	// Clean("a/c/b/..") = "a/c"
-	// Clean("/../a/c") = "/a/c"
-	// Clean("/../a/b/../././/c") = "/a/c"
-}
-
-func ExampleDir() {
-	fmt.Println(path.Dir("/a/b/c"))
-	// Output: /a/b
-}
-
-func ExampleExt() {
-	fmt.Println(path.Ext("/a/b/c/bar.css"))
-	// Output: .css
-}
-
-func ExampleIsAbs() {
-	fmt.Println(path.IsAbs("/dev/null"))
-	// Output: true
-}
-
-func ExampleJoin() {
-	fmt.Println(path.Join("a", "b", "c"))
-	// Output: a/b/c
-}
-
-func ExampleSplit() {
-	fmt.Println(path.Split("static/myfile.css"))
-	// Output: static/ myfile.css
-}
-
-*/
diff --git a/third_party/gofrontend/libgo/go/path/filepath/example_unix_test.go b/third_party/gofrontend/libgo/go/path/filepath/example_unix_test.go
deleted file mode 100644
index 27d85d1..0000000
--- a/third_party/gofrontend/libgo/go/path/filepath/example_unix_test.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !windows,!plan9
-
-package filepath_test
-
-import (
-	"fmt"
-	"path/filepath"
-)
-
-func ExampleSplitList() {
-	fmt.Println("On Unix:", filepath.SplitList("/a/b/c:/usr/bin"))
-	// Output:
-	// On Unix: [/a/b/c /usr/bin]
-}
-
-func ExampleRel() {
-	paths := []string{
-		"/a/b/c",
-		"/b/c",
-		"./b/c",
-	}
-	base := "/a"
-
-	fmt.Println("On Unix:")
-	for _, p := range paths {
-		rel, err := filepath.Rel(base, p)
-		fmt.Printf("%q: %q %v\n", p, rel, err)
-	}
-
-	// Output:
-	// On Unix:
-	// "/a/b/c": "b/c" <nil>
-	// "/b/c": "../b/c" <nil>
-	// "./b/c": "" Rel: can't make b/c relative to /a
-}
-
-func ExampleSplit() {
-	paths := []string{
-		"/home/arnie/amelia.jpg",
-		"/mnt/photos/",
-		"rabbit.jpg",
-		"/usr/local//go",
-	}
-	fmt.Println("On Unix:")
-	for _, p := range paths {
-		dir, file := filepath.Split(p)
-		fmt.Printf("input: %q\n\tdir: %q\n\tfile: %q\n", p, dir, file)
-	}
-	// Output:
-	// On Unix:
-	// input: "/home/arnie/amelia.jpg"
-	// 	dir: "/home/arnie/"
-	// 	file: "amelia.jpg"
-	// input: "/mnt/photos/"
-	// 	dir: "/mnt/photos/"
-	// 	file: ""
-	// input: "rabbit.jpg"
-	// 	dir: ""
-	// 	file: "rabbit.jpg"
-	// input: "/usr/local//go"
-	// 	dir: "/usr/local//"
-	// 	file: "go"
-}
diff --git a/third_party/gofrontend/libgo/go/path/filepath/export_test.go b/third_party/gofrontend/libgo/go/path/filepath/export_test.go
deleted file mode 100644
index 0cf9e3b..0000000
--- a/third_party/gofrontend/libgo/go/path/filepath/export_test.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package filepath
-
-var LstatP = &lstat
diff --git a/third_party/gofrontend/libgo/go/path/filepath/match.go b/third_party/gofrontend/libgo/go/path/filepath/match.go
deleted file mode 100644
index 89f16de..0000000
--- a/third_party/gofrontend/libgo/go/path/filepath/match.go
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package filepath
-
-import (
-	"errors"
-	"os"
-	"runtime"
-	"sort"
-	"strings"
-	"unicode/utf8"
-)
-
-// ErrBadPattern indicates a globbing pattern was malformed.
-var ErrBadPattern = errors.New("syntax error in pattern")
-
-// Match reports whether name matches the shell file name pattern.
-// The pattern syntax is:
-//
-//	pattern:
-//		{ term }
-//	term:
-//		'*'         matches any sequence of non-Separator characters
-//		'?'         matches any single non-Separator character
-//		'[' [ '^' ] { character-range } ']'
-//		            character class (must be non-empty)
-//		c           matches character c (c != '*', '?', '\\', '[')
-//		'\\' c      matches character c
-//
-//	character-range:
-//		c           matches character c (c != '\\', '-', ']')
-//		'\\' c      matches character c
-//		lo '-' hi   matches character c for lo <= c <= hi
-//
-// Match requires pattern to match all of name, not just a substring.
-// The only possible returned error is ErrBadPattern, when pattern
-// is malformed.
-//
-// On Windows, escaping is disabled. Instead, '\\' is treated as
-// path separator.
-//
-func Match(pattern, name string) (matched bool, err error) {
-Pattern:
-	for len(pattern) > 0 {
-		var star bool
-		var chunk string
-		star, chunk, pattern = scanChunk(pattern)
-		if star && chunk == "" {
-			// Trailing * matches rest of string unless it has a /.
-			return strings.Index(name, string(Separator)) < 0, nil
-		}
-		// Look for match at current position.
-		t, ok, err := matchChunk(chunk, name)
-		// if we're the last chunk, make sure we've exhausted the name
-		// otherwise we'll give a false result even if we could still match
-		// using the star
-		if ok && (len(t) == 0 || len(pattern) > 0) {
-			name = t
-			continue
-		}
-		if err != nil {
-			return false, err
-		}
-		if star {
-			// Look for match skipping i+1 bytes.
-			// Cannot skip /.
-			for i := 0; i < len(name) && name[i] != Separator; i++ {
-				t, ok, err := matchChunk(chunk, name[i+1:])
-				if ok {
-					// if we're the last chunk, make sure we exhausted the name
-					if len(pattern) == 0 && len(t) > 0 {
-						continue
-					}
-					name = t
-					continue Pattern
-				}
-				if err != nil {
-					return false, err
-				}
-			}
-		}
-		return false, nil
-	}
-	return len(name) == 0, nil
-}
-
-// scanChunk gets the next segment of pattern, which is a non-star string
-// possibly preceded by a star.
-func scanChunk(pattern string) (star bool, chunk, rest string) {
-	for len(pattern) > 0 && pattern[0] == '*' {
-		pattern = pattern[1:]
-		star = true
-	}
-	inrange := false
-	var i int
-Scan:
-	for i = 0; i < len(pattern); i++ {
-		switch pattern[i] {
-		case '\\':
-			if runtime.GOOS != "windows" {
-				// error check handled in matchChunk: bad pattern.
-				if i+1 < len(pattern) {
-					i++
-				}
-			}
-		case '[':
-			inrange = true
-		case ']':
-			inrange = false
-		case '*':
-			if !inrange {
-				break Scan
-			}
-		}
-	}
-	return star, pattern[0:i], pattern[i:]
-}
-
-// matchChunk checks whether chunk matches the beginning of s.
-// If so, it returns the remainder of s (after the match).
-// Chunk is all single-character operators: literals, char classes, and ?.
-func matchChunk(chunk, s string) (rest string, ok bool, err error) {
-	for len(chunk) > 0 {
-		if len(s) == 0 {
-			return
-		}
-		switch chunk[0] {
-		case '[':
-			// character class
-			r, n := utf8.DecodeRuneInString(s)
-			s = s[n:]
-			chunk = chunk[1:]
-			// We can't end right after '[', we're expecting at least
-			// a closing bracket and possibly a caret.
-			if len(chunk) == 0 {
-				err = ErrBadPattern
-				return
-			}
-			// possibly negated
-			negated := chunk[0] == '^'
-			if negated {
-				chunk = chunk[1:]
-			}
-			// parse all ranges
-			match := false
-			nrange := 0
-			for {
-				if len(chunk) > 0 && chunk[0] == ']' && nrange > 0 {
-					chunk = chunk[1:]
-					break
-				}
-				var lo, hi rune
-				if lo, chunk, err = getEsc(chunk); err != nil {
-					return
-				}
-				hi = lo
-				if chunk[0] == '-' {
-					if hi, chunk, err = getEsc(chunk[1:]); err != nil {
-						return
-					}
-				}
-				if lo <= r && r <= hi {
-					match = true
-				}
-				nrange++
-			}
-			if match == negated {
-				return
-			}
-
-		case '?':
-			if s[0] == Separator {
-				return
-			}
-			_, n := utf8.DecodeRuneInString(s)
-			s = s[n:]
-			chunk = chunk[1:]
-
-		case '\\':
-			if runtime.GOOS != "windows" {
-				chunk = chunk[1:]
-				if len(chunk) == 0 {
-					err = ErrBadPattern
-					return
-				}
-			}
-			fallthrough
-
-		default:
-			if chunk[0] != s[0] {
-				return
-			}
-			s = s[1:]
-			chunk = chunk[1:]
-		}
-	}
-	return s, true, nil
-}
-
-// getEsc gets a possibly-escaped character from chunk, for a character class.
-func getEsc(chunk string) (r rune, nchunk string, err error) {
-	if len(chunk) == 0 || chunk[0] == '-' || chunk[0] == ']' {
-		err = ErrBadPattern
-		return
-	}
-	if chunk[0] == '\\' && runtime.GOOS != "windows" {
-		chunk = chunk[1:]
-		if len(chunk) == 0 {
-			err = ErrBadPattern
-			return
-		}
-	}
-	r, n := utf8.DecodeRuneInString(chunk)
-	if r == utf8.RuneError && n == 1 {
-		err = ErrBadPattern
-	}
-	nchunk = chunk[n:]
-	if len(nchunk) == 0 {
-		err = ErrBadPattern
-	}
-	return
-}
-
-// Glob returns the names of all files matching pattern or nil
-// if there is no matching file. The syntax of patterns is the same
-// as in Match. The pattern may describe hierarchical names such as
-// /usr/*/bin/ed (assuming the Separator is '/').
-//
-// Glob ignores file system errors such as I/O errors reading directories.
-// The only possible returned error is ErrBadPattern, when pattern
-// is malformed.
-func Glob(pattern string) (matches []string, err error) {
-	if !hasMeta(pattern) {
-		if _, err = os.Lstat(pattern); err != nil {
-			return nil, nil
-		}
-		return []string{pattern}, nil
-	}
-
-	dir, file := Split(pattern)
-	switch dir {
-	case "":
-		dir = "."
-	case string(Separator):
-		// nothing
-	default:
-		dir = dir[0 : len(dir)-1] // chop off trailing separator
-	}
-
-	if !hasMeta(dir) {
-		return glob(dir, file, nil)
-	}
-
-	var m []string
-	m, err = Glob(dir)
-	if err != nil {
-		return
-	}
-	for _, d := range m {
-		matches, err = glob(d, file, matches)
-		if err != nil {
-			return
-		}
-	}
-	return
-}
-
-// glob searches for files matching pattern in the directory dir
-// and appends them to matches. If the directory cannot be
-// opened, it returns the existing matches. New matches are
-// added in lexicographical order.
-func glob(dir, pattern string, matches []string) (m []string, e error) {
-	m = matches
-	fi, err := os.Stat(dir)
-	if err != nil {
-		return
-	}
-	if !fi.IsDir() {
-		return
-	}
-	d, err := os.Open(dir)
-	if err != nil {
-		return
-	}
-	defer d.Close()
-
-	names, _ := d.Readdirnames(-1)
-	sort.Strings(names)
-
-	for _, n := range names {
-		matched, err := Match(pattern, n)
-		if err != nil {
-			return m, err
-		}
-		if matched {
-			m = append(m, Join(dir, n))
-		}
-	}
-	return
-}
-
-// hasMeta reports whether path contains any of the magic characters
-// recognized by Match.
-func hasMeta(path string) bool {
-	// TODO(niemeyer): Should other magic characters be added here?
-	return strings.IndexAny(path, "*?[") >= 0
-}
diff --git a/third_party/gofrontend/libgo/go/path/filepath/match_test.go b/third_party/gofrontend/libgo/go/path/filepath/match_test.go
deleted file mode 100644
index c29f93f..0000000
--- a/third_party/gofrontend/libgo/go/path/filepath/match_test.go
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package filepath_test
-
-import (
-	"io/ioutil"
-	"os"
-	. "path/filepath"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-type MatchTest struct {
-	pattern, s string
-	match      bool
-	err        error
-}
-
-var matchTests = []MatchTest{
-	{"abc", "abc", true, nil},
-	{"*", "abc", true, nil},
-	{"*c", "abc", true, nil},
-	{"a*", "a", true, nil},
-	{"a*", "abc", true, nil},
-	{"a*", "ab/c", false, nil},
-	{"a*/b", "abc/b", true, nil},
-	{"a*/b", "a/c/b", false, nil},
-	{"a*b*c*d*e*/f", "axbxcxdxe/f", true, nil},
-	{"a*b*c*d*e*/f", "axbxcxdxexxx/f", true, nil},
-	{"a*b*c*d*e*/f", "axbxcxdxe/xxx/f", false, nil},
-	{"a*b*c*d*e*/f", "axbxcxdxexxx/fff", false, nil},
-	{"a*b?c*x", "abxbbxdbxebxczzx", true, nil},
-	{"a*b?c*x", "abxbbxdbxebxczzy", false, nil},
-	{"ab[c]", "abc", true, nil},
-	{"ab[b-d]", "abc", true, nil},
-	{"ab[e-g]", "abc", false, nil},
-	{"ab[^c]", "abc", false, nil},
-	{"ab[^b-d]", "abc", false, nil},
-	{"ab[^e-g]", "abc", true, nil},
-	{"a\\*b", "a*b", true, nil},
-	{"a\\*b", "ab", false, nil},
-	{"a?b", "a☺b", true, nil},
-	{"a[^a]b", "a☺b", true, nil},
-	{"a???b", "a☺b", false, nil},
-	{"a[^a][^a][^a]b", "a☺b", false, nil},
-	{"[a-ζ]*", "α", true, nil},
-	{"*[a-ζ]", "A", false, nil},
-	{"a?b", "a/b", false, nil},
-	{"a*b", "a/b", false, nil},
-	{"[\\]a]", "]", true, nil},
-	{"[\\-]", "-", true, nil},
-	{"[x\\-]", "x", true, nil},
-	{"[x\\-]", "-", true, nil},
-	{"[x\\-]", "z", false, nil},
-	{"[\\-x]", "x", true, nil},
-	{"[\\-x]", "-", true, nil},
-	{"[\\-x]", "a", false, nil},
-	{"[]a]", "]", false, ErrBadPattern},
-	{"[-]", "-", false, ErrBadPattern},
-	{"[x-]", "x", false, ErrBadPattern},
-	{"[x-]", "-", false, ErrBadPattern},
-	{"[x-]", "z", false, ErrBadPattern},
-	{"[-x]", "x", false, ErrBadPattern},
-	{"[-x]", "-", false, ErrBadPattern},
-	{"[-x]", "a", false, ErrBadPattern},
-	{"\\", "a", false, ErrBadPattern},
-	{"[a-b-c]", "a", false, ErrBadPattern},
-	{"[", "a", false, ErrBadPattern},
-	{"[^", "a", false, ErrBadPattern},
-	{"[^bc", "a", false, ErrBadPattern},
-	{"a[", "a", false, nil},
-	{"a[", "ab", false, ErrBadPattern},
-	{"*x", "xxx", true, nil},
-}
-
-func errp(e error) string {
-	if e == nil {
-		return "<nil>"
-	}
-	return e.Error()
-}
-
-func TestMatch(t *testing.T) {
-	for _, tt := range matchTests {
-		pattern := tt.pattern
-		s := tt.s
-		if runtime.GOOS == "windows" {
-			if strings.Index(pattern, "\\") >= 0 {
-				// no escape allowed on windows.
-				continue
-			}
-			pattern = Clean(pattern)
-			s = Clean(s)
-		}
-		ok, err := Match(pattern, s)
-		if ok != tt.match || err != tt.err {
-			t.Errorf("Match(%#q, %#q) = %v, %q want %v, %q", pattern, s, ok, errp(err), tt.match, errp(tt.err))
-		}
-	}
-}
-
-// contains returns true if vector contains the string s.
-func contains(vector []string, s string) bool {
-	for _, elem := range vector {
-		if elem == s {
-			return true
-		}
-	}
-	return false
-}
-
-var globTests = []struct {
-	pattern, result string
-}{
-	{"match.go", "match.go"},
-	{"mat?h.go", "match.go"},
-	{"*", "match.go"},
-	// Does not work in gccgo test environment.
-	// {"../*/match.go", "../filepath/match.go"},
-}
-
-func TestGlob(t *testing.T) {
-	for _, tt := range globTests {
-		pattern := tt.pattern
-		result := tt.result
-		if runtime.GOOS == "windows" {
-			pattern = Clean(pattern)
-			result = Clean(result)
-		}
-		matches, err := Glob(pattern)
-		if err != nil {
-			t.Errorf("Glob error for %q: %s", pattern, err)
-			continue
-		}
-		if !contains(matches, result) {
-			t.Errorf("Glob(%#q) = %#v want %v", pattern, matches, result)
-		}
-	}
-	for _, pattern := range []string{"no_match", "../*/no_match"} {
-		matches, err := Glob(pattern)
-		if err != nil {
-			t.Errorf("Glob error for %q: %s", pattern, err)
-			continue
-		}
-		if len(matches) != 0 {
-			t.Errorf("Glob(%#q) = %#v want []", pattern, matches)
-		}
-	}
-}
-
-func TestGlobError(t *testing.T) {
-	_, err := Glob("[7]")
-	if err != nil {
-		t.Error("expected error for bad pattern; got none")
-	}
-}
-
-var globSymlinkTests = []struct {
-	path, dest string
-	brokenLink bool
-}{
-	{"test1", "link1", false},
-	{"test2", "link2", true},
-}
-
-func TestGlobSymlink(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "plan9":
-		t.Skipf("skipping on %s", runtime.GOOS)
-	case "windows":
-		if !supportsSymlinks {
-			t.Skipf("skipping on %s", runtime.GOOS)
-		}
-
-	}
-
-	tmpDir, err := ioutil.TempDir("", "globsymlink")
-	if err != nil {
-		t.Fatal("creating temp dir:", err)
-	}
-	defer os.RemoveAll(tmpDir)
-
-	for _, tt := range globSymlinkTests {
-		path := Join(tmpDir, tt.path)
-		dest := Join(tmpDir, tt.dest)
-		f, err := os.Create(path)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if err := f.Close(); err != nil {
-			t.Fatal(err)
-		}
-		err = os.Symlink(path, dest)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if tt.brokenLink {
-			// Break the symlink.
-			os.Remove(path)
-		}
-		matches, err := Glob(dest)
-		if err != nil {
-			t.Errorf("GlobSymlink error for %q: %s", dest, err)
-		}
-		if !contains(matches, dest) {
-			t.Errorf("Glob(%#q) = %#v want %v", dest, matches, dest)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/path/filepath/path.go b/third_party/gofrontend/libgo/go/path/filepath/path.go
deleted file mode 100644
index 5dc5cfd..0000000
--- a/third_party/gofrontend/libgo/go/path/filepath/path.go
+++ /dev/null
@@ -1,466 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package filepath implements utility routines for manipulating filename paths
-// in a way compatible with the target operating system-defined file paths.
-//
-// Functions in this package replace any occurrences of the slash ('/') character
-// with os.PathSeparator when returning paths unless otherwise specified.
-package filepath
-
-import (
-	"errors"
-	"os"
-	"sort"
-	"strings"
-)
-
-// A lazybuf is a lazily constructed path buffer.
-// It supports append, reading previously appended bytes,
-// and retrieving the final string. It does not allocate a buffer
-// to hold the output until that output diverges from s.
-type lazybuf struct {
-	path       string
-	buf        []byte
-	w          int
-	volAndPath string
-	volLen     int
-}
-
-func (b *lazybuf) index(i int) byte {
-	if b.buf != nil {
-		return b.buf[i]
-	}
-	return b.path[i]
-}
-
-func (b *lazybuf) append(c byte) {
-	if b.buf == nil {
-		if b.w < len(b.path) && b.path[b.w] == c {
-			b.w++
-			return
-		}
-		b.buf = make([]byte, len(b.path))
-		copy(b.buf, b.path[:b.w])
-	}
-	b.buf[b.w] = c
-	b.w++
-}
-
-func (b *lazybuf) string() string {
-	if b.buf == nil {
-		return b.volAndPath[:b.volLen+b.w]
-	}
-	return b.volAndPath[:b.volLen] + string(b.buf[:b.w])
-}
-
-const (
-	Separator     = os.PathSeparator
-	ListSeparator = os.PathListSeparator
-)
-
-// Clean returns the shortest path name equivalent to path
-// by purely lexical processing.  It applies the following rules
-// iteratively until no further processing can be done:
-//
-//	1. Replace multiple Separator elements with a single one.
-//	2. Eliminate each . path name element (the current directory).
-//	3. Eliminate each inner .. path name element (the parent directory)
-//	   along with the non-.. element that precedes it.
-//	4. Eliminate .. elements that begin a rooted path:
-//	   that is, replace "/.." by "/" at the beginning of a path,
-//	   assuming Separator is '/'.
-//
-// The returned path ends in a slash only if it represents a root directory,
-// such as "/" on Unix or `C:\` on Windows.
-//
-// If the result of this process is an empty string, Clean
-// returns the string ".".
-//
-// See also Rob Pike, ``Lexical File Names in Plan 9 or
-// Getting Dot-Dot Right,''
-// http://plan9.bell-labs.com/sys/doc/lexnames.html
-func Clean(path string) string {
-	originalPath := path
-	volLen := volumeNameLen(path)
-	path = path[volLen:]
-	if path == "" {
-		if volLen > 1 && originalPath[1] != ':' {
-			// should be UNC
-			return FromSlash(originalPath)
-		}
-		return originalPath + "."
-	}
-	rooted := os.IsPathSeparator(path[0])
-
-	// Invariants:
-	//	reading from path; r is index of next byte to process.
-	//	writing to buf; w is index of next byte to write.
-	//	dotdot is index in buf where .. must stop, either because
-	//		it is the leading slash or it is a leading ../../.. prefix.
-	n := len(path)
-	out := lazybuf{path: path, volAndPath: originalPath, volLen: volLen}
-	r, dotdot := 0, 0
-	if rooted {
-		out.append(Separator)
-		r, dotdot = 1, 1
-	}
-
-	for r < n {
-		switch {
-		case os.IsPathSeparator(path[r]):
-			// empty path element
-			r++
-		case path[r] == '.' && (r+1 == n || os.IsPathSeparator(path[r+1])):
-			// . element
-			r++
-		case path[r] == '.' && path[r+1] == '.' && (r+2 == n || os.IsPathSeparator(path[r+2])):
-			// .. element: remove to last separator
-			r += 2
-			switch {
-			case out.w > dotdot:
-				// can backtrack
-				out.w--
-				for out.w > dotdot && !os.IsPathSeparator(out.index(out.w)) {
-					out.w--
-				}
-			case !rooted:
-				// cannot backtrack, but not rooted, so append .. element.
-				if out.w > 0 {
-					out.append(Separator)
-				}
-				out.append('.')
-				out.append('.')
-				dotdot = out.w
-			}
-		default:
-			// real path element.
-			// add slash if needed
-			if rooted && out.w != 1 || !rooted && out.w != 0 {
-				out.append(Separator)
-			}
-			// copy element
-			for ; r < n && !os.IsPathSeparator(path[r]); r++ {
-				out.append(path[r])
-			}
-		}
-	}
-
-	// Turn empty string into "."
-	if out.w == 0 {
-		out.append('.')
-	}
-
-	return FromSlash(out.string())
-}
-
-// ToSlash returns the result of replacing each separator character
-// in path with a slash ('/') character. Multiple separators are
-// replaced by multiple slashes.
-func ToSlash(path string) string {
-	if Separator == '/' {
-		return path
-	}
-	return strings.Replace(path, string(Separator), "/", -1)
-}
-
-// FromSlash returns the result of replacing each slash ('/') character
-// in path with a separator character. Multiple slashes are replaced
-// by multiple separators.
-func FromSlash(path string) string {
-	if Separator == '/' {
-		return path
-	}
-	return strings.Replace(path, "/", string(Separator), -1)
-}
-
-// SplitList splits a list of paths joined by the OS-specific ListSeparator,
-// usually found in PATH or GOPATH environment variables.
-// Unlike strings.Split, SplitList returns an empty slice when passed an empty
-// string. SplitList does not replace slash characters in the returned paths.
-func SplitList(path string) []string {
-	return splitList(path)
-}
-
-// Split splits path immediately following the final Separator,
-// separating it into a directory and file name component.
-// If there is no Separator in path, Split returns an empty dir
-// and file set to path.
-// The returned values have the property that path = dir+file.
-func Split(path string) (dir, file string) {
-	vol := VolumeName(path)
-	i := len(path) - 1
-	for i >= len(vol) && !os.IsPathSeparator(path[i]) {
-		i--
-	}
-	return path[:i+1], path[i+1:]
-}
-
-// Join joins any number of path elements into a single path, adding
-// a Separator if necessary. The result is Cleaned, in particular
-// all empty strings are ignored.
-// On Windows, the result is a UNC path if and only if the first path
-// element is a UNC path.
-func Join(elem ...string) string {
-	return join(elem)
-}
-
-// Ext returns the file name extension used by path.
-// The extension is the suffix beginning at the final dot
-// in the final element of path; it is empty if there is
-// no dot.
-func Ext(path string) string {
-	for i := len(path) - 1; i >= 0 && !os.IsPathSeparator(path[i]); i-- {
-		if path[i] == '.' {
-			return path[i:]
-		}
-	}
-	return ""
-}
-
-// EvalSymlinks returns the path name after the evaluation of any symbolic
-// links.
-// If path is relative the result will be relative to the current directory,
-// unless one of the components is an absolute symbolic link.
-func EvalSymlinks(path string) (string, error) {
-	return evalSymlinks(path)
-}
-
-// Abs returns an absolute representation of path.
-// If the path is not absolute it will be joined with the current
-// working directory to turn it into an absolute path.  The absolute
-// path name for a given file is not guaranteed to be unique.
-func Abs(path string) (string, error) {
-	return abs(path)
-}
-
-func unixAbs(path string) (string, error) {
-	if IsAbs(path) {
-		return Clean(path), nil
-	}
-	wd, err := os.Getwd()
-	if err != nil {
-		return "", err
-	}
-	return Join(wd, path), nil
-}
-
-// Rel returns a relative path that is lexically equivalent to targpath when
-// joined to basepath with an intervening separator. That is,
-// Join(basepath, Rel(basepath, targpath)) is equivalent to targpath itself.
-// On success, the returned path will always be relative to basepath,
-// even if basepath and targpath share no elements.
-// An error is returned if targpath can't be made relative to basepath or if
-// knowing the current working directory would be necessary to compute it.
-func Rel(basepath, targpath string) (string, error) {
-	baseVol := VolumeName(basepath)
-	targVol := VolumeName(targpath)
-	base := Clean(basepath)
-	targ := Clean(targpath)
-	if targ == base {
-		return ".", nil
-	}
-	base = base[len(baseVol):]
-	targ = targ[len(targVol):]
-	if base == "." {
-		base = ""
-	}
-	// Can't use IsAbs - `\a` and `a` are both relative in Windows.
-	baseSlashed := len(base) > 0 && base[0] == Separator
-	targSlashed := len(targ) > 0 && targ[0] == Separator
-	if baseSlashed != targSlashed || baseVol != targVol {
-		return "", errors.New("Rel: can't make " + targ + " relative to " + base)
-	}
-	// Position base[b0:bi] and targ[t0:ti] at the first differing elements.
-	bl := len(base)
-	tl := len(targ)
-	var b0, bi, t0, ti int
-	for {
-		for bi < bl && base[bi] != Separator {
-			bi++
-		}
-		for ti < tl && targ[ti] != Separator {
-			ti++
-		}
-		if targ[t0:ti] != base[b0:bi] {
-			break
-		}
-		if bi < bl {
-			bi++
-		}
-		if ti < tl {
-			ti++
-		}
-		b0 = bi
-		t0 = ti
-	}
-	if base[b0:bi] == ".." {
-		return "", errors.New("Rel: can't make " + targ + " relative to " + base)
-	}
-	if b0 != bl {
-		// Base elements left. Must go up before going down.
-		seps := strings.Count(base[b0:bl], string(Separator))
-		size := 2 + seps*3
-		if tl != t0 {
-			size += 1 + tl - t0
-		}
-		buf := make([]byte, size)
-		n := copy(buf, "..")
-		for i := 0; i < seps; i++ {
-			buf[n] = Separator
-			copy(buf[n+1:], "..")
-			n += 3
-		}
-		if t0 != tl {
-			buf[n] = Separator
-			copy(buf[n+1:], targ[t0:])
-		}
-		return string(buf), nil
-	}
-	return targ[t0:], nil
-}
-
-// SkipDir is used as a return value from WalkFuncs to indicate that
-// the directory named in the call is to be skipped. It is not returned
-// as an error by any function.
-var SkipDir = errors.New("skip this directory")
-
-// WalkFunc is the type of the function called for each file or directory
-// visited by Walk. The path argument contains the argument to Walk as a
-// prefix; that is, if Walk is called with "dir", which is a directory
-// containing the file "a", the walk function will be called with argument
-// "dir/a". The info argument is the os.FileInfo for the named path.
-//
-// If there was a problem walking to the file or directory named by path, the
-// incoming error will describe the problem and the function can decide how
-// to handle that error (and Walk will not descend into that directory). If
-// an error is returned, processing stops. The sole exception is when the function
-// returns the special value SkipDir. If the function returns SkipDir when invoked
-// on a directory, Walk skips the directory's contents entirely.
-// If the function returns SkipDir when invoked on a non-directory file,
-// Walk skips the remaining files in the containing directory.
-type WalkFunc func(path string, info os.FileInfo, err error) error
-
-var lstat = os.Lstat // for testing
-
-// walk recursively descends path, calling w.
-func walk(path string, info os.FileInfo, walkFn WalkFunc) error {
-	err := walkFn(path, info, nil)
-	if err != nil {
-		if info.IsDir() && err == SkipDir {
-			return nil
-		}
-		return err
-	}
-
-	if !info.IsDir() {
-		return nil
-	}
-
-	names, err := readDirNames(path)
-	if err != nil {
-		return walkFn(path, info, err)
-	}
-
-	for _, name := range names {
-		filename := Join(path, name)
-		fileInfo, err := lstat(filename)
-		if err != nil {
-			if err := walkFn(filename, fileInfo, err); err != nil && err != SkipDir {
-				return err
-			}
-		} else {
-			err = walk(filename, fileInfo, walkFn)
-			if err != nil {
-				if !fileInfo.IsDir() || err != SkipDir {
-					return err
-				}
-			}
-		}
-	}
-	return nil
-}
-
-// Walk walks the file tree rooted at root, calling walkFn for each file or
-// directory in the tree, including root. All errors that arise visiting files
-// and directories are filtered by walkFn. The files are walked in lexical
-// order, which makes the output deterministic but means that for very
-// large directories Walk can be inefficient.
-// Walk does not follow symbolic links.
-func Walk(root string, walkFn WalkFunc) error {
-	info, err := os.Lstat(root)
-	if err != nil {
-		return walkFn(root, nil, err)
-	}
-	return walk(root, info, walkFn)
-}
-
-// readDirNames reads the directory named by dirname and returns
-// a sorted list of directory entries.
-func readDirNames(dirname string) ([]string, error) {
-	f, err := os.Open(dirname)
-	if err != nil {
-		return nil, err
-	}
-	names, err := f.Readdirnames(-1)
-	f.Close()
-	if err != nil {
-		return nil, err
-	}
-	sort.Strings(names)
-	return names, nil
-}
-
-// Base returns the last element of path.
-// Trailing path separators are removed before extracting the last element.
-// If the path is empty, Base returns ".".
-// If the path consists entirely of separators, Base returns a single separator.
-func Base(path string) string {
-	if path == "" {
-		return "."
-	}
-	// Strip trailing slashes.
-	for len(path) > 0 && os.IsPathSeparator(path[len(path)-1]) {
-		path = path[0 : len(path)-1]
-	}
-	// Throw away volume name
-	path = path[len(VolumeName(path)):]
-	// Find the last element
-	i := len(path) - 1
-	for i >= 0 && !os.IsPathSeparator(path[i]) {
-		i--
-	}
-	if i >= 0 {
-		path = path[i+1:]
-	}
-	// If empty now, it had only slashes.
-	if path == "" {
-		return string(Separator)
-	}
-	return path
-}
-
-// Dir returns all but the last element of path, typically the path's directory.
-// After dropping the final element, the path is Cleaned and trailing
-// slashes are removed.
-// If the path is empty, Dir returns ".".
-// If the path consists entirely of separators, Dir returns a single separator.
-// The returned path does not end in a separator unless it is the root directory.
-func Dir(path string) string {
-	vol := VolumeName(path)
-	i := len(path) - 1
-	for i >= len(vol) && !os.IsPathSeparator(path[i]) {
-		i--
-	}
-	dir := Clean(path[len(vol) : i+1])
-	return vol + dir
-}
-
-// VolumeName returns leading volume name.
-// Given "C:\foo\bar" it returns "C:" on Windows.
-// Given "\\host\share\foo" it returns "\\host\share".
-// On other platforms it returns "".
-func VolumeName(path string) string {
-	return path[:volumeNameLen(path)]
-}
diff --git a/third_party/gofrontend/libgo/go/path/filepath/path_plan9.go b/third_party/gofrontend/libgo/go/path/filepath/path_plan9.go
deleted file mode 100644
index 962774e..0000000
--- a/third_party/gofrontend/libgo/go/path/filepath/path_plan9.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package filepath
-
-import "strings"
-
-// IsAbs reports whether the path is absolute.
-func IsAbs(path string) bool {
-	return strings.HasPrefix(path, "/") || strings.HasPrefix(path, "#")
-}
-
-// volumeNameLen returns length of the leading volume name on Windows.
-// It returns 0 elsewhere.
-func volumeNameLen(path string) int {
-	return 0
-}
-
-// HasPrefix exists for historical compatibility and should not be used.
-func HasPrefix(p, prefix string) bool {
-	return strings.HasPrefix(p, prefix)
-}
-
-func splitList(path string) []string {
-	if path == "" {
-		return []string{}
-	}
-	return strings.Split(path, string(ListSeparator))
-}
-
-func abs(path string) (string, error) {
-	return unixAbs(path)
-}
-
-func join(elem []string) string {
-	// If there's a bug here, fix the logic in ./path_unix.go too.
-	for i, e := range elem {
-		if e != "" {
-			return Clean(strings.Join(elem[i:], string(Separator)))
-		}
-	}
-	return ""
-}
diff --git a/third_party/gofrontend/libgo/go/path/filepath/path_test.go b/third_party/gofrontend/libgo/go/path/filepath/path_test.go
deleted file mode 100644
index b2536cb..0000000
--- a/third_party/gofrontend/libgo/go/path/filepath/path_test.go
+++ /dev/null
@@ -1,1106 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package filepath_test
-
-import (
-	"errors"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"reflect"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-var supportsSymlinks = true
-
-type PathTest struct {
-	path, result string
-}
-
-var cleantests = []PathTest{
-	// Already clean
-	{"abc", "abc"},
-	{"abc/def", "abc/def"},
-	{"a/b/c", "a/b/c"},
-	{".", "."},
-	{"..", ".."},
-	{"../..", "../.."},
-	{"../../abc", "../../abc"},
-	{"/abc", "/abc"},
-	{"/", "/"},
-
-	// Empty is current dir
-	{"", "."},
-
-	// Remove trailing slash
-	{"abc/", "abc"},
-	{"abc/def/", "abc/def"},
-	{"a/b/c/", "a/b/c"},
-	{"./", "."},
-	{"../", ".."},
-	{"../../", "../.."},
-	{"/abc/", "/abc"},
-
-	// Remove doubled slash
-	{"abc//def//ghi", "abc/def/ghi"},
-	{"//abc", "/abc"},
-	{"///abc", "/abc"},
-	{"//abc//", "/abc"},
-	{"abc//", "abc"},
-
-	// Remove . elements
-	{"abc/./def", "abc/def"},
-	{"/./abc/def", "/abc/def"},
-	{"abc/.", "abc"},
-
-	// Remove .. elements
-	{"abc/def/ghi/../jkl", "abc/def/jkl"},
-	{"abc/def/../ghi/../jkl", "abc/jkl"},
-	{"abc/def/..", "abc"},
-	{"abc/def/../..", "."},
-	{"/abc/def/../..", "/"},
-	{"abc/def/../../..", ".."},
-	{"/abc/def/../../..", "/"},
-	{"abc/def/../../../ghi/jkl/../../../mno", "../../mno"},
-	{"/../abc", "/abc"},
-
-	// Combinations
-	{"abc/./../def", "def"},
-	{"abc//./../def", "def"},
-	{"abc/../../././../def", "../../def"},
-}
-
-var wincleantests = []PathTest{
-	{`c:`, `c:.`},
-	{`c:\`, `c:\`},
-	{`c:\abc`, `c:\abc`},
-	{`c:abc\..\..\.\.\..\def`, `c:..\..\def`},
-	{`c:\abc\def\..\..`, `c:\`},
-	{`c:\..\abc`, `c:\abc`},
-	{`c:..\abc`, `c:..\abc`},
-	{`\`, `\`},
-	{`/`, `\`},
-	{`\\i\..\c$`, `\c$`},
-	{`\\i\..\i\c$`, `\i\c$`},
-	{`\\i\..\I\c$`, `\I\c$`},
-	{`\\host\share\foo\..\bar`, `\\host\share\bar`},
-	{`//host/share/foo/../baz`, `\\host\share\baz`},
-	{`\\a\b\..\c`, `\\a\b\c`},
-	{`\\a\b`, `\\a\b`},
-}
-
-func TestClean(t *testing.T) {
-	tests := cleantests
-	if runtime.GOOS == "windows" {
-		for i := range tests {
-			tests[i].result = filepath.FromSlash(tests[i].result)
-		}
-		tests = append(tests, wincleantests...)
-	}
-	for _, test := range tests {
-		if s := filepath.Clean(test.path); s != test.result {
-			t.Errorf("Clean(%q) = %q, want %q", test.path, s, test.result)
-		}
-		if s := filepath.Clean(test.result); s != test.result {
-			t.Errorf("Clean(%q) = %q, want %q", test.result, s, test.result)
-		}
-	}
-
-	if testing.Short() {
-		t.Skip("skipping malloc count in short mode")
-	}
-	if runtime.GOMAXPROCS(0) > 1 {
-		t.Log("skipping AllocsPerRun checks; GOMAXPROCS>1")
-		return
-	}
-
-	t.Log("Skipping AllocsPerRun for gccgo")
-	return
-
-	for _, test := range tests {
-		allocs := testing.AllocsPerRun(100, func() { filepath.Clean(test.result) })
-		if allocs > 0 {
-			t.Errorf("Clean(%q): %v allocs, want zero", test.result, allocs)
-		}
-	}
-}
-
-const sep = filepath.Separator
-
-var slashtests = []PathTest{
-	{"", ""},
-	{"/", string(sep)},
-	{"/a/b", string([]byte{sep, 'a', sep, 'b'})},
-	{"a//b", string([]byte{'a', sep, sep, 'b'})},
-}
-
-func TestFromAndToSlash(t *testing.T) {
-	for _, test := range slashtests {
-		if s := filepath.FromSlash(test.path); s != test.result {
-			t.Errorf("FromSlash(%q) = %q, want %q", test.path, s, test.result)
-		}
-		if s := filepath.ToSlash(test.result); s != test.path {
-			t.Errorf("ToSlash(%q) = %q, want %q", test.result, s, test.path)
-		}
-	}
-}
-
-type SplitListTest struct {
-	list   string
-	result []string
-}
-
-const lsep = filepath.ListSeparator
-
-var splitlisttests = []SplitListTest{
-	{"", []string{}},
-	{string([]byte{'a', lsep, 'b'}), []string{"a", "b"}},
-	{string([]byte{lsep, 'a', lsep, 'b'}), []string{"", "a", "b"}},
-}
-
-var winsplitlisttests = []SplitListTest{
-	// quoted
-	{`"a"`, []string{`a`}},
-
-	// semicolon
-	{`";"`, []string{`;`}},
-	{`"a;b"`, []string{`a;b`}},
-	{`";";`, []string{`;`, ``}},
-	{`;";"`, []string{``, `;`}},
-
-	// partially quoted
-	{`a";"b`, []string{`a;b`}},
-	{`a; ""b`, []string{`a`, ` b`}},
-	{`"a;b`, []string{`a;b`}},
-	{`""a;b`, []string{`a`, `b`}},
-	{`"""a;b`, []string{`a;b`}},
-	{`""""a;b`, []string{`a`, `b`}},
-	{`a";b`, []string{`a;b`}},
-	{`a;b";c`, []string{`a`, `b;c`}},
-	{`"a";b";c`, []string{`a`, `b;c`}},
-}
-
-func TestSplitList(t *testing.T) {
-	tests := splitlisttests
-	if runtime.GOOS == "windows" {
-		tests = append(tests, winsplitlisttests...)
-	}
-	for _, test := range tests {
-		if l := filepath.SplitList(test.list); !reflect.DeepEqual(l, test.result) {
-			t.Errorf("SplitList(%#q) = %#q, want %#q", test.list, l, test.result)
-		}
-	}
-}
-
-type SplitTest struct {
-	path, dir, file string
-}
-
-var unixsplittests = []SplitTest{
-	{"a/b", "a/", "b"},
-	{"a/b/", "a/b/", ""},
-	{"a/", "a/", ""},
-	{"a", "", "a"},
-	{"/", "/", ""},
-}
-
-var winsplittests = []SplitTest{
-	{`c:`, `c:`, ``},
-	{`c:/`, `c:/`, ``},
-	{`c:/foo`, `c:/`, `foo`},
-	{`c:/foo/bar`, `c:/foo/`, `bar`},
-	{`//host/share`, `//host/share`, ``},
-	{`//host/share/`, `//host/share/`, ``},
-	{`//host/share/foo`, `//host/share/`, `foo`},
-	{`\\host\share`, `\\host\share`, ``},
-	{`\\host\share\`, `\\host\share\`, ``},
-	{`\\host\share\foo`, `\\host\share\`, `foo`},
-}
-
-func TestSplit(t *testing.T) {
-	var splittests []SplitTest
-	splittests = unixsplittests
-	if runtime.GOOS == "windows" {
-		splittests = append(splittests, winsplittests...)
-	}
-	for _, test := range splittests {
-		if d, f := filepath.Split(test.path); d != test.dir || f != test.file {
-			t.Errorf("Split(%q) = %q, %q, want %q, %q", test.path, d, f, test.dir, test.file)
-		}
-	}
-}
-
-type JoinTest struct {
-	elem []string
-	path string
-}
-
-var jointests = []JoinTest{
-	// zero parameters
-	{[]string{}, ""},
-
-	// one parameter
-	{[]string{""}, ""},
-	{[]string{"/"}, "/"},
-	{[]string{"a"}, "a"},
-
-	// two parameters
-	{[]string{"a", "b"}, "a/b"},
-	{[]string{"a", ""}, "a"},
-	{[]string{"", "b"}, "b"},
-	{[]string{"/", "a"}, "/a"},
-	{[]string{"/", "a/b"}, "/a/b"},
-	{[]string{"/", ""}, "/"},
-	{[]string{"//", "a"}, "/a"},
-	{[]string{"/a", "b"}, "/a/b"},
-	{[]string{"a/", "b"}, "a/b"},
-	{[]string{"a/", ""}, "a"},
-	{[]string{"", ""}, ""},
-
-	// three parameters
-	{[]string{"/", "a", "b"}, "/a/b"},
-}
-
-var winjointests = []JoinTest{
-	{[]string{`directory`, `file`}, `directory\file`},
-	{[]string{`C:\Windows\`, `System32`}, `C:\Windows\System32`},
-	{[]string{`C:\Windows\`, ``}, `C:\Windows`},
-	{[]string{`C:\`, `Windows`}, `C:\Windows`},
-	{[]string{`C:`, `Windows`}, `C:\Windows`},
-	{[]string{`\\host\share`, `foo`}, `\\host\share\foo`},
-	{[]string{`\\host\share\foo`}, `\\host\share\foo`},
-	{[]string{`//host/share`, `foo/bar`}, `\\host\share\foo\bar`},
-	{[]string{`\`}, `\`},
-	{[]string{`\`, ``}, `\`},
-	{[]string{`\`, `a`}, `\a`},
-	{[]string{`\\`, `a`}, `\a`},
-	{[]string{`\`, `a`, `b`}, `\a\b`},
-	{[]string{`\\`, `a`, `b`}, `\a\b`},
-	{[]string{`\`, `\\a\b`, `c`}, `\a\b\c`},
-	{[]string{`\\a`, `b`, `c`}, `\a\b\c`},
-	{[]string{`\\a\`, `b`, `c`}, `\a\b\c`},
-}
-
-func TestJoin(t *testing.T) {
-	if runtime.GOOS == "windows" {
-		jointests = append(jointests, winjointests...)
-	}
-	for _, test := range jointests {
-		expected := filepath.FromSlash(test.path)
-		if p := filepath.Join(test.elem...); p != expected {
-			t.Errorf("join(%q) = %q, want %q", test.elem, p, expected)
-		}
-	}
-}
-
-type ExtTest struct {
-	path, ext string
-}
-
-var exttests = []ExtTest{
-	{"path.go", ".go"},
-	{"path.pb.go", ".go"},
-	{"a.dir/b", ""},
-	{"a.dir/b.go", ".go"},
-	{"a.dir/", ""},
-}
-
-func TestExt(t *testing.T) {
-	for _, test := range exttests {
-		if x := filepath.Ext(test.path); x != test.ext {
-			t.Errorf("Ext(%q) = %q, want %q", test.path, x, test.ext)
-		}
-	}
-}
-
-type Node struct {
-	name    string
-	entries []*Node // nil if the entry is a file
-	mark    int
-}
-
-var tree = &Node{
-	"testdata",
-	[]*Node{
-		{"a", nil, 0},
-		{"b", []*Node{}, 0},
-		{"c", nil, 0},
-		{
-			"d",
-			[]*Node{
-				{"x", nil, 0},
-				{"y", []*Node{}, 0},
-				{
-					"z",
-					[]*Node{
-						{"u", nil, 0},
-						{"v", nil, 0},
-					},
-					0,
-				},
-			},
-			0,
-		},
-	},
-	0,
-}
-
-func walkTree(n *Node, path string, f func(path string, n *Node)) {
-	f(path, n)
-	for _, e := range n.entries {
-		walkTree(e, filepath.Join(path, e.name), f)
-	}
-}
-
-func makeTree(t *testing.T) {
-	walkTree(tree, tree.name, func(path string, n *Node) {
-		if n.entries == nil {
-			fd, err := os.Create(path)
-			if err != nil {
-				t.Errorf("makeTree: %v", err)
-				return
-			}
-			fd.Close()
-		} else {
-			os.Mkdir(path, 0770)
-		}
-	})
-}
-
-func markTree(n *Node) { walkTree(n, "", func(path string, n *Node) { n.mark++ }) }
-
-func checkMarks(t *testing.T, report bool) {
-	walkTree(tree, tree.name, func(path string, n *Node) {
-		if n.mark != 1 && report {
-			t.Errorf("node %s mark = %d; expected 1", path, n.mark)
-		}
-		n.mark = 0
-	})
-}
-
-// Assumes that each node name is unique. Good enough for a test.
-// If clear is true, any incoming error is cleared before return. The errors
-// are always accumulated, though.
-func mark(path string, info os.FileInfo, err error, errors *[]error, clear bool) error {
-	if err != nil {
-		*errors = append(*errors, err)
-		if clear {
-			return nil
-		}
-		return err
-	}
-	name := info.Name()
-	walkTree(tree, tree.name, func(path string, n *Node) {
-		if n.name == name {
-			n.mark++
-		}
-	})
-	return nil
-}
-
-func chtmpdir(t *testing.T) (restore func()) {
-	oldwd, err := os.Getwd()
-	if err != nil {
-		t.Fatal("chtmpdir: %v", err)
-	}
-	d, err := ioutil.TempDir("", "test")
-	if err != nil {
-		t.Fatal("chtmpdir: %v", err)
-	}
-	if err := os.Chdir(d); err != nil {
-		t.Fatal("chtmpdir: %v", err)
-	}
-	return func() {
-		if err := os.Chdir(oldwd); err != nil {
-			t.Fatal("chtmpdir: %v", err)
-		}
-		os.RemoveAll(d)
-	}
-}
-
-func TestWalk(t *testing.T) {
-	if runtime.GOOS == "darwin" {
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			restore := chtmpdir(t)
-			defer restore()
-		}
-	}
-	makeTree(t)
-	errors := make([]error, 0, 10)
-	clear := true
-	markFn := func(path string, info os.FileInfo, err error) error {
-		return mark(path, info, err, &errors, clear)
-	}
-	// Expect no errors.
-	err := filepath.Walk(tree.name, markFn)
-	if err != nil {
-		t.Fatalf("no error expected, found: %s", err)
-	}
-	if len(errors) != 0 {
-		t.Fatalf("unexpected errors: %s", errors)
-	}
-	checkMarks(t, true)
-	errors = errors[0:0]
-
-	// Test permission errors.  Only possible if we're not root
-	// and only on some file systems (AFS, FAT).  To avoid errors during
-	// all.bash on those file systems, skip during go test -short.
-	if os.Getuid() > 0 && !testing.Short() {
-		// introduce 2 errors: chmod top-level directories to 0
-		os.Chmod(filepath.Join(tree.name, tree.entries[1].name), 0)
-		os.Chmod(filepath.Join(tree.name, tree.entries[3].name), 0)
-
-		// 3) capture errors, expect two.
-		// mark respective subtrees manually
-		markTree(tree.entries[1])
-		markTree(tree.entries[3])
-		// correct double-marking of directory itself
-		tree.entries[1].mark--
-		tree.entries[3].mark--
-		err := filepath.Walk(tree.name, markFn)
-		if err != nil {
-			t.Fatalf("expected no error return from Walk, got %s", err)
-		}
-		if len(errors) != 2 {
-			t.Errorf("expected 2 errors, got %d: %s", len(errors), errors)
-		}
-		// the inaccessible subtrees were marked manually
-		checkMarks(t, true)
-		errors = errors[0:0]
-
-		// 4) capture errors, stop after first error.
-		// mark respective subtrees manually
-		markTree(tree.entries[1])
-		markTree(tree.entries[3])
-		// correct double-marking of directory itself
-		tree.entries[1].mark--
-		tree.entries[3].mark--
-		clear = false // error will stop processing
-		err = filepath.Walk(tree.name, markFn)
-		if err == nil {
-			t.Fatalf("expected error return from Walk")
-		}
-		if len(errors) != 1 {
-			t.Errorf("expected 1 error, got %d: %s", len(errors), errors)
-		}
-		// the inaccessible subtrees were marked manually
-		checkMarks(t, false)
-		errors = errors[0:0]
-
-		// restore permissions
-		os.Chmod(filepath.Join(tree.name, tree.entries[1].name), 0770)
-		os.Chmod(filepath.Join(tree.name, tree.entries[3].name), 0770)
-	}
-
-	// cleanup
-	if err := os.RemoveAll(tree.name); err != nil {
-		t.Errorf("removeTree: %v", err)
-	}
-}
-
-func touch(t *testing.T, name string) {
-	f, err := os.Create(name)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if err := f.Close(); err != nil {
-		t.Fatal(err)
-	}
-}
-
-func TestWalkSkipDirOnFile(t *testing.T) {
-	td, err := ioutil.TempDir("", "walktest")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(td)
-
-	if err := os.MkdirAll(filepath.Join(td, "dir"), 0755); err != nil {
-		t.Fatal(err)
-	}
-	touch(t, filepath.Join(td, "dir/foo1"))
-	touch(t, filepath.Join(td, "dir/foo2"))
-
-	sawFoo2 := false
-	filepath.Walk(td, func(path string, info os.FileInfo, err error) error {
-		if strings.HasSuffix(path, "foo2") {
-			sawFoo2 = true
-		}
-		if strings.HasSuffix(path, "foo1") {
-			return filepath.SkipDir
-		}
-		return nil
-	})
-
-	if sawFoo2 {
-		t.Errorf("SkipDir on file foo1 did not block processing of foo2")
-	}
-}
-
-func TestWalkFileError(t *testing.T) {
-	td, err := ioutil.TempDir("", "walktest")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(td)
-
-	touch(t, filepath.Join(td, "foo"))
-	touch(t, filepath.Join(td, "bar"))
-	dir := filepath.Join(td, "dir")
-	if err := os.MkdirAll(filepath.Join(td, "dir"), 0755); err != nil {
-		t.Fatal(err)
-	}
-	touch(t, filepath.Join(dir, "baz"))
-	touch(t, filepath.Join(dir, "stat-error"))
-	defer func() {
-		*filepath.LstatP = os.Lstat
-	}()
-	statErr := errors.New("some stat error")
-	*filepath.LstatP = func(path string) (os.FileInfo, error) {
-		if strings.HasSuffix(path, "stat-error") {
-			return nil, statErr
-		}
-		return os.Lstat(path)
-	}
-	got := map[string]error{}
-	err = filepath.Walk(td, func(path string, fi os.FileInfo, err error) error {
-		rel, _ := filepath.Rel(td, path)
-		got[filepath.ToSlash(rel)] = err
-		return nil
-	})
-	if err != nil {
-		t.Errorf("Walk error: %v", err)
-	}
-	want := map[string]error{
-		".":              nil,
-		"foo":            nil,
-		"bar":            nil,
-		"dir":            nil,
-		"dir/baz":        nil,
-		"dir/stat-error": statErr,
-	}
-	if !reflect.DeepEqual(got, want) {
-		t.Errorf("Walked %#v; want %#v", got, want)
-	}
-}
-
-var basetests = []PathTest{
-	{"", "."},
-	{".", "."},
-	{"/.", "."},
-	{"/", "/"},
-	{"////", "/"},
-	{"x/", "x"},
-	{"abc", "abc"},
-	{"abc/def", "def"},
-	{"a/b/.x", ".x"},
-	{"a/b/c.", "c."},
-	{"a/b/c.x", "c.x"},
-}
-
-var winbasetests = []PathTest{
-	{`c:\`, `\`},
-	{`c:.`, `.`},
-	{`c:\a\b`, `b`},
-	{`c:a\b`, `b`},
-	{`c:a\b\c`, `c`},
-	{`\\host\share\`, `\`},
-	{`\\host\share\a`, `a`},
-	{`\\host\share\a\b`, `b`},
-}
-
-func TestBase(t *testing.T) {
-	tests := basetests
-	if runtime.GOOS == "windows" {
-		// make unix tests work on windows
-		for i := range tests {
-			tests[i].result = filepath.Clean(tests[i].result)
-		}
-		// add windows specific tests
-		tests = append(tests, winbasetests...)
-	}
-	for _, test := range tests {
-		if s := filepath.Base(test.path); s != test.result {
-			t.Errorf("Base(%q) = %q, want %q", test.path, s, test.result)
-		}
-	}
-}
-
-var dirtests = []PathTest{
-	{"", "."},
-	{".", "."},
-	{"/.", "/"},
-	{"/", "/"},
-	{"////", "/"},
-	{"/foo", "/"},
-	{"x/", "x"},
-	{"abc", "."},
-	{"abc/def", "abc"},
-	{"a/b/.x", "a/b"},
-	{"a/b/c.", "a/b"},
-	{"a/b/c.x", "a/b"},
-}
-
-var windirtests = []PathTest{
-	{`c:\`, `c:\`},
-	{`c:.`, `c:.`},
-	{`c:\a\b`, `c:\a`},
-	{`c:a\b`, `c:a`},
-	{`c:a\b\c`, `c:a\b`},
-	{`\\host\share\`, `\\host\share\`},
-	{`\\host\share\a`, `\\host\share\`},
-	{`\\host\share\a\b`, `\\host\share\a`},
-}
-
-func TestDir(t *testing.T) {
-	tests := dirtests
-	if runtime.GOOS == "windows" {
-		// make unix tests work on windows
-		for i := range tests {
-			tests[i].result = filepath.Clean(tests[i].result)
-		}
-		// add windows specific tests
-		tests = append(tests, windirtests...)
-	}
-	for _, test := range tests {
-		if s := filepath.Dir(test.path); s != test.result {
-			t.Errorf("Dir(%q) = %q, want %q", test.path, s, test.result)
-		}
-	}
-}
-
-type IsAbsTest struct {
-	path  string
-	isAbs bool
-}
-
-var isabstests = []IsAbsTest{
-	{"", false},
-	{"/", true},
-	{"/usr/bin/gcc", true},
-	{"..", false},
-	{"/a/../bb", true},
-	{".", false},
-	{"./", false},
-	{"lala", false},
-}
-
-var winisabstests = []IsAbsTest{
-	{`C:\`, true},
-	{`c\`, false},
-	{`c::`, false},
-	{`c:`, false},
-	{`/`, false},
-	{`\`, false},
-	{`\Windows`, false},
-	{`c:a\b`, false},
-	{`c:\a\b`, true},
-	{`c:/a/b`, true},
-	{`\\host\share\foo`, true},
-	{`//host/share/foo/bar`, true},
-}
-
-func TestIsAbs(t *testing.T) {
-	var tests []IsAbsTest
-	if runtime.GOOS == "windows" {
-		tests = append(tests, winisabstests...)
-		// All non-windows tests should fail, because they have no volume letter.
-		for _, test := range isabstests {
-			tests = append(tests, IsAbsTest{test.path, false})
-		}
-		// All non-windows test should work as intended if prefixed with volume letter.
-		for _, test := range isabstests {
-			tests = append(tests, IsAbsTest{"c:" + test.path, test.isAbs})
-		}
-	} else {
-		tests = isabstests
-	}
-
-	for _, test := range tests {
-		if r := filepath.IsAbs(test.path); r != test.isAbs {
-			t.Errorf("IsAbs(%q) = %v, want %v", test.path, r, test.isAbs)
-		}
-	}
-}
-
-type EvalSymlinksTest struct {
-	// If dest is empty, the path is created; otherwise the dest is symlinked to the path.
-	path, dest string
-}
-
-var EvalSymlinksTestDirs = []EvalSymlinksTest{
-	{"test", ""},
-	{"test/dir", ""},
-	{"test/dir/link3", "../../"},
-	{"test/link1", "../test"},
-	{"test/link2", "dir"},
-	{"test/linkabs", "/"},
-}
-
-var EvalSymlinksTests = []EvalSymlinksTest{
-	{"test", "test"},
-	{"test/dir", "test/dir"},
-	{"test/dir/../..", "."},
-	{"test/link1", "test"},
-	{"test/link2", "test/dir"},
-	{"test/link1/dir", "test/dir"},
-	{"test/link2/..", "test"},
-	{"test/dir/link3", "."},
-	{"test/link2/link3/test", "test"},
-	{"test/linkabs", "/"},
-}
-
-var EvalSymlinksAbsWindowsTests = []EvalSymlinksTest{
-	{`c:\`, `c:\`},
-}
-
-// simpleJoin builds a file name from the directory and path.
-// It does not use Join because we don't want ".." to be evaluated.
-func simpleJoin(dir, path string) string {
-	return dir + string(filepath.Separator) + path
-}
-
-func TestEvalSymlinks(t *testing.T) {
-	switch runtime.GOOS {
-	case "nacl", "plan9":
-		t.Skipf("skipping on %s", runtime.GOOS)
-	}
-
-	tmpDir, err := ioutil.TempDir("", "evalsymlink")
-	if err != nil {
-		t.Fatal("creating temp dir:", err)
-	}
-	defer os.RemoveAll(tmpDir)
-
-	// /tmp may itself be a symlink! Avoid the confusion, although
-	// it means trusting the thing we're testing.
-	tmpDir, err = filepath.EvalSymlinks(tmpDir)
-	if err != nil {
-		t.Fatal("eval symlink for tmp dir:", err)
-	}
-
-	// Create the symlink farm using relative paths.
-	for _, d := range EvalSymlinksTestDirs {
-		var err error
-		path := simpleJoin(tmpDir, d.path)
-		if d.dest == "" {
-			err = os.Mkdir(path, 0755)
-		} else {
-			if supportsSymlinks {
-				err = os.Symlink(d.dest, path)
-			}
-		}
-		if err != nil {
-			t.Fatal(err)
-		}
-	}
-
-	var tests []EvalSymlinksTest
-	if supportsSymlinks {
-		tests = EvalSymlinksTests
-	} else {
-		for _, d := range EvalSymlinksTests {
-			if d.path == d.dest {
-				// will test only real files and directories
-				tests = append(tests, d)
-				// test "canonical" names
-				d2 := EvalSymlinksTest{
-					path: strings.ToUpper(d.path),
-					dest: d.dest,
-				}
-				tests = append(tests, d2)
-			}
-		}
-	}
-
-	// Evaluate the symlink farm.
-	for _, d := range tests {
-		path := simpleJoin(tmpDir, d.path)
-		dest := simpleJoin(tmpDir, d.dest)
-		if filepath.IsAbs(d.dest) || os.IsPathSeparator(d.dest[0]) {
-			dest = d.dest
-		}
-		if p, err := filepath.EvalSymlinks(path); err != nil {
-			t.Errorf("EvalSymlinks(%q) error: %v", d.path, err)
-		} else if filepath.Clean(p) != filepath.Clean(dest) {
-			t.Errorf("Clean(%q)=%q, want %q", path, p, dest)
-		}
-	}
-}
-
-// Test directories relative to temporary directory.
-// The tests are run in absTestDirs[0].
-var absTestDirs = []string{
-	"a",
-	"a/b",
-	"a/b/c",
-}
-
-// Test paths relative to temporary directory. $ expands to the directory.
-// The tests are run in absTestDirs[0].
-// We create absTestDirs first.
-var absTests = []string{
-	".",
-	"b",
-	"../a",
-	"../a/b",
-	"../a/b/./c/../../.././a",
-	"$",
-	"$/.",
-	"$/a/../a/b",
-	"$/a/b/c/../../.././a",
-}
-
-func TestAbs(t *testing.T) {
-	root, err := ioutil.TempDir("", "TestAbs")
-	if err != nil {
-		t.Fatal("TempDir failed: ", err)
-	}
-	defer os.RemoveAll(root)
-
-	wd, err := os.Getwd()
-	if err != nil {
-		t.Fatal("getwd failed: ", err)
-	}
-	err = os.Chdir(root)
-	if err != nil {
-		t.Fatal("chdir failed: ", err)
-	}
-	defer os.Chdir(wd)
-
-	for _, dir := range absTestDirs {
-		err = os.Mkdir(dir, 0777)
-		if err != nil {
-			t.Fatal("Mkdir failed: ", err)
-		}
-	}
-
-	if runtime.GOOS == "windows" {
-		vol := filepath.VolumeName(root)
-		var extra []string
-		for _, path := range absTests {
-			if strings.Index(path, "$") != -1 {
-				continue
-			}
-			path = vol + path
-			extra = append(extra, path)
-		}
-		absTests = append(absTests, extra...)
-	}
-
-	err = os.Chdir(absTestDirs[0])
-	if err != nil {
-		t.Fatal("chdir failed: ", err)
-	}
-
-	for _, path := range absTests {
-		path = strings.Replace(path, "$", root, -1)
-		info, err := os.Stat(path)
-		if err != nil {
-			t.Errorf("%s: %s", path, err)
-			continue
-		}
-
-		abspath, err := filepath.Abs(path)
-		if err != nil {
-			t.Errorf("Abs(%q) error: %v", path, err)
-			continue
-		}
-		absinfo, err := os.Stat(abspath)
-		if err != nil || !os.SameFile(absinfo, info) {
-			t.Errorf("Abs(%q)=%q, not the same file", path, abspath)
-		}
-		if !filepath.IsAbs(abspath) {
-			t.Errorf("Abs(%q)=%q, not an absolute path", path, abspath)
-		}
-		if filepath.IsAbs(path) && abspath != filepath.Clean(path) {
-			t.Errorf("Abs(%q)=%q, isn't clean", path, abspath)
-		}
-	}
-}
-
-type RelTests struct {
-	root, path, want string
-}
-
-var reltests = []RelTests{
-	{"a/b", "a/b", "."},
-	{"a/b/.", "a/b", "."},
-	{"a/b", "a/b/.", "."},
-	{"./a/b", "a/b", "."},
-	{"a/b", "./a/b", "."},
-	{"ab/cd", "ab/cde", "../cde"},
-	{"ab/cd", "ab/c", "../c"},
-	{"a/b", "a/b/c/d", "c/d"},
-	{"a/b", "a/b/../c", "../c"},
-	{"a/b/../c", "a/b", "../b"},
-	{"a/b/c", "a/c/d", "../../c/d"},
-	{"a/b", "c/d", "../../c/d"},
-	{"a/b/c/d", "a/b", "../.."},
-	{"a/b/c/d", "a/b/", "../.."},
-	{"a/b/c/d/", "a/b", "../.."},
-	{"a/b/c/d/", "a/b/", "../.."},
-	{"../../a/b", "../../a/b/c/d", "c/d"},
-	{"/a/b", "/a/b", "."},
-	{"/a/b/.", "/a/b", "."},
-	{"/a/b", "/a/b/.", "."},
-	{"/ab/cd", "/ab/cde", "../cde"},
-	{"/ab/cd", "/ab/c", "../c"},
-	{"/a/b", "/a/b/c/d", "c/d"},
-	{"/a/b", "/a/b/../c", "../c"},
-	{"/a/b/../c", "/a/b", "../b"},
-	{"/a/b/c", "/a/c/d", "../../c/d"},
-	{"/a/b", "/c/d", "../../c/d"},
-	{"/a/b/c/d", "/a/b", "../.."},
-	{"/a/b/c/d", "/a/b/", "../.."},
-	{"/a/b/c/d/", "/a/b", "../.."},
-	{"/a/b/c/d/", "/a/b/", "../.."},
-	{"/../../a/b", "/../../a/b/c/d", "c/d"},
-	{".", "a/b", "a/b"},
-	{".", "..", ".."},
-
-	// can't do purely lexically
-	{"..", ".", "err"},
-	{"..", "a", "err"},
-	{"../..", "..", "err"},
-	{"a", "/a", "err"},
-	{"/a", "a", "err"},
-}
-
-var winreltests = []RelTests{
-	{`C:a\b\c`, `C:a/b/d`, `..\d`},
-	{`C:\`, `D:\`, `err`},
-	{`C:`, `D:`, `err`},
-}
-
-func TestRel(t *testing.T) {
-	tests := append([]RelTests{}, reltests...)
-	if runtime.GOOS == "windows" {
-		for i := range tests {
-			tests[i].want = filepath.FromSlash(tests[i].want)
-		}
-		tests = append(tests, winreltests...)
-	}
-	for _, test := range tests {
-		got, err := filepath.Rel(test.root, test.path)
-		if test.want == "err" {
-			if err == nil {
-				t.Errorf("Rel(%q, %q)=%q, want error", test.root, test.path, got)
-			}
-			continue
-		}
-		if err != nil {
-			t.Errorf("Rel(%q, %q): want %q, got error: %s", test.root, test.path, test.want, err)
-		}
-		if got != test.want {
-			t.Errorf("Rel(%q, %q)=%q, want %q", test.root, test.path, got, test.want)
-		}
-	}
-}
-
-type VolumeNameTest struct {
-	path string
-	vol  string
-}
-
-var volumenametests = []VolumeNameTest{
-	{`c:/foo/bar`, `c:`},
-	{`c:`, `c:`},
-	{`2:`, ``},
-	{``, ``},
-	{`\\\host`, ``},
-	{`\\\host\`, ``},
-	{`\\\host\share`, ``},
-	{`\\\host\\share`, ``},
-	{`\\host`, ``},
-	{`//host`, ``},
-	{`\\host\`, ``},
-	{`//host/`, ``},
-	{`\\host\share`, `\\host\share`},
-	{`//host/share`, `//host/share`},
-	{`\\host\share\`, `\\host\share`},
-	{`//host/share/`, `//host/share`},
-	{`\\host\share\foo`, `\\host\share`},
-	{`//host/share/foo`, `//host/share`},
-	{`\\host\share\\foo\\\bar\\\\baz`, `\\host\share`},
-	{`//host/share//foo///bar////baz`, `//host/share`},
-	{`\\host\share\foo\..\bar`, `\\host\share`},
-	{`//host/share/foo/../bar`, `//host/share`},
-}
-
-func TestVolumeName(t *testing.T) {
-	if runtime.GOOS != "windows" {
-		return
-	}
-	for _, v := range volumenametests {
-		if vol := filepath.VolumeName(v.path); vol != v.vol {
-			t.Errorf("VolumeName(%q)=%q, want %q", v.path, vol, v.vol)
-		}
-	}
-}
-
-func TestDriveLetterInEvalSymlinks(t *testing.T) {
-	if runtime.GOOS != "windows" {
-		return
-	}
-	wd, _ := os.Getwd()
-	if len(wd) < 3 {
-		t.Errorf("Current directory path %q is too short", wd)
-	}
-	lp := strings.ToLower(wd)
-	up := strings.ToUpper(wd)
-	flp, err := filepath.EvalSymlinks(lp)
-	if err != nil {
-		t.Fatalf("EvalSymlinks(%q) failed: %q", lp, err)
-	}
-	fup, err := filepath.EvalSymlinks(up)
-	if err != nil {
-		t.Fatalf("EvalSymlinks(%q) failed: %q", up, err)
-	}
-	if flp != fup {
-		t.Errorf("Results of EvalSymlinks do not match: %q and %q", flp, fup)
-	}
-}
-
-func TestBug3486(t *testing.T) { // https://golang.org/issue/3486
-	t.Skip("skipping test because gccgo sources are arranged differently.")
-	if runtime.GOOS == "darwin" {
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			t.Skipf("skipping on %s/%s", runtime.GOOS, runtime.GOARCH)
-		}
-	}
-	root, err := filepath.EvalSymlinks(runtime.GOROOT() + "/test")
-	if err != nil {
-		t.Fatal(err)
-	}
-	bugs := filepath.Join(root, "bugs")
-	ken := filepath.Join(root, "ken")
-	seenBugs := false
-	seenKen := false
-	filepath.Walk(root, func(pth string, info os.FileInfo, err error) error {
-		if err != nil {
-			t.Fatal(err)
-		}
-
-		switch pth {
-		case bugs:
-			seenBugs = true
-			return filepath.SkipDir
-		case ken:
-			if !seenBugs {
-				t.Fatal("filepath.Walk out of order - ken before bugs")
-			}
-			seenKen = true
-		}
-		return nil
-	})
-	if !seenKen {
-		t.Fatalf("%q not seen", ken)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/path/filepath/path_unix.go b/third_party/gofrontend/libgo/go/path/filepath/path_unix.go
deleted file mode 100644
index d241d78..0000000
--- a/third_party/gofrontend/libgo/go/path/filepath/path_unix.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package filepath
-
-import "strings"
-
-// IsAbs reports whether the path is absolute.
-func IsAbs(path string) bool {
-	return strings.HasPrefix(path, "/")
-}
-
-// volumeNameLen returns length of the leading volume name on Windows.
-// It returns 0 elsewhere.
-func volumeNameLen(path string) int {
-	return 0
-}
-
-// HasPrefix exists for historical compatibility and should not be used.
-func HasPrefix(p, prefix string) bool {
-	return strings.HasPrefix(p, prefix)
-}
-
-func splitList(path string) []string {
-	if path == "" {
-		return []string{}
-	}
-	return strings.Split(path, string(ListSeparator))
-}
-
-func abs(path string) (string, error) {
-	return unixAbs(path)
-}
-
-func join(elem []string) string {
-	// If there's a bug here, fix the logic in ./path_plan9.go too.
-	for i, e := range elem {
-		if e != "" {
-			return Clean(strings.Join(elem[i:], string(Separator)))
-		}
-	}
-	return ""
-}
diff --git a/third_party/gofrontend/libgo/go/path/filepath/path_windows.go b/third_party/gofrontend/libgo/go/path/filepath/path_windows.go
deleted file mode 100644
index bcfe0a3..0000000
--- a/third_party/gofrontend/libgo/go/path/filepath/path_windows.go
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package filepath
-
-import (
-	"strings"
-	"syscall"
-)
-
-func isSlash(c uint8) bool {
-	return c == '\\' || c == '/'
-}
-
-// IsAbs reports whether the path is absolute.
-func IsAbs(path string) (b bool) {
-	l := volumeNameLen(path)
-	if l == 0 {
-		return false
-	}
-	path = path[l:]
-	if path == "" {
-		return false
-	}
-	return isSlash(path[0])
-}
-
-// volumeNameLen returns length of the leading volume name on Windows.
-// It returns 0 elsewhere.
-func volumeNameLen(path string) int {
-	if len(path) < 2 {
-		return 0
-	}
-	// with drive letter
-	c := path[0]
-	if path[1] == ':' && ('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z') {
-		return 2
-	}
-	// is it UNC
-	if l := len(path); l >= 5 && isSlash(path[0]) && isSlash(path[1]) &&
-		!isSlash(path[2]) && path[2] != '.' {
-		// first, leading `\\` and next shouldn't be `\`. its server name.
-		for n := 3; n < l-1; n++ {
-			// second, next '\' shouldn't be repeated.
-			if isSlash(path[n]) {
-				n++
-				// third, following something characters. its share name.
-				if !isSlash(path[n]) {
-					if path[n] == '.' {
-						break
-					}
-					for ; n < l; n++ {
-						if isSlash(path[n]) {
-							break
-						}
-					}
-					return n
-				}
-				break
-			}
-		}
-	}
-	return 0
-}
-
-// HasPrefix exists for historical compatibility and should not be used.
-func HasPrefix(p, prefix string) bool {
-	if strings.HasPrefix(p, prefix) {
-		return true
-	}
-	return strings.HasPrefix(strings.ToLower(p), strings.ToLower(prefix))
-}
-
-func splitList(path string) []string {
-	// The same implementation is used in LookPath in os/exec;
-	// consider changing os/exec when changing this.
-
-	if path == "" {
-		return []string{}
-	}
-
-	// Split path, respecting but preserving quotes.
-	list := []string{}
-	start := 0
-	quo := false
-	for i := 0; i < len(path); i++ {
-		switch c := path[i]; {
-		case c == '"':
-			quo = !quo
-		case c == ListSeparator && !quo:
-			list = append(list, path[start:i])
-			start = i + 1
-		}
-	}
-	list = append(list, path[start:])
-
-	// Remove quotes.
-	for i, s := range list {
-		if strings.Contains(s, `"`) {
-			list[i] = strings.Replace(s, `"`, ``, -1)
-		}
-	}
-
-	return list
-}
-
-func abs(path string) (string, error) {
-	return syscall.FullPath(path)
-}
-
-func join(elem []string) string {
-	for i, e := range elem {
-		if e != "" {
-			return joinNonEmpty(elem[i:])
-		}
-	}
-	return ""
-}
-
-// joinNonEmpty is like join, but it assumes that the first element is non-empty.
-func joinNonEmpty(elem []string) string {
-	// The following logic prevents Join from inadvertently creating a
-	// UNC path on Windows. Unless the first element is a UNC path, Join
-	// shouldn't create a UNC path. See golang.org/issue/9167.
-	p := Clean(strings.Join(elem, string(Separator)))
-	if !isUNC(p) {
-		return p
-	}
-	// p == UNC only allowed when the first element is a UNC path.
-	head := Clean(elem[0])
-	if isUNC(head) {
-		return p
-	}
-	// head + tail == UNC, but joining two non-UNC paths should not result
-	// in a UNC path. Undo creation of UNC path.
-	tail := Clean(strings.Join(elem[1:], string(Separator)))
-	if head[len(head)-1] == Separator {
-		return head + tail
-	}
-	return head + string(Separator) + tail
-}
-
-// isUNC reports whether path is a UNC path.
-func isUNC(path string) bool {
-	return volumeNameLen(path) > 2
-}
diff --git a/third_party/gofrontend/libgo/go/path/filepath/symlink.go b/third_party/gofrontend/libgo/go/path/filepath/symlink.go
deleted file mode 100644
index df0a9e0..0000000
--- a/third_party/gofrontend/libgo/go/path/filepath/symlink.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package filepath
-
-import (
-	"bytes"
-	"errors"
-	"os"
-)
-
-const utf8RuneSelf = 0x80
-
-func walkSymlinks(path string) (string, error) {
-	const maxIter = 255
-	originalPath := path
-	// consume path by taking each frontmost path element,
-	// expanding it if it's a symlink, and appending it to b
-	var b bytes.Buffer
-	for n := 0; path != ""; n++ {
-		if n > maxIter {
-			return "", errors.New("EvalSymlinks: too many links in " + originalPath)
-		}
-
-		// find next path component, p
-		var i = -1
-		for j, c := range path {
-			if c < utf8RuneSelf && os.IsPathSeparator(uint8(c)) {
-				i = j
-				break
-			}
-		}
-		var p string
-		if i == -1 {
-			p, path = path, ""
-		} else {
-			p, path = path[:i], path[i+1:]
-		}
-
-		if p == "" {
-			if b.Len() == 0 {
-				// must be absolute path
-				b.WriteRune(Separator)
-			}
-			continue
-		}
-
-		fi, err := os.Lstat(b.String() + p)
-		if err != nil {
-			return "", err
-		}
-		if fi.Mode()&os.ModeSymlink == 0 {
-			b.WriteString(p)
-			if path != "" || (b.Len() == 2 && len(p) == 2 && p[1] == ':') {
-				b.WriteRune(Separator)
-			}
-			continue
-		}
-
-		// it's a symlink, put it at the front of path
-		dest, err := os.Readlink(b.String() + p)
-		if err != nil {
-			return "", err
-		}
-		if IsAbs(dest) || os.IsPathSeparator(dest[0]) {
-			b.Reset()
-		}
-		path = dest + string(Separator) + path
-	}
-	return Clean(b.String()), nil
-}
diff --git a/third_party/gofrontend/libgo/go/path/filepath/symlink_unix.go b/third_party/gofrontend/libgo/go/path/filepath/symlink_unix.go
deleted file mode 100644
index d20e63a..0000000
--- a/third_party/gofrontend/libgo/go/path/filepath/symlink_unix.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// +build !windows
-
-package filepath
-
-func evalSymlinks(path string) (string, error) {
-	return walkSymlinks(path)
-}
diff --git a/third_party/gofrontend/libgo/go/path/filepath/symlink_windows.go b/third_party/gofrontend/libgo/go/path/filepath/symlink_windows.go
deleted file mode 100644
index 4b38f6f..0000000
--- a/third_party/gofrontend/libgo/go/path/filepath/symlink_windows.go
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package filepath
-
-import (
-	"syscall"
-)
-
-func toShort(path string) (string, error) {
-	p, err := syscall.UTF16FromString(path)
-	if err != nil {
-		return "", err
-	}
-	b := p // GetShortPathName says we can reuse buffer
-	n := uint32(len(b))
-	for {
-		n, err = syscall.GetShortPathName(&p[0], &b[0], uint32(len(b)))
-		if err != nil {
-			return "", err
-		}
-		if n <= uint32(len(b)) {
-			return syscall.UTF16ToString(b[:n]), nil
-		}
-		b = make([]uint16, n)
-	}
-}
-
-func toLong(path string) (string, error) {
-	p, err := syscall.UTF16FromString(path)
-	if err != nil {
-		return "", err
-	}
-	b := p // GetLongPathName says we can reuse buffer
-	n := uint32(len(b))
-	for {
-		n, err = syscall.GetLongPathName(&p[0], &b[0], uint32(len(b)))
-		if err != nil {
-			return "", err
-		}
-		if n <= uint32(len(b)) {
-			return syscall.UTF16ToString(b[:n]), nil
-		}
-		b = make([]uint16, n)
-	}
-}
-
-func evalSymlinks(path string) (string, error) {
-	path, err := walkSymlinks(path)
-	if err != nil {
-		return "", err
-	}
-
-	p, err := toShort(path)
-	if err != nil {
-		return "", err
-	}
-	p, err = toLong(p)
-	if err != nil {
-		return "", err
-	}
-	// syscall.GetLongPathName does not change the case of the drive letter,
-	// but the result of EvalSymlinks must be unique, so we have
-	// EvalSymlinks(`c:\a`) == EvalSymlinks(`C:\a`).
-	// Make drive letter upper case.
-	if len(p) >= 2 && p[1] == ':' && 'a' <= p[0] && p[0] <= 'z' {
-		p = string(p[0]+'A'-'a') + p[1:]
-	}
-	return Clean(p), nil
-}
diff --git a/third_party/gofrontend/libgo/go/path/match.go b/third_party/gofrontend/libgo/go/path/match.go
deleted file mode 100644
index 75dd3b3..0000000
--- a/third_party/gofrontend/libgo/go/path/match.go
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package path
-
-import (
-	"errors"
-	"strings"
-	"unicode/utf8"
-)
-
-// ErrBadPattern indicates a globbing pattern was malformed.
-var ErrBadPattern = errors.New("syntax error in pattern")
-
-// Match reports whether name matches the shell file name pattern.
-// The pattern syntax is:
-//
-//	pattern:
-//		{ term }
-//	term:
-//		'*'         matches any sequence of non-/ characters
-//		'?'         matches any single non-/ character
-//		'[' [ '^' ] { character-range } ']'
-//		            character class (must be non-empty)
-//		c           matches character c (c != '*', '?', '\\', '[')
-//		'\\' c      matches character c
-//
-//	character-range:
-//		c           matches character c (c != '\\', '-', ']')
-//		'\\' c      matches character c
-//		lo '-' hi   matches character c for lo <= c <= hi
-//
-// Match requires pattern to match all of name, not just a substring.
-// The only possible returned error is ErrBadPattern, when pattern
-// is malformed.
-//
-func Match(pattern, name string) (matched bool, err error) {
-Pattern:
-	for len(pattern) > 0 {
-		var star bool
-		var chunk string
-		star, chunk, pattern = scanChunk(pattern)
-		if star && chunk == "" {
-			// Trailing * matches rest of string unless it has a /.
-			return strings.Index(name, "/") < 0, nil
-		}
-		// Look for match at current position.
-		t, ok, err := matchChunk(chunk, name)
-		// if we're the last chunk, make sure we've exhausted the name
-		// otherwise we'll give a false result even if we could still match
-		// using the star
-		if ok && (len(t) == 0 || len(pattern) > 0) {
-			name = t
-			continue
-		}
-		if err != nil {
-			return false, err
-		}
-		if star {
-			// Look for match skipping i+1 bytes.
-			// Cannot skip /.
-			for i := 0; i < len(name) && name[i] != '/'; i++ {
-				t, ok, err := matchChunk(chunk, name[i+1:])
-				if ok {
-					// if we're the last chunk, make sure we exhausted the name
-					if len(pattern) == 0 && len(t) > 0 {
-						continue
-					}
-					name = t
-					continue Pattern
-				}
-				if err != nil {
-					return false, err
-				}
-			}
-		}
-		return false, nil
-	}
-	return len(name) == 0, nil
-}
-
-// scanChunk gets the next segment of pattern, which is a non-star string
-// possibly preceded by a star.
-func scanChunk(pattern string) (star bool, chunk, rest string) {
-	for len(pattern) > 0 && pattern[0] == '*' {
-		pattern = pattern[1:]
-		star = true
-	}
-	inrange := false
-	var i int
-Scan:
-	for i = 0; i < len(pattern); i++ {
-		switch pattern[i] {
-		case '\\':
-			// error check handled in matchChunk: bad pattern.
-			if i+1 < len(pattern) {
-				i++
-			}
-		case '[':
-			inrange = true
-		case ']':
-			inrange = false
-		case '*':
-			if !inrange {
-				break Scan
-			}
-		}
-	}
-	return star, pattern[0:i], pattern[i:]
-}
-
-// matchChunk checks whether chunk matches the beginning of s.
-// If so, it returns the remainder of s (after the match).
-// Chunk is all single-character operators: literals, char classes, and ?.
-func matchChunk(chunk, s string) (rest string, ok bool, err error) {
-	for len(chunk) > 0 {
-		if len(s) == 0 {
-			return
-		}
-		switch chunk[0] {
-		case '[':
-			// character class
-			r, n := utf8.DecodeRuneInString(s)
-			s = s[n:]
-			chunk = chunk[1:]
-			// possibly negated
-			notNegated := true
-			if len(chunk) > 0 && chunk[0] == '^' {
-				notNegated = false
-				chunk = chunk[1:]
-			}
-			// parse all ranges
-			match := false
-			nrange := 0
-			for {
-				if len(chunk) > 0 && chunk[0] == ']' && nrange > 0 {
-					chunk = chunk[1:]
-					break
-				}
-				var lo, hi rune
-				if lo, chunk, err = getEsc(chunk); err != nil {
-					return
-				}
-				hi = lo
-				if chunk[0] == '-' {
-					if hi, chunk, err = getEsc(chunk[1:]); err != nil {
-						return
-					}
-				}
-				if lo <= r && r <= hi {
-					match = true
-				}
-				nrange++
-			}
-			if match != notNegated {
-				return
-			}
-
-		case '?':
-			if s[0] == '/' {
-				return
-			}
-			_, n := utf8.DecodeRuneInString(s)
-			s = s[n:]
-			chunk = chunk[1:]
-
-		case '\\':
-			chunk = chunk[1:]
-			if len(chunk) == 0 {
-				err = ErrBadPattern
-				return
-			}
-			fallthrough
-
-		default:
-			if chunk[0] != s[0] {
-				return
-			}
-			s = s[1:]
-			chunk = chunk[1:]
-		}
-	}
-	return s, true, nil
-}
-
-// getEsc gets a possibly-escaped character from chunk, for a character class.
-func getEsc(chunk string) (r rune, nchunk string, err error) {
-	if len(chunk) == 0 || chunk[0] == '-' || chunk[0] == ']' {
-		err = ErrBadPattern
-		return
-	}
-	if chunk[0] == '\\' {
-		chunk = chunk[1:]
-		if len(chunk) == 0 {
-			err = ErrBadPattern
-			return
-		}
-	}
-	r, n := utf8.DecodeRuneInString(chunk)
-	if r == utf8.RuneError && n == 1 {
-		err = ErrBadPattern
-	}
-	nchunk = chunk[n:]
-	if len(nchunk) == 0 {
-		err = ErrBadPattern
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/path/match_test.go b/third_party/gofrontend/libgo/go/path/match_test.go
deleted file mode 100644
index 6b0676f..0000000
--- a/third_party/gofrontend/libgo/go/path/match_test.go
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package path
-
-import "testing"
-
-type MatchTest struct {
-	pattern, s string
-	match      bool
-	err        error
-}
-
-var matchTests = []MatchTest{
-	{"abc", "abc", true, nil},
-	{"*", "abc", true, nil},
-	{"*c", "abc", true, nil},
-	{"a*", "a", true, nil},
-	{"a*", "abc", true, nil},
-	{"a*", "ab/c", false, nil},
-	{"a*/b", "abc/b", true, nil},
-	{"a*/b", "a/c/b", false, nil},
-	{"a*b*c*d*e*/f", "axbxcxdxe/f", true, nil},
-	{"a*b*c*d*e*/f", "axbxcxdxexxx/f", true, nil},
-	{"a*b*c*d*e*/f", "axbxcxdxe/xxx/f", false, nil},
-	{"a*b*c*d*e*/f", "axbxcxdxexxx/fff", false, nil},
-	{"a*b?c*x", "abxbbxdbxebxczzx", true, nil},
-	{"a*b?c*x", "abxbbxdbxebxczzy", false, nil},
-	{"ab[c]", "abc", true, nil},
-	{"ab[b-d]", "abc", true, nil},
-	{"ab[e-g]", "abc", false, nil},
-	{"ab[^c]", "abc", false, nil},
-	{"ab[^b-d]", "abc", false, nil},
-	{"ab[^e-g]", "abc", true, nil},
-	{"a\\*b", "a*b", true, nil},
-	{"a\\*b", "ab", false, nil},
-	{"a?b", "a☺b", true, nil},
-	{"a[^a]b", "a☺b", true, nil},
-	{"a???b", "a☺b", false, nil},
-	{"a[^a][^a][^a]b", "a☺b", false, nil},
-	{"[a-ζ]*", "α", true, nil},
-	{"*[a-ζ]", "A", false, nil},
-	{"a?b", "a/b", false, nil},
-	{"a*b", "a/b", false, nil},
-	{"[\\]a]", "]", true, nil},
-	{"[\\-]", "-", true, nil},
-	{"[x\\-]", "x", true, nil},
-	{"[x\\-]", "-", true, nil},
-	{"[x\\-]", "z", false, nil},
-	{"[\\-x]", "x", true, nil},
-	{"[\\-x]", "-", true, nil},
-	{"[\\-x]", "a", false, nil},
-	{"[]a]", "]", false, ErrBadPattern},
-	{"[-]", "-", false, ErrBadPattern},
-	{"[x-]", "x", false, ErrBadPattern},
-	{"[x-]", "-", false, ErrBadPattern},
-	{"[x-]", "z", false, ErrBadPattern},
-	{"[-x]", "x", false, ErrBadPattern},
-	{"[-x]", "-", false, ErrBadPattern},
-	{"[-x]", "a", false, ErrBadPattern},
-	{"\\", "a", false, ErrBadPattern},
-	{"[a-b-c]", "a", false, ErrBadPattern},
-	{"[", "a", false, ErrBadPattern},
-	{"[^", "a", false, ErrBadPattern},
-	{"[^bc", "a", false, ErrBadPattern},
-	{"a[", "a", false, nil},
-	{"a[", "ab", false, ErrBadPattern},
-	{"*x", "xxx", true, nil},
-}
-
-func TestMatch(t *testing.T) {
-	for _, tt := range matchTests {
-		ok, err := Match(tt.pattern, tt.s)
-		if ok != tt.match || err != tt.err {
-			t.Errorf("Match(%#q, %#q) = %v, %v want %v, nil", tt.pattern, tt.s, ok, err, tt.match)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/path/path.go b/third_party/gofrontend/libgo/go/path/path.go
deleted file mode 100644
index 77f2185..0000000
--- a/third_party/gofrontend/libgo/go/path/path.go
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package path implements utility routines for manipulating slash-separated
-// paths.
-package path
-
-import (
-	"strings"
-)
-
-// A lazybuf is a lazily constructed path buffer.
-// It supports append, reading previously appended bytes,
-// and retrieving the final string. It does not allocate a buffer
-// to hold the output until that output diverges from s.
-type lazybuf struct {
-	s   string
-	buf []byte
-	w   int
-}
-
-func (b *lazybuf) index(i int) byte {
-	if b.buf != nil {
-		return b.buf[i]
-	}
-	return b.s[i]
-}
-
-func (b *lazybuf) append(c byte) {
-	if b.buf == nil {
-		if b.w < len(b.s) && b.s[b.w] == c {
-			b.w++
-			return
-		}
-		b.buf = make([]byte, len(b.s))
-		copy(b.buf, b.s[:b.w])
-	}
-	b.buf[b.w] = c
-	b.w++
-}
-
-func (b *lazybuf) string() string {
-	if b.buf == nil {
-		return b.s[:b.w]
-	}
-	return string(b.buf[:b.w])
-}
-
-// Clean returns the shortest path name equivalent to path
-// by purely lexical processing.  It applies the following rules
-// iteratively until no further processing can be done:
-//
-//	1. Replace multiple slashes with a single slash.
-//	2. Eliminate each . path name element (the current directory).
-//	3. Eliminate each inner .. path name element (the parent directory)
-//	   along with the non-.. element that precedes it.
-//	4. Eliminate .. elements that begin a rooted path:
-//	   that is, replace "/.." by "/" at the beginning of a path.
-//
-// The returned path ends in a slash only if it is the root "/".
-//
-// If the result of this process is an empty string, Clean
-// returns the string ".".
-//
-// See also Rob Pike, ``Lexical File Names in Plan 9 or
-// Getting Dot-Dot Right,''
-// http://plan9.bell-labs.com/sys/doc/lexnames.html
-func Clean(path string) string {
-	if path == "" {
-		return "."
-	}
-
-	rooted := path[0] == '/'
-	n := len(path)
-
-	// Invariants:
-	//	reading from path; r is index of next byte to process.
-	//	writing to buf; w is index of next byte to write.
-	//	dotdot is index in buf where .. must stop, either because
-	//		it is the leading slash or it is a leading ../../.. prefix.
-	out := lazybuf{s: path}
-	r, dotdot := 0, 0
-	if rooted {
-		out.append('/')
-		r, dotdot = 1, 1
-	}
-
-	for r < n {
-		switch {
-		case path[r] == '/':
-			// empty path element
-			r++
-		case path[r] == '.' && (r+1 == n || path[r+1] == '/'):
-			// . element
-			r++
-		case path[r] == '.' && path[r+1] == '.' && (r+2 == n || path[r+2] == '/'):
-			// .. element: remove to last /
-			r += 2
-			switch {
-			case out.w > dotdot:
-				// can backtrack
-				out.w--
-				for out.w > dotdot && out.index(out.w) != '/' {
-					out.w--
-				}
-			case !rooted:
-				// cannot backtrack, but not rooted, so append .. element.
-				if out.w > 0 {
-					out.append('/')
-				}
-				out.append('.')
-				out.append('.')
-				dotdot = out.w
-			}
-		default:
-			// real path element.
-			// add slash if needed
-			if rooted && out.w != 1 || !rooted && out.w != 0 {
-				out.append('/')
-			}
-			// copy element
-			for ; r < n && path[r] != '/'; r++ {
-				out.append(path[r])
-			}
-		}
-	}
-
-	// Turn empty string into "."
-	if out.w == 0 {
-		return "."
-	}
-
-	return out.string()
-}
-
-// Split splits path immediately following the final slash,
-// separating it into a directory and file name component.
-// If there is no slash path, Split returns an empty dir and
-// file set to path.
-// The returned values have the property that path = dir+file.
-func Split(path string) (dir, file string) {
-	i := strings.LastIndex(path, "/")
-	return path[:i+1], path[i+1:]
-}
-
-// Join joins any number of path elements into a single path, adding a
-// separating slash if necessary. The result is Cleaned; in particular,
-// all empty strings are ignored.
-func Join(elem ...string) string {
-	for i, e := range elem {
-		if e != "" {
-			return Clean(strings.Join(elem[i:], "/"))
-		}
-	}
-	return ""
-}
-
-// Ext returns the file name extension used by path.
-// The extension is the suffix beginning at the final dot
-// in the final slash-separated element of path;
-// it is empty if there is no dot.
-func Ext(path string) string {
-	for i := len(path) - 1; i >= 0 && path[i] != '/'; i-- {
-		if path[i] == '.' {
-			return path[i:]
-		}
-	}
-	return ""
-}
-
-// Base returns the last element of path.
-// Trailing slashes are removed before extracting the last element.
-// If the path is empty, Base returns ".".
-// If the path consists entirely of slashes, Base returns "/".
-func Base(path string) string {
-	if path == "" {
-		return "."
-	}
-	// Strip trailing slashes.
-	for len(path) > 0 && path[len(path)-1] == '/' {
-		path = path[0 : len(path)-1]
-	}
-	// Find the last element
-	if i := strings.LastIndex(path, "/"); i >= 0 {
-		path = path[i+1:]
-	}
-	// If empty now, it had only slashes.
-	if path == "" {
-		return "/"
-	}
-	return path
-}
-
-// IsAbs reports whether the path is absolute.
-func IsAbs(path string) bool {
-	return len(path) > 0 && path[0] == '/'
-}
-
-// Dir returns all but the last element of path, typically the path's directory.
-// After dropping the final element using Split, the path is Cleaned and trailing
-// slashes are removed.
-// If the path is empty, Dir returns ".".
-// If the path consists entirely of slashes followed by non-slash bytes, Dir
-// returns a single slash. In any other case, the returned path does not end in a
-// slash.
-func Dir(path string) string {
-	dir, _ := Split(path)
-	return Clean(dir)
-}
diff --git a/third_party/gofrontend/libgo/go/path/path_test.go b/third_party/gofrontend/libgo/go/path/path_test.go
deleted file mode 100644
index 512d936..0000000
--- a/third_party/gofrontend/libgo/go/path/path_test.go
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package path
-
-import (
-	"runtime"
-	"testing"
-)
-
-type PathTest struct {
-	path, result string
-}
-
-var cleantests = []PathTest{
-	// Already clean
-	{"", "."},
-	{"abc", "abc"},
-	{"abc/def", "abc/def"},
-	{"a/b/c", "a/b/c"},
-	{".", "."},
-	{"..", ".."},
-	{"../..", "../.."},
-	{"../../abc", "../../abc"},
-	{"/abc", "/abc"},
-	{"/", "/"},
-
-	// Remove trailing slash
-	{"abc/", "abc"},
-	{"abc/def/", "abc/def"},
-	{"a/b/c/", "a/b/c"},
-	{"./", "."},
-	{"../", ".."},
-	{"../../", "../.."},
-	{"/abc/", "/abc"},
-
-	// Remove doubled slash
-	{"abc//def//ghi", "abc/def/ghi"},
-	{"//abc", "/abc"},
-	{"///abc", "/abc"},
-	{"//abc//", "/abc"},
-	{"abc//", "abc"},
-
-	// Remove . elements
-	{"abc/./def", "abc/def"},
-	{"/./abc/def", "/abc/def"},
-	{"abc/.", "abc"},
-
-	// Remove .. elements
-	{"abc/def/ghi/../jkl", "abc/def/jkl"},
-	{"abc/def/../ghi/../jkl", "abc/jkl"},
-	{"abc/def/..", "abc"},
-	{"abc/def/../..", "."},
-	{"/abc/def/../..", "/"},
-	{"abc/def/../../..", ".."},
-	{"/abc/def/../../..", "/"},
-	{"abc/def/../../../ghi/jkl/../../../mno", "../../mno"},
-
-	// Combinations
-	{"abc/./../def", "def"},
-	{"abc//./../def", "def"},
-	{"abc/../../././../def", "../../def"},
-}
-
-func TestClean(t *testing.T) {
-	for _, test := range cleantests {
-		if s := Clean(test.path); s != test.result {
-			t.Errorf("Clean(%q) = %q, want %q", test.path, s, test.result)
-		}
-		if s := Clean(test.result); s != test.result {
-			t.Errorf("Clean(%q) = %q, want %q", test.result, s, test.result)
-		}
-	}
-}
-
-func TestCleanMallocs(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping malloc count in short mode")
-	}
-	if runtime.GOMAXPROCS(0) > 1 {
-		t.Log("skipping AllocsPerRun checks; GOMAXPROCS>1")
-		return
-	}
-
-	t.Log("Skipping AllocsPerRun for gccgo")
-	return
-
-	for _, test := range cleantests {
-		allocs := testing.AllocsPerRun(100, func() { Clean(test.result) })
-		if allocs > 0 {
-			t.Errorf("Clean(%q): %v allocs, want zero", test.result, allocs)
-		}
-	}
-}
-
-type SplitTest struct {
-	path, dir, file string
-}
-
-var splittests = []SplitTest{
-	{"a/b", "a/", "b"},
-	{"a/b/", "a/b/", ""},
-	{"a/", "a/", ""},
-	{"a", "", "a"},
-	{"/", "/", ""},
-}
-
-func TestSplit(t *testing.T) {
-	for _, test := range splittests {
-		if d, f := Split(test.path); d != test.dir || f != test.file {
-			t.Errorf("Split(%q) = %q, %q, want %q, %q", test.path, d, f, test.dir, test.file)
-		}
-	}
-}
-
-type JoinTest struct {
-	elem []string
-	path string
-}
-
-var jointests = []JoinTest{
-	// zero parameters
-	{[]string{}, ""},
-
-	// one parameter
-	{[]string{""}, ""},
-	{[]string{"a"}, "a"},
-
-	// two parameters
-	{[]string{"a", "b"}, "a/b"},
-	{[]string{"a", ""}, "a"},
-	{[]string{"", "b"}, "b"},
-	{[]string{"/", "a"}, "/a"},
-	{[]string{"/", ""}, "/"},
-	{[]string{"a/", "b"}, "a/b"},
-	{[]string{"a/", ""}, "a"},
-	{[]string{"", ""}, ""},
-}
-
-// join takes a []string and passes it to Join.
-func join(elem []string, args ...string) string {
-	args = elem
-	return Join(args...)
-}
-
-func TestJoin(t *testing.T) {
-	for _, test := range jointests {
-		if p := join(test.elem); p != test.path {
-			t.Errorf("join(%q) = %q, want %q", test.elem, p, test.path)
-		}
-	}
-}
-
-type ExtTest struct {
-	path, ext string
-}
-
-var exttests = []ExtTest{
-	{"path.go", ".go"},
-	{"path.pb.go", ".go"},
-	{"a.dir/b", ""},
-	{"a.dir/b.go", ".go"},
-	{"a.dir/", ""},
-}
-
-func TestExt(t *testing.T) {
-	for _, test := range exttests {
-		if x := Ext(test.path); x != test.ext {
-			t.Errorf("Ext(%q) = %q, want %q", test.path, x, test.ext)
-		}
-	}
-}
-
-var basetests = []PathTest{
-	// Already clean
-	{"", "."},
-	{".", "."},
-	{"/.", "."},
-	{"/", "/"},
-	{"////", "/"},
-	{"x/", "x"},
-	{"abc", "abc"},
-	{"abc/def", "def"},
-	{"a/b/.x", ".x"},
-	{"a/b/c.", "c."},
-	{"a/b/c.x", "c.x"},
-}
-
-func TestBase(t *testing.T) {
-	for _, test := range basetests {
-		if s := Base(test.path); s != test.result {
-			t.Errorf("Base(%q) = %q, want %q", test.path, s, test.result)
-		}
-	}
-}
-
-var dirtests = []PathTest{
-	{"", "."},
-	{".", "."},
-	{"/.", "/"},
-	{"/", "/"},
-	{"////", "/"},
-	{"/foo", "/"},
-	{"x/", "x"},
-	{"abc", "."},
-	{"abc/def", "abc"},
-	{"abc////def", "abc"},
-	{"a/b/.x", "a/b"},
-	{"a/b/c.", "a/b"},
-	{"a/b/c.x", "a/b"},
-}
-
-func TestDir(t *testing.T) {
-	for _, test := range dirtests {
-		if s := Dir(test.path); s != test.result {
-			t.Errorf("Dir(%q) = %q, want %q", test.path, s, test.result)
-		}
-	}
-}
-
-type IsAbsTest struct {
-	path  string
-	isAbs bool
-}
-
-var isAbsTests = []IsAbsTest{
-	{"", false},
-	{"/", true},
-	{"/usr/bin/gcc", true},
-	{"..", false},
-	{"/a/../bb", true},
-	{".", false},
-	{"./", false},
-	{"lala", false},
-}
-
-func TestIsAbs(t *testing.T) {
-	for _, test := range isAbsTests {
-		if r := IsAbs(test.path); r != test.isAbs {
-			t.Errorf("IsAbs(%q) = %v, want %v", test.path, r, test.isAbs)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/reflect/all_test.go b/third_party/gofrontend/libgo/go/reflect/all_test.go
deleted file mode 100644
index 33ee9ed..0000000
--- a/third_party/gofrontend/libgo/go/reflect/all_test.go
+++ /dev/null
@@ -1,4788 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package reflect_test
-
-import (
-	"bytes"
-	"encoding/base64"
-	"flag"
-	"fmt"
-	"io"
-	"math/rand"
-	"os"
-	. "reflect"
-	"runtime"
-	"sort"
-	"strconv"
-	"strings"
-	"sync"
-	"testing"
-	"time"
-	"unsafe"
-)
-
-func TestBool(t *testing.T) {
-	v := ValueOf(true)
-	if v.Bool() != true {
-		t.Fatal("ValueOf(true).Bool() = false")
-	}
-}
-
-type integer int
-type T struct {
-	a int
-	b float64
-	c string
-	d *int
-}
-
-type pair struct {
-	i interface{}
-	s string
-}
-
-func isDigit(c uint8) bool { return '0' <= c && c <= '9' }
-
-func assert(t *testing.T, s, want string) {
-	if s != want {
-		t.Errorf("have %#q want %#q", s, want)
-	}
-}
-
-func typestring(i interface{}) string { return TypeOf(i).String() }
-
-var typeTests = []pair{
-	{struct{ x int }{}, "int"},
-	{struct{ x int8 }{}, "int8"},
-	{struct{ x int16 }{}, "int16"},
-	{struct{ x int32 }{}, "int32"},
-	{struct{ x int64 }{}, "int64"},
-	{struct{ x uint }{}, "uint"},
-	{struct{ x uint8 }{}, "uint8"},
-	{struct{ x uint16 }{}, "uint16"},
-	{struct{ x uint32 }{}, "uint32"},
-	{struct{ x uint64 }{}, "uint64"},
-	{struct{ x float32 }{}, "float32"},
-	{struct{ x float64 }{}, "float64"},
-	{struct{ x int8 }{}, "int8"},
-	{struct{ x (**int8) }{}, "**int8"},
-	{struct{ x (**integer) }{}, "**reflect_test.integer"},
-	{struct{ x ([32]int32) }{}, "[32]int32"},
-	{struct{ x ([]int8) }{}, "[]int8"},
-	{struct{ x (map[string]int32) }{}, "map[string]int32"},
-	{struct{ x (chan<- string) }{}, "chan<- string"},
-	{struct {
-		x struct {
-			c chan *int32
-			d float32
-		}
-	}{},
-		"struct { c chan *int32; d float32 }",
-	},
-	{struct{ x (func(a int8, b int32)) }{}, "func(int8, int32)"},
-	{struct {
-		x struct {
-			c func(chan *integer, *int8)
-		}
-	}{},
-		"struct { c func(chan *reflect_test.integer, *int8) }",
-	},
-	{struct {
-		x struct {
-			a int8
-			b int32
-		}
-	}{},
-		"struct { a int8; b int32 }",
-	},
-	{struct {
-		x struct {
-			a int8
-			b int8
-			c int32
-		}
-	}{},
-		"struct { a int8; b int8; c int32 }",
-	},
-	{struct {
-		x struct {
-			a int8
-			b int8
-			c int8
-			d int32
-		}
-	}{},
-		"struct { a int8; b int8; c int8; d int32 }",
-	},
-	{struct {
-		x struct {
-			a int8
-			b int8
-			c int8
-			d int8
-			e int32
-		}
-	}{},
-		"struct { a int8; b int8; c int8; d int8; e int32 }",
-	},
-	{struct {
-		x struct {
-			a int8
-			b int8
-			c int8
-			d int8
-			e int8
-			f int32
-		}
-	}{},
-		"struct { a int8; b int8; c int8; d int8; e int8; f int32 }",
-	},
-	{struct {
-		x struct {
-			a int8 `reflect:"hi there"`
-		}
-	}{},
-		`struct { a int8 "reflect:\"hi there\"" }`,
-	},
-	{struct {
-		x struct {
-			a int8 `reflect:"hi \x00there\t\n\"\\"`
-		}
-	}{},
-		`struct { a int8 "reflect:\"hi \\x00there\\t\\n\\\"\\\\\"" }`,
-	},
-	{struct {
-		x struct {
-			f func(args ...int)
-		}
-	}{},
-		"struct { f func(...int) }",
-	},
-	{struct {
-		x (interface {
-			a(func(func(int) int) func(func(int)) int)
-			b()
-		})
-	}{},
-		"interface { reflect_test.a(func(func(int) int) func(func(int)) int); reflect_test.b() }",
-	},
-}
-
-var valueTests = []pair{
-	{new(int), "132"},
-	{new(int8), "8"},
-	{new(int16), "16"},
-	{new(int32), "32"},
-	{new(int64), "64"},
-	{new(uint), "132"},
-	{new(uint8), "8"},
-	{new(uint16), "16"},
-	{new(uint32), "32"},
-	{new(uint64), "64"},
-	{new(float32), "256.25"},
-	{new(float64), "512.125"},
-	{new(complex64), "532.125+10i"},
-	{new(complex128), "564.25+1i"},
-	{new(string), "stringy cheese"},
-	{new(bool), "true"},
-	{new(*int8), "*int8(0)"},
-	{new(**int8), "**int8(0)"},
-	{new([5]int32), "[5]int32{0, 0, 0, 0, 0}"},
-	{new(**integer), "**reflect_test.integer(0)"},
-	{new(map[string]int32), "map[string]int32{<can't iterate on maps>}"},
-	{new(chan<- string), "chan<- string"},
-	{new(func(a int8, b int32)), "func(int8, int32)(0)"},
-	{new(struct {
-		c chan *int32
-		d float32
-	}),
-		"struct { c chan *int32; d float32 }{chan *int32, 0}",
-	},
-	{new(struct{ c func(chan *integer, *int8) }),
-		"struct { c func(chan *reflect_test.integer, *int8) }{func(chan *reflect_test.integer, *int8)(0)}",
-	},
-	{new(struct {
-		a int8
-		b int32
-	}),
-		"struct { a int8; b int32 }{0, 0}",
-	},
-	{new(struct {
-		a int8
-		b int8
-		c int32
-	}),
-		"struct { a int8; b int8; c int32 }{0, 0, 0}",
-	},
-}
-
-func testType(t *testing.T, i int, typ Type, want string) {
-	s := typ.String()
-	if s != want {
-		t.Errorf("#%d: have %#q, want %#q", i, s, want)
-	}
-}
-
-func TestTypes(t *testing.T) {
-	for i, tt := range typeTests {
-		testType(t, i, ValueOf(tt.i).Field(0).Type(), tt.s)
-	}
-}
-
-func TestSet(t *testing.T) {
-	for i, tt := range valueTests {
-		v := ValueOf(tt.i)
-		v = v.Elem()
-		switch v.Kind() {
-		case Int:
-			v.SetInt(132)
-		case Int8:
-			v.SetInt(8)
-		case Int16:
-			v.SetInt(16)
-		case Int32:
-			v.SetInt(32)
-		case Int64:
-			v.SetInt(64)
-		case Uint:
-			v.SetUint(132)
-		case Uint8:
-			v.SetUint(8)
-		case Uint16:
-			v.SetUint(16)
-		case Uint32:
-			v.SetUint(32)
-		case Uint64:
-			v.SetUint(64)
-		case Float32:
-			v.SetFloat(256.25)
-		case Float64:
-			v.SetFloat(512.125)
-		case Complex64:
-			v.SetComplex(532.125 + 10i)
-		case Complex128:
-			v.SetComplex(564.25 + 1i)
-		case String:
-			v.SetString("stringy cheese")
-		case Bool:
-			v.SetBool(true)
-		}
-		s := valueToString(v)
-		if s != tt.s {
-			t.Errorf("#%d: have %#q, want %#q", i, s, tt.s)
-		}
-	}
-}
-
-func TestSetValue(t *testing.T) {
-	for i, tt := range valueTests {
-		v := ValueOf(tt.i).Elem()
-		switch v.Kind() {
-		case Int:
-			v.Set(ValueOf(int(132)))
-		case Int8:
-			v.Set(ValueOf(int8(8)))
-		case Int16:
-			v.Set(ValueOf(int16(16)))
-		case Int32:
-			v.Set(ValueOf(int32(32)))
-		case Int64:
-			v.Set(ValueOf(int64(64)))
-		case Uint:
-			v.Set(ValueOf(uint(132)))
-		case Uint8:
-			v.Set(ValueOf(uint8(8)))
-		case Uint16:
-			v.Set(ValueOf(uint16(16)))
-		case Uint32:
-			v.Set(ValueOf(uint32(32)))
-		case Uint64:
-			v.Set(ValueOf(uint64(64)))
-		case Float32:
-			v.Set(ValueOf(float32(256.25)))
-		case Float64:
-			v.Set(ValueOf(512.125))
-		case Complex64:
-			v.Set(ValueOf(complex64(532.125 + 10i)))
-		case Complex128:
-			v.Set(ValueOf(complex128(564.25 + 1i)))
-		case String:
-			v.Set(ValueOf("stringy cheese"))
-		case Bool:
-			v.Set(ValueOf(true))
-		}
-		s := valueToString(v)
-		if s != tt.s {
-			t.Errorf("#%d: have %#q, want %#q", i, s, tt.s)
-		}
-	}
-}
-
-var _i = 7
-
-var valueToStringTests = []pair{
-	{123, "123"},
-	{123.5, "123.5"},
-	{byte(123), "123"},
-	{"abc", "abc"},
-	{T{123, 456.75, "hello", &_i}, "reflect_test.T{123, 456.75, hello, *int(&7)}"},
-	{new(chan *T), "*chan *reflect_test.T(&chan *reflect_test.T)"},
-	{[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}"},
-	{&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "*[10]int(&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})"},
-	{[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}"},
-	{&[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "*[]int(&[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})"},
-}
-
-func TestValueToString(t *testing.T) {
-	for i, test := range valueToStringTests {
-		s := valueToString(ValueOf(test.i))
-		if s != test.s {
-			t.Errorf("#%d: have %#q, want %#q", i, s, test.s)
-		}
-	}
-}
-
-func TestArrayElemSet(t *testing.T) {
-	v := ValueOf(&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}).Elem()
-	v.Index(4).SetInt(123)
-	s := valueToString(v)
-	const want = "[10]int{1, 2, 3, 4, 123, 6, 7, 8, 9, 10}"
-	if s != want {
-		t.Errorf("[10]int: have %#q want %#q", s, want)
-	}
-
-	v = ValueOf([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
-	v.Index(4).SetInt(123)
-	s = valueToString(v)
-	const want1 = "[]int{1, 2, 3, 4, 123, 6, 7, 8, 9, 10}"
-	if s != want1 {
-		t.Errorf("[]int: have %#q want %#q", s, want1)
-	}
-}
-
-func TestPtrPointTo(t *testing.T) {
-	var ip *int32
-	var i int32 = 1234
-	vip := ValueOf(&ip)
-	vi := ValueOf(&i).Elem()
-	vip.Elem().Set(vi.Addr())
-	if *ip != 1234 {
-		t.Errorf("got %d, want 1234", *ip)
-	}
-
-	ip = nil
-	vp := ValueOf(&ip).Elem()
-	vp.Set(Zero(vp.Type()))
-	if ip != nil {
-		t.Errorf("got non-nil (%p), want nil", ip)
-	}
-}
-
-func TestPtrSetNil(t *testing.T) {
-	var i int32 = 1234
-	ip := &i
-	vip := ValueOf(&ip)
-	vip.Elem().Set(Zero(vip.Elem().Type()))
-	if ip != nil {
-		t.Errorf("got non-nil (%d), want nil", *ip)
-	}
-}
-
-func TestMapSetNil(t *testing.T) {
-	m := make(map[string]int)
-	vm := ValueOf(&m)
-	vm.Elem().Set(Zero(vm.Elem().Type()))
-	if m != nil {
-		t.Errorf("got non-nil (%p), want nil", m)
-	}
-}
-
-func TestAll(t *testing.T) {
-	testType(t, 1, TypeOf((int8)(0)), "int8")
-	testType(t, 2, TypeOf((*int8)(nil)).Elem(), "int8")
-
-	typ := TypeOf((*struct {
-		c chan *int32
-		d float32
-	})(nil))
-	testType(t, 3, typ, "*struct { c chan *int32; d float32 }")
-	etyp := typ.Elem()
-	testType(t, 4, etyp, "struct { c chan *int32; d float32 }")
-	styp := etyp
-	f := styp.Field(0)
-	testType(t, 5, f.Type, "chan *int32")
-
-	f, present := styp.FieldByName("d")
-	if !present {
-		t.Errorf("FieldByName says present field is absent")
-	}
-	testType(t, 6, f.Type, "float32")
-
-	f, present = styp.FieldByName("absent")
-	if present {
-		t.Errorf("FieldByName says absent field is present")
-	}
-
-	typ = TypeOf([32]int32{})
-	testType(t, 7, typ, "[32]int32")
-	testType(t, 8, typ.Elem(), "int32")
-
-	typ = TypeOf((map[string]*int32)(nil))
-	testType(t, 9, typ, "map[string]*int32")
-	mtyp := typ
-	testType(t, 10, mtyp.Key(), "string")
-	testType(t, 11, mtyp.Elem(), "*int32")
-
-	typ = TypeOf((chan<- string)(nil))
-	testType(t, 12, typ, "chan<- string")
-	testType(t, 13, typ.Elem(), "string")
-
-	// make sure tag strings are not part of element type
-	typ = TypeOf(struct {
-		d []uint32 `reflect:"TAG"`
-	}{}).Field(0).Type
-	testType(t, 14, typ, "[]uint32")
-}
-
-func TestInterfaceGet(t *testing.T) {
-	var inter struct {
-		E interface{}
-	}
-	inter.E = 123.456
-	v1 := ValueOf(&inter)
-	v2 := v1.Elem().Field(0)
-	assert(t, v2.Type().String(), "interface {}")
-	i2 := v2.Interface()
-	v3 := ValueOf(i2)
-	assert(t, v3.Type().String(), "float64")
-}
-
-func TestInterfaceValue(t *testing.T) {
-	var inter struct {
-		E interface{}
-	}
-	inter.E = 123.456
-	v1 := ValueOf(&inter)
-	v2 := v1.Elem().Field(0)
-	assert(t, v2.Type().String(), "interface {}")
-	v3 := v2.Elem()
-	assert(t, v3.Type().String(), "float64")
-
-	i3 := v2.Interface()
-	if _, ok := i3.(float64); !ok {
-		t.Error("v2.Interface() did not return float64, got ", TypeOf(i3))
-	}
-}
-
-func TestFunctionValue(t *testing.T) {
-	var x interface{} = func() {}
-	v := ValueOf(x)
-	if fmt.Sprint(v.Interface()) != fmt.Sprint(x) {
-		t.Fatalf("TestFunction returned wrong pointer")
-	}
-	assert(t, v.Type().String(), "func()")
-}
-
-var appendTests = []struct {
-	orig, extra []int
-}{
-	{make([]int, 2, 4), []int{22}},
-	{make([]int, 2, 4), []int{22, 33, 44}},
-}
-
-func sameInts(x, y []int) bool {
-	if len(x) != len(y) {
-		return false
-	}
-	for i, xx := range x {
-		if xx != y[i] {
-			return false
-		}
-	}
-	return true
-}
-
-func TestAppend(t *testing.T) {
-	for i, test := range appendTests {
-		origLen, extraLen := len(test.orig), len(test.extra)
-		want := append(test.orig, test.extra...)
-		// Convert extra from []int to []Value.
-		e0 := make([]Value, len(test.extra))
-		for j, e := range test.extra {
-			e0[j] = ValueOf(e)
-		}
-		// Convert extra from []int to *SliceValue.
-		e1 := ValueOf(test.extra)
-		// Test Append.
-		a0 := ValueOf(test.orig)
-		have0 := Append(a0, e0...).Interface().([]int)
-		if !sameInts(have0, want) {
-			t.Errorf("Append #%d: have %v, want %v (%p %p)", i, have0, want, test.orig, have0)
-		}
-		// Check that the orig and extra slices were not modified.
-		if len(test.orig) != origLen {
-			t.Errorf("Append #%d origLen: have %v, want %v", i, len(test.orig), origLen)
-		}
-		if len(test.extra) != extraLen {
-			t.Errorf("Append #%d extraLen: have %v, want %v", i, len(test.extra), extraLen)
-		}
-		// Test AppendSlice.
-		a1 := ValueOf(test.orig)
-		have1 := AppendSlice(a1, e1).Interface().([]int)
-		if !sameInts(have1, want) {
-			t.Errorf("AppendSlice #%d: have %v, want %v", i, have1, want)
-		}
-		// Check that the orig and extra slices were not modified.
-		if len(test.orig) != origLen {
-			t.Errorf("AppendSlice #%d origLen: have %v, want %v", i, len(test.orig), origLen)
-		}
-		if len(test.extra) != extraLen {
-			t.Errorf("AppendSlice #%d extraLen: have %v, want %v", i, len(test.extra), extraLen)
-		}
-	}
-}
-
-func TestCopy(t *testing.T) {
-	a := []int{1, 2, 3, 4, 10, 9, 8, 7}
-	b := []int{11, 22, 33, 44, 1010, 99, 88, 77, 66, 55, 44}
-	c := []int{11, 22, 33, 44, 1010, 99, 88, 77, 66, 55, 44}
-	for i := 0; i < len(b); i++ {
-		if b[i] != c[i] {
-			t.Fatalf("b != c before test")
-		}
-	}
-	a1 := a
-	b1 := b
-	aa := ValueOf(&a1).Elem()
-	ab := ValueOf(&b1).Elem()
-	for tocopy := 1; tocopy <= 7; tocopy++ {
-		aa.SetLen(tocopy)
-		Copy(ab, aa)
-		aa.SetLen(8)
-		for i := 0; i < tocopy; i++ {
-			if a[i] != b[i] {
-				t.Errorf("(i) tocopy=%d a[%d]=%d, b[%d]=%d",
-					tocopy, i, a[i], i, b[i])
-			}
-		}
-		for i := tocopy; i < len(b); i++ {
-			if b[i] != c[i] {
-				if i < len(a) {
-					t.Errorf("(ii) tocopy=%d a[%d]=%d, b[%d]=%d, c[%d]=%d",
-						tocopy, i, a[i], i, b[i], i, c[i])
-				} else {
-					t.Errorf("(iii) tocopy=%d b[%d]=%d, c[%d]=%d",
-						tocopy, i, b[i], i, c[i])
-				}
-			} else {
-				t.Logf("tocopy=%d elem %d is okay\n", tocopy, i)
-			}
-		}
-	}
-}
-
-func TestCopyArray(t *testing.T) {
-	a := [8]int{1, 2, 3, 4, 10, 9, 8, 7}
-	b := [11]int{11, 22, 33, 44, 1010, 99, 88, 77, 66, 55, 44}
-	c := b
-	aa := ValueOf(&a).Elem()
-	ab := ValueOf(&b).Elem()
-	Copy(ab, aa)
-	for i := 0; i < len(a); i++ {
-		if a[i] != b[i] {
-			t.Errorf("(i) a[%d]=%d, b[%d]=%d", i, a[i], i, b[i])
-		}
-	}
-	for i := len(a); i < len(b); i++ {
-		if b[i] != c[i] {
-			t.Errorf("(ii) b[%d]=%d, c[%d]=%d", i, b[i], i, c[i])
-		} else {
-			t.Logf("elem %d is okay\n", i)
-		}
-	}
-}
-
-func TestBigUnnamedStruct(t *testing.T) {
-	b := struct{ a, b, c, d int64 }{1, 2, 3, 4}
-	v := ValueOf(b)
-	b1 := v.Interface().(struct {
-		a, b, c, d int64
-	})
-	if b1.a != b.a || b1.b != b.b || b1.c != b.c || b1.d != b.d {
-		t.Errorf("ValueOf(%v).Interface().(*Big) = %v", b, b1)
-	}
-}
-
-type big struct {
-	a, b, c, d, e int64
-}
-
-func TestBigStruct(t *testing.T) {
-	b := big{1, 2, 3, 4, 5}
-	v := ValueOf(b)
-	b1 := v.Interface().(big)
-	if b1.a != b.a || b1.b != b.b || b1.c != b.c || b1.d != b.d || b1.e != b.e {
-		t.Errorf("ValueOf(%v).Interface().(big) = %v", b, b1)
-	}
-}
-
-type Basic struct {
-	x int
-	y float32
-}
-
-type NotBasic Basic
-
-type DeepEqualTest struct {
-	a, b interface{}
-	eq   bool
-}
-
-// Simple functions for DeepEqual tests.
-var (
-	fn1 func()             // nil.
-	fn2 func()             // nil.
-	fn3 = func() { fn1() } // Not nil.
-)
-
-var deepEqualTests = []DeepEqualTest{
-	// Equalities
-	{nil, nil, true},
-	{1, 1, true},
-	{int32(1), int32(1), true},
-	{0.5, 0.5, true},
-	{float32(0.5), float32(0.5), true},
-	{"hello", "hello", true},
-	{make([]int, 10), make([]int, 10), true},
-	{&[3]int{1, 2, 3}, &[3]int{1, 2, 3}, true},
-	{Basic{1, 0.5}, Basic{1, 0.5}, true},
-	{error(nil), error(nil), true},
-	{map[int]string{1: "one", 2: "two"}, map[int]string{2: "two", 1: "one"}, true},
-	{fn1, fn2, true},
-
-	// Inequalities
-	{1, 2, false},
-	{int32(1), int32(2), false},
-	{0.5, 0.6, false},
-	{float32(0.5), float32(0.6), false},
-	{"hello", "hey", false},
-	{make([]int, 10), make([]int, 11), false},
-	{&[3]int{1, 2, 3}, &[3]int{1, 2, 4}, false},
-	{Basic{1, 0.5}, Basic{1, 0.6}, false},
-	{Basic{1, 0}, Basic{2, 0}, false},
-	{map[int]string{1: "one", 3: "two"}, map[int]string{2: "two", 1: "one"}, false},
-	{map[int]string{1: "one", 2: "txo"}, map[int]string{2: "two", 1: "one"}, false},
-	{map[int]string{1: "one"}, map[int]string{2: "two", 1: "one"}, false},
-	{map[int]string{2: "two", 1: "one"}, map[int]string{1: "one"}, false},
-	{nil, 1, false},
-	{1, nil, false},
-	{fn1, fn3, false},
-	{fn3, fn3, false},
-	{[][]int{{1}}, [][]int{{2}}, false},
-
-	// Nil vs empty: not the same.
-	{[]int{}, []int(nil), false},
-	{[]int{}, []int{}, true},
-	{[]int(nil), []int(nil), true},
-	{map[int]int{}, map[int]int(nil), false},
-	{map[int]int{}, map[int]int{}, true},
-	{map[int]int(nil), map[int]int(nil), true},
-
-	// Mismatched types
-	{1, 1.0, false},
-	{int32(1), int64(1), false},
-	{0.5, "hello", false},
-	{[]int{1, 2, 3}, [3]int{1, 2, 3}, false},
-	{&[3]interface{}{1, 2, 4}, &[3]interface{}{1, 2, "s"}, false},
-	{Basic{1, 0.5}, NotBasic{1, 0.5}, false},
-	{map[uint]string{1: "one", 2: "two"}, map[int]string{2: "two", 1: "one"}, false},
-}
-
-func TestDeepEqual(t *testing.T) {
-	for _, test := range deepEqualTests {
-		if r := DeepEqual(test.a, test.b); r != test.eq {
-			t.Errorf("DeepEqual(%v, %v) = %v, want %v", test.a, test.b, r, test.eq)
-		}
-	}
-}
-
-func TestTypeOf(t *testing.T) {
-	// Special case for nil
-	if typ := TypeOf(nil); typ != nil {
-		t.Errorf("expected nil type for nil value; got %v", typ)
-	}
-	for _, test := range deepEqualTests {
-		v := ValueOf(test.a)
-		if !v.IsValid() {
-			continue
-		}
-		typ := TypeOf(test.a)
-		if typ != v.Type() {
-			t.Errorf("TypeOf(%v) = %v, but ValueOf(%v).Type() = %v", test.a, typ, test.a, v.Type())
-		}
-	}
-}
-
-type Recursive struct {
-	x int
-	r *Recursive
-}
-
-func TestDeepEqualRecursiveStruct(t *testing.T) {
-	a, b := new(Recursive), new(Recursive)
-	*a = Recursive{12, a}
-	*b = Recursive{12, b}
-	if !DeepEqual(a, b) {
-		t.Error("DeepEqual(recursive same) = false, want true")
-	}
-}
-
-type _Complex struct {
-	a int
-	b [3]*_Complex
-	c *string
-	d map[float64]float64
-}
-
-func TestDeepEqualComplexStruct(t *testing.T) {
-	m := make(map[float64]float64)
-	stra, strb := "hello", "hello"
-	a, b := new(_Complex), new(_Complex)
-	*a = _Complex{5, [3]*_Complex{a, b, a}, &stra, m}
-	*b = _Complex{5, [3]*_Complex{b, a, a}, &strb, m}
-	if !DeepEqual(a, b) {
-		t.Error("DeepEqual(complex same) = false, want true")
-	}
-}
-
-func TestDeepEqualComplexStructInequality(t *testing.T) {
-	m := make(map[float64]float64)
-	stra, strb := "hello", "helloo" // Difference is here
-	a, b := new(_Complex), new(_Complex)
-	*a = _Complex{5, [3]*_Complex{a, b, a}, &stra, m}
-	*b = _Complex{5, [3]*_Complex{b, a, a}, &strb, m}
-	if DeepEqual(a, b) {
-		t.Error("DeepEqual(complex different) = true, want false")
-	}
-}
-
-type UnexpT struct {
-	m map[int]int
-}
-
-func TestDeepEqualUnexportedMap(t *testing.T) {
-	// Check that DeepEqual can look at unexported fields.
-	x1 := UnexpT{map[int]int{1: 2}}
-	x2 := UnexpT{map[int]int{1: 2}}
-	if !DeepEqual(&x1, &x2) {
-		t.Error("DeepEqual(x1, x2) = false, want true")
-	}
-
-	y1 := UnexpT{map[int]int{2: 3}}
-	if DeepEqual(&x1, &y1) {
-		t.Error("DeepEqual(x1, y1) = true, want false")
-	}
-}
-
-func check2ndField(x interface{}, offs uintptr, t *testing.T) {
-	s := ValueOf(x)
-	f := s.Type().Field(1)
-	if f.Offset != offs {
-		t.Error("mismatched offsets in structure alignment:", f.Offset, offs)
-	}
-}
-
-// Check that structure alignment & offsets viewed through reflect agree with those
-// from the compiler itself.
-func TestAlignment(t *testing.T) {
-	type T1inner struct {
-		a int
-	}
-	type T1 struct {
-		T1inner
-		f int
-	}
-	type T2inner struct {
-		a, b int
-	}
-	type T2 struct {
-		T2inner
-		f int
-	}
-
-	x := T1{T1inner{2}, 17}
-	check2ndField(x, uintptr(unsafe.Pointer(&x.f))-uintptr(unsafe.Pointer(&x)), t)
-
-	x1 := T2{T2inner{2, 3}, 17}
-	check2ndField(x1, uintptr(unsafe.Pointer(&x1.f))-uintptr(unsafe.Pointer(&x1)), t)
-}
-
-func Nil(a interface{}, t *testing.T) {
-	n := ValueOf(a).Field(0)
-	if !n.IsNil() {
-		t.Errorf("%v should be nil", a)
-	}
-}
-
-func NotNil(a interface{}, t *testing.T) {
-	n := ValueOf(a).Field(0)
-	if n.IsNil() {
-		t.Errorf("value of type %v should not be nil", ValueOf(a).Type().String())
-	}
-}
-
-func TestIsNil(t *testing.T) {
-	// These implement IsNil.
-	// Wrap in extra struct to hide interface type.
-	doNil := []interface{}{
-		struct{ x *int }{},
-		struct{ x interface{} }{},
-		struct{ x map[string]int }{},
-		struct{ x func() bool }{},
-		struct{ x chan int }{},
-		struct{ x []string }{},
-	}
-	for _, ts := range doNil {
-		ty := TypeOf(ts).Field(0).Type
-		v := Zero(ty)
-		v.IsNil() // panics if not okay to call
-	}
-
-	// Check the implementations
-	var pi struct {
-		x *int
-	}
-	Nil(pi, t)
-	pi.x = new(int)
-	NotNil(pi, t)
-
-	var si struct {
-		x []int
-	}
-	Nil(si, t)
-	si.x = make([]int, 10)
-	NotNil(si, t)
-
-	var ci struct {
-		x chan int
-	}
-	Nil(ci, t)
-	ci.x = make(chan int)
-	NotNil(ci, t)
-
-	var mi struct {
-		x map[int]int
-	}
-	Nil(mi, t)
-	mi.x = make(map[int]int)
-	NotNil(mi, t)
-
-	var ii struct {
-		x interface{}
-	}
-	Nil(ii, t)
-	ii.x = 2
-	NotNil(ii, t)
-
-	var fi struct {
-		x func(t *testing.T)
-	}
-	Nil(fi, t)
-	fi.x = TestIsNil
-	NotNil(fi, t)
-}
-
-func TestInterfaceExtraction(t *testing.T) {
-	var s struct {
-		W io.Writer
-	}
-
-	s.W = os.Stdout
-	v := Indirect(ValueOf(&s)).Field(0).Interface()
-	if v != s.W.(interface{}) {
-		t.Error("Interface() on interface: ", v, s.W)
-	}
-}
-
-func TestNilPtrValueSub(t *testing.T) {
-	var pi *int
-	if pv := ValueOf(pi); pv.Elem().IsValid() {
-		t.Error("ValueOf((*int)(nil)).Elem().IsValid()")
-	}
-}
-
-func TestMap(t *testing.T) {
-	m := map[string]int{"a": 1, "b": 2}
-	mv := ValueOf(m)
-	if n := mv.Len(); n != len(m) {
-		t.Errorf("Len = %d, want %d", n, len(m))
-	}
-	keys := mv.MapKeys()
-	newmap := MakeMap(mv.Type())
-	for k, v := range m {
-		// Check that returned Keys match keys in range.
-		// These aren't required to be in the same order.
-		seen := false
-		for _, kv := range keys {
-			if kv.String() == k {
-				seen = true
-				break
-			}
-		}
-		if !seen {
-			t.Errorf("Missing key %q", k)
-		}
-
-		// Check that value lookup is correct.
-		vv := mv.MapIndex(ValueOf(k))
-		if vi := vv.Int(); vi != int64(v) {
-			t.Errorf("Key %q: have value %d, want %d", k, vi, v)
-		}
-
-		// Copy into new map.
-		newmap.SetMapIndex(ValueOf(k), ValueOf(v))
-	}
-	vv := mv.MapIndex(ValueOf("not-present"))
-	if vv.IsValid() {
-		t.Errorf("Invalid key: got non-nil value %s", valueToString(vv))
-	}
-
-	newm := newmap.Interface().(map[string]int)
-	if len(newm) != len(m) {
-		t.Errorf("length after copy: newm=%d, m=%d", len(newm), len(m))
-	}
-
-	for k, v := range newm {
-		mv, ok := m[k]
-		if mv != v {
-			t.Errorf("newm[%q] = %d, but m[%q] = %d, %v", k, v, k, mv, ok)
-		}
-	}
-
-	newmap.SetMapIndex(ValueOf("a"), Value{})
-	v, ok := newm["a"]
-	if ok {
-		t.Errorf("newm[\"a\"] = %d after delete", v)
-	}
-
-	mv = ValueOf(&m).Elem()
-	mv.Set(Zero(mv.Type()))
-	if m != nil {
-		t.Errorf("mv.Set(nil) failed")
-	}
-}
-
-func TestNilMap(t *testing.T) {
-	var m map[string]int
-	mv := ValueOf(m)
-	keys := mv.MapKeys()
-	if len(keys) != 0 {
-		t.Errorf(">0 keys for nil map: %v", keys)
-	}
-
-	// Check that value for missing key is zero.
-	x := mv.MapIndex(ValueOf("hello"))
-	if x.Kind() != Invalid {
-		t.Errorf("m.MapIndex(\"hello\") for nil map = %v, want Invalid Value", x)
-	}
-
-	// Check big value too.
-	var mbig map[string][10 << 20]byte
-	x = ValueOf(mbig).MapIndex(ValueOf("hello"))
-	if x.Kind() != Invalid {
-		t.Errorf("mbig.MapIndex(\"hello\") for nil map = %v, want Invalid Value", x)
-	}
-
-	// Test that deletes from a nil map succeed.
-	mv.SetMapIndex(ValueOf("hi"), Value{})
-}
-
-func TestChan(t *testing.T) {
-	for loop := 0; loop < 2; loop++ {
-		var c chan int
-		var cv Value
-
-		// check both ways to allocate channels
-		switch loop {
-		case 1:
-			c = make(chan int, 1)
-			cv = ValueOf(c)
-		case 0:
-			cv = MakeChan(TypeOf(c), 1)
-			c = cv.Interface().(chan int)
-		}
-
-		// Send
-		cv.Send(ValueOf(2))
-		if i := <-c; i != 2 {
-			t.Errorf("reflect Send 2, native recv %d", i)
-		}
-
-		// Recv
-		c <- 3
-		if i, ok := cv.Recv(); i.Int() != 3 || !ok {
-			t.Errorf("native send 3, reflect Recv %d, %t", i.Int(), ok)
-		}
-
-		// TryRecv fail
-		val, ok := cv.TryRecv()
-		if val.IsValid() || ok {
-			t.Errorf("TryRecv on empty chan: %s, %t", valueToString(val), ok)
-		}
-
-		// TryRecv success
-		c <- 4
-		val, ok = cv.TryRecv()
-		if !val.IsValid() {
-			t.Errorf("TryRecv on ready chan got nil")
-		} else if i := val.Int(); i != 4 || !ok {
-			t.Errorf("native send 4, TryRecv %d, %t", i, ok)
-		}
-
-		// TrySend fail
-		c <- 100
-		ok = cv.TrySend(ValueOf(5))
-		i := <-c
-		if ok {
-			t.Errorf("TrySend on full chan succeeded: value %d", i)
-		}
-
-		// TrySend success
-		ok = cv.TrySend(ValueOf(6))
-		if !ok {
-			t.Errorf("TrySend on empty chan failed")
-			select {
-			case x := <-c:
-				t.Errorf("TrySend failed but it did send %d", x)
-			default:
-			}
-		} else {
-			if i = <-c; i != 6 {
-				t.Errorf("TrySend 6, recv %d", i)
-			}
-		}
-
-		// Close
-		c <- 123
-		cv.Close()
-		if i, ok := cv.Recv(); i.Int() != 123 || !ok {
-			t.Errorf("send 123 then close; Recv %d, %t", i.Int(), ok)
-		}
-		if i, ok := cv.Recv(); i.Int() != 0 || ok {
-			t.Errorf("after close Recv %d, %t", i.Int(), ok)
-		}
-	}
-
-	// check creation of unbuffered channel
-	var c chan int
-	cv := MakeChan(TypeOf(c), 0)
-	c = cv.Interface().(chan int)
-	if cv.TrySend(ValueOf(7)) {
-		t.Errorf("TrySend on sync chan succeeded")
-	}
-	if v, ok := cv.TryRecv(); v.IsValid() || ok {
-		t.Errorf("TryRecv on sync chan succeeded: isvalid=%v ok=%v", v.IsValid(), ok)
-	}
-
-	// len/cap
-	cv = MakeChan(TypeOf(c), 10)
-	c = cv.Interface().(chan int)
-	for i := 0; i < 3; i++ {
-		c <- i
-	}
-	if l, m := cv.Len(), cv.Cap(); l != len(c) || m != cap(c) {
-		t.Errorf("Len/Cap = %d/%d want %d/%d", l, m, len(c), cap(c))
-	}
-}
-
-// caseInfo describes a single case in a select test.
-type caseInfo struct {
-	desc      string
-	canSelect bool
-	recv      Value
-	closed    bool
-	helper    func()
-	panic     bool
-}
-
-var allselect = flag.Bool("allselect", false, "exhaustive select test")
-
-func TestSelect(t *testing.T) {
-	selectWatch.once.Do(func() { go selectWatcher() })
-
-	var x exhaustive
-	nch := 0
-	newop := func(n int, cap int) (ch, val Value) {
-		nch++
-		if nch%101%2 == 1 {
-			c := make(chan int, cap)
-			ch = ValueOf(c)
-			val = ValueOf(n)
-		} else {
-			c := make(chan string, cap)
-			ch = ValueOf(c)
-			val = ValueOf(fmt.Sprint(n))
-		}
-		return
-	}
-
-	for n := 0; x.Next(); n++ {
-		if testing.Short() && n >= 1000 {
-			break
-		}
-		if n >= 100000 && !*allselect {
-			break
-		}
-		if n%100000 == 0 && testing.Verbose() {
-			println("TestSelect", n)
-		}
-		var cases []SelectCase
-		var info []caseInfo
-
-		// Ready send.
-		if x.Maybe() {
-			ch, val := newop(len(cases), 1)
-			cases = append(cases, SelectCase{
-				Dir:  SelectSend,
-				Chan: ch,
-				Send: val,
-			})
-			info = append(info, caseInfo{desc: "ready send", canSelect: true})
-		}
-
-		// Ready recv.
-		if x.Maybe() {
-			ch, val := newop(len(cases), 1)
-			ch.Send(val)
-			cases = append(cases, SelectCase{
-				Dir:  SelectRecv,
-				Chan: ch,
-			})
-			info = append(info, caseInfo{desc: "ready recv", canSelect: true, recv: val})
-		}
-
-		// Blocking send.
-		if x.Maybe() {
-			ch, val := newop(len(cases), 0)
-			cases = append(cases, SelectCase{
-				Dir:  SelectSend,
-				Chan: ch,
-				Send: val,
-			})
-			// Let it execute?
-			if x.Maybe() {
-				f := func() { ch.Recv() }
-				info = append(info, caseInfo{desc: "blocking send", helper: f})
-			} else {
-				info = append(info, caseInfo{desc: "blocking send"})
-			}
-		}
-
-		// Blocking recv.
-		if x.Maybe() {
-			ch, val := newop(len(cases), 0)
-			cases = append(cases, SelectCase{
-				Dir:  SelectRecv,
-				Chan: ch,
-			})
-			// Let it execute?
-			if x.Maybe() {
-				f := func() { ch.Send(val) }
-				info = append(info, caseInfo{desc: "blocking recv", recv: val, helper: f})
-			} else {
-				info = append(info, caseInfo{desc: "blocking recv"})
-			}
-		}
-
-		// Zero Chan send.
-		if x.Maybe() {
-			// Maybe include value to send.
-			var val Value
-			if x.Maybe() {
-				val = ValueOf(100)
-			}
-			cases = append(cases, SelectCase{
-				Dir:  SelectSend,
-				Send: val,
-			})
-			info = append(info, caseInfo{desc: "zero Chan send"})
-		}
-
-		// Zero Chan receive.
-		if x.Maybe() {
-			cases = append(cases, SelectCase{
-				Dir: SelectRecv,
-			})
-			info = append(info, caseInfo{desc: "zero Chan recv"})
-		}
-
-		// nil Chan send.
-		if x.Maybe() {
-			cases = append(cases, SelectCase{
-				Dir:  SelectSend,
-				Chan: ValueOf((chan int)(nil)),
-				Send: ValueOf(101),
-			})
-			info = append(info, caseInfo{desc: "nil Chan send"})
-		}
-
-		// nil Chan recv.
-		if x.Maybe() {
-			cases = append(cases, SelectCase{
-				Dir:  SelectRecv,
-				Chan: ValueOf((chan int)(nil)),
-			})
-			info = append(info, caseInfo{desc: "nil Chan recv"})
-		}
-
-		// closed Chan send.
-		if x.Maybe() {
-			ch := make(chan int)
-			close(ch)
-			cases = append(cases, SelectCase{
-				Dir:  SelectSend,
-				Chan: ValueOf(ch),
-				Send: ValueOf(101),
-			})
-			info = append(info, caseInfo{desc: "closed Chan send", canSelect: true, panic: true})
-		}
-
-		// closed Chan recv.
-		if x.Maybe() {
-			ch, val := newop(len(cases), 0)
-			ch.Close()
-			val = Zero(val.Type())
-			cases = append(cases, SelectCase{
-				Dir:  SelectRecv,
-				Chan: ch,
-			})
-			info = append(info, caseInfo{desc: "closed Chan recv", canSelect: true, closed: true, recv: val})
-		}
-
-		var helper func() // goroutine to help the select complete
-
-		// Add default? Must be last case here, but will permute.
-		// Add the default if the select would otherwise
-		// block forever, and maybe add it anyway.
-		numCanSelect := 0
-		canProceed := false
-		canBlock := true
-		canPanic := false
-		helpers := []int{}
-		for i, c := range info {
-			if c.canSelect {
-				canProceed = true
-				canBlock = false
-				numCanSelect++
-				if c.panic {
-					canPanic = true
-				}
-			} else if c.helper != nil {
-				canProceed = true
-				helpers = append(helpers, i)
-			}
-		}
-		if !canProceed || x.Maybe() {
-			cases = append(cases, SelectCase{
-				Dir: SelectDefault,
-			})
-			info = append(info, caseInfo{desc: "default", canSelect: canBlock})
-			numCanSelect++
-		} else if canBlock {
-			// Select needs to communicate with another goroutine.
-			cas := &info[helpers[x.Choose(len(helpers))]]
-			helper = cas.helper
-			cas.canSelect = true
-			numCanSelect++
-		}
-
-		// Permute cases and case info.
-		// Doing too much here makes the exhaustive loop
-		// too exhausting, so just do two swaps.
-		for loop := 0; loop < 2; loop++ {
-			i := x.Choose(len(cases))
-			j := x.Choose(len(cases))
-			cases[i], cases[j] = cases[j], cases[i]
-			info[i], info[j] = info[j], info[i]
-		}
-
-		if helper != nil {
-			// We wait before kicking off a goroutine to satisfy a blocked select.
-			// The pause needs to be big enough to let the select block before
-			// we run the helper, but if we lose that race once in a while it's okay: the
-			// select will just proceed immediately. Not a big deal.
-			// For short tests we can grow [sic] the timeout a bit without fear of taking too long
-			pause := 10 * time.Microsecond
-			if testing.Short() {
-				pause = 100 * time.Microsecond
-			}
-			time.AfterFunc(pause, helper)
-		}
-
-		// Run select.
-		i, recv, recvOK, panicErr := runSelect(cases, info)
-		if panicErr != nil && !canPanic {
-			t.Fatalf("%s\npanicked unexpectedly: %v", fmtSelect(info), panicErr)
-		}
-		if panicErr == nil && canPanic && numCanSelect == 1 {
-			t.Fatalf("%s\nselected #%d incorrectly (should panic)", fmtSelect(info), i)
-		}
-		if panicErr != nil {
-			continue
-		}
-
-		cas := info[i]
-		if !cas.canSelect {
-			recvStr := ""
-			if recv.IsValid() {
-				recvStr = fmt.Sprintf(", received %v, %v", recv.Interface(), recvOK)
-			}
-			t.Fatalf("%s\nselected #%d incorrectly%s", fmtSelect(info), i, recvStr)
-			continue
-		}
-		if cas.panic {
-			t.Fatalf("%s\nselected #%d incorrectly (case should panic)", fmtSelect(info), i)
-			continue
-		}
-
-		if cases[i].Dir == SelectRecv {
-			if !recv.IsValid() {
-				t.Fatalf("%s\nselected #%d but got %v, %v, want %v, %v", fmtSelect(info), i, recv, recvOK, cas.recv.Interface(), !cas.closed)
-			}
-			if !cas.recv.IsValid() {
-				t.Fatalf("%s\nselected #%d but internal error: missing recv value", fmtSelect(info), i)
-			}
-			if recv.Interface() != cas.recv.Interface() || recvOK != !cas.closed {
-				if recv.Interface() == cas.recv.Interface() && recvOK == !cas.closed {
-					t.Fatalf("%s\nselected #%d, got %#v, %v, and DeepEqual is broken on %T", fmtSelect(info), i, recv.Interface(), recvOK, recv.Interface())
-				}
-				t.Fatalf("%s\nselected #%d but got %#v, %v, want %#v, %v", fmtSelect(info), i, recv.Interface(), recvOK, cas.recv.Interface(), !cas.closed)
-			}
-		} else {
-			if recv.IsValid() || recvOK {
-				t.Fatalf("%s\nselected #%d but got %v, %v, want %v, %v", fmtSelect(info), i, recv, recvOK, Value{}, false)
-			}
-		}
-	}
-}
-
-// selectWatch and the selectWatcher are a watchdog mechanism for running Select.
-// If the selectWatcher notices that the select has been blocked for >1 second, it prints
-// an error describing the select and panics the entire test binary.
-var selectWatch struct {
-	sync.Mutex
-	once sync.Once
-	now  time.Time
-	info []caseInfo
-}
-
-func selectWatcher() {
-	for {
-		time.Sleep(1 * time.Second)
-		selectWatch.Lock()
-		if selectWatch.info != nil && time.Since(selectWatch.now) > 10*time.Second {
-			fmt.Fprintf(os.Stderr, "TestSelect:\n%s blocked indefinitely\n", fmtSelect(selectWatch.info))
-			panic("select stuck")
-		}
-		selectWatch.Unlock()
-	}
-}
-
-// runSelect runs a single select test.
-// It returns the values returned by Select but also returns
-// a panic value if the Select panics.
-func runSelect(cases []SelectCase, info []caseInfo) (chosen int, recv Value, recvOK bool, panicErr interface{}) {
-	defer func() {
-		panicErr = recover()
-
-		selectWatch.Lock()
-		selectWatch.info = nil
-		selectWatch.Unlock()
-	}()
-
-	selectWatch.Lock()
-	selectWatch.now = time.Now()
-	selectWatch.info = info
-	selectWatch.Unlock()
-
-	chosen, recv, recvOK = Select(cases)
-	return
-}
-
-// fmtSelect formats the information about a single select test.
-func fmtSelect(info []caseInfo) string {
-	var buf bytes.Buffer
-	fmt.Fprintf(&buf, "\nselect {\n")
-	for i, cas := range info {
-		fmt.Fprintf(&buf, "%d: %s", i, cas.desc)
-		if cas.recv.IsValid() {
-			fmt.Fprintf(&buf, " val=%#v", cas.recv.Interface())
-		}
-		if cas.canSelect {
-			fmt.Fprintf(&buf, " canselect")
-		}
-		if cas.panic {
-			fmt.Fprintf(&buf, " panic")
-		}
-		fmt.Fprintf(&buf, "\n")
-	}
-	fmt.Fprintf(&buf, "}")
-	return buf.String()
-}
-
-type two [2]uintptr
-
-// Difficult test for function call because of
-// implicit padding between arguments.
-func dummy(b byte, c int, d byte, e two, f byte, g float32, h byte) (i byte, j int, k byte, l two, m byte, n float32, o byte) {
-	return b, c, d, e, f, g, h
-}
-
-func TestFunc(t *testing.T) {
-	ret := ValueOf(dummy).Call([]Value{
-		ValueOf(byte(10)),
-		ValueOf(20),
-		ValueOf(byte(30)),
-		ValueOf(two{40, 50}),
-		ValueOf(byte(60)),
-		ValueOf(float32(70)),
-		ValueOf(byte(80)),
-	})
-	if len(ret) != 7 {
-		t.Fatalf("Call returned %d values, want 7", len(ret))
-	}
-
-	i := byte(ret[0].Uint())
-	j := int(ret[1].Int())
-	k := byte(ret[2].Uint())
-	l := ret[3].Interface().(two)
-	m := byte(ret[4].Uint())
-	n := float32(ret[5].Float())
-	o := byte(ret[6].Uint())
-
-	if i != 10 || j != 20 || k != 30 || l != (two{40, 50}) || m != 60 || n != 70 || o != 80 {
-		t.Errorf("Call returned %d, %d, %d, %v, %d, %g, %d; want 10, 20, 30, [40, 50], 60, 70, 80", i, j, k, l, m, n, o)
-	}
-}
-
-type emptyStruct struct{}
-
-type nonEmptyStruct struct {
-	member int
-}
-
-func returnEmpty() emptyStruct {
-	return emptyStruct{}
-}
-
-func takesEmpty(e emptyStruct) {
-}
-
-func returnNonEmpty(i int) nonEmptyStruct {
-	return nonEmptyStruct{member: i}
-}
-
-func takesNonEmpty(n nonEmptyStruct) int {
-	return n.member
-}
-
-func TestCallWithStruct(t *testing.T) {
-	r := ValueOf(returnEmpty).Call(nil)
-	if len(r) != 1 || r[0].Type() != TypeOf(emptyStruct{}) {
-		t.Errorf("returning empty struct returned %#v instead", r)
-	}
-	r = ValueOf(takesEmpty).Call([]Value{ValueOf(emptyStruct{})})
-	if len(r) != 0 {
-		t.Errorf("takesEmpty returned values: %#v", r)
-	}
-	r = ValueOf(returnNonEmpty).Call([]Value{ValueOf(42)})
-	if len(r) != 1 || r[0].Type() != TypeOf(nonEmptyStruct{}) || r[0].Field(0).Int() != 42 {
-		t.Errorf("returnNonEmpty returned %#v", r)
-	}
-	r = ValueOf(takesNonEmpty).Call([]Value{ValueOf(nonEmptyStruct{member: 42})})
-	if len(r) != 1 || r[0].Type() != TypeOf(1) || r[0].Int() != 42 {
-		t.Errorf("takesNonEmpty returned %#v", r)
-	}
-}
-
-func BenchmarkCall(b *testing.B) {
-	fv := ValueOf(func(a, b string) {})
-	b.ReportAllocs()
-	b.RunParallel(func(pb *testing.PB) {
-		args := []Value{ValueOf("a"), ValueOf("b")}
-		for pb.Next() {
-			fv.Call(args)
-		}
-	})
-}
-
-func TestMakeFunc(t *testing.T) {
-	f := dummy
-	fv := MakeFunc(TypeOf(f), func(in []Value) []Value { return in })
-	ValueOf(&f).Elem().Set(fv)
-
-	// Call g with small arguments so that there is
-	// something predictable (and different from the
-	// correct results) in those positions on the stack.
-	g := dummy
-	g(1, 2, 3, two{4, 5}, 6, 7, 8)
-
-	// Call constructed function f.
-	i, j, k, l, m, n, o := f(10, 20, 30, two{40, 50}, 60, 70, 80)
-	if i != 10 || j != 20 || k != 30 || l != (two{40, 50}) || m != 60 || n != 70 || o != 80 {
-		t.Errorf("Call returned %d, %d, %d, %v, %d, %g, %d; want 10, 20, 30, [40, 50], 60, 70, 80", i, j, k, l, m, n, o)
-	}
-}
-
-func TestMakeFuncInterface(t *testing.T) {
-	fn := func(i int) int { return i }
-	incr := func(in []Value) []Value {
-		return []Value{ValueOf(int(in[0].Int() + 1))}
-	}
-	fv := MakeFunc(TypeOf(fn), incr)
-	ValueOf(&fn).Elem().Set(fv)
-	if r := fn(2); r != 3 {
-		t.Errorf("Call returned %d, want 3", r)
-	}
-	if r := fv.Call([]Value{ValueOf(14)})[0].Int(); r != 15 {
-		t.Errorf("Call returned %d, want 15", r)
-	}
-	if r := fv.Interface().(func(int) int)(26); r != 27 {
-		t.Errorf("Call returned %d, want 27", r)
-	}
-}
-
-func TestMakeFuncVariadic(t *testing.T) {
-	// Test that variadic arguments are packed into a slice and passed as last arg
-	fn := func(_ int, is ...int) []int { return nil }
-	fv := MakeFunc(TypeOf(fn), func(in []Value) []Value { return in[1:2] })
-	ValueOf(&fn).Elem().Set(fv)
-
-	r := fn(1, 2, 3)
-	if r[0] != 2 || r[1] != 3 {
-		t.Errorf("Call returned [%v, %v]; want 2, 3", r[0], r[1])
-	}
-
-	r = fn(1, []int{2, 3}...)
-	if r[0] != 2 || r[1] != 3 {
-		t.Errorf("Call returned [%v, %v]; want 2, 3", r[0], r[1])
-	}
-
-	r = fv.Call([]Value{ValueOf(1), ValueOf(2), ValueOf(3)})[0].Interface().([]int)
-	if r[0] != 2 || r[1] != 3 {
-		t.Errorf("Call returned [%v, %v]; want 2, 3", r[0], r[1])
-	}
-
-	r = fv.CallSlice([]Value{ValueOf(1), ValueOf([]int{2, 3})})[0].Interface().([]int)
-	if r[0] != 2 || r[1] != 3 {
-		t.Errorf("Call returned [%v, %v]; want 2, 3", r[0], r[1])
-	}
-
-	f := fv.Interface().(func(int, ...int) []int)
-
-	r = f(1, 2, 3)
-	if r[0] != 2 || r[1] != 3 {
-		t.Errorf("Call returned [%v, %v]; want 2, 3", r[0], r[1])
-	}
-	r = f(1, []int{2, 3}...)
-	if r[0] != 2 || r[1] != 3 {
-		t.Errorf("Call returned [%v, %v]; want 2, 3", r[0], r[1])
-	}
-}
-
-type Point struct {
-	x, y int
-}
-
-// This will be index 0.
-func (p Point) AnotherMethod(scale int) int {
-	return -1
-}
-
-// This will be index 1.
-func (p Point) Dist(scale int) int {
-	//println("Point.Dist", p.x, p.y, scale)
-	return p.x*p.x*scale + p.y*p.y*scale
-}
-
-// This will be index 2.
-func (p Point) GCMethod(k int) int {
-	runtime.GC()
-	return k + p.x
-}
-
-// This will be index 3.
-func (p Point) TotalDist(points ...Point) int {
-	tot := 0
-	for _, q := range points {
-		dx := q.x - p.x
-		dy := q.y - p.y
-		tot += dx*dx + dy*dy // Should call Sqrt, but it's just a test.
-
-	}
-	return tot
-}
-
-func TestMethod(t *testing.T) {
-	// Non-curried method of type.
-	p := Point{3, 4}
-	i := TypeOf(p).Method(1).Func.Call([]Value{ValueOf(p), ValueOf(10)})[0].Int()
-	if i != 250 {
-		t.Errorf("Type Method returned %d; want 250", i)
-	}
-
-	m, ok := TypeOf(p).MethodByName("Dist")
-	if !ok {
-		t.Fatalf("method by name failed")
-	}
-	i = m.Func.Call([]Value{ValueOf(p), ValueOf(11)})[0].Int()
-	if i != 275 {
-		t.Errorf("Type MethodByName returned %d; want 275", i)
-	}
-
-	i = TypeOf(&p).Method(1).Func.Call([]Value{ValueOf(&p), ValueOf(12)})[0].Int()
-	if i != 300 {
-		t.Errorf("Pointer Type Method returned %d; want 300", i)
-	}
-
-	m, ok = TypeOf(&p).MethodByName("Dist")
-	if !ok {
-		t.Fatalf("ptr method by name failed")
-	}
-	i = m.Func.Call([]Value{ValueOf(&p), ValueOf(13)})[0].Int()
-	if i != 325 {
-		t.Errorf("Pointer Type MethodByName returned %d; want 325", i)
-	}
-
-	// Curried method of value.
-	tfunc := TypeOf((func(int) int)(nil))
-	v := ValueOf(p).Method(1)
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Value Method Type is %s; want %s", tt, tfunc)
-	}
-	i = v.Call([]Value{ValueOf(14)})[0].Int()
-	if i != 350 {
-		t.Errorf("Value Method returned %d; want 350", i)
-	}
-	v = ValueOf(p).MethodByName("Dist")
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Value MethodByName Type is %s; want %s", tt, tfunc)
-	}
-	i = v.Call([]Value{ValueOf(15)})[0].Int()
-	if i != 375 {
-		t.Errorf("Value MethodByName returned %d; want 375", i)
-	}
-
-	// Curried method of pointer.
-	v = ValueOf(&p).Method(1)
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Pointer Value Method Type is %s; want %s", tt, tfunc)
-	}
-	i = v.Call([]Value{ValueOf(16)})[0].Int()
-	if i != 400 {
-		t.Errorf("Pointer Value Method returned %d; want 400", i)
-	}
-	v = ValueOf(&p).MethodByName("Dist")
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Pointer Value MethodByName Type is %s; want %s", tt, tfunc)
-	}
-	i = v.Call([]Value{ValueOf(17)})[0].Int()
-	if i != 425 {
-		t.Errorf("Pointer Value MethodByName returned %d; want 425", i)
-	}
-
-	// Curried method of interface value.
-	// Have to wrap interface value in a struct to get at it.
-	// Passing it to ValueOf directly would
-	// access the underlying Point, not the interface.
-	var x interface {
-		Dist(int) int
-	} = p
-	pv := ValueOf(&x).Elem()
-	v = pv.Method(0)
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Interface Method Type is %s; want %s", tt, tfunc)
-	}
-	i = v.Call([]Value{ValueOf(18)})[0].Int()
-	if i != 450 {
-		t.Errorf("Interface Method returned %d; want 450", i)
-	}
-	v = pv.MethodByName("Dist")
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Interface MethodByName Type is %s; want %s", tt, tfunc)
-	}
-	i = v.Call([]Value{ValueOf(19)})[0].Int()
-	if i != 475 {
-		t.Errorf("Interface MethodByName returned %d; want 475", i)
-	}
-}
-
-func TestMethodValue(t *testing.T) {
-	p := Point{3, 4}
-	var i int64
-
-	// Curried method of value.
-	tfunc := TypeOf((func(int) int)(nil))
-	v := ValueOf(p).Method(1)
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Value Method Type is %s; want %s", tt, tfunc)
-	}
-	i = ValueOf(v.Interface()).Call([]Value{ValueOf(10)})[0].Int()
-	if i != 250 {
-		t.Errorf("Value Method returned %d; want 250", i)
-	}
-	v = ValueOf(p).MethodByName("Dist")
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Value MethodByName Type is %s; want %s", tt, tfunc)
-	}
-	i = ValueOf(v.Interface()).Call([]Value{ValueOf(11)})[0].Int()
-	if i != 275 {
-		t.Errorf("Value MethodByName returned %d; want 275", i)
-	}
-
-	// Curried method of pointer.
-	v = ValueOf(&p).Method(1)
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Pointer Value Method Type is %s; want %s", tt, tfunc)
-	}
-	i = ValueOf(v.Interface()).Call([]Value{ValueOf(12)})[0].Int()
-	if i != 300 {
-		t.Errorf("Pointer Value Method returned %d; want 300", i)
-	}
-	v = ValueOf(&p).MethodByName("Dist")
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Pointer Value MethodByName Type is %s; want %s", tt, tfunc)
-	}
-	i = ValueOf(v.Interface()).Call([]Value{ValueOf(13)})[0].Int()
-	if i != 325 {
-		t.Errorf("Pointer Value MethodByName returned %d; want 325", i)
-	}
-
-	// Curried method of pointer to pointer.
-	pp := &p
-	v = ValueOf(&pp).Elem().Method(1)
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Pointer Pointer Value Method Type is %s; want %s", tt, tfunc)
-	}
-	i = ValueOf(v.Interface()).Call([]Value{ValueOf(14)})[0].Int()
-	if i != 350 {
-		t.Errorf("Pointer Pointer Value Method returned %d; want 350", i)
-	}
-	v = ValueOf(&pp).Elem().MethodByName("Dist")
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Pointer Pointer Value MethodByName Type is %s; want %s", tt, tfunc)
-	}
-	i = ValueOf(v.Interface()).Call([]Value{ValueOf(15)})[0].Int()
-	if i != 375 {
-		t.Errorf("Pointer Pointer Value MethodByName returned %d; want 375", i)
-	}
-
-	// Curried method of interface value.
-	// Have to wrap interface value in a struct to get at it.
-	// Passing it to ValueOf directly would
-	// access the underlying Point, not the interface.
-	var s = struct {
-		X interface {
-			Dist(int) int
-		}
-	}{p}
-	pv := ValueOf(s).Field(0)
-	v = pv.Method(0)
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Interface Method Type is %s; want %s", tt, tfunc)
-	}
-	i = ValueOf(v.Interface()).Call([]Value{ValueOf(16)})[0].Int()
-	if i != 400 {
-		t.Errorf("Interface Method returned %d; want 400", i)
-	}
-	v = pv.MethodByName("Dist")
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Interface MethodByName Type is %s; want %s", tt, tfunc)
-	}
-	i = ValueOf(v.Interface()).Call([]Value{ValueOf(17)})[0].Int()
-	if i != 425 {
-		t.Errorf("Interface MethodByName returned %d; want 425", i)
-	}
-}
-
-func TestVariadicMethodValue(t *testing.T) {
-	p := Point{3, 4}
-	points := []Point{{20, 21}, {22, 23}, {24, 25}}
-	want := int64(p.TotalDist(points[0], points[1], points[2]))
-
-	// Curried method of value.
-	tfunc := TypeOf((func(...Point) int)(nil))
-	v := ValueOf(p).Method(3)
-	if tt := v.Type(); tt != tfunc {
-		t.Errorf("Variadic Method Type is %s; want %s", tt, tfunc)
-	}
-	i := ValueOf(v.Interface()).Call([]Value{ValueOf(points[0]), ValueOf(points[1]), ValueOf(points[2])})[0].Int()
-	if i != want {
-		t.Errorf("Variadic Method returned %d; want %d", i, want)
-	}
-	i = ValueOf(v.Interface()).CallSlice([]Value{ValueOf(points)})[0].Int()
-	if i != want {
-		t.Errorf("Variadic Method CallSlice returned %d; want %d", i, want)
-	}
-
-	f := v.Interface().(func(...Point) int)
-	i = int64(f(points[0], points[1], points[2]))
-	if i != want {
-		t.Errorf("Variadic Method Interface returned %d; want %d", i, want)
-	}
-	i = int64(f(points...))
-	if i != want {
-		t.Errorf("Variadic Method Interface Slice returned %d; want %d", i, want)
-	}
-}
-
-// Reflect version of $GOROOT/test/method5.go
-
-// Concrete types implementing M method.
-// Smaller than a word, word-sized, larger than a word.
-// Value and pointer receivers.
-
-type Tinter interface {
-	M(int, byte) (byte, int)
-}
-
-type Tsmallv byte
-
-func (v Tsmallv) M(x int, b byte) (byte, int) { return b, x + int(v) }
-
-type Tsmallp byte
-
-func (p *Tsmallp) M(x int, b byte) (byte, int) { return b, x + int(*p) }
-
-type Twordv uintptr
-
-func (v Twordv) M(x int, b byte) (byte, int) { return b, x + int(v) }
-
-type Twordp uintptr
-
-func (p *Twordp) M(x int, b byte) (byte, int) { return b, x + int(*p) }
-
-type Tbigv [2]uintptr
-
-func (v Tbigv) M(x int, b byte) (byte, int) { return b, x + int(v[0]) + int(v[1]) }
-
-type Tbigp [2]uintptr
-
-func (p *Tbigp) M(x int, b byte) (byte, int) { return b, x + int(p[0]) + int(p[1]) }
-
-// Again, with an unexported method.
-
-type tsmallv byte
-
-func (v tsmallv) m(x int, b byte) (byte, int) { return b, x + int(v) }
-
-type tsmallp byte
-
-func (p *tsmallp) m(x int, b byte) (byte, int) { return b, x + int(*p) }
-
-type twordv uintptr
-
-func (v twordv) m(x int, b byte) (byte, int) { return b, x + int(v) }
-
-type twordp uintptr
-
-func (p *twordp) m(x int, b byte) (byte, int) { return b, x + int(*p) }
-
-type tbigv [2]uintptr
-
-func (v tbigv) m(x int, b byte) (byte, int) { return b, x + int(v[0]) + int(v[1]) }
-
-type tbigp [2]uintptr
-
-func (p *tbigp) m(x int, b byte) (byte, int) { return b, x + int(p[0]) + int(p[1]) }
-
-type tinter interface {
-	m(int, byte) (byte, int)
-}
-
-// Embedding via pointer.
-
-type Tm1 struct {
-	Tm2
-}
-
-type Tm2 struct {
-	*Tm3
-}
-
-type Tm3 struct {
-	*Tm4
-}
-
-type Tm4 struct {
-}
-
-func (t4 Tm4) M(x int, b byte) (byte, int) { return b, x + 40 }
-
-func TestMethod5(t *testing.T) {
-	CheckF := func(name string, f func(int, byte) (byte, int), inc int) {
-		b, x := f(1000, 99)
-		if b != 99 || x != 1000+inc {
-			t.Errorf("%s(1000, 99) = %v, %v, want 99, %v", name, b, x, 1000+inc)
-		}
-	}
-
-	CheckV := func(name string, i Value, inc int) {
-		bx := i.Method(0).Call([]Value{ValueOf(1000), ValueOf(byte(99))})
-		b := bx[0].Interface()
-		x := bx[1].Interface()
-		if b != byte(99) || x != 1000+inc {
-			t.Errorf("direct %s.M(1000, 99) = %v, %v, want 99, %v", name, b, x, 1000+inc)
-		}
-
-		CheckF(name+".M", i.Method(0).Interface().(func(int, byte) (byte, int)), inc)
-	}
-
-	var TinterType = TypeOf(new(Tinter)).Elem()
-	var tinterType = TypeOf(new(tinter)).Elem()
-
-	CheckI := func(name string, i interface{}, inc int) {
-		v := ValueOf(i)
-		CheckV(name, v, inc)
-		CheckV("(i="+name+")", v.Convert(TinterType), inc)
-	}
-
-	sv := Tsmallv(1)
-	CheckI("sv", sv, 1)
-	CheckI("&sv", &sv, 1)
-
-	sp := Tsmallp(2)
-	CheckI("&sp", &sp, 2)
-
-	wv := Twordv(3)
-	CheckI("wv", wv, 3)
-	CheckI("&wv", &wv, 3)
-
-	wp := Twordp(4)
-	CheckI("&wp", &wp, 4)
-
-	bv := Tbigv([2]uintptr{5, 6})
-	CheckI("bv", bv, 11)
-	CheckI("&bv", &bv, 11)
-
-	bp := Tbigp([2]uintptr{7, 8})
-	CheckI("&bp", &bp, 15)
-
-	t4 := Tm4{}
-	t3 := Tm3{&t4}
-	t2 := Tm2{&t3}
-	t1 := Tm1{t2}
-	CheckI("t4", t4, 40)
-	CheckI("&t4", &t4, 40)
-	CheckI("t3", t3, 40)
-	CheckI("&t3", &t3, 40)
-	CheckI("t2", t2, 40)
-	CheckI("&t2", &t2, 40)
-	CheckI("t1", t1, 40)
-	CheckI("&t1", &t1, 40)
-
-	methodShouldPanic := func(name string, i interface{}) {
-		v := ValueOf(i)
-		m := v.Method(0)
-		shouldPanic(func() { m.Call([]Value{ValueOf(1000), ValueOf(byte(99))}) })
-		shouldPanic(func() { m.Interface() })
-
-		v = v.Convert(tinterType)
-		m = v.Method(0)
-		shouldPanic(func() { m.Call([]Value{ValueOf(1000), ValueOf(byte(99))}) })
-		shouldPanic(func() { m.Interface() })
-	}
-
-	_sv := tsmallv(1)
-	methodShouldPanic("_sv", _sv)
-	methodShouldPanic("&_sv", &_sv)
-
-	_sp := tsmallp(2)
-	methodShouldPanic("&_sp", &_sp)
-
-	_wv := twordv(3)
-	methodShouldPanic("_wv", _wv)
-	methodShouldPanic("&_wv", &_wv)
-
-	_wp := twordp(4)
-	methodShouldPanic("&_wp", &_wp)
-
-	_bv := tbigv([2]uintptr{5, 6})
-	methodShouldPanic("_bv", _bv)
-	methodShouldPanic("&_bv", &_bv)
-
-	_bp := tbigp([2]uintptr{7, 8})
-	methodShouldPanic("&_bp", &_bp)
-
-	var tnil Tinter
-	vnil := ValueOf(&tnil).Elem()
-	shouldPanic(func() { vnil.Method(0) })
-}
-
-func TestInterfaceSet(t *testing.T) {
-	p := &Point{3, 4}
-
-	var s struct {
-		I interface{}
-		P interface {
-			Dist(int) int
-		}
-	}
-	sv := ValueOf(&s).Elem()
-	sv.Field(0).Set(ValueOf(p))
-	if q := s.I.(*Point); q != p {
-		t.Errorf("i: have %p want %p", q, p)
-	}
-
-	pv := sv.Field(1)
-	pv.Set(ValueOf(p))
-	if q := s.P.(*Point); q != p {
-		t.Errorf("i: have %p want %p", q, p)
-	}
-
-	i := pv.Method(0).Call([]Value{ValueOf(10)})[0].Int()
-	if i != 250 {
-		t.Errorf("Interface Method returned %d; want 250", i)
-	}
-}
-
-type T1 struct {
-	a string
-	int
-}
-
-func TestAnonymousFields(t *testing.T) {
-	var field StructField
-	var ok bool
-	var t1 T1
-	type1 := TypeOf(t1)
-	if field, ok = type1.FieldByName("int"); !ok {
-		t.Fatal("no field 'int'")
-	}
-	if field.Index[0] != 1 {
-		t.Error("field index should be 1; is", field.Index)
-	}
-}
-
-type FTest struct {
-	s     interface{}
-	name  string
-	index []int
-	value int
-}
-
-type D1 struct {
-	d int
-}
-type D2 struct {
-	d int
-}
-
-type S0 struct {
-	A, B, C int
-	D1
-	D2
-}
-
-type S1 struct {
-	B int
-	S0
-}
-
-type S2 struct {
-	A int
-	*S1
-}
-
-type S1x struct {
-	S1
-}
-
-type S1y struct {
-	S1
-}
-
-type S3 struct {
-	S1x
-	S2
-	D, E int
-	*S1y
-}
-
-type S4 struct {
-	*S4
-	A int
-}
-
-// The X in S6 and S7 annihilate, but they also block the X in S8.S9.
-type S5 struct {
-	S6
-	S7
-	S8
-}
-
-type S6 struct {
-	X int
-}
-
-type S7 S6
-
-type S8 struct {
-	S9
-}
-
-type S9 struct {
-	X int
-	Y int
-}
-
-// The X in S11.S6 and S12.S6 annihilate, but they also block the X in S13.S8.S9.
-type S10 struct {
-	S11
-	S12
-	S13
-}
-
-type S11 struct {
-	S6
-}
-
-type S12 struct {
-	S6
-}
-
-type S13 struct {
-	S8
-}
-
-// The X in S15.S11.S1 and S16.S11.S1 annihilate.
-type S14 struct {
-	S15
-	S16
-}
-
-type S15 struct {
-	S11
-}
-
-type S16 struct {
-	S11
-}
-
-var fieldTests = []FTest{
-	{struct{}{}, "", nil, 0},
-	{struct{}{}, "Foo", nil, 0},
-	{S0{A: 'a'}, "A", []int{0}, 'a'},
-	{S0{}, "D", nil, 0},
-	{S1{S0: S0{A: 'a'}}, "A", []int{1, 0}, 'a'},
-	{S1{B: 'b'}, "B", []int{0}, 'b'},
-	{S1{}, "S0", []int{1}, 0},
-	{S1{S0: S0{C: 'c'}}, "C", []int{1, 2}, 'c'},
-	{S2{A: 'a'}, "A", []int{0}, 'a'},
-	{S2{}, "S1", []int{1}, 0},
-	{S2{S1: &S1{B: 'b'}}, "B", []int{1, 0}, 'b'},
-	{S2{S1: &S1{S0: S0{C: 'c'}}}, "C", []int{1, 1, 2}, 'c'},
-	{S2{}, "D", nil, 0},
-	{S3{}, "S1", nil, 0},
-	{S3{S2: S2{A: 'a'}}, "A", []int{1, 0}, 'a'},
-	{S3{}, "B", nil, 0},
-	{S3{D: 'd'}, "D", []int{2}, 0},
-	{S3{E: 'e'}, "E", []int{3}, 'e'},
-	{S4{A: 'a'}, "A", []int{1}, 'a'},
-	{S4{}, "B", nil, 0},
-	{S5{}, "X", nil, 0},
-	{S5{}, "Y", []int{2, 0, 1}, 0},
-	{S10{}, "X", nil, 0},
-	{S10{}, "Y", []int{2, 0, 0, 1}, 0},
-	{S14{}, "X", nil, 0},
-}
-
-func TestFieldByIndex(t *testing.T) {
-	for _, test := range fieldTests {
-		s := TypeOf(test.s)
-		f := s.FieldByIndex(test.index)
-		if f.Name != "" {
-			if test.index != nil {
-				if f.Name != test.name {
-					t.Errorf("%s.%s found; want %s", s.Name(), f.Name, test.name)
-				}
-			} else {
-				t.Errorf("%s.%s found", s.Name(), f.Name)
-			}
-		} else if len(test.index) > 0 {
-			t.Errorf("%s.%s not found", s.Name(), test.name)
-		}
-
-		if test.value != 0 {
-			v := ValueOf(test.s).FieldByIndex(test.index)
-			if v.IsValid() {
-				if x, ok := v.Interface().(int); ok {
-					if x != test.value {
-						t.Errorf("%s%v is %d; want %d", s.Name(), test.index, x, test.value)
-					}
-				} else {
-					t.Errorf("%s%v value not an int", s.Name(), test.index)
-				}
-			} else {
-				t.Errorf("%s%v value not found", s.Name(), test.index)
-			}
-		}
-	}
-}
-
-func TestFieldByName(t *testing.T) {
-	for _, test := range fieldTests {
-		s := TypeOf(test.s)
-		f, found := s.FieldByName(test.name)
-		if found {
-			if test.index != nil {
-				// Verify field depth and index.
-				if len(f.Index) != len(test.index) {
-					t.Errorf("%s.%s depth %d; want %d: %v vs %v", s.Name(), test.name, len(f.Index), len(test.index), f.Index, test.index)
-				} else {
-					for i, x := range f.Index {
-						if x != test.index[i] {
-							t.Errorf("%s.%s.Index[%d] is %d; want %d", s.Name(), test.name, i, x, test.index[i])
-						}
-					}
-				}
-			} else {
-				t.Errorf("%s.%s found", s.Name(), f.Name)
-			}
-		} else if len(test.index) > 0 {
-			t.Errorf("%s.%s not found", s.Name(), test.name)
-		}
-
-		if test.value != 0 {
-			v := ValueOf(test.s).FieldByName(test.name)
-			if v.IsValid() {
-				if x, ok := v.Interface().(int); ok {
-					if x != test.value {
-						t.Errorf("%s.%s is %d; want %d", s.Name(), test.name, x, test.value)
-					}
-				} else {
-					t.Errorf("%s.%s value not an int", s.Name(), test.name)
-				}
-			} else {
-				t.Errorf("%s.%s value not found", s.Name(), test.name)
-			}
-		}
-	}
-}
-
-func TestImportPath(t *testing.T) {
-	tests := []struct {
-		t    Type
-		path string
-	}{
-		{TypeOf(&base64.Encoding{}).Elem(), "encoding/base64"},
-		{TypeOf(int(0)), ""},
-		{TypeOf(int8(0)), ""},
-		{TypeOf(int16(0)), ""},
-		{TypeOf(int32(0)), ""},
-		{TypeOf(int64(0)), ""},
-		{TypeOf(uint(0)), ""},
-		{TypeOf(uint8(0)), ""},
-		{TypeOf(uint16(0)), ""},
-		{TypeOf(uint32(0)), ""},
-		{TypeOf(uint64(0)), ""},
-		{TypeOf(uintptr(0)), ""},
-		{TypeOf(float32(0)), ""},
-		{TypeOf(float64(0)), ""},
-		{TypeOf(complex64(0)), ""},
-		{TypeOf(complex128(0)), ""},
-		{TypeOf(byte(0)), ""},
-		{TypeOf(rune(0)), ""},
-		{TypeOf([]byte(nil)), ""},
-		{TypeOf([]rune(nil)), ""},
-		{TypeOf(string("")), ""},
-		{TypeOf((*interface{})(nil)).Elem(), ""},
-		{TypeOf((*byte)(nil)), ""},
-		{TypeOf((*rune)(nil)), ""},
-		{TypeOf((*int64)(nil)), ""},
-		{TypeOf(map[string]int{}), ""},
-		{TypeOf((*error)(nil)).Elem(), ""},
-	}
-	for _, test := range tests {
-		if path := test.t.PkgPath(); path != test.path {
-			t.Errorf("%v.PkgPath() = %q, want %q", test.t, path, test.path)
-		}
-	}
-}
-
-func TestVariadicType(t *testing.T) {
-	// Test example from Type documentation.
-	var f func(x int, y ...float64)
-	typ := TypeOf(f)
-	if typ.NumIn() == 2 && typ.In(0) == TypeOf(int(0)) {
-		sl := typ.In(1)
-		if sl.Kind() == Slice {
-			if sl.Elem() == TypeOf(0.0) {
-				// ok
-				return
-			}
-		}
-	}
-
-	// Failed
-	t.Errorf("want NumIn() = 2, In(0) = int, In(1) = []float64")
-	s := fmt.Sprintf("have NumIn() = %d", typ.NumIn())
-	for i := 0; i < typ.NumIn(); i++ {
-		s += fmt.Sprintf(", In(%d) = %s", i, typ.In(i))
-	}
-	t.Error(s)
-}
-
-type inner struct {
-	x int
-}
-
-type outer struct {
-	y int
-	inner
-}
-
-func (*inner) m() {}
-func (*outer) m() {}
-
-func TestNestedMethods(t *testing.T) {
-	t.Skip("fails on gccgo due to function wrappers")
-	typ := TypeOf((*outer)(nil))
-	if typ.NumMethod() != 1 || typ.Method(0).Func.Pointer() != ValueOf((*outer).m).Pointer() {
-		t.Errorf("Wrong method table for outer: (m=%p)", (*outer).m)
-		for i := 0; i < typ.NumMethod(); i++ {
-			m := typ.Method(i)
-			t.Errorf("\t%d: %s %#x\n", i, m.Name, m.Func.Pointer())
-		}
-	}
-}
-
-type InnerInt struct {
-	X int
-}
-
-type OuterInt struct {
-	Y int
-	InnerInt
-}
-
-func (i *InnerInt) M() int {
-	return i.X
-}
-
-func TestEmbeddedMethods(t *testing.T) {
-	/* This part of the test fails on gccgo due to function wrappers.
-	typ := TypeOf((*OuterInt)(nil))
-	if typ.NumMethod() != 1 || typ.Method(0).Func.Pointer() != ValueOf((*OuterInt).M).Pointer() {
-		t.Errorf("Wrong method table for OuterInt: (m=%p)", (*OuterInt).M)
-		for i := 0; i < typ.NumMethod(); i++ {
-			m := typ.Method(i)
-			t.Errorf("\t%d: %s %#x\n", i, m.Name, m.Func.Pointer())
-		}
-	}
-	*/
-
-	i := &InnerInt{3}
-	if v := ValueOf(i).Method(0).Call(nil)[0].Int(); v != 3 {
-		t.Errorf("i.M() = %d, want 3", v)
-	}
-
-	o := &OuterInt{1, InnerInt{2}}
-	if v := ValueOf(o).Method(0).Call(nil)[0].Int(); v != 2 {
-		t.Errorf("i.M() = %d, want 2", v)
-	}
-
-	f := (*OuterInt).M
-	if v := f(o); v != 2 {
-		t.Errorf("f(o) = %d, want 2", v)
-	}
-}
-
-func TestPtrTo(t *testing.T) {
-	var i int
-
-	typ := TypeOf(i)
-	for i = 0; i < 100; i++ {
-		typ = PtrTo(typ)
-	}
-	for i = 0; i < 100; i++ {
-		typ = typ.Elem()
-	}
-	if typ != TypeOf(i) {
-		t.Errorf("after 100 PtrTo and Elem, have %s, want %s", typ, TypeOf(i))
-	}
-}
-
-func TestPtrToGC(t *testing.T) {
-	type T *uintptr
-	tt := TypeOf(T(nil))
-	pt := PtrTo(tt)
-	const n = 100
-	var x []interface{}
-	for i := 0; i < n; i++ {
-		v := New(pt)
-		p := new(*uintptr)
-		*p = new(uintptr)
-		**p = uintptr(i)
-		v.Elem().Set(ValueOf(p).Convert(pt))
-		x = append(x, v.Interface())
-	}
-	runtime.GC()
-
-	for i, xi := range x {
-		k := ValueOf(xi).Elem().Elem().Elem().Interface().(uintptr)
-		if k != uintptr(i) {
-			t.Errorf("lost x[%d] = %d, want %d", i, k, i)
-		}
-	}
-}
-
-func TestAddr(t *testing.T) {
-	var p struct {
-		X, Y int
-	}
-
-	v := ValueOf(&p)
-	v = v.Elem()
-	v = v.Addr()
-	v = v.Elem()
-	v = v.Field(0)
-	v.SetInt(2)
-	if p.X != 2 {
-		t.Errorf("Addr.Elem.Set failed to set value")
-	}
-
-	// Again but take address of the ValueOf value.
-	// Exercises generation of PtrTypes not present in the binary.
-	q := &p
-	v = ValueOf(&q).Elem()
-	v = v.Addr()
-	v = v.Elem()
-	v = v.Elem()
-	v = v.Addr()
-	v = v.Elem()
-	v = v.Field(0)
-	v.SetInt(3)
-	if p.X != 3 {
-		t.Errorf("Addr.Elem.Set failed to set value")
-	}
-
-	// Starting without pointer we should get changed value
-	// in interface.
-	qq := p
-	v = ValueOf(&qq).Elem()
-	v0 := v
-	v = v.Addr()
-	v = v.Elem()
-	v = v.Field(0)
-	v.SetInt(4)
-	if p.X != 3 { // should be unchanged from last time
-		t.Errorf("somehow value Set changed original p")
-	}
-	p = v0.Interface().(struct {
-		X, Y int
-	})
-	if p.X != 4 {
-		t.Errorf("Addr.Elem.Set valued to set value in top value")
-	}
-
-	// Verify that taking the address of a type gives us a pointer
-	// which we can convert back using the usual interface
-	// notation.
-	var s struct {
-		B *bool
-	}
-	ps := ValueOf(&s).Elem().Field(0).Addr().Interface()
-	*(ps.(**bool)) = new(bool)
-	if s.B == nil {
-		t.Errorf("Addr.Interface direct assignment failed")
-	}
-}
-
-/* gccgo does do allocations here.
-
-func noAlloc(t *testing.T, n int, f func(int)) {
-	if testing.Short() {
-		t.Skip("skipping malloc count in short mode")
-	}
-	if runtime.GOMAXPROCS(0) > 1 {
-		t.Skip("skipping; GOMAXPROCS>1")
-	}
-	i := -1
-	allocs := testing.AllocsPerRun(n, func() {
-		f(i)
-		i++
-	})
-	if allocs > 0 {
-		t.Errorf("%d iterations: got %v mallocs, want 0", n, allocs)
-	}
-}
-
-func TestAllocations(t *testing.T) {
-	noAlloc(t, 100, func(j int) {
-		var i interface{}
-		var v Value
-
-		// We can uncomment this when compiler escape analysis
-		// is good enough to see that the integer assigned to i
-		// does not escape and therefore need not be allocated.
-		//
-		// i = 42 + j
-		// v = ValueOf(i)
-		// if int(v.Int()) != 42+j {
-		// 	panic("wrong int")
-		// }
-
-		i = func(j int) int { return j }
-		v = ValueOf(i)
-		if v.Interface().(func(int) int)(j) != j {
-			panic("wrong result")
-		}
-	})
-}
-
-*/
-
-func TestSmallNegativeInt(t *testing.T) {
-	i := int16(-1)
-	v := ValueOf(i)
-	if v.Int() != -1 {
-		t.Errorf("int16(-1).Int() returned %v", v.Int())
-	}
-}
-
-func TestIndex(t *testing.T) {
-	xs := []byte{1, 2, 3, 4, 5, 6, 7, 8}
-	v := ValueOf(xs).Index(3).Interface().(byte)
-	if v != xs[3] {
-		t.Errorf("xs.Index(3) = %v; expected %v", v, xs[3])
-	}
-	xa := [8]byte{10, 20, 30, 40, 50, 60, 70, 80}
-	v = ValueOf(xa).Index(2).Interface().(byte)
-	if v != xa[2] {
-		t.Errorf("xa.Index(2) = %v; expected %v", v, xa[2])
-	}
-	s := "0123456789"
-	v = ValueOf(s).Index(3).Interface().(byte)
-	if v != s[3] {
-		t.Errorf("s.Index(3) = %v; expected %v", v, s[3])
-	}
-}
-
-func TestSlice(t *testing.T) {
-	xs := []int{1, 2, 3, 4, 5, 6, 7, 8}
-	v := ValueOf(xs).Slice(3, 5).Interface().([]int)
-	if len(v) != 2 {
-		t.Errorf("len(xs.Slice(3, 5)) = %d", len(v))
-	}
-	if cap(v) != 5 {
-		t.Errorf("cap(xs.Slice(3, 5)) = %d", cap(v))
-	}
-	if !DeepEqual(v[0:5], xs[3:]) {
-		t.Errorf("xs.Slice(3, 5)[0:5] = %v", v[0:5])
-	}
-	xa := [8]int{10, 20, 30, 40, 50, 60, 70, 80}
-	v = ValueOf(&xa).Elem().Slice(2, 5).Interface().([]int)
-	if len(v) != 3 {
-		t.Errorf("len(xa.Slice(2, 5)) = %d", len(v))
-	}
-	if cap(v) != 6 {
-		t.Errorf("cap(xa.Slice(2, 5)) = %d", cap(v))
-	}
-	if !DeepEqual(v[0:6], xa[2:]) {
-		t.Errorf("xs.Slice(2, 5)[0:6] = %v", v[0:6])
-	}
-	s := "0123456789"
-	vs := ValueOf(s).Slice(3, 5).Interface().(string)
-	if vs != s[3:5] {
-		t.Errorf("s.Slice(3, 5) = %q; expected %q", vs, s[3:5])
-	}
-
-	rv := ValueOf(&xs).Elem()
-	rv = rv.Slice(3, 4)
-	ptr2 := rv.Pointer()
-	rv = rv.Slice(5, 5)
-	ptr3 := rv.Pointer()
-	if ptr3 != ptr2 {
-		t.Errorf("xs.Slice(3,4).Slice3(5,5).Pointer() = %#x, want %#x", ptr3, ptr2)
-	}
-}
-
-func TestSlice3(t *testing.T) {
-	xs := []int{1, 2, 3, 4, 5, 6, 7, 8}
-	v := ValueOf(xs).Slice3(3, 5, 7).Interface().([]int)
-	if len(v) != 2 {
-		t.Errorf("len(xs.Slice3(3, 5, 7)) = %d", len(v))
-	}
-	if cap(v) != 4 {
-		t.Errorf("cap(xs.Slice3(3, 5, 7)) = %d", cap(v))
-	}
-	if !DeepEqual(v[0:4], xs[3:7:7]) {
-		t.Errorf("xs.Slice3(3, 5, 7)[0:4] = %v", v[0:4])
-	}
-	rv := ValueOf(&xs).Elem()
-	shouldPanic(func() { rv.Slice3(1, 2, 1) })
-	shouldPanic(func() { rv.Slice3(1, 1, 11) })
-	shouldPanic(func() { rv.Slice3(2, 2, 1) })
-
-	xa := [8]int{10, 20, 30, 40, 50, 60, 70, 80}
-	v = ValueOf(&xa).Elem().Slice3(2, 5, 6).Interface().([]int)
-	if len(v) != 3 {
-		t.Errorf("len(xa.Slice(2, 5, 6)) = %d", len(v))
-	}
-	if cap(v) != 4 {
-		t.Errorf("cap(xa.Slice(2, 5, 6)) = %d", cap(v))
-	}
-	if !DeepEqual(v[0:4], xa[2:6:6]) {
-		t.Errorf("xs.Slice(2, 5, 6)[0:4] = %v", v[0:4])
-	}
-	rv = ValueOf(&xa).Elem()
-	shouldPanic(func() { rv.Slice3(1, 2, 1) })
-	shouldPanic(func() { rv.Slice3(1, 1, 11) })
-	shouldPanic(func() { rv.Slice3(2, 2, 1) })
-
-	s := "hello world"
-	rv = ValueOf(&s).Elem()
-	shouldPanic(func() { rv.Slice3(1, 2, 3) })
-
-	rv = ValueOf(&xs).Elem()
-	rv = rv.Slice3(3, 5, 7)
-	ptr2 := rv.Pointer()
-	rv = rv.Slice3(4, 4, 4)
-	ptr3 := rv.Pointer()
-	if ptr3 != ptr2 {
-		t.Errorf("xs.Slice3(3,5,7).Slice3(4,4,4).Pointer() = %#x, want %#x", ptr3, ptr2)
-	}
-}
-
-func TestSetLenCap(t *testing.T) {
-	xs := []int{1, 2, 3, 4, 5, 6, 7, 8}
-	xa := [8]int{10, 20, 30, 40, 50, 60, 70, 80}
-
-	vs := ValueOf(&xs).Elem()
-	shouldPanic(func() { vs.SetLen(10) })
-	shouldPanic(func() { vs.SetCap(10) })
-	shouldPanic(func() { vs.SetLen(-1) })
-	shouldPanic(func() { vs.SetCap(-1) })
-	shouldPanic(func() { vs.SetCap(6) }) // smaller than len
-	vs.SetLen(5)
-	if len(xs) != 5 || cap(xs) != 8 {
-		t.Errorf("after SetLen(5), len, cap = %d, %d, want 5, 8", len(xs), cap(xs))
-	}
-	vs.SetCap(6)
-	if len(xs) != 5 || cap(xs) != 6 {
-		t.Errorf("after SetCap(6), len, cap = %d, %d, want 5, 6", len(xs), cap(xs))
-	}
-	vs.SetCap(5)
-	if len(xs) != 5 || cap(xs) != 5 {
-		t.Errorf("after SetCap(5), len, cap = %d, %d, want 5, 5", len(xs), cap(xs))
-	}
-	shouldPanic(func() { vs.SetCap(4) }) // smaller than len
-	shouldPanic(func() { vs.SetLen(6) }) // bigger than cap
-
-	va := ValueOf(&xa).Elem()
-	shouldPanic(func() { va.SetLen(8) })
-	shouldPanic(func() { va.SetCap(8) })
-}
-
-func TestVariadic(t *testing.T) {
-	var b bytes.Buffer
-	V := ValueOf
-
-	b.Reset()
-	V(fmt.Fprintf).Call([]Value{V(&b), V("%s, %d world"), V("hello"), V(42)})
-	if b.String() != "hello, 42 world" {
-		t.Errorf("after Fprintf Call: %q != %q", b.String(), "hello 42 world")
-	}
-
-	b.Reset()
-	V(fmt.Fprintf).CallSlice([]Value{V(&b), V("%s, %d world"), V([]interface{}{"hello", 42})})
-	if b.String() != "hello, 42 world" {
-		t.Errorf("after Fprintf CallSlice: %q != %q", b.String(), "hello 42 world")
-	}
-}
-
-func TestFuncArg(t *testing.T) {
-	f1 := func(i int, f func(int) int) int { return f(i) }
-	f2 := func(i int) int { return i + 1 }
-	r := ValueOf(f1).Call([]Value{ValueOf(100), ValueOf(f2)})
-	if r[0].Int() != 101 {
-		t.Errorf("function returned %d, want 101", r[0].Int())
-	}
-}
-
-func TestStructArg(t *testing.T) {
-	type padded struct {
-		B string
-		C int32
-	}
-	var (
-		gotA  padded
-		gotB  uint32
-		wantA = padded{"3", 4}
-		wantB = uint32(5)
-	)
-	f := func(a padded, b uint32) {
-		gotA, gotB = a, b
-	}
-	ValueOf(f).Call([]Value{ValueOf(wantA), ValueOf(wantB)})
-	if gotA != wantA || gotB != wantB {
-		t.Errorf("function called with (%v, %v), want (%v, %v)", gotA, gotB, wantA, wantB)
-	}
-}
-
-var tagGetTests = []struct {
-	Tag   StructTag
-	Key   string
-	Value string
-}{
-	{`protobuf:"PB(1,2)"`, `protobuf`, `PB(1,2)`},
-	{`protobuf:"PB(1,2)"`, `foo`, ``},
-	{`protobuf:"PB(1,2)"`, `rotobuf`, ``},
-	{`protobuf:"PB(1,2)" json:"name"`, `json`, `name`},
-	{`protobuf:"PB(1,2)" json:"name"`, `protobuf`, `PB(1,2)`},
-	{`k0:"values contain spaces" k1:"and\ttabs"`, "k0", "values contain spaces"},
-	{`k0:"values contain spaces" k1:"and\ttabs"`, "k1", "and\ttabs"},
-}
-
-func TestTagGet(t *testing.T) {
-	for _, tt := range tagGetTests {
-		if v := tt.Tag.Get(tt.Key); v != tt.Value {
-			t.Errorf("StructTag(%#q).Get(%#q) = %#q, want %#q", tt.Tag, tt.Key, v, tt.Value)
-		}
-	}
-}
-
-func TestBytes(t *testing.T) {
-	type B []byte
-	x := B{1, 2, 3, 4}
-	y := ValueOf(x).Bytes()
-	if !bytes.Equal(x, y) {
-		t.Fatalf("ValueOf(%v).Bytes() = %v", x, y)
-	}
-	if &x[0] != &y[0] {
-		t.Errorf("ValueOf(%p).Bytes() = %p", &x[0], &y[0])
-	}
-}
-
-func TestSetBytes(t *testing.T) {
-	type B []byte
-	var x B
-	y := []byte{1, 2, 3, 4}
-	ValueOf(&x).Elem().SetBytes(y)
-	if !bytes.Equal(x, y) {
-		t.Fatalf("ValueOf(%v).Bytes() = %v", x, y)
-	}
-	if &x[0] != &y[0] {
-		t.Errorf("ValueOf(%p).Bytes() = %p", &x[0], &y[0])
-	}
-}
-
-type Private struct {
-	x int
-	y **int
-}
-
-func (p *Private) m() {
-}
-
-type Public struct {
-	X int
-	Y **int
-}
-
-func (p *Public) M() {
-}
-
-func TestUnexported(t *testing.T) {
-	var pub Public
-	v := ValueOf(&pub)
-	isValid(v.Elem().Field(0))
-	isValid(v.Elem().Field(1))
-	isValid(v.Elem().FieldByName("X"))
-	isValid(v.Elem().FieldByName("Y"))
-	isValid(v.Type().Method(0).Func)
-	isNonNil(v.Elem().Field(0).Interface())
-	isNonNil(v.Elem().Field(1).Interface())
-	isNonNil(v.Elem().FieldByName("X").Interface())
-	isNonNil(v.Elem().FieldByName("Y").Interface())
-	isNonNil(v.Type().Method(0).Func.Interface())
-
-	var priv Private
-	v = ValueOf(&priv)
-	isValid(v.Elem().Field(0))
-	isValid(v.Elem().Field(1))
-	isValid(v.Elem().FieldByName("x"))
-	isValid(v.Elem().FieldByName("y"))
-	isValid(v.Type().Method(0).Func)
-	shouldPanic(func() { v.Elem().Field(0).Interface() })
-	shouldPanic(func() { v.Elem().Field(1).Interface() })
-	shouldPanic(func() { v.Elem().FieldByName("x").Interface() })
-	shouldPanic(func() { v.Elem().FieldByName("y").Interface() })
-	shouldPanic(func() { v.Type().Method(0).Func.Interface() })
-}
-
-func shouldPanic(f func()) {
-	defer func() {
-		if recover() == nil {
-			panic("did not panic")
-		}
-	}()
-	f()
-}
-
-func isNonNil(x interface{}) {
-	if x == nil {
-		panic("nil interface")
-	}
-}
-
-func isValid(v Value) {
-	if !v.IsValid() {
-		panic("zero Value")
-	}
-}
-
-func TestAlias(t *testing.T) {
-	x := string("hello")
-	v := ValueOf(&x).Elem()
-	oldvalue := v.Interface()
-	v.SetString("world")
-	newvalue := v.Interface()
-
-	if oldvalue != "hello" || newvalue != "world" {
-		t.Errorf("aliasing: old=%q new=%q, want hello, world", oldvalue, newvalue)
-	}
-}
-
-var V = ValueOf
-
-func EmptyInterfaceV(x interface{}) Value {
-	return ValueOf(&x).Elem()
-}
-
-func ReaderV(x io.Reader) Value {
-	return ValueOf(&x).Elem()
-}
-
-func ReadWriterV(x io.ReadWriter) Value {
-	return ValueOf(&x).Elem()
-}
-
-type Empty struct{}
-type MyString string
-type MyBytes []byte
-type MyRunes []int32
-type MyFunc func()
-type MyByte byte
-
-var convertTests = []struct {
-	in  Value
-	out Value
-}{
-	// numbers
-	/*
-		Edit .+1,/\*\//-1>cat >/tmp/x.go && go run /tmp/x.go
-
-		package main
-
-		import "fmt"
-
-		var numbers = []string{
-			"int8", "uint8", "int16", "uint16",
-			"int32", "uint32", "int64", "uint64",
-			"int", "uint", "uintptr",
-			"float32", "float64",
-		}
-
-		func main() {
-			// all pairs but in an unusual order,
-			// to emit all the int8, uint8 cases
-			// before n grows too big.
-			n := 1
-			for i, f := range numbers {
-				for _, g := range numbers[i:] {
-					fmt.Printf("\t{V(%s(%d)), V(%s(%d))},\n", f, n, g, n)
-					n++
-					if f != g {
-						fmt.Printf("\t{V(%s(%d)), V(%s(%d))},\n", g, n, f, n)
-						n++
-					}
-				}
-			}
-		}
-	*/
-	{V(int8(1)), V(int8(1))},
-	{V(int8(2)), V(uint8(2))},
-	{V(uint8(3)), V(int8(3))},
-	{V(int8(4)), V(int16(4))},
-	{V(int16(5)), V(int8(5))},
-	{V(int8(6)), V(uint16(6))},
-	{V(uint16(7)), V(int8(7))},
-	{V(int8(8)), V(int32(8))},
-	{V(int32(9)), V(int8(9))},
-	{V(int8(10)), V(uint32(10))},
-	{V(uint32(11)), V(int8(11))},
-	{V(int8(12)), V(int64(12))},
-	{V(int64(13)), V(int8(13))},
-	{V(int8(14)), V(uint64(14))},
-	{V(uint64(15)), V(int8(15))},
-	{V(int8(16)), V(int(16))},
-	{V(int(17)), V(int8(17))},
-	{V(int8(18)), V(uint(18))},
-	{V(uint(19)), V(int8(19))},
-	{V(int8(20)), V(uintptr(20))},
-	{V(uintptr(21)), V(int8(21))},
-	{V(int8(22)), V(float32(22))},
-	{V(float32(23)), V(int8(23))},
-	{V(int8(24)), V(float64(24))},
-	{V(float64(25)), V(int8(25))},
-	{V(uint8(26)), V(uint8(26))},
-	{V(uint8(27)), V(int16(27))},
-	{V(int16(28)), V(uint8(28))},
-	{V(uint8(29)), V(uint16(29))},
-	{V(uint16(30)), V(uint8(30))},
-	{V(uint8(31)), V(int32(31))},
-	{V(int32(32)), V(uint8(32))},
-	{V(uint8(33)), V(uint32(33))},
-	{V(uint32(34)), V(uint8(34))},
-	{V(uint8(35)), V(int64(35))},
-	{V(int64(36)), V(uint8(36))},
-	{V(uint8(37)), V(uint64(37))},
-	{V(uint64(38)), V(uint8(38))},
-	{V(uint8(39)), V(int(39))},
-	{V(int(40)), V(uint8(40))},
-	{V(uint8(41)), V(uint(41))},
-	{V(uint(42)), V(uint8(42))},
-	{V(uint8(43)), V(uintptr(43))},
-	{V(uintptr(44)), V(uint8(44))},
-	{V(uint8(45)), V(float32(45))},
-	{V(float32(46)), V(uint8(46))},
-	{V(uint8(47)), V(float64(47))},
-	{V(float64(48)), V(uint8(48))},
-	{V(int16(49)), V(int16(49))},
-	{V(int16(50)), V(uint16(50))},
-	{V(uint16(51)), V(int16(51))},
-	{V(int16(52)), V(int32(52))},
-	{V(int32(53)), V(int16(53))},
-	{V(int16(54)), V(uint32(54))},
-	{V(uint32(55)), V(int16(55))},
-	{V(int16(56)), V(int64(56))},
-	{V(int64(57)), V(int16(57))},
-	{V(int16(58)), V(uint64(58))},
-	{V(uint64(59)), V(int16(59))},
-	{V(int16(60)), V(int(60))},
-	{V(int(61)), V(int16(61))},
-	{V(int16(62)), V(uint(62))},
-	{V(uint(63)), V(int16(63))},
-	{V(int16(64)), V(uintptr(64))},
-	{V(uintptr(65)), V(int16(65))},
-	{V(int16(66)), V(float32(66))},
-	{V(float32(67)), V(int16(67))},
-	{V(int16(68)), V(float64(68))},
-	{V(float64(69)), V(int16(69))},
-	{V(uint16(70)), V(uint16(70))},
-	{V(uint16(71)), V(int32(71))},
-	{V(int32(72)), V(uint16(72))},
-	{V(uint16(73)), V(uint32(73))},
-	{V(uint32(74)), V(uint16(74))},
-	{V(uint16(75)), V(int64(75))},
-	{V(int64(76)), V(uint16(76))},
-	{V(uint16(77)), V(uint64(77))},
-	{V(uint64(78)), V(uint16(78))},
-	{V(uint16(79)), V(int(79))},
-	{V(int(80)), V(uint16(80))},
-	{V(uint16(81)), V(uint(81))},
-	{V(uint(82)), V(uint16(82))},
-	{V(uint16(83)), V(uintptr(83))},
-	{V(uintptr(84)), V(uint16(84))},
-	{V(uint16(85)), V(float32(85))},
-	{V(float32(86)), V(uint16(86))},
-	{V(uint16(87)), V(float64(87))},
-	{V(float64(88)), V(uint16(88))},
-	{V(int32(89)), V(int32(89))},
-	{V(int32(90)), V(uint32(90))},
-	{V(uint32(91)), V(int32(91))},
-	{V(int32(92)), V(int64(92))},
-	{V(int64(93)), V(int32(93))},
-	{V(int32(94)), V(uint64(94))},
-	{V(uint64(95)), V(int32(95))},
-	{V(int32(96)), V(int(96))},
-	{V(int(97)), V(int32(97))},
-	{V(int32(98)), V(uint(98))},
-	{V(uint(99)), V(int32(99))},
-	{V(int32(100)), V(uintptr(100))},
-	{V(uintptr(101)), V(int32(101))},
-	{V(int32(102)), V(float32(102))},
-	{V(float32(103)), V(int32(103))},
-	{V(int32(104)), V(float64(104))},
-	{V(float64(105)), V(int32(105))},
-	{V(uint32(106)), V(uint32(106))},
-	{V(uint32(107)), V(int64(107))},
-	{V(int64(108)), V(uint32(108))},
-	{V(uint32(109)), V(uint64(109))},
-	{V(uint64(110)), V(uint32(110))},
-	{V(uint32(111)), V(int(111))},
-	{V(int(112)), V(uint32(112))},
-	{V(uint32(113)), V(uint(113))},
-	{V(uint(114)), V(uint32(114))},
-	{V(uint32(115)), V(uintptr(115))},
-	{V(uintptr(116)), V(uint32(116))},
-	{V(uint32(117)), V(float32(117))},
-	{V(float32(118)), V(uint32(118))},
-	{V(uint32(119)), V(float64(119))},
-	{V(float64(120)), V(uint32(120))},
-	{V(int64(121)), V(int64(121))},
-	{V(int64(122)), V(uint64(122))},
-	{V(uint64(123)), V(int64(123))},
-	{V(int64(124)), V(int(124))},
-	{V(int(125)), V(int64(125))},
-	{V(int64(126)), V(uint(126))},
-	{V(uint(127)), V(int64(127))},
-	{V(int64(128)), V(uintptr(128))},
-	{V(uintptr(129)), V(int64(129))},
-	{V(int64(130)), V(float32(130))},
-	{V(float32(131)), V(int64(131))},
-	{V(int64(132)), V(float64(132))},
-	{V(float64(133)), V(int64(133))},
-	{V(uint64(134)), V(uint64(134))},
-	{V(uint64(135)), V(int(135))},
-	{V(int(136)), V(uint64(136))},
-	{V(uint64(137)), V(uint(137))},
-	{V(uint(138)), V(uint64(138))},
-	{V(uint64(139)), V(uintptr(139))},
-	{V(uintptr(140)), V(uint64(140))},
-	{V(uint64(141)), V(float32(141))},
-	{V(float32(142)), V(uint64(142))},
-	{V(uint64(143)), V(float64(143))},
-	{V(float64(144)), V(uint64(144))},
-	{V(int(145)), V(int(145))},
-	{V(int(146)), V(uint(146))},
-	{V(uint(147)), V(int(147))},
-	{V(int(148)), V(uintptr(148))},
-	{V(uintptr(149)), V(int(149))},
-	{V(int(150)), V(float32(150))},
-	{V(float32(151)), V(int(151))},
-	{V(int(152)), V(float64(152))},
-	{V(float64(153)), V(int(153))},
-	{V(uint(154)), V(uint(154))},
-	{V(uint(155)), V(uintptr(155))},
-	{V(uintptr(156)), V(uint(156))},
-	{V(uint(157)), V(float32(157))},
-	{V(float32(158)), V(uint(158))},
-	{V(uint(159)), V(float64(159))},
-	{V(float64(160)), V(uint(160))},
-	{V(uintptr(161)), V(uintptr(161))},
-	{V(uintptr(162)), V(float32(162))},
-	{V(float32(163)), V(uintptr(163))},
-	{V(uintptr(164)), V(float64(164))},
-	{V(float64(165)), V(uintptr(165))},
-	{V(float32(166)), V(float32(166))},
-	{V(float32(167)), V(float64(167))},
-	{V(float64(168)), V(float32(168))},
-	{V(float64(169)), V(float64(169))},
-
-	// truncation
-	{V(float64(1.5)), V(int(1))},
-
-	// complex
-	{V(complex64(1i)), V(complex64(1i))},
-	{V(complex64(2i)), V(complex128(2i))},
-	{V(complex128(3i)), V(complex64(3i))},
-	{V(complex128(4i)), V(complex128(4i))},
-
-	// string
-	{V(string("hello")), V(string("hello"))},
-	{V(string("bytes1")), V([]byte("bytes1"))},
-	{V([]byte("bytes2")), V(string("bytes2"))},
-	{V([]byte("bytes3")), V([]byte("bytes3"))},
-	{V(string("runes♝")), V([]rune("runes♝"))},
-	{V([]rune("runes♕")), V(string("runes♕"))},
-	{V([]rune("runes🙈🙉🙊")), V([]rune("runes🙈🙉🙊"))},
-	{V(int('a')), V(string("a"))},
-	{V(int8('a')), V(string("a"))},
-	{V(int16('a')), V(string("a"))},
-	{V(int32('a')), V(string("a"))},
-	{V(int64('a')), V(string("a"))},
-	{V(uint('a')), V(string("a"))},
-	{V(uint8('a')), V(string("a"))},
-	{V(uint16('a')), V(string("a"))},
-	{V(uint32('a')), V(string("a"))},
-	{V(uint64('a')), V(string("a"))},
-	{V(uintptr('a')), V(string("a"))},
-	{V(int(-1)), V(string("\uFFFD"))},
-	{V(int8(-2)), V(string("\uFFFD"))},
-	{V(int16(-3)), V(string("\uFFFD"))},
-	{V(int32(-4)), V(string("\uFFFD"))},
-	{V(int64(-5)), V(string("\uFFFD"))},
-	{V(uint(0x110001)), V(string("\uFFFD"))},
-	{V(uint32(0x110002)), V(string("\uFFFD"))},
-	{V(uint64(0x110003)), V(string("\uFFFD"))},
-	{V(uintptr(0x110004)), V(string("\uFFFD"))},
-
-	// named string
-	{V(MyString("hello")), V(string("hello"))},
-	{V(string("hello")), V(MyString("hello"))},
-	{V(string("hello")), V(string("hello"))},
-	{V(MyString("hello")), V(MyString("hello"))},
-	{V(MyString("bytes1")), V([]byte("bytes1"))},
-	{V([]byte("bytes2")), V(MyString("bytes2"))},
-	{V([]byte("bytes3")), V([]byte("bytes3"))},
-	{V(MyString("runes♝")), V([]rune("runes♝"))},
-	{V([]rune("runes♕")), V(MyString("runes♕"))},
-	{V([]rune("runes🙈🙉🙊")), V([]rune("runes🙈🙉🙊"))},
-	{V([]rune("runes🙈🙉🙊")), V(MyRunes("runes🙈🙉🙊"))},
-	{V(MyRunes("runes🙈🙉🙊")), V([]rune("runes🙈🙉🙊"))},
-	{V(int('a')), V(MyString("a"))},
-	{V(int8('a')), V(MyString("a"))},
-	{V(int16('a')), V(MyString("a"))},
-	{V(int32('a')), V(MyString("a"))},
-	{V(int64('a')), V(MyString("a"))},
-	{V(uint('a')), V(MyString("a"))},
-	{V(uint8('a')), V(MyString("a"))},
-	{V(uint16('a')), V(MyString("a"))},
-	{V(uint32('a')), V(MyString("a"))},
-	{V(uint64('a')), V(MyString("a"))},
-	{V(uintptr('a')), V(MyString("a"))},
-	{V(int(-1)), V(MyString("\uFFFD"))},
-	{V(int8(-2)), V(MyString("\uFFFD"))},
-	{V(int16(-3)), V(MyString("\uFFFD"))},
-	{V(int32(-4)), V(MyString("\uFFFD"))},
-	{V(int64(-5)), V(MyString("\uFFFD"))},
-	{V(uint(0x110001)), V(MyString("\uFFFD"))},
-	{V(uint32(0x110002)), V(MyString("\uFFFD"))},
-	{V(uint64(0x110003)), V(MyString("\uFFFD"))},
-	{V(uintptr(0x110004)), V(MyString("\uFFFD"))},
-
-	// named []byte
-	{V(string("bytes1")), V(MyBytes("bytes1"))},
-	{V(MyBytes("bytes2")), V(string("bytes2"))},
-	{V(MyBytes("bytes3")), V(MyBytes("bytes3"))},
-	{V(MyString("bytes1")), V(MyBytes("bytes1"))},
-	{V(MyBytes("bytes2")), V(MyString("bytes2"))},
-
-	// named []rune
-	{V(string("runes♝")), V(MyRunes("runes♝"))},
-	{V(MyRunes("runes♕")), V(string("runes♕"))},
-	{V(MyRunes("runes🙈🙉🙊")), V(MyRunes("runes🙈🙉🙊"))},
-	{V(MyString("runes♝")), V(MyRunes("runes♝"))},
-	{V(MyRunes("runes♕")), V(MyString("runes♕"))},
-
-	// named types and equal underlying types
-	{V(new(int)), V(new(integer))},
-	{V(new(integer)), V(new(int))},
-	{V(Empty{}), V(struct{}{})},
-	{V(new(Empty)), V(new(struct{}))},
-	{V(struct{}{}), V(Empty{})},
-	{V(new(struct{})), V(new(Empty))},
-	{V(Empty{}), V(Empty{})},
-	{V(MyBytes{}), V([]byte{})},
-	{V([]byte{}), V(MyBytes{})},
-	{V((func())(nil)), V(MyFunc(nil))},
-	{V((MyFunc)(nil)), V((func())(nil))},
-
-	// can convert *byte and *MyByte
-	{V((*byte)(nil)), V((*MyByte)(nil))},
-	{V((*MyByte)(nil)), V((*byte)(nil))},
-
-	// cannot convert mismatched array sizes
-	{V([2]byte{}), V([2]byte{})},
-	{V([3]byte{}), V([3]byte{})},
-
-	// cannot convert other instances
-	{V((**byte)(nil)), V((**byte)(nil))},
-	{V((**MyByte)(nil)), V((**MyByte)(nil))},
-	{V((chan byte)(nil)), V((chan byte)(nil))},
-	{V((chan MyByte)(nil)), V((chan MyByte)(nil))},
-	{V(([]byte)(nil)), V(([]byte)(nil))},
-	{V(([]MyByte)(nil)), V(([]MyByte)(nil))},
-	{V((map[int]byte)(nil)), V((map[int]byte)(nil))},
-	{V((map[int]MyByte)(nil)), V((map[int]MyByte)(nil))},
-	{V((map[byte]int)(nil)), V((map[byte]int)(nil))},
-	{V((map[MyByte]int)(nil)), V((map[MyByte]int)(nil))},
-	{V([2]byte{}), V([2]byte{})},
-	{V([2]MyByte{}), V([2]MyByte{})},
-
-	// other
-	{V((***int)(nil)), V((***int)(nil))},
-	{V((***byte)(nil)), V((***byte)(nil))},
-	{V((***int32)(nil)), V((***int32)(nil))},
-	{V((***int64)(nil)), V((***int64)(nil))},
-	{V((chan int)(nil)), V((<-chan int)(nil))},
-	{V((chan int)(nil)), V((chan<- int)(nil))},
-	{V((chan string)(nil)), V((<-chan string)(nil))},
-	{V((chan string)(nil)), V((chan<- string)(nil))},
-	{V((chan byte)(nil)), V((chan byte)(nil))},
-	{V((chan MyByte)(nil)), V((chan MyByte)(nil))},
-	{V((map[int]bool)(nil)), V((map[int]bool)(nil))},
-	{V((map[int]byte)(nil)), V((map[int]byte)(nil))},
-	{V((map[uint]bool)(nil)), V((map[uint]bool)(nil))},
-	{V([]uint(nil)), V([]uint(nil))},
-	{V([]int(nil)), V([]int(nil))},
-	{V(new(interface{})), V(new(interface{}))},
-	{V(new(io.Reader)), V(new(io.Reader))},
-	{V(new(io.Writer)), V(new(io.Writer))},
-
-	// interfaces
-	{V(int(1)), EmptyInterfaceV(int(1))},
-	{V(string("hello")), EmptyInterfaceV(string("hello"))},
-	{V(new(bytes.Buffer)), ReaderV(new(bytes.Buffer))},
-	{ReadWriterV(new(bytes.Buffer)), ReaderV(new(bytes.Buffer))},
-	{V(new(bytes.Buffer)), ReadWriterV(new(bytes.Buffer))},
-}
-
-func TestConvert(t *testing.T) {
-	canConvert := map[[2]Type]bool{}
-	all := map[Type]bool{}
-
-	for _, tt := range convertTests {
-		t1 := tt.in.Type()
-		if !t1.ConvertibleTo(t1) {
-			t.Errorf("(%s).ConvertibleTo(%s) = false, want true", t1, t1)
-			continue
-		}
-
-		t2 := tt.out.Type()
-		if !t1.ConvertibleTo(t2) {
-			t.Errorf("(%s).ConvertibleTo(%s) = false, want true", t1, t2)
-			continue
-		}
-
-		all[t1] = true
-		all[t2] = true
-		canConvert[[2]Type{t1, t2}] = true
-
-		// vout1 represents the in value converted to the in type.
-		v1 := tt.in
-		vout1 := v1.Convert(t1)
-		out1 := vout1.Interface()
-		if vout1.Type() != tt.in.Type() || !DeepEqual(out1, tt.in.Interface()) {
-			t.Errorf("ValueOf(%T(%[1]v)).Convert(%s) = %T(%[3]v), want %T(%[4]v)", tt.in.Interface(), t1, out1, tt.in.Interface())
-		}
-
-		// vout2 represents the in value converted to the out type.
-		vout2 := v1.Convert(t2)
-		out2 := vout2.Interface()
-		if vout2.Type() != tt.out.Type() || !DeepEqual(out2, tt.out.Interface()) {
-			t.Errorf("ValueOf(%T(%[1]v)).Convert(%s) = %T(%[3]v), want %T(%[4]v)", tt.in.Interface(), t2, out2, tt.out.Interface())
-		}
-
-		// vout3 represents a new value of the out type, set to vout2.  This makes
-		// sure the converted value vout2 is really usable as a regular value.
-		vout3 := New(t2).Elem()
-		vout3.Set(vout2)
-		out3 := vout3.Interface()
-		if vout3.Type() != tt.out.Type() || !DeepEqual(out3, tt.out.Interface()) {
-			t.Errorf("Set(ValueOf(%T(%[1]v)).Convert(%s)) = %T(%[3]v), want %T(%[4]v)", tt.in.Interface(), t2, out3, tt.out.Interface())
-		}
-
-		if IsRO(v1) {
-			t.Errorf("table entry %v is RO, should not be", v1)
-		}
-		if IsRO(vout1) {
-			t.Errorf("self-conversion output %v is RO, should not be", vout1)
-		}
-		if IsRO(vout2) {
-			t.Errorf("conversion output %v is RO, should not be", vout2)
-		}
-		if IsRO(vout3) {
-			t.Errorf("set(conversion output) %v is RO, should not be", vout3)
-		}
-		if !IsRO(MakeRO(v1).Convert(t1)) {
-			t.Errorf("RO self-conversion output %v is not RO, should be", v1)
-		}
-		if !IsRO(MakeRO(v1).Convert(t2)) {
-			t.Errorf("RO conversion output %v is not RO, should be", v1)
-		}
-	}
-
-	// Assume that of all the types we saw during the tests,
-	// if there wasn't an explicit entry for a conversion between
-	// a pair of types, then it's not to be allowed. This checks for
-	// things like 'int64' converting to '*int'.
-	for t1 := range all {
-		for t2 := range all {
-			expectOK := t1 == t2 || canConvert[[2]Type{t1, t2}] || t2.Kind() == Interface && t2.NumMethod() == 0
-			if ok := t1.ConvertibleTo(t2); ok != expectOK {
-				t.Errorf("(%s).ConvertibleTo(%s) = %v, want %v", t1, t2, ok, expectOK)
-			}
-		}
-	}
-}
-
-type ComparableStruct struct {
-	X int
-}
-
-type NonComparableStruct struct {
-	X int
-	Y map[string]int
-}
-
-var comparableTests = []struct {
-	typ Type
-	ok  bool
-}{
-	{TypeOf(1), true},
-	{TypeOf("hello"), true},
-	{TypeOf(new(byte)), true},
-	{TypeOf((func())(nil)), false},
-	{TypeOf([]byte{}), false},
-	{TypeOf(map[string]int{}), false},
-	{TypeOf(make(chan int)), true},
-	{TypeOf(1.5), true},
-	{TypeOf(false), true},
-	{TypeOf(1i), true},
-	{TypeOf(ComparableStruct{}), true},
-	{TypeOf(NonComparableStruct{}), false},
-	{TypeOf([10]map[string]int{}), false},
-	{TypeOf([10]string{}), true},
-	{TypeOf(new(interface{})).Elem(), true},
-}
-
-func TestComparable(t *testing.T) {
-	for _, tt := range comparableTests {
-		if ok := tt.typ.Comparable(); ok != tt.ok {
-			t.Errorf("TypeOf(%v).Comparable() = %v, want %v", tt.typ, ok, tt.ok)
-		}
-	}
-}
-
-func TestOverflow(t *testing.T) {
-	if ovf := V(float64(0)).OverflowFloat(1e300); ovf {
-		t.Errorf("%v wrongly overflows float64", 1e300)
-	}
-
-	maxFloat32 := float64((1<<24 - 1) << (127 - 23))
-	if ovf := V(float32(0)).OverflowFloat(maxFloat32); ovf {
-		t.Errorf("%v wrongly overflows float32", maxFloat32)
-	}
-	ovfFloat32 := float64((1<<24-1)<<(127-23) + 1<<(127-52))
-	if ovf := V(float32(0)).OverflowFloat(ovfFloat32); !ovf {
-		t.Errorf("%v should overflow float32", ovfFloat32)
-	}
-	if ovf := V(float32(0)).OverflowFloat(-ovfFloat32); !ovf {
-		t.Errorf("%v should overflow float32", -ovfFloat32)
-	}
-
-	maxInt32 := int64(0x7fffffff)
-	if ovf := V(int32(0)).OverflowInt(maxInt32); ovf {
-		t.Errorf("%v wrongly overflows int32", maxInt32)
-	}
-	if ovf := V(int32(0)).OverflowInt(-1 << 31); ovf {
-		t.Errorf("%v wrongly overflows int32", -int64(1)<<31)
-	}
-	ovfInt32 := int64(1 << 31)
-	if ovf := V(int32(0)).OverflowInt(ovfInt32); !ovf {
-		t.Errorf("%v should overflow int32", ovfInt32)
-	}
-
-	maxUint32 := uint64(0xffffffff)
-	if ovf := V(uint32(0)).OverflowUint(maxUint32); ovf {
-		t.Errorf("%v wrongly overflows uint32", maxUint32)
-	}
-	ovfUint32 := uint64(1 << 32)
-	if ovf := V(uint32(0)).OverflowUint(ovfUint32); !ovf {
-		t.Errorf("%v should overflow uint32", ovfUint32)
-	}
-}
-
-func checkSameType(t *testing.T, x, y interface{}) {
-	if TypeOf(x) != TypeOf(y) {
-		t.Errorf("did not find preexisting type for %s (vs %s)", TypeOf(x), TypeOf(y))
-	}
-}
-
-func TestArrayOf(t *testing.T) {
-	// check construction and use of type not in binary
-	for _, table := range []struct {
-		n          int
-		value      func(i int) interface{}
-		comparable bool
-		want       string
-	}{
-		{
-			n:          0,
-			value:      func(i int) interface{} { type Tint int; return Tint(i) },
-			comparable: true,
-			want:       "[]",
-		},
-		{
-			n:          10,
-			value:      func(i int) interface{} { type Tint int; return Tint(i) },
-			comparable: true,
-			want:       "[0 1 2 3 4 5 6 7 8 9]",
-		},
-		{
-			n:          10,
-			value:      func(i int) interface{} { type Tfloat float64; return Tfloat(i) },
-			comparable: true,
-			want:       "[0 1 2 3 4 5 6 7 8 9]",
-		},
-		{
-			n:          10,
-			value:      func(i int) interface{} { type Tstring string; return Tstring(strconv.Itoa(i)) },
-			comparable: true,
-			want:       "[0 1 2 3 4 5 6 7 8 9]",
-		},
-		{
-			n:          10,
-			value:      func(i int) interface{} { type Tstruct struct{ V int }; return Tstruct{i} },
-			comparable: true,
-			want:       "[{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}]",
-		},
-		{
-			n:          10,
-			value:      func(i int) interface{} { type Tint int; return []Tint{Tint(i)} },
-			comparable: false,
-			want:       "[[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]]",
-		},
-		{
-			n:          10,
-			value:      func(i int) interface{} { type Tint int; return [1]Tint{Tint(i)} },
-			comparable: true,
-			want:       "[[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]]",
-		},
-		{
-			n:          10,
-			value:      func(i int) interface{} { type Tstruct struct{ V [1]int }; return Tstruct{[1]int{i}} },
-			comparable: true,
-			want:       "[{[0]} {[1]} {[2]} {[3]} {[4]} {[5]} {[6]} {[7]} {[8]} {[9]}]",
-		},
-		{
-			n:          10,
-			value:      func(i int) interface{} { type Tstruct struct{ V []int }; return Tstruct{[]int{i}} },
-			comparable: false,
-			want:       "[{[0]} {[1]} {[2]} {[3]} {[4]} {[5]} {[6]} {[7]} {[8]} {[9]}]",
-		},
-		{
-			n:          10,
-			value:      func(i int) interface{} { type TstructUV struct{ U, V int }; return TstructUV{i, i} },
-			comparable: true,
-			want:       "[{0 0} {1 1} {2 2} {3 3} {4 4} {5 5} {6 6} {7 7} {8 8} {9 9}]",
-		},
-		{
-			n: 10,
-			value: func(i int) interface{} {
-				type TstructUV struct {
-					U int
-					V float64
-				}
-				return TstructUV{i, float64(i)}
-			},
-			comparable: true,
-			want:       "[{0 0} {1 1} {2 2} {3 3} {4 4} {5 5} {6 6} {7 7} {8 8} {9 9}]",
-		},
-	} {
-		at := ArrayOf(table.n, TypeOf(table.value(0)))
-		v := New(at).Elem()
-		vok := New(at).Elem()
-		vnot := New(at).Elem()
-		for i := 0; i < v.Len(); i++ {
-			v.Index(i).Set(ValueOf(table.value(i)))
-			vok.Index(i).Set(ValueOf(table.value(i)))
-			j := i
-			if i+1 == v.Len() {
-				j = i + 1
-			}
-			vnot.Index(i).Set(ValueOf(table.value(j))) // make it differ only by last element
-		}
-		s := fmt.Sprint(v.Interface())
-		if s != table.want {
-			t.Errorf("constructed array = %s, want %s", s, table.want)
-		}
-
-		if table.comparable != at.Comparable() {
-			t.Errorf("constructed array (%#v) is comparable=%v, want=%v", v.Interface(), at.Comparable(), table.comparable)
-		}
-		if table.comparable {
-			if table.n > 0 {
-				if DeepEqual(vnot.Interface(), v.Interface()) {
-					t.Errorf(
-						"arrays (%#v) compare ok (but should not)",
-						v.Interface(),
-					)
-				}
-			}
-			if !DeepEqual(vok.Interface(), v.Interface()) {
-				t.Errorf(
-					"arrays (%#v) compare NOT-ok (but should)",
-					v.Interface(),
-				)
-			}
-		}
-	}
-
-	// check that type already in binary is found
-	type T int
-	checkSameType(t, Zero(ArrayOf(5, TypeOf(T(1)))).Interface(), [5]T{})
-}
-
-func TestArrayOfGC(t *testing.T) {
-	type T *uintptr
-	tt := TypeOf(T(nil))
-	const n = 100
-	var x []interface{}
-	for i := 0; i < n; i++ {
-		v := New(ArrayOf(n, tt)).Elem()
-		for j := 0; j < v.Len(); j++ {
-			p := new(uintptr)
-			*p = uintptr(i*n + j)
-			v.Index(j).Set(ValueOf(p).Convert(tt))
-		}
-		x = append(x, v.Interface())
-	}
-	runtime.GC()
-
-	for i, xi := range x {
-		v := ValueOf(xi)
-		for j := 0; j < v.Len(); j++ {
-			k := v.Index(j).Elem().Interface()
-			if k != uintptr(i*n+j) {
-				t.Errorf("lost x[%d][%d] = %d, want %d", i, j, k, i*n+j)
-			}
-		}
-	}
-}
-
-func TestArrayOfAlg(t *testing.T) {
-	at := ArrayOf(6, TypeOf(byte(0)))
-	v1 := New(at).Elem()
-	v2 := New(at).Elem()
-	if v1.Interface() != v1.Interface() {
-		t.Errorf("constructed array %v not equal to itself", v1.Interface())
-	}
-	v1.Index(5).Set(ValueOf(byte(1)))
-	if i1, i2 := v1.Interface(), v2.Interface(); i1 == i2 {
-		t.Errorf("constructed arrays %v and %v should not be equal", i1, i2)
-	}
-
-	at = ArrayOf(6, TypeOf([]int(nil)))
-	v1 = New(at).Elem()
-	shouldPanic(func() { _ = v1.Interface() == v1.Interface() })
-}
-
-func TestArrayOfGenericAlg(t *testing.T) {
-	at1 := ArrayOf(5, TypeOf(string("")))
-	at := ArrayOf(6, at1)
-	v1 := New(at).Elem()
-	v2 := New(at).Elem()
-	if v1.Interface() != v1.Interface() {
-		t.Errorf("constructed array %v not equal to itself", v1.Interface())
-	}
-
-	v1.Index(0).Index(0).Set(ValueOf("abc"))
-	v2.Index(0).Index(0).Set(ValueOf("efg"))
-	if i1, i2 := v1.Interface(), v2.Interface(); i1 == i2 {
-		t.Errorf("constructed arrays %v and %v should not be equal", i1, i2)
-	}
-
-	v1.Index(0).Index(0).Set(ValueOf("abc"))
-	v2.Index(0).Index(0).Set(ValueOf((v1.Index(0).Index(0).String() + " ")[:3]))
-	if i1, i2 := v1.Interface(), v2.Interface(); i1 != i2 {
-		t.Errorf("constructed arrays %v and %v should be equal", i1, i2)
-	}
-
-	// Test hash
-	m := MakeMap(MapOf(at, TypeOf(int(0))))
-	m.SetMapIndex(v1, ValueOf(1))
-	if i1, i2 := v1.Interface(), v2.Interface(); !m.MapIndex(v2).IsValid() {
-		t.Errorf("constructed arrays %v and %v have different hashes", i1, i2)
-	}
-}
-
-func TestArrayOfDirectIface(t *testing.T) {
-	t.Skip("skipping test because gccgo uses a different directiface value")
-	{
-		type T [1]*byte
-		i1 := Zero(TypeOf(T{})).Interface()
-		v1 := ValueOf(&i1).Elem()
-		p1 := v1.InterfaceData()[1]
-
-		i2 := Zero(ArrayOf(1, PtrTo(TypeOf(int8(0))))).Interface()
-		v2 := ValueOf(&i2).Elem()
-		p2 := v2.InterfaceData()[1]
-
-		if p1 != 0 {
-			t.Errorf("got p1=%v. want=%v", p1, nil)
-		}
-
-		if p2 != 0 {
-			t.Errorf("got p2=%v. want=%v", p2, nil)
-		}
-	}
-	{
-		type T [0]*byte
-		i1 := Zero(TypeOf(T{})).Interface()
-		v1 := ValueOf(&i1).Elem()
-		p1 := v1.InterfaceData()[1]
-
-		i2 := Zero(ArrayOf(0, PtrTo(TypeOf(int8(0))))).Interface()
-		v2 := ValueOf(&i2).Elem()
-		p2 := v2.InterfaceData()[1]
-
-		if p1 == 0 {
-			t.Errorf("got p1=%v. want=not-%v", p1, nil)
-		}
-
-		if p2 == 0 {
-			t.Errorf("got p2=%v. want=not-%v", p2, nil)
-		}
-	}
-}
-
-func TestSliceOf(t *testing.T) {
-	// check construction and use of type not in binary
-	type T int
-	st := SliceOf(TypeOf(T(1)))
-	v := MakeSlice(st, 10, 10)
-	runtime.GC()
-	for i := 0; i < v.Len(); i++ {
-		v.Index(i).Set(ValueOf(T(i)))
-		runtime.GC()
-	}
-	s := fmt.Sprint(v.Interface())
-	want := "[0 1 2 3 4 5 6 7 8 9]"
-	if s != want {
-		t.Errorf("constructed slice = %s, want %s", s, want)
-	}
-
-	// check that type already in binary is found
-	type T1 int
-	checkSameType(t, Zero(SliceOf(TypeOf(T1(1)))).Interface(), []T1{})
-}
-
-func TestSliceOverflow(t *testing.T) {
-	// check that MakeSlice panics when size of slice overflows uint
-	const S = 1e6
-	s := uint(S)
-	l := (1<<(unsafe.Sizeof((*byte)(nil))*8)-1)/s + 1
-	if l*s >= s {
-		t.Fatal("slice size does not overflow")
-	}
-	var x [S]byte
-	st := SliceOf(TypeOf(x))
-	defer func() {
-		err := recover()
-		if err == nil {
-			t.Fatal("slice overflow does not panic")
-		}
-	}()
-	MakeSlice(st, int(l), int(l))
-}
-
-func TestSliceOfGC(t *testing.T) {
-	type T *uintptr
-	tt := TypeOf(T(nil))
-	st := SliceOf(tt)
-	const n = 100
-	var x []interface{}
-	for i := 0; i < n; i++ {
-		v := MakeSlice(st, n, n)
-		for j := 0; j < v.Len(); j++ {
-			p := new(uintptr)
-			*p = uintptr(i*n + j)
-			v.Index(j).Set(ValueOf(p).Convert(tt))
-		}
-		x = append(x, v.Interface())
-	}
-	runtime.GC()
-
-	for i, xi := range x {
-		v := ValueOf(xi)
-		for j := 0; j < v.Len(); j++ {
-			k := v.Index(j).Elem().Interface()
-			if k != uintptr(i*n+j) {
-				t.Errorf("lost x[%d][%d] = %d, want %d", i, j, k, i*n+j)
-			}
-		}
-	}
-}
-
-func TestChanOf(t *testing.T) {
-	// check construction and use of type not in binary
-	type T string
-	ct := ChanOf(BothDir, TypeOf(T("")))
-	v := MakeChan(ct, 2)
-	runtime.GC()
-	v.Send(ValueOf(T("hello")))
-	runtime.GC()
-	v.Send(ValueOf(T("world")))
-	runtime.GC()
-
-	sv1, _ := v.Recv()
-	sv2, _ := v.Recv()
-	s1 := sv1.String()
-	s2 := sv2.String()
-	if s1 != "hello" || s2 != "world" {
-		t.Errorf("constructed chan: have %q, %q, want %q, %q", s1, s2, "hello", "world")
-	}
-
-	// check that type already in binary is found
-	type T1 int
-	checkSameType(t, Zero(ChanOf(BothDir, TypeOf(T1(1)))).Interface(), (chan T1)(nil))
-}
-
-func TestChanOfDir(t *testing.T) {
-	// check construction and use of type not in binary
-	type T string
-	crt := ChanOf(RecvDir, TypeOf(T("")))
-	cst := ChanOf(SendDir, TypeOf(T("")))
-
-	// check that type already in binary is found
-	type T1 int
-	checkSameType(t, Zero(ChanOf(RecvDir, TypeOf(T1(1)))).Interface(), (<-chan T1)(nil))
-	checkSameType(t, Zero(ChanOf(SendDir, TypeOf(T1(1)))).Interface(), (chan<- T1)(nil))
-
-	// check String form of ChanDir
-	if crt.ChanDir().String() != "<-chan" {
-		t.Errorf("chan dir: have %q, want %q", crt.ChanDir().String(), "<-chan")
-	}
-	if cst.ChanDir().String() != "chan<-" {
-		t.Errorf("chan dir: have %q, want %q", cst.ChanDir().String(), "chan<-")
-	}
-}
-
-func TestChanOfGC(t *testing.T) {
-	done := make(chan bool, 1)
-	go func() {
-		select {
-		case <-done:
-		case <-time.After(5 * time.Second):
-			panic("deadlock in TestChanOfGC")
-		}
-	}()
-
-	defer func() {
-		done <- true
-	}()
-
-	type T *uintptr
-	tt := TypeOf(T(nil))
-	ct := ChanOf(BothDir, tt)
-
-	// NOTE: The garbage collector handles allocated channels specially,
-	// so we have to save pointers to channels in x; the pointer code will
-	// use the gc info in the newly constructed chan type.
-	const n = 100
-	var x []interface{}
-	for i := 0; i < n; i++ {
-		v := MakeChan(ct, n)
-		for j := 0; j < n; j++ {
-			p := new(uintptr)
-			*p = uintptr(i*n + j)
-			v.Send(ValueOf(p).Convert(tt))
-		}
-		pv := New(ct)
-		pv.Elem().Set(v)
-		x = append(x, pv.Interface())
-	}
-	runtime.GC()
-
-	for i, xi := range x {
-		v := ValueOf(xi).Elem()
-		for j := 0; j < n; j++ {
-			pv, _ := v.Recv()
-			k := pv.Elem().Interface()
-			if k != uintptr(i*n+j) {
-				t.Errorf("lost x[%d][%d] = %d, want %d", i, j, k, i*n+j)
-			}
-		}
-	}
-}
-
-func TestMapOf(t *testing.T) {
-	// check construction and use of type not in binary
-	type K string
-	type V float64
-
-	v := MakeMap(MapOf(TypeOf(K("")), TypeOf(V(0))))
-	runtime.GC()
-	v.SetMapIndex(ValueOf(K("a")), ValueOf(V(1)))
-	runtime.GC()
-
-	s := fmt.Sprint(v.Interface())
-	want := "map[a:1]"
-	if s != want {
-		t.Errorf("constructed map = %s, want %s", s, want)
-	}
-
-	// check that type already in binary is found
-	checkSameType(t, Zero(MapOf(TypeOf(V(0)), TypeOf(K("")))).Interface(), map[V]K(nil))
-
-	// check that invalid key type panics
-	shouldPanic(func() { MapOf(TypeOf((func())(nil)), TypeOf(false)) })
-}
-
-func TestMapOfGCKeys(t *testing.T) {
-	type T *uintptr
-	tt := TypeOf(T(nil))
-	mt := MapOf(tt, TypeOf(false))
-
-	// NOTE: The garbage collector handles allocated maps specially,
-	// so we have to save pointers to maps in x; the pointer code will
-	// use the gc info in the newly constructed map type.
-	const n = 100
-	var x []interface{}
-	for i := 0; i < n; i++ {
-		v := MakeMap(mt)
-		for j := 0; j < n; j++ {
-			p := new(uintptr)
-			*p = uintptr(i*n + j)
-			v.SetMapIndex(ValueOf(p).Convert(tt), ValueOf(true))
-		}
-		pv := New(mt)
-		pv.Elem().Set(v)
-		x = append(x, pv.Interface())
-	}
-	runtime.GC()
-
-	for i, xi := range x {
-		v := ValueOf(xi).Elem()
-		var out []int
-		for _, kv := range v.MapKeys() {
-			out = append(out, int(kv.Elem().Interface().(uintptr)))
-		}
-		sort.Ints(out)
-		for j, k := range out {
-			if k != i*n+j {
-				t.Errorf("lost x[%d][%d] = %d, want %d", i, j, k, i*n+j)
-			}
-		}
-	}
-}
-
-func TestMapOfGCValues(t *testing.T) {
-	type T *uintptr
-	tt := TypeOf(T(nil))
-	mt := MapOf(TypeOf(1), tt)
-
-	// NOTE: The garbage collector handles allocated maps specially,
-	// so we have to save pointers to maps in x; the pointer code will
-	// use the gc info in the newly constructed map type.
-	const n = 100
-	var x []interface{}
-	for i := 0; i < n; i++ {
-		v := MakeMap(mt)
-		for j := 0; j < n; j++ {
-			p := new(uintptr)
-			*p = uintptr(i*n + j)
-			v.SetMapIndex(ValueOf(j), ValueOf(p).Convert(tt))
-		}
-		pv := New(mt)
-		pv.Elem().Set(v)
-		x = append(x, pv.Interface())
-	}
-	runtime.GC()
-
-	for i, xi := range x {
-		v := ValueOf(xi).Elem()
-		for j := 0; j < n; j++ {
-			k := v.MapIndex(ValueOf(j)).Elem().Interface().(uintptr)
-			if k != uintptr(i*n+j) {
-				t.Errorf("lost x[%d][%d] = %d, want %d", i, j, k, i*n+j)
-			}
-		}
-	}
-}
-
-func TestTypelinksSorted(t *testing.T) {
-	var last string
-	for i, n := range TypeLinks() {
-		if n < last {
-			t.Errorf("typelinks not sorted: %q [%d] > %q [%d]", last, i-1, n, i)
-		}
-		last = n
-	}
-}
-
-func TestFuncOf(t *testing.T) {
-	// check construction and use of type not in binary
-	type K string
-	type V float64
-
-	fn := func(args []Value) []Value {
-		if len(args) != 1 {
-			t.Errorf("args == %v, want exactly one arg", args)
-		} else if args[0].Type() != TypeOf(K("")) {
-			t.Errorf("args[0] is type %v, want %v", args[0].Type, TypeOf(K("")))
-		} else if args[0].String() != "gopher" {
-			t.Errorf("args[0] = %q, want %q", args[0].String(), "gopher")
-		}
-		return []Value{ValueOf(V(3.14))}
-	}
-	v := MakeFunc(FuncOf([]Type{TypeOf(K(""))}, []Type{TypeOf(V(0))}, false), fn)
-
-	outs := v.Call([]Value{ValueOf(K("gopher"))})
-	if len(outs) != 1 {
-		t.Fatalf("v.Call returned %v, want exactly one result", outs)
-	} else if outs[0].Type() != TypeOf(V(0)) {
-		t.Fatalf("c.Call[0] is type %v, want %v", outs[0].Type, TypeOf(V(0)))
-	}
-	f := outs[0].Float()
-	if f != 3.14 {
-		t.Errorf("constructed func returned %f, want %f", f, 3.14)
-	}
-
-	// check that types already in binary are found
-	type T1 int
-	testCases := []struct {
-		in, out  []Type
-		variadic bool
-		want     interface{}
-	}{
-		{in: []Type{TypeOf(T1(0))}, want: (func(T1))(nil)},
-		{in: []Type{TypeOf(int(0))}, want: (func(int))(nil)},
-		{in: []Type{SliceOf(TypeOf(int(0)))}, variadic: true, want: (func(...int))(nil)},
-		{in: []Type{TypeOf(int(0))}, out: []Type{TypeOf(false)}, want: (func(int) bool)(nil)},
-		{in: []Type{TypeOf(int(0))}, out: []Type{TypeOf(false), TypeOf("")}, want: (func(int) (bool, string))(nil)},
-	}
-	for _, tt := range testCases {
-		checkSameType(t, Zero(FuncOf(tt.in, tt.out, tt.variadic)).Interface(), tt.want)
-	}
-
-	// check that variadic requires last element be a slice.
-	FuncOf([]Type{TypeOf(1), TypeOf(""), SliceOf(TypeOf(false))}, nil, true)
-	shouldPanic(func() { FuncOf([]Type{TypeOf(0), TypeOf(""), TypeOf(false)}, nil, true) })
-	shouldPanic(func() { FuncOf(nil, nil, true) })
-}
-
-type B1 struct {
-	X int
-	Y int
-	Z int
-}
-
-func BenchmarkFieldByName1(b *testing.B) {
-	t := TypeOf(B1{})
-	for i := 0; i < b.N; i++ {
-		t.FieldByName("Z")
-	}
-}
-
-func BenchmarkFieldByName2(b *testing.B) {
-	t := TypeOf(S3{})
-	for i := 0; i < b.N; i++ {
-		t.FieldByName("B")
-	}
-}
-
-type R0 struct {
-	*R1
-	*R2
-	*R3
-	*R4
-}
-
-type R1 struct {
-	*R5
-	*R6
-	*R7
-	*R8
-}
-
-type R2 R1
-type R3 R1
-type R4 R1
-
-type R5 struct {
-	*R9
-	*R10
-	*R11
-	*R12
-}
-
-type R6 R5
-type R7 R5
-type R8 R5
-
-type R9 struct {
-	*R13
-	*R14
-	*R15
-	*R16
-}
-
-type R10 R9
-type R11 R9
-type R12 R9
-
-type R13 struct {
-	*R17
-	*R18
-	*R19
-	*R20
-}
-
-type R14 R13
-type R15 R13
-type R16 R13
-
-type R17 struct {
-	*R21
-	*R22
-	*R23
-	*R24
-}
-
-type R18 R17
-type R19 R17
-type R20 R17
-
-type R21 struct {
-	X int
-}
-
-type R22 R21
-type R23 R21
-type R24 R21
-
-func TestEmbed(t *testing.T) {
-	typ := TypeOf(R0{})
-	f, ok := typ.FieldByName("X")
-	if ok {
-		t.Fatalf(`FieldByName("X") should fail, returned %v`, f.Index)
-	}
-}
-
-func BenchmarkFieldByName3(b *testing.B) {
-	t := TypeOf(R0{})
-	for i := 0; i < b.N; i++ {
-		t.FieldByName("X")
-	}
-}
-
-type S struct {
-	i1 int64
-	i2 int64
-}
-
-func BenchmarkInterfaceBig(b *testing.B) {
-	v := ValueOf(S{})
-	for i := 0; i < b.N; i++ {
-		v.Interface()
-	}
-	b.StopTimer()
-}
-
-func TestAllocsInterfaceBig(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping malloc count in short mode")
-	}
-	v := ValueOf(S{})
-	if allocs := testing.AllocsPerRun(100, func() { v.Interface() }); allocs > 0 {
-		t.Error("allocs:", allocs)
-	}
-}
-
-func BenchmarkInterfaceSmall(b *testing.B) {
-	v := ValueOf(int64(0))
-	for i := 0; i < b.N; i++ {
-		v.Interface()
-	}
-}
-
-func TestAllocsInterfaceSmall(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping malloc count in short mode")
-	}
-	v := ValueOf(int64(0))
-	if allocs := testing.AllocsPerRun(100, func() { v.Interface() }); allocs > 0 {
-		t.Error("allocs:", allocs)
-	}
-}
-
-// An exhaustive is a mechanism for writing exhaustive or stochastic tests.
-// The basic usage is:
-//
-//	for x.Next() {
-//		... code using x.Maybe() or x.Choice(n) to create test cases ...
-//	}
-//
-// Each iteration of the loop returns a different set of results, until all
-// possible result sets have been explored. It is okay for different code paths
-// to make different method call sequences on x, but there must be no
-// other source of non-determinism in the call sequences.
-//
-// When faced with a new decision, x chooses randomly. Future explorations
-// of that path will choose successive values for the result. Thus, stopping
-// the loop after a fixed number of iterations gives somewhat stochastic
-// testing.
-//
-// Example:
-//
-//	for x.Next() {
-//		v := make([]bool, x.Choose(4))
-//		for i := range v {
-//			v[i] = x.Maybe()
-//		}
-//		fmt.Println(v)
-//	}
-//
-// prints (in some order):
-//
-//	[]
-//	[false]
-//	[true]
-//	[false false]
-//	[false true]
-//	...
-//	[true true]
-//	[false false false]
-//	...
-//	[true true true]
-//	[false false false false]
-//	...
-//	[true true true true]
-//
-type exhaustive struct {
-	r    *rand.Rand
-	pos  int
-	last []choice
-}
-
-type choice struct {
-	off int
-	n   int
-	max int
-}
-
-func (x *exhaustive) Next() bool {
-	if x.r == nil {
-		x.r = rand.New(rand.NewSource(time.Now().UnixNano()))
-	}
-	x.pos = 0
-	if x.last == nil {
-		x.last = []choice{}
-		return true
-	}
-	for i := len(x.last) - 1; i >= 0; i-- {
-		c := &x.last[i]
-		if c.n+1 < c.max {
-			c.n++
-			x.last = x.last[:i+1]
-			return true
-		}
-	}
-	return false
-}
-
-func (x *exhaustive) Choose(max int) int {
-	if x.pos >= len(x.last) {
-		x.last = append(x.last, choice{x.r.Intn(max), 0, max})
-	}
-	c := &x.last[x.pos]
-	x.pos++
-	if c.max != max {
-		panic("inconsistent use of exhaustive tester")
-	}
-	return (c.n + c.off) % max
-}
-
-func (x *exhaustive) Maybe() bool {
-	return x.Choose(2) == 1
-}
-
-func GCFunc(args []Value) []Value {
-	runtime.GC()
-	return []Value{}
-}
-
-func TestReflectFuncTraceback(t *testing.T) {
-	f := MakeFunc(TypeOf(func() {}), GCFunc)
-	f.Call([]Value{})
-}
-
-func TestReflectMethodTraceback(t *testing.T) {
-	p := Point{3, 4}
-	m := ValueOf(p).MethodByName("GCMethod")
-	i := ValueOf(m.Interface()).Call([]Value{ValueOf(5)})[0].Int()
-	if i != 8 {
-		t.Errorf("Call returned %d; want 8", i)
-	}
-}
-
-func TestBigZero(t *testing.T) {
-	const size = 1 << 10
-	var v [size]byte
-	z := Zero(ValueOf(v).Type()).Interface().([size]byte)
-	for i := 0; i < size; i++ {
-		if z[i] != 0 {
-			t.Fatalf("Zero object not all zero, index %d", i)
-		}
-	}
-}
-
-func TestFieldByIndexNil(t *testing.T) {
-	type P struct {
-		F int
-	}
-	type T struct {
-		*P
-	}
-	v := ValueOf(T{})
-
-	v.FieldByName("P") // should be fine
-
-	defer func() {
-		if err := recover(); err == nil {
-			t.Fatalf("no error")
-		} else if !strings.Contains(fmt.Sprint(err), "nil pointer to embedded struct") {
-			t.Fatalf(`err=%q, wanted error containing "nil pointer to embedded struct"`, err)
-		}
-	}()
-	v.FieldByName("F") // should panic
-
-	t.Fatalf("did not panic")
-}
-
-// Given
-//	type Outer struct {
-//		*Inner
-//		...
-//	}
-// the compiler generates the implementation of (*Outer).M dispatching to the embedded Inner.
-// The implementation is logically:
-//	func (p *Outer) M() {
-//		(p.Inner).M()
-//	}
-// but since the only change here is the replacement of one pointer receiver with another,
-// the actual generated code overwrites the original receiver with the p.Inner pointer and
-// then jumps to the M method expecting the *Inner receiver.
-//
-// During reflect.Value.Call, we create an argument frame and the associated data structures
-// to describe it to the garbage collector, populate the frame, call reflect.call to
-// run a function call using that frame, and then copy the results back out of the frame.
-// The reflect.call function does a memmove of the frame structure onto the
-// stack (to set up the inputs), runs the call, and the memmoves the stack back to
-// the frame structure (to preserve the outputs).
-//
-// Originally reflect.call did not distinguish inputs from outputs: both memmoves
-// were for the full stack frame. However, in the case where the called function was
-// one of these wrappers, the rewritten receiver is almost certainly a different type
-// than the original receiver. This is not a problem on the stack, where we use the
-// program counter to determine the type information and understand that
-// during (*Outer).M the receiver is an *Outer while during (*Inner).M the receiver in the same
-// memory word is now an *Inner. But in the statically typed argument frame created
-// by reflect, the receiver is always an *Outer. Copying the modified receiver pointer
-// off the stack into the frame will store an *Inner there, and then if a garbage collection
-// happens to scan that argument frame before it is discarded, it will scan the *Inner
-// memory as if it were an *Outer. If the two have different memory layouts, the
-// collection will intepret the memory incorrectly.
-//
-// One such possible incorrect interpretation is to treat two arbitrary memory words
-// (Inner.P1 and Inner.P2 below) as an interface (Outer.R below). Because interpreting
-// an interface requires dereferencing the itab word, the misinterpretation will try to
-// deference Inner.P1, causing a crash during garbage collection.
-//
-// This came up in a real program in issue 7725.
-
-type Outer struct {
-	*Inner
-	R io.Reader
-}
-
-type Inner struct {
-	X  *Outer
-	P1 uintptr
-	P2 uintptr
-}
-
-func (pi *Inner) M() {
-	// Clear references to pi so that the only way the
-	// garbage collection will find the pointer is in the
-	// argument frame, typed as a *Outer.
-	pi.X.Inner = nil
-
-	// Set up an interface value that will cause a crash.
-	// P1 = 1 is a non-zero, so the interface looks non-nil.
-	// P2 = pi ensures that the data word points into the
-	// allocated heap; if not the collection skips the interface
-	// value as irrelevant, without dereferencing P1.
-	pi.P1 = 1
-	pi.P2 = uintptr(unsafe.Pointer(pi))
-}
-
-func TestCallMethodJump(t *testing.T) {
-	// In reflect.Value.Call, trigger a garbage collection after reflect.call
-	// returns but before the args frame has been discarded.
-	// This is a little clumsy but makes the failure repeatable.
-	*CallGC = true
-
-	p := &Outer{Inner: new(Inner)}
-	p.Inner.X = p
-	ValueOf(p).Method(0).Call(nil)
-
-	// Stop garbage collecting during reflect.call.
-	*CallGC = false
-}
-
-func TestMakeFuncStackCopy(t *testing.T) {
-	target := func(in []Value) []Value {
-		runtime.GC()
-		useStack(16)
-		return []Value{ValueOf(9)}
-	}
-
-	var concrete func(*int, int) int
-	fn := MakeFunc(ValueOf(concrete).Type(), target)
-	ValueOf(&concrete).Elem().Set(fn)
-	x := concrete(nil, 7)
-	if x != 9 {
-		t.Errorf("have %#q want 9", x)
-	}
-}
-
-// use about n KB of stack
-func useStack(n int) {
-	if n == 0 {
-		return
-	}
-	var b [1024]byte // makes frame about 1KB
-	useStack(n - 1 + int(b[99]))
-}
-
-type Impl struct{}
-
-func (Impl) f() {}
-
-func TestValueString(t *testing.T) {
-	rv := ValueOf(Impl{})
-	if rv.String() != "<reflect_test.Impl Value>" {
-		t.Errorf("ValueOf(Impl{}).String() = %q, want %q", rv.String(), "<reflect_test.Impl Value>")
-	}
-
-	method := rv.Method(0)
-	if method.String() != "<func() Value>" {
-		t.Errorf("ValueOf(Impl{}).Method(0).String() = %q, want %q", method.String(), "<func() Value>")
-	}
-}
-
-func TestInvalid(t *testing.T) {
-	// Used to have inconsistency between IsValid() and Kind() != Invalid.
-	type T struct{ v interface{} }
-
-	v := ValueOf(T{}).Field(0)
-	if v.IsValid() != true || v.Kind() != Interface {
-		t.Errorf("field: IsValid=%v, Kind=%v, want true, Interface", v.IsValid(), v.Kind())
-	}
-	v = v.Elem()
-	if v.IsValid() != false || v.Kind() != Invalid {
-		t.Errorf("field elem: IsValid=%v, Kind=%v, want false, Invalid", v.IsValid(), v.Kind())
-	}
-}
-
-// Issue 8917.
-func TestLargeGCProg(t *testing.T) {
-	fv := ValueOf(func([256]*byte) {})
-	fv.Call([]Value{ValueOf([256]*byte{})})
-}
-
-// Issue 9179.
-func TestCallGC(t *testing.T) {
-	f := func(a, b, c, d, e string) {
-	}
-	g := func(in []Value) []Value {
-		runtime.GC()
-		return nil
-	}
-	typ := ValueOf(f).Type()
-	f2 := MakeFunc(typ, g).Interface().(func(string, string, string, string, string))
-	f2("four", "five5", "six666", "seven77", "eight888")
-}
-
-type funcLayoutTest struct {
-	rcvr, t                  Type
-	size, argsize, retOffset uintptr
-	stack                    []byte // pointer bitmap: 1 is pointer, 0 is scalar (or uninitialized)
-	gc                       []byte
-}
-
-var funcLayoutTests []funcLayoutTest
-
-func init() {
-	var argAlign uintptr = PtrSize
-	if runtime.GOARCH == "amd64p32" {
-		argAlign = 2 * PtrSize
-	}
-	roundup := func(x uintptr, a uintptr) uintptr {
-		return (x + a - 1) / a * a
-	}
-
-	funcLayoutTests = append(funcLayoutTests,
-		funcLayoutTest{
-			nil,
-			ValueOf(func(a, b string) string { return "" }).Type(),
-			6 * PtrSize,
-			4 * PtrSize,
-			4 * PtrSize,
-			[]byte{1, 0, 1},
-			[]byte{1, 0, 1, 0, 1},
-		})
-
-	var r []byte
-	if PtrSize == 4 {
-		r = []byte{0, 0, 0, 1}
-	} else {
-		r = []byte{0, 0, 1}
-	}
-	funcLayoutTests = append(funcLayoutTests,
-		funcLayoutTest{
-			nil,
-			ValueOf(func(a, b, c uint32, p *byte, d uint16) {}).Type(),
-			roundup(roundup(3*4, PtrSize)+PtrSize+2, argAlign),
-			roundup(3*4, PtrSize) + PtrSize + 2,
-			roundup(roundup(3*4, PtrSize)+PtrSize+2, argAlign),
-			r,
-			r,
-		})
-
-	funcLayoutTests = append(funcLayoutTests,
-		funcLayoutTest{
-			nil,
-			ValueOf(func(a map[int]int, b uintptr, c interface{}) {}).Type(),
-			4 * PtrSize,
-			4 * PtrSize,
-			4 * PtrSize,
-			[]byte{1, 0, 1, 1},
-			[]byte{1, 0, 1, 1},
-		})
-
-	type S struct {
-		a, b uintptr
-		c, d *byte
-	}
-	funcLayoutTests = append(funcLayoutTests,
-		funcLayoutTest{
-			nil,
-			ValueOf(func(a S) {}).Type(),
-			4 * PtrSize,
-			4 * PtrSize,
-			4 * PtrSize,
-			[]byte{0, 0, 1, 1},
-			[]byte{0, 0, 1, 1},
-		})
-
-	funcLayoutTests = append(funcLayoutTests,
-		funcLayoutTest{
-			ValueOf((*byte)(nil)).Type(),
-			ValueOf(func(a uintptr, b *int) {}).Type(),
-			roundup(3*PtrSize, argAlign),
-			3 * PtrSize,
-			roundup(3*PtrSize, argAlign),
-			[]byte{1, 0, 1},
-			[]byte{1, 0, 1},
-		})
-
-	funcLayoutTests = append(funcLayoutTests,
-		funcLayoutTest{
-			nil,
-			ValueOf(func(a uintptr) {}).Type(),
-			roundup(PtrSize, argAlign),
-			PtrSize,
-			roundup(PtrSize, argAlign),
-			[]byte{},
-			[]byte{},
-		})
-
-	funcLayoutTests = append(funcLayoutTests,
-		funcLayoutTest{
-			nil,
-			ValueOf(func() uintptr { return 0 }).Type(),
-			PtrSize,
-			0,
-			0,
-			[]byte{},
-			[]byte{},
-		})
-
-	funcLayoutTests = append(funcLayoutTests,
-		funcLayoutTest{
-			ValueOf(uintptr(0)).Type(),
-			ValueOf(func(a uintptr) {}).Type(),
-			2 * PtrSize,
-			2 * PtrSize,
-			2 * PtrSize,
-			[]byte{1},
-			[]byte{1},
-			// Note: this one is tricky, as the receiver is not a pointer.  But we
-			// pass the receiver by reference to the autogenerated pointer-receiver
-			// version of the function.
-		})
-}
-
-func TestFuncLayout(t *testing.T) {
-	t.Skip("gccgo does not use funcLayout")
-	for _, lt := range funcLayoutTests {
-		typ, argsize, retOffset, stack, gc, ptrs := FuncLayout(lt.t, lt.rcvr)
-		if typ.Size() != lt.size {
-			t.Errorf("funcLayout(%v, %v).size=%d, want %d", lt.t, lt.rcvr, typ.Size(), lt.size)
-		}
-		if argsize != lt.argsize {
-			t.Errorf("funcLayout(%v, %v).argsize=%d, want %d", lt.t, lt.rcvr, argsize, lt.argsize)
-		}
-		if retOffset != lt.retOffset {
-			t.Errorf("funcLayout(%v, %v).retOffset=%d, want %d", lt.t, lt.rcvr, retOffset, lt.retOffset)
-		}
-		if !bytes.Equal(stack, lt.stack) {
-			t.Errorf("funcLayout(%v, %v).stack=%v, want %v", lt.t, lt.rcvr, stack, lt.stack)
-		}
-		if !bytes.Equal(gc, lt.gc) {
-			t.Errorf("funcLayout(%v, %v).gc=%v, want %v", lt.t, lt.rcvr, gc, lt.gc)
-		}
-		if ptrs && len(stack) == 0 || !ptrs && len(stack) > 0 {
-			t.Errorf("funcLayout(%v, %v) pointers flag=%v, want %v", lt.t, lt.rcvr, ptrs, !ptrs)
-		}
-	}
-}
-
-func verifyGCBits(t *testing.T, typ Type, bits []byte) {
-	heapBits := GCBits(New(typ).Interface())
-	if !bytes.Equal(heapBits, bits) {
-		t.Errorf("heapBits incorrect for %v\nhave %v\nwant %v", typ, heapBits, bits)
-	}
-}
-
-func verifyGCBitsSlice(t *testing.T, typ Type, cap int, bits []byte) {
-	// Creating a slice causes the runtime to repeat a bitmap,
-	// which exercises a different path from making the compiler
-	// repeat a bitmap for a small array or executing a repeat in
-	// a GC program.
-	val := MakeSlice(typ, 0, cap)
-	data := NewAt(ArrayOf(cap, typ), unsafe.Pointer(val.Pointer()))
-	heapBits := GCBits(data.Interface())
-	// Repeat the bitmap for the slice size, trimming scalars in
-	// the last element.
-	bits = rep(cap, bits)
-	for len(bits) > 2 && bits[len(bits)-1] == 0 {
-		bits = bits[:len(bits)-1]
-	}
-	if !bytes.Equal(heapBits, bits) {
-		t.Errorf("heapBits incorrect for make(%v, 0, %v)\nhave %v\nwant %v", typ, cap, heapBits, bits)
-	}
-}
-
-func TestGCBits(t *testing.T) {
-	t.Skip("gccgo does not use gcbits yet")
-
-	verifyGCBits(t, TypeOf((*byte)(nil)), []byte{1})
-
-	// Building blocks for types seen by the compiler (like [2]Xscalar).
-	// The compiler will create the type structures for the derived types,
-	// including their GC metadata.
-	type Xscalar struct{ x uintptr }
-	type Xptr struct{ x *byte }
-	type Xptrscalar struct {
-		*byte
-		uintptr
-	}
-	type Xscalarptr struct {
-		uintptr
-		*byte
-	}
-	type Xbigptrscalar struct {
-		_ [100]*byte
-		_ [100]uintptr
-	}
-
-	var Tscalar, Tint64, Tptr, Tscalarptr, Tptrscalar, Tbigptrscalar Type
-	{
-		// Building blocks for types constructed by reflect.
-		// This code is in a separate block so that code below
-		// cannot accidentally refer to these.
-		// The compiler must NOT see types derived from these
-		// (for example, [2]Scalar must NOT appear in the program),
-		// or else reflect will use it instead of having to construct one.
-		// The goal is to test the construction.
-		type Scalar struct{ x uintptr }
-		type Ptr struct{ x *byte }
-		type Ptrscalar struct {
-			*byte
-			uintptr
-		}
-		type Scalarptr struct {
-			uintptr
-			*byte
-		}
-		type Bigptrscalar struct {
-			_ [100]*byte
-			_ [100]uintptr
-		}
-		type Int64 int64
-		Tscalar = TypeOf(Scalar{})
-		Tint64 = TypeOf(Int64(0))
-		Tptr = TypeOf(Ptr{})
-		Tscalarptr = TypeOf(Scalarptr{})
-		Tptrscalar = TypeOf(Ptrscalar{})
-		Tbigptrscalar = TypeOf(Bigptrscalar{})
-	}
-
-	empty := []byte{}
-
-	verifyGCBits(t, TypeOf(Xscalar{}), empty)
-	verifyGCBits(t, Tscalar, empty)
-	verifyGCBits(t, TypeOf(Xptr{}), lit(1))
-	verifyGCBits(t, Tptr, lit(1))
-	verifyGCBits(t, TypeOf(Xscalarptr{}), lit(0, 1))
-	verifyGCBits(t, Tscalarptr, lit(0, 1))
-	verifyGCBits(t, TypeOf(Xptrscalar{}), lit(1))
-	verifyGCBits(t, Tptrscalar, lit(1))
-
-	verifyGCBits(t, TypeOf([0]Xptr{}), empty)
-	verifyGCBits(t, ArrayOf(0, Tptr), empty)
-	verifyGCBits(t, TypeOf([1]Xptrscalar{}), lit(1))
-	verifyGCBits(t, ArrayOf(1, Tptrscalar), lit(1))
-	verifyGCBits(t, TypeOf([2]Xscalar{}), empty)
-	verifyGCBits(t, ArrayOf(2, Tscalar), empty)
-	verifyGCBits(t, TypeOf([10000]Xscalar{}), empty)
-	verifyGCBits(t, ArrayOf(10000, Tscalar), empty)
-	verifyGCBits(t, TypeOf([2]Xptr{}), lit(1, 1))
-	verifyGCBits(t, ArrayOf(2, Tptr), lit(1, 1))
-	verifyGCBits(t, TypeOf([10000]Xptr{}), rep(10000, lit(1)))
-	verifyGCBits(t, ArrayOf(10000, Tptr), rep(10000, lit(1)))
-	verifyGCBits(t, TypeOf([2]Xscalarptr{}), lit(0, 1, 0, 1))
-	verifyGCBits(t, ArrayOf(2, Tscalarptr), lit(0, 1, 0, 1))
-	verifyGCBits(t, TypeOf([10000]Xscalarptr{}), rep(10000, lit(0, 1)))
-	verifyGCBits(t, ArrayOf(10000, Tscalarptr), rep(10000, lit(0, 1)))
-	verifyGCBits(t, TypeOf([2]Xptrscalar{}), lit(1, 0, 1))
-	verifyGCBits(t, ArrayOf(2, Tptrscalar), lit(1, 0, 1))
-	verifyGCBits(t, TypeOf([10000]Xptrscalar{}), rep(10000, lit(1, 0)))
-	verifyGCBits(t, ArrayOf(10000, Tptrscalar), rep(10000, lit(1, 0)))
-	verifyGCBits(t, TypeOf([1][10000]Xptrscalar{}), rep(10000, lit(1, 0)))
-	verifyGCBits(t, ArrayOf(1, ArrayOf(10000, Tptrscalar)), rep(10000, lit(1, 0)))
-	verifyGCBits(t, TypeOf([2][10000]Xptrscalar{}), rep(2*10000, lit(1, 0)))
-	verifyGCBits(t, ArrayOf(2, ArrayOf(10000, Tptrscalar)), rep(2*10000, lit(1, 0)))
-	verifyGCBits(t, TypeOf([4]Xbigptrscalar{}), join(rep(3, join(rep(100, lit(1)), rep(100, lit(0)))), rep(100, lit(1))))
-	verifyGCBits(t, ArrayOf(4, Tbigptrscalar), join(rep(3, join(rep(100, lit(1)), rep(100, lit(0)))), rep(100, lit(1))))
-
-	verifyGCBitsSlice(t, TypeOf([]Xptr{}), 0, empty)
-	verifyGCBitsSlice(t, SliceOf(Tptr), 0, empty)
-	verifyGCBitsSlice(t, TypeOf([]Xptrscalar{}), 1, lit(1))
-	verifyGCBitsSlice(t, SliceOf(Tptrscalar), 1, lit(1))
-	verifyGCBitsSlice(t, TypeOf([]Xscalar{}), 2, lit(0))
-	verifyGCBitsSlice(t, SliceOf(Tscalar), 2, lit(0))
-	verifyGCBitsSlice(t, TypeOf([]Xscalar{}), 10000, lit(0))
-	verifyGCBitsSlice(t, SliceOf(Tscalar), 10000, lit(0))
-	verifyGCBitsSlice(t, TypeOf([]Xptr{}), 2, lit(1))
-	verifyGCBitsSlice(t, SliceOf(Tptr), 2, lit(1))
-	verifyGCBitsSlice(t, TypeOf([]Xptr{}), 10000, lit(1))
-	verifyGCBitsSlice(t, SliceOf(Tptr), 10000, lit(1))
-	verifyGCBitsSlice(t, TypeOf([]Xscalarptr{}), 2, lit(0, 1))
-	verifyGCBitsSlice(t, SliceOf(Tscalarptr), 2, lit(0, 1))
-	verifyGCBitsSlice(t, TypeOf([]Xscalarptr{}), 10000, lit(0, 1))
-	verifyGCBitsSlice(t, SliceOf(Tscalarptr), 10000, lit(0, 1))
-	verifyGCBitsSlice(t, TypeOf([]Xptrscalar{}), 2, lit(1, 0))
-	verifyGCBitsSlice(t, SliceOf(Tptrscalar), 2, lit(1, 0))
-	verifyGCBitsSlice(t, TypeOf([]Xptrscalar{}), 10000, lit(1, 0))
-	verifyGCBitsSlice(t, SliceOf(Tptrscalar), 10000, lit(1, 0))
-	verifyGCBitsSlice(t, TypeOf([][10000]Xptrscalar{}), 1, rep(10000, lit(1, 0)))
-	verifyGCBitsSlice(t, SliceOf(ArrayOf(10000, Tptrscalar)), 1, rep(10000, lit(1, 0)))
-	verifyGCBitsSlice(t, TypeOf([][10000]Xptrscalar{}), 2, rep(10000, lit(1, 0)))
-	verifyGCBitsSlice(t, SliceOf(ArrayOf(10000, Tptrscalar)), 2, rep(10000, lit(1, 0)))
-	verifyGCBitsSlice(t, TypeOf([]Xbigptrscalar{}), 4, join(rep(100, lit(1)), rep(100, lit(0))))
-	verifyGCBitsSlice(t, SliceOf(Tbigptrscalar), 4, join(rep(100, lit(1)), rep(100, lit(0))))
-
-	verifyGCBits(t, TypeOf((chan [100]Xscalar)(nil)), lit(1))
-	verifyGCBits(t, ChanOf(BothDir, ArrayOf(100, Tscalar)), lit(1))
-
-	verifyGCBits(t, TypeOf((func([10000]Xscalarptr))(nil)), lit(1))
-	verifyGCBits(t, FuncOf([]Type{ArrayOf(10000, Tscalarptr)}, nil, false), lit(1))
-
-	verifyGCBits(t, TypeOf((map[[10000]Xscalarptr]Xscalar)(nil)), lit(1))
-	verifyGCBits(t, MapOf(ArrayOf(10000, Tscalarptr), Tscalar), lit(1))
-
-	verifyGCBits(t, TypeOf((*[10000]Xscalar)(nil)), lit(1))
-	verifyGCBits(t, PtrTo(ArrayOf(10000, Tscalar)), lit(1))
-
-	verifyGCBits(t, TypeOf(([][10000]Xscalar)(nil)), lit(1))
-	verifyGCBits(t, SliceOf(ArrayOf(10000, Tscalar)), lit(1))
-
-	hdr := make([]byte, 8/PtrSize)
-
-	verifyMapBucket := func(t *testing.T, k, e Type, m interface{}, want []byte) {
-		verifyGCBits(t, MapBucketOf(k, e), want)
-		verifyGCBits(t, CachedBucketOf(TypeOf(m)), want)
-	}
-	verifyMapBucket(t,
-		Tscalar, Tptr,
-		map[Xscalar]Xptr(nil),
-		join(hdr, rep(8, lit(0)), rep(8, lit(1)), lit(1)))
-	verifyMapBucket(t,
-		Tscalarptr, Tptr,
-		map[Xscalarptr]Xptr(nil),
-		join(hdr, rep(8, lit(0, 1)), rep(8, lit(1)), lit(1)))
-	verifyMapBucket(t, Tint64, Tptr,
-		map[int64]Xptr(nil),
-		join(hdr, rep(8, rep(8/PtrSize, lit(0))), rep(8, lit(1)), naclpad(), lit(1)))
-	verifyMapBucket(t,
-		Tscalar, Tscalar,
-		map[Xscalar]Xscalar(nil),
-		empty)
-	verifyMapBucket(t,
-		ArrayOf(2, Tscalarptr), ArrayOf(3, Tptrscalar),
-		map[[2]Xscalarptr][3]Xptrscalar(nil),
-		join(hdr, rep(8*2, lit(0, 1)), rep(8*3, lit(1, 0)), lit(1)))
-	verifyMapBucket(t,
-		ArrayOf(64/PtrSize, Tscalarptr), ArrayOf(64/PtrSize, Tptrscalar),
-		map[[64 / PtrSize]Xscalarptr][64 / PtrSize]Xptrscalar(nil),
-		join(hdr, rep(8*64/PtrSize, lit(0, 1)), rep(8*64/PtrSize, lit(1, 0)), lit(1)))
-	verifyMapBucket(t,
-		ArrayOf(64/PtrSize+1, Tscalarptr), ArrayOf(64/PtrSize, Tptrscalar),
-		map[[64/PtrSize + 1]Xscalarptr][64 / PtrSize]Xptrscalar(nil),
-		join(hdr, rep(8, lit(1)), rep(8*64/PtrSize, lit(1, 0)), lit(1)))
-	verifyMapBucket(t,
-		ArrayOf(64/PtrSize, Tscalarptr), ArrayOf(64/PtrSize+1, Tptrscalar),
-		map[[64 / PtrSize]Xscalarptr][64/PtrSize + 1]Xptrscalar(nil),
-		join(hdr, rep(8*64/PtrSize, lit(0, 1)), rep(8, lit(1)), lit(1)))
-	verifyMapBucket(t,
-		ArrayOf(64/PtrSize+1, Tscalarptr), ArrayOf(64/PtrSize+1, Tptrscalar),
-		map[[64/PtrSize + 1]Xscalarptr][64/PtrSize + 1]Xptrscalar(nil),
-		join(hdr, rep(8, lit(1)), rep(8, lit(1)), lit(1)))
-}
-
-func naclpad() []byte {
-	if runtime.GOARCH == "amd64p32" {
-		return lit(0)
-	}
-	return nil
-}
-
-func rep(n int, b []byte) []byte { return bytes.Repeat(b, n) }
-func join(b ...[]byte) []byte    { return bytes.Join(b, nil) }
-func lit(x ...byte) []byte       { return x }
-
-func TestTypeOfTypeOf(t *testing.T) {
-	// Check that all the type constructors return concrete *rtype implementations.
-	// It's difficult to test directly because the reflect package is only at arm's length.
-	// The easiest thing to do is just call a function that crashes if it doesn't get an *rtype.
-	check := func(name string, typ Type) {
-		if underlying := TypeOf(typ).String(); underlying != "*reflect.rtype" {
-			t.Errorf("%v returned %v, not *reflect.rtype", name, underlying)
-		}
-	}
-
-	type T struct{ int }
-	check("TypeOf", TypeOf(T{}))
-
-	check("ArrayOf", ArrayOf(10, TypeOf(T{})))
-	check("ChanOf", ChanOf(BothDir, TypeOf(T{})))
-	check("FuncOf", FuncOf([]Type{TypeOf(T{})}, nil, false))
-	check("MapOf", MapOf(TypeOf(T{}), TypeOf(T{})))
-	check("PtrTo", PtrTo(TypeOf(T{})))
-	check("SliceOf", SliceOf(TypeOf(T{})))
-}
-
-type XM struct{}
-
-func (*XM) String() string { return "" }
-
-func TestPtrToMethods(t *testing.T) {
-	var y struct{ XM }
-	yp := New(TypeOf(y)).Interface()
-	_, ok := yp.(fmt.Stringer)
-	if !ok {
-		t.Fatal("does not implement Stringer, but should")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/reflect/deepequal.go b/third_party/gofrontend/libgo/go/reflect/deepequal.go
deleted file mode 100644
index f63715c..0000000
--- a/third_party/gofrontend/libgo/go/reflect/deepequal.go
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Deep equality test via reflection
-
-package reflect
-
-// During deepValueEqual, must keep track of checks that are
-// in progress.  The comparison algorithm assumes that all
-// checks in progress are true when it reencounters them.
-// Visited comparisons are stored in a map indexed by visit.
-type visit struct {
-	a1  uintptr
-	a2  uintptr
-	typ Type
-}
-
-// Tests for deep equality using reflected types. The map argument tracks
-// comparisons that have already been seen, which allows short circuiting on
-// recursive types.
-func deepValueEqual(v1, v2 Value, visited map[visit]bool, depth int) bool {
-	if !v1.IsValid() || !v2.IsValid() {
-		return v1.IsValid() == v2.IsValid()
-	}
-	if v1.Type() != v2.Type() {
-		return false
-	}
-
-	// if depth > 10 { panic("deepValueEqual") }	// for debugging
-	hard := func(k Kind) bool {
-		switch k {
-		case Array, Map, Slice, Struct:
-			return true
-		}
-		return false
-	}
-
-	if v1.CanAddr() && v2.CanAddr() && hard(v1.Kind()) {
-		addr1 := v1.UnsafeAddr()
-		addr2 := v2.UnsafeAddr()
-		if addr1 > addr2 {
-			// Canonicalize order to reduce number of entries in visited.
-			addr1, addr2 = addr2, addr1
-		}
-
-		// Short circuit if references are identical ...
-		if addr1 == addr2 {
-			return true
-		}
-
-		// ... or already seen
-		typ := v1.Type()
-		v := visit{addr1, addr2, typ}
-		if visited[v] {
-			return true
-		}
-
-		// Remember for later.
-		visited[v] = true
-	}
-
-	switch v1.Kind() {
-	case Array:
-		for i := 0; i < v1.Len(); i++ {
-			if !deepValueEqual(v1.Index(i), v2.Index(i), visited, depth+1) {
-				return false
-			}
-		}
-		return true
-	case Slice:
-		if v1.IsNil() != v2.IsNil() {
-			return false
-		}
-		if v1.Len() != v2.Len() {
-			return false
-		}
-		if v1.Pointer() == v2.Pointer() {
-			return true
-		}
-		for i := 0; i < v1.Len(); i++ {
-			if !deepValueEqual(v1.Index(i), v2.Index(i), visited, depth+1) {
-				return false
-			}
-		}
-		return true
-	case Interface:
-		if v1.IsNil() || v2.IsNil() {
-			return v1.IsNil() == v2.IsNil()
-		}
-		return deepValueEqual(v1.Elem(), v2.Elem(), visited, depth+1)
-	case Ptr:
-		return deepValueEqual(v1.Elem(), v2.Elem(), visited, depth+1)
-	case Struct:
-		for i, n := 0, v1.NumField(); i < n; i++ {
-			if !deepValueEqual(v1.Field(i), v2.Field(i), visited, depth+1) {
-				return false
-			}
-		}
-		return true
-	case Map:
-		if v1.IsNil() != v2.IsNil() {
-			return false
-		}
-		if v1.Len() != v2.Len() {
-			return false
-		}
-		if v1.Pointer() == v2.Pointer() {
-			return true
-		}
-		for _, k := range v1.MapKeys() {
-			if !deepValueEqual(v1.MapIndex(k), v2.MapIndex(k), visited, depth+1) {
-				return false
-			}
-		}
-		return true
-	case Func:
-		if v1.IsNil() && v2.IsNil() {
-			return true
-		}
-		// Can't do better than this:
-		return false
-	default:
-		// Normal equality suffices
-		return valueInterface(v1, false) == valueInterface(v2, false)
-	}
-}
-
-// DeepEqual tests for deep equality. It uses normal == equality where
-// possible but will scan elements of arrays, slices, maps, and fields of
-// structs. In maps, keys are compared with == but elements use deep
-// equality. DeepEqual correctly handles recursive types. Functions are equal
-// only if they are both nil.
-// An empty slice is not equal to a nil slice.
-func DeepEqual(a1, a2 interface{}) bool {
-	if a1 == nil || a2 == nil {
-		return a1 == a2
-	}
-	v1 := ValueOf(a1)
-	v2 := ValueOf(a2)
-	if v1.Type() != v2.Type() {
-		return false
-	}
-	return deepValueEqual(v1, v2, make(map[visit]bool), 0)
-}
diff --git a/third_party/gofrontend/libgo/go/reflect/example_test.go b/third_party/gofrontend/libgo/go/reflect/example_test.go
deleted file mode 100644
index 8ebf976..0000000
--- a/third_party/gofrontend/libgo/go/reflect/example_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package reflect_test
-
-import (
-	"fmt"
-	"io"
-	"os"
-	"reflect"
-)
-
-func ExampleMakeFunc() {
-	// swap is the implementation passed to MakeFunc.
-	// It must work in terms of reflect.Values so that it is possible
-	// to write code without knowing beforehand what the types
-	// will be.
-	swap := func(in []reflect.Value) []reflect.Value {
-		return []reflect.Value{in[1], in[0]}
-	}
-
-	// makeSwap expects fptr to be a pointer to a nil function.
-	// It sets that pointer to a new function created with MakeFunc.
-	// When the function is invoked, reflect turns the arguments
-	// into Values, calls swap, and then turns swap's result slice
-	// into the values returned by the new function.
-	makeSwap := func(fptr interface{}) {
-		// fptr is a pointer to a function.
-		// Obtain the function value itself (likely nil) as a reflect.Value
-		// so that we can query its type and then set the value.
-		fn := reflect.ValueOf(fptr).Elem()
-
-		// Make a function of the right type.
-		v := reflect.MakeFunc(fn.Type(), swap)
-
-		// Assign it to the value fn represents.
-		fn.Set(v)
-	}
-
-	// Make and call a swap function for ints.
-	var intSwap func(int, int) (int, int)
-	makeSwap(&intSwap)
-	fmt.Println(intSwap(0, 1))
-
-	// Make and call a swap function for float64s.
-	var floatSwap func(float64, float64) (float64, float64)
-	makeSwap(&floatSwap)
-	fmt.Println(floatSwap(2.72, 3.14))
-
-	// Output:
-	// 1 0
-	// 3.14 2.72
-}
-
-func ExampleStructTag() {
-	type S struct {
-		F string `species:"gopher" color:"blue"`
-	}
-
-	s := S{}
-	st := reflect.TypeOf(s)
-	field := st.Field(0)
-	fmt.Println(field.Tag.Get("color"), field.Tag.Get("species"))
-
-	// Output:
-	// blue gopher
-}
-
-func ExampleTypeOf() {
-	// As interface types are only used for static typing, a
-	// common idiom to find the reflection Type for an interface
-	// type Foo is to use a *Foo value.
-	writerType := reflect.TypeOf((*io.Writer)(nil)).Elem()
-
-	fileType := reflect.TypeOf((*os.File)(nil))
-	fmt.Println(fileType.Implements(writerType))
-
-	// Output:
-	// true
-}
diff --git a/third_party/gofrontend/libgo/go/reflect/export_test.go b/third_party/gofrontend/libgo/go/reflect/export_test.go
deleted file mode 100644
index bdbd600..0000000
--- a/third_party/gofrontend/libgo/go/reflect/export_test.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package reflect
-
-// MakeRO returns a copy of v with the read-only flag set.
-func MakeRO(v Value) Value {
-	v.flag |= flagStickyRO
-	return v
-}
-
-// IsRO reports whether v's read-only flag is set.
-func IsRO(v Value) bool {
-	return v.flag&flagStickyRO != 0
-}
-
-var CallGC = &callGC
-
-const PtrSize = ptrSize
-
-func FuncLayout(t Type, rcvr Type) (frametype Type, argSize, retOffset uintptr, stack []byte, gc []byte, ptrs bool) {
-	return
-}
-
-func TypeLinks() []string {
-	return nil
-}
-
-var GCBits = gcbits
-
-// Will be provided by runtime eventually.
-func gcbits(interface{}) []byte {
-	return nil
-}
-
-func MapBucketOf(x, y Type) Type {
-	return nil
-}
-
-func CachedBucketOf(m Type) Type {
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/reflect/makefunc.go b/third_party/gofrontend/libgo/go/reflect/makefunc.go
deleted file mode 100644
index 7ec277b..0000000
--- a/third_party/gofrontend/libgo/go/reflect/makefunc.go
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// MakeFunc implementation.
-
-package reflect
-
-import (
-	"unsafe"
-)
-
-// makeFuncImpl is the closure value implementing the function
-// returned by MakeFunc.
-type makeFuncImpl struct {
-	// These first three words are layed out like ffi_go_closure.
-	code    uintptr
-	ffi_cif unsafe.Pointer
-	ffi_fun func(unsafe.Pointer, unsafe.Pointer)
-
-	typ *funcType
-	fn  func([]Value) []Value
-
-	// For gccgo we use the same entry point for functions and for
-	// method values.
-	method int
-	rcvr   Value
-}
-
-// MakeFunc returns a new function of the given Type
-// that wraps the function fn. When called, that new function
-// does the following:
-//
-//	- converts its arguments to a slice of Values.
-//	- runs results := fn(args).
-//	- returns the results as a slice of Values, one per formal result.
-//
-// The implementation fn can assume that the argument Value slice
-// has the number and type of arguments given by typ.
-// If typ describes a variadic function, the final Value is itself
-// a slice representing the variadic arguments, as in the
-// body of a variadic function. The result Value slice returned by fn
-// must have the number and type of results given by typ.
-//
-// The Value.Call method allows the caller to invoke a typed function
-// in terms of Values; in contrast, MakeFunc allows the caller to implement
-// a typed function in terms of Values.
-//
-// The Examples section of the documentation includes an illustration
-// of how to use MakeFunc to build a swap function for different types.
-//
-func MakeFunc(typ Type, fn func(args []Value) (results []Value)) Value {
-	if typ.Kind() != Func {
-		panic("reflect: call of MakeFunc with non-Func type")
-	}
-
-	t := typ.common()
-	ftyp := (*funcType)(unsafe.Pointer(t))
-
-	impl := &makeFuncImpl{
-		typ:    ftyp,
-		fn:     fn,
-		method: -1,
-	}
-
-	makeFuncFFI(ftyp, unsafe.Pointer(impl))
-
-	return Value{t, unsafe.Pointer(&impl), flag(Func) | flagIndir}
-}
-
-// makeMethodValue converts v from the rcvr+method index representation
-// of a method value to an actual method func value, which is
-// basically the receiver value with a special bit set, into a true
-// func value - a value holding an actual func. The output is
-// semantically equivalent to the input as far as the user of package
-// reflect can tell, but the true func representation can be handled
-// by code like Convert and Interface and Assign.
-func makeMethodValue(op string, v Value) Value {
-	if v.flag&flagMethod == 0 {
-		panic("reflect: internal error: invalid use of makeMethodValue")
-	}
-
-	// Ignoring the flagMethod bit, v describes the receiver, not the method type.
-	fl := v.flag & (flagRO | flagAddr | flagIndir)
-	fl |= flag(v.typ.Kind())
-	rcvr := Value{v.typ, v.ptr, fl}
-
-	// v.Type returns the actual type of the method value.
-	ft := v.Type().(*rtype)
-
-	// Cause panic if method is not appropriate.
-	// The panic would still happen during the call if we omit this,
-	// but we want Interface() and other operations to fail early.
-	_, t, _ := methodReceiver(op, rcvr, int(v.flag)>>flagMethodShift)
-
-	ftyp := (*funcType)(unsafe.Pointer(t))
-	method := int(v.flag) >> flagMethodShift
-
-	fv := &makeFuncImpl{
-		typ:    ftyp,
-		method: method,
-		rcvr:   rcvr,
-	}
-
-	makeFuncFFI(ftyp, unsafe.Pointer(fv))
-
-	return Value{ft, unsafe.Pointer(&fv), v.flag&flagRO | flag(Func) | flagIndir}
-}
-
-// makeValueMethod takes a method function and returns a function that
-// takes a value receiver and calls the real method with a pointer to
-// it.
-func makeValueMethod(v Value) Value {
-	typ := v.typ
-	if typ.Kind() != Func {
-		panic("reflect: call of makeValueMethod with non-Func type")
-	}
-	if v.flag&flagMethodFn == 0 {
-		panic("reflect: call of makeValueMethod with non-MethodFn")
-	}
-
-	t := typ.common()
-	ftyp := (*funcType)(unsafe.Pointer(t))
-
-	impl := &makeFuncImpl{
-		typ:    ftyp,
-		method: -2,
-		rcvr:   v,
-	}
-
-	makeFuncFFI(ftyp, unsafe.Pointer(impl))
-
-	return Value{t, unsafe.Pointer(&impl), v.flag&flagRO | flag(Func) | flagIndir}
-}
-
-// Call the function represented by a makeFuncImpl.
-func (c *makeFuncImpl) call(in []Value) []Value {
-	if c.method == -1 {
-		return c.fn(in)
-	} else if c.method == -2 {
-		if c.typ.IsVariadic() {
-			return c.rcvr.CallSlice(in)
-		} else {
-			return c.rcvr.Call(in)
-		}
-	} else {
-		m := c.rcvr.Method(c.method)
-		if c.typ.IsVariadic() {
-			return m.CallSlice(in)
-		} else {
-			return m.Call(in)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/reflect/makefunc_ffi.go b/third_party/gofrontend/libgo/go/reflect/makefunc_ffi.go
deleted file mode 100644
index c821131..0000000
--- a/third_party/gofrontend/libgo/go/reflect/makefunc_ffi.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package reflect
-
-import (
-	"unsafe"
-)
-
-// The makeFuncFFI function, written in C, fills in an FFI closure.
-// It arranges for ffiCall to be invoked directly from FFI.
-func makeFuncFFI(ftyp *funcType, impl unsafe.Pointer)
-
-// FFICallbackGo implements the Go side of the libffi callback.
-// It is exported so that C code can call it.
-//
-// The call chain arriving here looks like
-//   some_go_caller
-//   ->some_ffi_internals
-//     ->ffi_callback (in C)
-//       ->FFICallbackGo
-//
-// The ffi_callback handles __go_makefunc_can_recover, and
-// then passes off the data as received from ffi here.
-
-func FFICallbackGo(results unsafe.Pointer, params unsafe.Pointer, impl *makeFuncImpl) {
-	ftyp := impl.typ
-	in := make([]Value, 0, len(ftyp.in))
-	ap := params
-	for _, rt := range ftyp.in {
-		p := unsafe_New(rt)
-		memmove(p, *(*unsafe.Pointer)(ap), rt.size)
-		v := Value{rt, p, flag(rt.Kind()) | flagIndir}
-		in = append(in, v)
-		ap = (unsafe.Pointer)(uintptr(ap) + ptrSize)
-	}
-
-	out := impl.call(in)
-
-	off := uintptr(0)
-	for i, typ := range ftyp.out {
-		v := out[i]
-		if v.typ != typ {
-			panic("reflect: function created by MakeFunc using " + funcName(impl.fn) +
-				" returned wrong type: have " +
-				out[i].typ.String() + " for " + typ.String())
-		}
-		if v.flag&flagRO != 0 {
-			panic("reflect: function created by MakeFunc using " + funcName(impl.fn) +
-				" returned value obtained from unexported field")
-		}
-
-		off = align(off, uintptr(typ.fieldAlign))
-		addr := unsafe.Pointer(uintptr(results) + off)
-		if v.flag&flagIndir == 0 && (v.kind() == Ptr || v.kind() == UnsafePointer) {
-			*(*unsafe.Pointer)(addr) = v.ptr
-		} else {
-			memmove(addr, v.ptr, typ.size)
-		}
-		off += typ.size
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/reflect/makefunc_ffi_c.c b/third_party/gofrontend/libgo/go/reflect/makefunc_ffi_c.c
deleted file mode 100644
index 06a41ef..0000000
--- a/third_party/gofrontend/libgo/go/reflect/makefunc_ffi_c.c
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "runtime.h"
-#include "go-type.h"
-#include "go-panic.h"
-
-#ifdef USE_LIBFFI
-
-#include "go-ffi.h"
-
-#if FFI_GO_CLOSURES
-#define USE_LIBFFI_CLOSURES
-#endif
-
-#endif /* defined(USE_LIBFFI) */
-
-/* Declare C functions with the names used to call from Go.  */
-
-void makeFuncFFI(const struct __go_func_type *ftyp, void *impl)
-  __asm__ (GOSYM_PREFIX "reflect.makeFuncFFI");
-
-#ifdef USE_LIBFFI_CLOSURES
-
-/* The function that we pass to ffi_prep_closure_loc.  This calls the Go
-   function ffiCall with the pointer to the arguments, the results area,
-   and the closure structure.  */
-
-void FFICallbackGo(void *result, void **args, ffi_go_closure *closure)
-  __asm__ (GOSYM_PREFIX "reflect.FFICallbackGo");
-
-static void ffi_callback (ffi_cif *, void *, void **, void *)
-  __asm__ ("reflect.ffi_callback");
-
-static void
-ffi_callback (ffi_cif* cif __attribute__ ((unused)), void *results,
-	      void **args, void *closure)
-{
-  Location locs[8];
-  int n;
-  int i;
-
-  /* This function is called from some series of FFI closure functions
-     called by a Go function.  We want to see whether the caller of
-     the closure functions can recover.  Look up the stack and skip
-     the FFI functions.  */
-  n = runtime_callers (1, &locs[0], sizeof locs / sizeof locs[0], true);
-  for (i = 0; i < n; i++)
-    {
-      const byte *name;
-
-      if (locs[i].function.len == 0)
-	continue;
-      if (locs[i].function.len < 4)
-	break;
-      name = locs[i].function.str;
-      if (name[0] != 'f' || name[1] != 'f' || name[2] != 'i' || name[3] != '_')
-	break;
-    }
-  if (i < n)
-    __go_makefunc_ffi_can_recover (locs + i, n - i);
-
-  FFICallbackGo(results, args, closure);
-
-  if (i < n)
-    __go_makefunc_returning ();
-}
-
-/* Allocate an FFI closure and arrange to call ffi_callback.  */
-
-void
-makeFuncFFI(const struct __go_func_type *ftyp, void *impl)
-{
-  ffi_cif *cif;
-
-  cif = (ffi_cif *) __go_alloc (sizeof (ffi_cif));
-  __go_func_to_cif (ftyp, 0, 0, cif);
-
-  ffi_prep_go_closure(impl, cif, ffi_callback);
-}
-
-#else /* !defined(USE_LIBFFI_CLOSURES) */
-
-void
-makeFuncFFI(const struct __go_func_type *ftyp __attribute__ ((unused)),
-	    void *impl __attribute__ ((unused)))
-{
-  runtime_panicstring ("libgo built without FFI does not support "
-		       "reflect.MakeFunc");
-}
-
-#endif
diff --git a/third_party/gofrontend/libgo/go/reflect/set_test.go b/third_party/gofrontend/libgo/go/reflect/set_test.go
deleted file mode 100644
index 85dc55e..0000000
--- a/third_party/gofrontend/libgo/go/reflect/set_test.go
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package reflect_test
-
-import (
-	"bytes"
-	"go/ast"
-	"io"
-	. "reflect"
-	"testing"
-	"unsafe"
-)
-
-type MyBuffer bytes.Buffer
-
-func TestImplicitMapConversion(t *testing.T) {
-	// Test implicit conversions in MapIndex and SetMapIndex.
-	{
-		// direct
-		m := make(map[int]int)
-		mv := ValueOf(m)
-		mv.SetMapIndex(ValueOf(1), ValueOf(2))
-		x, ok := m[1]
-		if x != 2 {
-			t.Errorf("#1 after SetMapIndex(1,2): %d, %t (map=%v)", x, ok, m)
-		}
-		if n := mv.MapIndex(ValueOf(1)).Interface().(int); n != 2 {
-			t.Errorf("#1 MapIndex(1) = %d", n)
-		}
-	}
-	{
-		// convert interface key
-		m := make(map[interface{}]int)
-		mv := ValueOf(m)
-		mv.SetMapIndex(ValueOf(1), ValueOf(2))
-		x, ok := m[1]
-		if x != 2 {
-			t.Errorf("#2 after SetMapIndex(1,2): %d, %t (map=%v)", x, ok, m)
-		}
-		if n := mv.MapIndex(ValueOf(1)).Interface().(int); n != 2 {
-			t.Errorf("#2 MapIndex(1) = %d", n)
-		}
-	}
-	{
-		// convert interface value
-		m := make(map[int]interface{})
-		mv := ValueOf(m)
-		mv.SetMapIndex(ValueOf(1), ValueOf(2))
-		x, ok := m[1]
-		if x != 2 {
-			t.Errorf("#3 after SetMapIndex(1,2): %d, %t (map=%v)", x, ok, m)
-		}
-		if n := mv.MapIndex(ValueOf(1)).Interface().(int); n != 2 {
-			t.Errorf("#3 MapIndex(1) = %d", n)
-		}
-	}
-	{
-		// convert both interface key and interface value
-		m := make(map[interface{}]interface{})
-		mv := ValueOf(m)
-		mv.SetMapIndex(ValueOf(1), ValueOf(2))
-		x, ok := m[1]
-		if x != 2 {
-			t.Errorf("#4 after SetMapIndex(1,2): %d, %t (map=%v)", x, ok, m)
-		}
-		if n := mv.MapIndex(ValueOf(1)).Interface().(int); n != 2 {
-			t.Errorf("#4 MapIndex(1) = %d", n)
-		}
-	}
-	{
-		// convert both, with non-empty interfaces
-		m := make(map[io.Reader]io.Writer)
-		mv := ValueOf(m)
-		b1 := new(bytes.Buffer)
-		b2 := new(bytes.Buffer)
-		mv.SetMapIndex(ValueOf(b1), ValueOf(b2))
-		x, ok := m[b1]
-		if x != b2 {
-			t.Errorf("#5 after SetMapIndex(b1, b2): %p (!= %p), %t (map=%v)", x, b2, ok, m)
-		}
-		if p := mv.MapIndex(ValueOf(b1)).Elem().Pointer(); p != uintptr(unsafe.Pointer(b2)) {
-			t.Errorf("#5 MapIndex(b1) = %#x want %p", p, b2)
-		}
-	}
-	{
-		// convert channel direction
-		m := make(map[<-chan int]chan int)
-		mv := ValueOf(m)
-		c1 := make(chan int)
-		c2 := make(chan int)
-		mv.SetMapIndex(ValueOf(c1), ValueOf(c2))
-		x, ok := m[c1]
-		if x != c2 {
-			t.Errorf("#6 after SetMapIndex(c1, c2): %p (!= %p), %t (map=%v)", x, c2, ok, m)
-		}
-		if p := mv.MapIndex(ValueOf(c1)).Pointer(); p != ValueOf(c2).Pointer() {
-			t.Errorf("#6 MapIndex(c1) = %#x want %p", p, c2)
-		}
-	}
-	{
-		// convert identical underlying types
-		// TODO(rsc): Should be able to define MyBuffer here.
-		// 6l prints very strange messages about .this.Bytes etc
-		// when we do that though, so MyBuffer is defined
-		// at top level.
-		m := make(map[*MyBuffer]*bytes.Buffer)
-		mv := ValueOf(m)
-		b1 := new(MyBuffer)
-		b2 := new(bytes.Buffer)
-		mv.SetMapIndex(ValueOf(b1), ValueOf(b2))
-		x, ok := m[b1]
-		if x != b2 {
-			t.Errorf("#7 after SetMapIndex(b1, b2): %p (!= %p), %t (map=%v)", x, b2, ok, m)
-		}
-		if p := mv.MapIndex(ValueOf(b1)).Pointer(); p != uintptr(unsafe.Pointer(b2)) {
-			t.Errorf("#7 MapIndex(b1) = %#x want %p", p, b2)
-		}
-	}
-
-}
-
-func TestImplicitSetConversion(t *testing.T) {
-	// Assume TestImplicitMapConversion covered the basics.
-	// Just make sure conversions are being applied at all.
-	var r io.Reader
-	b := new(bytes.Buffer)
-	rv := ValueOf(&r).Elem()
-	rv.Set(ValueOf(b))
-	if r != b {
-		t.Errorf("after Set: r=%T(%v)", r, r)
-	}
-}
-
-func TestImplicitSendConversion(t *testing.T) {
-	c := make(chan io.Reader, 10)
-	b := new(bytes.Buffer)
-	ValueOf(c).Send(ValueOf(b))
-	if bb := <-c; bb != b {
-		t.Errorf("Received %p != %p", bb, b)
-	}
-}
-
-func TestImplicitCallConversion(t *testing.T) {
-	// Arguments must be assignable to parameter types.
-	fv := ValueOf(io.WriteString)
-	b := new(bytes.Buffer)
-	fv.Call([]Value{ValueOf(b), ValueOf("hello world")})
-	if b.String() != "hello world" {
-		t.Errorf("After call: string=%q want %q", b.String(), "hello world")
-	}
-}
-
-func TestImplicitAppendConversion(t *testing.T) {
-	// Arguments must be assignable to the slice's element type.
-	s := []io.Reader{}
-	sv := ValueOf(&s).Elem()
-	b := new(bytes.Buffer)
-	sv.Set(Append(sv, ValueOf(b)))
-	if len(s) != 1 || s[0] != b {
-		t.Errorf("after append: s=%v want [%p]", s, b)
-	}
-}
-
-var implementsTests = []struct {
-	x interface{}
-	t interface{}
-	b bool
-}{
-	{new(*bytes.Buffer), new(io.Reader), true},
-	{new(bytes.Buffer), new(io.Reader), false},
-	{new(*bytes.Buffer), new(io.ReaderAt), false},
-	{new(*ast.Ident), new(ast.Expr), true},
-}
-
-func TestImplements(t *testing.T) {
-	for _, tt := range implementsTests {
-		xv := TypeOf(tt.x).Elem()
-		xt := TypeOf(tt.t).Elem()
-		if b := xv.Implements(xt); b != tt.b {
-			t.Errorf("(%s).Implements(%s) = %v, want %v", xv.String(), xt.String(), b, tt.b)
-		}
-	}
-}
-
-var assignableTests = []struct {
-	x interface{}
-	t interface{}
-	b bool
-}{
-	{new(chan int), new(<-chan int), true},
-	{new(<-chan int), new(chan int), false},
-	{new(*int), new(IntPtr), true},
-	{new(IntPtr), new(*int), true},
-	{new(IntPtr), new(IntPtr1), false},
-	// test runs implementsTests too
-}
-
-type IntPtr *int
-type IntPtr1 *int
-
-func TestAssignableTo(t *testing.T) {
-	for _, tt := range append(assignableTests, implementsTests...) {
-		xv := TypeOf(tt.x).Elem()
-		xt := TypeOf(tt.t).Elem()
-		if b := xv.AssignableTo(xt); b != tt.b {
-			t.Errorf("(%s).AssignableTo(%s) = %v, want %v", xv.String(), xt.String(), b, tt.b)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/reflect/tostring_test.go b/third_party/gofrontend/libgo/go/reflect/tostring_test.go
deleted file mode 100644
index e416fd8..0000000
--- a/third_party/gofrontend/libgo/go/reflect/tostring_test.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Formatting of reflection types and values for debugging.
-// Not defined as methods so they do not need to be linked into most binaries;
-// the functions are not used by the library itself, only in tests.
-
-package reflect_test
-
-import (
-	. "reflect"
-	"strconv"
-)
-
-// valueToString returns a textual representation of the reflection value val.
-// For debugging only.
-func valueToString(val Value) string {
-	var str string
-	if !val.IsValid() {
-		return "<zero Value>"
-	}
-	typ := val.Type()
-	switch val.Kind() {
-	case Int, Int8, Int16, Int32, Int64:
-		return strconv.FormatInt(val.Int(), 10)
-	case Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
-		return strconv.FormatUint(val.Uint(), 10)
-	case Float32, Float64:
-		return strconv.FormatFloat(val.Float(), 'g', -1, 64)
-	case Complex64, Complex128:
-		c := val.Complex()
-		return strconv.FormatFloat(real(c), 'g', -1, 64) + "+" + strconv.FormatFloat(imag(c), 'g', -1, 64) + "i"
-	case String:
-		return val.String()
-	case Bool:
-		if val.Bool() {
-			return "true"
-		} else {
-			return "false"
-		}
-	case Ptr:
-		v := val
-		str = typ.String() + "("
-		if v.IsNil() {
-			str += "0"
-		} else {
-			str += "&" + valueToString(v.Elem())
-		}
-		str += ")"
-		return str
-	case Array, Slice:
-		v := val
-		str += typ.String()
-		str += "{"
-		for i := 0; i < v.Len(); i++ {
-			if i > 0 {
-				str += ", "
-			}
-			str += valueToString(v.Index(i))
-		}
-		str += "}"
-		return str
-	case Map:
-		t := typ
-		str = t.String()
-		str += "{"
-		str += "<can't iterate on maps>"
-		str += "}"
-		return str
-	case Chan:
-		str = typ.String()
-		return str
-	case Struct:
-		t := typ
-		v := val
-		str += t.String()
-		str += "{"
-		for i, n := 0, v.NumField(); i < n; i++ {
-			if i > 0 {
-				str += ", "
-			}
-			str += valueToString(v.Field(i))
-		}
-		str += "}"
-		return str
-	case Interface:
-		return typ.String() + "(" + valueToString(val.Elem()) + ")"
-	case Func:
-		v := val
-		return typ.String() + "(" + strconv.FormatUint(uint64(v.Pointer()), 10) + ")"
-	default:
-		panic("valueToString: can't print type " + typ.String())
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/reflect/type.go b/third_party/gofrontend/libgo/go/reflect/type.go
deleted file mode 100644
index 180a364..0000000
--- a/third_party/gofrontend/libgo/go/reflect/type.go
+++ /dev/null
@@ -1,2175 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package reflect implements run-time reflection, allowing a program to
-// manipulate objects with arbitrary types.  The typical use is to take a value
-// with static type interface{} and extract its dynamic type information by
-// calling TypeOf, which returns a Type.
-//
-// A call to ValueOf returns a Value representing the run-time data.
-// Zero takes a Type and returns a Value representing a zero value
-// for that type.
-//
-// See "The Laws of Reflection" for an introduction to reflection in Go:
-// https://golang.org/doc/articles/laws_of_reflection.html
-package reflect
-
-import (
-	"runtime"
-	"strconv"
-	"sync"
-	"unsafe"
-)
-
-// Type is the representation of a Go type.
-//
-// Not all methods apply to all kinds of types.  Restrictions,
-// if any, are noted in the documentation for each method.
-// Use the Kind method to find out the kind of type before
-// calling kind-specific methods.  Calling a method
-// inappropriate to the kind of type causes a run-time panic.
-type Type interface {
-	// Methods applicable to all types.
-
-	// Align returns the alignment in bytes of a value of
-	// this type when allocated in memory.
-	Align() int
-
-	// FieldAlign returns the alignment in bytes of a value of
-	// this type when used as a field in a struct.
-	FieldAlign() int
-
-	// Method returns the i'th method in the type's method set.
-	// It panics if i is not in the range [0, NumMethod()).
-	//
-	// For a non-interface type T or *T, the returned Method's Type and Func
-	// fields describe a function whose first argument is the receiver.
-	//
-	// For an interface type, the returned Method's Type field gives the
-	// method signature, without a receiver, and the Func field is nil.
-	Method(int) Method
-
-	// MethodByName returns the method with that name in the type's
-	// method set and a boolean indicating if the method was found.
-	//
-	// For a non-interface type T or *T, the returned Method's Type and Func
-	// fields describe a function whose first argument is the receiver.
-	//
-	// For an interface type, the returned Method's Type field gives the
-	// method signature, without a receiver, and the Func field is nil.
-	MethodByName(string) (Method, bool)
-
-	// NumMethod returns the number of methods in the type's method set.
-	NumMethod() int
-
-	// Name returns the type's name within its package.
-	// It returns an empty string for unnamed types.
-	Name() string
-
-	// PkgPath returns a named type's package path, that is, the import path
-	// that uniquely identifies the package, such as "encoding/base64".
-	// If the type was predeclared (string, error) or unnamed (*T, struct{}, []int),
-	// the package path will be the empty string.
-	PkgPath() string
-
-	// Size returns the number of bytes needed to store
-	// a value of the given type; it is analogous to unsafe.Sizeof.
-	Size() uintptr
-
-	// String returns a string representation of the type.
-	// The string representation may use shortened package names
-	// (e.g., base64 instead of "encoding/base64") and is not
-	// guaranteed to be unique among types.  To test for equality,
-	// compare the Types directly.
-	String() string
-
-	// Used internally by gccgo--the string retaining quoting.
-	rawString() string
-
-	// Kind returns the specific kind of this type.
-	Kind() Kind
-
-	// Implements reports whether the type implements the interface type u.
-	Implements(u Type) bool
-
-	// AssignableTo reports whether a value of the type is assignable to type u.
-	AssignableTo(u Type) bool
-
-	// ConvertibleTo reports whether a value of the type is convertible to type u.
-	ConvertibleTo(u Type) bool
-
-	// Comparable reports whether values of this type are comparable.
-	Comparable() bool
-
-	// Methods applicable only to some types, depending on Kind.
-	// The methods allowed for each kind are:
-	//
-	//	Int*, Uint*, Float*, Complex*: Bits
-	//	Array: Elem, Len
-	//	Chan: ChanDir, Elem
-	//	Func: In, NumIn, Out, NumOut, IsVariadic.
-	//	Map: Key, Elem
-	//	Ptr: Elem
-	//	Slice: Elem
-	//	Struct: Field, FieldByIndex, FieldByName, FieldByNameFunc, NumField
-
-	// Bits returns the size of the type in bits.
-	// It panics if the type's Kind is not one of the
-	// sized or unsized Int, Uint, Float, or Complex kinds.
-	Bits() int
-
-	// ChanDir returns a channel type's direction.
-	// It panics if the type's Kind is not Chan.
-	ChanDir() ChanDir
-
-	// IsVariadic reports whether a function type's final input parameter
-	// is a "..." parameter.  If so, t.In(t.NumIn() - 1) returns the parameter's
-	// implicit actual type []T.
-	//
-	// For concreteness, if t represents func(x int, y ... float64), then
-	//
-	//	t.NumIn() == 2
-	//	t.In(0) is the reflect.Type for "int"
-	//	t.In(1) is the reflect.Type for "[]float64"
-	//	t.IsVariadic() == true
-	//
-	// IsVariadic panics if the type's Kind is not Func.
-	IsVariadic() bool
-
-	// Elem returns a type's element type.
-	// It panics if the type's Kind is not Array, Chan, Map, Ptr, or Slice.
-	Elem() Type
-
-	// Field returns a struct type's i'th field.
-	// It panics if the type's Kind is not Struct.
-	// It panics if i is not in the range [0, NumField()).
-	Field(i int) StructField
-
-	// FieldByIndex returns the nested field corresponding
-	// to the index sequence.  It is equivalent to calling Field
-	// successively for each index i.
-	// It panics if the type's Kind is not Struct.
-	FieldByIndex(index []int) StructField
-
-	// FieldByName returns the struct field with the given name
-	// and a boolean indicating if the field was found.
-	FieldByName(name string) (StructField, bool)
-
-	// FieldByNameFunc returns the first struct field with a name
-	// that satisfies the match function and a boolean indicating if
-	// the field was found.
-	FieldByNameFunc(match func(string) bool) (StructField, bool)
-
-	// In returns the type of a function type's i'th input parameter.
-	// It panics if the type's Kind is not Func.
-	// It panics if i is not in the range [0, NumIn()).
-	In(i int) Type
-
-	// Key returns a map type's key type.
-	// It panics if the type's Kind is not Map.
-	Key() Type
-
-	// Len returns an array type's length.
-	// It panics if the type's Kind is not Array.
-	Len() int
-
-	// NumField returns a struct type's field count.
-	// It panics if the type's Kind is not Struct.
-	NumField() int
-
-	// NumIn returns a function type's input parameter count.
-	// It panics if the type's Kind is not Func.
-	NumIn() int
-
-	// NumOut returns a function type's output parameter count.
-	// It panics if the type's Kind is not Func.
-	NumOut() int
-
-	// Out returns the type of a function type's i'th output parameter.
-	// It panics if the type's Kind is not Func.
-	// It panics if i is not in the range [0, NumOut()).
-	Out(i int) Type
-
-	common() *rtype
-	uncommon() *uncommonType
-}
-
-// BUG(rsc): FieldByName and related functions consider struct field names to be equal
-// if the names are equal, even if they are unexported names originating
-// in different packages. The practical effect of this is that the result of
-// t.FieldByName("x") is not well defined if the struct type t contains
-// multiple fields named x (embedded from different packages).
-// FieldByName may return one of the fields named x or may report that there are none.
-// See golang.org/issue/4876 for more details.
-
-/*
- * These data structures are known to the compiler (../../cmd/internal/gc/reflect.go).
- * A few are known to ../runtime/type.go to convey to debuggers.
- * They are also known to ../runtime/type.go.
- */
-
-// A Kind represents the specific kind of type that a Type represents.
-// The zero Kind is not a valid kind.
-type Kind uint
-
-const (
-	Invalid Kind = iota
-	Bool
-	Int
-	Int8
-	Int16
-	Int32
-	Int64
-	Uint
-	Uint8
-	Uint16
-	Uint32
-	Uint64
-	Uintptr
-	Float32
-	Float64
-	Complex64
-	Complex128
-	Array
-	Chan
-	Func
-	Interface
-	Map
-	Ptr
-	Slice
-	String
-	Struct
-	UnsafePointer
-)
-
-// rtype is the common implementation of most values.
-// It is embedded in other, public struct types, but always
-// with a unique tag like `reflect:"array"` or `reflect:"ptr"`
-// so that code cannot convert from, say, *arrayType to *ptrType.
-type rtype struct {
-	kind       uint8 // enumeration for C
-	align      int8  // alignment of variable with this type
-	fieldAlign uint8 // alignment of struct field with this type
-	_          uint8 // unused/padding
-	size       uintptr
-	hash       uint32 // hash of type; avoids computation in hash tables
-
-	hashfn  func(unsafe.Pointer, uintptr) uintptr              // hash function
-	equalfn func(unsafe.Pointer, unsafe.Pointer, uintptr) bool // equality function
-
-	gc            unsafe.Pointer // garbage collection data
-	string        *string        // string form; unnecessary  but undeniably useful
-	*uncommonType                // (relatively) uncommon fields
-	ptrToThis     *rtype         // type for pointer to this type, if used in binary or has methods
-}
-
-// Method on non-interface type
-type method struct {
-	name    *string        // name of method
-	pkgPath *string        // nil for exported Names; otherwise import path
-	mtyp    *rtype         // method type (without receiver)
-	typ     *rtype         // .(*FuncType) underneath (with receiver)
-	tfn     unsafe.Pointer // fn used for normal method call
-}
-
-// uncommonType is present only for types with names or methods
-// (if T is a named type, the uncommonTypes for T and *T have methods).
-// Using a pointer to this struct reduces the overall size required
-// to describe an unnamed type with no methods.
-type uncommonType struct {
-	name    *string  // name of type
-	pkgPath *string  // import path; nil for built-in types like int, string
-	methods []method // methods associated with type
-}
-
-// ChanDir represents a channel type's direction.
-type ChanDir int
-
-const (
-	RecvDir ChanDir             = 1 << iota // <-chan
-	SendDir                                 // chan<-
-	BothDir = RecvDir | SendDir             // chan
-)
-
-// arrayType represents a fixed array type.
-type arrayType struct {
-	rtype `reflect:"array"`
-	elem  *rtype // array element type
-	slice *rtype // slice type
-	len   uintptr
-}
-
-// chanType represents a channel type.
-type chanType struct {
-	rtype `reflect:"chan"`
-	elem  *rtype  // channel element type
-	dir   uintptr // channel direction (ChanDir)
-}
-
-// funcType represents a function type.
-type funcType struct {
-	rtype     `reflect:"func"`
-	dotdotdot bool     // last input parameter is ...
-	in        []*rtype // input parameter types
-	out       []*rtype // output parameter types
-}
-
-// imethod represents a method on an interface type
-type imethod struct {
-	name    *string // name of method
-	pkgPath *string // nil for exported Names; otherwise import path
-	typ     *rtype  // .(*FuncType) underneath
-}
-
-// interfaceType represents an interface type.
-type interfaceType struct {
-	rtype   `reflect:"interface"`
-	methods []imethod // sorted by hash
-}
-
-// mapType represents a map type.
-type mapType struct {
-	rtype `reflect:"map"`
-	key   *rtype // map key type
-	elem  *rtype // map element (value) type
-}
-
-// ptrType represents a pointer type.
-type ptrType struct {
-	rtype `reflect:"ptr"`
-	elem  *rtype // pointer element (pointed at) type
-}
-
-// sliceType represents a slice type.
-type sliceType struct {
-	rtype `reflect:"slice"`
-	elem  *rtype // slice element type
-}
-
-// Struct field
-type structField struct {
-	name    *string // nil for embedded fields
-	pkgPath *string // nil for exported Names; otherwise import path
-	typ     *rtype  // type of field
-	tag     *string // nil if no tag
-	offset  uintptr // byte offset of field within struct
-}
-
-// structType represents a struct type.
-type structType struct {
-	rtype  `reflect:"struct"`
-	fields []structField // sorted by offset
-}
-
-// NOTE: These are copied from ../runtime/mgc0.h.
-// They must be kept in sync.
-const (
-	_GC_END = iota
-	_GC_PTR
-	_GC_APTR
-	_GC_ARRAY_START
-	_GC_ARRAY_NEXT
-	_GC_CALL
-	_GC_CHAN_PTR
-	_GC_STRING
-	_GC_EFACE
-	_GC_IFACE
-	_GC_SLICE
-	_GC_REGION
-	_GC_NUM_INSTR
-)
-
-/*
- * The compiler knows the exact layout of all the data structures above.
- * The compiler does not know about the data structures and methods below.
- */
-
-// Method represents a single method.
-type Method struct {
-	// Name is the method name.
-	// PkgPath is the package path that qualifies a lower case (unexported)
-	// method name.  It is empty for upper case (exported) method names.
-	// The combination of PkgPath and Name uniquely identifies a method
-	// in a method set.
-	// See https://golang.org/ref/spec#Uniqueness_of_identifiers
-	Name    string
-	PkgPath string
-
-	Type  Type  // method type
-	Func  Value // func with receiver as first argument
-	Index int   // index for Type.Method
-}
-
-const (
-	kindDirectIface = 1 << 5
-	kindGCProg      = 1 << 6 // Type.gc points to GC program
-	kindNoPointers  = 1 << 7
-	kindMask        = (1 << 5) - 1
-)
-
-func (k Kind) String() string {
-	if int(k) < len(kindNames) {
-		return kindNames[k]
-	}
-	return "kind" + strconv.Itoa(int(k))
-}
-
-var kindNames = []string{
-	Invalid:       "invalid",
-	Bool:          "bool",
-	Int:           "int",
-	Int8:          "int8",
-	Int16:         "int16",
-	Int32:         "int32",
-	Int64:         "int64",
-	Uint:          "uint",
-	Uint8:         "uint8",
-	Uint16:        "uint16",
-	Uint32:        "uint32",
-	Uint64:        "uint64",
-	Uintptr:       "uintptr",
-	Float32:       "float32",
-	Float64:       "float64",
-	Complex64:     "complex64",
-	Complex128:    "complex128",
-	Array:         "array",
-	Chan:          "chan",
-	Func:          "func",
-	Interface:     "interface",
-	Map:           "map",
-	Ptr:           "ptr",
-	Slice:         "slice",
-	String:        "string",
-	Struct:        "struct",
-	UnsafePointer: "unsafe.Pointer",
-}
-
-func (t *uncommonType) uncommon() *uncommonType {
-	return t
-}
-
-func (t *uncommonType) PkgPath() string {
-	if t == nil || t.pkgPath == nil {
-		return ""
-	}
-	return *t.pkgPath
-}
-
-func (t *uncommonType) Name() string {
-	if t == nil || t.name == nil {
-		return ""
-	}
-	return *t.name
-}
-
-func (t *rtype) rawString() string { return *t.string }
-
-func (t *rtype) String() string {
-	// For gccgo, strip out quoted strings.
-	s := *t.string
-	var q bool
-	r := make([]byte, len(s))
-	j := 0
-	for i := 0; i < len(s); i++ {
-		if s[i] == '\t' {
-			q = !q
-		} else if !q {
-			r[j] = s[i]
-			j++
-		}
-	}
-	return string(r[:j])
-}
-
-func (t *rtype) Size() uintptr { return t.size }
-
-func (t *rtype) Bits() int {
-	if t == nil {
-		panic("reflect: Bits of nil Type")
-	}
-	k := t.Kind()
-	if k < Int || k > Complex128 {
-		panic("reflect: Bits of non-arithmetic Type " + t.String())
-	}
-	return int(t.size) * 8
-}
-
-func (t *rtype) Align() int { return int(t.align) }
-
-func (t *rtype) FieldAlign() int { return int(t.fieldAlign) }
-
-func (t *rtype) Kind() Kind { return Kind(t.kind & kindMask) }
-
-func (t *rtype) pointers() bool { return t.kind&kindNoPointers == 0 }
-
-func (t *rtype) common() *rtype { return t }
-
-func (t *uncommonType) Method(i int) (m Method) {
-	if t == nil || i < 0 || i >= len(t.methods) {
-		panic("reflect: Method index out of range")
-	}
-	p := &t.methods[i]
-	if p.name != nil {
-		m.Name = *p.name
-	}
-	fl := flag(Func)
-	if p.pkgPath != nil {
-		m.PkgPath = *p.pkgPath
-		fl |= flagStickyRO
-	}
-	mt := p.typ
-	m.Type = toType(mt)
-	x := new(unsafe.Pointer)
-	*x = unsafe.Pointer(&p.tfn)
-	m.Func = Value{mt, unsafe.Pointer(x), fl | flagIndir | flagMethodFn}
-	m.Index = i
-	return
-}
-
-func (t *uncommonType) NumMethod() int {
-	if t == nil {
-		return 0
-	}
-	return len(t.methods)
-}
-
-func (t *uncommonType) MethodByName(name string) (m Method, ok bool) {
-	if t == nil {
-		return
-	}
-	var p *method
-	for i := range t.methods {
-		p = &t.methods[i]
-		if p.name != nil && *p.name == name {
-			return t.Method(i), true
-		}
-	}
-	return
-}
-
-// TODO(rsc): gc supplies these, but they are not
-// as efficient as they could be: they have commonType
-// as the receiver instead of *rtype.
-func (t *rtype) NumMethod() int {
-	if t.Kind() == Interface {
-		tt := (*interfaceType)(unsafe.Pointer(t))
-		return tt.NumMethod()
-	}
-	return t.uncommonType.NumMethod()
-}
-
-func (t *rtype) Method(i int) (m Method) {
-	if t.Kind() == Interface {
-		tt := (*interfaceType)(unsafe.Pointer(t))
-		return tt.Method(i)
-	}
-	return t.uncommonType.Method(i)
-}
-
-func (t *rtype) MethodByName(name string) (m Method, ok bool) {
-	if t.Kind() == Interface {
-		tt := (*interfaceType)(unsafe.Pointer(t))
-		return tt.MethodByName(name)
-	}
-	return t.uncommonType.MethodByName(name)
-}
-
-func (t *rtype) PkgPath() string {
-	return t.uncommonType.PkgPath()
-}
-
-func (t *rtype) Name() string {
-	return t.uncommonType.Name()
-}
-
-func (t *rtype) ChanDir() ChanDir {
-	if t.Kind() != Chan {
-		panic("reflect: ChanDir of non-chan type")
-	}
-	tt := (*chanType)(unsafe.Pointer(t))
-	return ChanDir(tt.dir)
-}
-
-func (t *rtype) IsVariadic() bool {
-	if t.Kind() != Func {
-		panic("reflect: IsVariadic of non-func type")
-	}
-	tt := (*funcType)(unsafe.Pointer(t))
-	return tt.dotdotdot
-}
-
-func (t *rtype) Elem() Type {
-	switch t.Kind() {
-	case Array:
-		tt := (*arrayType)(unsafe.Pointer(t))
-		return toType(tt.elem)
-	case Chan:
-		tt := (*chanType)(unsafe.Pointer(t))
-		return toType(tt.elem)
-	case Map:
-		tt := (*mapType)(unsafe.Pointer(t))
-		return toType(tt.elem)
-	case Ptr:
-		tt := (*ptrType)(unsafe.Pointer(t))
-		return toType(tt.elem)
-	case Slice:
-		tt := (*sliceType)(unsafe.Pointer(t))
-		return toType(tt.elem)
-	}
-	panic("reflect: Elem of invalid type")
-}
-
-func (t *rtype) Field(i int) StructField {
-	if t.Kind() != Struct {
-		panic("reflect: Field of non-struct type")
-	}
-	tt := (*structType)(unsafe.Pointer(t))
-	return tt.Field(i)
-}
-
-func (t *rtype) FieldByIndex(index []int) StructField {
-	if t.Kind() != Struct {
-		panic("reflect: FieldByIndex of non-struct type")
-	}
-	tt := (*structType)(unsafe.Pointer(t))
-	return tt.FieldByIndex(index)
-}
-
-func (t *rtype) FieldByName(name string) (StructField, bool) {
-	if t.Kind() != Struct {
-		panic("reflect: FieldByName of non-struct type")
-	}
-	tt := (*structType)(unsafe.Pointer(t))
-	return tt.FieldByName(name)
-}
-
-func (t *rtype) FieldByNameFunc(match func(string) bool) (StructField, bool) {
-	if t.Kind() != Struct {
-		panic("reflect: FieldByNameFunc of non-struct type")
-	}
-	tt := (*structType)(unsafe.Pointer(t))
-	return tt.FieldByNameFunc(match)
-}
-
-func (t *rtype) In(i int) Type {
-	if t.Kind() != Func {
-		panic("reflect: In of non-func type")
-	}
-	tt := (*funcType)(unsafe.Pointer(t))
-	return toType(tt.in[i])
-}
-
-func (t *rtype) Key() Type {
-	if t.Kind() != Map {
-		panic("reflect: Key of non-map type")
-	}
-	tt := (*mapType)(unsafe.Pointer(t))
-	return toType(tt.key)
-}
-
-func (t *rtype) Len() int {
-	if t.Kind() != Array {
-		panic("reflect: Len of non-array type")
-	}
-	tt := (*arrayType)(unsafe.Pointer(t))
-	return int(tt.len)
-}
-
-func (t *rtype) NumField() int {
-	if t.Kind() != Struct {
-		panic("reflect: NumField of non-struct type")
-	}
-	tt := (*structType)(unsafe.Pointer(t))
-	return len(tt.fields)
-}
-
-func (t *rtype) NumIn() int {
-	if t.Kind() != Func {
-		panic("reflect: NumIn of non-func type")
-	}
-	tt := (*funcType)(unsafe.Pointer(t))
-	return len(tt.in)
-}
-
-func (t *rtype) NumOut() int {
-	if t.Kind() != Func {
-		panic("reflect: NumOut of non-func type")
-	}
-	tt := (*funcType)(unsafe.Pointer(t))
-	return len(tt.out)
-}
-
-func (t *rtype) Out(i int) Type {
-	if t.Kind() != Func {
-		panic("reflect: Out of non-func type")
-	}
-	tt := (*funcType)(unsafe.Pointer(t))
-	return toType(tt.out[i])
-}
-
-func (d ChanDir) String() string {
-	switch d {
-	case SendDir:
-		return "chan<-"
-	case RecvDir:
-		return "<-chan"
-	case BothDir:
-		return "chan"
-	}
-	return "ChanDir" + strconv.Itoa(int(d))
-}
-
-// Method returns the i'th method in the type's method set.
-func (t *interfaceType) Method(i int) (m Method) {
-	if i < 0 || i >= len(t.methods) {
-		return
-	}
-	p := &t.methods[i]
-	m.Name = *p.name
-	if p.pkgPath != nil {
-		m.PkgPath = *p.pkgPath
-	}
-	m.Type = toType(p.typ)
-	m.Index = i
-	return
-}
-
-// NumMethod returns the number of interface methods in the type's method set.
-func (t *interfaceType) NumMethod() int { return len(t.methods) }
-
-// MethodByName method with the given name in the type's method set.
-func (t *interfaceType) MethodByName(name string) (m Method, ok bool) {
-	if t == nil {
-		return
-	}
-	var p *imethod
-	for i := range t.methods {
-		p = &t.methods[i]
-		if *p.name == name {
-			return t.Method(i), true
-		}
-	}
-	return
-}
-
-// A StructField describes a single field in a struct.
-type StructField struct {
-	// Name is the field name.
-	// PkgPath is the package path that qualifies a lower case (unexported)
-	// field name.  It is empty for upper case (exported) field names.
-	// See https://golang.org/ref/spec#Uniqueness_of_identifiers
-	Name    string
-	PkgPath string
-
-	Type      Type      // field type
-	Tag       StructTag // field tag string
-	Offset    uintptr   // offset within struct, in bytes
-	Index     []int     // index sequence for Type.FieldByIndex
-	Anonymous bool      // is an embedded field
-}
-
-// A StructTag is the tag string in a struct field.
-//
-// By convention, tag strings are a concatenation of
-// optionally space-separated key:"value" pairs.
-// Each key is a non-empty string consisting of non-control
-// characters other than space (U+0020 ' '), quote (U+0022 '"'),
-// and colon (U+003A ':').  Each value is quoted using U+0022 '"'
-// characters and Go string literal syntax.
-type StructTag string
-
-// Get returns the value associated with key in the tag string.
-// If there is no such key in the tag, Get returns the empty string.
-// If the tag does not have the conventional format, the value
-// returned by Get is unspecified.
-func (tag StructTag) Get(key string) string {
-	// When modifying this code, also update the validateStructTag code
-	// in golang.org/x/tools/cmd/vet/structtag.go.
-
-	for tag != "" {
-		// Skip leading space.
-		i := 0
-		for i < len(tag) && tag[i] == ' ' {
-			i++
-		}
-		tag = tag[i:]
-		if tag == "" {
-			break
-		}
-
-		// Scan to colon. A space, a quote or a control character is a syntax error.
-		// Strictly speaking, control chars include the range [0x7f, 0x9f], not just
-		// [0x00, 0x1f], but in practice, we ignore the multi-byte control characters
-		// as it is simpler to inspect the tag's bytes than the tag's runes.
-		i = 0
-		for i < len(tag) && tag[i] > ' ' && tag[i] != ':' && tag[i] != '"' && tag[i] != 0x7f {
-			i++
-		}
-		if i == 0 || i+1 >= len(tag) || tag[i] != ':' || tag[i+1] != '"' {
-			break
-		}
-		name := string(tag[:i])
-		tag = tag[i+1:]
-
-		// Scan quoted string to find value.
-		i = 1
-		for i < len(tag) && tag[i] != '"' {
-			if tag[i] == '\\' {
-				i++
-			}
-			i++
-		}
-		if i >= len(tag) {
-			break
-		}
-		qvalue := string(tag[:i+1])
-		tag = tag[i+1:]
-
-		if key == name {
-			value, err := strconv.Unquote(qvalue)
-			if err != nil {
-				break
-			}
-			return value
-		}
-	}
-	return ""
-}
-
-// Field returns the i'th struct field.
-func (t *structType) Field(i int) (f StructField) {
-	if i < 0 || i >= len(t.fields) {
-		return
-	}
-	p := &t.fields[i]
-	f.Type = toType(p.typ)
-	if p.name != nil {
-		f.Name = *p.name
-	} else {
-		t := f.Type
-		if t.Kind() == Ptr {
-			t = t.Elem()
-		}
-		f.Name = t.Name()
-		f.Anonymous = true
-	}
-	if p.pkgPath != nil {
-		f.PkgPath = *p.pkgPath
-	}
-	if p.tag != nil {
-		f.Tag = StructTag(*p.tag)
-	}
-	f.Offset = p.offset
-
-	// NOTE(rsc): This is the only allocation in the interface
-	// presented by a reflect.Type.  It would be nice to avoid,
-	// at least in the common cases, but we need to make sure
-	// that misbehaving clients of reflect cannot affect other
-	// uses of reflect.  One possibility is CL 5371098, but we
-	// postponed that ugliness until there is a demonstrated
-	// need for the performance.  This is issue 2320.
-	f.Index = []int{i}
-	return
-}
-
-// TODO(gri): Should there be an error/bool indicator if the index
-//            is wrong for FieldByIndex?
-
-// FieldByIndex returns the nested field corresponding to index.
-func (t *structType) FieldByIndex(index []int) (f StructField) {
-	f.Type = toType(&t.rtype)
-	for i, x := range index {
-		if i > 0 {
-			ft := f.Type
-			if ft.Kind() == Ptr && ft.Elem().Kind() == Struct {
-				ft = ft.Elem()
-			}
-			f.Type = ft
-		}
-		f = f.Type.Field(x)
-	}
-	return
-}
-
-// A fieldScan represents an item on the fieldByNameFunc scan work list.
-type fieldScan struct {
-	typ   *structType
-	index []int
-}
-
-// FieldByNameFunc returns the struct field with a name that satisfies the
-// match function and a boolean to indicate if the field was found.
-func (t *structType) FieldByNameFunc(match func(string) bool) (result StructField, ok bool) {
-	// This uses the same condition that the Go language does: there must be a unique instance
-	// of the match at a given depth level. If there are multiple instances of a match at the
-	// same depth, they annihilate each other and inhibit any possible match at a lower level.
-	// The algorithm is breadth first search, one depth level at a time.
-
-	// The current and next slices are work queues:
-	// current lists the fields to visit on this depth level,
-	// and next lists the fields on the next lower level.
-	current := []fieldScan{}
-	next := []fieldScan{{typ: t}}
-
-	// nextCount records the number of times an embedded type has been
-	// encountered and considered for queueing in the 'next' slice.
-	// We only queue the first one, but we increment the count on each.
-	// If a struct type T can be reached more than once at a given depth level,
-	// then it annihilates itself and need not be considered at all when we
-	// process that next depth level.
-	var nextCount map[*structType]int
-
-	// visited records the structs that have been considered already.
-	// Embedded pointer fields can create cycles in the graph of
-	// reachable embedded types; visited avoids following those cycles.
-	// It also avoids duplicated effort: if we didn't find the field in an
-	// embedded type T at level 2, we won't find it in one at level 4 either.
-	visited := map[*structType]bool{}
-
-	for len(next) > 0 {
-		current, next = next, current[:0]
-		count := nextCount
-		nextCount = nil
-
-		// Process all the fields at this depth, now listed in 'current'.
-		// The loop queues embedded fields found in 'next', for processing during the next
-		// iteration. The multiplicity of the 'current' field counts is recorded
-		// in 'count'; the multiplicity of the 'next' field counts is recorded in 'nextCount'.
-		for _, scan := range current {
-			t := scan.typ
-			if visited[t] {
-				// We've looked through this type before, at a higher level.
-				// That higher level would shadow the lower level we're now at,
-				// so this one can't be useful to us. Ignore it.
-				continue
-			}
-			visited[t] = true
-			for i := range t.fields {
-				f := &t.fields[i]
-				// Find name and type for field f.
-				var fname string
-				var ntyp *rtype
-				if f.name != nil {
-					fname = *f.name
-				} else {
-					// Anonymous field of type T or *T.
-					// Name taken from type.
-					ntyp = f.typ
-					if ntyp.Kind() == Ptr {
-						ntyp = ntyp.Elem().common()
-					}
-					fname = ntyp.Name()
-				}
-
-				// Does it match?
-				if match(fname) {
-					// Potential match
-					if count[t] > 1 || ok {
-						// Name appeared multiple times at this level: annihilate.
-						return StructField{}, false
-					}
-					result = t.Field(i)
-					result.Index = nil
-					result.Index = append(result.Index, scan.index...)
-					result.Index = append(result.Index, i)
-					ok = true
-					continue
-				}
-
-				// Queue embedded struct fields for processing with next level,
-				// but only if we haven't seen a match yet at this level and only
-				// if the embedded types haven't already been queued.
-				if ok || ntyp == nil || ntyp.Kind() != Struct {
-					continue
-				}
-				ntyp = toType(ntyp).common()
-				styp := (*structType)(unsafe.Pointer(ntyp))
-				if nextCount[styp] > 0 {
-					nextCount[styp] = 2 // exact multiple doesn't matter
-					continue
-				}
-				if nextCount == nil {
-					nextCount = map[*structType]int{}
-				}
-				nextCount[styp] = 1
-				if count[t] > 1 {
-					nextCount[styp] = 2 // exact multiple doesn't matter
-				}
-				var index []int
-				index = append(index, scan.index...)
-				index = append(index, i)
-				next = append(next, fieldScan{styp, index})
-			}
-		}
-		if ok {
-			break
-		}
-	}
-	return
-}
-
-// FieldByName returns the struct field with the given name
-// and a boolean to indicate if the field was found.
-func (t *structType) FieldByName(name string) (f StructField, present bool) {
-	// Quick check for top-level name, or struct without anonymous fields.
-	hasAnon := false
-	if name != "" {
-		for i := range t.fields {
-			tf := &t.fields[i]
-			if tf.name == nil {
-				hasAnon = true
-				continue
-			}
-			if *tf.name == name {
-				return t.Field(i), true
-			}
-		}
-	}
-	if !hasAnon {
-		return
-	}
-	return t.FieldByNameFunc(func(s string) bool { return s == name })
-}
-
-// TypeOf returns the reflection Type that represents the dynamic type of i.
-// If i is a nil interface value, TypeOf returns nil.
-func TypeOf(i interface{}) Type {
-	eface := *(*emptyInterface)(unsafe.Pointer(&i))
-	return toType(eface.typ)
-}
-
-// ptrMap is the cache for PtrTo.
-var ptrMap struct {
-	sync.RWMutex
-	m map[*rtype]*ptrType
-}
-
-// garbage collection bytecode program for pointer to memory without pointers.
-// See ../../cmd/gc/reflect.c:/^dgcsym1 and :/^dgcsym.
-type ptrDataGC struct {
-	width uintptr // sizeof(ptr)
-	op    uintptr // _GC_APTR
-	off   uintptr // 0
-	end   uintptr // _GC_END
-}
-
-var ptrDataGCProg = ptrDataGC{
-	width: unsafe.Sizeof((*byte)(nil)),
-	op:    _GC_APTR,
-	off:   0,
-	end:   _GC_END,
-}
-
-// garbage collection bytecode program for pointer to memory with pointers.
-// See ../../cmd/gc/reflect.c:/^dgcsym1 and :/^dgcsym.
-type ptrGC struct {
-	width  uintptr        // sizeof(ptr)
-	op     uintptr        // _GC_PTR
-	off    uintptr        // 0
-	elemgc unsafe.Pointer // element gc type
-	end    uintptr        // _GC_END
-}
-
-// PtrTo returns the pointer type with element t.
-// For example, if t represents type Foo, PtrTo(t) represents *Foo.
-func PtrTo(t Type) Type {
-	return t.(*rtype).ptrTo()
-}
-
-func (t *rtype) ptrTo() *rtype {
-	if p := t.ptrToThis; p != nil {
-		return p
-	}
-
-	// Otherwise, synthesize one.
-	// This only happens for pointers with no methods.
-	// We keep the mapping in a map on the side, because
-	// this operation is rare and a separate map lets us keep
-	// the type structures in read-only memory.
-	ptrMap.RLock()
-	if m := ptrMap.m; m != nil {
-		if p := m[t]; p != nil {
-			ptrMap.RUnlock()
-			return &p.rtype
-		}
-	}
-	ptrMap.RUnlock()
-	ptrMap.Lock()
-	if ptrMap.m == nil {
-		ptrMap.m = make(map[*rtype]*ptrType)
-	}
-	p := ptrMap.m[t]
-	if p != nil {
-		// some other goroutine won the race and created it
-		ptrMap.Unlock()
-		return &p.rtype
-	}
-
-	s := "*" + *t.string
-
-	canonicalTypeLock.RLock()
-	r, ok := canonicalType[s]
-	canonicalTypeLock.RUnlock()
-	if ok {
-		ptrMap.m[t] = (*ptrType)(unsafe.Pointer(r.(*rtype)))
-		ptrMap.Unlock()
-		return r.(*rtype)
-	}
-
-	// Create a new ptrType starting with the description
-	// of an *unsafe.Pointer.
-	p = new(ptrType)
-	var iptr interface{} = (*unsafe.Pointer)(nil)
-	prototype := *(**ptrType)(unsafe.Pointer(&iptr))
-	*p = *prototype
-
-	p.string = &s
-
-	// For the type structures linked into the binary, the
-	// compiler provides a good hash of the string.
-	// Create a good hash for the new string by using
-	// the FNV-1 hash's mixing function to combine the
-	// old hash and the new "*".
-	// p.hash = fnv1(t.hash, '*')
-	// This is the gccgo version.
-	p.hash = (t.hash << 4) + 9
-
-	p.uncommonType = nil
-	p.ptrToThis = nil
-	p.elem = t
-
-	if t.kind&kindNoPointers != 0 {
-		p.gc = unsafe.Pointer(&ptrDataGCProg)
-	} else {
-		p.gc = unsafe.Pointer(&ptrGC{
-			width:  p.size,
-			op:     _GC_PTR,
-			off:    0,
-			elemgc: t.gc,
-			end:    _GC_END,
-		})
-	}
-
-	q := canonicalize(&p.rtype)
-	p = (*ptrType)(unsafe.Pointer(q.(*rtype)))
-
-	ptrMap.m[t] = p
-	ptrMap.Unlock()
-	return &p.rtype
-}
-
-// fnv1 incorporates the list of bytes into the hash x using the FNV-1 hash function.
-func fnv1(x uint32, list ...byte) uint32 {
-	for _, b := range list {
-		x = x*16777619 ^ uint32(b)
-	}
-	return x
-}
-
-func (t *rtype) Implements(u Type) bool {
-	if u == nil {
-		panic("reflect: nil type passed to Type.Implements")
-	}
-	if u.Kind() != Interface {
-		panic("reflect: non-interface type passed to Type.Implements")
-	}
-	return implements(u.(*rtype), t)
-}
-
-func (t *rtype) AssignableTo(u Type) bool {
-	if u == nil {
-		panic("reflect: nil type passed to Type.AssignableTo")
-	}
-	uu := u.(*rtype)
-	return directlyAssignable(uu, t) || implements(uu, t)
-}
-
-func (t *rtype) ConvertibleTo(u Type) bool {
-	if u == nil {
-		panic("reflect: nil type passed to Type.ConvertibleTo")
-	}
-	uu := u.(*rtype)
-	return convertOp(uu, t) != nil
-}
-
-func (t *rtype) Comparable() bool {
-	switch t.Kind() {
-	case Bool, Int, Int8, Int16, Int32, Int64,
-		Uint, Uint8, Uint16, Uint32, Uint64, Uintptr,
-		Float32, Float64, Complex64, Complex128,
-		Chan, Interface, Ptr, String, UnsafePointer:
-		return true
-
-	case Func, Map, Slice:
-		return false
-
-	case Array:
-		return (*arrayType)(unsafe.Pointer(t)).elem.Comparable()
-
-	case Struct:
-		tt := (*structType)(unsafe.Pointer(t))
-		for i := range tt.fields {
-			if !tt.fields[i].typ.Comparable() {
-				return false
-			}
-		}
-		return true
-
-	default:
-		panic("reflect: impossible")
-	}
-}
-
-// implements reports whether the type V implements the interface type T.
-func implements(T, V *rtype) bool {
-	if T.Kind() != Interface {
-		return false
-	}
-	t := (*interfaceType)(unsafe.Pointer(T))
-	if len(t.methods) == 0 {
-		return true
-	}
-
-	// The same algorithm applies in both cases, but the
-	// method tables for an interface type and a concrete type
-	// are different, so the code is duplicated.
-	// In both cases the algorithm is a linear scan over the two
-	// lists - T's methods and V's methods - simultaneously.
-	// Since method tables are stored in a unique sorted order
-	// (alphabetical, with no duplicate method names), the scan
-	// through V's methods must hit a match for each of T's
-	// methods along the way, or else V does not implement T.
-	// This lets us run the scan in overall linear time instead of
-	// the quadratic time  a naive search would require.
-	// See also ../runtime/iface.go.
-	if V.Kind() == Interface {
-		v := (*interfaceType)(unsafe.Pointer(V))
-		i := 0
-		for j := 0; j < len(v.methods); j++ {
-			tm := &t.methods[i]
-			vm := &v.methods[j]
-			if *vm.name == *tm.name && (vm.pkgPath == tm.pkgPath || (vm.pkgPath != nil && tm.pkgPath != nil && *vm.pkgPath == *tm.pkgPath)) && toType(vm.typ).common() == toType(tm.typ).common() {
-				if i++; i >= len(t.methods) {
-					return true
-				}
-			}
-		}
-		return false
-	}
-
-	v := V.uncommon()
-	if v == nil {
-		return false
-	}
-	i := 0
-	for j := 0; j < len(v.methods); j++ {
-		tm := &t.methods[i]
-		vm := &v.methods[j]
-		if *vm.name == *tm.name && (vm.pkgPath == tm.pkgPath || (vm.pkgPath != nil && tm.pkgPath != nil && *vm.pkgPath == *tm.pkgPath)) && toType(vm.mtyp).common() == toType(tm.typ).common() {
-			if i++; i >= len(t.methods) {
-				return true
-			}
-		}
-	}
-	return false
-}
-
-// directlyAssignable reports whether a value x of type V can be directly
-// assigned (using memmove) to a value of type T.
-// https://golang.org/doc/go_spec.html#Assignability
-// Ignoring the interface rules (implemented elsewhere)
-// and the ideal constant rules (no ideal constants at run time).
-func directlyAssignable(T, V *rtype) bool {
-	// x's type V is identical to T?
-	if T == V {
-		return true
-	}
-
-	// Otherwise at least one of T and V must be unnamed
-	// and they must have the same kind.
-	if T.Name() != "" && V.Name() != "" || T.Kind() != V.Kind() {
-		return false
-	}
-
-	// x's type T and V must  have identical underlying types.
-	return haveIdenticalUnderlyingType(T, V)
-}
-
-func haveIdenticalUnderlyingType(T, V *rtype) bool {
-	if T == V {
-		return true
-	}
-
-	kind := T.Kind()
-	if kind != V.Kind() {
-		return false
-	}
-
-	// Non-composite types of equal kind have same underlying type
-	// (the predefined instance of the type).
-	if Bool <= kind && kind <= Complex128 || kind == String || kind == UnsafePointer {
-		return true
-	}
-
-	// Composite types.
-	switch kind {
-	case Array:
-		return T.Elem() == V.Elem() && T.Len() == V.Len()
-
-	case Chan:
-		// Special case:
-		// x is a bidirectional channel value, T is a channel type,
-		// and x's type V and T have identical element types.
-		if V.ChanDir() == BothDir && T.Elem() == V.Elem() {
-			return true
-		}
-
-		// Otherwise continue test for identical underlying type.
-		return V.ChanDir() == T.ChanDir() && T.Elem() == V.Elem()
-
-	case Func:
-		t := (*funcType)(unsafe.Pointer(T))
-		v := (*funcType)(unsafe.Pointer(V))
-		if t.dotdotdot != v.dotdotdot || len(t.in) != len(v.in) || len(t.out) != len(v.out) {
-			return false
-		}
-		for i, typ := range t.in {
-			if typ != v.in[i] {
-				return false
-			}
-		}
-		for i, typ := range t.out {
-			if typ != v.out[i] {
-				return false
-			}
-		}
-		return true
-
-	case Interface:
-		t := (*interfaceType)(unsafe.Pointer(T))
-		v := (*interfaceType)(unsafe.Pointer(V))
-		if len(t.methods) == 0 && len(v.methods) == 0 {
-			return true
-		}
-		// Might have the same methods but still
-		// need a run time conversion.
-		return false
-
-	case Map:
-		return T.Key() == V.Key() && T.Elem() == V.Elem()
-
-	case Ptr, Slice:
-		return T.Elem() == V.Elem()
-
-	case Struct:
-		t := (*structType)(unsafe.Pointer(T))
-		v := (*structType)(unsafe.Pointer(V))
-		if len(t.fields) != len(v.fields) {
-			return false
-		}
-		for i := range t.fields {
-			tf := &t.fields[i]
-			vf := &v.fields[i]
-			if tf.name != vf.name && (tf.name == nil || vf.name == nil || *tf.name != *vf.name) {
-				return false
-			}
-			if tf.pkgPath != vf.pkgPath && (tf.pkgPath == nil || vf.pkgPath == nil || *tf.pkgPath != *vf.pkgPath) {
-				return false
-			}
-			if tf.typ != vf.typ {
-				return false
-			}
-			if tf.tag != vf.tag && (tf.tag == nil || vf.tag == nil || *tf.tag != *vf.tag) {
-				return false
-			}
-			if tf.offset != vf.offset {
-				return false
-			}
-		}
-		return true
-	}
-
-	return false
-}
-
-// The lookupCache caches ChanOf, MapOf, and SliceOf lookups.
-var lookupCache struct {
-	sync.RWMutex
-	m map[cacheKey]*rtype
-}
-
-// A cacheKey is the key for use in the lookupCache.
-// Four values describe any of the types we are looking for:
-// type kind, one or two subtypes, and an extra integer.
-type cacheKey struct {
-	kind  Kind
-	t1    *rtype
-	t2    *rtype
-	extra uintptr
-}
-
-// cacheGet looks for a type under the key k in the lookupCache.
-// If it finds one, it returns that type.
-// If not, it returns nil with the cache locked.
-// The caller is expected to use cachePut to unlock the cache.
-func cacheGet(k cacheKey) Type {
-	lookupCache.RLock()
-	t := lookupCache.m[k]
-	lookupCache.RUnlock()
-	if t != nil {
-		return t
-	}
-
-	lookupCache.Lock()
-	t = lookupCache.m[k]
-	if t != nil {
-		lookupCache.Unlock()
-		return t
-	}
-
-	if lookupCache.m == nil {
-		lookupCache.m = make(map[cacheKey]*rtype)
-	}
-
-	return nil
-}
-
-// cachePut stores the given type in the cache, unlocks the cache,
-// and returns the type. It is expected that the cache is locked
-// because cacheGet returned nil.
-func cachePut(k cacheKey, t *rtype) Type {
-	t = toType(t).common()
-	lookupCache.m[k] = t
-	lookupCache.Unlock()
-	return t
-}
-
-// garbage collection bytecode program for chan.
-// See ../../cmd/gc/reflect.c:/^dgcsym1 and :/^dgcsym.
-type chanGC struct {
-	width uintptr // sizeof(map)
-	op    uintptr // _GC_CHAN_PTR
-	off   uintptr // 0
-	typ   *rtype  // map type
-	end   uintptr // _GC_END
-}
-
-// The funcLookupCache caches FuncOf lookups.
-// FuncOf does not share the common lookupCache since cacheKey is not
-// sufficient to represent functions unambiguously.
-var funcLookupCache struct {
-	sync.RWMutex
-	m map[uint32][]*rtype // keyed by hash calculated in FuncOf
-}
-
-// ChanOf returns the channel type with the given direction and element type.
-// For example, if t represents int, ChanOf(RecvDir, t) represents <-chan int.
-//
-// The gc runtime imposes a limit of 64 kB on channel element types.
-// If t's size is equal to or exceeds this limit, ChanOf panics.
-func ChanOf(dir ChanDir, t Type) Type {
-	typ := t.(*rtype)
-
-	// Look in cache.
-	ckey := cacheKey{Chan, typ, nil, uintptr(dir)}
-	if ch := cacheGet(ckey); ch != nil {
-		return ch
-	}
-
-	// This restriction is imposed by the gc compiler and the runtime.
-	if typ.size >= 1<<16 {
-		lookupCache.Unlock()
-		panic("reflect.ChanOf: element size too large")
-	}
-
-	// Look in known types.
-	// TODO: Precedence when constructing string.
-	var s string
-	switch dir {
-	default:
-		lookupCache.Unlock()
-		panic("reflect.ChanOf: invalid dir")
-	case SendDir:
-		s = "chan<- " + *typ.string
-	case RecvDir:
-		s = "<-chan " + *typ.string
-	case BothDir:
-		s = "chan " + *typ.string
-	}
-
-	// Make a channel type.
-	var ichan interface{} = (chan unsafe.Pointer)(nil)
-	prototype := *(**chanType)(unsafe.Pointer(&ichan))
-	ch := new(chanType)
-	*ch = *prototype
-	ch.dir = uintptr(dir)
-	ch.string = &s
-
-	// gccgo uses a different hash.
-	// ch.hash = fnv1(typ.hash, 'c', byte(dir))
-	ch.hash = 0
-	if dir&SendDir != 0 {
-		ch.hash += 1
-	}
-	if dir&RecvDir != 0 {
-		ch.hash += 2
-	}
-	ch.hash += typ.hash << 2
-	ch.hash <<= 3
-	ch.hash += 15
-
-	ch.elem = typ
-	ch.uncommonType = nil
-	ch.ptrToThis = nil
-
-	ch.gc = unsafe.Pointer(&chanGC{
-		width: ch.size,
-		op:    _GC_CHAN_PTR,
-		off:   0,
-		typ:   &ch.rtype,
-		end:   _GC_END,
-	})
-
-	// INCORRECT. Uncomment to check that TestChanOfGC fails when ch.gc is wrong.
-	// ch.gc = unsafe.Pointer(&badGC{width: ch.size, end: _GC_END})
-
-	return cachePut(ckey, &ch.rtype)
-}
-
-func ismapkey(*rtype) bool // implemented in runtime
-
-// MapOf returns the map type with the given key and element types.
-// For example, if k represents int and e represents string,
-// MapOf(k, e) represents map[int]string.
-//
-// If the key type is not a valid map key type (that is, if it does
-// not implement Go's == operator), MapOf panics.
-func MapOf(key, elem Type) Type {
-	ktyp := key.(*rtype)
-	etyp := elem.(*rtype)
-
-	if !ismapkey(ktyp) {
-		panic("reflect.MapOf: invalid key type " + ktyp.String())
-	}
-
-	// Look in cache.
-	ckey := cacheKey{Map, ktyp, etyp, 0}
-	if mt := cacheGet(ckey); mt != nil {
-		return mt
-	}
-
-	// Look in known types.
-	s := "map[" + *ktyp.string + "]" + *etyp.string
-
-	// Make a map type.
-	var imap interface{} = (map[unsafe.Pointer]unsafe.Pointer)(nil)
-	mt := new(mapType)
-	*mt = **(**mapType)(unsafe.Pointer(&imap))
-	mt.string = &s
-
-	// gccgo uses a different hash
-	// mt.hash = fnv1(etyp.hash, 'm', byte(ktyp.hash>>24), byte(ktyp.hash>>16), byte(ktyp.hash>>8), byte(ktyp.hash))
-	mt.hash = ktyp.hash + etyp.hash + 2 + 14
-
-	mt.key = ktyp
-	mt.elem = etyp
-	mt.uncommonType = nil
-	mt.ptrToThis = nil
-	// mt.gc = unsafe.Pointer(&ptrGC{
-	// 	width:  unsafe.Sizeof(uintptr(0)),
-	// 	op:     _GC_PTR,
-	// 	off:    0,
-	// 	elemgc: nil,
-	// 	end:    _GC_END,
-	// })
-
-	// TODO(cmang): Generate GC data for Map elements.
-	mt.gc = unsafe.Pointer(&ptrDataGCProg)
-
-	// INCORRECT. Uncomment to check that TestMapOfGC and TestMapOfGCValues
-	// fail when mt.gc is wrong.
-	//mt.gc = unsafe.Pointer(&badGC{width: mt.size, end: _GC_END})
-
-	return cachePut(ckey, &mt.rtype)
-}
-
-// FuncOf returns the function type with the given argument and result types.
-// For example if k represents int and e represents string,
-// FuncOf([]Type{k}, []Type{e}, false) represents func(int) string.
-//
-// The variadic argument controls whether the function is variadic. FuncOf
-// panics if the in[len(in)-1] does not represent a slice and variadic is
-// true.
-func FuncOf(in, out []Type, variadic bool) Type {
-	if variadic && (len(in) == 0 || in[len(in)-1].Kind() != Slice) {
-		panic("reflect.FuncOf: last arg of variadic func must be slice")
-	}
-
-	// Make a func type.
-	var ifunc interface{} = (func())(nil)
-	prototype := *(**funcType)(unsafe.Pointer(&ifunc))
-	ft := new(funcType)
-	*ft = *prototype
-
-	// Build a hash and minimally populate ft.
-	var hash uint32 = 8
-	var fin, fout []*rtype
-	shift := uint(1)
-	for _, in := range in {
-		t := in.(*rtype)
-		fin = append(fin, t)
-		hash += t.hash << shift
-		shift++
-	}
-	shift = 2
-	for _, out := range out {
-		t := out.(*rtype)
-		fout = append(fout, t)
-		hash += t.hash << shift
-		shift++
-	}
-	if variadic {
-		hash++
-	}
-	hash <<= 4
-	ft.hash = hash
-	ft.in = fin
-	ft.out = fout
-	ft.dotdotdot = variadic
-
-	// Look in cache.
-	funcLookupCache.RLock()
-	for _, t := range funcLookupCache.m[hash] {
-		if haveIdenticalUnderlyingType(&ft.rtype, t) {
-			funcLookupCache.RUnlock()
-			return t
-		}
-	}
-	funcLookupCache.RUnlock()
-
-	// Not in cache, lock and retry.
-	funcLookupCache.Lock()
-	defer funcLookupCache.Unlock()
-	if funcLookupCache.m == nil {
-		funcLookupCache.m = make(map[uint32][]*rtype)
-	}
-	for _, t := range funcLookupCache.m[hash] {
-		if haveIdenticalUnderlyingType(&ft.rtype, t) {
-			return t
-		}
-	}
-
-	str := funcStr(ft)
-
-	// Populate the remaining fields of ft and store in cache.
-	ft.string = &str
-	ft.uncommonType = nil
-	ft.ptrToThis = nil
-
-	// TODO(cmang): Generate GC data for funcs.
-	ft.gc = unsafe.Pointer(&ptrDataGCProg)
-
-	funcLookupCache.m[hash] = append(funcLookupCache.m[hash], &ft.rtype)
-
-	return toType(&ft.rtype)
-}
-
-// funcStr builds a string representation of a funcType.
-func funcStr(ft *funcType) string {
-	repr := make([]byte, 0, 64)
-	repr = append(repr, "func("...)
-	for i, t := range ft.in {
-		if i > 0 {
-			repr = append(repr, ", "...)
-		}
-		if ft.dotdotdot && i == len(ft.in)-1 {
-			repr = append(repr, "..."...)
-			repr = append(repr, *(*sliceType)(unsafe.Pointer(t)).elem.string...)
-		} else {
-			repr = append(repr, *t.string...)
-		}
-	}
-	repr = append(repr, ')')
-	if l := len(ft.out); l == 1 {
-		repr = append(repr, ' ')
-	} else if l > 1 {
-		repr = append(repr, " ("...)
-	}
-	for i, t := range ft.out {
-		if i > 0 {
-			repr = append(repr, ", "...)
-		}
-		repr = append(repr, *t.string...)
-	}
-	if len(ft.out) > 1 {
-		repr = append(repr, ')')
-	}
-	return string(repr)
-}
-
-// isReflexive reports whether the == operation on the type is reflexive.
-// That is, x == x for all values x of type t.
-func isReflexive(t *rtype) bool {
-	switch t.Kind() {
-	case Bool, Int, Int8, Int16, Int32, Int64, Uint, Uint8, Uint16, Uint32, Uint64, Uintptr, Chan, Ptr, String, UnsafePointer:
-		return true
-	case Float32, Float64, Complex64, Complex128, Interface:
-		return false
-	case Array:
-		tt := (*arrayType)(unsafe.Pointer(t))
-		return isReflexive(tt.elem)
-	case Struct:
-		tt := (*structType)(unsafe.Pointer(t))
-		for _, f := range tt.fields {
-			if !isReflexive(f.typ) {
-				return false
-			}
-		}
-		return true
-	default:
-		// Func, Map, Slice, Invalid
-		panic("isReflexive called on non-key type " + t.String())
-	}
-}
-
-// Make sure these routines stay in sync with ../../runtime/hashmap.go!
-// These types exist only for GC, so we only fill out GC relevant info.
-// Currently, that's just size and the GC program.  We also fill in string
-// for possible debugging use.
-const (
-	bucketSize uintptr = 8
-	maxKeySize uintptr = 128
-	maxValSize uintptr = 128
-)
-
-func bucketOf(ktyp, etyp *rtype) *rtype {
-	// See comment on hmap.overflow in ../runtime/hashmap.go.
-	var kind uint8
-	if ktyp.kind&kindNoPointers != 0 && etyp.kind&kindNoPointers != 0 &&
-		ktyp.size <= maxKeySize && etyp.size <= maxValSize {
-		kind = kindNoPointers
-	}
-
-	if ktyp.size > maxKeySize {
-		ktyp = PtrTo(ktyp).(*rtype)
-	}
-	if etyp.size > maxValSize {
-		etyp = PtrTo(etyp).(*rtype)
-	}
-
-	// Prepare GC data if any.
-	// A bucket is at most bucketSize*(1+maxKeySize+maxValSize)+2*ptrSize bytes,
-	// or 2072 bytes, or 259 pointer-size words, or 33 bytes of pointer bitmap.
-	// Normally the enforced limit on pointer maps is 16 bytes,
-	// but larger ones are acceptable, 33 bytes isn't too too big,
-	// and it's easier to generate a pointer bitmap than a GC program.
-	// Note that since the key and value are known to be <= 128 bytes,
-	// they're guaranteed to have bitmaps instead of GC programs.
-	// var gcdata *byte
-	var ptrdata uintptr
-	var overflowPad uintptr
-
-	// On NaCl, pad if needed to make overflow end at the proper struct alignment.
-	// On other systems, align > ptrSize is not possible.
-	if runtime.GOARCH == "amd64p32" && (ktyp.align > ptrSize || etyp.align > ptrSize) {
-		overflowPad = ptrSize
-	}
-	size := bucketSize*(1+ktyp.size+etyp.size) + overflowPad + ptrSize
-	if size&uintptr(ktyp.align-1) != 0 || size&uintptr(etyp.align-1) != 0 {
-		panic("reflect: bad size computation in MapOf")
-	}
-
-	if kind != kindNoPointers {
-		nptr := (bucketSize*(1+ktyp.size+etyp.size) + ptrSize) / ptrSize
-		mask := make([]byte, (nptr+7)/8)
-		base := bucketSize / ptrSize
-
-		if ktyp.kind&kindNoPointers == 0 {
-			if ktyp.kind&kindGCProg != 0 {
-				panic("reflect: unexpected GC program in MapOf")
-			}
-			kmask := (*[16]byte)(unsafe.Pointer( /*ktyp.gcdata*/ nil))
-			for i := uintptr(0); i < ktyp.size/ptrSize; i++ {
-				if (kmask[i/8]>>(i%8))&1 != 0 {
-					for j := uintptr(0); j < bucketSize; j++ {
-						word := base + j*ktyp.size/ptrSize + i
-						mask[word/8] |= 1 << (word % 8)
-					}
-				}
-			}
-		}
-		base += bucketSize * ktyp.size / ptrSize
-
-		if etyp.kind&kindNoPointers == 0 {
-			if etyp.kind&kindGCProg != 0 {
-				panic("reflect: unexpected GC program in MapOf")
-			}
-			emask := (*[16]byte)(unsafe.Pointer( /*etyp.gcdata*/ nil))
-			for i := uintptr(0); i < etyp.size/ptrSize; i++ {
-				if (emask[i/8]>>(i%8))&1 != 0 {
-					for j := uintptr(0); j < bucketSize; j++ {
-						word := base + j*etyp.size/ptrSize + i
-						mask[word/8] |= 1 << (word % 8)
-					}
-				}
-			}
-		}
-		base += bucketSize * etyp.size / ptrSize
-		base += overflowPad / ptrSize
-
-		word := base
-		mask[word/8] |= 1 << (word % 8)
-		// gcdata = &mask[0]
-		ptrdata = (word + 1) * ptrSize
-
-		// overflow word must be last
-		if ptrdata != size {
-			panic("reflect: bad layout computation in MapOf")
-		}
-	}
-
-	b := new(rtype)
-	// b.size = gc.size
-	// b.gc[0], _ = gc.finalize()
-	b.kind |= kindGCProg
-	s := "bucket(" + *ktyp.string + "," + *etyp.string + ")"
-	b.string = &s
-	return b
-}
-
-// Take the GC program for "t" and append it to the GC program "gc".
-func appendGCProgram(gc []uintptr, t *rtype) []uintptr {
-	p := t.gc
-	p = unsafe.Pointer(uintptr(p) + unsafe.Sizeof(uintptr(0))) // skip size
-loop:
-	for {
-		var argcnt int
-		switch *(*uintptr)(p) {
-		case _GC_END:
-			// Note: _GC_END not included in append
-			break loop
-		case _GC_ARRAY_NEXT:
-			argcnt = 0
-		case _GC_APTR, _GC_STRING, _GC_EFACE, _GC_IFACE:
-			argcnt = 1
-		case _GC_PTR, _GC_CALL, _GC_CHAN_PTR, _GC_SLICE:
-			argcnt = 2
-		case _GC_ARRAY_START, _GC_REGION:
-			argcnt = 3
-		default:
-			panic("unknown GC program op for " + *t.string + ": " + strconv.FormatUint(*(*uint64)(p), 10))
-		}
-		for i := 0; i < argcnt+1; i++ {
-			gc = append(gc, *(*uintptr)(p))
-			p = unsafe.Pointer(uintptr(p) + unsafe.Sizeof(uintptr(0)))
-		}
-	}
-	return gc
-}
-func hMapOf(bucket *rtype) *rtype {
-	ptrsize := unsafe.Sizeof(uintptr(0))
-
-	// make gc program & compute hmap size
-	gc := make([]uintptr, 1)           // first entry is size, filled in at the end
-	offset := unsafe.Sizeof(uint(0))   // count
-	offset += unsafe.Sizeof(uint32(0)) // flags
-	offset += unsafe.Sizeof(uint32(0)) // hash0
-	offset += unsafe.Sizeof(uint8(0))  // B
-	offset += unsafe.Sizeof(uint8(0))  // keysize
-	offset += unsafe.Sizeof(uint8(0))  // valuesize
-	offset = (offset + 1) / 2 * 2
-	offset += unsafe.Sizeof(uint16(0)) // bucketsize
-	offset = (offset + ptrsize - 1) / ptrsize * ptrsize
-	// gc = append(gc, _GC_PTR, offset, uintptr(bucket.gc)) // buckets
-	offset += ptrsize
-	// gc = append(gc, _GC_PTR, offset, uintptr(bucket.gc)) // oldbuckets
-	offset += ptrsize
-	offset += ptrsize // nevacuate
-	gc = append(gc, _GC_END)
-	gc[0] = offset
-
-	h := new(rtype)
-	h.size = offset
-	// h.gc = unsafe.Pointer(&gc[0])
-	s := "hmap(" + *bucket.string + ")"
-	h.string = &s
-	return h
-}
-
-// garbage collection bytecode program for slice of non-zero-length values.
-// See ../../cmd/gc/reflect.c:/^dgcsym1 and :/^dgcsym.
-type sliceGC struct {
-	width  uintptr        // sizeof(slice)
-	op     uintptr        // _GC_SLICE
-	off    uintptr        // 0
-	elemgc unsafe.Pointer // element gc program
-	end    uintptr        // _GC_END
-}
-
-// garbage collection bytecode program for slice of zero-length values.
-// See ../../cmd/gc/reflect.c:/^dgcsym1 and :/^dgcsym.
-type sliceEmptyGC struct {
-	width uintptr // sizeof(slice)
-	op    uintptr // _GC_APTR
-	off   uintptr // 0
-	end   uintptr // _GC_END
-}
-
-var sliceEmptyGCProg = sliceEmptyGC{
-	width: unsafe.Sizeof([]byte(nil)),
-	op:    _GC_APTR,
-	off:   0,
-	end:   _GC_END,
-}
-
-// SliceOf returns the slice type with element type t.
-// For example, if t represents int, SliceOf(t) represents []int.
-func SliceOf(t Type) Type {
-	typ := t.(*rtype)
-
-	// Look in cache.
-	ckey := cacheKey{Slice, typ, nil, 0}
-	if slice := cacheGet(ckey); slice != nil {
-		return slice
-	}
-
-	// Look in known types.
-	s := "[]" + *typ.string
-
-	// Make a slice type.
-	var islice interface{} = ([]unsafe.Pointer)(nil)
-	prototype := *(**sliceType)(unsafe.Pointer(&islice))
-	slice := new(sliceType)
-	*slice = *prototype
-	slice.string = &s
-
-	// gccgo uses a different hash.
-	// slice.hash = fnv1(typ.hash, '[')
-	slice.hash = typ.hash + 1 + 13
-
-	slice.elem = typ
-	slice.uncommonType = nil
-	slice.ptrToThis = nil
-
-	if typ.size == 0 {
-		slice.gc = unsafe.Pointer(&sliceEmptyGCProg)
-	} else {
-		slice.gc = unsafe.Pointer(&sliceGC{
-			width:  slice.size,
-			op:     _GC_SLICE,
-			off:    0,
-			elemgc: typ.gc,
-			end:    _GC_END,
-		})
-	}
-
-	// INCORRECT. Uncomment to check that TestSliceOfOfGC fails when slice.gc is wrong.
-	// slice.gc = unsafe.Pointer(&badGC{width: slice.size, end: _GC_END})
-
-	return cachePut(ckey, &slice.rtype)
-}
-
-// See cmd/compile/internal/gc/reflect.go for derivation of constant.
-const maxPtrmaskBytes = 2048
-
-// ArrayOf returns the array type with the given count and element type.
-// For example, if t represents int, ArrayOf(5, t) represents [5]int.
-//
-// If the resulting type would be larger than the available address space,
-// ArrayOf panics.
-func ArrayOf(count int, elem Type) Type {
-	typ := elem.(*rtype)
-	// call SliceOf here as it calls cacheGet/cachePut.
-	// ArrayOf also calls cacheGet/cachePut and thus may modify the state of
-	// the lookupCache mutex.
-	slice := SliceOf(elem)
-
-	// Look in cache.
-	ckey := cacheKey{Array, typ, nil, uintptr(count)}
-	if array := cacheGet(ckey); array != nil {
-		return array
-	}
-
-	// Look in known types.
-	s := "[" + strconv.Itoa(count) + "]" + *typ.string
-
-	// Make an array type.
-	var iarray interface{} = [1]unsafe.Pointer{}
-	prototype := *(**arrayType)(unsafe.Pointer(&iarray))
-	array := new(arrayType)
-	*array = *prototype
-	array.string = &s
-
-	// gccgo uses a different hash.
-	// array.hash = fnv1(typ.hash, '[')
-	// for n := uint32(count); n > 0; n >>= 8 {
-	// 	array.hash = fnv1(array.hash, byte(n))
-	// }
-	// array.hash = fnv1(array.hash, ']')
-	array.hash = typ.hash + 1 + 13
-
-	array.elem = typ
-	max := ^uintptr(0) / typ.size
-	if uintptr(count) > max {
-		panic("reflect.ArrayOf: array size would exceed virtual address space")
-	}
-	array.size = typ.size * uintptr(count)
-	// if count > 0 && typ.ptrdata != 0 {
-	// 	array.ptrdata = typ.size*uintptr(count-1) + typ.ptrdata
-	// }
-	array.align = typ.align
-	array.fieldAlign = typ.fieldAlign
-	array.uncommonType = nil
-	array.ptrToThis = nil
-	array.len = uintptr(count)
-	array.slice = slice.(*rtype)
-
-	array.kind &^= kindNoPointers
-	switch {
-	case typ.kind&kindNoPointers != 0 || array.size == 0:
-		// No pointers.
-		array.kind |= kindNoPointers
-		gc := [...]uintptr{array.size, _GC_END}
-		array.gc = unsafe.Pointer(&gc[0])
-
-	case count == 1:
-		// In memory, 1-element array looks just like the element.
-		array.kind |= typ.kind & kindGCProg
-		array.gc = typ.gc
-
-	default:
-		gc := []uintptr{array.size, _GC_ARRAY_START, 0, uintptr(count), typ.size}
-		gc = appendGCProgram(gc, typ)
-		gc = append(gc, _GC_ARRAY_NEXT, _GC_END)
-		array.gc = unsafe.Pointer(&gc[0])
-	}
-
-	array.kind &^= kindDirectIface
-
-	array.hashfn = func(p unsafe.Pointer, size uintptr) uintptr {
-		ret := uintptr(0)
-		for i := 0; i < count; i++ {
-			ret *= 33
-			ret += typ.hashfn(p, typ.size)
-			p = unsafe.Pointer(uintptr(p) + typ.size)
-		}
-		return ret
-	}
-
-	array.equalfn = func(p1, p2 unsafe.Pointer, size uintptr) bool {
-		for i := 0; i < count; i++ {
-			if !typ.equalfn(p1, p2, typ.size) {
-				return false
-			}
-			p1 = unsafe.Pointer(uintptr(p1) + typ.size)
-			p2 = unsafe.Pointer(uintptr(p2) + typ.size)
-		}
-		return true
-	}
-
-	return cachePut(ckey, &array.rtype)
-}
-
-func appendVarint(x []byte, v uintptr) []byte {
-	for ; v >= 0x80; v >>= 7 {
-		x = append(x, byte(v|0x80))
-	}
-	x = append(x, byte(v))
-	return x
-}
-
-// toType converts from a *rtype to a Type that can be returned
-// to the client of package reflect. In gc, the only concern is that
-// a nil *rtype must be replaced by a nil Type, but in gccgo this
-// function takes care of ensuring that multiple *rtype for the same
-// type are coalesced into a single Type.
-var canonicalType = make(map[string]Type)
-
-var canonicalTypeLock sync.RWMutex
-
-func canonicalize(t Type) Type {
-	if t == nil {
-		return nil
-	}
-	s := t.rawString()
-	canonicalTypeLock.RLock()
-	if r, ok := canonicalType[s]; ok {
-		canonicalTypeLock.RUnlock()
-		return r
-	}
-	canonicalTypeLock.RUnlock()
-	canonicalTypeLock.Lock()
-	if r, ok := canonicalType[s]; ok {
-		canonicalTypeLock.Unlock()
-		return r
-	}
-	canonicalType[s] = t
-	canonicalTypeLock.Unlock()
-	return t
-}
-
-func toType(p *rtype) Type {
-	if p == nil {
-		return nil
-	}
-	return canonicalize(p)
-}
-
-// ifaceIndir reports whether t is stored indirectly in an interface value.
-func ifaceIndir(t *rtype) bool {
-	return t.kind&kindDirectIface == 0
-}
-
-// Layout matches runtime.BitVector (well enough).
-type bitVector struct {
-	n    uint32 // number of bits
-	data []byte
-}
-
-// append a bit to the bitmap.
-func (bv *bitVector) append(bit uint8) {
-	if bv.n%8 == 0 {
-		bv.data = append(bv.data, 0)
-	}
-	bv.data[bv.n/8] |= bit << (bv.n % 8)
-	bv.n++
-}
-
-func addTypeBits(bv *bitVector, offset uintptr, t *rtype) {
-	if t.kind&kindNoPointers != 0 {
-		return
-	}
-
-	switch Kind(t.kind & kindMask) {
-	case Chan, Func, Map, Ptr, Slice, String, UnsafePointer:
-		// 1 pointer at start of representation
-		for bv.n < uint32(offset/uintptr(ptrSize)) {
-			bv.append(0)
-		}
-		bv.append(1)
-
-	case Interface:
-		// 2 pointers
-		for bv.n < uint32(offset/uintptr(ptrSize)) {
-			bv.append(0)
-		}
-		bv.append(1)
-		bv.append(1)
-
-	case Array:
-		// repeat inner type
-		tt := (*arrayType)(unsafe.Pointer(t))
-		for i := 0; i < int(tt.len); i++ {
-			addTypeBits(bv, offset+uintptr(i)*tt.elem.size, tt.elem)
-		}
-
-	case Struct:
-		// apply fields
-		tt := (*structType)(unsafe.Pointer(t))
-		for i := range tt.fields {
-			f := &tt.fields[i]
-			addTypeBits(bv, offset+f.offset, f.typ)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/reflect/value.go b/third_party/gofrontend/libgo/go/reflect/value.go
deleted file mode 100644
index 8374370..0000000
--- a/third_party/gofrontend/libgo/go/reflect/value.go
+++ /dev/null
@@ -1,2380 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package reflect
-
-import (
-	"math"
-	"runtime"
-	"unsafe"
-)
-
-const ptrSize = 4 << (^uintptr(0) >> 63) // unsafe.Sizeof(uintptr(0)) but an ideal const
-const cannotSet = "cannot set value obtained from unexported struct field"
-
-// Value is the reflection interface to a Go value.
-//
-// Not all methods apply to all kinds of values.  Restrictions,
-// if any, are noted in the documentation for each method.
-// Use the Kind method to find out the kind of value before
-// calling kind-specific methods.  Calling a method
-// inappropriate to the kind of type causes a run time panic.
-//
-// The zero Value represents no value.
-// Its IsValid method returns false, its Kind method returns Invalid,
-// its String method returns "<invalid Value>", and all other methods panic.
-// Most functions and methods never return an invalid value.
-// If one does, its documentation states the conditions explicitly.
-//
-// A Value can be used concurrently by multiple goroutines provided that
-// the underlying Go value can be used concurrently for the equivalent
-// direct operations.
-//
-// Using == on two Values does not compare the underlying values
-// they represent, but rather the contents of the Value structs.
-// To compare two Values, compare the results of the Interface method.
-type Value struct {
-	// typ holds the type of the value represented by a Value.
-	typ *rtype
-
-	// Pointer-valued data or, if flagIndir is set, pointer to data.
-	// Valid when either flagIndir is set or typ.pointers() is true.
-	ptr unsafe.Pointer
-
-	// flag holds metadata about the value.
-	// The lowest bits are flag bits:
-	//	- flagStickyRO: obtained via unexported not embedded field, so read-only
-	//	- flagEmbedRO: obtained via unexported embedded field, so read-only
-	//	- flagIndir: val holds a pointer to the data
-	//	- flagAddr: v.CanAddr is true (implies flagIndir)
-	//	- flagMethod: v is a method value.
-	// The next five bits give the Kind of the value.
-	// This repeats typ.Kind() except for method values.
-	// The remaining 23+ bits give a method number for method values.
-	// If flag.kind() != Func, code can assume that flagMethod is unset.
-	// If ifaceIndir(typ), code can assume that flagIndir is set.
-	flag
-
-	// A method value represents a curried method invocation
-	// like r.Read for some receiver r.  The typ+val+flag bits describe
-	// the receiver r, but the flag's Kind bits say Func (methods are
-	// functions), and the top bits of the flag give the method number
-	// in r's type's method table.
-}
-
-type flag uintptr
-
-const (
-	flagKindWidth        = 5 // there are 27 kinds
-	flagKindMask    flag = 1<<flagKindWidth - 1
-	flagStickyRO    flag = 1 << 5
-	flagEmbedRO     flag = 1 << 6
-	flagIndir       flag = 1 << 7
-	flagAddr        flag = 1 << 8
-	flagMethod      flag = 1 << 9
-	flagMethodFn    flag = 1 << 10 // gccgo: first fn parameter is always pointer
-	flagMethodShift      = 11
-	flagRO          flag = flagStickyRO | flagEmbedRO
-)
-
-func (f flag) kind() Kind {
-	return Kind(f & flagKindMask)
-}
-
-// pointer returns the underlying pointer represented by v.
-// v.Kind() must be Ptr, Map, Chan, Func, or UnsafePointer
-func (v Value) pointer() unsafe.Pointer {
-	if v.typ.size != ptrSize || !v.typ.pointers() {
-		panic("can't call pointer on a non-pointer Value")
-	}
-	if v.flag&flagIndir != 0 {
-		return *(*unsafe.Pointer)(v.ptr)
-	}
-	return v.ptr
-}
-
-// packEface converts v to the empty interface.
-func packEface(v Value) interface{} {
-	t := v.typ
-	var i interface{}
-	e := (*emptyInterface)(unsafe.Pointer(&i))
-	// First, fill in the data portion of the interface.
-	switch {
-	case ifaceIndir(t):
-		if v.flag&flagIndir == 0 {
-			panic("bad indir")
-		}
-		// Value is indirect, and so is the interface we're making.
-		ptr := v.ptr
-		if v.flag&flagAddr != 0 {
-			// TODO: pass safe boolean from valueInterface so
-			// we don't need to copy if safe==true?
-			c := unsafe_New(t)
-			typedmemmove(t, c, ptr)
-			ptr = c
-		}
-		e.word = ptr
-	case v.flag&flagIndir != 0:
-		// Value is indirect, but interface is direct.  We need
-		// to load the data at v.ptr into the interface data word.
-		e.word = *(*unsafe.Pointer)(v.ptr)
-	default:
-		// Value is direct, and so is the interface.
-		e.word = v.ptr
-	}
-	// Now, fill in the type portion.  We're very careful here not
-	// to have any operation between the e.word and e.typ assignments
-	// that would let the garbage collector observe the partially-built
-	// interface value.
-	e.typ = t
-	return i
-}
-
-// unpackEface converts the empty interface i to a Value.
-func unpackEface(i interface{}) Value {
-	e := (*emptyInterface)(unsafe.Pointer(&i))
-	// NOTE: don't read e.word until we know whether it is really a pointer or not.
-	t := e.typ
-	if t == nil {
-		return Value{}
-	}
-	f := flag(t.Kind())
-	if ifaceIndir(t) {
-		f |= flagIndir
-	}
-	return Value{t, unsafe.Pointer(e.word), f}
-}
-
-// A ValueError occurs when a Value method is invoked on
-// a Value that does not support it.  Such cases are documented
-// in the description of each method.
-type ValueError struct {
-	Method string
-	Kind   Kind
-}
-
-func (e *ValueError) Error() string {
-	if e.Kind == 0 {
-		return "reflect: call of " + e.Method + " on zero Value"
-	}
-	return "reflect: call of " + e.Method + " on " + e.Kind.String() + " Value"
-}
-
-// methodName returns the name of the calling method,
-// assumed to be two stack frames above.
-func methodName() string {
-	pc, _, _, _ := runtime.Caller(2)
-	f := runtime.FuncForPC(pc)
-	if f == nil {
-		return "unknown method"
-	}
-	return f.Name()
-}
-
-// emptyInterface is the header for an interface{} value.
-type emptyInterface struct {
-	typ  *rtype
-	word unsafe.Pointer
-}
-
-// nonEmptyInterface is the header for a interface value with methods.
-type nonEmptyInterface struct {
-	// see ../runtime/iface.go:/Itab
-	itab *struct {
-		typ *rtype                 // dynamic concrete type
-		fun [100000]unsafe.Pointer // method table
-	}
-	word unsafe.Pointer
-}
-
-// mustBe panics if f's kind is not expected.
-// Making this a method on flag instead of on Value
-// (and embedding flag in Value) means that we can write
-// the very clear v.mustBe(Bool) and have it compile into
-// v.flag.mustBe(Bool), which will only bother to copy the
-// single important word for the receiver.
-func (f flag) mustBe(expected Kind) {
-	if f.kind() != expected {
-		panic(&ValueError{methodName(), f.kind()})
-	}
-}
-
-// mustBeExported panics if f records that the value was obtained using
-// an unexported field.
-func (f flag) mustBeExported() {
-	if f == 0 {
-		panic(&ValueError{methodName(), 0})
-	}
-	if f&flagRO != 0 {
-		panic("reflect: " + methodName() + " using value obtained using unexported field")
-	}
-}
-
-// mustBeAssignable panics if f records that the value is not assignable,
-// which is to say that either it was obtained using an unexported field
-// or it is not addressable.
-func (f flag) mustBeAssignable() {
-	if f == 0 {
-		panic(&ValueError{methodName(), Invalid})
-	}
-	// Assignable if addressable and not read-only.
-	if f&flagRO != 0 {
-		panic("reflect: " + methodName() + " using value obtained using unexported field")
-	}
-	if f&flagAddr == 0 {
-		panic("reflect: " + methodName() + " using unaddressable value")
-	}
-}
-
-// Addr returns a pointer value representing the address of v.
-// It panics if CanAddr() returns false.
-// Addr is typically used to obtain a pointer to a struct field
-// or slice element in order to call a method that requires a
-// pointer receiver.
-func (v Value) Addr() Value {
-	if v.flag&flagAddr == 0 {
-		panic("reflect.Value.Addr of unaddressable value")
-	}
-	return Value{v.typ.ptrTo(), v.ptr, (v.flag & flagRO) | flag(Ptr)}
-}
-
-// Bool returns v's underlying value.
-// It panics if v's kind is not Bool.
-func (v Value) Bool() bool {
-	v.mustBe(Bool)
-	return *(*bool)(v.ptr)
-}
-
-// Bytes returns v's underlying value.
-// It panics if v's underlying value is not a slice of bytes.
-func (v Value) Bytes() []byte {
-	v.mustBe(Slice)
-	if v.typ.Elem().Kind() != Uint8 {
-		panic("reflect.Value.Bytes of non-byte slice")
-	}
-	// Slice is always bigger than a word; assume flagIndir.
-	return *(*[]byte)(v.ptr)
-}
-
-// runes returns v's underlying value.
-// It panics if v's underlying value is not a slice of runes (int32s).
-func (v Value) runes() []rune {
-	v.mustBe(Slice)
-	if v.typ.Elem().Kind() != Int32 {
-		panic("reflect.Value.Bytes of non-rune slice")
-	}
-	// Slice is always bigger than a word; assume flagIndir.
-	return *(*[]rune)(v.ptr)
-}
-
-// CanAddr reports whether the value's address can be obtained with Addr.
-// Such values are called addressable.  A value is addressable if it is
-// an element of a slice, an element of an addressable array,
-// a field of an addressable struct, or the result of dereferencing a pointer.
-// If CanAddr returns false, calling Addr will panic.
-func (v Value) CanAddr() bool {
-	return v.flag&flagAddr != 0
-}
-
-// CanSet reports whether the value of v can be changed.
-// A Value can be changed only if it is addressable and was not
-// obtained by the use of unexported struct fields.
-// If CanSet returns false, calling Set or any type-specific
-// setter (e.g., SetBool, SetInt) will panic.
-func (v Value) CanSet() bool {
-	return v.flag&(flagAddr|flagRO) == flagAddr
-}
-
-// Call calls the function v with the input arguments in.
-// For example, if len(in) == 3, v.Call(in) represents the Go call v(in[0], in[1], in[2]).
-// Call panics if v's Kind is not Func.
-// It returns the output results as Values.
-// As in Go, each input argument must be assignable to the
-// type of the function's corresponding input parameter.
-// If v is a variadic function, Call creates the variadic slice parameter
-// itself, copying in the corresponding values.
-func (v Value) Call(in []Value) []Value {
-	v.mustBe(Func)
-	v.mustBeExported()
-	return v.call("Call", in)
-}
-
-// CallSlice calls the variadic function v with the input arguments in,
-// assigning the slice in[len(in)-1] to v's final variadic argument.
-// For example, if len(in) == 3, v.CallSlice(in) represents the Go call v(in[0], in[1], in[2]...).
-// CallSlice panics if v's Kind is not Func or if v is not variadic.
-// It returns the output results as Values.
-// As in Go, each input argument must be assignable to the
-// type of the function's corresponding input parameter.
-func (v Value) CallSlice(in []Value) []Value {
-	v.mustBe(Func)
-	v.mustBeExported()
-	return v.call("CallSlice", in)
-}
-
-var callGC bool // for testing; see TestCallMethodJump
-
-func (v Value) call(op string, in []Value) []Value {
-	// Get function pointer, type.
-	t := v.typ
-	var (
-		fn   unsafe.Pointer
-		rcvr Value
-	)
-	if v.flag&flagMethod != 0 {
-		rcvr = v
-		_, t, fn = methodReceiver(op, v, int(v.flag)>>flagMethodShift)
-	} else if v.flag&flagIndir != 0 {
-		fn = *(*unsafe.Pointer)(v.ptr)
-	} else {
-		fn = v.ptr
-	}
-
-	if fn == nil {
-		panic("reflect.Value.Call: call of nil function")
-	}
-
-	isSlice := op == "CallSlice"
-	n := t.NumIn()
-	if isSlice {
-		if !t.IsVariadic() {
-			panic("reflect: CallSlice of non-variadic function")
-		}
-		if len(in) < n {
-			panic("reflect: CallSlice with too few input arguments")
-		}
-		if len(in) > n {
-			panic("reflect: CallSlice with too many input arguments")
-		}
-	} else {
-		if t.IsVariadic() {
-			n--
-		}
-		if len(in) < n {
-			panic("reflect: Call with too few input arguments")
-		}
-		if !t.IsVariadic() && len(in) > n {
-			panic("reflect: Call with too many input arguments")
-		}
-	}
-	for _, x := range in {
-		if x.Kind() == Invalid {
-			panic("reflect: " + op + " using zero Value argument")
-		}
-	}
-	for i := 0; i < n; i++ {
-		if xt, targ := in[i].Type(), t.In(i); !xt.AssignableTo(targ) {
-			panic("reflect: " + op + " using " + xt.String() + " as type " + targ.String())
-		}
-	}
-	if !isSlice && t.IsVariadic() {
-		// prepare slice for remaining values
-		m := len(in) - n
-		slice := MakeSlice(t.In(n), m, m)
-		elem := t.In(n).Elem()
-		for i := 0; i < m; i++ {
-			x := in[n+i]
-			if xt := x.Type(); !xt.AssignableTo(elem) {
-				panic("reflect: cannot use " + xt.String() + " as type " + elem.String() + " in " + op)
-			}
-			slice.Index(i).Set(x)
-		}
-		origIn := in
-		in = make([]Value, n+1)
-		copy(in[:n], origIn)
-		in[n] = slice
-	}
-
-	nin := len(in)
-	if nin != t.NumIn() {
-		panic("reflect.Value.Call: wrong argument count")
-	}
-	nout := t.NumOut()
-
-	if v.flag&flagMethod != 0 {
-		nin++
-	}
-	firstPointer := len(in) > 0 && t.In(0).Kind() != Ptr && v.flag&flagMethodFn != 0
-	params := make([]unsafe.Pointer, nin)
-	off := 0
-	if v.flag&flagMethod != 0 {
-		// Hard-wired first argument.
-		p := new(unsafe.Pointer)
-		if rcvr.typ.Kind() == Interface {
-			*p = unsafe.Pointer((*nonEmptyInterface)(v.ptr).word)
-		} else if rcvr.typ.Kind() == Ptr || rcvr.typ.Kind() == UnsafePointer {
-			*p = rcvr.pointer()
-		} else {
-			*p = rcvr.ptr
-		}
-		params[0] = unsafe.Pointer(p)
-		off = 1
-	}
-	for i, pv := range in {
-		pv.mustBeExported()
-		targ := t.In(i).(*rtype)
-		pv = pv.assignTo("reflect.Value.Call", targ, nil)
-		if pv.flag&flagIndir == 0 {
-			p := new(unsafe.Pointer)
-			*p = pv.ptr
-			params[off] = unsafe.Pointer(p)
-		} else {
-			params[off] = pv.ptr
-		}
-		if i == 0 && firstPointer {
-			p := new(unsafe.Pointer)
-			*p = params[off]
-			params[off] = unsafe.Pointer(p)
-		}
-		off++
-	}
-
-	ret := make([]Value, nout)
-	results := make([]unsafe.Pointer, nout)
-	for i := 0; i < nout; i++ {
-		v := New(t.Out(i))
-		results[i] = unsafe.Pointer(v.Pointer())
-		ret[i] = Indirect(v)
-	}
-
-	var pp *unsafe.Pointer
-	if len(params) > 0 {
-		pp = &params[0]
-	}
-	var pr *unsafe.Pointer
-	if len(results) > 0 {
-		pr = &results[0]
-	}
-
-	call(t, fn, v.flag&flagMethod != 0, firstPointer, pp, pr)
-
-	// For testing; see TestCallMethodJump.
-	if callGC {
-		runtime.GC()
-	}
-
-	return ret
-}
-
-// methodReceiver returns information about the receiver
-// described by v. The Value v may or may not have the
-// flagMethod bit set, so the kind cached in v.flag should
-// not be used.
-// The return value rcvrtype gives the method's actual receiver type.
-// The return value t gives the method type signature (without the receiver).
-// The return value fn is a pointer to the method code.
-func methodReceiver(op string, v Value, methodIndex int) (rcvrtype, t *rtype, fn unsafe.Pointer) {
-	i := methodIndex
-	if v.typ.Kind() == Interface {
-		tt := (*interfaceType)(unsafe.Pointer(v.typ))
-		if uint(i) >= uint(len(tt.methods)) {
-			panic("reflect: internal error: invalid method index")
-		}
-		m := &tt.methods[i]
-		if m.pkgPath != nil {
-			panic("reflect: " + op + " of unexported method")
-		}
-		iface := (*nonEmptyInterface)(v.ptr)
-		if iface.itab == nil {
-			panic("reflect: " + op + " of method on nil interface value")
-		}
-		rcvrtype = iface.itab.typ
-		fn = unsafe.Pointer(&iface.itab.fun[i])
-		t = m.typ
-	} else {
-		rcvrtype = v.typ
-		ut := v.typ.uncommon()
-		if ut == nil || uint(i) >= uint(len(ut.methods)) {
-			panic("reflect: internal error: invalid method index")
-		}
-		m := &ut.methods[i]
-		if m.pkgPath != nil {
-			panic("reflect: " + op + " of unexported method")
-		}
-		fn = unsafe.Pointer(&m.tfn)
-		t = m.mtyp
-	}
-	return
-}
-
-// v is a method receiver.  Store at p the word which is used to
-// encode that receiver at the start of the argument list.
-// Reflect uses the "interface" calling convention for
-// methods, which always uses one word to record the receiver.
-func storeRcvr(v Value, p unsafe.Pointer) {
-	t := v.typ
-	if t.Kind() == Interface {
-		// the interface data word becomes the receiver word
-		iface := (*nonEmptyInterface)(v.ptr)
-		*(*unsafe.Pointer)(p) = unsafe.Pointer(iface.word)
-	} else if v.flag&flagIndir != 0 && !ifaceIndir(t) {
-		*(*unsafe.Pointer)(p) = *(*unsafe.Pointer)(v.ptr)
-	} else {
-		*(*unsafe.Pointer)(p) = v.ptr
-	}
-}
-
-// align returns the result of rounding x up to a multiple of n.
-// n must be a power of two.
-func align(x, n uintptr) uintptr {
-	return (x + n - 1) &^ (n - 1)
-}
-
-// funcName returns the name of f, for use in error messages.
-func funcName(f func([]Value) []Value) string {
-	pc := *(*uintptr)(unsafe.Pointer(&f))
-	rf := runtime.FuncForPC(pc)
-	if rf != nil {
-		return rf.Name()
-	}
-	return "closure"
-}
-
-// Cap returns v's capacity.
-// It panics if v's Kind is not Array, Chan, or Slice.
-func (v Value) Cap() int {
-	k := v.kind()
-	switch k {
-	case Array:
-		return v.typ.Len()
-	case Chan:
-		return int(chancap(v.pointer()))
-	case Slice:
-		// Slice is always bigger than a word; assume flagIndir.
-		return (*sliceHeader)(v.ptr).Cap
-	}
-	panic(&ValueError{"reflect.Value.Cap", v.kind()})
-}
-
-// Close closes the channel v.
-// It panics if v's Kind is not Chan.
-func (v Value) Close() {
-	v.mustBe(Chan)
-	v.mustBeExported()
-	chanclose(v.pointer())
-}
-
-// Complex returns v's underlying value, as a complex128.
-// It panics if v's Kind is not Complex64 or Complex128
-func (v Value) Complex() complex128 {
-	k := v.kind()
-	switch k {
-	case Complex64:
-		return complex128(*(*complex64)(v.ptr))
-	case Complex128:
-		return *(*complex128)(v.ptr)
-	}
-	panic(&ValueError{"reflect.Value.Complex", v.kind()})
-}
-
-// Elem returns the value that the interface v contains
-// or that the pointer v points to.
-// It panics if v's Kind is not Interface or Ptr.
-// It returns the zero Value if v is nil.
-func (v Value) Elem() Value {
-	k := v.kind()
-	switch k {
-	case Interface:
-		var eface interface{}
-		if v.typ.NumMethod() == 0 {
-			eface = *(*interface{})(v.ptr)
-		} else {
-			eface = (interface{})(*(*interface {
-				M()
-			})(v.ptr))
-		}
-		x := unpackEface(eface)
-		if x.flag != 0 {
-			x.flag |= v.flag & flagRO
-		}
-		return x
-	case Ptr:
-		ptr := v.ptr
-		if v.flag&flagIndir != 0 {
-			ptr = *(*unsafe.Pointer)(ptr)
-		}
-		// The returned value's address is v's value.
-		if ptr == nil {
-			return Value{}
-		}
-		tt := (*ptrType)(unsafe.Pointer(v.typ))
-		typ := tt.elem
-		fl := v.flag&flagRO | flagIndir | flagAddr
-		fl |= flag(typ.Kind())
-		return Value{typ, ptr, fl}
-	}
-	panic(&ValueError{"reflect.Value.Elem", v.kind()})
-}
-
-// Field returns the i'th field of the struct v.
-// It panics if v's Kind is not Struct or i is out of range.
-func (v Value) Field(i int) Value {
-	if v.kind() != Struct {
-		panic(&ValueError{"reflect.Value.Field", v.kind()})
-	}
-	tt := (*structType)(unsafe.Pointer(v.typ))
-	if uint(i) >= uint(len(tt.fields)) {
-		panic("reflect: Field index out of range")
-	}
-	field := &tt.fields[i]
-	typ := field.typ
-
-	// Inherit permission bits from v, but clear flagEmbedRO.
-	fl := v.flag&(flagStickyRO|flagIndir|flagAddr) | flag(typ.Kind())
-	// Using an unexported field forces flagRO.
-	if field.pkgPath != nil {
-		if field.name == nil {
-			fl |= flagEmbedRO
-		} else {
-			fl |= flagStickyRO
-		}
-	}
-	// Either flagIndir is set and v.ptr points at struct,
-	// or flagIndir is not set and v.ptr is the actual struct data.
-	// In the former case, we want v.ptr + offset.
-	// In the latter case, we must have field.offset = 0,
-	// so v.ptr + field.offset is still okay.
-	ptr := unsafe.Pointer(uintptr(v.ptr) + field.offset)
-	return Value{typ, ptr, fl}
-}
-
-// FieldByIndex returns the nested field corresponding to index.
-// It panics if v's Kind is not struct.
-func (v Value) FieldByIndex(index []int) Value {
-	if len(index) == 1 {
-		return v.Field(index[0])
-	}
-	v.mustBe(Struct)
-	for i, x := range index {
-		if i > 0 {
-			if v.Kind() == Ptr && v.typ.Elem().Kind() == Struct {
-				if v.IsNil() {
-					panic("reflect: indirection through nil pointer to embedded struct")
-				}
-				v = v.Elem()
-			}
-		}
-		v = v.Field(x)
-	}
-	return v
-}
-
-// FieldByName returns the struct field with the given name.
-// It returns the zero Value if no field was found.
-// It panics if v's Kind is not struct.
-func (v Value) FieldByName(name string) Value {
-	v.mustBe(Struct)
-	if f, ok := v.typ.FieldByName(name); ok {
-		return v.FieldByIndex(f.Index)
-	}
-	return Value{}
-}
-
-// FieldByNameFunc returns the struct field with a name
-// that satisfies the match function.
-// It panics if v's Kind is not struct.
-// It returns the zero Value if no field was found.
-func (v Value) FieldByNameFunc(match func(string) bool) Value {
-	if f, ok := v.typ.FieldByNameFunc(match); ok {
-		return v.FieldByIndex(f.Index)
-	}
-	return Value{}
-}
-
-// Float returns v's underlying value, as a float64.
-// It panics if v's Kind is not Float32 or Float64
-func (v Value) Float() float64 {
-	k := v.kind()
-	switch k {
-	case Float32:
-		return float64(*(*float32)(v.ptr))
-	case Float64:
-		return *(*float64)(v.ptr)
-	}
-	panic(&ValueError{"reflect.Value.Float", v.kind()})
-}
-
-var uint8Type = TypeOf(uint8(0)).(*rtype)
-
-// Index returns v's i'th element.
-// It panics if v's Kind is not Array, Slice, or String or i is out of range.
-func (v Value) Index(i int) Value {
-	switch v.kind() {
-	case Array:
-		tt := (*arrayType)(unsafe.Pointer(v.typ))
-		if uint(i) >= uint(tt.len) {
-			panic("reflect: array index out of range")
-		}
-		typ := tt.elem
-		offset := uintptr(i) * typ.size
-
-		// Either flagIndir is set and v.ptr points at array,
-		// or flagIndir is not set and v.ptr is the actual array data.
-		// In the former case, we want v.ptr + offset.
-		// In the latter case, we must be doing Index(0), so offset = 0,
-		// so v.ptr + offset is still okay.
-		val := unsafe.Pointer(uintptr(v.ptr) + offset)
-		fl := v.flag&(flagRO|flagIndir|flagAddr) | flag(typ.Kind()) // bits same as overall array
-		return Value{typ, val, fl}
-
-	case Slice:
-		// Element flag same as Elem of Ptr.
-		// Addressable, indirect, possibly read-only.
-		s := (*sliceHeader)(v.ptr)
-		if uint(i) >= uint(s.Len) {
-			panic("reflect: slice index out of range")
-		}
-		tt := (*sliceType)(unsafe.Pointer(v.typ))
-		typ := tt.elem
-		val := arrayAt(s.Data, i, typ.size)
-		fl := flagAddr | flagIndir | v.flag&flagRO | flag(typ.Kind())
-		return Value{typ, val, fl}
-
-	case String:
-		s := (*stringHeader)(v.ptr)
-		if uint(i) >= uint(s.Len) {
-			panic("reflect: string index out of range")
-		}
-		p := arrayAt(s.Data, i, 1)
-		fl := v.flag&flagRO | flag(Uint8) | flagIndir
-		return Value{uint8Type, p, fl}
-	}
-	panic(&ValueError{"reflect.Value.Index", v.kind()})
-}
-
-// Int returns v's underlying value, as an int64.
-// It panics if v's Kind is not Int, Int8, Int16, Int32, or Int64.
-func (v Value) Int() int64 {
-	k := v.kind()
-	p := v.ptr
-	switch k {
-	case Int:
-		return int64(*(*int)(p))
-	case Int8:
-		return int64(*(*int8)(p))
-	case Int16:
-		return int64(*(*int16)(p))
-	case Int32:
-		return int64(*(*int32)(p))
-	case Int64:
-		return int64(*(*int64)(p))
-	}
-	panic(&ValueError{"reflect.Value.Int", v.kind()})
-}
-
-// CanInterface reports whether Interface can be used without panicking.
-func (v Value) CanInterface() bool {
-	if v.flag == 0 {
-		panic(&ValueError{"reflect.Value.CanInterface", Invalid})
-	}
-	return v.flag&flagRO == 0
-}
-
-// Interface returns v's current value as an interface{}.
-// It is equivalent to:
-//	var i interface{} = (v's underlying value)
-// It panics if the Value was obtained by accessing
-// unexported struct fields.
-func (v Value) Interface() (i interface{}) {
-	return valueInterface(v, true)
-}
-
-func valueInterface(v Value, safe bool) interface{} {
-	if v.flag == 0 {
-		panic(&ValueError{"reflect.Value.Interface", 0})
-	}
-	if safe && v.flag&flagRO != 0 {
-		// Do not allow access to unexported values via Interface,
-		// because they might be pointers that should not be
-		// writable or methods or function that should not be callable.
-		panic("reflect.Value.Interface: cannot return value obtained from unexported field or method")
-	}
-	if v.flag&flagMethod != 0 {
-		v = makeMethodValue("Interface", v)
-	}
-
-	if v.flag&flagMethodFn != 0 {
-		if v.typ.Kind() != Func {
-			panic("reflect: MethodFn of non-Func")
-		}
-		ft := (*funcType)(unsafe.Pointer(v.typ))
-		if ft.in[0].Kind() != Ptr {
-			v = makeValueMethod(v)
-		}
-	}
-
-	if v.kind() == Interface {
-		// Special case: return the element inside the interface.
-		// Empty interface has one layout, all interfaces with
-		// methods have a second layout.
-		if v.NumMethod() == 0 {
-			return *(*interface{})(v.ptr)
-		}
-		return *(*interface {
-			M()
-		})(v.ptr)
-	}
-
-	// TODO: pass safe to packEface so we don't need to copy if safe==true?
-	return packEface(v)
-}
-
-// InterfaceData returns the interface v's value as a uintptr pair.
-// It panics if v's Kind is not Interface.
-func (v Value) InterfaceData() [2]uintptr {
-	// TODO: deprecate this
-	v.mustBe(Interface)
-	// We treat this as a read operation, so we allow
-	// it even for unexported data, because the caller
-	// has to import "unsafe" to turn it into something
-	// that can be abused.
-	// Interface value is always bigger than a word; assume flagIndir.
-	return *(*[2]uintptr)(v.ptr)
-}
-
-// IsNil reports whether its argument v is nil. The argument must be
-// a chan, func, interface, map, pointer, or slice value; if it is
-// not, IsNil panics. Note that IsNil is not always equivalent to a
-// regular comparison with nil in Go. For example, if v was created
-// by calling ValueOf with an uninitialized interface variable i,
-// i==nil will be true but v.IsNil will panic as v will be the zero
-// Value.
-func (v Value) IsNil() bool {
-	k := v.kind()
-	switch k {
-	case Chan, Func, Map, Ptr:
-		if v.flag&flagMethod != 0 {
-			return false
-		}
-		ptr := v.ptr
-		if v.flag&flagIndir != 0 {
-			ptr = *(*unsafe.Pointer)(ptr)
-		}
-		return ptr == nil
-	case Interface, Slice:
-		// Both interface and slice are nil if first word is 0.
-		// Both are always bigger than a word; assume flagIndir.
-		return *(*unsafe.Pointer)(v.ptr) == nil
-	}
-	panic(&ValueError{"reflect.Value.IsNil", v.kind()})
-}
-
-// IsValid reports whether v represents a value.
-// It returns false if v is the zero Value.
-// If IsValid returns false, all other methods except String panic.
-// Most functions and methods never return an invalid value.
-// If one does, its documentation states the conditions explicitly.
-func (v Value) IsValid() bool {
-	return v.flag != 0
-}
-
-// Kind returns v's Kind.
-// If v is the zero Value (IsValid returns false), Kind returns Invalid.
-func (v Value) Kind() Kind {
-	return v.kind()
-}
-
-// Len returns v's length.
-// It panics if v's Kind is not Array, Chan, Map, Slice, or String.
-func (v Value) Len() int {
-	k := v.kind()
-	switch k {
-	case Array:
-		tt := (*arrayType)(unsafe.Pointer(v.typ))
-		return int(tt.len)
-	case Chan:
-		return chanlen(v.pointer())
-	case Map:
-		return maplen(v.pointer())
-	case Slice:
-		// Slice is bigger than a word; assume flagIndir.
-		return (*sliceHeader)(v.ptr).Len
-	case String:
-		// String is bigger than a word; assume flagIndir.
-		return (*stringHeader)(v.ptr).Len
-	}
-	panic(&ValueError{"reflect.Value.Len", v.kind()})
-}
-
-// MapIndex returns the value associated with key in the map v.
-// It panics if v's Kind is not Map.
-// It returns the zero Value if key is not found in the map or if v represents a nil map.
-// As in Go, the key's value must be assignable to the map's key type.
-func (v Value) MapIndex(key Value) Value {
-	v.mustBe(Map)
-	tt := (*mapType)(unsafe.Pointer(v.typ))
-
-	// Do not require key to be exported, so that DeepEqual
-	// and other programs can use all the keys returned by
-	// MapKeys as arguments to MapIndex.  If either the map
-	// or the key is unexported, though, the result will be
-	// considered unexported.  This is consistent with the
-	// behavior for structs, which allow read but not write
-	// of unexported fields.
-	key = key.assignTo("reflect.Value.MapIndex", tt.key, nil)
-
-	var k unsafe.Pointer
-	if key.flag&flagIndir != 0 {
-		k = key.ptr
-	} else {
-		k = unsafe.Pointer(&key.ptr)
-	}
-	e := mapaccess(v.typ, v.pointer(), k)
-	if e == nil {
-		return Value{}
-	}
-	typ := tt.elem
-	fl := (v.flag | key.flag) & flagRO
-	fl |= flag(typ.Kind())
-	if ifaceIndir(typ) {
-		// Copy result so future changes to the map
-		// won't change the underlying value.
-		c := unsafe_New(typ)
-		typedmemmove(typ, c, e)
-		return Value{typ, c, fl | flagIndir}
-	} else {
-		return Value{typ, *(*unsafe.Pointer)(e), fl}
-	}
-}
-
-// MapKeys returns a slice containing all the keys present in the map,
-// in unspecified order.
-// It panics if v's Kind is not Map.
-// It returns an empty slice if v represents a nil map.
-func (v Value) MapKeys() []Value {
-	v.mustBe(Map)
-	tt := (*mapType)(unsafe.Pointer(v.typ))
-	keyType := tt.key
-
-	fl := v.flag&flagRO | flag(keyType.Kind())
-
-	m := v.pointer()
-	mlen := int(0)
-	if m != nil {
-		mlen = maplen(m)
-	}
-	it := mapiterinit(v.typ, m)
-	a := make([]Value, mlen)
-	var i int
-	for i = 0; i < len(a); i++ {
-		key := mapiterkey(it)
-		if key == nil {
-			// Someone deleted an entry from the map since we
-			// called maplen above.  It's a data race, but nothing
-			// we can do about it.
-			break
-		}
-		if ifaceIndir(keyType) {
-			// Copy result so future changes to the map
-			// won't change the underlying value.
-			c := unsafe_New(keyType)
-			typedmemmove(keyType, c, key)
-			a[i] = Value{keyType, c, fl | flagIndir}
-		} else {
-			a[i] = Value{keyType, *(*unsafe.Pointer)(key), fl}
-		}
-		mapiternext(it)
-	}
-	return a[:i]
-}
-
-// Method returns a function value corresponding to v's i'th method.
-// The arguments to a Call on the returned function should not include
-// a receiver; the returned function will always use v as the receiver.
-// Method panics if i is out of range or if v is a nil interface value.
-func (v Value) Method(i int) Value {
-	if v.typ == nil {
-		panic(&ValueError{"reflect.Value.Method", Invalid})
-	}
-	if v.flag&flagMethod != 0 || uint(i) >= uint(v.typ.NumMethod()) {
-		panic("reflect: Method index out of range")
-	}
-	if v.typ.Kind() == Interface && v.IsNil() {
-		panic("reflect: Method on nil interface value")
-	}
-	fl := v.flag & (flagStickyRO | flagIndir) // Clear flagEmbedRO
-	fl |= flag(Func)
-	fl |= flag(i)<<flagMethodShift | flagMethod
-	return Value{v.typ, v.ptr, fl}
-}
-
-// NumMethod returns the number of methods in the value's method set.
-func (v Value) NumMethod() int {
-	if v.typ == nil {
-		panic(&ValueError{"reflect.Value.NumMethod", Invalid})
-	}
-	if v.flag&flagMethod != 0 {
-		return 0
-	}
-	return v.typ.NumMethod()
-}
-
-// MethodByName returns a function value corresponding to the method
-// of v with the given name.
-// The arguments to a Call on the returned function should not include
-// a receiver; the returned function will always use v as the receiver.
-// It returns the zero Value if no method was found.
-func (v Value) MethodByName(name string) Value {
-	if v.typ == nil {
-		panic(&ValueError{"reflect.Value.MethodByName", Invalid})
-	}
-	if v.flag&flagMethod != 0 {
-		return Value{}
-	}
-	m, ok := v.typ.MethodByName(name)
-	if !ok {
-		return Value{}
-	}
-	return v.Method(m.Index)
-}
-
-// NumField returns the number of fields in the struct v.
-// It panics if v's Kind is not Struct.
-func (v Value) NumField() int {
-	v.mustBe(Struct)
-	tt := (*structType)(unsafe.Pointer(v.typ))
-	return len(tt.fields)
-}
-
-// OverflowComplex reports whether the complex128 x cannot be represented by v's type.
-// It panics if v's Kind is not Complex64 or Complex128.
-func (v Value) OverflowComplex(x complex128) bool {
-	k := v.kind()
-	switch k {
-	case Complex64:
-		return overflowFloat32(real(x)) || overflowFloat32(imag(x))
-	case Complex128:
-		return false
-	}
-	panic(&ValueError{"reflect.Value.OverflowComplex", v.kind()})
-}
-
-// OverflowFloat reports whether the float64 x cannot be represented by v's type.
-// It panics if v's Kind is not Float32 or Float64.
-func (v Value) OverflowFloat(x float64) bool {
-	k := v.kind()
-	switch k {
-	case Float32:
-		return overflowFloat32(x)
-	case Float64:
-		return false
-	}
-	panic(&ValueError{"reflect.Value.OverflowFloat", v.kind()})
-}
-
-func overflowFloat32(x float64) bool {
-	if x < 0 {
-		x = -x
-	}
-	return math.MaxFloat32 < x && x <= math.MaxFloat64
-}
-
-// OverflowInt reports whether the int64 x cannot be represented by v's type.
-// It panics if v's Kind is not Int, Int8, int16, Int32, or Int64.
-func (v Value) OverflowInt(x int64) bool {
-	k := v.kind()
-	switch k {
-	case Int, Int8, Int16, Int32, Int64:
-		bitSize := v.typ.size * 8
-		trunc := (x << (64 - bitSize)) >> (64 - bitSize)
-		return x != trunc
-	}
-	panic(&ValueError{"reflect.Value.OverflowInt", v.kind()})
-}
-
-// OverflowUint reports whether the uint64 x cannot be represented by v's type.
-// It panics if v's Kind is not Uint, Uintptr, Uint8, Uint16, Uint32, or Uint64.
-func (v Value) OverflowUint(x uint64) bool {
-	k := v.kind()
-	switch k {
-	case Uint, Uintptr, Uint8, Uint16, Uint32, Uint64:
-		bitSize := v.typ.size * 8
-		trunc := (x << (64 - bitSize)) >> (64 - bitSize)
-		return x != trunc
-	}
-	panic(&ValueError{"reflect.Value.OverflowUint", v.kind()})
-}
-
-// Pointer returns v's value as a uintptr.
-// It returns uintptr instead of unsafe.Pointer so that
-// code using reflect cannot obtain unsafe.Pointers
-// without importing the unsafe package explicitly.
-// It panics if v's Kind is not Chan, Func, Map, Ptr, Slice, or UnsafePointer.
-//
-// If v's Kind is Func, the returned pointer is an underlying
-// code pointer, but not necessarily enough to identify a
-// single function uniquely. The only guarantee is that the
-// result is zero if and only if v is a nil func Value.
-//
-// If v's Kind is Slice, the returned pointer is to the first
-// element of the slice.  If the slice is nil the returned value
-// is 0.  If the slice is empty but non-nil the return value is non-zero.
-func (v Value) Pointer() uintptr {
-	// TODO: deprecate
-	k := v.kind()
-	switch k {
-	case Chan, Map, Ptr, UnsafePointer:
-		return uintptr(v.pointer())
-	case Func:
-		p := v.pointer()
-		// Non-nil func value points at data block.
-		// First word of data block is actual code.
-		if p != nil {
-			p = *(*unsafe.Pointer)(p)
-		}
-		return uintptr(p)
-
-	case Slice:
-		return (*SliceHeader)(v.ptr).Data
-	}
-	panic(&ValueError{"reflect.Value.Pointer", v.kind()})
-}
-
-// Recv receives and returns a value from the channel v.
-// It panics if v's Kind is not Chan.
-// The receive blocks until a value is ready.
-// The boolean value ok is true if the value x corresponds to a send
-// on the channel, false if it is a zero value received because the channel is closed.
-func (v Value) Recv() (x Value, ok bool) {
-	v.mustBe(Chan)
-	v.mustBeExported()
-	return v.recv(false)
-}
-
-// internal recv, possibly non-blocking (nb).
-// v is known to be a channel.
-func (v Value) recv(nb bool) (val Value, ok bool) {
-	tt := (*chanType)(unsafe.Pointer(v.typ))
-	if ChanDir(tt.dir)&RecvDir == 0 {
-		panic("reflect: recv on send-only channel")
-	}
-	t := tt.elem
-	val = Value{t, nil, flag(t.Kind())}
-	var p unsafe.Pointer
-	if ifaceIndir(t) {
-		p = unsafe_New(t)
-		val.ptr = p
-		val.flag |= flagIndir
-	} else {
-		p = unsafe.Pointer(&val.ptr)
-	}
-	selected, ok := chanrecv(v.typ, v.pointer(), nb, p)
-	if !selected {
-		val = Value{}
-	}
-	return
-}
-
-// Send sends x on the channel v.
-// It panics if v's kind is not Chan or if x's type is not the same type as v's element type.
-// As in Go, x's value must be assignable to the channel's element type.
-func (v Value) Send(x Value) {
-	v.mustBe(Chan)
-	v.mustBeExported()
-	v.send(x, false)
-}
-
-// internal send, possibly non-blocking.
-// v is known to be a channel.
-func (v Value) send(x Value, nb bool) (selected bool) {
-	tt := (*chanType)(unsafe.Pointer(v.typ))
-	if ChanDir(tt.dir)&SendDir == 0 {
-		panic("reflect: send on recv-only channel")
-	}
-	x.mustBeExported()
-	x = x.assignTo("reflect.Value.Send", tt.elem, nil)
-	var p unsafe.Pointer
-	if x.flag&flagIndir != 0 {
-		p = x.ptr
-	} else {
-		p = unsafe.Pointer(&x.ptr)
-	}
-	return chansend(v.typ, v.pointer(), p, nb)
-}
-
-// Set assigns x to the value v.
-// It panics if CanSet returns false.
-// As in Go, x's value must be assignable to v's type.
-func (v Value) Set(x Value) {
-	v.mustBeAssignable()
-	x.mustBeExported() // do not let unexported x leak
-	var target unsafe.Pointer
-	if v.kind() == Interface {
-		target = v.ptr
-	}
-	x = x.assignTo("reflect.Set", v.typ, target)
-	if x.flag&flagIndir != 0 {
-		typedmemmove(v.typ, v.ptr, x.ptr)
-	} else {
-		*(*unsafe.Pointer)(v.ptr) = x.ptr
-	}
-}
-
-// SetBool sets v's underlying value.
-// It panics if v's Kind is not Bool or if CanSet() is false.
-func (v Value) SetBool(x bool) {
-	v.mustBeAssignable()
-	v.mustBe(Bool)
-	*(*bool)(v.ptr) = x
-}
-
-// SetBytes sets v's underlying value.
-// It panics if v's underlying value is not a slice of bytes.
-func (v Value) SetBytes(x []byte) {
-	v.mustBeAssignable()
-	v.mustBe(Slice)
-	if v.typ.Elem().Kind() != Uint8 {
-		panic("reflect.Value.SetBytes of non-byte slice")
-	}
-	*(*[]byte)(v.ptr) = x
-}
-
-// setRunes sets v's underlying value.
-// It panics if v's underlying value is not a slice of runes (int32s).
-func (v Value) setRunes(x []rune) {
-	v.mustBeAssignable()
-	v.mustBe(Slice)
-	if v.typ.Elem().Kind() != Int32 {
-		panic("reflect.Value.setRunes of non-rune slice")
-	}
-	*(*[]rune)(v.ptr) = x
-}
-
-// SetComplex sets v's underlying value to x.
-// It panics if v's Kind is not Complex64 or Complex128, or if CanSet() is false.
-func (v Value) SetComplex(x complex128) {
-	v.mustBeAssignable()
-	switch k := v.kind(); k {
-	default:
-		panic(&ValueError{"reflect.Value.SetComplex", v.kind()})
-	case Complex64:
-		*(*complex64)(v.ptr) = complex64(x)
-	case Complex128:
-		*(*complex128)(v.ptr) = x
-	}
-}
-
-// SetFloat sets v's underlying value to x.
-// It panics if v's Kind is not Float32 or Float64, or if CanSet() is false.
-func (v Value) SetFloat(x float64) {
-	v.mustBeAssignable()
-	switch k := v.kind(); k {
-	default:
-		panic(&ValueError{"reflect.Value.SetFloat", v.kind()})
-	case Float32:
-		*(*float32)(v.ptr) = float32(x)
-	case Float64:
-		*(*float64)(v.ptr) = x
-	}
-}
-
-// SetInt sets v's underlying value to x.
-// It panics if v's Kind is not Int, Int8, Int16, Int32, or Int64, or if CanSet() is false.
-func (v Value) SetInt(x int64) {
-	v.mustBeAssignable()
-	switch k := v.kind(); k {
-	default:
-		panic(&ValueError{"reflect.Value.SetInt", v.kind()})
-	case Int:
-		*(*int)(v.ptr) = int(x)
-	case Int8:
-		*(*int8)(v.ptr) = int8(x)
-	case Int16:
-		*(*int16)(v.ptr) = int16(x)
-	case Int32:
-		*(*int32)(v.ptr) = int32(x)
-	case Int64:
-		*(*int64)(v.ptr) = x
-	}
-}
-
-// SetLen sets v's length to n.
-// It panics if v's Kind is not Slice or if n is negative or
-// greater than the capacity of the slice.
-func (v Value) SetLen(n int) {
-	v.mustBeAssignable()
-	v.mustBe(Slice)
-	s := (*sliceHeader)(v.ptr)
-	if uint(n) > uint(s.Cap) {
-		panic("reflect: slice length out of range in SetLen")
-	}
-	s.Len = n
-}
-
-// SetCap sets v's capacity to n.
-// It panics if v's Kind is not Slice or if n is smaller than the length or
-// greater than the capacity of the slice.
-func (v Value) SetCap(n int) {
-	v.mustBeAssignable()
-	v.mustBe(Slice)
-	s := (*sliceHeader)(v.ptr)
-	if n < int(s.Len) || n > int(s.Cap) {
-		panic("reflect: slice capacity out of range in SetCap")
-	}
-	s.Cap = n
-}
-
-// SetMapIndex sets the value associated with key in the map v to val.
-// It panics if v's Kind is not Map.
-// If val is the zero Value, SetMapIndex deletes the key from the map.
-// Otherwise if v holds a nil map, SetMapIndex will panic.
-// As in Go, key's value must be assignable to the map's key type,
-// and val's value must be assignable to the map's value type.
-func (v Value) SetMapIndex(key, val Value) {
-	v.mustBe(Map)
-	v.mustBeExported()
-	key.mustBeExported()
-	tt := (*mapType)(unsafe.Pointer(v.typ))
-	key = key.assignTo("reflect.Value.SetMapIndex", tt.key, nil)
-	var k unsafe.Pointer
-	if key.flag&flagIndir != 0 {
-		k = key.ptr
-	} else {
-		k = unsafe.Pointer(&key.ptr)
-	}
-	if val.typ == nil {
-		mapdelete(v.typ, v.pointer(), k)
-		return
-	}
-	val.mustBeExported()
-	val = val.assignTo("reflect.Value.SetMapIndex", tt.elem, nil)
-	var e unsafe.Pointer
-	if val.flag&flagIndir != 0 {
-		e = val.ptr
-	} else {
-		e = unsafe.Pointer(&val.ptr)
-	}
-	mapassign(v.typ, v.pointer(), k, e)
-}
-
-// SetUint sets v's underlying value to x.
-// It panics if v's Kind is not Uint, Uintptr, Uint8, Uint16, Uint32, or Uint64, or if CanSet() is false.
-func (v Value) SetUint(x uint64) {
-	v.mustBeAssignable()
-	switch k := v.kind(); k {
-	default:
-		panic(&ValueError{"reflect.Value.SetUint", v.kind()})
-	case Uint:
-		*(*uint)(v.ptr) = uint(x)
-	case Uint8:
-		*(*uint8)(v.ptr) = uint8(x)
-	case Uint16:
-		*(*uint16)(v.ptr) = uint16(x)
-	case Uint32:
-		*(*uint32)(v.ptr) = uint32(x)
-	case Uint64:
-		*(*uint64)(v.ptr) = x
-	case Uintptr:
-		*(*uintptr)(v.ptr) = uintptr(x)
-	}
-}
-
-// SetPointer sets the unsafe.Pointer value v to x.
-// It panics if v's Kind is not UnsafePointer.
-func (v Value) SetPointer(x unsafe.Pointer) {
-	v.mustBeAssignable()
-	v.mustBe(UnsafePointer)
-	*(*unsafe.Pointer)(v.ptr) = x
-}
-
-// SetString sets v's underlying value to x.
-// It panics if v's Kind is not String or if CanSet() is false.
-func (v Value) SetString(x string) {
-	v.mustBeAssignable()
-	v.mustBe(String)
-	*(*string)(v.ptr) = x
-}
-
-// Slice returns v[i:j].
-// It panics if v's Kind is not Array, Slice or String, or if v is an unaddressable array,
-// or if the indexes are out of bounds.
-func (v Value) Slice(i, j int) Value {
-	var (
-		cap  int
-		typ  *sliceType
-		base unsafe.Pointer
-	)
-	switch kind := v.kind(); kind {
-	default:
-		panic(&ValueError{"reflect.Value.Slice", v.kind()})
-
-	case Array:
-		if v.flag&flagAddr == 0 {
-			panic("reflect.Value.Slice: slice of unaddressable array")
-		}
-		tt := (*arrayType)(unsafe.Pointer(v.typ))
-		cap = int(tt.len)
-		typ = (*sliceType)(unsafe.Pointer(tt.slice))
-		base = v.ptr
-
-	case Slice:
-		typ = (*sliceType)(unsafe.Pointer(v.typ))
-		s := (*sliceHeader)(v.ptr)
-		base = unsafe.Pointer(s.Data)
-		cap = s.Cap
-
-	case String:
-		s := (*stringHeader)(v.ptr)
-		if i < 0 || j < i || j > s.Len {
-			panic("reflect.Value.Slice: string slice index out of bounds")
-		}
-		t := stringHeader{arrayAt(s.Data, i, 1), j - i}
-		return Value{v.typ, unsafe.Pointer(&t), v.flag}
-	}
-
-	if i < 0 || j < i || j > cap {
-		panic("reflect.Value.Slice: slice index out of bounds")
-	}
-
-	// Declare slice so that gc can see the base pointer in it.
-	var x []unsafe.Pointer
-
-	// Reinterpret as *sliceHeader to edit.
-	s := (*sliceHeader)(unsafe.Pointer(&x))
-	s.Len = j - i
-	s.Cap = cap - i
-	if cap-i > 0 {
-		s.Data = arrayAt(base, i, typ.elem.Size())
-	} else {
-		// do not advance pointer, to avoid pointing beyond end of slice
-		s.Data = base
-	}
-
-	fl := v.flag&flagRO | flagIndir | flag(Slice)
-	return Value{typ.common(), unsafe.Pointer(&x), fl}
-}
-
-// Slice3 is the 3-index form of the slice operation: it returns v[i:j:k].
-// It panics if v's Kind is not Array or Slice, or if v is an unaddressable array,
-// or if the indexes are out of bounds.
-func (v Value) Slice3(i, j, k int) Value {
-	var (
-		cap  int
-		typ  *sliceType
-		base unsafe.Pointer
-	)
-	switch kind := v.kind(); kind {
-	default:
-		panic(&ValueError{"reflect.Value.Slice3", v.kind()})
-
-	case Array:
-		if v.flag&flagAddr == 0 {
-			panic("reflect.Value.Slice3: slice of unaddressable array")
-		}
-		tt := (*arrayType)(unsafe.Pointer(v.typ))
-		cap = int(tt.len)
-		typ = (*sliceType)(unsafe.Pointer(tt.slice))
-		base = v.ptr
-
-	case Slice:
-		typ = (*sliceType)(unsafe.Pointer(v.typ))
-		s := (*sliceHeader)(v.ptr)
-		base = s.Data
-		cap = s.Cap
-	}
-
-	if i < 0 || j < i || k < j || k > cap {
-		panic("reflect.Value.Slice3: slice index out of bounds")
-	}
-
-	// Declare slice so that the garbage collector
-	// can see the base pointer in it.
-	var x []unsafe.Pointer
-
-	// Reinterpret as *sliceHeader to edit.
-	s := (*sliceHeader)(unsafe.Pointer(&x))
-	s.Len = j - i
-	s.Cap = k - i
-	if k-i > 0 {
-		s.Data = arrayAt(base, i, typ.elem.Size())
-	} else {
-		// do not advance pointer, to avoid pointing beyond end of slice
-		s.Data = base
-	}
-
-	fl := v.flag&flagRO | flagIndir | flag(Slice)
-	return Value{typ.common(), unsafe.Pointer(&x), fl}
-}
-
-// String returns the string v's underlying value, as a string.
-// String is a special case because of Go's String method convention.
-// Unlike the other getters, it does not panic if v's Kind is not String.
-// Instead, it returns a string of the form "<T value>" where T is v's type.
-// The fmt package treats Values specially. It does not call their String
-// method implicitly but instead prints the concrete values they hold.
-func (v Value) String() string {
-	switch k := v.kind(); k {
-	case Invalid:
-		return "<invalid Value>"
-	case String:
-		return *(*string)(v.ptr)
-	}
-	// If you call String on a reflect.Value of other type, it's better to
-	// print something than to panic. Useful in debugging.
-	return "<" + v.Type().String() + " Value>"
-}
-
-// TryRecv attempts to receive a value from the channel v but will not block.
-// It panics if v's Kind is not Chan.
-// If the receive delivers a value, x is the transferred value and ok is true.
-// If the receive cannot finish without blocking, x is the zero Value and ok is false.
-// If the channel is closed, x is the zero value for the channel's element type and ok is false.
-func (v Value) TryRecv() (x Value, ok bool) {
-	v.mustBe(Chan)
-	v.mustBeExported()
-	return v.recv(true)
-}
-
-// TrySend attempts to send x on the channel v but will not block.
-// It panics if v's Kind is not Chan.
-// It reports whether the value was sent.
-// As in Go, x's value must be assignable to the channel's element type.
-func (v Value) TrySend(x Value) bool {
-	v.mustBe(Chan)
-	v.mustBeExported()
-	return v.send(x, true)
-}
-
-// Type returns v's type.
-func (v Value) Type() Type {
-	f := v.flag
-	if f == 0 {
-		panic(&ValueError{"reflect.Value.Type", Invalid})
-	}
-	if f&flagMethod == 0 {
-		// Easy case
-		return toType(v.typ)
-	}
-
-	// Method value.
-	// v.typ describes the receiver, not the method type.
-	i := int(v.flag) >> flagMethodShift
-	if v.typ.Kind() == Interface {
-		// Method on interface.
-		tt := (*interfaceType)(unsafe.Pointer(v.typ))
-		if uint(i) >= uint(len(tt.methods)) {
-			panic("reflect: internal error: invalid method index")
-		}
-		m := &tt.methods[i]
-		return toType(m.typ)
-	}
-	// Method on concrete type.
-	ut := v.typ.uncommon()
-	if ut == nil || uint(i) >= uint(len(ut.methods)) {
-		panic("reflect: internal error: invalid method index")
-	}
-	m := &ut.methods[i]
-	return toType(m.mtyp)
-}
-
-// Uint returns v's underlying value, as a uint64.
-// It panics if v's Kind is not Uint, Uintptr, Uint8, Uint16, Uint32, or Uint64.
-func (v Value) Uint() uint64 {
-	k := v.kind()
-	p := v.ptr
-	switch k {
-	case Uint:
-		return uint64(*(*uint)(p))
-	case Uint8:
-		return uint64(*(*uint8)(p))
-	case Uint16:
-		return uint64(*(*uint16)(p))
-	case Uint32:
-		return uint64(*(*uint32)(p))
-	case Uint64:
-		return uint64(*(*uint64)(p))
-	case Uintptr:
-		return uint64(*(*uintptr)(p))
-	}
-	panic(&ValueError{"reflect.Value.Uint", v.kind()})
-}
-
-// UnsafeAddr returns a pointer to v's data.
-// It is for advanced clients that also import the "unsafe" package.
-// It panics if v is not addressable.
-func (v Value) UnsafeAddr() uintptr {
-	// TODO: deprecate
-	if v.typ == nil {
-		panic(&ValueError{"reflect.Value.UnsafeAddr", Invalid})
-	}
-	if v.flag&flagAddr == 0 {
-		panic("reflect.Value.UnsafeAddr of unaddressable value")
-	}
-	return uintptr(v.ptr)
-}
-
-// StringHeader is the runtime representation of a string.
-// It cannot be used safely or portably and its representation may
-// change in a later release.
-// Moreover, the Data field is not sufficient to guarantee the data
-// it references will not be garbage collected, so programs must keep
-// a separate, correctly typed pointer to the underlying data.
-type StringHeader struct {
-	Data uintptr
-	Len  int
-}
-
-// stringHeader is a safe version of StringHeader used within this package.
-type stringHeader struct {
-	Data unsafe.Pointer
-	Len  int
-}
-
-// SliceHeader is the runtime representation of a slice.
-// It cannot be used safely or portably and its representation may
-// change in a later release.
-// Moreover, the Data field is not sufficient to guarantee the data
-// it references will not be garbage collected, so programs must keep
-// a separate, correctly typed pointer to the underlying data.
-type SliceHeader struct {
-	Data uintptr
-	Len  int
-	Cap  int
-}
-
-// sliceHeader is a safe version of SliceHeader used within this package.
-type sliceHeader struct {
-	Data unsafe.Pointer
-	Len  int
-	Cap  int
-}
-
-func typesMustMatch(what string, t1, t2 Type) {
-	if t1 != t2 {
-		panic(what + ": " + t1.String() + " != " + t2.String())
-	}
-}
-
-// arrayAt returns the i-th element of p, a C-array whose elements are
-// eltSize wide (in bytes).
-func arrayAt(p unsafe.Pointer, i int, eltSize uintptr) unsafe.Pointer {
-	return unsafe.Pointer(uintptr(p) + uintptr(i)*eltSize)
-}
-
-// grow grows the slice s so that it can hold extra more values, allocating
-// more capacity if needed. It also returns the old and new slice lengths.
-func grow(s Value, extra int) (Value, int, int) {
-	i0 := s.Len()
-	i1 := i0 + extra
-	if i1 < i0 {
-		panic("reflect.Append: slice overflow")
-	}
-	m := s.Cap()
-	if i1 <= m {
-		return s.Slice(0, i1), i0, i1
-	}
-	if m == 0 {
-		m = extra
-	} else {
-		for m < i1 {
-			if i0 < 1024 {
-				m += m
-			} else {
-				m += m / 4
-			}
-		}
-	}
-	t := MakeSlice(s.Type(), i1, m)
-	Copy(t, s)
-	return t, i0, i1
-}
-
-// Append appends the values x to a slice s and returns the resulting slice.
-// As in Go, each x's value must be assignable to the slice's element type.
-func Append(s Value, x ...Value) Value {
-	s.mustBe(Slice)
-	s, i0, i1 := grow(s, len(x))
-	for i, j := i0, 0; i < i1; i, j = i+1, j+1 {
-		s.Index(i).Set(x[j])
-	}
-	return s
-}
-
-// AppendSlice appends a slice t to a slice s and returns the resulting slice.
-// The slices s and t must have the same element type.
-func AppendSlice(s, t Value) Value {
-	s.mustBe(Slice)
-	t.mustBe(Slice)
-	typesMustMatch("reflect.AppendSlice", s.Type().Elem(), t.Type().Elem())
-	s, i0, i1 := grow(s, t.Len())
-	Copy(s.Slice(i0, i1), t)
-	return s
-}
-
-// Copy copies the contents of src into dst until either
-// dst has been filled or src has been exhausted.
-// It returns the number of elements copied.
-// Dst and src each must have kind Slice or Array, and
-// dst and src must have the same element type.
-func Copy(dst, src Value) int {
-	dk := dst.kind()
-	if dk != Array && dk != Slice {
-		panic(&ValueError{"reflect.Copy", dk})
-	}
-	if dk == Array {
-		dst.mustBeAssignable()
-	}
-	dst.mustBeExported()
-
-	sk := src.kind()
-	if sk != Array && sk != Slice {
-		panic(&ValueError{"reflect.Copy", sk})
-	}
-	src.mustBeExported()
-
-	de := dst.typ.Elem()
-	se := src.typ.Elem()
-	typesMustMatch("reflect.Copy", de, se)
-
-	var ds, ss sliceHeader
-	if dk == Array {
-		ds.Data = dst.ptr
-		ds.Len = dst.Len()
-		ds.Cap = ds.Len
-	} else {
-		ds = *(*sliceHeader)(dst.ptr)
-	}
-	if sk == Array {
-		ss.Data = src.ptr
-		ss.Len = src.Len()
-		ss.Cap = ss.Len
-	} else {
-		ss = *(*sliceHeader)(src.ptr)
-	}
-
-	return typedslicecopy(de.common(), ds, ss)
-}
-
-// A runtimeSelect is a single case passed to rselect.
-// This must match ../runtime/select.go:/runtimeSelect
-type runtimeSelect struct {
-	dir uintptr        // 0, SendDir, or RecvDir
-	typ *rtype         // channel type
-	ch  unsafe.Pointer // channel
-	val unsafe.Pointer // ptr to data (SendDir) or ptr to receive buffer (RecvDir)
-}
-
-// rselect runs a select.  It returns the index of the chosen case.
-// If the case was a receive, val is filled in with the received value.
-// The conventional OK bool indicates whether the receive corresponds
-// to a sent value.
-//go:noescape
-func rselect([]runtimeSelect) (chosen int, recvOK bool)
-
-// A SelectDir describes the communication direction of a select case.
-type SelectDir int
-
-// NOTE: These values must match ../runtime/select.go:/selectDir.
-
-const (
-	_             SelectDir = iota
-	SelectSend              // case Chan <- Send
-	SelectRecv              // case <-Chan:
-	SelectDefault           // default
-)
-
-// A SelectCase describes a single case in a select operation.
-// The kind of case depends on Dir, the communication direction.
-//
-// If Dir is SelectDefault, the case represents a default case.
-// Chan and Send must be zero Values.
-//
-// If Dir is SelectSend, the case represents a send operation.
-// Normally Chan's underlying value must be a channel, and Send's underlying value must be
-// assignable to the channel's element type. As a special case, if Chan is a zero Value,
-// then the case is ignored, and the field Send will also be ignored and may be either zero
-// or non-zero.
-//
-// If Dir is SelectRecv, the case represents a receive operation.
-// Normally Chan's underlying value must be a channel and Send must be a zero Value.
-// If Chan is a zero Value, then the case is ignored, but Send must still be a zero Value.
-// When a receive operation is selected, the received Value is returned by Select.
-//
-type SelectCase struct {
-	Dir  SelectDir // direction of case
-	Chan Value     // channel to use (for send or receive)
-	Send Value     // value to send (for send)
-}
-
-// Select executes a select operation described by the list of cases.
-// Like the Go select statement, it blocks until at least one of the cases
-// can proceed, makes a uniform pseudo-random choice,
-// and then executes that case. It returns the index of the chosen case
-// and, if that case was a receive operation, the value received and a
-// boolean indicating whether the value corresponds to a send on the channel
-// (as opposed to a zero value received because the channel is closed).
-func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool) {
-	// NOTE: Do not trust that caller is not modifying cases data underfoot.
-	// The range is safe because the caller cannot modify our copy of the len
-	// and each iteration makes its own copy of the value c.
-	runcases := make([]runtimeSelect, len(cases))
-	haveDefault := false
-	for i, c := range cases {
-		rc := &runcases[i]
-		rc.dir = uintptr(c.Dir)
-		switch c.Dir {
-		default:
-			panic("reflect.Select: invalid Dir")
-
-		case SelectDefault: // default
-			if haveDefault {
-				panic("reflect.Select: multiple default cases")
-			}
-			haveDefault = true
-			if c.Chan.IsValid() {
-				panic("reflect.Select: default case has Chan value")
-			}
-			if c.Send.IsValid() {
-				panic("reflect.Select: default case has Send value")
-			}
-
-		case SelectSend:
-			ch := c.Chan
-			if !ch.IsValid() {
-				break
-			}
-			ch.mustBe(Chan)
-			ch.mustBeExported()
-			tt := (*chanType)(unsafe.Pointer(ch.typ))
-			if ChanDir(tt.dir)&SendDir == 0 {
-				panic("reflect.Select: SendDir case using recv-only channel")
-			}
-			rc.ch = ch.pointer()
-			rc.typ = &tt.rtype
-			v := c.Send
-			if !v.IsValid() {
-				panic("reflect.Select: SendDir case missing Send value")
-			}
-			v.mustBeExported()
-			v = v.assignTo("reflect.Select", tt.elem, nil)
-			if v.flag&flagIndir != 0 {
-				rc.val = v.ptr
-			} else {
-				rc.val = unsafe.Pointer(&v.ptr)
-			}
-
-		case SelectRecv:
-			if c.Send.IsValid() {
-				panic("reflect.Select: RecvDir case has Send value")
-			}
-			ch := c.Chan
-			if !ch.IsValid() {
-				break
-			}
-			ch.mustBe(Chan)
-			ch.mustBeExported()
-			tt := (*chanType)(unsafe.Pointer(ch.typ))
-			if ChanDir(tt.dir)&RecvDir == 0 {
-				panic("reflect.Select: RecvDir case using send-only channel")
-			}
-			rc.ch = ch.pointer()
-			rc.typ = &tt.rtype
-			rc.val = unsafe_New(tt.elem)
-		}
-	}
-
-	chosen, recvOK = rselect(runcases)
-	if runcases[chosen].dir == uintptr(SelectRecv) {
-		tt := (*chanType)(unsafe.Pointer(runcases[chosen].typ))
-		t := tt.elem
-		p := runcases[chosen].val
-		fl := flag(t.Kind())
-		if ifaceIndir(t) {
-			recv = Value{t, p, fl | flagIndir}
-		} else {
-			recv = Value{t, *(*unsafe.Pointer)(p), fl}
-		}
-	}
-	return chosen, recv, recvOK
-}
-
-/*
- * constructors
- */
-
-// implemented in package runtime
-func unsafe_New(*rtype) unsafe.Pointer
-func unsafe_NewArray(*rtype, int) unsafe.Pointer
-
-// MakeSlice creates a new zero-initialized slice value
-// for the specified slice type, length, and capacity.
-func MakeSlice(typ Type, len, cap int) Value {
-	if typ.Kind() != Slice {
-		panic("reflect.MakeSlice of non-slice type")
-	}
-	if len < 0 {
-		panic("reflect.MakeSlice: negative len")
-	}
-	if cap < 0 {
-		panic("reflect.MakeSlice: negative cap")
-	}
-	if len > cap {
-		panic("reflect.MakeSlice: len > cap")
-	}
-
-	s := sliceHeader{unsafe_NewArray(typ.Elem().(*rtype), cap), len, cap}
-	return Value{typ.common(), unsafe.Pointer(&s), flagIndir | flag(Slice)}
-}
-
-// MakeChan creates a new channel with the specified type and buffer size.
-func MakeChan(typ Type, buffer int) Value {
-	if typ.Kind() != Chan {
-		panic("reflect.MakeChan of non-chan type")
-	}
-	if buffer < 0 {
-		panic("reflect.MakeChan: negative buffer size")
-	}
-	if typ.ChanDir() != BothDir {
-		panic("reflect.MakeChan: unidirectional channel type")
-	}
-	ch := makechan(typ.(*rtype), uint64(buffer))
-	return Value{typ.common(), unsafe.Pointer(&ch), flag(Chan) | flagIndir}
-}
-
-// MakeMap creates a new map of the specified type.
-func MakeMap(typ Type) Value {
-	if typ.Kind() != Map {
-		panic("reflect.MakeMap of non-map type")
-	}
-	m := makemap(typ.(*rtype))
-	return Value{typ.common(), unsafe.Pointer(&m), flag(Map) | flagIndir}
-}
-
-// Indirect returns the value that v points to.
-// If v is a nil pointer, Indirect returns a zero Value.
-// If v is not a pointer, Indirect returns v.
-func Indirect(v Value) Value {
-	if v.Kind() != Ptr {
-		return v
-	}
-	return v.Elem()
-}
-
-// ValueOf returns a new Value initialized to the concrete value
-// stored in the interface i.  ValueOf(nil) returns the zero Value.
-func ValueOf(i interface{}) Value {
-	if i == nil {
-		return Value{}
-	}
-
-	// TODO(rsc): Eliminate this terrible hack.
-	// In the call to unpackEface, i.typ doesn't escape,
-	// and i.word is an integer.  So it looks like
-	// i doesn't escape.  But really it does,
-	// because i.word is actually a pointer.
-	escapes(i)
-
-	return unpackEface(i)
-}
-
-// Zero returns a Value representing the zero value for the specified type.
-// The result is different from the zero value of the Value struct,
-// which represents no value at all.
-// For example, Zero(TypeOf(42)) returns a Value with Kind Int and value 0.
-// The returned value is neither addressable nor settable.
-func Zero(typ Type) Value {
-	if typ == nil {
-		panic("reflect: Zero(nil)")
-	}
-	t := typ.common()
-	fl := flag(t.Kind())
-	if ifaceIndir(t) {
-		return Value{t, unsafe_New(typ.(*rtype)), fl | flagIndir}
-	}
-	return Value{t, nil, fl}
-}
-
-// New returns a Value representing a pointer to a new zero value
-// for the specified type.  That is, the returned Value's Type is PtrTo(typ).
-func New(typ Type) Value {
-	if typ == nil {
-		panic("reflect: New(nil)")
-	}
-	ptr := unsafe_New(typ.(*rtype))
-	fl := flag(Ptr)
-	return Value{typ.common().ptrTo(), ptr, fl}
-}
-
-// NewAt returns a Value representing a pointer to a value of the
-// specified type, using p as that pointer.
-func NewAt(typ Type, p unsafe.Pointer) Value {
-	fl := flag(Ptr)
-	return Value{typ.common().ptrTo(), p, fl}
-}
-
-// assignTo returns a value v that can be assigned directly to typ.
-// It panics if v is not assignable to typ.
-// For a conversion to an interface type, target is a suggested scratch space to use.
-func (v Value) assignTo(context string, dst *rtype, target unsafe.Pointer) Value {
-	if v.flag&flagMethod != 0 {
-		v = makeMethodValue(context, v)
-	}
-
-	switch {
-	case directlyAssignable(dst, v.typ):
-		// Overwrite type so that they match.
-		// Same memory layout, so no harm done.
-		v.typ = dst
-		fl := v.flag & (flagRO | flagAddr | flagIndir)
-		fl |= flag(dst.Kind())
-		return Value{dst, v.ptr, fl}
-
-	case implements(dst, v.typ):
-		if target == nil {
-			target = unsafe_New(dst)
-		}
-		x := valueInterface(v, false)
-		if dst.NumMethod() == 0 {
-			*(*interface{})(target) = x
-		} else {
-			ifaceE2I(dst, x, target)
-		}
-		return Value{dst, target, flagIndir | flag(Interface)}
-	}
-
-	// Failed.
-	panic(context + ": value of type " + v.typ.String() + " is not assignable to type " + dst.String())
-}
-
-// Convert returns the value v converted to type t.
-// If the usual Go conversion rules do not allow conversion
-// of the value v to type t, Convert panics.
-func (v Value) Convert(t Type) Value {
-	if v.flag&flagMethod != 0 {
-		v = makeMethodValue("Convert", v)
-	}
-	op := convertOp(t.common(), v.typ)
-	if op == nil {
-		panic("reflect.Value.Convert: value of type " + v.typ.String() + " cannot be converted to type " + t.String())
-	}
-	return op(v, t)
-}
-
-// convertOp returns the function to convert a value of type src
-// to a value of type dst. If the conversion is illegal, convertOp returns nil.
-func convertOp(dst, src *rtype) func(Value, Type) Value {
-	switch src.Kind() {
-	case Int, Int8, Int16, Int32, Int64:
-		switch dst.Kind() {
-		case Int, Int8, Int16, Int32, Int64, Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
-			return cvtInt
-		case Float32, Float64:
-			return cvtIntFloat
-		case String:
-			return cvtIntString
-		}
-
-	case Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
-		switch dst.Kind() {
-		case Int, Int8, Int16, Int32, Int64, Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
-			return cvtUint
-		case Float32, Float64:
-			return cvtUintFloat
-		case String:
-			return cvtUintString
-		}
-
-	case Float32, Float64:
-		switch dst.Kind() {
-		case Int, Int8, Int16, Int32, Int64:
-			return cvtFloatInt
-		case Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
-			return cvtFloatUint
-		case Float32, Float64:
-			return cvtFloat
-		}
-
-	case Complex64, Complex128:
-		switch dst.Kind() {
-		case Complex64, Complex128:
-			return cvtComplex
-		}
-
-	case String:
-		if dst.Kind() == Slice && dst.Elem().PkgPath() == "" {
-			switch dst.Elem().Kind() {
-			case Uint8:
-				return cvtStringBytes
-			case Int32:
-				return cvtStringRunes
-			}
-		}
-
-	case Slice:
-		if dst.Kind() == String && src.Elem().PkgPath() == "" {
-			switch src.Elem().Kind() {
-			case Uint8:
-				return cvtBytesString
-			case Int32:
-				return cvtRunesString
-			}
-		}
-	}
-
-	// dst and src have same underlying type.
-	if haveIdenticalUnderlyingType(dst, src) {
-		return cvtDirect
-	}
-
-	// dst and src are unnamed pointer types with same underlying base type.
-	if dst.Kind() == Ptr && dst.Name() == "" &&
-		src.Kind() == Ptr && src.Name() == "" &&
-		haveIdenticalUnderlyingType(dst.Elem().common(), src.Elem().common()) {
-		return cvtDirect
-	}
-
-	if implements(dst, src) {
-		if src.Kind() == Interface {
-			return cvtI2I
-		}
-		return cvtT2I
-	}
-
-	return nil
-}
-
-// makeInt returns a Value of type t equal to bits (possibly truncated),
-// where t is a signed or unsigned int type.
-func makeInt(f flag, bits uint64, t Type) Value {
-	typ := t.common()
-	ptr := unsafe_New(typ)
-	switch typ.size {
-	case 1:
-		*(*uint8)(unsafe.Pointer(ptr)) = uint8(bits)
-	case 2:
-		*(*uint16)(unsafe.Pointer(ptr)) = uint16(bits)
-	case 4:
-		*(*uint32)(unsafe.Pointer(ptr)) = uint32(bits)
-	case 8:
-		*(*uint64)(unsafe.Pointer(ptr)) = bits
-	}
-	return Value{typ, ptr, f | flagIndir | flag(typ.Kind())}
-}
-
-// makeFloat returns a Value of type t equal to v (possibly truncated to float32),
-// where t is a float32 or float64 type.
-func makeFloat(f flag, v float64, t Type) Value {
-	typ := t.common()
-	ptr := unsafe_New(typ)
-	switch typ.size {
-	case 4:
-		*(*float32)(unsafe.Pointer(ptr)) = float32(v)
-	case 8:
-		*(*float64)(unsafe.Pointer(ptr)) = v
-	}
-	return Value{typ, ptr, f | flagIndir | flag(typ.Kind())}
-}
-
-// makeComplex returns a Value of type t equal to v (possibly truncated to complex64),
-// where t is a complex64 or complex128 type.
-func makeComplex(f flag, v complex128, t Type) Value {
-	typ := t.common()
-	ptr := unsafe_New(typ)
-	switch typ.size {
-	case 8:
-		*(*complex64)(unsafe.Pointer(ptr)) = complex64(v)
-	case 16:
-		*(*complex128)(unsafe.Pointer(ptr)) = v
-	}
-	return Value{typ, ptr, f | flagIndir | flag(typ.Kind())}
-}
-
-func makeString(f flag, v string, t Type) Value {
-	ret := New(t).Elem()
-	ret.SetString(v)
-	ret.flag = ret.flag&^flagAddr | f
-	return ret
-}
-
-func makeBytes(f flag, v []byte, t Type) Value {
-	ret := New(t).Elem()
-	ret.SetBytes(v)
-	ret.flag = ret.flag&^flagAddr | f
-	return ret
-}
-
-func makeRunes(f flag, v []rune, t Type) Value {
-	ret := New(t).Elem()
-	ret.setRunes(v)
-	ret.flag = ret.flag&^flagAddr | f
-	return ret
-}
-
-// These conversion functions are returned by convertOp
-// for classes of conversions. For example, the first function, cvtInt,
-// takes any value v of signed int type and returns the value converted
-// to type t, where t is any signed or unsigned int type.
-
-// convertOp: intXX -> [u]intXX
-func cvtInt(v Value, t Type) Value {
-	return makeInt(v.flag&flagRO, uint64(v.Int()), t)
-}
-
-// convertOp: uintXX -> [u]intXX
-func cvtUint(v Value, t Type) Value {
-	return makeInt(v.flag&flagRO, v.Uint(), t)
-}
-
-// convertOp: floatXX -> intXX
-func cvtFloatInt(v Value, t Type) Value {
-	return makeInt(v.flag&flagRO, uint64(int64(v.Float())), t)
-}
-
-// convertOp: floatXX -> uintXX
-func cvtFloatUint(v Value, t Type) Value {
-	return makeInt(v.flag&flagRO, uint64(v.Float()), t)
-}
-
-// convertOp: intXX -> floatXX
-func cvtIntFloat(v Value, t Type) Value {
-	return makeFloat(v.flag&flagRO, float64(v.Int()), t)
-}
-
-// convertOp: uintXX -> floatXX
-func cvtUintFloat(v Value, t Type) Value {
-	return makeFloat(v.flag&flagRO, float64(v.Uint()), t)
-}
-
-// convertOp: floatXX -> floatXX
-func cvtFloat(v Value, t Type) Value {
-	return makeFloat(v.flag&flagRO, v.Float(), t)
-}
-
-// convertOp: complexXX -> complexXX
-func cvtComplex(v Value, t Type) Value {
-	return makeComplex(v.flag&flagRO, v.Complex(), t)
-}
-
-// convertOp: intXX -> string
-func cvtIntString(v Value, t Type) Value {
-	return makeString(v.flag&flagRO, string(v.Int()), t)
-}
-
-// convertOp: uintXX -> string
-func cvtUintString(v Value, t Type) Value {
-	return makeString(v.flag&flagRO, string(v.Uint()), t)
-}
-
-// convertOp: []byte -> string
-func cvtBytesString(v Value, t Type) Value {
-	return makeString(v.flag&flagRO, string(v.Bytes()), t)
-}
-
-// convertOp: string -> []byte
-func cvtStringBytes(v Value, t Type) Value {
-	return makeBytes(v.flag&flagRO, []byte(v.String()), t)
-}
-
-// convertOp: []rune -> string
-func cvtRunesString(v Value, t Type) Value {
-	return makeString(v.flag&flagRO, string(v.runes()), t)
-}
-
-// convertOp: string -> []rune
-func cvtStringRunes(v Value, t Type) Value {
-	return makeRunes(v.flag&flagRO, []rune(v.String()), t)
-}
-
-// convertOp: direct copy
-func cvtDirect(v Value, typ Type) Value {
-	f := v.flag
-	t := typ.common()
-	ptr := v.ptr
-	if f&flagAddr != 0 {
-		// indirect, mutable word - make a copy
-		c := unsafe_New(t)
-		typedmemmove(t, c, ptr)
-		ptr = c
-		f &^= flagAddr
-	}
-	return Value{t, ptr, v.flag&flagRO | f} // v.flag&flagRO|f == f?
-}
-
-// convertOp: concrete -> interface
-func cvtT2I(v Value, typ Type) Value {
-	target := unsafe_New(typ.common())
-	x := valueInterface(v, false)
-	if typ.NumMethod() == 0 {
-		*(*interface{})(target) = x
-	} else {
-		ifaceE2I(typ.(*rtype), x, target)
-	}
-	return Value{typ.common(), target, v.flag&flagRO | flagIndir | flag(Interface)}
-}
-
-// convertOp: interface -> interface
-func cvtI2I(v Value, typ Type) Value {
-	if v.IsNil() {
-		ret := Zero(typ)
-		ret.flag |= v.flag & flagRO
-		return ret
-	}
-	return cvtT2I(v.Elem(), typ)
-}
-
-// implemented in ../runtime
-func chancap(ch unsafe.Pointer) int
-func chanclose(ch unsafe.Pointer)
-func chanlen(ch unsafe.Pointer) int
-
-//go:noescape
-func chanrecv(t *rtype, ch unsafe.Pointer, nb bool, val unsafe.Pointer) (selected, received bool)
-
-//go:noescape
-func chansend(t *rtype, ch unsafe.Pointer, val unsafe.Pointer, nb bool) bool
-
-func makechan(typ *rtype, size uint64) (ch unsafe.Pointer)
-func makemap(t *rtype) (m unsafe.Pointer)
-
-//go:noescape
-func mapaccess(t *rtype, m unsafe.Pointer, key unsafe.Pointer) (val unsafe.Pointer)
-
-func mapassign(t *rtype, m unsafe.Pointer, key, val unsafe.Pointer)
-
-//go:noescape
-func mapdelete(t *rtype, m unsafe.Pointer, key unsafe.Pointer)
-
-// m escapes into the return value, but the caller of mapiterinit
-// doesn't let the return value escape.
-//go:noescape
-func mapiterinit(t *rtype, m unsafe.Pointer) unsafe.Pointer
-
-//go:noescape
-func mapiterkey(it unsafe.Pointer) (key unsafe.Pointer)
-
-//go:noescape
-func mapiternext(it unsafe.Pointer)
-
-//go:noescape
-func maplen(m unsafe.Pointer) int
-func call(typ *rtype, fnaddr unsafe.Pointer, isInterface bool, isMethod bool, params *unsafe.Pointer, results *unsafe.Pointer)
-
-func ifaceE2I(t *rtype, src interface{}, dst unsafe.Pointer)
-
-// typedmemmove copies a value of type t to dst from src.
-//go:noescape
-func typedmemmove(t *rtype, dst, src unsafe.Pointer)
-
-// typedslicecopy copies a slice of elemType values from src to dst,
-// returning the number of elements copied.
-//go:noescape
-func typedslicecopy(elemType *rtype, dst, src sliceHeader) int
-
-//go:noescape
-//extern memmove
-func memmove(adst, asrc unsafe.Pointer, n uintptr)
-
-// Dummy annotation marking that the value x escapes,
-// for use in cases where the reflect code is so clever that
-// the compiler cannot follow.
-func escapes(x interface{}) {
-	if dummy.b {
-		dummy.x = x
-	}
-}
-
-var dummy struct {
-	b bool
-	x interface{}
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/all_test.go b/third_party/gofrontend/libgo/go/regexp/all_test.go
deleted file mode 100644
index d78ae6a..0000000
--- a/third_party/gofrontend/libgo/go/regexp/all_test.go
+++ /dev/null
@@ -1,667 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package regexp
-
-import (
-	"reflect"
-	"regexp/syntax"
-	"strings"
-	"testing"
-)
-
-var good_re = []string{
-	``,
-	`.`,
-	`^.$`,
-	`a`,
-	`a*`,
-	`a+`,
-	`a?`,
-	`a|b`,
-	`a*|b*`,
-	`(a*|b)(c*|d)`,
-	`[a-z]`,
-	`[a-abc-c\-\]\[]`,
-	`[a-z]+`,
-	`[abc]`,
-	`[^1234]`,
-	`[^\n]`,
-	`\!\\`,
-}
-
-type stringError struct {
-	re  string
-	err string
-}
-
-var bad_re = []stringError{
-	{`*`, "missing argument to repetition operator: `*`"},
-	{`+`, "missing argument to repetition operator: `+`"},
-	{`?`, "missing argument to repetition operator: `?`"},
-	{`(abc`, "missing closing ): `(abc`"},
-	{`abc)`, "unexpected ): `abc)`"},
-	{`x[a-z`, "missing closing ]: `[a-z`"},
-	{`[z-a]`, "invalid character class range: `z-a`"},
-	{`abc\`, "trailing backslash at end of expression"},
-	{`a**`, "invalid nested repetition operator: `**`"},
-	{`a*+`, "invalid nested repetition operator: `*+`"},
-	{`\x`, "invalid escape sequence: `\\x`"},
-}
-
-func compileTest(t *testing.T, expr string, error string) *Regexp {
-	re, err := Compile(expr)
-	if error == "" && err != nil {
-		t.Error("compiling `", expr, "`; unexpected error: ", err.Error())
-	}
-	if error != "" && err == nil {
-		t.Error("compiling `", expr, "`; missing error")
-	} else if error != "" && !strings.Contains(err.Error(), error) {
-		t.Error("compiling `", expr, "`; wrong error: ", err.Error(), "; want ", error)
-	}
-	return re
-}
-
-func TestGoodCompile(t *testing.T) {
-	for i := 0; i < len(good_re); i++ {
-		compileTest(t, good_re[i], "")
-	}
-}
-
-func TestBadCompile(t *testing.T) {
-	for i := 0; i < len(bad_re); i++ {
-		compileTest(t, bad_re[i].re, bad_re[i].err)
-	}
-}
-
-func matchTest(t *testing.T, test *FindTest) {
-	re := compileTest(t, test.pat, "")
-	if re == nil {
-		return
-	}
-	m := re.MatchString(test.text)
-	if m != (len(test.matches) > 0) {
-		t.Errorf("MatchString failure on %s: %t should be %t", test, m, len(test.matches) > 0)
-	}
-	// now try bytes
-	m = re.Match([]byte(test.text))
-	if m != (len(test.matches) > 0) {
-		t.Errorf("Match failure on %s: %t should be %t", test, m, len(test.matches) > 0)
-	}
-}
-
-func TestMatch(t *testing.T) {
-	for _, test := range findTests {
-		matchTest(t, &test)
-	}
-}
-
-func matchFunctionTest(t *testing.T, test *FindTest) {
-	m, err := MatchString(test.pat, test.text)
-	if err == nil {
-		return
-	}
-	if m != (len(test.matches) > 0) {
-		t.Errorf("Match failure on %s: %t should be %t", test, m, len(test.matches) > 0)
-	}
-}
-
-func TestMatchFunction(t *testing.T) {
-	for _, test := range findTests {
-		matchFunctionTest(t, &test)
-	}
-}
-
-type ReplaceTest struct {
-	pattern, replacement, input, output string
-}
-
-var replaceTests = []ReplaceTest{
-	// Test empty input and/or replacement, with pattern that matches the empty string.
-	{"", "", "", ""},
-	{"", "x", "", "x"},
-	{"", "", "abc", "abc"},
-	{"", "x", "abc", "xaxbxcx"},
-
-	// Test empty input and/or replacement, with pattern that does not match the empty string.
-	{"b", "", "", ""},
-	{"b", "x", "", ""},
-	{"b", "", "abc", "ac"},
-	{"b", "x", "abc", "axc"},
-	{"y", "", "", ""},
-	{"y", "x", "", ""},
-	{"y", "", "abc", "abc"},
-	{"y", "x", "abc", "abc"},
-
-	// Multibyte characters -- verify that we don't try to match in the middle
-	// of a character.
-	{"[a-c]*", "x", "\u65e5", "x\u65e5x"},
-	{"[^\u65e5]", "x", "abc\u65e5def", "xxx\u65e5xxx"},
-
-	// Start and end of a string.
-	{"^[a-c]*", "x", "abcdabc", "xdabc"},
-	{"[a-c]*$", "x", "abcdabc", "abcdx"},
-	{"^[a-c]*$", "x", "abcdabc", "abcdabc"},
-	{"^[a-c]*", "x", "abc", "x"},
-	{"[a-c]*$", "x", "abc", "x"},
-	{"^[a-c]*$", "x", "abc", "x"},
-	{"^[a-c]*", "x", "dabce", "xdabce"},
-	{"[a-c]*$", "x", "dabce", "dabcex"},
-	{"^[a-c]*$", "x", "dabce", "dabce"},
-	{"^[a-c]*", "x", "", "x"},
-	{"[a-c]*$", "x", "", "x"},
-	{"^[a-c]*$", "x", "", "x"},
-
-	{"^[a-c]+", "x", "abcdabc", "xdabc"},
-	{"[a-c]+$", "x", "abcdabc", "abcdx"},
-	{"^[a-c]+$", "x", "abcdabc", "abcdabc"},
-	{"^[a-c]+", "x", "abc", "x"},
-	{"[a-c]+$", "x", "abc", "x"},
-	{"^[a-c]+$", "x", "abc", "x"},
-	{"^[a-c]+", "x", "dabce", "dabce"},
-	{"[a-c]+$", "x", "dabce", "dabce"},
-	{"^[a-c]+$", "x", "dabce", "dabce"},
-	{"^[a-c]+", "x", "", ""},
-	{"[a-c]+$", "x", "", ""},
-	{"^[a-c]+$", "x", "", ""},
-
-	// Other cases.
-	{"abc", "def", "abcdefg", "defdefg"},
-	{"bc", "BC", "abcbcdcdedef", "aBCBCdcdedef"},
-	{"abc", "", "abcdabc", "d"},
-	{"x", "xXx", "xxxXxxx", "xXxxXxxXxXxXxxXxxXx"},
-	{"abc", "d", "", ""},
-	{"abc", "d", "abc", "d"},
-	{".+", "x", "abc", "x"},
-	{"[a-c]*", "x", "def", "xdxexfx"},
-	{"[a-c]+", "x", "abcbcdcdedef", "xdxdedef"},
-	{"[a-c]*", "x", "abcbcdcdedef", "xdxdxexdxexfx"},
-
-	// Substitutions
-	{"a+", "($0)", "banana", "b(a)n(a)n(a)"},
-	{"a+", "(${0})", "banana", "b(a)n(a)n(a)"},
-	{"a+", "(${0})$0", "banana", "b(a)an(a)an(a)a"},
-	{"a+", "(${0})$0", "banana", "b(a)an(a)an(a)a"},
-	{"hello, (.+)", "goodbye, ${1}", "hello, world", "goodbye, world"},
-	{"hello, (.+)", "goodbye, $1x", "hello, world", "goodbye, "},
-	{"hello, (.+)", "goodbye, ${1}x", "hello, world", "goodbye, worldx"},
-	{"hello, (.+)", "<$0><$1><$2><$3>", "hello, world", "<hello, world><world><><>"},
-	{"hello, (?P<noun>.+)", "goodbye, $noun!", "hello, world", "goodbye, world!"},
-	{"hello, (?P<noun>.+)", "goodbye, ${noun}", "hello, world", "goodbye, world"},
-	{"(?P<x>hi)|(?P<x>bye)", "$x$x$x", "hi", "hihihi"},
-	{"(?P<x>hi)|(?P<x>bye)", "$x$x$x", "bye", "byebyebye"},
-	{"(?P<x>hi)|(?P<x>bye)", "$xyz", "hi", ""},
-	{"(?P<x>hi)|(?P<x>bye)", "${x}yz", "hi", "hiyz"},
-	{"(?P<x>hi)|(?P<x>bye)", "hello $$x", "hi", "hello $x"},
-	{"a+", "${oops", "aaa", "${oops"},
-	{"a+", "$$", "aaa", "$"},
-	{"a+", "$", "aaa", "$"},
-
-	// Substitution when subexpression isn't found
-	{"(x)?", "$1", "123", "123"},
-	{"abc", "$1", "123", "123"},
-}
-
-var replaceLiteralTests = []ReplaceTest{
-	// Substitutions
-	{"a+", "($0)", "banana", "b($0)n($0)n($0)"},
-	{"a+", "(${0})", "banana", "b(${0})n(${0})n(${0})"},
-	{"a+", "(${0})$0", "banana", "b(${0})$0n(${0})$0n(${0})$0"},
-	{"a+", "(${0})$0", "banana", "b(${0})$0n(${0})$0n(${0})$0"},
-	{"hello, (.+)", "goodbye, ${1}", "hello, world", "goodbye, ${1}"},
-	{"hello, (?P<noun>.+)", "goodbye, $noun!", "hello, world", "goodbye, $noun!"},
-	{"hello, (?P<noun>.+)", "goodbye, ${noun}", "hello, world", "goodbye, ${noun}"},
-	{"(?P<x>hi)|(?P<x>bye)", "$x$x$x", "hi", "$x$x$x"},
-	{"(?P<x>hi)|(?P<x>bye)", "$x$x$x", "bye", "$x$x$x"},
-	{"(?P<x>hi)|(?P<x>bye)", "$xyz", "hi", "$xyz"},
-	{"(?P<x>hi)|(?P<x>bye)", "${x}yz", "hi", "${x}yz"},
-	{"(?P<x>hi)|(?P<x>bye)", "hello $$x", "hi", "hello $$x"},
-	{"a+", "${oops", "aaa", "${oops"},
-	{"a+", "$$", "aaa", "$$"},
-	{"a+", "$", "aaa", "$"},
-}
-
-type ReplaceFuncTest struct {
-	pattern       string
-	replacement   func(string) string
-	input, output string
-}
-
-var replaceFuncTests = []ReplaceFuncTest{
-	{"[a-c]", func(s string) string { return "x" + s + "y" }, "defabcdef", "defxayxbyxcydef"},
-	{"[a-c]+", func(s string) string { return "x" + s + "y" }, "defabcdef", "defxabcydef"},
-	{"[a-c]*", func(s string) string { return "x" + s + "y" }, "defabcdef", "xydxyexyfxabcydxyexyfxy"},
-}
-
-func TestReplaceAll(t *testing.T) {
-	for _, tc := range replaceTests {
-		re, err := Compile(tc.pattern)
-		if err != nil {
-			t.Errorf("Unexpected error compiling %q: %v", tc.pattern, err)
-			continue
-		}
-		actual := re.ReplaceAllString(tc.input, tc.replacement)
-		if actual != tc.output {
-			t.Errorf("%q.ReplaceAllString(%q,%q) = %q; want %q",
-				tc.pattern, tc.input, tc.replacement, actual, tc.output)
-		}
-		// now try bytes
-		actual = string(re.ReplaceAll([]byte(tc.input), []byte(tc.replacement)))
-		if actual != tc.output {
-			t.Errorf("%q.ReplaceAll(%q,%q) = %q; want %q",
-				tc.pattern, tc.input, tc.replacement, actual, tc.output)
-		}
-	}
-}
-
-func TestReplaceAllLiteral(t *testing.T) {
-	// Run ReplaceAll tests that do not have $ expansions.
-	for _, tc := range replaceTests {
-		if strings.Contains(tc.replacement, "$") {
-			continue
-		}
-		re, err := Compile(tc.pattern)
-		if err != nil {
-			t.Errorf("Unexpected error compiling %q: %v", tc.pattern, err)
-			continue
-		}
-		actual := re.ReplaceAllLiteralString(tc.input, tc.replacement)
-		if actual != tc.output {
-			t.Errorf("%q.ReplaceAllLiteralString(%q,%q) = %q; want %q",
-				tc.pattern, tc.input, tc.replacement, actual, tc.output)
-		}
-		// now try bytes
-		actual = string(re.ReplaceAllLiteral([]byte(tc.input), []byte(tc.replacement)))
-		if actual != tc.output {
-			t.Errorf("%q.ReplaceAllLiteral(%q,%q) = %q; want %q",
-				tc.pattern, tc.input, tc.replacement, actual, tc.output)
-		}
-	}
-
-	// Run literal-specific tests.
-	for _, tc := range replaceLiteralTests {
-		re, err := Compile(tc.pattern)
-		if err != nil {
-			t.Errorf("Unexpected error compiling %q: %v", tc.pattern, err)
-			continue
-		}
-		actual := re.ReplaceAllLiteralString(tc.input, tc.replacement)
-		if actual != tc.output {
-			t.Errorf("%q.ReplaceAllLiteralString(%q,%q) = %q; want %q",
-				tc.pattern, tc.input, tc.replacement, actual, tc.output)
-		}
-		// now try bytes
-		actual = string(re.ReplaceAllLiteral([]byte(tc.input), []byte(tc.replacement)))
-		if actual != tc.output {
-			t.Errorf("%q.ReplaceAllLiteral(%q,%q) = %q; want %q",
-				tc.pattern, tc.input, tc.replacement, actual, tc.output)
-		}
-	}
-}
-
-func TestReplaceAllFunc(t *testing.T) {
-	for _, tc := range replaceFuncTests {
-		re, err := Compile(tc.pattern)
-		if err != nil {
-			t.Errorf("Unexpected error compiling %q: %v", tc.pattern, err)
-			continue
-		}
-		actual := re.ReplaceAllStringFunc(tc.input, tc.replacement)
-		if actual != tc.output {
-			t.Errorf("%q.ReplaceFunc(%q,fn) = %q; want %q",
-				tc.pattern, tc.input, actual, tc.output)
-		}
-		// now try bytes
-		actual = string(re.ReplaceAllFunc([]byte(tc.input), func(s []byte) []byte { return []byte(tc.replacement(string(s))) }))
-		if actual != tc.output {
-			t.Errorf("%q.ReplaceFunc(%q,fn) = %q; want %q",
-				tc.pattern, tc.input, actual, tc.output)
-		}
-	}
-}
-
-type MetaTest struct {
-	pattern, output, literal string
-	isLiteral                bool
-}
-
-var metaTests = []MetaTest{
-	{``, ``, ``, true},
-	{`foo`, `foo`, `foo`, true},
-	{`foo\.\$`, `foo\\\.\\\$`, `foo.$`, true}, // has meta but no operator
-	{`foo.\$`, `foo\.\\\$`, `foo`, false},     // has escaped operators and real operators
-	{`!@#$%^&*()_+-=[{]}\|,<.>/?~`, `!@#\$%\^&\*\(\)_\+-=\[\{\]\}\\\|,<\.>/\?~`, `!@#`, false},
-}
-
-func TestQuoteMeta(t *testing.T) {
-	for _, tc := range metaTests {
-		// Verify that QuoteMeta returns the expected string.
-		quoted := QuoteMeta(tc.pattern)
-		if quoted != tc.output {
-			t.Errorf("QuoteMeta(`%s`) = `%s`; want `%s`",
-				tc.pattern, quoted, tc.output)
-			continue
-		}
-
-		// Verify that the quoted string is in fact treated as expected
-		// by Compile -- i.e. that it matches the original, unquoted string.
-		if tc.pattern != "" {
-			re, err := Compile(quoted)
-			if err != nil {
-				t.Errorf("Unexpected error compiling QuoteMeta(`%s`): %v", tc.pattern, err)
-				continue
-			}
-			src := "abc" + tc.pattern + "def"
-			repl := "xyz"
-			replaced := re.ReplaceAllString(src, repl)
-			expected := "abcxyzdef"
-			if replaced != expected {
-				t.Errorf("QuoteMeta(`%s`).Replace(`%s`,`%s`) = `%s`; want `%s`",
-					tc.pattern, src, repl, replaced, expected)
-			}
-		}
-	}
-}
-
-func TestLiteralPrefix(t *testing.T) {
-	for _, tc := range metaTests {
-		// Literal method needs to scan the pattern.
-		re := MustCompile(tc.pattern)
-		str, complete := re.LiteralPrefix()
-		if complete != tc.isLiteral {
-			t.Errorf("LiteralPrefix(`%s`) = %t; want %t", tc.pattern, complete, tc.isLiteral)
-		}
-		if str != tc.literal {
-			t.Errorf("LiteralPrefix(`%s`) = `%s`; want `%s`", tc.pattern, str, tc.literal)
-		}
-	}
-}
-
-type subexpCase struct {
-	input string
-	num   int
-	names []string
-}
-
-var subexpCases = []subexpCase{
-	{``, 0, nil},
-	{`.*`, 0, nil},
-	{`abba`, 0, nil},
-	{`ab(b)a`, 1, []string{"", ""}},
-	{`ab(.*)a`, 1, []string{"", ""}},
-	{`(.*)ab(.*)a`, 2, []string{"", "", ""}},
-	{`(.*)(ab)(.*)a`, 3, []string{"", "", "", ""}},
-	{`(.*)((a)b)(.*)a`, 4, []string{"", "", "", "", ""}},
-	{`(.*)(\(ab)(.*)a`, 3, []string{"", "", "", ""}},
-	{`(.*)(\(a\)b)(.*)a`, 3, []string{"", "", "", ""}},
-	{`(?P<foo>.*)(?P<bar>(a)b)(?P<foo>.*)a`, 4, []string{"", "foo", "bar", "", "foo"}},
-}
-
-func TestSubexp(t *testing.T) {
-	for _, c := range subexpCases {
-		re := MustCompile(c.input)
-		n := re.NumSubexp()
-		if n != c.num {
-			t.Errorf("%q: NumSubexp = %d, want %d", c.input, n, c.num)
-			continue
-		}
-		names := re.SubexpNames()
-		if len(names) != 1+n {
-			t.Errorf("%q: len(SubexpNames) = %d, want %d", c.input, len(names), n)
-			continue
-		}
-		if c.names != nil {
-			for i := 0; i < 1+n; i++ {
-				if names[i] != c.names[i] {
-					t.Errorf("%q: SubexpNames[%d] = %q, want %q", c.input, i, names[i], c.names[i])
-				}
-			}
-		}
-	}
-}
-
-var splitTests = []struct {
-	s   string
-	r   string
-	n   int
-	out []string
-}{
-	{"foo:and:bar", ":", -1, []string{"foo", "and", "bar"}},
-	{"foo:and:bar", ":", 1, []string{"foo:and:bar"}},
-	{"foo:and:bar", ":", 2, []string{"foo", "and:bar"}},
-	{"foo:and:bar", "foo", -1, []string{"", ":and:bar"}},
-	{"foo:and:bar", "bar", -1, []string{"foo:and:", ""}},
-	{"foo:and:bar", "baz", -1, []string{"foo:and:bar"}},
-	{"baabaab", "a", -1, []string{"b", "", "b", "", "b"}},
-	{"baabaab", "a*", -1, []string{"b", "b", "b"}},
-	{"baabaab", "ba*", -1, []string{"", "", "", ""}},
-	{"foobar", "f*b*", -1, []string{"", "o", "o", "a", "r"}},
-	{"foobar", "f+.*b+", -1, []string{"", "ar"}},
-	{"foobooboar", "o{2}", -1, []string{"f", "b", "boar"}},
-	{"a,b,c,d,e,f", ",", 3, []string{"a", "b", "c,d,e,f"}},
-	{"a,b,c,d,e,f", ",", 0, nil},
-	{",", ",", -1, []string{"", ""}},
-	{",,,", ",", -1, []string{"", "", "", ""}},
-	{"", ",", -1, []string{""}},
-	{"", ".*", -1, []string{""}},
-	{"", ".+", -1, []string{""}},
-	{"", "", -1, []string{}},
-	{"foobar", "", -1, []string{"f", "o", "o", "b", "a", "r"}},
-	{"abaabaccadaaae", "a*", 5, []string{"", "b", "b", "c", "cadaaae"}},
-	{":x:y:z:", ":", -1, []string{"", "x", "y", "z", ""}},
-}
-
-func TestSplit(t *testing.T) {
-	for i, test := range splitTests {
-		re, err := Compile(test.r)
-		if err != nil {
-			t.Errorf("#%d: %q: compile error: %s", i, test.r, err.Error())
-			continue
-		}
-
-		split := re.Split(test.s, test.n)
-		if !reflect.DeepEqual(split, test.out) {
-			t.Errorf("#%d: %q: got %q; want %q", i, test.r, split, test.out)
-		}
-
-		if QuoteMeta(test.r) == test.r {
-			strsplit := strings.SplitN(test.s, test.r, test.n)
-			if !reflect.DeepEqual(split, strsplit) {
-				t.Errorf("#%d: Split(%q, %q, %d): regexp vs strings mismatch\nregexp=%q\nstrings=%q", i, test.s, test.r, test.n, split, strsplit)
-			}
-		}
-	}
-}
-
-// Check that one-pass cutoff does trigger.
-func TestOnePassCutoff(t *testing.T) {
-	re, err := syntax.Parse(`^x{1,1000}y{1,1000}$`, syntax.Perl)
-	if err != nil {
-		t.Fatalf("parse: %v", err)
-	}
-	p, err := syntax.Compile(re.Simplify())
-	if err != nil {
-		t.Fatalf("compile: %v", err)
-	}
-	if compileOnePass(p) != notOnePass {
-		t.Fatalf("makeOnePass succeeded; wanted notOnePass")
-	}
-}
-
-// Check that the same machine can be used with the standard matcher
-// and then the backtracker when there are no captures.
-func TestSwitchBacktrack(t *testing.T) {
-	re := MustCompile(`a|b`)
-	long := make([]byte, maxBacktrackVector+1)
-
-	// The following sequence of Match calls used to panic. See issue #10319.
-	re.Match(long)     // triggers standard matcher
-	re.Match(long[:1]) // triggers backtracker
-}
-
-func BenchmarkLiteral(b *testing.B) {
-	x := strings.Repeat("x", 50) + "y"
-	b.StopTimer()
-	re := MustCompile("y")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		if !re.MatchString(x) {
-			b.Fatalf("no match!")
-		}
-	}
-}
-
-func BenchmarkNotLiteral(b *testing.B) {
-	x := strings.Repeat("x", 50) + "y"
-	b.StopTimer()
-	re := MustCompile(".y")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		if !re.MatchString(x) {
-			b.Fatalf("no match!")
-		}
-	}
-}
-
-func BenchmarkMatchClass(b *testing.B) {
-	b.StopTimer()
-	x := strings.Repeat("xxxx", 20) + "w"
-	re := MustCompile("[abcdw]")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		if !re.MatchString(x) {
-			b.Fatalf("no match!")
-		}
-	}
-}
-
-func BenchmarkMatchClass_InRange(b *testing.B) {
-	b.StopTimer()
-	// 'b' is between 'a' and 'c', so the charclass
-	// range checking is no help here.
-	x := strings.Repeat("bbbb", 20) + "c"
-	re := MustCompile("[ac]")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		if !re.MatchString(x) {
-			b.Fatalf("no match!")
-		}
-	}
-}
-
-func BenchmarkReplaceAll(b *testing.B) {
-	x := "abcdefghijklmnopqrstuvwxyz"
-	b.StopTimer()
-	re := MustCompile("[cjrw]")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.ReplaceAllString(x, "")
-	}
-}
-
-func BenchmarkAnchoredLiteralShortNonMatch(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcdefghijklmnopqrstuvwxyz")
-	re := MustCompile("^zbc(d|e)")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
-
-func BenchmarkAnchoredLiteralLongNonMatch(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcdefghijklmnopqrstuvwxyz")
-	for i := 0; i < 15; i++ {
-		x = append(x, x...)
-	}
-	re := MustCompile("^zbc(d|e)")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
-
-func BenchmarkAnchoredShortMatch(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcdefghijklmnopqrstuvwxyz")
-	re := MustCompile("^.bc(d|e)")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
-
-func BenchmarkAnchoredLongMatch(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcdefghijklmnopqrstuvwxyz")
-	for i := 0; i < 15; i++ {
-		x = append(x, x...)
-	}
-	re := MustCompile("^.bc(d|e)")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
-
-func BenchmarkOnePassShortA(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcddddddeeeededd")
-	re := MustCompile("^.bc(d|e)*$")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
-
-func BenchmarkNotOnePassShortA(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcddddddeeeededd")
-	re := MustCompile(".bc(d|e)*$")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
-
-func BenchmarkOnePassShortB(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcddddddeeeededd")
-	re := MustCompile("^.bc(?:d|e)*$")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
-
-func BenchmarkNotOnePassShortB(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcddddddeeeededd")
-	re := MustCompile(".bc(?:d|e)*$")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
-
-func BenchmarkOnePassLongPrefix(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcdefghijklmnopqrstuvwxyz")
-	re := MustCompile("^abcdefghijklmnopqrstuvwxyz.*$")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
-
-func BenchmarkOnePassLongNotPrefix(b *testing.B) {
-	b.StopTimer()
-	x := []byte("abcdefghijklmnopqrstuvwxyz")
-	re := MustCompile("^.bcdefghijklmnopqrstuvwxyz.*$")
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		re.Match(x)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/backtrack.go b/third_party/gofrontend/libgo/go/regexp/backtrack.go
deleted file mode 100644
index fd95604..0000000
--- a/third_party/gofrontend/libgo/go/regexp/backtrack.go
+++ /dev/null
@@ -1,366 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// backtrack is a regular expression search with submatch
-// tracking for small regular expressions and texts. It allocates
-// a bit vector with (length of input) * (length of prog) bits,
-// to make sure it never explores the same (character position, instruction)
-// state multiple times. This limits the search to run in time linear in
-// the length of the test.
-//
-// backtrack is a fast replacement for the NFA code on small
-// regexps when onepass cannot be used.
-
-package regexp
-
-import "regexp/syntax"
-
-// A job is an entry on the backtracker's job stack. It holds
-// the instruction pc and the position in the input.
-type job struct {
-	pc  uint32
-	arg int
-	pos int
-}
-
-const (
-	visitedBits        = 32
-	maxBacktrackProg   = 500        // len(prog.Inst) <= max
-	maxBacktrackVector = 256 * 1024 // bit vector size <= max (bits)
-)
-
-// bitState holds state for the backtracker.
-type bitState struct {
-	prog *syntax.Prog
-
-	end     int
-	cap     []int
-	input   input
-	jobs    []job
-	visited []uint32
-}
-
-var notBacktrack *bitState = nil
-
-// maxBitStateLen returns the maximum length of a string to search with
-// the backtracker using prog.
-func maxBitStateLen(prog *syntax.Prog) int {
-	if !shouldBacktrack(prog) {
-		return 0
-	}
-	return maxBacktrackVector / len(prog.Inst)
-}
-
-// newBitState returns a new bitState for the given prog,
-// or notBacktrack if the size of the prog exceeds the maximum size that
-// the backtracker will be run for.
-func newBitState(prog *syntax.Prog) *bitState {
-	if !shouldBacktrack(prog) {
-		return notBacktrack
-	}
-	return &bitState{
-		prog: prog,
-	}
-}
-
-// shouldBacktrack reports whether the program is too
-// long for the backtracker to run.
-func shouldBacktrack(prog *syntax.Prog) bool {
-	return len(prog.Inst) <= maxBacktrackProg
-}
-
-// reset resets the state of the backtracker.
-// end is the end position in the input.
-// ncap is the number of captures.
-func (b *bitState) reset(end int, ncap int) {
-	b.end = end
-
-	if cap(b.jobs) == 0 {
-		b.jobs = make([]job, 0, 256)
-	} else {
-		b.jobs = b.jobs[:0]
-	}
-
-	visitedSize := (len(b.prog.Inst)*(end+1) + visitedBits - 1) / visitedBits
-	if cap(b.visited) < visitedSize {
-		b.visited = make([]uint32, visitedSize, maxBacktrackVector/visitedBits)
-	} else {
-		b.visited = b.visited[:visitedSize]
-		for i := range b.visited {
-			b.visited[i] = 0
-		}
-	}
-
-	if cap(b.cap) < ncap {
-		b.cap = make([]int, ncap)
-	} else {
-		b.cap = b.cap[:ncap]
-	}
-	for i := range b.cap {
-		b.cap[i] = -1
-	}
-}
-
-// shouldVisit reports whether the combination of (pc, pos) has not
-// been visited yet.
-func (b *bitState) shouldVisit(pc uint32, pos int) bool {
-	n := uint(int(pc)*(b.end+1) + pos)
-	if b.visited[n/visitedBits]&(1<<(n&(visitedBits-1))) != 0 {
-		return false
-	}
-	b.visited[n/visitedBits] |= 1 << (n & (visitedBits - 1))
-	return true
-}
-
-// push pushes (pc, pos, arg) onto the job stack if it should be
-// visited.
-func (b *bitState) push(pc uint32, pos int, arg int) {
-	if b.prog.Inst[pc].Op == syntax.InstFail {
-		return
-	}
-
-	// Only check shouldVisit when arg == 0.
-	// When arg > 0, we are continuing a previous visit.
-	if arg == 0 && !b.shouldVisit(pc, pos) {
-		return
-	}
-
-	b.jobs = append(b.jobs, job{pc: pc, arg: arg, pos: pos})
-}
-
-// tryBacktrack runs a backtracking search starting at pos.
-func (m *machine) tryBacktrack(b *bitState, i input, pc uint32, pos int) bool {
-	longest := m.re.longest
-	m.matched = false
-
-	b.push(pc, pos, 0)
-	for len(b.jobs) > 0 {
-		l := len(b.jobs) - 1
-		// Pop job off the stack.
-		pc := b.jobs[l].pc
-		pos := b.jobs[l].pos
-		arg := b.jobs[l].arg
-		b.jobs = b.jobs[:l]
-
-		// Optimization: rather than push and pop,
-		// code that is going to Push and continue
-		// the loop simply updates ip, p, and arg
-		// and jumps to CheckAndLoop.  We have to
-		// do the ShouldVisit check that Push
-		// would have, but we avoid the stack
-		// manipulation.
-		goto Skip
-	CheckAndLoop:
-		if !b.shouldVisit(pc, pos) {
-			continue
-		}
-	Skip:
-
-		inst := b.prog.Inst[pc]
-
-		switch inst.Op {
-		default:
-			panic("bad inst")
-		case syntax.InstFail:
-			panic("unexpected InstFail")
-		case syntax.InstAlt:
-			// Cannot just
-			//   b.push(inst.Out, pos, 0)
-			//   b.push(inst.Arg, pos, 0)
-			// If during the processing of inst.Out, we encounter
-			// inst.Arg via another path, we want to process it then.
-			// Pushing it here will inhibit that. Instead, re-push
-			// inst with arg==1 as a reminder to push inst.Arg out
-			// later.
-			switch arg {
-			case 0:
-				b.push(pc, pos, 1)
-				pc = inst.Out
-				goto CheckAndLoop
-			case 1:
-				// Finished inst.Out; try inst.Arg.
-				arg = 0
-				pc = inst.Arg
-				goto CheckAndLoop
-			}
-			panic("bad arg in InstAlt")
-
-		case syntax.InstAltMatch:
-			// One opcode consumes runes; the other leads to match.
-			switch b.prog.Inst[inst.Out].Op {
-			case syntax.InstRune, syntax.InstRune1, syntax.InstRuneAny, syntax.InstRuneAnyNotNL:
-				// inst.Arg is the match.
-				b.push(inst.Arg, pos, 0)
-				pc = inst.Arg
-				pos = b.end
-				goto CheckAndLoop
-			}
-			// inst.Out is the match - non-greedy
-			b.push(inst.Out, b.end, 0)
-			pc = inst.Out
-			goto CheckAndLoop
-
-		case syntax.InstRune:
-			r, width := i.step(pos)
-			if !inst.MatchRune(r) {
-				continue
-			}
-			pos += width
-			pc = inst.Out
-			goto CheckAndLoop
-
-		case syntax.InstRune1:
-			r, width := i.step(pos)
-			if r != inst.Rune[0] {
-				continue
-			}
-			pos += width
-			pc = inst.Out
-			goto CheckAndLoop
-
-		case syntax.InstRuneAnyNotNL:
-			r, width := i.step(pos)
-			if r == '\n' || r == endOfText {
-				continue
-			}
-			pos += width
-			pc = inst.Out
-			goto CheckAndLoop
-
-		case syntax.InstRuneAny:
-			r, width := i.step(pos)
-			if r == endOfText {
-				continue
-			}
-			pos += width
-			pc = inst.Out
-			goto CheckAndLoop
-
-		case syntax.InstCapture:
-			switch arg {
-			case 0:
-				if 0 <= inst.Arg && inst.Arg < uint32(len(b.cap)) {
-					// Capture pos to register, but save old value.
-					b.push(pc, b.cap[inst.Arg], 1) // come back when we're done.
-					b.cap[inst.Arg] = pos
-				}
-				pc = inst.Out
-				goto CheckAndLoop
-			case 1:
-				// Finished inst.Out; restore the old value.
-				b.cap[inst.Arg] = pos
-				continue
-
-			}
-			panic("bad arg in InstCapture")
-			continue
-
-		case syntax.InstEmptyWidth:
-			if syntax.EmptyOp(inst.Arg)&^i.context(pos) != 0 {
-				continue
-			}
-			pc = inst.Out
-			goto CheckAndLoop
-
-		case syntax.InstNop:
-			pc = inst.Out
-			goto CheckAndLoop
-
-		case syntax.InstMatch:
-			// We found a match. If the caller doesn't care
-			// where the match is, no point going further.
-			if len(b.cap) == 0 {
-				m.matched = true
-				return m.matched
-			}
-
-			// Record best match so far.
-			// Only need to check end point, because this entire
-			// call is only considering one start position.
-			if len(b.cap) > 1 {
-				b.cap[1] = pos
-			}
-			if !m.matched || (longest && pos > 0 && pos > m.matchcap[1]) {
-				copy(m.matchcap, b.cap)
-			}
-			m.matched = true
-
-			// If going for first match, we're done.
-			if !longest {
-				return m.matched
-			}
-
-			// If we used the entire text, no longer match is possible.
-			if pos == b.end {
-				return m.matched
-			}
-
-			// Otherwise, continue on in hope of a longer match.
-			continue
-		}
-		panic("unreachable")
-	}
-
-	return m.matched
-}
-
-// backtrack runs a backtracking search of prog on the input starting at pos.
-func (m *machine) backtrack(i input, pos int, end int, ncap int) bool {
-	if !i.canCheckPrefix() {
-		panic("backtrack called for a RuneReader")
-	}
-
-	startCond := m.re.cond
-	if startCond == ^syntax.EmptyOp(0) { // impossible
-		return false
-	}
-	if startCond&syntax.EmptyBeginText != 0 && pos != 0 {
-		// Anchored match, past beginning of text.
-		return false
-	}
-
-	b := m.b
-	b.reset(end, ncap)
-
-	m.matchcap = m.matchcap[:ncap]
-	for i := range m.matchcap {
-		m.matchcap[i] = -1
-	}
-
-	// Anchored search must start at the beginning of the input
-	if startCond&syntax.EmptyBeginText != 0 {
-		if len(b.cap) > 0 {
-			b.cap[0] = pos
-		}
-		return m.tryBacktrack(b, i, uint32(m.p.Start), pos)
-	}
-
-	// Unanchored search, starting from each possible text position.
-	// Notice that we have to try the empty string at the end of
-	// the text, so the loop condition is pos <= end, not pos < end.
-	// This looks like it's quadratic in the size of the text,
-	// but we are not clearing visited between calls to TrySearch,
-	// so no work is duplicated and it ends up still being linear.
-	width := -1
-	for ; pos <= end && width != 0; pos += width {
-		if len(m.re.prefix) > 0 {
-			// Match requires literal prefix; fast search for it.
-			advance := i.index(m.re, pos)
-			if advance < 0 {
-				return false
-			}
-			pos += advance
-		}
-
-		if len(b.cap) > 0 {
-			b.cap[0] = pos
-		}
-		if m.tryBacktrack(b, i, uint32(m.p.Start), pos) {
-			// Match must be leftmost; done.
-			return true
-		}
-		_, width = i.step(pos)
-	}
-	return false
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/exec.go b/third_party/gofrontend/libgo/go/regexp/exec.go
deleted file mode 100644
index 5182720..0000000
--- a/third_party/gofrontend/libgo/go/regexp/exec.go
+++ /dev/null
@@ -1,468 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package regexp
-
-import (
-	"io"
-	"regexp/syntax"
-)
-
-// A queue is a 'sparse array' holding pending threads of execution.
-// See http://research.swtch.com/2008/03/using-uninitialized-memory-for-fun-and.html
-type queue struct {
-	sparse []uint32
-	dense  []entry
-}
-
-// A entry is an entry on a queue.
-// It holds both the instruction pc and the actual thread.
-// Some queue entries are just place holders so that the machine
-// knows it has considered that pc.  Such entries have t == nil.
-type entry struct {
-	pc uint32
-	t  *thread
-}
-
-// A thread is the state of a single path through the machine:
-// an instruction and a corresponding capture array.
-// See http://swtch.com/~rsc/regexp/regexp2.html
-type thread struct {
-	inst *syntax.Inst
-	cap  []int
-}
-
-// A machine holds all the state during an NFA simulation for p.
-type machine struct {
-	re             *Regexp      // corresponding Regexp
-	p              *syntax.Prog // compiled program
-	op             *onePassProg // compiled onepass program, or notOnePass
-	maxBitStateLen int          // max length of string to search with bitstate
-	b              *bitState    // state for backtracker, allocated lazily
-	q0, q1         queue        // two queues for runq, nextq
-	pool           []*thread    // pool of available threads
-	matched        bool         // whether a match was found
-	matchcap       []int        // capture information for the match
-
-	// cached inputs, to avoid allocation
-	inputBytes  inputBytes
-	inputString inputString
-	inputReader inputReader
-}
-
-func (m *machine) newInputBytes(b []byte) input {
-	m.inputBytes.str = b
-	return &m.inputBytes
-}
-
-func (m *machine) newInputString(s string) input {
-	m.inputString.str = s
-	return &m.inputString
-}
-
-func (m *machine) newInputReader(r io.RuneReader) input {
-	m.inputReader.r = r
-	m.inputReader.atEOT = false
-	m.inputReader.pos = 0
-	return &m.inputReader
-}
-
-// progMachine returns a new machine running the prog p.
-func progMachine(p *syntax.Prog, op *onePassProg) *machine {
-	m := &machine{p: p, op: op}
-	n := len(m.p.Inst)
-	m.q0 = queue{make([]uint32, n), make([]entry, 0, n)}
-	m.q1 = queue{make([]uint32, n), make([]entry, 0, n)}
-	ncap := p.NumCap
-	if ncap < 2 {
-		ncap = 2
-	}
-	if op == notOnePass {
-		m.maxBitStateLen = maxBitStateLen(p)
-	}
-	m.matchcap = make([]int, ncap)
-	return m
-}
-
-func (m *machine) init(ncap int) {
-	for _, t := range m.pool {
-		t.cap = t.cap[:ncap]
-	}
-	m.matchcap = m.matchcap[:ncap]
-}
-
-// alloc allocates a new thread with the given instruction.
-// It uses the free pool if possible.
-func (m *machine) alloc(i *syntax.Inst) *thread {
-	var t *thread
-	if n := len(m.pool); n > 0 {
-		t = m.pool[n-1]
-		m.pool = m.pool[:n-1]
-	} else {
-		t = new(thread)
-		t.cap = make([]int, len(m.matchcap), cap(m.matchcap))
-	}
-	t.inst = i
-	return t
-}
-
-// free returns t to the free pool.
-func (m *machine) free(t *thread) {
-	m.inputBytes.str = nil
-	m.inputString.str = ""
-	m.inputReader.r = nil
-	m.pool = append(m.pool, t)
-}
-
-// match runs the machine over the input starting at pos.
-// It reports whether a match was found.
-// If so, m.matchcap holds the submatch information.
-func (m *machine) match(i input, pos int) bool {
-	startCond := m.re.cond
-	if startCond == ^syntax.EmptyOp(0) { // impossible
-		return false
-	}
-	m.matched = false
-	for i := range m.matchcap {
-		m.matchcap[i] = -1
-	}
-	runq, nextq := &m.q0, &m.q1
-	r, r1 := endOfText, endOfText
-	width, width1 := 0, 0
-	r, width = i.step(pos)
-	if r != endOfText {
-		r1, width1 = i.step(pos + width)
-	}
-	var flag syntax.EmptyOp
-	if pos == 0 {
-		flag = syntax.EmptyOpContext(-1, r)
-	} else {
-		flag = i.context(pos)
-	}
-	for {
-		if len(runq.dense) == 0 {
-			if startCond&syntax.EmptyBeginText != 0 && pos != 0 {
-				// Anchored match, past beginning of text.
-				break
-			}
-			if m.matched {
-				// Have match; finished exploring alternatives.
-				break
-			}
-			if len(m.re.prefix) > 0 && r1 != m.re.prefixRune && i.canCheckPrefix() {
-				// Match requires literal prefix; fast search for it.
-				advance := i.index(m.re, pos)
-				if advance < 0 {
-					break
-				}
-				pos += advance
-				r, width = i.step(pos)
-				r1, width1 = i.step(pos + width)
-			}
-		}
-		if !m.matched {
-			if len(m.matchcap) > 0 {
-				m.matchcap[0] = pos
-			}
-			m.add(runq, uint32(m.p.Start), pos, m.matchcap, flag, nil)
-		}
-		flag = syntax.EmptyOpContext(r, r1)
-		m.step(runq, nextq, pos, pos+width, r, flag)
-		if width == 0 {
-			break
-		}
-		if len(m.matchcap) == 0 && m.matched {
-			// Found a match and not paying attention
-			// to where it is, so any match will do.
-			break
-		}
-		pos += width
-		r, width = r1, width1
-		if r != endOfText {
-			r1, width1 = i.step(pos + width)
-		}
-		runq, nextq = nextq, runq
-	}
-	m.clear(nextq)
-	return m.matched
-}
-
-// clear frees all threads on the thread queue.
-func (m *machine) clear(q *queue) {
-	for _, d := range q.dense {
-		if d.t != nil {
-			// m.free(d.t)
-			m.pool = append(m.pool, d.t)
-		}
-	}
-	q.dense = q.dense[:0]
-}
-
-// step executes one step of the machine, running each of the threads
-// on runq and appending new threads to nextq.
-// The step processes the rune c (which may be endOfText),
-// which starts at position pos and ends at nextPos.
-// nextCond gives the setting for the empty-width flags after c.
-func (m *machine) step(runq, nextq *queue, pos, nextPos int, c rune, nextCond syntax.EmptyOp) {
-	longest := m.re.longest
-	for j := 0; j < len(runq.dense); j++ {
-		d := &runq.dense[j]
-		t := d.t
-		if t == nil {
-			continue
-		}
-		if longest && m.matched && len(t.cap) > 0 && m.matchcap[0] < t.cap[0] {
-			// m.free(t)
-			m.pool = append(m.pool, t)
-			continue
-		}
-		i := t.inst
-		add := false
-		switch i.Op {
-		default:
-			panic("bad inst")
-
-		case syntax.InstMatch:
-			if len(t.cap) > 0 && (!longest || !m.matched || m.matchcap[1] < pos) {
-				t.cap[1] = pos
-				copy(m.matchcap, t.cap)
-			}
-			if !longest {
-				// First-match mode: cut off all lower-priority threads.
-				for _, d := range runq.dense[j+1:] {
-					if d.t != nil {
-						// m.free(d.t)
-						m.pool = append(m.pool, d.t)
-					}
-				}
-				runq.dense = runq.dense[:0]
-			}
-			m.matched = true
-
-		case syntax.InstRune:
-			add = i.MatchRune(c)
-		case syntax.InstRune1:
-			add = c == i.Rune[0]
-		case syntax.InstRuneAny:
-			add = true
-		case syntax.InstRuneAnyNotNL:
-			add = c != '\n'
-		}
-		if add {
-			t = m.add(nextq, i.Out, nextPos, t.cap, nextCond, t)
-		}
-		if t != nil {
-			// m.free(t)
-			m.pool = append(m.pool, t)
-		}
-	}
-	runq.dense = runq.dense[:0]
-}
-
-// add adds an entry to q for pc, unless the q already has such an entry.
-// It also recursively adds an entry for all instructions reachable from pc by following
-// empty-width conditions satisfied by cond.  pos gives the current position
-// in the input.
-func (m *machine) add(q *queue, pc uint32, pos int, cap []int, cond syntax.EmptyOp, t *thread) *thread {
-	if pc == 0 {
-		return t
-	}
-	if j := q.sparse[pc]; j < uint32(len(q.dense)) && q.dense[j].pc == pc {
-		return t
-	}
-
-	j := len(q.dense)
-	q.dense = q.dense[:j+1]
-	d := &q.dense[j]
-	d.t = nil
-	d.pc = pc
-	q.sparse[pc] = uint32(j)
-
-	i := &m.p.Inst[pc]
-	switch i.Op {
-	default:
-		panic("unhandled")
-	case syntax.InstFail:
-		// nothing
-	case syntax.InstAlt, syntax.InstAltMatch:
-		t = m.add(q, i.Out, pos, cap, cond, t)
-		t = m.add(q, i.Arg, pos, cap, cond, t)
-	case syntax.InstEmptyWidth:
-		if syntax.EmptyOp(i.Arg)&^cond == 0 {
-			t = m.add(q, i.Out, pos, cap, cond, t)
-		}
-	case syntax.InstNop:
-		t = m.add(q, i.Out, pos, cap, cond, t)
-	case syntax.InstCapture:
-		if int(i.Arg) < len(cap) {
-			opos := cap[i.Arg]
-			cap[i.Arg] = pos
-			m.add(q, i.Out, pos, cap, cond, nil)
-			cap[i.Arg] = opos
-		} else {
-			t = m.add(q, i.Out, pos, cap, cond, t)
-		}
-	case syntax.InstMatch, syntax.InstRune, syntax.InstRune1, syntax.InstRuneAny, syntax.InstRuneAnyNotNL:
-		if t == nil {
-			t = m.alloc(i)
-		} else {
-			t.inst = i
-		}
-		if len(cap) > 0 && &t.cap[0] != &cap[0] {
-			copy(t.cap, cap)
-		}
-		d.t = t
-		t = nil
-	}
-	return t
-}
-
-// onepass runs the machine over the input starting at pos.
-// It reports whether a match was found.
-// If so, m.matchcap holds the submatch information.
-func (m *machine) onepass(i input, pos int) bool {
-	startCond := m.re.cond
-	if startCond == ^syntax.EmptyOp(0) { // impossible
-		return false
-	}
-	m.matched = false
-	for i := range m.matchcap {
-		m.matchcap[i] = -1
-	}
-	r, r1 := endOfText, endOfText
-	width, width1 := 0, 0
-	r, width = i.step(pos)
-	if r != endOfText {
-		r1, width1 = i.step(pos + width)
-	}
-	var flag syntax.EmptyOp
-	if pos == 0 {
-		flag = syntax.EmptyOpContext(-1, r)
-	} else {
-		flag = i.context(pos)
-	}
-	pc := m.op.Start
-	inst := m.op.Inst[pc]
-	// If there is a simple literal prefix, skip over it.
-	if pos == 0 && syntax.EmptyOp(inst.Arg)&^flag == 0 &&
-		len(m.re.prefix) > 0 && i.canCheckPrefix() {
-		// Match requires literal prefix; fast search for it.
-		if i.hasPrefix(m.re) {
-			pos += len(m.re.prefix)
-			r, width = i.step(pos)
-			r1, width1 = i.step(pos + width)
-			flag = i.context(pos)
-			pc = int(m.re.prefixEnd)
-		} else {
-			return m.matched
-		}
-	}
-	for {
-		inst = m.op.Inst[pc]
-		pc = int(inst.Out)
-		switch inst.Op {
-		default:
-			panic("bad inst")
-		case syntax.InstMatch:
-			m.matched = true
-			if len(m.matchcap) > 0 {
-				m.matchcap[0] = 0
-				m.matchcap[1] = pos
-			}
-			return m.matched
-		case syntax.InstRune:
-			if !inst.MatchRune(r) {
-				return m.matched
-			}
-		case syntax.InstRune1:
-			if r != inst.Rune[0] {
-				return m.matched
-			}
-		case syntax.InstRuneAny:
-			// Nothing
-		case syntax.InstRuneAnyNotNL:
-			if r == '\n' {
-				return m.matched
-			}
-		// peek at the input rune to see which branch of the Alt to take
-		case syntax.InstAlt, syntax.InstAltMatch:
-			pc = int(onePassNext(&inst, r))
-			continue
-		case syntax.InstFail:
-			return m.matched
-		case syntax.InstNop:
-			continue
-		case syntax.InstEmptyWidth:
-			if syntax.EmptyOp(inst.Arg)&^flag != 0 {
-				return m.matched
-			}
-			continue
-		case syntax.InstCapture:
-			if int(inst.Arg) < len(m.matchcap) {
-				m.matchcap[inst.Arg] = pos
-			}
-			continue
-		}
-		if width == 0 {
-			break
-		}
-		flag = syntax.EmptyOpContext(r, r1)
-		pos += width
-		r, width = r1, width1
-		if r != endOfText {
-			r1, width1 = i.step(pos + width)
-		}
-	}
-	return m.matched
-}
-
-// empty is a non-nil 0-element slice,
-// so doExecute can avoid an allocation
-// when 0 captures are requested from a successful match.
-var empty = make([]int, 0)
-
-// doExecute finds the leftmost match in the input and returns
-// the position of its subexpressions.
-func (re *Regexp) doExecute(r io.RuneReader, b []byte, s string, pos int, ncap int) []int {
-	m := re.get()
-	var i input
-	var size int
-	if r != nil {
-		i = m.newInputReader(r)
-	} else if b != nil {
-		i = m.newInputBytes(b)
-		size = len(b)
-	} else {
-		i = m.newInputString(s)
-		size = len(s)
-	}
-	if m.op != notOnePass {
-		if !m.onepass(i, pos) {
-			re.put(m)
-			return nil
-		}
-	} else if size < m.maxBitStateLen && r == nil {
-		if m.b == nil {
-			m.b = newBitState(m.p)
-		}
-		if !m.backtrack(i, pos, size, ncap) {
-			re.put(m)
-			return nil
-		}
-	} else {
-		m.init(ncap)
-		if !m.match(i, pos) {
-			re.put(m)
-			return nil
-		}
-	}
-	if ncap == 0 {
-		re.put(m)
-		return empty // empty but not nil
-	}
-	cap := make([]int, len(m.matchcap))
-	copy(cap, m.matchcap)
-	re.put(m)
-	return cap
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/exec2_test.go b/third_party/gofrontend/libgo/go/regexp/exec2_test.go
deleted file mode 100644
index 7b86b41..0000000
--- a/third_party/gofrontend/libgo/go/regexp/exec2_test.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !race
-
-package regexp
-
-import (
-	"testing"
-)
-
-// This test is excluded when running under the race detector because
-// it is a very expensive test and takes too long.
-func TestRE2Exhaustive(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping TestRE2Exhaustive during short test")
-	}
-	testRE2(t, "testdata/re2-exhaustive.txt.bz2")
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/exec_test.go b/third_party/gofrontend/libgo/go/regexp/exec_test.go
deleted file mode 100644
index 4872cb3..0000000
--- a/third_party/gofrontend/libgo/go/regexp/exec_test.go
+++ /dev/null
@@ -1,727 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package regexp
-
-import (
-	"bufio"
-	"compress/bzip2"
-	"fmt"
-	"io"
-	"os"
-	"path/filepath"
-	"regexp/syntax"
-	"strconv"
-	"strings"
-	"testing"
-	"unicode/utf8"
-)
-
-// TestRE2 tests this package's regexp API against test cases
-// considered during RE2's exhaustive tests, which run all possible
-// regexps over a given set of atoms and operators, up to a given
-// complexity, over all possible strings over a given alphabet,
-// up to a given size.  Rather than try to link with RE2, we read a
-// log file containing the test cases and the expected matches.
-// The log file, re2-exhaustive.txt, is generated by running 'make log'
-// in the open source RE2 distribution https://github.com/google/re2/.
-//
-// The test file format is a sequence of stanzas like:
-//
-//	strings
-//	"abc"
-//	"123x"
-//	regexps
-//	"[a-z]+"
-//	0-3;0-3
-//	-;-
-//	"([0-9])([0-9])([0-9])"
-//	-;-
-//	-;0-3 0-1 1-2 2-3
-//
-// The stanza begins by defining a set of strings, quoted
-// using Go double-quote syntax, one per line.  Then the
-// regexps section gives a sequence of regexps to run on
-// the strings.  In the block that follows a regexp, each line
-// gives the semicolon-separated match results of running
-// the regexp on the corresponding string.
-// Each match result is either a single -, meaning no match, or a
-// space-separated sequence of pairs giving the match and
-// submatch indices.  An unmatched subexpression formats
-// its pair as a single - (not illustrated above).  For now
-// each regexp run produces two match results, one for a
-// ``full match'' that restricts the regexp to matching the entire
-// string or nothing, and one for a ``partial match'' that gives
-// the leftmost first match found in the string.
-//
-// Lines beginning with # are comments.  Lines beginning with
-// a capital letter are test names printed during RE2's test suite
-// and are echoed into t but otherwise ignored.
-//
-// At time of writing, re2-exhaustive.txt is 59 MB but compresses to 385 kB,
-// so we store re2-exhaustive.txt.bz2 in the repository and decompress it on the fly.
-//
-func TestRE2Search(t *testing.T) {
-	testRE2(t, "testdata/re2-search.txt")
-}
-
-func testRE2(t *testing.T, file string) {
-	f, err := os.Open(file)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer f.Close()
-	var txt io.Reader
-	if strings.HasSuffix(file, ".bz2") {
-		z := bzip2.NewReader(f)
-		txt = z
-		file = file[:len(file)-len(".bz2")] // for error messages
-	} else {
-		txt = f
-	}
-	lineno := 0
-	scanner := bufio.NewScanner(txt)
-	var (
-		str       []string
-		input     []string
-		inStrings bool
-		re        *Regexp
-		refull    *Regexp
-		nfail     int
-		ncase     int
-	)
-	for lineno := 1; scanner.Scan(); lineno++ {
-		line := scanner.Text()
-		switch {
-		case line == "":
-			t.Fatalf("%s:%d: unexpected blank line", file, lineno)
-		case line[0] == '#':
-			continue
-		case 'A' <= line[0] && line[0] <= 'Z':
-			// Test name.
-			t.Logf("%s\n", line)
-			continue
-		case line == "strings":
-			str = str[:0]
-			inStrings = true
-		case line == "regexps":
-			inStrings = false
-		case line[0] == '"':
-			q, err := strconv.Unquote(line)
-			if err != nil {
-				// Fatal because we'll get out of sync.
-				t.Fatalf("%s:%d: unquote %s: %v", file, lineno, line, err)
-			}
-			if inStrings {
-				str = append(str, q)
-				continue
-			}
-			// Is a regexp.
-			if len(input) != 0 {
-				t.Fatalf("%s:%d: out of sync: have %d strings left before %#q", file, lineno, len(input), q)
-			}
-			re, err = tryCompile(q)
-			if err != nil {
-				if err.Error() == "error parsing regexp: invalid escape sequence: `\\C`" {
-					// We don't and likely never will support \C; keep going.
-					continue
-				}
-				t.Errorf("%s:%d: compile %#q: %v", file, lineno, q, err)
-				if nfail++; nfail >= 100 {
-					t.Fatalf("stopping after %d errors", nfail)
-				}
-				continue
-			}
-			full := `\A(?:` + q + `)\z`
-			refull, err = tryCompile(full)
-			if err != nil {
-				// Fatal because q worked, so this should always work.
-				t.Fatalf("%s:%d: compile full %#q: %v", file, lineno, full, err)
-			}
-			input = str
-		case line[0] == '-' || '0' <= line[0] && line[0] <= '9':
-			// A sequence of match results.
-			ncase++
-			if re == nil {
-				// Failed to compile: skip results.
-				continue
-			}
-			if len(input) == 0 {
-				t.Fatalf("%s:%d: out of sync: no input remaining", file, lineno)
-			}
-			var text string
-			text, input = input[0], input[1:]
-			if !isSingleBytes(text) && strings.Contains(re.String(), `\B`) {
-				// RE2's \B considers every byte position,
-				// so it sees 'not word boundary' in the
-				// middle of UTF-8 sequences.  This package
-				// only considers the positions between runes,
-				// so it disagrees.  Skip those cases.
-				continue
-			}
-			res := strings.Split(line, ";")
-			if len(res) != len(run) {
-				t.Fatalf("%s:%d: have %d test results, want %d", file, lineno, len(res), len(run))
-			}
-			for i := range res {
-				have, suffix := run[i](re, refull, text)
-				want := parseResult(t, file, lineno, res[i])
-				if !same(have, want) {
-					t.Errorf("%s:%d: %#q%s.FindSubmatchIndex(%#q) = %v, want %v", file, lineno, re, suffix, text, have, want)
-					if nfail++; nfail >= 100 {
-						t.Fatalf("stopping after %d errors", nfail)
-					}
-					continue
-				}
-				b, suffix := match[i](re, refull, text)
-				if b != (want != nil) {
-					t.Errorf("%s:%d: %#q%s.MatchString(%#q) = %v, want %v", file, lineno, re, suffix, text, b, !b)
-					if nfail++; nfail >= 100 {
-						t.Fatalf("stopping after %d errors", nfail)
-					}
-					continue
-				}
-			}
-
-		default:
-			t.Fatalf("%s:%d: out of sync: %s\n", file, lineno, line)
-		}
-	}
-	if err := scanner.Err(); err != nil {
-		t.Fatalf("%s:%d: %v", file, lineno, err)
-	}
-	if len(input) != 0 {
-		t.Fatalf("%s:%d: out of sync: have %d strings left at EOF", file, lineno, len(input))
-	}
-	t.Logf("%d cases tested", ncase)
-}
-
-var run = []func(*Regexp, *Regexp, string) ([]int, string){
-	runFull,
-	runPartial,
-	runFullLongest,
-	runPartialLongest,
-}
-
-func runFull(re, refull *Regexp, text string) ([]int, string) {
-	refull.longest = false
-	return refull.FindStringSubmatchIndex(text), "[full]"
-}
-
-func runPartial(re, refull *Regexp, text string) ([]int, string) {
-	re.longest = false
-	return re.FindStringSubmatchIndex(text), ""
-}
-
-func runFullLongest(re, refull *Regexp, text string) ([]int, string) {
-	refull.longest = true
-	return refull.FindStringSubmatchIndex(text), "[full,longest]"
-}
-
-func runPartialLongest(re, refull *Regexp, text string) ([]int, string) {
-	re.longest = true
-	return re.FindStringSubmatchIndex(text), "[longest]"
-}
-
-var match = []func(*Regexp, *Regexp, string) (bool, string){
-	matchFull,
-	matchPartial,
-	matchFullLongest,
-	matchPartialLongest,
-}
-
-func matchFull(re, refull *Regexp, text string) (bool, string) {
-	refull.longest = false
-	return refull.MatchString(text), "[full]"
-}
-
-func matchPartial(re, refull *Regexp, text string) (bool, string) {
-	re.longest = false
-	return re.MatchString(text), ""
-}
-
-func matchFullLongest(re, refull *Regexp, text string) (bool, string) {
-	refull.longest = true
-	return refull.MatchString(text), "[full,longest]"
-}
-
-func matchPartialLongest(re, refull *Regexp, text string) (bool, string) {
-	re.longest = true
-	return re.MatchString(text), "[longest]"
-}
-
-func isSingleBytes(s string) bool {
-	for _, c := range s {
-		if c >= utf8.RuneSelf {
-			return false
-		}
-	}
-	return true
-}
-
-func tryCompile(s string) (re *Regexp, err error) {
-	// Protect against panic during Compile.
-	defer func() {
-		if r := recover(); r != nil {
-			err = fmt.Errorf("panic: %v", r)
-		}
-	}()
-	return Compile(s)
-}
-
-func parseResult(t *testing.T, file string, lineno int, res string) []int {
-	// A single - indicates no match.
-	if res == "-" {
-		return nil
-	}
-	// Otherwise, a space-separated list of pairs.
-	n := 1
-	for j := 0; j < len(res); j++ {
-		if res[j] == ' ' {
-			n++
-		}
-	}
-	out := make([]int, 2*n)
-	i := 0
-	n = 0
-	for j := 0; j <= len(res); j++ {
-		if j == len(res) || res[j] == ' ' {
-			// Process a single pair.  - means no submatch.
-			pair := res[i:j]
-			if pair == "-" {
-				out[n] = -1
-				out[n+1] = -1
-			} else {
-				k := strings.Index(pair, "-")
-				if k < 0 {
-					t.Fatalf("%s:%d: invalid pair %s", file, lineno, pair)
-				}
-				lo, err1 := strconv.Atoi(pair[:k])
-				hi, err2 := strconv.Atoi(pair[k+1:])
-				if err1 != nil || err2 != nil || lo > hi {
-					t.Fatalf("%s:%d: invalid pair %s", file, lineno, pair)
-				}
-				out[n] = lo
-				out[n+1] = hi
-			}
-			n += 2
-			i = j + 1
-		}
-	}
-	return out
-}
-
-func same(x, y []int) bool {
-	if len(x) != len(y) {
-		return false
-	}
-	for i, xi := range x {
-		if xi != y[i] {
-			return false
-		}
-	}
-	return true
-}
-
-// TestFowler runs this package's regexp API against the
-// POSIX regular expression tests collected by Glenn Fowler
-// at http://www2.research.att.com/~astopen/testregex/testregex.html.
-func TestFowler(t *testing.T) {
-	files, err := filepath.Glob("testdata/*.dat")
-	if err != nil {
-		t.Fatal(err)
-	}
-	for _, file := range files {
-		t.Log(file)
-		testFowler(t, file)
-	}
-}
-
-var notab = MustCompilePOSIX(`[^\t]+`)
-
-func testFowler(t *testing.T, file string) {
-	f, err := os.Open(file)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	defer f.Close()
-	b := bufio.NewReader(f)
-	lineno := 0
-	lastRegexp := ""
-Reading:
-	for {
-		lineno++
-		line, err := b.ReadString('\n')
-		if err != nil {
-			if err != io.EOF {
-				t.Errorf("%s:%d: %v", file, lineno, err)
-			}
-			break Reading
-		}
-
-		// http://www2.research.att.com/~astopen/man/man1/testregex.html
-		//
-		// INPUT FORMAT
-		//   Input lines may be blank, a comment beginning with #, or a test
-		//   specification. A specification is five fields separated by one
-		//   or more tabs. NULL denotes the empty string and NIL denotes the
-		//   0 pointer.
-		if line[0] == '#' || line[0] == '\n' {
-			continue Reading
-		}
-		line = line[:len(line)-1]
-		field := notab.FindAllString(line, -1)
-		for i, f := range field {
-			if f == "NULL" {
-				field[i] = ""
-			}
-			if f == "NIL" {
-				t.Logf("%s:%d: skip: %s", file, lineno, line)
-				continue Reading
-			}
-		}
-		if len(field) == 0 {
-			continue Reading
-		}
-
-		//   Field 1: the regex(3) flags to apply, one character per REG_feature
-		//   flag. The test is skipped if REG_feature is not supported by the
-		//   implementation. If the first character is not [BEASKLP] then the
-		//   specification is a global control line. One or more of [BEASKLP] may be
-		//   specified; the test will be repeated for each mode.
-		//
-		//     B 	basic			BRE	(grep, ed, sed)
-		//     E 	REG_EXTENDED		ERE	(egrep)
-		//     A	REG_AUGMENTED		ARE	(egrep with negation)
-		//     S	REG_SHELL		SRE	(sh glob)
-		//     K	REG_SHELL|REG_AUGMENTED	KRE	(ksh glob)
-		//     L	REG_LITERAL		LRE	(fgrep)
-		//
-		//     a	REG_LEFT|REG_RIGHT	implicit ^...$
-		//     b	REG_NOTBOL		lhs does not match ^
-		//     c	REG_COMMENT		ignore space and #...\n
-		//     d	REG_SHELL_DOT		explicit leading . match
-		//     e	REG_NOTEOL		rhs does not match $
-		//     f	REG_MULTIPLE		multiple \n separated patterns
-		//     g	FNM_LEADING_DIR		testfnmatch only -- match until /
-		//     h	REG_MULTIREF		multiple digit backref
-		//     i	REG_ICASE		ignore case
-		//     j	REG_SPAN		. matches \n
-		//     k	REG_ESCAPE		\ to ecape [...] delimiter
-		//     l	REG_LEFT		implicit ^...
-		//     m	REG_MINIMAL		minimal match
-		//     n	REG_NEWLINE		explicit \n match
-		//     o	REG_ENCLOSED		(|&) magic inside [@|&](...)
-		//     p	REG_SHELL_PATH		explicit / match
-		//     q	REG_DELIMITED		delimited pattern
-		//     r	REG_RIGHT		implicit ...$
-		//     s	REG_SHELL_ESCAPED	\ not special
-		//     t	REG_MUSTDELIM		all delimiters must be specified
-		//     u	standard unspecified behavior -- errors not counted
-		//     v	REG_CLASS_ESCAPE	\ special inside [...]
-		//     w	REG_NOSUB		no subexpression match array
-		//     x	REG_LENIENT		let some errors slide
-		//     y	REG_LEFT		regexec() implicit ^...
-		//     z	REG_NULL		NULL subexpressions ok
-		//     $	                        expand C \c escapes in fields 2 and 3
-		//     /	                        field 2 is a regsubcomp() expression
-		//     =	                        field 3 is a regdecomp() expression
-		//
-		//   Field 1 control lines:
-		//
-		//     C		set LC_COLLATE and LC_CTYPE to locale in field 2
-		//
-		//     ?test ...	output field 5 if passed and != EXPECTED, silent otherwise
-		//     &test ...	output field 5 if current and previous passed
-		//     |test ...	output field 5 if current passed and previous failed
-		//     ; ...	output field 2 if previous failed
-		//     {test ...	skip if failed until }
-		//     }		end of skip
-		//
-		//     : comment		comment copied as output NOTE
-		//     :comment:test	:comment: ignored
-		//     N[OTE] comment	comment copied as output NOTE
-		//     T[EST] comment	comment
-		//
-		//     number		use number for nmatch (20 by default)
-		flag := field[0]
-		switch flag[0] {
-		case '?', '&', '|', ';', '{', '}':
-			// Ignore all the control operators.
-			// Just run everything.
-			flag = flag[1:]
-			if flag == "" {
-				continue Reading
-			}
-		case ':':
-			i := strings.Index(flag[1:], ":")
-			if i < 0 {
-				t.Logf("skip: %s", line)
-				continue Reading
-			}
-			flag = flag[1+i+1:]
-		case 'C', 'N', 'T', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
-			t.Logf("skip: %s", line)
-			continue Reading
-		}
-
-		// Can check field count now that we've handled the myriad comment formats.
-		if len(field) < 4 {
-			t.Errorf("%s:%d: too few fields: %s", file, lineno, line)
-			continue Reading
-		}
-
-		// Expand C escapes (a.k.a. Go escapes).
-		if strings.Contains(flag, "$") {
-			f := `"` + field[1] + `"`
-			if field[1], err = strconv.Unquote(f); err != nil {
-				t.Errorf("%s:%d: cannot unquote %s", file, lineno, f)
-			}
-			f = `"` + field[2] + `"`
-			if field[2], err = strconv.Unquote(f); err != nil {
-				t.Errorf("%s:%d: cannot unquote %s", file, lineno, f)
-			}
-		}
-
-		//   Field 2: the regular expression pattern; SAME uses the pattern from
-		//     the previous specification.
-		//
-		if field[1] == "SAME" {
-			field[1] = lastRegexp
-		}
-		lastRegexp = field[1]
-
-		//   Field 3: the string to match.
-		text := field[2]
-
-		//   Field 4: the test outcome...
-		ok, shouldCompile, shouldMatch, pos := parseFowlerResult(field[3])
-		if !ok {
-			t.Errorf("%s:%d: cannot parse result %#q", file, lineno, field[3])
-			continue Reading
-		}
-
-		//   Field 5: optional comment appended to the report.
-
-	Testing:
-		// Run test once for each specified capital letter mode that we support.
-		for _, c := range flag {
-			pattern := field[1]
-			syn := syntax.POSIX | syntax.ClassNL
-			switch c {
-			default:
-				continue Testing
-			case 'E':
-				// extended regexp (what we support)
-			case 'L':
-				// literal
-				pattern = QuoteMeta(pattern)
-			}
-
-			for _, c := range flag {
-				switch c {
-				case 'i':
-					syn |= syntax.FoldCase
-				}
-			}
-
-			re, err := compile(pattern, syn, true)
-			if err != nil {
-				if shouldCompile {
-					t.Errorf("%s:%d: %#q did not compile", file, lineno, pattern)
-				}
-				continue Testing
-			}
-			if !shouldCompile {
-				t.Errorf("%s:%d: %#q should not compile", file, lineno, pattern)
-				continue Testing
-			}
-			match := re.MatchString(text)
-			if match != shouldMatch {
-				t.Errorf("%s:%d: %#q.Match(%#q) = %v, want %v", file, lineno, pattern, text, match, shouldMatch)
-				continue Testing
-			}
-			have := re.FindStringSubmatchIndex(text)
-			if (len(have) > 0) != match {
-				t.Errorf("%s:%d: %#q.Match(%#q) = %v, but %#q.FindSubmatchIndex(%#q) = %v", file, lineno, pattern, text, match, pattern, text, have)
-				continue Testing
-			}
-			if len(have) > len(pos) {
-				have = have[:len(pos)]
-			}
-			if !same(have, pos) {
-				t.Errorf("%s:%d: %#q.FindSubmatchIndex(%#q) = %v, want %v", file, lineno, pattern, text, have, pos)
-			}
-		}
-	}
-}
-
-func parseFowlerResult(s string) (ok, compiled, matched bool, pos []int) {
-	//   Field 4: the test outcome. This is either one of the posix error
-	//     codes (with REG_ omitted) or the match array, a list of (m,n)
-	//     entries with m and n being first and last+1 positions in the
-	//     field 3 string, or NULL if REG_NOSUB is in effect and success
-	//     is expected. BADPAT is acceptable in place of any regcomp(3)
-	//     error code. The match[] array is initialized to (-2,-2) before
-	//     each test. All array elements from 0 to nmatch-1 must be specified
-	//     in the outcome. Unspecified endpoints (offset -1) are denoted by ?.
-	//     Unset endpoints (offset -2) are denoted by X. {x}(o:n) denotes a
-	//     matched (?{...}) expression, where x is the text enclosed by {...},
-	//     o is the expression ordinal counting from 1, and n is the length of
-	//     the unmatched portion of the subject string. If x starts with a
-	//     number then that is the return value of re_execf(), otherwise 0 is
-	//     returned.
-	switch {
-	case s == "":
-		// Match with no position information.
-		ok = true
-		compiled = true
-		matched = true
-		return
-	case s == "NOMATCH":
-		// Match failure.
-		ok = true
-		compiled = true
-		matched = false
-		return
-	case 'A' <= s[0] && s[0] <= 'Z':
-		// All the other error codes are compile errors.
-		ok = true
-		compiled = false
-		return
-	}
-	compiled = true
-
-	var x []int
-	for s != "" {
-		var end byte = ')'
-		if len(x)%2 == 0 {
-			if s[0] != '(' {
-				ok = false
-				return
-			}
-			s = s[1:]
-			end = ','
-		}
-		i := 0
-		for i < len(s) && s[i] != end {
-			i++
-		}
-		if i == 0 || i == len(s) {
-			ok = false
-			return
-		}
-		var v = -1
-		var err error
-		if s[:i] != "?" {
-			v, err = strconv.Atoi(s[:i])
-			if err != nil {
-				ok = false
-				return
-			}
-		}
-		x = append(x, v)
-		s = s[i+1:]
-	}
-	if len(x)%2 != 0 {
-		ok = false
-		return
-	}
-	ok = true
-	matched = true
-	pos = x
-	return
-}
-
-var text []byte
-
-func makeText(n int) []byte {
-	if len(text) >= n {
-		return text[:n]
-	}
-	text = make([]byte, n)
-	x := ^uint32(0)
-	for i := range text {
-		x += x
-		x ^= 1
-		if int32(x) < 0 {
-			x ^= 0x88888eef
-		}
-		if x%31 == 0 {
-			text[i] = '\n'
-		} else {
-			text[i] = byte(x%(0x7E+1-0x20) + 0x20)
-		}
-	}
-	return text
-}
-
-func benchmark(b *testing.B, re string, n int) {
-	r := MustCompile(re)
-	t := makeText(n)
-	b.ResetTimer()
-	b.SetBytes(int64(n))
-	for i := 0; i < b.N; i++ {
-		if r.Match(t) {
-			b.Fatal("match!")
-		}
-	}
-}
-
-const (
-	easy0  = "ABCDEFGHIJKLMNOPQRSTUVWXYZ$"
-	easy1  = "A[AB]B[BC]C[CD]D[DE]E[EF]F[FG]G[GH]H[HI]I[IJ]J$"
-	medium = "[XYZ]ABCDEFGHIJKLMNOPQRSTUVWXYZ$"
-	hard   = "[ -~]*ABCDEFGHIJKLMNOPQRSTUVWXYZ$"
-	parens = "([ -~])*(A)(B)(C)(D)(E)(F)(G)(H)(I)(J)(K)(L)(M)" +
-		"(N)(O)(P)(Q)(R)(S)(T)(U)(V)(W)(X)(Y)(Z)$"
-)
-
-func BenchmarkMatchEasy0_32(b *testing.B)   { benchmark(b, easy0, 32<<0) }
-func BenchmarkMatchEasy0_1K(b *testing.B)   { benchmark(b, easy0, 1<<10) }
-func BenchmarkMatchEasy0_32K(b *testing.B)  { benchmark(b, easy0, 32<<10) }
-func BenchmarkMatchEasy0_1M(b *testing.B)   { benchmark(b, easy0, 1<<20) }
-func BenchmarkMatchEasy0_32M(b *testing.B)  { benchmark(b, easy0, 32<<20) }
-func BenchmarkMatchEasy1_32(b *testing.B)   { benchmark(b, easy1, 32<<0) }
-func BenchmarkMatchEasy1_1K(b *testing.B)   { benchmark(b, easy1, 1<<10) }
-func BenchmarkMatchEasy1_32K(b *testing.B)  { benchmark(b, easy1, 32<<10) }
-func BenchmarkMatchEasy1_1M(b *testing.B)   { benchmark(b, easy1, 1<<20) }
-func BenchmarkMatchEasy1_32M(b *testing.B)  { benchmark(b, easy1, 32<<20) }
-func BenchmarkMatchMedium_32(b *testing.B)  { benchmark(b, medium, 32<<0) }
-func BenchmarkMatchMedium_1K(b *testing.B)  { benchmark(b, medium, 1<<10) }
-func BenchmarkMatchMedium_32K(b *testing.B) { benchmark(b, medium, 32<<10) }
-func BenchmarkMatchMedium_1M(b *testing.B)  { benchmark(b, medium, 1<<20) }
-func BenchmarkMatchMedium_32M(b *testing.B) { benchmark(b, medium, 32<<20) }
-func BenchmarkMatchHard_32(b *testing.B)    { benchmark(b, hard, 32<<0) }
-func BenchmarkMatchHard_1K(b *testing.B)    { benchmark(b, hard, 1<<10) }
-func BenchmarkMatchHard_32K(b *testing.B)   { benchmark(b, hard, 32<<10) }
-func BenchmarkMatchHard_1M(b *testing.B)    { benchmark(b, hard, 1<<20) }
-func BenchmarkMatchHard_32M(b *testing.B)   { benchmark(b, hard, 32<<20) }
-
-func TestLongest(t *testing.T) {
-	re, err := Compile(`a(|b)`)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if g, w := re.FindString("ab"), "a"; g != w {
-		t.Errorf("first match was %q, want %q", g, w)
-	}
-	re.Longest()
-	if g, w := re.FindString("ab"), "ab"; g != w {
-		t.Errorf("longest match was %q, want %q", g, w)
-	}
-}
-
-// TestProgramTooLongForBacktrack tests that a regex which is too long
-// for the backtracker still executes properly.
-func TestProgramTooLongForBacktrack(t *testing.T) {
-	longRegex := MustCompile(`(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty|twentyone|twentytwo|twentythree|twentyfour|twentyfive|twentysix|twentyseven|twentyeight|twentynine|thirty|thirtyone|thirtytwo|thirtythree|thirtyfour|thirtyfive|thirtysix|thirtyseven|thirtyeight|thirtynine|forty|fortyone|fortytwo|fortythree|fortyfour|fortyfive|fortysix|fortyseven|fortyeight|fortynine|fifty|fiftyone|fiftytwo|fiftythree|fiftyfour|fiftyfive|fiftysix|fiftyseven|fiftyeight|fiftynine|sixty|sixtyone|sixtytwo|sixtythree|sixtyfour|sixtyfive|sixtysix|sixtyseven|sixtyeight|sixtynine|seventy|seventyone|seventytwo|seventythree|seventyfour|seventyfive|seventysix|seventyseven|seventyeight|seventynine|eighty|eightyone|eightytwo|eightythree|eightyfour|eightyfive|eightysix|eightyseven|eightyeight|eightynine|ninety|ninetyone|ninetytwo|ninetythree|ninetyfour|ninetyfive|ninetysix|ninetyseven|ninetyeight|ninetynine|onehundred)`)
-	if !longRegex.MatchString("two") {
-		t.Errorf("longRegex.MatchString(\"two\") was false, want true")
-	}
-	if longRegex.MatchString("xxx") {
-		t.Errorf("longRegex.MatchString(\"xxx\") was true, want false")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/find_test.go b/third_party/gofrontend/libgo/go/regexp/find_test.go
deleted file mode 100644
index e07eb7d..0000000
--- a/third_party/gofrontend/libgo/go/regexp/find_test.go
+++ /dev/null
@@ -1,498 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package regexp
-
-import (
-	"fmt"
-	"strings"
-	"testing"
-)
-
-// For each pattern/text pair, what is the expected output of each function?
-// We can derive the textual results from the indexed results, the non-submatch
-// results from the submatched results, the single results from the 'all' results,
-// and the byte results from the string results. Therefore the table includes
-// only the FindAllStringSubmatchIndex result.
-type FindTest struct {
-	pat     string
-	text    string
-	matches [][]int
-}
-
-func (t FindTest) String() string {
-	return fmt.Sprintf("pat: %#q text: %#q", t.pat, t.text)
-}
-
-var findTests = []FindTest{
-	{``, ``, build(1, 0, 0)},
-	{`^abcdefg`, "abcdefg", build(1, 0, 7)},
-	{`a+`, "baaab", build(1, 1, 4)},
-	{"abcd..", "abcdef", build(1, 0, 6)},
-	{`a`, "a", build(1, 0, 1)},
-	{`x`, "y", nil},
-	{`b`, "abc", build(1, 1, 2)},
-	{`.`, "a", build(1, 0, 1)},
-	{`.*`, "abcdef", build(1, 0, 6)},
-	{`^`, "abcde", build(1, 0, 0)},
-	{`$`, "abcde", build(1, 5, 5)},
-	{`^abcd$`, "abcd", build(1, 0, 4)},
-	{`^bcd'`, "abcdef", nil},
-	{`^abcd$`, "abcde", nil},
-	{`a+`, "baaab", build(1, 1, 4)},
-	{`a*`, "baaab", build(3, 0, 0, 1, 4, 5, 5)},
-	{`[a-z]+`, "abcd", build(1, 0, 4)},
-	{`[^a-z]+`, "ab1234cd", build(1, 2, 6)},
-	{`[a\-\]z]+`, "az]-bcz", build(2, 0, 4, 6, 7)},
-	{`[^\n]+`, "abcd\n", build(1, 0, 4)},
-	{`[日本語]+`, "日本語日本語", build(1, 0, 18)},
-	{`日本語+`, "日本語", build(1, 0, 9)},
-	{`日本語+`, "日本語語語語", build(1, 0, 18)},
-	{`()`, "", build(1, 0, 0, 0, 0)},
-	{`(a)`, "a", build(1, 0, 1, 0, 1)},
-	{`(.)(.)`, "日a", build(1, 0, 4, 0, 3, 3, 4)},
-	{`(.*)`, "", build(1, 0, 0, 0, 0)},
-	{`(.*)`, "abcd", build(1, 0, 4, 0, 4)},
-	{`(..)(..)`, "abcd", build(1, 0, 4, 0, 2, 2, 4)},
-	{`(([^xyz]*)(d))`, "abcd", build(1, 0, 4, 0, 4, 0, 3, 3, 4)},
-	{`((a|b|c)*(d))`, "abcd", build(1, 0, 4, 0, 4, 2, 3, 3, 4)},
-	{`(((a|b|c)*)(d))`, "abcd", build(1, 0, 4, 0, 4, 0, 3, 2, 3, 3, 4)},
-	{`\a\f\n\r\t\v`, "\a\f\n\r\t\v", build(1, 0, 6)},
-	{`[\a\f\n\r\t\v]+`, "\a\f\n\r\t\v", build(1, 0, 6)},
-
-	{`a*(|(b))c*`, "aacc", build(1, 0, 4, 2, 2, -1, -1)},
-	{`(.*).*`, "ab", build(1, 0, 2, 0, 2)},
-	{`[.]`, ".", build(1, 0, 1)},
-	{`/$`, "/abc/", build(1, 4, 5)},
-	{`/$`, "/abc", nil},
-
-	// multiple matches
-	{`.`, "abc", build(3, 0, 1, 1, 2, 2, 3)},
-	{`(.)`, "abc", build(3, 0, 1, 0, 1, 1, 2, 1, 2, 2, 3, 2, 3)},
-	{`.(.)`, "abcd", build(2, 0, 2, 1, 2, 2, 4, 3, 4)},
-	{`ab*`, "abbaab", build(3, 0, 3, 3, 4, 4, 6)},
-	{`a(b*)`, "abbaab", build(3, 0, 3, 1, 3, 3, 4, 4, 4, 4, 6, 5, 6)},
-
-	// fixed bugs
-	{`ab$`, "cab", build(1, 1, 3)},
-	{`axxb$`, "axxcb", nil},
-	{`data`, "daXY data", build(1, 5, 9)},
-	{`da(.)a$`, "daXY data", build(1, 5, 9, 7, 8)},
-	{`zx+`, "zzx", build(1, 1, 3)},
-	{`ab$`, "abcab", build(1, 3, 5)},
-	{`(aa)*$`, "a", build(1, 1, 1, -1, -1)},
-	{`(?:.|(?:.a))`, "", nil},
-	{`(?:A(?:A|a))`, "Aa", build(1, 0, 2)},
-	{`(?:A|(?:A|a))`, "a", build(1, 0, 1)},
-	{`(a){0}`, "", build(1, 0, 0, -1, -1)},
-	{`(?-s)(?:(?:^).)`, "\n", nil},
-	{`(?s)(?:(?:^).)`, "\n", build(1, 0, 1)},
-	{`(?:(?:^).)`, "\n", nil},
-	{`\b`, "x", build(2, 0, 0, 1, 1)},
-	{`\b`, "xx", build(2, 0, 0, 2, 2)},
-	{`\b`, "x y", build(4, 0, 0, 1, 1, 2, 2, 3, 3)},
-	{`\b`, "xx yy", build(4, 0, 0, 2, 2, 3, 3, 5, 5)},
-	{`\B`, "x", nil},
-	{`\B`, "xx", build(1, 1, 1)},
-	{`\B`, "x y", nil},
-	{`\B`, "xx yy", build(2, 1, 1, 4, 4)},
-
-	// RE2 tests
-	{`[^\S\s]`, "abcd", nil},
-	{`[^\S[:space:]]`, "abcd", nil},
-	{`[^\D\d]`, "abcd", nil},
-	{`[^\D[:digit:]]`, "abcd", nil},
-	{`(?i)\W`, "x", nil},
-	{`(?i)\W`, "k", nil},
-	{`(?i)\W`, "s", nil},
-
-	// can backslash-escape any punctuation
-	{`\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\{\|\}\~`,
-		`!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`, build(1, 0, 31)},
-	{`[\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\{\|\}\~]+`,
-		`!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`, build(1, 0, 31)},
-	{"\\`", "`", build(1, 0, 1)},
-	{"[\\`]+", "`", build(1, 0, 1)},
-
-	// long set of matches (longer than startSize)
-	{
-		".",
-		"qwertyuiopasdfghjklzxcvbnm1234567890",
-		build(36, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10,
-			10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20,
-			20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30,
-			30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36),
-	},
-}
-
-// build is a helper to construct a [][]int by extracting n sequences from x.
-// This represents n matches with len(x)/n submatches each.
-func build(n int, x ...int) [][]int {
-	ret := make([][]int, n)
-	runLength := len(x) / n
-	j := 0
-	for i := range ret {
-		ret[i] = make([]int, runLength)
-		copy(ret[i], x[j:])
-		j += runLength
-		if j > len(x) {
-			panic("invalid build entry")
-		}
-	}
-	return ret
-}
-
-// First the simple cases.
-
-func TestFind(t *testing.T) {
-	for _, test := range findTests {
-		re := MustCompile(test.pat)
-		if re.String() != test.pat {
-			t.Errorf("String() = `%s`; should be `%s`", re.String(), test.pat)
-		}
-		result := re.Find([]byte(test.text))
-		switch {
-		case len(test.matches) == 0 && len(result) == 0:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Errorf("expected match; got none: %s", test)
-		case test.matches != nil && result != nil:
-			expect := test.text[test.matches[0][0]:test.matches[0][1]]
-			if expect != string(result) {
-				t.Errorf("expected %q got %q: %s", expect, result, test)
-			}
-		}
-	}
-}
-
-func TestFindString(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindString(test.text)
-		switch {
-		case len(test.matches) == 0 && len(result) == 0:
-			// ok
-		case test.matches == nil && result != "":
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == "":
-			// Tricky because an empty result has two meanings: no match or empty match.
-			if test.matches[0][0] != test.matches[0][1] {
-				t.Errorf("expected match; got none: %s", test)
-			}
-		case test.matches != nil && result != "":
-			expect := test.text[test.matches[0][0]:test.matches[0][1]]
-			if expect != result {
-				t.Errorf("expected %q got %q: %s", expect, result, test)
-			}
-		}
-	}
-}
-
-func testFindIndex(test *FindTest, result []int, t *testing.T) {
-	switch {
-	case len(test.matches) == 0 && len(result) == 0:
-		// ok
-	case test.matches == nil && result != nil:
-		t.Errorf("expected no match; got one: %s", test)
-	case test.matches != nil && result == nil:
-		t.Errorf("expected match; got none: %s", test)
-	case test.matches != nil && result != nil:
-		expect := test.matches[0]
-		if expect[0] != result[0] || expect[1] != result[1] {
-			t.Errorf("expected %v got %v: %s", expect, result, test)
-		}
-	}
-}
-
-func TestFindIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindIndex(&test, MustCompile(test.pat).FindIndex([]byte(test.text)), t)
-	}
-}
-
-func TestFindStringIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindIndex(&test, MustCompile(test.pat).FindStringIndex(test.text), t)
-	}
-}
-
-func TestFindReaderIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindIndex(&test, MustCompile(test.pat).FindReaderIndex(strings.NewReader(test.text)), t)
-	}
-}
-
-// Now come the simple All cases.
-
-func TestFindAll(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindAll([]byte(test.text), -1)
-		switch {
-		case test.matches == nil && result == nil:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Fatalf("expected match; got none: %s", test)
-		case test.matches != nil && result != nil:
-			if len(test.matches) != len(result) {
-				t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test)
-				continue
-			}
-			for k, e := range test.matches {
-				expect := test.text[e[0]:e[1]]
-				if expect != string(result[k]) {
-					t.Errorf("match %d: expected %q got %q: %s", k, expect, result[k], test)
-				}
-			}
-		}
-	}
-}
-
-func TestFindAllString(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindAllString(test.text, -1)
-		switch {
-		case test.matches == nil && result == nil:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Errorf("expected match; got none: %s", test)
-		case test.matches != nil && result != nil:
-			if len(test.matches) != len(result) {
-				t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test)
-				continue
-			}
-			for k, e := range test.matches {
-				expect := test.text[e[0]:e[1]]
-				if expect != result[k] {
-					t.Errorf("expected %q got %q: %s", expect, result, test)
-				}
-			}
-		}
-	}
-}
-
-func testFindAllIndex(test *FindTest, result [][]int, t *testing.T) {
-	switch {
-	case test.matches == nil && result == nil:
-		// ok
-	case test.matches == nil && result != nil:
-		t.Errorf("expected no match; got one: %s", test)
-	case test.matches != nil && result == nil:
-		t.Errorf("expected match; got none: %s", test)
-	case test.matches != nil && result != nil:
-		if len(test.matches) != len(result) {
-			t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test)
-			return
-		}
-		for k, e := range test.matches {
-			if e[0] != result[k][0] || e[1] != result[k][1] {
-				t.Errorf("match %d: expected %v got %v: %s", k, e, result[k], test)
-			}
-		}
-	}
-}
-
-func TestFindAllIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindAllIndex(&test, MustCompile(test.pat).FindAllIndex([]byte(test.text), -1), t)
-	}
-}
-
-func TestFindAllStringIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindAllIndex(&test, MustCompile(test.pat).FindAllStringIndex(test.text, -1), t)
-	}
-}
-
-// Now come the Submatch cases.
-
-func testSubmatchBytes(test *FindTest, n int, submatches []int, result [][]byte, t *testing.T) {
-	if len(submatches) != len(result)*2 {
-		t.Errorf("match %d: expected %d submatches; got %d: %s", n, len(submatches)/2, len(result), test)
-		return
-	}
-	for k := 0; k < len(submatches); k += 2 {
-		if submatches[k] == -1 {
-			if result[k/2] != nil {
-				t.Errorf("match %d: expected nil got %q: %s", n, result, test)
-			}
-			continue
-		}
-		expect := test.text[submatches[k]:submatches[k+1]]
-		if expect != string(result[k/2]) {
-			t.Errorf("match %d: expected %q got %q: %s", n, expect, result, test)
-			return
-		}
-	}
-}
-
-func TestFindSubmatch(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindSubmatch([]byte(test.text))
-		switch {
-		case test.matches == nil && result == nil:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Errorf("expected match; got none: %s", test)
-		case test.matches != nil && result != nil:
-			testSubmatchBytes(&test, 0, test.matches[0], result, t)
-		}
-	}
-}
-
-func testSubmatchString(test *FindTest, n int, submatches []int, result []string, t *testing.T) {
-	if len(submatches) != len(result)*2 {
-		t.Errorf("match %d: expected %d submatches; got %d: %s", n, len(submatches)/2, len(result), test)
-		return
-	}
-	for k := 0; k < len(submatches); k += 2 {
-		if submatches[k] == -1 {
-			if result[k/2] != "" {
-				t.Errorf("match %d: expected nil got %q: %s", n, result, test)
-			}
-			continue
-		}
-		expect := test.text[submatches[k]:submatches[k+1]]
-		if expect != result[k/2] {
-			t.Errorf("match %d: expected %q got %q: %s", n, expect, result, test)
-			return
-		}
-	}
-}
-
-func TestFindStringSubmatch(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindStringSubmatch(test.text)
-		switch {
-		case test.matches == nil && result == nil:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Errorf("expected match; got none: %s", test)
-		case test.matches != nil && result != nil:
-			testSubmatchString(&test, 0, test.matches[0], result, t)
-		}
-	}
-}
-
-func testSubmatchIndices(test *FindTest, n int, expect, result []int, t *testing.T) {
-	if len(expect) != len(result) {
-		t.Errorf("match %d: expected %d matches; got %d: %s", n, len(expect)/2, len(result)/2, test)
-		return
-	}
-	for k, e := range expect {
-		if e != result[k] {
-			t.Errorf("match %d: submatch error: expected %v got %v: %s", n, expect, result, test)
-		}
-	}
-}
-
-func testFindSubmatchIndex(test *FindTest, result []int, t *testing.T) {
-	switch {
-	case test.matches == nil && result == nil:
-		// ok
-	case test.matches == nil && result != nil:
-		t.Errorf("expected no match; got one: %s", test)
-	case test.matches != nil && result == nil:
-		t.Errorf("expected match; got none: %s", test)
-	case test.matches != nil && result != nil:
-		testSubmatchIndices(test, 0, test.matches[0], result, t)
-	}
-}
-
-func TestFindSubmatchIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindSubmatchIndex(&test, MustCompile(test.pat).FindSubmatchIndex([]byte(test.text)), t)
-	}
-}
-
-func TestFindStringSubmatchIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindSubmatchIndex(&test, MustCompile(test.pat).FindStringSubmatchIndex(test.text), t)
-	}
-}
-
-func TestFindReaderSubmatchIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindSubmatchIndex(&test, MustCompile(test.pat).FindReaderSubmatchIndex(strings.NewReader(test.text)), t)
-	}
-}
-
-// Now come the monster AllSubmatch cases.
-
-func TestFindAllSubmatch(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindAllSubmatch([]byte(test.text), -1)
-		switch {
-		case test.matches == nil && result == nil:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Errorf("expected match; got none: %s", test)
-		case len(test.matches) != len(result):
-			t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test)
-		case test.matches != nil && result != nil:
-			for k, match := range test.matches {
-				testSubmatchBytes(&test, k, match, result[k], t)
-			}
-		}
-	}
-}
-
-func TestFindAllStringSubmatch(t *testing.T) {
-	for _, test := range findTests {
-		result := MustCompile(test.pat).FindAllStringSubmatch(test.text, -1)
-		switch {
-		case test.matches == nil && result == nil:
-			// ok
-		case test.matches == nil && result != nil:
-			t.Errorf("expected no match; got one: %s", test)
-		case test.matches != nil && result == nil:
-			t.Errorf("expected match; got none: %s", test)
-		case len(test.matches) != len(result):
-			t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test)
-		case test.matches != nil && result != nil:
-			for k, match := range test.matches {
-				testSubmatchString(&test, k, match, result[k], t)
-			}
-		}
-	}
-}
-
-func testFindAllSubmatchIndex(test *FindTest, result [][]int, t *testing.T) {
-	switch {
-	case test.matches == nil && result == nil:
-		// ok
-	case test.matches == nil && result != nil:
-		t.Errorf("expected no match; got one: %s", test)
-	case test.matches != nil && result == nil:
-		t.Errorf("expected match; got none: %s", test)
-	case len(test.matches) != len(result):
-		t.Errorf("expected %d matches; got %d: %s", len(test.matches), len(result), test)
-	case test.matches != nil && result != nil:
-		for k, match := range test.matches {
-			testSubmatchIndices(test, k, match, result[k], t)
-		}
-	}
-}
-
-func TestFindAllSubmatchIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindAllSubmatchIndex(&test, MustCompile(test.pat).FindAllSubmatchIndex([]byte(test.text), -1), t)
-	}
-}
-
-func TestFindAllStringSubmatchIndex(t *testing.T) {
-	for _, test := range findTests {
-		testFindAllSubmatchIndex(&test, MustCompile(test.pat).FindAllStringSubmatchIndex(test.text, -1), t)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/onepass.go b/third_party/gofrontend/libgo/go/regexp/onepass.go
deleted file mode 100644
index e6f4285..0000000
--- a/third_party/gofrontend/libgo/go/regexp/onepass.go
+++ /dev/null
@@ -1,581 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package regexp
-
-import (
-	"bytes"
-	"regexp/syntax"
-	"sort"
-	"unicode"
-)
-
-// "One-pass" regexp execution.
-// Some regexps can be analyzed to determine that they never need
-// backtracking: they are guaranteed to run in one pass over the string
-// without bothering to save all the usual NFA state.
-// Detect those and execute them more quickly.
-
-// A onePassProg is a compiled one-pass regular expression program.
-// It is the same as syntax.Prog except for the use of onePassInst.
-type onePassProg struct {
-	Inst   []onePassInst
-	Start  int // index of start instruction
-	NumCap int // number of InstCapture insts in re
-}
-
-// A onePassInst is a single instruction in a one-pass regular expression program.
-// It is the same as syntax.Inst except for the new 'Next' field.
-type onePassInst struct {
-	syntax.Inst
-	Next []uint32
-}
-
-// OnePassPrefix returns a literal string that all matches for the
-// regexp must start with.  Complete is true if the prefix
-// is the entire match. Pc is the index of the last rune instruction
-// in the string. The OnePassPrefix skips over the mandatory
-// EmptyBeginText
-func onePassPrefix(p *syntax.Prog) (prefix string, complete bool, pc uint32) {
-	i := &p.Inst[p.Start]
-	if i.Op != syntax.InstEmptyWidth || (syntax.EmptyOp(i.Arg))&syntax.EmptyBeginText == 0 {
-		return "", i.Op == syntax.InstMatch, uint32(p.Start)
-	}
-	pc = i.Out
-	i = &p.Inst[pc]
-	for i.Op == syntax.InstNop {
-		pc = i.Out
-		i = &p.Inst[pc]
-	}
-	// Avoid allocation of buffer if prefix is empty.
-	if iop(i) != syntax.InstRune || len(i.Rune) != 1 {
-		return "", i.Op == syntax.InstMatch, uint32(p.Start)
-	}
-
-	// Have prefix; gather characters.
-	var buf bytes.Buffer
-	for iop(i) == syntax.InstRune && len(i.Rune) == 1 && syntax.Flags(i.Arg)&syntax.FoldCase == 0 {
-		buf.WriteRune(i.Rune[0])
-		pc, i = i.Out, &p.Inst[i.Out]
-	}
-	return buf.String(), i.Op == syntax.InstEmptyWidth && (syntax.EmptyOp(i.Arg))&syntax.EmptyBeginText != 0, pc
-}
-
-// OnePassNext selects the next actionable state of the prog, based on the input character.
-// It should only be called when i.Op == InstAlt or InstAltMatch, and from the one-pass machine.
-// One of the alternates may ultimately lead without input to end of line. If the instruction
-// is InstAltMatch the path to the InstMatch is in i.Out, the normal node in i.Next.
-func onePassNext(i *onePassInst, r rune) uint32 {
-	next := i.MatchRunePos(r)
-	if next >= 0 {
-		return i.Next[next]
-	}
-	if i.Op == syntax.InstAltMatch {
-		return i.Out
-	}
-	return 0
-}
-
-func iop(i *syntax.Inst) syntax.InstOp {
-	op := i.Op
-	switch op {
-	case syntax.InstRune1, syntax.InstRuneAny, syntax.InstRuneAnyNotNL:
-		op = syntax.InstRune
-	}
-	return op
-}
-
-// Sparse Array implementation is used as a queueOnePass.
-type queueOnePass struct {
-	sparse          []uint32
-	dense           []uint32
-	size, nextIndex uint32
-}
-
-func (q *queueOnePass) empty() bool {
-	return q.nextIndex >= q.size
-}
-
-func (q *queueOnePass) next() (n uint32) {
-	n = q.dense[q.nextIndex]
-	q.nextIndex++
-	return
-}
-
-func (q *queueOnePass) clear() {
-	q.size = 0
-	q.nextIndex = 0
-}
-
-func (q *queueOnePass) reset() {
-	q.nextIndex = 0
-}
-
-func (q *queueOnePass) contains(u uint32) bool {
-	if u >= uint32(len(q.sparse)) {
-		return false
-	}
-	return q.sparse[u] < q.size && q.dense[q.sparse[u]] == u
-}
-
-func (q *queueOnePass) insert(u uint32) {
-	if !q.contains(u) {
-		q.insertNew(u)
-	}
-}
-
-func (q *queueOnePass) insertNew(u uint32) {
-	if u >= uint32(len(q.sparse)) {
-		return
-	}
-	q.sparse[u] = q.size
-	q.dense[q.size] = u
-	q.size++
-}
-
-func newQueue(size int) (q *queueOnePass) {
-	return &queueOnePass{
-		sparse: make([]uint32, size),
-		dense:  make([]uint32, size),
-	}
-}
-
-// mergeRuneSets merges two non-intersecting runesets, and returns the merged result,
-// and a NextIp array. The idea is that if a rune matches the OnePassRunes at index
-// i, NextIp[i/2] is the target. If the input sets intersect, an empty runeset and a
-// NextIp array with the single element mergeFailed is returned.
-// The code assumes that both inputs contain ordered and non-intersecting rune pairs.
-const mergeFailed = uint32(0xffffffff)
-
-var (
-	noRune = []rune{}
-	noNext = []uint32{mergeFailed}
-)
-
-func mergeRuneSets(leftRunes, rightRunes *[]rune, leftPC, rightPC uint32) ([]rune, []uint32) {
-	leftLen := len(*leftRunes)
-	rightLen := len(*rightRunes)
-	if leftLen&0x1 != 0 || rightLen&0x1 != 0 {
-		panic("mergeRuneSets odd length []rune")
-	}
-	var (
-		lx, rx int
-	)
-	merged := make([]rune, 0)
-	next := make([]uint32, 0)
-	ok := true
-	defer func() {
-		if !ok {
-			merged = nil
-			next = nil
-		}
-	}()
-
-	ix := -1
-	extend := func(newLow *int, newArray *[]rune, pc uint32) bool {
-		if ix > 0 && (*newArray)[*newLow] <= merged[ix] {
-			return false
-		}
-		merged = append(merged, (*newArray)[*newLow], (*newArray)[*newLow+1])
-		*newLow += 2
-		ix += 2
-		next = append(next, pc)
-		return true
-	}
-
-	for lx < leftLen || rx < rightLen {
-		switch {
-		case rx >= rightLen:
-			ok = extend(&lx, leftRunes, leftPC)
-		case lx >= leftLen:
-			ok = extend(&rx, rightRunes, rightPC)
-		case (*rightRunes)[rx] < (*leftRunes)[lx]:
-			ok = extend(&rx, rightRunes, rightPC)
-		default:
-			ok = extend(&lx, leftRunes, leftPC)
-		}
-		if !ok {
-			return noRune, noNext
-		}
-	}
-	return merged, next
-}
-
-// cleanupOnePass drops working memory, and restores certain shortcut instructions.
-func cleanupOnePass(prog *onePassProg, original *syntax.Prog) {
-	for ix, instOriginal := range original.Inst {
-		switch instOriginal.Op {
-		case syntax.InstAlt, syntax.InstAltMatch, syntax.InstRune:
-		case syntax.InstCapture, syntax.InstEmptyWidth, syntax.InstNop, syntax.InstMatch, syntax.InstFail:
-			prog.Inst[ix].Next = nil
-		case syntax.InstRune1, syntax.InstRuneAny, syntax.InstRuneAnyNotNL:
-			prog.Inst[ix].Next = nil
-			prog.Inst[ix] = onePassInst{Inst: instOriginal}
-		}
-	}
-}
-
-// onePassCopy creates a copy of the original Prog, as we'll be modifying it
-func onePassCopy(prog *syntax.Prog) *onePassProg {
-	p := &onePassProg{
-		Start:  prog.Start,
-		NumCap: prog.NumCap,
-	}
-	for _, inst := range prog.Inst {
-		p.Inst = append(p.Inst, onePassInst{Inst: inst})
-	}
-
-	// rewrites one or more common Prog constructs that enable some otherwise
-	// non-onepass Progs to be onepass. A:BD (for example) means an InstAlt at
-	// ip A, that points to ips B & C.
-	// A:BC + B:DA => A:BC + B:CD
-	// A:BC + B:DC => A:DC + B:DC
-	for pc := range p.Inst {
-		switch p.Inst[pc].Op {
-		default:
-			continue
-		case syntax.InstAlt, syntax.InstAltMatch:
-			// A:Bx + B:Ay
-			p_A_Other := &p.Inst[pc].Out
-			p_A_Alt := &p.Inst[pc].Arg
-			// make sure a target is another Alt
-			instAlt := p.Inst[*p_A_Alt]
-			if !(instAlt.Op == syntax.InstAlt || instAlt.Op == syntax.InstAltMatch) {
-				p_A_Alt, p_A_Other = p_A_Other, p_A_Alt
-				instAlt = p.Inst[*p_A_Alt]
-				if !(instAlt.Op == syntax.InstAlt || instAlt.Op == syntax.InstAltMatch) {
-					continue
-				}
-			}
-			instOther := p.Inst[*p_A_Other]
-			// Analyzing both legs pointing to Alts is for another day
-			if instOther.Op == syntax.InstAlt || instOther.Op == syntax.InstAltMatch {
-				// too complicated
-				continue
-			}
-			// simple empty transition loop
-			// A:BC + B:DA => A:BC + B:DC
-			p_B_Alt := &p.Inst[*p_A_Alt].Out
-			p_B_Other := &p.Inst[*p_A_Alt].Arg
-			patch := false
-			if instAlt.Out == uint32(pc) {
-				patch = true
-			} else if instAlt.Arg == uint32(pc) {
-				patch = true
-				p_B_Alt, p_B_Other = p_B_Other, p_B_Alt
-			}
-			if patch {
-				*p_B_Alt = *p_A_Other
-			}
-
-			// empty transition to common target
-			// A:BC + B:DC => A:DC + B:DC
-			if *p_A_Other == *p_B_Alt {
-				*p_A_Alt = *p_B_Other
-			}
-		}
-	}
-	return p
-}
-
-// runeSlice exists to permit sorting the case-folded rune sets.
-type runeSlice []rune
-
-func (p runeSlice) Len() int           { return len(p) }
-func (p runeSlice) Less(i, j int) bool { return p[i] < p[j] }
-func (p runeSlice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
-
-// Sort is a convenience method.
-func (p runeSlice) Sort() {
-	sort.Sort(p)
-}
-
-var anyRuneNotNL = []rune{0, '\n' - 1, '\n' + 1, unicode.MaxRune}
-var anyRune = []rune{0, unicode.MaxRune}
-
-// makeOnePass creates a onepass Prog, if possible. It is possible if at any alt,
-// the match engine can always tell which branch to take. The routine may modify
-// p if it is turned into a onepass Prog. If it isn't possible for this to be a
-// onepass Prog, the Prog notOnePass is returned. makeOnePass is recursive
-// to the size of the Prog.
-func makeOnePass(p *onePassProg) *onePassProg {
-	// If the machine is very long, it's not worth the time to check if we can use one pass.
-	if len(p.Inst) >= 1000 {
-		return notOnePass
-	}
-
-	var (
-		instQueue    = newQueue(len(p.Inst))
-		visitQueue   = newQueue(len(p.Inst))
-		build        func(uint32, *queueOnePass)
-		check        func(uint32, map[uint32]bool) bool
-		onePassRunes = make([][]rune, len(p.Inst))
-	)
-	build = func(pc uint32, q *queueOnePass) {
-		if q.contains(pc) {
-			return
-		}
-		inst := p.Inst[pc]
-		switch inst.Op {
-		case syntax.InstAlt, syntax.InstAltMatch:
-			q.insert(inst.Out)
-			build(inst.Out, q)
-			q.insert(inst.Arg)
-		case syntax.InstMatch, syntax.InstFail:
-		default:
-			q.insert(inst.Out)
-		}
-	}
-
-	// check that paths from Alt instructions are unambiguous, and rebuild the new
-	// program as a onepass program
-	check = func(pc uint32, m map[uint32]bool) (ok bool) {
-		ok = true
-		inst := &p.Inst[pc]
-		if visitQueue.contains(pc) {
-			return
-		}
-		visitQueue.insert(pc)
-		switch inst.Op {
-		case syntax.InstAlt, syntax.InstAltMatch:
-			ok = check(inst.Out, m) && check(inst.Arg, m)
-			// check no-input paths to InstMatch
-			matchOut := m[inst.Out]
-			matchArg := m[inst.Arg]
-			if matchOut && matchArg {
-				ok = false
-				break
-			}
-			// Match on empty goes in inst.Out
-			if matchArg {
-				inst.Out, inst.Arg = inst.Arg, inst.Out
-				matchOut, matchArg = matchArg, matchOut
-			}
-			if matchOut {
-				m[pc] = true
-				inst.Op = syntax.InstAltMatch
-			}
-
-			// build a dispatch operator from the two legs of the alt.
-			onePassRunes[pc], inst.Next = mergeRuneSets(
-				&onePassRunes[inst.Out], &onePassRunes[inst.Arg], inst.Out, inst.Arg)
-			if len(inst.Next) > 0 && inst.Next[0] == mergeFailed {
-				ok = false
-				break
-			}
-		case syntax.InstCapture, syntax.InstNop:
-			ok = check(inst.Out, m)
-			m[pc] = m[inst.Out]
-			// pass matching runes back through these no-ops.
-			onePassRunes[pc] = append([]rune{}, onePassRunes[inst.Out]...)
-			inst.Next = []uint32{}
-			for i := len(onePassRunes[pc]) / 2; i >= 0; i-- {
-				inst.Next = append(inst.Next, inst.Out)
-			}
-		case syntax.InstEmptyWidth:
-			ok = check(inst.Out, m)
-			m[pc] = m[inst.Out]
-			onePassRunes[pc] = append([]rune{}, onePassRunes[inst.Out]...)
-			inst.Next = []uint32{}
-			for i := len(onePassRunes[pc]) / 2; i >= 0; i-- {
-				inst.Next = append(inst.Next, inst.Out)
-			}
-		case syntax.InstMatch, syntax.InstFail:
-			m[pc] = inst.Op == syntax.InstMatch
-			break
-		case syntax.InstRune:
-			ok = check(inst.Out, m)
-			m[pc] = false
-			if len(inst.Next) > 0 {
-				break
-			}
-			if len(inst.Rune) == 0 {
-				onePassRunes[pc] = []rune{}
-				inst.Next = []uint32{inst.Out}
-				break
-			}
-			runes := make([]rune, 0)
-			if len(inst.Rune) == 1 && syntax.Flags(inst.Arg)&syntax.FoldCase != 0 {
-				r0 := inst.Rune[0]
-				runes = append(runes, r0, r0)
-				for r1 := unicode.SimpleFold(r0); r1 != r0; r1 = unicode.SimpleFold(r1) {
-					runes = append(runes, r1, r1)
-				}
-				sort.Sort(runeSlice(runes))
-			} else {
-				runes = append(runes, inst.Rune...)
-			}
-			onePassRunes[pc] = runes
-			inst.Next = []uint32{}
-			for i := len(onePassRunes[pc]) / 2; i >= 0; i-- {
-				inst.Next = append(inst.Next, inst.Out)
-			}
-			inst.Op = syntax.InstRune
-		case syntax.InstRune1:
-			ok = check(inst.Out, m)
-			m[pc] = false
-			if len(inst.Next) > 0 {
-				break
-			}
-			runes := []rune{}
-			// expand case-folded runes
-			if syntax.Flags(inst.Arg)&syntax.FoldCase != 0 {
-				r0 := inst.Rune[0]
-				runes = append(runes, r0, r0)
-				for r1 := unicode.SimpleFold(r0); r1 != r0; r1 = unicode.SimpleFold(r1) {
-					runes = append(runes, r1, r1)
-				}
-				sort.Sort(runeSlice(runes))
-			} else {
-				runes = append(runes, inst.Rune[0], inst.Rune[0])
-			}
-			onePassRunes[pc] = runes
-			inst.Next = []uint32{}
-			for i := len(onePassRunes[pc]) / 2; i >= 0; i-- {
-				inst.Next = append(inst.Next, inst.Out)
-			}
-			inst.Op = syntax.InstRune
-		case syntax.InstRuneAny:
-			ok = check(inst.Out, m)
-			m[pc] = false
-			if len(inst.Next) > 0 {
-				break
-			}
-			onePassRunes[pc] = append([]rune{}, anyRune...)
-			inst.Next = []uint32{inst.Out}
-		case syntax.InstRuneAnyNotNL:
-			ok = check(inst.Out, m)
-			m[pc] = false
-			if len(inst.Next) > 0 {
-				break
-			}
-			onePassRunes[pc] = append([]rune{}, anyRuneNotNL...)
-			inst.Next = []uint32{}
-			for i := len(onePassRunes[pc]) / 2; i >= 0; i-- {
-				inst.Next = append(inst.Next, inst.Out)
-			}
-		}
-		return
-	}
-
-	instQueue.clear()
-	instQueue.insert(uint32(p.Start))
-	m := make(map[uint32]bool, len(p.Inst))
-	for !instQueue.empty() {
-		pc := instQueue.next()
-		inst := p.Inst[pc]
-		visitQueue.clear()
-		if !check(uint32(pc), m) {
-			p = notOnePass
-			break
-		}
-		switch inst.Op {
-		case syntax.InstAlt, syntax.InstAltMatch:
-			instQueue.insert(inst.Out)
-			instQueue.insert(inst.Arg)
-		case syntax.InstCapture, syntax.InstEmptyWidth, syntax.InstNop:
-			instQueue.insert(inst.Out)
-		case syntax.InstMatch:
-		case syntax.InstFail:
-		case syntax.InstRune, syntax.InstRune1, syntax.InstRuneAny, syntax.InstRuneAnyNotNL:
-		default:
-		}
-	}
-	if p != notOnePass {
-		for i := range p.Inst {
-			p.Inst[i].Rune = onePassRunes[i]
-		}
-	}
-	return p
-}
-
-// walk visits each Inst in the prog once, and applies the argument
-// function(ip, next), in pre-order.
-func walk(prog *syntax.Prog, funcs ...func(ip, next uint32)) {
-	var walk1 func(uint32)
-	progQueue := newQueue(len(prog.Inst))
-	walk1 = func(ip uint32) {
-		if progQueue.contains(ip) {
-			return
-		}
-		progQueue.insert(ip)
-		inst := prog.Inst[ip]
-		switch inst.Op {
-		case syntax.InstAlt, syntax.InstAltMatch:
-			for _, f := range funcs {
-				f(ip, inst.Out)
-				f(ip, inst.Arg)
-			}
-			walk1(inst.Out)
-			walk1(inst.Arg)
-		default:
-			for _, f := range funcs {
-				f(ip, inst.Out)
-			}
-			walk1(inst.Out)
-		}
-	}
-	walk1(uint32(prog.Start))
-}
-
-// find returns the Insts that match the argument predicate function
-func find(prog *syntax.Prog, f func(*syntax.Prog, int) bool) (matches []uint32) {
-	matches = []uint32{}
-
-	for ip := range prog.Inst {
-		if f(prog, ip) {
-			matches = append(matches, uint32(ip))
-		}
-	}
-	return
-}
-
-var notOnePass *onePassProg = nil
-
-// compileOnePass returns a new *syntax.Prog suitable for onePass execution if the original Prog
-// can be recharacterized as a one-pass regexp program, or syntax.notOnePass if the
-// Prog cannot be converted. For a one pass prog, the fundamental condition that must
-// be true is: at any InstAlt, there must be no ambiguity about what branch to  take.
-func compileOnePass(prog *syntax.Prog) (p *onePassProg) {
-	if prog.Start == 0 {
-		return notOnePass
-	}
-	// onepass regexp is anchored
-	if prog.Inst[prog.Start].Op != syntax.InstEmptyWidth ||
-		syntax.EmptyOp(prog.Inst[prog.Start].Arg)&syntax.EmptyBeginText != syntax.EmptyBeginText {
-		return notOnePass
-	}
-	// every instruction leading to InstMatch must be EmptyEndText
-	for _, inst := range prog.Inst {
-		opOut := prog.Inst[inst.Out].Op
-		switch inst.Op {
-		default:
-			if opOut == syntax.InstMatch {
-				return notOnePass
-			}
-		case syntax.InstAlt, syntax.InstAltMatch:
-			if opOut == syntax.InstMatch || prog.Inst[inst.Arg].Op == syntax.InstMatch {
-				return notOnePass
-			}
-		case syntax.InstEmptyWidth:
-			if opOut == syntax.InstMatch {
-				if syntax.EmptyOp(inst.Arg)&syntax.EmptyEndText == syntax.EmptyEndText {
-					continue
-				}
-				return notOnePass
-			}
-		}
-	}
-	// Creates a slightly optimized copy of the original Prog
-	// that cleans up some Prog idioms that block valid onepass programs
-	p = onePassCopy(prog)
-
-	// checkAmbiguity on InstAlts, build onepass Prog if possible
-	p = makeOnePass(p)
-
-	if p != notOnePass {
-		cleanupOnePass(p, prog)
-	}
-	return p
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/onepass_test.go b/third_party/gofrontend/libgo/go/regexp/onepass_test.go
deleted file mode 100644
index 7b2beea..0000000
--- a/third_party/gofrontend/libgo/go/regexp/onepass_test.go
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package regexp
-
-import (
-	"reflect"
-	"regexp/syntax"
-	"testing"
-)
-
-var runeMergeTests = []struct {
-	left, right, merged []rune
-	next                []uint32
-	leftPC, rightPC     uint32
-}{
-	{
-		// empty rhs
-		[]rune{69, 69},
-		[]rune{},
-		[]rune{69, 69},
-		[]uint32{1},
-		1, 2,
-	},
-	{
-		// identical runes, identical targets
-		[]rune{69, 69},
-		[]rune{69, 69},
-		[]rune{},
-		[]uint32{mergeFailed},
-		1, 1,
-	},
-	{
-		// identical runes, different targets
-		[]rune{69, 69},
-		[]rune{69, 69},
-		[]rune{},
-		[]uint32{mergeFailed},
-		1, 2,
-	},
-	{
-		// append right-first
-		[]rune{69, 69},
-		[]rune{71, 71},
-		[]rune{69, 69, 71, 71},
-		[]uint32{1, 2},
-		1, 2,
-	},
-	{
-		// append, left-first
-		[]rune{71, 71},
-		[]rune{69, 69},
-		[]rune{69, 69, 71, 71},
-		[]uint32{2, 1},
-		1, 2,
-	},
-	{
-		// successful interleave
-		[]rune{60, 60, 71, 71, 101, 101},
-		[]rune{69, 69, 88, 88},
-		[]rune{60, 60, 69, 69, 71, 71, 88, 88, 101, 101},
-		[]uint32{1, 2, 1, 2, 1},
-		1, 2,
-	},
-	{
-		// left surrounds right
-		[]rune{69, 74},
-		[]rune{71, 71},
-		[]rune{},
-		[]uint32{mergeFailed},
-		1, 2,
-	},
-	{
-		// right surrounds left
-		[]rune{69, 74},
-		[]rune{68, 75},
-		[]rune{},
-		[]uint32{mergeFailed},
-		1, 2,
-	},
-	{
-		// overlap at interval begin
-		[]rune{69, 74},
-		[]rune{74, 75},
-		[]rune{},
-		[]uint32{mergeFailed},
-		1, 2,
-	},
-	{
-		// overlap ar interval end
-		[]rune{69, 74},
-		[]rune{65, 69},
-		[]rune{},
-		[]uint32{mergeFailed},
-		1, 2,
-	},
-	{
-		// overlap from above
-		[]rune{69, 74},
-		[]rune{71, 74},
-		[]rune{},
-		[]uint32{mergeFailed},
-		1, 2,
-	},
-	{
-		// overlap from below
-		[]rune{69, 74},
-		[]rune{65, 71},
-		[]rune{},
-		[]uint32{mergeFailed},
-		1, 2,
-	},
-	{
-		// out of order []rune
-		[]rune{69, 74, 60, 65},
-		[]rune{66, 67},
-		[]rune{},
-		[]uint32{mergeFailed},
-		1, 2,
-	},
-}
-
-func TestMergeRuneSet(t *testing.T) {
-	for ix, test := range runeMergeTests {
-		merged, next := mergeRuneSets(&test.left, &test.right, test.leftPC, test.rightPC)
-		if !reflect.DeepEqual(merged, test.merged) {
-			t.Errorf("mergeRuneSet :%d (%v, %v) merged\n have\n%v\nwant\n%v", ix, test.left, test.right, merged, test.merged)
-		}
-		if !reflect.DeepEqual(next, test.next) {
-			t.Errorf("mergeRuneSet :%d(%v, %v) next\n have\n%v\nwant\n%v", ix, test.left, test.right, next, test.next)
-		}
-	}
-}
-
-const noStr = `!`
-
-var onePass = &onePassProg{}
-
-var onePassTests = []struct {
-	re      string
-	onePass *onePassProg
-	prog    string
-}{
-	{`^(?:a|(?:a*))$`, notOnePass, noStr},
-	{`^(?:(a)|(?:a*))$`, notOnePass, noStr},
-	{`^(?:(?:(?:.(?:$))?))$`, onePass, `a`},
-	{`^abcd$`, onePass, `abcd`},
-	{`^abcd$`, onePass, `abcde`},
-	{`^(?:(?:a{0,})*?)$`, onePass, `a`},
-	{`^(?:(?:a+)*)$`, onePass, ``},
-	{`^(?:(?:a|(?:aa)))$`, onePass, ``},
-	{`^(?:[^\s\S])$`, onePass, ``},
-	{`^(?:(?:a{3,4}){0,})$`, notOnePass, `aaaaaa`},
-	{`^(?:(?:a+)*)$`, onePass, `a`},
-	{`^(?:(?:(?:a*)+))$`, onePass, noStr},
-	{`^(?:(?:a+)*)$`, onePass, ``},
-	{`^[a-c]+$`, onePass, `abc`},
-	{`^[a-c]*$`, onePass, `abcdabc`},
-	{`^(?:a*)$`, onePass, `aaaaaaa`},
-	{`^(?:(?:aa)|a)$`, onePass, `a`},
-	{`^[a-c]*`, notOnePass, `abcdabc`},
-	{`^[a-c]*$`, onePass, `abc`},
-	{`^...$`, onePass, ``},
-	{`^(?:a|(?:aa))$`, onePass, `a`},
-	{`^[a-c]*`, notOnePass, `abcabc`},
-	{`^a((b))c$`, onePass, noStr},
-	{`^a.[l-nA-Cg-j]?e$`, onePass, noStr},
-	{`^a((b))$`, onePass, noStr},
-	{`^a(?:(b)|(c))c$`, onePass, noStr},
-	{`^a(?:(b*)|(c))c$`, notOnePass, noStr},
-	{`^a(?:b|c)$`, onePass, noStr},
-	{`^a(?:b?|c)$`, onePass, noStr},
-	{`^a(?:b?|c?)$`, notOnePass, noStr},
-	{`^a(?:b?|c+)$`, onePass, noStr},
-	{`^a(?:b+|(bc))d$`, notOnePass, noStr},
-	{`^a(?:bc)+$`, onePass, noStr},
-	{`^a(?:[bcd])+$`, onePass, noStr},
-	{`^a((?:[bcd])+)$`, onePass, noStr},
-	{`^a(:?b|c)*d$`, onePass, `abbbccbbcbbd"`},
-	{`^.bc(d|e)*$`, onePass, `abcddddddeeeededd`},
-	{`^(?:(?:aa)|.)$`, notOnePass, `a`},
-	{`^(?:(?:a{1,2}){1,2})$`, notOnePass, `aaaa`},
-}
-
-func TestCompileOnePass(t *testing.T) {
-	var (
-		p   *syntax.Prog
-		re  *syntax.Regexp
-		err error
-	)
-	for _, test := range onePassTests {
-		if re, err = syntax.Parse(test.re, syntax.Perl); err != nil {
-			t.Errorf("Parse(%q) got err:%s, want success", test.re, err)
-			continue
-		}
-		// needs to be done before compile...
-		re = re.Simplify()
-		if p, err = syntax.Compile(re); err != nil {
-			t.Errorf("Compile(%q) got err:%s, want success", test.re, err)
-			continue
-		}
-		onePass = compileOnePass(p)
-		if (onePass == notOnePass) != (test.onePass == notOnePass) {
-			t.Errorf("CompileOnePass(%q) got %v, expected %v", test.re, onePass, test.onePass)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/regexp.go b/third_party/gofrontend/libgo/go/regexp/regexp.go
deleted file mode 100644
index 4e4b412..0000000
--- a/third_party/gofrontend/libgo/go/regexp/regexp.go
+++ /dev/null
@@ -1,1120 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package regexp implements regular expression search.
-//
-// The syntax of the regular expressions accepted is the same
-// general syntax used by Perl, Python, and other languages.
-// More precisely, it is the syntax accepted by RE2 and described at
-// https://golang.org/s/re2syntax, except for \C.
-// For an overview of the syntax, run
-//   go doc regexp/syntax
-//
-// The regexp implementation provided by this package is
-// guaranteed to run in time linear in the size of the input.
-// (This is a property not guaranteed by most open source
-// implementations of regular expressions.) For more information
-// about this property, see
-//	http://swtch.com/~rsc/regexp/regexp1.html
-// or any book about automata theory.
-//
-// All characters are UTF-8-encoded code points.
-//
-// There are 16 methods of Regexp that match a regular expression and identify
-// the matched text.  Their names are matched by this regular expression:
-//
-//	Find(All)?(String)?(Submatch)?(Index)?
-//
-// If 'All' is present, the routine matches successive non-overlapping
-// matches of the entire expression.  Empty matches abutting a preceding
-// match are ignored.  The return value is a slice containing the successive
-// return values of the corresponding non-'All' routine.  These routines take
-// an extra integer argument, n; if n >= 0, the function returns at most n
-// matches/submatches.
-//
-// If 'String' is present, the argument is a string; otherwise it is a slice
-// of bytes; return values are adjusted as appropriate.
-//
-// If 'Submatch' is present, the return value is a slice identifying the
-// successive submatches of the expression. Submatches are matches of
-// parenthesized subexpressions (also known as capturing groups) within the
-// regular expression, numbered from left to right in order of opening
-// parenthesis. Submatch 0 is the match of the entire expression, submatch 1
-// the match of the first parenthesized subexpression, and so on.
-//
-// If 'Index' is present, matches and submatches are identified by byte index
-// pairs within the input string: result[2*n:2*n+1] identifies the indexes of
-// the nth submatch.  The pair for n==0 identifies the match of the entire
-// expression.  If 'Index' is not present, the match is identified by the
-// text of the match/submatch.  If an index is negative, it means that
-// subexpression did not match any string in the input.
-//
-// There is also a subset of the methods that can be applied to text read
-// from a RuneReader:
-//
-//	MatchReader, FindReaderIndex, FindReaderSubmatchIndex
-//
-// This set may grow.  Note that regular expression matches may need to
-// examine text beyond the text returned by a match, so the methods that
-// match text from a RuneReader may read arbitrarily far into the input
-// before returning.
-//
-// (There are a few other methods that do not match this pattern.)
-//
-package regexp
-
-import (
-	"bytes"
-	"io"
-	"regexp/syntax"
-	"strconv"
-	"strings"
-	"sync"
-	"unicode"
-	"unicode/utf8"
-)
-
-var debug = false
-
-// Regexp is the representation of a compiled regular expression.
-// A Regexp is safe for concurrent use by multiple goroutines.
-type Regexp struct {
-	// read-only after Compile
-	expr           string         // as passed to Compile
-	prog           *syntax.Prog   // compiled program
-	onepass        *onePassProg   // onepass program or nil
-	prefix         string         // required prefix in unanchored matches
-	prefixBytes    []byte         // prefix, as a []byte
-	prefixComplete bool           // prefix is the entire regexp
-	prefixRune     rune           // first rune in prefix
-	prefixEnd      uint32         // pc for last rune in prefix
-	cond           syntax.EmptyOp // empty-width conditions required at start of match
-	numSubexp      int
-	subexpNames    []string
-	longest        bool
-
-	// cache of machines for running regexp
-	mu      sync.Mutex
-	machine []*machine
-}
-
-// String returns the source text used to compile the regular expression.
-func (re *Regexp) String() string {
-	return re.expr
-}
-
-// Compile parses a regular expression and returns, if successful,
-// a Regexp object that can be used to match against text.
-//
-// When matching against text, the regexp returns a match that
-// begins as early as possible in the input (leftmost), and among those
-// it chooses the one that a backtracking search would have found first.
-// This so-called leftmost-first matching is the same semantics
-// that Perl, Python, and other implementations use, although this
-// package implements it without the expense of backtracking.
-// For POSIX leftmost-longest matching, see CompilePOSIX.
-func Compile(expr string) (*Regexp, error) {
-	return compile(expr, syntax.Perl, false)
-}
-
-// CompilePOSIX is like Compile but restricts the regular expression
-// to POSIX ERE (egrep) syntax and changes the match semantics to
-// leftmost-longest.
-//
-// That is, when matching against text, the regexp returns a match that
-// begins as early as possible in the input (leftmost), and among those
-// it chooses a match that is as long as possible.
-// This so-called leftmost-longest matching is the same semantics
-// that early regular expression implementations used and that POSIX
-// specifies.
-//
-// However, there can be multiple leftmost-longest matches, with different
-// submatch choices, and here this package diverges from POSIX.
-// Among the possible leftmost-longest matches, this package chooses
-// the one that a backtracking search would have found first, while POSIX
-// specifies that the match be chosen to maximize the length of the first
-// subexpression, then the second, and so on from left to right.
-// The POSIX rule is computationally prohibitive and not even well-defined.
-// See http://swtch.com/~rsc/regexp/regexp2.html#posix for details.
-func CompilePOSIX(expr string) (*Regexp, error) {
-	return compile(expr, syntax.POSIX, true)
-}
-
-// Longest makes future searches prefer the leftmost-longest match.
-// That is, when matching against text, the regexp returns a match that
-// begins as early as possible in the input (leftmost), and among those
-// it chooses a match that is as long as possible.
-func (re *Regexp) Longest() {
-	re.longest = true
-}
-
-func compile(expr string, mode syntax.Flags, longest bool) (*Regexp, error) {
-	re, err := syntax.Parse(expr, mode)
-	if err != nil {
-		return nil, err
-	}
-	maxCap := re.MaxCap()
-	capNames := re.CapNames()
-
-	re = re.Simplify()
-	prog, err := syntax.Compile(re)
-	if err != nil {
-		return nil, err
-	}
-	regexp := &Regexp{
-		expr:        expr,
-		prog:        prog,
-		onepass:     compileOnePass(prog),
-		numSubexp:   maxCap,
-		subexpNames: capNames,
-		cond:        prog.StartCond(),
-		longest:     longest,
-	}
-	if regexp.onepass == notOnePass {
-		regexp.prefix, regexp.prefixComplete = prog.Prefix()
-	} else {
-		regexp.prefix, regexp.prefixComplete, regexp.prefixEnd = onePassPrefix(prog)
-	}
-	if regexp.prefix != "" {
-		// TODO(rsc): Remove this allocation by adding
-		// IndexString to package bytes.
-		regexp.prefixBytes = []byte(regexp.prefix)
-		regexp.prefixRune, _ = utf8.DecodeRuneInString(regexp.prefix)
-	}
-	return regexp, nil
-}
-
-// get returns a machine to use for matching re.
-// It uses the re's machine cache if possible, to avoid
-// unnecessary allocation.
-func (re *Regexp) get() *machine {
-	re.mu.Lock()
-	if n := len(re.machine); n > 0 {
-		z := re.machine[n-1]
-		re.machine = re.machine[:n-1]
-		re.mu.Unlock()
-		return z
-	}
-	re.mu.Unlock()
-	z := progMachine(re.prog, re.onepass)
-	z.re = re
-	return z
-}
-
-// put returns a machine to the re's machine cache.
-// There is no attempt to limit the size of the cache, so it will
-// grow to the maximum number of simultaneous matches
-// run using re.  (The cache empties when re gets garbage collected.)
-func (re *Regexp) put(z *machine) {
-	re.mu.Lock()
-	re.machine = append(re.machine, z)
-	re.mu.Unlock()
-}
-
-// MustCompile is like Compile but panics if the expression cannot be parsed.
-// It simplifies safe initialization of global variables holding compiled regular
-// expressions.
-func MustCompile(str string) *Regexp {
-	regexp, error := Compile(str)
-	if error != nil {
-		panic(`regexp: Compile(` + quote(str) + `): ` + error.Error())
-	}
-	return regexp
-}
-
-// MustCompilePOSIX is like CompilePOSIX but panics if the expression cannot be parsed.
-// It simplifies safe initialization of global variables holding compiled regular
-// expressions.
-func MustCompilePOSIX(str string) *Regexp {
-	regexp, error := CompilePOSIX(str)
-	if error != nil {
-		panic(`regexp: CompilePOSIX(` + quote(str) + `): ` + error.Error())
-	}
-	return regexp
-}
-
-func quote(s string) string {
-	if strconv.CanBackquote(s) {
-		return "`" + s + "`"
-	}
-	return strconv.Quote(s)
-}
-
-// NumSubexp returns the number of parenthesized subexpressions in this Regexp.
-func (re *Regexp) NumSubexp() int {
-	return re.numSubexp
-}
-
-// SubexpNames returns the names of the parenthesized subexpressions
-// in this Regexp.  The name for the first sub-expression is names[1],
-// so that if m is a match slice, the name for m[i] is SubexpNames()[i].
-// Since the Regexp as a whole cannot be named, names[0] is always
-// the empty string.  The slice should not be modified.
-func (re *Regexp) SubexpNames() []string {
-	return re.subexpNames
-}
-
-const endOfText rune = -1
-
-// input abstracts different representations of the input text. It provides
-// one-character lookahead.
-type input interface {
-	step(pos int) (r rune, width int) // advance one rune
-	canCheckPrefix() bool             // can we look ahead without losing info?
-	hasPrefix(re *Regexp) bool
-	index(re *Regexp, pos int) int
-	context(pos int) syntax.EmptyOp
-}
-
-// inputString scans a string.
-type inputString struct {
-	str string
-}
-
-func (i *inputString) step(pos int) (rune, int) {
-	if pos < len(i.str) {
-		c := i.str[pos]
-		if c < utf8.RuneSelf {
-			return rune(c), 1
-		}
-		return utf8.DecodeRuneInString(i.str[pos:])
-	}
-	return endOfText, 0
-}
-
-func (i *inputString) canCheckPrefix() bool {
-	return true
-}
-
-func (i *inputString) hasPrefix(re *Regexp) bool {
-	return strings.HasPrefix(i.str, re.prefix)
-}
-
-func (i *inputString) index(re *Regexp, pos int) int {
-	return strings.Index(i.str[pos:], re.prefix)
-}
-
-func (i *inputString) context(pos int) syntax.EmptyOp {
-	r1, r2 := endOfText, endOfText
-	if pos > 0 && pos <= len(i.str) {
-		r1, _ = utf8.DecodeLastRuneInString(i.str[:pos])
-	}
-	if pos < len(i.str) {
-		r2, _ = utf8.DecodeRuneInString(i.str[pos:])
-	}
-	return syntax.EmptyOpContext(r1, r2)
-}
-
-// inputBytes scans a byte slice.
-type inputBytes struct {
-	str []byte
-}
-
-func (i *inputBytes) step(pos int) (rune, int) {
-	if pos < len(i.str) {
-		c := i.str[pos]
-		if c < utf8.RuneSelf {
-			return rune(c), 1
-		}
-		return utf8.DecodeRune(i.str[pos:])
-	}
-	return endOfText, 0
-}
-
-func (i *inputBytes) canCheckPrefix() bool {
-	return true
-}
-
-func (i *inputBytes) hasPrefix(re *Regexp) bool {
-	return bytes.HasPrefix(i.str, re.prefixBytes)
-}
-
-func (i *inputBytes) index(re *Regexp, pos int) int {
-	return bytes.Index(i.str[pos:], re.prefixBytes)
-}
-
-func (i *inputBytes) context(pos int) syntax.EmptyOp {
-	r1, r2 := endOfText, endOfText
-	if pos > 0 && pos <= len(i.str) {
-		r1, _ = utf8.DecodeLastRune(i.str[:pos])
-	}
-	if pos < len(i.str) {
-		r2, _ = utf8.DecodeRune(i.str[pos:])
-	}
-	return syntax.EmptyOpContext(r1, r2)
-}
-
-// inputReader scans a RuneReader.
-type inputReader struct {
-	r     io.RuneReader
-	atEOT bool
-	pos   int
-}
-
-func (i *inputReader) step(pos int) (rune, int) {
-	if !i.atEOT && pos != i.pos {
-		return endOfText, 0
-
-	}
-	r, w, err := i.r.ReadRune()
-	if err != nil {
-		i.atEOT = true
-		return endOfText, 0
-	}
-	i.pos += w
-	return r, w
-}
-
-func (i *inputReader) canCheckPrefix() bool {
-	return false
-}
-
-func (i *inputReader) hasPrefix(re *Regexp) bool {
-	return false
-}
-
-func (i *inputReader) index(re *Regexp, pos int) int {
-	return -1
-}
-
-func (i *inputReader) context(pos int) syntax.EmptyOp {
-	return 0
-}
-
-// LiteralPrefix returns a literal string that must begin any match
-// of the regular expression re.  It returns the boolean true if the
-// literal string comprises the entire regular expression.
-func (re *Regexp) LiteralPrefix() (prefix string, complete bool) {
-	return re.prefix, re.prefixComplete
-}
-
-// MatchReader reports whether the Regexp matches the text read by the
-// RuneReader.
-func (re *Regexp) MatchReader(r io.RuneReader) bool {
-	return re.doExecute(r, nil, "", 0, 0) != nil
-}
-
-// MatchString reports whether the Regexp matches the string s.
-func (re *Regexp) MatchString(s string) bool {
-	return re.doExecute(nil, nil, s, 0, 0) != nil
-}
-
-// Match reports whether the Regexp matches the byte slice b.
-func (re *Regexp) Match(b []byte) bool {
-	return re.doExecute(nil, b, "", 0, 0) != nil
-}
-
-// MatchReader checks whether a textual regular expression matches the text
-// read by the RuneReader.  More complicated queries need to use Compile and
-// the full Regexp interface.
-func MatchReader(pattern string, r io.RuneReader) (matched bool, err error) {
-	re, err := Compile(pattern)
-	if err != nil {
-		return false, err
-	}
-	return re.MatchReader(r), nil
-}
-
-// MatchString checks whether a textual regular expression
-// matches a string.  More complicated queries need
-// to use Compile and the full Regexp interface.
-func MatchString(pattern string, s string) (matched bool, err error) {
-	re, err := Compile(pattern)
-	if err != nil {
-		return false, err
-	}
-	return re.MatchString(s), nil
-}
-
-// Match checks whether a textual regular expression
-// matches a byte slice.  More complicated queries need
-// to use Compile and the full Regexp interface.
-func Match(pattern string, b []byte) (matched bool, err error) {
-	re, err := Compile(pattern)
-	if err != nil {
-		return false, err
-	}
-	return re.Match(b), nil
-}
-
-// ReplaceAllString returns a copy of src, replacing matches of the Regexp
-// with the replacement string repl.  Inside repl, $ signs are interpreted as
-// in Expand, so for instance $1 represents the text of the first submatch.
-func (re *Regexp) ReplaceAllString(src, repl string) string {
-	n := 2
-	if strings.Index(repl, "$") >= 0 {
-		n = 2 * (re.numSubexp + 1)
-	}
-	b := re.replaceAll(nil, src, n, func(dst []byte, match []int) []byte {
-		return re.expand(dst, repl, nil, src, match)
-	})
-	return string(b)
-}
-
-// ReplaceAllLiteralString returns a copy of src, replacing matches of the Regexp
-// with the replacement string repl.  The replacement repl is substituted directly,
-// without using Expand.
-func (re *Regexp) ReplaceAllLiteralString(src, repl string) string {
-	return string(re.replaceAll(nil, src, 2, func(dst []byte, match []int) []byte {
-		return append(dst, repl...)
-	}))
-}
-
-// ReplaceAllStringFunc returns a copy of src in which all matches of the
-// Regexp have been replaced by the return value of function repl applied
-// to the matched substring.  The replacement returned by repl is substituted
-// directly, without using Expand.
-func (re *Regexp) ReplaceAllStringFunc(src string, repl func(string) string) string {
-	b := re.replaceAll(nil, src, 2, func(dst []byte, match []int) []byte {
-		return append(dst, repl(src[match[0]:match[1]])...)
-	})
-	return string(b)
-}
-
-func (re *Regexp) replaceAll(bsrc []byte, src string, nmatch int, repl func(dst []byte, m []int) []byte) []byte {
-	lastMatchEnd := 0 // end position of the most recent match
-	searchPos := 0    // position where we next look for a match
-	var buf []byte
-	var endPos int
-	if bsrc != nil {
-		endPos = len(bsrc)
-	} else {
-		endPos = len(src)
-	}
-	for searchPos <= endPos {
-		a := re.doExecute(nil, bsrc, src, searchPos, nmatch)
-		if len(a) == 0 {
-			break // no more matches
-		}
-
-		// Copy the unmatched characters before this match.
-		if bsrc != nil {
-			buf = append(buf, bsrc[lastMatchEnd:a[0]]...)
-		} else {
-			buf = append(buf, src[lastMatchEnd:a[0]]...)
-		}
-
-		// Now insert a copy of the replacement string, but not for a
-		// match of the empty string immediately after another match.
-		// (Otherwise, we get double replacement for patterns that
-		// match both empty and nonempty strings.)
-		if a[1] > lastMatchEnd || a[0] == 0 {
-			buf = repl(buf, a)
-		}
-		lastMatchEnd = a[1]
-
-		// Advance past this match; always advance at least one character.
-		var width int
-		if bsrc != nil {
-			_, width = utf8.DecodeRune(bsrc[searchPos:])
-		} else {
-			_, width = utf8.DecodeRuneInString(src[searchPos:])
-		}
-		if searchPos+width > a[1] {
-			searchPos += width
-		} else if searchPos+1 > a[1] {
-			// This clause is only needed at the end of the input
-			// string.  In that case, DecodeRuneInString returns width=0.
-			searchPos++
-		} else {
-			searchPos = a[1]
-		}
-	}
-
-	// Copy the unmatched characters after the last match.
-	if bsrc != nil {
-		buf = append(buf, bsrc[lastMatchEnd:]...)
-	} else {
-		buf = append(buf, src[lastMatchEnd:]...)
-	}
-
-	return buf
-}
-
-// ReplaceAll returns a copy of src, replacing matches of the Regexp
-// with the replacement text repl.  Inside repl, $ signs are interpreted as
-// in Expand, so for instance $1 represents the text of the first submatch.
-func (re *Regexp) ReplaceAll(src, repl []byte) []byte {
-	n := 2
-	if bytes.IndexByte(repl, '$') >= 0 {
-		n = 2 * (re.numSubexp + 1)
-	}
-	srepl := ""
-	b := re.replaceAll(src, "", n, func(dst []byte, match []int) []byte {
-		if len(srepl) != len(repl) {
-			srepl = string(repl)
-		}
-		return re.expand(dst, srepl, src, "", match)
-	})
-	return b
-}
-
-// ReplaceAllLiteral returns a copy of src, replacing matches of the Regexp
-// with the replacement bytes repl.  The replacement repl is substituted directly,
-// without using Expand.
-func (re *Regexp) ReplaceAllLiteral(src, repl []byte) []byte {
-	return re.replaceAll(src, "", 2, func(dst []byte, match []int) []byte {
-		return append(dst, repl...)
-	})
-}
-
-// ReplaceAllFunc returns a copy of src in which all matches of the
-// Regexp have been replaced by the return value of function repl applied
-// to the matched byte slice.  The replacement returned by repl is substituted
-// directly, without using Expand.
-func (re *Regexp) ReplaceAllFunc(src []byte, repl func([]byte) []byte) []byte {
-	return re.replaceAll(src, "", 2, func(dst []byte, match []int) []byte {
-		return append(dst, repl(src[match[0]:match[1]])...)
-	})
-}
-
-var specialBytes = []byte(`\.+*?()|[]{}^$`)
-
-func special(b byte) bool {
-	return bytes.IndexByte(specialBytes, b) >= 0
-}
-
-// QuoteMeta returns a string that quotes all regular expression metacharacters
-// inside the argument text; the returned string is a regular expression matching
-// the literal text.  For example, QuoteMeta(`[foo]`) returns `\[foo\]`.
-func QuoteMeta(s string) string {
-	b := make([]byte, 2*len(s))
-
-	// A byte loop is correct because all metacharacters are ASCII.
-	j := 0
-	for i := 0; i < len(s); i++ {
-		if special(s[i]) {
-			b[j] = '\\'
-			j++
-		}
-		b[j] = s[i]
-		j++
-	}
-	return string(b[0:j])
-}
-
-// The number of capture values in the program may correspond
-// to fewer capturing expressions than are in the regexp.
-// For example, "(a){0}" turns into an empty program, so the
-// maximum capture in the program is 0 but we need to return
-// an expression for \1.  Pad appends -1s to the slice a as needed.
-func (re *Regexp) pad(a []int) []int {
-	if a == nil {
-		// No match.
-		return nil
-	}
-	n := (1 + re.numSubexp) * 2
-	for len(a) < n {
-		a = append(a, -1)
-	}
-	return a
-}
-
-// Find matches in slice b if b is non-nil, otherwise find matches in string s.
-func (re *Regexp) allMatches(s string, b []byte, n int, deliver func([]int)) {
-	var end int
-	if b == nil {
-		end = len(s)
-	} else {
-		end = len(b)
-	}
-
-	for pos, i, prevMatchEnd := 0, 0, -1; i < n && pos <= end; {
-		matches := re.doExecute(nil, b, s, pos, re.prog.NumCap)
-		if len(matches) == 0 {
-			break
-		}
-
-		accept := true
-		if matches[1] == pos {
-			// We've found an empty match.
-			if matches[0] == prevMatchEnd {
-				// We don't allow an empty match right
-				// after a previous match, so ignore it.
-				accept = false
-			}
-			var width int
-			// TODO: use step()
-			if b == nil {
-				_, width = utf8.DecodeRuneInString(s[pos:end])
-			} else {
-				_, width = utf8.DecodeRune(b[pos:end])
-			}
-			if width > 0 {
-				pos += width
-			} else {
-				pos = end + 1
-			}
-		} else {
-			pos = matches[1]
-		}
-		prevMatchEnd = matches[1]
-
-		if accept {
-			deliver(re.pad(matches))
-			i++
-		}
-	}
-}
-
-// Find returns a slice holding the text of the leftmost match in b of the regular expression.
-// A return value of nil indicates no match.
-func (re *Regexp) Find(b []byte) []byte {
-	a := re.doExecute(nil, b, "", 0, 2)
-	if a == nil {
-		return nil
-	}
-	return b[a[0]:a[1]]
-}
-
-// FindIndex returns a two-element slice of integers defining the location of
-// the leftmost match in b of the regular expression.  The match itself is at
-// b[loc[0]:loc[1]].
-// A return value of nil indicates no match.
-func (re *Regexp) FindIndex(b []byte) (loc []int) {
-	a := re.doExecute(nil, b, "", 0, 2)
-	if a == nil {
-		return nil
-	}
-	return a[0:2]
-}
-
-// FindString returns a string holding the text of the leftmost match in s of the regular
-// expression.  If there is no match, the return value is an empty string,
-// but it will also be empty if the regular expression successfully matches
-// an empty string.  Use FindStringIndex or FindStringSubmatch if it is
-// necessary to distinguish these cases.
-func (re *Regexp) FindString(s string) string {
-	a := re.doExecute(nil, nil, s, 0, 2)
-	if a == nil {
-		return ""
-	}
-	return s[a[0]:a[1]]
-}
-
-// FindStringIndex returns a two-element slice of integers defining the
-// location of the leftmost match in s of the regular expression.  The match
-// itself is at s[loc[0]:loc[1]].
-// A return value of nil indicates no match.
-func (re *Regexp) FindStringIndex(s string) (loc []int) {
-	a := re.doExecute(nil, nil, s, 0, 2)
-	if a == nil {
-		return nil
-	}
-	return a[0:2]
-}
-
-// FindReaderIndex returns a two-element slice of integers defining the
-// location of the leftmost match of the regular expression in text read from
-// the RuneReader.  The match text was found in the input stream at
-// byte offset loc[0] through loc[1]-1.
-// A return value of nil indicates no match.
-func (re *Regexp) FindReaderIndex(r io.RuneReader) (loc []int) {
-	a := re.doExecute(r, nil, "", 0, 2)
-	if a == nil {
-		return nil
-	}
-	return a[0:2]
-}
-
-// FindSubmatch returns a slice of slices holding the text of the leftmost
-// match of the regular expression in b and the matches, if any, of its
-// subexpressions, as defined by the 'Submatch' descriptions in the package
-// comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindSubmatch(b []byte) [][]byte {
-	a := re.doExecute(nil, b, "", 0, re.prog.NumCap)
-	if a == nil {
-		return nil
-	}
-	ret := make([][]byte, 1+re.numSubexp)
-	for i := range ret {
-		if 2*i < len(a) && a[2*i] >= 0 {
-			ret[i] = b[a[2*i]:a[2*i+1]]
-		}
-	}
-	return ret
-}
-
-// Expand appends template to dst and returns the result; during the
-// append, Expand replaces variables in the template with corresponding
-// matches drawn from src.  The match slice should have been returned by
-// FindSubmatchIndex.
-//
-// In the template, a variable is denoted by a substring of the form
-// $name or ${name}, where name is a non-empty sequence of letters,
-// digits, and underscores.  A purely numeric name like $1 refers to
-// the submatch with the corresponding index; other names refer to
-// capturing parentheses named with the (?P<name>...) syntax.  A
-// reference to an out of range or unmatched index or a name that is not
-// present in the regular expression is replaced with an empty slice.
-//
-// In the $name form, name is taken to be as long as possible: $1x is
-// equivalent to ${1x}, not ${1}x, and, $10 is equivalent to ${10}, not ${1}0.
-//
-// To insert a literal $ in the output, use $$ in the template.
-func (re *Regexp) Expand(dst []byte, template []byte, src []byte, match []int) []byte {
-	return re.expand(dst, string(template), src, "", match)
-}
-
-// ExpandString is like Expand but the template and source are strings.
-// It appends to and returns a byte slice in order to give the calling
-// code control over allocation.
-func (re *Regexp) ExpandString(dst []byte, template string, src string, match []int) []byte {
-	return re.expand(dst, template, nil, src, match)
-}
-
-func (re *Regexp) expand(dst []byte, template string, bsrc []byte, src string, match []int) []byte {
-	for len(template) > 0 {
-		i := strings.Index(template, "$")
-		if i < 0 {
-			break
-		}
-		dst = append(dst, template[:i]...)
-		template = template[i:]
-		if len(template) > 1 && template[1] == '$' {
-			// Treat $$ as $.
-			dst = append(dst, '$')
-			template = template[2:]
-			continue
-		}
-		name, num, rest, ok := extract(template)
-		if !ok {
-			// Malformed; treat $ as raw text.
-			dst = append(dst, '$')
-			template = template[1:]
-			continue
-		}
-		template = rest
-		if num >= 0 {
-			if 2*num+1 < len(match) && match[2*num] >= 0 {
-				if bsrc != nil {
-					dst = append(dst, bsrc[match[2*num]:match[2*num+1]]...)
-				} else {
-					dst = append(dst, src[match[2*num]:match[2*num+1]]...)
-				}
-			}
-		} else {
-			for i, namei := range re.subexpNames {
-				if name == namei && 2*i+1 < len(match) && match[2*i] >= 0 {
-					if bsrc != nil {
-						dst = append(dst, bsrc[match[2*i]:match[2*i+1]]...)
-					} else {
-						dst = append(dst, src[match[2*i]:match[2*i+1]]...)
-					}
-					break
-				}
-			}
-		}
-	}
-	dst = append(dst, template...)
-	return dst
-}
-
-// extract returns the name from a leading "$name" or "${name}" in str.
-// If it is a number, extract returns num set to that number; otherwise num = -1.
-func extract(str string) (name string, num int, rest string, ok bool) {
-	if len(str) < 2 || str[0] != '$' {
-		return
-	}
-	brace := false
-	if str[1] == '{' {
-		brace = true
-		str = str[2:]
-	} else {
-		str = str[1:]
-	}
-	i := 0
-	for i < len(str) {
-		rune, size := utf8.DecodeRuneInString(str[i:])
-		if !unicode.IsLetter(rune) && !unicode.IsDigit(rune) && rune != '_' {
-			break
-		}
-		i += size
-	}
-	if i == 0 {
-		// empty name is not okay
-		return
-	}
-	name = str[:i]
-	if brace {
-		if i >= len(str) || str[i] != '}' {
-			// missing closing brace
-			return
-		}
-		i++
-	}
-
-	// Parse number.
-	num = 0
-	for i := 0; i < len(name); i++ {
-		if name[i] < '0' || '9' < name[i] || num >= 1e8 {
-			num = -1
-			break
-		}
-		num = num*10 + int(name[i]) - '0'
-	}
-	// Disallow leading zeros.
-	if name[0] == '0' && len(name) > 1 {
-		num = -1
-	}
-
-	rest = str[i:]
-	ok = true
-	return
-}
-
-// FindSubmatchIndex returns a slice holding the index pairs identifying the
-// leftmost match of the regular expression in b and the matches, if any, of
-// its subexpressions, as defined by the 'Submatch' and 'Index' descriptions
-// in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindSubmatchIndex(b []byte) []int {
-	return re.pad(re.doExecute(nil, b, "", 0, re.prog.NumCap))
-}
-
-// FindStringSubmatch returns a slice of strings holding the text of the
-// leftmost match of the regular expression in s and the matches, if any, of
-// its subexpressions, as defined by the 'Submatch' description in the
-// package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindStringSubmatch(s string) []string {
-	a := re.doExecute(nil, nil, s, 0, re.prog.NumCap)
-	if a == nil {
-		return nil
-	}
-	ret := make([]string, 1+re.numSubexp)
-	for i := range ret {
-		if 2*i < len(a) && a[2*i] >= 0 {
-			ret[i] = s[a[2*i]:a[2*i+1]]
-		}
-	}
-	return ret
-}
-
-// FindStringSubmatchIndex returns a slice holding the index pairs
-// identifying the leftmost match of the regular expression in s and the
-// matches, if any, of its subexpressions, as defined by the 'Submatch' and
-// 'Index' descriptions in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindStringSubmatchIndex(s string) []int {
-	return re.pad(re.doExecute(nil, nil, s, 0, re.prog.NumCap))
-}
-
-// FindReaderSubmatchIndex returns a slice holding the index pairs
-// identifying the leftmost match of the regular expression of text read by
-// the RuneReader, and the matches, if any, of its subexpressions, as defined
-// by the 'Submatch' and 'Index' descriptions in the package comment.  A
-// return value of nil indicates no match.
-func (re *Regexp) FindReaderSubmatchIndex(r io.RuneReader) []int {
-	return re.pad(re.doExecute(r, nil, "", 0, re.prog.NumCap))
-}
-
-const startSize = 10 // The size at which to start a slice in the 'All' routines.
-
-// FindAll is the 'All' version of Find; it returns a slice of all successive
-// matches of the expression, as defined by the 'All' description in the
-// package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAll(b []byte, n int) [][]byte {
-	if n < 0 {
-		n = len(b) + 1
-	}
-	result := make([][]byte, 0, startSize)
-	re.allMatches("", b, n, func(match []int) {
-		result = append(result, b[match[0]:match[1]])
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllIndex is the 'All' version of FindIndex; it returns a slice of all
-// successive matches of the expression, as defined by the 'All' description
-// in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllIndex(b []byte, n int) [][]int {
-	if n < 0 {
-		n = len(b) + 1
-	}
-	result := make([][]int, 0, startSize)
-	re.allMatches("", b, n, func(match []int) {
-		result = append(result, match[0:2])
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllString is the 'All' version of FindString; it returns a slice of all
-// successive matches of the expression, as defined by the 'All' description
-// in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllString(s string, n int) []string {
-	if n < 0 {
-		n = len(s) + 1
-	}
-	result := make([]string, 0, startSize)
-	re.allMatches(s, nil, n, func(match []int) {
-		result = append(result, s[match[0]:match[1]])
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllStringIndex is the 'All' version of FindStringIndex; it returns a
-// slice of all successive matches of the expression, as defined by the 'All'
-// description in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllStringIndex(s string, n int) [][]int {
-	if n < 0 {
-		n = len(s) + 1
-	}
-	result := make([][]int, 0, startSize)
-	re.allMatches(s, nil, n, func(match []int) {
-		result = append(result, match[0:2])
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllSubmatch is the 'All' version of FindSubmatch; it returns a slice
-// of all successive matches of the expression, as defined by the 'All'
-// description in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]byte {
-	if n < 0 {
-		n = len(b) + 1
-	}
-	result := make([][][]byte, 0, startSize)
-	re.allMatches("", b, n, func(match []int) {
-		slice := make([][]byte, len(match)/2)
-		for j := range slice {
-			if match[2*j] >= 0 {
-				slice[j] = b[match[2*j]:match[2*j+1]]
-			}
-		}
-		result = append(result, slice)
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllSubmatchIndex is the 'All' version of FindSubmatchIndex; it returns
-// a slice of all successive matches of the expression, as defined by the
-// 'All' description in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int {
-	if n < 0 {
-		n = len(b) + 1
-	}
-	result := make([][]int, 0, startSize)
-	re.allMatches("", b, n, func(match []int) {
-		result = append(result, match)
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllStringSubmatch is the 'All' version of FindStringSubmatch; it
-// returns a slice of all successive matches of the expression, as defined by
-// the 'All' description in the package comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string {
-	if n < 0 {
-		n = len(s) + 1
-	}
-	result := make([][]string, 0, startSize)
-	re.allMatches(s, nil, n, func(match []int) {
-		slice := make([]string, len(match)/2)
-		for j := range slice {
-			if match[2*j] >= 0 {
-				slice[j] = s[match[2*j]:match[2*j+1]]
-			}
-		}
-		result = append(result, slice)
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// FindAllStringSubmatchIndex is the 'All' version of
-// FindStringSubmatchIndex; it returns a slice of all successive matches of
-// the expression, as defined by the 'All' description in the package
-// comment.
-// A return value of nil indicates no match.
-func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int {
-	if n < 0 {
-		n = len(s) + 1
-	}
-	result := make([][]int, 0, startSize)
-	re.allMatches(s, nil, n, func(match []int) {
-		result = append(result, match)
-	})
-	if len(result) == 0 {
-		return nil
-	}
-	return result
-}
-
-// Split slices s into substrings separated by the expression and returns a slice of
-// the substrings between those expression matches.
-//
-// The slice returned by this method consists of all the substrings of s
-// not contained in the slice returned by FindAllString. When called on an expression
-// that contains no metacharacters, it is equivalent to strings.SplitN.
-//
-// Example:
-//   s := regexp.MustCompile("a*").Split("abaabaccadaaae", 5)
-//   // s: ["", "b", "b", "c", "cadaaae"]
-//
-// The count determines the number of substrings to return:
-//   n > 0: at most n substrings; the last substring will be the unsplit remainder.
-//   n == 0: the result is nil (zero substrings)
-//   n < 0: all substrings
-func (re *Regexp) Split(s string, n int) []string {
-
-	if n == 0 {
-		return nil
-	}
-
-	if len(re.expr) > 0 && len(s) == 0 {
-		return []string{""}
-	}
-
-	matches := re.FindAllStringIndex(s, n)
-	strings := make([]string, 0, len(matches))
-
-	beg := 0
-	end := 0
-	for _, match := range matches {
-		if n > 0 && len(strings) >= n-1 {
-			break
-		}
-
-		end = match[0]
-		if match[1] != 0 {
-			strings = append(strings, s[beg:end])
-		}
-		beg = match[1]
-	}
-
-	if end != len(s) {
-		strings = append(strings, s[beg:])
-	}
-
-	return strings
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/syntax/compile.go b/third_party/gofrontend/libgo/go/regexp/syntax/compile.go
deleted file mode 100644
index 95f6f15..0000000
--- a/third_party/gofrontend/libgo/go/regexp/syntax/compile.go
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syntax
-
-import "unicode"
-
-// A patchList is a list of instruction pointers that need to be filled in (patched).
-// Because the pointers haven't been filled in yet, we can reuse their storage
-// to hold the list.  It's kind of sleazy, but works well in practice.
-// See http://swtch.com/~rsc/regexp/regexp1.html for inspiration.
-//
-// These aren't really pointers: they're integers, so we can reinterpret them
-// this way without using package unsafe.  A value l denotes
-// p.inst[l>>1].Out (l&1==0) or .Arg (l&1==1).
-// l == 0 denotes the empty list, okay because we start every program
-// with a fail instruction, so we'll never want to point at its output link.
-type patchList uint32
-
-func (l patchList) next(p *Prog) patchList {
-	i := &p.Inst[l>>1]
-	if l&1 == 0 {
-		return patchList(i.Out)
-	}
-	return patchList(i.Arg)
-}
-
-func (l patchList) patch(p *Prog, val uint32) {
-	for l != 0 {
-		i := &p.Inst[l>>1]
-		if l&1 == 0 {
-			l = patchList(i.Out)
-			i.Out = val
-		} else {
-			l = patchList(i.Arg)
-			i.Arg = val
-		}
-	}
-}
-
-func (l1 patchList) append(p *Prog, l2 patchList) patchList {
-	if l1 == 0 {
-		return l2
-	}
-	if l2 == 0 {
-		return l1
-	}
-
-	last := l1
-	for {
-		next := last.next(p)
-		if next == 0 {
-			break
-		}
-		last = next
-	}
-
-	i := &p.Inst[last>>1]
-	if last&1 == 0 {
-		i.Out = uint32(l2)
-	} else {
-		i.Arg = uint32(l2)
-	}
-	return l1
-}
-
-// A frag represents a compiled program fragment.
-type frag struct {
-	i   uint32    // index of first instruction
-	out patchList // where to record end instruction
-}
-
-type compiler struct {
-	p *Prog
-}
-
-// Compile compiles the regexp into a program to be executed.
-// The regexp should have been simplified already (returned from re.Simplify).
-func Compile(re *Regexp) (*Prog, error) {
-	var c compiler
-	c.init()
-	f := c.compile(re)
-	f.out.patch(c.p, c.inst(InstMatch).i)
-	c.p.Start = int(f.i)
-	return c.p, nil
-}
-
-func (c *compiler) init() {
-	c.p = new(Prog)
-	c.p.NumCap = 2 // implicit ( and ) for whole match $0
-	c.inst(InstFail)
-}
-
-var anyRuneNotNL = []rune{0, '\n' - 1, '\n' + 1, unicode.MaxRune}
-var anyRune = []rune{0, unicode.MaxRune}
-
-func (c *compiler) compile(re *Regexp) frag {
-	switch re.Op {
-	case OpNoMatch:
-		return c.fail()
-	case OpEmptyMatch:
-		return c.nop()
-	case OpLiteral:
-		if len(re.Rune) == 0 {
-			return c.nop()
-		}
-		var f frag
-		for j := range re.Rune {
-			f1 := c.rune(re.Rune[j:j+1], re.Flags)
-			if j == 0 {
-				f = f1
-			} else {
-				f = c.cat(f, f1)
-			}
-		}
-		return f
-	case OpCharClass:
-		return c.rune(re.Rune, re.Flags)
-	case OpAnyCharNotNL:
-		return c.rune(anyRuneNotNL, 0)
-	case OpAnyChar:
-		return c.rune(anyRune, 0)
-	case OpBeginLine:
-		return c.empty(EmptyBeginLine)
-	case OpEndLine:
-		return c.empty(EmptyEndLine)
-	case OpBeginText:
-		return c.empty(EmptyBeginText)
-	case OpEndText:
-		return c.empty(EmptyEndText)
-	case OpWordBoundary:
-		return c.empty(EmptyWordBoundary)
-	case OpNoWordBoundary:
-		return c.empty(EmptyNoWordBoundary)
-	case OpCapture:
-		bra := c.cap(uint32(re.Cap << 1))
-		sub := c.compile(re.Sub[0])
-		ket := c.cap(uint32(re.Cap<<1 | 1))
-		return c.cat(c.cat(bra, sub), ket)
-	case OpStar:
-		return c.star(c.compile(re.Sub[0]), re.Flags&NonGreedy != 0)
-	case OpPlus:
-		return c.plus(c.compile(re.Sub[0]), re.Flags&NonGreedy != 0)
-	case OpQuest:
-		return c.quest(c.compile(re.Sub[0]), re.Flags&NonGreedy != 0)
-	case OpConcat:
-		if len(re.Sub) == 0 {
-			return c.nop()
-		}
-		var f frag
-		for i, sub := range re.Sub {
-			if i == 0 {
-				f = c.compile(sub)
-			} else {
-				f = c.cat(f, c.compile(sub))
-			}
-		}
-		return f
-	case OpAlternate:
-		var f frag
-		for _, sub := range re.Sub {
-			f = c.alt(f, c.compile(sub))
-		}
-		return f
-	}
-	panic("regexp: unhandled case in compile")
-}
-
-func (c *compiler) inst(op InstOp) frag {
-	// TODO: impose length limit
-	f := frag{i: uint32(len(c.p.Inst))}
-	c.p.Inst = append(c.p.Inst, Inst{Op: op})
-	return f
-}
-
-func (c *compiler) nop() frag {
-	f := c.inst(InstNop)
-	f.out = patchList(f.i << 1)
-	return f
-}
-
-func (c *compiler) fail() frag {
-	return frag{}
-}
-
-func (c *compiler) cap(arg uint32) frag {
-	f := c.inst(InstCapture)
-	f.out = patchList(f.i << 1)
-	c.p.Inst[f.i].Arg = arg
-
-	if c.p.NumCap < int(arg)+1 {
-		c.p.NumCap = int(arg) + 1
-	}
-	return f
-}
-
-func (c *compiler) cat(f1, f2 frag) frag {
-	// concat of failure is failure
-	if f1.i == 0 || f2.i == 0 {
-		return frag{}
-	}
-
-	// TODO: elide nop
-
-	f1.out.patch(c.p, f2.i)
-	return frag{f1.i, f2.out}
-}
-
-func (c *compiler) alt(f1, f2 frag) frag {
-	// alt of failure is other
-	if f1.i == 0 {
-		return f2
-	}
-	if f2.i == 0 {
-		return f1
-	}
-
-	f := c.inst(InstAlt)
-	i := &c.p.Inst[f.i]
-	i.Out = f1.i
-	i.Arg = f2.i
-	f.out = f1.out.append(c.p, f2.out)
-	return f
-}
-
-func (c *compiler) quest(f1 frag, nongreedy bool) frag {
-	f := c.inst(InstAlt)
-	i := &c.p.Inst[f.i]
-	if nongreedy {
-		i.Arg = f1.i
-		f.out = patchList(f.i << 1)
-	} else {
-		i.Out = f1.i
-		f.out = patchList(f.i<<1 | 1)
-	}
-	f.out = f.out.append(c.p, f1.out)
-	return f
-}
-
-func (c *compiler) star(f1 frag, nongreedy bool) frag {
-	f := c.inst(InstAlt)
-	i := &c.p.Inst[f.i]
-	if nongreedy {
-		i.Arg = f1.i
-		f.out = patchList(f.i << 1)
-	} else {
-		i.Out = f1.i
-		f.out = patchList(f.i<<1 | 1)
-	}
-	f1.out.patch(c.p, f.i)
-	return f
-}
-
-func (c *compiler) plus(f1 frag, nongreedy bool) frag {
-	return frag{f1.i, c.star(f1, nongreedy).out}
-}
-
-func (c *compiler) empty(op EmptyOp) frag {
-	f := c.inst(InstEmptyWidth)
-	c.p.Inst[f.i].Arg = uint32(op)
-	f.out = patchList(f.i << 1)
-	return f
-}
-
-func (c *compiler) rune(r []rune, flags Flags) frag {
-	f := c.inst(InstRune)
-	i := &c.p.Inst[f.i]
-	i.Rune = r
-	flags &= FoldCase // only relevant flag is FoldCase
-	if len(r) != 1 || unicode.SimpleFold(r[0]) == r[0] {
-		// and sometimes not even that
-		flags &^= FoldCase
-	}
-	i.Arg = uint32(flags)
-	f.out = patchList(f.i << 1)
-
-	// Special cases for exec machine.
-	switch {
-	case flags&FoldCase == 0 && (len(r) == 1 || len(r) == 2 && r[0] == r[1]):
-		i.Op = InstRune1
-	case len(r) == 2 && r[0] == 0 && r[1] == unicode.MaxRune:
-		i.Op = InstRuneAny
-	case len(r) == 4 && r[0] == 0 && r[1] == '\n'-1 && r[2] == '\n'+1 && r[3] == unicode.MaxRune:
-		i.Op = InstRuneAnyNotNL
-	}
-
-	return f
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/syntax/doc.go b/third_party/gofrontend/libgo/go/regexp/syntax/doc.go
deleted file mode 100644
index e5e71f1..0000000
--- a/third_party/gofrontend/libgo/go/regexp/syntax/doc.go
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// DO NOT EDIT. This file is generated by mksyntaxgo from the RE2 distribution.
-
-/*
-Package syntax parses regular expressions into parse trees and compiles
-parse trees into programs. Most clients of regular expressions will use the
-facilities of package regexp (such as Compile and Match) instead of this package.
-
-Syntax
-
-The regular expression syntax understood by this package when parsing with the Perl flag is as follows.
-Parts of the syntax can be disabled by passing alternate flags to Parse.
-
-
-Single characters:
-  .              any character, possibly including newline (flag s=true)
-  [xyz]          character class
-  [^xyz]         negated character class
-  \d             Perl character class
-  \D             negated Perl character class
-  [[:alpha:]]    ASCII character class
-  [[:^alpha:]]   negated ASCII character class
-  \pN            Unicode character class (one-letter name)
-  \p{Greek}      Unicode character class
-  \PN            negated Unicode character class (one-letter name)
-  \P{Greek}      negated Unicode character class
-
-Composites:
-  xy             x followed by y
-  x|y            x or y (prefer x)
-
-Repetitions:
-  x*             zero or more x, prefer more
-  x+             one or more x, prefer more
-  x?             zero or one x, prefer one
-  x{n,m}         n or n+1 or ... or m x, prefer more
-  x{n,}          n or more x, prefer more
-  x{n}           exactly n x
-  x*?            zero or more x, prefer fewer
-  x+?            one or more x, prefer fewer
-  x??            zero or one x, prefer zero
-  x{n,m}?        n or n+1 or ... or m x, prefer fewer
-  x{n,}?         n or more x, prefer fewer
-  x{n}?          exactly n x
-
-Implementation restriction: The counting forms x{n,m}, x{n,}, and x{n}
-reject forms that create a minimum or maximum repetition count above 1000.
-Unlimited repetitions are not subject to this restriction.
-
-Grouping:
-  (re)           numbered capturing group (submatch)
-  (?P<name>re)   named & numbered capturing group (submatch)
-  (?:re)         non-capturing group
-  (?flags)       set flags within current group; non-capturing
-  (?flags:re)    set flags during re; non-capturing
-
-  Flag syntax is xyz (set) or -xyz (clear) or xy-z (set xy, clear z). The flags are:
-
-  i              case-insensitive (default false)
-  m              multi-line mode: ^ and $ match begin/end line in addition to begin/end text (default false)
-  s              let . match \n (default false)
-  U              ungreedy: swap meaning of x* and x*?, x+ and x+?, etc (default false)
-
-Empty strings:
-  ^              at beginning of text or line (flag m=true)
-  $              at end of text (like \z not \Z) or line (flag m=true)
-  \A             at beginning of text
-  \b             at ASCII word boundary (\w on one side and \W, \A, or \z on the other)
-  \B             not at ASCII word boundary
-  \z             at end of text
-
-Escape sequences:
-  \a             bell (== \007)
-  \f             form feed (== \014)
-  \t             horizontal tab (== \011)
-  \n             newline (== \012)
-  \r             carriage return (== \015)
-  \v             vertical tab character (== \013)
-  \*             literal *, for any punctuation character *
-  \123           octal character code (up to three digits)
-  \x7F           hex character code (exactly two digits)
-  \x{10FFFF}     hex character code
-  \Q...\E        literal text ... even if ... has punctuation
-
-Character class elements:
-  x              single character
-  A-Z            character range (inclusive)
-  \d             Perl character class
-  [:foo:]        ASCII character class foo
-  \p{Foo}        Unicode character class Foo
-  \pF            Unicode character class F (one-letter name)
-
-Named character classes as character class elements:
-  [\d]           digits (== \d)
-  [^\d]          not digits (== \D)
-  [\D]           not digits (== \D)
-  [^\D]          not not digits (== \d)
-  [[:name:]]     named ASCII class inside character class (== [:name:])
-  [^[:name:]]    named ASCII class inside negated character class (== [:^name:])
-  [\p{Name}]     named Unicode property inside character class (== \p{Name})
-  [^\p{Name}]    named Unicode property inside negated character class (== \P{Name})
-
-Perl character classes (all ASCII-only):
-  \d             digits (== [0-9])
-  \D             not digits (== [^0-9])
-  \s             whitespace (== [\t\n\f\r ])
-  \S             not whitespace (== [^\t\n\f\r ])
-  \w             word characters (== [0-9A-Za-z_])
-  \W             not word characters (== [^0-9A-Za-z_])
-
-ASCII character classes:
-  [[:alnum:]]    alphanumeric (== [0-9A-Za-z])
-  [[:alpha:]]    alphabetic (== [A-Za-z])
-  [[:ascii:]]    ASCII (== [\x00-\x7F])
-  [[:blank:]]    blank (== [\t ])
-  [[:cntrl:]]    control (== [\x00-\x1F\x7F])
-  [[:digit:]]    digits (== [0-9])
-  [[:graph:]]    graphical (== [!-~] == [A-Za-z0-9!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])
-  [[:lower:]]    lower case (== [a-z])
-  [[:print:]]    printable (== [ -~] == [ [:graph:]])
-  [[:punct:]]    punctuation (== [!-/:-@[-`{-~])
-  [[:space:]]    whitespace (== [\t\n\v\f\r ])
-  [[:upper:]]    upper case (== [A-Z])
-  [[:word:]]     word characters (== [0-9A-Za-z_])
-  [[:xdigit:]]   hex digit (== [0-9A-Fa-f])
-
-*/
-package syntax
diff --git a/third_party/gofrontend/libgo/go/regexp/syntax/parse.go b/third_party/gofrontend/libgo/go/regexp/syntax/parse.go
deleted file mode 100644
index d579a40..0000000
--- a/third_party/gofrontend/libgo/go/regexp/syntax/parse.go
+++ /dev/null
@@ -1,1902 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syntax
-
-import (
-	"sort"
-	"strings"
-	"unicode"
-	"unicode/utf8"
-)
-
-// An Error describes a failure to parse a regular expression
-// and gives the offending expression.
-type Error struct {
-	Code ErrorCode
-	Expr string
-}
-
-func (e *Error) Error() string {
-	return "error parsing regexp: " + e.Code.String() + ": `" + e.Expr + "`"
-}
-
-// An ErrorCode describes a failure to parse a regular expression.
-type ErrorCode string
-
-const (
-	// Unexpected error
-	ErrInternalError ErrorCode = "regexp/syntax: internal error"
-
-	// Parse errors
-	ErrInvalidCharClass      ErrorCode = "invalid character class"
-	ErrInvalidCharRange      ErrorCode = "invalid character class range"
-	ErrInvalidEscape         ErrorCode = "invalid escape sequence"
-	ErrInvalidNamedCapture   ErrorCode = "invalid named capture"
-	ErrInvalidPerlOp         ErrorCode = "invalid or unsupported Perl syntax"
-	ErrInvalidRepeatOp       ErrorCode = "invalid nested repetition operator"
-	ErrInvalidRepeatSize     ErrorCode = "invalid repeat count"
-	ErrInvalidUTF8           ErrorCode = "invalid UTF-8"
-	ErrMissingBracket        ErrorCode = "missing closing ]"
-	ErrMissingParen          ErrorCode = "missing closing )"
-	ErrMissingRepeatArgument ErrorCode = "missing argument to repetition operator"
-	ErrTrailingBackslash     ErrorCode = "trailing backslash at end of expression"
-	ErrUnexpectedParen       ErrorCode = "unexpected )"
-)
-
-func (e ErrorCode) String() string {
-	return string(e)
-}
-
-// Flags control the behavior of the parser and record information about regexp context.
-type Flags uint16
-
-const (
-	FoldCase      Flags = 1 << iota // case-insensitive match
-	Literal                         // treat pattern as literal string
-	ClassNL                         // allow character classes like [^a-z] and [[:space:]] to match newline
-	DotNL                           // allow . to match newline
-	OneLine                         // treat ^ and $ as only matching at beginning and end of text
-	NonGreedy                       // make repetition operators default to non-greedy
-	PerlX                           // allow Perl extensions
-	UnicodeGroups                   // allow \p{Han}, \P{Han} for Unicode group and negation
-	WasDollar                       // regexp OpEndText was $, not \z
-	Simple                          // regexp contains no counted repetition
-
-	MatchNL = ClassNL | DotNL
-
-	Perl        = ClassNL | OneLine | PerlX | UnicodeGroups // as close to Perl as possible
-	POSIX Flags = 0                                         // POSIX syntax
-)
-
-// Pseudo-ops for parsing stack.
-const (
-	opLeftParen = opPseudo + iota
-	opVerticalBar
-)
-
-type parser struct {
-	flags       Flags     // parse mode flags
-	stack       []*Regexp // stack of parsed expressions
-	free        *Regexp
-	numCap      int // number of capturing groups seen
-	wholeRegexp string
-	tmpClass    []rune // temporary char class work space
-}
-
-func (p *parser) newRegexp(op Op) *Regexp {
-	re := p.free
-	if re != nil {
-		p.free = re.Sub0[0]
-		*re = Regexp{}
-	} else {
-		re = new(Regexp)
-	}
-	re.Op = op
-	return re
-}
-
-func (p *parser) reuse(re *Regexp) {
-	re.Sub0[0] = p.free
-	p.free = re
-}
-
-// Parse stack manipulation.
-
-// push pushes the regexp re onto the parse stack and returns the regexp.
-func (p *parser) push(re *Regexp) *Regexp {
-	if re.Op == OpCharClass && len(re.Rune) == 2 && re.Rune[0] == re.Rune[1] {
-		// Single rune.
-		if p.maybeConcat(re.Rune[0], p.flags&^FoldCase) {
-			return nil
-		}
-		re.Op = OpLiteral
-		re.Rune = re.Rune[:1]
-		re.Flags = p.flags &^ FoldCase
-	} else if re.Op == OpCharClass && len(re.Rune) == 4 &&
-		re.Rune[0] == re.Rune[1] && re.Rune[2] == re.Rune[3] &&
-		unicode.SimpleFold(re.Rune[0]) == re.Rune[2] &&
-		unicode.SimpleFold(re.Rune[2]) == re.Rune[0] ||
-		re.Op == OpCharClass && len(re.Rune) == 2 &&
-			re.Rune[0]+1 == re.Rune[1] &&
-			unicode.SimpleFold(re.Rune[0]) == re.Rune[1] &&
-			unicode.SimpleFold(re.Rune[1]) == re.Rune[0] {
-		// Case-insensitive rune like [Aa] or [Δδ].
-		if p.maybeConcat(re.Rune[0], p.flags|FoldCase) {
-			return nil
-		}
-
-		// Rewrite as (case-insensitive) literal.
-		re.Op = OpLiteral
-		re.Rune = re.Rune[:1]
-		re.Flags = p.flags | FoldCase
-	} else {
-		// Incremental concatenation.
-		p.maybeConcat(-1, 0)
-	}
-
-	p.stack = append(p.stack, re)
-	return re
-}
-
-// maybeConcat implements incremental concatenation
-// of literal runes into string nodes.  The parser calls this
-// before each push, so only the top fragment of the stack
-// might need processing.  Since this is called before a push,
-// the topmost literal is no longer subject to operators like *
-// (Otherwise ab* would turn into (ab)*.)
-// If r >= 0 and there's a node left over, maybeConcat uses it
-// to push r with the given flags.
-// maybeConcat reports whether r was pushed.
-func (p *parser) maybeConcat(r rune, flags Flags) bool {
-	n := len(p.stack)
-	if n < 2 {
-		return false
-	}
-
-	re1 := p.stack[n-1]
-	re2 := p.stack[n-2]
-	if re1.Op != OpLiteral || re2.Op != OpLiteral || re1.Flags&FoldCase != re2.Flags&FoldCase {
-		return false
-	}
-
-	// Push re1 into re2.
-	re2.Rune = append(re2.Rune, re1.Rune...)
-
-	// Reuse re1 if possible.
-	if r >= 0 {
-		re1.Rune = re1.Rune0[:1]
-		re1.Rune[0] = r
-		re1.Flags = flags
-		return true
-	}
-
-	p.stack = p.stack[:n-1]
-	p.reuse(re1)
-	return false // did not push r
-}
-
-// newLiteral returns a new OpLiteral Regexp with the given flags
-func (p *parser) newLiteral(r rune, flags Flags) *Regexp {
-	re := p.newRegexp(OpLiteral)
-	re.Flags = flags
-	if flags&FoldCase != 0 {
-		r = minFoldRune(r)
-	}
-	re.Rune0[0] = r
-	re.Rune = re.Rune0[:1]
-	return re
-}
-
-// minFoldRune returns the minimum rune fold-equivalent to r.
-func minFoldRune(r rune) rune {
-	if r < minFold || r > maxFold {
-		return r
-	}
-	min := r
-	r0 := r
-	for r = unicode.SimpleFold(r); r != r0; r = unicode.SimpleFold(r) {
-		if min > r {
-			min = r
-		}
-	}
-	return min
-}
-
-// literal pushes a literal regexp for the rune r on the stack
-// and returns that regexp.
-func (p *parser) literal(r rune) {
-	p.push(p.newLiteral(r, p.flags))
-}
-
-// op pushes a regexp with the given op onto the stack
-// and returns that regexp.
-func (p *parser) op(op Op) *Regexp {
-	re := p.newRegexp(op)
-	re.Flags = p.flags
-	return p.push(re)
-}
-
-// repeat replaces the top stack element with itself repeated according to op, min, max.
-// before is the regexp suffix starting at the repetition operator.
-// after is the regexp suffix following after the repetition operator.
-// repeat returns an updated 'after' and an error, if any.
-func (p *parser) repeat(op Op, min, max int, before, after, lastRepeat string) (string, error) {
-	flags := p.flags
-	if p.flags&PerlX != 0 {
-		if len(after) > 0 && after[0] == '?' {
-			after = after[1:]
-			flags ^= NonGreedy
-		}
-		if lastRepeat != "" {
-			// In Perl it is not allowed to stack repetition operators:
-			// a** is a syntax error, not a doubled star, and a++ means
-			// something else entirely, which we don't support!
-			return "", &Error{ErrInvalidRepeatOp, lastRepeat[:len(lastRepeat)-len(after)]}
-		}
-	}
-	n := len(p.stack)
-	if n == 0 {
-		return "", &Error{ErrMissingRepeatArgument, before[:len(before)-len(after)]}
-	}
-	sub := p.stack[n-1]
-	if sub.Op >= opPseudo {
-		return "", &Error{ErrMissingRepeatArgument, before[:len(before)-len(after)]}
-	}
-
-	re := p.newRegexp(op)
-	re.Min = min
-	re.Max = max
-	re.Flags = flags
-	re.Sub = re.Sub0[:1]
-	re.Sub[0] = sub
-	p.stack[n-1] = re
-
-	if op == OpRepeat && (min >= 2 || max >= 2) && !repeatIsValid(re, 1000) {
-		return "", &Error{ErrInvalidRepeatSize, before[:len(before)-len(after)]}
-	}
-
-	return after, nil
-}
-
-// repeatIsValid reports whether the repetition re is valid.
-// Valid means that the combination of the top-level repetition
-// and any inner repetitions does not exceed n copies of the
-// innermost thing.
-// This function rewalks the regexp tree and is called for every repetition,
-// so we have to worry about inducing quadratic behavior in the parser.
-// We avoid this by only calling repeatIsValid when min or max >= 2.
-// In that case the depth of any >= 2 nesting can only get to 9 without
-// triggering a parse error, so each subtree can only be rewalked 9 times.
-func repeatIsValid(re *Regexp, n int) bool {
-	if re.Op == OpRepeat {
-		m := re.Max
-		if m == 0 {
-			return true
-		}
-		if m < 0 {
-			m = re.Min
-		}
-		if m > n {
-			return false
-		}
-		if m > 0 {
-			n /= m
-		}
-	}
-	for _, sub := range re.Sub {
-		if !repeatIsValid(sub, n) {
-			return false
-		}
-	}
-	return true
-}
-
-// concat replaces the top of the stack (above the topmost '|' or '(') with its concatenation.
-func (p *parser) concat() *Regexp {
-	p.maybeConcat(-1, 0)
-
-	// Scan down to find pseudo-operator | or (.
-	i := len(p.stack)
-	for i > 0 && p.stack[i-1].Op < opPseudo {
-		i--
-	}
-	subs := p.stack[i:]
-	p.stack = p.stack[:i]
-
-	// Empty concatenation is special case.
-	if len(subs) == 0 {
-		return p.push(p.newRegexp(OpEmptyMatch))
-	}
-
-	return p.push(p.collapse(subs, OpConcat))
-}
-
-// alternate replaces the top of the stack (above the topmost '(') with its alternation.
-func (p *parser) alternate() *Regexp {
-	// Scan down to find pseudo-operator (.
-	// There are no | above (.
-	i := len(p.stack)
-	for i > 0 && p.stack[i-1].Op < opPseudo {
-		i--
-	}
-	subs := p.stack[i:]
-	p.stack = p.stack[:i]
-
-	// Make sure top class is clean.
-	// All the others already are (see swapVerticalBar).
-	if len(subs) > 0 {
-		cleanAlt(subs[len(subs)-1])
-	}
-
-	// Empty alternate is special case
-	// (shouldn't happen but easy to handle).
-	if len(subs) == 0 {
-		return p.push(p.newRegexp(OpNoMatch))
-	}
-
-	return p.push(p.collapse(subs, OpAlternate))
-}
-
-// cleanAlt cleans re for eventual inclusion in an alternation.
-func cleanAlt(re *Regexp) {
-	switch re.Op {
-	case OpCharClass:
-		re.Rune = cleanClass(&re.Rune)
-		if len(re.Rune) == 2 && re.Rune[0] == 0 && re.Rune[1] == unicode.MaxRune {
-			re.Rune = nil
-			re.Op = OpAnyChar
-			return
-		}
-		if len(re.Rune) == 4 && re.Rune[0] == 0 && re.Rune[1] == '\n'-1 && re.Rune[2] == '\n'+1 && re.Rune[3] == unicode.MaxRune {
-			re.Rune = nil
-			re.Op = OpAnyCharNotNL
-			return
-		}
-		if cap(re.Rune)-len(re.Rune) > 100 {
-			// re.Rune will not grow any more.
-			// Make a copy or inline to reclaim storage.
-			re.Rune = append(re.Rune0[:0], re.Rune...)
-		}
-	}
-}
-
-// collapse returns the result of applying op to sub.
-// If sub contains op nodes, they all get hoisted up
-// so that there is never a concat of a concat or an
-// alternate of an alternate.
-func (p *parser) collapse(subs []*Regexp, op Op) *Regexp {
-	if len(subs) == 1 {
-		return subs[0]
-	}
-	re := p.newRegexp(op)
-	re.Sub = re.Sub0[:0]
-	for _, sub := range subs {
-		if sub.Op == op {
-			re.Sub = append(re.Sub, sub.Sub...)
-			p.reuse(sub)
-		} else {
-			re.Sub = append(re.Sub, sub)
-		}
-	}
-	if op == OpAlternate {
-		re.Sub = p.factor(re.Sub, re.Flags)
-		if len(re.Sub) == 1 {
-			old := re
-			re = re.Sub[0]
-			p.reuse(old)
-		}
-	}
-	return re
-}
-
-// factor factors common prefixes from the alternation list sub.
-// It returns a replacement list that reuses the same storage and
-// frees (passes to p.reuse) any removed *Regexps.
-//
-// For example,
-//     ABC|ABD|AEF|BCX|BCY
-// simplifies by literal prefix extraction to
-//     A(B(C|D)|EF)|BC(X|Y)
-// which simplifies by character class introduction to
-//     A(B[CD]|EF)|BC[XY]
-//
-func (p *parser) factor(sub []*Regexp, flags Flags) []*Regexp {
-	if len(sub) < 2 {
-		return sub
-	}
-
-	// Round 1: Factor out common literal prefixes.
-	var str []rune
-	var strflags Flags
-	start := 0
-	out := sub[:0]
-	for i := 0; i <= len(sub); i++ {
-		// Invariant: the Regexps that were in sub[0:start] have been
-		// used or marked for reuse, and the slice space has been reused
-		// for out (len(out) <= start).
-		//
-		// Invariant: sub[start:i] consists of regexps that all begin
-		// with str as modified by strflags.
-		var istr []rune
-		var iflags Flags
-		if i < len(sub) {
-			istr, iflags = p.leadingString(sub[i])
-			if iflags == strflags {
-				same := 0
-				for same < len(str) && same < len(istr) && str[same] == istr[same] {
-					same++
-				}
-				if same > 0 {
-					// Matches at least one rune in current range.
-					// Keep going around.
-					str = str[:same]
-					continue
-				}
-			}
-		}
-
-		// Found end of a run with common leading literal string:
-		// sub[start:i] all begin with str[0:len(str)], but sub[i]
-		// does not even begin with str[0].
-		//
-		// Factor out common string and append factored expression to out.
-		if i == start {
-			// Nothing to do - run of length 0.
-		} else if i == start+1 {
-			// Just one: don't bother factoring.
-			out = append(out, sub[start])
-		} else {
-			// Construct factored form: prefix(suffix1|suffix2|...)
-			prefix := p.newRegexp(OpLiteral)
-			prefix.Flags = strflags
-			prefix.Rune = append(prefix.Rune[:0], str...)
-
-			for j := start; j < i; j++ {
-				sub[j] = p.removeLeadingString(sub[j], len(str))
-			}
-			suffix := p.collapse(sub[start:i], OpAlternate) // recurse
-
-			re := p.newRegexp(OpConcat)
-			re.Sub = append(re.Sub[:0], prefix, suffix)
-			out = append(out, re)
-		}
-
-		// Prepare for next iteration.
-		start = i
-		str = istr
-		strflags = iflags
-	}
-	sub = out
-
-	// Round 2: Factor out common complex prefixes,
-	// just the first piece of each concatenation,
-	// whatever it is.  This is good enough a lot of the time.
-	start = 0
-	out = sub[:0]
-	var first *Regexp
-	for i := 0; i <= len(sub); i++ {
-		// Invariant: the Regexps that were in sub[0:start] have been
-		// used or marked for reuse, and the slice space has been reused
-		// for out (len(out) <= start).
-		//
-		// Invariant: sub[start:i] consists of regexps that all begin with ifirst.
-		var ifirst *Regexp
-		if i < len(sub) {
-			ifirst = p.leadingRegexp(sub[i])
-			if first != nil && first.Equal(ifirst) {
-				continue
-			}
-		}
-
-		// Found end of a run with common leading regexp:
-		// sub[start:i] all begin with first but sub[i] does not.
-		//
-		// Factor out common regexp and append factored expression to out.
-		if i == start {
-			// Nothing to do - run of length 0.
-		} else if i == start+1 {
-			// Just one: don't bother factoring.
-			out = append(out, sub[start])
-		} else {
-			// Construct factored form: prefix(suffix1|suffix2|...)
-			prefix := first
-			for j := start; j < i; j++ {
-				reuse := j != start // prefix came from sub[start]
-				sub[j] = p.removeLeadingRegexp(sub[j], reuse)
-			}
-			suffix := p.collapse(sub[start:i], OpAlternate) // recurse
-
-			re := p.newRegexp(OpConcat)
-			re.Sub = append(re.Sub[:0], prefix, suffix)
-			out = append(out, re)
-		}
-
-		// Prepare for next iteration.
-		start = i
-		first = ifirst
-	}
-	sub = out
-
-	// Round 3: Collapse runs of single literals into character classes.
-	start = 0
-	out = sub[:0]
-	for i := 0; i <= len(sub); i++ {
-		// Invariant: the Regexps that were in sub[0:start] have been
-		// used or marked for reuse, and the slice space has been reused
-		// for out (len(out) <= start).
-		//
-		// Invariant: sub[start:i] consists of regexps that are either
-		// literal runes or character classes.
-		if i < len(sub) && isCharClass(sub[i]) {
-			continue
-		}
-
-		// sub[i] is not a char or char class;
-		// emit char class for sub[start:i]...
-		if i == start {
-			// Nothing to do - run of length 0.
-		} else if i == start+1 {
-			out = append(out, sub[start])
-		} else {
-			// Make new char class.
-			// Start with most complex regexp in sub[start].
-			max := start
-			for j := start + 1; j < i; j++ {
-				if sub[max].Op < sub[j].Op || sub[max].Op == sub[j].Op && len(sub[max].Rune) < len(sub[j].Rune) {
-					max = j
-				}
-			}
-			sub[start], sub[max] = sub[max], sub[start]
-
-			for j := start + 1; j < i; j++ {
-				mergeCharClass(sub[start], sub[j])
-				p.reuse(sub[j])
-			}
-			cleanAlt(sub[start])
-			out = append(out, sub[start])
-		}
-
-		// ... and then emit sub[i].
-		if i < len(sub) {
-			out = append(out, sub[i])
-		}
-		start = i + 1
-	}
-	sub = out
-
-	// Round 4: Collapse runs of empty matches into a single empty match.
-	start = 0
-	out = sub[:0]
-	for i := range sub {
-		if i+1 < len(sub) && sub[i].Op == OpEmptyMatch && sub[i+1].Op == OpEmptyMatch {
-			continue
-		}
-		out = append(out, sub[i])
-	}
-	sub = out
-
-	return sub
-}
-
-// leadingString returns the leading literal string that re begins with.
-// The string refers to storage in re or its children.
-func (p *parser) leadingString(re *Regexp) ([]rune, Flags) {
-	if re.Op == OpConcat && len(re.Sub) > 0 {
-		re = re.Sub[0]
-	}
-	if re.Op != OpLiteral {
-		return nil, 0
-	}
-	return re.Rune, re.Flags & FoldCase
-}
-
-// removeLeadingString removes the first n leading runes
-// from the beginning of re.  It returns the replacement for re.
-func (p *parser) removeLeadingString(re *Regexp, n int) *Regexp {
-	if re.Op == OpConcat && len(re.Sub) > 0 {
-		// Removing a leading string in a concatenation
-		// might simplify the concatenation.
-		sub := re.Sub[0]
-		sub = p.removeLeadingString(sub, n)
-		re.Sub[0] = sub
-		if sub.Op == OpEmptyMatch {
-			p.reuse(sub)
-			switch len(re.Sub) {
-			case 0, 1:
-				// Impossible but handle.
-				re.Op = OpEmptyMatch
-				re.Sub = nil
-			case 2:
-				old := re
-				re = re.Sub[1]
-				p.reuse(old)
-			default:
-				copy(re.Sub, re.Sub[1:])
-				re.Sub = re.Sub[:len(re.Sub)-1]
-			}
-		}
-		return re
-	}
-
-	if re.Op == OpLiteral {
-		re.Rune = re.Rune[:copy(re.Rune, re.Rune[n:])]
-		if len(re.Rune) == 0 {
-			re.Op = OpEmptyMatch
-		}
-	}
-	return re
-}
-
-// leadingRegexp returns the leading regexp that re begins with.
-// The regexp refers to storage in re or its children.
-func (p *parser) leadingRegexp(re *Regexp) *Regexp {
-	if re.Op == OpEmptyMatch {
-		return nil
-	}
-	if re.Op == OpConcat && len(re.Sub) > 0 {
-		sub := re.Sub[0]
-		if sub.Op == OpEmptyMatch {
-			return nil
-		}
-		return sub
-	}
-	return re
-}
-
-// removeLeadingRegexp removes the leading regexp in re.
-// It returns the replacement for re.
-// If reuse is true, it passes the removed regexp (if no longer needed) to p.reuse.
-func (p *parser) removeLeadingRegexp(re *Regexp, reuse bool) *Regexp {
-	if re.Op == OpConcat && len(re.Sub) > 0 {
-		if reuse {
-			p.reuse(re.Sub[0])
-		}
-		re.Sub = re.Sub[:copy(re.Sub, re.Sub[1:])]
-		switch len(re.Sub) {
-		case 0:
-			re.Op = OpEmptyMatch
-			re.Sub = nil
-		case 1:
-			old := re
-			re = re.Sub[0]
-			p.reuse(old)
-		}
-		return re
-	}
-	if reuse {
-		p.reuse(re)
-	}
-	return p.newRegexp(OpEmptyMatch)
-}
-
-func literalRegexp(s string, flags Flags) *Regexp {
-	re := &Regexp{Op: OpLiteral}
-	re.Flags = flags
-	re.Rune = re.Rune0[:0] // use local storage for small strings
-	for _, c := range s {
-		if len(re.Rune) >= cap(re.Rune) {
-			// string is too long to fit in Rune0.  let Go handle it
-			re.Rune = []rune(s)
-			break
-		}
-		re.Rune = append(re.Rune, c)
-	}
-	return re
-}
-
-// Parsing.
-
-// Parse parses a regular expression string s, controlled by the specified
-// Flags, and returns a regular expression parse tree. The syntax is
-// described in the top-level comment.
-func Parse(s string, flags Flags) (*Regexp, error) {
-	if flags&Literal != 0 {
-		// Trivial parser for literal string.
-		if err := checkUTF8(s); err != nil {
-			return nil, err
-		}
-		return literalRegexp(s, flags), nil
-	}
-
-	// Otherwise, must do real work.
-	var (
-		p          parser
-		err        error
-		c          rune
-		op         Op
-		lastRepeat string
-	)
-	p.flags = flags
-	p.wholeRegexp = s
-	t := s
-	for t != "" {
-		repeat := ""
-	BigSwitch:
-		switch t[0] {
-		default:
-			if c, t, err = nextRune(t); err != nil {
-				return nil, err
-			}
-			p.literal(c)
-
-		case '(':
-			if p.flags&PerlX != 0 && len(t) >= 2 && t[1] == '?' {
-				// Flag changes and non-capturing groups.
-				if t, err = p.parsePerlFlags(t); err != nil {
-					return nil, err
-				}
-				break
-			}
-			p.numCap++
-			p.op(opLeftParen).Cap = p.numCap
-			t = t[1:]
-		case '|':
-			if err = p.parseVerticalBar(); err != nil {
-				return nil, err
-			}
-			t = t[1:]
-		case ')':
-			if err = p.parseRightParen(); err != nil {
-				return nil, err
-			}
-			t = t[1:]
-		case '^':
-			if p.flags&OneLine != 0 {
-				p.op(OpBeginText)
-			} else {
-				p.op(OpBeginLine)
-			}
-			t = t[1:]
-		case '$':
-			if p.flags&OneLine != 0 {
-				p.op(OpEndText).Flags |= WasDollar
-			} else {
-				p.op(OpEndLine)
-			}
-			t = t[1:]
-		case '.':
-			if p.flags&DotNL != 0 {
-				p.op(OpAnyChar)
-			} else {
-				p.op(OpAnyCharNotNL)
-			}
-			t = t[1:]
-		case '[':
-			if t, err = p.parseClass(t); err != nil {
-				return nil, err
-			}
-		case '*', '+', '?':
-			before := t
-			switch t[0] {
-			case '*':
-				op = OpStar
-			case '+':
-				op = OpPlus
-			case '?':
-				op = OpQuest
-			}
-			after := t[1:]
-			if after, err = p.repeat(op, 0, 0, before, after, lastRepeat); err != nil {
-				return nil, err
-			}
-			repeat = before
-			t = after
-		case '{':
-			op = OpRepeat
-			before := t
-			min, max, after, ok := p.parseRepeat(t)
-			if !ok {
-				// If the repeat cannot be parsed, { is a literal.
-				p.literal('{')
-				t = t[1:]
-				break
-			}
-			if min < 0 || min > 1000 || max > 1000 || max >= 0 && min > max {
-				// Numbers were too big, or max is present and min > max.
-				return nil, &Error{ErrInvalidRepeatSize, before[:len(before)-len(after)]}
-			}
-			if after, err = p.repeat(op, min, max, before, after, lastRepeat); err != nil {
-				return nil, err
-			}
-			repeat = before
-			t = after
-		case '\\':
-			if p.flags&PerlX != 0 && len(t) >= 2 {
-				switch t[1] {
-				case 'A':
-					p.op(OpBeginText)
-					t = t[2:]
-					break BigSwitch
-				case 'b':
-					p.op(OpWordBoundary)
-					t = t[2:]
-					break BigSwitch
-				case 'B':
-					p.op(OpNoWordBoundary)
-					t = t[2:]
-					break BigSwitch
-				case 'C':
-					// any byte; not supported
-					return nil, &Error{ErrInvalidEscape, t[:2]}
-				case 'Q':
-					// \Q ... \E: the ... is always literals
-					var lit string
-					if i := strings.Index(t, `\E`); i < 0 {
-						lit = t[2:]
-						t = ""
-					} else {
-						lit = t[2:i]
-						t = t[i+2:]
-					}
-					p.push(literalRegexp(lit, p.flags))
-					break BigSwitch
-				case 'z':
-					p.op(OpEndText)
-					t = t[2:]
-					break BigSwitch
-				}
-			}
-
-			re := p.newRegexp(OpCharClass)
-			re.Flags = p.flags
-
-			// Look for Unicode character group like \p{Han}
-			if len(t) >= 2 && (t[1] == 'p' || t[1] == 'P') {
-				r, rest, err := p.parseUnicodeClass(t, re.Rune0[:0])
-				if err != nil {
-					return nil, err
-				}
-				if r != nil {
-					re.Rune = r
-					t = rest
-					p.push(re)
-					break BigSwitch
-				}
-			}
-
-			// Perl character class escape.
-			if r, rest := p.parsePerlClassEscape(t, re.Rune0[:0]); r != nil {
-				re.Rune = r
-				t = rest
-				p.push(re)
-				break BigSwitch
-			}
-			p.reuse(re)
-
-			// Ordinary single-character escape.
-			if c, t, err = p.parseEscape(t); err != nil {
-				return nil, err
-			}
-			p.literal(c)
-		}
-		lastRepeat = repeat
-	}
-
-	p.concat()
-	if p.swapVerticalBar() {
-		// pop vertical bar
-		p.stack = p.stack[:len(p.stack)-1]
-	}
-	p.alternate()
-
-	n := len(p.stack)
-	if n != 1 {
-		return nil, &Error{ErrMissingParen, s}
-	}
-	return p.stack[0], nil
-}
-
-// parseRepeat parses {min} (max=min) or {min,} (max=-1) or {min,max}.
-// If s is not of that form, it returns ok == false.
-// If s has the right form but the values are too big, it returns min == -1, ok == true.
-func (p *parser) parseRepeat(s string) (min, max int, rest string, ok bool) {
-	if s == "" || s[0] != '{' {
-		return
-	}
-	s = s[1:]
-	var ok1 bool
-	if min, s, ok1 = p.parseInt(s); !ok1 {
-		return
-	}
-	if s == "" {
-		return
-	}
-	if s[0] != ',' {
-		max = min
-	} else {
-		s = s[1:]
-		if s == "" {
-			return
-		}
-		if s[0] == '}' {
-			max = -1
-		} else if max, s, ok1 = p.parseInt(s); !ok1 {
-			return
-		} else if max < 0 {
-			// parseInt found too big a number
-			min = -1
-		}
-	}
-	if s == "" || s[0] != '}' {
-		return
-	}
-	rest = s[1:]
-	ok = true
-	return
-}
-
-// parsePerlFlags parses a Perl flag setting or non-capturing group or both,
-// like (?i) or (?: or (?i:.  It removes the prefix from s and updates the parse state.
-// The caller must have ensured that s begins with "(?".
-func (p *parser) parsePerlFlags(s string) (rest string, err error) {
-	t := s
-
-	// Check for named captures, first introduced in Python's regexp library.
-	// As usual, there are three slightly different syntaxes:
-	//
-	//   (?P<name>expr)   the original, introduced by Python
-	//   (?<name>expr)    the .NET alteration, adopted by Perl 5.10
-	//   (?'name'expr)    another .NET alteration, adopted by Perl 5.10
-	//
-	// Perl 5.10 gave in and implemented the Python version too,
-	// but they claim that the last two are the preferred forms.
-	// PCRE and languages based on it (specifically, PHP and Ruby)
-	// support all three as well.  EcmaScript 4 uses only the Python form.
-	//
-	// In both the open source world (via Code Search) and the
-	// Google source tree, (?P<expr>name) is the dominant form,
-	// so that's the one we implement.  One is enough.
-	if len(t) > 4 && t[2] == 'P' && t[3] == '<' {
-		// Pull out name.
-		end := strings.IndexRune(t, '>')
-		if end < 0 {
-			if err = checkUTF8(t); err != nil {
-				return "", err
-			}
-			return "", &Error{ErrInvalidNamedCapture, s}
-		}
-
-		capture := t[:end+1] // "(?P<name>"
-		name := t[4:end]     // "name"
-		if err = checkUTF8(name); err != nil {
-			return "", err
-		}
-		if !isValidCaptureName(name) {
-			return "", &Error{ErrInvalidNamedCapture, capture}
-		}
-
-		// Like ordinary capture, but named.
-		p.numCap++
-		re := p.op(opLeftParen)
-		re.Cap = p.numCap
-		re.Name = name
-		return t[end+1:], nil
-	}
-
-	// Non-capturing group.  Might also twiddle Perl flags.
-	var c rune
-	t = t[2:] // skip (?
-	flags := p.flags
-	sign := +1
-	sawFlag := false
-Loop:
-	for t != "" {
-		if c, t, err = nextRune(t); err != nil {
-			return "", err
-		}
-		switch c {
-		default:
-			break Loop
-
-		// Flags.
-		case 'i':
-			flags |= FoldCase
-			sawFlag = true
-		case 'm':
-			flags &^= OneLine
-			sawFlag = true
-		case 's':
-			flags |= DotNL
-			sawFlag = true
-		case 'U':
-			flags |= NonGreedy
-			sawFlag = true
-
-		// Switch to negation.
-		case '-':
-			if sign < 0 {
-				break Loop
-			}
-			sign = -1
-			// Invert flags so that | above turn into &^ and vice versa.
-			// We'll invert flags again before using it below.
-			flags = ^flags
-			sawFlag = false
-
-		// End of flags, starting group or not.
-		case ':', ')':
-			if sign < 0 {
-				if !sawFlag {
-					break Loop
-				}
-				flags = ^flags
-			}
-			if c == ':' {
-				// Open new group
-				p.op(opLeftParen)
-			}
-			p.flags = flags
-			return t, nil
-		}
-	}
-
-	return "", &Error{ErrInvalidPerlOp, s[:len(s)-len(t)]}
-}
-
-// isValidCaptureName reports whether name
-// is a valid capture name: [A-Za-z0-9_]+.
-// PCRE limits names to 32 bytes.
-// Python rejects names starting with digits.
-// We don't enforce either of those.
-func isValidCaptureName(name string) bool {
-	if name == "" {
-		return false
-	}
-	for _, c := range name {
-		if c != '_' && !isalnum(c) {
-			return false
-		}
-	}
-	return true
-}
-
-// parseInt parses a decimal integer.
-func (p *parser) parseInt(s string) (n int, rest string, ok bool) {
-	if s == "" || s[0] < '0' || '9' < s[0] {
-		return
-	}
-	// Disallow leading zeros.
-	if len(s) >= 2 && s[0] == '0' && '0' <= s[1] && s[1] <= '9' {
-		return
-	}
-	t := s
-	for s != "" && '0' <= s[0] && s[0] <= '9' {
-		s = s[1:]
-	}
-	rest = s
-	ok = true
-	// Have digits, compute value.
-	t = t[:len(t)-len(s)]
-	for i := 0; i < len(t); i++ {
-		// Avoid overflow.
-		if n >= 1e8 {
-			n = -1
-			break
-		}
-		n = n*10 + int(t[i]) - '0'
-	}
-	return
-}
-
-// can this be represented as a character class?
-// single-rune literal string, char class, ., and .|\n.
-func isCharClass(re *Regexp) bool {
-	return re.Op == OpLiteral && len(re.Rune) == 1 ||
-		re.Op == OpCharClass ||
-		re.Op == OpAnyCharNotNL ||
-		re.Op == OpAnyChar
-}
-
-// does re match r?
-func matchRune(re *Regexp, r rune) bool {
-	switch re.Op {
-	case OpLiteral:
-		return len(re.Rune) == 1 && re.Rune[0] == r
-	case OpCharClass:
-		for i := 0; i < len(re.Rune); i += 2 {
-			if re.Rune[i] <= r && r <= re.Rune[i+1] {
-				return true
-			}
-		}
-		return false
-	case OpAnyCharNotNL:
-		return r != '\n'
-	case OpAnyChar:
-		return true
-	}
-	return false
-}
-
-// parseVerticalBar handles a | in the input.
-func (p *parser) parseVerticalBar() error {
-	p.concat()
-
-	// The concatenation we just parsed is on top of the stack.
-	// If it sits above an opVerticalBar, swap it below
-	// (things below an opVerticalBar become an alternation).
-	// Otherwise, push a new vertical bar.
-	if !p.swapVerticalBar() {
-		p.op(opVerticalBar)
-	}
-
-	return nil
-}
-
-// mergeCharClass makes dst = dst|src.
-// The caller must ensure that dst.Op >= src.Op,
-// to reduce the amount of copying.
-func mergeCharClass(dst, src *Regexp) {
-	switch dst.Op {
-	case OpAnyChar:
-		// src doesn't add anything.
-	case OpAnyCharNotNL:
-		// src might add \n
-		if matchRune(src, '\n') {
-			dst.Op = OpAnyChar
-		}
-	case OpCharClass:
-		// src is simpler, so either literal or char class
-		if src.Op == OpLiteral {
-			dst.Rune = appendLiteral(dst.Rune, src.Rune[0], src.Flags)
-		} else {
-			dst.Rune = appendClass(dst.Rune, src.Rune)
-		}
-	case OpLiteral:
-		// both literal
-		if src.Rune[0] == dst.Rune[0] && src.Flags == dst.Flags {
-			break
-		}
-		dst.Op = OpCharClass
-		dst.Rune = appendLiteral(dst.Rune[:0], dst.Rune[0], dst.Flags)
-		dst.Rune = appendLiteral(dst.Rune, src.Rune[0], src.Flags)
-	}
-}
-
-// If the top of the stack is an element followed by an opVerticalBar
-// swapVerticalBar swaps the two and returns true.
-// Otherwise it returns false.
-func (p *parser) swapVerticalBar() bool {
-	// If above and below vertical bar are literal or char class,
-	// can merge into a single char class.
-	n := len(p.stack)
-	if n >= 3 && p.stack[n-2].Op == opVerticalBar && isCharClass(p.stack[n-1]) && isCharClass(p.stack[n-3]) {
-		re1 := p.stack[n-1]
-		re3 := p.stack[n-3]
-		// Make re3 the more complex of the two.
-		if re1.Op > re3.Op {
-			re1, re3 = re3, re1
-			p.stack[n-3] = re3
-		}
-		mergeCharClass(re3, re1)
-		p.reuse(re1)
-		p.stack = p.stack[:n-1]
-		return true
-	}
-
-	if n >= 2 {
-		re1 := p.stack[n-1]
-		re2 := p.stack[n-2]
-		if re2.Op == opVerticalBar {
-			if n >= 3 {
-				// Now out of reach.
-				// Clean opportunistically.
-				cleanAlt(p.stack[n-3])
-			}
-			p.stack[n-2] = re1
-			p.stack[n-1] = re2
-			return true
-		}
-	}
-	return false
-}
-
-// parseRightParen handles a ) in the input.
-func (p *parser) parseRightParen() error {
-	p.concat()
-	if p.swapVerticalBar() {
-		// pop vertical bar
-		p.stack = p.stack[:len(p.stack)-1]
-	}
-	p.alternate()
-
-	n := len(p.stack)
-	if n < 2 {
-		return &Error{ErrUnexpectedParen, p.wholeRegexp}
-	}
-	re1 := p.stack[n-1]
-	re2 := p.stack[n-2]
-	p.stack = p.stack[:n-2]
-	if re2.Op != opLeftParen {
-		return &Error{ErrUnexpectedParen, p.wholeRegexp}
-	}
-	// Restore flags at time of paren.
-	p.flags = re2.Flags
-	if re2.Cap == 0 {
-		// Just for grouping.
-		p.push(re1)
-	} else {
-		re2.Op = OpCapture
-		re2.Sub = re2.Sub0[:1]
-		re2.Sub[0] = re1
-		p.push(re2)
-	}
-	return nil
-}
-
-// parseEscape parses an escape sequence at the beginning of s
-// and returns the rune.
-func (p *parser) parseEscape(s string) (r rune, rest string, err error) {
-	t := s[1:]
-	if t == "" {
-		return 0, "", &Error{ErrTrailingBackslash, ""}
-	}
-	c, t, err := nextRune(t)
-	if err != nil {
-		return 0, "", err
-	}
-
-Switch:
-	switch c {
-	default:
-		if c < utf8.RuneSelf && !isalnum(c) {
-			// Escaped non-word characters are always themselves.
-			// PCRE is not quite so rigorous: it accepts things like
-			// \q, but we don't.  We once rejected \_, but too many
-			// programs and people insist on using it, so allow \_.
-			return c, t, nil
-		}
-
-	// Octal escapes.
-	case '1', '2', '3', '4', '5', '6', '7':
-		// Single non-zero digit is a backreference; not supported
-		if t == "" || t[0] < '0' || t[0] > '7' {
-			break
-		}
-		fallthrough
-	case '0':
-		// Consume up to three octal digits; already have one.
-		r = c - '0'
-		for i := 1; i < 3; i++ {
-			if t == "" || t[0] < '0' || t[0] > '7' {
-				break
-			}
-			r = r*8 + rune(t[0]) - '0'
-			t = t[1:]
-		}
-		return r, t, nil
-
-	// Hexadecimal escapes.
-	case 'x':
-		if t == "" {
-			break
-		}
-		if c, t, err = nextRune(t); err != nil {
-			return 0, "", err
-		}
-		if c == '{' {
-			// Any number of digits in braces.
-			// Perl accepts any text at all; it ignores all text
-			// after the first non-hex digit.  We require only hex digits,
-			// and at least one.
-			nhex := 0
-			r = 0
-			for {
-				if t == "" {
-					break Switch
-				}
-				if c, t, err = nextRune(t); err != nil {
-					return 0, "", err
-				}
-				if c == '}' {
-					break
-				}
-				v := unhex(c)
-				if v < 0 {
-					break Switch
-				}
-				r = r*16 + v
-				if r > unicode.MaxRune {
-					break Switch
-				}
-				nhex++
-			}
-			if nhex == 0 {
-				break Switch
-			}
-			return r, t, nil
-		}
-
-		// Easy case: two hex digits.
-		x := unhex(c)
-		if c, t, err = nextRune(t); err != nil {
-			return 0, "", err
-		}
-		y := unhex(c)
-		if x < 0 || y < 0 {
-			break
-		}
-		return x*16 + y, t, nil
-
-	// C escapes.  There is no case 'b', to avoid misparsing
-	// the Perl word-boundary \b as the C backspace \b
-	// when in POSIX mode.  In Perl, /\b/ means word-boundary
-	// but /[\b]/ means backspace.  We don't support that.
-	// If you want a backspace, embed a literal backspace
-	// character or use \x08.
-	case 'a':
-		return '\a', t, err
-	case 'f':
-		return '\f', t, err
-	case 'n':
-		return '\n', t, err
-	case 'r':
-		return '\r', t, err
-	case 't':
-		return '\t', t, err
-	case 'v':
-		return '\v', t, err
-	}
-	return 0, "", &Error{ErrInvalidEscape, s[:len(s)-len(t)]}
-}
-
-// parseClassChar parses a character class character at the beginning of s
-// and returns it.
-func (p *parser) parseClassChar(s, wholeClass string) (r rune, rest string, err error) {
-	if s == "" {
-		return 0, "", &Error{Code: ErrMissingBracket, Expr: wholeClass}
-	}
-
-	// Allow regular escape sequences even though
-	// many need not be escaped in this context.
-	if s[0] == '\\' {
-		return p.parseEscape(s)
-	}
-
-	return nextRune(s)
-}
-
-type charGroup struct {
-	sign  int
-	class []rune
-}
-
-// parsePerlClassEscape parses a leading Perl character class escape like \d
-// from the beginning of s.  If one is present, it appends the characters to r
-// and returns the new slice r and the remainder of the string.
-func (p *parser) parsePerlClassEscape(s string, r []rune) (out []rune, rest string) {
-	if p.flags&PerlX == 0 || len(s) < 2 || s[0] != '\\' {
-		return
-	}
-	g := perlGroup[s[0:2]]
-	if g.sign == 0 {
-		return
-	}
-	return p.appendGroup(r, g), s[2:]
-}
-
-// parseNamedClass parses a leading POSIX named character class like [:alnum:]
-// from the beginning of s.  If one is present, it appends the characters to r
-// and returns the new slice r and the remainder of the string.
-func (p *parser) parseNamedClass(s string, r []rune) (out []rune, rest string, err error) {
-	if len(s) < 2 || s[0] != '[' || s[1] != ':' {
-		return
-	}
-
-	i := strings.Index(s[2:], ":]")
-	if i < 0 {
-		return
-	}
-	i += 2
-	name, s := s[0:i+2], s[i+2:]
-	g := posixGroup[name]
-	if g.sign == 0 {
-		return nil, "", &Error{ErrInvalidCharRange, name}
-	}
-	return p.appendGroup(r, g), s, nil
-}
-
-func (p *parser) appendGroup(r []rune, g charGroup) []rune {
-	if p.flags&FoldCase == 0 {
-		if g.sign < 0 {
-			r = appendNegatedClass(r, g.class)
-		} else {
-			r = appendClass(r, g.class)
-		}
-	} else {
-		tmp := p.tmpClass[:0]
-		tmp = appendFoldedClass(tmp, g.class)
-		p.tmpClass = tmp
-		tmp = cleanClass(&p.tmpClass)
-		if g.sign < 0 {
-			r = appendNegatedClass(r, tmp)
-		} else {
-			r = appendClass(r, tmp)
-		}
-	}
-	return r
-}
-
-var anyTable = &unicode.RangeTable{
-	R16: []unicode.Range16{{Lo: 0, Hi: 1<<16 - 1, Stride: 1}},
-	R32: []unicode.Range32{{Lo: 1 << 16, Hi: unicode.MaxRune, Stride: 1}},
-}
-
-// unicodeTable returns the unicode.RangeTable identified by name
-// and the table of additional fold-equivalent code points.
-func unicodeTable(name string) (*unicode.RangeTable, *unicode.RangeTable) {
-	// Special case: "Any" means any.
-	if name == "Any" {
-		return anyTable, anyTable
-	}
-	if t := unicode.Categories[name]; t != nil {
-		return t, unicode.FoldCategory[name]
-	}
-	if t := unicode.Scripts[name]; t != nil {
-		return t, unicode.FoldScript[name]
-	}
-	return nil, nil
-}
-
-// parseUnicodeClass parses a leading Unicode character class like \p{Han}
-// from the beginning of s.  If one is present, it appends the characters to r
-// and returns the new slice r and the remainder of the string.
-func (p *parser) parseUnicodeClass(s string, r []rune) (out []rune, rest string, err error) {
-	if p.flags&UnicodeGroups == 0 || len(s) < 2 || s[0] != '\\' || s[1] != 'p' && s[1] != 'P' {
-		return
-	}
-
-	// Committed to parse or return error.
-	sign := +1
-	if s[1] == 'P' {
-		sign = -1
-	}
-	t := s[2:]
-	c, t, err := nextRune(t)
-	if err != nil {
-		return
-	}
-	var seq, name string
-	if c != '{' {
-		// Single-letter name.
-		seq = s[:len(s)-len(t)]
-		name = seq[2:]
-	} else {
-		// Name is in braces.
-		end := strings.IndexRune(s, '}')
-		if end < 0 {
-			if err = checkUTF8(s); err != nil {
-				return
-			}
-			return nil, "", &Error{ErrInvalidCharRange, s}
-		}
-		seq, t = s[:end+1], s[end+1:]
-		name = s[3:end]
-		if err = checkUTF8(name); err != nil {
-			return
-		}
-	}
-
-	// Group can have leading negation too.  \p{^Han} == \P{Han}, \P{^Han} == \p{Han}.
-	if name != "" && name[0] == '^' {
-		sign = -sign
-		name = name[1:]
-	}
-
-	tab, fold := unicodeTable(name)
-	if tab == nil {
-		return nil, "", &Error{ErrInvalidCharRange, seq}
-	}
-
-	if p.flags&FoldCase == 0 || fold == nil {
-		if sign > 0 {
-			r = appendTable(r, tab)
-		} else {
-			r = appendNegatedTable(r, tab)
-		}
-	} else {
-		// Merge and clean tab and fold in a temporary buffer.
-		// This is necessary for the negative case and just tidy
-		// for the positive case.
-		tmp := p.tmpClass[:0]
-		tmp = appendTable(tmp, tab)
-		tmp = appendTable(tmp, fold)
-		p.tmpClass = tmp
-		tmp = cleanClass(&p.tmpClass)
-		if sign > 0 {
-			r = appendClass(r, tmp)
-		} else {
-			r = appendNegatedClass(r, tmp)
-		}
-	}
-	return r, t, nil
-}
-
-// parseClass parses a character class at the beginning of s
-// and pushes it onto the parse stack.
-func (p *parser) parseClass(s string) (rest string, err error) {
-	t := s[1:] // chop [
-	re := p.newRegexp(OpCharClass)
-	re.Flags = p.flags
-	re.Rune = re.Rune0[:0]
-
-	sign := +1
-	if t != "" && t[0] == '^' {
-		sign = -1
-		t = t[1:]
-
-		// If character class does not match \n, add it here,
-		// so that negation later will do the right thing.
-		if p.flags&ClassNL == 0 {
-			re.Rune = append(re.Rune, '\n', '\n')
-		}
-	}
-
-	class := re.Rune
-	first := true // ] and - are okay as first char in class
-	for t == "" || t[0] != ']' || first {
-		// POSIX: - is only okay unescaped as first or last in class.
-		// Perl: - is okay anywhere.
-		if t != "" && t[0] == '-' && p.flags&PerlX == 0 && !first && (len(t) == 1 || t[1] != ']') {
-			_, size := utf8.DecodeRuneInString(t[1:])
-			return "", &Error{Code: ErrInvalidCharRange, Expr: t[:1+size]}
-		}
-		first = false
-
-		// Look for POSIX [:alnum:] etc.
-		if len(t) > 2 && t[0] == '[' && t[1] == ':' {
-			nclass, nt, err := p.parseNamedClass(t, class)
-			if err != nil {
-				return "", err
-			}
-			if nclass != nil {
-				class, t = nclass, nt
-				continue
-			}
-		}
-
-		// Look for Unicode character group like \p{Han}.
-		nclass, nt, err := p.parseUnicodeClass(t, class)
-		if err != nil {
-			return "", err
-		}
-		if nclass != nil {
-			class, t = nclass, nt
-			continue
-		}
-
-		// Look for Perl character class symbols (extension).
-		if nclass, nt := p.parsePerlClassEscape(t, class); nclass != nil {
-			class, t = nclass, nt
-			continue
-		}
-
-		// Single character or simple range.
-		rng := t
-		var lo, hi rune
-		if lo, t, err = p.parseClassChar(t, s); err != nil {
-			return "", err
-		}
-		hi = lo
-		// [a-] means (a|-) so check for final ].
-		if len(t) >= 2 && t[0] == '-' && t[1] != ']' {
-			t = t[1:]
-			if hi, t, err = p.parseClassChar(t, s); err != nil {
-				return "", err
-			}
-			if hi < lo {
-				rng = rng[:len(rng)-len(t)]
-				return "", &Error{Code: ErrInvalidCharRange, Expr: rng}
-			}
-		}
-		if p.flags&FoldCase == 0 {
-			class = appendRange(class, lo, hi)
-		} else {
-			class = appendFoldedRange(class, lo, hi)
-		}
-	}
-	t = t[1:] // chop ]
-
-	// Use &re.Rune instead of &class to avoid allocation.
-	re.Rune = class
-	class = cleanClass(&re.Rune)
-	if sign < 0 {
-		class = negateClass(class)
-	}
-	re.Rune = class
-	p.push(re)
-	return t, nil
-}
-
-// cleanClass sorts the ranges (pairs of elements of r),
-// merges them, and eliminates duplicates.
-func cleanClass(rp *[]rune) []rune {
-
-	// Sort by lo increasing, hi decreasing to break ties.
-	sort.Sort(ranges{rp})
-
-	r := *rp
-	if len(r) < 2 {
-		return r
-	}
-
-	// Merge abutting, overlapping.
-	w := 2 // write index
-	for i := 2; i < len(r); i += 2 {
-		lo, hi := r[i], r[i+1]
-		if lo <= r[w-1]+1 {
-			// merge with previous range
-			if hi > r[w-1] {
-				r[w-1] = hi
-			}
-			continue
-		}
-		// new disjoint range
-		r[w] = lo
-		r[w+1] = hi
-		w += 2
-	}
-
-	return r[:w]
-}
-
-// appendLiteral returns the result of appending the literal x to the class r.
-func appendLiteral(r []rune, x rune, flags Flags) []rune {
-	if flags&FoldCase != 0 {
-		return appendFoldedRange(r, x, x)
-	}
-	return appendRange(r, x, x)
-}
-
-// appendRange returns the result of appending the range lo-hi to the class r.
-func appendRange(r []rune, lo, hi rune) []rune {
-	// Expand last range or next to last range if it overlaps or abuts.
-	// Checking two ranges helps when appending case-folded
-	// alphabets, so that one range can be expanding A-Z and the
-	// other expanding a-z.
-	n := len(r)
-	for i := 2; i <= 4; i += 2 { // twice, using i=2, i=4
-		if n >= i {
-			rlo, rhi := r[n-i], r[n-i+1]
-			if lo <= rhi+1 && rlo <= hi+1 {
-				if lo < rlo {
-					r[n-i] = lo
-				}
-				if hi > rhi {
-					r[n-i+1] = hi
-				}
-				return r
-			}
-		}
-	}
-
-	return append(r, lo, hi)
-}
-
-const (
-	// minimum and maximum runes involved in folding.
-	// checked during test.
-	minFold = 0x0041
-	maxFold = 0x118df
-)
-
-// appendFoldedRange returns the result of appending the range lo-hi
-// and its case folding-equivalent runes to the class r.
-func appendFoldedRange(r []rune, lo, hi rune) []rune {
-	// Optimizations.
-	if lo <= minFold && hi >= maxFold {
-		// Range is full: folding can't add more.
-		return appendRange(r, lo, hi)
-	}
-	if hi < minFold || lo > maxFold {
-		// Range is outside folding possibilities.
-		return appendRange(r, lo, hi)
-	}
-	if lo < minFold {
-		// [lo, minFold-1] needs no folding.
-		r = appendRange(r, lo, minFold-1)
-		lo = minFold
-	}
-	if hi > maxFold {
-		// [maxFold+1, hi] needs no folding.
-		r = appendRange(r, maxFold+1, hi)
-		hi = maxFold
-	}
-
-	// Brute force.  Depend on appendRange to coalesce ranges on the fly.
-	for c := lo; c <= hi; c++ {
-		r = appendRange(r, c, c)
-		f := unicode.SimpleFold(c)
-		for f != c {
-			r = appendRange(r, f, f)
-			f = unicode.SimpleFold(f)
-		}
-	}
-	return r
-}
-
-// appendClass returns the result of appending the class x to the class r.
-// It assume x is clean.
-func appendClass(r []rune, x []rune) []rune {
-	for i := 0; i < len(x); i += 2 {
-		r = appendRange(r, x[i], x[i+1])
-	}
-	return r
-}
-
-// appendFolded returns the result of appending the case folding of the class x to the class r.
-func appendFoldedClass(r []rune, x []rune) []rune {
-	for i := 0; i < len(x); i += 2 {
-		r = appendFoldedRange(r, x[i], x[i+1])
-	}
-	return r
-}
-
-// appendNegatedClass returns the result of appending the negation of the class x to the class r.
-// It assumes x is clean.
-func appendNegatedClass(r []rune, x []rune) []rune {
-	nextLo := '\u0000'
-	for i := 0; i < len(x); i += 2 {
-		lo, hi := x[i], x[i+1]
-		if nextLo <= lo-1 {
-			r = appendRange(r, nextLo, lo-1)
-		}
-		nextLo = hi + 1
-	}
-	if nextLo <= unicode.MaxRune {
-		r = appendRange(r, nextLo, unicode.MaxRune)
-	}
-	return r
-}
-
-// appendTable returns the result of appending x to the class r.
-func appendTable(r []rune, x *unicode.RangeTable) []rune {
-	for _, xr := range x.R16 {
-		lo, hi, stride := rune(xr.Lo), rune(xr.Hi), rune(xr.Stride)
-		if stride == 1 {
-			r = appendRange(r, lo, hi)
-			continue
-		}
-		for c := lo; c <= hi; c += stride {
-			r = appendRange(r, c, c)
-		}
-	}
-	for _, xr := range x.R32 {
-		lo, hi, stride := rune(xr.Lo), rune(xr.Hi), rune(xr.Stride)
-		if stride == 1 {
-			r = appendRange(r, lo, hi)
-			continue
-		}
-		for c := lo; c <= hi; c += stride {
-			r = appendRange(r, c, c)
-		}
-	}
-	return r
-}
-
-// appendNegatedTable returns the result of appending the negation of x to the class r.
-func appendNegatedTable(r []rune, x *unicode.RangeTable) []rune {
-	nextLo := '\u0000' // lo end of next class to add
-	for _, xr := range x.R16 {
-		lo, hi, stride := rune(xr.Lo), rune(xr.Hi), rune(xr.Stride)
-		if stride == 1 {
-			if nextLo <= lo-1 {
-				r = appendRange(r, nextLo, lo-1)
-			}
-			nextLo = hi + 1
-			continue
-		}
-		for c := lo; c <= hi; c += stride {
-			if nextLo <= c-1 {
-				r = appendRange(r, nextLo, c-1)
-			}
-			nextLo = c + 1
-		}
-	}
-	for _, xr := range x.R32 {
-		lo, hi, stride := rune(xr.Lo), rune(xr.Hi), rune(xr.Stride)
-		if stride == 1 {
-			if nextLo <= lo-1 {
-				r = appendRange(r, nextLo, lo-1)
-			}
-			nextLo = hi + 1
-			continue
-		}
-		for c := lo; c <= hi; c += stride {
-			if nextLo <= c-1 {
-				r = appendRange(r, nextLo, c-1)
-			}
-			nextLo = c + 1
-		}
-	}
-	if nextLo <= unicode.MaxRune {
-		r = appendRange(r, nextLo, unicode.MaxRune)
-	}
-	return r
-}
-
-// negateClass overwrites r and returns r's negation.
-// It assumes the class r is already clean.
-func negateClass(r []rune) []rune {
-	nextLo := '\u0000' // lo end of next class to add
-	w := 0             // write index
-	for i := 0; i < len(r); i += 2 {
-		lo, hi := r[i], r[i+1]
-		if nextLo <= lo-1 {
-			r[w] = nextLo
-			r[w+1] = lo - 1
-			w += 2
-		}
-		nextLo = hi + 1
-	}
-	r = r[:w]
-	if nextLo <= unicode.MaxRune {
-		// It's possible for the negation to have one more
-		// range - this one - than the original class, so use append.
-		r = append(r, nextLo, unicode.MaxRune)
-	}
-	return r
-}
-
-// ranges implements sort.Interface on a []rune.
-// The choice of receiver type definition is strange
-// but avoids an allocation since we already have
-// a *[]rune.
-type ranges struct {
-	p *[]rune
-}
-
-func (ra ranges) Less(i, j int) bool {
-	p := *ra.p
-	i *= 2
-	j *= 2
-	return p[i] < p[j] || p[i] == p[j] && p[i+1] > p[j+1]
-}
-
-func (ra ranges) Len() int {
-	return len(*ra.p) / 2
-}
-
-func (ra ranges) Swap(i, j int) {
-	p := *ra.p
-	i *= 2
-	j *= 2
-	p[i], p[i+1], p[j], p[j+1] = p[j], p[j+1], p[i], p[i+1]
-}
-
-func checkUTF8(s string) error {
-	for s != "" {
-		rune, size := utf8.DecodeRuneInString(s)
-		if rune == utf8.RuneError && size == 1 {
-			return &Error{Code: ErrInvalidUTF8, Expr: s}
-		}
-		s = s[size:]
-	}
-	return nil
-}
-
-func nextRune(s string) (c rune, t string, err error) {
-	c, size := utf8.DecodeRuneInString(s)
-	if c == utf8.RuneError && size == 1 {
-		return 0, "", &Error{Code: ErrInvalidUTF8, Expr: s}
-	}
-	return c, s[size:], nil
-}
-
-func isalnum(c rune) bool {
-	return '0' <= c && c <= '9' || 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z'
-}
-
-func unhex(c rune) rune {
-	if '0' <= c && c <= '9' {
-		return c - '0'
-	}
-	if 'a' <= c && c <= 'f' {
-		return c - 'a' + 10
-	}
-	if 'A' <= c && c <= 'F' {
-		return c - 'A' + 10
-	}
-	return -1
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/syntax/parse_test.go b/third_party/gofrontend/libgo/go/regexp/syntax/parse_test.go
deleted file mode 100644
index c4a1117..0000000
--- a/third_party/gofrontend/libgo/go/regexp/syntax/parse_test.go
+++ /dev/null
@@ -1,572 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syntax
-
-import (
-	"bytes"
-	"fmt"
-	"testing"
-	"unicode"
-)
-
-type parseTest struct {
-	Regexp string
-	Dump   string
-}
-
-var parseTests = []parseTest{
-	// Base cases
-	{`a`, `lit{a}`},
-	{`a.`, `cat{lit{a}dot{}}`},
-	{`a.b`, `cat{lit{a}dot{}lit{b}}`},
-	{`ab`, `str{ab}`},
-	{`a.b.c`, `cat{lit{a}dot{}lit{b}dot{}lit{c}}`},
-	{`abc`, `str{abc}`},
-	{`a|^`, `alt{lit{a}bol{}}`},
-	{`a|b`, `cc{0x61-0x62}`},
-	{`(a)`, `cap{lit{a}}`},
-	{`(a)|b`, `alt{cap{lit{a}}lit{b}}`},
-	{`a*`, `star{lit{a}}`},
-	{`a+`, `plus{lit{a}}`},
-	{`a?`, `que{lit{a}}`},
-	{`a{2}`, `rep{2,2 lit{a}}`},
-	{`a{2,3}`, `rep{2,3 lit{a}}`},
-	{`a{2,}`, `rep{2,-1 lit{a}}`},
-	{`a*?`, `nstar{lit{a}}`},
-	{`a+?`, `nplus{lit{a}}`},
-	{`a??`, `nque{lit{a}}`},
-	{`a{2}?`, `nrep{2,2 lit{a}}`},
-	{`a{2,3}?`, `nrep{2,3 lit{a}}`},
-	{`a{2,}?`, `nrep{2,-1 lit{a}}`},
-	// Malformed { } are treated as literals.
-	{`x{1001`, `str{x{1001}`},
-	{`x{9876543210`, `str{x{9876543210}`},
-	{`x{9876543210,`, `str{x{9876543210,}`},
-	{`x{2,1`, `str{x{2,1}`},
-	{`x{1,9876543210`, `str{x{1,9876543210}`},
-	{``, `emp{}`},
-	{`|`, `emp{}`}, // alt{emp{}emp{}} but got factored
-	{`|x|`, `alt{emp{}lit{x}emp{}}`},
-	{`.`, `dot{}`},
-	{`^`, `bol{}`},
-	{`$`, `eol{}`},
-	{`\|`, `lit{|}`},
-	{`\(`, `lit{(}`},
-	{`\)`, `lit{)}`},
-	{`\*`, `lit{*}`},
-	{`\+`, `lit{+}`},
-	{`\?`, `lit{?}`},
-	{`{`, `lit{{}`},
-	{`}`, `lit{}}`},
-	{`\.`, `lit{.}`},
-	{`\^`, `lit{^}`},
-	{`\$`, `lit{$}`},
-	{`\\`, `lit{\}`},
-	{`[ace]`, `cc{0x61 0x63 0x65}`},
-	{`[abc]`, `cc{0x61-0x63}`},
-	{`[a-z]`, `cc{0x61-0x7a}`},
-	{`[a]`, `lit{a}`},
-	{`\-`, `lit{-}`},
-	{`-`, `lit{-}`},
-	{`\_`, `lit{_}`},
-	{`abc`, `str{abc}`},
-	{`abc|def`, `alt{str{abc}str{def}}`},
-	{`abc|def|ghi`, `alt{str{abc}str{def}str{ghi}}`},
-
-	// Posix and Perl extensions
-	{`[[:lower:]]`, `cc{0x61-0x7a}`},
-	{`[a-z]`, `cc{0x61-0x7a}`},
-	{`[^[:lower:]]`, `cc{0x0-0x60 0x7b-0x10ffff}`},
-	{`[[:^lower:]]`, `cc{0x0-0x60 0x7b-0x10ffff}`},
-	{`(?i)[[:lower:]]`, `cc{0x41-0x5a 0x61-0x7a 0x17f 0x212a}`},
-	{`(?i)[a-z]`, `cc{0x41-0x5a 0x61-0x7a 0x17f 0x212a}`},
-	{`(?i)[^[:lower:]]`, `cc{0x0-0x40 0x5b-0x60 0x7b-0x17e 0x180-0x2129 0x212b-0x10ffff}`},
-	{`(?i)[[:^lower:]]`, `cc{0x0-0x40 0x5b-0x60 0x7b-0x17e 0x180-0x2129 0x212b-0x10ffff}`},
-	{`\d`, `cc{0x30-0x39}`},
-	{`\D`, `cc{0x0-0x2f 0x3a-0x10ffff}`},
-	{`\s`, `cc{0x9-0xa 0xc-0xd 0x20}`},
-	{`\S`, `cc{0x0-0x8 0xb 0xe-0x1f 0x21-0x10ffff}`},
-	{`\w`, `cc{0x30-0x39 0x41-0x5a 0x5f 0x61-0x7a}`},
-	{`\W`, `cc{0x0-0x2f 0x3a-0x40 0x5b-0x5e 0x60 0x7b-0x10ffff}`},
-	{`(?i)\w`, `cc{0x30-0x39 0x41-0x5a 0x5f 0x61-0x7a 0x17f 0x212a}`},
-	{`(?i)\W`, `cc{0x0-0x2f 0x3a-0x40 0x5b-0x5e 0x60 0x7b-0x17e 0x180-0x2129 0x212b-0x10ffff}`},
-	{`[^\\]`, `cc{0x0-0x5b 0x5d-0x10ffff}`},
-	//	{ `\C`, `byte{}` },  // probably never
-
-	// Unicode, negatives, and a double negative.
-	{`\p{Braille}`, `cc{0x2800-0x28ff}`},
-	{`\P{Braille}`, `cc{0x0-0x27ff 0x2900-0x10ffff}`},
-	{`\p{^Braille}`, `cc{0x0-0x27ff 0x2900-0x10ffff}`},
-	{`\P{^Braille}`, `cc{0x2800-0x28ff}`},
-	{`\pZ`, `cc{0x20 0xa0 0x1680 0x2000-0x200a 0x2028-0x2029 0x202f 0x205f 0x3000}`},
-	{`[\p{Braille}]`, `cc{0x2800-0x28ff}`},
-	{`[\P{Braille}]`, `cc{0x0-0x27ff 0x2900-0x10ffff}`},
-	{`[\p{^Braille}]`, `cc{0x0-0x27ff 0x2900-0x10ffff}`},
-	{`[\P{^Braille}]`, `cc{0x2800-0x28ff}`},
-	{`[\pZ]`, `cc{0x20 0xa0 0x1680 0x2000-0x200a 0x2028-0x2029 0x202f 0x205f 0x3000}`},
-	{`\p{Lu}`, mkCharClass(unicode.IsUpper)},
-	{`[\p{Lu}]`, mkCharClass(unicode.IsUpper)},
-	{`(?i)[\p{Lu}]`, mkCharClass(isUpperFold)},
-	{`\p{Any}`, `dot{}`},
-	{`\p{^Any}`, `cc{}`},
-
-	// Hex, octal.
-	{`[\012-\234]\141`, `cat{cc{0xa-0x9c}lit{a}}`},
-	{`[\x{41}-\x7a]\x61`, `cat{cc{0x41-0x7a}lit{a}}`},
-
-	// More interesting regular expressions.
-	{`a{,2}`, `str{a{,2}}`},
-	{`\.\^\$\\`, `str{.^$\}`},
-	{`[a-zABC]`, `cc{0x41-0x43 0x61-0x7a}`},
-	{`[^a]`, `cc{0x0-0x60 0x62-0x10ffff}`},
-	{`[α-ε☺]`, `cc{0x3b1-0x3b5 0x263a}`}, // utf-8
-	{`a*{`, `cat{star{lit{a}}lit{{}}`},
-
-	// Test precedences
-	{`(?:ab)*`, `star{str{ab}}`},
-	{`(ab)*`, `star{cap{str{ab}}}`},
-	{`ab|cd`, `alt{str{ab}str{cd}}`},
-	{`a(b|c)d`, `cat{lit{a}cap{cc{0x62-0x63}}lit{d}}`},
-
-	// Test flattening.
-	{`(?:a)`, `lit{a}`},
-	{`(?:ab)(?:cd)`, `str{abcd}`},
-	{`(?:a+b+)(?:c+d+)`, `cat{plus{lit{a}}plus{lit{b}}plus{lit{c}}plus{lit{d}}}`},
-	{`(?:a+|b+)|(?:c+|d+)`, `alt{plus{lit{a}}plus{lit{b}}plus{lit{c}}plus{lit{d}}}`},
-	{`(?:a|b)|(?:c|d)`, `cc{0x61-0x64}`},
-	{`a|.`, `dot{}`},
-	{`.|a`, `dot{}`},
-	{`(?:[abc]|A|Z|hello|world)`, `alt{cc{0x41 0x5a 0x61-0x63}str{hello}str{world}}`},
-	{`(?:[abc]|A|Z)`, `cc{0x41 0x5a 0x61-0x63}`},
-
-	// Test Perl quoted literals
-	{`\Q+|*?{[\E`, `str{+|*?{[}`},
-	{`\Q+\E+`, `plus{lit{+}}`},
-	{`\Q\\E`, `lit{\}`},
-	{`\Q\\\E`, `str{\\}`},
-
-	// Test Perl \A and \z
-	{`(?m)^`, `bol{}`},
-	{`(?m)$`, `eol{}`},
-	{`(?-m)^`, `bot{}`},
-	{`(?-m)$`, `eot{}`},
-	{`(?m)\A`, `bot{}`},
-	{`(?m)\z`, `eot{\z}`},
-	{`(?-m)\A`, `bot{}`},
-	{`(?-m)\z`, `eot{\z}`},
-
-	// Test named captures
-	{`(?P<name>a)`, `cap{name:lit{a}}`},
-
-	// Case-folded literals
-	{`[Aa]`, `litfold{A}`},
-	{`[\x{100}\x{101}]`, `litfold{Ā}`},
-	{`[Δδ]`, `litfold{Δ}`},
-
-	// Strings
-	{`abcde`, `str{abcde}`},
-	{`[Aa][Bb]cd`, `cat{strfold{AB}str{cd}}`},
-
-	// Factoring.
-	{`abc|abd|aef|bcx|bcy`, `alt{cat{lit{a}alt{cat{lit{b}cc{0x63-0x64}}str{ef}}}cat{str{bc}cc{0x78-0x79}}}`},
-	{`ax+y|ax+z|ay+w`, `cat{lit{a}alt{cat{plus{lit{x}}cc{0x79-0x7a}}cat{plus{lit{y}}lit{w}}}}`},
-
-	// Bug fixes.
-	{`(?:.)`, `dot{}`},
-	{`(?:x|(?:xa))`, `cat{lit{x}alt{emp{}lit{a}}}`},
-	{`(?:.|(?:.a))`, `cat{dot{}alt{emp{}lit{a}}}`},
-	{`(?:A(?:A|a))`, `cat{lit{A}litfold{A}}`},
-	{`(?:A|a)`, `litfold{A}`},
-	{`A|(?:A|a)`, `litfold{A}`},
-	{`(?s).`, `dot{}`},
-	{`(?-s).`, `dnl{}`},
-	{`(?:(?:^).)`, `cat{bol{}dot{}}`},
-	{`(?-s)(?:(?:^).)`, `cat{bol{}dnl{}}`},
-
-	// RE2 prefix_tests
-	{`abc|abd`, `cat{str{ab}cc{0x63-0x64}}`},
-	{`a(?:b)c|abd`, `cat{str{ab}cc{0x63-0x64}}`},
-	{`abc|abd|aef|bcx|bcy`,
-		`alt{cat{lit{a}alt{cat{lit{b}cc{0x63-0x64}}str{ef}}}` +
-			`cat{str{bc}cc{0x78-0x79}}}`},
-	{`abc|x|abd`, `alt{str{abc}lit{x}str{abd}}`},
-	{`(?i)abc|ABD`, `cat{strfold{AB}cc{0x43-0x44 0x63-0x64}}`},
-	{`[ab]c|[ab]d`, `cat{cc{0x61-0x62}cc{0x63-0x64}}`},
-	{`(?:xx|yy)c|(?:xx|yy)d`,
-		`cat{alt{str{xx}str{yy}}cc{0x63-0x64}}`},
-	{`x{2}|x{2}[0-9]`,
-		`cat{rep{2,2 lit{x}}alt{emp{}cc{0x30-0x39}}}`},
-	{`x{2}y|x{2}[0-9]y`,
-		`cat{rep{2,2 lit{x}}alt{lit{y}cat{cc{0x30-0x39}lit{y}}}}`},
-
-	// Valid repetitions.
-	{`((((((((((x{2}){2}){2}){2}){2}){2}){2}){2}){2}))`, ``},
-	{`((((((((((x{1}){2}){2}){2}){2}){2}){2}){2}){2}){2})`, ``},
-}
-
-const testFlags = MatchNL | PerlX | UnicodeGroups
-
-func TestParseSimple(t *testing.T) {
-	testParseDump(t, parseTests, testFlags)
-}
-
-var foldcaseTests = []parseTest{
-	{`AbCdE`, `strfold{ABCDE}`},
-	{`[Aa]`, `litfold{A}`},
-	{`a`, `litfold{A}`},
-
-	// 0x17F is an old English long s (looks like an f) and folds to s.
-	// 0x212A is the Kelvin symbol and folds to k.
-	{`A[F-g]`, `cat{litfold{A}cc{0x41-0x7a 0x17f 0x212a}}`}, // [Aa][A-z...]
-	{`[[:upper:]]`, `cc{0x41-0x5a 0x61-0x7a 0x17f 0x212a}`},
-	{`[[:lower:]]`, `cc{0x41-0x5a 0x61-0x7a 0x17f 0x212a}`},
-}
-
-func TestParseFoldCase(t *testing.T) {
-	testParseDump(t, foldcaseTests, FoldCase)
-}
-
-var literalTests = []parseTest{
-	{"(|)^$.[*+?]{5,10},\\", "str{(|)^$.[*+?]{5,10},\\}"},
-}
-
-func TestParseLiteral(t *testing.T) {
-	testParseDump(t, literalTests, Literal)
-}
-
-var matchnlTests = []parseTest{
-	{`.`, `dot{}`},
-	{"\n", "lit{\n}"},
-	{`[^a]`, `cc{0x0-0x60 0x62-0x10ffff}`},
-	{`[a\n]`, `cc{0xa 0x61}`},
-}
-
-func TestParseMatchNL(t *testing.T) {
-	testParseDump(t, matchnlTests, MatchNL)
-}
-
-var nomatchnlTests = []parseTest{
-	{`.`, `dnl{}`},
-	{"\n", "lit{\n}"},
-	{`[^a]`, `cc{0x0-0x9 0xb-0x60 0x62-0x10ffff}`},
-	{`[a\n]`, `cc{0xa 0x61}`},
-}
-
-func TestParseNoMatchNL(t *testing.T) {
-	testParseDump(t, nomatchnlTests, 0)
-}
-
-// Test Parse -> Dump.
-func testParseDump(t *testing.T, tests []parseTest, flags Flags) {
-	for _, tt := range tests {
-		re, err := Parse(tt.Regexp, flags)
-		if err != nil {
-			t.Errorf("Parse(%#q): %v", tt.Regexp, err)
-			continue
-		}
-		if tt.Dump == "" {
-			// It parsed. That's all we care about.
-			continue
-		}
-		d := dump(re)
-		if d != tt.Dump {
-			t.Errorf("Parse(%#q).Dump() = %#q want %#q", tt.Regexp, d, tt.Dump)
-		}
-	}
-}
-
-// dump prints a string representation of the regexp showing
-// the structure explicitly.
-func dump(re *Regexp) string {
-	var b bytes.Buffer
-	dumpRegexp(&b, re)
-	return b.String()
-}
-
-var opNames = []string{
-	OpNoMatch:        "no",
-	OpEmptyMatch:     "emp",
-	OpLiteral:        "lit",
-	OpCharClass:      "cc",
-	OpAnyCharNotNL:   "dnl",
-	OpAnyChar:        "dot",
-	OpBeginLine:      "bol",
-	OpEndLine:        "eol",
-	OpBeginText:      "bot",
-	OpEndText:        "eot",
-	OpWordBoundary:   "wb",
-	OpNoWordBoundary: "nwb",
-	OpCapture:        "cap",
-	OpStar:           "star",
-	OpPlus:           "plus",
-	OpQuest:          "que",
-	OpRepeat:         "rep",
-	OpConcat:         "cat",
-	OpAlternate:      "alt",
-}
-
-// dumpRegexp writes an encoding of the syntax tree for the regexp re to b.
-// It is used during testing to distinguish between parses that might print
-// the same using re's String method.
-func dumpRegexp(b *bytes.Buffer, re *Regexp) {
-	if int(re.Op) >= len(opNames) || opNames[re.Op] == "" {
-		fmt.Fprintf(b, "op%d", re.Op)
-	} else {
-		switch re.Op {
-		default:
-			b.WriteString(opNames[re.Op])
-		case OpStar, OpPlus, OpQuest, OpRepeat:
-			if re.Flags&NonGreedy != 0 {
-				b.WriteByte('n')
-			}
-			b.WriteString(opNames[re.Op])
-		case OpLiteral:
-			if len(re.Rune) > 1 {
-				b.WriteString("str")
-			} else {
-				b.WriteString("lit")
-			}
-			if re.Flags&FoldCase != 0 {
-				for _, r := range re.Rune {
-					if unicode.SimpleFold(r) != r {
-						b.WriteString("fold")
-						break
-					}
-				}
-			}
-		}
-	}
-	b.WriteByte('{')
-	switch re.Op {
-	case OpEndText:
-		if re.Flags&WasDollar == 0 {
-			b.WriteString(`\z`)
-		}
-	case OpLiteral:
-		for _, r := range re.Rune {
-			b.WriteRune(r)
-		}
-	case OpConcat, OpAlternate:
-		for _, sub := range re.Sub {
-			dumpRegexp(b, sub)
-		}
-	case OpStar, OpPlus, OpQuest:
-		dumpRegexp(b, re.Sub[0])
-	case OpRepeat:
-		fmt.Fprintf(b, "%d,%d ", re.Min, re.Max)
-		dumpRegexp(b, re.Sub[0])
-	case OpCapture:
-		if re.Name != "" {
-			b.WriteString(re.Name)
-			b.WriteByte(':')
-		}
-		dumpRegexp(b, re.Sub[0])
-	case OpCharClass:
-		sep := ""
-		for i := 0; i < len(re.Rune); i += 2 {
-			b.WriteString(sep)
-			sep = " "
-			lo, hi := re.Rune[i], re.Rune[i+1]
-			if lo == hi {
-				fmt.Fprintf(b, "%#x", lo)
-			} else {
-				fmt.Fprintf(b, "%#x-%#x", lo, hi)
-			}
-		}
-	}
-	b.WriteByte('}')
-}
-
-func mkCharClass(f func(rune) bool) string {
-	re := &Regexp{Op: OpCharClass}
-	lo := rune(-1)
-	for i := rune(0); i <= unicode.MaxRune; i++ {
-		if f(i) {
-			if lo < 0 {
-				lo = i
-			}
-		} else {
-			if lo >= 0 {
-				re.Rune = append(re.Rune, lo, i-1)
-				lo = -1
-			}
-		}
-	}
-	if lo >= 0 {
-		re.Rune = append(re.Rune, lo, unicode.MaxRune)
-	}
-	return dump(re)
-}
-
-func isUpperFold(r rune) bool {
-	if unicode.IsUpper(r) {
-		return true
-	}
-	c := unicode.SimpleFold(r)
-	for c != r {
-		if unicode.IsUpper(c) {
-			return true
-		}
-		c = unicode.SimpleFold(c)
-	}
-	return false
-}
-
-func TestFoldConstants(t *testing.T) {
-	last := rune(-1)
-	for i := rune(0); i <= unicode.MaxRune; i++ {
-		if unicode.SimpleFold(i) == i {
-			continue
-		}
-		if last == -1 && minFold != i {
-			t.Errorf("minFold=%#U should be %#U", minFold, i)
-		}
-		last = i
-	}
-	if maxFold != last {
-		t.Errorf("maxFold=%#U should be %#U", maxFold, last)
-	}
-}
-
-func TestAppendRangeCollapse(t *testing.T) {
-	// AppendRange should collapse each of the new ranges
-	// into the earlier ones (it looks back two ranges), so that
-	// the slice never grows very large.
-	// Note that we are not calling cleanClass.
-	var r []rune
-	for i := rune('A'); i <= 'Z'; i++ {
-		r = appendRange(r, i, i)
-		r = appendRange(r, i+'a'-'A', i+'a'-'A')
-	}
-	if string(r) != "AZaz" {
-		t.Errorf("appendRange interlaced A-Z a-z = %s, want AZaz", string(r))
-	}
-}
-
-var invalidRegexps = []string{
-	`(`,
-	`)`,
-	`(a`,
-	`a)`,
-	`(a))`,
-	`(a|b|`,
-	`a|b|)`,
-	`(a|b|))`,
-	`(a|b`,
-	`a|b)`,
-	`(a|b))`,
-	`[a-z`,
-	`([a-z)`,
-	`[a-z)`,
-	`([a-z]))`,
-	`x{1001}`,
-	`x{9876543210}`,
-	`x{2,1}`,
-	`x{1,9876543210}`,
-	"\xff", // Invalid UTF-8
-	"[\xff]",
-	"[\\\xff]",
-	"\\\xff",
-	`(?P<name>a`,
-	`(?P<name>`,
-	`(?P<name`,
-	`(?P<x y>a)`,
-	`(?P<>a)`,
-	`[a-Z]`,
-	`(?i)[a-Z]`,
-	`a{100000}`,
-	`a{100000,}`,
-	"((((((((((x{2}){2}){2}){2}){2}){2}){2}){2}){2}){2})",
-}
-
-var onlyPerl = []string{
-	`[a-b-c]`,
-	`\Qabc\E`,
-	`\Q*+?{[\E`,
-	`\Q\\E`,
-	`\Q\\\E`,
-	`\Q\\\\E`,
-	`\Q\\\\\E`,
-	`(?:a)`,
-	`(?P<name>a)`,
-}
-
-var onlyPOSIX = []string{
-	"a++",
-	"a**",
-	"a?*",
-	"a+*",
-	"a{1}*",
-	".{1}{2}.{3}",
-}
-
-func TestParseInvalidRegexps(t *testing.T) {
-	for _, regexp := range invalidRegexps {
-		if re, err := Parse(regexp, Perl); err == nil {
-			t.Errorf("Parse(%#q, Perl) = %s, should have failed", regexp, dump(re))
-		}
-		if re, err := Parse(regexp, POSIX); err == nil {
-			t.Errorf("Parse(%#q, POSIX) = %s, should have failed", regexp, dump(re))
-		}
-	}
-	for _, regexp := range onlyPerl {
-		if _, err := Parse(regexp, Perl); err != nil {
-			t.Errorf("Parse(%#q, Perl): %v", regexp, err)
-		}
-		if re, err := Parse(regexp, POSIX); err == nil {
-			t.Errorf("Parse(%#q, POSIX) = %s, should have failed", regexp, dump(re))
-		}
-	}
-	for _, regexp := range onlyPOSIX {
-		if re, err := Parse(regexp, Perl); err == nil {
-			t.Errorf("Parse(%#q, Perl) = %s, should have failed", regexp, dump(re))
-		}
-		if _, err := Parse(regexp, POSIX); err != nil {
-			t.Errorf("Parse(%#q, POSIX): %v", regexp, err)
-		}
-	}
-}
-
-func TestToStringEquivalentParse(t *testing.T) {
-	for _, tt := range parseTests {
-		re, err := Parse(tt.Regexp, testFlags)
-		if err != nil {
-			t.Errorf("Parse(%#q): %v", tt.Regexp, err)
-			continue
-		}
-		if tt.Dump == "" {
-			// It parsed. That's all we care about.
-			continue
-		}
-		d := dump(re)
-		if d != tt.Dump {
-			t.Errorf("Parse(%#q).Dump() = %#q want %#q", tt.Regexp, d, tt.Dump)
-			continue
-		}
-
-		s := re.String()
-		if s != tt.Regexp {
-			// If ToString didn't return the original regexp,
-			// it must have found one with fewer parens.
-			// Unfortunately we can't check the length here, because
-			// ToString produces "\\{" for a literal brace,
-			// but "{" is a shorter equivalent in some contexts.
-			nre, err := Parse(s, testFlags)
-			if err != nil {
-				t.Errorf("Parse(%#q.String() = %#q): %v", tt.Regexp, s, err)
-				continue
-			}
-			nd := dump(nre)
-			if d != nd {
-				t.Errorf("Parse(%#q) -> %#q; %#q vs %#q", tt.Regexp, s, d, nd)
-			}
-
-			ns := nre.String()
-			if s != ns {
-				t.Errorf("Parse(%#q) -> %#q -> %#q", tt.Regexp, s, ns)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/syntax/perl_groups.go b/third_party/gofrontend/libgo/go/regexp/syntax/perl_groups.go
deleted file mode 100644
index effe4e6..0000000
--- a/third_party/gofrontend/libgo/go/regexp/syntax/perl_groups.go
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// GENERATED BY make_perl_groups.pl; DO NOT EDIT.
-// make_perl_groups.pl >perl_groups.go
-
-package syntax
-
-var code1 = []rune{ /* \d */
-	0x30, 0x39,
-}
-
-var code2 = []rune{ /* \s */
-	0x9, 0xa,
-	0xc, 0xd,
-	0x20, 0x20,
-}
-
-var code3 = []rune{ /* \w */
-	0x30, 0x39,
-	0x41, 0x5a,
-	0x5f, 0x5f,
-	0x61, 0x7a,
-}
-
-var perlGroup = map[string]charGroup{
-	`\d`: {+1, code1},
-	`\D`: {-1, code1},
-	`\s`: {+1, code2},
-	`\S`: {-1, code2},
-	`\w`: {+1, code3},
-	`\W`: {-1, code3},
-}
-var code4 = []rune{ /* [:alnum:] */
-	0x30, 0x39,
-	0x41, 0x5a,
-	0x61, 0x7a,
-}
-
-var code5 = []rune{ /* [:alpha:] */
-	0x41, 0x5a,
-	0x61, 0x7a,
-}
-
-var code6 = []rune{ /* [:ascii:] */
-	0x0, 0x7f,
-}
-
-var code7 = []rune{ /* [:blank:] */
-	0x9, 0x9,
-	0x20, 0x20,
-}
-
-var code8 = []rune{ /* [:cntrl:] */
-	0x0, 0x1f,
-	0x7f, 0x7f,
-}
-
-var code9 = []rune{ /* [:digit:] */
-	0x30, 0x39,
-}
-
-var code10 = []rune{ /* [:graph:] */
-	0x21, 0x7e,
-}
-
-var code11 = []rune{ /* [:lower:] */
-	0x61, 0x7a,
-}
-
-var code12 = []rune{ /* [:print:] */
-	0x20, 0x7e,
-}
-
-var code13 = []rune{ /* [:punct:] */
-	0x21, 0x2f,
-	0x3a, 0x40,
-	0x5b, 0x60,
-	0x7b, 0x7e,
-}
-
-var code14 = []rune{ /* [:space:] */
-	0x9, 0xd,
-	0x20, 0x20,
-}
-
-var code15 = []rune{ /* [:upper:] */
-	0x41, 0x5a,
-}
-
-var code16 = []rune{ /* [:word:] */
-	0x30, 0x39,
-	0x41, 0x5a,
-	0x5f, 0x5f,
-	0x61, 0x7a,
-}
-
-var code17 = []rune{ /* [:xdigit:] */
-	0x30, 0x39,
-	0x41, 0x46,
-	0x61, 0x66,
-}
-
-var posixGroup = map[string]charGroup{
-	`[:alnum:]`:   {+1, code4},
-	`[:^alnum:]`:  {-1, code4},
-	`[:alpha:]`:   {+1, code5},
-	`[:^alpha:]`:  {-1, code5},
-	`[:ascii:]`:   {+1, code6},
-	`[:^ascii:]`:  {-1, code6},
-	`[:blank:]`:   {+1, code7},
-	`[:^blank:]`:  {-1, code7},
-	`[:cntrl:]`:   {+1, code8},
-	`[:^cntrl:]`:  {-1, code8},
-	`[:digit:]`:   {+1, code9},
-	`[:^digit:]`:  {-1, code9},
-	`[:graph:]`:   {+1, code10},
-	`[:^graph:]`:  {-1, code10},
-	`[:lower:]`:   {+1, code11},
-	`[:^lower:]`:  {-1, code11},
-	`[:print:]`:   {+1, code12},
-	`[:^print:]`:  {-1, code12},
-	`[:punct:]`:   {+1, code13},
-	`[:^punct:]`:  {-1, code13},
-	`[:space:]`:   {+1, code14},
-	`[:^space:]`:  {-1, code14},
-	`[:upper:]`:   {+1, code15},
-	`[:^upper:]`:  {-1, code15},
-	`[:word:]`:    {+1, code16},
-	`[:^word:]`:   {-1, code16},
-	`[:xdigit:]`:  {+1, code17},
-	`[:^xdigit:]`: {-1, code17},
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/syntax/prog.go b/third_party/gofrontend/libgo/go/regexp/syntax/prog.go
deleted file mode 100644
index ae6db31..0000000
--- a/third_party/gofrontend/libgo/go/regexp/syntax/prog.go
+++ /dev/null
@@ -1,345 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syntax
-
-import (
-	"bytes"
-	"strconv"
-	"unicode"
-)
-
-// Compiled program.
-// May not belong in this package, but convenient for now.
-
-// A Prog is a compiled regular expression program.
-type Prog struct {
-	Inst   []Inst
-	Start  int // index of start instruction
-	NumCap int // number of InstCapture insts in re
-}
-
-// An InstOp is an instruction opcode.
-type InstOp uint8
-
-const (
-	InstAlt InstOp = iota
-	InstAltMatch
-	InstCapture
-	InstEmptyWidth
-	InstMatch
-	InstFail
-	InstNop
-	InstRune
-	InstRune1
-	InstRuneAny
-	InstRuneAnyNotNL
-)
-
-var instOpNames = []string{
-	"InstAlt",
-	"InstAltMatch",
-	"InstCapture",
-	"InstEmptyWidth",
-	"InstMatch",
-	"InstFail",
-	"InstNop",
-	"InstRune",
-	"InstRune1",
-	"InstRuneAny",
-	"InstRuneAnyNotNL",
-}
-
-func (i InstOp) String() string {
-	if uint(i) >= uint(len(instOpNames)) {
-		return ""
-	}
-	return instOpNames[i]
-}
-
-// An EmptyOp specifies a kind or mixture of zero-width assertions.
-type EmptyOp uint8
-
-const (
-	EmptyBeginLine EmptyOp = 1 << iota
-	EmptyEndLine
-	EmptyBeginText
-	EmptyEndText
-	EmptyWordBoundary
-	EmptyNoWordBoundary
-)
-
-// EmptyOpContext returns the zero-width assertions
-// satisfied at the position between the runes r1 and r2.
-// Passing r1 == -1 indicates that the position is
-// at the beginning of the text.
-// Passing r2 == -1 indicates that the position is
-// at the end of the text.
-func EmptyOpContext(r1, r2 rune) EmptyOp {
-	var op EmptyOp = EmptyNoWordBoundary
-	var boundary byte
-	switch {
-	case IsWordChar(r1):
-		boundary = 1
-	case r1 == '\n':
-		op |= EmptyBeginLine
-	case r1 < 0:
-		op |= EmptyBeginText | EmptyBeginLine
-	}
-	switch {
-	case IsWordChar(r2):
-		boundary ^= 1
-	case r2 == '\n':
-		op |= EmptyEndLine
-	case r2 < 0:
-		op |= EmptyEndText | EmptyEndLine
-	}
-	if boundary != 0 { // IsWordChar(r1) != IsWordChar(r2)
-		op ^= (EmptyWordBoundary | EmptyNoWordBoundary)
-	}
-	return op
-}
-
-// IsWordChar reports whether r is consider a ``word character''
-// during the evaluation of the \b and \B zero-width assertions.
-// These assertions are ASCII-only: the word characters are [A-Za-z0-9_].
-func IsWordChar(r rune) bool {
-	return 'A' <= r && r <= 'Z' || 'a' <= r && r <= 'z' || '0' <= r && r <= '9' || r == '_'
-}
-
-// An Inst is a single instruction in a regular expression program.
-type Inst struct {
-	Op   InstOp
-	Out  uint32 // all but InstMatch, InstFail
-	Arg  uint32 // InstAlt, InstAltMatch, InstCapture, InstEmptyWidth
-	Rune []rune
-}
-
-func (p *Prog) String() string {
-	var b bytes.Buffer
-	dumpProg(&b, p)
-	return b.String()
-}
-
-// skipNop follows any no-op or capturing instructions
-// and returns the resulting pc.
-func (p *Prog) skipNop(pc uint32) (*Inst, uint32) {
-	i := &p.Inst[pc]
-	for i.Op == InstNop || i.Op == InstCapture {
-		pc = i.Out
-		i = &p.Inst[pc]
-	}
-	return i, pc
-}
-
-// op returns i.Op but merges all the Rune special cases into InstRune
-func (i *Inst) op() InstOp {
-	op := i.Op
-	switch op {
-	case InstRune1, InstRuneAny, InstRuneAnyNotNL:
-		op = InstRune
-	}
-	return op
-}
-
-// Prefix returns a literal string that all matches for the
-// regexp must start with.  Complete is true if the prefix
-// is the entire match.
-func (p *Prog) Prefix() (prefix string, complete bool) {
-	i, _ := p.skipNop(uint32(p.Start))
-
-	// Avoid allocation of buffer if prefix is empty.
-	if i.op() != InstRune || len(i.Rune) != 1 {
-		return "", i.Op == InstMatch
-	}
-
-	// Have prefix; gather characters.
-	var buf bytes.Buffer
-	for i.op() == InstRune && len(i.Rune) == 1 && Flags(i.Arg)&FoldCase == 0 {
-		buf.WriteRune(i.Rune[0])
-		i, _ = p.skipNop(i.Out)
-	}
-	return buf.String(), i.Op == InstMatch
-}
-
-// StartCond returns the leading empty-width conditions that must
-// be true in any match.  It returns ^EmptyOp(0) if no matches are possible.
-func (p *Prog) StartCond() EmptyOp {
-	var flag EmptyOp
-	pc := uint32(p.Start)
-	i := &p.Inst[pc]
-Loop:
-	for {
-		switch i.Op {
-		case InstEmptyWidth:
-			flag |= EmptyOp(i.Arg)
-		case InstFail:
-			return ^EmptyOp(0)
-		case InstCapture, InstNop:
-			// skip
-		default:
-			break Loop
-		}
-		pc = i.Out
-		i = &p.Inst[pc]
-	}
-	return flag
-}
-
-const noMatch = -1
-
-// MatchRune reports whether the instruction matches (and consumes) r.
-// It should only be called when i.Op == InstRune.
-func (i *Inst) MatchRune(r rune) bool {
-	return i.MatchRunePos(r) != noMatch
-}
-
-// MatchRunePos checks whether the instruction matches (and consumes) r.
-// If so, MatchRunePos returns the index of the matching rune pair
-// (or, when len(i.Rune) == 1, rune singleton).
-// If not, MatchRunePos returns -1.
-// MatchRunePos should only be called when i.Op == InstRune.
-func (i *Inst) MatchRunePos(r rune) int {
-	rune := i.Rune
-
-	// Special case: single-rune slice is from literal string, not char class.
-	if len(rune) == 1 {
-		r0 := rune[0]
-		if r == r0 {
-			return 0
-		}
-		if Flags(i.Arg)&FoldCase != 0 {
-			for r1 := unicode.SimpleFold(r0); r1 != r0; r1 = unicode.SimpleFold(r1) {
-				if r == r1 {
-					return 0
-				}
-			}
-		}
-		return noMatch
-	}
-
-	// Peek at the first few pairs.
-	// Should handle ASCII well.
-	for j := 0; j < len(rune) && j <= 8; j += 2 {
-		if r < rune[j] {
-			return noMatch
-		}
-		if r <= rune[j+1] {
-			return j / 2
-		}
-	}
-
-	// Otherwise binary search.
-	lo := 0
-	hi := len(rune) / 2
-	for lo < hi {
-		m := lo + (hi-lo)/2
-		if c := rune[2*m]; c <= r {
-			if r <= rune[2*m+1] {
-				return m
-			}
-			lo = m + 1
-		} else {
-			hi = m
-		}
-	}
-	return noMatch
-}
-
-// As per re2's Prog::IsWordChar. Determines whether rune is an ASCII word char.
-// Since we act on runes, it would be easy to support Unicode here.
-func wordRune(r rune) bool {
-	return r == '_' ||
-		('A' <= r && r <= 'Z') ||
-		('a' <= r && r <= 'z') ||
-		('0' <= r && r <= '9')
-}
-
-// MatchEmptyWidth reports whether the instruction matches
-// an empty string between the runes before and after.
-// It should only be called when i.Op == InstEmptyWidth.
-func (i *Inst) MatchEmptyWidth(before rune, after rune) bool {
-	switch EmptyOp(i.Arg) {
-	case EmptyBeginLine:
-		return before == '\n' || before == -1
-	case EmptyEndLine:
-		return after == '\n' || after == -1
-	case EmptyBeginText:
-		return before == -1
-	case EmptyEndText:
-		return after == -1
-	case EmptyWordBoundary:
-		return wordRune(before) != wordRune(after)
-	case EmptyNoWordBoundary:
-		return wordRune(before) == wordRune(after)
-	}
-	panic("unknown empty width arg")
-}
-
-func (i *Inst) String() string {
-	var b bytes.Buffer
-	dumpInst(&b, i)
-	return b.String()
-}
-
-func bw(b *bytes.Buffer, args ...string) {
-	for _, s := range args {
-		b.WriteString(s)
-	}
-}
-
-func dumpProg(b *bytes.Buffer, p *Prog) {
-	for j := range p.Inst {
-		i := &p.Inst[j]
-		pc := strconv.Itoa(j)
-		if len(pc) < 3 {
-			b.WriteString("   "[len(pc):])
-		}
-		if j == p.Start {
-			pc += "*"
-		}
-		bw(b, pc, "\t")
-		dumpInst(b, i)
-		bw(b, "\n")
-	}
-}
-
-func u32(i uint32) string {
-	return strconv.FormatUint(uint64(i), 10)
-}
-
-func dumpInst(b *bytes.Buffer, i *Inst) {
-	switch i.Op {
-	case InstAlt:
-		bw(b, "alt -> ", u32(i.Out), ", ", u32(i.Arg))
-	case InstAltMatch:
-		bw(b, "altmatch -> ", u32(i.Out), ", ", u32(i.Arg))
-	case InstCapture:
-		bw(b, "cap ", u32(i.Arg), " -> ", u32(i.Out))
-	case InstEmptyWidth:
-		bw(b, "empty ", u32(i.Arg), " -> ", u32(i.Out))
-	case InstMatch:
-		bw(b, "match")
-	case InstFail:
-		bw(b, "fail")
-	case InstNop:
-		bw(b, "nop -> ", u32(i.Out))
-	case InstRune:
-		if i.Rune == nil {
-			// shouldn't happen
-			bw(b, "rune <nil>")
-		}
-		bw(b, "rune ", strconv.QuoteToASCII(string(i.Rune)))
-		if Flags(i.Arg)&FoldCase != 0 {
-			bw(b, "/i")
-		}
-		bw(b, " -> ", u32(i.Out))
-	case InstRune1:
-		bw(b, "rune1 ", strconv.QuoteToASCII(string(i.Rune)), " -> ", u32(i.Out))
-	case InstRuneAny:
-		bw(b, "any -> ", u32(i.Out))
-	case InstRuneAnyNotNL:
-		bw(b, "anynotnl -> ", u32(i.Out))
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/syntax/prog_test.go b/third_party/gofrontend/libgo/go/regexp/syntax/prog_test.go
deleted file mode 100644
index 50bfa3d..0000000
--- a/third_party/gofrontend/libgo/go/regexp/syntax/prog_test.go
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syntax
-
-import "testing"
-
-var compileTests = []struct {
-	Regexp string
-	Prog   string
-}{
-	{"a", `  0	fail
-  1*	rune1 "a" -> 2
-  2	match
-`},
-	{"[A-M][n-z]", `  0	fail
-  1*	rune "AM" -> 2
-  2	rune "nz" -> 3
-  3	match
-`},
-	{"", `  0	fail
-  1*	nop -> 2
-  2	match
-`},
-	{"a?", `  0	fail
-  1	rune1 "a" -> 3
-  2*	alt -> 1, 3
-  3	match
-`},
-	{"a??", `  0	fail
-  1	rune1 "a" -> 3
-  2*	alt -> 3, 1
-  3	match
-`},
-	{"a+", `  0	fail
-  1*	rune1 "a" -> 2
-  2	alt -> 1, 3
-  3	match
-`},
-	{"a+?", `  0	fail
-  1*	rune1 "a" -> 2
-  2	alt -> 3, 1
-  3	match
-`},
-	{"a*", `  0	fail
-  1	rune1 "a" -> 2
-  2*	alt -> 1, 3
-  3	match
-`},
-	{"a*?", `  0	fail
-  1	rune1 "a" -> 2
-  2*	alt -> 3, 1
-  3	match
-`},
-	{"a+b+", `  0	fail
-  1*	rune1 "a" -> 2
-  2	alt -> 1, 3
-  3	rune1 "b" -> 4
-  4	alt -> 3, 5
-  5	match
-`},
-	{"(a+)(b+)", `  0	fail
-  1*	cap 2 -> 2
-  2	rune1 "a" -> 3
-  3	alt -> 2, 4
-  4	cap 3 -> 5
-  5	cap 4 -> 6
-  6	rune1 "b" -> 7
-  7	alt -> 6, 8
-  8	cap 5 -> 9
-  9	match
-`},
-	{"a+|b+", `  0	fail
-  1	rune1 "a" -> 2
-  2	alt -> 1, 6
-  3	rune1 "b" -> 4
-  4	alt -> 3, 6
-  5*	alt -> 1, 3
-  6	match
-`},
-	{"A[Aa]", `  0	fail
-  1*	rune1 "A" -> 2
-  2	rune "A"/i -> 3
-  3	match
-`},
-	{"(?:(?:^).)", `  0	fail
-  1*	empty 4 -> 2
-  2	anynotnl -> 3
-  3	match
-`},
-}
-
-func TestCompile(t *testing.T) {
-	for _, tt := range compileTests {
-		re, _ := Parse(tt.Regexp, Perl)
-		p, _ := Compile(re)
-		s := p.String()
-		if s != tt.Prog {
-			t.Errorf("compiled %#q:\n--- have\n%s---\n--- want\n%s---", tt.Regexp, s, tt.Prog)
-		}
-	}
-}
-
-func BenchmarkEmptyOpContext(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		var r1 rune = -1
-		for _, r2 := range "foo, bar, baz\nsome input text.\n" {
-			EmptyOpContext(r1, r2)
-			r1 = r2
-		}
-		EmptyOpContext(r1, -1)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/syntax/regexp.go b/third_party/gofrontend/libgo/go/regexp/syntax/regexp.go
deleted file mode 100644
index cea7d9e..0000000
--- a/third_party/gofrontend/libgo/go/regexp/syntax/regexp.go
+++ /dev/null
@@ -1,319 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syntax
-
-// Note to implementers:
-// In this package, re is always a *Regexp and r is always a rune.
-
-import (
-	"bytes"
-	"strconv"
-	"strings"
-	"unicode"
-)
-
-// A Regexp is a node in a regular expression syntax tree.
-type Regexp struct {
-	Op       Op // operator
-	Flags    Flags
-	Sub      []*Regexp  // subexpressions, if any
-	Sub0     [1]*Regexp // storage for short Sub
-	Rune     []rune     // matched runes, for OpLiteral, OpCharClass
-	Rune0    [2]rune    // storage for short Rune
-	Min, Max int        // min, max for OpRepeat
-	Cap      int        // capturing index, for OpCapture
-	Name     string     // capturing name, for OpCapture
-}
-
-// An Op is a single regular expression operator.
-type Op uint8
-
-// Operators are listed in precedence order, tightest binding to weakest.
-// Character class operators are listed simplest to most complex
-// (OpLiteral, OpCharClass, OpAnyCharNotNL, OpAnyChar).
-
-const (
-	OpNoMatch        Op = 1 + iota // matches no strings
-	OpEmptyMatch                   // matches empty string
-	OpLiteral                      // matches Runes sequence
-	OpCharClass                    // matches Runes interpreted as range pair list
-	OpAnyCharNotNL                 // matches any character except newline
-	OpAnyChar                      // matches any character
-	OpBeginLine                    // matches empty string at beginning of line
-	OpEndLine                      // matches empty string at end of line
-	OpBeginText                    // matches empty string at beginning of text
-	OpEndText                      // matches empty string at end of text
-	OpWordBoundary                 // matches word boundary `\b`
-	OpNoWordBoundary               // matches word non-boundary `\B`
-	OpCapture                      // capturing subexpression with index Cap, optional name Name
-	OpStar                         // matches Sub[0] zero or more times
-	OpPlus                         // matches Sub[0] one or more times
-	OpQuest                        // matches Sub[0] zero or one times
-	OpRepeat                       // matches Sub[0] at least Min times, at most Max (Max == -1 is no limit)
-	OpConcat                       // matches concatenation of Subs
-	OpAlternate                    // matches alternation of Subs
-)
-
-const opPseudo Op = 128 // where pseudo-ops start
-
-// Equal returns true if x and y have identical structure.
-func (x *Regexp) Equal(y *Regexp) bool {
-	if x == nil || y == nil {
-		return x == y
-	}
-	if x.Op != y.Op {
-		return false
-	}
-	switch x.Op {
-	case OpEndText:
-		// The parse flags remember whether this is \z or \Z.
-		if x.Flags&WasDollar != y.Flags&WasDollar {
-			return false
-		}
-
-	case OpLiteral, OpCharClass:
-		if len(x.Rune) != len(y.Rune) {
-			return false
-		}
-		for i, r := range x.Rune {
-			if r != y.Rune[i] {
-				return false
-			}
-		}
-
-	case OpAlternate, OpConcat:
-		if len(x.Sub) != len(y.Sub) {
-			return false
-		}
-		for i, sub := range x.Sub {
-			if !sub.Equal(y.Sub[i]) {
-				return false
-			}
-		}
-
-	case OpStar, OpPlus, OpQuest:
-		if x.Flags&NonGreedy != y.Flags&NonGreedy || !x.Sub[0].Equal(y.Sub[0]) {
-			return false
-		}
-
-	case OpRepeat:
-		if x.Flags&NonGreedy != y.Flags&NonGreedy || x.Min != y.Min || x.Max != y.Max || !x.Sub[0].Equal(y.Sub[0]) {
-			return false
-		}
-
-	case OpCapture:
-		if x.Cap != y.Cap || x.Name != y.Name || !x.Sub[0].Equal(y.Sub[0]) {
-			return false
-		}
-	}
-	return true
-}
-
-// writeRegexp writes the Perl syntax for the regular expression re to b.
-func writeRegexp(b *bytes.Buffer, re *Regexp) {
-	switch re.Op {
-	default:
-		b.WriteString("<invalid op" + strconv.Itoa(int(re.Op)) + ">")
-	case OpNoMatch:
-		b.WriteString(`[^\x00-\x{10FFFF}]`)
-	case OpEmptyMatch:
-		b.WriteString(`(?:)`)
-	case OpLiteral:
-		if re.Flags&FoldCase != 0 {
-			b.WriteString(`(?i:`)
-		}
-		for _, r := range re.Rune {
-			escape(b, r, false)
-		}
-		if re.Flags&FoldCase != 0 {
-			b.WriteString(`)`)
-		}
-	case OpCharClass:
-		if len(re.Rune)%2 != 0 {
-			b.WriteString(`[invalid char class]`)
-			break
-		}
-		b.WriteRune('[')
-		if len(re.Rune) == 0 {
-			b.WriteString(`^\x00-\x{10FFFF}`)
-		} else if re.Rune[0] == 0 && re.Rune[len(re.Rune)-1] == unicode.MaxRune {
-			// Contains 0 and MaxRune.  Probably a negated class.
-			// Print the gaps.
-			b.WriteRune('^')
-			for i := 1; i < len(re.Rune)-1; i += 2 {
-				lo, hi := re.Rune[i]+1, re.Rune[i+1]-1
-				escape(b, lo, lo == '-')
-				if lo != hi {
-					b.WriteRune('-')
-					escape(b, hi, hi == '-')
-				}
-			}
-		} else {
-			for i := 0; i < len(re.Rune); i += 2 {
-				lo, hi := re.Rune[i], re.Rune[i+1]
-				escape(b, lo, lo == '-')
-				if lo != hi {
-					b.WriteRune('-')
-					escape(b, hi, hi == '-')
-				}
-			}
-		}
-		b.WriteRune(']')
-	case OpAnyCharNotNL:
-		b.WriteString(`(?-s:.)`)
-	case OpAnyChar:
-		b.WriteString(`(?s:.)`)
-	case OpBeginLine:
-		b.WriteRune('^')
-	case OpEndLine:
-		b.WriteRune('$')
-	case OpBeginText:
-		b.WriteString(`\A`)
-	case OpEndText:
-		if re.Flags&WasDollar != 0 {
-			b.WriteString(`(?-m:$)`)
-		} else {
-			b.WriteString(`\z`)
-		}
-	case OpWordBoundary:
-		b.WriteString(`\b`)
-	case OpNoWordBoundary:
-		b.WriteString(`\B`)
-	case OpCapture:
-		if re.Name != "" {
-			b.WriteString(`(?P<`)
-			b.WriteString(re.Name)
-			b.WriteRune('>')
-		} else {
-			b.WriteRune('(')
-		}
-		if re.Sub[0].Op != OpEmptyMatch {
-			writeRegexp(b, re.Sub[0])
-		}
-		b.WriteRune(')')
-	case OpStar, OpPlus, OpQuest, OpRepeat:
-		if sub := re.Sub[0]; sub.Op > OpCapture || sub.Op == OpLiteral && len(sub.Rune) > 1 {
-			b.WriteString(`(?:`)
-			writeRegexp(b, sub)
-			b.WriteString(`)`)
-		} else {
-			writeRegexp(b, sub)
-		}
-		switch re.Op {
-		case OpStar:
-			b.WriteRune('*')
-		case OpPlus:
-			b.WriteRune('+')
-		case OpQuest:
-			b.WriteRune('?')
-		case OpRepeat:
-			b.WriteRune('{')
-			b.WriteString(strconv.Itoa(re.Min))
-			if re.Max != re.Min {
-				b.WriteRune(',')
-				if re.Max >= 0 {
-					b.WriteString(strconv.Itoa(re.Max))
-				}
-			}
-			b.WriteRune('}')
-		}
-		if re.Flags&NonGreedy != 0 {
-			b.WriteRune('?')
-		}
-	case OpConcat:
-		for _, sub := range re.Sub {
-			if sub.Op == OpAlternate {
-				b.WriteString(`(?:`)
-				writeRegexp(b, sub)
-				b.WriteString(`)`)
-			} else {
-				writeRegexp(b, sub)
-			}
-		}
-	case OpAlternate:
-		for i, sub := range re.Sub {
-			if i > 0 {
-				b.WriteRune('|')
-			}
-			writeRegexp(b, sub)
-		}
-	}
-}
-
-func (re *Regexp) String() string {
-	var b bytes.Buffer
-	writeRegexp(&b, re)
-	return b.String()
-}
-
-const meta = `\.+*?()|[]{}^$`
-
-func escape(b *bytes.Buffer, r rune, force bool) {
-	if unicode.IsPrint(r) {
-		if strings.IndexRune(meta, r) >= 0 || force {
-			b.WriteRune('\\')
-		}
-		b.WriteRune(r)
-		return
-	}
-
-	switch r {
-	case '\a':
-		b.WriteString(`\a`)
-	case '\f':
-		b.WriteString(`\f`)
-	case '\n':
-		b.WriteString(`\n`)
-	case '\r':
-		b.WriteString(`\r`)
-	case '\t':
-		b.WriteString(`\t`)
-	case '\v':
-		b.WriteString(`\v`)
-	default:
-		if r < 0x100 {
-			b.WriteString(`\x`)
-			s := strconv.FormatInt(int64(r), 16)
-			if len(s) == 1 {
-				b.WriteRune('0')
-			}
-			b.WriteString(s)
-			break
-		}
-		b.WriteString(`\x{`)
-		b.WriteString(strconv.FormatInt(int64(r), 16))
-		b.WriteString(`}`)
-	}
-}
-
-// MaxCap walks the regexp to find the maximum capture index.
-func (re *Regexp) MaxCap() int {
-	m := 0
-	if re.Op == OpCapture {
-		m = re.Cap
-	}
-	for _, sub := range re.Sub {
-		if n := sub.MaxCap(); m < n {
-			m = n
-		}
-	}
-	return m
-}
-
-// CapNames walks the regexp to find the names of capturing groups.
-func (re *Regexp) CapNames() []string {
-	names := make([]string, re.MaxCap()+1)
-	re.capNames(names)
-	return names
-}
-
-func (re *Regexp) capNames(names []string) {
-	if re.Op == OpCapture {
-		names[re.Cap] = re.Name
-	}
-	for _, sub := range re.Sub {
-		sub.capNames(names)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/syntax/simplify.go b/third_party/gofrontend/libgo/go/regexp/syntax/simplify.go
deleted file mode 100644
index 7239041..0000000
--- a/third_party/gofrontend/libgo/go/regexp/syntax/simplify.go
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syntax
-
-// Simplify returns a regexp equivalent to re but without counted repetitions
-// and with various other simplifications, such as rewriting /(?:a+)+/ to /a+/.
-// The resulting regexp will execute correctly but its string representation
-// will not produce the same parse tree, because capturing parentheses
-// may have been duplicated or removed.  For example, the simplified form
-// for /(x){1,2}/ is /(x)(x)?/ but both parentheses capture as $1.
-// The returned regexp may share structure with or be the original.
-func (re *Regexp) Simplify() *Regexp {
-	if re == nil {
-		return nil
-	}
-	switch re.Op {
-	case OpCapture, OpConcat, OpAlternate:
-		// Simplify children, building new Regexp if children change.
-		nre := re
-		for i, sub := range re.Sub {
-			nsub := sub.Simplify()
-			if nre == re && nsub != sub {
-				// Start a copy.
-				nre = new(Regexp)
-				*nre = *re
-				nre.Rune = nil
-				nre.Sub = append(nre.Sub0[:0], re.Sub[:i]...)
-			}
-			if nre != re {
-				nre.Sub = append(nre.Sub, nsub)
-			}
-		}
-		return nre
-
-	case OpStar, OpPlus, OpQuest:
-		sub := re.Sub[0].Simplify()
-		return simplify1(re.Op, re.Flags, sub, re)
-
-	case OpRepeat:
-		// Special special case: x{0} matches the empty string
-		// and doesn't even need to consider x.
-		if re.Min == 0 && re.Max == 0 {
-			return &Regexp{Op: OpEmptyMatch}
-		}
-
-		// The fun begins.
-		sub := re.Sub[0].Simplify()
-
-		// x{n,} means at least n matches of x.
-		if re.Max == -1 {
-			// Special case: x{0,} is x*.
-			if re.Min == 0 {
-				return simplify1(OpStar, re.Flags, sub, nil)
-			}
-
-			// Special case: x{1,} is x+.
-			if re.Min == 1 {
-				return simplify1(OpPlus, re.Flags, sub, nil)
-			}
-
-			// General case: x{4,} is xxxx+.
-			nre := &Regexp{Op: OpConcat}
-			nre.Sub = nre.Sub0[:0]
-			for i := 0; i < re.Min-1; i++ {
-				nre.Sub = append(nre.Sub, sub)
-			}
-			nre.Sub = append(nre.Sub, simplify1(OpPlus, re.Flags, sub, nil))
-			return nre
-		}
-
-		// Special case x{0} handled above.
-
-		// Special case: x{1} is just x.
-		if re.Min == 1 && re.Max == 1 {
-			return sub
-		}
-
-		// General case: x{n,m} means n copies of x and m copies of x?
-		// The machine will do less work if we nest the final m copies,
-		// so that x{2,5} = xx(x(x(x)?)?)?
-
-		// Build leading prefix: xx.
-		var prefix *Regexp
-		if re.Min > 0 {
-			prefix = &Regexp{Op: OpConcat}
-			prefix.Sub = prefix.Sub0[:0]
-			for i := 0; i < re.Min; i++ {
-				prefix.Sub = append(prefix.Sub, sub)
-			}
-		}
-
-		// Build and attach suffix: (x(x(x)?)?)?
-		if re.Max > re.Min {
-			suffix := simplify1(OpQuest, re.Flags, sub, nil)
-			for i := re.Min + 1; i < re.Max; i++ {
-				nre2 := &Regexp{Op: OpConcat}
-				nre2.Sub = append(nre2.Sub0[:0], sub, suffix)
-				suffix = simplify1(OpQuest, re.Flags, nre2, nil)
-			}
-			if prefix == nil {
-				return suffix
-			}
-			prefix.Sub = append(prefix.Sub, suffix)
-		}
-		if prefix != nil {
-			return prefix
-		}
-
-		// Some degenerate case like min > max or min < max < 0.
-		// Handle as impossible match.
-		return &Regexp{Op: OpNoMatch}
-	}
-
-	return re
-}
-
-// simplify1 implements Simplify for the unary OpStar,
-// OpPlus, and OpQuest operators.  It returns the simple regexp
-// equivalent to
-//
-//	Regexp{Op: op, Flags: flags, Sub: {sub}}
-//
-// under the assumption that sub is already simple, and
-// without first allocating that structure.  If the regexp
-// to be returned turns out to be equivalent to re, simplify1
-// returns re instead.
-//
-// simplify1 is factored out of Simplify because the implementation
-// for other operators generates these unary expressions.
-// Letting them call simplify1 makes sure the expressions they
-// generate are simple.
-func simplify1(op Op, flags Flags, sub, re *Regexp) *Regexp {
-	// Special case: repeat the empty string as much as
-	// you want, but it's still the empty string.
-	if sub.Op == OpEmptyMatch {
-		return sub
-	}
-	// The operators are idempotent if the flags match.
-	if op == sub.Op && flags&NonGreedy == sub.Flags&NonGreedy {
-		return sub
-	}
-	if re != nil && re.Op == op && re.Flags&NonGreedy == flags&NonGreedy && sub == re.Sub[0] {
-		return re
-	}
-
-	re = &Regexp{Op: op, Flags: flags}
-	re.Sub = append(re.Sub0[:0], sub)
-	return re
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/syntax/simplify_test.go b/third_party/gofrontend/libgo/go/regexp/syntax/simplify_test.go
deleted file mode 100644
index 879eff5..0000000
--- a/third_party/gofrontend/libgo/go/regexp/syntax/simplify_test.go
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syntax
-
-import "testing"
-
-var simplifyTests = []struct {
-	Regexp string
-	Simple string
-}{
-	// Already-simple constructs
-	{`a`, `a`},
-	{`ab`, `ab`},
-	{`a|b`, `[a-b]`},
-	{`ab|cd`, `ab|cd`},
-	{`(ab)*`, `(ab)*`},
-	{`(ab)+`, `(ab)+`},
-	{`(ab)?`, `(ab)?`},
-	{`.`, `(?s:.)`},
-	{`^`, `^`},
-	{`$`, `$`},
-	{`[ac]`, `[ac]`},
-	{`[^ac]`, `[^ac]`},
-
-	// Posix character classes
-	{`[[:alnum:]]`, `[0-9A-Za-z]`},
-	{`[[:alpha:]]`, `[A-Za-z]`},
-	{`[[:blank:]]`, `[\t ]`},
-	{`[[:cntrl:]]`, `[\x00-\x1f\x7f]`},
-	{`[[:digit:]]`, `[0-9]`},
-	{`[[:graph:]]`, `[!-~]`},
-	{`[[:lower:]]`, `[a-z]`},
-	{`[[:print:]]`, `[ -~]`},
-	{`[[:punct:]]`, "[!-/:-@\\[-`\\{-~]"},
-	{`[[:space:]]`, `[\t-\r ]`},
-	{`[[:upper:]]`, `[A-Z]`},
-	{`[[:xdigit:]]`, `[0-9A-Fa-f]`},
-
-	// Perl character classes
-	{`\d`, `[0-9]`},
-	{`\s`, `[\t-\n\f-\r ]`},
-	{`\w`, `[0-9A-Z_a-z]`},
-	{`\D`, `[^0-9]`},
-	{`\S`, `[^\t-\n\f-\r ]`},
-	{`\W`, `[^0-9A-Z_a-z]`},
-	{`[\d]`, `[0-9]`},
-	{`[\s]`, `[\t-\n\f-\r ]`},
-	{`[\w]`, `[0-9A-Z_a-z]`},
-	{`[\D]`, `[^0-9]`},
-	{`[\S]`, `[^\t-\n\f-\r ]`},
-	{`[\W]`, `[^0-9A-Z_a-z]`},
-
-	// Posix repetitions
-	{`a{1}`, `a`},
-	{`a{2}`, `aa`},
-	{`a{5}`, `aaaaa`},
-	{`a{0,1}`, `a?`},
-	// The next three are illegible because Simplify inserts (?:)
-	// parens instead of () parens to avoid creating extra
-	// captured subexpressions.  The comments show a version with fewer parens.
-	{`(a){0,2}`, `(?:(a)(a)?)?`},                       //       (aa?)?
-	{`(a){0,4}`, `(?:(a)(?:(a)(?:(a)(a)?)?)?)?`},       //   (a(a(aa?)?)?)?
-	{`(a){2,6}`, `(a)(a)(?:(a)(?:(a)(?:(a)(a)?)?)?)?`}, // aa(a(a(aa?)?)?)?
-	{`a{0,2}`, `(?:aa?)?`},                             //       (aa?)?
-	{`a{0,4}`, `(?:a(?:a(?:aa?)?)?)?`},                 //   (a(a(aa?)?)?)?
-	{`a{2,6}`, `aa(?:a(?:a(?:aa?)?)?)?`},               // aa(a(a(aa?)?)?)?
-	{`a{0,}`, `a*`},
-	{`a{1,}`, `a+`},
-	{`a{2,}`, `aa+`},
-	{`a{5,}`, `aaaaa+`},
-
-	// Test that operators simplify their arguments.
-	{`(?:a{1,}){1,}`, `a+`},
-	{`(a{1,}b{1,})`, `(a+b+)`},
-	{`a{1,}|b{1,}`, `a+|b+`},
-	{`(?:a{1,})*`, `(?:a+)*`},
-	{`(?:a{1,})+`, `a+`},
-	{`(?:a{1,})?`, `(?:a+)?`},
-	{``, `(?:)`},
-	{`a{0}`, `(?:)`},
-
-	// Character class simplification
-	{`[ab]`, `[a-b]`},
-	{`[a-za-za-z]`, `[a-z]`},
-	{`[A-Za-zA-Za-z]`, `[A-Za-z]`},
-	{`[ABCDEFGH]`, `[A-H]`},
-	{`[AB-CD-EF-GH]`, `[A-H]`},
-	{`[W-ZP-XE-R]`, `[E-Z]`},
-	{`[a-ee-gg-m]`, `[a-m]`},
-	{`[a-ea-ha-m]`, `[a-m]`},
-	{`[a-ma-ha-e]`, `[a-m]`},
-	{`[a-zA-Z0-9 -~]`, `[ -~]`},
-
-	// Empty character classes
-	{`[^[:cntrl:][:^cntrl:]]`, `[^\x00-\x{10FFFF}]`},
-
-	// Full character classes
-	{`[[:cntrl:][:^cntrl:]]`, `(?s:.)`},
-
-	// Unicode case folding.
-	{`(?i)A`, `(?i:A)`},
-	{`(?i)a`, `(?i:A)`},
-	{`(?i)[A]`, `(?i:A)`},
-	{`(?i)[a]`, `(?i:A)`},
-	{`(?i)K`, `(?i:K)`},
-	{`(?i)k`, `(?i:K)`},
-	{`(?i)\x{212a}`, "(?i:K)"},
-	{`(?i)[K]`, "[Kk\u212A]"},
-	{`(?i)[k]`, "[Kk\u212A]"},
-	{`(?i)[\x{212a}]`, "[Kk\u212A]"},
-	{`(?i)[a-z]`, "[A-Za-z\u017F\u212A]"},
-	{`(?i)[\x00-\x{FFFD}]`, "[\\x00-\uFFFD]"},
-	{`(?i)[\x00-\x{10FFFF}]`, `(?s:.)`},
-
-	// Empty string as a regular expression.
-	// The empty string must be preserved inside parens in order
-	// to make submatches work right, so these tests are less
-	// interesting than they might otherwise be.  String inserts
-	// explicit (?:) in place of non-parenthesized empty strings,
-	// to make them easier to spot for other parsers.
-	{`(a|b|)`, `([a-b]|(?:))`},
-	{`(|)`, `()`},
-	{`a()`, `a()`},
-	{`(()|())`, `(()|())`},
-	{`(a|)`, `(a|(?:))`},
-	{`ab()cd()`, `ab()cd()`},
-	{`()`, `()`},
-	{`()*`, `()*`},
-	{`()+`, `()+`},
-	{`()?`, `()?`},
-	{`(){0}`, `(?:)`},
-	{`(){1}`, `()`},
-	{`(){1,}`, `()+`},
-	{`(){0,2}`, `(?:()()?)?`},
-}
-
-func TestSimplify(t *testing.T) {
-	for _, tt := range simplifyTests {
-		re, err := Parse(tt.Regexp, MatchNL|Perl&^OneLine)
-		if err != nil {
-			t.Errorf("Parse(%#q) = error %v", tt.Regexp, err)
-			continue
-		}
-		s := re.Simplify().String()
-		if s != tt.Simple {
-			t.Errorf("Simplify(%#q) = %#q, want %#q", tt.Regexp, s, tt.Simple)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/regexp/testdata/README b/third_party/gofrontend/libgo/go/regexp/testdata/README
deleted file mode 100644
index 58cec82..0000000
--- a/third_party/gofrontend/libgo/go/regexp/testdata/README
+++ /dev/null
@@ -1,24 +0,0 @@
-AT&T POSIX Test Files
-See textregex.c for copyright + license.
-
-testregex.c	http://www2.research.att.com/~gsf/testregex/testregex.c
-basic.dat	http://www2.research.att.com/~gsf/testregex/basic.dat
-nullsubexpr.dat	http://www2.research.att.com/~gsf/testregex/nullsubexpr.dat
-repetition.dat	http://www2.research.att.com/~gsf/testregex/repetition.dat
-
-The test data has been edited to reflect RE2/Go differences:
-  * In a star of a possibly empty match like (a*)* matching x,
-    the no match case runs the starred subexpression zero times,
-    not once.  This is consistent with (a*)* matching a, which
-    runs the starred subexpression one time, not twice.
-  * The submatch choice is first match, not the POSIX rule.
-
-Such changes are marked with 'RE2/Go'.
-
-
-RE2 Test Files
-
-re2-exhaustive.txt.bz2 and re2-search.txt are built by running
-'make log' in the RE2 distribution https://github.com/google/re2/
-
-The exhaustive file is compressed because it is huge.
diff --git a/third_party/gofrontend/libgo/go/regexp/testdata/basic.dat b/third_party/gofrontend/libgo/go/regexp/testdata/basic.dat
deleted file mode 100644
index 7859290..0000000
--- a/third_party/gofrontend/libgo/go/regexp/testdata/basic.dat
+++ /dev/null
@@ -1,221 +0,0 @@
-NOTE	all standard compliant implementations should pass these : 2002-05-31
-
-BE	abracadabra$	abracadabracadabra	(7,18)
-BE	a...b		abababbb		(2,7)
-BE	XXXXXX		..XXXXXX		(2,8)
-E	\)		()	(1,2)
-BE	a]		a]a	(0,2)
-B	}		}	(0,1)
-E	\}		}	(0,1)
-BE	\]		]	(0,1)
-B	]		]	(0,1)
-E	]		]	(0,1)
-B	{		{	(0,1)
-B	}		}	(0,1)
-BE	^a		ax	(0,1)
-BE	\^a		a^a	(1,3)
-BE	a\^		a^	(0,2)
-BE	a$		aa	(1,2)
-BE	a\$		a$	(0,2)
-BE	^$		NULL	(0,0)
-E	$^		NULL	(0,0)
-E	a($)		aa	(1,2)(2,2)
-E	a*(^a)		aa	(0,1)(0,1)
-E	(..)*(...)*		a	(0,0)
-E	(..)*(...)*		abcd	(0,4)(2,4)
-E	(ab|a)(bc|c)		abc	(0,3)(0,2)(2,3)
-E	(ab)c|abc		abc	(0,3)(0,2)
-E	a{0}b		ab			(1,2)
-E	(a*)(b?)(b+)b{3}	aaabbbbbbb	(0,10)(0,3)(3,4)(4,7)
-E	(a*)(b{0,1})(b{1,})b{3}	aaabbbbbbb	(0,10)(0,3)(3,4)(4,7)
-E	a{9876543210}	NULL	BADBR
-E	((a|a)|a)			a	(0,1)(0,1)(0,1)
-E	(a*)(a|aa)			aaaa	(0,4)(0,3)(3,4)
-E	a*(a.|aa)			aaaa	(0,4)(2,4)
-E	a(b)|c(d)|a(e)f			aef	(0,3)(?,?)(?,?)(1,2)
-E	(a|b)?.*			b	(0,1)(0,1)
-E	(a|b)c|a(b|c)			ac	(0,2)(0,1)
-E	(a|b)c|a(b|c)			ab	(0,2)(?,?)(1,2)
-E	(a|b)*c|(a|ab)*c		abc	(0,3)(1,2)
-E	(a|b)*c|(a|ab)*c		xc	(1,2)
-E	(.a|.b).*|.*(.a|.b)		xa	(0,2)(0,2)
-E	a?(ab|ba)ab			abab	(0,4)(0,2)
-E	a?(ac{0}b|ba)ab			abab	(0,4)(0,2)
-E	ab|abab				abbabab	(0,2)
-E	aba|bab|bba			baaabbbaba	(5,8)
-E	aba|bab				baaabbbaba	(6,9)
-E	(aa|aaa)*|(a|aaaaa)		aa	(0,2)(0,2)
-E	(a.|.a.)*|(a|.a...)		aa	(0,2)(0,2)
-E	ab|a				xabc	(1,3)
-E	ab|a				xxabc	(2,4)
-Ei	(Ab|cD)*			aBcD	(0,4)(2,4)
-BE	[^-]			--a		(2,3)
-BE	[a-]*			--a		(0,3)
-BE	[a-m-]*			--amoma--	(0,4)
-E	:::1:::0:|:::1:1:0:	:::0:::1:::1:::0:	(8,17)
-E	:::1:::0:|:::1:1:1:	:::0:::1:::1:::0:	(8,17)
-{E	[[:upper:]]		A		(0,1)	[[<element>]] not supported
-E	[[:lower:]]+		`az{		(1,3)
-E	[[:upper:]]+		@AZ[		(1,3)
-# No collation in Go
-#BE	[[-]]			[[-]]		(2,4)
-#BE	[[.NIL.]]	NULL	ECOLLATE
-#BE	[[=aleph=]]	NULL	ECOLLATE
-}
-BE$	\n		\n	(0,1)
-BEn$	\n		\n	(0,1)
-BE$	[^a]		\n	(0,1)
-BE$	\na		\na	(0,2)
-E	(a)(b)(c)	abc	(0,3)(0,1)(1,2)(2,3)
-BE	xxx		xxx	(0,3)
-E1	(^|[ (,;])((([Ff]eb[^ ]* *|0*2/|\* */?)0*[6-7]))([^0-9]|$)	feb 6,	(0,6)
-E1	(^|[ (,;])((([Ff]eb[^ ]* *|0*2/|\* */?)0*[6-7]))([^0-9]|$)	2/7	(0,3)
-E1	(^|[ (,;])((([Ff]eb[^ ]* *|0*2/|\* */?)0*[6-7]))([^0-9]|$)	feb 1,Feb 6	(5,11)
-E3	((((((((((((((((((((((((((((((x))))))))))))))))))))))))))))))	x	(0,1)(0,1)(0,1)
-E3	((((((((((((((((((((((((((((((x))))))))))))))))))))))))))))))*	xx	(0,2)(1,2)(1,2)
-E	a?(ab|ba)*	ababababababababababababababababababababababababababababababababababababababababa	(0,81)(79,81)
-E	abaa|abbaa|abbbaa|abbbbaa	ababbabbbabbbabbbbabbbbaa	(18,25)
-E	abaa|abbaa|abbbaa|abbbbaa	ababbabbbabbbabbbbabaa	(18,22)
-E	aaac|aabc|abac|abbc|baac|babc|bbac|bbbc	baaabbbabac	(7,11)
-BE$	.*			\x01\xff	(0,2)
-E	aaaa|bbbb|cccc|ddddd|eeeeee|fffffff|gggg|hhhh|iiiii|jjjjj|kkkkk|llll		XaaaXbbbXcccXdddXeeeXfffXgggXhhhXiiiXjjjXkkkXlllXcbaXaaaa	(53,57)
-L	aaaa\nbbbb\ncccc\nddddd\neeeeee\nfffffff\ngggg\nhhhh\niiiii\njjjjj\nkkkkk\nllll		XaaaXbbbXcccXdddXeeeXfffXgggXhhhXiiiXjjjXkkkXlllXcbaXaaaa	NOMATCH
-E	a*a*a*a*a*b		aaaaaaaaab	(0,10)
-BE	^			NULL		(0,0)
-BE	$			NULL		(0,0)
-BE	^$			NULL		(0,0)
-BE	^a$			a		(0,1)
-BE	abc			abc		(0,3)
-BE	abc			xabcy		(1,4)
-BE	abc			ababc		(2,5)
-BE	ab*c			abc		(0,3)
-BE	ab*bc			abc		(0,3)
-BE	ab*bc			abbc		(0,4)
-BE	ab*bc			abbbbc		(0,6)
-E	ab+bc			abbc		(0,4)
-E	ab+bc			abbbbc		(0,6)
-E	ab?bc			abbc		(0,4)
-E	ab?bc			abc		(0,3)
-E	ab?c			abc		(0,3)
-BE	^abc$			abc		(0,3)
-BE	^abc			abcc		(0,3)
-BE	abc$			aabc		(1,4)
-BE	^			abc		(0,0)
-BE	$			abc		(3,3)
-BE	a.c			abc		(0,3)
-BE	a.c			axc		(0,3)
-BE	a.*c			axyzc		(0,5)
-BE	a[bc]d			abd		(0,3)
-BE	a[b-d]e			ace		(0,3)
-BE	a[b-d]			aac		(1,3)
-BE	a[-b]			a-		(0,2)
-BE	a[b-]			a-		(0,2)
-BE	a]			a]		(0,2)
-BE	a[]]b			a]b		(0,3)
-BE	a[^bc]d			aed		(0,3)
-BE	a[^-b]c			adc		(0,3)
-BE	a[^]b]c			adc		(0,3)
-E	ab|cd			abc		(0,2)
-E	ab|cd			abcd		(0,2)
-E	a\(b			a(b		(0,3)
-E	a\(*b			ab		(0,2)
-E	a\(*b			a((b		(0,4)
-E	((a))			abc		(0,1)(0,1)(0,1)
-E	(a)b(c)			abc		(0,3)(0,1)(2,3)
-E	a+b+c			aabbabc		(4,7)
-E	a*			aaa		(0,3)
-#E	(a*)*			-		(0,0)(0,0)
-E	(a*)*			-		(0,0)(?,?)	RE2/Go
-E	(a*)+			-		(0,0)(0,0)
-#E	(a*|b)*			-		(0,0)(0,0)
-E	(a*|b)*			-		(0,0)(?,?)	RE2/Go
-E	(a+|b)*			ab		(0,2)(1,2)
-E	(a+|b)+			ab		(0,2)(1,2)
-E	(a+|b)?			ab		(0,1)(0,1)
-BE	[^ab]*			cde		(0,3)
-#E	(^)*			-		(0,0)(0,0)
-E	(^)*			-		(0,0)(?,?)	RE2/Go
-BE	a*			NULL		(0,0)
-E	([abc])*d		abbbcd		(0,6)(4,5)
-E	([abc])*bcd		abcd		(0,4)(0,1)
-E	a|b|c|d|e		e		(0,1)
-E	(a|b|c|d|e)f		ef		(0,2)(0,1)
-#E	((a*|b))*		-		(0,0)(0,0)(0,0)
-E	((a*|b))*		-		(0,0)(?,?)(?,?)	RE2/Go
-BE	abcd*efg		abcdefg		(0,7)
-BE	ab*			xabyabbbz	(1,3)
-BE	ab*			xayabbbz	(1,2)
-E	(ab|cd)e		abcde		(2,5)(2,4)
-BE	[abhgefdc]ij		hij		(0,3)
-E	(a|b)c*d		abcd		(1,4)(1,2)
-E	(ab|ab*)bc		abc		(0,3)(0,1)
-E	a([bc]*)c*		abc		(0,3)(1,3)
-E	a([bc]*)(c*d)		abcd		(0,4)(1,3)(3,4)
-E	a([bc]+)(c*d)		abcd		(0,4)(1,3)(3,4)
-E	a([bc]*)(c+d)		abcd		(0,4)(1,2)(2,4)
-E	a[bcd]*dcdcde		adcdcde		(0,7)
-E	(ab|a)b*c		abc		(0,3)(0,2)
-E	((a)(b)c)(d)		abcd		(0,4)(0,3)(0,1)(1,2)(3,4)
-BE	[A-Za-z_][A-Za-z0-9_]*	alpha		(0,5)
-E	^a(bc+|b[eh])g|.h$	abh		(1,3)
-E	(bc+d$|ef*g.|h?i(j|k))	effgz		(0,5)(0,5)
-E	(bc+d$|ef*g.|h?i(j|k))	ij		(0,2)(0,2)(1,2)
-E	(bc+d$|ef*g.|h?i(j|k))	reffgz		(1,6)(1,6)
-E	(((((((((a)))))))))	a		(0,1)(0,1)(0,1)(0,1)(0,1)(0,1)(0,1)(0,1)(0,1)(0,1)
-BE	multiple words		multiple words yeah	(0,14)
-E	(.*)c(.*)		abcde		(0,5)(0,2)(3,5)
-BE	abcd			abcd		(0,4)
-E	a(bc)d			abcd		(0,4)(1,3)
-E	a[-]?c		ac		(0,3)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Muammar Qaddafi	(0,15)(?,?)(10,12)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Mo'ammar Gadhafi	(0,16)(?,?)(11,13)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Muammar Kaddafi	(0,15)(?,?)(10,12)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Muammar Qadhafi	(0,15)(?,?)(10,12)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Muammar Gadafi	(0,14)(?,?)(10,11)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Mu'ammar Qadafi	(0,15)(?,?)(11,12)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Moamar Gaddafi	(0,14)(?,?)(9,11)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Mu'ammar Qadhdhafi	(0,18)(?,?)(13,15)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Muammar Khaddafi	(0,16)(?,?)(11,13)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Muammar Ghaddafy	(0,16)(?,?)(11,13)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Muammar Ghadafi	(0,15)(?,?)(11,12)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Muammar Ghaddafi	(0,16)(?,?)(11,13)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Muamar Kaddafi	(0,14)(?,?)(9,11)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Muammar Quathafi	(0,16)(?,?)(11,13)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Muammar Gheddafi	(0,16)(?,?)(11,13)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Moammar Khadafy	(0,15)(?,?)(11,12)
-E	M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]	Moammar Qudhafi	(0,15)(?,?)(10,12)
-E	a+(b|c)*d+		aabcdd			(0,6)(3,4)
-E	^.+$			vivi			(0,4)
-E	^(.+)$			vivi			(0,4)(0,4)
-E	^([^!.]+).att.com!(.+)$	gryphon.att.com!eby	(0,19)(0,7)(16,19)
-E	^([^!]+!)?([^!]+)$	bas			(0,3)(?,?)(0,3)
-E	^([^!]+!)?([^!]+)$	bar!bas			(0,7)(0,4)(4,7)
-E	^([^!]+!)?([^!]+)$	foo!bas			(0,7)(0,4)(4,7)
-E	^.+!([^!]+!)([^!]+)$	foo!bar!bas		(0,11)(4,8)(8,11)
-E	((foo)|(bar))!bas	bar!bas			(0,7)(0,3)(?,?)(0,3)
-E	((foo)|(bar))!bas	foo!bar!bas		(4,11)(4,7)(?,?)(4,7)
-E	((foo)|(bar))!bas	foo!bas			(0,7)(0,3)(0,3)
-E	((foo)|bar)!bas		bar!bas			(0,7)(0,3)
-E	((foo)|bar)!bas		foo!bar!bas		(4,11)(4,7)
-E	((foo)|bar)!bas		foo!bas			(0,7)(0,3)(0,3)
-E	(foo|(bar))!bas		bar!bas			(0,7)(0,3)(0,3)
-E	(foo|(bar))!bas		foo!bar!bas		(4,11)(4,7)(4,7)
-E	(foo|(bar))!bas		foo!bas			(0,7)(0,3)
-E	(foo|bar)!bas		bar!bas			(0,7)(0,3)
-E	(foo|bar)!bas		foo!bar!bas		(4,11)(4,7)
-E	(foo|bar)!bas		foo!bas			(0,7)(0,3)
-E	^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$	foo!bar!bas	(0,11)(0,11)(?,?)(?,?)(4,8)(8,11)
-E	^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$	bas		(0,3)(?,?)(0,3)
-E	^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$	bar!bas		(0,7)(0,4)(4,7)
-E	^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$	foo!bar!bas	(0,11)(?,?)(?,?)(4,8)(8,11)
-E	^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$	foo!bas		(0,7)(0,4)(4,7)
-E	^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$	bas		(0,3)(0,3)(?,?)(0,3)
-E	^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$	bar!bas		(0,7)(0,7)(0,4)(4,7)
-E	^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$	foo!bar!bas	(0,11)(0,11)(?,?)(?,?)(4,8)(8,11)
-E	^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$	foo!bas		(0,7)(0,7)(0,4)(4,7)
-E	.*(/XXX).*			/XXX			(0,4)(0,4)
-E	.*(\\XXX).*			\XXX			(0,4)(0,4)
-E	\\XXX				\XXX			(0,4)
-E	.*(/000).*			/000			(0,4)(0,4)
-E	.*(\\000).*			\000			(0,4)(0,4)
-E	\\000				\000			(0,4)
diff --git a/third_party/gofrontend/libgo/go/regexp/testdata/nullsubexpr.dat b/third_party/gofrontend/libgo/go/regexp/testdata/nullsubexpr.dat
deleted file mode 100644
index 2e18fbb..0000000
--- a/third_party/gofrontend/libgo/go/regexp/testdata/nullsubexpr.dat
+++ /dev/null
@@ -1,79 +0,0 @@
-NOTE	null subexpression matches : 2002-06-06
-
-E	(a*)*		a		(0,1)(0,1)
-#E	SAME		x		(0,0)(0,0)
-E	SAME		x		(0,0)(?,?)	RE2/Go
-E	SAME		aaaaaa		(0,6)(0,6)
-E	SAME		aaaaaax		(0,6)(0,6)
-E	(a*)+		a		(0,1)(0,1)
-E	SAME		x		(0,0)(0,0)
-E	SAME		aaaaaa		(0,6)(0,6)
-E	SAME		aaaaaax		(0,6)(0,6)
-E	(a+)*		a		(0,1)(0,1)
-E	SAME		x		(0,0)
-E	SAME		aaaaaa		(0,6)(0,6)
-E	SAME		aaaaaax		(0,6)(0,6)
-E	(a+)+		a		(0,1)(0,1)
-E	SAME		x		NOMATCH
-E	SAME		aaaaaa		(0,6)(0,6)
-E	SAME		aaaaaax		(0,6)(0,6)
-
-E	([a]*)*		a		(0,1)(0,1)
-#E	SAME		x		(0,0)(0,0)
-E	SAME		x		(0,0)(?,?)	RE2/Go
-E	SAME		aaaaaa		(0,6)(0,6)
-E	SAME		aaaaaax		(0,6)(0,6)
-E	([a]*)+		a		(0,1)(0,1)
-E	SAME		x		(0,0)(0,0)
-E	SAME		aaaaaa		(0,6)(0,6)
-E	SAME		aaaaaax		(0,6)(0,6)
-E	([^b]*)*	a		(0,1)(0,1)
-#E	SAME		b		(0,0)(0,0)
-E	SAME		b		(0,0)(?,?)	RE2/Go
-E	SAME		aaaaaa		(0,6)(0,6)
-E	SAME		aaaaaab		(0,6)(0,6)
-E	([ab]*)*	a		(0,1)(0,1)
-E	SAME		aaaaaa		(0,6)(0,6)
-E	SAME		ababab		(0,6)(0,6)
-E	SAME		bababa		(0,6)(0,6)
-E	SAME		b		(0,1)(0,1)
-E	SAME		bbbbbb		(0,6)(0,6)
-E	SAME		aaaabcde	(0,5)(0,5)
-E	([^a]*)*	b		(0,1)(0,1)
-E	SAME		bbbbbb		(0,6)(0,6)
-#E	SAME		aaaaaa		(0,0)(0,0)
-E	SAME		aaaaaa		(0,0)(?,?)	RE2/Go
-E	([^ab]*)*	ccccxx		(0,6)(0,6)
-#E	SAME		ababab		(0,0)(0,0)
-E	SAME		ababab		(0,0)(?,?)	RE2/Go
-
-E	((z)+|a)*	zabcde		(0,2)(1,2)
-
-#{E	a+?		aaaaaa		(0,1)	no *? +? mimimal match ops
-#E	(a)		aaa		(0,1)(0,1)
-#E	(a*?)		aaa		(0,0)(0,0)
-#E	(a)*?		aaa		(0,0)
-#E	(a*?)*?		aaa		(0,0)
-#}
-
-B	\(a*\)*\(x\)		x	(0,1)(0,0)(0,1)
-B	\(a*\)*\(x\)		ax	(0,2)(0,1)(1,2)
-B	\(a*\)*\(x\)		axa	(0,2)(0,1)(1,2)
-B	\(a*\)*\(x\)\(\1\)	x	(0,1)(0,0)(0,1)(1,1)
-B	\(a*\)*\(x\)\(\1\)	ax	(0,2)(1,1)(1,2)(2,2)
-B	\(a*\)*\(x\)\(\1\)	axa	(0,3)(0,1)(1,2)(2,3)
-B	\(a*\)*\(x\)\(\1\)\(x\)	axax	(0,4)(0,1)(1,2)(2,3)(3,4)
-B	\(a*\)*\(x\)\(\1\)\(x\)	axxa	(0,3)(1,1)(1,2)(2,2)(2,3)
-
-#E	(a*)*(x)		x	(0,1)(0,0)(0,1)
-E	(a*)*(x)		x	(0,1)(?,?)(0,1)	RE2/Go
-E	(a*)*(x)		ax	(0,2)(0,1)(1,2)
-E	(a*)*(x)		axa	(0,2)(0,1)(1,2)
-
-E	(a*)+(x)		x	(0,1)(0,0)(0,1)
-E	(a*)+(x)		ax	(0,2)(0,1)(1,2)
-E	(a*)+(x)		axa	(0,2)(0,1)(1,2)
-
-E	(a*){2}(x)		x	(0,1)(0,0)(0,1)
-E	(a*){2}(x)		ax	(0,2)(1,1)(1,2)
-E	(a*){2}(x)		axa	(0,2)(1,1)(1,2)
diff --git a/third_party/gofrontend/libgo/go/regexp/testdata/re2-exhaustive.txt.bz2 b/third_party/gofrontend/libgo/go/regexp/testdata/re2-exhaustive.txt.bz2
deleted file mode 100644
index a357f28..0000000
--- a/third_party/gofrontend/libgo/go/regexp/testdata/re2-exhaustive.txt.bz2
+++ /dev/null
Binary files differ
diff --git a/third_party/gofrontend/libgo/go/regexp/testdata/re2-search.txt b/third_party/gofrontend/libgo/go/regexp/testdata/re2-search.txt
deleted file mode 100644
index f648e55..0000000
--- a/third_party/gofrontend/libgo/go/regexp/testdata/re2-search.txt
+++ /dev/null
@@ -1,3667 +0,0 @@
-# RE2 basic search tests built by make log
-# Thu Sep 8 13:43:43 EDT 2011
-Regexp.SearchTests
-strings
-""
-"a"
-regexps
-"a"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:a)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:a)"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:a)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"zyzzyva"
-regexps
-"a"
--;-;-;-
--;6-7;-;6-7
-"^(?:a)$"
--;-;-;-
--;-;-;-
-"^(?:a)"
--;-;-;-
--;-;-;-
-"(?:a)$"
--;-;-;-
--;6-7;-;6-7
-strings
-""
-"aa"
-regexps
-"a+"
--;-;-;-
-0-2;0-2;0-2;0-2
-"^(?:a+)$"
--;-;-;-
-0-2;0-2;0-2;0-2
-"^(?:a+)"
--;-;-;-
-0-2;0-2;0-2;0-2
-"(?:a+)$"
--;-;-;-
-0-2;0-2;0-2;0-2
-strings
-""
-"ab"
-regexps
-"(a+|b)+"
--;-;-;-
-0-2 1-2;0-2 1-2;0-2 1-2;0-2 1-2
-"^(?:(a+|b)+)$"
--;-;-;-
-0-2 1-2;0-2 1-2;0-2 1-2;0-2 1-2
-"^(?:(a+|b)+)"
--;-;-;-
-0-2 1-2;0-2 1-2;0-2 1-2;0-2 1-2
-"(?:(a+|b)+)$"
--;-;-;-
-0-2 1-2;0-2 1-2;0-2 1-2;0-2 1-2
-strings
-""
-"xabcdx"
-regexps
-"ab|cd"
--;-;-;-
--;1-3;-;1-3
-"^(?:ab|cd)$"
--;-;-;-
--;-;-;-
-"^(?:ab|cd)"
--;-;-;-
--;-;-;-
-"(?:ab|cd)$"
--;-;-;-
--;-;-;-
-strings
-""
-"hello\ngoodbye\n"
-regexps
-"h.*od?"
--;-;-;-
--;0-5;-;0-5
-"^(?:h.*od?)$"
--;-;-;-
--;-;-;-
-"^(?:h.*od?)"
--;-;-;-
--;0-5;-;0-5
-"(?:h.*od?)$"
--;-;-;-
--;-;-;-
-strings
-""
-"hello\ngoodbye\n"
-regexps
-"h.*o"
--;-;-;-
--;0-5;-;0-5
-"^(?:h.*o)$"
--;-;-;-
--;-;-;-
-"^(?:h.*o)"
--;-;-;-
--;0-5;-;0-5
-"(?:h.*o)$"
--;-;-;-
--;-;-;-
-strings
-""
-"goodbye\nhello\n"
-regexps
-"h.*o"
--;-;-;-
--;8-13;-;8-13
-"^(?:h.*o)$"
--;-;-;-
--;-;-;-
-"^(?:h.*o)"
--;-;-;-
--;-;-;-
-"(?:h.*o)$"
--;-;-;-
--;-;-;-
-strings
-""
-"hello world"
-regexps
-"h.*o"
--;-;-;-
--;0-8;-;0-8
-"^(?:h.*o)$"
--;-;-;-
--;-;-;-
-"^(?:h.*o)"
--;-;-;-
--;0-8;-;0-8
-"(?:h.*o)$"
--;-;-;-
--;-;-;-
-strings
-""
-"othello, world"
-regexps
-"h.*o"
--;-;-;-
--;2-11;-;2-11
-"^(?:h.*o)$"
--;-;-;-
--;-;-;-
-"^(?:h.*o)"
--;-;-;-
--;-;-;-
-"(?:h.*o)$"
--;-;-;-
--;-;-;-
-strings
-""
-"aaaaaaa"
-regexps
-"[^\\s\\S]"
--;-;-;-
--;-;-;-
-"^(?:[^\\s\\S])$"
--;-;-;-
--;-;-;-
-"^(?:[^\\s\\S])"
--;-;-;-
--;-;-;-
-"(?:[^\\s\\S])$"
--;-;-;-
--;-;-;-
-strings
-""
-"aaaaaaa"
-regexps
-"a"
--;-;-;-
--;0-1;-;0-1
-"^(?:a)$"
--;-;-;-
--;-;-;-
-"^(?:a)"
--;-;-;-
--;0-1;-;0-1
-"(?:a)$"
--;-;-;-
--;6-7;-;6-7
-strings
-""
-"aaaaaaa"
-regexps
-"a*"
-0-0;0-0;0-0;0-0
-0-7;0-7;0-7;0-7
-"^(?:a*)$"
-0-0;0-0;0-0;0-0
-0-7;0-7;0-7;0-7
-"^(?:a*)"
-0-0;0-0;0-0;0-0
-0-7;0-7;0-7;0-7
-"(?:a*)$"
-0-0;0-0;0-0;0-0
-0-7;0-7;0-7;0-7
-strings
-""
-""
-regexps
-"a*"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:a*)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:a*)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:a*)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-""
-regexps
-"a*"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:a*)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:a*)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:a*)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-"xabcdx"
-regexps
-"ab|cd"
--;-;-;-
--;1-3;-;1-3
-"^(?:ab|cd)$"
--;-;-;-
--;-;-;-
-"^(?:ab|cd)"
--;-;-;-
--;-;-;-
-"(?:ab|cd)$"
--;-;-;-
--;-;-;-
-strings
-""
-"cab"
-regexps
-"a"
--;-;-;-
--;1-2;-;1-2
-"^(?:a)$"
--;-;-;-
--;-;-;-
-"^(?:a)"
--;-;-;-
--;-;-;-
-"(?:a)$"
--;-;-;-
--;-;-;-
-strings
-""
-"cab"
-regexps
-"a*b"
--;-;-;-
--;1-3;-;1-3
-"^(?:a*b)$"
--;-;-;-
--;-;-;-
-"^(?:a*b)"
--;-;-;-
--;-;-;-
-"(?:a*b)$"
--;-;-;-
--;1-3;-;1-3
-strings
-""
-"x"
-regexps
-"((((((((((((((((((((x))))))))))))))))))))"
--;-;-;-
-0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1;0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1;0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1;0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1
-"^(?:((((((((((((((((((((x)))))))))))))))))))))$"
--;-;-;-
-0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1;0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1;0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1;0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1
-"^(?:((((((((((((((((((((x)))))))))))))))))))))"
--;-;-;-
-0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1;0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1;0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1;0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1
-"(?:((((((((((((((((((((x)))))))))))))))))))))$"
--;-;-;-
-0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1;0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1;0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1;0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1
-strings
-""
-"xxxabcdxxx"
-regexps
-"[abcd]"
--;-;-;-
--;3-4;-;3-4
-"^(?:[abcd])$"
--;-;-;-
--;-;-;-
-"^(?:[abcd])"
--;-;-;-
--;-;-;-
-"(?:[abcd])$"
--;-;-;-
--;-;-;-
-strings
-""
-"xxxabcdxxx"
-regexps
-"[^x]"
--;-;-;-
--;3-4;-;3-4
-"^(?:[^x])$"
--;-;-;-
--;-;-;-
-"^(?:[^x])"
--;-;-;-
--;-;-;-
-"(?:[^x])$"
--;-;-;-
--;-;-;-
-strings
-""
-"xxxabcdxxx"
-regexps
-"[abcd]+"
--;-;-;-
--;3-7;-;3-7
-"^(?:[abcd]+)$"
--;-;-;-
--;-;-;-
-"^(?:[abcd]+)"
--;-;-;-
--;-;-;-
-"(?:[abcd]+)$"
--;-;-;-
--;-;-;-
-strings
-""
-"xxxabcdxxx"
-regexps
-"[^x]+"
--;-;-;-
--;3-7;-;3-7
-"^(?:[^x]+)$"
--;-;-;-
--;-;-;-
-"^(?:[^x]+)"
--;-;-;-
--;-;-;-
-"(?:[^x]+)$"
--;-;-;-
--;-;-;-
-strings
-""
-"fo"
-regexps
-"(fo|foo)"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"^(?:(fo|foo))$"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"^(?:(fo|foo))"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"(?:(fo|foo))$"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-strings
-""
-"foo"
-regexps
-"(foo|fo)"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:(foo|fo))$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:(foo|fo))"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"(?:(foo|fo))$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-"aA"
-regexps
-"aa"
--;-;-;-
--;-;-;-
-"^(?:aa)$"
--;-;-;-
--;-;-;-
-"^(?:aa)"
--;-;-;-
--;-;-;-
-"(?:aa)$"
--;-;-;-
--;-;-;-
-strings
-""
-"Aa"
-regexps
-"a"
--;-;-;-
--;1-2;-;1-2
-"^(?:a)$"
--;-;-;-
--;-;-;-
-"^(?:a)"
--;-;-;-
--;-;-;-
-"(?:a)$"
--;-;-;-
--;1-2;-;1-2
-strings
-""
-"A"
-regexps
-"a"
--;-;-;-
--;-;-;-
-"^(?:a)$"
--;-;-;-
--;-;-;-
-"^(?:a)"
--;-;-;-
--;-;-;-
-"(?:a)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abc"
-regexps
-"ABC"
--;-;-;-
--;-;-;-
-"^(?:ABC)$"
--;-;-;-
--;-;-;-
-"^(?:ABC)"
--;-;-;-
--;-;-;-
-"(?:ABC)$"
--;-;-;-
--;-;-;-
-strings
-""
-"XABCY"
-regexps
-"abc"
--;-;-;-
--;-;-;-
-"^(?:abc)$"
--;-;-;-
--;-;-;-
-"^(?:abc)"
--;-;-;-
--;-;-;-
-"(?:abc)$"
--;-;-;-
--;-;-;-
-strings
-""
-"xabcy"
-regexps
-"ABC"
--;-;-;-
--;-;-;-
-"^(?:ABC)$"
--;-;-;-
--;-;-;-
-"^(?:ABC)"
--;-;-;-
--;-;-;-
-"(?:ABC)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foo"
-regexps
-"foo|bar|[A-Z]"
--;-;-;-
-0-3;0-3;0-3;0-3
-"^(?:foo|bar|[A-Z])$"
--;-;-;-
-0-3;0-3;0-3;0-3
-"^(?:foo|bar|[A-Z])"
--;-;-;-
-0-3;0-3;0-3;0-3
-"(?:foo|bar|[A-Z])$"
--;-;-;-
-0-3;0-3;0-3;0-3
-strings
-""
-"foo"
-regexps
-"^(foo|bar|[A-Z])"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:^(foo|bar|[A-Z]))$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:^(foo|bar|[A-Z]))"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"(?:^(foo|bar|[A-Z]))$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-"foo\n"
-regexps
-"(foo|bar|[A-Z])$"
--;-;-;-
--;-;-;-
-"^(?:(foo|bar|[A-Z])$)$"
--;-;-;-
--;-;-;-
-"^(?:(foo|bar|[A-Z])$)"
--;-;-;-
--;-;-;-
-"(?:(foo|bar|[A-Z])$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foo"
-regexps
-"(foo|bar|[A-Z])$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:(foo|bar|[A-Z])$)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:(foo|bar|[A-Z])$)"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"(?:(foo|bar|[A-Z])$)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-"foo\n"
-regexps
-"^(foo|bar|[A-Z])$"
--;-;-;-
--;-;-;-
-"^(?:^(foo|bar|[A-Z])$)$"
--;-;-;-
--;-;-;-
-"^(?:^(foo|bar|[A-Z])$)"
--;-;-;-
--;-;-;-
-"(?:^(foo|bar|[A-Z])$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foo"
-regexps
-"^(foo|bar|[A-Z])$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:^(foo|bar|[A-Z])$)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:^(foo|bar|[A-Z])$)"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"(?:^(foo|bar|[A-Z])$)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-"bar"
-regexps
-"^(foo|bar|[A-Z])$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:^(foo|bar|[A-Z])$)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:^(foo|bar|[A-Z])$)"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"(?:^(foo|bar|[A-Z])$)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-"X"
-regexps
-"^(foo|bar|[A-Z])$"
--;-;-;-
-0-1 0-1;0-1 0-1;0-1 0-1;0-1 0-1
-"^(?:^(foo|bar|[A-Z])$)$"
--;-;-;-
-0-1 0-1;0-1 0-1;0-1 0-1;0-1 0-1
-"^(?:^(foo|bar|[A-Z])$)"
--;-;-;-
-0-1 0-1;0-1 0-1;0-1 0-1;0-1 0-1
-"(?:^(foo|bar|[A-Z])$)$"
--;-;-;-
-0-1 0-1;0-1 0-1;0-1 0-1;0-1 0-1
-strings
-""
-"XY"
-regexps
-"^(foo|bar|[A-Z])$"
--;-;-;-
--;-;-;-
-"^(?:^(foo|bar|[A-Z])$)$"
--;-;-;-
--;-;-;-
-"^(?:^(foo|bar|[A-Z])$)"
--;-;-;-
--;-;-;-
-"(?:^(foo|bar|[A-Z])$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"fo"
-regexps
-"^(fo|foo)$"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"^(?:^(fo|foo)$)$"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"^(?:^(fo|foo)$)"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"(?:^(fo|foo)$)$"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-strings
-""
-"foo"
-regexps
-"^(fo|foo)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:^(fo|foo)$)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:^(fo|foo)$)"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"(?:^(fo|foo)$)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-"fo"
-regexps
-"^^(fo|foo)$"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"^(?:^^(fo|foo)$)$"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"^(?:^^(fo|foo)$)"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"(?:^^(fo|foo)$)$"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-strings
-""
-"foo"
-regexps
-"^^(fo|foo)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:^^(fo|foo)$)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:^^(fo|foo)$)"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"(?:^^(fo|foo)$)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-""
-regexps
-"^$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^$)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:^$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-"x"
-regexps
-"^$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-""
-regexps
-"^^$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^^$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^^$)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:^^$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-""
-regexps
-"^$$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^$$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^$$)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:^$$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-"x"
-regexps
-"^^$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^^$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"x"
-regexps
-"^$$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^$$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-""
-regexps
-"^^$$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^^$$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^^$$)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:^^$$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-"x"
-regexps
-"^^$$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^^$$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^^$$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^^$$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-""
-regexps
-"^^^^^^^^$$$$$$$$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^^^^^^^^$$$$$$$$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^^^^^^^^$$$$$$$$)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:^^^^^^^^$$$$$$$$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-"x"
-regexps
-"^"
-0-0;0-0;0-0;0-0
--;0-0;-;0-0
-"^(?:^)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^)"
-0-0;0-0;0-0;0-0
--;0-0;-;0-0
-"(?:^)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"x"
-regexps
-"$"
-0-0;0-0;0-0;0-0
--;1-1;-;1-1
-"^(?:$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:$)$"
-0-0;0-0;0-0;0-0
--;1-1;-;1-1
-strings
-""
-"nofoo foo that"
-regexps
-"\\bfoo\\b"
--;-;-;-
--;6-9;-;6-9
-"^(?:\\bfoo\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\bfoo\\b)"
--;-;-;-
--;-;-;-
-"(?:\\bfoo\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"faoa x"
-regexps
-"a\\b"
--;-;-;-
--;3-4;-;3-4
-"^(?:a\\b)$"
--;-;-;-
--;-;-;-
-"^(?:a\\b)"
--;-;-;-
--;-;-;-
-"(?:a\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"bar x"
-regexps
-"\\bbar"
--;-;-;-
--;0-3;-;0-3
-"^(?:\\bbar)$"
--;-;-;-
--;-;-;-
-"^(?:\\bbar)"
--;-;-;-
--;0-3;-;0-3
-"(?:\\bbar)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foo\nbar x"
-regexps
-"\\bbar"
--;-;-;-
--;4-7;-;4-7
-"^(?:\\bbar)$"
--;-;-;-
--;-;-;-
-"^(?:\\bbar)"
--;-;-;-
--;-;-;-
-"(?:\\bbar)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foobar"
-regexps
-"bar\\b"
--;-;-;-
--;3-6;-;3-6
-"^(?:bar\\b)$"
--;-;-;-
--;-;-;-
-"^(?:bar\\b)"
--;-;-;-
--;-;-;-
-"(?:bar\\b)$"
--;-;-;-
--;3-6;-;3-6
-strings
-""
-"foobar\nxxx"
-regexps
-"bar\\b"
--;-;-;-
--;3-6;-;3-6
-"^(?:bar\\b)$"
--;-;-;-
--;-;-;-
-"^(?:bar\\b)"
--;-;-;-
--;-;-;-
-"(?:bar\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foo"
-regexps
-"(foo|bar|[A-Z])\\b"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:(foo|bar|[A-Z])\\b)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:(foo|bar|[A-Z])\\b)"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"(?:(foo|bar|[A-Z])\\b)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-"foo\n"
-regexps
-"(foo|bar|[A-Z])\\b"
--;-;-;-
--;0-3 0-3;-;0-3 0-3
-"^(?:(foo|bar|[A-Z])\\b)$"
--;-;-;-
--;-;-;-
-"^(?:(foo|bar|[A-Z])\\b)"
--;-;-;-
--;0-3 0-3;-;0-3 0-3
-"(?:(foo|bar|[A-Z])\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-""
-regexps
-"\\b"
--;-;-;-
--;-;-;-
-"^(?:\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\b)"
--;-;-;-
--;-;-;-
-"(?:\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"x"
-regexps
-"\\b"
--;-;-;-
--;0-0;-;0-0
-"^(?:\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\b)"
--;-;-;-
--;0-0;-;0-0
-"(?:\\b)$"
--;-;-;-
--;1-1;-;1-1
-strings
-""
-"foo"
-regexps
-"\\b(foo|bar|[A-Z])"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:\\b(foo|bar|[A-Z]))$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:\\b(foo|bar|[A-Z]))"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"(?:\\b(foo|bar|[A-Z]))$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-"X"
-regexps
-"\\b(foo|bar|[A-Z])\\b"
--;-;-;-
-0-1 0-1;0-1 0-1;0-1 0-1;0-1 0-1
-"^(?:\\b(foo|bar|[A-Z])\\b)$"
--;-;-;-
-0-1 0-1;0-1 0-1;0-1 0-1;0-1 0-1
-"^(?:\\b(foo|bar|[A-Z])\\b)"
--;-;-;-
-0-1 0-1;0-1 0-1;0-1 0-1;0-1 0-1
-"(?:\\b(foo|bar|[A-Z])\\b)$"
--;-;-;-
-0-1 0-1;0-1 0-1;0-1 0-1;0-1 0-1
-strings
-""
-"XY"
-regexps
-"\\b(foo|bar|[A-Z])\\b"
--;-;-;-
--;-;-;-
-"^(?:\\b(foo|bar|[A-Z])\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\b(foo|bar|[A-Z])\\b)"
--;-;-;-
--;-;-;-
-"(?:\\b(foo|bar|[A-Z])\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"bar"
-regexps
-"\\b(foo|bar|[A-Z])\\b"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:\\b(foo|bar|[A-Z])\\b)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:\\b(foo|bar|[A-Z])\\b)"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"(?:\\b(foo|bar|[A-Z])\\b)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-"foo"
-regexps
-"\\b(foo|bar|[A-Z])\\b"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:\\b(foo|bar|[A-Z])\\b)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:\\b(foo|bar|[A-Z])\\b)"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"(?:\\b(foo|bar|[A-Z])\\b)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-"foo\n"
-regexps
-"\\b(foo|bar|[A-Z])\\b"
--;-;-;-
--;0-3 0-3;-;0-3 0-3
-"^(?:\\b(foo|bar|[A-Z])\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\b(foo|bar|[A-Z])\\b)"
--;-;-;-
--;0-3 0-3;-;0-3 0-3
-"(?:\\b(foo|bar|[A-Z])\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"ffoo bbar N x"
-regexps
-"\\b(foo|bar|[A-Z])\\b"
--;-;-;-
--;10-11 10-11;-;10-11 10-11
-"^(?:\\b(foo|bar|[A-Z])\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\b(foo|bar|[A-Z])\\b)"
--;-;-;-
--;-;-;-
-"(?:\\b(foo|bar|[A-Z])\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"fo"
-regexps
-"\\b(fo|foo)\\b"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"^(?:\\b(fo|foo)\\b)$"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"^(?:\\b(fo|foo)\\b)"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"(?:\\b(fo|foo)\\b)$"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-strings
-""
-"foo"
-regexps
-"\\b(fo|foo)\\b"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:\\b(fo|foo)\\b)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:\\b(fo|foo)\\b)"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"(?:\\b(fo|foo)\\b)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-""
-regexps
-"\\b\\b"
--;-;-;-
--;-;-;-
-"^(?:\\b\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\b\\b)"
--;-;-;-
--;-;-;-
-"(?:\\b\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"x"
-regexps
-"\\b\\b"
--;-;-;-
--;0-0;-;0-0
-"^(?:\\b\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\b\\b)"
--;-;-;-
--;0-0;-;0-0
-"(?:\\b\\b)$"
--;-;-;-
--;1-1;-;1-1
-strings
-""
-""
-regexps
-"\\b$"
--;-;-;-
--;-;-;-
-"^(?:\\b$)$"
--;-;-;-
--;-;-;-
-"^(?:\\b$)"
--;-;-;-
--;-;-;-
-"(?:\\b$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"x"
-regexps
-"\\b$"
--;-;-;-
--;1-1;-;1-1
-"^(?:\\b$)$"
--;-;-;-
--;-;-;-
-"^(?:\\b$)"
--;-;-;-
--;-;-;-
-"(?:\\b$)$"
--;-;-;-
--;1-1;-;1-1
-strings
-""
-"y x"
-regexps
-"\\b$"
--;-;-;-
--;3-3;-;3-3
-"^(?:\\b$)$"
--;-;-;-
--;-;-;-
-"^(?:\\b$)"
--;-;-;-
--;-;-;-
-"(?:\\b$)$"
--;-;-;-
--;3-3;-;3-3
-strings
-""
-"x"
-regexps
-"\\b.$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\b.$)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\b.$)"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:\\b.$)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"fo"
-regexps
-"^\\b(fo|foo)\\b"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"^(?:^\\b(fo|foo)\\b)$"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"^(?:^\\b(fo|foo)\\b)"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-"(?:^\\b(fo|foo)\\b)$"
--;-;-;-
-0-2 0-2;0-2 0-2;0-2 0-2;0-2 0-2
-strings
-""
-"foo"
-regexps
-"^\\b(fo|foo)\\b"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:^\\b(fo|foo)\\b)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:^\\b(fo|foo)\\b)"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"(?:^\\b(fo|foo)\\b)$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-""
-regexps
-"^\\b"
--;-;-;-
--;-;-;-
-"^(?:^\\b)$"
--;-;-;-
--;-;-;-
-"^(?:^\\b)"
--;-;-;-
--;-;-;-
-"(?:^\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"x"
-regexps
-"^\\b"
--;-;-;-
--;0-0;-;0-0
-"^(?:^\\b)$"
--;-;-;-
--;-;-;-
-"^(?:^\\b)"
--;-;-;-
--;0-0;-;0-0
-"(?:^\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-""
-regexps
-"^\\b\\b"
--;-;-;-
--;-;-;-
-"^(?:^\\b\\b)$"
--;-;-;-
--;-;-;-
-"^(?:^\\b\\b)"
--;-;-;-
--;-;-;-
-"(?:^\\b\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"x"
-regexps
-"^\\b\\b"
--;-;-;-
--;0-0;-;0-0
-"^(?:^\\b\\b)$"
--;-;-;-
--;-;-;-
-"^(?:^\\b\\b)"
--;-;-;-
--;0-0;-;0-0
-"(?:^\\b\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-""
-regexps
-"^\\b$"
--;-;-;-
--;-;-;-
-"^(?:^\\b$)$"
--;-;-;-
--;-;-;-
-"^(?:^\\b$)"
--;-;-;-
--;-;-;-
-"(?:^\\b$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"x"
-regexps
-"^\\b$"
--;-;-;-
--;-;-;-
-"^(?:^\\b$)$"
--;-;-;-
--;-;-;-
-"^(?:^\\b$)"
--;-;-;-
--;-;-;-
-"(?:^\\b$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"x"
-regexps
-"^\\b.$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:^\\b.$)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:^\\b.$)"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:^\\b.$)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"x"
-regexps
-"^\\b.\\b$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:^\\b.\\b$)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:^\\b.\\b$)"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:^\\b.\\b$)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-""
-regexps
-"^^^^^^^^\\b$$$$$$$"
--;-;-;-
--;-;-;-
-"^(?:^^^^^^^^\\b$$$$$$$)$"
--;-;-;-
--;-;-;-
-"^(?:^^^^^^^^\\b$$$$$$$)"
--;-;-;-
--;-;-;-
-"(?:^^^^^^^^\\b$$$$$$$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"x"
-regexps
-"^^^^^^^^\\b.$$$$$$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:^^^^^^^^\\b.$$$$$$)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:^^^^^^^^\\b.$$$$$$)"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:^^^^^^^^\\b.$$$$$$)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"x"
-regexps
-"^^^^^^^^\\b$$$$$$$"
--;-;-;-
--;-;-;-
-"^(?:^^^^^^^^\\b$$$$$$$)$"
--;-;-;-
--;-;-;-
-"^(?:^^^^^^^^\\b$$$$$$$)"
--;-;-;-
--;-;-;-
-"(?:^^^^^^^^\\b$$$$$$$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"n foo xfoox that"
-regexps
-"\\Bfoo\\B"
--;-;-;-
--;7-10;-;7-10
-"^(?:\\Bfoo\\B)$"
--;-;-;-
--;-;-;-
-"^(?:\\Bfoo\\B)"
--;-;-;-
--;-;-;-
-"(?:\\Bfoo\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"faoa x"
-regexps
-"a\\B"
--;-;-;-
--;1-2;-;1-2
-"^(?:a\\B)$"
--;-;-;-
--;-;-;-
-"^(?:a\\B)"
--;-;-;-
--;-;-;-
-"(?:a\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"bar x"
-regexps
-"\\Bbar"
--;-;-;-
--;-;-;-
-"^(?:\\Bbar)$"
--;-;-;-
--;-;-;-
-"^(?:\\Bbar)"
--;-;-;-
--;-;-;-
-"(?:\\Bbar)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foo\nbar x"
-regexps
-"\\Bbar"
--;-;-;-
--;-;-;-
-"^(?:\\Bbar)$"
--;-;-;-
--;-;-;-
-"^(?:\\Bbar)"
--;-;-;-
--;-;-;-
-"(?:\\Bbar)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foobar"
-regexps
-"bar\\B"
--;-;-;-
--;-;-;-
-"^(?:bar\\B)$"
--;-;-;-
--;-;-;-
-"^(?:bar\\B)"
--;-;-;-
--;-;-;-
-"(?:bar\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foobar\nxxx"
-regexps
-"bar\\B"
--;-;-;-
--;-;-;-
-"^(?:bar\\B)$"
--;-;-;-
--;-;-;-
-"^(?:bar\\B)"
--;-;-;-
--;-;-;-
-"(?:bar\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foox"
-regexps
-"(foo|bar|[A-Z])\\B"
--;-;-;-
--;0-3 0-3;-;0-3 0-3
-"^(?:(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-"^(?:(foo|bar|[A-Z])\\B)"
--;-;-;-
--;0-3 0-3;-;0-3 0-3
-"(?:(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foo\n"
-regexps
-"(foo|bar|[A-Z])\\B"
--;-;-;-
--;-;-;-
-"^(?:(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-"^(?:(foo|bar|[A-Z])\\B)"
--;-;-;-
--;-;-;-
-"(?:(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-""
-regexps
-"\\B"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:\\B)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:\\B)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:\\B)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-"x"
-regexps
-"\\B"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:\\B)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:\\B)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:\\B)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"foo"
-regexps
-"\\B(foo|bar|[A-Z])"
--;-;-;-
--;-;-;-
-"^(?:\\B(foo|bar|[A-Z]))$"
--;-;-;-
--;-;-;-
-"^(?:\\B(foo|bar|[A-Z]))"
--;-;-;-
--;-;-;-
-"(?:\\B(foo|bar|[A-Z]))$"
--;-;-;-
--;-;-;-
-strings
-""
-"xXy"
-regexps
-"\\B(foo|bar|[A-Z])\\B"
--;-;-;-
--;1-2 1-2;-;1-2 1-2
-"^(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-"^(?:\\B(foo|bar|[A-Z])\\B)"
--;-;-;-
--;-;-;-
-"(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"XY"
-regexps
-"\\B(foo|bar|[A-Z])\\B"
--;-;-;-
--;-;-;-
-"^(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-"^(?:\\B(foo|bar|[A-Z])\\B)"
--;-;-;-
--;-;-;-
-"(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"XYZ"
-regexps
-"\\B(foo|bar|[A-Z])\\B"
--;-;-;-
--;1-2 1-2;-;1-2 1-2
-"^(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-"^(?:\\B(foo|bar|[A-Z])\\B)"
--;-;-;-
--;-;-;-
-"(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abara"
-regexps
-"\\B(foo|bar|[A-Z])\\B"
--;-;-;-
--;1-4 1-4;-;1-4 1-4
-"^(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-"^(?:\\B(foo|bar|[A-Z])\\B)"
--;-;-;-
--;-;-;-
-"(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"xfoo_"
-regexps
-"\\B(foo|bar|[A-Z])\\B"
--;-;-;-
--;1-4 1-4;-;1-4 1-4
-"^(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-"^(?:\\B(foo|bar|[A-Z])\\B)"
--;-;-;-
--;-;-;-
-"(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"xfoo\n"
-regexps
-"\\B(foo|bar|[A-Z])\\B"
--;-;-;-
--;-;-;-
-"^(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-"^(?:\\B(foo|bar|[A-Z])\\B)"
--;-;-;-
--;-;-;-
-"(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foo bar vNx"
-regexps
-"\\B(foo|bar|[A-Z])\\B"
--;-;-;-
--;9-10 9-10;-;9-10 9-10
-"^(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-"^(?:\\B(foo|bar|[A-Z])\\B)"
--;-;-;-
--;-;-;-
-"(?:\\B(foo|bar|[A-Z])\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"xfoo"
-regexps
-"\\B(fo|foo)\\B"
--;-;-;-
--;1-3 1-3;-;1-3 1-3
-"^(?:\\B(fo|foo)\\B)$"
--;-;-;-
--;-;-;-
-"^(?:\\B(fo|foo)\\B)"
--;-;-;-
--;-;-;-
-"(?:\\B(fo|foo)\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"xfooo"
-regexps
-"\\B(foo|fo)\\B"
--;-;-;-
--;1-4 1-4;-;1-4 1-4
-"^(?:\\B(foo|fo)\\B)$"
--;-;-;-
--;-;-;-
-"^(?:\\B(foo|fo)\\B)"
--;-;-;-
--;-;-;-
-"(?:\\B(foo|fo)\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-""
-regexps
-"\\B\\B"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:\\B\\B)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:\\B\\B)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:\\B\\B)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-"x"
-regexps
-"\\B\\B"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:\\B\\B)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:\\B\\B)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:\\B\\B)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-""
-regexps
-"\\B$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:\\B$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:\\B$)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:\\B$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-"x"
-regexps
-"\\B$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:\\B$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:\\B$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:\\B$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"y x"
-regexps
-"\\B$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:\\B$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:\\B$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:\\B$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"x"
-regexps
-"\\B.$"
--;-;-;-
--;-;-;-
-"^(?:\\B.$)$"
--;-;-;-
--;-;-;-
-"^(?:\\B.$)"
--;-;-;-
--;-;-;-
-"(?:\\B.$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"fo"
-regexps
-"^\\B(fo|foo)\\B"
--;-;-;-
--;-;-;-
-"^(?:^\\B(fo|foo)\\B)$"
--;-;-;-
--;-;-;-
-"^(?:^\\B(fo|foo)\\B)"
--;-;-;-
--;-;-;-
-"(?:^\\B(fo|foo)\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foo"
-regexps
-"^\\B(fo|foo)\\B"
--;-;-;-
--;-;-;-
-"^(?:^\\B(fo|foo)\\B)$"
--;-;-;-
--;-;-;-
-"^(?:^\\B(fo|foo)\\B)"
--;-;-;-
--;-;-;-
-"(?:^\\B(fo|foo)\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-""
-regexps
-"^\\B"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^\\B)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^\\B)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:^\\B)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-"x"
-regexps
-"^\\B"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^\\B)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^\\B)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^\\B)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-""
-regexps
-"^\\B\\B"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^\\B\\B)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^\\B\\B)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:^\\B\\B)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-"x"
-regexps
-"^\\B\\B"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^\\B\\B)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^\\B\\B)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^\\B\\B)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-""
-regexps
-"^\\B$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^\\B$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^\\B$)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:^\\B$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-"x"
-regexps
-"^\\B$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^\\B$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^\\B$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^\\B$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"x"
-regexps
-"^\\B.$"
--;-;-;-
--;-;-;-
-"^(?:^\\B.$)$"
--;-;-;-
--;-;-;-
-"^(?:^\\B.$)"
--;-;-;-
--;-;-;-
-"(?:^\\B.$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"x"
-regexps
-"^\\B.\\B$"
--;-;-;-
--;-;-;-
-"^(?:^\\B.\\B$)$"
--;-;-;-
--;-;-;-
-"^(?:^\\B.\\B$)"
--;-;-;-
--;-;-;-
-"(?:^\\B.\\B$)$"
--;-;-;-
--;-;-;-
-strings
-""
-""
-regexps
-"^^^^^^^^\\B$$$$$$$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^^^^^^^^\\B$$$$$$$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^^^^^^^^\\B$$$$$$$)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:^^^^^^^^\\B$$$$$$$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-"x"
-regexps
-"^^^^^^^^\\B.$$$$$$"
--;-;-;-
--;-;-;-
-"^(?:^^^^^^^^\\B.$$$$$$)$"
--;-;-;-
--;-;-;-
-"^(?:^^^^^^^^\\B.$$$$$$)"
--;-;-;-
--;-;-;-
-"(?:^^^^^^^^\\B.$$$$$$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"x"
-regexps
-"^^^^^^^^\\B$$$$$$$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^^^^^^^^\\B$$$$$$$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^^^^^^^^\\B$$$$$$$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^^^^^^^^\\B$$$$$$$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"x"
-regexps
-"\\bx\\b"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\bx\\b)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\bx\\b)"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:\\bx\\b)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"x>"
-regexps
-"\\bx\\b"
--;-;-;-
--;0-1;-;0-1
-"^(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)"
--;-;-;-
--;0-1;-;0-1
-"(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"<x"
-regexps
-"\\bx\\b"
--;-;-;-
--;1-2;-;1-2
-"^(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)"
--;-;-;-
--;-;-;-
-"(?:\\bx\\b)$"
--;-;-;-
--;1-2;-;1-2
-strings
-""
-"<x>"
-regexps
-"\\bx\\b"
--;-;-;-
--;1-2;-;1-2
-"^(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)"
--;-;-;-
--;-;-;-
-"(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"ax"
-regexps
-"\\bx\\b"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)"
--;-;-;-
--;-;-;-
-"(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"xb"
-regexps
-"\\bx\\b"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)"
--;-;-;-
--;-;-;-
-"(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"axb"
-regexps
-"\\bx\\b"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)"
--;-;-;-
--;-;-;-
-"(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"«x"
-regexps
-"\\bx\\b"
--;-;-;-
--;2-3;-;2-3
-"^(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)"
--;-;-;-
--;-;-;-
-"(?:\\bx\\b)$"
--;-;-;-
--;2-3;-;2-3
-strings
-""
-"x»"
-regexps
-"\\bx\\b"
--;-;-;-
--;0-1;-;0-1
-"^(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)"
--;-;-;-
--;0-1;-;0-1
-"(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"«x»"
-regexps
-"\\bx\\b"
--;-;-;-
--;2-3;-;2-3
-"^(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)"
--;-;-;-
--;-;-;-
-"(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"axb"
-regexps
-"\\bx\\b"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)"
--;-;-;-
--;-;-;-
-"(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"áxβ"
-regexps
-"\\bx\\b"
--;-;-;-
--;2-3;-;2-3
-"^(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-"^(?:\\bx\\b)"
--;-;-;-
--;-;-;-
-"(?:\\bx\\b)$"
--;-;-;-
--;-;-;-
-strings
-""
-"axb"
-regexps
-"\\Bx\\B"
--;-;-;-
--;1-2;-;1-2
-"^(?:\\Bx\\B)$"
--;-;-;-
--;-;-;-
-"^(?:\\Bx\\B)"
--;-;-;-
--;-;-;-
-"(?:\\Bx\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"áxβ"
-regexps
-"\\Bx\\B"
--;-;-;-
--;-;-;-
-"^(?:\\Bx\\B)$"
--;-;-;-
--;-;-;-
-"^(?:\\Bx\\B)"
--;-;-;-
--;-;-;-
-"(?:\\Bx\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-""
-regexps
-"^$^$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^$^$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^$^$)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:^$^$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-""
-regexps
-"^$^"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^$^)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:^$^)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:^$^)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-""
-regexps
-"$^$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:$^$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"^(?:$^$)"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-"(?:$^$)$"
-0-0;0-0;0-0;0-0
-0-0;0-0;0-0;0-0
-strings
-""
-"x"
-regexps
-"^$^$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$^$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^$^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"x"
-regexps
-"^$^"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$^)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$^)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^$^)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"x"
-regexps
-"$^$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:$^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:$^$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:$^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"x\ny"
-regexps
-"^$^$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$^$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^$^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"x\ny"
-regexps
-"^$^"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$^)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$^)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^$^)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"x\ny"
-regexps
-"$^$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:$^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:$^$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:$^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"x\n\ny"
-regexps
-"^$^$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$^$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^$^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"x\n\ny"
-regexps
-"^$^"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$^)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^$^)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:^$^)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"x\n\ny"
-regexps
-"$^$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:$^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:$^$)"
-0-0;0-0;0-0;0-0
--;-;-;-
-"(?:$^$)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"foo$bar"
-regexps
-"^(foo\\$)$"
--;-;-;-
--;-;-;-
-"^(?:^(foo\\$)$)$"
--;-;-;-
--;-;-;-
-"^(?:^(foo\\$)$)"
--;-;-;-
--;-;-;-
-"(?:^(foo\\$)$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foo$bar"
-regexps
-"(foo\\$)"
--;-;-;-
--;0-4 0-4;-;0-4 0-4
-"^(?:(foo\\$))$"
--;-;-;-
--;-;-;-
-"^(?:(foo\\$))"
--;-;-;-
--;0-4 0-4;-;0-4 0-4
-"(?:(foo\\$))$"
--;-;-;-
--;-;-;-
-strings
-""
-"abc"
-regexps
-"^...$"
--;-;-;-
-0-3;0-3;0-3;0-3
-"^(?:^...$)$"
--;-;-;-
-0-3;0-3;0-3;0-3
-"^(?:^...$)"
--;-;-;-
-0-3;0-3;0-3;0-3
-"(?:^...$)$"
--;-;-;-
-0-3;0-3;0-3;0-3
-strings
-""
-"本"
-regexps
-"^本$"
--;-;-;-
-0-3;0-3;0-3;0-3
-"^(?:^本$)$"
--;-;-;-
-0-3;0-3;0-3;0-3
-"^(?:^本$)"
--;-;-;-
-0-3;0-3;0-3;0-3
-"(?:^本$)$"
--;-;-;-
-0-3;0-3;0-3;0-3
-strings
-""
-"日本語"
-regexps
-"^...$"
--;-;-;-
-0-9;0-9;0-9;0-9
-"^(?:^...$)$"
--;-;-;-
-0-9;0-9;0-9;0-9
-"^(?:^...$)"
--;-;-;-
-0-9;0-9;0-9;0-9
-"(?:^...$)$"
--;-;-;-
-0-9;0-9;0-9;0-9
-strings
-""
-".本."
-regexps
-"^...$"
--;-;-;-
-0-5;0-5;0-5;0-5
-"^(?:^...$)$"
--;-;-;-
-0-5;0-5;0-5;0-5
-"^(?:^...$)"
--;-;-;-
-0-5;0-5;0-5;0-5
-"(?:^...$)$"
--;-;-;-
-0-5;0-5;0-5;0-5
-strings
-""
-"本"
-regexps
-"^\\C\\C\\C$"
--;-;-;-
-0-3;0-3;0-3;0-3
-"^(?:^\\C\\C\\C$)$"
--;-;-;-
-0-3;0-3;0-3;0-3
-"^(?:^\\C\\C\\C$)"
--;-;-;-
-0-3;0-3;0-3;0-3
-"(?:^\\C\\C\\C$)$"
--;-;-;-
-0-3;0-3;0-3;0-3
-strings
-""
-"本"
-regexps
-"^\\C$"
--;-;-;-
--;-;-;-
-"^(?:^\\C$)$"
--;-;-;-
--;-;-;-
-"^(?:^\\C$)"
--;-;-;-
--;-;-;-
-"(?:^\\C$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"日本語"
-regexps
-"^\\C\\C\\C$"
--;-;-;-
--;-;-;-
-"^(?:^\\C\\C\\C$)$"
--;-;-;-
--;-;-;-
-"^(?:^\\C\\C\\C$)"
--;-;-;-
--;-;-;-
-"(?:^\\C\\C\\C$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"日本語"
-regexps
-"^...$"
--;-;-;-
-0-9;0-9;0-9;0-9
-"^(?:^...$)$"
--;-;-;-
-0-9;0-9;0-9;0-9
-"^(?:^...$)"
--;-;-;-
-0-9;0-9;0-9;0-9
-"(?:^...$)$"
--;-;-;-
-0-9;0-9;0-9;0-9
-strings
-""
-"日本語"
-regexps
-"^.........$"
--;-;-;-
--;-;-;-
-"^(?:^.........$)$"
--;-;-;-
--;-;-;-
-"^(?:^.........$)"
--;-;-;-
--;-;-;-
-"(?:^.........$)$"
--;-;-;-
--;-;-;-
-strings
-""
-".本."
-regexps
-"^...$"
--;-;-;-
-0-5;0-5;0-5;0-5
-"^(?:^...$)$"
--;-;-;-
-0-5;0-5;0-5;0-5
-"^(?:^...$)"
--;-;-;-
-0-5;0-5;0-5;0-5
-"(?:^...$)$"
--;-;-;-
-0-5;0-5;0-5;0-5
-strings
-""
-".本."
-regexps
-"^.....$"
--;-;-;-
--;-;-;-
-"^(?:^.....$)$"
--;-;-;-
--;-;-;-
-"^(?:^.....$)"
--;-;-;-
--;-;-;-
-"(?:^.....$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"xfooo"
-regexps
-"\\B(fo|foo)\\B"
--;-;-;-
--;1-3 1-3;-;1-4 1-4
-"^(?:\\B(fo|foo)\\B)$"
--;-;-;-
--;-;-;-
-"^(?:\\B(fo|foo)\\B)"
--;-;-;-
--;-;-;-
-"(?:\\B(fo|foo)\\B)$"
--;-;-;-
--;-;-;-
-strings
-""
-"foo"
-regexps
-"(fo|foo)"
--;-;-;-
-0-3 0-3;0-2 0-2;0-3 0-3;0-3 0-3
-"^(?:(fo|foo))$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-"^(?:(fo|foo))"
--;-;-;-
-0-3 0-3;0-2 0-2;0-3 0-3;0-3 0-3
-"(?:(fo|foo))$"
--;-;-;-
-0-3 0-3;0-3 0-3;0-3 0-3;0-3 0-3
-strings
-""
-"a"
-regexps
-"\\141"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\141)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\141)"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:\\141)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"0"
-regexps
-"\\060"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\060)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\060)"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:\\060)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"00"
-regexps
-"\\0600"
--;-;-;-
-0-2;0-2;0-2;0-2
-"^(?:\\0600)$"
--;-;-;-
-0-2;0-2;0-2;0-2
-"^(?:\\0600)"
--;-;-;-
-0-2;0-2;0-2;0-2
-"(?:\\0600)$"
--;-;-;-
-0-2;0-2;0-2;0-2
-strings
-""
-"08"
-regexps
-"\\608"
--;-;-;-
-0-2;0-2;0-2;0-2
-"^(?:\\608)$"
--;-;-;-
-0-2;0-2;0-2;0-2
-"^(?:\\608)"
--;-;-;-
-0-2;0-2;0-2;0-2
-"(?:\\608)$"
--;-;-;-
-0-2;0-2;0-2;0-2
-strings
-""
-""
-regexps
-"\\01"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\01)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\01)"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:\\01)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"8"
-regexps
-"\\018"
--;-;-;-
-0-2;0-2;0-2;0-2
-"^(?:\\018)$"
--;-;-;-
-0-2;0-2;0-2;0-2
-"^(?:\\018)"
--;-;-;-
-0-2;0-2;0-2;0-2
-"(?:\\018)$"
--;-;-;-
-0-2;0-2;0-2;0-2
-strings
-""
-"a"
-regexps
-"\\x{61}"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\x{61})$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\x{61})"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:\\x{61})$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"a"
-regexps
-"\\x61"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\x61)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\x61)"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:\\x61)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"a"
-regexps
-"\\x{00000061}"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\x{00000061})$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:\\x{00000061})"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:\\x{00000061})$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"aαβb"
-regexps
-"\\p{Greek}+"
--;-;-;-
--;1-5;-;1-5
-"^(?:\\p{Greek}+)$"
--;-;-;-
--;-;-;-
-"^(?:\\p{Greek}+)"
--;-;-;-
--;-;-;-
-"(?:\\p{Greek}+)$"
--;-;-;-
--;-;-;-
-strings
-""
-"aαβb"
-regexps
-"\\P{Greek}+"
--;-;-;-
--;0-1;-;0-1
-"^(?:\\P{Greek}+)$"
--;-;-;-
--;-;-;-
-"^(?:\\P{Greek}+)"
--;-;-;-
--;0-1;-;0-1
-"(?:\\P{Greek}+)$"
--;-;-;-
--;5-6;-;5-6
-strings
-""
-"aαβb"
-regexps
-"\\p{^Greek}+"
--;-;-;-
--;0-1;-;0-1
-"^(?:\\p{^Greek}+)$"
--;-;-;-
--;-;-;-
-"^(?:\\p{^Greek}+)"
--;-;-;-
--;0-1;-;0-1
-"(?:\\p{^Greek}+)$"
--;-;-;-
--;5-6;-;5-6
-strings
-""
-"aαβb"
-regexps
-"\\P{^Greek}+"
--;-;-;-
--;1-5;-;1-5
-"^(?:\\P{^Greek}+)$"
--;-;-;-
--;-;-;-
-"^(?:\\P{^Greek}+)"
--;-;-;-
--;-;-;-
-"(?:\\P{^Greek}+)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abc123"
-regexps
-"[^0-9]+"
--;-;-;-
--;0-3;-;0-3
-"^(?:[^0-9]+)$"
--;-;-;-
--;-;-;-
-"^(?:[^0-9]+)"
--;-;-;-
--;0-3;-;0-3
-"(?:[^0-9]+)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abc123²³¼½¾₀₉"
-regexps
-"\\p{Nd}+"
--;-;-;-
--;3-6;-;3-6
-"^(?:\\p{Nd}+)$"
--;-;-;-
--;-;-;-
-"^(?:\\p{Nd}+)"
--;-;-;-
--;-;-;-
-"(?:\\p{Nd}+)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abc123²³¼½¾₀₉"
-regexps
-"\\p{^Nd}+"
--;-;-;-
--;0-3;-;0-3
-"^(?:\\p{^Nd}+)$"
--;-;-;-
--;-;-;-
-"^(?:\\p{^Nd}+)"
--;-;-;-
--;0-3;-;0-3
-"(?:\\p{^Nd}+)$"
--;-;-;-
--;6-22;-;6-22
-strings
-""
-"abc123²³¼½¾₀₉"
-regexps
-"\\P{Nd}+"
--;-;-;-
--;0-3;-;0-3
-"^(?:\\P{Nd}+)$"
--;-;-;-
--;-;-;-
-"^(?:\\P{Nd}+)"
--;-;-;-
--;0-3;-;0-3
-"(?:\\P{Nd}+)$"
--;-;-;-
--;6-22;-;6-22
-strings
-""
-"abc123²³¼½¾₀₉"
-regexps
-"\\P{^Nd}+"
--;-;-;-
--;3-6;-;3-6
-"^(?:\\P{^Nd}+)$"
--;-;-;-
--;-;-;-
-"^(?:\\P{^Nd}+)"
--;-;-;-
--;-;-;-
-"(?:\\P{^Nd}+)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abc123²³¼½¾₀₉"
-regexps
-"\\pN+"
--;-;-;-
--;3-22;-;3-22
-"^(?:\\pN+)$"
--;-;-;-
--;-;-;-
-"^(?:\\pN+)"
--;-;-;-
--;-;-;-
-"(?:\\pN+)$"
--;-;-;-
--;3-22;-;3-22
-strings
-""
-"abc123²³¼½¾₀₉"
-regexps
-"\\p{N}+"
--;-;-;-
--;3-22;-;3-22
-"^(?:\\p{N}+)$"
--;-;-;-
--;-;-;-
-"^(?:\\p{N}+)"
--;-;-;-
--;-;-;-
-"(?:\\p{N}+)$"
--;-;-;-
--;3-22;-;3-22
-strings
-""
-"abc123²³¼½¾₀₉"
-regexps
-"\\p{^N}+"
--;-;-;-
--;0-3;-;0-3
-"^(?:\\p{^N}+)$"
--;-;-;-
--;-;-;-
-"^(?:\\p{^N}+)"
--;-;-;-
--;0-3;-;0-3
-"(?:\\p{^N}+)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abc123"
-regexps
-"\\p{Any}+"
--;-;-;-
-0-6;0-6;0-6;0-6
-"^(?:\\p{Any}+)$"
--;-;-;-
-0-6;0-6;0-6;0-6
-"^(?:\\p{Any}+)"
--;-;-;-
-0-6;0-6;0-6;0-6
-"(?:\\p{Any}+)$"
--;-;-;-
-0-6;0-6;0-6;0-6
-strings
-""
-"@AaB"
-regexps
-"(?i)[@-A]+"
--;-;-;-
--;0-3;-;0-3
-"^(?:(?i)[@-A]+)$"
--;-;-;-
--;-;-;-
-"^(?:(?i)[@-A]+)"
--;-;-;-
--;0-3;-;0-3
-"(?:(?i)[@-A]+)$"
--;-;-;-
--;-;-;-
-strings
-""
-"aAzZ"
-regexps
-"(?i)[A-Z]+"
--;-;-;-
-0-4;0-4;0-4;0-4
-"^(?:(?i)[A-Z]+)$"
--;-;-;-
-0-4;0-4;0-4;0-4
-"^(?:(?i)[A-Z]+)"
--;-;-;-
-0-4;0-4;0-4;0-4
-"(?:(?i)[A-Z]+)$"
--;-;-;-
-0-4;0-4;0-4;0-4
-strings
-""
-"Aa\\"
-regexps
-"(?i)[^\\\\]+"
--;-;-;-
--;0-2;-;0-2
-"^(?:(?i)[^\\\\]+)$"
--;-;-;-
--;-;-;-
-"^(?:(?i)[^\\\\]+)"
--;-;-;-
--;0-2;-;0-2
-"(?:(?i)[^\\\\]+)$"
--;-;-;-
--;-;-;-
-strings
-""
-"acegikmoqsuwyACEGIKMOQSUWY"
-regexps
-"(?i)[acegikmoqsuwy]+"
--;-;-;-
-0-26;0-26;0-26;0-26
-"^(?:(?i)[acegikmoqsuwy]+)$"
--;-;-;-
-0-26;0-26;0-26;0-26
-"^(?:(?i)[acegikmoqsuwy]+)"
--;-;-;-
-0-26;0-26;0-26;0-26
-"(?:(?i)[acegikmoqsuwy]+)$"
--;-;-;-
-0-26;0-26;0-26;0-26
-strings
-""
-"@AaB"
-regexps
-"[@-A]+"
--;-;-;-
--;0-2;-;0-2
-"^(?:[@-A]+)$"
--;-;-;-
--;-;-;-
-"^(?:[@-A]+)"
--;-;-;-
--;0-2;-;0-2
-"(?:[@-A]+)$"
--;-;-;-
--;-;-;-
-strings
-""
-"aAzZ"
-regexps
-"[A-Z]+"
--;-;-;-
--;1-2;-;1-2
-"^(?:[A-Z]+)$"
--;-;-;-
--;-;-;-
-"^(?:[A-Z]+)"
--;-;-;-
--;-;-;-
-"(?:[A-Z]+)$"
--;-;-;-
--;3-4;-;3-4
-strings
-""
-"Aa\\"
-regexps
-"[^\\\\]+"
--;-;-;-
--;0-2;-;0-2
-"^(?:[^\\\\]+)$"
--;-;-;-
--;-;-;-
-"^(?:[^\\\\]+)"
--;-;-;-
--;0-2;-;0-2
-"(?:[^\\\\]+)$"
--;-;-;-
--;-;-;-
-strings
-""
-"acegikmoqsuwyACEGIKMOQSUWY"
-regexps
-"[acegikmoqsuwy]+"
--;-;-;-
--;0-13;-;0-13
-"^(?:[acegikmoqsuwy]+)$"
--;-;-;-
--;-;-;-
-"^(?:[acegikmoqsuwy]+)"
--;-;-;-
--;0-13;-;0-13
-"(?:[acegikmoqsuwy]+)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abcdef"
-regexps
-"^abc"
--;-;-;-
--;0-3;-;0-3
-"^(?:^abc)$"
--;-;-;-
--;-;-;-
-"^(?:^abc)"
--;-;-;-
--;0-3;-;0-3
-"(?:^abc)$"
--;-;-;-
--;-;-;-
-strings
-""
-"aabcdef"
-regexps
-"^abc"
--;-;-;-
--;-;-;-
-"^(?:^abc)$"
--;-;-;-
--;-;-;-
-"^(?:^abc)"
--;-;-;-
--;-;-;-
-"(?:^abc)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abcdef"
-regexps
-"^[ay]*[bx]+c"
--;-;-;-
--;0-3;-;0-3
-"^(?:^[ay]*[bx]+c)$"
--;-;-;-
--;-;-;-
-"^(?:^[ay]*[bx]+c)"
--;-;-;-
--;0-3;-;0-3
-"(?:^[ay]*[bx]+c)$"
--;-;-;-
--;-;-;-
-strings
-""
-"aabcdef"
-regexps
-"^[ay]*[bx]+c"
--;-;-;-
--;0-4;-;0-4
-"^(?:^[ay]*[bx]+c)$"
--;-;-;-
--;-;-;-
-"^(?:^[ay]*[bx]+c)"
--;-;-;-
--;0-4;-;0-4
-"(?:^[ay]*[bx]+c)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abcdef"
-regexps
-"def$"
--;-;-;-
--;3-6;-;3-6
-"^(?:def$)$"
--;-;-;-
--;-;-;-
-"^(?:def$)"
--;-;-;-
--;-;-;-
-"(?:def$)$"
--;-;-;-
--;3-6;-;3-6
-strings
-""
-"abcdeff"
-regexps
-"def$"
--;-;-;-
--;-;-;-
-"^(?:def$)$"
--;-;-;-
--;-;-;-
-"^(?:def$)"
--;-;-;-
--;-;-;-
-"(?:def$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abcdef"
-regexps
-"d[ex][fy]$"
--;-;-;-
--;3-6;-;3-6
-"^(?:d[ex][fy]$)$"
--;-;-;-
--;-;-;-
-"^(?:d[ex][fy]$)"
--;-;-;-
--;-;-;-
-"(?:d[ex][fy]$)$"
--;-;-;-
--;3-6;-;3-6
-strings
-""
-"abcdeff"
-regexps
-"d[ex][fy]$"
--;-;-;-
--;-;-;-
-"^(?:d[ex][fy]$)$"
--;-;-;-
--;-;-;-
-"^(?:d[ex][fy]$)"
--;-;-;-
--;-;-;-
-"(?:d[ex][fy]$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abcdef"
-regexps
-"[dz][ex][fy]$"
--;-;-;-
--;3-6;-;3-6
-"^(?:[dz][ex][fy]$)$"
--;-;-;-
--;-;-;-
-"^(?:[dz][ex][fy]$)"
--;-;-;-
--;-;-;-
-"(?:[dz][ex][fy]$)$"
--;-;-;-
--;3-6;-;3-6
-strings
-""
-"abcdeff"
-regexps
-"[dz][ex][fy]$"
--;-;-;-
--;-;-;-
-"^(?:[dz][ex][fy]$)$"
--;-;-;-
--;-;-;-
-"^(?:[dz][ex][fy]$)"
--;-;-;-
--;-;-;-
-"(?:[dz][ex][fy]$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abcdef"
-regexps
-"(?m)^abc"
--;-;-;-
--;0-3;-;0-3
-"^(?:(?m)^abc)$"
--;-;-;-
--;-;-;-
-"^(?:(?m)^abc)"
--;-;-;-
--;0-3;-;0-3
-"(?:(?m)^abc)$"
--;-;-;-
--;-;-;-
-strings
-""
-"aabcdef"
-regexps
-"(?m)^abc"
--;-;-;-
--;-;-;-
-"^(?:(?m)^abc)$"
--;-;-;-
--;-;-;-
-"^(?:(?m)^abc)"
--;-;-;-
--;-;-;-
-"(?:(?m)^abc)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abcdef"
-regexps
-"(?m)^[ay]*[bx]+c"
--;-;-;-
--;0-3;-;0-3
-"^(?:(?m)^[ay]*[bx]+c)$"
--;-;-;-
--;-;-;-
-"^(?:(?m)^[ay]*[bx]+c)"
--;-;-;-
--;0-3;-;0-3
-"(?:(?m)^[ay]*[bx]+c)$"
--;-;-;-
--;-;-;-
-strings
-""
-"aabcdef"
-regexps
-"(?m)^[ay]*[bx]+c"
--;-;-;-
--;0-4;-;0-4
-"^(?:(?m)^[ay]*[bx]+c)$"
--;-;-;-
--;-;-;-
-"^(?:(?m)^[ay]*[bx]+c)"
--;-;-;-
--;0-4;-;0-4
-"(?:(?m)^[ay]*[bx]+c)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abcdef"
-regexps
-"(?m)def$"
--;-;-;-
--;3-6;-;3-6
-"^(?:(?m)def$)$"
--;-;-;-
--;-;-;-
-"^(?:(?m)def$)"
--;-;-;-
--;-;-;-
-"(?:(?m)def$)$"
--;-;-;-
--;3-6;-;3-6
-strings
-""
-"abcdeff"
-regexps
-"(?m)def$"
--;-;-;-
--;-;-;-
-"^(?:(?m)def$)$"
--;-;-;-
--;-;-;-
-"^(?:(?m)def$)"
--;-;-;-
--;-;-;-
-"(?:(?m)def$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abcdef"
-regexps
-"(?m)d[ex][fy]$"
--;-;-;-
--;3-6;-;3-6
-"^(?:(?m)d[ex][fy]$)$"
--;-;-;-
--;-;-;-
-"^(?:(?m)d[ex][fy]$)"
--;-;-;-
--;-;-;-
-"(?:(?m)d[ex][fy]$)$"
--;-;-;-
--;3-6;-;3-6
-strings
-""
-"abcdeff"
-regexps
-"(?m)d[ex][fy]$"
--;-;-;-
--;-;-;-
-"^(?:(?m)d[ex][fy]$)$"
--;-;-;-
--;-;-;-
-"^(?:(?m)d[ex][fy]$)"
--;-;-;-
--;-;-;-
-"(?:(?m)d[ex][fy]$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"abcdef"
-regexps
-"(?m)[dz][ex][fy]$"
--;-;-;-
--;3-6;-;3-6
-"^(?:(?m)[dz][ex][fy]$)$"
--;-;-;-
--;-;-;-
-"^(?:(?m)[dz][ex][fy]$)"
--;-;-;-
--;-;-;-
-"(?:(?m)[dz][ex][fy]$)$"
--;-;-;-
--;3-6;-;3-6
-strings
-""
-"abcdeff"
-regexps
-"(?m)[dz][ex][fy]$"
--;-;-;-
--;-;-;-
-"^(?:(?m)[dz][ex][fy]$)$"
--;-;-;-
--;-;-;-
-"^(?:(?m)[dz][ex][fy]$)"
--;-;-;-
--;-;-;-
-"(?:(?m)[dz][ex][fy]$)$"
--;-;-;-
--;-;-;-
-strings
-""
-"a"
-regexps
-"^"
-0-0;0-0;0-0;0-0
--;0-0;-;0-0
-"^(?:^)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^)"
-0-0;0-0;0-0;0-0
--;0-0;-;0-0
-"(?:^)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"a"
-regexps
-"^^"
-0-0;0-0;0-0;0-0
--;0-0;-;0-0
-"^(?:^^)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-"^(?:^^)"
-0-0;0-0;0-0;0-0
--;0-0;-;0-0
-"(?:^^)$"
-0-0;0-0;0-0;0-0
--;-;-;-
-strings
-""
-"a"
-regexps
-"a"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:a)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:a)"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:a)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"a"
-regexps
-"ab*"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:ab*)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:ab*)"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:ab*)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"a"
-regexps
-"a\\C*"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:a\\C*)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-"^(?:a\\C*)"
--;-;-;-
-0-1;0-1;0-1;0-1
-"(?:a\\C*)$"
--;-;-;-
-0-1;0-1;0-1;0-1
-strings
-""
-"baba"
-regexps
-"a\\C*|ba\\C"
--;-;-;-
--;0-3;-;0-3
-"^(?:a\\C*|ba\\C)$"
--;-;-;-
--;-;-;-
-"^(?:a\\C*|ba\\C)"
--;-;-;-
--;0-3;-;0-3
-"(?:a\\C*|ba\\C)$"
--;-;-;-
--;1-4;-;1-4
diff --git a/third_party/gofrontend/libgo/go/regexp/testdata/repetition.dat b/third_party/gofrontend/libgo/go/regexp/testdata/repetition.dat
deleted file mode 100644
index e6361f5..0000000
--- a/third_party/gofrontend/libgo/go/regexp/testdata/repetition.dat
+++ /dev/null
@@ -1,163 +0,0 @@
-NOTE	implicit vs. explicit repetitions : 2009-02-02
-
-# Glenn Fowler <gsf@research.att.com>
-# conforming matches (column 4) must match one of the following BREs
-#	NOMATCH
-#	(0,.)\((\(.\),\(.\))(?,?)(\2,\3)\)*
-#	(0,.)\((\(.\),\(.\))(\2,\3)(?,?)\)*
-# i.e., each 3-tuple has two identical elements and one (?,?)
-
-E	((..)|(.))				NULL		NOMATCH
-E	((..)|(.))((..)|(.))			NULL		NOMATCH
-E	((..)|(.))((..)|(.))((..)|(.))		NULL		NOMATCH
-
-E	((..)|(.)){1}				NULL		NOMATCH
-E	((..)|(.)){2}				NULL		NOMATCH
-E	((..)|(.)){3}				NULL		NOMATCH
-
-E	((..)|(.))*				NULL		(0,0)
-
-E	((..)|(.))				a		(0,1)(0,1)(?,?)(0,1)
-E	((..)|(.))((..)|(.))			a		NOMATCH
-E	((..)|(.))((..)|(.))((..)|(.))		a		NOMATCH
-
-E	((..)|(.)){1}				a		(0,1)(0,1)(?,?)(0,1)
-E	((..)|(.)){2}				a		NOMATCH
-E	((..)|(.)){3}				a		NOMATCH
-
-E	((..)|(.))*				a		(0,1)(0,1)(?,?)(0,1)
-
-E	((..)|(.))				aa		(0,2)(0,2)(0,2)(?,?)
-E	((..)|(.))((..)|(.))			aa		(0,2)(0,1)(?,?)(0,1)(1,2)(?,?)(1,2)
-E	((..)|(.))((..)|(.))((..)|(.))		aa		NOMATCH
-
-E	((..)|(.)){1}				aa		(0,2)(0,2)(0,2)(?,?)
-E	((..)|(.)){2}				aa		(0,2)(1,2)(?,?)(1,2)
-E	((..)|(.)){3}				aa		NOMATCH
-
-E	((..)|(.))*				aa		(0,2)(0,2)(0,2)(?,?)
-
-E	((..)|(.))				aaa		(0,2)(0,2)(0,2)(?,?)
-E	((..)|(.))((..)|(.))			aaa		(0,3)(0,2)(0,2)(?,?)(2,3)(?,?)(2,3)
-E	((..)|(.))((..)|(.))((..)|(.))		aaa		(0,3)(0,1)(?,?)(0,1)(1,2)(?,?)(1,2)(2,3)(?,?)(2,3)
-
-E	((..)|(.)){1}				aaa		(0,2)(0,2)(0,2)(?,?)
-#E	((..)|(.)){2}				aaa		(0,3)(2,3)(?,?)(2,3)
-E	((..)|(.)){2}				aaa		(0,3)(2,3)(0,2)(2,3)	RE2/Go
-E	((..)|(.)){3}				aaa		(0,3)(2,3)(?,?)(2,3)
-
-#E	((..)|(.))*				aaa		(0,3)(2,3)(?,?)(2,3)
-E	((..)|(.))*				aaa		(0,3)(2,3)(0,2)(2,3)	RE2/Go
-
-E	((..)|(.))				aaaa		(0,2)(0,2)(0,2)(?,?)
-E	((..)|(.))((..)|(.))			aaaa		(0,4)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)
-E	((..)|(.))((..)|(.))((..)|(.))		aaaa		(0,4)(0,2)(0,2)(?,?)(2,3)(?,?)(2,3)(3,4)(?,?)(3,4)
-
-E	((..)|(.)){1}				aaaa		(0,2)(0,2)(0,2)(?,?)
-E	((..)|(.)){2}				aaaa		(0,4)(2,4)(2,4)(?,?)
-#E	((..)|(.)){3}				aaaa		(0,4)(3,4)(?,?)(3,4)
-E	((..)|(.)){3}				aaaa		(0,4)(3,4)(0,2)(3,4)	RE2/Go
-
-E	((..)|(.))*				aaaa		(0,4)(2,4)(2,4)(?,?)
-
-E	((..)|(.))				aaaaa		(0,2)(0,2)(0,2)(?,?)
-E	((..)|(.))((..)|(.))			aaaaa		(0,4)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)
-E	((..)|(.))((..)|(.))((..)|(.))		aaaaa		(0,5)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)(4,5)(?,?)(4,5)
-
-E	((..)|(.)){1}				aaaaa		(0,2)(0,2)(0,2)(?,?)
-E	((..)|(.)){2}				aaaaa		(0,4)(2,4)(2,4)(?,?)
-#E	((..)|(.)){3}				aaaaa		(0,5)(4,5)(?,?)(4,5)
-E	((..)|(.)){3}				aaaaa		(0,5)(4,5)(2,4)(4,5)	RE2/Go
-
-#E	((..)|(.))*				aaaaa		(0,5)(4,5)(?,?)(4,5)
-E	((..)|(.))*				aaaaa		(0,5)(4,5)(2,4)(4,5)	RE2/Go
-
-E	((..)|(.))				aaaaaa		(0,2)(0,2)(0,2)(?,?)
-E	((..)|(.))((..)|(.))			aaaaaa		(0,4)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)
-E	((..)|(.))((..)|(.))((..)|(.))		aaaaaa		(0,6)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)(4,6)(4,6)(?,?)
-
-E	((..)|(.)){1}				aaaaaa		(0,2)(0,2)(0,2)(?,?)
-E	((..)|(.)){2}				aaaaaa		(0,4)(2,4)(2,4)(?,?)
-E	((..)|(.)){3}				aaaaaa		(0,6)(4,6)(4,6)(?,?)
-
-E	((..)|(.))*				aaaaaa		(0,6)(4,6)(4,6)(?,?)
-
-NOTE	additional repetition tests graciously provided by Chris Kuklewicz www.haskell.org 2009-02-02
-
-# These test a bug in OS X / FreeBSD / NetBSD, and libtree. 
-# Linux/GLIBC gets the {8,} and {8,8} wrong.
-
-:HA#100:E	X(.?){0,}Y	X1234567Y	(0,9)(7,8)
-:HA#101:E	X(.?){1,}Y	X1234567Y	(0,9)(7,8)
-:HA#102:E	X(.?){2,}Y	X1234567Y	(0,9)(7,8)
-:HA#103:E	X(.?){3,}Y	X1234567Y	(0,9)(7,8)
-:HA#104:E	X(.?){4,}Y	X1234567Y	(0,9)(7,8)
-:HA#105:E	X(.?){5,}Y	X1234567Y	(0,9)(7,8)
-:HA#106:E	X(.?){6,}Y	X1234567Y	(0,9)(7,8)
-:HA#107:E	X(.?){7,}Y	X1234567Y	(0,9)(7,8)
-:HA#108:E	X(.?){8,}Y	X1234567Y	(0,9)(8,8)
-#:HA#110:E	X(.?){0,8}Y	X1234567Y	(0,9)(7,8)
-:HA#110:E	X(.?){0,8}Y	X1234567Y	(0,9)(8,8)	RE2/Go
-#:HA#111:E	X(.?){1,8}Y	X1234567Y	(0,9)(7,8)
-:HA#111:E	X(.?){1,8}Y	X1234567Y	(0,9)(8,8)	RE2/Go
-#:HA#112:E	X(.?){2,8}Y	X1234567Y	(0,9)(7,8)
-:HA#112:E	X(.?){2,8}Y	X1234567Y	(0,9)(8,8)	RE2/Go
-#:HA#113:E	X(.?){3,8}Y	X1234567Y	(0,9)(7,8)
-:HA#113:E	X(.?){3,8}Y	X1234567Y	(0,9)(8,8)	RE2/Go
-#:HA#114:E	X(.?){4,8}Y	X1234567Y	(0,9)(7,8)
-:HA#114:E	X(.?){4,8}Y	X1234567Y	(0,9)(8,8)	RE2/Go
-#:HA#115:E	X(.?){5,8}Y	X1234567Y	(0,9)(7,8)
-:HA#115:E	X(.?){5,8}Y	X1234567Y	(0,9)(8,8)	RE2/Go
-#:HA#116:E	X(.?){6,8}Y	X1234567Y	(0,9)(7,8)
-:HA#116:E	X(.?){6,8}Y	X1234567Y	(0,9)(8,8)	RE2/Go
-#:HA#117:E	X(.?){7,8}Y	X1234567Y	(0,9)(7,8)
-:HA#117:E	X(.?){7,8}Y	X1234567Y	(0,9)(8,8)	RE2/Go
-:HA#118:E	X(.?){8,8}Y	X1234567Y	(0,9)(8,8)
-
-# These test a fixed bug in my regex-tdfa that did not keep the expanded
-# form properly grouped, so right association did the wrong thing with
-# these ambiguous patterns (crafted just to test my code when I became
-# suspicious of my implementation).  The first subexpression should use
-# "ab" then "a" then "bcd".
-
-# OS X / FreeBSD / NetBSD badly fail many of these, with impossible
-# results like (0,6)(4,5)(6,6).
-
-:HA#260:E	(a|ab|c|bcd){0,}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#261:E	(a|ab|c|bcd){1,}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#262:E	(a|ab|c|bcd){2,}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#263:E	(a|ab|c|bcd){3,}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#264:E	(a|ab|c|bcd){4,}(d*)	ababcd	NOMATCH
-:HA#265:E	(a|ab|c|bcd){0,10}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#266:E	(a|ab|c|bcd){1,10}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#267:E	(a|ab|c|bcd){2,10}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#268:E	(a|ab|c|bcd){3,10}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#269:E	(a|ab|c|bcd){4,10}(d*)	ababcd	NOMATCH
-:HA#270:E	(a|ab|c|bcd)*(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#271:E	(a|ab|c|bcd)+(d*)	ababcd	(0,6)(3,6)(6,6)
-
-# The above worked on Linux/GLIBC but the following often fail.
-# They also trip up OS X / FreeBSD / NetBSD:
-
-#:HA#280:E	(ab|a|c|bcd){0,}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#280:E	(ab|a|c|bcd){0,}(d*)	ababcd	(0,6)(4,5)(5,6)	RE2/Go
-#:HA#281:E	(ab|a|c|bcd){1,}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#281:E	(ab|a|c|bcd){1,}(d*)	ababcd	(0,6)(4,5)(5,6)	RE2/Go
-#:HA#282:E	(ab|a|c|bcd){2,}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#282:E	(ab|a|c|bcd){2,}(d*)	ababcd	(0,6)(4,5)(5,6)	RE2/Go
-#:HA#283:E	(ab|a|c|bcd){3,}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#283:E	(ab|a|c|bcd){3,}(d*)	ababcd	(0,6)(4,5)(5,6)	RE2/Go
-:HA#284:E	(ab|a|c|bcd){4,}(d*)	ababcd	NOMATCH
-#:HA#285:E	(ab|a|c|bcd){0,10}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#285:E	(ab|a|c|bcd){0,10}(d*)	ababcd	(0,6)(4,5)(5,6)	RE2/Go
-#:HA#286:E	(ab|a|c|bcd){1,10}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#286:E	(ab|a|c|bcd){1,10}(d*)	ababcd	(0,6)(4,5)(5,6)	RE2/Go
-#:HA#287:E	(ab|a|c|bcd){2,10}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#287:E	(ab|a|c|bcd){2,10}(d*)	ababcd	(0,6)(4,5)(5,6)	RE2/Go
-#:HA#288:E	(ab|a|c|bcd){3,10}(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#288:E	(ab|a|c|bcd){3,10}(d*)	ababcd	(0,6)(4,5)(5,6)	RE2/Go
-:HA#289:E	(ab|a|c|bcd){4,10}(d*)	ababcd	NOMATCH
-#:HA#290:E	(ab|a|c|bcd)*(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#290:E	(ab|a|c|bcd)*(d*)	ababcd	(0,6)(4,5)(5,6)	RE2/Go
-#:HA#291:E	(ab|a|c|bcd)+(d*)	ababcd	(0,6)(3,6)(6,6)
-:HA#291:E	(ab|a|c|bcd)+(d*)	ababcd	(0,6)(4,5)(5,6)	RE2/Go
diff --git a/third_party/gofrontend/libgo/go/regexp/testdata/testregex.c b/third_party/gofrontend/libgo/go/regexp/testdata/testregex.c
deleted file mode 100644
index 37545d0..0000000
--- a/third_party/gofrontend/libgo/go/regexp/testdata/testregex.c
+++ /dev/null
@@ -1,2286 +0,0 @@
-#pragma prototyped noticed
-
-/*
- * regex(3) test harness
- *
- * build:	cc -o testregex testregex.c
- * help:	testregex --man
- * note:	REG_* features are detected by #ifdef; if REG_* are enums
- *		then supply #define REG_foo REG_foo for each enum REG_foo
- *
- *	Glenn Fowler <gsf@research.att.com>
- *	AT&T Research
- *
- * PLEASE: publish your tests so everyone can benefit
- *
- * The following license covers testregex.c and all associated test data.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of THIS SOFTWARE FILE (the "Software"), to deal in the Software
- * without restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, and/or sell copies of the
- * Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following disclaimer:
- *
- * THIS SOFTWARE IS PROVIDED BY AT&T ``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 AT&T 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.
- */
-
-static const char id[] = "\n@(#)$Id: testregex (AT&T Research) 2010-06-10 $\0\n";
-
-#if _PACKAGE_ast
-#include <ast.h>
-#else
-#include <sys/types.h>
-#endif
-
-#include <stdio.h>
-#include <regex.h>
-#include <ctype.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifdef	__STDC__
-#include <stdlib.h>
-#include <locale.h>
-#endif
-
-#ifndef RE_DUP_MAX
-#define RE_DUP_MAX	32767
-#endif
-
-#if !_PACKAGE_ast
-#undef	REG_DISCIPLINE
-#endif
-
-#ifndef REG_DELIMITED
-#undef	_REG_subcomp
-#endif
-
-#define TEST_ARE		0x00000001
-#define TEST_BRE		0x00000002
-#define TEST_ERE		0x00000004
-#define TEST_KRE		0x00000008
-#define TEST_LRE		0x00000010
-#define TEST_SRE		0x00000020
-
-#define TEST_EXPAND		0x00000100
-#define TEST_LENIENT		0x00000200
-
-#define TEST_QUERY		0x00000400
-#define TEST_SUB		0x00000800
-#define TEST_UNSPECIFIED	0x00001000
-#define TEST_VERIFY		0x00002000
-#define TEST_AND		0x00004000
-#define TEST_OR			0x00008000
-
-#define TEST_DELIMIT		0x00010000
-#define TEST_OK			0x00020000
-#define TEST_SAME		0x00040000
-
-#define TEST_ACTUAL		0x00100000
-#define TEST_BASELINE		0x00200000
-#define TEST_FAIL		0x00400000
-#define TEST_PASS		0x00800000
-#define TEST_SUMMARY		0x01000000
-
-#define TEST_IGNORE_ERROR	0x02000000
-#define TEST_IGNORE_OVER	0x04000000
-#define TEST_IGNORE_POSITION	0x08000000
-
-#define TEST_CATCH		0x10000000
-#define TEST_VERBOSE		0x20000000
-
-#define TEST_DECOMP		0x40000000
-
-#define TEST_GLOBAL		(TEST_ACTUAL|TEST_AND|TEST_BASELINE|TEST_CATCH|TEST_FAIL|TEST_IGNORE_ERROR|TEST_IGNORE_OVER|TEST_IGNORE_POSITION|TEST_OR|TEST_PASS|TEST_SUMMARY|TEST_VERBOSE)
-
-#ifdef REG_DISCIPLINE
-
-
-#include <stk.h>
-
-typedef struct Disc_s
-{
-	regdisc_t	disc;
-	int		ordinal;
-	Sfio_t*		sp;
-} Disc_t;
-
-static void*
-compf(const regex_t* re, const char* xstr, size_t xlen, regdisc_t* disc)
-{
-	Disc_t*		dp = (Disc_t*)disc;
-
-	return (void*)((char*)0 + ++dp->ordinal);
-}
-
-static int
-execf(const regex_t* re, void* data, const char* xstr, size_t xlen, const char* sstr, size_t slen, char** snxt, regdisc_t* disc)
-{
-	Disc_t*		dp = (Disc_t*)disc;
-
-	sfprintf(dp->sp, "{%-.*s}(%lu:%d)", xlen, xstr, (char*)data - (char*)0, slen);
-	return atoi(xstr);
-}
-
-static void*
-resizef(void* handle, void* data, size_t size)
-{
-	if (!size)
-		return 0;
-	return stkalloc((Sfio_t*)handle, size);
-}
-
-#endif
-
-#ifndef NiL
-#ifdef	__STDC__
-#define NiL		0
-#else
-#define NiL		(char*)0
-#endif
-#endif
-
-#define H(x)		do{if(html)fprintf(stderr,x);}while(0)
-#define T(x)		fprintf(stderr,x)
-
-static void
-help(int html)
-{
-H("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n");
-H("<HTML>\n");
-H("<HEAD>\n");
-H("<TITLE>testregex man document</TITLE>\n");
-H("</HEAD>\n");
-H("<BODY bgcolor=white>\n");
-H("<PRE>\n");
-T("NAME\n");
-T("  testregex - regex(3) test harness\n");
-T("\n");
-T("SYNOPSIS\n");
-T("  testregex [ options ]\n");
-T("\n");
-T("DESCRIPTION\n");
-T("  testregex reads regex(3) test specifications, one per line, from the\n");
-T("  standard input and writes one output line for each failed test. A\n");
-T("  summary line is written after all tests are done. Each successful\n");
-T("  test is run again with REG_NOSUB. Unsupported features are noted\n");
-T("  before the first test, and tests requiring these features are\n");
-T("  silently ignored.\n");
-T("\n");
-T("OPTIONS\n");
-T("  -c	catch signals and non-terminating calls\n");
-T("  -e	ignore error return mismatches\n");
-T("  -h	list help on standard error\n");
-T("  -n	do not repeat successful tests with regnexec()\n");
-T("  -o	ignore match[] overrun errors\n");
-T("  -p	ignore negative position mismatches\n");
-T("  -s	use stack instead of malloc\n");
-T("  -x	do not repeat successful tests with REG_NOSUB\n");
-T("  -v	list each test line\n");
-T("  -A	list failed test lines with actual answers\n");
-T("  -B	list all test lines with actual answers\n");
-T("  -F	list failed test lines\n");
-T("  -P	list passed test lines\n");
-T("  -S	output one summary line\n");
-T("\n");
-T("INPUT FORMAT\n");
-T("  Input lines may be blank, a comment beginning with #, or a test\n");
-T("  specification. A specification is five fields separated by one\n");
-T("  or more tabs. NULL denotes the empty string and NIL denotes the\n");
-T("  0 pointer.\n");
-T("\n");
-T("  Field 1: the regex(3) flags to apply, one character per REG_feature\n");
-T("  flag. The test is skipped if REG_feature is not supported by the\n");
-T("  implementation. If the first character is not [BEASKLP] then the\n");
-T("  specification is a global control line. One or more of [BEASKLP] may be\n");
-T("  specified; the test will be repeated for each mode.\n");
-T("\n");
-T("    B 	basic			BRE	(grep, ed, sed)\n");
-T("    E 	REG_EXTENDED		ERE	(egrep)\n");
-T("    A	REG_AUGMENTED		ARE	(egrep with negation)\n");
-T("    S	REG_SHELL		SRE	(sh glob)\n");
-T("    K	REG_SHELL|REG_AUGMENTED	KRE	(ksh glob)\n");
-T("    L	REG_LITERAL		LRE	(fgrep)\n");
-T("\n");
-T("    a	REG_LEFT|REG_RIGHT	implicit ^...$\n");
-T("    b	REG_NOTBOL		lhs does not match ^\n");
-T("    c	REG_COMMENT		ignore space and #...\\n\n");
-T("    d	REG_SHELL_DOT		explicit leading . match\n");
-T("    e	REG_NOTEOL		rhs does not match $\n");
-T("    f	REG_MULTIPLE		multiple \\n separated patterns\n");
-T("    g	FNM_LEADING_DIR		testfnmatch only -- match until /\n");
-T("    h	REG_MULTIREF		multiple digit backref\n");
-T("    i	REG_ICASE		ignore case\n");
-T("    j	REG_SPAN		. matches \\n\n");
-T("    k	REG_ESCAPE		\\ to ecape [...] delimiter\n");
-T("    l	REG_LEFT		implicit ^...\n");
-T("    m	REG_MINIMAL		minimal match\n");
-T("    n	REG_NEWLINE		explicit \\n match\n");
-T("    o	REG_ENCLOSED		(|&) magic inside [@|&](...)\n");
-T("    p	REG_SHELL_PATH		explicit / match\n");
-T("    q	REG_DELIMITED		delimited pattern\n");
-T("    r	REG_RIGHT		implicit ...$\n");
-T("    s	REG_SHELL_ESCAPED	\\ not special\n");
-T("    t	REG_MUSTDELIM		all delimiters must be specified\n");
-T("    u	standard unspecified behavior -- errors not counted\n");
-T("    v	REG_CLASS_ESCAPE	\\ special inside [...]\n");
-T("    w	REG_NOSUB		no subexpression match array\n");
-T("    x	REG_LENIENT		let some errors slide\n");
-T("    y	REG_LEFT		regexec() implicit ^...\n");
-T("    z	REG_NULL		NULL subexpressions ok\n");
-T("    $	                        expand C \\c escapes in fields 2 and 3\n");
-T("    /	                        field 2 is a regsubcomp() expression\n");
-T("    =	                        field 3 is a regdecomp() expression\n");
-T("\n");
-T("  Field 1 control lines:\n");
-T("\n");
-T("    C		set LC_COLLATE and LC_CTYPE to locale in field 2\n");
-T("\n");
-T("    ?test ...	output field 5 if passed and != EXPECTED, silent otherwise\n");
-T("    &test ...	output field 5 if current and previous passed\n");
-T("    |test ...	output field 5 if current passed and previous failed\n");
-T("    ; ...	output field 2 if previous failed\n");
-T("    {test ...	skip if failed until }\n");
-T("    }		end of skip\n");
-T("\n");
-T("    : comment		comment copied as output NOTE\n");
-T("    :comment:test	:comment: ignored\n");
-T("    N[OTE] comment	comment copied as output NOTE\n");
-T("    T[EST] comment	comment\n");
-T("\n");
-T("    number		use number for nmatch (20 by default)\n");
-T("\n");
-T("  Field 2: the regular expression pattern; SAME uses the pattern from\n");
-T("    the previous specification. RE_DUP_MAX inside {...} expands to the\n");
-T("    value from <limits.h>.\n");
-T("\n");
-T("  Field 3: the string to match. X...{RE_DUP_MAX} expands to RE_DUP_MAX\n");
-T("    copies of X.\n");
-T("\n");
-T("  Field 4: the test outcome. This is either one of the posix error\n");
-T("    codes (with REG_ omitted) or the match array, a list of (m,n)\n");
-T("    entries with m and n being first and last+1 positions in the\n");
-T("    field 3 string, or NULL if REG_NOSUB is in effect and success\n");
-T("    is expected. BADPAT is acceptable in place of any regcomp(3)\n");
-T("    error code. The match[] array is initialized to (-2,-2) before\n");
-T("    each test. All array elements from 0 to nmatch-1 must be specified\n");
-T("    in the outcome. Unspecified endpoints (offset -1) are denoted by ?.\n");
-T("    Unset endpoints (offset -2) are denoted by X. {x}(o:n) denotes a\n");
-T("    matched (?{...}) expression, where x is the text enclosed by {...},\n");
-T("    o is the expression ordinal counting from 1, and n is the length of\n");
-T("    the unmatched portion of the subject string. If x starts with a\n");
-T("    number then that is the return value of re_execf(), otherwise 0 is\n");
-T("    returned. RE_DUP_MAX[-+]N expands to the <limits.h> value -+N.\n");
-T("\n");
-T("  Field 5: optional comment appended to the report.\n");
-T("\n");
-T("CAVEAT\n");
-T("    If a regex implementation misbehaves with memory then all bets are off.\n");
-T("\n");
-T("CONTRIBUTORS\n");
-T("  Glenn Fowler    gsf@research.att.com        (ksh strmatch, regex extensions)\n");
-T("  David Korn      dgk@research.att.com        (ksh glob matcher)\n");
-T("  Doug McIlroy    mcilroy@dartmouth.edu       (ast regex/testre in C++)\n");
-T("  Tom Lord        lord@regexps.com            (rx tests)\n");
-T("  Henry Spencer   henry@zoo.toronto.edu       (original public regex)\n");
-T("  Andrew Hume     andrew@research.att.com     (gre tests)\n");
-T("  John Maddock    John_Maddock@compuserve.com (regex++ tests)\n");
-T("  Philip Hazel    ph10@cam.ac.uk              (pcre tests)\n");
-T("  Ville Laurikari vl@iki.fi                   (libtre tests)\n");
-H("</PRE>\n");
-H("</BODY>\n");
-H("</HTML>\n");
-}
-
-#ifndef elementsof
-#define elementsof(x)	(sizeof(x)/sizeof(x[0]))
-#endif
-
-#ifndef streq
-#define streq(a,b)	(*(a)==*(b)&&!strcmp(a,b))
-#endif
-
-#define HUNG		2
-#define NOTEST		(~0)
-
-#ifndef REG_TEST_DEFAULT
-#define REG_TEST_DEFAULT	0
-#endif
-
-#ifndef REG_EXEC_DEFAULT
-#define REG_EXEC_DEFAULT	0
-#endif
-
-static const char* unsupported[] =
-{
-	"BASIC",
-#ifndef REG_EXTENDED
-	"EXTENDED",
-#endif
-#ifndef REG_AUGMENTED
-	"AUGMENTED",
-#endif
-#ifndef REG_SHELL
-	"SHELL",
-#endif
-
-#ifndef REG_CLASS_ESCAPE
-	"CLASS_ESCAPE",
-#endif
-#ifndef REG_COMMENT
-	"COMMENT",
-#endif
-#ifndef REG_DELIMITED
-	"DELIMITED",
-#endif
-#ifndef REG_DISCIPLINE
-	"DISCIPLINE",
-#endif
-#ifndef REG_ESCAPE
-	"ESCAPE",
-#endif
-#ifndef REG_ICASE
-	"ICASE",
-#endif
-#ifndef REG_LEFT
-	"LEFT",
-#endif
-#ifndef REG_LENIENT
-	"LENIENT",
-#endif
-#ifndef REG_LITERAL
-	"LITERAL",
-#endif
-#ifndef REG_MINIMAL
-	"MINIMAL",
-#endif
-#ifndef REG_MULTIPLE
-	"MULTIPLE",
-#endif
-#ifndef REG_MULTIREF
-	"MULTIREF",
-#endif
-#ifndef REG_MUSTDELIM
-	"MUSTDELIM",
-#endif
-#ifndef REG_NEWLINE
-	"NEWLINE",
-#endif
-#ifndef REG_NOTBOL
-	"NOTBOL",
-#endif
-#ifndef REG_NOTEOL
-	"NOTEOL",
-#endif
-#ifndef REG_NULL
-	"NULL",
-#endif
-#ifndef REG_RIGHT
-	"RIGHT",
-#endif
-#ifndef REG_SHELL_DOT
-	"SHELL_DOT",
-#endif
-#ifndef REG_SHELL_ESCAPED
-	"SHELL_ESCAPED",
-#endif
-#ifndef REG_SHELL_GROUP
-	"SHELL_GROUP",
-#endif
-#ifndef REG_SHELL_PATH
-	"SHELL_PATH",
-#endif
-#ifndef REG_SPAN
-	"SPAN",
-#endif
-#if REG_NOSUB & REG_TEST_DEFAULT
-	"SUBMATCH",
-#endif
-#if !_REG_nexec
-	"regnexec",
-#endif
-#if !_REG_subcomp
-	"regsubcomp",
-#endif
-#if !_REG_decomp
-	"redecomp",
-#endif
-	0
-};
-
-#ifndef REG_CLASS_ESCAPE
-#define REG_CLASS_ESCAPE	NOTEST
-#endif
-#ifndef REG_COMMENT
-#define REG_COMMENT	NOTEST
-#endif
-#ifndef REG_DELIMITED
-#define REG_DELIMITED	NOTEST
-#endif
-#ifndef REG_ESCAPE
-#define REG_ESCAPE	NOTEST
-#endif
-#ifndef REG_ICASE
-#define REG_ICASE	NOTEST
-#endif
-#ifndef REG_LEFT
-#define REG_LEFT	NOTEST
-#endif
-#ifndef REG_LENIENT
-#define REG_LENIENT	0
-#endif
-#ifndef REG_MINIMAL
-#define REG_MINIMAL	NOTEST
-#endif
-#ifndef REG_MULTIPLE
-#define REG_MULTIPLE	NOTEST
-#endif
-#ifndef REG_MULTIREF
-#define REG_MULTIREF	NOTEST
-#endif
-#ifndef REG_MUSTDELIM
-#define REG_MUSTDELIM	NOTEST
-#endif
-#ifndef REG_NEWLINE
-#define REG_NEWLINE	NOTEST
-#endif
-#ifndef REG_NOTBOL
-#define REG_NOTBOL	NOTEST
-#endif
-#ifndef REG_NOTEOL
-#define REG_NOTEOL	NOTEST
-#endif
-#ifndef REG_NULL
-#define REG_NULL	NOTEST
-#endif
-#ifndef REG_RIGHT
-#define REG_RIGHT	NOTEST
-#endif
-#ifndef REG_SHELL_DOT
-#define REG_SHELL_DOT	NOTEST
-#endif
-#ifndef REG_SHELL_ESCAPED
-#define REG_SHELL_ESCAPED	NOTEST
-#endif
-#ifndef REG_SHELL_GROUP
-#define REG_SHELL_GROUP	NOTEST
-#endif
-#ifndef REG_SHELL_PATH
-#define REG_SHELL_PATH	NOTEST
-#endif
-#ifndef REG_SPAN
-#define REG_SPAN	NOTEST
-#endif
-
-#define REG_UNKNOWN	(-1)
-
-#ifndef REG_ENEWLINE
-#define REG_ENEWLINE	(REG_UNKNOWN-1)
-#endif
-#ifndef REG_ENULL
-#ifndef REG_EMPTY
-#define REG_ENULL	(REG_UNKNOWN-2)
-#else
-#define REG_ENULL	REG_EMPTY
-#endif
-#endif
-#ifndef REG_ECOUNT
-#define REG_ECOUNT	(REG_UNKNOWN-3)
-#endif
-#ifndef REG_BADESC
-#define REG_BADESC	(REG_UNKNOWN-4)
-#endif
-#ifndef REG_EMEM
-#define REG_EMEM	(REG_UNKNOWN-5)
-#endif
-#ifndef REG_EHUNG
-#define REG_EHUNG	(REG_UNKNOWN-6)
-#endif
-#ifndef REG_EBUS
-#define REG_EBUS	(REG_UNKNOWN-7)
-#endif
-#ifndef REG_EFAULT
-#define REG_EFAULT	(REG_UNKNOWN-8)
-#endif
-#ifndef REG_EFLAGS
-#define REG_EFLAGS	(REG_UNKNOWN-9)
-#endif
-#ifndef REG_EDELIM
-#define REG_EDELIM	(REG_UNKNOWN-9)
-#endif
-
-static const struct { int code; char* name; } codes[] =
-{
-	REG_UNKNOWN,	"UNKNOWN",
-	REG_NOMATCH,	"NOMATCH",
-	REG_BADPAT,	"BADPAT",
-	REG_ECOLLATE,	"ECOLLATE",
-	REG_ECTYPE,	"ECTYPE",
-	REG_EESCAPE,	"EESCAPE",
-	REG_ESUBREG,	"ESUBREG",
-	REG_EBRACK,	"EBRACK",
-	REG_EPAREN,	"EPAREN",
-	REG_EBRACE,	"EBRACE",
-	REG_BADBR,	"BADBR",
-	REG_ERANGE,	"ERANGE",
-	REG_ESPACE,	"ESPACE",
-	REG_BADRPT,	"BADRPT",
-	REG_ENEWLINE,	"ENEWLINE",
-	REG_ENULL,	"ENULL",
-	REG_ECOUNT,	"ECOUNT",
-	REG_BADESC,	"BADESC",
-	REG_EMEM,	"EMEM",
-	REG_EHUNG,	"EHUNG",
-	REG_EBUS,	"EBUS",
-	REG_EFAULT,	"EFAULT",
-	REG_EFLAGS,	"EFLAGS",
-	REG_EDELIM,	"EDELIM",
-};
-
-static struct
-{
-	regmatch_t	NOMATCH;
-	int		errors;
-	int		extracted;
-	int		ignored;
-	int		lineno;
-	int		passed;
-	int		signals;
-	int		unspecified;
-	int		verify;
-	int		warnings;
-	char*		file;
-	char*		stack;
-	char*		which;
-	jmp_buf		gotcha;
-#ifdef REG_DISCIPLINE
-	Disc_t		disc;
-#endif
-} state;
-
-static void
-quote(char* s, int len, unsigned long test)
-{
-	unsigned char*	u = (unsigned char*)s;
-	unsigned char*	e;
-	int		c;
-#ifdef MB_CUR_MAX
-	int		w;
-#endif
-
-	if (!u)
-		printf("NIL");
-	else if (!*u && len <= 1)
-		printf("NULL");
-	else if (test & TEST_EXPAND)
-	{
-		if (len < 0)
-			len = strlen((char*)u);
-		e = u + len;
-		if (test & TEST_DELIMIT)
-			printf("\"");
-		while (u < e)
-			switch (c = *u++)
-			{
-			case '\\':
-				printf("\\\\");
-				break;
-			case '"':
-				if (test & TEST_DELIMIT)
-					printf("\\\"");
-				else
-					printf("\"");
-				break;
-			case '\a':
-				printf("\\a");
-				break;
-			case '\b':
-				printf("\\b");
-				break;
-			case 033:
-				printf("\\e");
-				break;
-			case '\f':
-				printf("\\f");
-				break;
-			case '\n':
-				printf("\\n");
-				break;
-			case '\r':
-				printf("\\r");
-				break;
-			case '\t':
-				printf("\\t");
-				break;
-			case '\v':
-				printf("\\v");
-				break;
-			default:
-#ifdef MB_CUR_MAX
-				s = (char*)u - 1;
-				if ((w = mblen(s, (char*)e - s)) > 1)
-				{
-					u += w - 1;
-					fwrite(s, 1, w, stdout);
-				}
-				else
-#endif
-				if (!iscntrl(c) && isprint(c))
-					putchar(c);
-				else
-					printf("\\x%02x", c);
-				break;
-			}
-		if (test & TEST_DELIMIT)
-			printf("\"");
-	}
-	else
-		printf("%s", s);
-}
-
-static void
-report(char* comment, char* fun, char* re, char* s, int len, char* msg, int flags, unsigned long test)
-{
-	if (state.file)
-		printf("%s:", state.file);
-	printf("%d:", state.lineno);
-	if (re)
-	{
-		printf(" ");
-		quote(re, -1, test|TEST_DELIMIT);
-		if (s)
-		{
-			printf(" versus ");
-			quote(s, len, test|TEST_DELIMIT);
-		}
-	}
-	if (test & TEST_UNSPECIFIED)
-	{
-		state.unspecified++;
-		printf(" unspecified behavior");
-	}
-	else
-		state.errors++;
-	if (state.which)
-		printf(" %s", state.which);
-	if (flags & REG_NOSUB)
-		printf(" NOSUB");
-	if (fun)
-		printf(" %s", fun);
-	if (comment[strlen(comment)-1] == '\n')
-		printf(" %s", comment);
-	else
-	{
-		printf(" %s: ", comment);
-		if (msg)
-			printf("%s: ", msg);
-	}
-}
-
-static void
-error(regex_t* preg, int code)
-{
-	char*	msg;
-	char	buf[256];
-
-	switch (code)
-	{
-	case REG_EBUS:
-		msg = "bus error";
-		break;
-	case REG_EFAULT:
-		msg = "memory fault";
-		break;
-	case REG_EHUNG:
-		msg = "did not terminate";
-		break;
-	default:
-		regerror(code, preg, msg = buf, sizeof buf);
-		break;
-	}
-	printf("%s\n", msg);
-}
-
-static void
-bad(char* comment, char* re, char* s, int len, unsigned long test)
-{
-	printf("bad test case ");
-	report(comment, NiL, re, s, len, NiL, 0, test);
-	exit(1);
-}
-
-static int
-escape(char* s)
-{
-	char*	b;
-	char*	t;
-	char*	q;
-	char*	e;
-	int	c;
-
-	for (b = t = s; *t = *s; s++, t++)
-		if (*s == '\\')
-			switch (*++s)
-			{
-			case '\\':
-				break;
-			case 'a':
-				*t = '\a';
-				break;
-			case 'b':
-				*t = '\b';
-				break;
-			case 'c':
-				if (*t = *++s)
-					*t &= 037;
-				else
-					s--;
-				break;
-			case 'e':
-			case 'E':
-				*t = 033;
-				break;
-			case 'f':
-				*t = '\f';
-				break;
-			case 'n':
-				*t = '\n';
-				break;
-			case 'r':
-				*t = '\r';
-				break;
-			case 's':
-				*t = ' ';
-				break;
-			case 't':
-				*t = '\t';
-				break;
-			case 'v':
-				*t = '\v';
-				break;
-			case 'u':
-			case 'x':
-				c = 0;
-				q = c == 'u' ? (s + 5) : (char*)0;
-				e = s + 1;
-				while (!e || !q || s < q)
-				{
-					switch (*++s)
-					{
-					case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
-						c = (c << 4) + *s - 'a' + 10;
-						continue;
-					case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
-						c = (c << 4) + *s - 'A' + 10;
-						continue;
-					case '0': case '1': case '2': case '3': case '4':
-					case '5': case '6': case '7': case '8': case '9':
-						c = (c << 4) + *s - '0';
-						continue;
-					case '{':
-					case '[':
-						if (s != e)
-						{
-							s--;
-							break;
-						}
-						e = 0;
-						continue;
-					case '}':
-					case ']':
-						if (e)
-							s--;
-						break;
-					default:
-						s--;
-						break;
-					}
-					break;
-				}
-				*t = c;
-				break;
-			case '0': case '1': case '2': case '3':
-			case '4': case '5': case '6': case '7':
-				c = *s - '0';
-				q = s + 2;
-				while (s < q)
-				{
-					switch (*++s)
-					{
-					case '0': case '1': case '2': case '3':
-					case '4': case '5': case '6': case '7':
-						c = (c << 3) + *s - '0';
-						break;
-					default:
-						q = --s;
-						break;
-					}
-				}
-				*t = c;
-				break;
-			default:
-				*(s + 1) = 0;
-				bad("invalid C \\ escape\n", s - 1, NiL, 0, 0);
-			}
-	return t - b;
-}
-
-static void
-matchoffprint(int off)
-{
-	switch (off)
-	{
-	case -2:
-		printf("X");
-		break;
-	case -1:
-		printf("?");
-		break;
-	default:
-		printf("%d", off);
-		break;
-	}
-}
-
-static void
-matchprint(regmatch_t* match, int nmatch, int nsub, char* ans, unsigned long test)
-{
-	int	i;
-
-	for (; nmatch > nsub + 1; nmatch--)
-		if ((match[nmatch-1].rm_so != -1 || match[nmatch-1].rm_eo != -1) && (!(test & TEST_IGNORE_POSITION) || match[nmatch-1].rm_so >= 0 && match[nmatch-1].rm_eo >= 0))
-			break;
-	for (i = 0; i < nmatch; i++)
-	{
-		printf("(");
-		matchoffprint(match[i].rm_so);
-		printf(",");
-		matchoffprint(match[i].rm_eo);
-		printf(")");
-	}
-	if (!(test & (TEST_ACTUAL|TEST_BASELINE)))
-	{
-		if (ans)
-			printf(" expected: %s", ans);
-		printf("\n");
-	}
-}
-
-static int
-matchcheck(regmatch_t* match, int nmatch, int nsub, char* ans, char* re, char* s, int len, int flags, unsigned long test)
-{
-	char*	p;
-	int	i;
-	int	m;
-	int	n;
-
-	if (streq(ans, "OK"))
-		return test & (TEST_BASELINE|TEST_PASS|TEST_VERIFY);
-	for (i = 0, p = ans; i < nmatch && *p; i++)
-	{
-		if (*p == '{')
-		{
-#ifdef REG_DISCIPLINE
-			char*	x;
-
-			if (!(x = sfstruse(state.disc.sp)))
-				bad("out of space [discipline string]\n", NiL, NiL, 0, 0);
-			if (strcmp(p, x))
-			{
-				if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
-					return 0;
-				report("callout failed", NiL, re, s, len, NiL, flags, test);
-				quote(p, -1, test);
-				printf(" expected, ");
-				quote(x, -1, test);
-				printf(" returned\n");
-			}
-#endif
-			break;
-		}
-		if (*p++ != '(')
-			bad("improper answer\n", re, s, -1, test);
-		if (*p == '?')
-		{
-			m = -1;
-			p++;
-		}
-		else if (*p == 'R' && !memcmp(p, "RE_DUP_MAX", 10))
-		{
-			m = RE_DUP_MAX;
-			p += 10;
-			if (*p == '+' || *p == '-')
-				m += strtol(p, &p, 10);
-		}
-		else
-			m = strtol(p, &p, 10);
-		if (*p++ != ',')
-			bad("improper answer\n", re, s, -1, test);
-		if (*p == '?')
-		{
-			n = -1;
-			p++;
-		}
-		else if (*p == 'R' && !memcmp(p, "RE_DUP_MAX", 10))
-		{
-			n = RE_DUP_MAX;
-			p += 10;
-			if (*p == '+' || *p == '-')
-				n += strtol(p, &p, 10);
-		}
-		else
-			n = strtol(p, &p, 10);
-		if (*p++ != ')')
-			bad("improper answer\n", re, s, -1, test);
-		if (m!=match[i].rm_so || n!=match[i].rm_eo)
-		{
-			if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY)))
-			{
-				report("failed: match was", NiL, re, s, len, NiL, flags, test);
-				matchprint(match, nmatch, nsub, ans, test);
-			}
-			return 0;
-		}
-	}
-	for (; i < nmatch; i++)
-	{
-		if (match[i].rm_so!=-1 || match[i].rm_eo!=-1)
-		{
-			if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_VERIFY)))
-			{
-				if ((test & TEST_IGNORE_POSITION) && (match[i].rm_so<0 || match[i].rm_eo<0))
-				{
-					state.ignored++;
-					return 0;
-				}
-				if (!(test & TEST_SUMMARY))
-				{
-					report("failed: match was", NiL, re, s, len, NiL, flags, test);
-					matchprint(match, nmatch, nsub, ans, test);
-				}
-			}
-			return 0;
-		}
-	}
-	if (!(test & TEST_IGNORE_OVER) && match[nmatch].rm_so != state.NOMATCH.rm_so)
-	{
-		if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY)))
-		{
-			report("failed: overran match array", NiL, re, s, len, NiL, flags, test);
-			matchprint(match, nmatch + 1, nsub, NiL, test);
-		}
-		return 0;
-	}
-	return 1;
-}
-
-static void
-sigunblock(int s)
-{
-#ifdef SIG_SETMASK
-	int		op;
-	sigset_t	mask;
-
-	sigemptyset(&mask);
-	if (s)
-	{
-		sigaddset(&mask, s);
-		op = SIG_UNBLOCK;
-	}
-	else op = SIG_SETMASK;
-	sigprocmask(op, &mask, NiL);
-#else
-#ifdef sigmask
-	sigsetmask(s ? (sigsetmask(0L) & ~sigmask(s)) : 0L);
-#endif
-#endif
-}
-
-static void
-gotcha(int sig)
-{
-	int	ret;
-
-	signal(sig, gotcha);
-	alarm(0);
-	state.signals++;
-	switch (sig)
-	{
-	case SIGALRM:
-		ret = REG_EHUNG;
-		break;
-	case SIGBUS:
-		ret = REG_EBUS;
-		break;
-	default:
-		ret = REG_EFAULT;
-		break;
-	}
-	sigunblock(sig);
-	longjmp(state.gotcha, ret);
-}
-
-static char*
-getline(FILE* fp)
-{
-	static char	buf[32 * 1024];
-
-	register char*	s = buf;
-	register char*	e = &buf[sizeof(buf)];
-	register char*	b;
-
-	for (;;)
-	{
-		if (!(b = fgets(s, e - s, fp)))
-			return 0;
-		state.lineno++;
-		s += strlen(s);
-		if (s == b || *--s != '\n' || s == b || *(s - 1) != '\\')
-		{
-			*s = 0;
-			break;
-		}
-		s--;
-	}
-	return buf;
-}
-
-static unsigned long
-note(unsigned long level, char* msg, unsigned long skip, unsigned long test)
-{
-	if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_SUMMARY)) && !skip)
-	{
-		printf("NOTE\t");
-		if (msg)
-			printf("%s: ", msg);
-		printf("skipping lines %d", state.lineno);
-	}
-	return skip | level;
-}
-
-#define TABS(n)		&ts[7-((n)&7)]
-
-static char		ts[] = "\t\t\t\t\t\t\t";
-
-static unsigned long
-extract(int* tabs, char* spec, char* re, char* s, char* ans, char* msg, char* accept, regmatch_t* match, int nmatch, int nsub, unsigned long skip, unsigned long level, unsigned long test)
-{
-	if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_OK|TEST_PASS|TEST_SUMMARY))
-	{
-		state.extracted = 1;
-		if (test & TEST_OK)
-		{
-			state.passed++;
-			if ((test & TEST_VERIFY) && !(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_SUMMARY)))
-			{
-				if (msg && strcmp(msg, "EXPECTED"))
-					printf("NOTE\t%s\n", msg);
-				return skip;
-			}
-			test &= ~(TEST_PASS|TEST_QUERY);
-		}
-		if (test & (TEST_QUERY|TEST_VERIFY))
-		{
-			if (test & TEST_BASELINE)
-				test &= ~(TEST_BASELINE|TEST_PASS);
-			else
-				test |= TEST_PASS;
-			skip |= level;
-		}
-		if (!(test & TEST_OK))
-		{
-			if (test & TEST_UNSPECIFIED)
-				state.unspecified++;
-			else
-				state.errors++;
-		}
-		if (test & (TEST_PASS|TEST_SUMMARY))
-			return skip;
-		test &= ~TEST_DELIMIT;
-		printf("%s%s", spec, TABS(*tabs++));
-		if ((test & (TEST_BASELINE|TEST_SAME)) == (TEST_BASELINE|TEST_SAME))
-			printf("SAME");
-		else
-			quote(re, -1, test);
-		printf("%s", TABS(*tabs++));
-		quote(s, -1, test);
-		printf("%s", TABS(*tabs++));
-		if (!(test & (TEST_ACTUAL|TEST_BASELINE)) || !accept && !match)
-			printf("%s", ans);
-		else if (accept)
-			printf("%s", accept);
-		else
-			matchprint(match, nmatch, nsub, NiL, test);
-		if (msg)
-			printf("%s%s", TABS(*tabs++), msg);
-		putchar('\n');
-	}
-	else if (test & TEST_QUERY)
-		skip = note(level, msg, skip, test);
-	else if (test & TEST_VERIFY)
-		state.extracted = 1;
-	return skip;
-}
-
-static int
-catchfree(regex_t* preg, int flags, int* tabs, char* spec, char* re, char* s, char* ans, char* msg, char* accept, regmatch_t* match, int nmatch, int nsub, unsigned long skip, unsigned long level, unsigned long test)
-{
-	int	eret;
-
-	if (!(test & TEST_CATCH))
-	{
-		regfree(preg);
-		eret = 0;
-	}
-	else if (!(eret = setjmp(state.gotcha)))
-	{
-		alarm(HUNG);
-		regfree(preg);
-		alarm(0);
-	}
-	else if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
-		extract(tabs, spec, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test);
-	else
-	{
-		report("failed", "regfree", re, NiL, -1, msg, flags, test);
-		error(preg, eret);
-	}
-	return eret;
-}
-
-static char*
-expand(char* os, char* ot)
-{
-	char*	s = os;
-	char*	t;
-	int	n = 0;
-	int	r;
-	long	m;
-
-	for (;;)
-	{
-		switch (*s++)
-		{
-		case 0:
-			break;
-		case '{':
-			n++;
-			continue;
-		case '}':
-			n--;
-			continue;
-		case 'R':
-			if (n == 1 && !memcmp(s, "E_DUP_MAX", 9))
-			{
-				s--;
-				for (t = ot; os < s; *t++ = *os++);
-				r = ((t - ot) >= 5 && t[-1] == '{' && t[-2] == '.' && t[-3] == '.' && t[-4] == '.') ? t[-5] : 0;
-				os = ot;
-				m = RE_DUP_MAX;
-				if (*(s += 10) == '+' || *s == '-')
-					m += strtol(s, &s, 10);
-				if (r)
-				{
-					t -= 5;
-					while (m-- > 0)
-						*t++ = r;
-					while (*s && *s++ != '}');
-				}
-				else
-					t += snprintf(t, 32, "%ld", m);
-				while (*t = *s++)
-					t++;
-				break;
-			}
-			continue;
-		default:
-			continue;
-		}
-		break;
-	}
-	return os;
-}
-
-int
-main(int argc, char** argv)
-{
-	int		flags;
-	int		cflags;
-	int		eflags;
-	int		nmatch;
-	int		nexec;
-	int		nstr;
-	int		cret;
-	int		eret;
-	int		nsub;
-	int		i;
-	int		j;
-	int		expected;
-	int		got;
-	int		locale;
-	int		subunitlen;
-	int		testno;
-	unsigned long	level;
-	unsigned long	skip;
-	char*		p;
-	char*		line;
-	char*		spec;
-	char*		re;
-	char*		s;
-	char*		ans;
-	char*		msg;
-	char*		fun;
-	char*		ppat;
-	char*		subunit;
-	char*		version;
-	char*		field[6];
-	char*		delim[6];
-	FILE*		fp;
-	int		tabs[6];
-	char		unit[64];
-	regmatch_t	match[100];
-	regex_t		preg;
-
-	static char	pat[32 * 1024];
-	static char	patbuf[32 * 1024];
-	static char	strbuf[32 * 1024];
-
-	int		nonosub = REG_NOSUB == 0;
-	int		nonexec = 0;
-
-	unsigned long	test = 0;
-
-	static char*	filter[] = { "-", 0 };
-
-	state.NOMATCH.rm_so = state.NOMATCH.rm_eo = -2;
-	p = unit;
-	version = (char*)id + 10;
-	while (p < &unit[sizeof(unit)-1] && (*p = *version++) && !isspace(*p))
-		p++;
-	*p = 0;
-	while ((p = *++argv) && *p == '-')
-		for (;;)
-		{
-			switch (*++p)
-			{
-			case 0:
-				break;
-			case 'c':
-				test |= TEST_CATCH;
-				continue;
-			case 'e':
-				test |= TEST_IGNORE_ERROR;
-				continue;
-			case 'h':
-			case '?':
-				help(0);
-				return 2;
-			case '-':
-				help(p[1] == 'h');
-				return 2;
-			case 'n':
-				nonexec = 1;
-				continue;
-			case 'o':
-				test |= TEST_IGNORE_OVER;
-				continue;
-			case 'p':
-				test |= TEST_IGNORE_POSITION;
-				continue;
-			case 's':
-#ifdef REG_DISCIPLINE
-				if (!(state.stack = stkalloc(stkstd, 0)))
-					fprintf(stderr, "%s: out of space [stack]", unit);
-				state.disc.disc.re_resizef = resizef;
-				state.disc.disc.re_resizehandle = (void*)stkstd;
-#endif
-				continue;
-			case 'x':
-				nonosub = 1;
-				continue;
-			case 'v':
-				test |= TEST_VERBOSE;
-				continue;
-			case 'A':
-				test |= TEST_ACTUAL;
-				continue;
-			case 'B':
-				test |= TEST_BASELINE;
-				continue;
-			case 'F':
-				test |= TEST_FAIL;
-				continue;
-			case 'P':
-				test |= TEST_PASS;
-				continue;
-			case 'S':
-				test |= TEST_SUMMARY;
-				continue;
-			default:
-				fprintf(stderr, "%s: %c: invalid option\n", unit, *p);
-				return 2;
-			}
-			break;
-		}
-	if (!*argv)
-		argv = filter;
-	locale = 0;
-	while (state.file = *argv++)
-	{
-		if (streq(state.file, "-") || streq(state.file, "/dev/stdin") || streq(state.file, "/dev/fd/0"))
-		{
-			state.file = 0;
-			fp = stdin;
-		}
-		else if (!(fp = fopen(state.file, "r")))
-		{
-			fprintf(stderr, "%s: %s: cannot read\n", unit, state.file);
-			return 2;
-		}
-		testno = state.errors = state.ignored = state.lineno = state.passed =
-		state.signals = state.unspecified = state.warnings = 0;
-		skip = 0;
-		level = 1;
-		if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_SUMMARY)))
-		{
-			printf("TEST\t%s ", unit);
-			if (s = state.file)
-			{
-				subunit = p = 0;
-				for (;;)
-				{
-					switch (*s++)
-					{
-					case 0:
-						break;
-					case '/':
-						subunit = s;
-						continue;
-					case '.':
-						p = s - 1;
-						continue;
-					default:
-						continue;
-					}
-					break;
-				}
-				if (!subunit)
-					subunit = state.file;
-				if (p < subunit)
-					p = s - 1;
-				subunitlen = p - subunit;
-				printf("%-.*s ", subunitlen, subunit);
-			}
-			else
-				subunit = 0;
-			for (s = version; *s && (*s != ' ' || *(s + 1) != '$'); s++)
-				putchar(*s);
-			if (test & TEST_CATCH)
-				printf(", catch");
-			if (test & TEST_IGNORE_ERROR)
-				printf(", ignore error code mismatches");
-			if (test & TEST_IGNORE_POSITION)
-				printf(", ignore negative position mismatches");
-#ifdef REG_DISCIPLINE
-			if (state.stack)
-				printf(", stack");
-#endif
-			if (test & TEST_VERBOSE)
-				printf(", verbose");
-			printf("\n");
-#ifdef REG_VERSIONID
-			if (regerror(REG_VERSIONID, NiL, pat, sizeof(pat)) > 0)
-				s = pat;
-			else
-#endif
-#ifdef REG_TEST_VERSION
-			s = REG_TEST_VERSION;
-#else
-			s = "regex";
-#endif
-			printf("NOTE\t%s\n", s);
-			if (elementsof(unsupported) > 1)
-			{
-#if (REG_TEST_DEFAULT & (REG_AUGMENTED|REG_EXTENDED|REG_SHELL)) || !defined(REG_EXTENDED)
-				i = 0;
-#else
-				i = REG_EXTENDED != 0;
-#endif
-				for (got = 0; i < elementsof(unsupported) - 1; i++)
-				{
-					if (!got)
-					{
-						got = 1;
-						printf("NOTE\tunsupported: %s", unsupported[i]);
-					}
-					else
-						printf(",%s", unsupported[i]);
-				}
-				if (got)
-					printf("\n");
-			}
-		}
-#ifdef REG_DISCIPLINE
-		state.disc.disc.re_version = REG_VERSION;
-		state.disc.disc.re_compf = compf;
-		state.disc.disc.re_execf = execf;
-		if (!(state.disc.sp = sfstropen()))
-			bad("out of space [discipline string stream]\n", NiL, NiL, 0, 0);
-		preg.re_disc = &state.disc.disc;
-#endif
-		if (test & TEST_CATCH)
-		{
-			signal(SIGALRM, gotcha);
-			signal(SIGBUS, gotcha);
-			signal(SIGSEGV, gotcha);
-		}
-		while (p = getline(fp))
-		{
-
-		/* parse: */
-
-			line = p;
-			if (*p == ':' && !isspace(*(p + 1)))
-			{
-				while (*++p && *p != ':');
-				if (!*p++)
-				{
-					if (test & TEST_BASELINE)
-						printf("%s\n", line);
-					continue;
-				}
-			}
-			while (isspace(*p))
-				p++;
-			if (*p == 0 || *p == '#' || *p == 'T')
-			{
-				if (test & TEST_BASELINE)
-					printf("%s\n", line);
-				continue;
-			}
-			if (*p == ':' || *p == 'N')
-			{
-				if (test & TEST_BASELINE)
-					printf("%s\n", line);
-				else if (!(test & (TEST_ACTUAL|TEST_FAIL|TEST_PASS|TEST_SUMMARY)))
-				{
-					while (*++p && !isspace(*p));
-					while (isspace(*p))
-						p++;
-					printf("NOTE	%s\n", p);
-				}
-				continue;
-			}
-			j = 0;
-			i = 0;
-			field[i++] = p;
-			for (;;)
-			{
-				switch (*p++)
-				{
-				case 0:
-					p--;
-					j = 0;
-					goto checkfield;
-				case '\t':
-					*(delim[i] = p - 1) = 0;
-					j = 1;
-				checkfield:
-					s = field[i - 1];
-					if (streq(s, "NIL"))
-						field[i - 1] = 0;
-					else if (streq(s, "NULL"))
-						*s = 0;
-					while (*p == '\t')
-					{
-						p++;
-						j++;
-					}
-					tabs[i - 1] = j;
-					if (!*p)
-						break;
-					if (i >= elementsof(field))
-						bad("too many fields\n", NiL, NiL, 0, 0);
-					field[i++] = p;
-					/*FALLTHROUGH*/
-				default:
-					continue;
-				}
-				break;
-			}
-			if (!(spec = field[0]))
-				bad("NIL spec\n", NiL, NiL, 0, 0);
-
-		/* interpret: */
-
-			cflags = REG_TEST_DEFAULT;
-			eflags = REG_EXEC_DEFAULT;
-			test &= TEST_GLOBAL;
-			state.extracted = 0;
-			nmatch = 20;
-			nsub = -1;
-			for (p = spec; *p; p++)
-			{
-				if (isdigit(*p))
-				{
-					nmatch = strtol(p, &p, 10);
-					if (nmatch >= elementsof(match))
-						bad("nmatch must be < 100\n", NiL, NiL, 0, 0);
-					p--;
-					continue;
-				}
-				switch (*p)
-				{
-				case 'A':
-					test |= TEST_ARE;
-					continue;
-				case 'B':
-					test |= TEST_BRE;
-					continue;
-				case 'C':
-					if (!(test & TEST_QUERY) && !(skip & level))
-						bad("locale must be nested\n", NiL, NiL, 0, 0);
-					test &= ~TEST_QUERY;
-					if (locale)
-						bad("locale nesting not supported\n", NiL, NiL, 0, 0);
-					if (i != 2)
-						bad("locale field expected\n", NiL, NiL, 0, 0);
-					if (!(skip & level))
-					{
-#if defined(LC_COLLATE) && defined(LC_CTYPE)
-						s = field[1];
-						if (!s || streq(s, "POSIX"))
-							s = "C";
-						if ((ans = setlocale(LC_COLLATE, s)) && streq(ans, "POSIX"))
-							ans = "C";
-						if (!ans || !streq(ans, s) && streq(s, "C"))
-							ans = 0;
-						else if ((ans = setlocale(LC_CTYPE, s)) && streq(ans, "POSIX"))
-							ans = "C";
-						if (!ans || !streq(ans, s) && streq(s, "C"))
-							skip = note(level, s, skip, test);
-						else
-						{
-							if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_SUMMARY)))
-								printf("NOTE	\"%s\" locale\n", s);
-							locale = level;
-						}
-#else
-						skip = note(level, skip, test, "locales not supported");
-#endif
-					}
-					cflags = NOTEST;
-					continue;
-				case 'E':
-					test |= TEST_ERE;
-					continue;
-				case 'K':
-					test |= TEST_KRE;
-					continue;
-				case 'L':
-					test |= TEST_LRE;
-					continue;
-				case 'S':
-					test |= TEST_SRE;
-					continue;
-
-				case 'a':
-					cflags |= REG_LEFT|REG_RIGHT;
-					continue;
-				case 'b':
-					eflags |= REG_NOTBOL;
-					continue;
-				case 'c':
-					cflags |= REG_COMMENT;
-					continue;
-				case 'd':
-					cflags |= REG_SHELL_DOT;
-					continue;
-				case 'e':
-					eflags |= REG_NOTEOL;
-					continue;
-				case 'f':
-					cflags |= REG_MULTIPLE;
-					continue;
-				case 'g':
-					cflags |= NOTEST;
-					continue;
-				case 'h':
-					cflags |= REG_MULTIREF;
-					continue;
-				case 'i':
-					cflags |= REG_ICASE;
-					continue;
-				case 'j':
-					cflags |= REG_SPAN;
-					continue;
-				case 'k':
-					cflags |= REG_ESCAPE;
-					continue;
-				case 'l':
-					cflags |= REG_LEFT;
-					continue;
-				case 'm':
-					cflags |= REG_MINIMAL;
-					continue;
-				case 'n':
-					cflags |= REG_NEWLINE;
-					continue;
-				case 'o':
-					cflags |= REG_SHELL_GROUP;
-					continue;
-				case 'p':
-					cflags |= REG_SHELL_PATH;
-					continue;
-				case 'q':
-					cflags |= REG_DELIMITED;
-					continue;
-				case 'r':
-					cflags |= REG_RIGHT;
-					continue;
-				case 's':
-					cflags |= REG_SHELL_ESCAPED;
-					continue;
-				case 't':
-					cflags |= REG_MUSTDELIM;
-					continue;
-				case 'u':
-					test |= TEST_UNSPECIFIED;
-					continue;
-				case 'v':
-					cflags |= REG_CLASS_ESCAPE;
-					continue;
-				case 'w':
-					cflags |= REG_NOSUB;
-					continue;
-				case 'x':
-					if (REG_LENIENT)
-						cflags |= REG_LENIENT;
-					else
-						test |= TEST_LENIENT;
-					continue;
-				case 'y':
-					eflags |= REG_LEFT;
-					continue;
-				case 'z':
-					cflags |= REG_NULL;
-					continue;
-
-				case '$':
-					test |= TEST_EXPAND;
-					continue;
-
-				case '/':
-					test |= TEST_SUB;
-					continue;
-
-				case '=':
-					test |= TEST_DECOMP;
-					continue;
-
-				case '?':
-					test |= TEST_VERIFY;
-					test &= ~(TEST_AND|TEST_OR);
-					state.verify = state.passed;
-					continue;
-				case '&':
-					test |= TEST_VERIFY|TEST_AND;
-					test &= ~TEST_OR;
-					continue;
-				case '|':
-					test |= TEST_VERIFY|TEST_OR;
-					test &= ~TEST_AND;
-					continue;
-				case ';':
-					test |= TEST_OR;
-					test &= ~TEST_AND;
-					continue;
-
-				case '{':
-					level <<= 1;
-					if (skip & (level >> 1))
-					{
-						skip |= level;
-						cflags = NOTEST;
-					}
-					else
-					{
-						skip &= ~level;
-						test |= TEST_QUERY;
-					}
-					continue;
-				case '}':
-					if (level == 1)
-						bad("invalid {...} nesting\n", NiL, NiL, 0, 0);
-					if ((skip & level) && !(skip & (level>>1)))
-					{
-						if (!(test & (TEST_BASELINE|TEST_SUMMARY)))
-						{
-							if (test & (TEST_ACTUAL|TEST_FAIL))
-								printf("}\n");
-							else if (!(test & TEST_PASS))
-								printf("-%d\n", state.lineno);
-						}
-					}
-#if defined(LC_COLLATE) && defined(LC_CTYPE)
-					else if (locale & level)
-					{
-						locale = 0;
-						if (!(skip & level))
-						{
-							s = "C";
-							setlocale(LC_COLLATE, s);
-							setlocale(LC_CTYPE, s);
-							if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_SUMMARY)))
-								printf("NOTE	\"%s\" locale\n", s);
-							else if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_PASS))
-								printf("}\n");
-						}
-						else if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL))
-							printf("}\n");
-					}
-#endif
-					level >>= 1;
-					cflags = NOTEST;
-					continue;
-
-				default:
-					bad("bad spec\n", spec, NiL, 0, test);
-					break;
-
-				}
-				break;
-			}
-			if ((cflags|eflags) == NOTEST || (skip & level) && (test & TEST_BASELINE))
-			{
-				if (test & TEST_BASELINE)
-				{
-					while (i > 1)
-						*delim[--i] = '\t';
-					printf("%s\n", line);
-				}
-				continue;
-			}
-			if (test & TEST_OR)
-			{
-				if (!(test & TEST_VERIFY))
-				{
-					test &= ~TEST_OR;
-					if (state.passed == state.verify && i > 1)
-						printf("NOTE\t%s\n", field[1]);
-					continue;
-				}
-				else if (state.passed > state.verify)
-					continue;
-			}
-			else if (test & TEST_AND)
-			{
-				if (state.passed == state.verify)
-					continue;
-				state.passed = state.verify;
-			}
-			if (i < ((test & TEST_DECOMP) ? 3 : 4))
-				bad("too few fields\n", NiL, NiL, 0, test);
-			while (i < elementsof(field))
-				field[i++] = 0;
-			if (re = field[1])
-			{
-				if (streq(re, "SAME"))
-				{
-					re = ppat;
-					test |= TEST_SAME;
-				}
-				else
-				{
-					if (test & TEST_EXPAND)
-						escape(re);
-					re = expand(re, patbuf);
-					strcpy(ppat = pat, re);
-				}
-			}
-			else
-				ppat = 0;
-			nstr = -1;
-			if (s = field[2])
-			{
-				s = expand(s, strbuf);
-				if (test & TEST_EXPAND)
-				{
-					nstr = escape(s);
-#if _REG_nexec
-					if (nstr != strlen(s))
-						nexec = nstr;
-#endif
-				}
-			}
-			if (!(ans = field[(test & TEST_DECOMP) ? 2 : 3]))
-				bad("NIL answer\n", NiL, NiL, 0, test);
-			msg = field[4];
-			fflush(stdout);
-			if (test & TEST_SUB)
-#if _REG_subcomp
-				cflags |= REG_DELIMITED;
-#else
-				continue;
-#endif
-#if !_REG_decomp
-			if (test & TEST_DECOMP)
-				continue;
-#endif
-
-		compile:
-
-			if (state.extracted || (skip & level))
-				continue;
-#if !(REG_TEST_DEFAULT & (REG_AUGMENTED|REG_EXTENDED|REG_SHELL))
-#ifdef REG_EXTENDED
-			if (REG_EXTENDED != 0 && (test & TEST_BRE))
-#else
-			if (test & TEST_BRE)
-#endif
-			{
-				test &= ~TEST_BRE;
-				flags = cflags;
-				state.which = "BRE";
-			}
-			else
-#endif
-#ifdef REG_EXTENDED
-			if (test & TEST_ERE)
-			{
-				test &= ~TEST_ERE;
-				flags = cflags | REG_EXTENDED;
-				state.which = "ERE";
-			}
-			else
-#endif
-#ifdef REG_AUGMENTED
-			if (test & TEST_ARE)
-			{
-				test &= ~TEST_ARE;
-				flags = cflags | REG_AUGMENTED;
-				state.which = "ARE";
-			}
-			else
-#endif
-#ifdef REG_LITERAL
-			if (test & TEST_LRE)
-			{
-				test &= ~TEST_LRE;
-				flags = cflags | REG_LITERAL;
-				state.which = "LRE";
-			}
-			else
-#endif
-#ifdef REG_SHELL
-			if (test & TEST_SRE)
-			{
-				test &= ~TEST_SRE;
-				flags = cflags | REG_SHELL;
-				state.which = "SRE";
-			}
-			else
-#ifdef REG_AUGMENTED
-			if (test & TEST_KRE)
-			{
-				test &= ~TEST_KRE;
-				flags = cflags | REG_SHELL | REG_AUGMENTED;
-				state.which = "KRE";
-			}
-			else
-#endif
-#endif
-			{
-				if (test & (TEST_BASELINE|TEST_PASS|TEST_VERIFY))
-					extract(tabs, line, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test|TEST_OK);
-				continue;
-			}
-			if ((test & (TEST_QUERY|TEST_VERBOSE|TEST_VERIFY)) == TEST_VERBOSE)
-			{
-				printf("test %-3d %s ", state.lineno, state.which);
-				quote(re, -1, test|TEST_DELIMIT);
-				printf(" ");
-				quote(s, nstr, test|TEST_DELIMIT);
-				printf("\n");
-			}
-
-		nosub:
-			fun = "regcomp";
-#if _REG_nexec
-			if (nstr >= 0 && nstr != strlen(s))
-				nexec = nstr;
-
-			else
-#endif
-				nexec = -1;
-			if (state.extracted || (skip & level))
-				continue;
-			if (!(test & TEST_QUERY))
-				testno++;
-#ifdef REG_DISCIPLINE
-			if (state.stack)
-				stkset(stkstd, state.stack, 0);
-			flags |= REG_DISCIPLINE;
-			state.disc.ordinal = 0;
-			sfstrseek(state.disc.sp, 0, SEEK_SET);
-#endif
-			if (!(test & TEST_CATCH))
-				cret = regcomp(&preg, re, flags);
-			else if (!(cret = setjmp(state.gotcha)))
-			{
-				alarm(HUNG);
-				cret = regcomp(&preg, re, flags);
-				alarm(0);
-			}
-#if _REG_subcomp
-			if (!cret && (test & TEST_SUB))
-			{
-				fun = "regsubcomp";
-				p = re + preg.re_npat;
-				if (!(test & TEST_CATCH))
-					cret = regsubcomp(&preg, p, NiL, 0, 0);
-				else if (!(cret = setjmp(state.gotcha)))
-				{
-					alarm(HUNG);
-					cret = regsubcomp(&preg, p, NiL, 0, 0);
-					alarm(0);
-				}
-				if (!cret && *(p += preg.re_npat) && !(preg.re_sub->re_flags & REG_SUB_LAST))
-				{
-					if (catchfree(&preg, flags, tabs, line, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test))
-						continue;
-					cret = REG_EFLAGS;
-				}
-			}
-#endif
-#if _REG_decomp
-			if (!cret && (test & TEST_DECOMP))
-			{
-				char	buf[128];
-
-				if ((j = nmatch) > sizeof(buf))
-					j = sizeof(buf);
-				fun = "regdecomp";
-				p = re + preg.re_npat;
-				if (!(test & TEST_CATCH))
-					i = regdecomp(&preg, -1, buf, j);
-				else if (!(cret = setjmp(state.gotcha)))
-				{
-					alarm(HUNG);
-					i = regdecomp(&preg, -1, buf, j);
-					alarm(0);
-				}
-				if (!cret)
-				{
-					catchfree(&preg, flags, tabs, line, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test);
-					if (i > j)
-					{
-						if (i != (strlen(ans) + 1))
-						{
-							report("failed", fun, re, s, nstr, msg, flags, test);
-							printf(" %d byte buffer supplied, %d byte buffer required\n", j, i);
-						}
-					}
-					else if (strcmp(buf, ans))
-					{
-						report("failed", fun, re, s, nstr, msg, flags, test);
-						quote(ans, -1, test|TEST_DELIMIT);
-						printf(" expected, ");
-						quote(buf, -1, test|TEST_DELIMIT);
-						printf(" returned\n");
-					}
-					continue;
-				}
-			}
-#endif
-			if (!cret)
-			{
-				if (!(flags & REG_NOSUB) && nsub < 0 && *ans == '(')
-				{
-					for (p = ans; *p; p++)
-						if (*p == '(')
-							nsub++;
-						else if (*p == '{')
-							nsub--;
-					if (nsub >= 0)
-					{
-						if (test & TEST_IGNORE_OVER)
-						{
-							if (nmatch > nsub)
-								nmatch = nsub + 1;
-						}
-						else if (nsub != preg.re_nsub)
-						{
-							if (nsub > preg.re_nsub)
-							{
-								if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
-									skip = extract(tabs, line, re, s, ans, msg, "OK", NiL, 0, 0, skip, level, test|TEST_DELIMIT);
-								else
-								{
-									report("re_nsub incorrect", fun, re, NiL, -1, msg, flags, test);
-									printf("at least %d expected, %d returned\n", nsub, preg.re_nsub);
-									state.errors++;
-								}
-							}
-							else
-								nsub = preg.re_nsub;
-						}
-					}
-				}
-				if (!(test & (TEST_DECOMP|TEST_SUB)) && *ans && *ans != '(' && !streq(ans, "OK") && !streq(ans, "NOMATCH"))
-				{
-					if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
-						skip = extract(tabs, line, re, s, ans, msg, "OK", NiL, 0, 0, skip, level, test|TEST_DELIMIT);
-					else if (!(test & TEST_LENIENT))
-					{
-						report("failed", fun, re, NiL, -1, msg, flags, test);
-						printf("%s expected, OK returned\n", ans);
-					}
-					catchfree(&preg, flags, tabs, line, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test);
-					continue;
-				}
-			}
-			else
-			{
-				if (test & TEST_LENIENT)
-					/* we'll let it go this time */;
-				else if (!*ans || ans[0]=='(' || cret == REG_BADPAT && streq(ans, "NOMATCH"))
-				{
-					got = 0;
-					for (i = 1; i < elementsof(codes); i++)
-						if (cret==codes[i].code)
-							got = i;
-					if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
-						skip = extract(tabs, line, re, s, ans, msg, codes[got].name, NiL, 0, 0, skip, level, test|TEST_DELIMIT);
-					else
-					{
-						report("failed", fun, re, NiL, -1, msg, flags, test);
-						printf("%s returned: ", codes[got].name);
-						error(&preg, cret);
-					}
-				}
-				else
-				{
-					expected = got = 0;
-					for (i = 1; i < elementsof(codes); i++)
-					{
-						if (streq(ans, codes[i].name))
-							expected = i;
-						if (cret==codes[i].code)
-							got = i;
-					}
-					if (!expected)
-					{
-						if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
-							skip = extract(tabs, line, re, s, ans, msg, codes[got].name, NiL, 0, 0, skip, level, test|TEST_DELIMIT);
-						else
-						{
-							report("failed: invalid error code", NiL, re, NiL, -1, msg, flags, test);
-							printf("%s expected, %s returned\n", ans, codes[got].name);
-						}
-					}
-					else if (cret != codes[expected].code && cret != REG_BADPAT)
-					{
-						if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
-							skip = extract(tabs, line, re, s, ans, msg, codes[got].name, NiL, 0, 0, skip, level, test|TEST_DELIMIT);
-						else if (test & TEST_IGNORE_ERROR)
-							state.ignored++;
-						else
-						{
-							report("should fail and did", fun, re, NiL, -1, msg, flags, test);
-							printf("%s expected, %s returned: ", ans, codes[got].name);
-							state.errors--;
-							state.warnings++;
-							error(&preg, cret);
-						}
-					}
-				}
-				goto compile;
-			}
-
-#if _REG_nexec
-		execute:
-			if (nexec >= 0)
-				fun = "regnexec";
-			else
-#endif
-				fun = "regexec";
-			
-			for (i = 0; i < elementsof(match); i++)
-				match[i] = state.NOMATCH;
-
-#if _REG_nexec
-			if (nexec >= 0)
-			{
-				eret = regnexec(&preg, s, nexec, nmatch, match, eflags);
-				s[nexec] = 0;
-			}
-			else
-#endif
-			{
-				if (!(test & TEST_CATCH))
-					eret = regexec(&preg, s, nmatch, match, eflags);
-				else if (!(eret = setjmp(state.gotcha)))
-				{
-					alarm(HUNG);
-					eret = regexec(&preg, s, nmatch, match, eflags);
-					alarm(0);
-				}
-			}
-#if _REG_subcomp
-			if ((test & TEST_SUB) && !eret)
-			{
-				fun = "regsubexec";
-				if (!(test & TEST_CATCH))
-					eret = regsubexec(&preg, s, nmatch, match);
-				else if (!(eret = setjmp(state.gotcha)))
-				{
-					alarm(HUNG);
-					eret = regsubexec(&preg, s, nmatch, match);
-					alarm(0);
-				}
-			}
-#endif
-			if (flags & REG_NOSUB)
-			{
-				if (eret)
-				{
-					if (eret != REG_NOMATCH || !streq(ans, "NOMATCH"))
-					{
-						if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
-							skip = extract(tabs, line, re, s, ans, msg, "NOMATCH", NiL, 0, 0, skip, level, test|TEST_DELIMIT);
-						else
-						{
-							report("REG_NOSUB failed", fun, re, s, nstr, msg, flags, test);
-							error(&preg, eret);
-						}
-					}
-				}
-				else if (streq(ans, "NOMATCH"))
-				{
-					if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
-						skip = extract(tabs, line, re, s, ans, msg, NiL, match, nmatch, nsub, skip, level, test|TEST_DELIMIT);
-					else
-					{
-						report("should fail and didn't", fun, re, s, nstr, msg, flags, test);
-						error(&preg, eret);
-					}
-				}
-			}
-			else if (eret)
-			{
-				if (eret != REG_NOMATCH || !streq(ans, "NOMATCH"))
-				{
-					if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
-						skip = extract(tabs, line, re, s, ans, msg, "NOMATCH", NiL, 0, nsub, skip, level, test|TEST_DELIMIT);
-					else
-					{
-						report("failed", fun, re, s, nstr, msg, flags, test);
-						if (eret != REG_NOMATCH)
-							error(&preg, eret);
-						else if (*ans)
-							printf("expected: %s\n", ans);
-						else
-							printf("\n");
-					}
-				}
-			}
-			else if (streq(ans, "NOMATCH"))
-			{
-				if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
-					skip = extract(tabs, line, re, s, ans, msg, NiL, match, nmatch, nsub, skip, level, test|TEST_DELIMIT);
-				else
-				{
-					report("should fail and didn't", fun, re, s, nstr, msg, flags, test);
-					matchprint(match, nmatch, nsub, NiL, test);
-				}
-			}
-#if _REG_subcomp
-			else if (test & TEST_SUB)
-			{
-				p = preg.re_sub->re_buf;
-				if (strcmp(p, ans))
-				{
-					report("failed", fun, re, s, nstr, msg, flags, test);
-					quote(ans, -1, test|TEST_DELIMIT);
-					printf(" expected, ");
-					quote(p, -1, test|TEST_DELIMIT);
-					printf(" returned\n");
-				}
-			}
-#endif
-			else if (!*ans)
-			{
-				if (match[0].rm_so != state.NOMATCH.rm_so)
-				{
-					if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
-						skip = extract(tabs, line, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test);
-					else
-					{
-						report("failed: no match but match array assigned", NiL, re, s, nstr, msg, flags, test);
-						matchprint(match, nmatch, nsub, NiL, test);
-					}
-				}
-			}
-			else if (matchcheck(match, nmatch, nsub, ans, re, s, nstr, flags, test))
-			{
-#if _REG_nexec
-				if (nexec < 0 && !nonexec)
-				{
-					nexec = nstr >= 0 ? nstr : strlen(s);
-					s[nexec] = '\n';
-					testno++;
-					goto execute;
-				}
-#endif
-				if (!(test & (TEST_DECOMP|TEST_SUB|TEST_VERIFY)) && !nonosub)
-				{
-					if (catchfree(&preg, flags, tabs, line, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test))
-						continue;
-					flags |= REG_NOSUB;
-					goto nosub;
-				}
-				if (test & (TEST_BASELINE|TEST_PASS|TEST_VERIFY))
-					skip = extract(tabs, line, re, s, ans, msg, NiL, match, nmatch, nsub, skip, level, test|TEST_OK);
-			}
-			else if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
-				skip = extract(tabs, line, re, s, ans, msg, NiL, match, nmatch, nsub, skip, level, test|TEST_DELIMIT);
-			if (catchfree(&preg, flags, tabs, line, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test))
-				continue;
-			goto compile;
-		}
-		if (test & TEST_SUMMARY)
-			printf("tests=%-4d errors=%-4d warnings=%-2d ignored=%-2d unspecified=%-2d signals=%d\n", testno, state.errors, state.warnings, state.ignored, state.unspecified, state.signals);
-		else if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS)))
-		{
-			printf("TEST\t%s", unit);
-			if (subunit)
-				printf(" %-.*s", subunitlen, subunit);
-			printf(", %d test%s", testno, testno == 1 ? "" : "s");
-			if (state.ignored)
-				printf(", %d ignored mismatche%s", state.ignored, state.ignored == 1 ? "" : "s");
-			if (state.warnings)
-				printf(", %d warning%s", state.warnings, state.warnings == 1 ? "" : "s");
-			if (state.unspecified)
-				printf(", %d unspecified difference%s", state.unspecified, state.unspecified == 1 ? "" : "s");
-			if (state.signals)
-				printf(", %d signal%s", state.signals, state.signals == 1 ? "" : "s");
-			printf(", %d error%s\n", state.errors, state.errors == 1 ? "" : "s");
-		}
-		if (fp != stdin)
-			fclose(fp);
-	}
-	return 0;
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/append_test.go b/third_party/gofrontend/libgo/go/runtime/append_test.go
deleted file mode 100644
index a67dc9b..0000000
--- a/third_party/gofrontend/libgo/go/runtime/append_test.go
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-package runtime_test
-
-import "testing"
-
-const N = 20
-
-func BenchmarkAppend(b *testing.B) {
-	b.StopTimer()
-	x := make([]int, 0, N)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		x = x[0:0]
-		for j := 0; j < N; j++ {
-			x = append(x, j)
-		}
-	}
-}
-
-func BenchmarkAppendGrowByte(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		var x []byte
-		for j := 0; j < 1<<20; j++ {
-			x = append(x, byte(j))
-		}
-	}
-}
-
-func BenchmarkAppendGrowString(b *testing.B) {
-	var s string
-	for i := 0; i < b.N; i++ {
-		var x []string
-		for j := 0; j < 1<<20; j++ {
-			x = append(x, s)
-		}
-	}
-}
-
-func benchmarkAppendBytes(b *testing.B, length int) {
-	b.StopTimer()
-	x := make([]byte, 0, N)
-	y := make([]byte, length)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		x = x[0:0]
-		x = append(x, y...)
-	}
-}
-
-func BenchmarkAppend1Byte(b *testing.B) {
-	benchmarkAppendBytes(b, 1)
-}
-
-func BenchmarkAppend4Bytes(b *testing.B) {
-	benchmarkAppendBytes(b, 4)
-}
-
-func BenchmarkAppend7Bytes(b *testing.B) {
-	benchmarkAppendBytes(b, 7)
-}
-
-func BenchmarkAppend8Bytes(b *testing.B) {
-	benchmarkAppendBytes(b, 8)
-}
-
-func BenchmarkAppend15Bytes(b *testing.B) {
-	benchmarkAppendBytes(b, 15)
-}
-
-func BenchmarkAppend16Bytes(b *testing.B) {
-	benchmarkAppendBytes(b, 16)
-}
-
-func BenchmarkAppend32Bytes(b *testing.B) {
-	benchmarkAppendBytes(b, 32)
-}
-
-func benchmarkAppendStr(b *testing.B, str string) {
-	b.StopTimer()
-	x := make([]byte, 0, N)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		x = x[0:0]
-		x = append(x, str...)
-	}
-}
-
-func BenchmarkAppendStr1Byte(b *testing.B) {
-	benchmarkAppendStr(b, "1")
-}
-
-func BenchmarkAppendStr4Bytes(b *testing.B) {
-	benchmarkAppendStr(b, "1234")
-}
-
-func BenchmarkAppendStr8Bytes(b *testing.B) {
-	benchmarkAppendStr(b, "12345678")
-}
-
-func BenchmarkAppendStr16Bytes(b *testing.B) {
-	benchmarkAppendStr(b, "1234567890123456")
-}
-
-func BenchmarkAppendStr32Bytes(b *testing.B) {
-	benchmarkAppendStr(b, "12345678901234567890123456789012")
-}
-
-func BenchmarkAppendSpecialCase(b *testing.B) {
-	b.StopTimer()
-	x := make([]int, 0, N)
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		x = x[0:0]
-		for j := 0; j < N; j++ {
-			if len(x) < cap(x) {
-				x = x[:len(x)+1]
-				x[len(x)-1] = j
-			} else {
-				x = append(x, j)
-			}
-		}
-	}
-}
-
-var x []int
-
-func f() int {
-	x[:1][0] = 3
-	return 2
-}
-
-func TestSideEffectOrder(t *testing.T) {
-	x = make([]int, 0, 10)
-	x = append(x, 1, f())
-	if x[0] != 1 || x[1] != 2 {
-		t.Error("append failed: ", x[0], x[1])
-	}
-}
-
-func TestAppendOverlap(t *testing.T) {
-	x := []byte("1234")
-	x = append(x[1:], x...) // p > q in runtime·appendslice.
-	got := string(x)
-	want := "2341234"
-	if got != want {
-		t.Errorf("overlap failed: got %q want %q", got, want)
-	}
-}
-
-func benchmarkCopySlice(b *testing.B, l int) {
-	s := make([]byte, l)
-	buf := make([]byte, 4096)
-	var n int
-	for i := 0; i < b.N; i++ {
-		n = copy(buf, s)
-	}
-	b.SetBytes(int64(n))
-}
-
-func benchmarkCopyStr(b *testing.B, l int) {
-	s := string(make([]byte, l))
-	buf := make([]byte, 4096)
-	var n int
-	for i := 0; i < b.N; i++ {
-		n = copy(buf, s)
-	}
-	b.SetBytes(int64(n))
-}
-
-func BenchmarkCopy1Byte(b *testing.B)    { benchmarkCopySlice(b, 1) }
-func BenchmarkCopy2Byte(b *testing.B)    { benchmarkCopySlice(b, 2) }
-func BenchmarkCopy4Byte(b *testing.B)    { benchmarkCopySlice(b, 4) }
-func BenchmarkCopy8Byte(b *testing.B)    { benchmarkCopySlice(b, 8) }
-func BenchmarkCopy12Byte(b *testing.B)   { benchmarkCopySlice(b, 12) }
-func BenchmarkCopy16Byte(b *testing.B)   { benchmarkCopySlice(b, 16) }
-func BenchmarkCopy32Byte(b *testing.B)   { benchmarkCopySlice(b, 32) }
-func BenchmarkCopy128Byte(b *testing.B)  { benchmarkCopySlice(b, 128) }
-func BenchmarkCopy1024Byte(b *testing.B) { benchmarkCopySlice(b, 1024) }
-
-func BenchmarkCopy1String(b *testing.B)    { benchmarkCopyStr(b, 1) }
-func BenchmarkCopy2String(b *testing.B)    { benchmarkCopyStr(b, 2) }
-func BenchmarkCopy4String(b *testing.B)    { benchmarkCopyStr(b, 4) }
-func BenchmarkCopy8String(b *testing.B)    { benchmarkCopyStr(b, 8) }
-func BenchmarkCopy12String(b *testing.B)   { benchmarkCopyStr(b, 12) }
-func BenchmarkCopy16String(b *testing.B)   { benchmarkCopyStr(b, 16) }
-func BenchmarkCopy32String(b *testing.B)   { benchmarkCopyStr(b, 32) }
-func BenchmarkCopy128String(b *testing.B)  { benchmarkCopyStr(b, 128) }
-func BenchmarkCopy1024String(b *testing.B) { benchmarkCopyStr(b, 1024) }
diff --git a/third_party/gofrontend/libgo/go/runtime/chan_test.go b/third_party/gofrontend/libgo/go/runtime/chan_test.go
deleted file mode 100644
index 6553509..0000000
--- a/third_party/gofrontend/libgo/go/runtime/chan_test.go
+++ /dev/null
@@ -1,927 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"runtime"
-	"sync"
-	"sync/atomic"
-	"testing"
-	"time"
-)
-
-func TestChan(t *testing.T) {
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
-	N := 200
-	if testing.Short() {
-		N = 20
-	}
-	for chanCap := 0; chanCap < N; chanCap++ {
-		{
-			// Ensure that receive from empty chan blocks.
-			c := make(chan int, chanCap)
-			recv1 := false
-			go func() {
-				_ = <-c
-				recv1 = true
-			}()
-			recv2 := false
-			go func() {
-				_, _ = <-c
-				recv2 = true
-			}()
-			time.Sleep(time.Millisecond)
-			if recv1 || recv2 {
-				t.Fatalf("chan[%d]: receive from empty chan", chanCap)
-			}
-			// Ensure that non-blocking receive does not block.
-			select {
-			case _ = <-c:
-				t.Fatalf("chan[%d]: receive from empty chan", chanCap)
-			default:
-			}
-			select {
-			case _, _ = <-c:
-				t.Fatalf("chan[%d]: receive from empty chan", chanCap)
-			default:
-			}
-			c <- 0
-			c <- 0
-		}
-
-		{
-			// Ensure that send to full chan blocks.
-			c := make(chan int, chanCap)
-			for i := 0; i < chanCap; i++ {
-				c <- i
-			}
-			sent := uint32(0)
-			go func() {
-				c <- 0
-				atomic.StoreUint32(&sent, 1)
-			}()
-			time.Sleep(time.Millisecond)
-			if atomic.LoadUint32(&sent) != 0 {
-				t.Fatalf("chan[%d]: send to full chan", chanCap)
-			}
-			// Ensure that non-blocking send does not block.
-			select {
-			case c <- 0:
-				t.Fatalf("chan[%d]: send to full chan", chanCap)
-			default:
-			}
-			<-c
-		}
-
-		{
-			// Ensure that we receive 0 from closed chan.
-			c := make(chan int, chanCap)
-			for i := 0; i < chanCap; i++ {
-				c <- i
-			}
-			close(c)
-			for i := 0; i < chanCap; i++ {
-				v := <-c
-				if v != i {
-					t.Fatalf("chan[%d]: received %v, expected %v", chanCap, v, i)
-				}
-			}
-			if v := <-c; v != 0 {
-				t.Fatalf("chan[%d]: received %v, expected %v", chanCap, v, 0)
-			}
-			if v, ok := <-c; v != 0 || ok {
-				t.Fatalf("chan[%d]: received %v/%v, expected %v/%v", chanCap, v, ok, 0, false)
-			}
-		}
-
-		{
-			// Ensure that close unblocks receive.
-			c := make(chan int, chanCap)
-			done := make(chan bool)
-			go func() {
-				v, ok := <-c
-				done <- v == 0 && ok == false
-			}()
-			time.Sleep(time.Millisecond)
-			close(c)
-			if !<-done {
-				t.Fatalf("chan[%d]: received non zero from closed chan", chanCap)
-			}
-		}
-
-		{
-			// Send 100 integers,
-			// ensure that we receive them non-corrupted in FIFO order.
-			c := make(chan int, chanCap)
-			go func() {
-				for i := 0; i < 100; i++ {
-					c <- i
-				}
-			}()
-			for i := 0; i < 100; i++ {
-				v := <-c
-				if v != i {
-					t.Fatalf("chan[%d]: received %v, expected %v", chanCap, v, i)
-				}
-			}
-
-			// Same, but using recv2.
-			go func() {
-				for i := 0; i < 100; i++ {
-					c <- i
-				}
-			}()
-			for i := 0; i < 100; i++ {
-				v, ok := <-c
-				if !ok {
-					t.Fatalf("chan[%d]: receive failed, expected %v", chanCap, i)
-				}
-				if v != i {
-					t.Fatalf("chan[%d]: received %v, expected %v", chanCap, v, i)
-				}
-			}
-
-			// Send 1000 integers in 4 goroutines,
-			// ensure that we receive what we send.
-			const P = 4
-			const L = 1000
-			for p := 0; p < P; p++ {
-				go func() {
-					for i := 0; i < L; i++ {
-						c <- i
-					}
-				}()
-			}
-			done := make(chan map[int]int)
-			for p := 0; p < P; p++ {
-				go func() {
-					recv := make(map[int]int)
-					for i := 0; i < L; i++ {
-						v := <-c
-						recv[v] = recv[v] + 1
-					}
-					done <- recv
-				}()
-			}
-			recv := make(map[int]int)
-			for p := 0; p < P; p++ {
-				for k, v := range <-done {
-					recv[k] = recv[k] + v
-				}
-			}
-			if len(recv) != L {
-				t.Fatalf("chan[%d]: received %v values, expected %v", chanCap, len(recv), L)
-			}
-			for _, v := range recv {
-				if v != P {
-					t.Fatalf("chan[%d]: received %v values, expected %v", chanCap, v, P)
-				}
-			}
-		}
-
-		{
-			// Test len/cap.
-			c := make(chan int, chanCap)
-			if len(c) != 0 || cap(c) != chanCap {
-				t.Fatalf("chan[%d]: bad len/cap, expect %v/%v, got %v/%v", chanCap, 0, chanCap, len(c), cap(c))
-			}
-			for i := 0; i < chanCap; i++ {
-				c <- i
-			}
-			if len(c) != chanCap || cap(c) != chanCap {
-				t.Fatalf("chan[%d]: bad len/cap, expect %v/%v, got %v/%v", chanCap, chanCap, chanCap, len(c), cap(c))
-			}
-		}
-
-	}
-}
-
-func TestNonblockRecvRace(t *testing.T) {
-	n := 10000
-	if testing.Short() {
-		n = 100
-	} else {
-		if runtime.GOARCH == "s390" {
-			// Test uses too much address space on 31-bit S390.
-			t.Skip("skipping long test on s390")
-		}
-	}
-	for i := 0; i < n; i++ {
-		c := make(chan int, 1)
-		c <- 1
-		go func() {
-			select {
-			case <-c:
-			default:
-				t.Fatal("chan is not ready")
-			}
-		}()
-		close(c)
-		<-c
-	}
-}
-
-// This test checks that select acts on the state of the channels at one
-// moment in the execution, not over a smeared time window.
-// In the test, one goroutine does:
-//	create c1, c2
-//	make c1 ready for receiving
-//	create second goroutine
-//	make c2 ready for receiving
-//	make c1 no longer ready for receiving (if possible)
-// The second goroutine does a non-blocking select receiving from c1 and c2.
-// From the time the second goroutine is created, at least one of c1 and c2
-// is always ready for receiving, so the select in the second goroutine must
-// always receive from one or the other. It must never execute the default case.
-func TestNonblockSelectRace(t *testing.T) {
-	n := 100000
-	if testing.Short() {
-		n = 1000
-	}
-	done := make(chan bool, 1)
-	for i := 0; i < n; i++ {
-		c1 := make(chan int, 1)
-		c2 := make(chan int, 1)
-		c1 <- 1
-		go func() {
-			select {
-			case <-c1:
-			case <-c2:
-			default:
-				done <- false
-				return
-			}
-			done <- true
-		}()
-		c2 <- 1
-		select {
-		case <-c1:
-		default:
-		}
-		if !<-done {
-			t.Fatal("no chan is ready")
-		}
-	}
-}
-
-// Same as TestNonblockSelectRace, but close(c2) replaces c2 <- 1.
-func TestNonblockSelectRace2(t *testing.T) {
-	n := 100000
-	if testing.Short() {
-		n = 1000
-	}
-	done := make(chan bool, 1)
-	for i := 0; i < n; i++ {
-		c1 := make(chan int, 1)
-		c2 := make(chan int)
-		c1 <- 1
-		go func() {
-			select {
-			case <-c1:
-			case <-c2:
-			default:
-				done <- false
-				return
-			}
-			done <- true
-		}()
-		close(c2)
-		select {
-		case <-c1:
-		default:
-		}
-		if !<-done {
-			t.Fatal("no chan is ready")
-		}
-	}
-}
-
-func TestSelfSelect(t *testing.T) {
-	// Ensure that send/recv on the same chan in select
-	// does not crash nor deadlock.
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
-	for _, chanCap := range []int{0, 10} {
-		var wg sync.WaitGroup
-		wg.Add(2)
-		c := make(chan int, chanCap)
-		for p := 0; p < 2; p++ {
-			p := p
-			go func() {
-				defer wg.Done()
-				for i := 0; i < 1000; i++ {
-					if p == 0 || i%2 == 0 {
-						select {
-						case c <- p:
-						case v := <-c:
-							if chanCap == 0 && v == p {
-								t.Fatalf("self receive")
-							}
-						}
-					} else {
-						select {
-						case v := <-c:
-							if chanCap == 0 && v == p {
-								t.Fatalf("self receive")
-							}
-						case c <- p:
-						}
-					}
-				}
-			}()
-		}
-		wg.Wait()
-	}
-}
-
-func TestSelectStress(t *testing.T) {
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(10))
-	var c [4]chan int
-	c[0] = make(chan int)
-	c[1] = make(chan int)
-	c[2] = make(chan int, 2)
-	c[3] = make(chan int, 3)
-	N := int(1e5)
-	if testing.Short() {
-		N /= 10
-	}
-	// There are 4 goroutines that send N values on each of the chans,
-	// + 4 goroutines that receive N values on each of the chans,
-	// + 1 goroutine that sends N values on each of the chans in a single select,
-	// + 1 goroutine that receives N values on each of the chans in a single select.
-	// All these sends, receives and selects interact chaotically at runtime,
-	// but we are careful that this whole construct does not deadlock.
-	var wg sync.WaitGroup
-	wg.Add(10)
-	for k := 0; k < 4; k++ {
-		k := k
-		go func() {
-			for i := 0; i < N; i++ {
-				c[k] <- 0
-			}
-			wg.Done()
-		}()
-		go func() {
-			for i := 0; i < N; i++ {
-				<-c[k]
-			}
-			wg.Done()
-		}()
-	}
-	go func() {
-		var n [4]int
-		c1 := c
-		for i := 0; i < 4*N; i++ {
-			select {
-			case c1[3] <- 0:
-				n[3]++
-				if n[3] == N {
-					c1[3] = nil
-				}
-			case c1[2] <- 0:
-				n[2]++
-				if n[2] == N {
-					c1[2] = nil
-				}
-			case c1[0] <- 0:
-				n[0]++
-				if n[0] == N {
-					c1[0] = nil
-				}
-			case c1[1] <- 0:
-				n[1]++
-				if n[1] == N {
-					c1[1] = nil
-				}
-			}
-		}
-		wg.Done()
-	}()
-	go func() {
-		var n [4]int
-		c1 := c
-		for i := 0; i < 4*N; i++ {
-			select {
-			case <-c1[0]:
-				n[0]++
-				if n[0] == N {
-					c1[0] = nil
-				}
-			case <-c1[1]:
-				n[1]++
-				if n[1] == N {
-					c1[1] = nil
-				}
-			case <-c1[2]:
-				n[2]++
-				if n[2] == N {
-					c1[2] = nil
-				}
-			case <-c1[3]:
-				n[3]++
-				if n[3] == N {
-					c1[3] = nil
-				}
-			}
-		}
-		wg.Done()
-	}()
-	wg.Wait()
-}
-
-func TestChanSendInterface(t *testing.T) {
-	type mt struct{}
-	m := &mt{}
-	c := make(chan interface{}, 1)
-	c <- m
-	select {
-	case c <- m:
-	default:
-	}
-	select {
-	case c <- m:
-	case c <- &mt{}:
-	default:
-	}
-}
-
-func TestPseudoRandomSend(t *testing.T) {
-	n := 100
-	for _, chanCap := range []int{0, n} {
-		c := make(chan int, chanCap)
-		l := make([]int, n)
-		var m sync.Mutex
-		m.Lock()
-		go func() {
-			for i := 0; i < n; i++ {
-				runtime.Gosched()
-				l[i] = <-c
-			}
-			m.Unlock()
-		}()
-		for i := 0; i < n; i++ {
-			select {
-			case c <- 1:
-			case c <- 0:
-			}
-		}
-		m.Lock() // wait
-		n0 := 0
-		n1 := 0
-		for _, i := range l {
-			n0 += (i + 1) % 2
-			n1 += i
-		}
-		if n0 <= n/10 || n1 <= n/10 {
-			t.Errorf("Want pseudorandom, got %d zeros and %d ones (chan cap %d)", n0, n1, chanCap)
-		}
-	}
-}
-
-func TestMultiConsumer(t *testing.T) {
-	const nwork = 23
-	const niter = 271828
-
-	pn := []int{2, 3, 7, 11, 13, 17, 19, 23, 27, 31}
-
-	q := make(chan int, nwork*3)
-	r := make(chan int, nwork*3)
-
-	// workers
-	var wg sync.WaitGroup
-	for i := 0; i < nwork; i++ {
-		wg.Add(1)
-		go func(w int) {
-			for v := range q {
-				// mess with the fifo-ish nature of range
-				if pn[w%len(pn)] == v {
-					runtime.Gosched()
-				}
-				r <- v
-			}
-			wg.Done()
-		}(i)
-	}
-
-	// feeder & closer
-	expect := 0
-	go func() {
-		for i := 0; i < niter; i++ {
-			v := pn[i%len(pn)]
-			expect += v
-			q <- v
-		}
-		close(q)  // no more work
-		wg.Wait() // workers done
-		close(r)  // ... so there can be no more results
-	}()
-
-	// consume & check
-	n := 0
-	s := 0
-	for v := range r {
-		n++
-		s += v
-	}
-	if n != niter || s != expect {
-		t.Errorf("Expected sum %d (got %d) from %d iter (saw %d)",
-			expect, s, niter, n)
-	}
-}
-
-func TestShrinkStackDuringBlockedSend(t *testing.T) {
-	// make sure that channel operations still work when we are
-	// blocked on a channel send and we shrink the stack.
-	// NOTE: this test probably won't fail unless stack1.go:stackDebug
-	// is set to >= 1.
-	const n = 10
-	c := make(chan int)
-	done := make(chan struct{})
-
-	go func() {
-		for i := 0; i < n; i++ {
-			c <- i
-			// use lots of stack, briefly.
-			stackGrowthRecursive(20)
-		}
-		done <- struct{}{}
-	}()
-
-	for i := 0; i < n; i++ {
-		x := <-c
-		if x != i {
-			t.Errorf("bad channel read: want %d, got %d", i, x)
-		}
-		// Waste some time so sender can finish using lots of stack
-		// and block in channel send.
-		time.Sleep(1 * time.Millisecond)
-		// trigger GC which will shrink the stack of the sender.
-		runtime.GC()
-	}
-	<-done
-}
-
-func TestSelectDuplicateChannel(t *testing.T) {
-	// This test makes sure we can queue a G on
-	// the same channel multiple times.
-	c := make(chan int)
-	d := make(chan int)
-	e := make(chan int)
-
-	// goroutine A
-	go func() {
-		select {
-		case <-c:
-		case <-c:
-		case <-d:
-		}
-		e <- 9
-	}()
-	time.Sleep(time.Millisecond) // make sure goroutine A gets qeueued first on c
-
-	// goroutine B
-	go func() {
-		<-c
-	}()
-	time.Sleep(time.Millisecond) // make sure goroutine B gets queued on c before continuing
-
-	d <- 7 // wake up A, it dequeues itself from c.  This operation used to corrupt c.recvq.
-	<-e    // A tells us it's done
-	c <- 8 // wake up B.  This operation used to fail because c.recvq was corrupted (it tries to wake up an already running G instead of B)
-}
-
-func BenchmarkChanNonblocking(b *testing.B) {
-	myc := make(chan int)
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			select {
-			case <-myc:
-			default:
-			}
-		}
-	})
-}
-
-func BenchmarkSelectUncontended(b *testing.B) {
-	b.RunParallel(func(pb *testing.PB) {
-		myc1 := make(chan int, 1)
-		myc2 := make(chan int, 1)
-		myc1 <- 0
-		for pb.Next() {
-			select {
-			case <-myc1:
-				myc2 <- 0
-			case <-myc2:
-				myc1 <- 0
-			}
-		}
-	})
-}
-
-func BenchmarkSelectSyncContended(b *testing.B) {
-	myc1 := make(chan int)
-	myc2 := make(chan int)
-	myc3 := make(chan int)
-	done := make(chan int)
-	b.RunParallel(func(pb *testing.PB) {
-		go func() {
-			for {
-				select {
-				case myc1 <- 0:
-				case myc2 <- 0:
-				case myc3 <- 0:
-				case <-done:
-					return
-				}
-			}
-		}()
-		for pb.Next() {
-			select {
-			case <-myc1:
-			case <-myc2:
-			case <-myc3:
-			}
-		}
-	})
-	close(done)
-}
-
-func BenchmarkSelectAsyncContended(b *testing.B) {
-	procs := runtime.GOMAXPROCS(0)
-	myc1 := make(chan int, procs)
-	myc2 := make(chan int, procs)
-	b.RunParallel(func(pb *testing.PB) {
-		myc1 <- 0
-		for pb.Next() {
-			select {
-			case <-myc1:
-				myc2 <- 0
-			case <-myc2:
-				myc1 <- 0
-			}
-		}
-	})
-}
-
-func BenchmarkSelectNonblock(b *testing.B) {
-	myc1 := make(chan int)
-	myc2 := make(chan int)
-	myc3 := make(chan int, 1)
-	myc4 := make(chan int, 1)
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			select {
-			case <-myc1:
-			default:
-			}
-			select {
-			case myc2 <- 0:
-			default:
-			}
-			select {
-			case <-myc3:
-			default:
-			}
-			select {
-			case myc4 <- 0:
-			default:
-			}
-		}
-	})
-}
-
-func BenchmarkChanUncontended(b *testing.B) {
-	const C = 100
-	b.RunParallel(func(pb *testing.PB) {
-		myc := make(chan int, C)
-		for pb.Next() {
-			for i := 0; i < C; i++ {
-				myc <- 0
-			}
-			for i := 0; i < C; i++ {
-				<-myc
-			}
-		}
-	})
-}
-
-func BenchmarkChanContended(b *testing.B) {
-	const C = 100
-	myc := make(chan int, C*runtime.GOMAXPROCS(0))
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			for i := 0; i < C; i++ {
-				myc <- 0
-			}
-			for i := 0; i < C; i++ {
-				<-myc
-			}
-		}
-	})
-}
-
-func BenchmarkChanSync(b *testing.B) {
-	const CallsPerSched = 1000
-	procs := 2
-	N := int32(b.N / CallsPerSched / procs * procs)
-	c := make(chan bool, procs)
-	myc := make(chan int)
-	for p := 0; p < procs; p++ {
-		go func() {
-			for {
-				i := atomic.AddInt32(&N, -1)
-				if i < 0 {
-					break
-				}
-				for g := 0; g < CallsPerSched; g++ {
-					if i%2 == 0 {
-						<-myc
-						myc <- 0
-					} else {
-						myc <- 0
-						<-myc
-					}
-				}
-			}
-			c <- true
-		}()
-	}
-	for p := 0; p < procs; p++ {
-		<-c
-	}
-}
-
-func benchmarkChanProdCons(b *testing.B, chanSize, localWork int) {
-	const CallsPerSched = 1000
-	procs := runtime.GOMAXPROCS(-1)
-	N := int32(b.N / CallsPerSched)
-	c := make(chan bool, 2*procs)
-	myc := make(chan int, chanSize)
-	for p := 0; p < procs; p++ {
-		go func() {
-			foo := 0
-			for atomic.AddInt32(&N, -1) >= 0 {
-				for g := 0; g < CallsPerSched; g++ {
-					for i := 0; i < localWork; i++ {
-						foo *= 2
-						foo /= 2
-					}
-					myc <- 1
-				}
-			}
-			myc <- 0
-			c <- foo == 42
-		}()
-		go func() {
-			foo := 0
-			for {
-				v := <-myc
-				if v == 0 {
-					break
-				}
-				for i := 0; i < localWork; i++ {
-					foo *= 2
-					foo /= 2
-				}
-			}
-			c <- foo == 42
-		}()
-	}
-	for p := 0; p < procs; p++ {
-		<-c
-		<-c
-	}
-}
-
-func BenchmarkChanProdCons0(b *testing.B) {
-	benchmarkChanProdCons(b, 0, 0)
-}
-
-func BenchmarkChanProdCons10(b *testing.B) {
-	benchmarkChanProdCons(b, 10, 0)
-}
-
-func BenchmarkChanProdCons100(b *testing.B) {
-	benchmarkChanProdCons(b, 100, 0)
-}
-
-func BenchmarkChanProdConsWork0(b *testing.B) {
-	benchmarkChanProdCons(b, 0, 100)
-}
-
-func BenchmarkChanProdConsWork10(b *testing.B) {
-	benchmarkChanProdCons(b, 10, 100)
-}
-
-func BenchmarkChanProdConsWork100(b *testing.B) {
-	benchmarkChanProdCons(b, 100, 100)
-}
-
-func BenchmarkSelectProdCons(b *testing.B) {
-	const CallsPerSched = 1000
-	procs := runtime.GOMAXPROCS(-1)
-	N := int32(b.N / CallsPerSched)
-	c := make(chan bool, 2*procs)
-	myc := make(chan int, 128)
-	myclose := make(chan bool)
-	for p := 0; p < procs; p++ {
-		go func() {
-			// Producer: sends to myc.
-			foo := 0
-			// Intended to not fire during benchmarking.
-			mytimer := time.After(time.Hour)
-			for atomic.AddInt32(&N, -1) >= 0 {
-				for g := 0; g < CallsPerSched; g++ {
-					// Model some local work.
-					for i := 0; i < 100; i++ {
-						foo *= 2
-						foo /= 2
-					}
-					select {
-					case myc <- 1:
-					case <-mytimer:
-					case <-myclose:
-					}
-				}
-			}
-			myc <- 0
-			c <- foo == 42
-		}()
-		go func() {
-			// Consumer: receives from myc.
-			foo := 0
-			// Intended to not fire during benchmarking.
-			mytimer := time.After(time.Hour)
-		loop:
-			for {
-				select {
-				case v := <-myc:
-					if v == 0 {
-						break loop
-					}
-				case <-mytimer:
-				case <-myclose:
-				}
-				// Model some local work.
-				for i := 0; i < 100; i++ {
-					foo *= 2
-					foo /= 2
-				}
-			}
-			c <- foo == 42
-		}()
-	}
-	for p := 0; p < procs; p++ {
-		<-c
-		<-c
-	}
-}
-
-func BenchmarkChanCreation(b *testing.B) {
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			myc := make(chan int, 1)
-			myc <- 0
-			<-myc
-		}
-	})
-}
-
-func BenchmarkChanSem(b *testing.B) {
-	type Empty struct{}
-	myc := make(chan Empty, runtime.GOMAXPROCS(0))
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			myc <- Empty{}
-			<-myc
-		}
-	})
-}
-
-func BenchmarkChanPopular(b *testing.B) {
-	const n = 1000
-	c := make(chan bool)
-	var a []chan bool
-	var wg sync.WaitGroup
-	wg.Add(n)
-	for j := 0; j < n; j++ {
-		d := make(chan bool)
-		a = append(a, d)
-		go func() {
-			for i := 0; i < b.N; i++ {
-				select {
-				case <-c:
-				case <-d:
-				}
-			}
-			wg.Done()
-		}()
-	}
-	for i := 0; i < b.N; i++ {
-		for _, d := range a {
-			d <- true
-		}
-	}
-	wg.Wait()
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/chanbarrier_test.go b/third_party/gofrontend/libgo/go/runtime/chanbarrier_test.go
deleted file mode 100644
index 770b850..0000000
--- a/third_party/gofrontend/libgo/go/runtime/chanbarrier_test.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"runtime"
-	"sync"
-	"testing"
-)
-
-type response struct {
-}
-
-type myError struct {
-}
-
-func (myError) Error() string { return "" }
-
-func doRequest(useSelect bool) (*response, error) {
-	type async struct {
-		resp *response
-		err  error
-	}
-	ch := make(chan *async, 0)
-	done := make(chan struct{}, 0)
-
-	if useSelect {
-		go func() {
-			select {
-			case ch <- &async{resp: nil, err: myError{}}:
-			case <-done:
-			}
-		}()
-	} else {
-		go func() {
-			ch <- &async{resp: nil, err: myError{}}
-		}()
-	}
-
-	r := <-ch
-	runtime.Gosched()
-	return r.resp, r.err
-}
-
-func TestChanSendSelectBarrier(t *testing.T) {
-	testChanSendBarrier(true)
-}
-
-func TestChanSendBarrier(t *testing.T) {
-	testChanSendBarrier(false)
-}
-
-func testChanSendBarrier(useSelect bool) {
-	var wg sync.WaitGroup
-	var globalMu sync.Mutex
-	outer := 100
-	inner := 100000
-	if testing.Short() {
-		outer = 10
-		inner = 1000
-	}
-	for i := 0; i < outer; i++ {
-		wg.Add(1)
-		go func() {
-			defer wg.Done()
-			var garbage []byte
-			for j := 0; j < inner; j++ {
-				_, err := doRequest(useSelect)
-				_, ok := err.(myError)
-				if !ok {
-					panic(1)
-				}
-				garbage = make([]byte, 1<<10)
-			}
-			globalMu.Lock()
-			global = garbage
-			globalMu.Unlock()
-		}()
-	}
-	wg.Wait()
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/closure_test.go b/third_party/gofrontend/libgo/go/runtime/closure_test.go
deleted file mode 100644
index ea65fbd..0000000
--- a/third_party/gofrontend/libgo/go/runtime/closure_test.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-package runtime_test
-
-import "testing"
-
-var s int
-
-func BenchmarkCallClosure(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		s += func(ii int) int { return 2 * ii }(i)
-	}
-}
-
-func BenchmarkCallClosure1(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		j := i
-		s += func(ii int) int { return 2*ii + j }(i)
-	}
-}
-
-var ss *int
-
-func BenchmarkCallClosure2(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		j := i
-		s += func() int {
-			ss = &j
-			return 2
-		}()
-	}
-}
-
-func addr1(x int) *int {
-	return func() *int { return &x }()
-}
-
-func BenchmarkCallClosure3(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ss = addr1(i)
-	}
-}
-
-func addr2() (x int, p *int) {
-	return 0, func() *int { return &x }()
-}
-
-func BenchmarkCallClosure4(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		_, ss = addr2()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/compiler.go b/third_party/gofrontend/libgo/go/runtime/compiler.go
deleted file mode 100644
index b04be61..0000000
--- a/third_party/gofrontend/libgo/go/runtime/compiler.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime
-
-// Compiler is the name of the compiler toolchain that built the
-// running binary.  Known toolchains are:
-//
-//	gc      Also known as cmd/compile.
-//	gccgo   The gccgo front end, part of the GCC compiler suite.
-//
-const Compiler = "gccgo"
diff --git a/third_party/gofrontend/libgo/go/runtime/complex_test.go b/third_party/gofrontend/libgo/go/runtime/complex_test.go
deleted file mode 100644
index f41e6a3..0000000
--- a/third_party/gofrontend/libgo/go/runtime/complex_test.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"math/cmplx"
-	"testing"
-)
-
-var result complex128
-
-func BenchmarkComplex128DivNormal(b *testing.B) {
-	d := 15 + 2i
-	n := 32 + 3i
-	res := 0i
-	for i := 0; i < b.N; i++ {
-		n += 0.1i
-		res += n / d
-	}
-	result = res
-}
-
-func BenchmarkComplex128DivNisNaN(b *testing.B) {
-	d := cmplx.NaN()
-	n := 32 + 3i
-	res := 0i
-	for i := 0; i < b.N; i++ {
-		n += 0.1i
-		res += n / d
-	}
-	result = res
-}
-
-func BenchmarkComplex128DivDisNaN(b *testing.B) {
-	d := 15 + 2i
-	n := cmplx.NaN()
-	res := 0i
-	for i := 0; i < b.N; i++ {
-		d += 0.1i
-		res += n / d
-	}
-	result = res
-}
-
-func BenchmarkComplex128DivNisInf(b *testing.B) {
-	d := 15 + 2i
-	n := cmplx.Inf()
-	res := 0i
-	for i := 0; i < b.N; i++ {
-		d += 0.1i
-		res += n / d
-	}
-	result = res
-}
-
-func BenchmarkComplex128DivDisInf(b *testing.B) {
-	d := cmplx.Inf()
-	n := 32 + 3i
-	res := 0i
-	for i := 0; i < b.N; i++ {
-		n += 0.1i
-		res += n / d
-	}
-	result = res
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/crash_cgo_test.go b/third_party/gofrontend/libgo/go/runtime/crash_cgo_test.go
deleted file mode 100644
index 2e65e4c..0000000
--- a/third_party/gofrontend/libgo/go/runtime/crash_cgo_test.go
+++ /dev/null
@@ -1,481 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo
-
-package runtime_test
-
-import (
-	"os/exec"
-	"runtime"
-	"strings"
-	"testing"
-)
-
-func TestCgoCrashHandler(t *testing.T) {
-	testCrashHandler(t, true)
-}
-
-func TestCgoSignalDeadlock(t *testing.T) {
-	if testing.Short() && runtime.GOOS == "windows" {
-		t.Skip("Skipping in short mode") // takes up to 64 seconds
-	}
-	got := executeTest(t, cgoSignalDeadlockSource, nil)
-	want := "OK\n"
-	if got != want {
-		t.Fatalf("expected %q, but got %q", want, got)
-	}
-}
-
-func TestCgoTraceback(t *testing.T) {
-	got := executeTest(t, cgoTracebackSource, nil)
-	want := "OK\n"
-	if got != want {
-		t.Fatalf("expected %q, but got %q", want, got)
-	}
-}
-
-func TestCgoCallbackGC(t *testing.T) {
-	if runtime.GOOS == "plan9" || runtime.GOOS == "windows" {
-		t.Skipf("no pthreads on %s", runtime.GOOS)
-	}
-	if testing.Short() && runtime.GOOS == "dragonfly" {
-		t.Skip("see golang.org/issue/11990")
-	}
-	got := executeTest(t, cgoCallbackGCSource, nil)
-	want := "OK\n"
-	if got != want {
-		t.Fatalf("expected %q, but got %q", want, got)
-	}
-}
-
-func TestCgoExternalThreadPanic(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skipf("no pthreads on %s", runtime.GOOS)
-	}
-	csrc := cgoExternalThreadPanicC
-	if runtime.GOOS == "windows" {
-		csrc = cgoExternalThreadPanicC_windows
-	}
-	got := executeTest(t, cgoExternalThreadPanicSource, nil, "main.c", csrc)
-	want := "panic: BOOM"
-	if !strings.Contains(got, want) {
-		t.Fatalf("want failure containing %q. output:\n%s\n", want, got)
-	}
-}
-
-func TestCgoExternalThreadSIGPROF(t *testing.T) {
-	// issue 9456.
-	switch runtime.GOOS {
-	case "plan9", "windows":
-		t.Skipf("no pthreads on %s", runtime.GOOS)
-	case "darwin":
-		if runtime.GOARCH != "arm" && runtime.GOARCH != "arm64" {
-			// static constructor needs external linking, but we don't support
-			// external linking on OS X 10.6.
-			out, err := exec.Command("uname", "-r").Output()
-			if err != nil {
-				t.Fatalf("uname -r failed: %v", err)
-			}
-			// OS X 10.6 == Darwin 10.x
-			if strings.HasPrefix(string(out), "10.") {
-				t.Skipf("no external linking on OS X 10.6")
-			}
-		}
-	}
-	if runtime.GOARCH == "ppc64" || runtime.GOARCH == "ppc64le" {
-		// TODO(austin) External linking not implemented on
-		// ppc64 (issue #8912)
-		t.Skipf("no external linking on ppc64")
-	}
-	got := executeTest(t, cgoExternalThreadSIGPROFSource, nil)
-	want := "OK\n"
-	if got != want {
-		t.Fatalf("expected %q, but got %q", want, got)
-	}
-}
-
-func TestCgoExternalThreadSignal(t *testing.T) {
-	// issue 10139
-	switch runtime.GOOS {
-	case "plan9", "windows":
-		t.Skipf("no pthreads on %s", runtime.GOOS)
-	}
-	got := executeTest(t, cgoExternalThreadSignalSource, nil)
-	want := "OK\n"
-	if got != want {
-		t.Fatalf("expected %q, but got %q", want, got)
-	}
-}
-
-func TestCgoDLLImports(t *testing.T) {
-	// test issue 9356
-	if runtime.GOOS != "windows" {
-		t.Skip("skipping windows specific test")
-	}
-	got := executeTest(t, cgoDLLImportsMainSource, nil, "a/a.go", cgoDLLImportsPkgSource)
-	want := "OK\n"
-	if got != want {
-		t.Fatalf("expected %q, but got %v", want, got)
-	}
-}
-
-const cgoSignalDeadlockSource = `
-package main
-
-import "C"
-
-import (
-	"fmt"
-	"runtime"
-	"time"
-)
-
-func main() {
-	runtime.GOMAXPROCS(100)
-	ping := make(chan bool)
-	go func() {
-		for i := 0; ; i++ {
-			runtime.Gosched()
-			select {
-			case done := <-ping:
-				if done {
-					ping <- true
-					return
-				}
-				ping <- true
-			default:
-			}
-			func() {
-				defer func() {
-					recover()
-				}()
-				var s *string
-				*s = ""
-			}()
-		}
-	}()
-	time.Sleep(time.Millisecond)
-	for i := 0; i < 64; i++ {
-		go func() {
-			runtime.LockOSThread()
-			select {}
-		}()
-		go func() {
-			runtime.LockOSThread()
-			select {}
-		}()
-		time.Sleep(time.Millisecond)
-		ping <- false
-		select {
-		case <-ping:
-		case <-time.After(time.Second):
-			fmt.Printf("HANG\n")
-			return
-		}
-	}
-	ping <- true
-	select {
-	case <-ping:
-	case <-time.After(time.Second):
-		fmt.Printf("HANG\n")
-		return
-	}
-	fmt.Printf("OK\n")
-}
-`
-
-const cgoTracebackSource = `
-package main
-
-/* void foo(void) {} */
-import "C"
-
-import (
-	"fmt"
-	"runtime"
-)
-
-func main() {
-	C.foo()
-	buf := make([]byte, 1)
-	runtime.Stack(buf, true)
-	fmt.Printf("OK\n")
-}
-`
-
-const cgoCallbackGCSource = `
-package main
-
-import "runtime"
-
-/*
-#include <pthread.h>
-
-void go_callback();
-
-static void *thr(void *arg) {
-    go_callback();
-    return 0;
-}
-
-static void foo() {
-    pthread_t th;
-    pthread_create(&th, 0, thr, 0);
-    pthread_join(th, 0);
-}
-*/
-import "C"
-import "fmt"
-
-//export go_callback
-func go_callback() {
-	runtime.GC()
-	grow()
-	runtime.GC()
-}
-
-var cnt int
-
-func grow() {
-	x := 10000
-	sum := 0
-	if grow1(&x, &sum) == 0 {
-		panic("bad")
-	}
-}
-
-func grow1(x, sum *int) int {
-	if *x == 0 {
-		return *sum + 1
-	}
-	*x--
-	sum1 := *sum + *x
-	return grow1(x, &sum1)
-}
-
-func main() {
-	const P = 100
-	done := make(chan bool)
-	// allocate a bunch of stack frames and spray them with pointers
-	for i := 0; i < P; i++ {
-		go func() {
-			grow()
-			done <- true
-		}()
-	}
-	for i := 0; i < P; i++ {
-		<-done
-	}
-	// now give these stack frames to cgo callbacks
-	for i := 0; i < P; i++ {
-		go func() {
-			C.foo()
-			done <- true
-		}()
-	}
-	for i := 0; i < P; i++ {
-		<-done
-	}
-	fmt.Printf("OK\n")
-}
-`
-
-const cgoExternalThreadPanicSource = `
-package main
-
-// void start(void);
-import "C"
-
-func main() {
-	C.start()
-	select {}
-}
-
-//export gopanic
-func gopanic() {
-	panic("BOOM")
-}
-`
-
-const cgoExternalThreadPanicC = `
-#include <stdlib.h>
-#include <stdio.h>
-#include <pthread.h>
-
-void gopanic(void);
-
-static void*
-die(void* x)
-{
-	gopanic();
-	return 0;
-}
-
-void
-start(void)
-{
-	pthread_t t;
-	if(pthread_create(&t, 0, die, 0) != 0)
-		printf("pthread_create failed\n");
-}
-`
-
-const cgoExternalThreadPanicC_windows = `
-#include <stdlib.h>
-#include <stdio.h>
-
-void gopanic(void);
-
-static void*
-die(void* x)
-{
-	gopanic();
-	return 0;
-}
-
-void
-start(void)
-{
-	if(_beginthreadex(0, 0, die, 0, 0, 0) != 0)
-		printf("_beginthreadex failed\n");
-}
-`
-
-const cgoExternalThreadSIGPROFSource = `
-package main
-
-/*
-#include <stdint.h>
-#include <signal.h>
-#include <pthread.h>
-
-volatile int32_t spinlock;
-
-static void *thread1(void *p) {
-	(void)p;
-	while (spinlock == 0)
-		;
-	pthread_kill(pthread_self(), SIGPROF);
-	spinlock = 0;
-	return NULL;
-}
-__attribute__((constructor)) void issue9456() {
-	pthread_t tid;
-	pthread_create(&tid, 0, thread1, NULL);
-}
-*/
-import "C"
-
-import (
-	"runtime"
-	"sync/atomic"
-	"unsafe"
-)
-
-func main() {
-	// This test intends to test that sending SIGPROF to foreign threads
-	// before we make any cgo call will not abort the whole process, so
-	// we cannot make any cgo call here. See https://golang.org/issue/9456.
-	atomic.StoreInt32((*int32)(unsafe.Pointer(&C.spinlock)), 1)
-	for atomic.LoadInt32((*int32)(unsafe.Pointer(&C.spinlock))) == 1 {
-		runtime.Gosched()
-	}
-	println("OK")
-}
-`
-
-const cgoExternalThreadSignalSource = `
-package main
-
-/*
-#include <pthread.h>
-
-void **nullptr;
-
-void *crash(void *p) {
-	*nullptr = p;
-	return 0;
-}
-
-int start_crashing_thread(void) {
-	pthread_t tid;
-	return pthread_create(&tid, 0, crash, 0);
-}
-*/
-import "C"
-
-import (
-	"fmt"
-	"os"
-	"os/exec"
-	"time"
-)
-
-func main() {
-	if len(os.Args) > 1 && os.Args[1] == "crash" {
-		i := C.start_crashing_thread()
-		if i != 0 {
-			fmt.Println("pthread_create failed:", i)
-			// Exit with 0 because parent expects us to crash.
-			return
-		}
-
-		// We should crash immediately, but give it plenty of
-		// time before failing (by exiting 0) in case we are
-		// running on a slow system.
-		time.Sleep(5 * time.Second)
-		return
-	}
-
-	out, err := exec.Command(os.Args[0], "crash").CombinedOutput()
-	if err == nil {
-		fmt.Println("C signal did not crash as expected\n")
-		fmt.Printf("%s\n", out)
-		os.Exit(1)
-	}
-
-	fmt.Println("OK")
-}
-`
-
-const cgoDLLImportsMainSource = `
-package main
-
-/*
-#include <windows.h>
-
-DWORD getthread() {
-	return GetCurrentThreadId();
-}
-*/
-import "C"
-
-import "./a"
-
-func main() {
-	C.getthread()
-	a.GetThread()
-	println("OK")
-}
-`
-
-const cgoDLLImportsPkgSource = `
-package a
-
-/*
-#cgo CFLAGS: -mnop-fun-dllimport
-
-#include <windows.h>
-
-DWORD agetthread() {
-	return GetCurrentThreadId();
-}
-*/
-import "C"
-
-func GetThread() uint32 {
-	return uint32(C.agetthread())
-}
-`
diff --git a/third_party/gofrontend/libgo/go/runtime/crash_test.go b/third_party/gofrontend/libgo/go/runtime/crash_test.go
deleted file mode 100644
index 8efce4d..0000000
--- a/third_party/gofrontend/libgo/go/runtime/crash_test.go
+++ /dev/null
@@ -1,589 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"fmt"
-	"internal/testenv"
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"regexp"
-	"runtime"
-	"strings"
-	"sync"
-	"testing"
-	"text/template"
-)
-
-func testEnv(cmd *exec.Cmd) *exec.Cmd {
-	if cmd.Env != nil {
-		panic("environment already set")
-	}
-	for _, env := range os.Environ() {
-		// Exclude GODEBUG from the environment to prevent its output
-		// from breaking tests that are trying to parse other command output.
-		if strings.HasPrefix(env, "GODEBUG=") {
-			continue
-		}
-		// Exclude GOTRACEBACK for the same reason.
-		if strings.HasPrefix(env, "GOTRACEBACK=") {
-			continue
-		}
-		cmd.Env = append(cmd.Env, env)
-	}
-	return cmd
-}
-
-func executeTest(t *testing.T, templ string, data interface{}, extra ...string) string {
-	testenv.MustHaveGoBuild(t)
-
-	checkStaleRuntime(t)
-
-	st := template.Must(template.New("crashSource").Parse(templ))
-
-	dir, err := ioutil.TempDir("", "go-build")
-	if err != nil {
-		t.Fatalf("failed to create temp directory: %v", err)
-	}
-	defer os.RemoveAll(dir)
-
-	src := filepath.Join(dir, "main.go")
-	f, err := os.Create(src)
-	if err != nil {
-		t.Fatalf("failed to create file: %v", err)
-	}
-	err = st.Execute(f, data)
-	if err != nil {
-		f.Close()
-		t.Fatalf("failed to execute template: %v", err)
-	}
-	if err := f.Close(); err != nil {
-		t.Fatalf("failed to close file: %v", err)
-	}
-
-	for i := 0; i < len(extra); i += 2 {
-		fname := extra[i]
-		contents := extra[i+1]
-		if d, _ := filepath.Split(fname); d != "" {
-			if err := os.Mkdir(filepath.Join(dir, d), 0755); err != nil {
-				t.Fatal(err)
-			}
-		}
-		if err := ioutil.WriteFile(filepath.Join(dir, fname), []byte(contents), 0666); err != nil {
-			t.Fatal(err)
-		}
-	}
-
-	cmd := exec.Command("go", "build", "-o", "a.exe")
-	cmd.Dir = dir
-	out, err := testEnv(cmd).CombinedOutput()
-	if err != nil {
-		t.Fatalf("building source: %v\n%s", err, out)
-	}
-
-	got, _ := testEnv(exec.Command(filepath.Join(dir, "a.exe"))).CombinedOutput()
-	return string(got)
-}
-
-var (
-	staleRuntimeOnce sync.Once // guards init of staleRuntimeErr
-	staleRuntimeErr  error
-)
-
-func checkStaleRuntime(t *testing.T) {
-	staleRuntimeOnce.Do(func() {
-		// 'go run' uses the installed copy of runtime.a, which may be out of date.
-		out, err := testEnv(exec.Command("go", "list", "-f", "{{.Stale}}", "runtime")).CombinedOutput()
-		if err != nil {
-			staleRuntimeErr = fmt.Errorf("failed to execute 'go list': %v\n%v", err, string(out))
-			return
-		}
-		if string(out) != "false\n" {
-			staleRuntimeErr = fmt.Errorf("Stale runtime.a. Run 'go install runtime'.")
-		}
-	})
-	if staleRuntimeErr != nil {
-		t.Fatal(staleRuntimeErr)
-	}
-}
-
-func testCrashHandler(t *testing.T, cgo bool) {
-	type crashTest struct {
-		Cgo bool
-	}
-	output := executeTest(t, crashSource, &crashTest{Cgo: cgo})
-	want := "main: recovered done\nnew-thread: recovered done\nsecond-new-thread: recovered done\nmain-again: recovered done\n"
-	if output != want {
-		t.Fatalf("output:\n%s\n\nwanted:\n%s", output, want)
-	}
-}
-
-func TestCrashHandler(t *testing.T) {
-	testCrashHandler(t, false)
-}
-
-func testDeadlock(t *testing.T, source string) {
-	output := executeTest(t, source, nil)
-	want := "fatal error: all goroutines are asleep - deadlock!\n"
-	if !strings.HasPrefix(output, want) {
-		t.Fatalf("output does not start with %q:\n%s", want, output)
-	}
-}
-
-func TestSimpleDeadlock(t *testing.T) {
-	testDeadlock(t, simpleDeadlockSource)
-}
-
-func TestInitDeadlock(t *testing.T) {
-	testDeadlock(t, initDeadlockSource)
-}
-
-func TestLockedDeadlock(t *testing.T) {
-	testDeadlock(t, lockedDeadlockSource)
-}
-
-func TestLockedDeadlock2(t *testing.T) {
-	testDeadlock(t, lockedDeadlockSource2)
-}
-
-func TestGoexitDeadlock(t *testing.T) {
-	output := executeTest(t, goexitDeadlockSource, nil)
-	want := "no goroutines (main called runtime.Goexit) - deadlock!"
-	if !strings.Contains(output, want) {
-		t.Fatalf("output:\n%s\n\nwant output containing: %s", output, want)
-	}
-}
-
-func TestStackOverflow(t *testing.T) {
-	output := executeTest(t, stackOverflowSource, nil)
-	want := "runtime: goroutine stack exceeds 4194304-byte limit\nfatal error: stack overflow"
-	if !strings.HasPrefix(output, want) {
-		t.Fatalf("output does not start with %q:\n%s", want, output)
-	}
-}
-
-func TestThreadExhaustion(t *testing.T) {
-	output := executeTest(t, threadExhaustionSource, nil)
-	want := "runtime: program exceeds 10-thread limit\nfatal error: thread exhaustion"
-	if !strings.HasPrefix(output, want) {
-		t.Fatalf("output does not start with %q:\n%s", want, output)
-	}
-}
-
-func TestRecursivePanic(t *testing.T) {
-	output := executeTest(t, recursivePanicSource, nil)
-	want := `wrap: bad
-panic: again
-
-`
-	if !strings.HasPrefix(output, want) {
-		t.Fatalf("output does not start with %q:\n%s", want, output)
-	}
-
-}
-
-func TestGoexitCrash(t *testing.T) {
-	output := executeTest(t, goexitExitSource, nil)
-	want := "no goroutines (main called runtime.Goexit) - deadlock!"
-	if !strings.Contains(output, want) {
-		t.Fatalf("output:\n%s\n\nwant output containing: %s", output, want)
-	}
-}
-
-func TestGoexitDefer(t *testing.T) {
-	c := make(chan struct{})
-	go func() {
-		defer func() {
-			r := recover()
-			if r != nil {
-				t.Errorf("non-nil recover during Goexit")
-			}
-			c <- struct{}{}
-		}()
-		runtime.Goexit()
-	}()
-	// Note: if the defer fails to run, we will get a deadlock here
-	<-c
-}
-
-func TestGoNil(t *testing.T) {
-	output := executeTest(t, goNilSource, nil)
-	want := "go of nil func value"
-	if !strings.Contains(output, want) {
-		t.Fatalf("output:\n%s\n\nwant output containing: %s", output, want)
-	}
-}
-
-func TestMainGoroutineId(t *testing.T) {
-	output := executeTest(t, mainGoroutineIdSource, nil)
-	want := "panic: test\n\ngoroutine 1 [running]:\n"
-	if !strings.HasPrefix(output, want) {
-		t.Fatalf("output does not start with %q:\n%s", want, output)
-	}
-}
-
-func TestNoHelperGoroutines(t *testing.T) {
-	output := executeTest(t, noHelperGoroutinesSource, nil)
-	matches := regexp.MustCompile(`goroutine [0-9]+ \[`).FindAllStringSubmatch(output, -1)
-	if len(matches) != 1 || matches[0][0] != "goroutine 1 [" {
-		t.Fatalf("want to see only goroutine 1, see:\n%s", output)
-	}
-}
-
-func TestBreakpoint(t *testing.T) {
-	output := executeTest(t, breakpointSource, nil)
-	want := "runtime.Breakpoint()"
-	if !strings.Contains(output, want) {
-		t.Fatalf("output:\n%s\n\nwant output containing: %s", output, want)
-	}
-}
-
-const crashSource = `
-package main
-
-import (
-	"fmt"
-	"runtime"
-)
-
-{{if .Cgo}}
-import "C"
-{{end}}
-
-func test(name string) {
-	defer func() {
-		if x := recover(); x != nil {
-			fmt.Printf(" recovered")
-		}
-		fmt.Printf(" done\n")
-	}()
-	fmt.Printf("%s:", name)
-	var s *string
-	_ = *s
-	fmt.Print("SHOULD NOT BE HERE")
-}
-
-func testInNewThread(name string) {
-	c := make(chan bool)
-	go func() {
-		runtime.LockOSThread()
-		test(name)
-		c <- true
-	}()
-	<-c
-}
-
-func main() {
-	runtime.LockOSThread()
-	test("main")
-	testInNewThread("new-thread")
-	testInNewThread("second-new-thread")
-	test("main-again")
-}
-`
-
-const simpleDeadlockSource = `
-package main
-func main() {
-	select {}
-}
-`
-
-const initDeadlockSource = `
-package main
-func init() {
-	select {}
-}
-func main() {
-}
-`
-
-const lockedDeadlockSource = `
-package main
-import "runtime"
-func main() {
-	runtime.LockOSThread()
-	select {}
-}
-`
-
-const lockedDeadlockSource2 = `
-package main
-import (
-	"runtime"
-	"time"
-)
-func main() {
-	go func() {
-		runtime.LockOSThread()
-		select {}
-	}()
-	time.Sleep(time.Millisecond)
-	select {}
-}
-`
-
-const goexitDeadlockSource = `
-package main
-import (
-      "runtime"
-)
-
-func F() {
-      for i := 0; i < 10; i++ {
-      }
-}
-
-func main() {
-      go F()
-      go F()
-      runtime.Goexit()
-}
-`
-
-const stackOverflowSource = `
-package main
-
-import "runtime/debug"
-
-func main() {
-	debug.SetMaxStack(4<<20)
-	f(make([]byte, 10))
-}
-
-func f(x []byte) byte {
-	var buf [64<<10]byte
-	return x[0] + f(buf[:])
-}
-`
-
-const threadExhaustionSource = `
-package main
-
-import (
-	"runtime"
-	"runtime/debug"
-)
-
-func main() {
-	debug.SetMaxThreads(10)
-	c := make(chan int)
-	for i := 0; i < 100; i++ {
-		go func() {
-			runtime.LockOSThread()
-			c <- 0
-			select{}
-		}()
-		<-c
-	}
-}
-`
-
-const recursivePanicSource = `
-package main
-
-import (
-	"fmt"
-)
-
-func main() {
-	func() {
-		defer func() {
-			fmt.Println(recover())
-		}()
-		var x [8192]byte
-		func(x [8192]byte) {
-			defer func() {
-				if err := recover(); err != nil {
-					panic("wrap: " + err.(string))
-				}
-			}()
-			panic("bad")
-		}(x)
-	}()
-	panic("again")
-}
-`
-
-const goexitExitSource = `
-package main
-
-import (
-	"runtime"
-	"time"
-)
-
-func main() {
-	go func() {
-		time.Sleep(time.Millisecond)
-	}()
-	i := 0
-	runtime.SetFinalizer(&i, func(p *int) {})
-	runtime.GC()
-	runtime.Goexit()
-}
-`
-
-const goNilSource = `
-package main
-
-func main() {
-	defer func() {
-		recover()
-	}()
-	var f func()
-	go f()
-	select{}
-}
-`
-
-const mainGoroutineIdSource = `
-package main
-func main() {
-	panic("test")
-}
-`
-
-const noHelperGoroutinesSource = `
-package main
-import (
-	"runtime"
-	"time"
-)
-func init() {
-	i := 0
-	runtime.SetFinalizer(&i, func(p *int) {})
-	time.AfterFunc(time.Hour, func() {})
-	panic("oops")
-}
-func main() {
-}
-`
-
-const breakpointSource = `
-package main
-import "runtime"
-func main() {
-	runtime.Breakpoint()
-}
-`
-
-func TestGoexitInPanic(t *testing.T) {
-	// see issue 8774: this code used to trigger an infinite recursion
-	output := executeTest(t, goexitInPanicSource, nil)
-	want := "fatal error: no goroutines (main called runtime.Goexit) - deadlock!"
-	if !strings.HasPrefix(output, want) {
-		t.Fatalf("output does not start with %q:\n%s", want, output)
-	}
-}
-
-const goexitInPanicSource = `
-package main
-import "runtime"
-func main() {
-	go func() {
-		defer func() {
-			runtime.Goexit()
-		}()
-		panic("hello")
-	}()
-	runtime.Goexit()
-}
-`
-
-func TestPanicAfterGoexit(t *testing.T) {
-	// an uncaught panic should still work after goexit
-	output := executeTest(t, panicAfterGoexitSource, nil)
-	want := "panic: hello"
-	if !strings.HasPrefix(output, want) {
-		t.Fatalf("output does not start with %q:\n%s", want, output)
-	}
-}
-
-const panicAfterGoexitSource = `
-package main
-import "runtime"
-func main() {
-	defer func() {
-		panic("hello")
-	}()
-	runtime.Goexit()
-}
-`
-
-func TestRecoveredPanicAfterGoexit(t *testing.T) {
-	output := executeTest(t, recoveredPanicAfterGoexitSource, nil)
-	want := "fatal error: no goroutines (main called runtime.Goexit) - deadlock!"
-	if !strings.HasPrefix(output, want) {
-		t.Fatalf("output does not start with %q:\n%s", want, output)
-	}
-}
-
-const recoveredPanicAfterGoexitSource = `
-package main
-import "runtime"
-func main() {
-	defer func() {
-		defer func() {
-			r := recover()
-			if r == nil {
-				panic("bad recover")
-			}
-		}()
-		panic("hello")
-	}()
-	runtime.Goexit()
-}
-`
-
-func TestRecoverBeforePanicAfterGoexit(t *testing.T) {
-	// 1. defer a function that recovers
-	// 2. defer a function that panics
-	// 3. call goexit
-	// Goexit should run the #2 defer.  Its panic
-	// should be caught by the #1 defer, and execution
-	// should resume in the caller.  Like the Goexit
-	// never happened!
-	defer func() {
-		r := recover()
-		if r == nil {
-			panic("bad recover")
-		}
-	}()
-	defer func() {
-		panic("hello")
-	}()
-	runtime.Goexit()
-}
-
-func TestNetpollDeadlock(t *testing.T) {
-	output := executeTest(t, netpollDeadlockSource, nil)
-	want := "done\n"
-	if !strings.HasSuffix(output, want) {
-		t.Fatalf("output does not start with %q:\n%s", want, output)
-	}
-}
-
-const netpollDeadlockSource = `
-package main
-import (
-	"fmt"
-	"net"
-)
-func init() {
-	fmt.Println("dialing")
-	c, err := net.Dial("tcp", "localhost:14356")
-	if err == nil {
-		c.Close()
-	} else {
-		fmt.Println("error: ", err)
-	}
-}
-func main() {
-	fmt.Println("done")
-}
-`
diff --git a/third_party/gofrontend/libgo/go/runtime/crash_unix_test.go b/third_party/gofrontend/libgo/go/runtime/crash_unix_test.go
deleted file mode 100644
index b925d02..0000000
--- a/third_party/gofrontend/libgo/go/runtime/crash_unix_test.go
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package runtime_test
-
-import (
-	"bytes"
-	"internal/testenv"
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"syscall"
-	"testing"
-)
-
-func TestCrashDumpsAllThreads(t *testing.T) {
-	switch runtime.GOOS {
-	case "darwin", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
-	default:
-		t.Skipf("skipping; not supported on %v", runtime.GOOS)
-	}
-
-	// We don't use executeTest because we need to kill the
-	// program while it is running.
-
-	testenv.MustHaveGoBuild(t)
-
-	checkStaleRuntime(t)
-
-	dir, err := ioutil.TempDir("", "go-build")
-	if err != nil {
-		t.Fatalf("failed to create temp directory: %v", err)
-	}
-	defer os.RemoveAll(dir)
-
-	if err := ioutil.WriteFile(filepath.Join(dir, "main.go"), []byte(crashDumpsAllThreadsSource), 0666); err != nil {
-		t.Fatalf("failed to create Go file: %v", err)
-	}
-
-	cmd := exec.Command("go", "build", "-o", "a.exe")
-	cmd.Dir = dir
-	out, err := testEnv(cmd).CombinedOutput()
-	if err != nil {
-		t.Fatalf("building source: %v\n%s", err, out)
-	}
-
-	cmd = exec.Command(filepath.Join(dir, "a.exe"))
-	cmd = testEnv(cmd)
-	cmd.Env = append(cmd.Env, "GOTRACEBACK=crash")
-	var outbuf bytes.Buffer
-	cmd.Stdout = &outbuf
-	cmd.Stderr = &outbuf
-
-	rp, wp, err := os.Pipe()
-	if err != nil {
-		t.Fatal(err)
-	}
-	cmd.ExtraFiles = []*os.File{wp}
-
-	if err := cmd.Start(); err != nil {
-		t.Fatalf("starting program: %v", err)
-	}
-
-	if err := wp.Close(); err != nil {
-		t.Logf("closing write pipe: %v", err)
-	}
-	if _, err := rp.Read(make([]byte, 1)); err != nil {
-		t.Fatalf("reading from pipe: %v", err)
-	}
-
-	if err := cmd.Process.Signal(syscall.SIGQUIT); err != nil {
-		t.Fatalf("signal: %v", err)
-	}
-
-	// No point in checking the error return from Wait--we expect
-	// it to fail.
-	cmd.Wait()
-
-	// We want to see a stack trace for each thread.
-	// Before https://golang.org/cl/2811 running threads would say
-	// "goroutine running on other thread; stack unavailable".
-	out = outbuf.Bytes()
-	n := bytes.Count(out, []byte("main.loop("))
-	if n != 4 {
-		t.Errorf("found %d instances of main.loop; expected 4", n)
-		t.Logf("%s", out)
-	}
-}
-
-const crashDumpsAllThreadsSource = `
-package main
-
-import (
-	"fmt"
-	"os"
-	"runtime"
-)
-
-func main() {
-	const count = 4
-	runtime.GOMAXPROCS(count + 1)
-
-	chans := make([]chan bool, count)
-	for i := range chans {
-		chans[i] = make(chan bool)
-		go loop(i, chans[i])
-	}
-
-	// Wait for all the goroutines to start executing.
-	for _, c := range chans {
-		<-c
-	}
-
-	// Tell our parent that all the goroutines are executing.
-	if _, err := os.NewFile(3, "pipe").WriteString("x"); err != nil {
-		fmt.Fprintf(os.Stderr, "write to pipe failed: %v\n", err)
-		os.Exit(2)
-	}
-
-	select {}
-}
-
-func loop(i int, c chan bool) {
-	close(c)
-	for {
-		for j := 0; j < 0x7fffffff; j++ {
-		}
-	}
-}
-`
diff --git a/third_party/gofrontend/libgo/go/runtime/debug.go b/third_party/gofrontend/libgo/go/runtime/debug.go
deleted file mode 100644
index bcdde4b..0000000
--- a/third_party/gofrontend/libgo/go/runtime/debug.go
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime
-
-// Breakpoint executes a breakpoint trap.
-func Breakpoint()
-
-// LockOSThread wires the calling goroutine to its current operating system thread.
-// Until the calling goroutine exits or calls UnlockOSThread, it will always
-// execute in that thread, and no other goroutine can.
-func LockOSThread()
-
-// UnlockOSThread unwires the calling goroutine from its fixed operating system thread.
-// If the calling goroutine has not called LockOSThread, UnlockOSThread is a no-op.
-func UnlockOSThread()
-
-// GOMAXPROCS sets the maximum number of CPUs that can be executing
-// simultaneously and returns the previous setting.  If n < 1, it does not
-// change the current setting.
-// The number of logical CPUs on the local machine can be queried with NumCPU.
-// This call will go away when the scheduler improves.
-func GOMAXPROCS(n int) int
-
-// NumCPU returns the number of logical CPUs on the local machine.
-func NumCPU() int
-
-// NumCgoCall returns the number of cgo calls made by the current process.
-func NumCgoCall() int64
-
-// NumGoroutine returns the number of goroutines that currently exist.
-func NumGoroutine() int
-
-// MemProfileRate controls the fraction of memory allocations
-// that are recorded and reported in the memory profile.
-// The profiler aims to sample an average of
-// one allocation per MemProfileRate bytes allocated.
-//
-// To include every allocated block in the profile, set MemProfileRate to 1.
-// To turn off profiling entirely, set MemProfileRate to 0.
-//
-// The tools that process the memory profiles assume that the
-// profile rate is constant across the lifetime of the program
-// and equal to the current value.  Programs that change the
-// memory profiling rate should do so just once, as early as
-// possible in the execution of the program (for example,
-// at the beginning of main).
-var MemProfileRate int = 512 * 1024
-
-// A MemProfileRecord describes the live objects allocated
-// by a particular call sequence (stack trace).
-type MemProfileRecord struct {
-	AllocBytes, FreeBytes     int64       // number of bytes allocated, freed
-	AllocObjects, FreeObjects int64       // number of objects allocated, freed
-	Stack0                    [32]uintptr // stack trace for this record; ends at first 0 entry
-}
-
-// InUseBytes returns the number of bytes in use (AllocBytes - FreeBytes).
-func (r *MemProfileRecord) InUseBytes() int64 { return r.AllocBytes - r.FreeBytes }
-
-// InUseObjects returns the number of objects in use (AllocObjects - FreeObjects).
-func (r *MemProfileRecord) InUseObjects() int64 {
-	return r.AllocObjects - r.FreeObjects
-}
-
-// Stack returns the stack trace associated with the record,
-// a prefix of r.Stack0.
-func (r *MemProfileRecord) Stack() []uintptr {
-	for i, v := range r.Stack0 {
-		if v == 0 {
-			return r.Stack0[0:i]
-		}
-	}
-	return r.Stack0[0:]
-}
-
-// MemProfile returns n, the number of records in the current memory profile.
-// If len(p) >= n, MemProfile copies the profile into p and returns n, true.
-// If len(p) < n, MemProfile does not change p and returns n, false.
-//
-// If inuseZero is true, the profile includes allocation records
-// where r.AllocBytes > 0 but r.AllocBytes == r.FreeBytes.
-// These are sites where memory was allocated, but it has all
-// been released back to the runtime.
-//
-// Most clients should use the runtime/pprof package or
-// the testing package's -test.memprofile flag instead
-// of calling MemProfile directly.
-func MemProfile(p []MemProfileRecord, inuseZero bool) (n int, ok bool)
-
-// A StackRecord describes a single execution stack.
-type StackRecord struct {
-	Stack0 [32]uintptr // stack trace for this record; ends at first 0 entry
-}
-
-// Stack returns the stack trace associated with the record,
-// a prefix of r.Stack0.
-func (r *StackRecord) Stack() []uintptr {
-	for i, v := range r.Stack0 {
-		if v == 0 {
-			return r.Stack0[0:i]
-		}
-	}
-	return r.Stack0[0:]
-}
-
-// ThreadCreateProfile returns n, the number of records in the thread creation profile.
-// If len(p) >= n, ThreadCreateProfile copies the profile into p and returns n, true.
-// If len(p) < n, ThreadCreateProfile does not change p and returns n, false.
-//
-// Most clients should use the runtime/pprof package instead
-// of calling ThreadCreateProfile directly.
-func ThreadCreateProfile(p []StackRecord) (n int, ok bool)
-
-// GoroutineProfile returns n, the number of records in the active goroutine stack profile.
-// If len(p) >= n, GoroutineProfile copies the profile into p and returns n, true.
-// If len(p) < n, GoroutineProfile does not change p and returns n, false.
-//
-// Most clients should use the runtime/pprof package instead
-// of calling GoroutineProfile directly.
-func GoroutineProfile(p []StackRecord) (n int, ok bool)
-
-// CPUProfile returns the next chunk of binary CPU profiling stack trace data,
-// blocking until data is available.  If profiling is turned off and all the profile
-// data accumulated while it was on has been returned, CPUProfile returns nil.
-// The caller must save the returned data before calling CPUProfile again.
-//
-// Most clients should use the runtime/pprof package or
-// the testing package's -test.cpuprofile flag instead of calling
-// CPUProfile directly.
-func CPUProfile() []byte
-
-// SetCPUProfileRate sets the CPU profiling rate to hz samples per second.
-// If hz <= 0, SetCPUProfileRate turns off profiling.
-// If the profiler is on, the rate cannot be changed without first turning it off.
-//
-// Most clients should use the runtime/pprof package or
-// the testing package's -test.cpuprofile flag instead of calling
-// SetCPUProfileRate directly.
-func SetCPUProfileRate(hz int)
-
-// SetBlockProfileRate controls the fraction of goroutine blocking events
-// that are reported in the blocking profile.  The profiler aims to sample
-// an average of one blocking event per rate nanoseconds spent blocked.
-//
-// To include every blocking event in the profile, pass rate = 1.
-// To turn off profiling entirely, pass rate <= 0.
-func SetBlockProfileRate(rate int)
-
-// BlockProfileRecord describes blocking events originated
-// at a particular call sequence (stack trace).
-type BlockProfileRecord struct {
-	Count  int64
-	Cycles int64
-	StackRecord
-}
-
-// BlockProfile returns n, the number of records in the current blocking profile.
-// If len(p) >= n, BlockProfile copies the profile into p and returns n, true.
-// If len(p) < n, BlockProfile does not change p and returns n, false.
-//
-// Most clients should use the runtime/pprof package or
-// the testing package's -test.blockprofile flag instead
-// of calling BlockProfile directly.
-func BlockProfile(p []BlockProfileRecord) (n int, ok bool)
-
-// Stack formats a stack trace of the calling goroutine into buf
-// and returns the number of bytes written to buf.
-// If all is true, Stack formats stack traces of all other goroutines
-// into buf after the trace for the current goroutine.
-func Stack(buf []byte, all bool) int
-
-// Get field tracking information.  Only fields with a tag go:"track"
-// are tracked.  This function will add every such field that is
-// referenced to the map.  The keys in the map will be
-// PkgPath.Name.FieldName.  The value will be true for each field
-// added.
-func Fieldtrack(map[string]bool)
diff --git a/third_party/gofrontend/libgo/go/runtime/debug/garbage.go b/third_party/gofrontend/libgo/go/runtime/debug/garbage.go
deleted file mode 100644
index c3363f9..0000000
--- a/third_party/gofrontend/libgo/go/runtime/debug/garbage.go
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package debug
-
-import (
-	"runtime"
-	"sort"
-	"time"
-)
-
-// GCStats collect information about recent garbage collections.
-type GCStats struct {
-	LastGC         time.Time       // time of last collection
-	NumGC          int64           // number of garbage collections
-	PauseTotal     time.Duration   // total pause for all collections
-	Pause          []time.Duration // pause history, most recent first
-	PauseQuantiles []time.Duration
-}
-
-// Implemented in package runtime.
-func readGCStats(*[]time.Duration)
-func enableGC(bool) bool
-func setGCPercent(int) int
-func freeOSMemory()
-func setMaxStack(int) int
-func setMaxThreads(int) int
-
-// ReadGCStats reads statistics about garbage collection into stats.
-// The number of entries in the pause history is system-dependent;
-// stats.Pause slice will be reused if large enough, reallocated otherwise.
-// ReadGCStats may use the full capacity of the stats.Pause slice.
-// If stats.PauseQuantiles is non-empty, ReadGCStats fills it with quantiles
-// summarizing the distribution of pause time. For example, if
-// len(stats.PauseQuantiles) is 5, it will be filled with the minimum,
-// 25%, 50%, 75%, and maximum pause times.
-func ReadGCStats(stats *GCStats) {
-	// Create a buffer with space for at least two copies of the
-	// pause history tracked by the runtime. One will be returned
-	// to the caller and the other will be used as a temporary buffer
-	// for computing quantiles.
-	const maxPause = len(((*runtime.MemStats)(nil)).PauseNs)
-	if cap(stats.Pause) < 2*maxPause {
-		stats.Pause = make([]time.Duration, 2*maxPause)
-	}
-
-	// readGCStats fills in the pause history (up to maxPause entries)
-	// and then three more: Unix ns time of last GC, number of GC,
-	// and total pause time in nanoseconds. Here we depend on the
-	// fact that time.Duration's native unit is nanoseconds, so the
-	// pauses and the total pause time do not need any conversion.
-	readGCStats(&stats.Pause)
-	n := len(stats.Pause) - 3
-	stats.LastGC = time.Unix(0, int64(stats.Pause[n]))
-	stats.NumGC = int64(stats.Pause[n+1])
-	stats.PauseTotal = stats.Pause[n+2]
-	stats.Pause = stats.Pause[:n]
-
-	if len(stats.PauseQuantiles) > 0 {
-		if n == 0 {
-			for i := range stats.PauseQuantiles {
-				stats.PauseQuantiles[i] = 0
-			}
-		} else {
-			// There's room for a second copy of the data in stats.Pause.
-			// See the allocation at the top of the function.
-			sorted := stats.Pause[n : n+n]
-			copy(sorted, stats.Pause)
-			sort.Sort(byDuration(sorted))
-			nq := len(stats.PauseQuantiles) - 1
-			for i := 0; i < nq; i++ {
-				stats.PauseQuantiles[i] = sorted[len(sorted)*i/nq]
-			}
-			stats.PauseQuantiles[nq] = sorted[len(sorted)-1]
-		}
-	}
-}
-
-type byDuration []time.Duration
-
-func (x byDuration) Len() int           { return len(x) }
-func (x byDuration) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }
-func (x byDuration) Less(i, j int) bool { return x[i] < x[j] }
-
-// SetGCPercent sets the garbage collection target percentage:
-// a collection is triggered when the ratio of freshly allocated data
-// to live data remaining after the previous collection reaches this percentage.
-// SetGCPercent returns the previous setting.
-// The initial setting is the value of the GOGC environment variable
-// at startup, or 100 if the variable is not set.
-// A negative percentage disables garbage collection.
-func SetGCPercent(percent int) int {
-	old := setGCPercent(percent)
-	runtime.GC()
-	return old
-}
-
-// FreeOSMemory forces a garbage collection followed by an
-// attempt to return as much memory to the operating system
-// as possible. (Even if this is not called, the runtime gradually
-// returns memory to the operating system in a background task.)
-func FreeOSMemory() {
-	freeOSMemory()
-}
-
-// SetMaxStack sets the maximum amount of memory that
-// can be used by a single goroutine stack.
-// If any goroutine exceeds this limit while growing its stack,
-// the program crashes.
-// SetMaxStack returns the previous setting.
-// The initial setting is 1 GB on 64-bit systems, 250 MB on 32-bit systems.
-//
-// SetMaxStack is useful mainly for limiting the damage done by
-// goroutines that enter an infinite recursion. It only limits future
-// stack growth.
-func SetMaxStack(bytes int) int {
-	return setMaxStack(bytes)
-}
-
-// SetMaxThreads sets the maximum number of operating system
-// threads that the Go program can use. If it attempts to use more than
-// this many, the program crashes.
-// SetMaxThreads returns the previous setting.
-// The initial setting is 10,000 threads.
-//
-// The limit controls the number of operating system threads, not the number
-// of goroutines. A Go program creates a new thread only when a goroutine
-// is ready to run but all the existing threads are blocked in system calls, cgo calls,
-// or are locked to other goroutines due to use of runtime.LockOSThread.
-//
-// SetMaxThreads is useful mainly for limiting the damage done by
-// programs that create an unbounded number of threads. The idea is
-// to take down the program before it takes down the operating system.
-func SetMaxThreads(threads int) int {
-	return setMaxThreads(threads)
-}
-
-// SetPanicOnFault controls the runtime's behavior when a program faults
-// at an unexpected (non-nil) address. Such faults are typically caused by
-// bugs such as runtime memory corruption, so the default response is to crash
-// the program. Programs working with memory-mapped files or unsafe
-// manipulation of memory may cause faults at non-nil addresses in less
-// dramatic situations; SetPanicOnFault allows such programs to request
-// that the runtime trigger only a panic, not a crash.
-// SetPanicOnFault applies only to the current goroutine.
-// It returns the previous setting.
-func SetPanicOnFault(enabled bool) bool
-
-// WriteHeapDump writes a description of the heap and the objects in
-// it to the given file descriptor.
-// The heap dump format is defined at https://golang.org/s/go13heapdump.
-func WriteHeapDump(fd uintptr)
diff --git a/third_party/gofrontend/libgo/go/runtime/debug/garbage_test.go b/third_party/gofrontend/libgo/go/runtime/debug/garbage_test.go
deleted file mode 100644
index 13e1845..0000000
--- a/third_party/gofrontend/libgo/go/runtime/debug/garbage_test.go
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package debug
-
-import (
-	"runtime"
-	"testing"
-	"time"
-)
-
-func TestReadGCStats(t *testing.T) {
-	defer SetGCPercent(SetGCPercent(-1))
-
-	var stats GCStats
-	var mstats runtime.MemStats
-	var min, max time.Duration
-
-	// First ReadGCStats will allocate, second should not,
-	// especially if we follow up with an explicit garbage collection.
-	stats.PauseQuantiles = make([]time.Duration, 10)
-	ReadGCStats(&stats)
-	runtime.GC()
-
-	// Assume these will return same data: no GC during ReadGCStats.
-	ReadGCStats(&stats)
-	runtime.ReadMemStats(&mstats)
-
-	if stats.NumGC != int64(mstats.NumGC) {
-		t.Errorf("stats.NumGC = %d, but mstats.NumGC = %d", stats.NumGC, mstats.NumGC)
-	}
-	if stats.PauseTotal != time.Duration(mstats.PauseTotalNs) {
-		t.Errorf("stats.PauseTotal = %d, but mstats.PauseTotalNs = %d", stats.PauseTotal, mstats.PauseTotalNs)
-	}
-	if stats.LastGC.UnixNano() != int64(mstats.LastGC) {
-		t.Errorf("stats.LastGC.UnixNano = %d, but mstats.LastGC = %d", stats.LastGC.UnixNano(), mstats.LastGC)
-	}
-	n := int(mstats.NumGC)
-	if n > len(mstats.PauseNs) {
-		n = len(mstats.PauseNs)
-	}
-	if len(stats.Pause) != n {
-		t.Errorf("len(stats.Pause) = %d, want %d", len(stats.Pause), n)
-	} else {
-		off := (int(mstats.NumGC) + len(mstats.PauseNs) - 1) % len(mstats.PauseNs)
-		for i := 0; i < n; i++ {
-			dt := stats.Pause[i]
-			if dt != time.Duration(mstats.PauseNs[off]) {
-				t.Errorf("stats.Pause[%d] = %d, want %d", i, dt, mstats.PauseNs[off])
-			}
-			if max < dt {
-				max = dt
-			}
-			if min > dt || i == 0 {
-				min = dt
-			}
-			off = (off + len(mstats.PauseNs) - 1) % len(mstats.PauseNs)
-		}
-	}
-
-	q := stats.PauseQuantiles
-	nq := len(q)
-	if q[0] != min || q[nq-1] != max {
-		t.Errorf("stats.PauseQuantiles = [%d, ..., %d], want [%d, ..., %d]", q[0], q[nq-1], min, max)
-	}
-
-	for i := 0; i < nq-1; i++ {
-		if q[i] > q[i+1] {
-			t.Errorf("stats.PauseQuantiles[%d]=%d > stats.PauseQuantiles[%d]=%d", i, q[i], i+1, q[i+1])
-		}
-	}
-}
-
-var big = make([]byte, 1<<20)
-
-func TestFreeOSMemory(t *testing.T) {
-	if runtime.GOARCH == "arm64" || runtime.GOARCH == "ppc64" || runtime.GOARCH == "ppc64le" ||
-		runtime.GOOS == "nacl" {
-		t.Skip("issue 9993; scavenger temporarily disabled on systems with physical pages larger than logical pages")
-	}
-	var ms1, ms2 runtime.MemStats
-
-	if big == nil {
-		t.Skip("test is not reliable when run multiple times")
-	}
-	big = nil
-	runtime.GC()
-	runtime.ReadMemStats(&ms1)
-	FreeOSMemory()
-	runtime.ReadMemStats(&ms2)
-	if ms1.HeapReleased >= ms2.HeapReleased {
-		t.Errorf("released before=%d; released after=%d; did not go up", ms1.HeapReleased, ms2.HeapReleased)
-	}
-}
-
-func TestSetGCPercent(t *testing.T) {
-	// Test that the variable is being set and returned correctly.
-	// Assume the percentage itself is implemented fine during GC,
-	// which is harder to test.
-	old := SetGCPercent(123)
-	new := SetGCPercent(old)
-	if new != 123 {
-		t.Errorf("SetGCPercent(123); SetGCPercent(x) = %d, want 123", new)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/debug/heapdump_test.go b/third_party/gofrontend/libgo/go/runtime/debug/heapdump_test.go
deleted file mode 100644
index cb2f2f0..0000000
--- a/third_party/gofrontend/libgo/go/runtime/debug/heapdump_test.go
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package debug
-
-import (
-	"io/ioutil"
-	"os"
-	"runtime"
-	"testing"
-)
-
-func TestWriteHeapDumpNonempty(t *testing.T) {
-	if runtime.GOOS == "nacl" {
-		t.Skip("WriteHeapDump is not available on NaCl.")
-	}
-	f, err := ioutil.TempFile("", "heapdumptest")
-	if err != nil {
-		t.Fatalf("TempFile failed: %v", err)
-	}
-	defer os.Remove(f.Name())
-	defer f.Close()
-	WriteHeapDump(f.Fd())
-	fi, err := f.Stat()
-	if err != nil {
-		t.Fatalf("Stat failed: %v", err)
-	}
-	const minSize = 1
-	if size := fi.Size(); size < minSize {
-		t.Fatalf("Heap dump size %d bytes, expected at least %d bytes", size, minSize)
-	}
-}
-
-type Obj struct {
-	x, y int
-}
-
-func objfin(x *Obj) {
-	println("finalized", x)
-}
-
-func TestWriteHeapDumpFinalizers(t *testing.T) {
-	if runtime.GOOS == "nacl" {
-		t.Skip("WriteHeapDump is not available on NaCl.")
-	}
-	f, err := ioutil.TempFile("", "heapdumptest")
-	if err != nil {
-		t.Fatalf("TempFile failed: %v", err)
-	}
-	defer os.Remove(f.Name())
-	defer f.Close()
-
-	// bug 9172: WriteHeapDump couldn't handle more than one finalizer
-	println("allocating objects")
-	x := &Obj{}
-	runtime.SetFinalizer(x, objfin)
-	y := &Obj{}
-	runtime.SetFinalizer(y, objfin)
-
-	// Trigger collection of x and y, queueing of their finalizers.
-	println("starting gc")
-	runtime.GC()
-
-	// Make sure WriteHeapDump doesn't fail with multiple queued finalizers.
-	println("starting dump")
-	WriteHeapDump(f.Fd())
-	println("done dump")
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/debug/stack.go b/third_party/gofrontend/libgo/go/runtime/debug/stack.go
deleted file mode 100644
index ab12bff..0000000
--- a/third_party/gofrontend/libgo/go/runtime/debug/stack.go
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package debug contains facilities for programs to debug themselves while
-// they are running.
-package debug
-
-import (
-	"bytes"
-	"fmt"
-	"io/ioutil"
-	"os"
-	"runtime"
-)
-
-var (
-	dunno     = []byte("???")
-	centerDot = []byte("·")
-	dot       = []byte(".")
-	slash     = []byte("/")
-)
-
-// PrintStack prints to standard error the stack trace returned by Stack.
-func PrintStack() {
-	os.Stderr.Write(stack())
-}
-
-// Stack returns a formatted stack trace of the goroutine that calls it.
-// For each routine, it includes the source line information and PC value,
-// then attempts to discover, for Go functions, the calling function or
-// method and the text of the line containing the invocation.
-//
-// Deprecated: Use package runtime's Stack instead.
-func Stack() []byte {
-	return stack()
-}
-
-// stack implements Stack, skipping 2 frames
-func stack() []byte {
-	buf := new(bytes.Buffer) // the returned data
-	// As we loop, we open files and read them. These variables record the currently
-	// loaded file.
-	var lines [][]byte
-	var lastFile string
-	for i := 2; ; i++ { // Caller we care about is the user, 2 frames up
-		pc, file, line, ok := runtime.Caller(i)
-		if !ok {
-			break
-		}
-		// Print this much at least.  If we can't find the source, it won't show.
-		fmt.Fprintf(buf, "%s:%d (0x%x)\n", file, line, pc)
-		if file != lastFile {
-			data, err := ioutil.ReadFile(file)
-			if err != nil {
-				continue
-			}
-			lines = bytes.Split(data, []byte{'\n'})
-			lastFile = file
-		}
-		line-- // in stack trace, lines are 1-indexed but our array is 0-indexed
-		fmt.Fprintf(buf, "\t%s: %s\n", function(pc), source(lines, line))
-	}
-	return buf.Bytes()
-}
-
-// source returns a space-trimmed slice of the n'th line.
-func source(lines [][]byte, n int) []byte {
-	if n < 0 || n >= len(lines) {
-		return dunno
-	}
-	return bytes.Trim(lines[n], " \t")
-}
-
-// function returns, if possible, the name of the function containing the PC.
-func function(pc uintptr) []byte {
-	fn := runtime.FuncForPC(pc)
-	if fn == nil {
-		return dunno
-	}
-	name := []byte(fn.Name())
-	// The name includes the path name to the package, which is unnecessary
-	// since the file name is already included.  Plus, it has center dots.
-	// That is, we see
-	//	runtime/debug.*T·ptrmethod
-	// and want
-	//	*T.ptrmethod
-	// Since the package path might contains dots (e.g. code.google.com/...),
-	// we first remove the path prefix if there is one.
-	if lastslash := bytes.LastIndex(name, slash); lastslash >= 0 {
-		name = name[lastslash+1:]
-	}
-	if period := bytes.Index(name, dot); period >= 0 {
-		name = name[period+1:]
-	}
-	name = bytes.Replace(name, centerDot, dot, -1)
-	return name
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/debug/stack_test.go b/third_party/gofrontend/libgo/go/runtime/debug/stack_test.go
deleted file mode 100644
index 263d715..0000000
--- a/third_party/gofrontend/libgo/go/runtime/debug/stack_test.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package debug
-
-import (
-	"strings"
-	"testing"
-)
-
-type T int
-
-func (t *T) ptrmethod() []byte {
-	return Stack()
-}
-func (t T) method() []byte {
-	return t.ptrmethod()
-}
-
-/*
-	The traceback should look something like this, modulo line numbers and hex constants.
-	Don't worry much about the base levels, but check the ones in our own package.
-
-		/Users/r/go/src/pkg/runtime/debug/stack_test.go:15 (0x13878)
-			(*T).ptrmethod: return Stack()
-		/Users/r/go/src/pkg/runtime/debug/stack_test.go:18 (0x138dd)
-			T.method: return t.ptrmethod()
-		/Users/r/go/src/pkg/runtime/debug/stack_test.go:23 (0x13920)
-			TestStack: b := T(0).method()
-		/Users/r/go/src/pkg/testing/testing.go:132 (0x14a7a)
-			tRunner: test.F(t)
-		/Users/r/go/src/pkg/runtime/proc.c:145 (0xc970)
-			???: runtime·unlock(&runtime·sched);
-*/
-func TestStack(t *testing.T) {
-	b := T(0).method()
-	lines := strings.Split(string(b), "\n")
-	if len(lines) < 6 {
-		t.Fatal("too few lines")
-	}
-	n := 0
-	frame := func(line, code string) {
-		check(t, lines[n], line)
-		n++
-		// The source might not be available while running the test.
-		if strings.HasPrefix(lines[n], "\t") {
-			check(t, lines[n], code)
-			n++
-		}
-	}
-	frame("stack_test.go", "\tmethod.N15_runtime_debug.T: return Stack()")
-	frame("stack_test.go", "\tmethod.N15_runtime_debug.T: return t.ptrmethod()")
-	frame("stack_test.go", "\tTestStack: b := T(0).method()")
-	frame("testing/testing.go", "")
-}
-
-func check(t *testing.T, line, has string) {
-	if strings.Index(line, has) < 0 {
-		t.Errorf("expected %q in %q", has, line)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/env_test.go b/third_party/gofrontend/libgo/go/runtime/env_test.go
deleted file mode 100644
index 2399e46..0000000
--- a/third_party/gofrontend/libgo/go/runtime/env_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"runtime"
-	"syscall"
-	"testing"
-)
-
-func TestFixedGOROOT(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skipf("skipping plan9, it is inconsistent by allowing GOROOT to be updated by Setenv")
-	}
-
-	// Restore both the real GOROOT environment variable, and runtime's copies:
-	if orig, ok := syscall.Getenv("GOROOT"); ok {
-		defer syscall.Setenv("GOROOT", orig)
-	} else {
-		defer syscall.Unsetenv("GOROOT")
-	}
-	envs := runtime.Envs()
-	oldenvs := append([]string{}, envs...)
-	defer runtime.SetEnvs(oldenvs)
-
-	// attempt to reuse existing envs backing array.
-	want := runtime.GOROOT()
-	runtime.SetEnvs(append(envs[:0], "GOROOT="+want))
-
-	if got := runtime.GOROOT(); got != want {
-		t.Errorf(`initial runtime.GOROOT()=%q, want %q`, got, want)
-	}
-	if err := syscall.Setenv("GOROOT", "/os"); err != nil {
-		t.Fatal(err)
-	}
-	if got := runtime.GOROOT(); got != want {
-		t.Errorf(`after setenv runtime.GOROOT()=%q, want %q`, got, want)
-	}
-	if err := syscall.Unsetenv("GOROOT"); err != nil {
-		t.Fatal(err)
-	}
-	if got := runtime.GOROOT(); got != want {
-		t.Errorf(`after unsetenv runtime.GOROOT()=%q, want %q`, got, want)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/error.go b/third_party/gofrontend/libgo/go/runtime/error.go
deleted file mode 100644
index c4621b6..0000000
--- a/third_party/gofrontend/libgo/go/runtime/error.go
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime
-
-// The Error interface identifies a run time error.
-type Error interface {
-	error
-
-	// RuntimeError is a no-op function but
-	// serves to distinguish types that are run time
-	// errors from ordinary errors: a type is a
-	// run time error if it has a RuntimeError method.
-	RuntimeError()
-}
-
-// A TypeAssertionError explains a failed type assertion.
-type TypeAssertionError struct {
-	interfaceString string
-	concreteString  string
-	assertedString  string
-	missingMethod   string // one method needed by Interface, missing from Concrete
-}
-
-func (*TypeAssertionError) RuntimeError() {}
-
-func (e *TypeAssertionError) Error() string {
-	inter := e.interfaceString
-	if inter == "" {
-		inter = "interface"
-	}
-	if e.concreteString == "" {
-		return "interface conversion: " + inter + " is nil, not " + e.assertedString
-	}
-	if e.missingMethod == "" {
-		return "interface conversion: " + inter + " is " + e.concreteString +
-			", not " + e.assertedString
-	}
-	return "interface conversion: " + e.concreteString + " is not " + e.assertedString +
-		": missing method " + e.missingMethod
-}
-
-// For calling from C.
-func NewTypeAssertionError(ps1, ps2, ps3 *string, pmeth *string, ret *interface{}) {
-	var s1, s2, s3, meth string
-
-	if ps1 != nil {
-		s1 = *ps1
-	}
-	if ps2 != nil {
-		s2 = *ps2
-	}
-	if ps3 != nil {
-		s3 = *ps3
-	}
-	if pmeth != nil {
-		meth = *pmeth
-	}
-
-	// For gccgo, strip out quoted strings.
-	s1 = unquote(s1)
-	s2 = unquote(s2)
-	s3 = unquote(s3)
-
-	*ret = &TypeAssertionError{s1, s2, s3, meth}
-}
-
-// Remove quoted strings from gccgo reflection strings.
-func unquote(s string) string {
-	ls := len(s)
-	var i int
-	for i = 0; i < ls; i++ {
-		if s[i] == '\t' {
-			break
-		}
-	}
-	if i == ls {
-		return s
-	}
-	var q bool
-	r := make([]byte, len(s))
-	j := 0
-	for i = 0; i < ls; i++ {
-		if s[i] == '\t' {
-			q = !q
-		} else if !q {
-			r[j] = s[i]
-			j++
-		}
-	}
-	return string(r[:j])
-}
-
-// An errorString represents a runtime error described by a single string.
-type errorString string
-
-func (e errorString) RuntimeError() {}
-
-func (e errorString) Error() string {
-	return "runtime error: " + string(e)
-}
-
-// For calling from C.
-func NewErrorString(s string, ret *interface{}) {
-	*ret = errorString(s)
-}
-
-// An errorCString represents a runtime error described by a single C string.
-// Not "type errorCString uintptr" because of http://golang.org/issue/7084.
-type errorCString struct{ cstr uintptr }
-
-func (e errorCString) RuntimeError() {}
-
-func cstringToGo(uintptr) string
-
-func (e errorCString) Error() string {
-	return "runtime error: " + cstringToGo(e.cstr)
-}
-
-// For calling from C.
-func NewErrorCString(s uintptr, ret *interface{}) {
-	*ret = errorCString{s}
-}
-
-type stringer interface {
-	String() string
-}
-
-func typestring(interface{}) string
-
-// For calling from C.
-// Prints an argument passed to panic.
-// There's room for arbitrary complexity here, but we keep it
-// simple and handle just a few important cases: int, string, and Stringer.
-func Printany(i interface{}) {
-	switch v := i.(type) {
-	case nil:
-		print("nil")
-	case stringer:
-		print(v.String())
-	case error:
-		print(v.Error())
-	case int:
-		print(v)
-	case string:
-		print(v)
-	default:
-		print("(", typestring(i), ") ", i)
-	}
-}
-
-// called from generated code
-func panicwrap(pkg, typ, meth string) {
-	panic("value method " + pkg + "." + typ + "." + meth + " called using nil *" + typ + " pointer")
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/export_arm_test.go b/third_party/gofrontend/libgo/go/runtime/export_arm_test.go
deleted file mode 100644
index 446d264..0000000
--- a/third_party/gofrontend/libgo/go/runtime/export_arm_test.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Export guts for testing.
-
-package runtime
-
-var Usplit = usplit
diff --git a/third_party/gofrontend/libgo/go/runtime/export_linux_test.go b/third_party/gofrontend/libgo/go/runtime/export_linux_test.go
deleted file mode 100644
index 37cf164..0000000
--- a/third_party/gofrontend/libgo/go/runtime/export_linux_test.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Export guts for testing.
-
-package runtime
-
-//var NewOSProc0 = newosproc0
diff --git a/third_party/gofrontend/libgo/go/runtime/export_test.go b/third_party/gofrontend/libgo/go/runtime/export_test.go
deleted file mode 100644
index 8782914..0000000
--- a/third_party/gofrontend/libgo/go/runtime/export_test.go
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Export guts for testing.
-
-package runtime
-
-import "unsafe"
-
-//var Fadd64 = fadd64
-//var Fsub64 = fsub64
-//var Fmul64 = fmul64
-//var Fdiv64 = fdiv64
-//var F64to32 = f64to32
-//var F32to64 = f32to64
-//var Fcmp64 = fcmp64
-//var Fintto64 = fintto64
-//var F64toint = f64toint
-//var Sqrt = sqrt
-
-func entersyscall(int32)
-func exitsyscall(int32)
-func golockedOSThread() bool
-
-var Entersyscall = entersyscall
-var Exitsyscall = exitsyscall
-var LockedOSThread = golockedOSThread
-
-// var Xadduintptr = xadduintptr
-
-// var FuncPC = funcPC
-
-type LFNode struct {
-	Next    uint64
-	Pushcnt uintptr
-}
-
-func lfstackpush_go(head *uint64, node *LFNode)
-func lfstackpop_go(head *uint64) *LFNode
-
-var LFStackPush = lfstackpush_go
-var LFStackPop = lfstackpop_go
-
-type ParFor struct {
-	body   func(*ParFor, uint32)
-	done   uint32
-	Nthr   uint32
-	thrseq uint32
-	Cnt    uint32
-	wait   bool
-}
-
-func newParFor(nthrmax uint32) *ParFor
-func parForSetup(desc *ParFor, nthr, n uint32, wait bool, body func(*ParFor, uint32))
-func parForDo(desc *ParFor)
-func parForIters(desc *ParFor, tid uintptr) (uintptr, uintptr)
-
-var NewParFor = newParFor
-var ParForSetup = parForSetup
-var ParForDo = parForDo
-
-func ParForIters(desc *ParFor, tid uint32) (uint32, uint32) {
-	begin, end := parForIters(desc, uintptr(tid))
-	return uint32(begin), uint32(end)
-}
-
-func GCMask(x interface{}) (ret []byte) {
-	return nil
-}
-
-//func testSchedLocalQueue()
-//func testSchedLocalQueueSteal()
-//
-//func RunSchedLocalQueueTest() {
-//	testSchedLocalQueue()
-//}
-//
-//func RunSchedLocalQueueStealTest() {
-//	testSchedLocalQueueSteal()
-//}
-
-//var StringHash = stringHash
-//var BytesHash = bytesHash
-//var Int32Hash = int32Hash
-//var Int64Hash = int64Hash
-//var EfaceHash = efaceHash
-//var IfaceHash = ifaceHash
-//var MemclrBytes = memclrBytes
-
-// var HashLoad = &hashLoad
-
-// entry point for testing
-//func GostringW(w []uint16) (s string) {
-//	s = gostringw(&w[0])
-//	return
-//}
-
-//var Gostringnocopy = gostringnocopy
-//var Maxstring = &maxstring
-
-//type Uintreg uintreg
-
-//extern __go_open
-func open(path *byte, mode int32, perm int32) int32
-
-func Open(path *byte, mode int32, perm int32) int32 {
-	return open(path, mode, perm)
-}
-
-//extern close
-func close(int32) int32
-
-func Close(fd int32) int32 {
-	return close(fd)
-}
-
-//extern read
-func read(fd int32, buf unsafe.Pointer, size int32) int32
-
-func Read(fd int32, buf unsafe.Pointer, size int32) int32 {
-	return read(fd, buf, size)
-}
-
-//extern write
-func write(fd int32, buf unsafe.Pointer, size int32) int32
-
-func Write(fd uintptr, buf unsafe.Pointer, size int32) int32 {
-	return write(int32(fd), buf, size)
-}
-
-func envs() []string
-func setenvs([]string)
-
-var Envs = envs
-var SetEnvs = setenvs
-
-//var BigEndian = _BigEndian
-
-// For benchmarking.
-
-/*
-func BenchSetType(n int, x interface{}) {
-	e := *(*eface)(unsafe.Pointer(&x))
-	t := e._type
-	var size uintptr
-	var p unsafe.Pointer
-	switch t.kind & kindMask {
-	case _KindPtr:
-		t = (*ptrtype)(unsafe.Pointer(t)).elem
-		size = t.size
-		p = e.data
-	case _KindSlice:
-		slice := *(*struct {
-			ptr      unsafe.Pointer
-			len, cap uintptr
-		})(e.data)
-		t = (*slicetype)(unsafe.Pointer(t)).elem
-		size = t.size * slice.len
-		p = slice.ptr
-	}
-	allocSize := roundupsize(size)
-	systemstack(func() {
-		for i := 0; i < n; i++ {
-			heapBitsSetType(uintptr(p), allocSize, size, t)
-		}
-	})
-}
-
-const PtrSize = ptrSize
-
-var TestingAssertE2I2GC = &testingAssertE2I2GC
-var TestingAssertE2T2GC = &testingAssertE2T2GC
-*/
diff --git a/third_party/gofrontend/libgo/go/runtime/export_windows_test.go b/third_party/gofrontend/libgo/go/runtime/export_windows_test.go
deleted file mode 100644
index 61fcef9..0000000
--- a/third_party/gofrontend/libgo/go/runtime/export_windows_test.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Export guts for testing.
-
-package runtime
-
-var TestingWER = &testingWER
diff --git a/third_party/gofrontend/libgo/go/runtime/extern.go b/third_party/gofrontend/libgo/go/runtime/extern.go
deleted file mode 100644
index 6301d01..0000000
--- a/third_party/gofrontend/libgo/go/runtime/extern.go
+++ /dev/null
@@ -1,258 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package runtime contains operations that interact with Go's runtime system,
-such as functions to control goroutines. It also includes the low-level type information
-used by the reflect package; see reflect's documentation for the programmable
-interface to the run-time type system.
-
-Environment Variables
-
-The following environment variables ($name or %name%, depending on the host
-operating system) control the run-time behavior of Go programs. The meanings
-and use may change from release to release.
-
-The GOGC variable sets the initial garbage collection target percentage.
-A collection is triggered when the ratio of freshly allocated data to live data
-remaining after the previous collection reaches this percentage. The default
-is GOGC=100. Setting GOGC=off disables the garbage collector entirely.
-The runtime/debug package's SetGCPercent function allows changing this
-percentage at run time. See https://golang.org/pkg/runtime/debug/#SetGCPercent.
-
-The GODEBUG variable controls debugging variables within the runtime.
-It is a comma-separated list of name=val pairs setting these named variables:
-
-	allocfreetrace: setting allocfreetrace=1 causes every allocation to be
-	profiled and a stack trace printed on each object's allocation and free.
-
-	efence: setting efence=1 causes the allocator to run in a mode
-	where each object is allocated on a unique page and addresses are
-	never recycled.
-
-	gccheckmark: setting gccheckmark=1 enables verification of the
-	garbage collector's concurrent mark phase by performing a
-	second mark pass while the world is stopped.  If the second
-	pass finds a reachable object that was not found by concurrent
-	mark, the garbage collector will panic.
-
-	gcpacertrace: setting gcpacertrace=1 causes the garbage collector to
-	print information about the internal state of the concurrent pacer.
-
-	gcshrinkstackoff: setting gcshrinkstackoff=1 disables moving goroutines
-	onto smaller stacks. In this mode, a goroutine's stack can only grow.
-
-	gcstackbarrieroff: setting gcstackbarrieroff=1 disables the use of stack barriers
-	that allow the garbage collector to avoid repeating a stack scan during the
-	mark termination phase.
-
-	gcstackbarrierall: setting gcstackbarrierall=1 installs stack barriers
-	in every stack frame, rather than in exponentially-spaced frames.
-
-	gcstoptheworld: setting gcstoptheworld=1 disables concurrent garbage collection,
-	making every garbage collection a stop-the-world event. Setting gcstoptheworld=2
-	also disables concurrent sweeping after the garbage collection finishes.
-
-	gctrace: setting gctrace=1 causes the garbage collector to emit a single line to standard
-	error at each collection, summarizing the amount of memory collected and the
-	length of the pause. Setting gctrace=2 emits the same summary but also
-	repeats each collection. The format of this line is subject to change.
-	Currently, it is:
-		gc # @#s #%: #+...+# ms clock, #+...+# ms cpu, #->#-># MB, # MB goal, # P
-	where the fields are as follows:
-		gc #        the GC number, incremented at each GC
-		@#s         time in seconds since program start
-		#%          percentage of time spent in GC since program start
-		#+...+#     wall-clock/CPU times for the phases of the GC
-		#->#-># MB  heap size at GC start, at GC end, and live heap
-		# MB goal   goal heap size
-		# P         number of processors used
-	The phases are stop-the-world (STW) sweep termination, scan,
-	synchronize Ps, mark, and STW mark termination. The CPU times
-	for mark are broken down in to assist time (GC performed in
-	line with allocation), background GC time, and idle GC time.
-	If the line ends with "(forced)", this GC was forced by a
-	runtime.GC() call and all phases are STW.
-
-	memprofilerate: setting memprofilerate=X will update the value of runtime.MemProfileRate.
-	When set to 0 memory profiling is disabled.  Refer to the description of
-	MemProfileRate for the default value.
-
-	memprofilerate:  setting memprofilerate=X changes the setting for
-	runtime.MemProfileRate.  Refer to the description of this variable for how
-	it is used and its default value.
-
-	sbrk: setting sbrk=1 replaces the memory allocator and garbage collector
-	with a trivial allocator that obtains memory from the operating system and
-	never reclaims any memory.
-
-	scavenge: scavenge=1 enables debugging mode of heap scavenger.
-
-	scheddetail: setting schedtrace=X and scheddetail=1 causes the scheduler to emit
-	detailed multiline info every X milliseconds, describing state of the scheduler,
-	processors, threads and goroutines.
-
-	schedtrace: setting schedtrace=X causes the scheduler to emit a single line to standard
-	error every X milliseconds, summarizing the scheduler state.
-
-The GOMAXPROCS variable limits the number of operating system threads that
-can execute user-level Go code simultaneously. There is no limit to the number of threads
-that can be blocked in system calls on behalf of Go code; those do not count against
-the GOMAXPROCS limit. This package's GOMAXPROCS function queries and changes
-the limit.
-
-The GOTRACEBACK variable controls the amount of output generated when a Go
-program fails due to an unrecovered panic or an unexpected runtime condition.
-By default, a failure prints a stack trace for every extant goroutine, eliding functions
-internal to the run-time system, and then exits with exit code 2.
-If GOTRACEBACK=0, the per-goroutine stack traces are omitted entirely.
-If GOTRACEBACK=1, the default behavior is used.
-If GOTRACEBACK=2, the per-goroutine stack traces include run-time functions.
-If GOTRACEBACK=crash, the per-goroutine stack traces include run-time functions,
-and if possible the program crashes in an operating-specific manner instead of
-exiting. For example, on Unix systems, the program raises SIGABRT to trigger a
-core dump.
-
-The GOARCH, GOOS, GOPATH, and GOROOT environment variables complete
-the set of Go environment variables. They influence the building of Go programs
-(see https://golang.org/cmd/go and https://golang.org/pkg/go/build).
-GOARCH, GOOS, and GOROOT are recorded at compile time and made available by
-constants or functions in this package, but they do not influence the execution
-of the run-time system.
-*/
-package runtime
-
-// Gosched yields the processor, allowing other goroutines to run.  It does not
-// suspend the current goroutine, so execution resumes automatically.
-func Gosched()
-
-// Goexit terminates the goroutine that calls it.  No other goroutine is affected.
-// Goexit runs all deferred calls before terminating the goroutine.
-//
-// Calling Goexit from the main goroutine terminates that goroutine
-// without func main returning. Since func main has not returned,
-// the program continues execution of other goroutines.
-// If all other goroutines exit, the program crashes.
-func Goexit()
-
-// Caller reports file and line number information about function invocations on
-// the calling goroutine's stack.  The argument skip is the number of stack frames
-// to ascend, with 0 identifying the caller of Caller.  (For historical reasons the
-// meaning of skip differs between Caller and Callers.) The return values report the
-// program counter, file name, and line number within the file of the corresponding
-// call.  The boolean ok is false if it was not possible to recover the information.
-func Caller(skip int) (pc uintptr, file string, line int, ok bool)
-
-// Callers fills the slice pc with the program counters of function invocations
-// on the calling goroutine's stack.  The argument skip is the number of stack frames
-// to skip before recording in pc, with 0 identifying the frame for Callers itself and
-// 1 identifying the caller of Callers.
-// It returns the number of entries written to pc.
-func Callers(skip int, pc []uintptr) int
-
-type Func struct {
-	opaque struct{} // unexported field to disallow conversions
-}
-
-// FuncForPC returns a *Func describing the function that contains the
-// given program counter address, or else nil.
-func FuncForPC(pc uintptr) *Func
-
-// Name returns the name of the function.
-func (f *Func) Name() string {
-	return funcname_go(f)
-}
-
-// Entry returns the entry address of the function.
-func (f *Func) Entry() uintptr {
-	return funcentry_go(f)
-}
-
-// FileLine returns the file name and line number of the
-// source code corresponding to the program counter pc.
-// The result will not be accurate if pc is not a program
-// counter within f.
-func (f *Func) FileLine(pc uintptr) (file string, line int) {
-	return funcline_go(f, pc)
-}
-
-// implemented in symtab.c
-func funcline_go(*Func, uintptr) (string, int)
-func funcname_go(*Func) string
-func funcentry_go(*Func) uintptr
-
-// SetFinalizer sets the finalizer associated with x to f.
-// When the garbage collector finds an unreachable block
-// with an associated finalizer, it clears the association and runs
-// f(x) in a separate goroutine.  This makes x reachable again, but
-// now without an associated finalizer.  Assuming that SetFinalizer
-// is not called again, the next time the garbage collector sees
-// that x is unreachable, it will free x.
-//
-// SetFinalizer(x, nil) clears any finalizer associated with x.
-//
-// The argument x must be a pointer to an object allocated by
-// calling new or by taking the address of a composite literal.
-// The argument f must be a function that takes a single argument
-// to which x's type can be assigned, and can have arbitrary ignored return
-// values. If either of these is not true, SetFinalizer aborts the
-// program.
-//
-// Finalizers are run in dependency order: if A points at B, both have
-// finalizers, and they are otherwise unreachable, only the finalizer
-// for A runs; once A is freed, the finalizer for B can run.
-// If a cyclic structure includes a block with a finalizer, that
-// cycle is not guaranteed to be garbage collected and the finalizer
-// is not guaranteed to run, because there is no ordering that
-// respects the dependencies.
-//
-// The finalizer for x is scheduled to run at some arbitrary time after
-// x becomes unreachable.
-// There is no guarantee that finalizers will run before a program exits,
-// so typically they are useful only for releasing non-memory resources
-// associated with an object during a long-running program.
-// For example, an os.File object could use a finalizer to close the
-// associated operating system file descriptor when a program discards
-// an os.File without calling Close, but it would be a mistake
-// to depend on a finalizer to flush an in-memory I/O buffer such as a
-// bufio.Writer, because the buffer would not be flushed at program exit.
-//
-// It is not guaranteed that a finalizer will run if the size of *x is
-// zero bytes.
-//
-// A single goroutine runs all finalizers for a program, sequentially.
-// If a finalizer must run for a long time, it should do so by starting
-// a new goroutine.
-func SetFinalizer(x, f interface{})
-
-func getgoroot() string
-
-// GOROOT returns the root of the Go tree.
-// It uses the GOROOT environment variable, if set,
-// or else the root used during the Go build.
-func GOROOT() string {
-	s := getgoroot()
-	if s != "" {
-		return s
-	}
-	return defaultGoroot
-}
-
-// Version returns the Go tree's version string.
-// It is either the commit hash and date at the time of the build or,
-// when possible, a release tag like "go1.3".
-func Version() string {
-	return theVersion
-}
-
-// GOOS is the running program's operating system target:
-// one of darwin, freebsd, linux, and so on.
-const GOOS string = theGoos
-
-// GOARCH is the running program's architecture target:
-// 386, amd64, arm, arm64, ppc64, ppc64le.
-const GOARCH string = theGoarch
-
-// GCCGOTOOLDIR is the Tool Dir for the gccgo build
-const GCCGOTOOLDIR string = theGccgoToolDir
diff --git a/third_party/gofrontend/libgo/go/runtime/gc_test.go b/third_party/gofrontend/libgo/go/runtime/gc_test.go
deleted file mode 100644
index 2a95cc7..0000000
--- a/third_party/gofrontend/libgo/go/runtime/gc_test.go
+++ /dev/null
@@ -1,491 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"os"
-	"reflect"
-	"runtime"
-	"runtime/debug"
-	"testing"
-	"time"
-	"unsafe"
-)
-
-func TestGcSys(t *testing.T) {
-	if os.Getenv("GOGC") == "off" {
-		t.Skip("skipping test; GOGC=off in environment")
-	}
-	data := struct{ Short bool }{testing.Short()}
-	got := executeTest(t, testGCSysSource, &data)
-	want := "OK\n"
-	if got != want {
-		t.Fatalf("expected %q, but got %q", want, got)
-	}
-}
-
-const testGCSysSource = `
-package main
-
-import (
-	"fmt"
-	"runtime"
-)
-
-func main() {
-	runtime.GOMAXPROCS(1)
-	memstats := new(runtime.MemStats)
-	runtime.GC()
-	runtime.ReadMemStats(memstats)
-	sys := memstats.Sys
-
-	runtime.MemProfileRate = 0 // disable profiler
-
-	itercount := 1000000
-{{if .Short}}
-	itercount = 100000
-{{end}}
-	for i := 0; i < itercount; i++ {
-		workthegc()
-	}
-
-	// Should only be using a few MB.
-	// We allocated 100 MB or (if not short) 1 GB.
-	runtime.ReadMemStats(memstats)
-	if sys > memstats.Sys {
-		sys = 0
-	} else {
-		sys = memstats.Sys - sys
-	}
-	if sys > 16<<20 {
-		fmt.Printf("using too much memory: %d bytes\n", sys)
-		return
-	}
-	fmt.Printf("OK\n")
-}
-
-func workthegc() []byte {
-	return make([]byte, 1029)
-}
-`
-
-func TestGcDeepNesting(t *testing.T) {
-	type T [2][2][2][2][2][2][2][2][2][2]*int
-	a := new(T)
-
-	// Prevent the compiler from applying escape analysis.
-	// This makes sure new(T) is allocated on heap, not on the stack.
-	t.Logf("%p", a)
-
-	a[0][0][0][0][0][0][0][0][0][0] = new(int)
-	*a[0][0][0][0][0][0][0][0][0][0] = 13
-	runtime.GC()
-	if *a[0][0][0][0][0][0][0][0][0][0] != 13 {
-		t.Fail()
-	}
-}
-
-func TestGcHashmapIndirection(t *testing.T) {
-	defer debug.SetGCPercent(debug.SetGCPercent(1))
-	runtime.GC()
-	type T struct {
-		a [256]int
-	}
-	m := make(map[T]T)
-	for i := 0; i < 2000; i++ {
-		var a T
-		a.a[0] = i
-		m[a] = T{}
-	}
-}
-
-func TestGcArraySlice(t *testing.T) {
-	type X struct {
-		buf     [1]byte
-		nextbuf []byte
-		next    *X
-	}
-	var head *X
-	for i := 0; i < 10; i++ {
-		p := &X{}
-		p.buf[0] = 42
-		p.next = head
-		if head != nil {
-			p.nextbuf = head.buf[:]
-		}
-		head = p
-		runtime.GC()
-	}
-	for p := head; p != nil; p = p.next {
-		if p.buf[0] != 42 {
-			t.Fatal("corrupted heap")
-		}
-	}
-}
-
-func TestGcRescan(t *testing.T) {
-	type X struct {
-		c     chan error
-		nextx *X
-	}
-	type Y struct {
-		X
-		nexty *Y
-		p     *int
-	}
-	var head *Y
-	for i := 0; i < 10; i++ {
-		p := &Y{}
-		p.c = make(chan error)
-		if head != nil {
-			p.nextx = &head.X
-		}
-		p.nexty = head
-		p.p = new(int)
-		*p.p = 42
-		head = p
-		runtime.GC()
-	}
-	for p := head; p != nil; p = p.nexty {
-		if *p.p != 42 {
-			t.Fatal("corrupted heap")
-		}
-	}
-}
-
-func TestGcLastTime(t *testing.T) {
-	ms := new(runtime.MemStats)
-	t0 := time.Now().UnixNano()
-	runtime.GC()
-	t1 := time.Now().UnixNano()
-	runtime.ReadMemStats(ms)
-	last := int64(ms.LastGC)
-	if t0 > last || last > t1 {
-		t.Fatalf("bad last GC time: got %v, want [%v, %v]", last, t0, t1)
-	}
-	pause := ms.PauseNs[(ms.NumGC+255)%256]
-	// Due to timer granularity, pause can actually be 0 on windows
-	// or on virtualized environments.
-	if pause == 0 {
-		t.Logf("last GC pause was 0")
-	} else if pause > 10e9 {
-		t.Logf("bad last GC pause: got %v, want [0, 10e9]", pause)
-	}
-}
-
-var hugeSink interface{}
-
-func TestHugeGCInfo(t *testing.T) {
-	// The test ensures that compiler can chew these huge types even on weakest machines.
-	// The types are not allocated at runtime.
-	if hugeSink != nil {
-		// 400MB on 32 bots, 4TB on 64-bits.
-		const n = (400 << 20) + (unsafe.Sizeof(uintptr(0))-4)<<40
-		hugeSink = new([n]*byte)
-		hugeSink = new([n]uintptr)
-		hugeSink = new(struct {
-			x float64
-			y [n]*byte
-			z []string
-		})
-		hugeSink = new(struct {
-			x float64
-			y [n]uintptr
-			z []string
-		})
-	}
-}
-
-func BenchmarkSetTypePtr(b *testing.B) {
-	benchSetType(b, new(*byte))
-}
-
-func BenchmarkSetTypePtr8(b *testing.B) {
-	benchSetType(b, new([8]*byte))
-}
-
-func BenchmarkSetTypePtr16(b *testing.B) {
-	benchSetType(b, new([16]*byte))
-}
-
-func BenchmarkSetTypePtr32(b *testing.B) {
-	benchSetType(b, new([32]*byte))
-}
-
-func BenchmarkSetTypePtr64(b *testing.B) {
-	benchSetType(b, new([64]*byte))
-}
-
-func BenchmarkSetTypePtr126(b *testing.B) {
-	benchSetType(b, new([126]*byte))
-}
-
-func BenchmarkSetTypePtr128(b *testing.B) {
-	benchSetType(b, new([128]*byte))
-}
-
-func BenchmarkSetTypePtrSlice(b *testing.B) {
-	benchSetType(b, make([]*byte, 1<<10))
-}
-
-type Node1 struct {
-	Value       [1]uintptr
-	Left, Right *byte
-}
-
-func BenchmarkSetTypeNode1(b *testing.B) {
-	benchSetType(b, new(Node1))
-}
-
-func BenchmarkSetTypeNode1Slice(b *testing.B) {
-	benchSetType(b, make([]Node1, 32))
-}
-
-type Node8 struct {
-	Value       [8]uintptr
-	Left, Right *byte
-}
-
-func BenchmarkSetTypeNode8(b *testing.B) {
-	benchSetType(b, new(Node8))
-}
-
-func BenchmarkSetTypeNode8Slice(b *testing.B) {
-	benchSetType(b, make([]Node8, 32))
-}
-
-type Node64 struct {
-	Value       [64]uintptr
-	Left, Right *byte
-}
-
-func BenchmarkSetTypeNode64(b *testing.B) {
-	benchSetType(b, new(Node64))
-}
-
-func BenchmarkSetTypeNode64Slice(b *testing.B) {
-	benchSetType(b, make([]Node64, 32))
-}
-
-type Node64Dead struct {
-	Left, Right *byte
-	Value       [64]uintptr
-}
-
-func BenchmarkSetTypeNode64Dead(b *testing.B) {
-	benchSetType(b, new(Node64Dead))
-}
-
-func BenchmarkSetTypeNode64DeadSlice(b *testing.B) {
-	benchSetType(b, make([]Node64Dead, 32))
-}
-
-type Node124 struct {
-	Value       [124]uintptr
-	Left, Right *byte
-}
-
-func BenchmarkSetTypeNode124(b *testing.B) {
-	benchSetType(b, new(Node124))
-}
-
-func BenchmarkSetTypeNode124Slice(b *testing.B) {
-	benchSetType(b, make([]Node124, 32))
-}
-
-type Node126 struct {
-	Value       [126]uintptr
-	Left, Right *byte
-}
-
-func BenchmarkSetTypeNode126(b *testing.B) {
-	benchSetType(b, new(Node126))
-}
-
-func BenchmarkSetTypeNode126Slice(b *testing.B) {
-	benchSetType(b, make([]Node126, 32))
-}
-
-type Node128 struct {
-	Value       [128]uintptr
-	Left, Right *byte
-}
-
-func BenchmarkSetTypeNode128(b *testing.B) {
-	benchSetType(b, new(Node128))
-}
-
-func BenchmarkSetTypeNode128Slice(b *testing.B) {
-	benchSetType(b, make([]Node128, 32))
-}
-
-type Node130 struct {
-	Value       [130]uintptr
-	Left, Right *byte
-}
-
-func BenchmarkSetTypeNode130(b *testing.B) {
-	benchSetType(b, new(Node130))
-}
-
-func BenchmarkSetTypeNode130Slice(b *testing.B) {
-	benchSetType(b, make([]Node130, 32))
-}
-
-type Node1024 struct {
-	Value       [1024]uintptr
-	Left, Right *byte
-}
-
-func BenchmarkSetTypeNode1024(b *testing.B) {
-	benchSetType(b, new(Node1024))
-}
-
-func BenchmarkSetTypeNode1024Slice(b *testing.B) {
-	benchSetType(b, make([]Node1024, 32))
-}
-
-func benchSetType(b *testing.B, x interface{}) {
-	v := reflect.ValueOf(x)
-	t := v.Type()
-	switch t.Kind() {
-	case reflect.Ptr:
-		b.SetBytes(int64(t.Elem().Size()))
-	case reflect.Slice:
-		b.SetBytes(int64(t.Elem().Size()) * int64(v.Len()))
-	}
-	b.ResetTimer()
-	//runtime.BenchSetType(b.N, x)
-}
-
-func BenchmarkAllocation(b *testing.B) {
-	type T struct {
-		x, y *byte
-	}
-	ngo := runtime.GOMAXPROCS(0)
-	work := make(chan bool, b.N+ngo)
-	result := make(chan *T)
-	for i := 0; i < b.N; i++ {
-		work <- true
-	}
-	for i := 0; i < ngo; i++ {
-		work <- false
-	}
-	for i := 0; i < ngo; i++ {
-		go func() {
-			var x *T
-			for <-work {
-				for i := 0; i < 1000; i++ {
-					x = &T{}
-				}
-			}
-			result <- x
-		}()
-	}
-	for i := 0; i < ngo; i++ {
-		<-result
-	}
-}
-
-func TestPrintGC(t *testing.T) {
-	if testing.Short() {
-		t.Skip("Skipping in short mode")
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
-	done := make(chan bool)
-	go func() {
-		for {
-			select {
-			case <-done:
-				return
-			default:
-				runtime.GC()
-			}
-		}
-	}()
-	for i := 0; i < 1e4; i++ {
-		func() {
-			defer print("")
-		}()
-	}
-	close(done)
-}
-
-/*
-
-// The implicit y, ok := x.(error) for the case error
-// in testTypeSwitch used to not initialize the result y
-// before passing &y to assertE2I2GC.
-// Catch this by making assertE2I2 call runtime.GC,
-// which will force a stack scan and failure if there are
-// bad pointers, and then fill the stack with bad pointers
-// and run the type switch.
-func TestAssertE2I2Liveness(t *testing.T) {
-	// Note that this flag is defined in export_test.go
-	// and is not available to ordinary imports of runtime.
-	*runtime.TestingAssertE2I2GC = true
-	defer func() {
-		*runtime.TestingAssertE2I2GC = false
-	}()
-
-	poisonStack()
-	testTypeSwitch(io.EOF)
-	poisonStack()
-	testAssert(io.EOF)
-	poisonStack()
-	testAssertVar(io.EOF)
-}
-
-func poisonStack() uintptr {
-	var x [1000]uintptr
-	for i := range x {
-		x[i] = 0xff
-	}
-	return x[123]
-}
-
-func testTypeSwitch(x interface{}) error {
-	switch y := x.(type) {
-	case nil:
-		// ok
-	case error:
-		return y
-	}
-	return nil
-}
-
-func testAssert(x interface{}) error {
-	if y, ok := x.(error); ok {
-		return y
-	}
-	return nil
-}
-
-func testAssertVar(x interface{}) error {
-	var y, ok = x.(error)
-	if ok {
-		return y
-	}
-	return nil
-}
-
-func TestAssertE2T2Liveness(t *testing.T) {
-	*runtime.TestingAssertE2T2GC = true
-	defer func() {
-		*runtime.TestingAssertE2T2GC = false
-	}()
-
-	poisonStack()
-	testIfaceEqual(io.EOF)
-}
-
-func testIfaceEqual(x interface{}) {
-	if x == "abc" {
-		// Prevent inlining
-		panic("")
-	}
-}
-
-*/
diff --git a/third_party/gofrontend/libgo/go/runtime/gcinfo_test.go b/third_party/gofrontend/libgo/go/runtime/gcinfo_test.go
deleted file mode 100644
index 7e345e5..0000000
--- a/third_party/gofrontend/libgo/go/runtime/gcinfo_test.go
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package runtime_test
-
-import (
-	"bytes"
-	"runtime"
-	"testing"
-)
-
-const (
-	typeScalar  = 0
-	typePointer = 1
-)
-
-// TestGCInfo tests that various objects in heap, data and bss receive correct GC pointer type info.
-func TestGCInfo(t *testing.T) {
-	t.Skip("skipping on gccgo for now")
-
-	verifyGCInfo(t, "stack Ptr", new(Ptr), infoPtr)
-	verifyGCInfo(t, "stack ScalarPtr", new(ScalarPtr), infoScalarPtr)
-	verifyGCInfo(t, "stack PtrScalar", new(PtrScalar), infoPtrScalar)
-	verifyGCInfo(t, "stack BigStruct", new(BigStruct), infoBigStruct())
-	verifyGCInfo(t, "stack string", new(string), infoString)
-	verifyGCInfo(t, "stack slice", new([]string), infoSlice)
-	verifyGCInfo(t, "stack eface", new(interface{}), infoEface)
-	verifyGCInfo(t, "stack iface", new(Iface), infoIface)
-
-	for i := 0; i < 10; i++ {
-		verifyGCInfo(t, "heap Ptr", escape(new(Ptr)), trimDead(padDead(infoPtr)))
-		verifyGCInfo(t, "heap PtrSlice", escape(&make([]*byte, 10)[0]), trimDead(infoPtr10))
-		verifyGCInfo(t, "heap ScalarPtr", escape(new(ScalarPtr)), trimDead(infoScalarPtr))
-		verifyGCInfo(t, "heap ScalarPtrSlice", escape(&make([]ScalarPtr, 4)[0]), trimDead(infoScalarPtr4))
-		verifyGCInfo(t, "heap PtrScalar", escape(new(PtrScalar)), trimDead(infoPtrScalar))
-		verifyGCInfo(t, "heap BigStruct", escape(new(BigStruct)), trimDead(infoBigStruct()))
-		verifyGCInfo(t, "heap string", escape(new(string)), trimDead(infoString))
-		verifyGCInfo(t, "heap eface", escape(new(interface{})), trimDead(infoEface))
-		verifyGCInfo(t, "heap iface", escape(new(Iface)), trimDead(infoIface))
-	}
-}
-
-func verifyGCInfo(t *testing.T, name string, p interface{}, mask0 []byte) {
-	mask := runtime.GCMask(p)
-	if bytes.Compare(mask, mask0) != 0 {
-		t.Errorf("bad GC program for %v:\nwant %+v\ngot  %+v", name, mask0, mask)
-		return
-	}
-}
-
-func padDead(mask []byte) []byte {
-	// Because the dead bit isn't encoded until the third word,
-	// and because on 32-bit systems a one-word allocation
-	// uses a two-word block, the pointer info for a one-word
-	// object needs to be expanded to include an extra scalar
-	// on 32-bit systems to match the heap bitmap.
-	if runtime.PtrSize == 4 && len(mask) == 1 {
-		return []byte{mask[0], 0}
-	}
-	return mask
-}
-
-func trimDead(mask []byte) []byte {
-	for len(mask) > 2 && mask[len(mask)-1] == typeScalar {
-		mask = mask[:len(mask)-1]
-	}
-	return mask
-}
-
-var gcinfoSink interface{}
-
-func escape(p interface{}) interface{} {
-	gcinfoSink = p
-	return p
-}
-
-var infoPtr = []byte{typePointer}
-
-type Ptr struct {
-	*byte
-}
-
-var infoPtr10 = []byte{typePointer, typePointer, typePointer, typePointer, typePointer, typePointer, typePointer, typePointer, typePointer, typePointer}
-
-type ScalarPtr struct {
-	q int
-	w *int
-	e int
-	r *int
-	t int
-	y *int
-}
-
-var infoScalarPtr = []byte{typeScalar, typePointer, typeScalar, typePointer, typeScalar, typePointer}
-
-var infoScalarPtr4 = append(append(append(append([]byte(nil), infoScalarPtr...), infoScalarPtr...), infoScalarPtr...), infoScalarPtr...)
-
-type PtrScalar struct {
-	q *int
-	w int
-	e *int
-	r int
-	t *int
-	y int
-}
-
-var infoPtrScalar = []byte{typePointer, typeScalar, typePointer, typeScalar, typePointer, typeScalar}
-
-type BigStruct struct {
-	q *int
-	w byte
-	e [17]byte
-	r []byte
-	t int
-	y uint16
-	u uint64
-	i string
-}
-
-func infoBigStruct() []byte {
-	switch runtime.GOARCH {
-	case "386", "arm":
-		return []byte{
-			typePointer,                                                // q *int
-			typeScalar, typeScalar, typeScalar, typeScalar, typeScalar, // w byte; e [17]byte
-			typePointer, typeScalar, typeScalar, // r []byte
-			typeScalar, typeScalar, typeScalar, typeScalar, // t int; y uint16; u uint64
-			typePointer, typeScalar, // i string
-		}
-	case "arm64", "amd64", "ppc64", "ppc64le":
-		return []byte{
-			typePointer,                        // q *int
-			typeScalar, typeScalar, typeScalar, // w byte; e [17]byte
-			typePointer, typeScalar, typeScalar, // r []byte
-			typeScalar, typeScalar, typeScalar, // t int; y uint16; u uint64
-			typePointer, typeScalar, // i string
-		}
-	case "amd64p32":
-		return []byte{
-			typePointer,                                                // q *int
-			typeScalar, typeScalar, typeScalar, typeScalar, typeScalar, // w byte; e [17]byte
-			typePointer, typeScalar, typeScalar, // r []byte
-			typeScalar, typeScalar, typeScalar, typeScalar, typeScalar, // t int; y uint16; u uint64
-			typePointer, typeScalar, // i string
-		}
-	default:
-		panic("unknown arch")
-	}
-}
-
-type Iface interface {
-	f()
-}
-
-type IfaceImpl int
-
-func (IfaceImpl) f() {
-}
-
-var (
-	// BSS
-	bssPtr       Ptr
-	bssScalarPtr ScalarPtr
-	bssPtrScalar PtrScalar
-	bssBigStruct BigStruct
-	bssString    string
-	bssSlice     []string
-	bssEface     interface{}
-	bssIface     Iface
-
-	// DATA
-	dataPtr                   = Ptr{new(byte)}
-	dataScalarPtr             = ScalarPtr{q: 1}
-	dataPtrScalar             = PtrScalar{w: 1}
-	dataBigStruct             = BigStruct{w: 1}
-	dataString                = "foo"
-	dataSlice                 = []string{"foo"}
-	dataEface     interface{} = 42
-	dataIface     Iface       = IfaceImpl(42)
-
-	infoString = []byte{typePointer, typeScalar}
-	infoSlice  = []byte{typePointer, typeScalar, typeScalar}
-	infoEface  = []byte{typePointer, typePointer}
-	infoIface  = []byte{typePointer, typePointer}
-)
diff --git a/third_party/gofrontend/libgo/go/runtime/iface_test.go b/third_party/gofrontend/libgo/go/runtime/iface_test.go
deleted file mode 100644
index 7f27baa..0000000
--- a/third_party/gofrontend/libgo/go/runtime/iface_test.go
+++ /dev/null
@@ -1,263 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"runtime"
-	"testing"
-)
-
-type I1 interface {
-	Method1()
-}
-
-type I2 interface {
-	Method1()
-	Method2()
-}
-
-type TS uint16
-type TM uintptr
-type TL [2]uintptr
-
-func (TS) Method1() {}
-func (TS) Method2() {}
-func (TM) Method1() {}
-func (TM) Method2() {}
-func (TL) Method1() {}
-func (TL) Method2() {}
-
-var (
-	e  interface{}
-	e_ interface{}
-	i1 I1
-	i2 I2
-	ts TS
-	tm TM
-	tl TL
-	ok bool
-)
-
-// Issue 9370
-func TestCmpIfaceConcreteAlloc(t *testing.T) {
-	if runtime.Compiler != "gc" {
-		t.Skip("skipping on non-gc compiler")
-	}
-
-	n := testing.AllocsPerRun(1, func() {
-		_ = e == ts
-		_ = i1 == ts
-		_ = e == 1
-	})
-
-	if n > 0 {
-		t.Fatalf("iface cmp allocs=%v; want 0", n)
-	}
-}
-
-func BenchmarkEqEfaceConcrete(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		_ = e == ts
-	}
-}
-
-func BenchmarkEqIfaceConcrete(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		_ = i1 == ts
-	}
-}
-
-func BenchmarkNeEfaceConcrete(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		_ = e != ts
-	}
-}
-
-func BenchmarkNeIfaceConcrete(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		_ = i1 != ts
-	}
-}
-
-func BenchmarkConvT2ESmall(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		e = ts
-	}
-}
-
-func BenchmarkConvT2EUintptr(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		e = tm
-	}
-}
-
-func BenchmarkConvT2ELarge(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		e = tl
-	}
-}
-
-func BenchmarkConvT2ISmall(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		i1 = ts
-	}
-}
-
-func BenchmarkConvT2IUintptr(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		i1 = tm
-	}
-}
-
-func BenchmarkConvT2ILarge(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		i1 = tl
-	}
-}
-
-func BenchmarkConvI2E(b *testing.B) {
-	i2 = tm
-	for i := 0; i < b.N; i++ {
-		e = i2
-	}
-}
-
-func BenchmarkConvI2I(b *testing.B) {
-	i2 = tm
-	for i := 0; i < b.N; i++ {
-		i1 = i2
-	}
-}
-
-func BenchmarkAssertE2T(b *testing.B) {
-	e = tm
-	for i := 0; i < b.N; i++ {
-		tm = e.(TM)
-	}
-}
-
-func BenchmarkAssertE2TLarge(b *testing.B) {
-	e = tl
-	for i := 0; i < b.N; i++ {
-		tl = e.(TL)
-	}
-}
-
-func BenchmarkAssertE2I(b *testing.B) {
-	e = tm
-	for i := 0; i < b.N; i++ {
-		i1 = e.(I1)
-	}
-}
-
-func BenchmarkAssertI2T(b *testing.B) {
-	i1 = tm
-	for i := 0; i < b.N; i++ {
-		tm = i1.(TM)
-	}
-}
-
-func BenchmarkAssertI2I(b *testing.B) {
-	i1 = tm
-	for i := 0; i < b.N; i++ {
-		i2 = i1.(I2)
-	}
-}
-
-func BenchmarkAssertI2E(b *testing.B) {
-	i1 = tm
-	for i := 0; i < b.N; i++ {
-		e = i1.(interface{})
-	}
-}
-
-func BenchmarkAssertE2E(b *testing.B) {
-	e = tm
-	for i := 0; i < b.N; i++ {
-		e_ = e
-	}
-}
-
-func BenchmarkAssertE2T2(b *testing.B) {
-	e = tm
-	for i := 0; i < b.N; i++ {
-		tm, ok = e.(TM)
-	}
-}
-
-func BenchmarkAssertE2T2Blank(b *testing.B) {
-	e = tm
-	for i := 0; i < b.N; i++ {
-		_, ok = e.(TM)
-	}
-}
-
-func BenchmarkAssertI2E2(b *testing.B) {
-	i1 = tm
-	for i := 0; i < b.N; i++ {
-		e, ok = i1.(interface{})
-	}
-}
-
-func BenchmarkAssertI2E2Blank(b *testing.B) {
-	i1 = tm
-	for i := 0; i < b.N; i++ {
-		_, ok = i1.(interface{})
-	}
-}
-
-func BenchmarkAssertE2E2(b *testing.B) {
-	e = tm
-	for i := 0; i < b.N; i++ {
-		e_, ok = e.(interface{})
-	}
-}
-
-func BenchmarkAssertE2E2Blank(b *testing.B) {
-	e = tm
-	for i := 0; i < b.N; i++ {
-		_, ok = e.(interface{})
-	}
-}
-
-func TestNonEscapingConvT2E(t *testing.T) {
-	m := make(map[interface{}]bool)
-	m[42] = true
-	if !m[42] {
-		t.Fatalf("42 is not present in the map")
-	}
-	if m[0] {
-		t.Fatalf("0 is present in the map")
-	}
-
-	n := testing.AllocsPerRun(1000, func() {
-		if m[0] {
-			t.Fatalf("0 is present in the map")
-		}
-	})
-	if n != 0 {
-		t.Fatalf("want 0 allocs, got %v", n)
-	}
-}
-
-func TestNonEscapingConvT2I(t *testing.T) {
-	m := make(map[I1]bool)
-	m[TM(42)] = true
-	if !m[TM(42)] {
-		t.Fatalf("42 is not present in the map")
-	}
-	if m[TM(0)] {
-		t.Fatalf("0 is present in the map")
-	}
-
-	n := testing.AllocsPerRun(1000, func() {
-		if m[TM(0)] {
-			t.Fatalf("0 is present in the map")
-		}
-	})
-	if n != 0 {
-		t.Fatalf("want 0 allocs, got %v", n)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/lfstack_test.go b/third_party/gofrontend/libgo/go/runtime/lfstack_test.go
deleted file mode 100644
index fb4b459..0000000
--- a/third_party/gofrontend/libgo/go/runtime/lfstack_test.go
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"math/rand"
-	. "runtime"
-	"testing"
-	"unsafe"
-)
-
-type MyNode struct {
-	LFNode
-	data int
-}
-
-func fromMyNode(node *MyNode) *LFNode {
-	return (*LFNode)(unsafe.Pointer(node))
-}
-
-func toMyNode(node *LFNode) *MyNode {
-	return (*MyNode)(unsafe.Pointer(node))
-}
-
-var global interface{}
-
-func TestLFStack(t *testing.T) {
-	stack := new(uint64)
-	global = stack // force heap allocation
-
-	// Need to keep additional references to nodes, the stack is not all that type-safe.
-	var nodes []*MyNode
-
-	// Check the stack is initially empty.
-	if LFStackPop(stack) != nil {
-		t.Fatalf("stack is not empty")
-	}
-
-	// Push one element.
-	node := &MyNode{data: 42}
-	nodes = append(nodes, node)
-	LFStackPush(stack, fromMyNode(node))
-
-	// Push another.
-	node = &MyNode{data: 43}
-	nodes = append(nodes, node)
-	LFStackPush(stack, fromMyNode(node))
-
-	// Pop one element.
-	node = toMyNode(LFStackPop(stack))
-	if node == nil {
-		t.Fatalf("stack is empty")
-	}
-	if node.data != 43 {
-		t.Fatalf("no lifo")
-	}
-
-	// Pop another.
-	node = toMyNode(LFStackPop(stack))
-	if node == nil {
-		t.Fatalf("stack is empty")
-	}
-	if node.data != 42 {
-		t.Fatalf("no lifo")
-	}
-
-	// Check the stack is empty again.
-	if LFStackPop(stack) != nil {
-		t.Fatalf("stack is not empty")
-	}
-	if *stack != 0 {
-		t.Fatalf("stack is not empty")
-	}
-}
-
-var stress []*MyNode
-
-func TestLFStackStress(t *testing.T) {
-	const K = 100
-	P := 4 * GOMAXPROCS(-1)
-	N := 100000
-	if testing.Short() {
-		N /= 10
-	}
-	// Create 2 stacks.
-	stacks := [2]*uint64{new(uint64), new(uint64)}
-	// Need to keep additional references to nodes,
-	// the lock-free stack is not type-safe.
-	stress = nil
-	// Push K elements randomly onto the stacks.
-	sum := 0
-	for i := 0; i < K; i++ {
-		sum += i
-		node := &MyNode{data: i}
-		stress = append(stress, node)
-		LFStackPush(stacks[i%2], fromMyNode(node))
-	}
-	c := make(chan bool, P)
-	for p := 0; p < P; p++ {
-		go func() {
-			r := rand.New(rand.NewSource(rand.Int63()))
-			// Pop a node from a random stack, then push it onto a random stack.
-			for i := 0; i < N; i++ {
-				node := toMyNode(LFStackPop(stacks[r.Intn(2)]))
-				if node != nil {
-					LFStackPush(stacks[r.Intn(2)], fromMyNode(node))
-				}
-			}
-			c <- true
-		}()
-	}
-	for i := 0; i < P; i++ {
-		<-c
-	}
-	// Pop all elements from both stacks, and verify that nothing lost.
-	sum2 := 0
-	cnt := 0
-	for i := 0; i < 2; i++ {
-		for {
-			node := toMyNode(LFStackPop(stacks[i]))
-			if node == nil {
-				break
-			}
-			cnt++
-			sum2 += node.data
-			node.Next = 0
-		}
-	}
-	if cnt != K {
-		t.Fatalf("Wrong number of nodes %d/%d", cnt, K)
-	}
-	if sum2 != sum {
-		t.Fatalf("Wrong sum %d/%d", sum2, sum)
-	}
-
-	// Let nodes be collected now.
-	stress = nil
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/malloc_test.go b/third_party/gofrontend/libgo/go/runtime/malloc_test.go
deleted file mode 100644
index df6a0e5..0000000
--- a/third_party/gofrontend/libgo/go/runtime/malloc_test.go
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"flag"
-	. "runtime"
-	"testing"
-	"time"
-	"unsafe"
-)
-
-func TestMemStats(t *testing.T) {
-	t.Skip("skipping test with gccgo")
-	// Test that MemStats has sane values.
-	st := new(MemStats)
-	ReadMemStats(st)
-
-	// Everything except HeapReleased and HeapIdle, because they indeed can be 0.
-	if st.Alloc == 0 || st.TotalAlloc == 0 || st.Sys == 0 || st.Lookups == 0 ||
-		st.Mallocs == 0 || st.Frees == 0 || st.HeapAlloc == 0 || st.HeapSys == 0 ||
-		st.HeapInuse == 0 || st.HeapObjects == 0 || st.StackInuse == 0 ||
-		st.StackSys == 0 || st.MSpanInuse == 0 || st.MSpanSys == 0 || st.MCacheInuse == 0 ||
-		st.MCacheSys == 0 || st.BuckHashSys == 0 || st.GCSys == 0 || st.OtherSys == 0 ||
-		st.NextGC == 0 || st.NumGC == 0 {
-		t.Fatalf("Zero value: %+v", *st)
-	}
-
-	if st.Alloc > 1e10 || st.TotalAlloc > 1e11 || st.Sys > 1e10 || st.Lookups > 1e10 ||
-		st.Mallocs > 1e10 || st.Frees > 1e10 || st.HeapAlloc > 1e10 || st.HeapSys > 1e10 ||
-		st.HeapIdle > 1e10 || st.HeapInuse > 1e10 || st.HeapObjects > 1e10 || st.StackInuse > 1e10 ||
-		st.StackSys > 1e10 || st.MSpanInuse > 1e10 || st.MSpanSys > 1e10 || st.MCacheInuse > 1e10 ||
-		st.MCacheSys > 1e10 || st.BuckHashSys > 1e10 || st.GCSys > 1e10 || st.OtherSys > 1e10 ||
-		st.NextGC > 1e10 || st.NumGC > 1e9 || st.PauseTotalNs > 1e11 {
-		t.Fatalf("Insanely high value (overflow?): %+v", *st)
-	}
-	if st.Sys != st.HeapSys+st.StackSys+st.MSpanSys+st.MCacheSys+
-		st.BuckHashSys+st.GCSys+st.OtherSys {
-		t.Fatalf("Bad sys value: %+v", *st)
-	}
-
-	if st.HeapIdle+st.HeapInuse != st.HeapSys {
-		t.Fatalf("HeapIdle(%d) + HeapInuse(%d) should be equal to HeapSys(%d), but isn't.", st.HeapIdle, st.HeapInuse, st.HeapSys)
-	}
-
-	if lpe := st.PauseEnd[int(st.NumGC+255)%len(st.PauseEnd)]; st.LastGC != lpe {
-		t.Fatalf("LastGC(%d) != last PauseEnd(%d)", st.LastGC, lpe)
-	}
-
-	var pauseTotal uint64
-	for _, pause := range st.PauseNs {
-		pauseTotal += pause
-	}
-	if int(st.NumGC) < len(st.PauseNs) {
-		// We have all pauses, so this should be exact.
-		if st.PauseTotalNs != pauseTotal {
-			t.Fatalf("PauseTotalNs(%d) != sum PauseNs(%d)", st.PauseTotalNs, pauseTotal)
-		}
-	} else {
-		if st.PauseTotalNs < pauseTotal {
-			t.Fatalf("PauseTotalNs(%d) < sum PauseNs(%d)", st.PauseTotalNs, pauseTotal)
-		}
-	}
-}
-
-func TestStringConcatenationAllocs(t *testing.T) {
-	t.Skip("skipping test with gccgo")
-	n := testing.AllocsPerRun(1e3, func() {
-		b := make([]byte, 10)
-		for i := 0; i < 10; i++ {
-			b[i] = byte(i) + '0'
-		}
-		s := "foo" + string(b)
-		if want := "foo0123456789"; s != want {
-			t.Fatalf("want %v, got %v", want, s)
-		}
-	})
-	// Only string concatenation allocates.
-	if n != 1 {
-		t.Fatalf("want 1 allocation, got %v", n)
-	}
-}
-
-var mallocSink uintptr
-
-func BenchmarkMalloc8(b *testing.B) {
-	var x uintptr
-	for i := 0; i < b.N; i++ {
-		p := new(int64)
-		x ^= uintptr(unsafe.Pointer(p))
-	}
-	mallocSink = x
-}
-
-func BenchmarkMalloc16(b *testing.B) {
-	var x uintptr
-	for i := 0; i < b.N; i++ {
-		p := new([2]int64)
-		x ^= uintptr(unsafe.Pointer(p))
-	}
-	mallocSink = x
-}
-
-func BenchmarkMallocTypeInfo8(b *testing.B) {
-	var x uintptr
-	for i := 0; i < b.N; i++ {
-		p := new(struct {
-			p [8 / unsafe.Sizeof(uintptr(0))]*int
-		})
-		x ^= uintptr(unsafe.Pointer(p))
-	}
-	mallocSink = x
-}
-
-func BenchmarkMallocTypeInfo16(b *testing.B) {
-	var x uintptr
-	for i := 0; i < b.N; i++ {
-		p := new(struct {
-			p [16 / unsafe.Sizeof(uintptr(0))]*int
-		})
-		x ^= uintptr(unsafe.Pointer(p))
-	}
-	mallocSink = x
-}
-
-var n = flag.Int("n", 1000, "number of goroutines")
-
-func BenchmarkGoroutineSelect(b *testing.B) {
-	quit := make(chan struct{})
-	read := func(ch chan struct{}) {
-		for {
-			select {
-			case _, ok := <-ch:
-				if !ok {
-					return
-				}
-			case <-quit:
-				return
-			}
-		}
-	}
-	benchHelper(b, *n, read)
-}
-
-func BenchmarkGoroutineBlocking(b *testing.B) {
-	read := func(ch chan struct{}) {
-		for {
-			if _, ok := <-ch; !ok {
-				return
-			}
-		}
-	}
-	benchHelper(b, *n, read)
-}
-
-func BenchmarkGoroutineForRange(b *testing.B) {
-	read := func(ch chan struct{}) {
-		for _ = range ch {
-		}
-	}
-	benchHelper(b, *n, read)
-}
-
-func benchHelper(b *testing.B, n int, read func(chan struct{})) {
-	m := make([]chan struct{}, n)
-	for i := range m {
-		m[i] = make(chan struct{}, 1)
-		go read(m[i])
-	}
-	b.StopTimer()
-	b.ResetTimer()
-	GC()
-
-	for i := 0; i < b.N; i++ {
-		for _, ch := range m {
-			if ch != nil {
-				ch <- struct{}{}
-			}
-		}
-		time.Sleep(10 * time.Millisecond)
-		b.StartTimer()
-		GC()
-		b.StopTimer()
-	}
-
-	for _, ch := range m {
-		close(ch)
-	}
-	time.Sleep(10 * time.Millisecond)
-}
-
-func BenchmarkGoroutineIdle(b *testing.B) {
-	quit := make(chan struct{})
-	fn := func() {
-		<-quit
-	}
-	for i := 0; i < *n; i++ {
-		go fn()
-	}
-
-	GC()
-	b.ResetTimer()
-
-	for i := 0; i < b.N; i++ {
-		GC()
-	}
-
-	b.StopTimer()
-	close(quit)
-	time.Sleep(10 * time.Millisecond)
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/map_test.go b/third_party/gofrontend/libgo/go/runtime/map_test.go
deleted file mode 100644
index ed0347a..0000000
--- a/third_party/gofrontend/libgo/go/runtime/map_test.go
+++ /dev/null
@@ -1,625 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"fmt"
-	"math"
-	"reflect"
-	"runtime"
-	"sort"
-	"strings"
-	"sync"
-	"testing"
-)
-
-// negative zero is a good test because:
-//  1) 0 and -0 are equal, yet have distinct representations.
-//  2) 0 is represented as all zeros, -0 isn't.
-// I'm not sure the language spec actually requires this behavior,
-// but it's what the current map implementation does.
-func TestNegativeZero(t *testing.T) {
-	m := make(map[float64]bool, 0)
-
-	m[+0.0] = true
-	m[math.Copysign(0.0, -1.0)] = true // should overwrite +0 entry
-
-	if len(m) != 1 {
-		t.Error("length wrong")
-	}
-
-	/* gccgo fails this test; this is not required by the spec.
-	for k := range m {
-		if math.Copysign(1.0, k) > 0 {
-			t.Error("wrong sign")
-		}
-	}
-	*/
-
-	m = make(map[float64]bool, 0)
-	m[math.Copysign(0.0, -1.0)] = true
-	m[+0.0] = true // should overwrite -0.0 entry
-
-	if len(m) != 1 {
-		t.Error("length wrong")
-	}
-
-	/* gccgo fails this test; this is not required by the spec.
-	for k := range m {
-		if math.Copysign(1.0, k) < 0 {
-			t.Error("wrong sign")
-		}
-	}
-	*/
-}
-
-// nan is a good test because nan != nan, and nan has
-// a randomized hash value.
-func TestNan(t *testing.T) {
-	m := make(map[float64]int, 0)
-	nan := math.NaN()
-	m[nan] = 1
-	m[nan] = 2
-	m[nan] = 4
-	if len(m) != 3 {
-		t.Error("length wrong")
-	}
-	s := 0
-	for k, v := range m {
-		if k == k {
-			t.Error("nan disappeared")
-		}
-		if (v & (v - 1)) != 0 {
-			t.Error("value wrong")
-		}
-		s |= v
-	}
-	if s != 7 {
-		t.Error("values wrong")
-	}
-}
-
-// Maps aren't actually copied on assignment.
-func TestAlias(t *testing.T) {
-	m := make(map[int]int, 0)
-	m[0] = 5
-	n := m
-	n[0] = 6
-	if m[0] != 6 {
-		t.Error("alias didn't work")
-	}
-}
-
-func TestGrowWithNaN(t *testing.T) {
-	t.Skip("fails with gccgo")
-	m := make(map[float64]int, 4)
-	nan := math.NaN()
-	m[nan] = 1
-	m[nan] = 2
-	m[nan] = 4
-	cnt := 0
-	s := 0
-	growflag := true
-	for k, v := range m {
-		if growflag {
-			// force a hashtable resize
-			for i := 0; i < 100; i++ {
-				m[float64(i)] = i
-			}
-			growflag = false
-		}
-		if k != k {
-			cnt++
-			s |= v
-		}
-	}
-	t.Log("cnt:", cnt, "s:", s)
-	if cnt != 3 {
-		t.Error("NaN keys lost during grow")
-	}
-	if s != 7 {
-		t.Error("NaN values lost during grow")
-	}
-}
-
-type FloatInt struct {
-	x float64
-	y int
-}
-
-func TestGrowWithNegativeZero(t *testing.T) {
-	t.Skip("fails with gccgo")
-	negzero := math.Copysign(0.0, -1.0)
-	m := make(map[FloatInt]int, 4)
-	m[FloatInt{0.0, 0}] = 1
-	m[FloatInt{0.0, 1}] = 2
-	m[FloatInt{0.0, 2}] = 4
-	m[FloatInt{0.0, 3}] = 8
-	growflag := true
-	s := 0
-	cnt := 0
-	negcnt := 0
-	// The first iteration should return the +0 key.
-	// The subsequent iterations should return the -0 key.
-	// I'm not really sure this is required by the spec,
-	// but it makes sense.
-	// TODO: are we allowed to get the first entry returned again???
-	for k, v := range m {
-		if v == 0 {
-			continue
-		} // ignore entries added to grow table
-		cnt++
-		if math.Copysign(1.0, k.x) < 0 {
-			if v&16 == 0 {
-				t.Error("key/value not updated together 1")
-			}
-			negcnt++
-			s |= v & 15
-		} else {
-			if v&16 == 16 {
-				t.Error("key/value not updated together 2", k, v)
-			}
-			s |= v
-		}
-		if growflag {
-			// force a hashtable resize
-			for i := 0; i < 100; i++ {
-				m[FloatInt{3.0, i}] = 0
-			}
-			// then change all the entries
-			// to negative zero
-			m[FloatInt{negzero, 0}] = 1 | 16
-			m[FloatInt{negzero, 1}] = 2 | 16
-			m[FloatInt{negzero, 2}] = 4 | 16
-			m[FloatInt{negzero, 3}] = 8 | 16
-			growflag = false
-		}
-	}
-	if s != 15 {
-		t.Error("entry missing", s)
-	}
-	if cnt != 4 {
-		t.Error("wrong number of entries returned by iterator", cnt)
-	}
-	if negcnt != 3 {
-		t.Error("update to negzero missed by iteration", negcnt)
-	}
-}
-
-func TestIterGrowAndDelete(t *testing.T) {
-	m := make(map[int]int, 4)
-	for i := 0; i < 100; i++ {
-		m[i] = i
-	}
-	growflag := true
-	for k := range m {
-		if growflag {
-			// grow the table
-			for i := 100; i < 1000; i++ {
-				m[i] = i
-			}
-			// delete all odd keys
-			for i := 1; i < 1000; i += 2 {
-				delete(m, i)
-			}
-			growflag = false
-		} else {
-			if k&1 == 1 {
-				t.Error("odd value returned")
-			}
-		}
-	}
-}
-
-// make sure old bucket arrays don't get GCd while
-// an iterator is still using them.
-func TestIterGrowWithGC(t *testing.T) {
-	m := make(map[int]int, 4)
-	for i := 0; i < 16; i++ {
-		m[i] = i
-	}
-	growflag := true
-	bitmask := 0
-	for k := range m {
-		if k < 16 {
-			bitmask |= 1 << uint(k)
-		}
-		if growflag {
-			// grow the table
-			for i := 100; i < 1000; i++ {
-				m[i] = i
-			}
-			// trigger a gc
-			runtime.GC()
-			growflag = false
-		}
-	}
-	if bitmask != 1<<16-1 {
-		t.Error("missing key", bitmask)
-	}
-}
-
-func testConcurrentReadsAfterGrowth(t *testing.T, useReflect bool) {
-	if runtime.GOMAXPROCS(-1) == 1 {
-		if runtime.GOARCH == "s390" {
-			// Test uses too much address space on 31-bit S390.
-			defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(8))
-		} else {
-			defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(16))
-		}
-	}
-	numLoop := 10
-	numGrowStep := 250
-	numReader := 16
-	if testing.Short() {
-		numLoop, numGrowStep = 2, 500
-	}
-	for i := 0; i < numLoop; i++ {
-		m := make(map[int]int, 0)
-		for gs := 0; gs < numGrowStep; gs++ {
-			m[gs] = gs
-			var wg sync.WaitGroup
-			wg.Add(numReader * 2)
-			for nr := 0; nr < numReader; nr++ {
-				go func() {
-					defer wg.Done()
-					for range m {
-					}
-				}()
-				go func() {
-					defer wg.Done()
-					for key := 0; key < gs; key++ {
-						_ = m[key]
-					}
-				}()
-				if useReflect {
-					wg.Add(1)
-					go func() {
-						defer wg.Done()
-						mv := reflect.ValueOf(m)
-						keys := mv.MapKeys()
-						for _, k := range keys {
-							mv.MapIndex(k)
-						}
-					}()
-				}
-			}
-			wg.Wait()
-		}
-	}
-}
-
-func TestConcurrentReadsAfterGrowth(t *testing.T) {
-	testConcurrentReadsAfterGrowth(t, false)
-}
-
-func TestConcurrentReadsAfterGrowthReflect(t *testing.T) {
-	testConcurrentReadsAfterGrowth(t, true)
-}
-
-func TestBigItems(t *testing.T) {
-	var key [256]string
-	for i := 0; i < 256; i++ {
-		key[i] = "foo"
-	}
-	m := make(map[[256]string][256]string, 4)
-	for i := 0; i < 100; i++ {
-		key[37] = fmt.Sprintf("string%02d", i)
-		m[key] = key
-	}
-	var keys [100]string
-	var values [100]string
-	i := 0
-	for k, v := range m {
-		keys[i] = k[37]
-		values[i] = v[37]
-		i++
-	}
-	sort.Strings(keys[:])
-	sort.Strings(values[:])
-	for i := 0; i < 100; i++ {
-		if keys[i] != fmt.Sprintf("string%02d", i) {
-			t.Errorf("#%d: missing key: %v", i, keys[i])
-		}
-		if values[i] != fmt.Sprintf("string%02d", i) {
-			t.Errorf("#%d: missing value: %v", i, values[i])
-		}
-	}
-}
-
-type empty struct {
-}
-
-func TestEmptyKeyAndValue(t *testing.T) {
-	a := make(map[int]empty, 4)
-	b := make(map[empty]int, 4)
-	c := make(map[empty]empty, 4)
-	a[0] = empty{}
-	b[empty{}] = 0
-	b[empty{}] = 1
-	c[empty{}] = empty{}
-
-	if len(a) != 1 {
-		t.Errorf("empty value insert problem")
-	}
-	if b[empty{}] != 1 {
-		t.Errorf("empty key returned wrong value")
-	}
-}
-
-// Tests a map with a single bucket, with same-lengthed short keys
-// ("quick keys") as well as long keys.
-func TestSingleBucketMapStringKeys_DupLen(t *testing.T) {
-	testMapLookups(t, map[string]string{
-		"x":    "x1val",
-		"xx":   "x2val",
-		"foo":  "fooval",
-		"bar":  "barval", // same key length as "foo"
-		"xxxx": "x4val",
-		strings.Repeat("x", 128): "longval1",
-		strings.Repeat("y", 128): "longval2",
-	})
-}
-
-// Tests a map with a single bucket, with all keys having different lengths.
-func TestSingleBucketMapStringKeys_NoDupLen(t *testing.T) {
-	testMapLookups(t, map[string]string{
-		"x":                      "x1val",
-		"xx":                     "x2val",
-		"foo":                    "fooval",
-		"xxxx":                   "x4val",
-		"xxxxx":                  "x5val",
-		"xxxxxx":                 "x6val",
-		strings.Repeat("x", 128): "longval",
-	})
-}
-
-func testMapLookups(t *testing.T, m map[string]string) {
-	for k, v := range m {
-		if m[k] != v {
-			t.Fatalf("m[%q] = %q; want %q", k, m[k], v)
-		}
-	}
-}
-
-// Tests whether the iterator returns the right elements when
-// started in the middle of a grow, when the keys are NaNs.
-func TestMapNanGrowIterator(t *testing.T) {
-	m := make(map[float64]int)
-	nan := math.NaN()
-	const nBuckets = 16
-	// To fill nBuckets buckets takes LOAD * nBuckets keys.
-	nKeys := int(nBuckets * /* *runtime.HashLoad */ 6.5)
-
-	// Get map to full point with nan keys.
-	for i := 0; i < nKeys; i++ {
-		m[nan] = i
-	}
-	// Trigger grow
-	m[1.0] = 1
-	delete(m, 1.0)
-
-	// Run iterator
-	found := make(map[int]struct{})
-	for _, v := range m {
-		if v != -1 {
-			if _, repeat := found[v]; repeat {
-				t.Fatalf("repeat of value %d", v)
-			}
-			found[v] = struct{}{}
-		}
-		if len(found) == nKeys/2 {
-			// Halfway through iteration, finish grow.
-			for i := 0; i < nBuckets; i++ {
-				delete(m, 1.0)
-			}
-		}
-	}
-	if len(found) != nKeys {
-		t.Fatalf("missing value")
-	}
-}
-
-func TestMapIterOrder(t *testing.T) {
-	if runtime.Compiler == "gccgo" {
-		t.Skip("skipping for gccgo")
-	}
-
-	for _, n := range [...]int{3, 7, 9, 15} {
-		for i := 0; i < 1000; i++ {
-			// Make m be {0: true, 1: true, ..., n-1: true}.
-			m := make(map[int]bool)
-			for i := 0; i < n; i++ {
-				m[i] = true
-			}
-			// Check that iterating over the map produces at least two different orderings.
-			ord := func() []int {
-				var s []int
-				for key := range m {
-					s = append(s, key)
-				}
-				return s
-			}
-			first := ord()
-			ok := false
-			for try := 0; try < 100; try++ {
-				if !reflect.DeepEqual(first, ord()) {
-					ok = true
-					break
-				}
-			}
-			if !ok {
-				t.Errorf("Map with n=%d elements had consistent iteration order: %v", n, first)
-				break
-			}
-		}
-	}
-}
-
-// Issue 8410
-func TestMapSparseIterOrder(t *testing.T) {
-	// Run several rounds to increase the probability
-	// of failure. One is not enough.
-	if runtime.Compiler == "gccgo" {
-		t.Skip("skipping for gccgo")
-	}
-NextRound:
-	for round := 0; round < 10; round++ {
-		m := make(map[int]bool)
-		// Add 1000 items, remove 980.
-		for i := 0; i < 1000; i++ {
-			m[i] = true
-		}
-		for i := 20; i < 1000; i++ {
-			delete(m, i)
-		}
-
-		var first []int
-		for i := range m {
-			first = append(first, i)
-		}
-
-		// 800 chances to get a different iteration order.
-		// See bug 8736 for why we need so many tries.
-		for n := 0; n < 800; n++ {
-			idx := 0
-			for i := range m {
-				if i != first[idx] {
-					// iteration order changed.
-					continue NextRound
-				}
-				idx++
-			}
-		}
-		t.Fatalf("constant iteration order on round %d: %v", round, first)
-	}
-}
-
-func TestMapStringBytesLookup(t *testing.T) {
-	if runtime.Compiler == "gccgo" {
-		t.Skip("skipping for gccgo")
-	}
-	// Use large string keys to avoid small-allocation coalescing,
-	// which can cause AllocsPerRun to report lower counts than it should.
-	m := map[string]int{
-		"1000000000000000000000000000000000000000000000000": 1,
-		"2000000000000000000000000000000000000000000000000": 2,
-	}
-	buf := []byte("1000000000000000000000000000000000000000000000000")
-	if x := m[string(buf)]; x != 1 {
-		t.Errorf(`m[string([]byte("1"))] = %d, want 1`, x)
-	}
-	buf[0] = '2'
-	if x := m[string(buf)]; x != 2 {
-		t.Errorf(`m[string([]byte("2"))] = %d, want 2`, x)
-	}
-
-	var x int
-	n := testing.AllocsPerRun(100, func() {
-		x += m[string(buf)]
-	})
-	if n != 0 {
-		t.Errorf("AllocsPerRun for m[string(buf)] = %v, want 0", n)
-	}
-
-	x = 0
-	n = testing.AllocsPerRun(100, func() {
-		y, ok := m[string(buf)]
-		if !ok {
-			panic("!ok")
-		}
-		x += y
-	})
-	if n != 0 {
-		t.Errorf("AllocsPerRun for x,ok = m[string(buf)] = %v, want 0", n)
-	}
-}
-
-func TestMapLargeKeyNoPointer(t *testing.T) {
-	const (
-		I = 1000
-		N = 64
-	)
-	type T [N]int
-	m := make(map[T]int)
-	for i := 0; i < I; i++ {
-		var v T
-		for j := 0; j < N; j++ {
-			v[j] = i + j
-		}
-		m[v] = i
-	}
-	runtime.GC()
-	for i := 0; i < I; i++ {
-		var v T
-		for j := 0; j < N; j++ {
-			v[j] = i + j
-		}
-		if m[v] != i {
-			t.Fatalf("corrupted map: want %+v, got %+v", i, m[v])
-		}
-	}
-}
-
-func TestMapLargeValNoPointer(t *testing.T) {
-	const (
-		I = 1000
-		N = 64
-	)
-	type T [N]int
-	m := make(map[int]T)
-	for i := 0; i < I; i++ {
-		var v T
-		for j := 0; j < N; j++ {
-			v[j] = i + j
-		}
-		m[i] = v
-	}
-	runtime.GC()
-	for i := 0; i < I; i++ {
-		var v T
-		for j := 0; j < N; j++ {
-			v[j] = i + j
-		}
-		v1 := m[i]
-		for j := 0; j < N; j++ {
-			if v1[j] != v[j] {
-				t.Fatalf("corrupted map: want %+v, got %+v", v, v1)
-			}
-		}
-	}
-}
-
-func benchmarkMapPop(b *testing.B, n int) {
-	m := map[int]int{}
-	for i := 0; i < b.N; i++ {
-		for j := 0; j < n; j++ {
-			m[j] = j
-		}
-		for j := 0; j < n; j++ {
-			// Use iterator to pop an element.
-			// We want this to be fast, see issue 8412.
-			for k := range m {
-				delete(m, k)
-				break
-			}
-		}
-	}
-}
-
-func BenchmarkMapPop100(b *testing.B)   { benchmarkMapPop(b, 100) }
-func BenchmarkMapPop1000(b *testing.B)  { benchmarkMapPop(b, 1000) }
-func BenchmarkMapPop10000(b *testing.B) { benchmarkMapPop(b, 10000) }
-
-func TestNonEscapingMap(t *testing.T) {
-	t.Skip("does not work on gccgo without better escape analysis")
-	n := testing.AllocsPerRun(1000, func() {
-		m := make(map[int]int)
-		m[0] = 0
-	})
-	if n != 0 {
-		t.Fatalf("want 0 allocs, got %v", n)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/mapspeed_test.go b/third_party/gofrontend/libgo/go/runtime/mapspeed_test.go
deleted file mode 100644
index ac93119..0000000
--- a/third_party/gofrontend/libgo/go/runtime/mapspeed_test.go
+++ /dev/null
@@ -1,328 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-package runtime_test
-
-import (
-	"fmt"
-	"strings"
-	"testing"
-)
-
-const size = 10
-
-func BenchmarkHashStringSpeed(b *testing.B) {
-	strings := make([]string, size)
-	for i := 0; i < size; i++ {
-		strings[i] = fmt.Sprintf("string#%d", i)
-	}
-	sum := 0
-	m := make(map[string]int, size)
-	for i := 0; i < size; i++ {
-		m[strings[i]] = 0
-	}
-	idx := 0
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		sum += m[strings[idx]]
-		idx++
-		if idx == size {
-			idx = 0
-		}
-	}
-}
-
-type chunk [17]byte
-
-func BenchmarkHashBytesSpeed(b *testing.B) {
-	// a bunch of chunks, each with a different alignment mod 16
-	var chunks [size]chunk
-	// initialize each to a different value
-	for i := 0; i < size; i++ {
-		chunks[i][0] = byte(i)
-	}
-	// put into a map
-	m := make(map[chunk]int, size)
-	for i, c := range chunks {
-		m[c] = i
-	}
-	idx := 0
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		if m[chunks[idx]] != idx {
-			b.Error("bad map entry for chunk")
-		}
-		idx++
-		if idx == size {
-			idx = 0
-		}
-	}
-}
-
-func BenchmarkHashInt32Speed(b *testing.B) {
-	ints := make([]int32, size)
-	for i := 0; i < size; i++ {
-		ints[i] = int32(i)
-	}
-	sum := 0
-	m := make(map[int32]int, size)
-	for i := 0; i < size; i++ {
-		m[ints[i]] = 0
-	}
-	idx := 0
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		sum += m[ints[idx]]
-		idx++
-		if idx == size {
-			idx = 0
-		}
-	}
-}
-
-func BenchmarkHashInt64Speed(b *testing.B) {
-	ints := make([]int64, size)
-	for i := 0; i < size; i++ {
-		ints[i] = int64(i)
-	}
-	sum := 0
-	m := make(map[int64]int, size)
-	for i := 0; i < size; i++ {
-		m[ints[i]] = 0
-	}
-	idx := 0
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		sum += m[ints[idx]]
-		idx++
-		if idx == size {
-			idx = 0
-		}
-	}
-}
-func BenchmarkHashStringArraySpeed(b *testing.B) {
-	stringpairs := make([][2]string, size)
-	for i := 0; i < size; i++ {
-		for j := 0; j < 2; j++ {
-			stringpairs[i][j] = fmt.Sprintf("string#%d/%d", i, j)
-		}
-	}
-	sum := 0
-	m := make(map[[2]string]int, size)
-	for i := 0; i < size; i++ {
-		m[stringpairs[i]] = 0
-	}
-	idx := 0
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		sum += m[stringpairs[idx]]
-		idx++
-		if idx == size {
-			idx = 0
-		}
-	}
-}
-
-func BenchmarkMegMap(b *testing.B) {
-	m := make(map[string]bool)
-	for suffix := 'A'; suffix <= 'G'; suffix++ {
-		m[strings.Repeat("X", 1<<20-1)+fmt.Sprint(suffix)] = true
-	}
-	key := strings.Repeat("X", 1<<20-1) + "k"
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		_, _ = m[key]
-	}
-}
-
-func BenchmarkMegOneMap(b *testing.B) {
-	m := make(map[string]bool)
-	m[strings.Repeat("X", 1<<20)] = true
-	key := strings.Repeat("Y", 1<<20)
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		_, _ = m[key]
-	}
-}
-
-func BenchmarkMegEqMap(b *testing.B) {
-	m := make(map[string]bool)
-	key1 := strings.Repeat("X", 1<<20)
-	key2 := strings.Repeat("X", 1<<20) // equal but different instance
-	m[key1] = true
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		_, _ = m[key2]
-	}
-}
-
-func BenchmarkMegEmptyMap(b *testing.B) {
-	m := make(map[string]bool)
-	key := strings.Repeat("X", 1<<20)
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		_, _ = m[key]
-	}
-}
-
-func BenchmarkSmallStrMap(b *testing.B) {
-	m := make(map[string]bool)
-	for suffix := 'A'; suffix <= 'G'; suffix++ {
-		m[fmt.Sprint(suffix)] = true
-	}
-	key := "k"
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		_, _ = m[key]
-	}
-}
-
-func BenchmarkMapStringKeysEight_16(b *testing.B) { benchmarkMapStringKeysEight(b, 16) }
-func BenchmarkMapStringKeysEight_32(b *testing.B) { benchmarkMapStringKeysEight(b, 32) }
-func BenchmarkMapStringKeysEight_64(b *testing.B) { benchmarkMapStringKeysEight(b, 64) }
-func BenchmarkMapStringKeysEight_1M(b *testing.B) { benchmarkMapStringKeysEight(b, 1<<20) }
-
-func benchmarkMapStringKeysEight(b *testing.B, keySize int) {
-	m := make(map[string]bool)
-	for i := 0; i < 8; i++ {
-		m[strings.Repeat("K", i+1)] = true
-	}
-	key := strings.Repeat("K", keySize)
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		_ = m[key]
-	}
-}
-
-func BenchmarkIntMap(b *testing.B) {
-	m := make(map[int]bool)
-	for i := 0; i < 8; i++ {
-		m[i] = true
-	}
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		_, _ = m[7]
-	}
-}
-
-// Accessing the same keys in a row.
-func benchmarkRepeatedLookup(b *testing.B, lookupKeySize int) {
-	m := make(map[string]bool)
-	// At least bigger than a single bucket:
-	for i := 0; i < 64; i++ {
-		m[fmt.Sprintf("some key %d", i)] = true
-	}
-	base := strings.Repeat("x", lookupKeySize-1)
-	key1 := base + "1"
-	key2 := base + "2"
-	b.ResetTimer()
-	for i := 0; i < b.N/4; i++ {
-		_ = m[key1]
-		_ = m[key1]
-		_ = m[key2]
-		_ = m[key2]
-	}
-}
-
-func BenchmarkRepeatedLookupStrMapKey32(b *testing.B) { benchmarkRepeatedLookup(b, 32) }
-func BenchmarkRepeatedLookupStrMapKey1M(b *testing.B) { benchmarkRepeatedLookup(b, 1<<20) }
-
-func BenchmarkNewEmptyMap(b *testing.B) {
-	b.ReportAllocs()
-	for i := 0; i < b.N; i++ {
-		_ = make(map[int]int)
-	}
-}
-
-func BenchmarkNewSmallMap(b *testing.B) {
-	b.ReportAllocs()
-	for i := 0; i < b.N; i++ {
-		m := make(map[int]int)
-		m[0] = 0
-		m[1] = 1
-	}
-}
-
-func BenchmarkMapIter(b *testing.B) {
-	m := make(map[int]bool)
-	for i := 0; i < 8; i++ {
-		m[i] = true
-	}
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		for range m {
-		}
-	}
-}
-
-func BenchmarkMapIterEmpty(b *testing.B) {
-	m := make(map[int]bool)
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		for range m {
-		}
-	}
-}
-
-func BenchmarkSameLengthMap(b *testing.B) {
-	// long strings, same length, differ in first few
-	// and last few bytes.
-	m := make(map[string]bool)
-	s1 := "foo" + strings.Repeat("-", 100) + "bar"
-	s2 := "goo" + strings.Repeat("-", 100) + "ber"
-	m[s1] = true
-	m[s2] = true
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		_ = m[s1]
-	}
-}
-
-type BigKey [3]int64
-
-func BenchmarkBigKeyMap(b *testing.B) {
-	m := make(map[BigKey]bool)
-	k := BigKey{3, 4, 5}
-	m[k] = true
-	for i := 0; i < b.N; i++ {
-		_ = m[k]
-	}
-}
-
-type BigVal [3]int64
-
-func BenchmarkBigValMap(b *testing.B) {
-	m := make(map[BigKey]BigVal)
-	k := BigKey{3, 4, 5}
-	m[k] = BigVal{6, 7, 8}
-	for i := 0; i < b.N; i++ {
-		_ = m[k]
-	}
-}
-
-func BenchmarkSmallKeyMap(b *testing.B) {
-	m := make(map[int16]bool)
-	m[5] = true
-	for i := 0; i < b.N; i++ {
-		_ = m[5]
-	}
-}
-
-type ComplexAlgKey struct {
-	a, b, c int64
-	_       int
-	d       int32
-	_       int
-	e       string
-	_       int
-	f, g, h int64
-}
-
-func BenchmarkComplexAlgMap(b *testing.B) {
-	m := make(map[ComplexAlgKey]bool)
-	var k ComplexAlgKey
-	m[k] = true
-	for i := 0; i < b.N; i++ {
-		_ = m[k]
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/mem.go b/third_party/gofrontend/libgo/go/runtime/mem.go
deleted file mode 100644
index b41d741..0000000
--- a/third_party/gofrontend/libgo/go/runtime/mem.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime
-
-import "unsafe"
-
-// Note: the MemStats struct should be kept in sync with
-// struct MStats in malloc.h
-
-// A MemStats records statistics about the memory allocator.
-type MemStats struct {
-	// General statistics.
-	Alloc      uint64 // bytes allocated and still in use
-	TotalAlloc uint64 // bytes allocated (even if freed)
-	Sys        uint64 // bytes obtained from system (sum of XxxSys below)
-	Lookups    uint64 // number of pointer lookups
-	Mallocs    uint64 // number of mallocs
-	Frees      uint64 // number of frees
-
-	// Main allocation heap statistics.
-	HeapAlloc    uint64 // bytes allocated and still in use
-	HeapSys      uint64 // bytes obtained from system
-	HeapIdle     uint64 // bytes in idle spans
-	HeapInuse    uint64 // bytes in non-idle span
-	HeapReleased uint64 // bytes released to the OS
-	HeapObjects  uint64 // total number of allocated objects
-
-	// Low-level fixed-size structure allocator statistics.
-	//	Inuse is bytes used now.
-	//	Sys is bytes obtained from system.
-	StackInuse  uint64 // bootstrap stacks
-	StackSys    uint64
-	MSpanInuse  uint64 // mspan structures
-	MSpanSys    uint64
-	MCacheInuse uint64 // mcache structures
-	MCacheSys   uint64
-	BuckHashSys uint64 // profiling bucket hash table
-	GCSys       uint64 // GC metadata
-	OtherSys    uint64 // other system allocations
-
-	// Garbage collector statistics.
-	NextGC        uint64 // next run in HeapAlloc time (bytes)
-	LastGC        uint64 // last run in absolute time (ns)
-	PauseTotalNs  uint64
-	PauseNs       [256]uint64 // circular buffer of recent GC pause times, most recent at [(NumGC+255)%256]
-	PauseEnd      [256]uint64 // circular buffer of recent GC pause end times
-	NumGC         uint32
-	GCCPUFraction float64 // fraction of CPU time used by GC
-	EnableGC      bool
-	DebugGC       bool
-
-	// Per-size allocation statistics.
-	// 61 is NumSizeClasses in the C code.
-	BySize [61]struct {
-		Size    uint32
-		Mallocs uint64
-		Frees   uint64
-	}
-}
-
-var Sizeof_C_MStats uintptr // filled in by malloc.goc
-
-func init() {
-	var memStats MemStats
-	if Sizeof_C_MStats != unsafe.Sizeof(memStats) {
-		println(Sizeof_C_MStats, unsafe.Sizeof(memStats))
-		panic("MStats vs MemStatsType size mismatch")
-	}
-}
-
-// ReadMemStats populates m with memory allocator statistics.
-func ReadMemStats(m *MemStats)
-
-// GC runs a garbage collection.
-func GC()
diff --git a/third_party/gofrontend/libgo/go/runtime/mfinal_test.go b/third_party/gofrontend/libgo/go/runtime/mfinal_test.go
deleted file mode 100644
index e534496..0000000
--- a/third_party/gofrontend/libgo/go/runtime/mfinal_test.go
+++ /dev/null
@@ -1,257 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"runtime"
-	"testing"
-	"time"
-	"unsafe"
-)
-
-type Tintptr *int // assignable to *int
-type Tint int     // *Tint implements Tinter, interface{}
-
-func (t *Tint) m() {}
-
-type Tinter interface {
-	m()
-}
-
-func TestFinalizerType(t *testing.T) {
-	if runtime.GOARCH != "amd64" {
-		t.Skipf("Skipping on non-amd64 machine")
-	}
-	if runtime.Compiler == "gccgo" {
-		t.Skip("skipping for gccgo")
-	}
-
-	ch := make(chan bool, 10)
-	finalize := func(x *int) {
-		if *x != 97531 {
-			t.Errorf("finalizer %d, want %d", *x, 97531)
-		}
-		ch <- true
-	}
-
-	var finalizerTests = []struct {
-		convert   func(*int) interface{}
-		finalizer interface{}
-	}{
-		{func(x *int) interface{} { return x }, func(v *int) { finalize(v) }},
-		{func(x *int) interface{} { return Tintptr(x) }, func(v Tintptr) { finalize(v) }},
-		{func(x *int) interface{} { return Tintptr(x) }, func(v *int) { finalize(v) }},
-		{func(x *int) interface{} { return (*Tint)(x) }, func(v *Tint) { finalize((*int)(v)) }},
-		{func(x *int) interface{} { return (*Tint)(x) }, func(v Tinter) { finalize((*int)(v.(*Tint))) }},
-	}
-
-	for i, tt := range finalizerTests {
-		done := make(chan bool, 1)
-		go func() {
-			// allocate struct with pointer to avoid hitting tinyalloc.
-			// Otherwise we can't be sure when the allocation will
-			// be freed.
-			type T struct {
-				v int
-				p unsafe.Pointer
-			}
-			v := &new(T).v
-			*v = 97531
-			runtime.SetFinalizer(tt.convert(v), tt.finalizer)
-			v = nil
-			done <- true
-		}()
-		<-done
-		runtime.GC()
-		runtime.GC()
-		select {
-		case <-ch:
-		case <-time.After(time.Second * 4):
-			t.Errorf("#%d: finalizer for type %T didn't run", i, tt.finalizer)
-		}
-	}
-}
-
-type bigValue struct {
-	fill uint64
-	it   bool
-	up   string
-}
-
-func TestFinalizerInterfaceBig(t *testing.T) {
-	if runtime.GOARCH != "amd64" {
-		t.Skipf("Skipping on non-amd64 machine")
-	}
-	if runtime.Compiler == "gccgo" {
-		t.Skip("skipping for gccgo")
-	}
-	ch := make(chan bool)
-	done := make(chan bool, 1)
-	go func() {
-		v := &bigValue{0xDEADBEEFDEADBEEF, true, "It matters not how strait the gate"}
-		old := *v
-		runtime.SetFinalizer(v, func(v interface{}) {
-			i, ok := v.(*bigValue)
-			if !ok {
-				t.Errorf("finalizer called with type %T, want *bigValue", v)
-			}
-			if *i != old {
-				t.Errorf("finalizer called with %+v, want %+v", *i, old)
-			}
-			close(ch)
-		})
-		v = nil
-		done <- true
-	}()
-	<-done
-	runtime.GC()
-	select {
-	case <-ch:
-	case <-time.After(4 * time.Second):
-		t.Errorf("finalizer for type *bigValue didn't run")
-	}
-}
-
-func fin(v *int) {
-}
-
-// Verify we don't crash at least. golang.org/issue/6857
-func TestFinalizerZeroSizedStruct(t *testing.T) {
-	type Z struct{}
-	z := new(Z)
-	runtime.SetFinalizer(z, func(*Z) {})
-}
-
-func BenchmarkFinalizer(b *testing.B) {
-	const Batch = 1000
-	b.RunParallel(func(pb *testing.PB) {
-		var data [Batch]*int
-		for i := 0; i < Batch; i++ {
-			data[i] = new(int)
-		}
-		for pb.Next() {
-			for i := 0; i < Batch; i++ {
-				runtime.SetFinalizer(data[i], fin)
-			}
-			for i := 0; i < Batch; i++ {
-				runtime.SetFinalizer(data[i], nil)
-			}
-		}
-	})
-}
-
-func BenchmarkFinalizerRun(b *testing.B) {
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			v := new(int)
-			runtime.SetFinalizer(v, fin)
-		}
-	})
-}
-
-// One chunk must be exactly one sizeclass in size.
-// It should be a sizeclass not used much by others, so we
-// have a greater chance of finding adjacent ones.
-// size class 19: 320 byte objects, 25 per page, 1 page alloc at a time
-const objsize = 320
-
-type objtype [objsize]byte
-
-func adjChunks() (*objtype, *objtype) {
-	var s []*objtype
-
-	for {
-		c := new(objtype)
-		for _, d := range s {
-			if uintptr(unsafe.Pointer(c))+unsafe.Sizeof(*c) == uintptr(unsafe.Pointer(d)) {
-				return c, d
-			}
-			if uintptr(unsafe.Pointer(d))+unsafe.Sizeof(*c) == uintptr(unsafe.Pointer(c)) {
-				return d, c
-			}
-		}
-		s = append(s, c)
-	}
-}
-
-// Make sure an empty slice on the stack doesn't pin the next object in memory.
-func TestEmptySlice(t *testing.T) {
-	if runtime.Compiler == "gccgo" {
-		t.Skip("skipping for gccgo")
-	}
-	x, y := adjChunks()
-
-	// the pointer inside xs points to y.
-	xs := x[objsize:] // change objsize to objsize-1 and the test passes
-
-	fin := make(chan bool, 1)
-	runtime.SetFinalizer(y, func(z *objtype) { fin <- true })
-	runtime.GC()
-	select {
-	case <-fin:
-	case <-time.After(4 * time.Second):
-		t.Errorf("finalizer of next object in memory didn't run")
-	}
-	xsglobal = xs // keep empty slice alive until here
-}
-
-var xsglobal []byte
-
-func adjStringChunk() (string, *objtype) {
-	b := make([]byte, objsize)
-	for {
-		s := string(b)
-		t := new(objtype)
-		p := *(*uintptr)(unsafe.Pointer(&s))
-		q := uintptr(unsafe.Pointer(t))
-		if p+objsize == q {
-			return s, t
-		}
-	}
-}
-
-// Make sure an empty string on the stack doesn't pin the next object in memory.
-func TestEmptyString(t *testing.T) {
-	if runtime.Compiler == "gccgo" {
-		t.Skip("skipping for gccgo")
-	}
-
-	x, y := adjStringChunk()
-
-	ss := x[objsize:] // change objsize to objsize-1 and the test passes
-	fin := make(chan bool, 1)
-	// set finalizer on string contents of y
-	runtime.SetFinalizer(y, func(z *objtype) { fin <- true })
-	runtime.GC()
-	select {
-	case <-fin:
-	case <-time.After(4 * time.Second):
-		t.Errorf("finalizer of next string in memory didn't run")
-	}
-	ssglobal = ss // keep 0-length string live until here
-}
-
-var ssglobal string
-
-// Test for issue 7656.
-func TestFinalizerOnGlobal(t *testing.T) {
-	runtime.SetFinalizer(Foo1, func(p *Object1) {})
-	runtime.SetFinalizer(Foo2, func(p *Object2) {})
-	runtime.SetFinalizer(Foo1, nil)
-	runtime.SetFinalizer(Foo2, nil)
-}
-
-type Object1 struct {
-	Something []byte
-}
-
-type Object2 struct {
-	Something byte
-}
-
-var (
-	Foo2 = &Object2{}
-	Foo1 = &Object1{}
-)
diff --git a/third_party/gofrontend/libgo/go/runtime/norace_test.go b/third_party/gofrontend/libgo/go/runtime/norace_test.go
deleted file mode 100644
index 3681bf1..0000000
--- a/third_party/gofrontend/libgo/go/runtime/norace_test.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The file contains tests that can not run under race detector for some reason.
-// +build !race
-
-package runtime_test
-
-import (
-	"runtime"
-	"testing"
-)
-
-// Syscall tests split stack between Entersyscall and Exitsyscall under race detector.
-func BenchmarkSyscall(b *testing.B) {
-	benchmarkSyscall(b, 0, 1)
-}
-
-func BenchmarkSyscallWork(b *testing.B) {
-	benchmarkSyscall(b, 100, 1)
-}
-
-func BenchmarkSyscallExcess(b *testing.B) {
-	benchmarkSyscall(b, 0, 4)
-}
-
-func BenchmarkSyscallExcessWork(b *testing.B) {
-	benchmarkSyscall(b, 100, 4)
-}
-
-func benchmarkSyscall(b *testing.B, work, excess int) {
-	b.SetParallelism(excess)
-	b.RunParallel(func(pb *testing.PB) {
-		foo := 42
-		for pb.Next() {
-			runtime.Entersyscall(0)
-			for i := 0; i < work; i++ {
-				foo *= 2
-				foo /= 2
-			}
-			runtime.Exitsyscall(0)
-		}
-		_ = foo
-	})
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/parfor_test.go b/third_party/gofrontend/libgo/go/runtime/parfor_test.go
deleted file mode 100644
index 5d22aec..0000000
--- a/third_party/gofrontend/libgo/go/runtime/parfor_test.go
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The race detector does not understand ParFor synchronization.
-// +build !race
-
-package runtime_test
-
-import (
-	. "runtime"
-	"testing"
-)
-
-// Simple serial sanity test for parallelfor.
-func TestParFor(t *testing.T) {
-	const P = 1
-	const N = 20
-	data := make([]uint64, N)
-	for i := uint64(0); i < N; i++ {
-		data[i] = i
-	}
-	desc := NewParFor(P)
-	ParForSetup(desc, P, N, true, func(desc *ParFor, i uint32) {
-		data[i] = data[i]*data[i] + 1
-	})
-	ParForDo(desc)
-	for i := uint64(0); i < N; i++ {
-		if data[i] != i*i+1 {
-			t.Fatalf("Wrong element %d: %d", i, data[i])
-		}
-	}
-}
-
-// Test that nonblocking parallelfor does not block.
-func TestParFor2(t *testing.T) {
-	const P = 7
-	const N = 1003
-	data := make([]uint64, N)
-	for i := uint64(0); i < N; i++ {
-		data[i] = i
-	}
-	desc := NewParFor(P)
-	ParForSetup(desc, P, N, false, func(desc *ParFor, i uint32) {
-		data[i] = data[i]*data[i] + 1
-	})
-	for p := 0; p < P; p++ {
-		ParForDo(desc)
-	}
-	for i := uint64(0); i < N; i++ {
-		if data[i] != i*i+1 {
-			t.Fatalf("Wrong element %d: %d", i, data[i])
-		}
-	}
-}
-
-// Test that iterations are properly distributed.
-func TestParForSetup(t *testing.T) {
-	const P = 11
-	const N = 101
-	desc := NewParFor(P)
-	for n := uint32(0); n < N; n++ {
-		for p := uint32(1); p <= P; p++ {
-			ParForSetup(desc, p, n, true, func(desc *ParFor, i uint32) {})
-			sum := uint32(0)
-			size0 := uint32(0)
-			end0 := uint32(0)
-			for i := uint32(0); i < p; i++ {
-				begin, end := ParForIters(desc, i)
-				size := end - begin
-				sum += size
-				if i == 0 {
-					size0 = size
-					if begin != 0 {
-						t.Fatalf("incorrect begin: %d (n=%d, p=%d)", begin, n, p)
-					}
-				} else {
-					if size != size0 && size != size0+1 {
-						t.Fatalf("incorrect size: %d/%d (n=%d, p=%d)", size, size0, n, p)
-					}
-					if begin != end0 {
-						t.Fatalf("incorrect begin/end: %d/%d (n=%d, p=%d)", begin, end0, n, p)
-					}
-				}
-				end0 = end
-			}
-			if sum != n {
-				t.Fatalf("incorrect sum: %d/%d (p=%d)", sum, n, p)
-			}
-		}
-	}
-}
-
-// Test parallel parallelfor.
-func TestParForParallel(t *testing.T) {
-	N := uint64(1e7)
-	if testing.Short() {
-		N /= 10
-	}
-	data := make([]uint64, N)
-	for i := uint64(0); i < N; i++ {
-		data[i] = i
-	}
-	P := GOMAXPROCS(-1)
-	c := make(chan bool, P)
-	desc := NewParFor(uint32(P))
-	ParForSetup(desc, uint32(P), uint32(N), false, func(desc *ParFor, i uint32) {
-		data[i] = data[i]*data[i] + 1
-	})
-	for p := 1; p < P; p++ {
-		go func() {
-			ParForDo(desc)
-			c <- true
-		}()
-	}
-	ParForDo(desc)
-	for p := 1; p < P; p++ {
-		<-c
-	}
-	for i := uint64(0); i < N; i++ {
-		if data[i] != i*i+1 {
-			t.Fatalf("Wrong element %d: %d", i, data[i])
-		}
-	}
-
-	data, desc = nil, nil
-	GC()
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/pprof/mprof_test.go b/third_party/gofrontend/libgo/go/runtime/pprof/mprof_test.go
deleted file mode 100644
index 44a3850..0000000
--- a/third_party/gofrontend/libgo/go/runtime/pprof/mprof_test.go
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pprof_test
-
-import (
-	"bytes"
-	"fmt"
-	"regexp"
-	"runtime"
-	. "runtime/pprof"
-	"testing"
-	"unsafe"
-)
-
-var memSink interface{}
-
-func allocateTransient1M() {
-	for i := 0; i < 1024; i++ {
-		memSink = &struct{ x [1024]byte }{}
-	}
-}
-
-func allocateTransient2M() {
-	// prevent inlining
-	if memSink == nil {
-		panic("bad")
-	}
-	memSink = make([]byte, 2<<20)
-}
-
-type Obj32 struct {
-	link *Obj32
-	pad  [32 - unsafe.Sizeof(uintptr(0))]byte
-}
-
-var persistentMemSink *Obj32
-
-func allocatePersistent1K() {
-	for i := 0; i < 32; i++ {
-		// Can't use slice because that will introduce implicit allocations.
-		obj := &Obj32{link: persistentMemSink}
-		persistentMemSink = obj
-	}
-}
-
-var memoryProfilerRun = 0
-
-func TestMemoryProfiler(t *testing.T) {
-	// Disable sampling, otherwise it's difficult to assert anything.
-	oldRate := runtime.MemProfileRate
-	runtime.MemProfileRate = 1
-	defer func() {
-		runtime.MemProfileRate = oldRate
-	}()
-
-	// Allocate a meg to ensure that mcache.next_sample is updated to 1.
-	for i := 0; i < 1024; i++ {
-		memSink = make([]byte, 1024)
-	}
-
-	// Do the interesting allocations.
-	allocateTransient1M()
-	allocateTransient2M()
-	allocatePersistent1K()
-	memSink = nil
-
-	runtime.GC() // materialize stats
-	var buf bytes.Buffer
-	if err := Lookup("heap").WriteTo(&buf, 1); err != nil {
-		t.Fatalf("failed to write heap profile: %v", err)
-	}
-
-	memoryProfilerRun++
-
-	tests := []string{
-		fmt.Sprintf(`%v: %v \[%v: %v\] @ 0x[0-9,a-f x]+
-#	0x[0-9,a-f]+	pprof_test\.allocatePersistent1K\+0x[0-9,a-f]+	.*/mprof_test\.go:43
-#	0x[0-9,a-f]+	runtime_pprof_test\.TestMemoryProfiler\+0x[0-9,a-f]+	.*/mprof_test\.go:66
-`, 32*memoryProfilerRun, 1024*memoryProfilerRun, 32*memoryProfilerRun, 1024*memoryProfilerRun),
-
-		fmt.Sprintf(`0: 0 \[%v: %v\] @ 0x[0-9,a-f x]+
-#	0x[0-9,a-f]+	pprof_test\.allocateTransient1M\+0x[0-9,a-f]+	.*/mprof_test.go:21
-#	0x[0-9,a-f]+	runtime_pprof_test\.TestMemoryProfiler\+0x[0-9,a-f]+	.*/mprof_test.go:64
-`, (1<<10)*memoryProfilerRun, (1<<20)*memoryProfilerRun),
-
-		// This should start with "0: 0" but gccgo's imprecise
-		// GC means that sometimes the value is not collected.
-		fmt.Sprintf(`(0|%v): (0|%v) \[%v: %v\] @ 0x[0-9,a-f x]+
-#	0x[0-9,a-f]+	pprof_test\.allocateTransient2M\+0x[0-9,a-f]+	.*/mprof_test.go:30
-#	0x[0-9,a-f]+	runtime_pprof_test\.TestMemoryProfiler\+0x[0-9,a-f]+	.*/mprof_test.go:65
-`, memoryProfilerRun, (2<<20)*memoryProfilerRun, memoryProfilerRun, (2<<20)*memoryProfilerRun),
-	}
-
-	for _, test := range tests {
-		if !regexp.MustCompile(test).Match(buf.Bytes()) {
-			t.Fatalf("The entry did not match:\n%v\n\nProfile:\n%v\n", test, buf.String())
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/pprof/pprof.go b/third_party/gofrontend/libgo/go/runtime/pprof/pprof.go
deleted file mode 100644
index dcf67cd..0000000
--- a/third_party/gofrontend/libgo/go/runtime/pprof/pprof.go
+++ /dev/null
@@ -1,690 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package pprof writes runtime profiling data in the format expected
-// by the pprof visualization tool.
-// For more information about pprof, see
-// http://code.google.com/p/google-perftools/.
-package pprof
-
-import (
-	"bufio"
-	"bytes"
-	"fmt"
-	"io"
-	"runtime"
-	"sort"
-	"strings"
-	"sync"
-	"text/tabwriter"
-)
-
-// BUG(rsc): Profiles are incomplete and inaccurate on NetBSD and OS X.
-// See https://golang.org/issue/6047 for details.
-
-// A Profile is a collection of stack traces showing the call sequences
-// that led to instances of a particular event, such as allocation.
-// Packages can create and maintain their own profiles; the most common
-// use is for tracking resources that must be explicitly closed, such as files
-// or network connections.
-//
-// A Profile's methods can be called from multiple goroutines simultaneously.
-//
-// Each Profile has a unique name.  A few profiles are predefined:
-//
-//	goroutine    - stack traces of all current goroutines
-//	heap         - a sampling of all heap allocations
-//	threadcreate - stack traces that led to the creation of new OS threads
-//	block        - stack traces that led to blocking on synchronization primitives
-//
-// These predefined profiles maintain themselves and panic on an explicit
-// Add or Remove method call.
-//
-// The heap profile reports statistics as of the most recently completed
-// garbage collection; it elides more recent allocation to avoid skewing
-// the profile away from live data and toward garbage.
-// If there has been no garbage collection at all, the heap profile reports
-// all known allocations. This exception helps mainly in programs running
-// without garbage collection enabled, usually for debugging purposes.
-//
-// The CPU profile is not available as a Profile.  It has a special API,
-// the StartCPUProfile and StopCPUProfile functions, because it streams
-// output to a writer during profiling.
-//
-type Profile struct {
-	name  string
-	mu    sync.Mutex
-	m     map[interface{}][]uintptr
-	count func() int
-	write func(io.Writer, int) error
-}
-
-// profiles records all registered profiles.
-var profiles struct {
-	mu sync.Mutex
-	m  map[string]*Profile
-}
-
-var goroutineProfile = &Profile{
-	name:  "goroutine",
-	count: countGoroutine,
-	write: writeGoroutine,
-}
-
-var threadcreateProfile = &Profile{
-	name:  "threadcreate",
-	count: countThreadCreate,
-	write: writeThreadCreate,
-}
-
-var heapProfile = &Profile{
-	name:  "heap",
-	count: countHeap,
-	write: writeHeap,
-}
-
-var blockProfile = &Profile{
-	name:  "block",
-	count: countBlock,
-	write: writeBlock,
-}
-
-func lockProfiles() {
-	profiles.mu.Lock()
-	if profiles.m == nil {
-		// Initial built-in profiles.
-		profiles.m = map[string]*Profile{
-			"goroutine":    goroutineProfile,
-			"threadcreate": threadcreateProfile,
-			"heap":         heapProfile,
-			"block":        blockProfile,
-		}
-	}
-}
-
-func unlockProfiles() {
-	profiles.mu.Unlock()
-}
-
-// NewProfile creates a new profile with the given name.
-// If a profile with that name already exists, NewProfile panics.
-// The convention is to use a 'import/path.' prefix to create
-// separate name spaces for each package.
-func NewProfile(name string) *Profile {
-	lockProfiles()
-	defer unlockProfiles()
-	if name == "" {
-		panic("pprof: NewProfile with empty name")
-	}
-	if profiles.m[name] != nil {
-		panic("pprof: NewProfile name already in use: " + name)
-	}
-	p := &Profile{
-		name: name,
-		m:    map[interface{}][]uintptr{},
-	}
-	profiles.m[name] = p
-	return p
-}
-
-// Lookup returns the profile with the given name, or nil if no such profile exists.
-func Lookup(name string) *Profile {
-	lockProfiles()
-	defer unlockProfiles()
-	return profiles.m[name]
-}
-
-// Profiles returns a slice of all the known profiles, sorted by name.
-func Profiles() []*Profile {
-	lockProfiles()
-	defer unlockProfiles()
-
-	var all []*Profile
-	for _, p := range profiles.m {
-		all = append(all, p)
-	}
-
-	sort.Sort(byName(all))
-	return all
-}
-
-type byName []*Profile
-
-func (x byName) Len() int           { return len(x) }
-func (x byName) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }
-func (x byName) Less(i, j int) bool { return x[i].name < x[j].name }
-
-// Name returns this profile's name, which can be passed to Lookup to reobtain the profile.
-func (p *Profile) Name() string {
-	return p.name
-}
-
-// Count returns the number of execution stacks currently in the profile.
-func (p *Profile) Count() int {
-	p.mu.Lock()
-	defer p.mu.Unlock()
-	if p.count != nil {
-		return p.count()
-	}
-	return len(p.m)
-}
-
-// Add adds the current execution stack to the profile, associated with value.
-// Add stores value in an internal map, so value must be suitable for use as
-// a map key and will not be garbage collected until the corresponding
-// call to Remove.  Add panics if the profile already contains a stack for value.
-//
-// The skip parameter has the same meaning as runtime.Caller's skip
-// and controls where the stack trace begins.  Passing skip=0 begins the
-// trace in the function calling Add.  For example, given this
-// execution stack:
-//
-//	Add
-//	called from rpc.NewClient
-//	called from mypkg.Run
-//	called from main.main
-//
-// Passing skip=0 begins the stack trace at the call to Add inside rpc.NewClient.
-// Passing skip=1 begins the stack trace at the call to NewClient inside mypkg.Run.
-//
-func (p *Profile) Add(value interface{}, skip int) {
-	if p.name == "" {
-		panic("pprof: use of uninitialized Profile")
-	}
-	if p.write != nil {
-		panic("pprof: Add called on built-in Profile " + p.name)
-	}
-
-	stk := make([]uintptr, 32)
-	n := runtime.Callers(skip+1, stk[:])
-
-	p.mu.Lock()
-	defer p.mu.Unlock()
-	if p.m[value] != nil {
-		panic("pprof: Profile.Add of duplicate value")
-	}
-	p.m[value] = stk[:n]
-}
-
-// Remove removes the execution stack associated with value from the profile.
-// It is a no-op if the value is not in the profile.
-func (p *Profile) Remove(value interface{}) {
-	p.mu.Lock()
-	defer p.mu.Unlock()
-	delete(p.m, value)
-}
-
-// WriteTo writes a pprof-formatted snapshot of the profile to w.
-// If a write to w returns an error, WriteTo returns that error.
-// Otherwise, WriteTo returns nil.
-//
-// The debug parameter enables additional output.
-// Passing debug=0 prints only the hexadecimal addresses that pprof needs.
-// Passing debug=1 adds comments translating addresses to function names
-// and line numbers, so that a programmer can read the profile without tools.
-//
-// The predefined profiles may assign meaning to other debug values;
-// for example, when printing the "goroutine" profile, debug=2 means to
-// print the goroutine stacks in the same form that a Go program uses
-// when dying due to an unrecovered panic.
-func (p *Profile) WriteTo(w io.Writer, debug int) error {
-	if p.name == "" {
-		panic("pprof: use of zero Profile")
-	}
-	if p.write != nil {
-		return p.write(w, debug)
-	}
-
-	// Obtain consistent snapshot under lock; then process without lock.
-	var all [][]uintptr
-	p.mu.Lock()
-	for _, stk := range p.m {
-		all = append(all, stk)
-	}
-	p.mu.Unlock()
-
-	// Map order is non-deterministic; make output deterministic.
-	sort.Sort(stackProfile(all))
-
-	return printCountProfile(w, debug, p.name, stackProfile(all))
-}
-
-type stackProfile [][]uintptr
-
-func (x stackProfile) Len() int              { return len(x) }
-func (x stackProfile) Stack(i int) []uintptr { return x[i] }
-func (x stackProfile) Swap(i, j int)         { x[i], x[j] = x[j], x[i] }
-func (x stackProfile) Less(i, j int) bool {
-	t, u := x[i], x[j]
-	for k := 0; k < len(t) && k < len(u); k++ {
-		if t[k] != u[k] {
-			return t[k] < u[k]
-		}
-	}
-	return len(t) < len(u)
-}
-
-// A countProfile is a set of stack traces to be printed as counts
-// grouped by stack trace.  There are multiple implementations:
-// all that matters is that we can find out how many traces there are
-// and obtain each trace in turn.
-type countProfile interface {
-	Len() int
-	Stack(i int) []uintptr
-}
-
-// printCountProfile prints a countProfile at the specified debug level.
-func printCountProfile(w io.Writer, debug int, name string, p countProfile) error {
-	b := bufio.NewWriter(w)
-	var tw *tabwriter.Writer
-	w = b
-	if debug > 0 {
-		tw = tabwriter.NewWriter(w, 1, 8, 1, '\t', 0)
-		w = tw
-	}
-
-	fmt.Fprintf(w, "%s profile: total %d\n", name, p.Len())
-
-	// Build count of each stack.
-	var buf bytes.Buffer
-	key := func(stk []uintptr) string {
-		buf.Reset()
-		fmt.Fprintf(&buf, "@")
-		for _, pc := range stk {
-			fmt.Fprintf(&buf, " %#x", pc)
-		}
-		return buf.String()
-	}
-	m := map[string]int{}
-	n := p.Len()
-	for i := 0; i < n; i++ {
-		m[key(p.Stack(i))]++
-	}
-
-	// Print stacks, listing count on first occurrence of a unique stack.
-	for i := 0; i < n; i++ {
-		stk := p.Stack(i)
-		s := key(stk)
-		if count := m[s]; count != 0 {
-			fmt.Fprintf(w, "%d %s\n", count, s)
-			if debug > 0 {
-				printStackRecord(w, stk, false)
-			}
-			delete(m, s)
-		}
-	}
-
-	if tw != nil {
-		tw.Flush()
-	}
-	return b.Flush()
-}
-
-// printStackRecord prints the function + source line information
-// for a single stack trace.
-func printStackRecord(w io.Writer, stk []uintptr, allFrames bool) {
-	show := allFrames
-	wasPanic := false
-	for i, pc := range stk {
-		f := runtime.FuncForPC(pc)
-		if f == nil {
-			show = true
-			fmt.Fprintf(w, "#\t%#x\n", pc)
-			wasPanic = false
-		} else {
-			tracepc := pc
-			// Back up to call instruction.
-			if i > 0 && pc > f.Entry() && !wasPanic {
-				if runtime.GOARCH == "386" || runtime.GOARCH == "amd64" {
-					tracepc--
-				} else if runtime.GOARCH == "s390" || runtime.GOARCH == "s390x" {
-					// only works if function was called
-					// with the brasl instruction (or a
-					// different 6-byte instruction).
-					tracepc -= 6
-				} else {
-					tracepc -= 4 // arm, etc
-				}
-			}
-			file, line := f.FileLine(tracepc)
-			name := f.Name()
-			// Hide runtime.goexit and any runtime functions at the beginning.
-			// This is useful mainly for allocation traces.
-			wasPanic = name == "runtime.panic"
-			if name == "runtime.goexit" || !show && (strings.HasPrefix(name, "runtime.") || strings.HasPrefix(name, "runtime_")) {
-				continue
-			}
-			if !show && !strings.Contains(name, ".") && strings.HasPrefix(name, "__go_") {
-				continue
-			}
-			if !show && name == "" {
-				// This can happen due to http://gcc.gnu.org/PR65797.
-				continue
-			}
-			show = true
-			fmt.Fprintf(w, "#\t%#x\t%s+%#x\t%s:%d\n", pc, name, pc-f.Entry(), file, line)
-		}
-	}
-	if !show {
-		// We didn't print anything; do it again,
-		// and this time include runtime functions.
-		printStackRecord(w, stk, true)
-		return
-	}
-	fmt.Fprintf(w, "\n")
-}
-
-// Interface to system profiles.
-
-type byInUseBytes []runtime.MemProfileRecord
-
-func (x byInUseBytes) Len() int           { return len(x) }
-func (x byInUseBytes) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }
-func (x byInUseBytes) Less(i, j int) bool { return x[i].InUseBytes() > x[j].InUseBytes() }
-
-// WriteHeapProfile is shorthand for Lookup("heap").WriteTo(w, 0).
-// It is preserved for backwards compatibility.
-func WriteHeapProfile(w io.Writer) error {
-	return writeHeap(w, 0)
-}
-
-// countHeap returns the number of records in the heap profile.
-func countHeap() int {
-	n, _ := runtime.MemProfile(nil, true)
-	return n
-}
-
-// writeHeap writes the current runtime heap profile to w.
-func writeHeap(w io.Writer, debug int) error {
-	// Find out how many records there are (MemProfile(nil, true)),
-	// allocate that many records, and get the data.
-	// There's a race—more records might be added between
-	// the two calls—so allocate a few extra records for safety
-	// and also try again if we're very unlucky.
-	// The loop should only execute one iteration in the common case.
-	var p []runtime.MemProfileRecord
-	n, ok := runtime.MemProfile(nil, true)
-	for {
-		// Allocate room for a slightly bigger profile,
-		// in case a few more entries have been added
-		// since the call to MemProfile.
-		p = make([]runtime.MemProfileRecord, n+50)
-		n, ok = runtime.MemProfile(p, true)
-		if ok {
-			p = p[0:n]
-			break
-		}
-		// Profile grew; try again.
-	}
-
-	sort.Sort(byInUseBytes(p))
-
-	b := bufio.NewWriter(w)
-	var tw *tabwriter.Writer
-	w = b
-	if debug > 0 {
-		tw = tabwriter.NewWriter(w, 1, 8, 1, '\t', 0)
-		w = tw
-	}
-
-	var total runtime.MemProfileRecord
-	for i := range p {
-		r := &p[i]
-		total.AllocBytes += r.AllocBytes
-		total.AllocObjects += r.AllocObjects
-		total.FreeBytes += r.FreeBytes
-		total.FreeObjects += r.FreeObjects
-	}
-
-	// Technically the rate is MemProfileRate not 2*MemProfileRate,
-	// but early versions of the C++ heap profiler reported 2*MemProfileRate,
-	// so that's what pprof has come to expect.
-	fmt.Fprintf(w, "heap profile: %d: %d [%d: %d] @ heap/%d\n",
-		total.InUseObjects(), total.InUseBytes(),
-		total.AllocObjects, total.AllocBytes,
-		2*runtime.MemProfileRate)
-
-	for i := range p {
-		r := &p[i]
-		fmt.Fprintf(w, "%d: %d [%d: %d] @",
-			r.InUseObjects(), r.InUseBytes(),
-			r.AllocObjects, r.AllocBytes)
-		for _, pc := range r.Stack() {
-			fmt.Fprintf(w, " %#x", pc)
-		}
-		fmt.Fprintf(w, "\n")
-		if debug > 0 {
-			printStackRecord(w, r.Stack(), false)
-		}
-	}
-
-	// Print memstats information too.
-	// Pprof will ignore, but useful for people
-	s := new(runtime.MemStats)
-	runtime.ReadMemStats(s)
-	fmt.Fprintf(w, "\n# runtime.MemStats\n")
-	fmt.Fprintf(w, "# Alloc = %d\n", s.Alloc)
-	fmt.Fprintf(w, "# TotalAlloc = %d\n", s.TotalAlloc)
-	fmt.Fprintf(w, "# Sys = %d\n", s.Sys)
-	fmt.Fprintf(w, "# Lookups = %d\n", s.Lookups)
-	fmt.Fprintf(w, "# Mallocs = %d\n", s.Mallocs)
-	fmt.Fprintf(w, "# Frees = %d\n", s.Frees)
-
-	fmt.Fprintf(w, "# HeapAlloc = %d\n", s.HeapAlloc)
-	fmt.Fprintf(w, "# HeapSys = %d\n", s.HeapSys)
-	fmt.Fprintf(w, "# HeapIdle = %d\n", s.HeapIdle)
-	fmt.Fprintf(w, "# HeapInuse = %d\n", s.HeapInuse)
-	fmt.Fprintf(w, "# HeapReleased = %d\n", s.HeapReleased)
-	fmt.Fprintf(w, "# HeapObjects = %d\n", s.HeapObjects)
-
-	fmt.Fprintf(w, "# Stack = %d / %d\n", s.StackInuse, s.StackSys)
-	fmt.Fprintf(w, "# MSpan = %d / %d\n", s.MSpanInuse, s.MSpanSys)
-	fmt.Fprintf(w, "# MCache = %d / %d\n", s.MCacheInuse, s.MCacheSys)
-	fmt.Fprintf(w, "# BuckHashSys = %d\n", s.BuckHashSys)
-
-	fmt.Fprintf(w, "# NextGC = %d\n", s.NextGC)
-	fmt.Fprintf(w, "# PauseNs = %d\n", s.PauseNs)
-	fmt.Fprintf(w, "# NumGC = %d\n", s.NumGC)
-	fmt.Fprintf(w, "# EnableGC = %v\n", s.EnableGC)
-	fmt.Fprintf(w, "# DebugGC = %v\n", s.DebugGC)
-
-	if tw != nil {
-		tw.Flush()
-	}
-	return b.Flush()
-}
-
-// countThreadCreate returns the size of the current ThreadCreateProfile.
-func countThreadCreate() int {
-	n, _ := runtime.ThreadCreateProfile(nil)
-	return n
-}
-
-// writeThreadCreate writes the current runtime ThreadCreateProfile to w.
-func writeThreadCreate(w io.Writer, debug int) error {
-	return writeRuntimeProfile(w, debug, "threadcreate", runtime.ThreadCreateProfile)
-}
-
-// countGoroutine returns the number of goroutines.
-func countGoroutine() int {
-	return runtime.NumGoroutine()
-}
-
-// writeGoroutine writes the current runtime GoroutineProfile to w.
-func writeGoroutine(w io.Writer, debug int) error {
-	if debug >= 2 {
-		return writeGoroutineStacks(w)
-	}
-	return writeRuntimeProfile(w, debug, "goroutine", runtime.GoroutineProfile)
-}
-
-func writeGoroutineStacks(w io.Writer) error {
-	// We don't know how big the buffer needs to be to collect
-	// all the goroutines.  Start with 1 MB and try a few times, doubling each time.
-	// Give up and use a truncated trace if 64 MB is not enough.
-	buf := make([]byte, 1<<20)
-	for i := 0; ; i++ {
-		n := runtime.Stack(buf, true)
-		if n < len(buf) {
-			buf = buf[:n]
-			break
-		}
-		if len(buf) >= 64<<20 {
-			// Filled 64 MB - stop there.
-			break
-		}
-		buf = make([]byte, 2*len(buf))
-	}
-	_, err := w.Write(buf)
-	return err
-}
-
-func writeRuntimeProfile(w io.Writer, debug int, name string, fetch func([]runtime.StackRecord) (int, bool)) error {
-	// Find out how many records there are (fetch(nil)),
-	// allocate that many records, and get the data.
-	// There's a race—more records might be added between
-	// the two calls—so allocate a few extra records for safety
-	// and also try again if we're very unlucky.
-	// The loop should only execute one iteration in the common case.
-	var p []runtime.StackRecord
-	n, ok := fetch(nil)
-	for {
-		// Allocate room for a slightly bigger profile,
-		// in case a few more entries have been added
-		// since the call to ThreadProfile.
-		p = make([]runtime.StackRecord, n+10)
-		n, ok = fetch(p)
-		if ok {
-			p = p[0:n]
-			break
-		}
-		// Profile grew; try again.
-	}
-
-	return printCountProfile(w, debug, name, runtimeProfile(p))
-}
-
-type runtimeProfile []runtime.StackRecord
-
-func (p runtimeProfile) Len() int              { return len(p) }
-func (p runtimeProfile) Stack(i int) []uintptr { return p[i].Stack() }
-
-var cpu struct {
-	sync.Mutex
-	profiling bool
-	done      chan bool
-}
-
-// StartCPUProfile enables CPU profiling for the current process.
-// While profiling, the profile will be buffered and written to w.
-// StartCPUProfile returns an error if profiling is already enabled.
-func StartCPUProfile(w io.Writer) error {
-	// The runtime routines allow a variable profiling rate,
-	// but in practice operating systems cannot trigger signals
-	// at more than about 500 Hz, and our processing of the
-	// signal is not cheap (mostly getting the stack trace).
-	// 100 Hz is a reasonable choice: it is frequent enough to
-	// produce useful data, rare enough not to bog down the
-	// system, and a nice round number to make it easy to
-	// convert sample counts to seconds.  Instead of requiring
-	// each client to specify the frequency, we hard code it.
-	const hz = 100
-
-	cpu.Lock()
-	defer cpu.Unlock()
-	if cpu.done == nil {
-		cpu.done = make(chan bool)
-	}
-	// Double-check.
-	if cpu.profiling {
-		return fmt.Errorf("cpu profiling already in use")
-	}
-	cpu.profiling = true
-	runtime.SetCPUProfileRate(hz)
-	go profileWriter(w)
-	return nil
-}
-
-func profileWriter(w io.Writer) {
-	for {
-		data := runtime.CPUProfile()
-		if data == nil {
-			break
-		}
-		w.Write(data)
-	}
-	cpu.done <- true
-}
-
-// StopCPUProfile stops the current CPU profile, if any.
-// StopCPUProfile only returns after all the writes for the
-// profile have completed.
-func StopCPUProfile() {
-	cpu.Lock()
-	defer cpu.Unlock()
-
-	if !cpu.profiling {
-		return
-	}
-	cpu.profiling = false
-	runtime.SetCPUProfileRate(0)
-	<-cpu.done
-}
-
-type byCycles []runtime.BlockProfileRecord
-
-func (x byCycles) Len() int           { return len(x) }
-func (x byCycles) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }
-func (x byCycles) Less(i, j int) bool { return x[i].Cycles > x[j].Cycles }
-
-// countBlock returns the number of records in the blocking profile.
-func countBlock() int {
-	n, _ := runtime.BlockProfile(nil)
-	return n
-}
-
-// writeBlock writes the current blocking profile to w.
-func writeBlock(w io.Writer, debug int) error {
-	var p []runtime.BlockProfileRecord
-	n, ok := runtime.BlockProfile(nil)
-	for {
-		p = make([]runtime.BlockProfileRecord, n+50)
-		n, ok = runtime.BlockProfile(p)
-		if ok {
-			p = p[:n]
-			break
-		}
-	}
-
-	sort.Sort(byCycles(p))
-
-	b := bufio.NewWriter(w)
-	var tw *tabwriter.Writer
-	w = b
-	if debug > 0 {
-		tw = tabwriter.NewWriter(w, 1, 8, 1, '\t', 0)
-		w = tw
-	}
-
-	fmt.Fprintf(w, "--- contention:\n")
-	fmt.Fprintf(w, "cycles/second=%v\n", runtime_cyclesPerSecond())
-	for i := range p {
-		r := &p[i]
-		fmt.Fprintf(w, "%v %v @", r.Cycles, r.Count)
-		for _, pc := range r.Stack() {
-			fmt.Fprintf(w, " %#x", pc)
-		}
-		fmt.Fprint(w, "\n")
-		if debug > 0 {
-			printStackRecord(w, r.Stack(), true)
-		}
-	}
-
-	if tw != nil {
-		tw.Flush()
-	}
-	return b.Flush()
-}
-
-func runtime_cyclesPerSecond() int64
diff --git a/third_party/gofrontend/libgo/go/runtime/pprof/pprof_test.go b/third_party/gofrontend/libgo/go/runtime/pprof/pprof_test.go
deleted file mode 100644
index c32b847..0000000
--- a/third_party/gofrontend/libgo/go/runtime/pprof/pprof_test.go
+++ /dev/null
@@ -1,484 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !nacl
-
-package pprof_test
-
-import (
-	"bytes"
-	"fmt"
-	"internal/testenv"
-	"math/big"
-	"os"
-	"os/exec"
-	"regexp"
-	"runtime"
-	. "runtime/pprof"
-	"strings"
-	"sync"
-	"testing"
-	"time"
-	"unsafe"
-)
-
-func cpuHogger(f func()) {
-	// We only need to get one 100 Hz clock tick, so we've got
-	// a 25x safety buffer.
-	// But do at least 500 iterations (which should take about 100ms),
-	// otherwise TestCPUProfileMultithreaded can fail if only one
-	// thread is scheduled during the 250ms period.
-	t0 := time.Now()
-	for i := 0; i < 500 || time.Since(t0) < 250*time.Millisecond; i++ {
-		f()
-	}
-}
-
-var (
-	salt1 = 0
-	salt2 = 0
-)
-
-// The actual CPU hogging function.
-// Must not call other functions nor access heap/globals in the loop,
-// otherwise under race detector the samples will be in the race runtime.
-func cpuHog1() {
-	foo := salt1
-	for i := 0; i < 1e5; i++ {
-		if foo > 0 {
-			foo *= foo
-		} else {
-			foo *= foo + 1
-		}
-	}
-	salt1 = foo
-}
-
-func cpuHog2() {
-	foo := salt2
-	for i := 0; i < 1e5; i++ {
-		if foo > 0 {
-			foo *= foo
-		} else {
-			foo *= foo + 2
-		}
-	}
-	salt2 = foo
-}
-
-func TestCPUProfile(t *testing.T) {
-	testCPUProfile(t, []string{"pprof_test.cpuHog1"}, func() {
-		cpuHogger(cpuHog1)
-	})
-}
-
-func TestCPUProfileMultithreaded(t *testing.T) {
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
-	testCPUProfile(t, []string{"pprof_test.cpuHog1", "pprof_test.cpuHog2"}, func() {
-		c := make(chan int)
-		go func() {
-			cpuHogger(cpuHog1)
-			c <- 1
-		}()
-		cpuHogger(cpuHog2)
-		<-c
-	})
-}
-
-func parseProfile(t *testing.T, bytes []byte, f func(uintptr, []uintptr)) {
-	// Convert []byte to []uintptr.
-	l := len(bytes) / int(unsafe.Sizeof(uintptr(0)))
-	val := *(*[]uintptr)(unsafe.Pointer(&bytes))
-	val = val[:l]
-
-	// 5 for the header, 2 for the per-sample header on at least one sample, 3 for the trailer.
-	if l < 5+2+3 {
-		t.Logf("profile too short: %#x", val)
-		if badOS[runtime.GOOS] {
-			t.Skipf("ignoring failure on %s; see golang.org/issue/6047", runtime.GOOS)
-			return
-		}
-		t.FailNow()
-	}
-
-	hd, val, tl := val[:5], val[5:l-3], val[l-3:]
-	if hd[0] != 0 || hd[1] != 3 || hd[2] != 0 || hd[3] != 1e6/100 || hd[4] != 0 {
-		t.Fatalf("unexpected header %#x", hd)
-	}
-
-	if tl[0] != 0 || tl[1] != 1 || tl[2] != 0 {
-		t.Fatalf("malformed end-of-data marker %#x", tl)
-	}
-
-	for len(val) > 0 {
-		if len(val) < 2 || val[0] < 1 || val[1] < 1 || uintptr(len(val)) < 2+val[1] {
-			t.Fatalf("malformed profile.  leftover: %#x", val)
-		}
-		f(val[0], val[2:2+val[1]])
-		val = val[2+val[1]:]
-	}
-}
-
-func testCPUProfile(t *testing.T, need []string, f func()) {
-	switch runtime.GOOS {
-	case "darwin":
-		switch runtime.GOARCH {
-		case "arm", "arm64":
-			// nothing
-		default:
-			out, err := exec.Command("uname", "-a").CombinedOutput()
-			if err != nil {
-				t.Fatal(err)
-			}
-			vers := string(out)
-			t.Logf("uname -a: %v", vers)
-		}
-	case "plan9":
-		t.Skip("skipping on plan9")
-	}
-
-	var prof bytes.Buffer
-	if err := StartCPUProfile(&prof); err != nil {
-		t.Fatal(err)
-	}
-	f()
-	StopCPUProfile()
-
-	// Check that profile is well formed and contains need.
-	have := make([]uintptr, len(need))
-	var samples uintptr
-	parseProfile(t, prof.Bytes(), func(count uintptr, stk []uintptr) {
-		samples += count
-		for _, pc := range stk {
-			f := runtime.FuncForPC(pc)
-			if f == nil {
-				continue
-			}
-			t.Log(f.Name(), count)
-			for i, name := range need {
-				if strings.Contains(f.Name(), name) {
-					have[i] += count
-				}
-			}
-		}
-	})
-	t.Logf("total %d CPU profile samples collected", samples)
-
-	if samples < 10 && runtime.GOOS == "windows" {
-		// On some windows machines we end up with
-		// not enough samples due to coarse timer
-		// resolution. Let it go.
-		t.Skip("too few samples on Windows (golang.org/issue/10842)")
-	}
-
-	if len(need) == 0 {
-		return
-	}
-
-	var total uintptr
-	for i, name := range need {
-		total += have[i]
-		t.Logf("%s: %d\n", name, have[i])
-	}
-	ok := true
-	if total == 0 {
-		t.Logf("no CPU profile samples collected")
-		ok = false
-	}
-	// We'd like to check a reasonable minimum, like
-	// total / len(have) / smallconstant, but this test is
-	// pretty flaky (see bug 7095).  So we'll just test to
-	// make sure we got at least one sample.
-	min := uintptr(1)
-	for i, name := range need {
-		if have[i] < min {
-			t.Logf("%s has %d samples out of %d, want at least %d, ideally %d", name, have[i], total, min, total/uintptr(len(have)))
-			ok = false
-		}
-	}
-
-	if !ok {
-		if badOS[runtime.GOOS] {
-			t.Skipf("ignoring failure on %s; see golang.org/issue/6047", runtime.GOOS)
-			return
-		}
-		// Ignore the failure if the tests are running in a QEMU-based emulator,
-		// QEMU is not perfect at emulating everything.
-		// IN_QEMU environmental variable is set by some of the Go builders.
-		// IN_QEMU=1 indicates that the tests are running in QEMU. See issue 9605.
-		if os.Getenv("IN_QEMU") == "1" {
-			t.Skip("ignore the failure in QEMU; see golang.org/issue/9605")
-			return
-		}
-		t.FailNow()
-	}
-}
-
-// Fork can hang if preempted with signals frequently enough (see issue 5517).
-// Ensure that we do not do this.
-func TestCPUProfileWithFork(t *testing.T) {
-	testenv.MustHaveExec(t)
-
-	heap := 1 << 30
-	if runtime.GOOS == "android" {
-		// Use smaller size for Android to avoid crash.
-		heap = 100 << 20
-	}
-	if testing.Short() {
-		heap = 100 << 20
-	}
-	// This makes fork slower.
-	garbage := make([]byte, heap)
-	// Need to touch the slice, otherwise it won't be paged in.
-	done := make(chan bool)
-	go func() {
-		for i := range garbage {
-			garbage[i] = 42
-		}
-		done <- true
-	}()
-	<-done
-
-	var prof bytes.Buffer
-	if err := StartCPUProfile(&prof); err != nil {
-		t.Fatal(err)
-	}
-	defer StopCPUProfile()
-
-	for i := 0; i < 10; i++ {
-		exec.Command(os.Args[0], "-h").CombinedOutput()
-	}
-}
-
-// Test that profiler does not observe runtime.gogo as "user" goroutine execution.
-// If it did, it would see inconsistent state and would either record an incorrect stack
-// or crash because the stack was malformed.
-func TestGoroutineSwitch(t *testing.T) {
-	// How much to try. These defaults take about 1 seconds
-	// on a 2012 MacBook Pro. The ones in short mode take
-	// about 0.1 seconds.
-	tries := 10
-	count := 1000000
-	if testing.Short() {
-		tries = 1
-	}
-	for try := 0; try < tries; try++ {
-		var prof bytes.Buffer
-		if err := StartCPUProfile(&prof); err != nil {
-			t.Fatal(err)
-		}
-		for i := 0; i < count; i++ {
-			runtime.Gosched()
-		}
-		StopCPUProfile()
-
-		// Read profile to look for entries for runtime.gogo with an attempt at a traceback.
-		// The special entry
-		parseProfile(t, prof.Bytes(), func(count uintptr, stk []uintptr) {
-			// An entry with two frames with 'System' in its top frame
-			// exists to record a PC without a traceback. Those are okay.
-			if len(stk) == 2 {
-				f := runtime.FuncForPC(stk[1])
-				if f != nil && (f.Name() == "runtime._System" || f.Name() == "runtime._ExternalCode" || f.Name() == "runtime._GC") {
-					return
-				}
-			}
-
-			// Otherwise, should not see runtime.gogo.
-			// The place we'd see it would be the inner most frame.
-			f := runtime.FuncForPC(stk[0])
-			if f != nil && f.Name() == "runtime.gogo" {
-				var buf bytes.Buffer
-				for _, pc := range stk {
-					f := runtime.FuncForPC(pc)
-					if f == nil {
-						fmt.Fprintf(&buf, "%#x ?:0\n", pc)
-					} else {
-						file, line := f.FileLine(pc)
-						fmt.Fprintf(&buf, "%#x %s:%d\n", pc, file, line)
-					}
-				}
-				t.Fatalf("found profile entry for runtime.gogo:\n%s", buf.String())
-			}
-		})
-	}
-}
-
-// Test that profiling of division operations is okay, especially on ARM. See issue 6681.
-func TestMathBigDivide(t *testing.T) {
-	testCPUProfile(t, nil, func() {
-		t := time.After(5 * time.Second)
-		pi := new(big.Int)
-		for {
-			for i := 0; i < 100; i++ {
-				n := big.NewInt(2646693125139304345)
-				d := big.NewInt(842468587426513207)
-				pi.Div(n, d)
-			}
-			select {
-			case <-t:
-				return
-			default:
-			}
-		}
-	})
-}
-
-// Operating systems that are expected to fail the tests. See issue 6047.
-var badOS = map[string]bool{
-	"darwin": true,
-	"netbsd": true,
-	"plan9":  true,
-}
-
-func TestBlockProfile(t *testing.T) {
-	t.Skip("lots of details are different for gccgo; FIXME")
-	type TestCase struct {
-		name string
-		f    func()
-		re   string
-	}
-	tests := [...]TestCase{
-		{"chan recv", blockChanRecv, `
-[0-9]+ [0-9]+ @ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+
-#	0x[0-9,a-f]+	runtime\.chanrecv1\+0x[0-9,a-f]+	.*/src/runtime/chan.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.blockChanRecv\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.TestBlockProfile\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-`},
-		{"chan send", blockChanSend, `
-[0-9]+ [0-9]+ @ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+
-#	0x[0-9,a-f]+	runtime\.chansend1\+0x[0-9,a-f]+	.*/src/runtime/chan.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.blockChanSend\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.TestBlockProfile\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-`},
-		{"chan close", blockChanClose, `
-[0-9]+ [0-9]+ @ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+
-#	0x[0-9,a-f]+	runtime\.chanrecv1\+0x[0-9,a-f]+	.*/src/runtime/chan.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.blockChanClose\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.TestBlockProfile\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-`},
-		{"select recv async", blockSelectRecvAsync, `
-[0-9]+ [0-9]+ @ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+
-#	0x[0-9,a-f]+	runtime\.selectgo\+0x[0-9,a-f]+	.*/src/runtime/select.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.blockSelectRecvAsync\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.TestBlockProfile\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-`},
-		{"select send sync", blockSelectSendSync, `
-[0-9]+ [0-9]+ @ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+
-#	0x[0-9,a-f]+	runtime\.selectgo\+0x[0-9,a-f]+	.*/src/runtime/select.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.blockSelectSendSync\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.TestBlockProfile\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-`},
-		{"mutex", blockMutex, `
-[0-9]+ [0-9]+ @ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+
-#	0x[0-9,a-f]+	sync\.\(\*Mutex\)\.Lock\+0x[0-9,a-f]+	.*/src/sync/mutex\.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.blockMutex\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.TestBlockProfile\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-`},
-		{"cond", blockCond, `
-[0-9]+ [0-9]+ @ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+
-#	0x[0-9,a-f]+	sync\.\(\*Cond\)\.Wait\+0x[0-9,a-f]+	.*/src/sync/cond\.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.blockCond\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-#	0x[0-9,a-f]+	runtime/pprof_test\.TestBlockProfile\+0x[0-9,a-f]+	.*/src/runtime/pprof/pprof_test.go:[0-9]+
-`},
-	}
-
-	runtime.SetBlockProfileRate(1)
-	defer runtime.SetBlockProfileRate(0)
-	for _, test := range tests {
-		test.f()
-	}
-	var w bytes.Buffer
-	Lookup("block").WriteTo(&w, 1)
-	prof := w.String()
-
-	if !strings.HasPrefix(prof, "--- contention:\ncycles/second=") {
-		t.Fatalf("Bad profile header:\n%v", prof)
-	}
-
-	for _, test := range tests {
-		if !regexp.MustCompile(strings.Replace(test.re, "\t", "\t+", -1)).MatchString(prof) {
-			t.Fatalf("Bad %v entry, expect:\n%v\ngot:\n%v", test.name, test.re, prof)
-		}
-	}
-}
-
-const blockDelay = 10 * time.Millisecond
-
-func blockChanRecv() {
-	c := make(chan bool)
-	go func() {
-		time.Sleep(blockDelay)
-		c <- true
-	}()
-	<-c
-}
-
-func blockChanSend() {
-	c := make(chan bool)
-	go func() {
-		time.Sleep(blockDelay)
-		<-c
-	}()
-	c <- true
-}
-
-func blockChanClose() {
-	c := make(chan bool)
-	go func() {
-		time.Sleep(blockDelay)
-		close(c)
-	}()
-	<-c
-}
-
-func blockSelectRecvAsync() {
-	c := make(chan bool, 1)
-	c2 := make(chan bool, 1)
-	go func() {
-		time.Sleep(blockDelay)
-		c <- true
-	}()
-	select {
-	case <-c:
-	case <-c2:
-	}
-}
-
-func blockSelectSendSync() {
-	c := make(chan bool)
-	c2 := make(chan bool)
-	go func() {
-		time.Sleep(blockDelay)
-		<-c
-	}()
-	select {
-	case c <- true:
-	case c2 <- true:
-	}
-}
-
-func blockMutex() {
-	var mu sync.Mutex
-	mu.Lock()
-	go func() {
-		time.Sleep(blockDelay)
-		mu.Unlock()
-	}()
-	mu.Lock()
-}
-
-func blockCond() {
-	var mu sync.Mutex
-	c := sync.NewCond(&mu)
-	mu.Lock()
-	go func() {
-		time.Sleep(blockDelay)
-		mu.Lock()
-		c.Signal()
-		mu.Unlock()
-	}()
-	c.Wait()
-	mu.Unlock()
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/proc_test.go b/third_party/gofrontend/libgo/go/runtime/proc_test.go
deleted file mode 100644
index 4350e8f..0000000
--- a/third_party/gofrontend/libgo/go/runtime/proc_test.go
+++ /dev/null
@@ -1,616 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"math"
-	"runtime"
-	"runtime/debug"
-	"sync"
-	"sync/atomic"
-	"syscall"
-	"testing"
-	"time"
-)
-
-var stop = make(chan bool, 1)
-
-func perpetuumMobile() {
-	select {
-	case <-stop:
-	default:
-		go perpetuumMobile()
-	}
-}
-
-func TestStopTheWorldDeadlock(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping during short test")
-	}
-	maxprocs := runtime.GOMAXPROCS(3)
-	compl := make(chan bool, 2)
-	go func() {
-		for i := 0; i != 1000; i += 1 {
-			runtime.GC()
-		}
-		compl <- true
-	}()
-	go func() {
-		for i := 0; i != 1000; i += 1 {
-			runtime.GOMAXPROCS(3)
-		}
-		compl <- true
-	}()
-	go perpetuumMobile()
-	<-compl
-	<-compl
-	stop <- true
-	runtime.GOMAXPROCS(maxprocs)
-}
-
-func TestYieldProgress(t *testing.T) {
-	testYieldProgress(t, false)
-}
-
-func TestYieldLockedProgress(t *testing.T) {
-	testYieldProgress(t, true)
-}
-
-func testYieldProgress(t *testing.T, locked bool) {
-	c := make(chan bool)
-	cack := make(chan bool)
-	go func() {
-		if locked {
-			runtime.LockOSThread()
-		}
-		for {
-			select {
-			case <-c:
-				cack <- true
-				return
-			default:
-				runtime.Gosched()
-			}
-		}
-	}()
-	time.Sleep(10 * time.Millisecond)
-	c <- true
-	<-cack
-}
-
-func TestYieldLocked(t *testing.T) {
-	const N = 10
-	c := make(chan bool)
-	go func() {
-		runtime.LockOSThread()
-		for i := 0; i < N; i++ {
-			runtime.Gosched()
-			time.Sleep(time.Millisecond)
-		}
-		c <- true
-		// runtime.UnlockOSThread() is deliberately omitted
-	}()
-	<-c
-}
-
-func TestGoroutineParallelism(t *testing.T) {
-	if runtime.NumCPU() == 1 {
-		// Takes too long, too easy to deadlock, etc.
-		t.Skip("skipping on uniprocessor")
-	}
-	P := 4
-	N := 10
-	if testing.Short() {
-		P = 3
-		N = 3
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(P))
-	// If runtime triggers a forced GC during this test then it will deadlock,
-	// since the goroutines can't be stopped/preempted.
-	// Disable GC for this test (see issue #10958).
-	defer debug.SetGCPercent(debug.SetGCPercent(-1))
-	for try := 0; try < N; try++ {
-		done := make(chan bool)
-		x := uint32(0)
-		for p := 0; p < P; p++ {
-			// Test that all P goroutines are scheduled at the same time
-			go func(p int) {
-				for i := 0; i < 3; i++ {
-					expected := uint32(P*i + p)
-					for atomic.LoadUint32(&x) != expected {
-					}
-					atomic.StoreUint32(&x, expected+1)
-				}
-				done <- true
-			}(p)
-		}
-		for p := 0; p < P; p++ {
-			<-done
-		}
-	}
-}
-
-func TestBlockLocked(t *testing.T) {
-	const N = 10
-	c := make(chan bool)
-	go func() {
-		runtime.LockOSThread()
-		for i := 0; i < N; i++ {
-			c <- true
-		}
-		runtime.UnlockOSThread()
-	}()
-	for i := 0; i < N; i++ {
-		<-c
-	}
-}
-
-func TestTimerFairness(t *testing.T) {
-	done := make(chan bool)
-	c := make(chan bool)
-	for i := 0; i < 2; i++ {
-		go func() {
-			for {
-				select {
-				case c <- true:
-				case <-done:
-					return
-				}
-			}
-		}()
-	}
-
-	timer := time.After(20 * time.Millisecond)
-	for {
-		select {
-		case <-c:
-		case <-timer:
-			close(done)
-			return
-		}
-	}
-}
-
-func TestTimerFairness2(t *testing.T) {
-	done := make(chan bool)
-	c := make(chan bool)
-	for i := 0; i < 2; i++ {
-		go func() {
-			timer := time.After(20 * time.Millisecond)
-			var buf [1]byte
-			for {
-				syscall.Read(0, buf[0:0])
-				select {
-				case c <- true:
-				case <-c:
-				case <-timer:
-					done <- true
-					return
-				}
-			}
-		}()
-	}
-	<-done
-	<-done
-}
-
-// The function is used to test preemption at split stack checks.
-// Declaring a var avoids inlining at the call site.
-var preempt = func() int {
-	var a [128]int
-	sum := 0
-	for _, v := range a {
-		sum += v
-	}
-	return sum
-}
-
-func TestPreemption(t *testing.T) {
-	t.Skip("gccgo does not implement preemption")
-	// Test that goroutines are preempted at function calls.
-	N := 5
-	if testing.Short() {
-		N = 2
-	}
-	c := make(chan bool)
-	var x uint32
-	for g := 0; g < 2; g++ {
-		go func(g int) {
-			for i := 0; i < N; i++ {
-				for atomic.LoadUint32(&x) != uint32(g) {
-					preempt()
-				}
-				atomic.StoreUint32(&x, uint32(1-g))
-			}
-			c <- true
-		}(g)
-	}
-	<-c
-	<-c
-}
-
-func TestPreemptionGC(t *testing.T) {
-	t.Skip("gccgo does not implement preemption")
-	// Test that pending GC preempts running goroutines.
-	P := 5
-	N := 10
-	if testing.Short() {
-		P = 3
-		N = 2
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(P + 1))
-	var stop uint32
-	for i := 0; i < P; i++ {
-		go func() {
-			for atomic.LoadUint32(&stop) == 0 {
-				preempt()
-			}
-		}()
-	}
-	for i := 0; i < N; i++ {
-		runtime.Gosched()
-		runtime.GC()
-	}
-	atomic.StoreUint32(&stop, 1)
-}
-
-func TestGCFairness(t *testing.T) {
-	output := executeTest(t, testGCFairnessSource, nil)
-	want := "OK\n"
-	if output != want {
-		t.Fatalf("want %s, got %s\n", want, output)
-	}
-}
-
-const testGCFairnessSource = `
-package main
-
-import (
-	"fmt"
-	"os"
-	"runtime"
-	"time"
-)
-
-func main() {
-	runtime.GOMAXPROCS(1)
-	f, err := os.Open("/dev/null")
-	if os.IsNotExist(err) {
-		// This test tests what it is intended to test only if writes are fast.
-		// If there is no /dev/null, we just don't execute the test.
-		fmt.Println("OK")
-		return
-	}
-	if err != nil {
-		fmt.Println(err)
-		os.Exit(1)
-	}
-	for i := 0; i < 2; i++ {
-		go func() {
-			for {
-				f.Write([]byte("."))
-			}
-		}()
-	}
-	time.Sleep(10 * time.Millisecond)
-	fmt.Println("OK")
-}
-`
-
-func TestPingPongHog(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in -short mode")
-	}
-
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1))
-	done := make(chan bool)
-	hogChan, lightChan := make(chan bool), make(chan bool)
-	hogCount, lightCount := 0, 0
-
-	run := func(limit int, counter *int, wake chan bool) {
-		for {
-			select {
-			case <-done:
-				return
-
-			case <-wake:
-				for i := 0; i < limit; i++ {
-					*counter++
-				}
-				wake <- true
-			}
-		}
-	}
-
-	// Start two co-scheduled hog goroutines.
-	for i := 0; i < 2; i++ {
-		go run(1e6, &hogCount, hogChan)
-	}
-
-	// Start two co-scheduled light goroutines.
-	for i := 0; i < 2; i++ {
-		go run(1e3, &lightCount, lightChan)
-	}
-
-	// Start goroutine pairs and wait for a few preemption rounds.
-	hogChan <- true
-	lightChan <- true
-	time.Sleep(100 * time.Millisecond)
-	close(done)
-	<-hogChan
-	<-lightChan
-
-	// Check that hogCount and lightCount are within a factor of
-	// 2, which indicates that both pairs of goroutines handed off
-	// the P within a time-slice to their buddy.
-	if hogCount > lightCount*2 || lightCount > hogCount*2 {
-		t.Fatalf("want hogCount/lightCount in [0.5, 2]; got %d/%d = %g", hogCount, lightCount, float64(hogCount)/float64(lightCount))
-	}
-}
-
-func BenchmarkPingPongHog(b *testing.B) {
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1))
-
-	// Create a CPU hog
-	stop, done := make(chan bool), make(chan bool)
-	go func() {
-		for {
-			select {
-			case <-stop:
-				done <- true
-				return
-			default:
-			}
-		}
-	}()
-
-	// Ping-pong b.N times
-	ping, pong := make(chan bool), make(chan bool)
-	go func() {
-		for j := 0; j < b.N; j++ {
-			pong <- <-ping
-		}
-		close(stop)
-		done <- true
-	}()
-	go func() {
-		for i := 0; i < b.N; i++ {
-			ping <- <-pong
-		}
-		done <- true
-	}()
-	b.ResetTimer()
-	ping <- true // Start ping-pong
-	<-stop
-	b.StopTimer()
-	<-ping // Let last ponger exit
-	<-done // Make sure goroutines exit
-	<-done
-	<-done
-}
-
-func stackGrowthRecursive(i int) {
-	var pad [128]uint64
-	if i != 0 && pad[0] == 0 {
-		stackGrowthRecursive(i - 1)
-	}
-}
-
-func TestPreemptSplitBig(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in -short mode")
-	}
-	t.Skip("gccgo does not implement preemption")
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
-	stop := make(chan int)
-	go big(stop)
-	for i := 0; i < 3; i++ {
-		time.Sleep(10 * time.Microsecond) // let big start running
-		runtime.GC()
-	}
-	close(stop)
-}
-
-func big(stop chan int) int {
-	n := 0
-	for {
-		// delay so that gc is sure to have asked for a preemption
-		for i := 0; i < 1e9; i++ {
-			n++
-		}
-
-		// call bigframe, which used to miss the preemption in its prologue.
-		bigframe(stop)
-
-		// check if we've been asked to stop.
-		select {
-		case <-stop:
-			return n
-		}
-	}
-}
-
-func bigframe(stop chan int) int {
-	// not splitting the stack will overflow.
-	// small will notice that it needs a stack split and will
-	// catch the overflow.
-	var x [8192]byte
-	return small(stop, &x)
-}
-
-func small(stop chan int, x *[8192]byte) int {
-	for i := range x {
-		x[i] = byte(i)
-	}
-	sum := 0
-	for i := range x {
-		sum += int(x[i])
-	}
-
-	// keep small from being a leaf function, which might
-	// make it not do any stack check at all.
-	nonleaf(stop)
-
-	return sum
-}
-
-func nonleaf(stop chan int) bool {
-	// do something that won't be inlined:
-	select {
-	case <-stop:
-		return true
-	default:
-		return false
-	}
-}
-
-/*
-func TestSchedLocalQueue(t *testing.T) {
-	runtime.TestSchedLocalQueue1()
-}
-*/
-
-/*
-func TestSchedLocalQueueSteal(t *testing.T) {
-	runtime.TestSchedLocalQueueSteal1()
-}
-*/
-
-func benchmarkStackGrowth(b *testing.B, rec int) {
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			stackGrowthRecursive(rec)
-		}
-	})
-}
-
-func BenchmarkStackGrowth(b *testing.B) {
-	benchmarkStackGrowth(b, 10)
-}
-
-func BenchmarkStackGrowthDeep(b *testing.B) {
-	benchmarkStackGrowth(b, 1024)
-}
-
-func BenchmarkCreateGoroutines(b *testing.B) {
-	benchmarkCreateGoroutines(b, 1)
-}
-
-func BenchmarkCreateGoroutinesParallel(b *testing.B) {
-	benchmarkCreateGoroutines(b, runtime.GOMAXPROCS(-1))
-}
-
-func benchmarkCreateGoroutines(b *testing.B, procs int) {
-	c := make(chan bool)
-	var f func(n int)
-	f = func(n int) {
-		if n == 0 {
-			c <- true
-			return
-		}
-		go f(n - 1)
-	}
-	for i := 0; i < procs; i++ {
-		go f(b.N / procs)
-	}
-	for i := 0; i < procs; i++ {
-		<-c
-	}
-}
-
-func BenchmarkCreateGoroutinesCapture(b *testing.B) {
-	b.ReportAllocs()
-	for i := 0; i < b.N; i++ {
-		const N = 4
-		var wg sync.WaitGroup
-		wg.Add(N)
-		for i := 0; i < N; i++ {
-			i := i
-			go func() {
-				if i >= N {
-					b.Logf("bad") // just to capture b
-				}
-				wg.Done()
-			}()
-		}
-		wg.Wait()
-	}
-}
-
-func BenchmarkClosureCall(b *testing.B) {
-	sum := 0
-	off1 := 1
-	for i := 0; i < b.N; i++ {
-		off2 := 2
-		func() {
-			sum += i + off1 + off2
-		}()
-	}
-	_ = sum
-}
-
-type Matrix [][]float64
-
-func BenchmarkMatmult(b *testing.B) {
-	b.StopTimer()
-	// matmult is O(N**3) but testing expects O(b.N),
-	// so we need to take cube root of b.N
-	n := int(math.Cbrt(float64(b.N))) + 1
-	A := makeMatrix(n)
-	B := makeMatrix(n)
-	C := makeMatrix(n)
-	b.StartTimer()
-	matmult(nil, A, B, C, 0, n, 0, n, 0, n, 8)
-}
-
-func makeMatrix(n int) Matrix {
-	m := make(Matrix, n)
-	for i := 0; i < n; i++ {
-		m[i] = make([]float64, n)
-		for j := 0; j < n; j++ {
-			m[i][j] = float64(i*n + j)
-		}
-	}
-	return m
-}
-
-func matmult(done chan<- struct{}, A, B, C Matrix, i0, i1, j0, j1, k0, k1, threshold int) {
-	di := i1 - i0
-	dj := j1 - j0
-	dk := k1 - k0
-	if di >= dj && di >= dk && di >= threshold {
-		// divide in two by y axis
-		mi := i0 + di/2
-		done1 := make(chan struct{}, 1)
-		go matmult(done1, A, B, C, i0, mi, j0, j1, k0, k1, threshold)
-		matmult(nil, A, B, C, mi, i1, j0, j1, k0, k1, threshold)
-		<-done1
-	} else if dj >= dk && dj >= threshold {
-		// divide in two by x axis
-		mj := j0 + dj/2
-		done1 := make(chan struct{}, 1)
-		go matmult(done1, A, B, C, i0, i1, j0, mj, k0, k1, threshold)
-		matmult(nil, A, B, C, i0, i1, mj, j1, k0, k1, threshold)
-		<-done1
-	} else if dk >= threshold {
-		// divide in two by "k" axis
-		// deliberately not parallel because of data races
-		mk := k0 + dk/2
-		matmult(nil, A, B, C, i0, i1, j0, j1, k0, mk, threshold)
-		matmult(nil, A, B, C, i0, i1, j0, j1, mk, k1, threshold)
-	} else {
-		// the matrices are small enough, compute directly
-		for i := i0; i < i1; i++ {
-			for j := j0; j < j1; j++ {
-				for k := k0; k < k1; k++ {
-					C[i][j] += A[i][k] * B[k][j]
-				}
-			}
-		}
-	}
-	if done != nil {
-		done <- struct{}{}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/runtime_test.go b/third_party/gofrontend/libgo/go/runtime/runtime_test.go
deleted file mode 100644
index bb8ff71..0000000
--- a/third_party/gofrontend/libgo/go/runtime/runtime_test.go
+++ /dev/null
@@ -1,305 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"io"
-	. "runtime"
-	"runtime/debug"
-	"testing"
-	"unsafe"
-)
-
-var errf error
-
-func errfn() error {
-	return errf
-}
-
-func errfn1() error {
-	return io.EOF
-}
-
-func BenchmarkIfaceCmp100(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		for j := 0; j < 100; j++ {
-			if errfn() == io.EOF {
-				b.Fatal("bad comparison")
-			}
-		}
-	}
-}
-
-func BenchmarkIfaceCmpNil100(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		for j := 0; j < 100; j++ {
-			if errfn1() == nil {
-				b.Fatal("bad comparison")
-			}
-		}
-	}
-}
-
-func BenchmarkDefer(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		defer1()
-	}
-}
-
-func defer1() {
-	defer func(x, y, z int) {
-		if recover() != nil || x != 1 || y != 2 || z != 3 {
-			panic("bad recover")
-		}
-	}(1, 2, 3)
-	return
-}
-
-func BenchmarkDefer10(b *testing.B) {
-	for i := 0; i < b.N/10; i++ {
-		defer2()
-	}
-}
-
-func defer2() {
-	for i := 0; i < 10; i++ {
-		defer func(x, y, z int) {
-			if recover() != nil || x != 1 || y != 2 || z != 3 {
-				panic("bad recover")
-			}
-		}(1, 2, 3)
-	}
-}
-
-func BenchmarkDeferMany(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		defer func(x, y, z int) {
-			if recover() != nil || x != 1 || y != 2 || z != 3 {
-				panic("bad recover")
-			}
-		}(1, 2, 3)
-	}
-}
-
-// golang.org/issue/7063
-func TestStopCPUProfilingWithProfilerOff(t *testing.T) {
-	SetCPUProfileRate(0)
-}
-
-// Addresses to test for faulting behavior.
-// This is less a test of SetPanicOnFault and more a check that
-// the operating system and the runtime can process these faults
-// correctly. That is, we're indirectly testing that without SetPanicOnFault
-// these would manage to turn into ordinary crashes.
-// Note that these are truncated on 32-bit systems, so the bottom 32 bits
-// of the larger addresses must themselves be invalid addresses.
-// We might get unlucky and the OS might have mapped one of these
-// addresses, but probably not: they're all in the first page, very high
-// adderesses that normally an OS would reserve for itself, or malformed
-// addresses. Even so, we might have to remove one or two on different
-// systems. We will see.
-
-var faultAddrs = []uint64{
-	// low addresses
-	0,
-	1,
-	0xfff,
-	// high (kernel) addresses
-	// or else malformed.
-	0xffffffffffffffff,
-	0xfffffffffffff001,
-	0xffffffffffff0001,
-	0xfffffffffff00001,
-	0xffffffffff000001,
-	0xfffffffff0000001,
-	0xffffffff00000001,
-	0xfffffff000000001,
-	0xffffff0000000001,
-	0xfffff00000000001,
-	0xffff000000000001,
-	0xfff0000000000001,
-	0xff00000000000001,
-	0xf000000000000001,
-	0x8000000000000001,
-}
-
-func TestSetPanicOnFault(t *testing.T) {
-	old := debug.SetPanicOnFault(true)
-	defer debug.SetPanicOnFault(old)
-
-	nfault := 0
-	for _, addr := range faultAddrs {
-		testSetPanicOnFault(t, uintptr(addr), &nfault)
-	}
-	if nfault == 0 {
-		t.Fatalf("none of the addresses faulted")
-	}
-}
-
-func testSetPanicOnFault(t *testing.T, addr uintptr, nfault *int) {
-	if GOOS == "nacl" {
-		t.Skip("nacl doesn't seem to fault on high addresses")
-	}
-
-	defer func() {
-		if err := recover(); err != nil {
-			*nfault++
-		}
-	}()
-
-	// The read should fault, except that sometimes we hit
-	// addresses that have had C or kernel pages mapped there
-	// readable by user code. So just log the content.
-	// If no addresses fault, we'll fail the test.
-	v := *(*byte)(unsafe.Pointer(addr))
-	t.Logf("addr %#x: %#x\n", addr, v)
-}
-
-func eqstring_generic(s1, s2 string) bool {
-	if len(s1) != len(s2) {
-		return false
-	}
-	// optimization in assembly versions:
-	// if s1.str == s2.str { return true }
-	for i := 0; i < len(s1); i++ {
-		if s1[i] != s2[i] {
-			return false
-		}
-	}
-	return true
-}
-
-func TestEqString(t *testing.T) {
-	// This isn't really an exhaustive test of eqstring, it's
-	// just a convenient way of documenting (via eqstring_generic)
-	// what eqstring does.
-	s := []string{
-		"",
-		"a",
-		"c",
-		"aaa",
-		"ccc",
-		"cccc"[:3], // same contents, different string
-		"1234567890",
-	}
-	for _, s1 := range s {
-		for _, s2 := range s {
-			x := s1 == s2
-			y := eqstring_generic(s1, s2)
-			if x != y {
-				t.Errorf(`eqstring("%s","%s") = %t, want %t`, s1, s2, x, y)
-			}
-		}
-	}
-}
-
-/*
-func TestTrailingZero(t *testing.T) {
-	// make sure we add padding for structs with trailing zero-sized fields
-	type T1 struct {
-		n int32
-		z [0]byte
-	}
-	if unsafe.Sizeof(T1{}) != 8 {
-		t.Errorf("sizeof(%#v)==%d, want 8", T1{}, unsafe.Sizeof(T1{}))
-	}
-	type T2 struct {
-		n int64
-		z struct{}
-	}
-	if unsafe.Sizeof(T2{}) != 8+unsafe.Sizeof(Uintreg(0)) {
-		t.Errorf("sizeof(%#v)==%d, want %d", T2{}, unsafe.Sizeof(T2{}), 8+unsafe.Sizeof(Uintreg(0)))
-	}
-	type T3 struct {
-		n byte
-		z [4]struct{}
-	}
-	if unsafe.Sizeof(T3{}) != 2 {
-		t.Errorf("sizeof(%#v)==%d, want 2", T3{}, unsafe.Sizeof(T3{}))
-	}
-	// make sure padding can double for both zerosize and alignment
-	type T4 struct {
-		a int32
-		b int16
-		c int8
-		z struct{}
-	}
-	if unsafe.Sizeof(T4{}) != 8 {
-		t.Errorf("sizeof(%#v)==%d, want 8", T4{}, unsafe.Sizeof(T4{}))
-	}
-	// make sure we don't pad a zero-sized thing
-	type T5 struct {
-	}
-	if unsafe.Sizeof(T5{}) != 0 {
-		t.Errorf("sizeof(%#v)==%d, want 0", T5{}, unsafe.Sizeof(T5{}))
-	}
-}
-*/
-
-func TestBadOpen(t *testing.T) {
-	if GOOS == "windows" || GOOS == "nacl" {
-		t.Skip("skipping OS that doesn't have open/read/write/close")
-	}
-	// make sure we get the correct error code if open fails.  Same for
-	// read/write/close on the resulting -1 fd.  See issue 10052.
-	nonfile := []byte("/notreallyafile")
-	fd := Open(&nonfile[0], 0, 0)
-	if fd != -1 {
-		t.Errorf("open(\"%s\")=%d, want -1", string(nonfile), fd)
-	}
-	var buf [32]byte
-	r := Read(-1, unsafe.Pointer(&buf[0]), int32(len(buf)))
-	if r != -1 {
-		t.Errorf("read()=%d, want -1", r)
-	}
-	w := Write(^uintptr(0), unsafe.Pointer(&buf[0]), int32(len(buf)))
-	if w != -1 {
-		t.Errorf("write()=%d, want -1", w)
-	}
-	c := Close(-1)
-	if c != -1 {
-		t.Errorf("close()=%d, want -1", c)
-	}
-}
-
-func TestAppendGrowth(t *testing.T) {
-	var x []int64
-	check := func(want int) {
-		if cap(x) != want {
-			t.Errorf("len=%d, cap=%d, want cap=%d", len(x), cap(x), want)
-		}
-	}
-
-	check(0)
-	want := 1
-	for i := 1; i <= 100; i++ {
-		x = append(x, 1)
-		check(want)
-		if i&(i-1) == 0 {
-			want = 2 * i
-		}
-	}
-}
-
-var One = []int64{1}
-
-func TestAppendSliceGrowth(t *testing.T) {
-	var x []int64
-	check := func(want int) {
-		if cap(x) != want {
-			t.Errorf("len=%d, cap=%d, want cap=%d", len(x), cap(x), want)
-		}
-	}
-
-	check(0)
-	want := 1
-	for i := 1; i <= 100; i++ {
-		x = append(x, One...)
-		check(want)
-		if i&(i-1) == 0 {
-			want = 2 * i
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/runtime_unix_test.go b/third_party/gofrontend/libgo/go/runtime/runtime_unix_test.go
deleted file mode 100644
index cfec332..0000000
--- a/third_party/gofrontend/libgo/go/runtime/runtime_unix_test.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Only works on systems with syscall.Close.
-// We need a fast system call to provoke the race,
-// and Close(-1) is nearly universally fast.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd plan9
-
-package runtime_test
-
-import (
-	"runtime"
-	"sync"
-	"sync/atomic"
-	"syscall"
-	"testing"
-)
-
-func TestGoroutineProfile(t *testing.T) {
-	// GoroutineProfile used to use the wrong starting sp for
-	// goroutines coming out of system calls, causing possible
-	// crashes.
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(100))
-
-	var stop uint32
-	defer atomic.StoreUint32(&stop, 1) // in case of panic
-
-	var wg sync.WaitGroup
-	for i := 0; i < 4; i++ {
-		wg.Add(1)
-		go func() {
-			for atomic.LoadUint32(&stop) == 0 {
-				syscall.Close(-1)
-			}
-			wg.Done()
-		}()
-	}
-
-	max := 10000
-	if testing.Short() {
-		max = 100
-	}
-	stk := make([]runtime.StackRecord, 128)
-	for n := 0; n < max; n++ {
-		_, ok := runtime.GoroutineProfile(stk)
-		if !ok {
-			t.Fatalf("GoroutineProfile failed")
-		}
-	}
-
-	// If the program didn't crash, we passed.
-	atomic.StoreUint32(&stop, 1)
-	wg.Wait()
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/string_test.go b/third_party/gofrontend/libgo/go/runtime/string_test.go
deleted file mode 100644
index 71bd830..0000000
--- a/third_party/gofrontend/libgo/go/runtime/string_test.go
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"strings"
-	"testing"
-)
-
-func BenchmarkCompareStringEqual(b *testing.B) {
-	bytes := []byte("Hello Gophers!")
-	s1, s2 := string(bytes), string(bytes)
-	for i := 0; i < b.N; i++ {
-		if s1 != s2 {
-			b.Fatal("s1 != s2")
-		}
-	}
-}
-
-func BenchmarkCompareStringIdentical(b *testing.B) {
-	s1 := "Hello Gophers!"
-	s2 := s1
-	for i := 0; i < b.N; i++ {
-		if s1 != s2 {
-			b.Fatal("s1 != s2")
-		}
-	}
-}
-
-func BenchmarkCompareStringSameLength(b *testing.B) {
-	s1 := "Hello Gophers!"
-	s2 := "Hello, Gophers"
-	for i := 0; i < b.N; i++ {
-		if s1 == s2 {
-			b.Fatal("s1 == s2")
-		}
-	}
-}
-
-func BenchmarkCompareStringDifferentLength(b *testing.B) {
-	s1 := "Hello Gophers!"
-	s2 := "Hello, Gophers!"
-	for i := 0; i < b.N; i++ {
-		if s1 == s2 {
-			b.Fatal("s1 == s2")
-		}
-	}
-}
-
-func BenchmarkCompareStringBigUnaligned(b *testing.B) {
-	bytes := make([]byte, 0, 1<<20)
-	for len(bytes) < 1<<20 {
-		bytes = append(bytes, "Hello Gophers!"...)
-	}
-	s1, s2 := string(bytes), "hello"+string(bytes)
-	for i := 0; i < b.N; i++ {
-		if s1 != s2[len("hello"):] {
-			b.Fatal("s1 != s2")
-		}
-	}
-	b.SetBytes(int64(len(s1)))
-}
-
-func BenchmarkCompareStringBig(b *testing.B) {
-	bytes := make([]byte, 0, 1<<20)
-	for len(bytes) < 1<<20 {
-		bytes = append(bytes, "Hello Gophers!"...)
-	}
-	s1, s2 := string(bytes), string(bytes)
-	for i := 0; i < b.N; i++ {
-		if s1 != s2 {
-			b.Fatal("s1 != s2")
-		}
-	}
-	b.SetBytes(int64(len(s1)))
-}
-
-func BenchmarkRuneIterate(b *testing.B) {
-	bytes := make([]byte, 100)
-	for i := range bytes {
-		bytes[i] = byte('A')
-	}
-	s := string(bytes)
-	for i := 0; i < b.N; i++ {
-		for range s {
-		}
-	}
-}
-
-func BenchmarkRuneIterate2(b *testing.B) {
-	bytes := make([]byte, 100)
-	for i := range bytes {
-		bytes[i] = byte('A')
-	}
-	s := string(bytes)
-	for i := 0; i < b.N; i++ {
-		for range s {
-		}
-	}
-}
-
-/*
-func TestStringW(t *testing.T) {
-	strings := []string{
-		"hello",
-		"a\u5566\u7788b",
-	}
-
-	for _, s := range strings {
-		var b []uint16
-		for _, c := range s {
-			b = append(b, uint16(c))
-			if c != rune(uint16(c)) {
-				t.Errorf("bad test: stringW can't handle >16 bit runes")
-			}
-		}
-		b = append(b, 0)
-		r := runtime.GostringW(b)
-		if r != s {
-			t.Errorf("gostringW(%v) = %s, want %s", b, r, s)
-		}
-	}
-}
-*/
-
-func TestLargeStringConcat(t *testing.T) {
-	output := executeTest(t, largeStringConcatSource, nil)
-	want := "panic: " + strings.Repeat("0", 1<<10) + strings.Repeat("1", 1<<10) +
-		strings.Repeat("2", 1<<10) + strings.Repeat("3", 1<<10)
-	if !strings.HasPrefix(output, want) {
-		t.Fatalf("output does not start with %q:\n%s", want, output)
-	}
-}
-
-var largeStringConcatSource = `
-package main
-import "strings"
-func main() {
-	s0 := strings.Repeat("0", 1<<10)
-	s1 := strings.Repeat("1", 1<<10)
-	s2 := strings.Repeat("2", 1<<10)
-	s3 := strings.Repeat("3", 1<<10)
-	s := s0 + s1 + s2 + s3
-	panic(s)
-}
-`
-
-/*
-func TestGostringnocopy(t *testing.T) {
-	max := *runtime.Maxstring
-	b := make([]byte, max+10)
-	for i := uintptr(0); i < max+9; i++ {
-		b[i] = 'a'
-	}
-	_ = runtime.Gostringnocopy(&b[0])
-	newmax := *runtime.Maxstring
-	if newmax != max+9 {
-		t.Errorf("want %d, got %d", max+9, newmax)
-	}
-}
-*/
-
-func TestCompareTempString(t *testing.T) {
-	s := "foo"
-	b := []byte(s)
-	n := testing.AllocsPerRun(1000, func() {
-		if string(b) != s {
-			t.Fatalf("strings are not equal: '%v' and '%v'", string(b), s)
-		}
-		if string(b) == s {
-		} else {
-			t.Fatalf("strings are not equal: '%v' and '%v'", string(b), s)
-		}
-	})
-	if n != 0 {
-		t.Fatalf("want 0 allocs, got %v", n)
-	}
-}
-
-func TestStringOnStack(t *testing.T) {
-	s := ""
-	for i := 0; i < 3; i++ {
-		s = "a" + s + "b" + s + "c"
-	}
-
-	if want := "aaabcbabccbaabcbabccc"; s != want {
-		t.Fatalf("want: '%v', got '%v'", want, s)
-	}
-}
-
-func TestIntString(t *testing.T) {
-	// Non-escaping result of intstring.
-	s := ""
-	for i := 0; i < 4; i++ {
-		s += string(i+'0') + string(i+'0'+1)
-	}
-	if want := "01122334"; s != want {
-		t.Fatalf("want '%v', got '%v'", want, s)
-	}
-
-	// Escaping result of intstring.
-	var a [4]string
-	for i := 0; i < 4; i++ {
-		a[i] = string(i + '0')
-	}
-	s = a[0] + a[1] + a[2] + a[3]
-	if want := "0123"; s != want {
-		t.Fatalf("want '%v', got '%v'", want, s)
-	}
-}
-
-func TestIntStringAllocs(t *testing.T) {
-	unknown := '0'
-	n := testing.AllocsPerRun(1000, func() {
-		s1 := string(unknown)
-		s2 := string(unknown + 1)
-		if s1 == s2 {
-			t.Fatalf("bad")
-		}
-	})
-	if n != 0 {
-		t.Fatalf("want 0 allocs, got %v", n)
-	}
-}
-
-func TestRangeStringCast(t *testing.T) {
-	s := "abc"
-	n := testing.AllocsPerRun(1000, func() {
-		for i, c := range []byte(s) {
-			if c != s[i] {
-				t.Fatalf("want '%c' at pos %v, got '%c'", s[i], i, c)
-			}
-		}
-	})
-	if n != 0 {
-		t.Fatalf("want 0 allocs, got %v", n)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/symtab_test.go b/third_party/gofrontend/libgo/go/runtime/symtab_test.go
deleted file mode 100644
index 8c8281f..0000000
--- a/third_party/gofrontend/libgo/go/runtime/symtab_test.go
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_test
-
-import (
-	"runtime"
-	"strings"
-	"testing"
-)
-
-var _ = runtime.Caller
-var _ = strings.HasSuffix
-
-type _ testing.T
-
-func TestCaller(t *testing.T) {
-	procs := runtime.GOMAXPROCS(-1)
-	c := make(chan bool, procs)
-	for p := 0; p < procs; p++ {
-		go func() {
-			for i := 0; i < 1000; i++ {
-				testCallerFoo(t)
-			}
-			c <- true
-		}()
-		defer func() {
-			<-c
-		}()
-	}
-}
-
-func testCallerFoo(t *testing.T) {
-	testCallerBar(t)
-}
-
-func testCallerBar(t *testing.T) {
-	for i := 0; i < 2; i++ {
-		pc, file, line, ok := runtime.Caller(i)
-		f := runtime.FuncForPC(pc)
-		if !ok ||
-			!strings.HasSuffix(file, "symtab_test.go") ||
-			// FuncForPC doesn't work gccgo, because of inlining.
-			// (i == 0 && !strings.HasSuffix(f.Name(), "testCallerBar")) ||
-			// (i == 1 && !strings.HasSuffix(f.Name(), "testCallerFoo")) ||
-			line < 5 || line > 1000 ||
-			f.Entry() >= pc {
-			t.Errorf("incorrect symbol info %d: %t %d %d %s %s %d",
-				i, ok, f.Entry(), pc, f.Name(), file, line)
-		}
-	}
-}
-
-func lineNumber() int {
-	_, _, line, _ := runtime.Caller(1)
-	return line // return 0 for error
-}
-
-// Do not add/remove lines in this block without updating the line numbers.
-var firstLine = lineNumber() // 0
-var (                        // 1
-	lineVar1             = lineNumber()               // 2
-	lineVar2a, lineVar2b = lineNumber(), lineNumber() // 3
-)                        // 4
-var compLit = []struct { // 5
-	lineA, lineB int // 6
-}{ // 7
-	{ // 8
-		lineNumber(), lineNumber(), // 9
-	}, // 10
-	{ // 11
-		lineNumber(), // 12
-		lineNumber(), // 13
-	}, // 14
-	{ // 15
-		lineB: lineNumber(), // 16
-		lineA: lineNumber(), // 17
-	}, // 18
-}                                     // 19
-var arrayLit = [...]int{lineNumber(), // 20
-	lineNumber(), lineNumber(), // 21
-	lineNumber(), // 22
-}                                  // 23
-var sliceLit = []int{lineNumber(), // 24
-	lineNumber(), lineNumber(), // 25
-	lineNumber(), // 26
-}                         // 27
-var mapLit = map[int]int{ // 28
-	29:           lineNumber(), // 29
-	30:           lineNumber(), // 30
-	lineNumber(): 31,           // 31
-	lineNumber(): 32,           // 32
-}                           // 33
-var intLit = lineNumber() + // 34
-	lineNumber() + // 35
-			lineNumber() // 36
-func trythis() { // 37
-	recordLines(lineNumber(), // 38
-		lineNumber(), // 39
-		lineNumber()) // 40
-}
-
-// Modifications below this line are okay.
-
-var l38, l39, l40 int
-
-func recordLines(a, b, c int) {
-	l38 = a
-	l39 = b
-	l40 = c
-}
-
-func TestLineNumber(t *testing.T) {
-	trythis()
-	for _, test := range []struct {
-		name string
-		val  int
-		want int
-	}{
-		{"firstLine", firstLine, 0},
-		{"lineVar1", lineVar1, 2},
-		{"lineVar2a", lineVar2a, 3},
-		{"lineVar2b", lineVar2b, 3},
-		{"compLit[0].lineA", compLit[0].lineA, 9},
-		{"compLit[0].lineB", compLit[0].lineB, 9},
-		{"compLit[1].lineA", compLit[1].lineA, 12},
-		{"compLit[1].lineB", compLit[1].lineB, 13},
-		{"compLit[2].lineA", compLit[2].lineA, 17},
-		{"compLit[2].lineB", compLit[2].lineB, 16},
-
-		{"arrayLit[0]", arrayLit[0], 20},
-		{"arrayLit[1]", arrayLit[1], 21},
-		{"arrayLit[2]", arrayLit[2], 21},
-		{"arrayLit[3]", arrayLit[3], 22},
-
-		{"sliceLit[0]", sliceLit[0], 24},
-		{"sliceLit[1]", sliceLit[1], 25},
-		{"sliceLit[2]", sliceLit[2], 25},
-		{"sliceLit[3]", sliceLit[3], 26},
-
-		{"mapLit[29]", mapLit[29], 29},
-		{"mapLit[30]", mapLit[30], 30},
-		{"mapLit[31]", mapLit[31+firstLine] + firstLine, 31}, // nb it's the key not the value
-		{"mapLit[32]", mapLit[32+firstLine] + firstLine, 32}, // nb it's the key not the value
-
-		{"intLit", intLit - 2*firstLine, 34 + 35 + 36},
-
-		{"l38", l38, 38},
-		{"l39", l39, 39},
-		{"l40", l40, 40},
-	} {
-		if got := test.val - firstLine; got != test.want {
-			t.Errorf("%s on firstLine+%d want firstLine+%d (firstLine=%d, val=%d)",
-				test.name, got, test.want, firstLine, test.val)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/runtime/vlrt.go b/third_party/gofrontend/libgo/go/runtime/vlrt.go
deleted file mode 100644
index 6370732..0000000
--- a/third_party/gofrontend/libgo/go/runtime/vlrt.go
+++ /dev/null
@@ -1,258 +0,0 @@
-// Inferno's libkern/vlrt-arm.c
-// http://code.google.com/p/inferno-os/source/browse/libkern/vlrt-arm.c
-//
-//         Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
-//         Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).  All rights reserved.
-//         Portions Copyright 2009 The Go Authors. All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// +build arm 386
-
-package runtime
-
-import "unsafe"
-
-const (
-	sign32 = 1 << (32 - 1)
-	sign64 = 1 << (64 - 1)
-)
-
-func float64toint64(d float64) (y uint64) {
-	_d2v(&y, d)
-	return
-}
-
-func float64touint64(d float64) (y uint64) {
-	_d2v(&y, d)
-	return
-}
-
-func int64tofloat64(y int64) float64 {
-	if y < 0 {
-		return -uint64tofloat64(-uint64(y))
-	}
-	return uint64tofloat64(uint64(y))
-}
-
-func uint64tofloat64(y uint64) float64 {
-	hi := float64(uint32(y >> 32))
-	lo := float64(uint32(y))
-	d := hi*(1<<32) + lo
-	return d
-}
-
-func _d2v(y *uint64, d float64) {
-	x := *(*uint64)(unsafe.Pointer(&d))
-
-	xhi := uint32(x>>32)&0xfffff | 0x100000
-	xlo := uint32(x)
-	sh := 1075 - int32(uint32(x>>52)&0x7ff)
-
-	var ylo, yhi uint32
-	if sh >= 0 {
-		sh := uint32(sh)
-		/* v = (hi||lo) >> sh */
-		if sh < 32 {
-			if sh == 0 {
-				ylo = xlo
-				yhi = xhi
-			} else {
-				ylo = xlo>>sh | xhi<<(32-sh)
-				yhi = xhi >> sh
-			}
-		} else {
-			if sh == 32 {
-				ylo = xhi
-			} else if sh < 64 {
-				ylo = xhi >> (sh - 32)
-			}
-		}
-	} else {
-		/* v = (hi||lo) << -sh */
-		sh := uint32(-sh)
-		if sh <= 11 {
-			ylo = xlo << sh
-			yhi = xhi<<sh | xlo>>(32-sh)
-		} else {
-			/* overflow */
-			yhi = uint32(d) /* causes something awful */
-		}
-	}
-	if x&sign64 != 0 {
-		if ylo != 0 {
-			ylo = -ylo
-			yhi = ^yhi
-		} else {
-			yhi = -yhi
-		}
-	}
-
-	*y = uint64(yhi)<<32 | uint64(ylo)
-}
-
-func uint64div(n, d uint64) uint64 {
-	// Check for 32 bit operands
-	if uint32(n>>32) == 0 && uint32(d>>32) == 0 {
-		if uint32(d) == 0 {
-			panicdivide()
-		}
-		return uint64(uint32(n) / uint32(d))
-	}
-	q, _ := dodiv(n, d)
-	return q
-}
-
-func uint64mod(n, d uint64) uint64 {
-	// Check for 32 bit operands
-	if uint32(n>>32) == 0 && uint32(d>>32) == 0 {
-		if uint32(d) == 0 {
-			panicdivide()
-		}
-		return uint64(uint32(n) % uint32(d))
-	}
-	_, r := dodiv(n, d)
-	return r
-}
-
-func int64div(n, d int64) int64 {
-	// Check for 32 bit operands
-	if int64(int32(n)) == n && int64(int32(d)) == d {
-		if int32(n) == -0x80000000 && int32(d) == -1 {
-			// special case: 32-bit -0x80000000 / -1 = -0x80000000,
-			// but 64-bit -0x80000000 / -1 = 0x80000000.
-			return 0x80000000
-		}
-		if int32(d) == 0 {
-			panicdivide()
-		}
-		return int64(int32(n) / int32(d))
-	}
-
-	nneg := n < 0
-	dneg := d < 0
-	if nneg {
-		n = -n
-	}
-	if dneg {
-		d = -d
-	}
-	uq, _ := dodiv(uint64(n), uint64(d))
-	q := int64(uq)
-	if nneg != dneg {
-		q = -q
-	}
-	return q
-}
-
-func int64mod(n, d int64) int64 {
-	// Check for 32 bit operands
-	if int64(int32(n)) == n && int64(int32(d)) == d {
-		if int32(d) == 0 {
-			panicdivide()
-		}
-		return int64(int32(n) % int32(d))
-	}
-
-	nneg := n < 0
-	if nneg {
-		n = -n
-	}
-	if d < 0 {
-		d = -d
-	}
-	_, ur := dodiv(uint64(n), uint64(d))
-	r := int64(ur)
-	if nneg {
-		r = -r
-	}
-	return r
-}
-
-//go:noescape
-func _mul64by32(lo64 *uint64, a uint64, b uint32) (hi32 uint32)
-
-//go:noescape
-func _div64by32(a uint64, b uint32, r *uint32) (q uint32)
-
-func dodiv(n, d uint64) (q, r uint64) {
-	if GOARCH == "arm" {
-		// arm doesn't have a division instruction, so
-		// slowdodiv is the best that we can do.
-		// TODO: revisit for arm64.
-		return slowdodiv(n, d)
-	}
-
-	if d > n {
-		return 0, n
-	}
-
-	if uint32(d>>32) != 0 {
-		t := uint32(n>>32) / uint32(d>>32)
-		var lo64 uint64
-		hi32 := _mul64by32(&lo64, d, t)
-		if hi32 != 0 || lo64 > n {
-			return slowdodiv(n, d)
-		}
-		return uint64(t), n - lo64
-	}
-
-	// d is 32 bit
-	var qhi uint32
-	if uint32(n>>32) >= uint32(d) {
-		if uint32(d) == 0 {
-			panicdivide()
-		}
-		qhi = uint32(n>>32) / uint32(d)
-		n -= uint64(uint32(d)*qhi) << 32
-	} else {
-		qhi = 0
-	}
-
-	var rlo uint32
-	qlo := _div64by32(n, uint32(d), &rlo)
-	return uint64(qhi)<<32 + uint64(qlo), uint64(rlo)
-}
-
-func slowdodiv(n, d uint64) (q, r uint64) {
-	if d == 0 {
-		panicdivide()
-	}
-
-	// Set up the divisor and find the number of iterations needed.
-	capn := n
-	if n >= sign64 {
-		capn = sign64
-	}
-	i := 0
-	for d < capn {
-		d <<= 1
-		i++
-	}
-
-	for ; i >= 0; i-- {
-		q <<= 1
-		if n >= d {
-			n -= d
-			q |= 1
-		}
-		d >>= 1
-	}
-	return q, n
-}
diff --git a/third_party/gofrontend/libgo/go/sort/example_interface_test.go b/third_party/gofrontend/libgo/go/sort/example_interface_test.go
deleted file mode 100644
index 442204e..0000000
--- a/third_party/gofrontend/libgo/go/sort/example_interface_test.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sort_test
-
-import (
-	"fmt"
-	"sort"
-)
-
-type Person struct {
-	Name string
-	Age  int
-}
-
-func (p Person) String() string {
-	return fmt.Sprintf("%s: %d", p.Name, p.Age)
-}
-
-// ByAge implements sort.Interface for []Person based on
-// the Age field.
-type ByAge []Person
-
-func (a ByAge) Len() int           { return len(a) }
-func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
-
-func Example() {
-	people := []Person{
-		{"Bob", 31},
-		{"John", 42},
-		{"Michael", 17},
-		{"Jenny", 26},
-	}
-
-	fmt.Println(people)
-	sort.Sort(ByAge(people))
-	fmt.Println(people)
-
-	// Output:
-	// [Bob: 31 John: 42 Michael: 17 Jenny: 26]
-	// [Michael: 17 Jenny: 26 Bob: 31 John: 42]
-}
diff --git a/third_party/gofrontend/libgo/go/sort/example_keys_test.go b/third_party/gofrontend/libgo/go/sort/example_keys_test.go
deleted file mode 100644
index a8e47e4..0000000
--- a/third_party/gofrontend/libgo/go/sort/example_keys_test.go
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sort_test
-
-import (
-	"fmt"
-	"sort"
-)
-
-// A couple of type definitions to make the units clear.
-type earthMass float64
-type au float64
-
-// A Planet defines the properties of a solar system object.
-type Planet struct {
-	name     string
-	mass     earthMass
-	distance au
-}
-
-// By is the type of a "less" function that defines the ordering of its Planet arguments.
-type By func(p1, p2 *Planet) bool
-
-// Sort is a method on the function type, By, that sorts the argument slice according to the function.
-func (by By) Sort(planets []Planet) {
-	ps := &planetSorter{
-		planets: planets,
-		by:      by, // The Sort method's receiver is the function (closure) that defines the sort order.
-	}
-	sort.Sort(ps)
-}
-
-// planetSorter joins a By function and a slice of Planets to be sorted.
-type planetSorter struct {
-	planets []Planet
-	by      func(p1, p2 *Planet) bool // Closure used in the Less method.
-}
-
-// Len is part of sort.Interface.
-func (s *planetSorter) Len() int {
-	return len(s.planets)
-}
-
-// Swap is part of sort.Interface.
-func (s *planetSorter) Swap(i, j int) {
-	s.planets[i], s.planets[j] = s.planets[j], s.planets[i]
-}
-
-// Less is part of sort.Interface. It is implemented by calling the "by" closure in the sorter.
-func (s *planetSorter) Less(i, j int) bool {
-	return s.by(&s.planets[i], &s.planets[j])
-}
-
-var planets = []Planet{
-	{"Mercury", 0.055, 0.4},
-	{"Venus", 0.815, 0.7},
-	{"Earth", 1.0, 1.0},
-	{"Mars", 0.107, 1.5},
-}
-
-// ExampleSortKeys demonstrates a technique for sorting a struct type using programmable sort criteria.
-func Example_sortKeys() {
-	// Closures that order the Planet structure.
-	name := func(p1, p2 *Planet) bool {
-		return p1.name < p2.name
-	}
-	mass := func(p1, p2 *Planet) bool {
-		return p1.mass < p2.mass
-	}
-	distance := func(p1, p2 *Planet) bool {
-		return p1.distance < p2.distance
-	}
-	decreasingDistance := func(p1, p2 *Planet) bool {
-		return !distance(p1, p2)
-	}
-
-	// Sort the planets by the various criteria.
-	By(name).Sort(planets)
-	fmt.Println("By name:", planets)
-
-	By(mass).Sort(planets)
-	fmt.Println("By mass:", planets)
-
-	By(distance).Sort(planets)
-	fmt.Println("By distance:", planets)
-
-	By(decreasingDistance).Sort(planets)
-	fmt.Println("By decreasing distance:", planets)
-
-	// Output: By name: [{Earth 1 1} {Mars 0.107 1.5} {Mercury 0.055 0.4} {Venus 0.815 0.7}]
-	// By mass: [{Mercury 0.055 0.4} {Mars 0.107 1.5} {Venus 0.815 0.7} {Earth 1 1}]
-	// By distance: [{Mercury 0.055 0.4} {Venus 0.815 0.7} {Earth 1 1} {Mars 0.107 1.5}]
-	// By decreasing distance: [{Mars 0.107 1.5} {Earth 1 1} {Venus 0.815 0.7} {Mercury 0.055 0.4}]
-}
diff --git a/third_party/gofrontend/libgo/go/sort/example_multi_test.go b/third_party/gofrontend/libgo/go/sort/example_multi_test.go
deleted file mode 100644
index ac31654..0000000
--- a/third_party/gofrontend/libgo/go/sort/example_multi_test.go
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sort_test
-
-import (
-	"fmt"
-	"sort"
-)
-
-// A Change is a record of source code changes, recording user, language, and delta size.
-type Change struct {
-	user     string
-	language string
-	lines    int
-}
-
-type lessFunc func(p1, p2 *Change) bool
-
-// multiSorter implements the Sort interface, sorting the changes within.
-type multiSorter struct {
-	changes []Change
-	less    []lessFunc
-}
-
-// Sort sorts the argument slice according to the less functions passed to OrderedBy.
-func (ms *multiSorter) Sort(changes []Change) {
-	ms.changes = changes
-	sort.Sort(ms)
-}
-
-// OrderedBy returns a Sorter that sorts using the less functions, in order.
-// Call its Sort method to sort the data.
-func OrderedBy(less ...lessFunc) *multiSorter {
-	return &multiSorter{
-		less: less,
-	}
-}
-
-// Len is part of sort.Interface.
-func (ms *multiSorter) Len() int {
-	return len(ms.changes)
-}
-
-// Swap is part of sort.Interface.
-func (ms *multiSorter) Swap(i, j int) {
-	ms.changes[i], ms.changes[j] = ms.changes[j], ms.changes[i]
-}
-
-// Less is part of sort.Interface. It is implemented by looping along the
-// less functions until it finds a comparison that is either Less or
-// !Less. Note that it can call the less functions twice per call. We
-// could change the functions to return -1, 0, 1 and reduce the
-// number of calls for greater efficiency: an exercise for the reader.
-func (ms *multiSorter) Less(i, j int) bool {
-	p, q := &ms.changes[i], &ms.changes[j]
-	// Try all but the last comparison.
-	var k int
-	for k = 0; k < len(ms.less)-1; k++ {
-		less := ms.less[k]
-		switch {
-		case less(p, q):
-			// p < q, so we have a decision.
-			return true
-		case less(q, p):
-			// p > q, so we have a decision.
-			return false
-		}
-		// p == q; try the next comparison.
-	}
-	// All comparisons to here said "equal", so just return whatever
-	// the final comparison reports.
-	return ms.less[k](p, q)
-}
-
-var changes = []Change{
-	{"gri", "Go", 100},
-	{"ken", "C", 150},
-	{"glenda", "Go", 200},
-	{"rsc", "Go", 200},
-	{"r", "Go", 100},
-	{"ken", "Go", 200},
-	{"dmr", "C", 100},
-	{"r", "C", 150},
-	{"gri", "Smalltalk", 80},
-}
-
-// ExampleMultiKeys demonstrates a technique for sorting a struct type using different
-// sets of multiple fields in the comparison. We chain together "Less" functions, each of
-// which compares a single field.
-func Example_sortMultiKeys() {
-	// Closures that order the Change structure.
-	user := func(c1, c2 *Change) bool {
-		return c1.user < c2.user
-	}
-	language := func(c1, c2 *Change) bool {
-		return c1.language < c2.language
-	}
-	increasingLines := func(c1, c2 *Change) bool {
-		return c1.lines < c2.lines
-	}
-	decreasingLines := func(c1, c2 *Change) bool {
-		return c1.lines > c2.lines // Note: > orders downwards.
-	}
-
-	// Simple use: Sort by user.
-	OrderedBy(user).Sort(changes)
-	fmt.Println("By user:", changes)
-
-	// More examples.
-	OrderedBy(user, increasingLines).Sort(changes)
-	fmt.Println("By user,<lines:", changes)
-
-	OrderedBy(user, decreasingLines).Sort(changes)
-	fmt.Println("By user,>lines:", changes)
-
-	OrderedBy(language, increasingLines).Sort(changes)
-	fmt.Println("By language,<lines:", changes)
-
-	OrderedBy(language, increasingLines, user).Sort(changes)
-	fmt.Println("By language,<lines,user:", changes)
-
-	// Output:
-	// By user: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken Go 200} {ken C 150} {r Go 100} {r C 150} {rsc Go 200}]
-	// By user,<lines: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken C 150} {ken Go 200} {r Go 100} {r C 150} {rsc Go 200}]
-	// By user,>lines: [{dmr C 100} {glenda Go 200} {gri Go 100} {gri Smalltalk 80} {ken Go 200} {ken C 150} {r C 150} {r Go 100} {rsc Go 200}]
-	// By language,<lines: [{dmr C 100} {ken C 150} {r C 150} {gri Go 100} {r Go 100} {ken Go 200} {glenda Go 200} {rsc Go 200} {gri Smalltalk 80}]
-	// By language,<lines,user: [{dmr C 100} {ken C 150} {r C 150} {gri Go 100} {r Go 100} {glenda Go 200} {ken Go 200} {rsc Go 200} {gri Smalltalk 80}]
-
-}
diff --git a/third_party/gofrontend/libgo/go/sort/example_test.go b/third_party/gofrontend/libgo/go/sort/example_test.go
deleted file mode 100644
index f7372be..0000000
--- a/third_party/gofrontend/libgo/go/sort/example_test.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sort_test
-
-import (
-	"fmt"
-	"sort"
-)
-
-func ExampleInts() {
-	s := []int{5, 2, 6, 3, 1, 4} // unsorted
-	sort.Ints(s)
-	fmt.Println(s)
-	// Output: [1 2 3 4 5 6]
-}
-
-func ExampleReverse() {
-	s := []int{5, 2, 6, 3, 1, 4} // unsorted
-	sort.Sort(sort.Reverse(sort.IntSlice(s)))
-	fmt.Println(s)
-	// Output: [6 5 4 3 2 1]
-}
diff --git a/third_party/gofrontend/libgo/go/sort/example_wrapper_test.go b/third_party/gofrontend/libgo/go/sort/example_wrapper_test.go
deleted file mode 100644
index cf6d74c..0000000
--- a/third_party/gofrontend/libgo/go/sort/example_wrapper_test.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sort_test
-
-import (
-	"fmt"
-	"sort"
-)
-
-type Grams int
-
-func (g Grams) String() string { return fmt.Sprintf("%dg", int(g)) }
-
-type Organ struct {
-	Name   string
-	Weight Grams
-}
-
-type Organs []*Organ
-
-func (s Organs) Len() int      { return len(s) }
-func (s Organs) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-
-// ByName implements sort.Interface by providing Less and using the Len and
-// Swap methods of the embedded Organs value.
-type ByName struct{ Organs }
-
-func (s ByName) Less(i, j int) bool { return s.Organs[i].Name < s.Organs[j].Name }
-
-// ByWeight implements sort.Interface by providing Less and using the Len and
-// Swap methods of the embedded Organs value.
-type ByWeight struct{ Organs }
-
-func (s ByWeight) Less(i, j int) bool { return s.Organs[i].Weight < s.Organs[j].Weight }
-
-func Example_sortWrapper() {
-	s := []*Organ{
-		{"brain", 1340},
-		{"heart", 290},
-		{"liver", 1494},
-		{"pancreas", 131},
-		{"prostate", 62},
-		{"spleen", 162},
-	}
-
-	sort.Sort(ByWeight{s})
-	fmt.Println("Organs by weight:")
-	printOrgans(s)
-
-	sort.Sort(ByName{s})
-	fmt.Println("Organs by name:")
-	printOrgans(s)
-
-	// Output:
-	// Organs by weight:
-	// prostate (62g)
-	// pancreas (131g)
-	// spleen   (162g)
-	// heart    (290g)
-	// brain    (1340g)
-	// liver    (1494g)
-	// Organs by name:
-	// brain    (1340g)
-	// heart    (290g)
-	// liver    (1494g)
-	// pancreas (131g)
-	// prostate (62g)
-	// spleen   (162g)
-}
-
-func printOrgans(s []*Organ) {
-	for _, o := range s {
-		fmt.Printf("%-8s (%v)\n", o.Name, o.Weight)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/sort/export_test.go b/third_party/gofrontend/libgo/go/sort/export_test.go
deleted file mode 100644
index b6e30ce..0000000
--- a/third_party/gofrontend/libgo/go/sort/export_test.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sort
-
-func Heapsort(data Interface) {
-	heapSort(data, 0, data.Len())
-}
diff --git a/third_party/gofrontend/libgo/go/sort/search.go b/third_party/gofrontend/libgo/go/sort/search.go
deleted file mode 100644
index 8a2c1c3..0000000
--- a/third_party/gofrontend/libgo/go/sort/search.go
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements binary search.
-
-package sort
-
-// Search uses binary search to find and return the smallest index i
-// in [0, n) at which f(i) is true, assuming that on the range [0, n),
-// f(i) == true implies f(i+1) == true.  That is, Search requires that
-// f is false for some (possibly empty) prefix of the input range [0, n)
-// and then true for the (possibly empty) remainder; Search returns
-// the first true index.  If there is no such index, Search returns n.
-// (Note that the "not found" return value is not -1 as in, for instance,
-// strings.Index).
-// Search calls f(i) only for i in the range [0, n).
-//
-// A common use of Search is to find the index i for a value x in
-// a sorted, indexable data structure such as an array or slice.
-// In this case, the argument f, typically a closure, captures the value
-// to be searched for, and how the data structure is indexed and
-// ordered.
-//
-// For instance, given a slice data sorted in ascending order,
-// the call Search(len(data), func(i int) bool { return data[i] >= 23 })
-// returns the smallest index i such that data[i] >= 23.  If the caller
-// wants to find whether 23 is in the slice, it must test data[i] == 23
-// separately.
-//
-// Searching data sorted in descending order would use the <=
-// operator instead of the >= operator.
-//
-// To complete the example above, the following code tries to find the value
-// x in an integer slice data sorted in ascending order:
-//
-//	x := 23
-//	i := sort.Search(len(data), func(i int) bool { return data[i] >= x })
-//	if i < len(data) && data[i] == x {
-//		// x is present at data[i]
-//	} else {
-//		// x is not present in data,
-//		// but i is the index where it would be inserted.
-//	}
-//
-// As a more whimsical example, this program guesses your number:
-//
-//	func GuessingGame() {
-//		var s string
-//		fmt.Printf("Pick an integer from 0 to 100.\n")
-//		answer := sort.Search(100, func(i int) bool {
-//			fmt.Printf("Is your number <= %d? ", i)
-//			fmt.Scanf("%s", &s)
-//			return s != "" && s[0] == 'y'
-//		})
-//		fmt.Printf("Your number is %d.\n", answer)
-//	}
-//
-func Search(n int, f func(int) bool) int {
-	// Define f(-1) == false and f(n) == true.
-	// Invariant: f(i-1) == false, f(j) == true.
-	i, j := 0, n
-	for i < j {
-		h := i + (j-i)/2 // avoid overflow when computing h
-		// i ≤ h < j
-		if !f(h) {
-			i = h + 1 // preserves f(i-1) == false
-		} else {
-			j = h // preserves f(j) == true
-		}
-	}
-	// i == j, f(i-1) == false, and f(j) (= f(i)) == true  =>  answer is i.
-	return i
-}
-
-// Convenience wrappers for common cases.
-
-// SearchInts searches for x in a sorted slice of ints and returns the index
-// as specified by Search. The return value is the index to insert x if x is
-// not present (it could be len(a)).
-// The slice must be sorted in ascending order.
-//
-func SearchInts(a []int, x int) int {
-	return Search(len(a), func(i int) bool { return a[i] >= x })
-}
-
-// SearchFloat64s searches for x in a sorted slice of float64s and returns the index
-// as specified by Search.  The return value is the index to insert x if x is not
-// present (it could be len(a)).
-// The slice must be sorted in ascending order.
-//
-func SearchFloat64s(a []float64, x float64) int {
-	return Search(len(a), func(i int) bool { return a[i] >= x })
-}
-
-// SearchStrings searches for x in a sorted slice of strings and returns the index
-// as specified by Search.  The return value is the index to insert x if x is not
-// present (it could be len(a)).
-// The slice must be sorted in ascending order.
-//
-func SearchStrings(a []string, x string) int {
-	return Search(len(a), func(i int) bool { return a[i] >= x })
-}
-
-// Search returns the result of applying SearchInts to the receiver and x.
-func (p IntSlice) Search(x int) int { return SearchInts(p, x) }
-
-// Search returns the result of applying SearchFloat64s to the receiver and x.
-func (p Float64Slice) Search(x float64) int { return SearchFloat64s(p, x) }
-
-// Search returns the result of applying SearchStrings to the receiver and x.
-func (p StringSlice) Search(x string) int { return SearchStrings(p, x) }
diff --git a/third_party/gofrontend/libgo/go/sort/search_test.go b/third_party/gofrontend/libgo/go/sort/search_test.go
deleted file mode 100644
index 4265b95..0000000
--- a/third_party/gofrontend/libgo/go/sort/search_test.go
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sort_test
-
-import (
-	"runtime"
-	. "sort"
-	"testing"
-)
-
-func f(a []int, x int) func(int) bool {
-	return func(i int) bool {
-		return a[i] >= x
-	}
-}
-
-var data = []int{0: -10, 1: -5, 2: 0, 3: 1, 4: 2, 5: 3, 6: 5, 7: 7, 8: 11, 9: 100, 10: 100, 11: 100, 12: 1000, 13: 10000}
-
-var tests = []struct {
-	name string
-	n    int
-	f    func(int) bool
-	i    int
-}{
-	{"empty", 0, nil, 0},
-	{"1 1", 1, func(i int) bool { return i >= 1 }, 1},
-	{"1 true", 1, func(i int) bool { return true }, 0},
-	{"1 false", 1, func(i int) bool { return false }, 1},
-	{"1e9 991", 1e9, func(i int) bool { return i >= 991 }, 991},
-	{"1e9 true", 1e9, func(i int) bool { return true }, 0},
-	{"1e9 false", 1e9, func(i int) bool { return false }, 1e9},
-	{"data -20", len(data), f(data, -20), 0},
-	{"data -10", len(data), f(data, -10), 0},
-	{"data -9", len(data), f(data, -9), 1},
-	{"data -6", len(data), f(data, -6), 1},
-	{"data -5", len(data), f(data, -5), 1},
-	{"data 3", len(data), f(data, 3), 5},
-	{"data 11", len(data), f(data, 11), 8},
-	{"data 99", len(data), f(data, 99), 9},
-	{"data 100", len(data), f(data, 100), 9},
-	{"data 101", len(data), f(data, 101), 12},
-	{"data 10000", len(data), f(data, 10000), 13},
-	{"data 10001", len(data), f(data, 10001), 14},
-	{"descending a", 7, func(i int) bool { return []int{99, 99, 59, 42, 7, 0, -1, -1}[i] <= 7 }, 4},
-	{"descending 7", 1e9, func(i int) bool { return 1e9-i <= 7 }, 1e9 - 7},
-	{"overflow", 2e9, func(i int) bool { return false }, 2e9},
-}
-
-func TestSearch(t *testing.T) {
-	for _, e := range tests {
-		i := Search(e.n, e.f)
-		if i != e.i {
-			t.Errorf("%s: expected index %d; got %d", e.name, e.i, i)
-		}
-	}
-}
-
-// log2 computes the binary logarithm of x, rounded up to the next integer.
-// (log2(0) == 0, log2(1) == 0, log2(2) == 1, log2(3) == 2, etc.)
-//
-func log2(x int) int {
-	n := 0
-	for p := 1; p < x; p += p {
-		// p == 2**n
-		n++
-	}
-	// p/2 < x <= p == 2**n
-	return n
-}
-
-func TestSearchEfficiency(t *testing.T) {
-	n := 100
-	step := 1
-	for exp := 2; exp < 10; exp++ {
-		// n == 10**exp
-		// step == 10**(exp-2)
-		max := log2(n)
-		for x := 0; x < n; x += step {
-			count := 0
-			i := Search(n, func(i int) bool { count++; return i >= x })
-			if i != x {
-				t.Errorf("n = %d: expected index %d; got %d", n, x, i)
-			}
-			if count > max {
-				t.Errorf("n = %d, x = %d: expected <= %d calls; got %d", n, x, max, count)
-			}
-		}
-		n *= 10
-		step *= 10
-	}
-}
-
-// Smoke tests for convenience wrappers - not comprehensive.
-
-var fdata = []float64{0: -3.14, 1: 0, 2: 1, 3: 2, 4: 1000.7}
-var sdata = []string{0: "f", 1: "foo", 2: "foobar", 3: "x"}
-
-var wrappertests = []struct {
-	name   string
-	result int
-	i      int
-}{
-	{"SearchInts", SearchInts(data, 11), 8},
-	{"SearchFloat64s", SearchFloat64s(fdata, 2.1), 4},
-	{"SearchStrings", SearchStrings(sdata, ""), 0},
-	{"IntSlice.Search", IntSlice(data).Search(0), 2},
-	{"Float64Slice.Search", Float64Slice(fdata).Search(2.0), 3},
-	{"StringSlice.Search", StringSlice(sdata).Search("x"), 3},
-}
-
-func TestSearchWrappers(t *testing.T) {
-	for _, e := range wrappertests {
-		if e.result != e.i {
-			t.Errorf("%s: expected index %d; got %d", e.name, e.i, e.result)
-		}
-	}
-}
-
-func runSearchWrappers() {
-	SearchInts(data, 11)
-	SearchFloat64s(fdata, 2.1)
-	SearchStrings(sdata, "")
-	IntSlice(data).Search(0)
-	Float64Slice(fdata).Search(2.0)
-	StringSlice(sdata).Search("x")
-}
-
-func TestSearchWrappersDontAlloc(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping malloc count in short mode")
-	}
-	if runtime.GOMAXPROCS(0) > 1 {
-		t.Skip("skipping; GOMAXPROCS>1")
-	}
-	t.Skip("skipping alloc test for gccgo")
-	allocs := testing.AllocsPerRun(100, runSearchWrappers)
-	if allocs != 0 {
-		t.Errorf("expected no allocs for runSearchWrappers, got %v", allocs)
-	}
-}
-
-func BenchmarkSearchWrappers(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		runSearchWrappers()
-	}
-}
-
-// Abstract exhaustive test: all sizes up to 100,
-// all possible return values.  If there are any small
-// corner cases, this test exercises them.
-func TestSearchExhaustive(t *testing.T) {
-	for size := 0; size <= 100; size++ {
-		for targ := 0; targ <= size; targ++ {
-			i := Search(size, func(i int) bool { return i >= targ })
-			if i != targ {
-				t.Errorf("Search(%d, %d) = %d", size, targ, i)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/sort/sort.go b/third_party/gofrontend/libgo/go/sort/sort.go
deleted file mode 100644
index c7c3042..0000000
--- a/third_party/gofrontend/libgo/go/sort/sort.go
+++ /dev/null
@@ -1,514 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package sort provides primitives for sorting slices and user-defined
-// collections.
-package sort
-
-// A type, typically a collection, that satisfies sort.Interface can be
-// sorted by the routines in this package.  The methods require that the
-// elements of the collection be enumerated by an integer index.
-type Interface interface {
-	// Len is the number of elements in the collection.
-	Len() int
-	// Less reports whether the element with
-	// index i should sort before the element with index j.
-	Less(i, j int) bool
-	// Swap swaps the elements with indexes i and j.
-	Swap(i, j int)
-}
-
-func min(a, b int) int {
-	if a < b {
-		return a
-	}
-	return b
-}
-
-// Insertion sort
-func insertionSort(data Interface, a, b int) {
-	for i := a + 1; i < b; i++ {
-		for j := i; j > a && data.Less(j, j-1); j-- {
-			data.Swap(j, j-1)
-		}
-	}
-}
-
-// siftDown implements the heap property on data[lo, hi).
-// first is an offset into the array where the root of the heap lies.
-func siftDown(data Interface, lo, hi, first int) {
-	root := lo
-	for {
-		child := 2*root + 1
-		if child >= hi {
-			break
-		}
-		if child+1 < hi && data.Less(first+child, first+child+1) {
-			child++
-		}
-		if !data.Less(first+root, first+child) {
-			return
-		}
-		data.Swap(first+root, first+child)
-		root = child
-	}
-}
-
-func heapSort(data Interface, a, b int) {
-	first := a
-	lo := 0
-	hi := b - a
-
-	// Build heap with greatest element at top.
-	for i := (hi - 1) / 2; i >= 0; i-- {
-		siftDown(data, i, hi, first)
-	}
-
-	// Pop elements, largest first, into end of data.
-	for i := hi - 1; i >= 0; i-- {
-		data.Swap(first, first+i)
-		siftDown(data, lo, i, first)
-	}
-}
-
-// Quicksort, following Bentley and McIlroy,
-// ``Engineering a Sort Function,'' SP&E November 1993.
-
-// medianOfThree moves the median of the three values data[m0], data[m1], data[m2] into data[m1].
-func medianOfThree(data Interface, m1, m0, m2 int) {
-	// sort 3 elements
-	if data.Less(m1, m0) {
-		data.Swap(m1, m0)
-	}
-	// data[m0] <= data[m1]
-	if data.Less(m2, m1) {
-		data.Swap(m2, m1)
-		// data[m0] <= data[m2] && data[m1] < data[m2]
-		if data.Less(m1, m0) {
-			data.Swap(m1, m0)
-		}
-	}
-	// now data[m0] <= data[m1] <= data[m2]
-}
-
-func swapRange(data Interface, a, b, n int) {
-	for i := 0; i < n; i++ {
-		data.Swap(a+i, b+i)
-	}
-}
-
-func doPivot(data Interface, lo, hi int) (midlo, midhi int) {
-	m := lo + (hi-lo)/2 // Written like this to avoid integer overflow.
-	if hi-lo > 40 {
-		// Tukey's ``Ninther,'' median of three medians of three.
-		s := (hi - lo) / 8
-		medianOfThree(data, lo, lo+s, lo+2*s)
-		medianOfThree(data, m, m-s, m+s)
-		medianOfThree(data, hi-1, hi-1-s, hi-1-2*s)
-	}
-	medianOfThree(data, lo, m, hi-1)
-
-	// Invariants are:
-	//	data[lo] = pivot (set up by ChoosePivot)
-	//	data[lo <= i < a] = pivot
-	//	data[a <= i < b] < pivot
-	//	data[b <= i < c] is unexamined
-	//	data[c <= i < d] > pivot
-	//	data[d <= i < hi] = pivot
-	//
-	// Once b meets c, can swap the "= pivot" sections
-	// into the middle of the slice.
-	pivot := lo
-	a, b, c, d := lo+1, lo+1, hi, hi
-	for {
-		for b < c {
-			if data.Less(b, pivot) { // data[b] < pivot
-				b++
-			} else if !data.Less(pivot, b) { // data[b] = pivot
-				data.Swap(a, b)
-				a++
-				b++
-			} else {
-				break
-			}
-		}
-		for b < c {
-			if data.Less(pivot, c-1) { // data[c-1] > pivot
-				c--
-			} else if !data.Less(c-1, pivot) { // data[c-1] = pivot
-				data.Swap(c-1, d-1)
-				c--
-				d--
-			} else {
-				break
-			}
-		}
-		if b >= c {
-			break
-		}
-		// data[b] > pivot; data[c-1] < pivot
-		data.Swap(b, c-1)
-		b++
-		c--
-	}
-
-	n := min(b-a, a-lo)
-	swapRange(data, lo, b-n, n)
-
-	n = min(hi-d, d-c)
-	swapRange(data, c, hi-n, n)
-
-	return lo + b - a, hi - (d - c)
-}
-
-func quickSort(data Interface, a, b, maxDepth int) {
-	for b-a > 7 {
-		if maxDepth == 0 {
-			heapSort(data, a, b)
-			return
-		}
-		maxDepth--
-		mlo, mhi := doPivot(data, a, b)
-		// Avoiding recursion on the larger subproblem guarantees
-		// a stack depth of at most lg(b-a).
-		if mlo-a < b-mhi {
-			quickSort(data, a, mlo, maxDepth)
-			a = mhi // i.e., quickSort(data, mhi, b)
-		} else {
-			quickSort(data, mhi, b, maxDepth)
-			b = mlo // i.e., quickSort(data, a, mlo)
-		}
-	}
-	if b-a > 1 {
-		insertionSort(data, a, b)
-	}
-}
-
-// Sort sorts data.
-// It makes one call to data.Len to determine n, and O(n*log(n)) calls to
-// data.Less and data.Swap. The sort is not guaranteed to be stable.
-func Sort(data Interface) {
-	// Switch to heapsort if depth of 2*ceil(lg(n+1)) is reached.
-	n := data.Len()
-	maxDepth := 0
-	for i := n; i > 0; i >>= 1 {
-		maxDepth++
-	}
-	maxDepth *= 2
-	quickSort(data, 0, n, maxDepth)
-}
-
-type reverse struct {
-	// This embedded Interface permits Reverse to use the methods of
-	// another Interface implementation.
-	Interface
-}
-
-// Less returns the opposite of the embedded implementation's Less method.
-func (r reverse) Less(i, j int) bool {
-	return r.Interface.Less(j, i)
-}
-
-// Reverse returns the reverse order for data.
-func Reverse(data Interface) Interface {
-	return &reverse{data}
-}
-
-// IsSorted reports whether data is sorted.
-func IsSorted(data Interface) bool {
-	n := data.Len()
-	for i := n - 1; i > 0; i-- {
-		if data.Less(i, i-1) {
-			return false
-		}
-	}
-	return true
-}
-
-// Convenience types for common cases
-
-// IntSlice attaches the methods of Interface to []int, sorting in increasing order.
-type IntSlice []int
-
-func (p IntSlice) Len() int           { return len(p) }
-func (p IntSlice) Less(i, j int) bool { return p[i] < p[j] }
-func (p IntSlice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
-
-// Sort is a convenience method.
-func (p IntSlice) Sort() { Sort(p) }
-
-// Float64Slice attaches the methods of Interface to []float64, sorting in increasing order.
-type Float64Slice []float64
-
-func (p Float64Slice) Len() int           { return len(p) }
-func (p Float64Slice) Less(i, j int) bool { return p[i] < p[j] || isNaN(p[i]) && !isNaN(p[j]) }
-func (p Float64Slice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
-
-// isNaN is a copy of math.IsNaN to avoid a dependency on the math package.
-func isNaN(f float64) bool {
-	return f != f
-}
-
-// Sort is a convenience method.
-func (p Float64Slice) Sort() { Sort(p) }
-
-// StringSlice attaches the methods of Interface to []string, sorting in increasing order.
-type StringSlice []string
-
-func (p StringSlice) Len() int           { return len(p) }
-func (p StringSlice) Less(i, j int) bool { return p[i] < p[j] }
-func (p StringSlice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
-
-// Sort is a convenience method.
-func (p StringSlice) Sort() { Sort(p) }
-
-// Convenience wrappers for common cases
-
-// Ints sorts a slice of ints in increasing order.
-func Ints(a []int) { Sort(IntSlice(a)) }
-
-// Float64s sorts a slice of float64s in increasing order.
-func Float64s(a []float64) { Sort(Float64Slice(a)) }
-
-// Strings sorts a slice of strings in increasing order.
-func Strings(a []string) { Sort(StringSlice(a)) }
-
-// IntsAreSorted tests whether a slice of ints is sorted in increasing order.
-func IntsAreSorted(a []int) bool { return IsSorted(IntSlice(a)) }
-
-// Float64sAreSorted tests whether a slice of float64s is sorted in increasing order.
-func Float64sAreSorted(a []float64) bool { return IsSorted(Float64Slice(a)) }
-
-// StringsAreSorted tests whether a slice of strings is sorted in increasing order.
-func StringsAreSorted(a []string) bool { return IsSorted(StringSlice(a)) }
-
-// Notes on stable sorting:
-// The used algorithms are simple and provable correct on all input and use
-// only logarithmic additional stack space.  They perform well if compared
-// experimentally to other stable in-place sorting algorithms.
-//
-// Remarks on other algorithms evaluated:
-//  - GCC's 4.6.3 stable_sort with merge_without_buffer from libstdc++:
-//    Not faster.
-//  - GCC's __rotate for block rotations: Not faster.
-//  - "Practical in-place mergesort" from  Jyrki Katajainen, Tomi A. Pasanen
-//    and Jukka Teuhola; Nordic Journal of Computing 3,1 (1996), 27-40:
-//    The given algorithms are in-place, number of Swap and Assignments
-//    grow as n log n but the algorithm is not stable.
-//  - "Fast Stable In-Place Sorting with O(n) Data Moves" J.I. Munro and
-//    V. Raman in Algorithmica (1996) 16, 115-160:
-//    This algorithm either needs additional 2n bits or works only if there
-//    are enough different elements available to encode some permutations
-//    which have to be undone later (so not stable on any input).
-//  - All the optimal in-place sorting/merging algorithms I found are either
-//    unstable or rely on enough different elements in each step to encode the
-//    performed block rearrangements. See also "In-Place Merging Algorithms",
-//    Denham Coates-Evely, Department of Computer Science, Kings College,
-//    January 2004 and the reverences in there.
-//  - Often "optimal" algorithms are optimal in the number of assignments
-//    but Interface has only Swap as operation.
-
-// Stable sorts data while keeping the original order of equal elements.
-//
-// It makes one call to data.Len to determine n, O(n*log(n)) calls to
-// data.Less and O(n*log(n)*log(n)) calls to data.Swap.
-func Stable(data Interface) {
-	n := data.Len()
-	blockSize := 20 // must be > 0
-	a, b := 0, blockSize
-	for b <= n {
-		insertionSort(data, a, b)
-		a = b
-		b += blockSize
-	}
-	insertionSort(data, a, n)
-
-	for blockSize < n {
-		a, b = 0, 2*blockSize
-		for b <= n {
-			symMerge(data, a, a+blockSize, b)
-			a = b
-			b += 2 * blockSize
-		}
-		if m := a + blockSize; m < n {
-			symMerge(data, a, m, n)
-		}
-		blockSize *= 2
-	}
-}
-
-// SymMerge merges the two sorted subsequences data[a:m] and data[m:b] using
-// the SymMerge algorithm from Pok-Son Kim and Arne Kutzner, "Stable Minimum
-// Storage Merging by Symmetric Comparisons", in Susanne Albers and Tomasz
-// Radzik, editors, Algorithms - ESA 2004, volume 3221 of Lecture Notes in
-// Computer Science, pages 714-723. Springer, 2004.
-//
-// Let M = m-a and N = b-n. Wolog M < N.
-// The recursion depth is bound by ceil(log(N+M)).
-// The algorithm needs O(M*log(N/M + 1)) calls to data.Less.
-// The algorithm needs O((M+N)*log(M)) calls to data.Swap.
-//
-// The paper gives O((M+N)*log(M)) as the number of assignments assuming a
-// rotation algorithm which uses O(M+N+gcd(M+N)) assignments. The argumentation
-// in the paper carries through for Swap operations, especially as the block
-// swapping rotate uses only O(M+N) Swaps.
-//
-// symMerge assumes non-degenerate arguments: a < m && m < b.
-// Having the caller check this condition eliminates many leaf recursion calls,
-// which improves performance.
-func symMerge(data Interface, a, m, b int) {
-	// Avoid unnecessary recursions of symMerge
-	// by direct insertion of data[a] into data[m:b]
-	// if data[a:m] only contains one element.
-	if m-a == 1 {
-		// Use binary search to find the lowest index i
-		// such that data[i] >= data[a] for m <= i < b.
-		// Exit the search loop with i == b in case no such index exists.
-		i := m
-		j := b
-		for i < j {
-			h := i + (j-i)/2
-			if data.Less(h, a) {
-				i = h + 1
-			} else {
-				j = h
-			}
-		}
-		// Swap values until data[a] reaches the position before i.
-		for k := a; k < i-1; k++ {
-			data.Swap(k, k+1)
-		}
-		return
-	}
-
-	// Avoid unnecessary recursions of symMerge
-	// by direct insertion of data[m] into data[a:m]
-	// if data[m:b] only contains one element.
-	if b-m == 1 {
-		// Use binary search to find the lowest index i
-		// such that data[i] > data[m] for a <= i < m.
-		// Exit the search loop with i == m in case no such index exists.
-		i := a
-		j := m
-		for i < j {
-			h := i + (j-i)/2
-			if !data.Less(m, h) {
-				i = h + 1
-			} else {
-				j = h
-			}
-		}
-		// Swap values until data[m] reaches the position i.
-		for k := m; k > i; k-- {
-			data.Swap(k, k-1)
-		}
-		return
-	}
-
-	mid := a + (b-a)/2
-	n := mid + m
-	var start, r int
-	if m > mid {
-		start = n - b
-		r = mid
-	} else {
-		start = a
-		r = m
-	}
-	p := n - 1
-
-	for start < r {
-		c := start + (r-start)/2
-		if !data.Less(p-c, c) {
-			start = c + 1
-		} else {
-			r = c
-		}
-	}
-
-	end := n - start
-	if start < m && m < end {
-		rotate(data, start, m, end)
-	}
-	if a < start && start < mid {
-		symMerge(data, a, start, mid)
-	}
-	if mid < end && end < b {
-		symMerge(data, mid, end, b)
-	}
-}
-
-// Rotate two consecutives blocks u = data[a:m] and v = data[m:b] in data:
-// Data of the form 'x u v y' is changed to 'x v u y'.
-// Rotate performs at most b-a many calls to data.Swap.
-// Rotate assumes non-degenerate arguments: a < m && m < b.
-func rotate(data Interface, a, m, b int) {
-	i := m - a
-	j := b - m
-
-	for i != j {
-		if i > j {
-			swapRange(data, m-i, m, j)
-			i -= j
-		} else {
-			swapRange(data, m-i, m+j-i, i)
-			j -= i
-		}
-	}
-	// i == j
-	swapRange(data, m-i, m, i)
-}
-
-/*
-Complexity of Stable Sorting
-
-
-Complexity of block swapping rotation
-
-Each Swap puts one new element into its correct, final position.
-Elements which reach their final position are no longer moved.
-Thus block swapping rotation needs |u|+|v| calls to Swaps.
-This is best possible as each element might need a move.
-
-Pay attention when comparing to other optimal algorithms which
-typically count the number of assignments instead of swaps:
-E.g. the optimal algorithm of Dudzinski and Dydek for in-place
-rotations uses O(u + v + gcd(u,v)) assignments which is
-better than our O(3 * (u+v)) as gcd(u,v) <= u.
-
-
-Stable sorting by SymMerge and BlockSwap rotations
-
-SymMerg complexity for same size input M = N:
-Calls to Less:  O(M*log(N/M+1)) = O(N*log(2)) = O(N)
-Calls to Swap:  O((M+N)*log(M)) = O(2*N*log(N)) = O(N*log(N))
-
-(The following argument does not fuzz over a missing -1 or
-other stuff which does not impact the final result).
-
-Let n = data.Len(). Assume n = 2^k.
-
-Plain merge sort performs log(n) = k iterations.
-On iteration i the algorithm merges 2^(k-i) blocks, each of size 2^i.
-
-Thus iteration i of merge sort performs:
-Calls to Less  O(2^(k-i) * 2^i) = O(2^k) = O(2^log(n)) = O(n)
-Calls to Swap  O(2^(k-i) * 2^i * log(2^i)) = O(2^k * i) = O(n*i)
-
-In total k = log(n) iterations are performed; so in total:
-Calls to Less O(log(n) * n)
-Calls to Swap O(n + 2*n + 3*n + ... + (k-1)*n + k*n)
-   = O((k/2) * k * n) = O(n * k^2) = O(n * log^2(n))
-
-
-Above results should generalize to arbitrary n = 2^k + p
-and should not be influenced by the initial insertion sort phase:
-Insertion sort is O(n^2) on Swap and Less, thus O(bs^2) per block of
-size bs at n/bs blocks:  O(bs*n) Swaps and Less during insertion sort.
-Merge sort iterations start at i = log(bs). With t = log(bs) constant:
-Calls to Less O((log(n)-t) * n + bs*n) = O(log(n)*n + (bs-t)*n)
-   = O(n * log(n))
-Calls to Swap O(n * log^2(n) - (t^2+t)/2*n) = O(n * log^2(n))
-
-*/
diff --git a/third_party/gofrontend/libgo/go/sort/sort_test.go b/third_party/gofrontend/libgo/go/sort/sort_test.go
deleted file mode 100644
index 6c36f30..0000000
--- a/third_party/gofrontend/libgo/go/sort/sort_test.go
+++ /dev/null
@@ -1,553 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sort_test
-
-import (
-	"fmt"
-	"math"
-	"math/rand"
-	. "sort"
-	"strconv"
-	"testing"
-)
-
-var ints = [...]int{74, 59, 238, -784, 9845, 959, 905, 0, 0, 42, 7586, -5467984, 7586}
-var float64s = [...]float64{74.3, 59.0, math.Inf(1), 238.2, -784.0, 2.3, math.NaN(), math.NaN(), math.Inf(-1), 9845.768, -959.7485, 905, 7.8, 7.8}
-var strings = [...]string{"", "Hello", "foo", "bar", "foo", "f00", "%*&^*&^&", "***"}
-
-func TestSortIntSlice(t *testing.T) {
-	data := ints
-	a := IntSlice(data[0:])
-	Sort(a)
-	if !IsSorted(a) {
-		t.Errorf("sorted %v", ints)
-		t.Errorf("   got %v", data)
-	}
-}
-
-func TestSortFloat64Slice(t *testing.T) {
-	data := float64s
-	a := Float64Slice(data[0:])
-	Sort(a)
-	if !IsSorted(a) {
-		t.Errorf("sorted %v", float64s)
-		t.Errorf("   got %v", data)
-	}
-}
-
-func TestSortStringSlice(t *testing.T) {
-	data := strings
-	a := StringSlice(data[0:])
-	Sort(a)
-	if !IsSorted(a) {
-		t.Errorf("sorted %v", strings)
-		t.Errorf("   got %v", data)
-	}
-}
-
-func TestInts(t *testing.T) {
-	data := ints
-	Ints(data[0:])
-	if !IntsAreSorted(data[0:]) {
-		t.Errorf("sorted %v", ints)
-		t.Errorf("   got %v", data)
-	}
-}
-
-func TestFloat64s(t *testing.T) {
-	data := float64s
-	Float64s(data[0:])
-	if !Float64sAreSorted(data[0:]) {
-		t.Errorf("sorted %v", float64s)
-		t.Errorf("   got %v", data)
-	}
-}
-
-func TestStrings(t *testing.T) {
-	data := strings
-	Strings(data[0:])
-	if !StringsAreSorted(data[0:]) {
-		t.Errorf("sorted %v", strings)
-		t.Errorf("   got %v", data)
-	}
-}
-
-func TestSortLarge_Random(t *testing.T) {
-	n := 1000000
-	if testing.Short() {
-		n /= 100
-	}
-	data := make([]int, n)
-	for i := 0; i < len(data); i++ {
-		data[i] = rand.Intn(100)
-	}
-	if IntsAreSorted(data) {
-		t.Fatalf("terrible rand.rand")
-	}
-	Ints(data)
-	if !IntsAreSorted(data) {
-		t.Errorf("sort didn't sort - 1M ints")
-	}
-}
-
-func TestReverseSortIntSlice(t *testing.T) {
-	data := ints
-	data1 := ints
-	a := IntSlice(data[0:])
-	Sort(a)
-	r := IntSlice(data1[0:])
-	Sort(Reverse(r))
-	for i := 0; i < len(data); i++ {
-		if a[i] != r[len(data)-1-i] {
-			t.Errorf("reverse sort didn't sort")
-		}
-		if i > len(data)/2 {
-			break
-		}
-	}
-}
-
-func BenchmarkSortString1K(b *testing.B) {
-	b.StopTimer()
-	for i := 0; i < b.N; i++ {
-		data := make([]string, 1<<10)
-		for i := 0; i < len(data); i++ {
-			data[i] = strconv.Itoa(i ^ 0x2cc)
-		}
-		b.StartTimer()
-		Strings(data)
-		b.StopTimer()
-	}
-}
-
-func BenchmarkStableString1K(b *testing.B) {
-	b.StopTimer()
-	for i := 0; i < b.N; i++ {
-		data := make([]string, 1<<10)
-		for i := 0; i < len(data); i++ {
-			data[i] = strconv.Itoa(i ^ 0x2cc)
-		}
-		b.StartTimer()
-		Stable(StringSlice(data))
-		b.StopTimer()
-	}
-}
-
-func BenchmarkSortInt1K(b *testing.B) {
-	b.StopTimer()
-	for i := 0; i < b.N; i++ {
-		data := make([]int, 1<<10)
-		for i := 0; i < len(data); i++ {
-			data[i] = i ^ 0x2cc
-		}
-		b.StartTimer()
-		Ints(data)
-		b.StopTimer()
-	}
-}
-
-func BenchmarkStableInt1K(b *testing.B) {
-	b.StopTimer()
-	for i := 0; i < b.N; i++ {
-		data := make([]int, 1<<10)
-		for i := 0; i < len(data); i++ {
-			data[i] = i ^ 0x2cc
-		}
-		b.StartTimer()
-		Stable(IntSlice(data))
-		b.StopTimer()
-	}
-}
-
-func BenchmarkSortInt64K(b *testing.B) {
-	b.StopTimer()
-	for i := 0; i < b.N; i++ {
-		data := make([]int, 1<<16)
-		for i := 0; i < len(data); i++ {
-			data[i] = i ^ 0xcccc
-		}
-		b.StartTimer()
-		Ints(data)
-		b.StopTimer()
-	}
-}
-
-func BenchmarkStableInt64K(b *testing.B) {
-	b.StopTimer()
-	for i := 0; i < b.N; i++ {
-		data := make([]int, 1<<16)
-		for i := 0; i < len(data); i++ {
-			data[i] = i ^ 0xcccc
-		}
-		b.StartTimer()
-		Stable(IntSlice(data))
-		b.StopTimer()
-	}
-}
-
-const (
-	_Sawtooth = iota
-	_Rand
-	_Stagger
-	_Plateau
-	_Shuffle
-	_NDist
-)
-
-const (
-	_Copy = iota
-	_Reverse
-	_ReverseFirstHalf
-	_ReverseSecondHalf
-	_Sorted
-	_Dither
-	_NMode
-)
-
-type testingData struct {
-	desc        string
-	t           *testing.T
-	data        []int
-	maxswap     int // number of swaps allowed
-	ncmp, nswap int
-}
-
-func (d *testingData) Len() int { return len(d.data) }
-func (d *testingData) Less(i, j int) bool {
-	d.ncmp++
-	return d.data[i] < d.data[j]
-}
-func (d *testingData) Swap(i, j int) {
-	if d.nswap >= d.maxswap {
-		d.t.Errorf("%s: used %d swaps sorting slice of %d", d.desc, d.nswap, len(d.data))
-		d.t.FailNow()
-	}
-	d.nswap++
-	d.data[i], d.data[j] = d.data[j], d.data[i]
-}
-
-func min(a, b int) int {
-	if a < b {
-		return a
-	}
-	return b
-}
-
-func lg(n int) int {
-	i := 0
-	for 1<<uint(i) < n {
-		i++
-	}
-	return i
-}
-
-func testBentleyMcIlroy(t *testing.T, sort func(Interface), maxswap func(int) int) {
-	sizes := []int{100, 1023, 1024, 1025}
-	if testing.Short() {
-		sizes = []int{100, 127, 128, 129}
-	}
-	dists := []string{"sawtooth", "rand", "stagger", "plateau", "shuffle"}
-	modes := []string{"copy", "reverse", "reverse1", "reverse2", "sort", "dither"}
-	var tmp1, tmp2 [1025]int
-	for _, n := range sizes {
-		for m := 1; m < 2*n; m *= 2 {
-			for dist := 0; dist < _NDist; dist++ {
-				j := 0
-				k := 1
-				data := tmp1[0:n]
-				for i := 0; i < n; i++ {
-					switch dist {
-					case _Sawtooth:
-						data[i] = i % m
-					case _Rand:
-						data[i] = rand.Intn(m)
-					case _Stagger:
-						data[i] = (i*m + i) % n
-					case _Plateau:
-						data[i] = min(i, m)
-					case _Shuffle:
-						if rand.Intn(m) != 0 {
-							j += 2
-							data[i] = j
-						} else {
-							k += 2
-							data[i] = k
-						}
-					}
-				}
-
-				mdata := tmp2[0:n]
-				for mode := 0; mode < _NMode; mode++ {
-					switch mode {
-					case _Copy:
-						for i := 0; i < n; i++ {
-							mdata[i] = data[i]
-						}
-					case _Reverse:
-						for i := 0; i < n; i++ {
-							mdata[i] = data[n-i-1]
-						}
-					case _ReverseFirstHalf:
-						for i := 0; i < n/2; i++ {
-							mdata[i] = data[n/2-i-1]
-						}
-						for i := n / 2; i < n; i++ {
-							mdata[i] = data[i]
-						}
-					case _ReverseSecondHalf:
-						for i := 0; i < n/2; i++ {
-							mdata[i] = data[i]
-						}
-						for i := n / 2; i < n; i++ {
-							mdata[i] = data[n-(i-n/2)-1]
-						}
-					case _Sorted:
-						for i := 0; i < n; i++ {
-							mdata[i] = data[i]
-						}
-						// Ints is known to be correct
-						// because mode Sort runs after mode _Copy.
-						Ints(mdata)
-					case _Dither:
-						for i := 0; i < n; i++ {
-							mdata[i] = data[i] + i%5
-						}
-					}
-
-					desc := fmt.Sprintf("n=%d m=%d dist=%s mode=%s", n, m, dists[dist], modes[mode])
-					d := &testingData{desc: desc, t: t, data: mdata[0:n], maxswap: maxswap(n)}
-					sort(d)
-					// Uncomment if you are trying to improve the number of compares/swaps.
-					//t.Logf("%s: ncmp=%d, nswp=%d", desc, d.ncmp, d.nswap)
-
-					// If we were testing C qsort, we'd have to make a copy
-					// of the slice and sort it ourselves and then compare
-					// x against it, to ensure that qsort was only permuting
-					// the data, not (for example) overwriting it with zeros.
-					//
-					// In go, we don't have to be so paranoid: since the only
-					// mutating method Sort can call is TestingData.swap,
-					// it suffices here just to check that the final slice is sorted.
-					if !IntsAreSorted(mdata) {
-						t.Errorf("%s: ints not sorted", desc)
-						t.Errorf("\t%v", mdata)
-						t.FailNow()
-					}
-				}
-			}
-		}
-	}
-}
-
-func TestSortBM(t *testing.T) {
-	testBentleyMcIlroy(t, Sort, func(n int) int { return n * lg(n) * 12 / 10 })
-}
-
-func TestHeapsortBM(t *testing.T) {
-	testBentleyMcIlroy(t, Heapsort, func(n int) int { return n * lg(n) * 12 / 10 })
-}
-
-func TestStableBM(t *testing.T) {
-	testBentleyMcIlroy(t, Stable, func(n int) int { return n * lg(n) * lg(n) / 3 })
-}
-
-// This is based on the "antiquicksort" implementation by M. Douglas McIlroy.
-// See http://www.cs.dartmouth.edu/~doug/mdmspe.pdf for more info.
-type adversaryTestingData struct {
-	data      []int
-	keys      map[int]int
-	candidate int
-}
-
-func (d *adversaryTestingData) Len() int { return len(d.data) }
-
-func (d *adversaryTestingData) Less(i, j int) bool {
-	if _, present := d.keys[i]; !present {
-		if _, present := d.keys[j]; !present {
-			if i == d.candidate {
-				d.keys[i] = len(d.keys)
-			} else {
-				d.keys[j] = len(d.keys)
-			}
-		}
-	}
-
-	if _, present := d.keys[i]; !present {
-		d.candidate = i
-		return false
-	}
-	if _, present := d.keys[j]; !present {
-		d.candidate = j
-		return true
-	}
-
-	return d.keys[i] >= d.keys[j]
-}
-
-func (d *adversaryTestingData) Swap(i, j int) {
-	d.data[i], d.data[j] = d.data[j], d.data[i]
-}
-
-func TestAdversary(t *testing.T) {
-	const size = 100
-	data := make([]int, size)
-	for i := 0; i < size; i++ {
-		data[i] = i
-	}
-
-	d := &adversaryTestingData{data, make(map[int]int), 0}
-	Sort(d) // This should degenerate to heapsort.
-}
-
-func TestStableInts(t *testing.T) {
-	data := ints
-	Stable(IntSlice(data[0:]))
-	if !IntsAreSorted(data[0:]) {
-		t.Errorf("nsorted %v\n   got %v", ints, data)
-	}
-}
-
-type intPairs []struct {
-	a, b int
-}
-
-// IntPairs compare on a only.
-func (d intPairs) Len() int           { return len(d) }
-func (d intPairs) Less(i, j int) bool { return d[i].a < d[j].a }
-func (d intPairs) Swap(i, j int)      { d[i], d[j] = d[j], d[i] }
-
-// Record initial order in B.
-func (d intPairs) initB() {
-	for i := range d {
-		d[i].b = i
-	}
-}
-
-// InOrder checks if a-equal elements were not reordered.
-func (d intPairs) inOrder() bool {
-	lastA, lastB := -1, 0
-	for i := 0; i < len(d); i++ {
-		if lastA != d[i].a {
-			lastA = d[i].a
-			lastB = d[i].b
-			continue
-		}
-		if d[i].b <= lastB {
-			return false
-		}
-		lastB = d[i].b
-	}
-	return true
-}
-
-func TestStability(t *testing.T) {
-	n, m := 100000, 1000
-	if testing.Short() {
-		n, m = 1000, 100
-	}
-	data := make(intPairs, n)
-
-	// random distribution
-	for i := 0; i < len(data); i++ {
-		data[i].a = rand.Intn(m)
-	}
-	if IsSorted(data) {
-		t.Fatalf("terrible rand.rand")
-	}
-	data.initB()
-	Stable(data)
-	if !IsSorted(data) {
-		t.Errorf("Stable didn't sort %d ints", n)
-	}
-	if !data.inOrder() {
-		t.Errorf("Stable wasn't stable on %d ints", n)
-	}
-
-	// already sorted
-	data.initB()
-	Stable(data)
-	if !IsSorted(data) {
-		t.Errorf("Stable shuffeled sorted %d ints (order)", n)
-	}
-	if !data.inOrder() {
-		t.Errorf("Stable shuffeled sorted %d ints (stability)", n)
-	}
-
-	// sorted reversed
-	for i := 0; i < len(data); i++ {
-		data[i].a = len(data) - i
-	}
-	data.initB()
-	Stable(data)
-	if !IsSorted(data) {
-		t.Errorf("Stable didn't sort %d ints", n)
-	}
-	if !data.inOrder() {
-		t.Errorf("Stable wasn't stable on %d ints", n)
-	}
-}
-
-var countOpsSizes = []int{1e2, 3e2, 1e3, 3e3, 1e4, 3e4, 1e5, 3e5, 1e6}
-
-func countOps(t *testing.T, algo func(Interface), name string) {
-	sizes := countOpsSizes
-	if testing.Short() {
-		sizes = sizes[:5]
-	}
-	if !testing.Verbose() {
-		t.Skip("Counting skipped as non-verbose mode.")
-	}
-	for _, n := range sizes {
-		td := testingData{
-			desc:    name,
-			t:       t,
-			data:    make([]int, n),
-			maxswap: 1<<31 - 1,
-		}
-		for i := 0; i < n; i++ {
-			td.data[i] = rand.Intn(n / 5)
-		}
-		algo(&td)
-		t.Logf("%s %8d elements: %11d Swap, %10d Less", name, n, td.nswap, td.ncmp)
-	}
-}
-
-func TestCountStableOps(t *testing.T) { countOps(t, Stable, "Stable") }
-func TestCountSortOps(t *testing.T)   { countOps(t, Sort, "Sort  ") }
-
-func bench(b *testing.B, size int, algo func(Interface), name string) {
-	b.StopTimer()
-	data := make(intPairs, size)
-	x := ^uint32(0)
-	for i := 0; i < b.N; i++ {
-		for n := size - 3; n <= size+3; n++ {
-			for i := 0; i < len(data); i++ {
-				x += x
-				x ^= 1
-				if int32(x) < 0 {
-					x ^= 0x88888eef
-				}
-				data[i].a = int(x % uint32(n/5))
-			}
-			data.initB()
-			b.StartTimer()
-			algo(data)
-			b.StopTimer()
-			if !IsSorted(data) {
-				b.Errorf("%s did not sort %d ints", name, n)
-			}
-			if name == "Stable" && !data.inOrder() {
-				b.Errorf("%s unstable on %d ints", name, n)
-			}
-		}
-	}
-}
-
-func BenchmarkSort1e2(b *testing.B)   { bench(b, 1e2, Sort, "Sort") }
-func BenchmarkStable1e2(b *testing.B) { bench(b, 1e2, Stable, "Stable") }
-func BenchmarkSort1e4(b *testing.B)   { bench(b, 1e4, Sort, "Sort") }
-func BenchmarkStable1e4(b *testing.B) { bench(b, 1e4, Stable, "Stable") }
-func BenchmarkSort1e6(b *testing.B)   { bench(b, 1e6, Sort, "Sort") }
-func BenchmarkStable1e6(b *testing.B) { bench(b, 1e6, Stable, "Stable") }
diff --git a/third_party/gofrontend/libgo/go/strconv/atob.go b/third_party/gofrontend/libgo/go/strconv/atob.go
deleted file mode 100644
index d0cb097..0000000
--- a/third_party/gofrontend/libgo/go/strconv/atob.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv
-
-// ParseBool returns the boolean value represented by the string.
-// It accepts 1, t, T, TRUE, true, True, 0, f, F, FALSE, false, False.
-// Any other value returns an error.
-func ParseBool(str string) (value bool, err error) {
-	switch str {
-	case "1", "t", "T", "true", "TRUE", "True":
-		return true, nil
-	case "0", "f", "F", "false", "FALSE", "False":
-		return false, nil
-	}
-	return false, syntaxError("ParseBool", str)
-}
-
-// FormatBool returns "true" or "false" according to the value of b
-func FormatBool(b bool) string {
-	if b {
-		return "true"
-	}
-	return "false"
-}
-
-// AppendBool appends "true" or "false", according to the value of b,
-// to dst and returns the extended buffer.
-func AppendBool(dst []byte, b bool) []byte {
-	if b {
-		return append(dst, "true"...)
-	}
-	return append(dst, "false"...)
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/atob_test.go b/third_party/gofrontend/libgo/go/strconv/atob_test.go
deleted file mode 100644
index 28f469f..0000000
--- a/third_party/gofrontend/libgo/go/strconv/atob_test.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv_test
-
-import (
-	"bytes"
-	. "strconv"
-	"testing"
-)
-
-type atobTest struct {
-	in  string
-	out bool
-	err error
-}
-
-var atobtests = []atobTest{
-	{"", false, ErrSyntax},
-	{"asdf", false, ErrSyntax},
-	{"0", false, nil},
-	{"f", false, nil},
-	{"F", false, nil},
-	{"FALSE", false, nil},
-	{"false", false, nil},
-	{"False", false, nil},
-	{"1", true, nil},
-	{"t", true, nil},
-	{"T", true, nil},
-	{"TRUE", true, nil},
-	{"true", true, nil},
-	{"True", true, nil},
-}
-
-func TestParseBool(t *testing.T) {
-	for _, test := range atobtests {
-		b, e := ParseBool(test.in)
-		if test.err != nil {
-			// expect an error
-			if e == nil {
-				t.Errorf("%s: expected %s but got nil", test.in, test.err)
-			} else {
-				// NumError assertion must succeed; it's the only thing we return.
-				if test.err != e.(*NumError).Err {
-					t.Errorf("%s: expected %s but got %s", test.in, test.err, e)
-				}
-			}
-		} else {
-			if e != nil {
-				t.Errorf("%s: expected no error but got %s", test.in, e)
-			}
-			if b != test.out {
-				t.Errorf("%s: expected %t but got %t", test.in, test.out, b)
-			}
-		}
-	}
-}
-
-var boolString = map[bool]string{
-	true:  "true",
-	false: "false",
-}
-
-func TestFormatBool(t *testing.T) {
-	for b, s := range boolString {
-		if f := FormatBool(b); f != s {
-			t.Errorf(`FormatBool(%v): expected %q but got %q`, b, s, f)
-		}
-	}
-}
-
-type appendBoolTest struct {
-	b   bool
-	in  []byte
-	out []byte
-}
-
-var appendBoolTests = []appendBoolTest{
-	{true, []byte("foo "), []byte("foo true")},
-	{false, []byte("foo "), []byte("foo false")},
-}
-
-func TestAppendBool(t *testing.T) {
-	for _, test := range appendBoolTests {
-		b := AppendBool(test.in, test.b)
-		if !bytes.Equal(b, test.out) {
-			t.Errorf("AppendBool(%q, %v): expected %q but got %q", test.in, test.b, test.out, b)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/atof.go b/third_party/gofrontend/libgo/go/strconv/atof.go
deleted file mode 100644
index a4f4862..0000000
--- a/third_party/gofrontend/libgo/go/strconv/atof.go
+++ /dev/null
@@ -1,544 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv
-
-// decimal to binary floating point conversion.
-// Algorithm:
-//   1) Store input in multiprecision decimal.
-//   2) Multiply/divide decimal by powers of two until in range [0.5, 1)
-//   3) Multiply by 2^precision and round to get mantissa.
-
-import "math"
-import "runtime"
-
-var optimize = true // can change for testing
-
-func equalIgnoreCase(s1, s2 string) bool {
-	if len(s1) != len(s2) {
-		return false
-	}
-	for i := 0; i < len(s1); i++ {
-		c1 := s1[i]
-		if 'A' <= c1 && c1 <= 'Z' {
-			c1 += 'a' - 'A'
-		}
-		c2 := s2[i]
-		if 'A' <= c2 && c2 <= 'Z' {
-			c2 += 'a' - 'A'
-		}
-		if c1 != c2 {
-			return false
-		}
-	}
-	return true
-}
-
-func special(s string) (f float64, ok bool) {
-	if len(s) == 0 {
-		return
-	}
-	switch s[0] {
-	default:
-		return
-	case '+':
-		if equalIgnoreCase(s, "+inf") || equalIgnoreCase(s, "+infinity") {
-			return math.Inf(1), true
-		}
-	case '-':
-		if equalIgnoreCase(s, "-inf") || equalIgnoreCase(s, "-infinity") {
-			return math.Inf(-1), true
-		}
-	case 'n', 'N':
-		if equalIgnoreCase(s, "nan") {
-			return math.NaN(), true
-		}
-	case 'i', 'I':
-		if equalIgnoreCase(s, "inf") || equalIgnoreCase(s, "infinity") {
-			return math.Inf(1), true
-		}
-	}
-	return
-}
-
-func (b *decimal) set(s string) (ok bool) {
-	i := 0
-	b.neg = false
-	b.trunc = false
-
-	// optional sign
-	if i >= len(s) {
-		return
-	}
-	switch {
-	case s[i] == '+':
-		i++
-	case s[i] == '-':
-		b.neg = true
-		i++
-	}
-
-	// digits
-	sawdot := false
-	sawdigits := false
-	for ; i < len(s); i++ {
-		switch {
-		case s[i] == '.':
-			if sawdot {
-				return
-			}
-			sawdot = true
-			b.dp = b.nd
-			continue
-
-		case '0' <= s[i] && s[i] <= '9':
-			sawdigits = true
-			if s[i] == '0' && b.nd == 0 { // ignore leading zeros
-				b.dp--
-				continue
-			}
-			if b.nd < len(b.d) {
-				b.d[b.nd] = s[i]
-				b.nd++
-			} else if s[i] != '0' {
-				b.trunc = true
-			}
-			continue
-		}
-		break
-	}
-	if !sawdigits {
-		return
-	}
-	if !sawdot {
-		b.dp = b.nd
-	}
-
-	// optional exponent moves decimal point.
-	// if we read a very large, very long number,
-	// just be sure to move the decimal point by
-	// a lot (say, 100000).  it doesn't matter if it's
-	// not the exact number.
-	if i < len(s) && (s[i] == 'e' || s[i] == 'E') {
-		i++
-		if i >= len(s) {
-			return
-		}
-		esign := 1
-		if s[i] == '+' {
-			i++
-		} else if s[i] == '-' {
-			i++
-			esign = -1
-		}
-		if i >= len(s) || s[i] < '0' || s[i] > '9' {
-			return
-		}
-		e := 0
-		for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
-			if e < 10000 {
-				e = e*10 + int(s[i]) - '0'
-			}
-		}
-		b.dp += e * esign
-	}
-
-	if i != len(s) {
-		return
-	}
-
-	ok = true
-	return
-}
-
-// readFloat reads a decimal mantissa and exponent from a float
-// string representation. It sets ok to false if the number could
-// not fit return types or is invalid.
-func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) {
-	const uint64digits = 19
-	i := 0
-
-	// optional sign
-	if i >= len(s) {
-		return
-	}
-	switch {
-	case s[i] == '+':
-		i++
-	case s[i] == '-':
-		neg = true
-		i++
-	}
-
-	// digits
-	sawdot := false
-	sawdigits := false
-	nd := 0
-	ndMant := 0
-	dp := 0
-	for ; i < len(s); i++ {
-		switch c := s[i]; true {
-		case c == '.':
-			if sawdot {
-				return
-			}
-			sawdot = true
-			dp = nd
-			continue
-
-		case '0' <= c && c <= '9':
-			sawdigits = true
-			if c == '0' && nd == 0 { // ignore leading zeros
-				dp--
-				continue
-			}
-			nd++
-			if ndMant < uint64digits {
-				mantissa *= 10
-				mantissa += uint64(c - '0')
-				ndMant++
-			} else if s[i] != '0' {
-				trunc = true
-			}
-			continue
-		}
-		break
-	}
-	if !sawdigits {
-		return
-	}
-	if !sawdot {
-		dp = nd
-	}
-
-	// optional exponent moves decimal point.
-	// if we read a very large, very long number,
-	// just be sure to move the decimal point by
-	// a lot (say, 100000).  it doesn't matter if it's
-	// not the exact number.
-	if i < len(s) && (s[i] == 'e' || s[i] == 'E') {
-		i++
-		if i >= len(s) {
-			return
-		}
-		esign := 1
-		if s[i] == '+' {
-			i++
-		} else if s[i] == '-' {
-			i++
-			esign = -1
-		}
-		if i >= len(s) || s[i] < '0' || s[i] > '9' {
-			return
-		}
-		e := 0
-		for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
-			if e < 10000 {
-				e = e*10 + int(s[i]) - '0'
-			}
-		}
-		dp += e * esign
-	}
-
-	if i != len(s) {
-		return
-	}
-
-	exp = dp - ndMant
-	ok = true
-	return
-
-}
-
-// decimal power of ten to binary power of two.
-var powtab = []int{1, 3, 6, 9, 13, 16, 19, 23, 26}
-
-func (d *decimal) floatBits(flt *floatInfo) (b uint64, overflow bool) {
-	var exp int
-	var mant uint64
-
-	// Zero is always a special case.
-	if d.nd == 0 {
-		mant = 0
-		exp = flt.bias
-		goto out
-	}
-
-	// Obvious overflow/underflow.
-	// These bounds are for 64-bit floats.
-	// Will have to change if we want to support 80-bit floats in the future.
-	if d.dp > 310 {
-		goto overflow
-	}
-	if d.dp < -330 {
-		// zero
-		mant = 0
-		exp = flt.bias
-		goto out
-	}
-
-	// Scale by powers of two until in range [0.5, 1.0)
-	exp = 0
-	for d.dp > 0 {
-		var n int
-		if d.dp >= len(powtab) {
-			n = 27
-		} else {
-			n = powtab[d.dp]
-		}
-		d.Shift(-n)
-		exp += n
-	}
-	for d.dp < 0 || d.dp == 0 && d.d[0] < '5' {
-		var n int
-		if -d.dp >= len(powtab) {
-			n = 27
-		} else {
-			n = powtab[-d.dp]
-		}
-		d.Shift(n)
-		exp -= n
-	}
-
-	// Our range is [0.5,1) but floating point range is [1,2).
-	exp--
-
-	// Minimum representable exponent is flt.bias+1.
-	// If the exponent is smaller, move it up and
-	// adjust d accordingly.
-	if exp < flt.bias+1 {
-		n := flt.bias + 1 - exp
-		d.Shift(-n)
-		exp += n
-	}
-
-	if exp-flt.bias >= 1<<flt.expbits-1 {
-		goto overflow
-	}
-
-	// Extract 1+flt.mantbits bits.
-	d.Shift(int(1 + flt.mantbits))
-	mant = d.RoundedInteger()
-
-	// Rounding might have added a bit; shift down.
-	if mant == 2<<flt.mantbits {
-		mant >>= 1
-		exp++
-		if exp-flt.bias >= 1<<flt.expbits-1 {
-			goto overflow
-		}
-	}
-
-	// Denormalized?
-	if mant&(1<<flt.mantbits) == 0 {
-		exp = flt.bias
-	}
-	goto out
-
-overflow:
-	// ±Inf
-	mant = 0
-	exp = 1<<flt.expbits - 1 + flt.bias
-	overflow = true
-
-out:
-	// Assemble bits.
-	bits := mant & (uint64(1)<<flt.mantbits - 1)
-	bits |= uint64((exp-flt.bias)&(1<<flt.expbits-1)) << flt.mantbits
-	if d.neg {
-		bits |= 1 << flt.mantbits << flt.expbits
-	}
-	return bits, overflow
-}
-
-// Exact powers of 10.
-var float64pow10 = []float64{
-	1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
-	1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
-	1e20, 1e21, 1e22,
-}
-var float32pow10 = []float32{1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10}
-
-// If possible to convert decimal representation to 64-bit float f exactly,
-// entirely in floating-point math, do so, avoiding the expense of decimalToFloatBits.
-// Three common cases:
-//	value is exact integer
-//	value is exact integer * exact power of ten
-//	value is exact integer / exact power of ten
-// These all produce potentially inexact but correctly rounded answers.
-func atof64exact(mantissa uint64, exp int, neg bool) (f float64, ok bool) {
-	if mantissa>>float64info.mantbits != 0 {
-		return
-	}
-	// gccgo gets this wrong on 32-bit i386 when not using -msse.
-	// See TestRoundTrip in atof_test.go for a test case.
-	if runtime.GOARCH == "386" {
-		return
-	}
-	f = float64(mantissa)
-	if neg {
-		f = -f
-	}
-	switch {
-	case exp == 0:
-		// an integer.
-		return f, true
-	// Exact integers are <= 10^15.
-	// Exact powers of ten are <= 10^22.
-	case exp > 0 && exp <= 15+22: // int * 10^k
-		// If exponent is big but number of digits is not,
-		// can move a few zeros into the integer part.
-		if exp > 22 {
-			f *= float64pow10[exp-22]
-			exp = 22
-		}
-		if f > 1e15 || f < -1e15 {
-			// the exponent was really too large.
-			return
-		}
-		return f * float64pow10[exp], true
-	case exp < 0 && exp >= -22: // int / 10^k
-		return f / float64pow10[-exp], true
-	}
-	return
-}
-
-// If possible to compute mantissa*10^exp to 32-bit float f exactly,
-// entirely in floating-point math, do so, avoiding the machinery above.
-func atof32exact(mantissa uint64, exp int, neg bool) (f float32, ok bool) {
-	if mantissa>>float32info.mantbits != 0 {
-		return
-	}
-	f = float32(mantissa)
-	if neg {
-		f = -f
-	}
-	switch {
-	case exp == 0:
-		return f, true
-	// Exact integers are <= 10^7.
-	// Exact powers of ten are <= 10^10.
-	case exp > 0 && exp <= 7+10: // int * 10^k
-		// If exponent is big but number of digits is not,
-		// can move a few zeros into the integer part.
-		if exp > 10 {
-			f *= float32pow10[exp-10]
-			exp = 10
-		}
-		if f > 1e7 || f < -1e7 {
-			// the exponent was really too large.
-			return
-		}
-		return f * float32pow10[exp], true
-	case exp < 0 && exp >= -10: // int / 10^k
-		return f / float32pow10[-exp], true
-	}
-	return
-}
-
-const fnParseFloat = "ParseFloat"
-
-func atof32(s string) (f float32, err error) {
-	if val, ok := special(s); ok {
-		return float32(val), nil
-	}
-
-	if optimize {
-		// Parse mantissa and exponent.
-		mantissa, exp, neg, trunc, ok := readFloat(s)
-		if ok {
-			// Try pure floating-point arithmetic conversion.
-			if !trunc {
-				if f, ok := atof32exact(mantissa, exp, neg); ok {
-					return f, nil
-				}
-			}
-			// Try another fast path.
-			ext := new(extFloat)
-			if ok := ext.AssignDecimal(mantissa, exp, neg, trunc, &float32info); ok {
-				b, ovf := ext.floatBits(&float32info)
-				f = math.Float32frombits(uint32(b))
-				if ovf {
-					err = rangeError(fnParseFloat, s)
-				}
-				return f, err
-			}
-		}
-	}
-	var d decimal
-	if !d.set(s) {
-		return 0, syntaxError(fnParseFloat, s)
-	}
-	b, ovf := d.floatBits(&float32info)
-	f = math.Float32frombits(uint32(b))
-	if ovf {
-		err = rangeError(fnParseFloat, s)
-	}
-	return f, err
-}
-
-func atof64(s string) (f float64, err error) {
-	if val, ok := special(s); ok {
-		return val, nil
-	}
-
-	if optimize {
-		// Parse mantissa and exponent.
-		mantissa, exp, neg, trunc, ok := readFloat(s)
-		if ok {
-			// Try pure floating-point arithmetic conversion.
-			if !trunc {
-				if f, ok := atof64exact(mantissa, exp, neg); ok {
-					return f, nil
-				}
-			}
-			// Try another fast path.
-			ext := new(extFloat)
-			if ok := ext.AssignDecimal(mantissa, exp, neg, trunc, &float64info); ok {
-				b, ovf := ext.floatBits(&float64info)
-				f = math.Float64frombits(b)
-				if ovf {
-					err = rangeError(fnParseFloat, s)
-				}
-				return f, err
-			}
-		}
-	}
-	var d decimal
-	if !d.set(s) {
-		return 0, syntaxError(fnParseFloat, s)
-	}
-	b, ovf := d.floatBits(&float64info)
-	f = math.Float64frombits(b)
-	if ovf {
-		err = rangeError(fnParseFloat, s)
-	}
-	return f, err
-}
-
-// ParseFloat converts the string s to a floating-point number
-// with the precision specified by bitSize: 32 for float32, or 64 for float64.
-// When bitSize=32, the result still has type float64, but it will be
-// convertible to float32 without changing its value.
-//
-// If s is well-formed and near a valid floating point number,
-// ParseFloat returns the nearest floating point number rounded
-// using IEEE754 unbiased rounding.
-//
-// The errors that ParseFloat returns have concrete type *NumError
-// and include err.Num = s.
-//
-// If s is not syntactically well-formed, ParseFloat returns err.Err = ErrSyntax.
-//
-// If s is syntactically well-formed but is more than 1/2 ULP
-// away from the largest floating point number of the given size,
-// ParseFloat returns f = ±Inf, err.Err = ErrRange.
-func ParseFloat(s string, bitSize int) (f float64, err error) {
-	if bitSize == 32 {
-		f1, err1 := atof32(s)
-		return float64(f1), err1
-	}
-	f1, err1 := atof64(s)
-	return f1, err1
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/atof_test.go b/third_party/gofrontend/libgo/go/strconv/atof_test.go
deleted file mode 100644
index ba49332..0000000
--- a/third_party/gofrontend/libgo/go/strconv/atof_test.go
+++ /dev/null
@@ -1,430 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv_test
-
-import (
-	"math"
-	"math/rand"
-	"reflect"
-	. "strconv"
-	"strings"
-	"testing"
-	"time"
-)
-
-type atofTest struct {
-	in  string
-	out string
-	err error
-}
-
-var atoftests = []atofTest{
-	{"", "0", ErrSyntax},
-	{"1", "1", nil},
-	{"+1", "1", nil},
-	{"1x", "0", ErrSyntax},
-	{"1.1.", "0", ErrSyntax},
-	{"1e23", "1e+23", nil},
-	{"1E23", "1e+23", nil},
-	{"100000000000000000000000", "1e+23", nil},
-	{"1e-100", "1e-100", nil},
-	{"123456700", "1.234567e+08", nil},
-	{"99999999999999974834176", "9.999999999999997e+22", nil},
-	{"100000000000000000000001", "1.0000000000000001e+23", nil},
-	{"100000000000000008388608", "1.0000000000000001e+23", nil},
-	{"100000000000000016777215", "1.0000000000000001e+23", nil},
-	{"100000000000000016777216", "1.0000000000000003e+23", nil},
-	{"-1", "-1", nil},
-	{"-0.1", "-0.1", nil},
-	{"-0", "-0", nil},
-	{"1e-20", "1e-20", nil},
-	{"625e-3", "0.625", nil},
-
-	// NaNs
-	{"nan", "NaN", nil},
-	{"NaN", "NaN", nil},
-	{"NAN", "NaN", nil},
-
-	// Infs
-	{"inf", "+Inf", nil},
-	{"-Inf", "-Inf", nil},
-	{"+INF", "+Inf", nil},
-	{"-Infinity", "-Inf", nil},
-	{"+INFINITY", "+Inf", nil},
-	{"Infinity", "+Inf", nil},
-
-	// largest float64
-	{"1.7976931348623157e308", "1.7976931348623157e+308", nil},
-	{"-1.7976931348623157e308", "-1.7976931348623157e+308", nil},
-	// next float64 - too large
-	{"1.7976931348623159e308", "+Inf", ErrRange},
-	{"-1.7976931348623159e308", "-Inf", ErrRange},
-	// the border is ...158079
-	// borderline - okay
-	{"1.7976931348623158e308", "1.7976931348623157e+308", nil},
-	{"-1.7976931348623158e308", "-1.7976931348623157e+308", nil},
-	// borderline - too large
-	{"1.797693134862315808e308", "+Inf", ErrRange},
-	{"-1.797693134862315808e308", "-Inf", ErrRange},
-
-	// a little too large
-	{"1e308", "1e+308", nil},
-	{"2e308", "+Inf", ErrRange},
-	{"1e309", "+Inf", ErrRange},
-
-	// way too large
-	{"1e310", "+Inf", ErrRange},
-	{"-1e310", "-Inf", ErrRange},
-	{"1e400", "+Inf", ErrRange},
-	{"-1e400", "-Inf", ErrRange},
-	{"1e400000", "+Inf", ErrRange},
-	{"-1e400000", "-Inf", ErrRange},
-
-	// denormalized
-	{"1e-305", "1e-305", nil},
-	{"1e-306", "1e-306", nil},
-	{"1e-307", "1e-307", nil},
-	{"1e-308", "1e-308", nil},
-	{"1e-309", "1e-309", nil},
-	{"1e-310", "1e-310", nil},
-	{"1e-322", "1e-322", nil},
-	// smallest denormal
-	{"5e-324", "5e-324", nil},
-	{"4e-324", "5e-324", nil},
-	{"3e-324", "5e-324", nil},
-	// too small
-	{"2e-324", "0", nil},
-	// way too small
-	{"1e-350", "0", nil},
-	{"1e-400000", "0", nil},
-
-	// try to overflow exponent
-	{"1e-4294967296", "0", nil},
-	{"1e+4294967296", "+Inf", ErrRange},
-	{"1e-18446744073709551616", "0", nil},
-	{"1e+18446744073709551616", "+Inf", ErrRange},
-
-	// Parse errors
-	{"1e", "0", ErrSyntax},
-	{"1e-", "0", ErrSyntax},
-	{".e-1", "0", ErrSyntax},
-	{"1\x00.2", "0", ErrSyntax},
-
-	// http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
-	{"2.2250738585072012e-308", "2.2250738585072014e-308", nil},
-	// http://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/
-	{"2.2250738585072011e-308", "2.225073858507201e-308", nil},
-
-	// A very large number (initially wrongly parsed by the fast algorithm).
-	{"4.630813248087435e+307", "4.630813248087435e+307", nil},
-
-	// A different kind of very large number.
-	{"22.222222222222222", "22.22222222222222", nil},
-	{"2." + strings.Repeat("2", 4000) + "e+1", "22.22222222222222", nil},
-
-	// Exactly halfway between 1 and math.Nextafter(1, 2).
-	// Round to even (down).
-	{"1.00000000000000011102230246251565404236316680908203125", "1", nil},
-	// Slightly lower; still round down.
-	{"1.00000000000000011102230246251565404236316680908203124", "1", nil},
-	// Slightly higher; round up.
-	{"1.00000000000000011102230246251565404236316680908203126", "1.0000000000000002", nil},
-	// Slightly higher, but you have to read all the way to the end.
-	{"1.00000000000000011102230246251565404236316680908203125" + strings.Repeat("0", 10000) + "1", "1.0000000000000002", nil},
-}
-
-var atof32tests = []atofTest{
-	// Exactly halfway between 1 and the next float32.
-	// Round to even (down).
-	{"1.000000059604644775390625", "1", nil},
-	// Slightly lower.
-	{"1.000000059604644775390624", "1", nil},
-	// Slightly higher.
-	{"1.000000059604644775390626", "1.0000001", nil},
-	// Slightly higher, but you have to read all the way to the end.
-	{"1.000000059604644775390625" + strings.Repeat("0", 10000) + "1", "1.0000001", nil},
-
-	// largest float32: (1<<128) * (1 - 2^-24)
-	{"340282346638528859811704183484516925440", "3.4028235e+38", nil},
-	{"-340282346638528859811704183484516925440", "-3.4028235e+38", nil},
-	// next float32 - too large
-	{"3.4028236e38", "+Inf", ErrRange},
-	{"-3.4028236e38", "-Inf", ErrRange},
-	// the border is 3.40282356779...e+38
-	// borderline - okay
-	{"3.402823567e38", "3.4028235e+38", nil},
-	{"-3.402823567e38", "-3.4028235e+38", nil},
-	// borderline - too large
-	{"3.4028235678e38", "+Inf", ErrRange},
-	{"-3.4028235678e38", "-Inf", ErrRange},
-
-	// Denormals: less than 2^-126
-	{"1e-38", "1e-38", nil},
-	{"1e-39", "1e-39", nil},
-	{"1e-40", "1e-40", nil},
-	{"1e-41", "1e-41", nil},
-	{"1e-42", "1e-42", nil},
-	{"1e-43", "1e-43", nil},
-	{"1e-44", "1e-44", nil},
-	{"6e-45", "6e-45", nil}, // 4p-149 = 5.6e-45
-	{"5e-45", "6e-45", nil},
-	// Smallest denormal
-	{"1e-45", "1e-45", nil}, // 1p-149 = 1.4e-45
-	{"2e-45", "1e-45", nil},
-
-	// 2^92 = 8388608p+69 = 4951760157141521099596496896 (4.9517602e27)
-	// is an exact power of two that needs 8 decimal digits to be correctly
-	// parsed back.
-	// The float32 before is 16777215p+68 = 4.95175986e+27
-	// The halfway is 4.951760009. A bad algorithm that thinks the previous
-	// float32 is 8388607p+69 will shorten incorrectly to 4.95176e+27.
-	{"4951760157141521099596496896", "4.9517602e+27", nil},
-}
-
-type atofSimpleTest struct {
-	x float64
-	s string
-}
-
-var (
-	atofRandomTests        []atofSimpleTest
-	benchmarksRandomBits   [1024]string
-	benchmarksRandomNormal [1024]string
-)
-
-func init() {
-	// The atof routines return NumErrors wrapping
-	// the error and the string.  Convert the table above.
-	for i := range atoftests {
-		test := &atoftests[i]
-		if test.err != nil {
-			test.err = &NumError{"ParseFloat", test.in, test.err}
-		}
-	}
-	for i := range atof32tests {
-		test := &atof32tests[i]
-		if test.err != nil {
-			test.err = &NumError{"ParseFloat", test.in, test.err}
-		}
-	}
-
-	// Generate random inputs for tests and benchmarks
-	rand.Seed(time.Now().UnixNano())
-	if testing.Short() {
-		atofRandomTests = make([]atofSimpleTest, 100)
-	} else {
-		atofRandomTests = make([]atofSimpleTest, 10000)
-	}
-	for i := range atofRandomTests {
-		n := uint64(rand.Uint32())<<32 | uint64(rand.Uint32())
-		x := math.Float64frombits(n)
-		s := FormatFloat(x, 'g', -1, 64)
-		atofRandomTests[i] = atofSimpleTest{x, s}
-	}
-
-	for i := range benchmarksRandomBits {
-		bits := uint64(rand.Uint32())<<32 | uint64(rand.Uint32())
-		x := math.Float64frombits(bits)
-		benchmarksRandomBits[i] = FormatFloat(x, 'g', -1, 64)
-	}
-
-	for i := range benchmarksRandomNormal {
-		x := rand.NormFloat64()
-		benchmarksRandomNormal[i] = FormatFloat(x, 'g', -1, 64)
-	}
-}
-
-func testAtof(t *testing.T, opt bool) {
-	oldopt := SetOptimize(opt)
-	for i := 0; i < len(atoftests); i++ {
-		test := &atoftests[i]
-		out, err := ParseFloat(test.in, 64)
-		outs := FormatFloat(out, 'g', -1, 64)
-		if outs != test.out || !reflect.DeepEqual(err, test.err) {
-			t.Errorf("ParseFloat(%v, 64) = %v, %v want %v, %v",
-				test.in, out, err, test.out, test.err)
-		}
-
-		if float64(float32(out)) == out {
-			out, err := ParseFloat(test.in, 32)
-			out32 := float32(out)
-			if float64(out32) != out {
-				t.Errorf("ParseFloat(%v, 32) = %v, not a float32 (closest is %v)", test.in, out, float64(out32))
-				continue
-			}
-			outs := FormatFloat(float64(out32), 'g', -1, 32)
-			if outs != test.out || !reflect.DeepEqual(err, test.err) {
-				t.Errorf("ParseFloat(%v, 32) = %v, %v want %v, %v  # %v",
-					test.in, out32, err, test.out, test.err, out)
-			}
-		}
-	}
-	for _, test := range atof32tests {
-		out, err := ParseFloat(test.in, 32)
-		out32 := float32(out)
-		if float64(out32) != out {
-			t.Errorf("ParseFloat(%v, 32) = %v, not a float32 (closest is %v)", test.in, out, float64(out32))
-			continue
-		}
-		outs := FormatFloat(float64(out32), 'g', -1, 32)
-		if outs != test.out || !reflect.DeepEqual(err, test.err) {
-			t.Errorf("ParseFloat(%v, 32) = %v, %v want %v, %v  # %v",
-				test.in, out32, err, test.out, test.err, out)
-		}
-	}
-	SetOptimize(oldopt)
-}
-
-func TestAtof(t *testing.T) { testAtof(t, true) }
-
-func TestAtofSlow(t *testing.T) { testAtof(t, false) }
-
-func TestAtofRandom(t *testing.T) {
-	for _, test := range atofRandomTests {
-		x, _ := ParseFloat(test.s, 64)
-		switch {
-		default:
-			t.Errorf("number %s badly parsed as %b (expected %b)", test.s, x, test.x)
-		case x == test.x:
-		case math.IsNaN(test.x) && math.IsNaN(x):
-		}
-	}
-	t.Logf("tested %d random numbers", len(atofRandomTests))
-}
-
-var roundTripCases = []struct {
-	f float64
-	s string
-}{
-	// Issue 2917.
-	// This test will break the optimized conversion if the
-	// FPU is using 80-bit registers instead of 64-bit registers,
-	// usually because the operating system initialized the
-	// thread with 80-bit precision and the Go runtime didn't
-	// fix the FP control word.
-	{8865794286000691 << 39, "4.87402195346389e+27"},
-	{8865794286000692 << 39, "4.8740219534638903e+27"},
-}
-
-func TestRoundTrip(t *testing.T) {
-	for _, tt := range roundTripCases {
-		old := SetOptimize(false)
-		s := FormatFloat(tt.f, 'g', -1, 64)
-		if s != tt.s {
-			t.Errorf("no-opt FormatFloat(%b) = %s, want %s", tt.f, s, tt.s)
-		}
-		f, err := ParseFloat(tt.s, 64)
-		if f != tt.f || err != nil {
-			t.Errorf("no-opt ParseFloat(%s) = %b, %v want %b, nil", tt.s, f, err, tt.f)
-		}
-		SetOptimize(true)
-		s = FormatFloat(tt.f, 'g', -1, 64)
-		if s != tt.s {
-			t.Errorf("opt FormatFloat(%b) = %s, want %s", tt.f, s, tt.s)
-		}
-		f, err = ParseFloat(tt.s, 64)
-		if f != tt.f || err != nil {
-			t.Errorf("opt ParseFloat(%s) = %b, %v want %b, nil", tt.s, f, err, tt.f)
-		}
-		SetOptimize(old)
-	}
-}
-
-// TestRoundTrip32 tries a fraction of all finite positive float32 values.
-func TestRoundTrip32(t *testing.T) {
-	step := uint32(997)
-	if testing.Short() {
-		step = 99991
-	}
-	count := 0
-	for i := uint32(0); i < 0xff<<23; i += step {
-		f := math.Float32frombits(i)
-		if i&1 == 1 {
-			f = -f // negative
-		}
-		s := FormatFloat(float64(f), 'g', -1, 32)
-
-		parsed, err := ParseFloat(s, 32)
-		parsed32 := float32(parsed)
-		switch {
-		case err != nil:
-			t.Errorf("ParseFloat(%q, 32) gave error %s", s, err)
-		case float64(parsed32) != parsed:
-			t.Errorf("ParseFloat(%q, 32) = %v, not a float32 (nearest is %v)", s, parsed, parsed32)
-		case parsed32 != f:
-			t.Errorf("ParseFloat(%q, 32) = %b (expected %b)", s, parsed32, f)
-		}
-		count++
-	}
-	t.Logf("tested %d float32's", count)
-}
-
-func BenchmarkAtof64Decimal(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseFloat("33909", 64)
-	}
-}
-
-func BenchmarkAtof64Float(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseFloat("339.7784", 64)
-	}
-}
-
-func BenchmarkAtof64FloatExp(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseFloat("-5.09e75", 64)
-	}
-}
-
-func BenchmarkAtof64Big(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseFloat("123456789123456789123456789", 64)
-	}
-}
-
-func BenchmarkAtof64RandomBits(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseFloat(benchmarksRandomBits[i%1024], 64)
-	}
-}
-
-func BenchmarkAtof64RandomFloats(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseFloat(benchmarksRandomNormal[i%1024], 64)
-	}
-}
-
-func BenchmarkAtof32Decimal(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseFloat("33909", 32)
-	}
-}
-
-func BenchmarkAtof32Float(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseFloat("339.778", 32)
-	}
-}
-
-func BenchmarkAtof32FloatExp(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseFloat("12.3456e32", 32)
-	}
-}
-
-var float32strings [4096]string
-
-func BenchmarkAtof32Random(b *testing.B) {
-	n := uint32(997)
-	for i := range float32strings {
-		n = (99991*n + 42) % (0xff << 23)
-		float32strings[i] = FormatFloat(float64(math.Float32frombits(n)), 'g', -1, 32)
-	}
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		ParseFloat(float32strings[i%4096], 32)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/atoi.go b/third_party/gofrontend/libgo/go/strconv/atoi.go
deleted file mode 100644
index 965e3a2..0000000
--- a/third_party/gofrontend/libgo/go/strconv/atoi.go
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv
-
-import "errors"
-
-// ErrRange indicates that a value is out of range for the target type.
-var ErrRange = errors.New("value out of range")
-
-// ErrSyntax indicates that a value does not have the right syntax for the target type.
-var ErrSyntax = errors.New("invalid syntax")
-
-// A NumError records a failed conversion.
-type NumError struct {
-	Func string // the failing function (ParseBool, ParseInt, ParseUint, ParseFloat)
-	Num  string // the input
-	Err  error  // the reason the conversion failed (ErrRange, ErrSyntax)
-}
-
-func (e *NumError) Error() string {
-	return "strconv." + e.Func + ": " + "parsing " + Quote(e.Num) + ": " + e.Err.Error()
-}
-
-func syntaxError(fn, str string) *NumError {
-	return &NumError{fn, str, ErrSyntax}
-}
-
-func rangeError(fn, str string) *NumError {
-	return &NumError{fn, str, ErrRange}
-}
-
-const intSize = 32 << (^uint(0) >> 63)
-
-// IntSize is the size in bits of an int or uint value.
-const IntSize = intSize
-
-const maxUint64 = (1<<64 - 1)
-
-// ParseUint is like ParseInt but for unsigned numbers.
-func ParseUint(s string, base int, bitSize int) (n uint64, err error) {
-	var cutoff, maxVal uint64
-
-	if bitSize == 0 {
-		bitSize = int(IntSize)
-	}
-
-	i := 0
-	switch {
-	case len(s) < 1:
-		err = ErrSyntax
-		goto Error
-
-	case 2 <= base && base <= 36:
-		// valid base; nothing to do
-
-	case base == 0:
-		// Look for octal, hex prefix.
-		switch {
-		case s[0] == '0' && len(s) > 1 && (s[1] == 'x' || s[1] == 'X'):
-			if len(s) < 3 {
-				err = ErrSyntax
-				goto Error
-			}
-			base = 16
-			i = 2
-		case s[0] == '0':
-			base = 8
-			i = 1
-		default:
-			base = 10
-		}
-
-	default:
-		err = errors.New("invalid base " + Itoa(base))
-		goto Error
-	}
-
-	// Cutoff is the smallest number such that cutoff*base > maxUint64.
-	// Use compile-time constants for common cases.
-	switch base {
-	case 10:
-		cutoff = maxUint64/10 + 1
-	case 16:
-		cutoff = maxUint64/16 + 1
-	default:
-		cutoff = maxUint64/uint64(base) + 1
-	}
-
-	maxVal = 1<<uint(bitSize) - 1
-
-	for ; i < len(s); i++ {
-		var v byte
-		d := s[i]
-		switch {
-		case '0' <= d && d <= '9':
-			v = d - '0'
-		case 'a' <= d && d <= 'z':
-			v = d - 'a' + 10
-		case 'A' <= d && d <= 'Z':
-			v = d - 'A' + 10
-		default:
-			n = 0
-			err = ErrSyntax
-			goto Error
-		}
-		if v >= byte(base) {
-			n = 0
-			err = ErrSyntax
-			goto Error
-		}
-
-		if n >= cutoff {
-			// n*base overflows
-			n = maxUint64
-			err = ErrRange
-			goto Error
-		}
-		n *= uint64(base)
-
-		n1 := n + uint64(v)
-		if n1 < n || n1 > maxVal {
-			// n+v overflows
-			n = maxUint64
-			err = ErrRange
-			goto Error
-		}
-		n = n1
-	}
-
-	return n, nil
-
-Error:
-	return n, &NumError{"ParseUint", s, err}
-}
-
-// ParseInt interprets a string s in the given base (2 to 36) and
-// returns the corresponding value i.  If base == 0, the base is
-// implied by the string's prefix: base 16 for "0x", base 8 for
-// "0", and base 10 otherwise.
-//
-// The bitSize argument specifies the integer type
-// that the result must fit into.  Bit sizes 0, 8, 16, 32, and 64
-// correspond to int, int8, int16, int32, and int64.
-//
-// The errors that ParseInt returns have concrete type *NumError
-// and include err.Num = s.  If s is empty or contains invalid
-// digits, err.Err = ErrSyntax and the returned value is 0;
-// if the value corresponding to s cannot be represented by a
-// signed integer of the given size, err.Err = ErrRange and the
-// returned value is the maximum magnitude integer of the
-// appropriate bitSize and sign.
-func ParseInt(s string, base int, bitSize int) (i int64, err error) {
-	const fnParseInt = "ParseInt"
-
-	if bitSize == 0 {
-		bitSize = int(IntSize)
-	}
-
-	// Empty string bad.
-	if len(s) == 0 {
-		return 0, syntaxError(fnParseInt, s)
-	}
-
-	// Pick off leading sign.
-	s0 := s
-	neg := false
-	if s[0] == '+' {
-		s = s[1:]
-	} else if s[0] == '-' {
-		neg = true
-		s = s[1:]
-	}
-
-	// Convert unsigned and check range.
-	var un uint64
-	un, err = ParseUint(s, base, bitSize)
-	if err != nil && err.(*NumError).Err != ErrRange {
-		err.(*NumError).Func = fnParseInt
-		err.(*NumError).Num = s0
-		return 0, err
-	}
-	cutoff := uint64(1 << uint(bitSize-1))
-	if !neg && un >= cutoff {
-		return int64(cutoff - 1), rangeError(fnParseInt, s0)
-	}
-	if neg && un > cutoff {
-		return -int64(cutoff), rangeError(fnParseInt, s0)
-	}
-	n := int64(un)
-	if neg {
-		n = -n
-	}
-	return n, nil
-}
-
-// Atoi is shorthand for ParseInt(s, 10, 0).
-func Atoi(s string) (i int, err error) {
-	i64, err := ParseInt(s, 10, 0)
-	return int(i64), err
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/atoi_test.go b/third_party/gofrontend/libgo/go/strconv/atoi_test.go
deleted file mode 100644
index bd6a6a0..0000000
--- a/third_party/gofrontend/libgo/go/strconv/atoi_test.go
+++ /dev/null
@@ -1,363 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv_test
-
-import (
-	"errors"
-	"reflect"
-	. "strconv"
-	"testing"
-)
-
-type atoui64Test struct {
-	in  string
-	out uint64
-	err error
-}
-
-var atoui64tests = []atoui64Test{
-	{"", 0, ErrSyntax},
-	{"0", 0, nil},
-	{"1", 1, nil},
-	{"12345", 12345, nil},
-	{"012345", 12345, nil},
-	{"12345x", 0, ErrSyntax},
-	{"98765432100", 98765432100, nil},
-	{"18446744073709551615", 1<<64 - 1, nil},
-	{"18446744073709551616", 1<<64 - 1, ErrRange},
-	{"18446744073709551620", 1<<64 - 1, ErrRange},
-}
-
-var btoui64tests = []atoui64Test{
-	{"", 0, ErrSyntax},
-	{"0", 0, nil},
-	{"0x", 0, ErrSyntax},
-	{"0X", 0, ErrSyntax},
-	{"1", 1, nil},
-	{"12345", 12345, nil},
-	{"012345", 012345, nil},
-	{"0x12345", 0x12345, nil},
-	{"0X12345", 0x12345, nil},
-	{"12345x", 0, ErrSyntax},
-	{"0xabcdefg123", 0, ErrSyntax},
-	{"123456789abc", 0, ErrSyntax},
-	{"98765432100", 98765432100, nil},
-	{"18446744073709551615", 1<<64 - 1, nil},
-	{"18446744073709551616", 1<<64 - 1, ErrRange},
-	{"18446744073709551620", 1<<64 - 1, ErrRange},
-	{"0xFFFFFFFFFFFFFFFF", 1<<64 - 1, nil},
-	{"0x10000000000000000", 1<<64 - 1, ErrRange},
-	{"01777777777777777777777", 1<<64 - 1, nil},
-	{"01777777777777777777778", 0, ErrSyntax},
-	{"02000000000000000000000", 1<<64 - 1, ErrRange},
-	{"0200000000000000000000", 1 << 61, nil},
-}
-
-type atoi64Test struct {
-	in  string
-	out int64
-	err error
-}
-
-var atoi64tests = []atoi64Test{
-	{"", 0, ErrSyntax},
-	{"0", 0, nil},
-	{"-0", 0, nil},
-	{"1", 1, nil},
-	{"-1", -1, nil},
-	{"12345", 12345, nil},
-	{"-12345", -12345, nil},
-	{"012345", 12345, nil},
-	{"-012345", -12345, nil},
-	{"98765432100", 98765432100, nil},
-	{"-98765432100", -98765432100, nil},
-	{"9223372036854775807", 1<<63 - 1, nil},
-	{"-9223372036854775807", -(1<<63 - 1), nil},
-	{"9223372036854775808", 1<<63 - 1, ErrRange},
-	{"-9223372036854775808", -1 << 63, nil},
-	{"9223372036854775809", 1<<63 - 1, ErrRange},
-	{"-9223372036854775809", -1 << 63, ErrRange},
-}
-
-type btoi64Test struct {
-	in   string
-	base int
-	out  int64
-	err  error
-}
-
-var btoi64tests = []btoi64Test{
-	{"", 0, 0, ErrSyntax},
-	{"0", 0, 0, nil},
-	{"-0", 0, 0, nil},
-	{"1", 0, 1, nil},
-	{"-1", 0, -1, nil},
-	{"12345", 0, 12345, nil},
-	{"-12345", 0, -12345, nil},
-	{"012345", 0, 012345, nil},
-	{"-012345", 0, -012345, nil},
-	{"0x12345", 0, 0x12345, nil},
-	{"-0X12345", 0, -0x12345, nil},
-	{"12345x", 0, 0, ErrSyntax},
-	{"-12345x", 0, 0, ErrSyntax},
-	{"98765432100", 0, 98765432100, nil},
-	{"-98765432100", 0, -98765432100, nil},
-	{"9223372036854775807", 0, 1<<63 - 1, nil},
-	{"-9223372036854775807", 0, -(1<<63 - 1), nil},
-	{"9223372036854775808", 0, 1<<63 - 1, ErrRange},
-	{"-9223372036854775808", 0, -1 << 63, nil},
-	{"9223372036854775809", 0, 1<<63 - 1, ErrRange},
-	{"-9223372036854775809", 0, -1 << 63, ErrRange},
-
-	// other bases
-	{"g", 17, 16, nil},
-	{"10", 25, 25, nil},
-	{"holycow", 35, (((((17*35+24)*35+21)*35+34)*35+12)*35+24)*35 + 32, nil},
-	{"holycow", 36, (((((17*36+24)*36+21)*36+34)*36+12)*36+24)*36 + 32, nil},
-
-	// base 2
-	{"0", 2, 0, nil},
-	{"-1", 2, -1, nil},
-	{"1010", 2, 10, nil},
-	{"1000000000000000", 2, 1 << 15, nil},
-	{"111111111111111111111111111111111111111111111111111111111111111", 2, 1<<63 - 1, nil},
-	{"1000000000000000000000000000000000000000000000000000000000000000", 2, 1<<63 - 1, ErrRange},
-	{"-1000000000000000000000000000000000000000000000000000000000000000", 2, -1 << 63, nil},
-	{"-1000000000000000000000000000000000000000000000000000000000000001", 2, -1 << 63, ErrRange},
-
-	// base 8
-	{"-10", 8, -8, nil},
-	{"57635436545", 8, 057635436545, nil},
-	{"100000000", 8, 1 << 24, nil},
-
-	// base 16
-	{"10", 16, 16, nil},
-	{"-123456789abcdef", 16, -0x123456789abcdef, nil},
-	{"7fffffffffffffff", 16, 1<<63 - 1, nil},
-}
-
-type atoui32Test struct {
-	in  string
-	out uint32
-	err error
-}
-
-var atoui32tests = []atoui32Test{
-	{"", 0, ErrSyntax},
-	{"0", 0, nil},
-	{"1", 1, nil},
-	{"12345", 12345, nil},
-	{"012345", 12345, nil},
-	{"12345x", 0, ErrSyntax},
-	{"987654321", 987654321, nil},
-	{"4294967295", 1<<32 - 1, nil},
-	{"4294967296", 1<<32 - 1, ErrRange},
-}
-
-type atoi32Test struct {
-	in  string
-	out int32
-	err error
-}
-
-var atoi32tests = []atoi32Test{
-	{"", 0, ErrSyntax},
-	{"0", 0, nil},
-	{"-0", 0, nil},
-	{"1", 1, nil},
-	{"-1", -1, nil},
-	{"12345", 12345, nil},
-	{"-12345", -12345, nil},
-	{"012345", 12345, nil},
-	{"-012345", -12345, nil},
-	{"12345x", 0, ErrSyntax},
-	{"-12345x", 0, ErrSyntax},
-	{"987654321", 987654321, nil},
-	{"-987654321", -987654321, nil},
-	{"2147483647", 1<<31 - 1, nil},
-	{"-2147483647", -(1<<31 - 1), nil},
-	{"2147483648", 1<<31 - 1, ErrRange},
-	{"-2147483648", -1 << 31, nil},
-	{"2147483649", 1<<31 - 1, ErrRange},
-	{"-2147483649", -1 << 31, ErrRange},
-}
-
-type numErrorTest struct {
-	num, want string
-}
-
-var numErrorTests = []numErrorTest{
-	{"0", `strconv.ParseFloat: parsing "0": failed`},
-	{"`", "strconv.ParseFloat: parsing \"`\": failed"},
-	{"1\x00.2", `strconv.ParseFloat: parsing "1\x00.2": failed`},
-}
-
-func init() {
-	// The atoi routines return NumErrors wrapping
-	// the error and the string.  Convert the tables above.
-	for i := range atoui64tests {
-		test := &atoui64tests[i]
-		if test.err != nil {
-			test.err = &NumError{"ParseUint", test.in, test.err}
-		}
-	}
-	for i := range btoui64tests {
-		test := &btoui64tests[i]
-		if test.err != nil {
-			test.err = &NumError{"ParseUint", test.in, test.err}
-		}
-	}
-	for i := range atoi64tests {
-		test := &atoi64tests[i]
-		if test.err != nil {
-			test.err = &NumError{"ParseInt", test.in, test.err}
-		}
-	}
-	for i := range btoi64tests {
-		test := &btoi64tests[i]
-		if test.err != nil {
-			test.err = &NumError{"ParseInt", test.in, test.err}
-		}
-	}
-	for i := range atoui32tests {
-		test := &atoui32tests[i]
-		if test.err != nil {
-			test.err = &NumError{"ParseUint", test.in, test.err}
-		}
-	}
-	for i := range atoi32tests {
-		test := &atoi32tests[i]
-		if test.err != nil {
-			test.err = &NumError{"ParseInt", test.in, test.err}
-		}
-	}
-}
-
-func TestParseUint64(t *testing.T) {
-	for i := range atoui64tests {
-		test := &atoui64tests[i]
-		out, err := ParseUint(test.in, 10, 64)
-		if test.out != out || !reflect.DeepEqual(test.err, err) {
-			t.Errorf("Atoui64(%q) = %v, %v want %v, %v",
-				test.in, out, err, test.out, test.err)
-		}
-	}
-}
-
-func TestParseUint64Base(t *testing.T) {
-	for i := range btoui64tests {
-		test := &btoui64tests[i]
-		out, err := ParseUint(test.in, 0, 64)
-		if test.out != out || !reflect.DeepEqual(test.err, err) {
-			t.Errorf("ParseUint(%q) = %v, %v want %v, %v",
-				test.in, out, err, test.out, test.err)
-		}
-	}
-}
-
-func TestParseInt64(t *testing.T) {
-	for i := range atoi64tests {
-		test := &atoi64tests[i]
-		out, err := ParseInt(test.in, 10, 64)
-		if test.out != out || !reflect.DeepEqual(test.err, err) {
-			t.Errorf("Atoi64(%q) = %v, %v want %v, %v",
-				test.in, out, err, test.out, test.err)
-		}
-	}
-}
-
-func TestParseInt64Base(t *testing.T) {
-	for i := range btoi64tests {
-		test := &btoi64tests[i]
-		out, err := ParseInt(test.in, test.base, 64)
-		if test.out != out || !reflect.DeepEqual(test.err, err) {
-			t.Errorf("ParseInt(%q) = %v, %v want %v, %v",
-				test.in, out, err, test.out, test.err)
-		}
-	}
-}
-
-func TestParseUint(t *testing.T) {
-	switch IntSize {
-	case 32:
-		for i := range atoui32tests {
-			test := &atoui32tests[i]
-			out, err := ParseUint(test.in, 10, 0)
-			if test.out != uint32(out) || !reflect.DeepEqual(test.err, err) {
-				t.Errorf("Atoui(%q) = %v, %v want %v, %v",
-					test.in, out, err, test.out, test.err)
-			}
-		}
-	case 64:
-		for i := range atoui64tests {
-			test := &atoui64tests[i]
-			out, err := ParseUint(test.in, 10, 0)
-			if test.out != uint64(out) || !reflect.DeepEqual(test.err, err) {
-				t.Errorf("Atoui(%q) = %v, %v want %v, %v",
-					test.in, out, err, test.out, test.err)
-			}
-		}
-	}
-}
-
-func TestParseInt(t *testing.T) {
-	switch IntSize {
-	case 32:
-		for i := range atoi32tests {
-			test := &atoi32tests[i]
-			out, err := ParseInt(test.in, 10, 0)
-			if test.out != int32(out) || !reflect.DeepEqual(test.err, err) {
-				t.Errorf("Atoi(%q) = %v, %v want %v, %v",
-					test.in, out, err, test.out, test.err)
-			}
-		}
-	case 64:
-		for i := range atoi64tests {
-			test := &atoi64tests[i]
-			out, err := ParseInt(test.in, 10, 0)
-			if test.out != int64(out) || !reflect.DeepEqual(test.err, err) {
-				t.Errorf("Atoi(%q) = %v, %v want %v, %v",
-					test.in, out, err, test.out, test.err)
-			}
-		}
-	}
-}
-
-func TestNumError(t *testing.T) {
-	for _, test := range numErrorTests {
-		err := &NumError{
-			Func: "ParseFloat",
-			Num:  test.num,
-			Err:  errors.New("failed"),
-		}
-		if got := err.Error(); got != test.want {
-			t.Errorf(`(&NumError{"ParseFloat", %q, "failed"}).Error() = %v, want %v`, test.num, got, test.want)
-		}
-	}
-}
-
-func BenchmarkAtoi(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseInt("12345678", 10, 0)
-	}
-}
-
-func BenchmarkAtoiNeg(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseInt("-12345678", 10, 0)
-	}
-}
-
-func BenchmarkAtoi64(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseInt("12345678901234", 10, 64)
-	}
-}
-
-func BenchmarkAtoi64Neg(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseInt("-12345678901234", 10, 64)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/decimal.go b/third_party/gofrontend/libgo/go/strconv/decimal.go
deleted file mode 100644
index 5252d6e..0000000
--- a/third_party/gofrontend/libgo/go/strconv/decimal.go
+++ /dev/null
@@ -1,413 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Multiprecision decimal numbers.
-// For floating-point formatting only; not general purpose.
-// Only operations are assign and (binary) left/right shift.
-// Can do binary floating point in multiprecision decimal precisely
-// because 2 divides 10; cannot do decimal floating point
-// in multiprecision binary precisely.
-
-package strconv
-
-type decimal struct {
-	d     [800]byte // digits, big-endian representation
-	nd    int       // number of digits used
-	dp    int       // decimal point
-	neg   bool
-	trunc bool // discarded nonzero digits beyond d[:nd]
-}
-
-func (a *decimal) String() string {
-	n := 10 + a.nd
-	if a.dp > 0 {
-		n += a.dp
-	}
-	if a.dp < 0 {
-		n += -a.dp
-	}
-
-	buf := make([]byte, n)
-	w := 0
-	switch {
-	case a.nd == 0:
-		return "0"
-
-	case a.dp <= 0:
-		// zeros fill space between decimal point and digits
-		buf[w] = '0'
-		w++
-		buf[w] = '.'
-		w++
-		w += digitZero(buf[w : w+-a.dp])
-		w += copy(buf[w:], a.d[0:a.nd])
-
-	case a.dp < a.nd:
-		// decimal point in middle of digits
-		w += copy(buf[w:], a.d[0:a.dp])
-		buf[w] = '.'
-		w++
-		w += copy(buf[w:], a.d[a.dp:a.nd])
-
-	default:
-		// zeros fill space between digits and decimal point
-		w += copy(buf[w:], a.d[0:a.nd])
-		w += digitZero(buf[w : w+a.dp-a.nd])
-	}
-	return string(buf[0:w])
-}
-
-func digitZero(dst []byte) int {
-	for i := range dst {
-		dst[i] = '0'
-	}
-	return len(dst)
-}
-
-// trim trailing zeros from number.
-// (They are meaningless; the decimal point is tracked
-// independent of the number of digits.)
-func trim(a *decimal) {
-	for a.nd > 0 && a.d[a.nd-1] == '0' {
-		a.nd--
-	}
-	if a.nd == 0 {
-		a.dp = 0
-	}
-}
-
-// Assign v to a.
-func (a *decimal) Assign(v uint64) {
-	var buf [24]byte
-
-	// Write reversed decimal in buf.
-	n := 0
-	for v > 0 {
-		v1 := v / 10
-		v -= 10 * v1
-		buf[n] = byte(v + '0')
-		n++
-		v = v1
-	}
-
-	// Reverse again to produce forward decimal in a.d.
-	a.nd = 0
-	for n--; n >= 0; n-- {
-		a.d[a.nd] = buf[n]
-		a.nd++
-	}
-	a.dp = a.nd
-	trim(a)
-}
-
-// Maximum shift that we can do in one pass without overflow.
-// A uint has 32 or 64 bits, and we have to be able to accommodate 9<<k.
-const uintSize = 32 << (^uint(0) >> 63)
-const maxShift = uintSize - 4
-
-// Binary shift right (/ 2) by k bits.  k <= maxShift to avoid overflow.
-func rightShift(a *decimal, k uint) {
-	r := 0 // read pointer
-	w := 0 // write pointer
-
-	// Pick up enough leading digits to cover first shift.
-	var n uint
-	for ; n>>k == 0; r++ {
-		if r >= a.nd {
-			if n == 0 {
-				// a == 0; shouldn't get here, but handle anyway.
-				a.nd = 0
-				return
-			}
-			for n>>k == 0 {
-				n = n * 10
-				r++
-			}
-			break
-		}
-		c := uint(a.d[r])
-		n = n*10 + c - '0'
-	}
-	a.dp -= r - 1
-
-	// Pick up a digit, put down a digit.
-	for ; r < a.nd; r++ {
-		c := uint(a.d[r])
-		dig := n >> k
-		n -= dig << k
-		a.d[w] = byte(dig + '0')
-		w++
-		n = n*10 + c - '0'
-	}
-
-	// Put down extra digits.
-	for n > 0 {
-		dig := n >> k
-		n -= dig << k
-		if w < len(a.d) {
-			a.d[w] = byte(dig + '0')
-			w++
-		} else if dig > 0 {
-			a.trunc = true
-		}
-		n = n * 10
-	}
-
-	a.nd = w
-	trim(a)
-}
-
-// Cheat sheet for left shift: table indexed by shift count giving
-// number of new digits that will be introduced by that shift.
-//
-// For example, leftcheats[4] = {2, "625"}.  That means that
-// if we are shifting by 4 (multiplying by 16), it will add 2 digits
-// when the string prefix is "625" through "999", and one fewer digit
-// if the string prefix is "000" through "624".
-//
-// Credit for this trick goes to Ken.
-
-type leftCheat struct {
-	delta  int    // number of new digits
-	cutoff string // minus one digit if original < a.
-}
-
-var leftcheats = []leftCheat{
-	// Leading digits of 1/2^i = 5^i.
-	// 5^23 is not an exact 64-bit floating point number,
-	// so have to use bc for the math.
-	// Go up to 60 to be large enough for 32bit and 64bit platforms.
-	/*
-		seq 60 | sed 's/^/5^/' | bc |
-		awk 'BEGIN{ print "\t{ 0, \"\" }," }
-		{
-			log2 = log(2)/log(10)
-			printf("\t{ %d, \"%s\" },\t// * %d\n",
-				int(log2*NR+1), $0, 2**NR)
-		}'
-	*/
-	{0, ""},
-	{1, "5"},                                           // * 2
-	{1, "25"},                                          // * 4
-	{1, "125"},                                         // * 8
-	{2, "625"},                                         // * 16
-	{2, "3125"},                                        // * 32
-	{2, "15625"},                                       // * 64
-	{3, "78125"},                                       // * 128
-	{3, "390625"},                                      // * 256
-	{3, "1953125"},                                     // * 512
-	{4, "9765625"},                                     // * 1024
-	{4, "48828125"},                                    // * 2048
-	{4, "244140625"},                                   // * 4096
-	{4, "1220703125"},                                  // * 8192
-	{5, "6103515625"},                                  // * 16384
-	{5, "30517578125"},                                 // * 32768
-	{5, "152587890625"},                                // * 65536
-	{6, "762939453125"},                                // * 131072
-	{6, "3814697265625"},                               // * 262144
-	{6, "19073486328125"},                              // * 524288
-	{7, "95367431640625"},                              // * 1048576
-	{7, "476837158203125"},                             // * 2097152
-	{7, "2384185791015625"},                            // * 4194304
-	{7, "11920928955078125"},                           // * 8388608
-	{8, "59604644775390625"},                           // * 16777216
-	{8, "298023223876953125"},                          // * 33554432
-	{8, "1490116119384765625"},                         // * 67108864
-	{9, "7450580596923828125"},                         // * 134217728
-	{9, "37252902984619140625"},                        // * 268435456
-	{9, "186264514923095703125"},                       // * 536870912
-	{10, "931322574615478515625"},                      // * 1073741824
-	{10, "4656612873077392578125"},                     // * 2147483648
-	{10, "23283064365386962890625"},                    // * 4294967296
-	{10, "116415321826934814453125"},                   // * 8589934592
-	{11, "582076609134674072265625"},                   // * 17179869184
-	{11, "2910383045673370361328125"},                  // * 34359738368
-	{11, "14551915228366851806640625"},                 // * 68719476736
-	{12, "72759576141834259033203125"},                 // * 137438953472
-	{12, "363797880709171295166015625"},                // * 274877906944
-	{12, "1818989403545856475830078125"},               // * 549755813888
-	{13, "9094947017729282379150390625"},               // * 1099511627776
-	{13, "45474735088646411895751953125"},              // * 2199023255552
-	{13, "227373675443232059478759765625"},             // * 4398046511104
-	{13, "1136868377216160297393798828125"},            // * 8796093022208
-	{14, "5684341886080801486968994140625"},            // * 17592186044416
-	{14, "28421709430404007434844970703125"},           // * 35184372088832
-	{14, "142108547152020037174224853515625"},          // * 70368744177664
-	{15, "710542735760100185871124267578125"},          // * 140737488355328
-	{15, "3552713678800500929355621337890625"},         // * 281474976710656
-	{15, "17763568394002504646778106689453125"},        // * 562949953421312
-	{16, "88817841970012523233890533447265625"},        // * 1125899906842624
-	{16, "444089209850062616169452667236328125"},       // * 2251799813685248
-	{16, "2220446049250313080847263336181640625"},      // * 4503599627370496
-	{16, "11102230246251565404236316680908203125"},     // * 9007199254740992
-	{17, "55511151231257827021181583404541015625"},     // * 18014398509481984
-	{17, "277555756156289135105907917022705078125"},    // * 36028797018963968
-	{17, "1387778780781445675529539585113525390625"},   // * 72057594037927936
-	{18, "6938893903907228377647697925567626953125"},   // * 144115188075855872
-	{18, "34694469519536141888238489627838134765625"},  // * 288230376151711744
-	{18, "173472347597680709441192448139190673828125"}, // * 576460752303423488
-	{19, "867361737988403547205962240695953369140625"}, // * 1152921504606846976
-}
-
-// Is the leading prefix of b lexicographically less than s?
-func prefixIsLessThan(b []byte, s string) bool {
-	for i := 0; i < len(s); i++ {
-		if i >= len(b) {
-			return true
-		}
-		if b[i] != s[i] {
-			return b[i] < s[i]
-		}
-	}
-	return false
-}
-
-// Binary shift left (* 2) by k bits.  k <= maxShift to avoid overflow.
-func leftShift(a *decimal, k uint) {
-	delta := leftcheats[k].delta
-	if prefixIsLessThan(a.d[0:a.nd], leftcheats[k].cutoff) {
-		delta--
-	}
-
-	r := a.nd         // read index
-	w := a.nd + delta // write index
-
-	// Pick up a digit, put down a digit.
-	var n uint
-	for r--; r >= 0; r-- {
-		n += (uint(a.d[r]) - '0') << k
-		quo := n / 10
-		rem := n - 10*quo
-		w--
-		if w < len(a.d) {
-			a.d[w] = byte(rem + '0')
-		} else if rem != 0 {
-			a.trunc = true
-		}
-		n = quo
-	}
-
-	// Put down extra digits.
-	for n > 0 {
-		quo := n / 10
-		rem := n - 10*quo
-		w--
-		if w < len(a.d) {
-			a.d[w] = byte(rem + '0')
-		} else if rem != 0 {
-			a.trunc = true
-		}
-		n = quo
-	}
-
-	a.nd += delta
-	if a.nd >= len(a.d) {
-		a.nd = len(a.d)
-	}
-	a.dp += delta
-	trim(a)
-}
-
-// Binary shift left (k > 0) or right (k < 0).
-func (a *decimal) Shift(k int) {
-	switch {
-	case a.nd == 0:
-		// nothing to do: a == 0
-	case k > 0:
-		for k > maxShift {
-			leftShift(a, maxShift)
-			k -= maxShift
-		}
-		leftShift(a, uint(k))
-	case k < 0:
-		for k < -maxShift {
-			rightShift(a, maxShift)
-			k += maxShift
-		}
-		rightShift(a, uint(-k))
-	}
-}
-
-// If we chop a at nd digits, should we round up?
-func shouldRoundUp(a *decimal, nd int) bool {
-	if nd < 0 || nd >= a.nd {
-		return false
-	}
-	if a.d[nd] == '5' && nd+1 == a.nd { // exactly halfway - round to even
-		// if we truncated, a little higher than what's recorded - always round up
-		if a.trunc {
-			return true
-		}
-		return nd > 0 && (a.d[nd-1]-'0')%2 != 0
-	}
-	// not halfway - digit tells all
-	return a.d[nd] >= '5'
-}
-
-// Round a to nd digits (or fewer).
-// If nd is zero, it means we're rounding
-// just to the left of the digits, as in
-// 0.09 -> 0.1.
-func (a *decimal) Round(nd int) {
-	if nd < 0 || nd >= a.nd {
-		return
-	}
-	if shouldRoundUp(a, nd) {
-		a.RoundUp(nd)
-	} else {
-		a.RoundDown(nd)
-	}
-}
-
-// Round a down to nd digits (or fewer).
-func (a *decimal) RoundDown(nd int) {
-	if nd < 0 || nd >= a.nd {
-		return
-	}
-	a.nd = nd
-	trim(a)
-}
-
-// Round a up to nd digits (or fewer).
-func (a *decimal) RoundUp(nd int) {
-	if nd < 0 || nd >= a.nd {
-		return
-	}
-
-	// round up
-	for i := nd - 1; i >= 0; i-- {
-		c := a.d[i]
-		if c < '9' { // can stop after this digit
-			a.d[i]++
-			a.nd = i + 1
-			return
-		}
-	}
-
-	// Number is all 9s.
-	// Change to single 1 with adjusted decimal point.
-	a.d[0] = '1'
-	a.nd = 1
-	a.dp++
-}
-
-// Extract integer part, rounded appropriately.
-// No guarantees about overflow.
-func (a *decimal) RoundedInteger() uint64 {
-	if a.dp > 20 {
-		return 0xFFFFFFFFFFFFFFFF
-	}
-	var i int
-	n := uint64(0)
-	for i = 0; i < a.dp && i < a.nd; i++ {
-		n = n*10 + uint64(a.d[i]-'0')
-	}
-	for ; i < a.dp; i++ {
-		n *= 10
-	}
-	if shouldRoundUp(a, a.dp) {
-		n++
-	}
-	return n
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/decimal_test.go b/third_party/gofrontend/libgo/go/strconv/decimal_test.go
deleted file mode 100644
index 13a127f..0000000
--- a/third_party/gofrontend/libgo/go/strconv/decimal_test.go
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv_test
-
-import (
-	. "strconv"
-	"testing"
-)
-
-type shiftTest struct {
-	i     uint64
-	shift int
-	out   string
-}
-
-var shifttests = []shiftTest{
-	{0, -100, "0"},
-	{0, 100, "0"},
-	{1, 100, "1267650600228229401496703205376"},
-	{1, -100,
-		"0.00000000000000000000000000000078886090522101180541" +
-			"17285652827862296732064351090230047702789306640625",
-	},
-	{12345678, 8, "3160493568"},
-	{12345678, -8, "48225.3046875"},
-	{195312, 9, "99999744"},
-	{1953125, 9, "1000000000"},
-}
-
-func TestDecimalShift(t *testing.T) {
-	for i := 0; i < len(shifttests); i++ {
-		test := &shifttests[i]
-		d := NewDecimal(test.i)
-		d.Shift(test.shift)
-		s := d.String()
-		if s != test.out {
-			t.Errorf("Decimal %v << %v = %v, want %v",
-				test.i, test.shift, s, test.out)
-		}
-	}
-}
-
-type roundTest struct {
-	i               uint64
-	nd              int
-	down, round, up string
-	int             uint64
-}
-
-var roundtests = []roundTest{
-	{0, 4, "0", "0", "0", 0},
-	{12344999, 4, "12340000", "12340000", "12350000", 12340000},
-	{12345000, 4, "12340000", "12340000", "12350000", 12340000},
-	{12345001, 4, "12340000", "12350000", "12350000", 12350000},
-	{23454999, 4, "23450000", "23450000", "23460000", 23450000},
-	{23455000, 4, "23450000", "23460000", "23460000", 23460000},
-	{23455001, 4, "23450000", "23460000", "23460000", 23460000},
-
-	{99994999, 4, "99990000", "99990000", "100000000", 99990000},
-	{99995000, 4, "99990000", "100000000", "100000000", 100000000},
-	{99999999, 4, "99990000", "100000000", "100000000", 100000000},
-
-	{12994999, 4, "12990000", "12990000", "13000000", 12990000},
-	{12995000, 4, "12990000", "13000000", "13000000", 13000000},
-	{12999999, 4, "12990000", "13000000", "13000000", 13000000},
-}
-
-func TestDecimalRound(t *testing.T) {
-	for i := 0; i < len(roundtests); i++ {
-		test := &roundtests[i]
-		d := NewDecimal(test.i)
-		d.RoundDown(test.nd)
-		s := d.String()
-		if s != test.down {
-			t.Errorf("Decimal %v RoundDown %d = %v, want %v",
-				test.i, test.nd, s, test.down)
-		}
-		d = NewDecimal(test.i)
-		d.Round(test.nd)
-		s = d.String()
-		if s != test.round {
-			t.Errorf("Decimal %v Round %d = %v, want %v",
-				test.i, test.nd, s, test.down)
-		}
-		d = NewDecimal(test.i)
-		d.RoundUp(test.nd)
-		s = d.String()
-		if s != test.up {
-			t.Errorf("Decimal %v RoundUp %d = %v, want %v",
-				test.i, test.nd, s, test.up)
-		}
-	}
-}
-
-type roundIntTest struct {
-	i     uint64
-	shift int
-	int   uint64
-}
-
-var roundinttests = []roundIntTest{
-	{0, 100, 0},
-	{512, -8, 2},
-	{513, -8, 2},
-	{640, -8, 2},
-	{641, -8, 3},
-	{384, -8, 2},
-	{385, -8, 2},
-	{383, -8, 1},
-	{1, 100, 1<<64 - 1},
-	{1000, 0, 1000},
-}
-
-func TestDecimalRoundedInteger(t *testing.T) {
-	for i := 0; i < len(roundinttests); i++ {
-		test := roundinttests[i]
-		d := NewDecimal(test.i)
-		d.Shift(test.shift)
-		int := d.RoundedInteger()
-		if int != test.int {
-			t.Errorf("Decimal %v >> %v RoundedInteger = %v, want %v",
-				test.i, test.shift, int, test.int)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/doc.go b/third_party/gofrontend/libgo/go/strconv/doc.go
deleted file mode 100644
index 7bc1e27..0000000
--- a/third_party/gofrontend/libgo/go/strconv/doc.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package strconv implements conversions to and from string representations
-// of basic data types.
-//
-// Numeric Conversions
-//
-// The most common numeric conversions are Atoi (string to int) and Itoa (int to string).
-//
-//	i, err := strconv.Atoi("-42")
-//	s := strconv.Itoa(-42)
-//
-// These assume decimal and the Go int type.
-//
-// ParseBool, ParseFloat, ParseInt, and ParseUint convert strings to values:
-//
-//	b, err := strconv.ParseBool("true")
-//	f, err := strconv.ParseFloat("3.1415", 64)
-//	i, err := strconv.ParseInt("-42", 10, 64)
-//	u, err := strconv.ParseUint("42", 10, 64)
-//
-// The parse functions return the widest type (float64, int64, and uint64),
-// but if the size argument specifies a narrower width the result can be
-// converted to that narrower type without data loss:
-//
-//	s := "2147483647" // biggest int32
-//	i64, err := strconv.ParseInt(s, 10, 32)
-//	...
-//	i := int32(i64)
-//
-// FormatBool, FormatFloat, FormatInt, and FormatUint convert values to strings:
-//
-// 	s := strconv.FormatBool(true)
-// 	s := strconv.FormatFloat(3.1415, 'E', -1, 64)
-// 	s := strconv.FormatInt(-42, 16)
-// 	s := strconv.FormatUint(42, 16)
-//
-// AppendBool, AppendFloat, AppendInt, and AppendUint are similar but
-// append the formatted value to a destination slice.
-//
-// String Conversions
-//
-// Quote and QuoteToASCII convert strings to quoted Go string literals.
-// The latter guarantees that the result is an ASCII string, by escaping
-// any non-ASCII Unicode with \u:
-//
-//	q := Quote("Hello, 世界")
-//	q := QuoteToASCII("Hello, 世界")
-//
-// QuoteRune and QuoteRuneToASCII are similar but accept runes and
-// return quoted Go rune literals.
-//
-// Unquote and UnquoteChar unquote Go string and rune literals.
-//
-package strconv
diff --git a/third_party/gofrontend/libgo/go/strconv/example_test.go b/third_party/gofrontend/libgo/go/strconv/example_test.go
deleted file mode 100644
index 01fbbc0..0000000
--- a/third_party/gofrontend/libgo/go/strconv/example_test.go
+++ /dev/null
@@ -1,338 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv_test
-
-import (
-	"fmt"
-	"log"
-	"strconv"
-)
-
-func ExampleAppendBool() {
-	b := []byte("bool:")
-	b = strconv.AppendBool(b, true)
-	fmt.Println(string(b))
-
-	// Output:
-	// bool:true
-}
-
-func ExampleAppendFloat() {
-	b32 := []byte("float32:")
-	b32 = strconv.AppendFloat(b32, 3.1415926535, 'E', -1, 32)
-	fmt.Println(string(b32))
-
-	b64 := []byte("float64:")
-	b64 = strconv.AppendFloat(b64, 3.1415926535, 'E', -1, 64)
-	fmt.Println(string(b64))
-
-	// Output:
-	// float32:3.1415927E+00
-	// float64:3.1415926535E+00
-}
-
-func ExampleAppendInt() {
-	b10 := []byte("int (base 10):")
-	b10 = strconv.AppendInt(b10, -42, 10)
-	fmt.Println(string(b10))
-
-	b16 := []byte("int (base 16):")
-	b16 = strconv.AppendInt(b16, -42, 16)
-	fmt.Println(string(b16))
-
-	// Output:
-	// int (base 10):-42
-	// int (base 16):-2a
-}
-
-func ExampleAppendQuote() {
-	b := []byte("quote:")
-	b = strconv.AppendQuote(b, `"Fran & Freddie's Diner"`)
-	fmt.Println(string(b))
-
-	// Output:
-	// quote:"\"Fran & Freddie's Diner\""
-}
-
-func ExampleAppendQuoteRune() {
-	b := []byte("rune:")
-	b = strconv.AppendQuoteRune(b, '☺')
-	fmt.Println(string(b))
-
-	// Output:
-	// rune:'☺'
-}
-
-func ExampleAppendQuoteRuneToASCII() {
-	b := []byte("rune (ascii):")
-	b = strconv.AppendQuoteRuneToASCII(b, '☺')
-	fmt.Println(string(b))
-
-	// Output:
-	// rune (ascii):'\u263a'
-}
-
-func ExampleAppendQuoteToASCII() {
-	b := []byte("quote (ascii):")
-	b = strconv.AppendQuoteToASCII(b, `"Fran & Freddie's Diner"`)
-	fmt.Println(string(b))
-
-	// Output:
-	// quote (ascii):"\"Fran & Freddie's Diner\""
-}
-
-func ExampleAppendUint() {
-	b10 := []byte("uint (base 10):")
-	b10 = strconv.AppendUint(b10, 42, 10)
-	fmt.Println(string(b10))
-
-	b16 := []byte("uint (base 16):")
-	b16 = strconv.AppendUint(b16, 42, 16)
-	fmt.Println(string(b16))
-
-	// Output:
-	// uint (base 10):42
-	// uint (base 16):2a
-}
-
-func ExampleAtoi() {
-	v := "10"
-	if s, err := strconv.Atoi(v); err == nil {
-		fmt.Printf("%T, %v", s, s)
-	}
-
-	// Output:
-	// int, 10
-}
-
-func ExampleCanBackquote() {
-	fmt.Println(strconv.CanBackquote("Fran & Freddie's Diner ☺"))
-	fmt.Println(strconv.CanBackquote("`can't backquote this`"))
-
-	// Output:
-	// true
-	// false
-}
-
-func ExampleFormatBool() {
-	v := true
-	s := strconv.FormatBool(v)
-	fmt.Printf("%T, %v\n", s, s)
-
-	// Output:
-	// string, true
-}
-
-func ExampleFormatFloat() {
-	v := 3.1415926535
-
-	s32 := strconv.FormatFloat(v, 'E', -1, 32)
-	fmt.Printf("%T, %v\n", s32, s32)
-
-	s64 := strconv.FormatFloat(v, 'E', -1, 64)
-	fmt.Printf("%T, %v\n", s64, s64)
-
-	// Output:
-	// string, 3.1415927E+00
-	// string, 3.1415926535E+00
-}
-
-func ExampleFormatInt() {
-	v := int64(-42)
-
-	s10 := strconv.FormatInt(v, 10)
-	fmt.Printf("%T, %v\n", s10, s10)
-
-	s16 := strconv.FormatInt(v, 16)
-	fmt.Printf("%T, %v\n", s16, s16)
-
-	// Output:
-	// string, -42
-	// string, -2a
-}
-
-func ExampleFormatUint() {
-	v := uint64(42)
-
-	s10 := strconv.FormatUint(v, 10)
-	fmt.Printf("%T, %v\n", s10, s10)
-
-	s16 := strconv.FormatUint(v, 16)
-	fmt.Printf("%T, %v\n", s16, s16)
-
-	// Output:
-	// string, 42
-	// string, 2a
-}
-
-func ExampleIsPrint() {
-	c := strconv.IsPrint('\u263a')
-	fmt.Println(c)
-
-	bel := strconv.IsPrint('\007')
-	fmt.Println(bel)
-
-	// Output:
-	// true
-	// false
-}
-
-func ExampleItoa() {
-	i := 10
-	s := strconv.Itoa(i)
-	fmt.Printf("%T, %v\n", s, s)
-
-	// Output:
-	// string, 10
-}
-
-func ExampleParseBool() {
-	v := "true"
-	if s, err := strconv.ParseBool(v); err == nil {
-		fmt.Printf("%T, %v\n", s, s)
-	}
-
-	// Output:
-	// bool, true
-}
-
-func ExampleParseFloat() {
-	v := "3.1415926535"
-	if s, err := strconv.ParseFloat(v, 32); err == nil {
-		fmt.Printf("%T, %v\n", s, s)
-	}
-	if s, err := strconv.ParseFloat(v, 64); err == nil {
-		fmt.Printf("%T, %v\n", s, s)
-	}
-
-	// Output:
-	// float64, 3.1415927410125732
-	// float64, 3.1415926535
-}
-
-func ExampleParseInt() {
-	v32 := "-354634382"
-	if s, err := strconv.ParseInt(v32, 10, 32); err == nil {
-		fmt.Printf("%T, %v\n", s, s)
-	}
-	if s, err := strconv.ParseInt(v32, 16, 32); err == nil {
-		fmt.Printf("%T, %v\n", s, s)
-	}
-
-	v64 := "-3546343826724305832"
-	if s, err := strconv.ParseInt(v64, 10, 64); err == nil {
-		fmt.Printf("%T, %v\n", s, s)
-	}
-	if s, err := strconv.ParseInt(v64, 16, 64); err == nil {
-		fmt.Printf("%T, %v\n", s, s)
-	}
-
-	// Output:
-	// int64, -354634382
-	// int64, -3546343826724305832
-}
-
-func ExampleParseUint() {
-	v := "42"
-	if s, err := strconv.ParseUint(v, 10, 32); err == nil {
-		fmt.Printf("%T, %v\n", s, s)
-	}
-	if s, err := strconv.ParseUint(v, 10, 64); err == nil {
-		fmt.Printf("%T, %v\n", s, s)
-	}
-
-	// Output:
-	// uint64, 42
-	// uint64, 42
-}
-
-func ExampleQuote() {
-	s := strconv.Quote(`"Fran & Freddie's Diner	☺"`)
-	fmt.Println(s)
-
-	// Output:
-	// "\"Fran & Freddie's Diner\t☺\""
-}
-
-func ExampleQuoteRune() {
-	s := strconv.QuoteRune('☺')
-	fmt.Println(s)
-
-	// Output:
-	// '☺'
-}
-
-func ExampleQuoteRuneToASCII() {
-	s := strconv.QuoteRuneToASCII('☺')
-	fmt.Println(s)
-
-	// Output:
-	// '\u263a'
-}
-
-func ExampleQuoteToASCII() {
-	s := strconv.QuoteToASCII(`"Fran & Freddie's Diner	☺"`)
-	fmt.Println(s)
-
-	// Output:
-	// "\"Fran & Freddie's Diner\t\u263a\""
-}
-
-func ExampleUnquote() {
-	test := func(s string) {
-		t, err := strconv.Unquote(s)
-		if err != nil {
-			fmt.Printf("Unquote(%#v): %v\n", s, err)
-		} else {
-			fmt.Printf("Unquote(%#v) = %v\n", s, t)
-		}
-	}
-
-	s := `\"Fran & Freddie's Diner\t\u263a\"\"`
-	// If the string doesn't have quotes, it can't be unquoted.
-	test(s) // invalid syntax
-	test("`" + s + "`")
-	test(`"` + s + `"`)
-	test(`'\u263a'`)
-
-	// Output:
-	// Unquote("\\\"Fran & Freddie's Diner\\t\\u263a\\\"\\\""): invalid syntax
-	// Unquote("`\\\"Fran & Freddie's Diner\\t\\u263a\\\"\\\"`") = \"Fran & Freddie's Diner\t\u263a\"\"
-	// Unquote("\"\\\"Fran & Freddie's Diner\\t\\u263a\\\"\\\"\"") = "Fran & Freddie's Diner	☺""
-	// Unquote("'\\u263a'") = ☺
-}
-
-func ExampleUnquoteChar() {
-	v, mb, t, err := strconv.UnquoteChar(`\"Fran & Freddie's Diner\"`, '"')
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	fmt.Println("value:", string(v))
-	fmt.Println("multibyte:", mb)
-	fmt.Println("tail:", t)
-
-	// Output:
-	// value: "
-	// multibyte: false
-	// tail: Fran & Freddie's Diner\"
-}
-
-func ExampleNumError() {
-	str := "Not a number"
-	if _, err := strconv.ParseFloat(str, 64); err != nil {
-		e := err.(*strconv.NumError)
-		fmt.Println("Func:", e.Func)
-		fmt.Println("Num:", e.Num)
-		fmt.Println("Err:", e.Err)
-		fmt.Println(err)
-	}
-
-	// Output:
-	// Func: ParseFloat
-	// Num: Not a number
-	// Err: invalid syntax
-	// strconv.ParseFloat: parsing "Not a number": invalid syntax
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/extfloat.go b/third_party/gofrontend/libgo/go/strconv/extfloat.go
deleted file mode 100644
index 019b4ee..0000000
--- a/third_party/gofrontend/libgo/go/strconv/extfloat.go
+++ /dev/null
@@ -1,668 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv
-
-// An extFloat represents an extended floating-point number, with more
-// precision than a float64. It does not try to save bits: the
-// number represented by the structure is mant*(2^exp), with a negative
-// sign if neg is true.
-type extFloat struct {
-	mant uint64
-	exp  int
-	neg  bool
-}
-
-// Powers of ten taken from double-conversion library.
-// http://code.google.com/p/double-conversion/
-const (
-	firstPowerOfTen = -348
-	stepPowerOfTen  = 8
-)
-
-var smallPowersOfTen = [...]extFloat{
-	{1 << 63, -63, false},        // 1
-	{0xa << 60, -60, false},      // 1e1
-	{0x64 << 57, -57, false},     // 1e2
-	{0x3e8 << 54, -54, false},    // 1e3
-	{0x2710 << 50, -50, false},   // 1e4
-	{0x186a0 << 47, -47, false},  // 1e5
-	{0xf4240 << 44, -44, false},  // 1e6
-	{0x989680 << 40, -40, false}, // 1e7
-}
-
-var powersOfTen = [...]extFloat{
-	{0xfa8fd5a0081c0288, -1220, false}, // 10^-348
-	{0xbaaee17fa23ebf76, -1193, false}, // 10^-340
-	{0x8b16fb203055ac76, -1166, false}, // 10^-332
-	{0xcf42894a5dce35ea, -1140, false}, // 10^-324
-	{0x9a6bb0aa55653b2d, -1113, false}, // 10^-316
-	{0xe61acf033d1a45df, -1087, false}, // 10^-308
-	{0xab70fe17c79ac6ca, -1060, false}, // 10^-300
-	{0xff77b1fcbebcdc4f, -1034, false}, // 10^-292
-	{0xbe5691ef416bd60c, -1007, false}, // 10^-284
-	{0x8dd01fad907ffc3c, -980, false},  // 10^-276
-	{0xd3515c2831559a83, -954, false},  // 10^-268
-	{0x9d71ac8fada6c9b5, -927, false},  // 10^-260
-	{0xea9c227723ee8bcb, -901, false},  // 10^-252
-	{0xaecc49914078536d, -874, false},  // 10^-244
-	{0x823c12795db6ce57, -847, false},  // 10^-236
-	{0xc21094364dfb5637, -821, false},  // 10^-228
-	{0x9096ea6f3848984f, -794, false},  // 10^-220
-	{0xd77485cb25823ac7, -768, false},  // 10^-212
-	{0xa086cfcd97bf97f4, -741, false},  // 10^-204
-	{0xef340a98172aace5, -715, false},  // 10^-196
-	{0xb23867fb2a35b28e, -688, false},  // 10^-188
-	{0x84c8d4dfd2c63f3b, -661, false},  // 10^-180
-	{0xc5dd44271ad3cdba, -635, false},  // 10^-172
-	{0x936b9fcebb25c996, -608, false},  // 10^-164
-	{0xdbac6c247d62a584, -582, false},  // 10^-156
-	{0xa3ab66580d5fdaf6, -555, false},  // 10^-148
-	{0xf3e2f893dec3f126, -529, false},  // 10^-140
-	{0xb5b5ada8aaff80b8, -502, false},  // 10^-132
-	{0x87625f056c7c4a8b, -475, false},  // 10^-124
-	{0xc9bcff6034c13053, -449, false},  // 10^-116
-	{0x964e858c91ba2655, -422, false},  // 10^-108
-	{0xdff9772470297ebd, -396, false},  // 10^-100
-	{0xa6dfbd9fb8e5b88f, -369, false},  // 10^-92
-	{0xf8a95fcf88747d94, -343, false},  // 10^-84
-	{0xb94470938fa89bcf, -316, false},  // 10^-76
-	{0x8a08f0f8bf0f156b, -289, false},  // 10^-68
-	{0xcdb02555653131b6, -263, false},  // 10^-60
-	{0x993fe2c6d07b7fac, -236, false},  // 10^-52
-	{0xe45c10c42a2b3b06, -210, false},  // 10^-44
-	{0xaa242499697392d3, -183, false},  // 10^-36
-	{0xfd87b5f28300ca0e, -157, false},  // 10^-28
-	{0xbce5086492111aeb, -130, false},  // 10^-20
-	{0x8cbccc096f5088cc, -103, false},  // 10^-12
-	{0xd1b71758e219652c, -77, false},   // 10^-4
-	{0x9c40000000000000, -50, false},   // 10^4
-	{0xe8d4a51000000000, -24, false},   // 10^12
-	{0xad78ebc5ac620000, 3, false},     // 10^20
-	{0x813f3978f8940984, 30, false},    // 10^28
-	{0xc097ce7bc90715b3, 56, false},    // 10^36
-	{0x8f7e32ce7bea5c70, 83, false},    // 10^44
-	{0xd5d238a4abe98068, 109, false},   // 10^52
-	{0x9f4f2726179a2245, 136, false},   // 10^60
-	{0xed63a231d4c4fb27, 162, false},   // 10^68
-	{0xb0de65388cc8ada8, 189, false},   // 10^76
-	{0x83c7088e1aab65db, 216, false},   // 10^84
-	{0xc45d1df942711d9a, 242, false},   // 10^92
-	{0x924d692ca61be758, 269, false},   // 10^100
-	{0xda01ee641a708dea, 295, false},   // 10^108
-	{0xa26da3999aef774a, 322, false},   // 10^116
-	{0xf209787bb47d6b85, 348, false},   // 10^124
-	{0xb454e4a179dd1877, 375, false},   // 10^132
-	{0x865b86925b9bc5c2, 402, false},   // 10^140
-	{0xc83553c5c8965d3d, 428, false},   // 10^148
-	{0x952ab45cfa97a0b3, 455, false},   // 10^156
-	{0xde469fbd99a05fe3, 481, false},   // 10^164
-	{0xa59bc234db398c25, 508, false},   // 10^172
-	{0xf6c69a72a3989f5c, 534, false},   // 10^180
-	{0xb7dcbf5354e9bece, 561, false},   // 10^188
-	{0x88fcf317f22241e2, 588, false},   // 10^196
-	{0xcc20ce9bd35c78a5, 614, false},   // 10^204
-	{0x98165af37b2153df, 641, false},   // 10^212
-	{0xe2a0b5dc971f303a, 667, false},   // 10^220
-	{0xa8d9d1535ce3b396, 694, false},   // 10^228
-	{0xfb9b7cd9a4a7443c, 720, false},   // 10^236
-	{0xbb764c4ca7a44410, 747, false},   // 10^244
-	{0x8bab8eefb6409c1a, 774, false},   // 10^252
-	{0xd01fef10a657842c, 800, false},   // 10^260
-	{0x9b10a4e5e9913129, 827, false},   // 10^268
-	{0xe7109bfba19c0c9d, 853, false},   // 10^276
-	{0xac2820d9623bf429, 880, false},   // 10^284
-	{0x80444b5e7aa7cf85, 907, false},   // 10^292
-	{0xbf21e44003acdd2d, 933, false},   // 10^300
-	{0x8e679c2f5e44ff8f, 960, false},   // 10^308
-	{0xd433179d9c8cb841, 986, false},   // 10^316
-	{0x9e19db92b4e31ba9, 1013, false},  // 10^324
-	{0xeb96bf6ebadf77d9, 1039, false},  // 10^332
-	{0xaf87023b9bf0ee6b, 1066, false},  // 10^340
-}
-
-// floatBits returns the bits of the float64 that best approximates
-// the extFloat passed as receiver. Overflow is set to true if
-// the resulting float64 is ±Inf.
-func (f *extFloat) floatBits(flt *floatInfo) (bits uint64, overflow bool) {
-	f.Normalize()
-
-	exp := f.exp + 63
-
-	// Exponent too small.
-	if exp < flt.bias+1 {
-		n := flt.bias + 1 - exp
-		f.mant >>= uint(n)
-		exp += n
-	}
-
-	// Extract 1+flt.mantbits bits from the 64-bit mantissa.
-	mant := f.mant >> (63 - flt.mantbits)
-	if f.mant&(1<<(62-flt.mantbits)) != 0 {
-		// Round up.
-		mant += 1
-	}
-
-	// Rounding might have added a bit; shift down.
-	if mant == 2<<flt.mantbits {
-		mant >>= 1
-		exp++
-	}
-
-	// Infinities.
-	if exp-flt.bias >= 1<<flt.expbits-1 {
-		// ±Inf
-		mant = 0
-		exp = 1<<flt.expbits - 1 + flt.bias
-		overflow = true
-	} else if mant&(1<<flt.mantbits) == 0 {
-		// Denormalized?
-		exp = flt.bias
-	}
-	// Assemble bits.
-	bits = mant & (uint64(1)<<flt.mantbits - 1)
-	bits |= uint64((exp-flt.bias)&(1<<flt.expbits-1)) << flt.mantbits
-	if f.neg {
-		bits |= 1 << (flt.mantbits + flt.expbits)
-	}
-	return
-}
-
-// AssignComputeBounds sets f to the floating point value
-// defined by mant, exp and precision given by flt. It returns
-// lower, upper such that any number in the closed interval
-// [lower, upper] is converted back to the same floating point number.
-func (f *extFloat) AssignComputeBounds(mant uint64, exp int, neg bool, flt *floatInfo) (lower, upper extFloat) {
-	f.mant = mant
-	f.exp = exp - int(flt.mantbits)
-	f.neg = neg
-	if f.exp <= 0 && mant == (mant>>uint(-f.exp))<<uint(-f.exp) {
-		// An exact integer
-		f.mant >>= uint(-f.exp)
-		f.exp = 0
-		return *f, *f
-	}
-	expBiased := exp - flt.bias
-
-	upper = extFloat{mant: 2*f.mant + 1, exp: f.exp - 1, neg: f.neg}
-	if mant != 1<<flt.mantbits || expBiased == 1 {
-		lower = extFloat{mant: 2*f.mant - 1, exp: f.exp - 1, neg: f.neg}
-	} else {
-		lower = extFloat{mant: 4*f.mant - 1, exp: f.exp - 2, neg: f.neg}
-	}
-	return
-}
-
-// Normalize normalizes f so that the highest bit of the mantissa is
-// set, and returns the number by which the mantissa was left-shifted.
-func (f *extFloat) Normalize() (shift uint) {
-	mant, exp := f.mant, f.exp
-	if mant == 0 {
-		return 0
-	}
-	if mant>>(64-32) == 0 {
-		mant <<= 32
-		exp -= 32
-	}
-	if mant>>(64-16) == 0 {
-		mant <<= 16
-		exp -= 16
-	}
-	if mant>>(64-8) == 0 {
-		mant <<= 8
-		exp -= 8
-	}
-	if mant>>(64-4) == 0 {
-		mant <<= 4
-		exp -= 4
-	}
-	if mant>>(64-2) == 0 {
-		mant <<= 2
-		exp -= 2
-	}
-	if mant>>(64-1) == 0 {
-		mant <<= 1
-		exp -= 1
-	}
-	shift = uint(f.exp - exp)
-	f.mant, f.exp = mant, exp
-	return
-}
-
-// Multiply sets f to the product f*g: the result is correctly rounded,
-// but not normalized.
-func (f *extFloat) Multiply(g extFloat) {
-	fhi, flo := f.mant>>32, uint64(uint32(f.mant))
-	ghi, glo := g.mant>>32, uint64(uint32(g.mant))
-
-	// Cross products.
-	cross1 := fhi * glo
-	cross2 := flo * ghi
-
-	// f.mant*g.mant is fhi*ghi << 64 + (cross1+cross2) << 32 + flo*glo
-	f.mant = fhi*ghi + (cross1 >> 32) + (cross2 >> 32)
-	rem := uint64(uint32(cross1)) + uint64(uint32(cross2)) + ((flo * glo) >> 32)
-	// Round up.
-	rem += (1 << 31)
-
-	f.mant += (rem >> 32)
-	f.exp = f.exp + g.exp + 64
-}
-
-var uint64pow10 = [...]uint64{
-	1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
-	1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
-}
-
-// AssignDecimal sets f to an approximate value mantissa*10^exp. It
-// reports whether the value represented by f is guaranteed to be the
-// best approximation of d after being rounded to a float64 or
-// float32 depending on flt.
-func (f *extFloat) AssignDecimal(mantissa uint64, exp10 int, neg bool, trunc bool, flt *floatInfo) (ok bool) {
-	const uint64digits = 19
-	const errorscale = 8
-	errors := 0 // An upper bound for error, computed in errorscale*ulp.
-	if trunc {
-		// the decimal number was truncated.
-		errors += errorscale / 2
-	}
-
-	f.mant = mantissa
-	f.exp = 0
-	f.neg = neg
-
-	// Multiply by powers of ten.
-	i := (exp10 - firstPowerOfTen) / stepPowerOfTen
-	if exp10 < firstPowerOfTen || i >= len(powersOfTen) {
-		return false
-	}
-	adjExp := (exp10 - firstPowerOfTen) % stepPowerOfTen
-
-	// We multiply by exp%step
-	if adjExp < uint64digits && mantissa < uint64pow10[uint64digits-adjExp] {
-		// We can multiply the mantissa exactly.
-		f.mant *= uint64pow10[adjExp]
-		f.Normalize()
-	} else {
-		f.Normalize()
-		f.Multiply(smallPowersOfTen[adjExp])
-		errors += errorscale / 2
-	}
-
-	// We multiply by 10 to the exp - exp%step.
-	f.Multiply(powersOfTen[i])
-	if errors > 0 {
-		errors += 1
-	}
-	errors += errorscale / 2
-
-	// Normalize
-	shift := f.Normalize()
-	errors <<= shift
-
-	// Now f is a good approximation of the decimal.
-	// Check whether the error is too large: that is, if the mantissa
-	// is perturbated by the error, the resulting float64 will change.
-	// The 64 bits mantissa is 1 + 52 bits for float64 + 11 extra bits.
-	//
-	// In many cases the approximation will be good enough.
-	denormalExp := flt.bias - 63
-	var extrabits uint
-	if f.exp <= denormalExp {
-		// f.mant * 2^f.exp is smaller than 2^(flt.bias+1).
-		extrabits = uint(63 - flt.mantbits + 1 + uint(denormalExp-f.exp))
-	} else {
-		extrabits = uint(63 - flt.mantbits)
-	}
-
-	halfway := uint64(1) << (extrabits - 1)
-	mant_extra := f.mant & (1<<extrabits - 1)
-
-	// Do a signed comparison here! If the error estimate could make
-	// the mantissa round differently for the conversion to double,
-	// then we can't give a definite answer.
-	if int64(halfway)-int64(errors) < int64(mant_extra) &&
-		int64(mant_extra) < int64(halfway)+int64(errors) {
-		return false
-	}
-	return true
-}
-
-// Frexp10 is an analogue of math.Frexp for decimal powers. It scales
-// f by an approximate power of ten 10^-exp, and returns exp10, so
-// that f*10^exp10 has the same value as the old f, up to an ulp,
-// as well as the index of 10^-exp in the powersOfTen table.
-func (f *extFloat) frexp10() (exp10, index int) {
-	// The constants expMin and expMax constrain the final value of the
-	// binary exponent of f. We want a small integral part in the result
-	// because finding digits of an integer requires divisions, whereas
-	// digits of the fractional part can be found by repeatedly multiplying
-	// by 10.
-	const expMin = -60
-	const expMax = -32
-	// Find power of ten such that x * 10^n has a binary exponent
-	// between expMin and expMax.
-	approxExp10 := ((expMin+expMax)/2 - f.exp) * 28 / 93 // log(10)/log(2) is close to 93/28.
-	i := (approxExp10 - firstPowerOfTen) / stepPowerOfTen
-Loop:
-	for {
-		exp := f.exp + powersOfTen[i].exp + 64
-		switch {
-		case exp < expMin:
-			i++
-		case exp > expMax:
-			i--
-		default:
-			break Loop
-		}
-	}
-	// Apply the desired decimal shift on f. It will have exponent
-	// in the desired range. This is multiplication by 10^-exp10.
-	f.Multiply(powersOfTen[i])
-
-	return -(firstPowerOfTen + i*stepPowerOfTen), i
-}
-
-// frexp10Many applies a common shift by a power of ten to a, b, c.
-func frexp10Many(a, b, c *extFloat) (exp10 int) {
-	exp10, i := c.frexp10()
-	a.Multiply(powersOfTen[i])
-	b.Multiply(powersOfTen[i])
-	return
-}
-
-// FixedDecimal stores in d the first n significant digits
-// of the decimal representation of f. It returns false
-// if it cannot be sure of the answer.
-func (f *extFloat) FixedDecimal(d *decimalSlice, n int) bool {
-	if f.mant == 0 {
-		d.nd = 0
-		d.dp = 0
-		d.neg = f.neg
-		return true
-	}
-	if n == 0 {
-		panic("strconv: internal error: extFloat.FixedDecimal called with n == 0")
-	}
-	// Multiply by an appropriate power of ten to have a reasonable
-	// number to process.
-	f.Normalize()
-	exp10, _ := f.frexp10()
-
-	shift := uint(-f.exp)
-	integer := uint32(f.mant >> shift)
-	fraction := f.mant - (uint64(integer) << shift)
-	ε := uint64(1) // ε is the uncertainty we have on the mantissa of f.
-
-	// Write exactly n digits to d.
-	needed := n        // how many digits are left to write.
-	integerDigits := 0 // the number of decimal digits of integer.
-	pow10 := uint64(1) // the power of ten by which f was scaled.
-	for i, pow := 0, uint64(1); i < 20; i++ {
-		if pow > uint64(integer) {
-			integerDigits = i
-			break
-		}
-		pow *= 10
-	}
-	rest := integer
-	if integerDigits > needed {
-		// the integral part is already large, trim the last digits.
-		pow10 = uint64pow10[integerDigits-needed]
-		integer /= uint32(pow10)
-		rest -= integer * uint32(pow10)
-	} else {
-		rest = 0
-	}
-
-	// Write the digits of integer: the digits of rest are omitted.
-	var buf [32]byte
-	pos := len(buf)
-	for v := integer; v > 0; {
-		v1 := v / 10
-		v -= 10 * v1
-		pos--
-		buf[pos] = byte(v + '0')
-		v = v1
-	}
-	for i := pos; i < len(buf); i++ {
-		d.d[i-pos] = buf[i]
-	}
-	nd := len(buf) - pos
-	d.nd = nd
-	d.dp = integerDigits + exp10
-	needed -= nd
-
-	if needed > 0 {
-		if rest != 0 || pow10 != 1 {
-			panic("strconv: internal error, rest != 0 but needed > 0")
-		}
-		// Emit digits for the fractional part. Each time, 10*fraction
-		// fits in a uint64 without overflow.
-		for needed > 0 {
-			fraction *= 10
-			ε *= 10 // the uncertainty scales as we multiply by ten.
-			if 2*ε > 1<<shift {
-				// the error is so large it could modify which digit to write, abort.
-				return false
-			}
-			digit := fraction >> shift
-			d.d[nd] = byte(digit + '0')
-			fraction -= digit << shift
-			nd++
-			needed--
-		}
-		d.nd = nd
-	}
-
-	// We have written a truncation of f (a numerator / 10^d.dp). The remaining part
-	// can be interpreted as a small number (< 1) to be added to the last digit of the
-	// numerator.
-	//
-	// If rest > 0, the amount is:
-	//    (rest<<shift | fraction) / (pow10 << shift)
-	//    fraction being known with a ±ε uncertainty.
-	//    The fact that n > 0 guarantees that pow10 << shift does not overflow a uint64.
-	//
-	// If rest = 0, pow10 == 1 and the amount is
-	//    fraction / (1 << shift)
-	//    fraction being known with a ±ε uncertainty.
-	//
-	// We pass this information to the rounding routine for adjustment.
-
-	ok := adjustLastDigitFixed(d, uint64(rest)<<shift|fraction, pow10, shift, ε)
-	if !ok {
-		return false
-	}
-	// Trim trailing zeros.
-	for i := d.nd - 1; i >= 0; i-- {
-		if d.d[i] != '0' {
-			d.nd = i + 1
-			break
-		}
-	}
-	return true
-}
-
-// adjustLastDigitFixed assumes d contains the representation of the integral part
-// of some number, whose fractional part is num / (den << shift). The numerator
-// num is only known up to an uncertainty of size ε, assumed to be less than
-// (den << shift)/2.
-//
-// It will increase the last digit by one to account for correct rounding, typically
-// when the fractional part is greater than 1/2, and will return false if ε is such
-// that no correct answer can be given.
-func adjustLastDigitFixed(d *decimalSlice, num, den uint64, shift uint, ε uint64) bool {
-	if num > den<<shift {
-		panic("strconv: num > den<<shift in adjustLastDigitFixed")
-	}
-	if 2*ε > den<<shift {
-		panic("strconv: ε > (den<<shift)/2")
-	}
-	if 2*(num+ε) < den<<shift {
-		return true
-	}
-	if 2*(num-ε) > den<<shift {
-		// increment d by 1.
-		i := d.nd - 1
-		for ; i >= 0; i-- {
-			if d.d[i] == '9' {
-				d.nd--
-			} else {
-				break
-			}
-		}
-		if i < 0 {
-			d.d[0] = '1'
-			d.nd = 1
-			d.dp++
-		} else {
-			d.d[i]++
-		}
-		return true
-	}
-	return false
-}
-
-// ShortestDecimal stores in d the shortest decimal representation of f
-// which belongs to the open interval (lower, upper), where f is supposed
-// to lie. It returns false whenever the result is unsure. The implementation
-// uses the Grisu3 algorithm.
-func (f *extFloat) ShortestDecimal(d *decimalSlice, lower, upper *extFloat) bool {
-	if f.mant == 0 {
-		d.nd = 0
-		d.dp = 0
-		d.neg = f.neg
-		return true
-	}
-	if f.exp == 0 && *lower == *f && *lower == *upper {
-		// an exact integer.
-		var buf [24]byte
-		n := len(buf) - 1
-		for v := f.mant; v > 0; {
-			v1 := v / 10
-			v -= 10 * v1
-			buf[n] = byte(v + '0')
-			n--
-			v = v1
-		}
-		nd := len(buf) - n - 1
-		for i := 0; i < nd; i++ {
-			d.d[i] = buf[n+1+i]
-		}
-		d.nd, d.dp = nd, nd
-		for d.nd > 0 && d.d[d.nd-1] == '0' {
-			d.nd--
-		}
-		if d.nd == 0 {
-			d.dp = 0
-		}
-		d.neg = f.neg
-		return true
-	}
-	upper.Normalize()
-	// Uniformize exponents.
-	if f.exp > upper.exp {
-		f.mant <<= uint(f.exp - upper.exp)
-		f.exp = upper.exp
-	}
-	if lower.exp > upper.exp {
-		lower.mant <<= uint(lower.exp - upper.exp)
-		lower.exp = upper.exp
-	}
-
-	exp10 := frexp10Many(lower, f, upper)
-	// Take a safety margin due to rounding in frexp10Many, but we lose precision.
-	upper.mant++
-	lower.mant--
-
-	// The shortest representation of f is either rounded up or down, but
-	// in any case, it is a truncation of upper.
-	shift := uint(-upper.exp)
-	integer := uint32(upper.mant >> shift)
-	fraction := upper.mant - (uint64(integer) << shift)
-
-	// How far we can go down from upper until the result is wrong.
-	allowance := upper.mant - lower.mant
-	// How far we should go to get a very precise result.
-	targetDiff := upper.mant - f.mant
-
-	// Count integral digits: there are at most 10.
-	var integerDigits int
-	for i, pow := 0, uint64(1); i < 20; i++ {
-		if pow > uint64(integer) {
-			integerDigits = i
-			break
-		}
-		pow *= 10
-	}
-	for i := 0; i < integerDigits; i++ {
-		pow := uint64pow10[integerDigits-i-1]
-		digit := integer / uint32(pow)
-		d.d[i] = byte(digit + '0')
-		integer -= digit * uint32(pow)
-		// evaluate whether we should stop.
-		if currentDiff := uint64(integer)<<shift + fraction; currentDiff < allowance {
-			d.nd = i + 1
-			d.dp = integerDigits + exp10
-			d.neg = f.neg
-			// Sometimes allowance is so large the last digit might need to be
-			// decremented to get closer to f.
-			return adjustLastDigit(d, currentDiff, targetDiff, allowance, pow<<shift, 2)
-		}
-	}
-	d.nd = integerDigits
-	d.dp = d.nd + exp10
-	d.neg = f.neg
-
-	// Compute digits of the fractional part. At each step fraction does not
-	// overflow. The choice of minExp implies that fraction is less than 2^60.
-	var digit int
-	multiplier := uint64(1)
-	for {
-		fraction *= 10
-		multiplier *= 10
-		digit = int(fraction >> shift)
-		d.d[d.nd] = byte(digit + '0')
-		d.nd++
-		fraction -= uint64(digit) << shift
-		if fraction < allowance*multiplier {
-			// We are in the admissible range. Note that if allowance is about to
-			// overflow, that is, allowance > 2^64/10, the condition is automatically
-			// true due to the limited range of fraction.
-			return adjustLastDigit(d,
-				fraction, targetDiff*multiplier, allowance*multiplier,
-				1<<shift, multiplier*2)
-		}
-	}
-}
-
-// adjustLastDigit modifies d = x-currentDiff*ε, to get closest to
-// d = x-targetDiff*ε, without becoming smaller than x-maxDiff*ε.
-// It assumes that a decimal digit is worth ulpDecimal*ε, and that
-// all data is known with a error estimate of ulpBinary*ε.
-func adjustLastDigit(d *decimalSlice, currentDiff, targetDiff, maxDiff, ulpDecimal, ulpBinary uint64) bool {
-	if ulpDecimal < 2*ulpBinary {
-		// Approximation is too wide.
-		return false
-	}
-	for currentDiff+ulpDecimal/2+ulpBinary < targetDiff {
-		d.d[d.nd-1]--
-		currentDiff += ulpDecimal
-	}
-	if currentDiff+ulpDecimal <= targetDiff+ulpDecimal/2+ulpBinary {
-		// we have two choices, and don't know what to do.
-		return false
-	}
-	if currentDiff < ulpBinary || currentDiff > maxDiff-ulpBinary {
-		// we went too far
-		return false
-	}
-	if d.nd == 1 && d.d[0] == '0' {
-		// the number has actually reached zero.
-		d.nd = 0
-		d.dp = 0
-	}
-	return true
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/fp_test.go b/third_party/gofrontend/libgo/go/strconv/fp_test.go
deleted file mode 100644
index 6de2f8b..0000000
--- a/third_party/gofrontend/libgo/go/strconv/fp_test.go
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv_test
-
-import (
-	"bufio"
-	"fmt"
-	"os"
-	"strconv"
-	"strings"
-	"testing"
-)
-
-func pow2(i int) float64 {
-	switch {
-	case i < 0:
-		return 1 / pow2(-i)
-	case i == 0:
-		return 1
-	case i == 1:
-		return 2
-	}
-	return pow2(i/2) * pow2(i-i/2)
-}
-
-// Wrapper around strconv.ParseFloat(x, 64).  Handles dddddp+ddd (binary exponent)
-// itself, passes the rest on to strconv.ParseFloat.
-func myatof64(s string) (f float64, ok bool) {
-	a := strings.SplitN(s, "p", 2)
-	if len(a) == 2 {
-		n, err := strconv.ParseInt(a[0], 10, 64)
-		if err != nil {
-			return 0, false
-		}
-		e, err1 := strconv.Atoi(a[1])
-		if err1 != nil {
-			println("bad e", a[1])
-			return 0, false
-		}
-		v := float64(n)
-		// We expect that v*pow2(e) fits in a float64,
-		// but pow2(e) by itself may not.  Be careful.
-		if e <= -1000 {
-			v *= pow2(-1000)
-			e += 1000
-			for e < 0 {
-				v /= 2
-				e++
-			}
-			return v, true
-		}
-		if e >= 1000 {
-			v *= pow2(1000)
-			e -= 1000
-			for e > 0 {
-				v *= 2
-				e--
-			}
-			return v, true
-		}
-		return v * pow2(e), true
-	}
-	f1, err := strconv.ParseFloat(s, 64)
-	if err != nil {
-		return 0, false
-	}
-	return f1, true
-}
-
-// Wrapper around strconv.ParseFloat(x, 32).  Handles dddddp+ddd (binary exponent)
-// itself, passes the rest on to strconv.ParseFloat.
-func myatof32(s string) (f float32, ok bool) {
-	a := strings.SplitN(s, "p", 2)
-	if len(a) == 2 {
-		n, err := strconv.Atoi(a[0])
-		if err != nil {
-			println("bad n", a[0])
-			return 0, false
-		}
-		e, err1 := strconv.Atoi(a[1])
-		if err1 != nil {
-			println("bad p", a[1])
-			return 0, false
-		}
-		return float32(float64(n) * pow2(e)), true
-	}
-	f64, err1 := strconv.ParseFloat(s, 32)
-	f1 := float32(f64)
-	if err1 != nil {
-		return 0, false
-	}
-	return f1, true
-}
-
-func TestFp(t *testing.T) {
-	f, err := os.Open("testdata/testfp.txt")
-	if err != nil {
-		t.Fatal("testfp: open testdata/testfp.txt:", err)
-	}
-	defer f.Close()
-
-	s := bufio.NewScanner(f)
-
-	for lineno := 1; s.Scan(); lineno++ {
-		line := s.Text()
-		if len(line) == 0 || line[0] == '#' {
-			continue
-		}
-		a := strings.Split(line, " ")
-		if len(a) != 4 {
-			t.Error("testdata/testfp.txt:", lineno, ": wrong field count")
-			continue
-		}
-		var s string
-		var v float64
-		switch a[0] {
-		case "float64":
-			var ok bool
-			v, ok = myatof64(a[2])
-			if !ok {
-				t.Error("testdata/testfp.txt:", lineno, ": cannot atof64 ", a[2])
-				continue
-			}
-			s = fmt.Sprintf(a[1], v)
-		case "float32":
-			v1, ok := myatof32(a[2])
-			if !ok {
-				t.Error("testdata/testfp.txt:", lineno, ": cannot atof32 ", a[2])
-				continue
-			}
-			s = fmt.Sprintf(a[1], v1)
-			v = float64(v1)
-		}
-		if s != a[3] {
-			t.Error("testdata/testfp.txt:", lineno, ": ", a[0], " ", a[1], " ", a[2], " (", v, ") ",
-				"want ", a[3], " got ", s)
-		}
-	}
-	if s.Err() != nil {
-		t.Fatal("testfp: read testdata/testfp.txt: ", s.Err())
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/ftoa.go b/third_party/gofrontend/libgo/go/strconv/ftoa.go
deleted file mode 100644
index 468c37f..0000000
--- a/third_party/gofrontend/libgo/go/strconv/ftoa.go
+++ /dev/null
@@ -1,455 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Binary to decimal floating point conversion.
-// Algorithm:
-//   1) store mantissa in multiprecision decimal
-//   2) shift decimal by exponent
-//   3) read digits out & format
-
-package strconv
-
-import "math"
-
-// TODO: move elsewhere?
-type floatInfo struct {
-	mantbits uint
-	expbits  uint
-	bias     int
-}
-
-var float32info = floatInfo{23, 8, -127}
-var float64info = floatInfo{52, 11, -1023}
-
-// FormatFloat converts the floating-point number f to a string,
-// according to the format fmt and precision prec.  It rounds the
-// result assuming that the original was obtained from a floating-point
-// value of bitSize bits (32 for float32, 64 for float64).
-//
-// The format fmt is one of
-// 'b' (-ddddp±ddd, a binary exponent),
-// 'e' (-d.dddde±dd, a decimal exponent),
-// 'E' (-d.ddddE±dd, a decimal exponent),
-// 'f' (-ddd.dddd, no exponent),
-// 'g' ('e' for large exponents, 'f' otherwise), or
-// 'G' ('E' for large exponents, 'f' otherwise).
-//
-// The precision prec controls the number of digits
-// (excluding the exponent) printed by the 'e', 'E', 'f', 'g', and 'G' formats.
-// For 'e', 'E', and 'f' it is the number of digits after the decimal point.
-// For 'g' and 'G' it is the total number of digits.
-// The special precision -1 uses the smallest number of digits
-// necessary such that ParseFloat will return f exactly.
-func FormatFloat(f float64, fmt byte, prec, bitSize int) string {
-	return string(genericFtoa(make([]byte, 0, max(prec+4, 24)), f, fmt, prec, bitSize))
-}
-
-// AppendFloat appends the string form of the floating-point number f,
-// as generated by FormatFloat, to dst and returns the extended buffer.
-func AppendFloat(dst []byte, f float64, fmt byte, prec, bitSize int) []byte {
-	return genericFtoa(dst, f, fmt, prec, bitSize)
-}
-
-func genericFtoa(dst []byte, val float64, fmt byte, prec, bitSize int) []byte {
-	var bits uint64
-	var flt *floatInfo
-	switch bitSize {
-	case 32:
-		bits = uint64(math.Float32bits(float32(val)))
-		flt = &float32info
-	case 64:
-		bits = math.Float64bits(val)
-		flt = &float64info
-	default:
-		panic("strconv: illegal AppendFloat/FormatFloat bitSize")
-	}
-
-	neg := bits>>(flt.expbits+flt.mantbits) != 0
-	exp := int(bits>>flt.mantbits) & (1<<flt.expbits - 1)
-	mant := bits & (uint64(1)<<flt.mantbits - 1)
-
-	switch exp {
-	case 1<<flt.expbits - 1:
-		// Inf, NaN
-		var s string
-		switch {
-		case mant != 0:
-			s = "NaN"
-		case neg:
-			s = "-Inf"
-		default:
-			s = "+Inf"
-		}
-		return append(dst, s...)
-
-	case 0:
-		// denormalized
-		exp++
-
-	default:
-		// add implicit top bit
-		mant |= uint64(1) << flt.mantbits
-	}
-	exp += flt.bias
-
-	// Pick off easy binary format.
-	if fmt == 'b' {
-		return fmtB(dst, neg, mant, exp, flt)
-	}
-
-	if !optimize {
-		return bigFtoa(dst, prec, fmt, neg, mant, exp, flt)
-	}
-
-	var digs decimalSlice
-	ok := false
-	// Negative precision means "only as much as needed to be exact."
-	shortest := prec < 0
-	if shortest {
-		// Try Grisu3 algorithm.
-		f := new(extFloat)
-		lower, upper := f.AssignComputeBounds(mant, exp, neg, flt)
-		var buf [32]byte
-		digs.d = buf[:]
-		ok = f.ShortestDecimal(&digs, &lower, &upper)
-		if !ok {
-			return bigFtoa(dst, prec, fmt, neg, mant, exp, flt)
-		}
-		// Precision for shortest representation mode.
-		switch fmt {
-		case 'e', 'E':
-			prec = max(digs.nd-1, 0)
-		case 'f':
-			prec = max(digs.nd-digs.dp, 0)
-		case 'g', 'G':
-			prec = digs.nd
-		}
-	} else if fmt != 'f' {
-		// Fixed number of digits.
-		digits := prec
-		switch fmt {
-		case 'e', 'E':
-			digits++
-		case 'g', 'G':
-			if prec == 0 {
-				prec = 1
-			}
-			digits = prec
-		}
-		if digits <= 15 {
-			// try fast algorithm when the number of digits is reasonable.
-			var buf [24]byte
-			digs.d = buf[:]
-			f := extFloat{mant, exp - int(flt.mantbits), neg}
-			ok = f.FixedDecimal(&digs, digits)
-		}
-	}
-	if !ok {
-		return bigFtoa(dst, prec, fmt, neg, mant, exp, flt)
-	}
-	return formatDigits(dst, shortest, neg, digs, prec, fmt)
-}
-
-// bigFtoa uses multiprecision computations to format a float.
-func bigFtoa(dst []byte, prec int, fmt byte, neg bool, mant uint64, exp int, flt *floatInfo) []byte {
-	d := new(decimal)
-	d.Assign(mant)
-	d.Shift(exp - int(flt.mantbits))
-	var digs decimalSlice
-	shortest := prec < 0
-	if shortest {
-		roundShortest(d, mant, exp, flt)
-		digs = decimalSlice{d: d.d[:], nd: d.nd, dp: d.dp}
-		// Precision for shortest representation mode.
-		switch fmt {
-		case 'e', 'E':
-			prec = digs.nd - 1
-		case 'f':
-			prec = max(digs.nd-digs.dp, 0)
-		case 'g', 'G':
-			prec = digs.nd
-		}
-	} else {
-		// Round appropriately.
-		switch fmt {
-		case 'e', 'E':
-			d.Round(prec + 1)
-		case 'f':
-			d.Round(d.dp + prec)
-		case 'g', 'G':
-			if prec == 0 {
-				prec = 1
-			}
-			d.Round(prec)
-		}
-		digs = decimalSlice{d: d.d[:], nd: d.nd, dp: d.dp}
-	}
-	return formatDigits(dst, shortest, neg, digs, prec, fmt)
-}
-
-func formatDigits(dst []byte, shortest bool, neg bool, digs decimalSlice, prec int, fmt byte) []byte {
-	switch fmt {
-	case 'e', 'E':
-		return fmtE(dst, neg, digs, prec, fmt)
-	case 'f':
-		return fmtF(dst, neg, digs, prec)
-	case 'g', 'G':
-		// trailing fractional zeros in 'e' form will be trimmed.
-		eprec := prec
-		if eprec > digs.nd && digs.nd >= digs.dp {
-			eprec = digs.nd
-		}
-		// %e is used if the exponent from the conversion
-		// is less than -4 or greater than or equal to the precision.
-		// if precision was the shortest possible, use precision 6 for this decision.
-		if shortest {
-			eprec = 6
-		}
-		exp := digs.dp - 1
-		if exp < -4 || exp >= eprec {
-			if prec > digs.nd {
-				prec = digs.nd
-			}
-			return fmtE(dst, neg, digs, prec-1, fmt+'e'-'g')
-		}
-		if prec > digs.dp {
-			prec = digs.nd
-		}
-		return fmtF(dst, neg, digs, max(prec-digs.dp, 0))
-	}
-
-	// unknown format
-	return append(dst, '%', fmt)
-}
-
-// roundShortest rounds d (= mant * 2^exp) to the shortest number of digits
-// that will let the original floating point value be precisely reconstructed.
-func roundShortest(d *decimal, mant uint64, exp int, flt *floatInfo) {
-	// If mantissa is zero, the number is zero; stop now.
-	if mant == 0 {
-		d.nd = 0
-		return
-	}
-
-	// Compute upper and lower such that any decimal number
-	// between upper and lower (possibly inclusive)
-	// will round to the original floating point number.
-
-	// We may see at once that the number is already shortest.
-	//
-	// Suppose d is not denormal, so that 2^exp <= d < 10^dp.
-	// The closest shorter number is at least 10^(dp-nd) away.
-	// The lower/upper bounds computed below are at distance
-	// at most 2^(exp-mantbits).
-	//
-	// So the number is already shortest if 10^(dp-nd) > 2^(exp-mantbits),
-	// or equivalently log2(10)*(dp-nd) > exp-mantbits.
-	// It is true if 332/100*(dp-nd) >= exp-mantbits (log2(10) > 3.32).
-	minexp := flt.bias + 1 // minimum possible exponent
-	if exp > minexp && 332*(d.dp-d.nd) >= 100*(exp-int(flt.mantbits)) {
-		// The number is already shortest.
-		return
-	}
-
-	// d = mant << (exp - mantbits)
-	// Next highest floating point number is mant+1 << exp-mantbits.
-	// Our upper bound is halfway between, mant*2+1 << exp-mantbits-1.
-	upper := new(decimal)
-	upper.Assign(mant*2 + 1)
-	upper.Shift(exp - int(flt.mantbits) - 1)
-
-	// d = mant << (exp - mantbits)
-	// Next lowest floating point number is mant-1 << exp-mantbits,
-	// unless mant-1 drops the significant bit and exp is not the minimum exp,
-	// in which case the next lowest is mant*2-1 << exp-mantbits-1.
-	// Either way, call it mantlo << explo-mantbits.
-	// Our lower bound is halfway between, mantlo*2+1 << explo-mantbits-1.
-	var mantlo uint64
-	var explo int
-	if mant > 1<<flt.mantbits || exp == minexp {
-		mantlo = mant - 1
-		explo = exp
-	} else {
-		mantlo = mant*2 - 1
-		explo = exp - 1
-	}
-	lower := new(decimal)
-	lower.Assign(mantlo*2 + 1)
-	lower.Shift(explo - int(flt.mantbits) - 1)
-
-	// The upper and lower bounds are possible outputs only if
-	// the original mantissa is even, so that IEEE round-to-even
-	// would round to the original mantissa and not the neighbors.
-	inclusive := mant%2 == 0
-
-	// Now we can figure out the minimum number of digits required.
-	// Walk along until d has distinguished itself from upper and lower.
-	for i := 0; i < d.nd; i++ {
-		var l, m, u byte // lower, middle, upper digits
-		if i < lower.nd {
-			l = lower.d[i]
-		} else {
-			l = '0'
-		}
-		m = d.d[i]
-		if i < upper.nd {
-			u = upper.d[i]
-		} else {
-			u = '0'
-		}
-
-		// Okay to round down (truncate) if lower has a different digit
-		// or if lower is inclusive and is exactly the result of rounding down.
-		okdown := l != m || (inclusive && l == m && i+1 == lower.nd)
-
-		// Okay to round up if upper has a different digit and
-		// either upper is inclusive or upper is bigger than the result of rounding up.
-		okup := m != u && (inclusive || m+1 < u || i+1 < upper.nd)
-
-		// If it's okay to do either, then round to the nearest one.
-		// If it's okay to do only one, do it.
-		switch {
-		case okdown && okup:
-			d.Round(i + 1)
-			return
-		case okdown:
-			d.RoundDown(i + 1)
-			return
-		case okup:
-			d.RoundUp(i + 1)
-			return
-		}
-	}
-}
-
-type decimalSlice struct {
-	d      []byte
-	nd, dp int
-	neg    bool
-}
-
-// %e: -d.ddddde±dd
-func fmtE(dst []byte, neg bool, d decimalSlice, prec int, fmt byte) []byte {
-	// sign
-	if neg {
-		dst = append(dst, '-')
-	}
-
-	// first digit
-	ch := byte('0')
-	if d.nd != 0 {
-		ch = d.d[0]
-	}
-	dst = append(dst, ch)
-
-	// .moredigits
-	if prec > 0 {
-		dst = append(dst, '.')
-		i := 1
-		m := min(d.nd, prec+1)
-		if i < m {
-			dst = append(dst, d.d[i:m]...)
-			i = m
-		}
-		for ; i <= prec; i++ {
-			dst = append(dst, '0')
-		}
-	}
-
-	// e±
-	dst = append(dst, fmt)
-	exp := d.dp - 1
-	if d.nd == 0 { // special case: 0 has exponent 0
-		exp = 0
-	}
-	if exp < 0 {
-		ch = '-'
-		exp = -exp
-	} else {
-		ch = '+'
-	}
-	dst = append(dst, ch)
-
-	// dd or ddd
-	switch {
-	case exp < 10:
-		dst = append(dst, '0', byte(exp)+'0')
-	case exp < 100:
-		dst = append(dst, byte(exp/10)+'0', byte(exp%10)+'0')
-	default:
-		dst = append(dst, byte(exp/100)+'0', byte(exp/10)%10+'0', byte(exp%10)+'0')
-	}
-
-	return dst
-}
-
-// %f: -ddddddd.ddddd
-func fmtF(dst []byte, neg bool, d decimalSlice, prec int) []byte {
-	// sign
-	if neg {
-		dst = append(dst, '-')
-	}
-
-	// integer, padded with zeros as needed.
-	if d.dp > 0 {
-		m := min(d.nd, d.dp)
-		dst = append(dst, d.d[:m]...)
-		for ; m < d.dp; m++ {
-			dst = append(dst, '0')
-		}
-	} else {
-		dst = append(dst, '0')
-	}
-
-	// fraction
-	if prec > 0 {
-		dst = append(dst, '.')
-		for i := 0; i < prec; i++ {
-			ch := byte('0')
-			if j := d.dp + i; 0 <= j && j < d.nd {
-				ch = d.d[j]
-			}
-			dst = append(dst, ch)
-		}
-	}
-
-	return dst
-}
-
-// %b: -ddddddddp±ddd
-func fmtB(dst []byte, neg bool, mant uint64, exp int, flt *floatInfo) []byte {
-	// sign
-	if neg {
-		dst = append(dst, '-')
-	}
-
-	// mantissa
-	dst, _ = formatBits(dst, mant, 10, false, true)
-
-	// p
-	dst = append(dst, 'p')
-
-	// ±exponent
-	exp -= int(flt.mantbits)
-	if exp >= 0 {
-		dst = append(dst, '+')
-	}
-	dst, _ = formatBits(dst, uint64(exp), 10, exp < 0, true)
-
-	return dst
-}
-
-func min(a, b int) int {
-	if a < b {
-		return a
-	}
-	return b
-}
-
-func max(a, b int) int {
-	if a > b {
-		return a
-	}
-	return b
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/ftoa_test.go b/third_party/gofrontend/libgo/go/strconv/ftoa_test.go
deleted file mode 100644
index 1b4dcd9..0000000
--- a/third_party/gofrontend/libgo/go/strconv/ftoa_test.go
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv_test
-
-import (
-	"math"
-	"math/rand"
-	. "strconv"
-	"testing"
-)
-
-type ftoaTest struct {
-	f    float64
-	fmt  byte
-	prec int
-	s    string
-}
-
-func fdiv(a, b float64) float64 { return a / b } // keep compiler in the dark
-
-const (
-	below1e23 = 99999999999999974834176
-	above1e23 = 100000000000000008388608
-)
-
-var ftoatests = []ftoaTest{
-	{1, 'e', 5, "1.00000e+00"},
-	{1, 'f', 5, "1.00000"},
-	{1, 'g', 5, "1"},
-	{1, 'g', -1, "1"},
-	{20, 'g', -1, "20"},
-	{1234567.8, 'g', -1, "1.2345678e+06"},
-	{200000, 'g', -1, "200000"},
-	{2000000, 'g', -1, "2e+06"},
-
-	// g conversion and zero suppression
-	{400, 'g', 2, "4e+02"},
-	{40, 'g', 2, "40"},
-	{4, 'g', 2, "4"},
-	{.4, 'g', 2, "0.4"},
-	{.04, 'g', 2, "0.04"},
-	{.004, 'g', 2, "0.004"},
-	{.0004, 'g', 2, "0.0004"},
-	{.00004, 'g', 2, "4e-05"},
-	{.000004, 'g', 2, "4e-06"},
-
-	{0, 'e', 5, "0.00000e+00"},
-	{0, 'f', 5, "0.00000"},
-	{0, 'g', 5, "0"},
-	{0, 'g', -1, "0"},
-
-	{-1, 'e', 5, "-1.00000e+00"},
-	{-1, 'f', 5, "-1.00000"},
-	{-1, 'g', 5, "-1"},
-	{-1, 'g', -1, "-1"},
-
-	{12, 'e', 5, "1.20000e+01"},
-	{12, 'f', 5, "12.00000"},
-	{12, 'g', 5, "12"},
-	{12, 'g', -1, "12"},
-
-	{123456700, 'e', 5, "1.23457e+08"},
-	{123456700, 'f', 5, "123456700.00000"},
-	{123456700, 'g', 5, "1.2346e+08"},
-	{123456700, 'g', -1, "1.234567e+08"},
-
-	{1.2345e6, 'e', 5, "1.23450e+06"},
-	{1.2345e6, 'f', 5, "1234500.00000"},
-	{1.2345e6, 'g', 5, "1.2345e+06"},
-
-	{1e23, 'e', 17, "9.99999999999999916e+22"},
-	{1e23, 'f', 17, "99999999999999991611392.00000000000000000"},
-	{1e23, 'g', 17, "9.9999999999999992e+22"},
-
-	{1e23, 'e', -1, "1e+23"},
-	{1e23, 'f', -1, "100000000000000000000000"},
-	{1e23, 'g', -1, "1e+23"},
-
-	{below1e23, 'e', 17, "9.99999999999999748e+22"},
-	{below1e23, 'f', 17, "99999999999999974834176.00000000000000000"},
-	{below1e23, 'g', 17, "9.9999999999999975e+22"},
-
-	{below1e23, 'e', -1, "9.999999999999997e+22"},
-	{below1e23, 'f', -1, "99999999999999970000000"},
-	{below1e23, 'g', -1, "9.999999999999997e+22"},
-
-	{above1e23, 'e', 17, "1.00000000000000008e+23"},
-	{above1e23, 'f', 17, "100000000000000008388608.00000000000000000"},
-	{above1e23, 'g', 17, "1.0000000000000001e+23"},
-
-	{above1e23, 'e', -1, "1.0000000000000001e+23"},
-	{above1e23, 'f', -1, "100000000000000010000000"},
-	{above1e23, 'g', -1, "1.0000000000000001e+23"},
-
-	{fdiv(5e-304, 1e20), 'g', -1, "5e-324"},
-	{fdiv(-5e-304, 1e20), 'g', -1, "-5e-324"},
-
-	{32, 'g', -1, "32"},
-	{32, 'g', 0, "3e+01"},
-
-	{100, 'x', -1, "%x"},
-
-	{math.NaN(), 'g', -1, "NaN"},
-	{-math.NaN(), 'g', -1, "NaN"},
-	{math.Inf(0), 'g', -1, "+Inf"},
-	{math.Inf(-1), 'g', -1, "-Inf"},
-	{-math.Inf(0), 'g', -1, "-Inf"},
-
-	{-1, 'b', -1, "-4503599627370496p-52"},
-
-	// fixed bugs
-	{0.9, 'f', 1, "0.9"},
-	{0.09, 'f', 1, "0.1"},
-	{0.0999, 'f', 1, "0.1"},
-	{0.05, 'f', 1, "0.1"},
-	{0.05, 'f', 0, "0"},
-	{0.5, 'f', 1, "0.5"},
-	{0.5, 'f', 0, "0"},
-	{1.5, 'f', 0, "2"},
-
-	// http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
-	{2.2250738585072012e-308, 'g', -1, "2.2250738585072014e-308"},
-	// http://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/
-	{2.2250738585072011e-308, 'g', -1, "2.225073858507201e-308"},
-
-	// Issue 2625.
-	{383260575764816448, 'f', 0, "383260575764816448"},
-	{383260575764816448, 'g', -1, "3.8326057576481645e+17"},
-}
-
-func TestFtoa(t *testing.T) {
-	for i := 0; i < len(ftoatests); i++ {
-		test := &ftoatests[i]
-		s := FormatFloat(test.f, test.fmt, test.prec, 64)
-		if s != test.s {
-			t.Error("testN=64", test.f, string(test.fmt), test.prec, "want", test.s, "got", s)
-		}
-		x := AppendFloat([]byte("abc"), test.f, test.fmt, test.prec, 64)
-		if string(x) != "abc"+test.s {
-			t.Error("AppendFloat testN=64", test.f, string(test.fmt), test.prec, "want", "abc"+test.s, "got", string(x))
-		}
-		if float64(float32(test.f)) == test.f && test.fmt != 'b' {
-			s := FormatFloat(test.f, test.fmt, test.prec, 32)
-			if s != test.s {
-				t.Error("testN=32", test.f, string(test.fmt), test.prec, "want", test.s, "got", s)
-			}
-			x := AppendFloat([]byte("abc"), test.f, test.fmt, test.prec, 32)
-			if string(x) != "abc"+test.s {
-				t.Error("AppendFloat testN=32", test.f, string(test.fmt), test.prec, "want", "abc"+test.s, "got", string(x))
-			}
-		}
-	}
-}
-
-func TestFtoaRandom(t *testing.T) {
-	N := int(1e4)
-	if testing.Short() {
-		N = 100
-	}
-	t.Logf("testing %d random numbers with fast and slow FormatFloat", N)
-	for i := 0; i < N; i++ {
-		bits := uint64(rand.Uint32())<<32 | uint64(rand.Uint32())
-		x := math.Float64frombits(bits)
-
-		shortFast := FormatFloat(x, 'g', -1, 64)
-		SetOptimize(false)
-		shortSlow := FormatFloat(x, 'g', -1, 64)
-		SetOptimize(true)
-		if shortSlow != shortFast {
-			t.Errorf("%b printed as %s, want %s", x, shortFast, shortSlow)
-		}
-
-		prec := rand.Intn(12) + 5
-		shortFast = FormatFloat(x, 'e', prec, 64)
-		SetOptimize(false)
-		shortSlow = FormatFloat(x, 'e', prec, 64)
-		SetOptimize(true)
-		if shortSlow != shortFast {
-			t.Errorf("%b printed as %s, want %s", x, shortFast, shortSlow)
-		}
-	}
-}
-
-func BenchmarkFormatFloatDecimal(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		FormatFloat(33909, 'g', -1, 64)
-	}
-}
-
-func BenchmarkFormatFloat(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		FormatFloat(339.7784, 'g', -1, 64)
-	}
-}
-
-func BenchmarkFormatFloatExp(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		FormatFloat(-5.09e75, 'g', -1, 64)
-	}
-}
-
-func BenchmarkFormatFloatNegExp(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		FormatFloat(-5.11e-95, 'g', -1, 64)
-	}
-}
-
-func BenchmarkFormatFloatBig(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		FormatFloat(123456789123456789123456789, 'g', -1, 64)
-	}
-}
-
-func benchmarkAppendFloat(b *testing.B, f float64, fmt byte, prec, bitSize int) {
-	dst := make([]byte, 30)
-	for i := 0; i < b.N; i++ {
-		AppendFloat(dst[:0], f, fmt, prec, bitSize)
-	}
-}
-
-func BenchmarkAppendFloatDecimal(b *testing.B) { benchmarkAppendFloat(b, 33909, 'g', -1, 64) }
-func BenchmarkAppendFloat(b *testing.B)        { benchmarkAppendFloat(b, 339.7784, 'g', -1, 64) }
-func BenchmarkAppendFloatExp(b *testing.B)     { benchmarkAppendFloat(b, -5.09e75, 'g', -1, 64) }
-func BenchmarkAppendFloatNegExp(b *testing.B)  { benchmarkAppendFloat(b, -5.11e-95, 'g', -1, 64) }
-func BenchmarkAppendFloatBig(b *testing.B) {
-	benchmarkAppendFloat(b, 123456789123456789123456789, 'g', -1, 64)
-}
-func BenchmarkAppendFloatBinaryExp(b *testing.B) { benchmarkAppendFloat(b, -1, 'b', -1, 64) }
-
-func BenchmarkAppendFloat32Integer(b *testing.B)       { benchmarkAppendFloat(b, 33909, 'g', -1, 32) }
-func BenchmarkAppendFloat32ExactFraction(b *testing.B) { benchmarkAppendFloat(b, 3.375, 'g', -1, 32) }
-func BenchmarkAppendFloat32Point(b *testing.B)         { benchmarkAppendFloat(b, 339.7784, 'g', -1, 32) }
-func BenchmarkAppendFloat32Exp(b *testing.B)           { benchmarkAppendFloat(b, -5.09e25, 'g', -1, 32) }
-func BenchmarkAppendFloat32NegExp(b *testing.B)        { benchmarkAppendFloat(b, -5.11e-25, 'g', -1, 32) }
-
-func BenchmarkAppendFloat64Fixed1(b *testing.B) { benchmarkAppendFloat(b, 123456, 'e', 3, 64) }
-func BenchmarkAppendFloat64Fixed2(b *testing.B) { benchmarkAppendFloat(b, 123.456, 'e', 3, 64) }
-func BenchmarkAppendFloat64Fixed3(b *testing.B) { benchmarkAppendFloat(b, 1.23456e+78, 'e', 3, 64) }
-func BenchmarkAppendFloat64Fixed4(b *testing.B) { benchmarkAppendFloat(b, 1.23456e-78, 'e', 3, 64) }
diff --git a/third_party/gofrontend/libgo/go/strconv/internal_test.go b/third_party/gofrontend/libgo/go/strconv/internal_test.go
deleted file mode 100644
index d0fa80e..0000000
--- a/third_party/gofrontend/libgo/go/strconv/internal_test.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// export access to strconv internals for tests
-
-package strconv
-
-func NewDecimal(i uint64) *decimal {
-	d := new(decimal)
-	d.Assign(i)
-	return d
-}
-
-func SetOptimize(b bool) bool {
-	old := optimize
-	optimize = b
-	return old
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/isprint.go b/third_party/gofrontend/libgo/go/strconv/isprint.go
deleted file mode 100644
index 0cf363c..0000000
--- a/third_party/gofrontend/libgo/go/strconv/isprint.go
+++ /dev/null
@@ -1,637 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// DO NOT EDIT.  GENERATED BY
-//     go run makeisprint.go -output isprint.go
-
-package strconv
-
-// (470+136+73)*2 + (342)*4 = 2726 bytes
-
-var isPrint16 = []uint16{
-	0x0020, 0x007e,
-	0x00a1, 0x0377,
-	0x037a, 0x037f,
-	0x0384, 0x0556,
-	0x0559, 0x058a,
-	0x058d, 0x05c7,
-	0x05d0, 0x05ea,
-	0x05f0, 0x05f4,
-	0x0606, 0x061b,
-	0x061e, 0x070d,
-	0x0710, 0x074a,
-	0x074d, 0x07b1,
-	0x07c0, 0x07fa,
-	0x0800, 0x082d,
-	0x0830, 0x085b,
-	0x085e, 0x085e,
-	0x08a0, 0x08b4,
-	0x08e3, 0x098c,
-	0x098f, 0x0990,
-	0x0993, 0x09b2,
-	0x09b6, 0x09b9,
-	0x09bc, 0x09c4,
-	0x09c7, 0x09c8,
-	0x09cb, 0x09ce,
-	0x09d7, 0x09d7,
-	0x09dc, 0x09e3,
-	0x09e6, 0x09fb,
-	0x0a01, 0x0a0a,
-	0x0a0f, 0x0a10,
-	0x0a13, 0x0a39,
-	0x0a3c, 0x0a42,
-	0x0a47, 0x0a48,
-	0x0a4b, 0x0a4d,
-	0x0a51, 0x0a51,
-	0x0a59, 0x0a5e,
-	0x0a66, 0x0a75,
-	0x0a81, 0x0ab9,
-	0x0abc, 0x0acd,
-	0x0ad0, 0x0ad0,
-	0x0ae0, 0x0ae3,
-	0x0ae6, 0x0af1,
-	0x0af9, 0x0af9,
-	0x0b01, 0x0b0c,
-	0x0b0f, 0x0b10,
-	0x0b13, 0x0b39,
-	0x0b3c, 0x0b44,
-	0x0b47, 0x0b48,
-	0x0b4b, 0x0b4d,
-	0x0b56, 0x0b57,
-	0x0b5c, 0x0b63,
-	0x0b66, 0x0b77,
-	0x0b82, 0x0b8a,
-	0x0b8e, 0x0b95,
-	0x0b99, 0x0b9f,
-	0x0ba3, 0x0ba4,
-	0x0ba8, 0x0baa,
-	0x0bae, 0x0bb9,
-	0x0bbe, 0x0bc2,
-	0x0bc6, 0x0bcd,
-	0x0bd0, 0x0bd0,
-	0x0bd7, 0x0bd7,
-	0x0be6, 0x0bfa,
-	0x0c00, 0x0c39,
-	0x0c3d, 0x0c4d,
-	0x0c55, 0x0c5a,
-	0x0c60, 0x0c63,
-	0x0c66, 0x0c6f,
-	0x0c78, 0x0cb9,
-	0x0cbc, 0x0ccd,
-	0x0cd5, 0x0cd6,
-	0x0cde, 0x0ce3,
-	0x0ce6, 0x0cf2,
-	0x0d01, 0x0d3a,
-	0x0d3d, 0x0d4e,
-	0x0d57, 0x0d57,
-	0x0d5f, 0x0d63,
-	0x0d66, 0x0d75,
-	0x0d79, 0x0d7f,
-	0x0d82, 0x0d96,
-	0x0d9a, 0x0dbd,
-	0x0dc0, 0x0dc6,
-	0x0dca, 0x0dca,
-	0x0dcf, 0x0ddf,
-	0x0de6, 0x0def,
-	0x0df2, 0x0df4,
-	0x0e01, 0x0e3a,
-	0x0e3f, 0x0e5b,
-	0x0e81, 0x0e84,
-	0x0e87, 0x0e8a,
-	0x0e8d, 0x0e8d,
-	0x0e94, 0x0ea7,
-	0x0eaa, 0x0ebd,
-	0x0ec0, 0x0ecd,
-	0x0ed0, 0x0ed9,
-	0x0edc, 0x0edf,
-	0x0f00, 0x0f6c,
-	0x0f71, 0x0fda,
-	0x1000, 0x10c7,
-	0x10cd, 0x10cd,
-	0x10d0, 0x124d,
-	0x1250, 0x125d,
-	0x1260, 0x128d,
-	0x1290, 0x12b5,
-	0x12b8, 0x12c5,
-	0x12c8, 0x1315,
-	0x1318, 0x135a,
-	0x135d, 0x137c,
-	0x1380, 0x1399,
-	0x13a0, 0x13f5,
-	0x13f8, 0x13fd,
-	0x1400, 0x169c,
-	0x16a0, 0x16f8,
-	0x1700, 0x1714,
-	0x1720, 0x1736,
-	0x1740, 0x1753,
-	0x1760, 0x1773,
-	0x1780, 0x17dd,
-	0x17e0, 0x17e9,
-	0x17f0, 0x17f9,
-	0x1800, 0x180d,
-	0x1810, 0x1819,
-	0x1820, 0x1877,
-	0x1880, 0x18aa,
-	0x18b0, 0x18f5,
-	0x1900, 0x192b,
-	0x1930, 0x193b,
-	0x1940, 0x1940,
-	0x1944, 0x196d,
-	0x1970, 0x1974,
-	0x1980, 0x19ab,
-	0x19b0, 0x19c9,
-	0x19d0, 0x19da,
-	0x19de, 0x1a1b,
-	0x1a1e, 0x1a7c,
-	0x1a7f, 0x1a89,
-	0x1a90, 0x1a99,
-	0x1aa0, 0x1aad,
-	0x1ab0, 0x1abe,
-	0x1b00, 0x1b4b,
-	0x1b50, 0x1b7c,
-	0x1b80, 0x1bf3,
-	0x1bfc, 0x1c37,
-	0x1c3b, 0x1c49,
-	0x1c4d, 0x1c7f,
-	0x1cc0, 0x1cc7,
-	0x1cd0, 0x1cf9,
-	0x1d00, 0x1df5,
-	0x1dfc, 0x1f15,
-	0x1f18, 0x1f1d,
-	0x1f20, 0x1f45,
-	0x1f48, 0x1f4d,
-	0x1f50, 0x1f7d,
-	0x1f80, 0x1fd3,
-	0x1fd6, 0x1fef,
-	0x1ff2, 0x1ffe,
-	0x2010, 0x2027,
-	0x2030, 0x205e,
-	0x2070, 0x2071,
-	0x2074, 0x209c,
-	0x20a0, 0x20be,
-	0x20d0, 0x20f0,
-	0x2100, 0x218b,
-	0x2190, 0x23fa,
-	0x2400, 0x2426,
-	0x2440, 0x244a,
-	0x2460, 0x2b73,
-	0x2b76, 0x2b95,
-	0x2b98, 0x2bb9,
-	0x2bbd, 0x2bd1,
-	0x2bec, 0x2bef,
-	0x2c00, 0x2cf3,
-	0x2cf9, 0x2d27,
-	0x2d2d, 0x2d2d,
-	0x2d30, 0x2d67,
-	0x2d6f, 0x2d70,
-	0x2d7f, 0x2d96,
-	0x2da0, 0x2e42,
-	0x2e80, 0x2ef3,
-	0x2f00, 0x2fd5,
-	0x2ff0, 0x2ffb,
-	0x3001, 0x3096,
-	0x3099, 0x30ff,
-	0x3105, 0x312d,
-	0x3131, 0x31ba,
-	0x31c0, 0x31e3,
-	0x31f0, 0x4db5,
-	0x4dc0, 0x9fd5,
-	0xa000, 0xa48c,
-	0xa490, 0xa4c6,
-	0xa4d0, 0xa62b,
-	0xa640, 0xa6f7,
-	0xa700, 0xa7ad,
-	0xa7b0, 0xa7b7,
-	0xa7f7, 0xa82b,
-	0xa830, 0xa839,
-	0xa840, 0xa877,
-	0xa880, 0xa8c4,
-	0xa8ce, 0xa8d9,
-	0xa8e0, 0xa8fd,
-	0xa900, 0xa953,
-	0xa95f, 0xa97c,
-	0xa980, 0xa9d9,
-	0xa9de, 0xaa36,
-	0xaa40, 0xaa4d,
-	0xaa50, 0xaa59,
-	0xaa5c, 0xaac2,
-	0xaadb, 0xaaf6,
-	0xab01, 0xab06,
-	0xab09, 0xab0e,
-	0xab11, 0xab16,
-	0xab20, 0xab65,
-	0xab70, 0xabed,
-	0xabf0, 0xabf9,
-	0xac00, 0xd7a3,
-	0xd7b0, 0xd7c6,
-	0xd7cb, 0xd7fb,
-	0xf900, 0xfa6d,
-	0xfa70, 0xfad9,
-	0xfb00, 0xfb06,
-	0xfb13, 0xfb17,
-	0xfb1d, 0xfbc1,
-	0xfbd3, 0xfd3f,
-	0xfd50, 0xfd8f,
-	0xfd92, 0xfdc7,
-	0xfdf0, 0xfdfd,
-	0xfe00, 0xfe19,
-	0xfe20, 0xfe6b,
-	0xfe70, 0xfefc,
-	0xff01, 0xffbe,
-	0xffc2, 0xffc7,
-	0xffca, 0xffcf,
-	0xffd2, 0xffd7,
-	0xffda, 0xffdc,
-	0xffe0, 0xffee,
-	0xfffc, 0xfffd,
-}
-
-var isNotPrint16 = []uint16{
-	0x00ad,
-	0x038b,
-	0x038d,
-	0x03a2,
-	0x0530,
-	0x0560,
-	0x0588,
-	0x0590,
-	0x06dd,
-	0x083f,
-	0x0984,
-	0x09a9,
-	0x09b1,
-	0x09de,
-	0x0a04,
-	0x0a29,
-	0x0a31,
-	0x0a34,
-	0x0a37,
-	0x0a3d,
-	0x0a5d,
-	0x0a84,
-	0x0a8e,
-	0x0a92,
-	0x0aa9,
-	0x0ab1,
-	0x0ab4,
-	0x0ac6,
-	0x0aca,
-	0x0b04,
-	0x0b29,
-	0x0b31,
-	0x0b34,
-	0x0b5e,
-	0x0b84,
-	0x0b91,
-	0x0b9b,
-	0x0b9d,
-	0x0bc9,
-	0x0c04,
-	0x0c0d,
-	0x0c11,
-	0x0c29,
-	0x0c45,
-	0x0c49,
-	0x0c57,
-	0x0c80,
-	0x0c84,
-	0x0c8d,
-	0x0c91,
-	0x0ca9,
-	0x0cb4,
-	0x0cc5,
-	0x0cc9,
-	0x0cdf,
-	0x0cf0,
-	0x0d04,
-	0x0d0d,
-	0x0d11,
-	0x0d45,
-	0x0d49,
-	0x0d84,
-	0x0db2,
-	0x0dbc,
-	0x0dd5,
-	0x0dd7,
-	0x0e83,
-	0x0e89,
-	0x0e98,
-	0x0ea0,
-	0x0ea4,
-	0x0ea6,
-	0x0eac,
-	0x0eba,
-	0x0ec5,
-	0x0ec7,
-	0x0f48,
-	0x0f98,
-	0x0fbd,
-	0x0fcd,
-	0x10c6,
-	0x1249,
-	0x1257,
-	0x1259,
-	0x1289,
-	0x12b1,
-	0x12bf,
-	0x12c1,
-	0x12d7,
-	0x1311,
-	0x1680,
-	0x170d,
-	0x176d,
-	0x1771,
-	0x191f,
-	0x1a5f,
-	0x1cf7,
-	0x1f58,
-	0x1f5a,
-	0x1f5c,
-	0x1f5e,
-	0x1fb5,
-	0x1fc5,
-	0x1fdc,
-	0x1ff5,
-	0x208f,
-	0x2bc9,
-	0x2c2f,
-	0x2c5f,
-	0x2d26,
-	0x2da7,
-	0x2daf,
-	0x2db7,
-	0x2dbf,
-	0x2dc7,
-	0x2dcf,
-	0x2dd7,
-	0x2ddf,
-	0x2e9a,
-	0x3040,
-	0x318f,
-	0x321f,
-	0x32ff,
-	0xa9ce,
-	0xa9ff,
-	0xab27,
-	0xab2f,
-	0xfb37,
-	0xfb3d,
-	0xfb3f,
-	0xfb42,
-	0xfb45,
-	0xfe53,
-	0xfe67,
-	0xfe75,
-	0xffe7,
-}
-
-var isPrint32 = []uint32{
-	0x010000, 0x01004d,
-	0x010050, 0x01005d,
-	0x010080, 0x0100fa,
-	0x010100, 0x010102,
-	0x010107, 0x010133,
-	0x010137, 0x01018c,
-	0x010190, 0x01019b,
-	0x0101a0, 0x0101a0,
-	0x0101d0, 0x0101fd,
-	0x010280, 0x01029c,
-	0x0102a0, 0x0102d0,
-	0x0102e0, 0x0102fb,
-	0x010300, 0x010323,
-	0x010330, 0x01034a,
-	0x010350, 0x01037a,
-	0x010380, 0x0103c3,
-	0x0103c8, 0x0103d5,
-	0x010400, 0x01049d,
-	0x0104a0, 0x0104a9,
-	0x010500, 0x010527,
-	0x010530, 0x010563,
-	0x01056f, 0x01056f,
-	0x010600, 0x010736,
-	0x010740, 0x010755,
-	0x010760, 0x010767,
-	0x010800, 0x010805,
-	0x010808, 0x010838,
-	0x01083c, 0x01083c,
-	0x01083f, 0x01089e,
-	0x0108a7, 0x0108af,
-	0x0108e0, 0x0108f5,
-	0x0108fb, 0x01091b,
-	0x01091f, 0x010939,
-	0x01093f, 0x01093f,
-	0x010980, 0x0109b7,
-	0x0109bc, 0x0109cf,
-	0x0109d2, 0x010a06,
-	0x010a0c, 0x010a33,
-	0x010a38, 0x010a3a,
-	0x010a3f, 0x010a47,
-	0x010a50, 0x010a58,
-	0x010a60, 0x010a9f,
-	0x010ac0, 0x010ae6,
-	0x010aeb, 0x010af6,
-	0x010b00, 0x010b35,
-	0x010b39, 0x010b55,
-	0x010b58, 0x010b72,
-	0x010b78, 0x010b91,
-	0x010b99, 0x010b9c,
-	0x010ba9, 0x010baf,
-	0x010c00, 0x010c48,
-	0x010c80, 0x010cb2,
-	0x010cc0, 0x010cf2,
-	0x010cfa, 0x010cff,
-	0x010e60, 0x010e7e,
-	0x011000, 0x01104d,
-	0x011052, 0x01106f,
-	0x01107f, 0x0110c1,
-	0x0110d0, 0x0110e8,
-	0x0110f0, 0x0110f9,
-	0x011100, 0x011143,
-	0x011150, 0x011176,
-	0x011180, 0x0111cd,
-	0x0111d0, 0x0111f4,
-	0x011200, 0x01123d,
-	0x011280, 0x0112a9,
-	0x0112b0, 0x0112ea,
-	0x0112f0, 0x0112f9,
-	0x011300, 0x01130c,
-	0x01130f, 0x011310,
-	0x011313, 0x011339,
-	0x01133c, 0x011344,
-	0x011347, 0x011348,
-	0x01134b, 0x01134d,
-	0x011350, 0x011350,
-	0x011357, 0x011357,
-	0x01135d, 0x011363,
-	0x011366, 0x01136c,
-	0x011370, 0x011374,
-	0x011480, 0x0114c7,
-	0x0114d0, 0x0114d9,
-	0x011580, 0x0115b5,
-	0x0115b8, 0x0115dd,
-	0x011600, 0x011644,
-	0x011650, 0x011659,
-	0x011680, 0x0116b7,
-	0x0116c0, 0x0116c9,
-	0x011700, 0x011719,
-	0x01171d, 0x01172b,
-	0x011730, 0x01173f,
-	0x0118a0, 0x0118f2,
-	0x0118ff, 0x0118ff,
-	0x011ac0, 0x011af8,
-	0x012000, 0x012399,
-	0x012400, 0x012474,
-	0x012480, 0x012543,
-	0x013000, 0x01342e,
-	0x014400, 0x014646,
-	0x016800, 0x016a38,
-	0x016a40, 0x016a69,
-	0x016a6e, 0x016a6f,
-	0x016ad0, 0x016aed,
-	0x016af0, 0x016af5,
-	0x016b00, 0x016b45,
-	0x016b50, 0x016b77,
-	0x016b7d, 0x016b8f,
-	0x016f00, 0x016f44,
-	0x016f50, 0x016f7e,
-	0x016f8f, 0x016f9f,
-	0x01b000, 0x01b001,
-	0x01bc00, 0x01bc6a,
-	0x01bc70, 0x01bc7c,
-	0x01bc80, 0x01bc88,
-	0x01bc90, 0x01bc99,
-	0x01bc9c, 0x01bc9f,
-	0x01d000, 0x01d0f5,
-	0x01d100, 0x01d126,
-	0x01d129, 0x01d172,
-	0x01d17b, 0x01d1e8,
-	0x01d200, 0x01d245,
-	0x01d300, 0x01d356,
-	0x01d360, 0x01d371,
-	0x01d400, 0x01d49f,
-	0x01d4a2, 0x01d4a2,
-	0x01d4a5, 0x01d4a6,
-	0x01d4a9, 0x01d50a,
-	0x01d50d, 0x01d546,
-	0x01d54a, 0x01d6a5,
-	0x01d6a8, 0x01d7cb,
-	0x01d7ce, 0x01da8b,
-	0x01da9b, 0x01daaf,
-	0x01e800, 0x01e8c4,
-	0x01e8c7, 0x01e8d6,
-	0x01ee00, 0x01ee24,
-	0x01ee27, 0x01ee3b,
-	0x01ee42, 0x01ee42,
-	0x01ee47, 0x01ee54,
-	0x01ee57, 0x01ee64,
-	0x01ee67, 0x01ee9b,
-	0x01eea1, 0x01eebb,
-	0x01eef0, 0x01eef1,
-	0x01f000, 0x01f02b,
-	0x01f030, 0x01f093,
-	0x01f0a0, 0x01f0ae,
-	0x01f0b1, 0x01f0f5,
-	0x01f100, 0x01f10c,
-	0x01f110, 0x01f16b,
-	0x01f170, 0x01f19a,
-	0x01f1e6, 0x01f202,
-	0x01f210, 0x01f23a,
-	0x01f240, 0x01f248,
-	0x01f250, 0x01f251,
-	0x01f300, 0x01f6d0,
-	0x01f6e0, 0x01f6ec,
-	0x01f6f0, 0x01f6f3,
-	0x01f700, 0x01f773,
-	0x01f780, 0x01f7d4,
-	0x01f800, 0x01f80b,
-	0x01f810, 0x01f847,
-	0x01f850, 0x01f859,
-	0x01f860, 0x01f887,
-	0x01f890, 0x01f8ad,
-	0x01f910, 0x01f918,
-	0x01f980, 0x01f984,
-	0x01f9c0, 0x01f9c0,
-	0x020000, 0x02a6d6,
-	0x02a700, 0x02b734,
-	0x02b740, 0x02b81d,
-	0x02b820, 0x02cea1,
-	0x02f800, 0x02fa1d,
-	0x0e0100, 0x0e01ef,
-}
-
-var isNotPrint32 = []uint16{ // add 0x10000 to each entry
-	0x000c,
-	0x0027,
-	0x003b,
-	0x003e,
-	0x039e,
-	0x0809,
-	0x0836,
-	0x0856,
-	0x08f3,
-	0x0a04,
-	0x0a14,
-	0x0a18,
-	0x10bd,
-	0x1135,
-	0x11e0,
-	0x1212,
-	0x1287,
-	0x1289,
-	0x128e,
-	0x129e,
-	0x1304,
-	0x1329,
-	0x1331,
-	0x1334,
-	0x246f,
-	0x6a5f,
-	0x6b5a,
-	0x6b62,
-	0xd455,
-	0xd49d,
-	0xd4ad,
-	0xd4ba,
-	0xd4bc,
-	0xd4c4,
-	0xd506,
-	0xd515,
-	0xd51d,
-	0xd53a,
-	0xd53f,
-	0xd545,
-	0xd551,
-	0xdaa0,
-	0xee04,
-	0xee20,
-	0xee23,
-	0xee28,
-	0xee33,
-	0xee38,
-	0xee3a,
-	0xee48,
-	0xee4a,
-	0xee4c,
-	0xee50,
-	0xee53,
-	0xee58,
-	0xee5a,
-	0xee5c,
-	0xee5e,
-	0xee60,
-	0xee63,
-	0xee6b,
-	0xee73,
-	0xee78,
-	0xee7d,
-	0xee7f,
-	0xee8a,
-	0xeea4,
-	0xeeaa,
-	0xf0c0,
-	0xf0d0,
-	0xf12f,
-	0xf57a,
-	0xf5a4,
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/itoa.go b/third_party/gofrontend/libgo/go/strconv/itoa.go
deleted file mode 100644
index e6f6303..0000000
--- a/third_party/gofrontend/libgo/go/strconv/itoa.go
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv
-
-// FormatUint returns the string representation of i in the given base,
-// for 2 <= base <= 36. The result uses the lower-case letters 'a' to 'z'
-// for digit values >= 10.
-func FormatUint(i uint64, base int) string {
-	_, s := formatBits(nil, i, base, false, false)
-	return s
-}
-
-// FormatInt returns the string representation of i in the given base,
-// for 2 <= base <= 36. The result uses the lower-case letters 'a' to 'z'
-// for digit values >= 10.
-func FormatInt(i int64, base int) string {
-	_, s := formatBits(nil, uint64(i), base, i < 0, false)
-	return s
-}
-
-// Itoa is shorthand for FormatInt(i, 10).
-func Itoa(i int) string {
-	return FormatInt(int64(i), 10)
-}
-
-// AppendInt appends the string form of the integer i,
-// as generated by FormatInt, to dst and returns the extended buffer.
-func AppendInt(dst []byte, i int64, base int) []byte {
-	dst, _ = formatBits(dst, uint64(i), base, i < 0, true)
-	return dst
-}
-
-// AppendUint appends the string form of the unsigned integer i,
-// as generated by FormatUint, to dst and returns the extended buffer.
-func AppendUint(dst []byte, i uint64, base int) []byte {
-	dst, _ = formatBits(dst, i, base, false, true)
-	return dst
-}
-
-const (
-	digits = "0123456789abcdefghijklmnopqrstuvwxyz"
-)
-
-var shifts = [len(digits) + 1]uint{
-	1 << 1: 1,
-	1 << 2: 2,
-	1 << 3: 3,
-	1 << 4: 4,
-	1 << 5: 5,
-}
-
-// formatBits computes the string representation of u in the given base.
-// If neg is set, u is treated as negative int64 value. If append_ is
-// set, the string is appended to dst and the resulting byte slice is
-// returned as the first result value; otherwise the string is returned
-// as the second result value.
-//
-func formatBits(dst []byte, u uint64, base int, neg, append_ bool) (d []byte, s string) {
-	if base < 2 || base > len(digits) {
-		panic("strconv: illegal AppendInt/FormatInt base")
-	}
-	// 2 <= base && base <= len(digits)
-
-	var a [64 + 1]byte // +1 for sign of 64bit value in base 2
-	i := len(a)
-
-	if neg {
-		u = -u
-	}
-
-	// convert bits
-	if base == 10 {
-		// common case: use constants for / because
-		// the compiler can optimize it into a multiply+shift
-
-		if ^uintptr(0)>>32 == 0 {
-			for u > uint64(^uintptr(0)) {
-				q := u / 1e9
-				us := uintptr(u - q*1e9) // us % 1e9 fits into a uintptr
-				for j := 9; j > 0; j-- {
-					i--
-					qs := us / 10
-					a[i] = byte(us - qs*10 + '0')
-					us = qs
-				}
-				u = q
-			}
-		}
-
-		// u guaranteed to fit into a uintptr
-		us := uintptr(u)
-		for us >= 10 {
-			i--
-			q := us / 10
-			a[i] = byte(us - q*10 + '0')
-			us = q
-		}
-		// u < 10
-		i--
-		a[i] = byte(us + '0')
-
-	} else if s := shifts[base]; s > 0 {
-		// base is power of 2: use shifts and masks instead of / and %
-		b := uint64(base)
-		m := uintptr(b) - 1 // == 1<<s - 1
-		for u >= b {
-			i--
-			a[i] = digits[uintptr(u)&m]
-			u >>= s
-		}
-		// u < base
-		i--
-		a[i] = digits[uintptr(u)]
-
-	} else {
-		// general case
-		b := uint64(base)
-		for u >= b {
-			i--
-			q := u / b
-			a[i] = digits[uintptr(u-q*b)]
-			u = q
-		}
-		// u < base
-		i--
-		a[i] = digits[uintptr(u)]
-	}
-
-	// add sign, if any
-	if neg {
-		i--
-		a[i] = '-'
-	}
-
-	if append_ {
-		d = append(dst, a[i:]...)
-		return
-	}
-	s = string(a[i:])
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/itoa_test.go b/third_party/gofrontend/libgo/go/strconv/itoa_test.go
deleted file mode 100644
index 48dc03e..0000000
--- a/third_party/gofrontend/libgo/go/strconv/itoa_test.go
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv_test
-
-import (
-	. "strconv"
-	"testing"
-)
-
-type itob64Test struct {
-	in   int64
-	base int
-	out  string
-}
-
-var itob64tests = []itob64Test{
-	{0, 10, "0"},
-	{1, 10, "1"},
-	{-1, 10, "-1"},
-	{12345678, 10, "12345678"},
-	{-987654321, 10, "-987654321"},
-	{1<<31 - 1, 10, "2147483647"},
-	{-1<<31 + 1, 10, "-2147483647"},
-	{1 << 31, 10, "2147483648"},
-	{-1 << 31, 10, "-2147483648"},
-	{1<<31 + 1, 10, "2147483649"},
-	{-1<<31 - 1, 10, "-2147483649"},
-	{1<<32 - 1, 10, "4294967295"},
-	{-1<<32 + 1, 10, "-4294967295"},
-	{1 << 32, 10, "4294967296"},
-	{-1 << 32, 10, "-4294967296"},
-	{1<<32 + 1, 10, "4294967297"},
-	{-1<<32 - 1, 10, "-4294967297"},
-	{1 << 50, 10, "1125899906842624"},
-	{1<<63 - 1, 10, "9223372036854775807"},
-	{-1<<63 + 1, 10, "-9223372036854775807"},
-	{-1 << 63, 10, "-9223372036854775808"},
-
-	{0, 2, "0"},
-	{10, 2, "1010"},
-	{-1, 2, "-1"},
-	{1 << 15, 2, "1000000000000000"},
-
-	{-8, 8, "-10"},
-	{057635436545, 8, "57635436545"},
-	{1 << 24, 8, "100000000"},
-
-	{16, 16, "10"},
-	{-0x123456789abcdef, 16, "-123456789abcdef"},
-	{1<<63 - 1, 16, "7fffffffffffffff"},
-	{1<<63 - 1, 2, "111111111111111111111111111111111111111111111111111111111111111"},
-	{-1 << 63, 2, "-1000000000000000000000000000000000000000000000000000000000000000"},
-
-	{16, 17, "g"},
-	{25, 25, "10"},
-	{(((((17*35+24)*35+21)*35+34)*35+12)*35+24)*35 + 32, 35, "holycow"},
-	{(((((17*36+24)*36+21)*36+34)*36+12)*36+24)*36 + 32, 36, "holycow"},
-}
-
-func TestItoa(t *testing.T) {
-	for _, test := range itob64tests {
-		s := FormatInt(test.in, test.base)
-		if s != test.out {
-			t.Errorf("FormatInt(%v, %v) = %v want %v",
-				test.in, test.base, s, test.out)
-		}
-		x := AppendInt([]byte("abc"), test.in, test.base)
-		if string(x) != "abc"+test.out {
-			t.Errorf("AppendInt(%q, %v, %v) = %q want %v",
-				"abc", test.in, test.base, x, test.out)
-		}
-
-		if test.in >= 0 {
-			s := FormatUint(uint64(test.in), test.base)
-			if s != test.out {
-				t.Errorf("FormatUint(%v, %v) = %v want %v",
-					test.in, test.base, s, test.out)
-			}
-			x := AppendUint(nil, uint64(test.in), test.base)
-			if string(x) != test.out {
-				t.Errorf("AppendUint(%q, %v, %v) = %q want %v",
-					"abc", uint64(test.in), test.base, x, test.out)
-			}
-		}
-
-		if test.base == 10 && int64(int(test.in)) == test.in {
-			s := Itoa(int(test.in))
-			if s != test.out {
-				t.Errorf("Itoa(%v) = %v want %v",
-					test.in, s, test.out)
-			}
-		}
-	}
-}
-
-type uitob64Test struct {
-	in   uint64
-	base int
-	out  string
-}
-
-var uitob64tests = []uitob64Test{
-	{1<<63 - 1, 10, "9223372036854775807"},
-	{1 << 63, 10, "9223372036854775808"},
-	{1<<63 + 1, 10, "9223372036854775809"},
-	{1<<64 - 2, 10, "18446744073709551614"},
-	{1<<64 - 1, 10, "18446744073709551615"},
-	{1<<64 - 1, 2, "1111111111111111111111111111111111111111111111111111111111111111"},
-}
-
-func TestUitoa(t *testing.T) {
-	for _, test := range uitob64tests {
-		s := FormatUint(test.in, test.base)
-		if s != test.out {
-			t.Errorf("FormatUint(%v, %v) = %v want %v",
-				test.in, test.base, s, test.out)
-		}
-		x := AppendUint([]byte("abc"), test.in, test.base)
-		if string(x) != "abc"+test.out {
-			t.Errorf("AppendUint(%q, %v, %v) = %q want %v",
-				"abc", test.in, test.base, x, test.out)
-		}
-
-	}
-}
-
-func BenchmarkFormatInt(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		for _, test := range itob64tests {
-			FormatInt(test.in, test.base)
-		}
-	}
-}
-
-func BenchmarkAppendInt(b *testing.B) {
-	dst := make([]byte, 0, 30)
-	for i := 0; i < b.N; i++ {
-		for _, test := range itob64tests {
-			AppendInt(dst, test.in, test.base)
-		}
-	}
-}
-
-func BenchmarkFormatUint(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		for _, test := range uitob64tests {
-			FormatUint(test.in, test.base)
-		}
-	}
-}
-
-func BenchmarkAppendUint(b *testing.B) {
-	dst := make([]byte, 0, 30)
-	for i := 0; i < b.N; i++ {
-		for _, test := range uitob64tests {
-			AppendUint(dst, test.in, test.base)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/makeisprint.go b/third_party/gofrontend/libgo/go/strconv/makeisprint.go
deleted file mode 100644
index 588d0a0..0000000
--- a/third_party/gofrontend/libgo/go/strconv/makeisprint.go
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-//
-// usage:
-//
-// go run makeisprint.go -output isprint.go
-//
-
-package main
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"go/format"
-	"io/ioutil"
-	"log"
-	"unicode"
-)
-
-var filename = flag.String("output", "isprint.go", "output file name")
-
-var (
-	range16  []uint16
-	except16 []uint16
-	range32  []uint32
-	except32 []uint32
-)
-
-// bsearch16 returns the smallest i such that a[i] >= x.
-// If there is no such i, bsearch16 returns len(a).
-func bsearch16(a []uint16, x uint16) int {
-	i, j := 0, len(a)
-	for i < j {
-		h := i + (j-i)/2
-		if a[h] < x {
-			i = h + 1
-		} else {
-			j = h
-		}
-	}
-	return i
-}
-
-// bsearch32 returns the smallest i such that a[i] >= x.
-// If there is no such i, bsearch32 returns len(a).
-func bsearch32(a []uint32, x uint32) int {
-	i, j := 0, len(a)
-	for i < j {
-		h := i + (j-i)/2
-		if a[h] < x {
-			i = h + 1
-		} else {
-			j = h
-		}
-	}
-	return i
-}
-
-func isPrint(r rune) bool {
-	// Same algorithm, either on uint16 or uint32 value.
-	// First, find first i such that rang[i] >= x.
-	// This is the index of either the start or end of a pair that might span x.
-	// The start is even (rang[i&^1]) and the end is odd (rang[i|1]).
-	// If we find x in a range, make sure x is not in exception list.
-
-	if 0 <= r && r < 1<<16 {
-		rr, rang, except := uint16(r), range16, except16
-		i := bsearch16(rang, rr)
-		if i >= len(rang) || rr < rang[i&^1] || rang[i|1] < rr {
-			return false
-		}
-		j := bsearch16(except, rr)
-		return j >= len(except) || except[j] != rr
-	}
-
-	rr, rang, except := uint32(r), range32, except32
-	i := bsearch32(rang, rr)
-	if i >= len(rang) || rr < rang[i&^1] || rang[i|1] < rr {
-		return false
-	}
-	j := bsearch32(except, rr)
-	return j >= len(except) || except[j] != rr
-}
-
-func scan(min, max rune) (rang, except []uint32) {
-	lo := rune(-1)
-	for i := min; ; i++ {
-		if (i > max || !unicode.IsPrint(i)) && lo >= 0 {
-			// End range, but avoid flip flop.
-			if i+1 <= max && unicode.IsPrint(i+1) {
-				except = append(except, uint32(i))
-				continue
-			}
-			rang = append(rang, uint32(lo), uint32(i-1))
-			lo = -1
-		}
-		if i > max {
-			break
-		}
-		if lo < 0 && unicode.IsPrint(i) {
-			lo = i
-		}
-	}
-	return
-}
-
-func to16(x []uint32) []uint16 {
-	var y []uint16
-	for _, v := range x {
-		if uint32(uint16(v)) != v {
-			panic("bad 32->16 conversion")
-		}
-		y = append(y, uint16(v))
-	}
-	return y
-}
-
-func main() {
-	flag.Parse()
-
-	rang, except := scan(0, 0xFFFF)
-	range16 = to16(rang)
-	except16 = to16(except)
-	range32, except32 = scan(0x10000, unicode.MaxRune)
-
-	for i := rune(0); i <= unicode.MaxRune; i++ {
-		if isPrint(i) != unicode.IsPrint(i) {
-			log.Fatalf("%U: isPrint=%v, want %v\n", i, isPrint(i), unicode.IsPrint(i))
-		}
-	}
-
-	var buf bytes.Buffer
-
-	fmt.Fprintf(&buf, `// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.`+"\n\n")
-	fmt.Fprintf(&buf, "// DO NOT EDIT.  GENERATED BY\n")
-	fmt.Fprintf(&buf, "//     go run makeisprint.go -output isprint.go\n\n")
-	fmt.Fprintf(&buf, "package strconv\n\n")
-
-	fmt.Fprintf(&buf, "// (%d+%d+%d)*2 + (%d)*4 = %d bytes\n\n",
-		len(range16), len(except16), len(except32),
-		len(range32),
-		(len(range16)+len(except16)+len(except32))*2+
-			(len(range32))*4)
-
-	fmt.Fprintf(&buf, "var isPrint16 = []uint16{\n")
-	for i := 0; i < len(range16); i += 2 {
-		fmt.Fprintf(&buf, "\t%#04x, %#04x,\n", range16[i], range16[i+1])
-	}
-	fmt.Fprintf(&buf, "}\n\n")
-
-	fmt.Fprintf(&buf, "var isNotPrint16 = []uint16{\n")
-	for _, r := range except16 {
-		fmt.Fprintf(&buf, "\t%#04x,\n", r)
-	}
-	fmt.Fprintf(&buf, "}\n\n")
-
-	fmt.Fprintf(&buf, "var isPrint32 = []uint32{\n")
-	for i := 0; i < len(range32); i += 2 {
-		fmt.Fprintf(&buf, "\t%#06x, %#06x,\n", range32[i], range32[i+1])
-	}
-	fmt.Fprintf(&buf, "}\n\n")
-
-	fmt.Fprintf(&buf, "var isNotPrint32 = []uint16{ // add 0x10000 to each entry\n")
-	for _, r := range except32 {
-		if r >= 0x20000 {
-			log.Fatalf("%U too big for isNotPrint32\n", r)
-		}
-		fmt.Fprintf(&buf, "\t%#04x,\n", r-0x10000)
-	}
-	fmt.Fprintf(&buf, "}\n")
-
-	data, err := format.Source(buf.Bytes())
-	if err != nil {
-		log.Fatal(err)
-	}
-	err = ioutil.WriteFile(*filename, data, 0644)
-	if err != nil {
-		log.Fatal(err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/quote.go b/third_party/gofrontend/libgo/go/strconv/quote.go
deleted file mode 100644
index 53d51b5..0000000
--- a/third_party/gofrontend/libgo/go/strconv/quote.go
+++ /dev/null
@@ -1,455 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:generate go run makeisprint.go -output isprint.go
-
-package strconv
-
-import (
-	"unicode/utf8"
-)
-
-const lowerhex = "0123456789abcdef"
-
-func quoteWith(s string, quote byte, ASCIIonly bool) string {
-	var runeTmp [utf8.UTFMax]byte
-	buf := make([]byte, 0, 3*len(s)/2) // Try to avoid more allocations.
-	buf = append(buf, quote)
-	for width := 0; len(s) > 0; s = s[width:] {
-		r := rune(s[0])
-		width = 1
-		if r >= utf8.RuneSelf {
-			r, width = utf8.DecodeRuneInString(s)
-		}
-		if width == 1 && r == utf8.RuneError {
-			buf = append(buf, `\x`...)
-			buf = append(buf, lowerhex[s[0]>>4])
-			buf = append(buf, lowerhex[s[0]&0xF])
-			continue
-		}
-		if r == rune(quote) || r == '\\' { // always backslashed
-			buf = append(buf, '\\')
-			buf = append(buf, byte(r))
-			continue
-		}
-		if ASCIIonly {
-			if r < utf8.RuneSelf && IsPrint(r) {
-				buf = append(buf, byte(r))
-				continue
-			}
-		} else if IsPrint(r) {
-			n := utf8.EncodeRune(runeTmp[:], r)
-			buf = append(buf, runeTmp[:n]...)
-			continue
-		}
-		switch r {
-		case '\a':
-			buf = append(buf, `\a`...)
-		case '\b':
-			buf = append(buf, `\b`...)
-		case '\f':
-			buf = append(buf, `\f`...)
-		case '\n':
-			buf = append(buf, `\n`...)
-		case '\r':
-			buf = append(buf, `\r`...)
-		case '\t':
-			buf = append(buf, `\t`...)
-		case '\v':
-			buf = append(buf, `\v`...)
-		default:
-			switch {
-			case r < ' ':
-				buf = append(buf, `\x`...)
-				buf = append(buf, lowerhex[s[0]>>4])
-				buf = append(buf, lowerhex[s[0]&0xF])
-			case r > utf8.MaxRune:
-				r = 0xFFFD
-				fallthrough
-			case r < 0x10000:
-				buf = append(buf, `\u`...)
-				for s := 12; s >= 0; s -= 4 {
-					buf = append(buf, lowerhex[r>>uint(s)&0xF])
-				}
-			default:
-				buf = append(buf, `\U`...)
-				for s := 28; s >= 0; s -= 4 {
-					buf = append(buf, lowerhex[r>>uint(s)&0xF])
-				}
-			}
-		}
-	}
-	buf = append(buf, quote)
-	return string(buf)
-
-}
-
-// Quote returns a double-quoted Go string literal representing s.  The
-// returned string uses Go escape sequences (\t, \n, \xFF, \u0100) for
-// control characters and non-printable characters as defined by
-// IsPrint.
-func Quote(s string) string {
-	return quoteWith(s, '"', false)
-}
-
-// AppendQuote appends a double-quoted Go string literal representing s,
-// as generated by Quote, to dst and returns the extended buffer.
-func AppendQuote(dst []byte, s string) []byte {
-	return append(dst, Quote(s)...)
-}
-
-// QuoteToASCII returns a double-quoted Go string literal representing s.
-// The returned string uses Go escape sequences (\t, \n, \xFF, \u0100) for
-// non-ASCII characters and non-printable characters as defined by IsPrint.
-func QuoteToASCII(s string) string {
-	return quoteWith(s, '"', true)
-}
-
-// AppendQuoteToASCII appends a double-quoted Go string literal representing s,
-// as generated by QuoteToASCII, to dst and returns the extended buffer.
-func AppendQuoteToASCII(dst []byte, s string) []byte {
-	return append(dst, QuoteToASCII(s)...)
-}
-
-// QuoteRune returns a single-quoted Go character literal representing the
-// rune.  The returned string uses Go escape sequences (\t, \n, \xFF, \u0100)
-// for control characters and non-printable characters as defined by IsPrint.
-func QuoteRune(r rune) string {
-	// TODO: avoid the allocation here.
-	return quoteWith(string(r), '\'', false)
-}
-
-// AppendQuoteRune appends a single-quoted Go character literal representing the rune,
-// as generated by QuoteRune, to dst and returns the extended buffer.
-func AppendQuoteRune(dst []byte, r rune) []byte {
-	return append(dst, QuoteRune(r)...)
-}
-
-// QuoteRuneToASCII returns a single-quoted Go character literal representing
-// the rune.  The returned string uses Go escape sequences (\t, \n, \xFF,
-// \u0100) for non-ASCII characters and non-printable characters as defined
-// by IsPrint.
-func QuoteRuneToASCII(r rune) string {
-	// TODO: avoid the allocation here.
-	return quoteWith(string(r), '\'', true)
-}
-
-// AppendQuoteRuneToASCII appends a single-quoted Go character literal representing the rune,
-// as generated by QuoteRuneToASCII, to dst and returns the extended buffer.
-func AppendQuoteRuneToASCII(dst []byte, r rune) []byte {
-	return append(dst, QuoteRuneToASCII(r)...)
-}
-
-// CanBackquote reports whether the string s can be represented
-// unchanged as a single-line backquoted string without control
-// characters other than tab.
-func CanBackquote(s string) bool {
-	for len(s) > 0 {
-		r, wid := utf8.DecodeRuneInString(s)
-		s = s[wid:]
-		if wid > 1 {
-			if r == '\ufeff' {
-				return false // BOMs are invisible and should not be quoted.
-			}
-			continue // All other multibyte runes are correctly encoded and assumed printable.
-		}
-		if r == utf8.RuneError {
-			return false
-		}
-		if (r < ' ' && r != '\t') || r == '`' || r == '\u007F' {
-			return false
-		}
-	}
-	return true
-}
-
-func unhex(b byte) (v rune, ok bool) {
-	c := rune(b)
-	switch {
-	case '0' <= c && c <= '9':
-		return c - '0', true
-	case 'a' <= c && c <= 'f':
-		return c - 'a' + 10, true
-	case 'A' <= c && c <= 'F':
-		return c - 'A' + 10, true
-	}
-	return
-}
-
-// UnquoteChar decodes the first character or byte in the escaped string
-// or character literal represented by the string s.
-// It returns four values:
-//
-//	1) value, the decoded Unicode code point or byte value;
-//	2) multibyte, a boolean indicating whether the decoded character requires a multibyte UTF-8 representation;
-//	3) tail, the remainder of the string after the character; and
-//	4) an error that will be nil if the character is syntactically valid.
-//
-// The second argument, quote, specifies the type of literal being parsed
-// and therefore which escaped quote character is permitted.
-// If set to a single quote, it permits the sequence \' and disallows unescaped '.
-// If set to a double quote, it permits \" and disallows unescaped ".
-// If set to zero, it does not permit either escape and allows both quote characters to appear unescaped.
-func UnquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error) {
-	// easy cases
-	switch c := s[0]; {
-	case c == quote && (quote == '\'' || quote == '"'):
-		err = ErrSyntax
-		return
-	case c >= utf8.RuneSelf:
-		r, size := utf8.DecodeRuneInString(s)
-		return r, true, s[size:], nil
-	case c != '\\':
-		return rune(s[0]), false, s[1:], nil
-	}
-
-	// hard case: c is backslash
-	if len(s) <= 1 {
-		err = ErrSyntax
-		return
-	}
-	c := s[1]
-	s = s[2:]
-
-	switch c {
-	case 'a':
-		value = '\a'
-	case 'b':
-		value = '\b'
-	case 'f':
-		value = '\f'
-	case 'n':
-		value = '\n'
-	case 'r':
-		value = '\r'
-	case 't':
-		value = '\t'
-	case 'v':
-		value = '\v'
-	case 'x', 'u', 'U':
-		n := 0
-		switch c {
-		case 'x':
-			n = 2
-		case 'u':
-			n = 4
-		case 'U':
-			n = 8
-		}
-		var v rune
-		if len(s) < n {
-			err = ErrSyntax
-			return
-		}
-		for j := 0; j < n; j++ {
-			x, ok := unhex(s[j])
-			if !ok {
-				err = ErrSyntax
-				return
-			}
-			v = v<<4 | x
-		}
-		s = s[n:]
-		if c == 'x' {
-			// single-byte string, possibly not UTF-8
-			value = v
-			break
-		}
-		if v > utf8.MaxRune {
-			err = ErrSyntax
-			return
-		}
-		value = v
-		multibyte = true
-	case '0', '1', '2', '3', '4', '5', '6', '7':
-		v := rune(c) - '0'
-		if len(s) < 2 {
-			err = ErrSyntax
-			return
-		}
-		for j := 0; j < 2; j++ { // one digit already; two more
-			x := rune(s[j]) - '0'
-			if x < 0 || x > 7 {
-				err = ErrSyntax
-				return
-			}
-			v = (v << 3) | x
-		}
-		s = s[2:]
-		if v > 255 {
-			err = ErrSyntax
-			return
-		}
-		value = v
-	case '\\':
-		value = '\\'
-	case '\'', '"':
-		if c != quote {
-			err = ErrSyntax
-			return
-		}
-		value = rune(c)
-	default:
-		err = ErrSyntax
-		return
-	}
-	tail = s
-	return
-}
-
-// Unquote interprets s as a single-quoted, double-quoted,
-// or backquoted Go string literal, returning the string value
-// that s quotes.  (If s is single-quoted, it would be a Go
-// character literal; Unquote returns the corresponding
-// one-character string.)
-func Unquote(s string) (t string, err error) {
-	n := len(s)
-	if n < 2 {
-		return "", ErrSyntax
-	}
-	quote := s[0]
-	if quote != s[n-1] {
-		return "", ErrSyntax
-	}
-	s = s[1 : n-1]
-
-	if quote == '`' {
-		if contains(s, '`') {
-			return "", ErrSyntax
-		}
-		return s, nil
-	}
-	if quote != '"' && quote != '\'' {
-		return "", ErrSyntax
-	}
-	if contains(s, '\n') {
-		return "", ErrSyntax
-	}
-
-	// Is it trivial?  Avoid allocation.
-	if !contains(s, '\\') && !contains(s, quote) {
-		switch quote {
-		case '"':
-			return s, nil
-		case '\'':
-			r, size := utf8.DecodeRuneInString(s)
-			if size == len(s) && (r != utf8.RuneError || size != 1) {
-				return s, nil
-			}
-		}
-	}
-
-	var runeTmp [utf8.UTFMax]byte
-	buf := make([]byte, 0, 3*len(s)/2) // Try to avoid more allocations.
-	for len(s) > 0 {
-		c, multibyte, ss, err := UnquoteChar(s, quote)
-		if err != nil {
-			return "", err
-		}
-		s = ss
-		if c < utf8.RuneSelf || !multibyte {
-			buf = append(buf, byte(c))
-		} else {
-			n := utf8.EncodeRune(runeTmp[:], c)
-			buf = append(buf, runeTmp[:n]...)
-		}
-		if quote == '\'' && len(s) != 0 {
-			// single-quoted must be single character
-			return "", ErrSyntax
-		}
-	}
-	return string(buf), nil
-}
-
-// contains reports whether the string contains the byte c.
-func contains(s string, c byte) bool {
-	for i := 0; i < len(s); i++ {
-		if s[i] == c {
-			return true
-		}
-	}
-	return false
-}
-
-// bsearch16 returns the smallest i such that a[i] >= x.
-// If there is no such i, bsearch16 returns len(a).
-func bsearch16(a []uint16, x uint16) int {
-	i, j := 0, len(a)
-	for i < j {
-		h := i + (j-i)/2
-		if a[h] < x {
-			i = h + 1
-		} else {
-			j = h
-		}
-	}
-	return i
-}
-
-// bsearch32 returns the smallest i such that a[i] >= x.
-// If there is no such i, bsearch32 returns len(a).
-func bsearch32(a []uint32, x uint32) int {
-	i, j := 0, len(a)
-	for i < j {
-		h := i + (j-i)/2
-		if a[h] < x {
-			i = h + 1
-		} else {
-			j = h
-		}
-	}
-	return i
-}
-
-// TODO: IsPrint is a local implementation of unicode.IsPrint, verified by the tests
-// to give the same answer. It allows this package not to depend on unicode,
-// and therefore not pull in all the Unicode tables. If the linker were better
-// at tossing unused tables, we could get rid of this implementation.
-// That would be nice.
-
-// IsPrint reports whether the rune is defined as printable by Go, with
-// the same definition as unicode.IsPrint: letters, numbers, punctuation,
-// symbols and ASCII space.
-func IsPrint(r rune) bool {
-	// Fast check for Latin-1
-	if r <= 0xFF {
-		if 0x20 <= r && r <= 0x7E {
-			// All the ASCII is printable from space through DEL-1.
-			return true
-		}
-		if 0xA1 <= r && r <= 0xFF {
-			// Similarly for ¡ through ÿ...
-			return r != 0xAD // ...except for the bizarre soft hyphen.
-		}
-		return false
-	}
-
-	// Same algorithm, either on uint16 or uint32 value.
-	// First, find first i such that isPrint[i] >= x.
-	// This is the index of either the start or end of a pair that might span x.
-	// The start is even (isPrint[i&^1]) and the end is odd (isPrint[i|1]).
-	// If we find x in a range, make sure x is not in isNotPrint list.
-
-	if 0 <= r && r < 1<<16 {
-		rr, isPrint, isNotPrint := uint16(r), isPrint16, isNotPrint16
-		i := bsearch16(isPrint, rr)
-		if i >= len(isPrint) || rr < isPrint[i&^1] || isPrint[i|1] < rr {
-			return false
-		}
-		j := bsearch16(isNotPrint, rr)
-		return j >= len(isNotPrint) || isNotPrint[j] != rr
-	}
-
-	rr, isPrint, isNotPrint := uint32(r), isPrint32, isNotPrint32
-	i := bsearch32(isPrint, rr)
-	if i >= len(isPrint) || rr < isPrint[i&^1] || isPrint[i|1] < rr {
-		return false
-	}
-	if r >= 0x20000 {
-		return true
-	}
-	r -= 0x10000
-	j := bsearch16(isNotPrint, uint16(r))
-	return j >= len(isNotPrint) || isNotPrint[j] != uint16(r)
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/quote_test.go b/third_party/gofrontend/libgo/go/strconv/quote_test.go
deleted file mode 100644
index 3bf162f..0000000
--- a/third_party/gofrontend/libgo/go/strconv/quote_test.go
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv_test
-
-import (
-	. "strconv"
-	"testing"
-	"unicode"
-)
-
-// Verify that our isPrint agrees with unicode.IsPrint
-func TestIsPrint(t *testing.T) {
-	n := 0
-	for r := rune(0); r <= unicode.MaxRune; r++ {
-		if IsPrint(r) != unicode.IsPrint(r) {
-			t.Errorf("IsPrint(%U)=%t incorrect", r, IsPrint(r))
-			n++
-			if n > 10 {
-				return
-			}
-		}
-	}
-}
-
-type quoteTest struct {
-	in    string
-	out   string
-	ascii string
-}
-
-var quotetests = []quoteTest{
-	{"\a\b\f\r\n\t\v", `"\a\b\f\r\n\t\v"`, `"\a\b\f\r\n\t\v"`},
-	{"\\", `"\\"`, `"\\"`},
-	{"abc\xffdef", `"abc\xffdef"`, `"abc\xffdef"`},
-	{"\u263a", `"☺"`, `"\u263a"`},
-	{"\U0010ffff", `"\U0010ffff"`, `"\U0010ffff"`},
-	{"\x04", `"\x04"`, `"\x04"`},
-}
-
-func TestQuote(t *testing.T) {
-	for _, tt := range quotetests {
-		if out := Quote(tt.in); out != tt.out {
-			t.Errorf("Quote(%s) = %s, want %s", tt.in, out, tt.out)
-		}
-		if out := AppendQuote([]byte("abc"), tt.in); string(out) != "abc"+tt.out {
-			t.Errorf("AppendQuote(%q, %s) = %s, want %s", "abc", tt.in, out, "abc"+tt.out)
-		}
-	}
-}
-
-func TestQuoteToASCII(t *testing.T) {
-	for _, tt := range quotetests {
-		if out := QuoteToASCII(tt.in); out != tt.ascii {
-			t.Errorf("QuoteToASCII(%s) = %s, want %s", tt.in, out, tt.ascii)
-		}
-		if out := AppendQuoteToASCII([]byte("abc"), tt.in); string(out) != "abc"+tt.ascii {
-			t.Errorf("AppendQuoteToASCII(%q, %s) = %s, want %s", "abc", tt.in, out, "abc"+tt.ascii)
-		}
-	}
-}
-
-type quoteRuneTest struct {
-	in    rune
-	out   string
-	ascii string
-}
-
-var quoterunetests = []quoteRuneTest{
-	{'a', `'a'`, `'a'`},
-	{'\a', `'\a'`, `'\a'`},
-	{'\\', `'\\'`, `'\\'`},
-	{0xFF, `'ÿ'`, `'\u00ff'`},
-	{0x263a, `'☺'`, `'\u263a'`},
-	{0xfffd, `'�'`, `'\ufffd'`},
-	{0x0010ffff, `'\U0010ffff'`, `'\U0010ffff'`},
-	{0x0010ffff + 1, `'�'`, `'\ufffd'`},
-	{0x04, `'\x04'`, `'\x04'`},
-}
-
-func TestQuoteRune(t *testing.T) {
-	for _, tt := range quoterunetests {
-		if out := QuoteRune(tt.in); out != tt.out {
-			t.Errorf("QuoteRune(%U) = %s, want %s", tt.in, out, tt.out)
-		}
-		if out := AppendQuoteRune([]byte("abc"), tt.in); string(out) != "abc"+tt.out {
-			t.Errorf("AppendQuoteRune(%q, %U) = %s, want %s", "abc", tt.in, out, "abc"+tt.out)
-		}
-	}
-}
-
-func TestQuoteRuneToASCII(t *testing.T) {
-	for _, tt := range quoterunetests {
-		if out := QuoteRuneToASCII(tt.in); out != tt.ascii {
-			t.Errorf("QuoteRuneToASCII(%U) = %s, want %s", tt.in, out, tt.ascii)
-		}
-		if out := AppendQuoteRuneToASCII([]byte("abc"), tt.in); string(out) != "abc"+tt.ascii {
-			t.Errorf("AppendQuoteRuneToASCII(%q, %U) = %s, want %s", "abc", tt.in, out, "abc"+tt.ascii)
-		}
-	}
-}
-
-type canBackquoteTest struct {
-	in  string
-	out bool
-}
-
-var canbackquotetests = []canBackquoteTest{
-	{"`", false},
-	{string(0), false},
-	{string(1), false},
-	{string(2), false},
-	{string(3), false},
-	{string(4), false},
-	{string(5), false},
-	{string(6), false},
-	{string(7), false},
-	{string(8), false},
-	{string(9), true}, // \t
-	{string(10), false},
-	{string(11), false},
-	{string(12), false},
-	{string(13), false},
-	{string(14), false},
-	{string(15), false},
-	{string(16), false},
-	{string(17), false},
-	{string(18), false},
-	{string(19), false},
-	{string(20), false},
-	{string(21), false},
-	{string(22), false},
-	{string(23), false},
-	{string(24), false},
-	{string(25), false},
-	{string(26), false},
-	{string(27), false},
-	{string(28), false},
-	{string(29), false},
-	{string(30), false},
-	{string(31), false},
-	{string(0x7F), false},
-	{`' !"#$%&'()*+,-./:;<=>?@[\]^_{|}~`, true},
-	{`0123456789`, true},
-	{`ABCDEFGHIJKLMNOPQRSTUVWXYZ`, true},
-	{`abcdefghijklmnopqrstuvwxyz`, true},
-	{`☺`, true},
-	{"\x80", false},
-	{"a\xe0\xa0z", false},
-	{"\ufeffabc", false},
-	{"a\ufeffz", false},
-}
-
-func TestCanBackquote(t *testing.T) {
-	for _, tt := range canbackquotetests {
-		if out := CanBackquote(tt.in); out != tt.out {
-			t.Errorf("CanBackquote(%q) = %v, want %v", tt.in, out, tt.out)
-		}
-	}
-}
-
-type unQuoteTest struct {
-	in  string
-	out string
-}
-
-var unquotetests = []unQuoteTest{
-	{`""`, ""},
-	{`"a"`, "a"},
-	{`"abc"`, "abc"},
-	{`"☺"`, "☺"},
-	{`"hello world"`, "hello world"},
-	{`"\xFF"`, "\xFF"},
-	{`"\377"`, "\377"},
-	{`"\u1234"`, "\u1234"},
-	{`"\U00010111"`, "\U00010111"},
-	{`"\U0001011111"`, "\U0001011111"},
-	{`"\a\b\f\n\r\t\v\\\""`, "\a\b\f\n\r\t\v\\\""},
-	{`"'"`, "'"},
-
-	{`'a'`, "a"},
-	{`'☹'`, "☹"},
-	{`'\a'`, "\a"},
-	{`'\x10'`, "\x10"},
-	{`'\377'`, "\377"},
-	{`'\u1234'`, "\u1234"},
-	{`'\U00010111'`, "\U00010111"},
-	{`'\t'`, "\t"},
-	{`' '`, " "},
-	{`'\''`, "'"},
-	{`'"'`, "\""},
-
-	{"``", ``},
-	{"`a`", `a`},
-	{"`abc`", `abc`},
-	{"`☺`", `☺`},
-	{"`hello world`", `hello world`},
-	{"`\\xFF`", `\xFF`},
-	{"`\\377`", `\377`},
-	{"`\\`", `\`},
-	{"`\n`", "\n"},
-	{"`	`", `	`},
-	{"` `", ` `},
-}
-
-var misquoted = []string{
-	``,
-	`"`,
-	`"a`,
-	`"'`,
-	`b"`,
-	`"\"`,
-	`"\9"`,
-	`"\19"`,
-	`"\129"`,
-	`'\'`,
-	`'\9'`,
-	`'\19'`,
-	`'\129'`,
-	`'ab'`,
-	`"\x1!"`,
-	`"\U12345678"`,
-	`"\z"`,
-	"`",
-	"`xxx",
-	"`\"",
-	`"\'"`,
-	`'\"'`,
-	"\"\n\"",
-	"\"\\n\n\"",
-	"'\n'",
-}
-
-func TestUnquote(t *testing.T) {
-	for _, tt := range unquotetests {
-		if out, err := Unquote(tt.in); err != nil && out != tt.out {
-			t.Errorf("Unquote(%#q) = %q, %v want %q, nil", tt.in, out, err, tt.out)
-		}
-	}
-
-	// run the quote tests too, backward
-	for _, tt := range quotetests {
-		if in, err := Unquote(tt.out); in != tt.in {
-			t.Errorf("Unquote(%#q) = %q, %v, want %q, nil", tt.out, in, err, tt.in)
-		}
-	}
-
-	for _, s := range misquoted {
-		if out, err := Unquote(s); out != "" || err != ErrSyntax {
-			t.Errorf("Unquote(%#q) = %q, %v want %q, %v", s, out, err, "", ErrSyntax)
-		}
-	}
-}
-
-func BenchmarkUnquoteEasy(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Unquote(`"Give me a rock, paper and scissors and I will move the world."`)
-	}
-}
-
-func BenchmarkUnquoteHard(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Unquote(`"\x47ive me a \x72ock, \x70aper and \x73cissors and \x49 will move the world."`)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/strconv/strconv_test.go b/third_party/gofrontend/libgo/go/strconv/strconv_test.go
deleted file mode 100644
index 207e00e..0000000
--- a/third_party/gofrontend/libgo/go/strconv/strconv_test.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strconv_test
-
-/*
-
-gccgo does not pass this.
-
-import (
-	"runtime"
-	. "strconv"
-	"strings"
-	"testing"
-)
-
-var (
-	globalBuf [64]byte
-	nextToOne = "1.00000000000000011102230246251565404236316680908203125" + strings.Repeat("0", 10000) + "1"
-
-	mallocTest = []struct {
-		count int
-		desc  string
-		fn    func()
-	}{
-		{0, `AppendInt(localBuf[:0], 123, 10)`, func() {
-			var localBuf [64]byte
-			AppendInt(localBuf[:0], 123, 10)
-		}},
-		{0, `AppendInt(globalBuf[:0], 123, 10)`, func() { AppendInt(globalBuf[:0], 123, 10) }},
-		{0, `AppendFloat(localBuf[:0], 1.23, 'g', 5, 64)`, func() {
-			var localBuf [64]byte
-			AppendFloat(localBuf[:0], 1.23, 'g', 5, 64)
-		}},
-		{0, `AppendFloat(globalBuf[:0], 1.23, 'g', 5, 64)`, func() { AppendFloat(globalBuf[:0], 1.23, 'g', 5, 64) }},
-		{0, `ParseFloat("123.45", 64)`, func() { ParseFloat("123.45", 64) }},
-		{0, `ParseFloat("123.456789123456789", 64)`, func() { ParseFloat("123.456789123456789", 64) }},
-		{0, `ParseFloat("1.000000000000000111022302462515654042363166809082031251", 64)`, func() {
-			ParseFloat("1.000000000000000111022302462515654042363166809082031251", 64)
-		}},
-		{0, `ParseFloat("1.0000000000000001110223024625156540423631668090820312500...001", 64)`, func() {
-			ParseFloat(nextToOne, 64)
-		}},
-	}
-)
-
-func TestCountMallocs(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping malloc count in short mode")
-	}
-	if runtime.GOMAXPROCS(0) > 1 {
-		t.Skip("skipping; GOMAXPROCS>1")
-	}
-	for _, mt := range mallocTest {
-		allocs := testing.AllocsPerRun(100, mt.fn)
-		if max := float64(mt.count); allocs > max {
-			t.Errorf("%s: %v allocs, want <=%v", mt.desc, allocs, max)
-		}
-	}
-}
-
-*/
diff --git a/third_party/gofrontend/libgo/go/strconv/testdata/testfp.txt b/third_party/gofrontend/libgo/go/strconv/testdata/testfp.txt
deleted file mode 100644
index 08d3c4e..0000000
--- a/third_party/gofrontend/libgo/go/strconv/testdata/testfp.txt
+++ /dev/null
@@ -1,181 +0,0 @@
-# Floating-point conversion test cases.
-# Empty lines and lines beginning with # are ignored.
-# The rest have four fields per line: type, format, input, and output.
-# The input is given either in decimal or binary scientific notation.
-# The output is the string that should be produced by formatting the
-# input with the given format.
-#
-# The formats are as in C's printf, except that %b means print
-# binary scientific notation: NpE = N x 2^E.
-
-# TODO:
-#	Powers of 10.
-#	Powers of 2.
-#	%.20g versions.
-#	random sources
-#	random targets
-#	random targets ± half a ULP
-
-# Difficult boundary cases, derived from tables given in
-#	Vern Paxson, A Program for Testing IEEE Decimal-Binary Conversion
-#	ftp://ftp.ee.lbl.gov/testbase-report.ps.Z
-
-# Table 1: Stress Inputs for Conversion to 53-bit Binary, < 1/2 ULP
-float64 %b 5e+125 6653062250012735p+365
-float64 %b 69e+267 4705683757438170p+841
-float64 %b 999e-026 6798841691080350p-129
-float64 %b 7861e-034 8975675289889240p-153
-float64 %b 75569e-254 6091718967192243p-880
-float64 %b 928609e-261 7849264900213743p-900
-float64 %b 9210917e+080 8341110837370930p+236
-float64 %b 84863171e+114 4625202867375927p+353
-float64 %b 653777767e+273 5068902999763073p+884
-float64 %b 5232604057e-298 5741343011915040p-1010
-float64 %b 27235667517e-109 6707124626673586p-380
-float64 %b 653532977297e-123 7078246407265384p-422
-float64 %b 3142213164987e-294 8219991337640559p-988
-float64 %b 46202199371337e-072 5224462102115359p-246
-float64 %b 231010996856685e-073 5224462102115359p-247
-float64 %b 9324754620109615e+212 5539753864394442p+705
-float64 %b 78459735791271921e+049 8388176519442766p+166
-float64 %b 272104041512242479e+200 5554409530847367p+670
-float64 %b 6802601037806061975e+198 5554409530847367p+668
-float64 %b 20505426358836677347e-221 4524032052079546p-722
-float64 %b 836168422905420598437e-234 5070963299887562p-760
-float64 %b 4891559871276714924261e+222 6452687840519111p+757
-
-# Table 2: Stress Inputs for Conversion to 53-bit Binary, > 1/2 ULP
-float64 %b 9e-265 8168427841980010p-930
-float64 %b 85e-037 6360455125664090p-169
-float64 %b 623e+100 6263531988747231p+289
-float64 %b 3571e+263 6234526311072170p+833
-float64 %b 81661e+153 6696636728760206p+472
-float64 %b 920657e-023 5975405561110124p-109
-float64 %b 4603285e-024 5975405561110124p-110
-float64 %b 87575437e-309 8452160731874668p-1053
-float64 %b 245540327e+122 4985336549131723p+381
-float64 %b 6138508175e+120 4985336549131723p+379
-float64 %b 83356057653e+193 5986732817132056p+625
-float64 %b 619534293513e+124 4798406992060657p+399
-float64 %b 2335141086879e+218 5419088166961646p+713
-float64 %b 36167929443327e-159 8135819834632444p-536
-float64 %b 609610927149051e-255 4576664294594737p-850
-float64 %b 3743626360493413e-165 6898586531774201p-549
-float64 %b 94080055902682397e-242 6273271706052298p-800
-float64 %b 899810892172646163e+283 7563892574477827p+947
-float64 %b 7120190517612959703e+120 5385467232557565p+409
-float64 %b 25188282901709339043e-252 5635662608542340p-825
-float64 %b 308984926168550152811e-052 5644774693823803p-157
-float64 %b 6372891218502368041059e+064 4616868614322430p+233
-
-# Table 3: Stress Inputs for Converting 53-bit Binary to Decimal, < 1/2 ULP
-float64 %.0e 8511030020275656p-342 9e-88
-float64 %.1e 5201988407066741p-824 4.6e-233
-float64 %.2e 6406892948269899p+237 1.41e+87
-float64 %.3e 8431154198732492p+72 3.981e+37
-float64 %.4e 6475049196144587p+99 4.1040e+45
-float64 %.5e 8274307542972842p+726 2.92084e+234
-float64 %.6e 5381065484265332p-456 2.891946e-122
-float64 %.7e 6761728585499734p-1057 4.3787718e-303
-float64 %.8e 7976538478610756p+376 1.22770163e+129
-float64 %.9e 5982403858958067p+377 1.841552452e+129
-float64 %.10e 5536995190630837p+93 5.4835744350e+43
-float64 %.11e 7225450889282194p+710 3.89190181146e+229
-float64 %.12e 7225450889282194p+709 1.945950905732e+229
-float64 %.13e 8703372741147379p+117 1.4460958381605e+51
-float64 %.14e 8944262675275217p-1001 4.17367747458531e-286
-float64 %.15e 7459803696087692p-707 1.107950772878888e-197
-float64 %.16e 6080469016670379p-381 1.2345501366327440e-99
-float64 %.17e 8385515147034757p+721 9.25031711960365024e+232
-float64 %.18e 7514216811389786p-828 4.198047150284889840e-234
-float64 %.19e 8397297803260511p-345 1.1716315319786511046e-88
-float64 %.20e 6733459239310543p+202 4.32810072844612493629e+76
-float64 %.21e 8091450587292794p-473 3.317710118160031081518e-127
-
-# Table 4: Stress Inputs for Converting 53-bit Binary to Decimal, > 1/2 ULP
-float64 %.0e 6567258882077402p+952 3e+302
-float64 %.1e 6712731423444934p+535 7.6e+176
-float64 %.2e 6712731423444934p+534 3.78e+176
-float64 %.3e 5298405411573037p-957 4.350e-273
-float64 %.4e 5137311167659507p-144 2.3037e-28
-float64 %.5e 6722280709661868p+363 1.26301e+125
-float64 %.6e 5344436398034927p-169 7.142211e-36
-float64 %.7e 8369123604277281p-853 1.3934574e-241
-float64 %.8e 8995822108487663p-780 1.41463449e-219
-float64 %.9e 8942832835564782p-383 4.539277920e-100
-float64 %.10e 8942832835564782p-384 2.2696389598e-100
-float64 %.11e 8942832835564782p-385 1.13481947988e-100
-float64 %.12e 6965949469487146p-249 7.700366561890e-60
-float64 %.13e 6965949469487146p-250 3.8501832809448e-60
-float64 %.14e 6965949469487146p-251 1.92509164047238e-60
-float64 %.15e 7487252720986826p+548 6.898586531774201e+180
-float64 %.16e 5592117679628511p+164 1.3076622631878654e+65
-float64 %.17e 8887055249355788p+665 1.36052020756121240e+216
-float64 %.18e 6994187472632449p+690 3.592810217475959676e+223
-float64 %.19e 8797576579012143p+588 8.9125197712484551899e+192
-float64 %.20e 7363326733505337p+272 5.58769757362301140950e+97
-float64 %.21e 8549497411294502p-448 1.176257830728540379990e-119
-
-# Table 14: Stress Inputs for Conversion to 24-bit Binary, <1/2 ULP
-# NOTE: The lines with exponent p-149 have been changed from the
-# paper.  Those entries originally read p-150 and had a mantissa
-# twice as large (and even), but IEEE single-precision has no p-150:
-# that's the start of the denormals.
-float32 %b 5e-20 15474250p-88
-float32 %b 67e+14 12479722p+29
-float32 %b 985e+15 14333636p+36
-# float32 %b 7693e-42 10979816p-150
-float32 %b 7693e-42 5489908p-149
-float32 %b 55895e-16 12888509p-61
-# float32 %b 996622e-44 14224264p-150
-float32 %b 996622e-44 7112132p-149
-float32 %b 7038531e-32 11420669p-107
-# float32 %b 60419369e-46 8623340p-150
-float32 %b 60419369e-46 4311670p-149
-float32 %b 702990899e-20 16209866p-61
-# float32 %b 6930161142e-48 9891056p-150
-float32 %b 6930161142e-48 4945528p-149
-float32 %b 25933168707e+13 14395800p+54
-float32 %b 596428896559e+20 12333860p+82
-
-# Table 15: Stress Inputs for Conversion to 24-bit Binary, >1/2 ULP
-float32 %b 3e-23 9507380p-98
-float32 %b 57e+18 12960300p+42
-float32 %b 789e-35 10739312p-130
-float32 %b 2539e-18 11990089p-72
-float32 %b 76173e+28 9845130p+86
-float32 %b 887745e-11 9760860p-40
-float32 %b 5382571e-37 11447463p-124
-float32 %b 82381273e-35 8554961p-113
-float32 %b 750486563e-38 9975678p-120
-float32 %b 3752432815e-39 9975678p-121
-float32 %b 75224575729e-45 13105970p-137
-float32 %b 459926601011e+15 12466336p+65
-
-# Table 16: Stress Inputs for Converting 24-bit Binary to Decimal, < 1/2 ULP
-float32 %.0e 12676506p-102 2e-24
-float32 %.1e 12676506p-103 1.2e-24
-float32 %.2e 15445013p+86 1.19e+33
-float32 %.3e 13734123p-138 3.941e-35
-float32 %.4e 12428269p-130 9.1308e-33
-float32 %.5e 15334037p-146 1.71900e-37
-float32 %.6e 11518287p-41 5.237910e-06
-float32 %.7e 12584953p-145 2.8216440e-37
-float32 %.8e 15961084p-125 3.75243281e-31
-float32 %.9e 14915817p-146 1.672120916e-37
-float32 %.10e 10845484p-102 2.1388945814e-24
-float32 %.11e 16431059p-61 7.12583594561e-12
-
-# Table 17: Stress Inputs for Converting 24-bit Binary to Decimal, > 1/2 ULP
-float32 %.0e 16093626p+69 1e+28
-float32 %.1e 9983778p+25 3.4e+14
-float32 %.2e 12745034p+104 2.59e+38
-float32 %.3e 12706553p+72 6.001e+28
-float32 %.4e 11005028p+45 3.8721e+20
-float32 %.5e 15059547p+71 3.55584e+28
-float32 %.6e 16015691p-99 2.526831e-23
-float32 %.7e 8667859p+56 6.2458507e+23
-float32 %.8e 14855922p-82 3.07213267e-18
-float32 %.9e 14855922p-83 1.536066333e-18
-float32 %.10e 10144164p-110 7.8147796834e-27
-float32 %.11e 13248074p+95 5.24810279937e+35
diff --git a/third_party/gofrontend/libgo/go/strconv/testfp.txt b/third_party/gofrontend/libgo/go/strconv/testfp.txt
deleted file mode 100644
index 08d3c4e..0000000
--- a/third_party/gofrontend/libgo/go/strconv/testfp.txt
+++ /dev/null
@@ -1,181 +0,0 @@
-# Floating-point conversion test cases.
-# Empty lines and lines beginning with # are ignored.
-# The rest have four fields per line: type, format, input, and output.
-# The input is given either in decimal or binary scientific notation.
-# The output is the string that should be produced by formatting the
-# input with the given format.
-#
-# The formats are as in C's printf, except that %b means print
-# binary scientific notation: NpE = N x 2^E.
-
-# TODO:
-#	Powers of 10.
-#	Powers of 2.
-#	%.20g versions.
-#	random sources
-#	random targets
-#	random targets ± half a ULP
-
-# Difficult boundary cases, derived from tables given in
-#	Vern Paxson, A Program for Testing IEEE Decimal-Binary Conversion
-#	ftp://ftp.ee.lbl.gov/testbase-report.ps.Z
-
-# Table 1: Stress Inputs for Conversion to 53-bit Binary, < 1/2 ULP
-float64 %b 5e+125 6653062250012735p+365
-float64 %b 69e+267 4705683757438170p+841
-float64 %b 999e-026 6798841691080350p-129
-float64 %b 7861e-034 8975675289889240p-153
-float64 %b 75569e-254 6091718967192243p-880
-float64 %b 928609e-261 7849264900213743p-900
-float64 %b 9210917e+080 8341110837370930p+236
-float64 %b 84863171e+114 4625202867375927p+353
-float64 %b 653777767e+273 5068902999763073p+884
-float64 %b 5232604057e-298 5741343011915040p-1010
-float64 %b 27235667517e-109 6707124626673586p-380
-float64 %b 653532977297e-123 7078246407265384p-422
-float64 %b 3142213164987e-294 8219991337640559p-988
-float64 %b 46202199371337e-072 5224462102115359p-246
-float64 %b 231010996856685e-073 5224462102115359p-247
-float64 %b 9324754620109615e+212 5539753864394442p+705
-float64 %b 78459735791271921e+049 8388176519442766p+166
-float64 %b 272104041512242479e+200 5554409530847367p+670
-float64 %b 6802601037806061975e+198 5554409530847367p+668
-float64 %b 20505426358836677347e-221 4524032052079546p-722
-float64 %b 836168422905420598437e-234 5070963299887562p-760
-float64 %b 4891559871276714924261e+222 6452687840519111p+757
-
-# Table 2: Stress Inputs for Conversion to 53-bit Binary, > 1/2 ULP
-float64 %b 9e-265 8168427841980010p-930
-float64 %b 85e-037 6360455125664090p-169
-float64 %b 623e+100 6263531988747231p+289
-float64 %b 3571e+263 6234526311072170p+833
-float64 %b 81661e+153 6696636728760206p+472
-float64 %b 920657e-023 5975405561110124p-109
-float64 %b 4603285e-024 5975405561110124p-110
-float64 %b 87575437e-309 8452160731874668p-1053
-float64 %b 245540327e+122 4985336549131723p+381
-float64 %b 6138508175e+120 4985336549131723p+379
-float64 %b 83356057653e+193 5986732817132056p+625
-float64 %b 619534293513e+124 4798406992060657p+399
-float64 %b 2335141086879e+218 5419088166961646p+713
-float64 %b 36167929443327e-159 8135819834632444p-536
-float64 %b 609610927149051e-255 4576664294594737p-850
-float64 %b 3743626360493413e-165 6898586531774201p-549
-float64 %b 94080055902682397e-242 6273271706052298p-800
-float64 %b 899810892172646163e+283 7563892574477827p+947
-float64 %b 7120190517612959703e+120 5385467232557565p+409
-float64 %b 25188282901709339043e-252 5635662608542340p-825
-float64 %b 308984926168550152811e-052 5644774693823803p-157
-float64 %b 6372891218502368041059e+064 4616868614322430p+233
-
-# Table 3: Stress Inputs for Converting 53-bit Binary to Decimal, < 1/2 ULP
-float64 %.0e 8511030020275656p-342 9e-88
-float64 %.1e 5201988407066741p-824 4.6e-233
-float64 %.2e 6406892948269899p+237 1.41e+87
-float64 %.3e 8431154198732492p+72 3.981e+37
-float64 %.4e 6475049196144587p+99 4.1040e+45
-float64 %.5e 8274307542972842p+726 2.92084e+234
-float64 %.6e 5381065484265332p-456 2.891946e-122
-float64 %.7e 6761728585499734p-1057 4.3787718e-303
-float64 %.8e 7976538478610756p+376 1.22770163e+129
-float64 %.9e 5982403858958067p+377 1.841552452e+129
-float64 %.10e 5536995190630837p+93 5.4835744350e+43
-float64 %.11e 7225450889282194p+710 3.89190181146e+229
-float64 %.12e 7225450889282194p+709 1.945950905732e+229
-float64 %.13e 8703372741147379p+117 1.4460958381605e+51
-float64 %.14e 8944262675275217p-1001 4.17367747458531e-286
-float64 %.15e 7459803696087692p-707 1.107950772878888e-197
-float64 %.16e 6080469016670379p-381 1.2345501366327440e-99
-float64 %.17e 8385515147034757p+721 9.25031711960365024e+232
-float64 %.18e 7514216811389786p-828 4.198047150284889840e-234
-float64 %.19e 8397297803260511p-345 1.1716315319786511046e-88
-float64 %.20e 6733459239310543p+202 4.32810072844612493629e+76
-float64 %.21e 8091450587292794p-473 3.317710118160031081518e-127
-
-# Table 4: Stress Inputs for Converting 53-bit Binary to Decimal, > 1/2 ULP
-float64 %.0e 6567258882077402p+952 3e+302
-float64 %.1e 6712731423444934p+535 7.6e+176
-float64 %.2e 6712731423444934p+534 3.78e+176
-float64 %.3e 5298405411573037p-957 4.350e-273
-float64 %.4e 5137311167659507p-144 2.3037e-28
-float64 %.5e 6722280709661868p+363 1.26301e+125
-float64 %.6e 5344436398034927p-169 7.142211e-36
-float64 %.7e 8369123604277281p-853 1.3934574e-241
-float64 %.8e 8995822108487663p-780 1.41463449e-219
-float64 %.9e 8942832835564782p-383 4.539277920e-100
-float64 %.10e 8942832835564782p-384 2.2696389598e-100
-float64 %.11e 8942832835564782p-385 1.13481947988e-100
-float64 %.12e 6965949469487146p-249 7.700366561890e-60
-float64 %.13e 6965949469487146p-250 3.8501832809448e-60
-float64 %.14e 6965949469487146p-251 1.92509164047238e-60
-float64 %.15e 7487252720986826p+548 6.898586531774201e+180
-float64 %.16e 5592117679628511p+164 1.3076622631878654e+65
-float64 %.17e 8887055249355788p+665 1.36052020756121240e+216
-float64 %.18e 6994187472632449p+690 3.592810217475959676e+223
-float64 %.19e 8797576579012143p+588 8.9125197712484551899e+192
-float64 %.20e 7363326733505337p+272 5.58769757362301140950e+97
-float64 %.21e 8549497411294502p-448 1.176257830728540379990e-119
-
-# Table 14: Stress Inputs for Conversion to 24-bit Binary, <1/2 ULP
-# NOTE: The lines with exponent p-149 have been changed from the
-# paper.  Those entries originally read p-150 and had a mantissa
-# twice as large (and even), but IEEE single-precision has no p-150:
-# that's the start of the denormals.
-float32 %b 5e-20 15474250p-88
-float32 %b 67e+14 12479722p+29
-float32 %b 985e+15 14333636p+36
-# float32 %b 7693e-42 10979816p-150
-float32 %b 7693e-42 5489908p-149
-float32 %b 55895e-16 12888509p-61
-# float32 %b 996622e-44 14224264p-150
-float32 %b 996622e-44 7112132p-149
-float32 %b 7038531e-32 11420669p-107
-# float32 %b 60419369e-46 8623340p-150
-float32 %b 60419369e-46 4311670p-149
-float32 %b 702990899e-20 16209866p-61
-# float32 %b 6930161142e-48 9891056p-150
-float32 %b 6930161142e-48 4945528p-149
-float32 %b 25933168707e+13 14395800p+54
-float32 %b 596428896559e+20 12333860p+82
-
-# Table 15: Stress Inputs for Conversion to 24-bit Binary, >1/2 ULP
-float32 %b 3e-23 9507380p-98
-float32 %b 57e+18 12960300p+42
-float32 %b 789e-35 10739312p-130
-float32 %b 2539e-18 11990089p-72
-float32 %b 76173e+28 9845130p+86
-float32 %b 887745e-11 9760860p-40
-float32 %b 5382571e-37 11447463p-124
-float32 %b 82381273e-35 8554961p-113
-float32 %b 750486563e-38 9975678p-120
-float32 %b 3752432815e-39 9975678p-121
-float32 %b 75224575729e-45 13105970p-137
-float32 %b 459926601011e+15 12466336p+65
-
-# Table 16: Stress Inputs for Converting 24-bit Binary to Decimal, < 1/2 ULP
-float32 %.0e 12676506p-102 2e-24
-float32 %.1e 12676506p-103 1.2e-24
-float32 %.2e 15445013p+86 1.19e+33
-float32 %.3e 13734123p-138 3.941e-35
-float32 %.4e 12428269p-130 9.1308e-33
-float32 %.5e 15334037p-146 1.71900e-37
-float32 %.6e 11518287p-41 5.237910e-06
-float32 %.7e 12584953p-145 2.8216440e-37
-float32 %.8e 15961084p-125 3.75243281e-31
-float32 %.9e 14915817p-146 1.672120916e-37
-float32 %.10e 10845484p-102 2.1388945814e-24
-float32 %.11e 16431059p-61 7.12583594561e-12
-
-# Table 17: Stress Inputs for Converting 24-bit Binary to Decimal, > 1/2 ULP
-float32 %.0e 16093626p+69 1e+28
-float32 %.1e 9983778p+25 3.4e+14
-float32 %.2e 12745034p+104 2.59e+38
-float32 %.3e 12706553p+72 6.001e+28
-float32 %.4e 11005028p+45 3.8721e+20
-float32 %.5e 15059547p+71 3.55584e+28
-float32 %.6e 16015691p-99 2.526831e-23
-float32 %.7e 8667859p+56 6.2458507e+23
-float32 %.8e 14855922p-82 3.07213267e-18
-float32 %.9e 14855922p-83 1.536066333e-18
-float32 %.10e 10144164p-110 7.8147796834e-27
-float32 %.11e 13248074p+95 5.24810279937e+35
diff --git a/third_party/gofrontend/libgo/go/strings/compare.go b/third_party/gofrontend/libgo/go/strings/compare.go
deleted file mode 100644
index b84ddde..0000000
--- a/third_party/gofrontend/libgo/go/strings/compare.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2015 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strings
-
-// Compare returns an integer comparing two strings lexicographically.
-// The result will be 0 if a==b, -1 if a < b, and +1 if a > b.
-//
-// Compare is included only for symmetry with package bytes.
-// It is usually clearer and always faster to use the built-in
-// string comparison operators ==, <, >, and so on.
-func Compare(a, b string) int {
-	// NOTE(rsc): This function does NOT call the runtime cmpstring function,
-	// because we do not want to provide any performance justification for
-	// using strings.Compare. Basically no one should use strings.Compare.
-	// As the comment above says, it is here only for symmetry with package bytes.
-	// If performance is important, the compiler should be changed to recognize
-	// the pattern so that all code doing three-way comparisons, not just code
-	// using strings.Compare, can benefit.
-	if a == b {
-		return 0
-	}
-	if a < b {
-		return -1
-	}
-	return +1
-}
diff --git a/third_party/gofrontend/libgo/go/strings/compare_test.go b/third_party/gofrontend/libgo/go/strings/compare_test.go
deleted file mode 100644
index 68fc88e..0000000
--- a/third_party/gofrontend/libgo/go/strings/compare_test.go
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strings_test
-
-// Derived from bytes/compare_test.go.
-// Benchmarks omitted since the underlying implementation is identical.
-
-import (
-	. "strings"
-	"testing"
-)
-
-var compareTests = []struct {
-	a, b string
-	i    int
-}{
-	{"", "", 0},
-	{"a", "", 1},
-	{"", "a", -1},
-	{"abc", "abc", 0},
-	{"ab", "abc", -1},
-	{"abc", "ab", 1},
-	{"x", "ab", 1},
-	{"ab", "x", -1},
-	{"x", "a", 1},
-	{"b", "x", -1},
-	// test runtime·memeq's chunked implementation
-	{"abcdefgh", "abcdefgh", 0},
-	{"abcdefghi", "abcdefghi", 0},
-	{"abcdefghi", "abcdefghj", -1},
-}
-
-func TestCompare(t *testing.T) {
-	for _, tt := range compareTests {
-		cmp := Compare(tt.a, tt.b)
-		if cmp != tt.i {
-			t.Errorf(`Compare(%q, %q) = %v`, tt.a, tt.b, cmp)
-		}
-	}
-}
-
-func TestCompareIdenticalString(t *testing.T) {
-	var s = "Hello Gophers!"
-	if Compare(s, s) != 0 {
-		t.Error("s != s")
-	}
-	if Compare(s, s[:1]) != 1 {
-		t.Error("s > s[:1] failed")
-	}
-}
-
-func TestCompareStrings(t *testing.T) {
-	n := 128
-	a := make([]byte, n+1)
-	b := make([]byte, n+1)
-	for len := 0; len < 128; len++ {
-		// randomish but deterministic data.  No 0 or 255.
-		for i := 0; i < len; i++ {
-			a[i] = byte(1 + 31*i%254)
-			b[i] = byte(1 + 31*i%254)
-		}
-		// data past the end is different
-		for i := len; i <= n; i++ {
-			a[i] = 8
-			b[i] = 9
-		}
-
-		cmp := Compare(string(a[:len]), string(b[:len]))
-		if cmp != 0 {
-			t.Errorf(`CompareIdentical(%d) = %d`, len, cmp)
-		}
-		if len > 0 {
-			cmp = Compare(string(a[:len-1]), string(b[:len]))
-			if cmp != -1 {
-				t.Errorf(`CompareAshorter(%d) = %d`, len, cmp)
-			}
-			cmp = Compare(string(a[:len]), string(b[:len-1]))
-			if cmp != 1 {
-				t.Errorf(`CompareBshorter(%d) = %d`, len, cmp)
-			}
-		}
-		for k := 0; k < len; k++ {
-			b[k] = a[k] - 1
-			cmp = Compare(string(a[:len]), string(b[:len]))
-			if cmp != 1 {
-				t.Errorf(`CompareAbigger(%d,%d) = %d`, len, k, cmp)
-			}
-			b[k] = a[k] + 1
-			cmp = Compare(string(a[:len]), string(b[:len]))
-			if cmp != -1 {
-				t.Errorf(`CompareBbigger(%d,%d) = %d`, len, k, cmp)
-			}
-			b[k] = a[k]
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/strings/example_test.go b/third_party/gofrontend/libgo/go/strings/example_test.go
deleted file mode 100644
index 7243e16..0000000
--- a/third_party/gofrontend/libgo/go/strings/example_test.go
+++ /dev/null
@@ -1,225 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strings_test
-
-import (
-	"fmt"
-	"strings"
-	"unicode"
-)
-
-func ExampleFields() {
-	fmt.Printf("Fields are: %q", strings.Fields("  foo bar  baz   "))
-	// Output: Fields are: ["foo" "bar" "baz"]
-}
-
-func ExampleFieldsFunc() {
-	f := func(c rune) bool {
-		return !unicode.IsLetter(c) && !unicode.IsNumber(c)
-	}
-	fmt.Printf("Fields are: %q", strings.FieldsFunc("  foo1;bar2,baz3...", f))
-	// Output: Fields are: ["foo1" "bar2" "baz3"]
-}
-
-func ExampleContains() {
-	fmt.Println(strings.Contains("seafood", "foo"))
-	fmt.Println(strings.Contains("seafood", "bar"))
-	fmt.Println(strings.Contains("seafood", ""))
-	fmt.Println(strings.Contains("", ""))
-	// Output:
-	// true
-	// false
-	// true
-	// true
-}
-
-func ExampleContainsAny() {
-	fmt.Println(strings.ContainsAny("team", "i"))
-	fmt.Println(strings.ContainsAny("failure", "u & i"))
-	fmt.Println(strings.ContainsAny("foo", ""))
-	fmt.Println(strings.ContainsAny("", ""))
-	// Output:
-	// false
-	// true
-	// false
-	// false
-}
-
-func ExampleCount() {
-	fmt.Println(strings.Count("cheese", "e"))
-	fmt.Println(strings.Count("five", "")) // before & after each rune
-	// Output:
-	// 3
-	// 5
-}
-
-func ExampleEqualFold() {
-	fmt.Println(strings.EqualFold("Go", "go"))
-	// Output: true
-}
-
-func ExampleIndex() {
-	fmt.Println(strings.Index("chicken", "ken"))
-	fmt.Println(strings.Index("chicken", "dmr"))
-	// Output:
-	// 4
-	// -1
-}
-
-func ExampleIndexFunc() {
-	f := func(c rune) bool {
-		return unicode.Is(unicode.Han, c)
-	}
-	fmt.Println(strings.IndexFunc("Hello, 世界", f))
-	fmt.Println(strings.IndexFunc("Hello, world", f))
-	// Output:
-	// 7
-	// -1
-}
-
-func ExampleIndexAny() {
-	fmt.Println(strings.IndexAny("chicken", "aeiouy"))
-	fmt.Println(strings.IndexAny("crwth", "aeiouy"))
-	// Output:
-	// 2
-	// -1
-}
-
-func ExampleIndexRune() {
-	fmt.Println(strings.IndexRune("chicken", 'k'))
-	fmt.Println(strings.IndexRune("chicken", 'd'))
-	// Output:
-	// 4
-	// -1
-}
-
-func ExampleLastIndex() {
-	fmt.Println(strings.Index("go gopher", "go"))
-	fmt.Println(strings.LastIndex("go gopher", "go"))
-	fmt.Println(strings.LastIndex("go gopher", "rodent"))
-	// Output:
-	// 0
-	// 3
-	// -1
-}
-
-func ExampleJoin() {
-	s := []string{"foo", "bar", "baz"}
-	fmt.Println(strings.Join(s, ", "))
-	// Output: foo, bar, baz
-}
-
-func ExampleRepeat() {
-	fmt.Println("ba" + strings.Repeat("na", 2))
-	// Output: banana
-}
-
-func ExampleReplace() {
-	fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))
-	fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))
-	// Output:
-	// oinky oinky oink
-	// moo moo moo
-}
-
-func ExampleSplit() {
-	fmt.Printf("%q\n", strings.Split("a,b,c", ","))
-	fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a "))
-	fmt.Printf("%q\n", strings.Split(" xyz ", ""))
-	fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins"))
-	// Output:
-	// ["a" "b" "c"]
-	// ["" "man " "plan " "canal panama"]
-	// [" " "x" "y" "z" " "]
-	// [""]
-}
-
-func ExampleSplitN() {
-	fmt.Printf("%q\n", strings.SplitN("a,b,c", ",", 2))
-	z := strings.SplitN("a,b,c", ",", 0)
-	fmt.Printf("%q (nil = %v)\n", z, z == nil)
-	// Output:
-	// ["a" "b,c"]
-	// [] (nil = true)
-}
-
-func ExampleSplitAfter() {
-	fmt.Printf("%q\n", strings.SplitAfter("a,b,c", ","))
-	// Output: ["a," "b," "c"]
-}
-
-func ExampleSplitAfterN() {
-	fmt.Printf("%q\n", strings.SplitAfterN("a,b,c", ",", 2))
-	// Output: ["a," "b,c"]
-}
-
-func ExampleTitle() {
-	fmt.Println(strings.Title("her royal highness"))
-	// Output: Her Royal Highness
-}
-
-func ExampleToTitle() {
-	fmt.Println(strings.ToTitle("loud noises"))
-	fmt.Println(strings.ToTitle("хлеб"))
-	// Output:
-	// LOUD NOISES
-	// ХЛЕБ
-}
-
-func ExampleTrim() {
-	fmt.Printf("[%q]", strings.Trim(" !!! Achtung! Achtung! !!! ", "! "))
-	// Output: ["Achtung! Achtung"]
-}
-
-func ExampleMap() {
-	rot13 := func(r rune) rune {
-		switch {
-		case r >= 'A' && r <= 'Z':
-			return 'A' + (r-'A'+13)%26
-		case r >= 'a' && r <= 'z':
-			return 'a' + (r-'a'+13)%26
-		}
-		return r
-	}
-	fmt.Println(strings.Map(rot13, "'Twas brillig and the slithy gopher..."))
-	// Output: 'Gjnf oevyyvt naq gur fyvgul tbcure...
-}
-
-func ExampleTrimSpace() {
-	fmt.Println(strings.TrimSpace(" \t\n a lone gopher \n\t\r\n"))
-	// Output: a lone gopher
-}
-
-func ExampleNewReplacer() {
-	r := strings.NewReplacer("<", "&lt;", ">", "&gt;")
-	fmt.Println(r.Replace("This is <b>HTML</b>!"))
-	// Output: This is &lt;b&gt;HTML&lt;/b&gt;!
-}
-
-func ExampleToUpper() {
-	fmt.Println(strings.ToUpper("Gopher"))
-	// Output: GOPHER
-}
-
-func ExampleToLower() {
-	fmt.Println(strings.ToLower("Gopher"))
-	// Output: gopher
-}
-
-func ExampleTrimSuffix() {
-	var s = "Hello, goodbye, etc!"
-	s = strings.TrimSuffix(s, "goodbye, etc!")
-	s = strings.TrimSuffix(s, "planet")
-	fmt.Print(s, "world!")
-	// Output: Hello, world!
-}
-
-func ExampleTrimPrefix() {
-	var s = "Goodbye,, world!"
-	s = strings.TrimPrefix(s, "Goodbye,")
-	s = strings.TrimPrefix(s, "Howdy,")
-	fmt.Print("Hello" + s)
-	// Output: Hello, world!
-}
diff --git a/third_party/gofrontend/libgo/go/strings/export_test.go b/third_party/gofrontend/libgo/go/strings/export_test.go
deleted file mode 100644
index 17c806a..0000000
--- a/third_party/gofrontend/libgo/go/strings/export_test.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strings
-
-func (r *Replacer) Replacer() interface{} {
-	return r.r
-}
-
-func (r *Replacer) PrintTrie() string {
-	gen := r.r.(*genericReplacer)
-	return gen.printNode(&gen.root, 0)
-}
-
-func (r *genericReplacer) printNode(t *trieNode, depth int) (s string) {
-	if t.priority > 0 {
-		s += "+"
-	} else {
-		s += "-"
-	}
-	s += "\n"
-
-	if t.prefix != "" {
-		s += Repeat(".", depth) + t.prefix
-		s += r.printNode(t.next, depth+len(t.prefix))
-	} else if t.table != nil {
-		for b, m := range r.mapping {
-			if int(m) != r.tableSize && t.table[m] != nil {
-				s += Repeat(".", depth) + string([]byte{byte(b)})
-				s += r.printNode(t.table[m], depth+1)
-			}
-		}
-	}
-	return
-}
-
-func StringFind(pattern, text string) int {
-	return makeStringFinder(pattern).next(text)
-}
-
-func DumpTables(pattern string) ([]int, []int) {
-	finder := makeStringFinder(pattern)
-	return finder.badCharSkip[:], finder.goodSuffixSkip
-}
diff --git a/third_party/gofrontend/libgo/go/strings/indexbyte.c b/third_party/gofrontend/libgo/go/strings/indexbyte.c
deleted file mode 100644
index 27f4240..0000000
--- a/third_party/gofrontend/libgo/go/strings/indexbyte.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* indexbyte.c -- implement strings.IndexByte for Go.
-
-   Copyright 2013 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-
-#include "runtime.h"
-#include "go-string.h"
-
-/* This is in C so that the compiler can optimize it appropriately.
-   We deliberately don't split the stack in case it does call the
-   library function, which shouldn't need much stack space.  */
-
-intgo IndexByte (String, char)
-  __asm__ (GOSYM_PREFIX "strings.IndexByte")
-  __attribute__ ((no_split_stack));
-
-intgo
-IndexByte (String s, char b)
-{
-  const char *p;
-
-  p = __builtin_memchr ((const char *) s.str, b, s.len);
-  if (p == NULL)
-    return -1;
-  return p - (const char *) s.str;
-}
diff --git a/third_party/gofrontend/libgo/go/strings/reader.go b/third_party/gofrontend/libgo/go/strings/reader.go
deleted file mode 100644
index 7a872fb..0000000
--- a/third_party/gofrontend/libgo/go/strings/reader.go
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strings
-
-import (
-	"errors"
-	"io"
-	"unicode/utf8"
-)
-
-// A Reader implements the io.Reader, io.ReaderAt, io.Seeker, io.WriterTo,
-// io.ByteScanner, and io.RuneScanner interfaces by reading
-// from a string.
-type Reader struct {
-	s        string
-	i        int64 // current reading index
-	prevRune int   // index of previous rune; or < 0
-}
-
-// Len returns the number of bytes of the unread portion of the
-// string.
-func (r *Reader) Len() int {
-	if r.i >= int64(len(r.s)) {
-		return 0
-	}
-	return int(int64(len(r.s)) - r.i)
-}
-
-// Size returns the original length of the underlying string.
-// Size is the number of bytes available for reading via ReadAt.
-// The returned value is always the same and is not affected by calls
-// to any other method.
-func (r *Reader) Size() int64 { return int64(len(r.s)) }
-
-func (r *Reader) Read(b []byte) (n int, err error) {
-	if len(b) == 0 {
-		return 0, nil
-	}
-	if r.i >= int64(len(r.s)) {
-		return 0, io.EOF
-	}
-	r.prevRune = -1
-	n = copy(b, r.s[r.i:])
-	r.i += int64(n)
-	return
-}
-
-func (r *Reader) ReadAt(b []byte, off int64) (n int, err error) {
-	// cannot modify state - see io.ReaderAt
-	if off < 0 {
-		return 0, errors.New("strings.Reader.ReadAt: negative offset")
-	}
-	if off >= int64(len(r.s)) {
-		return 0, io.EOF
-	}
-	n = copy(b, r.s[off:])
-	if n < len(b) {
-		err = io.EOF
-	}
-	return
-}
-
-func (r *Reader) ReadByte() (b byte, err error) {
-	r.prevRune = -1
-	if r.i >= int64(len(r.s)) {
-		return 0, io.EOF
-	}
-	b = r.s[r.i]
-	r.i++
-	return
-}
-
-func (r *Reader) UnreadByte() error {
-	r.prevRune = -1
-	if r.i <= 0 {
-		return errors.New("strings.Reader.UnreadByte: at beginning of string")
-	}
-	r.i--
-	return nil
-}
-
-func (r *Reader) ReadRune() (ch rune, size int, err error) {
-	if r.i >= int64(len(r.s)) {
-		r.prevRune = -1
-		return 0, 0, io.EOF
-	}
-	r.prevRune = int(r.i)
-	if c := r.s[r.i]; c < utf8.RuneSelf {
-		r.i++
-		return rune(c), 1, nil
-	}
-	ch, size = utf8.DecodeRuneInString(r.s[r.i:])
-	r.i += int64(size)
-	return
-}
-
-func (r *Reader) UnreadRune() error {
-	if r.prevRune < 0 {
-		return errors.New("strings.Reader.UnreadRune: previous operation was not ReadRune")
-	}
-	r.i = int64(r.prevRune)
-	r.prevRune = -1
-	return nil
-}
-
-// Seek implements the io.Seeker interface.
-func (r *Reader) Seek(offset int64, whence int) (int64, error) {
-	r.prevRune = -1
-	var abs int64
-	switch whence {
-	case 0:
-		abs = offset
-	case 1:
-		abs = int64(r.i) + offset
-	case 2:
-		abs = int64(len(r.s)) + offset
-	default:
-		return 0, errors.New("strings.Reader.Seek: invalid whence")
-	}
-	if abs < 0 {
-		return 0, errors.New("strings.Reader.Seek: negative position")
-	}
-	r.i = abs
-	return abs, nil
-}
-
-// WriteTo implements the io.WriterTo interface.
-func (r *Reader) WriteTo(w io.Writer) (n int64, err error) {
-	r.prevRune = -1
-	if r.i >= int64(len(r.s)) {
-		return 0, nil
-	}
-	s := r.s[r.i:]
-	m, err := io.WriteString(w, s)
-	if m > len(s) {
-		panic("strings.Reader.WriteTo: invalid WriteString count")
-	}
-	r.i += int64(m)
-	n = int64(m)
-	if m != len(s) && err == nil {
-		err = io.ErrShortWrite
-	}
-	return
-}
-
-// NewReader returns a new Reader reading from s.
-// It is similar to bytes.NewBufferString but more efficient and read-only.
-func NewReader(s string) *Reader { return &Reader{s, 0, -1} }
diff --git a/third_party/gofrontend/libgo/go/strings/reader_test.go b/third_party/gofrontend/libgo/go/strings/reader_test.go
deleted file mode 100644
index 5003a37..0000000
--- a/third_party/gofrontend/libgo/go/strings/reader_test.go
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strings_test
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"os"
-	"strings"
-	"sync"
-	"testing"
-)
-
-func TestReader(t *testing.T) {
-	r := strings.NewReader("0123456789")
-	tests := []struct {
-		off     int64
-		seek    int
-		n       int
-		want    string
-		wantpos int64
-		seekerr string
-	}{
-		{seek: os.SEEK_SET, off: 0, n: 20, want: "0123456789"},
-		{seek: os.SEEK_SET, off: 1, n: 1, want: "1"},
-		{seek: os.SEEK_CUR, off: 1, wantpos: 3, n: 2, want: "34"},
-		{seek: os.SEEK_SET, off: -1, seekerr: "strings.Reader.Seek: negative position"},
-		{seek: os.SEEK_SET, off: 1 << 33, wantpos: 1 << 33},
-		{seek: os.SEEK_CUR, off: 1, wantpos: 1<<33 + 1},
-		{seek: os.SEEK_SET, n: 5, want: "01234"},
-		{seek: os.SEEK_CUR, n: 5, want: "56789"},
-		{seek: os.SEEK_END, off: -1, n: 1, wantpos: 9, want: "9"},
-	}
-
-	for i, tt := range tests {
-		pos, err := r.Seek(tt.off, tt.seek)
-		if err == nil && tt.seekerr != "" {
-			t.Errorf("%d. want seek error %q", i, tt.seekerr)
-			continue
-		}
-		if err != nil && err.Error() != tt.seekerr {
-			t.Errorf("%d. seek error = %q; want %q", i, err.Error(), tt.seekerr)
-			continue
-		}
-		if tt.wantpos != 0 && tt.wantpos != pos {
-			t.Errorf("%d. pos = %d, want %d", i, pos, tt.wantpos)
-		}
-		buf := make([]byte, tt.n)
-		n, err := r.Read(buf)
-		if err != nil {
-			t.Errorf("%d. read = %v", i, err)
-			continue
-		}
-		got := string(buf[:n])
-		if got != tt.want {
-			t.Errorf("%d. got %q; want %q", i, got, tt.want)
-		}
-	}
-}
-
-func TestReadAfterBigSeek(t *testing.T) {
-	r := strings.NewReader("0123456789")
-	if _, err := r.Seek(1<<31+5, os.SEEK_SET); err != nil {
-		t.Fatal(err)
-	}
-	if n, err := r.Read(make([]byte, 10)); n != 0 || err != io.EOF {
-		t.Errorf("Read = %d, %v; want 0, EOF", n, err)
-	}
-}
-
-func TestReaderAt(t *testing.T) {
-	r := strings.NewReader("0123456789")
-	tests := []struct {
-		off     int64
-		n       int
-		want    string
-		wanterr interface{}
-	}{
-		{0, 10, "0123456789", nil},
-		{1, 10, "123456789", io.EOF},
-		{1, 9, "123456789", nil},
-		{11, 10, "", io.EOF},
-		{0, 0, "", nil},
-		{-1, 0, "", "strings.Reader.ReadAt: negative offset"},
-	}
-	for i, tt := range tests {
-		b := make([]byte, tt.n)
-		rn, err := r.ReadAt(b, tt.off)
-		got := string(b[:rn])
-		if got != tt.want {
-			t.Errorf("%d. got %q; want %q", i, got, tt.want)
-		}
-		if fmt.Sprintf("%v", err) != fmt.Sprintf("%v", tt.wanterr) {
-			t.Errorf("%d. got error = %v; want %v", i, err, tt.wanterr)
-		}
-	}
-}
-
-func TestReaderAtConcurrent(t *testing.T) {
-	// Test for the race detector, to verify ReadAt doesn't mutate
-	// any state.
-	r := strings.NewReader("0123456789")
-	var wg sync.WaitGroup
-	for i := 0; i < 5; i++ {
-		wg.Add(1)
-		go func(i int) {
-			defer wg.Done()
-			var buf [1]byte
-			r.ReadAt(buf[:], int64(i))
-		}(i)
-	}
-	wg.Wait()
-}
-
-func TestEmptyReaderConcurrent(t *testing.T) {
-	// Test for the race detector, to verify a Read that doesn't yield any bytes
-	// is okay to use from multiple goroutines. This was our historic behavior.
-	// See golang.org/issue/7856
-	r := strings.NewReader("")
-	var wg sync.WaitGroup
-	for i := 0; i < 5; i++ {
-		wg.Add(2)
-		go func() {
-			defer wg.Done()
-			var buf [1]byte
-			r.Read(buf[:])
-		}()
-		go func() {
-			defer wg.Done()
-			r.Read(nil)
-		}()
-	}
-	wg.Wait()
-}
-
-func TestWriteTo(t *testing.T) {
-	const str = "0123456789"
-	for i := 0; i <= len(str); i++ {
-		s := str[i:]
-		r := strings.NewReader(s)
-		var b bytes.Buffer
-		n, err := r.WriteTo(&b)
-		if expect := int64(len(s)); n != expect {
-			t.Errorf("got %v; want %v", n, expect)
-		}
-		if err != nil {
-			t.Errorf("for length %d: got error = %v; want nil", len(s), err)
-		}
-		if b.String() != s {
-			t.Errorf("got string %q; want %q", b.String(), s)
-		}
-		if r.Len() != 0 {
-			t.Errorf("reader contains %v bytes; want 0", r.Len())
-		}
-	}
-}
-
-// tests that Len is affected by reads, but Size is not.
-func TestReaderLenSize(t *testing.T) {
-	r := strings.NewReader("abc")
-	io.CopyN(ioutil.Discard, r, 1)
-	if r.Len() != 2 {
-		t.Errorf("Len = %d; want 2", r.Len())
-	}
-	if r.Size() != 3 {
-		t.Errorf("Size = %d; want 3", r.Size())
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/strings/replace.go b/third_party/gofrontend/libgo/go/strings/replace.go
deleted file mode 100644
index 4752641..0000000
--- a/third_party/gofrontend/libgo/go/strings/replace.go
+++ /dev/null
@@ -1,518 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strings
-
-import "io"
-
-// Replacer replaces a list of strings with replacements.
-// It is safe for concurrent use by multiple goroutines.
-type Replacer struct {
-	r replacer
-}
-
-// replacer is the interface that a replacement algorithm needs to implement.
-type replacer interface {
-	Replace(s string) string
-	WriteString(w io.Writer, s string) (n int, err error)
-}
-
-// NewReplacer returns a new Replacer from a list of old, new string pairs.
-// Replacements are performed in order, without overlapping matches.
-func NewReplacer(oldnew ...string) *Replacer {
-	if len(oldnew)%2 == 1 {
-		panic("strings.NewReplacer: odd argument count")
-	}
-
-	if len(oldnew) == 2 && len(oldnew[0]) > 1 {
-		return &Replacer{r: makeSingleStringReplacer(oldnew[0], oldnew[1])}
-	}
-
-	allNewBytes := true
-	for i := 0; i < len(oldnew); i += 2 {
-		if len(oldnew[i]) != 1 {
-			return &Replacer{r: makeGenericReplacer(oldnew)}
-		}
-		if len(oldnew[i+1]) != 1 {
-			allNewBytes = false
-		}
-	}
-
-	if allNewBytes {
-		r := byteReplacer{}
-		for i := range r {
-			r[i] = byte(i)
-		}
-		// The first occurrence of old->new map takes precedence
-		// over the others with the same old string.
-		for i := len(oldnew) - 2; i >= 0; i -= 2 {
-			o := oldnew[i][0]
-			n := oldnew[i+1][0]
-			r[o] = n
-		}
-		return &Replacer{r: &r}
-	}
-
-	r := byteStringReplacer{}
-	// The first occurrence of old->new map takes precedence
-	// over the others with the same old string.
-	for i := len(oldnew) - 2; i >= 0; i -= 2 {
-		o := oldnew[i][0]
-		n := oldnew[i+1]
-		r[o] = []byte(n)
-	}
-	return &Replacer{r: &r}
-}
-
-// Replace returns a copy of s with all replacements performed.
-func (r *Replacer) Replace(s string) string {
-	return r.r.Replace(s)
-}
-
-// WriteString writes s to w with all replacements performed.
-func (r *Replacer) WriteString(w io.Writer, s string) (n int, err error) {
-	return r.r.WriteString(w, s)
-}
-
-// trieNode is a node in a lookup trie for prioritized key/value pairs. Keys
-// and values may be empty. For example, the trie containing keys "ax", "ay",
-// "bcbc", "x" and "xy" could have eight nodes:
-//
-//  n0  -
-//  n1  a-
-//  n2  .x+
-//  n3  .y+
-//  n4  b-
-//  n5  .cbc+
-//  n6  x+
-//  n7  .y+
-//
-// n0 is the root node, and its children are n1, n4 and n6; n1's children are
-// n2 and n3; n4's child is n5; n6's child is n7. Nodes n0, n1 and n4 (marked
-// with a trailing "-") are partial keys, and nodes n2, n3, n5, n6 and n7
-// (marked with a trailing "+") are complete keys.
-type trieNode struct {
-	// value is the value of the trie node's key/value pair. It is empty if
-	// this node is not a complete key.
-	value string
-	// priority is the priority (higher is more important) of the trie node's
-	// key/value pair; keys are not necessarily matched shortest- or longest-
-	// first. Priority is positive if this node is a complete key, and zero
-	// otherwise. In the example above, positive/zero priorities are marked
-	// with a trailing "+" or "-".
-	priority int
-
-	// A trie node may have zero, one or more child nodes:
-	//  * if the remaining fields are zero, there are no children.
-	//  * if prefix and next are non-zero, there is one child in next.
-	//  * if table is non-zero, it defines all the children.
-	//
-	// Prefixes are preferred over tables when there is one child, but the
-	// root node always uses a table for lookup efficiency.
-
-	// prefix is the difference in keys between this trie node and the next.
-	// In the example above, node n4 has prefix "cbc" and n4's next node is n5.
-	// Node n5 has no children and so has zero prefix, next and table fields.
-	prefix string
-	next   *trieNode
-
-	// table is a lookup table indexed by the next byte in the key, after
-	// remapping that byte through genericReplacer.mapping to create a dense
-	// index. In the example above, the keys only use 'a', 'b', 'c', 'x' and
-	// 'y', which remap to 0, 1, 2, 3 and 4. All other bytes remap to 5, and
-	// genericReplacer.tableSize will be 5. Node n0's table will be
-	// []*trieNode{ 0:n1, 1:n4, 3:n6 }, where the 0, 1 and 3 are the remapped
-	// 'a', 'b' and 'x'.
-	table []*trieNode
-}
-
-func (t *trieNode) add(key, val string, priority int, r *genericReplacer) {
-	if key == "" {
-		if t.priority == 0 {
-			t.value = val
-			t.priority = priority
-		}
-		return
-	}
-
-	if t.prefix != "" {
-		// Need to split the prefix among multiple nodes.
-		var n int // length of the longest common prefix
-		for ; n < len(t.prefix) && n < len(key); n++ {
-			if t.prefix[n] != key[n] {
-				break
-			}
-		}
-		if n == len(t.prefix) {
-			t.next.add(key[n:], val, priority, r)
-		} else if n == 0 {
-			// First byte differs, start a new lookup table here. Looking up
-			// what is currently t.prefix[0] will lead to prefixNode, and
-			// looking up key[0] will lead to keyNode.
-			var prefixNode *trieNode
-			if len(t.prefix) == 1 {
-				prefixNode = t.next
-			} else {
-				prefixNode = &trieNode{
-					prefix: t.prefix[1:],
-					next:   t.next,
-				}
-			}
-			keyNode := new(trieNode)
-			t.table = make([]*trieNode, r.tableSize)
-			t.table[r.mapping[t.prefix[0]]] = prefixNode
-			t.table[r.mapping[key[0]]] = keyNode
-			t.prefix = ""
-			t.next = nil
-			keyNode.add(key[1:], val, priority, r)
-		} else {
-			// Insert new node after the common section of the prefix.
-			next := &trieNode{
-				prefix: t.prefix[n:],
-				next:   t.next,
-			}
-			t.prefix = t.prefix[:n]
-			t.next = next
-			next.add(key[n:], val, priority, r)
-		}
-	} else if t.table != nil {
-		// Insert into existing table.
-		m := r.mapping[key[0]]
-		if t.table[m] == nil {
-			t.table[m] = new(trieNode)
-		}
-		t.table[m].add(key[1:], val, priority, r)
-	} else {
-		t.prefix = key
-		t.next = new(trieNode)
-		t.next.add("", val, priority, r)
-	}
-}
-
-func (r *genericReplacer) lookup(s string, ignoreRoot bool) (val string, keylen int, found bool) {
-	// Iterate down the trie to the end, and grab the value and keylen with
-	// the highest priority.
-	bestPriority := 0
-	node := &r.root
-	n := 0
-	for node != nil {
-		if node.priority > bestPriority && !(ignoreRoot && node == &r.root) {
-			bestPriority = node.priority
-			val = node.value
-			keylen = n
-			found = true
-		}
-
-		if s == "" {
-			break
-		}
-		if node.table != nil {
-			index := r.mapping[s[0]]
-			if int(index) == r.tableSize {
-				break
-			}
-			node = node.table[index]
-			s = s[1:]
-			n++
-		} else if node.prefix != "" && HasPrefix(s, node.prefix) {
-			n += len(node.prefix)
-			s = s[len(node.prefix):]
-			node = node.next
-		} else {
-			break
-		}
-	}
-	return
-}
-
-// genericReplacer is the fully generic algorithm.
-// It's used as a fallback when nothing faster can be used.
-type genericReplacer struct {
-	root trieNode
-	// tableSize is the size of a trie node's lookup table. It is the number
-	// of unique key bytes.
-	tableSize int
-	// mapping maps from key bytes to a dense index for trieNode.table.
-	mapping [256]byte
-}
-
-func makeGenericReplacer(oldnew []string) *genericReplacer {
-	r := new(genericReplacer)
-	// Find each byte used, then assign them each an index.
-	for i := 0; i < len(oldnew); i += 2 {
-		key := oldnew[i]
-		for j := 0; j < len(key); j++ {
-			r.mapping[key[j]] = 1
-		}
-	}
-
-	for _, b := range r.mapping {
-		r.tableSize += int(b)
-	}
-
-	var index byte
-	for i, b := range r.mapping {
-		if b == 0 {
-			r.mapping[i] = byte(r.tableSize)
-		} else {
-			r.mapping[i] = index
-			index++
-		}
-	}
-	// Ensure root node uses a lookup table (for performance).
-	r.root.table = make([]*trieNode, r.tableSize)
-
-	for i := 0; i < len(oldnew); i += 2 {
-		r.root.add(oldnew[i], oldnew[i+1], len(oldnew)-i, r)
-	}
-	return r
-}
-
-type appendSliceWriter []byte
-
-// Write writes to the buffer to satisfy io.Writer.
-func (w *appendSliceWriter) Write(p []byte) (int, error) {
-	*w = append(*w, p...)
-	return len(p), nil
-}
-
-// WriteString writes to the buffer without string->[]byte->string allocations.
-func (w *appendSliceWriter) WriteString(s string) (int, error) {
-	*w = append(*w, s...)
-	return len(s), nil
-}
-
-type stringWriterIface interface {
-	WriteString(string) (int, error)
-}
-
-type stringWriter struct {
-	w io.Writer
-}
-
-func (w stringWriter) WriteString(s string) (int, error) {
-	return w.w.Write([]byte(s))
-}
-
-func getStringWriter(w io.Writer) stringWriterIface {
-	sw, ok := w.(stringWriterIface)
-	if !ok {
-		sw = stringWriter{w}
-	}
-	return sw
-}
-
-func (r *genericReplacer) Replace(s string) string {
-	buf := make(appendSliceWriter, 0, len(s))
-	r.WriteString(&buf, s)
-	return string(buf)
-}
-
-func (r *genericReplacer) WriteString(w io.Writer, s string) (n int, err error) {
-	sw := getStringWriter(w)
-	var last, wn int
-	var prevMatchEmpty bool
-	for i := 0; i <= len(s); {
-		// Fast path: s[i] is not a prefix of any pattern.
-		if i != len(s) && r.root.priority == 0 {
-			index := int(r.mapping[s[i]])
-			if index == r.tableSize || r.root.table[index] == nil {
-				i++
-				continue
-			}
-		}
-
-		// Ignore the empty match iff the previous loop found the empty match.
-		val, keylen, match := r.lookup(s[i:], prevMatchEmpty)
-		prevMatchEmpty = match && keylen == 0
-		if match {
-			wn, err = sw.WriteString(s[last:i])
-			n += wn
-			if err != nil {
-				return
-			}
-			wn, err = sw.WriteString(val)
-			n += wn
-			if err != nil {
-				return
-			}
-			i += keylen
-			last = i
-			continue
-		}
-		i++
-	}
-	if last != len(s) {
-		wn, err = sw.WriteString(s[last:])
-		n += wn
-	}
-	return
-}
-
-// singleStringReplacer is the implementation that's used when there is only
-// one string to replace (and that string has more than one byte).
-type singleStringReplacer struct {
-	finder *stringFinder
-	// value is the new string that replaces that pattern when it's found.
-	value string
-}
-
-func makeSingleStringReplacer(pattern string, value string) *singleStringReplacer {
-	return &singleStringReplacer{finder: makeStringFinder(pattern), value: value}
-}
-
-func (r *singleStringReplacer) Replace(s string) string {
-	var buf []byte
-	i, matched := 0, false
-	for {
-		match := r.finder.next(s[i:])
-		if match == -1 {
-			break
-		}
-		matched = true
-		buf = append(buf, s[i:i+match]...)
-		buf = append(buf, r.value...)
-		i += match + len(r.finder.pattern)
-	}
-	if !matched {
-		return s
-	}
-	buf = append(buf, s[i:]...)
-	return string(buf)
-}
-
-func (r *singleStringReplacer) WriteString(w io.Writer, s string) (n int, err error) {
-	sw := getStringWriter(w)
-	var i, wn int
-	for {
-		match := r.finder.next(s[i:])
-		if match == -1 {
-			break
-		}
-		wn, err = sw.WriteString(s[i : i+match])
-		n += wn
-		if err != nil {
-			return
-		}
-		wn, err = sw.WriteString(r.value)
-		n += wn
-		if err != nil {
-			return
-		}
-		i += match + len(r.finder.pattern)
-	}
-	wn, err = sw.WriteString(s[i:])
-	n += wn
-	return
-}
-
-// byteReplacer is the implementation that's used when all the "old"
-// and "new" values are single ASCII bytes.
-// The array contains replacement bytes indexed by old byte.
-type byteReplacer [256]byte
-
-func (r *byteReplacer) Replace(s string) string {
-	var buf []byte // lazily allocated
-	for i := 0; i < len(s); i++ {
-		b := s[i]
-		if r[b] != b {
-			if buf == nil {
-				buf = []byte(s)
-			}
-			buf[i] = r[b]
-		}
-	}
-	if buf == nil {
-		return s
-	}
-	return string(buf)
-}
-
-func (r *byteReplacer) WriteString(w io.Writer, s string) (n int, err error) {
-	// TODO(bradfitz): use io.WriteString with slices of s, avoiding allocation.
-	bufsize := 32 << 10
-	if len(s) < bufsize {
-		bufsize = len(s)
-	}
-	buf := make([]byte, bufsize)
-
-	for len(s) > 0 {
-		ncopy := copy(buf, s[:])
-		s = s[ncopy:]
-		for i, b := range buf[:ncopy] {
-			buf[i] = r[b]
-		}
-		wn, err := w.Write(buf[:ncopy])
-		n += wn
-		if err != nil {
-			return n, err
-		}
-	}
-	return n, nil
-}
-
-// byteStringReplacer is the implementation that's used when all the
-// "old" values are single ASCII bytes but the "new" values vary in size.
-// The array contains replacement byte slices indexed by old byte.
-// A nil []byte means that the old byte should not be replaced.
-type byteStringReplacer [256][]byte
-
-func (r *byteStringReplacer) Replace(s string) string {
-	newSize := len(s)
-	anyChanges := false
-	for i := 0; i < len(s); i++ {
-		b := s[i]
-		if r[b] != nil {
-			anyChanges = true
-			// The -1 is because we are replacing 1 byte with len(r[b]) bytes.
-			newSize += len(r[b]) - 1
-		}
-	}
-	if !anyChanges {
-		return s
-	}
-	buf := make([]byte, newSize)
-	bi := buf
-	for i := 0; i < len(s); i++ {
-		b := s[i]
-		if r[b] != nil {
-			n := copy(bi, r[b])
-			bi = bi[n:]
-		} else {
-			bi[0] = b
-			bi = bi[1:]
-		}
-	}
-	return string(buf)
-}
-
-func (r *byteStringReplacer) WriteString(w io.Writer, s string) (n int, err error) {
-	sw := getStringWriter(w)
-	last := 0
-	for i := 0; i < len(s); i++ {
-		b := s[i]
-		if r[b] == nil {
-			continue
-		}
-		if last != i {
-			nw, err := sw.WriteString(s[last:i])
-			n += nw
-			if err != nil {
-				return n, err
-			}
-		}
-		last = i + 1
-		nw, err := w.Write(r[b])
-		n += nw
-		if err != nil {
-			return n, err
-		}
-	}
-	if last != len(s) {
-		var nw int
-		nw, err = sw.WriteString(s[last:])
-		n += nw
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/strings/replace_test.go b/third_party/gofrontend/libgo/go/strings/replace_test.go
deleted file mode 100644
index 77e48b9..0000000
--- a/third_party/gofrontend/libgo/go/strings/replace_test.go
+++ /dev/null
@@ -1,542 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strings_test
-
-import (
-	"bytes"
-	"fmt"
-	. "strings"
-	"testing"
-)
-
-var htmlEscaper = NewReplacer(
-	"&", "&amp;",
-	"<", "&lt;",
-	">", "&gt;",
-	`"`, "&quot;",
-	"'", "&apos;",
-)
-
-var htmlUnescaper = NewReplacer(
-	"&amp;", "&",
-	"&lt;", "<",
-	"&gt;", ">",
-	"&quot;", `"`,
-	"&apos;", "'",
-)
-
-// The http package's old HTML escaping function.
-func oldHTMLEscape(s string) string {
-	s = Replace(s, "&", "&amp;", -1)
-	s = Replace(s, "<", "&lt;", -1)
-	s = Replace(s, ">", "&gt;", -1)
-	s = Replace(s, `"`, "&quot;", -1)
-	s = Replace(s, "'", "&apos;", -1)
-	return s
-}
-
-var capitalLetters = NewReplacer("a", "A", "b", "B")
-
-// TestReplacer tests the replacer implementations.
-func TestReplacer(t *testing.T) {
-	type testCase struct {
-		r       *Replacer
-		in, out string
-	}
-	var testCases []testCase
-
-	// str converts 0xff to "\xff". This isn't just string(b) since that converts to UTF-8.
-	str := func(b byte) string {
-		return string([]byte{b})
-	}
-	var s []string
-
-	// inc maps "\x00"->"\x01", ..., "a"->"b", "b"->"c", ..., "\xff"->"\x00".
-	s = nil
-	for i := 0; i < 256; i++ {
-		s = append(s, str(byte(i)), str(byte(i+1)))
-	}
-	inc := NewReplacer(s...)
-
-	// Test cases with 1-byte old strings, 1-byte new strings.
-	testCases = append(testCases,
-		testCase{capitalLetters, "brad", "BrAd"},
-		testCase{capitalLetters, Repeat("a", (32<<10)+123), Repeat("A", (32<<10)+123)},
-		testCase{capitalLetters, "", ""},
-
-		testCase{inc, "brad", "csbe"},
-		testCase{inc, "\x00\xff", "\x01\x00"},
-		testCase{inc, "", ""},
-
-		testCase{NewReplacer("a", "1", "a", "2"), "brad", "br1d"},
-	)
-
-	// repeat maps "a"->"a", "b"->"bb", "c"->"ccc", ...
-	s = nil
-	for i := 0; i < 256; i++ {
-		n := i + 1 - 'a'
-		if n < 1 {
-			n = 1
-		}
-		s = append(s, str(byte(i)), Repeat(str(byte(i)), n))
-	}
-	repeat := NewReplacer(s...)
-
-	// Test cases with 1-byte old strings, variable length new strings.
-	testCases = append(testCases,
-		testCase{htmlEscaper, "No changes", "No changes"},
-		testCase{htmlEscaper, "I <3 escaping & stuff", "I &lt;3 escaping &amp; stuff"},
-		testCase{htmlEscaper, "&&&", "&amp;&amp;&amp;"},
-		testCase{htmlEscaper, "", ""},
-
-		testCase{repeat, "brad", "bbrrrrrrrrrrrrrrrrrradddd"},
-		testCase{repeat, "abba", "abbbba"},
-		testCase{repeat, "", ""},
-
-		testCase{NewReplacer("a", "11", "a", "22"), "brad", "br11d"},
-	)
-
-	// The remaining test cases have variable length old strings.
-
-	testCases = append(testCases,
-		testCase{htmlUnescaper, "&amp;amp;", "&amp;"},
-		testCase{htmlUnescaper, "&lt;b&gt;HTML&apos;s neat&lt;/b&gt;", "<b>HTML's neat</b>"},
-		testCase{htmlUnescaper, "", ""},
-
-		testCase{NewReplacer("a", "1", "a", "2", "xxx", "xxx"), "brad", "br1d"},
-
-		testCase{NewReplacer("a", "1", "aa", "2", "aaa", "3"), "aaaa", "1111"},
-
-		testCase{NewReplacer("aaa", "3", "aa", "2", "a", "1"), "aaaa", "31"},
-	)
-
-	// gen1 has multiple old strings of variable length. There is no
-	// overall non-empty common prefix, but some pairwise common prefixes.
-	gen1 := NewReplacer(
-		"aaa", "3[aaa]",
-		"aa", "2[aa]",
-		"a", "1[a]",
-		"i", "i",
-		"longerst", "most long",
-		"longer", "medium",
-		"long", "short",
-		"xx", "xx",
-		"x", "X",
-		"X", "Y",
-		"Y", "Z",
-	)
-	testCases = append(testCases,
-		testCase{gen1, "fooaaabar", "foo3[aaa]b1[a]r"},
-		testCase{gen1, "long, longerst, longer", "short, most long, medium"},
-		testCase{gen1, "xxxxx", "xxxxX"},
-		testCase{gen1, "XiX", "YiY"},
-		testCase{gen1, "", ""},
-	)
-
-	// gen2 has multiple old strings with no pairwise common prefix.
-	gen2 := NewReplacer(
-		"roses", "red",
-		"violets", "blue",
-		"sugar", "sweet",
-	)
-	testCases = append(testCases,
-		testCase{gen2, "roses are red, violets are blue...", "red are red, blue are blue..."},
-		testCase{gen2, "", ""},
-	)
-
-	// gen3 has multiple old strings with an overall common prefix.
-	gen3 := NewReplacer(
-		"abracadabra", "poof",
-		"abracadabrakazam", "splat",
-		"abraham", "lincoln",
-		"abrasion", "scrape",
-		"abraham", "isaac",
-	)
-	testCases = append(testCases,
-		testCase{gen3, "abracadabrakazam abraham", "poofkazam lincoln"},
-		testCase{gen3, "abrasion abracad", "scrape abracad"},
-		testCase{gen3, "abba abram abrasive", "abba abram abrasive"},
-		testCase{gen3, "", ""},
-	)
-
-	// foo{1,2,3,4} have multiple old strings with an overall common prefix
-	// and 1- or 2- byte extensions from the common prefix.
-	foo1 := NewReplacer(
-		"foo1", "A",
-		"foo2", "B",
-		"foo3", "C",
-	)
-	foo2 := NewReplacer(
-		"foo1", "A",
-		"foo2", "B",
-		"foo31", "C",
-		"foo32", "D",
-	)
-	foo3 := NewReplacer(
-		"foo11", "A",
-		"foo12", "B",
-		"foo31", "C",
-		"foo32", "D",
-	)
-	foo4 := NewReplacer(
-		"foo12", "B",
-		"foo32", "D",
-	)
-	testCases = append(testCases,
-		testCase{foo1, "fofoofoo12foo32oo", "fofooA2C2oo"},
-		testCase{foo1, "", ""},
-
-		testCase{foo2, "fofoofoo12foo32oo", "fofooA2Doo"},
-		testCase{foo2, "", ""},
-
-		testCase{foo3, "fofoofoo12foo32oo", "fofooBDoo"},
-		testCase{foo3, "", ""},
-
-		testCase{foo4, "fofoofoo12foo32oo", "fofooBDoo"},
-		testCase{foo4, "", ""},
-	)
-
-	// genAll maps "\x00\x01\x02...\xfe\xff" to "[all]", amongst other things.
-	allBytes := make([]byte, 256)
-	for i := range allBytes {
-		allBytes[i] = byte(i)
-	}
-	allString := string(allBytes)
-	genAll := NewReplacer(
-		allString, "[all]",
-		"\xff", "[ff]",
-		"\x00", "[00]",
-	)
-	testCases = append(testCases,
-		testCase{genAll, allString, "[all]"},
-		testCase{genAll, "a\xff" + allString + "\x00", "a[ff][all][00]"},
-		testCase{genAll, "", ""},
-	)
-
-	// Test cases with empty old strings.
-
-	blankToX1 := NewReplacer("", "X")
-	blankToX2 := NewReplacer("", "X", "", "")
-	blankHighPriority := NewReplacer("", "X", "o", "O")
-	blankLowPriority := NewReplacer("o", "O", "", "X")
-	blankNoOp1 := NewReplacer("", "")
-	blankNoOp2 := NewReplacer("", "", "", "A")
-	blankFoo := NewReplacer("", "X", "foobar", "R", "foobaz", "Z")
-	testCases = append(testCases,
-		testCase{blankToX1, "foo", "XfXoXoX"},
-		testCase{blankToX1, "", "X"},
-
-		testCase{blankToX2, "foo", "XfXoXoX"},
-		testCase{blankToX2, "", "X"},
-
-		testCase{blankHighPriority, "oo", "XOXOX"},
-		testCase{blankHighPriority, "ii", "XiXiX"},
-		testCase{blankHighPriority, "oiio", "XOXiXiXOX"},
-		testCase{blankHighPriority, "iooi", "XiXOXOXiX"},
-		testCase{blankHighPriority, "", "X"},
-
-		testCase{blankLowPriority, "oo", "OOX"},
-		testCase{blankLowPriority, "ii", "XiXiX"},
-		testCase{blankLowPriority, "oiio", "OXiXiOX"},
-		testCase{blankLowPriority, "iooi", "XiOOXiX"},
-		testCase{blankLowPriority, "", "X"},
-
-		testCase{blankNoOp1, "foo", "foo"},
-		testCase{blankNoOp1, "", ""},
-
-		testCase{blankNoOp2, "foo", "foo"},
-		testCase{blankNoOp2, "", ""},
-
-		testCase{blankFoo, "foobarfoobaz", "XRXZX"},
-		testCase{blankFoo, "foobar-foobaz", "XRX-XZX"},
-		testCase{blankFoo, "", "X"},
-	)
-
-	// single string replacer
-
-	abcMatcher := NewReplacer("abc", "[match]")
-
-	testCases = append(testCases,
-		testCase{abcMatcher, "", ""},
-		testCase{abcMatcher, "ab", "ab"},
-		testCase{abcMatcher, "abc", "[match]"},
-		testCase{abcMatcher, "abcd", "[match]d"},
-		testCase{abcMatcher, "cabcabcdabca", "c[match][match]d[match]a"},
-	)
-
-	// Issue 6659 cases (more single string replacer)
-
-	noHello := NewReplacer("Hello", "")
-	testCases = append(testCases,
-		testCase{noHello, "Hello", ""},
-		testCase{noHello, "Hellox", "x"},
-		testCase{noHello, "xHello", "x"},
-		testCase{noHello, "xHellox", "xx"},
-	)
-
-	// No-arg test cases.
-
-	nop := NewReplacer()
-	testCases = append(testCases,
-		testCase{nop, "abc", "abc"},
-		testCase{nop, "", ""},
-	)
-
-	// Run the test cases.
-
-	for i, tc := range testCases {
-		if s := tc.r.Replace(tc.in); s != tc.out {
-			t.Errorf("%d. Replace(%q) = %q, want %q", i, tc.in, s, tc.out)
-		}
-		var buf bytes.Buffer
-		n, err := tc.r.WriteString(&buf, tc.in)
-		if err != nil {
-			t.Errorf("%d. WriteString: %v", i, err)
-			continue
-		}
-		got := buf.String()
-		if got != tc.out {
-			t.Errorf("%d. WriteString(%q) wrote %q, want %q", i, tc.in, got, tc.out)
-			continue
-		}
-		if n != len(tc.out) {
-			t.Errorf("%d. WriteString(%q) wrote correct string but reported %d bytes; want %d (%q)",
-				i, tc.in, n, len(tc.out), tc.out)
-		}
-	}
-}
-
-var algorithmTestCases = []struct {
-	r    *Replacer
-	want string
-}{
-	{capitalLetters, "*strings.byteReplacer"},
-	{htmlEscaper, "*strings.byteStringReplacer"},
-	{NewReplacer("12", "123"), "*strings.singleStringReplacer"},
-	{NewReplacer("1", "12"), "*strings.byteStringReplacer"},
-	{NewReplacer("", "X"), "*strings.genericReplacer"},
-	{NewReplacer("a", "1", "b", "12", "cde", "123"), "*strings.genericReplacer"},
-}
-
-// TestPickAlgorithm tests that NewReplacer picks the correct algorithm.
-func TestPickAlgorithm(t *testing.T) {
-	for i, tc := range algorithmTestCases {
-		got := fmt.Sprintf("%T", tc.r.Replacer())
-		if got != tc.want {
-			t.Errorf("%d. algorithm = %s, want %s", i, got, tc.want)
-		}
-	}
-}
-
-type errWriter struct{}
-
-func (errWriter) Write(p []byte) (n int, err error) {
-	return 0, fmt.Errorf("unwritable")
-}
-
-// TestWriteStringError tests that WriteString returns an error
-// received from the underlying io.Writer.
-func TestWriteStringError(t *testing.T) {
-	for i, tc := range algorithmTestCases {
-		n, err := tc.r.WriteString(errWriter{}, "abc")
-		if n != 0 || err == nil || err.Error() != "unwritable" {
-			t.Errorf("%d. WriteStringError = %d, %v, want 0, unwritable", i, n, err)
-		}
-	}
-}
-
-// TestGenericTrieBuilding verifies the structure of the generated trie. There
-// is one node per line, and the key ending with the current line is in the
-// trie if it ends with a "+".
-func TestGenericTrieBuilding(t *testing.T) {
-	testCases := []struct{ in, out string }{
-		{"abc;abdef;abdefgh;xx;xy;z", `-
-			a-
-			.b-
-			..c+
-			..d-
-			...ef+
-			.....gh+
-			x-
-			.x+
-			.y+
-			z+
-			`},
-		{"abracadabra;abracadabrakazam;abraham;abrasion", `-
-			a-
-			.bra-
-			....c-
-			.....adabra+
-			...........kazam+
-			....h-
-			.....am+
-			....s-
-			.....ion+
-			`},
-		{"aaa;aa;a;i;longerst;longer;long;xx;x;X;Y", `-
-			X+
-			Y+
-			a+
-			.a+
-			..a+
-			i+
-			l-
-			.ong+
-			....er+
-			......st+
-			x+
-			.x+
-			`},
-		{"foo;;foo;foo1", `+
-			f-
-			.oo+
-			...1+
-			`},
-	}
-
-	for _, tc := range testCases {
-		keys := Split(tc.in, ";")
-		args := make([]string, len(keys)*2)
-		for i, key := range keys {
-			args[i*2] = key
-		}
-
-		got := NewReplacer(args...).PrintTrie()
-		// Remove tabs from tc.out
-		wantbuf := make([]byte, 0, len(tc.out))
-		for i := 0; i < len(tc.out); i++ {
-			if tc.out[i] != '\t' {
-				wantbuf = append(wantbuf, tc.out[i])
-			}
-		}
-		want := string(wantbuf)
-
-		if got != want {
-			t.Errorf("PrintTrie(%q)\ngot\n%swant\n%s", tc.in, got, want)
-		}
-	}
-}
-
-func BenchmarkGenericNoMatch(b *testing.B) {
-	str := Repeat("A", 100) + Repeat("B", 100)
-	generic := NewReplacer("a", "A", "b", "B", "12", "123") // varying lengths forces generic
-	for i := 0; i < b.N; i++ {
-		generic.Replace(str)
-	}
-}
-
-func BenchmarkGenericMatch1(b *testing.B) {
-	str := Repeat("a", 100) + Repeat("b", 100)
-	generic := NewReplacer("a", "A", "b", "B", "12", "123")
-	for i := 0; i < b.N; i++ {
-		generic.Replace(str)
-	}
-}
-
-func BenchmarkGenericMatch2(b *testing.B) {
-	str := Repeat("It&apos;s &lt;b&gt;HTML&lt;/b&gt;!", 100)
-	for i := 0; i < b.N; i++ {
-		htmlUnescaper.Replace(str)
-	}
-}
-
-func benchmarkSingleString(b *testing.B, pattern, text string) {
-	r := NewReplacer(pattern, "[match]")
-	b.SetBytes(int64(len(text)))
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		r.Replace(text)
-	}
-}
-
-func BenchmarkSingleMaxSkipping(b *testing.B) {
-	benchmarkSingleString(b, Repeat("b", 25), Repeat("a", 10000))
-}
-
-func BenchmarkSingleLongSuffixFail(b *testing.B) {
-	benchmarkSingleString(b, "b"+Repeat("a", 500), Repeat("a", 1002))
-}
-
-func BenchmarkSingleMatch(b *testing.B) {
-	benchmarkSingleString(b, "abcdef", Repeat("abcdefghijklmno", 1000))
-}
-
-func BenchmarkByteByteNoMatch(b *testing.B) {
-	str := Repeat("A", 100) + Repeat("B", 100)
-	for i := 0; i < b.N; i++ {
-		capitalLetters.Replace(str)
-	}
-}
-
-func BenchmarkByteByteMatch(b *testing.B) {
-	str := Repeat("a", 100) + Repeat("b", 100)
-	for i := 0; i < b.N; i++ {
-		capitalLetters.Replace(str)
-	}
-}
-
-func BenchmarkByteStringMatch(b *testing.B) {
-	str := "<" + Repeat("a", 99) + Repeat("b", 99) + ">"
-	for i := 0; i < b.N; i++ {
-		htmlEscaper.Replace(str)
-	}
-}
-
-func BenchmarkHTMLEscapeNew(b *testing.B) {
-	str := "I <3 to escape HTML & other text too."
-	for i := 0; i < b.N; i++ {
-		htmlEscaper.Replace(str)
-	}
-}
-
-func BenchmarkHTMLEscapeOld(b *testing.B) {
-	str := "I <3 to escape HTML & other text too."
-	for i := 0; i < b.N; i++ {
-		oldHTMLEscape(str)
-	}
-}
-
-func BenchmarkByteStringReplacerWriteString(b *testing.B) {
-	str := Repeat("I <3 to escape HTML & other text too.", 100)
-	buf := new(bytes.Buffer)
-	for i := 0; i < b.N; i++ {
-		htmlEscaper.WriteString(buf, str)
-		buf.Reset()
-	}
-}
-
-func BenchmarkByteReplacerWriteString(b *testing.B) {
-	str := Repeat("abcdefghijklmnopqrstuvwxyz", 100)
-	buf := new(bytes.Buffer)
-	for i := 0; i < b.N; i++ {
-		capitalLetters.WriteString(buf, str)
-		buf.Reset()
-	}
-}
-
-// BenchmarkByteByteReplaces compares byteByteImpl against multiple Replaces.
-func BenchmarkByteByteReplaces(b *testing.B) {
-	str := Repeat("a", 100) + Repeat("b", 100)
-	for i := 0; i < b.N; i++ {
-		Replace(Replace(str, "a", "A", -1), "b", "B", -1)
-	}
-}
-
-// BenchmarkByteByteMap compares byteByteImpl against Map.
-func BenchmarkByteByteMap(b *testing.B) {
-	str := Repeat("a", 100) + Repeat("b", 100)
-	fn := func(r rune) rune {
-		switch r {
-		case 'a':
-			return 'A'
-		case 'b':
-			return 'B'
-		}
-		return r
-	}
-	for i := 0; i < b.N; i++ {
-		Map(fn, str)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/strings/search.go b/third_party/gofrontend/libgo/go/strings/search.go
deleted file mode 100644
index f77c879..0000000
--- a/third_party/gofrontend/libgo/go/strings/search.go
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strings
-
-// stringFinder efficiently finds strings in a source text. It's implemented
-// using the Boyer-Moore string search algorithm:
-// http://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm
-// http://www.cs.utexas.edu/~moore/publications/fstrpos.pdf (note: this aged
-// document uses 1-based indexing)
-type stringFinder struct {
-	// pattern is the string that we are searching for in the text.
-	pattern string
-
-	// badCharSkip[b] contains the distance between the last byte of pattern
-	// and the rightmost occurrence of b in pattern. If b is not in pattern,
-	// badCharSkip[b] is len(pattern).
-	//
-	// Whenever a mismatch is found with byte b in the text, we can safely
-	// shift the matching frame at least badCharSkip[b] until the next time
-	// the matching char could be in alignment.
-	badCharSkip [256]int
-
-	// goodSuffixSkip[i] defines how far we can shift the matching frame given
-	// that the suffix pattern[i+1:] matches, but the byte pattern[i] does
-	// not. There are two cases to consider:
-	//
-	// 1. The matched suffix occurs elsewhere in pattern (with a different
-	// byte preceding it that we might possibly match). In this case, we can
-	// shift the matching frame to align with the next suffix chunk. For
-	// example, the pattern "mississi" has the suffix "issi" next occurring
-	// (in right-to-left order) at index 1, so goodSuffixSkip[3] ==
-	// shift+len(suffix) == 3+4 == 7.
-	//
-	// 2. If the matched suffix does not occur elsewhere in pattern, then the
-	// matching frame may share part of its prefix with the end of the
-	// matching suffix. In this case, goodSuffixSkip[i] will contain how far
-	// to shift the frame to align this portion of the prefix to the
-	// suffix. For example, in the pattern "abcxxxabc", when the first
-	// mismatch from the back is found to be in position 3, the matching
-	// suffix "xxabc" is not found elsewhere in the pattern. However, its
-	// rightmost "abc" (at position 6) is a prefix of the whole pattern, so
-	// goodSuffixSkip[3] == shift+len(suffix) == 6+5 == 11.
-	goodSuffixSkip []int
-}
-
-func makeStringFinder(pattern string) *stringFinder {
-	f := &stringFinder{
-		pattern:        pattern,
-		goodSuffixSkip: make([]int, len(pattern)),
-	}
-	// last is the index of the last character in the pattern.
-	last := len(pattern) - 1
-
-	// Build bad character table.
-	// Bytes not in the pattern can skip one pattern's length.
-	for i := range f.badCharSkip {
-		f.badCharSkip[i] = len(pattern)
-	}
-	// The loop condition is < instead of <= so that the last byte does not
-	// have a zero distance to itself. Finding this byte out of place implies
-	// that it is not in the last position.
-	for i := 0; i < last; i++ {
-		f.badCharSkip[pattern[i]] = last - i
-	}
-
-	// Build good suffix table.
-	// First pass: set each value to the next index which starts a prefix of
-	// pattern.
-	lastPrefix := last
-	for i := last; i >= 0; i-- {
-		if HasPrefix(pattern, pattern[i+1:]) {
-			lastPrefix = i + 1
-		}
-		// lastPrefix is the shift, and (last-i) is len(suffix).
-		f.goodSuffixSkip[i] = lastPrefix + last - i
-	}
-	// Second pass: find repeats of pattern's suffix starting from the front.
-	for i := 0; i < last; i++ {
-		lenSuffix := longestCommonSuffix(pattern, pattern[1:i+1])
-		if pattern[i-lenSuffix] != pattern[last-lenSuffix] {
-			// (last-i) is the shift, and lenSuffix is len(suffix).
-			f.goodSuffixSkip[last-lenSuffix] = lenSuffix + last - i
-		}
-	}
-
-	return f
-}
-
-func longestCommonSuffix(a, b string) (i int) {
-	for ; i < len(a) && i < len(b); i++ {
-		if a[len(a)-1-i] != b[len(b)-1-i] {
-			break
-		}
-	}
-	return
-}
-
-// next returns the index in text of the first occurrence of the pattern. If
-// the pattern is not found, it returns -1.
-func (f *stringFinder) next(text string) int {
-	i := len(f.pattern) - 1
-	for i < len(text) {
-		// Compare backwards from the end until the first unmatching character.
-		j := len(f.pattern) - 1
-		for j >= 0 && text[i] == f.pattern[j] {
-			i--
-			j--
-		}
-		if j < 0 {
-			return i + 1 // match
-		}
-		i += max(f.badCharSkip[text[i]], f.goodSuffixSkip[j])
-	}
-	return -1
-}
-
-func max(a, b int) int {
-	if a > b {
-		return a
-	}
-	return b
-}
diff --git a/third_party/gofrontend/libgo/go/strings/search_test.go b/third_party/gofrontend/libgo/go/strings/search_test.go
deleted file mode 100644
index 966c05e..0000000
--- a/third_party/gofrontend/libgo/go/strings/search_test.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strings_test
-
-import (
-	"reflect"
-	. "strings"
-	"testing"
-)
-
-func TestFinderNext(t *testing.T) {
-	testCases := []struct {
-		pat, text string
-		index     int
-	}{
-		{"", "", 0},
-		{"", "abc", 0},
-		{"abc", "", -1},
-		{"abc", "abc", 0},
-		{"d", "abcdefg", 3},
-		{"nan", "banana", 2},
-		{"pan", "anpanman", 2},
-		{"nnaaman", "anpanmanam", -1},
-		{"abcd", "abc", -1},
-		{"abcd", "bcd", -1},
-		{"bcd", "abcd", 1},
-		{"abc", "acca", -1},
-		{"aa", "aaa", 0},
-		{"baa", "aaaaa", -1},
-		{"at that", "which finally halts.  at that point", 22},
-	}
-
-	for _, tc := range testCases {
-		got := StringFind(tc.pat, tc.text)
-		want := tc.index
-		if got != want {
-			t.Errorf("stringFind(%q, %q) got %d, want %d\n", tc.pat, tc.text, got, want)
-		}
-	}
-}
-
-func TestFinderCreation(t *testing.T) {
-	testCases := []struct {
-		pattern string
-		bad     [256]int
-		suf     []int
-	}{
-		{
-			"abc",
-			[256]int{'a': 2, 'b': 1, 'c': 3},
-			[]int{5, 4, 1},
-		},
-		{
-			"mississi",
-			[256]int{'i': 3, 'm': 7, 's': 1},
-			[]int{15, 14, 13, 7, 11, 10, 7, 1},
-		},
-		// From http://www.cs.utexas.edu/~moore/publications/fstrpos.pdf
-		{
-			"abcxxxabc",
-			[256]int{'a': 2, 'b': 1, 'c': 6, 'x': 3},
-			[]int{14, 13, 12, 11, 10, 9, 11, 10, 1},
-		},
-		{
-			"abyxcdeyx",
-			[256]int{'a': 8, 'b': 7, 'c': 4, 'd': 3, 'e': 2, 'y': 1, 'x': 5},
-			[]int{17, 16, 15, 14, 13, 12, 7, 10, 1},
-		},
-	}
-
-	for _, tc := range testCases {
-		bad, good := DumpTables(tc.pattern)
-
-		for i, got := range bad {
-			want := tc.bad[i]
-			if want == 0 {
-				want = len(tc.pattern)
-			}
-			if got != want {
-				t.Errorf("boyerMoore(%q) bad['%c']: got %d want %d", tc.pattern, i, got, want)
-			}
-		}
-
-		if !reflect.DeepEqual(good, tc.suf) {
-			t.Errorf("boyerMoore(%q) got %v want %v", tc.pattern, good, tc.suf)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/strings/strings.go b/third_party/gofrontend/libgo/go/strings/strings.go
deleted file mode 100644
index dd51dab..0000000
--- a/third_party/gofrontend/libgo/go/strings/strings.go
+++ /dev/null
@@ -1,768 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package strings implements simple functions to manipulate UTF-8 encoded strings.
-//
-// For information about UTF-8 strings in Go, see https://blog.golang.org/strings.
-package strings
-
-import (
-	"unicode"
-	"unicode/utf8"
-)
-
-// explode splits s into an array of UTF-8 sequences, one per Unicode character (still strings) up to a maximum of n (n < 0 means no limit).
-// Invalid UTF-8 sequences become correct encodings of U+FFF8.
-func explode(s string, n int) []string {
-	if n == 0 {
-		return nil
-	}
-	l := utf8.RuneCountInString(s)
-	if n <= 0 || n > l {
-		n = l
-	}
-	a := make([]string, n)
-	var size int
-	var ch rune
-	i, cur := 0, 0
-	for ; i+1 < n; i++ {
-		ch, size = utf8.DecodeRuneInString(s[cur:])
-		if ch == utf8.RuneError {
-			a[i] = string(utf8.RuneError)
-		} else {
-			a[i] = s[cur : cur+size]
-		}
-		cur += size
-	}
-	// add the rest, if there is any
-	if cur < len(s) {
-		a[i] = s[cur:]
-	}
-	return a
-}
-
-// primeRK is the prime base used in Rabin-Karp algorithm.
-const primeRK = 16777619
-
-// hashStr returns the hash and the appropriate multiplicative
-// factor for use in Rabin-Karp algorithm.
-func hashStr(sep string) (uint32, uint32) {
-	hash := uint32(0)
-	for i := 0; i < len(sep); i++ {
-		hash = hash*primeRK + uint32(sep[i])
-	}
-	var pow, sq uint32 = 1, primeRK
-	for i := len(sep); i > 0; i >>= 1 {
-		if i&1 != 0 {
-			pow *= sq
-		}
-		sq *= sq
-	}
-	return hash, pow
-}
-
-// hashStrRev returns the hash of the reverse of sep and the
-// appropriate multiplicative factor for use in Rabin-Karp algorithm.
-func hashStrRev(sep string) (uint32, uint32) {
-	hash := uint32(0)
-	for i := len(sep) - 1; i >= 0; i-- {
-		hash = hash*primeRK + uint32(sep[i])
-	}
-	var pow, sq uint32 = 1, primeRK
-	for i := len(sep); i > 0; i >>= 1 {
-		if i&1 != 0 {
-			pow *= sq
-		}
-		sq *= sq
-	}
-	return hash, pow
-}
-
-// Count counts the number of non-overlapping instances of sep in s.
-// If sep is an empty string, Count returns 1 + the number of Unicode code points in s.
-func Count(s, sep string) int {
-	n := 0
-	// special cases
-	switch {
-	case len(sep) == 0:
-		return utf8.RuneCountInString(s) + 1
-	case len(sep) == 1:
-		// special case worth making fast
-		c := sep[0]
-		for i := 0; i < len(s); i++ {
-			if s[i] == c {
-				n++
-			}
-		}
-		return n
-	case len(sep) > len(s):
-		return 0
-	case len(sep) == len(s):
-		if sep == s {
-			return 1
-		}
-		return 0
-	}
-	// Rabin-Karp search
-	hashsep, pow := hashStr(sep)
-	h := uint32(0)
-	for i := 0; i < len(sep); i++ {
-		h = h*primeRK + uint32(s[i])
-	}
-	lastmatch := 0
-	if h == hashsep && s[:len(sep)] == sep {
-		n++
-		lastmatch = len(sep)
-	}
-	for i := len(sep); i < len(s); {
-		h *= primeRK
-		h += uint32(s[i])
-		h -= pow * uint32(s[i-len(sep)])
-		i++
-		if h == hashsep && lastmatch <= i-len(sep) && s[i-len(sep):i] == sep {
-			n++
-			lastmatch = i
-		}
-	}
-	return n
-}
-
-// Contains reports whether substr is within s.
-func Contains(s, substr string) bool {
-	return Index(s, substr) >= 0
-}
-
-// ContainsAny reports whether any Unicode code points in chars are within s.
-func ContainsAny(s, chars string) bool {
-	return IndexAny(s, chars) >= 0
-}
-
-// ContainsRune reports whether the Unicode code point r is within s.
-func ContainsRune(s string, r rune) bool {
-	return IndexRune(s, r) >= 0
-}
-
-// Index returns the index of the first instance of sep in s, or -1 if sep is not present in s.
-func Index(s, sep string) int {
-	n := len(sep)
-	switch {
-	case n == 0:
-		return 0
-	case n == 1:
-		return IndexByte(s, sep[0])
-	case n == len(s):
-		if sep == s {
-			return 0
-		}
-		return -1
-	case n > len(s):
-		return -1
-	}
-	// Rabin-Karp search
-	hashsep, pow := hashStr(sep)
-	var h uint32
-	for i := 0; i < n; i++ {
-		h = h*primeRK + uint32(s[i])
-	}
-	if h == hashsep && s[:n] == sep {
-		return 0
-	}
-	for i := n; i < len(s); {
-		h *= primeRK
-		h += uint32(s[i])
-		h -= pow * uint32(s[i-n])
-		i++
-		if h == hashsep && s[i-n:i] == sep {
-			return i - n
-		}
-	}
-	return -1
-}
-
-// LastIndex returns the index of the last instance of sep in s, or -1 if sep is not present in s.
-func LastIndex(s, sep string) int {
-	n := len(sep)
-	switch {
-	case n == 0:
-		return len(s)
-	case n == 1:
-		return LastIndexByte(s, sep[0])
-	case n == len(s):
-		if sep == s {
-			return 0
-		}
-		return -1
-	case n > len(s):
-		return -1
-	}
-	// Rabin-Karp search from the end of the string
-	hashsep, pow := hashStrRev(sep)
-	last := len(s) - n
-	var h uint32
-	for i := len(s) - 1; i >= last; i-- {
-		h = h*primeRK + uint32(s[i])
-	}
-	if h == hashsep && s[last:] == sep {
-		return last
-	}
-	for i := last - 1; i >= 0; i-- {
-		h *= primeRK
-		h += uint32(s[i])
-		h -= pow * uint32(s[i+n])
-		if h == hashsep && s[i:i+n] == sep {
-			return i
-		}
-	}
-	return -1
-}
-
-// IndexRune returns the index of the first instance of the Unicode code point
-// r, or -1 if rune is not present in s.
-func IndexRune(s string, r rune) int {
-	switch {
-	case r < utf8.RuneSelf:
-		return IndexByte(s, byte(r))
-	default:
-		for i, c := range s {
-			if c == r {
-				return i
-			}
-		}
-	}
-	return -1
-}
-
-// IndexAny returns the index of the first instance of any Unicode code point
-// from chars in s, or -1 if no Unicode code point from chars is present in s.
-func IndexAny(s, chars string) int {
-	if len(chars) > 0 {
-		for i, c := range s {
-			for _, m := range chars {
-				if c == m {
-					return i
-				}
-			}
-		}
-	}
-	return -1
-}
-
-// LastIndexAny returns the index of the last instance of any Unicode code
-// point from chars in s, or -1 if no Unicode code point from chars is
-// present in s.
-func LastIndexAny(s, chars string) int {
-	if len(chars) > 0 {
-		for i := len(s); i > 0; {
-			rune, size := utf8.DecodeLastRuneInString(s[0:i])
-			i -= size
-			for _, m := range chars {
-				if rune == m {
-					return i
-				}
-			}
-		}
-	}
-	return -1
-}
-
-// LastIndexByte returns the index of the last instance of c in s, or -1 if c is not present in s.
-func LastIndexByte(s string, c byte) int {
-	for i := len(s) - 1; i >= 0; i-- {
-		if s[i] == c {
-			return i
-		}
-	}
-	return -1
-}
-
-// Generic split: splits after each instance of sep,
-// including sepSave bytes of sep in the subarrays.
-func genSplit(s, sep string, sepSave, n int) []string {
-	if n == 0 {
-		return nil
-	}
-	if sep == "" {
-		return explode(s, n)
-	}
-	if n < 0 {
-		n = Count(s, sep) + 1
-	}
-	c := sep[0]
-	start := 0
-	a := make([]string, n)
-	na := 0
-	for i := 0; i+len(sep) <= len(s) && na+1 < n; i++ {
-		if s[i] == c && (len(sep) == 1 || s[i:i+len(sep)] == sep) {
-			a[na] = s[start : i+sepSave]
-			na++
-			start = i + len(sep)
-			i += len(sep) - 1
-		}
-	}
-	a[na] = s[start:]
-	return a[0 : na+1]
-}
-
-// SplitN slices s into substrings separated by sep and returns a slice of
-// the substrings between those separators.
-// If sep is empty, SplitN splits after each UTF-8 sequence.
-// The count determines the number of substrings to return:
-//   n > 0: at most n substrings; the last substring will be the unsplit remainder.
-//   n == 0: the result is nil (zero substrings)
-//   n < 0: all substrings
-func SplitN(s, sep string, n int) []string { return genSplit(s, sep, 0, n) }
-
-// SplitAfterN slices s into substrings after each instance of sep and
-// returns a slice of those substrings.
-// If sep is empty, SplitAfterN splits after each UTF-8 sequence.
-// The count determines the number of substrings to return:
-//   n > 0: at most n substrings; the last substring will be the unsplit remainder.
-//   n == 0: the result is nil (zero substrings)
-//   n < 0: all substrings
-func SplitAfterN(s, sep string, n int) []string {
-	return genSplit(s, sep, len(sep), n)
-}
-
-// Split slices s into all substrings separated by sep and returns a slice of
-// the substrings between those separators.
-// If sep is empty, Split splits after each UTF-8 sequence.
-// It is equivalent to SplitN with a count of -1.
-func Split(s, sep string) []string { return genSplit(s, sep, 0, -1) }
-
-// SplitAfter slices s into all substrings after each instance of sep and
-// returns a slice of those substrings.
-// If sep is empty, SplitAfter splits after each UTF-8 sequence.
-// It is equivalent to SplitAfterN with a count of -1.
-func SplitAfter(s, sep string) []string {
-	return genSplit(s, sep, len(sep), -1)
-}
-
-// Fields splits the string s around each instance of one or more consecutive white space
-// characters, as defined by unicode.IsSpace, returning an array of substrings of s or an
-// empty list if s contains only white space.
-func Fields(s string) []string {
-	return FieldsFunc(s, unicode.IsSpace)
-}
-
-// FieldsFunc splits the string s at each run of Unicode code points c satisfying f(c)
-// and returns an array of slices of s. If all code points in s satisfy f(c) or the
-// string is empty, an empty slice is returned.
-// FieldsFunc makes no guarantees about the order in which it calls f(c).
-// If f does not return consistent results for a given c, FieldsFunc may crash.
-func FieldsFunc(s string, f func(rune) bool) []string {
-	// First count the fields.
-	n := 0
-	inField := false
-	for _, rune := range s {
-		wasInField := inField
-		inField = !f(rune)
-		if inField && !wasInField {
-			n++
-		}
-	}
-
-	// Now create them.
-	a := make([]string, n)
-	na := 0
-	fieldStart := -1 // Set to -1 when looking for start of field.
-	for i, rune := range s {
-		if f(rune) {
-			if fieldStart >= 0 {
-				a[na] = s[fieldStart:i]
-				na++
-				fieldStart = -1
-			}
-		} else if fieldStart == -1 {
-			fieldStart = i
-		}
-	}
-	if fieldStart >= 0 { // Last field might end at EOF.
-		a[na] = s[fieldStart:]
-	}
-	return a
-}
-
-// Join concatenates the elements of a to create a single string.   The separator string
-// sep is placed between elements in the resulting string.
-func Join(a []string, sep string) string {
-	if len(a) == 0 {
-		return ""
-	}
-	if len(a) == 1 {
-		return a[0]
-	}
-	n := len(sep) * (len(a) - 1)
-	for i := 0; i < len(a); i++ {
-		n += len(a[i])
-	}
-
-	b := make([]byte, n)
-	bp := copy(b, a[0])
-	for _, s := range a[1:] {
-		bp += copy(b[bp:], sep)
-		bp += copy(b[bp:], s)
-	}
-	return string(b)
-}
-
-// HasPrefix tests whether the string s begins with prefix.
-func HasPrefix(s, prefix string) bool {
-	return len(s) >= len(prefix) && s[0:len(prefix)] == prefix
-}
-
-// HasSuffix tests whether the string s ends with suffix.
-func HasSuffix(s, suffix string) bool {
-	return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix
-}
-
-// Map returns a copy of the string s with all its characters modified
-// according to the mapping function. If mapping returns a negative value, the character is
-// dropped from the string with no replacement.
-func Map(mapping func(rune) rune, s string) string {
-	// In the worst case, the string can grow when mapped, making
-	// things unpleasant.  But it's so rare we barge in assuming it's
-	// fine.  It could also shrink but that falls out naturally.
-	maxbytes := len(s) // length of b
-	nbytes := 0        // number of bytes encoded in b
-	// The output buffer b is initialized on demand, the first
-	// time a character differs.
-	var b []byte
-
-	for i, c := range s {
-		r := mapping(c)
-		if b == nil {
-			if r == c {
-				continue
-			}
-			b = make([]byte, maxbytes)
-			nbytes = copy(b, s[:i])
-		}
-		if r >= 0 {
-			wid := 1
-			if r >= utf8.RuneSelf {
-				wid = utf8.RuneLen(r)
-			}
-			if nbytes+wid > maxbytes {
-				// Grow the buffer.
-				maxbytes = maxbytes*2 + utf8.UTFMax
-				nb := make([]byte, maxbytes)
-				copy(nb, b[0:nbytes])
-				b = nb
-			}
-			nbytes += utf8.EncodeRune(b[nbytes:maxbytes], r)
-		}
-	}
-	if b == nil {
-		return s
-	}
-	return string(b[0:nbytes])
-}
-
-// Repeat returns a new string consisting of count copies of the string s.
-func Repeat(s string, count int) string {
-	b := make([]byte, len(s)*count)
-	bp := copy(b, s)
-	for bp < len(b) {
-		copy(b[bp:], b[:bp])
-		bp *= 2
-	}
-	return string(b)
-}
-
-// ToUpper returns a copy of the string s with all Unicode letters mapped to their upper case.
-func ToUpper(s string) string { return Map(unicode.ToUpper, s) }
-
-// ToLower returns a copy of the string s with all Unicode letters mapped to their lower case.
-func ToLower(s string) string { return Map(unicode.ToLower, s) }
-
-// ToTitle returns a copy of the string s with all Unicode letters mapped to their title case.
-func ToTitle(s string) string { return Map(unicode.ToTitle, s) }
-
-// ToUpperSpecial returns a copy of the string s with all Unicode letters mapped to their
-// upper case, giving priority to the special casing rules.
-func ToUpperSpecial(_case unicode.SpecialCase, s string) string {
-	return Map(func(r rune) rune { return _case.ToUpper(r) }, s)
-}
-
-// ToLowerSpecial returns a copy of the string s with all Unicode letters mapped to their
-// lower case, giving priority to the special casing rules.
-func ToLowerSpecial(_case unicode.SpecialCase, s string) string {
-	return Map(func(r rune) rune { return _case.ToLower(r) }, s)
-}
-
-// ToTitleSpecial returns a copy of the string s with all Unicode letters mapped to their
-// title case, giving priority to the special casing rules.
-func ToTitleSpecial(_case unicode.SpecialCase, s string) string {
-	return Map(func(r rune) rune { return _case.ToTitle(r) }, s)
-}
-
-// isSeparator reports whether the rune could mark a word boundary.
-// TODO: update when package unicode captures more of the properties.
-func isSeparator(r rune) bool {
-	// ASCII alphanumerics and underscore are not separators
-	if r <= 0x7F {
-		switch {
-		case '0' <= r && r <= '9':
-			return false
-		case 'a' <= r && r <= 'z':
-			return false
-		case 'A' <= r && r <= 'Z':
-			return false
-		case r == '_':
-			return false
-		}
-		return true
-	}
-	// Letters and digits are not separators
-	if unicode.IsLetter(r) || unicode.IsDigit(r) {
-		return false
-	}
-	// Otherwise, all we can do for now is treat spaces as separators.
-	return unicode.IsSpace(r)
-}
-
-// Title returns a copy of the string s with all Unicode letters that begin words
-// mapped to their title case.
-//
-// BUG(rsc): The rule Title uses for word boundaries does not handle Unicode punctuation properly.
-func Title(s string) string {
-	// Use a closure here to remember state.
-	// Hackish but effective. Depends on Map scanning in order and calling
-	// the closure once per rune.
-	prev := ' '
-	return Map(
-		func(r rune) rune {
-			if isSeparator(prev) {
-				prev = r
-				return unicode.ToTitle(r)
-			}
-			prev = r
-			return r
-		},
-		s)
-}
-
-// TrimLeftFunc returns a slice of the string s with all leading
-// Unicode code points c satisfying f(c) removed.
-func TrimLeftFunc(s string, f func(rune) bool) string {
-	i := indexFunc(s, f, false)
-	if i == -1 {
-		return ""
-	}
-	return s[i:]
-}
-
-// TrimRightFunc returns a slice of the string s with all trailing
-// Unicode code points c satisfying f(c) removed.
-func TrimRightFunc(s string, f func(rune) bool) string {
-	i := lastIndexFunc(s, f, false)
-	if i >= 0 && s[i] >= utf8.RuneSelf {
-		_, wid := utf8.DecodeRuneInString(s[i:])
-		i += wid
-	} else {
-		i++
-	}
-	return s[0:i]
-}
-
-// TrimFunc returns a slice of the string s with all leading
-// and trailing Unicode code points c satisfying f(c) removed.
-func TrimFunc(s string, f func(rune) bool) string {
-	return TrimRightFunc(TrimLeftFunc(s, f), f)
-}
-
-// IndexFunc returns the index into s of the first Unicode
-// code point satisfying f(c), or -1 if none do.
-func IndexFunc(s string, f func(rune) bool) int {
-	return indexFunc(s, f, true)
-}
-
-// LastIndexFunc returns the index into s of the last
-// Unicode code point satisfying f(c), or -1 if none do.
-func LastIndexFunc(s string, f func(rune) bool) int {
-	return lastIndexFunc(s, f, true)
-}
-
-// indexFunc is the same as IndexFunc except that if
-// truth==false, the sense of the predicate function is
-// inverted.
-func indexFunc(s string, f func(rune) bool, truth bool) int {
-	start := 0
-	for start < len(s) {
-		wid := 1
-		r := rune(s[start])
-		if r >= utf8.RuneSelf {
-			r, wid = utf8.DecodeRuneInString(s[start:])
-		}
-		if f(r) == truth {
-			return start
-		}
-		start += wid
-	}
-	return -1
-}
-
-// lastIndexFunc is the same as LastIndexFunc except that if
-// truth==false, the sense of the predicate function is
-// inverted.
-func lastIndexFunc(s string, f func(rune) bool, truth bool) int {
-	for i := len(s); i > 0; {
-		r, size := utf8.DecodeLastRuneInString(s[0:i])
-		i -= size
-		if f(r) == truth {
-			return i
-		}
-	}
-	return -1
-}
-
-func makeCutsetFunc(cutset string) func(rune) bool {
-	return func(r rune) bool { return IndexRune(cutset, r) >= 0 }
-}
-
-// Trim returns a slice of the string s with all leading and
-// trailing Unicode code points contained in cutset removed.
-func Trim(s string, cutset string) string {
-	if s == "" || cutset == "" {
-		return s
-	}
-	return TrimFunc(s, makeCutsetFunc(cutset))
-}
-
-// TrimLeft returns a slice of the string s with all leading
-// Unicode code points contained in cutset removed.
-func TrimLeft(s string, cutset string) string {
-	if s == "" || cutset == "" {
-		return s
-	}
-	return TrimLeftFunc(s, makeCutsetFunc(cutset))
-}
-
-// TrimRight returns a slice of the string s, with all trailing
-// Unicode code points contained in cutset removed.
-func TrimRight(s string, cutset string) string {
-	if s == "" || cutset == "" {
-		return s
-	}
-	return TrimRightFunc(s, makeCutsetFunc(cutset))
-}
-
-// TrimSpace returns a slice of the string s, with all leading
-// and trailing white space removed, as defined by Unicode.
-func TrimSpace(s string) string {
-	return TrimFunc(s, unicode.IsSpace)
-}
-
-// TrimPrefix returns s without the provided leading prefix string.
-// If s doesn't start with prefix, s is returned unchanged.
-func TrimPrefix(s, prefix string) string {
-	if HasPrefix(s, prefix) {
-		return s[len(prefix):]
-	}
-	return s
-}
-
-// TrimSuffix returns s without the provided trailing suffix string.
-// If s doesn't end with suffix, s is returned unchanged.
-func TrimSuffix(s, suffix string) string {
-	if HasSuffix(s, suffix) {
-		return s[:len(s)-len(suffix)]
-	}
-	return s
-}
-
-// Replace returns a copy of the string s with the first n
-// non-overlapping instances of old replaced by new.
-// If old is empty, it matches at the beginning of the string
-// and after each UTF-8 sequence, yielding up to k+1 replacements
-// for a k-rune string.
-// If n < 0, there is no limit on the number of replacements.
-func Replace(s, old, new string, n int) string {
-	if old == new || n == 0 {
-		return s // avoid allocation
-	}
-
-	// Compute number of replacements.
-	if m := Count(s, old); m == 0 {
-		return s // avoid allocation
-	} else if n < 0 || m < n {
-		n = m
-	}
-
-	// Apply replacements to buffer.
-	t := make([]byte, len(s)+n*(len(new)-len(old)))
-	w := 0
-	start := 0
-	for i := 0; i < n; i++ {
-		j := start
-		if len(old) == 0 {
-			if i > 0 {
-				_, wid := utf8.DecodeRuneInString(s[start:])
-				j += wid
-			}
-		} else {
-			j += Index(s[start:], old)
-		}
-		w += copy(t[w:], s[start:j])
-		w += copy(t[w:], new)
-		start = j + len(old)
-	}
-	w += copy(t[w:], s[start:])
-	return string(t[0:w])
-}
-
-// EqualFold reports whether s and t, interpreted as UTF-8 strings,
-// are equal under Unicode case-folding.
-func EqualFold(s, t string) bool {
-	for s != "" && t != "" {
-		// Extract first rune from each string.
-		var sr, tr rune
-		if s[0] < utf8.RuneSelf {
-			sr, s = rune(s[0]), s[1:]
-		} else {
-			r, size := utf8.DecodeRuneInString(s)
-			sr, s = r, s[size:]
-		}
-		if t[0] < utf8.RuneSelf {
-			tr, t = rune(t[0]), t[1:]
-		} else {
-			r, size := utf8.DecodeRuneInString(t)
-			tr, t = r, t[size:]
-		}
-
-		// If they match, keep going; if not, return false.
-
-		// Easy case.
-		if tr == sr {
-			continue
-		}
-
-		// Make sr < tr to simplify what follows.
-		if tr < sr {
-			tr, sr = sr, tr
-		}
-		// Fast check for ASCII.
-		if tr < utf8.RuneSelf && 'A' <= sr && sr <= 'Z' {
-			// ASCII, and sr is upper case.  tr must be lower case.
-			if tr == sr+'a'-'A' {
-				continue
-			}
-			return false
-		}
-
-		// General case.  SimpleFold(x) returns the next equivalent rune > x
-		// or wraps around to smaller values.
-		r := unicode.SimpleFold(sr)
-		for r != sr && r < tr {
-			r = unicode.SimpleFold(r)
-		}
-		if r == tr {
-			continue
-		}
-		return false
-	}
-
-	// One string is empty.  Are both?
-	return s == t
-}
diff --git a/third_party/gofrontend/libgo/go/strings/strings_decl.go b/third_party/gofrontend/libgo/go/strings/strings_decl.go
deleted file mode 100644
index 810a696..0000000
--- a/third_party/gofrontend/libgo/go/strings/strings_decl.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strings
-
-// IndexByte returns the index of the first instance of c in s, or -1 if c is not present in s.
-func IndexByte(s string, c byte) int // ../runtime/asm_$GOARCH.s
diff --git a/third_party/gofrontend/libgo/go/strings/strings_test.go b/third_party/gofrontend/libgo/go/strings/strings_test.go
deleted file mode 100644
index 4e21dea..0000000
--- a/third_party/gofrontend/libgo/go/strings/strings_test.go
+++ /dev/null
@@ -1,1250 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package strings_test
-
-import (
-	"bytes"
-	"io"
-	"math/rand"
-	"reflect"
-	. "strings"
-	"testing"
-	"unicode"
-	"unicode/utf8"
-	"unsafe"
-)
-
-func eq(a, b []string) bool {
-	if len(a) != len(b) {
-		return false
-	}
-	for i := 0; i < len(a); i++ {
-		if a[i] != b[i] {
-			return false
-		}
-	}
-	return true
-}
-
-var abcd = "abcd"
-var faces = "☺☻☹"
-var commas = "1,2,3,4"
-var dots = "1....2....3....4"
-
-type IndexTest struct {
-	s   string
-	sep string
-	out int
-}
-
-var indexTests = []IndexTest{
-	{"", "", 0},
-	{"", "a", -1},
-	{"", "foo", -1},
-	{"fo", "foo", -1},
-	{"foo", "foo", 0},
-	{"oofofoofooo", "f", 2},
-	{"oofofoofooo", "foo", 4},
-	{"barfoobarfoo", "foo", 3},
-	{"foo", "", 0},
-	{"foo", "o", 1},
-	{"abcABCabc", "A", 3},
-	// cases with one byte strings - test special case in Index()
-	{"", "a", -1},
-	{"x", "a", -1},
-	{"x", "x", 0},
-	{"abc", "a", 0},
-	{"abc", "b", 1},
-	{"abc", "c", 2},
-	{"abc", "x", -1},
-}
-
-var lastIndexTests = []IndexTest{
-	{"", "", 0},
-	{"", "a", -1},
-	{"", "foo", -1},
-	{"fo", "foo", -1},
-	{"foo", "foo", 0},
-	{"foo", "f", 0},
-	{"oofofoofooo", "f", 7},
-	{"oofofoofooo", "foo", 7},
-	{"barfoobarfoo", "foo", 9},
-	{"foo", "", 3},
-	{"foo", "o", 2},
-	{"abcABCabc", "A", 3},
-	{"abcABCabc", "a", 6},
-}
-
-var indexAnyTests = []IndexTest{
-	{"", "", -1},
-	{"", "a", -1},
-	{"", "abc", -1},
-	{"a", "", -1},
-	{"a", "a", 0},
-	{"aaa", "a", 0},
-	{"abc", "xyz", -1},
-	{"abc", "xcz", 2},
-	{"a☺b☻c☹d", "uvw☻xyz", 2 + len("☺")},
-	{"aRegExp*", ".(|)*+?^$[]", 7},
-	{dots + dots + dots, " ", -1},
-}
-var lastIndexAnyTests = []IndexTest{
-	{"", "", -1},
-	{"", "a", -1},
-	{"", "abc", -1},
-	{"a", "", -1},
-	{"a", "a", 0},
-	{"aaa", "a", 2},
-	{"abc", "xyz", -1},
-	{"abc", "ab", 1},
-	{"a☺b☻c☹d", "uvw☻xyz", 2 + len("☺")},
-	{"a.RegExp*", ".(|)*+?^$[]", 8},
-	{dots + dots + dots, " ", -1},
-}
-
-// Execute f on each test case.  funcName should be the name of f; it's used
-// in failure reports.
-func runIndexTests(t *testing.T, f func(s, sep string) int, funcName string, testCases []IndexTest) {
-	for _, test := range testCases {
-		actual := f(test.s, test.sep)
-		if actual != test.out {
-			t.Errorf("%s(%q,%q) = %v; want %v", funcName, test.s, test.sep, actual, test.out)
-		}
-	}
-}
-
-func TestIndex(t *testing.T)        { runIndexTests(t, Index, "Index", indexTests) }
-func TestLastIndex(t *testing.T)    { runIndexTests(t, LastIndex, "LastIndex", lastIndexTests) }
-func TestIndexAny(t *testing.T)     { runIndexTests(t, IndexAny, "IndexAny", indexAnyTests) }
-func TestLastIndexAny(t *testing.T) { runIndexTests(t, LastIndexAny, "LastIndexAny", lastIndexAnyTests) }
-
-func TestLastIndexByte(t *testing.T) {
-	testCases := []IndexTest{
-		{"", "q", -1},
-		{"abcdef", "q", -1},
-		{"abcdefabcdef", "a", len("abcdef")},      // something in the middle
-		{"abcdefabcdef", "f", len("abcdefabcde")}, // last byte
-		{"zabcdefabcdef", "z", 0},                 // first byte
-		{"a☺b☻c☹d", "b", len("a☺")},               // non-ascii
-	}
-	for _, test := range testCases {
-		actual := LastIndexByte(test.s, test.sep[0])
-		if actual != test.out {
-			t.Errorf("LastIndexByte(%q,%c) = %v; want %v", test.s, test.sep[0], actual, test.out)
-		}
-	}
-}
-
-var indexRuneTests = []struct {
-	s    string
-	rune rune
-	out  int
-}{
-	{"a A x", 'A', 2},
-	{"some_text=some_value", '=', 9},
-	{"☺a", 'a', 3},
-	{"a☻☺b", '☺', 4},
-}
-
-func TestIndexRune(t *testing.T) {
-	for _, test := range indexRuneTests {
-		if actual := IndexRune(test.s, test.rune); actual != test.out {
-			t.Errorf("IndexRune(%q,%d)= %v; want %v", test.s, test.rune, actual, test.out)
-		}
-	}
-}
-
-const benchmarkString = "some_text=some☺value"
-
-func BenchmarkIndexRune(b *testing.B) {
-	if got := IndexRune(benchmarkString, '☺'); got != 14 {
-		b.Fatalf("wrong index: expected 14, got=%d", got)
-	}
-	for i := 0; i < b.N; i++ {
-		IndexRune(benchmarkString, '☺')
-	}
-}
-
-func BenchmarkIndexRuneFastPath(b *testing.B) {
-	if got := IndexRune(benchmarkString, 'v'); got != 17 {
-		b.Fatalf("wrong index: expected 17, got=%d", got)
-	}
-	for i := 0; i < b.N; i++ {
-		IndexRune(benchmarkString, 'v')
-	}
-}
-
-func BenchmarkIndex(b *testing.B) {
-	if got := Index(benchmarkString, "v"); got != 17 {
-		b.Fatalf("wrong index: expected 17, got=%d", got)
-	}
-	for i := 0; i < b.N; i++ {
-		Index(benchmarkString, "v")
-	}
-}
-
-func BenchmarkLastIndex(b *testing.B) {
-	if got := Index(benchmarkString, "v"); got != 17 {
-		b.Fatalf("wrong index: expected 17, got=%d", got)
-	}
-	for i := 0; i < b.N; i++ {
-		LastIndex(benchmarkString, "v")
-	}
-}
-
-func BenchmarkIndexByte(b *testing.B) {
-	if got := IndexByte(benchmarkString, 'v'); got != 17 {
-		b.Fatalf("wrong index: expected 17, got=%d", got)
-	}
-	for i := 0; i < b.N; i++ {
-		IndexByte(benchmarkString, 'v')
-	}
-}
-
-var explodetests = []struct {
-	s string
-	n int
-	a []string
-}{
-	{"", -1, []string{}},
-	{abcd, 4, []string{"a", "b", "c", "d"}},
-	{faces, 3, []string{"☺", "☻", "☹"}},
-	{abcd, 2, []string{"a", "bcd"}},
-}
-
-func TestExplode(t *testing.T) {
-	for _, tt := range explodetests {
-		a := SplitN(tt.s, "", tt.n)
-		if !eq(a, tt.a) {
-			t.Errorf("explode(%q, %d) = %v; want %v", tt.s, tt.n, a, tt.a)
-			continue
-		}
-		s := Join(a, "")
-		if s != tt.s {
-			t.Errorf(`Join(explode(%q, %d), "") = %q`, tt.s, tt.n, s)
-		}
-	}
-}
-
-type SplitTest struct {
-	s   string
-	sep string
-	n   int
-	a   []string
-}
-
-var splittests = []SplitTest{
-	{abcd, "a", 0, nil},
-	{abcd, "a", -1, []string{"", "bcd"}},
-	{abcd, "z", -1, []string{"abcd"}},
-	{abcd, "", -1, []string{"a", "b", "c", "d"}},
-	{commas, ",", -1, []string{"1", "2", "3", "4"}},
-	{dots, "...", -1, []string{"1", ".2", ".3", ".4"}},
-	{faces, "☹", -1, []string{"☺☻", ""}},
-	{faces, "~", -1, []string{faces}},
-	{faces, "", -1, []string{"☺", "☻", "☹"}},
-	{"1 2 3 4", " ", 3, []string{"1", "2", "3 4"}},
-	{"1 2", " ", 3, []string{"1", "2"}},
-	{"123", "", 2, []string{"1", "23"}},
-	{"123", "", 17, []string{"1", "2", "3"}},
-}
-
-func TestSplit(t *testing.T) {
-	for _, tt := range splittests {
-		a := SplitN(tt.s, tt.sep, tt.n)
-		if !eq(a, tt.a) {
-			t.Errorf("Split(%q, %q, %d) = %v; want %v", tt.s, tt.sep, tt.n, a, tt.a)
-			continue
-		}
-		if tt.n == 0 {
-			continue
-		}
-		s := Join(a, tt.sep)
-		if s != tt.s {
-			t.Errorf("Join(Split(%q, %q, %d), %q) = %q", tt.s, tt.sep, tt.n, tt.sep, s)
-		}
-		if tt.n < 0 {
-			b := Split(tt.s, tt.sep)
-			if !reflect.DeepEqual(a, b) {
-				t.Errorf("Split disagrees with SplitN(%q, %q, %d) = %v; want %v", tt.s, tt.sep, tt.n, b, a)
-			}
-		}
-	}
-}
-
-var splitaftertests = []SplitTest{
-	{abcd, "a", -1, []string{"a", "bcd"}},
-	{abcd, "z", -1, []string{"abcd"}},
-	{abcd, "", -1, []string{"a", "b", "c", "d"}},
-	{commas, ",", -1, []string{"1,", "2,", "3,", "4"}},
-	{dots, "...", -1, []string{"1...", ".2...", ".3...", ".4"}},
-	{faces, "☹", -1, []string{"☺☻☹", ""}},
-	{faces, "~", -1, []string{faces}},
-	{faces, "", -1, []string{"☺", "☻", "☹"}},
-	{"1 2 3 4", " ", 3, []string{"1 ", "2 ", "3 4"}},
-	{"1 2 3", " ", 3, []string{"1 ", "2 ", "3"}},
-	{"1 2", " ", 3, []string{"1 ", "2"}},
-	{"123", "", 2, []string{"1", "23"}},
-	{"123", "", 17, []string{"1", "2", "3"}},
-}
-
-func TestSplitAfter(t *testing.T) {
-	for _, tt := range splitaftertests {
-		a := SplitAfterN(tt.s, tt.sep, tt.n)
-		if !eq(a, tt.a) {
-			t.Errorf(`Split(%q, %q, %d) = %v; want %v`, tt.s, tt.sep, tt.n, a, tt.a)
-			continue
-		}
-		s := Join(a, "")
-		if s != tt.s {
-			t.Errorf(`Join(Split(%q, %q, %d), %q) = %q`, tt.s, tt.sep, tt.n, tt.sep, s)
-		}
-		if tt.n < 0 {
-			b := SplitAfter(tt.s, tt.sep)
-			if !reflect.DeepEqual(a, b) {
-				t.Errorf("SplitAfter disagrees with SplitAfterN(%q, %q, %d) = %v; want %v", tt.s, tt.sep, tt.n, b, a)
-			}
-		}
-	}
-}
-
-type FieldsTest struct {
-	s string
-	a []string
-}
-
-var fieldstests = []FieldsTest{
-	{"", []string{}},
-	{" ", []string{}},
-	{" \t ", []string{}},
-	{"  abc  ", []string{"abc"}},
-	{"1 2 3 4", []string{"1", "2", "3", "4"}},
-	{"1  2  3  4", []string{"1", "2", "3", "4"}},
-	{"1\t\t2\t\t3\t4", []string{"1", "2", "3", "4"}},
-	{"1\u20002\u20013\u20024", []string{"1", "2", "3", "4"}},
-	{"\u2000\u2001\u2002", []string{}},
-	{"\n™\t™\n", []string{"™", "™"}},
-	{faces, []string{faces}},
-}
-
-func TestFields(t *testing.T) {
-	for _, tt := range fieldstests {
-		a := Fields(tt.s)
-		if !eq(a, tt.a) {
-			t.Errorf("Fields(%q) = %v; want %v", tt.s, a, tt.a)
-			continue
-		}
-	}
-}
-
-var FieldsFuncTests = []FieldsTest{
-	{"", []string{}},
-	{"XX", []string{}},
-	{"XXhiXXX", []string{"hi"}},
-	{"aXXbXXXcX", []string{"a", "b", "c"}},
-}
-
-func TestFieldsFunc(t *testing.T) {
-	for _, tt := range fieldstests {
-		a := FieldsFunc(tt.s, unicode.IsSpace)
-		if !eq(a, tt.a) {
-			t.Errorf("FieldsFunc(%q, unicode.IsSpace) = %v; want %v", tt.s, a, tt.a)
-			continue
-		}
-	}
-	pred := func(c rune) bool { return c == 'X' }
-	for _, tt := range FieldsFuncTests {
-		a := FieldsFunc(tt.s, pred)
-		if !eq(a, tt.a) {
-			t.Errorf("FieldsFunc(%q) = %v, want %v", tt.s, a, tt.a)
-		}
-	}
-}
-
-// Test case for any function which accepts and returns a single string.
-type StringTest struct {
-	in, out string
-}
-
-// Execute f on each test case.  funcName should be the name of f; it's used
-// in failure reports.
-func runStringTests(t *testing.T, f func(string) string, funcName string, testCases []StringTest) {
-	for _, tc := range testCases {
-		actual := f(tc.in)
-		if actual != tc.out {
-			t.Errorf("%s(%q) = %q; want %q", funcName, tc.in, actual, tc.out)
-		}
-	}
-}
-
-var upperTests = []StringTest{
-	{"", ""},
-	{"abc", "ABC"},
-	{"AbC123", "ABC123"},
-	{"azAZ09_", "AZAZ09_"},
-	{"\u0250\u0250\u0250\u0250\u0250", "\u2C6F\u2C6F\u2C6F\u2C6F\u2C6F"}, // grows one byte per char
-}
-
-var lowerTests = []StringTest{
-	{"", ""},
-	{"abc", "abc"},
-	{"AbC123", "abc123"},
-	{"azAZ09_", "azaz09_"},
-	{"\u2C6D\u2C6D\u2C6D\u2C6D\u2C6D", "\u0251\u0251\u0251\u0251\u0251"}, // shrinks one byte per char
-}
-
-const space = "\t\v\r\f\n\u0085\u00a0\u2000\u3000"
-
-var trimSpaceTests = []StringTest{
-	{"", ""},
-	{"abc", "abc"},
-	{space + "abc" + space, "abc"},
-	{" ", ""},
-	{" \t\r\n \t\t\r\r\n\n ", ""},
-	{" \t\r\n x\t\t\r\r\n\n ", "x"},
-	{" \u2000\t\r\n x\t\t\r\r\ny\n \u3000", "x\t\t\r\r\ny"},
-	{"1 \t\r\n2", "1 \t\r\n2"},
-	{" x\x80", "x\x80"},
-	{" x\xc0", "x\xc0"},
-	{"x \xc0\xc0 ", "x \xc0\xc0"},
-	{"x \xc0", "x \xc0"},
-	{"x \xc0 ", "x \xc0"},
-	{"x \xc0\xc0 ", "x \xc0\xc0"},
-	{"x ☺\xc0\xc0 ", "x ☺\xc0\xc0"},
-	{"x ☺ ", "x ☺"},
-}
-
-func tenRunes(ch rune) string {
-	r := make([]rune, 10)
-	for i := range r {
-		r[i] = ch
-	}
-	return string(r)
-}
-
-// User-defined self-inverse mapping function
-func rot13(r rune) rune {
-	step := rune(13)
-	if r >= 'a' && r <= 'z' {
-		return ((r - 'a' + step) % 26) + 'a'
-	}
-	if r >= 'A' && r <= 'Z' {
-		return ((r - 'A' + step) % 26) + 'A'
-	}
-	return r
-}
-
-func TestMap(t *testing.T) {
-	// Run a couple of awful growth/shrinkage tests
-	a := tenRunes('a')
-	// 1.  Grow.  This triggers two reallocations in Map.
-	maxRune := func(rune) rune { return unicode.MaxRune }
-	m := Map(maxRune, a)
-	expect := tenRunes(unicode.MaxRune)
-	if m != expect {
-		t.Errorf("growing: expected %q got %q", expect, m)
-	}
-
-	// 2. Shrink
-	minRune := func(rune) rune { return 'a' }
-	m = Map(minRune, tenRunes(unicode.MaxRune))
-	expect = a
-	if m != expect {
-		t.Errorf("shrinking: expected %q got %q", expect, m)
-	}
-
-	// 3. Rot13
-	m = Map(rot13, "a to zed")
-	expect = "n gb mrq"
-	if m != expect {
-		t.Errorf("rot13: expected %q got %q", expect, m)
-	}
-
-	// 4. Rot13^2
-	m = Map(rot13, Map(rot13, "a to zed"))
-	expect = "a to zed"
-	if m != expect {
-		t.Errorf("rot13: expected %q got %q", expect, m)
-	}
-
-	// 5. Drop
-	dropNotLatin := func(r rune) rune {
-		if unicode.Is(unicode.Latin, r) {
-			return r
-		}
-		return -1
-	}
-	m = Map(dropNotLatin, "Hello, 세계")
-	expect = "Hello"
-	if m != expect {
-		t.Errorf("drop: expected %q got %q", expect, m)
-	}
-
-	// 6. Identity
-	identity := func(r rune) rune {
-		return r
-	}
-	orig := "Input string that we expect not to be copied."
-	m = Map(identity, orig)
-	if (*reflect.StringHeader)(unsafe.Pointer(&orig)).Data !=
-		(*reflect.StringHeader)(unsafe.Pointer(&m)).Data {
-		t.Error("unexpected copy during identity map")
-	}
-}
-
-func TestToUpper(t *testing.T) { runStringTests(t, ToUpper, "ToUpper", upperTests) }
-
-func TestToLower(t *testing.T) { runStringTests(t, ToLower, "ToLower", lowerTests) }
-
-func BenchmarkMapNoChanges(b *testing.B) {
-	identity := func(r rune) rune {
-		return r
-	}
-	for i := 0; i < b.N; i++ {
-		Map(identity, "Some string that won't be modified.")
-	}
-}
-
-func TestSpecialCase(t *testing.T) {
-	lower := "abcçdefgğhıijklmnoöprsştuüvyz"
-	upper := "ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ"
-	u := ToUpperSpecial(unicode.TurkishCase, upper)
-	if u != upper {
-		t.Errorf("Upper(upper) is %s not %s", u, upper)
-	}
-	u = ToUpperSpecial(unicode.TurkishCase, lower)
-	if u != upper {
-		t.Errorf("Upper(lower) is %s not %s", u, upper)
-	}
-	l := ToLowerSpecial(unicode.TurkishCase, lower)
-	if l != lower {
-		t.Errorf("Lower(lower) is %s not %s", l, lower)
-	}
-	l = ToLowerSpecial(unicode.TurkishCase, upper)
-	if l != lower {
-		t.Errorf("Lower(upper) is %s not %s", l, lower)
-	}
-}
-
-func TestTrimSpace(t *testing.T) { runStringTests(t, TrimSpace, "TrimSpace", trimSpaceTests) }
-
-var trimTests = []struct {
-	f            string
-	in, arg, out string
-}{
-	{"Trim", "abba", "a", "bb"},
-	{"Trim", "abba", "ab", ""},
-	{"TrimLeft", "abba", "ab", ""},
-	{"TrimRight", "abba", "ab", ""},
-	{"TrimLeft", "abba", "a", "bba"},
-	{"TrimRight", "abba", "a", "abb"},
-	{"Trim", "<tag>", "<>", "tag"},
-	{"Trim", "* listitem", " *", "listitem"},
-	{"Trim", `"quote"`, `"`, "quote"},
-	{"Trim", "\u2C6F\u2C6F\u0250\u0250\u2C6F\u2C6F", "\u2C6F", "\u0250\u0250"},
-	//empty string tests
-	{"Trim", "abba", "", "abba"},
-	{"Trim", "", "123", ""},
-	{"Trim", "", "", ""},
-	{"TrimLeft", "abba", "", "abba"},
-	{"TrimLeft", "", "123", ""},
-	{"TrimLeft", "", "", ""},
-	{"TrimRight", "abba", "", "abba"},
-	{"TrimRight", "", "123", ""},
-	{"TrimRight", "", "", ""},
-	{"TrimRight", "☺\xc0", "☺", "☺\xc0"},
-	{"TrimPrefix", "aabb", "a", "abb"},
-	{"TrimPrefix", "aabb", "b", "aabb"},
-	{"TrimSuffix", "aabb", "a", "aabb"},
-	{"TrimSuffix", "aabb", "b", "aab"},
-}
-
-func TestTrim(t *testing.T) {
-	for _, tc := range trimTests {
-		name := tc.f
-		var f func(string, string) string
-		switch name {
-		case "Trim":
-			f = Trim
-		case "TrimLeft":
-			f = TrimLeft
-		case "TrimRight":
-			f = TrimRight
-		case "TrimPrefix":
-			f = TrimPrefix
-		case "TrimSuffix":
-			f = TrimSuffix
-		default:
-			t.Errorf("Undefined trim function %s", name)
-		}
-		actual := f(tc.in, tc.arg)
-		if actual != tc.out {
-			t.Errorf("%s(%q, %q) = %q; want %q", name, tc.in, tc.arg, actual, tc.out)
-		}
-	}
-}
-
-func BenchmarkTrim(b *testing.B) {
-	b.ReportAllocs()
-
-	for i := 0; i < b.N; i++ {
-		for _, tc := range trimTests {
-			name := tc.f
-			var f func(string, string) string
-			switch name {
-			case "Trim":
-				f = Trim
-			case "TrimLeft":
-				f = TrimLeft
-			case "TrimRight":
-				f = TrimRight
-			case "TrimPrefix":
-				f = TrimPrefix
-			case "TrimSuffix":
-				f = TrimSuffix
-			default:
-				b.Errorf("Undefined trim function %s", name)
-			}
-			actual := f(tc.in, tc.arg)
-			if actual != tc.out {
-				b.Errorf("%s(%q, %q) = %q; want %q", name, tc.in, tc.arg, actual, tc.out)
-			}
-		}
-	}
-}
-
-type predicate struct {
-	f    func(rune) bool
-	name string
-}
-
-var isSpace = predicate{unicode.IsSpace, "IsSpace"}
-var isDigit = predicate{unicode.IsDigit, "IsDigit"}
-var isUpper = predicate{unicode.IsUpper, "IsUpper"}
-var isValidRune = predicate{
-	func(r rune) bool {
-		return r != utf8.RuneError
-	},
-	"IsValidRune",
-}
-
-func not(p predicate) predicate {
-	return predicate{
-		func(r rune) bool {
-			return !p.f(r)
-		},
-		"not " + p.name,
-	}
-}
-
-var trimFuncTests = []struct {
-	f       predicate
-	in, out string
-}{
-	{isSpace, space + " hello " + space, "hello"},
-	{isDigit, "\u0e50\u0e5212hello34\u0e50\u0e51", "hello"},
-	{isUpper, "\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F", "hello"},
-	{not(isSpace), "hello" + space + "hello", space},
-	{not(isDigit), "hello\u0e50\u0e521234\u0e50\u0e51helo", "\u0e50\u0e521234\u0e50\u0e51"},
-	{isValidRune, "ab\xc0a\xc0cd", "\xc0a\xc0"},
-	{not(isValidRune), "\xc0a\xc0", "a"},
-}
-
-func TestTrimFunc(t *testing.T) {
-	for _, tc := range trimFuncTests {
-		actual := TrimFunc(tc.in, tc.f.f)
-		if actual != tc.out {
-			t.Errorf("TrimFunc(%q, %q) = %q; want %q", tc.in, tc.f.name, actual, tc.out)
-		}
-	}
-}
-
-var indexFuncTests = []struct {
-	in          string
-	f           predicate
-	first, last int
-}{
-	{"", isValidRune, -1, -1},
-	{"abc", isDigit, -1, -1},
-	{"0123", isDigit, 0, 3},
-	{"a1b", isDigit, 1, 1},
-	{space, isSpace, 0, len(space) - 3}, // last rune in space is 3 bytes
-	{"\u0e50\u0e5212hello34\u0e50\u0e51", isDigit, 0, 18},
-	{"\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F", isUpper, 0, 34},
-	{"12\u0e50\u0e52hello34\u0e50\u0e51", not(isDigit), 8, 12},
-
-	// tests of invalid UTF-8
-	{"\x801", isDigit, 1, 1},
-	{"\x80abc", isDigit, -1, -1},
-	{"\xc0a\xc0", isValidRune, 1, 1},
-	{"\xc0a\xc0", not(isValidRune), 0, 2},
-	{"\xc0☺\xc0", not(isValidRune), 0, 4},
-	{"\xc0☺\xc0\xc0", not(isValidRune), 0, 5},
-	{"ab\xc0a\xc0cd", not(isValidRune), 2, 4},
-	{"a\xe0\x80cd", not(isValidRune), 1, 2},
-	{"\x80\x80\x80\x80", not(isValidRune), 0, 3},
-}
-
-func TestIndexFunc(t *testing.T) {
-	for _, tc := range indexFuncTests {
-		first := IndexFunc(tc.in, tc.f.f)
-		if first != tc.first {
-			t.Errorf("IndexFunc(%q, %s) = %d; want %d", tc.in, tc.f.name, first, tc.first)
-		}
-		last := LastIndexFunc(tc.in, tc.f.f)
-		if last != tc.last {
-			t.Errorf("LastIndexFunc(%q, %s) = %d; want %d", tc.in, tc.f.name, last, tc.last)
-		}
-	}
-}
-
-func equal(m string, s1, s2 string, t *testing.T) bool {
-	if s1 == s2 {
-		return true
-	}
-	e1 := Split(s1, "")
-	e2 := Split(s2, "")
-	for i, c1 := range e1 {
-		if i >= len(e2) {
-			break
-		}
-		r1, _ := utf8.DecodeRuneInString(c1)
-		r2, _ := utf8.DecodeRuneInString(e2[i])
-		if r1 != r2 {
-			t.Errorf("%s diff at %d: U+%04X U+%04X", m, i, r1, r2)
-		}
-	}
-	return false
-}
-
-func TestCaseConsistency(t *testing.T) {
-	// Make a string of all the runes.
-	numRunes := int(unicode.MaxRune + 1)
-	if testing.Short() {
-		numRunes = 1000
-	}
-	a := make([]rune, numRunes)
-	for i := range a {
-		a[i] = rune(i)
-	}
-	s := string(a)
-	// convert the cases.
-	upper := ToUpper(s)
-	lower := ToLower(s)
-
-	// Consistency checks
-	if n := utf8.RuneCountInString(upper); n != numRunes {
-		t.Error("rune count wrong in upper:", n)
-	}
-	if n := utf8.RuneCountInString(lower); n != numRunes {
-		t.Error("rune count wrong in lower:", n)
-	}
-	if !equal("ToUpper(upper)", ToUpper(upper), upper, t) {
-		t.Error("ToUpper(upper) consistency fail")
-	}
-	if !equal("ToLower(lower)", ToLower(lower), lower, t) {
-		t.Error("ToLower(lower) consistency fail")
-	}
-	/*
-		  These fail because of non-one-to-oneness of the data, such as multiple
-		  upper case 'I' mapping to 'i'.  We comment them out but keep them for
-		  interest.
-		  For instance: CAPITAL LETTER I WITH DOT ABOVE:
-			unicode.ToUpper(unicode.ToLower('\u0130')) != '\u0130'
-
-		if !equal("ToUpper(lower)", ToUpper(lower), upper, t) {
-			t.Error("ToUpper(lower) consistency fail");
-		}
-		if !equal("ToLower(upper)", ToLower(upper), lower, t) {
-			t.Error("ToLower(upper) consistency fail");
-		}
-	*/
-}
-
-var RepeatTests = []struct {
-	in, out string
-	count   int
-}{
-	{"", "", 0},
-	{"", "", 1},
-	{"", "", 2},
-	{"-", "", 0},
-	{"-", "-", 1},
-	{"-", "----------", 10},
-	{"abc ", "abc abc abc ", 3},
-}
-
-func TestRepeat(t *testing.T) {
-	for _, tt := range RepeatTests {
-		a := Repeat(tt.in, tt.count)
-		if !equal("Repeat(s)", a, tt.out, t) {
-			t.Errorf("Repeat(%v, %d) = %v; want %v", tt.in, tt.count, a, tt.out)
-			continue
-		}
-	}
-}
-
-func runesEqual(a, b []rune) bool {
-	if len(a) != len(b) {
-		return false
-	}
-	for i, r := range a {
-		if r != b[i] {
-			return false
-		}
-	}
-	return true
-}
-
-var RunesTests = []struct {
-	in    string
-	out   []rune
-	lossy bool
-}{
-	{"", []rune{}, false},
-	{" ", []rune{32}, false},
-	{"ABC", []rune{65, 66, 67}, false},
-	{"abc", []rune{97, 98, 99}, false},
-	{"\u65e5\u672c\u8a9e", []rune{26085, 26412, 35486}, false},
-	{"ab\x80c", []rune{97, 98, 0xFFFD, 99}, true},
-	{"ab\xc0c", []rune{97, 98, 0xFFFD, 99}, true},
-}
-
-func TestRunes(t *testing.T) {
-	for _, tt := range RunesTests {
-		a := []rune(tt.in)
-		if !runesEqual(a, tt.out) {
-			t.Errorf("[]rune(%q) = %v; want %v", tt.in, a, tt.out)
-			continue
-		}
-		if !tt.lossy {
-			// can only test reassembly if we didn't lose information
-			s := string(a)
-			if s != tt.in {
-				t.Errorf("string([]rune(%q)) = %x; want %x", tt.in, s, tt.in)
-			}
-		}
-	}
-}
-
-func TestReadByte(t *testing.T) {
-	testStrings := []string{"", abcd, faces, commas}
-	for _, s := range testStrings {
-		reader := NewReader(s)
-		if e := reader.UnreadByte(); e == nil {
-			t.Errorf("Unreading %q at beginning: expected error", s)
-		}
-		var res bytes.Buffer
-		for {
-			b, e := reader.ReadByte()
-			if e == io.EOF {
-				break
-			}
-			if e != nil {
-				t.Errorf("Reading %q: %s", s, e)
-				break
-			}
-			res.WriteByte(b)
-			// unread and read again
-			e = reader.UnreadByte()
-			if e != nil {
-				t.Errorf("Unreading %q: %s", s, e)
-				break
-			}
-			b1, e := reader.ReadByte()
-			if e != nil {
-				t.Errorf("Reading %q after unreading: %s", s, e)
-				break
-			}
-			if b1 != b {
-				t.Errorf("Reading %q after unreading: want byte %q, got %q", s, b, b1)
-				break
-			}
-		}
-		if res.String() != s {
-			t.Errorf("Reader(%q).ReadByte() produced %q", s, res.String())
-		}
-	}
-}
-
-func TestReadRune(t *testing.T) {
-	testStrings := []string{"", abcd, faces, commas}
-	for _, s := range testStrings {
-		reader := NewReader(s)
-		if e := reader.UnreadRune(); e == nil {
-			t.Errorf("Unreading %q at beginning: expected error", s)
-		}
-		res := ""
-		for {
-			r, z, e := reader.ReadRune()
-			if e == io.EOF {
-				break
-			}
-			if e != nil {
-				t.Errorf("Reading %q: %s", s, e)
-				break
-			}
-			res += string(r)
-			// unread and read again
-			e = reader.UnreadRune()
-			if e != nil {
-				t.Errorf("Unreading %q: %s", s, e)
-				break
-			}
-			r1, z1, e := reader.ReadRune()
-			if e != nil {
-				t.Errorf("Reading %q after unreading: %s", s, e)
-				break
-			}
-			if r1 != r {
-				t.Errorf("Reading %q after unreading: want rune %q, got %q", s, r, r1)
-				break
-			}
-			if z1 != z {
-				t.Errorf("Reading %q after unreading: want size %d, got %d", s, z, z1)
-				break
-			}
-		}
-		if res != s {
-			t.Errorf("Reader(%q).ReadRune() produced %q", s, res)
-		}
-	}
-}
-
-var UnreadRuneErrorTests = []struct {
-	name string
-	f    func(*Reader)
-}{
-	{"Read", func(r *Reader) { r.Read([]byte{0}) }},
-	{"ReadByte", func(r *Reader) { r.ReadByte() }},
-	{"UnreadRune", func(r *Reader) { r.UnreadRune() }},
-	{"Seek", func(r *Reader) { r.Seek(0, 1) }},
-	{"WriteTo", func(r *Reader) { r.WriteTo(&bytes.Buffer{}) }},
-}
-
-func TestUnreadRuneError(t *testing.T) {
-	for _, tt := range UnreadRuneErrorTests {
-		reader := NewReader("0123456789")
-		if _, _, err := reader.ReadRune(); err != nil {
-			// should not happen
-			t.Fatal(err)
-		}
-		tt.f(reader)
-		err := reader.UnreadRune()
-		if err == nil {
-			t.Errorf("Unreading after %s: expected error", tt.name)
-		}
-	}
-}
-
-var ReplaceTests = []struct {
-	in       string
-	old, new string
-	n        int
-	out      string
-}{
-	{"hello", "l", "L", 0, "hello"},
-	{"hello", "l", "L", -1, "heLLo"},
-	{"hello", "x", "X", -1, "hello"},
-	{"", "x", "X", -1, ""},
-	{"radar", "r", "<r>", -1, "<r>ada<r>"},
-	{"", "", "<>", -1, "<>"},
-	{"banana", "a", "<>", -1, "b<>n<>n<>"},
-	{"banana", "a", "<>", 1, "b<>nana"},
-	{"banana", "a", "<>", 1000, "b<>n<>n<>"},
-	{"banana", "an", "<>", -1, "b<><>a"},
-	{"banana", "ana", "<>", -1, "b<>na"},
-	{"banana", "", "<>", -1, "<>b<>a<>n<>a<>n<>a<>"},
-	{"banana", "", "<>", 10, "<>b<>a<>n<>a<>n<>a<>"},
-	{"banana", "", "<>", 6, "<>b<>a<>n<>a<>n<>a"},
-	{"banana", "", "<>", 5, "<>b<>a<>n<>a<>na"},
-	{"banana", "", "<>", 1, "<>banana"},
-	{"banana", "a", "a", -1, "banana"},
-	{"banana", "a", "a", 1, "banana"},
-	{"☺☻☹", "", "<>", -1, "<>☺<>☻<>☹<>"},
-}
-
-func TestReplace(t *testing.T) {
-	for _, tt := range ReplaceTests {
-		if s := Replace(tt.in, tt.old, tt.new, tt.n); s != tt.out {
-			t.Errorf("Replace(%q, %q, %q, %d) = %q, want %q", tt.in, tt.old, tt.new, tt.n, s, tt.out)
-		}
-	}
-}
-
-var TitleTests = []struct {
-	in, out string
-}{
-	{"", ""},
-	{"a", "A"},
-	{" aaa aaa aaa ", " Aaa Aaa Aaa "},
-	{" Aaa Aaa Aaa ", " Aaa Aaa Aaa "},
-	{"123a456", "123a456"},
-	{"double-blind", "Double-Blind"},
-	{"ÿøû", "Ÿøû"},
-	{"with_underscore", "With_underscore"},
-	{"unicode \xe2\x80\xa8 line separator", "Unicode \xe2\x80\xa8 Line Separator"},
-}
-
-func TestTitle(t *testing.T) {
-	for _, tt := range TitleTests {
-		if s := Title(tt.in); s != tt.out {
-			t.Errorf("Title(%q) = %q, want %q", tt.in, s, tt.out)
-		}
-	}
-}
-
-var ContainsTests = []struct {
-	str, substr string
-	expected    bool
-}{
-	{"abc", "bc", true},
-	{"abc", "bcd", false},
-	{"abc", "", true},
-	{"", "a", false},
-}
-
-func TestContains(t *testing.T) {
-	for _, ct := range ContainsTests {
-		if Contains(ct.str, ct.substr) != ct.expected {
-			t.Errorf("Contains(%s, %s) = %v, want %v",
-				ct.str, ct.substr, !ct.expected, ct.expected)
-		}
-	}
-}
-
-var ContainsAnyTests = []struct {
-	str, substr string
-	expected    bool
-}{
-	{"", "", false},
-	{"", "a", false},
-	{"", "abc", false},
-	{"a", "", false},
-	{"a", "a", true},
-	{"aaa", "a", true},
-	{"abc", "xyz", false},
-	{"abc", "xcz", true},
-	{"a☺b☻c☹d", "uvw☻xyz", true},
-	{"aRegExp*", ".(|)*+?^$[]", true},
-	{dots + dots + dots, " ", false},
-}
-
-func TestContainsAny(t *testing.T) {
-	for _, ct := range ContainsAnyTests {
-		if ContainsAny(ct.str, ct.substr) != ct.expected {
-			t.Errorf("ContainsAny(%s, %s) = %v, want %v",
-				ct.str, ct.substr, !ct.expected, ct.expected)
-		}
-	}
-}
-
-var ContainsRuneTests = []struct {
-	str      string
-	r        rune
-	expected bool
-}{
-	{"", 'a', false},
-	{"a", 'a', true},
-	{"aaa", 'a', true},
-	{"abc", 'y', false},
-	{"abc", 'c', true},
-	{"a☺b☻c☹d", 'x', false},
-	{"a☺b☻c☹d", '☻', true},
-	{"aRegExp*", '*', true},
-}
-
-func TestContainsRune(t *testing.T) {
-	for _, ct := range ContainsRuneTests {
-		if ContainsRune(ct.str, ct.r) != ct.expected {
-			t.Errorf("ContainsRune(%q, %q) = %v, want %v",
-				ct.str, ct.r, !ct.expected, ct.expected)
-		}
-	}
-}
-
-var EqualFoldTests = []struct {
-	s, t string
-	out  bool
-}{
-	{"abc", "abc", true},
-	{"ABcd", "ABcd", true},
-	{"123abc", "123ABC", true},
-	{"αβδ", "ΑΒΔ", true},
-	{"abc", "xyz", false},
-	{"abc", "XYZ", false},
-	{"abcdefghijk", "abcdefghijX", false},
-	{"abcdefghijk", "abcdefghij\u212A", true},
-	{"abcdefghijK", "abcdefghij\u212A", true},
-	{"abcdefghijkz", "abcdefghij\u212Ay", false},
-	{"abcdefghijKz", "abcdefghij\u212Ay", false},
-}
-
-func TestEqualFold(t *testing.T) {
-	for _, tt := range EqualFoldTests {
-		if out := EqualFold(tt.s, tt.t); out != tt.out {
-			t.Errorf("EqualFold(%#q, %#q) = %v, want %v", tt.s, tt.t, out, tt.out)
-		}
-		if out := EqualFold(tt.t, tt.s); out != tt.out {
-			t.Errorf("EqualFold(%#q, %#q) = %v, want %v", tt.t, tt.s, out, tt.out)
-		}
-	}
-}
-
-var CountTests = []struct {
-	s, sep string
-	num    int
-}{
-	{"", "", 1},
-	{"", "notempty", 0},
-	{"notempty", "", 9},
-	{"smaller", "not smaller", 0},
-	{"12345678987654321", "6", 2},
-	{"611161116", "6", 3},
-	{"notequal", "NotEqual", 0},
-	{"equal", "equal", 1},
-	{"abc1231231123q", "123", 3},
-	{"11111", "11", 2},
-}
-
-func TestCount(t *testing.T) {
-	for _, tt := range CountTests {
-		if num := Count(tt.s, tt.sep); num != tt.num {
-			t.Errorf("Count(\"%s\", \"%s\") = %d, want %d", tt.s, tt.sep, num, tt.num)
-		}
-	}
-}
-
-func makeBenchInputHard() string {
-	tokens := [...]string{
-		"<a>", "<p>", "<b>", "<strong>",
-		"</a>", "</p>", "</b>", "</strong>",
-		"hello", "world",
-	}
-	x := make([]byte, 0, 1<<20)
-	for {
-		i := rand.Intn(len(tokens))
-		if len(x)+len(tokens[i]) >= 1<<20 {
-			break
-		}
-		x = append(x, tokens[i]...)
-	}
-	return string(x)
-}
-
-var benchInputHard = makeBenchInputHard()
-
-func benchmarkIndexHard(b *testing.B, sep string) {
-	for i := 0; i < b.N; i++ {
-		Index(benchInputHard, sep)
-	}
-}
-
-func benchmarkLastIndexHard(b *testing.B, sep string) {
-	for i := 0; i < b.N; i++ {
-		LastIndex(benchInputHard, sep)
-	}
-}
-
-func benchmarkCountHard(b *testing.B, sep string) {
-	for i := 0; i < b.N; i++ {
-		Count(benchInputHard, sep)
-	}
-}
-
-func BenchmarkIndexHard1(b *testing.B) { benchmarkIndexHard(b, "<>") }
-func BenchmarkIndexHard2(b *testing.B) { benchmarkIndexHard(b, "</pre>") }
-func BenchmarkIndexHard3(b *testing.B) { benchmarkIndexHard(b, "<b>hello world</b>") }
-
-func BenchmarkLastIndexHard1(b *testing.B) { benchmarkLastIndexHard(b, "<>") }
-func BenchmarkLastIndexHard2(b *testing.B) { benchmarkLastIndexHard(b, "</pre>") }
-func BenchmarkLastIndexHard3(b *testing.B) { benchmarkLastIndexHard(b, "<b>hello world</b>") }
-
-func BenchmarkCountHard1(b *testing.B) { benchmarkCountHard(b, "<>") }
-func BenchmarkCountHard2(b *testing.B) { benchmarkCountHard(b, "</pre>") }
-func BenchmarkCountHard3(b *testing.B) { benchmarkCountHard(b, "<b>hello world</b>") }
-
-var benchInputTorture = Repeat("ABC", 1<<10) + "123" + Repeat("ABC", 1<<10)
-var benchNeedleTorture = Repeat("ABC", 1<<10+1)
-
-func BenchmarkIndexTorture(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Index(benchInputTorture, benchNeedleTorture)
-	}
-}
-
-func BenchmarkCountTorture(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Count(benchInputTorture, benchNeedleTorture)
-	}
-}
-
-func BenchmarkCountTortureOverlapping(b *testing.B) {
-	A := Repeat("ABC", 1<<20)
-	B := Repeat("ABC", 1<<10)
-	for i := 0; i < b.N; i++ {
-		Count(A, B)
-	}
-}
-
-var makeFieldsInput = func() string {
-	x := make([]byte, 1<<20)
-	// Input is ~10% space, ~10% 2-byte UTF-8, rest ASCII non-space.
-	for i := range x {
-		switch rand.Intn(10) {
-		case 0:
-			x[i] = ' '
-		case 1:
-			if i > 0 && x[i-1] == 'x' {
-				copy(x[i-1:], "χ")
-				break
-			}
-			fallthrough
-		default:
-			x[i] = 'x'
-		}
-	}
-	return string(x)
-}
-
-var fieldsInput = makeFieldsInput()
-
-func BenchmarkFields(b *testing.B) {
-	b.SetBytes(int64(len(fieldsInput)))
-	for i := 0; i < b.N; i++ {
-		Fields(fieldsInput)
-	}
-}
-
-func BenchmarkFieldsFunc(b *testing.B) {
-	b.SetBytes(int64(len(fieldsInput)))
-	for i := 0; i < b.N; i++ {
-		FieldsFunc(fieldsInput, unicode.IsSpace)
-	}
-}
-
-func BenchmarkSplit1(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Split(benchInputHard, "")
-	}
-}
-
-func BenchmarkSplit2(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Split(benchInputHard, "/")
-	}
-}
-
-func BenchmarkSplit3(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Split(benchInputHard, "hello")
-	}
-}
-
-func BenchmarkRepeat(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Repeat("-", 80)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/sync/atomic/64bit_arm.go b/third_party/gofrontend/libgo/go/sync/atomic/64bit_arm.go
deleted file mode 100644
index b98e608..0000000
--- a/third_party/gofrontend/libgo/go/sync/atomic/64bit_arm.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package atomic
-
-func loadUint64(addr *uint64) (val uint64) {
-	for {
-		val = *addr
-		if CompareAndSwapUint64(addr, val, val) {
-			break
-		}
-	}
-	return
-}
-
-func storeUint64(addr *uint64, val uint64) {
-	for {
-		old := *addr
-		if CompareAndSwapUint64(addr, old, val) {
-			break
-		}
-	}
-	return
-}
-
-func addUint64(val *uint64, delta uint64) (new uint64) {
-	for {
-		old := *val
-		new = old + delta
-		if CompareAndSwapUint64(val, old, new) {
-			break
-		}
-	}
-	return
-}
-
-func swapUint64(addr *uint64, new uint64) (old uint64) {
-	for {
-		old = *addr
-		if CompareAndSwapUint64(addr, old, new) {
-			break
-		}
-	}
-	return
-}
-
-// Additional ARM-specific assembly routines.
-// Declaration here to give assembly routines correct stack maps for arguments.
-func armCompareAndSwapUint32(addr *uint32, old, new uint32) (swapped bool)
-func armCompareAndSwapUint64(addr *uint64, old, new uint64) (swapped bool)
-func generalCAS64(addr *uint64, old, new uint64) (swapped bool)
-func armAddUint32(addr *uint32, delta uint32) (new uint32)
-func armAddUint64(addr *uint64, delta uint64) (new uint64)
-func armSwapUint32(addr *uint32, new uint32) (old uint32)
-func armSwapUint64(addr *uint64, new uint64) (old uint64)
-func armLoadUint64(addr *uint64) (val uint64)
-func armStoreUint64(addr *uint64, val uint64)
diff --git a/third_party/gofrontend/libgo/go/sync/atomic/atomic.c b/third_party/gofrontend/libgo/go/sync/atomic/atomic.c
deleted file mode 100644
index f0ba57b..0000000
--- a/third_party/gofrontend/libgo/go/sync/atomic/atomic.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/* atomic.c -- implement atomic routines for Go.
-
-   Copyright 2011 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stdint.h>
-
-#include "runtime.h"
-
-int32_t SwapInt32 (int32_t *, int32_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.SwapInt32")
-  __attribute__ ((no_split_stack));
-
-int32_t
-SwapInt32 (int32_t *addr, int32_t new)
-{
-  return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST);
-}
-
-int64_t SwapInt64 (int64_t *, int64_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.SwapInt64")
-  __attribute__ ((no_split_stack));
-
-int64_t
-SwapInt64 (int64_t *addr, int64_t new)
-{
-  return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST);
-}
-
-uint32_t SwapUint32 (uint32_t *, uint32_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.SwapUint32")
-  __attribute__ ((no_split_stack));
-
-uint32_t
-SwapUint32 (uint32_t *addr, uint32_t new)
-{
-  return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST);
-}
-
-uint64_t SwapUint64 (uint64_t *, uint64_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.SwapUint64")
-  __attribute__ ((no_split_stack));
-
-uint64_t
-SwapUint64 (uint64_t *addr, uint64_t new)
-{
-  return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST);
-}
-
-uintptr_t SwapUintptr (uintptr_t *, uintptr_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.SwapUintptr")
-  __attribute__ ((no_split_stack));
-
-uintptr_t
-SwapUintptr (uintptr_t *addr, uintptr_t new)
-{
-  return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST);
-}
-
-void *SwapPointer (void **, void *)
-  __asm__ (GOSYM_PREFIX "sync_atomic.SwapPointer")
-  __attribute__ ((no_split_stack));
-
-void *
-SwapPointer (void **addr, void *new)
-{
-  return __atomic_exchange_n (addr, new, __ATOMIC_SEQ_CST);
-}
-
-_Bool CompareAndSwapInt32 (int32_t *, int32_t, int32_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.CompareAndSwapInt32")
-  __attribute__ ((no_split_stack));
-
-_Bool
-CompareAndSwapInt32 (int32_t *val, int32_t old, int32_t new)
-{
-  return __sync_bool_compare_and_swap (val, old, new);
-}
-
-_Bool CompareAndSwapInt64 (int64_t *, int64_t, int64_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.CompareAndSwapInt64")
-  __attribute__ ((no_split_stack));
-
-_Bool
-CompareAndSwapInt64 (int64_t *val, int64_t old, int64_t new)
-{
-  return __sync_bool_compare_and_swap (val, old, new);
-}
-
-_Bool CompareAndSwapUint32 (uint32_t *, uint32_t, uint32_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.CompareAndSwapUint32")
-  __attribute__ ((no_split_stack));
-
-_Bool
-CompareAndSwapUint32 (uint32_t *val, uint32_t old, uint32_t new)
-{
-  return __sync_bool_compare_and_swap (val, old, new);
-}
-
-_Bool CompareAndSwapUint64 (uint64_t *, uint64_t, uint64_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.CompareAndSwapUint64")
-  __attribute__ ((no_split_stack));
-
-_Bool
-CompareAndSwapUint64 (uint64_t *val, uint64_t old, uint64_t new)
-{
-  return __sync_bool_compare_and_swap (val, old, new);
-}
-
-_Bool CompareAndSwapUintptr (uintptr_t *, uintptr_t, uintptr_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.CompareAndSwapUintptr")
-  __attribute__ ((no_split_stack));
-
-_Bool
-CompareAndSwapUintptr (uintptr_t *val, uintptr_t old, uintptr_t new)
-{
-  return __sync_bool_compare_and_swap (val, old, new);
-}
-
-_Bool CompareAndSwapPointer (void **, void *, void *)
-  __asm__ (GOSYM_PREFIX "sync_atomic.CompareAndSwapPointer")
-  __attribute__ ((no_split_stack));
-
-_Bool
-CompareAndSwapPointer (void **val, void *old, void *new)
-{
-  return __sync_bool_compare_and_swap (val, old, new);
-}
-
-int32_t AddInt32 (int32_t *, int32_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.AddInt32")
-  __attribute__ ((no_split_stack));
-
-int32_t
-AddInt32 (int32_t *val, int32_t delta)
-{
-  return __sync_add_and_fetch (val, delta);
-}
-
-uint32_t AddUint32 (uint32_t *, uint32_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.AddUint32")
-  __attribute__ ((no_split_stack));
-
-uint32_t
-AddUint32 (uint32_t *val, uint32_t delta)
-{
-  return __sync_add_and_fetch (val, delta);
-}
-
-int64_t AddInt64 (int64_t *, int64_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.AddInt64")
-  __attribute__ ((no_split_stack));
-
-int64_t
-AddInt64 (int64_t *val, int64_t delta)
-{
-  return __sync_add_and_fetch (val, delta);
-}
-
-uint64_t AddUint64 (uint64_t *, uint64_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.AddUint64")
-  __attribute__ ((no_split_stack));
-
-uint64_t
-AddUint64 (uint64_t *val, uint64_t delta)
-{
-  return __sync_add_and_fetch (val, delta);
-}
-
-uintptr_t AddUintptr (uintptr_t *, uintptr_t)
-  __asm__ (GOSYM_PREFIX "sync_atomic.AddUintptr")
-  __attribute__ ((no_split_stack));
-
-uintptr_t
-AddUintptr (uintptr_t *val, uintptr_t delta)
-{
-  return __sync_add_and_fetch (val, delta);
-}
-
-int32_t LoadInt32 (int32_t *addr)
-  __asm__ (GOSYM_PREFIX "sync_atomic.LoadInt32")
-  __attribute__ ((no_split_stack));
-
-int32_t
-LoadInt32 (int32_t *addr)
-{
-  int32_t v;
-
-  v = *addr;
-  while (! __sync_bool_compare_and_swap (addr, v, v))
-    v = *addr;
-  return v;
-}
-
-int64_t LoadInt64 (int64_t *addr)
-  __asm__ (GOSYM_PREFIX "sync_atomic.LoadInt64")
-  __attribute__ ((no_split_stack));
-
-int64_t
-LoadInt64 (int64_t *addr)
-{
-  int64_t v;
-
-  v = *addr;
-  while (! __sync_bool_compare_and_swap (addr, v, v))
-    v = *addr;
-  return v;
-}
-
-uint32_t LoadUint32 (uint32_t *addr)
-  __asm__ (GOSYM_PREFIX "sync_atomic.LoadUint32")
-  __attribute__ ((no_split_stack));
-
-uint32_t
-LoadUint32 (uint32_t *addr)
-{
-  uint32_t v;
-
-  v = *addr;
-  while (! __sync_bool_compare_and_swap (addr, v, v))
-    v = *addr;
-  return v;
-}
-
-uint64_t LoadUint64 (uint64_t *addr)
-  __asm__ (GOSYM_PREFIX "sync_atomic.LoadUint64")
-  __attribute__ ((no_split_stack));
-
-uint64_t
-LoadUint64 (uint64_t *addr)
-{
-  uint64_t v;
-
-  v = *addr;
-  while (! __sync_bool_compare_and_swap (addr, v, v))
-    v = *addr;
-  return v;
-}
-
-uintptr_t LoadUintptr (uintptr_t *addr)
-  __asm__ (GOSYM_PREFIX "sync_atomic.LoadUintptr")
-  __attribute__ ((no_split_stack));
-
-uintptr_t
-LoadUintptr (uintptr_t *addr)
-{
-  uintptr_t v;
-
-  v = *addr;
-  while (! __sync_bool_compare_and_swap (addr, v, v))
-    v = *addr;
-  return v;
-}
-
-void *LoadPointer (void **addr)
-  __asm__ (GOSYM_PREFIX "sync_atomic.LoadPointer")
-  __attribute__ ((no_split_stack));
-
-void *
-LoadPointer (void **addr)
-{
-  void *v;
-
-  v = *addr;
-  while (! __sync_bool_compare_and_swap (addr, v, v))
-    v = *addr;
-  return v;
-}
-
-void StoreInt32 (int32_t *addr, int32_t val)
-  __asm__ (GOSYM_PREFIX "sync_atomic.StoreInt32")
-  __attribute__ ((no_split_stack));
-
-void
-StoreInt32 (int32_t *addr, int32_t val)
-{
-  int32_t v;
-
-  v = *addr;
-  while (! __sync_bool_compare_and_swap (addr, v, val))
-    v = *addr;
-}
-
-void StoreInt64 (int64_t *addr, int64_t val)
-  __asm__ (GOSYM_PREFIX "sync_atomic.StoreInt64")
-  __attribute__ ((no_split_stack));
-
-void
-StoreInt64 (int64_t *addr, int64_t val)
-{
-  int64_t v;
-
-  v = *addr;
-  while (! __sync_bool_compare_and_swap (addr, v, val))
-    v = *addr;
-}
-
-void StoreUint32 (uint32_t *addr, uint32_t val)
-  __asm__ (GOSYM_PREFIX "sync_atomic.StoreUint32")
-  __attribute__ ((no_split_stack));
-
-void
-StoreUint32 (uint32_t *addr, uint32_t val)
-{
-  uint32_t v;
-
-  v = *addr;
-  while (! __sync_bool_compare_and_swap (addr, v, val))
-    v = *addr;
-}
-
-void StoreUint64 (uint64_t *addr, uint64_t val)
-  __asm__ (GOSYM_PREFIX "sync_atomic.StoreUint64")
-  __attribute__ ((no_split_stack));
-
-void
-StoreUint64 (uint64_t *addr, uint64_t val)
-{
-  uint64_t v;
-
-  v = *addr;
-  while (! __sync_bool_compare_and_swap (addr, v, val))
-    v = *addr;
-}
-
-void StoreUintptr (uintptr_t *addr, uintptr_t val)
-  __asm__ (GOSYM_PREFIX "sync_atomic.StoreUintptr")
-  __attribute__ ((no_split_stack));
-
-void
-StoreUintptr (uintptr_t *addr, uintptr_t val)
-{
-  uintptr_t v;
-
-  v = *addr;
-  while (! __sync_bool_compare_and_swap (addr, v, val))
-    v = *addr;
-}
-
-void StorePointer (void **addr, void *val)
-  __asm__ (GOSYM_PREFIX "sync_atomic.StorePointer")
-  __attribute__ ((no_split_stack));
-
-void
-StorePointer (void **addr, void *val)
-{
-  void *v;
-
-  v = *addr;
-  while (! __sync_bool_compare_and_swap (addr, v, val))
-    v = *addr;
-}
diff --git a/third_party/gofrontend/libgo/go/sync/atomic/atomic_test.go b/third_party/gofrontend/libgo/go/sync/atomic/atomic_test.go
deleted file mode 100644
index 6dae0fd..0000000
--- a/third_party/gofrontend/libgo/go/sync/atomic/atomic_test.go
+++ /dev/null
@@ -1,1448 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package atomic_test
-
-import (
-	"fmt"
-	"runtime"
-	"strings"
-	. "sync/atomic"
-	"testing"
-	"unsafe"
-)
-
-// Tests of correct behavior, without contention.
-// (Does the function work as advertised?)
-//
-// Test that the Add functions add correctly.
-// Test that the CompareAndSwap functions actually
-// do the comparison and the swap correctly.
-//
-// The loop over power-of-two values is meant to
-// ensure that the operations apply to the full word size.
-// The struct fields x.before and x.after check that the
-// operations do not extend past the full word size.
-
-const (
-	magic32 = 0xdedbeef
-	magic64 = 0xdeddeadbeefbeef
-)
-
-// Do the 64-bit functions panic?  If so, don't bother testing.
-var test64err = func() (err interface{}) {
-	defer func() {
-		err = recover()
-	}()
-	var x int64
-	AddInt64(&x, 1)
-	return nil
-}()
-
-func TestSwapInt32(t *testing.T) {
-	var x struct {
-		before int32
-		i      int32
-		after  int32
-	}
-	x.before = magic32
-	x.after = magic32
-	var j int32
-	for delta := int32(1); delta+delta > delta; delta += delta {
-		k := SwapInt32(&x.i, delta)
-		if x.i != delta || k != j {
-			t.Fatalf("delta=%d i=%d j=%d k=%d", delta, x.i, j, k)
-		}
-		j = delta
-	}
-	if x.before != magic32 || x.after != magic32 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magic32, magic32)
-	}
-}
-
-func TestSwapUint32(t *testing.T) {
-	var x struct {
-		before uint32
-		i      uint32
-		after  uint32
-	}
-	x.before = magic32
-	x.after = magic32
-	var j uint32
-	for delta := uint32(1); delta+delta > delta; delta += delta {
-		k := SwapUint32(&x.i, delta)
-		if x.i != delta || k != j {
-			t.Fatalf("delta=%d i=%d j=%d k=%d", delta, x.i, j, k)
-		}
-		j = delta
-	}
-	if x.before != magic32 || x.after != magic32 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magic32, magic32)
-	}
-}
-
-func TestSwapInt64(t *testing.T) {
-	if test64err != nil {
-		t.Skipf("Skipping 64-bit tests: %v", test64err)
-	}
-	var x struct {
-		before int64
-		i      int64
-		after  int64
-	}
-	x.before = magic64
-	x.after = magic64
-	var j int64
-	for delta := int64(1); delta+delta > delta; delta += delta {
-		k := SwapInt64(&x.i, delta)
-		if x.i != delta || k != j {
-			t.Fatalf("delta=%d i=%d j=%d k=%d", delta, x.i, j, k)
-		}
-		j = delta
-	}
-	if x.before != magic64 || x.after != magic64 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, uint64(magic64), uint64(magic64))
-	}
-}
-
-func TestSwapUint64(t *testing.T) {
-	if test64err != nil {
-		t.Skipf("Skipping 64-bit tests: %v", test64err)
-	}
-	var x struct {
-		before uint64
-		i      uint64
-		after  uint64
-	}
-	x.before = magic64
-	x.after = magic64
-	var j uint64
-	for delta := uint64(1); delta+delta > delta; delta += delta {
-		k := SwapUint64(&x.i, delta)
-		if x.i != delta || k != j {
-			t.Fatalf("delta=%d i=%d j=%d k=%d", delta, x.i, j, k)
-		}
-		j = delta
-	}
-	if x.before != magic64 || x.after != magic64 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, uint64(magic64), uint64(magic64))
-	}
-}
-
-func TestSwapUintptr(t *testing.T) {
-	var x struct {
-		before uintptr
-		i      uintptr
-		after  uintptr
-	}
-	var m uint64 = magic64
-	magicptr := uintptr(m)
-	x.before = magicptr
-	x.after = magicptr
-	var j uintptr
-	for delta := uintptr(1); delta+delta > delta; delta += delta {
-		k := SwapUintptr(&x.i, delta)
-		if x.i != delta || k != j {
-			t.Fatalf("delta=%d i=%d j=%d k=%d", delta, x.i, j, k)
-		}
-		j = delta
-	}
-	if x.before != magicptr || x.after != magicptr {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magicptr, magicptr)
-	}
-}
-
-func TestSwapPointer(t *testing.T) {
-	var x struct {
-		before uintptr
-		i      unsafe.Pointer
-		after  uintptr
-	}
-	var m uint64 = magic64
-	magicptr := uintptr(m)
-	x.before = magicptr
-	x.after = magicptr
-	var j uintptr
-	for delta := uintptr(1 << 16); delta+delta > delta; delta += delta {
-		k := SwapPointer(&x.i, unsafe.Pointer(delta))
-		if uintptr(x.i) != delta || uintptr(k) != j {
-			t.Fatalf("delta=%d i=%d j=%d k=%d", delta, x.i, j, k)
-		}
-		j = delta
-	}
-	if x.before != magicptr || x.after != magicptr {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magicptr, magicptr)
-	}
-}
-
-func TestAddInt32(t *testing.T) {
-	var x struct {
-		before int32
-		i      int32
-		after  int32
-	}
-	x.before = magic32
-	x.after = magic32
-	var j int32
-	for delta := int32(1); delta+delta > delta; delta += delta {
-		k := AddInt32(&x.i, delta)
-		j += delta
-		if x.i != j || k != j {
-			t.Fatalf("delta=%d i=%d j=%d k=%d", delta, x.i, j, k)
-		}
-	}
-	if x.before != magic32 || x.after != magic32 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magic32, magic32)
-	}
-}
-
-func TestAddUint32(t *testing.T) {
-	var x struct {
-		before uint32
-		i      uint32
-		after  uint32
-	}
-	x.before = magic32
-	x.after = magic32
-	var j uint32
-	for delta := uint32(1); delta+delta > delta; delta += delta {
-		k := AddUint32(&x.i, delta)
-		j += delta
-		if x.i != j || k != j {
-			t.Fatalf("delta=%d i=%d j=%d k=%d", delta, x.i, j, k)
-		}
-	}
-	if x.before != magic32 || x.after != magic32 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magic32, magic32)
-	}
-}
-
-func TestAddInt64(t *testing.T) {
-	if test64err != nil {
-		t.Skipf("Skipping 64-bit tests: %v", test64err)
-	}
-	var x struct {
-		before int64
-		i      int64
-		after  int64
-	}
-	x.before = magic64
-	x.after = magic64
-	var j int64
-	for delta := int64(1); delta+delta > delta; delta += delta {
-		k := AddInt64(&x.i, delta)
-		j += delta
-		if x.i != j || k != j {
-			t.Fatalf("delta=%d i=%d j=%d k=%d", delta, x.i, j, k)
-		}
-	}
-	if x.before != magic64 || x.after != magic64 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, int64(magic64), int64(magic64))
-	}
-}
-
-func TestAddUint64(t *testing.T) {
-	if test64err != nil {
-		t.Skipf("Skipping 64-bit tests: %v", test64err)
-	}
-	var x struct {
-		before uint64
-		i      uint64
-		after  uint64
-	}
-	x.before = magic64
-	x.after = magic64
-	var j uint64
-	for delta := uint64(1); delta+delta > delta; delta += delta {
-		k := AddUint64(&x.i, delta)
-		j += delta
-		if x.i != j || k != j {
-			t.Fatalf("delta=%d i=%d j=%d k=%d", delta, x.i, j, k)
-		}
-	}
-	if x.before != magic64 || x.after != magic64 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, uint64(magic64), uint64(magic64))
-	}
-}
-
-func TestAddUintptr(t *testing.T) {
-	var x struct {
-		before uintptr
-		i      uintptr
-		after  uintptr
-	}
-	var m uint64 = magic64
-	magicptr := uintptr(m)
-	x.before = magicptr
-	x.after = magicptr
-	var j uintptr
-	for delta := uintptr(1); delta+delta > delta; delta += delta {
-		k := AddUintptr(&x.i, delta)
-		j += delta
-		if x.i != j || k != j {
-			t.Fatalf("delta=%d i=%d j=%d k=%d", delta, x.i, j, k)
-		}
-	}
-	if x.before != magicptr || x.after != magicptr {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magicptr, magicptr)
-	}
-}
-
-func TestCompareAndSwapInt32(t *testing.T) {
-	var x struct {
-		before int32
-		i      int32
-		after  int32
-	}
-	x.before = magic32
-	x.after = magic32
-	for val := int32(1); val+val > val; val += val {
-		x.i = val
-		if !CompareAndSwapInt32(&x.i, val, val+1) {
-			t.Fatalf("should have swapped %#x %#x", val, val+1)
-		}
-		if x.i != val+1 {
-			t.Fatalf("wrong x.i after swap: x.i=%#x val+1=%#x", x.i, val+1)
-		}
-		x.i = val + 1
-		if CompareAndSwapInt32(&x.i, val, val+2) {
-			t.Fatalf("should not have swapped %#x %#x", val, val+2)
-		}
-		if x.i != val+1 {
-			t.Fatalf("wrong x.i after swap: x.i=%#x val+1=%#x", x.i, val+1)
-		}
-	}
-	if x.before != magic32 || x.after != magic32 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magic32, magic32)
-	}
-}
-
-func TestCompareAndSwapUint32(t *testing.T) {
-	var x struct {
-		before uint32
-		i      uint32
-		after  uint32
-	}
-	x.before = magic32
-	x.after = magic32
-	for val := uint32(1); val+val > val; val += val {
-		x.i = val
-		if !CompareAndSwapUint32(&x.i, val, val+1) {
-			t.Fatalf("should have swapped %#x %#x", val, val+1)
-		}
-		if x.i != val+1 {
-			t.Fatalf("wrong x.i after swap: x.i=%#x val+1=%#x", x.i, val+1)
-		}
-		x.i = val + 1
-		if CompareAndSwapUint32(&x.i, val, val+2) {
-			t.Fatalf("should not have swapped %#x %#x", val, val+2)
-		}
-		if x.i != val+1 {
-			t.Fatalf("wrong x.i after swap: x.i=%#x val+1=%#x", x.i, val+1)
-		}
-	}
-	if x.before != magic32 || x.after != magic32 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magic32, magic32)
-	}
-}
-
-func TestCompareAndSwapInt64(t *testing.T) {
-	if test64err != nil {
-		t.Skipf("Skipping 64-bit tests: %v", test64err)
-	}
-	var x struct {
-		before int64
-		i      int64
-		after  int64
-	}
-	x.before = magic64
-	x.after = magic64
-	for val := int64(1); val+val > val; val += val {
-		x.i = val
-		if !CompareAndSwapInt64(&x.i, val, val+1) {
-			t.Fatalf("should have swapped %#x %#x", val, val+1)
-		}
-		if x.i != val+1 {
-			t.Fatalf("wrong x.i after swap: x.i=%#x val+1=%#x", x.i, val+1)
-		}
-		x.i = val + 1
-		if CompareAndSwapInt64(&x.i, val, val+2) {
-			t.Fatalf("should not have swapped %#x %#x", val, val+2)
-		}
-		if x.i != val+1 {
-			t.Fatalf("wrong x.i after swap: x.i=%#x val+1=%#x", x.i, val+1)
-		}
-	}
-	if x.before != magic64 || x.after != magic64 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, uint64(magic64), uint64(magic64))
-	}
-}
-
-func testCompareAndSwapUint64(t *testing.T, cas func(*uint64, uint64, uint64) bool) {
-	if test64err != nil {
-		t.Skipf("Skipping 64-bit tests: %v", test64err)
-	}
-	var x struct {
-		before uint64
-		i      uint64
-		after  uint64
-	}
-	x.before = magic64
-	x.after = magic64
-	for val := uint64(1); val+val > val; val += val {
-		x.i = val
-		if !cas(&x.i, val, val+1) {
-			t.Fatalf("should have swapped %#x %#x", val, val+1)
-		}
-		if x.i != val+1 {
-			t.Fatalf("wrong x.i after swap: x.i=%#x val+1=%#x", x.i, val+1)
-		}
-		x.i = val + 1
-		if cas(&x.i, val, val+2) {
-			t.Fatalf("should not have swapped %#x %#x", val, val+2)
-		}
-		if x.i != val+1 {
-			t.Fatalf("wrong x.i after swap: x.i=%#x val+1=%#x", x.i, val+1)
-		}
-	}
-	if x.before != magic64 || x.after != magic64 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, uint64(magic64), uint64(magic64))
-	}
-}
-
-func TestCompareAndSwapUint64(t *testing.T) {
-	testCompareAndSwapUint64(t, CompareAndSwapUint64)
-}
-
-func TestCompareAndSwapUintptr(t *testing.T) {
-	var x struct {
-		before uintptr
-		i      uintptr
-		after  uintptr
-	}
-	var m uint64 = magic64
-	magicptr := uintptr(m)
-	x.before = magicptr
-	x.after = magicptr
-	for val := uintptr(1); val+val > val; val += val {
-		x.i = val
-		if !CompareAndSwapUintptr(&x.i, val, val+1) {
-			t.Fatalf("should have swapped %#x %#x", val, val+1)
-		}
-		if x.i != val+1 {
-			t.Fatalf("wrong x.i after swap: x.i=%#x val+1=%#x", x.i, val+1)
-		}
-		x.i = val + 1
-		if CompareAndSwapUintptr(&x.i, val, val+2) {
-			t.Fatalf("should not have swapped %#x %#x", val, val+2)
-		}
-		if x.i != val+1 {
-			t.Fatalf("wrong x.i after swap: x.i=%#x val+1=%#x", x.i, val+1)
-		}
-	}
-	if x.before != magicptr || x.after != magicptr {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magicptr, magicptr)
-	}
-}
-
-func TestCompareAndSwapPointer(t *testing.T) {
-	var x struct {
-		before uintptr
-		i      unsafe.Pointer
-		after  uintptr
-	}
-	var m uint64 = magic64
-	magicptr := uintptr(m)
-	x.before = magicptr
-	x.after = magicptr
-	for val := uintptr(1 << 16); val+val > val; val += val {
-		x.i = unsafe.Pointer(val)
-		if !CompareAndSwapPointer(&x.i, unsafe.Pointer(val), unsafe.Pointer(val+1)) {
-			t.Fatalf("should have swapped %#x %#x", val, val+1)
-		}
-		if x.i != unsafe.Pointer(val+1) {
-			t.Fatalf("wrong x.i after swap: x.i=%#x val+1=%#x", x.i, val+1)
-		}
-		x.i = unsafe.Pointer(val + 1)
-		if CompareAndSwapPointer(&x.i, unsafe.Pointer(val), unsafe.Pointer(val+2)) {
-			t.Fatalf("should not have swapped %#x %#x", val, val+2)
-		}
-		if x.i != unsafe.Pointer(val+1) {
-			t.Fatalf("wrong x.i after swap: x.i=%#x val+1=%#x", x.i, val+1)
-		}
-	}
-	if x.before != magicptr || x.after != magicptr {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magicptr, magicptr)
-	}
-}
-
-func TestLoadInt32(t *testing.T) {
-	var x struct {
-		before int32
-		i      int32
-		after  int32
-	}
-	x.before = magic32
-	x.after = magic32
-	for delta := int32(1); delta+delta > delta; delta += delta {
-		k := LoadInt32(&x.i)
-		if k != x.i {
-			t.Fatalf("delta=%d i=%d k=%d", delta, x.i, k)
-		}
-		x.i += delta
-	}
-	if x.before != magic32 || x.after != magic32 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magic32, magic32)
-	}
-}
-
-func TestLoadUint32(t *testing.T) {
-	var x struct {
-		before uint32
-		i      uint32
-		after  uint32
-	}
-	x.before = magic32
-	x.after = magic32
-	for delta := uint32(1); delta+delta > delta; delta += delta {
-		k := LoadUint32(&x.i)
-		if k != x.i {
-			t.Fatalf("delta=%d i=%d k=%d", delta, x.i, k)
-		}
-		x.i += delta
-	}
-	if x.before != magic32 || x.after != magic32 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magic32, magic32)
-	}
-}
-
-func TestLoadInt64(t *testing.T) {
-	if test64err != nil {
-		t.Skipf("Skipping 64-bit tests: %v", test64err)
-	}
-	var x struct {
-		before int64
-		i      int64
-		after  int64
-	}
-	x.before = magic64
-	x.after = magic64
-	for delta := int64(1); delta+delta > delta; delta += delta {
-		k := LoadInt64(&x.i)
-		if k != x.i {
-			t.Fatalf("delta=%d i=%d k=%d", delta, x.i, k)
-		}
-		x.i += delta
-	}
-	if x.before != magic64 || x.after != magic64 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, uint64(magic64), uint64(magic64))
-	}
-}
-
-func TestLoadUint64(t *testing.T) {
-	if test64err != nil {
-		t.Skipf("Skipping 64-bit tests: %v", test64err)
-	}
-	var x struct {
-		before uint64
-		i      uint64
-		after  uint64
-	}
-	x.before = magic64
-	x.after = magic64
-	for delta := uint64(1); delta+delta > delta; delta += delta {
-		k := LoadUint64(&x.i)
-		if k != x.i {
-			t.Fatalf("delta=%d i=%d k=%d", delta, x.i, k)
-		}
-		x.i += delta
-	}
-	if x.before != magic64 || x.after != magic64 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, uint64(magic64), uint64(magic64))
-	}
-}
-
-func TestLoadUintptr(t *testing.T) {
-	var x struct {
-		before uintptr
-		i      uintptr
-		after  uintptr
-	}
-	var m uint64 = magic64
-	magicptr := uintptr(m)
-	x.before = magicptr
-	x.after = magicptr
-	for delta := uintptr(1); delta+delta > delta; delta += delta {
-		k := LoadUintptr(&x.i)
-		if k != x.i {
-			t.Fatalf("delta=%d i=%d k=%d", delta, x.i, k)
-		}
-		x.i += delta
-	}
-	if x.before != magicptr || x.after != magicptr {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magicptr, magicptr)
-	}
-}
-
-func TestLoadPointer(t *testing.T) {
-	var x struct {
-		before uintptr
-		i      unsafe.Pointer
-		after  uintptr
-	}
-	var m uint64 = magic64
-	magicptr := uintptr(m)
-	x.before = magicptr
-	x.after = magicptr
-	for delta := uintptr(1 << 16); delta+delta > delta; delta += delta {
-		k := LoadPointer(&x.i)
-		if k != x.i {
-			t.Fatalf("delta=%d i=%d k=%d", delta, x.i, k)
-		}
-		x.i = unsafe.Pointer(uintptr(x.i) + delta)
-	}
-	if x.before != magicptr || x.after != magicptr {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magicptr, magicptr)
-	}
-}
-
-func TestStoreInt32(t *testing.T) {
-	var x struct {
-		before int32
-		i      int32
-		after  int32
-	}
-	x.before = magic32
-	x.after = magic32
-	v := int32(0)
-	for delta := int32(1); delta+delta > delta; delta += delta {
-		StoreInt32(&x.i, v)
-		if x.i != v {
-			t.Fatalf("delta=%d i=%d v=%d", delta, x.i, v)
-		}
-		v += delta
-	}
-	if x.before != magic32 || x.after != magic32 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magic32, magic32)
-	}
-}
-
-func TestStoreUint32(t *testing.T) {
-	var x struct {
-		before uint32
-		i      uint32
-		after  uint32
-	}
-	x.before = magic32
-	x.after = magic32
-	v := uint32(0)
-	for delta := uint32(1); delta+delta > delta; delta += delta {
-		StoreUint32(&x.i, v)
-		if x.i != v {
-			t.Fatalf("delta=%d i=%d v=%d", delta, x.i, v)
-		}
-		v += delta
-	}
-	if x.before != magic32 || x.after != magic32 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magic32, magic32)
-	}
-}
-
-func TestStoreInt64(t *testing.T) {
-	if test64err != nil {
-		t.Skipf("Skipping 64-bit tests: %v", test64err)
-	}
-	var x struct {
-		before int64
-		i      int64
-		after  int64
-	}
-	x.before = magic64
-	x.after = magic64
-	v := int64(0)
-	for delta := int64(1); delta+delta > delta; delta += delta {
-		StoreInt64(&x.i, v)
-		if x.i != v {
-			t.Fatalf("delta=%d i=%d v=%d", delta, x.i, v)
-		}
-		v += delta
-	}
-	if x.before != magic64 || x.after != magic64 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, uint64(magic64), uint64(magic64))
-	}
-}
-
-func TestStoreUint64(t *testing.T) {
-	if test64err != nil {
-		t.Skipf("Skipping 64-bit tests: %v", test64err)
-	}
-	var x struct {
-		before uint64
-		i      uint64
-		after  uint64
-	}
-	x.before = magic64
-	x.after = magic64
-	v := uint64(0)
-	for delta := uint64(1); delta+delta > delta; delta += delta {
-		StoreUint64(&x.i, v)
-		if x.i != v {
-			t.Fatalf("delta=%d i=%d v=%d", delta, x.i, v)
-		}
-		v += delta
-	}
-	if x.before != magic64 || x.after != magic64 {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, uint64(magic64), uint64(magic64))
-	}
-}
-
-func TestStoreUintptr(t *testing.T) {
-	var x struct {
-		before uintptr
-		i      uintptr
-		after  uintptr
-	}
-	var m uint64 = magic64
-	magicptr := uintptr(m)
-	x.before = magicptr
-	x.after = magicptr
-	v := uintptr(0)
-	for delta := uintptr(1); delta+delta > delta; delta += delta {
-		StoreUintptr(&x.i, v)
-		if x.i != v {
-			t.Fatalf("delta=%d i=%d v=%d", delta, x.i, v)
-		}
-		v += delta
-	}
-	if x.before != magicptr || x.after != magicptr {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magicptr, magicptr)
-	}
-}
-
-func TestStorePointer(t *testing.T) {
-	var x struct {
-		before uintptr
-		i      unsafe.Pointer
-		after  uintptr
-	}
-	var m uint64 = magic64
-	magicptr := uintptr(m)
-	x.before = magicptr
-	x.after = magicptr
-	v := unsafe.Pointer(uintptr(0))
-	for delta := uintptr(1 << 16); delta+delta > delta; delta += delta {
-		StorePointer(&x.i, unsafe.Pointer(v))
-		if x.i != v {
-			t.Fatalf("delta=%d i=%d v=%d", delta, x.i, v)
-		}
-		v = unsafe.Pointer(uintptr(v) + delta)
-	}
-	if x.before != magicptr || x.after != magicptr {
-		t.Fatalf("wrong magic: %#x _ %#x != %#x _ %#x", x.before, x.after, magicptr, magicptr)
-	}
-}
-
-// Tests of correct behavior, with contention.
-// (Is the function atomic?)
-//
-// For each function, we write a "hammer" function that repeatedly
-// uses the atomic operation to add 1 to a value.  After running
-// multiple hammers in parallel, check that we end with the correct
-// total.
-// Swap can't add 1, so it uses a different scheme.
-// The functions repeatedly generate a pseudo-random number such that
-// low bits are equal to high bits, swap, check that the old value
-// has low and high bits equal.
-
-var hammer32 = map[string]func(*uint32, int){
-	"SwapInt32":             hammerSwapInt32,
-	"SwapUint32":            hammerSwapUint32,
-	"SwapUintptr":           hammerSwapUintptr32,
-	"AddInt32":              hammerAddInt32,
-	"AddUint32":             hammerAddUint32,
-	"AddUintptr":            hammerAddUintptr32,
-	"CompareAndSwapInt32":   hammerCompareAndSwapInt32,
-	"CompareAndSwapUint32":  hammerCompareAndSwapUint32,
-	"CompareAndSwapUintptr": hammerCompareAndSwapUintptr32,
-}
-
-func init() {
-	var v uint64 = 1 << 50
-	if uintptr(v) != 0 {
-		// 64-bit system; clear uintptr tests
-		delete(hammer32, "SwapUintptr")
-		delete(hammer32, "SwapPointer")
-		delete(hammer32, "AddUintptr")
-		delete(hammer32, "CompareAndSwapUintptr")
-		delete(hammer32, "CompareAndSwapPointer")
-	}
-}
-
-func hammerSwapInt32(uaddr *uint32, count int) {
-	addr := (*int32)(unsafe.Pointer(uaddr))
-	seed := int(uintptr(unsafe.Pointer(&count)))
-	for i := 0; i < count; i++ {
-		new := uint32(seed+i)<<16 | uint32(seed+i)<<16>>16
-		old := uint32(SwapInt32(addr, int32(new)))
-		if old>>16 != old<<16>>16 {
-			panic(fmt.Sprintf("SwapInt32 is not atomic: %v", old))
-		}
-	}
-}
-
-func hammerSwapUint32(addr *uint32, count int) {
-	seed := int(uintptr(unsafe.Pointer(&count)))
-	for i := 0; i < count; i++ {
-		new := uint32(seed+i)<<16 | uint32(seed+i)<<16>>16
-		old := SwapUint32(addr, new)
-		if old>>16 != old<<16>>16 {
-			panic(fmt.Sprintf("SwapUint32 is not atomic: %v", old))
-		}
-	}
-}
-
-func hammerSwapUintptr32(uaddr *uint32, count int) {
-	// only safe when uintptr is 32-bit.
-	// not called on 64-bit systems.
-	addr := (*uintptr)(unsafe.Pointer(uaddr))
-	seed := int(uintptr(unsafe.Pointer(&count)))
-	for i := 0; i < count; i++ {
-		new := uintptr(seed+i)<<16 | uintptr(seed+i)<<16>>16
-		old := SwapUintptr(addr, new)
-		if old>>16 != old<<16>>16 {
-			panic(fmt.Sprintf("SwapUintptr is not atomic: %#08x", old))
-		}
-	}
-}
-
-func hammerAddInt32(uaddr *uint32, count int) {
-	addr := (*int32)(unsafe.Pointer(uaddr))
-	for i := 0; i < count; i++ {
-		AddInt32(addr, 1)
-	}
-}
-
-func hammerAddUint32(addr *uint32, count int) {
-	for i := 0; i < count; i++ {
-		AddUint32(addr, 1)
-	}
-}
-
-func hammerAddUintptr32(uaddr *uint32, count int) {
-	// only safe when uintptr is 32-bit.
-	// not called on 64-bit systems.
-	addr := (*uintptr)(unsafe.Pointer(uaddr))
-	for i := 0; i < count; i++ {
-		AddUintptr(addr, 1)
-	}
-}
-
-func hammerCompareAndSwapInt32(uaddr *uint32, count int) {
-	addr := (*int32)(unsafe.Pointer(uaddr))
-	for i := 0; i < count; i++ {
-		for {
-			v := LoadInt32(addr)
-			if CompareAndSwapInt32(addr, v, v+1) {
-				break
-			}
-		}
-	}
-}
-
-func hammerCompareAndSwapUint32(addr *uint32, count int) {
-	for i := 0; i < count; i++ {
-		for {
-			v := LoadUint32(addr)
-			if CompareAndSwapUint32(addr, v, v+1) {
-				break
-			}
-		}
-	}
-}
-
-func hammerCompareAndSwapUintptr32(uaddr *uint32, count int) {
-	// only safe when uintptr is 32-bit.
-	// not called on 64-bit systems.
-	addr := (*uintptr)(unsafe.Pointer(uaddr))
-	for i := 0; i < count; i++ {
-		for {
-			v := LoadUintptr(addr)
-			if CompareAndSwapUintptr(addr, v, v+1) {
-				break
-			}
-		}
-	}
-}
-
-func TestHammer32(t *testing.T) {
-	const p = 4
-	n := 100000
-	if testing.Short() {
-		n = 1000
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(p))
-
-	for name, testf := range hammer32 {
-		c := make(chan int)
-		var val uint32
-		for i := 0; i < p; i++ {
-			go func() {
-				defer func() {
-					if err := recover(); err != nil {
-						t.Error(err.(string))
-					}
-					c <- 1
-				}()
-				testf(&val, n)
-			}()
-		}
-		for i := 0; i < p; i++ {
-			<-c
-		}
-		if !strings.HasPrefix(name, "Swap") && val != uint32(n)*p {
-			t.Fatalf("%s: val=%d want %d", name, val, n*p)
-		}
-	}
-}
-
-var hammer64 = map[string]func(*uint64, int){
-	"SwapInt64":             hammerSwapInt64,
-	"SwapUint64":            hammerSwapUint64,
-	"SwapUintptr":           hammerSwapUintptr64,
-	"AddInt64":              hammerAddInt64,
-	"AddUint64":             hammerAddUint64,
-	"AddUintptr":            hammerAddUintptr64,
-	"CompareAndSwapInt64":   hammerCompareAndSwapInt64,
-	"CompareAndSwapUint64":  hammerCompareAndSwapUint64,
-	"CompareAndSwapUintptr": hammerCompareAndSwapUintptr64,
-}
-
-func init() {
-	var v uint64 = 1 << 50
-	if uintptr(v) == 0 {
-		// 32-bit system; clear uintptr tests
-		delete(hammer64, "SwapUintptr")
-		delete(hammer64, "SwapPointer")
-		delete(hammer64, "AddUintptr")
-		delete(hammer64, "CompareAndSwapUintptr")
-		delete(hammer64, "CompareAndSwapPointer")
-	}
-}
-
-func hammerSwapInt64(uaddr *uint64, count int) {
-	addr := (*int64)(unsafe.Pointer(uaddr))
-	seed := int(uintptr(unsafe.Pointer(&count)))
-	for i := 0; i < count; i++ {
-		new := uint64(seed+i)<<32 | uint64(seed+i)<<32>>32
-		old := uint64(SwapInt64(addr, int64(new)))
-		if old>>32 != old<<32>>32 {
-			panic(fmt.Sprintf("SwapInt64 is not atomic: %v", old))
-		}
-	}
-}
-
-func hammerSwapUint64(addr *uint64, count int) {
-	seed := int(uintptr(unsafe.Pointer(&count)))
-	for i := 0; i < count; i++ {
-		new := uint64(seed+i)<<32 | uint64(seed+i)<<32>>32
-		old := SwapUint64(addr, new)
-		if old>>32 != old<<32>>32 {
-			panic(fmt.Sprintf("SwapUint64 is not atomic: %v", old))
-		}
-	}
-}
-
-func hammerSwapUintptr64(uaddr *uint64, count int) {
-	// only safe when uintptr is 64-bit.
-	// not called on 32-bit systems.
-	addr := (*uintptr)(unsafe.Pointer(uaddr))
-	seed := int(uintptr(unsafe.Pointer(&count)))
-	for i := 0; i < count; i++ {
-		new := uintptr(seed+i)<<32 | uintptr(seed+i)<<32>>32
-		old := SwapUintptr(addr, new)
-		if old>>32 != old<<32>>32 {
-			panic(fmt.Sprintf("SwapUintptr is not atomic: %v", old))
-		}
-	}
-}
-
-func hammerAddInt64(uaddr *uint64, count int) {
-	addr := (*int64)(unsafe.Pointer(uaddr))
-	for i := 0; i < count; i++ {
-		AddInt64(addr, 1)
-	}
-}
-
-func hammerAddUint64(addr *uint64, count int) {
-	for i := 0; i < count; i++ {
-		AddUint64(addr, 1)
-	}
-}
-
-func hammerAddUintptr64(uaddr *uint64, count int) {
-	// only safe when uintptr is 64-bit.
-	// not called on 32-bit systems.
-	addr := (*uintptr)(unsafe.Pointer(uaddr))
-	for i := 0; i < count; i++ {
-		AddUintptr(addr, 1)
-	}
-}
-
-func hammerCompareAndSwapInt64(uaddr *uint64, count int) {
-	addr := (*int64)(unsafe.Pointer(uaddr))
-	for i := 0; i < count; i++ {
-		for {
-			v := LoadInt64(addr)
-			if CompareAndSwapInt64(addr, v, v+1) {
-				break
-			}
-		}
-	}
-}
-
-func hammerCompareAndSwapUint64(addr *uint64, count int) {
-	for i := 0; i < count; i++ {
-		for {
-			v := LoadUint64(addr)
-			if CompareAndSwapUint64(addr, v, v+1) {
-				break
-			}
-		}
-	}
-}
-
-func hammerCompareAndSwapUintptr64(uaddr *uint64, count int) {
-	// only safe when uintptr is 64-bit.
-	// not called on 32-bit systems.
-	addr := (*uintptr)(unsafe.Pointer(uaddr))
-	for i := 0; i < count; i++ {
-		for {
-			v := LoadUintptr(addr)
-			if CompareAndSwapUintptr(addr, v, v+1) {
-				break
-			}
-		}
-	}
-}
-
-func TestHammer64(t *testing.T) {
-	if test64err != nil {
-		t.Skipf("Skipping 64-bit tests: %v", test64err)
-	}
-	const p = 4
-	n := 100000
-	if testing.Short() {
-		n = 1000
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(p))
-
-	for name, testf := range hammer64 {
-		c := make(chan int)
-		var val uint64
-		for i := 0; i < p; i++ {
-			go func() {
-				defer func() {
-					if err := recover(); err != nil {
-						t.Error(err.(string))
-					}
-					c <- 1
-				}()
-				testf(&val, n)
-			}()
-		}
-		for i := 0; i < p; i++ {
-			<-c
-		}
-		if !strings.HasPrefix(name, "Swap") && val != uint64(n)*p {
-			t.Fatalf("%s: val=%d want %d", name, val, n*p)
-		}
-	}
-}
-
-func hammerStoreLoadInt32(t *testing.T, paddr unsafe.Pointer) {
-	addr := (*int32)(paddr)
-	v := LoadInt32(addr)
-	vlo := v & ((1 << 16) - 1)
-	vhi := v >> 16
-	if vlo != vhi {
-		t.Fatalf("Int32: %#x != %#x", vlo, vhi)
-	}
-	new := v + 1 + 1<<16
-	if vlo == 1e4 {
-		new = 0
-	}
-	StoreInt32(addr, new)
-}
-
-func hammerStoreLoadUint32(t *testing.T, paddr unsafe.Pointer) {
-	addr := (*uint32)(paddr)
-	v := LoadUint32(addr)
-	vlo := v & ((1 << 16) - 1)
-	vhi := v >> 16
-	if vlo != vhi {
-		t.Fatalf("Uint32: %#x != %#x", vlo, vhi)
-	}
-	new := v + 1 + 1<<16
-	if vlo == 1e4 {
-		new = 0
-	}
-	StoreUint32(addr, new)
-}
-
-func hammerStoreLoadInt64(t *testing.T, paddr unsafe.Pointer) {
-	addr := (*int64)(paddr)
-	v := LoadInt64(addr)
-	vlo := v & ((1 << 32) - 1)
-	vhi := v >> 32
-	if vlo != vhi {
-		t.Fatalf("Int64: %#x != %#x", vlo, vhi)
-	}
-	new := v + 1 + 1<<32
-	StoreInt64(addr, new)
-}
-
-func hammerStoreLoadUint64(t *testing.T, paddr unsafe.Pointer) {
-	addr := (*uint64)(paddr)
-	v := LoadUint64(addr)
-	vlo := v & ((1 << 32) - 1)
-	vhi := v >> 32
-	if vlo != vhi {
-		t.Fatalf("Uint64: %#x != %#x", vlo, vhi)
-	}
-	new := v + 1 + 1<<32
-	StoreUint64(addr, new)
-}
-
-func hammerStoreLoadUintptr(t *testing.T, paddr unsafe.Pointer) {
-	addr := (*uintptr)(paddr)
-	var test64 uint64 = 1 << 50
-	arch32 := uintptr(test64) == 0
-	v := LoadUintptr(addr)
-	new := v
-	if arch32 {
-		vlo := v & ((1 << 16) - 1)
-		vhi := v >> 16
-		if vlo != vhi {
-			t.Fatalf("Uintptr: %#x != %#x", vlo, vhi)
-		}
-		new = v + 1 + 1<<16
-		if vlo == 1e4 {
-			new = 0
-		}
-	} else {
-		vlo := v & ((1 << 32) - 1)
-		vhi := v >> 32
-		if vlo != vhi {
-			t.Fatalf("Uintptr: %#x != %#x", vlo, vhi)
-		}
-		inc := uint64(1 + 1<<32)
-		new = v + uintptr(inc)
-	}
-	StoreUintptr(addr, new)
-}
-
-func hammerStoreLoadPointer(t *testing.T, paddr unsafe.Pointer) {
-	addr := (*unsafe.Pointer)(paddr)
-	var test64 uint64 = 1 << 50
-	arch32 := uintptr(test64) == 0
-	v := uintptr(LoadPointer(addr))
-	new := v
-	if arch32 {
-		vlo := v & ((1 << 16) - 1)
-		vhi := v >> 16
-		if vlo != vhi {
-			t.Fatalf("Pointer: %#x != %#x", vlo, vhi)
-		}
-		new = v + 1 + 1<<16
-		if vlo == 1e4 {
-			new = 0
-		}
-	} else {
-		vlo := v & ((1 << 32) - 1)
-		vhi := v >> 32
-		if vlo != vhi {
-			t.Fatalf("Pointer: %#x != %#x", vlo, vhi)
-		}
-		inc := uint64(1 + 1<<32)
-		new = v + uintptr(inc)
-	}
-	StorePointer(addr, unsafe.Pointer(new))
-}
-
-func TestHammerStoreLoad(t *testing.T) {
-	var tests []func(*testing.T, unsafe.Pointer)
-	tests = append(tests, hammerStoreLoadInt32, hammerStoreLoadUint32,
-		hammerStoreLoadUintptr, hammerStoreLoadPointer)
-	if test64err == nil {
-		tests = append(tests, hammerStoreLoadInt64, hammerStoreLoadUint64)
-	}
-	n := int(1e6)
-	if testing.Short() {
-		n = int(1e4)
-	}
-	const procs = 8
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(procs))
-	for _, tt := range tests {
-		c := make(chan int)
-		var val uint64
-		for p := 0; p < procs; p++ {
-			go func() {
-				for i := 0; i < n; i++ {
-					tt(t, unsafe.Pointer(&val))
-				}
-				c <- 1
-			}()
-		}
-		for p := 0; p < procs; p++ {
-			<-c
-		}
-	}
-}
-
-func TestStoreLoadSeqCst32(t *testing.T) {
-	if runtime.NumCPU() == 1 {
-		t.Skipf("Skipping test on %v processor machine", runtime.NumCPU())
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
-	N := int32(1e3)
-	if testing.Short() {
-		N = int32(1e2)
-	}
-	c := make(chan bool, 2)
-	X := [2]int32{}
-	ack := [2][3]int32{{-1, -1, -1}, {-1, -1, -1}}
-	for p := 0; p < 2; p++ {
-		go func(me int) {
-			he := 1 - me
-			for i := int32(1); i < N; i++ {
-				StoreInt32(&X[me], i)
-				my := LoadInt32(&X[he])
-				StoreInt32(&ack[me][i%3], my)
-				for w := 1; LoadInt32(&ack[he][i%3]) == -1; w++ {
-					if w%1000 == 0 {
-						runtime.Gosched()
-					}
-				}
-				his := LoadInt32(&ack[he][i%3])
-				if (my != i && my != i-1) || (his != i && his != i-1) {
-					t.Fatalf("invalid values: %d/%d (%d)", my, his, i)
-				}
-				if my != i && his != i {
-					t.Fatalf("store/load are not sequentially consistent: %d/%d (%d)", my, his, i)
-				}
-				StoreInt32(&ack[me][(i-1)%3], -1)
-			}
-			c <- true
-		}(p)
-	}
-	<-c
-	<-c
-}
-
-func TestStoreLoadSeqCst64(t *testing.T) {
-	if runtime.NumCPU() == 1 {
-		t.Skipf("Skipping test on %v processor machine", runtime.NumCPU())
-	}
-	if test64err != nil {
-		t.Skipf("Skipping 64-bit tests: %v", test64err)
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
-	N := int64(1e3)
-	if testing.Short() {
-		N = int64(1e2)
-	}
-	c := make(chan bool, 2)
-	X := [2]int64{}
-	ack := [2][3]int64{{-1, -1, -1}, {-1, -1, -1}}
-	for p := 0; p < 2; p++ {
-		go func(me int) {
-			he := 1 - me
-			for i := int64(1); i < N; i++ {
-				StoreInt64(&X[me], i)
-				my := LoadInt64(&X[he])
-				StoreInt64(&ack[me][i%3], my)
-				for w := 1; LoadInt64(&ack[he][i%3]) == -1; w++ {
-					if w%1000 == 0 {
-						runtime.Gosched()
-					}
-				}
-				his := LoadInt64(&ack[he][i%3])
-				if (my != i && my != i-1) || (his != i && his != i-1) {
-					t.Fatalf("invalid values: %d/%d (%d)", my, his, i)
-				}
-				if my != i && his != i {
-					t.Fatalf("store/load are not sequentially consistent: %d/%d (%d)", my, his, i)
-				}
-				StoreInt64(&ack[me][(i-1)%3], -1)
-			}
-			c <- true
-		}(p)
-	}
-	<-c
-	<-c
-}
-
-func TestStoreLoadRelAcq32(t *testing.T) {
-	if runtime.NumCPU() == 1 {
-		t.Skipf("Skipping test on %v processor machine", runtime.NumCPU())
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
-	N := int32(1e3)
-	if testing.Short() {
-		N = int32(1e2)
-	}
-	c := make(chan bool, 2)
-	type Data struct {
-		signal int32
-		pad1   [128]int8
-		data1  int32
-		pad2   [128]int8
-		data2  float32
-	}
-	var X Data
-	for p := int32(0); p < 2; p++ {
-		go func(p int32) {
-			for i := int32(1); i < N; i++ {
-				if (i+p)%2 == 0 {
-					X.data1 = i
-					X.data2 = float32(i)
-					StoreInt32(&X.signal, i)
-				} else {
-					for w := 1; LoadInt32(&X.signal) != i; w++ {
-						if w%1000 == 0 {
-							runtime.Gosched()
-						}
-					}
-					d1 := X.data1
-					d2 := X.data2
-					if d1 != i || d2 != float32(i) {
-						t.Fatalf("incorrect data: %d/%g (%d)", d1, d2, i)
-					}
-				}
-			}
-			c <- true
-		}(p)
-	}
-	<-c
-	<-c
-}
-
-func TestStoreLoadRelAcq64(t *testing.T) {
-	if runtime.NumCPU() == 1 {
-		t.Skipf("Skipping test on %v processor machine", runtime.NumCPU())
-	}
-	if test64err != nil {
-		t.Skipf("Skipping 64-bit tests: %v", test64err)
-	}
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
-	N := int64(1e3)
-	if testing.Short() {
-		N = int64(1e2)
-	}
-	c := make(chan bool, 2)
-	type Data struct {
-		signal int64
-		pad1   [128]int8
-		data1  int64
-		pad2   [128]int8
-		data2  float64
-	}
-	var X Data
-	for p := int64(0); p < 2; p++ {
-		go func(p int64) {
-			for i := int64(1); i < N; i++ {
-				if (i+p)%2 == 0 {
-					X.data1 = i
-					X.data2 = float64(i)
-					StoreInt64(&X.signal, i)
-				} else {
-					for w := 1; LoadInt64(&X.signal) != i; w++ {
-						if w%1000 == 0 {
-							runtime.Gosched()
-						}
-					}
-					d1 := X.data1
-					d2 := X.data2
-					if d1 != i || d2 != float64(i) {
-						t.Fatalf("incorrect data: %d/%g (%d)", d1, d2, i)
-					}
-				}
-			}
-			c <- true
-		}(p)
-	}
-	<-c
-	<-c
-}
-
-func shouldPanic(t *testing.T, name string, f func()) {
-	defer func() {
-		if recover() == nil {
-			t.Errorf("%s did not panic", name)
-		}
-	}()
-	f()
-}
-
-func TestUnaligned64(t *testing.T) {
-	// Unaligned 64-bit atomics on 32-bit systems are
-	// a continual source of pain. Test that on 32-bit systems they crash
-	// instead of failing silently.
-	if unsafe.Sizeof(int(0)) != 4 {
-		t.Skip("test only runs on 32-bit systems")
-	}
-
-	t.Skip("skipping test for gccgo")
-
-	x := make([]uint32, 4)
-	p := (*uint64)(unsafe.Pointer(&x[1])) // misaligned
-
-	shouldPanic(t, "LoadUint64", func() { LoadUint64(p) })
-	shouldPanic(t, "StoreUint64", func() { StoreUint64(p, 1) })
-	shouldPanic(t, "CompareAndSwapUint64", func() { CompareAndSwapUint64(p, 1, 2) })
-	shouldPanic(t, "AddUint64", func() { AddUint64(p, 3) })
-}
-
-func TestNilDeref(t *testing.T) {
-	funcs := [...]func(){
-		func() { CompareAndSwapInt32(nil, 0, 0) },
-		func() { CompareAndSwapInt64(nil, 0, 0) },
-		func() { CompareAndSwapUint32(nil, 0, 0) },
-		func() { CompareAndSwapUint64(nil, 0, 0) },
-		func() { CompareAndSwapUintptr(nil, 0, 0) },
-		func() { CompareAndSwapPointer(nil, nil, nil) },
-		func() { SwapInt32(nil, 0) },
-		func() { SwapUint32(nil, 0) },
-		func() { SwapInt64(nil, 0) },
-		func() { SwapUint64(nil, 0) },
-		func() { SwapUintptr(nil, 0) },
-		func() { SwapPointer(nil, nil) },
-		func() { AddInt32(nil, 0) },
-		func() { AddUint32(nil, 0) },
-		func() { AddInt64(nil, 0) },
-		func() { AddUint64(nil, 0) },
-		func() { AddUintptr(nil, 0) },
-		func() { LoadInt32(nil) },
-		func() { LoadInt64(nil) },
-		func() { LoadUint32(nil) },
-		func() { LoadUint64(nil) },
-		func() { LoadUintptr(nil) },
-		func() { LoadPointer(nil) },
-		func() { StoreInt32(nil, 0) },
-		func() { StoreInt64(nil, 0) },
-		func() { StoreUint32(nil, 0) },
-		func() { StoreUint64(nil, 0) },
-		func() { StoreUintptr(nil, 0) },
-		func() { StorePointer(nil, nil) },
-	}
-	for _, f := range funcs {
-		func() {
-			defer func() {
-				runtime.GC()
-				recover()
-			}()
-			f()
-		}()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/sync/atomic/doc.go b/third_party/gofrontend/libgo/go/sync/atomic/doc.go
deleted file mode 100644
index 10fb8c9..0000000
--- a/third_party/gofrontend/libgo/go/sync/atomic/doc.go
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package atomic provides low-level atomic memory primitives
-// useful for implementing synchronization algorithms.
-//
-// These functions require great care to be used correctly.
-// Except for special, low-level applications, synchronization is better
-// done with channels or the facilities of the sync package.
-// Share memory by communicating;
-// don't communicate by sharing memory.
-//
-// The swap operation, implemented by the SwapT functions, is the atomic
-// equivalent of:
-//
-//	old = *addr
-//	*addr = new
-//	return old
-//
-// The compare-and-swap operation, implemented by the CompareAndSwapT
-// functions, is the atomic equivalent of:
-//
-//	if *addr == old {
-//		*addr = new
-//		return true
-//	}
-//	return false
-//
-// The add operation, implemented by the AddT functions, is the atomic
-// equivalent of:
-//
-//	*addr += delta
-//	return *addr
-//
-// The load and store operations, implemented by the LoadT and StoreT
-// functions, are the atomic equivalents of "return *addr" and
-// "*addr = val".
-//
-package atomic
-
-import (
-	"unsafe"
-)
-
-// BUG(rsc): On x86-32, the 64-bit functions use instructions unavailable before the Pentium MMX.
-//
-// On non-Linux ARM, the 64-bit functions use instructions unavailable before the ARMv6k core.
-//
-// On both ARM and x86-32, it is the caller's responsibility to arrange for 64-bit
-// alignment of 64-bit words accessed atomically. The first word in a global
-// variable or in an allocated struct or slice can be relied upon to be
-// 64-bit aligned.
-
-// SwapInt32 atomically stores new into *addr and returns the previous *addr value.
-func SwapInt32(addr *int32, new int32) (old int32)
-
-// SwapInt64 atomically stores new into *addr and returns the previous *addr value.
-func SwapInt64(addr *int64, new int64) (old int64)
-
-// SwapUint32 atomically stores new into *addr and returns the previous *addr value.
-func SwapUint32(addr *uint32, new uint32) (old uint32)
-
-// SwapUint64 atomically stores new into *addr and returns the previous *addr value.
-func SwapUint64(addr *uint64, new uint64) (old uint64)
-
-// SwapUintptr atomically stores new into *addr and returns the previous *addr value.
-func SwapUintptr(addr *uintptr, new uintptr) (old uintptr)
-
-// SwapPointer atomically stores new into *addr and returns the previous *addr value.
-func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer)
-
-// CompareAndSwapInt32 executes the compare-and-swap operation for an int32 value.
-func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)
-
-// CompareAndSwapInt64 executes the compare-and-swap operation for an int64 value.
-func CompareAndSwapInt64(addr *int64, old, new int64) (swapped bool)
-
-// CompareAndSwapUint32 executes the compare-and-swap operation for a uint32 value.
-func CompareAndSwapUint32(addr *uint32, old, new uint32) (swapped bool)
-
-// CompareAndSwapUint64 executes the compare-and-swap operation for a uint64 value.
-func CompareAndSwapUint64(addr *uint64, old, new uint64) (swapped bool)
-
-// CompareAndSwapUintptr executes the compare-and-swap operation for a uintptr value.
-func CompareAndSwapUintptr(addr *uintptr, old, new uintptr) (swapped bool)
-
-// CompareAndSwapPointer executes the compare-and-swap operation for a unsafe.Pointer value.
-func CompareAndSwapPointer(addr *unsafe.Pointer, old, new unsafe.Pointer) (swapped bool)
-
-// AddInt32 atomically adds delta to *addr and returns the new value.
-func AddInt32(addr *int32, delta int32) (new int32)
-
-// AddUint32 atomically adds delta to *addr and returns the new value.
-// To subtract a signed positive constant value c from x, do AddUint32(&x, ^uint32(c-1)).
-// In particular, to decrement x, do AddUint32(&x, ^uint32(0)).
-func AddUint32(addr *uint32, delta uint32) (new uint32)
-
-// AddInt64 atomically adds delta to *addr and returns the new value.
-func AddInt64(addr *int64, delta int64) (new int64)
-
-// AddUint64 atomically adds delta to *addr and returns the new value.
-// To subtract a signed positive constant value c from x, do AddUint64(&x, ^uint64(c-1)).
-// In particular, to decrement x, do AddUint64(&x, ^uint64(0)).
-func AddUint64(addr *uint64, delta uint64) (new uint64)
-
-// AddUintptr atomically adds delta to *addr and returns the new value.
-func AddUintptr(addr *uintptr, delta uintptr) (new uintptr)
-
-// LoadInt32 atomically loads *addr.
-func LoadInt32(addr *int32) (val int32)
-
-// LoadInt64 atomically loads *addr.
-func LoadInt64(addr *int64) (val int64)
-
-// LoadUint32 atomically loads *addr.
-func LoadUint32(addr *uint32) (val uint32)
-
-// LoadUint64 atomically loads *addr.
-func LoadUint64(addr *uint64) (val uint64)
-
-// LoadUintptr atomically loads *addr.
-func LoadUintptr(addr *uintptr) (val uintptr)
-
-// LoadPointer atomically loads *addr.
-func LoadPointer(addr *unsafe.Pointer) (val unsafe.Pointer)
-
-// StoreInt32 atomically stores val into *addr.
-func StoreInt32(addr *int32, val int32)
-
-// StoreInt64 atomically stores val into *addr.
-func StoreInt64(addr *int64, val int64)
-
-// StoreUint32 atomically stores val into *addr.
-func StoreUint32(addr *uint32, val uint32)
-
-// StoreUint64 atomically stores val into *addr.
-func StoreUint64(addr *uint64, val uint64)
-
-// StoreUintptr atomically stores val into *addr.
-func StoreUintptr(addr *uintptr, val uintptr)
-
-// StorePointer atomically stores val into *addr.
-func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer)
-
-// Helper for ARM.  Linker will discard on other systems
-func panic64() {
-	panic("sync/atomic: broken 64-bit atomic operations (buggy QEMU)")
-}
diff --git a/third_party/gofrontend/libgo/go/sync/atomic/value.go b/third_party/gofrontend/libgo/go/sync/atomic/value.go
deleted file mode 100644
index ab3aa11..0000000
--- a/third_party/gofrontend/libgo/go/sync/atomic/value.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package atomic
-
-import (
-	"unsafe"
-)
-
-// A Value provides an atomic load and store of a consistently typed value.
-// Values can be created as part of other data structures.
-// The zero value for a Value returns nil from Load.
-// Once Store has been called, a Value must not be copied.
-type Value struct {
-	v interface{}
-}
-
-// ifaceWords is interface{} internal representation.
-type ifaceWords struct {
-	typ  unsafe.Pointer
-	data unsafe.Pointer
-}
-
-// Load returns the value set by the most recent Store.
-// It returns nil if there has been no call to Store for this Value.
-func (v *Value) Load() (x interface{}) {
-	vp := (*ifaceWords)(unsafe.Pointer(v))
-	typ := LoadPointer(&vp.typ)
-	if typ == nil || uintptr(typ) == ^uintptr(0) {
-		// First store not yet completed.
-		return nil
-	}
-	data := LoadPointer(&vp.data)
-	xp := (*ifaceWords)(unsafe.Pointer(&x))
-	xp.typ = typ
-	xp.data = data
-	return
-}
-
-// Store sets the value of the Value to x.
-// All calls to Store for a given Value must use values of the same concrete type.
-// Store of an inconsistent type panics, as does Store(nil).
-func (v *Value) Store(x interface{}) {
-	if x == nil {
-		panic("sync/atomic: store of nil value into Value")
-	}
-	vp := (*ifaceWords)(unsafe.Pointer(v))
-	xp := (*ifaceWords)(unsafe.Pointer(&x))
-	for {
-		typ := LoadPointer(&vp.typ)
-		if typ == nil {
-			// Attempt to start first store.
-			// Disable preemption so that other goroutines can use
-			// active spin wait to wait for completion; and so that
-			// GC does not see the fake type accidentally.
-			runtime_procPin()
-			if !CompareAndSwapPointer(&vp.typ, nil, unsafe.Pointer(^uintptr(0))) {
-				runtime_procUnpin()
-				continue
-			}
-			// Complete first store.
-			StorePointer(&vp.data, xp.data)
-			StorePointer(&vp.typ, xp.typ)
-			runtime_procUnpin()
-			return
-		}
-		if uintptr(typ) == ^uintptr(0) {
-			// First store in progress. Wait.
-			// Since we disable preemption around the first store,
-			// we can wait with active spinning.
-			continue
-		}
-		// First store completed. Check type and overwrite data.
-		if typ != xp.typ {
-			panic("sync/atomic: store of inconsistently typed value into Value")
-		}
-		StorePointer(&vp.data, xp.data)
-		return
-	}
-}
-
-// Disable/enable preemption, implemented in runtime.
-func runtime_procPin()
-func runtime_procUnpin()
diff --git a/third_party/gofrontend/libgo/go/sync/atomic/value_test.go b/third_party/gofrontend/libgo/go/sync/atomic/value_test.go
deleted file mode 100644
index 382dc68..0000000
--- a/third_party/gofrontend/libgo/go/sync/atomic/value_test.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package atomic_test
-
-import (
-	"math/rand"
-	"runtime"
-	"sync"
-	. "sync/atomic"
-	"testing"
-	"time"
-)
-
-func TestValue(t *testing.T) {
-	var v Value
-	if v.Load() != nil {
-		t.Fatal("initial Value is not nil")
-	}
-	v.Store(42)
-	x := v.Load()
-	if xx, ok := x.(int); !ok || xx != 42 {
-		t.Fatalf("wrong value: got %+v, want 42", x)
-	}
-	v.Store(84)
-	x = v.Load()
-	if xx, ok := x.(int); !ok || xx != 84 {
-		t.Fatalf("wrong value: got %+v, want 84", x)
-	}
-}
-
-func TestValueLarge(t *testing.T) {
-	var v Value
-	v.Store("foo")
-	x := v.Load()
-	if xx, ok := x.(string); !ok || xx != "foo" {
-		t.Fatalf("wrong value: got %+v, want foo", x)
-	}
-	v.Store("barbaz")
-	x = v.Load()
-	if xx, ok := x.(string); !ok || xx != "barbaz" {
-		t.Fatalf("wrong value: got %+v, want barbaz", x)
-	}
-}
-
-func TestValuePanic(t *testing.T) {
-	const nilErr = "sync/atomic: store of nil value into Value"
-	const badErr = "sync/atomic: store of inconsistently typed value into Value"
-	var v Value
-	func() {
-		defer func() {
-			err := recover()
-			if err != nilErr {
-				t.Fatalf("inconsistent store panic: got '%v', want '%v'", err, nilErr)
-			}
-		}()
-		v.Store(nil)
-	}()
-	v.Store(42)
-	func() {
-		defer func() {
-			err := recover()
-			if err != badErr {
-				t.Fatalf("inconsistent store panic: got '%v', want '%v'", err, badErr)
-			}
-		}()
-		v.Store("foo")
-	}()
-	func() {
-		defer func() {
-			err := recover()
-			if err != nilErr {
-				t.Fatalf("inconsistent store panic: got '%v', want '%v'", err, nilErr)
-			}
-		}()
-		v.Store(nil)
-	}()
-}
-
-func TestValueConcurrent(t *testing.T) {
-	tests := [][]interface{}{
-		{uint16(0), ^uint16(0), uint16(1 + 2<<8), uint16(3 + 4<<8)},
-		{uint32(0), ^uint32(0), uint32(1 + 2<<16), uint32(3 + 4<<16)},
-		{uint64(0), ^uint64(0), uint64(1 + 2<<32), uint64(3 + 4<<32)},
-		{complex(0, 0), complex(1, 2), complex(3, 4), complex(5, 6)},
-	}
-	p := 4 * runtime.GOMAXPROCS(0)
-	for _, test := range tests {
-		var v Value
-		done := make(chan bool)
-		for i := 0; i < p; i++ {
-			go func() {
-				r := rand.New(rand.NewSource(rand.Int63()))
-			loop:
-				for j := 0; j < 1e5; j++ {
-					x := test[r.Intn(len(test))]
-					v.Store(x)
-					x = v.Load()
-					for _, x1 := range test {
-						if x == x1 {
-							continue loop
-						}
-					}
-					t.Logf("loaded unexpected value %+v, want %+v", x, test)
-					done <- false
-				}
-				done <- true
-			}()
-		}
-		for i := 0; i < p; i++ {
-			if !<-done {
-				t.FailNow()
-			}
-		}
-	}
-}
-
-func BenchmarkValueRead(b *testing.B) {
-	var v Value
-	v.Store(new(int))
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			x := v.Load().(*int)
-			if *x != 0 {
-				b.Fatalf("wrong value: got %v, want 0", *x)
-			}
-		}
-	})
-}
-
-// The following example shows how to use Value for periodic program config updates
-// and propagation of the changes to worker goroutines.
-func ExampleValue_config() {
-	var config Value // holds current server configuration
-	// Create initial config value and store into config.
-	config.Store(loadConfig())
-	go func() {
-		// Reload config every 10 seconds
-		// and update config value with the new version.
-		for {
-			time.Sleep(10 * time.Second)
-			config.Store(loadConfig())
-		}
-	}()
-	// Create worker goroutines that handle incoming requests
-	// using the latest config value.
-	for i := 0; i < 10; i++ {
-		go func() {
-			for r := range requests() {
-				c := config.Load()
-				// Handle request r using config c.
-				_, _ = r, c
-			}
-		}()
-	}
-}
-
-func loadConfig() map[string]string {
-	return make(map[string]string)
-}
-
-func requests() chan int {
-	return make(chan int)
-}
-
-// The following example shows how to maintain a scalable frequently read,
-// but infrequently updated data structure using copy-on-write idiom.
-func ExampleValue_readMostly() {
-	type Map map[string]string
-	var m Value
-	m.Store(make(Map))
-	var mu sync.Mutex // used only by writers
-	// read function can be used to read the data without further synchronization
-	read := func(key string) (val string) {
-		m1 := m.Load().(Map)
-		return m1[key]
-	}
-	// insert function can be used to update the data without further synchronization
-	insert := func(key, val string) {
-		mu.Lock() // synchronize with other potential writers
-		defer mu.Unlock()
-		m1 := m.Load().(Map) // load current value of the data structure
-		m2 := make(Map)      // create a new value
-		for k, v := range m1 {
-			m2[k] = v // copy all data from the current object to the new one
-		}
-		m2[key] = val // do the update that we need
-		m.Store(m2)   // atomically replace the current object with the new one
-		// At this point all new readers start working with the new version.
-		// The old version will be garbage collected once the existing readers
-		// (if any) are done with it.
-	}
-	_, _ = read, insert
-}
diff --git a/third_party/gofrontend/libgo/go/sync/cas.c b/third_party/gofrontend/libgo/go/sync/cas.c
deleted file mode 100644
index 7571c64..0000000
--- a/third_party/gofrontend/libgo/go/sync/cas.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* cas.c -- implement sync.cas for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stdint.h>
-
-#include "runtime.h"
-
-_Bool cas (int32_t *, int32_t, int32_t) __asm__ (GOSYM_PREFIX "libgo_sync.sync.cas");
-
-_Bool
-cas (int32_t *ptr, int32_t old, int32_t new)
-{
-  return __sync_bool_compare_and_swap (ptr, old, new);
-}
diff --git a/third_party/gofrontend/libgo/go/sync/cond.go b/third_party/gofrontend/libgo/go/sync/cond.go
deleted file mode 100644
index 9e6bc17..0000000
--- a/third_party/gofrontend/libgo/go/sync/cond.go
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sync
-
-import (
-	"sync/atomic"
-	"unsafe"
-)
-
-// Cond implements a condition variable, a rendezvous point
-// for goroutines waiting for or announcing the occurrence
-// of an event.
-//
-// Each Cond has an associated Locker L (often a *Mutex or *RWMutex),
-// which must be held when changing the condition and
-// when calling the Wait method.
-//
-// A Cond can be created as part of other structures.
-// A Cond must not be copied after first use.
-type Cond struct {
-	// L is held while observing or changing the condition
-	L Locker
-
-	sema    syncSema
-	waiters uint32 // number of waiters
-	checker copyChecker
-}
-
-// NewCond returns a new Cond with Locker l.
-func NewCond(l Locker) *Cond {
-	return &Cond{L: l}
-}
-
-// Wait atomically unlocks c.L and suspends execution
-// of the calling goroutine.  After later resuming execution,
-// Wait locks c.L before returning.  Unlike in other systems,
-// Wait cannot return unless awoken by Broadcast or Signal.
-//
-// Because c.L is not locked when Wait first resumes, the caller
-// typically cannot assume that the condition is true when
-// Wait returns.  Instead, the caller should Wait in a loop:
-//
-//    c.L.Lock()
-//    for !condition() {
-//        c.Wait()
-//    }
-//    ... make use of condition ...
-//    c.L.Unlock()
-//
-func (c *Cond) Wait() {
-	c.checker.check()
-	if raceenabled {
-		raceDisable()
-	}
-	atomic.AddUint32(&c.waiters, 1)
-	if raceenabled {
-		raceEnable()
-	}
-	c.L.Unlock()
-	runtime_Syncsemacquire(&c.sema)
-	c.L.Lock()
-}
-
-// Signal wakes one goroutine waiting on c, if there is any.
-//
-// It is allowed but not required for the caller to hold c.L
-// during the call.
-func (c *Cond) Signal() {
-	c.signalImpl(false)
-}
-
-// Broadcast wakes all goroutines waiting on c.
-//
-// It is allowed but not required for the caller to hold c.L
-// during the call.
-func (c *Cond) Broadcast() {
-	c.signalImpl(true)
-}
-
-func (c *Cond) signalImpl(all bool) {
-	c.checker.check()
-	if raceenabled {
-		raceDisable()
-	}
-	for {
-		old := atomic.LoadUint32(&c.waiters)
-		if old == 0 {
-			if raceenabled {
-				raceEnable()
-			}
-			return
-		}
-		new := old - 1
-		if all {
-			new = 0
-		}
-		if atomic.CompareAndSwapUint32(&c.waiters, old, new) {
-			if raceenabled {
-				raceEnable()
-			}
-			runtime_Syncsemrelease(&c.sema, old-new)
-			return
-		}
-	}
-}
-
-// copyChecker holds back pointer to itself to detect object copying.
-type copyChecker uintptr
-
-func (c *copyChecker) check() {
-	if uintptr(*c) != uintptr(unsafe.Pointer(c)) &&
-		!atomic.CompareAndSwapUintptr((*uintptr)(c), 0, uintptr(unsafe.Pointer(c))) &&
-		uintptr(*c) != uintptr(unsafe.Pointer(c)) {
-		panic("sync.Cond is copied")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/sync/cond_test.go b/third_party/gofrontend/libgo/go/sync/cond_test.go
deleted file mode 100644
index 467c806..0000000
--- a/third_party/gofrontend/libgo/go/sync/cond_test.go
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-package sync_test
-
-import (
-	. "sync"
-
-	"runtime"
-	"testing"
-)
-
-func TestCondSignal(t *testing.T) {
-	var m Mutex
-	c := NewCond(&m)
-	n := 2
-	running := make(chan bool, n)
-	awake := make(chan bool, n)
-	for i := 0; i < n; i++ {
-		go func() {
-			m.Lock()
-			running <- true
-			c.Wait()
-			awake <- true
-			m.Unlock()
-		}()
-	}
-	for i := 0; i < n; i++ {
-		<-running // Wait for everyone to run.
-	}
-	for n > 0 {
-		select {
-		case <-awake:
-			t.Fatal("goroutine not asleep")
-		default:
-		}
-		m.Lock()
-		c.Signal()
-		m.Unlock()
-		<-awake // Will deadlock if no goroutine wakes up
-		select {
-		case <-awake:
-			t.Fatal("too many goroutines awake")
-		default:
-		}
-		n--
-	}
-	c.Signal()
-}
-
-func TestCondSignalGenerations(t *testing.T) {
-	var m Mutex
-	c := NewCond(&m)
-	n := 100
-	running := make(chan bool, n)
-	awake := make(chan int, n)
-	for i := 0; i < n; i++ {
-		go func(i int) {
-			m.Lock()
-			running <- true
-			c.Wait()
-			awake <- i
-			m.Unlock()
-		}(i)
-		if i > 0 {
-			a := <-awake
-			if a != i-1 {
-				t.Fatalf("wrong goroutine woke up: want %d, got %d", i-1, a)
-			}
-		}
-		<-running
-		m.Lock()
-		c.Signal()
-		m.Unlock()
-	}
-}
-
-func TestCondBroadcast(t *testing.T) {
-	var m Mutex
-	c := NewCond(&m)
-	n := 200
-	running := make(chan int, n)
-	awake := make(chan int, n)
-	exit := false
-	for i := 0; i < n; i++ {
-		go func(g int) {
-			m.Lock()
-			for !exit {
-				running <- g
-				c.Wait()
-				awake <- g
-			}
-			m.Unlock()
-		}(i)
-	}
-	for i := 0; i < n; i++ {
-		for i := 0; i < n; i++ {
-			<-running // Will deadlock unless n are running.
-		}
-		if i == n-1 {
-			m.Lock()
-			exit = true
-			m.Unlock()
-		}
-		select {
-		case <-awake:
-			t.Fatal("goroutine not asleep")
-		default:
-		}
-		m.Lock()
-		c.Broadcast()
-		m.Unlock()
-		seen := make([]bool, n)
-		for i := 0; i < n; i++ {
-			g := <-awake
-			if seen[g] {
-				t.Fatal("goroutine woke up twice")
-			}
-			seen[g] = true
-		}
-	}
-	select {
-	case <-running:
-		t.Fatal("goroutine did not exit")
-	default:
-	}
-	c.Broadcast()
-}
-
-func TestRace(t *testing.T) {
-	x := 0
-	c := NewCond(&Mutex{})
-	done := make(chan bool)
-	go func() {
-		c.L.Lock()
-		x = 1
-		c.Wait()
-		if x != 2 {
-			t.Fatal("want 2")
-		}
-		x = 3
-		c.Signal()
-		c.L.Unlock()
-		done <- true
-	}()
-	go func() {
-		c.L.Lock()
-		for {
-			if x == 1 {
-				x = 2
-				c.Signal()
-				break
-			}
-			c.L.Unlock()
-			runtime.Gosched()
-			c.L.Lock()
-		}
-		c.L.Unlock()
-		done <- true
-	}()
-	go func() {
-		c.L.Lock()
-		for {
-			if x == 2 {
-				c.Wait()
-				if x != 3 {
-					t.Fatal("want 3")
-				}
-				break
-			}
-			if x == 3 {
-				break
-			}
-			c.L.Unlock()
-			runtime.Gosched()
-			c.L.Lock()
-		}
-		c.L.Unlock()
-		done <- true
-	}()
-	<-done
-	<-done
-	<-done
-}
-
-func TestCondCopy(t *testing.T) {
-	defer func() {
-		err := recover()
-		if err == nil || err.(string) != "sync.Cond is copied" {
-			t.Fatalf("got %v, expect sync.Cond is copied", err)
-		}
-	}()
-	c := Cond{L: &Mutex{}}
-	c.Signal()
-	c2 := c
-	c2.Signal()
-}
-
-func BenchmarkCond1(b *testing.B) {
-	benchmarkCond(b, 1)
-}
-
-func BenchmarkCond2(b *testing.B) {
-	benchmarkCond(b, 2)
-}
-
-func BenchmarkCond4(b *testing.B) {
-	benchmarkCond(b, 4)
-}
-
-func BenchmarkCond8(b *testing.B) {
-	benchmarkCond(b, 8)
-}
-
-func BenchmarkCond16(b *testing.B) {
-	benchmarkCond(b, 16)
-}
-
-func BenchmarkCond32(b *testing.B) {
-	benchmarkCond(b, 32)
-}
-
-func benchmarkCond(b *testing.B, waiters int) {
-	c := NewCond(&Mutex{})
-	done := make(chan bool)
-	id := 0
-
-	for routine := 0; routine < waiters+1; routine++ {
-		go func() {
-			for i := 0; i < b.N; i++ {
-				c.L.Lock()
-				if id == -1 {
-					c.L.Unlock()
-					break
-				}
-				id++
-				if id == waiters+1 {
-					id = 0
-					c.Broadcast()
-				} else {
-					c.Wait()
-				}
-				c.L.Unlock()
-			}
-			c.L.Lock()
-			id = -1
-			c.Broadcast()
-			c.L.Unlock()
-			done <- true
-		}()
-	}
-	for routine := 0; routine < waiters+1; routine++ {
-		<-done
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/sync/example_test.go b/third_party/gofrontend/libgo/go/sync/example_test.go
deleted file mode 100644
index bdd3af6..0000000
--- a/third_party/gofrontend/libgo/go/sync/example_test.go
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sync_test
-
-import (
-	"fmt"
-	"sync"
-)
-
-type httpPkg struct{}
-
-func (httpPkg) Get(url string) {}
-
-var http httpPkg
-
-// This example fetches several URLs concurrently,
-// using a WaitGroup to block until all the fetches are complete.
-func ExampleWaitGroup() {
-	var wg sync.WaitGroup
-	var urls = []string{
-		"http://www.golang.org/",
-		"http://www.google.com/",
-		"http://www.somestupidname.com/",
-	}
-	for _, url := range urls {
-		// Increment the WaitGroup counter.
-		wg.Add(1)
-		// Launch a goroutine to fetch the URL.
-		go func(url string) {
-			// Decrement the counter when the goroutine completes.
-			defer wg.Done()
-			// Fetch the URL.
-			http.Get(url)
-		}(url)
-	}
-	// Wait for all HTTP fetches to complete.
-	wg.Wait()
-}
-
-func ExampleOnce() {
-	var once sync.Once
-	onceBody := func() {
-		fmt.Println("Only once")
-	}
-	done := make(chan bool)
-	for i := 0; i < 10; i++ {
-		go func() {
-			once.Do(onceBody)
-			done <- true
-		}()
-	}
-	for i := 0; i < 10; i++ {
-		<-done
-	}
-	// Output:
-	// Only once
-}
diff --git a/third_party/gofrontend/libgo/go/sync/export_test.go b/third_party/gofrontend/libgo/go/sync/export_test.go
deleted file mode 100644
index 6f49b3b..0000000
--- a/third_party/gofrontend/libgo/go/sync/export_test.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sync
-
-// Export for testing.
-var Runtime_Semacquire = runtime_Semacquire
-var Runtime_Semrelease = runtime_Semrelease
-
-const RaceEnabled = raceenabled
diff --git a/third_party/gofrontend/libgo/go/sync/mutex.go b/third_party/gofrontend/libgo/go/sync/mutex.go
deleted file mode 100644
index 3f280ad..0000000
--- a/third_party/gofrontend/libgo/go/sync/mutex.go
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package sync provides basic synchronization primitives such as mutual
-// exclusion locks.  Other than the Once and WaitGroup types, most are intended
-// for use by low-level library routines.  Higher-level synchronization is
-// better done via channels and communication.
-//
-// Values containing the types defined in this package should not be copied.
-package sync
-
-import (
-	"sync/atomic"
-	"unsafe"
-)
-
-// A Mutex is a mutual exclusion lock.
-// Mutexes can be created as part of other structures;
-// the zero value for a Mutex is an unlocked mutex.
-type Mutex struct {
-	state int32
-	sema  uint32
-}
-
-// A Locker represents an object that can be locked and unlocked.
-type Locker interface {
-	Lock()
-	Unlock()
-}
-
-const (
-	mutexLocked = 1 << iota // mutex is locked
-	mutexWoken
-	mutexWaiterShift = iota
-)
-
-// Lock locks m.
-// If the lock is already in use, the calling goroutine
-// blocks until the mutex is available.
-func (m *Mutex) Lock() {
-	// Fast path: grab unlocked mutex.
-	if atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked) {
-		if raceenabled {
-			raceAcquire(unsafe.Pointer(m))
-		}
-		return
-	}
-
-	awoke := false
-	iter := 0
-	for {
-		old := m.state
-		new := old | mutexLocked
-		if old&mutexLocked != 0 {
-			if runtime_canSpin(iter) {
-				// Active spinning makes sense.
-				// Try to set mutexWoken flag to inform Unlock
-				// to not wake other blocked goroutines.
-				if !awoke && old&mutexWoken == 0 && old>>mutexWaiterShift != 0 &&
-					atomic.CompareAndSwapInt32(&m.state, old, old|mutexWoken) {
-					awoke = true
-				}
-				runtime_doSpin()
-				iter++
-				continue
-			}
-			new = old + 1<<mutexWaiterShift
-		}
-		if awoke {
-			// The goroutine has been woken from sleep,
-			// so we need to reset the flag in either case.
-			if new&mutexWoken == 0 {
-				panic("sync: inconsistent mutex state")
-			}
-			new &^= mutexWoken
-		}
-		if atomic.CompareAndSwapInt32(&m.state, old, new) {
-			if old&mutexLocked == 0 {
-				break
-			}
-			runtime_Semacquire(&m.sema)
-			awoke = true
-			iter = 0
-		}
-	}
-
-	if raceenabled {
-		raceAcquire(unsafe.Pointer(m))
-	}
-}
-
-// Unlock unlocks m.
-// It is a run-time error if m is not locked on entry to Unlock.
-//
-// A locked Mutex is not associated with a particular goroutine.
-// It is allowed for one goroutine to lock a Mutex and then
-// arrange for another goroutine to unlock it.
-func (m *Mutex) Unlock() {
-	if raceenabled {
-		_ = m.state
-		raceRelease(unsafe.Pointer(m))
-	}
-
-	// Fast path: drop lock bit.
-	new := atomic.AddInt32(&m.state, -mutexLocked)
-	if (new+mutexLocked)&mutexLocked == 0 {
-		panic("sync: unlock of unlocked mutex")
-	}
-
-	old := new
-	for {
-		// If there are no waiters or a goroutine has already
-		// been woken or grabbed the lock, no need to wake anyone.
-		if old>>mutexWaiterShift == 0 || old&(mutexLocked|mutexWoken) != 0 {
-			return
-		}
-		// Grab the right to wake someone.
-		new = (old - 1<<mutexWaiterShift) | mutexWoken
-		if atomic.CompareAndSwapInt32(&m.state, old, new) {
-			runtime_Semrelease(&m.sema)
-			return
-		}
-		old = m.state
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/sync/mutex_test.go b/third_party/gofrontend/libgo/go/sync/mutex_test.go
deleted file mode 100644
index 91a4855..0000000
--- a/third_party/gofrontend/libgo/go/sync/mutex_test.go
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// GOMAXPROCS=10 go test
-
-package sync_test
-
-import (
-	"runtime"
-	. "sync"
-	"testing"
-)
-
-func HammerSemaphore(s *uint32, loops int, cdone chan bool) {
-	for i := 0; i < loops; i++ {
-		Runtime_Semacquire(s)
-		Runtime_Semrelease(s)
-	}
-	cdone <- true
-}
-
-func TestSemaphore(t *testing.T) {
-	s := new(uint32)
-	*s = 1
-	c := make(chan bool)
-	for i := 0; i < 10; i++ {
-		go HammerSemaphore(s, 1000, c)
-	}
-	for i := 0; i < 10; i++ {
-		<-c
-	}
-}
-
-func BenchmarkUncontendedSemaphore(b *testing.B) {
-	s := new(uint32)
-	*s = 1
-	HammerSemaphore(s, b.N, make(chan bool, 2))
-}
-
-func BenchmarkContendedSemaphore(b *testing.B) {
-	b.StopTimer()
-	s := new(uint32)
-	*s = 1
-	c := make(chan bool)
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
-	b.StartTimer()
-
-	go HammerSemaphore(s, b.N/2, c)
-	go HammerSemaphore(s, b.N/2, c)
-	<-c
-	<-c
-}
-
-func HammerMutex(m *Mutex, loops int, cdone chan bool) {
-	for i := 0; i < loops; i++ {
-		m.Lock()
-		m.Unlock()
-	}
-	cdone <- true
-}
-
-func TestMutex(t *testing.T) {
-	m := new(Mutex)
-	c := make(chan bool)
-	for i := 0; i < 10; i++ {
-		go HammerMutex(m, 1000, c)
-	}
-	for i := 0; i < 10; i++ {
-		<-c
-	}
-}
-
-func TestMutexPanic(t *testing.T) {
-	defer func() {
-		if recover() == nil {
-			t.Fatalf("unlock of unlocked mutex did not panic")
-		}
-	}()
-
-	var mu Mutex
-	mu.Lock()
-	mu.Unlock()
-	mu.Unlock()
-}
-
-func BenchmarkMutexUncontended(b *testing.B) {
-	type PaddedMutex struct {
-		Mutex
-		pad [128]uint8
-	}
-	b.RunParallel(func(pb *testing.PB) {
-		var mu PaddedMutex
-		for pb.Next() {
-			mu.Lock()
-			mu.Unlock()
-		}
-	})
-}
-
-func benchmarkMutex(b *testing.B, slack, work bool) {
-	var mu Mutex
-	if slack {
-		b.SetParallelism(10)
-	}
-	b.RunParallel(func(pb *testing.PB) {
-		foo := 0
-		for pb.Next() {
-			mu.Lock()
-			mu.Unlock()
-			if work {
-				for i := 0; i < 100; i++ {
-					foo *= 2
-					foo /= 2
-				}
-			}
-		}
-		_ = foo
-	})
-}
-
-func BenchmarkMutex(b *testing.B) {
-	benchmarkMutex(b, false, false)
-}
-
-func BenchmarkMutexSlack(b *testing.B) {
-	benchmarkMutex(b, true, false)
-}
-
-func BenchmarkMutexWork(b *testing.B) {
-	benchmarkMutex(b, false, true)
-}
-
-func BenchmarkMutexWorkSlack(b *testing.B) {
-	benchmarkMutex(b, true, true)
-}
-
-func BenchmarkMutexNoSpin(b *testing.B) {
-	// This benchmark models a situation where spinning in the mutex should be
-	// non-profitable and allows to confirm that spinning does not do harm.
-	// To achieve this we create excess of goroutines most of which do local work.
-	// These goroutines yield during local work, so that switching from
-	// a blocked goroutine to other goroutines is profitable.
-	// As a matter of fact, this benchmark still triggers some spinning in the mutex.
-	var m Mutex
-	var acc0, acc1 uint64
-	b.SetParallelism(4)
-	b.RunParallel(func(pb *testing.PB) {
-		c := make(chan bool)
-		var data [4 << 10]uint64
-		for i := 0; pb.Next(); i++ {
-			if i%4 == 0 {
-				m.Lock()
-				acc0 -= 100
-				acc1 += 100
-				m.Unlock()
-			} else {
-				for i := 0; i < len(data); i += 4 {
-					data[i]++
-				}
-				// Elaborate way to say runtime.Gosched
-				// that does not put the goroutine onto global runq.
-				go func() {
-					c <- true
-				}()
-				<-c
-			}
-		}
-	})
-}
-
-func BenchmarkMutexSpin(b *testing.B) {
-	// This benchmark models a situation where spinning in the mutex should be
-	// profitable. To achieve this we create a goroutine per-proc.
-	// These goroutines access considerable amount of local data so that
-	// unnecessary rescheduling is penalized by cache misses.
-	var m Mutex
-	var acc0, acc1 uint64
-	b.RunParallel(func(pb *testing.PB) {
-		var data [16 << 10]uint64
-		for i := 0; pb.Next(); i++ {
-			m.Lock()
-			acc0 -= 100
-			acc1 += 100
-			m.Unlock()
-			for i := 0; i < len(data); i += 4 {
-				data[i]++
-			}
-		}
-	})
-}
diff --git a/third_party/gofrontend/libgo/go/sync/once.go b/third_party/gofrontend/libgo/go/sync/once.go
deleted file mode 100644
index 10b42fd..0000000
--- a/third_party/gofrontend/libgo/go/sync/once.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sync
-
-import (
-	"sync/atomic"
-)
-
-// Once is an object that will perform exactly one action.
-type Once struct {
-	m    Mutex
-	done uint32
-}
-
-// Do calls the function f if and only if Do is being called for the
-// first time for this instance of Once. In other words, given
-// 	var once Once
-// if once.Do(f) is called multiple times, only the first call will invoke f,
-// even if f has a different value in each invocation.  A new instance of
-// Once is required for each function to execute.
-//
-// Do is intended for initialization that must be run exactly once.  Since f
-// is niladic, it may be necessary to use a function literal to capture the
-// arguments to a function to be invoked by Do:
-// 	config.once.Do(func() { config.init(filename) })
-//
-// Because no call to Do returns until the one call to f returns, if f causes
-// Do to be called, it will deadlock.
-//
-// If f panics, Do considers it to have returned; future calls of Do return
-// without calling f.
-//
-func (o *Once) Do(f func()) {
-	if atomic.LoadUint32(&o.done) == 1 {
-		return
-	}
-	// Slow-path.
-	o.m.Lock()
-	defer o.m.Unlock()
-	if o.done == 0 {
-		defer atomic.StoreUint32(&o.done, 1)
-		f()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/sync/once_test.go b/third_party/gofrontend/libgo/go/sync/once_test.go
deleted file mode 100644
index 1eec8d1..0000000
--- a/third_party/gofrontend/libgo/go/sync/once_test.go
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sync_test
-
-import (
-	. "sync"
-	"testing"
-)
-
-type one int
-
-func (o *one) Increment() {
-	*o++
-}
-
-func run(t *testing.T, once *Once, o *one, c chan bool) {
-	once.Do(func() { o.Increment() })
-	if v := *o; v != 1 {
-		t.Errorf("once failed inside run: %d is not 1", v)
-	}
-	c <- true
-}
-
-func TestOnce(t *testing.T) {
-	o := new(one)
-	once := new(Once)
-	c := make(chan bool)
-	const N = 10
-	for i := 0; i < N; i++ {
-		go run(t, once, o, c)
-	}
-	for i := 0; i < N; i++ {
-		<-c
-	}
-	if *o != 1 {
-		t.Errorf("once failed outside run: %d is not 1", *o)
-	}
-}
-
-func TestOncePanic(t *testing.T) {
-	var once Once
-	func() {
-		defer func() {
-			if r := recover(); r == nil {
-				t.Fatalf("Once.Do did not panic")
-			}
-		}()
-		once.Do(func() {
-			panic("failed")
-		})
-	}()
-
-	once.Do(func() {
-		t.Fatalf("Once.Do called twice")
-	})
-}
-
-func BenchmarkOnce(b *testing.B) {
-	var once Once
-	f := func() {}
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			once.Do(f)
-		}
-	})
-}
diff --git a/third_party/gofrontend/libgo/go/sync/pool.go b/third_party/gofrontend/libgo/go/sync/pool.go
deleted file mode 100644
index 0cf0637..0000000
--- a/third_party/gofrontend/libgo/go/sync/pool.go
+++ /dev/null
@@ -1,225 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sync
-
-import (
-	"runtime"
-	"sync/atomic"
-	"unsafe"
-)
-
-// A Pool is a set of temporary objects that may be individually saved and
-// retrieved.
-//
-// Any item stored in the Pool may be removed automatically at any time without
-// notification. If the Pool holds the only reference when this happens, the
-// item might be deallocated.
-//
-// A Pool is safe for use by multiple goroutines simultaneously.
-//
-// Pool's purpose is to cache allocated but unused items for later reuse,
-// relieving pressure on the garbage collector. That is, it makes it easy to
-// build efficient, thread-safe free lists. However, it is not suitable for all
-// free lists.
-//
-// An appropriate use of a Pool is to manage a group of temporary items
-// silently shared among and potentially reused by concurrent independent
-// clients of a package. Pool provides a way to amortize allocation overhead
-// across many clients.
-//
-// An example of good use of a Pool is in the fmt package, which maintains a
-// dynamically-sized store of temporary output buffers. The store scales under
-// load (when many goroutines are actively printing) and shrinks when
-// quiescent.
-//
-// On the other hand, a free list maintained as part of a short-lived object is
-// not a suitable use for a Pool, since the overhead does not amortize well in
-// that scenario. It is more efficient to have such objects implement their own
-// free list.
-//
-type Pool struct {
-	local     unsafe.Pointer // local fixed-size per-P pool, actual type is [P]poolLocal
-	localSize uintptr        // size of the local array
-
-	// New optionally specifies a function to generate
-	// a value when Get would otherwise return nil.
-	// It may not be changed concurrently with calls to Get.
-	New func() interface{}
-}
-
-// Local per-P Pool appendix.
-type poolLocal struct {
-	private interface{}   // Can be used only by the respective P.
-	shared  []interface{} // Can be used by any P.
-	Mutex                 // Protects shared.
-	pad     [128]byte     // Prevents false sharing.
-}
-
-// Put adds x to the pool.
-func (p *Pool) Put(x interface{}) {
-	if raceenabled {
-		// Under race detector the Pool degenerates into no-op.
-		// It's conforming, simple and does not introduce excessive
-		// happens-before edges between unrelated goroutines.
-		return
-	}
-	if x == nil {
-		return
-	}
-	l := p.pin()
-	if l.private == nil {
-		l.private = x
-		x = nil
-	}
-	runtime_procUnpin()
-	if x == nil {
-		return
-	}
-	l.Lock()
-	l.shared = append(l.shared, x)
-	l.Unlock()
-}
-
-// Get selects an arbitrary item from the Pool, removes it from the
-// Pool, and returns it to the caller.
-// Get may choose to ignore the pool and treat it as empty.
-// Callers should not assume any relation between values passed to Put and
-// the values returned by Get.
-//
-// If Get would otherwise return nil and p.New is non-nil, Get returns
-// the result of calling p.New.
-func (p *Pool) Get() interface{} {
-	if raceenabled {
-		if p.New != nil {
-			return p.New()
-		}
-		return nil
-	}
-	l := p.pin()
-	x := l.private
-	l.private = nil
-	runtime_procUnpin()
-	if x != nil {
-		return x
-	}
-	l.Lock()
-	last := len(l.shared) - 1
-	if last >= 0 {
-		x = l.shared[last]
-		l.shared = l.shared[:last]
-	}
-	l.Unlock()
-	if x != nil {
-		return x
-	}
-	return p.getSlow()
-}
-
-func (p *Pool) getSlow() (x interface{}) {
-	// See the comment in pin regarding ordering of the loads.
-	size := atomic.LoadUintptr(&p.localSize) // load-acquire
-	local := p.local                         // load-consume
-	// Try to steal one element from other procs.
-	pid := runtime_procPin()
-	runtime_procUnpin()
-	for i := 0; i < int(size); i++ {
-		l := indexLocal(local, (pid+i+1)%int(size))
-		l.Lock()
-		last := len(l.shared) - 1
-		if last >= 0 {
-			x = l.shared[last]
-			l.shared = l.shared[:last]
-			l.Unlock()
-			break
-		}
-		l.Unlock()
-	}
-
-	if x == nil && p.New != nil {
-		x = p.New()
-	}
-	return x
-}
-
-// pin pins the current goroutine to P, disables preemption and returns poolLocal pool for the P.
-// Caller must call runtime_procUnpin() when done with the pool.
-func (p *Pool) pin() *poolLocal {
-	pid := runtime_procPin()
-	// In pinSlow we store to localSize and then to local, here we load in opposite order.
-	// Since we've disabled preemption, GC can not happen in between.
-	// Thus here we must observe local at least as large localSize.
-	// We can observe a newer/larger local, it is fine (we must observe its zero-initialized-ness).
-	s := atomic.LoadUintptr(&p.localSize) // load-acquire
-	l := p.local                          // load-consume
-	if uintptr(pid) < s {
-		return indexLocal(l, pid)
-	}
-	return p.pinSlow()
-}
-
-func (p *Pool) pinSlow() *poolLocal {
-	// Retry under the mutex.
-	// Can not lock the mutex while pinned.
-	runtime_procUnpin()
-	allPoolsMu.Lock()
-	defer allPoolsMu.Unlock()
-	pid := runtime_procPin()
-	// poolCleanup won't be called while we are pinned.
-	s := p.localSize
-	l := p.local
-	if uintptr(pid) < s {
-		return indexLocal(l, pid)
-	}
-	if p.local == nil {
-		allPools = append(allPools, p)
-	}
-	// If GOMAXPROCS changes between GCs, we re-allocate the array and lose the old one.
-	size := runtime.GOMAXPROCS(0)
-	local := make([]poolLocal, size)
-	atomic.StorePointer((*unsafe.Pointer)(&p.local), unsafe.Pointer(&local[0])) // store-release
-	atomic.StoreUintptr(&p.localSize, uintptr(size))                            // store-release
-	return &local[pid]
-}
-
-func poolCleanup() {
-	// This function is called with the world stopped, at the beginning of a garbage collection.
-	// It must not allocate and probably should not call any runtime functions.
-	// Defensively zero out everything, 2 reasons:
-	// 1. To prevent false retention of whole Pools.
-	// 2. If GC happens while a goroutine works with l.shared in Put/Get,
-	//    it will retain whole Pool. So next cycle memory consumption would be doubled.
-	for i, p := range allPools {
-		allPools[i] = nil
-		for i := 0; i < int(p.localSize); i++ {
-			l := indexLocal(p.local, i)
-			l.private = nil
-			for j := range l.shared {
-				l.shared[j] = nil
-			}
-			l.shared = nil
-		}
-		p.local = nil
-		p.localSize = 0
-	}
-	allPools = []*Pool{}
-}
-
-var (
-	allPoolsMu Mutex
-	allPools   []*Pool
-)
-
-func init() {
-	runtime_registerPoolCleanup(poolCleanup)
-}
-
-func indexLocal(l unsafe.Pointer, i int) *poolLocal {
-	return &(*[1000000]poolLocal)(l)[i]
-}
-
-// Implemented in runtime.
-func runtime_registerPoolCleanup(cleanup func())
-func runtime_procPin() int
-func runtime_procUnpin()
diff --git a/third_party/gofrontend/libgo/go/sync/pool_test.go b/third_party/gofrontend/libgo/go/sync/pool_test.go
deleted file mode 100644
index 051bb17..0000000
--- a/third_party/gofrontend/libgo/go/sync/pool_test.go
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Pool is no-op under race detector, so all these tests do not work.
-// +build !race
-
-package sync_test
-
-import (
-	"runtime"
-	"runtime/debug"
-	. "sync"
-	"sync/atomic"
-	"testing"
-	"time"
-)
-
-func TestPool(t *testing.T) {
-	// disable GC so we can control when it happens.
-	defer debug.SetGCPercent(debug.SetGCPercent(-1))
-	var p Pool
-	if p.Get() != nil {
-		t.Fatal("expected empty")
-	}
-	p.Put("a")
-	p.Put("b")
-	if g := p.Get(); g != "a" {
-		t.Fatalf("got %#v; want a", g)
-	}
-	if g := p.Get(); g != "b" {
-		t.Fatalf("got %#v; want b", g)
-	}
-	if g := p.Get(); g != nil {
-		t.Fatalf("got %#v; want nil", g)
-	}
-
-	p.Put("c")
-	debug.SetGCPercent(100) // to allow following GC to actually run
-	runtime.GC()
-	if g := p.Get(); g != nil {
-		t.Fatalf("got %#v; want nil after GC", g)
-	}
-}
-
-func TestPoolNew(t *testing.T) {
-	// disable GC so we can control when it happens.
-	defer debug.SetGCPercent(debug.SetGCPercent(-1))
-
-	i := 0
-	p := Pool{
-		New: func() interface{} {
-			i++
-			return i
-		},
-	}
-	if v := p.Get(); v != 1 {
-		t.Fatalf("got %v; want 1", v)
-	}
-	if v := p.Get(); v != 2 {
-		t.Fatalf("got %v; want 2", v)
-	}
-	p.Put(42)
-	if v := p.Get(); v != 42 {
-		t.Fatalf("got %v; want 42", v)
-	}
-	if v := p.Get(); v != 3 {
-		t.Fatalf("got %v; want 3", v)
-	}
-}
-
-// Test that Pool does not hold pointers to previously cached resources.
-func TestPoolGC(t *testing.T) {
-	testPool(t, true)
-}
-
-// Test that Pool releases resources on GC.
-func TestPoolRelease(t *testing.T) {
-	testPool(t, false)
-}
-
-func testPool(t *testing.T, drain bool) {
-	t.Skip("gccgo imprecise GC breaks this test")
-	var p Pool
-	const N = 100
-loop:
-	for try := 0; try < 3; try++ {
-		var fin, fin1 uint32
-		for i := 0; i < N; i++ {
-			v := new(string)
-			runtime.SetFinalizer(v, func(vv *string) {
-				atomic.AddUint32(&fin, 1)
-			})
-			p.Put(v)
-		}
-		if drain {
-			for i := 0; i < N; i++ {
-				p.Get()
-			}
-		}
-		for i := 0; i < 5; i++ {
-			runtime.GC()
-			time.Sleep(time.Duration(i*100+10) * time.Millisecond)
-			// 1 pointer can remain on stack or elsewhere
-			if fin1 = atomic.LoadUint32(&fin); fin1 >= N-1 {
-				continue loop
-			}
-		}
-		t.Fatalf("only %v out of %v resources are finalized on try %v", fin1, N, try)
-	}
-}
-
-func TestPoolStress(t *testing.T) {
-	const P = 10
-	N := int(1e6)
-	if testing.Short() {
-		N /= 100
-	}
-	var p Pool
-	done := make(chan bool)
-	for i := 0; i < P; i++ {
-		go func() {
-			var v interface{} = 0
-			for j := 0; j < N; j++ {
-				if v == nil {
-					v = 0
-				}
-				p.Put(v)
-				v = p.Get()
-				if v != nil && v.(int) != 0 {
-					t.Fatalf("expect 0, got %v", v)
-				}
-			}
-			done <- true
-		}()
-	}
-	for i := 0; i < P; i++ {
-		<-done
-	}
-}
-
-func BenchmarkPool(b *testing.B) {
-	var p Pool
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			p.Put(1)
-			p.Get()
-		}
-	})
-}
-
-func BenchmarkPoolOverflow(b *testing.B) {
-	var p Pool
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			for b := 0; b < 100; b++ {
-				p.Put(1)
-			}
-			for b := 0; b < 100; b++ {
-				p.Get()
-			}
-		}
-	})
-}
diff --git a/third_party/gofrontend/libgo/go/sync/race.go b/third_party/gofrontend/libgo/go/sync/race.go
deleted file mode 100644
index fd0277d..0000000
--- a/third_party/gofrontend/libgo/go/sync/race.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build race
-
-package sync
-
-import (
-	"runtime"
-	"unsafe"
-)
-
-const raceenabled = true
-
-func raceAcquire(addr unsafe.Pointer) {
-	runtime.RaceAcquire(addr)
-}
-
-func raceRelease(addr unsafe.Pointer) {
-	runtime.RaceRelease(addr)
-}
-
-func raceReleaseMerge(addr unsafe.Pointer) {
-	runtime.RaceReleaseMerge(addr)
-}
-
-func raceDisable() {
-	runtime.RaceDisable()
-}
-
-func raceEnable() {
-	runtime.RaceEnable()
-}
-
-func raceRead(addr unsafe.Pointer) {
-	runtime.RaceRead(addr)
-}
-
-func raceWrite(addr unsafe.Pointer) {
-	runtime.RaceWrite(addr)
-}
diff --git a/third_party/gofrontend/libgo/go/sync/race0.go b/third_party/gofrontend/libgo/go/sync/race0.go
deleted file mode 100644
index 65ada1c..0000000
--- a/third_party/gofrontend/libgo/go/sync/race0.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !race
-
-package sync
-
-import (
-	"unsafe"
-)
-
-const raceenabled = false
-
-func raceAcquire(addr unsafe.Pointer) {
-}
-
-func raceRelease(addr unsafe.Pointer) {
-}
-
-func raceReleaseMerge(addr unsafe.Pointer) {
-}
-
-func raceDisable() {
-}
-
-func raceEnable() {
-}
-
-func raceRead(addr unsafe.Pointer) {
-}
-
-func raceWrite(addr unsafe.Pointer) {
-}
diff --git a/third_party/gofrontend/libgo/go/sync/runtime.go b/third_party/gofrontend/libgo/go/sync/runtime.go
deleted file mode 100644
index c66d2de..0000000
--- a/third_party/gofrontend/libgo/go/sync/runtime.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sync
-
-import "unsafe"
-
-// defined in package runtime
-
-// Semacquire waits until *s > 0 and then atomically decrements it.
-// It is intended as a simple sleep primitive for use by the synchronization
-// library and should not be used directly.
-func runtime_Semacquire(s *uint32)
-
-// Semrelease atomically increments *s and notifies a waiting goroutine
-// if one is blocked in Semacquire.
-// It is intended as a simple wakeup primitive for use by the synchronization
-// library and should not be used directly.
-func runtime_Semrelease(s *uint32)
-
-// Approximation of syncSema in runtime/sema.go.
-type syncSema struct {
-	lock uintptr
-	head unsafe.Pointer
-	tail unsafe.Pointer
-}
-
-// Syncsemacquire waits for a pairing Syncsemrelease on the same semaphore s.
-func runtime_Syncsemacquire(s *syncSema)
-
-// Syncsemrelease waits for n pairing Syncsemacquire on the same semaphore s.
-func runtime_Syncsemrelease(s *syncSema, n uint32)
-
-// Ensure that sync and runtime agree on size of syncSema.
-func runtime_Syncsemcheck(size uintptr)
-func init() {
-	var s syncSema
-	runtime_Syncsemcheck(unsafe.Sizeof(s))
-}
-
-// Active spinning runtime support.
-// runtime_canSpin returns true is spinning makes sense at the moment.
-func runtime_canSpin(i int) bool
-
-// runtime_doSpin does active spinning.
-func runtime_doSpin()
diff --git a/third_party/gofrontend/libgo/go/sync/runtime_sema_test.go b/third_party/gofrontend/libgo/go/sync/runtime_sema_test.go
deleted file mode 100644
index 5b7dd3d..0000000
--- a/third_party/gofrontend/libgo/go/sync/runtime_sema_test.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sync_test
-
-import (
-	"runtime"
-	. "sync"
-	"testing"
-)
-
-func BenchmarkSemaUncontended(b *testing.B) {
-	type PaddedSem struct {
-		sem uint32
-		pad [32]uint32
-	}
-	b.RunParallel(func(pb *testing.PB) {
-		sem := new(PaddedSem)
-		for pb.Next() {
-			Runtime_Semrelease(&sem.sem)
-			Runtime_Semacquire(&sem.sem)
-		}
-	})
-}
-
-func benchmarkSema(b *testing.B, block, work bool) {
-	sem := uint32(0)
-	if block {
-		done := make(chan bool)
-		go func() {
-			for p := 0; p < runtime.GOMAXPROCS(0)/2; p++ {
-				Runtime_Semacquire(&sem)
-			}
-			done <- true
-		}()
-		defer func() {
-			<-done
-		}()
-	}
-	b.RunParallel(func(pb *testing.PB) {
-		foo := 0
-		for pb.Next() {
-			Runtime_Semrelease(&sem)
-			if work {
-				for i := 0; i < 100; i++ {
-					foo *= 2
-					foo /= 2
-				}
-			}
-			Runtime_Semacquire(&sem)
-		}
-		_ = foo
-		Runtime_Semrelease(&sem)
-	})
-}
-
-func BenchmarkSemaSyntNonblock(b *testing.B) {
-	benchmarkSema(b, false, false)
-}
-
-func BenchmarkSemaSyntBlock(b *testing.B) {
-	benchmarkSema(b, true, false)
-}
-
-func BenchmarkSemaWorkNonblock(b *testing.B) {
-	benchmarkSema(b, false, true)
-}
-
-func BenchmarkSemaWorkBlock(b *testing.B) {
-	benchmarkSema(b, true, true)
-}
diff --git a/third_party/gofrontend/libgo/go/sync/rwmutex.go b/third_party/gofrontend/libgo/go/sync/rwmutex.go
deleted file mode 100644
index 0e8a58e..0000000
--- a/third_party/gofrontend/libgo/go/sync/rwmutex.go
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sync
-
-import (
-	"sync/atomic"
-	"unsafe"
-)
-
-// An RWMutex is a reader/writer mutual exclusion lock.
-// The lock can be held by an arbitrary number of readers
-// or a single writer.
-// RWMutexes can be created as part of other
-// structures; the zero value for a RWMutex is
-// an unlocked mutex.
-type RWMutex struct {
-	w           Mutex  // held if there are pending writers
-	writerSem   uint32 // semaphore for writers to wait for completing readers
-	readerSem   uint32 // semaphore for readers to wait for completing writers
-	readerCount int32  // number of pending readers
-	readerWait  int32  // number of departing readers
-}
-
-const rwmutexMaxReaders = 1 << 30
-
-// RLock locks rw for reading.
-func (rw *RWMutex) RLock() {
-	if raceenabled {
-		_ = rw.w.state
-		raceDisable()
-	}
-	if atomic.AddInt32(&rw.readerCount, 1) < 0 {
-		// A writer is pending, wait for it.
-		runtime_Semacquire(&rw.readerSem)
-	}
-	if raceenabled {
-		raceEnable()
-		raceAcquire(unsafe.Pointer(&rw.readerSem))
-	}
-}
-
-// RUnlock undoes a single RLock call;
-// it does not affect other simultaneous readers.
-// It is a run-time error if rw is not locked for reading
-// on entry to RUnlock.
-func (rw *RWMutex) RUnlock() {
-	if raceenabled {
-		_ = rw.w.state
-		raceReleaseMerge(unsafe.Pointer(&rw.writerSem))
-		raceDisable()
-	}
-	if r := atomic.AddInt32(&rw.readerCount, -1); r < 0 {
-		if r+1 == 0 || r+1 == -rwmutexMaxReaders {
-			raceEnable()
-			panic("sync: RUnlock of unlocked RWMutex")
-		}
-		// A writer is pending.
-		if atomic.AddInt32(&rw.readerWait, -1) == 0 {
-			// The last reader unblocks the writer.
-			runtime_Semrelease(&rw.writerSem)
-		}
-	}
-	if raceenabled {
-		raceEnable()
-	}
-}
-
-// Lock locks rw for writing.
-// If the lock is already locked for reading or writing,
-// Lock blocks until the lock is available.
-// To ensure that the lock eventually becomes available,
-// a blocked Lock call excludes new readers from acquiring
-// the lock.
-func (rw *RWMutex) Lock() {
-	if raceenabled {
-		_ = rw.w.state
-		raceDisable()
-	}
-	// First, resolve competition with other writers.
-	rw.w.Lock()
-	// Announce to readers there is a pending writer.
-	r := atomic.AddInt32(&rw.readerCount, -rwmutexMaxReaders) + rwmutexMaxReaders
-	// Wait for active readers.
-	if r != 0 && atomic.AddInt32(&rw.readerWait, r) != 0 {
-		runtime_Semacquire(&rw.writerSem)
-	}
-	if raceenabled {
-		raceEnable()
-		raceAcquire(unsafe.Pointer(&rw.readerSem))
-		raceAcquire(unsafe.Pointer(&rw.writerSem))
-	}
-}
-
-// Unlock unlocks rw for writing.  It is a run-time error if rw is
-// not locked for writing on entry to Unlock.
-//
-// As with Mutexes, a locked RWMutex is not associated with a particular
-// goroutine.  One goroutine may RLock (Lock) an RWMutex and then
-// arrange for another goroutine to RUnlock (Unlock) it.
-func (rw *RWMutex) Unlock() {
-	if raceenabled {
-		_ = rw.w.state
-		raceRelease(unsafe.Pointer(&rw.readerSem))
-		raceRelease(unsafe.Pointer(&rw.writerSem))
-		raceDisable()
-	}
-
-	// Announce to readers there is no active writer.
-	r := atomic.AddInt32(&rw.readerCount, rwmutexMaxReaders)
-	if r >= rwmutexMaxReaders {
-		raceEnable()
-		panic("sync: Unlock of unlocked RWMutex")
-	}
-	// Unblock blocked readers, if any.
-	for i := 0; i < int(r); i++ {
-		runtime_Semrelease(&rw.readerSem)
-	}
-	// Allow other writers to proceed.
-	rw.w.Unlock()
-	if raceenabled {
-		raceEnable()
-	}
-}
-
-// RLocker returns a Locker interface that implements
-// the Lock and Unlock methods by calling rw.RLock and rw.RUnlock.
-func (rw *RWMutex) RLocker() Locker {
-	return (*rlocker)(rw)
-}
-
-type rlocker RWMutex
-
-func (r *rlocker) Lock()   { (*RWMutex)(r).RLock() }
-func (r *rlocker) Unlock() { (*RWMutex)(r).RUnlock() }
diff --git a/third_party/gofrontend/libgo/go/sync/rwmutex_test.go b/third_party/gofrontend/libgo/go/sync/rwmutex_test.go
deleted file mode 100644
index f625bc3..0000000
--- a/third_party/gofrontend/libgo/go/sync/rwmutex_test.go
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// GOMAXPROCS=10 go test
-
-package sync_test
-
-import (
-	"fmt"
-	"runtime"
-	. "sync"
-	"sync/atomic"
-	"testing"
-)
-
-func parallelReader(m *RWMutex, clocked, cunlock, cdone chan bool) {
-	m.RLock()
-	clocked <- true
-	<-cunlock
-	m.RUnlock()
-	cdone <- true
-}
-
-func doTestParallelReaders(numReaders, gomaxprocs int) {
-	runtime.GOMAXPROCS(gomaxprocs)
-	var m RWMutex
-	clocked := make(chan bool)
-	cunlock := make(chan bool)
-	cdone := make(chan bool)
-	for i := 0; i < numReaders; i++ {
-		go parallelReader(&m, clocked, cunlock, cdone)
-	}
-	// Wait for all parallel RLock()s to succeed.
-	for i := 0; i < numReaders; i++ {
-		<-clocked
-	}
-	for i := 0; i < numReaders; i++ {
-		cunlock <- true
-	}
-	// Wait for the goroutines to finish.
-	for i := 0; i < numReaders; i++ {
-		<-cdone
-	}
-}
-
-func TestParallelReaders(t *testing.T) {
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(-1))
-	doTestParallelReaders(1, 4)
-	doTestParallelReaders(3, 4)
-	doTestParallelReaders(4, 2)
-}
-
-func reader(rwm *RWMutex, num_iterations int, activity *int32, cdone chan bool) {
-	for i := 0; i < num_iterations; i++ {
-		rwm.RLock()
-		n := atomic.AddInt32(activity, 1)
-		if n < 1 || n >= 10000 {
-			panic(fmt.Sprintf("wlock(%d)\n", n))
-		}
-		for i := 0; i < 100; i++ {
-		}
-		atomic.AddInt32(activity, -1)
-		rwm.RUnlock()
-	}
-	cdone <- true
-}
-
-func writer(rwm *RWMutex, num_iterations int, activity *int32, cdone chan bool) {
-	for i := 0; i < num_iterations; i++ {
-		rwm.Lock()
-		n := atomic.AddInt32(activity, 10000)
-		if n != 10000 {
-			panic(fmt.Sprintf("wlock(%d)\n", n))
-		}
-		for i := 0; i < 100; i++ {
-		}
-		atomic.AddInt32(activity, -10000)
-		rwm.Unlock()
-	}
-	cdone <- true
-}
-
-func HammerRWMutex(gomaxprocs, numReaders, num_iterations int) {
-	runtime.GOMAXPROCS(gomaxprocs)
-	// Number of active readers + 10000 * number of active writers.
-	var activity int32
-	var rwm RWMutex
-	cdone := make(chan bool)
-	go writer(&rwm, num_iterations, &activity, cdone)
-	var i int
-	for i = 0; i < numReaders/2; i++ {
-		go reader(&rwm, num_iterations, &activity, cdone)
-	}
-	go writer(&rwm, num_iterations, &activity, cdone)
-	for ; i < numReaders; i++ {
-		go reader(&rwm, num_iterations, &activity, cdone)
-	}
-	// Wait for the 2 writers and all readers to finish.
-	for i := 0; i < 2+numReaders; i++ {
-		<-cdone
-	}
-}
-
-func TestRWMutex(t *testing.T) {
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(-1))
-	n := 1000
-	if testing.Short() {
-		n = 5
-	}
-	HammerRWMutex(1, 1, n)
-	HammerRWMutex(1, 3, n)
-	HammerRWMutex(1, 10, n)
-	HammerRWMutex(4, 1, n)
-	HammerRWMutex(4, 3, n)
-	HammerRWMutex(4, 10, n)
-	HammerRWMutex(10, 1, n)
-	HammerRWMutex(10, 3, n)
-	HammerRWMutex(10, 10, n)
-	HammerRWMutex(10, 5, n)
-}
-
-func TestRLocker(t *testing.T) {
-	var wl RWMutex
-	var rl Locker
-	wlocked := make(chan bool, 1)
-	rlocked := make(chan bool, 1)
-	rl = wl.RLocker()
-	n := 10
-	go func() {
-		for i := 0; i < n; i++ {
-			rl.Lock()
-			rl.Lock()
-			rlocked <- true
-			wl.Lock()
-			wlocked <- true
-		}
-	}()
-	for i := 0; i < n; i++ {
-		<-rlocked
-		rl.Unlock()
-		select {
-		case <-wlocked:
-			t.Fatal("RLocker() didn't read-lock it")
-		default:
-		}
-		rl.Unlock()
-		<-wlocked
-		select {
-		case <-rlocked:
-			t.Fatal("RLocker() didn't respect the write lock")
-		default:
-		}
-		wl.Unlock()
-	}
-}
-
-func TestUnlockPanic(t *testing.T) {
-	defer func() {
-		if recover() == nil {
-			t.Fatalf("unlock of unlocked RWMutex did not panic")
-		}
-	}()
-	var mu RWMutex
-	mu.Unlock()
-}
-
-func TestUnlockPanic2(t *testing.T) {
-	defer func() {
-		if recover() == nil {
-			t.Fatalf("unlock of unlocked RWMutex did not panic")
-		}
-	}()
-	var mu RWMutex
-	mu.RLock()
-	mu.Unlock()
-}
-
-func TestRUnlockPanic(t *testing.T) {
-	defer func() {
-		if recover() == nil {
-			t.Fatalf("read unlock of unlocked RWMutex did not panic")
-		}
-	}()
-	var mu RWMutex
-	mu.RUnlock()
-}
-
-func TestRUnlockPanic2(t *testing.T) {
-	defer func() {
-		if recover() == nil {
-			t.Fatalf("read unlock of unlocked RWMutex did not panic")
-		}
-	}()
-	var mu RWMutex
-	mu.Lock()
-	mu.RUnlock()
-}
-
-func BenchmarkRWMutexUncontended(b *testing.B) {
-	type PaddedRWMutex struct {
-		RWMutex
-		pad [32]uint32
-	}
-	b.RunParallel(func(pb *testing.PB) {
-		var rwm PaddedRWMutex
-		for pb.Next() {
-			rwm.RLock()
-			rwm.RLock()
-			rwm.RUnlock()
-			rwm.RUnlock()
-			rwm.Lock()
-			rwm.Unlock()
-		}
-	})
-}
-
-func benchmarkRWMutex(b *testing.B, localWork, writeRatio int) {
-	var rwm RWMutex
-	b.RunParallel(func(pb *testing.PB) {
-		foo := 0
-		for pb.Next() {
-			foo++
-			if foo%writeRatio == 0 {
-				rwm.Lock()
-				rwm.Unlock()
-			} else {
-				rwm.RLock()
-				for i := 0; i != localWork; i += 1 {
-					foo *= 2
-					foo /= 2
-				}
-				rwm.RUnlock()
-			}
-		}
-		_ = foo
-	})
-}
-
-func BenchmarkRWMutexWrite100(b *testing.B) {
-	benchmarkRWMutex(b, 0, 100)
-}
-
-func BenchmarkRWMutexWrite10(b *testing.B) {
-	benchmarkRWMutex(b, 0, 10)
-}
-
-func BenchmarkRWMutexWorkWrite100(b *testing.B) {
-	benchmarkRWMutex(b, 100, 100)
-}
-
-func BenchmarkRWMutexWorkWrite10(b *testing.B) {
-	benchmarkRWMutex(b, 100, 10)
-}
diff --git a/third_party/gofrontend/libgo/go/sync/waitgroup.go b/third_party/gofrontend/libgo/go/sync/waitgroup.go
deleted file mode 100644
index de399e6..0000000
--- a/third_party/gofrontend/libgo/go/sync/waitgroup.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sync
-
-import (
-	"sync/atomic"
-	"unsafe"
-)
-
-// A WaitGroup waits for a collection of goroutines to finish.
-// The main goroutine calls Add to set the number of
-// goroutines to wait for.  Then each of the goroutines
-// runs and calls Done when finished.  At the same time,
-// Wait can be used to block until all goroutines have finished.
-type WaitGroup struct {
-	// 64-bit value: high 32 bits are counter, low 32 bits are waiter count.
-	// 64-bit atomic operations require 64-bit alignment, but 32-bit
-	// compilers do not ensure it. So we allocate 12 bytes and then use
-	// the aligned 8 bytes in them as state.
-	state1 [12]byte
-	sema   uint32
-}
-
-func (wg *WaitGroup) state() *uint64 {
-	if uintptr(unsafe.Pointer(&wg.state1))%8 == 0 {
-		return (*uint64)(unsafe.Pointer(&wg.state1))
-	} else {
-		return (*uint64)(unsafe.Pointer(&wg.state1[4]))
-	}
-}
-
-// Add adds delta, which may be negative, to the WaitGroup counter.
-// If the counter becomes zero, all goroutines blocked on Wait are released.
-// If the counter goes negative, Add panics.
-//
-// Note that calls with a positive delta that occur when the counter is zero
-// must happen before a Wait. Calls with a negative delta, or calls with a
-// positive delta that start when the counter is greater than zero, may happen
-// at any time.
-// Typically this means the calls to Add should execute before the statement
-// creating the goroutine or other event to be waited for.
-// If a WaitGroup is reused to wait for several independent sets of events,
-// new Add calls must happen after all previous Wait calls have returned.
-// See the WaitGroup example.
-func (wg *WaitGroup) Add(delta int) {
-	statep := wg.state()
-	if raceenabled {
-		_ = *statep // trigger nil deref early
-		if delta < 0 {
-			// Synchronize decrements with Wait.
-			raceReleaseMerge(unsafe.Pointer(wg))
-		}
-		raceDisable()
-		defer raceEnable()
-	}
-	state := atomic.AddUint64(statep, uint64(delta)<<32)
-	v := int32(state >> 32)
-	w := uint32(state)
-	if raceenabled {
-		if delta > 0 && v == int32(delta) {
-			// The first increment must be synchronized with Wait.
-			// Need to model this as a read, because there can be
-			// several concurrent wg.counter transitions from 0.
-			raceRead(unsafe.Pointer(&wg.sema))
-		}
-	}
-	if v < 0 {
-		panic("sync: negative WaitGroup counter")
-	}
-	if w != 0 && delta > 0 && v == int32(delta) {
-		panic("sync: WaitGroup misuse: Add called concurrently with Wait")
-	}
-	if v > 0 || w == 0 {
-		return
-	}
-	// This goroutine has set counter to 0 when waiters > 0.
-	// Now there can't be concurrent mutations of state:
-	// - Adds must not happen concurrently with Wait,
-	// - Wait does not increment waiters if it sees counter == 0.
-	// Still do a cheap sanity check to detect WaitGroup misuse.
-	if *statep != state {
-		panic("sync: WaitGroup misuse: Add called concurrently with Wait")
-	}
-	// Reset waiters count to 0.
-	*statep = 0
-	for ; w != 0; w-- {
-		runtime_Semrelease(&wg.sema)
-	}
-}
-
-// Done decrements the WaitGroup counter.
-func (wg *WaitGroup) Done() {
-	wg.Add(-1)
-}
-
-// Wait blocks until the WaitGroup counter is zero.
-func (wg *WaitGroup) Wait() {
-	statep := wg.state()
-	if raceenabled {
-		_ = *statep // trigger nil deref early
-		raceDisable()
-	}
-	for {
-		state := atomic.LoadUint64(statep)
-		v := int32(state >> 32)
-		w := uint32(state)
-		if v == 0 {
-			// Counter is 0, no need to wait.
-			if raceenabled {
-				raceEnable()
-				raceAcquire(unsafe.Pointer(wg))
-			}
-			return
-		}
-		// Increment waiters count.
-		if atomic.CompareAndSwapUint64(statep, state, state+1) {
-			if raceenabled && w == 0 {
-				// Wait must be synchronized with the first Add.
-				// Need to model this is as a write to race with the read in Add.
-				// As a consequence, can do the write only for the first waiter,
-				// otherwise concurrent Waits will race with each other.
-				raceWrite(unsafe.Pointer(&wg.sema))
-			}
-			runtime_Semacquire(&wg.sema)
-			if *statep != 0 {
-				panic("sync: WaitGroup is reused before previous Wait has returned")
-			}
-			if raceenabled {
-				raceEnable()
-				raceAcquire(unsafe.Pointer(wg))
-			}
-			return
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/sync/waitgroup_test.go b/third_party/gofrontend/libgo/go/sync/waitgroup_test.go
deleted file mode 100644
index 3e3e3bf..0000000
--- a/third_party/gofrontend/libgo/go/sync/waitgroup_test.go
+++ /dev/null
@@ -1,271 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package sync_test
-
-import (
-	"runtime"
-	. "sync"
-	"sync/atomic"
-	"testing"
-)
-
-func testWaitGroup(t *testing.T, wg1 *WaitGroup, wg2 *WaitGroup) {
-	n := 16
-	wg1.Add(n)
-	wg2.Add(n)
-	exited := make(chan bool, n)
-	for i := 0; i != n; i++ {
-		go func(i int) {
-			wg1.Done()
-			wg2.Wait()
-			exited <- true
-		}(i)
-	}
-	wg1.Wait()
-	for i := 0; i != n; i++ {
-		select {
-		case <-exited:
-			t.Fatal("WaitGroup released group too soon")
-		default:
-		}
-		wg2.Done()
-	}
-	for i := 0; i != n; i++ {
-		<-exited // Will block if barrier fails to unlock someone.
-	}
-}
-
-func TestWaitGroup(t *testing.T) {
-	wg1 := &WaitGroup{}
-	wg2 := &WaitGroup{}
-
-	// Run the same test a few times to ensure barrier is in a proper state.
-	for i := 0; i != 8; i++ {
-		testWaitGroup(t, wg1, wg2)
-	}
-}
-
-func knownRacy(t *testing.T) {
-	if RaceEnabled {
-		t.Skip("skipping known-racy test under the race detector")
-	}
-}
-
-func TestWaitGroupMisuse(t *testing.T) {
-	defer func() {
-		err := recover()
-		if err != "sync: negative WaitGroup counter" {
-			t.Fatalf("Unexpected panic: %#v", err)
-		}
-	}()
-	wg := &WaitGroup{}
-	wg.Add(1)
-	wg.Done()
-	wg.Done()
-	t.Fatal("Should panic")
-}
-
-func TestWaitGroupMisuse2(t *testing.T) {
-	knownRacy(t)
-	if testing.Short() {
-		t.Skip("skipping flaky test in short mode; see issue 11443")
-	}
-	if runtime.NumCPU() <= 2 {
-		t.Skip("NumCPU<=2, skipping: this test requires parallelism")
-	}
-	defer func() {
-		err := recover()
-		if err != "sync: negative WaitGroup counter" &&
-			err != "sync: WaitGroup misuse: Add called concurrently with Wait" &&
-			err != "sync: WaitGroup is reused before previous Wait has returned" {
-			t.Fatalf("Unexpected panic: %#v", err)
-		}
-	}()
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
-	done := make(chan interface{}, 2)
-	// The detection is opportunistically, so we want it to panic
-	// at least in one run out of a million.
-	for i := 0; i < 1e6; i++ {
-		var wg WaitGroup
-		wg.Add(1)
-		go func() {
-			defer func() {
-				done <- recover()
-			}()
-			wg.Wait()
-		}()
-		go func() {
-			defer func() {
-				done <- recover()
-			}()
-			wg.Add(1) // This is the bad guy.
-			wg.Done()
-		}()
-		wg.Done()
-		for j := 0; j < 2; j++ {
-			if err := <-done; err != nil {
-				panic(err)
-			}
-		}
-	}
-	t.Fatal("Should panic")
-}
-
-func TestWaitGroupMisuse3(t *testing.T) {
-	knownRacy(t)
-	if runtime.NumCPU() <= 1 {
-		t.Skip("NumCPU==1, skipping: this test requires parallelism")
-	}
-	defer func() {
-		err := recover()
-		if err != "sync: negative WaitGroup counter" &&
-			err != "sync: WaitGroup misuse: Add called concurrently with Wait" &&
-			err != "sync: WaitGroup is reused before previous Wait has returned" {
-			t.Fatalf("Unexpected panic: %#v", err)
-		}
-	}()
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
-	done := make(chan interface{}, 1)
-	// The detection is opportunistically, so we want it to panic
-	// at least in one run out of a million.
-	for i := 0; i < 1e6; i++ {
-		var wg WaitGroup
-		wg.Add(1)
-		go func() {
-			wg.Done()
-		}()
-		go func() {
-			defer func() {
-				done <- recover()
-			}()
-			wg.Wait()
-			// Start reusing the wg before waiting for the Wait below to return.
-			wg.Add(1)
-			go func() {
-				wg.Done()
-			}()
-			wg.Wait()
-		}()
-		wg.Wait()
-		if err := <-done; err != nil {
-			panic(err)
-		}
-	}
-	t.Fatal("Should panic")
-}
-
-func TestWaitGroupRace(t *testing.T) {
-	// Run this test for about 1ms.
-	for i := 0; i < 1000; i++ {
-		wg := &WaitGroup{}
-		n := new(int32)
-		// spawn goroutine 1
-		wg.Add(1)
-		go func() {
-			atomic.AddInt32(n, 1)
-			wg.Done()
-		}()
-		// spawn goroutine 2
-		wg.Add(1)
-		go func() {
-			atomic.AddInt32(n, 1)
-			wg.Done()
-		}()
-		// Wait for goroutine 1 and 2
-		wg.Wait()
-		if atomic.LoadInt32(n) != 2 {
-			t.Fatal("Spurious wakeup from Wait")
-		}
-	}
-}
-
-func TestWaitGroupAlign(t *testing.T) {
-	type X struct {
-		x  byte
-		wg WaitGroup
-	}
-	var x X
-	x.wg.Add(1)
-	go func(x *X) {
-		x.wg.Done()
-	}(&x)
-	x.wg.Wait()
-}
-
-func BenchmarkWaitGroupUncontended(b *testing.B) {
-	type PaddedWaitGroup struct {
-		WaitGroup
-		pad [128]uint8
-	}
-	b.RunParallel(func(pb *testing.PB) {
-		var wg PaddedWaitGroup
-		for pb.Next() {
-			wg.Add(1)
-			wg.Done()
-			wg.Wait()
-		}
-	})
-}
-
-func benchmarkWaitGroupAddDone(b *testing.B, localWork int) {
-	var wg WaitGroup
-	b.RunParallel(func(pb *testing.PB) {
-		foo := 0
-		for pb.Next() {
-			wg.Add(1)
-			for i := 0; i < localWork; i++ {
-				foo *= 2
-				foo /= 2
-			}
-			wg.Done()
-		}
-		_ = foo
-	})
-}
-
-func BenchmarkWaitGroupAddDone(b *testing.B) {
-	benchmarkWaitGroupAddDone(b, 0)
-}
-
-func BenchmarkWaitGroupAddDoneWork(b *testing.B) {
-	benchmarkWaitGroupAddDone(b, 100)
-}
-
-func benchmarkWaitGroupWait(b *testing.B, localWork int) {
-	var wg WaitGroup
-	b.RunParallel(func(pb *testing.PB) {
-		foo := 0
-		for pb.Next() {
-			wg.Wait()
-			for i := 0; i < localWork; i++ {
-				foo *= 2
-				foo /= 2
-			}
-		}
-		_ = foo
-	})
-}
-
-func BenchmarkWaitGroupWait(b *testing.B) {
-	benchmarkWaitGroupWait(b, 0)
-}
-
-func BenchmarkWaitGroupWaitWork(b *testing.B) {
-	benchmarkWaitGroupWait(b, 100)
-}
-
-func BenchmarkWaitGroupActuallyWait(b *testing.B) {
-	b.ReportAllocs()
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			var wg WaitGroup
-			wg.Add(1)
-			go func() {
-				wg.Done()
-			}()
-			wg.Wait()
-		}
-	})
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/bpf_bsd.go b/third_party/gofrontend/libgo/go/syscall/bpf_bsd.go
deleted file mode 100644
index cc6c1e7..0000000
--- a/third_party/gofrontend/libgo/go/syscall/bpf_bsd.go
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-// Berkeley packet filter for BSD variants
-
-package syscall
-
-import (
-	"unsafe"
-)
-
-func BpfStmt(code, k int) *BpfInsn {
-	return &BpfInsn{Code: uint16(code), K: uint32(k)}
-}
-
-func BpfJump(code, k, jt, jf int) *BpfInsn {
-	return &BpfInsn{Code: uint16(code), Jt: uint8(jt), Jf: uint8(jf), K: uint32(k)}
-}
-
-func BpfBuflen(fd int) (int, error) {
-	var l int
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGBLEN, uintptr(unsafe.Pointer(&l)))
-	if err != 0 {
-		return 0, Errno(err)
-	}
-	return l, nil
-}
-
-func SetBpfBuflen(fd, l int) (int, error) {
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSBLEN, uintptr(unsafe.Pointer(&l)))
-	if err != 0 {
-		return 0, Errno(err)
-	}
-	return l, nil
-}
-
-func BpfDatalink(fd int) (int, error) {
-	var t int
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGDLT, uintptr(unsafe.Pointer(&t)))
-	if err != 0 {
-		return 0, Errno(err)
-	}
-	return t, nil
-}
-
-func SetBpfDatalink(fd, t int) (int, error) {
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSDLT, uintptr(unsafe.Pointer(&t)))
-	if err != 0 {
-		return 0, Errno(err)
-	}
-	return t, nil
-}
-
-func SetBpfPromisc(fd, m int) error {
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCPROMISC, uintptr(unsafe.Pointer(&m)))
-	if err != 0 {
-		return Errno(err)
-	}
-	return nil
-}
-
-func FlushBpf(fd int) error {
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCFLUSH, 0)
-	if err != 0 {
-		return Errno(err)
-	}
-	return nil
-}
-
-type ivalue struct {
-	name  [IFNAMSIZ]byte
-	value int16
-}
-
-func BpfInterface(fd int, name string) (string, error) {
-	var iv ivalue
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGETIF, uintptr(unsafe.Pointer(&iv)))
-	if err != 0 {
-		return "", Errno(err)
-	}
-	return name, nil
-}
-
-func SetBpfInterface(fd int, name string) error {
-	var iv ivalue
-	copy(iv.name[:], []byte(name))
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSETIF, uintptr(unsafe.Pointer(&iv)))
-	if err != 0 {
-		return Errno(err)
-	}
-	return nil
-}
-
-func BpfTimeout(fd int) (*Timeval, error) {
-	var tv Timeval
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGRTIMEOUT, uintptr(unsafe.Pointer(&tv)))
-	if err != 0 {
-		return nil, Errno(err)
-	}
-	return &tv, nil
-}
-
-func SetBpfTimeout(fd int, tv *Timeval) error {
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSRTIMEOUT, uintptr(unsafe.Pointer(tv)))
-	if err != 0 {
-		return Errno(err)
-	}
-	return nil
-}
-
-func BpfStats(fd int) (*BpfStat, error) {
-	var s BpfStat
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGSTATS, uintptr(unsafe.Pointer(&s)))
-	if err != 0 {
-		return nil, Errno(err)
-	}
-	return &s, nil
-}
-
-func SetBpfImmediate(fd, m int) error {
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCIMMEDIATE, uintptr(unsafe.Pointer(&m)))
-	if err != 0 {
-		return Errno(err)
-	}
-	return nil
-}
-
-func SetBpf(fd int, i []BpfInsn) error {
-	var p BpfProgram
-	p.Len = uint32(len(i))
-	p.Insns = (*BpfInsn)(unsafe.Pointer(&i[0]))
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSETF, uintptr(unsafe.Pointer(&p)))
-	if err != 0 {
-		return Errno(err)
-	}
-	return nil
-}
-
-func CheckBpfVersion(fd int) error {
-	var v BpfVersion
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCVERSION, uintptr(unsafe.Pointer(&v)))
-	if err != 0 {
-		return Errno(err)
-	}
-	if v.Major != BPF_MAJOR_VERSION || v.Minor != BPF_MINOR_VERSION {
-		return EINVAL
-	}
-	return nil
-}
-
-func BpfHeadercmpl(fd int) (int, error) {
-	var f int
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGHDRCMPLT, uintptr(unsafe.Pointer(&f)))
-	if err != 0 {
-		return 0, Errno(err)
-	}
-	return f, nil
-}
-
-func SetBpfHeadercmpl(fd, f int) error {
-	_, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSHDRCMPLT, uintptr(unsafe.Pointer(&f)))
-	if err != 0 {
-		return Errno(err)
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/const_plan9.go b/third_party/gofrontend/libgo/go/syscall/const_plan9.go
deleted file mode 100644
index ba26f12..0000000
--- a/third_party/gofrontend/libgo/go/syscall/const_plan9.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package syscall
-
-// Plan 9 Constants
-
-// Open modes
-const (
-	O_RDONLY  = 0
-	O_WRONLY  = 1
-	O_RDWR    = 2
-	O_TRUNC   = 16
-	O_CLOEXEC = 32
-	O_EXCL    = 0x1000
-)
-
-// Rfork flags
-const (
-	RFNAMEG  = 1 << 0
-	RFENVG   = 1 << 1
-	RFFDG    = 1 << 2
-	RFNOTEG  = 1 << 3
-	RFPROC   = 1 << 4
-	RFMEM    = 1 << 5
-	RFNOWAIT = 1 << 6
-	RFCNAMEG = 1 << 10
-	RFCENVG  = 1 << 11
-	RFCFDG   = 1 << 12
-	RFREND   = 1 << 13
-	RFNOMNT  = 1 << 14
-)
-
-// Qid.Type bits
-const (
-	QTDIR    = 0x80
-	QTAPPEND = 0x40
-	QTEXCL   = 0x20
-	QTMOUNT  = 0x10
-	QTAUTH   = 0x08
-	QTTMP    = 0x04
-	QTFILE   = 0x00
-)
-
-// Dir.Mode bits
-const (
-	DMDIR    = 0x80000000
-	DMAPPEND = 0x40000000
-	DMEXCL   = 0x20000000
-	DMMOUNT  = 0x10000000
-	DMAUTH   = 0x08000000
-	DMTMP    = 0x04000000
-	DMREAD   = 0x4
-	DMWRITE  = 0x2
-	DMEXEC   = 0x1
-)
-
-const (
-	STATMAX    = 65535
-	ERRMAX     = 128
-	STATFIXLEN = 49
-)
diff --git a/third_party/gofrontend/libgo/go/syscall/creds_test.go b/third_party/gofrontend/libgo/go/syscall/creds_test.go
deleted file mode 100644
index b4a14ff..0000000
--- a/third_party/gofrontend/libgo/go/syscall/creds_test.go
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build linux
-
-package syscall_test
-
-import (
-	"bytes"
-	"net"
-	"os"
-	"syscall"
-	"testing"
-)
-
-// TestSCMCredentials tests the sending and receiving of credentials
-// (PID, UID, GID) in an ancillary message between two UNIX
-// sockets. The SO_PASSCRED socket option is enabled on the sending
-// socket for this to work.
-func TestSCMCredentials(t *testing.T) {
-	fds, err := syscall.Socketpair(syscall.AF_LOCAL, syscall.SOCK_STREAM, 0)
-	if err != nil {
-		t.Fatalf("Socketpair: %v", err)
-	}
-	defer syscall.Close(fds[0])
-	defer syscall.Close(fds[1])
-
-	err = syscall.SetsockoptInt(fds[0], syscall.SOL_SOCKET, syscall.SO_PASSCRED, 1)
-	if err != nil {
-		t.Fatalf("SetsockoptInt: %v", err)
-	}
-
-	srvFile := os.NewFile(uintptr(fds[0]), "server")
-	defer srvFile.Close()
-	srv, err := net.FileConn(srvFile)
-	if err != nil {
-		t.Errorf("FileConn: %v", err)
-		return
-	}
-	defer srv.Close()
-
-	cliFile := os.NewFile(uintptr(fds[1]), "client")
-	defer cliFile.Close()
-	cli, err := net.FileConn(cliFile)
-	if err != nil {
-		t.Errorf("FileConn: %v", err)
-		return
-	}
-	defer cli.Close()
-
-	var ucred syscall.Ucred
-	if os.Getuid() != 0 {
-		ucred.Pid = int32(os.Getpid())
-		ucred.Uid = 0
-		ucred.Gid = 0
-		oob := syscall.UnixCredentials(&ucred)
-		_, _, err := cli.(*net.UnixConn).WriteMsgUnix(nil, oob, nil)
-		if op, ok := err.(*net.OpError); ok {
-			err = op.Err
-		}
-		if sys, ok := err.(*os.SyscallError); ok {
-			err = sys.Err
-		}
-		if err != syscall.EPERM {
-			t.Fatalf("WriteMsgUnix failed with %v, want EPERM", err)
-		}
-	}
-
-	ucred.Pid = int32(os.Getpid())
-	ucred.Uid = uint32(os.Getuid())
-	ucred.Gid = uint32(os.Getgid())
-	oob := syscall.UnixCredentials(&ucred)
-
-	// this is going to send a dummy byte
-	n, oobn, err := cli.(*net.UnixConn).WriteMsgUnix(nil, oob, nil)
-	if err != nil {
-		t.Fatalf("WriteMsgUnix: %v", err)
-	}
-	if n != 0 {
-		t.Fatalf("WriteMsgUnix n = %d, want 0", n)
-	}
-	if oobn != len(oob) {
-		t.Fatalf("WriteMsgUnix oobn = %d, want %d", oobn, len(oob))
-	}
-
-	oob2 := make([]byte, 10*len(oob))
-	n, oobn2, flags, _, err := srv.(*net.UnixConn).ReadMsgUnix(nil, oob2)
-	if err != nil {
-		t.Fatalf("ReadMsgUnix: %v", err)
-	}
-	if flags != 0 {
-		t.Fatalf("ReadMsgUnix flags = 0x%x, want 0", flags)
-	}
-	if n != 1 {
-		t.Fatalf("ReadMsgUnix n = %d, want 1 (dummy byte)", n)
-	}
-	if oobn2 != oobn {
-		// without SO_PASSCRED set on the socket, ReadMsgUnix will
-		// return zero oob bytes
-		t.Fatalf("ReadMsgUnix oobn = %d, want %d", oobn2, oobn)
-	}
-	oob2 = oob2[:oobn2]
-	if !bytes.Equal(oob, oob2) {
-		t.Fatal("ReadMsgUnix oob bytes don't match")
-	}
-
-	scm, err := syscall.ParseSocketControlMessage(oob2)
-	if err != nil {
-		t.Fatalf("ParseSocketControlMessage: %v", err)
-	}
-	newUcred, err := syscall.ParseUnixCredentials(&scm[0])
-	if err != nil {
-		t.Fatalf("ParseUnixCredentials: %v", err)
-	}
-	if *newUcred != ucred {
-		t.Fatalf("ParseUnixCredentials = %+v, want %+v", newUcred, ucred)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/dir_plan9.go b/third_party/gofrontend/libgo/go/syscall/dir_plan9.go
deleted file mode 100644
index 697bf54..0000000
--- a/third_party/gofrontend/libgo/go/syscall/dir_plan9.go
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Plan 9 directory marshalling. See intro(5).
-
-package syscall
-
-import "errors"
-
-var (
-	ErrShortStat = errors.New("stat buffer too short")
-	ErrBadStat   = errors.New("malformed stat buffer")
-	ErrBadName   = errors.New("bad character in file name")
-)
-
-// A Qid represents a 9P server's unique identification for a file.
-type Qid struct {
-	Path uint64 // the file server's unique identification for the file
-	Vers uint32 // version number for given Path
-	Type uint8  // the type of the file (syscall.QTDIR for example)
-}
-
-// A Dir contains the metadata for a file.
-type Dir struct {
-	// system-modified data
-	Type uint16 // server type
-	Dev  uint32 // server subtype
-
-	// file data
-	Qid    Qid    // unique id from server
-	Mode   uint32 // permissions
-	Atime  uint32 // last read time
-	Mtime  uint32 // last write time
-	Length int64  // file length
-	Name   string // last element of path
-	Uid    string // owner name
-	Gid    string // group name
-	Muid   string // last modifier name
-}
-
-var nullDir = Dir{
-	Type: ^uint16(0),
-	Dev:  ^uint32(0),
-	Qid: Qid{
-		Path: ^uint64(0),
-		Vers: ^uint32(0),
-		Type: ^uint8(0),
-	},
-	Mode:   ^uint32(0),
-	Atime:  ^uint32(0),
-	Mtime:  ^uint32(0),
-	Length: ^int64(0),
-}
-
-// Null assigns special "don't touch" values to members of d to
-// avoid modifying them during syscall.Wstat.
-func (d *Dir) Null() { *d = nullDir }
-
-// Marshal encodes a 9P stat message corresponding to d into b
-//
-// If there isn't enough space in b for a stat message, ErrShortStat is returned.
-func (d *Dir) Marshal(b []byte) (n int, err error) {
-	n = STATFIXLEN + len(d.Name) + len(d.Uid) + len(d.Gid) + len(d.Muid)
-	if n > len(b) {
-		return n, ErrShortStat
-	}
-
-	for _, c := range d.Name {
-		if c == '/' {
-			return n, ErrBadName
-		}
-	}
-
-	b = pbit16(b, uint16(n)-2)
-	b = pbit16(b, d.Type)
-	b = pbit32(b, d.Dev)
-	b = pbit8(b, d.Qid.Type)
-	b = pbit32(b, d.Qid.Vers)
-	b = pbit64(b, d.Qid.Path)
-	b = pbit32(b, d.Mode)
-	b = pbit32(b, d.Atime)
-	b = pbit32(b, d.Mtime)
-	b = pbit64(b, uint64(d.Length))
-	b = pstring(b, d.Name)
-	b = pstring(b, d.Uid)
-	b = pstring(b, d.Gid)
-	b = pstring(b, d.Muid)
-
-	return n, nil
-}
-
-// UnmarshalDir decodes a single 9P stat message from b and returns the resulting Dir.
-//
-// If b is too small to hold a valid stat message, ErrShortStat is returned.
-//
-// If the stat message itself is invalid, ErrBadStat is returned.
-func UnmarshalDir(b []byte) (*Dir, error) {
-	if len(b) < STATFIXLEN {
-		return nil, ErrShortStat
-	}
-	size, buf := gbit16(b)
-	if len(b) != int(size)+2 {
-		return nil, ErrBadStat
-	}
-	b = buf
-
-	var d Dir
-	d.Type, b = gbit16(b)
-	d.Dev, b = gbit32(b)
-	d.Qid.Type, b = gbit8(b)
-	d.Qid.Vers, b = gbit32(b)
-	d.Qid.Path, b = gbit64(b)
-	d.Mode, b = gbit32(b)
-	d.Atime, b = gbit32(b)
-	d.Mtime, b = gbit32(b)
-
-	n, b := gbit64(b)
-	d.Length = int64(n)
-
-	var ok bool
-	if d.Name, b, ok = gstring(b); !ok {
-		return nil, ErrBadStat
-	}
-	if d.Uid, b, ok = gstring(b); !ok {
-		return nil, ErrBadStat
-	}
-	if d.Gid, b, ok = gstring(b); !ok {
-		return nil, ErrBadStat
-	}
-	if d.Muid, b, ok = gstring(b); !ok {
-		return nil, ErrBadStat
-	}
-
-	return &d, nil
-}
-
-// pbit8 copies the 8-bit number v to b and returns the remaining slice of b.
-func pbit8(b []byte, v uint8) []byte {
-	b[0] = byte(v)
-	return b[1:]
-}
-
-// pbit16 copies the 16-bit number v to b in little-endian order and returns the remaining slice of b.
-func pbit16(b []byte, v uint16) []byte {
-	b[0] = byte(v)
-	b[1] = byte(v >> 8)
-	return b[2:]
-}
-
-// pbit32 copies the 32-bit number v to b in little-endian order and returns the remaining slice of b.
-func pbit32(b []byte, v uint32) []byte {
-	b[0] = byte(v)
-	b[1] = byte(v >> 8)
-	b[2] = byte(v >> 16)
-	b[3] = byte(v >> 24)
-	return b[4:]
-}
-
-// pbit64 copies the 64-bit number v to b in little-endian order and returns the remaining slice of b.
-func pbit64(b []byte, v uint64) []byte {
-	b[0] = byte(v)
-	b[1] = byte(v >> 8)
-	b[2] = byte(v >> 16)
-	b[3] = byte(v >> 24)
-	b[4] = byte(v >> 32)
-	b[5] = byte(v >> 40)
-	b[6] = byte(v >> 48)
-	b[7] = byte(v >> 56)
-	return b[8:]
-}
-
-// pstring copies the string s to b, prepending it with a 16-bit length in little-endian order, and
-// returning the remaining slice of b..
-func pstring(b []byte, s string) []byte {
-	b = pbit16(b, uint16(len(s)))
-	n := copy(b, s)
-	return b[n:]
-}
-
-// gbit8 reads an 8-bit number from b and returns it with the remaining slice of b.
-func gbit8(b []byte) (uint8, []byte) {
-	return uint8(b[0]), b[1:]
-}
-
-// gbit16 reads a 16-bit number in little-endian order from b and returns it with the remaining slice of b.
-func gbit16(b []byte) (uint16, []byte) {
-	return uint16(b[0]) | uint16(b[1])<<8, b[2:]
-}
-
-// gbit32 reads a 32-bit number in little-endian order from b and returns it with the remaining slice of b.
-func gbit32(b []byte) (uint32, []byte) {
-	return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24, b[4:]
-}
-
-// gbit64 reads a 64-bit number in little-endian order from b and returns it with the remaining slice of b.
-func gbit64(b []byte) (uint64, []byte) {
-	lo := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
-	hi := uint32(b[4]) | uint32(b[5])<<8 | uint32(b[6])<<16 | uint32(b[7])<<24
-	return uint64(lo) | uint64(hi)<<32, b[8:]
-}
-
-// gstring reads a string from b, prefixed with a 16-bit length in little-endian order.
-// It returns the string with the remaining slice of b and a boolean. If the length is
-// greater than the number of bytes in b, the boolean will be false.
-func gstring(b []byte) (string, []byte, bool) {
-	n, b := gbit16(b)
-	if int(n) > len(b) {
-		return "", b, false
-	}
-	return string(b[:n]), b[n:], true
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/env_plan9.go b/third_party/gofrontend/libgo/go/syscall/env_plan9.go
deleted file mode 100644
index cbf7f41..0000000
--- a/third_party/gofrontend/libgo/go/syscall/env_plan9.go
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Plan 9 environment variables.
-
-package syscall
-
-import (
-	"errors"
-)
-
-var (
-	errZeroLengthKey = errors.New("zero length key")
-	errShortWrite    = errors.New("i/o count too small")
-)
-
-func readenv(key string) (string, error) {
-	fd, err := open("/env/"+key, O_RDONLY)
-	if err != nil {
-		return "", err
-	}
-	defer Close(fd)
-	l, _ := Seek(fd, 0, 2)
-	Seek(fd, 0, 0)
-	buf := make([]byte, l)
-	n, err := Read(fd, buf)
-	if err != nil {
-		return "", err
-	}
-	if n > 0 && buf[n-1] == 0 {
-		buf = buf[:n-1]
-	}
-	return string(buf), nil
-}
-
-func writeenv(key, value string) error {
-	fd, err := create("/env/"+key, O_RDWR, 0666)
-	if err != nil {
-		return err
-	}
-	defer Close(fd)
-	b := []byte(value)
-	n, err := Write(fd, b)
-	if err != nil {
-		return err
-	}
-	if n != len(b) {
-		return errShortWrite
-	}
-	return nil
-}
-
-func Getenv(key string) (value string, found bool) {
-	if len(key) == 0 {
-		return "", false
-	}
-	v, err := readenv(key)
-	if err != nil {
-		return "", false
-	}
-	return v, true
-}
-
-func Setenv(key, value string) error {
-	if len(key) == 0 {
-		return errZeroLengthKey
-	}
-	err := writeenv(key, value)
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-func Clearenv() {
-	RawSyscall(SYS_RFORK, RFCENVG, 0, 0)
-}
-
-func Unsetenv(key string) error {
-	if len(key) == 0 {
-		return errZeroLengthKey
-	}
-	Remove("/env/" + key)
-	return nil
-}
-
-func Environ() []string {
-	fd, err := open("/env", O_RDONLY)
-	if err != nil {
-		return nil
-	}
-	defer Close(fd)
-	files, err := readdirnames(fd)
-	if err != nil {
-		return nil
-	}
-	ret := make([]string, 0, len(files))
-
-	for _, key := range files {
-		v, err := readenv(key)
-		if err != nil {
-			continue
-		}
-		ret = append(ret, key+"="+v)
-	}
-	return ret
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/env_unix.go b/third_party/gofrontend/libgo/go/syscall/env_unix.go
deleted file mode 100644
index b5ded9c..0000000
--- a/third_party/gofrontend/libgo/go/syscall/env_unix.go
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-// Unix environment variables.
-
-package syscall
-
-import "sync"
-
-var (
-	// envOnce guards initialization by copyenv, which populates env.
-	envOnce sync.Once
-
-	// envLock guards env and envs.
-	envLock sync.RWMutex
-
-	// env maps from an environment variable to its first occurrence in envs.
-	env map[string]int
-
-	// envs is provided by the runtime. elements are expected to
-	// be of the form "key=value". An empty string means deleted
-	// (or a duplicate to be ignored).
-	envs []string = runtime_envs()
-)
-
-func runtime_envs() []string // in package runtime
-
-// setenv_c and unsetenv_c are provided by the runtime but are no-ops
-// if cgo isn't loaded.
-func setenv_c(k, v string)
-func unsetenv_c(k string)
-
-func copyenv() {
-	env = make(map[string]int)
-	for i, s := range envs {
-		for j := 0; j < len(s); j++ {
-			if s[j] == '=' {
-				key := s[:j]
-				if _, ok := env[key]; !ok {
-					env[key] = i // first mention of key
-				} else {
-					// Clear duplicate keys. This permits Unsetenv to
-					// safely delete only the first item without
-					// worrying about unshadowing a later one,
-					// which might be a security problem.
-					envs[i] = ""
-				}
-				break
-			}
-		}
-	}
-}
-
-func Unsetenv(key string) error {
-	envOnce.Do(copyenv)
-
-	envLock.Lock()
-	defer envLock.Unlock()
-
-	if i, ok := env[key]; ok {
-		envs[i] = ""
-		delete(env, key)
-	}
-	unsetenv_c(key)
-	return nil
-}
-
-func Getenv(key string) (value string, found bool) {
-	envOnce.Do(copyenv)
-	if len(key) == 0 {
-		return "", false
-	}
-
-	envLock.RLock()
-	defer envLock.RUnlock()
-
-	i, ok := env[key]
-	if !ok {
-		return "", false
-	}
-	s := envs[i]
-	for i := 0; i < len(s); i++ {
-		if s[i] == '=' {
-			return s[i+1:], true
-		}
-	}
-	return "", false
-}
-
-func Setenv(key, value string) error {
-	envOnce.Do(copyenv)
-	if len(key) == 0 {
-		return EINVAL
-	}
-	for i := 0; i < len(key); i++ {
-		if key[i] == '=' || key[i] == 0 {
-			return EINVAL
-		}
-	}
-	for i := 0; i < len(value); i++ {
-		if value[i] == 0 {
-			return EINVAL
-		}
-	}
-
-	envLock.Lock()
-	defer envLock.Unlock()
-
-	i, ok := env[key]
-	kv := key + "=" + value
-	if ok {
-		envs[i] = kv
-	} else {
-		i = len(envs)
-		envs = append(envs, kv)
-	}
-	env[key] = i
-	setenv_c(key, value)
-	return nil
-}
-
-func Clearenv() {
-	envOnce.Do(copyenv) // prevent copyenv in Getenv/Setenv
-
-	envLock.Lock()
-	defer envLock.Unlock()
-
-	for k := range env {
-		unsetenv_c(k)
-	}
-	env = make(map[string]int)
-	envs = []string{}
-}
-
-func Environ() []string {
-	envOnce.Do(copyenv)
-	envLock.RLock()
-	defer envLock.RUnlock()
-	a := make([]string, 0, len(envs))
-	for _, env := range envs {
-		if env != "" {
-			a = append(a, env)
-		}
-	}
-	return a
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/env_windows.go b/third_party/gofrontend/libgo/go/syscall/env_windows.go
deleted file mode 100644
index 1cb4754..0000000
--- a/third_party/gofrontend/libgo/go/syscall/env_windows.go
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Windows environment variables.
-
-package syscall
-
-import (
-	"unicode/utf16"
-	"unsafe"
-)
-
-func Getenv(key string) (value string, found bool) {
-	keyp, err := UTF16PtrFromString(key)
-	if err != nil {
-		return "", false
-	}
-	n := uint32(100)
-	for {
-		b := make([]uint16, n)
-		n, err = GetEnvironmentVariable(keyp, &b[0], uint32(len(b)))
-		if n == 0 && err == ERROR_ENVVAR_NOT_FOUND {
-			return "", false
-		}
-		if n <= uint32(len(b)) {
-			return string(utf16.Decode(b[:n])), true
-		}
-	}
-}
-
-func Setenv(key, value string) error {
-	v, err := UTF16PtrFromString(value)
-	if err != nil {
-		return err
-	}
-	keyp, err := UTF16PtrFromString(key)
-	if err != nil {
-		return err
-	}
-	e := SetEnvironmentVariable(keyp, v)
-	if e != nil {
-		return e
-	}
-	return nil
-}
-
-func Unsetenv(key string) error {
-	keyp, err := UTF16PtrFromString(key)
-	if err != nil {
-		return err
-	}
-	return SetEnvironmentVariable(keyp, nil)
-}
-
-func Clearenv() {
-	for _, s := range Environ() {
-		// Environment variables can begin with =
-		// so start looking for the separator = at j=1.
-		// http://blogs.msdn.com/b/oldnewthing/archive/2010/05/06/10008132.aspx
-		for j := 1; j < len(s); j++ {
-			if s[j] == '=' {
-				Setenv(s[0:j], "")
-				break
-			}
-		}
-	}
-}
-
-func Environ() []string {
-	s, e := GetEnvironmentStrings()
-	if e != nil {
-		return nil
-	}
-	defer FreeEnvironmentStrings(s)
-	r := make([]string, 0, 50) // Empty with room to grow.
-	for from, i, p := 0, 0, (*[1 << 24]uint16)(unsafe.Pointer(s)); true; i++ {
-		if p[i] == 0 {
-			// empty string marks the end
-			if i <= from {
-				break
-			}
-			r = append(r, string(utf16.Decode(p[from:i])))
-			from = i + 1
-		}
-	}
-	return r
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/errno.c b/third_party/gofrontend/libgo/go/syscall/errno.c
deleted file mode 100644
index 5cdc773..0000000
--- a/third_party/gofrontend/libgo/go/syscall/errno.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* errno.c -- functions for getting and setting errno
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-#include <errno.h>
-#include <stdint.h>
-
-#include "runtime.h"
-
-/* errno is typically a macro. These functions set 
-   and get errno specific to the libc being used.  */
-
-uintptr_t GetErrno() __asm__ (GOSYM_PREFIX "syscall.GetErrno");
-void SetErrno(uintptr_t) __asm__ (GOSYM_PREFIX "syscall.SetErrno");
-
-uintptr_t
-GetErrno()
-{
-  return (uintptr_t) errno;
-}
-
-void
-SetErrno(uintptr_t value)
-{
-  errno = (int) value;
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/errors_plan9.go b/third_party/gofrontend/libgo/go/syscall/errors_plan9.go
deleted file mode 100644
index ede3d6a..0000000
--- a/third_party/gofrontend/libgo/go/syscall/errors_plan9.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-// Constants
-const (
-	// Invented values to support what package os expects.
-	O_CREAT    = 0x02000
-	O_APPEND   = 0x00400
-	O_NOCTTY   = 0x00000
-	O_NONBLOCK = 0x00000
-	O_SYNC     = 0x00000
-	O_ASYNC    = 0x00000
-
-	S_IFMT   = 0x1f000
-	S_IFIFO  = 0x1000
-	S_IFCHR  = 0x2000
-	S_IFDIR  = 0x4000
-	S_IFBLK  = 0x6000
-	S_IFREG  = 0x8000
-	S_IFLNK  = 0xa000
-	S_IFSOCK = 0xc000
-)
-
-// Errors
-var (
-	EINVAL       = NewError("bad arg in system call")
-	ENOTDIR      = NewError("not a directory")
-	EISDIR       = NewError("file is a directory")
-	ENOENT       = NewError("file does not exist")
-	EEXIST       = NewError("file already exists")
-	EMFILE       = NewError("no free file descriptors")
-	EIO          = NewError("i/o error")
-	ENAMETOOLONG = NewError("file name too long")
-	EINTR        = NewError("interrupted")
-	EPERM        = NewError("permission denied")
-	EBUSY        = NewError("no free devices")
-	ETIMEDOUT    = NewError("connection timed out")
-	EPLAN9       = NewError("not supported by plan 9")
-
-	// The following errors do not correspond to any
-	// Plan 9 system messages. Invented to support
-	// what package os and others expect.
-	EACCES       = NewError("access permission denied")
-	EAFNOSUPPORT = NewError("address family not supported by protocol")
-)
diff --git a/third_party/gofrontend/libgo/go/syscall/errstr.go b/third_party/gofrontend/libgo/go/syscall/errstr.go
deleted file mode 100644
index aa656ca..0000000
--- a/third_party/gofrontend/libgo/go/syscall/errstr.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// errstr.go -- Error strings.
-
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-//sysnb	strerror_r(errnum int, buf []byte) (err Errno)
-//strerror_r(errnum _C_int, buf *byte, buflen Size_t) _C_int
-
-func Errstr(errnum int) string {
-	for len := 128; ; len *= 2 {
-		b := make([]byte, len)
-		errno := strerror_r(errnum, b)
-		if errno == 0 {
-			i := 0
-			for b[i] != 0 {
-				i++
-			}
-			// Lowercase first letter: Bad -> bad, but
-			// STREAM -> STREAM.
-			if i > 1 && 'A' <= b[0] && b[0] <= 'Z' && 'a' <= b[1] && b[1] <= 'z' {
-				b[0] += 'a' - 'A'
-			}
-			return string(b[:i])
-		}
-		if errno != ERANGE {
-			return "errstr failure"
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/errstr_linux.go b/third_party/gofrontend/libgo/go/syscall/errstr_linux.go
deleted file mode 100644
index d10476d..0000000
--- a/third_party/gofrontend/libgo/go/syscall/errstr_linux.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// errstr_rtems.go -- RTEMS specific error strings.
-
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-import "unsafe"
-
-//sysnb	strerror_r(errnum int, b []byte) (errstr *byte)
-//strerror_r(errnum _C_int, b *byte, len Size_t) *byte
-
-func Errstr(errnum int) string {
-	a := make([]byte, 128)
-	p := strerror_r(errnum, a)
-	b := (*[1000]byte)(unsafe.Pointer(p))
-	i := 0
-	for b[i] != 0 {
-		i++
-	}
-	// Lowercase first letter: Bad -> bad, but STREAM -> STREAM.
-	if i > 1 && 'A' <= b[0] && b[0] <= 'Z' && 'a' <= b[1] && b[1] <= 'z' {
-		c := b[0] + 'a' - 'A'
-		return string(c) + string(b[1:i])
-	}
-	return string(b[:i])
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/errstr_nor.go b/third_party/gofrontend/libgo/go/syscall/errstr_nor.go
deleted file mode 100644
index 796561a..0000000
--- a/third_party/gofrontend/libgo/go/syscall/errstr_nor.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// errstr.go -- Error strings when there is no strerror_r.
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-import (
-	"sync"
-	"unsafe"
-)
-
-//sysnb	strerror(errnum int) (buf *byte)
-//strerror(errnum _C_int) *byte
-
-var errstr_lock sync.Mutex
-
-func Errstr(errno int) string {
-	errstr_lock.Lock()
-
-	bp := strerror(errno)
-	b := (*[1000]byte)(unsafe.Pointer(bp))
-	i := 0
-	for b[i] != 0 {
-		i++
-	}
-
-	// Lowercase first letter: Bad -> bad, but STREAM -> STREAM.
-	var s string
-	if i > 1 && 'A' <= b[0] && b[0] <= 'Z' && 'a' <= b[1] && b[1] <= 'z' {
-		c := b[0] + 'a' - 'A'
-		s = string(c) + string(b[1:i])
-	} else {
-		s = string(b[:i])
-	}
-
-	errstr_lock.Unlock()
-
-	return s
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/exec_bsd.go b/third_party/gofrontend/libgo/go/syscall/exec_bsd.go
deleted file mode 100644
index 9042ce2..0000000
--- a/third_party/gofrontend/libgo/go/syscall/exec_bsd.go
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package syscall
-
-import (
-	"unsafe"
-)
-
-type SysProcAttr struct {
-	Chroot     string      // Chroot.
-	Credential *Credential // Credential.
-	Ptrace     bool        // Enable tracing.
-	Setsid     bool        // Create session.
-	Setpgid    bool        // Set process group ID to Pgid, or, if Pgid == 0, to new pid.
-	Setctty    bool        // Set controlling terminal to fd Ctty
-	Noctty     bool        // Detach fd 0 from controlling terminal
-	Ctty       int         // Controlling TTY fd
-	Foreground bool        // Place child's process group in foreground. (Implies Setpgid. Uses Ctty as fd of controlling TTY)
-	Pgid       int         // Child's process group ID if Setpgid.
-}
-
-// Implemented in runtime package.
-func runtime_BeforeFork()
-func runtime_AfterFork()
-
-// Fork, dup fd onto 0..len(fd), and exec(argv0, argvv, envv) in child.
-// If a dup or exec fails, write the errno error to pipe.
-// (Pipe is close-on-exec so if exec succeeds, it will be closed.)
-// In the child, this function must not acquire any locks, because
-// they might have been locked at the time of the fork.  This means
-// no rescheduling, no malloc calls, and no new stack segments.
-// For the same reason compiler does not race instrument it.
-// The calls to RawSyscall are okay because they are assembly
-// functions that do not grow the stack.
-func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr *ProcAttr, sys *SysProcAttr, pipe int) (pid int, err Errno) {
-	// Declare all variables at top in case any
-	// declarations require heap allocation (e.g., err1).
-	var (
-		r1     Pid_t
-		err1   Errno
-		nextfd int
-		i      int
-	)
-
-	// guard against side effects of shuffling fds below.
-	// Make sure that nextfd is beyond any currently open files so
-	// that we can't run the risk of overwriting any of them.
-	fd := make([]int, len(attr.Files))
-	nextfd = len(attr.Files)
-	for i, ufd := range attr.Files {
-		if nextfd < int(ufd) {
-			nextfd = int(ufd)
-		}
-		fd[i] = int(ufd)
-	}
-	nextfd++
-
-	// About to call fork.
-	// No more allocation or calls of non-assembly functions.
-	runtime_BeforeFork()
-	r1, err1 = raw_fork()
-	if err1 != 0 {
-		runtime_AfterFork()
-		return 0, err1
-	}
-
-	if r1 != 0 {
-		// parent; return PID
-		runtime_AfterFork()
-		return int(r1), 0
-	}
-
-	// Fork succeeded, now in child.
-
-	// Enable tracing if requested.
-	if sys.Ptrace {
-		err1 = raw_ptrace(_PTRACE_TRACEME, 0, nil, nil)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// Session ID
-	if sys.Setsid {
-		err1 = raw_setsid()
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// Set process group
-	if sys.Setpgid || sys.Foreground {
-		// Place child in process group.
-		err1 = raw_setpgid(0, sys.Pgid)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	if sys.Foreground {
-		pgrp := Pid_t(sys.Pgid)
-		if pgrp == 0 {
-			pgrp = raw_getpid()
-		}
-
-		// Place process group in foreground.
-		_, err1 = raw_ioctl_ptr(sys.Ctty, TIOCSPGRP, unsafe.Pointer(&pgrp))
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// Chroot
-	if chroot != nil {
-		err1 = raw_chroot(chroot)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// User and groups
-	if cred := sys.Credential; cred != nil {
-		ngroups := len(cred.Groups)
-		if ngroups == 0 {
-			err2 := setgroups(0, nil)
-			if err2 == nil {
-				err1 = 0
-			} else {
-				err1 = err2.(Errno)
-			}
-		} else {
-			groups := make([]Gid_t, ngroups)
-			for i, v := range cred.Groups {
-				groups[i] = Gid_t(v)
-			}
-			err2 := setgroups(ngroups, &groups[0])
-			if err2 == nil {
-				err1 = 0
-			} else {
-				err1 = err2.(Errno)
-			}
-		}
-		if err1 != 0 {
-			goto childerror
-		}
-		err2 := Setgid(int(cred.Gid))
-		if err2 != nil {
-			err1 = err2.(Errno)
-			goto childerror
-		}
-		err2 = Setuid(int(cred.Uid))
-		if err2 != nil {
-			err1 = err2.(Errno)
-			goto childerror
-		}
-	}
-
-	// Chdir
-	if dir != nil {
-		err1 = raw_chdir(dir)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// Pass 1: look for fd[i] < i and move those up above len(fd)
-	// so that pass 2 won't stomp on an fd it needs later.
-	if pipe < nextfd {
-		err1 = raw_dup2(pipe, nextfd)
-		if err1 != 0 {
-			goto childerror
-		}
-		raw_fcntl(nextfd, F_SETFD, FD_CLOEXEC)
-		pipe = nextfd
-		nextfd++
-	}
-	for i = 0; i < len(fd); i++ {
-		if fd[i] >= 0 && fd[i] < int(i) {
-			err1 = raw_dup2(fd[i], nextfd)
-			if err1 != 0 {
-				goto childerror
-			}
-			raw_fcntl(nextfd, F_SETFD, FD_CLOEXEC)
-			fd[i] = nextfd
-			nextfd++
-			if nextfd == pipe { // don't stomp on pipe
-				nextfd++
-			}
-		}
-	}
-
-	// Pass 2: dup fd[i] down onto i.
-	for i = 0; i < len(fd); i++ {
-		if fd[i] == -1 {
-			raw_close(i)
-			continue
-		}
-		if fd[i] == int(i) {
-			// dup2(i, i) won't clear close-on-exec flag on Linux,
-			// probably not elsewhere either.
-			_, err1 = raw_fcntl(fd[i], F_SETFD, 0)
-			if err1 != 0 {
-				goto childerror
-			}
-			continue
-		}
-		// The new fd is created NOT close-on-exec,
-		// which is exactly what we want.
-		err1 = raw_dup2(fd[i], i)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// By convention, we don't close-on-exec the fds we are
-	// started with, so if len(fd) < 3, close 0, 1, 2 as needed.
-	// Programs that know they inherit fds >= 3 will need
-	// to set them close-on-exec.
-	for i = len(fd); i < 3; i++ {
-		raw_close(i)
-	}
-
-	// Detach fd 0 from tty
-	if sys.Noctty {
-		_, err1 = raw_ioctl(0, TIOCNOTTY, 0)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// Set the controlling TTY to Ctty
-	if sys.Setctty {
-		_, err1 = raw_ioctl(sys.Ctty, TIOCSCTTY, 0)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// Time to exec.
-	err1 = raw_execve(argv0, &argv[0], &envv[0])
-
-childerror:
-	// send error code on pipe
-	raw_write(pipe, (*byte)(unsafe.Pointer(&err1)), int(unsafe.Sizeof(err1)))
-	for {
-		raw_exit(253)
-	}
-}
-
-// Try to open a pipe with O_CLOEXEC set on both file descriptors.
-func forkExecPipe(p []int) error {
-	err := Pipe(p)
-	if err != nil {
-		return err
-	}
-	_, err = fcntl(p[0], F_SETFD, FD_CLOEXEC)
-	if err != nil {
-		return err
-	}
-	_, err = fcntl(p[1], F_SETFD, FD_CLOEXEC)
-	return err
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/exec_linux.go b/third_party/gofrontend/libgo/go/syscall/exec_linux.go
deleted file mode 100644
index 540efb3..0000000
--- a/third_party/gofrontend/libgo/go/syscall/exec_linux.go
+++ /dev/null
@@ -1,421 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build linux
-
-package syscall
-
-import (
-	"runtime"
-	"unsafe"
-)
-
-//sysnb	raw_prctl(option int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err Errno)
-//prctl(option _C_int, arg2 _C_long, arg3 _C_long, arg4 _C_long, arg5 _C_long) _C_int
-
-// SysProcIDMap holds Container ID to Host ID mappings used for User Namespaces in Linux.
-// See user_namespaces(7).
-type SysProcIDMap struct {
-	ContainerID int // Container ID.
-	HostID      int // Host ID.
-	Size        int // Size.
-}
-
-type SysProcAttr struct {
-	Chroot      string         // Chroot.
-	Credential  *Credential    // Credential.
-	Ptrace      bool           // Enable tracing.
-	Setsid      bool           // Create session.
-	Setpgid     bool           // Set process group ID to Pgid, or, if Pgid == 0, to new pid.
-	Setctty     bool           // Set controlling terminal to fd Ctty (only meaningful if Setsid is set)
-	Noctty      bool           // Detach fd 0 from controlling terminal
-	Ctty        int            // Controlling TTY fd
-	Foreground  bool           // Place child's process group in foreground. (Implies Setpgid. Uses Ctty as fd of controlling TTY)
-	Pgid        int            // Child's process group ID if Setpgid.
-	Pdeathsig   Signal         // Signal that the process will get when its parent dies (Linux only)
-	Cloneflags  uintptr        // Flags for clone calls (Linux only)
-	UidMappings []SysProcIDMap // User ID mappings for user namespaces.
-	GidMappings []SysProcIDMap // Group ID mappings for user namespaces.
-	// GidMappingsEnableSetgroups enabling setgroups syscall.
-	// If false, then setgroups syscall will be disabled for the child process.
-	// This parameter is no-op if GidMappings == nil. Otherwise for unprivileged
-	// users this should be set to false for mappings work.
-	GidMappingsEnableSetgroups bool
-}
-
-// Implemented in runtime package.
-func runtime_BeforeFork()
-func runtime_AfterFork()
-
-// Fork, dup fd onto 0..len(fd), and exec(argv0, argvv, envv) in child.
-// If a dup or exec fails, write the errno error to pipe.
-// (Pipe is close-on-exec so if exec succeeds, it will be closed.)
-// In the child, this function must not acquire any locks, because
-// they might have been locked at the time of the fork.  This means
-// no rescheduling, no malloc calls, and no new stack segments.
-// For the same reason compiler does not race instrument it.
-// The calls to RawSyscall are okay because they are assembly
-// functions that do not grow the stack.
-func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr *ProcAttr, sys *SysProcAttr, pipe int) (pid int, err Errno) {
-	// Declare all variables at top in case any
-	// declarations require heap allocation (e.g., err1).
-	var (
-		r1     uintptr
-		err1   Errno
-		err2   Errno
-		nextfd int
-		i      int
-		p      [2]int
-	)
-
-	// Record parent PID so child can test if it has died.
-	ppid := raw_getpid()
-
-	// Guard against side effects of shuffling fds below.
-	// Make sure that nextfd is beyond any currently open files so
-	// that we can't run the risk of overwriting any of them.
-	fd := make([]int, len(attr.Files))
-	nextfd = len(attr.Files)
-	for i, ufd := range attr.Files {
-		if nextfd < int(ufd) {
-			nextfd = int(ufd)
-		}
-		fd[i] = int(ufd)
-	}
-	nextfd++
-
-	// Allocate another pipe for parent to child communication for
-	// synchronizing writing of User ID/Group ID mappings.
-	if sys.UidMappings != nil || sys.GidMappings != nil {
-		if err := forkExecPipe(p[:]); err != nil {
-			return 0, err.(Errno)
-		}
-	}
-
-	// About to call fork.
-	// No more allocation or calls of non-assembly functions.
-	runtime_BeforeFork()
-	if runtime.GOARCH == "s390x" || runtime.GOARCH == "s390" {
-		r1, _, err1 = RawSyscall6(SYS_CLONE, 0, uintptr(SIGCHLD)|sys.Cloneflags, 0, 0, 0, 0)
-	} else {
-		r1, _, err1 = RawSyscall6(SYS_CLONE, uintptr(SIGCHLD)|sys.Cloneflags, 0, 0, 0, 0, 0)
-	}
-	if err1 != 0 {
-		runtime_AfterFork()
-		return 0, err1
-	}
-
-	if r1 != 0 {
-		// parent; return PID
-		runtime_AfterFork()
-		pid = int(r1)
-
-		if sys.UidMappings != nil || sys.GidMappings != nil {
-			Close(p[0])
-			err := writeUidGidMappings(pid, sys)
-			if err != nil {
-				err2 = err.(Errno)
-			}
-			RawSyscall(SYS_WRITE, uintptr(p[1]), uintptr(unsafe.Pointer(&err2)), unsafe.Sizeof(err2))
-			Close(p[1])
-		}
-
-		return pid, 0
-	}
-
-	// Fork succeeded, now in child.
-
-	// Wait for User ID/Group ID mappings to be written.
-	if sys.UidMappings != nil || sys.GidMappings != nil {
-		if _, _, err1 = RawSyscall(SYS_CLOSE, uintptr(p[1]), 0, 0); err1 != 0 {
-			goto childerror
-		}
-		r1, _, err1 = RawSyscall(SYS_READ, uintptr(p[0]), uintptr(unsafe.Pointer(&err2)), unsafe.Sizeof(err2))
-		if err1 != 0 {
-			goto childerror
-		}
-		if r1 != unsafe.Sizeof(err2) {
-			err1 = EINVAL
-			goto childerror
-		}
-		if err2 != 0 {
-			err1 = err2
-			goto childerror
-		}
-	}
-
-	// Enable tracing if requested.
-	if sys.Ptrace {
-		err1 = raw_ptrace(_PTRACE_TRACEME, 0, nil, nil)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// Session ID
-	if sys.Setsid {
-		err1 = raw_setsid()
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// Set process group
-	if sys.Setpgid || sys.Foreground {
-		// Place child in process group.
-		err1 = raw_setpgid(0, sys.Pgid)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	if sys.Foreground {
-		pgrp := Pid_t(sys.Pgid)
-		if pgrp == 0 {
-			pgrp = raw_getpid()
-		}
-
-		// Place process group in foreground.
-		_, err1 = raw_ioctl_ptr(sys.Ctty, TIOCSPGRP, unsafe.Pointer(&pgrp))
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// Chroot
-	if chroot != nil {
-		err1 = raw_chroot(chroot)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// User and groups
-	if cred := sys.Credential; cred != nil {
-		ngroups := len(cred.Groups)
-		if ngroups > 0 {
-			groups := unsafe.Pointer(&cred.Groups[0])
-			err1 = raw_setgroups(ngroups, groups)
-			if err1 != 0 {
-				goto childerror
-			}
-		}
-		err1 = raw_setgid(int(cred.Gid))
-		if err1 != 0 {
-			goto childerror
-		}
-		err1 = raw_setuid(int(cred.Uid))
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// Chdir
-	if dir != nil {
-		err1 = raw_chdir(dir)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// Parent death signal
-	if sys.Pdeathsig != 0 {
-		_, err1 = raw_prctl(PR_SET_PDEATHSIG, int(sys.Pdeathsig), 0, 0, 0)
-		if err1 != 0 {
-			goto childerror
-		}
-
-		// Signal self if parent is already dead. This might cause a
-		// duplicate signal in rare cases, but it won't matter when
-		// using SIGKILL.
-		r1 := raw_getppid()
-		if r1 != ppid {
-			pid := raw_getpid()
-			err1 = raw_kill(pid, sys.Pdeathsig)
-			if err1 != 0 {
-				goto childerror
-			}
-		}
-	}
-
-	// Pass 1: look for fd[i] < i and move those up above len(fd)
-	// so that pass 2 won't stomp on an fd it needs later.
-	if pipe < nextfd {
-		err1 = raw_dup2(pipe, nextfd)
-		if err1 != 0 {
-			goto childerror
-		}
-		raw_fcntl(nextfd, F_SETFD, FD_CLOEXEC)
-		pipe = nextfd
-		nextfd++
-	}
-	for i = 0; i < len(fd); i++ {
-		if fd[i] >= 0 && fd[i] < int(i) {
-			err1 = raw_dup2(fd[i], nextfd)
-			if err1 != 0 {
-				goto childerror
-			}
-			raw_fcntl(nextfd, F_SETFD, FD_CLOEXEC)
-			fd[i] = nextfd
-			nextfd++
-			if nextfd == pipe { // don't stomp on pipe
-				nextfd++
-			}
-		}
-	}
-
-	// Pass 2: dup fd[i] down onto i.
-	for i = 0; i < len(fd); i++ {
-		if fd[i] == -1 {
-			raw_close(i)
-			continue
-		}
-		if fd[i] == int(i) {
-			// dup2(i, i) won't clear close-on-exec flag on Linux,
-			// probably not elsewhere either.
-			_, err1 = raw_fcntl(fd[i], F_SETFD, 0)
-			if err1 != 0 {
-				goto childerror
-			}
-			continue
-		}
-		// The new fd is created NOT close-on-exec,
-		// which is exactly what we want.
-		err1 = raw_dup2(fd[i], i)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// By convention, we don't close-on-exec the fds we are
-	// started with, so if len(fd) < 3, close 0, 1, 2 as needed.
-	// Programs that know they inherit fds >= 3 will need
-	// to set them close-on-exec.
-	for i = len(fd); i < 3; i++ {
-		raw_close(i)
-	}
-
-	// Detach fd 0 from tty
-	if sys.Noctty {
-		_, err1 = raw_ioctl(0, TIOCNOTTY, 0)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// Set the controlling TTY to Ctty
-	if sys.Setctty {
-		_, err1 = raw_ioctl(sys.Ctty, TIOCSCTTY, 0)
-		if err1 != 0 {
-			goto childerror
-		}
-	}
-
-	// Time to exec.
-	err1 = raw_execve(argv0, &argv[0], &envv[0])
-
-childerror:
-	// send error code on pipe
-	raw_write(pipe, (*byte)(unsafe.Pointer(&err1)), int(unsafe.Sizeof(err1)))
-	for {
-		raw_exit(253)
-	}
-}
-
-// Try to open a pipe with O_CLOEXEC set on both file descriptors.
-func forkExecPipe(p []int) (err error) {
-	err = Pipe2(p, O_CLOEXEC)
-	// pipe2 was added in 2.6.27 and our minimum requirement is 2.6.23, so it
-	// might not be implemented.
-	if err == ENOSYS {
-		if err = Pipe(p); err != nil {
-			return
-		}
-		if _, err = fcntl(p[0], F_SETFD, FD_CLOEXEC); err != nil {
-			return
-		}
-		_, err = fcntl(p[1], F_SETFD, FD_CLOEXEC)
-	}
-	return
-}
-
-// writeIDMappings writes the user namespace User ID or Group ID mappings to the specified path.
-func writeIDMappings(path string, idMap []SysProcIDMap) error {
-	fd, err := Open(path, O_RDWR, 0)
-	if err != nil {
-		return err
-	}
-
-	data := ""
-	for _, im := range idMap {
-		data = data + itoa(im.ContainerID) + " " + itoa(im.HostID) + " " + itoa(im.Size) + "\n"
-	}
-
-	bytes, err := ByteSliceFromString(data)
-	if err != nil {
-		Close(fd)
-		return err
-	}
-
-	if _, err := Write(fd, bytes); err != nil {
-		Close(fd)
-		return err
-	}
-
-	if err := Close(fd); err != nil {
-		return err
-	}
-
-	return nil
-}
-
-// writeSetgroups writes to /proc/PID/setgroups "deny" if enable is false
-// and "allow" if enable is true.
-// This is needed since kernel 3.19, because you can't write gid_map without
-// disabling setgroups() system call.
-func writeSetgroups(pid int, enable bool) error {
-	sgf := "/proc/" + itoa(pid) + "/setgroups"
-	fd, err := Open(sgf, O_RDWR, 0)
-	if err != nil {
-		return err
-	}
-
-	var data []byte
-	if enable {
-		data = []byte("allow")
-	} else {
-		data = []byte("deny")
-	}
-
-	if _, err := Write(fd, data); err != nil {
-		Close(fd)
-		return err
-	}
-
-	return Close(fd)
-}
-
-// writeUidGidMappings writes User ID and Group ID mappings for user namespaces
-// for a process and it is called from the parent process.
-func writeUidGidMappings(pid int, sys *SysProcAttr) error {
-	if sys.UidMappings != nil {
-		uidf := "/proc/" + itoa(pid) + "/uid_map"
-		if err := writeIDMappings(uidf, sys.UidMappings); err != nil {
-			return err
-		}
-	}
-
-	if sys.GidMappings != nil {
-		// If the kernel is too old to support /proc/PID/setgroups, writeSetGroups will return ENOENT; this is OK.
-		if err := writeSetgroups(pid, sys.GidMappingsEnableSetgroups); err != nil && err != ENOENT {
-			return err
-		}
-		gidf := "/proc/" + itoa(pid) + "/gid_map"
-		if err := writeIDMappings(gidf, sys.GidMappings); err != nil {
-			return err
-		}
-	}
-
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/exec_linux_test.go b/third_party/gofrontend/libgo/go/syscall/exec_linux_test.go
deleted file mode 100644
index 60d2734..0000000
--- a/third_party/gofrontend/libgo/go/syscall/exec_linux_test.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build linux
-
-package syscall_test
-
-import (
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"regexp"
-	"strconv"
-	"strings"
-	"syscall"
-	"testing"
-)
-
-func whoamiCmd(t *testing.T, uid, gid int, setgroups bool) *exec.Cmd {
-	if _, err := os.Stat("/proc/self/ns/user"); err != nil {
-		if os.IsNotExist(err) {
-			t.Skip("kernel doesn't support user namespaces")
-		}
-		t.Fatalf("Failed to stat /proc/self/ns/user: %v", err)
-	}
-	cmd := exec.Command("whoami")
-	cmd.SysProcAttr = &syscall.SysProcAttr{
-		Cloneflags: syscall.CLONE_NEWUSER,
-		UidMappings: []syscall.SysProcIDMap{
-			{ContainerID: 0, HostID: uid, Size: 1},
-		},
-		GidMappings: []syscall.SysProcIDMap{
-			{ContainerID: 0, HostID: gid, Size: 1},
-		},
-		GidMappingsEnableSetgroups: setgroups,
-	}
-	return cmd
-}
-
-func testNEWUSERRemap(t *testing.T, uid, gid int, setgroups bool) {
-	cmd := whoamiCmd(t, uid, gid, setgroups)
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		// On some systems, there is a sysctl setting.
-		if os.IsPermission(err) && os.Getuid() != 0 {
-			data, errRead := ioutil.ReadFile("/proc/sys/kernel/unprivileged_userns_clone")
-			if errRead == nil && data[0] == '0' {
-				t.Skip("kernel prohibits user namespace in unprivileged process")
-			}
-		}
-
-		t.Fatalf("Cmd failed with err %v, output: %s", err, out)
-	}
-	sout := strings.TrimSpace(string(out))
-	want := "root"
-	if sout != want {
-		t.Fatalf("whoami = %q; want %q", out, want)
-	}
-}
-
-func TestCloneNEWUSERAndRemapRootDisableSetgroups(t *testing.T) {
-	if os.Getuid() != 0 {
-		t.Skip("skipping root only test")
-	}
-	testNEWUSERRemap(t, 0, 0, false)
-}
-
-func TestCloneNEWUSERAndRemapRootEnableSetgroups(t *testing.T) {
-	if os.Getuid() != 0 {
-		t.Skip("skipping root only test")
-	}
-	testNEWUSERRemap(t, 0, 0, false)
-}
-
-// kernelVersion returns the major and minor versions of the Linux
-// kernel version.  It calls t.Skip if it can't figure it out.
-func kernelVersion(t *testing.T) (int, int) {
-	bytes, err := ioutil.ReadFile("/proc/version")
-	if err != nil {
-		t.Skipf("can't get kernel version: %v", err)
-	}
-	matches := regexp.MustCompile("([0-9]+).([0-9]+)").FindSubmatch(bytes)
-	if len(matches) < 3 {
-		t.Skipf("can't get kernel version from %s", bytes)
-	}
-	major, _ := strconv.Atoi(string(matches[1]))
-	minor, _ := strconv.Atoi(string(matches[2]))
-	return major, minor
-}
-
-func TestCloneNEWUSERAndRemapNoRootDisableSetgroups(t *testing.T) {
-	if os.Getuid() == 0 {
-		t.Skip("skipping unprivileged user only test")
-	}
-	testNEWUSERRemap(t, os.Getuid(), os.Getgid(), false)
-}
-
-func TestCloneNEWUSERAndRemapNoRootSetgroupsEnableSetgroups(t *testing.T) {
-	if os.Getuid() == 0 {
-		t.Skip("skipping unprivileged user only test")
-	}
-	cmd := whoamiCmd(t, os.Getuid(), os.Getgid(), true)
-	err := cmd.Run()
-	if err == nil {
-		t.Skip("probably old kernel without security fix")
-	}
-	if !os.IsPermission(err) {
-		t.Fatalf("Unprivileged gid_map rewriting with GidMappingsEnableSetgroups must fail")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/exec_solaris_test.go b/third_party/gofrontend/libgo/go/syscall/exec_solaris_test.go
deleted file mode 100644
index 6b8f1ad..0000000
--- a/third_party/gofrontend/libgo/go/syscall/exec_solaris_test.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build solaris
-
-package syscall
-
-import "unsafe"
-
-//go:cgo_import_dynamic libc_Getpgid getpgid "libc.so"
-//go:cgo_import_dynamic libc_Getpgrp getpgrp "libc.so"
-
-//go:linkname libc_Getpgid libc_Getpgid
-//go:linkname libc_Getpgrp libc_Getpgrp
-
-var (
-	libc_Getpgid,
-	libc_Getpgrp libcFunc
-)
-
-func Getpgid(pid int) (pgid int, err error) {
-	r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&libc_Getpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0)
-	pgid = int(r0)
-	if e1 != 0 {
-		err = e1
-	}
-	return
-}
-
-func Getpgrp() (pgrp int) {
-	r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&libc_Getpgrp)), 0, 0, 0, 0, 0, 0, 0)
-	pgrp = int(r0)
-	return
-}
-
-var Ioctl = ioctl
diff --git a/third_party/gofrontend/libgo/go/syscall/exec_stubs.go b/third_party/gofrontend/libgo/go/syscall/exec_stubs.go
deleted file mode 100644
index 35bb174..0000000
--- a/third_party/gofrontend/libgo/go/syscall/exec_stubs.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Stubs for fork, exec and wait.
-
-package syscall
-
-func ForkExec(argv0 string, argv []string, envv []string, dir string, fd []int) (pid int, err int) {
-	return -1, ENOSYS
-}
-
-func Exec(argv0 string, argv []string, envv []string) (err int) {
-	return ENOSYS
-}
-
-func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
-	return -1, ENOSYS
-}
-
-func (w WaitStatus) Exited() bool    { return false }
-func (w WaitStatus) Signaled() bool  { return false }
-func (w WaitStatus) Stopped() bool   { return false }
-func (w WaitStatus) Continued() bool { return false }
-func (w WaitStatus) CoreDump() bool  { return false }
-func (w WaitStatus) ExitStatus() int { return 0 }
-func (w WaitStatus) Signal() int     { return 0 }
-func (w WaitStatus) StopSignal() int { return 0 }
-func (w WaitStatus) TrapCause() int  { return 0 }
-
-func raw_ptrace(request int, pid int, addr *byte, data *byte) Errno {
-	return ENOSYS
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/exec_unix.go b/third_party/gofrontend/libgo/go/syscall/exec_unix.go
deleted file mode 100644
index d1927de..0000000
--- a/third_party/gofrontend/libgo/go/syscall/exec_unix.go
+++ /dev/null
@@ -1,317 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-// Fork, exec, wait, etc.
-
-package syscall
-
-import (
-	"runtime"
-	"sync"
-	"unsafe"
-)
-
-//sysnb	raw_fork() (pid Pid_t, err Errno)
-//fork() Pid_t
-
-//sysnb	raw_getpid() (pid Pid_t)
-//getpid() Pid_t
-
-//sysnb	raw_getppid() (pid Pid_t)
-//getppid() Pid_t
-
-//sysnb raw_setsid() (err Errno)
-//setsid() Pid_t
-
-//sysnb raw_setpgid(pid int, pgid int) (err Errno)
-//setpgid(pid Pid_t, pgid Pid_t) _C_int
-
-//sysnb	raw_chroot(path *byte) (err Errno)
-//chroot(path *byte) _C_int
-
-//sysnb	raw_chdir(path *byte) (err Errno)
-//chdir(path *byte) _C_int
-
-//sysnb	raw_fcntl(fd int, cmd int, arg int) (val int, err Errno)
-//__go_fcntl(fd _C_int, cmd _C_int, arg _C_int) _C_int
-
-//sysnb	raw_close(fd int) (err Errno)
-//close(fd _C_int) _C_int
-
-//sysnb	raw_ioctl(fd int, cmd uintptr, val int) (rval int, err Errno)
-//__go_ioctl(fd _C_int, cmd _C_int, val _C_int) _C_int
-
-//sysnb raw_ioctl_ptr(fd int, cmd uintptr, val unsafe.Pointer) (rval int, err Errno)
-//__go_ioctl_ptr(fd _C_int, cmd _C_int, val unsafe.Pointer) _C_int
-
-//sysnb	raw_execve(argv0 *byte, argv **byte, envv **byte) (err Errno)
-//execve(argv0 *byte, argv **byte, envv **byte) _C_int
-
-//sysnb	raw_write(fd int, buf *byte, count int) (err Errno)
-//write(fd _C_int, buf *byte, count Size_t) Ssize_t
-
-//sysnb	raw_exit(status int)
-//_exit(status _C_int)
-
-//sysnb raw_dup2(oldfd int, newfd int) (err Errno)
-//dup2(oldfd _C_int, newfd _C_int) _C_int
-
-//sysnb raw_kill(pid Pid_t, sig Signal) (err Errno)
-//kill(pid Pid_t, sig _C_int) _C_int
-
-//sysnb raw_setgroups(size int, list unsafe.Pointer) (err Errno)
-//setgroups(size Size_t, list *Gid_t) _C_int
-
-//sysnb raw_setuid(uid int) (err Errno)
-//setuid(uid Uid_t) _C_int
-
-//sysnb raw_setgid(gid int) (err Errno)
-//setgid(gid Gid_t) _C_int
-
-// Lock synchronizing creation of new file descriptors with fork.
-//
-// We want the child in a fork/exec sequence to inherit only the
-// file descriptors we intend.  To do that, we mark all file
-// descriptors close-on-exec and then, in the child, explicitly
-// unmark the ones we want the exec'ed program to keep.
-// Unix doesn't make this easy: there is, in general, no way to
-// allocate a new file descriptor close-on-exec.  Instead you
-// have to allocate the descriptor and then mark it close-on-exec.
-// If a fork happens between those two events, the child's exec
-// will inherit an unwanted file descriptor.
-//
-// This lock solves that race: the create new fd/mark close-on-exec
-// operation is done holding ForkLock for reading, and the fork itself
-// is done holding ForkLock for writing.  At least, that's the idea.
-// There are some complications.
-//
-// Some system calls that create new file descriptors can block
-// for arbitrarily long times: open on a hung NFS server or named
-// pipe, accept on a socket, and so on.  We can't reasonably grab
-// the lock across those operations.
-//
-// It is worse to inherit some file descriptors than others.
-// If a non-malicious child accidentally inherits an open ordinary file,
-// that's not a big deal.  On the other hand, if a long-lived child
-// accidentally inherits the write end of a pipe, then the reader
-// of that pipe will not see EOF until that child exits, potentially
-// causing the parent program to hang.  This is a common problem
-// in threaded C programs that use popen.
-//
-// Luckily, the file descriptors that are most important not to
-// inherit are not the ones that can take an arbitrarily long time
-// to create: pipe returns instantly, and the net package uses
-// non-blocking I/O to accept on a listening socket.
-// The rules for which file descriptor-creating operations use the
-// ForkLock are as follows:
-//
-// 1) Pipe.    Does not block.  Use the ForkLock.
-// 2) Socket.  Does not block.  Use the ForkLock.
-// 3) Accept.  If using non-blocking mode, use the ForkLock.
-//             Otherwise, live with the race.
-// 4) Open.    Can block.  Use O_CLOEXEC if available (GNU/Linux).
-//             Otherwise, live with the race.
-// 5) Dup.     Does not block.  Use the ForkLock.
-//             On GNU/Linux, could use fcntl F_DUPFD_CLOEXEC
-//             instead of the ForkLock, but only for dup(fd, -1).
-
-var ForkLock sync.RWMutex
-
-// StringSlicePtr converts a slice of strings to a slice of pointers
-// to NUL-terminated byte arrays. If any string contains a NUL byte
-// this function panics instead of returning an error.
-//
-// Deprecated: Use SlicePtrFromStrings instead.
-func StringSlicePtr(ss []string) []*byte {
-	bb := make([]*byte, len(ss)+1)
-	for i := 0; i < len(ss); i++ {
-		bb[i] = StringBytePtr(ss[i])
-	}
-	bb[len(ss)] = nil
-	return bb
-}
-
-// SlicePtrFromStrings converts a slice of strings to a slice of
-// pointers to NUL-terminated byte arrays. If any string contains
-// a NUL byte, it returns (nil, EINVAL).
-func SlicePtrFromStrings(ss []string) ([]*byte, error) {
-	var err error
-	bb := make([]*byte, len(ss)+1)
-	for i := 0; i < len(ss); i++ {
-		bb[i], err = BytePtrFromString(ss[i])
-		if err != nil {
-			return nil, err
-		}
-	}
-	bb[len(ss)] = nil
-	return bb, nil
-}
-
-func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) }
-
-func SetNonblock(fd int, nonblocking bool) (err error) {
-	flag, err := fcntl(fd, F_GETFL, 0)
-	if err != nil {
-		return err
-	}
-	if nonblocking {
-		flag |= O_NONBLOCK
-	} else {
-		flag &= ^O_NONBLOCK
-	}
-	_, err = fcntl(fd, F_SETFL, flag)
-	return err
-}
-
-// Credential holds user and group identities to be assumed
-// by a child process started by StartProcess.
-type Credential struct {
-	Uid    uint32   // User ID.
-	Gid    uint32   // Group ID.
-	Groups []uint32 // Supplementary group IDs.
-}
-
-// ProcAttr holds attributes that will be applied to a new process started
-// by StartProcess.
-type ProcAttr struct {
-	Dir   string    // Current working directory.
-	Env   []string  // Environment.
-	Files []uintptr // File descriptors.
-	Sys   *SysProcAttr
-}
-
-var zeroProcAttr ProcAttr
-var zeroSysProcAttr SysProcAttr
-
-func forkExec(argv0 string, argv []string, attr *ProcAttr) (pid int, err error) {
-	var p [2]int
-	var n int
-	var err1 Errno
-	var wstatus WaitStatus
-
-	if attr == nil {
-		attr = &zeroProcAttr
-	}
-	sys := attr.Sys
-	if sys == nil {
-		sys = &zeroSysProcAttr
-	}
-
-	p[0] = -1
-	p[1] = -1
-
-	// Convert args to C form.
-	argv0p, err := BytePtrFromString(argv0)
-	if err != nil {
-		return 0, err
-	}
-	argvp, err := SlicePtrFromStrings(argv)
-	if err != nil {
-		return 0, err
-	}
-	envvp, err := SlicePtrFromStrings(attr.Env)
-	if err != nil {
-		return 0, err
-	}
-
-	if (runtime.GOOS == "freebsd" || runtime.GOOS == "dragonfly") && len(argv[0]) > len(argv0) {
-		argvp[0] = argv0p
-	}
-
-	var chroot *byte
-	if sys.Chroot != "" {
-		chroot, err = BytePtrFromString(sys.Chroot)
-		if err != nil {
-			return 0, err
-		}
-	}
-	var dir *byte
-	if attr.Dir != "" {
-		dir, err = BytePtrFromString(attr.Dir)
-		if err != nil {
-			return 0, err
-		}
-	}
-
-	// Acquire the fork lock so that no other threads
-	// create new fds that are not yet close-on-exec
-	// before we fork.
-	ForkLock.Lock()
-
-	// Allocate child status pipe close on exec.
-	if err = forkExecPipe(p[:]); err != nil {
-		goto error
-	}
-
-	// Kick off child.
-	pid, err1 = forkAndExecInChild(argv0p, argvp, envvp, chroot, dir, attr, sys, p[1])
-	if err1 != 0 {
-		err = Errno(err1)
-		goto error
-	}
-	ForkLock.Unlock()
-
-	// Read child error status from pipe.
-	Close(p[1])
-	n, err = readlen(p[0], (*byte)(unsafe.Pointer(&err1)), int(unsafe.Sizeof(err1)))
-	Close(p[0])
-	if err != nil || n != 0 {
-		if n == int(unsafe.Sizeof(err1)) {
-			err = Errno(err1)
-		}
-		if err == nil {
-			err = EPIPE
-		}
-
-		// Child failed; wait for it to exit, to make sure
-		// the zombies don't accumulate.
-		_, err1 := Wait4(pid, &wstatus, 0, nil)
-		for err1 == EINTR {
-			_, err1 = Wait4(pid, &wstatus, 0, nil)
-		}
-		return 0, err
-	}
-
-	// Read got EOF, so pipe closed on exec, so exec succeeded.
-	return pid, nil
-
-error:
-	if p[0] >= 0 {
-		Close(p[0])
-		Close(p[1])
-	}
-	ForkLock.Unlock()
-	return 0, err
-}
-
-// Combination of fork and exec, careful to be thread safe.
-func ForkExec(argv0 string, argv []string, attr *ProcAttr) (pid int, err error) {
-	return forkExec(argv0, argv, attr)
-}
-
-// StartProcess wraps ForkExec for package os.
-func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle uintptr, err error) {
-	pid, err = forkExec(argv0, argv, attr)
-	return pid, 0, err
-}
-
-// Ordinary exec.
-func Exec(argv0 string, argv []string, envv []string) (err error) {
-	argv0p, err := BytePtrFromString(argv0)
-	if err != nil {
-		return err
-	}
-	argvp, err := SlicePtrFromStrings(argv)
-	if err != nil {
-		return err
-	}
-	envvp, err := SlicePtrFromStrings(envv)
-	if err != nil {
-		return err
-	}
-	err1 := raw_execve(argv0p, &argvp[0], &envvp[0])
-	return Errno(err1)
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/exec_unix_test.go b/third_party/gofrontend/libgo/go/syscall/exec_unix_test.go
deleted file mode 100644
index 69c4a1f..0000000
--- a/third_party/gofrontend/libgo/go/syscall/exec_unix_test.go
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package syscall_test
-
-import (
-	"internal/testenv"
-	"io"
-	"os"
-	"os/exec"
-	"os/signal"
-	"syscall"
-	"testing"
-	"unsafe"
-)
-
-type command struct {
-	pipe io.WriteCloser
-	proc *exec.Cmd
-	test *testing.T
-}
-
-func (c *command) Info() (pid, pgrp int) {
-	pid = c.proc.Process.Pid
-
-	pgrp, err := syscall.Getpgid(pid)
-	if err != nil {
-		c.test.Fatal(err)
-	}
-
-	return
-}
-
-func (c *command) Start() {
-	if err := c.proc.Start(); err != nil {
-		c.test.Fatal(err)
-	}
-}
-
-func (c *command) Stop() {
-	c.pipe.Close()
-	if err := c.proc.Wait(); err != nil {
-		c.test.Fatal(err)
-	}
-}
-
-func create(t *testing.T) *command {
-	testenv.MustHaveExec(t)
-
-	proc := exec.Command("cat")
-	stdin, err := proc.StdinPipe()
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	return &command{stdin, proc, t}
-}
-
-func parent() (pid, pgrp int) {
-	return syscall.Getpid(), syscall.Getpgrp()
-}
-
-func TestZeroSysProcAttr(t *testing.T) {
-	ppid, ppgrp := parent()
-
-	cmd := create(t)
-
-	cmd.Start()
-	defer cmd.Stop()
-
-	cpid, cpgrp := cmd.Info()
-
-	if cpid == ppid {
-		t.Fatalf("Parent and child have the same process ID")
-	}
-
-	if cpgrp != ppgrp {
-		t.Fatalf("Child is not in parent's process group")
-	}
-}
-
-func TestSetpgid(t *testing.T) {
-	ppid, ppgrp := parent()
-
-	cmd := create(t)
-
-	cmd.proc.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
-	cmd.Start()
-	defer cmd.Stop()
-
-	cpid, cpgrp := cmd.Info()
-
-	if cpid == ppid {
-		t.Fatalf("Parent and child have the same process ID")
-	}
-
-	if cpgrp == ppgrp {
-		t.Fatalf("Parent and child are in the same process group")
-	}
-
-	if cpid != cpgrp {
-		t.Fatalf("Child's process group is not the child's process ID")
-	}
-}
-
-func TestPgid(t *testing.T) {
-	ppid, ppgrp := parent()
-
-	cmd1 := create(t)
-
-	cmd1.proc.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
-	cmd1.Start()
-	defer cmd1.Stop()
-
-	cpid1, cpgrp1 := cmd1.Info()
-
-	if cpid1 == ppid {
-		t.Fatalf("Parent and child 1 have the same process ID")
-	}
-
-	if cpgrp1 == ppgrp {
-		t.Fatalf("Parent and child 1 are in the same process group")
-	}
-
-	if cpid1 != cpgrp1 {
-		t.Fatalf("Child 1's process group is not its process ID")
-	}
-
-	cmd2 := create(t)
-
-	cmd2.proc.SysProcAttr = &syscall.SysProcAttr{
-		Setpgid: true,
-		Pgid:    cpgrp1,
-	}
-	cmd2.Start()
-	defer cmd2.Stop()
-
-	cpid2, cpgrp2 := cmd2.Info()
-
-	if cpid2 == ppid {
-		t.Fatalf("Parent and child 2 have the same process ID")
-	}
-
-	if cpgrp2 == ppgrp {
-		t.Fatalf("Parent and child 2 are in the same process group")
-	}
-
-	if cpid2 == cpgrp2 {
-		t.Fatalf("Child 2's process group is its process ID")
-	}
-
-	if cpid1 == cpid2 {
-		t.Fatalf("Child 1 and 2 have the same process ID")
-	}
-
-	if cpgrp1 != cpgrp2 {
-		t.Fatalf("Child 1 and 2 are not in the same process group")
-	}
-}
-
-func TestForeground(t *testing.T) {
-	signal.Ignore(syscall.SIGTTIN, syscall.SIGTTOU)
-
-	tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0)
-	if err != nil {
-		t.Skipf("Can't test Foreground. Couldn't open /dev/tty: %s", err)
-	}
-
-	fpgrp := syscall.Pid_t(0)
-
-	errno := syscall.Ioctl(tty.Fd(), syscall.TIOCGPGRP, uintptr(unsafe.Pointer(&fpgrp)))
-	if errno != 0 {
-		t.Fatalf("TIOCGPGRP failed with error code: %s", errno)
-	}
-
-	if fpgrp == 0 {
-		t.Fatalf("Foreground process group is zero")
-	}
-
-	ppid, ppgrp := parent()
-
-	cmd := create(t)
-
-	cmd.proc.SysProcAttr = &syscall.SysProcAttr{
-		Ctty:       int(tty.Fd()),
-		Foreground: true,
-	}
-	cmd.Start()
-
-	cpid, cpgrp := cmd.Info()
-
-	if cpid == ppid {
-		t.Fatalf("Parent and child have the same process ID")
-	}
-
-	if cpgrp == ppgrp {
-		t.Fatalf("Parent and child are in the same process group")
-	}
-
-	if cpid != cpgrp {
-		t.Fatalf("Child's process group is not the child's process ID")
-	}
-
-	cmd.Stop()
-
-	errno = syscall.Ioctl(tty.Fd(), syscall.TIOCSPGRP, uintptr(unsafe.Pointer(&fpgrp)))
-	if errno != 0 {
-		t.Fatalf("TIOCSPGRP failed with error code: %s", errno)
-	}
-
-	signal.Reset()
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/exec_windows.go b/third_party/gofrontend/libgo/go/syscall/exec_windows.go
deleted file mode 100644
index 5a01843..0000000
--- a/third_party/gofrontend/libgo/go/syscall/exec_windows.go
+++ /dev/null
@@ -1,337 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Fork, exec, wait, etc.
-
-package syscall
-
-import (
-	"sync"
-	"unicode/utf16"
-	"unsafe"
-)
-
-var ForkLock sync.RWMutex
-
-// EscapeArg rewrites command line argument s as prescribed
-// in http://msdn.microsoft.com/en-us/library/ms880421.
-// This function returns "" (2 double quotes) if s is empty.
-// Alternatively, these transformations are done:
-// - every back slash (\) is doubled, but only if immediately
-//   followed by double quote (");
-// - every double quote (") is escaped by back slash (\);
-// - finally, s is wrapped with double quotes (arg -> "arg"),
-//   but only if there is space or tab inside s.
-func EscapeArg(s string) string {
-	if len(s) == 0 {
-		return "\"\""
-	}
-	n := len(s)
-	hasSpace := false
-	for i := 0; i < len(s); i++ {
-		switch s[i] {
-		case '"', '\\':
-			n++
-		case ' ', '\t':
-			hasSpace = true
-		}
-	}
-	if hasSpace {
-		n += 2
-	}
-	if n == len(s) {
-		return s
-	}
-
-	qs := make([]byte, n)
-	j := 0
-	if hasSpace {
-		qs[j] = '"'
-		j++
-	}
-	slashes := 0
-	for i := 0; i < len(s); i++ {
-		switch s[i] {
-		default:
-			slashes = 0
-			qs[j] = s[i]
-		case '\\':
-			slashes++
-			qs[j] = s[i]
-		case '"':
-			for ; slashes > 0; slashes-- {
-				qs[j] = '\\'
-				j++
-			}
-			qs[j] = '\\'
-			j++
-			qs[j] = s[i]
-		}
-		j++
-	}
-	if hasSpace {
-		for ; slashes > 0; slashes-- {
-			qs[j] = '\\'
-			j++
-		}
-		qs[j] = '"'
-		j++
-	}
-	return string(qs[:j])
-}
-
-// makeCmdLine builds a command line out of args by escaping "special"
-// characters and joining the arguments with spaces.
-func makeCmdLine(args []string) string {
-	var s string
-	for _, v := range args {
-		if s != "" {
-			s += " "
-		}
-		s += EscapeArg(v)
-	}
-	return s
-}
-
-// createEnvBlock converts an array of environment strings into
-// the representation required by CreateProcess: a sequence of NUL
-// terminated strings followed by a nil.
-// Last bytes are two UCS-2 NULs, or four NUL bytes.
-func createEnvBlock(envv []string) *uint16 {
-	if len(envv) == 0 {
-		return &utf16.Encode([]rune("\x00\x00"))[0]
-	}
-	length := 0
-	for _, s := range envv {
-		length += len(s) + 1
-	}
-	length += 1
-
-	b := make([]byte, length)
-	i := 0
-	for _, s := range envv {
-		l := len(s)
-		copy(b[i:i+l], []byte(s))
-		copy(b[i+l:i+l+1], []byte{0})
-		i = i + l + 1
-	}
-	copy(b[i:i+1], []byte{0})
-
-	return &utf16.Encode([]rune(string(b)))[0]
-}
-
-func CloseOnExec(fd Handle) {
-	SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0)
-}
-
-func SetNonblock(fd Handle, nonblocking bool) (err error) {
-	return nil
-}
-
-// FullPath retrieves the full path of the specified file.
-func FullPath(name string) (path string, err error) {
-	p, err := UTF16PtrFromString(name)
-	if err != nil {
-		return "", err
-	}
-	n := uint32(100)
-	for {
-		buf := make([]uint16, n)
-		n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil)
-		if err != nil {
-			return "", err
-		}
-		if n <= uint32(len(buf)) {
-			return UTF16ToString(buf[:n]), nil
-		}
-	}
-}
-
-func isSlash(c uint8) bool {
-	return c == '\\' || c == '/'
-}
-
-func normalizeDir(dir string) (name string, err error) {
-	ndir, err := FullPath(dir)
-	if err != nil {
-		return "", err
-	}
-	if len(ndir) > 2 && isSlash(ndir[0]) && isSlash(ndir[1]) {
-		// dir cannot have \\server\share\path form
-		return "", EINVAL
-	}
-	return ndir, nil
-}
-
-func volToUpper(ch int) int {
-	if 'a' <= ch && ch <= 'z' {
-		ch += 'A' - 'a'
-	}
-	return ch
-}
-
-func joinExeDirAndFName(dir, p string) (name string, err error) {
-	if len(p) == 0 {
-		return "", EINVAL
-	}
-	if len(p) > 2 && isSlash(p[0]) && isSlash(p[1]) {
-		// \\server\share\path form
-		return p, nil
-	}
-	if len(p) > 1 && p[1] == ':' {
-		// has drive letter
-		if len(p) == 2 {
-			return "", EINVAL
-		}
-		if isSlash(p[2]) {
-			return p, nil
-		} else {
-			d, err := normalizeDir(dir)
-			if err != nil {
-				return "", err
-			}
-			if volToUpper(int(p[0])) == volToUpper(int(d[0])) {
-				return FullPath(d + "\\" + p[2:])
-			} else {
-				return FullPath(p)
-			}
-		}
-	} else {
-		// no drive letter
-		d, err := normalizeDir(dir)
-		if err != nil {
-			return "", err
-		}
-		if isSlash(p[0]) {
-			return FullPath(d[:2] + p)
-		} else {
-			return FullPath(d + "\\" + p)
-		}
-	}
-	// we shouldn't be here
-	return "", EINVAL
-}
-
-type ProcAttr struct {
-	Dir   string
-	Env   []string
-	Files []uintptr
-	Sys   *SysProcAttr
-}
-
-type SysProcAttr struct {
-	HideWindow    bool
-	CmdLine       string // used if non-empty, else the windows command line is built by escaping the arguments passed to StartProcess
-	CreationFlags uint32
-}
-
-var zeroProcAttr ProcAttr
-var zeroSysProcAttr SysProcAttr
-
-func StartProcess(argv0 string, argv []string, attr *ProcAttr) (pid int, handle uintptr, err error) {
-	if len(argv0) == 0 {
-		return 0, 0, EWINDOWS
-	}
-	if attr == nil {
-		attr = &zeroProcAttr
-	}
-	sys := attr.Sys
-	if sys == nil {
-		sys = &zeroSysProcAttr
-	}
-
-	if len(attr.Files) > 3 {
-		return 0, 0, EWINDOWS
-	}
-	if len(attr.Files) < 3 {
-		return 0, 0, EINVAL
-	}
-
-	if len(attr.Dir) != 0 {
-		// StartProcess assumes that argv0 is relative to attr.Dir,
-		// because it implies Chdir(attr.Dir) before executing argv0.
-		// Windows CreateProcess assumes the opposite: it looks for
-		// argv0 relative to the current directory, and, only once the new
-		// process is started, it does Chdir(attr.Dir). We are adjusting
-		// for that difference here by making argv0 absolute.
-		var err error
-		argv0, err = joinExeDirAndFName(attr.Dir, argv0)
-		if err != nil {
-			return 0, 0, err
-		}
-	}
-	argv0p, err := UTF16PtrFromString(argv0)
-	if err != nil {
-		return 0, 0, err
-	}
-
-	var cmdline string
-	// Windows CreateProcess takes the command line as a single string:
-	// use attr.CmdLine if set, else build the command line by escaping
-	// and joining each argument with spaces
-	if sys.CmdLine != "" {
-		cmdline = sys.CmdLine
-	} else {
-		cmdline = makeCmdLine(argv)
-	}
-
-	var argvp *uint16
-	if len(cmdline) != 0 {
-		argvp, err = UTF16PtrFromString(cmdline)
-		if err != nil {
-			return 0, 0, err
-		}
-	}
-
-	var dirp *uint16
-	if len(attr.Dir) != 0 {
-		dirp, err = UTF16PtrFromString(attr.Dir)
-		if err != nil {
-			return 0, 0, err
-		}
-	}
-
-	// Acquire the fork lock so that no other threads
-	// create new fds that are not yet close-on-exec
-	// before we fork.
-	ForkLock.Lock()
-	defer ForkLock.Unlock()
-
-	p, _ := GetCurrentProcess()
-	fd := make([]Handle, len(attr.Files))
-	for i := range attr.Files {
-		if attr.Files[i] > 0 {
-			err := DuplicateHandle(p, Handle(attr.Files[i]), p, &fd[i], 0, true, DUPLICATE_SAME_ACCESS)
-			if err != nil {
-				return 0, 0, err
-			}
-			defer CloseHandle(Handle(fd[i]))
-		}
-	}
-	si := new(StartupInfo)
-	si.Cb = uint32(unsafe.Sizeof(*si))
-	si.Flags = STARTF_USESTDHANDLES
-	if sys.HideWindow {
-		si.Flags |= STARTF_USESHOWWINDOW
-		si.ShowWindow = SW_HIDE
-	}
-	si.StdInput = fd[0]
-	si.StdOutput = fd[1]
-	si.StdErr = fd[2]
-
-	pi := new(ProcessInformation)
-
-	flags := sys.CreationFlags | CREATE_UNICODE_ENVIRONMENT
-	err = CreateProcess(argv0p, argvp, nil, nil, true, flags, createEnvBlock(attr.Env), dirp, si, pi)
-	if err != nil {
-		return 0, 0, err
-	}
-	defer CloseHandle(Handle(pi.Thread))
-
-	return int(pi.ProcessId), uintptr(pi.Process), nil
-}
-
-func Exec(argv0 string, argv []string, envv []string) (err error) {
-	return EWINDOWS
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/export_test.go b/third_party/gofrontend/libgo/go/syscall/export_test.go
deleted file mode 100644
index c977462..0000000
--- a/third_party/gofrontend/libgo/go/syscall/export_test.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-var Itoa = itoa
diff --git a/third_party/gofrontend/libgo/go/syscall/export_unix_test.go b/third_party/gofrontend/libgo/go/syscall/export_unix_test.go
deleted file mode 100644
index b41fe2f..0000000
--- a/third_party/gofrontend/libgo/go/syscall/export_unix_test.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd
-
-package syscall
-
-func Ioctl(fd, req, arg uintptr) (err Errno) {
-	_, _, err = Syscall(SYS_IOCTL, fd, req, arg)
-	return err
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_bsd.go b/third_party/gofrontend/libgo/go/syscall/libcall_bsd.go
deleted file mode 100644
index f772608..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_bsd.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// BSD library calls.
-
-package syscall
-
-import "unsafe"
-
-//sys	sendfile(outfd int, infd int, offset *Offset_t, count int) (written int, err error)
-//sendfile(outfd _C_int, infd _C_int, offset *Offset_t, count Size_t) Ssize_t
-func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
-	if raceenabled {
-		raceReleaseMerge(unsafe.Pointer(&ioSync))
-	}
-	var soff Offset_t
-	var psoff *Offset_t
-	if offset != nil {
-		soff = Offset_t(*offset)
-		psoff = &soff
-	}
-	written, err = sendfile(outfd, infd, psoff, count)
-	if offset != nil {
-		*offset = int64(soff)
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_irix.go b/third_party/gofrontend/libgo/go/syscall/libcall_irix.go
deleted file mode 100644
index 50863fa..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_irix.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-//sysnb raw_ptrace(request int, pid int, addr *byte, data *byte) (err Errno)
-//ptrace(request _C_int, pid Pid_t, addr *byte, data *byte) _C_long
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_linux.go b/third_party/gofrontend/libgo/go/syscall/libcall_linux.go
deleted file mode 100644
index f0479eb..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_linux.go
+++ /dev/null
@@ -1,411 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// GNU/Linux library calls.
-
-package syscall
-
-import "unsafe"
-
-//sys	Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
-//__go_openat(dirfd _C_int, path *byte, flags _C_int, mode Mode_t) _C_int
-
-//sys	futimesat(dirfd int, path *byte, times *[2]Timeval) (err error)
-//futimesat(dirfd _C_int, path *byte, times *[2]Timeval) _C_int
-func Futimesat(dirfd int, path string, tv []Timeval) (err error) {
-	if len(tv) != 2 {
-		return EINVAL
-	}
-	return futimesat(dirfd, StringBytePtr(path), (*[2]Timeval)(unsafe.Pointer(&tv[0])))
-}
-
-func Futimes(fd int, tv []Timeval) (err error) {
-	// Believe it or not, this is the best we can do on GNU/Linux
-	// (and is what glibc does).
-	return Utimes("/proc/self/fd/"+itoa(fd), tv)
-}
-
-//sys	ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
-//ptrace(request _C_int, pid Pid_t, addr *byte, data *byte) _C_long
-
-//sysnb raw_ptrace(request int, pid int, addr *byte, data *byte) (err Errno)
-//ptrace(request _C_int, pid Pid_t, addr *byte, data *byte) _C_long
-
-func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err error) {
-	// The peek requests are machine-size oriented, so we wrap it
-	// to retrieve arbitrary-length data.
-
-	// The ptrace syscall differs from glibc's ptrace.
-	// Peeks returns the word in *data, not as the return value.
-
-	var buf [sizeofPtr]byte
-
-	// Leading edge.  PEEKTEXT/PEEKDATA don't require aligned
-	// access (PEEKUSER warns that it might), but if we don't
-	// align our reads, we might straddle an unmapped page
-	// boundary and not get the bytes leading up to the page
-	// boundary.
-	n := 0
-	if addr%sizeofPtr != 0 {
-		err = ptrace(req, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
-		if err != nil {
-			return 0, err
-		}
-		n += copy(out, buf[addr%sizeofPtr:])
-		out = out[n:]
-	}
-
-	// Remainder.
-	for len(out) > 0 {
-		// We use an internal buffer to gaurantee alignment.
-		// It's not documented if this is necessary, but we're paranoid.
-		err = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
-		if err != nil {
-			return n, err
-		}
-		copied := copy(out, buf[0:])
-		n += copied
-		out = out[copied:]
-	}
-
-	return n, nil
-}
-
-func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) {
-	return ptracePeek(PTRACE_PEEKTEXT, pid, addr, out)
-}
-
-func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) {
-	return ptracePeek(PTRACE_PEEKDATA, pid, addr, out)
-}
-
-func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, err error) {
-	// As for ptracePeek, we need to align our accesses to deal
-	// with the possibility of straddling an invalid page.
-
-	// Leading edge.
-	n := 0
-	if addr%sizeofPtr != 0 {
-		var buf [sizeofPtr]byte
-		err = ptrace(peekReq, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
-		if err != nil {
-			return 0, err
-		}
-		n += copy(buf[addr%sizeofPtr:], data)
-		word := *((*uintptr)(unsafe.Pointer(&buf[0])))
-		err = ptrace(pokeReq, pid, addr-addr%sizeofPtr, word)
-		if err != nil {
-			return 0, err
-		}
-		data = data[n:]
-	}
-
-	// Interior.
-	for len(data) > int(sizeofPtr) {
-		word := *((*uintptr)(unsafe.Pointer(&data[0])))
-		err = ptrace(pokeReq, pid, addr+uintptr(n), word)
-		if err != nil {
-			return n, err
-		}
-		n += int(sizeofPtr)
-		data = data[sizeofPtr:]
-	}
-
-	// Trailing edge.
-	if len(data) > 0 {
-		var buf [sizeofPtr]byte
-		err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
-		if err != nil {
-			return n, err
-		}
-		copy(buf[0:], data)
-		word := *((*uintptr)(unsafe.Pointer(&buf[0])))
-		err = ptrace(pokeReq, pid, addr+uintptr(n), word)
-		if err != nil {
-			return n, err
-		}
-		n += len(data)
-	}
-
-	return n, nil
-}
-
-func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) {
-	return ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, pid, addr, data)
-}
-
-func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) {
-	return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data)
-}
-
-func PtraceSetOptions(pid int, options int) (err error) {
-	return ptrace(PTRACE_SETOPTIONS, pid, 0, uintptr(options))
-}
-
-func PtraceGetEventMsg(pid int) (msg uint, err error) {
-	var data _C_long
-	err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data)))
-	msg = uint(data)
-	return
-}
-
-func PtraceCont(pid int, signal int) (err error) {
-	return ptrace(PTRACE_CONT, pid, 0, uintptr(signal))
-}
-
-func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) }
-
-func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) }
-
-func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) }
-
-//sys	reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error)
-//reboot(magic1 _C_uint, magic2 _C_uint, cmd _C_int, arg *byte) _C_int
-func Reboot(cmd int) (err error) {
-	return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "")
-}
-
-//sys	accept4(fd int, sa *RawSockaddrAny, len *Socklen_t, flags int) (nfd int, err error)
-//accept4(fd _C_int, sa *RawSockaddrAny, len *Socklen_t, flags _C_int) _C_int
-
-func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) {
-	var rsa RawSockaddrAny
-	var len Socklen_t = SizeofSockaddrAny
-	nfd, err = accept4(fd, &rsa, &len, flags)
-	if err != nil {
-		return -1, nil, err
-	}
-	sa, err = anyToSockaddr(&rsa)
-	if err != nil {
-		Close(nfd)
-		return -1, nil, err
-	}
-	return nfd, sa, nil
-}
-
-//sys	Acct(path string) (err error)
-//acct(path *byte) _C_int
-
-//sys	Adjtimex(buf *Timex) (state int, err error)
-//adjtimex(buf *Timex) _C_int
-
-//sysnb	Dup3(oldfd int, newfd int, flags int) (err error)
-//dup3(oldfd _C_int, newfd _C_int, flags _C_int) _C_int
-
-//sys	Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
-//faccessat(dirfd _C_int, pathname *byte, mode _C_int, flags _C_int) _C_int
-
-//sys	Fallocate(fd int, mode uint32, off int64, len int64) (err error)
-//fallocate(fd _C_int, mode _C_int, offset Offset_t, len Offset_t) _C_int
-
-//sys	Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
-//fchmodat(dirfd _C_int, pathname *byte, mode Mode_t, flags _C_int) _C_int
-
-//sys	Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
-//fchownat(dirfd _C_int, path *byte, owner Uid_t, group Gid_t, flags _C_int) _C_int
-
-//sys	Flock(fd int, how int) (err error)
-//flock(fd _C_int, how _C_int) _C_int
-
-//sys	Fstatfs(fd int, buf *Statfs_t) (err error)
-//fstatfs(fd _C_int, buf *Statfs_t) _C_int
-
-func Gettid() (tid int) {
-	r1, _, _ := Syscall(SYS_GETTID, 0, 0, 0)
-	return int(r1)
-}
-
-func Getdents(fd int, buf []byte) (n int, err error) {
-	var p *byte
-	if len(buf) > 0 {
-		p = &buf[0]
-	} else {
-		p = (*byte)(unsafe.Pointer(&_zero))
-	}
-	s := SYS_GETDENTS64
-	if s == 0 {
-		s = SYS_GETDENTS
-	}
-	r1, _, errno := Syscall(uintptr(s), uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(len(buf)))
-	n = int(r1)
-	if n < 0 {
-		err = errno
-	}
-	return
-}
-
-func clen(n []byte) int {
-	for i := 0; i < len(n); i++ {
-		if n[i] == 0 {
-			return i
-		}
-	}
-	return len(n)
-}
-
-func ReadDirent(fd int, buf []byte) (n int, err error) {
-	return Getdents(fd, buf)
-}
-
-func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) {
-	origlen := len(buf)
-	count = 0
-	for max != 0 && len(buf) > 0 {
-		dirent := (*Dirent)(unsafe.Pointer(&buf[0]))
-		buf = buf[dirent.Reclen:]
-		if dirent.Ino == 0 { // File absent in directory.
-			continue
-		}
-		bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0]))
-		var name = string(bytes[0:clen(bytes[:])])
-		if name == "." || name == ".." { // Useless names
-			continue
-		}
-		max--
-		count++
-		names = append(names, name)
-	}
-	return origlen - len(buf), count, names
-}
-
-//sys	Getxattr(path string, attr string, dest []byte) (sz int, err error)
-//getxattr(path *byte, attr *byte, buf *byte, count Size_t) Ssize_t
-
-//sys	InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error)
-//inotify_add_watch(fd _C_int, pathname *byte, mask uint32) _C_int
-
-//sysnb	InotifyInit() (fd int, err error)
-//inotify_init() _C_int
-
-//sysnb	InotifyInit1(flags int) (fd int, err error)
-//inotify_init1(flags _C_int) _C_int
-
-//sysnb	InotifyRmWatch(fd int, watchdesc uint32) (success int, err error)
-//inotify_rm_watch(fd _C_int, wd uint32) _C_int
-
-//sys	Klogctl(typ int, buf []byte) (n int, err error)
-//klogctl(typ _C_int, bufp *byte, len _C_int) _C_int
-
-//sys	Listxattr(path string, dest []byte) (sz int, err error)
-//listxattr(path *byte, list *byte, size Size_t) Ssize_t
-
-//sys	Mkdirat(dirfd int, path string, mode uint32) (err error)
-//mkdirat(dirfd _C_int, path *byte, mode Mode_t) _C_int
-
-//sys	Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
-//mknodat(dirfd _C_int, path *byte, mode Mode_t, dev _dev_t) _C_int
-
-//sysnb	pipe2(p *[2]_C_int, flags int) (err error)
-//pipe2(p *[2]_C_int, flags _C_int) _C_int
-func Pipe2(p []int, flags int) (err error) {
-	if len(p) != 2 {
-		return EINVAL
-	}
-	var pp [2]_C_int
-	err = pipe2(&pp, flags)
-	p[0] = int(pp[0])
-	p[1] = int(pp[1])
-	return
-}
-
-//sys	PivotRoot(newroot string, putold string) (err error)
-//pivot_root(newroot *byte, putold *byte) _C_int
-
-//sys	Removexattr(path string, attr string) (err error)
-//removexattr(path *byte, name *byte) _C_int
-
-//sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
-//renameat(olddirfd _C_int, oldpath *byte, newdirfd _C_int, newpath *byte) _C_int
-
-//sys	sendfile(outfd int, infd int, offset *Offset_t, count int) (written int, err error)
-//sendfile64(outfd _C_int, infd _C_int, offset *Offset_t, count Size_t) Ssize_t
-func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
-	if raceenabled {
-		raceReleaseMerge(unsafe.Pointer(&ioSync))
-	}
-	var soff Offset_t
-	var psoff *Offset_t
-	if offset != nil {
-		soff = Offset_t(*offset)
-		psoff = &soff
-	}
-	written, err = sendfile(outfd, infd, psoff, count)
-	if offset != nil {
-		*offset = int64(soff)
-	}
-	return
-}
-
-//sys	Setfsgid(gid int) (err error)
-//setfsgid(gid Gid_t) _C_int
-
-//sys	Setfsuid(uid int) (err error)
-//setfsuid(uid Uid_t) _C_int
-
-//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
-//setresgid(rgid Gid_t, egid Gid_t, sgid Gid_t) _C_int
-
-//sysnb	Setresuid(ruid int, eguid int, suid int) (err error)
-//setresuid(ruid Uid_t, euid Uid_t, suid Uid_t) _C_int
-
-//sys	Setxattr(path string, attr string, data []byte, flags int) (err error)
-//setxattr(path *byte, name *byte, value *byte, size Size_t, flags _C_int) _C_int
-
-//sys	splice(rfd int, roff *_loff_t, wfd int, woff *_loff_t, len int, flags int) (n int64, err error)
-//splice(rfd _C_int, roff *_loff_t, wfd _C_int, woff *_loff_t, len Size_t, flags _C_uint) Ssize_t
-func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {
-	var lroff _loff_t
-	var plroff *_loff_t
-	if roff != nil {
-		lroff = _loff_t(*roff)
-		plroff = &lroff
-	}
-	var lwoff _loff_t
-	var plwoff *_loff_t
-	if woff != nil {
-		lwoff = _loff_t(*woff)
-		plwoff = &lwoff
-	}
-	n, err = splice(rfd, plroff, wfd, plwoff, len, flags)
-	if roff != nil {
-		*roff = int64(lroff)
-	}
-	if woff != nil {
-		*woff = int64(lwoff)
-	}
-	return
-}
-
-//sys	Statfs(path string, buf *Statfs_t) (err error)
-//statfs(path *byte, buf *Statfs_t) _C_int
-
-//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
-//sync_file_range(fd _C_int, off Offset_t, n Offset_t, flags _C_uint) _C_int
-
-//sysnb	Sysinfo(info *Sysinfo_t) (err error)
-//sysinfo(info *Sysinfo_t) _C_int
-
-//sys	Tee(rfd int, wfd int, len int, flags int) (n int64, err error)
-//tee(rfd _C_int, wfd _C_int, len Size_t, flags _C_uint) Ssize_t
-
-func Tgkill(tgid int, tid int, sig Signal) error {
-	r1, _, errno := Syscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))
-	if r1 < 0 {
-		return errno
-	}
-	return nil
-}
-
-//sys	unlinkat(dirfd int, path string, flags int) (err error)
-//unlinkat(dirfd _C_int, path *byte, flags _C_int) _C_int
-
-func Unlinkat(dirfd int, path string) (err error) {
-	return unlinkat(dirfd, path, 0)
-}
-
-//sys	Unmount(target string, flags int) (err error) = SYS_UMOUNT2
-//umount2(target *byte, flags _C_int) _C_int
-
-//sys	Unshare(flags int) (err error)
-//unshare(flags _C_int) _C_int
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_linux_386.go b/third_party/gofrontend/libgo/go/syscall/libcall_linux_386.go
deleted file mode 100644
index bdf0fda..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_linux_386.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// GNU/Linux library calls 386 specific.
-
-package syscall
-
-//sys	Ioperm(from int, num int, on int) (err error)
-//ioperm(from _C_long, num _C_long, on _C_int) _C_int
-
-//sys	Iopl(level int) (err error)
-//iopl(level _C_int) _C_int
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_linux_alpha.go b/third_party/gofrontend/libgo/go/syscall/libcall_linux_alpha.go
deleted file mode 100644
index 13ccf05..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_linux_alpha.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// GNU/Linux library calls Alpha specific.
-
-package syscall
-
-//sys	Ioperm(from int, num int, on int) (err error)
-//ioperm(from _C_long, num _C_long, on _C_int) _C_int
-
-//sys	Iopl(level int) (err error)
-//iopl(level _C_int) _C_int
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_linux_amd64.go b/third_party/gofrontend/libgo/go/syscall/libcall_linux_amd64.go
deleted file mode 100644
index 675de3d..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_linux_amd64.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// GNU/Linux library calls amd64 specific.
-
-package syscall
-
-//sys	Ioperm(from int, num int, on int) (err error)
-//ioperm(from _C_long, num _C_long, on _C_int) _C_int
-
-//sys	Iopl(level int) (err error)
-//iopl(level _C_int) _C_int
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_linux_s390.go b/third_party/gofrontend/libgo/go/syscall/libcall_linux_s390.go
deleted file mode 100644
index c5f3b30..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_linux_s390.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// GNU/Linux library calls s390 specific.
-
-package syscall
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_linux_s390x.go b/third_party/gofrontend/libgo/go/syscall/libcall_linux_s390x.go
deleted file mode 100644
index c5f3b30..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_linux_s390x.go
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// GNU/Linux library calls s390 specific.
-
-package syscall
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_linux_ustat.go b/third_party/gofrontend/libgo/go/syscall/libcall_linux_ustat.go
deleted file mode 100644
index f7f3406..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_linux_ustat.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// GNU/Linux library ustat call.
-// This is not supported on some kernels, such as arm64.
-
-package syscall
-
-//sys	Ustat(dev int, ubuf *Ustat_t) (err error)
-//ustat(dev _dev_t, ubuf *Ustat_t) _C_int
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_linux_utimesnano.go b/third_party/gofrontend/libgo/go/syscall/libcall_linux_utimesnano.go
deleted file mode 100644
index 90da2ae..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_linux_utimesnano.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// GNU/Linux version of UtimesNano.
-
-package syscall
-
-import "unsafe"
-
-//sys	utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)
-//utimensat(dirfd _C_int, path *byte, times *[2]Timespec, flags _C_int) _C_int
-func UtimesNano(path string, ts []Timespec) (err error) {
-	if len(ts) != 2 {
-		return EINVAL
-	}
-	err = utimensat(_AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
-	if err != ENOSYS {
-		return err
-	}
-	// If the utimensat syscall isn't available (utimensat was added to Linux
-	// in 2.6.22, Released, 8 July 2007) then fall back to utimes
-	var tv [2]Timeval
-	for i := 0; i < 2; i++ {
-		tv[i].Sec = Timeval_sec_t(ts[i].Sec)
-		tv[i].Usec = Timeval_usec_t(ts[i].Nsec / 1000)
-	}
-	return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_posix.go b/third_party/gofrontend/libgo/go/syscall/libcall_posix.go
deleted file mode 100644
index d3580a1..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_posix.go
+++ /dev/null
@@ -1,401 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// POSIX library calls.
-// This file is compiled as ordinary Go code,
-// but it is also input to mksyscall,
-// which parses the //sys lines and generates library call stubs.
-// Note that sometimes we use a lowercase //sys name and
-// wrap it in our own nicer implementation.
-
-package syscall
-
-import "unsafe"
-
-/*
- * Wrapped
- */
-
-//sysnb	pipe(p *[2]_C_int) (err error)
-//pipe(p *[2]_C_int) _C_int
-func Pipe(p []int) (err error) {
-	if len(p) != 2 {
-		return EINVAL
-	}
-	var pp [2]_C_int
-	err = pipe(&pp)
-	p[0] = int(pp[0])
-	p[1] = int(pp[1])
-	return
-}
-
-//sys	utimes(path string, times *[2]Timeval) (err error)
-//utimes(path *byte, times *[2]Timeval) _C_int
-func Utimes(path string, tv []Timeval) (err error) {
-	if len(tv) != 2 {
-		return EINVAL
-	}
-	return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
-}
-
-//sys	getcwd(buf *byte, size Size_t) (err error)
-//getcwd(buf *byte, size Size_t) *byte
-
-const ImplementsGetwd = true
-
-func Getwd() (ret string, err error) {
-	for len := Size_t(4096); ; len *= 2 {
-		b := make([]byte, len)
-		err := getcwd(&b[0], len)
-		if err == nil {
-			i := 0
-			for b[i] != 0 {
-				i++
-			}
-			return string(b[0:i]), nil
-		}
-		if err != ERANGE {
-			return "", err
-		}
-	}
-}
-
-func Getcwd(buf []byte) (n int, err error) {
-	err = getcwd(&buf[0], Size_t(len(buf)))
-	if err == nil {
-		i := 0
-		for buf[i] != 0 {
-			i++
-		}
-		n = i + 1
-	}
-	return
-}
-
-//sysnb	getgroups(size int, list *Gid_t) (nn int, err error)
-//getgroups(size _C_int, list *Gid_t) _C_int
-
-func Getgroups() (gids []int, err error) {
-	n, err := getgroups(0, nil)
-	if err != nil {
-		return nil, err
-	}
-	if n == 0 {
-		return nil, nil
-	}
-
-	// Sanity check group count.  Max is 1<<16 on GNU/Linux.
-	if n < 0 || n > 1<<20 {
-		return nil, EINVAL
-	}
-
-	a := make([]Gid_t, n)
-	n, err = getgroups(n, &a[0])
-	if err != nil {
-		return nil, err
-	}
-	gids = make([]int, n)
-	for i, v := range a[0:n] {
-		gids[i] = int(v)
-	}
-	return
-}
-
-//sysnb	setgroups(n int, list *Gid_t) (err error)
-//setgroups(n Size_t, list *Gid_t) _C_int
-
-func Setgroups(gids []int) (err error) {
-	if len(gids) == 0 {
-		return setgroups(0, nil)
-	}
-
-	a := make([]Gid_t, len(gids))
-	for i, v := range gids {
-		a[i] = Gid_t(v)
-	}
-	return setgroups(len(a), &a[0])
-}
-
-type WaitStatus uint32
-
-// The WaitStatus methods are implemented in C, to pick up the macros
-// #defines in <sys/wait.h>.
-
-func (w WaitStatus) Exited() bool
-func (w WaitStatus) Signaled() bool
-func (w WaitStatus) Stopped() bool
-func (w WaitStatus) Continued() bool
-func (w WaitStatus) CoreDump() bool
-func (w WaitStatus) ExitStatus() int
-func (w WaitStatus) Signal() Signal
-func (w WaitStatus) StopSignal() Signal
-func (w WaitStatus) TrapCause() int
-
-//sys	Mkfifo(path string, mode uint32) (err error)
-//mkfifo(path *byte, mode Mode_t) _C_int
-
-//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
-//select(nfd _C_int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) _C_int
-
-const nfdbits = int(unsafe.Sizeof(fds_bits_type(0)) * 8)
-
-type FdSet struct {
-	Bits [(FD_SETSIZE + nfdbits - 1) / nfdbits]fds_bits_type
-}
-
-func FDSet(fd int, set *FdSet) {
-	set.Bits[fd/nfdbits] |= (1 << (uint)(fd%nfdbits))
-}
-
-func FDClr(fd int, set *FdSet) {
-	set.Bits[fd/nfdbits] &^= (1 << (uint)(fd%nfdbits))
-}
-
-func FDIsSet(fd int, set *FdSet) bool {
-	if set.Bits[fd/nfdbits]&(1<<(uint)(fd%nfdbits)) != 0 {
-		return true
-	} else {
-		return false
-	}
-}
-
-func FDZero(set *FdSet) {
-	for i := range set.Bits {
-		set.Bits[i] = 0
-	}
-}
-
-//sys	Access(path string, mode uint32) (err error)
-//access(path *byte, mode _C_int) _C_int
-
-//sys	Chdir(path string) (err error)
-//chdir(path *byte) _C_int
-
-//sys	Chmod(path string, mode uint32) (err error)
-//chmod(path *byte, mode Mode_t) _C_int
-
-//sys	Chown(path string, uid int, gid int) (err error)
-//chown(path *byte, uid Uid_t, gid Gid_t) _C_int
-
-//sys	Chroot(path string) (err error)
-//chroot(path *byte) _C_int
-
-//sys	Close(fd int) (err error)
-//close(fd _C_int) _C_int
-
-//sys	Creat(path string, mode uint32) (fd int, err error)
-//creat(path *byte, mode Mode_t) _C_int
-
-//sysnb	Dup(oldfd int) (fd int, err error)
-//dup(oldfd _C_int) _C_int
-
-//sysnb	Dup2(oldfd int, newfd int) (err error)
-//dup2(oldfd _C_int, newfd _C_int) _C_int
-
-//sys	Exit(code int)
-//exit(code _C_int)
-
-//sys	Fchdir(fd int) (err error)
-//fchdir(fd _C_int) _C_int
-
-//sys	Fchmod(fd int, mode uint32) (err error)
-//fchmod(fd _C_int, mode Mode_t) _C_int
-
-//sys	Fchown(fd int, uid int, gid int) (err error)
-//fchown(fd _C_int, uid Uid_t, gid Gid_t) _C_int
-
-//sys	fcntl(fd int, cmd int, arg int) (val int, err error)
-//__go_fcntl(fd _C_int, cmd _C_int, arg _C_int) _C_int
-
-//sys	FcntlFlock(fd uintptr, cmd int, lk *Flock_t) (err error)
-//__go_fcntl_flock(fd _C_int, cmd _C_int, arg *Flock_t) _C_int
-
-//sys	Fdatasync(fd int) (err error)
-//fdatasync(fd _C_int) _C_int
-
-//sys	Fsync(fd int) (err error)
-//fsync(fd _C_int) _C_int
-
-//sysnb Getegid() (egid int)
-//getegid() Gid_t
-
-//sysnb Geteuid() (euid int)
-//geteuid() Uid_t
-
-//sysnb Getgid() (gid int)
-//getgid() Gid_t
-
-//sysnb	Getpagesize() (pagesize int)
-//getpagesize() _C_int
-
-//sysnb	Getpgid(pid int) (pgid int, err error)
-//getpgid(pid Pid_t) Pid_t
-
-//sysnb	Getpgrp() (pid int)
-//getpgrp() Pid_t
-
-//sysnb	Getpid() (pid int)
-//getpid() Pid_t
-
-//sysnb	Getppid() (ppid int)
-//getppid() Pid_t
-
-//sys Getpriority(which int, who int) (prio int, err error)
-//getpriority(which _C_int, who _C_int) _C_int
-
-//sysnb	Getrusage(who int, rusage *Rusage) (err error)
-//getrusage(who _C_int, rusage *Rusage) _C_int
-
-//sysnb	gettimeofday(tv *Timeval, tz *byte) (err error)
-//gettimeofday(tv *Timeval, tz *byte) _C_int
-func Gettimeofday(tv *Timeval) (err error) {
-	return gettimeofday(tv, nil)
-}
-
-//sysnb Getuid() (uid int)
-//getuid() Uid_t
-
-//sysnb	Kill(pid int, sig Signal) (err error)
-//kill(pid Pid_t, sig _C_int) _C_int
-
-//sys	Lchown(path string, uid int, gid int) (err error)
-//lchown(path *byte, uid Uid_t, gid Gid_t) _C_int
-
-//sys	Link(oldpath string, newpath string) (err error)
-//link(oldpath *byte, newpath *byte) _C_int
-
-//sys	Mkdir(path string, mode uint32) (err error)
-//mkdir(path *byte, mode Mode_t) _C_int
-
-//sys	Mknod(path string, mode uint32, dev int) (err error)
-//mknod(path *byte, mode Mode_t, dev _dev_t) _C_int
-
-//sys	Mount(source string, target string, fstype string, flags uintptr, data string) (err error)
-//mount(source *byte, target *byte, fstype *byte, flags _C_long, data *byte) _C_int
-
-//sys	Nanosleep(time *Timespec, leftover *Timespec) (err error)
-//nanosleep(time *Timespec, leftover *Timespec) _C_int
-
-//sys	Pause() (err error)
-//pause() _C_int
-
-//sys	read(fd int, p []byte) (n int, err error)
-//read(fd _C_int, buf *byte, count Size_t) Ssize_t
-
-//sys	readlen(fd int, p *byte, np int) (n int, err error)
-//read(fd _C_int, buf *byte, count Size_t) Ssize_t
-
-//sys	Readlink(path string, buf []byte) (n int, err error)
-//readlink(path *byte, buf *byte, bufsiz Size_t) Ssize_t
-
-//sys	Rename(oldpath string, newpath string) (err error)
-//rename(oldpath *byte, newpath *byte) _C_int
-
-//sys	Rmdir(path string) (err error)
-//rmdir(path *byte) _C_int
-
-//sys	Setdomainname(p []byte) (err error)
-//setdomainname(name *byte, len Size_t) _C_int
-
-//sys	Sethostname(p []byte) (err error)
-//sethostname(name *byte, len Size_t) _C_int
-
-//sysnb	Setgid(gid int) (err error)
-//setgid(gid Gid_t) _C_int
-
-//sysnb Setregid(rgid int, egid int) (err error)
-//setregid(rgid Gid_t, egid Gid_t) _C_int
-
-//sysnb	Setpgid(pid int, pgid int) (err error)
-//setpgid(pid Pid_t, pgid Pid_t) _C_int
-
-//sys Setpriority(which int, who int, prio int) (err error)
-//setpriority(which _C_int, who _C_int, prio _C_int) _C_int
-
-//sysnb	Setreuid(ruid int, euid int) (err error)
-//setreuid(ruid Uid_t, euid Uid_t) _C_int
-
-//sysnb	Setsid() (pid int, err error)
-//setsid() Pid_t
-
-//sysnb	settimeofday(tv *Timeval, tz *byte) (err error)
-//settimeofday(tv *Timeval, tz *byte) _C_int
-
-func Settimeofday(tv *Timeval) (err error) {
-	return settimeofday(tv, nil)
-}
-
-//sysnb	Setuid(uid int) (err error)
-//setuid(uid Uid_t) _C_int
-
-//sys	Symlink(oldpath string, newpath string) (err error)
-//symlink(oldpath *byte, newpath *byte) _C_int
-
-//sys	Sync()
-//sync()
-
-//sysnb	Time(t *Time_t) (tt Time_t, err error)
-//time(t *Time_t) Time_t
-
-//sysnb	Times(tms *Tms) (ticks uintptr, err error)
-//times(tms *Tms) _clock_t
-
-//sysnb	Umask(mask int) (oldmask int)
-//umask(mask Mode_t) Mode_t
-
-//sys	Unlink(path string) (err error)
-//unlink(path *byte) _C_int
-
-//sys	Utime(path string, buf *Utimbuf) (err error)
-//utime(path *byte, buf *Utimbuf) _C_int
-
-//sys	write(fd int, p []byte) (n int, err error)
-//write(fd _C_int, buf *byte, count Size_t) Ssize_t
-
-//sys	writelen(fd int, p *byte, np int) (n int, err error)
-//write(fd _C_int, buf *byte, count Size_t) Ssize_t
-
-//sys	munmap(addr uintptr, length uintptr) (err error)
-//munmap(addr *byte, length Size_t) _C_int
-
-//sys Madvise(b []byte, advice int) (err error)
-//madvise(addr *byte, len Size_t, advice _C_int) _C_int
-
-//sys	Mprotect(b []byte, prot int) (err error)
-//mprotect(addr *byte, len Size_t, prot _C_int) _C_int
-
-//sys	Mlock(b []byte) (err error)
-//mlock(addr *byte, len Size_t) _C_int
-
-//sys	Munlock(b []byte) (err error)
-//munlock(addr *byte, len Size_t) _C_int
-
-//sys	Mlockall(flags int) (err error)
-//mlockall(flags _C_int) _C_int
-
-//sys	Munlockall() (err error)
-//munlockall() _C_int
-
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
-	ts.Sec = Timespec_sec_t(nsec / 1e9)
-	ts.Nsec = Timespec_nsec_t(nsec % 1e9)
-	return
-}
-
-func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 }
-
-func NsecToTimeval(nsec int64) (tv Timeval) {
-	nsec += 999 // round up to microsecond
-	tv.Sec = Timeval_sec_t(nsec / 1e9)
-	tv.Usec = Timeval_usec_t(nsec % 1e9 / 1e3)
-	return
-}
-
-//sysnb	Tcgetattr(fd int, p *Termios) (err error)
-//tcgetattr(fd _C_int, p *Termios) _C_int
-
-//sys	Tcsetattr(fd int, actions int, p *Termios) (err error)
-//tcsetattr(fd _C_int, actions _C_int, p *Termios) _C_int
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_posix_largefile.go b/third_party/gofrontend/libgo/go/syscall/libcall_posix_largefile.go
deleted file mode 100644
index c05d3d2..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_posix_largefile.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// POSIX library calls on systems which use the largefile interface.
-
-package syscall
-
-//sys	Fstat(fd int, stat *Stat_t) (err error)
-//fstat64(fd _C_int, stat *Stat_t) _C_int
-
-//sys	Ftruncate(fd int, length int64) (err error)
-//ftruncate64(fd _C_int, length Offset_t) _C_int
-
-//sysnb	Getrlimit(resource int, rlim *Rlimit) (err error)
-//getrlimit64(resource _C_int, rlim *Rlimit) _C_int
-
-//sys	Lstat(path string, stat *Stat_t) (err error)
-//lstat64(path *byte, stat *Stat_t) _C_int
-
-//sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
-//mmap64(addr *byte, length Size_t, prot _C_int, flags _C_int, fd _C_int, offset Offset_t) *byte
-
-//sys	Open(path string, mode int, perm uint32) (fd int, err error)
-//__go_open64(path *byte, mode _C_int, perm Mode_t) _C_int
-
-//sys	Pread(fd int, p []byte, offset int64) (n int, err error)
-//pread64(fd _C_int, buf *byte, count Size_t, offset Offset_t) Ssize_t
-
-//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error)
-//pwrite64(fd _C_int, buf *byte, count Size_t, offset Offset_t) Ssize_t
-
-//sys	Seek(fd int, offset int64, whence int) (off int64, err error)
-//lseek64(fd _C_int, offset Offset_t, whence _C_int) Offset_t
-
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
-//setrlimit64(resource int, rlim *Rlimit) _C_int
-
-//sys	Stat(path string, stat *Stat_t) (err error)
-//stat64(path *byte, stat *Stat_t) _C_int
-
-//sys	Truncate(path string, length int64) (err error)
-//truncate64(path *byte, length Offset_t) _C_int
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_posix_regfile.go b/third_party/gofrontend/libgo/go/syscall/libcall_posix_regfile.go
deleted file mode 100644
index 7de5800..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_posix_regfile.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// POSIX library calls on systems which do not use the largefile
-// interface.
-
-package syscall
-
-//sys	Fstat(fd int, stat *Stat_t) (err error)
-//fstat(fd _C_int, stat *Stat_t) _C_int
-
-//sys	Ftruncate(fd int, length int64) (err error)
-//ftruncate(fd _C_int, length Offset_t) _C_int
-
-//sysnb	Getrlimit(resource int, rlim *Rlimit) (err error)
-//getrlimit(resource _C_int, rlim *Rlimit) _C_int
-
-//sys	Lstat(path string, stat *Stat_t) (err error)
-//lstat(path *byte, stat *Stat_t) _C_int
-
-//sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
-//mmap(addr *byte, length Size_t, prot _C_int, flags _C_int, fd _C_int, offset Offset_t) *byte
-
-//sys	Open(path string, mode int, perm uint32) (fd int, err error)
-//__go_open(path *byte, mode _C_int, perm Mode_t) _C_int
-
-//sys	Pread(fd int, p []byte, offset int64) (n int, err error)
-//pread(fd _C_int, buf *byte, count Size_t, offset Offset_t) Ssize_t
-
-//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error)
-//pwrite(fd _C_int, buf *byte, count Size_t, offset Offset_t) Ssize_t
-
-//sys	Seek(fd int, offset int64, whence int) (off int64, err error)
-//lseek(fd _C_int, offset Offset_t, whence _C_int) Offset_t
-
-//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
-//setrlimit(resource int, rlim *Rlimit) _C_int
-
-//sys	Stat(path string, stat *Stat_t) (err error)
-//stat(path *byte, stat *Stat_t) _C_int
-
-//sys	Truncate(path string, length int64) (err error)
-//truncate(path *byte, length Offset_t) _C_int
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_posix_utimesnano.go b/third_party/gofrontend/libgo/go/syscall/libcall_posix_utimesnano.go
deleted file mode 100644
index e0751f5..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_posix_utimesnano.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// General POSIX version of UtimesNano.
-
-package syscall
-
-import "unsafe"
-
-func UtimesNano(path string, ts []Timespec) error {
-	// TODO: The BSDs can do utimensat with SYS_UTIMENSAT but it
-	// isn't supported by darwin so this uses utimes instead
-	if len(ts) != 2 {
-		return EINVAL
-	}
-	// Not as efficient as it could be because Timespec and
-	// Timeval have different types in the different OSes
-	tv := [2]Timeval{
-		NsecToTimeval(TimespecToNsec(ts[0])),
-		NsecToTimeval(TimespecToNsec(ts[1])),
-	}
-	return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_solaris_386.go b/third_party/gofrontend/libgo/go/syscall/libcall_solaris_386.go
deleted file mode 100644
index 20eba22..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_solaris_386.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-// 32-bit Solaris 2/x86 needs to use _nuname internally, cf. <sys/utsname.h>.
-//sysnb	Uname(buf *Utsname) (err error)
-//_nuname(buf *Utsname) _C_int
-
-//sysnb raw_ptrace(request int, pid int, addr *byte, data *byte) (err Errno)
-//ptrace(request _C_int, pid Pid_t, addr *byte, data *byte) _C_long
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_solaris_amd64.go b/third_party/gofrontend/libgo/go/syscall/libcall_solaris_amd64.go
deleted file mode 100644
index 69b11ba..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_solaris_amd64.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-// 64-bit ptrace(3C) doesn't exist
-func raw_ptrace(request int, pid int, addr *byte, data *byte) Errno {
-	return ENOSYS
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_solaris_sparc.go b/third_party/gofrontend/libgo/go/syscall/libcall_solaris_sparc.go
deleted file mode 100644
index 50863fa..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_solaris_sparc.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-//sysnb raw_ptrace(request int, pid int, addr *byte, data *byte) (err Errno)
-//ptrace(request _C_int, pid Pid_t, addr *byte, data *byte) _C_long
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_solaris_sparc64.go b/third_party/gofrontend/libgo/go/syscall/libcall_solaris_sparc64.go
deleted file mode 100644
index 69b11ba..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_solaris_sparc64.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-// 64-bit ptrace(3C) doesn't exist
-func raw_ptrace(request int, pid int, addr *byte, data *byte) Errno {
-	return ENOSYS
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_support.go b/third_party/gofrontend/libgo/go/syscall/libcall_support.go
deleted file mode 100644
index cacc556..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_support.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Declarations for functions which are actually written in C.
-
-package syscall
-
-func Entersyscall()
-func Exitsyscall()
-func GetErrno() Errno
-func SetErrno(Errno)
-
-// These functions are used by CGO and SWIG.
-func Cgocall()
-func CgocallDone()
-func CgocallBack()
-func CgocallBackDone()
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_uname.go b/third_party/gofrontend/libgo/go/syscall/libcall_uname.go
deleted file mode 100644
index 1e164ef..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_uname.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-//sysnb	Uname(buf *Utsname) (err error)
-//uname(buf *Utsname) _C_int
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_wait4.go b/third_party/gofrontend/libgo/go/syscall/libcall_wait4.go
deleted file mode 100644
index 559d780..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_wait4.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// For systems with the wait4 library call.
-
-package syscall
-
-//sys	wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, err error)
-//wait4(pid Pid_t, status *_C_int, options _C_int, rusage *Rusage) Pid_t
-
-func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
-	var status _C_int
-	r, err := wait4(Pid_t(pid), &status, options, rusage)
-	wpid = int(r)
-	if wstatus != nil {
-		*wstatus = WaitStatus(status)
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/libcall_waitpid.go b/third_party/gofrontend/libgo/go/syscall/libcall_waitpid.go
deleted file mode 100644
index b0e04b5..0000000
--- a/third_party/gofrontend/libgo/go/syscall/libcall_waitpid.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// For systems with the waitpid library call.
-
-package syscall
-
-//sys	waitpid(pid Pid_t, status *_C_int, options int) (wpid Pid_t, err error)
-//waitpid(pid Pid_t, status *_C_int, options _C_int) Pid_t
-
-func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
-	var status _C_int
-	r, err := waitpid(Pid_t(pid), &status, options)
-	wpid = int(r)
-	if wstatus != nil {
-		*wstatus = WaitStatus(status)
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/lsf_linux.go b/third_party/gofrontend/libgo/go/syscall/lsf_linux.go
deleted file mode 100644
index 48ba191..0000000
--- a/third_party/gofrontend/libgo/go/syscall/lsf_linux.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Linux socket filter
-
-package syscall
-
-import (
-	"unsafe"
-)
-
-func LsfStmt(code, k int) *SockFilter {
-	return &SockFilter{Code: uint16(code), K: uint32(k)}
-}
-
-func LsfJump(code, k, jt, jf int) *SockFilter {
-	return &SockFilter{Code: uint16(code), Jt: uint8(jt), Jf: uint8(jf), K: uint32(k)}
-}
-
-func LsfSocket(ifindex, proto int) (int, error) {
-	var lsall SockaddrLinklayer
-	s, e := Socket(AF_PACKET, SOCK_RAW, proto)
-	if e != nil {
-		return 0, e
-	}
-	p := (*[2]byte)(unsafe.Pointer(&lsall.Protocol))
-	p[0] = byte(proto >> 8)
-	p[1] = byte(proto)
-	lsall.Ifindex = ifindex
-	e = Bind(s, &lsall)
-	if e != nil {
-		Close(s)
-		return 0, e
-	}
-	return s, nil
-}
-
-type iflags struct {
-	name  [IFNAMSIZ]byte
-	flags uint16
-}
-
-func SetLsfPromisc(name string, m bool) error {
-	s, e := Socket(AF_INET, SOCK_DGRAM, 0)
-	if e != nil {
-		return e
-	}
-	defer Close(s)
-	var ifl iflags
-	copy(ifl.name[:], []byte(name))
-	_, _, ep := Syscall(SYS_IOCTL, uintptr(s), SIOCGIFFLAGS, uintptr(unsafe.Pointer(&ifl)))
-	if ep != 0 {
-		return Errno(ep)
-	}
-	if m {
-		ifl.flags |= uint16(IFF_PROMISC)
-	} else {
-		ifl.flags &= ^uint16(IFF_PROMISC)
-	}
-	_, _, ep = Syscall(SYS_IOCTL, uintptr(s), SIOCSIFFLAGS, uintptr(unsafe.Pointer(&ifl)))
-	if ep != 0 {
-		return Errno(ep)
-	}
-	return nil
-}
-
-func AttachLsf(fd int, i []SockFilter) error {
-	var p SockFprog
-	p.Len = uint16(len(i))
-	p.Filter = (*SockFilter)(unsafe.Pointer(&i[0]))
-	return setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, unsafe.Pointer(&p), Socklen_t(unsafe.Sizeof(p)))
-}
-
-func DetachLsf(fd int) error {
-	var dummy int
-	return setsockopt(fd, SOL_SOCKET, SO_DETACH_FILTER, unsafe.Pointer(&dummy), Socklen_t(unsafe.Sizeof(dummy)))
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/mksyscall.awk b/third_party/gofrontend/libgo/go/syscall/mksyscall.awk
deleted file mode 100644
index 6fbd2ac..0000000
--- a/third_party/gofrontend/libgo/go/syscall/mksyscall.awk
+++ /dev/null
@@ -1,300 +0,0 @@
-# Copyright 2011 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# This AWK script reads a Go file with comments describing syscall
-# functions and the C routines they map to.  It generates the Go code
-# which calls the C routines.
-
-# The syscall functins are marked by lines beginning with "//sys" and
-# read like func declarations if //sys is replaced by func, but:
-#	* The parameter lists must give a name for each argument.
-#	  This includes return parameters.
-#	* The parameter lists must give a type for each argument:
-#	   the (x, y, z int) shorthand is not allowed.
-#	* If the return parameter is an error, it must be named err.
-
-# A line beginning with //sysnb is like //sys, except that the
-# goroutine will not be suspended during the execution of the library
-# call.  This must only be used for library calls which can never
-# block, as otherwise the library call could cause all goroutines to
-# hang.
-
-# After the //sys or //sysnb line comes a second line which describes
-# the C function.  The name must be the name of the function in the C
-# library, and may be the same as the Go function.  The limitations on
-# the argument list are the same as for the //sys line, but there must
-# be at most one result parameter, and it must be given as just a
-# type, without a name.
-
-BEGIN {
-    print "// This file was automatically generated by mksyscall.awk"
-    print ""
-    print "package syscall"
-    print ""
-    print "import \"unsafe\""
-    print ""
-    status = 0
-}
-
-/^\/\/sys/ {
-    if ($1 == "//sysnb") {
-	blocking = 0
-    } else {
-	blocking = 1
-    }
-
-    line = $0
-
-    if (match(line, "//sys(nb)?[ 	]*[a-zA-Z0-9_]+\\([^()]*\\) *(\\(([^()]+)\\))?") == 0) {
-	print "unmatched line:", $0 | "cat 1>&2"
-	status = 1
-	next
-    }
-
-    # Sets a[1] = //sysnb, a[2] == function name.
-    split(line, a, "[ 	(]+")
-    gofnname = a[2]
-
-    off = match(line, "\\([^()]*\\)")
-    end = index(substr(line, off, length(line) - off + 1), ")")
-    gofnparams = substr(line, off + 1, end - 2)
-
-    line = substr(line, off + end, length(line) - (off + end) + 1)
-    off = match(line, "\\([^()]*\\)")
-    if (off == 0) {
-	gofnresults = ""
-    } else {
-	end = index(substr(line, off, length(line) - off + 1), ")")
-	gofnresults = substr(line, off + 1, end - 2)
-    }
-
-    getline
-    line = $0
-
-    if (match(line, "//[a-zA-Z0-9_]+\\([^()]*\\)") == 0) {
-	print "unmatched C line", $0, "after", gofnname | "cat 1>&2"
-	status = 1
-	next
-    }
-
-    split(line, a, "[ 	(]+")
-    cfnname = substr(a[1], 3, length(a[1]) - 2)
-
-    off = match(line, "\\([^()]*\\)")
-    end = index(substr(line, off, length(line) - off + 1), ")")
-    cfnparams = substr(line, off + 1, end - 2)
-
-    line = substr(line, off + end + 1, length(line) - (off + end) + 1)
-    while (substr(line, 1, 1) == " ") {
-	line = substr(line, 2, length(line) - 1)
-    }
-    end = index(line, " ")
-    if (end != 0) {
-	line = substr(line, 1, end)
-    }
-    cfnresult = line
-
-    printf("// Automatically generated wrapper for %s/%s\n", gofnname, cfnname)
-    if (!(cfnname in cfns)) {
-        cfns[cfnname] = 1
-        printf("//extern %s\n", cfnname)
-        printf("func c_%s(%s) %s\n", cfnname, cfnparams, cfnresult)
-    }
-    printf("func %s(%s) %s%s%s%s{\n",
-	   gofnname, gofnparams, gofnresults == "" ? "" : "(", gofnresults,
-	   gofnresults == "" ? "" : ")", gofnresults == "" ? "" : " ")
-
-    loc = gofnname "/" cfnname ":"
-
-    haserr = 0
-    if (gofnresults != "") {
-	fields = split(gofnresults, goresults, ", *")
-	for (goresult = 1; goresults[goresult] != ""; goresult++) {
-	    if (split(goresults[goresult], goparam) == 2) {
-		if (goparam[1] == "err") {
-		    haserr = 1
-		    break
-		}
-	    }
-	}
-    }
-
-    split(gofnparams, goargs, ", *")
-    split(cfnparams, cargs, ", *")
-    args = ""
-    carg = 1
-    for (goarg = 1; goargs[goarg] != ""; goarg++) {
-	if (cargs[carg] == "") {
-	    print loc, "not enough C parameters"
-	}
-
-	if (args != "") {
-	    args = args ", "
-	}
-
-	if (split(goargs[goarg], a) != 2) {
-	    print loc, "bad parameter:", goargs[goarg] | "cat 1>&2"
-	    status = 1
-	    next
-	}
-
-	goname = a[1]
-	gotype = a[2]
-
-	if (split(cargs[carg], a) != 2) {
-	    print loc, "bad C parameter:", cargs[carg] | "cat 1>&2"
-	    status = 1
-	    next
-	}
-
-	ctype = a[2]
-
-	if (gotype ~ /^\*/) {
-	    if (gotype != ctype) {
-		print loc, "Go/C pointer type mismatch:", gotype, ctype | "cat 1>&2"
-		status = 1
-		next
-	    }
-	    args = args goname
-	} else if (gotype == "string") {
-	    if (ctype != "*byte") {
-		print loc, "Go string not matched to C *byte:", gotype, ctype | "cat 1>&2"
-		status = 1
-		next
-	    }
-	    printf("\tvar _p%d *byte\n", goarg)
-	    if (haserr) {
-		printf("\t_p%d, err = BytePtrFromString(%s)\n", goarg, goname)
-		printf("\tif err != nil {\n\t\treturn\n\t}\n")
-	    } else {
-		print loc, "uses string arguments but has no error return" | "cat 1>&2"
-		printf("\t_p%d, _ = BytePtrFromString(%s)\n", goarg, goname)
-	    }
-	    args = sprintf("%s_p%d", args, goarg)
-	} else if (gotype ~ /^\[\](.*)/) {
-	    if (ctype !~ /^\*/ || cargs[carg + 1] == "") {
-		print loc, "bad C type for slice:", gotype, ctype | "cat 1>&2"
-		status = 1
-		next
-	    }
-
-	    # Convert a slice into a pair of pointer, length.
-	    # Don't try to take the address of the zeroth element of a
-	    # nil slice.
-	    printf("\tvar _p%d %s\n", goarg, ctype)
-	    printf("\tif len(%s) > 0 {\n", goname)
-	    printf("\t\t_p%d = (%s)(unsafe.Pointer(&%s[0]))\n", goarg, ctype, goname)
-	    printf("\t} else {\n")
-	    printf("\t\t_p%d = (%s)(unsafe.Pointer(&_zero))\n", goarg, ctype)
-	    printf("\t}\n")
-
-	    ++carg
-	    if (split(cargs[carg], cparam) != 2) {
-		print loc, "bad C parameter:", cargs[carg] | "cat 1>&2"
-		status = 1
-		next
-	    }
-
-	    args = sprintf("%s_p%d, %s(len(%s))", args, goarg, cparam[2], goname)
-	} else if (gotype == "uintptr" && ctype ~ /^\*/) {
-	    args = sprintf("%s(%s)(unsafe.Pointer(%s))", args, ctype, goname)
-	} else if (gotype == "unsafe.Pointer" && ctype ~ /^\*/) {
-	    args = sprintf("%s(%s)(%s)", args, ctype, goname)
-	} else {
-	    args = sprintf("%s%s(%s)", args, ctype, goname)
-	}
-
-	carg++
-    }
-
-    if (cargs[carg] != "") {
-	print loc, "too many C parameters" | "cat 1>&2"
-	status = 1
-	next
-    }
-
-    if (blocking) {
-	print "\tEntersyscall()"
-    }
-
-    printf("\t")
-    if (gofnresults != "") {
-	printf("_r := ")
-    }
-    printf("c_%s(%s)\n", cfnname, args)
-
-    seterr = 0
-    if (gofnresults != "") {
-	fields = split(gofnresults, goresults, ", *")
-	if (fields > 2) {
-	    print loc, "too many Go results" | "cat 1>&2"
-	    status = 1
-	    next
-	}
-	usedr = 0
-	for (goresult = 1; goresults[goresult] != ""; goresult++) {
-	    if (split(goresults[goresult], goparam) != 2) {
-		print loc, "bad result:", goresults[goresult] | "cat 1>&2"
-		status = 1
-		next
-	    }
-
-	    goname = goparam[1]
-	    gotype = goparam[2]
-
-	    if (goname == "err") {
-		print "\tvar errno Errno"
-		print "\tsetErrno := false"
-		if (cfnresult ~ /^\*/) {
-		    print "\tif _r == nil {"
-		} else {
-		    print "\tif _r < 0 {"
-		}
-		print "\t\terrno = GetErrno()"
-		print "\t\tsetErrno = true"
-		print "\t}"
-		seterr = 1
-	    } else if (gotype == "uintptr" && cfnresult ~ /^\*/) {
-		printf("\t%s = (%s)(unsafe.Pointer(_r))\n", goname, gotype)
-	    } else {
-		if (usedr) {
-		    print loc, "two parameters but no errno parameter" | "cat 1>&2"
-		    status = 1
-		    next
-		}
-		printf("\t%s = (%s)(_r)\n", goname, gotype)
-		usedr = 1
-	    }
-	}
-    }
-
-    if (blocking) {
-	print "\tExitsyscall()"
-    }
-
-    if (seterr) {
-	print "\tif setErrno {"
-	print "\t\terr = errno"
-	print "\t}"
-    }
-
-    if (gofnresults != "") {
-	print "\treturn"
-    }
-
-    print "}"
-
-    print ""
-
-    next
-}
-
-{ next }
-
-END {
-    if (status != 0) {
-	print "*** mksyscall.awk failed" | "cat 1>&2"
-	exit status
-    }
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/mmap_unix_test.go b/third_party/gofrontend/libgo/go/syscall/mmap_unix_test.go
deleted file mode 100644
index 01f7783..0000000
--- a/third_party/gofrontend/libgo/go/syscall/mmap_unix_test.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd
-
-package syscall_test
-
-import (
-	"syscall"
-	"testing"
-)
-
-func TestMmap(t *testing.T) {
-	b, err := syscall.Mmap(-1, 0, syscall.Getpagesize(), syscall.PROT_NONE, syscall.MAP_ANON|syscall.MAP_PRIVATE)
-	if err != nil {
-		t.Fatalf("Mmap: %v", err)
-	}
-	if err := syscall.Munmap(b); err != nil {
-		t.Fatalf("Munmap: %v", err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/netlink_linux.go b/third_party/gofrontend/libgo/go/syscall/netlink_linux.go
deleted file mode 100644
index 1b73dce..0000000
--- a/third_party/gofrontend/libgo/go/syscall/netlink_linux.go
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Netlink sockets and messages
-
-package syscall
-
-import "unsafe"
-
-// Round the length of a netlink message up to align it properly.
-func nlmAlignOf(msglen int) int {
-	return (msglen + NLMSG_ALIGNTO - 1) & ^(NLMSG_ALIGNTO - 1)
-}
-
-// Round the length of a netlink route attribute up to align it
-// properly.
-func rtaAlignOf(attrlen int) int {
-	return (attrlen + RTA_ALIGNTO - 1) & ^(RTA_ALIGNTO - 1)
-}
-
-// NetlinkRouteRequest represents a request message to receive routing
-// and link states from the kernel.
-type NetlinkRouteRequest struct {
-	Header NlMsghdr
-	Data   RtGenmsg
-}
-
-func (rr *NetlinkRouteRequest) toWireFormat() []byte {
-	b := make([]byte, rr.Header.Len)
-	*(*uint32)(unsafe.Pointer(&b[0:4][0])) = rr.Header.Len
-	*(*uint16)(unsafe.Pointer(&b[4:6][0])) = rr.Header.Type
-	*(*uint16)(unsafe.Pointer(&b[6:8][0])) = rr.Header.Flags
-	*(*uint32)(unsafe.Pointer(&b[8:12][0])) = rr.Header.Seq
-	*(*uint32)(unsafe.Pointer(&b[12:16][0])) = rr.Header.Pid
-	b[16] = byte(rr.Data.Family)
-	return b
-}
-
-func newNetlinkRouteRequest(proto, seq, family int) []byte {
-	rr := &NetlinkRouteRequest{}
-	rr.Header.Len = uint32(NLMSG_HDRLEN + SizeofRtGenmsg)
-	rr.Header.Type = uint16(proto)
-	rr.Header.Flags = NLM_F_DUMP | NLM_F_REQUEST
-	rr.Header.Seq = uint32(seq)
-	rr.Data.Family = uint8(family)
-	return rr.toWireFormat()
-}
-
-// NetlinkRIB returns routing information base, as known as RIB, which
-// consists of network facility information, states and parameters.
-func NetlinkRIB(proto, family int) ([]byte, error) {
-	s, err := Socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)
-	if err != nil {
-		return nil, err
-	}
-	defer Close(s)
-	lsa := &SockaddrNetlink{Family: AF_NETLINK}
-	if err := Bind(s, lsa); err != nil {
-		return nil, err
-	}
-	wb := newNetlinkRouteRequest(proto, 1, family)
-	if err := Sendto(s, wb, 0, lsa); err != nil {
-		return nil, err
-	}
-	var tab []byte
-	rbNew := make([]byte, Getpagesize())
-done:
-	for {
-		rb := rbNew
-		nr, _, err := Recvfrom(s, rb, 0)
-		if err != nil {
-			return nil, err
-		}
-		if nr < NLMSG_HDRLEN {
-			return nil, EINVAL
-		}
-		rb = rb[:nr]
-		tab = append(tab, rb...)
-		msgs, err := ParseNetlinkMessage(rb)
-		if err != nil {
-			return nil, err
-		}
-		for _, m := range msgs {
-			lsa, err := Getsockname(s)
-			if err != nil {
-				return nil, err
-			}
-			switch v := lsa.(type) {
-			case *SockaddrNetlink:
-				if m.Header.Seq != 1 || m.Header.Pid != v.Pid {
-					return nil, EINVAL
-				}
-			default:
-				return nil, EINVAL
-			}
-			if m.Header.Type == NLMSG_DONE {
-				break done
-			}
-			if m.Header.Type == NLMSG_ERROR {
-				return nil, EINVAL
-			}
-		}
-	}
-	return tab, nil
-}
-
-// NetlinkMessage represents a netlink message.
-type NetlinkMessage struct {
-	Header NlMsghdr
-	Data   []byte
-}
-
-// ParseNetlinkMessage parses b as an array of netlink messages and
-// returns the slice containing the NetlinkMessage structures.
-func ParseNetlinkMessage(b []byte) ([]NetlinkMessage, error) {
-	var msgs []NetlinkMessage
-	for len(b) >= NLMSG_HDRLEN {
-		h, dbuf, dlen, err := netlinkMessageHeaderAndData(b)
-		if err != nil {
-			return nil, err
-		}
-		m := NetlinkMessage{Header: *h, Data: dbuf[:int(h.Len)-NLMSG_HDRLEN]}
-		msgs = append(msgs, m)
-		b = b[dlen:]
-	}
-	return msgs, nil
-}
-
-func netlinkMessageHeaderAndData(b []byte) (*NlMsghdr, []byte, int, error) {
-	h := (*NlMsghdr)(unsafe.Pointer(&b[0]))
-	if int(h.Len) < NLMSG_HDRLEN || int(h.Len) > len(b) {
-		return nil, nil, 0, EINVAL
-	}
-	return h, b[NLMSG_HDRLEN:], nlmAlignOf(int(h.Len)), nil
-}
-
-// NetlinkRouteAttr represents a netlink route attribute.
-type NetlinkRouteAttr struct {
-	Attr  RtAttr
-	Value []byte
-}
-
-// ParseNetlinkRouteAttr parses m's payload as an array of netlink
-// route attributes and returns the slice containing the
-// NetlinkRouteAttr structures.
-func ParseNetlinkRouteAttr(m *NetlinkMessage) ([]NetlinkRouteAttr, error) {
-	var b []byte
-	switch m.Header.Type {
-	case RTM_NEWLINK, RTM_DELLINK:
-		b = m.Data[SizeofIfInfomsg:]
-	case RTM_NEWADDR, RTM_DELADDR:
-		b = m.Data[SizeofIfAddrmsg:]
-	case RTM_NEWROUTE, RTM_DELROUTE:
-		b = m.Data[SizeofRtMsg:]
-	default:
-		return nil, EINVAL
-	}
-	var attrs []NetlinkRouteAttr
-	for len(b) >= SizeofRtAttr {
-		a, vbuf, alen, err := netlinkRouteAttrAndValue(b)
-		if err != nil {
-			return nil, err
-		}
-		ra := NetlinkRouteAttr{Attr: *a, Value: vbuf[:int(a.Len)-SizeofRtAttr]}
-		attrs = append(attrs, ra)
-		b = b[alen:]
-	}
-	return attrs, nil
-}
-
-func netlinkRouteAttrAndValue(b []byte) (*RtAttr, []byte, int, error) {
-	a := (*RtAttr)(unsafe.Pointer(&b[0]))
-	if int(a.Len) < SizeofRtAttr || int(a.Len) > len(b) {
-		return nil, nil, 0, EINVAL
-	}
-	return a, b[SizeofRtAttr:], rtaAlignOf(int(a.Len)), nil
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/pwd_plan9.go b/third_party/gofrontend/libgo/go/syscall/pwd_plan9.go
deleted file mode 100644
index 1248613..0000000
--- a/third_party/gofrontend/libgo/go/syscall/pwd_plan9.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// The working directory in Plan 9 is effectively per P, so different
-// goroutines and even the same goroutine as it's rescheduled on
-// different Ps can see different working directories.
-//
-// Instead, track a Go process-wide intent of the current working directory,
-// and switch to it at important points.
-
-package syscall
-
-import "sync"
-
-var (
-	wdmu  sync.Mutex // guards following
-	wdSet bool
-	wdStr string
-)
-
-func Fixwd() {
-	wdmu.Lock()
-	defer wdmu.Unlock()
-	fixwdLocked()
-}
-
-func fixwdLocked() {
-	if !wdSet {
-		return
-	}
-	// always call chdir when getwd returns an error
-	wd, _ := getwd()
-	if wd == wdStr {
-		return
-	}
-	if err := chdir(wdStr); err != nil {
-		return
-	}
-}
-
-// goroutine-specific getwd
-func getwd() (wd string, err error) {
-	fd, err := open(".", O_RDONLY)
-	if err != nil {
-		return "", err
-	}
-	defer Close(fd)
-	return Fd2path(fd)
-}
-
-func Getwd() (wd string, err error) {
-	wdmu.Lock()
-	defer wdmu.Unlock()
-
-	if wdSet {
-		return wdStr, nil
-	}
-	wd, err = getwd()
-	if err != nil {
-		return
-	}
-	wdSet = true
-	wdStr = wd
-	return wd, nil
-}
-
-func Chdir(path string) error {
-	wdmu.Lock()
-	defer wdmu.Unlock()
-
-	if err := chdir(path); err != nil {
-		return err
-	}
-
-	wd, err := getwd()
-	if err != nil {
-		return err
-	}
-	wdSet = true
-	wdStr = wd
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/race0.go b/third_party/gofrontend/libgo/go/syscall/race0.go
deleted file mode 100644
index b02f882..0000000
--- a/third_party/gofrontend/libgo/go/syscall/race0.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !race
-
-package syscall
-
-import (
-	"unsafe"
-)
-
-const raceenabled = false
-
-func raceAcquire(addr unsafe.Pointer) {
-}
-
-func raceReleaseMerge(addr unsafe.Pointer) {
-}
-
-func raceReadRange(addr unsafe.Pointer, len int) {
-}
-
-func raceWriteRange(addr unsafe.Pointer, len int) {
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/route_bsd.go b/third_party/gofrontend/libgo/go/syscall/route_bsd.go
deleted file mode 100644
index c62fdc3..0000000
--- a/third_party/gofrontend/libgo/go/syscall/route_bsd.go
+++ /dev/null
@@ -1,347 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package syscall
-
-import (
-	"runtime"
-	"unsafe"
-)
-
-var (
-	freebsdConfArch       string // "machine $arch" line in kern.conftxt on freebsd
-	minRoutingSockaddrLen = rsaAlignOf(0)
-)
-
-// Round the length of a raw sockaddr up to align it properly.
-func rsaAlignOf(salen int) int {
-	salign := sizeofPtr
-	if darwin64Bit {
-		// Darwin kernels require 32-bit aligned access to
-		// routing facilities.
-		salign = 4
-	} else if netbsd32Bit {
-		// NetBSD 6 and beyond kernels require 64-bit aligned
-		// access to routing facilities.
-		salign = 8
-	} else if runtime.GOOS == "freebsd" {
-		// In the case of kern.supported_archs="amd64 i386",
-		// we need to know the underlying kernel's
-		// architecture because the alignment for routing
-		// facilities are set at the build time of the kernel.
-		if freebsdConfArch == "amd64" {
-			salign = 8
-		}
-	}
-	if salen == 0 {
-		return salign
-	}
-	return (salen + salign - 1) & ^(salign - 1)
-}
-
-// parseSockaddrLink parses b as a datalink socket address.
-func parseSockaddrLink(b []byte) (*SockaddrDatalink, error) {
-	sa, _, err := parseLinkLayerAddr(b[4:])
-	if err != nil {
-		return nil, err
-	}
-	rsa := (*RawSockaddrDatalink)(unsafe.Pointer(&b[0]))
-	sa.Len = rsa.Len
-	sa.Family = rsa.Family
-	sa.Index = rsa.Index
-	return sa, nil
-}
-
-// parseLinkLayerAddr parses b as a datalink socket address in
-// conventional BSD kernel form.
-func parseLinkLayerAddr(b []byte) (*SockaddrDatalink, int, error) {
-	// The encoding looks like the following:
-	// +----------------------------+
-	// | Type             (1 octet) |
-	// +----------------------------+
-	// | Name length      (1 octet) |
-	// +----------------------------+
-	// | Address length   (1 octet) |
-	// +----------------------------+
-	// | Selector length  (1 octet) |
-	// +----------------------------+
-	// | Data            (variable) |
-	// +----------------------------+
-	type linkLayerAddr struct {
-		Type byte
-		Nlen byte
-		Alen byte
-		Slen byte
-	}
-	lla := (*linkLayerAddr)(unsafe.Pointer(&b[0]))
-	l := rsaAlignOf(int(4 + lla.Nlen + lla.Alen + lla.Slen))
-	if len(b) < l {
-		return nil, 0, EINVAL
-	}
-	b = b[4:]
-	sa := &SockaddrDatalink{Type: lla.Type, Nlen: lla.Nlen, Alen: lla.Alen, Slen: lla.Slen}
-	for i := 0; len(sa.Data) > i && i < int(lla.Nlen+lla.Alen+lla.Slen); i++ {
-		sa.Data[i] = int8(b[i])
-	}
-	return sa, l, nil
-}
-
-// parseSockaddrInet parses b as an internet socket address.
-func parseSockaddrInet(b []byte, family byte) (Sockaddr, error) {
-	switch family {
-	case AF_INET:
-		if len(b) < SizeofSockaddrInet4 {
-			return nil, EINVAL
-		}
-		rsa := (*RawSockaddrAny)(unsafe.Pointer(&b[0]))
-		return anyToSockaddr(rsa)
-	case AF_INET6:
-		if len(b) < SizeofSockaddrInet6 {
-			return nil, EINVAL
-		}
-		rsa := (*RawSockaddrAny)(unsafe.Pointer(&b[0]))
-		return anyToSockaddr(rsa)
-	default:
-		return nil, EINVAL
-	}
-}
-
-const (
-	offsetofInet4 = int(unsafe.Offsetof(RawSockaddrInet4{}.Addr))
-	offsetofInet6 = int(unsafe.Offsetof(RawSockaddrInet6{}.Addr))
-)
-
-// parseNetworkLayerAddr parses b as an internet socket address in
-// conventional BSD kernel form.
-func parseNetworkLayerAddr(b []byte, family byte) (Sockaddr, error) {
-	// The encoding looks similar to the NLRI encoding.
-	// +----------------------------+
-	// | Length           (1 octet) |
-	// +----------------------------+
-	// | Address prefix  (variable) |
-	// +----------------------------+
-	//
-	// The differences between the kernel form and the NLRI
-	// encoding are:
-	//
-	// - The length field of the kernel form indicates the prefix
-	//   length in bytes, not in bits
-	//
-	// - In the kernel form, zero value of the length field
-	//   doesn't mean 0.0.0.0/0 or ::/0
-	//
-	// - The kernel form appends leading bytes to the prefix field
-	//   to make the <length, prefix> tuple to be conformed with
-	//   the routing messeage boundary
-	l := int(rsaAlignOf(int(b[0])))
-	if len(b) < l {
-		return nil, EINVAL
-	}
-	// Don't reorder case expressions.
-	// The case expressions for IPv6 must come first.
-	switch {
-	case b[0] == SizeofSockaddrInet6:
-		sa := &SockaddrInet6{}
-		copy(sa.Addr[:], b[offsetofInet6:])
-		return sa, nil
-	case family == AF_INET6:
-		sa := &SockaddrInet6{}
-		if l-1 < offsetofInet6 {
-			copy(sa.Addr[:], b[1:l])
-		} else {
-			copy(sa.Addr[:], b[l-offsetofInet6:l])
-		}
-		return sa, nil
-	case b[0] == SizeofSockaddrInet4:
-		sa := &SockaddrInet4{}
-		copy(sa.Addr[:], b[offsetofInet4:])
-		return sa, nil
-	default: // an old fashion, AF_UNSPEC or unknown means AF_INET
-		sa := &SockaddrInet4{}
-		if l-1 < offsetofInet4 {
-			copy(sa.Addr[:], b[1:l])
-		} else {
-			copy(sa.Addr[:], b[l-offsetofInet4:l])
-		}
-		return sa, nil
-	}
-}
-
-// RouteRIB returns routing information base, as known as RIB,
-// which consists of network facility information, states and
-// parameters.
-func RouteRIB(facility, param int) ([]byte, error) {
-	mib := []_C_int{CTL_NET, AF_ROUTE, 0, 0, _C_int(facility), _C_int(param)}
-	// Find size.
-	n := uintptr(0)
-	if err := sysctl(mib, nil, &n, nil, 0); err != nil {
-		return nil, err
-	}
-	if n == 0 {
-		return nil, nil
-	}
-	tab := make([]byte, n)
-	if err := sysctl(mib, &tab[0], &n, nil, 0); err != nil {
-		return nil, err
-	}
-	return tab[:n], nil
-}
-
-// RoutingMessage represents a routing message.
-type RoutingMessage interface {
-	sockaddr() ([]Sockaddr, error)
-}
-
-const anyMessageLen = int(unsafe.Sizeof(anyMessage{}))
-
-type anyMessage struct {
-	Msglen  uint16
-	Version uint8
-	Type    uint8
-}
-
-// RouteMessage represents a routing message containing routing
-// entries.
-type RouteMessage struct {
-	Header RtMsghdr
-	Data   []byte
-}
-
-func (m *RouteMessage) sockaddr() ([]Sockaddr, error) {
-	var sas [RTAX_MAX]Sockaddr
-	b := m.Data[:]
-	family := uint8(AF_UNSPEC)
-	for i := uint(0); i < RTAX_MAX && len(b) >= minRoutingSockaddrLen; i++ {
-		if m.Header.Addrs&(1<<i) == 0 {
-			continue
-		}
-		rsa := (*RawSockaddr)(unsafe.Pointer(&b[0]))
-		switch rsa.Family {
-		case AF_LINK:
-			sa, err := parseSockaddrLink(b)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[rsaAlignOf(int(rsa.Len)):]
-		case AF_INET, AF_INET6:
-			sa, err := parseSockaddrInet(b, rsa.Family)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[rsaAlignOf(int(rsa.Len)):]
-			family = rsa.Family
-		default:
-			sa, err := parseNetworkLayerAddr(b, family)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[rsaAlignOf(int(b[0])):]
-		}
-	}
-	return sas[:], nil
-}
-
-// InterfaceMessage represents a routing message containing
-// network interface entries.
-type InterfaceMessage struct {
-	Header IfMsghdr
-	Data   []byte
-}
-
-func (m *InterfaceMessage) sockaddr() ([]Sockaddr, error) {
-	var sas [RTAX_MAX]Sockaddr
-	if m.Header.Addrs&RTA_IFP == 0 {
-		return nil, nil
-	}
-	sa, err := parseSockaddrLink(m.Data[:])
-	if err != nil {
-		return nil, err
-	}
-	sas[RTAX_IFP] = sa
-	return sas[:], nil
-}
-
-// InterfaceAddrMessage represents a routing message containing
-// network interface address entries.
-type InterfaceAddrMessage struct {
-	Header IfaMsghdr
-	Data   []byte
-}
-
-func (m *InterfaceAddrMessage) sockaddr() ([]Sockaddr, error) {
-	var sas [RTAX_MAX]Sockaddr
-	b := m.Data[:]
-	family := uint8(AF_UNSPEC)
-	for i := uint(0); i < RTAX_MAX && len(b) >= minRoutingSockaddrLen; i++ {
-		if m.Header.Addrs&(1<<i) == 0 {
-			continue
-		}
-		rsa := (*RawSockaddr)(unsafe.Pointer(&b[0]))
-		switch rsa.Family {
-		case AF_LINK:
-			sa, err := parseSockaddrLink(b)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[rsaAlignOf(int(rsa.Len)):]
-		case AF_INET, AF_INET6:
-			sa, err := parseSockaddrInet(b, rsa.Family)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[rsaAlignOf(int(rsa.Len)):]
-			family = rsa.Family
-		default:
-			sa, err := parseNetworkLayerAddr(b, family)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[rsaAlignOf(int(b[0])):]
-		}
-	}
-	return sas[:], nil
-}
-
-// ParseRoutingMessage parses b as routing messages and returns the
-// slice containing the RoutingMessage interfaces.
-func ParseRoutingMessage(b []byte) (msgs []RoutingMessage, err error) {
-	nmsgs, nskips := 0, 0
-	for len(b) >= anyMessageLen {
-		nmsgs++
-		any := (*anyMessage)(unsafe.Pointer(&b[0]))
-		if any.Version != RTM_VERSION {
-			b = b[any.Msglen:]
-			continue
-		}
-		if m := any.toRoutingMessage(b); m == nil {
-			nskips++
-		} else {
-			msgs = append(msgs, m)
-		}
-		b = b[any.Msglen:]
-	}
-	// We failed to parse any of the messages - version mismatch?
-	if nmsgs != len(msgs)+nskips {
-		return nil, EINVAL
-	}
-	return msgs, nil
-}
-
-// ParseRoutingMessage parses msg's payload as raw sockaddrs and
-// returns the slice containing the Sockaddr interfaces.
-func ParseRoutingSockaddr(msg RoutingMessage) ([]Sockaddr, error) {
-	sas, err := msg.sockaddr()
-	if err != nil {
-		return nil, err
-	}
-	return sas, nil
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/route_bsd_test.go b/third_party/gofrontend/libgo/go/syscall/route_bsd_test.go
deleted file mode 100644
index 8617663..0000000
--- a/third_party/gofrontend/libgo/go/syscall/route_bsd_test.go
+++ /dev/null
@@ -1,225 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-package syscall_test
-
-import (
-	"fmt"
-	"net"
-	"os"
-	"syscall"
-	"testing"
-	"time"
-)
-
-func TestRouteRIB(t *testing.T) {
-	for _, facility := range []int{syscall.NET_RT_DUMP, syscall.NET_RT_IFLIST} {
-		for _, param := range []int{syscall.AF_UNSPEC, syscall.AF_INET, syscall.AF_INET6} {
-			var err error
-			var b []byte
-			// The VM allocator wrapper functions can
-			// return ENOMEM easily.
-			for i := 0; i < 3; i++ {
-				b, err = syscall.RouteRIB(facility, param)
-				if err != nil {
-					time.Sleep(5 * time.Millisecond)
-					continue
-				}
-				break
-			}
-			if err != nil {
-				t.Error(facility, param, err)
-				continue
-			}
-			msgs, err := syscall.ParseRoutingMessage(b)
-			if err != nil {
-				t.Error(facility, param, err)
-				continue
-			}
-			var ipv4loopback, ipv6loopback bool
-			for _, m := range msgs {
-				flags, err := parseRoutingMessageHeader(m)
-				if err != nil {
-					t.Error(err)
-					continue
-				}
-				sas, err := parseRoutingSockaddrs(m)
-				if err != nil {
-					t.Error(err)
-					continue
-				}
-				if flags&(syscall.RTA_DST|syscall.RTA_IFA) != 0 {
-					sa := sas[syscall.RTAX_DST]
-					if sa == nil {
-						sa = sas[syscall.RTAX_IFA]
-					}
-					switch sa := sa.(type) {
-					case *syscall.SockaddrInet4:
-						if net.IP(sa.Addr[:]).IsLoopback() {
-							ipv4loopback = true
-						}
-					case *syscall.SockaddrInet6:
-						if net.IP(sa.Addr[:]).IsLoopback() {
-							ipv6loopback = true
-						}
-					}
-				}
-				t.Log(facility, param, flags, sockaddrs(sas))
-			}
-			if param == syscall.AF_UNSPEC && len(msgs) > 0 && !ipv4loopback && !ipv6loopback {
-				t.Errorf("no loopback facility found: ipv4/ipv6=%v/%v, %v", ipv4loopback, ipv6loopback, len(msgs))
-				continue
-			}
-		}
-	}
-}
-
-func TestRouteMonitor(t *testing.T) {
-	if testing.Short() || os.Getuid() != 0 {
-		t.Skip("must be root")
-	}
-
-	s, err := syscall.Socket(syscall.AF_ROUTE, syscall.SOCK_RAW, syscall.AF_UNSPEC)
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer syscall.Close(s)
-
-	tmo := time.After(30 * time.Second)
-	go func() {
-		b := make([]byte, os.Getpagesize())
-		for {
-			n, err := syscall.Read(s, b)
-			if err != nil {
-				return
-			}
-			msgs, err := syscall.ParseRoutingMessage(b[:n])
-			if err != nil {
-				t.Error(err)
-				return
-			}
-			for _, m := range msgs {
-				flags, err := parseRoutingMessageHeader(m)
-				if err != nil {
-					t.Error(err)
-					continue
-				}
-				sas, err := parseRoutingSockaddrs(m)
-				if err != nil {
-					t.Error(err)
-					continue
-				}
-				t.Log(flags, sockaddrs(sas))
-			}
-		}
-	}()
-	<-tmo
-}
-
-type addrFamily byte
-
-func (f addrFamily) String() string {
-	switch f {
-	case syscall.AF_UNSPEC:
-		return "unspec"
-	case syscall.AF_LINK:
-		return "link"
-	case syscall.AF_INET:
-		return "inet4"
-	case syscall.AF_INET6:
-		return "inet6"
-	default:
-		return fmt.Sprintf("unknown %d", f)
-	}
-}
-
-type addrFlags uint32
-
-var addrFlagNames = [...]string{
-	"dst",
-	"gateway",
-	"netmask",
-	"genmask",
-	"ifp",
-	"ifa",
-	"author",
-	"brd",
-	"mpls1,tag,src", // sockaddr_mpls=dragonfly,netbsd, sockaddr_in/in6=openbsd
-	"mpls2,srcmask", // sockaddr_mpls=dragonfly, sockaddr_in/in6=openbsd
-	"mpls3,label",   // sockaddr_mpls=dragonfly, sockaddr_rtlabel=openbsd
-}
-
-func (f addrFlags) String() string {
-	var s string
-	for i, name := range addrFlagNames {
-		if f&(1<<uint(i)) != 0 {
-			if s != "" {
-				s += "|"
-			}
-			s += name
-		}
-	}
-	if s == "" {
-		return "<nil>"
-	}
-	return s
-}
-
-type sockaddrs []syscall.Sockaddr
-
-func (sas sockaddrs) String() string {
-	var s string
-	for _, sa := range sas {
-		if sa == nil {
-			continue
-		}
-		if len(s) > 0 {
-			s += " "
-		}
-		switch sa := sa.(type) {
-		case *syscall.SockaddrDatalink:
-			s += fmt.Sprintf("[%v/%v/%v t/n/a/s=%v/%v/%v/%v]", sa.Len, addrFamily(sa.Family), sa.Index, sa.Type, sa.Nlen, sa.Alen, sa.Slen)
-		case *syscall.SockaddrInet4:
-			s += fmt.Sprintf("%v", net.IP(sa.Addr[:]).To4())
-		case *syscall.SockaddrInet6:
-			s += fmt.Sprintf("%v", net.IP(sa.Addr[:]).To16())
-		}
-	}
-	if s == "" {
-		return "<nil>"
-	}
-	return s
-}
-
-func (sas sockaddrs) match(flags addrFlags) error {
-	var f addrFlags
-	family := syscall.AF_UNSPEC
-	for i := range sas {
-		if sas[i] != nil {
-			f |= 1 << uint(i)
-		}
-		switch sas[i].(type) {
-		case *syscall.SockaddrInet4:
-			if family == syscall.AF_UNSPEC {
-				family = syscall.AF_INET
-			}
-			if family != syscall.AF_INET {
-				return fmt.Errorf("got %v; want %v", sockaddrs(sas), family)
-			}
-		case *syscall.SockaddrInet6:
-			if family == syscall.AF_UNSPEC {
-				family = syscall.AF_INET6
-			}
-			if family != syscall.AF_INET6 {
-				return fmt.Errorf("got %v; want %v", sockaddrs(sas), family)
-			}
-		}
-	}
-	if f != flags {
-		return fmt.Errorf("got %v; want %v", f, flags)
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/route_darwin.go b/third_party/gofrontend/libgo/go/syscall/route_darwin.go
deleted file mode 100644
index 89bca12..0000000
--- a/third_party/gofrontend/libgo/go/syscall/route_darwin.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-import "unsafe"
-
-func (any *anyMessage) toRoutingMessage(b []byte) RoutingMessage {
-	switch any.Type {
-	case RTM_ADD, RTM_DELETE, RTM_CHANGE, RTM_GET, RTM_LOSING, RTM_REDIRECT, RTM_MISS, RTM_LOCK, RTM_RESOLVE:
-		p := (*RouteMessage)(unsafe.Pointer(any))
-		return &RouteMessage{Header: p.Header, Data: b[SizeofRtMsghdr:any.Msglen]}
-	case RTM_IFINFO:
-		p := (*InterfaceMessage)(unsafe.Pointer(any))
-		return &InterfaceMessage{Header: p.Header, Data: b[SizeofIfMsghdr:any.Msglen]}
-	case RTM_NEWADDR, RTM_DELADDR:
-		p := (*InterfaceAddrMessage)(unsafe.Pointer(any))
-		return &InterfaceAddrMessage{Header: p.Header, Data: b[SizeofIfaMsghdr:any.Msglen]}
-	case RTM_NEWMADDR2, RTM_DELMADDR:
-		p := (*InterfaceMulticastAddrMessage)(unsafe.Pointer(any))
-		return &InterfaceMulticastAddrMessage{Header: p.Header, Data: b[SizeofIfmaMsghdr2:any.Msglen]}
-	}
-	return nil
-}
-
-// InterfaceMulticastAddrMessage represents a routing message
-// containing network interface address entries.
-type InterfaceMulticastAddrMessage struct {
-	Header IfmaMsghdr2
-	Data   []byte
-}
-
-func (m *InterfaceMulticastAddrMessage) sockaddr() ([]Sockaddr, error) {
-	var sas [RTAX_MAX]Sockaddr
-	b := m.Data[:]
-	for i := uint(0); i < RTAX_MAX && len(b) >= minRoutingSockaddrLen; i++ {
-		if m.Header.Addrs&(1<<i) == 0 {
-			continue
-		}
-		rsa := (*RawSockaddr)(unsafe.Pointer(&b[0]))
-		switch rsa.Family {
-		case AF_LINK:
-			sa, err := parseSockaddrLink(b)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[rsaAlignOf(int(rsa.Len)):]
-		case AF_INET, AF_INET6:
-			sa, err := parseSockaddrInet(b, rsa.Family)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[rsaAlignOf(int(rsa.Len)):]
-		default:
-			sa, l, err := parseLinkLayerAddr(b)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[l:]
-		}
-	}
-	return sas[:], nil
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/route_dragonfly.go b/third_party/gofrontend/libgo/go/syscall/route_dragonfly.go
deleted file mode 100644
index 5226f7f..0000000
--- a/third_party/gofrontend/libgo/go/syscall/route_dragonfly.go
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-import "unsafe"
-
-func (any *anyMessage) toRoutingMessage(b []byte) RoutingMessage {
-	switch any.Type {
-	case RTM_ADD, RTM_DELETE, RTM_CHANGE, RTM_GET, RTM_LOSING, RTM_REDIRECT, RTM_MISS, RTM_LOCK, RTM_RESOLVE:
-		p := (*RouteMessage)(unsafe.Pointer(any))
-		// We don't support sockaddr_mpls for now.
-		p.Header.Addrs &= RTA_DST | RTA_GATEWAY | RTA_NETMASK | RTA_GENMASK | RTA_IFA | RTA_IFP | RTA_BRD | RTA_AUTHOR
-		return &RouteMessage{Header: p.Header, Data: b[SizeofRtMsghdr:any.Msglen]}
-	case RTM_IFINFO:
-		p := (*InterfaceMessage)(unsafe.Pointer(any))
-		return &InterfaceMessage{Header: p.Header, Data: b[SizeofIfMsghdr:any.Msglen]}
-	case RTM_IFANNOUNCE:
-		p := (*InterfaceAnnounceMessage)(unsafe.Pointer(any))
-		return &InterfaceAnnounceMessage{Header: p.Header}
-	case RTM_NEWADDR, RTM_DELADDR:
-		p := (*InterfaceAddrMessage)(unsafe.Pointer(any))
-		return &InterfaceAddrMessage{Header: p.Header, Data: b[SizeofIfaMsghdr:any.Msglen]}
-	case RTM_NEWMADDR, RTM_DELMADDR:
-		p := (*InterfaceMulticastAddrMessage)(unsafe.Pointer(any))
-		return &InterfaceMulticastAddrMessage{Header: p.Header, Data: b[SizeofIfmaMsghdr:any.Msglen]}
-	}
-	return nil
-}
-
-// InterfaceAnnounceMessage represents a routing message containing
-// network interface arrival and departure information.
-type InterfaceAnnounceMessage struct {
-	Header IfAnnounceMsghdr
-}
-
-func (m *InterfaceAnnounceMessage) sockaddr() ([]Sockaddr, error) { return nil, nil }
-
-// InterfaceMulticastAddrMessage represents a routing message
-// containing network interface address entries.
-type InterfaceMulticastAddrMessage struct {
-	Header IfmaMsghdr
-	Data   []byte
-}
-
-func (m *InterfaceMulticastAddrMessage) sockaddr() ([]Sockaddr, error) {
-	var sas [RTAX_MAX]Sockaddr
-	b := m.Data[:]
-	for i := uint(0); i < RTAX_MAX && len(b) >= minRoutingSockaddrLen; i++ {
-		if m.Header.Addrs&(1<<i) == 0 {
-			continue
-		}
-		rsa := (*RawSockaddr)(unsafe.Pointer(&b[0]))
-		switch rsa.Family {
-		case AF_LINK:
-			sa, err := parseSockaddrLink(b)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[rsaAlignOf(int(rsa.Len)):]
-		case AF_INET, AF_INET6:
-			sa, err := parseSockaddrInet(b, rsa.Family)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[rsaAlignOf(int(rsa.Len)):]
-		default:
-			sa, l, err := parseLinkLayerAddr(b)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[l:]
-		}
-	}
-	return sas[:], nil
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/route_freebsd.go b/third_party/gofrontend/libgo/go/syscall/route_freebsd.go
deleted file mode 100644
index 0e18103..0000000
--- a/third_party/gofrontend/libgo/go/syscall/route_freebsd.go
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-import "unsafe"
-
-// See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html.
-var freebsdVersion uint32
-
-func init() {
-	freebsdVersion, _ = SysctlUint32("kern.osreldate")
-	conf, _ := Sysctl("kern.conftxt")
-	for i, j := 0, 0; j < len(conf); j++ {
-		if conf[j] != '\n' {
-			continue
-		}
-		s := conf[i:j]
-		i = j + 1
-		if len(s) > len("machine") && s[:len("machine")] == "machine" {
-			s = s[len("machine"):]
-			for k := 0; k < len(s); k++ {
-				if s[k] == ' ' || s[k] == '\t' {
-					s = s[1:]
-				}
-				break
-			}
-			freebsdConfArch = s
-			break
-		}
-	}
-}
-
-func (any *anyMessage) toRoutingMessage(b []byte) RoutingMessage {
-	switch any.Type {
-	case RTM_ADD, RTM_DELETE, RTM_CHANGE, RTM_GET, RTM_LOSING, RTM_REDIRECT, RTM_MISS, RTM_LOCK, RTM_RESOLVE:
-		return any.parseRouteMessage(b)
-	case RTM_IFINFO:
-		return any.parseInterfaceMessage(b)
-	case RTM_IFANNOUNCE:
-		p := (*InterfaceAnnounceMessage)(unsafe.Pointer(any))
-		return &InterfaceAnnounceMessage{Header: p.Header}
-	case RTM_NEWADDR, RTM_DELADDR:
-		p := (*InterfaceAddrMessage)(unsafe.Pointer(any))
-		return &InterfaceAddrMessage{Header: p.Header, Data: b[SizeofIfaMsghdr:any.Msglen]}
-	case RTM_NEWMADDR, RTM_DELMADDR:
-		p := (*InterfaceMulticastAddrMessage)(unsafe.Pointer(any))
-		return &InterfaceMulticastAddrMessage{Header: p.Header, Data: b[SizeofIfmaMsghdr:any.Msglen]}
-	}
-	return nil
-}
-
-// InterfaceAnnounceMessage represents a routing message containing
-// network interface arrival and departure information.
-type InterfaceAnnounceMessage struct {
-	Header IfAnnounceMsghdr
-}
-
-func (m *InterfaceAnnounceMessage) sockaddr() ([]Sockaddr, error) { return nil, nil }
-
-// InterfaceMulticastAddrMessage represents a routing message
-// containing network interface address entries.
-type InterfaceMulticastAddrMessage struct {
-	Header IfmaMsghdr
-	Data   []byte
-}
-
-func (m *InterfaceMulticastAddrMessage) sockaddr() ([]Sockaddr, error) {
-	var sas [RTAX_MAX]Sockaddr
-	b := m.Data[:]
-	for i := uint(0); i < RTAX_MAX && len(b) >= minRoutingSockaddrLen; i++ {
-		if m.Header.Addrs&(1<<i) == 0 {
-			continue
-		}
-		rsa := (*RawSockaddr)(unsafe.Pointer(&b[0]))
-		switch rsa.Family {
-		case AF_LINK:
-			sa, err := parseSockaddrLink(b)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[rsaAlignOf(int(rsa.Len)):]
-		case AF_INET, AF_INET6:
-			sa, err := parseSockaddrInet(b, rsa.Family)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[rsaAlignOf(int(rsa.Len)):]
-		default:
-			sa, l, err := parseLinkLayerAddr(b)
-			if err != nil {
-				return nil, err
-			}
-			sas[i] = sa
-			b = b[l:]
-		}
-	}
-	return sas[:], nil
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/route_freebsd_32bit.go b/third_party/gofrontend/libgo/go/syscall/route_freebsd_32bit.go
deleted file mode 100644
index 5c10b05..0000000
--- a/third_party/gofrontend/libgo/go/syscall/route_freebsd_32bit.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build freebsd,386 freebsd,arm
-
-package syscall
-
-import "unsafe"
-
-func (any *anyMessage) parseRouteMessage(b []byte) *RouteMessage {
-	p := (*RouteMessage)(unsafe.Pointer(any))
-	off := int(unsafe.Offsetof(p.Header.Rmx)) + SizeofRtMetrics
-	if freebsdConfArch == "amd64" {
-		off += SizeofRtMetrics // rt_metrics on amd64 is simply doubled
-	}
-	return &RouteMessage{Header: p.Header, Data: b[rsaAlignOf(off):any.Msglen]}
-}
-
-func (any *anyMessage) parseInterfaceMessage(b []byte) *InterfaceMessage {
-	p := (*InterfaceMessage)(unsafe.Pointer(any))
-	// FreeBSD 10 and beyond have a restructured mbuf
-	// packet header view.
-	// See http://svnweb.freebsd.org/base?view=revision&revision=254804.
-	if freebsdVersion >= 1000000 {
-		m := (*ifMsghdr)(unsafe.Pointer(any))
-		p.Header.Data.Hwassist = uint32(m.Data.Hwassist)
-		p.Header.Data.Epoch = m.Data.Epoch
-		p.Header.Data.Lastchange = m.Data.Lastchange
-		return &InterfaceMessage{Header: p.Header, Data: b[int(unsafe.Offsetof(p.Header.Data))+int(p.Header.Data.Datalen) : any.Msglen]}
-	}
-	return &InterfaceMessage{Header: p.Header, Data: b[int(unsafe.Offsetof(p.Header.Data))+int(p.Header.Data.Datalen) : any.Msglen]}
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/route_freebsd_64bit.go b/third_party/gofrontend/libgo/go/syscall/route_freebsd_64bit.go
deleted file mode 100644
index 728837e..0000000
--- a/third_party/gofrontend/libgo/go/syscall/route_freebsd_64bit.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build freebsd,amd64
-
-package syscall
-
-import "unsafe"
-
-func (any *anyMessage) parseRouteMessage(b []byte) *RouteMessage {
-	p := (*RouteMessage)(unsafe.Pointer(any))
-	return &RouteMessage{Header: p.Header, Data: b[rsaAlignOf(int(unsafe.Offsetof(p.Header.Rmx))+SizeofRtMetrics):any.Msglen]}
-}
-
-func (any *anyMessage) parseInterfaceMessage(b []byte) *InterfaceMessage {
-	p := (*InterfaceMessage)(unsafe.Pointer(any))
-	return &InterfaceMessage{Header: p.Header, Data: b[int(unsafe.Offsetof(p.Header.Data))+int(p.Header.Data.Datalen) : any.Msglen]}
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/route_ifma_test.go b/third_party/gofrontend/libgo/go/syscall/route_ifma_test.go
deleted file mode 100644
index af2b67d..0000000
--- a/third_party/gofrontend/libgo/go/syscall/route_ifma_test.go
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd
-
-package syscall_test
-
-import (
-	"fmt"
-	"syscall"
-)
-
-func parseRoutingMessageHeader(m syscall.RoutingMessage) (addrFlags, error) {
-	switch m := m.(type) {
-	case *syscall.RouteMessage:
-		errno := syscall.Errno(uintptr(m.Header.Errno))
-		if errno != 0 {
-			return 0, fmt.Errorf("%T: %v, %#v", m, errno, m.Header)
-		}
-		return addrFlags(m.Header.Addrs), nil
-	case *syscall.InterfaceMessage:
-		return addrFlags(m.Header.Addrs), nil
-	case *syscall.InterfaceAddrMessage:
-		return addrFlags(m.Header.Addrs), nil
-	case *syscall.InterfaceMulticastAddrMessage:
-		return addrFlags(m.Header.Addrs), nil
-	default:
-		panic(fmt.Sprintf("unknown routing message type: %T", m))
-	}
-}
-
-func parseRoutingSockaddrs(m syscall.RoutingMessage) ([]syscall.Sockaddr, error) {
-	switch m := m.(type) {
-	case *syscall.RouteMessage:
-		sas, err := syscall.ParseRoutingSockaddr(m)
-		if err != nil {
-			return nil, fmt.Errorf("%T: %v, %#v", m, err, m.Data)
-		}
-		if err = sockaddrs(sas).match(addrFlags(m.Header.Addrs)); err != nil {
-			return nil, err
-		}
-		return sas, nil
-	case *syscall.InterfaceMessage:
-		sas, err := syscall.ParseRoutingSockaddr(m)
-		if err != nil {
-			return nil, fmt.Errorf("%T: %v, %#v", m, err, m.Data)
-		}
-		if err = sockaddrs(sas).match(addrFlags(m.Header.Addrs)); err != nil {
-			return nil, err
-		}
-		return sas, nil
-	case *syscall.InterfaceAddrMessage:
-		sas, err := syscall.ParseRoutingSockaddr(m)
-		if err != nil {
-			return nil, fmt.Errorf("%T: %v, %#v", m, err, m.Data)
-		}
-		if err = sockaddrs(sas).match(addrFlags(m.Header.Addrs)); err != nil {
-			return nil, err
-		}
-		return sas, nil
-	case *syscall.InterfaceMulticastAddrMessage:
-		sas, err := syscall.ParseRoutingSockaddr(m)
-		if err != nil {
-			return nil, fmt.Errorf("%T: %v, %#v", m, err, m.Data)
-		}
-		if err = sockaddrs(sas).match(addrFlags(m.Header.Addrs)); err != nil {
-			return nil, err
-		}
-		return sas, nil
-	default:
-		panic(fmt.Sprintf("unknown routing message type: %T", m))
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/route_netbsd.go b/third_party/gofrontend/libgo/go/syscall/route_netbsd.go
deleted file mode 100644
index d605ffa..0000000
--- a/third_party/gofrontend/libgo/go/syscall/route_netbsd.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-import "unsafe"
-
-func (any *anyMessage) toRoutingMessage(b []byte) RoutingMessage {
-	switch any.Type {
-	case RTM_ADD, RTM_DELETE, RTM_CHANGE, RTM_GET, RTM_LOSING, RTM_REDIRECT, RTM_MISS, RTM_LOCK, RTM_RESOLVE:
-		p := (*RouteMessage)(unsafe.Pointer(any))
-		// We don't support sockaddr_mpls for now.
-		p.Header.Addrs &= RTA_DST | RTA_GATEWAY | RTA_NETMASK | RTA_GENMASK | RTA_IFA | RTA_IFP | RTA_BRD | RTA_AUTHOR
-		return &RouteMessage{Header: p.Header, Data: b[SizeofRtMsghdr:any.Msglen]}
-	case RTM_IFINFO:
-		p := (*InterfaceMessage)(unsafe.Pointer(any))
-		return &InterfaceMessage{Header: p.Header, Data: b[SizeofIfMsghdr:any.Msglen]}
-	case RTM_IFANNOUNCE:
-		p := (*InterfaceAnnounceMessage)(unsafe.Pointer(any))
-		return &InterfaceAnnounceMessage{Header: p.Header}
-	case RTM_NEWADDR, RTM_DELADDR:
-		p := (*InterfaceAddrMessage)(unsafe.Pointer(any))
-		return &InterfaceAddrMessage{Header: p.Header, Data: b[SizeofIfaMsghdr:any.Msglen]}
-	}
-	return nil
-}
-
-// InterfaceAnnounceMessage represents a routing message containing
-// network interface arrival and departure information.
-type InterfaceAnnounceMessage struct {
-	Header IfAnnounceMsghdr
-}
-
-func (m *InterfaceAnnounceMessage) sockaddr() ([]Sockaddr, error) { return nil, nil }
diff --git a/third_party/gofrontend/libgo/go/syscall/route_noifma_test.go b/third_party/gofrontend/libgo/go/syscall/route_noifma_test.go
deleted file mode 100644
index 19d5d8e..0000000
--- a/third_party/gofrontend/libgo/go/syscall/route_noifma_test.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build netbsd openbsd
-
-package syscall_test
-
-import (
-	"fmt"
-	"syscall"
-)
-
-func parseRoutingMessageHeader(m syscall.RoutingMessage) (addrFlags, error) {
-	switch m := m.(type) {
-	case *syscall.RouteMessage:
-		errno := syscall.Errno(uintptr(m.Header.Errno))
-		if errno != 0 {
-			return 0, fmt.Errorf("%T: %v, %#v", m, errno, m.Header)
-		}
-		return addrFlags(m.Header.Addrs), nil
-	case *syscall.InterfaceMessage:
-		return addrFlags(m.Header.Addrs), nil
-	case *syscall.InterfaceAddrMessage:
-		return addrFlags(m.Header.Addrs), nil
-	default:
-		panic(fmt.Sprintf("unknown routing message type: %T", m))
-	}
-}
-
-func parseRoutingSockaddrs(m syscall.RoutingMessage) ([]syscall.Sockaddr, error) {
-	switch m := m.(type) {
-	case *syscall.RouteMessage:
-		sas, err := syscall.ParseRoutingSockaddr(m)
-		if err != nil {
-			return nil, fmt.Errorf("%T: %v, %#v", m, err, m.Data)
-		}
-		if err = sockaddrs(sas).match(addrFlags(m.Header.Addrs)); err != nil {
-			return nil, err
-		}
-		return sas, nil
-	case *syscall.InterfaceMessage:
-		sas, err := syscall.ParseRoutingSockaddr(m)
-		if err != nil {
-			return nil, fmt.Errorf("%T: %v, %#v", m, err, m.Data)
-		}
-		if err = sockaddrs(sas).match(addrFlags(m.Header.Addrs)); err != nil {
-			return nil, err
-		}
-		return sas, nil
-	case *syscall.InterfaceAddrMessage:
-		sas, err := syscall.ParseRoutingSockaddr(m)
-		if err != nil {
-			return nil, fmt.Errorf("%T: %v, %#v", m, err, m.Data)
-		}
-		if err = sockaddrs(sas).match(addrFlags(m.Header.Addrs)); err != nil {
-			return nil, err
-		}
-		return sas, nil
-	default:
-		panic(fmt.Sprintf("unknown routing message type: %T", m))
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/route_openbsd.go b/third_party/gofrontend/libgo/go/syscall/route_openbsd.go
deleted file mode 100644
index 7804a08..0000000
--- a/third_party/gofrontend/libgo/go/syscall/route_openbsd.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-import "unsafe"
-
-func (any *anyMessage) toRoutingMessage(b []byte) RoutingMessage {
-	switch any.Type {
-	case RTM_ADD, RTM_DELETE, RTM_CHANGE, RTM_GET, RTM_LOSING, RTM_REDIRECT, RTM_MISS, RTM_LOCK, RTM_RESOLVE:
-		p := (*RouteMessage)(unsafe.Pointer(any))
-		// We don't support sockaddr_rtlabel for now.
-		p.Header.Addrs &= RTA_DST | RTA_GATEWAY | RTA_NETMASK | RTA_GENMASK | RTA_IFA | RTA_IFP | RTA_BRD | RTA_AUTHOR | RTA_SRC | RTA_SRCMASK
-		return &RouteMessage{Header: p.Header, Data: b[p.Header.Hdrlen:any.Msglen]}
-	case RTM_IFINFO:
-		p := (*InterfaceMessage)(unsafe.Pointer(any))
-		return &InterfaceMessage{Header: p.Header, Data: b[p.Header.Hdrlen:any.Msglen]}
-	case RTM_IFANNOUNCE:
-		p := (*InterfaceAnnounceMessage)(unsafe.Pointer(any))
-		return &InterfaceAnnounceMessage{Header: p.Header}
-	case RTM_NEWADDR, RTM_DELADDR:
-		p := (*InterfaceAddrMessage)(unsafe.Pointer(any))
-		return &InterfaceAddrMessage{Header: p.Header, Data: b[p.Header.Hdrlen:any.Msglen]}
-	}
-	return nil
-}
-
-// InterfaceAnnounceMessage represents a routing message containing
-// network interface arrival and departure information.
-type InterfaceAnnounceMessage struct {
-	Header IfAnnounceMsghdr
-}
-
-func (m *InterfaceAnnounceMessage) sockaddr() ([]Sockaddr, error) { return nil, nil }
diff --git a/third_party/gofrontend/libgo/go/syscall/security_windows.go b/third_party/gofrontend/libgo/go/syscall/security_windows.go
deleted file mode 100644
index 1625b07..0000000
--- a/third_party/gofrontend/libgo/go/syscall/security_windows.go
+++ /dev/null
@@ -1,376 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-import (
-	"unsafe"
-)
-
-const (
-	STANDARD_RIGHTS_REQUIRED = 0xf0000
-	STANDARD_RIGHTS_READ     = 0x20000
-	STANDARD_RIGHTS_WRITE    = 0x20000
-	STANDARD_RIGHTS_EXECUTE  = 0x20000
-	STANDARD_RIGHTS_ALL      = 0x1F0000
-)
-
-const (
-	NameUnknown          = 0
-	NameFullyQualifiedDN = 1
-	NameSamCompatible    = 2
-	NameDisplay          = 3
-	NameUniqueId         = 6
-	NameCanonical        = 7
-	NameUserPrincipal    = 8
-	NameCanonicalEx      = 9
-	NameServicePrincipal = 10
-	NameDnsDomain        = 12
-)
-
-// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL.
-// http://blogs.msdn.com/b/drnick/archive/2007/12/19/windows-and-upn-format-credentials.aspx
-//sys	TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.TranslateNameW
-//sys	GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.GetUserNameExW
-
-// TranslateAccountName converts a directory service
-// object name from one format to another.
-func TranslateAccountName(username string, from, to uint32, initSize int) (string, error) {
-	u, e := UTF16PtrFromString(username)
-	if e != nil {
-		return "", e
-	}
-	n := uint32(50)
-	for {
-		b := make([]uint16, n)
-		e = TranslateName(u, from, to, &b[0], &n)
-		if e == nil {
-			return UTF16ToString(b[:n]), nil
-		}
-		if e != ERROR_INSUFFICIENT_BUFFER {
-			return "", e
-		}
-		if n <= uint32(len(b)) {
-			return "", e
-		}
-	}
-}
-
-const (
-	// do not reorder
-	NetSetupUnknownStatus = iota
-	NetSetupUnjoined
-	NetSetupWorkgroupName
-	NetSetupDomainName
-)
-
-type UserInfo10 struct {
-	Name       *uint16
-	Comment    *uint16
-	UsrComment *uint16
-	FullName   *uint16
-}
-
-//sys	NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) = netapi32.NetUserGetInfo
-//sys	NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) = netapi32.NetGetJoinInformation
-//sys	NetApiBufferFree(buf *byte) (neterr error) = netapi32.NetApiBufferFree
-
-const (
-	// do not reorder
-	SidTypeUser = 1 + iota
-	SidTypeGroup
-	SidTypeDomain
-	SidTypeAlias
-	SidTypeWellKnownGroup
-	SidTypeDeletedAccount
-	SidTypeInvalid
-	SidTypeUnknown
-	SidTypeComputer
-	SidTypeLabel
-)
-
-//sys	LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountSidW
-//sys	LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountNameW
-//sys	ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) = advapi32.ConvertSidToStringSidW
-//sys	ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) = advapi32.ConvertStringSidToSidW
-//sys	GetLengthSid(sid *SID) (len uint32) = advapi32.GetLengthSid
-//sys	CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid
-
-// The security identifier (SID) structure is a variable-length
-// structure used to uniquely identify users or groups.
-type SID struct{}
-
-// StringToSid converts a string-format security identifier
-// sid into a valid, functional sid.
-func StringToSid(s string) (*SID, error) {
-	var sid *SID
-	p, e := UTF16PtrFromString(s)
-	if e != nil {
-		return nil, e
-	}
-	e = ConvertStringSidToSid(p, &sid)
-	if e != nil {
-		return nil, e
-	}
-	defer LocalFree((Handle)(unsafe.Pointer(sid)))
-	return sid.Copy()
-}
-
-// LookupSID retrieves a security identifier sid for the account
-// and the name of the domain on which the account was found.
-// System specify target computer to search.
-func LookupSID(system, account string) (sid *SID, domain string, accType uint32, err error) {
-	if len(account) == 0 {
-		return nil, "", 0, EINVAL
-	}
-	acc, e := UTF16PtrFromString(account)
-	if e != nil {
-		return nil, "", 0, e
-	}
-	var sys *uint16
-	if len(system) > 0 {
-		sys, e = UTF16PtrFromString(system)
-		if e != nil {
-			return nil, "", 0, e
-		}
-	}
-	n := uint32(50)
-	dn := uint32(50)
-	for {
-		b := make([]byte, n)
-		db := make([]uint16, dn)
-		sid = (*SID)(unsafe.Pointer(&b[0]))
-		e = LookupAccountName(sys, acc, sid, &n, &db[0], &dn, &accType)
-		if e == nil {
-			return sid, UTF16ToString(db), accType, nil
-		}
-		if e != ERROR_INSUFFICIENT_BUFFER {
-			return nil, "", 0, e
-		}
-		if n <= uint32(len(b)) {
-			return nil, "", 0, e
-		}
-	}
-}
-
-// String converts sid to a string format
-// suitable for display, storage, or transmission.
-func (sid *SID) String() (string, error) {
-	var s *uint16
-	e := ConvertSidToStringSid(sid, &s)
-	if e != nil {
-		return "", e
-	}
-	defer LocalFree((Handle)(unsafe.Pointer(s)))
-	return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil
-}
-
-// Len returns the length, in bytes, of a valid security identifier sid.
-func (sid *SID) Len() int {
-	return int(GetLengthSid(sid))
-}
-
-// Copy creates a duplicate of security identifier sid.
-func (sid *SID) Copy() (*SID, error) {
-	b := make([]byte, sid.Len())
-	sid2 := (*SID)(unsafe.Pointer(&b[0]))
-	e := CopySid(uint32(len(b)), sid2, sid)
-	if e != nil {
-		return nil, e
-	}
-	return sid2, nil
-}
-
-// LookupAccount retrieves the name of the account for this sid
-// and the name of the first domain on which this sid is found.
-// System specify target computer to search for.
-func (sid *SID) LookupAccount(system string) (account, domain string, accType uint32, err error) {
-	var sys *uint16
-	if len(system) > 0 {
-		sys, err = UTF16PtrFromString(system)
-		if err != nil {
-			return "", "", 0, err
-		}
-	}
-	n := uint32(50)
-	dn := uint32(50)
-	for {
-		b := make([]uint16, n)
-		db := make([]uint16, dn)
-		e := LookupAccountSid(sys, sid, &b[0], &n, &db[0], &dn, &accType)
-		if e == nil {
-			return UTF16ToString(b), UTF16ToString(db), accType, nil
-		}
-		if e != ERROR_INSUFFICIENT_BUFFER {
-			return "", "", 0, e
-		}
-		if n <= uint32(len(b)) {
-			return "", "", 0, e
-		}
-	}
-}
-
-const (
-	// do not reorder
-	TOKEN_ASSIGN_PRIMARY = 1 << iota
-	TOKEN_DUPLICATE
-	TOKEN_IMPERSONATE
-	TOKEN_QUERY
-	TOKEN_QUERY_SOURCE
-	TOKEN_ADJUST_PRIVILEGES
-	TOKEN_ADJUST_GROUPS
-	TOKEN_ADJUST_DEFAULT
-
-	TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED |
-		TOKEN_ASSIGN_PRIMARY |
-		TOKEN_DUPLICATE |
-		TOKEN_IMPERSONATE |
-		TOKEN_QUERY |
-		TOKEN_QUERY_SOURCE |
-		TOKEN_ADJUST_PRIVILEGES |
-		TOKEN_ADJUST_GROUPS |
-		TOKEN_ADJUST_DEFAULT
-	TOKEN_READ  = STANDARD_RIGHTS_READ | TOKEN_QUERY
-	TOKEN_WRITE = STANDARD_RIGHTS_WRITE |
-		TOKEN_ADJUST_PRIVILEGES |
-		TOKEN_ADJUST_GROUPS |
-		TOKEN_ADJUST_DEFAULT
-	TOKEN_EXECUTE = STANDARD_RIGHTS_EXECUTE
-)
-
-const (
-	// do not reorder
-	TokenUser = 1 + iota
-	TokenGroups
-	TokenPrivileges
-	TokenOwner
-	TokenPrimaryGroup
-	TokenDefaultDacl
-	TokenSource
-	TokenType
-	TokenImpersonationLevel
-	TokenStatistics
-	TokenRestrictedSids
-	TokenSessionId
-	TokenGroupsAndPrivileges
-	TokenSessionReference
-	TokenSandBoxInert
-	TokenAuditPolicy
-	TokenOrigin
-	TokenElevationType
-	TokenLinkedToken
-	TokenElevation
-	TokenHasRestrictions
-	TokenAccessInformation
-	TokenVirtualizationAllowed
-	TokenVirtualizationEnabled
-	TokenIntegrityLevel
-	TokenUIAccess
-	TokenMandatoryPolicy
-	TokenLogonSid
-	MaxTokenInfoClass
-)
-
-type SIDAndAttributes struct {
-	Sid        *SID
-	Attributes uint32
-}
-
-type Tokenuser struct {
-	User SIDAndAttributes
-}
-
-type Tokenprimarygroup struct {
-	PrimaryGroup *SID
-}
-
-//sys	OpenProcessToken(h Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken
-//sys	GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation
-//sys	GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW
-
-// An access token contains the security information for a logon session.
-// The system creates an access token when a user logs on, and every
-// process executed on behalf of the user has a copy of the token.
-// The token identifies the user, the user's groups, and the user's
-// privileges. The system uses the token to control access to securable
-// objects and to control the ability of the user to perform various
-// system-related operations on the local computer.
-type Token Handle
-
-// OpenCurrentProcessToken opens the access token
-// associated with current process.
-func OpenCurrentProcessToken() (Token, error) {
-	p, e := GetCurrentProcess()
-	if e != nil {
-		return 0, e
-	}
-	var t Token
-	e = OpenProcessToken(p, TOKEN_QUERY, &t)
-	if e != nil {
-		return 0, e
-	}
-	return t, nil
-}
-
-// Close releases access to access token.
-func (t Token) Close() error {
-	return CloseHandle(Handle(t))
-}
-
-// getInfo retrieves a specified type of information about an access token.
-func (t Token) getInfo(class uint32, initSize int) (unsafe.Pointer, error) {
-	n := uint32(initSize)
-	for {
-		b := make([]byte, n)
-		e := GetTokenInformation(t, class, &b[0], uint32(len(b)), &n)
-		if e == nil {
-			return unsafe.Pointer(&b[0]), nil
-		}
-		if e != ERROR_INSUFFICIENT_BUFFER {
-			return nil, e
-		}
-		if n <= uint32(len(b)) {
-			return nil, e
-		}
-	}
-}
-
-// GetTokenUser retrieves access token t user account information.
-func (t Token) GetTokenUser() (*Tokenuser, error) {
-	i, e := t.getInfo(TokenUser, 50)
-	if e != nil {
-		return nil, e
-	}
-	return (*Tokenuser)(i), nil
-}
-
-// GetTokenPrimaryGroup retrieves access token t primary group information.
-// A pointer to a SID structure representing a group that will become
-// the primary group of any objects created by a process using this access token.
-func (t Token) GetTokenPrimaryGroup() (*Tokenprimarygroup, error) {
-	i, e := t.getInfo(TokenPrimaryGroup, 50)
-	if e != nil {
-		return nil, e
-	}
-	return (*Tokenprimarygroup)(i), nil
-}
-
-// GetUserProfileDirectory retrieves path to the
-// root directory of the access token t user's profile.
-func (t Token) GetUserProfileDirectory() (string, error) {
-	n := uint32(100)
-	for {
-		b := make([]uint16, n)
-		e := GetUserProfileDirectory(t, &b[0], &n)
-		if e == nil {
-			return UTF16ToString(b), nil
-		}
-		if e != ERROR_INSUFFICIENT_BUFFER {
-			return "", e
-		}
-		if n <= uint32(len(b)) {
-			return "", e
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/signame.c b/third_party/gofrontend/libgo/go/syscall/signame.c
deleted file mode 100644
index 0453c06..0000000
--- a/third_party/gofrontend/libgo/go/syscall/signame.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* signame.c -- get the name of a signal
-
-   Copyright 2012 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <string.h>
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-String Signame (intgo sig) __asm__ (GOSYM_PREFIX "syscall.Signame");
-
-String
-Signame (intgo sig)
-{
-  const char* s = NULL;
-  char buf[100];
-  size_t len;
-  byte *data;
-  String ret;
-
-#if defined(HAVE_STRSIGNAL)
-  s = strsignal (sig);
-#endif
-
-  if (s == NULL)
-    {
-      snprintf(buf, sizeof buf, "signal %ld", (long) sig);
-      s = buf;
-    }
-  len = __builtin_strlen (s);
-  data = runtime_mallocgc (len, 0, FlagNoScan);
-  __builtin_memcpy (data, s, len);
-  ret.str = data;
-  ret.len = len;
-  return ret;
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/sleep_rtems.go b/third_party/gofrontend/libgo/go/syscall/sleep_rtems.go
deleted file mode 100644
index 9d72203..0000000
--- a/third_party/gofrontend/libgo/go/syscall/sleep_rtems.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// sleep_rtems.go -- Sleep on RTEMS.
-
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-func Sleep(nsec int64) (err error) {
-	ts := NsecToTimespec(nsec)
-	err = Nanosleep(&ts, nil)
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/sleep_select.go b/third_party/gofrontend/libgo/go/syscall/sleep_select.go
deleted file mode 100644
index 533f554..0000000
--- a/third_party/gofrontend/libgo/go/syscall/sleep_select.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// sleep_select.go -- Sleep using select.
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-func Sleep(nsec int64) (err error) {
-	tv := NsecToTimeval(nsec);
-	_, err = Select(0, nil, nil, nil, &tv);
-	return err;
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/sockcmsg_linux.go b/third_party/gofrontend/libgo/go/syscall/sockcmsg_linux.go
deleted file mode 100644
index a2e26a1..0000000
--- a/third_party/gofrontend/libgo/go/syscall/sockcmsg_linux.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Socket control messages
-
-package syscall
-
-import "unsafe"
-
-// UnixCredentials encodes credentials into a socket control message
-// for sending to another process. This can be used for
-// authentication.
-func UnixCredentials(ucred *Ucred) []byte {
-	b := make([]byte, CmsgSpace(SizeofUcred))
-	h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
-	h.Level = SOL_SOCKET
-	h.Type = SCM_CREDENTIALS
-	h.SetLen(CmsgLen(SizeofUcred))
-	*((*Ucred)(cmsgData(h))) = *ucred
-	return b
-}
-
-// ParseUnixCredentials decodes a socket control message that contains
-// credentials in a Ucred structure. To receive such a message, the
-// SO_PASSCRED option must be enabled on the socket.
-func ParseUnixCredentials(m *SocketControlMessage) (*Ucred, error) {
-	if m.Header.Level != SOL_SOCKET {
-		return nil, EINVAL
-	}
-	if m.Header.Type != SCM_CREDENTIALS {
-		return nil, EINVAL
-	}
-	ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0]))
-	return &ucred, nil
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/sockcmsg_unix.go b/third_party/gofrontend/libgo/go/syscall/sockcmsg_unix.go
deleted file mode 100644
index 34c707d..0000000
--- a/third_party/gofrontend/libgo/go/syscall/sockcmsg_unix.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-// Socket control messages
-
-package syscall
-
-import (
-	"runtime"
-	"unsafe"
-)
-
-// Round the length of a raw sockaddr up to align it properly.
-func cmsgAlignOf(salen int) int {
-	salign := int(sizeofPtr)
-	// NOTE: It seems like 64-bit Darwin and DragonFly BSD kernels
-	// still require 32-bit aligned access to network subsystem.
-	if darwin64Bit || dragonfly64Bit {
-		salign = 4
-	}
-	// NOTE: Solaris always uses 32-bit alignment,
-	// cf. _CMSG_DATA_ALIGNMENT in <sys/socket.h>.
-	if runtime.GOOS == "solaris" {
-		salign = 4
-	}
-	return (salen + salign - 1) & ^(salign - 1)
-}
-
-// CmsgLen returns the value to store in the Len field of the Cmsghdr
-// structure, taking into account any necessary alignment.
-func CmsgLen(datalen int) int {
-	return cmsgAlignOf(SizeofCmsghdr) + datalen
-}
-
-// CmsgSpace returns the number of bytes an ancillary element with
-// payload of the passed data length occupies.
-func CmsgSpace(datalen int) int {
-	return cmsgAlignOf(SizeofCmsghdr) + cmsgAlignOf(datalen)
-}
-
-func cmsgData(h *Cmsghdr) unsafe.Pointer {
-	return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr)))
-}
-
-// SocketControlMessage represents a socket control message.
-type SocketControlMessage struct {
-	Header Cmsghdr
-	Data   []byte
-}
-
-// ParseSocketControlMessage parses b as an array of socket control
-// messages.
-func ParseSocketControlMessage(b []byte) ([]SocketControlMessage, error) {
-	var msgs []SocketControlMessage
-	i := 0
-	for i+CmsgLen(0) <= len(b) {
-		h, dbuf, err := socketControlMessageHeaderAndData(b[i:])
-		if err != nil {
-			return nil, err
-		}
-		m := SocketControlMessage{Header: *h, Data: dbuf}
-		msgs = append(msgs, m)
-		i += cmsgAlignOf(int(h.Len))
-	}
-	return msgs, nil
-}
-
-func socketControlMessageHeaderAndData(b []byte) (*Cmsghdr, []byte, error) {
-	h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
-	if h.Len < SizeofCmsghdr || int(h.Len) > len(b) {
-		return nil, nil, EINVAL
-	}
-	return h, b[cmsgAlignOf(SizeofCmsghdr):h.Len], nil
-}
-
-// UnixRights encodes a set of open file descriptors into a socket
-// control message for sending to another process.
-func UnixRights(fds ...int) []byte {
-	datalen := len(fds) * 4
-	b := make([]byte, CmsgSpace(datalen))
-	h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
-	h.Level = SOL_SOCKET
-	h.Type = SCM_RIGHTS
-	h.SetLen(CmsgLen(datalen))
-	data := uintptr(cmsgData(h))
-	for _, fd := range fds {
-		*(*int32)(unsafe.Pointer(data)) = int32(fd)
-		data += 4
-	}
-	return b
-}
-
-// ParseUnixRights decodes a socket control message that contains an
-// integer array of open file descriptors from another process.
-func ParseUnixRights(m *SocketControlMessage) ([]int, error) {
-	if m.Header.Level != SOL_SOCKET {
-		return nil, EINVAL
-	}
-	if m.Header.Type != SCM_RIGHTS {
-		return nil, EINVAL
-	}
-	fds := make([]int, len(m.Data)>>2)
-	for i, j := 0, 0; i < len(m.Data); i += 4 {
-		fds[j] = int(*(*int32)(unsafe.Pointer(&m.Data[i])))
-		j++
-	}
-	return fds, nil
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/socket.go b/third_party/gofrontend/libgo/go/syscall/socket.go
deleted file mode 100644
index d96a717..0000000
--- a/third_party/gofrontend/libgo/go/syscall/socket.go
+++ /dev/null
@@ -1,421 +0,0 @@
-// socket.go -- Socket handling.
-
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Low-level socket interface.
-// Only for implementing net package.
-// DO NOT USE DIRECTLY.
-
-package syscall
-
-import "unsafe"
-
-// For testing: clients can set this flag to force
-// creation of IPv6 sockets to return EAFNOSUPPORT.
-var SocketDisableIPv6 bool
-
-type Sockaddr interface {
-	sockaddr() (ptr *RawSockaddrAny, len Socklen_t, err error) // lowercase; only we can define Sockaddrs
-}
-
-type RawSockaddrAny struct {
-	Addr RawSockaddr
-	Pad  [96]int8
-}
-
-const SizeofSockaddrAny = 0x6c
-
-type SockaddrInet4 struct {
-	Port int
-	Addr [4]byte
-	raw  RawSockaddrInet4
-}
-
-func (sa *SockaddrInet4) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
-	if sa.Port < 0 || sa.Port > 0xFFFF {
-		return nil, 0, EINVAL
-	}
-	sa.raw.Family = AF_INET
-	n := sa.raw.setLen()
-	p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
-	p[0] = byte(sa.Port >> 8)
-	p[1] = byte(sa.Port)
-	for i := 0; i < len(sa.Addr); i++ {
-		sa.raw.Addr[i] = sa.Addr[i]
-	}
-	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), n, nil
-}
-
-type SockaddrInet6 struct {
-	Port   int
-	ZoneId uint32
-	Addr   [16]byte
-	raw    RawSockaddrInet6
-}
-
-func (sa *SockaddrInet6) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
-	if sa.Port < 0 || sa.Port > 0xFFFF {
-		return nil, 0, EINVAL
-	}
-	sa.raw.Family = AF_INET6
-	n := sa.raw.setLen()
-	p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
-	p[0] = byte(sa.Port >> 8)
-	p[1] = byte(sa.Port)
-	sa.raw.Scope_id = sa.ZoneId
-	for i := 0; i < len(sa.Addr); i++ {
-		sa.raw.Addr[i] = sa.Addr[i]
-	}
-	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), n, nil
-}
-
-type SockaddrUnix struct {
-	Name string
-	raw  RawSockaddrUnix
-}
-
-func (sa *SockaddrUnix) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
-	name := sa.Name
-	n := len(name)
-	if n >= len(sa.raw.Path) {
-		return nil, 0, EINVAL
-	}
-	sa.raw.Family = AF_UNIX
-	sa.raw.setLen(n)
-	for i := 0; i < n; i++ {
-		sa.raw.Path[i] = int8(name[i])
-	}
-	// length is family (uint16), name, NUL.
-	sl := Socklen_t(2)
-	if n > 0 {
-		sl += Socklen_t(n) + 1
-	}
-	sl = sa.raw.adjustAbstract(sl)
-
-	// length is family (uint16), name, NUL.
-	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), sl, nil
-}
-
-func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {
-	switch rsa.Addr.Family {
-	case AF_UNIX:
-		pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
-		sa := new(SockaddrUnix)
-		n, err := pp.getLen()
-		if err != nil {
-			return nil, err
-		}
-		bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))
-		sa.Name = string(bytes[0:n])
-		return sa, nil
-
-	case AF_INET:
-		pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
-		sa := new(SockaddrInet4)
-		p := (*[2]byte)(unsafe.Pointer(&pp.Port))
-		sa.Port = int(p[0])<<8 + int(p[1])
-		for i := 0; i < len(sa.Addr); i++ {
-			sa.Addr[i] = pp.Addr[i]
-		}
-		return sa, nil
-
-	case AF_INET6:
-		pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
-		sa := new(SockaddrInet6)
-		p := (*[2]byte)(unsafe.Pointer(&pp.Port))
-		sa.Port = int(p[0])<<8 + int(p[1])
-		for i := 0; i < len(sa.Addr); i++ {
-			sa.Addr[i] = pp.Addr[i]
-		}
-		return sa, nil
-	}
-	return anyToSockaddrOS(rsa)
-}
-
-//sys	accept(fd int, sa *RawSockaddrAny, len *Socklen_t) (nfd int, err error)
-//accept(fd _C_int, sa *RawSockaddrAny, len *Socklen_t) _C_int
-
-func Accept(fd int) (nfd int, sa Sockaddr, err error) {
-	var rsa RawSockaddrAny
-	var len Socklen_t = SizeofSockaddrAny
-	nfd, err = accept(fd, &rsa, &len)
-	if err != nil {
-		return
-	}
-	sa, err = anyToSockaddr(&rsa)
-	if err != nil {
-		Close(nfd)
-		nfd = 0
-	}
-	return
-}
-
-//sysnb	getsockname(fd int, sa *RawSockaddrAny, len *Socklen_t) (err error)
-//getsockname(fd _C_int, sa *RawSockaddrAny, len *Socklen_t) _C_int
-
-func Getsockname(fd int) (sa Sockaddr, err error) {
-	var rsa RawSockaddrAny
-	var len Socklen_t = SizeofSockaddrAny
-	if err = getsockname(fd, &rsa, &len); err != nil {
-		return
-	}
-	return anyToSockaddr(&rsa)
-}
-
-//sysnb getpeername(fd int, sa *RawSockaddrAny, len *Socklen_t) (err error)
-//getpeername(fd _C_int, sa *RawSockaddrAny, len *Socklen_t) _C_int
-
-func Getpeername(fd int) (sa Sockaddr, err error) {
-	var rsa RawSockaddrAny
-	var len Socklen_t = SizeofSockaddrAny
-	if err = getpeername(fd, &rsa, &len); err != nil {
-		return
-	}
-	return anyToSockaddr(&rsa)
-}
-
-func Bind(fd int, sa Sockaddr) (err error) {
-	ptr, n, err := sa.sockaddr()
-	if err != nil {
-		return err
-	}
-	return bind(fd, ptr, n)
-}
-
-func Connect(fd int, sa Sockaddr) (err error) {
-	ptr, n, err := sa.sockaddr()
-	if err != nil {
-		return err
-	}
-	return connect(fd, ptr, n)
-}
-
-func Socket(domain, typ, proto int) (fd int, err error) {
-	if domain == AF_INET6 && SocketDisableIPv6 {
-		return -1, EAFNOSUPPORT
-	}
-	fd, err = socket(domain, typ, proto)
-	return
-}
-
-func Socketpair(domain, typ, proto int) (fd [2]int, err error) {
-	var fdx [2]_C_int
-	err = socketpair(domain, typ, proto, &fdx)
-	if err == nil {
-		fd[0] = int(fdx[0])
-		fd[1] = int(fdx[1])
-	}
-	return
-}
-
-func GetsockoptByte(fd, level, opt int) (value byte, err error) {
-	var n byte
-	vallen := Socklen_t(1)
-	err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
-	return n, err
-}
-
-func GetsockoptInt(fd, level, opt int) (value int, err error) {
-	var n int32
-	vallen := Socklen_t(4)
-	err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
-	return int(n), err
-}
-
-func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) {
-	vallen := Socklen_t(4)
-	err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen)
-	return value, err
-}
-
-func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) {
-	var value IPMreq
-	vallen := Socklen_t(SizeofIPMreq)
-	err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
-	return &value, err
-}
-
-func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) {
-	var value IPMreqn
-	vallen := Socklen_t(SizeofIPMreqn)
-	err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
-	return &value, err
-}
-
-func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) {
-	var value IPv6Mreq
-	vallen := Socklen_t(SizeofIPv6Mreq)
-	err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
-	return &value, err
-}
-
-//sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen Socklen_t) (err error)
-//setsockopt(s _C_int, level _C_int, optname _C_int, val *byte, vallen Socklen_t) _C_int
-
-func SetsockoptByte(fd, level, opt int, value byte) (err error) {
-	var n = byte(value)
-	return setsockopt(fd, level, opt, unsafe.Pointer(&n), 1)
-}
-
-func SetsockoptInt(fd, level, opt int, value int) (err error) {
-	var n = int32(value)
-	return setsockopt(fd, level, opt, unsafe.Pointer(&n), 4)
-}
-
-func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) {
-	return setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4)
-}
-
-func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) {
-	return setsockopt(fd, level, opt, unsafe.Pointer(tv), Socklen_t(unsafe.Sizeof(*tv)))
-}
-
-func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error {
-	return setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter)
-}
-
-type Linger struct {
-	Onoff  int32
-	Linger int32
-}
-
-func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) {
-	return setsockopt(fd, level, opt, unsafe.Pointer(l), Socklen_t(unsafe.Sizeof(*l)))
-}
-
-func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) {
-	return setsockopt(fd, level, opt, unsafe.Pointer(mreq), Socklen_t(unsafe.Sizeof(*mreq)))
-}
-
-func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) {
-	return setsockopt(fd, level, opt, unsafe.Pointer(mreq), Socklen_t(unsafe.Sizeof(*mreq)))
-}
-
-func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) {
-	return setsockopt(fd, level, opt, unsafe.Pointer(mreq), Socklen_t(unsafe.Sizeof(*mreq)))
-}
-
-func SetsockoptString(fd, level, opt int, s string) (err error) {
-	return setsockopt(fd, level, opt, unsafe.Pointer(&[]byte(s)[0]), Socklen_t(len(s)))
-}
-
-//sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *Socklen_t) (n int, err error)
-//recvfrom(fd _C_int, buf *byte, len Size_t, flags _C_int, from *RawSockaddrAny, fromlen *Socklen_t) Ssize_t
-
-func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {
-	var rsa RawSockaddrAny
-	var len Socklen_t = SizeofSockaddrAny
-	if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil {
-		return
-	}
-	if rsa.Addr.Family != AF_UNSPEC {
-		from, err = anyToSockaddr(&rsa)
-	}
-	return
-}
-
-func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) {
-	ptr, n, err := to.sockaddr()
-	if err != nil {
-		return err
-	}
-	return sendto(fd, p, flags, ptr, n)
-}
-
-func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
-	var msg Msghdr
-	var rsa RawSockaddrAny
-	msg.Name = (*byte)(unsafe.Pointer(&rsa))
-	msg.Namelen = uint32(SizeofSockaddrAny)
-	var iov Iovec
-	if len(p) > 0 {
-		iov.Base = (*byte)(unsafe.Pointer(&p[0]))
-		iov.SetLen(len(p))
-	}
-	var dummy byte
-	if len(oob) > 0 {
-		// receive at least one normal byte
-		if len(p) == 0 {
-			iov.Base = &dummy
-			iov.SetLen(1)
-		}
-		msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
-		msg.SetControllen(len(oob))
-	}
-	msg.Iov = &iov
-	msg.Iovlen = 1
-	if n, err = recvmsg(fd, &msg, flags); err != nil {
-		return
-	}
-	oobn = int(msg.Controllen)
-	recvflags = int(msg.Flags)
-	// source address is only specified if the socket is unconnected
-	if rsa.Addr.Family != AF_UNSPEC {
-		from, err = anyToSockaddr(&rsa)
-	}
-	return
-}
-
-func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
-	_, err = SendmsgN(fd, p, oob, to, flags)
-	return
-}
-
-func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
-	var ptr *RawSockaddrAny
-	var salen Socklen_t
-	if to != nil {
-		var err error
-		ptr, salen, err = to.sockaddr()
-		if err != nil {
-			return 0, err
-		}
-	}
-	var msg Msghdr
-	msg.Name = (*byte)(unsafe.Pointer(ptr))
-	msg.Namelen = uint32(salen)
-	var iov Iovec
-	if len(p) > 0 {
-		iov.Base = (*byte)(unsafe.Pointer(&p[0]))
-		iov.SetLen(len(p))
-	}
-	var dummy byte
-	if len(oob) > 0 {
-		// send at least one normal byte
-		if len(p) == 0 {
-			iov.Base = &dummy
-			iov.SetLen(1)
-		}
-		msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
-		msg.SetControllen(len(oob))
-	}
-	msg.Iov = &iov
-	msg.Iovlen = 1
-	if n, err = sendmsg(fd, &msg, flags); err != nil {
-		return 0, err
-	}
-	if len(oob) > 0 && len(p) == 0 {
-		n = 0
-	}
-	return n, nil
-}
-
-//sys	Listen(fd int, n int) (err error)
-//listen(fd _C_int, n _C_int) _C_int
-
-//sys	Shutdown(fd int, how int) (err error)
-//shutdown(fd _C_int, how _C_int) _C_int
-
-func (iov *Iovec) SetLen(length int) {
-	iov.Len = Iovec_len_t(length)
-}
-
-func (msghdr *Msghdr) SetControllen(length int) {
-	msghdr.Controllen = Msghdr_controllen_t(length)
-}
-
-func (cmsg *Cmsghdr) SetLen(length int) {
-	cmsg.Len = Cmsghdr_len_t(length)
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/socket_bsd.go b/third_party/gofrontend/libgo/go/syscall/socket_bsd.go
deleted file mode 100644
index 72d7180..0000000
--- a/third_party/gofrontend/libgo/go/syscall/socket_bsd.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// socket_bsd.go -- Socket handling specific to *BSD based systems.
-
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-const SizeofSockaddrInet4 = 16
-const SizeofSockaddrInet6 = 28
-const SizeofSockaddrUnix = 110
-
-type RawSockaddrInet4 struct {
-	Len    uint8
-	Family uint8
-	Port   uint16
-	Addr   [4]byte /* in_addr */
-	Zero   [8]uint8
-}
-
-func (sa *RawSockaddrInet4) setLen() Socklen_t {
-	sa.Len = SizeofSockaddrInet4
-	return SizeofSockaddrInet4
-}
-
-type RawSockaddrInet6 struct {
-	Len      uint8
-	Family   uint8
-	Port     uint16
-	Flowinfo uint32
-	Addr     [16]byte /* in6_addr */
-	Scope_id uint32
-}
-
-func (sa *RawSockaddrInet6) setLen() Socklen_t {
-	sa.Len = SizeofSockaddrInet6
-	return SizeofSockaddrInet6
-}
-
-type RawSockaddrUnix struct {
-	Len    uint8
-	Family uint8
-	Path   [108]int8
-}
-
-func (sa *RawSockaddrUnix) setLen(n int) {
-	sa.Len = uint8(3 + n) // 2 for Family, Len; 1 for NUL.
-}
-
-func (sa *RawSockaddrUnix) getLen() (int, error) {
-	if sa.Len < 3 || sa.Len > SizeofSockaddrUnix {
-		return 0, EINVAL
-	}
-	n := int(sa.Len) - 3 // subtract leading Family, Len, terminating NUL.
-	for i := 0; i < n; i++ {
-		if sa.Path[i] == 0 {
-			// found early NUL; assume Len is overestimating.
-			n = i
-			break
-		}
-	}
-	return n, nil
-}
-
-func (sa *RawSockaddrUnix) adjustAbstract(sl Socklen_t) Socklen_t {
-	return sl
-}
-
-type RawSockaddr struct {
-	Len    uint8
-	Family uint8
-	Data   [14]int8
-}
-
-// BindToDevice binds the socket associated with fd to device.
-func BindToDevice(fd int, device string) (err error) {
-	return ENOSYS
-}
-
-func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, error) {
-	return nil, EAFNOSUPPORT
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/socket_irix.go b/third_party/gofrontend/libgo/go/syscall/socket_irix.go
deleted file mode 100644
index bcd1781..0000000
--- a/third_party/gofrontend/libgo/go/syscall/socket_irix.go
+++ /dev/null
@@ -1,134 +0,0 @@
-// socket_irix.go -- Socket handling specific to IRIX 6.
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-const SizeofSockaddrInet4 = 16
-const SizeofSockaddrInet6 = 28
-const SizeofSockaddrUnix = 110
-
-type RawSockaddrInet4 struct {
-	Family uint16
-	Port   uint16
-	Addr   [4]byte /* in_addr */
-	Zero   [8]uint8
-}
-
-func (sa *RawSockaddrInet4) setLen() Socklen_t {
-	return SizeofSockaddrInet4
-}
-
-type RawSockaddrInet6 struct {
-	Family   uint16
-	Port     uint16
-	Flowinfo uint32
-	Addr     [16]byte /* in6_addr */
-	Scope_id uint32
-}
-
-func (sa *RawSockaddrInet6) setLen() Socklen_t {
-	return SizeofSockaddrInet6
-}
-
-type RawSockaddrUnix struct {
-	Family uint16
-	Path   [108]int8
-}
-
-func (sa *RawSockaddrUnix) setLen(int) {
-}
-
-func (sa *RawSockaddrUnix) getLen() (int, error) {
-	if sa.Path[0] == 0 {
-		// "Abstract" Unix domain socket.
-		// Rewrite leading NUL as @ for textual display.
-		// (This is the standard convention.)
-		// Not friendly to overwrite in place,
-		// but the callers below don't care.
-		sa.Path[0] = '@'
-	}
-
-	// Assume path ends at NUL.
-	// This is not technically the GNU/Linux semantics for
-	// abstract Unix domain sockets--they are supposed
-	// to be uninterpreted fixed-size binary blobs--but
-	// everyone uses this convention.
-	n := 0
-	for n < len(sa.Path)-3 && sa.Path[n] != 0 {
-		n++
-	}
-
-	return n, nil
-}
-
-func (sa *RawSockaddrUnix) adjustAbstract(sl Socklen_t) Socklen_t {
-	return sl
-}
-
-type RawSockaddr struct {
-	Family uint16
-	Data   [14]int8
-}
-
-// BindToDevice binds the socket associated with fd to device.
-func BindToDevice(fd int, device string) (err error) {
-	return ENOSYS
-}
-
-// <netdb.h> only provides struct addrinfo, AI_* and EAI_* if  _NO_XOPEN4
-// && _NO_XOPEN5, but -D_XOPEN_SOURCE=500 is required for msg_control etc.
-// in struct msghgr, so simply provide them here.
-type Addrinfo struct {
-	Ai_flags     int32
-	Ai_family    int32
-	Ai_socktype  int32
-	Ai_protocol  int32
-	Ai_addrlen   int32
-	Ai_canonname *uint8
-	Ai_addr      *_sockaddr
-	Ai_next      *Addrinfo
-}
-
-const (
-	AI_PASSIVE     = 0x00000001
-	AI_CANONNAME   = 0x00000002
-	AI_NUMERICHOST = 0x00000004
-	AI_NUMERICSERV = 0x00000008
-	AI_ALL         = 0x00000100
-	AI_ADDRCONFIG  = 0x00000400
-	AI_V4MAPPED    = 0x00000800
-	AI_DEFAULT     = (AI_V4MAPPED | AI_ADDRCONFIG)
-)
-
-const (
-	EAI_ADDRFAMILY = 1
-	EAI_AGAIN      = 2
-	EAI_BADFLAGS   = 3
-	EAI_FAIL       = 4
-	EAI_FAMILY     = 5
-	EAI_MEMORY     = 6
-	EAI_NODATA     = 7
-	EAI_NONAME     = 8
-	EAI_SERVICE    = 9
-	EAI_SOCKTYPE   = 10
-	EAI_SYSTEM     = 11
-	EAI_BADHINTS   = 12
-	EAI_OVERFLOW   = 13
-	EAI_MAX        = 14
-)
-
-func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, error) {
-	return nil, EAFNOSUPPORT
-}
-
-// <netinet/in.h.h> only provides IPV6_* etc. if  _NO_XOPEN4 && _NO_XOPEN5,
-// so as above simply provide them here.
-const (
-	IPV6_UNICAST_HOPS   = 48
-	IPV6_MULTICAST_IF   = IP_MULTICAST_IF
-	IPV6_MULTICAST_HOPS = IP_MULTICAST_TTL
-	IPV6_MULTICAST_LOOP = IP_MULTICAST_LOOP
-)
diff --git a/third_party/gofrontend/libgo/go/syscall/socket_linux.go b/third_party/gofrontend/libgo/go/syscall/socket_linux.go
deleted file mode 100644
index 5064e77..0000000
--- a/third_party/gofrontend/libgo/go/syscall/socket_linux.go
+++ /dev/null
@@ -1,181 +0,0 @@
-// socket_linux.go -- Socket handling specific to GNU/Linux.
-
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-import "unsafe"
-
-const SizeofSockaddrInet4 = 16
-const SizeofSockaddrInet6 = 28
-const SizeofSockaddrUnix = 110
-const SizeofSockaddrLinklayer = 20
-const SizeofSockaddrNetlink = 12
-
-type SockaddrLinklayer struct {
-	Protocol uint16
-	Ifindex  int
-	Hatype   uint16
-	Pkttype  uint8
-	Halen    uint8
-	Addr     [8]byte
-	raw      RawSockaddrLinklayer
-}
-
-func (sa *SockaddrLinklayer) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
-	if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff {
-		return nil, 0, EINVAL
-	}
-	sa.raw.Family = AF_PACKET
-	sa.raw.Protocol = sa.Protocol
-	sa.raw.Ifindex = int32(sa.Ifindex)
-	sa.raw.Hatype = sa.Hatype
-	sa.raw.Pkttype = sa.Pkttype
-	sa.raw.Halen = sa.Halen
-	for i := 0; i < len(sa.Addr); i++ {
-		sa.raw.Addr[i] = sa.Addr[i]
-	}
-	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), SizeofSockaddrLinklayer, nil
-}
-
-type SockaddrNetlink struct {
-	Family uint16
-	Pad    uint16
-	Pid    uint32
-	Groups uint32
-	raw    RawSockaddrNetlink
-}
-
-func (sa *SockaddrNetlink) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
-	sa.raw.Family = AF_NETLINK
-	sa.raw.Pad = sa.Pad
-	sa.raw.Pid = sa.Pid
-	sa.raw.Groups = sa.Groups
-	return (*RawSockaddrAny)(unsafe.Pointer(&sa.raw)), SizeofSockaddrNetlink, nil
-}
-
-type RawSockaddrInet4 struct {
-	Family uint16
-	Port   uint16
-	Addr   [4]byte /* in_addr */
-	Zero   [8]uint8
-}
-
-func (sa *RawSockaddrInet4) setLen() Socklen_t {
-	return SizeofSockaddrInet4
-}
-
-type RawSockaddrInet6 struct {
-	Family   uint16
-	Port     uint16
-	Flowinfo uint32
-	Addr     [16]byte /* in6_addr */
-	Scope_id uint32
-}
-
-func (sa *RawSockaddrInet6) setLen() Socklen_t {
-	return SizeofSockaddrInet6
-}
-
-type RawSockaddrUnix struct {
-	Family uint16
-	Path   [108]int8
-}
-
-func (sa *RawSockaddrUnix) setLen(int) {
-}
-
-func (sa *RawSockaddrUnix) getLen() (int, error) {
-	if sa.Path[0] == 0 {
-		// "Abstract" Unix domain socket.
-		// Rewrite leading NUL as @ for textual display.
-		// (This is the standard convention.)
-		// Not friendly to overwrite in place,
-		// but the callers below don't care.
-		sa.Path[0] = '@'
-	}
-
-	// Assume path ends at NUL.
-	// This is not technically the GNU/Linux semantics for
-	// abstract Unix domain sockets--they are supposed
-	// to be uninterpreted fixed-size binary blobs--but
-	// everyone uses this convention.
-	n := 0
-	for n < len(sa.Path) && sa.Path[n] != 0 {
-		n++
-	}
-
-	return n, nil
-}
-
-func (sa *RawSockaddrUnix) adjustAbstract(sl Socklen_t) Socklen_t {
-	if sa.Path[0] == '@' {
-		sa.Path[0] = 0
-		// Don't count trailing NUL for abstract address.
-		sl--
-	}
-	return sl
-}
-
-type RawSockaddrLinklayer struct {
-	Family   uint16
-	Protocol uint16
-	Ifindex  int32
-	Hatype   uint16
-	Pkttype  uint8
-	Halen    uint8
-	Addr     [8]uint8
-}
-
-type RawSockaddrNetlink struct {
-	Family uint16
-	Pad    uint16
-	Pid    uint32
-	Groups uint32
-}
-
-// BindToDevice binds the socket associated with fd to device.
-func BindToDevice(fd int, device string) (err error) {
-	return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device)
-}
-
-func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, error) {
-	switch rsa.Addr.Family {
-	case AF_NETLINK:
-		pp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa))
-		sa := new(SockaddrNetlink)
-		sa.Family = pp.Family
-		sa.Pad = pp.Pad
-		sa.Pid = pp.Pid
-		sa.Groups = pp.Groups
-		return sa, nil
-
-	case AF_PACKET:
-		pp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa))
-		sa := new(SockaddrLinklayer)
-		sa.Protocol = pp.Protocol
-		sa.Ifindex = int(pp.Ifindex)
-		sa.Hatype = pp.Hatype
-		sa.Pkttype = pp.Pkttype
-		sa.Halen = pp.Halen
-		for i := 0; i < len(sa.Addr); i++ {
-			sa.Addr[i] = pp.Addr[i]
-		}
-		return sa, nil
-	}
-	return nil, EAFNOSUPPORT
-}
-
-//sysnb	EpollCreate(size int) (fd int, err error)
-//epoll_create(size _C_int) _C_int
-
-//sysnb EpollCreate1(flags int) (fd int, err error)
-//epoll_create1(flags _C_int) _C_int
-
-//sysnb	EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error)
-//epoll_ctl(epfd _C_int, op _C_int, fd _C_int, event *EpollEvent) _C_int
-
-//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
-//epoll_wait(epfd _C_int, events *EpollEvent, maxevents _C_int, timeout _C_int) _C_int
diff --git a/third_party/gofrontend/libgo/go/syscall/socket_linux_ppc64x_type.go b/third_party/gofrontend/libgo/go/syscall/socket_linux_ppc64x_type.go
deleted file mode 100644
index 8a707ce..0000000
--- a/third_party/gofrontend/libgo/go/syscall/socket_linux_ppc64x_type.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// socket_linux_ppc64x_type.go -- Socket handling specific to ppc64 GNU/Linux.
-
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-// Type needed on ppc64le & ppc64
-
-type RawSockaddr struct {
-	Family uint16
-	Data   [14]uint8
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/socket_linux_type.go b/third_party/gofrontend/libgo/go/syscall/socket_linux_type.go
deleted file mode 100644
index 45b8c6e..0000000
--- a/third_party/gofrontend/libgo/go/syscall/socket_linux_type.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// socket_linux_type.go -- Socket handling specific to GNU/Linux.
-
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-// Type needed if not on ppc64le or ppc64
-
-type RawSockaddr struct {
-	Family uint16
-	Data   [14]int8
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/socket_posix.go b/third_party/gofrontend/libgo/go/syscall/socket_posix.go
deleted file mode 100644
index fda7dc6..0000000
--- a/third_party/gofrontend/libgo/go/syscall/socket_posix.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// socket_posix.go -- Socket handling for generic POSIX systems.
-
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-//sys	bind(fd int, sa *RawSockaddrAny, len Socklen_t) (err error)
-//bind(fd _C_int, sa *RawSockaddrAny, len Socklen_t) _C_int
-
-//sys	connect(s int, addr *RawSockaddrAny, addrlen Socklen_t) (err error)
-//connect(s _C_int, addr *RawSockaddrAny, addrlen Socklen_t) _C_int
-
-//sysnb	socket(domain int, typ int, proto int) (fd int, err error)
-//socket(domain _C_int, typ _C_int, protocol _C_int) _C_int
-
-//sysnb	socketpair(domain int, typ int, proto int, fd *[2]_C_int) (err error)
-//socketpair(domain _C_int, typ _C_int, protocol _C_int, fd *[2]_C_int) _C_int
-
-//sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *Socklen_t) (err error)
-//getsockopt(s _C_int, level _C_int, name _C_int, val *byte, vallen *Socklen_t) _C_int
-
-//sys	sendto(s int, buf []byte, flags int, to *RawSockaddrAny, tolen Socklen_t) (err error)
-//sendto(s _C_int, buf *byte, len Size_t, flags _C_int, to *RawSockaddrAny, tolen Socklen_t) Ssize_t
-
-//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
-//recvmsg(s _C_int, msg *Msghdr, flags _C_int) Ssize_t
-
-//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
-//sendmsg(s _C_int, msg *Msghdr, flags _C_int) Ssize_t
diff --git a/third_party/gofrontend/libgo/go/syscall/socket_solaris.go b/third_party/gofrontend/libgo/go/syscall/socket_solaris.go
deleted file mode 100644
index 3958889..0000000
--- a/third_party/gofrontend/libgo/go/syscall/socket_solaris.go
+++ /dev/null
@@ -1,69 +0,0 @@
-// socket_solaris.go -- Socket handling specific to Solaris.
-
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-const SizeofSockaddrInet4 = 16
-const SizeofSockaddrInet6 = 32
-const SizeofSockaddrUnix = 110
-
-type RawSockaddrInet4 struct {
-	Family uint16
-	Port   uint16
-	Addr   [4]byte /* in_addr */
-	Zero   [8]uint8
-}
-
-func (sa *RawSockaddrInet4) setLen() Socklen_t {
-	return SizeofSockaddrInet4
-}
-
-type RawSockaddrInet6 struct {
-	Family   uint16
-	Port     uint16
-	Flowinfo uint32
-	Addr     [16]byte /* in6_addr */
-	Scope_id uint32
-	Src_id   uint32
-}
-
-func (sa *RawSockaddrInet6) setLen() Socklen_t {
-	return SizeofSockaddrInet6
-}
-
-type RawSockaddrUnix struct {
-	Family uint16
-	Path   [108]int8
-}
-
-func (sa *RawSockaddrUnix) setLen(int) {
-}
-
-func (sa *RawSockaddrUnix) getLen() (int, error) {
-	n := 0
-	for n < len(sa.Path) && sa.Path[n] != 0 {
-		n++
-	}
-	return n, nil
-}
-
-func (sa *RawSockaddrUnix) adjustAbstract(sl Socklen_t) Socklen_t {
-	return sl
-}
-
-type RawSockaddr struct {
-	Family uint16
-	Data   [14]int8
-}
-
-// BindToDevice binds the socket associated with fd to device.
-func BindToDevice(fd int, device string) (err error) {
-	return ENOSYS
-}
-
-func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, error) {
-	return nil, EAFNOSUPPORT
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/socket_xnet.go b/third_party/gofrontend/libgo/go/syscall/socket_xnet.go
deleted file mode 100644
index 3c5b6b4..0000000
--- a/third_party/gofrontend/libgo/go/syscall/socket_xnet.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// socket_xnet.go -- Socket handling specific to Solaris.
-// Enforce use of XPG 4.2 versions of socket functions.
-
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-//sys	bind(fd int, sa *RawSockaddrAny, len Socklen_t) (err error)
-//__xnet_bind(fd _C_int, sa *RawSockaddrAny, len Socklen_t) _C_int
-
-//sys	connect(s int, addr *RawSockaddrAny, addrlen Socklen_t) (err error)
-//__xnet_connect(s _C_int, addr *RawSockaddrAny, addrlen Socklen_t) _C_int
-
-//sysnb	socket(domain int, typ int, proto int) (fd int, err error)
-//__xnet_socket(domain _C_int, typ _C_int, protocol _C_int) _C_int
-
-//sysnb	socketpair(domain int, typ int, proto int, fd *[2]_C_int) (err error)
-//__xnet_socketpair(domain _C_int, typ _C_int, protocol _C_int, fd *[2]_C_int) _C_int
-
-//sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *Socklen_t) (err error)
-//__xnet_getsockopt(s _C_int, level _C_int, name _C_int, val *byte, vallen *Socklen_t) _C_int
-
-//sys	sendto(s int, buf []byte, flags int, to *RawSockaddrAny, tolen Socklen_t) (err error)
-//__xnet_sendto(s _C_int, buf *byte, len Size_t, flags _C_int, to *RawSockaddrAny, tolen Socklen_t) Ssize_t
-
-//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
-//__xnet_recvmsg(s _C_int, msg *Msghdr, flags _C_int) Ssize_t
-
-//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
-//__xnet_sendmsg(s _C_int, msg *Msghdr, flags _C_int) Ssize_t
diff --git a/third_party/gofrontend/libgo/go/syscall/str.go b/third_party/gofrontend/libgo/go/syscall/str.go
deleted file mode 100644
index 2ddf04b..0000000
--- a/third_party/gofrontend/libgo/go/syscall/str.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-func itoa(val int) string { // do it here rather than with fmt to avoid dependency
-	if val < 0 {
-		return "-" + uitoa(uint(-val))
-	}
-	return uitoa(uint(val))
-}
-
-func uitoa(val uint) string {
-	var buf [32]byte // big enough for int64
-	i := len(buf) - 1
-	for val >= 10 {
-		buf[i] = byte(val%10 + '0')
-		i--
-		val /= 10
-	}
-	buf[i] = byte(val + '0')
-	return string(buf[i:])
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/syscall.go b/third_party/gofrontend/libgo/go/syscall/syscall.go
deleted file mode 100644
index ff09711..0000000
--- a/third_party/gofrontend/libgo/go/syscall/syscall.go
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package syscall contains an interface to the low-level operating system
-// primitives.  The details vary depending on the underlying system, and
-// by default, godoc will display the syscall documentation for the current
-// system.  If you want godoc to display syscall documentation for another
-// system, set $GOOS and $GOARCH to the desired system.  For example, if
-// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS
-// to freebsd and $GOARCH to arm.
-// The primary use of syscall is inside other packages that provide a more
-// portable interface to the system, such as "os", "time" and "net".  Use
-// those packages rather than this one if you can.
-// For details of the functions and data types in this package consult
-// the manuals for the appropriate operating system.
-// These calls return err == nil to indicate success; otherwise
-// err is an operating system error describing the failure.
-// On most systems, that error has type syscall.Errno.
-//
-// NOTE: This package is locked down. Code outside the standard
-// Go repository should be migrated to use the corresponding
-// package in the golang.org/x/sys repository. That is also where updates
-// required by new systems or versions should be applied.
-// See https://golang.org/s/go1.4-syscall for more information.
-//
-package syscall
-
-import "unsafe"
-
-// StringByteSlice converts a string to a NUL-terminated []byte,
-// If s contains a NUL byte this function panics instead of
-// returning an error.
-//
-// Deprecated: Use ByteSliceFromString instead.
-func StringByteSlice(s string) []byte {
-	a, err := ByteSliceFromString(s)
-	if err != nil {
-		panic("syscall: string with NUL passed to StringByteSlice")
-	}
-	return a
-}
-
-// ByteSliceFromString returns a NUL-terminated slice of bytes
-// containing the text of s. If s contains a NUL byte at any
-// location, it returns (nil, EINVAL).
-func ByteSliceFromString(s string) ([]byte, error) {
-	for i := 0; i < len(s); i++ {
-		if s[i] == 0 {
-			return nil, EINVAL
-		}
-	}
-	a := make([]byte, len(s)+1)
-	copy(a, s)
-	return a, nil
-}
-
-// StringBytePtr returns a pointer to a NUL-terminated array of bytes.
-// If s contains a NUL byte this function panics instead of returning
-// an error.
-//
-// Deprecated: Use BytePtrFromString instead.
-func StringBytePtr(s string) *byte { return &StringByteSlice(s)[0] }
-
-// BytePtrFromString returns a pointer to a NUL-terminated array of
-// bytes containing the text of s. If s contains a NUL byte at any
-// location, it returns (nil, EINVAL).
-func BytePtrFromString(s string) (*byte, error) {
-	a, err := ByteSliceFromString(s)
-	if err != nil {
-		return nil, err
-	}
-	return &a[0], nil
-}
-
-// Single-word zero for use when we need a valid pointer to 0 bytes.
-// See mksyscall.pl.
-var _zero uintptr
-
-var dummy *byte
-
-const sizeofPtr uintptr = uintptr(unsafe.Sizeof(dummy))
-
-func (ts *Timespec) Unix() (sec int64, nsec int64) {
-	return int64(ts.Sec), int64(ts.Nsec)
-}
-
-func (tv *Timeval) Unix() (sec int64, nsec int64) {
-	return int64(tv.Sec), int64(tv.Usec) * 1000
-}
-
-func (ts *Timespec) Nano() int64 {
-	return int64(ts.Sec)*1e9 + int64(ts.Nsec)
-}
-
-func (tv *Timeval) Nano() int64 {
-	return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000
-}
-
-// use is a no-op, but the compiler cannot see that it is.
-// Calling use(p) ensures that p is kept live until that point.
-//go:noescape
-func use(p unsafe.Pointer)
diff --git a/third_party/gofrontend/libgo/go/syscall/syscall_errno.go b/third_party/gofrontend/libgo/go/syscall/syscall_errno.go
deleted file mode 100644
index 01618d1..0000000
--- a/third_party/gofrontend/libgo/go/syscall/syscall_errno.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-// An Errno is an unsigned number describing an error condition.
-// It implements the error interface.  The zero Errno is by convention
-// a non-error, so code to convert from Errno to error should use:
-//	err = nil
-//	if errno != 0 {
-//		err = errno
-//	}
-type Errno uintptr
-
-func (e Errno) Error() string {
-	return Errstr(int(e))
-}
-
-func (e Errno) Temporary() bool {
-	return e == EINTR || e == EMFILE || e == ECONNRESET || e == ECONNABORTED || e.Timeout()
-}
-
-func (e Errno) Timeout() bool {
-	return e == EAGAIN || e == EWOULDBLOCK || e == ETIMEDOUT
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/syscall_linux_386.go b/third_party/gofrontend/libgo/go/syscall/syscall_linux_386.go
deleted file mode 100644
index 591d3e1..0000000
--- a/third_party/gofrontend/libgo/go/syscall/syscall_linux_386.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// syscall_linux_386.go -- GNU/Linux 386 specific support
-
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// TODO(rsc): Rewrite all nn(SP) references into name+(nn-8)(FP)
-// so that go vet can check that they are correct.
-
-package syscall
-
-import "unsafe"
-
-func (r *PtraceRegs) PC() uint64 { return uint64(uint32(r.Eip)) }
-
-func (r *PtraceRegs) SetPC(pc uint64) { r.Eip = int32(pc) }
-
-func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
-}
-
-func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/syscall_linux_alpha.go b/third_party/gofrontend/libgo/go/syscall/syscall_linux_alpha.go
deleted file mode 100644
index 713546c..0000000
--- a/third_party/gofrontend/libgo/go/syscall/syscall_linux_alpha.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// syscall_linux_alpha.go -- GNU/Linux ALPHA specific support
-
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-import "unsafe"
-
-type PtraceRegs struct {
-	R0      uint64
-	R1      uint64
-	R2      uint64
-	R3      uint64
-	R4      uint64
-	R5      uint64
-	R6      uint64
-	R7      uint64
-	R8      uint64
-	R19     uint64
-	R20     uint64
-	R21     uint64
-	R22     uint64
-	R23     uint64
-	R24     uint64
-	R25     uint64
-	R26     uint64
-	R27     uint64
-	R28     uint64
-	Hae     uint64
-	Trap_a0 uint64
-	Trap_a1 uint64
-	Trap_a2 uint64
-	Ps      uint64
-	Pc      uint64
-	Gp      uint64
-	R16     uint64
-	R17     uint64
-	R18     uint64
-}
-
-func (r *PtraceRegs) PC() uint64 {
-	return r.Pc
-}
-
-func (r *PtraceRegs) SetPC(pc uint64) {
-	r.Pc = pc
-}
-
-func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
-}
-
-func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/syscall_linux_amd64.go b/third_party/gofrontend/libgo/go/syscall/syscall_linux_amd64.go
deleted file mode 100644
index 609faed..0000000
--- a/third_party/gofrontend/libgo/go/syscall/syscall_linux_amd64.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// syscall_linux_amd64.go -- GNU/Linux 386 specific support
-
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-import "unsafe"
-
-func (r *PtraceRegs) PC() uint64 {
-	return r.Rip
-}
-
-func (r *PtraceRegs) SetPC(pc uint64) {
-	r.Rip = pc
-}
-
-func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
-}
-
-func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/syscall_linux_s390.go b/third_party/gofrontend/libgo/go/syscall/syscall_linux_s390.go
deleted file mode 100644
index a744f6b..0000000
--- a/third_party/gofrontend/libgo/go/syscall/syscall_linux_s390.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// syscall_linux_s390.go -- GNU/Linux s390 specific support
-
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-import "unsafe"
-
-func (r *PtraceRegs) PC() uint64 { return uint64(r.Psw.Addr) }
-
-func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = uint32(pc) }
-
-func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
-}
-
-func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/syscall_linux_s390x.go b/third_party/gofrontend/libgo/go/syscall/syscall_linux_s390x.go
deleted file mode 100644
index 44d5679..0000000
--- a/third_party/gofrontend/libgo/go/syscall/syscall_linux_s390x.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// syscall_linux_s390x.go -- GNU/Linux s390x specific support
-
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-import "unsafe"
-
-func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr }
-
-func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc }
-
-func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
-	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
-}
-
-func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
-	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/syscall_linux_test.go b/third_party/gofrontend/libgo/go/syscall/syscall_linux_test.go
deleted file mode 100644
index 40fce6d..0000000
--- a/third_party/gofrontend/libgo/go/syscall/syscall_linux_test.go
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall_test
-
-import (
-	"bufio"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"os/signal"
-	"path/filepath"
-	"syscall"
-	"testing"
-	"time"
-)
-
-func TestMain(m *testing.M) {
-	if os.Getenv("GO_DEATHSIG_PARENT") == "1" {
-		deathSignalParent()
-	} else if os.Getenv("GO_DEATHSIG_CHILD") == "1" {
-		deathSignalChild()
-	}
-
-	os.Exit(m.Run())
-}
-
-func TestLinuxDeathSignal(t *testing.T) {
-	if os.Getuid() != 0 {
-		t.Skip("skipping root only test")
-	}
-
-	// Copy the test binary to a location that a non-root user can read/execute
-	// after we drop privileges
-	tempDir, err := ioutil.TempDir("", "TestDeathSignal")
-	if err != nil {
-		t.Fatalf("cannot create temporary directory: %v", err)
-	}
-	defer os.RemoveAll(tempDir)
-	os.Chmod(tempDir, 0755)
-
-	tmpBinary := filepath.Join(tempDir, filepath.Base(os.Args[0]))
-
-	src, err := os.Open(os.Args[0])
-	if err != nil {
-		t.Fatalf("cannot open binary %q, %v", os.Args[0], err)
-	}
-	defer src.Close()
-
-	dst, err := os.OpenFile(tmpBinary, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755)
-	if err != nil {
-		t.Fatalf("cannot create temporary binary %q, %v", tmpBinary, err)
-	}
-	if _, err := io.Copy(dst, src); err != nil {
-		t.Fatalf("failed to copy test binary to %q, %v", tmpBinary, err)
-	}
-	err = dst.Close()
-	if err != nil {
-		t.Fatalf("failed to close test binary %q, %v", tmpBinary, err)
-	}
-
-	cmd := exec.Command(tmpBinary)
-	cmd.Env = []string{"GO_DEATHSIG_PARENT=1"}
-	chldStdin, err := cmd.StdinPipe()
-	if err != nil {
-		t.Fatal("failed to create new stdin pipe: %v", err)
-	}
-	chldStdout, err := cmd.StdoutPipe()
-	if err != nil {
-		t.Fatal("failed to create new stdout pipe: %v", err)
-	}
-	cmd.Stderr = os.Stderr
-
-	err = cmd.Start()
-	defer cmd.Wait()
-	if err != nil {
-		t.Fatalf("failed to start first child process: %v", err)
-	}
-
-	chldPipe := bufio.NewReader(chldStdout)
-
-	if got, err := chldPipe.ReadString('\n'); got == "start\n" {
-		syscall.Kill(cmd.Process.Pid, syscall.SIGTERM)
-
-		go func() {
-			time.Sleep(5 * time.Second)
-			chldStdin.Close()
-		}()
-
-		want := "ok\n"
-		if got, err = chldPipe.ReadString('\n'); got != want {
-			t.Fatalf("expected %q, received %q, %v", want, got, err)
-		}
-	} else {
-		t.Fatalf("did not receive start from child, received %q, %v", got, err)
-	}
-}
-
-func deathSignalParent() {
-	cmd := exec.Command(os.Args[0])
-	cmd.Env = []string{"GO_DEATHSIG_CHILD=1"}
-	cmd.Stdin = os.Stdin
-	cmd.Stdout = os.Stdout
-	attrs := syscall.SysProcAttr{
-		Pdeathsig: syscall.SIGUSR1,
-		// UID/GID 99 is the user/group "nobody" on RHEL/Fedora and is
-		// unused on Ubuntu
-		Credential: &syscall.Credential{Uid: 99, Gid: 99},
-	}
-	cmd.SysProcAttr = &attrs
-
-	err := cmd.Start()
-	if err != nil {
-		fmt.Fprintf(os.Stderr, "death signal parent error: %v\n")
-		os.Exit(1)
-	}
-	cmd.Wait()
-	os.Exit(0)
-}
-
-func deathSignalChild() {
-	c := make(chan os.Signal, 1)
-	signal.Notify(c, syscall.SIGUSR1)
-	go func() {
-		<-c
-		fmt.Println("ok")
-		os.Exit(0)
-	}()
-	fmt.Println("start")
-
-	buf := make([]byte, 32)
-	os.Stdin.Read(buf)
-
-	// We expected to be signaled before stdin closed
-	fmt.Println("not ok")
-	os.Exit(1)
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/syscall_solaris.go b/third_party/gofrontend/libgo/go/syscall/syscall_solaris.go
deleted file mode 100644
index c191917..0000000
--- a/third_party/gofrontend/libgo/go/syscall/syscall_solaris.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall
-
-func (ts *Timestruc) Unix() (sec int64, nsec int64) {
-	return int64(ts.Sec), int64(ts.Nsec)
-}
-
-func (ts *Timestruc) Nano() int64 {
-	return int64(ts.Sec)*1e9 + int64(ts.Nsec)
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/syscall_stubs.go b/third_party/gofrontend/libgo/go/syscall/syscall_stubs.go
deleted file mode 100644
index 76c05cb..0000000
--- a/third_party/gofrontend/libgo/go/syscall/syscall_stubs.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// These are stubs.
-
-package syscall
-
-func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
-	z := -1
-	return uintptr(z), 0, uintptr(ENOSYS)
-}
-
-func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
-	z := -1
-	return uintptr(z), 0, uintptr(ENOSYS)
-}
-
-func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) {
-	z := -1
-	return uintptr(z), 0, uintptr(ENOSYS)
-}
-
-func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) {
-	z := -1
-	return uintptr(z), 0, uintptr(ENOSYS)
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/syscall_test.go b/third_party/gofrontend/libgo/go/syscall/syscall_test.go
deleted file mode 100644
index 846c487..0000000
--- a/third_party/gofrontend/libgo/go/syscall/syscall_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package syscall_test
-
-import (
-	"fmt"
-	"syscall"
-	"testing"
-)
-
-func testSetGetenv(t *testing.T, key, value string) {
-	err := syscall.Setenv(key, value)
-	if err != nil {
-		t.Fatalf("Setenv failed to set %q: %v", value, err)
-	}
-	newvalue, found := syscall.Getenv(key)
-	if !found {
-		t.Fatalf("Getenv failed to find %v variable (want value %q)", key, value)
-	}
-	if newvalue != value {
-		t.Fatalf("Getenv(%v) = %q; want %q", key, newvalue, value)
-	}
-}
-
-func TestEnv(t *testing.T) {
-	testSetGetenv(t, "TESTENV", "AVALUE")
-	// make sure TESTENV gets set to "", not deleted
-	testSetGetenv(t, "TESTENV", "")
-}
-
-func TestItoa(t *testing.T) {
-	// Make most negative integer: 0x8000...
-	i := 1
-	for i<<1 != 0 {
-		i <<= 1
-	}
-	if i >= 0 {
-		t.Fatal("bad math")
-	}
-	s := syscall.Itoa(i)
-	f := fmt.Sprint(i)
-	if s != f {
-		t.Fatalf("itoa(%d) = %s, want %s", i, s, f)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/syscall_unix.go b/third_party/gofrontend/libgo/go/syscall/syscall_unix.go
deleted file mode 100644
index 21bf6ea..0000000
--- a/third_party/gofrontend/libgo/go/syscall/syscall_unix.go
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package syscall
-
-import (
-	"runtime"
-	"sync"
-	"unsafe"
-)
-
-var (
-	Stdin  = 0
-	Stdout = 1
-	Stderr = 2
-)
-
-//extern syscall
-func c_syscall32(trap int32, a1, a2, a3, a4, a5, a6 int32) int32
-
-//extern syscall
-func c_syscall64(trap int64, a1, a2, a3, a4, a5, a6 int64) int64
-
-const (
-	darwin64Bit    = runtime.GOOS == "darwin" && sizeofPtr == 8
-	dragonfly64Bit = runtime.GOOS == "dragonfly" && sizeofPtr == 8
-	netbsd32Bit    = runtime.GOOS == "netbsd" && sizeofPtr == 4
-)
-
-// Do a system call.  We look at the size of uintptr to see how to pass
-// the arguments, so that we don't pass a 64-bit value when the function
-// expects a 32-bit one.
-func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {
-	Entersyscall()
-	SetErrno(0)
-	var r uintptr
-	if unsafe.Sizeof(r) == 4 {
-		r1 := c_syscall32(int32(trap), int32(a1), int32(a2), int32(a3), 0, 0, 0)
-		r = uintptr(r1)
-	} else {
-		r1 := c_syscall64(int64(trap), int64(a1), int64(a2), int64(a3), 0, 0, 0)
-		r = uintptr(r1)
-	}
-	err = GetErrno()
-	Exitsyscall()
-	return r, 0, err
-}
-
-func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {
-	Entersyscall()
-	SetErrno(0)
-	var r uintptr
-	if unsafe.Sizeof(r) == 4 {
-		r1 := c_syscall32(int32(trap), int32(a1), int32(a2), int32(a3),
-			int32(a4), int32(a5), int32(a6))
-		r = uintptr(r1)
-	} else {
-		r1 := c_syscall64(int64(trap), int64(a1), int64(a2), int64(a3),
-			int64(a4), int64(a5), int64(a6))
-		r = uintptr(r1)
-	}
-	err = GetErrno()
-	Exitsyscall()
-	return r, 0, err
-}
-
-func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {
-	var r uintptr
-	SetErrno(0)
-	if unsafe.Sizeof(r) == 4 {
-		r1 := c_syscall32(int32(trap), int32(a1), int32(a2), int32(a3), 0, 0, 0)
-		r = uintptr(r1)
-	} else {
-		r1 := c_syscall64(int64(trap), int64(a1), int64(a2), int64(a3), 0, 0, 0)
-		r = uintptr(r1)
-	}
-	err = GetErrno()
-	return r, 0, err
-}
-
-func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) {
-	var r uintptr
-	SetErrno(0)
-	if unsafe.Sizeof(r) == 4 {
-		r1 := c_syscall32(int32(trap), int32(a1), int32(a2), int32(a3),
-			int32(a4), int32(a5), int32(a6))
-		r = uintptr(r1)
-	} else {
-		r1 := c_syscall64(int64(trap), int64(a1), int64(a2), int64(a3),
-			int64(a4), int64(a5), int64(a6))
-		r = uintptr(r1)
-	}
-	err = GetErrno()
-	return r, 0, err
-}
-
-// Mmap manager, for use by operating system-specific implementations.
-// Gccgo only has one implementation but we do this to correspond to gc.
-
-type mmapper struct {
-	sync.Mutex
-	active map[*byte][]byte // active mappings; key is last byte in mapping
-	mmap   func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error)
-	munmap func(addr uintptr, length uintptr) error
-}
-
-func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
-	if length <= 0 {
-		return nil, EINVAL
-	}
-
-	// Map the requested memory.
-	addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset)
-	if errno != nil {
-		return nil, errno
-	}
-
-	// Slice memory layout
-	var sl = struct {
-		addr uintptr
-		len  int
-		cap  int
-	}{addr, length, length}
-
-	// Use unsafe to turn sl into a []byte.
-	b := *(*[]byte)(unsafe.Pointer(&sl))
-
-	// Register mapping in m and return it.
-	p := &b[cap(b)-1]
-	m.Lock()
-	defer m.Unlock()
-	m.active[p] = b
-	return b, nil
-}
-
-func (m *mmapper) Munmap(data []byte) (err error) {
-	if len(data) == 0 || len(data) != cap(data) {
-		return EINVAL
-	}
-
-	// Find the base of the mapping.
-	p := &data[cap(data)-1]
-	m.Lock()
-	defer m.Unlock()
-	b := m.active[p]
-	if b == nil || &b[0] != &data[0] {
-		return EINVAL
-	}
-
-	// Unmap the memory and update m.
-	if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil {
-		return errno
-	}
-	delete(m.active, p)
-	return nil
-}
-
-var mapper = &mmapper{
-	active: make(map[*byte][]byte),
-	mmap:   mmap,
-	munmap: munmap,
-}
-
-func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
-	return mapper.Mmap(fd, offset, length, prot, flags)
-}
-
-func Munmap(b []byte) (err error) {
-	return mapper.Munmap(b)
-}
-
-// Do the interface allocations only once for common
-// Errno values.
-var (
-	errEAGAIN error = EAGAIN
-	errEINVAL error = EINVAL
-	errENOENT error = ENOENT
-)
-
-// errnoErr returns common boxed Errno values, to prevent
-// allocations at runtime.
-func errnoErr(e Errno) error {
-	switch e {
-	case 0:
-		return nil
-	case EAGAIN:
-		return errEAGAIN
-	case EINVAL:
-		return errEINVAL
-	case ENOENT:
-		return errENOENT
-	}
-	return e
-}
-
-// A Signal is a number describing a process signal.
-// It implements the os.Signal interface.
-type Signal int
-
-func (s Signal) Signal() {}
-
-func Signame(s Signal) string
-
-func (s Signal) String() string {
-	return Signame(s)
-}
-
-func Read(fd int, p []byte) (n int, err error) {
-	n, err = read(fd, p)
-	if raceenabled {
-		if n > 0 {
-			raceWriteRange(unsafe.Pointer(&p[0]), n)
-		}
-		if err == nil {
-			raceAcquire(unsafe.Pointer(&ioSync))
-		}
-	}
-	return
-}
-
-func Write(fd int, p []byte) (n int, err error) {
-	if raceenabled {
-		raceReleaseMerge(unsafe.Pointer(&ioSync))
-	}
-	n, err = write(fd, p)
-	if raceenabled && n > 0 {
-		raceReadRange(unsafe.Pointer(&p[0]), n)
-	}
-	return
-}
-
-var ioSync int64
diff --git a/third_party/gofrontend/libgo/go/syscall/syscall_unix_test.go b/third_party/gofrontend/libgo/go/syscall/syscall_unix_test.go
deleted file mode 100644
index c7b4560..0000000
--- a/third_party/gofrontend/libgo/go/syscall/syscall_unix_test.go
+++ /dev/null
@@ -1,356 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-package syscall_test
-
-import (
-	"flag"
-	"fmt"
-	"internal/testenv"
-	"io/ioutil"
-	"net"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"syscall"
-	"testing"
-	"time"
-)
-
-// Tests that below functions, structures and constants are consistent
-// on all Unix-like systems.
-func _() {
-	// program scheduling priority functions and constants
-	var (
-		_ func(int, int, int) error   = syscall.Setpriority
-		_ func(int, int) (int, error) = syscall.Getpriority
-	)
-	const (
-		_ int = syscall.PRIO_USER
-		_ int = syscall.PRIO_PROCESS
-		_ int = syscall.PRIO_PGRP
-	)
-
-	// termios constants
-	const (
-		_ int = syscall.TCIFLUSH
-		_ int = syscall.TCIOFLUSH
-		_ int = syscall.TCOFLUSH
-	)
-
-	// fcntl file locking structure and constants
-	var (
-		_ = syscall.Flock_t{
-			Type:   int16(0),
-			Whence: int16(0),
-			Start:  int64(0),
-			Len:    int64(0),
-			Pid:    int32(0),
-		}
-	)
-	const (
-		_ = syscall.F_GETLK
-		_ = syscall.F_SETLK
-		_ = syscall.F_SETLKW
-	)
-}
-
-// TestFcntlFlock tests whether the file locking structure matches
-// the calling convention of each kernel.
-// On some Linux systems, glibc uses another set of values for the
-// commands and translates them to the correct value that the kernel
-// expects just before the actual fcntl syscall. As Go uses raw
-// syscalls directly, it must use the real value, not the glibc value.
-// Thus this test also verifies that the Flock_t structure can be
-// roundtripped with F_SETLK and F_GETLK.
-func TestFcntlFlock(t *testing.T) {
-	if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
-		t.Skip("skipping; no child processes allowed on iOS")
-	}
-	flock := syscall.Flock_t{
-		Type:  syscall.F_WRLCK,
-		Start: 31415, Len: 271828, Whence: 1,
-	}
-	if os.Getenv("GO_WANT_HELPER_PROCESS") == "" {
-		// parent
-		name := filepath.Join(os.TempDir(), "TestFcntlFlock")
-		fd, err := syscall.Open(name, syscall.O_CREAT|syscall.O_RDWR|syscall.O_CLOEXEC, 0)
-		if err != nil {
-			t.Fatalf("Open failed: %v", err)
-		}
-		defer syscall.Unlink(name)
-		defer syscall.Close(fd)
-		if err := syscall.Ftruncate(fd, 1<<20); err != nil {
-			t.Fatalf("Ftruncate(1<<20) failed: %v", err)
-		}
-		if err := syscall.FcntlFlock(uintptr(fd), syscall.F_SETLK, &flock); err != nil {
-			t.Fatalf("FcntlFlock(F_SETLK) failed: %v", err)
-		}
-		cmd := exec.Command(os.Args[0], "-test.run=^TestFcntlFlock$")
-		cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
-		cmd.ExtraFiles = []*os.File{os.NewFile(uintptr(fd), name)}
-		out, err := cmd.CombinedOutput()
-		if len(out) > 0 || err != nil {
-			t.Fatalf("child process: %q, %v", out, err)
-		}
-	} else {
-		// child
-		got := flock
-		// make sure the child lock is conflicting with the parent lock
-		got.Start--
-		got.Len++
-		if err := syscall.FcntlFlock(3, syscall.F_GETLK, &got); err != nil {
-			t.Fatalf("FcntlFlock(F_GETLK) failed: %v", err)
-		}
-		flock.Pid = int32(syscall.Getppid())
-		// Linux kernel always set Whence to 0
-		flock.Whence = 0
-		if got.Type == flock.Type && got.Start == flock.Start && got.Len == flock.Len && got.Pid == flock.Pid && got.Whence == flock.Whence {
-			os.Exit(0)
-		}
-		t.Fatalf("FcntlFlock got %v, want %v", got, flock)
-	}
-}
-
-// TestPassFD tests passing a file descriptor over a Unix socket.
-//
-// This test involved both a parent and child process. The parent
-// process is invoked as a normal test, with "go test", which then
-// runs the child process by running the current test binary with args
-// "-test.run=^TestPassFD$" and an environment variable used to signal
-// that the test should become the child process instead.
-func TestPassFD(t *testing.T) {
-	switch runtime.GOOS {
-	case "dragonfly":
-		// TODO(jsing): Figure out why sendmsg is returning EINVAL.
-		t.Skip("skipping test on dragonfly")
-	case "solaris":
-		// TODO(aram): Figure out why ReadMsgUnix is returning empty message.
-		t.Skip("skipping test on solaris, see issue 7402")
-	}
-
-	testenv.MustHaveExec(t)
-
-	if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" {
-		passFDChild()
-		return
-	}
-
-	tempDir, err := ioutil.TempDir("", "TestPassFD")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(tempDir)
-
-	fds, err := syscall.Socketpair(syscall.AF_LOCAL, syscall.SOCK_STREAM, 0)
-	if err != nil {
-		t.Fatalf("Socketpair: %v", err)
-	}
-	defer syscall.Close(fds[0])
-	defer syscall.Close(fds[1])
-	writeFile := os.NewFile(uintptr(fds[0]), "child-writes")
-	readFile := os.NewFile(uintptr(fds[1]), "parent-reads")
-	defer writeFile.Close()
-	defer readFile.Close()
-
-	cmd := exec.Command(os.Args[0], "-test.run=^TestPassFD$", "--", tempDir)
-	cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
-	cmd.ExtraFiles = []*os.File{writeFile}
-
-	out, err := cmd.CombinedOutput()
-	if len(out) > 0 || err != nil {
-		t.Fatalf("child process: %q, %v", out, err)
-	}
-
-	c, err := net.FileConn(readFile)
-	if err != nil {
-		t.Fatalf("FileConn: %v", err)
-	}
-	defer c.Close()
-
-	uc, ok := c.(*net.UnixConn)
-	if !ok {
-		t.Fatalf("unexpected FileConn type; expected UnixConn, got %T", c)
-	}
-
-	buf := make([]byte, 32) // expect 1 byte
-	oob := make([]byte, 32) // expect 24 bytes
-	closeUnix := time.AfterFunc(5*time.Second, func() {
-		t.Logf("timeout reading from unix socket")
-		uc.Close()
-	})
-	_, oobn, _, _, err := uc.ReadMsgUnix(buf, oob)
-	closeUnix.Stop()
-
-	scms, err := syscall.ParseSocketControlMessage(oob[:oobn])
-	if err != nil {
-		t.Fatalf("ParseSocketControlMessage: %v", err)
-	}
-	if len(scms) != 1 {
-		t.Fatalf("expected 1 SocketControlMessage; got scms = %#v", scms)
-	}
-	scm := scms[0]
-	gotFds, err := syscall.ParseUnixRights(&scm)
-	if err != nil {
-		t.Fatalf("syscall.ParseUnixRights: %v", err)
-	}
-	if len(gotFds) != 1 {
-		t.Fatalf("wanted 1 fd; got %#v", gotFds)
-	}
-
-	f := os.NewFile(uintptr(gotFds[0]), "fd-from-child")
-	defer f.Close()
-
-	got, err := ioutil.ReadAll(f)
-	want := "Hello from child process!\n"
-	if string(got) != want {
-		t.Errorf("child process ReadAll: %q, %v; want %q", got, err, want)
-	}
-}
-
-// passFDChild is the child process used by TestPassFD.
-func passFDChild() {
-	defer os.Exit(0)
-
-	// Look for our fd. It should be fd 3, but we work around an fd leak
-	// bug here (https://golang.org/issue/2603) to let it be elsewhere.
-	var uc *net.UnixConn
-	for fd := uintptr(3); fd <= 10; fd++ {
-		f := os.NewFile(fd, "unix-conn")
-		var ok bool
-		netc, _ := net.FileConn(f)
-		uc, ok = netc.(*net.UnixConn)
-		if ok {
-			break
-		}
-	}
-	if uc == nil {
-		fmt.Println("failed to find unix fd")
-		return
-	}
-
-	// Make a file f to send to our parent process on uc.
-	// We make it in tempDir, which our parent will clean up.
-	flag.Parse()
-	tempDir := flag.Arg(0)
-	f, err := ioutil.TempFile(tempDir, "")
-	if err != nil {
-		fmt.Printf("TempFile: %v", err)
-		return
-	}
-
-	f.Write([]byte("Hello from child process!\n"))
-	f.Seek(0, 0)
-
-	rights := syscall.UnixRights(int(f.Fd()))
-	dummyByte := []byte("x")
-	n, oobn, err := uc.WriteMsgUnix(dummyByte, rights, nil)
-	if err != nil {
-		fmt.Printf("WriteMsgUnix: %v", err)
-		return
-	}
-	if n != 1 || oobn != len(rights) {
-		fmt.Printf("WriteMsgUnix = %d, %d; want 1, %d", n, oobn, len(rights))
-		return
-	}
-}
-
-// TestUnixRightsRoundtrip tests that UnixRights, ParseSocketControlMessage,
-// and ParseUnixRights are able to successfully round-trip lists of file descriptors.
-func TestUnixRightsRoundtrip(t *testing.T) {
-	testCases := [...][][]int{
-		{{42}},
-		{{1, 2}},
-		{{3, 4, 5}},
-		{{}},
-		{{1, 2}, {3, 4, 5}, {}, {7}},
-	}
-	for _, testCase := range testCases {
-		b := []byte{}
-		var n int
-		for _, fds := range testCase {
-			// Last assignment to n wins
-			n = len(b) + syscall.CmsgLen(4*len(fds))
-			b = append(b, syscall.UnixRights(fds...)...)
-		}
-		// Truncate b
-		b = b[:n]
-
-		scms, err := syscall.ParseSocketControlMessage(b)
-		if err != nil {
-			t.Fatalf("ParseSocketControlMessage: %v", err)
-		}
-		if len(scms) != len(testCase) {
-			t.Fatalf("expected %v SocketControlMessage; got scms = %#v", len(testCase), scms)
-		}
-		for i, scm := range scms {
-			gotFds, err := syscall.ParseUnixRights(&scm)
-			if err != nil {
-				t.Fatalf("ParseUnixRights: %v", err)
-			}
-			wantFds := testCase[i]
-			if len(gotFds) != len(wantFds) {
-				t.Fatalf("expected %v fds, got %#v", len(wantFds), gotFds)
-			}
-			for j, fd := range gotFds {
-				if fd != wantFds[j] {
-					t.Fatalf("expected fd %v, got %v", wantFds[j], fd)
-				}
-			}
-		}
-	}
-}
-
-func TestRlimit(t *testing.T) {
-	var rlimit, zero syscall.Rlimit
-	err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit)
-	if err != nil {
-		t.Fatalf("Getrlimit: save failed: %v", err)
-	}
-	if zero == rlimit {
-		t.Fatalf("Getrlimit: save failed: got zero value %#v", rlimit)
-	}
-	set := rlimit
-	set.Cur = set.Max - 1
-	err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &set)
-	if err != nil {
-		t.Fatalf("Setrlimit: set failed: %#v %v", set, err)
-	}
-	var get syscall.Rlimit
-	err = syscall.Getrlimit(syscall.RLIMIT_NOFILE, &get)
-	if err != nil {
-		t.Fatalf("Getrlimit: get failed: %v", err)
-	}
-	set = rlimit
-	set.Cur = set.Max - 1
-	if set != get {
-		// Seems like Darwin requires some privilege to
-		// increase the soft limit of rlimit sandbox, though
-		// Setrlimit never reports an error.
-		switch runtime.GOOS {
-		case "darwin":
-		default:
-			t.Fatalf("Rlimit: change failed: wanted %#v got %#v", set, get)
-		}
-	}
-	err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlimit)
-	if err != nil {
-		t.Fatalf("Setrlimit: restore failed: %#v %v", rlimit, err)
-	}
-}
-
-func TestSeekFailure(t *testing.T) {
-	_, err := syscall.Seek(-1, 0, 0)
-	if err == nil {
-		t.Fatalf("Seek(-1, 0, 0) did not fail")
-	}
-	str := err.Error() // used to crash on Linux
-	t.Logf("Seek: %v", str)
-	if str == "" {
-		t.Fatalf("Seek(-1, 0, 0) return error with empty message")
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/syscall/wait.c b/third_party/gofrontend/libgo/go/syscall/wait.c
deleted file mode 100644
index 8c3b53f..0000000
--- a/third_party/gofrontend/libgo/go/syscall/wait.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/* wait.c -- functions for getting wait status values.
-
-   Copyright 2011 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.
-
-   We use C code to extract the wait status so that we can easily be
-   OS-independent.  */
-
-#include <stdint.h>
-#include <sys/wait.h>
-
-#include "runtime.h"
-
-extern _Bool Exited (uint32_t *w)
-  __asm__ (GOSYM_PREFIX "syscall.Exited.N18_syscall.WaitStatus");
-
-_Bool
-Exited (uint32_t *w)
-{
-  return WIFEXITED (*w) != 0;
-}
-
-extern _Bool Signaled (uint32_t *w)
-  __asm__ (GOSYM_PREFIX "syscall.Signaled.N18_syscall.WaitStatus");
-
-_Bool
-Signaled (uint32_t *w)
-{
-  return WIFSIGNALED (*w) != 0;
-}
-
-extern _Bool Stopped (uint32_t *w)
-  __asm__ (GOSYM_PREFIX "syscall.Stopped.N18_syscall.WaitStatus");
-
-_Bool
-Stopped (uint32_t *w)
-{
-  return WIFSTOPPED (*w) != 0;
-}
-
-extern _Bool Continued (uint32_t *w)
-  __asm__ (GOSYM_PREFIX "syscall.Continued.N18_syscall.WaitStatus");
-
-_Bool
-Continued (uint32_t *w)
-{
-  return WIFCONTINUED (*w) != 0;
-}
-
-extern _Bool CoreDump (uint32_t *w)
-  __asm__ (GOSYM_PREFIX "syscall.CoreDump.N18_syscall.WaitStatus");
-
-_Bool
-CoreDump (uint32_t *w)
-{
-  return WCOREDUMP (*w) != 0;
-}
-
-extern int ExitStatus (uint32_t *w)
-  __asm__ (GOSYM_PREFIX "syscall.ExitStatus.N18_syscall.WaitStatus");
-
-int
-ExitStatus (uint32_t *w)
-{
-  if (!WIFEXITED (*w))
-    return -1;
-  return WEXITSTATUS (*w);
-}
-
-extern int Signal (uint32_t *w)
-  __asm__ (GOSYM_PREFIX "syscall.Signal.N18_syscall.WaitStatus");
-
-int
-Signal (uint32_t *w)
-{
-  if (!WIFSIGNALED (*w))
-    return -1;
-  return WTERMSIG (*w);
-}
-
-extern int StopSignal (uint32_t *w)
-  __asm__ (GOSYM_PREFIX "syscall.StopSignal.N18_syscall.WaitStatus");
-
-int
-StopSignal (uint32_t *w)
-{
-  if (!WIFSTOPPED (*w))
-    return -1;
-  return WSTOPSIG (*w);
-}
-
-extern int TrapCause (uint32_t *w)
-  __asm__ (GOSYM_PREFIX "syscall.TrapCause.N18_syscall.WaitStatus");
-
-int
-TrapCause (uint32_t *w __attribute__ ((unused)))
-{
-#ifndef __linux__
-  return -1;
-#else
-  if (!WIFSTOPPED (*w) || WSTOPSIG (*w) != SIGTRAP)
-    return -1;
-  return *w >> 16;
-#endif
-}
diff --git a/third_party/gofrontend/libgo/go/testing/allocs.go b/third_party/gofrontend/libgo/go/testing/allocs.go
deleted file mode 100644
index 9ec47bd..0000000
--- a/third_party/gofrontend/libgo/go/testing/allocs.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package testing
-
-import (
-	"runtime"
-)
-
-// AllocsPerRun returns the average number of allocations during calls to f.
-// Although the return value has type float64, it will always be an integral value.
-//
-// To compute the number of allocations, the function will first be run once as
-// a warm-up.  The average number of allocations over the specified number of
-// runs will then be measured and returned.
-//
-// AllocsPerRun sets GOMAXPROCS to 1 during its measurement and will restore
-// it before returning.
-func AllocsPerRun(runs int, f func()) (avg float64) {
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1))
-
-	// Warm up the function
-	f()
-
-	// Measure the starting statistics
-	var memstats runtime.MemStats
-	runtime.ReadMemStats(&memstats)
-	mallocs := 0 - memstats.Mallocs
-
-	// Run the function the specified number of times
-	for i := 0; i < runs; i++ {
-		f()
-	}
-
-	// Read the final statistics
-	runtime.ReadMemStats(&memstats)
-	mallocs += memstats.Mallocs
-
-	// Average the mallocs over the runs (not counting the warm-up).
-	// We are forced to return a float64 because the API is silly, but do
-	// the division as integers so we can ask if AllocsPerRun()==1
-	// instead of AllocsPerRun()<2.
-	return float64(mallocs / uint64(runs))
-}
diff --git a/third_party/gofrontend/libgo/go/testing/allocs_test.go b/third_party/gofrontend/libgo/go/testing/allocs_test.go
deleted file mode 100644
index ec17daa..0000000
--- a/third_party/gofrontend/libgo/go/testing/allocs_test.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package testing_test
-
-import "testing"
-
-var global interface{}
-
-var allocsPerRunTests = []struct {
-	name   string
-	fn     func()
-	allocs float64
-}{
-	{"alloc *byte", func() { global = new(*byte) }, 1},
-	{"alloc complex128", func() { global = new(complex128) }, 1},
-	{"alloc float64", func() { global = new(float64) }, 1},
-	{"alloc int32", func() { global = new(int32) }, 1},
-	{"alloc byte", func() { global = new(byte) }, 1},
-}
-
-func TestAllocsPerRun(t *testing.T) {
-	for _, tt := range allocsPerRunTests {
-		if allocs := testing.AllocsPerRun(100, tt.fn); allocs != tt.allocs {
-			t.Errorf("AllocsPerRun(100, %s) = %v, want %v", tt.name, allocs, tt.allocs)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/testing/benchmark.go b/third_party/gofrontend/libgo/go/testing/benchmark.go
deleted file mode 100644
index 62e696d..0000000
--- a/third_party/gofrontend/libgo/go/testing/benchmark.go
+++ /dev/null
@@ -1,466 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package testing
-
-import (
-	"flag"
-	"fmt"
-	"os"
-	"runtime"
-	"sync"
-	"sync/atomic"
-	"time"
-)
-
-var matchBenchmarks = flag.String("test.bench", "", "regular expression to select benchmarks to run")
-var benchTime = flag.Duration("test.benchtime", 1*time.Second, "approximate run time for each benchmark")
-var benchmarkMemory = flag.Bool("test.benchmem", false, "print memory allocations for benchmarks")
-
-// Global lock to ensure only one benchmark runs at a time.
-var benchmarkLock sync.Mutex
-
-// Used for every benchmark for measuring memory.
-var memStats runtime.MemStats
-
-// An internal type but exported because it is cross-package; part of the implementation
-// of the "go test" command.
-type InternalBenchmark struct {
-	Name string
-	F    func(b *B)
-}
-
-// B is a type passed to Benchmark functions to manage benchmark
-// timing and to specify the number of iterations to run.
-type B struct {
-	common
-	N                int
-	previousN        int           // number of iterations in the previous run
-	previousDuration time.Duration // total duration of the previous run
-	benchmark        InternalBenchmark
-	bytes            int64
-	timerOn          bool
-	showAllocResult  bool
-	result           BenchmarkResult
-	parallelism      int // RunParallel creates parallelism*GOMAXPROCS goroutines
-	// The initial states of memStats.Mallocs and memStats.TotalAlloc.
-	startAllocs uint64
-	startBytes  uint64
-	// The net total of this test after being run.
-	netAllocs uint64
-	netBytes  uint64
-}
-
-// StartTimer starts timing a test.  This function is called automatically
-// before a benchmark starts, but it can also used to resume timing after
-// a call to StopTimer.
-func (b *B) StartTimer() {
-	if !b.timerOn {
-		runtime.ReadMemStats(&memStats)
-		b.startAllocs = memStats.Mallocs
-		b.startBytes = memStats.TotalAlloc
-		b.start = time.Now()
-		b.timerOn = true
-	}
-}
-
-// StopTimer stops timing a test.  This can be used to pause the timer
-// while performing complex initialization that you don't
-// want to measure.
-func (b *B) StopTimer() {
-	if b.timerOn {
-		b.duration += time.Now().Sub(b.start)
-		runtime.ReadMemStats(&memStats)
-		b.netAllocs += memStats.Mallocs - b.startAllocs
-		b.netBytes += memStats.TotalAlloc - b.startBytes
-		b.timerOn = false
-	}
-}
-
-// ResetTimer zeros the elapsed benchmark time and memory allocation counters.
-// It does not affect whether the timer is running.
-func (b *B) ResetTimer() {
-	if b.timerOn {
-		runtime.ReadMemStats(&memStats)
-		b.startAllocs = memStats.Mallocs
-		b.startBytes = memStats.TotalAlloc
-		b.start = time.Now()
-	}
-	b.duration = 0
-	b.netAllocs = 0
-	b.netBytes = 0
-}
-
-// SetBytes records the number of bytes processed in a single operation.
-// If this is called, the benchmark will report ns/op and MB/s.
-func (b *B) SetBytes(n int64) { b.bytes = n }
-
-// ReportAllocs enables malloc statistics for this benchmark.
-// It is equivalent to setting -test.benchmem, but it only affects the
-// benchmark function that calls ReportAllocs.
-func (b *B) ReportAllocs() {
-	b.showAllocResult = true
-}
-
-func (b *B) nsPerOp() int64 {
-	if b.N <= 0 {
-		return 0
-	}
-	return b.duration.Nanoseconds() / int64(b.N)
-}
-
-// runN runs a single benchmark for the specified number of iterations.
-func (b *B) runN(n int) {
-	benchmarkLock.Lock()
-	defer benchmarkLock.Unlock()
-	// Try to get a comparable environment for each run
-	// by clearing garbage from previous runs.
-	runtime.GC()
-	b.N = n
-	b.parallelism = 1
-	b.ResetTimer()
-	b.StartTimer()
-	b.benchmark.F(b)
-	b.StopTimer()
-	b.previousN = n
-	b.previousDuration = b.duration
-}
-
-func min(x, y int) int {
-	if x > y {
-		return y
-	}
-	return x
-}
-
-func max(x, y int) int {
-	if x < y {
-		return y
-	}
-	return x
-}
-
-// roundDown10 rounds a number down to the nearest power of 10.
-func roundDown10(n int) int {
-	var tens = 0
-	// tens = floor(log_10(n))
-	for n >= 10 {
-		n = n / 10
-		tens++
-	}
-	// result = 10^tens
-	result := 1
-	for i := 0; i < tens; i++ {
-		result *= 10
-	}
-	return result
-}
-
-// roundUp rounds x up to a number of the form [1eX, 2eX, 3eX, 5eX].
-func roundUp(n int) int {
-	base := roundDown10(n)
-	switch {
-	case n <= base:
-		return base
-	case n <= (2 * base):
-		return 2 * base
-	case n <= (3 * base):
-		return 3 * base
-	case n <= (5 * base):
-		return 5 * base
-	default:
-		return 10 * base
-	}
-}
-
-// run times the benchmark function in a separate goroutine.
-func (b *B) run() BenchmarkResult {
-	go b.launch()
-	<-b.signal
-	return b.result
-}
-
-// launch launches the benchmark function.  It gradually increases the number
-// of benchmark iterations until the benchmark runs for the requested benchtime.
-// It prints timing information in this form
-//		testing.BenchmarkHello	100000		19 ns/op
-// launch is run by the run function as a separate goroutine.
-func (b *B) launch() {
-	// Run the benchmark for a single iteration in case it's expensive.
-	n := 1
-
-	// Signal that we're done whether we return normally
-	// or by FailNow's runtime.Goexit.
-	defer func() {
-		b.signal <- b
-	}()
-
-	b.runN(n)
-	// Run the benchmark for at least the specified amount of time.
-	d := *benchTime
-	for !b.failed && b.duration < d && n < 1e9 {
-		last := n
-		// Predict required iterations.
-		if b.nsPerOp() == 0 {
-			n = 1e9
-		} else {
-			n = int(d.Nanoseconds() / b.nsPerOp())
-		}
-		// Run more iterations than we think we'll need (1.2x).
-		// Don't grow too fast in case we had timing errors previously.
-		// Be sure to run at least one more than last time.
-		n = max(min(n+n/5, 100*last), last+1)
-		// Round up to something easy to read.
-		n = roundUp(n)
-		b.runN(n)
-	}
-	b.result = BenchmarkResult{b.N, b.duration, b.bytes, b.netAllocs, b.netBytes}
-}
-
-// The results of a benchmark run.
-type BenchmarkResult struct {
-	N         int           // The number of iterations.
-	T         time.Duration // The total time taken.
-	Bytes     int64         // Bytes processed in one iteration.
-	MemAllocs uint64        // The total number of memory allocations.
-	MemBytes  uint64        // The total number of bytes allocated.
-}
-
-func (r BenchmarkResult) NsPerOp() int64 {
-	if r.N <= 0 {
-		return 0
-	}
-	return r.T.Nanoseconds() / int64(r.N)
-}
-
-func (r BenchmarkResult) mbPerSec() float64 {
-	if r.Bytes <= 0 || r.T <= 0 || r.N <= 0 {
-		return 0
-	}
-	return (float64(r.Bytes) * float64(r.N) / 1e6) / r.T.Seconds()
-}
-
-func (r BenchmarkResult) AllocsPerOp() int64 {
-	if r.N <= 0 {
-		return 0
-	}
-	return int64(r.MemAllocs) / int64(r.N)
-}
-
-func (r BenchmarkResult) AllocedBytesPerOp() int64 {
-	if r.N <= 0 {
-		return 0
-	}
-	return int64(r.MemBytes) / int64(r.N)
-}
-
-func (r BenchmarkResult) String() string {
-	mbs := r.mbPerSec()
-	mb := ""
-	if mbs != 0 {
-		mb = fmt.Sprintf("\t%7.2f MB/s", mbs)
-	}
-	nsop := r.NsPerOp()
-	ns := fmt.Sprintf("%10d ns/op", nsop)
-	if r.N > 0 && nsop < 100 {
-		// The format specifiers here make sure that
-		// the ones digits line up for all three possible formats.
-		if nsop < 10 {
-			ns = fmt.Sprintf("%13.2f ns/op", float64(r.T.Nanoseconds())/float64(r.N))
-		} else {
-			ns = fmt.Sprintf("%12.1f ns/op", float64(r.T.Nanoseconds())/float64(r.N))
-		}
-	}
-	return fmt.Sprintf("%8d\t%s%s", r.N, ns, mb)
-}
-
-func (r BenchmarkResult) MemString() string {
-	return fmt.Sprintf("%8d B/op\t%8d allocs/op",
-		r.AllocedBytesPerOp(), r.AllocsPerOp())
-}
-
-// benchmarkName returns full name of benchmark including procs suffix.
-func benchmarkName(name string, n int) string {
-	if n != 1 {
-		return fmt.Sprintf("%s-%d", name, n)
-	}
-	return name
-}
-
-// An internal function but exported because it is cross-package; part of the implementation
-// of the "go test" command.
-func RunBenchmarks(matchString func(pat, str string) (bool, error), benchmarks []InternalBenchmark) {
-	// If no flag was specified, don't run benchmarks.
-	if len(*matchBenchmarks) == 0 {
-		return
-	}
-	// Collect matching benchmarks and determine longest name.
-	maxprocs := 1
-	for _, procs := range cpuList {
-		if procs > maxprocs {
-			maxprocs = procs
-		}
-	}
-	maxlen := 0
-	var bs []InternalBenchmark
-	for _, Benchmark := range benchmarks {
-		matched, err := matchString(*matchBenchmarks, Benchmark.Name)
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "testing: invalid regexp for -test.bench: %s\n", err)
-			os.Exit(1)
-		}
-		if matched {
-			bs = append(bs, Benchmark)
-			benchName := benchmarkName(Benchmark.Name, maxprocs)
-			if l := len(benchName); l > maxlen {
-				maxlen = l
-			}
-		}
-	}
-	for _, Benchmark := range bs {
-		for _, procs := range cpuList {
-			runtime.GOMAXPROCS(procs)
-			b := &B{
-				common: common{
-					signal: make(chan interface{}),
-				},
-				benchmark: Benchmark,
-			}
-			benchName := benchmarkName(Benchmark.Name, procs)
-			fmt.Printf("%-*s\t", maxlen, benchName)
-			r := b.run()
-			if b.failed {
-				// The output could be very long here, but probably isn't.
-				// We print it all, regardless, because we don't want to trim the reason
-				// the benchmark failed.
-				fmt.Printf("--- FAIL: %s\n%s", benchName, b.output)
-				continue
-			}
-			results := r.String()
-			if *benchmarkMemory || b.showAllocResult {
-				results += "\t" + r.MemString()
-			}
-			fmt.Println(results)
-			// Unlike with tests, we ignore the -chatty flag and always print output for
-			// benchmarks since the output generation time will skew the results.
-			if len(b.output) > 0 {
-				b.trimOutput()
-				fmt.Printf("--- BENCH: %s\n%s", benchName, b.output)
-			}
-			if p := runtime.GOMAXPROCS(-1); p != procs {
-				fmt.Fprintf(os.Stderr, "testing: %s left GOMAXPROCS set to %d\n", benchName, p)
-			}
-		}
-	}
-}
-
-// trimOutput shortens the output from a benchmark, which can be very long.
-func (b *B) trimOutput() {
-	// The output is likely to appear multiple times because the benchmark
-	// is run multiple times, but at least it will be seen. This is not a big deal
-	// because benchmarks rarely print, but just in case, we trim it if it's too long.
-	const maxNewlines = 10
-	for nlCount, j := 0, 0; j < len(b.output); j++ {
-		if b.output[j] == '\n' {
-			nlCount++
-			if nlCount >= maxNewlines {
-				b.output = append(b.output[:j], "\n\t... [output truncated]\n"...)
-				break
-			}
-		}
-	}
-}
-
-// A PB is used by RunParallel for running parallel benchmarks.
-type PB struct {
-	globalN *uint64 // shared between all worker goroutines iteration counter
-	grain   uint64  // acquire that many iterations from globalN at once
-	cache   uint64  // local cache of acquired iterations
-	bN      uint64  // total number of iterations to execute (b.N)
-}
-
-// Next reports whether there are more iterations to execute.
-func (pb *PB) Next() bool {
-	if pb.cache == 0 {
-		n := atomic.AddUint64(pb.globalN, pb.grain)
-		if n <= pb.bN {
-			pb.cache = pb.grain
-		} else if n < pb.bN+pb.grain {
-			pb.cache = pb.bN + pb.grain - n
-		} else {
-			return false
-		}
-	}
-	pb.cache--
-	return true
-}
-
-// RunParallel runs a benchmark in parallel.
-// It creates multiple goroutines and distributes b.N iterations among them.
-// The number of goroutines defaults to GOMAXPROCS. To increase parallelism for
-// non-CPU-bound benchmarks, call SetParallelism before RunParallel.
-// RunParallel is usually used with the go test -cpu flag.
-//
-// The body function will be run in each goroutine. It should set up any
-// goroutine-local state and then iterate until pb.Next returns false.
-// It should not use the StartTimer, StopTimer, or ResetTimer functions,
-// because they have global effect.
-func (b *B) RunParallel(body func(*PB)) {
-	// Calculate grain size as number of iterations that take ~100µs.
-	// 100µs is enough to amortize the overhead and provide sufficient
-	// dynamic load balancing.
-	grain := uint64(0)
-	if b.previousN > 0 && b.previousDuration > 0 {
-		grain = 1e5 * uint64(b.previousN) / uint64(b.previousDuration)
-	}
-	if grain < 1 {
-		grain = 1
-	}
-	// We expect the inner loop and function call to take at least 10ns,
-	// so do not do more than 100µs/10ns=1e4 iterations.
-	if grain > 1e4 {
-		grain = 1e4
-	}
-
-	n := uint64(0)
-	numProcs := b.parallelism * runtime.GOMAXPROCS(0)
-	var wg sync.WaitGroup
-	wg.Add(numProcs)
-	for p := 0; p < numProcs; p++ {
-		go func() {
-			defer wg.Done()
-			pb := &PB{
-				globalN: &n,
-				grain:   grain,
-				bN:      uint64(b.N),
-			}
-			body(pb)
-		}()
-	}
-	wg.Wait()
-	if n <= uint64(b.N) && !b.Failed() {
-		b.Fatal("RunParallel: body exited without pb.Next() == false")
-	}
-}
-
-// SetParallelism sets the number of goroutines used by RunParallel to p*GOMAXPROCS.
-// There is usually no need to call SetParallelism for CPU-bound benchmarks.
-// If p is less than 1, this call will have no effect.
-func (b *B) SetParallelism(p int) {
-	if p >= 1 {
-		b.parallelism = p
-	}
-}
-
-// Benchmark benchmarks a single function. Useful for creating
-// custom benchmarks that do not use the "go test" command.
-func Benchmark(f func(b *B)) BenchmarkResult {
-	b := &B{
-		common: common{
-			signal: make(chan interface{}),
-		},
-		benchmark: InternalBenchmark{"", f},
-	}
-	return b.run()
-}
diff --git a/third_party/gofrontend/libgo/go/testing/benchmark_test.go b/third_party/gofrontend/libgo/go/testing/benchmark_test.go
deleted file mode 100644
index 431bb53..0000000
--- a/third_party/gofrontend/libgo/go/testing/benchmark_test.go
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package testing_test
-
-import (
-	"bytes"
-	"runtime"
-	"sync/atomic"
-	"testing"
-	"text/template"
-)
-
-var roundDownTests = []struct {
-	v, expected int
-}{
-	{1, 1},
-	{9, 1},
-	{10, 10},
-	{11, 10},
-	{100, 100},
-	{101, 100},
-	{999, 100},
-	{1000, 1000},
-	{1001, 1000},
-}
-
-func TestRoundDown10(t *testing.T) {
-	for _, tt := range roundDownTests {
-		actual := testing.RoundDown10(tt.v)
-		if tt.expected != actual {
-			t.Errorf("roundDown10(%d): expected %d, actual %d", tt.v, tt.expected, actual)
-		}
-	}
-}
-
-var roundUpTests = []struct {
-	v, expected int
-}{
-	{0, 1},
-	{1, 1},
-	{2, 2},
-	{3, 3},
-	{5, 5},
-	{9, 10},
-	{999, 1000},
-	{1000, 1000},
-	{1400, 2000},
-	{1700, 2000},
-	{2700, 3000},
-	{4999, 5000},
-	{5000, 5000},
-	{5001, 10000},
-}
-
-func TestRoundUp(t *testing.T) {
-	for _, tt := range roundUpTests {
-		actual := testing.RoundUp(tt.v)
-		if tt.expected != actual {
-			t.Errorf("roundUp(%d): expected %d, actual %d", tt.v, tt.expected, actual)
-		}
-	}
-}
-
-func TestRunParallel(t *testing.T) {
-	testing.Benchmark(func(b *testing.B) {
-		procs := uint32(0)
-		iters := uint64(0)
-		b.SetParallelism(3)
-		b.RunParallel(func(pb *testing.PB) {
-			atomic.AddUint32(&procs, 1)
-			for pb.Next() {
-				atomic.AddUint64(&iters, 1)
-			}
-		})
-		if want := uint32(3 * runtime.GOMAXPROCS(0)); procs != want {
-			t.Errorf("got %v procs, want %v", procs, want)
-		}
-		if iters != uint64(b.N) {
-			t.Errorf("got %v iters, want %v", iters, b.N)
-		}
-	})
-}
-
-func TestRunParallelFail(t *testing.T) {
-	testing.Benchmark(func(b *testing.B) {
-		b.RunParallel(func(pb *testing.PB) {
-			// The function must be able to log/abort
-			// w/o crashing/deadlocking the whole benchmark.
-			b.Log("log")
-			b.Error("error")
-		})
-	})
-}
-
-func ExampleB_RunParallel() {
-	// Parallel benchmark for text/template.Template.Execute on a single object.
-	testing.Benchmark(func(b *testing.B) {
-		templ := template.Must(template.New("test").Parse("Hello, {{.}}!"))
-		// RunParallel will create GOMAXPROCS goroutines
-		// and distribute work among them.
-		b.RunParallel(func(pb *testing.PB) {
-			// Each goroutine has its own bytes.Buffer.
-			var buf bytes.Buffer
-			for pb.Next() {
-				// The loop body is executed b.N times total across all goroutines.
-				buf.Reset()
-				templ.Execute(&buf, "World")
-			}
-		})
-	})
-}
diff --git a/third_party/gofrontend/libgo/go/testing/cover.go b/third_party/gofrontend/libgo/go/testing/cover.go
deleted file mode 100644
index a4ce37f..0000000
--- a/third_party/gofrontend/libgo/go/testing/cover.go
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Support for test coverage.
-
-package testing
-
-import (
-	"fmt"
-	"os"
-	"sync/atomic"
-)
-
-// CoverBlock records the coverage data for a single basic block.
-// NOTE: This struct is internal to the testing infrastructure and may change.
-// It is not covered (yet) by the Go 1 compatibility guidelines.
-type CoverBlock struct {
-	Line0 uint32
-	Col0  uint16
-	Line1 uint32
-	Col1  uint16
-	Stmts uint16
-}
-
-var cover Cover
-
-// Cover records information about test coverage checking.
-// NOTE: This struct is internal to the testing infrastructure and may change.
-// It is not covered (yet) by the Go 1 compatibility guidelines.
-type Cover struct {
-	Mode            string
-	Counters        map[string][]uint32
-	Blocks          map[string][]CoverBlock
-	CoveredPackages string
-}
-
-// Coverage reports the current code coverage as a fraction in the range [0, 1].
-// If coverage is not enabled, Coverage returns 0.
-//
-// When running a large set of sequential test cases, checking Coverage after each one
-// can be useful for identifying which test cases exercise new code paths.
-// It is not a replacement for the reports generated by 'go test -cover' and
-// 'go tool cover'.
-func Coverage() float64 {
-	var n, d int64
-	for _, counters := range cover.Counters {
-		for i := range counters {
-			if atomic.LoadUint32(&counters[i]) > 0 {
-				n++
-			}
-			d++
-		}
-	}
-	if d == 0 {
-		return 0
-	}
-	return float64(n) / float64(d)
-}
-
-// RegisterCover records the coverage data accumulators for the tests.
-// NOTE: This function is internal to the testing infrastructure and may change.
-// It is not covered (yet) by the Go 1 compatibility guidelines.
-func RegisterCover(c Cover) {
-	cover = c
-}
-
-// mustBeNil checks the error and, if present, reports it and exits.
-func mustBeNil(err error) {
-	if err != nil {
-		fmt.Fprintf(os.Stderr, "testing: %s\n", err)
-		os.Exit(2)
-	}
-}
-
-// coverReport reports the coverage percentage and writes a coverage profile if requested.
-func coverReport() {
-	var f *os.File
-	var err error
-	if *coverProfile != "" {
-		f, err = os.Create(toOutputDir(*coverProfile))
-		mustBeNil(err)
-		fmt.Fprintf(f, "mode: %s\n", cover.Mode)
-		defer func() { mustBeNil(f.Close()) }()
-	}
-
-	var active, total int64
-	var count uint32
-	for name, counts := range cover.Counters {
-		blocks := cover.Blocks[name]
-		for i := range counts {
-			stmts := int64(blocks[i].Stmts)
-			total += stmts
-			count = atomic.LoadUint32(&counts[i]) // For -mode=atomic.
-			if count > 0 {
-				active += stmts
-			}
-			if f != nil {
-				_, err := fmt.Fprintf(f, "%s:%d.%d,%d.%d %d %d\n", name,
-					blocks[i].Line0, blocks[i].Col0,
-					blocks[i].Line1, blocks[i].Col1,
-					stmts,
-					count)
-				mustBeNil(err)
-			}
-		}
-	}
-	if total == 0 {
-		total = 1
-	}
-	fmt.Printf("coverage: %.1f%% of statements%s\n", 100*float64(active)/float64(total), cover.CoveredPackages)
-}
diff --git a/third_party/gofrontend/libgo/go/testing/example.go b/third_party/gofrontend/libgo/go/testing/example.go
deleted file mode 100644
index 30baf27..0000000
--- a/third_party/gofrontend/libgo/go/testing/example.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package testing
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"os"
-	"strings"
-	"time"
-)
-
-type InternalExample struct {
-	Name   string
-	F      func()
-	Output string
-}
-
-func RunExamples(matchString func(pat, str string) (bool, error), examples []InternalExample) (ok bool) {
-	ok = true
-
-	var eg InternalExample
-
-	for _, eg = range examples {
-		matched, err := matchString(*match, eg.Name)
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "testing: invalid regexp for -test.run: %s\n", err)
-			os.Exit(1)
-		}
-		if !matched {
-			continue
-		}
-		if !runExample(eg) {
-			ok = false
-		}
-	}
-
-	return
-}
-
-func runExample(eg InternalExample) (ok bool) {
-	if *chatty {
-		fmt.Printf("=== RUN   %s\n", eg.Name)
-	}
-
-	// Capture stdout.
-	stdout := os.Stdout
-	r, w, err := os.Pipe()
-	if err != nil {
-		fmt.Fprintln(os.Stderr, err)
-		os.Exit(1)
-	}
-	os.Stdout = w
-	outC := make(chan string)
-	go func() {
-		var buf bytes.Buffer
-		_, err := io.Copy(&buf, r)
-		r.Close()
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "testing: copying pipe: %v\n", err)
-			os.Exit(1)
-		}
-		outC <- buf.String()
-	}()
-
-	start := time.Now()
-	ok = true
-
-	// Clean up in a deferred call so we can recover if the example panics.
-	defer func() {
-		dstr := fmtDuration(time.Now().Sub(start))
-
-		// Close pipe, restore stdout, get output.
-		w.Close()
-		os.Stdout = stdout
-		out := <-outC
-
-		var fail string
-		err := recover()
-		if g, e := strings.TrimSpace(out), strings.TrimSpace(eg.Output); g != e && err == nil {
-			fail = fmt.Sprintf("got:\n%s\nwant:\n%s\n", g, e)
-		}
-		if fail != "" || err != nil {
-			fmt.Printf("--- FAIL: %s (%s)\n%s", eg.Name, dstr, fail)
-			ok = false
-		} else if *chatty {
-			fmt.Printf("--- PASS: %s (%s)\n", eg.Name, dstr)
-		}
-		if err != nil {
-			panic(err)
-		}
-	}()
-
-	// Run example.
-	eg.F()
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/testing/export_test.go b/third_party/gofrontend/libgo/go/testing/export_test.go
deleted file mode 100644
index 89781b4..0000000
--- a/third_party/gofrontend/libgo/go/testing/export_test.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package testing
-
-var (
-	RoundDown10 = roundDown10
-	RoundUp     = roundUp
-)
diff --git a/third_party/gofrontend/libgo/go/testing/iotest/logger.go b/third_party/gofrontend/libgo/go/testing/iotest/logger.go
deleted file mode 100644
index 0aec15c..0000000
--- a/third_party/gofrontend/libgo/go/testing/iotest/logger.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package iotest
-
-import (
-	"io"
-	"log"
-)
-
-type writeLogger struct {
-	prefix string
-	w      io.Writer
-}
-
-func (l *writeLogger) Write(p []byte) (n int, err error) {
-	n, err = l.w.Write(p)
-	if err != nil {
-		log.Printf("%s %x: %v", l.prefix, p[0:n], err)
-	} else {
-		log.Printf("%s %x", l.prefix, p[0:n])
-	}
-	return
-}
-
-// NewWriteLogger returns a writer that behaves like w except
-// that it logs (using log.Printf) each write to standard error,
-// printing the prefix and the hexadecimal data written.
-func NewWriteLogger(prefix string, w io.Writer) io.Writer {
-	return &writeLogger{prefix, w}
-}
-
-type readLogger struct {
-	prefix string
-	r      io.Reader
-}
-
-func (l *readLogger) Read(p []byte) (n int, err error) {
-	n, err = l.r.Read(p)
-	if err != nil {
-		log.Printf("%s %x: %v", l.prefix, p[0:n], err)
-	} else {
-		log.Printf("%s %x", l.prefix, p[0:n])
-	}
-	return
-}
-
-// NewReadLogger returns a reader that behaves like r except
-// that it logs (using log.Print) each read to standard error,
-// printing the prefix and the hexadecimal data read.
-func NewReadLogger(prefix string, r io.Reader) io.Reader {
-	return &readLogger{prefix, r}
-}
diff --git a/third_party/gofrontend/libgo/go/testing/iotest/reader.go b/third_party/gofrontend/libgo/go/testing/iotest/reader.go
deleted file mode 100644
index a5bccca..0000000
--- a/third_party/gofrontend/libgo/go/testing/iotest/reader.go
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package iotest implements Readers and Writers useful mainly for testing.
-package iotest
-
-import (
-	"errors"
-	"io"
-)
-
-// OneByteReader returns a Reader that implements
-// each non-empty Read by reading one byte from r.
-func OneByteReader(r io.Reader) io.Reader { return &oneByteReader{r} }
-
-type oneByteReader struct {
-	r io.Reader
-}
-
-func (r *oneByteReader) Read(p []byte) (int, error) {
-	if len(p) == 0 {
-		return 0, nil
-	}
-	return r.r.Read(p[0:1])
-}
-
-// HalfReader returns a Reader that implements Read
-// by reading half as many requested bytes from r.
-func HalfReader(r io.Reader) io.Reader { return &halfReader{r} }
-
-type halfReader struct {
-	r io.Reader
-}
-
-func (r *halfReader) Read(p []byte) (int, error) {
-	return r.r.Read(p[0 : (len(p)+1)/2])
-}
-
-// DataErrReader changes the way errors are handled by a Reader. Normally, a
-// Reader returns an error (typically EOF) from the first Read call after the
-// last piece of data is read. DataErrReader wraps a Reader and changes its
-// behavior so the final error is returned along with the final data, instead
-// of in the first call after the final data.
-func DataErrReader(r io.Reader) io.Reader { return &dataErrReader{r, nil, make([]byte, 1024)} }
-
-type dataErrReader struct {
-	r      io.Reader
-	unread []byte
-	data   []byte
-}
-
-func (r *dataErrReader) Read(p []byte) (n int, err error) {
-	// loop because first call needs two reads:
-	// one to get data and a second to look for an error.
-	for {
-		if len(r.unread) == 0 {
-			n1, err1 := r.r.Read(r.data)
-			r.unread = r.data[0:n1]
-			err = err1
-		}
-		if n > 0 || err != nil {
-			break
-		}
-		n = copy(p, r.unread)
-		r.unread = r.unread[n:]
-	}
-	return
-}
-
-var ErrTimeout = errors.New("timeout")
-
-// TimeoutReader returns ErrTimeout on the second read
-// with no data.  Subsequent calls to read succeed.
-func TimeoutReader(r io.Reader) io.Reader { return &timeoutReader{r, 0} }
-
-type timeoutReader struct {
-	r     io.Reader
-	count int
-}
-
-func (r *timeoutReader) Read(p []byte) (int, error) {
-	r.count++
-	if r.count == 2 {
-		return 0, ErrTimeout
-	}
-	return r.r.Read(p)
-}
diff --git a/third_party/gofrontend/libgo/go/testing/iotest/writer.go b/third_party/gofrontend/libgo/go/testing/iotest/writer.go
deleted file mode 100644
index af61ab8..0000000
--- a/third_party/gofrontend/libgo/go/testing/iotest/writer.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package iotest
-
-import "io"
-
-// TruncateWriter returns a Writer that writes to w
-// but stops silently after n bytes.
-func TruncateWriter(w io.Writer, n int64) io.Writer {
-	return &truncateWriter{w, n}
-}
-
-type truncateWriter struct {
-	w io.Writer
-	n int64
-}
-
-func (t *truncateWriter) Write(p []byte) (n int, err error) {
-	if t.n <= 0 {
-		return len(p), nil
-	}
-	// real write
-	n = len(p)
-	if int64(n) > t.n {
-		n = int(t.n)
-	}
-	n, err = t.w.Write(p[0:n])
-	t.n -= int64(n)
-	if err == nil {
-		n = len(p)
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/testing/quick/quick.go b/third_party/gofrontend/libgo/go/testing/quick/quick.go
deleted file mode 100644
index 13c56cd..0000000
--- a/third_party/gofrontend/libgo/go/testing/quick/quick.go
+++ /dev/null
@@ -1,370 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package quick implements utility functions to help with black box testing.
-package quick
-
-import (
-	"flag"
-	"fmt"
-	"math"
-	"math/rand"
-	"reflect"
-	"strings"
-)
-
-var defaultMaxCount *int = flag.Int("quickchecks", 100, "The default number of iterations for each check")
-
-// A Generator can generate random values of its own type.
-type Generator interface {
-	// Generate returns a random instance of the type on which it is a
-	// method using the size as a size hint.
-	Generate(rand *rand.Rand, size int) reflect.Value
-}
-
-// randFloat32 generates a random float taking the full range of a float32.
-func randFloat32(rand *rand.Rand) float32 {
-	f := rand.Float64() * math.MaxFloat32
-	if rand.Int()&1 == 1 {
-		f = -f
-	}
-	return float32(f)
-}
-
-// randFloat64 generates a random float taking the full range of a float64.
-func randFloat64(rand *rand.Rand) float64 {
-	f := rand.Float64() * math.MaxFloat64
-	if rand.Int()&1 == 1 {
-		f = -f
-	}
-	return f
-}
-
-// randInt64 returns a random integer taking half the range of an int64.
-func randInt64(rand *rand.Rand) int64 { return rand.Int63() - 1<<62 }
-
-// complexSize is the maximum length of arbitrary values that contain other
-// values.
-const complexSize = 50
-
-// Value returns an arbitrary value of the given type.
-// If the type implements the Generator interface, that will be used.
-// Note: To create arbitrary values for structs, all the fields must be exported.
-func Value(t reflect.Type, rand *rand.Rand) (value reflect.Value, ok bool) {
-	if m, ok := reflect.Zero(t).Interface().(Generator); ok {
-		return m.Generate(rand, complexSize), true
-	}
-
-	v := reflect.New(t).Elem()
-	switch concrete := t; concrete.Kind() {
-	case reflect.Bool:
-		v.SetBool(rand.Int()&1 == 0)
-	case reflect.Float32:
-		v.SetFloat(float64(randFloat32(rand)))
-	case reflect.Float64:
-		v.SetFloat(randFloat64(rand))
-	case reflect.Complex64:
-		v.SetComplex(complex(float64(randFloat32(rand)), float64(randFloat32(rand))))
-	case reflect.Complex128:
-		v.SetComplex(complex(randFloat64(rand), randFloat64(rand)))
-	case reflect.Int16:
-		v.SetInt(randInt64(rand))
-	case reflect.Int32:
-		v.SetInt(randInt64(rand))
-	case reflect.Int64:
-		v.SetInt(randInt64(rand))
-	case reflect.Int8:
-		v.SetInt(randInt64(rand))
-	case reflect.Int:
-		v.SetInt(randInt64(rand))
-	case reflect.Uint16:
-		v.SetUint(uint64(randInt64(rand)))
-	case reflect.Uint32:
-		v.SetUint(uint64(randInt64(rand)))
-	case reflect.Uint64:
-		v.SetUint(uint64(randInt64(rand)))
-	case reflect.Uint8:
-		v.SetUint(uint64(randInt64(rand)))
-	case reflect.Uint:
-		v.SetUint(uint64(randInt64(rand)))
-	case reflect.Uintptr:
-		v.SetUint(uint64(randInt64(rand)))
-	case reflect.Map:
-		numElems := rand.Intn(complexSize)
-		v.Set(reflect.MakeMap(concrete))
-		for i := 0; i < numElems; i++ {
-			key, ok1 := Value(concrete.Key(), rand)
-			value, ok2 := Value(concrete.Elem(), rand)
-			if !ok1 || !ok2 {
-				return reflect.Value{}, false
-			}
-			v.SetMapIndex(key, value)
-		}
-	case reflect.Ptr:
-		if rand.Intn(complexSize) == 0 {
-			v.Set(reflect.Zero(concrete)) // Generate nil pointer.
-		} else {
-			elem, ok := Value(concrete.Elem(), rand)
-			if !ok {
-				return reflect.Value{}, false
-			}
-			v.Set(reflect.New(concrete.Elem()))
-			v.Elem().Set(elem)
-		}
-	case reflect.Slice:
-		numElems := rand.Intn(complexSize)
-		v.Set(reflect.MakeSlice(concrete, numElems, numElems))
-		for i := 0; i < numElems; i++ {
-			elem, ok := Value(concrete.Elem(), rand)
-			if !ok {
-				return reflect.Value{}, false
-			}
-			v.Index(i).Set(elem)
-		}
-	case reflect.Array:
-		for i := 0; i < v.Len(); i++ {
-			elem, ok := Value(concrete.Elem(), rand)
-			if !ok {
-				return reflect.Value{}, false
-			}
-			v.Index(i).Set(elem)
-		}
-	case reflect.String:
-		numChars := rand.Intn(complexSize)
-		codePoints := make([]rune, numChars)
-		for i := 0; i < numChars; i++ {
-			codePoints[i] = rune(rand.Intn(0x10ffff))
-		}
-		v.SetString(string(codePoints))
-	case reflect.Struct:
-		for i := 0; i < v.NumField(); i++ {
-			elem, ok := Value(concrete.Field(i).Type, rand)
-			if !ok {
-				return reflect.Value{}, false
-			}
-			v.Field(i).Set(elem)
-		}
-	default:
-		return reflect.Value{}, false
-	}
-
-	return v, true
-}
-
-// A Config structure contains options for running a test.
-type Config struct {
-	// MaxCount sets the maximum number of iterations. If zero,
-	// MaxCountScale is used.
-	MaxCount int
-	// MaxCountScale is a non-negative scale factor applied to the default
-	// maximum. If zero, the default is unchanged.
-	MaxCountScale float64
-	// If non-nil, rand is a source of random numbers. Otherwise a default
-	// pseudo-random source will be used.
-	Rand *rand.Rand
-	// If non-nil, the Values function generates a slice of arbitrary
-	// reflect.Values that are congruent with the arguments to the function
-	// being tested. Otherwise, the top-level Value function is used
-	// to generate them.
-	Values func([]reflect.Value, *rand.Rand)
-}
-
-var defaultConfig Config
-
-// getRand returns the *rand.Rand to use for a given Config.
-func (c *Config) getRand() *rand.Rand {
-	if c.Rand == nil {
-		return rand.New(rand.NewSource(0))
-	}
-	return c.Rand
-}
-
-// getMaxCount returns the maximum number of iterations to run for a given
-// Config.
-func (c *Config) getMaxCount() (maxCount int) {
-	maxCount = c.MaxCount
-	if maxCount == 0 {
-		if c.MaxCountScale != 0 {
-			maxCount = int(c.MaxCountScale * float64(*defaultMaxCount))
-		} else {
-			maxCount = *defaultMaxCount
-		}
-	}
-
-	return
-}
-
-// A SetupError is the result of an error in the way that check is being
-// used, independent of the functions being tested.
-type SetupError string
-
-func (s SetupError) Error() string { return string(s) }
-
-// A CheckError is the result of Check finding an error.
-type CheckError struct {
-	Count int
-	In    []interface{}
-}
-
-func (s *CheckError) Error() string {
-	return fmt.Sprintf("#%d: failed on input %s", s.Count, toString(s.In))
-}
-
-// A CheckEqualError is the result CheckEqual finding an error.
-type CheckEqualError struct {
-	CheckError
-	Out1 []interface{}
-	Out2 []interface{}
-}
-
-func (s *CheckEqualError) Error() string {
-	return fmt.Sprintf("#%d: failed on input %s. Output 1: %s. Output 2: %s", s.Count, toString(s.In), toString(s.Out1), toString(s.Out2))
-}
-
-// Check looks for an input to f, any function that returns bool,
-// such that f returns false.  It calls f repeatedly, with arbitrary
-// values for each argument.  If f returns false on a given input,
-// Check returns that input as a *CheckError.
-// For example:
-//
-// 	func TestOddMultipleOfThree(t *testing.T) {
-// 		f := func(x int) bool {
-// 			y := OddMultipleOfThree(x)
-// 			return y%2 == 1 && y%3 == 0
-// 		}
-// 		if err := quick.Check(f, nil); err != nil {
-// 			t.Error(err)
-// 		}
-// 	}
-func Check(f interface{}, config *Config) (err error) {
-	if config == nil {
-		config = &defaultConfig
-	}
-
-	fVal, fType, ok := functionAndType(f)
-	if !ok {
-		err = SetupError("argument is not a function")
-		return
-	}
-
-	if fType.NumOut() != 1 {
-		err = SetupError("function does not return one value")
-		return
-	}
-	if fType.Out(0).Kind() != reflect.Bool {
-		err = SetupError("function does not return a bool")
-		return
-	}
-
-	arguments := make([]reflect.Value, fType.NumIn())
-	rand := config.getRand()
-	maxCount := config.getMaxCount()
-
-	for i := 0; i < maxCount; i++ {
-		err = arbitraryValues(arguments, fType, config, rand)
-		if err != nil {
-			return
-		}
-
-		if !fVal.Call(arguments)[0].Bool() {
-			err = &CheckError{i + 1, toInterfaces(arguments)}
-			return
-		}
-	}
-
-	return
-}
-
-// CheckEqual looks for an input on which f and g return different results.
-// It calls f and g repeatedly with arbitrary values for each argument.
-// If f and g return different answers, CheckEqual returns a *CheckEqualError
-// describing the input and the outputs.
-func CheckEqual(f, g interface{}, config *Config) (err error) {
-	if config == nil {
-		config = &defaultConfig
-	}
-
-	x, xType, ok := functionAndType(f)
-	if !ok {
-		err = SetupError("f is not a function")
-		return
-	}
-	y, yType, ok := functionAndType(g)
-	if !ok {
-		err = SetupError("g is not a function")
-		return
-	}
-
-	if xType != yType {
-		err = SetupError("functions have different types")
-		return
-	}
-
-	arguments := make([]reflect.Value, xType.NumIn())
-	rand := config.getRand()
-	maxCount := config.getMaxCount()
-
-	for i := 0; i < maxCount; i++ {
-		err = arbitraryValues(arguments, xType, config, rand)
-		if err != nil {
-			return
-		}
-
-		xOut := toInterfaces(x.Call(arguments))
-		yOut := toInterfaces(y.Call(arguments))
-
-		if !reflect.DeepEqual(xOut, yOut) {
-			err = &CheckEqualError{CheckError{i + 1, toInterfaces(arguments)}, xOut, yOut}
-			return
-		}
-	}
-
-	return
-}
-
-// arbitraryValues writes Values to args such that args contains Values
-// suitable for calling f.
-func arbitraryValues(args []reflect.Value, f reflect.Type, config *Config, rand *rand.Rand) (err error) {
-	if config.Values != nil {
-		config.Values(args, rand)
-		return
-	}
-
-	for j := 0; j < len(args); j++ {
-		var ok bool
-		args[j], ok = Value(f.In(j), rand)
-		if !ok {
-			err = SetupError(fmt.Sprintf("cannot create arbitrary value of type %s for argument %d", f.In(j), j))
-			return
-		}
-	}
-
-	return
-}
-
-func functionAndType(f interface{}) (v reflect.Value, t reflect.Type, ok bool) {
-	v = reflect.ValueOf(f)
-	ok = v.Kind() == reflect.Func
-	if !ok {
-		return
-	}
-	t = v.Type()
-	return
-}
-
-func toInterfaces(values []reflect.Value) []interface{} {
-	ret := make([]interface{}, len(values))
-	for i, v := range values {
-		ret[i] = v.Interface()
-	}
-	return ret
-}
-
-func toString(interfaces []interface{}) string {
-	s := make([]string, len(interfaces))
-	for i, v := range interfaces {
-		s[i] = fmt.Sprintf("%#v", v)
-	}
-	return strings.Join(s, ", ")
-}
diff --git a/third_party/gofrontend/libgo/go/testing/quick/quick_test.go b/third_party/gofrontend/libgo/go/testing/quick/quick_test.go
deleted file mode 100644
index c79f30e..0000000
--- a/third_party/gofrontend/libgo/go/testing/quick/quick_test.go
+++ /dev/null
@@ -1,274 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package quick
-
-import (
-	"math/rand"
-	"reflect"
-	"testing"
-)
-
-func fArray(a [4]byte) [4]byte { return a }
-
-type TestArrayAlias [4]byte
-
-func fArrayAlias(a TestArrayAlias) TestArrayAlias { return a }
-
-func fBool(a bool) bool { return a }
-
-type TestBoolAlias bool
-
-func fBoolAlias(a TestBoolAlias) TestBoolAlias { return a }
-
-func fFloat32(a float32) float32 { return a }
-
-type TestFloat32Alias float32
-
-func fFloat32Alias(a TestFloat32Alias) TestFloat32Alias { return a }
-
-func fFloat64(a float64) float64 { return a }
-
-type TestFloat64Alias float64
-
-func fFloat64Alias(a TestFloat64Alias) TestFloat64Alias { return a }
-
-func fComplex64(a complex64) complex64 { return a }
-
-type TestComplex64Alias complex64
-
-func fComplex64Alias(a TestComplex64Alias) TestComplex64Alias { return a }
-
-func fComplex128(a complex128) complex128 { return a }
-
-type TestComplex128Alias complex128
-
-func fComplex128Alias(a TestComplex128Alias) TestComplex128Alias { return a }
-
-func fInt16(a int16) int16 { return a }
-
-type TestInt16Alias int16
-
-func fInt16Alias(a TestInt16Alias) TestInt16Alias { return a }
-
-func fInt32(a int32) int32 { return a }
-
-type TestInt32Alias int32
-
-func fInt32Alias(a TestInt32Alias) TestInt32Alias { return a }
-
-func fInt64(a int64) int64 { return a }
-
-type TestInt64Alias int64
-
-func fInt64Alias(a TestInt64Alias) TestInt64Alias { return a }
-
-func fInt8(a int8) int8 { return a }
-
-type TestInt8Alias int8
-
-func fInt8Alias(a TestInt8Alias) TestInt8Alias { return a }
-
-func fInt(a int) int { return a }
-
-type TestIntAlias int
-
-func fIntAlias(a TestIntAlias) TestIntAlias { return a }
-
-func fMap(a map[int]int) map[int]int { return a }
-
-type TestMapAlias map[int]int
-
-func fMapAlias(a TestMapAlias) TestMapAlias { return a }
-
-func fPtr(a *int) *int {
-	if a == nil {
-		return nil
-	}
-	b := *a
-	return &b
-}
-
-type TestPtrAlias *int
-
-func fPtrAlias(a TestPtrAlias) TestPtrAlias { return a }
-
-func fSlice(a []byte) []byte { return a }
-
-type TestSliceAlias []byte
-
-func fSliceAlias(a TestSliceAlias) TestSliceAlias { return a }
-
-func fString(a string) string { return a }
-
-type TestStringAlias string
-
-func fStringAlias(a TestStringAlias) TestStringAlias { return a }
-
-type TestStruct struct {
-	A int
-	B string
-}
-
-func fStruct(a TestStruct) TestStruct { return a }
-
-type TestStructAlias TestStruct
-
-func fStructAlias(a TestStructAlias) TestStructAlias { return a }
-
-func fUint16(a uint16) uint16 { return a }
-
-type TestUint16Alias uint16
-
-func fUint16Alias(a TestUint16Alias) TestUint16Alias { return a }
-
-func fUint32(a uint32) uint32 { return a }
-
-type TestUint32Alias uint32
-
-func fUint32Alias(a TestUint32Alias) TestUint32Alias { return a }
-
-func fUint64(a uint64) uint64 { return a }
-
-type TestUint64Alias uint64
-
-func fUint64Alias(a TestUint64Alias) TestUint64Alias { return a }
-
-func fUint8(a uint8) uint8 { return a }
-
-type TestUint8Alias uint8
-
-func fUint8Alias(a TestUint8Alias) TestUint8Alias { return a }
-
-func fUint(a uint) uint { return a }
-
-type TestUintAlias uint
-
-func fUintAlias(a TestUintAlias) TestUintAlias { return a }
-
-func fUintptr(a uintptr) uintptr { return a }
-
-type TestUintptrAlias uintptr
-
-func fUintptrAlias(a TestUintptrAlias) TestUintptrAlias { return a }
-
-func reportError(property string, err error, t *testing.T) {
-	if err != nil {
-		t.Errorf("%s: %s", property, err)
-	}
-}
-
-func TestCheckEqual(t *testing.T) {
-	reportError("fArray", CheckEqual(fArray, fArray, nil), t)
-	reportError("fArrayAlias", CheckEqual(fArrayAlias, fArrayAlias, nil), t)
-	reportError("fBool", CheckEqual(fBool, fBool, nil), t)
-	reportError("fBoolAlias", CheckEqual(fBoolAlias, fBoolAlias, nil), t)
-	reportError("fFloat32", CheckEqual(fFloat32, fFloat32, nil), t)
-	reportError("fFloat32Alias", CheckEqual(fFloat32Alias, fFloat32Alias, nil), t)
-	reportError("fFloat64", CheckEqual(fFloat64, fFloat64, nil), t)
-	reportError("fFloat64Alias", CheckEqual(fFloat64Alias, fFloat64Alias, nil), t)
-	reportError("fComplex64", CheckEqual(fComplex64, fComplex64, nil), t)
-	reportError("fComplex64Alias", CheckEqual(fComplex64Alias, fComplex64Alias, nil), t)
-	reportError("fComplex128", CheckEqual(fComplex128, fComplex128, nil), t)
-	reportError("fComplex128Alias", CheckEqual(fComplex128Alias, fComplex128Alias, nil), t)
-	reportError("fInt16", CheckEqual(fInt16, fInt16, nil), t)
-	reportError("fInt16Alias", CheckEqual(fInt16Alias, fInt16Alias, nil), t)
-	reportError("fInt32", CheckEqual(fInt32, fInt32, nil), t)
-	reportError("fInt32Alias", CheckEqual(fInt32Alias, fInt32Alias, nil), t)
-	reportError("fInt64", CheckEqual(fInt64, fInt64, nil), t)
-	reportError("fInt64Alias", CheckEqual(fInt64Alias, fInt64Alias, nil), t)
-	reportError("fInt8", CheckEqual(fInt8, fInt8, nil), t)
-	reportError("fInt8Alias", CheckEqual(fInt8Alias, fInt8Alias, nil), t)
-	reportError("fInt", CheckEqual(fInt, fInt, nil), t)
-	reportError("fIntAlias", CheckEqual(fIntAlias, fIntAlias, nil), t)
-	reportError("fInt32", CheckEqual(fInt32, fInt32, nil), t)
-	reportError("fInt32Alias", CheckEqual(fInt32Alias, fInt32Alias, nil), t)
-	reportError("fMap", CheckEqual(fMap, fMap, nil), t)
-	reportError("fMapAlias", CheckEqual(fMapAlias, fMapAlias, nil), t)
-	reportError("fPtr", CheckEqual(fPtr, fPtr, nil), t)
-	reportError("fPtrAlias", CheckEqual(fPtrAlias, fPtrAlias, nil), t)
-	reportError("fSlice", CheckEqual(fSlice, fSlice, nil), t)
-	reportError("fSliceAlias", CheckEqual(fSliceAlias, fSliceAlias, nil), t)
-	reportError("fString", CheckEqual(fString, fString, nil), t)
-	reportError("fStringAlias", CheckEqual(fStringAlias, fStringAlias, nil), t)
-	reportError("fStruct", CheckEqual(fStruct, fStruct, nil), t)
-	reportError("fStructAlias", CheckEqual(fStructAlias, fStructAlias, nil), t)
-	reportError("fUint16", CheckEqual(fUint16, fUint16, nil), t)
-	reportError("fUint16Alias", CheckEqual(fUint16Alias, fUint16Alias, nil), t)
-	reportError("fUint32", CheckEqual(fUint32, fUint32, nil), t)
-	reportError("fUint32Alias", CheckEqual(fUint32Alias, fUint32Alias, nil), t)
-	reportError("fUint64", CheckEqual(fUint64, fUint64, nil), t)
-	reportError("fUint64Alias", CheckEqual(fUint64Alias, fUint64Alias, nil), t)
-	reportError("fUint8", CheckEqual(fUint8, fUint8, nil), t)
-	reportError("fUint8Alias", CheckEqual(fUint8Alias, fUint8Alias, nil), t)
-	reportError("fUint", CheckEqual(fUint, fUint, nil), t)
-	reportError("fUintAlias", CheckEqual(fUintAlias, fUintAlias, nil), t)
-	reportError("fUintptr", CheckEqual(fUintptr, fUintptr, nil), t)
-	reportError("fUintptrAlias", CheckEqual(fUintptrAlias, fUintptrAlias, nil), t)
-}
-
-// This tests that ArbitraryValue is working by checking that all the arbitrary
-// values of type MyStruct have x = 42.
-type myStruct struct {
-	x int
-}
-
-func (m myStruct) Generate(r *rand.Rand, _ int) reflect.Value {
-	return reflect.ValueOf(myStruct{x: 42})
-}
-
-func myStructProperty(in myStruct) bool { return in.x == 42 }
-
-func TestCheckProperty(t *testing.T) {
-	reportError("myStructProperty", Check(myStructProperty, nil), t)
-}
-
-func TestFailure(t *testing.T) {
-	f := func(x int) bool { return false }
-	err := Check(f, nil)
-	if err == nil {
-		t.Errorf("Check didn't return an error")
-	}
-	if _, ok := err.(*CheckError); !ok {
-		t.Errorf("Error was not a CheckError: %s", err)
-	}
-
-	err = CheckEqual(fUint, fUint32, nil)
-	if err == nil {
-		t.Errorf("#1 CheckEqual didn't return an error")
-	}
-	if _, ok := err.(SetupError); !ok {
-		t.Errorf("#1 Error was not a SetupError: %s", err)
-	}
-
-	err = CheckEqual(func(x, y int) {}, func(x int) {}, nil)
-	if err == nil {
-		t.Errorf("#2 CheckEqual didn't return an error")
-	}
-	if _, ok := err.(SetupError); !ok {
-		t.Errorf("#2 Error was not a SetupError: %s", err)
-	}
-
-	err = CheckEqual(func(x int) int { return 0 }, func(x int) int32 { return 0 }, nil)
-	if err == nil {
-		t.Errorf("#3 CheckEqual didn't return an error")
-	}
-	if _, ok := err.(SetupError); !ok {
-		t.Errorf("#3 Error was not a SetupError: %s", err)
-	}
-}
-
-// The following test didn't terminate because nil pointers were not
-// generated.
-// Issue 8818.
-func TestNilPointers(t *testing.T) {
-	type Recursive struct {
-		Next *Recursive
-	}
-
-	f := func(rec Recursive) bool {
-		return true
-	}
-	Check(f, nil)
-}
diff --git a/third_party/gofrontend/libgo/go/testing/testing.go b/third_party/gofrontend/libgo/go/testing/testing.go
deleted file mode 100644
index 9ec3869..0000000
--- a/third_party/gofrontend/libgo/go/testing/testing.go
+++ /dev/null
@@ -1,739 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package testing provides support for automated testing of Go packages.
-// It is intended to be used in concert with the ``go test'' command, which automates
-// execution of any function of the form
-//     func TestXxx(*testing.T)
-// where Xxx can be any alphanumeric string (but the first letter must not be in
-// [a-z]) and serves to identify the test routine.
-//
-// Within these functions, use the Error, Fail or related methods to signal failure.
-//
-// To write a new test suite, create a file whose name ends _test.go that
-// contains the TestXxx functions as described here. Put the file in the same
-// package as the one being tested. The file will be excluded from regular
-// package builds but will be included when the ``go test'' command is run.
-// For more detail, run ``go help test'' and ``go help testflag''.
-//
-// Tests and benchmarks may be skipped if not applicable with a call to
-// the Skip method of *T and *B:
-//     func TestTimeConsuming(t *testing.T) {
-//         if testing.Short() {
-//             t.Skip("skipping test in short mode.")
-//         }
-//         ...
-//     }
-//
-// Benchmarks
-//
-// Functions of the form
-//     func BenchmarkXxx(*testing.B)
-// are considered benchmarks, and are executed by the "go test" command when
-// its -bench flag is provided. Benchmarks are run sequentially.
-//
-// For a description of the testing flags, see
-// https://golang.org/cmd/go/#hdr-Description_of_testing_flags.
-//
-// A sample benchmark function looks like this:
-//     func BenchmarkHello(b *testing.B) {
-//         for i := 0; i < b.N; i++ {
-//             fmt.Sprintf("hello")
-//         }
-//     }
-//
-// The benchmark function must run the target code b.N times.
-// During benchmark execution, b.N is adjusted until the benchmark function lasts
-// long enough to be timed reliably.  The output
-//     BenchmarkHello    10000000    282 ns/op
-// means that the loop ran 10000000 times at a speed of 282 ns per loop.
-//
-// If a benchmark needs some expensive setup before running, the timer
-// may be reset:
-//
-//     func BenchmarkBigLen(b *testing.B) {
-//         big := NewBig()
-//         b.ResetTimer()
-//         for i := 0; i < b.N; i++ {
-//             big.Len()
-//         }
-//     }
-//
-// If a benchmark needs to test performance in a parallel setting, it may use
-// the RunParallel helper function; such benchmarks are intended to be used with
-// the go test -cpu flag:
-//
-//     func BenchmarkTemplateParallel(b *testing.B) {
-//         templ := template.Must(template.New("test").Parse("Hello, {{.}}!"))
-//         b.RunParallel(func(pb *testing.PB) {
-//             var buf bytes.Buffer
-//             for pb.Next() {
-//                 buf.Reset()
-//                 templ.Execute(&buf, "World")
-//             }
-//         })
-//     }
-//
-// Examples
-//
-// The package also runs and verifies example code. Example functions may
-// include a concluding line comment that begins with "Output:" and is compared with
-// the standard output of the function when the tests are run. (The comparison
-// ignores leading and trailing space.) These are examples of an example:
-//
-//     func ExampleHello() {
-//             fmt.Println("hello")
-//             // Output: hello
-//     }
-//
-//     func ExampleSalutations() {
-//             fmt.Println("hello, and")
-//             fmt.Println("goodbye")
-//             // Output:
-//             // hello, and
-//             // goodbye
-//     }
-//
-// Example functions without output comments are compiled but not executed.
-//
-// The naming convention to declare examples for the package, a function F, a type T and
-// method M on type T are:
-//
-//     func Example() { ... }
-//     func ExampleF() { ... }
-//     func ExampleT() { ... }
-//     func ExampleT_M() { ... }
-//
-// Multiple example functions for a package/type/function/method may be provided by
-// appending a distinct suffix to the name. The suffix must start with a
-// lower-case letter.
-//
-//     func Example_suffix() { ... }
-//     func ExampleF_suffix() { ... }
-//     func ExampleT_suffix() { ... }
-//     func ExampleT_M_suffix() { ... }
-//
-// The entire test file is presented as the example when it contains a single
-// example function, at least one other function, type, variable, or constant
-// declaration, and no test or benchmark functions.
-//
-// Main
-//
-// It is sometimes necessary for a test program to do extra setup or teardown
-// before or after testing. It is also sometimes necessary for a test to control
-// which code runs on the main thread. To support these and other cases,
-// if a test file contains a function:
-//
-//	func TestMain(m *testing.M)
-//
-// then the generated test will call TestMain(m) instead of running the tests
-// directly. TestMain runs in the main goroutine and can do whatever setup
-// and teardown is necessary around a call to m.Run. It should then call
-// os.Exit with the result of m.Run. When TestMain is called, flag.Parse has
-// not been run. If TestMain depends on command-line flags, including those
-// of the testing package, it should call flag.Parse explicitly.
-//
-// A simple implementation of TestMain is:
-//
-//	func TestMain(m *testing.M) {
-//		flag.Parse()
-//		os.Exit(m.Run())
-//	}
-//
-package testing
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"os"
-	"runtime"
-	"runtime/pprof"
-	"strconv"
-	"strings"
-	"sync"
-	"time"
-)
-
-var (
-	// The short flag requests that tests run more quickly, but its functionality
-	// is provided by test writers themselves.  The testing package is just its
-	// home.  The all.bash installation script sets it to make installation more
-	// efficient, but by default the flag is off so a plain "go test" will do a
-	// full test of the package.
-	short = flag.Bool("test.short", false, "run smaller test suite to save time")
-
-	// The directory in which to create profile files and the like. When run from
-	// "go test", the binary always runs in the source directory for the package;
-	// this flag lets "go test" tell the binary to write the files in the directory where
-	// the "go test" command is run.
-	outputDir = flag.String("test.outputdir", "", "directory in which to write profiles")
-
-	// Report as tests are run; default is silent for success.
-	chatty           = flag.Bool("test.v", false, "verbose: print additional output")
-	count            = flag.Uint("test.count", 1, "run tests and benchmarks `n` times")
-	coverProfile     = flag.String("test.coverprofile", "", "write a coverage profile to the named file after execution")
-	match            = flag.String("test.run", "", "regular expression to select tests and examples to run")
-	memProfile       = flag.String("test.memprofile", "", "write a memory profile to the named file after execution")
-	memProfileRate   = flag.Int("test.memprofilerate", 0, "if >=0, sets runtime.MemProfileRate")
-	cpuProfile       = flag.String("test.cpuprofile", "", "write a cpu profile to the named file during execution")
-	blockProfile     = flag.String("test.blockprofile", "", "write a goroutine blocking profile to the named file after execution")
-	blockProfileRate = flag.Int("test.blockprofilerate", 1, "if >= 0, calls runtime.SetBlockProfileRate()")
-	traceFile        = flag.String("test.trace", "", "write an execution trace to the named file after execution")
-	timeout          = flag.Duration("test.timeout", 0, "if positive, sets an aggregate time limit for all tests")
-	cpuListStr       = flag.String("test.cpu", "", "comma-separated list of number of CPUs to use for each test")
-	parallel         = flag.Int("test.parallel", runtime.GOMAXPROCS(0), "maximum test parallelism")
-
-	haveExamples bool // are there examples?
-
-	cpuList []int
-)
-
-// common holds the elements common between T and B and
-// captures common methods such as Errorf.
-type common struct {
-	mu       sync.RWMutex // guards output and failed
-	output   []byte       // Output generated by test or benchmark.
-	failed   bool         // Test or benchmark has failed.
-	skipped  bool         // Test of benchmark has been skipped.
-	finished bool
-
-	start    time.Time // Time test or benchmark started
-	duration time.Duration
-	self     interface{}      // To be sent on signal channel when done.
-	signal   chan interface{} // Output for serial tests.
-}
-
-// Short reports whether the -test.short flag is set.
-func Short() bool {
-	return *short
-}
-
-// Verbose reports whether the -test.v flag is set.
-func Verbose() bool {
-	return *chatty
-}
-
-// decorate prefixes the string with the file and line of the call site
-// and inserts the final newline if needed and indentation tabs for formatting.
-func decorate(s string) string {
-	_, file, line, ok := runtime.Caller(3) // decorate + log + public function.
-	if ok {
-		// Truncate file name at last file name separator.
-		if index := strings.LastIndex(file, "/"); index >= 0 {
-			file = file[index+1:]
-		} else if index = strings.LastIndex(file, "\\"); index >= 0 {
-			file = file[index+1:]
-		}
-	} else {
-		file = "???"
-		line = 1
-	}
-	buf := new(bytes.Buffer)
-	// Every line is indented at least one tab.
-	buf.WriteByte('\t')
-	fmt.Fprintf(buf, "%s:%d: ", file, line)
-	lines := strings.Split(s, "\n")
-	if l := len(lines); l > 1 && lines[l-1] == "" {
-		lines = lines[:l-1]
-	}
-	for i, line := range lines {
-		if i > 0 {
-			// Second and subsequent lines are indented an extra tab.
-			buf.WriteString("\n\t\t")
-		}
-		buf.WriteString(line)
-	}
-	buf.WriteByte('\n')
-	return buf.String()
-}
-
-// fmtDuration returns a string representing d in the form "87.00s".
-func fmtDuration(d time.Duration) string {
-	return fmt.Sprintf("%.2fs", d.Seconds())
-}
-
-// TB is the interface common to T and B.
-type TB interface {
-	Error(args ...interface{})
-	Errorf(format string, args ...interface{})
-	Fail()
-	FailNow()
-	Failed() bool
-	Fatal(args ...interface{})
-	Fatalf(format string, args ...interface{})
-	Log(args ...interface{})
-	Logf(format string, args ...interface{})
-	Skip(args ...interface{})
-	SkipNow()
-	Skipf(format string, args ...interface{})
-	Skipped() bool
-
-	// A private method to prevent users implementing the
-	// interface and so future additions to it will not
-	// violate Go 1 compatibility.
-	private()
-}
-
-var _ TB = (*T)(nil)
-var _ TB = (*B)(nil)
-
-// T is a type passed to Test functions to manage test state and support formatted test logs.
-// Logs are accumulated during execution and dumped to standard error when done.
-type T struct {
-	common
-	name          string    // Name of test.
-	startParallel chan bool // Parallel tests will wait on this.
-}
-
-func (c *common) private() {}
-
-// Fail marks the function as having failed but continues execution.
-func (c *common) Fail() {
-	c.mu.Lock()
-	defer c.mu.Unlock()
-	c.failed = true
-}
-
-// Failed reports whether the function has failed.
-func (c *common) Failed() bool {
-	c.mu.RLock()
-	defer c.mu.RUnlock()
-	return c.failed
-}
-
-// FailNow marks the function as having failed and stops its execution.
-// Execution will continue at the next test or benchmark.
-// FailNow must be called from the goroutine running the
-// test or benchmark function, not from other goroutines
-// created during the test. Calling FailNow does not stop
-// those other goroutines.
-func (c *common) FailNow() {
-	c.Fail()
-
-	// Calling runtime.Goexit will exit the goroutine, which
-	// will run the deferred functions in this goroutine,
-	// which will eventually run the deferred lines in tRunner,
-	// which will signal to the test loop that this test is done.
-	//
-	// A previous version of this code said:
-	//
-	//	c.duration = ...
-	//	c.signal <- c.self
-	//	runtime.Goexit()
-	//
-	// This previous version duplicated code (those lines are in
-	// tRunner no matter what), but worse the goroutine teardown
-	// implicit in runtime.Goexit was not guaranteed to complete
-	// before the test exited.  If a test deferred an important cleanup
-	// function (like removing temporary files), there was no guarantee
-	// it would run on a test failure.  Because we send on c.signal during
-	// a top-of-stack deferred function now, we know that the send
-	// only happens after any other stacked defers have completed.
-	c.finished = true
-	runtime.Goexit()
-}
-
-// log generates the output. It's always at the same stack depth.
-func (c *common) log(s string) {
-	c.mu.Lock()
-	defer c.mu.Unlock()
-	c.output = append(c.output, decorate(s)...)
-}
-
-// Log formats its arguments using default formatting, analogous to Println,
-// and records the text in the error log. For tests, the text will be printed only if
-// the test fails or the -test.v flag is set. For benchmarks, the text is always
-// printed to avoid having performance depend on the value of the -test.v flag.
-func (c *common) Log(args ...interface{}) { c.log(fmt.Sprintln(args...)) }
-
-// Logf formats its arguments according to the format, analogous to Printf,
-// and records the text in the error log. For tests, the text will be printed only if
-// the test fails or the -test.v flag is set. For benchmarks, the text is always
-// printed to avoid having performance depend on the value of the -test.v flag.
-func (c *common) Logf(format string, args ...interface{}) { c.log(fmt.Sprintf(format, args...)) }
-
-// Error is equivalent to Log followed by Fail.
-func (c *common) Error(args ...interface{}) {
-	c.log(fmt.Sprintln(args...))
-	c.Fail()
-}
-
-// Errorf is equivalent to Logf followed by Fail.
-func (c *common) Errorf(format string, args ...interface{}) {
-	c.log(fmt.Sprintf(format, args...))
-	c.Fail()
-}
-
-// Fatal is equivalent to Log followed by FailNow.
-func (c *common) Fatal(args ...interface{}) {
-	c.log(fmt.Sprintln(args...))
-	c.FailNow()
-}
-
-// Fatalf is equivalent to Logf followed by FailNow.
-func (c *common) Fatalf(format string, args ...interface{}) {
-	c.log(fmt.Sprintf(format, args...))
-	c.FailNow()
-}
-
-// Skip is equivalent to Log followed by SkipNow.
-func (c *common) Skip(args ...interface{}) {
-	c.log(fmt.Sprintln(args...))
-	c.SkipNow()
-}
-
-// Skipf is equivalent to Logf followed by SkipNow.
-func (c *common) Skipf(format string, args ...interface{}) {
-	c.log(fmt.Sprintf(format, args...))
-	c.SkipNow()
-}
-
-// SkipNow marks the test as having been skipped and stops its execution.
-// Execution will continue at the next test or benchmark. See also FailNow.
-// SkipNow must be called from the goroutine running the test, not from
-// other goroutines created during the test. Calling SkipNow does not stop
-// those other goroutines.
-func (c *common) SkipNow() {
-	c.skip()
-	c.finished = true
-	runtime.Goexit()
-}
-
-func (c *common) skip() {
-	c.mu.Lock()
-	defer c.mu.Unlock()
-	c.skipped = true
-}
-
-// Skipped reports whether the test was skipped.
-func (c *common) Skipped() bool {
-	c.mu.RLock()
-	defer c.mu.RUnlock()
-	return c.skipped
-}
-
-// Parallel signals that this test is to be run in parallel with (and only with)
-// other parallel tests.
-func (t *T) Parallel() {
-	t.signal <- (*T)(nil) // Release main testing loop
-	<-t.startParallel     // Wait for serial tests to finish
-	// Assuming Parallel is the first thing a test does, which is reasonable,
-	// reinitialize the test's start time because it's actually starting now.
-	t.start = time.Now()
-}
-
-// An internal type but exported because it is cross-package; part of the implementation
-// of the "go test" command.
-type InternalTest struct {
-	Name string
-	F    func(*T)
-}
-
-func tRunner(t *T, test *InternalTest) {
-	// When this goroutine is done, either because test.F(t)
-	// returned normally or because a test failure triggered
-	// a call to runtime.Goexit, record the duration and send
-	// a signal saying that the test is done.
-	defer func() {
-		t.duration = time.Now().Sub(t.start)
-		// If the test panicked, print any test output before dying.
-		err := recover()
-		if !t.finished && err == nil {
-			err = fmt.Errorf("test executed panic(nil) or runtime.Goexit")
-		}
-		if err != nil {
-			t.Fail()
-			t.report()
-			panic(err)
-		}
-		t.signal <- t
-	}()
-
-	t.start = time.Now()
-	test.F(t)
-	t.finished = true
-}
-
-// An internal function but exported because it is cross-package; part of the implementation
-// of the "go test" command.
-func Main(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) {
-	os.Exit(MainStart(matchString, tests, benchmarks, examples).Run())
-}
-
-// M is a type passed to a TestMain function to run the actual tests.
-type M struct {
-	matchString func(pat, str string) (bool, error)
-	tests       []InternalTest
-	benchmarks  []InternalBenchmark
-	examples    []InternalExample
-}
-
-// MainStart is meant for use by tests generated by 'go test'.
-// It is not meant to be called directly and is not subject to the Go 1 compatibility document.
-// It may change signature from release to release.
-func MainStart(matchString func(pat, str string) (bool, error), tests []InternalTest, benchmarks []InternalBenchmark, examples []InternalExample) *M {
-	return &M{
-		matchString: matchString,
-		tests:       tests,
-		benchmarks:  benchmarks,
-		examples:    examples,
-	}
-}
-
-// Run runs the tests. It returns an exit code to pass to os.Exit.
-func (m *M) Run() int {
-	flag.Parse()
-	parseCpuList()
-
-	before()
-	startAlarm()
-	haveExamples = len(m.examples) > 0
-	testOk := RunTests(m.matchString, m.tests)
-	exampleOk := RunExamples(m.matchString, m.examples)
-	stopAlarm()
-	if !testOk || !exampleOk {
-		fmt.Println("FAIL")
-		after()
-		return 1
-	}
-	fmt.Println("PASS")
-	RunBenchmarks(m.matchString, m.benchmarks)
-	after()
-	return 0
-}
-
-func (t *T) report() {
-	dstr := fmtDuration(t.duration)
-	format := "--- %s: %s (%s)\n%s"
-	if t.Failed() {
-		fmt.Printf(format, "FAIL", t.name, dstr, t.output)
-	} else if *chatty {
-		if t.Skipped() {
-			fmt.Printf(format, "SKIP", t.name, dstr, t.output)
-		} else {
-			fmt.Printf(format, "PASS", t.name, dstr, t.output)
-		}
-	}
-}
-
-func RunTests(matchString func(pat, str string) (bool, error), tests []InternalTest) (ok bool) {
-	ok = true
-	if len(tests) == 0 && !haveExamples {
-		fmt.Fprintln(os.Stderr, "testing: warning: no tests to run")
-		return
-	}
-	for _, procs := range cpuList {
-		runtime.GOMAXPROCS(procs)
-		// We build a new channel tree for each run of the loop.
-		// collector merges in one channel all the upstream signals from parallel tests.
-		// If all tests pump to the same channel, a bug can occur where a test
-		// kicks off a goroutine that Fails, yet the test still delivers a completion signal,
-		// which skews the counting.
-		var collector = make(chan interface{})
-
-		numParallel := 0
-		startParallel := make(chan bool)
-
-		for i := 0; i < len(tests); i++ {
-			matched, err := matchString(*match, tests[i].Name)
-			if err != nil {
-				fmt.Fprintf(os.Stderr, "testing: invalid regexp for -test.run: %s\n", err)
-				os.Exit(1)
-			}
-			if !matched {
-				continue
-			}
-			testName := tests[i].Name
-			t := &T{
-				common: common{
-					signal: make(chan interface{}),
-				},
-				name:          testName,
-				startParallel: startParallel,
-			}
-			t.self = t
-			if *chatty {
-				fmt.Printf("=== RUN   %s\n", t.name)
-			}
-			go tRunner(t, &tests[i])
-			out := (<-t.signal).(*T)
-			if out == nil { // Parallel run.
-				go func() {
-					collector <- <-t.signal
-				}()
-				numParallel++
-				continue
-			}
-			t.report()
-			ok = ok && !out.Failed()
-		}
-
-		running := 0
-		for numParallel+running > 0 {
-			if running < *parallel && numParallel > 0 {
-				startParallel <- true
-				running++
-				numParallel--
-				continue
-			}
-			t := (<-collector).(*T)
-			t.report()
-			ok = ok && !t.Failed()
-			running--
-		}
-	}
-	return
-}
-
-// before runs before all testing.
-func before() {
-	if *memProfileRate > 0 {
-		runtime.MemProfileRate = *memProfileRate
-	}
-	if *cpuProfile != "" {
-		f, err := os.Create(toOutputDir(*cpuProfile))
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "testing: %s", err)
-			return
-		}
-		if err := pprof.StartCPUProfile(f); err != nil {
-			fmt.Fprintf(os.Stderr, "testing: can't start cpu profile: %s", err)
-			f.Close()
-			return
-		}
-		// Could save f so after can call f.Close; not worth the effort.
-	}
-	if *traceFile != "" {
-		f, err := os.Create(toOutputDir(*traceFile))
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "testing: %s", err)
-			return
-		}
-		/*
-			if err := trace.Start(f); err != nil {
-				fmt.Fprintf(os.Stderr, "testing: can't start tracing: %s", err)
-				f.Close()
-				return
-			}
-		*/
-		_ = f
-		// Could save f so after can call f.Close; not worth the effort.
-	}
-	if *blockProfile != "" && *blockProfileRate >= 0 {
-		runtime.SetBlockProfileRate(*blockProfileRate)
-	}
-	if *coverProfile != "" && cover.Mode == "" {
-		fmt.Fprintf(os.Stderr, "testing: cannot use -test.coverprofile because test binary was not built with coverage enabled\n")
-		os.Exit(2)
-	}
-}
-
-// after runs after all testing.
-func after() {
-	if *cpuProfile != "" {
-		pprof.StopCPUProfile() // flushes profile to disk
-	}
-	if *traceFile != "" {
-		/*
-			trace.Stop() // flushes trace to disk
-		*/
-	}
-	if *memProfile != "" {
-		f, err := os.Create(toOutputDir(*memProfile))
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "testing: %s\n", err)
-			os.Exit(2)
-		}
-		runtime.GC() // materialize all statistics
-		if err = pprof.WriteHeapProfile(f); err != nil {
-			fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *memProfile, err)
-			os.Exit(2)
-		}
-		f.Close()
-	}
-	if *blockProfile != "" && *blockProfileRate >= 0 {
-		f, err := os.Create(toOutputDir(*blockProfile))
-		if err != nil {
-			fmt.Fprintf(os.Stderr, "testing: %s\n", err)
-			os.Exit(2)
-		}
-		if err = pprof.Lookup("block").WriteTo(f, 0); err != nil {
-			fmt.Fprintf(os.Stderr, "testing: can't write %s: %s\n", *blockProfile, err)
-			os.Exit(2)
-		}
-		f.Close()
-	}
-	if cover.Mode != "" {
-		coverReport()
-	}
-}
-
-// toOutputDir returns the file name relocated, if required, to outputDir.
-// Simple implementation to avoid pulling in path/filepath.
-func toOutputDir(path string) string {
-	if *outputDir == "" || path == "" {
-		return path
-	}
-	if runtime.GOOS == "windows" {
-		// On Windows, it's clumsy, but we can be almost always correct
-		// by just looking for a drive letter and a colon.
-		// Absolute paths always have a drive letter (ignoring UNC).
-		// Problem: if path == "C:A" and outputdir == "C:\Go" it's unclear
-		// what to do, but even then path/filepath doesn't help.
-		// TODO: Worth doing better? Probably not, because we're here only
-		// under the management of go test.
-		if len(path) >= 2 {
-			letter, colon := path[0], path[1]
-			if ('a' <= letter && letter <= 'z' || 'A' <= letter && letter <= 'Z') && colon == ':' {
-				// If path starts with a drive letter we're stuck with it regardless.
-				return path
-			}
-		}
-	}
-	if os.IsPathSeparator(path[0]) {
-		return path
-	}
-	return fmt.Sprintf("%s%c%s", *outputDir, os.PathSeparator, path)
-}
-
-var timer *time.Timer
-
-// startAlarm starts an alarm if requested.
-func startAlarm() {
-	if *timeout > 0 {
-		timer = time.AfterFunc(*timeout, func() {
-			panic(fmt.Sprintf("test timed out after %v", *timeout))
-		})
-	}
-}
-
-// stopAlarm turns off the alarm.
-func stopAlarm() {
-	if *timeout > 0 {
-		timer.Stop()
-	}
-}
-
-func parseCpuList() {
-	for _, val := range strings.Split(*cpuListStr, ",") {
-		val = strings.TrimSpace(val)
-		if val == "" {
-			continue
-		}
-		cpu, err := strconv.Atoi(val)
-		if err != nil || cpu <= 0 {
-			fmt.Fprintf(os.Stderr, "testing: invalid value %q for -test.cpu\n", val)
-			os.Exit(1)
-		}
-		for i := uint(0); i < *count; i++ {
-			cpuList = append(cpuList, cpu)
-		}
-	}
-	if cpuList == nil {
-		for i := uint(0); i < *count; i++ {
-			cpuList = append(cpuList, runtime.GOMAXPROCS(-1))
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/testing/testing_test.go b/third_party/gofrontend/libgo/go/testing/testing_test.go
deleted file mode 100644
index 87a5c16..0000000
--- a/third_party/gofrontend/libgo/go/testing/testing_test.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package testing_test
-
-import (
-	"os"
-	"testing"
-)
-
-// This is exactly what a test would do without a TestMain.
-// It's here only so that there is at least one package in the
-// standard library with a TestMain, so that code is executed.
-
-func TestMain(m *testing.M) {
-	os.Exit(m.Run())
-}
diff --git a/third_party/gofrontend/libgo/go/text/scanner/example_test.go b/third_party/gofrontend/libgo/go/text/scanner/example_test.go
deleted file mode 100644
index f8b51b7..0000000
--- a/third_party/gofrontend/libgo/go/text/scanner/example_test.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package scanner_test
-
-import (
-	"fmt"
-	"strings"
-	"text/scanner"
-)
-
-func Example() {
-	const src = `
-	// This is scanned code.
-	if a > 10 {
-		someParsable = text
-	}`
-	var s scanner.Scanner
-	s.Init(strings.NewReader(src))
-	var tok rune
-	for tok != scanner.EOF {
-		tok = s.Scan()
-		fmt.Println("At position", s.Pos(), ":", s.TokenText())
-	}
-
-	// Output:
-	// At position 3:4 : if
-	// At position 3:6 : a
-	// At position 3:8 : >
-	// At position 3:11 : 10
-	// At position 3:13 : {
-	// At position 4:15 : someParsable
-	// At position 4:17 : =
-	// At position 4:22 : text
-	// At position 5:3 : }
-	// At position 5:3 :
-}
diff --git a/third_party/gofrontend/libgo/go/text/scanner/scanner.go b/third_party/gofrontend/libgo/go/text/scanner/scanner.go
deleted file mode 100644
index 3ab01ed..0000000
--- a/third_party/gofrontend/libgo/go/text/scanner/scanner.go
+++ /dev/null
@@ -1,686 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package scanner provides a scanner and tokenizer for UTF-8-encoded text.
-// It takes an io.Reader providing the source, which then can be tokenized
-// through repeated calls to the Scan function.  For compatibility with
-// existing tools, the NUL character is not allowed. If the first character
-// in the source is a UTF-8 encoded byte order mark (BOM), it is discarded.
-//
-// By default, a Scanner skips white space and Go comments and recognizes all
-// literals as defined by the Go language specification.  It may be
-// customized to recognize only a subset of those literals and to recognize
-// different identifier and white space characters.
-package scanner
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"os"
-	"unicode"
-	"unicode/utf8"
-)
-
-// A source position is represented by a Position value.
-// A position is valid if Line > 0.
-type Position struct {
-	Filename string // filename, if any
-	Offset   int    // byte offset, starting at 0
-	Line     int    // line number, starting at 1
-	Column   int    // column number, starting at 1 (character count per line)
-}
-
-// IsValid reports whether the position is valid.
-func (pos *Position) IsValid() bool { return pos.Line > 0 }
-
-func (pos Position) String() string {
-	s := pos.Filename
-	if pos.IsValid() {
-		if s != "" {
-			s += ":"
-		}
-		s += fmt.Sprintf("%d:%d", pos.Line, pos.Column)
-	}
-	if s == "" {
-		s = "???"
-	}
-	return s
-}
-
-// Predefined mode bits to control recognition of tokens. For instance,
-// to configure a Scanner such that it only recognizes (Go) identifiers,
-// integers, and skips comments, set the Scanner's Mode field to:
-//
-//	ScanIdents | ScanInts | SkipComments
-//
-// With the exceptions of comments, which are skipped if SkipComments is
-// set, unrecognized tokens are not ignored. Instead, the scanner simply
-// returns the respective individual characters (or possibly sub-tokens).
-// For instance, if the mode is ScanIdents (not ScanStrings), the string
-// "foo" is scanned as the token sequence '"' Ident '"'.
-//
-const (
-	ScanIdents     = 1 << -Ident
-	ScanInts       = 1 << -Int
-	ScanFloats     = 1 << -Float // includes Ints
-	ScanChars      = 1 << -Char
-	ScanStrings    = 1 << -String
-	ScanRawStrings = 1 << -RawString
-	ScanComments   = 1 << -Comment
-	SkipComments   = 1 << -skipComment // if set with ScanComments, comments become white space
-	GoTokens       = ScanIdents | ScanFloats | ScanChars | ScanStrings | ScanRawStrings | ScanComments | SkipComments
-)
-
-// The result of Scan is one of the following tokens or a Unicode character.
-const (
-	EOF = -(iota + 1)
-	Ident
-	Int
-	Float
-	Char
-	String
-	RawString
-	Comment
-	skipComment
-)
-
-var tokenString = map[rune]string{
-	EOF:       "EOF",
-	Ident:     "Ident",
-	Int:       "Int",
-	Float:     "Float",
-	Char:      "Char",
-	String:    "String",
-	RawString: "RawString",
-	Comment:   "Comment",
-}
-
-// TokenString returns a printable string for a token or Unicode character.
-func TokenString(tok rune) string {
-	if s, found := tokenString[tok]; found {
-		return s
-	}
-	return fmt.Sprintf("%q", string(tok))
-}
-
-// GoWhitespace is the default value for the Scanner's Whitespace field.
-// Its value selects Go's white space characters.
-const GoWhitespace = 1<<'\t' | 1<<'\n' | 1<<'\r' | 1<<' '
-
-const bufLen = 1024 // at least utf8.UTFMax
-
-// A Scanner implements reading of Unicode characters and tokens from an io.Reader.
-type Scanner struct {
-	// Input
-	src io.Reader
-
-	// Source buffer
-	srcBuf [bufLen + 1]byte // +1 for sentinel for common case of s.next()
-	srcPos int              // reading position (srcBuf index)
-	srcEnd int              // source end (srcBuf index)
-
-	// Source position
-	srcBufOffset int // byte offset of srcBuf[0] in source
-	line         int // line count
-	column       int // character count
-	lastLineLen  int // length of last line in characters (for correct column reporting)
-	lastCharLen  int // length of last character in bytes
-
-	// Token text buffer
-	// Typically, token text is stored completely in srcBuf, but in general
-	// the token text's head may be buffered in tokBuf while the token text's
-	// tail is stored in srcBuf.
-	tokBuf bytes.Buffer // token text head that is not in srcBuf anymore
-	tokPos int          // token text tail position (srcBuf index); valid if >= 0
-	tokEnd int          // token text tail end (srcBuf index)
-
-	// One character look-ahead
-	ch rune // character before current srcPos
-
-	// Error is called for each error encountered. If no Error
-	// function is set, the error is reported to os.Stderr.
-	Error func(s *Scanner, msg string)
-
-	// ErrorCount is incremented by one for each error encountered.
-	ErrorCount int
-
-	// The Mode field controls which tokens are recognized. For instance,
-	// to recognize Ints, set the ScanInts bit in Mode. The field may be
-	// changed at any time.
-	Mode uint
-
-	// The Whitespace field controls which characters are recognized
-	// as white space. To recognize a character ch <= ' ' as white space,
-	// set the ch'th bit in Whitespace (the Scanner's behavior is undefined
-	// for values ch > ' '). The field may be changed at any time.
-	Whitespace uint64
-
-	// IsIdentRune is a predicate controlling the characters accepted
-	// as the ith rune in an identifier. The set of valid characters
-	// must not intersect with the set of white space characters.
-	// If no IsIdentRune function is set, regular Go identifiers are
-	// accepted instead. The field may be changed at any time.
-	IsIdentRune func(ch rune, i int) bool
-
-	// Start position of most recently scanned token; set by Scan.
-	// Calling Init or Next invalidates the position (Line == 0).
-	// The Filename field is always left untouched by the Scanner.
-	// If an error is reported (via Error) and Position is invalid,
-	// the scanner is not inside a token. Call Pos to obtain an error
-	// position in that case.
-	Position
-}
-
-// Init initializes a Scanner with a new source and returns s.
-// Error is set to nil, ErrorCount is set to 0, Mode is set to GoTokens,
-// and Whitespace is set to GoWhitespace.
-func (s *Scanner) Init(src io.Reader) *Scanner {
-	s.src = src
-
-	// initialize source buffer
-	// (the first call to next() will fill it by calling src.Read)
-	s.srcBuf[0] = utf8.RuneSelf // sentinel
-	s.srcPos = 0
-	s.srcEnd = 0
-
-	// initialize source position
-	s.srcBufOffset = 0
-	s.line = 1
-	s.column = 0
-	s.lastLineLen = 0
-	s.lastCharLen = 0
-
-	// initialize token text buffer
-	// (required for first call to next()).
-	s.tokPos = -1
-
-	// initialize one character look-ahead
-	s.ch = -2 // no char read yet, not EOF
-
-	// initialize public fields
-	s.Error = nil
-	s.ErrorCount = 0
-	s.Mode = GoTokens
-	s.Whitespace = GoWhitespace
-	s.Line = 0 // invalidate token position
-
-	return s
-}
-
-// next reads and returns the next Unicode character. It is designed such
-// that only a minimal amount of work needs to be done in the common ASCII
-// case (one test to check for both ASCII and end-of-buffer, and one test
-// to check for newlines).
-func (s *Scanner) next() rune {
-	ch, width := rune(s.srcBuf[s.srcPos]), 1
-
-	if ch >= utf8.RuneSelf {
-		// uncommon case: not ASCII or not enough bytes
-		for s.srcPos+utf8.UTFMax > s.srcEnd && !utf8.FullRune(s.srcBuf[s.srcPos:s.srcEnd]) {
-			// not enough bytes: read some more, but first
-			// save away token text if any
-			if s.tokPos >= 0 {
-				s.tokBuf.Write(s.srcBuf[s.tokPos:s.srcPos])
-				s.tokPos = 0
-				// s.tokEnd is set by Scan()
-			}
-			// move unread bytes to beginning of buffer
-			copy(s.srcBuf[0:], s.srcBuf[s.srcPos:s.srcEnd])
-			s.srcBufOffset += s.srcPos
-			// read more bytes
-			// (an io.Reader must return io.EOF when it reaches
-			// the end of what it is reading - simply returning
-			// n == 0 will make this loop retry forever; but the
-			// error is in the reader implementation in that case)
-			i := s.srcEnd - s.srcPos
-			n, err := s.src.Read(s.srcBuf[i:bufLen])
-			s.srcPos = 0
-			s.srcEnd = i + n
-			s.srcBuf[s.srcEnd] = utf8.RuneSelf // sentinel
-			if err != nil {
-				if err != io.EOF {
-					s.error(err.Error())
-				}
-				if s.srcEnd == 0 {
-					if s.lastCharLen > 0 {
-						// previous character was not EOF
-						s.column++
-					}
-					s.lastCharLen = 0
-					return EOF
-				}
-				// If err == EOF, we won't be getting more
-				// bytes; break to avoid infinite loop. If
-				// err is something else, we don't know if
-				// we can get more bytes; thus also break.
-				break
-			}
-		}
-		// at least one byte
-		ch = rune(s.srcBuf[s.srcPos])
-		if ch >= utf8.RuneSelf {
-			// uncommon case: not ASCII
-			ch, width = utf8.DecodeRune(s.srcBuf[s.srcPos:s.srcEnd])
-			if ch == utf8.RuneError && width == 1 {
-				// advance for correct error position
-				s.srcPos += width
-				s.lastCharLen = width
-				s.column++
-				s.error("illegal UTF-8 encoding")
-				return ch
-			}
-		}
-	}
-
-	// advance
-	s.srcPos += width
-	s.lastCharLen = width
-	s.column++
-
-	// special situations
-	switch ch {
-	case 0:
-		// for compatibility with other tools
-		s.error("illegal character NUL")
-	case '\n':
-		s.line++
-		s.lastLineLen = s.column
-		s.column = 0
-	}
-
-	return ch
-}
-
-// Next reads and returns the next Unicode character.
-// It returns EOF at the end of the source. It reports
-// a read error by calling s.Error, if not nil; otherwise
-// it prints an error message to os.Stderr. Next does not
-// update the Scanner's Position field; use Pos() to
-// get the current position.
-func (s *Scanner) Next() rune {
-	s.tokPos = -1 // don't collect token text
-	s.Line = 0    // invalidate token position
-	ch := s.Peek()
-	if ch != EOF {
-		s.ch = s.next()
-	}
-	return ch
-}
-
-// Peek returns the next Unicode character in the source without advancing
-// the scanner. It returns EOF if the scanner's position is at the last
-// character of the source.
-func (s *Scanner) Peek() rune {
-	if s.ch == -2 {
-		// this code is only run for the very first character
-		s.ch = s.next()
-		if s.ch == '\uFEFF' {
-			s.ch = s.next() // ignore BOM
-		}
-	}
-	return s.ch
-}
-
-func (s *Scanner) error(msg string) {
-	s.ErrorCount++
-	if s.Error != nil {
-		s.Error(s, msg)
-		return
-	}
-	pos := s.Position
-	if !pos.IsValid() {
-		pos = s.Pos()
-	}
-	fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg)
-}
-
-func (s *Scanner) isIdentRune(ch rune, i int) bool {
-	if s.IsIdentRune != nil {
-		return s.IsIdentRune(ch, i)
-	}
-	return ch == '_' || unicode.IsLetter(ch) || unicode.IsDigit(ch) && i > 0
-}
-
-func (s *Scanner) scanIdentifier() rune {
-	// we know the zero'th rune is OK; start scanning at the next one
-	ch := s.next()
-	for i := 1; s.isIdentRune(ch, i); i++ {
-		ch = s.next()
-	}
-	return ch
-}
-
-func digitVal(ch rune) int {
-	switch {
-	case '0' <= ch && ch <= '9':
-		return int(ch - '0')
-	case 'a' <= ch && ch <= 'f':
-		return int(ch - 'a' + 10)
-	case 'A' <= ch && ch <= 'F':
-		return int(ch - 'A' + 10)
-	}
-	return 16 // larger than any legal digit val
-}
-
-func isDecimal(ch rune) bool { return '0' <= ch && ch <= '9' }
-
-func (s *Scanner) scanMantissa(ch rune) rune {
-	for isDecimal(ch) {
-		ch = s.next()
-	}
-	return ch
-}
-
-func (s *Scanner) scanFraction(ch rune) rune {
-	if ch == '.' {
-		ch = s.scanMantissa(s.next())
-	}
-	return ch
-}
-
-func (s *Scanner) scanExponent(ch rune) rune {
-	if ch == 'e' || ch == 'E' {
-		ch = s.next()
-		if ch == '-' || ch == '+' {
-			ch = s.next()
-		}
-		ch = s.scanMantissa(ch)
-	}
-	return ch
-}
-
-func (s *Scanner) scanNumber(ch rune) (rune, rune) {
-	// isDecimal(ch)
-	if ch == '0' {
-		// int or float
-		ch = s.next()
-		if ch == 'x' || ch == 'X' {
-			// hexadecimal int
-			ch = s.next()
-			hasMantissa := false
-			for digitVal(ch) < 16 {
-				ch = s.next()
-				hasMantissa = true
-			}
-			if !hasMantissa {
-				s.error("illegal hexadecimal number")
-			}
-		} else {
-			// octal int or float
-			has8or9 := false
-			for isDecimal(ch) {
-				if ch > '7' {
-					has8or9 = true
-				}
-				ch = s.next()
-			}
-			if s.Mode&ScanFloats != 0 && (ch == '.' || ch == 'e' || ch == 'E') {
-				// float
-				ch = s.scanFraction(ch)
-				ch = s.scanExponent(ch)
-				return Float, ch
-			}
-			// octal int
-			if has8or9 {
-				s.error("illegal octal number")
-			}
-		}
-		return Int, ch
-	}
-	// decimal int or float
-	ch = s.scanMantissa(ch)
-	if s.Mode&ScanFloats != 0 && (ch == '.' || ch == 'e' || ch == 'E') {
-		// float
-		ch = s.scanFraction(ch)
-		ch = s.scanExponent(ch)
-		return Float, ch
-	}
-	return Int, ch
-}
-
-func (s *Scanner) scanDigits(ch rune, base, n int) rune {
-	for n > 0 && digitVal(ch) < base {
-		ch = s.next()
-		n--
-	}
-	if n > 0 {
-		s.error("illegal char escape")
-	}
-	return ch
-}
-
-func (s *Scanner) scanEscape(quote rune) rune {
-	ch := s.next() // read character after '/'
-	switch ch {
-	case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', quote:
-		// nothing to do
-		ch = s.next()
-	case '0', '1', '2', '3', '4', '5', '6', '7':
-		ch = s.scanDigits(ch, 8, 3)
-	case 'x':
-		ch = s.scanDigits(s.next(), 16, 2)
-	case 'u':
-		ch = s.scanDigits(s.next(), 16, 4)
-	case 'U':
-		ch = s.scanDigits(s.next(), 16, 8)
-	default:
-		s.error("illegal char escape")
-	}
-	return ch
-}
-
-func (s *Scanner) scanString(quote rune) (n int) {
-	ch := s.next() // read character after quote
-	for ch != quote {
-		if ch == '\n' || ch < 0 {
-			s.error("literal not terminated")
-			return
-		}
-		if ch == '\\' {
-			ch = s.scanEscape(quote)
-		} else {
-			ch = s.next()
-		}
-		n++
-	}
-	return
-}
-
-func (s *Scanner) scanRawString() {
-	ch := s.next() // read character after '`'
-	for ch != '`' {
-		if ch < 0 {
-			s.error("literal not terminated")
-			return
-		}
-		ch = s.next()
-	}
-}
-
-func (s *Scanner) scanChar() {
-	if s.scanString('\'') != 1 {
-		s.error("illegal char literal")
-	}
-}
-
-func (s *Scanner) scanComment(ch rune) rune {
-	// ch == '/' || ch == '*'
-	if ch == '/' {
-		// line comment
-		ch = s.next() // read character after "//"
-		for ch != '\n' && ch >= 0 {
-			ch = s.next()
-		}
-		return ch
-	}
-
-	// general comment
-	ch = s.next() // read character after "/*"
-	for {
-		if ch < 0 {
-			s.error("comment not terminated")
-			break
-		}
-		ch0 := ch
-		ch = s.next()
-		if ch0 == '*' && ch == '/' {
-			ch = s.next()
-			break
-		}
-	}
-	return ch
-}
-
-// Scan reads the next token or Unicode character from source and returns it.
-// It only recognizes tokens t for which the respective Mode bit (1<<-t) is set.
-// It returns EOF at the end of the source. It reports scanner errors (read and
-// token errors) by calling s.Error, if not nil; otherwise it prints an error
-// message to os.Stderr.
-func (s *Scanner) Scan() rune {
-	ch := s.Peek()
-
-	// reset token text position
-	s.tokPos = -1
-	s.Line = 0
-
-redo:
-	// skip white space
-	for s.Whitespace&(1<<uint(ch)) != 0 {
-		ch = s.next()
-	}
-
-	// start collecting token text
-	s.tokBuf.Reset()
-	s.tokPos = s.srcPos - s.lastCharLen
-
-	// set token position
-	// (this is a slightly optimized version of the code in Pos())
-	s.Offset = s.srcBufOffset + s.tokPos
-	if s.column > 0 {
-		// common case: last character was not a '\n'
-		s.Line = s.line
-		s.Column = s.column
-	} else {
-		// last character was a '\n'
-		// (we cannot be at the beginning of the source
-		// since we have called next() at least once)
-		s.Line = s.line - 1
-		s.Column = s.lastLineLen
-	}
-
-	// determine token value
-	tok := ch
-	switch {
-	case s.isIdentRune(ch, 0):
-		if s.Mode&ScanIdents != 0 {
-			tok = Ident
-			ch = s.scanIdentifier()
-		} else {
-			ch = s.next()
-		}
-	case isDecimal(ch):
-		if s.Mode&(ScanInts|ScanFloats) != 0 {
-			tok, ch = s.scanNumber(ch)
-		} else {
-			ch = s.next()
-		}
-	default:
-		switch ch {
-		case EOF:
-			break
-		case '"':
-			if s.Mode&ScanStrings != 0 {
-				s.scanString('"')
-				tok = String
-			}
-			ch = s.next()
-		case '\'':
-			if s.Mode&ScanChars != 0 {
-				s.scanChar()
-				tok = Char
-			}
-			ch = s.next()
-		case '.':
-			ch = s.next()
-			if isDecimal(ch) && s.Mode&ScanFloats != 0 {
-				tok = Float
-				ch = s.scanMantissa(ch)
-				ch = s.scanExponent(ch)
-			}
-		case '/':
-			ch = s.next()
-			if (ch == '/' || ch == '*') && s.Mode&ScanComments != 0 {
-				if s.Mode&SkipComments != 0 {
-					s.tokPos = -1 // don't collect token text
-					ch = s.scanComment(ch)
-					goto redo
-				}
-				ch = s.scanComment(ch)
-				tok = Comment
-			}
-		case '`':
-			if s.Mode&ScanRawStrings != 0 {
-				s.scanRawString()
-				tok = String
-			}
-			ch = s.next()
-		default:
-			ch = s.next()
-		}
-	}
-
-	// end of token text
-	s.tokEnd = s.srcPos - s.lastCharLen
-
-	s.ch = ch
-	return tok
-}
-
-// Pos returns the position of the character immediately after
-// the character or token returned by the last call to Next or Scan.
-func (s *Scanner) Pos() (pos Position) {
-	pos.Filename = s.Filename
-	pos.Offset = s.srcBufOffset + s.srcPos - s.lastCharLen
-	switch {
-	case s.column > 0:
-		// common case: last character was not a '\n'
-		pos.Line = s.line
-		pos.Column = s.column
-	case s.lastLineLen > 0:
-		// last character was a '\n'
-		pos.Line = s.line - 1
-		pos.Column = s.lastLineLen
-	default:
-		// at the beginning of the source
-		pos.Line = 1
-		pos.Column = 1
-	}
-	return
-}
-
-// TokenText returns the string corresponding to the most recently scanned token.
-// Valid after calling Scan().
-func (s *Scanner) TokenText() string {
-	if s.tokPos < 0 {
-		// no token text
-		return ""
-	}
-
-	if s.tokEnd < 0 {
-		// if EOF was reached, s.tokEnd is set to -1 (s.srcPos == 0)
-		s.tokEnd = s.tokPos
-	}
-
-	if s.tokBuf.Len() == 0 {
-		// common case: the entire token text is still in srcBuf
-		return string(s.srcBuf[s.tokPos:s.tokEnd])
-	}
-
-	// part of the token text was saved in tokBuf: save the rest in
-	// tokBuf as well and return its content
-	s.tokBuf.Write(s.srcBuf[s.tokPos:s.tokEnd])
-	s.tokPos = s.tokEnd // ensure idempotency of TokenText() call
-	return s.tokBuf.String()
-}
diff --git a/third_party/gofrontend/libgo/go/text/scanner/scanner_test.go b/third_party/gofrontend/libgo/go/text/scanner/scanner_test.go
deleted file mode 100644
index 798bed7..0000000
--- a/third_party/gofrontend/libgo/go/text/scanner/scanner_test.go
+++ /dev/null
@@ -1,667 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package scanner
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"strings"
-	"testing"
-	"unicode/utf8"
-)
-
-// A StringReader delivers its data one string segment at a time via Read.
-type StringReader struct {
-	data []string
-	step int
-}
-
-func (r *StringReader) Read(p []byte) (n int, err error) {
-	if r.step < len(r.data) {
-		s := r.data[r.step]
-		n = copy(p, s)
-		r.step++
-	} else {
-		err = io.EOF
-	}
-	return
-}
-
-func readRuneSegments(t *testing.T, segments []string) {
-	got := ""
-	want := strings.Join(segments, "")
-	s := new(Scanner).Init(&StringReader{data: segments})
-	for {
-		ch := s.Next()
-		if ch == EOF {
-			break
-		}
-		got += string(ch)
-	}
-	if got != want {
-		t.Errorf("segments=%v got=%s want=%s", segments, got, want)
-	}
-}
-
-var segmentList = [][]string{
-	{},
-	{""},
-	{"日", "本語"},
-	{"\u65e5", "\u672c", "\u8a9e"},
-	{"\U000065e5", " ", "\U0000672c", "\U00008a9e"},
-	{"\xe6", "\x97\xa5\xe6", "\x9c\xac\xe8\xaa\x9e"},
-	{"Hello", ", ", "World", "!"},
-	{"Hello", ", ", "", "World", "!"},
-}
-
-func TestNext(t *testing.T) {
-	for _, s := range segmentList {
-		readRuneSegments(t, s)
-	}
-}
-
-type token struct {
-	tok  rune
-	text string
-}
-
-var f100 = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
-
-var tokenList = []token{
-	{Comment, "// line comments"},
-	{Comment, "//"},
-	{Comment, "////"},
-	{Comment, "// comment"},
-	{Comment, "// /* comment */"},
-	{Comment, "// // comment //"},
-	{Comment, "//" + f100},
-
-	{Comment, "// general comments"},
-	{Comment, "/**/"},
-	{Comment, "/***/"},
-	{Comment, "/* comment */"},
-	{Comment, "/* // comment */"},
-	{Comment, "/* /* comment */"},
-	{Comment, "/*\n comment\n*/"},
-	{Comment, "/*" + f100 + "*/"},
-
-	{Comment, "// identifiers"},
-	{Ident, "a"},
-	{Ident, "a0"},
-	{Ident, "foobar"},
-	{Ident, "abc123"},
-	{Ident, "LGTM"},
-	{Ident, "_"},
-	{Ident, "_abc123"},
-	{Ident, "abc123_"},
-	{Ident, "_abc_123_"},
-	{Ident, "_äöü"},
-	{Ident, "_本"},
-	{Ident, "äöü"},
-	{Ident, "本"},
-	{Ident, "a۰۱۸"},
-	{Ident, "foo६४"},
-	{Ident, "bar9876"},
-	{Ident, f100},
-
-	{Comment, "// decimal ints"},
-	{Int, "0"},
-	{Int, "1"},
-	{Int, "9"},
-	{Int, "42"},
-	{Int, "1234567890"},
-
-	{Comment, "// octal ints"},
-	{Int, "00"},
-	{Int, "01"},
-	{Int, "07"},
-	{Int, "042"},
-	{Int, "01234567"},
-
-	{Comment, "// hexadecimal ints"},
-	{Int, "0x0"},
-	{Int, "0x1"},
-	{Int, "0xf"},
-	{Int, "0x42"},
-	{Int, "0x123456789abcDEF"},
-	{Int, "0x" + f100},
-	{Int, "0X0"},
-	{Int, "0X1"},
-	{Int, "0XF"},
-	{Int, "0X42"},
-	{Int, "0X123456789abcDEF"},
-	{Int, "0X" + f100},
-
-	{Comment, "// floats"},
-	{Float, "0."},
-	{Float, "1."},
-	{Float, "42."},
-	{Float, "01234567890."},
-	{Float, ".0"},
-	{Float, ".1"},
-	{Float, ".42"},
-	{Float, ".0123456789"},
-	{Float, "0.0"},
-	{Float, "1.0"},
-	{Float, "42.0"},
-	{Float, "01234567890.0"},
-	{Float, "0e0"},
-	{Float, "1e0"},
-	{Float, "42e0"},
-	{Float, "01234567890e0"},
-	{Float, "0E0"},
-	{Float, "1E0"},
-	{Float, "42E0"},
-	{Float, "01234567890E0"},
-	{Float, "0e+10"},
-	{Float, "1e-10"},
-	{Float, "42e+10"},
-	{Float, "01234567890e-10"},
-	{Float, "0E+10"},
-	{Float, "1E-10"},
-	{Float, "42E+10"},
-	{Float, "01234567890E-10"},
-
-	{Comment, "// chars"},
-	{Char, `' '`},
-	{Char, `'a'`},
-	{Char, `'本'`},
-	{Char, `'\a'`},
-	{Char, `'\b'`},
-	{Char, `'\f'`},
-	{Char, `'\n'`},
-	{Char, `'\r'`},
-	{Char, `'\t'`},
-	{Char, `'\v'`},
-	{Char, `'\''`},
-	{Char, `'\000'`},
-	{Char, `'\777'`},
-	{Char, `'\x00'`},
-	{Char, `'\xff'`},
-	{Char, `'\u0000'`},
-	{Char, `'\ufA16'`},
-	{Char, `'\U00000000'`},
-	{Char, `'\U0000ffAB'`},
-
-	{Comment, "// strings"},
-	{String, `" "`},
-	{String, `"a"`},
-	{String, `"本"`},
-	{String, `"\a"`},
-	{String, `"\b"`},
-	{String, `"\f"`},
-	{String, `"\n"`},
-	{String, `"\r"`},
-	{String, `"\t"`},
-	{String, `"\v"`},
-	{String, `"\""`},
-	{String, `"\000"`},
-	{String, `"\777"`},
-	{String, `"\x00"`},
-	{String, `"\xff"`},
-	{String, `"\u0000"`},
-	{String, `"\ufA16"`},
-	{String, `"\U00000000"`},
-	{String, `"\U0000ffAB"`},
-	{String, `"` + f100 + `"`},
-
-	{Comment, "// raw strings"},
-	{String, "``"},
-	{String, "`\\`"},
-	{String, "`" + "\n\n/* foobar */\n\n" + "`"},
-	{String, "`" + f100 + "`"},
-
-	{Comment, "// individual characters"},
-	// NUL character is not allowed
-	{'\x01', "\x01"},
-	{' ' - 1, string(' ' - 1)},
-	{'+', "+"},
-	{'/', "/"},
-	{'.', "."},
-	{'~', "~"},
-	{'(', "("},
-}
-
-func makeSource(pattern string) *bytes.Buffer {
-	var buf bytes.Buffer
-	for _, k := range tokenList {
-		fmt.Fprintf(&buf, pattern, k.text)
-	}
-	return &buf
-}
-
-func checkTok(t *testing.T, s *Scanner, line int, got, want rune, text string) {
-	if got != want {
-		t.Fatalf("tok = %s, want %s for %q", TokenString(got), TokenString(want), text)
-	}
-	if s.Line != line {
-		t.Errorf("line = %d, want %d for %q", s.Line, line, text)
-	}
-	stext := s.TokenText()
-	if stext != text {
-		t.Errorf("text = %q, want %q", stext, text)
-	} else {
-		// check idempotency of TokenText() call
-		stext = s.TokenText()
-		if stext != text {
-			t.Errorf("text = %q, want %q (idempotency check)", stext, text)
-		}
-	}
-}
-
-func countNewlines(s string) int {
-	n := 0
-	for _, ch := range s {
-		if ch == '\n' {
-			n++
-		}
-	}
-	return n
-}
-
-func testScan(t *testing.T, mode uint) {
-	s := new(Scanner).Init(makeSource(" \t%s\n"))
-	s.Mode = mode
-	tok := s.Scan()
-	line := 1
-	for _, k := range tokenList {
-		if mode&SkipComments == 0 || k.tok != Comment {
-			checkTok(t, s, line, tok, k.tok, k.text)
-			tok = s.Scan()
-		}
-		line += countNewlines(k.text) + 1 // each token is on a new line
-	}
-	checkTok(t, s, line, tok, EOF, "")
-}
-
-func TestScan(t *testing.T) {
-	testScan(t, GoTokens)
-	testScan(t, GoTokens&^SkipComments)
-}
-
-func TestPosition(t *testing.T) {
-	src := makeSource("\t\t\t\t%s\n")
-	s := new(Scanner).Init(src)
-	s.Mode = GoTokens &^ SkipComments
-	s.Scan()
-	pos := Position{"", 4, 1, 5}
-	for _, k := range tokenList {
-		if s.Offset != pos.Offset {
-			t.Errorf("offset = %d, want %d for %q", s.Offset, pos.Offset, k.text)
-		}
-		if s.Line != pos.Line {
-			t.Errorf("line = %d, want %d for %q", s.Line, pos.Line, k.text)
-		}
-		if s.Column != pos.Column {
-			t.Errorf("column = %d, want %d for %q", s.Column, pos.Column, k.text)
-		}
-		pos.Offset += 4 + len(k.text) + 1     // 4 tabs + token bytes + newline
-		pos.Line += countNewlines(k.text) + 1 // each token is on a new line
-		s.Scan()
-	}
-	// make sure there were no token-internal errors reported by scanner
-	if s.ErrorCount != 0 {
-		t.Errorf("%d errors", s.ErrorCount)
-	}
-}
-
-func TestScanZeroMode(t *testing.T) {
-	src := makeSource("%s\n")
-	str := src.String()
-	s := new(Scanner).Init(src)
-	s.Mode = 0       // don't recognize any token classes
-	s.Whitespace = 0 // don't skip any whitespace
-	tok := s.Scan()
-	for i, ch := range str {
-		if tok != ch {
-			t.Fatalf("%d. tok = %s, want %s", i, TokenString(tok), TokenString(ch))
-		}
-		tok = s.Scan()
-	}
-	if tok != EOF {
-		t.Fatalf("tok = %s, want EOF", TokenString(tok))
-	}
-	if s.ErrorCount != 0 {
-		t.Errorf("%d errors", s.ErrorCount)
-	}
-}
-
-func testScanSelectedMode(t *testing.T, mode uint, class rune) {
-	src := makeSource("%s\n")
-	s := new(Scanner).Init(src)
-	s.Mode = mode
-	tok := s.Scan()
-	for tok != EOF {
-		if tok < 0 && tok != class {
-			t.Fatalf("tok = %s, want %s", TokenString(tok), TokenString(class))
-		}
-		tok = s.Scan()
-	}
-	if s.ErrorCount != 0 {
-		t.Errorf("%d errors", s.ErrorCount)
-	}
-}
-
-func TestScanSelectedMask(t *testing.T) {
-	testScanSelectedMode(t, 0, 0)
-	testScanSelectedMode(t, ScanIdents, Ident)
-	// Don't test ScanInts and ScanNumbers since some parts of
-	// the floats in the source look like (illegal) octal ints
-	// and ScanNumbers may return either Int or Float.
-	testScanSelectedMode(t, ScanChars, Char)
-	testScanSelectedMode(t, ScanStrings, String)
-	testScanSelectedMode(t, SkipComments, 0)
-	testScanSelectedMode(t, ScanComments, Comment)
-}
-
-func TestScanCustomIdent(t *testing.T) {
-	const src = "faab12345 a12b123 a12 3b"
-	s := new(Scanner).Init(strings.NewReader(src))
-	// ident = ( 'a' | 'b' ) { digit } .
-	// digit = '0' .. '3' .
-	// with a maximum length of 4
-	s.IsIdentRune = func(ch rune, i int) bool {
-		return i == 0 && (ch == 'a' || ch == 'b') || 0 < i && i < 4 && '0' <= ch && ch <= '3'
-	}
-	checkTok(t, s, 1, s.Scan(), 'f', "f")
-	checkTok(t, s, 1, s.Scan(), Ident, "a")
-	checkTok(t, s, 1, s.Scan(), Ident, "a")
-	checkTok(t, s, 1, s.Scan(), Ident, "b123")
-	checkTok(t, s, 1, s.Scan(), Int, "45")
-	checkTok(t, s, 1, s.Scan(), Ident, "a12")
-	checkTok(t, s, 1, s.Scan(), Ident, "b123")
-	checkTok(t, s, 1, s.Scan(), Ident, "a12")
-	checkTok(t, s, 1, s.Scan(), Int, "3")
-	checkTok(t, s, 1, s.Scan(), Ident, "b")
-	checkTok(t, s, 1, s.Scan(), EOF, "")
-}
-
-func TestScanNext(t *testing.T) {
-	const BOM = '\uFEFF'
-	BOMs := string(BOM)
-	s := new(Scanner).Init(strings.NewReader(BOMs + "if a == bcd /* com" + BOMs + "ment */ {\n\ta += c\n}" + BOMs + "// line comment ending in eof"))
-	checkTok(t, s, 1, s.Scan(), Ident, "if") // the first BOM is ignored
-	checkTok(t, s, 1, s.Scan(), Ident, "a")
-	checkTok(t, s, 1, s.Scan(), '=', "=")
-	checkTok(t, s, 0, s.Next(), '=', "")
-	checkTok(t, s, 0, s.Next(), ' ', "")
-	checkTok(t, s, 0, s.Next(), 'b', "")
-	checkTok(t, s, 1, s.Scan(), Ident, "cd")
-	checkTok(t, s, 1, s.Scan(), '{', "{")
-	checkTok(t, s, 2, s.Scan(), Ident, "a")
-	checkTok(t, s, 2, s.Scan(), '+', "+")
-	checkTok(t, s, 0, s.Next(), '=', "")
-	checkTok(t, s, 2, s.Scan(), Ident, "c")
-	checkTok(t, s, 3, s.Scan(), '}', "}")
-	checkTok(t, s, 3, s.Scan(), BOM, BOMs)
-	checkTok(t, s, 3, s.Scan(), -1, "")
-	if s.ErrorCount != 0 {
-		t.Errorf("%d errors", s.ErrorCount)
-	}
-}
-
-func TestScanWhitespace(t *testing.T) {
-	var buf bytes.Buffer
-	var ws uint64
-	// start at 1, NUL character is not allowed
-	for ch := byte(1); ch < ' '; ch++ {
-		buf.WriteByte(ch)
-		ws |= 1 << ch
-	}
-	const orig = 'x'
-	buf.WriteByte(orig)
-
-	s := new(Scanner).Init(&buf)
-	s.Mode = 0
-	s.Whitespace = ws
-	tok := s.Scan()
-	if tok != orig {
-		t.Errorf("tok = %s, want %s", TokenString(tok), TokenString(orig))
-	}
-}
-
-func testError(t *testing.T, src, pos, msg string, tok rune) {
-	s := new(Scanner).Init(strings.NewReader(src))
-	errorCalled := false
-	s.Error = func(s *Scanner, m string) {
-		if !errorCalled {
-			// only look at first error
-			if p := s.Pos().String(); p != pos {
-				t.Errorf("pos = %q, want %q for %q", p, pos, src)
-			}
-			if m != msg {
-				t.Errorf("msg = %q, want %q for %q", m, msg, src)
-			}
-			errorCalled = true
-		}
-	}
-	tk := s.Scan()
-	if tk != tok {
-		t.Errorf("tok = %s, want %s for %q", TokenString(tk), TokenString(tok), src)
-	}
-	if !errorCalled {
-		t.Errorf("error handler not called for %q", src)
-	}
-	if s.ErrorCount == 0 {
-		t.Errorf("count = %d, want > 0 for %q", s.ErrorCount, src)
-	}
-}
-
-func TestError(t *testing.T) {
-	testError(t, "\x00", "1:1", "illegal character NUL", 0)
-	testError(t, "\x80", "1:1", "illegal UTF-8 encoding", utf8.RuneError)
-	testError(t, "\xff", "1:1", "illegal UTF-8 encoding", utf8.RuneError)
-
-	testError(t, "a\x00", "1:2", "illegal character NUL", Ident)
-	testError(t, "ab\x80", "1:3", "illegal UTF-8 encoding", Ident)
-	testError(t, "abc\xff", "1:4", "illegal UTF-8 encoding", Ident)
-
-	testError(t, `"a`+"\x00", "1:3", "illegal character NUL", String)
-	testError(t, `"ab`+"\x80", "1:4", "illegal UTF-8 encoding", String)
-	testError(t, `"abc`+"\xff", "1:5", "illegal UTF-8 encoding", String)
-
-	testError(t, "`a"+"\x00", "1:3", "illegal character NUL", String)
-	testError(t, "`ab"+"\x80", "1:4", "illegal UTF-8 encoding", String)
-	testError(t, "`abc"+"\xff", "1:5", "illegal UTF-8 encoding", String)
-
-	testError(t, `'\"'`, "1:3", "illegal char escape", Char)
-	testError(t, `"\'"`, "1:3", "illegal char escape", String)
-
-	testError(t, `01238`, "1:6", "illegal octal number", Int)
-	testError(t, `01238123`, "1:9", "illegal octal number", Int)
-	testError(t, `0x`, "1:3", "illegal hexadecimal number", Int)
-	testError(t, `0xg`, "1:3", "illegal hexadecimal number", Int)
-	testError(t, `'aa'`, "1:4", "illegal char literal", Char)
-
-	testError(t, `'`, "1:2", "literal not terminated", Char)
-	testError(t, `'`+"\n", "1:2", "literal not terminated", Char)
-	testError(t, `"abc`, "1:5", "literal not terminated", String)
-	testError(t, `"abc`+"\n", "1:5", "literal not terminated", String)
-	testError(t, "`abc\n", "2:1", "literal not terminated", String)
-	testError(t, `/*/`, "1:4", "comment not terminated", EOF)
-}
-
-// An errReader returns (0, err) where err is not io.EOF.
-type errReader struct{}
-
-func (errReader) Read(b []byte) (int, error) {
-	return 0, io.ErrNoProgress // some error that is not io.EOF
-}
-
-func TestIOError(t *testing.T) {
-	s := new(Scanner).Init(errReader{})
-	errorCalled := false
-	s.Error = func(s *Scanner, msg string) {
-		if !errorCalled {
-			if want := io.ErrNoProgress.Error(); msg != want {
-				t.Errorf("msg = %q, want %q", msg, want)
-			}
-			errorCalled = true
-		}
-	}
-	tok := s.Scan()
-	if tok != EOF {
-		t.Errorf("tok = %s, want EOF", TokenString(tok))
-	}
-	if !errorCalled {
-		t.Errorf("error handler not called")
-	}
-}
-
-func checkPos(t *testing.T, got, want Position) {
-	if got.Offset != want.Offset || got.Line != want.Line || got.Column != want.Column {
-		t.Errorf("got offset, line, column = %d, %d, %d; want %d, %d, %d",
-			got.Offset, got.Line, got.Column, want.Offset, want.Line, want.Column)
-	}
-}
-
-func checkNextPos(t *testing.T, s *Scanner, offset, line, column int, char rune) {
-	if ch := s.Next(); ch != char {
-		t.Errorf("ch = %s, want %s", TokenString(ch), TokenString(char))
-	}
-	want := Position{Offset: offset, Line: line, Column: column}
-	checkPos(t, s.Pos(), want)
-}
-
-func checkScanPos(t *testing.T, s *Scanner, offset, line, column int, char rune) {
-	want := Position{Offset: offset, Line: line, Column: column}
-	checkPos(t, s.Pos(), want)
-	if ch := s.Scan(); ch != char {
-		t.Errorf("ch = %s, want %s", TokenString(ch), TokenString(char))
-		if string(ch) != s.TokenText() {
-			t.Errorf("tok = %q, want %q", s.TokenText(), string(ch))
-		}
-	}
-	checkPos(t, s.Position, want)
-}
-
-func TestPos(t *testing.T) {
-	// corner case: empty source
-	s := new(Scanner).Init(strings.NewReader(""))
-	checkPos(t, s.Pos(), Position{Offset: 0, Line: 1, Column: 1})
-	s.Peek() // peek doesn't affect the position
-	checkPos(t, s.Pos(), Position{Offset: 0, Line: 1, Column: 1})
-
-	// corner case: source with only a newline
-	s = new(Scanner).Init(strings.NewReader("\n"))
-	checkPos(t, s.Pos(), Position{Offset: 0, Line: 1, Column: 1})
-	checkNextPos(t, s, 1, 2, 1, '\n')
-	// after EOF position doesn't change
-	for i := 10; i > 0; i-- {
-		checkScanPos(t, s, 1, 2, 1, EOF)
-	}
-	if s.ErrorCount != 0 {
-		t.Errorf("%d errors", s.ErrorCount)
-	}
-
-	// corner case: source with only a single character
-	s = new(Scanner).Init(strings.NewReader("本"))
-	checkPos(t, s.Pos(), Position{Offset: 0, Line: 1, Column: 1})
-	checkNextPos(t, s, 3, 1, 2, '本')
-	// after EOF position doesn't change
-	for i := 10; i > 0; i-- {
-		checkScanPos(t, s, 3, 1, 2, EOF)
-	}
-	if s.ErrorCount != 0 {
-		t.Errorf("%d errors", s.ErrorCount)
-	}
-
-	// positions after calling Next
-	s = new(Scanner).Init(strings.NewReader("  foo६४  \n\n本語\n"))
-	checkNextPos(t, s, 1, 1, 2, ' ')
-	s.Peek() // peek doesn't affect the position
-	checkNextPos(t, s, 2, 1, 3, ' ')
-	checkNextPos(t, s, 3, 1, 4, 'f')
-	checkNextPos(t, s, 4, 1, 5, 'o')
-	checkNextPos(t, s, 5, 1, 6, 'o')
-	checkNextPos(t, s, 8, 1, 7, '६')
-	checkNextPos(t, s, 11, 1, 8, '४')
-	checkNextPos(t, s, 12, 1, 9, ' ')
-	checkNextPos(t, s, 13, 1, 10, ' ')
-	checkNextPos(t, s, 14, 2, 1, '\n')
-	checkNextPos(t, s, 15, 3, 1, '\n')
-	checkNextPos(t, s, 18, 3, 2, '本')
-	checkNextPos(t, s, 21, 3, 3, '語')
-	checkNextPos(t, s, 22, 4, 1, '\n')
-	// after EOF position doesn't change
-	for i := 10; i > 0; i-- {
-		checkScanPos(t, s, 22, 4, 1, EOF)
-	}
-	if s.ErrorCount != 0 {
-		t.Errorf("%d errors", s.ErrorCount)
-	}
-
-	// positions after calling Scan
-	s = new(Scanner).Init(strings.NewReader("abc\n本語\n\nx"))
-	s.Mode = 0
-	s.Whitespace = 0
-	checkScanPos(t, s, 0, 1, 1, 'a')
-	s.Peek() // peek doesn't affect the position
-	checkScanPos(t, s, 1, 1, 2, 'b')
-	checkScanPos(t, s, 2, 1, 3, 'c')
-	checkScanPos(t, s, 3, 1, 4, '\n')
-	checkScanPos(t, s, 4, 2, 1, '本')
-	checkScanPos(t, s, 7, 2, 2, '語')
-	checkScanPos(t, s, 10, 2, 3, '\n')
-	checkScanPos(t, s, 11, 3, 1, '\n')
-	checkScanPos(t, s, 12, 4, 1, 'x')
-	// after EOF position doesn't change
-	for i := 10; i > 0; i-- {
-		checkScanPos(t, s, 13, 4, 2, EOF)
-	}
-	if s.ErrorCount != 0 {
-		t.Errorf("%d errors", s.ErrorCount)
-	}
-}
-
-type countReader int
-
-func (r *countReader) Read([]byte) (int, error) {
-	*r++
-	return 0, io.EOF
-}
-
-func TestNextEOFHandling(t *testing.T) {
-	var r countReader
-
-	// corner case: empty source
-	s := new(Scanner).Init(&r)
-
-	tok := s.Next()
-	if tok != EOF {
-		t.Error("1) EOF not reported")
-	}
-
-	tok = s.Peek()
-	if tok != EOF {
-		t.Error("2) EOF not reported")
-	}
-
-	if r != 1 {
-		t.Errorf("scanner called Read %d times, not once", r)
-	}
-}
-
-func TestScanEOFHandling(t *testing.T) {
-	var r countReader
-
-	// corner case: empty source
-	s := new(Scanner).Init(&r)
-
-	tok := s.Scan()
-	if tok != EOF {
-		t.Error("1) EOF not reported")
-	}
-
-	tok = s.Peek()
-	if tok != EOF {
-		t.Error("2) EOF not reported")
-	}
-
-	if r != 1 {
-		t.Errorf("scanner called Read %d times, not once", r)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/text/tabwriter/example_test.go b/third_party/gofrontend/libgo/go/text/tabwriter/example_test.go
deleted file mode 100644
index 20443cb..0000000
--- a/third_party/gofrontend/libgo/go/text/tabwriter/example_test.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tabwriter_test
-
-import (
-	"fmt"
-	"os"
-	"text/tabwriter"
-)
-
-func ExampleWriter_Init() {
-	w := new(tabwriter.Writer)
-
-	// Format in tab-separated columns with a tab stop of 8.
-	w.Init(os.Stdout, 0, 8, 0, '\t', 0)
-	fmt.Fprintln(w, "a\tb\tc\td\t.")
-	fmt.Fprintln(w, "123\t12345\t1234567\t123456789\t.")
-	fmt.Fprintln(w)
-	w.Flush()
-
-	// Format right-aligned in space-separated columns of minimal width 5
-	// and at least one blank of padding (so wider column entries do not
-	// touch each other).
-	w.Init(os.Stdout, 5, 0, 1, ' ', tabwriter.AlignRight)
-	fmt.Fprintln(w, "a\tb\tc\td\t.")
-	fmt.Fprintln(w, "123\t12345\t1234567\t123456789\t.")
-	fmt.Fprintln(w)
-	w.Flush()
-
-	// output:
-	// a	b	c	d		.
-	// 123	12345	1234567	123456789	.
-	//
-	//     a     b       c         d.
-	//   123 12345 1234567 123456789.
-}
diff --git a/third_party/gofrontend/libgo/go/text/tabwriter/tabwriter.go b/third_party/gofrontend/libgo/go/text/tabwriter/tabwriter.go
deleted file mode 100644
index c0c32d5..0000000
--- a/third_party/gofrontend/libgo/go/text/tabwriter/tabwriter.go
+++ /dev/null
@@ -1,558 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package tabwriter implements a write filter (tabwriter.Writer) that
-// translates tabbed columns in input into properly aligned text.
-//
-// The package is using the Elastic Tabstops algorithm described at
-// http://nickgravgaard.com/elastictabstops/index.html.
-//
-package tabwriter
-
-import (
-	"bytes"
-	"io"
-	"unicode/utf8"
-)
-
-// ----------------------------------------------------------------------------
-// Filter implementation
-
-// A cell represents a segment of text terminated by tabs or line breaks.
-// The text itself is stored in a separate buffer; cell only describes the
-// segment's size in bytes, its width in runes, and whether it's an htab
-// ('\t') terminated cell.
-//
-type cell struct {
-	size  int  // cell size in bytes
-	width int  // cell width in runes
-	htab  bool // true if the cell is terminated by an htab ('\t')
-}
-
-// A Writer is a filter that inserts padding around tab-delimited
-// columns in its input to align them in the output.
-//
-// The Writer treats incoming bytes as UTF-8 encoded text consisting
-// of cells terminated by (horizontal or vertical) tabs or line
-// breaks (newline or formfeed characters). Cells in adjacent lines
-// constitute a column. The Writer inserts padding as needed to
-// make all cells in a column have the same width, effectively
-// aligning the columns. It assumes that all characters have the
-// same width except for tabs for which a tabwidth must be specified.
-// Note that cells are tab-terminated, not tab-separated: trailing
-// non-tab text at the end of a line does not form a column cell.
-//
-// The Writer assumes that all Unicode code points have the same width;
-// this may not be true in some fonts.
-//
-// If DiscardEmptyColumns is set, empty columns that are terminated
-// entirely by vertical (or "soft") tabs are discarded. Columns
-// terminated by horizontal (or "hard") tabs are not affected by
-// this flag.
-//
-// If a Writer is configured to filter HTML, HTML tags and entities
-// are passed through. The widths of tags and entities are
-// assumed to be zero (tags) and one (entities) for formatting purposes.
-//
-// A segment of text may be escaped by bracketing it with Escape
-// characters. The tabwriter passes escaped text segments through
-// unchanged. In particular, it does not interpret any tabs or line
-// breaks within the segment. If the StripEscape flag is set, the
-// Escape characters are stripped from the output; otherwise they
-// are passed through as well. For the purpose of formatting, the
-// width of the escaped text is always computed excluding the Escape
-// characters.
-//
-// The formfeed character ('\f') acts like a newline but it also
-// terminates all columns in the current line (effectively calling
-// Flush). Cells in the next line start new columns. Unless found
-// inside an HTML tag or inside an escaped text segment, formfeed
-// characters appear as newlines in the output.
-//
-// The Writer must buffer input internally, because proper spacing
-// of one line may depend on the cells in future lines. Clients must
-// call Flush when done calling Write.
-//
-type Writer struct {
-	// configuration
-	output   io.Writer
-	minwidth int
-	tabwidth int
-	padding  int
-	padbytes [8]byte
-	flags    uint
-
-	// current state
-	buf     bytes.Buffer // collected text excluding tabs or line breaks
-	pos     int          // buffer position up to which cell.width of incomplete cell has been computed
-	cell    cell         // current incomplete cell; cell.width is up to buf[pos] excluding ignored sections
-	endChar byte         // terminating char of escaped sequence (Escape for escapes, '>', ';' for HTML tags/entities, or 0)
-	lines   [][]cell     // list of lines; each line is a list of cells
-	widths  []int        // list of column widths in runes - re-used during formatting
-}
-
-func (b *Writer) addLine() { b.lines = append(b.lines, []cell{}) }
-
-// Reset the current state.
-func (b *Writer) reset() {
-	b.buf.Reset()
-	b.pos = 0
-	b.cell = cell{}
-	b.endChar = 0
-	b.lines = b.lines[0:0]
-	b.widths = b.widths[0:0]
-	b.addLine()
-}
-
-// Internal representation (current state):
-//
-// - all text written is appended to buf; tabs and line breaks are stripped away
-// - at any given time there is a (possibly empty) incomplete cell at the end
-//   (the cell starts after a tab or line break)
-// - cell.size is the number of bytes belonging to the cell so far
-// - cell.width is text width in runes of that cell from the start of the cell to
-//   position pos; html tags and entities are excluded from this width if html
-//   filtering is enabled
-// - the sizes and widths of processed text are kept in the lines list
-//   which contains a list of cells for each line
-// - the widths list is a temporary list with current widths used during
-//   formatting; it is kept in Writer because it's re-used
-//
-//                    |<---------- size ---------->|
-//                    |                            |
-//                    |<- width ->|<- ignored ->|  |
-//                    |           |             |  |
-// [---processed---tab------------<tag>...</tag>...]
-// ^                  ^                         ^
-// |                  |                         |
-// buf                start of incomplete cell  pos
-
-// Formatting can be controlled with these flags.
-const (
-	// Ignore html tags and treat entities (starting with '&'
-	// and ending in ';') as single characters (width = 1).
-	FilterHTML uint = 1 << iota
-
-	// Strip Escape characters bracketing escaped text segments
-	// instead of passing them through unchanged with the text.
-	StripEscape
-
-	// Force right-alignment of cell content.
-	// Default is left-alignment.
-	AlignRight
-
-	// Handle empty columns as if they were not present in
-	// the input in the first place.
-	DiscardEmptyColumns
-
-	// Always use tabs for indentation columns (i.e., padding of
-	// leading empty cells on the left) independent of padchar.
-	TabIndent
-
-	// Print a vertical bar ('|') between columns (after formatting).
-	// Discarded columns appear as zero-width columns ("||").
-	Debug
-)
-
-// A Writer must be initialized with a call to Init. The first parameter (output)
-// specifies the filter output. The remaining parameters control the formatting:
-//
-//	minwidth	minimal cell width including any padding
-//	tabwidth	width of tab characters (equivalent number of spaces)
-//	padding		padding added to a cell before computing its width
-//	padchar		ASCII char used for padding
-//			if padchar == '\t', the Writer will assume that the
-//			width of a '\t' in the formatted output is tabwidth,
-//			and cells are left-aligned independent of align_left
-//			(for correct-looking results, tabwidth must correspond
-//			to the tab width in the viewer displaying the result)
-//	flags		formatting control
-//
-func (b *Writer) Init(output io.Writer, minwidth, tabwidth, padding int, padchar byte, flags uint) *Writer {
-	if minwidth < 0 || tabwidth < 0 || padding < 0 {
-		panic("negative minwidth, tabwidth, or padding")
-	}
-	b.output = output
-	b.minwidth = minwidth
-	b.tabwidth = tabwidth
-	b.padding = padding
-	for i := range b.padbytes {
-		b.padbytes[i] = padchar
-	}
-	if padchar == '\t' {
-		// tab padding enforces left-alignment
-		flags &^= AlignRight
-	}
-	b.flags = flags
-
-	b.reset()
-
-	return b
-}
-
-// debugging support (keep code around)
-func (b *Writer) dump() {
-	pos := 0
-	for i, line := range b.lines {
-		print("(", i, ") ")
-		for _, c := range line {
-			print("[", string(b.buf.Bytes()[pos:pos+c.size]), "]")
-			pos += c.size
-		}
-		print("\n")
-	}
-	print("\n")
-}
-
-// local error wrapper so we can distinguish errors we want to return
-// as errors from genuine panics (which we don't want to return as errors)
-type osError struct {
-	err error
-}
-
-func (b *Writer) write0(buf []byte) {
-	n, err := b.output.Write(buf)
-	if n != len(buf) && err == nil {
-		err = io.ErrShortWrite
-	}
-	if err != nil {
-		panic(osError{err})
-	}
-}
-
-func (b *Writer) writeN(src []byte, n int) {
-	for n > len(src) {
-		b.write0(src)
-		n -= len(src)
-	}
-	b.write0(src[0:n])
-}
-
-var (
-	newline = []byte{'\n'}
-	tabs    = []byte("\t\t\t\t\t\t\t\t")
-)
-
-func (b *Writer) writePadding(textw, cellw int, useTabs bool) {
-	if b.padbytes[0] == '\t' || useTabs {
-		// padding is done with tabs
-		if b.tabwidth == 0 {
-			return // tabs have no width - can't do any padding
-		}
-		// make cellw the smallest multiple of b.tabwidth
-		cellw = (cellw + b.tabwidth - 1) / b.tabwidth * b.tabwidth
-		n := cellw - textw // amount of padding
-		if n < 0 {
-			panic("internal error")
-		}
-		b.writeN(tabs, (n+b.tabwidth-1)/b.tabwidth)
-		return
-	}
-
-	// padding is done with non-tab characters
-	b.writeN(b.padbytes[0:], cellw-textw)
-}
-
-var vbar = []byte{'|'}
-
-func (b *Writer) writeLines(pos0 int, line0, line1 int) (pos int) {
-	pos = pos0
-	for i := line0; i < line1; i++ {
-		line := b.lines[i]
-
-		// if TabIndent is set, use tabs to pad leading empty cells
-		useTabs := b.flags&TabIndent != 0
-
-		for j, c := range line {
-			if j > 0 && b.flags&Debug != 0 {
-				// indicate column break
-				b.write0(vbar)
-			}
-
-			if c.size == 0 {
-				// empty cell
-				if j < len(b.widths) {
-					b.writePadding(c.width, b.widths[j], useTabs)
-				}
-			} else {
-				// non-empty cell
-				useTabs = false
-				if b.flags&AlignRight == 0 { // align left
-					b.write0(b.buf.Bytes()[pos : pos+c.size])
-					pos += c.size
-					if j < len(b.widths) {
-						b.writePadding(c.width, b.widths[j], false)
-					}
-				} else { // align right
-					if j < len(b.widths) {
-						b.writePadding(c.width, b.widths[j], false)
-					}
-					b.write0(b.buf.Bytes()[pos : pos+c.size])
-					pos += c.size
-				}
-			}
-		}
-
-		if i+1 == len(b.lines) {
-			// last buffered line - we don't have a newline, so just write
-			// any outstanding buffered data
-			b.write0(b.buf.Bytes()[pos : pos+b.cell.size])
-			pos += b.cell.size
-		} else {
-			// not the last line - write newline
-			b.write0(newline)
-		}
-	}
-	return
-}
-
-// Format the text between line0 and line1 (excluding line1); pos
-// is the buffer position corresponding to the beginning of line0.
-// Returns the buffer position corresponding to the beginning of
-// line1 and an error, if any.
-//
-func (b *Writer) format(pos0 int, line0, line1 int) (pos int) {
-	pos = pos0
-	column := len(b.widths)
-	for this := line0; this < line1; this++ {
-		line := b.lines[this]
-
-		if column < len(line)-1 {
-			// cell exists in this column => this line
-			// has more cells than the previous line
-			// (the last cell per line is ignored because cells are
-			// tab-terminated; the last cell per line describes the
-			// text before the newline/formfeed and does not belong
-			// to a column)
-
-			// print unprinted lines until beginning of block
-			pos = b.writeLines(pos, line0, this)
-			line0 = this
-
-			// column block begin
-			width := b.minwidth // minimal column width
-			discardable := true // true if all cells in this column are empty and "soft"
-			for ; this < line1; this++ {
-				line = b.lines[this]
-				if column < len(line)-1 {
-					// cell exists in this column
-					c := line[column]
-					// update width
-					if w := c.width + b.padding; w > width {
-						width = w
-					}
-					// update discardable
-					if c.width > 0 || c.htab {
-						discardable = false
-					}
-				} else {
-					break
-				}
-			}
-			// column block end
-
-			// discard empty columns if necessary
-			if discardable && b.flags&DiscardEmptyColumns != 0 {
-				width = 0
-			}
-
-			// format and print all columns to the right of this column
-			// (we know the widths of this column and all columns to the left)
-			b.widths = append(b.widths, width) // push width
-			pos = b.format(pos, line0, this)
-			b.widths = b.widths[0 : len(b.widths)-1] // pop width
-			line0 = this
-		}
-	}
-
-	// print unprinted lines until end
-	return b.writeLines(pos, line0, line1)
-}
-
-// Append text to current cell.
-func (b *Writer) append(text []byte) {
-	b.buf.Write(text)
-	b.cell.size += len(text)
-}
-
-// Update the cell width.
-func (b *Writer) updateWidth() {
-	b.cell.width += utf8.RuneCount(b.buf.Bytes()[b.pos:b.buf.Len()])
-	b.pos = b.buf.Len()
-}
-
-// To escape a text segment, bracket it with Escape characters.
-// For instance, the tab in this string "Ignore this tab: \xff\t\xff"
-// does not terminate a cell and constitutes a single character of
-// width one for formatting purposes.
-//
-// The value 0xff was chosen because it cannot appear in a valid UTF-8 sequence.
-//
-const Escape = '\xff'
-
-// Start escaped mode.
-func (b *Writer) startEscape(ch byte) {
-	switch ch {
-	case Escape:
-		b.endChar = Escape
-	case '<':
-		b.endChar = '>'
-	case '&':
-		b.endChar = ';'
-	}
-}
-
-// Terminate escaped mode. If the escaped text was an HTML tag, its width
-// is assumed to be zero for formatting purposes; if it was an HTML entity,
-// its width is assumed to be one. In all other cases, the width is the
-// unicode width of the text.
-//
-func (b *Writer) endEscape() {
-	switch b.endChar {
-	case Escape:
-		b.updateWidth()
-		if b.flags&StripEscape == 0 {
-			b.cell.width -= 2 // don't count the Escape chars
-		}
-	case '>': // tag of zero width
-	case ';':
-		b.cell.width++ // entity, count as one rune
-	}
-	b.pos = b.buf.Len()
-	b.endChar = 0
-}
-
-// Terminate the current cell by adding it to the list of cells of the
-// current line. Returns the number of cells in that line.
-//
-func (b *Writer) terminateCell(htab bool) int {
-	b.cell.htab = htab
-	line := &b.lines[len(b.lines)-1]
-	*line = append(*line, b.cell)
-	b.cell = cell{}
-	return len(*line)
-}
-
-func handlePanic(err *error, op string) {
-	if e := recover(); e != nil {
-		if nerr, ok := e.(osError); ok {
-			*err = nerr.err
-			return
-		}
-		panic("tabwriter: panic during " + op)
-	}
-}
-
-// Flush should be called after the last call to Write to ensure
-// that any data buffered in the Writer is written to output. Any
-// incomplete escape sequence at the end is considered
-// complete for formatting purposes.
-//
-func (b *Writer) Flush() (err error) {
-	defer b.reset() // even in the presence of errors
-	defer handlePanic(&err, "Flush")
-
-	// add current cell if not empty
-	if b.cell.size > 0 {
-		if b.endChar != 0 {
-			// inside escape - terminate it even if incomplete
-			b.endEscape()
-		}
-		b.terminateCell(false)
-	}
-
-	// format contents of buffer
-	b.format(0, 0, len(b.lines))
-
-	return
-}
-
-var hbar = []byte("---\n")
-
-// Write writes buf to the writer b.
-// The only errors returned are ones encountered
-// while writing to the underlying output stream.
-//
-func (b *Writer) Write(buf []byte) (n int, err error) {
-	defer handlePanic(&err, "Write")
-
-	// split text into cells
-	n = 0
-	for i, ch := range buf {
-		if b.endChar == 0 {
-			// outside escape
-			switch ch {
-			case '\t', '\v', '\n', '\f':
-				// end of cell
-				b.append(buf[n:i])
-				b.updateWidth()
-				n = i + 1 // ch consumed
-				ncells := b.terminateCell(ch == '\t')
-				if ch == '\n' || ch == '\f' {
-					// terminate line
-					b.addLine()
-					if ch == '\f' || ncells == 1 {
-						// A '\f' always forces a flush. Otherwise, if the previous
-						// line has only one cell which does not have an impact on
-						// the formatting of the following lines (the last cell per
-						// line is ignored by format()), thus we can flush the
-						// Writer contents.
-						if err = b.Flush(); err != nil {
-							return
-						}
-						if ch == '\f' && b.flags&Debug != 0 {
-							// indicate section break
-							b.write0(hbar)
-						}
-					}
-				}
-
-			case Escape:
-				// start of escaped sequence
-				b.append(buf[n:i])
-				b.updateWidth()
-				n = i
-				if b.flags&StripEscape != 0 {
-					n++ // strip Escape
-				}
-				b.startEscape(Escape)
-
-			case '<', '&':
-				// possibly an html tag/entity
-				if b.flags&FilterHTML != 0 {
-					// begin of tag/entity
-					b.append(buf[n:i])
-					b.updateWidth()
-					n = i
-					b.startEscape(ch)
-				}
-			}
-
-		} else {
-			// inside escape
-			if ch == b.endChar {
-				// end of tag/entity
-				j := i + 1
-				if ch == Escape && b.flags&StripEscape != 0 {
-					j = i // strip Escape
-				}
-				b.append(buf[n:j])
-				n = i + 1 // ch consumed
-				b.endEscape()
-			}
-		}
-	}
-
-	// append leftover text
-	b.append(buf[n:])
-	n = len(buf)
-	return
-}
-
-// NewWriter allocates and initializes a new tabwriter.Writer.
-// The parameters are the same as for the Init function.
-//
-func NewWriter(output io.Writer, minwidth, tabwidth, padding int, padchar byte, flags uint) *Writer {
-	return new(Writer).Init(output, minwidth, tabwidth, padding, padchar, flags)
-}
diff --git a/third_party/gofrontend/libgo/go/text/tabwriter/tabwriter_test.go b/third_party/gofrontend/libgo/go/text/tabwriter/tabwriter_test.go
deleted file mode 100644
index 9d3111e..0000000
--- a/third_party/gofrontend/libgo/go/text/tabwriter/tabwriter_test.go
+++ /dev/null
@@ -1,652 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package tabwriter_test
-
-import (
-	"io"
-	"testing"
-	. "text/tabwriter"
-)
-
-type buffer struct {
-	a []byte
-}
-
-func (b *buffer) init(n int) { b.a = make([]byte, 0, n) }
-
-func (b *buffer) clear() { b.a = b.a[0:0] }
-
-func (b *buffer) Write(buf []byte) (written int, err error) {
-	n := len(b.a)
-	m := len(buf)
-	if n+m <= cap(b.a) {
-		b.a = b.a[0 : n+m]
-		for i := 0; i < m; i++ {
-			b.a[n+i] = buf[i]
-		}
-	} else {
-		panic("buffer.Write: buffer too small")
-	}
-	return len(buf), nil
-}
-
-func (b *buffer) String() string { return string(b.a) }
-
-func write(t *testing.T, testname string, w *Writer, src string) {
-	written, err := io.WriteString(w, src)
-	if err != nil {
-		t.Errorf("--- test: %s\n--- src:\n%q\n--- write error: %v\n", testname, src, err)
-	}
-	if written != len(src) {
-		t.Errorf("--- test: %s\n--- src:\n%q\n--- written = %d, len(src) = %d\n", testname, src, written, len(src))
-	}
-}
-
-func verify(t *testing.T, testname string, w *Writer, b *buffer, src, expected string) {
-	err := w.Flush()
-	if err != nil {
-		t.Errorf("--- test: %s\n--- src:\n%q\n--- flush error: %v\n", testname, src, err)
-	}
-
-	res := b.String()
-	if res != expected {
-		t.Errorf("--- test: %s\n--- src:\n%q\n--- found:\n%q\n--- expected:\n%q\n", testname, src, res, expected)
-	}
-}
-
-func check(t *testing.T, testname string, minwidth, tabwidth, padding int, padchar byte, flags uint, src, expected string) {
-	var b buffer
-	b.init(1000)
-
-	var w Writer
-	w.Init(&b, minwidth, tabwidth, padding, padchar, flags)
-
-	// write all at once
-	title := testname + " (written all at once)"
-	b.clear()
-	write(t, title, &w, src)
-	verify(t, title, &w, &b, src, expected)
-
-	// write byte-by-byte
-	title = testname + " (written byte-by-byte)"
-	b.clear()
-	for i := 0; i < len(src); i++ {
-		write(t, title, &w, src[i:i+1])
-	}
-	verify(t, title, &w, &b, src, expected)
-
-	// write using Fibonacci slice sizes
-	title = testname + " (written in fibonacci slices)"
-	b.clear()
-	for i, d := 0, 0; i < len(src); {
-		write(t, title, &w, src[i:i+d])
-		i, d = i+d, d+1
-		if i+d > len(src) {
-			d = len(src) - i
-		}
-	}
-	verify(t, title, &w, &b, src, expected)
-}
-
-var tests = []struct {
-	testname                    string
-	minwidth, tabwidth, padding int
-	padchar                     byte
-	flags                       uint
-	src, expected               string
-}{
-	{
-		"1a",
-		8, 0, 1, '.', 0,
-		"",
-		"",
-	},
-
-	{
-		"1a debug",
-		8, 0, 1, '.', Debug,
-		"",
-		"",
-	},
-
-	{
-		"1b esc stripped",
-		8, 0, 1, '.', StripEscape,
-		"\xff\xff",
-		"",
-	},
-
-	{
-		"1b esc",
-		8, 0, 1, '.', 0,
-		"\xff\xff",
-		"\xff\xff",
-	},
-
-	{
-		"1c esc stripped",
-		8, 0, 1, '.', StripEscape,
-		"\xff\t\xff",
-		"\t",
-	},
-
-	{
-		"1c esc",
-		8, 0, 1, '.', 0,
-		"\xff\t\xff",
-		"\xff\t\xff",
-	},
-
-	{
-		"1d esc stripped",
-		8, 0, 1, '.', StripEscape,
-		"\xff\"foo\t\n\tbar\"\xff",
-		"\"foo\t\n\tbar\"",
-	},
-
-	{
-		"1d esc",
-		8, 0, 1, '.', 0,
-		"\xff\"foo\t\n\tbar\"\xff",
-		"\xff\"foo\t\n\tbar\"\xff",
-	},
-
-	{
-		"1e esc stripped",
-		8, 0, 1, '.', StripEscape,
-		"abc\xff\tdef", // unterminated escape
-		"abc\tdef",
-	},
-
-	{
-		"1e esc",
-		8, 0, 1, '.', 0,
-		"abc\xff\tdef", // unterminated escape
-		"abc\xff\tdef",
-	},
-
-	{
-		"2",
-		8, 0, 1, '.', 0,
-		"\n\n\n",
-		"\n\n\n",
-	},
-
-	{
-		"3",
-		8, 0, 1, '.', 0,
-		"a\nb\nc",
-		"a\nb\nc",
-	},
-
-	{
-		"4a",
-		8, 0, 1, '.', 0,
-		"\t", // '\t' terminates an empty cell on last line - nothing to print
-		"",
-	},
-
-	{
-		"4b",
-		8, 0, 1, '.', AlignRight,
-		"\t", // '\t' terminates an empty cell on last line - nothing to print
-		"",
-	},
-
-	{
-		"5",
-		8, 0, 1, '.', 0,
-		"*\t*",
-		"*.......*",
-	},
-
-	{
-		"5b",
-		8, 0, 1, '.', 0,
-		"*\t*\n",
-		"*.......*\n",
-	},
-
-	{
-		"5c",
-		8, 0, 1, '.', 0,
-		"*\t*\t",
-		"*.......*",
-	},
-
-	{
-		"5c debug",
-		8, 0, 1, '.', Debug,
-		"*\t*\t",
-		"*.......|*",
-	},
-
-	{
-		"5d",
-		8, 0, 1, '.', AlignRight,
-		"*\t*\t",
-		".......**",
-	},
-
-	{
-		"6",
-		8, 0, 1, '.', 0,
-		"\t\n",
-		"........\n",
-	},
-
-	{
-		"7a",
-		8, 0, 1, '.', 0,
-		"a) foo",
-		"a) foo",
-	},
-
-	{
-		"7b",
-		8, 0, 1, ' ', 0,
-		"b) foo\tbar",
-		"b) foo  bar",
-	},
-
-	{
-		"7c",
-		8, 0, 1, '.', 0,
-		"c) foo\tbar\t",
-		"c) foo..bar",
-	},
-
-	{
-		"7d",
-		8, 0, 1, '.', 0,
-		"d) foo\tbar\n",
-		"d) foo..bar\n",
-	},
-
-	{
-		"7e",
-		8, 0, 1, '.', 0,
-		"e) foo\tbar\t\n",
-		"e) foo..bar.....\n",
-	},
-
-	{
-		"7f",
-		8, 0, 1, '.', FilterHTML,
-		"f) f&lt;o\t<b>bar</b>\t\n",
-		"f) f&lt;o..<b>bar</b>.....\n",
-	},
-
-	{
-		"7g",
-		8, 0, 1, '.', FilterHTML,
-		"g) f&lt;o\t<b>bar</b>\t non-terminated entity &amp",
-		"g) f&lt;o..<b>bar</b>..... non-terminated entity &amp",
-	},
-
-	{
-		"7g debug",
-		8, 0, 1, '.', FilterHTML | Debug,
-		"g) f&lt;o\t<b>bar</b>\t non-terminated entity &amp",
-		"g) f&lt;o..|<b>bar</b>.....| non-terminated entity &amp",
-	},
-
-	{
-		"8",
-		8, 0, 1, '*', 0,
-		"Hello, world!\n",
-		"Hello, world!\n",
-	},
-
-	{
-		"9a",
-		1, 0, 0, '.', 0,
-		"1\t2\t3\t4\n" +
-			"11\t222\t3333\t44444\n",
-
-		"1.2..3...4\n" +
-			"11222333344444\n",
-	},
-
-	{
-		"9b",
-		1, 0, 0, '.', FilterHTML,
-		"1\t2<!---\f--->\t3\t4\n" + // \f inside HTML is ignored
-			"11\t222\t3333\t44444\n",
-
-		"1.2<!---\f--->..3...4\n" +
-			"11222333344444\n",
-	},
-
-	{
-		"9c",
-		1, 0, 0, '.', 0,
-		"1\t2\t3\t4\f" + // \f causes a newline and flush
-			"11\t222\t3333\t44444\n",
-
-		"1234\n" +
-			"11222333344444\n",
-	},
-
-	{
-		"9c debug",
-		1, 0, 0, '.', Debug,
-		"1\t2\t3\t4\f" + // \f causes a newline and flush
-			"11\t222\t3333\t44444\n",
-
-		"1|2|3|4\n" +
-			"---\n" +
-			"11|222|3333|44444\n",
-	},
-
-	{
-		"10a",
-		5, 0, 0, '.', 0,
-		"1\t2\t3\t4\n",
-		"1....2....3....4\n",
-	},
-
-	{
-		"10b",
-		5, 0, 0, '.', 0,
-		"1\t2\t3\t4\t\n",
-		"1....2....3....4....\n",
-	},
-
-	{
-		"11",
-		8, 0, 1, '.', 0,
-		"本\tb\tc\n" +
-			"aa\t\u672c\u672c\u672c\tcccc\tddddd\n" +
-			"aaa\tbbbb\n",
-
-		"本.......b.......c\n" +
-			"aa......本本本.....cccc....ddddd\n" +
-			"aaa.....bbbb\n",
-	},
-
-	{
-		"12a",
-		8, 0, 1, ' ', AlignRight,
-		"a\tè\tc\t\n" +
-			"aa\tèèè\tcccc\tddddd\t\n" +
-			"aaa\tèèèè\t\n",
-
-		"       a       è       c\n" +
-			"      aa     èèè    cccc   ddddd\n" +
-			"     aaa    èèèè\n",
-	},
-
-	{
-		"12b",
-		2, 0, 0, ' ', 0,
-		"a\tb\tc\n" +
-			"aa\tbbb\tcccc\n" +
-			"aaa\tbbbb\n",
-
-		"a  b  c\n" +
-			"aa bbbcccc\n" +
-			"aaabbbb\n",
-	},
-
-	{
-		"12c",
-		8, 0, 1, '_', 0,
-		"a\tb\tc\n" +
-			"aa\tbbb\tcccc\n" +
-			"aaa\tbbbb\n",
-
-		"a_______b_______c\n" +
-			"aa______bbb_____cccc\n" +
-			"aaa_____bbbb\n",
-	},
-
-	{
-		"13a",
-		4, 0, 1, '-', 0,
-		"4444\t日本語\t22\t1\t333\n" +
-			"999999999\t22\n" +
-			"7\t22\n" +
-			"\t\t\t88888888\n" +
-			"\n" +
-			"666666\t666666\t666666\t4444\n" +
-			"1\t1\t999999999\t0000000000\n",
-
-		"4444------日本語-22--1---333\n" +
-			"999999999-22\n" +
-			"7---------22\n" +
-			"------------------88888888\n" +
-			"\n" +
-			"666666-666666-666666----4444\n" +
-			"1------1------999999999-0000000000\n",
-	},
-
-	{
-		"13b",
-		4, 0, 3, '.', 0,
-		"4444\t333\t22\t1\t333\n" +
-			"999999999\t22\n" +
-			"7\t22\n" +
-			"\t\t\t88888888\n" +
-			"\n" +
-			"666666\t666666\t666666\t4444\n" +
-			"1\t1\t999999999\t0000000000\n",
-
-		"4444........333...22...1...333\n" +
-			"999999999...22\n" +
-			"7...........22\n" +
-			"....................88888888\n" +
-			"\n" +
-			"666666...666666...666666......4444\n" +
-			"1........1........999999999...0000000000\n",
-	},
-
-	{
-		"13c",
-		8, 8, 1, '\t', FilterHTML,
-		"4444\t333\t22\t1\t333\n" +
-			"999999999\t22\n" +
-			"7\t22\n" +
-			"\t\t\t88888888\n" +
-			"\n" +
-			"666666\t666666\t666666\t4444\n" +
-			"1\t1\t<font color=red attr=日本語>999999999</font>\t0000000000\n",
-
-		"4444\t\t333\t22\t1\t333\n" +
-			"999999999\t22\n" +
-			"7\t\t22\n" +
-			"\t\t\t\t88888888\n" +
-			"\n" +
-			"666666\t666666\t666666\t\t4444\n" +
-			"1\t1\t<font color=red attr=日本語>999999999</font>\t0000000000\n",
-	},
-
-	{
-		"14",
-		1, 0, 2, ' ', AlignRight,
-		".0\t.3\t2.4\t-5.1\t\n" +
-			"23.0\t12345678.9\t2.4\t-989.4\t\n" +
-			"5.1\t12.0\t2.4\t-7.0\t\n" +
-			".0\t0.0\t332.0\t8908.0\t\n" +
-			".0\t-.3\t456.4\t22.1\t\n" +
-			".0\t1.2\t44.4\t-13.3\t\t",
-
-		"    .0          .3    2.4    -5.1\n" +
-			"  23.0  12345678.9    2.4  -989.4\n" +
-			"   5.1        12.0    2.4    -7.0\n" +
-			"    .0         0.0  332.0  8908.0\n" +
-			"    .0         -.3  456.4    22.1\n" +
-			"    .0         1.2   44.4   -13.3",
-	},
-
-	{
-		"14 debug",
-		1, 0, 2, ' ', AlignRight | Debug,
-		".0\t.3\t2.4\t-5.1\t\n" +
-			"23.0\t12345678.9\t2.4\t-989.4\t\n" +
-			"5.1\t12.0\t2.4\t-7.0\t\n" +
-			".0\t0.0\t332.0\t8908.0\t\n" +
-			".0\t-.3\t456.4\t22.1\t\n" +
-			".0\t1.2\t44.4\t-13.3\t\t",
-
-		"    .0|          .3|    2.4|    -5.1|\n" +
-			"  23.0|  12345678.9|    2.4|  -989.4|\n" +
-			"   5.1|        12.0|    2.4|    -7.0|\n" +
-			"    .0|         0.0|  332.0|  8908.0|\n" +
-			"    .0|         -.3|  456.4|    22.1|\n" +
-			"    .0|         1.2|   44.4|   -13.3|",
-	},
-
-	{
-		"15a",
-		4, 0, 0, '.', 0,
-		"a\t\tb",
-		"a.......b",
-	},
-
-	{
-		"15b",
-		4, 0, 0, '.', DiscardEmptyColumns,
-		"a\t\tb", // htabs - do not discard column
-		"a.......b",
-	},
-
-	{
-		"15c",
-		4, 0, 0, '.', DiscardEmptyColumns,
-		"a\v\vb",
-		"a...b",
-	},
-
-	{
-		"15d",
-		4, 0, 0, '.', AlignRight | DiscardEmptyColumns,
-		"a\v\vb",
-		"...ab",
-	},
-
-	{
-		"16a",
-		100, 100, 0, '\t', 0,
-		"a\tb\t\td\n" +
-			"a\tb\t\td\te\n" +
-			"a\n" +
-			"a\tb\tc\td\n" +
-			"a\tb\tc\td\te\n",
-
-		"a\tb\t\td\n" +
-			"a\tb\t\td\te\n" +
-			"a\n" +
-			"a\tb\tc\td\n" +
-			"a\tb\tc\td\te\n",
-	},
-
-	{
-		"16b",
-		100, 100, 0, '\t', DiscardEmptyColumns,
-		"a\vb\v\vd\n" +
-			"a\vb\v\vd\ve\n" +
-			"a\n" +
-			"a\vb\vc\vd\n" +
-			"a\vb\vc\vd\ve\n",
-
-		"a\tb\td\n" +
-			"a\tb\td\te\n" +
-			"a\n" +
-			"a\tb\tc\td\n" +
-			"a\tb\tc\td\te\n",
-	},
-
-	{
-		"16b debug",
-		100, 100, 0, '\t', DiscardEmptyColumns | Debug,
-		"a\vb\v\vd\n" +
-			"a\vb\v\vd\ve\n" +
-			"a\n" +
-			"a\vb\vc\vd\n" +
-			"a\vb\vc\vd\ve\n",
-
-		"a\t|b\t||d\n" +
-			"a\t|b\t||d\t|e\n" +
-			"a\n" +
-			"a\t|b\t|c\t|d\n" +
-			"a\t|b\t|c\t|d\t|e\n",
-	},
-
-	{
-		"16c",
-		100, 100, 0, '\t', DiscardEmptyColumns,
-		"a\tb\t\td\n" + // hard tabs - do not discard column
-			"a\tb\t\td\te\n" +
-			"a\n" +
-			"a\tb\tc\td\n" +
-			"a\tb\tc\td\te\n",
-
-		"a\tb\t\td\n" +
-			"a\tb\t\td\te\n" +
-			"a\n" +
-			"a\tb\tc\td\n" +
-			"a\tb\tc\td\te\n",
-	},
-
-	{
-		"16c debug",
-		100, 100, 0, '\t', DiscardEmptyColumns | Debug,
-		"a\tb\t\td\n" + // hard tabs - do not discard column
-			"a\tb\t\td\te\n" +
-			"a\n" +
-			"a\tb\tc\td\n" +
-			"a\tb\tc\td\te\n",
-
-		"a\t|b\t|\t|d\n" +
-			"a\t|b\t|\t|d\t|e\n" +
-			"a\n" +
-			"a\t|b\t|c\t|d\n" +
-			"a\t|b\t|c\t|d\t|e\n",
-	},
-}
-
-func Test(t *testing.T) {
-	for _, e := range tests {
-		check(t, e.testname, e.minwidth, e.tabwidth, e.padding, e.padchar, e.flags, e.src, e.expected)
-	}
-}
-
-type panicWriter struct{}
-
-func (panicWriter) Write([]byte) (int, error) {
-	panic("cannot write")
-}
-
-func wantPanicString(t *testing.T, want string) {
-	if e := recover(); e != nil {
-		got, ok := e.(string)
-		switch {
-		case !ok:
-			t.Errorf("got %v (%T), want panic string", e, e)
-		case got != want:
-			t.Errorf("wrong panic message: got %q, want %q", got, want)
-		}
-	}
-}
-
-func TestPanicDuringFlush(t *testing.T) {
-	defer wantPanicString(t, "tabwriter: panic during Flush")
-	var p panicWriter
-	w := new(Writer)
-	w.Init(p, 0, 0, 5, ' ', 0)
-	io.WriteString(w, "a")
-	w.Flush()
-	t.Errorf("failed to panic during Flush")
-}
-
-func TestPanicDuringWrite(t *testing.T) {
-	defer wantPanicString(t, "tabwriter: panic during Write")
-	var p panicWriter
-	w := new(Writer)
-	w.Init(p, 0, 0, 5, ' ', 0)
-	io.WriteString(w, "a\n\n") // the second \n triggers a call to w.Write and thus a panic
-	t.Errorf("failed to panic during Write")
-}
diff --git a/third_party/gofrontend/libgo/go/text/template/doc.go b/third_party/gofrontend/libgo/go/text/template/doc.go
deleted file mode 100644
index 0ce63f6..0000000
--- a/third_party/gofrontend/libgo/go/text/template/doc.go
+++ /dev/null
@@ -1,406 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package template implements data-driven templates for generating textual output.
-
-To generate HTML output, see package html/template, which has the same interface
-as this package but automatically secures HTML output against certain attacks.
-
-Templates are executed by applying them to a data structure. Annotations in the
-template refer to elements of the data structure (typically a field of a struct
-or a key in a map) to control execution and derive values to be displayed.
-Execution of the template walks the structure and sets the cursor, represented
-by a period '.' and called "dot", to the value at the current location in the
-structure as execution proceeds.
-
-The input text for a template is UTF-8-encoded text in any format.
-"Actions"--data evaluations or control structures--are delimited by
-"{{" and "}}"; all text outside actions is copied to the output unchanged.
-Except for raw strings, actions may not span newlines, although comments can.
-
-Once parsed, a template may be executed safely in parallel.
-
-Here is a trivial example that prints "17 items are made of wool".
-
-	type Inventory struct {
-		Material string
-		Count    uint
-	}
-	sweaters := Inventory{"wool", 17}
-	tmpl, err := template.New("test").Parse("{{.Count}} items are made of {{.Material}}")
-	if err != nil { panic(err) }
-	err = tmpl.Execute(os.Stdout, sweaters)
-	if err != nil { panic(err) }
-
-More intricate examples appear below.
-
-Actions
-
-Here is the list of actions. "Arguments" and "pipelines" are evaluations of
-data, defined in detail below.
-
-*/
-//	{{/* a comment */}}
-//		A comment; discarded. May contain newlines.
-//		Comments do not nest and must start and end at the
-//		delimiters, as shown here.
-/*
-
-	{{pipeline}}
-		The default textual representation of the value of the pipeline
-		is copied to the output.
-
-	{{if pipeline}} T1 {{end}}
-		If the value of the pipeline is empty, no output is generated;
-		otherwise, T1 is executed.  The empty values are false, 0, any
-		nil pointer or interface value, and any array, slice, map, or
-		string of length zero.
-		Dot is unaffected.
-
-	{{if pipeline}} T1 {{else}} T0 {{end}}
-		If the value of the pipeline is empty, T0 is executed;
-		otherwise, T1 is executed.  Dot is unaffected.
-
-	{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}
-		To simplify the appearance of if-else chains, the else action
-		of an if may include another if directly; the effect is exactly
-		the same as writing
-			{{if pipeline}} T1 {{else}}{{if pipeline}} T0 {{end}}{{end}}
-
-	{{range pipeline}} T1 {{end}}
-		The value of the pipeline must be an array, slice, map, or channel.
-		If the value of the pipeline has length zero, nothing is output;
-		otherwise, dot is set to the successive elements of the array,
-		slice, or map and T1 is executed. If the value is a map and the
-		keys are of basic type with a defined order ("comparable"), the
-		elements will be visited in sorted key order.
-
-	{{range pipeline}} T1 {{else}} T0 {{end}}
-		The value of the pipeline must be an array, slice, map, or channel.
-		If the value of the pipeline has length zero, dot is unaffected and
-		T0 is executed; otherwise, dot is set to the successive elements
-		of the array, slice, or map and T1 is executed.
-
-	{{template "name"}}
-		The template with the specified name is executed with nil data.
-
-	{{template "name" pipeline}}
-		The template with the specified name is executed with dot set
-		to the value of the pipeline.
-
-	{{with pipeline}} T1 {{end}}
-		If the value of the pipeline is empty, no output is generated;
-		otherwise, dot is set to the value of the pipeline and T1 is
-		executed.
-
-	{{with pipeline}} T1 {{else}} T0 {{end}}
-		If the value of the pipeline is empty, dot is unaffected and T0
-		is executed; otherwise, dot is set to the value of the pipeline
-		and T1 is executed.
-
-Arguments
-
-An argument is a simple value, denoted by one of the following.
-
-	- A boolean, string, character, integer, floating-point, imaginary
-	  or complex constant in Go syntax. These behave like Go's untyped
-	  constants.
-	- The keyword nil, representing an untyped Go nil.
-	- The character '.' (period):
-		.
-	  The result is the value of dot.
-	- A variable name, which is a (possibly empty) alphanumeric string
-	  preceded by a dollar sign, such as
-		$piOver2
-	  or
-		$
-	  The result is the value of the variable.
-	  Variables are described below.
-	- The name of a field of the data, which must be a struct, preceded
-	  by a period, such as
-		.Field
-	  The result is the value of the field. Field invocations may be
-	  chained:
-	    .Field1.Field2
-	  Fields can also be evaluated on variables, including chaining:
-	    $x.Field1.Field2
-	- The name of a key of the data, which must be a map, preceded
-	  by a period, such as
-		.Key
-	  The result is the map element value indexed by the key.
-	  Key invocations may be chained and combined with fields to any
-	  depth:
-	    .Field1.Key1.Field2.Key2
-	  Although the key must be an alphanumeric identifier, unlike with
-	  field names they do not need to start with an upper case letter.
-	  Keys can also be evaluated on variables, including chaining:
-	    $x.key1.key2
-	- The name of a niladic method of the data, preceded by a period,
-	  such as
-		.Method
-	  The result is the value of invoking the method with dot as the
-	  receiver, dot.Method(). Such a method must have one return value (of
-	  any type) or two return values, the second of which is an error.
-	  If it has two and the returned error is non-nil, execution terminates
-	  and an error is returned to the caller as the value of Execute.
-	  Method invocations may be chained and combined with fields and keys
-	  to any depth:
-	    .Field1.Key1.Method1.Field2.Key2.Method2
-	  Methods can also be evaluated on variables, including chaining:
-	    $x.Method1.Field
-	- The name of a niladic function, such as
-		fun
-	  The result is the value of invoking the function, fun(). The return
-	  types and values behave as in methods. Functions and function
-	  names are described below.
-	- A parenthesized instance of one the above, for grouping. The result
-	  may be accessed by a field or map key invocation.
-		print (.F1 arg1) (.F2 arg2)
-		(.StructValuedMethod "arg").Field
-
-Arguments may evaluate to any type; if they are pointers the implementation
-automatically indirects to the base type when required.
-If an evaluation yields a function value, such as a function-valued
-field of a struct, the function is not invoked automatically, but it
-can be used as a truth value for an if action and the like. To invoke
-it, use the call function, defined below.
-
-A pipeline is a possibly chained sequence of "commands". A command is a simple
-value (argument) or a function or method call, possibly with multiple arguments:
-
-	Argument
-		The result is the value of evaluating the argument.
-	.Method [Argument...]
-		The method can be alone or the last element of a chain but,
-		unlike methods in the middle of a chain, it can take arguments.
-		The result is the value of calling the method with the
-		arguments:
-			dot.Method(Argument1, etc.)
-	functionName [Argument...]
-		The result is the value of calling the function associated
-		with the name:
-			function(Argument1, etc.)
-		Functions and function names are described below.
-
-Pipelines
-
-A pipeline may be "chained" by separating a sequence of commands with pipeline
-characters '|'. In a chained pipeline, the result of the each command is
-passed as the last argument of the following command. The output of the final
-command in the pipeline is the value of the pipeline.
-
-The output of a command will be either one value or two values, the second of
-which has type error. If that second value is present and evaluates to
-non-nil, execution terminates and the error is returned to the caller of
-Execute.
-
-Variables
-
-A pipeline inside an action may initialize a variable to capture the result.
-The initialization has syntax
-
-	$variable := pipeline
-
-where $variable is the name of the variable. An action that declares a
-variable produces no output.
-
-If a "range" action initializes a variable, the variable is set to the
-successive elements of the iteration.  Also, a "range" may declare two
-variables, separated by a comma:
-
-	range $index, $element := pipeline
-
-in which case $index and $element are set to the successive values of the
-array/slice index or map key and element, respectively.  Note that if there is
-only one variable, it is assigned the element; this is opposite to the
-convention in Go range clauses.
-
-A variable's scope extends to the "end" action of the control structure ("if",
-"with", or "range") in which it is declared, or to the end of the template if
-there is no such control structure.  A template invocation does not inherit
-variables from the point of its invocation.
-
-When execution begins, $ is set to the data argument passed to Execute, that is,
-to the starting value of dot.
-
-Examples
-
-Here are some example one-line templates demonstrating pipelines and variables.
-All produce the quoted word "output":
-
-	{{"\"output\""}}
-		A string constant.
-	{{`"output"`}}
-		A raw string constant.
-	{{printf "%q" "output"}}
-		A function call.
-	{{"output" | printf "%q"}}
-		A function call whose final argument comes from the previous
-		command.
-	{{printf "%q" (print "out" "put")}}
-		A parenthesized argument.
-	{{"put" | printf "%s%s" "out" | printf "%q"}}
-		A more elaborate call.
-	{{"output" | printf "%s" | printf "%q"}}
-		A longer chain.
-	{{with "output"}}{{printf "%q" .}}{{end}}
-		A with action using dot.
-	{{with $x := "output" | printf "%q"}}{{$x}}{{end}}
-		A with action that creates and uses a variable.
-	{{with $x := "output"}}{{printf "%q" $x}}{{end}}
-		A with action that uses the variable in another action.
-	{{with $x := "output"}}{{$x | printf "%q"}}{{end}}
-		The same, but pipelined.
-
-Functions
-
-During execution functions are found in two function maps: first in the
-template, then in the global function map. By default, no functions are defined
-in the template but the Funcs method can be used to add them.
-
-Predefined global functions are named as follows.
-
-	and
-		Returns the boolean AND of its arguments by returning the
-		first empty argument or the last argument, that is,
-		"and x y" behaves as "if x then y else x". All the
-		arguments are evaluated.
-	call
-		Returns the result of calling the first argument, which
-		must be a function, with the remaining arguments as parameters.
-		Thus "call .X.Y 1 2" is, in Go notation, dot.X.Y(1, 2) where
-		Y is a func-valued field, map entry, or the like.
-		The first argument must be the result of an evaluation
-		that yields a value of function type (as distinct from
-		a predefined function such as print). The function must
-		return either one or two result values, the second of which
-		is of type error. If the arguments don't match the function
-		or the returned error value is non-nil, execution stops.
-	html
-		Returns the escaped HTML equivalent of the textual
-		representation of its arguments.
-	index
-		Returns the result of indexing its first argument by the
-		following arguments. Thus "index x 1 2 3" is, in Go syntax,
-		x[1][2][3]. Each indexed item must be a map, slice, or array.
-	js
-		Returns the escaped JavaScript equivalent of the textual
-		representation of its arguments.
-	len
-		Returns the integer length of its argument.
-	not
-		Returns the boolean negation of its single argument.
-	or
-		Returns the boolean OR of its arguments by returning the
-		first non-empty argument or the last argument, that is,
-		"or x y" behaves as "if x then x else y". All the
-		arguments are evaluated.
-	print
-		An alias for fmt.Sprint
-	printf
-		An alias for fmt.Sprintf
-	println
-		An alias for fmt.Sprintln
-	urlquery
-		Returns the escaped value of the textual representation of
-		its arguments in a form suitable for embedding in a URL query.
-
-The boolean functions take any zero value to be false and a non-zero
-value to be true.
-
-There is also a set of binary comparison operators defined as
-functions:
-
-	eq
-		Returns the boolean truth of arg1 == arg2
-	ne
-		Returns the boolean truth of arg1 != arg2
-	lt
-		Returns the boolean truth of arg1 < arg2
-	le
-		Returns the boolean truth of arg1 <= arg2
-	gt
-		Returns the boolean truth of arg1 > arg2
-	ge
-		Returns the boolean truth of arg1 >= arg2
-
-For simpler multi-way equality tests, eq (only) accepts two or more
-arguments and compares the second and subsequent to the first,
-returning in effect
-
-	arg1==arg2 || arg1==arg3 || arg1==arg4 ...
-
-(Unlike with || in Go, however, eq is a function call and all the
-arguments will be evaluated.)
-
-The comparison functions work on basic types only (or named basic
-types, such as "type Celsius float32"). They implement the Go rules
-for comparison of values, except that size and exact type are
-ignored, so any integer value, signed or unsigned, may be compared
-with any other integer value. (The arithmetic value is compared,
-not the bit pattern, so all negative integers are less than all
-unsigned integers.) However, as usual, one may not compare an int
-with a float32 and so on.
-
-Associated templates
-
-Each template is named by a string specified when it is created. Also, each
-template is associated with zero or more other templates that it may invoke by
-name; such associations are transitive and form a name space of templates.
-
-A template may use a template invocation to instantiate another associated
-template; see the explanation of the "template" action above. The name must be
-that of a template associated with the template that contains the invocation.
-
-Nested template definitions
-
-When parsing a template, another template may be defined and associated with the
-template being parsed. Template definitions must appear at the top level of the
-template, much like global variables in a Go program.
-
-The syntax of such definitions is to surround each template declaration with a
-"define" and "end" action.
-
-The define action names the template being created by providing a string
-constant. Here is a simple example:
-
-	`{{define "T1"}}ONE{{end}}
-	{{define "T2"}}TWO{{end}}
-	{{define "T3"}}{{template "T1"}} {{template "T2"}}{{end}}
-	{{template "T3"}}`
-
-This defines two templates, T1 and T2, and a third T3 that invokes the other two
-when it is executed. Finally it invokes T3. If executed this template will
-produce the text
-
-	ONE TWO
-
-By construction, a template may reside in only one association. If it's
-necessary to have a template addressable from multiple associations, the
-template definition must be parsed multiple times to create distinct *Template
-values, or must be copied with the Clone or AddParseTree method.
-
-Parse may be called multiple times to assemble the various associated templates;
-see the ParseFiles and ParseGlob functions and methods for simple ways to parse
-related templates stored in files.
-
-A template may be executed directly or through ExecuteTemplate, which executes
-an associated template identified by name. To invoke our example above, we
-might write,
-
-	err := tmpl.Execute(os.Stdout, "no data needed")
-	if err != nil {
-		log.Fatalf("execution failed: %s", err)
-	}
-
-or to invoke a particular template explicitly by name,
-
-	err := tmpl.ExecuteTemplate(os.Stdout, "T2", "no data needed")
-	if err != nil {
-		log.Fatalf("execution failed: %s", err)
-	}
-
-*/
-package template
diff --git a/third_party/gofrontend/libgo/go/text/template/exec.go b/third_party/gofrontend/libgo/go/text/template/exec.go
deleted file mode 100644
index daba788..0000000
--- a/third_party/gofrontend/libgo/go/text/template/exec.go
+++ /dev/null
@@ -1,879 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"reflect"
-	"runtime"
-	"sort"
-	"strings"
-	"text/template/parse"
-)
-
-// state represents the state of an execution. It's not part of the
-// template so that multiple executions of the same template
-// can execute in parallel.
-type state struct {
-	tmpl *Template
-	wr   io.Writer
-	node parse.Node // current node, for errors
-	vars []variable // push-down stack of variable values.
-}
-
-// variable holds the dynamic value of a variable such as $, $x etc.
-type variable struct {
-	name  string
-	value reflect.Value
-}
-
-// push pushes a new variable on the stack.
-func (s *state) push(name string, value reflect.Value) {
-	s.vars = append(s.vars, variable{name, value})
-}
-
-// mark returns the length of the variable stack.
-func (s *state) mark() int {
-	return len(s.vars)
-}
-
-// pop pops the variable stack up to the mark.
-func (s *state) pop(mark int) {
-	s.vars = s.vars[0:mark]
-}
-
-// setVar overwrites the top-nth variable on the stack. Used by range iterations.
-func (s *state) setVar(n int, value reflect.Value) {
-	s.vars[len(s.vars)-n].value = value
-}
-
-// varValue returns the value of the named variable.
-func (s *state) varValue(name string) reflect.Value {
-	for i := s.mark() - 1; i >= 0; i-- {
-		if s.vars[i].name == name {
-			return s.vars[i].value
-		}
-	}
-	s.errorf("undefined variable: %s", name)
-	return zero
-}
-
-var zero reflect.Value
-
-// at marks the state to be on node n, for error reporting.
-func (s *state) at(node parse.Node) {
-	s.node = node
-}
-
-// doublePercent returns the string with %'s replaced by %%, if necessary,
-// so it can be used safely inside a Printf format string.
-func doublePercent(str string) string {
-	if strings.Contains(str, "%") {
-		str = strings.Replace(str, "%", "%%", -1)
-	}
-	return str
-}
-
-// errorf formats the error and terminates processing.
-func (s *state) errorf(format string, args ...interface{}) {
-	name := doublePercent(s.tmpl.Name())
-	if s.node == nil {
-		format = fmt.Sprintf("template: %s: %s", name, format)
-	} else {
-		location, context := s.tmpl.ErrorContext(s.node)
-		format = fmt.Sprintf("template: %s: executing %q at <%s>: %s", location, name, doublePercent(context), format)
-	}
-	panic(fmt.Errorf(format, args...))
-}
-
-// errRecover is the handler that turns panics into returns from the top
-// level of Parse.
-func errRecover(errp *error) {
-	e := recover()
-	if e != nil {
-		switch err := e.(type) {
-		case runtime.Error:
-			panic(e)
-		case error:
-			*errp = err
-		default:
-			panic(e)
-		}
-	}
-}
-
-// ExecuteTemplate applies the template associated with t that has the given name
-// to the specified data object and writes the output to wr.
-// If an error occurs executing the template or writing its output,
-// execution stops, but partial results may already have been written to
-// the output writer.
-// A template may be executed safely in parallel.
-func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error {
-	var tmpl *Template
-	if t.common != nil {
-		tmpl = t.tmpl[name]
-	}
-	if tmpl == nil {
-		return fmt.Errorf("template: no template %q associated with template %q", name, t.name)
-	}
-	return tmpl.Execute(wr, data)
-}
-
-// Execute applies a parsed template to the specified data object,
-// and writes the output to wr.
-// If an error occurs executing the template or writing its output,
-// execution stops, but partial results may already have been written to
-// the output writer.
-// A template may be executed safely in parallel.
-func (t *Template) Execute(wr io.Writer, data interface{}) (err error) {
-	defer errRecover(&err)
-	value := reflect.ValueOf(data)
-	state := &state{
-		tmpl: t,
-		wr:   wr,
-		vars: []variable{{"$", value}},
-	}
-	if t.Tree == nil || t.Root == nil {
-		state.errorf("%q is an incomplete or empty template%s", t.Name(), t.DefinedTemplates())
-	}
-	state.walk(value, t.Root)
-	return
-}
-
-// DefinedTemplates returns a string listing the defined templates,
-// prefixed by the string "defined templates are: ". If there are none,
-// it returns the empty string. For generating an error message here
-// and in html/template.
-func (t *Template) DefinedTemplates() string {
-	if t.common == nil {
-		return ""
-	}
-	var b bytes.Buffer
-	for name, tmpl := range t.tmpl {
-		if tmpl.Tree == nil || tmpl.Root == nil {
-			continue
-		}
-		if b.Len() > 0 {
-			b.WriteString(", ")
-		}
-		fmt.Fprintf(&b, "%q", name)
-	}
-	var s string
-	if b.Len() > 0 {
-		s = "; defined templates are: " + b.String()
-	}
-	return s
-}
-
-// Walk functions step through the major pieces of the template structure,
-// generating output as they go.
-func (s *state) walk(dot reflect.Value, node parse.Node) {
-	s.at(node)
-	switch node := node.(type) {
-	case *parse.ActionNode:
-		// Do not pop variables so they persist until next end.
-		// Also, if the action declares variables, don't print the result.
-		val := s.evalPipeline(dot, node.Pipe)
-		if len(node.Pipe.Decl) == 0 {
-			s.printValue(node, val)
-		}
-	case *parse.IfNode:
-		s.walkIfOrWith(parse.NodeIf, dot, node.Pipe, node.List, node.ElseList)
-	case *parse.ListNode:
-		for _, node := range node.Nodes {
-			s.walk(dot, node)
-		}
-	case *parse.RangeNode:
-		s.walkRange(dot, node)
-	case *parse.TemplateNode:
-		s.walkTemplate(dot, node)
-	case *parse.TextNode:
-		if _, err := s.wr.Write(node.Text); err != nil {
-			s.errorf("%s", err)
-		}
-	case *parse.WithNode:
-		s.walkIfOrWith(parse.NodeWith, dot, node.Pipe, node.List, node.ElseList)
-	default:
-		s.errorf("unknown node: %s", node)
-	}
-}
-
-// walkIfOrWith walks an 'if' or 'with' node. The two control structures
-// are identical in behavior except that 'with' sets dot.
-func (s *state) walkIfOrWith(typ parse.NodeType, dot reflect.Value, pipe *parse.PipeNode, list, elseList *parse.ListNode) {
-	defer s.pop(s.mark())
-	val := s.evalPipeline(dot, pipe)
-	truth, ok := isTrue(val)
-	if !ok {
-		s.errorf("if/with can't use %v", val)
-	}
-	if truth {
-		if typ == parse.NodeWith {
-			s.walk(val, list)
-		} else {
-			s.walk(dot, list)
-		}
-	} else if elseList != nil {
-		s.walk(dot, elseList)
-	}
-}
-
-// isTrue reports whether the value is 'true', in the sense of not the zero of its type,
-// and whether the value has a meaningful truth value.
-func isTrue(val reflect.Value) (truth, ok bool) {
-	if !val.IsValid() {
-		// Something like var x interface{}, never set. It's a form of nil.
-		return false, true
-	}
-	switch val.Kind() {
-	case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
-		truth = val.Len() > 0
-	case reflect.Bool:
-		truth = val.Bool()
-	case reflect.Complex64, reflect.Complex128:
-		truth = val.Complex() != 0
-	case reflect.Chan, reflect.Func, reflect.Ptr, reflect.Interface:
-		truth = !val.IsNil()
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		truth = val.Int() != 0
-	case reflect.Float32, reflect.Float64:
-		truth = val.Float() != 0
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		truth = val.Uint() != 0
-	case reflect.Struct:
-		truth = true // Struct values are always true.
-	default:
-		return
-	}
-	return truth, true
-}
-
-func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) {
-	s.at(r)
-	defer s.pop(s.mark())
-	val, _ := indirect(s.evalPipeline(dot, r.Pipe))
-	// mark top of stack before any variables in the body are pushed.
-	mark := s.mark()
-	oneIteration := func(index, elem reflect.Value) {
-		// Set top var (lexically the second if there are two) to the element.
-		if len(r.Pipe.Decl) > 0 {
-			s.setVar(1, elem)
-		}
-		// Set next var (lexically the first if there are two) to the index.
-		if len(r.Pipe.Decl) > 1 {
-			s.setVar(2, index)
-		}
-		s.walk(elem, r.List)
-		s.pop(mark)
-	}
-	switch val.Kind() {
-	case reflect.Array, reflect.Slice:
-		if val.Len() == 0 {
-			break
-		}
-		for i := 0; i < val.Len(); i++ {
-			oneIteration(reflect.ValueOf(i), val.Index(i))
-		}
-		return
-	case reflect.Map:
-		if val.Len() == 0 {
-			break
-		}
-		for _, key := range sortKeys(val.MapKeys()) {
-			oneIteration(key, val.MapIndex(key))
-		}
-		return
-	case reflect.Chan:
-		if val.IsNil() {
-			break
-		}
-		i := 0
-		for ; ; i++ {
-			elem, ok := val.Recv()
-			if !ok {
-				break
-			}
-			oneIteration(reflect.ValueOf(i), elem)
-		}
-		if i == 0 {
-			break
-		}
-		return
-	case reflect.Invalid:
-		break // An invalid value is likely a nil map, etc. and acts like an empty map.
-	default:
-		s.errorf("range can't iterate over %v", val)
-	}
-	if r.ElseList != nil {
-		s.walk(dot, r.ElseList)
-	}
-}
-
-func (s *state) walkTemplate(dot reflect.Value, t *parse.TemplateNode) {
-	s.at(t)
-	tmpl := s.tmpl.tmpl[t.Name]
-	if tmpl == nil {
-		s.errorf("template %q not defined", t.Name)
-	}
-	// Variables declared by the pipeline persist.
-	dot = s.evalPipeline(dot, t.Pipe)
-	newState := *s
-	newState.tmpl = tmpl
-	// No dynamic scoping: template invocations inherit no variables.
-	newState.vars = []variable{{"$", dot}}
-	newState.walk(dot, tmpl.Root)
-}
-
-// Eval functions evaluate pipelines, commands, and their elements and extract
-// values from the data structure by examining fields, calling methods, and so on.
-// The printing of those values happens only through walk functions.
-
-// evalPipeline returns the value acquired by evaluating a pipeline. If the
-// pipeline has a variable declaration, the variable will be pushed on the
-// stack. Callers should therefore pop the stack after they are finished
-// executing commands depending on the pipeline value.
-func (s *state) evalPipeline(dot reflect.Value, pipe *parse.PipeNode) (value reflect.Value) {
-	if pipe == nil {
-		return
-	}
-	s.at(pipe)
-	for _, cmd := range pipe.Cmds {
-		value = s.evalCommand(dot, cmd, value) // previous value is this one's final arg.
-		// If the object has type interface{}, dig down one level to the thing inside.
-		if value.Kind() == reflect.Interface && value.Type().NumMethod() == 0 {
-			value = reflect.ValueOf(value.Interface()) // lovely!
-		}
-	}
-	for _, variable := range pipe.Decl {
-		s.push(variable.Ident[0], value)
-	}
-	return value
-}
-
-func (s *state) notAFunction(args []parse.Node, final reflect.Value) {
-	if len(args) > 1 || final.IsValid() {
-		s.errorf("can't give argument to non-function %s", args[0])
-	}
-}
-
-func (s *state) evalCommand(dot reflect.Value, cmd *parse.CommandNode, final reflect.Value) reflect.Value {
-	firstWord := cmd.Args[0]
-	switch n := firstWord.(type) {
-	case *parse.FieldNode:
-		return s.evalFieldNode(dot, n, cmd.Args, final)
-	case *parse.ChainNode:
-		return s.evalChainNode(dot, n, cmd.Args, final)
-	case *parse.IdentifierNode:
-		// Must be a function.
-		return s.evalFunction(dot, n, cmd, cmd.Args, final)
-	case *parse.PipeNode:
-		// Parenthesized pipeline. The arguments are all inside the pipeline; final is ignored.
-		return s.evalPipeline(dot, n)
-	case *parse.VariableNode:
-		return s.evalVariableNode(dot, n, cmd.Args, final)
-	}
-	s.at(firstWord)
-	s.notAFunction(cmd.Args, final)
-	switch word := firstWord.(type) {
-	case *parse.BoolNode:
-		return reflect.ValueOf(word.True)
-	case *parse.DotNode:
-		return dot
-	case *parse.NilNode:
-		s.errorf("nil is not a command")
-	case *parse.NumberNode:
-		return s.idealConstant(word)
-	case *parse.StringNode:
-		return reflect.ValueOf(word.Text)
-	}
-	s.errorf("can't evaluate command %q", firstWord)
-	panic("not reached")
-}
-
-// idealConstant is called to return the value of a number in a context where
-// we don't know the type. In that case, the syntax of the number tells us
-// its type, and we use Go rules to resolve.  Note there is no such thing as
-// a uint ideal constant in this situation - the value must be of int type.
-func (s *state) idealConstant(constant *parse.NumberNode) reflect.Value {
-	// These are ideal constants but we don't know the type
-	// and we have no context.  (If it was a method argument,
-	// we'd know what we need.) The syntax guides us to some extent.
-	s.at(constant)
-	switch {
-	case constant.IsComplex:
-		return reflect.ValueOf(constant.Complex128) // incontrovertible.
-	case constant.IsFloat && !isHexConstant(constant.Text) && strings.IndexAny(constant.Text, ".eE") >= 0:
-		return reflect.ValueOf(constant.Float64)
-	case constant.IsInt:
-		n := int(constant.Int64)
-		if int64(n) != constant.Int64 {
-			s.errorf("%s overflows int", constant.Text)
-		}
-		return reflect.ValueOf(n)
-	case constant.IsUint:
-		s.errorf("%s overflows int", constant.Text)
-	}
-	return zero
-}
-
-func isHexConstant(s string) bool {
-	return len(s) > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')
-}
-
-func (s *state) evalFieldNode(dot reflect.Value, field *parse.FieldNode, args []parse.Node, final reflect.Value) reflect.Value {
-	s.at(field)
-	return s.evalFieldChain(dot, dot, field, field.Ident, args, final)
-}
-
-func (s *state) evalChainNode(dot reflect.Value, chain *parse.ChainNode, args []parse.Node, final reflect.Value) reflect.Value {
-	s.at(chain)
-	if len(chain.Field) == 0 {
-		s.errorf("internal error: no fields in evalChainNode")
-	}
-	if chain.Node.Type() == parse.NodeNil {
-		s.errorf("indirection through explicit nil in %s", chain)
-	}
-	// (pipe).Field1.Field2 has pipe as .Node, fields as .Field. Eval the pipeline, then the fields.
-	pipe := s.evalArg(dot, nil, chain.Node)
-	return s.evalFieldChain(dot, pipe, chain, chain.Field, args, final)
-}
-
-func (s *state) evalVariableNode(dot reflect.Value, variable *parse.VariableNode, args []parse.Node, final reflect.Value) reflect.Value {
-	// $x.Field has $x as the first ident, Field as the second. Eval the var, then the fields.
-	s.at(variable)
-	value := s.varValue(variable.Ident[0])
-	if len(variable.Ident) == 1 {
-		s.notAFunction(args, final)
-		return value
-	}
-	return s.evalFieldChain(dot, value, variable, variable.Ident[1:], args, final)
-}
-
-// evalFieldChain evaluates .X.Y.Z possibly followed by arguments.
-// dot is the environment in which to evaluate arguments, while
-// receiver is the value being walked along the chain.
-func (s *state) evalFieldChain(dot, receiver reflect.Value, node parse.Node, ident []string, args []parse.Node, final reflect.Value) reflect.Value {
-	n := len(ident)
-	for i := 0; i < n-1; i++ {
-		receiver = s.evalField(dot, ident[i], node, nil, zero, receiver)
-	}
-	// Now if it's a method, it gets the arguments.
-	return s.evalField(dot, ident[n-1], node, args, final, receiver)
-}
-
-func (s *state) evalFunction(dot reflect.Value, node *parse.IdentifierNode, cmd parse.Node, args []parse.Node, final reflect.Value) reflect.Value {
-	s.at(node)
-	name := node.Ident
-	function, ok := findFunction(name, s.tmpl)
-	if !ok {
-		s.errorf("%q is not a defined function", name)
-	}
-	return s.evalCall(dot, function, cmd, name, args, final)
-}
-
-// evalField evaluates an expression like (.Field) or (.Field arg1 arg2).
-// The 'final' argument represents the return value from the preceding
-// value of the pipeline, if any.
-func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node, args []parse.Node, final, receiver reflect.Value) reflect.Value {
-	if !receiver.IsValid() {
-		return zero
-	}
-	typ := receiver.Type()
-	receiver, _ = indirect(receiver)
-	// Unless it's an interface, need to get to a value of type *T to guarantee
-	// we see all methods of T and *T.
-	ptr := receiver
-	if ptr.Kind() != reflect.Interface && ptr.CanAddr() {
-		ptr = ptr.Addr()
-	}
-	if method := ptr.MethodByName(fieldName); method.IsValid() {
-		return s.evalCall(dot, method, node, fieldName, args, final)
-	}
-	hasArgs := len(args) > 1 || final.IsValid()
-	// It's not a method; must be a field of a struct or an element of a map. The receiver must not be nil.
-	receiver, isNil := indirect(receiver)
-	if isNil {
-		s.errorf("nil pointer evaluating %s.%s", typ, fieldName)
-	}
-	switch receiver.Kind() {
-	case reflect.Struct:
-		tField, ok := receiver.Type().FieldByName(fieldName)
-		if ok {
-			field := receiver.FieldByIndex(tField.Index)
-			if tField.PkgPath != "" { // field is unexported
-				s.errorf("%s is an unexported field of struct type %s", fieldName, typ)
-			}
-			// If it's a function, we must call it.
-			if hasArgs {
-				s.errorf("%s has arguments but cannot be invoked as function", fieldName)
-			}
-			return field
-		}
-		s.errorf("%s is not a field of struct type %s", fieldName, typ)
-	case reflect.Map:
-		// If it's a map, attempt to use the field name as a key.
-		nameVal := reflect.ValueOf(fieldName)
-		if nameVal.Type().AssignableTo(receiver.Type().Key()) {
-			if hasArgs {
-				s.errorf("%s is not a method but has arguments", fieldName)
-			}
-			result := receiver.MapIndex(nameVal)
-			if !result.IsValid() {
-				switch s.tmpl.option.missingKey {
-				case mapInvalid:
-					// Just use the invalid value.
-				case mapZeroValue:
-					result = reflect.Zero(receiver.Type().Elem())
-				case mapError:
-					s.errorf("map has no entry for key %q", fieldName)
-				}
-			}
-			return result
-		}
-	}
-	s.errorf("can't evaluate field %s in type %s", fieldName, typ)
-	panic("not reached")
-}
-
-var (
-	errorType       = reflect.TypeOf((*error)(nil)).Elem()
-	fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem()
-)
-
-// evalCall executes a function or method call. If it's a method, fun already has the receiver bound, so
-// it looks just like a function call.  The arg list, if non-nil, includes (in the manner of the shell), arg[0]
-// as the function itself.
-func (s *state) evalCall(dot, fun reflect.Value, node parse.Node, name string, args []parse.Node, final reflect.Value) reflect.Value {
-	if args != nil {
-		args = args[1:] // Zeroth arg is function name/node; not passed to function.
-	}
-	typ := fun.Type()
-	numIn := len(args)
-	if final.IsValid() {
-		numIn++
-	}
-	numFixed := len(args)
-	if typ.IsVariadic() {
-		numFixed = typ.NumIn() - 1 // last arg is the variadic one.
-		if numIn < numFixed {
-			s.errorf("wrong number of args for %s: want at least %d got %d", name, typ.NumIn()-1, len(args))
-		}
-	} else if numIn < typ.NumIn()-1 || !typ.IsVariadic() && numIn != typ.NumIn() {
-		s.errorf("wrong number of args for %s: want %d got %d", name, typ.NumIn(), len(args))
-	}
-	if !goodFunc(typ) {
-		// TODO: This could still be a confusing error; maybe goodFunc should provide info.
-		s.errorf("can't call method/function %q with %d results", name, typ.NumOut())
-	}
-	// Build the arg list.
-	argv := make([]reflect.Value, numIn)
-	// Args must be evaluated. Fixed args first.
-	i := 0
-	for ; i < numFixed && i < len(args); i++ {
-		argv[i] = s.evalArg(dot, typ.In(i), args[i])
-	}
-	// Now the ... args.
-	if typ.IsVariadic() {
-		argType := typ.In(typ.NumIn() - 1).Elem() // Argument is a slice.
-		for ; i < len(args); i++ {
-			argv[i] = s.evalArg(dot, argType, args[i])
-		}
-	}
-	// Add final value if necessary.
-	if final.IsValid() {
-		t := typ.In(typ.NumIn() - 1)
-		if typ.IsVariadic() {
-			if numIn-1 < numFixed {
-				// The added final argument corresponds to a fixed parameter of the function.
-				// Validate against the type of the actual parameter.
-				t = typ.In(numIn - 1)
-			} else {
-				// The added final argument corresponds to the variadic part.
-				// Validate against the type of the elements of the variadic slice.
-				t = t.Elem()
-			}
-		}
-		argv[i] = s.validateType(final, t)
-	}
-	result := fun.Call(argv)
-	// If we have an error that is not nil, stop execution and return that error to the caller.
-	if len(result) == 2 && !result[1].IsNil() {
-		s.at(node)
-		s.errorf("error calling %s: %s", name, result[1].Interface().(error))
-	}
-	return result[0]
-}
-
-// canBeNil reports whether an untyped nil can be assigned to the type. See reflect.Zero.
-func canBeNil(typ reflect.Type) bool {
-	switch typ.Kind() {
-	case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
-		return true
-	}
-	return false
-}
-
-// validateType guarantees that the value is valid and assignable to the type.
-func (s *state) validateType(value reflect.Value, typ reflect.Type) reflect.Value {
-	if !value.IsValid() {
-		if typ == nil || canBeNil(typ) {
-			// An untyped nil interface{}. Accept as a proper nil value.
-			return reflect.Zero(typ)
-		}
-		s.errorf("invalid value; expected %s", typ)
-	}
-	if typ != nil && !value.Type().AssignableTo(typ) {
-		if value.Kind() == reflect.Interface && !value.IsNil() {
-			value = value.Elem()
-			if value.Type().AssignableTo(typ) {
-				return value
-			}
-			// fallthrough
-		}
-		// Does one dereference or indirection work? We could do more, as we
-		// do with method receivers, but that gets messy and method receivers
-		// are much more constrained, so it makes more sense there than here.
-		// Besides, one is almost always all you need.
-		switch {
-		case value.Kind() == reflect.Ptr && value.Type().Elem().AssignableTo(typ):
-			value = value.Elem()
-			if !value.IsValid() {
-				s.errorf("dereference of nil pointer of type %s", typ)
-			}
-		case reflect.PtrTo(value.Type()).AssignableTo(typ) && value.CanAddr():
-			value = value.Addr()
-		default:
-			s.errorf("wrong type for value; expected %s; got %s", typ, value.Type())
-		}
-	}
-	return value
-}
-
-func (s *state) evalArg(dot reflect.Value, typ reflect.Type, n parse.Node) reflect.Value {
-	s.at(n)
-	switch arg := n.(type) {
-	case *parse.DotNode:
-		return s.validateType(dot, typ)
-	case *parse.NilNode:
-		if canBeNil(typ) {
-			return reflect.Zero(typ)
-		}
-		s.errorf("cannot assign nil to %s", typ)
-	case *parse.FieldNode:
-		return s.validateType(s.evalFieldNode(dot, arg, []parse.Node{n}, zero), typ)
-	case *parse.VariableNode:
-		return s.validateType(s.evalVariableNode(dot, arg, nil, zero), typ)
-	case *parse.PipeNode:
-		return s.validateType(s.evalPipeline(dot, arg), typ)
-	case *parse.IdentifierNode:
-		return s.validateType(s.evalFunction(dot, arg, arg, nil, zero), typ)
-	case *parse.ChainNode:
-		return s.validateType(s.evalChainNode(dot, arg, nil, zero), typ)
-	}
-	switch typ.Kind() {
-	case reflect.Bool:
-		return s.evalBool(typ, n)
-	case reflect.Complex64, reflect.Complex128:
-		return s.evalComplex(typ, n)
-	case reflect.Float32, reflect.Float64:
-		return s.evalFloat(typ, n)
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return s.evalInteger(typ, n)
-	case reflect.Interface:
-		if typ.NumMethod() == 0 {
-			return s.evalEmptyInterface(dot, n)
-		}
-	case reflect.String:
-		return s.evalString(typ, n)
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		return s.evalUnsignedInteger(typ, n)
-	}
-	s.errorf("can't handle %s for arg of type %s", n, typ)
-	panic("not reached")
-}
-
-func (s *state) evalBool(typ reflect.Type, n parse.Node) reflect.Value {
-	s.at(n)
-	if n, ok := n.(*parse.BoolNode); ok {
-		value := reflect.New(typ).Elem()
-		value.SetBool(n.True)
-		return value
-	}
-	s.errorf("expected bool; found %s", n)
-	panic("not reached")
-}
-
-func (s *state) evalString(typ reflect.Type, n parse.Node) reflect.Value {
-	s.at(n)
-	if n, ok := n.(*parse.StringNode); ok {
-		value := reflect.New(typ).Elem()
-		value.SetString(n.Text)
-		return value
-	}
-	s.errorf("expected string; found %s", n)
-	panic("not reached")
-}
-
-func (s *state) evalInteger(typ reflect.Type, n parse.Node) reflect.Value {
-	s.at(n)
-	if n, ok := n.(*parse.NumberNode); ok && n.IsInt {
-		value := reflect.New(typ).Elem()
-		value.SetInt(n.Int64)
-		return value
-	}
-	s.errorf("expected integer; found %s", n)
-	panic("not reached")
-}
-
-func (s *state) evalUnsignedInteger(typ reflect.Type, n parse.Node) reflect.Value {
-	s.at(n)
-	if n, ok := n.(*parse.NumberNode); ok && n.IsUint {
-		value := reflect.New(typ).Elem()
-		value.SetUint(n.Uint64)
-		return value
-	}
-	s.errorf("expected unsigned integer; found %s", n)
-	panic("not reached")
-}
-
-func (s *state) evalFloat(typ reflect.Type, n parse.Node) reflect.Value {
-	s.at(n)
-	if n, ok := n.(*parse.NumberNode); ok && n.IsFloat {
-		value := reflect.New(typ).Elem()
-		value.SetFloat(n.Float64)
-		return value
-	}
-	s.errorf("expected float; found %s", n)
-	panic("not reached")
-}
-
-func (s *state) evalComplex(typ reflect.Type, n parse.Node) reflect.Value {
-	if n, ok := n.(*parse.NumberNode); ok && n.IsComplex {
-		value := reflect.New(typ).Elem()
-		value.SetComplex(n.Complex128)
-		return value
-	}
-	s.errorf("expected complex; found %s", n)
-	panic("not reached")
-}
-
-func (s *state) evalEmptyInterface(dot reflect.Value, n parse.Node) reflect.Value {
-	s.at(n)
-	switch n := n.(type) {
-	case *parse.BoolNode:
-		return reflect.ValueOf(n.True)
-	case *parse.DotNode:
-		return dot
-	case *parse.FieldNode:
-		return s.evalFieldNode(dot, n, nil, zero)
-	case *parse.IdentifierNode:
-		return s.evalFunction(dot, n, n, nil, zero)
-	case *parse.NilNode:
-		// NilNode is handled in evalArg, the only place that calls here.
-		s.errorf("evalEmptyInterface: nil (can't happen)")
-	case *parse.NumberNode:
-		return s.idealConstant(n)
-	case *parse.StringNode:
-		return reflect.ValueOf(n.Text)
-	case *parse.VariableNode:
-		return s.evalVariableNode(dot, n, nil, zero)
-	case *parse.PipeNode:
-		return s.evalPipeline(dot, n)
-	}
-	s.errorf("can't handle assignment of %s to empty interface argument", n)
-	panic("not reached")
-}
-
-// indirect returns the item at the end of indirection, and a bool to indicate if it's nil.
-// We indirect through pointers and empty interfaces (only) because
-// non-empty interfaces have methods we might need.
-func indirect(v reflect.Value) (rv reflect.Value, isNil bool) {
-	for ; v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface; v = v.Elem() {
-		if v.IsNil() {
-			return v, true
-		}
-		if v.Kind() == reflect.Interface && v.NumMethod() > 0 {
-			break
-		}
-	}
-	return v, false
-}
-
-// printValue writes the textual representation of the value to the output of
-// the template.
-func (s *state) printValue(n parse.Node, v reflect.Value) {
-	s.at(n)
-	iface, ok := printableValue(v)
-	if !ok {
-		s.errorf("can't print %s of type %s", n, v.Type())
-	}
-	fmt.Fprint(s.wr, iface)
-}
-
-// printableValue returns the, possibly indirected, interface value inside v that
-// is best for a call to formatted printer.
-func printableValue(v reflect.Value) (interface{}, bool) {
-	if v.Kind() == reflect.Ptr {
-		v, _ = indirect(v) // fmt.Fprint handles nil.
-	}
-	if !v.IsValid() {
-		return "<no value>", true
-	}
-
-	if !v.Type().Implements(errorType) && !v.Type().Implements(fmtStringerType) {
-		if v.CanAddr() && (reflect.PtrTo(v.Type()).Implements(errorType) || reflect.PtrTo(v.Type()).Implements(fmtStringerType)) {
-			v = v.Addr()
-		} else {
-			switch v.Kind() {
-			case reflect.Chan, reflect.Func:
-				return nil, false
-			}
-		}
-	}
-	return v.Interface(), true
-}
-
-// Types to help sort the keys in a map for reproducible output.
-
-type rvs []reflect.Value
-
-func (x rvs) Len() int      { return len(x) }
-func (x rvs) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
-
-type rvInts struct{ rvs }
-
-func (x rvInts) Less(i, j int) bool { return x.rvs[i].Int() < x.rvs[j].Int() }
-
-type rvUints struct{ rvs }
-
-func (x rvUints) Less(i, j int) bool { return x.rvs[i].Uint() < x.rvs[j].Uint() }
-
-type rvFloats struct{ rvs }
-
-func (x rvFloats) Less(i, j int) bool { return x.rvs[i].Float() < x.rvs[j].Float() }
-
-type rvStrings struct{ rvs }
-
-func (x rvStrings) Less(i, j int) bool { return x.rvs[i].String() < x.rvs[j].String() }
-
-// sortKeys sorts (if it can) the slice of reflect.Values, which is a slice of map keys.
-func sortKeys(v []reflect.Value) []reflect.Value {
-	if len(v) <= 1 {
-		return v
-	}
-	switch v[0].Kind() {
-	case reflect.Float32, reflect.Float64:
-		sort.Sort(rvFloats{v})
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		sort.Sort(rvInts{v})
-	case reflect.String:
-		sort.Sort(rvStrings{v})
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		sort.Sort(rvUints{v})
-	}
-	return v
-}
diff --git a/third_party/gofrontend/libgo/go/text/template/exec_test.go b/third_party/gofrontend/libgo/go/text/template/exec_test.go
deleted file mode 100644
index ba0e434..0000000
--- a/third_party/gofrontend/libgo/go/text/template/exec_test.go
+++ /dev/null
@@ -1,1143 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"errors"
-	"flag"
-	"fmt"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-var debug = flag.Bool("debug", false, "show the errors produced by the tests")
-
-// T has lots of interesting pieces to use to test execution.
-type T struct {
-	// Basics
-	True        bool
-	I           int
-	U16         uint16
-	X           string
-	FloatZero   float64
-	ComplexZero complex128
-	// Nested structs.
-	U *U
-	// Struct with String method.
-	V0     V
-	V1, V2 *V
-	// Struct with Error method.
-	W0     W
-	W1, W2 *W
-	// Slices
-	SI      []int
-	SIEmpty []int
-	SB      []bool
-	// Maps
-	MSI      map[string]int
-	MSIone   map[string]int // one element, for deterministic output
-	MSIEmpty map[string]int
-	MXI      map[interface{}]int
-	MII      map[int]int
-	SMSI     []map[string]int
-	// Empty interfaces; used to see if we can dig inside one.
-	Empty0 interface{} // nil
-	Empty1 interface{}
-	Empty2 interface{}
-	Empty3 interface{}
-	Empty4 interface{}
-	// Non-empty interface.
-	NonEmptyInterface I
-	// Stringer.
-	Str fmt.Stringer
-	Err error
-	// Pointers
-	PI  *int
-	PS  *string
-	PSI *[]int
-	NIL *int
-	// Function (not method)
-	BinaryFunc      func(string, string) string
-	VariadicFunc    func(...string) string
-	VariadicFuncInt func(int, ...string) string
-	NilOKFunc       func(*int) bool
-	ErrFunc         func() (string, error)
-	// Template to test evaluation of templates.
-	Tmpl *Template
-	// Unexported field; cannot be accessed by template.
-	unexported int
-}
-
-type U struct {
-	V string
-}
-
-type V struct {
-	j int
-}
-
-func (v *V) String() string {
-	if v == nil {
-		return "nilV"
-	}
-	return fmt.Sprintf("<%d>", v.j)
-}
-
-type W struct {
-	k int
-}
-
-func (w *W) Error() string {
-	if w == nil {
-		return "nilW"
-	}
-	return fmt.Sprintf("[%d]", w.k)
-}
-
-var tVal = &T{
-	True:   true,
-	I:      17,
-	U16:    16,
-	X:      "x",
-	U:      &U{"v"},
-	V0:     V{6666},
-	V1:     &V{7777}, // leave V2 as nil
-	W0:     W{888},
-	W1:     &W{999}, // leave W2 as nil
-	SI:     []int{3, 4, 5},
-	SB:     []bool{true, false},
-	MSI:    map[string]int{"one": 1, "two": 2, "three": 3},
-	MSIone: map[string]int{"one": 1},
-	MXI:    map[interface{}]int{"one": 1},
-	MII:    map[int]int{1: 1},
-	SMSI: []map[string]int{
-		{"one": 1, "two": 2},
-		{"eleven": 11, "twelve": 12},
-	},
-	Empty1:            3,
-	Empty2:            "empty2",
-	Empty3:            []int{7, 8},
-	Empty4:            &U{"UinEmpty"},
-	NonEmptyInterface: new(T),
-	Str:               bytes.NewBuffer([]byte("foozle")),
-	Err:               errors.New("erroozle"),
-	PI:                newInt(23),
-	PS:                newString("a string"),
-	PSI:               newIntSlice(21, 22, 23),
-	BinaryFunc:        func(a, b string) string { return fmt.Sprintf("[%s=%s]", a, b) },
-	VariadicFunc:      func(s ...string) string { return fmt.Sprint("<", strings.Join(s, "+"), ">") },
-	VariadicFuncInt:   func(a int, s ...string) string { return fmt.Sprint(a, "=<", strings.Join(s, "+"), ">") },
-	NilOKFunc:         func(s *int) bool { return s == nil },
-	ErrFunc:           func() (string, error) { return "bla", nil },
-	Tmpl:              Must(New("x").Parse("test template")), // "x" is the value of .X
-}
-
-// A non-empty interface.
-type I interface {
-	Method0() string
-}
-
-var iVal I = tVal
-
-// Helpers for creation.
-func newInt(n int) *int {
-	return &n
-}
-
-func newString(s string) *string {
-	return &s
-}
-
-func newIntSlice(n ...int) *[]int {
-	p := new([]int)
-	*p = make([]int, len(n))
-	copy(*p, n)
-	return p
-}
-
-// Simple methods with and without arguments.
-func (t *T) Method0() string {
-	return "M0"
-}
-
-func (t *T) Method1(a int) int {
-	return a
-}
-
-func (t *T) Method2(a uint16, b string) string {
-	return fmt.Sprintf("Method2: %d %s", a, b)
-}
-
-func (t *T) Method3(v interface{}) string {
-	return fmt.Sprintf("Method3: %v", v)
-}
-
-func (t *T) Copy() *T {
-	n := new(T)
-	*n = *t
-	return n
-}
-
-func (t *T) MAdd(a int, b []int) []int {
-	v := make([]int, len(b))
-	for i, x := range b {
-		v[i] = x + a
-	}
-	return v
-}
-
-var myError = errors.New("my error")
-
-// MyError returns a value and an error according to its argument.
-func (t *T) MyError(error bool) (bool, error) {
-	if error {
-		return true, myError
-	}
-	return false, nil
-}
-
-// A few methods to test chaining.
-func (t *T) GetU() *U {
-	return t.U
-}
-
-func (u *U) TrueFalse(b bool) string {
-	if b {
-		return "true"
-	}
-	return ""
-}
-
-func typeOf(arg interface{}) string {
-	return fmt.Sprintf("%T", arg)
-}
-
-type execTest struct {
-	name   string
-	input  string
-	output string
-	data   interface{}
-	ok     bool
-}
-
-// bigInt and bigUint are hex string representing numbers either side
-// of the max int boundary.
-// We do it this way so the test doesn't depend on ints being 32 bits.
-var (
-	bigInt  = fmt.Sprintf("0x%x", int(1<<uint(reflect.TypeOf(0).Bits()-1)-1))
-	bigUint = fmt.Sprintf("0x%x", uint(1<<uint(reflect.TypeOf(0).Bits()-1)))
-)
-
-var execTests = []execTest{
-	// Trivial cases.
-	{"empty", "", "", nil, true},
-	{"text", "some text", "some text", nil, true},
-	{"nil action", "{{nil}}", "", nil, false},
-
-	// Ideal constants.
-	{"ideal int", "{{typeOf 3}}", "int", 0, true},
-	{"ideal float", "{{typeOf 1.0}}", "float64", 0, true},
-	{"ideal exp float", "{{typeOf 1e1}}", "float64", 0, true},
-	{"ideal complex", "{{typeOf 1i}}", "complex128", 0, true},
-	{"ideal int", "{{typeOf " + bigInt + "}}", "int", 0, true},
-	{"ideal too big", "{{typeOf " + bigUint + "}}", "", 0, false},
-	{"ideal nil without type", "{{nil}}", "", 0, false},
-
-	// Fields of structs.
-	{".X", "-{{.X}}-", "-x-", tVal, true},
-	{".U.V", "-{{.U.V}}-", "-v-", tVal, true},
-	{".unexported", "{{.unexported}}", "", tVal, false},
-
-	// Fields on maps.
-	{"map .one", "{{.MSI.one}}", "1", tVal, true},
-	{"map .two", "{{.MSI.two}}", "2", tVal, true},
-	{"map .NO", "{{.MSI.NO}}", "<no value>", tVal, true},
-	{"map .one interface", "{{.MXI.one}}", "1", tVal, true},
-	{"map .WRONG args", "{{.MSI.one 1}}", "", tVal, false},
-	{"map .WRONG type", "{{.MII.one}}", "", tVal, false},
-
-	// Dots of all kinds to test basic evaluation.
-	{"dot int", "<{{.}}>", "<13>", 13, true},
-	{"dot uint", "<{{.}}>", "<14>", uint(14), true},
-	{"dot float", "<{{.}}>", "<15.1>", 15.1, true},
-	{"dot bool", "<{{.}}>", "<true>", true, true},
-	{"dot complex", "<{{.}}>", "<(16.2-17i)>", 16.2 - 17i, true},
-	{"dot string", "<{{.}}>", "<hello>", "hello", true},
-	{"dot slice", "<{{.}}>", "<[-1 -2 -3]>", []int{-1, -2, -3}, true},
-	{"dot map", "<{{.}}>", "<map[two:22]>", map[string]int{"two": 22}, true},
-	{"dot struct", "<{{.}}>", "<{7 seven}>", struct {
-		a int
-		b string
-	}{7, "seven"}, true},
-
-	// Variables.
-	{"$ int", "{{$}}", "123", 123, true},
-	{"$.I", "{{$.I}}", "17", tVal, true},
-	{"$.U.V", "{{$.U.V}}", "v", tVal, true},
-	{"declare in action", "{{$x := $.U.V}}{{$x}}", "v", tVal, true},
-
-	// Type with String method.
-	{"V{6666}.String()", "-{{.V0}}-", "-<6666>-", tVal, true},
-	{"&V{7777}.String()", "-{{.V1}}-", "-<7777>-", tVal, true},
-	{"(*V)(nil).String()", "-{{.V2}}-", "-nilV-", tVal, true},
-
-	// Type with Error method.
-	{"W{888}.Error()", "-{{.W0}}-", "-[888]-", tVal, true},
-	{"&W{999}.Error()", "-{{.W1}}-", "-[999]-", tVal, true},
-	{"(*W)(nil).Error()", "-{{.W2}}-", "-nilW-", tVal, true},
-
-	// Pointers.
-	{"*int", "{{.PI}}", "23", tVal, true},
-	{"*string", "{{.PS}}", "a string", tVal, true},
-	{"*[]int", "{{.PSI}}", "[21 22 23]", tVal, true},
-	{"*[]int[1]", "{{index .PSI 1}}", "22", tVal, true},
-	{"NIL", "{{.NIL}}", "<nil>", tVal, true},
-
-	// Empty interfaces holding values.
-	{"empty nil", "{{.Empty0}}", "<no value>", tVal, true},
-	{"empty with int", "{{.Empty1}}", "3", tVal, true},
-	{"empty with string", "{{.Empty2}}", "empty2", tVal, true},
-	{"empty with slice", "{{.Empty3}}", "[7 8]", tVal, true},
-	{"empty with struct", "{{.Empty4}}", "{UinEmpty}", tVal, true},
-	{"empty with struct, field", "{{.Empty4.V}}", "UinEmpty", tVal, true},
-
-	// Method calls.
-	{".Method0", "-{{.Method0}}-", "-M0-", tVal, true},
-	{".Method1(1234)", "-{{.Method1 1234}}-", "-1234-", tVal, true},
-	{".Method1(.I)", "-{{.Method1 .I}}-", "-17-", tVal, true},
-	{".Method2(3, .X)", "-{{.Method2 3 .X}}-", "-Method2: 3 x-", tVal, true},
-	{".Method2(.U16, `str`)", "-{{.Method2 .U16 `str`}}-", "-Method2: 16 str-", tVal, true},
-	{".Method2(.U16, $x)", "{{if $x := .X}}-{{.Method2 .U16 $x}}{{end}}-", "-Method2: 16 x-", tVal, true},
-	{".Method3(nil constant)", "-{{.Method3 nil}}-", "-Method3: <nil>-", tVal, true},
-	{".Method3(nil value)", "-{{.Method3 .MXI.unset}}-", "-Method3: <nil>-", tVal, true},
-	{"method on var", "{{if $x := .}}-{{$x.Method2 .U16 $x.X}}{{end}}-", "-Method2: 16 x-", tVal, true},
-	{"method on chained var",
-		"{{range .MSIone}}{{if $.U.TrueFalse $.True}}{{$.U.TrueFalse $.True}}{{else}}WRONG{{end}}{{end}}",
-		"true", tVal, true},
-	{"chained method",
-		"{{range .MSIone}}{{if $.GetU.TrueFalse $.True}}{{$.U.TrueFalse $.True}}{{else}}WRONG{{end}}{{end}}",
-		"true", tVal, true},
-	{"chained method on variable",
-		"{{with $x := .}}{{with .SI}}{{$.GetU.TrueFalse $.True}}{{end}}{{end}}",
-		"true", tVal, true},
-	{".NilOKFunc not nil", "{{call .NilOKFunc .PI}}", "false", tVal, true},
-	{".NilOKFunc nil", "{{call .NilOKFunc nil}}", "true", tVal, true},
-
-	// Function call builtin.
-	{".BinaryFunc", "{{call .BinaryFunc `1` `2`}}", "[1=2]", tVal, true},
-	{".VariadicFunc0", "{{call .VariadicFunc}}", "<>", tVal, true},
-	{".VariadicFunc2", "{{call .VariadicFunc `he` `llo`}}", "<he+llo>", tVal, true},
-	{".VariadicFuncInt", "{{call .VariadicFuncInt 33 `he` `llo`}}", "33=<he+llo>", tVal, true},
-	{"if .BinaryFunc call", "{{ if .BinaryFunc}}{{call .BinaryFunc `1` `2`}}{{end}}", "[1=2]", tVal, true},
-	{"if not .BinaryFunc call", "{{ if not .BinaryFunc}}{{call .BinaryFunc `1` `2`}}{{else}}No{{end}}", "No", tVal, true},
-	{"Interface Call", `{{stringer .S}}`, "foozle", map[string]interface{}{"S": bytes.NewBufferString("foozle")}, true},
-	{".ErrFunc", "{{call .ErrFunc}}", "bla", tVal, true},
-
-	// Erroneous function calls (check args).
-	{".BinaryFuncTooFew", "{{call .BinaryFunc `1`}}", "", tVal, false},
-	{".BinaryFuncTooMany", "{{call .BinaryFunc `1` `2` `3`}}", "", tVal, false},
-	{".BinaryFuncBad0", "{{call .BinaryFunc 1 3}}", "", tVal, false},
-	{".BinaryFuncBad1", "{{call .BinaryFunc `1` 3}}", "", tVal, false},
-	{".VariadicFuncBad0", "{{call .VariadicFunc 3}}", "", tVal, false},
-	{".VariadicFuncIntBad0", "{{call .VariadicFuncInt}}", "", tVal, false},
-	{".VariadicFuncIntBad`", "{{call .VariadicFuncInt `x`}}", "", tVal, false},
-	{".VariadicFuncNilBad", "{{call .VariadicFunc nil}}", "", tVal, false},
-
-	// Pipelines.
-	{"pipeline", "-{{.Method0 | .Method2 .U16}}-", "-Method2: 16 M0-", tVal, true},
-	{"pipeline func", "-{{call .VariadicFunc `llo` | call .VariadicFunc `he` }}-", "-<he+<llo>>-", tVal, true},
-
-	// Parenthesized expressions
-	{"parens in pipeline", "{{printf `%d %d %d` (1) (2 | add 3) (add 4 (add 5 6))}}", "1 5 15", tVal, true},
-
-	// Parenthesized expressions with field accesses
-	{"parens: $ in paren", "{{($).X}}", "x", tVal, true},
-	{"parens: $.GetU in paren", "{{($.GetU).V}}", "v", tVal, true},
-	{"parens: $ in paren in pipe", "{{($ | echo).X}}", "x", tVal, true},
-	{"parens: spaces and args", `{{(makemap "up" "down" "left" "right").left}}`, "right", tVal, true},
-
-	// If.
-	{"if true", "{{if true}}TRUE{{end}}", "TRUE", tVal, true},
-	{"if false", "{{if false}}TRUE{{else}}FALSE{{end}}", "FALSE", tVal, true},
-	{"if nil", "{{if nil}}TRUE{{end}}", "", tVal, false},
-	{"if 1", "{{if 1}}NON-ZERO{{else}}ZERO{{end}}", "NON-ZERO", tVal, true},
-	{"if 0", "{{if 0}}NON-ZERO{{else}}ZERO{{end}}", "ZERO", tVal, true},
-	{"if 1.5", "{{if 1.5}}NON-ZERO{{else}}ZERO{{end}}", "NON-ZERO", tVal, true},
-	{"if 0.0", "{{if .FloatZero}}NON-ZERO{{else}}ZERO{{end}}", "ZERO", tVal, true},
-	{"if 1.5i", "{{if 1.5i}}NON-ZERO{{else}}ZERO{{end}}", "NON-ZERO", tVal, true},
-	{"if 0.0i", "{{if .ComplexZero}}NON-ZERO{{else}}ZERO{{end}}", "ZERO", tVal, true},
-	{"if emptystring", "{{if ``}}NON-EMPTY{{else}}EMPTY{{end}}", "EMPTY", tVal, true},
-	{"if string", "{{if `notempty`}}NON-EMPTY{{else}}EMPTY{{end}}", "NON-EMPTY", tVal, true},
-	{"if emptyslice", "{{if .SIEmpty}}NON-EMPTY{{else}}EMPTY{{end}}", "EMPTY", tVal, true},
-	{"if slice", "{{if .SI}}NON-EMPTY{{else}}EMPTY{{end}}", "NON-EMPTY", tVal, true},
-	{"if emptymap", "{{if .MSIEmpty}}NON-EMPTY{{else}}EMPTY{{end}}", "EMPTY", tVal, true},
-	{"if map", "{{if .MSI}}NON-EMPTY{{else}}EMPTY{{end}}", "NON-EMPTY", tVal, true},
-	{"if map unset", "{{if .MXI.none}}NON-ZERO{{else}}ZERO{{end}}", "ZERO", tVal, true},
-	{"if map not unset", "{{if not .MXI.none}}ZERO{{else}}NON-ZERO{{end}}", "ZERO", tVal, true},
-	{"if $x with $y int", "{{if $x := true}}{{with $y := .I}}{{$x}},{{$y}}{{end}}{{end}}", "true,17", tVal, true},
-	{"if $x with $x int", "{{if $x := true}}{{with $x := .I}}{{$x}},{{end}}{{$x}}{{end}}", "17,true", tVal, true},
-	{"if else if", "{{if false}}FALSE{{else if true}}TRUE{{end}}", "TRUE", tVal, true},
-	{"if else chain", "{{if eq 1 3}}1{{else if eq 2 3}}2{{else if eq 3 3}}3{{end}}", "3", tVal, true},
-
-	// Print etc.
-	{"print", `{{print "hello, print"}}`, "hello, print", tVal, true},
-	{"print 123", `{{print 1 2 3}}`, "1 2 3", tVal, true},
-	{"print nil", `{{print nil}}`, "<nil>", tVal, true},
-	{"println", `{{println 1 2 3}}`, "1 2 3\n", tVal, true},
-	{"printf int", `{{printf "%04x" 127}}`, "007f", tVal, true},
-	{"printf float", `{{printf "%g" 3.5}}`, "3.5", tVal, true},
-	{"printf complex", `{{printf "%g" 1+7i}}`, "(1+7i)", tVal, true},
-	{"printf string", `{{printf "%s" "hello"}}`, "hello", tVal, true},
-	{"printf function", `{{printf "%#q" zeroArgs}}`, "`zeroArgs`", tVal, true},
-	{"printf field", `{{printf "%s" .U.V}}`, "v", tVal, true},
-	{"printf method", `{{printf "%s" .Method0}}`, "M0", tVal, true},
-	{"printf dot", `{{with .I}}{{printf "%d" .}}{{end}}`, "17", tVal, true},
-	{"printf var", `{{with $x := .I}}{{printf "%d" $x}}{{end}}`, "17", tVal, true},
-	{"printf lots", `{{printf "%d %s %g %s" 127 "hello" 7-3i .Method0}}`, "127 hello (7-3i) M0", tVal, true},
-
-	// HTML.
-	{"html", `{{html "<script>alert(\"XSS\");</script>"}}`,
-		"&lt;script&gt;alert(&#34;XSS&#34;);&lt;/script&gt;", nil, true},
-	{"html pipeline", `{{printf "<script>alert(\"XSS\");</script>" | html}}`,
-		"&lt;script&gt;alert(&#34;XSS&#34;);&lt;/script&gt;", nil, true},
-	{"html", `{{html .PS}}`, "a string", tVal, true},
-
-	// JavaScript.
-	{"js", `{{js .}}`, `It\'d be nice.`, `It'd be nice.`, true},
-
-	// URL query.
-	{"urlquery", `{{"http://www.example.org/"|urlquery}}`, "http%3A%2F%2Fwww.example.org%2F", nil, true},
-
-	// Booleans
-	{"not", "{{not true}} {{not false}}", "false true", nil, true},
-	{"and", "{{and false 0}} {{and 1 0}} {{and 0 true}} {{and 1 1}}", "false 0 0 1", nil, true},
-	{"or", "{{or 0 0}} {{or 1 0}} {{or 0 true}} {{or 1 1}}", "0 1 true 1", nil, true},
-	{"boolean if", "{{if and true 1 `hi`}}TRUE{{else}}FALSE{{end}}", "TRUE", tVal, true},
-	{"boolean if not", "{{if and true 1 `hi` | not}}TRUE{{else}}FALSE{{end}}", "FALSE", nil, true},
-
-	// Indexing.
-	{"slice[0]", "{{index .SI 0}}", "3", tVal, true},
-	{"slice[1]", "{{index .SI 1}}", "4", tVal, true},
-	{"slice[HUGE]", "{{index .SI 10}}", "", tVal, false},
-	{"slice[WRONG]", "{{index .SI `hello`}}", "", tVal, false},
-	{"map[one]", "{{index .MSI `one`}}", "1", tVal, true},
-	{"map[two]", "{{index .MSI `two`}}", "2", tVal, true},
-	{"map[NO]", "{{index .MSI `XXX`}}", "0", tVal, true},
-	{"map[nil]", "{{index .MSI nil}}", "0", tVal, true},
-	{"map[WRONG]", "{{index .MSI 10}}", "", tVal, false},
-	{"double index", "{{index .SMSI 1 `eleven`}}", "11", tVal, true},
-
-	// Len.
-	{"slice", "{{len .SI}}", "3", tVal, true},
-	{"map", "{{len .MSI }}", "3", tVal, true},
-	{"len of int", "{{len 3}}", "", tVal, false},
-	{"len of nothing", "{{len .Empty0}}", "", tVal, false},
-
-	// With.
-	{"with true", "{{with true}}{{.}}{{end}}", "true", tVal, true},
-	{"with false", "{{with false}}{{.}}{{else}}FALSE{{end}}", "FALSE", tVal, true},
-	{"with 1", "{{with 1}}{{.}}{{else}}ZERO{{end}}", "1", tVal, true},
-	{"with 0", "{{with 0}}{{.}}{{else}}ZERO{{end}}", "ZERO", tVal, true},
-	{"with 1.5", "{{with 1.5}}{{.}}{{else}}ZERO{{end}}", "1.5", tVal, true},
-	{"with 0.0", "{{with .FloatZero}}{{.}}{{else}}ZERO{{end}}", "ZERO", tVal, true},
-	{"with 1.5i", "{{with 1.5i}}{{.}}{{else}}ZERO{{end}}", "(0+1.5i)", tVal, true},
-	{"with 0.0i", "{{with .ComplexZero}}{{.}}{{else}}ZERO{{end}}", "ZERO", tVal, true},
-	{"with emptystring", "{{with ``}}{{.}}{{else}}EMPTY{{end}}", "EMPTY", tVal, true},
-	{"with string", "{{with `notempty`}}{{.}}{{else}}EMPTY{{end}}", "notempty", tVal, true},
-	{"with emptyslice", "{{with .SIEmpty}}{{.}}{{else}}EMPTY{{end}}", "EMPTY", tVal, true},
-	{"with slice", "{{with .SI}}{{.}}{{else}}EMPTY{{end}}", "[3 4 5]", tVal, true},
-	{"with emptymap", "{{with .MSIEmpty}}{{.}}{{else}}EMPTY{{end}}", "EMPTY", tVal, true},
-	{"with map", "{{with .MSIone}}{{.}}{{else}}EMPTY{{end}}", "map[one:1]", tVal, true},
-	{"with empty interface, struct field", "{{with .Empty4}}{{.V}}{{end}}", "UinEmpty", tVal, true},
-	{"with $x int", "{{with $x := .I}}{{$x}}{{end}}", "17", tVal, true},
-	{"with $x struct.U.V", "{{with $x := $}}{{$x.U.V}}{{end}}", "v", tVal, true},
-	{"with variable and action", "{{with $x := $}}{{$y := $.U.V}}{{$y}}{{end}}", "v", tVal, true},
-
-	// Range.
-	{"range []int", "{{range .SI}}-{{.}}-{{end}}", "-3--4--5-", tVal, true},
-	{"range empty no else", "{{range .SIEmpty}}-{{.}}-{{end}}", "", tVal, true},
-	{"range []int else", "{{range .SI}}-{{.}}-{{else}}EMPTY{{end}}", "-3--4--5-", tVal, true},
-	{"range empty else", "{{range .SIEmpty}}-{{.}}-{{else}}EMPTY{{end}}", "EMPTY", tVal, true},
-	{"range []bool", "{{range .SB}}-{{.}}-{{end}}", "-true--false-", tVal, true},
-	{"range []int method", "{{range .SI | .MAdd .I}}-{{.}}-{{end}}", "-20--21--22-", tVal, true},
-	{"range map", "{{range .MSI}}-{{.}}-{{end}}", "-1--3--2-", tVal, true},
-	{"range empty map no else", "{{range .MSIEmpty}}-{{.}}-{{end}}", "", tVal, true},
-	{"range map else", "{{range .MSI}}-{{.}}-{{else}}EMPTY{{end}}", "-1--3--2-", tVal, true},
-	{"range empty map else", "{{range .MSIEmpty}}-{{.}}-{{else}}EMPTY{{end}}", "EMPTY", tVal, true},
-	{"range empty interface", "{{range .Empty3}}-{{.}}-{{else}}EMPTY{{end}}", "-7--8-", tVal, true},
-	{"range empty nil", "{{range .Empty0}}-{{.}}-{{end}}", "", tVal, true},
-	{"range $x SI", "{{range $x := .SI}}<{{$x}}>{{end}}", "<3><4><5>", tVal, true},
-	{"range $x $y SI", "{{range $x, $y := .SI}}<{{$x}}={{$y}}>{{end}}", "<0=3><1=4><2=5>", tVal, true},
-	{"range $x MSIone", "{{range $x := .MSIone}}<{{$x}}>{{end}}", "<1>", tVal, true},
-	{"range $x $y MSIone", "{{range $x, $y := .MSIone}}<{{$x}}={{$y}}>{{end}}", "<one=1>", tVal, true},
-	{"range $x PSI", "{{range $x := .PSI}}<{{$x}}>{{end}}", "<21><22><23>", tVal, true},
-	{"declare in range", "{{range $x := .PSI}}<{{$foo:=$x}}{{$x}}>{{end}}", "<21><22><23>", tVal, true},
-	{"range count", `{{range $i, $x := count 5}}[{{$i}}]{{$x}}{{end}}`, "[0]a[1]b[2]c[3]d[4]e", tVal, true},
-	{"range nil count", `{{range $i, $x := count 0}}{{else}}empty{{end}}`, "empty", tVal, true},
-
-	// Cute examples.
-	{"or as if true", `{{or .SI "slice is empty"}}`, "[3 4 5]", tVal, true},
-	{"or as if false", `{{or .SIEmpty "slice is empty"}}`, "slice is empty", tVal, true},
-
-	// Error handling.
-	{"error method, error", "{{.MyError true}}", "", tVal, false},
-	{"error method, no error", "{{.MyError false}}", "false", tVal, true},
-
-	// Fixed bugs.
-	// Must separate dot and receiver; otherwise args are evaluated with dot set to variable.
-	{"bug0", "{{range .MSIone}}{{if $.Method1 .}}X{{end}}{{end}}", "X", tVal, true},
-	// Do not loop endlessly in indirect for non-empty interfaces.
-	// The bug appears with *interface only; looped forever.
-	{"bug1", "{{.Method0}}", "M0", &iVal, true},
-	// Was taking address of interface field, so method set was empty.
-	{"bug2", "{{$.NonEmptyInterface.Method0}}", "M0", tVal, true},
-	// Struct values were not legal in with - mere oversight.
-	{"bug3", "{{with $}}{{.Method0}}{{end}}", "M0", tVal, true},
-	// Nil interface values in if.
-	{"bug4", "{{if .Empty0}}non-nil{{else}}nil{{end}}", "nil", tVal, true},
-	// Stringer.
-	{"bug5", "{{.Str}}", "foozle", tVal, true},
-	{"bug5a", "{{.Err}}", "erroozle", tVal, true},
-	// Args need to be indirected and dereferenced sometimes.
-	{"bug6a", "{{vfunc .V0 .V1}}", "vfunc", tVal, true},
-	{"bug6b", "{{vfunc .V0 .V0}}", "vfunc", tVal, true},
-	{"bug6c", "{{vfunc .V1 .V0}}", "vfunc", tVal, true},
-	{"bug6d", "{{vfunc .V1 .V1}}", "vfunc", tVal, true},
-	// Legal parse but illegal execution: non-function should have no arguments.
-	{"bug7a", "{{3 2}}", "", tVal, false},
-	{"bug7b", "{{$x := 1}}{{$x 2}}", "", tVal, false},
-	{"bug7c", "{{$x := 1}}{{3 | $x}}", "", tVal, false},
-	// Pipelined arg was not being type-checked.
-	{"bug8a", "{{3|oneArg}}", "", tVal, false},
-	{"bug8b", "{{4|dddArg 3}}", "", tVal, false},
-	// A bug was introduced that broke map lookups for lower-case names.
-	{"bug9", "{{.cause}}", "neglect", map[string]string{"cause": "neglect"}, true},
-	// Field chain starting with function did not work.
-	{"bug10", "{{mapOfThree.three}}-{{(mapOfThree).three}}", "3-3", 0, true},
-	// Dereferencing nil pointer while evaluating function arguments should not panic. Issue 7333.
-	{"bug11", "{{valueString .PS}}", "", T{}, false},
-	// 0xef gave constant type float64. Issue 8622.
-	{"bug12xe", "{{printf `%T` 0xef}}", "int", T{}, true},
-	{"bug12xE", "{{printf `%T` 0xEE}}", "int", T{}, true},
-	{"bug12Xe", "{{printf `%T` 0Xef}}", "int", T{}, true},
-	{"bug12XE", "{{printf `%T` 0XEE}}", "int", T{}, true},
-	// Chained nodes did not work as arguments. Issue 8473.
-	{"bug13", "{{print (.Copy).I}}", "17", tVal, true},
-	// Didn't protect against nil or literal values in field chains.
-	{"bug14a", "{{(nil).True}}", "", tVal, false},
-	{"bug14b", "{{$x := nil}}{{$x.anything}}", "", tVal, false},
-	{"bug14c", `{{$x := (1.0)}}{{$y := ("hello")}}{{$x.anything}}{{$y.true}}`, "", tVal, false},
-	// Didn't call validateType on function results. Issue 10800.
-	{"bug15", "{{valueString returnInt}}", "", tVal, false},
-	// Variadic function corner cases. Issue 10946.
-	{"bug16a", "{{true|printf}}", "", tVal, false},
-	{"bug16b", "{{1|printf}}", "", tVal, false},
-	{"bug16c", "{{1.1|printf}}", "", tVal, false},
-	{"bug16d", "{{'x'|printf}}", "", tVal, false},
-	{"bug16e", "{{0i|printf}}", "", tVal, false},
-	{"bug16f", "{{true|twoArgs \"xxx\"}}", "", tVal, false},
-	{"bug16g", "{{\"aaa\" |twoArgs \"bbb\"}}", "twoArgs=bbbaaa", tVal, true},
-	{"bug16h", "{{1|oneArg}}", "", tVal, false},
-	{"bug16i", "{{\"aaa\"|oneArg}}", "oneArg=aaa", tVal, true},
-	{"bug16j", "{{1+2i|printf \"%v\"}}", "(1+2i)", tVal, true},
-	{"bug16k", "{{\"aaa\"|printf }}", "aaa", tVal, true},
-}
-
-func zeroArgs() string {
-	return "zeroArgs"
-}
-
-func oneArg(a string) string {
-	return "oneArg=" + a
-}
-
-func twoArgs(a, b string) string {
-	return "twoArgs=" + a + b
-}
-
-func dddArg(a int, b ...string) string {
-	return fmt.Sprintln(a, b)
-}
-
-// count returns a channel that will deliver n sequential 1-letter strings starting at "a"
-func count(n int) chan string {
-	if n == 0 {
-		return nil
-	}
-	c := make(chan string)
-	go func() {
-		for i := 0; i < n; i++ {
-			c <- "abcdefghijklmnop"[i : i+1]
-		}
-		close(c)
-	}()
-	return c
-}
-
-// vfunc takes a *V and a V
-func vfunc(V, *V) string {
-	return "vfunc"
-}
-
-// valueString takes a string, not a pointer.
-func valueString(v string) string {
-	return "value is ignored"
-}
-
-// returnInt returns an int
-func returnInt() int {
-	return 7
-}
-
-func add(args ...int) int {
-	sum := 0
-	for _, x := range args {
-		sum += x
-	}
-	return sum
-}
-
-func echo(arg interface{}) interface{} {
-	return arg
-}
-
-func makemap(arg ...string) map[string]string {
-	if len(arg)%2 != 0 {
-		panic("bad makemap")
-	}
-	m := make(map[string]string)
-	for i := 0; i < len(arg); i += 2 {
-		m[arg[i]] = arg[i+1]
-	}
-	return m
-}
-
-func stringer(s fmt.Stringer) string {
-	return s.String()
-}
-
-func mapOfThree() interface{} {
-	return map[string]int{"three": 3}
-}
-
-func testExecute(execTests []execTest, template *Template, t *testing.T) {
-	b := new(bytes.Buffer)
-	funcs := FuncMap{
-		"add":         add,
-		"count":       count,
-		"dddArg":      dddArg,
-		"echo":        echo,
-		"makemap":     makemap,
-		"mapOfThree":  mapOfThree,
-		"oneArg":      oneArg,
-		"returnInt":   returnInt,
-		"stringer":    stringer,
-		"twoArgs":     twoArgs,
-		"typeOf":      typeOf,
-		"valueString": valueString,
-		"vfunc":       vfunc,
-		"zeroArgs":    zeroArgs,
-	}
-	for _, test := range execTests {
-		var tmpl *Template
-		var err error
-		if template == nil {
-			tmpl, err = New(test.name).Funcs(funcs).Parse(test.input)
-		} else {
-			tmpl, err = template.New(test.name).Funcs(funcs).Parse(test.input)
-		}
-		if err != nil {
-			t.Errorf("%s: parse error: %s", test.name, err)
-			continue
-		}
-		b.Reset()
-		err = tmpl.Execute(b, test.data)
-		switch {
-		case !test.ok && err == nil:
-			t.Errorf("%s: expected error; got none", test.name)
-			continue
-		case test.ok && err != nil:
-			t.Errorf("%s: unexpected execute error: %s", test.name, err)
-			continue
-		case !test.ok && err != nil:
-			// expected error, got one
-			if *debug {
-				fmt.Printf("%s: %s\n\t%s\n", test.name, test.input, err)
-			}
-		}
-		result := b.String()
-		if result != test.output {
-			t.Errorf("%s: expected\n\t%q\ngot\n\t%q", test.name, test.output, result)
-		}
-	}
-}
-
-func TestExecute(t *testing.T) {
-	testExecute(execTests, nil, t)
-}
-
-var delimPairs = []string{
-	"", "", // default
-	"{{", "}}", // same as default
-	"<<", ">>", // distinct
-	"|", "|", // same
-	"(日)", "(本)", // peculiar
-}
-
-func TestDelims(t *testing.T) {
-	const hello = "Hello, world"
-	var value = struct{ Str string }{hello}
-	for i := 0; i < len(delimPairs); i += 2 {
-		text := ".Str"
-		left := delimPairs[i+0]
-		trueLeft := left
-		right := delimPairs[i+1]
-		trueRight := right
-		if left == "" { // default case
-			trueLeft = "{{"
-		}
-		if right == "" { // default case
-			trueRight = "}}"
-		}
-		text = trueLeft + text + trueRight
-		// Now add a comment
-		text += trueLeft + "/*comment*/" + trueRight
-		// Now add  an action containing a string.
-		text += trueLeft + `"` + trueLeft + `"` + trueRight
-		// At this point text looks like `{{.Str}}{{/*comment*/}}{{"{{"}}`.
-		tmpl, err := New("delims").Delims(left, right).Parse(text)
-		if err != nil {
-			t.Fatalf("delim %q text %q parse err %s", left, text, err)
-		}
-		var b = new(bytes.Buffer)
-		err = tmpl.Execute(b, value)
-		if err != nil {
-			t.Fatalf("delim %q exec err %s", left, err)
-		}
-		if b.String() != hello+trueLeft {
-			t.Errorf("expected %q got %q", hello+trueLeft, b.String())
-		}
-	}
-}
-
-// Check that an error from a method flows back to the top.
-func TestExecuteError(t *testing.T) {
-	b := new(bytes.Buffer)
-	tmpl := New("error")
-	_, err := tmpl.Parse("{{.MyError true}}")
-	if err != nil {
-		t.Fatalf("parse error: %s", err)
-	}
-	err = tmpl.Execute(b, tVal)
-	if err == nil {
-		t.Errorf("expected error; got none")
-	} else if !strings.Contains(err.Error(), myError.Error()) {
-		if *debug {
-			fmt.Printf("test execute error: %s\n", err)
-		}
-		t.Errorf("expected myError; got %s", err)
-	}
-}
-
-const execErrorText = `line 1
-line 2
-line 3
-{{template "one" .}}
-{{define "one"}}{{template "two" .}}{{end}}
-{{define "two"}}{{template "three" .}}{{end}}
-{{define "three"}}{{index "hi" $}}{{end}}`
-
-// Check that an error from a nested template contains all the relevant information.
-func TestExecError(t *testing.T) {
-	tmpl, err := New("top").Parse(execErrorText)
-	if err != nil {
-		t.Fatal("parse error:", err)
-	}
-	var b bytes.Buffer
-	err = tmpl.Execute(&b, 5) // 5 is out of range indexing "hi"
-	if err == nil {
-		t.Fatal("expected error")
-	}
-	const want = `template: top:7:20: executing "three" at <index "hi" $>: error calling index: index out of range: 5`
-	got := err.Error()
-	if got != want {
-		t.Errorf("expected\n%q\ngot\n%q", want, got)
-	}
-}
-
-func TestJSEscaping(t *testing.T) {
-	testCases := []struct {
-		in, exp string
-	}{
-		{`a`, `a`},
-		{`'foo`, `\'foo`},
-		{`Go "jump" \`, `Go \"jump\" \\`},
-		{`Yukihiro says "今日は世界"`, `Yukihiro says \"今日は世界\"`},
-		{"unprintable \uFDFF", `unprintable \uFDFF`},
-		{`<html>`, `\x3Chtml\x3E`},
-	}
-	for _, tc := range testCases {
-		s := JSEscapeString(tc.in)
-		if s != tc.exp {
-			t.Errorf("JS escaping [%s] got [%s] want [%s]", tc.in, s, tc.exp)
-		}
-	}
-}
-
-// A nice example: walk a binary tree.
-
-type Tree struct {
-	Val         int
-	Left, Right *Tree
-}
-
-// Use different delimiters to test Set.Delims.
-const treeTemplate = `
-	(define "tree")
-	[
-		(.Val)
-		(with .Left)
-			(template "tree" .)
-		(end)
-		(with .Right)
-			(template "tree" .)
-		(end)
-	]
-	(end)
-`
-
-func TestTree(t *testing.T) {
-	var tree = &Tree{
-		1,
-		&Tree{
-			2, &Tree{
-				3,
-				&Tree{
-					4, nil, nil,
-				},
-				nil,
-			},
-			&Tree{
-				5,
-				&Tree{
-					6, nil, nil,
-				},
-				nil,
-			},
-		},
-		&Tree{
-			7,
-			&Tree{
-				8,
-				&Tree{
-					9, nil, nil,
-				},
-				nil,
-			},
-			&Tree{
-				10,
-				&Tree{
-					11, nil, nil,
-				},
-				nil,
-			},
-		},
-	}
-	tmpl, err := New("root").Delims("(", ")").Parse(treeTemplate)
-	if err != nil {
-		t.Fatal("parse error:", err)
-	}
-	var b bytes.Buffer
-	stripSpace := func(r rune) rune {
-		if r == '\t' || r == '\n' {
-			return -1
-		}
-		return r
-	}
-	const expect = "[1[2[3[4]][5[6]]][7[8[9]][10[11]]]]"
-	// First by looking up the template.
-	err = tmpl.Lookup("tree").Execute(&b, tree)
-	if err != nil {
-		t.Fatal("exec error:", err)
-	}
-	result := strings.Map(stripSpace, b.String())
-	if result != expect {
-		t.Errorf("expected %q got %q", expect, result)
-	}
-	// Then direct to execution.
-	b.Reset()
-	err = tmpl.ExecuteTemplate(&b, "tree", tree)
-	if err != nil {
-		t.Fatal("exec error:", err)
-	}
-	result = strings.Map(stripSpace, b.String())
-	if result != expect {
-		t.Errorf("expected %q got %q", expect, result)
-	}
-}
-
-func TestExecuteOnNewTemplate(t *testing.T) {
-	// This is issue 3872.
-	New("Name").Templates()
-	// This is issue 11379.
-	new(Template).Templates()
-	new(Template).Parse("")
-	new(Template).New("abc").Parse("")
-	new(Template).Execute(nil, nil)                // returns an error (but does not crash)
-	new(Template).ExecuteTemplate(nil, "XXX", nil) // returns an error (but does not crash)
-}
-
-const testTemplates = `{{define "one"}}one{{end}}{{define "two"}}two{{end}}`
-
-func TestMessageForExecuteEmpty(t *testing.T) {
-	// Test a truly empty template.
-	tmpl := New("empty")
-	var b bytes.Buffer
-	err := tmpl.Execute(&b, 0)
-	if err == nil {
-		t.Fatal("expected initial error")
-	}
-	got := err.Error()
-	want := `template: empty: "empty" is an incomplete or empty template`
-	if got != want {
-		t.Errorf("expected error %s got %s", want, got)
-	}
-	// Add a non-empty template to check that the error is helpful.
-	tests, err := New("").Parse(testTemplates)
-	if err != nil {
-		t.Fatal(err)
-	}
-	tmpl.AddParseTree("secondary", tests.Tree)
-	err = tmpl.Execute(&b, 0)
-	if err == nil {
-		t.Fatal("expected second error")
-	}
-	got = err.Error()
-	want = `template: empty: "empty" is an incomplete or empty template; defined templates are: "secondary"`
-	if got != want {
-		t.Errorf("expected error %s got %s", want, got)
-	}
-	// Make sure we can execute the secondary.
-	err = tmpl.ExecuteTemplate(&b, "secondary", 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func TestFinalForPrintf(t *testing.T) {
-	tmpl, err := New("").Parse(`{{"x" | printf}}`)
-	if err != nil {
-		t.Fatal(err)
-	}
-	var b bytes.Buffer
-	err = tmpl.Execute(&b, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-type cmpTest struct {
-	expr  string
-	truth string
-	ok    bool
-}
-
-var cmpTests = []cmpTest{
-	{"eq true true", "true", true},
-	{"eq true false", "false", true},
-	{"eq 1+2i 1+2i", "true", true},
-	{"eq 1+2i 1+3i", "false", true},
-	{"eq 1.5 1.5", "true", true},
-	{"eq 1.5 2.5", "false", true},
-	{"eq 1 1", "true", true},
-	{"eq 1 2", "false", true},
-	{"eq `xy` `xy`", "true", true},
-	{"eq `xy` `xyz`", "false", true},
-	{"eq .Uthree .Uthree", "true", true},
-	{"eq .Uthree .Ufour", "false", true},
-	{"eq 3 4 5 6 3", "true", true},
-	{"eq 3 4 5 6 7", "false", true},
-	{"ne true true", "false", true},
-	{"ne true false", "true", true},
-	{"ne 1+2i 1+2i", "false", true},
-	{"ne 1+2i 1+3i", "true", true},
-	{"ne 1.5 1.5", "false", true},
-	{"ne 1.5 2.5", "true", true},
-	{"ne 1 1", "false", true},
-	{"ne 1 2", "true", true},
-	{"ne `xy` `xy`", "false", true},
-	{"ne `xy` `xyz`", "true", true},
-	{"ne .Uthree .Uthree", "false", true},
-	{"ne .Uthree .Ufour", "true", true},
-	{"lt 1.5 1.5", "false", true},
-	{"lt 1.5 2.5", "true", true},
-	{"lt 1 1", "false", true},
-	{"lt 1 2", "true", true},
-	{"lt `xy` `xy`", "false", true},
-	{"lt `xy` `xyz`", "true", true},
-	{"lt .Uthree .Uthree", "false", true},
-	{"lt .Uthree .Ufour", "true", true},
-	{"le 1.5 1.5", "true", true},
-	{"le 1.5 2.5", "true", true},
-	{"le 2.5 1.5", "false", true},
-	{"le 1 1", "true", true},
-	{"le 1 2", "true", true},
-	{"le 2 1", "false", true},
-	{"le `xy` `xy`", "true", true},
-	{"le `xy` `xyz`", "true", true},
-	{"le `xyz` `xy`", "false", true},
-	{"le .Uthree .Uthree", "true", true},
-	{"le .Uthree .Ufour", "true", true},
-	{"le .Ufour .Uthree", "false", true},
-	{"gt 1.5 1.5", "false", true},
-	{"gt 1.5 2.5", "false", true},
-	{"gt 1 1", "false", true},
-	{"gt 2 1", "true", true},
-	{"gt 1 2", "false", true},
-	{"gt `xy` `xy`", "false", true},
-	{"gt `xy` `xyz`", "false", true},
-	{"gt .Uthree .Uthree", "false", true},
-	{"gt .Uthree .Ufour", "false", true},
-	{"gt .Ufour .Uthree", "true", true},
-	{"ge 1.5 1.5", "true", true},
-	{"ge 1.5 2.5", "false", true},
-	{"ge 2.5 1.5", "true", true},
-	{"ge 1 1", "true", true},
-	{"ge 1 2", "false", true},
-	{"ge 2 1", "true", true},
-	{"ge `xy` `xy`", "true", true},
-	{"ge `xy` `xyz`", "false", true},
-	{"ge `xyz` `xy`", "true", true},
-	{"ge .Uthree .Uthree", "true", true},
-	{"ge .Uthree .Ufour", "false", true},
-	{"ge .Ufour .Uthree", "true", true},
-	// Mixing signed and unsigned integers.
-	{"eq .Uthree .Three", "true", true},
-	{"eq .Three .Uthree", "true", true},
-	{"le .Uthree .Three", "true", true},
-	{"le .Three .Uthree", "true", true},
-	{"ge .Uthree .Three", "true", true},
-	{"ge .Three .Uthree", "true", true},
-	{"lt .Uthree .Three", "false", true},
-	{"lt .Three .Uthree", "false", true},
-	{"gt .Uthree .Three", "false", true},
-	{"gt .Three .Uthree", "false", true},
-	{"eq .Ufour .Three", "false", true},
-	{"lt .Ufour .Three", "false", true},
-	{"gt .Ufour .Three", "true", true},
-	{"eq .NegOne .Uthree", "false", true},
-	{"eq .Uthree .NegOne", "false", true},
-	{"ne .NegOne .Uthree", "true", true},
-	{"ne .Uthree .NegOne", "true", true},
-	{"lt .NegOne .Uthree", "true", true},
-	{"lt .Uthree .NegOne", "false", true},
-	{"le .NegOne .Uthree", "true", true},
-	{"le .Uthree .NegOne", "false", true},
-	{"gt .NegOne .Uthree", "false", true},
-	{"gt .Uthree .NegOne", "true", true},
-	{"ge .NegOne .Uthree", "false", true},
-	{"ge .Uthree .NegOne", "true", true},
-	{"eq (index `x` 0) 'x'", "true", true}, // The example that triggered this rule.
-	{"eq (index `x` 0) 'y'", "false", true},
-	// Errors
-	{"eq `xy` 1", "", false},    // Different types.
-	{"eq 2 2.0", "", false},     // Different types.
-	{"lt true true", "", false}, // Unordered types.
-	{"lt 1+0i 1+0i", "", false}, // Unordered types.
-}
-
-func TestComparison(t *testing.T) {
-	b := new(bytes.Buffer)
-	var cmpStruct = struct {
-		Uthree, Ufour uint
-		NegOne, Three int
-	}{3, 4, -1, 3}
-	for _, test := range cmpTests {
-		text := fmt.Sprintf("{{if %s}}true{{else}}false{{end}}", test.expr)
-		tmpl, err := New("empty").Parse(text)
-		if err != nil {
-			t.Fatalf("%q: %s", test.expr, err)
-		}
-		b.Reset()
-		err = tmpl.Execute(b, &cmpStruct)
-		if test.ok && err != nil {
-			t.Errorf("%s errored incorrectly: %s", test.expr, err)
-			continue
-		}
-		if !test.ok && err == nil {
-			t.Errorf("%s did not error", test.expr)
-			continue
-		}
-		if b.String() != test.truth {
-			t.Errorf("%s: want %s; got %s", test.expr, test.truth, b.String())
-		}
-	}
-}
-
-func TestMissingMapKey(t *testing.T) {
-	data := map[string]int{
-		"x": 99,
-	}
-	tmpl, err := New("t1").Parse("{{.x}} {{.y}}")
-	if err != nil {
-		t.Fatal(err)
-	}
-	var b bytes.Buffer
-	// By default, just get "<no value>"
-	err = tmpl.Execute(&b, data)
-	if err != nil {
-		t.Fatal(err)
-	}
-	want := "99 <no value>"
-	got := b.String()
-	if got != want {
-		t.Errorf("got %q; expected %q", got, want)
-	}
-	// Same if we set the option explicitly to the default.
-	tmpl.Option("missingkey=default")
-	b.Reset()
-	err = tmpl.Execute(&b, data)
-	if err != nil {
-		t.Fatal("default:", err)
-	}
-	want = "99 <no value>"
-	got = b.String()
-	if got != want {
-		t.Errorf("got %q; expected %q", got, want)
-	}
-	// Next we ask for a zero value
-	tmpl.Option("missingkey=zero")
-	b.Reset()
-	err = tmpl.Execute(&b, data)
-	if err != nil {
-		t.Fatal("zero:", err)
-	}
-	want = "99 0"
-	got = b.String()
-	if got != want {
-		t.Errorf("got %q; expected %q", got, want)
-	}
-	// Now we ask for an error.
-	tmpl.Option("missingkey=error")
-	err = tmpl.Execute(&b, data)
-	if err == nil {
-		t.Errorf("expected error; got none")
-	}
-}
-
-// Test that the error message for multiline unterminated string
-// refers to the line number of the opening quote.
-func TestUnterminatedStringError(t *testing.T) {
-	_, err := New("X").Parse("hello\n\n{{`unterminated\n\n\n\n}}\n some more\n\n")
-	if err == nil {
-		t.Fatal("expected error")
-	}
-	str := err.Error()
-	if !strings.Contains(str, "X:3: unexpected unterminated raw quoted strin") {
-		t.Fatalf("unexpected error: %s", str)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/text/template/funcs.go b/third_party/gofrontend/libgo/go/text/template/funcs.go
deleted file mode 100644
index ccd0dfc..0000000
--- a/third_party/gofrontend/libgo/go/text/template/funcs.go
+++ /dev/null
@@ -1,600 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"io"
-	"net/url"
-	"reflect"
-	"strings"
-	"unicode"
-	"unicode/utf8"
-)
-
-// FuncMap is the type of the map defining the mapping from names to functions.
-// Each function must have either a single return value, or two return values of
-// which the second has type error. In that case, if the second (error)
-// return value evaluates to non-nil during execution, execution terminates and
-// Execute returns that error.
-type FuncMap map[string]interface{}
-
-var builtins = FuncMap{
-	"and":      and,
-	"call":     call,
-	"html":     HTMLEscaper,
-	"index":    index,
-	"js":       JSEscaper,
-	"len":      length,
-	"not":      not,
-	"or":       or,
-	"print":    fmt.Sprint,
-	"printf":   fmt.Sprintf,
-	"println":  fmt.Sprintln,
-	"urlquery": URLQueryEscaper,
-
-	// Comparisons
-	"eq": eq, // ==
-	"ge": ge, // >=
-	"gt": gt, // >
-	"le": le, // <=
-	"lt": lt, // <
-	"ne": ne, // !=
-}
-
-var builtinFuncs = createValueFuncs(builtins)
-
-// createValueFuncs turns a FuncMap into a map[string]reflect.Value
-func createValueFuncs(funcMap FuncMap) map[string]reflect.Value {
-	m := make(map[string]reflect.Value)
-	addValueFuncs(m, funcMap)
-	return m
-}
-
-// addValueFuncs adds to values the functions in funcs, converting them to reflect.Values.
-func addValueFuncs(out map[string]reflect.Value, in FuncMap) {
-	for name, fn := range in {
-		v := reflect.ValueOf(fn)
-		if v.Kind() != reflect.Func {
-			panic("value for " + name + " not a function")
-		}
-		if !goodFunc(v.Type()) {
-			panic(fmt.Errorf("can't install method/function %q with %d results", name, v.Type().NumOut()))
-		}
-		out[name] = v
-	}
-}
-
-// addFuncs adds to values the functions in funcs. It does no checking of the input -
-// call addValueFuncs first.
-func addFuncs(out, in FuncMap) {
-	for name, fn := range in {
-		out[name] = fn
-	}
-}
-
-// goodFunc checks that the function or method has the right result signature.
-func goodFunc(typ reflect.Type) bool {
-	// We allow functions with 1 result or 2 results where the second is an error.
-	switch {
-	case typ.NumOut() == 1:
-		return true
-	case typ.NumOut() == 2 && typ.Out(1) == errorType:
-		return true
-	}
-	return false
-}
-
-// findFunction looks for a function in the template, and global map.
-func findFunction(name string, tmpl *Template) (reflect.Value, bool) {
-	if tmpl != nil && tmpl.common != nil {
-		tmpl.muFuncs.RLock()
-		defer tmpl.muFuncs.RUnlock()
-		if fn := tmpl.execFuncs[name]; fn.IsValid() {
-			return fn, true
-		}
-	}
-	if fn := builtinFuncs[name]; fn.IsValid() {
-		return fn, true
-	}
-	return reflect.Value{}, false
-}
-
-// Indexing.
-
-// index returns the result of indexing its first argument by the following
-// arguments.  Thus "index x 1 2 3" is, in Go syntax, x[1][2][3]. Each
-// indexed item must be a map, slice, or array.
-func index(item interface{}, indices ...interface{}) (interface{}, error) {
-	v := reflect.ValueOf(item)
-	for _, i := range indices {
-		index := reflect.ValueOf(i)
-		var isNil bool
-		if v, isNil = indirect(v); isNil {
-			return nil, fmt.Errorf("index of nil pointer")
-		}
-		switch v.Kind() {
-		case reflect.Array, reflect.Slice, reflect.String:
-			var x int64
-			switch index.Kind() {
-			case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-				x = index.Int()
-			case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-				x = int64(index.Uint())
-			default:
-				return nil, fmt.Errorf("cannot index slice/array with type %s", index.Type())
-			}
-			if x < 0 || x >= int64(v.Len()) {
-				return nil, fmt.Errorf("index out of range: %d", x)
-			}
-			v = v.Index(int(x))
-		case reflect.Map:
-			if !index.IsValid() {
-				index = reflect.Zero(v.Type().Key())
-			}
-			if !index.Type().AssignableTo(v.Type().Key()) {
-				return nil, fmt.Errorf("%s is not index type for %s", index.Type(), v.Type())
-			}
-			if x := v.MapIndex(index); x.IsValid() {
-				v = x
-			} else {
-				v = reflect.Zero(v.Type().Elem())
-			}
-		default:
-			return nil, fmt.Errorf("can't index item of type %s", v.Type())
-		}
-	}
-	return v.Interface(), nil
-}
-
-// Length
-
-// length returns the length of the item, with an error if it has no defined length.
-func length(item interface{}) (int, error) {
-	v, isNil := indirect(reflect.ValueOf(item))
-	if isNil {
-		return 0, fmt.Errorf("len of nil pointer")
-	}
-	switch v.Kind() {
-	case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String:
-		return v.Len(), nil
-	}
-	return 0, fmt.Errorf("len of type %s", v.Type())
-}
-
-// Function invocation
-
-// call returns the result of evaluating the first argument as a function.
-// The function must return 1 result, or 2 results, the second of which is an error.
-func call(fn interface{}, args ...interface{}) (interface{}, error) {
-	v := reflect.ValueOf(fn)
-	typ := v.Type()
-	if typ.Kind() != reflect.Func {
-		return nil, fmt.Errorf("non-function of type %s", typ)
-	}
-	if !goodFunc(typ) {
-		return nil, fmt.Errorf("function called with %d args; should be 1 or 2", typ.NumOut())
-	}
-	numIn := typ.NumIn()
-	var dddType reflect.Type
-	if typ.IsVariadic() {
-		if len(args) < numIn-1 {
-			return nil, fmt.Errorf("wrong number of args: got %d want at least %d", len(args), numIn-1)
-		}
-		dddType = typ.In(numIn - 1).Elem()
-	} else {
-		if len(args) != numIn {
-			return nil, fmt.Errorf("wrong number of args: got %d want %d", len(args), numIn)
-		}
-	}
-	argv := make([]reflect.Value, len(args))
-	for i, arg := range args {
-		value := reflect.ValueOf(arg)
-		// Compute the expected type. Clumsy because of variadics.
-		var argType reflect.Type
-		if !typ.IsVariadic() || i < numIn-1 {
-			argType = typ.In(i)
-		} else {
-			argType = dddType
-		}
-		if !value.IsValid() && canBeNil(argType) {
-			value = reflect.Zero(argType)
-		}
-		if !value.Type().AssignableTo(argType) {
-			return nil, fmt.Errorf("arg %d has type %s; should be %s", i, value.Type(), argType)
-		}
-		argv[i] = value
-	}
-	result := v.Call(argv)
-	if len(result) == 2 && !result[1].IsNil() {
-		return result[0].Interface(), result[1].Interface().(error)
-	}
-	return result[0].Interface(), nil
-}
-
-// Boolean logic.
-
-func truth(a interface{}) bool {
-	t, _ := isTrue(reflect.ValueOf(a))
-	return t
-}
-
-// and computes the Boolean AND of its arguments, returning
-// the first false argument it encounters, or the last argument.
-func and(arg0 interface{}, args ...interface{}) interface{} {
-	if !truth(arg0) {
-		return arg0
-	}
-	for i := range args {
-		arg0 = args[i]
-		if !truth(arg0) {
-			break
-		}
-	}
-	return arg0
-}
-
-// or computes the Boolean OR of its arguments, returning
-// the first true argument it encounters, or the last argument.
-func or(arg0 interface{}, args ...interface{}) interface{} {
-	if truth(arg0) {
-		return arg0
-	}
-	for i := range args {
-		arg0 = args[i]
-		if truth(arg0) {
-			break
-		}
-	}
-	return arg0
-}
-
-// not returns the Boolean negation of its argument.
-func not(arg interface{}) (truth bool) {
-	truth, _ = isTrue(reflect.ValueOf(arg))
-	return !truth
-}
-
-// Comparison.
-
-// TODO: Perhaps allow comparison between signed and unsigned integers.
-
-var (
-	errBadComparisonType = errors.New("invalid type for comparison")
-	errBadComparison     = errors.New("incompatible types for comparison")
-	errNoComparison      = errors.New("missing argument for comparison")
-)
-
-type kind int
-
-const (
-	invalidKind kind = iota
-	boolKind
-	complexKind
-	intKind
-	floatKind
-	integerKind
-	stringKind
-	uintKind
-)
-
-func basicKind(v reflect.Value) (kind, error) {
-	switch v.Kind() {
-	case reflect.Bool:
-		return boolKind, nil
-	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		return intKind, nil
-	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-		return uintKind, nil
-	case reflect.Float32, reflect.Float64:
-		return floatKind, nil
-	case reflect.Complex64, reflect.Complex128:
-		return complexKind, nil
-	case reflect.String:
-		return stringKind, nil
-	}
-	return invalidKind, errBadComparisonType
-}
-
-// eq evaluates the comparison a == b || a == c || ...
-func eq(arg1 interface{}, arg2 ...interface{}) (bool, error) {
-	v1 := reflect.ValueOf(arg1)
-	k1, err := basicKind(v1)
-	if err != nil {
-		return false, err
-	}
-	if len(arg2) == 0 {
-		return false, errNoComparison
-	}
-	for _, arg := range arg2 {
-		v2 := reflect.ValueOf(arg)
-		k2, err := basicKind(v2)
-		if err != nil {
-			return false, err
-		}
-		truth := false
-		if k1 != k2 {
-			// Special case: Can compare integer values regardless of type's sign.
-			switch {
-			case k1 == intKind && k2 == uintKind:
-				truth = v1.Int() >= 0 && uint64(v1.Int()) == v2.Uint()
-			case k1 == uintKind && k2 == intKind:
-				truth = v2.Int() >= 0 && v1.Uint() == uint64(v2.Int())
-			default:
-				return false, errBadComparison
-			}
-		} else {
-			switch k1 {
-			case boolKind:
-				truth = v1.Bool() == v2.Bool()
-			case complexKind:
-				truth = v1.Complex() == v2.Complex()
-			case floatKind:
-				truth = v1.Float() == v2.Float()
-			case intKind:
-				truth = v1.Int() == v2.Int()
-			case stringKind:
-				truth = v1.String() == v2.String()
-			case uintKind:
-				truth = v1.Uint() == v2.Uint()
-			default:
-				panic("invalid kind")
-			}
-		}
-		if truth {
-			return true, nil
-		}
-	}
-	return false, nil
-}
-
-// ne evaluates the comparison a != b.
-func ne(arg1, arg2 interface{}) (bool, error) {
-	// != is the inverse of ==.
-	equal, err := eq(arg1, arg2)
-	return !equal, err
-}
-
-// lt evaluates the comparison a < b.
-func lt(arg1, arg2 interface{}) (bool, error) {
-	v1 := reflect.ValueOf(arg1)
-	k1, err := basicKind(v1)
-	if err != nil {
-		return false, err
-	}
-	v2 := reflect.ValueOf(arg2)
-	k2, err := basicKind(v2)
-	if err != nil {
-		return false, err
-	}
-	truth := false
-	if k1 != k2 {
-		// Special case: Can compare integer values regardless of type's sign.
-		switch {
-		case k1 == intKind && k2 == uintKind:
-			truth = v1.Int() < 0 || uint64(v1.Int()) < v2.Uint()
-		case k1 == uintKind && k2 == intKind:
-			truth = v2.Int() >= 0 && v1.Uint() < uint64(v2.Int())
-		default:
-			return false, errBadComparison
-		}
-	} else {
-		switch k1 {
-		case boolKind, complexKind:
-			return false, errBadComparisonType
-		case floatKind:
-			truth = v1.Float() < v2.Float()
-		case intKind:
-			truth = v1.Int() < v2.Int()
-		case stringKind:
-			truth = v1.String() < v2.String()
-		case uintKind:
-			truth = v1.Uint() < v2.Uint()
-		default:
-			panic("invalid kind")
-		}
-	}
-	return truth, nil
-}
-
-// le evaluates the comparison <= b.
-func le(arg1, arg2 interface{}) (bool, error) {
-	// <= is < or ==.
-	lessThan, err := lt(arg1, arg2)
-	if lessThan || err != nil {
-		return lessThan, err
-	}
-	return eq(arg1, arg2)
-}
-
-// gt evaluates the comparison a > b.
-func gt(arg1, arg2 interface{}) (bool, error) {
-	// > is the inverse of <=.
-	lessOrEqual, err := le(arg1, arg2)
-	if err != nil {
-		return false, err
-	}
-	return !lessOrEqual, nil
-}
-
-// ge evaluates the comparison a >= b.
-func ge(arg1, arg2 interface{}) (bool, error) {
-	// >= is the inverse of <.
-	lessThan, err := lt(arg1, arg2)
-	if err != nil {
-		return false, err
-	}
-	return !lessThan, nil
-}
-
-// HTML escaping.
-
-var (
-	htmlQuot = []byte("&#34;") // shorter than "&quot;"
-	htmlApos = []byte("&#39;") // shorter than "&apos;" and apos was not in HTML until HTML5
-	htmlAmp  = []byte("&amp;")
-	htmlLt   = []byte("&lt;")
-	htmlGt   = []byte("&gt;")
-)
-
-// HTMLEscape writes to w the escaped HTML equivalent of the plain text data b.
-func HTMLEscape(w io.Writer, b []byte) {
-	last := 0
-	for i, c := range b {
-		var html []byte
-		switch c {
-		case '"':
-			html = htmlQuot
-		case '\'':
-			html = htmlApos
-		case '&':
-			html = htmlAmp
-		case '<':
-			html = htmlLt
-		case '>':
-			html = htmlGt
-		default:
-			continue
-		}
-		w.Write(b[last:i])
-		w.Write(html)
-		last = i + 1
-	}
-	w.Write(b[last:])
-}
-
-// HTMLEscapeString returns the escaped HTML equivalent of the plain text data s.
-func HTMLEscapeString(s string) string {
-	// Avoid allocation if we can.
-	if strings.IndexAny(s, `'"&<>`) < 0 {
-		return s
-	}
-	var b bytes.Buffer
-	HTMLEscape(&b, []byte(s))
-	return b.String()
-}
-
-// HTMLEscaper returns the escaped HTML equivalent of the textual
-// representation of its arguments.
-func HTMLEscaper(args ...interface{}) string {
-	return HTMLEscapeString(evalArgs(args))
-}
-
-// JavaScript escaping.
-
-var (
-	jsLowUni = []byte(`\u00`)
-	hex      = []byte("0123456789ABCDEF")
-
-	jsBackslash = []byte(`\\`)
-	jsApos      = []byte(`\'`)
-	jsQuot      = []byte(`\"`)
-	jsLt        = []byte(`\x3C`)
-	jsGt        = []byte(`\x3E`)
-)
-
-// JSEscape writes to w the escaped JavaScript equivalent of the plain text data b.
-func JSEscape(w io.Writer, b []byte) {
-	last := 0
-	for i := 0; i < len(b); i++ {
-		c := b[i]
-
-		if !jsIsSpecial(rune(c)) {
-			// fast path: nothing to do
-			continue
-		}
-		w.Write(b[last:i])
-
-		if c < utf8.RuneSelf {
-			// Quotes, slashes and angle brackets get quoted.
-			// Control characters get written as \u00XX.
-			switch c {
-			case '\\':
-				w.Write(jsBackslash)
-			case '\'':
-				w.Write(jsApos)
-			case '"':
-				w.Write(jsQuot)
-			case '<':
-				w.Write(jsLt)
-			case '>':
-				w.Write(jsGt)
-			default:
-				w.Write(jsLowUni)
-				t, b := c>>4, c&0x0f
-				w.Write(hex[t : t+1])
-				w.Write(hex[b : b+1])
-			}
-		} else {
-			// Unicode rune.
-			r, size := utf8.DecodeRune(b[i:])
-			if unicode.IsPrint(r) {
-				w.Write(b[i : i+size])
-			} else {
-				fmt.Fprintf(w, "\\u%04X", r)
-			}
-			i += size - 1
-		}
-		last = i + 1
-	}
-	w.Write(b[last:])
-}
-
-// JSEscapeString returns the escaped JavaScript equivalent of the plain text data s.
-func JSEscapeString(s string) string {
-	// Avoid allocation if we can.
-	if strings.IndexFunc(s, jsIsSpecial) < 0 {
-		return s
-	}
-	var b bytes.Buffer
-	JSEscape(&b, []byte(s))
-	return b.String()
-}
-
-func jsIsSpecial(r rune) bool {
-	switch r {
-	case '\\', '\'', '"', '<', '>':
-		return true
-	}
-	return r < ' ' || utf8.RuneSelf <= r
-}
-
-// JSEscaper returns the escaped JavaScript equivalent of the textual
-// representation of its arguments.
-func JSEscaper(args ...interface{}) string {
-	return JSEscapeString(evalArgs(args))
-}
-
-// URLQueryEscaper returns the escaped value of the textual representation of
-// its arguments in a form suitable for embedding in a URL query.
-func URLQueryEscaper(args ...interface{}) string {
-	return url.QueryEscape(evalArgs(args))
-}
-
-// evalArgs formats the list of arguments into a string. It is therefore equivalent to
-//	fmt.Sprint(args...)
-// except that each argument is indirected (if a pointer), as required,
-// using the same rules as the default string evaluation during template
-// execution.
-func evalArgs(args []interface{}) string {
-	ok := false
-	var s string
-	// Fast path for simple common case.
-	if len(args) == 1 {
-		s, ok = args[0].(string)
-	}
-	if !ok {
-		for i, arg := range args {
-			a, ok := printableValue(reflect.ValueOf(arg))
-			if ok {
-				args[i] = a
-			} // else let fmt do its thing
-		}
-		s = fmt.Sprint(args...)
-	}
-	return s
-}
diff --git a/third_party/gofrontend/libgo/go/text/template/helper.go b/third_party/gofrontend/libgo/go/text/template/helper.go
deleted file mode 100644
index 787ca62..0000000
--- a/third_party/gofrontend/libgo/go/text/template/helper.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Helper functions to make constructing templates easier.
-
-package template
-
-import (
-	"fmt"
-	"io/ioutil"
-	"path/filepath"
-)
-
-// Functions and methods to parse templates.
-
-// Must is a helper that wraps a call to a function returning (*Template, error)
-// and panics if the error is non-nil. It is intended for use in variable
-// initializations such as
-//	var t = template.Must(template.New("name").Parse("text"))
-func Must(t *Template, err error) *Template {
-	if err != nil {
-		panic(err)
-	}
-	return t
-}
-
-// ParseFiles creates a new Template and parses the template definitions from
-// the named files. The returned template's name will have the base name and
-// parsed contents of the first file. There must be at least one file.
-// If an error occurs, parsing stops and the returned *Template is nil.
-func ParseFiles(filenames ...string) (*Template, error) {
-	return parseFiles(nil, filenames...)
-}
-
-// ParseFiles parses the named files and associates the resulting templates with
-// t. If an error occurs, parsing stops and the returned template is nil;
-// otherwise it is t. There must be at least one file.
-// Since the templates created by ParseFiles are named by the base
-// names of the argument files, t should usually have the name of one
-// of the (base) names of the files. If it does not, depending on t's
-// contents before calling ParseFiles, t.Execute may fail. In that
-// case use t.ExecuteTemplate to execute a valid template.
-func (t *Template) ParseFiles(filenames ...string) (*Template, error) {
-	t.init()
-	return parseFiles(t, filenames...)
-}
-
-// parseFiles is the helper for the method and function. If the argument
-// template is nil, it is created from the first file.
-func parseFiles(t *Template, filenames ...string) (*Template, error) {
-	if len(filenames) == 0 {
-		// Not really a problem, but be consistent.
-		return nil, fmt.Errorf("template: no files named in call to ParseFiles")
-	}
-	for _, filename := range filenames {
-		b, err := ioutil.ReadFile(filename)
-		if err != nil {
-			return nil, err
-		}
-		s := string(b)
-		name := filepath.Base(filename)
-		// First template becomes return value if not already defined,
-		// and we use that one for subsequent New calls to associate
-		// all the templates together. Also, if this file has the same name
-		// as t, this file becomes the contents of t, so
-		//  t, err := New(name).Funcs(xxx).ParseFiles(name)
-		// works. Otherwise we create a new template associated with t.
-		var tmpl *Template
-		if t == nil {
-			t = New(name)
-		}
-		if name == t.Name() {
-			tmpl = t
-		} else {
-			tmpl = t.New(name)
-		}
-		_, err = tmpl.Parse(s)
-		if err != nil {
-			return nil, err
-		}
-	}
-	return t, nil
-}
-
-// ParseGlob creates a new Template and parses the template definitions from the
-// files identified by the pattern, which must match at least one file. The
-// returned template will have the (base) name and (parsed) contents of the
-// first file matched by the pattern. ParseGlob is equivalent to calling
-// ParseFiles with the list of files matched by the pattern.
-func ParseGlob(pattern string) (*Template, error) {
-	return parseGlob(nil, pattern)
-}
-
-// ParseGlob parses the template definitions in the files identified by the
-// pattern and associates the resulting templates with t. The pattern is
-// processed by filepath.Glob and must match at least one file. ParseGlob is
-// equivalent to calling t.ParseFiles with the list of files matched by the
-// pattern.
-func (t *Template) ParseGlob(pattern string) (*Template, error) {
-	t.init()
-	return parseGlob(t, pattern)
-}
-
-// parseGlob is the implementation of the function and method ParseGlob.
-func parseGlob(t *Template, pattern string) (*Template, error) {
-	filenames, err := filepath.Glob(pattern)
-	if err != nil {
-		return nil, err
-	}
-	if len(filenames) == 0 {
-		return nil, fmt.Errorf("template: pattern matches no files: %#q", pattern)
-	}
-	return parseFiles(t, filenames...)
-}
diff --git a/third_party/gofrontend/libgo/go/text/template/multi_test.go b/third_party/gofrontend/libgo/go/text/template/multi_test.go
deleted file mode 100644
index ea01875..0000000
--- a/third_party/gofrontend/libgo/go/text/template/multi_test.go
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-// Tests for mulitple-template parsing and execution.
-
-import (
-	"bytes"
-	"fmt"
-	"strings"
-	"testing"
-	"text/template/parse"
-)
-
-const (
-	noError  = true
-	hasError = false
-)
-
-type multiParseTest struct {
-	name    string
-	input   string
-	ok      bool
-	names   []string
-	results []string
-}
-
-var multiParseTests = []multiParseTest{
-	{"empty", "", noError,
-		nil,
-		nil},
-	{"one", `{{define "foo"}} FOO {{end}}`, noError,
-		[]string{"foo"},
-		[]string{" FOO "}},
-	{"two", `{{define "foo"}} FOO {{end}}{{define "bar"}} BAR {{end}}`, noError,
-		[]string{"foo", "bar"},
-		[]string{" FOO ", " BAR "}},
-	// errors
-	{"missing end", `{{define "foo"}} FOO `, hasError,
-		nil,
-		nil},
-	{"malformed name", `{{define "foo}} FOO `, hasError,
-		nil,
-		nil},
-}
-
-func TestMultiParse(t *testing.T) {
-	for _, test := range multiParseTests {
-		template, err := New("root").Parse(test.input)
-		switch {
-		case err == nil && !test.ok:
-			t.Errorf("%q: expected error; got none", test.name)
-			continue
-		case err != nil && test.ok:
-			t.Errorf("%q: unexpected error: %v", test.name, err)
-			continue
-		case err != nil && !test.ok:
-			// expected error, got one
-			if *debug {
-				fmt.Printf("%s: %s\n\t%s\n", test.name, test.input, err)
-			}
-			continue
-		}
-		if template == nil {
-			continue
-		}
-		if len(template.tmpl) != len(test.names)+1 { // +1 for root
-			t.Errorf("%s: wrong number of templates; wanted %d got %d", test.name, len(test.names), len(template.tmpl))
-			continue
-		}
-		for i, name := range test.names {
-			tmpl, ok := template.tmpl[name]
-			if !ok {
-				t.Errorf("%s: can't find template %q", test.name, name)
-				continue
-			}
-			result := tmpl.Root.String()
-			if result != test.results[i] {
-				t.Errorf("%s=(%q): got\n\t%v\nexpected\n\t%v", test.name, test.input, result, test.results[i])
-			}
-		}
-	}
-}
-
-var multiExecTests = []execTest{
-	{"empty", "", "", nil, true},
-	{"text", "some text", "some text", nil, true},
-	{"invoke x", `{{template "x" .SI}}`, "TEXT", tVal, true},
-	{"invoke x no args", `{{template "x"}}`, "TEXT", tVal, true},
-	{"invoke dot int", `{{template "dot" .I}}`, "17", tVal, true},
-	{"invoke dot []int", `{{template "dot" .SI}}`, "[3 4 5]", tVal, true},
-	{"invoke dotV", `{{template "dotV" .U}}`, "v", tVal, true},
-	{"invoke nested int", `{{template "nested" .I}}`, "17", tVal, true},
-	{"variable declared by template", `{{template "nested" $x:=.SI}},{{index $x 1}}`, "[3 4 5],4", tVal, true},
-
-	// User-defined function: test argument evaluator.
-	{"testFunc literal", `{{oneArg "joe"}}`, "oneArg=joe", tVal, true},
-	{"testFunc .", `{{oneArg .}}`, "oneArg=joe", "joe", true},
-}
-
-// These strings are also in testdata/*.
-const multiText1 = `
-	{{define "x"}}TEXT{{end}}
-	{{define "dotV"}}{{.V}}{{end}}
-`
-
-const multiText2 = `
-	{{define "dot"}}{{.}}{{end}}
-	{{define "nested"}}{{template "dot" .}}{{end}}
-`
-
-func TestMultiExecute(t *testing.T) {
-	// Declare a couple of templates first.
-	template, err := New("root").Parse(multiText1)
-	if err != nil {
-		t.Fatalf("parse error for 1: %s", err)
-	}
-	_, err = template.Parse(multiText2)
-	if err != nil {
-		t.Fatalf("parse error for 2: %s", err)
-	}
-	testExecute(multiExecTests, template, t)
-}
-
-func TestParseFiles(t *testing.T) {
-	_, err := ParseFiles("DOES NOT EXIST")
-	if err == nil {
-		t.Error("expected error for non-existent file; got none")
-	}
-	template := New("root")
-	_, err = template.ParseFiles("testdata/file1.tmpl", "testdata/file2.tmpl")
-	if err != nil {
-		t.Fatalf("error parsing files: %v", err)
-	}
-	testExecute(multiExecTests, template, t)
-}
-
-func TestParseGlob(t *testing.T) {
-	_, err := ParseGlob("DOES NOT EXIST")
-	if err == nil {
-		t.Error("expected error for non-existent file; got none")
-	}
-	_, err = New("error").ParseGlob("[x")
-	if err == nil {
-		t.Error("expected error for bad pattern; got none")
-	}
-	template := New("root")
-	_, err = template.ParseGlob("testdata/file*.tmpl")
-	if err != nil {
-		t.Fatalf("error parsing files: %v", err)
-	}
-	testExecute(multiExecTests, template, t)
-}
-
-// In these tests, actual content (not just template definitions) comes from the parsed files.
-
-var templateFileExecTests = []execTest{
-	{"test", `{{template "tmpl1.tmpl"}}{{template "tmpl2.tmpl"}}`, "template1\n\ny\ntemplate2\n\nx\n", 0, true},
-}
-
-func TestParseFilesWithData(t *testing.T) {
-	template, err := New("root").ParseFiles("testdata/tmpl1.tmpl", "testdata/tmpl2.tmpl")
-	if err != nil {
-		t.Fatalf("error parsing files: %v", err)
-	}
-	testExecute(templateFileExecTests, template, t)
-}
-
-func TestParseGlobWithData(t *testing.T) {
-	template, err := New("root").ParseGlob("testdata/tmpl*.tmpl")
-	if err != nil {
-		t.Fatalf("error parsing files: %v", err)
-	}
-	testExecute(templateFileExecTests, template, t)
-}
-
-const (
-	cloneText1 = `{{define "a"}}{{template "b"}}{{template "c"}}{{end}}`
-	cloneText2 = `{{define "b"}}b{{end}}`
-	cloneText3 = `{{define "c"}}root{{end}}`
-	cloneText4 = `{{define "c"}}clone{{end}}`
-)
-
-func TestClone(t *testing.T) {
-	// Create some templates and clone the root.
-	root, err := New("root").Parse(cloneText1)
-	if err != nil {
-		t.Fatal(err)
-	}
-	_, err = root.Parse(cloneText2)
-	if err != nil {
-		t.Fatal(err)
-	}
-	clone := Must(root.Clone())
-	// Add variants to both.
-	_, err = root.Parse(cloneText3)
-	if err != nil {
-		t.Fatal(err)
-	}
-	_, err = clone.Parse(cloneText4)
-	if err != nil {
-		t.Fatal(err)
-	}
-	// Verify that the clone is self-consistent.
-	for k, v := range clone.tmpl {
-		if k == clone.name && v.tmpl[k] != clone {
-			t.Error("clone does not contain root")
-		}
-		if v != v.tmpl[v.name] {
-			t.Errorf("clone does not contain self for %q", k)
-		}
-	}
-	// Execute root.
-	var b bytes.Buffer
-	err = root.ExecuteTemplate(&b, "a", 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if b.String() != "broot" {
-		t.Errorf("expected %q got %q", "broot", b.String())
-	}
-	// Execute copy.
-	b.Reset()
-	err = clone.ExecuteTemplate(&b, "a", 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if b.String() != "bclone" {
-		t.Errorf("expected %q got %q", "bclone", b.String())
-	}
-}
-
-func TestAddParseTree(t *testing.T) {
-	// Create some templates.
-	root, err := New("root").Parse(cloneText1)
-	if err != nil {
-		t.Fatal(err)
-	}
-	_, err = root.Parse(cloneText2)
-	if err != nil {
-		t.Fatal(err)
-	}
-	// Add a new parse tree.
-	tree, err := parse.Parse("cloneText3", cloneText3, "", "", nil, builtins)
-	if err != nil {
-		t.Fatal(err)
-	}
-	added, err := root.AddParseTree("c", tree["c"])
-	// Execute.
-	var b bytes.Buffer
-	err = added.ExecuteTemplate(&b, "a", 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if b.String() != "broot" {
-		t.Errorf("expected %q got %q", "broot", b.String())
-	}
-}
-
-// Issue 7032
-func TestAddParseTreeToUnparsedTemplate(t *testing.T) {
-	master := "{{define \"master\"}}{{end}}"
-	tmpl := New("master")
-	tree, err := parse.Parse("master", master, "", "", nil)
-	if err != nil {
-		t.Fatalf("unexpected parse err: %v", err)
-	}
-	masterTree := tree["master"]
-	tmpl.AddParseTree("master", masterTree) // used to panic
-}
-
-func TestRedefinition(t *testing.T) {
-	var tmpl *Template
-	var err error
-	if tmpl, err = New("tmpl1").Parse(`{{define "test"}}foo{{end}}`); err != nil {
-		t.Fatalf("parse 1: %v", err)
-	}
-	if _, err = tmpl.Parse(`{{define "test"}}bar{{end}}`); err == nil {
-		t.Fatal("expected error")
-	}
-	if !strings.Contains(err.Error(), "redefinition") {
-		t.Fatalf("expected redefinition error; got %v", err)
-	}
-	if _, err = tmpl.New("tmpl2").Parse(`{{define "test"}}bar{{end}}`); err == nil {
-		t.Fatal("expected error")
-	}
-	if !strings.Contains(err.Error(), "redefinition") {
-		t.Fatalf("expected redefinition error; got %v", err)
-	}
-}
-
-// Issue 10879
-func TestEmptyTemplateCloneCrash(t *testing.T) {
-	t1 := New("base")
-	t1.Clone() // used to panic
-}
-
-// Issue 10910, 10926
-func TestTemplateLookUp(t *testing.T) {
-	t1 := New("foo")
-	if t1.Lookup("foo") != nil {
-		t.Error("Lookup returned non-nil value for undefined template foo")
-	}
-	t1.New("bar")
-	if t1.Lookup("bar") != nil {
-		t.Error("Lookup returned non-nil value for undefined template bar")
-	}
-	t1.Parse(`{{define "foo"}}test{{end}}`)
-	if t1.Lookup("foo") == nil {
-		t.Error("Lookup returned nil value for defined template")
-	}
-}
-
-func TestNew(t *testing.T) {
-	// template with same name already exists
-	t1, _ := New("test").Parse(`{{define "test"}}foo{{end}}`)
-	t2 := t1.New("test")
-
-	if t1.common != t2.common {
-		t.Errorf("t1 & t2 didn't share common struct; got %v != %v", t1.common, t2.common)
-	}
-	if t1.Tree == nil {
-		t.Error("defined template got nil Tree")
-	}
-	if t2.Tree != nil {
-		t.Error("undefined template got non-nil Tree")
-	}
-
-	containsT1 := false
-	for _, tmpl := range t1.Templates() {
-		if tmpl == t2 {
-			t.Error("Templates included undefined template")
-		}
-		if tmpl == t1 {
-			containsT1 = true
-		}
-	}
-	if !containsT1 {
-		t.Error("Templates didn't include defined template")
-	}
-}
-
-func TestParse(t *testing.T) {
-	// In multiple calls to Parse with the same receiver template, only one call
-	// can contain text other than space, comments, and template definitions
-	var err error
-	t1 := New("test")
-	if _, err := t1.Parse(`{{define "test"}}{{end}}`); err != nil {
-		t.Fatalf("parsing test: %s", err)
-	}
-	if _, err := t1.Parse(`{{define "test"}}{{/* this is a comment */}}{{end}}`); err != nil {
-		t.Fatalf("parsing test: %s", err)
-	}
-	if _, err := t1.Parse(`{{define "test"}}foo{{end}}`); err != nil {
-		t.Fatalf("parsing test: %s", err)
-	}
-	if _, err = t1.Parse(`{{define "test"}}foo{{end}}`); err == nil {
-		t.Fatal("no error from redefining a template")
-	}
-	if !strings.Contains(err.Error(), "redefinition") {
-		t.Fatalf("expected redefinition error; got %v", err)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/text/template/option.go b/third_party/gofrontend/libgo/go/text/template/option.go
deleted file mode 100644
index addce2d..0000000
--- a/third_party/gofrontend/libgo/go/text/template/option.go
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains the code to handle template options.
-
-package template
-
-import "strings"
-
-// missingKeyAction defines how to respond to indexing a map with a key that is not present.
-type missingKeyAction int
-
-const (
-	mapInvalid   missingKeyAction = iota // Return an invalid reflect.Value.
-	mapZeroValue                         // Return the zero value for the map element.
-	mapError                             // Error out
-)
-
-type option struct {
-	missingKey missingKeyAction
-}
-
-// Option sets options for the template. Options are described by
-// strings, either a simple string or "key=value". There can be at
-// most one equals sign in an option string. If the option string
-// is unrecognized or otherwise invalid, Option panics.
-//
-// Known options:
-//
-// missingkey: Control the behavior during execution if a map is
-// indexed with a key that is not present in the map.
-//	"missingkey=default" or "missingkey=invalid"
-//		The default behavior: Do nothing and continue execution.
-//		If printed, the result of the index operation is the string
-//		"<no value>".
-//	"missingkey=zero"
-//		The operation returns the zero value for the map type's element.
-//	"missingkey=error"
-//		Execution stops immediately with an error.
-//
-func (t *Template) Option(opt ...string) *Template {
-	t.init()
-	for _, s := range opt {
-		t.setOption(s)
-	}
-	return t
-}
-
-func (t *Template) setOption(opt string) {
-	if opt == "" {
-		panic("empty option string")
-	}
-	elems := strings.Split(opt, "=")
-	switch len(elems) {
-	case 2:
-		// key=value
-		switch elems[0] {
-		case "missingkey":
-			switch elems[1] {
-			case "invalid", "default":
-				t.option.missingKey = mapInvalid
-				return
-			case "zero":
-				t.option.missingKey = mapZeroValue
-				return
-			case "error":
-				t.option.missingKey = mapError
-				return
-			}
-		}
-	}
-	panic("unrecognized option: " + opt)
-}
diff --git a/third_party/gofrontend/libgo/go/text/template/parse/lex.go b/third_party/gofrontend/libgo/go/text/template/parse/lex.go
deleted file mode 100644
index 8f9fe1d..0000000
--- a/third_party/gofrontend/libgo/go/text/template/parse/lex.go
+++ /dev/null
@@ -1,558 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package parse
-
-import (
-	"fmt"
-	"strings"
-	"unicode"
-	"unicode/utf8"
-)
-
-// item represents a token or text string returned from the scanner.
-type item struct {
-	typ itemType // The type of this item.
-	pos Pos      // The starting position, in bytes, of this item in the input string.
-	val string   // The value of this item.
-}
-
-func (i item) String() string {
-	switch {
-	case i.typ == itemEOF:
-		return "EOF"
-	case i.typ == itemError:
-		return i.val
-	case i.typ > itemKeyword:
-		return fmt.Sprintf("<%s>", i.val)
-	case len(i.val) > 10:
-		return fmt.Sprintf("%.10q...", i.val)
-	}
-	return fmt.Sprintf("%q", i.val)
-}
-
-// itemType identifies the type of lex items.
-type itemType int
-
-const (
-	itemError        itemType = iota // error occurred; value is text of error
-	itemBool                         // boolean constant
-	itemChar                         // printable ASCII character; grab bag for comma etc.
-	itemCharConstant                 // character constant
-	itemComplex                      // complex constant (1+2i); imaginary is just a number
-	itemColonEquals                  // colon-equals (':=') introducing a declaration
-	itemEOF
-	itemField      // alphanumeric identifier starting with '.'
-	itemIdentifier // alphanumeric identifier not starting with '.'
-	itemLeftDelim  // left action delimiter
-	itemLeftParen  // '(' inside action
-	itemNumber     // simple number, including imaginary
-	itemPipe       // pipe symbol
-	itemRawString  // raw quoted string (includes quotes)
-	itemRightDelim // right action delimiter
-	itemRightParen // ')' inside action
-	itemSpace      // run of spaces separating arguments
-	itemString     // quoted string (includes quotes)
-	itemText       // plain text
-	itemVariable   // variable starting with '$', such as '$' or  '$1' or '$hello'
-	// Keywords appear after all the rest.
-	itemKeyword  // used only to delimit the keywords
-	itemDot      // the cursor, spelled '.'
-	itemDefine   // define keyword
-	itemElse     // else keyword
-	itemEnd      // end keyword
-	itemIf       // if keyword
-	itemNil      // the untyped nil constant, easiest to treat as a keyword
-	itemRange    // range keyword
-	itemTemplate // template keyword
-	itemWith     // with keyword
-)
-
-var key = map[string]itemType{
-	".":        itemDot,
-	"define":   itemDefine,
-	"else":     itemElse,
-	"end":      itemEnd,
-	"if":       itemIf,
-	"range":    itemRange,
-	"nil":      itemNil,
-	"template": itemTemplate,
-	"with":     itemWith,
-}
-
-const eof = -1
-
-// stateFn represents the state of the scanner as a function that returns the next state.
-type stateFn func(*lexer) stateFn
-
-// lexer holds the state of the scanner.
-type lexer struct {
-	name       string    // the name of the input; used only for error reports
-	input      string    // the string being scanned
-	leftDelim  string    // start of action
-	rightDelim string    // end of action
-	state      stateFn   // the next lexing function to enter
-	pos        Pos       // current position in the input
-	start      Pos       // start position of this item
-	width      Pos       // width of last rune read from input
-	lastPos    Pos       // position of most recent item returned by nextItem
-	items      chan item // channel of scanned items
-	parenDepth int       // nesting depth of ( ) exprs
-}
-
-// next returns the next rune in the input.
-func (l *lexer) next() rune {
-	if int(l.pos) >= len(l.input) {
-		l.width = 0
-		return eof
-	}
-	r, w := utf8.DecodeRuneInString(l.input[l.pos:])
-	l.width = Pos(w)
-	l.pos += l.width
-	return r
-}
-
-// peek returns but does not consume the next rune in the input.
-func (l *lexer) peek() rune {
-	r := l.next()
-	l.backup()
-	return r
-}
-
-// backup steps back one rune. Can only be called once per call of next.
-func (l *lexer) backup() {
-	l.pos -= l.width
-}
-
-// emit passes an item back to the client.
-func (l *lexer) emit(t itemType) {
-	l.items <- item{t, l.start, l.input[l.start:l.pos]}
-	l.start = l.pos
-}
-
-// ignore skips over the pending input before this point.
-func (l *lexer) ignore() {
-	l.start = l.pos
-}
-
-// accept consumes the next rune if it's from the valid set.
-func (l *lexer) accept(valid string) bool {
-	if strings.IndexRune(valid, l.next()) >= 0 {
-		return true
-	}
-	l.backup()
-	return false
-}
-
-// acceptRun consumes a run of runes from the valid set.
-func (l *lexer) acceptRun(valid string) {
-	for strings.IndexRune(valid, l.next()) >= 0 {
-	}
-	l.backup()
-}
-
-// lineNumber reports which line we're on, based on the position of
-// the previous item returned by nextItem. Doing it this way
-// means we don't have to worry about peek double counting.
-func (l *lexer) lineNumber() int {
-	return 1 + strings.Count(l.input[:l.lastPos], "\n")
-}
-
-// errorf returns an error token and terminates the scan by passing
-// back a nil pointer that will be the next state, terminating l.nextItem.
-func (l *lexer) errorf(format string, args ...interface{}) stateFn {
-	l.items <- item{itemError, l.start, fmt.Sprintf(format, args...)}
-	return nil
-}
-
-// nextItem returns the next item from the input.
-// Called by the parser, not in the lexing goroutine.
-func (l *lexer) nextItem() item {
-	item := <-l.items
-	l.lastPos = item.pos
-	return item
-}
-
-// drain drains the output so the lexing goroutine will exit.
-// Called by the parser, not in the lexing goroutine.
-func (l *lexer) drain() {
-	for range l.items {
-	}
-}
-
-// lex creates a new scanner for the input string.
-func lex(name, input, left, right string) *lexer {
-	if left == "" {
-		left = leftDelim
-	}
-	if right == "" {
-		right = rightDelim
-	}
-	l := &lexer{
-		name:       name,
-		input:      input,
-		leftDelim:  left,
-		rightDelim: right,
-		items:      make(chan item),
-	}
-	go l.run()
-	return l
-}
-
-// run runs the state machine for the lexer.
-func (l *lexer) run() {
-	for l.state = lexText; l.state != nil; {
-		l.state = l.state(l)
-	}
-	close(l.items)
-}
-
-// state functions
-
-const (
-	leftDelim    = "{{"
-	rightDelim   = "}}"
-	leftComment  = "/*"
-	rightComment = "*/"
-)
-
-// lexText scans until an opening action delimiter, "{{".
-func lexText(l *lexer) stateFn {
-	for {
-		if strings.HasPrefix(l.input[l.pos:], l.leftDelim) {
-			if l.pos > l.start {
-				l.emit(itemText)
-			}
-			return lexLeftDelim
-		}
-		if l.next() == eof {
-			break
-		}
-	}
-	// Correctly reached EOF.
-	if l.pos > l.start {
-		l.emit(itemText)
-	}
-	l.emit(itemEOF)
-	return nil
-}
-
-// lexLeftDelim scans the left delimiter, which is known to be present.
-func lexLeftDelim(l *lexer) stateFn {
-	l.pos += Pos(len(l.leftDelim))
-	if strings.HasPrefix(l.input[l.pos:], leftComment) {
-		return lexComment
-	}
-	l.emit(itemLeftDelim)
-	l.parenDepth = 0
-	return lexInsideAction
-}
-
-// lexComment scans a comment. The left comment marker is known to be present.
-func lexComment(l *lexer) stateFn {
-	l.pos += Pos(len(leftComment))
-	i := strings.Index(l.input[l.pos:], rightComment)
-	if i < 0 {
-		return l.errorf("unclosed comment")
-	}
-	l.pos += Pos(i + len(rightComment))
-	if !strings.HasPrefix(l.input[l.pos:], l.rightDelim) {
-		return l.errorf("comment ends before closing delimiter")
-
-	}
-	l.pos += Pos(len(l.rightDelim))
-	l.ignore()
-	return lexText
-}
-
-// lexRightDelim scans the right delimiter, which is known to be present.
-func lexRightDelim(l *lexer) stateFn {
-	l.pos += Pos(len(l.rightDelim))
-	l.emit(itemRightDelim)
-	return lexText
-}
-
-// lexInsideAction scans the elements inside action delimiters.
-func lexInsideAction(l *lexer) stateFn {
-	// Either number, quoted string, or identifier.
-	// Spaces separate arguments; runs of spaces turn into itemSpace.
-	// Pipe symbols separate and are emitted.
-	if strings.HasPrefix(l.input[l.pos:], l.rightDelim) {
-		if l.parenDepth == 0 {
-			return lexRightDelim
-		}
-		return l.errorf("unclosed left paren")
-	}
-	switch r := l.next(); {
-	case r == eof || isEndOfLine(r):
-		return l.errorf("unclosed action")
-	case isSpace(r):
-		return lexSpace
-	case r == ':':
-		if l.next() != '=' {
-			return l.errorf("expected :=")
-		}
-		l.emit(itemColonEquals)
-	case r == '|':
-		l.emit(itemPipe)
-	case r == '"':
-		return lexQuote
-	case r == '`':
-		return lexRawQuote
-	case r == '$':
-		return lexVariable
-	case r == '\'':
-		return lexChar
-	case r == '.':
-		// special look-ahead for ".field" so we don't break l.backup().
-		if l.pos < Pos(len(l.input)) {
-			r := l.input[l.pos]
-			if r < '0' || '9' < r {
-				return lexField
-			}
-		}
-		fallthrough // '.' can start a number.
-	case r == '+' || r == '-' || ('0' <= r && r <= '9'):
-		l.backup()
-		return lexNumber
-	case isAlphaNumeric(r):
-		l.backup()
-		return lexIdentifier
-	case r == '(':
-		l.emit(itemLeftParen)
-		l.parenDepth++
-	case r == ')':
-		l.emit(itemRightParen)
-		l.parenDepth--
-		if l.parenDepth < 0 {
-			return l.errorf("unexpected right paren %#U", r)
-		}
-	case r <= unicode.MaxASCII && unicode.IsPrint(r):
-		l.emit(itemChar)
-		return lexInsideAction
-	default:
-		return l.errorf("unrecognized character in action: %#U", r)
-	}
-	return lexInsideAction
-}
-
-// lexSpace scans a run of space characters.
-// One space has already been seen.
-func lexSpace(l *lexer) stateFn {
-	for isSpace(l.peek()) {
-		l.next()
-	}
-	l.emit(itemSpace)
-	return lexInsideAction
-}
-
-// lexIdentifier scans an alphanumeric.
-func lexIdentifier(l *lexer) stateFn {
-Loop:
-	for {
-		switch r := l.next(); {
-		case isAlphaNumeric(r):
-			// absorb.
-		default:
-			l.backup()
-			word := l.input[l.start:l.pos]
-			if !l.atTerminator() {
-				return l.errorf("bad character %#U", r)
-			}
-			switch {
-			case key[word] > itemKeyword:
-				l.emit(key[word])
-			case word[0] == '.':
-				l.emit(itemField)
-			case word == "true", word == "false":
-				l.emit(itemBool)
-			default:
-				l.emit(itemIdentifier)
-			}
-			break Loop
-		}
-	}
-	return lexInsideAction
-}
-
-// lexField scans a field: .Alphanumeric.
-// The . has been scanned.
-func lexField(l *lexer) stateFn {
-	return lexFieldOrVariable(l, itemField)
-}
-
-// lexVariable scans a Variable: $Alphanumeric.
-// The $ has been scanned.
-func lexVariable(l *lexer) stateFn {
-	if l.atTerminator() { // Nothing interesting follows -> "$".
-		l.emit(itemVariable)
-		return lexInsideAction
-	}
-	return lexFieldOrVariable(l, itemVariable)
-}
-
-// lexVariable scans a field or variable: [.$]Alphanumeric.
-// The . or $ has been scanned.
-func lexFieldOrVariable(l *lexer, typ itemType) stateFn {
-	if l.atTerminator() { // Nothing interesting follows -> "." or "$".
-		if typ == itemVariable {
-			l.emit(itemVariable)
-		} else {
-			l.emit(itemDot)
-		}
-		return lexInsideAction
-	}
-	var r rune
-	for {
-		r = l.next()
-		if !isAlphaNumeric(r) {
-			l.backup()
-			break
-		}
-	}
-	if !l.atTerminator() {
-		return l.errorf("bad character %#U", r)
-	}
-	l.emit(typ)
-	return lexInsideAction
-}
-
-// atTerminator reports whether the input is at valid termination character to
-// appear after an identifier. Breaks .X.Y into two pieces. Also catches cases
-// like "$x+2" not being acceptable without a space, in case we decide one
-// day to implement arithmetic.
-func (l *lexer) atTerminator() bool {
-	r := l.peek()
-	if isSpace(r) || isEndOfLine(r) {
-		return true
-	}
-	switch r {
-	case eof, '.', ',', '|', ':', ')', '(':
-		return true
-	}
-	// Does r start the delimiter? This can be ambiguous (with delim=="//", $x/2 will
-	// succeed but should fail) but only in extremely rare cases caused by willfully
-	// bad choice of delimiter.
-	if rd, _ := utf8.DecodeRuneInString(l.rightDelim); rd == r {
-		return true
-	}
-	return false
-}
-
-// lexChar scans a character constant. The initial quote is already
-// scanned. Syntax checking is done by the parser.
-func lexChar(l *lexer) stateFn {
-Loop:
-	for {
-		switch l.next() {
-		case '\\':
-			if r := l.next(); r != eof && r != '\n' {
-				break
-			}
-			fallthrough
-		case eof, '\n':
-			return l.errorf("unterminated character constant")
-		case '\'':
-			break Loop
-		}
-	}
-	l.emit(itemCharConstant)
-	return lexInsideAction
-}
-
-// lexNumber scans a number: decimal, octal, hex, float, or imaginary. This
-// isn't a perfect number scanner - for instance it accepts "." and "0x0.2"
-// and "089" - but when it's wrong the input is invalid and the parser (via
-// strconv) will notice.
-func lexNumber(l *lexer) stateFn {
-	if !l.scanNumber() {
-		return l.errorf("bad number syntax: %q", l.input[l.start:l.pos])
-	}
-	if sign := l.peek(); sign == '+' || sign == '-' {
-		// Complex: 1+2i. No spaces, must end in 'i'.
-		if !l.scanNumber() || l.input[l.pos-1] != 'i' {
-			return l.errorf("bad number syntax: %q", l.input[l.start:l.pos])
-		}
-		l.emit(itemComplex)
-	} else {
-		l.emit(itemNumber)
-	}
-	return lexInsideAction
-}
-
-func (l *lexer) scanNumber() bool {
-	// Optional leading sign.
-	l.accept("+-")
-	// Is it hex?
-	digits := "0123456789"
-	if l.accept("0") && l.accept("xX") {
-		digits = "0123456789abcdefABCDEF"
-	}
-	l.acceptRun(digits)
-	if l.accept(".") {
-		l.acceptRun(digits)
-	}
-	if l.accept("eE") {
-		l.accept("+-")
-		l.acceptRun("0123456789")
-	}
-	// Is it imaginary?
-	l.accept("i")
-	// Next thing mustn't be alphanumeric.
-	if isAlphaNumeric(l.peek()) {
-		l.next()
-		return false
-	}
-	return true
-}
-
-// lexQuote scans a quoted string.
-func lexQuote(l *lexer) stateFn {
-Loop:
-	for {
-		switch l.next() {
-		case '\\':
-			if r := l.next(); r != eof && r != '\n' {
-				break
-			}
-			fallthrough
-		case eof, '\n':
-			return l.errorf("unterminated quoted string")
-		case '"':
-			break Loop
-		}
-	}
-	l.emit(itemString)
-	return lexInsideAction
-}
-
-// lexRawQuote scans a raw quoted string.
-func lexRawQuote(l *lexer) stateFn {
-Loop:
-	for {
-		switch l.next() {
-		case eof:
-			return l.errorf("unterminated raw quoted string")
-		case '`':
-			break Loop
-		}
-	}
-	l.emit(itemRawString)
-	return lexInsideAction
-}
-
-// isSpace reports whether r is a space character.
-func isSpace(r rune) bool {
-	return r == ' ' || r == '\t'
-}
-
-// isEndOfLine reports whether r is an end-of-line character.
-func isEndOfLine(r rune) bool {
-	return r == '\r' || r == '\n'
-}
-
-// isAlphaNumeric reports whether r is an alphabetic, digit, or underscore.
-func isAlphaNumeric(r rune) bool {
-	return r == '_' || unicode.IsLetter(r) || unicode.IsDigit(r)
-}
diff --git a/third_party/gofrontend/libgo/go/text/template/parse/lex_test.go b/third_party/gofrontend/libgo/go/text/template/parse/lex_test.go
deleted file mode 100644
index be551d8..0000000
--- a/third_party/gofrontend/libgo/go/text/template/parse/lex_test.go
+++ /dev/null
@@ -1,496 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package parse
-
-import (
-	"fmt"
-	"testing"
-)
-
-// Make the types prettyprint.
-var itemName = map[itemType]string{
-	itemError:        "error",
-	itemBool:         "bool",
-	itemChar:         "char",
-	itemCharConstant: "charconst",
-	itemComplex:      "complex",
-	itemColonEquals:  ":=",
-	itemEOF:          "EOF",
-	itemField:        "field",
-	itemIdentifier:   "identifier",
-	itemLeftDelim:    "left delim",
-	itemLeftParen:    "(",
-	itemNumber:       "number",
-	itemPipe:         "pipe",
-	itemRawString:    "raw string",
-	itemRightDelim:   "right delim",
-	itemRightParen:   ")",
-	itemSpace:        "space",
-	itemString:       "string",
-	itemVariable:     "variable",
-
-	// keywords
-	itemDot:      ".",
-	itemDefine:   "define",
-	itemElse:     "else",
-	itemIf:       "if",
-	itemEnd:      "end",
-	itemNil:      "nil",
-	itemRange:    "range",
-	itemTemplate: "template",
-	itemWith:     "with",
-}
-
-func (i itemType) String() string {
-	s := itemName[i]
-	if s == "" {
-		return fmt.Sprintf("item%d", int(i))
-	}
-	return s
-}
-
-type lexTest struct {
-	name  string
-	input string
-	items []item
-}
-
-var (
-	tEOF        = item{itemEOF, 0, ""}
-	tFor        = item{itemIdentifier, 0, "for"}
-	tLeft       = item{itemLeftDelim, 0, "{{"}
-	tLpar       = item{itemLeftParen, 0, "("}
-	tPipe       = item{itemPipe, 0, "|"}
-	tQuote      = item{itemString, 0, `"abc \n\t\" "`}
-	tRange      = item{itemRange, 0, "range"}
-	tRight      = item{itemRightDelim, 0, "}}"}
-	tRpar       = item{itemRightParen, 0, ")"}
-	tSpace      = item{itemSpace, 0, " "}
-	raw         = "`" + `abc\n\t\" ` + "`"
-	rawNL       = "`now is{{\n}}the time`" // Contains newline inside raw quote.
-	tRawQuote   = item{itemRawString, 0, raw}
-	tRawQuoteNL = item{itemRawString, 0, rawNL}
-)
-
-var lexTests = []lexTest{
-	{"empty", "", []item{tEOF}},
-	{"spaces", " \t\n", []item{{itemText, 0, " \t\n"}, tEOF}},
-	{"text", `now is the time`, []item{{itemText, 0, "now is the time"}, tEOF}},
-	{"text with comment", "hello-{{/* this is a comment */}}-world", []item{
-		{itemText, 0, "hello-"},
-		{itemText, 0, "-world"},
-		tEOF,
-	}},
-	{"punctuation", "{{,@% }}", []item{
-		tLeft,
-		{itemChar, 0, ","},
-		{itemChar, 0, "@"},
-		{itemChar, 0, "%"},
-		tSpace,
-		tRight,
-		tEOF,
-	}},
-	{"parens", "{{((3))}}", []item{
-		tLeft,
-		tLpar,
-		tLpar,
-		{itemNumber, 0, "3"},
-		tRpar,
-		tRpar,
-		tRight,
-		tEOF,
-	}},
-	{"empty action", `{{}}`, []item{tLeft, tRight, tEOF}},
-	{"for", `{{for}}`, []item{tLeft, tFor, tRight, tEOF}},
-	{"quote", `{{"abc \n\t\" "}}`, []item{tLeft, tQuote, tRight, tEOF}},
-	{"raw quote", "{{" + raw + "}}", []item{tLeft, tRawQuote, tRight, tEOF}},
-	{"raw quote with newline", "{{" + rawNL + "}}", []item{tLeft, tRawQuoteNL, tRight, tEOF}},
-	{"numbers", "{{1 02 0x14 -7.2i 1e3 +1.2e-4 4.2i 1+2i}}", []item{
-		tLeft,
-		{itemNumber, 0, "1"},
-		tSpace,
-		{itemNumber, 0, "02"},
-		tSpace,
-		{itemNumber, 0, "0x14"},
-		tSpace,
-		{itemNumber, 0, "-7.2i"},
-		tSpace,
-		{itemNumber, 0, "1e3"},
-		tSpace,
-		{itemNumber, 0, "+1.2e-4"},
-		tSpace,
-		{itemNumber, 0, "4.2i"},
-		tSpace,
-		{itemComplex, 0, "1+2i"},
-		tRight,
-		tEOF,
-	}},
-	{"characters", `{{'a' '\n' '\'' '\\' '\u00FF' '\xFF' '本'}}`, []item{
-		tLeft,
-		{itemCharConstant, 0, `'a'`},
-		tSpace,
-		{itemCharConstant, 0, `'\n'`},
-		tSpace,
-		{itemCharConstant, 0, `'\''`},
-		tSpace,
-		{itemCharConstant, 0, `'\\'`},
-		tSpace,
-		{itemCharConstant, 0, `'\u00FF'`},
-		tSpace,
-		{itemCharConstant, 0, `'\xFF'`},
-		tSpace,
-		{itemCharConstant, 0, `'本'`},
-		tRight,
-		tEOF,
-	}},
-	{"bools", "{{true false}}", []item{
-		tLeft,
-		{itemBool, 0, "true"},
-		tSpace,
-		{itemBool, 0, "false"},
-		tRight,
-		tEOF,
-	}},
-	{"dot", "{{.}}", []item{
-		tLeft,
-		{itemDot, 0, "."},
-		tRight,
-		tEOF,
-	}},
-	{"nil", "{{nil}}", []item{
-		tLeft,
-		{itemNil, 0, "nil"},
-		tRight,
-		tEOF,
-	}},
-	{"dots", "{{.x . .2 .x.y.z}}", []item{
-		tLeft,
-		{itemField, 0, ".x"},
-		tSpace,
-		{itemDot, 0, "."},
-		tSpace,
-		{itemNumber, 0, ".2"},
-		tSpace,
-		{itemField, 0, ".x"},
-		{itemField, 0, ".y"},
-		{itemField, 0, ".z"},
-		tRight,
-		tEOF,
-	}},
-	{"keywords", "{{range if else end with}}", []item{
-		tLeft,
-		{itemRange, 0, "range"},
-		tSpace,
-		{itemIf, 0, "if"},
-		tSpace,
-		{itemElse, 0, "else"},
-		tSpace,
-		{itemEnd, 0, "end"},
-		tSpace,
-		{itemWith, 0, "with"},
-		tRight,
-		tEOF,
-	}},
-	{"variables", "{{$c := printf $ $hello $23 $ $var.Field .Method}}", []item{
-		tLeft,
-		{itemVariable, 0, "$c"},
-		tSpace,
-		{itemColonEquals, 0, ":="},
-		tSpace,
-		{itemIdentifier, 0, "printf"},
-		tSpace,
-		{itemVariable, 0, "$"},
-		tSpace,
-		{itemVariable, 0, "$hello"},
-		tSpace,
-		{itemVariable, 0, "$23"},
-		tSpace,
-		{itemVariable, 0, "$"},
-		tSpace,
-		{itemVariable, 0, "$var"},
-		{itemField, 0, ".Field"},
-		tSpace,
-		{itemField, 0, ".Method"},
-		tRight,
-		tEOF,
-	}},
-	{"variable invocation", "{{$x 23}}", []item{
-		tLeft,
-		{itemVariable, 0, "$x"},
-		tSpace,
-		{itemNumber, 0, "23"},
-		tRight,
-		tEOF,
-	}},
-	{"pipeline", `intro {{echo hi 1.2 |noargs|args 1 "hi"}} outro`, []item{
-		{itemText, 0, "intro "},
-		tLeft,
-		{itemIdentifier, 0, "echo"},
-		tSpace,
-		{itemIdentifier, 0, "hi"},
-		tSpace,
-		{itemNumber, 0, "1.2"},
-		tSpace,
-		tPipe,
-		{itemIdentifier, 0, "noargs"},
-		tPipe,
-		{itemIdentifier, 0, "args"},
-		tSpace,
-		{itemNumber, 0, "1"},
-		tSpace,
-		{itemString, 0, `"hi"`},
-		tRight,
-		{itemText, 0, " outro"},
-		tEOF,
-	}},
-	{"declaration", "{{$v := 3}}", []item{
-		tLeft,
-		{itemVariable, 0, "$v"},
-		tSpace,
-		{itemColonEquals, 0, ":="},
-		tSpace,
-		{itemNumber, 0, "3"},
-		tRight,
-		tEOF,
-	}},
-	{"2 declarations", "{{$v , $w := 3}}", []item{
-		tLeft,
-		{itemVariable, 0, "$v"},
-		tSpace,
-		{itemChar, 0, ","},
-		tSpace,
-		{itemVariable, 0, "$w"},
-		tSpace,
-		{itemColonEquals, 0, ":="},
-		tSpace,
-		{itemNumber, 0, "3"},
-		tRight,
-		tEOF,
-	}},
-	{"field of parenthesized expression", "{{(.X).Y}}", []item{
-		tLeft,
-		tLpar,
-		{itemField, 0, ".X"},
-		tRpar,
-		{itemField, 0, ".Y"},
-		tRight,
-		tEOF,
-	}},
-	// errors
-	{"badchar", "#{{\x01}}", []item{
-		{itemText, 0, "#"},
-		tLeft,
-		{itemError, 0, "unrecognized character in action: U+0001"},
-	}},
-	{"unclosed action", "{{\n}}", []item{
-		tLeft,
-		{itemError, 0, "unclosed action"},
-	}},
-	{"EOF in action", "{{range", []item{
-		tLeft,
-		tRange,
-		{itemError, 0, "unclosed action"},
-	}},
-	{"unclosed quote", "{{\"\n\"}}", []item{
-		tLeft,
-		{itemError, 0, "unterminated quoted string"},
-	}},
-	{"unclosed raw quote", "{{`xx}}", []item{
-		tLeft,
-		{itemError, 0, "unterminated raw quoted string"},
-	}},
-	{"unclosed char constant", "{{'\n}}", []item{
-		tLeft,
-		{itemError, 0, "unterminated character constant"},
-	}},
-	{"bad number", "{{3k}}", []item{
-		tLeft,
-		{itemError, 0, `bad number syntax: "3k"`},
-	}},
-	{"unclosed paren", "{{(3}}", []item{
-		tLeft,
-		tLpar,
-		{itemNumber, 0, "3"},
-		{itemError, 0, `unclosed left paren`},
-	}},
-	{"extra right paren", "{{3)}}", []item{
-		tLeft,
-		{itemNumber, 0, "3"},
-		tRpar,
-		{itemError, 0, `unexpected right paren U+0029 ')'`},
-	}},
-
-	// Fixed bugs
-	// Many elements in an action blew the lookahead until
-	// we made lexInsideAction not loop.
-	{"long pipeline deadlock", "{{|||||}}", []item{
-		tLeft,
-		tPipe,
-		tPipe,
-		tPipe,
-		tPipe,
-		tPipe,
-		tRight,
-		tEOF,
-	}},
-	{"text with bad comment", "hello-{{/*/}}-world", []item{
-		{itemText, 0, "hello-"},
-		{itemError, 0, `unclosed comment`},
-	}},
-	{"text with comment close separted from delim", "hello-{{/* */ }}-world", []item{
-		{itemText, 0, "hello-"},
-		{itemError, 0, `comment ends before closing delimiter`},
-	}},
-	// This one is an error that we can't catch because it breaks templates with
-	// minimized JavaScript. Should have fixed it before Go 1.1.
-	{"unmatched right delimiter", "hello-{.}}-world", []item{
-		{itemText, 0, "hello-{.}}-world"},
-		tEOF,
-	}},
-}
-
-// collect gathers the emitted items into a slice.
-func collect(t *lexTest, left, right string) (items []item) {
-	l := lex(t.name, t.input, left, right)
-	for {
-		item := l.nextItem()
-		items = append(items, item)
-		if item.typ == itemEOF || item.typ == itemError {
-			break
-		}
-	}
-	return
-}
-
-func equal(i1, i2 []item, checkPos bool) bool {
-	if len(i1) != len(i2) {
-		return false
-	}
-	for k := range i1 {
-		if i1[k].typ != i2[k].typ {
-			return false
-		}
-		if i1[k].val != i2[k].val {
-			return false
-		}
-		if checkPos && i1[k].pos != i2[k].pos {
-			return false
-		}
-	}
-	return true
-}
-
-func TestLex(t *testing.T) {
-	for _, test := range lexTests {
-		items := collect(&test, "", "")
-		if !equal(items, test.items, false) {
-			t.Errorf("%s: got\n\t%+v\nexpected\n\t%v", test.name, items, test.items)
-		}
-	}
-}
-
-// Some easy cases from above, but with delimiters $$ and @@
-var lexDelimTests = []lexTest{
-	{"punctuation", "$$,@%{{}}@@", []item{
-		tLeftDelim,
-		{itemChar, 0, ","},
-		{itemChar, 0, "@"},
-		{itemChar, 0, "%"},
-		{itemChar, 0, "{"},
-		{itemChar, 0, "{"},
-		{itemChar, 0, "}"},
-		{itemChar, 0, "}"},
-		tRightDelim,
-		tEOF,
-	}},
-	{"empty action", `$$@@`, []item{tLeftDelim, tRightDelim, tEOF}},
-	{"for", `$$for@@`, []item{tLeftDelim, tFor, tRightDelim, tEOF}},
-	{"quote", `$$"abc \n\t\" "@@`, []item{tLeftDelim, tQuote, tRightDelim, tEOF}},
-	{"raw quote", "$$" + raw + "@@", []item{tLeftDelim, tRawQuote, tRightDelim, tEOF}},
-}
-
-var (
-	tLeftDelim  = item{itemLeftDelim, 0, "$$"}
-	tRightDelim = item{itemRightDelim, 0, "@@"}
-)
-
-func TestDelims(t *testing.T) {
-	for _, test := range lexDelimTests {
-		items := collect(&test, "$$", "@@")
-		if !equal(items, test.items, false) {
-			t.Errorf("%s: got\n\t%v\nexpected\n\t%v", test.name, items, test.items)
-		}
-	}
-}
-
-var lexPosTests = []lexTest{
-	{"empty", "", []item{tEOF}},
-	{"punctuation", "{{,@%#}}", []item{
-		{itemLeftDelim, 0, "{{"},
-		{itemChar, 2, ","},
-		{itemChar, 3, "@"},
-		{itemChar, 4, "%"},
-		{itemChar, 5, "#"},
-		{itemRightDelim, 6, "}}"},
-		{itemEOF, 8, ""},
-	}},
-	{"sample", "0123{{hello}}xyz", []item{
-		{itemText, 0, "0123"},
-		{itemLeftDelim, 4, "{{"},
-		{itemIdentifier, 6, "hello"},
-		{itemRightDelim, 11, "}}"},
-		{itemText, 13, "xyz"},
-		{itemEOF, 16, ""},
-	}},
-}
-
-// The other tests don't check position, to make the test cases easier to construct.
-// This one does.
-func TestPos(t *testing.T) {
-	for _, test := range lexPosTests {
-		items := collect(&test, "", "")
-		if !equal(items, test.items, true) {
-			t.Errorf("%s: got\n\t%v\nexpected\n\t%v", test.name, items, test.items)
-			if len(items) == len(test.items) {
-				// Detailed print; avoid item.String() to expose the position value.
-				for i := range items {
-					if !equal(items[i:i+1], test.items[i:i+1], true) {
-						i1 := items[i]
-						i2 := test.items[i]
-						t.Errorf("\t#%d: got {%v %d %q} expected  {%v %d %q}", i, i1.typ, i1.pos, i1.val, i2.typ, i2.pos, i2.val)
-					}
-				}
-			}
-		}
-	}
-}
-
-// Test that an error shuts down the lexing goroutine.
-func TestShutdown(t *testing.T) {
-	// We need to duplicate template.Parse here to hold on to the lexer.
-	const text = "erroneous{{define}}{{else}}1234"
-	lexer := lex("foo", text, "{{", "}}")
-	_, err := New("root").parseLexer(lexer, text)
-	if err == nil {
-		t.Fatalf("expected error")
-	}
-	// The error should have drained the input. Therefore, the lexer should be shut down.
-	token, ok := <-lexer.items
-	if ok {
-		t.Fatalf("input was not drained; got %v", token)
-	}
-}
-
-// parseLexer is a local version of parse that lets us pass in the lexer instead of building it.
-// We expect an error, so the tree set and funcs list are explicitly nil.
-func (t *Tree) parseLexer(lex *lexer, text string) (tree *Tree, err error) {
-	defer t.recover(&err)
-	t.ParseName = t.Name
-	t.startParse(nil, lex)
-	t.parse(nil)
-	t.add(nil)
-	t.stopParse()
-	return t, nil
-}
diff --git a/third_party/gofrontend/libgo/go/text/template/parse/node.go b/third_party/gofrontend/libgo/go/text/template/parse/node.go
deleted file mode 100644
index 55ff46c..0000000
--- a/third_party/gofrontend/libgo/go/text/template/parse/node.go
+++ /dev/null
@@ -1,839 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Parse nodes.
-
-package parse
-
-import (
-	"bytes"
-	"fmt"
-	"strconv"
-	"strings"
-)
-
-var textFormat = "%s" // Changed to "%q" in tests for better error messages.
-
-// A Node is an element in the parse tree. The interface is trivial.
-// The interface contains an unexported method so that only
-// types local to this package can satisfy it.
-type Node interface {
-	Type() NodeType
-	String() string
-	// Copy does a deep copy of the Node and all its components.
-	// To avoid type assertions, some XxxNodes also have specialized
-	// CopyXxx methods that return *XxxNode.
-	Copy() Node
-	Position() Pos // byte position of start of node in full original input string
-	// tree returns the containing *Tree.
-	// It is unexported so all implementations of Node are in this package.
-	tree() *Tree
-}
-
-// NodeType identifies the type of a parse tree node.
-type NodeType int
-
-// Pos represents a byte position in the original input text from which
-// this template was parsed.
-type Pos int
-
-func (p Pos) Position() Pos {
-	return p
-}
-
-// Type returns itself and provides an easy default implementation
-// for embedding in a Node. Embedded in all non-trivial Nodes.
-func (t NodeType) Type() NodeType {
-	return t
-}
-
-const (
-	NodeText       NodeType = iota // Plain text.
-	NodeAction                     // A non-control action such as a field evaluation.
-	NodeBool                       // A boolean constant.
-	NodeChain                      // A sequence of field accesses.
-	NodeCommand                    // An element of a pipeline.
-	NodeDot                        // The cursor, dot.
-	nodeElse                       // An else action. Not added to tree.
-	nodeEnd                        // An end action. Not added to tree.
-	NodeField                      // A field or method name.
-	NodeIdentifier                 // An identifier; always a function name.
-	NodeIf                         // An if action.
-	NodeList                       // A list of Nodes.
-	NodeNil                        // An untyped nil constant.
-	NodeNumber                     // A numerical constant.
-	NodePipe                       // A pipeline of commands.
-	NodeRange                      // A range action.
-	NodeString                     // A string constant.
-	NodeTemplate                   // A template invocation action.
-	NodeVariable                   // A $ variable.
-	NodeWith                       // A with action.
-)
-
-// Nodes.
-
-// ListNode holds a sequence of nodes.
-type ListNode struct {
-	NodeType
-	Pos
-	tr    *Tree
-	Nodes []Node // The element nodes in lexical order.
-}
-
-func (t *Tree) newList(pos Pos) *ListNode {
-	return &ListNode{tr: t, NodeType: NodeList, Pos: pos}
-}
-
-func (l *ListNode) append(n Node) {
-	l.Nodes = append(l.Nodes, n)
-}
-
-func (l *ListNode) tree() *Tree {
-	return l.tr
-}
-
-func (l *ListNode) String() string {
-	b := new(bytes.Buffer)
-	for _, n := range l.Nodes {
-		fmt.Fprint(b, n)
-	}
-	return b.String()
-}
-
-func (l *ListNode) CopyList() *ListNode {
-	if l == nil {
-		return l
-	}
-	n := l.tr.newList(l.Pos)
-	for _, elem := range l.Nodes {
-		n.append(elem.Copy())
-	}
-	return n
-}
-
-func (l *ListNode) Copy() Node {
-	return l.CopyList()
-}
-
-// TextNode holds plain text.
-type TextNode struct {
-	NodeType
-	Pos
-	tr   *Tree
-	Text []byte // The text; may span newlines.
-}
-
-func (t *Tree) newText(pos Pos, text string) *TextNode {
-	return &TextNode{tr: t, NodeType: NodeText, Pos: pos, Text: []byte(text)}
-}
-
-func (t *TextNode) String() string {
-	return fmt.Sprintf(textFormat, t.Text)
-}
-
-func (t *TextNode) tree() *Tree {
-	return t.tr
-}
-
-func (t *TextNode) Copy() Node {
-	return &TextNode{tr: t.tr, NodeType: NodeText, Pos: t.Pos, Text: append([]byte{}, t.Text...)}
-}
-
-// PipeNode holds a pipeline with optional declaration
-type PipeNode struct {
-	NodeType
-	Pos
-	tr   *Tree
-	Line int             // The line number in the input. Deprecated: Kept for compatibility.
-	Decl []*VariableNode // Variable declarations in lexical order.
-	Cmds []*CommandNode  // The commands in lexical order.
-}
-
-func (t *Tree) newPipeline(pos Pos, line int, decl []*VariableNode) *PipeNode {
-	return &PipeNode{tr: t, NodeType: NodePipe, Pos: pos, Line: line, Decl: decl}
-}
-
-func (p *PipeNode) append(command *CommandNode) {
-	p.Cmds = append(p.Cmds, command)
-}
-
-func (p *PipeNode) String() string {
-	s := ""
-	if len(p.Decl) > 0 {
-		for i, v := range p.Decl {
-			if i > 0 {
-				s += ", "
-			}
-			s += v.String()
-		}
-		s += " := "
-	}
-	for i, c := range p.Cmds {
-		if i > 0 {
-			s += " | "
-		}
-		s += c.String()
-	}
-	return s
-}
-
-func (p *PipeNode) tree() *Tree {
-	return p.tr
-}
-
-func (p *PipeNode) CopyPipe() *PipeNode {
-	if p == nil {
-		return p
-	}
-	var decl []*VariableNode
-	for _, d := range p.Decl {
-		decl = append(decl, d.Copy().(*VariableNode))
-	}
-	n := p.tr.newPipeline(p.Pos, p.Line, decl)
-	for _, c := range p.Cmds {
-		n.append(c.Copy().(*CommandNode))
-	}
-	return n
-}
-
-func (p *PipeNode) Copy() Node {
-	return p.CopyPipe()
-}
-
-// ActionNode holds an action (something bounded by delimiters).
-// Control actions have their own nodes; ActionNode represents simple
-// ones such as field evaluations and parenthesized pipelines.
-type ActionNode struct {
-	NodeType
-	Pos
-	tr   *Tree
-	Line int       // The line number in the input. Deprecated: Kept for compatibility.
-	Pipe *PipeNode // The pipeline in the action.
-}
-
-func (t *Tree) newAction(pos Pos, line int, pipe *PipeNode) *ActionNode {
-	return &ActionNode{tr: t, NodeType: NodeAction, Pos: pos, Line: line, Pipe: pipe}
-}
-
-func (a *ActionNode) String() string {
-	return fmt.Sprintf("{{%s}}", a.Pipe)
-
-}
-
-func (a *ActionNode) tree() *Tree {
-	return a.tr
-}
-
-func (a *ActionNode) Copy() Node {
-	return a.tr.newAction(a.Pos, a.Line, a.Pipe.CopyPipe())
-
-}
-
-// CommandNode holds a command (a pipeline inside an evaluating action).
-type CommandNode struct {
-	NodeType
-	Pos
-	tr   *Tree
-	Args []Node // Arguments in lexical order: Identifier, field, or constant.
-}
-
-func (t *Tree) newCommand(pos Pos) *CommandNode {
-	return &CommandNode{tr: t, NodeType: NodeCommand, Pos: pos}
-}
-
-func (c *CommandNode) append(arg Node) {
-	c.Args = append(c.Args, arg)
-}
-
-func (c *CommandNode) String() string {
-	s := ""
-	for i, arg := range c.Args {
-		if i > 0 {
-			s += " "
-		}
-		if arg, ok := arg.(*PipeNode); ok {
-			s += "(" + arg.String() + ")"
-			continue
-		}
-		s += arg.String()
-	}
-	return s
-}
-
-func (c *CommandNode) tree() *Tree {
-	return c.tr
-}
-
-func (c *CommandNode) Copy() Node {
-	if c == nil {
-		return c
-	}
-	n := c.tr.newCommand(c.Pos)
-	for _, c := range c.Args {
-		n.append(c.Copy())
-	}
-	return n
-}
-
-// IdentifierNode holds an identifier.
-type IdentifierNode struct {
-	NodeType
-	Pos
-	tr    *Tree
-	Ident string // The identifier's name.
-}
-
-// NewIdentifier returns a new IdentifierNode with the given identifier name.
-func NewIdentifier(ident string) *IdentifierNode {
-	return &IdentifierNode{NodeType: NodeIdentifier, Ident: ident}
-}
-
-// SetPos sets the position. NewIdentifier is a public method so we can't modify its signature.
-// Chained for convenience.
-// TODO: fix one day?
-func (i *IdentifierNode) SetPos(pos Pos) *IdentifierNode {
-	i.Pos = pos
-	return i
-}
-
-// SetTree sets the parent tree for the node. NewIdentifier is a public method so we can't modify its signature.
-// Chained for convenience.
-// TODO: fix one day?
-func (i *IdentifierNode) SetTree(t *Tree) *IdentifierNode {
-	i.tr = t
-	return i
-}
-
-func (i *IdentifierNode) String() string {
-	return i.Ident
-}
-
-func (i *IdentifierNode) tree() *Tree {
-	return i.tr
-}
-
-func (i *IdentifierNode) Copy() Node {
-	return NewIdentifier(i.Ident).SetTree(i.tr).SetPos(i.Pos)
-}
-
-// VariableNode holds a list of variable names, possibly with chained field
-// accesses. The dollar sign is part of the (first) name.
-type VariableNode struct {
-	NodeType
-	Pos
-	tr    *Tree
-	Ident []string // Variable name and fields in lexical order.
-}
-
-func (t *Tree) newVariable(pos Pos, ident string) *VariableNode {
-	return &VariableNode{tr: t, NodeType: NodeVariable, Pos: pos, Ident: strings.Split(ident, ".")}
-}
-
-func (v *VariableNode) String() string {
-	s := ""
-	for i, id := range v.Ident {
-		if i > 0 {
-			s += "."
-		}
-		s += id
-	}
-	return s
-}
-
-func (v *VariableNode) tree() *Tree {
-	return v.tr
-}
-
-func (v *VariableNode) Copy() Node {
-	return &VariableNode{tr: v.tr, NodeType: NodeVariable, Pos: v.Pos, Ident: append([]string{}, v.Ident...)}
-}
-
-// DotNode holds the special identifier '.'.
-type DotNode struct {
-	NodeType
-	Pos
-	tr *Tree
-}
-
-func (t *Tree) newDot(pos Pos) *DotNode {
-	return &DotNode{tr: t, NodeType: NodeDot, Pos: pos}
-}
-
-func (d *DotNode) Type() NodeType {
-	// Override method on embedded NodeType for API compatibility.
-	// TODO: Not really a problem; could change API without effect but
-	// api tool complains.
-	return NodeDot
-}
-
-func (d *DotNode) String() string {
-	return "."
-}
-
-func (d *DotNode) tree() *Tree {
-	return d.tr
-}
-
-func (d *DotNode) Copy() Node {
-	return d.tr.newDot(d.Pos)
-}
-
-// NilNode holds the special identifier 'nil' representing an untyped nil constant.
-type NilNode struct {
-	NodeType
-	Pos
-	tr *Tree
-}
-
-func (t *Tree) newNil(pos Pos) *NilNode {
-	return &NilNode{tr: t, NodeType: NodeNil, Pos: pos}
-}
-
-func (n *NilNode) Type() NodeType {
-	// Override method on embedded NodeType for API compatibility.
-	// TODO: Not really a problem; could change API without effect but
-	// api tool complains.
-	return NodeNil
-}
-
-func (n *NilNode) String() string {
-	return "nil"
-}
-
-func (n *NilNode) tree() *Tree {
-	return n.tr
-}
-
-func (n *NilNode) Copy() Node {
-	return n.tr.newNil(n.Pos)
-}
-
-// FieldNode holds a field (identifier starting with '.').
-// The names may be chained ('.x.y').
-// The period is dropped from each ident.
-type FieldNode struct {
-	NodeType
-	Pos
-	tr    *Tree
-	Ident []string // The identifiers in lexical order.
-}
-
-func (t *Tree) newField(pos Pos, ident string) *FieldNode {
-	return &FieldNode{tr: t, NodeType: NodeField, Pos: pos, Ident: strings.Split(ident[1:], ".")} // [1:] to drop leading period
-}
-
-func (f *FieldNode) String() string {
-	s := ""
-	for _, id := range f.Ident {
-		s += "." + id
-	}
-	return s
-}
-
-func (f *FieldNode) tree() *Tree {
-	return f.tr
-}
-
-func (f *FieldNode) Copy() Node {
-	return &FieldNode{tr: f.tr, NodeType: NodeField, Pos: f.Pos, Ident: append([]string{}, f.Ident...)}
-}
-
-// ChainNode holds a term followed by a chain of field accesses (identifier starting with '.').
-// The names may be chained ('.x.y').
-// The periods are dropped from each ident.
-type ChainNode struct {
-	NodeType
-	Pos
-	tr    *Tree
-	Node  Node
-	Field []string // The identifiers in lexical order.
-}
-
-func (t *Tree) newChain(pos Pos, node Node) *ChainNode {
-	return &ChainNode{tr: t, NodeType: NodeChain, Pos: pos, Node: node}
-}
-
-// Add adds the named field (which should start with a period) to the end of the chain.
-func (c *ChainNode) Add(field string) {
-	if len(field) == 0 || field[0] != '.' {
-		panic("no dot in field")
-	}
-	field = field[1:] // Remove leading dot.
-	if field == "" {
-		panic("empty field")
-	}
-	c.Field = append(c.Field, field)
-}
-
-func (c *ChainNode) String() string {
-	s := c.Node.String()
-	if _, ok := c.Node.(*PipeNode); ok {
-		s = "(" + s + ")"
-	}
-	for _, field := range c.Field {
-		s += "." + field
-	}
-	return s
-}
-
-func (c *ChainNode) tree() *Tree {
-	return c.tr
-}
-
-func (c *ChainNode) Copy() Node {
-	return &ChainNode{tr: c.tr, NodeType: NodeChain, Pos: c.Pos, Node: c.Node, Field: append([]string{}, c.Field...)}
-}
-
-// BoolNode holds a boolean constant.
-type BoolNode struct {
-	NodeType
-	Pos
-	tr   *Tree
-	True bool // The value of the boolean constant.
-}
-
-func (t *Tree) newBool(pos Pos, true bool) *BoolNode {
-	return &BoolNode{tr: t, NodeType: NodeBool, Pos: pos, True: true}
-}
-
-func (b *BoolNode) String() string {
-	if b.True {
-		return "true"
-	}
-	return "false"
-}
-
-func (b *BoolNode) tree() *Tree {
-	return b.tr
-}
-
-func (b *BoolNode) Copy() Node {
-	return b.tr.newBool(b.Pos, b.True)
-}
-
-// NumberNode holds a number: signed or unsigned integer, float, or complex.
-// The value is parsed and stored under all the types that can represent the value.
-// This simulates in a small amount of code the behavior of Go's ideal constants.
-type NumberNode struct {
-	NodeType
-	Pos
-	tr         *Tree
-	IsInt      bool       // Number has an integral value.
-	IsUint     bool       // Number has an unsigned integral value.
-	IsFloat    bool       // Number has a floating-point value.
-	IsComplex  bool       // Number is complex.
-	Int64      int64      // The signed integer value.
-	Uint64     uint64     // The unsigned integer value.
-	Float64    float64    // The floating-point value.
-	Complex128 complex128 // The complex value.
-	Text       string     // The original textual representation from the input.
-}
-
-func (t *Tree) newNumber(pos Pos, text string, typ itemType) (*NumberNode, error) {
-	n := &NumberNode{tr: t, NodeType: NodeNumber, Pos: pos, Text: text}
-	switch typ {
-	case itemCharConstant:
-		rune, _, tail, err := strconv.UnquoteChar(text[1:], text[0])
-		if err != nil {
-			return nil, err
-		}
-		if tail != "'" {
-			return nil, fmt.Errorf("malformed character constant: %s", text)
-		}
-		n.Int64 = int64(rune)
-		n.IsInt = true
-		n.Uint64 = uint64(rune)
-		n.IsUint = true
-		n.Float64 = float64(rune) // odd but those are the rules.
-		n.IsFloat = true
-		return n, nil
-	case itemComplex:
-		// fmt.Sscan can parse the pair, so let it do the work.
-		if _, err := fmt.Sscan(text, &n.Complex128); err != nil {
-			return nil, err
-		}
-		n.IsComplex = true
-		n.simplifyComplex()
-		return n, nil
-	}
-	// Imaginary constants can only be complex unless they are zero.
-	if len(text) > 0 && text[len(text)-1] == 'i' {
-		f, err := strconv.ParseFloat(text[:len(text)-1], 64)
-		if err == nil {
-			n.IsComplex = true
-			n.Complex128 = complex(0, f)
-			n.simplifyComplex()
-			return n, nil
-		}
-	}
-	// Do integer test first so we get 0x123 etc.
-	u, err := strconv.ParseUint(text, 0, 64) // will fail for -0; fixed below.
-	if err == nil {
-		n.IsUint = true
-		n.Uint64 = u
-	}
-	i, err := strconv.ParseInt(text, 0, 64)
-	if err == nil {
-		n.IsInt = true
-		n.Int64 = i
-		if i == 0 {
-			n.IsUint = true // in case of -0.
-			n.Uint64 = u
-		}
-	}
-	// If an integer extraction succeeded, promote the float.
-	if n.IsInt {
-		n.IsFloat = true
-		n.Float64 = float64(n.Int64)
-	} else if n.IsUint {
-		n.IsFloat = true
-		n.Float64 = float64(n.Uint64)
-	} else {
-		f, err := strconv.ParseFloat(text, 64)
-		if err == nil {
-			// If we parsed it as a float but it looks like an integer,
-			// it's a huge number too large to fit in an int. Reject it.
-			if !strings.ContainsAny(text, ".eE") {
-				return nil, fmt.Errorf("integer overflow: %q", text)
-			}
-			n.IsFloat = true
-			n.Float64 = f
-			// If a floating-point extraction succeeded, extract the int if needed.
-			if !n.IsInt && float64(int64(f)) == f {
-				n.IsInt = true
-				n.Int64 = int64(f)
-			}
-			if !n.IsUint && float64(uint64(f)) == f {
-				n.IsUint = true
-				n.Uint64 = uint64(f)
-			}
-		}
-	}
-	if !n.IsInt && !n.IsUint && !n.IsFloat {
-		return nil, fmt.Errorf("illegal number syntax: %q", text)
-	}
-	return n, nil
-}
-
-// simplifyComplex pulls out any other types that are represented by the complex number.
-// These all require that the imaginary part be zero.
-func (n *NumberNode) simplifyComplex() {
-	n.IsFloat = imag(n.Complex128) == 0
-	if n.IsFloat {
-		n.Float64 = real(n.Complex128)
-		n.IsInt = float64(int64(n.Float64)) == n.Float64
-		if n.IsInt {
-			n.Int64 = int64(n.Float64)
-		}
-		n.IsUint = float64(uint64(n.Float64)) == n.Float64
-		if n.IsUint {
-			n.Uint64 = uint64(n.Float64)
-		}
-	}
-}
-
-func (n *NumberNode) String() string {
-	return n.Text
-}
-
-func (n *NumberNode) tree() *Tree {
-	return n.tr
-}
-
-func (n *NumberNode) Copy() Node {
-	nn := new(NumberNode)
-	*nn = *n // Easy, fast, correct.
-	return nn
-}
-
-// StringNode holds a string constant. The value has been "unquoted".
-type StringNode struct {
-	NodeType
-	Pos
-	tr     *Tree
-	Quoted string // The original text of the string, with quotes.
-	Text   string // The string, after quote processing.
-}
-
-func (t *Tree) newString(pos Pos, orig, text string) *StringNode {
-	return &StringNode{tr: t, NodeType: NodeString, Pos: pos, Quoted: orig, Text: text}
-}
-
-func (s *StringNode) String() string {
-	return s.Quoted
-}
-
-func (s *StringNode) tree() *Tree {
-	return s.tr
-}
-
-func (s *StringNode) Copy() Node {
-	return s.tr.newString(s.Pos, s.Quoted, s.Text)
-}
-
-// endNode represents an {{end}} action.
-// It does not appear in the final parse tree.
-type endNode struct {
-	NodeType
-	Pos
-	tr *Tree
-}
-
-func (t *Tree) newEnd(pos Pos) *endNode {
-	return &endNode{tr: t, NodeType: nodeEnd, Pos: pos}
-}
-
-func (e *endNode) String() string {
-	return "{{end}}"
-}
-
-func (e *endNode) tree() *Tree {
-	return e.tr
-}
-
-func (e *endNode) Copy() Node {
-	return e.tr.newEnd(e.Pos)
-}
-
-// elseNode represents an {{else}} action. Does not appear in the final tree.
-type elseNode struct {
-	NodeType
-	Pos
-	tr   *Tree
-	Line int // The line number in the input. Deprecated: Kept for compatibility.
-}
-
-func (t *Tree) newElse(pos Pos, line int) *elseNode {
-	return &elseNode{tr: t, NodeType: nodeElse, Pos: pos, Line: line}
-}
-
-func (e *elseNode) Type() NodeType {
-	return nodeElse
-}
-
-func (e *elseNode) String() string {
-	return "{{else}}"
-}
-
-func (e *elseNode) tree() *Tree {
-	return e.tr
-}
-
-func (e *elseNode) Copy() Node {
-	return e.tr.newElse(e.Pos, e.Line)
-}
-
-// BranchNode is the common representation of if, range, and with.
-type BranchNode struct {
-	NodeType
-	Pos
-	tr       *Tree
-	Line     int       // The line number in the input. Deprecated: Kept for compatibility.
-	Pipe     *PipeNode // The pipeline to be evaluated.
-	List     *ListNode // What to execute if the value is non-empty.
-	ElseList *ListNode // What to execute if the value is empty (nil if absent).
-}
-
-func (b *BranchNode) String() string {
-	name := ""
-	switch b.NodeType {
-	case NodeIf:
-		name = "if"
-	case NodeRange:
-		name = "range"
-	case NodeWith:
-		name = "with"
-	default:
-		panic("unknown branch type")
-	}
-	if b.ElseList != nil {
-		return fmt.Sprintf("{{%s %s}}%s{{else}}%s{{end}}", name, b.Pipe, b.List, b.ElseList)
-	}
-	return fmt.Sprintf("{{%s %s}}%s{{end}}", name, b.Pipe, b.List)
-}
-
-func (b *BranchNode) tree() *Tree {
-	return b.tr
-}
-
-func (b *BranchNode) Copy() Node {
-	switch b.NodeType {
-	case NodeIf:
-		return b.tr.newIf(b.Pos, b.Line, b.Pipe, b.List, b.ElseList)
-	case NodeRange:
-		return b.tr.newRange(b.Pos, b.Line, b.Pipe, b.List, b.ElseList)
-	case NodeWith:
-		return b.tr.newWith(b.Pos, b.Line, b.Pipe, b.List, b.ElseList)
-	default:
-		panic("unknown branch type")
-	}
-}
-
-// IfNode represents an {{if}} action and its commands.
-type IfNode struct {
-	BranchNode
-}
-
-func (t *Tree) newIf(pos Pos, line int, pipe *PipeNode, list, elseList *ListNode) *IfNode {
-	return &IfNode{BranchNode{tr: t, NodeType: NodeIf, Pos: pos, Line: line, Pipe: pipe, List: list, ElseList: elseList}}
-}
-
-func (i *IfNode) Copy() Node {
-	return i.tr.newIf(i.Pos, i.Line, i.Pipe.CopyPipe(), i.List.CopyList(), i.ElseList.CopyList())
-}
-
-// RangeNode represents a {{range}} action and its commands.
-type RangeNode struct {
-	BranchNode
-}
-
-func (t *Tree) newRange(pos Pos, line int, pipe *PipeNode, list, elseList *ListNode) *RangeNode {
-	return &RangeNode{BranchNode{tr: t, NodeType: NodeRange, Pos: pos, Line: line, Pipe: pipe, List: list, ElseList: elseList}}
-}
-
-func (r *RangeNode) Copy() Node {
-	return r.tr.newRange(r.Pos, r.Line, r.Pipe.CopyPipe(), r.List.CopyList(), r.ElseList.CopyList())
-}
-
-// WithNode represents a {{with}} action and its commands.
-type WithNode struct {
-	BranchNode
-}
-
-func (t *Tree) newWith(pos Pos, line int, pipe *PipeNode, list, elseList *ListNode) *WithNode {
-	return &WithNode{BranchNode{tr: t, NodeType: NodeWith, Pos: pos, Line: line, Pipe: pipe, List: list, ElseList: elseList}}
-}
-
-func (w *WithNode) Copy() Node {
-	return w.tr.newWith(w.Pos, w.Line, w.Pipe.CopyPipe(), w.List.CopyList(), w.ElseList.CopyList())
-}
-
-// TemplateNode represents a {{template}} action.
-type TemplateNode struct {
-	NodeType
-	Pos
-	tr   *Tree
-	Line int       // The line number in the input. Deprecated: Kept for compatibility.
-	Name string    // The name of the template (unquoted).
-	Pipe *PipeNode // The command to evaluate as dot for the template.
-}
-
-func (t *Tree) newTemplate(pos Pos, line int, name string, pipe *PipeNode) *TemplateNode {
-	return &TemplateNode{tr: t, NodeType: NodeTemplate, Pos: pos, Line: line, Name: name, Pipe: pipe}
-}
-
-func (t *TemplateNode) String() string {
-	if t.Pipe == nil {
-		return fmt.Sprintf("{{template %q}}", t.Name)
-	}
-	return fmt.Sprintf("{{template %q %s}}", t.Name, t.Pipe)
-}
-
-func (t *TemplateNode) tree() *Tree {
-	return t.tr
-}
-
-func (t *TemplateNode) Copy() Node {
-	return t.tr.newTemplate(t.Pos, t.Line, t.Name, t.Pipe.CopyPipe())
-}
diff --git a/third_party/gofrontend/libgo/go/text/template/parse/parse.go b/third_party/gofrontend/libgo/go/text/template/parse/parse.go
deleted file mode 100644
index 88aacd1..0000000
--- a/third_party/gofrontend/libgo/go/text/template/parse/parse.go
+++ /dev/null
@@ -1,696 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package parse builds parse trees for templates as defined by text/template
-// and html/template. Clients should use those packages to construct templates
-// rather than this one, which provides shared internal data structures not
-// intended for general use.
-package parse
-
-import (
-	"bytes"
-	"fmt"
-	"runtime"
-	"strconv"
-	"strings"
-)
-
-// Tree is the representation of a single parsed template.
-type Tree struct {
-	Name      string    // name of the template represented by the tree.
-	ParseName string    // name of the top-level template during parsing, for error messages.
-	Root      *ListNode // top-level root of the tree.
-	text      string    // text parsed to create the template (or its parent)
-	// Parsing only; cleared after parse.
-	funcs     []map[string]interface{}
-	lex       *lexer
-	token     [3]item // three-token lookahead for parser.
-	peekCount int
-	vars      []string // variables defined at the moment.
-}
-
-// Copy returns a copy of the Tree. Any parsing state is discarded.
-func (t *Tree) Copy() *Tree {
-	if t == nil {
-		return nil
-	}
-	return &Tree{
-		Name:      t.Name,
-		ParseName: t.ParseName,
-		Root:      t.Root.CopyList(),
-		text:      t.text,
-	}
-}
-
-// Parse returns a map from template name to parse.Tree, created by parsing the
-// templates described in the argument string. The top-level template will be
-// given the specified name. If an error is encountered, parsing stops and an
-// empty map is returned with the error.
-func Parse(name, text, leftDelim, rightDelim string, funcs ...map[string]interface{}) (treeSet map[string]*Tree, err error) {
-	treeSet = make(map[string]*Tree)
-	t := New(name)
-	t.text = text
-	_, err = t.Parse(text, leftDelim, rightDelim, treeSet, funcs...)
-	return
-}
-
-// next returns the next token.
-func (t *Tree) next() item {
-	if t.peekCount > 0 {
-		t.peekCount--
-	} else {
-		t.token[0] = t.lex.nextItem()
-	}
-	return t.token[t.peekCount]
-}
-
-// backup backs the input stream up one token.
-func (t *Tree) backup() {
-	t.peekCount++
-}
-
-// backup2 backs the input stream up two tokens.
-// The zeroth token is already there.
-func (t *Tree) backup2(t1 item) {
-	t.token[1] = t1
-	t.peekCount = 2
-}
-
-// backup3 backs the input stream up three tokens
-// The zeroth token is already there.
-func (t *Tree) backup3(t2, t1 item) { // Reverse order: we're pushing back.
-	t.token[1] = t1
-	t.token[2] = t2
-	t.peekCount = 3
-}
-
-// peek returns but does not consume the next token.
-func (t *Tree) peek() item {
-	if t.peekCount > 0 {
-		return t.token[t.peekCount-1]
-	}
-	t.peekCount = 1
-	t.token[0] = t.lex.nextItem()
-	return t.token[0]
-}
-
-// nextNonSpace returns the next non-space token.
-func (t *Tree) nextNonSpace() (token item) {
-	for {
-		token = t.next()
-		if token.typ != itemSpace {
-			break
-		}
-	}
-	return token
-}
-
-// peekNonSpace returns but does not consume the next non-space token.
-func (t *Tree) peekNonSpace() (token item) {
-	for {
-		token = t.next()
-		if token.typ != itemSpace {
-			break
-		}
-	}
-	t.backup()
-	return token
-}
-
-// Parsing.
-
-// New allocates a new parse tree with the given name.
-func New(name string, funcs ...map[string]interface{}) *Tree {
-	return &Tree{
-		Name:  name,
-		funcs: funcs,
-	}
-}
-
-// ErrorContext returns a textual representation of the location of the node in the input text.
-// The receiver is only used when the node does not have a pointer to the tree inside,
-// which can occur in old code.
-func (t *Tree) ErrorContext(n Node) (location, context string) {
-	pos := int(n.Position())
-	tree := n.tree()
-	if tree == nil {
-		tree = t
-	}
-	text := tree.text[:pos]
-	byteNum := strings.LastIndex(text, "\n")
-	if byteNum == -1 {
-		byteNum = pos // On first line.
-	} else {
-		byteNum++ // After the newline.
-		byteNum = pos - byteNum
-	}
-	lineNum := 1 + strings.Count(text, "\n")
-	context = n.String()
-	if len(context) > 20 {
-		context = fmt.Sprintf("%.20s...", context)
-	}
-	return fmt.Sprintf("%s:%d:%d", tree.ParseName, lineNum, byteNum), context
-}
-
-// errorf formats the error and terminates processing.
-func (t *Tree) errorf(format string, args ...interface{}) {
-	t.Root = nil
-	format = fmt.Sprintf("template: %s:%d: %s", t.ParseName, t.lex.lineNumber(), format)
-	panic(fmt.Errorf(format, args...))
-}
-
-// error terminates processing.
-func (t *Tree) error(err error) {
-	t.errorf("%s", err)
-}
-
-// expect consumes the next token and guarantees it has the required type.
-func (t *Tree) expect(expected itemType, context string) item {
-	token := t.nextNonSpace()
-	if token.typ != expected {
-		t.unexpected(token, context)
-	}
-	return token
-}
-
-// expectOneOf consumes the next token and guarantees it has one of the required types.
-func (t *Tree) expectOneOf(expected1, expected2 itemType, context string) item {
-	token := t.nextNonSpace()
-	if token.typ != expected1 && token.typ != expected2 {
-		t.unexpected(token, context)
-	}
-	return token
-}
-
-// unexpected complains about the token and terminates processing.
-func (t *Tree) unexpected(token item, context string) {
-	t.errorf("unexpected %s in %s", token, context)
-}
-
-// recover is the handler that turns panics into returns from the top level of Parse.
-func (t *Tree) recover(errp *error) {
-	e := recover()
-	if e != nil {
-		if _, ok := e.(runtime.Error); ok {
-			panic(e)
-		}
-		if t != nil {
-			t.lex.drain()
-			t.stopParse()
-		}
-		*errp = e.(error)
-	}
-	return
-}
-
-// startParse initializes the parser, using the lexer.
-func (t *Tree) startParse(funcs []map[string]interface{}, lex *lexer) {
-	t.Root = nil
-	t.lex = lex
-	t.vars = []string{"$"}
-	t.funcs = funcs
-}
-
-// stopParse terminates parsing.
-func (t *Tree) stopParse() {
-	t.lex = nil
-	t.vars = nil
-	t.funcs = nil
-}
-
-// Parse parses the template definition string to construct a representation of
-// the template for execution. If either action delimiter string is empty, the
-// default ("{{" or "}}") is used. Embedded template definitions are added to
-// the treeSet map.
-func (t *Tree) Parse(text, leftDelim, rightDelim string, treeSet map[string]*Tree, funcs ...map[string]interface{}) (tree *Tree, err error) {
-	defer t.recover(&err)
-	t.ParseName = t.Name
-	t.startParse(funcs, lex(t.Name, text, leftDelim, rightDelim))
-	t.text = text
-	t.parse(treeSet)
-	t.add(treeSet)
-	t.stopParse()
-	return t, nil
-}
-
-// add adds tree to the treeSet.
-func (t *Tree) add(treeSet map[string]*Tree) {
-	tree := treeSet[t.Name]
-	if tree == nil || IsEmptyTree(tree.Root) {
-		treeSet[t.Name] = t
-		return
-	}
-	if !IsEmptyTree(t.Root) {
-		t.errorf("template: multiple definition of template %q", t.Name)
-	}
-}
-
-// IsEmptyTree reports whether this tree (node) is empty of everything but space.
-func IsEmptyTree(n Node) bool {
-	switch n := n.(type) {
-	case nil:
-		return true
-	case *ActionNode:
-	case *IfNode:
-	case *ListNode:
-		for _, node := range n.Nodes {
-			if !IsEmptyTree(node) {
-				return false
-			}
-		}
-		return true
-	case *RangeNode:
-	case *TemplateNode:
-	case *TextNode:
-		return len(bytes.TrimSpace(n.Text)) == 0
-	case *WithNode:
-	default:
-		panic("unknown node: " + n.String())
-	}
-	return false
-}
-
-// parse is the top-level parser for a template, essentially the same
-// as itemList except it also parses {{define}} actions.
-// It runs to EOF.
-func (t *Tree) parse(treeSet map[string]*Tree) (next Node) {
-	t.Root = t.newList(t.peek().pos)
-	for t.peek().typ != itemEOF {
-		if t.peek().typ == itemLeftDelim {
-			delim := t.next()
-			if t.nextNonSpace().typ == itemDefine {
-				newT := New("definition") // name will be updated once we know it.
-				newT.text = t.text
-				newT.ParseName = t.ParseName
-				newT.startParse(t.funcs, t.lex)
-				newT.parseDefinition(treeSet)
-				continue
-			}
-			t.backup2(delim)
-		}
-		switch n := t.textOrAction(); n.Type() {
-		case nodeEnd, nodeElse:
-			t.errorf("unexpected %s", n)
-		default:
-			t.Root.append(n)
-		}
-	}
-	return nil
-}
-
-// parseDefinition parses a {{define}} ...  {{end}} template definition and
-// installs the definition in the treeSet map.  The "define" keyword has already
-// been scanned.
-func (t *Tree) parseDefinition(treeSet map[string]*Tree) {
-	const context = "define clause"
-	name := t.expectOneOf(itemString, itemRawString, context)
-	var err error
-	t.Name, err = strconv.Unquote(name.val)
-	if err != nil {
-		t.error(err)
-	}
-	t.expect(itemRightDelim, context)
-	var end Node
-	t.Root, end = t.itemList()
-	if end.Type() != nodeEnd {
-		t.errorf("unexpected %s in %s", end, context)
-	}
-	t.add(treeSet)
-	t.stopParse()
-}
-
-// itemList:
-//	textOrAction*
-// Terminates at {{end}} or {{else}}, returned separately.
-func (t *Tree) itemList() (list *ListNode, next Node) {
-	list = t.newList(t.peekNonSpace().pos)
-	for t.peekNonSpace().typ != itemEOF {
-		n := t.textOrAction()
-		switch n.Type() {
-		case nodeEnd, nodeElse:
-			return list, n
-		}
-		list.append(n)
-	}
-	t.errorf("unexpected EOF")
-	return
-}
-
-// textOrAction:
-//	text | action
-func (t *Tree) textOrAction() Node {
-	switch token := t.nextNonSpace(); token.typ {
-	case itemText:
-		return t.newText(token.pos, token.val)
-	case itemLeftDelim:
-		return t.action()
-	default:
-		t.unexpected(token, "input")
-	}
-	return nil
-}
-
-// Action:
-//	control
-//	command ("|" command)*
-// Left delim is past. Now get actions.
-// First word could be a keyword such as range.
-func (t *Tree) action() (n Node) {
-	switch token := t.nextNonSpace(); token.typ {
-	case itemElse:
-		return t.elseControl()
-	case itemEnd:
-		return t.endControl()
-	case itemIf:
-		return t.ifControl()
-	case itemRange:
-		return t.rangeControl()
-	case itemTemplate:
-		return t.templateControl()
-	case itemWith:
-		return t.withControl()
-	}
-	t.backup()
-	// Do not pop variables; they persist until "end".
-	return t.newAction(t.peek().pos, t.lex.lineNumber(), t.pipeline("command"))
-}
-
-// Pipeline:
-//	declarations? command ('|' command)*
-func (t *Tree) pipeline(context string) (pipe *PipeNode) {
-	var decl []*VariableNode
-	pos := t.peekNonSpace().pos
-	// Are there declarations?
-	for {
-		if v := t.peekNonSpace(); v.typ == itemVariable {
-			t.next()
-			// Since space is a token, we need 3-token look-ahead here in the worst case:
-			// in "$x foo" we need to read "foo" (as opposed to ":=") to know that $x is an
-			// argument variable rather than a declaration. So remember the token
-			// adjacent to the variable so we can push it back if necessary.
-			tokenAfterVariable := t.peek()
-			if next := t.peekNonSpace(); next.typ == itemColonEquals || (next.typ == itemChar && next.val == ",") {
-				t.nextNonSpace()
-				variable := t.newVariable(v.pos, v.val)
-				decl = append(decl, variable)
-				t.vars = append(t.vars, v.val)
-				if next.typ == itemChar && next.val == "," {
-					if context == "range" && len(decl) < 2 {
-						continue
-					}
-					t.errorf("too many declarations in %s", context)
-				}
-			} else if tokenAfterVariable.typ == itemSpace {
-				t.backup3(v, tokenAfterVariable)
-			} else {
-				t.backup2(v)
-			}
-		}
-		break
-	}
-	pipe = t.newPipeline(pos, t.lex.lineNumber(), decl)
-	for {
-		switch token := t.nextNonSpace(); token.typ {
-		case itemRightDelim, itemRightParen:
-			// At this point, the pipeline is complete
-			t.checkPipeline(pipe, context)
-			if token.typ == itemRightParen {
-				t.backup()
-			}
-			return
-		case itemBool, itemCharConstant, itemComplex, itemDot, itemField, itemIdentifier,
-			itemNumber, itemNil, itemRawString, itemString, itemVariable, itemLeftParen:
-			t.backup()
-			pipe.append(t.command())
-		default:
-			t.unexpected(token, context)
-		}
-	}
-}
-
-func (t *Tree) checkPipeline(pipe *PipeNode, context string) {
-	// Reject empty pipelines
-	if len(pipe.Cmds) == 0 {
-		t.errorf("missing value for %s", context)
-	}
-	// Only the first command of a pipeline can start with a non executable operand
-	for i, c := range pipe.Cmds[1:] {
-		switch c.Args[0].Type() {
-		case NodeBool, NodeDot, NodeNil, NodeNumber, NodeString:
-			// With A|B|C, pipeline stage 2 is B
-			t.errorf("non executable command in pipeline stage %d", i+2)
-		}
-	}
-}
-
-func (t *Tree) parseControl(allowElseIf bool, context string) (pos Pos, line int, pipe *PipeNode, list, elseList *ListNode) {
-	defer t.popVars(len(t.vars))
-	line = t.lex.lineNumber()
-	pipe = t.pipeline(context)
-	var next Node
-	list, next = t.itemList()
-	switch next.Type() {
-	case nodeEnd: //done
-	case nodeElse:
-		if allowElseIf {
-			// Special case for "else if". If the "else" is followed immediately by an "if",
-			// the elseControl will have left the "if" token pending. Treat
-			//	{{if a}}_{{else if b}}_{{end}}
-			// as
-			//	{{if a}}_{{else}}{{if b}}_{{end}}{{end}}.
-			// To do this, parse the if as usual and stop at it {{end}}; the subsequent{{end}}
-			// is assumed. This technique works even for long if-else-if chains.
-			// TODO: Should we allow else-if in with and range?
-			if t.peek().typ == itemIf {
-				t.next() // Consume the "if" token.
-				elseList = t.newList(next.Position())
-				elseList.append(t.ifControl())
-				// Do not consume the next item - only one {{end}} required.
-				break
-			}
-		}
-		elseList, next = t.itemList()
-		if next.Type() != nodeEnd {
-			t.errorf("expected end; found %s", next)
-		}
-	}
-	return pipe.Position(), line, pipe, list, elseList
-}
-
-// If:
-//	{{if pipeline}} itemList {{end}}
-//	{{if pipeline}} itemList {{else}} itemList {{end}}
-// If keyword is past.
-func (t *Tree) ifControl() Node {
-	return t.newIf(t.parseControl(true, "if"))
-}
-
-// Range:
-//	{{range pipeline}} itemList {{end}}
-//	{{range pipeline}} itemList {{else}} itemList {{end}}
-// Range keyword is past.
-func (t *Tree) rangeControl() Node {
-	return t.newRange(t.parseControl(false, "range"))
-}
-
-// With:
-//	{{with pipeline}} itemList {{end}}
-//	{{with pipeline}} itemList {{else}} itemList {{end}}
-// If keyword is past.
-func (t *Tree) withControl() Node {
-	return t.newWith(t.parseControl(false, "with"))
-}
-
-// End:
-//	{{end}}
-// End keyword is past.
-func (t *Tree) endControl() Node {
-	return t.newEnd(t.expect(itemRightDelim, "end").pos)
-}
-
-// Else:
-//	{{else}}
-// Else keyword is past.
-func (t *Tree) elseControl() Node {
-	// Special case for "else if".
-	peek := t.peekNonSpace()
-	if peek.typ == itemIf {
-		// We see "{{else if ... " but in effect rewrite it to {{else}}{{if ... ".
-		return t.newElse(peek.pos, t.lex.lineNumber())
-	}
-	return t.newElse(t.expect(itemRightDelim, "else").pos, t.lex.lineNumber())
-}
-
-// Template:
-//	{{template stringValue pipeline}}
-// Template keyword is past.  The name must be something that can evaluate
-// to a string.
-func (t *Tree) templateControl() Node {
-	var name string
-	token := t.nextNonSpace()
-	switch token.typ {
-	case itemString, itemRawString:
-		s, err := strconv.Unquote(token.val)
-		if err != nil {
-			t.error(err)
-		}
-		name = s
-	default:
-		t.unexpected(token, "template invocation")
-	}
-	var pipe *PipeNode
-	if t.nextNonSpace().typ != itemRightDelim {
-		t.backup()
-		// Do not pop variables; they persist until "end".
-		pipe = t.pipeline("template")
-	}
-	return t.newTemplate(token.pos, t.lex.lineNumber(), name, pipe)
-}
-
-// command:
-//	operand (space operand)*
-// space-separated arguments up to a pipeline character or right delimiter.
-// we consume the pipe character but leave the right delim to terminate the action.
-func (t *Tree) command() *CommandNode {
-	cmd := t.newCommand(t.peekNonSpace().pos)
-	for {
-		t.peekNonSpace() // skip leading spaces.
-		operand := t.operand()
-		if operand != nil {
-			cmd.append(operand)
-		}
-		switch token := t.next(); token.typ {
-		case itemSpace:
-			continue
-		case itemError:
-			t.errorf("%s", token.val)
-		case itemRightDelim, itemRightParen:
-			t.backup()
-		case itemPipe:
-		default:
-			t.errorf("unexpected %s in operand", token)
-		}
-		break
-	}
-	if len(cmd.Args) == 0 {
-		t.errorf("empty command")
-	}
-	return cmd
-}
-
-// operand:
-//	term .Field*
-// An operand is a space-separated component of a command,
-// a term possibly followed by field accesses.
-// A nil return means the next item is not an operand.
-func (t *Tree) operand() Node {
-	node := t.term()
-	if node == nil {
-		return nil
-	}
-	if t.peek().typ == itemField {
-		chain := t.newChain(t.peek().pos, node)
-		for t.peek().typ == itemField {
-			chain.Add(t.next().val)
-		}
-		// Compatibility with original API: If the term is of type NodeField
-		// or NodeVariable, just put more fields on the original.
-		// Otherwise, keep the Chain node.
-		// Obvious parsing errors involving literal values are detected here.
-		// More complex error cases will have to be handled at execution time.
-		switch node.Type() {
-		case NodeField:
-			node = t.newField(chain.Position(), chain.String())
-		case NodeVariable:
-			node = t.newVariable(chain.Position(), chain.String())
-		case NodeBool, NodeString, NodeNumber, NodeNil, NodeDot:
-			t.errorf("unexpected . after term %q", node.String())
-		default:
-			node = chain
-		}
-	}
-	return node
-}
-
-// term:
-//	literal (number, string, nil, boolean)
-//	function (identifier)
-//	.
-//	.Field
-//	$
-//	'(' pipeline ')'
-// A term is a simple "expression".
-// A nil return means the next item is not a term.
-func (t *Tree) term() Node {
-	switch token := t.nextNonSpace(); token.typ {
-	case itemError:
-		t.errorf("%s", token.val)
-	case itemIdentifier:
-		if !t.hasFunction(token.val) {
-			t.errorf("function %q not defined", token.val)
-		}
-		return NewIdentifier(token.val).SetTree(t).SetPos(token.pos)
-	case itemDot:
-		return t.newDot(token.pos)
-	case itemNil:
-		return t.newNil(token.pos)
-	case itemVariable:
-		return t.useVar(token.pos, token.val)
-	case itemField:
-		return t.newField(token.pos, token.val)
-	case itemBool:
-		return t.newBool(token.pos, token.val == "true")
-	case itemCharConstant, itemComplex, itemNumber:
-		number, err := t.newNumber(token.pos, token.val, token.typ)
-		if err != nil {
-			t.error(err)
-		}
-		return number
-	case itemLeftParen:
-		pipe := t.pipeline("parenthesized pipeline")
-		if token := t.next(); token.typ != itemRightParen {
-			t.errorf("unclosed right paren: unexpected %s", token)
-		}
-		return pipe
-	case itemString, itemRawString:
-		s, err := strconv.Unquote(token.val)
-		if err != nil {
-			t.error(err)
-		}
-		return t.newString(token.pos, token.val, s)
-	}
-	t.backup()
-	return nil
-}
-
-// hasFunction reports if a function name exists in the Tree's maps.
-func (t *Tree) hasFunction(name string) bool {
-	for _, funcMap := range t.funcs {
-		if funcMap == nil {
-			continue
-		}
-		if funcMap[name] != nil {
-			return true
-		}
-	}
-	return false
-}
-
-// popVars trims the variable list to the specified length
-func (t *Tree) popVars(n int) {
-	t.vars = t.vars[:n]
-}
-
-// useVar returns a node for a variable reference. It errors if the
-// variable is not defined.
-func (t *Tree) useVar(pos Pos, name string) Node {
-	v := t.newVariable(pos, name)
-	for _, varName := range t.vars {
-		if varName == v.Ident[0] {
-			return v
-		}
-	}
-	t.errorf("undefined variable %q", v.Ident[0])
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/text/template/parse/parse_test.go b/third_party/gofrontend/libgo/go/text/template/parse/parse_test.go
deleted file mode 100644
index 200d50c..0000000
--- a/third_party/gofrontend/libgo/go/text/template/parse/parse_test.go
+++ /dev/null
@@ -1,452 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package parse
-
-import (
-	"flag"
-	"fmt"
-	"strings"
-	"testing"
-)
-
-var debug = flag.Bool("debug", false, "show the errors produced by the main tests")
-
-type numberTest struct {
-	text      string
-	isInt     bool
-	isUint    bool
-	isFloat   bool
-	isComplex bool
-	int64
-	uint64
-	float64
-	complex128
-}
-
-var numberTests = []numberTest{
-	// basics
-	{"0", true, true, true, false, 0, 0, 0, 0},
-	{"-0", true, true, true, false, 0, 0, 0, 0}, // check that -0 is a uint.
-	{"73", true, true, true, false, 73, 73, 73, 0},
-	{"073", true, true, true, false, 073, 073, 073, 0},
-	{"0x73", true, true, true, false, 0x73, 0x73, 0x73, 0},
-	{"-73", true, false, true, false, -73, 0, -73, 0},
-	{"+73", true, false, true, false, 73, 0, 73, 0},
-	{"100", true, true, true, false, 100, 100, 100, 0},
-	{"1e9", true, true, true, false, 1e9, 1e9, 1e9, 0},
-	{"-1e9", true, false, true, false, -1e9, 0, -1e9, 0},
-	{"-1.2", false, false, true, false, 0, 0, -1.2, 0},
-	{"1e19", false, true, true, false, 0, 1e19, 1e19, 0},
-	{"-1e19", false, false, true, false, 0, 0, -1e19, 0},
-	{"4i", false, false, false, true, 0, 0, 0, 4i},
-	{"-1.2+4.2i", false, false, false, true, 0, 0, 0, -1.2 + 4.2i},
-	{"073i", false, false, false, true, 0, 0, 0, 73i}, // not octal!
-	// complex with 0 imaginary are float (and maybe integer)
-	{"0i", true, true, true, true, 0, 0, 0, 0},
-	{"-1.2+0i", false, false, true, true, 0, 0, -1.2, -1.2},
-	{"-12+0i", true, false, true, true, -12, 0, -12, -12},
-	{"13+0i", true, true, true, true, 13, 13, 13, 13},
-	// funny bases
-	{"0123", true, true, true, false, 0123, 0123, 0123, 0},
-	{"-0x0", true, true, true, false, 0, 0, 0, 0},
-	{"0xdeadbeef", true, true, true, false, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0},
-	// character constants
-	{`'a'`, true, true, true, false, 'a', 'a', 'a', 0},
-	{`'\n'`, true, true, true, false, '\n', '\n', '\n', 0},
-	{`'\\'`, true, true, true, false, '\\', '\\', '\\', 0},
-	{`'\''`, true, true, true, false, '\'', '\'', '\'', 0},
-	{`'\xFF'`, true, true, true, false, 0xFF, 0xFF, 0xFF, 0},
-	{`'パ'`, true, true, true, false, 0x30d1, 0x30d1, 0x30d1, 0},
-	{`'\u30d1'`, true, true, true, false, 0x30d1, 0x30d1, 0x30d1, 0},
-	{`'\U000030d1'`, true, true, true, false, 0x30d1, 0x30d1, 0x30d1, 0},
-	// some broken syntax
-	{text: "+-2"},
-	{text: "0x123."},
-	{text: "1e."},
-	{text: "0xi."},
-	{text: "1+2."},
-	{text: "'x"},
-	{text: "'xx'"},
-	{text: "'433937734937734969526500969526500'"}, // Integer too large - issue 10634.
-	// Issue 8622 - 0xe parsed as floating point. Very embarrassing.
-	{"0xef", true, true, true, false, 0xef, 0xef, 0xef, 0},
-}
-
-func TestNumberParse(t *testing.T) {
-	for _, test := range numberTests {
-		// If fmt.Sscan thinks it's complex, it's complex.  We can't trust the output
-		// because imaginary comes out as a number.
-		var c complex128
-		typ := itemNumber
-		var tree *Tree
-		if test.text[0] == '\'' {
-			typ = itemCharConstant
-		} else {
-			_, err := fmt.Sscan(test.text, &c)
-			if err == nil {
-				typ = itemComplex
-			}
-		}
-		n, err := tree.newNumber(0, test.text, typ)
-		ok := test.isInt || test.isUint || test.isFloat || test.isComplex
-		if ok && err != nil {
-			t.Errorf("unexpected error for %q: %s", test.text, err)
-			continue
-		}
-		if !ok && err == nil {
-			t.Errorf("expected error for %q", test.text)
-			continue
-		}
-		if !ok {
-			if *debug {
-				fmt.Printf("%s\n\t%s\n", test.text, err)
-			}
-			continue
-		}
-		if n.IsComplex != test.isComplex {
-			t.Errorf("complex incorrect for %q; should be %t", test.text, test.isComplex)
-		}
-		if test.isInt {
-			if !n.IsInt {
-				t.Errorf("expected integer for %q", test.text)
-			}
-			if n.Int64 != test.int64 {
-				t.Errorf("int64 for %q should be %d Is %d", test.text, test.int64, n.Int64)
-			}
-		} else if n.IsInt {
-			t.Errorf("did not expect integer for %q", test.text)
-		}
-		if test.isUint {
-			if !n.IsUint {
-				t.Errorf("expected unsigned integer for %q", test.text)
-			}
-			if n.Uint64 != test.uint64 {
-				t.Errorf("uint64 for %q should be %d Is %d", test.text, test.uint64, n.Uint64)
-			}
-		} else if n.IsUint {
-			t.Errorf("did not expect unsigned integer for %q", test.text)
-		}
-		if test.isFloat {
-			if !n.IsFloat {
-				t.Errorf("expected float for %q", test.text)
-			}
-			if n.Float64 != test.float64 {
-				t.Errorf("float64 for %q should be %g Is %g", test.text, test.float64, n.Float64)
-			}
-		} else if n.IsFloat {
-			t.Errorf("did not expect float for %q", test.text)
-		}
-		if test.isComplex {
-			if !n.IsComplex {
-				t.Errorf("expected complex for %q", test.text)
-			}
-			if n.Complex128 != test.complex128 {
-				t.Errorf("complex128 for %q should be %g Is %g", test.text, test.complex128, n.Complex128)
-			}
-		} else if n.IsComplex {
-			t.Errorf("did not expect complex for %q", test.text)
-		}
-	}
-}
-
-type parseTest struct {
-	name   string
-	input  string
-	ok     bool
-	result string // what the user would see in an error message.
-}
-
-const (
-	noError  = true
-	hasError = false
-)
-
-var parseTests = []parseTest{
-	{"empty", "", noError,
-		``},
-	{"comment", "{{/*\n\n\n*/}}", noError,
-		``},
-	{"spaces", " \t\n", noError,
-		`" \t\n"`},
-	{"text", "some text", noError,
-		`"some text"`},
-	{"emptyAction", "{{}}", hasError,
-		`{{}}`},
-	{"field", "{{.X}}", noError,
-		`{{.X}}`},
-	{"simple command", "{{printf}}", noError,
-		`{{printf}}`},
-	{"$ invocation", "{{$}}", noError,
-		"{{$}}"},
-	{"variable invocation", "{{with $x := 3}}{{$x 23}}{{end}}", noError,
-		"{{with $x := 3}}{{$x 23}}{{end}}"},
-	{"variable with fields", "{{$.I}}", noError,
-		"{{$.I}}"},
-	{"multi-word command", "{{printf `%d` 23}}", noError,
-		"{{printf `%d` 23}}"},
-	{"pipeline", "{{.X|.Y}}", noError,
-		`{{.X | .Y}}`},
-	{"pipeline with decl", "{{$x := .X|.Y}}", noError,
-		`{{$x := .X | .Y}}`},
-	{"nested pipeline", "{{.X (.Y .Z) (.A | .B .C) (.E)}}", noError,
-		`{{.X (.Y .Z) (.A | .B .C) (.E)}}`},
-	{"field applied to parentheses", "{{(.Y .Z).Field}}", noError,
-		`{{(.Y .Z).Field}}`},
-	{"simple if", "{{if .X}}hello{{end}}", noError,
-		`{{if .X}}"hello"{{end}}`},
-	{"if with else", "{{if .X}}true{{else}}false{{end}}", noError,
-		`{{if .X}}"true"{{else}}"false"{{end}}`},
-	{"if with else if", "{{if .X}}true{{else if .Y}}false{{end}}", noError,
-		`{{if .X}}"true"{{else}}{{if .Y}}"false"{{end}}{{end}}`},
-	{"if else chain", "+{{if .X}}X{{else if .Y}}Y{{else if .Z}}Z{{end}}+", noError,
-		`"+"{{if .X}}"X"{{else}}{{if .Y}}"Y"{{else}}{{if .Z}}"Z"{{end}}{{end}}{{end}}"+"`},
-	{"simple range", "{{range .X}}hello{{end}}", noError,
-		`{{range .X}}"hello"{{end}}`},
-	{"chained field range", "{{range .X.Y.Z}}hello{{end}}", noError,
-		`{{range .X.Y.Z}}"hello"{{end}}`},
-	{"nested range", "{{range .X}}hello{{range .Y}}goodbye{{end}}{{end}}", noError,
-		`{{range .X}}"hello"{{range .Y}}"goodbye"{{end}}{{end}}`},
-	{"range with else", "{{range .X}}true{{else}}false{{end}}", noError,
-		`{{range .X}}"true"{{else}}"false"{{end}}`},
-	{"range over pipeline", "{{range .X|.M}}true{{else}}false{{end}}", noError,
-		`{{range .X | .M}}"true"{{else}}"false"{{end}}`},
-	{"range []int", "{{range .SI}}{{.}}{{end}}", noError,
-		`{{range .SI}}{{.}}{{end}}`},
-	{"range 1 var", "{{range $x := .SI}}{{.}}{{end}}", noError,
-		`{{range $x := .SI}}{{.}}{{end}}`},
-	{"range 2 vars", "{{range $x, $y := .SI}}{{.}}{{end}}", noError,
-		`{{range $x, $y := .SI}}{{.}}{{end}}`},
-	{"constants", "{{range .SI 1 -3.2i true false 'a' nil}}{{end}}", noError,
-		`{{range .SI 1 -3.2i true false 'a' nil}}{{end}}`},
-	{"template", "{{template `x`}}", noError,
-		`{{template "x"}}`},
-	{"template with arg", "{{template `x` .Y}}", noError,
-		`{{template "x" .Y}}`},
-	{"with", "{{with .X}}hello{{end}}", noError,
-		`{{with .X}}"hello"{{end}}`},
-	{"with with else", "{{with .X}}hello{{else}}goodbye{{end}}", noError,
-		`{{with .X}}"hello"{{else}}"goodbye"{{end}}`},
-	// Errors.
-	{"unclosed action", "hello{{range", hasError, ""},
-	{"unmatched end", "{{end}}", hasError, ""},
-	{"unmatched else", "{{else}}", hasError, ""},
-	{"unmatched else after if", "{{if .X}}hello{{end}}{{else}}", hasError, ""},
-	{"multiple else", "{{if .X}}1{{else}}2{{else}}3{{end}}", hasError, ""},
-	{"missing end", "hello{{range .x}}", hasError, ""},
-	{"missing end after else", "hello{{range .x}}{{else}}", hasError, ""},
-	{"undefined function", "hello{{undefined}}", hasError, ""},
-	{"undefined variable", "{{$x}}", hasError, ""},
-	{"variable undefined after end", "{{with $x := 4}}{{end}}{{$x}}", hasError, ""},
-	{"variable undefined in template", "{{template $v}}", hasError, ""},
-	{"declare with field", "{{with $x.Y := 4}}{{end}}", hasError, ""},
-	{"template with field ref", "{{template .X}}", hasError, ""},
-	{"template with var", "{{template $v}}", hasError, ""},
-	{"invalid punctuation", "{{printf 3, 4}}", hasError, ""},
-	{"multidecl outside range", "{{with $v, $u := 3}}{{end}}", hasError, ""},
-	{"too many decls in range", "{{range $u, $v, $w := 3}}{{end}}", hasError, ""},
-	{"dot applied to parentheses", "{{printf (printf .).}}", hasError, ""},
-	{"adjacent args", "{{printf 3`x`}}", hasError, ""},
-	{"adjacent args with .", "{{printf `x`.}}", hasError, ""},
-	{"extra end after if", "{{if .X}}a{{else if .Y}}b{{end}}{{end}}", hasError, ""},
-	// Equals (and other chars) do not assignments make (yet).
-	{"bug0a", "{{$x := 0}}{{$x}}", noError, "{{$x := 0}}{{$x}}"},
-	{"bug0b", "{{$x = 1}}{{$x}}", hasError, ""},
-	{"bug0c", "{{$x ! 2}}{{$x}}", hasError, ""},
-	{"bug0d", "{{$x % 3}}{{$x}}", hasError, ""},
-	// Check the parse fails for := rather than comma.
-	{"bug0e", "{{range $x := $y := 3}}{{end}}", hasError, ""},
-	// Another bug: variable read must ignore following punctuation.
-	{"bug1a", "{{$x:=.}}{{$x!2}}", hasError, ""},                     // ! is just illegal here.
-	{"bug1b", "{{$x:=.}}{{$x+2}}", hasError, ""},                     // $x+2 should not parse as ($x) (+2).
-	{"bug1c", "{{$x:=.}}{{$x +2}}", noError, "{{$x := .}}{{$x +2}}"}, // It's OK with a space.
-	// dot following a literal value
-	{"dot after integer", "{{1.E}}", hasError, ""},
-	{"dot after float", "{{0.1.E}}", hasError, ""},
-	{"dot after boolean", "{{true.E}}", hasError, ""},
-	{"dot after char", "{{'a'.any}}", hasError, ""},
-	{"dot after string", `{{"hello".guys}}`, hasError, ""},
-	{"dot after dot", "{{..E}}", hasError, ""},
-	{"dot after nil", "{{nil.E}}", hasError, ""},
-	// Wrong pipeline
-	{"wrong pipeline dot", "{{12|.}}", hasError, ""},
-	{"wrong pipeline number", "{{.|12|printf}}", hasError, ""},
-	{"wrong pipeline string", "{{.|printf|\"error\"}}", hasError, ""},
-	{"wrong pipeline char", "{{12|printf|'e'}}", hasError, ""},
-	{"wrong pipeline boolean", "{{.|true}}", hasError, ""},
-	{"wrong pipeline nil", "{{'c'|nil}}", hasError, ""},
-	{"empty pipeline", `{{printf "%d" ( ) }}`, hasError, ""},
-}
-
-var builtins = map[string]interface{}{
-	"printf": fmt.Sprintf,
-}
-
-func testParse(doCopy bool, t *testing.T) {
-	textFormat = "%q"
-	defer func() { textFormat = "%s" }()
-	for _, test := range parseTests {
-		tmpl, err := New(test.name).Parse(test.input, "", "", make(map[string]*Tree), builtins)
-		switch {
-		case err == nil && !test.ok:
-			t.Errorf("%q: expected error; got none", test.name)
-			continue
-		case err != nil && test.ok:
-			t.Errorf("%q: unexpected error: %v", test.name, err)
-			continue
-		case err != nil && !test.ok:
-			// expected error, got one
-			if *debug {
-				fmt.Printf("%s: %s\n\t%s\n", test.name, test.input, err)
-			}
-			continue
-		}
-		var result string
-		if doCopy {
-			result = tmpl.Root.Copy().String()
-		} else {
-			result = tmpl.Root.String()
-		}
-		if result != test.result {
-			t.Errorf("%s=(%q): got\n\t%v\nexpected\n\t%v", test.name, test.input, result, test.result)
-		}
-	}
-}
-
-func TestParse(t *testing.T) {
-	testParse(false, t)
-}
-
-// Same as TestParse, but we copy the node first
-func TestParseCopy(t *testing.T) {
-	testParse(true, t)
-}
-
-type isEmptyTest struct {
-	name  string
-	input string
-	empty bool
-}
-
-var isEmptyTests = []isEmptyTest{
-	{"empty", ``, true},
-	{"nonempty", `hello`, false},
-	{"spaces only", " \t\n \t\n", true},
-	{"definition", `{{define "x"}}something{{end}}`, true},
-	{"definitions and space", "{{define `x`}}something{{end}}\n\n{{define `y`}}something{{end}}\n\n", true},
-	{"definitions and text", "{{define `x`}}something{{end}}\nx\n{{define `y`}}something{{end}}\ny\n", false},
-	{"definition and action", "{{define `x`}}something{{end}}{{if 3}}foo{{end}}", false},
-}
-
-func TestIsEmpty(t *testing.T) {
-	if !IsEmptyTree(nil) {
-		t.Errorf("nil tree is not empty")
-	}
-	for _, test := range isEmptyTests {
-		tree, err := New("root").Parse(test.input, "", "", make(map[string]*Tree), nil)
-		if err != nil {
-			t.Errorf("%q: unexpected error: %v", test.name, err)
-			continue
-		}
-		if empty := IsEmptyTree(tree.Root); empty != test.empty {
-			t.Errorf("%q: expected %t got %t", test.name, test.empty, empty)
-		}
-	}
-}
-
-func TestErrorContextWithTreeCopy(t *testing.T) {
-	tree, err := New("root").Parse("{{if true}}{{end}}", "", "", make(map[string]*Tree), nil)
-	if err != nil {
-		t.Fatalf("unexpected tree parse failure: %v", err)
-	}
-	treeCopy := tree.Copy()
-	wantLocation, wantContext := tree.ErrorContext(tree.Root.Nodes[0])
-	gotLocation, gotContext := treeCopy.ErrorContext(treeCopy.Root.Nodes[0])
-	if wantLocation != gotLocation {
-		t.Errorf("wrong error location want %q got %q", wantLocation, gotLocation)
-	}
-	if wantContext != gotContext {
-		t.Errorf("wrong error location want %q got %q", wantContext, gotContext)
-	}
-}
-
-// All failures, and the result is a string that must appear in the error message.
-var errorTests = []parseTest{
-	// Check line numbers are accurate.
-	{"unclosed1",
-		"line1\n{{",
-		hasError, `unclosed1:2: unexpected unclosed action in command`},
-	{"unclosed2",
-		"line1\n{{define `x`}}line2\n{{",
-		hasError, `unclosed2:3: unexpected unclosed action in command`},
-	// Specific errors.
-	{"function",
-		"{{foo}}",
-		hasError, `function "foo" not defined`},
-	{"comment",
-		"{{/*}}",
-		hasError, `unclosed comment`},
-	{"lparen",
-		"{{.X (1 2 3}}",
-		hasError, `unclosed left paren`},
-	{"rparen",
-		"{{.X 1 2 3)}}",
-		hasError, `unexpected ")"`},
-	{"space",
-		"{{`x`3}}",
-		hasError, `in operand`},
-	{"idchar",
-		"{{a#}}",
-		hasError, `'#'`},
-	{"charconst",
-		"{{'a}}",
-		hasError, `unterminated character constant`},
-	{"stringconst",
-		`{{"a}}`,
-		hasError, `unterminated quoted string`},
-	{"rawstringconst",
-		"{{`a}}",
-		hasError, `unterminated raw quoted string`},
-	{"number",
-		"{{0xi}}",
-		hasError, `number syntax`},
-	{"multidefine",
-		"{{define `a`}}a{{end}}{{define `a`}}b{{end}}",
-		hasError, `multiple definition of template`},
-	{"eof",
-		"{{range .X}}",
-		hasError, `unexpected EOF`},
-	{"variable",
-		// Declare $x so it's defined, to avoid that error, and then check we don't parse a declaration.
-		"{{$x := 23}}{{with $x.y := 3}}{{$x 23}}{{end}}",
-		hasError, `unexpected ":="`},
-	{"multidecl",
-		"{{$a,$b,$c := 23}}",
-		hasError, `too many declarations`},
-	{"undefvar",
-		"{{$a}}",
-		hasError, `undefined variable`},
-	{"wrongdot",
-		"{{true.any}}",
-		hasError, `unexpected . after term`},
-	{"wrongpipeline",
-		"{{12|false}}",
-		hasError, `non executable command in pipeline`},
-	{"emptypipeline",
-		`{{ ( ) }}`,
-		hasError, `missing value for parenthesized pipeline`},
-}
-
-func TestErrors(t *testing.T) {
-	for _, test := range errorTests {
-		_, err := New(test.name).Parse(test.input, "", "", make(map[string]*Tree))
-		if err == nil {
-			t.Errorf("%q: expected error", test.name)
-			continue
-		}
-		if !strings.Contains(err.Error(), test.result) {
-			t.Errorf("%q: error %q does not contain %q", test.name, err, test.result)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/text/template/template.go b/third_party/gofrontend/libgo/go/text/template/template.go
deleted file mode 100644
index 3e80982..0000000
--- a/third_party/gofrontend/libgo/go/text/template/template.go
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"fmt"
-	"reflect"
-	"sync"
-	"text/template/parse"
-)
-
-// common holds the information shared by related templates.
-type common struct {
-	tmpl   map[string]*Template // Map from name to defined templates.
-	option option
-	// We use two maps, one for parsing and one for execution.
-	// This separation makes the API cleaner since it doesn't
-	// expose reflection to the client.
-	muFuncs    sync.RWMutex // protects parseFuncs and execFuncs
-	parseFuncs FuncMap
-	execFuncs  map[string]reflect.Value
-}
-
-// Template is the representation of a parsed template. The *parse.Tree
-// field is exported only for use by html/template and should be treated
-// as unexported by all other clients.
-type Template struct {
-	name string
-	*parse.Tree
-	*common
-	leftDelim  string
-	rightDelim string
-}
-
-// New allocates a new, undefined template with the given name.
-func New(name string) *Template {
-	t := &Template{
-		name: name,
-	}
-	t.init()
-	return t
-}
-
-// Name returns the name of the template.
-func (t *Template) Name() string {
-	return t.name
-}
-
-// New allocates a new, undefined template associated with the given one and with the same
-// delimiters. The association, which is transitive, allows one template to
-// invoke another with a {{template}} action.
-func (t *Template) New(name string) *Template {
-	t.init()
-	nt := &Template{
-		name:       name,
-		common:     t.common,
-		leftDelim:  t.leftDelim,
-		rightDelim: t.rightDelim,
-	}
-	return nt
-}
-
-// init guarantees that t has a valid common structure.
-func (t *Template) init() {
-	if t.common == nil {
-		c := new(common)
-		c.tmpl = make(map[string]*Template)
-		c.parseFuncs = make(FuncMap)
-		c.execFuncs = make(map[string]reflect.Value)
-		t.common = c
-	}
-}
-
-// Clone returns a duplicate of the template, including all associated
-// templates. The actual representation is not copied, but the name space of
-// associated templates is, so further calls to Parse in the copy will add
-// templates to the copy but not to the original. Clone can be used to prepare
-// common templates and use them with variant definitions for other templates
-// by adding the variants after the clone is made.
-func (t *Template) Clone() (*Template, error) {
-	nt := t.copy(nil)
-	nt.init()
-	if t.common == nil {
-		return nt, nil
-	}
-	for k, v := range t.tmpl {
-		if k == t.name {
-			nt.tmpl[t.name] = nt
-			continue
-		}
-		// The associated templates share nt's common structure.
-		tmpl := v.copy(nt.common)
-		nt.tmpl[k] = tmpl
-	}
-	t.muFuncs.RLock()
-	defer t.muFuncs.RUnlock()
-	for k, v := range t.parseFuncs {
-		nt.parseFuncs[k] = v
-	}
-	for k, v := range t.execFuncs {
-		nt.execFuncs[k] = v
-	}
-	return nt, nil
-}
-
-// copy returns a shallow copy of t, with common set to the argument.
-func (t *Template) copy(c *common) *Template {
-	nt := New(t.name)
-	nt.Tree = t.Tree
-	nt.common = c
-	nt.leftDelim = t.leftDelim
-	nt.rightDelim = t.rightDelim
-	return nt
-}
-
-// AddParseTree adds parse tree for template with given name and associates it with t.
-// If the template does not already exist, it will create a new one.
-// It is an error to reuse a name except to overwrite an empty template.
-func (t *Template) AddParseTree(name string, tree *parse.Tree) (*Template, error) {
-	t.init()
-	// If the name is the name of this template, overwrite this template.
-	// The associate method checks it's not a redefinition.
-	nt := t
-	if name != t.name {
-		nt = t.New(name)
-	}
-	// Even if nt == t, we need to install it in the common.tmpl map.
-	if replace, err := t.associate(nt, tree); err != nil {
-		return nil, err
-	} else if replace {
-		nt.Tree = tree
-	}
-	return nt, nil
-}
-
-// Templates returns a slice of defined templates associated with t.
-func (t *Template) Templates() []*Template {
-	if t.common == nil {
-		return nil
-	}
-	// Return a slice so we don't expose the map.
-	m := make([]*Template, 0, len(t.tmpl))
-	for _, v := range t.tmpl {
-		m = append(m, v)
-	}
-	return m
-}
-
-// Delims sets the action delimiters to the specified strings, to be used in
-// subsequent calls to Parse, ParseFiles, or ParseGlob. Nested template
-// definitions will inherit the settings. An empty delimiter stands for the
-// corresponding default: {{ or }}.
-// The return value is the template, so calls can be chained.
-func (t *Template) Delims(left, right string) *Template {
-	t.init()
-	t.leftDelim = left
-	t.rightDelim = right
-	return t
-}
-
-// Funcs adds the elements of the argument map to the template's function map.
-// It panics if a value in the map is not a function with appropriate return
-// type. However, it is legal to overwrite elements of the map. The return
-// value is the template, so calls can be chained.
-func (t *Template) Funcs(funcMap FuncMap) *Template {
-	t.init()
-	t.muFuncs.Lock()
-	defer t.muFuncs.Unlock()
-	addValueFuncs(t.execFuncs, funcMap)
-	addFuncs(t.parseFuncs, funcMap)
-	return t
-}
-
-// Lookup returns the template with the given name that is associated with t.
-// It returns nil if there is no such template or the template has no definition.
-func (t *Template) Lookup(name string) *Template {
-	if t.common == nil {
-		return nil
-	}
-	return t.tmpl[name]
-}
-
-// Parse defines the template by parsing the text. Nested template definitions will be
-// associated with the top-level template t. Parse may be called multiple times
-// to parse definitions of templates to associate with t. It is an error if a
-// resulting template is non-empty (contains content other than template
-// definitions) and would replace a non-empty template with the same name.
-// (In multiple calls to Parse with the same receiver template, only one call
-// can contain text other than space, comments, and template definitions.)
-func (t *Template) Parse(text string) (*Template, error) {
-	t.init()
-	t.muFuncs.RLock()
-	trees, err := parse.Parse(t.name, text, t.leftDelim, t.rightDelim, t.parseFuncs, builtins)
-	t.muFuncs.RUnlock()
-	if err != nil {
-		return nil, err
-	}
-	// Add the newly parsed trees, including the one for t, into our common structure.
-	for name, tree := range trees {
-		if _, err := t.AddParseTree(name, tree); err != nil {
-			return nil, err
-		}
-	}
-	return t, nil
-}
-
-// associate installs the new template into the group of templates associated
-// with t. It is an error to reuse a name except to overwrite an empty
-// template. The two are already known to share the common structure.
-// The boolean return value reports wither to store this tree as t.Tree.
-func (t *Template) associate(new *Template, tree *parse.Tree) (bool, error) {
-	if new.common != t.common {
-		panic("internal error: associate not common")
-	}
-	name := new.name
-	if old := t.tmpl[name]; old != nil {
-		oldIsEmpty := parse.IsEmptyTree(old.Root)
-		newIsEmpty := parse.IsEmptyTree(tree.Root)
-		if newIsEmpty {
-			// Whether old is empty or not, new is empty; no reason to replace old.
-			return false, nil
-		}
-		if !oldIsEmpty {
-			return false, fmt.Errorf("template: redefinition of template %q", name)
-		}
-	}
-	t.tmpl[name] = new
-	return true, nil
-}
diff --git a/third_party/gofrontend/libgo/go/text/template/testdata/file1.tmpl b/third_party/gofrontend/libgo/go/text/template/testdata/file1.tmpl
deleted file mode 100644
index febf9d9..0000000
--- a/third_party/gofrontend/libgo/go/text/template/testdata/file1.tmpl
+++ /dev/null
@@ -1,2 +0,0 @@
-{{define "x"}}TEXT{{end}}
-{{define "dotV"}}{{.V}}{{end}}
diff --git a/third_party/gofrontend/libgo/go/text/template/testdata/file2.tmpl b/third_party/gofrontend/libgo/go/text/template/testdata/file2.tmpl
deleted file mode 100644
index 39bf6fb..0000000
--- a/third_party/gofrontend/libgo/go/text/template/testdata/file2.tmpl
+++ /dev/null
@@ -1,2 +0,0 @@
-{{define "dot"}}{{.}}{{end}}
-{{define "nested"}}{{template "dot" .}}{{end}}
diff --git a/third_party/gofrontend/libgo/go/text/template/testdata/tmpl1.tmpl b/third_party/gofrontend/libgo/go/text/template/testdata/tmpl1.tmpl
deleted file mode 100644
index b72b3a3..0000000
--- a/third_party/gofrontend/libgo/go/text/template/testdata/tmpl1.tmpl
+++ /dev/null
@@ -1,3 +0,0 @@
-template1
-{{define "x"}}x{{end}}
-{{template "y"}}
diff --git a/third_party/gofrontend/libgo/go/text/template/testdata/tmpl2.tmpl b/third_party/gofrontend/libgo/go/text/template/testdata/tmpl2.tmpl
deleted file mode 100644
index 16beba6..0000000
--- a/third_party/gofrontend/libgo/go/text/template/testdata/tmpl2.tmpl
+++ /dev/null
@@ -1,3 +0,0 @@
-template2
-{{define "y"}}y{{end}}
-{{template "x"}}
diff --git a/third_party/gofrontend/libgo/go/time/example_test.go b/third_party/gofrontend/libgo/go/time/example_test.go
deleted file mode 100644
index f76fdcd..0000000
--- a/third_party/gofrontend/libgo/go/time/example_test.go
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time_test
-
-import (
-	"fmt"
-	"time"
-)
-
-func expensiveCall() {}
-
-func ExampleDuration() {
-	t0 := time.Now()
-	expensiveCall()
-	t1 := time.Now()
-	fmt.Printf("The call took %v to run.\n", t1.Sub(t0))
-}
-
-var c chan int
-
-func handle(int) {}
-
-func ExampleAfter() {
-	select {
-	case m := <-c:
-		handle(m)
-	case <-time.After(5 * time.Minute):
-		fmt.Println("timed out")
-	}
-}
-
-func ExampleSleep() {
-	time.Sleep(100 * time.Millisecond)
-}
-
-func statusUpdate() string { return "" }
-
-func ExampleTick() {
-	c := time.Tick(1 * time.Minute)
-	for now := range c {
-		fmt.Printf("%v %s\n", now, statusUpdate())
-	}
-}
-
-func ExampleMonth() {
-	_, month, day := time.Now().Date()
-	if month == time.November && day == 10 {
-		fmt.Println("Happy Go day!")
-	}
-}
-
-func ExampleDate() {
-	t := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)
-	fmt.Printf("Go launched at %s\n", t.Local())
-	// Output: Go launched at 2009-11-10 15:00:00 -0800 PST
-}
-
-func ExampleTime_Format() {
-	// Parse a time value from a string in the standard Unix format.
-	t, err := time.Parse(time.UnixDate, "Sat Mar  7 11:06:39 PST 2015")
-	if err != nil { // Always check errors even if they should not happen.
-		panic(err)
-	}
-
-	// time.Time's Stringer method is useful without any format.
-	fmt.Println("default format:", t)
-
-	// Predefined constants in the package implement common layouts.
-	fmt.Println("Unix format:", t.Format(time.UnixDate))
-
-	// The time zone attached to the time value affects its output.
-	fmt.Println("Same, in UTC:", t.UTC().Format(time.UnixDate))
-
-	// The rest of this function demonstrates the properties of the
-	// layout string used in the format.
-
-	// The layout string used by the Parse function and Format method
-	// shows by example how the reference time should be represented.
-	// We stress that one must show how the reference time is formatted,
-	// not a time of the user's choosing. Thus each layout string is a
-	// representation of the time stamp,
-	//	Jan 2 15:04:05 2006 MST
-	// An easy way to remember this value is that it holds, when presented
-	// in this order, the values (lined up with the elements above):
-	//	  1 2  3  4  5    6  -7
-	// There are some wrinkles illustrated below.
-
-	// Most uses of Format and Parse use constant layout strings such as
-	// the ones defined in this package, but the interface is flexible,
-	// as these examples show.
-
-	// Define a helper function to make the examples' output look nice.
-	do := func(name, layout, want string) {
-		got := t.Format(layout)
-		if want != got {
-			fmt.Printf("error: for %q got %q; expected %q\n", layout, got, want)
-			return
-		}
-		fmt.Printf("%-15s %q gives %q\n", name, layout, got)
-	}
-
-	// Print a header in our output.
-	fmt.Printf("\nFormats:\n\n")
-
-	// A simple starter example.
-	do("Basic", "Mon Jan 2 15:04:05 MST 2006", "Sat Mar 7 11:06:39 PST 2015")
-
-	// For fixed-width printing of values, such as the date, that may be one or
-	// two characters (7 vs. 07), use an _ instead of a space in the layout string.
-	// Here we print just the day, which is 2 in our layout string and 7 in our
-	// value.
-	do("No pad", "<2>", "<7>")
-
-	// An underscore represents a zero pad, if required.
-	do("Spaces", "<_2>", "< 7>")
-
-	// Similarly, a 0 indicates zero padding.
-	do("Zeros", "<02>", "<07>")
-
-	// If the value is already the right width, padding is not used.
-	// For instance, the second (05 in the reference time) in our value is 39,
-	// so it doesn't need padding, but the minutes (04, 06) does.
-	do("Suppressed pad", "04:05", "06:39")
-
-	// The predefined constant Unix uses an underscore to pad the day.
-	// Compare with our simple starter example.
-	do("Unix", time.UnixDate, "Sat Mar  7 11:06:39 PST 2015")
-
-	// The hour of the reference time is 15, or 3PM. The layout can express
-	// it either way, and since our value is the morning we should see it as
-	// an AM time. We show both in one format string. Lower case too.
-	do("AM/PM", "3PM==3pm==15h", "11AM==11am==11h")
-
-	// When parsing, if the seconds value is followed by a decimal point
-	// and some digits, that is taken as a fraction of a second even if
-	// the layout string does not represent the fractional second.
-	// Here we add a fractional second to our time value used above.
-	t, err = time.Parse(time.UnixDate, "Sat Mar  7 11:06:39.1234 PST 2015")
-	if err != nil {
-		panic(err)
-	}
-	// It does not appear in the output if the layout string does not contain
-	// a representation of the fractional second.
-	do("No fraction", time.UnixDate, "Sat Mar  7 11:06:39 PST 2015")
-
-	// Fractional seconds can be printed by adding a run of 0s or 9s after
-	// a decimal point in the seconds value in the layout string.
-	// If the layout digits are 0s, the fractional second is of the specified
-	// width. Note that the output has a trailing zero.
-	do("0s for fraction", "15:04:05.00000", "11:06:39.12340")
-
-	// If the fraction in the layout is 9s, trailing zeros are dropped.
-	do("9s for fraction", "15:04:05.99999999", "11:06:39.1234")
-
-	// Output:
-	// default format: 2015-03-07 11:06:39 -0800 PST
-	// Unix format: Sat Mar  7 11:06:39 PST 2015
-	// Same, in UTC: Sat Mar  7 19:06:39 UTC 2015
-	//
-	// Formats:
-	//
-	// Basic           "Mon Jan 2 15:04:05 MST 2006" gives "Sat Mar 7 11:06:39 PST 2015"
-	// No pad          "<2>" gives "<7>"
-	// Spaces          "<_2>" gives "< 7>"
-	// Zeros           "<02>" gives "<07>"
-	// Suppressed pad  "04:05" gives "06:39"
-	// Unix            "Mon Jan _2 15:04:05 MST 2006" gives "Sat Mar  7 11:06:39 PST 2015"
-	// AM/PM           "3PM==3pm==15h" gives "11AM==11am==11h"
-	// No fraction     "Mon Jan _2 15:04:05 MST 2006" gives "Sat Mar  7 11:06:39 PST 2015"
-	// 0s for fraction "15:04:05.00000" gives "11:06:39.12340"
-	// 9s for fraction "15:04:05.99999999" gives "11:06:39.1234"
-
-}
-
-func ExampleParse() {
-	// See the example for time.Format for a thorough description of how
-	// to define the layout string to parse a time.Time value; Parse and
-	// Format use the same model to describe their input and output.
-
-	// longForm shows by example how the reference time would be represented in
-	// the desired layout.
-	const longForm = "Jan 2, 2006 at 3:04pm (MST)"
-	t, _ := time.Parse(longForm, "Feb 3, 2013 at 7:54pm (PST)")
-	fmt.Println(t)
-
-	// shortForm is another way the reference time would be represented
-	// in the desired layout; it has no time zone present.
-	// Note: without explicit zone, returns time in UTC.
-	const shortForm = "2006-Jan-02"
-	t, _ = time.Parse(shortForm, "2013-Feb-03")
-	fmt.Println(t)
-
-	// Output:
-	// 2013-02-03 19:54:00 -0800 PST
-	// 2013-02-03 00:00:00 +0000 UTC
-}
-
-func ExampleParseInLocation() {
-	loc, _ := time.LoadLocation("Europe/Berlin")
-
-	const longForm = "Jan 2, 2006 at 3:04pm (MST)"
-	t, _ := time.ParseInLocation(longForm, "Jul 9, 2012 at 5:02am (CEST)", loc)
-	fmt.Println(t)
-
-	// Note: without explicit zone, returns time in given location.
-	const shortForm = "2006-Jan-02"
-	t, _ = time.ParseInLocation(shortForm, "2012-Jul-09", loc)
-	fmt.Println(t)
-
-	// Output:
-	// 2012-07-09 05:02:00 +0200 CEST
-	// 2012-07-09 00:00:00 +0200 CEST
-}
-
-func ExampleTime_Round() {
-	t := time.Date(0, 0, 0, 12, 15, 30, 918273645, time.UTC)
-	round := []time.Duration{
-		time.Nanosecond,
-		time.Microsecond,
-		time.Millisecond,
-		time.Second,
-		2 * time.Second,
-		time.Minute,
-		10 * time.Minute,
-		time.Hour,
-	}
-
-	for _, d := range round {
-		fmt.Printf("t.Round(%6s) = %s\n", d, t.Round(d).Format("15:04:05.999999999"))
-	}
-	// Output:
-	// t.Round(   1ns) = 12:15:30.918273645
-	// t.Round(   1µs) = 12:15:30.918274
-	// t.Round(   1ms) = 12:15:30.918
-	// t.Round(    1s) = 12:15:31
-	// t.Round(    2s) = 12:15:30
-	// t.Round(  1m0s) = 12:16:00
-	// t.Round( 10m0s) = 12:20:00
-	// t.Round(1h0m0s) = 12:00:00
-}
-
-func ExampleTime_Truncate() {
-	t, _ := time.Parse("2006 Jan 02 15:04:05", "2012 Dec 07 12:15:30.918273645")
-	trunc := []time.Duration{
-		time.Nanosecond,
-		time.Microsecond,
-		time.Millisecond,
-		time.Second,
-		2 * time.Second,
-		time.Minute,
-		10 * time.Minute,
-		time.Hour,
-	}
-
-	for _, d := range trunc {
-		fmt.Printf("t.Truncate(%6s) = %s\n", d, t.Truncate(d).Format("15:04:05.999999999"))
-	}
-
-	// Output:
-	// t.Truncate(   1ns) = 12:15:30.918273645
-	// t.Truncate(   1µs) = 12:15:30.918273
-	// t.Truncate(   1ms) = 12:15:30.918
-	// t.Truncate(    1s) = 12:15:30
-	// t.Truncate(    2s) = 12:15:30
-	// t.Truncate(  1m0s) = 12:15:00
-	// t.Truncate( 10m0s) = 12:10:00
-	// t.Truncate(1h0m0s) = 12:00:00
-}
diff --git a/third_party/gofrontend/libgo/go/time/export_test.go b/third_party/gofrontend/libgo/go/time/export_test.go
deleted file mode 100644
index 6cd535f..0000000
--- a/third_party/gofrontend/libgo/go/time/export_test.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time
-
-import (
-	"sync"
-)
-
-func ResetLocalOnceForTest() {
-	localOnce = sync.Once{}
-	localLoc = Location{}
-}
-
-func ForceUSPacificForTesting() {
-	ResetLocalOnceForTest()
-	localOnce.Do(initTestingZone)
-}
-
-var (
-	ForceZipFileForTesting = forceZipFileForTesting
-	ParseTimeZone          = parseTimeZone
-)
diff --git a/third_party/gofrontend/libgo/go/time/format.go b/third_party/gofrontend/libgo/go/time/format.go
deleted file mode 100644
index 873d3ff..0000000
--- a/third_party/gofrontend/libgo/go/time/format.go
+++ /dev/null
@@ -1,1261 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time
-
-import "errors"
-
-// These are predefined layouts for use in Time.Format and Time.Parse.
-// The reference time used in the layouts is the specific time:
-//	Mon Jan 2 15:04:05 MST 2006
-// which is Unix time 1136239445. Since MST is GMT-0700,
-// the reference time can be thought of as
-//	01/02 03:04:05PM '06 -0700
-// To define your own format, write down what the reference time would look
-// like formatted your way; see the values of constants like ANSIC,
-// StampMicro or Kitchen for examples. The model is to demonstrate what the
-// reference time looks like so that the Format and Parse methods can apply
-// the same transformation to a general time value.
-//
-// Within the format string, an underscore _ represents a space that may be
-// replaced by a digit if the following number (a day) has two digits; for
-// compatibility with fixed-width Unix time formats.
-//
-// A decimal point followed by one or more zeros represents a fractional
-// second, printed to the given number of decimal places.  A decimal point
-// followed by one or more nines represents a fractional second, printed to
-// the given number of decimal places, with trailing zeros removed.
-// When parsing (only), the input may contain a fractional second
-// field immediately after the seconds field, even if the layout does not
-// signify its presence. In that case a decimal point followed by a maximal
-// series of digits is parsed as a fractional second.
-//
-// Numeric time zone offsets format as follows:
-//	-0700  ±hhmm
-//	-07:00 ±hh:mm
-// Replacing the sign in the format with a Z triggers
-// the ISO 8601 behavior of printing Z instead of an
-// offset for the UTC zone.  Thus:
-//	Z0700  Z or ±hhmm
-//	Z07:00 Z or ±hh:mm
-//
-// The executable example for time.Format demonstrates the working
-// of the layout string in detail and is a good reference.
-const (
-	ANSIC       = "Mon Jan _2 15:04:05 2006"
-	UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
-	RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
-	RFC822      = "02 Jan 06 15:04 MST"
-	RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
-	RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
-	RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
-	RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
-	RFC3339     = "2006-01-02T15:04:05Z07:00"
-	RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
-	Kitchen     = "3:04PM"
-	// Handy time stamps.
-	Stamp      = "Jan _2 15:04:05"
-	StampMilli = "Jan _2 15:04:05.000"
-	StampMicro = "Jan _2 15:04:05.000000"
-	StampNano  = "Jan _2 15:04:05.000000000"
-)
-
-const (
-	_                        = iota
-	stdLongMonth             = iota + stdNeedDate  // "January"
-	stdMonth                                       // "Jan"
-	stdNumMonth                                    // "1"
-	stdZeroMonth                                   // "01"
-	stdLongWeekDay                                 // "Monday"
-	stdWeekDay                                     // "Mon"
-	stdDay                                         // "2"
-	stdUnderDay                                    // "_2"
-	stdZeroDay                                     // "02"
-	stdHour                  = iota + stdNeedClock // "15"
-	stdHour12                                      // "3"
-	stdZeroHour12                                  // "03"
-	stdMinute                                      // "4"
-	stdZeroMinute                                  // "04"
-	stdSecond                                      // "5"
-	stdZeroSecond                                  // "05"
-	stdLongYear              = iota + stdNeedDate  // "2006"
-	stdYear                                        // "06"
-	stdPM                    = iota + stdNeedClock // "PM"
-	stdpm                                          // "pm"
-	stdTZ                    = iota                // "MST"
-	stdISO8601TZ                                   // "Z0700"  // prints Z for UTC
-	stdISO8601SecondsTZ                            // "Z070000"
-	stdISO8601ColonTZ                              // "Z07:00" // prints Z for UTC
-	stdISO8601ColonSecondsTZ                       // "Z07:00:00"
-	stdNumTZ                                       // "-0700"  // always numeric
-	stdNumSecondsTz                                // "-070000"
-	stdNumShortTZ                                  // "-07"    // always numeric
-	stdNumColonTZ                                  // "-07:00" // always numeric
-	stdNumColonSecondsTZ                           // "-07:00:00"
-	stdFracSecond0                                 // ".0", ".00", ... , trailing zeros included
-	stdFracSecond9                                 // ".9", ".99", ..., trailing zeros omitted
-
-	stdNeedDate  = 1 << 8             // need month, day, year
-	stdNeedClock = 2 << 8             // need hour, minute, second
-	stdArgShift  = 16                 // extra argument in high bits, above low stdArgShift
-	stdMask      = 1<<stdArgShift - 1 // mask out argument
-)
-
-// std0x records the std values for "01", "02", ..., "06".
-var std0x = [...]int{stdZeroMonth, stdZeroDay, stdZeroHour12, stdZeroMinute, stdZeroSecond, stdYear}
-
-// startsWithLowerCase reports whether the string has a lower-case letter at the beginning.
-// Its purpose is to prevent matching strings like "Month" when looking for "Mon".
-func startsWithLowerCase(str string) bool {
-	if len(str) == 0 {
-		return false
-	}
-	c := str[0]
-	return 'a' <= c && c <= 'z'
-}
-
-// nextStdChunk finds the first occurrence of a std string in
-// layout and returns the text before, the std string, and the text after.
-func nextStdChunk(layout string) (prefix string, std int, suffix string) {
-	for i := 0; i < len(layout); i++ {
-		switch c := int(layout[i]); c {
-		case 'J': // January, Jan
-			if len(layout) >= i+3 && layout[i:i+3] == "Jan" {
-				if len(layout) >= i+7 && layout[i:i+7] == "January" {
-					return layout[0:i], stdLongMonth, layout[i+7:]
-				}
-				if !startsWithLowerCase(layout[i+3:]) {
-					return layout[0:i], stdMonth, layout[i+3:]
-				}
-			}
-
-		case 'M': // Monday, Mon, MST
-			if len(layout) >= i+3 {
-				if layout[i:i+3] == "Mon" {
-					if len(layout) >= i+6 && layout[i:i+6] == "Monday" {
-						return layout[0:i], stdLongWeekDay, layout[i+6:]
-					}
-					if !startsWithLowerCase(layout[i+3:]) {
-						return layout[0:i], stdWeekDay, layout[i+3:]
-					}
-				}
-				if layout[i:i+3] == "MST" {
-					return layout[0:i], stdTZ, layout[i+3:]
-				}
-			}
-
-		case '0': // 01, 02, 03, 04, 05, 06
-			if len(layout) >= i+2 && '1' <= layout[i+1] && layout[i+1] <= '6' {
-				return layout[0:i], std0x[layout[i+1]-'1'], layout[i+2:]
-			}
-
-		case '1': // 15, 1
-			if len(layout) >= i+2 && layout[i+1] == '5' {
-				return layout[0:i], stdHour, layout[i+2:]
-			}
-			return layout[0:i], stdNumMonth, layout[i+1:]
-
-		case '2': // 2006, 2
-			if len(layout) >= i+4 && layout[i:i+4] == "2006" {
-				return layout[0:i], stdLongYear, layout[i+4:]
-			}
-			return layout[0:i], stdDay, layout[i+1:]
-
-		case '_': // _2
-			if len(layout) >= i+2 && layout[i+1] == '2' {
-				return layout[0:i], stdUnderDay, layout[i+2:]
-			}
-
-		case '3':
-			return layout[0:i], stdHour12, layout[i+1:]
-
-		case '4':
-			return layout[0:i], stdMinute, layout[i+1:]
-
-		case '5':
-			return layout[0:i], stdSecond, layout[i+1:]
-
-		case 'P': // PM
-			if len(layout) >= i+2 && layout[i+1] == 'M' {
-				return layout[0:i], stdPM, layout[i+2:]
-			}
-
-		case 'p': // pm
-			if len(layout) >= i+2 && layout[i+1] == 'm' {
-				return layout[0:i], stdpm, layout[i+2:]
-			}
-
-		case '-': // -070000, -07:00:00, -0700, -07:00, -07
-			if len(layout) >= i+7 && layout[i:i+7] == "-070000" {
-				return layout[0:i], stdNumSecondsTz, layout[i+7:]
-			}
-			if len(layout) >= i+9 && layout[i:i+9] == "-07:00:00" {
-				return layout[0:i], stdNumColonSecondsTZ, layout[i+9:]
-			}
-			if len(layout) >= i+5 && layout[i:i+5] == "-0700" {
-				return layout[0:i], stdNumTZ, layout[i+5:]
-			}
-			if len(layout) >= i+6 && layout[i:i+6] == "-07:00" {
-				return layout[0:i], stdNumColonTZ, layout[i+6:]
-			}
-			if len(layout) >= i+3 && layout[i:i+3] == "-07" {
-				return layout[0:i], stdNumShortTZ, layout[i+3:]
-			}
-
-		case 'Z': // Z070000, Z07:00:00, Z0700, Z07:00,
-			if len(layout) >= i+7 && layout[i:i+7] == "Z070000" {
-				return layout[0:i], stdISO8601SecondsTZ, layout[i+7:]
-			}
-			if len(layout) >= i+9 && layout[i:i+9] == "Z07:00:00" {
-				return layout[0:i], stdISO8601ColonSecondsTZ, layout[i+9:]
-			}
-			if len(layout) >= i+5 && layout[i:i+5] == "Z0700" {
-				return layout[0:i], stdISO8601TZ, layout[i+5:]
-			}
-			if len(layout) >= i+6 && layout[i:i+6] == "Z07:00" {
-				return layout[0:i], stdISO8601ColonTZ, layout[i+6:]
-			}
-
-		case '.': // .000 or .999 - repeated digits for fractional seconds.
-			if i+1 < len(layout) && (layout[i+1] == '0' || layout[i+1] == '9') {
-				ch := layout[i+1]
-				j := i + 1
-				for j < len(layout) && layout[j] == ch {
-					j++
-				}
-				// String of digits must end here - only fractional second is all digits.
-				if !isDigit(layout, j) {
-					std := stdFracSecond0
-					if layout[i+1] == '9' {
-						std = stdFracSecond9
-					}
-					std |= (j - (i + 1)) << stdArgShift
-					return layout[0:i], std, layout[j:]
-				}
-			}
-		}
-	}
-	return layout, 0, ""
-}
-
-var longDayNames = []string{
-	"Sunday",
-	"Monday",
-	"Tuesday",
-	"Wednesday",
-	"Thursday",
-	"Friday",
-	"Saturday",
-}
-
-var shortDayNames = []string{
-	"Sun",
-	"Mon",
-	"Tue",
-	"Wed",
-	"Thu",
-	"Fri",
-	"Sat",
-}
-
-var shortMonthNames = []string{
-	"---",
-	"Jan",
-	"Feb",
-	"Mar",
-	"Apr",
-	"May",
-	"Jun",
-	"Jul",
-	"Aug",
-	"Sep",
-	"Oct",
-	"Nov",
-	"Dec",
-}
-
-var longMonthNames = []string{
-	"---",
-	"January",
-	"February",
-	"March",
-	"April",
-	"May",
-	"June",
-	"July",
-	"August",
-	"September",
-	"October",
-	"November",
-	"December",
-}
-
-// match reports whether s1 and s2 match ignoring case.
-// It is assumed s1 and s2 are the same length.
-func match(s1, s2 string) bool {
-	for i := 0; i < len(s1); i++ {
-		c1 := s1[i]
-		c2 := s2[i]
-		if c1 != c2 {
-			// Switch to lower-case; 'a'-'A' is known to be a single bit.
-			c1 |= 'a' - 'A'
-			c2 |= 'a' - 'A'
-			if c1 != c2 || c1 < 'a' || c1 > 'z' {
-				return false
-			}
-		}
-	}
-	return true
-}
-
-func lookup(tab []string, val string) (int, string, error) {
-	for i, v := range tab {
-		if len(val) >= len(v) && match(val[0:len(v)], v) {
-			return i, val[len(v):], nil
-		}
-	}
-	return -1, val, errBad
-}
-
-// appendInt appends the decimal form of x to b and returns the result.
-// If the decimal form (excluding sign) is shorter than width, the result is padded with leading 0's.
-// Duplicates functionality in strconv, but avoids dependency.
-func appendInt(b []byte, x int, width int) []byte {
-	u := uint(x)
-	if x < 0 {
-		b = append(b, '-')
-		u = uint(-x)
-	}
-
-	// Assemble decimal in reverse order.
-	var buf [20]byte
-	i := len(buf)
-	for u >= 10 {
-		i--
-		q := u / 10
-		buf[i] = byte('0' + u - q*10)
-		u = q
-	}
-	i--
-	buf[i] = byte('0' + u)
-
-	// Add 0-padding.
-	for w := len(buf) - i; w < width; w++ {
-		b = append(b, '0')
-	}
-
-	return append(b, buf[i:]...)
-}
-
-// Never printed, just needs to be non-nil for return by atoi.
-var atoiError = errors.New("time: invalid number")
-
-// Duplicates functionality in strconv, but avoids dependency.
-func atoi(s string) (x int, err error) {
-	neg := false
-	if s != "" && (s[0] == '-' || s[0] == '+') {
-		neg = s[0] == '-'
-		s = s[1:]
-	}
-	q, rem, err := leadingInt(s)
-	x = int(q)
-	if err != nil || rem != "" {
-		return 0, atoiError
-	}
-	if neg {
-		x = -x
-	}
-	return x, nil
-}
-
-// formatNano appends a fractional second, as nanoseconds, to b
-// and returns the result.
-func formatNano(b []byte, nanosec uint, n int, trim bool) []byte {
-	u := nanosec
-	var buf [9]byte
-	for start := len(buf); start > 0; {
-		start--
-		buf[start] = byte(u%10 + '0')
-		u /= 10
-	}
-
-	if n > 9 {
-		n = 9
-	}
-	if trim {
-		for n > 0 && buf[n-1] == '0' {
-			n--
-		}
-		if n == 0 {
-			return b
-		}
-	}
-	b = append(b, '.')
-	return append(b, buf[:n]...)
-}
-
-// String returns the time formatted using the format string
-//	"2006-01-02 15:04:05.999999999 -0700 MST"
-func (t Time) String() string {
-	return t.Format("2006-01-02 15:04:05.999999999 -0700 MST")
-}
-
-// Format returns a textual representation of the time value formatted
-// according to layout, which defines the format by showing how the reference
-// time, defined to be
-//	Mon Jan 2 15:04:05 -0700 MST 2006
-// would be displayed if it were the value; it serves as an example of the
-// desired output. The same display rules will then be applied to the time
-// value.
-//
-// A fractional second is represented by adding a period and zeros
-// to the end of the seconds section of layout string, as in "15:04:05.000"
-// to format a time stamp with millisecond precision.
-//
-// Predefined layouts ANSIC, UnixDate, RFC3339 and others describe standard
-// and convenient representations of the reference time. For more information
-// about the formats and the definition of the reference time, see the
-// documentation for ANSIC and the other constants defined by this package.
-func (t Time) Format(layout string) string {
-	const bufSize = 64
-	var b []byte
-	max := len(layout) + 10
-	if max < bufSize {
-		var buf [bufSize]byte
-		b = buf[:0]
-	} else {
-		b = make([]byte, 0, max)
-	}
-	b = t.AppendFormat(b, layout)
-	return string(b)
-}
-
-// AppendFormat is like Format but appends the textual
-// representation to b and returns the extended buffer.
-func (t Time) AppendFormat(b []byte, layout string) []byte {
-	var (
-		name, offset, abs = t.locabs()
-
-		year  int = -1
-		month Month
-		day   int
-		hour  int = -1
-		min   int
-		sec   int
-	)
-	// Each iteration generates one std value.
-	for layout != "" {
-		prefix, std, suffix := nextStdChunk(layout)
-		if prefix != "" {
-			b = append(b, prefix...)
-		}
-		if std == 0 {
-			break
-		}
-		layout = suffix
-
-		// Compute year, month, day if needed.
-		if year < 0 && std&stdNeedDate != 0 {
-			year, month, day, _ = absDate(abs, true)
-		}
-
-		// Compute hour, minute, second if needed.
-		if hour < 0 && std&stdNeedClock != 0 {
-			hour, min, sec = absClock(abs)
-		}
-
-		switch std & stdMask {
-		case stdYear:
-			y := year
-			if y < 0 {
-				y = -y
-			}
-			b = appendInt(b, y%100, 2)
-		case stdLongYear:
-			b = appendInt(b, year, 4)
-		case stdMonth:
-			b = append(b, month.String()[:3]...)
-		case stdLongMonth:
-			m := month.String()
-			b = append(b, m...)
-		case stdNumMonth:
-			b = appendInt(b, int(month), 0)
-		case stdZeroMonth:
-			b = appendInt(b, int(month), 2)
-		case stdWeekDay:
-			b = append(b, absWeekday(abs).String()[:3]...)
-		case stdLongWeekDay:
-			s := absWeekday(abs).String()
-			b = append(b, s...)
-		case stdDay:
-			b = appendInt(b, day, 0)
-		case stdUnderDay:
-			if day < 10 {
-				b = append(b, ' ')
-			}
-			b = appendInt(b, day, 0)
-		case stdZeroDay:
-			b = appendInt(b, day, 2)
-		case stdHour:
-			b = appendInt(b, hour, 2)
-		case stdHour12:
-			// Noon is 12PM, midnight is 12AM.
-			hr := hour % 12
-			if hr == 0 {
-				hr = 12
-			}
-			b = appendInt(b, hr, 0)
-		case stdZeroHour12:
-			// Noon is 12PM, midnight is 12AM.
-			hr := hour % 12
-			if hr == 0 {
-				hr = 12
-			}
-			b = appendInt(b, hr, 2)
-		case stdMinute:
-			b = appendInt(b, min, 0)
-		case stdZeroMinute:
-			b = appendInt(b, min, 2)
-		case stdSecond:
-			b = appendInt(b, sec, 2)
-		case stdZeroSecond:
-			b = appendInt(b, sec, 2)
-		case stdPM:
-			if hour >= 12 {
-				b = append(b, "PM"...)
-			} else {
-				b = append(b, "AM"...)
-			}
-		case stdpm:
-			if hour >= 12 {
-				b = append(b, "pm"...)
-			} else {
-				b = append(b, "am"...)
-			}
-		case stdISO8601TZ, stdISO8601ColonTZ, stdISO8601SecondsTZ, stdISO8601ColonSecondsTZ, stdNumTZ, stdNumColonTZ, stdNumSecondsTz, stdNumColonSecondsTZ:
-			// Ugly special case.  We cheat and take the "Z" variants
-			// to mean "the time zone as formatted for ISO 8601".
-			if offset == 0 && (std == stdISO8601TZ || std == stdISO8601ColonTZ || std == stdISO8601SecondsTZ || std == stdISO8601ColonSecondsTZ) {
-				b = append(b, 'Z')
-				break
-			}
-			zone := offset / 60 // convert to minutes
-			absoffset := offset
-			if zone < 0 {
-				b = append(b, '-')
-				zone = -zone
-				absoffset = -absoffset
-			} else {
-				b = append(b, '+')
-			}
-			b = appendInt(b, zone/60, 2)
-			if std == stdISO8601ColonTZ || std == stdNumColonTZ || std == stdISO8601ColonSecondsTZ || std == stdNumColonSecondsTZ {
-				b = append(b, ':')
-			}
-			b = appendInt(b, zone%60, 2)
-
-			// append seconds if appropriate
-			if std == stdISO8601SecondsTZ || std == stdNumSecondsTz || std == stdNumColonSecondsTZ || std == stdISO8601ColonSecondsTZ {
-				if std == stdNumColonSecondsTZ || std == stdISO8601ColonSecondsTZ {
-					b = append(b, ':')
-				}
-				b = appendInt(b, absoffset%60, 2)
-			}
-
-		case stdTZ:
-			if name != "" {
-				b = append(b, name...)
-				break
-			}
-			// No time zone known for this time, but we must print one.
-			// Use the -0700 format.
-			zone := offset / 60 // convert to minutes
-			if zone < 0 {
-				b = append(b, '-')
-				zone = -zone
-			} else {
-				b = append(b, '+')
-			}
-			b = appendInt(b, zone/60, 2)
-			b = appendInt(b, zone%60, 2)
-		case stdFracSecond0, stdFracSecond9:
-			b = formatNano(b, uint(t.Nanosecond()), std>>stdArgShift, std&stdMask == stdFracSecond9)
-		}
-	}
-	return b
-}
-
-var errBad = errors.New("bad value for field") // placeholder not passed to user
-
-// ParseError describes a problem parsing a time string.
-type ParseError struct {
-	Layout     string
-	Value      string
-	LayoutElem string
-	ValueElem  string
-	Message    string
-}
-
-func quote(s string) string {
-	return "\"" + s + "\""
-}
-
-// Error returns the string representation of a ParseError.
-func (e *ParseError) Error() string {
-	if e.Message == "" {
-		return "parsing time " +
-			quote(e.Value) + " as " +
-			quote(e.Layout) + ": cannot parse " +
-			quote(e.ValueElem) + " as " +
-			quote(e.LayoutElem)
-	}
-	return "parsing time " +
-		quote(e.Value) + e.Message
-}
-
-// isDigit reports whether s[i] is in range and is a decimal digit.
-func isDigit(s string, i int) bool {
-	if len(s) <= i {
-		return false
-	}
-	c := s[i]
-	return '0' <= c && c <= '9'
-}
-
-// getnum parses s[0:1] or s[0:2] (fixed forces the latter)
-// as a decimal integer and returns the integer and the
-// remainder of the string.
-func getnum(s string, fixed bool) (int, string, error) {
-	if !isDigit(s, 0) {
-		return 0, s, errBad
-	}
-	if !isDigit(s, 1) {
-		if fixed {
-			return 0, s, errBad
-		}
-		return int(s[0] - '0'), s[1:], nil
-	}
-	return int(s[0]-'0')*10 + int(s[1]-'0'), s[2:], nil
-}
-
-func cutspace(s string) string {
-	for len(s) > 0 && s[0] == ' ' {
-		s = s[1:]
-	}
-	return s
-}
-
-// skip removes the given prefix from value,
-// treating runs of space characters as equivalent.
-func skip(value, prefix string) (string, error) {
-	for len(prefix) > 0 {
-		if prefix[0] == ' ' {
-			if len(value) > 0 && value[0] != ' ' {
-				return value, errBad
-			}
-			prefix = cutspace(prefix)
-			value = cutspace(value)
-			continue
-		}
-		if len(value) == 0 || value[0] != prefix[0] {
-			return value, errBad
-		}
-		prefix = prefix[1:]
-		value = value[1:]
-	}
-	return value, nil
-}
-
-// Parse parses a formatted string and returns the time value it represents.
-// The layout  defines the format by showing how the reference time,
-// defined to be
-//	Mon Jan 2 15:04:05 -0700 MST 2006
-// would be interpreted if it were the value; it serves as an example of
-// the input format. The same interpretation will then be made to the
-// input string.
-//
-// Predefined layouts ANSIC, UnixDate, RFC3339 and others describe standard
-// and convenient representations of the reference time. For more information
-// about the formats and the definition of the reference time, see the
-// documentation for ANSIC and the other constants defined by this package.
-// Also, the executable example for time.Format demonstrates the working
-// of the layout string in detail and is a good reference.
-//
-// Elements omitted from the value are assumed to be zero or, when
-// zero is impossible, one, so parsing "3:04pm" returns the time
-// corresponding to Jan 1, year 0, 15:04:00 UTC (note that because the year is
-// 0, this time is before the zero Time).
-// Years must be in the range 0000..9999. The day of the week is checked
-// for syntax but it is otherwise ignored.
-//
-// In the absence of a time zone indicator, Parse returns a time in UTC.
-//
-// When parsing a time with a zone offset like -0700, if the offset corresponds
-// to a time zone used by the current location (Local), then Parse uses that
-// location and zone in the returned time. Otherwise it records the time as
-// being in a fabricated location with time fixed at the given zone offset.
-//
-// When parsing a time with a zone abbreviation like MST, if the zone abbreviation
-// has a defined offset in the current location, then that offset is used.
-// The zone abbreviation "UTC" is recognized as UTC regardless of location.
-// If the zone abbreviation is unknown, Parse records the time as being
-// in a fabricated location with the given zone abbreviation and a zero offset.
-// This choice means that such a time can be parsed and reformatted with the
-// same layout losslessly, but the exact instant used in the representation will
-// differ by the actual zone offset. To avoid such problems, prefer time layouts
-// that use a numeric zone offset, or use ParseInLocation.
-func Parse(layout, value string) (Time, error) {
-	return parse(layout, value, UTC, Local)
-}
-
-// ParseInLocation is like Parse but differs in two important ways.
-// First, in the absence of time zone information, Parse interprets a time as UTC;
-// ParseInLocation interprets the time as in the given location.
-// Second, when given a zone offset or abbreviation, Parse tries to match it
-// against the Local location; ParseInLocation uses the given location.
-func ParseInLocation(layout, value string, loc *Location) (Time, error) {
-	return parse(layout, value, loc, loc)
-}
-
-func parse(layout, value string, defaultLocation, local *Location) (Time, error) {
-	alayout, avalue := layout, value
-	rangeErrString := "" // set if a value is out of range
-	amSet := false       // do we need to subtract 12 from the hour for midnight?
-	pmSet := false       // do we need to add 12 to the hour?
-
-	// Time being constructed.
-	var (
-		year       int
-		month      int = 1 // January
-		day        int = 1
-		hour       int
-		min        int
-		sec        int
-		nsec       int
-		z          *Location
-		zoneOffset int = -1
-		zoneName   string
-	)
-
-	// Each iteration processes one std value.
-	for {
-		var err error
-		prefix, std, suffix := nextStdChunk(layout)
-		stdstr := layout[len(prefix) : len(layout)-len(suffix)]
-		value, err = skip(value, prefix)
-		if err != nil {
-			return Time{}, &ParseError{alayout, avalue, prefix, value, ""}
-		}
-		if std == 0 {
-			if len(value) != 0 {
-				return Time{}, &ParseError{alayout, avalue, "", value, ": extra text: " + value}
-			}
-			break
-		}
-		layout = suffix
-		var p string
-		switch std & stdMask {
-		case stdYear:
-			if len(value) < 2 {
-				err = errBad
-				break
-			}
-			p, value = value[0:2], value[2:]
-			year, err = atoi(p)
-			if year >= 69 { // Unix time starts Dec 31 1969 in some time zones
-				year += 1900
-			} else {
-				year += 2000
-			}
-		case stdLongYear:
-			if len(value) < 4 || !isDigit(value, 0) {
-				err = errBad
-				break
-			}
-			p, value = value[0:4], value[4:]
-			year, err = atoi(p)
-		case stdMonth:
-			month, value, err = lookup(shortMonthNames, value)
-		case stdLongMonth:
-			month, value, err = lookup(longMonthNames, value)
-		case stdNumMonth, stdZeroMonth:
-			month, value, err = getnum(value, std == stdZeroMonth)
-			if month <= 0 || 12 < month {
-				rangeErrString = "month"
-			}
-		case stdWeekDay:
-			// Ignore weekday except for error checking.
-			_, value, err = lookup(shortDayNames, value)
-		case stdLongWeekDay:
-			_, value, err = lookup(longDayNames, value)
-		case stdDay, stdUnderDay, stdZeroDay:
-			if std == stdUnderDay && len(value) > 0 && value[0] == ' ' {
-				value = value[1:]
-			}
-			day, value, err = getnum(value, std == stdZeroDay)
-			if day < 0 || 31 < day {
-				rangeErrString = "day"
-			}
-		case stdHour:
-			hour, value, err = getnum(value, false)
-			if hour < 0 || 24 <= hour {
-				rangeErrString = "hour"
-			}
-		case stdHour12, stdZeroHour12:
-			hour, value, err = getnum(value, std == stdZeroHour12)
-			if hour < 0 || 12 < hour {
-				rangeErrString = "hour"
-			}
-		case stdMinute, stdZeroMinute:
-			min, value, err = getnum(value, std == stdZeroMinute)
-			if min < 0 || 60 <= min {
-				rangeErrString = "minute"
-			}
-		case stdSecond, stdZeroSecond:
-			sec, value, err = getnum(value, std == stdZeroSecond)
-			if sec < 0 || 60 <= sec {
-				rangeErrString = "second"
-			}
-			// Special case: do we have a fractional second but no
-			// fractional second in the format?
-			if len(value) >= 2 && value[0] == '.' && isDigit(value, 1) {
-				_, std, _ = nextStdChunk(layout)
-				std &= stdMask
-				if std == stdFracSecond0 || std == stdFracSecond9 {
-					// Fractional second in the layout; proceed normally
-					break
-				}
-				// No fractional second in the layout but we have one in the input.
-				n := 2
-				for ; n < len(value) && isDigit(value, n); n++ {
-				}
-				nsec, rangeErrString, err = parseNanoseconds(value, n)
-				value = value[n:]
-			}
-		case stdPM:
-			if len(value) < 2 {
-				err = errBad
-				break
-			}
-			p, value = value[0:2], value[2:]
-			switch p {
-			case "PM":
-				pmSet = true
-			case "AM":
-				amSet = true
-			default:
-				err = errBad
-			}
-		case stdpm:
-			if len(value) < 2 {
-				err = errBad
-				break
-			}
-			p, value = value[0:2], value[2:]
-			switch p {
-			case "pm":
-				pmSet = true
-			case "am":
-				amSet = true
-			default:
-				err = errBad
-			}
-		case stdISO8601TZ, stdISO8601ColonTZ, stdISO8601SecondsTZ, stdISO8601ColonSecondsTZ, stdNumTZ, stdNumShortTZ, stdNumColonTZ, stdNumSecondsTz, stdNumColonSecondsTZ:
-			if (std == stdISO8601TZ || std == stdISO8601ColonTZ) && len(value) >= 1 && value[0] == 'Z' {
-				value = value[1:]
-				z = UTC
-				break
-			}
-			var sign, hour, min, seconds string
-			if std == stdISO8601ColonTZ || std == stdNumColonTZ {
-				if len(value) < 6 {
-					err = errBad
-					break
-				}
-				if value[3] != ':' {
-					err = errBad
-					break
-				}
-				sign, hour, min, seconds, value = value[0:1], value[1:3], value[4:6], "00", value[6:]
-			} else if std == stdNumShortTZ {
-				if len(value) < 3 {
-					err = errBad
-					break
-				}
-				sign, hour, min, seconds, value = value[0:1], value[1:3], "00", "00", value[3:]
-			} else if std == stdISO8601ColonSecondsTZ || std == stdNumColonSecondsTZ {
-				if len(value) < 9 {
-					err = errBad
-					break
-				}
-				if value[3] != ':' || value[6] != ':' {
-					err = errBad
-					break
-				}
-				sign, hour, min, seconds, value = value[0:1], value[1:3], value[4:6], value[7:9], value[9:]
-			} else if std == stdISO8601SecondsTZ || std == stdNumSecondsTz {
-				if len(value) < 7 {
-					err = errBad
-					break
-				}
-				sign, hour, min, seconds, value = value[0:1], value[1:3], value[3:5], value[5:7], value[7:]
-			} else {
-				if len(value) < 5 {
-					err = errBad
-					break
-				}
-				sign, hour, min, seconds, value = value[0:1], value[1:3], value[3:5], "00", value[5:]
-			}
-			var hr, mm, ss int
-			hr, err = atoi(hour)
-			if err == nil {
-				mm, err = atoi(min)
-			}
-			if err == nil {
-				ss, err = atoi(seconds)
-			}
-			zoneOffset = (hr*60+mm)*60 + ss // offset is in seconds
-			switch sign[0] {
-			case '+':
-			case '-':
-				zoneOffset = -zoneOffset
-			default:
-				err = errBad
-			}
-		case stdTZ:
-			// Does it look like a time zone?
-			if len(value) >= 3 && value[0:3] == "UTC" {
-				z = UTC
-				value = value[3:]
-				break
-			}
-			n, ok := parseTimeZone(value)
-			if !ok {
-				err = errBad
-				break
-			}
-			zoneName, value = value[:n], value[n:]
-
-		case stdFracSecond0:
-			// stdFracSecond0 requires the exact number of digits as specified in
-			// the layout.
-			ndigit := 1 + (std >> stdArgShift)
-			if len(value) < ndigit {
-				err = errBad
-				break
-			}
-			nsec, rangeErrString, err = parseNanoseconds(value, ndigit)
-			value = value[ndigit:]
-
-		case stdFracSecond9:
-			if len(value) < 2 || value[0] != '.' || value[1] < '0' || '9' < value[1] {
-				// Fractional second omitted.
-				break
-			}
-			// Take any number of digits, even more than asked for,
-			// because it is what the stdSecond case would do.
-			i := 0
-			for i < 9 && i+1 < len(value) && '0' <= value[i+1] && value[i+1] <= '9' {
-				i++
-			}
-			nsec, rangeErrString, err = parseNanoseconds(value, 1+i)
-			value = value[1+i:]
-		}
-		if rangeErrString != "" {
-			return Time{}, &ParseError{alayout, avalue, stdstr, value, ": " + rangeErrString + " out of range"}
-		}
-		if err != nil {
-			return Time{}, &ParseError{alayout, avalue, stdstr, value, ""}
-		}
-	}
-	if pmSet && hour < 12 {
-		hour += 12
-	} else if amSet && hour == 12 {
-		hour = 0
-	}
-
-	if z != nil {
-		return Date(year, Month(month), day, hour, min, sec, nsec, z), nil
-	}
-
-	if zoneOffset != -1 {
-		t := Date(year, Month(month), day, hour, min, sec, nsec, UTC)
-		t.sec -= int64(zoneOffset)
-
-		// Look for local zone with the given offset.
-		// If that zone was in effect at the given time, use it.
-		name, offset, _, _, _ := local.lookup(t.sec + internalToUnix)
-		if offset == zoneOffset && (zoneName == "" || name == zoneName) {
-			t.loc = local
-			return t, nil
-		}
-
-		// Otherwise create fake zone to record offset.
-		t.loc = FixedZone(zoneName, zoneOffset)
-		return t, nil
-	}
-
-	if zoneName != "" {
-		t := Date(year, Month(month), day, hour, min, sec, nsec, UTC)
-		// Look for local zone with the given offset.
-		// If that zone was in effect at the given time, use it.
-		offset, _, ok := local.lookupName(zoneName, t.sec+internalToUnix)
-		if ok {
-			t.sec -= int64(offset)
-			t.loc = local
-			return t, nil
-		}
-
-		// Otherwise, create fake zone with unknown offset.
-		if len(zoneName) > 3 && zoneName[:3] == "GMT" {
-			offset, _ = atoi(zoneName[3:]) // Guaranteed OK by parseGMT.
-			offset *= 3600
-		}
-		t.loc = FixedZone(zoneName, offset)
-		return t, nil
-	}
-
-	// Otherwise, fall back to default.
-	return Date(year, Month(month), day, hour, min, sec, nsec, defaultLocation), nil
-}
-
-// parseTimeZone parses a time zone string and returns its length. Time zones
-// are human-generated and unpredictable. We can't do precise error checking.
-// On the other hand, for a correct parse there must be a time zone at the
-// beginning of the string, so it's almost always true that there's one
-// there. We look at the beginning of the string for a run of upper-case letters.
-// If there are more than 5, it's an error.
-// If there are 4 or 5 and the last is a T, it's a time zone.
-// If there are 3, it's a time zone.
-// Otherwise, other than special cases, it's not a time zone.
-// GMT is special because it can have an hour offset.
-func parseTimeZone(value string) (length int, ok bool) {
-	if len(value) < 3 {
-		return 0, false
-	}
-	// Special case 1: ChST and MeST are the only zones with a lower-case letter.
-	if len(value) >= 4 && (value[:4] == "ChST" || value[:4] == "MeST") {
-		return 4, true
-	}
-	// Special case 2: GMT may have an hour offset; treat it specially.
-	if value[:3] == "GMT" {
-		length = parseGMT(value)
-		return length, true
-	}
-	// How many upper-case letters are there? Need at least three, at most five.
-	var nUpper int
-	for nUpper = 0; nUpper < 6; nUpper++ {
-		if nUpper >= len(value) {
-			break
-		}
-		if c := value[nUpper]; c < 'A' || 'Z' < c {
-			break
-		}
-	}
-	switch nUpper {
-	case 0, 1, 2, 6:
-		return 0, false
-	case 5: // Must end in T to match.
-		if value[4] == 'T' {
-			return 5, true
-		}
-	case 4: // Must end in T to match.
-		if value[3] == 'T' {
-			return 4, true
-		}
-	case 3:
-		return 3, true
-	}
-	return 0, false
-}
-
-// parseGMT parses a GMT time zone. The input string is known to start "GMT".
-// The function checks whether that is followed by a sign and a number in the
-// range -14 through 12 excluding zero.
-func parseGMT(value string) int {
-	value = value[3:]
-	if len(value) == 0 {
-		return 3
-	}
-	sign := value[0]
-	if sign != '-' && sign != '+' {
-		return 3
-	}
-	x, rem, err := leadingInt(value[1:])
-	if err != nil {
-		return 3
-	}
-	if sign == '-' {
-		x = -x
-	}
-	if x == 0 || x < -14 || 12 < x {
-		return 3
-	}
-	return 3 + len(value) - len(rem)
-}
-
-func parseNanoseconds(value string, nbytes int) (ns int, rangeErrString string, err error) {
-	if value[0] != '.' {
-		err = errBad
-		return
-	}
-	if ns, err = atoi(value[1:nbytes]); err != nil {
-		return
-	}
-	if ns < 0 || 1e9 <= ns {
-		rangeErrString = "fractional second"
-		return
-	}
-	// We need nanoseconds, which means scaling by the number
-	// of missing digits in the format, maximum length 10. If it's
-	// longer than 10, we won't scale.
-	scaleDigits := 10 - nbytes
-	for i := 0; i < scaleDigits; i++ {
-		ns *= 10
-	}
-	return
-}
-
-var errLeadingInt = errors.New("time: bad [0-9]*") // never printed
-
-// leadingInt consumes the leading [0-9]* from s.
-func leadingInt(s string) (x int64, rem string, err error) {
-	i := 0
-	for ; i < len(s); i++ {
-		c := s[i]
-		if c < '0' || c > '9' {
-			break
-		}
-		if x > (1<<63-1)/10 {
-			// overflow
-			return 0, "", errLeadingInt
-		}
-		x = x*10 + int64(c) - '0'
-		if x < 0 {
-			// overflow
-			return 0, "", errLeadingInt
-		}
-	}
-	return x, s[i:], nil
-}
-
-var unitMap = map[string]int64{
-	"ns": int64(Nanosecond),
-	"us": int64(Microsecond),
-	"µs": int64(Microsecond), // U+00B5 = micro symbol
-	"μs": int64(Microsecond), // U+03BC = Greek letter mu
-	"ms": int64(Millisecond),
-	"s":  int64(Second),
-	"m":  int64(Minute),
-	"h":  int64(Hour),
-}
-
-// ParseDuration parses a duration string.
-// A duration string is a possibly signed sequence of
-// decimal numbers, each with optional fraction and a unit suffix,
-// such as "300ms", "-1.5h" or "2h45m".
-// Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
-func ParseDuration(s string) (Duration, error) {
-	// [-+]?([0-9]*(\.[0-9]*)?[a-z]+)+
-	orig := s
-	var d int64
-	neg := false
-
-	// Consume [-+]?
-	if s != "" {
-		c := s[0]
-		if c == '-' || c == '+' {
-			neg = c == '-'
-			s = s[1:]
-		}
-	}
-	// Special case: if all that is left is "0", this is zero.
-	if s == "0" {
-		return 0, nil
-	}
-	if s == "" {
-		return 0, errors.New("time: invalid duration " + orig)
-	}
-	for s != "" {
-		var (
-			v, f  int64       // integers before, after decimal point
-			scale float64 = 1 // value = v + f/scale
-		)
-
-		var err error
-
-		// The next character must be [0-9.]
-		if !(s[0] == '.' || '0' <= s[0] && s[0] <= '9') {
-			return 0, errors.New("time: invalid duration " + orig)
-		}
-		// Consume [0-9]*
-		pl := len(s)
-		v, s, err = leadingInt(s)
-		if err != nil {
-			return 0, errors.New("time: invalid duration " + orig)
-		}
-		pre := pl != len(s) // whether we consumed anything before a period
-
-		// Consume (\.[0-9]*)?
-		post := false
-		if s != "" && s[0] == '.' {
-			s = s[1:]
-			pl := len(s)
-			f, s, err = leadingInt(s)
-			if err != nil {
-				return 0, errors.New("time: invalid duration " + orig)
-			}
-			for n := pl - len(s); n > 0; n-- {
-				scale *= 10
-			}
-			post = pl != len(s)
-		}
-		if !pre && !post {
-			// no digits (e.g. ".s" or "-.s")
-			return 0, errors.New("time: invalid duration " + orig)
-		}
-
-		// Consume unit.
-		i := 0
-		for ; i < len(s); i++ {
-			c := s[i]
-			if c == '.' || '0' <= c && c <= '9' {
-				break
-			}
-		}
-		if i == 0 {
-			return 0, errors.New("time: missing unit in duration " + orig)
-		}
-		u := s[:i]
-		s = s[i:]
-		unit, ok := unitMap[u]
-		if !ok {
-			return 0, errors.New("time: unknown unit " + u + " in duration " + orig)
-		}
-		if v > (1<<63-1)/unit {
-			// overflow
-			return 0, errors.New("time: invalid duration " + orig)
-		}
-		v *= unit
-		if f > 0 {
-			// float64 is needed to be nanosecond accurate for fractions of hours.
-			// v >= 0 && (f*unit/scale) <= 3.6e+12 (ns/h, h is the largest unit)
-			v += int64(float64(f) * (float64(unit) / scale))
-			if v < 0 {
-				// overflow
-				return 0, errors.New("time: invalid duration " + orig)
-			}
-		}
-		d += v
-		if d < 0 {
-			// overflow
-			return 0, errors.New("time: invalid duration " + orig)
-		}
-	}
-
-	if neg {
-		d = -d
-	}
-	return Duration(d), nil
-}
diff --git a/third_party/gofrontend/libgo/go/time/format_test.go b/third_party/gofrontend/libgo/go/time/format_test.go
deleted file mode 100644
index 75a08c7..0000000
--- a/third_party/gofrontend/libgo/go/time/format_test.go
+++ /dev/null
@@ -1,520 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time_test
-
-import (
-	"fmt"
-	"strconv"
-	"strings"
-	"testing"
-	"testing/quick"
-	. "time"
-)
-
-type TimeFormatTest struct {
-	time           Time
-	formattedValue string
-}
-
-var rfc3339Formats = []TimeFormatTest{
-	{Date(2008, 9, 17, 20, 4, 26, 0, UTC), "2008-09-17T20:04:26Z"},
-	{Date(1994, 9, 17, 20, 4, 26, 0, FixedZone("EST", -18000)), "1994-09-17T20:04:26-05:00"},
-	{Date(2000, 12, 26, 1, 15, 6, 0, FixedZone("OTO", 15600)), "2000-12-26T01:15:06+04:20"},
-}
-
-func TestRFC3339Conversion(t *testing.T) {
-	for _, f := range rfc3339Formats {
-		if f.time.Format(RFC3339) != f.formattedValue {
-			t.Error("RFC3339:")
-			t.Errorf("  want=%+v", f.formattedValue)
-			t.Errorf("  have=%+v", f.time.Format(RFC3339))
-		}
-	}
-}
-
-type FormatTest struct {
-	name   string
-	format string
-	result string
-}
-
-var formatTests = []FormatTest{
-	{"ANSIC", ANSIC, "Wed Feb  4 21:00:57 2009"},
-	{"UnixDate", UnixDate, "Wed Feb  4 21:00:57 PST 2009"},
-	{"RubyDate", RubyDate, "Wed Feb 04 21:00:57 -0800 2009"},
-	{"RFC822", RFC822, "04 Feb 09 21:00 PST"},
-	{"RFC850", RFC850, "Wednesday, 04-Feb-09 21:00:57 PST"},
-	{"RFC1123", RFC1123, "Wed, 04 Feb 2009 21:00:57 PST"},
-	{"RFC1123Z", RFC1123Z, "Wed, 04 Feb 2009 21:00:57 -0800"},
-	{"RFC3339", RFC3339, "2009-02-04T21:00:57-08:00"},
-	{"RFC3339Nano", RFC3339Nano, "2009-02-04T21:00:57.0123456-08:00"},
-	{"Kitchen", Kitchen, "9:00PM"},
-	{"am/pm", "3pm", "9pm"},
-	{"AM/PM", "3PM", "9PM"},
-	{"two-digit year", "06 01 02", "09 02 04"},
-	// Three-letter months and days must not be followed by lower-case letter.
-	{"Janet", "Hi Janet, the Month is January", "Hi Janet, the Month is February"},
-	// Time stamps, Fractional seconds.
-	{"Stamp", Stamp, "Feb  4 21:00:57"},
-	{"StampMilli", StampMilli, "Feb  4 21:00:57.012"},
-	{"StampMicro", StampMicro, "Feb  4 21:00:57.012345"},
-	{"StampNano", StampNano, "Feb  4 21:00:57.012345600"},
-}
-
-func TestFormat(t *testing.T) {
-	// The numeric time represents Thu Feb  4 21:00:57.012345600 PST 2010
-	time := Unix(0, 1233810057012345600)
-	for _, test := range formatTests {
-		result := time.Format(test.format)
-		if result != test.result {
-			t.Errorf("%s expected %q got %q", test.name, test.result, result)
-		}
-	}
-}
-
-func TestFormatShortYear(t *testing.T) {
-	years := []int{
-		-100001, -100000, -99999,
-		-10001, -10000, -9999,
-		-1001, -1000, -999,
-		-101, -100, -99,
-		-11, -10, -9,
-		-1, 0, 1,
-		9, 10, 11,
-		99, 100, 101,
-		999, 1000, 1001,
-		9999, 10000, 10001,
-		99999, 100000, 100001,
-	}
-
-	for _, y := range years {
-		time := Date(y, January, 1, 0, 0, 0, 0, UTC)
-		result := time.Format("2006.01.02")
-		var want string
-		if y < 0 {
-			// The 4 in %04d counts the - sign, so print -y instead
-			// and introduce our own - sign.
-			want = fmt.Sprintf("-%04d.%02d.%02d", -y, 1, 1)
-		} else {
-			want = fmt.Sprintf("%04d.%02d.%02d", y, 1, 1)
-		}
-		if result != want {
-			t.Errorf("(jan 1 %d).Format(\"2006.01.02\") = %q, want %q", y, result, want)
-		}
-	}
-}
-
-type ParseTest struct {
-	name       string
-	format     string
-	value      string
-	hasTZ      bool // contains a time zone
-	hasWD      bool // contains a weekday
-	yearSign   int  // sign of year, -1 indicates the year is not present in the format
-	fracDigits int  // number of digits of fractional second
-}
-
-var parseTests = []ParseTest{
-	{"ANSIC", ANSIC, "Thu Feb  4 21:00:57 2010", false, true, 1, 0},
-	{"UnixDate", UnixDate, "Thu Feb  4 21:00:57 PST 2010", true, true, 1, 0},
-	{"RubyDate", RubyDate, "Thu Feb 04 21:00:57 -0800 2010", true, true, 1, 0},
-	{"RFC850", RFC850, "Thursday, 04-Feb-10 21:00:57 PST", true, true, 1, 0},
-	{"RFC1123", RFC1123, "Thu, 04 Feb 2010 21:00:57 PST", true, true, 1, 0},
-	{"RFC1123", RFC1123, "Thu, 04 Feb 2010 22:00:57 PDT", true, true, 1, 0},
-	{"RFC1123Z", RFC1123Z, "Thu, 04 Feb 2010 21:00:57 -0800", true, true, 1, 0},
-	{"RFC3339", RFC3339, "2010-02-04T21:00:57-08:00", true, false, 1, 0},
-	{"custom: \"2006-01-02 15:04:05-07\"", "2006-01-02 15:04:05-07", "2010-02-04 21:00:57-08", true, false, 1, 0},
-	// Optional fractional seconds.
-	{"ANSIC", ANSIC, "Thu Feb  4 21:00:57.0 2010", false, true, 1, 1},
-	{"UnixDate", UnixDate, "Thu Feb  4 21:00:57.01 PST 2010", true, true, 1, 2},
-	{"RubyDate", RubyDate, "Thu Feb 04 21:00:57.012 -0800 2010", true, true, 1, 3},
-	{"RFC850", RFC850, "Thursday, 04-Feb-10 21:00:57.0123 PST", true, true, 1, 4},
-	{"RFC1123", RFC1123, "Thu, 04 Feb 2010 21:00:57.01234 PST", true, true, 1, 5},
-	{"RFC1123Z", RFC1123Z, "Thu, 04 Feb 2010 21:00:57.01234 -0800", true, true, 1, 5},
-	{"RFC3339", RFC3339, "2010-02-04T21:00:57.012345678-08:00", true, false, 1, 9},
-	{"custom: \"2006-01-02 15:04:05\"", "2006-01-02 15:04:05", "2010-02-04 21:00:57.0", false, false, 1, 0},
-	// Amount of white space should not matter.
-	{"ANSIC", ANSIC, "Thu Feb 4 21:00:57 2010", false, true, 1, 0},
-	{"ANSIC", ANSIC, "Thu      Feb     4     21:00:57     2010", false, true, 1, 0},
-	// Case should not matter
-	{"ANSIC", ANSIC, "THU FEB 4 21:00:57 2010", false, true, 1, 0},
-	{"ANSIC", ANSIC, "thu feb 4 21:00:57 2010", false, true, 1, 0},
-	// Fractional seconds.
-	{"millisecond", "Mon Jan _2 15:04:05.000 2006", "Thu Feb  4 21:00:57.012 2010", false, true, 1, 3},
-	{"microsecond", "Mon Jan _2 15:04:05.000000 2006", "Thu Feb  4 21:00:57.012345 2010", false, true, 1, 6},
-	{"nanosecond", "Mon Jan _2 15:04:05.000000000 2006", "Thu Feb  4 21:00:57.012345678 2010", false, true, 1, 9},
-	// Leading zeros in other places should not be taken as fractional seconds.
-	{"zero1", "2006.01.02.15.04.05.0", "2010.02.04.21.00.57.0", false, false, 1, 1},
-	{"zero2", "2006.01.02.15.04.05.00", "2010.02.04.21.00.57.01", false, false, 1, 2},
-	// Month and day names only match when not followed by a lower-case letter.
-	{"Janet", "Hi Janet, the Month is January: Jan _2 15:04:05 2006", "Hi Janet, the Month is February: Feb  4 21:00:57 2010", false, true, 1, 0},
-
-	// GMT with offset.
-	{"GMT-8", UnixDate, "Fri Feb  5 05:00:57 GMT-8 2010", true, true, 1, 0},
-
-	// Accept any number of fractional second digits (including none) for .999...
-	// In Go 1, .999... was completely ignored in the format, meaning the first two
-	// cases would succeed, but the next four would not. Go 1.1 accepts all six.
-	{"", "2006-01-02 15:04:05.9999 -0700 MST", "2010-02-04 21:00:57 -0800 PST", true, false, 1, 0},
-	{"", "2006-01-02 15:04:05.999999999 -0700 MST", "2010-02-04 21:00:57 -0800 PST", true, false, 1, 0},
-	{"", "2006-01-02 15:04:05.9999 -0700 MST", "2010-02-04 21:00:57.0123 -0800 PST", true, false, 1, 4},
-	{"", "2006-01-02 15:04:05.999999999 -0700 MST", "2010-02-04 21:00:57.0123 -0800 PST", true, false, 1, 4},
-	{"", "2006-01-02 15:04:05.9999 -0700 MST", "2010-02-04 21:00:57.012345678 -0800 PST", true, false, 1, 9},
-	{"", "2006-01-02 15:04:05.999999999 -0700 MST", "2010-02-04 21:00:57.012345678 -0800 PST", true, false, 1, 9},
-
-	// issue 4502.
-	{"", StampNano, "Feb  4 21:00:57.012345678", false, false, -1, 9},
-	{"", "Jan _2 15:04:05.999", "Feb  4 21:00:57.012300000", false, false, -1, 4},
-	{"", "Jan _2 15:04:05.999", "Feb  4 21:00:57.012345678", false, false, -1, 9},
-	{"", "Jan _2 15:04:05.999999999", "Feb  4 21:00:57.0123", false, false, -1, 4},
-	{"", "Jan _2 15:04:05.999999999", "Feb  4 21:00:57.012345678", false, false, -1, 9},
-}
-
-func TestParse(t *testing.T) {
-	for _, test := range parseTests {
-		time, err := Parse(test.format, test.value)
-		if err != nil {
-			t.Errorf("%s error: %v", test.name, err)
-		} else {
-			checkTime(time, &test, t)
-		}
-	}
-}
-
-func TestParseInLocation(t *testing.T) {
-	// Check that Parse (and ParseInLocation) understand that
-	// Feb 01 AST (Arabia Standard Time) and Feb 01 AST (Atlantic Standard Time)
-	// are in different time zones even though both are called AST
-
-	baghdad, err := LoadLocation("Asia/Baghdad")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	t1, err := ParseInLocation("Jan 02 2006 MST", "Feb 01 2013 AST", baghdad)
-	if err != nil {
-		t.Fatal(err)
-	}
-	t2 := Date(2013, February, 1, 00, 00, 00, 0, baghdad)
-	if t1 != t2 {
-		t.Fatalf("ParseInLocation(Feb 01 2013 AST, Baghdad) = %v, want %v", t1, t2)
-	}
-	_, offset := t1.Zone()
-	if offset != 3*60*60 {
-		t.Fatalf("ParseInLocation(Feb 01 2013 AST, Baghdad).Zone = _, %d, want _, %d", offset, 3*60*60)
-	}
-
-	blancSablon, err := LoadLocation("America/Blanc-Sablon")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	t1, err = ParseInLocation("Jan 02 2006 MST", "Feb 01 2013 AST", blancSablon)
-	if err != nil {
-		t.Fatal(err)
-	}
-	t2 = Date(2013, February, 1, 00, 00, 00, 0, blancSablon)
-	if t1 != t2 {
-		t.Fatalf("ParseInLocation(Feb 01 2013 AST, Blanc-Sablon) = %v, want %v", t1, t2)
-	}
-	_, offset = t1.Zone()
-	if offset != -4*60*60 {
-		t.Fatalf("ParseInLocation(Feb 01 2013 AST, Blanc-Sablon).Zone = _, %d, want _, %d", offset, -4*60*60)
-	}
-}
-
-func TestLoadLocationZipFile(t *testing.T) {
-	t.Skip("gccgo does not use the zip file")
-
-	ForceZipFileForTesting(true)
-	defer ForceZipFileForTesting(false)
-
-	_, err := LoadLocation("Australia/Sydney")
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-var rubyTests = []ParseTest{
-	{"RubyDate", RubyDate, "Thu Feb 04 21:00:57 -0800 2010", true, true, 1, 0},
-	// Ignore the time zone in the test. If it parses, it'll be OK.
-	{"RubyDate", RubyDate, "Thu Feb 04 21:00:57 -0000 2010", false, true, 1, 0},
-	{"RubyDate", RubyDate, "Thu Feb 04 21:00:57 +0000 2010", false, true, 1, 0},
-	{"RubyDate", RubyDate, "Thu Feb 04 21:00:57 +1130 2010", false, true, 1, 0},
-}
-
-// Problematic time zone format needs special tests.
-func TestRubyParse(t *testing.T) {
-	for _, test := range rubyTests {
-		time, err := Parse(test.format, test.value)
-		if err != nil {
-			t.Errorf("%s error: %v", test.name, err)
-		} else {
-			checkTime(time, &test, t)
-		}
-	}
-}
-
-func checkTime(time Time, test *ParseTest, t *testing.T) {
-	// The time should be Thu Feb  4 21:00:57 PST 2010
-	if test.yearSign >= 0 && test.yearSign*time.Year() != 2010 {
-		t.Errorf("%s: bad year: %d not %d", test.name, time.Year(), 2010)
-	}
-	if time.Month() != February {
-		t.Errorf("%s: bad month: %s not %s", test.name, time.Month(), February)
-	}
-	if time.Day() != 4 {
-		t.Errorf("%s: bad day: %d not %d", test.name, time.Day(), 4)
-	}
-	if time.Hour() != 21 {
-		t.Errorf("%s: bad hour: %d not %d", test.name, time.Hour(), 21)
-	}
-	if time.Minute() != 0 {
-		t.Errorf("%s: bad minute: %d not %d", test.name, time.Minute(), 0)
-	}
-	if time.Second() != 57 {
-		t.Errorf("%s: bad second: %d not %d", test.name, time.Second(), 57)
-	}
-	// Nanoseconds must be checked against the precision of the input.
-	nanosec, err := strconv.ParseUint("012345678"[:test.fracDigits]+"000000000"[:9-test.fracDigits], 10, 0)
-	if err != nil {
-		panic(err)
-	}
-	if time.Nanosecond() != int(nanosec) {
-		t.Errorf("%s: bad nanosecond: %d not %d", test.name, time.Nanosecond(), nanosec)
-	}
-	name, offset := time.Zone()
-	if test.hasTZ && offset != -28800 {
-		t.Errorf("%s: bad tz offset: %s %d not %d", test.name, name, offset, -28800)
-	}
-	if test.hasWD && time.Weekday() != Thursday {
-		t.Errorf("%s: bad weekday: %s not %s", test.name, time.Weekday(), Thursday)
-	}
-}
-
-func TestFormatAndParse(t *testing.T) {
-	const fmt = "Mon MST " + RFC3339 // all fields
-	f := func(sec int64) bool {
-		t1 := Unix(sec, 0)
-		if t1.Year() < 1000 || t1.Year() > 9999 {
-			// not required to work
-			return true
-		}
-		t2, err := Parse(fmt, t1.Format(fmt))
-		if err != nil {
-			t.Errorf("error: %s", err)
-			return false
-		}
-		if t1.Unix() != t2.Unix() || t1.Nanosecond() != t2.Nanosecond() {
-			t.Errorf("FormatAndParse %d: %q(%d) %q(%d)", sec, t1, t1.Unix(), t2, t2.Unix())
-			return false
-		}
-		return true
-	}
-	f32 := func(sec int32) bool { return f(int64(sec)) }
-	cfg := &quick.Config{MaxCount: 10000}
-
-	// Try a reasonable date first, then the huge ones.
-	if err := quick.Check(f32, cfg); err != nil {
-		t.Fatal(err)
-	}
-	if err := quick.Check(f, cfg); err != nil {
-		t.Fatal(err)
-	}
-}
-
-type ParseTimeZoneTest struct {
-	value  string
-	length int
-	ok     bool
-}
-
-var parseTimeZoneTests = []ParseTimeZoneTest{
-	{"gmt hi there", 0, false},
-	{"GMT hi there", 3, true},
-	{"GMT+12 hi there", 6, true},
-	{"GMT+00 hi there", 3, true}, // 0 or 00 is not a legal offset.
-	{"GMT-5 hi there", 5, true},
-	{"GMT-51 hi there", 3, true},
-	{"ChST hi there", 4, true},
-	{"MeST hi there", 4, true},
-	{"MSDx", 3, true},
-	{"MSDY", 0, false}, // four letters must end in T.
-	{"ESAST hi", 5, true},
-	{"ESASTT hi", 0, false}, // run of upper-case letters too long.
-	{"ESATY hi", 0, false},  // five letters must end in T.
-}
-
-func TestParseTimeZone(t *testing.T) {
-	for _, test := range parseTimeZoneTests {
-		length, ok := ParseTimeZone(test.value)
-		if ok != test.ok {
-			t.Errorf("expected %t for %q got %t", test.ok, test.value, ok)
-		} else if length != test.length {
-			t.Errorf("expected %d for %q got %d", test.length, test.value, length)
-		}
-	}
-}
-
-type ParseErrorTest struct {
-	format string
-	value  string
-	expect string // must appear within the error
-}
-
-var parseErrorTests = []ParseErrorTest{
-	{ANSIC, "Feb  4 21:00:60 2010", "cannot parse"}, // cannot parse Feb as Mon
-	{ANSIC, "Thu Feb  4 21:00:57 @2010", "cannot parse"},
-	{ANSIC, "Thu Feb  4 21:00:60 2010", "second out of range"},
-	{ANSIC, "Thu Feb  4 21:61:57 2010", "minute out of range"},
-	{ANSIC, "Thu Feb  4 24:00:60 2010", "hour out of range"},
-	{"Mon Jan _2 15:04:05.000 2006", "Thu Feb  4 23:00:59x01 2010", "cannot parse"},
-	{"Mon Jan _2 15:04:05.000 2006", "Thu Feb  4 23:00:59.xxx 2010", "cannot parse"},
-	{"Mon Jan _2 15:04:05.000 2006", "Thu Feb  4 23:00:59.-123 2010", "fractional second out of range"},
-	// issue 4502. StampNano requires exactly 9 digits of precision.
-	{StampNano, "Dec  7 11:22:01.000000", `cannot parse ".000000" as ".000000000"`},
-	{StampNano, "Dec  7 11:22:01.0000000000", "extra text: 0"},
-	// issue 4493. Helpful errors.
-	{RFC3339, "2006-01-02T15:04:05Z07:00", `parsing time "2006-01-02T15:04:05Z07:00": extra text: 07:00`},
-	{RFC3339, "2006-01-02T15:04_abc", `parsing time "2006-01-02T15:04_abc" as "2006-01-02T15:04:05Z07:00": cannot parse "_abc" as ":"`},
-	{RFC3339, "2006-01-02T15:04:05_abc", `parsing time "2006-01-02T15:04:05_abc" as "2006-01-02T15:04:05Z07:00": cannot parse "_abc" as "Z07:00"`},
-	{RFC3339, "2006-01-02T15:04:05Z_abc", `parsing time "2006-01-02T15:04:05Z_abc": extra text: _abc`},
-}
-
-func TestParseErrors(t *testing.T) {
-	for _, test := range parseErrorTests {
-		_, err := Parse(test.format, test.value)
-		if err == nil {
-			t.Errorf("expected error for %q %q", test.format, test.value)
-		} else if strings.Index(err.Error(), test.expect) < 0 {
-			t.Errorf("expected error with %q for %q %q; got %s", test.expect, test.format, test.value, err)
-		}
-	}
-}
-
-func TestNoonIs12PM(t *testing.T) {
-	noon := Date(0, January, 1, 12, 0, 0, 0, UTC)
-	const expect = "12:00PM"
-	got := noon.Format("3:04PM")
-	if got != expect {
-		t.Errorf("got %q; expect %q", got, expect)
-	}
-	got = noon.Format("03:04PM")
-	if got != expect {
-		t.Errorf("got %q; expect %q", got, expect)
-	}
-}
-
-func TestMidnightIs12AM(t *testing.T) {
-	midnight := Date(0, January, 1, 0, 0, 0, 0, UTC)
-	expect := "12:00AM"
-	got := midnight.Format("3:04PM")
-	if got != expect {
-		t.Errorf("got %q; expect %q", got, expect)
-	}
-	got = midnight.Format("03:04PM")
-	if got != expect {
-		t.Errorf("got %q; expect %q", got, expect)
-	}
-}
-
-func Test12PMIsNoon(t *testing.T) {
-	noon, err := Parse("3:04PM", "12:00PM")
-	if err != nil {
-		t.Fatal("error parsing date:", err)
-	}
-	if noon.Hour() != 12 {
-		t.Errorf("got %d; expect 12", noon.Hour())
-	}
-	noon, err = Parse("03:04PM", "12:00PM")
-	if err != nil {
-		t.Fatal("error parsing date:", err)
-	}
-	if noon.Hour() != 12 {
-		t.Errorf("got %d; expect 12", noon.Hour())
-	}
-}
-
-func Test12AMIsMidnight(t *testing.T) {
-	midnight, err := Parse("3:04PM", "12:00AM")
-	if err != nil {
-		t.Fatal("error parsing date:", err)
-	}
-	if midnight.Hour() != 0 {
-		t.Errorf("got %d; expect 0", midnight.Hour())
-	}
-	midnight, err = Parse("03:04PM", "12:00AM")
-	if err != nil {
-		t.Fatal("error parsing date:", err)
-	}
-	if midnight.Hour() != 0 {
-		t.Errorf("got %d; expect 0", midnight.Hour())
-	}
-}
-
-// Check that a time without a Zone still produces a (numeric) time zone
-// when formatted with MST as a requested zone.
-func TestMissingZone(t *testing.T) {
-	time, err := Parse(RubyDate, "Thu Feb 02 16:10:03 -0500 2006")
-	if err != nil {
-		t.Fatal("error parsing date:", err)
-	}
-	expect := "Thu Feb  2 16:10:03 -0500 2006" // -0500 not EST
-	str := time.Format(UnixDate)               // uses MST as its time zone
-	if str != expect {
-		t.Errorf("got %s; expect %s", str, expect)
-	}
-}
-
-func TestMinutesInTimeZone(t *testing.T) {
-	time, err := Parse(RubyDate, "Mon Jan 02 15:04:05 +0123 2006")
-	if err != nil {
-		t.Fatal("error parsing date:", err)
-	}
-	expected := (1*60 + 23) * 60
-	_, offset := time.Zone()
-	if offset != expected {
-		t.Errorf("ZoneOffset = %d, want %d", offset, expected)
-	}
-}
-
-type SecondsTimeZoneOffsetTest struct {
-	format         string
-	value          string
-	expectedoffset int
-}
-
-var secondsTimeZoneOffsetTests = []SecondsTimeZoneOffsetTest{
-	{"2006-01-02T15:04:05-070000", "1871-01-01T05:33:02-003408", -(34*60 + 8)},
-	{"2006-01-02T15:04:05-07:00:00", "1871-01-01T05:33:02-00:34:08", -(34*60 + 8)},
-	{"2006-01-02T15:04:05-070000", "1871-01-01T05:33:02+003408", 34*60 + 8},
-	{"2006-01-02T15:04:05-07:00:00", "1871-01-01T05:33:02+00:34:08", 34*60 + 8},
-	{"2006-01-02T15:04:05Z070000", "1871-01-01T05:33:02-003408", -(34*60 + 8)},
-	{"2006-01-02T15:04:05Z07:00:00", "1871-01-01T05:33:02+00:34:08", 34*60 + 8},
-}
-
-func TestParseSecondsInTimeZone(t *testing.T) {
-	// should accept timezone offsets with seconds like: Zone America/New_York   -4:56:02 -      LMT     1883 Nov 18 12:03:58
-	for _, test := range secondsTimeZoneOffsetTests {
-		time, err := Parse(test.format, test.value)
-		if err != nil {
-			t.Fatal("error parsing date:", err)
-		}
-		_, offset := time.Zone()
-		if offset != test.expectedoffset {
-			t.Errorf("ZoneOffset = %d, want %d", offset, test.expectedoffset)
-		}
-	}
-}
-
-func TestFormatSecondsInTimeZone(t *testing.T) {
-	for _, test := range secondsTimeZoneOffsetTests {
-		d := Date(1871, 1, 1, 5, 33, 2, 0, FixedZone("LMT", test.expectedoffset))
-		timestr := d.Format(test.format)
-		if timestr != test.value {
-			t.Errorf("Format = %s, want %s", timestr, test.value)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/time/genzabbrs.go b/third_party/gofrontend/libgo/go/time/genzabbrs.go
deleted file mode 100644
index 9eb0728..0000000
--- a/third_party/gofrontend/libgo/go/time/genzabbrs.go
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-//
-// usage:
-//
-// go run genzabbrs.go -output zoneinfo_abbrs_windows.go
-//
-
-package main
-
-import (
-	"bytes"
-	"encoding/xml"
-	"flag"
-	"go/format"
-	"io/ioutil"
-	"log"
-	"net/http"
-	"sort"
-	"text/template"
-	"time"
-)
-
-var filename = flag.String("output", "zoneinfo_abbrs_windows.go", "output file name")
-
-// getAbbrs finds timezone abbreviations (standard and daylight saving time)
-// for location l.
-func getAbbrs(l *time.Location) (st, dt string) {
-	t := time.Date(time.Now().Year(), 0, 0, 0, 0, 0, 0, l)
-	abbr1, off1 := t.Zone()
-	for i := 0; i < 12; i++ {
-		t = t.AddDate(0, 1, 0)
-		abbr2, off2 := t.Zone()
-		if abbr1 != abbr2 {
-			if off2-off1 < 0 { // southern hemisphere
-				abbr1, abbr2 = abbr2, abbr1
-			}
-			return abbr1, abbr2
-		}
-	}
-	return abbr1, abbr1
-}
-
-type zone struct {
-	WinName  string
-	UnixName string
-	StTime   string
-	DSTime   string
-}
-
-type zones []*zone
-
-func (zs zones) Len() int           { return len(zs) }
-func (zs zones) Swap(i, j int)      { zs[i], zs[j] = zs[j], zs[i] }
-func (zs zones) Less(i, j int) bool { return zs[i].UnixName < zs[j].UnixName }
-
-const wzURL = "http://unicode.org/cldr/data/common/supplemental/windowsZones.xml"
-
-type MapZone struct {
-	Other     string `xml:"other,attr"`
-	Territory string `xml:"territory,attr"`
-	Type      string `xml:"type,attr"`
-}
-
-type SupplementalData struct {
-	Zones []MapZone `xml:"windowsZones>mapTimezones>mapZone"`
-}
-
-func readWindowsZones() (zones, error) {
-	r, err := http.Get(wzURL)
-	if err != nil {
-		return nil, err
-	}
-	defer r.Body.Close()
-
-	data, err := ioutil.ReadAll(r.Body)
-	if err != nil {
-		return nil, err
-	}
-
-	var sd SupplementalData
-	err = xml.Unmarshal(data, &sd)
-	if err != nil {
-		return nil, err
-	}
-	zs := make(zones, 0)
-	for _, z := range sd.Zones {
-		if z.Territory != "001" {
-			// to avoid dups. I don't know why.
-			continue
-		}
-		l, err := time.LoadLocation(z.Type)
-		if err != nil {
-			return nil, err
-		}
-		st, dt := getAbbrs(l)
-		zs = append(zs, &zone{
-			WinName:  z.Other,
-			UnixName: z.Type,
-			StTime:   st,
-			DSTime:   dt,
-		})
-	}
-	return zs, nil
-}
-
-func main() {
-	flag.Parse()
-	zs, err := readWindowsZones()
-	if err != nil {
-		log.Fatal(err)
-	}
-	sort.Sort(zs)
-	var v = struct {
-		URL string
-		Zs  zones
-	}{
-		wzURL,
-		zs,
-	}
-	var buf bytes.Buffer
-	err = template.Must(template.New("prog").Parse(prog)).Execute(&buf, v)
-	if err != nil {
-		log.Fatal(err)
-	}
-	data, err := format.Source(buf.Bytes())
-	if err != nil {
-		log.Fatal(err)
-	}
-	err = ioutil.WriteFile(*filename, data, 0644)
-	if err != nil {
-		log.Fatal(err)
-	}
-}
-
-const prog = `
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// generated by genzabbrs.go from
-// {{.URL}}
-
-package time
-
-type abbr struct {
-	std string
-	dst string
-}
-
-var abbrs = map[string]abbr{
-{{range .Zs}}	"{{.WinName}}": {"{{.StTime}}", "{{.DSTime}}"}, // {{.UnixName}}
-{{end}}}
-
-`
diff --git a/third_party/gofrontend/libgo/go/time/internal_test.go b/third_party/gofrontend/libgo/go/time/internal_test.go
deleted file mode 100644
index edd523b..0000000
--- a/third_party/gofrontend/libgo/go/time/internal_test.go
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time
-
-func init() {
-	// force US/Pacific for time zone tests
-	ForceUSPacificForTesting()
-}
-
-var Interrupt = interrupt
-var DaysIn = daysIn
-
-func empty(arg interface{}, seq uintptr) {}
-
-// Test that a runtimeTimer with a duration so large it overflows
-// does not cause other timers to hang.
-//
-// This test has to be in internal_test.go since it fiddles with
-// unexported data structures.
-func CheckRuntimeTimerOverflow() {
-	// We manually create a runtimeTimer to bypass the overflow
-	// detection logic in NewTimer: we're testing the underlying
-	// runtime.addtimer function.
-	r := &runtimeTimer{
-		when: runtimeNano() + (1<<63 - 1),
-		f:    empty,
-		arg:  nil,
-	}
-	startTimer(r)
-
-	// Start a goroutine that should send on t.C right away.
-	t := NewTimer(1)
-
-	defer func() {
-		// Subsequent tests won't work correctly if we don't stop the
-		// overflow timer and kick the timer proc back into service.
-		//
-		// The timer proc is now sleeping and can only be awoken by
-		// adding a timer to the *beginning* of the heap. We can't
-		// wake it up by calling NewTimer since other tests may have
-		// left timers running that should have expired before ours.
-		// Instead we zero the overflow timer duration and start it
-		// once more.
-		stopTimer(r)
-		t.Stop()
-		r.when = 0
-		startTimer(r)
-	}()
-
-	// If the test fails, we will hang here until the timeout in the testing package
-	// fires, which is 10 minutes. It would be nice to catch the problem sooner,
-	// but there is no reliable way to guarantee that timerproc schedules without
-	// doing something involving timerproc itself. Previous failed attempts have
-	// tried calling runtime.Gosched and runtime.GC, but neither is reliable.
-	// So we fall back to hope: We hope we don't hang here.
-	<-t.C
-}
diff --git a/third_party/gofrontend/libgo/go/time/sleep.go b/third_party/gofrontend/libgo/go/time/sleep.go
deleted file mode 100644
index e7a2ee2..0000000
--- a/third_party/gofrontend/libgo/go/time/sleep.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time
-
-// Sleep pauses the current goroutine for at least the duration d.
-// A negative or zero duration causes Sleep to return immediately.
-func Sleep(d Duration)
-
-// runtimeNano returns the current value of the runtime clock in nanoseconds.
-func runtimeNano() int64
-
-// Interface to timers implemented in package runtime.
-// Must be in sync with ../runtime/runtime.h:/^struct.Timer$
-type runtimeTimer struct {
-	i      int
-	when   int64
-	period int64
-	f      func(interface{}, uintptr) // NOTE: must not be closure
-	arg    interface{}
-	seq    uintptr
-}
-
-// when is a helper function for setting the 'when' field of a runtimeTimer.
-// It returns what the time will be, in nanoseconds, Duration d in the future.
-// If d is negative, it is ignored.  If the returned value would be less than
-// zero because of an overflow, MaxInt64 is returned.
-func when(d Duration) int64 {
-	if d <= 0 {
-		return runtimeNano()
-	}
-	t := runtimeNano() + int64(d)
-	if t < 0 {
-		t = 1<<63 - 1 // math.MaxInt64
-	}
-	return t
-}
-
-func startTimer(*runtimeTimer)
-func stopTimer(*runtimeTimer) bool
-
-// The Timer type represents a single event.
-// When the Timer expires, the current time will be sent on C,
-// unless the Timer was created by AfterFunc.
-// A Timer must be created with NewTimer or AfterFunc.
-type Timer struct {
-	C <-chan Time
-	r runtimeTimer
-}
-
-// Stop prevents the Timer from firing.
-// It returns true if the call stops the timer, false if the timer has already
-// expired or been stopped.
-// Stop does not close the channel, to prevent a read from the channel succeeding
-// incorrectly.
-func (t *Timer) Stop() bool {
-	if t.r.f == nil {
-		panic("time: Stop called on uninitialized Timer")
-	}
-	return stopTimer(&t.r)
-}
-
-// NewTimer creates a new Timer that will send
-// the current time on its channel after at least duration d.
-func NewTimer(d Duration) *Timer {
-	c := make(chan Time, 1)
-	t := &Timer{
-		C: c,
-		r: runtimeTimer{
-			when: when(d),
-			f:    sendTime,
-			arg:  c,
-		},
-	}
-	startTimer(&t.r)
-	return t
-}
-
-// Reset changes the timer to expire after duration d.
-// It returns true if the timer had been active, false if the timer had
-// expired or been stopped.
-func (t *Timer) Reset(d Duration) bool {
-	if t.r.f == nil {
-		panic("time: Reset called on uninitialized Timer")
-	}
-	w := when(d)
-	active := stopTimer(&t.r)
-	t.r.when = w
-	startTimer(&t.r)
-	return active
-}
-
-func sendTime(c interface{}, seq uintptr) {
-	// Non-blocking send of time on c.
-	// Used in NewTimer, it cannot block anyway (buffer).
-	// Used in NewTicker, dropping sends on the floor is
-	// the desired behavior when the reader gets behind,
-	// because the sends are periodic.
-	select {
-	case c.(chan Time) <- Now():
-	default:
-	}
-}
-
-// After waits for the duration to elapse and then sends the current time
-// on the returned channel.
-// It is equivalent to NewTimer(d).C.
-func After(d Duration) <-chan Time {
-	return NewTimer(d).C
-}
-
-// AfterFunc waits for the duration to elapse and then calls f
-// in its own goroutine. It returns a Timer that can
-// be used to cancel the call using its Stop method.
-func AfterFunc(d Duration, f func()) *Timer {
-	t := &Timer{
-		r: runtimeTimer{
-			when: when(d),
-			f:    goFunc,
-			arg:  f,
-		},
-	}
-	startTimer(&t.r)
-	return t
-}
-
-func goFunc(arg interface{}, seq uintptr) {
-	go arg.(func())()
-}
diff --git a/third_party/gofrontend/libgo/go/time/sleep_test.go b/third_party/gofrontend/libgo/go/time/sleep_test.go
deleted file mode 100644
index c286bd0..0000000
--- a/third_party/gofrontend/libgo/go/time/sleep_test.go
+++ /dev/null
@@ -1,438 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time_test
-
-import (
-	"errors"
-	"fmt"
-	"runtime"
-	"strings"
-	"sync"
-	"sync/atomic"
-	"testing"
-	. "time"
-)
-
-// Go runtime uses different Windows timers for time.Now and sleeping.
-// These can tick at different frequencies and can arrive out of sync.
-// The effect can be seen, for example, as time.Sleep(100ms) is actually
-// shorter then 100ms when measured as difference between time.Now before and
-// after time.Sleep call. This was observed on Windows XP SP3 (windows/386).
-// windowsInaccuracy is to ignore such errors.
-const windowsInaccuracy = 17 * Millisecond
-
-func TestSleep(t *testing.T) {
-	const delay = 100 * Millisecond
-	go func() {
-		Sleep(delay / 2)
-		Interrupt()
-	}()
-	start := Now()
-	Sleep(delay)
-	delayadj := delay
-	if runtime.GOOS == "windows" {
-		delayadj -= windowsInaccuracy
-	}
-	duration := Now().Sub(start)
-	if duration < delayadj {
-		t.Fatalf("Sleep(%s) slept for only %s", delay, duration)
-	}
-}
-
-// Test the basic function calling behavior. Correct queueing
-// behavior is tested elsewhere, since After and AfterFunc share
-// the same code.
-func TestAfterFunc(t *testing.T) {
-	i := 10
-	c := make(chan bool)
-	var f func()
-	f = func() {
-		i--
-		if i >= 0 {
-			AfterFunc(0, f)
-			Sleep(1 * Second)
-		} else {
-			c <- true
-		}
-	}
-
-	AfterFunc(0, f)
-	<-c
-}
-
-func TestAfterStress(t *testing.T) {
-	stop := uint32(0)
-	go func() {
-		for atomic.LoadUint32(&stop) == 0 {
-			runtime.GC()
-			// Yield so that the OS can wake up the timer thread,
-			// so that it can generate channel sends for the main goroutine,
-			// which will eventually set stop = 1 for us.
-			Sleep(Nanosecond)
-		}
-	}()
-	ticker := NewTicker(1)
-	for i := 0; i < 100; i++ {
-		<-ticker.C
-	}
-	ticker.Stop()
-	atomic.StoreUint32(&stop, 1)
-}
-
-func benchmark(b *testing.B, bench func(n int)) {
-	garbage := make([]*Timer, 1<<17)
-	for i := 0; i < len(garbage); i++ {
-		garbage[i] = AfterFunc(Hour, nil)
-	}
-	b.ResetTimer()
-
-	b.RunParallel(func(pb *testing.PB) {
-		for pb.Next() {
-			bench(1000)
-		}
-	})
-
-	b.StopTimer()
-	for i := 0; i < len(garbage); i++ {
-		garbage[i].Stop()
-	}
-}
-
-func BenchmarkAfterFunc(b *testing.B) {
-	benchmark(b, func(n int) {
-		c := make(chan bool)
-		var f func()
-		f = func() {
-			n--
-			if n >= 0 {
-				AfterFunc(0, f)
-			} else {
-				c <- true
-			}
-		}
-
-		AfterFunc(0, f)
-		<-c
-	})
-}
-
-func BenchmarkAfter(b *testing.B) {
-	benchmark(b, func(n int) {
-		for i := 0; i < n; i++ {
-			<-After(1)
-		}
-	})
-}
-
-func BenchmarkStop(b *testing.B) {
-	benchmark(b, func(n int) {
-		for i := 0; i < n; i++ {
-			NewTimer(1 * Second).Stop()
-		}
-	})
-}
-
-func BenchmarkSimultaneousAfterFunc(b *testing.B) {
-	benchmark(b, func(n int) {
-		var wg sync.WaitGroup
-		wg.Add(n)
-		for i := 0; i < n; i++ {
-			AfterFunc(0, wg.Done)
-		}
-		wg.Wait()
-	})
-}
-
-func BenchmarkStartStop(b *testing.B) {
-	benchmark(b, func(n int) {
-		timers := make([]*Timer, n)
-		for i := 0; i < n; i++ {
-			timers[i] = AfterFunc(Hour, nil)
-		}
-
-		for i := 0; i < n; i++ {
-			timers[i].Stop()
-		}
-	})
-}
-
-func TestAfter(t *testing.T) {
-	const delay = 100 * Millisecond
-	start := Now()
-	end := <-After(delay)
-	delayadj := delay
-	if runtime.GOOS == "windows" {
-		delayadj -= windowsInaccuracy
-	}
-	if duration := Now().Sub(start); duration < delayadj {
-		t.Fatalf("After(%s) slept for only %d ns", delay, duration)
-	}
-	if min := start.Add(delayadj); end.Before(min) {
-		t.Fatalf("After(%s) expect >= %s, got %s", delay, min, end)
-	}
-}
-
-func TestAfterTick(t *testing.T) {
-	const Count = 10
-	Delta := 100 * Millisecond
-	if testing.Short() {
-		Delta = 10 * Millisecond
-	}
-	t0 := Now()
-	for i := 0; i < Count; i++ {
-		<-After(Delta)
-	}
-	t1 := Now()
-	d := t1.Sub(t0)
-	target := Delta * Count
-	if d < target*9/10 {
-		t.Fatalf("%d ticks of %s too fast: took %s, expected %s", Count, Delta, d, target)
-	}
-	if !testing.Short() && d > target*30/10 {
-		t.Fatalf("%d ticks of %s too slow: took %s, expected %s", Count, Delta, d, target)
-	}
-}
-
-func TestAfterStop(t *testing.T) {
-	AfterFunc(100*Millisecond, func() {})
-	t0 := NewTimer(50 * Millisecond)
-	c1 := make(chan bool, 1)
-	t1 := AfterFunc(150*Millisecond, func() { c1 <- true })
-	c2 := After(200 * Millisecond)
-	if !t0.Stop() {
-		t.Fatalf("failed to stop event 0")
-	}
-	if !t1.Stop() {
-		t.Fatalf("failed to stop event 1")
-	}
-	<-c2
-	select {
-	case <-t0.C:
-		t.Fatalf("event 0 was not stopped")
-	case <-c1:
-		t.Fatalf("event 1 was not stopped")
-	default:
-	}
-	if t1.Stop() {
-		t.Fatalf("Stop returned true twice")
-	}
-}
-
-func TestAfterQueuing(t *testing.T) {
-	// This test flakes out on some systems,
-	// so we'll try it a few times before declaring it a failure.
-	const attempts = 5
-	err := errors.New("!=nil")
-	for i := 0; i < attempts && err != nil; i++ {
-		delta := Duration(20+i*50) * Millisecond
-		if err = testAfterQueuing(t, delta); err != nil {
-			t.Logf("attempt %v failed: %v", i, err)
-		}
-	}
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-// For gccgo omit 0 for now because it can take too long to start the
-var slots = []int{5, 3, 6, 6, 6, 1, 1, 2, 7, 9, 4, 8 /*0*/}
-
-type afterResult struct {
-	slot int
-	t    Time
-}
-
-func await(slot int, result chan<- afterResult, ac <-chan Time) {
-	result <- afterResult{slot, <-ac}
-}
-
-func testAfterQueuing(t *testing.T, delta Duration) error {
-	// make the result channel buffered because we don't want
-	// to depend on channel queueing semantics that might
-	// possibly change in the future.
-	result := make(chan afterResult, len(slots))
-
-	t0 := Now()
-	for _, slot := range slots {
-		go await(slot, result, After(Duration(slot)*delta))
-	}
-	var order []int
-	var times []Time
-	for range slots {
-		r := <-result
-		order = append(order, r.slot)
-		times = append(times, r.t)
-	}
-	for i := range order {
-		if i > 0 && order[i] < order[i-1] {
-			return fmt.Errorf("After calls returned out of order: %v", order)
-		}
-	}
-	for i, t := range times {
-		dt := t.Sub(t0)
-		target := Duration(order[i]) * delta
-		if dt < target-delta/2 || dt > target+delta*10 {
-			return fmt.Errorf("After(%s) arrived at %s, expected [%s,%s]", target, dt, target-delta/2, target+delta*10)
-		}
-	}
-	return nil
-}
-
-func TestTimerStopStress(t *testing.T) {
-	if testing.Short() {
-		return
-	}
-	for i := 0; i < 100; i++ {
-		go func(i int) {
-			timer := AfterFunc(2*Second, func() {
-				t.Fatalf("timer %d was not stopped", i)
-			})
-			Sleep(1 * Second)
-			timer.Stop()
-		}(i)
-	}
-	Sleep(3 * Second)
-}
-
-func TestSleepZeroDeadlock(t *testing.T) {
-	// Sleep(0) used to hang, the sequence of events was as follows.
-	// Sleep(0) sets G's status to Gwaiting, but then immediately returns leaving the status.
-	// Then the goroutine calls e.g. new and falls down into the scheduler due to pending GC.
-	// After the GC nobody wakes up the goroutine from Gwaiting status.
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
-	c := make(chan bool)
-	go func() {
-		for i := 0; i < 100; i++ {
-			runtime.GC()
-		}
-		c <- true
-	}()
-	for i := 0; i < 100; i++ {
-		Sleep(0)
-		tmp := make(chan bool, 1)
-		tmp <- true
-		<-tmp
-	}
-	<-c
-}
-
-func testReset(d Duration) error {
-	t0 := NewTimer(2 * d)
-	Sleep(d)
-	if t0.Reset(3*d) != true {
-		return errors.New("resetting unfired timer returned false")
-	}
-	Sleep(2 * d)
-	select {
-	case <-t0.C:
-		return errors.New("timer fired early")
-	default:
-	}
-	Sleep(2 * d)
-	select {
-	case <-t0.C:
-	default:
-		return errors.New("reset timer did not fire")
-	}
-
-	if t0.Reset(50*Millisecond) != false {
-		return errors.New("resetting expired timer returned true")
-	}
-	return nil
-}
-
-func TestReset(t *testing.T) {
-	// We try to run this test with increasingly larger multiples
-	// until one works so slow, loaded hardware isn't as flaky,
-	// but without slowing down fast machines unnecessarily.
-	const unit = 25 * Millisecond
-	tries := []Duration{
-		1 * unit,
-		3 * unit,
-		7 * unit,
-		15 * unit,
-	}
-	var err error
-	for _, d := range tries {
-		err = testReset(d)
-		if err == nil {
-			t.Logf("passed using duration %v", d)
-			return
-		}
-	}
-	t.Error(err)
-}
-
-// Test that sleeping for an interval so large it overflows does not
-// result in a short sleep duration.
-func TestOverflowSleep(t *testing.T) {
-	const big = Duration(int64(1<<63 - 1))
-	select {
-	case <-After(big):
-		t.Fatalf("big timeout fired")
-	case <-After(25 * Millisecond):
-		// OK
-	}
-	const neg = Duration(-1 << 63)
-	select {
-	case <-After(neg):
-		// OK
-	case <-After(1 * Second):
-		t.Fatalf("negative timeout didn't fire")
-	}
-}
-
-// Test that a panic while deleting a timer does not leave
-// the timers mutex held, deadlocking a ticker.Stop in a defer.
-func TestIssue5745(t *testing.T) {
-	if runtime.GOOS == "darwin" && runtime.GOARCH == "arm" {
-		t.Skipf("skipping on %s/%s, see issue 10043", runtime.GOOS, runtime.GOARCH)
-	}
-
-	ticker := NewTicker(Hour)
-	defer func() {
-		// would deadlock here before the fix due to
-		// lock taken before the segfault.
-		ticker.Stop()
-
-		if r := recover(); r == nil {
-			t.Error("Expected panic, but none happened.")
-		}
-	}()
-
-	// cause a panic due to a segfault
-	var timer *Timer
-	timer.Stop()
-	t.Error("Should be unreachable.")
-}
-
-func TestOverflowRuntimeTimer(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in short mode, see issue 6874")
-	}
-	// This may hang forever if timers are broken. See comment near
-	// the end of CheckRuntimeTimerOverflow in internal_test.go.
-	CheckRuntimeTimerOverflow()
-}
-
-func checkZeroPanicString(t *testing.T) {
-	e := recover()
-	s, _ := e.(string)
-	if want := "called on uninitialized Timer"; !strings.Contains(s, want) {
-		t.Errorf("panic = %v; want substring %q", e, want)
-	}
-}
-
-func TestZeroTimerResetPanics(t *testing.T) {
-	defer checkZeroPanicString(t)
-	var tr Timer
-	tr.Reset(1)
-}
-
-func TestZeroTimerStopPanics(t *testing.T) {
-	defer checkZeroPanicString(t)
-	var tr Timer
-	tr.Stop()
-}
diff --git a/third_party/gofrontend/libgo/go/time/sys_plan9.go b/third_party/gofrontend/libgo/go/time/sys_plan9.go
deleted file mode 100644
index 8484729..0000000
--- a/third_party/gofrontend/libgo/go/time/sys_plan9.go
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build plan9
-
-package time
-
-import (
-	"errors"
-	"syscall"
-)
-
-// for testing: whatever interrupts a sleep
-func interrupt() {
-	// cannot predict pid, don't want to kill group
-}
-
-// readFile reads and returns the content of the named file.
-// It is a trivial implementation of ioutil.ReadFile, reimplemented
-// here to avoid depending on io/ioutil or os.
-func readFile(name string) ([]byte, error) {
-	f, err := syscall.Open(name, syscall.O_RDONLY)
-	if err != nil {
-		return nil, err
-	}
-	defer syscall.Close(f)
-	var (
-		buf [4096]byte
-		ret []byte
-		n   int
-	)
-	for {
-		n, err = syscall.Read(f, buf[:])
-		if n > 0 {
-			ret = append(ret, buf[:n]...)
-		}
-		if n == 0 || err != nil {
-			break
-		}
-	}
-	return ret, err
-}
-
-func open(name string) (uintptr, error) {
-	fd, err := syscall.Open(name, syscall.O_RDONLY)
-	if err != nil {
-		return 0, err
-	}
-	return uintptr(fd), nil
-}
-
-func closefd(fd uintptr) {
-	syscall.Close(int(fd))
-}
-
-func preadn(fd uintptr, buf []byte, off int) error {
-	whence := 0
-	if off < 0 {
-		whence = 2
-	}
-	if _, err := syscall.Seek(int(fd), int64(off), whence); err != nil {
-		return err
-	}
-	for len(buf) > 0 {
-		m, err := syscall.Read(int(fd), buf)
-		if m <= 0 {
-			if err == nil {
-				return errors.New("short read")
-			}
-			return err
-		}
-		buf = buf[m:]
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/time/sys_unix.go b/third_party/gofrontend/libgo/go/time/sys_unix.go
deleted file mode 100644
index e592415..0000000
--- a/third_party/gofrontend/libgo/go/time/sys_unix.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
-
-package time
-
-import (
-	"errors"
-	"syscall"
-)
-
-// for testing: whatever interrupts a sleep
-func interrupt() {
-	syscall.Kill(syscall.Getpid(), syscall.SIGCHLD)
-}
-
-// readFile reads and returns the content of the named file.
-// It is a trivial implementation of ioutil.ReadFile, reimplemented
-// here to avoid depending on io/ioutil or os.
-func readFile(name string) ([]byte, error) {
-	f, err := syscall.Open(name, syscall.O_RDONLY, 0)
-	if err != nil {
-		return nil, err
-	}
-	defer syscall.Close(f)
-	var (
-		buf [4096]byte
-		ret []byte
-		n   int
-	)
-	for {
-		n, err = syscall.Read(f, buf[:])
-		if n > 0 {
-			ret = append(ret, buf[:n]...)
-		}
-		if n == 0 || err != nil {
-			break
-		}
-	}
-	return ret, err
-}
-
-func open(name string) (uintptr, error) {
-	fd, err := syscall.Open(name, syscall.O_RDONLY, 0)
-	if err != nil {
-		return 0, err
-	}
-	return uintptr(fd), nil
-}
-
-func closefd(fd uintptr) {
-	syscall.Close(int(fd))
-}
-
-func preadn(fd uintptr, buf []byte, off int) error {
-	whence := 0
-	if off < 0 {
-		whence = 2
-	}
-	if _, err := syscall.Seek(int(fd), int64(off), whence); err != nil {
-		return err
-	}
-	for len(buf) > 0 {
-		m, err := syscall.Read(int(fd), buf)
-		if m <= 0 {
-			if err == nil {
-				return errors.New("short read")
-			}
-			return err
-		}
-		buf = buf[m:]
-	}
-	return nil
-}
-
-func isNotExist(err error) bool { return err == syscall.ENOENT }
diff --git a/third_party/gofrontend/libgo/go/time/sys_windows.go b/third_party/gofrontend/libgo/go/time/sys_windows.go
deleted file mode 100644
index de63b4b..0000000
--- a/third_party/gofrontend/libgo/go/time/sys_windows.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time
-
-import (
-	"errors"
-	"syscall"
-)
-
-// for testing: whatever interrupts a sleep
-func interrupt() {
-}
-
-// readFile reads and returns the content of the named file.
-// It is a trivial implementation of ioutil.ReadFile, reimplemented
-// here to avoid depending on io/ioutil or os.
-func readFile(name string) ([]byte, error) {
-	f, err := syscall.Open(name, syscall.O_RDONLY, 0)
-	if err != nil {
-		return nil, err
-	}
-	defer syscall.Close(f)
-	var (
-		buf [4096]byte
-		ret []byte
-		n   int
-	)
-	for {
-		n, err = syscall.Read(f, buf[:])
-		if n > 0 {
-			ret = append(ret, buf[:n]...)
-		}
-		if n == 0 || err != nil {
-			break
-		}
-	}
-	return ret, err
-}
-
-func open(name string) (uintptr, error) {
-	fd, err := syscall.Open(name, syscall.O_RDONLY, 0)
-	if err != nil {
-		return 0, err
-	}
-	return uintptr(fd), nil
-}
-
-func closefd(fd uintptr) {
-	syscall.Close(syscall.Handle(fd))
-}
-
-func preadn(fd uintptr, buf []byte, off int) error {
-	whence := 0
-	if off < 0 {
-		whence = 2
-	}
-	if _, err := syscall.Seek(syscall.Handle(fd), int64(off), whence); err != nil {
-		return err
-	}
-	for len(buf) > 0 {
-		m, err := syscall.Read(syscall.Handle(fd), buf)
-		if m <= 0 {
-			if err == nil {
-				return errors.New("short read")
-			}
-			return err
-		}
-		buf = buf[m:]
-	}
-	return nil
-}
diff --git a/third_party/gofrontend/libgo/go/time/tick.go b/third_party/gofrontend/libgo/go/time/tick.go
deleted file mode 100644
index 196e8ac..0000000
--- a/third_party/gofrontend/libgo/go/time/tick.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time
-
-import "errors"
-
-// A Ticker holds a channel that delivers `ticks' of a clock
-// at intervals.
-type Ticker struct {
-	C <-chan Time // The channel on which the ticks are delivered.
-	r runtimeTimer
-}
-
-// NewTicker returns a new Ticker containing a channel that will send the
-// time with a period specified by the duration argument.
-// It adjusts the intervals or drops ticks to make up for slow receivers.
-// The duration d must be greater than zero; if not, NewTicker will panic.
-// Stop the ticker to release associated resources.
-func NewTicker(d Duration) *Ticker {
-	if d <= 0 {
-		panic(errors.New("non-positive interval for NewTicker"))
-	}
-	// Give the channel a 1-element time buffer.
-	// If the client falls behind while reading, we drop ticks
-	// on the floor until the client catches up.
-	c := make(chan Time, 1)
-	t := &Ticker{
-		C: c,
-		r: runtimeTimer{
-			when:   when(d),
-			period: int64(d),
-			f:      sendTime,
-			arg:    c,
-		},
-	}
-	startTimer(&t.r)
-	return t
-}
-
-// Stop turns off a ticker.  After Stop, no more ticks will be sent.
-// Stop does not close the channel, to prevent a read from the channel succeeding
-// incorrectly.
-func (t *Ticker) Stop() {
-	stopTimer(&t.r)
-}
-
-// Tick is a convenience wrapper for NewTicker providing access to the ticking
-// channel only. While Tick is useful for clients that have no need to shut down
-// the Ticker, be aware that without a way to shut it down the underlying
-// Ticker cannot be recovered by the garbage collector; it "leaks".
-func Tick(d Duration) <-chan Time {
-	if d <= 0 {
-		return nil
-	}
-	return NewTicker(d).C
-}
diff --git a/third_party/gofrontend/libgo/go/time/tick_test.go b/third_party/gofrontend/libgo/go/time/tick_test.go
deleted file mode 100644
index 32f4740..0000000
--- a/third_party/gofrontend/libgo/go/time/tick_test.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time_test
-
-import (
-	"testing"
-	. "time"
-)
-
-func TestTicker(t *testing.T) {
-	const Count = 10
-	Delta := 100 * Millisecond
-	ticker := NewTicker(Delta)
-	t0 := Now()
-	for i := 0; i < Count; i++ {
-		<-ticker.C
-	}
-	ticker.Stop()
-	t1 := Now()
-	dt := t1.Sub(t0)
-	target := Delta * Count
-	slop := target * 2 / 10
-	if dt < target-slop || (!testing.Short() && dt > target+slop) {
-		t.Fatalf("%d %s ticks took %s, expected [%s,%s]", Count, Delta, dt, target-slop, target+slop)
-	}
-	// Now test that the ticker stopped
-	Sleep(2 * Delta)
-	select {
-	case <-ticker.C:
-		t.Fatal("Ticker did not shut down")
-	default:
-		// ok
-	}
-}
-
-// Test that a bug tearing down a ticker has been fixed.  This routine should not deadlock.
-func TestTeardown(t *testing.T) {
-	Delta := 100 * Millisecond
-	if testing.Short() {
-		Delta = 20 * Millisecond
-	}
-	for i := 0; i < 3; i++ {
-		ticker := NewTicker(Delta)
-		<-ticker.C
-		ticker.Stop()
-	}
-}
-
-// Test the Tick convenience wrapper.
-func TestTick(t *testing.T) {
-	// Test that giving a negative duration returns nil.
-	if got := Tick(-1); got != nil {
-		t.Errorf("Tick(-1) = %v; want nil", got)
-	}
-}
-
-// Test that NewTicker panics when given a duration less than zero.
-func TestNewTickerLtZeroDuration(t *testing.T) {
-	defer func() {
-		if err := recover(); err == nil {
-			t.Errorf("NewTicker(-1) should have panicked")
-		}
-	}()
-	NewTicker(-1)
-}
-
-func BenchmarkTicker(b *testing.B) {
-	ticker := NewTicker(1)
-	b.ResetTimer()
-	b.StartTimer()
-	for i := 0; i < b.N; i++ {
-		<-ticker.C
-	}
-	b.StopTimer()
-	ticker.Stop()
-}
diff --git a/third_party/gofrontend/libgo/go/time/time.go b/third_party/gofrontend/libgo/go/time/time.go
deleted file mode 100644
index 294cc77..0000000
--- a/third_party/gofrontend/libgo/go/time/time.go
+++ /dev/null
@@ -1,1205 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package time provides functionality for measuring and displaying time.
-//
-// The calendrical calculations always assume a Gregorian calendar.
-package time
-
-import "errors"
-
-// A Time represents an instant in time with nanosecond precision.
-//
-// Programs using times should typically store and pass them as values,
-// not pointers.  That is, time variables and struct fields should be of
-// type time.Time, not *time.Time.  A Time value can be used by
-// multiple goroutines simultaneously.
-//
-// Time instants can be compared using the Before, After, and Equal methods.
-// The Sub method subtracts two instants, producing a Duration.
-// The Add method adds a Time and a Duration, producing a Time.
-//
-// The zero value of type Time is January 1, year 1, 00:00:00.000000000 UTC.
-// As this time is unlikely to come up in practice, the IsZero method gives
-// a simple way of detecting a time that has not been initialized explicitly.
-//
-// Each Time has associated with it a Location, consulted when computing the
-// presentation form of the time, such as in the Format, Hour, and Year methods.
-// The methods Local, UTC, and In return a Time with a specific location.
-// Changing the location in this way changes only the presentation; it does not
-// change the instant in time being denoted and therefore does not affect the
-// computations described in earlier paragraphs.
-//
-// Note that the Go == operator compares not just the time instant but also the
-// Location. Therefore, Time values should not be used as map or database keys
-// without first guaranteeing that the identical Location has been set for all
-// values, which can be achieved through use of the UTC or Local method.
-//
-type Time struct {
-	// sec gives the number of seconds elapsed since
-	// January 1, year 1 00:00:00 UTC.
-	sec int64
-
-	// nsec specifies a non-negative nanosecond
-	// offset within the second named by Seconds.
-	// It must be in the range [0, 999999999].
-	nsec int32
-
-	// loc specifies the Location that should be used to
-	// determine the minute, hour, month, day, and year
-	// that correspond to this Time.
-	// Only the zero Time has a nil Location.
-	// In that case it is interpreted to mean UTC.
-	loc *Location
-}
-
-// After reports whether the time instant t is after u.
-func (t Time) After(u Time) bool {
-	return t.sec > u.sec || t.sec == u.sec && t.nsec > u.nsec
-}
-
-// Before reports whether the time instant t is before u.
-func (t Time) Before(u Time) bool {
-	return t.sec < u.sec || t.sec == u.sec && t.nsec < u.nsec
-}
-
-// Equal reports whether t and u represent the same time instant.
-// Two times can be equal even if they are in different locations.
-// For example, 6:00 +0200 CEST and 4:00 UTC are Equal.
-// This comparison is different from using t == u, which also compares
-// the locations.
-func (t Time) Equal(u Time) bool {
-	return t.sec == u.sec && t.nsec == u.nsec
-}
-
-// A Month specifies a month of the year (January = 1, ...).
-type Month int
-
-const (
-	January Month = 1 + iota
-	February
-	March
-	April
-	May
-	June
-	July
-	August
-	September
-	October
-	November
-	December
-)
-
-var months = [...]string{
-	"January",
-	"February",
-	"March",
-	"April",
-	"May",
-	"June",
-	"July",
-	"August",
-	"September",
-	"October",
-	"November",
-	"December",
-}
-
-// String returns the English name of the month ("January", "February", ...).
-func (m Month) String() string { return months[m-1] }
-
-// A Weekday specifies a day of the week (Sunday = 0, ...).
-type Weekday int
-
-const (
-	Sunday Weekday = iota
-	Monday
-	Tuesday
-	Wednesday
-	Thursday
-	Friday
-	Saturday
-)
-
-var days = [...]string{
-	"Sunday",
-	"Monday",
-	"Tuesday",
-	"Wednesday",
-	"Thursday",
-	"Friday",
-	"Saturday",
-}
-
-// String returns the English name of the day ("Sunday", "Monday", ...).
-func (d Weekday) String() string { return days[d] }
-
-// Computations on time.
-//
-// The zero value for a Time is defined to be
-//	January 1, year 1, 00:00:00.000000000 UTC
-// which (1) looks like a zero, or as close as you can get in a date
-// (1-1-1 00:00:00 UTC), (2) is unlikely enough to arise in practice to
-// be a suitable "not set" sentinel, unlike Jan 1 1970, and (3) has a
-// non-negative year even in time zones west of UTC, unlike 1-1-0
-// 00:00:00 UTC, which would be 12-31-(-1) 19:00:00 in New York.
-//
-// The zero Time value does not force a specific epoch for the time
-// representation.  For example, to use the Unix epoch internally, we
-// could define that to distinguish a zero value from Jan 1 1970, that
-// time would be represented by sec=-1, nsec=1e9.  However, it does
-// suggest a representation, namely using 1-1-1 00:00:00 UTC as the
-// epoch, and that's what we do.
-//
-// The Add and Sub computations are oblivious to the choice of epoch.
-//
-// The presentation computations - year, month, minute, and so on - all
-// rely heavily on division and modulus by positive constants.  For
-// calendrical calculations we want these divisions to round down, even
-// for negative values, so that the remainder is always positive, but
-// Go's division (like most hardware division instructions) rounds to
-// zero.  We can still do those computations and then adjust the result
-// for a negative numerator, but it's annoying to write the adjustment
-// over and over.  Instead, we can change to a different epoch so long
-// ago that all the times we care about will be positive, and then round
-// to zero and round down coincide.  These presentation routines already
-// have to add the zone offset, so adding the translation to the
-// alternate epoch is cheap.  For example, having a non-negative time t
-// means that we can write
-//
-//	sec = t % 60
-//
-// instead of
-//
-//	sec = t % 60
-//	if sec < 0 {
-//		sec += 60
-//	}
-//
-// everywhere.
-//
-// The calendar runs on an exact 400 year cycle: a 400-year calendar
-// printed for 1970-2469 will apply as well to 2470-2869.  Even the days
-// of the week match up.  It simplifies the computations to choose the
-// cycle boundaries so that the exceptional years are always delayed as
-// long as possible.  That means choosing a year equal to 1 mod 400, so
-// that the first leap year is the 4th year, the first missed leap year
-// is the 100th year, and the missed missed leap year is the 400th year.
-// So we'd prefer instead to print a calendar for 2001-2400 and reuse it
-// for 2401-2800.
-//
-// Finally, it's convenient if the delta between the Unix epoch and
-// long-ago epoch is representable by an int64 constant.
-//
-// These three considerations—choose an epoch as early as possible, that
-// uses a year equal to 1 mod 400, and that is no more than 2⁶³ seconds
-// earlier than 1970—bring us to the year -292277022399.  We refer to
-// this year as the absolute zero year, and to times measured as a uint64
-// seconds since this year as absolute times.
-//
-// Times measured as an int64 seconds since the year 1—the representation
-// used for Time's sec field—are called internal times.
-//
-// Times measured as an int64 seconds since the year 1970 are called Unix
-// times.
-//
-// It is tempting to just use the year 1 as the absolute epoch, defining
-// that the routines are only valid for years >= 1.  However, the
-// routines would then be invalid when displaying the epoch in time zones
-// west of UTC, since it is year 0.  It doesn't seem tenable to say that
-// printing the zero time correctly isn't supported in half the time
-// zones.  By comparison, it's reasonable to mishandle some times in
-// the year -292277022399.
-//
-// All this is opaque to clients of the API and can be changed if a
-// better implementation presents itself.
-
-const (
-	// The unsigned zero year for internal calculations.
-	// Must be 1 mod 400, and times before it will not compute correctly,
-	// but otherwise can be changed at will.
-	absoluteZeroYear = -292277022399
-
-	// The year of the zero Time.
-	// Assumed by the unixToInternal computation below.
-	internalYear = 1
-
-	// The year of the zero Unix time.
-	unixYear = 1970
-
-	// Offsets to convert between internal and absolute or Unix times.
-	absoluteToInternal int64 = (absoluteZeroYear - internalYear) * 365.2425 * secondsPerDay
-	internalToAbsolute       = -absoluteToInternal
-
-	unixToInternal int64 = (1969*365 + 1969/4 - 1969/100 + 1969/400) * secondsPerDay
-	internalToUnix int64 = -unixToInternal
-)
-
-// IsZero reports whether t represents the zero time instant,
-// January 1, year 1, 00:00:00 UTC.
-func (t Time) IsZero() bool {
-	return t.sec == 0 && t.nsec == 0
-}
-
-// abs returns the time t as an absolute time, adjusted by the zone offset.
-// It is called when computing a presentation property like Month or Hour.
-func (t Time) abs() uint64 {
-	l := t.loc
-	// Avoid function calls when possible.
-	if l == nil || l == &localLoc {
-		l = l.get()
-	}
-	sec := t.sec + internalToUnix
-	if l != &utcLoc {
-		if l.cacheZone != nil && l.cacheStart <= sec && sec < l.cacheEnd {
-			sec += int64(l.cacheZone.offset)
-		} else {
-			_, offset, _, _, _ := l.lookup(sec)
-			sec += int64(offset)
-		}
-	}
-	return uint64(sec + (unixToInternal + internalToAbsolute))
-}
-
-// locabs is a combination of the Zone and abs methods,
-// extracting both return values from a single zone lookup.
-func (t Time) locabs() (name string, offset int, abs uint64) {
-	l := t.loc
-	if l == nil || l == &localLoc {
-		l = l.get()
-	}
-	// Avoid function call if we hit the local time cache.
-	sec := t.sec + internalToUnix
-	if l != &utcLoc {
-		if l.cacheZone != nil && l.cacheStart <= sec && sec < l.cacheEnd {
-			name = l.cacheZone.name
-			offset = l.cacheZone.offset
-		} else {
-			name, offset, _, _, _ = l.lookup(sec)
-		}
-		sec += int64(offset)
-	} else {
-		name = "UTC"
-	}
-	abs = uint64(sec + (unixToInternal + internalToAbsolute))
-	return
-}
-
-// Date returns the year, month, and day in which t occurs.
-func (t Time) Date() (year int, month Month, day int) {
-	year, month, day, _ = t.date(true)
-	return
-}
-
-// Year returns the year in which t occurs.
-func (t Time) Year() int {
-	year, _, _, _ := t.date(false)
-	return year
-}
-
-// Month returns the month of the year specified by t.
-func (t Time) Month() Month {
-	_, month, _, _ := t.date(true)
-	return month
-}
-
-// Day returns the day of the month specified by t.
-func (t Time) Day() int {
-	_, _, day, _ := t.date(true)
-	return day
-}
-
-// Weekday returns the day of the week specified by t.
-func (t Time) Weekday() Weekday {
-	return absWeekday(t.abs())
-}
-
-// absWeekday is like Weekday but operates on an absolute time.
-func absWeekday(abs uint64) Weekday {
-	// January 1 of the absolute year, like January 1 of 2001, was a Monday.
-	sec := (abs + uint64(Monday)*secondsPerDay) % secondsPerWeek
-	return Weekday(int(sec) / secondsPerDay)
-}
-
-// ISOWeek returns the ISO 8601 year and week number in which t occurs.
-// Week ranges from 1 to 53. Jan 01 to Jan 03 of year n might belong to
-// week 52 or 53 of year n-1, and Dec 29 to Dec 31 might belong to week 1
-// of year n+1.
-func (t Time) ISOWeek() (year, week int) {
-	year, month, day, yday := t.date(true)
-	wday := int(t.Weekday()+6) % 7 // weekday but Monday = 0.
-	const (
-		Mon int = iota
-		Tue
-		Wed
-		Thu
-		Fri
-		Sat
-		Sun
-	)
-
-	// Calculate week as number of Mondays in year up to
-	// and including today, plus 1 because the first week is week 0.
-	// Putting the + 1 inside the numerator as a + 7 keeps the
-	// numerator from being negative, which would cause it to
-	// round incorrectly.
-	week = (yday - wday + 7) / 7
-
-	// The week number is now correct under the assumption
-	// that the first Monday of the year is in week 1.
-	// If Jan 1 is a Tuesday, Wednesday, or Thursday, the first Monday
-	// is actually in week 2.
-	jan1wday := (wday - yday + 7*53) % 7
-	if Tue <= jan1wday && jan1wday <= Thu {
-		week++
-	}
-
-	// If the week number is still 0, we're in early January but in
-	// the last week of last year.
-	if week == 0 {
-		year--
-		week = 52
-		// A year has 53 weeks when Jan 1 or Dec 31 is a Thursday,
-		// meaning Jan 1 of the next year is a Friday
-		// or it was a leap year and Jan 1 of the next year is a Saturday.
-		if jan1wday == Fri || (jan1wday == Sat && isLeap(year)) {
-			week++
-		}
-	}
-
-	// December 29 to 31 are in week 1 of next year if
-	// they are after the last Thursday of the year and
-	// December 31 is a Monday, Tuesday, or Wednesday.
-	if month == December && day >= 29 && wday < Thu {
-		if dec31wday := (wday + 31 - day) % 7; Mon <= dec31wday && dec31wday <= Wed {
-			year++
-			week = 1
-		}
-	}
-
-	return
-}
-
-// Clock returns the hour, minute, and second within the day specified by t.
-func (t Time) Clock() (hour, min, sec int) {
-	return absClock(t.abs())
-}
-
-// absClock is like clock but operates on an absolute time.
-func absClock(abs uint64) (hour, min, sec int) {
-	sec = int(abs % secondsPerDay)
-	hour = sec / secondsPerHour
-	sec -= hour * secondsPerHour
-	min = sec / secondsPerMinute
-	sec -= min * secondsPerMinute
-	return
-}
-
-// Hour returns the hour within the day specified by t, in the range [0, 23].
-func (t Time) Hour() int {
-	return int(t.abs()%secondsPerDay) / secondsPerHour
-}
-
-// Minute returns the minute offset within the hour specified by t, in the range [0, 59].
-func (t Time) Minute() int {
-	return int(t.abs()%secondsPerHour) / secondsPerMinute
-}
-
-// Second returns the second offset within the minute specified by t, in the range [0, 59].
-func (t Time) Second() int {
-	return int(t.abs() % secondsPerMinute)
-}
-
-// Nanosecond returns the nanosecond offset within the second specified by t,
-// in the range [0, 999999999].
-func (t Time) Nanosecond() int {
-	return int(t.nsec)
-}
-
-// YearDay returns the day of the year specified by t, in the range [1,365] for non-leap years,
-// and [1,366] in leap years.
-func (t Time) YearDay() int {
-	_, _, _, yday := t.date(false)
-	return yday + 1
-}
-
-// A Duration represents the elapsed time between two instants
-// as an int64 nanosecond count.  The representation limits the
-// largest representable duration to approximately 290 years.
-type Duration int64
-
-const (
-	minDuration Duration = -1 << 63
-	maxDuration Duration = 1<<63 - 1
-)
-
-// Common durations.  There is no definition for units of Day or larger
-// to avoid confusion across daylight savings time zone transitions.
-//
-// To count the number of units in a Duration, divide:
-//	second := time.Second
-//	fmt.Print(int64(second/time.Millisecond)) // prints 1000
-//
-// To convert an integer number of units to a Duration, multiply:
-//	seconds := 10
-//	fmt.Print(time.Duration(seconds)*time.Second) // prints 10s
-//
-const (
-	Nanosecond  Duration = 1
-	Microsecond          = 1000 * Nanosecond
-	Millisecond          = 1000 * Microsecond
-	Second               = 1000 * Millisecond
-	Minute               = 60 * Second
-	Hour                 = 60 * Minute
-)
-
-// String returns a string representing the duration in the form "72h3m0.5s".
-// Leading zero units are omitted.  As a special case, durations less than one
-// second format use a smaller unit (milli-, micro-, or nanoseconds) to ensure
-// that the leading digit is non-zero.  The zero duration formats as 0,
-// with no unit.
-func (d Duration) String() string {
-	// Largest time is 2540400h10m10.000000000s
-	var buf [32]byte
-	w := len(buf)
-
-	u := uint64(d)
-	neg := d < 0
-	if neg {
-		u = -u
-	}
-
-	if u < uint64(Second) {
-		// Special case: if duration is smaller than a second,
-		// use smaller units, like 1.2ms
-		var prec int
-		w--
-		buf[w] = 's'
-		w--
-		switch {
-		case u == 0:
-			return "0"
-		case u < uint64(Microsecond):
-			// print nanoseconds
-			prec = 0
-			buf[w] = 'n'
-		case u < uint64(Millisecond):
-			// print microseconds
-			prec = 3
-			// U+00B5 'µ' micro sign == 0xC2 0xB5
-			w-- // Need room for two bytes.
-			copy(buf[w:], "µ")
-		default:
-			// print milliseconds
-			prec = 6
-			buf[w] = 'm'
-		}
-		w, u = fmtFrac(buf[:w], u, prec)
-		w = fmtInt(buf[:w], u)
-	} else {
-		w--
-		buf[w] = 's'
-
-		w, u = fmtFrac(buf[:w], u, 9)
-
-		// u is now integer seconds
-		w = fmtInt(buf[:w], u%60)
-		u /= 60
-
-		// u is now integer minutes
-		if u > 0 {
-			w--
-			buf[w] = 'm'
-			w = fmtInt(buf[:w], u%60)
-			u /= 60
-
-			// u is now integer hours
-			// Stop at hours because days can be different lengths.
-			if u > 0 {
-				w--
-				buf[w] = 'h'
-				w = fmtInt(buf[:w], u)
-			}
-		}
-	}
-
-	if neg {
-		w--
-		buf[w] = '-'
-	}
-
-	return string(buf[w:])
-}
-
-// fmtFrac formats the fraction of v/10**prec (e.g., ".12345") into the
-// tail of buf, omitting trailing zeros.  it omits the decimal
-// point too when the fraction is 0.  It returns the index where the
-// output bytes begin and the value v/10**prec.
-func fmtFrac(buf []byte, v uint64, prec int) (nw int, nv uint64) {
-	// Omit trailing zeros up to and including decimal point.
-	w := len(buf)
-	print := false
-	for i := 0; i < prec; i++ {
-		digit := v % 10
-		print = print || digit != 0
-		if print {
-			w--
-			buf[w] = byte(digit) + '0'
-		}
-		v /= 10
-	}
-	if print {
-		w--
-		buf[w] = '.'
-	}
-	return w, v
-}
-
-// fmtInt formats v into the tail of buf.
-// It returns the index where the output begins.
-func fmtInt(buf []byte, v uint64) int {
-	w := len(buf)
-	if v == 0 {
-		w--
-		buf[w] = '0'
-	} else {
-		for v > 0 {
-			w--
-			buf[w] = byte(v%10) + '0'
-			v /= 10
-		}
-	}
-	return w
-}
-
-// Nanoseconds returns the duration as an integer nanosecond count.
-func (d Duration) Nanoseconds() int64 { return int64(d) }
-
-// These methods return float64 because the dominant
-// use case is for printing a floating point number like 1.5s, and
-// a truncation to integer would make them not useful in those cases.
-// Splitting the integer and fraction ourselves guarantees that
-// converting the returned float64 to an integer rounds the same
-// way that a pure integer conversion would have, even in cases
-// where, say, float64(d.Nanoseconds())/1e9 would have rounded
-// differently.
-
-// Seconds returns the duration as a floating point number of seconds.
-func (d Duration) Seconds() float64 {
-	sec := d / Second
-	nsec := d % Second
-	return float64(sec) + float64(nsec)*1e-9
-}
-
-// Minutes returns the duration as a floating point number of minutes.
-func (d Duration) Minutes() float64 {
-	min := d / Minute
-	nsec := d % Minute
-	return float64(min) + float64(nsec)*(1e-9/60)
-}
-
-// Hours returns the duration as a floating point number of hours.
-func (d Duration) Hours() float64 {
-	hour := d / Hour
-	nsec := d % Hour
-	return float64(hour) + float64(nsec)*(1e-9/60/60)
-}
-
-// Add returns the time t+d.
-func (t Time) Add(d Duration) Time {
-	t.sec += int64(d / 1e9)
-	nsec := int32(t.nsec) + int32(d%1e9)
-	if nsec >= 1e9 {
-		t.sec++
-		nsec -= 1e9
-	} else if nsec < 0 {
-		t.sec--
-		nsec += 1e9
-	}
-	t.nsec = nsec
-	return t
-}
-
-// Sub returns the duration t-u. If the result exceeds the maximum (or minimum)
-// value that can be stored in a Duration, the maximum (or minimum) duration
-// will be returned.
-// To compute t-d for a duration d, use t.Add(-d).
-func (t Time) Sub(u Time) Duration {
-	d := Duration(t.sec-u.sec)*Second + Duration(int32(t.nsec)-int32(u.nsec))
-	// Check for overflow or underflow.
-	switch {
-	case u.Add(d).Equal(t):
-		return d // d is correct
-	case t.Before(u):
-		return minDuration // t - u is negative out of range
-	default:
-		return maxDuration // t - u is positive out of range
-	}
-}
-
-// Since returns the time elapsed since t.
-// It is shorthand for time.Now().Sub(t).
-func Since(t Time) Duration {
-	return Now().Sub(t)
-}
-
-// AddDate returns the time corresponding to adding the
-// given number of years, months, and days to t.
-// For example, AddDate(-1, 2, 3) applied to January 1, 2011
-// returns March 4, 2010.
-//
-// AddDate normalizes its result in the same way that Date does,
-// so, for example, adding one month to October 31 yields
-// December 1, the normalized form for November 31.
-func (t Time) AddDate(years int, months int, days int) Time {
-	year, month, day := t.Date()
-	hour, min, sec := t.Clock()
-	return Date(year+years, month+Month(months), day+days, hour, min, sec, int(t.nsec), t.loc)
-}
-
-const (
-	secondsPerMinute = 60
-	secondsPerHour   = 60 * 60
-	secondsPerDay    = 24 * secondsPerHour
-	secondsPerWeek   = 7 * secondsPerDay
-	daysPer400Years  = 365*400 + 97
-	daysPer100Years  = 365*100 + 24
-	daysPer4Years    = 365*4 + 1
-)
-
-// date computes the year, day of year, and when full=true,
-// the month and day in which t occurs.
-func (t Time) date(full bool) (year int, month Month, day int, yday int) {
-	return absDate(t.abs(), full)
-}
-
-// absDate is like date but operates on an absolute time.
-func absDate(abs uint64, full bool) (year int, month Month, day int, yday int) {
-	// Split into time and day.
-	d := abs / secondsPerDay
-
-	// Account for 400 year cycles.
-	n := d / daysPer400Years
-	y := 400 * n
-	d -= daysPer400Years * n
-
-	// Cut off 100-year cycles.
-	// The last cycle has one extra leap year, so on the last day
-	// of that year, day / daysPer100Years will be 4 instead of 3.
-	// Cut it back down to 3 by subtracting n>>2.
-	n = d / daysPer100Years
-	n -= n >> 2
-	y += 100 * n
-	d -= daysPer100Years * n
-
-	// Cut off 4-year cycles.
-	// The last cycle has a missing leap year, which does not
-	// affect the computation.
-	n = d / daysPer4Years
-	y += 4 * n
-	d -= daysPer4Years * n
-
-	// Cut off years within a 4-year cycle.
-	// The last year is a leap year, so on the last day of that year,
-	// day / 365 will be 4 instead of 3.  Cut it back down to 3
-	// by subtracting n>>2.
-	n = d / 365
-	n -= n >> 2
-	y += n
-	d -= 365 * n
-
-	year = int(int64(y) + absoluteZeroYear)
-	yday = int(d)
-
-	if !full {
-		return
-	}
-
-	day = yday
-	if isLeap(year) {
-		// Leap year
-		switch {
-		case day > 31+29-1:
-			// After leap day; pretend it wasn't there.
-			day--
-		case day == 31+29-1:
-			// Leap day.
-			month = February
-			day = 29
-			return
-		}
-	}
-
-	// Estimate month on assumption that every month has 31 days.
-	// The estimate may be too low by at most one month, so adjust.
-	month = Month(day / 31)
-	end := int(daysBefore[month+1])
-	var begin int
-	if day >= end {
-		month++
-		begin = end
-	} else {
-		begin = int(daysBefore[month])
-	}
-
-	month++ // because January is 1
-	day = day - begin + 1
-	return
-}
-
-// daysBefore[m] counts the number of days in a non-leap year
-// before month m begins.  There is an entry for m=12, counting
-// the number of days before January of next year (365).
-var daysBefore = [...]int32{
-	0,
-	31,
-	31 + 28,
-	31 + 28 + 31,
-	31 + 28 + 31 + 30,
-	31 + 28 + 31 + 30 + 31,
-	31 + 28 + 31 + 30 + 31 + 30,
-	31 + 28 + 31 + 30 + 31 + 30 + 31,
-	31 + 28 + 31 + 30 + 31 + 30 + 31 + 31,
-	31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30,
-	31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,
-	31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,
-	31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31,
-}
-
-func daysIn(m Month, year int) int {
-	if m == February && isLeap(year) {
-		return 29
-	}
-	return int(daysBefore[m] - daysBefore[m-1])
-}
-
-// Provided by package runtime.
-func now() (sec int64, nsec int32)
-
-// Now returns the current local time.
-func Now() Time {
-	sec, nsec := now()
-	return Time{sec + unixToInternal, nsec, Local}
-}
-
-// UTC returns t with the location set to UTC.
-func (t Time) UTC() Time {
-	t.loc = UTC
-	return t
-}
-
-// Local returns t with the location set to local time.
-func (t Time) Local() Time {
-	t.loc = Local
-	return t
-}
-
-// In returns t with the location information set to loc.
-//
-// In panics if loc is nil.
-func (t Time) In(loc *Location) Time {
-	if loc == nil {
-		panic("time: missing Location in call to Time.In")
-	}
-	t.loc = loc
-	return t
-}
-
-// Location returns the time zone information associated with t.
-func (t Time) Location() *Location {
-	l := t.loc
-	if l == nil {
-		l = UTC
-	}
-	return l
-}
-
-// Zone computes the time zone in effect at time t, returning the abbreviated
-// name of the zone (such as "CET") and its offset in seconds east of UTC.
-func (t Time) Zone() (name string, offset int) {
-	name, offset, _, _, _ = t.loc.lookup(t.sec + internalToUnix)
-	return
-}
-
-// Unix returns t as a Unix time, the number of seconds elapsed
-// since January 1, 1970 UTC.
-func (t Time) Unix() int64 {
-	return t.sec + internalToUnix
-}
-
-// UnixNano returns t as a Unix time, the number of nanoseconds elapsed
-// since January 1, 1970 UTC. The result is undefined if the Unix time
-// in nanoseconds cannot be represented by an int64. Note that this
-// means the result of calling UnixNano on the zero Time is undefined.
-func (t Time) UnixNano() int64 {
-	return (t.sec+internalToUnix)*1e9 + int64(t.nsec)
-}
-
-const timeBinaryVersion byte = 1
-
-// MarshalBinary implements the encoding.BinaryMarshaler interface.
-func (t Time) MarshalBinary() ([]byte, error) {
-	var offsetMin int16 // minutes east of UTC. -1 is UTC.
-
-	if t.Location() == &utcLoc {
-		offsetMin = -1
-	} else {
-		_, offset := t.Zone()
-		if offset%60 != 0 {
-			return nil, errors.New("Time.MarshalBinary: zone offset has fractional minute")
-		}
-		offset /= 60
-		if offset < -32768 || offset == -1 || offset > 32767 {
-			return nil, errors.New("Time.MarshalBinary: unexpected zone offset")
-		}
-		offsetMin = int16(offset)
-	}
-
-	enc := []byte{
-		timeBinaryVersion, // byte 0 : version
-		byte(t.sec >> 56), // bytes 1-8: seconds
-		byte(t.sec >> 48),
-		byte(t.sec >> 40),
-		byte(t.sec >> 32),
-		byte(t.sec >> 24),
-		byte(t.sec >> 16),
-		byte(t.sec >> 8),
-		byte(t.sec),
-		byte(t.nsec >> 24), // bytes 9-12: nanoseconds
-		byte(t.nsec >> 16),
-		byte(t.nsec >> 8),
-		byte(t.nsec),
-		byte(offsetMin >> 8), // bytes 13-14: zone offset in minutes
-		byte(offsetMin),
-	}
-
-	return enc, nil
-}
-
-// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface.
-func (t *Time) UnmarshalBinary(data []byte) error {
-	buf := data
-	if len(buf) == 0 {
-		return errors.New("Time.UnmarshalBinary: no data")
-	}
-
-	if buf[0] != timeBinaryVersion {
-		return errors.New("Time.UnmarshalBinary: unsupported version")
-	}
-
-	if len(buf) != /*version*/ 1+ /*sec*/ 8+ /*nsec*/ 4+ /*zone offset*/ 2 {
-		return errors.New("Time.UnmarshalBinary: invalid length")
-	}
-
-	buf = buf[1:]
-	t.sec = int64(buf[7]) | int64(buf[6])<<8 | int64(buf[5])<<16 | int64(buf[4])<<24 |
-		int64(buf[3])<<32 | int64(buf[2])<<40 | int64(buf[1])<<48 | int64(buf[0])<<56
-
-	buf = buf[8:]
-	t.nsec = int32(buf[3]) | int32(buf[2])<<8 | int32(buf[1])<<16 | int32(buf[0])<<24
-
-	buf = buf[4:]
-	offset := int(int16(buf[1])|int16(buf[0])<<8) * 60
-
-	if offset == -1*60 {
-		t.loc = &utcLoc
-	} else if _, localoff, _, _, _ := Local.lookup(t.sec + internalToUnix); offset == localoff {
-		t.loc = Local
-	} else {
-		t.loc = FixedZone("", offset)
-	}
-
-	return nil
-}
-
-// TODO(rsc): Remove GobEncoder, GobDecoder, MarshalJSON, UnmarshalJSON in Go 2.
-// The same semantics will be provided by the generic MarshalBinary, MarshalText,
-// UnmarshalBinary, UnmarshalText.
-
-// GobEncode implements the gob.GobEncoder interface.
-func (t Time) GobEncode() ([]byte, error) {
-	return t.MarshalBinary()
-}
-
-// GobDecode implements the gob.GobDecoder interface.
-func (t *Time) GobDecode(data []byte) error {
-	return t.UnmarshalBinary(data)
-}
-
-// MarshalJSON implements the json.Marshaler interface.
-// The time is a quoted string in RFC 3339 format, with sub-second precision added if present.
-func (t Time) MarshalJSON() ([]byte, error) {
-	if y := t.Year(); y < 0 || y >= 10000 {
-		// RFC 3339 is clear that years are 4 digits exactly.
-		// See golang.org/issue/4556#c15 for more discussion.
-		return nil, errors.New("Time.MarshalJSON: year outside of range [0,9999]")
-	}
-	return []byte(t.Format(`"` + RFC3339Nano + `"`)), nil
-}
-
-// UnmarshalJSON implements the json.Unmarshaler interface.
-// The time is expected to be a quoted string in RFC 3339 format.
-func (t *Time) UnmarshalJSON(data []byte) (err error) {
-	// Fractional seconds are handled implicitly by Parse.
-	*t, err = Parse(`"`+RFC3339+`"`, string(data))
-	return
-}
-
-// MarshalText implements the encoding.TextMarshaler interface.
-// The time is formatted in RFC 3339 format, with sub-second precision added if present.
-func (t Time) MarshalText() ([]byte, error) {
-	if y := t.Year(); y < 0 || y >= 10000 {
-		return nil, errors.New("Time.MarshalText: year outside of range [0,9999]")
-	}
-	return []byte(t.Format(RFC3339Nano)), nil
-}
-
-// UnmarshalText implements the encoding.TextUnmarshaler interface.
-// The time is expected to be in RFC 3339 format.
-func (t *Time) UnmarshalText(data []byte) (err error) {
-	// Fractional seconds are handled implicitly by Parse.
-	*t, err = Parse(RFC3339, string(data))
-	return
-}
-
-// Unix returns the local Time corresponding to the given Unix time,
-// sec seconds and nsec nanoseconds since January 1, 1970 UTC.
-// It is valid to pass nsec outside the range [0, 999999999].
-// Not all sec values have a corresponding time value. One such
-// value is 1<<63-1 (the largest int64 value).
-func Unix(sec int64, nsec int64) Time {
-	if nsec < 0 || nsec >= 1e9 {
-		n := nsec / 1e9
-		sec += n
-		nsec -= n * 1e9
-		if nsec < 0 {
-			nsec += 1e9
-			sec--
-		}
-	}
-	return Time{sec + unixToInternal, int32(nsec), Local}
-}
-
-func isLeap(year int) bool {
-	return year%4 == 0 && (year%100 != 0 || year%400 == 0)
-}
-
-// norm returns nhi, nlo such that
-//	hi * base + lo == nhi * base + nlo
-//	0 <= nlo < base
-func norm(hi, lo, base int) (nhi, nlo int) {
-	if lo < 0 {
-		n := (-lo-1)/base + 1
-		hi -= n
-		lo += n * base
-	}
-	if lo >= base {
-		n := lo / base
-		hi += n
-		lo -= n * base
-	}
-	return hi, lo
-}
-
-// Date returns the Time corresponding to
-//	yyyy-mm-dd hh:mm:ss + nsec nanoseconds
-// in the appropriate zone for that time in the given location.
-//
-// The month, day, hour, min, sec, and nsec values may be outside
-// their usual ranges and will be normalized during the conversion.
-// For example, October 32 converts to November 1.
-//
-// A daylight savings time transition skips or repeats times.
-// For example, in the United States, March 13, 2011 2:15am never occurred,
-// while November 6, 2011 1:15am occurred twice.  In such cases, the
-// choice of time zone, and therefore the time, is not well-defined.
-// Date returns a time that is correct in one of the two zones involved
-// in the transition, but it does not guarantee which.
-//
-// Date panics if loc is nil.
-func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time {
-	if loc == nil {
-		panic("time: missing Location in call to Date")
-	}
-
-	// Normalize month, overflowing into year.
-	m := int(month) - 1
-	year, m = norm(year, m, 12)
-	month = Month(m) + 1
-
-	// Normalize nsec, sec, min, hour, overflowing into day.
-	sec, nsec = norm(sec, nsec, 1e9)
-	min, sec = norm(min, sec, 60)
-	hour, min = norm(hour, min, 60)
-	day, hour = norm(day, hour, 24)
-
-	y := uint64(int64(year) - absoluteZeroYear)
-
-	// Compute days since the absolute epoch.
-
-	// Add in days from 400-year cycles.
-	n := y / 400
-	y -= 400 * n
-	d := daysPer400Years * n
-
-	// Add in 100-year cycles.
-	n = y / 100
-	y -= 100 * n
-	d += daysPer100Years * n
-
-	// Add in 4-year cycles.
-	n = y / 4
-	y -= 4 * n
-	d += daysPer4Years * n
-
-	// Add in non-leap years.
-	n = y
-	d += 365 * n
-
-	// Add in days before this month.
-	d += uint64(daysBefore[month-1])
-	if isLeap(year) && month >= March {
-		d++ // February 29
-	}
-
-	// Add in days before today.
-	d += uint64(day - 1)
-
-	// Add in time elapsed today.
-	abs := d * secondsPerDay
-	abs += uint64(hour*secondsPerHour + min*secondsPerMinute + sec)
-
-	unix := int64(abs) + (absoluteToInternal + internalToUnix)
-
-	// Look for zone offset for t, so we can adjust to UTC.
-	// The lookup function expects UTC, so we pass t in the
-	// hope that it will not be too close to a zone transition,
-	// and then adjust if it is.
-	_, offset, _, start, end := loc.lookup(unix)
-	if offset != 0 {
-		switch utc := unix - int64(offset); {
-		case utc < start:
-			_, offset, _, _, _ = loc.lookup(start - 1)
-		case utc >= end:
-			_, offset, _, _, _ = loc.lookup(end)
-		}
-		unix -= int64(offset)
-	}
-
-	return Time{unix + unixToInternal, int32(nsec), loc}
-}
-
-// Truncate returns the result of rounding t down to a multiple of d (since the zero time).
-// If d <= 0, Truncate returns t unchanged.
-func (t Time) Truncate(d Duration) Time {
-	if d <= 0 {
-		return t
-	}
-	_, r := div(t, d)
-	return t.Add(-r)
-}
-
-// Round returns the result of rounding t to the nearest multiple of d (since the zero time).
-// The rounding behavior for halfway values is to round up.
-// If d <= 0, Round returns t unchanged.
-func (t Time) Round(d Duration) Time {
-	if d <= 0 {
-		return t
-	}
-	_, r := div(t, d)
-	if r+r < d {
-		return t.Add(-r)
-	}
-	return t.Add(d - r)
-}
-
-// div divides t by d and returns the quotient parity and remainder.
-// We don't use the quotient parity anymore (round half up instead of round to even)
-// but it's still here in case we change our minds.
-func div(t Time, d Duration) (qmod2 int, r Duration) {
-	neg := false
-	nsec := int32(t.nsec)
-	if t.sec < 0 {
-		// Operate on absolute value.
-		neg = true
-		t.sec = -t.sec
-		nsec = -nsec
-		if nsec < 0 {
-			nsec += 1e9
-			t.sec-- // t.sec >= 1 before the -- so safe
-		}
-	}
-
-	switch {
-	// Special case: 2d divides 1 second.
-	case d < Second && Second%(d+d) == 0:
-		qmod2 = int(nsec/int32(d)) & 1
-		r = Duration(nsec % int32(d))
-
-	// Special case: d is a multiple of 1 second.
-	case d%Second == 0:
-		d1 := int64(d / Second)
-		qmod2 = int(t.sec/d1) & 1
-		r = Duration(t.sec%d1)*Second + Duration(nsec)
-
-	// General case.
-	// This could be faster if more cleverness were applied,
-	// but it's really only here to avoid special case restrictions in the API.
-	// No one will care about these cases.
-	default:
-		// Compute nanoseconds as 128-bit number.
-		sec := uint64(t.sec)
-		tmp := (sec >> 32) * 1e9
-		u1 := tmp >> 32
-		u0 := tmp << 32
-		tmp = uint64(sec&0xFFFFFFFF) * 1e9
-		u0x, u0 := u0, u0+tmp
-		if u0 < u0x {
-			u1++
-		}
-		u0x, u0 = u0, u0+uint64(nsec)
-		if u0 < u0x {
-			u1++
-		}
-
-		// Compute remainder by subtracting r<<k for decreasing k.
-		// Quotient parity is whether we subtract on last round.
-		d1 := uint64(d)
-		for d1>>63 != 1 {
-			d1 <<= 1
-		}
-		d0 := uint64(0)
-		for {
-			qmod2 = 0
-			if u1 > d1 || u1 == d1 && u0 >= d0 {
-				// subtract
-				qmod2 = 1
-				u0x, u0 = u0, u0-d0
-				if u0 > u0x {
-					u1--
-				}
-				u1 -= d1
-			}
-			if d1 == 0 && d0 == uint64(d) {
-				break
-			}
-			d0 >>= 1
-			d0 |= (d1 & 1) << 63
-			d1 >>= 1
-		}
-		r = Duration(u0)
-	}
-
-	if neg && r != 0 {
-		// If input was negative and not an exact multiple of d, we computed q, r such that
-		//	q*d + r = -t
-		// But the right answers are given by -(q-1), d-r:
-		//	q*d + r = -t
-		//	-q*d - r = t
-		//	-(q-1)*d + (d - r) = t
-		qmod2 ^= 1
-		r = d - r
-	}
-	return
-}
diff --git a/third_party/gofrontend/libgo/go/time/time_test.go b/third_party/gofrontend/libgo/go/time/time_test.go
deleted file mode 100644
index 2d16ea5..0000000
--- a/third_party/gofrontend/libgo/go/time/time_test.go
+++ /dev/null
@@ -1,1102 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time_test
-
-import (
-	"bytes"
-	"encoding/gob"
-	"encoding/json"
-	"fmt"
-	"math/big"
-	"math/rand"
-	"runtime"
-	"testing"
-	"testing/quick"
-	. "time"
-)
-
-// We should be in PST/PDT, but if the time zone files are missing we
-// won't be. The purpose of this test is to at least explain why some of
-// the subsequent tests fail.
-func TestZoneData(t *testing.T) {
-	lt := Now()
-	// PST is 8 hours west, PDT is 7 hours west.  We could use the name but it's not unique.
-	if name, off := lt.Zone(); off != -8*60*60 && off != -7*60*60 {
-		t.Errorf("Unable to find US Pacific time zone data for testing; time zone is %q offset %d", name, off)
-		t.Error("Likely problem: the time zone files have not been installed.")
-	}
-}
-
-// parsedTime is the struct representing a parsed time value.
-type parsedTime struct {
-	Year                 int
-	Month                Month
-	Day                  int
-	Hour, Minute, Second int // 15:04:05 is 15, 4, 5.
-	Nanosecond           int // Fractional second.
-	Weekday              Weekday
-	ZoneOffset           int    // seconds east of UTC, e.g. -7*60*60 for -0700
-	Zone                 string // e.g., "MST"
-}
-
-type TimeTest struct {
-	seconds int64
-	golden  parsedTime
-}
-
-var utctests = []TimeTest{
-	{0, parsedTime{1970, January, 1, 0, 0, 0, 0, Thursday, 0, "UTC"}},
-	{1221681866, parsedTime{2008, September, 17, 20, 4, 26, 0, Wednesday, 0, "UTC"}},
-	{-1221681866, parsedTime{1931, April, 16, 3, 55, 34, 0, Thursday, 0, "UTC"}},
-	{-11644473600, parsedTime{1601, January, 1, 0, 0, 0, 0, Monday, 0, "UTC"}},
-	{599529660, parsedTime{1988, December, 31, 0, 1, 0, 0, Saturday, 0, "UTC"}},
-	{978220860, parsedTime{2000, December, 31, 0, 1, 0, 0, Sunday, 0, "UTC"}},
-}
-
-var nanoutctests = []TimeTest{
-	{0, parsedTime{1970, January, 1, 0, 0, 0, 1e8, Thursday, 0, "UTC"}},
-	{1221681866, parsedTime{2008, September, 17, 20, 4, 26, 2e8, Wednesday, 0, "UTC"}},
-}
-
-var localtests = []TimeTest{
-	{0, parsedTime{1969, December, 31, 16, 0, 0, 0, Wednesday, -8 * 60 * 60, "PST"}},
-	{1221681866, parsedTime{2008, September, 17, 13, 4, 26, 0, Wednesday, -7 * 60 * 60, "PDT"}},
-}
-
-var nanolocaltests = []TimeTest{
-	{0, parsedTime{1969, December, 31, 16, 0, 0, 1e8, Wednesday, -8 * 60 * 60, "PST"}},
-	{1221681866, parsedTime{2008, September, 17, 13, 4, 26, 3e8, Wednesday, -7 * 60 * 60, "PDT"}},
-}
-
-func same(t Time, u *parsedTime) bool {
-	// Check aggregates.
-	year, month, day := t.Date()
-	hour, min, sec := t.Clock()
-	name, offset := t.Zone()
-	if year != u.Year || month != u.Month || day != u.Day ||
-		hour != u.Hour || min != u.Minute || sec != u.Second ||
-		name != u.Zone || offset != u.ZoneOffset {
-		return false
-	}
-	// Check individual entries.
-	return t.Year() == u.Year &&
-		t.Month() == u.Month &&
-		t.Day() == u.Day &&
-		t.Hour() == u.Hour &&
-		t.Minute() == u.Minute &&
-		t.Second() == u.Second &&
-		t.Nanosecond() == u.Nanosecond &&
-		t.Weekday() == u.Weekday
-}
-
-func TestSecondsToUTC(t *testing.T) {
-	for _, test := range utctests {
-		sec := test.seconds
-		golden := &test.golden
-		tm := Unix(sec, 0).UTC()
-		newsec := tm.Unix()
-		if newsec != sec {
-			t.Errorf("SecondsToUTC(%d).Seconds() = %d", sec, newsec)
-		}
-		if !same(tm, golden) {
-			t.Errorf("SecondsToUTC(%d):  // %#v", sec, tm)
-			t.Errorf("  want=%+v", *golden)
-			t.Errorf("  have=%v", tm.Format(RFC3339+" MST"))
-		}
-	}
-}
-
-func TestNanosecondsToUTC(t *testing.T) {
-	for _, test := range nanoutctests {
-		golden := &test.golden
-		nsec := test.seconds*1e9 + int64(golden.Nanosecond)
-		tm := Unix(0, nsec).UTC()
-		newnsec := tm.Unix()*1e9 + int64(tm.Nanosecond())
-		if newnsec != nsec {
-			t.Errorf("NanosecondsToUTC(%d).Nanoseconds() = %d", nsec, newnsec)
-		}
-		if !same(tm, golden) {
-			t.Errorf("NanosecondsToUTC(%d):", nsec)
-			t.Errorf("  want=%+v", *golden)
-			t.Errorf("  have=%+v", tm.Format(RFC3339+" MST"))
-		}
-	}
-}
-
-func TestSecondsToLocalTime(t *testing.T) {
-	for _, test := range localtests {
-		sec := test.seconds
-		golden := &test.golden
-		tm := Unix(sec, 0)
-		newsec := tm.Unix()
-		if newsec != sec {
-			t.Errorf("SecondsToLocalTime(%d).Seconds() = %d", sec, newsec)
-		}
-		if !same(tm, golden) {
-			t.Errorf("SecondsToLocalTime(%d):", sec)
-			t.Errorf("  want=%+v", *golden)
-			t.Errorf("  have=%+v", tm.Format(RFC3339+" MST"))
-		}
-	}
-}
-
-func TestNanosecondsToLocalTime(t *testing.T) {
-	for _, test := range nanolocaltests {
-		golden := &test.golden
-		nsec := test.seconds*1e9 + int64(golden.Nanosecond)
-		tm := Unix(0, nsec)
-		newnsec := tm.Unix()*1e9 + int64(tm.Nanosecond())
-		if newnsec != nsec {
-			t.Errorf("NanosecondsToLocalTime(%d).Seconds() = %d", nsec, newnsec)
-		}
-		if !same(tm, golden) {
-			t.Errorf("NanosecondsToLocalTime(%d):", nsec)
-			t.Errorf("  want=%+v", *golden)
-			t.Errorf("  have=%+v", tm.Format(RFC3339+" MST"))
-		}
-	}
-}
-
-func TestSecondsToUTCAndBack(t *testing.T) {
-	f := func(sec int64) bool { return Unix(sec, 0).UTC().Unix() == sec }
-	f32 := func(sec int32) bool { return f(int64(sec)) }
-	cfg := &quick.Config{MaxCount: 10000}
-
-	// Try a reasonable date first, then the huge ones.
-	if err := quick.Check(f32, cfg); err != nil {
-		t.Fatal(err)
-	}
-	if err := quick.Check(f, cfg); err != nil {
-		t.Fatal(err)
-	}
-}
-
-func TestNanosecondsToUTCAndBack(t *testing.T) {
-	f := func(nsec int64) bool {
-		t := Unix(0, nsec).UTC()
-		ns := t.Unix()*1e9 + int64(t.Nanosecond())
-		return ns == nsec
-	}
-	f32 := func(nsec int32) bool { return f(int64(nsec)) }
-	cfg := &quick.Config{MaxCount: 10000}
-
-	// Try a small date first, then the large ones. (The span is only a few hundred years
-	// for nanoseconds in an int64.)
-	if err := quick.Check(f32, cfg); err != nil {
-		t.Fatal(err)
-	}
-	if err := quick.Check(f, cfg); err != nil {
-		t.Fatal(err)
-	}
-}
-
-// The time routines provide no way to get absolute time
-// (seconds since zero), but we need it to compute the right
-// answer for bizarre roundings like "to the nearest 3 ns".
-// Compute as t - year1 = (t - 1970) + (1970 - 2001) + (2001 - 1).
-// t - 1970 is returned by Unix and Nanosecond.
-// 1970 - 2001 is -(31*365+8)*86400 = -978307200 seconds.
-// 2001 - 1 is 2000*365.2425*86400 = 63113904000 seconds.
-const unixToZero = -978307200 + 63113904000
-
-// abs returns the absolute time stored in t, as seconds and nanoseconds.
-func abs(t Time) (sec, nsec int64) {
-	unix := t.Unix()
-	nano := t.Nanosecond()
-	return unix + unixToZero, int64(nano)
-}
-
-// absString returns abs as a decimal string.
-func absString(t Time) string {
-	sec, nsec := abs(t)
-	if sec < 0 {
-		sec = -sec
-		nsec = -nsec
-		if nsec < 0 {
-			nsec += 1e9
-			sec--
-		}
-		return fmt.Sprintf("-%d%09d", sec, nsec)
-	}
-	return fmt.Sprintf("%d%09d", sec, nsec)
-}
-
-var truncateRoundTests = []struct {
-	t Time
-	d Duration
-}{
-	{Date(-1, January, 1, 12, 15, 30, 5e8, UTC), 3},
-	{Date(-1, January, 1, 12, 15, 31, 5e8, UTC), 3},
-	{Date(2012, January, 1, 12, 15, 30, 5e8, UTC), Second},
-	{Date(2012, January, 1, 12, 15, 31, 5e8, UTC), Second},
-}
-
-func TestTruncateRound(t *testing.T) {
-	var (
-		bsec  = new(big.Int)
-		bnsec = new(big.Int)
-		bd    = new(big.Int)
-		bt    = new(big.Int)
-		br    = new(big.Int)
-		bq    = new(big.Int)
-		b1e9  = new(big.Int)
-	)
-
-	b1e9.SetInt64(1e9)
-
-	testOne := func(ti, tns, di int64) bool {
-		t0 := Unix(ti, int64(tns)).UTC()
-		d := Duration(di)
-		if d < 0 {
-			d = -d
-		}
-		if d <= 0 {
-			d = 1
-		}
-
-		// Compute bt = absolute nanoseconds.
-		sec, nsec := abs(t0)
-		bsec.SetInt64(sec)
-		bnsec.SetInt64(nsec)
-		bt.Mul(bsec, b1e9)
-		bt.Add(bt, bnsec)
-
-		// Compute quotient and remainder mod d.
-		bd.SetInt64(int64(d))
-		bq.DivMod(bt, bd, br)
-
-		// To truncate, subtract remainder.
-		// br is < d, so it fits in an int64.
-		r := br.Int64()
-		t1 := t0.Add(-Duration(r))
-
-		// Check that time.Truncate works.
-		if trunc := t0.Truncate(d); trunc != t1 {
-			t.Errorf("Time.Truncate(%s, %s) = %s, want %s\n"+
-				"%v trunc %v =\n%v want\n%v",
-				t0.Format(RFC3339Nano), d, trunc, t1.Format(RFC3339Nano),
-				absString(t0), int64(d), absString(trunc), absString(t1))
-			return false
-		}
-
-		// To round, add d back if remainder r > d/2 or r == exactly d/2.
-		// The commented out code would round half to even instead of up,
-		// but that makes it time-zone dependent, which is a bit strange.
-		if r > int64(d)/2 || r+r == int64(d) /*&& bq.Bit(0) == 1*/ {
-			t1 = t1.Add(Duration(d))
-		}
-
-		// Check that time.Round works.
-		if rnd := t0.Round(d); rnd != t1 {
-			t.Errorf("Time.Round(%s, %s) = %s, want %s\n"+
-				"%v round %v =\n%v want\n%v",
-				t0.Format(RFC3339Nano), d, rnd, t1.Format(RFC3339Nano),
-				absString(t0), int64(d), absString(rnd), absString(t1))
-			return false
-		}
-		return true
-	}
-
-	// manual test cases
-	for _, tt := range truncateRoundTests {
-		testOne(tt.t.Unix(), int64(tt.t.Nanosecond()), int64(tt.d))
-	}
-
-	// exhaustive near 0
-	for i := 0; i < 100; i++ {
-		for j := 1; j < 100; j++ {
-			testOne(unixToZero, int64(i), int64(j))
-			testOne(unixToZero, -int64(i), int64(j))
-			if t.Failed() {
-				return
-			}
-		}
-	}
-
-	if t.Failed() {
-		return
-	}
-
-	// randomly generated test cases
-	cfg := &quick.Config{MaxCount: 100000}
-	if testing.Short() {
-		cfg.MaxCount = 1000
-	}
-
-	// divisors of Second
-	f1 := func(ti int64, tns int32, logdi int32) bool {
-		d := Duration(1)
-		a, b := uint(logdi%9), (logdi>>16)%9
-		d <<= a
-		for i := 0; i < int(b); i++ {
-			d *= 5
-		}
-		return testOne(ti, int64(tns), int64(d))
-	}
-	quick.Check(f1, cfg)
-
-	// multiples of Second
-	f2 := func(ti int64, tns int32, di int32) bool {
-		d := Duration(di) * Second
-		if d < 0 {
-			d = -d
-		}
-		return testOne(ti, int64(tns), int64(d))
-	}
-	quick.Check(f2, cfg)
-
-	// halfway cases
-	f3 := func(tns, di int64) bool {
-		di &= 0xfffffffe
-		if di == 0 {
-			di = 2
-		}
-		tns -= tns % di
-		if tns < 0 {
-			tns += di / 2
-		} else {
-			tns -= di / 2
-		}
-		return testOne(0, tns, di)
-	}
-	quick.Check(f3, cfg)
-
-	// full generality
-	f4 := func(ti int64, tns int32, di int64) bool {
-		return testOne(ti, int64(tns), di)
-	}
-	quick.Check(f4, cfg)
-}
-
-type ISOWeekTest struct {
-	year       int // year
-	month, day int // month and day
-	yex        int // expected year
-	wex        int // expected week
-}
-
-var isoWeekTests = []ISOWeekTest{
-	{1981, 1, 1, 1981, 1}, {1982, 1, 1, 1981, 53}, {1983, 1, 1, 1982, 52},
-	{1984, 1, 1, 1983, 52}, {1985, 1, 1, 1985, 1}, {1986, 1, 1, 1986, 1},
-	{1987, 1, 1, 1987, 1}, {1988, 1, 1, 1987, 53}, {1989, 1, 1, 1988, 52},
-	{1990, 1, 1, 1990, 1}, {1991, 1, 1, 1991, 1}, {1992, 1, 1, 1992, 1},
-	{1993, 1, 1, 1992, 53}, {1994, 1, 1, 1993, 52}, {1995, 1, 2, 1995, 1},
-	{1996, 1, 1, 1996, 1}, {1996, 1, 7, 1996, 1}, {1996, 1, 8, 1996, 2},
-	{1997, 1, 1, 1997, 1}, {1998, 1, 1, 1998, 1}, {1999, 1, 1, 1998, 53},
-	{2000, 1, 1, 1999, 52}, {2001, 1, 1, 2001, 1}, {2002, 1, 1, 2002, 1},
-	{2003, 1, 1, 2003, 1}, {2004, 1, 1, 2004, 1}, {2005, 1, 1, 2004, 53},
-	{2006, 1, 1, 2005, 52}, {2007, 1, 1, 2007, 1}, {2008, 1, 1, 2008, 1},
-	{2009, 1, 1, 2009, 1}, {2010, 1, 1, 2009, 53}, {2010, 1, 1, 2009, 53},
-	{2011, 1, 1, 2010, 52}, {2011, 1, 2, 2010, 52}, {2011, 1, 3, 2011, 1},
-	{2011, 1, 4, 2011, 1}, {2011, 1, 5, 2011, 1}, {2011, 1, 6, 2011, 1},
-	{2011, 1, 7, 2011, 1}, {2011, 1, 8, 2011, 1}, {2011, 1, 9, 2011, 1},
-	{2011, 1, 10, 2011, 2}, {2011, 1, 11, 2011, 2}, {2011, 6, 12, 2011, 23},
-	{2011, 6, 13, 2011, 24}, {2011, 12, 25, 2011, 51}, {2011, 12, 26, 2011, 52},
-	{2011, 12, 27, 2011, 52}, {2011, 12, 28, 2011, 52}, {2011, 12, 29, 2011, 52},
-	{2011, 12, 30, 2011, 52}, {2011, 12, 31, 2011, 52}, {1995, 1, 1, 1994, 52},
-	{2012, 1, 1, 2011, 52}, {2012, 1, 2, 2012, 1}, {2012, 1, 8, 2012, 1},
-	{2012, 1, 9, 2012, 2}, {2012, 12, 23, 2012, 51}, {2012, 12, 24, 2012, 52},
-	{2012, 12, 30, 2012, 52}, {2012, 12, 31, 2013, 1}, {2013, 1, 1, 2013, 1},
-	{2013, 1, 6, 2013, 1}, {2013, 1, 7, 2013, 2}, {2013, 12, 22, 2013, 51},
-	{2013, 12, 23, 2013, 52}, {2013, 12, 29, 2013, 52}, {2013, 12, 30, 2014, 1},
-	{2014, 1, 1, 2014, 1}, {2014, 1, 5, 2014, 1}, {2014, 1, 6, 2014, 2},
-	{2015, 1, 1, 2015, 1}, {2016, 1, 1, 2015, 53}, {2017, 1, 1, 2016, 52},
-	{2018, 1, 1, 2018, 1}, {2019, 1, 1, 2019, 1}, {2020, 1, 1, 2020, 1},
-	{2021, 1, 1, 2020, 53}, {2022, 1, 1, 2021, 52}, {2023, 1, 1, 2022, 52},
-	{2024, 1, 1, 2024, 1}, {2025, 1, 1, 2025, 1}, {2026, 1, 1, 2026, 1},
-	{2027, 1, 1, 2026, 53}, {2028, 1, 1, 2027, 52}, {2029, 1, 1, 2029, 1},
-	{2030, 1, 1, 2030, 1}, {2031, 1, 1, 2031, 1}, {2032, 1, 1, 2032, 1},
-	{2033, 1, 1, 2032, 53}, {2034, 1, 1, 2033, 52}, {2035, 1, 1, 2035, 1},
-	{2036, 1, 1, 2036, 1}, {2037, 1, 1, 2037, 1}, {2038, 1, 1, 2037, 53},
-	{2039, 1, 1, 2038, 52}, {2040, 1, 1, 2039, 52},
-}
-
-func TestISOWeek(t *testing.T) {
-	// Selected dates and corner cases
-	for _, wt := range isoWeekTests {
-		dt := Date(wt.year, Month(wt.month), wt.day, 0, 0, 0, 0, UTC)
-		y, w := dt.ISOWeek()
-		if w != wt.wex || y != wt.yex {
-			t.Errorf("got %d/%d; expected %d/%d for %d-%02d-%02d",
-				y, w, wt.yex, wt.wex, wt.year, wt.month, wt.day)
-		}
-	}
-
-	// The only real invariant: Jan 04 is in week 1
-	for year := 1950; year < 2100; year++ {
-		if y, w := Date(year, January, 4, 0, 0, 0, 0, UTC).ISOWeek(); y != year || w != 1 {
-			t.Errorf("got %d/%d; expected %d/1 for Jan 04", y, w, year)
-		}
-	}
-}
-
-type YearDayTest struct {
-	year, month, day int
-	yday             int
-}
-
-// Test YearDay in several different scenarios
-// and corner cases
-var yearDayTests = []YearDayTest{
-	// Non-leap-year tests
-	{2007, 1, 1, 1},
-	{2007, 1, 15, 15},
-	{2007, 2, 1, 32},
-	{2007, 2, 15, 46},
-	{2007, 3, 1, 60},
-	{2007, 3, 15, 74},
-	{2007, 4, 1, 91},
-	{2007, 12, 31, 365},
-
-	// Leap-year tests
-	{2008, 1, 1, 1},
-	{2008, 1, 15, 15},
-	{2008, 2, 1, 32},
-	{2008, 2, 15, 46},
-	{2008, 3, 1, 61},
-	{2008, 3, 15, 75},
-	{2008, 4, 1, 92},
-	{2008, 12, 31, 366},
-
-	// Looks like leap-year (but isn't) tests
-	{1900, 1, 1, 1},
-	{1900, 1, 15, 15},
-	{1900, 2, 1, 32},
-	{1900, 2, 15, 46},
-	{1900, 3, 1, 60},
-	{1900, 3, 15, 74},
-	{1900, 4, 1, 91},
-	{1900, 12, 31, 365},
-
-	// Year one tests (non-leap)
-	{1, 1, 1, 1},
-	{1, 1, 15, 15},
-	{1, 2, 1, 32},
-	{1, 2, 15, 46},
-	{1, 3, 1, 60},
-	{1, 3, 15, 74},
-	{1, 4, 1, 91},
-	{1, 12, 31, 365},
-
-	// Year minus one tests (non-leap)
-	{-1, 1, 1, 1},
-	{-1, 1, 15, 15},
-	{-1, 2, 1, 32},
-	{-1, 2, 15, 46},
-	{-1, 3, 1, 60},
-	{-1, 3, 15, 74},
-	{-1, 4, 1, 91},
-	{-1, 12, 31, 365},
-
-	// 400 BC tests (leap-year)
-	{-400, 1, 1, 1},
-	{-400, 1, 15, 15},
-	{-400, 2, 1, 32},
-	{-400, 2, 15, 46},
-	{-400, 3, 1, 61},
-	{-400, 3, 15, 75},
-	{-400, 4, 1, 92},
-	{-400, 12, 31, 366},
-
-	// Special Cases
-
-	// Gregorian calendar change (no effect)
-	{1582, 10, 4, 277},
-	{1582, 10, 15, 288},
-}
-
-// Check to see if YearDay is location sensitive
-var yearDayLocations = []*Location{
-	FixedZone("UTC-8", -8*60*60),
-	FixedZone("UTC-4", -4*60*60),
-	UTC,
-	FixedZone("UTC+4", 4*60*60),
-	FixedZone("UTC+8", 8*60*60),
-}
-
-func TestYearDay(t *testing.T) {
-	for _, loc := range yearDayLocations {
-		for _, ydt := range yearDayTests {
-			dt := Date(ydt.year, Month(ydt.month), ydt.day, 0, 0, 0, 0, loc)
-			yday := dt.YearDay()
-			if yday != ydt.yday {
-				t.Errorf("got %d, expected %d for %d-%02d-%02d in %v",
-					yday, ydt.yday, ydt.year, ydt.month, ydt.day, loc)
-			}
-		}
-	}
-}
-
-var durationTests = []struct {
-	str string
-	d   Duration
-}{
-	{"0", 0},
-	{"1ns", 1 * Nanosecond},
-	{"1.1µs", 1100 * Nanosecond},
-	{"2.2ms", 2200 * Microsecond},
-	{"3.3s", 3300 * Millisecond},
-	{"4m5s", 4*Minute + 5*Second},
-	{"4m5.001s", 4*Minute + 5001*Millisecond},
-	{"5h6m7.001s", 5*Hour + 6*Minute + 7001*Millisecond},
-	{"8m0.000000001s", 8*Minute + 1*Nanosecond},
-	{"2562047h47m16.854775807s", 1<<63 - 1},
-	{"-2562047h47m16.854775808s", -1 << 63},
-}
-
-func TestDurationString(t *testing.T) {
-	for _, tt := range durationTests {
-		if str := tt.d.String(); str != tt.str {
-			t.Errorf("Duration(%d).String() = %s, want %s", int64(tt.d), str, tt.str)
-		}
-		if tt.d > 0 {
-			if str := (-tt.d).String(); str != "-"+tt.str {
-				t.Errorf("Duration(%d).String() = %s, want %s", int64(-tt.d), str, "-"+tt.str)
-			}
-		}
-	}
-}
-
-var dateTests = []struct {
-	year, month, day, hour, min, sec, nsec int
-	z                                      *Location
-	unix                                   int64
-}{
-	{2011, 11, 6, 1, 0, 0, 0, Local, 1320566400},   // 1:00:00 PDT
-	{2011, 11, 6, 1, 59, 59, 0, Local, 1320569999}, // 1:59:59 PDT
-	{2011, 11, 6, 2, 0, 0, 0, Local, 1320573600},   // 2:00:00 PST
-
-	{2011, 3, 13, 1, 0, 0, 0, Local, 1300006800},   // 1:00:00 PST
-	{2011, 3, 13, 1, 59, 59, 0, Local, 1300010399}, // 1:59:59 PST
-	{2011, 3, 13, 3, 0, 0, 0, Local, 1300010400},   // 3:00:00 PDT
-	{2011, 3, 13, 2, 30, 0, 0, Local, 1300008600},  // 2:30:00 PDT ≡ 1:30 PST
-
-	// Many names for Fri Nov 18 7:56:35 PST 2011
-	{2011, 11, 18, 7, 56, 35, 0, Local, 1321631795},                 // Nov 18 7:56:35
-	{2011, 11, 19, -17, 56, 35, 0, Local, 1321631795},               // Nov 19 -17:56:35
-	{2011, 11, 17, 31, 56, 35, 0, Local, 1321631795},                // Nov 17 31:56:35
-	{2011, 11, 18, 6, 116, 35, 0, Local, 1321631795},                // Nov 18 6:116:35
-	{2011, 10, 49, 7, 56, 35, 0, Local, 1321631795},                 // Oct 49 7:56:35
-	{2011, 11, 18, 7, 55, 95, 0, Local, 1321631795},                 // Nov 18 7:55:95
-	{2011, 11, 18, 7, 56, 34, 1e9, Local, 1321631795},               // Nov 18 7:56:34 + 10⁹ns
-	{2011, 12, -12, 7, 56, 35, 0, Local, 1321631795},                // Dec -21 7:56:35
-	{2012, 1, -43, 7, 56, 35, 0, Local, 1321631795},                 // Jan -52 7:56:35 2012
-	{2012, int(January - 2), 18, 7, 56, 35, 0, Local, 1321631795},   // (Jan-2) 18 7:56:35 2012
-	{2010, int(December + 11), 18, 7, 56, 35, 0, Local, 1321631795}, // (Dec+11) 18 7:56:35 2010
-}
-
-func TestDate(t *testing.T) {
-	for _, tt := range dateTests {
-		time := Date(tt.year, Month(tt.month), tt.day, tt.hour, tt.min, tt.sec, tt.nsec, tt.z)
-		want := Unix(tt.unix, 0)
-		if !time.Equal(want) {
-			t.Errorf("Date(%d, %d, %d, %d, %d, %d, %d, %s) = %v, want %v",
-				tt.year, tt.month, tt.day, tt.hour, tt.min, tt.sec, tt.nsec, tt.z,
-				time, want)
-		}
-	}
-}
-
-// Several ways of getting from
-// Fri Nov 18 7:56:35 PST 2011
-// to
-// Thu Mar 19 7:56:35 PST 2016
-var addDateTests = []struct {
-	years, months, days int
-}{
-	{4, 4, 1},
-	{3, 16, 1},
-	{3, 15, 30},
-	{5, -6, -18 - 30 - 12},
-}
-
-func TestAddDate(t *testing.T) {
-	t0 := Date(2011, 11, 18, 7, 56, 35, 0, UTC)
-	t1 := Date(2016, 3, 19, 7, 56, 35, 0, UTC)
-	for _, at := range addDateTests {
-		time := t0.AddDate(at.years, at.months, at.days)
-		if !time.Equal(t1) {
-			t.Errorf("AddDate(%d, %d, %d) = %v, want %v",
-				at.years, at.months, at.days,
-				time, t1)
-		}
-	}
-}
-
-var daysInTests = []struct {
-	year, month, di int
-}{
-	{2011, 1, 31},  // January, first month, 31 days
-	{2011, 2, 28},  // February, non-leap year, 28 days
-	{2012, 2, 29},  // February, leap year, 29 days
-	{2011, 6, 30},  // June, 30 days
-	{2011, 12, 31}, // December, last month, 31 days
-}
-
-func TestDaysIn(t *testing.T) {
-	// The daysIn function is not exported.
-	// Test the daysIn function via the `var DaysIn = daysIn`
-	// statement in the internal_test.go file.
-	for _, tt := range daysInTests {
-		di := DaysIn(Month(tt.month), tt.year)
-		if di != tt.di {
-			t.Errorf("got %d; expected %d for %d-%02d",
-				di, tt.di, tt.year, tt.month)
-		}
-	}
-}
-
-func TestAddToExactSecond(t *testing.T) {
-	// Add an amount to the current time to round it up to the next exact second.
-	// This test checks that the nsec field still lies within the range [0, 999999999].
-	t1 := Now()
-	t2 := t1.Add(Second - Duration(t1.Nanosecond()))
-	sec := (t1.Second() + 1) % 60
-	if t2.Second() != sec || t2.Nanosecond() != 0 {
-		t.Errorf("sec = %d, nsec = %d, want sec = %d, nsec = 0", t2.Second(), t2.Nanosecond(), sec)
-	}
-}
-
-func equalTimeAndZone(a, b Time) bool {
-	aname, aoffset := a.Zone()
-	bname, boffset := b.Zone()
-	return a.Equal(b) && aoffset == boffset && aname == bname
-}
-
-var gobTests = []Time{
-	Date(0, 1, 2, 3, 4, 5, 6, UTC),
-	Date(7, 8, 9, 10, 11, 12, 13, FixedZone("", 0)),
-	Unix(81985467080890095, 0x76543210), // Time.sec: 0x0123456789ABCDEF
-	{}, // nil location
-	Date(1, 2, 3, 4, 5, 6, 7, FixedZone("", 32767*60)),
-	Date(1, 2, 3, 4, 5, 6, 7, FixedZone("", -32768*60)),
-}
-
-func TestTimeGob(t *testing.T) {
-	var b bytes.Buffer
-	enc := gob.NewEncoder(&b)
-	dec := gob.NewDecoder(&b)
-	for _, tt := range gobTests {
-		var gobtt Time
-		if err := enc.Encode(&tt); err != nil {
-			t.Errorf("%v gob Encode error = %q, want nil", tt, err)
-		} else if err := dec.Decode(&gobtt); err != nil {
-			t.Errorf("%v gob Decode error = %q, want nil", tt, err)
-		} else if !equalTimeAndZone(gobtt, tt) {
-			t.Errorf("Decoded time = %v, want %v", gobtt, tt)
-		}
-		b.Reset()
-	}
-}
-
-var invalidEncodingTests = []struct {
-	bytes []byte
-	want  string
-}{
-	{[]byte{}, "Time.UnmarshalBinary: no data"},
-	{[]byte{0, 2, 3}, "Time.UnmarshalBinary: unsupported version"},
-	{[]byte{1, 2, 3}, "Time.UnmarshalBinary: invalid length"},
-}
-
-func TestInvalidTimeGob(t *testing.T) {
-	for _, tt := range invalidEncodingTests {
-		var ignored Time
-		err := ignored.GobDecode(tt.bytes)
-		if err == nil || err.Error() != tt.want {
-			t.Errorf("time.GobDecode(%#v) error = %v, want %v", tt.bytes, err, tt.want)
-		}
-		err = ignored.UnmarshalBinary(tt.bytes)
-		if err == nil || err.Error() != tt.want {
-			t.Errorf("time.UnmarshalBinary(%#v) error = %v, want %v", tt.bytes, err, tt.want)
-		}
-	}
-}
-
-var notEncodableTimes = []struct {
-	time Time
-	want string
-}{
-	{Date(0, 1, 2, 3, 4, 5, 6, FixedZone("", 1)), "Time.MarshalBinary: zone offset has fractional minute"},
-	{Date(0, 1, 2, 3, 4, 5, 6, FixedZone("", -1*60)), "Time.MarshalBinary: unexpected zone offset"},
-	{Date(0, 1, 2, 3, 4, 5, 6, FixedZone("", -32769*60)), "Time.MarshalBinary: unexpected zone offset"},
-	{Date(0, 1, 2, 3, 4, 5, 6, FixedZone("", 32768*60)), "Time.MarshalBinary: unexpected zone offset"},
-}
-
-func TestNotGobEncodableTime(t *testing.T) {
-	for _, tt := range notEncodableTimes {
-		_, err := tt.time.GobEncode()
-		if err == nil || err.Error() != tt.want {
-			t.Errorf("%v GobEncode error = %v, want %v", tt.time, err, tt.want)
-		}
-		_, err = tt.time.MarshalBinary()
-		if err == nil || err.Error() != tt.want {
-			t.Errorf("%v MarshalBinary error = %v, want %v", tt.time, err, tt.want)
-		}
-	}
-}
-
-var jsonTests = []struct {
-	time Time
-	json string
-}{
-	{Date(9999, 4, 12, 23, 20, 50, 520*1e6, UTC), `"9999-04-12T23:20:50.52Z"`},
-	{Date(1996, 12, 19, 16, 39, 57, 0, Local), `"1996-12-19T16:39:57-08:00"`},
-	{Date(0, 1, 1, 0, 0, 0, 1, FixedZone("", 1*60)), `"0000-01-01T00:00:00.000000001+00:01"`},
-}
-
-func TestTimeJSON(t *testing.T) {
-	for _, tt := range jsonTests {
-		var jsonTime Time
-
-		if jsonBytes, err := json.Marshal(tt.time); err != nil {
-			t.Errorf("%v json.Marshal error = %v, want nil", tt.time, err)
-		} else if string(jsonBytes) != tt.json {
-			t.Errorf("%v JSON = %#q, want %#q", tt.time, string(jsonBytes), tt.json)
-		} else if err = json.Unmarshal(jsonBytes, &jsonTime); err != nil {
-			t.Errorf("%v json.Unmarshal error = %v, want nil", tt.time, err)
-		} else if !equalTimeAndZone(jsonTime, tt.time) {
-			t.Errorf("Unmarshaled time = %v, want %v", jsonTime, tt.time)
-		}
-	}
-}
-
-func TestInvalidTimeJSON(t *testing.T) {
-	var tt Time
-	err := json.Unmarshal([]byte(`{"now is the time":"buddy"}`), &tt)
-	_, isParseErr := err.(*ParseError)
-	if !isParseErr {
-		t.Errorf("expected *time.ParseError unmarshaling JSON, got %v", err)
-	}
-}
-
-var notJSONEncodableTimes = []struct {
-	time Time
-	want string
-}{
-	{Date(10000, 1, 1, 0, 0, 0, 0, UTC), "Time.MarshalJSON: year outside of range [0,9999]"},
-	{Date(-1, 1, 1, 0, 0, 0, 0, UTC), "Time.MarshalJSON: year outside of range [0,9999]"},
-}
-
-func TestNotJSONEncodableTime(t *testing.T) {
-	for _, tt := range notJSONEncodableTimes {
-		_, err := tt.time.MarshalJSON()
-		if err == nil || err.Error() != tt.want {
-			t.Errorf("%v MarshalJSON error = %v, want %v", tt.time, err, tt.want)
-		}
-	}
-}
-
-var parseDurationTests = []struct {
-	in   string
-	ok   bool
-	want Duration
-}{
-	// simple
-	{"0", true, 0},
-	{"5s", true, 5 * Second},
-	{"30s", true, 30 * Second},
-	{"1478s", true, 1478 * Second},
-	// sign
-	{"-5s", true, -5 * Second},
-	{"+5s", true, 5 * Second},
-	{"-0", true, 0},
-	{"+0", true, 0},
-	// decimal
-	{"5.0s", true, 5 * Second},
-	{"5.6s", true, 5*Second + 600*Millisecond},
-	{"5.s", true, 5 * Second},
-	{".5s", true, 500 * Millisecond},
-	{"1.0s", true, 1 * Second},
-	{"1.00s", true, 1 * Second},
-	{"1.004s", true, 1*Second + 4*Millisecond},
-	{"1.0040s", true, 1*Second + 4*Millisecond},
-	{"100.00100s", true, 100*Second + 1*Millisecond},
-	// different units
-	{"10ns", true, 10 * Nanosecond},
-	{"11us", true, 11 * Microsecond},
-	{"12µs", true, 12 * Microsecond}, // U+00B5
-	{"12μs", true, 12 * Microsecond}, // U+03BC
-	{"13ms", true, 13 * Millisecond},
-	{"14s", true, 14 * Second},
-	{"15m", true, 15 * Minute},
-	{"16h", true, 16 * Hour},
-	// composite durations
-	{"3h30m", true, 3*Hour + 30*Minute},
-	{"10.5s4m", true, 4*Minute + 10*Second + 500*Millisecond},
-	{"-2m3.4s", true, -(2*Minute + 3*Second + 400*Millisecond)},
-	{"1h2m3s4ms5us6ns", true, 1*Hour + 2*Minute + 3*Second + 4*Millisecond + 5*Microsecond + 6*Nanosecond},
-	{"39h9m14.425s", true, 39*Hour + 9*Minute + 14*Second + 425*Millisecond},
-	// large value
-	{"52763797000ns", true, 52763797000 * Nanosecond},
-	// more than 9 digits after decimal point, see https://golang.org/issue/6617
-	{"0.3333333333333333333h", true, 20 * Minute},
-	// 9007199254740993 = 1<<53+1 cannot be stored precisely in a float64
-	{"9007199254740993ns", true, (1<<53 + 1) * Nanosecond},
-	// largest duration that can be represented by int64 in nanoseconds
-	{"9223372036854775807ns", true, (1<<63 - 1) * Nanosecond},
-	{"9223372036854775.807us", true, (1<<63 - 1) * Nanosecond},
-	{"9223372036s854ms775us807ns", true, (1<<63 - 1) * Nanosecond},
-	// large negative value
-	{"-9223372036854775807ns", true, -1<<63 + 1*Nanosecond},
-
-	// errors
-	{"", false, 0},
-	{"3", false, 0},
-	{"-", false, 0},
-	{"s", false, 0},
-	{".", false, 0},
-	{"-.", false, 0},
-	{".s", false, 0},
-	{"+.s", false, 0},
-	{"3000000h", false, 0},                  // overflow
-	{"9223372036854775808ns", false, 0},     // overflow
-	{"9223372036854775.808us", false, 0},    // overflow
-	{"9223372036854ms775us808ns", false, 0}, // overflow
-	// largest negative value of type int64 in nanoseconds should fail
-	// see https://go-review.googlesource.com/#/c/2461/
-	{"-9223372036854775808ns", false, 0},
-}
-
-func TestParseDuration(t *testing.T) {
-	for _, tc := range parseDurationTests {
-		d, err := ParseDuration(tc.in)
-		if tc.ok && (err != nil || d != tc.want) {
-			t.Errorf("ParseDuration(%q) = %v, %v, want %v, nil", tc.in, d, err, tc.want)
-		} else if !tc.ok && err == nil {
-			t.Errorf("ParseDuration(%q) = _, nil, want _, non-nil", tc.in)
-		}
-	}
-}
-
-func TestParseDurationRoundTrip(t *testing.T) {
-	for i := 0; i < 100; i++ {
-		// Resolutions finer than milliseconds will result in
-		// imprecise round-trips.
-		d0 := Duration(rand.Int31()) * Millisecond
-		s := d0.String()
-		d1, err := ParseDuration(s)
-		if err != nil || d0 != d1 {
-			t.Errorf("round-trip failed: %d => %q => %d, %v", d0, s, d1, err)
-		}
-	}
-}
-
-// golang.org/issue/4622
-func TestLocationRace(t *testing.T) {
-	ResetLocalOnceForTest() // reset the Once to trigger the race
-
-	c := make(chan string, 1)
-	go func() {
-		c <- Now().String()
-	}()
-	Now().String()
-	<-c
-	Sleep(100 * Millisecond)
-
-	// Back to Los Angeles for subsequent tests:
-	ForceUSPacificForTesting()
-}
-
-var (
-	t Time
-	u int64
-)
-
-var mallocTest = []struct {
-	count int
-	desc  string
-	fn    func()
-}{
-	{0, `time.Now()`, func() { t = Now() }},
-	{0, `time.Now().UnixNano()`, func() { u = Now().UnixNano() }},
-}
-
-func TestCountMallocs(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping malloc count in short mode")
-	}
-	if runtime.GOMAXPROCS(0) > 1 {
-		t.Skip("skipping; GOMAXPROCS>1")
-	}
-	for _, mt := range mallocTest {
-		allocs := int(testing.AllocsPerRun(100, mt.fn))
-		if allocs > mt.count {
-			t.Errorf("%s: %d allocs, want %d", mt.desc, allocs, mt.count)
-		}
-	}
-}
-
-func TestLoadFixed(t *testing.T) {
-	// Issue 4064: handle locations without any zone transitions.
-	loc, err := LoadLocation("Etc/GMT+1")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// The tzdata name Etc/GMT+1 uses "east is negative",
-	// but Go and most other systems use "east is positive".
-	// So GMT+1 corresponds to -3600 in the Go zone, not +3600.
-	name, offset := Now().In(loc).Zone()
-	if name != "GMT+1" || offset != -1*60*60 {
-		t.Errorf("Now().In(loc).Zone() = %q, %d, want %q, %d", name, offset, "GMT+1", -1*60*60)
-	}
-}
-
-const (
-	minDuration Duration = -1 << 63
-	maxDuration Duration = 1<<63 - 1
-)
-
-var subTests = []struct {
-	t Time
-	u Time
-	d Duration
-}{
-	{Time{}, Time{}, Duration(0)},
-	{Date(2009, 11, 23, 0, 0, 0, 1, UTC), Date(2009, 11, 23, 0, 0, 0, 0, UTC), Duration(1)},
-	{Date(2009, 11, 23, 0, 0, 0, 0, UTC), Date(2009, 11, 24, 0, 0, 0, 0, UTC), -24 * Hour},
-	{Date(2009, 11, 24, 0, 0, 0, 0, UTC), Date(2009, 11, 23, 0, 0, 0, 0, UTC), 24 * Hour},
-	{Date(-2009, 11, 24, 0, 0, 0, 0, UTC), Date(-2009, 11, 23, 0, 0, 0, 0, UTC), 24 * Hour},
-	{Time{}, Date(2109, 11, 23, 0, 0, 0, 0, UTC), Duration(minDuration)},
-	{Date(2109, 11, 23, 0, 0, 0, 0, UTC), Time{}, Duration(maxDuration)},
-	{Time{}, Date(-2109, 11, 23, 0, 0, 0, 0, UTC), Duration(maxDuration)},
-	{Date(-2109, 11, 23, 0, 0, 0, 0, UTC), Time{}, Duration(minDuration)},
-	{Date(2290, 1, 1, 0, 0, 0, 0, UTC), Date(2000, 1, 1, 0, 0, 0, 0, UTC), 290*365*24*Hour + 71*24*Hour},
-	{Date(2300, 1, 1, 0, 0, 0, 0, UTC), Date(2000, 1, 1, 0, 0, 0, 0, UTC), Duration(maxDuration)},
-	{Date(2000, 1, 1, 0, 0, 0, 0, UTC), Date(2290, 1, 1, 0, 0, 0, 0, UTC), -290*365*24*Hour - 71*24*Hour},
-	{Date(2000, 1, 1, 0, 0, 0, 0, UTC), Date(2300, 1, 1, 0, 0, 0, 0, UTC), Duration(minDuration)},
-}
-
-func TestSub(t *testing.T) {
-	for i, st := range subTests {
-		got := st.t.Sub(st.u)
-		if got != st.d {
-			t.Errorf("#%d: Sub(%v, %v): got %v; want %v", i, st.t, st.u, got, st.d)
-		}
-	}
-}
-
-var nsDurationTests = []struct {
-	d    Duration
-	want int64
-}{
-	{Duration(-1000), -1000},
-	{Duration(-1), -1},
-	{Duration(1), 1},
-	{Duration(1000), 1000},
-}
-
-func TestDurationNanoseconds(t *testing.T) {
-	for _, tt := range nsDurationTests {
-		if got := tt.d.Nanoseconds(); got != tt.want {
-			t.Errorf("d.Nanoseconds() = %d; want: %d", got, tt.want)
-		}
-	}
-}
-
-var minDurationTests = []struct {
-	d    Duration
-	want float64
-}{
-	{Duration(-60000000000), -1},
-	{Duration(-1), -1 / 60e9},
-	{Duration(1), 1 / 60e9},
-	{Duration(60000000000), 1},
-}
-
-func TestDurationMinutes(t *testing.T) {
-	for _, tt := range minDurationTests {
-		if got := tt.d.Minutes(); got != tt.want {
-			t.Errorf("d.Minutes() = %g; want: %g", got, tt.want)
-		}
-	}
-}
-
-var hourDurationTests = []struct {
-	d    Duration
-	want float64
-}{
-	{Duration(-3600000000000), -1},
-	{Duration(-1), -1 / 3600e9},
-	{Duration(1), 1 / 3600e9},
-	{Duration(3600000000000), 1},
-}
-
-func TestDurationHours(t *testing.T) {
-	for _, tt := range hourDurationTests {
-		if got := tt.d.Hours(); got != tt.want {
-			t.Errorf("d.Hours() = %g; want: %g", got, tt.want)
-		}
-	}
-}
-
-func BenchmarkNow(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		t = Now()
-	}
-}
-
-func BenchmarkNowUnixNano(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		u = Now().UnixNano()
-	}
-}
-
-func BenchmarkFormat(b *testing.B) {
-	t := Unix(1265346057, 0)
-	for i := 0; i < b.N; i++ {
-		t.Format("Mon Jan  2 15:04:05 2006")
-	}
-}
-
-func BenchmarkFormatNow(b *testing.B) {
-	// Like BenchmarkFormat, but easier, because the time zone
-	// lookup cache is optimized for the present.
-	t := Now()
-	for i := 0; i < b.N; i++ {
-		t.Format("Mon Jan  2 15:04:05 2006")
-	}
-}
-
-func BenchmarkParse(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		Parse(ANSIC, "Mon Jan  2 15:04:05 2006")
-	}
-}
-
-func BenchmarkParseDuration(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		ParseDuration("9007199254.740993ms")
-		ParseDuration("9007199254740993ns")
-	}
-}
-
-func BenchmarkHour(b *testing.B) {
-	t := Now()
-	for i := 0; i < b.N; i++ {
-		_ = t.Hour()
-	}
-}
-
-func BenchmarkSecond(b *testing.B) {
-	t := Now()
-	for i := 0; i < b.N; i++ {
-		_ = t.Second()
-	}
-}
-
-func BenchmarkYear(b *testing.B) {
-	t := Now()
-	for i := 0; i < b.N; i++ {
-		_ = t.Year()
-	}
-}
-
-func BenchmarkDay(b *testing.B) {
-	t := Now()
-	for i := 0; i < b.N; i++ {
-		_ = t.Day()
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/time/zoneinfo.go b/third_party/gofrontend/libgo/go/time/zoneinfo.go
deleted file mode 100644
index c8e53a2..0000000
--- a/third_party/gofrontend/libgo/go/time/zoneinfo.go
+++ /dev/null
@@ -1,287 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time
-
-import (
-	"sync"
-	"syscall"
-)
-
-// A Location maps time instants to the zone in use at that time.
-// Typically, the Location represents the collection of time offsets
-// in use in a geographical area, such as CEST and CET for central Europe.
-type Location struct {
-	name string
-	zone []zone
-	tx   []zoneTrans
-
-	// Most lookups will be for the current time.
-	// To avoid the binary search through tx, keep a
-	// static one-element cache that gives the correct
-	// zone for the time when the Location was created.
-	// if cacheStart <= t <= cacheEnd,
-	// lookup can return cacheZone.
-	// The units for cacheStart and cacheEnd are seconds
-	// since January 1, 1970 UTC, to match the argument
-	// to lookup.
-	cacheStart int64
-	cacheEnd   int64
-	cacheZone  *zone
-}
-
-// A zone represents a single time zone such as CEST or CET.
-type zone struct {
-	name   string // abbreviated name, "CET"
-	offset int    // seconds east of UTC
-	isDST  bool   // is this zone Daylight Savings Time?
-}
-
-// A zoneTrans represents a single time zone transition.
-type zoneTrans struct {
-	when         int64 // transition time, in seconds since 1970 GMT
-	index        uint8 // the index of the zone that goes into effect at that time
-	isstd, isutc bool  // ignored - no idea what these mean
-}
-
-// alpha and omega are the beginning and end of time for zone
-// transitions.
-const (
-	alpha = -1 << 63  // math.MinInt64
-	omega = 1<<63 - 1 // math.MaxInt64
-)
-
-// UTC represents Universal Coordinated Time (UTC).
-var UTC *Location = &utcLoc
-
-// utcLoc is separate so that get can refer to &utcLoc
-// and ensure that it never returns a nil *Location,
-// even if a badly behaved client has changed UTC.
-var utcLoc = Location{name: "UTC"}
-
-// Local represents the system's local time zone.
-var Local *Location = &localLoc
-
-// localLoc is separate so that initLocal can initialize
-// it even if a client has changed Local.
-var localLoc Location
-var localOnce sync.Once
-
-func (l *Location) get() *Location {
-	if l == nil {
-		return &utcLoc
-	}
-	if l == &localLoc {
-		localOnce.Do(initLocal)
-	}
-	return l
-}
-
-// String returns a descriptive name for the time zone information,
-// corresponding to the argument to LoadLocation.
-func (l *Location) String() string {
-	return l.get().name
-}
-
-// FixedZone returns a Location that always uses
-// the given zone name and offset (seconds east of UTC).
-func FixedZone(name string, offset int) *Location {
-	l := &Location{
-		name:       name,
-		zone:       []zone{{name, offset, false}},
-		tx:         []zoneTrans{{alpha, 0, false, false}},
-		cacheStart: alpha,
-		cacheEnd:   omega,
-	}
-	l.cacheZone = &l.zone[0]
-	return l
-}
-
-// lookup returns information about the time zone in use at an
-// instant in time expressed as seconds since January 1, 1970 00:00:00 UTC.
-//
-// The returned information gives the name of the zone (such as "CET"),
-// the start and end times bracketing sec when that zone is in effect,
-// the offset in seconds east of UTC (such as -5*60*60), and whether
-// the daylight savings is being observed at that time.
-func (l *Location) lookup(sec int64) (name string, offset int, isDST bool, start, end int64) {
-	l = l.get()
-
-	if len(l.zone) == 0 {
-		name = "UTC"
-		offset = 0
-		isDST = false
-		start = alpha
-		end = omega
-		return
-	}
-
-	if zone := l.cacheZone; zone != nil && l.cacheStart <= sec && sec < l.cacheEnd {
-		name = zone.name
-		offset = zone.offset
-		isDST = zone.isDST
-		start = l.cacheStart
-		end = l.cacheEnd
-		return
-	}
-
-	if len(l.tx) == 0 || sec < l.tx[0].when {
-		zone := &l.zone[l.lookupFirstZone()]
-		name = zone.name
-		offset = zone.offset
-		isDST = zone.isDST
-		start = alpha
-		if len(l.tx) > 0 {
-			end = l.tx[0].when
-		} else {
-			end = omega
-		}
-		return
-	}
-
-	// Binary search for entry with largest time <= sec.
-	// Not using sort.Search to avoid dependencies.
-	tx := l.tx
-	end = omega
-	lo := 0
-	hi := len(tx)
-	for hi-lo > 1 {
-		m := lo + (hi-lo)/2
-		lim := tx[m].when
-		if sec < lim {
-			end = lim
-			hi = m
-		} else {
-			lo = m
-		}
-	}
-	zone := &l.zone[tx[lo].index]
-	name = zone.name
-	offset = zone.offset
-	isDST = zone.isDST
-	start = tx[lo].when
-	// end = maintained during the search
-	return
-}
-
-// lookupFirstZone returns the index of the time zone to use for times
-// before the first transition time, or when there are no transition
-// times.
-//
-// The reference implementation in localtime.c from
-// http://www.iana.org/time-zones/repository/releases/tzcode2013g.tar.gz
-// implements the following algorithm for these cases:
-// 1) If the first zone is unused by the transitions, use it.
-// 2) Otherwise, if there are transition times, and the first
-//    transition is to a zone in daylight time, find the first
-//    non-daylight-time zone before and closest to the first transition
-//    zone.
-// 3) Otherwise, use the first zone that is not daylight time, if
-//    there is one.
-// 4) Otherwise, use the first zone.
-func (l *Location) lookupFirstZone() int {
-	// Case 1.
-	if !l.firstZoneUsed() {
-		return 0
-	}
-
-	// Case 2.
-	if len(l.tx) > 0 && l.zone[l.tx[0].index].isDST {
-		for zi := int(l.tx[0].index) - 1; zi >= 0; zi-- {
-			if !l.zone[zi].isDST {
-				return zi
-			}
-		}
-	}
-
-	// Case 3.
-	for zi := range l.zone {
-		if !l.zone[zi].isDST {
-			return zi
-		}
-	}
-
-	// Case 4.
-	return 0
-}
-
-// firstZoneUsed returns whether the first zone is used by some
-// transition.
-func (l *Location) firstZoneUsed() bool {
-	for _, tx := range l.tx {
-		if tx.index == 0 {
-			return true
-		}
-	}
-	return false
-}
-
-// lookupName returns information about the time zone with
-// the given name (such as "EST") at the given pseudo-Unix time
-// (what the given time of day would be in UTC).
-func (l *Location) lookupName(name string, unix int64) (offset int, isDST bool, ok bool) {
-	l = l.get()
-
-	// First try for a zone with the right name that was actually
-	// in effect at the given time. (In Sydney, Australia, both standard
-	// and daylight-savings time are abbreviated "EST". Using the
-	// offset helps us pick the right one for the given time.
-	// It's not perfect: during the backward transition we might pick
-	// either one.)
-	for i := range l.zone {
-		zone := &l.zone[i]
-		if zone.name == name {
-			nam, offset, isDST, _, _ := l.lookup(unix - int64(zone.offset))
-			if nam == zone.name {
-				return offset, isDST, true
-			}
-		}
-	}
-
-	// Otherwise fall back to an ordinary name match.
-	for i := range l.zone {
-		zone := &l.zone[i]
-		if zone.name == name {
-			return zone.offset, zone.isDST, true
-		}
-	}
-
-	// Otherwise, give up.
-	return
-}
-
-// NOTE(rsc): Eventually we will need to accept the POSIX TZ environment
-// syntax too, but I don't feel like implementing it today.
-
-var zoneinfo, _ = syscall.Getenv("ZONEINFO")
-
-// LoadLocation returns the Location with the given name.
-//
-// If the name is "" or "UTC", LoadLocation returns UTC.
-// If the name is "Local", LoadLocation returns Local.
-//
-// Otherwise, the name is taken to be a location name corresponding to a file
-// in the IANA Time Zone database, such as "America/New_York".
-//
-// The time zone database needed by LoadLocation may not be
-// present on all systems, especially non-Unix systems.
-// LoadLocation looks in the directory or uncompressed zip file
-// named by the ZONEINFO environment variable, if any, then looks in
-// known installation locations on Unix systems,
-// and finally looks in $GOROOT/lib/time/zoneinfo.zip.
-func LoadLocation(name string) (*Location, error) {
-	if name == "" || name == "UTC" {
-		return UTC, nil
-	}
-	if name == "Local" {
-		return Local, nil
-	}
-	if zoneinfo != "" {
-		if z, err := loadZoneFile(zoneinfo, name); err == nil {
-			z.name = name
-			return z, nil
-		}
-	}
-	return loadLocation(name)
-}
diff --git a/third_party/gofrontend/libgo/go/time/zoneinfo_abbrs_windows.go b/third_party/gofrontend/libgo/go/time/zoneinfo_abbrs_windows.go
deleted file mode 100644
index 51a1a2f..0000000
--- a/third_party/gofrontend/libgo/go/time/zoneinfo_abbrs_windows.go
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// generated by genzabbrs.go from
-// http://unicode.org/cldr/data/common/supplemental/windowsZones.xml
-
-package time
-
-type abbr struct {
-	std string
-	dst string
-}
-
-var abbrs = map[string]abbr{
-	"Egypt Standard Time":             {"EET", "EET"},    // Africa/Cairo
-	"Morocco Standard Time":           {"WET", "WEST"},   // Africa/Casablanca
-	"South Africa Standard Time":      {"SAST", "SAST"},  // Africa/Johannesburg
-	"W. Central Africa Standard Time": {"WAT", "WAT"},    // Africa/Lagos
-	"E. Africa Standard Time":         {"EAT", "EAT"},    // Africa/Nairobi
-	"Libya Standard Time":             {"EET", "EET"},    // Africa/Tripoli
-	"Namibia Standard Time":           {"WAT", "WAST"},   // Africa/Windhoek
-	"Alaskan Standard Time":           {"AKST", "AKDT"},  // America/Anchorage
-	"Paraguay Standard Time":          {"PYT", "PYST"},   // America/Asuncion
-	"Bahia Standard Time":             {"BRT", "BRST"},   // America/Bahia
-	"SA Pacific Standard Time":        {"COT", "COT"},    // America/Bogota
-	"Argentina Standard Time":         {"ART", "ART"},    // America/Buenos_Aires
-	"Venezuela Standard Time":         {"VET", "VET"},    // America/Caracas
-	"SA Eastern Standard Time":        {"GFT", "GFT"},    // America/Cayenne
-	"Central Standard Time":           {"CST", "CDT"},    // America/Chicago
-	"Mountain Standard Time (Mexico)": {"MST", "MDT"},    // America/Chihuahua
-	"Central Brazilian Standard Time": {"AMT", "AMST"},   // America/Cuiaba
-	"Mountain Standard Time":          {"MST", "MDT"},    // America/Denver
-	"Greenland Standard Time":         {"WGT", "WGST"},   // America/Godthab
-	"Central America Standard Time":   {"CST", "CST"},    // America/Guatemala
-	"Atlantic Standard Time":          {"AST", "ADT"},    // America/Halifax
-	"US Eastern Standard Time":        {"EST", "EDT"},    // America/Indianapolis
-	"SA Western Standard Time":        {"BOT", "BOT"},    // America/La_Paz
-	"Pacific Standard Time":           {"PST", "PDT"},    // America/Los_Angeles
-	"Central Standard Time (Mexico)":  {"CST", "CDT"},    // America/Mexico_City
-	"Montevideo Standard Time":        {"UYT", "UYST"},   // America/Montevideo
-	"Eastern Standard Time":           {"EST", "EDT"},    // America/New_York
-	"US Mountain Standard Time":       {"MST", "MST"},    // America/Phoenix
-	"Canada Central Standard Time":    {"CST", "CST"},    // America/Regina
-	"Pacific Standard Time (Mexico)":  {"PST", "PDT"},    // America/Santa_Isabel
-	"Pacific SA Standard Time":        {"CLT", "CLST"},   // America/Santiago
-	"E. South America Standard Time":  {"BRT", "BRST"},   // America/Sao_Paulo
-	"Newfoundland Standard Time":      {"NST", "NDT"},    // America/St_Johns
-	"Central Asia Standard Time":      {"ALMT", "ALMT"},  // Asia/Almaty
-	"Jordan Standard Time":            {"EET", "EEST"},   // Asia/Amman
-	"Arabic Standard Time":            {"AST", "AST"},    // Asia/Baghdad
-	"Azerbaijan Standard Time":        {"AZT", "AZST"},   // Asia/Baku
-	"SE Asia Standard Time":           {"ICT", "ICT"},    // Asia/Bangkok
-	"Middle East Standard Time":       {"EET", "EEST"},   // Asia/Beirut
-	"India Standard Time":             {"IST", "IST"},    // Asia/Calcutta
-	"Sri Lanka Standard Time":         {"IST", "IST"},    // Asia/Colombo
-	"Syria Standard Time":             {"EET", "EEST"},   // Asia/Damascus
-	"Bangladesh Standard Time":        {"BDT", "BDT"},    // Asia/Dhaka
-	"Arabian Standard Time":           {"GST", "GST"},    // Asia/Dubai
-	"North Asia East Standard Time":   {"IRKT", "IRKT"},  // Asia/Irkutsk
-	"Israel Standard Time":            {"IST", "IDT"},    // Asia/Jerusalem
-	"Afghanistan Standard Time":       {"AFT", "AFT"},    // Asia/Kabul
-	"Pakistan Standard Time":          {"PKT", "PKT"},    // Asia/Karachi
-	"Nepal Standard Time":             {"NPT", "NPT"},    // Asia/Katmandu
-	"North Asia Standard Time":        {"KRAT", "KRAT"},  // Asia/Krasnoyarsk
-	"Magadan Standard Time":           {"MAGT", "MAGT"},  // Asia/Magadan
-	"N. Central Asia Standard Time":   {"NOVT", "NOVT"},  // Asia/Novosibirsk
-	"Myanmar Standard Time":           {"MMT", "MMT"},    // Asia/Rangoon
-	"Arab Standard Time":              {"AST", "AST"},    // Asia/Riyadh
-	"Korea Standard Time":             {"KST", "KST"},    // Asia/Seoul
-	"China Standard Time":             {"CST", "CST"},    // Asia/Shanghai
-	"Singapore Standard Time":         {"SGT", "SGT"},    // Asia/Singapore
-	"Taipei Standard Time":            {"CST", "CST"},    // Asia/Taipei
-	"West Asia Standard Time":         {"UZT", "UZT"},    // Asia/Tashkent
-	"Georgian Standard Time":          {"GET", "GET"},    // Asia/Tbilisi
-	"Iran Standard Time":              {"IRST", "IRDT"},  // Asia/Tehran
-	"Tokyo Standard Time":             {"JST", "JST"},    // Asia/Tokyo
-	"Ulaanbaatar Standard Time":       {"ULAT", "ULAT"},  // Asia/Ulaanbaatar
-	"Vladivostok Standard Time":       {"VLAT", "VLAT"},  // Asia/Vladivostok
-	"Yakutsk Standard Time":           {"YAKT", "YAKT"},  // Asia/Yakutsk
-	"Ekaterinburg Standard Time":      {"YEKT", "YEKT"},  // Asia/Yekaterinburg
-	"Caucasus Standard Time":          {"AMT", "AMT"},    // Asia/Yerevan
-	"Azores Standard Time":            {"AZOT", "AZOST"}, // Atlantic/Azores
-	"Cape Verde Standard Time":        {"CVT", "CVT"},    // Atlantic/Cape_Verde
-	"Greenwich Standard Time":         {"GMT", "GMT"},    // Atlantic/Reykjavik
-	"Cen. Australia Standard Time":    {"CST", "CST"},    // Australia/Adelaide
-	"E. Australia Standard Time":      {"EST", "EST"},    // Australia/Brisbane
-	"AUS Central Standard Time":       {"CST", "CST"},    // Australia/Darwin
-	"Tasmania Standard Time":          {"EST", "EST"},    // Australia/Hobart
-	"W. Australia Standard Time":      {"WST", "WST"},    // Australia/Perth
-	"AUS Eastern Standard Time":       {"EST", "EST"},    // Australia/Sydney
-	"UTC":                            {"GMT", "GMT"},       // Etc/GMT
-	"UTC-11":                         {"GMT+11", "GMT+11"}, // Etc/GMT+11
-	"Dateline Standard Time":         {"GMT+12", "GMT+12"}, // Etc/GMT+12
-	"UTC-02":                         {"GMT+2", "GMT+2"},   // Etc/GMT+2
-	"UTC+12":                         {"GMT-12", "GMT-12"}, // Etc/GMT-12
-	"W. Europe Standard Time":        {"CET", "CEST"},      // Europe/Berlin
-	"GTB Standard Time":              {"EET", "EEST"},      // Europe/Bucharest
-	"Central Europe Standard Time":   {"CET", "CEST"},      // Europe/Budapest
-	"Turkey Standard Time":           {"EET", "EEST"},      // Europe/Istanbul
-	"Kaliningrad Standard Time":      {"FET", "FET"},       // Europe/Kaliningrad
-	"FLE Standard Time":              {"EET", "EEST"},      // Europe/Kiev
-	"GMT Standard Time":              {"GMT", "BST"},       // Europe/London
-	"Russian Standard Time":          {"MSK", "MSK"},       // Europe/Moscow
-	"Romance Standard Time":          {"CET", "CEST"},      // Europe/Paris
-	"Central European Standard Time": {"CET", "CEST"},      // Europe/Warsaw
-	"Mauritius Standard Time":        {"MUT", "MUT"},       // Indian/Mauritius
-	"Samoa Standard Time":            {"WST", "WST"},       // Pacific/Apia
-	"New Zealand Standard Time":      {"NZST", "NZDT"},     // Pacific/Auckland
-	"Fiji Standard Time":             {"FJT", "FJT"},       // Pacific/Fiji
-	"Central Pacific Standard Time":  {"SBT", "SBT"},       // Pacific/Guadalcanal
-	"Hawaiian Standard Time":         {"HST", "HST"},       // Pacific/Honolulu
-	"Line Islands Standard Time":     {"LINT", "LINT"},     // Pacific/Kiritimati
-	"West Pacific Standard Time":     {"PGT", "PGT"},       // Pacific/Port_Moresby
-	"Tonga Standard Time":            {"TOT", "TOT"},       // Pacific/Tongatapu
-}
diff --git a/third_party/gofrontend/libgo/go/time/zoneinfo_ios.go b/third_party/gofrontend/libgo/go/time/zoneinfo_ios.go
deleted file mode 100644
index f09166c..0000000
--- a/third_party/gofrontend/libgo/go/time/zoneinfo_ios.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin
-// +build arm arm64
-
-package time
-
-import "syscall"
-
-var zoneFile string
-
-func init() {
-	wd, err := syscall.Getwd()
-	if err != nil {
-		return
-	}
-
-	// The working directory at initialization is the root of the
-	// app bundle: "/private/.../bundlename.app". That's where we
-	// keep zoneinfo.zip.
-	zoneFile = wd + "/zoneinfo.zip"
-}
-
-func forceZipFileForTesting(zipOnly bool) {
-	// On iOS we only have the zip file.
-}
-
-func initTestingZone() {
-	z, err := loadZoneFile(zoneFile, "America/Los_Angeles")
-	if err != nil {
-		panic("cannot load America/Los_Angeles for testing: " + err.Error())
-	}
-	z.name = "Local"
-	localLoc = *z
-}
-
-func initLocal() {
-	// TODO(crawshaw): [NSTimeZone localTimeZone]
-	localLoc = *UTC
-}
-
-func loadLocation(name string) (*Location, error) {
-	z, err := loadZoneFile(zoneFile, name)
-	if err != nil {
-		return nil, err
-	}
-	z.name = name
-	return z, nil
-}
diff --git a/third_party/gofrontend/libgo/go/time/zoneinfo_plan9.go b/third_party/gofrontend/libgo/go/time/zoneinfo_plan9.go
deleted file mode 100644
index 0694f0a..0000000
--- a/third_party/gofrontend/libgo/go/time/zoneinfo_plan9.go
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Parse Plan 9 timezone(2) files.
-
-package time
-
-import (
-	"runtime"
-	"syscall"
-)
-
-func isSpace(r rune) bool {
-	return r == ' ' || r == '\t' || r == '\n'
-}
-
-// Copied from strings to avoid a dependency.
-func fields(s string) []string {
-	// First count the fields.
-	n := 0
-	inField := false
-	for _, rune := range s {
-		wasInField := inField
-		inField = !isSpace(rune)
-		if inField && !wasInField {
-			n++
-		}
-	}
-
-	// Now create them.
-	a := make([]string, n)
-	na := 0
-	fieldStart := -1 // Set to -1 when looking for start of field.
-	for i, rune := range s {
-		if isSpace(rune) {
-			if fieldStart >= 0 {
-				a[na] = s[fieldStart:i]
-				na++
-				fieldStart = -1
-			}
-		} else if fieldStart == -1 {
-			fieldStart = i
-		}
-	}
-	if fieldStart >= 0 { // Last field might end at EOF.
-		a[na] = s[fieldStart:]
-	}
-	return a
-}
-
-func loadZoneDataPlan9(s string) (l *Location, err error) {
-	f := fields(s)
-	if len(f) < 4 {
-		if len(f) == 2 && f[0] == "GMT" {
-			return UTC, nil
-		}
-		return nil, badData
-	}
-
-	var zones [2]zone
-
-	// standard timezone offset
-	o, err := atoi(f[1])
-	if err != nil {
-		return nil, badData
-	}
-	zones[0] = zone{name: f[0], offset: o, isDST: false}
-
-	// alternate timezone offset
-	o, err = atoi(f[3])
-	if err != nil {
-		return nil, badData
-	}
-	zones[1] = zone{name: f[2], offset: o, isDST: true}
-
-	// transition time pairs
-	var tx []zoneTrans
-	f = f[4:]
-	for i := 0; i < len(f); i++ {
-		zi := 0
-		if i%2 == 0 {
-			zi = 1
-		}
-		t, err := atoi(f[i])
-		if err != nil {
-			return nil, badData
-		}
-		t -= zones[0].offset
-		tx = append(tx, zoneTrans{when: int64(t), index: uint8(zi)})
-	}
-
-	// Committed to succeed.
-	l = &Location{zone: zones[:], tx: tx}
-
-	// Fill in the cache with information about right now,
-	// since that will be the most common lookup.
-	sec, _ := now()
-	for i := range tx {
-		if tx[i].when <= sec && (i+1 == len(tx) || sec < tx[i+1].when) {
-			l.cacheStart = tx[i].when
-			l.cacheEnd = omega
-			if i+1 < len(tx) {
-				l.cacheEnd = tx[i+1].when
-			}
-			l.cacheZone = &l.zone[tx[i].index]
-		}
-	}
-
-	return l, nil
-}
-
-func loadZoneFilePlan9(name string) (*Location, error) {
-	b, err := readFile(name)
-	if err != nil {
-		return nil, err
-	}
-	return loadZoneDataPlan9(string(b))
-}
-
-func initTestingZone() {
-	z, err := loadLocation("America/Los_Angeles")
-	if err != nil {
-		panic("cannot load America/Los_Angeles for testing: " + err.Error())
-	}
-	z.name = "Local"
-	localLoc = *z
-}
-
-func initLocal() {
-	t, ok := syscall.Getenv("timezone")
-	if ok {
-		if z, err := loadZoneDataPlan9(t); err == nil {
-			localLoc = *z
-			return
-		}
-	} else {
-		if z, err := loadZoneFilePlan9("/adm/timezone/local"); err == nil {
-			localLoc = *z
-			localLoc.name = "Local"
-			return
-		}
-	}
-
-	// Fall back to UTC.
-	localLoc.name = "UTC"
-}
-
-func loadLocation(name string) (*Location, error) {
-	z, err := loadZoneFile(runtime.GOROOT()+"/lib/time/zoneinfo.zip", name)
-	if err != nil {
-		return nil, err
-	}
-	z.name = name
-	return z, nil
-}
-
-func forceZipFileForTesting(zipOnly bool) {
-	// We only use the zip file anyway.
-}
diff --git a/third_party/gofrontend/libgo/go/time/zoneinfo_read.go b/third_party/gofrontend/libgo/go/time/zoneinfo_read.go
deleted file mode 100644
index de9ebb4..0000000
--- a/third_party/gofrontend/libgo/go/time/zoneinfo_read.go
+++ /dev/null
@@ -1,343 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Parse "zoneinfo" time zone file.
-// This is a fairly standard file format used on OS X, Linux, BSD, Sun, and others.
-// See tzfile(5), http://en.wikipedia.org/wiki/Zoneinfo,
-// and ftp://munnari.oz.au/pub/oldtz/
-
-package time
-
-import "errors"
-
-// Simple I/O interface to binary blob of data.
-type data struct {
-	p     []byte
-	error bool
-}
-
-func (d *data) read(n int) []byte {
-	if len(d.p) < n {
-		d.p = nil
-		d.error = true
-		return nil
-	}
-	p := d.p[0:n]
-	d.p = d.p[n:]
-	return p
-}
-
-func (d *data) big4() (n uint32, ok bool) {
-	p := d.read(4)
-	if len(p) < 4 {
-		d.error = true
-		return 0, false
-	}
-	return uint32(p[0])<<24 | uint32(p[1])<<16 | uint32(p[2])<<8 | uint32(p[3]), true
-}
-
-func (d *data) byte() (n byte, ok bool) {
-	p := d.read(1)
-	if len(p) < 1 {
-		d.error = true
-		return 0, false
-	}
-	return p[0], true
-}
-
-// Make a string by stopping at the first NUL
-func byteString(p []byte) string {
-	for i := 0; i < len(p); i++ {
-		if p[i] == 0 {
-			return string(p[0:i])
-		}
-	}
-	return string(p)
-}
-
-var badData = errors.New("malformed time zone information")
-
-func loadZoneData(bytes []byte) (l *Location, err error) {
-	d := data{bytes, false}
-
-	// 4-byte magic "TZif"
-	if magic := d.read(4); string(magic) != "TZif" {
-		return nil, badData
-	}
-
-	// 1-byte version, then 15 bytes of padding
-	var p []byte
-	if p = d.read(16); len(p) != 16 || p[0] != 0 && p[0] != '2' && p[0] != '3' {
-		return nil, badData
-	}
-
-	// six big-endian 32-bit integers:
-	//	number of UTC/local indicators
-	//	number of standard/wall indicators
-	//	number of leap seconds
-	//	number of transition times
-	//	number of local time zones
-	//	number of characters of time zone abbrev strings
-	const (
-		NUTCLocal = iota
-		NStdWall
-		NLeap
-		NTime
-		NZone
-		NChar
-	)
-	var n [6]int
-	for i := 0; i < 6; i++ {
-		nn, ok := d.big4()
-		if !ok {
-			return nil, badData
-		}
-		n[i] = int(nn)
-	}
-
-	// Transition times.
-	txtimes := data{d.read(n[NTime] * 4), false}
-
-	// Time zone indices for transition times.
-	txzones := d.read(n[NTime])
-
-	// Zone info structures
-	zonedata := data{d.read(n[NZone] * 6), false}
-
-	// Time zone abbreviations.
-	abbrev := d.read(n[NChar])
-
-	// Leap-second time pairs
-	d.read(n[NLeap] * 8)
-
-	// Whether tx times associated with local time types
-	// are specified as standard time or wall time.
-	isstd := d.read(n[NStdWall])
-
-	// Whether tx times associated with local time types
-	// are specified as UTC or local time.
-	isutc := d.read(n[NUTCLocal])
-
-	if d.error { // ran out of data
-		return nil, badData
-	}
-
-	// If version == 2 or 3, the entire file repeats, this time using
-	// 8-byte ints for txtimes and leap seconds.
-	// We won't need those until 2106.
-
-	// Now we can build up a useful data structure.
-	// First the zone information.
-	//	utcoff[4] isdst[1] nameindex[1]
-	zone := make([]zone, n[NZone])
-	for i := range zone {
-		var ok bool
-		var n uint32
-		if n, ok = zonedata.big4(); !ok {
-			return nil, badData
-		}
-		zone[i].offset = int(int32(n))
-		var b byte
-		if b, ok = zonedata.byte(); !ok {
-			return nil, badData
-		}
-		zone[i].isDST = b != 0
-		if b, ok = zonedata.byte(); !ok || int(b) >= len(abbrev) {
-			return nil, badData
-		}
-		zone[i].name = byteString(abbrev[b:])
-	}
-
-	// Now the transition time info.
-	tx := make([]zoneTrans, n[NTime])
-	for i := range tx {
-		var ok bool
-		var n uint32
-		if n, ok = txtimes.big4(); !ok {
-			return nil, badData
-		}
-		tx[i].when = int64(int32(n))
-		if int(txzones[i]) >= len(zone) {
-			return nil, badData
-		}
-		tx[i].index = txzones[i]
-		if i < len(isstd) {
-			tx[i].isstd = isstd[i] != 0
-		}
-		if i < len(isutc) {
-			tx[i].isutc = isutc[i] != 0
-		}
-	}
-
-	if len(tx) == 0 {
-		// Build fake transition to cover all time.
-		// This happens in fixed locations like "Etc/GMT0".
-		tx = append(tx, zoneTrans{when: alpha, index: 0})
-	}
-
-	// Committed to succeed.
-	l = &Location{zone: zone, tx: tx}
-
-	// Fill in the cache with information about right now,
-	// since that will be the most common lookup.
-	sec, _ := now()
-	for i := range tx {
-		if tx[i].when <= sec && (i+1 == len(tx) || sec < tx[i+1].when) {
-			l.cacheStart = tx[i].when
-			l.cacheEnd = omega
-			if i+1 < len(tx) {
-				l.cacheEnd = tx[i+1].when
-			}
-			l.cacheZone = &l.zone[tx[i].index]
-		}
-	}
-
-	return l, nil
-}
-
-func loadZoneFile(dir, name string) (l *Location, err error) {
-	if len(dir) > 4 && dir[len(dir)-4:] == ".zip" {
-		return loadZoneZip(dir, name)
-	}
-	if dir != "" {
-		name = dir + "/" + name
-	}
-	buf, err := readFile(name)
-	if err != nil {
-		return
-	}
-	return loadZoneData(buf)
-}
-
-// There are 500+ zoneinfo files.  Rather than distribute them all
-// individually, we ship them in an uncompressed zip file.
-// Used this way, the zip file format serves as a commonly readable
-// container for the individual small files.  We choose zip over tar
-// because zip files have a contiguous table of contents, making
-// individual file lookups faster, and because the per-file overhead
-// in a zip file is considerably less than tar's 512 bytes.
-
-// get4 returns the little-endian 32-bit value in b.
-func get4(b []byte) int {
-	if len(b) < 4 {
-		return 0
-	}
-	return int(b[0]) | int(b[1])<<8 | int(b[2])<<16 | int(b[3])<<24
-}
-
-// get2 returns the little-endian 16-bit value in b.
-func get2(b []byte) int {
-	if len(b) < 2 {
-		return 0
-	}
-	return int(b[0]) | int(b[1])<<8
-}
-
-func loadZoneZip(zipfile, name string) (l *Location, err error) {
-	fd, err := open(zipfile)
-	if err != nil {
-		return nil, errors.New("open " + zipfile + ": " + err.Error())
-	}
-	defer closefd(fd)
-
-	const (
-		zecheader = 0x06054b50
-		zcheader  = 0x02014b50
-		ztailsize = 22
-
-		zheadersize = 30
-		zheader     = 0x04034b50
-	)
-
-	buf := make([]byte, ztailsize)
-	if err := preadn(fd, buf, -ztailsize); err != nil || get4(buf) != zecheader {
-		return nil, errors.New("corrupt zip file " + zipfile)
-	}
-	n := get2(buf[10:])
-	size := get4(buf[12:])
-	off := get4(buf[16:])
-
-	buf = make([]byte, size)
-	if err := preadn(fd, buf, off); err != nil {
-		return nil, errors.New("corrupt zip file " + zipfile)
-	}
-
-	for i := 0; i < n; i++ {
-		// zip entry layout:
-		//	0	magic[4]
-		//	4	madevers[1]
-		//	5	madeos[1]
-		//	6	extvers[1]
-		//	7	extos[1]
-		//	8	flags[2]
-		//	10	meth[2]
-		//	12	modtime[2]
-		//	14	moddate[2]
-		//	16	crc[4]
-		//	20	csize[4]
-		//	24	uncsize[4]
-		//	28	namelen[2]
-		//	30	xlen[2]
-		//	32	fclen[2]
-		//	34	disknum[2]
-		//	36	iattr[2]
-		//	38	eattr[4]
-		//	42	off[4]
-		//	46	name[namelen]
-		//	46+namelen+xlen+fclen - next header
-		//
-		if get4(buf) != zcheader {
-			break
-		}
-		meth := get2(buf[10:])
-		size := get4(buf[24:])
-		namelen := get2(buf[28:])
-		xlen := get2(buf[30:])
-		fclen := get2(buf[32:])
-		off := get4(buf[42:])
-		zname := buf[46 : 46+namelen]
-		buf = buf[46+namelen+xlen+fclen:]
-		if string(zname) != name {
-			continue
-		}
-		if meth != 0 {
-			return nil, errors.New("unsupported compression for " + name + " in " + zipfile)
-		}
-
-		// zip per-file header layout:
-		//	0	magic[4]
-		//	4	extvers[1]
-		//	5	extos[1]
-		//	6	flags[2]
-		//	8	meth[2]
-		//	10	modtime[2]
-		//	12	moddate[2]
-		//	14	crc[4]
-		//	18	csize[4]
-		//	22	uncsize[4]
-		//	26	namelen[2]
-		//	28	xlen[2]
-		//	30	name[namelen]
-		//	30+namelen+xlen - file data
-		//
-		buf = make([]byte, zheadersize+namelen)
-		if err := preadn(fd, buf, off); err != nil ||
-			get4(buf) != zheader ||
-			get2(buf[8:]) != meth ||
-			get2(buf[26:]) != namelen ||
-			string(buf[30:30+namelen]) != name {
-			return nil, errors.New("corrupt zip file " + zipfile)
-		}
-		xlen = get2(buf[28:])
-
-		buf = make([]byte, size)
-		if err := preadn(fd, buf, off+30+namelen+xlen); err != nil {
-			return nil, errors.New("corrupt zip file " + zipfile)
-		}
-
-		return loadZoneData(buf)
-	}
-
-	return nil, errors.New("cannot find " + name + " in zip file " + zipfile)
-}
diff --git a/third_party/gofrontend/libgo/go/time/zoneinfo_test.go b/third_party/gofrontend/libgo/go/time/zoneinfo_test.go
deleted file mode 100644
index ede5330..0000000
--- a/third_party/gofrontend/libgo/go/time/zoneinfo_test.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time_test
-
-import (
-	"testing"
-	"time"
-)
-
-func TestVersion3(t *testing.T) {
-	t.Skip("gccgo does not use the zip file")
-	time.ForceZipFileForTesting(true)
-	defer time.ForceZipFileForTesting(false)
-	_, err := time.LoadLocation("Asia/Jerusalem")
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-// Test that we get the correct results for times before the first
-// transition time.  To do this we explicitly check early dates in a
-// couple of specific timezones.
-func TestFirstZone(t *testing.T) {
-	t.Skip("gccgo does not use the zip file")
-
-	time.ForceZipFileForTesting(true)
-	defer time.ForceZipFileForTesting(false)
-
-	const format = "Mon, 02 Jan 2006 15:04:05 -0700 (MST)"
-	var tests = []struct {
-		zone  string
-		unix  int64
-		want1 string
-		want2 string
-	}{
-		{
-			"PST8PDT",
-			-1633269601,
-			"Sun, 31 Mar 1918 01:59:59 -0800 (PST)",
-			"Sun, 31 Mar 1918 03:00:00 -0700 (PDT)",
-		},
-		{
-			"Pacific/Fakaofo",
-			1325242799,
-			"Thu, 29 Dec 2011 23:59:59 -1100 (TKT)",
-			"Sat, 31 Dec 2011 00:00:00 +1300 (TKT)",
-		},
-	}
-
-	for _, test := range tests {
-		z, err := time.LoadLocation(test.zone)
-		if err != nil {
-			t.Fatal(err)
-		}
-		s := time.Unix(test.unix, 0).In(z).Format(format)
-		if s != test.want1 {
-			t.Errorf("for %s %d got %q want %q", test.zone, test.unix, s, test.want1)
-		}
-		s = time.Unix(test.unix+1, 0).In(z).Format(format)
-		if s != test.want2 {
-			t.Errorf("for %s %d got %q want %q", test.zone, test.unix, s, test.want2)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/time/zoneinfo_unix.go b/third_party/gofrontend/libgo/go/time/zoneinfo_unix.go
deleted file mode 100644
index 5fc669e..0000000
--- a/third_party/gofrontend/libgo/go/time/zoneinfo_unix.go
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin,386 darwin,amd64 dragonfly freebsd linux nacl netbsd openbsd solaris
-
-// Parse "zoneinfo" time zone file.
-// This is a fairly standard file format used on OS X, Linux, BSD, Sun, and others.
-// See tzfile(5), http://en.wikipedia.org/wiki/Zoneinfo,
-// and ftp://munnari.oz.au/pub/oldtz/
-
-package time
-
-import (
-	"errors"
-	"runtime"
-	"syscall"
-)
-
-func initTestingZone() {
-	syscall.Setenv("TZ", "America/Los_Angeles")
-	initLocal()
-}
-
-// Many systems use /usr/share/zoneinfo, Solaris 2 has
-// /usr/share/lib/zoneinfo, IRIX 6 has /usr/lib/locale/TZ.
-var zoneDirs = []string{
-	"/usr/share/zoneinfo/",
-	"/usr/share/lib/zoneinfo/",
-	"/usr/lib/locale/TZ/",
-	runtime.GOROOT() + "/lib/time/zoneinfo.zip",
-}
-
-var origZoneDirs = zoneDirs
-
-func forceZipFileForTesting(zipOnly bool) {
-	zoneDirs = make([]string, len(origZoneDirs))
-	copy(zoneDirs, origZoneDirs)
-	if zipOnly {
-		for i := 0; i < len(zoneDirs)-1; i++ {
-			zoneDirs[i] = "/XXXNOEXIST"
-		}
-	}
-}
-
-func initLocal() {
-	// consult $TZ to find the time zone to use.
-	// no $TZ means use the system default /etc/localtime.
-	// $TZ="" means use UTC.
-	// $TZ="foo" means use /usr/share/zoneinfo/foo.
-
-	tz, ok := syscall.Getenv("TZ")
-	switch {
-	case !ok:
-		z, err := loadZoneFile("", "/etc/localtime")
-		if err == nil {
-			localLoc = *z
-			localLoc.name = "Local"
-			return
-		}
-	case tz != "" && tz != "UTC":
-		if z, err := loadLocation(tz); err == nil {
-			localLoc = *z
-			return
-		}
-	}
-
-	// Fall back to UTC.
-	localLoc.name = "UTC"
-}
-
-func loadLocation(name string) (*Location, error) {
-	var firstErr error
-	for _, zoneDir := range zoneDirs {
-		if z, err := loadZoneFile(zoneDir, name); err == nil {
-			z.name = name
-			return z, nil
-		} else if firstErr == nil && !isNotExist(err) {
-			firstErr = err
-		}
-	}
-	if firstErr != nil {
-		return nil, firstErr
-	}
-	return nil, errors.New("unknown time zone " + name)
-}
diff --git a/third_party/gofrontend/libgo/go/time/zoneinfo_windows.go b/third_party/gofrontend/libgo/go/time/zoneinfo_windows.go
deleted file mode 100644
index d04ebec..0000000
--- a/third_party/gofrontend/libgo/go/time/zoneinfo_windows.go
+++ /dev/null
@@ -1,249 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package time
-
-import (
-	"errors"
-	"internal/syscall/windows/registry"
-	"runtime"
-	"syscall"
-)
-
-//go:generate go run genzabbrs.go -output zoneinfo_abbrs_windows.go
-
-// TODO(rsc): Fall back to copy of zoneinfo files.
-
-// BUG(brainman,rsc): On Windows, the operating system does not provide complete
-// time zone information.
-// The implementation assumes that this year's rules for daylight savings
-// time apply to all previous and future years as well.
-
-// matchZoneKey checks if stdname and dstname match the corresponding "Std"
-// and "Dlt" key values in the kname key stored under the open registry key zones.
-func matchZoneKey(zones registry.Key, kname string, stdname, dstname string) (matched bool, err2 error) {
-	k, err := registry.OpenKey(zones, kname, registry.READ)
-	if err != nil {
-		return false, err
-	}
-	defer k.Close()
-
-	s, _, err := k.GetStringValue("Std")
-	if err != nil {
-		return false, err
-	}
-	if s != stdname {
-		return false, nil
-	}
-	s, _, err = k.GetStringValue("Dlt")
-	if err != nil {
-		return false, err
-	}
-	if s != dstname && dstname != stdname {
-		return false, nil
-	}
-	return true, nil
-}
-
-// toEnglishName searches the registry for an English name of a time zone
-// whose zone names are stdname and dstname and returns the English name.
-func toEnglishName(stdname, dstname string) (string, error) {
-	k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones`, registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE)
-	if err != nil {
-		return "", err
-	}
-	defer k.Close()
-
-	names, err := k.ReadSubKeyNames(-1)
-	if err != nil {
-		return "", err
-	}
-	for _, name := range names {
-		matched, err := matchZoneKey(k, name, stdname, dstname)
-		if err == nil && matched {
-			return name, nil
-		}
-	}
-	return "", errors.New(`English name for time zone "` + stdname + `" not found in registry`)
-}
-
-// extractCAPS extracts capital letters from description desc.
-func extractCAPS(desc string) string {
-	var short []rune
-	for _, c := range desc {
-		if 'A' <= c && c <= 'Z' {
-			short = append(short, rune(c))
-		}
-	}
-	return string(short)
-}
-
-// abbrev returns the abbreviations to use for the given zone z.
-func abbrev(z *syscall.Timezoneinformation) (std, dst string) {
-	stdName := syscall.UTF16ToString(z.StandardName[:])
-	a, ok := abbrs[stdName]
-	if !ok {
-		dstName := syscall.UTF16ToString(z.DaylightName[:])
-		// Perhaps stdName is not English. Try to convert it.
-		englishName, err := toEnglishName(stdName, dstName)
-		if err == nil {
-			a, ok = abbrs[englishName]
-			if ok {
-				return a.std, a.dst
-			}
-		}
-		// fallback to using capital letters
-		return extractCAPS(stdName), extractCAPS(dstName)
-	}
-	return a.std, a.dst
-}
-
-// pseudoUnix returns the pseudo-Unix time (seconds since Jan 1 1970 *LOCAL TIME*)
-// denoted by the system date+time d in the given year.
-// It is up to the caller to convert this local time into a UTC-based time.
-func pseudoUnix(year int, d *syscall.Systemtime) int64 {
-	// Windows specifies daylight savings information in "day in month" format:
-	// d.Month is month number (1-12)
-	// d.DayOfWeek is appropriate weekday (Sunday=0 to Saturday=6)
-	// d.Day is week within the month (1 to 5, where 5 is last week of the month)
-	// d.Hour, d.Minute and d.Second are absolute time
-	day := 1
-	t := Date(year, Month(d.Month), day, int(d.Hour), int(d.Minute), int(d.Second), 0, UTC)
-	i := int(d.DayOfWeek) - int(t.Weekday())
-	if i < 0 {
-		i += 7
-	}
-	day += i
-	if week := int(d.Day) - 1; week < 4 {
-		day += week * 7
-	} else {
-		// "Last" instance of the day.
-		day += 4 * 7
-		if day > daysIn(Month(d.Month), year) {
-			day -= 7
-		}
-	}
-	return t.sec + int64(day-1)*secondsPerDay + internalToUnix
-}
-
-func initLocalFromTZI(i *syscall.Timezoneinformation) {
-	l := &localLoc
-
-	nzone := 1
-	if i.StandardDate.Month > 0 {
-		nzone++
-	}
-	l.zone = make([]zone, nzone)
-
-	stdname, dstname := abbrev(i)
-
-	std := &l.zone[0]
-	std.name = stdname
-	if nzone == 1 {
-		// No daylight savings.
-		std.offset = -int(i.Bias) * 60
-		l.cacheStart = alpha
-		l.cacheEnd = omega
-		l.cacheZone = std
-		l.tx = make([]zoneTrans, 1)
-		l.tx[0].when = l.cacheStart
-		l.tx[0].index = 0
-		return
-	}
-
-	// StandardBias must be ignored if StandardDate is not set,
-	// so this computation is delayed until after the nzone==1
-	// return above.
-	std.offset = -int(i.Bias+i.StandardBias) * 60
-
-	dst := &l.zone[1]
-	dst.name = dstname
-	dst.offset = -int(i.Bias+i.DaylightBias) * 60
-	dst.isDST = true
-
-	// Arrange so that d0 is first transition date, d1 second,
-	// i0 is index of zone after first transition, i1 second.
-	d0 := &i.StandardDate
-	d1 := &i.DaylightDate
-	i0 := 0
-	i1 := 1
-	if d0.Month > d1.Month {
-		d0, d1 = d1, d0
-		i0, i1 = i1, i0
-	}
-
-	// 2 tx per year, 100 years on each side of this year
-	l.tx = make([]zoneTrans, 400)
-
-	t := Now().UTC()
-	year := t.Year()
-	txi := 0
-	for y := year - 100; y < year+100; y++ {
-		tx := &l.tx[txi]
-		tx.when = pseudoUnix(y, d0) - int64(l.zone[i1].offset)
-		tx.index = uint8(i0)
-		txi++
-
-		tx = &l.tx[txi]
-		tx.when = pseudoUnix(y, d1) - int64(l.zone[i0].offset)
-		tx.index = uint8(i1)
-		txi++
-	}
-}
-
-var usPacific = syscall.Timezoneinformation{
-	Bias: 8 * 60,
-	StandardName: [32]uint16{
-		'P', 'a', 'c', 'i', 'f', 'i', 'c', ' ', 'S', 't', 'a', 'n', 'd', 'a', 'r', 'd', ' ', 'T', 'i', 'm', 'e',
-	},
-	StandardDate: syscall.Systemtime{Month: 11, Day: 1, Hour: 2},
-	DaylightName: [32]uint16{
-		'P', 'a', 'c', 'i', 'f', 'i', 'c', ' ', 'D', 'a', 'y', 'l', 'i', 'g', 'h', 't', ' ', 'T', 'i', 'm', 'e',
-	},
-	DaylightDate: syscall.Systemtime{Month: 3, Day: 2, Hour: 2},
-	DaylightBias: -60,
-}
-
-var aus = syscall.Timezoneinformation{
-	Bias: -10 * 60,
-	StandardName: [32]uint16{
-		'A', 'U', 'S', ' ', 'E', 'a', 's', 't', 'e', 'r', 'n', ' ', 'S', 't', 'a', 'n', 'd', 'a', 'r', 'd', ' ', 'T', 'i', 'm', 'e',
-	},
-	StandardDate: syscall.Systemtime{Month: 4, Day: 1, Hour: 3},
-	DaylightName: [32]uint16{
-		'A', 'U', 'S', ' ', 'E', 'a', 's', 't', 'e', 'r', 'n', ' ', 'D', 'a', 'y', 'l', 'i', 'g', 'h', 't', ' ', 'T', 'i', 'm', 'e',
-	},
-	DaylightDate: syscall.Systemtime{Month: 10, Day: 1, Hour: 2},
-	DaylightBias: -60,
-}
-
-func initTestingZone() {
-	initLocalFromTZI(&usPacific)
-}
-
-func initAusTestingZone() {
-	initLocalFromTZI(&aus)
-}
-
-func initLocal() {
-	var i syscall.Timezoneinformation
-	if _, err := syscall.GetTimeZoneInformation(&i); err != nil {
-		localLoc.name = "UTC"
-		return
-	}
-	initLocalFromTZI(&i)
-}
-
-func loadLocation(name string) (*Location, error) {
-	z, err := loadZoneFile(runtime.GOROOT()+`\lib\time\zoneinfo.zip`, name)
-	if err != nil {
-		return nil, err
-	}
-	z.name = name
-	return z, nil
-}
-
-func forceZipFileForTesting(zipOnly bool) {
-	// We only use the zip file anyway.
-}
diff --git a/third_party/gofrontend/libgo/go/unicode/casetables.go b/third_party/gofrontend/libgo/go/unicode/casetables.go
deleted file mode 100644
index 29bf167..0000000
--- a/third_party/gofrontend/libgo/go/unicode/casetables.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// TODO: This file contains the special casing rules for Turkish and Azeri only.
-// It should encompass all the languages with special casing rules
-// and be generated automatically, but that requires some API
-// development first.
-
-package unicode
-
-var TurkishCase SpecialCase = _TurkishCase
-var _TurkishCase = SpecialCase{
-	CaseRange{0x0049, 0x0049, d{0, 0x131 - 0x49, 0}},
-	CaseRange{0x0069, 0x0069, d{0x130 - 0x69, 0, 0x130 - 0x69}},
-	CaseRange{0x0130, 0x0130, d{0, 0x69 - 0x130, 0}},
-	CaseRange{0x0131, 0x0131, d{0x49 - 0x131, 0, 0x49 - 0x131}},
-}
-
-var AzeriCase SpecialCase = _TurkishCase
diff --git a/third_party/gofrontend/libgo/go/unicode/digit.go b/third_party/gofrontend/libgo/go/unicode/digit.go
deleted file mode 100644
index 53171b3..0000000
--- a/third_party/gofrontend/libgo/go/unicode/digit.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package unicode
-
-// IsDigit reports whether the rune is a decimal digit.
-func IsDigit(r rune) bool {
-	if r <= MaxLatin1 {
-		return '0' <= r && r <= '9'
-	}
-	return isExcludingLatin(Digit, r)
-}
diff --git a/third_party/gofrontend/libgo/go/unicode/digit_test.go b/third_party/gofrontend/libgo/go/unicode/digit_test.go
deleted file mode 100644
index 551c42a..0000000
--- a/third_party/gofrontend/libgo/go/unicode/digit_test.go
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package unicode_test
-
-import (
-	"testing"
-	. "unicode"
-)
-
-var testDigit = []rune{
-	0x0030,
-	0x0039,
-	0x0661,
-	0x06F1,
-	0x07C9,
-	0x0966,
-	0x09EF,
-	0x0A66,
-	0x0AEF,
-	0x0B66,
-	0x0B6F,
-	0x0BE6,
-	0x0BEF,
-	0x0C66,
-	0x0CEF,
-	0x0D66,
-	0x0D6F,
-	0x0E50,
-	0x0E59,
-	0x0ED0,
-	0x0ED9,
-	0x0F20,
-	0x0F29,
-	0x1040,
-	0x1049,
-	0x1090,
-	0x1091,
-	0x1099,
-	0x17E0,
-	0x17E9,
-	0x1810,
-	0x1819,
-	0x1946,
-	0x194F,
-	0x19D0,
-	0x19D9,
-	0x1B50,
-	0x1B59,
-	0x1BB0,
-	0x1BB9,
-	0x1C40,
-	0x1C49,
-	0x1C50,
-	0x1C59,
-	0xA620,
-	0xA629,
-	0xA8D0,
-	0xA8D9,
-	0xA900,
-	0xA909,
-	0xAA50,
-	0xAA59,
-	0xFF10,
-	0xFF19,
-	0x104A1,
-	0x1D7CE,
-}
-
-var testLetter = []rune{
-	0x0041,
-	0x0061,
-	0x00AA,
-	0x00BA,
-	0x00C8,
-	0x00DB,
-	0x00F9,
-	0x02EC,
-	0x0535,
-	0x06E6,
-	0x093D,
-	0x0A15,
-	0x0B99,
-	0x0DC0,
-	0x0EDD,
-	0x1000,
-	0x1200,
-	0x1312,
-	0x1401,
-	0x1885,
-	0x2C00,
-	0xA800,
-	0xF900,
-	0xFA30,
-	0xFFDA,
-	0xFFDC,
-	0x10000,
-	0x10300,
-	0x10400,
-	0x20000,
-	0x2F800,
-	0x2FA1D,
-}
-
-func TestDigit(t *testing.T) {
-	for _, r := range testDigit {
-		if !IsDigit(r) {
-			t.Errorf("IsDigit(U+%04X) = false, want true", r)
-		}
-	}
-	for _, r := range testLetter {
-		if IsDigit(r) {
-			t.Errorf("IsDigit(U+%04X) = true, want false", r)
-		}
-	}
-}
-
-// Test that the special case in IsDigit agrees with the table
-func TestDigitOptimization(t *testing.T) {
-	for i := rune(0); i <= MaxLatin1; i++ {
-		if Is(Digit, i) != IsDigit(i) {
-			t.Errorf("IsDigit(U+%04X) disagrees with Is(Digit)", i)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/unicode/graphic.go b/third_party/gofrontend/libgo/go/unicode/graphic.go
deleted file mode 100644
index 81eae3e..0000000
--- a/third_party/gofrontend/libgo/go/unicode/graphic.go
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package unicode
-
-// Bit masks for each code point under U+0100, for fast lookup.
-const (
-	pC     = 1 << iota // a control character.
-	pP                 // a punctuation character.
-	pN                 // a numeral.
-	pS                 // a symbolic character.
-	pZ                 // a spacing character.
-	pLu                // an upper-case letter.
-	pLl                // a lower-case letter.
-	pp                 // a printable character according to Go's definition.
-	pg     = pp | pZ   // a graphical character according to the Unicode definition.
-	pLo    = pLl | pLu // a letter that is neither upper nor lower case.
-	pLmask = pLo
-)
-
-// GraphicRanges defines the set of graphic characters according to Unicode.
-var GraphicRanges = []*RangeTable{
-	L, M, N, P, S, Zs,
-}
-
-// PrintRanges defines the set of printable characters according to Go.
-// ASCII space, U+0020, is handled separately.
-var PrintRanges = []*RangeTable{
-	L, M, N, P, S,
-}
-
-// IsGraphic reports whether the rune is defined as a Graphic by Unicode.
-// Such characters include letters, marks, numbers, punctuation, symbols, and
-// spaces, from categories L, M, N, P, S, Zs.
-func IsGraphic(r rune) bool {
-	// We convert to uint32 to avoid the extra test for negative,
-	// and in the index we convert to uint8 to avoid the range check.
-	if uint32(r) <= MaxLatin1 {
-		return properties[uint8(r)]&pg != 0
-	}
-	return In(r, GraphicRanges...)
-}
-
-// IsPrint reports whether the rune is defined as printable by Go. Such
-// characters include letters, marks, numbers, punctuation, symbols, and the
-// ASCII space character, from categories L, M, N, P, S and the ASCII space
-// character.  This categorization is the same as IsGraphic except that the
-// only spacing character is ASCII space, U+0020.
-func IsPrint(r rune) bool {
-	if uint32(r) <= MaxLatin1 {
-		return properties[uint8(r)]&pp != 0
-	}
-	return In(r, PrintRanges...)
-}
-
-// IsOneOf reports whether the rune is a member of one of the ranges.
-// The function "In" provides a nicer signature and should be used in preference to IsOneOf.
-func IsOneOf(ranges []*RangeTable, r rune) bool {
-	for _, inside := range ranges {
-		if Is(inside, r) {
-			return true
-		}
-	}
-	return false
-}
-
-// In reports whether the rune is a member of one of the ranges.
-func In(r rune, ranges ...*RangeTable) bool {
-	for _, inside := range ranges {
-		if Is(inside, r) {
-			return true
-		}
-	}
-	return false
-}
-
-// IsControl reports whether the rune is a control character.
-// The C (Other) Unicode category includes more code points
-// such as surrogates; use Is(C, r) to test for them.
-func IsControl(r rune) bool {
-	if uint32(r) <= MaxLatin1 {
-		return properties[uint8(r)]&pC != 0
-	}
-	// All control characters are < MaxLatin1.
-	return false
-}
-
-// IsLetter reports whether the rune is a letter (category L).
-func IsLetter(r rune) bool {
-	if uint32(r) <= MaxLatin1 {
-		return properties[uint8(r)]&(pLmask) != 0
-	}
-	return isExcludingLatin(Letter, r)
-}
-
-// IsMark reports whether the rune is a mark character (category M).
-func IsMark(r rune) bool {
-	// There are no mark characters in Latin-1.
-	return isExcludingLatin(Mark, r)
-}
-
-// IsNumber reports whether the rune is a number (category N).
-func IsNumber(r rune) bool {
-	if uint32(r) <= MaxLatin1 {
-		return properties[uint8(r)]&pN != 0
-	}
-	return isExcludingLatin(Number, r)
-}
-
-// IsPunct reports whether the rune is a Unicode punctuation character
-// (category P).
-func IsPunct(r rune) bool {
-	if uint32(r) <= MaxLatin1 {
-		return properties[uint8(r)]&pP != 0
-	}
-	return Is(Punct, r)
-}
-
-// IsSpace reports whether the rune is a space character as defined
-// by Unicode's White Space property; in the Latin-1 space
-// this is
-//	'\t', '\n', '\v', '\f', '\r', ' ', U+0085 (NEL), U+00A0 (NBSP).
-// Other definitions of spacing characters are set by category
-// Z and property Pattern_White_Space.
-func IsSpace(r rune) bool {
-	// This property isn't the same as Z; special-case it.
-	if uint32(r) <= MaxLatin1 {
-		switch r {
-		case '\t', '\n', '\v', '\f', '\r', ' ', 0x85, 0xA0:
-			return true
-		}
-		return false
-	}
-	return isExcludingLatin(White_Space, r)
-}
-
-// IsSymbol reports whether the rune is a symbolic character.
-func IsSymbol(r rune) bool {
-	if uint32(r) <= MaxLatin1 {
-		return properties[uint8(r)]&pS != 0
-	}
-	return isExcludingLatin(Symbol, r)
-}
diff --git a/third_party/gofrontend/libgo/go/unicode/graphic_test.go b/third_party/gofrontend/libgo/go/unicode/graphic_test.go
deleted file mode 100644
index c9f289c..0000000
--- a/third_party/gofrontend/libgo/go/unicode/graphic_test.go
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package unicode_test
-
-import (
-	"testing"
-	. "unicode"
-)
-
-// Independently check that the special "Is" functions work
-// in the Latin-1 range through the property table.
-
-func TestIsControlLatin1(t *testing.T) {
-	for i := rune(0); i <= MaxLatin1; i++ {
-		got := IsControl(i)
-		want := false
-		switch {
-		case 0x00 <= i && i <= 0x1F:
-			want = true
-		case 0x7F <= i && i <= 0x9F:
-			want = true
-		}
-		if got != want {
-			t.Errorf("%U incorrect: got %t; want %t", i, got, want)
-		}
-	}
-}
-
-func TestIsLetterLatin1(t *testing.T) {
-	for i := rune(0); i <= MaxLatin1; i++ {
-		got := IsLetter(i)
-		want := Is(Letter, i)
-		if got != want {
-			t.Errorf("%U incorrect: got %t; want %t", i, got, want)
-		}
-	}
-}
-
-func TestIsUpperLatin1(t *testing.T) {
-	for i := rune(0); i <= MaxLatin1; i++ {
-		got := IsUpper(i)
-		want := Is(Upper, i)
-		if got != want {
-			t.Errorf("%U incorrect: got %t; want %t", i, got, want)
-		}
-	}
-}
-
-func TestIsLowerLatin1(t *testing.T) {
-	for i := rune(0); i <= MaxLatin1; i++ {
-		got := IsLower(i)
-		want := Is(Lower, i)
-		if got != want {
-			t.Errorf("%U incorrect: got %t; want %t", i, got, want)
-		}
-	}
-}
-
-func TestNumberLatin1(t *testing.T) {
-	for i := rune(0); i <= MaxLatin1; i++ {
-		got := IsNumber(i)
-		want := Is(Number, i)
-		if got != want {
-			t.Errorf("%U incorrect: got %t; want %t", i, got, want)
-		}
-	}
-}
-
-func TestIsPrintLatin1(t *testing.T) {
-	for i := rune(0); i <= MaxLatin1; i++ {
-		got := IsPrint(i)
-		want := In(i, PrintRanges...)
-		if i == ' ' {
-			want = true
-		}
-		if got != want {
-			t.Errorf("%U incorrect: got %t; want %t", i, got, want)
-		}
-	}
-}
-
-func TestIsGraphicLatin1(t *testing.T) {
-	for i := rune(0); i <= MaxLatin1; i++ {
-		got := IsGraphic(i)
-		want := In(i, GraphicRanges...)
-		if got != want {
-			t.Errorf("%U incorrect: got %t; want %t", i, got, want)
-		}
-	}
-}
-
-func TestIsPunctLatin1(t *testing.T) {
-	for i := rune(0); i <= MaxLatin1; i++ {
-		got := IsPunct(i)
-		want := Is(Punct, i)
-		if got != want {
-			t.Errorf("%U incorrect: got %t; want %t", i, got, want)
-		}
-	}
-}
-
-func TestIsSpaceLatin1(t *testing.T) {
-	for i := rune(0); i <= MaxLatin1; i++ {
-		got := IsSpace(i)
-		want := Is(White_Space, i)
-		if got != want {
-			t.Errorf("%U incorrect: got %t; want %t", i, got, want)
-		}
-	}
-}
-
-func TestIsSymbolLatin1(t *testing.T) {
-	for i := rune(0); i <= MaxLatin1; i++ {
-		got := IsSymbol(i)
-		want := Is(Symbol, i)
-		if got != want {
-			t.Errorf("%U incorrect: got %t; want %t", i, got, want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/unicode/letter.go b/third_party/gofrontend/libgo/go/unicode/letter.go
deleted file mode 100644
index 7fe4241..0000000
--- a/third_party/gofrontend/libgo/go/unicode/letter.go
+++ /dev/null
@@ -1,357 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package unicode provides data and functions to test some properties of
-// Unicode code points.
-package unicode
-
-// Tables are regenerated each time we update the Unicode version.
-//go:generate go run maketables.go -tables=all -output tables.go
-
-const (
-	MaxRune         = '\U0010FFFF' // Maximum valid Unicode code point.
-	ReplacementChar = '\uFFFD'     // Represents invalid code points.
-	MaxASCII        = '\u007F'     // maximum ASCII value.
-	MaxLatin1       = '\u00FF'     // maximum Latin-1 value.
-)
-
-// RangeTable defines a set of Unicode code points by listing the ranges of
-// code points within the set. The ranges are listed in two slices
-// to save space: a slice of 16-bit ranges and a slice of 32-bit ranges.
-// The two slices must be in sorted order and non-overlapping.
-// Also, R32 should contain only values >= 0x10000 (1<<16).
-type RangeTable struct {
-	R16         []Range16
-	R32         []Range32
-	LatinOffset int // number of entries in R16 with Hi <= MaxLatin1
-}
-
-// Range16 represents of a range of 16-bit Unicode code points.  The range runs from Lo to Hi
-// inclusive and has the specified stride.
-type Range16 struct {
-	Lo     uint16
-	Hi     uint16
-	Stride uint16
-}
-
-// Range32 represents of a range of Unicode code points and is used when one or
-// more of the values will not fit in 16 bits.  The range runs from Lo to Hi
-// inclusive and has the specified stride. Lo and Hi must always be >= 1<<16.
-type Range32 struct {
-	Lo     uint32
-	Hi     uint32
-	Stride uint32
-}
-
-// CaseRange represents a range of Unicode code points for simple (one
-// code point to one code point) case conversion.
-// The range runs from Lo to Hi inclusive, with a fixed stride of 1.  Deltas
-// are the number to add to the code point to reach the code point for a
-// different case for that character.  They may be negative.  If zero, it
-// means the character is in the corresponding case. There is a special
-// case representing sequences of alternating corresponding Upper and Lower
-// pairs.  It appears with a fixed Delta of
-//	{UpperLower, UpperLower, UpperLower}
-// The constant UpperLower has an otherwise impossible delta value.
-type CaseRange struct {
-	Lo    uint32
-	Hi    uint32
-	Delta d
-}
-
-// SpecialCase represents language-specific case mappings such as Turkish.
-// Methods of SpecialCase customize (by overriding) the standard mappings.
-type SpecialCase []CaseRange
-
-// BUG(r): There is no mechanism for full case folding, that is, for
-// characters that involve multiple runes in the input or output.
-
-// Indices into the Delta arrays inside CaseRanges for case mapping.
-const (
-	UpperCase = iota
-	LowerCase
-	TitleCase
-	MaxCase
-)
-
-type d [MaxCase]rune // to make the CaseRanges text shorter
-
-// If the Delta field of a CaseRange is UpperLower, it means
-// this CaseRange represents a sequence of the form (say)
-// Upper Lower Upper Lower.
-const (
-	UpperLower = MaxRune + 1 // (Cannot be a valid delta.)
-)
-
-// linearMax is the maximum size table for linear search for non-Latin1 rune.
-// Derived by running 'go test -calibrate'.
-const linearMax = 18
-
-// is16 reports whether r is in the sorted slice of 16-bit ranges.
-func is16(ranges []Range16, r uint16) bool {
-	if len(ranges) <= linearMax || r <= MaxLatin1 {
-		for i := range ranges {
-			range_ := &ranges[i]
-			if r < range_.Lo {
-				return false
-			}
-			if r <= range_.Hi {
-				return (r-range_.Lo)%range_.Stride == 0
-			}
-		}
-		return false
-	}
-
-	// binary search over ranges
-	lo := 0
-	hi := len(ranges)
-	for lo < hi {
-		m := lo + (hi-lo)/2
-		range_ := &ranges[m]
-		if range_.Lo <= r && r <= range_.Hi {
-			return (r-range_.Lo)%range_.Stride == 0
-		}
-		if r < range_.Lo {
-			hi = m
-		} else {
-			lo = m + 1
-		}
-	}
-	return false
-}
-
-// is32 reports whether r is in the sorted slice of 32-bit ranges.
-func is32(ranges []Range32, r uint32) bool {
-	if len(ranges) <= linearMax {
-		for i := range ranges {
-			range_ := &ranges[i]
-			if r < range_.Lo {
-				return false
-			}
-			if r <= range_.Hi {
-				return (r-range_.Lo)%range_.Stride == 0
-			}
-		}
-		return false
-	}
-
-	// binary search over ranges
-	lo := 0
-	hi := len(ranges)
-	for lo < hi {
-		m := lo + (hi-lo)/2
-		range_ := ranges[m]
-		if range_.Lo <= r && r <= range_.Hi {
-			return (r-range_.Lo)%range_.Stride == 0
-		}
-		if r < range_.Lo {
-			hi = m
-		} else {
-			lo = m + 1
-		}
-	}
-	return false
-}
-
-// Is reports whether the rune is in the specified table of ranges.
-func Is(rangeTab *RangeTable, r rune) bool {
-	r16 := rangeTab.R16
-	if len(r16) > 0 && r <= rune(r16[len(r16)-1].Hi) {
-		return is16(r16, uint16(r))
-	}
-	r32 := rangeTab.R32
-	if len(r32) > 0 && r >= rune(r32[0].Lo) {
-		return is32(r32, uint32(r))
-	}
-	return false
-}
-
-func isExcludingLatin(rangeTab *RangeTable, r rune) bool {
-	r16 := rangeTab.R16
-	if off := rangeTab.LatinOffset; len(r16) > off && r <= rune(r16[len(r16)-1].Hi) {
-		return is16(r16[off:], uint16(r))
-	}
-	r32 := rangeTab.R32
-	if len(r32) > 0 && r >= rune(r32[0].Lo) {
-		return is32(r32, uint32(r))
-	}
-	return false
-}
-
-// IsUpper reports whether the rune is an upper case letter.
-func IsUpper(r rune) bool {
-	// See comment in IsGraphic.
-	if uint32(r) <= MaxLatin1 {
-		return properties[uint8(r)]&pLmask == pLu
-	}
-	return isExcludingLatin(Upper, r)
-}
-
-// IsLower reports whether the rune is a lower case letter.
-func IsLower(r rune) bool {
-	// See comment in IsGraphic.
-	if uint32(r) <= MaxLatin1 {
-		return properties[uint8(r)]&pLmask == pLl
-	}
-	return isExcludingLatin(Lower, r)
-}
-
-// IsTitle reports whether the rune is a title case letter.
-func IsTitle(r rune) bool {
-	if r <= MaxLatin1 {
-		return false
-	}
-	return isExcludingLatin(Title, r)
-}
-
-// to maps the rune using the specified case mapping.
-func to(_case int, r rune, caseRange []CaseRange) rune {
-	if _case < 0 || MaxCase <= _case {
-		return ReplacementChar // as reasonable an error as any
-	}
-	// binary search over ranges
-	lo := 0
-	hi := len(caseRange)
-	for lo < hi {
-		m := lo + (hi-lo)/2
-		cr := caseRange[m]
-		if rune(cr.Lo) <= r && r <= rune(cr.Hi) {
-			delta := rune(cr.Delta[_case])
-			if delta > MaxRune {
-				// In an Upper-Lower sequence, which always starts with
-				// an UpperCase letter, the real deltas always look like:
-				//	{0, 1, 0}    UpperCase (Lower is next)
-				//	{-1, 0, -1}  LowerCase (Upper, Title are previous)
-				// The characters at even offsets from the beginning of the
-				// sequence are upper case; the ones at odd offsets are lower.
-				// The correct mapping can be done by clearing or setting the low
-				// bit in the sequence offset.
-				// The constants UpperCase and TitleCase are even while LowerCase
-				// is odd so we take the low bit from _case.
-				return rune(cr.Lo) + ((r-rune(cr.Lo))&^1 | rune(_case&1))
-			}
-			return r + delta
-		}
-		if r < rune(cr.Lo) {
-			hi = m
-		} else {
-			lo = m + 1
-		}
-	}
-	return r
-}
-
-// To maps the rune to the specified case: UpperCase, LowerCase, or TitleCase.
-func To(_case int, r rune) rune {
-	return to(_case, r, CaseRanges)
-}
-
-// ToUpper maps the rune to upper case.
-func ToUpper(r rune) rune {
-	if r <= MaxASCII {
-		if 'a' <= r && r <= 'z' {
-			r -= 'a' - 'A'
-		}
-		return r
-	}
-	return To(UpperCase, r)
-}
-
-// ToLower maps the rune to lower case.
-func ToLower(r rune) rune {
-	if r <= MaxASCII {
-		if 'A' <= r && r <= 'Z' {
-			r += 'a' - 'A'
-		}
-		return r
-	}
-	return To(LowerCase, r)
-}
-
-// ToTitle maps the rune to title case.
-func ToTitle(r rune) rune {
-	if r <= MaxASCII {
-		if 'a' <= r && r <= 'z' { // title case is upper case for ASCII
-			r -= 'a' - 'A'
-		}
-		return r
-	}
-	return To(TitleCase, r)
-}
-
-// ToUpper maps the rune to upper case giving priority to the special mapping.
-func (special SpecialCase) ToUpper(r rune) rune {
-	r1 := to(UpperCase, r, []CaseRange(special))
-	if r1 == r {
-		r1 = ToUpper(r)
-	}
-	return r1
-}
-
-// ToTitle maps the rune to title case giving priority to the special mapping.
-func (special SpecialCase) ToTitle(r rune) rune {
-	r1 := to(TitleCase, r, []CaseRange(special))
-	if r1 == r {
-		r1 = ToTitle(r)
-	}
-	return r1
-}
-
-// ToLower maps the rune to lower case giving priority to the special mapping.
-func (special SpecialCase) ToLower(r rune) rune {
-	r1 := to(LowerCase, r, []CaseRange(special))
-	if r1 == r {
-		r1 = ToLower(r)
-	}
-	return r1
-}
-
-// caseOrbit is defined in tables.go as []foldPair.  Right now all the
-// entries fit in uint16, so use uint16.  If that changes, compilation
-// will fail (the constants in the composite literal will not fit in uint16)
-// and the types here can change to uint32.
-type foldPair struct {
-	From uint16
-	To   uint16
-}
-
-// SimpleFold iterates over Unicode code points equivalent under
-// the Unicode-defined simple case folding.  Among the code points
-// equivalent to rune (including rune itself), SimpleFold returns the
-// smallest rune > r if one exists, or else the smallest rune >= 0.
-//
-// For example:
-//	SimpleFold('A') = 'a'
-//	SimpleFold('a') = 'A'
-//
-//	SimpleFold('K') = 'k'
-//	SimpleFold('k') = '\u212A' (Kelvin symbol, K)
-//	SimpleFold('\u212A') = 'K'
-//
-//	SimpleFold('1') = '1'
-//
-func SimpleFold(r rune) rune {
-	// Consult caseOrbit table for special cases.
-	lo := 0
-	hi := len(caseOrbit)
-	for lo < hi {
-		m := lo + (hi-lo)/2
-		if rune(caseOrbit[m].From) < r {
-			lo = m + 1
-		} else {
-			hi = m
-		}
-	}
-	if lo < len(caseOrbit) && rune(caseOrbit[lo].From) == r {
-		return rune(caseOrbit[lo].To)
-	}
-
-	// No folding specified.  This is a one- or two-element
-	// equivalence class containing rune and ToLower(rune)
-	// and ToUpper(rune) if they are different from rune.
-	if l := ToLower(r); l != r {
-		return l
-	}
-	return ToUpper(r)
-}
diff --git a/third_party/gofrontend/libgo/go/unicode/letter_test.go b/third_party/gofrontend/libgo/go/unicode/letter_test.go
deleted file mode 100644
index a40b412..0000000
--- a/third_party/gofrontend/libgo/go/unicode/letter_test.go
+++ /dev/null
@@ -1,549 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package unicode_test
-
-import (
-	"flag"
-	"fmt"
-	"runtime"
-	"sort"
-	"testing"
-	. "unicode"
-)
-
-var upperTest = []rune{
-	0x41,
-	0xc0,
-	0xd8,
-	0x100,
-	0x139,
-	0x14a,
-	0x178,
-	0x181,
-	0x376,
-	0x3cf,
-	0x13bd,
-	0x1f2a,
-	0x2102,
-	0x2c00,
-	0x2c10,
-	0x2c20,
-	0xa650,
-	0xa722,
-	0xff3a,
-	0x10400,
-	0x1d400,
-	0x1d7ca,
-}
-
-var notupperTest = []rune{
-	0x40,
-	0x5b,
-	0x61,
-	0x185,
-	0x1b0,
-	0x377,
-	0x387,
-	0x2150,
-	0xab7d,
-	0xffff,
-	0x10000,
-}
-
-var letterTest = []rune{
-	0x41,
-	0x61,
-	0xaa,
-	0xba,
-	0xc8,
-	0xdb,
-	0xf9,
-	0x2ec,
-	0x535,
-	0x620,
-	0x6e6,
-	0x93d,
-	0xa15,
-	0xb99,
-	0xdc0,
-	0xedd,
-	0x1000,
-	0x1200,
-	0x1312,
-	0x1401,
-	0x1885,
-	0x2c00,
-	0xa800,
-	0xf900,
-	0xfa30,
-	0xffda,
-	0xffdc,
-	0x10000,
-	0x10300,
-	0x10400,
-	0x20000,
-	0x2f800,
-	0x2fa1d,
-}
-
-var notletterTest = []rune{
-	0x20,
-	0x35,
-	0x375,
-	0x619,
-	0x700,
-	0xfffe,
-	0x1ffff,
-	0x10ffff,
-}
-
-// Contains all the special cased Latin-1 chars.
-var spaceTest = []rune{
-	0x09,
-	0x0a,
-	0x0b,
-	0x0c,
-	0x0d,
-	0x20,
-	0x85,
-	0xA0,
-	0x2000,
-	0x3000,
-}
-
-type caseT struct {
-	cas     int
-	in, out rune
-}
-
-var caseTest = []caseT{
-	// errors
-	{-1, '\n', 0xFFFD},
-	{UpperCase, -1, -1},
-	{UpperCase, 1 << 30, 1 << 30},
-
-	// ASCII (special-cased so test carefully)
-	{UpperCase, '\n', '\n'},
-	{UpperCase, 'a', 'A'},
-	{UpperCase, 'A', 'A'},
-	{UpperCase, '7', '7'},
-	{LowerCase, '\n', '\n'},
-	{LowerCase, 'a', 'a'},
-	{LowerCase, 'A', 'a'},
-	{LowerCase, '7', '7'},
-	{TitleCase, '\n', '\n'},
-	{TitleCase, 'a', 'A'},
-	{TitleCase, 'A', 'A'},
-	{TitleCase, '7', '7'},
-
-	// Latin-1: easy to read the tests!
-	{UpperCase, 0x80, 0x80},
-	{UpperCase, 'Å', 'Å'},
-	{UpperCase, 'å', 'Å'},
-	{LowerCase, 0x80, 0x80},
-	{LowerCase, 'Å', 'å'},
-	{LowerCase, 'å', 'å'},
-	{TitleCase, 0x80, 0x80},
-	{TitleCase, 'Å', 'Å'},
-	{TitleCase, 'å', 'Å'},
-
-	// 0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049
-	{UpperCase, 0x0131, 'I'},
-	{LowerCase, 0x0131, 0x0131},
-	{TitleCase, 0x0131, 'I'},
-
-	// 0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132
-	{UpperCase, 0x0133, 0x0132},
-	{LowerCase, 0x0133, 0x0133},
-	{TitleCase, 0x0133, 0x0132},
-
-	// 212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B;
-	{UpperCase, 0x212A, 0x212A},
-	{LowerCase, 0x212A, 'k'},
-	{TitleCase, 0x212A, 0x212A},
-
-	// From an UpperLower sequence
-	// A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641;
-	{UpperCase, 0xA640, 0xA640},
-	{LowerCase, 0xA640, 0xA641},
-	{TitleCase, 0xA640, 0xA640},
-	// A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640
-	{UpperCase, 0xA641, 0xA640},
-	{LowerCase, 0xA641, 0xA641},
-	{TitleCase, 0xA641, 0xA640},
-	// A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F;
-	{UpperCase, 0xA64E, 0xA64E},
-	{LowerCase, 0xA64E, 0xA64F},
-	{TitleCase, 0xA64E, 0xA64E},
-	// A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E
-	{UpperCase, 0xA65F, 0xA65E},
-	{LowerCase, 0xA65F, 0xA65F},
-	{TitleCase, 0xA65F, 0xA65E},
-
-	// From another UpperLower sequence
-	// 0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A;
-	{UpperCase, 0x0139, 0x0139},
-	{LowerCase, 0x0139, 0x013A},
-	{TitleCase, 0x0139, 0x0139},
-	// 013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140;
-	{UpperCase, 0x013f, 0x013f},
-	{LowerCase, 0x013f, 0x0140},
-	{TitleCase, 0x013f, 0x013f},
-	// 0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147
-	{UpperCase, 0x0148, 0x0147},
-	{LowerCase, 0x0148, 0x0148},
-	{TitleCase, 0x0148, 0x0147},
-
-	// Lowercase lower than uppercase.
-	// AB78;CHEROKEE SMALL LETTER GE;Ll;0;L;;;;;N;;;13A8;;13A8
-	{UpperCase, 0xab78, 0x13a8},
-	{LowerCase, 0xab78, 0xab78},
-	{TitleCase, 0xab78, 0x13a8},
-	{UpperCase, 0x13a8, 0x13a8},
-	{LowerCase, 0x13a8, 0xab78},
-	{TitleCase, 0x13a8, 0x13a8},
-
-	// Last block in the 5.1.0 table
-	// 10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428;
-	{UpperCase, 0x10400, 0x10400},
-	{LowerCase, 0x10400, 0x10428},
-	{TitleCase, 0x10400, 0x10400},
-	// 10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F;
-	{UpperCase, 0x10427, 0x10427},
-	{LowerCase, 0x10427, 0x1044F},
-	{TitleCase, 0x10427, 0x10427},
-	// 10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400
-	{UpperCase, 0x10428, 0x10400},
-	{LowerCase, 0x10428, 0x10428},
-	{TitleCase, 0x10428, 0x10400},
-	// 1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427
-	{UpperCase, 0x1044F, 0x10427},
-	{LowerCase, 0x1044F, 0x1044F},
-	{TitleCase, 0x1044F, 0x10427},
-
-	// First one not in the 5.1.0 table
-	// 10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;;
-	{UpperCase, 0x10450, 0x10450},
-	{LowerCase, 0x10450, 0x10450},
-	{TitleCase, 0x10450, 0x10450},
-
-	// Non-letters with case.
-	{LowerCase, 0x2161, 0x2171},
-	{UpperCase, 0x0345, 0x0399},
-}
-
-func TestIsLetter(t *testing.T) {
-	for _, r := range upperTest {
-		if !IsLetter(r) {
-			t.Errorf("IsLetter(U+%04X) = false, want true", r)
-		}
-	}
-	for _, r := range letterTest {
-		if !IsLetter(r) {
-			t.Errorf("IsLetter(U+%04X) = false, want true", r)
-		}
-	}
-	for _, r := range notletterTest {
-		if IsLetter(r) {
-			t.Errorf("IsLetter(U+%04X) = true, want false", r)
-		}
-	}
-}
-
-func TestIsUpper(t *testing.T) {
-	for _, r := range upperTest {
-		if !IsUpper(r) {
-			t.Errorf("IsUpper(U+%04X) = false, want true", r)
-		}
-	}
-	for _, r := range notupperTest {
-		if IsUpper(r) {
-			t.Errorf("IsUpper(U+%04X) = true, want false", r)
-		}
-	}
-	for _, r := range notletterTest {
-		if IsUpper(r) {
-			t.Errorf("IsUpper(U+%04X) = true, want false", r)
-		}
-	}
-}
-
-func caseString(c int) string {
-	switch c {
-	case UpperCase:
-		return "UpperCase"
-	case LowerCase:
-		return "LowerCase"
-	case TitleCase:
-		return "TitleCase"
-	}
-	return "ErrorCase"
-}
-
-func TestTo(t *testing.T) {
-	for _, c := range caseTest {
-		r := To(c.cas, c.in)
-		if c.out != r {
-			t.Errorf("To(U+%04X, %s) = U+%04X want U+%04X", c.in, caseString(c.cas), r, c.out)
-		}
-	}
-}
-
-func TestToUpperCase(t *testing.T) {
-	for _, c := range caseTest {
-		if c.cas != UpperCase {
-			continue
-		}
-		r := ToUpper(c.in)
-		if c.out != r {
-			t.Errorf("ToUpper(U+%04X) = U+%04X want U+%04X", c.in, r, c.out)
-		}
-	}
-}
-
-func TestToLowerCase(t *testing.T) {
-	for _, c := range caseTest {
-		if c.cas != LowerCase {
-			continue
-		}
-		r := ToLower(c.in)
-		if c.out != r {
-			t.Errorf("ToLower(U+%04X) = U+%04X want U+%04X", c.in, r, c.out)
-		}
-	}
-}
-
-func TestToTitleCase(t *testing.T) {
-	for _, c := range caseTest {
-		if c.cas != TitleCase {
-			continue
-		}
-		r := ToTitle(c.in)
-		if c.out != r {
-			t.Errorf("ToTitle(U+%04X) = U+%04X want U+%04X", c.in, r, c.out)
-		}
-	}
-}
-
-func TestIsSpace(t *testing.T) {
-	for _, c := range spaceTest {
-		if !IsSpace(c) {
-			t.Errorf("IsSpace(U+%04X) = false; want true", c)
-		}
-	}
-	for _, c := range letterTest {
-		if IsSpace(c) {
-			t.Errorf("IsSpace(U+%04X) = true; want false", c)
-		}
-	}
-}
-
-// Check that the optimizations for IsLetter etc. agree with the tables.
-// We only need to check the Latin-1 range.
-func TestLetterOptimizations(t *testing.T) {
-	for i := rune(0); i <= MaxLatin1; i++ {
-		if Is(Letter, i) != IsLetter(i) {
-			t.Errorf("IsLetter(U+%04X) disagrees with Is(Letter)", i)
-		}
-		if Is(Upper, i) != IsUpper(i) {
-			t.Errorf("IsUpper(U+%04X) disagrees with Is(Upper)", i)
-		}
-		if Is(Lower, i) != IsLower(i) {
-			t.Errorf("IsLower(U+%04X) disagrees with Is(Lower)", i)
-		}
-		if Is(Title, i) != IsTitle(i) {
-			t.Errorf("IsTitle(U+%04X) disagrees with Is(Title)", i)
-		}
-		if Is(White_Space, i) != IsSpace(i) {
-			t.Errorf("IsSpace(U+%04X) disagrees with Is(White_Space)", i)
-		}
-		if To(UpperCase, i) != ToUpper(i) {
-			t.Errorf("ToUpper(U+%04X) disagrees with To(Upper)", i)
-		}
-		if To(LowerCase, i) != ToLower(i) {
-			t.Errorf("ToLower(U+%04X) disagrees with To(Lower)", i)
-		}
-		if To(TitleCase, i) != ToTitle(i) {
-			t.Errorf("ToTitle(U+%04X) disagrees with To(Title)", i)
-		}
-	}
-}
-
-func TestTurkishCase(t *testing.T) {
-	lower := []rune("abcçdefgğhıijklmnoöprsştuüvyz")
-	upper := []rune("ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ")
-	for i, l := range lower {
-		u := upper[i]
-		if TurkishCase.ToLower(l) != l {
-			t.Errorf("lower(U+%04X) is U+%04X not U+%04X", l, TurkishCase.ToLower(l), l)
-		}
-		if TurkishCase.ToUpper(u) != u {
-			t.Errorf("upper(U+%04X) is U+%04X not U+%04X", u, TurkishCase.ToUpper(u), u)
-		}
-		if TurkishCase.ToUpper(l) != u {
-			t.Errorf("upper(U+%04X) is U+%04X not U+%04X", l, TurkishCase.ToUpper(l), u)
-		}
-		if TurkishCase.ToLower(u) != l {
-			t.Errorf("lower(U+%04X) is U+%04X not U+%04X", u, TurkishCase.ToLower(l), l)
-		}
-		if TurkishCase.ToTitle(u) != u {
-			t.Errorf("title(U+%04X) is U+%04X not U+%04X", u, TurkishCase.ToTitle(u), u)
-		}
-		if TurkishCase.ToTitle(l) != u {
-			t.Errorf("title(U+%04X) is U+%04X not U+%04X", l, TurkishCase.ToTitle(l), u)
-		}
-	}
-}
-
-var simpleFoldTests = []string{
-	// SimpleFold(x) returns the next equivalent rune > x or wraps
-	// around to smaller values.
-
-	// Easy cases.
-	"Aa",
-	"δΔ",
-
-	// ASCII special cases.
-	"KkK",
-	"Ssſ",
-
-	// Non-ASCII special cases.
-	"ρϱΡ",
-	"ͅΙιι",
-
-	// Extra special cases: has lower/upper but no case fold.
-	"İ",
-	"ı",
-
-	// Upper comes before lower (Cherokee).
-	"\u13b0\uab80",
-}
-
-func TestSimpleFold(t *testing.T) {
-	for _, tt := range simpleFoldTests {
-		cycle := []rune(tt)
-		r := cycle[len(cycle)-1]
-		for _, out := range cycle {
-			if r := SimpleFold(r); r != out {
-				t.Errorf("SimpleFold(%#U) = %#U, want %#U", r, r, out)
-			}
-			r = out
-		}
-	}
-}
-
-// Running 'go test -calibrate' runs the calibration to find a plausible
-// cutoff point for linear search of a range list vs. binary search.
-// We create a fake table and then time how long it takes to do a
-// sequence of searches within that table, for all possible inputs
-// relative to the ranges (something before all, in each, between each, after all).
-// This assumes that all possible runes are equally likely.
-// In practice most runes are ASCII so this is a conservative estimate
-// of an effective cutoff value. In practice we could probably set it higher
-// than what this function recommends.
-
-var calibrate = flag.Bool("calibrate", false, "compute crossover for linear vs. binary search")
-
-func TestCalibrate(t *testing.T) {
-	if !*calibrate {
-		return
-	}
-
-	if runtime.GOARCH == "amd64" {
-		fmt.Printf("warning: running calibration on %s\n", runtime.GOARCH)
-	}
-
-	// Find the point where binary search wins by more than 10%.
-	// The 10% bias gives linear search an edge when they're close,
-	// because on predominantly ASCII inputs linear search is even
-	// better than our benchmarks measure.
-	n := sort.Search(64, func(n int) bool {
-		tab := fakeTable(n)
-		blinear := func(b *testing.B) {
-			tab := tab
-			max := n*5 + 20
-			for i := 0; i < b.N; i++ {
-				for j := 0; j <= max; j++ {
-					linear(tab, uint16(j))
-				}
-			}
-		}
-		bbinary := func(b *testing.B) {
-			tab := tab
-			max := n*5 + 20
-			for i := 0; i < b.N; i++ {
-				for j := 0; j <= max; j++ {
-					binary(tab, uint16(j))
-				}
-			}
-		}
-		bmlinear := testing.Benchmark(blinear)
-		bmbinary := testing.Benchmark(bbinary)
-		fmt.Printf("n=%d: linear=%d binary=%d\n", n, bmlinear.NsPerOp(), bmbinary.NsPerOp())
-		return bmlinear.NsPerOp()*100 > bmbinary.NsPerOp()*110
-	})
-	fmt.Printf("calibration: linear cutoff = %d\n", n)
-}
-
-func fakeTable(n int) []Range16 {
-	var r16 []Range16
-	for i := 0; i < n; i++ {
-		r16 = append(r16, Range16{uint16(i*5 + 10), uint16(i*5 + 12), 1})
-	}
-	return r16
-}
-
-func linear(ranges []Range16, r uint16) bool {
-	for i := range ranges {
-		range_ := &ranges[i]
-		if r < range_.Lo {
-			return false
-		}
-		if r <= range_.Hi {
-			return (r-range_.Lo)%range_.Stride == 0
-		}
-	}
-	return false
-}
-
-func binary(ranges []Range16, r uint16) bool {
-	// binary search over ranges
-	lo := 0
-	hi := len(ranges)
-	for lo < hi {
-		m := lo + (hi-lo)/2
-		range_ := &ranges[m]
-		if range_.Lo <= r && r <= range_.Hi {
-			return (r-range_.Lo)%range_.Stride == 0
-		}
-		if r < range_.Lo {
-			hi = m
-		} else {
-			lo = m + 1
-		}
-	}
-	return false
-}
-
-func TestLatinOffset(t *testing.T) {
-	var maps = []map[string]*RangeTable{
-		Categories,
-		FoldCategory,
-		FoldScript,
-		Properties,
-		Scripts,
-	}
-	for _, m := range maps {
-		for name, tab := range m {
-			i := 0
-			for i < len(tab.R16) && tab.R16[i].Hi <= MaxLatin1 {
-				i++
-			}
-			if tab.LatinOffset != i {
-				t.Errorf("%s: LatinOffset=%d, want %d", name, tab.LatinOffset, i)
-			}
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/unicode/script_test.go b/third_party/gofrontend/libgo/go/unicode/script_test.go
deleted file mode 100644
index 935c225..0000000
--- a/third_party/gofrontend/libgo/go/unicode/script_test.go
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package unicode_test
-
-import (
-	"testing"
-	. "unicode"
-)
-
-type T struct {
-	rune   rune
-	script string
-}
-
-// Hand-chosen tests from Unicode 5.1.0, 6.0.0, 6.2.0, 6.3.0, 7.0.0 and 8.0.0
-// mostly to discover when new scripts and categories arise.
-var inTest = []T{
-	{0x11711, "Ahom"},
-	{0x14646, "Anatolian_Hieroglyphs"},
-	{0x06e2, "Arabic"},
-	{0x0567, "Armenian"},
-	{0x10b20, "Avestan"},
-	{0x1b37, "Balinese"},
-	{0xa6af, "Bamum"},
-	{0x16ada, "Bassa_Vah"},
-	{0x1be1, "Batak"},
-	{0x09c2, "Bengali"},
-	{0x3115, "Bopomofo"},
-	{0x282d, "Braille"},
-	{0x1a1a, "Buginese"},
-	{0x1747, "Buhid"},
-	{0x11011, "Brahmi"},
-	{0x156d, "Canadian_Aboriginal"},
-	{0x102a9, "Carian"},
-	{0x10563, "Caucasian_Albanian"},
-	{0x11111, "Chakma"},
-	{0xaa4d, "Cham"},
-	{0x13c2, "Cherokee"},
-	{0x0020, "Common"},
-	{0x1d4a5, "Common"},
-	{0x2cfc, "Coptic"},
-	{0x12420, "Cuneiform"},
-	{0x1080c, "Cypriot"},
-	{0xa663, "Cyrillic"},
-	{0x10430, "Deseret"},
-	{0x094a, "Devanagari"},
-	{0x1BC00, "Duployan"},
-	{0x13001, "Egyptian_Hieroglyphs"},
-	{0x10500, "Elbasan"},
-	{0x1271, "Ethiopic"},
-	{0x10fc, "Georgian"},
-	{0x2c40, "Glagolitic"},
-	{0x10347, "Gothic"},
-	{0x11303, "Grantha"},
-	{0x03ae, "Greek"},
-	{0x0abf, "Gujarati"},
-	{0x0a24, "Gurmukhi"},
-	{0x3028, "Han"},
-	{0x11b8, "Hangul"},
-	{0x1727, "Hanunoo"},
-	{0x108FF, "Hatran"},
-	{0x05a0, "Hebrew"},
-	{0x3058, "Hiragana"},
-	{0x10841, "Imperial_Aramaic"},
-	{0x20e6, "Inherited"},
-	{0x10b70, "Inscriptional_Pahlavi"},
-	{0x10b5a, "Inscriptional_Parthian"},
-	{0xa9d0, "Javanese"},
-	{0x1109f, "Kaithi"},
-	{0x0cbd, "Kannada"},
-	{0x30a6, "Katakana"},
-	{0xa928, "Kayah_Li"},
-	{0x10a11, "Kharoshthi"},
-	{0x17c6, "Khmer"},
-	{0x11211, "Khojki"},
-	{0x112df, "Khudawadi"},
-	{0x0eaa, "Lao"},
-	{0x1d79, "Latin"},
-	{0x1c10, "Lepcha"},
-	{0x1930, "Limbu"},
-	{0x10755, "Linear_A"},
-	{0x1003c, "Linear_B"},
-	{0xa4e1, "Lisu"},
-	{0x10290, "Lycian"},
-	{0x10930, "Lydian"},
-	{0x11173, "Mahajani"},
-	{0x0d42, "Malayalam"},
-	{0x0843, "Mandaic"},
-	{0x10ac8, "Manichaean"},
-	{0xabd0, "Meetei_Mayek"},
-	{0x1e800, "Mende_Kikakui"},
-	{0x1099f, "Meroitic_Hieroglyphs"},
-	{0x109a0, "Meroitic_Cursive"},
-	{0x16f00, "Miao"},
-	{0x11611, "Modi"},
-	{0x1822, "Mongolian"},
-	{0x16a60, "Mro"},
-	{0x11293, "Multani"},
-	{0x104c, "Myanmar"},
-	{0x10880, "Nabataean"},
-	{0x19c3, "New_Tai_Lue"},
-	{0x07f8, "Nko"},
-	{0x169b, "Ogham"},
-	{0x1c6a, "Ol_Chiki"},
-	{0x10C80, "Old_Hungarian"},
-	{0x10310, "Old_Italic"},
-	{0x10a80, "Old_North_Arabian"},
-	{0x10350, "Old_Permic"},
-	{0x103c9, "Old_Persian"},
-	{0x10a6f, "Old_South_Arabian"},
-	{0x10c20, "Old_Turkic"},
-	{0x0b3e, "Oriya"},
-	{0x10491, "Osmanya"},
-	{0x16b2b, "Pahawh_Hmong"},
-	{0x10876, "Palmyrene"},
-	{0x11ACE, "Pau_Cin_Hau"},
-	{0xa860, "Phags_Pa"},
-	{0x10918, "Phoenician"},
-	{0x10baf, "Psalter_Pahlavi"},
-	{0xa949, "Rejang"},
-	{0x16c0, "Runic"},
-	{0x081d, "Samaritan"},
-	{0xa892, "Saurashtra"},
-	{0x111a0, "Sharada"},
-	{0x10463, "Shavian"},
-	{0x115c1, "Siddham"},
-	{0x1D920, "SignWriting"},
-	{0x0dbd, "Sinhala"},
-	{0x110d0, "Sora_Sompeng"},
-	{0x1ba3, "Sundanese"},
-	{0xa803, "Syloti_Nagri"},
-	{0x070f, "Syriac"},
-	{0x170f, "Tagalog"},
-	{0x176f, "Tagbanwa"},
-	{0x1972, "Tai_Le"},
-	{0x1a62, "Tai_Tham"},
-	{0xaadc, "Tai_Viet"},
-	{0x116c9, "Takri"},
-	{0x0bbf, "Tamil"},
-	{0x0c55, "Telugu"},
-	{0x07a7, "Thaana"},
-	{0x0e46, "Thai"},
-	{0x0f36, "Tibetan"},
-	{0x2d55, "Tifinagh"},
-	{0x114d9, "Tirhuta"},
-	{0x10388, "Ugaritic"},
-	{0xa60e, "Vai"},
-	{0x118ff, "Warang_Citi"},
-	{0xa216, "Yi"},
-}
-
-var outTest = []T{ // not really worth being thorough
-	{0x20, "Telugu"},
-}
-
-var inCategoryTest = []T{
-	{0x0081, "Cc"},
-	{0x200B, "Cf"},
-	{0xf0000, "Co"},
-	{0xdb80, "Cs"},
-	{0x0236, "Ll"},
-	{0x1d9d, "Lm"},
-	{0x07cf, "Lo"},
-	{0x1f8a, "Lt"},
-	{0x03ff, "Lu"},
-	{0x0bc1, "Mc"},
-	{0x20df, "Me"},
-	{0x07f0, "Mn"},
-	{0x1bb2, "Nd"},
-	{0x10147, "Nl"},
-	{0x2478, "No"},
-	{0xfe33, "Pc"},
-	{0x2011, "Pd"},
-	{0x301e, "Pe"},
-	{0x2e03, "Pf"},
-	{0x2e02, "Pi"},
-	{0x0022, "Po"},
-	{0x2770, "Ps"},
-	{0x00a4, "Sc"},
-	{0xa711, "Sk"},
-	{0x25f9, "Sm"},
-	{0x2108, "So"},
-	{0x2028, "Zl"},
-	{0x2029, "Zp"},
-	{0x202f, "Zs"},
-	// Unifieds.
-	{0x04aa, "L"},
-	{0x0009, "C"},
-	{0x1712, "M"},
-	{0x0031, "N"},
-	{0x00bb, "P"},
-	{0x00a2, "S"},
-	{0x00a0, "Z"},
-}
-
-var inPropTest = []T{
-	{0x0046, "ASCII_Hex_Digit"},
-	{0x200F, "Bidi_Control"},
-	{0x2212, "Dash"},
-	{0xE0001, "Deprecated"},
-	{0x00B7, "Diacritic"},
-	{0x30FE, "Extender"},
-	{0xFF46, "Hex_Digit"},
-	{0x2E17, "Hyphen"},
-	{0x2FFB, "IDS_Binary_Operator"},
-	{0x2FF3, "IDS_Trinary_Operator"},
-	{0xFA6A, "Ideographic"},
-	{0x200D, "Join_Control"},
-	{0x0EC4, "Logical_Order_Exception"},
-	{0x2FFFF, "Noncharacter_Code_Point"},
-	{0x065E, "Other_Alphabetic"},
-	{0x2065, "Other_Default_Ignorable_Code_Point"},
-	{0x0BD7, "Other_Grapheme_Extend"},
-	{0x0387, "Other_ID_Continue"},
-	{0x212E, "Other_ID_Start"},
-	{0x2094, "Other_Lowercase"},
-	{0x2040, "Other_Math"},
-	{0x216F, "Other_Uppercase"},
-	{0x0027, "Pattern_Syntax"},
-	{0x0020, "Pattern_White_Space"},
-	{0x300D, "Quotation_Mark"},
-	{0x2EF3, "Radical"},
-	{0x061F, "STerm"},
-	{0x2071, "Soft_Dotted"},
-	{0x003A, "Terminal_Punctuation"},
-	{0x9FC3, "Unified_Ideograph"},
-	{0xFE0F, "Variation_Selector"},
-	{0x0020, "White_Space"},
-}
-
-func TestScripts(t *testing.T) {
-	notTested := make(map[string]bool)
-	for k := range Scripts {
-		notTested[k] = true
-	}
-	for _, test := range inTest {
-		if _, ok := Scripts[test.script]; !ok {
-			t.Fatal(test.script, "not a known script")
-		}
-		if !Is(Scripts[test.script], test.rune) {
-			t.Errorf("IsScript(%U, %s) = false, want true", test.rune, test.script)
-		}
-		delete(notTested, test.script)
-	}
-	for _, test := range outTest {
-		if Is(Scripts[test.script], test.rune) {
-			t.Errorf("IsScript(%U, %s) = true, want false", test.rune, test.script)
-		}
-	}
-	for k := range notTested {
-		t.Error("script not tested:", k)
-	}
-}
-
-func TestCategories(t *testing.T) {
-	notTested := make(map[string]bool)
-	for k := range Categories {
-		notTested[k] = true
-	}
-	for _, test := range inCategoryTest {
-		if _, ok := Categories[test.script]; !ok {
-			t.Fatal(test.script, "not a known category")
-		}
-		if !Is(Categories[test.script], test.rune) {
-			t.Errorf("IsCategory(%U, %s) = false, want true", test.rune, test.script)
-		}
-		delete(notTested, test.script)
-	}
-	for k := range notTested {
-		t.Error("category not tested:", k)
-	}
-}
-
-func TestProperties(t *testing.T) {
-	notTested := make(map[string]bool)
-	for k := range Properties {
-		notTested[k] = true
-	}
-	for _, test := range inPropTest {
-		if _, ok := Properties[test.script]; !ok {
-			t.Fatal(test.script, "not a known prop")
-		}
-		if !Is(Properties[test.script], test.rune) {
-			t.Errorf("IsCategory(%U, %s) = false, want true", test.rune, test.script)
-		}
-		delete(notTested, test.script)
-	}
-	for k := range notTested {
-		t.Error("property not tested:", k)
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/unicode/tables.go b/third_party/gofrontend/libgo/go/unicode/tables.go
deleted file mode 100644
index 370a9d1..0000000
--- a/third_party/gofrontend/libgo/go/unicode/tables.go
+++ /dev/null
@@ -1,7207 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Generated by running
-//	maketables --tables=all --data=http://www.unicode.org/Public/8.0.0/ucd/UnicodeData.txt --casefolding=http://www.unicode.org/Public/8.0.0/ucd/CaseFolding.txt
-// DO NOT EDIT
-
-package unicode
-
-// Version is the Unicode edition from which the tables are derived.
-const Version = "8.0.0"
-
-// Categories is the set of Unicode category tables.
-var Categories = map[string]*RangeTable{
-	"C":  C,
-	"Cc": Cc,
-	"Cf": Cf,
-	"Co": Co,
-	"Cs": Cs,
-	"L":  L,
-	"Ll": Ll,
-	"Lm": Lm,
-	"Lo": Lo,
-	"Lt": Lt,
-	"Lu": Lu,
-	"M":  M,
-	"Mc": Mc,
-	"Me": Me,
-	"Mn": Mn,
-	"N":  N,
-	"Nd": Nd,
-	"Nl": Nl,
-	"No": No,
-	"P":  P,
-	"Pc": Pc,
-	"Pd": Pd,
-	"Pe": Pe,
-	"Pf": Pf,
-	"Pi": Pi,
-	"Po": Po,
-	"Ps": Ps,
-	"S":  S,
-	"Sc": Sc,
-	"Sk": Sk,
-	"Sm": Sm,
-	"So": So,
-	"Z":  Z,
-	"Zl": Zl,
-	"Zp": Zp,
-	"Zs": Zs,
-}
-
-var _C = &RangeTable{
-	R16: []Range16{
-		{0x0001, 0x001f, 1},
-		{0x007f, 0x009f, 1},
-		{0x00ad, 0x0600, 1363},
-		{0x0601, 0x0605, 1},
-		{0x061c, 0x06dd, 193},
-		{0x070f, 0x180e, 4351},
-		{0x200b, 0x200f, 1},
-		{0x202a, 0x202e, 1},
-		{0x2060, 0x2064, 1},
-		{0x2066, 0x206f, 1},
-		{0xd800, 0xf8ff, 1},
-		{0xfeff, 0xfff9, 250},
-		{0xfffa, 0xfffb, 1},
-	},
-	R32: []Range32{
-		{0x110bd, 0x1bca0, 44003},
-		{0x1bca1, 0x1bca3, 1},
-		{0x1d173, 0x1d17a, 1},
-		{0xe0001, 0xe0020, 31},
-		{0xe0021, 0xe007f, 1},
-		{0xf0000, 0xffffd, 1},
-		{0x100000, 0x10fffd, 1},
-	},
-	LatinOffset: 2,
-}
-
-var _Cc = &RangeTable{
-	R16: []Range16{
-		{0x0001, 0x001f, 1},
-		{0x007f, 0x009f, 1},
-	},
-	LatinOffset: 2,
-}
-
-var _Cf = &RangeTable{
-	R16: []Range16{
-		{0x00ad, 0x0600, 1363},
-		{0x0601, 0x0605, 1},
-		{0x061c, 0x06dd, 193},
-		{0x070f, 0x180e, 4351},
-		{0x200b, 0x200f, 1},
-		{0x202a, 0x202e, 1},
-		{0x2060, 0x2064, 1},
-		{0x2066, 0x206f, 1},
-		{0xfeff, 0xfff9, 250},
-		{0xfffa, 0xfffb, 1},
-	},
-	R32: []Range32{
-		{0x110bd, 0x1bca0, 44003},
-		{0x1bca1, 0x1bca3, 1},
-		{0x1d173, 0x1d17a, 1},
-		{0xe0001, 0xe0020, 31},
-		{0xe0021, 0xe007f, 1},
-	},
-}
-
-var _Co = &RangeTable{
-	R16: []Range16{
-		{0xe000, 0xf8ff, 1},
-	},
-	R32: []Range32{
-		{0xf0000, 0xffffd, 1},
-		{0x100000, 0x10fffd, 1},
-	},
-}
-
-var _Cs = &RangeTable{
-	R16: []Range16{
-		{0xd800, 0xdfff, 1},
-	},
-}
-
-var _L = &RangeTable{
-	R16: []Range16{
-		{0x0041, 0x005a, 1},
-		{0x0061, 0x007a, 1},
-		{0x00aa, 0x00b5, 11},
-		{0x00ba, 0x00c0, 6},
-		{0x00c1, 0x00d6, 1},
-		{0x00d8, 0x00f6, 1},
-		{0x00f8, 0x02c1, 1},
-		{0x02c6, 0x02d1, 1},
-		{0x02e0, 0x02e4, 1},
-		{0x02ec, 0x02ee, 2},
-		{0x0370, 0x0374, 1},
-		{0x0376, 0x0377, 1},
-		{0x037a, 0x037d, 1},
-		{0x037f, 0x0386, 7},
-		{0x0388, 0x038a, 1},
-		{0x038c, 0x038e, 2},
-		{0x038f, 0x03a1, 1},
-		{0x03a3, 0x03f5, 1},
-		{0x03f7, 0x0481, 1},
-		{0x048a, 0x052f, 1},
-		{0x0531, 0x0556, 1},
-		{0x0559, 0x0561, 8},
-		{0x0562, 0x0587, 1},
-		{0x05d0, 0x05ea, 1},
-		{0x05f0, 0x05f2, 1},
-		{0x0620, 0x064a, 1},
-		{0x066e, 0x066f, 1},
-		{0x0671, 0x06d3, 1},
-		{0x06d5, 0x06e5, 16},
-		{0x06e6, 0x06ee, 8},
-		{0x06ef, 0x06fa, 11},
-		{0x06fb, 0x06fc, 1},
-		{0x06ff, 0x0710, 17},
-		{0x0712, 0x072f, 1},
-		{0x074d, 0x07a5, 1},
-		{0x07b1, 0x07ca, 25},
-		{0x07cb, 0x07ea, 1},
-		{0x07f4, 0x07f5, 1},
-		{0x07fa, 0x0800, 6},
-		{0x0801, 0x0815, 1},
-		{0x081a, 0x0824, 10},
-		{0x0828, 0x0840, 24},
-		{0x0841, 0x0858, 1},
-		{0x08a0, 0x08b4, 1},
-		{0x0904, 0x0939, 1},
-		{0x093d, 0x0950, 19},
-		{0x0958, 0x0961, 1},
-		{0x0971, 0x0980, 1},
-		{0x0985, 0x098c, 1},
-		{0x098f, 0x0990, 1},
-		{0x0993, 0x09a8, 1},
-		{0x09aa, 0x09b0, 1},
-		{0x09b2, 0x09b6, 4},
-		{0x09b7, 0x09b9, 1},
-		{0x09bd, 0x09ce, 17},
-		{0x09dc, 0x09dd, 1},
-		{0x09df, 0x09e1, 1},
-		{0x09f0, 0x09f1, 1},
-		{0x0a05, 0x0a0a, 1},
-		{0x0a0f, 0x0a10, 1},
-		{0x0a13, 0x0a28, 1},
-		{0x0a2a, 0x0a30, 1},
-		{0x0a32, 0x0a33, 1},
-		{0x0a35, 0x0a36, 1},
-		{0x0a38, 0x0a39, 1},
-		{0x0a59, 0x0a5c, 1},
-		{0x0a5e, 0x0a72, 20},
-		{0x0a73, 0x0a74, 1},
-		{0x0a85, 0x0a8d, 1},
-		{0x0a8f, 0x0a91, 1},
-		{0x0a93, 0x0aa8, 1},
-		{0x0aaa, 0x0ab0, 1},
-		{0x0ab2, 0x0ab3, 1},
-		{0x0ab5, 0x0ab9, 1},
-		{0x0abd, 0x0ad0, 19},
-		{0x0ae0, 0x0ae1, 1},
-		{0x0af9, 0x0b05, 12},
-		{0x0b06, 0x0b0c, 1},
-		{0x0b0f, 0x0b10, 1},
-		{0x0b13, 0x0b28, 1},
-		{0x0b2a, 0x0b30, 1},
-		{0x0b32, 0x0b33, 1},
-		{0x0b35, 0x0b39, 1},
-		{0x0b3d, 0x0b5c, 31},
-		{0x0b5d, 0x0b5f, 2},
-		{0x0b60, 0x0b61, 1},
-		{0x0b71, 0x0b83, 18},
-		{0x0b85, 0x0b8a, 1},
-		{0x0b8e, 0x0b90, 1},
-		{0x0b92, 0x0b95, 1},
-		{0x0b99, 0x0b9a, 1},
-		{0x0b9c, 0x0b9e, 2},
-		{0x0b9f, 0x0ba3, 4},
-		{0x0ba4, 0x0ba8, 4},
-		{0x0ba9, 0x0baa, 1},
-		{0x0bae, 0x0bb9, 1},
-		{0x0bd0, 0x0c05, 53},
-		{0x0c06, 0x0c0c, 1},
-		{0x0c0e, 0x0c10, 1},
-		{0x0c12, 0x0c28, 1},
-		{0x0c2a, 0x0c39, 1},
-		{0x0c3d, 0x0c58, 27},
-		{0x0c59, 0x0c5a, 1},
-		{0x0c60, 0x0c61, 1},
-		{0x0c85, 0x0c8c, 1},
-		{0x0c8e, 0x0c90, 1},
-		{0x0c92, 0x0ca8, 1},
-		{0x0caa, 0x0cb3, 1},
-		{0x0cb5, 0x0cb9, 1},
-		{0x0cbd, 0x0cde, 33},
-		{0x0ce0, 0x0ce1, 1},
-		{0x0cf1, 0x0cf2, 1},
-		{0x0d05, 0x0d0c, 1},
-		{0x0d0e, 0x0d10, 1},
-		{0x0d12, 0x0d3a, 1},
-		{0x0d3d, 0x0d5f, 17},
-		{0x0d60, 0x0d61, 1},
-		{0x0d7a, 0x0d7f, 1},
-		{0x0d85, 0x0d96, 1},
-		{0x0d9a, 0x0db1, 1},
-		{0x0db3, 0x0dbb, 1},
-		{0x0dbd, 0x0dc0, 3},
-		{0x0dc1, 0x0dc6, 1},
-		{0x0e01, 0x0e30, 1},
-		{0x0e32, 0x0e33, 1},
-		{0x0e40, 0x0e46, 1},
-		{0x0e81, 0x0e82, 1},
-		{0x0e84, 0x0e87, 3},
-		{0x0e88, 0x0e8a, 2},
-		{0x0e8d, 0x0e94, 7},
-		{0x0e95, 0x0e97, 1},
-		{0x0e99, 0x0e9f, 1},
-		{0x0ea1, 0x0ea3, 1},
-		{0x0ea5, 0x0ea7, 2},
-		{0x0eaa, 0x0eab, 1},
-		{0x0ead, 0x0eb0, 1},
-		{0x0eb2, 0x0eb3, 1},
-		{0x0ebd, 0x0ec0, 3},
-		{0x0ec1, 0x0ec4, 1},
-		{0x0ec6, 0x0edc, 22},
-		{0x0edd, 0x0edf, 1},
-		{0x0f00, 0x0f40, 64},
-		{0x0f41, 0x0f47, 1},
-		{0x0f49, 0x0f6c, 1},
-		{0x0f88, 0x0f8c, 1},
-		{0x1000, 0x102a, 1},
-		{0x103f, 0x1050, 17},
-		{0x1051, 0x1055, 1},
-		{0x105a, 0x105d, 1},
-		{0x1061, 0x1065, 4},
-		{0x1066, 0x106e, 8},
-		{0x106f, 0x1070, 1},
-		{0x1075, 0x1081, 1},
-		{0x108e, 0x10a0, 18},
-		{0x10a1, 0x10c5, 1},
-		{0x10c7, 0x10cd, 6},
-		{0x10d0, 0x10fa, 1},
-		{0x10fc, 0x1248, 1},
-		{0x124a, 0x124d, 1},
-		{0x1250, 0x1256, 1},
-		{0x1258, 0x125a, 2},
-		{0x125b, 0x125d, 1},
-		{0x1260, 0x1288, 1},
-		{0x128a, 0x128d, 1},
-		{0x1290, 0x12b0, 1},
-		{0x12b2, 0x12b5, 1},
-		{0x12b8, 0x12be, 1},
-		{0x12c0, 0x12c2, 2},
-		{0x12c3, 0x12c5, 1},
-		{0x12c8, 0x12d6, 1},
-		{0x12d8, 0x1310, 1},
-		{0x1312, 0x1315, 1},
-		{0x1318, 0x135a, 1},
-		{0x1380, 0x138f, 1},
-		{0x13a0, 0x13f5, 1},
-		{0x13f8, 0x13fd, 1},
-		{0x1401, 0x166c, 1},
-		{0x166f, 0x167f, 1},
-		{0x1681, 0x169a, 1},
-		{0x16a0, 0x16ea, 1},
-		{0x16f1, 0x16f8, 1},
-		{0x1700, 0x170c, 1},
-		{0x170e, 0x1711, 1},
-		{0x1720, 0x1731, 1},
-		{0x1740, 0x1751, 1},
-		{0x1760, 0x176c, 1},
-		{0x176e, 0x1770, 1},
-		{0x1780, 0x17b3, 1},
-		{0x17d7, 0x17dc, 5},
-		{0x1820, 0x1877, 1},
-		{0x1880, 0x18a8, 1},
-		{0x18aa, 0x18b0, 6},
-		{0x18b1, 0x18f5, 1},
-		{0x1900, 0x191e, 1},
-		{0x1950, 0x196d, 1},
-		{0x1970, 0x1974, 1},
-		{0x1980, 0x19ab, 1},
-		{0x19b0, 0x19c9, 1},
-		{0x1a00, 0x1a16, 1},
-		{0x1a20, 0x1a54, 1},
-		{0x1aa7, 0x1b05, 94},
-		{0x1b06, 0x1b33, 1},
-		{0x1b45, 0x1b4b, 1},
-		{0x1b83, 0x1ba0, 1},
-		{0x1bae, 0x1baf, 1},
-		{0x1bba, 0x1be5, 1},
-		{0x1c00, 0x1c23, 1},
-		{0x1c4d, 0x1c4f, 1},
-		{0x1c5a, 0x1c7d, 1},
-		{0x1ce9, 0x1cec, 1},
-		{0x1cee, 0x1cf1, 1},
-		{0x1cf5, 0x1cf6, 1},
-		{0x1d00, 0x1dbf, 1},
-		{0x1e00, 0x1f15, 1},
-		{0x1f18, 0x1f1d, 1},
-		{0x1f20, 0x1f45, 1},
-		{0x1f48, 0x1f4d, 1},
-		{0x1f50, 0x1f57, 1},
-		{0x1f59, 0x1f5f, 2},
-		{0x1f60, 0x1f7d, 1},
-		{0x1f80, 0x1fb4, 1},
-		{0x1fb6, 0x1fbc, 1},
-		{0x1fbe, 0x1fc2, 4},
-		{0x1fc3, 0x1fc4, 1},
-		{0x1fc6, 0x1fcc, 1},
-		{0x1fd0, 0x1fd3, 1},
-		{0x1fd6, 0x1fdb, 1},
-		{0x1fe0, 0x1fec, 1},
-		{0x1ff2, 0x1ff4, 1},
-		{0x1ff6, 0x1ffc, 1},
-		{0x2071, 0x207f, 14},
-		{0x2090, 0x209c, 1},
-		{0x2102, 0x2107, 5},
-		{0x210a, 0x2113, 1},
-		{0x2115, 0x2119, 4},
-		{0x211a, 0x211d, 1},
-		{0x2124, 0x212a, 2},
-		{0x212b, 0x212d, 1},
-		{0x212f, 0x2139, 1},
-		{0x213c, 0x213f, 1},
-		{0x2145, 0x2149, 1},
-		{0x214e, 0x2183, 53},
-		{0x2184, 0x2c00, 2684},
-		{0x2c01, 0x2c2e, 1},
-		{0x2c30, 0x2c5e, 1},
-		{0x2c60, 0x2ce4, 1},
-		{0x2ceb, 0x2cee, 1},
-		{0x2cf2, 0x2cf3, 1},
-		{0x2d00, 0x2d25, 1},
-		{0x2d27, 0x2d2d, 6},
-		{0x2d30, 0x2d67, 1},
-		{0x2d6f, 0x2d80, 17},
-		{0x2d81, 0x2d96, 1},
-		{0x2da0, 0x2da6, 1},
-		{0x2da8, 0x2dae, 1},
-		{0x2db0, 0x2db6, 1},
-		{0x2db8, 0x2dbe, 1},
-		{0x2dc0, 0x2dc6, 1},
-		{0x2dc8, 0x2dce, 1},
-		{0x2dd0, 0x2dd6, 1},
-		{0x2dd8, 0x2dde, 1},
-		{0x2e2f, 0x3005, 470},
-		{0x3006, 0x3031, 43},
-		{0x3032, 0x3035, 1},
-		{0x303b, 0x303c, 1},
-		{0x3041, 0x3096, 1},
-		{0x309d, 0x309f, 1},
-		{0x30a1, 0x30fa, 1},
-		{0x30fc, 0x30ff, 1},
-		{0x3105, 0x312d, 1},
-		{0x3131, 0x318e, 1},
-		{0x31a0, 0x31ba, 1},
-		{0x31f0, 0x31ff, 1},
-		{0x3400, 0x4db5, 1},
-		{0x4e00, 0x9fd5, 1},
-		{0xa000, 0xa48c, 1},
-		{0xa4d0, 0xa4fd, 1},
-		{0xa500, 0xa60c, 1},
-		{0xa610, 0xa61f, 1},
-		{0xa62a, 0xa62b, 1},
-		{0xa640, 0xa66e, 1},
-		{0xa67f, 0xa69d, 1},
-		{0xa6a0, 0xa6e5, 1},
-		{0xa717, 0xa71f, 1},
-		{0xa722, 0xa788, 1},
-		{0xa78b, 0xa7ad, 1},
-		{0xa7b0, 0xa7b7, 1},
-		{0xa7f7, 0xa801, 1},
-		{0xa803, 0xa805, 1},
-		{0xa807, 0xa80a, 1},
-		{0xa80c, 0xa822, 1},
-		{0xa840, 0xa873, 1},
-		{0xa882, 0xa8b3, 1},
-		{0xa8f2, 0xa8f7, 1},
-		{0xa8fb, 0xa8fd, 2},
-		{0xa90a, 0xa925, 1},
-		{0xa930, 0xa946, 1},
-		{0xa960, 0xa97c, 1},
-		{0xa984, 0xa9b2, 1},
-		{0xa9cf, 0xa9e0, 17},
-		{0xa9e1, 0xa9e4, 1},
-		{0xa9e6, 0xa9ef, 1},
-		{0xa9fa, 0xa9fe, 1},
-		{0xaa00, 0xaa28, 1},
-		{0xaa40, 0xaa42, 1},
-		{0xaa44, 0xaa4b, 1},
-		{0xaa60, 0xaa76, 1},
-		{0xaa7a, 0xaa7e, 4},
-		{0xaa7f, 0xaaaf, 1},
-		{0xaab1, 0xaab5, 4},
-		{0xaab6, 0xaab9, 3},
-		{0xaaba, 0xaabd, 1},
-		{0xaac0, 0xaac2, 2},
-		{0xaadb, 0xaadd, 1},
-		{0xaae0, 0xaaea, 1},
-		{0xaaf2, 0xaaf4, 1},
-		{0xab01, 0xab06, 1},
-		{0xab09, 0xab0e, 1},
-		{0xab11, 0xab16, 1},
-		{0xab20, 0xab26, 1},
-		{0xab28, 0xab2e, 1},
-		{0xab30, 0xab5a, 1},
-		{0xab5c, 0xab65, 1},
-		{0xab70, 0xabe2, 1},
-		{0xac00, 0xd7a3, 1},
-		{0xd7b0, 0xd7c6, 1},
-		{0xd7cb, 0xd7fb, 1},
-		{0xf900, 0xfa6d, 1},
-		{0xfa70, 0xfad9, 1},
-		{0xfb00, 0xfb06, 1},
-		{0xfb13, 0xfb17, 1},
-		{0xfb1d, 0xfb1f, 2},
-		{0xfb20, 0xfb28, 1},
-		{0xfb2a, 0xfb36, 1},
-		{0xfb38, 0xfb3c, 1},
-		{0xfb3e, 0xfb40, 2},
-		{0xfb41, 0xfb43, 2},
-		{0xfb44, 0xfb46, 2},
-		{0xfb47, 0xfbb1, 1},
-		{0xfbd3, 0xfd3d, 1},
-		{0xfd50, 0xfd8f, 1},
-		{0xfd92, 0xfdc7, 1},
-		{0xfdf0, 0xfdfb, 1},
-		{0xfe70, 0xfe74, 1},
-		{0xfe76, 0xfefc, 1},
-		{0xff21, 0xff3a, 1},
-		{0xff41, 0xff5a, 1},
-		{0xff66, 0xffbe, 1},
-		{0xffc2, 0xffc7, 1},
-		{0xffca, 0xffcf, 1},
-		{0xffd2, 0xffd7, 1},
-		{0xffda, 0xffdc, 1},
-	},
-	R32: []Range32{
-		{0x10000, 0x1000b, 1},
-		{0x1000d, 0x10026, 1},
-		{0x10028, 0x1003a, 1},
-		{0x1003c, 0x1003d, 1},
-		{0x1003f, 0x1004d, 1},
-		{0x10050, 0x1005d, 1},
-		{0x10080, 0x100fa, 1},
-		{0x10280, 0x1029c, 1},
-		{0x102a0, 0x102d0, 1},
-		{0x10300, 0x1031f, 1},
-		{0x10330, 0x10340, 1},
-		{0x10342, 0x10349, 1},
-		{0x10350, 0x10375, 1},
-		{0x10380, 0x1039d, 1},
-		{0x103a0, 0x103c3, 1},
-		{0x103c8, 0x103cf, 1},
-		{0x10400, 0x1049d, 1},
-		{0x10500, 0x10527, 1},
-		{0x10530, 0x10563, 1},
-		{0x10600, 0x10736, 1},
-		{0x10740, 0x10755, 1},
-		{0x10760, 0x10767, 1},
-		{0x10800, 0x10805, 1},
-		{0x10808, 0x1080a, 2},
-		{0x1080b, 0x10835, 1},
-		{0x10837, 0x10838, 1},
-		{0x1083c, 0x1083f, 3},
-		{0x10840, 0x10855, 1},
-		{0x10860, 0x10876, 1},
-		{0x10880, 0x1089e, 1},
-		{0x108e0, 0x108f2, 1},
-		{0x108f4, 0x108f5, 1},
-		{0x10900, 0x10915, 1},
-		{0x10920, 0x10939, 1},
-		{0x10980, 0x109b7, 1},
-		{0x109be, 0x109bf, 1},
-		{0x10a00, 0x10a10, 16},
-		{0x10a11, 0x10a13, 1},
-		{0x10a15, 0x10a17, 1},
-		{0x10a19, 0x10a33, 1},
-		{0x10a60, 0x10a7c, 1},
-		{0x10a80, 0x10a9c, 1},
-		{0x10ac0, 0x10ac7, 1},
-		{0x10ac9, 0x10ae4, 1},
-		{0x10b00, 0x10b35, 1},
-		{0x10b40, 0x10b55, 1},
-		{0x10b60, 0x10b72, 1},
-		{0x10b80, 0x10b91, 1},
-		{0x10c00, 0x10c48, 1},
-		{0x10c80, 0x10cb2, 1},
-		{0x10cc0, 0x10cf2, 1},
-		{0x11003, 0x11037, 1},
-		{0x11083, 0x110af, 1},
-		{0x110d0, 0x110e8, 1},
-		{0x11103, 0x11126, 1},
-		{0x11150, 0x11172, 1},
-		{0x11176, 0x11183, 13},
-		{0x11184, 0x111b2, 1},
-		{0x111c1, 0x111c4, 1},
-		{0x111da, 0x111dc, 2},
-		{0x11200, 0x11211, 1},
-		{0x11213, 0x1122b, 1},
-		{0x11280, 0x11286, 1},
-		{0x11288, 0x1128a, 2},
-		{0x1128b, 0x1128d, 1},
-		{0x1128f, 0x1129d, 1},
-		{0x1129f, 0x112a8, 1},
-		{0x112b0, 0x112de, 1},
-		{0x11305, 0x1130c, 1},
-		{0x1130f, 0x11310, 1},
-		{0x11313, 0x11328, 1},
-		{0x1132a, 0x11330, 1},
-		{0x11332, 0x11333, 1},
-		{0x11335, 0x11339, 1},
-		{0x1133d, 0x11350, 19},
-		{0x1135d, 0x11361, 1},
-		{0x11480, 0x114af, 1},
-		{0x114c4, 0x114c5, 1},
-		{0x114c7, 0x11580, 185},
-		{0x11581, 0x115ae, 1},
-		{0x115d8, 0x115db, 1},
-		{0x11600, 0x1162f, 1},
-		{0x11644, 0x11680, 60},
-		{0x11681, 0x116aa, 1},
-		{0x11700, 0x11719, 1},
-		{0x118a0, 0x118df, 1},
-		{0x118ff, 0x11ac0, 449},
-		{0x11ac1, 0x11af8, 1},
-		{0x12000, 0x12399, 1},
-		{0x12480, 0x12543, 1},
-		{0x13000, 0x1342e, 1},
-		{0x14400, 0x14646, 1},
-		{0x16800, 0x16a38, 1},
-		{0x16a40, 0x16a5e, 1},
-		{0x16ad0, 0x16aed, 1},
-		{0x16b00, 0x16b2f, 1},
-		{0x16b40, 0x16b43, 1},
-		{0x16b63, 0x16b77, 1},
-		{0x16b7d, 0x16b8f, 1},
-		{0x16f00, 0x16f44, 1},
-		{0x16f50, 0x16f93, 67},
-		{0x16f94, 0x16f9f, 1},
-		{0x1b000, 0x1b001, 1},
-		{0x1bc00, 0x1bc6a, 1},
-		{0x1bc70, 0x1bc7c, 1},
-		{0x1bc80, 0x1bc88, 1},
-		{0x1bc90, 0x1bc99, 1},
-		{0x1d400, 0x1d454, 1},
-		{0x1d456, 0x1d49c, 1},
-		{0x1d49e, 0x1d49f, 1},
-		{0x1d4a2, 0x1d4a5, 3},
-		{0x1d4a6, 0x1d4a9, 3},
-		{0x1d4aa, 0x1d4ac, 1},
-		{0x1d4ae, 0x1d4b9, 1},
-		{0x1d4bb, 0x1d4bd, 2},
-		{0x1d4be, 0x1d4c3, 1},
-		{0x1d4c5, 0x1d505, 1},
-		{0x1d507, 0x1d50a, 1},
-		{0x1d50d, 0x1d514, 1},
-		{0x1d516, 0x1d51c, 1},
-		{0x1d51e, 0x1d539, 1},
-		{0x1d53b, 0x1d53e, 1},
-		{0x1d540, 0x1d544, 1},
-		{0x1d546, 0x1d54a, 4},
-		{0x1d54b, 0x1d550, 1},
-		{0x1d552, 0x1d6a5, 1},
-		{0x1d6a8, 0x1d6c0, 1},
-		{0x1d6c2, 0x1d6da, 1},
-		{0x1d6dc, 0x1d6fa, 1},
-		{0x1d6fc, 0x1d714, 1},
-		{0x1d716, 0x1d734, 1},
-		{0x1d736, 0x1d74e, 1},
-		{0x1d750, 0x1d76e, 1},
-		{0x1d770, 0x1d788, 1},
-		{0x1d78a, 0x1d7a8, 1},
-		{0x1d7aa, 0x1d7c2, 1},
-		{0x1d7c4, 0x1d7cb, 1},
-		{0x1e800, 0x1e8c4, 1},
-		{0x1ee00, 0x1ee03, 1},
-		{0x1ee05, 0x1ee1f, 1},
-		{0x1ee21, 0x1ee22, 1},
-		{0x1ee24, 0x1ee27, 3},
-		{0x1ee29, 0x1ee32, 1},
-		{0x1ee34, 0x1ee37, 1},
-		{0x1ee39, 0x1ee3b, 2},
-		{0x1ee42, 0x1ee47, 5},
-		{0x1ee49, 0x1ee4d, 2},
-		{0x1ee4e, 0x1ee4f, 1},
-		{0x1ee51, 0x1ee52, 1},
-		{0x1ee54, 0x1ee57, 3},
-		{0x1ee59, 0x1ee61, 2},
-		{0x1ee62, 0x1ee64, 2},
-		{0x1ee67, 0x1ee6a, 1},
-		{0x1ee6c, 0x1ee72, 1},
-		{0x1ee74, 0x1ee77, 1},
-		{0x1ee79, 0x1ee7c, 1},
-		{0x1ee7e, 0x1ee80, 2},
-		{0x1ee81, 0x1ee89, 1},
-		{0x1ee8b, 0x1ee9b, 1},
-		{0x1eea1, 0x1eea3, 1},
-		{0x1eea5, 0x1eea9, 1},
-		{0x1eeab, 0x1eebb, 1},
-		{0x20000, 0x2a6d6, 1},
-		{0x2a700, 0x2b734, 1},
-		{0x2b740, 0x2b81d, 1},
-		{0x2b820, 0x2cea1, 1},
-		{0x2f800, 0x2fa1d, 1},
-	},
-	LatinOffset: 6,
-}
-
-var _Ll = &RangeTable{
-	R16: []Range16{
-		{0x0061, 0x007a, 1},
-		{0x00b5, 0x00df, 42},
-		{0x00e0, 0x00f6, 1},
-		{0x00f8, 0x00ff, 1},
-		{0x0101, 0x0137, 2},
-		{0x0138, 0x0148, 2},
-		{0x0149, 0x0177, 2},
-		{0x017a, 0x017e, 2},
-		{0x017f, 0x0180, 1},
-		{0x0183, 0x0185, 2},
-		{0x0188, 0x018c, 4},
-		{0x018d, 0x0192, 5},
-		{0x0195, 0x0199, 4},
-		{0x019a, 0x019b, 1},
-		{0x019e, 0x01a1, 3},
-		{0x01a3, 0x01a5, 2},
-		{0x01a8, 0x01aa, 2},
-		{0x01ab, 0x01ad, 2},
-		{0x01b0, 0x01b4, 4},
-		{0x01b6, 0x01b9, 3},
-		{0x01ba, 0x01bd, 3},
-		{0x01be, 0x01bf, 1},
-		{0x01c6, 0x01cc, 3},
-		{0x01ce, 0x01dc, 2},
-		{0x01dd, 0x01ef, 2},
-		{0x01f0, 0x01f3, 3},
-		{0x01f5, 0x01f9, 4},
-		{0x01fb, 0x0233, 2},
-		{0x0234, 0x0239, 1},
-		{0x023c, 0x023f, 3},
-		{0x0240, 0x0242, 2},
-		{0x0247, 0x024f, 2},
-		{0x0250, 0x0293, 1},
-		{0x0295, 0x02af, 1},
-		{0x0371, 0x0373, 2},
-		{0x0377, 0x037b, 4},
-		{0x037c, 0x037d, 1},
-		{0x0390, 0x03ac, 28},
-		{0x03ad, 0x03ce, 1},
-		{0x03d0, 0x03d1, 1},
-		{0x03d5, 0x03d7, 1},
-		{0x03d9, 0x03ef, 2},
-		{0x03f0, 0x03f3, 1},
-		{0x03f5, 0x03fb, 3},
-		{0x03fc, 0x0430, 52},
-		{0x0431, 0x045f, 1},
-		{0x0461, 0x0481, 2},
-		{0x048b, 0x04bf, 2},
-		{0x04c2, 0x04ce, 2},
-		{0x04cf, 0x052f, 2},
-		{0x0561, 0x0587, 1},
-		{0x13f8, 0x13fd, 1},
-		{0x1d00, 0x1d2b, 1},
-		{0x1d6b, 0x1d77, 1},
-		{0x1d79, 0x1d9a, 1},
-		{0x1e01, 0x1e95, 2},
-		{0x1e96, 0x1e9d, 1},
-		{0x1e9f, 0x1eff, 2},
-		{0x1f00, 0x1f07, 1},
-		{0x1f10, 0x1f15, 1},
-		{0x1f20, 0x1f27, 1},
-		{0x1f30, 0x1f37, 1},
-		{0x1f40, 0x1f45, 1},
-		{0x1f50, 0x1f57, 1},
-		{0x1f60, 0x1f67, 1},
-		{0x1f70, 0x1f7d, 1},
-		{0x1f80, 0x1f87, 1},
-		{0x1f90, 0x1f97, 1},
-		{0x1fa0, 0x1fa7, 1},
-		{0x1fb0, 0x1fb4, 1},
-		{0x1fb6, 0x1fb7, 1},
-		{0x1fbe, 0x1fc2, 4},
-		{0x1fc3, 0x1fc4, 1},
-		{0x1fc6, 0x1fc7, 1},
-		{0x1fd0, 0x1fd3, 1},
-		{0x1fd6, 0x1fd7, 1},
-		{0x1fe0, 0x1fe7, 1},
-		{0x1ff2, 0x1ff4, 1},
-		{0x1ff6, 0x1ff7, 1},
-		{0x210a, 0x210e, 4},
-		{0x210f, 0x2113, 4},
-		{0x212f, 0x2139, 5},
-		{0x213c, 0x213d, 1},
-		{0x2146, 0x2149, 1},
-		{0x214e, 0x2184, 54},
-		{0x2c30, 0x2c5e, 1},
-		{0x2c61, 0x2c65, 4},
-		{0x2c66, 0x2c6c, 2},
-		{0x2c71, 0x2c73, 2},
-		{0x2c74, 0x2c76, 2},
-		{0x2c77, 0x2c7b, 1},
-		{0x2c81, 0x2ce3, 2},
-		{0x2ce4, 0x2cec, 8},
-		{0x2cee, 0x2cf3, 5},
-		{0x2d00, 0x2d25, 1},
-		{0x2d27, 0x2d2d, 6},
-		{0xa641, 0xa66d, 2},
-		{0xa681, 0xa69b, 2},
-		{0xa723, 0xa72f, 2},
-		{0xa730, 0xa731, 1},
-		{0xa733, 0xa771, 2},
-		{0xa772, 0xa778, 1},
-		{0xa77a, 0xa77c, 2},
-		{0xa77f, 0xa787, 2},
-		{0xa78c, 0xa78e, 2},
-		{0xa791, 0xa793, 2},
-		{0xa794, 0xa795, 1},
-		{0xa797, 0xa7a9, 2},
-		{0xa7b5, 0xa7b7, 2},
-		{0xa7fa, 0xab30, 822},
-		{0xab31, 0xab5a, 1},
-		{0xab60, 0xab65, 1},
-		{0xab70, 0xabbf, 1},
-		{0xfb00, 0xfb06, 1},
-		{0xfb13, 0xfb17, 1},
-		{0xff41, 0xff5a, 1},
-	},
-	R32: []Range32{
-		{0x10428, 0x1044f, 1},
-		{0x10cc0, 0x10cf2, 1},
-		{0x118c0, 0x118df, 1},
-		{0x1d41a, 0x1d433, 1},
-		{0x1d44e, 0x1d454, 1},
-		{0x1d456, 0x1d467, 1},
-		{0x1d482, 0x1d49b, 1},
-		{0x1d4b6, 0x1d4b9, 1},
-		{0x1d4bb, 0x1d4bd, 2},
-		{0x1d4be, 0x1d4c3, 1},
-		{0x1d4c5, 0x1d4cf, 1},
-		{0x1d4ea, 0x1d503, 1},
-		{0x1d51e, 0x1d537, 1},
-		{0x1d552, 0x1d56b, 1},
-		{0x1d586, 0x1d59f, 1},
-		{0x1d5ba, 0x1d5d3, 1},
-		{0x1d5ee, 0x1d607, 1},
-		{0x1d622, 0x1d63b, 1},
-		{0x1d656, 0x1d66f, 1},
-		{0x1d68a, 0x1d6a5, 1},
-		{0x1d6c2, 0x1d6da, 1},
-		{0x1d6dc, 0x1d6e1, 1},
-		{0x1d6fc, 0x1d714, 1},
-		{0x1d716, 0x1d71b, 1},
-		{0x1d736, 0x1d74e, 1},
-		{0x1d750, 0x1d755, 1},
-		{0x1d770, 0x1d788, 1},
-		{0x1d78a, 0x1d78f, 1},
-		{0x1d7aa, 0x1d7c2, 1},
-		{0x1d7c4, 0x1d7c9, 1},
-		{0x1d7cb, 0x1d7cb, 1},
-	},
-	LatinOffset: 4,
-}
-
-var _Lm = &RangeTable{
-	R16: []Range16{
-		{0x02b0, 0x02c1, 1},
-		{0x02c6, 0x02d1, 1},
-		{0x02e0, 0x02e4, 1},
-		{0x02ec, 0x02ee, 2},
-		{0x0374, 0x037a, 6},
-		{0x0559, 0x0640, 231},
-		{0x06e5, 0x06e6, 1},
-		{0x07f4, 0x07f5, 1},
-		{0x07fa, 0x081a, 32},
-		{0x0824, 0x0828, 4},
-		{0x0971, 0x0e46, 1237},
-		{0x0ec6, 0x10fc, 566},
-		{0x17d7, 0x1843, 108},
-		{0x1aa7, 0x1c78, 465},
-		{0x1c79, 0x1c7d, 1},
-		{0x1d2c, 0x1d6a, 1},
-		{0x1d78, 0x1d9b, 35},
-		{0x1d9c, 0x1dbf, 1},
-		{0x2071, 0x207f, 14},
-		{0x2090, 0x209c, 1},
-		{0x2c7c, 0x2c7d, 1},
-		{0x2d6f, 0x2e2f, 192},
-		{0x3005, 0x3031, 44},
-		{0x3032, 0x3035, 1},
-		{0x303b, 0x309d, 98},
-		{0x309e, 0x30fc, 94},
-		{0x30fd, 0x30fe, 1},
-		{0xa015, 0xa4f8, 1251},
-		{0xa4f9, 0xa4fd, 1},
-		{0xa60c, 0xa67f, 115},
-		{0xa69c, 0xa69d, 1},
-		{0xa717, 0xa71f, 1},
-		{0xa770, 0xa788, 24},
-		{0xa7f8, 0xa7f9, 1},
-		{0xa9cf, 0xa9e6, 23},
-		{0xaa70, 0xaadd, 109},
-		{0xaaf3, 0xaaf4, 1},
-		{0xab5c, 0xab5f, 1},
-		{0xff70, 0xff9e, 46},
-		{0xff9f, 0xff9f, 1},
-	},
-	R32: []Range32{
-		{0x16b40, 0x16b40, 1},
-		{0x16b41, 0x16b43, 1},
-		{0x16f93, 0x16f9f, 1},
-	},
-}
-
-var _Lo = &RangeTable{
-	R16: []Range16{
-		{0x00aa, 0x00ba, 16},
-		{0x01bb, 0x01c0, 5},
-		{0x01c1, 0x01c3, 1},
-		{0x0294, 0x05d0, 828},
-		{0x05d1, 0x05ea, 1},
-		{0x05f0, 0x05f2, 1},
-		{0x0620, 0x063f, 1},
-		{0x0641, 0x064a, 1},
-		{0x066e, 0x066f, 1},
-		{0x0671, 0x06d3, 1},
-		{0x06d5, 0x06ee, 25},
-		{0x06ef, 0x06fa, 11},
-		{0x06fb, 0x06fc, 1},
-		{0x06ff, 0x0710, 17},
-		{0x0712, 0x072f, 1},
-		{0x074d, 0x07a5, 1},
-		{0x07b1, 0x07ca, 25},
-		{0x07cb, 0x07ea, 1},
-		{0x0800, 0x0815, 1},
-		{0x0840, 0x0858, 1},
-		{0x08a0, 0x08b4, 1},
-		{0x0904, 0x0939, 1},
-		{0x093d, 0x0950, 19},
-		{0x0958, 0x0961, 1},
-		{0x0972, 0x0980, 1},
-		{0x0985, 0x098c, 1},
-		{0x098f, 0x0990, 1},
-		{0x0993, 0x09a8, 1},
-		{0x09aa, 0x09b0, 1},
-		{0x09b2, 0x09b6, 4},
-		{0x09b7, 0x09b9, 1},
-		{0x09bd, 0x09ce, 17},
-		{0x09dc, 0x09dd, 1},
-		{0x09df, 0x09e1, 1},
-		{0x09f0, 0x09f1, 1},
-		{0x0a05, 0x0a0a, 1},
-		{0x0a0f, 0x0a10, 1},
-		{0x0a13, 0x0a28, 1},
-		{0x0a2a, 0x0a30, 1},
-		{0x0a32, 0x0a33, 1},
-		{0x0a35, 0x0a36, 1},
-		{0x0a38, 0x0a39, 1},
-		{0x0a59, 0x0a5c, 1},
-		{0x0a5e, 0x0a72, 20},
-		{0x0a73, 0x0a74, 1},
-		{0x0a85, 0x0a8d, 1},
-		{0x0a8f, 0x0a91, 1},
-		{0x0a93, 0x0aa8, 1},
-		{0x0aaa, 0x0ab0, 1},
-		{0x0ab2, 0x0ab3, 1},
-		{0x0ab5, 0x0ab9, 1},
-		{0x0abd, 0x0ad0, 19},
-		{0x0ae0, 0x0ae1, 1},
-		{0x0af9, 0x0b05, 12},
-		{0x0b06, 0x0b0c, 1},
-		{0x0b0f, 0x0b10, 1},
-		{0x0b13, 0x0b28, 1},
-		{0x0b2a, 0x0b30, 1},
-		{0x0b32, 0x0b33, 1},
-		{0x0b35, 0x0b39, 1},
-		{0x0b3d, 0x0b5c, 31},
-		{0x0b5d, 0x0b5f, 2},
-		{0x0b60, 0x0b61, 1},
-		{0x0b71, 0x0b83, 18},
-		{0x0b85, 0x0b8a, 1},
-		{0x0b8e, 0x0b90, 1},
-		{0x0b92, 0x0b95, 1},
-		{0x0b99, 0x0b9a, 1},
-		{0x0b9c, 0x0b9e, 2},
-		{0x0b9f, 0x0ba3, 4},
-		{0x0ba4, 0x0ba8, 4},
-		{0x0ba9, 0x0baa, 1},
-		{0x0bae, 0x0bb9, 1},
-		{0x0bd0, 0x0c05, 53},
-		{0x0c06, 0x0c0c, 1},
-		{0x0c0e, 0x0c10, 1},
-		{0x0c12, 0x0c28, 1},
-		{0x0c2a, 0x0c39, 1},
-		{0x0c3d, 0x0c58, 27},
-		{0x0c59, 0x0c5a, 1},
-		{0x0c60, 0x0c61, 1},
-		{0x0c85, 0x0c8c, 1},
-		{0x0c8e, 0x0c90, 1},
-		{0x0c92, 0x0ca8, 1},
-		{0x0caa, 0x0cb3, 1},
-		{0x0cb5, 0x0cb9, 1},
-		{0x0cbd, 0x0cde, 33},
-		{0x0ce0, 0x0ce1, 1},
-		{0x0cf1, 0x0cf2, 1},
-		{0x0d05, 0x0d0c, 1},
-		{0x0d0e, 0x0d10, 1},
-		{0x0d12, 0x0d3a, 1},
-		{0x0d3d, 0x0d5f, 17},
-		{0x0d60, 0x0d61, 1},
-		{0x0d7a, 0x0d7f, 1},
-		{0x0d85, 0x0d96, 1},
-		{0x0d9a, 0x0db1, 1},
-		{0x0db3, 0x0dbb, 1},
-		{0x0dbd, 0x0dc0, 3},
-		{0x0dc1, 0x0dc6, 1},
-		{0x0e01, 0x0e30, 1},
-		{0x0e32, 0x0e33, 1},
-		{0x0e40, 0x0e45, 1},
-		{0x0e81, 0x0e82, 1},
-		{0x0e84, 0x0e87, 3},
-		{0x0e88, 0x0e8a, 2},
-		{0x0e8d, 0x0e94, 7},
-		{0x0e95, 0x0e97, 1},
-		{0x0e99, 0x0e9f, 1},
-		{0x0ea1, 0x0ea3, 1},
-		{0x0ea5, 0x0ea7, 2},
-		{0x0eaa, 0x0eab, 1},
-		{0x0ead, 0x0eb0, 1},
-		{0x0eb2, 0x0eb3, 1},
-		{0x0ebd, 0x0ec0, 3},
-		{0x0ec1, 0x0ec4, 1},
-		{0x0edc, 0x0edf, 1},
-		{0x0f00, 0x0f40, 64},
-		{0x0f41, 0x0f47, 1},
-		{0x0f49, 0x0f6c, 1},
-		{0x0f88, 0x0f8c, 1},
-		{0x1000, 0x102a, 1},
-		{0x103f, 0x1050, 17},
-		{0x1051, 0x1055, 1},
-		{0x105a, 0x105d, 1},
-		{0x1061, 0x1065, 4},
-		{0x1066, 0x106e, 8},
-		{0x106f, 0x1070, 1},
-		{0x1075, 0x1081, 1},
-		{0x108e, 0x10d0, 66},
-		{0x10d1, 0x10fa, 1},
-		{0x10fd, 0x1248, 1},
-		{0x124a, 0x124d, 1},
-		{0x1250, 0x1256, 1},
-		{0x1258, 0x125a, 2},
-		{0x125b, 0x125d, 1},
-		{0x1260, 0x1288, 1},
-		{0x128a, 0x128d, 1},
-		{0x1290, 0x12b0, 1},
-		{0x12b2, 0x12b5, 1},
-		{0x12b8, 0x12be, 1},
-		{0x12c0, 0x12c2, 2},
-		{0x12c3, 0x12c5, 1},
-		{0x12c8, 0x12d6, 1},
-		{0x12d8, 0x1310, 1},
-		{0x1312, 0x1315, 1},
-		{0x1318, 0x135a, 1},
-		{0x1380, 0x138f, 1},
-		{0x1401, 0x166c, 1},
-		{0x166f, 0x167f, 1},
-		{0x1681, 0x169a, 1},
-		{0x16a0, 0x16ea, 1},
-		{0x16f1, 0x16f8, 1},
-		{0x1700, 0x170c, 1},
-		{0x170e, 0x1711, 1},
-		{0x1720, 0x1731, 1},
-		{0x1740, 0x1751, 1},
-		{0x1760, 0x176c, 1},
-		{0x176e, 0x1770, 1},
-		{0x1780, 0x17b3, 1},
-		{0x17dc, 0x1820, 68},
-		{0x1821, 0x1842, 1},
-		{0x1844, 0x1877, 1},
-		{0x1880, 0x18a8, 1},
-		{0x18aa, 0x18b0, 6},
-		{0x18b1, 0x18f5, 1},
-		{0x1900, 0x191e, 1},
-		{0x1950, 0x196d, 1},
-		{0x1970, 0x1974, 1},
-		{0x1980, 0x19ab, 1},
-		{0x19b0, 0x19c9, 1},
-		{0x1a00, 0x1a16, 1},
-		{0x1a20, 0x1a54, 1},
-		{0x1b05, 0x1b33, 1},
-		{0x1b45, 0x1b4b, 1},
-		{0x1b83, 0x1ba0, 1},
-		{0x1bae, 0x1baf, 1},
-		{0x1bba, 0x1be5, 1},
-		{0x1c00, 0x1c23, 1},
-		{0x1c4d, 0x1c4f, 1},
-		{0x1c5a, 0x1c77, 1},
-		{0x1ce9, 0x1cec, 1},
-		{0x1cee, 0x1cf1, 1},
-		{0x1cf5, 0x1cf6, 1},
-		{0x2135, 0x2138, 1},
-		{0x2d30, 0x2d67, 1},
-		{0x2d80, 0x2d96, 1},
-		{0x2da0, 0x2da6, 1},
-		{0x2da8, 0x2dae, 1},
-		{0x2db0, 0x2db6, 1},
-		{0x2db8, 0x2dbe, 1},
-		{0x2dc0, 0x2dc6, 1},
-		{0x2dc8, 0x2dce, 1},
-		{0x2dd0, 0x2dd6, 1},
-		{0x2dd8, 0x2dde, 1},
-		{0x3006, 0x303c, 54},
-		{0x3041, 0x3096, 1},
-		{0x309f, 0x30a1, 2},
-		{0x30a2, 0x30fa, 1},
-		{0x30ff, 0x3105, 6},
-		{0x3106, 0x312d, 1},
-		{0x3131, 0x318e, 1},
-		{0x31a0, 0x31ba, 1},
-		{0x31f0, 0x31ff, 1},
-		{0x3400, 0x4db5, 1},
-		{0x4e00, 0x9fd5, 1},
-		{0xa000, 0xa014, 1},
-		{0xa016, 0xa48c, 1},
-		{0xa4d0, 0xa4f7, 1},
-		{0xa500, 0xa60b, 1},
-		{0xa610, 0xa61f, 1},
-		{0xa62a, 0xa62b, 1},
-		{0xa66e, 0xa6a0, 50},
-		{0xa6a1, 0xa6e5, 1},
-		{0xa78f, 0xa7f7, 104},
-		{0xa7fb, 0xa801, 1},
-		{0xa803, 0xa805, 1},
-		{0xa807, 0xa80a, 1},
-		{0xa80c, 0xa822, 1},
-		{0xa840, 0xa873, 1},
-		{0xa882, 0xa8b3, 1},
-		{0xa8f2, 0xa8f7, 1},
-		{0xa8fb, 0xa8fd, 2},
-		{0xa90a, 0xa925, 1},
-		{0xa930, 0xa946, 1},
-		{0xa960, 0xa97c, 1},
-		{0xa984, 0xa9b2, 1},
-		{0xa9e0, 0xa9e4, 1},
-		{0xa9e7, 0xa9ef, 1},
-		{0xa9fa, 0xa9fe, 1},
-		{0xaa00, 0xaa28, 1},
-		{0xaa40, 0xaa42, 1},
-		{0xaa44, 0xaa4b, 1},
-		{0xaa60, 0xaa6f, 1},
-		{0xaa71, 0xaa76, 1},
-		{0xaa7a, 0xaa7e, 4},
-		{0xaa7f, 0xaaaf, 1},
-		{0xaab1, 0xaab5, 4},
-		{0xaab6, 0xaab9, 3},
-		{0xaaba, 0xaabd, 1},
-		{0xaac0, 0xaac2, 2},
-		{0xaadb, 0xaadc, 1},
-		{0xaae0, 0xaaea, 1},
-		{0xaaf2, 0xab01, 15},
-		{0xab02, 0xab06, 1},
-		{0xab09, 0xab0e, 1},
-		{0xab11, 0xab16, 1},
-		{0xab20, 0xab26, 1},
-		{0xab28, 0xab2e, 1},
-		{0xabc0, 0xabe2, 1},
-		{0xac00, 0xd7a3, 1},
-		{0xd7b0, 0xd7c6, 1},
-		{0xd7cb, 0xd7fb, 1},
-		{0xf900, 0xfa6d, 1},
-		{0xfa70, 0xfad9, 1},
-		{0xfb1d, 0xfb1f, 2},
-		{0xfb20, 0xfb28, 1},
-		{0xfb2a, 0xfb36, 1},
-		{0xfb38, 0xfb3c, 1},
-		{0xfb3e, 0xfb40, 2},
-		{0xfb41, 0xfb43, 2},
-		{0xfb44, 0xfb46, 2},
-		{0xfb47, 0xfbb1, 1},
-		{0xfbd3, 0xfd3d, 1},
-		{0xfd50, 0xfd8f, 1},
-		{0xfd92, 0xfdc7, 1},
-		{0xfdf0, 0xfdfb, 1},
-		{0xfe70, 0xfe74, 1},
-		{0xfe76, 0xfefc, 1},
-		{0xff66, 0xff6f, 1},
-		{0xff71, 0xff9d, 1},
-		{0xffa0, 0xffbe, 1},
-		{0xffc2, 0xffc7, 1},
-		{0xffca, 0xffcf, 1},
-		{0xffd2, 0xffd7, 1},
-		{0xffda, 0xffdc, 1},
-	},
-	R32: []Range32{
-		{0x10000, 0x1000b, 1},
-		{0x1000d, 0x10026, 1},
-		{0x10028, 0x1003a, 1},
-		{0x1003c, 0x1003d, 1},
-		{0x1003f, 0x1004d, 1},
-		{0x10050, 0x1005d, 1},
-		{0x10080, 0x100fa, 1},
-		{0x10280, 0x1029c, 1},
-		{0x102a0, 0x102d0, 1},
-		{0x10300, 0x1031f, 1},
-		{0x10330, 0x10340, 1},
-		{0x10342, 0x10349, 1},
-		{0x10350, 0x10375, 1},
-		{0x10380, 0x1039d, 1},
-		{0x103a0, 0x103c3, 1},
-		{0x103c8, 0x103cf, 1},
-		{0x10450, 0x1049d, 1},
-		{0x10500, 0x10527, 1},
-		{0x10530, 0x10563, 1},
-		{0x10600, 0x10736, 1},
-		{0x10740, 0x10755, 1},
-		{0x10760, 0x10767, 1},
-		{0x10800, 0x10805, 1},
-		{0x10808, 0x1080a, 2},
-		{0x1080b, 0x10835, 1},
-		{0x10837, 0x10838, 1},
-		{0x1083c, 0x1083f, 3},
-		{0x10840, 0x10855, 1},
-		{0x10860, 0x10876, 1},
-		{0x10880, 0x1089e, 1},
-		{0x108e0, 0x108f2, 1},
-		{0x108f4, 0x108f5, 1},
-		{0x10900, 0x10915, 1},
-		{0x10920, 0x10939, 1},
-		{0x10980, 0x109b7, 1},
-		{0x109be, 0x109bf, 1},
-		{0x10a00, 0x10a10, 16},
-		{0x10a11, 0x10a13, 1},
-		{0x10a15, 0x10a17, 1},
-		{0x10a19, 0x10a33, 1},
-		{0x10a60, 0x10a7c, 1},
-		{0x10a80, 0x10a9c, 1},
-		{0x10ac0, 0x10ac7, 1},
-		{0x10ac9, 0x10ae4, 1},
-		{0x10b00, 0x10b35, 1},
-		{0x10b40, 0x10b55, 1},
-		{0x10b60, 0x10b72, 1},
-		{0x10b80, 0x10b91, 1},
-		{0x10c00, 0x10c48, 1},
-		{0x11003, 0x11037, 1},
-		{0x11083, 0x110af, 1},
-		{0x110d0, 0x110e8, 1},
-		{0x11103, 0x11126, 1},
-		{0x11150, 0x11172, 1},
-		{0x11176, 0x11183, 13},
-		{0x11184, 0x111b2, 1},
-		{0x111c1, 0x111c4, 1},
-		{0x111da, 0x111dc, 2},
-		{0x11200, 0x11211, 1},
-		{0x11213, 0x1122b, 1},
-		{0x11280, 0x11286, 1},
-		{0x11288, 0x1128a, 2},
-		{0x1128b, 0x1128d, 1},
-		{0x1128f, 0x1129d, 1},
-		{0x1129f, 0x112a8, 1},
-		{0x112b0, 0x112de, 1},
-		{0x11305, 0x1130c, 1},
-		{0x1130f, 0x11310, 1},
-		{0x11313, 0x11328, 1},
-		{0x1132a, 0x11330, 1},
-		{0x11332, 0x11333, 1},
-		{0x11335, 0x11339, 1},
-		{0x1133d, 0x11350, 19},
-		{0x1135d, 0x11361, 1},
-		{0x11480, 0x114af, 1},
-		{0x114c4, 0x114c5, 1},
-		{0x114c7, 0x11580, 185},
-		{0x11581, 0x115ae, 1},
-		{0x115d8, 0x115db, 1},
-		{0x11600, 0x1162f, 1},
-		{0x11644, 0x11680, 60},
-		{0x11681, 0x116aa, 1},
-		{0x11700, 0x11719, 1},
-		{0x118ff, 0x11ac0, 449},
-		{0x11ac1, 0x11af8, 1},
-		{0x12000, 0x12399, 1},
-		{0x12480, 0x12543, 1},
-		{0x13000, 0x1342e, 1},
-		{0x14400, 0x14646, 1},
-		{0x16800, 0x16a38, 1},
-		{0x16a40, 0x16a5e, 1},
-		{0x16ad0, 0x16aed, 1},
-		{0x16b00, 0x16b2f, 1},
-		{0x16b63, 0x16b77, 1},
-		{0x16b7d, 0x16b8f, 1},
-		{0x16f00, 0x16f44, 1},
-		{0x16f50, 0x1b000, 16560},
-		{0x1b001, 0x1bc00, 3071},
-		{0x1bc01, 0x1bc6a, 1},
-		{0x1bc70, 0x1bc7c, 1},
-		{0x1bc80, 0x1bc88, 1},
-		{0x1bc90, 0x1bc99, 1},
-		{0x1e800, 0x1e8c4, 1},
-		{0x1ee00, 0x1ee03, 1},
-		{0x1ee05, 0x1ee1f, 1},
-		{0x1ee21, 0x1ee22, 1},
-		{0x1ee24, 0x1ee27, 3},
-		{0x1ee29, 0x1ee32, 1},
-		{0x1ee34, 0x1ee37, 1},
-		{0x1ee39, 0x1ee3b, 2},
-		{0x1ee42, 0x1ee47, 5},
-		{0x1ee49, 0x1ee4d, 2},
-		{0x1ee4e, 0x1ee4f, 1},
-		{0x1ee51, 0x1ee52, 1},
-		{0x1ee54, 0x1ee57, 3},
-		{0x1ee59, 0x1ee61, 2},
-		{0x1ee62, 0x1ee64, 2},
-		{0x1ee67, 0x1ee6a, 1},
-		{0x1ee6c, 0x1ee72, 1},
-		{0x1ee74, 0x1ee77, 1},
-		{0x1ee79, 0x1ee7c, 1},
-		{0x1ee7e, 0x1ee80, 2},
-		{0x1ee81, 0x1ee89, 1},
-		{0x1ee8b, 0x1ee9b, 1},
-		{0x1eea1, 0x1eea3, 1},
-		{0x1eea5, 0x1eea9, 1},
-		{0x1eeab, 0x1eebb, 1},
-		{0x20000, 0x2a6d6, 1},
-		{0x2a700, 0x2b734, 1},
-		{0x2b740, 0x2b81d, 1},
-		{0x2b820, 0x2cea1, 1},
-		{0x2f800, 0x2fa1d, 1},
-	},
-	LatinOffset: 1,
-}
-
-var _Lt = &RangeTable{
-	R16: []Range16{
-		{0x01c5, 0x01cb, 3},
-		{0x01f2, 0x1f88, 7574},
-		{0x1f89, 0x1f8f, 1},
-		{0x1f98, 0x1f9f, 1},
-		{0x1fa8, 0x1faf, 1},
-		{0x1fbc, 0x1fcc, 16},
-		{0x1ffc, 0x1ffc, 1},
-	},
-}
-
-var _Lu = &RangeTable{
-	R16: []Range16{
-		{0x0041, 0x005a, 1},
-		{0x00c0, 0x00d6, 1},
-		{0x00d8, 0x00de, 1},
-		{0x0100, 0x0136, 2},
-		{0x0139, 0x0147, 2},
-		{0x014a, 0x0178, 2},
-		{0x0179, 0x017d, 2},
-		{0x0181, 0x0182, 1},
-		{0x0184, 0x0186, 2},
-		{0x0187, 0x0189, 2},
-		{0x018a, 0x018b, 1},
-		{0x018e, 0x0191, 1},
-		{0x0193, 0x0194, 1},
-		{0x0196, 0x0198, 1},
-		{0x019c, 0x019d, 1},
-		{0x019f, 0x01a0, 1},
-		{0x01a2, 0x01a6, 2},
-		{0x01a7, 0x01a9, 2},
-		{0x01ac, 0x01ae, 2},
-		{0x01af, 0x01b1, 2},
-		{0x01b2, 0x01b3, 1},
-		{0x01b5, 0x01b7, 2},
-		{0x01b8, 0x01bc, 4},
-		{0x01c4, 0x01cd, 3},
-		{0x01cf, 0x01db, 2},
-		{0x01de, 0x01ee, 2},
-		{0x01f1, 0x01f4, 3},
-		{0x01f6, 0x01f8, 1},
-		{0x01fa, 0x0232, 2},
-		{0x023a, 0x023b, 1},
-		{0x023d, 0x023e, 1},
-		{0x0241, 0x0243, 2},
-		{0x0244, 0x0246, 1},
-		{0x0248, 0x024e, 2},
-		{0x0370, 0x0372, 2},
-		{0x0376, 0x037f, 9},
-		{0x0386, 0x0388, 2},
-		{0x0389, 0x038a, 1},
-		{0x038c, 0x038e, 2},
-		{0x038f, 0x0391, 2},
-		{0x0392, 0x03a1, 1},
-		{0x03a3, 0x03ab, 1},
-		{0x03cf, 0x03d2, 3},
-		{0x03d3, 0x03d4, 1},
-		{0x03d8, 0x03ee, 2},
-		{0x03f4, 0x03f7, 3},
-		{0x03f9, 0x03fa, 1},
-		{0x03fd, 0x042f, 1},
-		{0x0460, 0x0480, 2},
-		{0x048a, 0x04c0, 2},
-		{0x04c1, 0x04cd, 2},
-		{0x04d0, 0x052e, 2},
-		{0x0531, 0x0556, 1},
-		{0x10a0, 0x10c5, 1},
-		{0x10c7, 0x10cd, 6},
-		{0x13a0, 0x13f5, 1},
-		{0x1e00, 0x1e94, 2},
-		{0x1e9e, 0x1efe, 2},
-		{0x1f08, 0x1f0f, 1},
-		{0x1f18, 0x1f1d, 1},
-		{0x1f28, 0x1f2f, 1},
-		{0x1f38, 0x1f3f, 1},
-		{0x1f48, 0x1f4d, 1},
-		{0x1f59, 0x1f5f, 2},
-		{0x1f68, 0x1f6f, 1},
-		{0x1fb8, 0x1fbb, 1},
-		{0x1fc8, 0x1fcb, 1},
-		{0x1fd8, 0x1fdb, 1},
-		{0x1fe8, 0x1fec, 1},
-		{0x1ff8, 0x1ffb, 1},
-		{0x2102, 0x2107, 5},
-		{0x210b, 0x210d, 1},
-		{0x2110, 0x2112, 1},
-		{0x2115, 0x2119, 4},
-		{0x211a, 0x211d, 1},
-		{0x2124, 0x212a, 2},
-		{0x212b, 0x212d, 1},
-		{0x2130, 0x2133, 1},
-		{0x213e, 0x213f, 1},
-		{0x2145, 0x2183, 62},
-		{0x2c00, 0x2c2e, 1},
-		{0x2c60, 0x2c62, 2},
-		{0x2c63, 0x2c64, 1},
-		{0x2c67, 0x2c6d, 2},
-		{0x2c6e, 0x2c70, 1},
-		{0x2c72, 0x2c75, 3},
-		{0x2c7e, 0x2c80, 1},
-		{0x2c82, 0x2ce2, 2},
-		{0x2ceb, 0x2ced, 2},
-		{0x2cf2, 0xa640, 31054},
-		{0xa642, 0xa66c, 2},
-		{0xa680, 0xa69a, 2},
-		{0xa722, 0xa72e, 2},
-		{0xa732, 0xa76e, 2},
-		{0xa779, 0xa77d, 2},
-		{0xa77e, 0xa786, 2},
-		{0xa78b, 0xa78d, 2},
-		{0xa790, 0xa792, 2},
-		{0xa796, 0xa7aa, 2},
-		{0xa7ab, 0xa7ad, 1},
-		{0xa7b0, 0xa7b4, 1},
-		{0xa7b6, 0xff21, 22379},
-		{0xff22, 0xff3a, 1},
-	},
-	R32: []Range32{
-		{0x10400, 0x10427, 1},
-		{0x10c80, 0x10cb2, 1},
-		{0x118a0, 0x118bf, 1},
-		{0x1d400, 0x1d419, 1},
-		{0x1d434, 0x1d44d, 1},
-		{0x1d468, 0x1d481, 1},
-		{0x1d49c, 0x1d49e, 2},
-		{0x1d49f, 0x1d4a5, 3},
-		{0x1d4a6, 0x1d4a9, 3},
-		{0x1d4aa, 0x1d4ac, 1},
-		{0x1d4ae, 0x1d4b5, 1},
-		{0x1d4d0, 0x1d4e9, 1},
-		{0x1d504, 0x1d505, 1},
-		{0x1d507, 0x1d50a, 1},
-		{0x1d50d, 0x1d514, 1},
-		{0x1d516, 0x1d51c, 1},
-		{0x1d538, 0x1d539, 1},
-		{0x1d53b, 0x1d53e, 1},
-		{0x1d540, 0x1d544, 1},
-		{0x1d546, 0x1d54a, 4},
-		{0x1d54b, 0x1d550, 1},
-		{0x1d56c, 0x1d585, 1},
-		{0x1d5a0, 0x1d5b9, 1},
-		{0x1d5d4, 0x1d5ed, 1},
-		{0x1d608, 0x1d621, 1},
-		{0x1d63c, 0x1d655, 1},
-		{0x1d670, 0x1d689, 1},
-		{0x1d6a8, 0x1d6c0, 1},
-		{0x1d6e2, 0x1d6fa, 1},
-		{0x1d71c, 0x1d734, 1},
-		{0x1d756, 0x1d76e, 1},
-		{0x1d790, 0x1d7a8, 1},
-		{0x1d7ca, 0x1d7ca, 1},
-	},
-	LatinOffset: 3,
-}
-
-var _M = &RangeTable{
-	R16: []Range16{
-		{0x0300, 0x036f, 1},
-		{0x0483, 0x0489, 1},
-		{0x0591, 0x05bd, 1},
-		{0x05bf, 0x05c1, 2},
-		{0x05c2, 0x05c4, 2},
-		{0x05c5, 0x05c7, 2},
-		{0x0610, 0x061a, 1},
-		{0x064b, 0x065f, 1},
-		{0x0670, 0x06d6, 102},
-		{0x06d7, 0x06dc, 1},
-		{0x06df, 0x06e4, 1},
-		{0x06e7, 0x06e8, 1},
-		{0x06ea, 0x06ed, 1},
-		{0x0711, 0x0730, 31},
-		{0x0731, 0x074a, 1},
-		{0x07a6, 0x07b0, 1},
-		{0x07eb, 0x07f3, 1},
-		{0x0816, 0x0819, 1},
-		{0x081b, 0x0823, 1},
-		{0x0825, 0x0827, 1},
-		{0x0829, 0x082d, 1},
-		{0x0859, 0x085b, 1},
-		{0x08e3, 0x0903, 1},
-		{0x093a, 0x093c, 1},
-		{0x093e, 0x094f, 1},
-		{0x0951, 0x0957, 1},
-		{0x0962, 0x0963, 1},
-		{0x0981, 0x0983, 1},
-		{0x09bc, 0x09be, 2},
-		{0x09bf, 0x09c4, 1},
-		{0x09c7, 0x09c8, 1},
-		{0x09cb, 0x09cd, 1},
-		{0x09d7, 0x09e2, 11},
-		{0x09e3, 0x0a01, 30},
-		{0x0a02, 0x0a03, 1},
-		{0x0a3c, 0x0a3e, 2},
-		{0x0a3f, 0x0a42, 1},
-		{0x0a47, 0x0a48, 1},
-		{0x0a4b, 0x0a4d, 1},
-		{0x0a51, 0x0a70, 31},
-		{0x0a71, 0x0a75, 4},
-		{0x0a81, 0x0a83, 1},
-		{0x0abc, 0x0abe, 2},
-		{0x0abf, 0x0ac5, 1},
-		{0x0ac7, 0x0ac9, 1},
-		{0x0acb, 0x0acd, 1},
-		{0x0ae2, 0x0ae3, 1},
-		{0x0b01, 0x0b03, 1},
-		{0x0b3c, 0x0b3e, 2},
-		{0x0b3f, 0x0b44, 1},
-		{0x0b47, 0x0b48, 1},
-		{0x0b4b, 0x0b4d, 1},
-		{0x0b56, 0x0b57, 1},
-		{0x0b62, 0x0b63, 1},
-		{0x0b82, 0x0bbe, 60},
-		{0x0bbf, 0x0bc2, 1},
-		{0x0bc6, 0x0bc8, 1},
-		{0x0bca, 0x0bcd, 1},
-		{0x0bd7, 0x0c00, 41},
-		{0x0c01, 0x0c03, 1},
-		{0x0c3e, 0x0c44, 1},
-		{0x0c46, 0x0c48, 1},
-		{0x0c4a, 0x0c4d, 1},
-		{0x0c55, 0x0c56, 1},
-		{0x0c62, 0x0c63, 1},
-		{0x0c81, 0x0c83, 1},
-		{0x0cbc, 0x0cbe, 2},
-		{0x0cbf, 0x0cc4, 1},
-		{0x0cc6, 0x0cc8, 1},
-		{0x0cca, 0x0ccd, 1},
-		{0x0cd5, 0x0cd6, 1},
-		{0x0ce2, 0x0ce3, 1},
-		{0x0d01, 0x0d03, 1},
-		{0x0d3e, 0x0d44, 1},
-		{0x0d46, 0x0d48, 1},
-		{0x0d4a, 0x0d4d, 1},
-		{0x0d57, 0x0d62, 11},
-		{0x0d63, 0x0d82, 31},
-		{0x0d83, 0x0dca, 71},
-		{0x0dcf, 0x0dd4, 1},
-		{0x0dd6, 0x0dd8, 2},
-		{0x0dd9, 0x0ddf, 1},
-		{0x0df2, 0x0df3, 1},
-		{0x0e31, 0x0e34, 3},
-		{0x0e35, 0x0e3a, 1},
-		{0x0e47, 0x0e4e, 1},
-		{0x0eb1, 0x0eb4, 3},
-		{0x0eb5, 0x0eb9, 1},
-		{0x0ebb, 0x0ebc, 1},
-		{0x0ec8, 0x0ecd, 1},
-		{0x0f18, 0x0f19, 1},
-		{0x0f35, 0x0f39, 2},
-		{0x0f3e, 0x0f3f, 1},
-		{0x0f71, 0x0f84, 1},
-		{0x0f86, 0x0f87, 1},
-		{0x0f8d, 0x0f97, 1},
-		{0x0f99, 0x0fbc, 1},
-		{0x0fc6, 0x102b, 101},
-		{0x102c, 0x103e, 1},
-		{0x1056, 0x1059, 1},
-		{0x105e, 0x1060, 1},
-		{0x1062, 0x1064, 1},
-		{0x1067, 0x106d, 1},
-		{0x1071, 0x1074, 1},
-		{0x1082, 0x108d, 1},
-		{0x108f, 0x109a, 11},
-		{0x109b, 0x109d, 1},
-		{0x135d, 0x135f, 1},
-		{0x1712, 0x1714, 1},
-		{0x1732, 0x1734, 1},
-		{0x1752, 0x1753, 1},
-		{0x1772, 0x1773, 1},
-		{0x17b4, 0x17d3, 1},
-		{0x17dd, 0x180b, 46},
-		{0x180c, 0x180d, 1},
-		{0x18a9, 0x1920, 119},
-		{0x1921, 0x192b, 1},
-		{0x1930, 0x193b, 1},
-		{0x1a17, 0x1a1b, 1},
-		{0x1a55, 0x1a5e, 1},
-		{0x1a60, 0x1a7c, 1},
-		{0x1a7f, 0x1ab0, 49},
-		{0x1ab1, 0x1abe, 1},
-		{0x1b00, 0x1b04, 1},
-		{0x1b34, 0x1b44, 1},
-		{0x1b6b, 0x1b73, 1},
-		{0x1b80, 0x1b82, 1},
-		{0x1ba1, 0x1bad, 1},
-		{0x1be6, 0x1bf3, 1},
-		{0x1c24, 0x1c37, 1},
-		{0x1cd0, 0x1cd2, 1},
-		{0x1cd4, 0x1ce8, 1},
-		{0x1ced, 0x1cf2, 5},
-		{0x1cf3, 0x1cf4, 1},
-		{0x1cf8, 0x1cf9, 1},
-		{0x1dc0, 0x1df5, 1},
-		{0x1dfc, 0x1dff, 1},
-		{0x20d0, 0x20f0, 1},
-		{0x2cef, 0x2cf1, 1},
-		{0x2d7f, 0x2de0, 97},
-		{0x2de1, 0x2dff, 1},
-		{0x302a, 0x302f, 1},
-		{0x3099, 0x309a, 1},
-		{0xa66f, 0xa672, 1},
-		{0xa674, 0xa67d, 1},
-		{0xa69e, 0xa69f, 1},
-		{0xa6f0, 0xa6f1, 1},
-		{0xa802, 0xa806, 4},
-		{0xa80b, 0xa823, 24},
-		{0xa824, 0xa827, 1},
-		{0xa880, 0xa881, 1},
-		{0xa8b4, 0xa8c4, 1},
-		{0xa8e0, 0xa8f1, 1},
-		{0xa926, 0xa92d, 1},
-		{0xa947, 0xa953, 1},
-		{0xa980, 0xa983, 1},
-		{0xa9b3, 0xa9c0, 1},
-		{0xa9e5, 0xaa29, 68},
-		{0xaa2a, 0xaa36, 1},
-		{0xaa43, 0xaa4c, 9},
-		{0xaa4d, 0xaa7b, 46},
-		{0xaa7c, 0xaa7d, 1},
-		{0xaab0, 0xaab2, 2},
-		{0xaab3, 0xaab4, 1},
-		{0xaab7, 0xaab8, 1},
-		{0xaabe, 0xaabf, 1},
-		{0xaac1, 0xaaeb, 42},
-		{0xaaec, 0xaaef, 1},
-		{0xaaf5, 0xaaf6, 1},
-		{0xabe3, 0xabea, 1},
-		{0xabec, 0xabed, 1},
-		{0xfb1e, 0xfe00, 738},
-		{0xfe01, 0xfe0f, 1},
-		{0xfe20, 0xfe2f, 1},
-	},
-	R32: []Range32{
-		{0x101fd, 0x102e0, 227},
-		{0x10376, 0x1037a, 1},
-		{0x10a01, 0x10a03, 1},
-		{0x10a05, 0x10a06, 1},
-		{0x10a0c, 0x10a0f, 1},
-		{0x10a38, 0x10a3a, 1},
-		{0x10a3f, 0x10ae5, 166},
-		{0x10ae6, 0x11000, 1306},
-		{0x11001, 0x11002, 1},
-		{0x11038, 0x11046, 1},
-		{0x1107f, 0x11082, 1},
-		{0x110b0, 0x110ba, 1},
-		{0x11100, 0x11102, 1},
-		{0x11127, 0x11134, 1},
-		{0x11173, 0x11180, 13},
-		{0x11181, 0x11182, 1},
-		{0x111b3, 0x111c0, 1},
-		{0x111ca, 0x111cc, 1},
-		{0x1122c, 0x11237, 1},
-		{0x112df, 0x112ea, 1},
-		{0x11300, 0x11303, 1},
-		{0x1133c, 0x1133e, 2},
-		{0x1133f, 0x11344, 1},
-		{0x11347, 0x11348, 1},
-		{0x1134b, 0x1134d, 1},
-		{0x11357, 0x11362, 11},
-		{0x11363, 0x11366, 3},
-		{0x11367, 0x1136c, 1},
-		{0x11370, 0x11374, 1},
-		{0x114b0, 0x114c3, 1},
-		{0x115af, 0x115b5, 1},
-		{0x115b8, 0x115c0, 1},
-		{0x115dc, 0x115dd, 1},
-		{0x11630, 0x11640, 1},
-		{0x116ab, 0x116b7, 1},
-		{0x1171d, 0x1172b, 1},
-		{0x16af0, 0x16af4, 1},
-		{0x16b30, 0x16b36, 1},
-		{0x16f51, 0x16f7e, 1},
-		{0x16f8f, 0x16f92, 1},
-		{0x1bc9d, 0x1bc9e, 1},
-		{0x1d165, 0x1d169, 1},
-		{0x1d16d, 0x1d172, 1},
-		{0x1d17b, 0x1d182, 1},
-		{0x1d185, 0x1d18b, 1},
-		{0x1d1aa, 0x1d1ad, 1},
-		{0x1d242, 0x1d244, 1},
-		{0x1da00, 0x1da36, 1},
-		{0x1da3b, 0x1da6c, 1},
-		{0x1da75, 0x1da84, 15},
-		{0x1da9b, 0x1da9f, 1},
-		{0x1daa1, 0x1daaf, 1},
-		{0x1e8d0, 0x1e8d6, 1},
-		{0xe0100, 0xe01ef, 1},
-	},
-}
-
-var _Mc = &RangeTable{
-	R16: []Range16{
-		{0x0903, 0x093b, 56},
-		{0x093e, 0x0940, 1},
-		{0x0949, 0x094c, 1},
-		{0x094e, 0x094f, 1},
-		{0x0982, 0x0983, 1},
-		{0x09be, 0x09c0, 1},
-		{0x09c7, 0x09c8, 1},
-		{0x09cb, 0x09cc, 1},
-		{0x09d7, 0x0a03, 44},
-		{0x0a3e, 0x0a40, 1},
-		{0x0a83, 0x0abe, 59},
-		{0x0abf, 0x0ac0, 1},
-		{0x0ac9, 0x0acb, 2},
-		{0x0acc, 0x0b02, 54},
-		{0x0b03, 0x0b3e, 59},
-		{0x0b40, 0x0b47, 7},
-		{0x0b48, 0x0b4b, 3},
-		{0x0b4c, 0x0b57, 11},
-		{0x0bbe, 0x0bbf, 1},
-		{0x0bc1, 0x0bc2, 1},
-		{0x0bc6, 0x0bc8, 1},
-		{0x0bca, 0x0bcc, 1},
-		{0x0bd7, 0x0c01, 42},
-		{0x0c02, 0x0c03, 1},
-		{0x0c41, 0x0c44, 1},
-		{0x0c82, 0x0c83, 1},
-		{0x0cbe, 0x0cc0, 2},
-		{0x0cc1, 0x0cc4, 1},
-		{0x0cc7, 0x0cc8, 1},
-		{0x0cca, 0x0ccb, 1},
-		{0x0cd5, 0x0cd6, 1},
-		{0x0d02, 0x0d03, 1},
-		{0x0d3e, 0x0d40, 1},
-		{0x0d46, 0x0d48, 1},
-		{0x0d4a, 0x0d4c, 1},
-		{0x0d57, 0x0d82, 43},
-		{0x0d83, 0x0dcf, 76},
-		{0x0dd0, 0x0dd1, 1},
-		{0x0dd8, 0x0ddf, 1},
-		{0x0df2, 0x0df3, 1},
-		{0x0f3e, 0x0f3f, 1},
-		{0x0f7f, 0x102b, 172},
-		{0x102c, 0x1031, 5},
-		{0x1038, 0x103b, 3},
-		{0x103c, 0x1056, 26},
-		{0x1057, 0x1062, 11},
-		{0x1063, 0x1064, 1},
-		{0x1067, 0x106d, 1},
-		{0x1083, 0x1084, 1},
-		{0x1087, 0x108c, 1},
-		{0x108f, 0x109a, 11},
-		{0x109b, 0x109c, 1},
-		{0x17b6, 0x17be, 8},
-		{0x17bf, 0x17c5, 1},
-		{0x17c7, 0x17c8, 1},
-		{0x1923, 0x1926, 1},
-		{0x1929, 0x192b, 1},
-		{0x1930, 0x1931, 1},
-		{0x1933, 0x1938, 1},
-		{0x1a19, 0x1a1a, 1},
-		{0x1a55, 0x1a57, 2},
-		{0x1a61, 0x1a63, 2},
-		{0x1a64, 0x1a6d, 9},
-		{0x1a6e, 0x1a72, 1},
-		{0x1b04, 0x1b35, 49},
-		{0x1b3b, 0x1b3d, 2},
-		{0x1b3e, 0x1b41, 1},
-		{0x1b43, 0x1b44, 1},
-		{0x1b82, 0x1ba1, 31},
-		{0x1ba6, 0x1ba7, 1},
-		{0x1baa, 0x1be7, 61},
-		{0x1bea, 0x1bec, 1},
-		{0x1bee, 0x1bf2, 4},
-		{0x1bf3, 0x1c24, 49},
-		{0x1c25, 0x1c2b, 1},
-		{0x1c34, 0x1c35, 1},
-		{0x1ce1, 0x1cf2, 17},
-		{0x1cf3, 0x302e, 4923},
-		{0x302f, 0xa823, 30708},
-		{0xa824, 0xa827, 3},
-		{0xa880, 0xa881, 1},
-		{0xa8b4, 0xa8c3, 1},
-		{0xa952, 0xa953, 1},
-		{0xa983, 0xa9b4, 49},
-		{0xa9b5, 0xa9ba, 5},
-		{0xa9bb, 0xa9bd, 2},
-		{0xa9be, 0xa9c0, 1},
-		{0xaa2f, 0xaa30, 1},
-		{0xaa33, 0xaa34, 1},
-		{0xaa4d, 0xaa7b, 46},
-		{0xaa7d, 0xaaeb, 110},
-		{0xaaee, 0xaaef, 1},
-		{0xaaf5, 0xabe3, 238},
-		{0xabe4, 0xabe6, 2},
-		{0xabe7, 0xabe9, 2},
-		{0xabea, 0xabec, 2},
-	},
-	R32: []Range32{
-		{0x11000, 0x11002, 2},
-		{0x11082, 0x110b0, 46},
-		{0x110b1, 0x110b2, 1},
-		{0x110b7, 0x110b8, 1},
-		{0x1112c, 0x11182, 86},
-		{0x111b3, 0x111b5, 1},
-		{0x111bf, 0x111c0, 1},
-		{0x1122c, 0x1122e, 1},
-		{0x11232, 0x11233, 1},
-		{0x11235, 0x112e0, 171},
-		{0x112e1, 0x112e2, 1},
-		{0x11302, 0x11303, 1},
-		{0x1133e, 0x1133f, 1},
-		{0x11341, 0x11344, 1},
-		{0x11347, 0x11348, 1},
-		{0x1134b, 0x1134d, 1},
-		{0x11357, 0x11362, 11},
-		{0x11363, 0x114b0, 333},
-		{0x114b1, 0x114b2, 1},
-		{0x114b9, 0x114bb, 2},
-		{0x114bc, 0x114be, 1},
-		{0x114c1, 0x115af, 238},
-		{0x115b0, 0x115b1, 1},
-		{0x115b8, 0x115bb, 1},
-		{0x115be, 0x11630, 114},
-		{0x11631, 0x11632, 1},
-		{0x1163b, 0x1163c, 1},
-		{0x1163e, 0x116ac, 110},
-		{0x116ae, 0x116af, 1},
-		{0x116b6, 0x11720, 106},
-		{0x11721, 0x11726, 5},
-		{0x16f51, 0x16f7e, 1},
-		{0x1d165, 0x1d166, 1},
-		{0x1d16d, 0x1d172, 1},
-	},
-}
-
-var _Me = &RangeTable{
-	R16: []Range16{
-		{0x0488, 0x0489, 1},
-		{0x1abe, 0x20dd, 1567},
-		{0x20de, 0x20e0, 1},
-		{0x20e2, 0x20e4, 1},
-		{0xa670, 0xa672, 1},
-	},
-}
-
-var _Mn = &RangeTable{
-	R16: []Range16{
-		{0x0300, 0x036f, 1},
-		{0x0483, 0x0487, 1},
-		{0x0591, 0x05bd, 1},
-		{0x05bf, 0x05c1, 2},
-		{0x05c2, 0x05c4, 2},
-		{0x05c5, 0x05c7, 2},
-		{0x0610, 0x061a, 1},
-		{0x064b, 0x065f, 1},
-		{0x0670, 0x06d6, 102},
-		{0x06d7, 0x06dc, 1},
-		{0x06df, 0x06e4, 1},
-		{0x06e7, 0x06e8, 1},
-		{0x06ea, 0x06ed, 1},
-		{0x0711, 0x0730, 31},
-		{0x0731, 0x074a, 1},
-		{0x07a6, 0x07b0, 1},
-		{0x07eb, 0x07f3, 1},
-		{0x0816, 0x0819, 1},
-		{0x081b, 0x0823, 1},
-		{0x0825, 0x0827, 1},
-		{0x0829, 0x082d, 1},
-		{0x0859, 0x085b, 1},
-		{0x08e3, 0x0902, 1},
-		{0x093a, 0x093c, 2},
-		{0x0941, 0x0948, 1},
-		{0x094d, 0x0951, 4},
-		{0x0952, 0x0957, 1},
-		{0x0962, 0x0963, 1},
-		{0x0981, 0x09bc, 59},
-		{0x09c1, 0x09c4, 1},
-		{0x09cd, 0x09e2, 21},
-		{0x09e3, 0x0a01, 30},
-		{0x0a02, 0x0a3c, 58},
-		{0x0a41, 0x0a42, 1},
-		{0x0a47, 0x0a48, 1},
-		{0x0a4b, 0x0a4d, 1},
-		{0x0a51, 0x0a70, 31},
-		{0x0a71, 0x0a75, 4},
-		{0x0a81, 0x0a82, 1},
-		{0x0abc, 0x0ac1, 5},
-		{0x0ac2, 0x0ac5, 1},
-		{0x0ac7, 0x0ac8, 1},
-		{0x0acd, 0x0ae2, 21},
-		{0x0ae3, 0x0b01, 30},
-		{0x0b3c, 0x0b3f, 3},
-		{0x0b41, 0x0b44, 1},
-		{0x0b4d, 0x0b56, 9},
-		{0x0b62, 0x0b63, 1},
-		{0x0b82, 0x0bc0, 62},
-		{0x0bcd, 0x0c00, 51},
-		{0x0c3e, 0x0c40, 1},
-		{0x0c46, 0x0c48, 1},
-		{0x0c4a, 0x0c4d, 1},
-		{0x0c55, 0x0c56, 1},
-		{0x0c62, 0x0c63, 1},
-		{0x0c81, 0x0cbc, 59},
-		{0x0cbf, 0x0cc6, 7},
-		{0x0ccc, 0x0ccd, 1},
-		{0x0ce2, 0x0ce3, 1},
-		{0x0d01, 0x0d41, 64},
-		{0x0d42, 0x0d44, 1},
-		{0x0d4d, 0x0d62, 21},
-		{0x0d63, 0x0dca, 103},
-		{0x0dd2, 0x0dd4, 1},
-		{0x0dd6, 0x0e31, 91},
-		{0x0e34, 0x0e3a, 1},
-		{0x0e47, 0x0e4e, 1},
-		{0x0eb1, 0x0eb4, 3},
-		{0x0eb5, 0x0eb9, 1},
-		{0x0ebb, 0x0ebc, 1},
-		{0x0ec8, 0x0ecd, 1},
-		{0x0f18, 0x0f19, 1},
-		{0x0f35, 0x0f39, 2},
-		{0x0f71, 0x0f7e, 1},
-		{0x0f80, 0x0f84, 1},
-		{0x0f86, 0x0f87, 1},
-		{0x0f8d, 0x0f97, 1},
-		{0x0f99, 0x0fbc, 1},
-		{0x0fc6, 0x102d, 103},
-		{0x102e, 0x1030, 1},
-		{0x1032, 0x1037, 1},
-		{0x1039, 0x103a, 1},
-		{0x103d, 0x103e, 1},
-		{0x1058, 0x1059, 1},
-		{0x105e, 0x1060, 1},
-		{0x1071, 0x1074, 1},
-		{0x1082, 0x1085, 3},
-		{0x1086, 0x108d, 7},
-		{0x109d, 0x135d, 704},
-		{0x135e, 0x135f, 1},
-		{0x1712, 0x1714, 1},
-		{0x1732, 0x1734, 1},
-		{0x1752, 0x1753, 1},
-		{0x1772, 0x1773, 1},
-		{0x17b4, 0x17b5, 1},
-		{0x17b7, 0x17bd, 1},
-		{0x17c6, 0x17c9, 3},
-		{0x17ca, 0x17d3, 1},
-		{0x17dd, 0x180b, 46},
-		{0x180c, 0x180d, 1},
-		{0x18a9, 0x1920, 119},
-		{0x1921, 0x1922, 1},
-		{0x1927, 0x1928, 1},
-		{0x1932, 0x1939, 7},
-		{0x193a, 0x193b, 1},
-		{0x1a17, 0x1a18, 1},
-		{0x1a1b, 0x1a56, 59},
-		{0x1a58, 0x1a5e, 1},
-		{0x1a60, 0x1a62, 2},
-		{0x1a65, 0x1a6c, 1},
-		{0x1a73, 0x1a7c, 1},
-		{0x1a7f, 0x1ab0, 49},
-		{0x1ab1, 0x1abd, 1},
-		{0x1b00, 0x1b03, 1},
-		{0x1b34, 0x1b36, 2},
-		{0x1b37, 0x1b3a, 1},
-		{0x1b3c, 0x1b42, 6},
-		{0x1b6b, 0x1b73, 1},
-		{0x1b80, 0x1b81, 1},
-		{0x1ba2, 0x1ba5, 1},
-		{0x1ba8, 0x1ba9, 1},
-		{0x1bab, 0x1bad, 1},
-		{0x1be6, 0x1be8, 2},
-		{0x1be9, 0x1bed, 4},
-		{0x1bef, 0x1bf1, 1},
-		{0x1c2c, 0x1c33, 1},
-		{0x1c36, 0x1c37, 1},
-		{0x1cd0, 0x1cd2, 1},
-		{0x1cd4, 0x1ce0, 1},
-		{0x1ce2, 0x1ce8, 1},
-		{0x1ced, 0x1cf4, 7},
-		{0x1cf8, 0x1cf9, 1},
-		{0x1dc0, 0x1df5, 1},
-		{0x1dfc, 0x1dff, 1},
-		{0x20d0, 0x20dc, 1},
-		{0x20e1, 0x20e5, 4},
-		{0x20e6, 0x20f0, 1},
-		{0x2cef, 0x2cf1, 1},
-		{0x2d7f, 0x2de0, 97},
-		{0x2de1, 0x2dff, 1},
-		{0x302a, 0x302d, 1},
-		{0x3099, 0x309a, 1},
-		{0xa66f, 0xa674, 5},
-		{0xa675, 0xa67d, 1},
-		{0xa69e, 0xa69f, 1},
-		{0xa6f0, 0xa6f1, 1},
-		{0xa802, 0xa806, 4},
-		{0xa80b, 0xa825, 26},
-		{0xa826, 0xa8c4, 158},
-		{0xa8e0, 0xa8f1, 1},
-		{0xa926, 0xa92d, 1},
-		{0xa947, 0xa951, 1},
-		{0xa980, 0xa982, 1},
-		{0xa9b3, 0xa9b6, 3},
-		{0xa9b7, 0xa9b9, 1},
-		{0xa9bc, 0xa9e5, 41},
-		{0xaa29, 0xaa2e, 1},
-		{0xaa31, 0xaa32, 1},
-		{0xaa35, 0xaa36, 1},
-		{0xaa43, 0xaa4c, 9},
-		{0xaa7c, 0xaab0, 52},
-		{0xaab2, 0xaab4, 1},
-		{0xaab7, 0xaab8, 1},
-		{0xaabe, 0xaabf, 1},
-		{0xaac1, 0xaaec, 43},
-		{0xaaed, 0xaaf6, 9},
-		{0xabe5, 0xabe8, 3},
-		{0xabed, 0xfb1e, 20273},
-		{0xfe00, 0xfe0f, 1},
-		{0xfe20, 0xfe2f, 1},
-	},
-	R32: []Range32{
-		{0x101fd, 0x102e0, 227},
-		{0x10376, 0x1037a, 1},
-		{0x10a01, 0x10a03, 1},
-		{0x10a05, 0x10a06, 1},
-		{0x10a0c, 0x10a0f, 1},
-		{0x10a38, 0x10a3a, 1},
-		{0x10a3f, 0x10ae5, 166},
-		{0x10ae6, 0x11001, 1307},
-		{0x11038, 0x11046, 1},
-		{0x1107f, 0x11081, 1},
-		{0x110b3, 0x110b6, 1},
-		{0x110b9, 0x110ba, 1},
-		{0x11100, 0x11102, 1},
-		{0x11127, 0x1112b, 1},
-		{0x1112d, 0x11134, 1},
-		{0x11173, 0x11180, 13},
-		{0x11181, 0x111b6, 53},
-		{0x111b7, 0x111be, 1},
-		{0x111ca, 0x111cc, 1},
-		{0x1122f, 0x11231, 1},
-		{0x11234, 0x11236, 2},
-		{0x11237, 0x112df, 168},
-		{0x112e3, 0x112ea, 1},
-		{0x11300, 0x11301, 1},
-		{0x1133c, 0x11340, 4},
-		{0x11366, 0x1136c, 1},
-		{0x11370, 0x11374, 1},
-		{0x114b3, 0x114b8, 1},
-		{0x114ba, 0x114bf, 5},
-		{0x114c0, 0x114c2, 2},
-		{0x114c3, 0x115b2, 239},
-		{0x115b3, 0x115b5, 1},
-		{0x115bc, 0x115bd, 1},
-		{0x115bf, 0x115c0, 1},
-		{0x115dc, 0x115dd, 1},
-		{0x11633, 0x1163a, 1},
-		{0x1163d, 0x1163f, 2},
-		{0x11640, 0x116ab, 107},
-		{0x116ad, 0x116b0, 3},
-		{0x116b1, 0x116b5, 1},
-		{0x116b7, 0x1171d, 102},
-		{0x1171e, 0x1171f, 1},
-		{0x11722, 0x11725, 1},
-		{0x11727, 0x1172b, 1},
-		{0x16af0, 0x16af4, 1},
-		{0x16b30, 0x16b36, 1},
-		{0x16f8f, 0x16f92, 1},
-		{0x1bc9d, 0x1bc9e, 1},
-		{0x1d167, 0x1d169, 1},
-		{0x1d17b, 0x1d182, 1},
-		{0x1d185, 0x1d18b, 1},
-		{0x1d1aa, 0x1d1ad, 1},
-		{0x1d242, 0x1d244, 1},
-		{0x1da00, 0x1da36, 1},
-		{0x1da3b, 0x1da6c, 1},
-		{0x1da75, 0x1da84, 15},
-		{0x1da9b, 0x1da9f, 1},
-		{0x1daa1, 0x1daaf, 1},
-		{0x1e8d0, 0x1e8d6, 1},
-		{0xe0100, 0xe01ef, 1},
-	},
-}
-
-var _N = &RangeTable{
-	R16: []Range16{
-		{0x0030, 0x0039, 1},
-		{0x00b2, 0x00b3, 1},
-		{0x00b9, 0x00bc, 3},
-		{0x00bd, 0x00be, 1},
-		{0x0660, 0x0669, 1},
-		{0x06f0, 0x06f9, 1},
-		{0x07c0, 0x07c9, 1},
-		{0x0966, 0x096f, 1},
-		{0x09e6, 0x09ef, 1},
-		{0x09f4, 0x09f9, 1},
-		{0x0a66, 0x0a6f, 1},
-		{0x0ae6, 0x0aef, 1},
-		{0x0b66, 0x0b6f, 1},
-		{0x0b72, 0x0b77, 1},
-		{0x0be6, 0x0bf2, 1},
-		{0x0c66, 0x0c6f, 1},
-		{0x0c78, 0x0c7e, 1},
-		{0x0ce6, 0x0cef, 1},
-		{0x0d66, 0x0d75, 1},
-		{0x0de6, 0x0def, 1},
-		{0x0e50, 0x0e59, 1},
-		{0x0ed0, 0x0ed9, 1},
-		{0x0f20, 0x0f33, 1},
-		{0x1040, 0x1049, 1},
-		{0x1090, 0x1099, 1},
-		{0x1369, 0x137c, 1},
-		{0x16ee, 0x16f0, 1},
-		{0x17e0, 0x17e9, 1},
-		{0x17f0, 0x17f9, 1},
-		{0x1810, 0x1819, 1},
-		{0x1946, 0x194f, 1},
-		{0x19d0, 0x19da, 1},
-		{0x1a80, 0x1a89, 1},
-		{0x1a90, 0x1a99, 1},
-		{0x1b50, 0x1b59, 1},
-		{0x1bb0, 0x1bb9, 1},
-		{0x1c40, 0x1c49, 1},
-		{0x1c50, 0x1c59, 1},
-		{0x2070, 0x2074, 4},
-		{0x2075, 0x2079, 1},
-		{0x2080, 0x2089, 1},
-		{0x2150, 0x2182, 1},
-		{0x2185, 0x2189, 1},
-		{0x2460, 0x249b, 1},
-		{0x24ea, 0x24ff, 1},
-		{0x2776, 0x2793, 1},
-		{0x2cfd, 0x3007, 778},
-		{0x3021, 0x3029, 1},
-		{0x3038, 0x303a, 1},
-		{0x3192, 0x3195, 1},
-		{0x3220, 0x3229, 1},
-		{0x3248, 0x324f, 1},
-		{0x3251, 0x325f, 1},
-		{0x3280, 0x3289, 1},
-		{0x32b1, 0x32bf, 1},
-		{0xa620, 0xa629, 1},
-		{0xa6e6, 0xa6ef, 1},
-		{0xa830, 0xa835, 1},
-		{0xa8d0, 0xa8d9, 1},
-		{0xa900, 0xa909, 1},
-		{0xa9d0, 0xa9d9, 1},
-		{0xa9f0, 0xa9f9, 1},
-		{0xaa50, 0xaa59, 1},
-		{0xabf0, 0xabf9, 1},
-		{0xff10, 0xff19, 1},
-	},
-	R32: []Range32{
-		{0x10107, 0x10133, 1},
-		{0x10140, 0x10178, 1},
-		{0x1018a, 0x1018b, 1},
-		{0x102e1, 0x102fb, 1},
-		{0x10320, 0x10323, 1},
-		{0x10341, 0x1034a, 9},
-		{0x103d1, 0x103d5, 1},
-		{0x104a0, 0x104a9, 1},
-		{0x10858, 0x1085f, 1},
-		{0x10879, 0x1087f, 1},
-		{0x108a7, 0x108af, 1},
-		{0x108fb, 0x108ff, 1},
-		{0x10916, 0x1091b, 1},
-		{0x109bc, 0x109bd, 1},
-		{0x109c0, 0x109cf, 1},
-		{0x109d2, 0x109ff, 1},
-		{0x10a40, 0x10a47, 1},
-		{0x10a7d, 0x10a7e, 1},
-		{0x10a9d, 0x10a9f, 1},
-		{0x10aeb, 0x10aef, 1},
-		{0x10b58, 0x10b5f, 1},
-		{0x10b78, 0x10b7f, 1},
-		{0x10ba9, 0x10baf, 1},
-		{0x10cfa, 0x10cff, 1},
-		{0x10e60, 0x10e7e, 1},
-		{0x11052, 0x1106f, 1},
-		{0x110f0, 0x110f9, 1},
-		{0x11136, 0x1113f, 1},
-		{0x111d0, 0x111d9, 1},
-		{0x111e1, 0x111f4, 1},
-		{0x112f0, 0x112f9, 1},
-		{0x114d0, 0x114d9, 1},
-		{0x11650, 0x11659, 1},
-		{0x116c0, 0x116c9, 1},
-		{0x11730, 0x1173b, 1},
-		{0x118e0, 0x118f2, 1},
-		{0x12400, 0x1246e, 1},
-		{0x16a60, 0x16a69, 1},
-		{0x16b50, 0x16b59, 1},
-		{0x16b5b, 0x16b61, 1},
-		{0x1d360, 0x1d371, 1},
-		{0x1d7ce, 0x1d7ff, 1},
-		{0x1e8c7, 0x1e8cf, 1},
-		{0x1f100, 0x1f10c, 1},
-	},
-	LatinOffset: 4,
-}
-
-var _Nd = &RangeTable{
-	R16: []Range16{
-		{0x0030, 0x0039, 1},
-		{0x0660, 0x0669, 1},
-		{0x06f0, 0x06f9, 1},
-		{0x07c0, 0x07c9, 1},
-		{0x0966, 0x096f, 1},
-		{0x09e6, 0x09ef, 1},
-		{0x0a66, 0x0a6f, 1},
-		{0x0ae6, 0x0aef, 1},
-		{0x0b66, 0x0b6f, 1},
-		{0x0be6, 0x0bef, 1},
-		{0x0c66, 0x0c6f, 1},
-		{0x0ce6, 0x0cef, 1},
-		{0x0d66, 0x0d6f, 1},
-		{0x0de6, 0x0def, 1},
-		{0x0e50, 0x0e59, 1},
-		{0x0ed0, 0x0ed9, 1},
-		{0x0f20, 0x0f29, 1},
-		{0x1040, 0x1049, 1},
-		{0x1090, 0x1099, 1},
-		{0x17e0, 0x17e9, 1},
-		{0x1810, 0x1819, 1},
-		{0x1946, 0x194f, 1},
-		{0x19d0, 0x19d9, 1},
-		{0x1a80, 0x1a89, 1},
-		{0x1a90, 0x1a99, 1},
-		{0x1b50, 0x1b59, 1},
-		{0x1bb0, 0x1bb9, 1},
-		{0x1c40, 0x1c49, 1},
-		{0x1c50, 0x1c59, 1},
-		{0xa620, 0xa629, 1},
-		{0xa8d0, 0xa8d9, 1},
-		{0xa900, 0xa909, 1},
-		{0xa9d0, 0xa9d9, 1},
-		{0xa9f0, 0xa9f9, 1},
-		{0xaa50, 0xaa59, 1},
-		{0xabf0, 0xabf9, 1},
-		{0xff10, 0xff19, 1},
-	},
-	R32: []Range32{
-		{0x104a0, 0x104a9, 1},
-		{0x11066, 0x1106f, 1},
-		{0x110f0, 0x110f9, 1},
-		{0x11136, 0x1113f, 1},
-		{0x111d0, 0x111d9, 1},
-		{0x112f0, 0x112f9, 1},
-		{0x114d0, 0x114d9, 1},
-		{0x11650, 0x11659, 1},
-		{0x116c0, 0x116c9, 1},
-		{0x11730, 0x11739, 1},
-		{0x118e0, 0x118e9, 1},
-		{0x16a60, 0x16a69, 1},
-		{0x16b50, 0x16b59, 1},
-		{0x1d7ce, 0x1d7ff, 1},
-	},
-	LatinOffset: 1,
-}
-
-var _Nl = &RangeTable{
-	R16: []Range16{
-		{0x16ee, 0x16f0, 1},
-		{0x2160, 0x2182, 1},
-		{0x2185, 0x2188, 1},
-		{0x3007, 0x3021, 26},
-		{0x3022, 0x3029, 1},
-		{0x3038, 0x303a, 1},
-		{0xa6e6, 0xa6ef, 1},
-	},
-	R32: []Range32{
-		{0x10140, 0x10174, 1},
-		{0x10341, 0x1034a, 9},
-		{0x103d1, 0x103d5, 1},
-		{0x12400, 0x1246e, 1},
-	},
-}
-
-var _No = &RangeTable{
-	R16: []Range16{
-		{0x00b2, 0x00b3, 1},
-		{0x00b9, 0x00bc, 3},
-		{0x00bd, 0x00be, 1},
-		{0x09f4, 0x09f9, 1},
-		{0x0b72, 0x0b77, 1},
-		{0x0bf0, 0x0bf2, 1},
-		{0x0c78, 0x0c7e, 1},
-		{0x0d70, 0x0d75, 1},
-		{0x0f2a, 0x0f33, 1},
-		{0x1369, 0x137c, 1},
-		{0x17f0, 0x17f9, 1},
-		{0x19da, 0x2070, 1686},
-		{0x2074, 0x2079, 1},
-		{0x2080, 0x2089, 1},
-		{0x2150, 0x215f, 1},
-		{0x2189, 0x2460, 727},
-		{0x2461, 0x249b, 1},
-		{0x24ea, 0x24ff, 1},
-		{0x2776, 0x2793, 1},
-		{0x2cfd, 0x3192, 1173},
-		{0x3193, 0x3195, 1},
-		{0x3220, 0x3229, 1},
-		{0x3248, 0x324f, 1},
-		{0x3251, 0x325f, 1},
-		{0x3280, 0x3289, 1},
-		{0x32b1, 0x32bf, 1},
-		{0xa830, 0xa835, 1},
-	},
-	R32: []Range32{
-		{0x10107, 0x10133, 1},
-		{0x10175, 0x10178, 1},
-		{0x1018a, 0x1018b, 1},
-		{0x102e1, 0x102fb, 1},
-		{0x10320, 0x10323, 1},
-		{0x10858, 0x1085f, 1},
-		{0x10879, 0x1087f, 1},
-		{0x108a7, 0x108af, 1},
-		{0x108fb, 0x108ff, 1},
-		{0x10916, 0x1091b, 1},
-		{0x109bc, 0x109bd, 1},
-		{0x109c0, 0x109cf, 1},
-		{0x109d2, 0x109ff, 1},
-		{0x10a40, 0x10a47, 1},
-		{0x10a7d, 0x10a7e, 1},
-		{0x10a9d, 0x10a9f, 1},
-		{0x10aeb, 0x10aef, 1},
-		{0x10b58, 0x10b5f, 1},
-		{0x10b78, 0x10b7f, 1},
-		{0x10ba9, 0x10baf, 1},
-		{0x10cfa, 0x10cff, 1},
-		{0x10e60, 0x10e7e, 1},
-		{0x11052, 0x11065, 1},
-		{0x111e1, 0x111f4, 1},
-		{0x1173a, 0x1173b, 1},
-		{0x118ea, 0x118f2, 1},
-		{0x16b5b, 0x16b61, 1},
-		{0x1d360, 0x1d371, 1},
-		{0x1e8c7, 0x1e8cf, 1},
-		{0x1f100, 0x1f10c, 1},
-	},
-	LatinOffset: 3,
-}
-
-var _P = &RangeTable{
-	R16: []Range16{
-		{0x0021, 0x0023, 1},
-		{0x0025, 0x002a, 1},
-		{0x002c, 0x002f, 1},
-		{0x003a, 0x003b, 1},
-		{0x003f, 0x0040, 1},
-		{0x005b, 0x005d, 1},
-		{0x005f, 0x007b, 28},
-		{0x007d, 0x00a1, 36},
-		{0x00a7, 0x00ab, 4},
-		{0x00b6, 0x00b7, 1},
-		{0x00bb, 0x00bf, 4},
-		{0x037e, 0x0387, 9},
-		{0x055a, 0x055f, 1},
-		{0x0589, 0x058a, 1},
-		{0x05be, 0x05c0, 2},
-		{0x05c3, 0x05c6, 3},
-		{0x05f3, 0x05f4, 1},
-		{0x0609, 0x060a, 1},
-		{0x060c, 0x060d, 1},
-		{0x061b, 0x061e, 3},
-		{0x061f, 0x066a, 75},
-		{0x066b, 0x066d, 1},
-		{0x06d4, 0x0700, 44},
-		{0x0701, 0x070d, 1},
-		{0x07f7, 0x07f9, 1},
-		{0x0830, 0x083e, 1},
-		{0x085e, 0x0964, 262},
-		{0x0965, 0x0970, 11},
-		{0x0af0, 0x0df4, 772},
-		{0x0e4f, 0x0e5a, 11},
-		{0x0e5b, 0x0f04, 169},
-		{0x0f05, 0x0f12, 1},
-		{0x0f14, 0x0f3a, 38},
-		{0x0f3b, 0x0f3d, 1},
-		{0x0f85, 0x0fd0, 75},
-		{0x0fd1, 0x0fd4, 1},
-		{0x0fd9, 0x0fda, 1},
-		{0x104a, 0x104f, 1},
-		{0x10fb, 0x1360, 613},
-		{0x1361, 0x1368, 1},
-		{0x1400, 0x166d, 621},
-		{0x166e, 0x169b, 45},
-		{0x169c, 0x16eb, 79},
-		{0x16ec, 0x16ed, 1},
-		{0x1735, 0x1736, 1},
-		{0x17d4, 0x17d6, 1},
-		{0x17d8, 0x17da, 1},
-		{0x1800, 0x180a, 1},
-		{0x1944, 0x1945, 1},
-		{0x1a1e, 0x1a1f, 1},
-		{0x1aa0, 0x1aa6, 1},
-		{0x1aa8, 0x1aad, 1},
-		{0x1b5a, 0x1b60, 1},
-		{0x1bfc, 0x1bff, 1},
-		{0x1c3b, 0x1c3f, 1},
-		{0x1c7e, 0x1c7f, 1},
-		{0x1cc0, 0x1cc7, 1},
-		{0x1cd3, 0x2010, 829},
-		{0x2011, 0x2027, 1},
-		{0x2030, 0x2043, 1},
-		{0x2045, 0x2051, 1},
-		{0x2053, 0x205e, 1},
-		{0x207d, 0x207e, 1},
-		{0x208d, 0x208e, 1},
-		{0x2308, 0x230b, 1},
-		{0x2329, 0x232a, 1},
-		{0x2768, 0x2775, 1},
-		{0x27c5, 0x27c6, 1},
-		{0x27e6, 0x27ef, 1},
-		{0x2983, 0x2998, 1},
-		{0x29d8, 0x29db, 1},
-		{0x29fc, 0x29fd, 1},
-		{0x2cf9, 0x2cfc, 1},
-		{0x2cfe, 0x2cff, 1},
-		{0x2d70, 0x2e00, 144},
-		{0x2e01, 0x2e2e, 1},
-		{0x2e30, 0x2e42, 1},
-		{0x3001, 0x3003, 1},
-		{0x3008, 0x3011, 1},
-		{0x3014, 0x301f, 1},
-		{0x3030, 0x303d, 13},
-		{0x30a0, 0x30fb, 91},
-		{0xa4fe, 0xa4ff, 1},
-		{0xa60d, 0xa60f, 1},
-		{0xa673, 0xa67e, 11},
-		{0xa6f2, 0xa6f7, 1},
-		{0xa874, 0xa877, 1},
-		{0xa8ce, 0xa8cf, 1},
-		{0xa8f8, 0xa8fa, 1},
-		{0xa8fc, 0xa92e, 50},
-		{0xa92f, 0xa95f, 48},
-		{0xa9c1, 0xa9cd, 1},
-		{0xa9de, 0xa9df, 1},
-		{0xaa5c, 0xaa5f, 1},
-		{0xaade, 0xaadf, 1},
-		{0xaaf0, 0xaaf1, 1},
-		{0xabeb, 0xfd3e, 20819},
-		{0xfd3f, 0xfe10, 209},
-		{0xfe11, 0xfe19, 1},
-		{0xfe30, 0xfe52, 1},
-		{0xfe54, 0xfe61, 1},
-		{0xfe63, 0xfe68, 5},
-		{0xfe6a, 0xfe6b, 1},
-		{0xff01, 0xff03, 1},
-		{0xff05, 0xff0a, 1},
-		{0xff0c, 0xff0f, 1},
-		{0xff1a, 0xff1b, 1},
-		{0xff1f, 0xff20, 1},
-		{0xff3b, 0xff3d, 1},
-		{0xff3f, 0xff5b, 28},
-		{0xff5d, 0xff5f, 2},
-		{0xff60, 0xff65, 1},
-	},
-	R32: []Range32{
-		{0x10100, 0x10102, 1},
-		{0x1039f, 0x103d0, 49},
-		{0x1056f, 0x10857, 744},
-		{0x1091f, 0x1093f, 32},
-		{0x10a50, 0x10a58, 1},
-		{0x10a7f, 0x10af0, 113},
-		{0x10af1, 0x10af6, 1},
-		{0x10b39, 0x10b3f, 1},
-		{0x10b99, 0x10b9c, 1},
-		{0x11047, 0x1104d, 1},
-		{0x110bb, 0x110bc, 1},
-		{0x110be, 0x110c1, 1},
-		{0x11140, 0x11143, 1},
-		{0x11174, 0x11175, 1},
-		{0x111c5, 0x111c9, 1},
-		{0x111cd, 0x111db, 14},
-		{0x111dd, 0x111df, 1},
-		{0x11238, 0x1123d, 1},
-		{0x112a9, 0x114c6, 541},
-		{0x115c1, 0x115d7, 1},
-		{0x11641, 0x11643, 1},
-		{0x1173c, 0x1173e, 1},
-		{0x12470, 0x12474, 1},
-		{0x16a6e, 0x16a6f, 1},
-		{0x16af5, 0x16b37, 66},
-		{0x16b38, 0x16b3b, 1},
-		{0x16b44, 0x1bc9f, 20827},
-		{0x1da87, 0x1da8b, 1},
-	},
-	LatinOffset: 11,
-}
-
-var _Pc = &RangeTable{
-	R16: []Range16{
-		{0x005f, 0x203f, 8160},
-		{0x2040, 0x2054, 20},
-		{0xfe33, 0xfe34, 1},
-		{0xfe4d, 0xfe4f, 1},
-		{0xff3f, 0xff3f, 1},
-	},
-}
-
-var _Pd = &RangeTable{
-	R16: []Range16{
-		{0x002d, 0x058a, 1373},
-		{0x05be, 0x1400, 3650},
-		{0x1806, 0x2010, 2058},
-		{0x2011, 0x2015, 1},
-		{0x2e17, 0x2e1a, 3},
-		{0x2e3a, 0x2e3b, 1},
-		{0x2e40, 0x301c, 476},
-		{0x3030, 0x30a0, 112},
-		{0xfe31, 0xfe32, 1},
-		{0xfe58, 0xfe63, 11},
-		{0xff0d, 0xff0d, 1},
-	},
-}
-
-var _Pe = &RangeTable{
-	R16: []Range16{
-		{0x0029, 0x005d, 52},
-		{0x007d, 0x0f3b, 3774},
-		{0x0f3d, 0x169c, 1887},
-		{0x2046, 0x207e, 56},
-		{0x208e, 0x2309, 635},
-		{0x230b, 0x232a, 31},
-		{0x2769, 0x2775, 2},
-		{0x27c6, 0x27e7, 33},
-		{0x27e9, 0x27ef, 2},
-		{0x2984, 0x2998, 2},
-		{0x29d9, 0x29db, 2},
-		{0x29fd, 0x2e23, 1062},
-		{0x2e25, 0x2e29, 2},
-		{0x3009, 0x3011, 2},
-		{0x3015, 0x301b, 2},
-		{0x301e, 0x301f, 1},
-		{0xfd3e, 0xfe18, 218},
-		{0xfe36, 0xfe44, 2},
-		{0xfe48, 0xfe5a, 18},
-		{0xfe5c, 0xfe5e, 2},
-		{0xff09, 0xff3d, 52},
-		{0xff5d, 0xff63, 3},
-	},
-	LatinOffset: 1,
-}
-
-var _Pf = &RangeTable{
-	R16: []Range16{
-		{0x00bb, 0x2019, 8030},
-		{0x201d, 0x203a, 29},
-		{0x2e03, 0x2e05, 2},
-		{0x2e0a, 0x2e0d, 3},
-		{0x2e1d, 0x2e21, 4},
-	},
-}
-
-var _Pi = &RangeTable{
-	R16: []Range16{
-		{0x00ab, 0x2018, 8045},
-		{0x201b, 0x201c, 1},
-		{0x201f, 0x2039, 26},
-		{0x2e02, 0x2e04, 2},
-		{0x2e09, 0x2e0c, 3},
-		{0x2e1c, 0x2e20, 4},
-	},
-}
-
-var _Po = &RangeTable{
-	R16: []Range16{
-		{0x0021, 0x0023, 1},
-		{0x0025, 0x0027, 1},
-		{0x002a, 0x002e, 2},
-		{0x002f, 0x003a, 11},
-		{0x003b, 0x003f, 4},
-		{0x0040, 0x005c, 28},
-		{0x00a1, 0x00a7, 6},
-		{0x00b6, 0x00b7, 1},
-		{0x00bf, 0x037e, 703},
-		{0x0387, 0x055a, 467},
-		{0x055b, 0x055f, 1},
-		{0x0589, 0x05c0, 55},
-		{0x05c3, 0x05c6, 3},
-		{0x05f3, 0x05f4, 1},
-		{0x0609, 0x060a, 1},
-		{0x060c, 0x060d, 1},
-		{0x061b, 0x061e, 3},
-		{0x061f, 0x066a, 75},
-		{0x066b, 0x066d, 1},
-		{0x06d4, 0x0700, 44},
-		{0x0701, 0x070d, 1},
-		{0x07f7, 0x07f9, 1},
-		{0x0830, 0x083e, 1},
-		{0x085e, 0x0964, 262},
-		{0x0965, 0x0970, 11},
-		{0x0af0, 0x0df4, 772},
-		{0x0e4f, 0x0e5a, 11},
-		{0x0e5b, 0x0f04, 169},
-		{0x0f05, 0x0f12, 1},
-		{0x0f14, 0x0f85, 113},
-		{0x0fd0, 0x0fd4, 1},
-		{0x0fd9, 0x0fda, 1},
-		{0x104a, 0x104f, 1},
-		{0x10fb, 0x1360, 613},
-		{0x1361, 0x1368, 1},
-		{0x166d, 0x166e, 1},
-		{0x16eb, 0x16ed, 1},
-		{0x1735, 0x1736, 1},
-		{0x17d4, 0x17d6, 1},
-		{0x17d8, 0x17da, 1},
-		{0x1800, 0x1805, 1},
-		{0x1807, 0x180a, 1},
-		{0x1944, 0x1945, 1},
-		{0x1a1e, 0x1a1f, 1},
-		{0x1aa0, 0x1aa6, 1},
-		{0x1aa8, 0x1aad, 1},
-		{0x1b5a, 0x1b60, 1},
-		{0x1bfc, 0x1bff, 1},
-		{0x1c3b, 0x1c3f, 1},
-		{0x1c7e, 0x1c7f, 1},
-		{0x1cc0, 0x1cc7, 1},
-		{0x1cd3, 0x2016, 835},
-		{0x2017, 0x2020, 9},
-		{0x2021, 0x2027, 1},
-		{0x2030, 0x2038, 1},
-		{0x203b, 0x203e, 1},
-		{0x2041, 0x2043, 1},
-		{0x2047, 0x2051, 1},
-		{0x2053, 0x2055, 2},
-		{0x2056, 0x205e, 1},
-		{0x2cf9, 0x2cfc, 1},
-		{0x2cfe, 0x2cff, 1},
-		{0x2d70, 0x2e00, 144},
-		{0x2e01, 0x2e06, 5},
-		{0x2e07, 0x2e08, 1},
-		{0x2e0b, 0x2e0e, 3},
-		{0x2e0f, 0x2e16, 1},
-		{0x2e18, 0x2e19, 1},
-		{0x2e1b, 0x2e1e, 3},
-		{0x2e1f, 0x2e2a, 11},
-		{0x2e2b, 0x2e2e, 1},
-		{0x2e30, 0x2e39, 1},
-		{0x2e3c, 0x2e3f, 1},
-		{0x2e41, 0x3001, 448},
-		{0x3002, 0x3003, 1},
-		{0x303d, 0x30fb, 190},
-		{0xa4fe, 0xa4ff, 1},
-		{0xa60d, 0xa60f, 1},
-		{0xa673, 0xa67e, 11},
-		{0xa6f2, 0xa6f7, 1},
-		{0xa874, 0xa877, 1},
-		{0xa8ce, 0xa8cf, 1},
-		{0xa8f8, 0xa8fa, 1},
-		{0xa8fc, 0xa92e, 50},
-		{0xa92f, 0xa95f, 48},
-		{0xa9c1, 0xa9cd, 1},
-		{0xa9de, 0xa9df, 1},
-		{0xaa5c, 0xaa5f, 1},
-		{0xaade, 0xaadf, 1},
-		{0xaaf0, 0xaaf1, 1},
-		{0xabeb, 0xfe10, 21029},
-		{0xfe11, 0xfe16, 1},
-		{0xfe19, 0xfe30, 23},
-		{0xfe45, 0xfe46, 1},
-		{0xfe49, 0xfe4c, 1},
-		{0xfe50, 0xfe52, 1},
-		{0xfe54, 0xfe57, 1},
-		{0xfe5f, 0xfe61, 1},
-		{0xfe68, 0xfe6a, 2},
-		{0xfe6b, 0xff01, 150},
-		{0xff02, 0xff03, 1},
-		{0xff05, 0xff07, 1},
-		{0xff0a, 0xff0e, 2},
-		{0xff0f, 0xff1a, 11},
-		{0xff1b, 0xff1f, 4},
-		{0xff20, 0xff3c, 28},
-		{0xff61, 0xff64, 3},
-		{0xff65, 0xff65, 1},
-	},
-	R32: []Range32{
-		{0x10100, 0x10100, 1},
-		{0x10101, 0x10102, 1},
-		{0x1039f, 0x103d0, 49},
-		{0x1056f, 0x10857, 744},
-		{0x1091f, 0x1093f, 32},
-		{0x10a50, 0x10a58, 1},
-		{0x10a7f, 0x10af0, 113},
-		{0x10af1, 0x10af6, 1},
-		{0x10b39, 0x10b3f, 1},
-		{0x10b99, 0x10b9c, 1},
-		{0x11047, 0x1104d, 1},
-		{0x110bb, 0x110bc, 1},
-		{0x110be, 0x110c1, 1},
-		{0x11140, 0x11143, 1},
-		{0x11174, 0x11175, 1},
-		{0x111c5, 0x111c9, 1},
-		{0x111cd, 0x111db, 14},
-		{0x111dd, 0x111df, 1},
-		{0x11238, 0x1123d, 1},
-		{0x112a9, 0x114c6, 541},
-		{0x115c1, 0x115d7, 1},
-		{0x11641, 0x11643, 1},
-		{0x1173c, 0x1173e, 1},
-		{0x12470, 0x12474, 1},
-		{0x16a6e, 0x16a6f, 1},
-		{0x16af5, 0x16b37, 66},
-		{0x16b38, 0x16b3b, 1},
-		{0x16b44, 0x1bc9f, 20827},
-		{0x1da87, 0x1da8b, 1},
-	},
-	LatinOffset: 8,
-}
-
-var _Ps = &RangeTable{
-	R16: []Range16{
-		{0x0028, 0x005b, 51},
-		{0x007b, 0x0f3a, 3775},
-		{0x0f3c, 0x169b, 1887},
-		{0x201a, 0x201e, 4},
-		{0x2045, 0x207d, 56},
-		{0x208d, 0x2308, 635},
-		{0x230a, 0x2329, 31},
-		{0x2768, 0x2774, 2},
-		{0x27c5, 0x27e6, 33},
-		{0x27e8, 0x27ee, 2},
-		{0x2983, 0x2997, 2},
-		{0x29d8, 0x29da, 2},
-		{0x29fc, 0x2e22, 1062},
-		{0x2e24, 0x2e28, 2},
-		{0x2e42, 0x3008, 454},
-		{0x300a, 0x3010, 2},
-		{0x3014, 0x301a, 2},
-		{0x301d, 0xfd3f, 52514},
-		{0xfe17, 0xfe35, 30},
-		{0xfe37, 0xfe43, 2},
-		{0xfe47, 0xfe59, 18},
-		{0xfe5b, 0xfe5d, 2},
-		{0xff08, 0xff3b, 51},
-		{0xff5b, 0xff5f, 4},
-		{0xff62, 0xff62, 1},
-	},
-	LatinOffset: 1,
-}
-
-var _S = &RangeTable{
-	R16: []Range16{
-		{0x0024, 0x002b, 7},
-		{0x003c, 0x003e, 1},
-		{0x005e, 0x0060, 2},
-		{0x007c, 0x007e, 2},
-		{0x00a2, 0x00a6, 1},
-		{0x00a8, 0x00a9, 1},
-		{0x00ac, 0x00ae, 2},
-		{0x00af, 0x00b1, 1},
-		{0x00b4, 0x00b8, 4},
-		{0x00d7, 0x00f7, 32},
-		{0x02c2, 0x02c5, 1},
-		{0x02d2, 0x02df, 1},
-		{0x02e5, 0x02eb, 1},
-		{0x02ed, 0x02ef, 2},
-		{0x02f0, 0x02ff, 1},
-		{0x0375, 0x0384, 15},
-		{0x0385, 0x03f6, 113},
-		{0x0482, 0x058d, 267},
-		{0x058e, 0x058f, 1},
-		{0x0606, 0x0608, 1},
-		{0x060b, 0x060e, 3},
-		{0x060f, 0x06de, 207},
-		{0x06e9, 0x06fd, 20},
-		{0x06fe, 0x07f6, 248},
-		{0x09f2, 0x09f3, 1},
-		{0x09fa, 0x09fb, 1},
-		{0x0af1, 0x0b70, 127},
-		{0x0bf3, 0x0bfa, 1},
-		{0x0c7f, 0x0d79, 250},
-		{0x0e3f, 0x0f01, 194},
-		{0x0f02, 0x0f03, 1},
-		{0x0f13, 0x0f15, 2},
-		{0x0f16, 0x0f17, 1},
-		{0x0f1a, 0x0f1f, 1},
-		{0x0f34, 0x0f38, 2},
-		{0x0fbe, 0x0fc5, 1},
-		{0x0fc7, 0x0fcc, 1},
-		{0x0fce, 0x0fcf, 1},
-		{0x0fd5, 0x0fd8, 1},
-		{0x109e, 0x109f, 1},
-		{0x1390, 0x1399, 1},
-		{0x17db, 0x1940, 357},
-		{0x19de, 0x19ff, 1},
-		{0x1b61, 0x1b6a, 1},
-		{0x1b74, 0x1b7c, 1},
-		{0x1fbd, 0x1fbf, 2},
-		{0x1fc0, 0x1fc1, 1},
-		{0x1fcd, 0x1fcf, 1},
-		{0x1fdd, 0x1fdf, 1},
-		{0x1fed, 0x1fef, 1},
-		{0x1ffd, 0x1ffe, 1},
-		{0x2044, 0x2052, 14},
-		{0x207a, 0x207c, 1},
-		{0x208a, 0x208c, 1},
-		{0x20a0, 0x20be, 1},
-		{0x2100, 0x2101, 1},
-		{0x2103, 0x2106, 1},
-		{0x2108, 0x2109, 1},
-		{0x2114, 0x2116, 2},
-		{0x2117, 0x2118, 1},
-		{0x211e, 0x2123, 1},
-		{0x2125, 0x2129, 2},
-		{0x212e, 0x213a, 12},
-		{0x213b, 0x2140, 5},
-		{0x2141, 0x2144, 1},
-		{0x214a, 0x214d, 1},
-		{0x214f, 0x218a, 59},
-		{0x218b, 0x2190, 5},
-		{0x2191, 0x2307, 1},
-		{0x230c, 0x2328, 1},
-		{0x232b, 0x23fa, 1},
-		{0x2400, 0x2426, 1},
-		{0x2440, 0x244a, 1},
-		{0x249c, 0x24e9, 1},
-		{0x2500, 0x2767, 1},
-		{0x2794, 0x27c4, 1},
-		{0x27c7, 0x27e5, 1},
-		{0x27f0, 0x2982, 1},
-		{0x2999, 0x29d7, 1},
-		{0x29dc, 0x29fb, 1},
-		{0x29fe, 0x2b73, 1},
-		{0x2b76, 0x2b95, 1},
-		{0x2b98, 0x2bb9, 1},
-		{0x2bbd, 0x2bc8, 1},
-		{0x2bca, 0x2bd1, 1},
-		{0x2bec, 0x2bef, 1},
-		{0x2ce5, 0x2cea, 1},
-		{0x2e80, 0x2e99, 1},
-		{0x2e9b, 0x2ef3, 1},
-		{0x2f00, 0x2fd5, 1},
-		{0x2ff0, 0x2ffb, 1},
-		{0x3004, 0x3012, 14},
-		{0x3013, 0x3020, 13},
-		{0x3036, 0x3037, 1},
-		{0x303e, 0x303f, 1},
-		{0x309b, 0x309c, 1},
-		{0x3190, 0x3191, 1},
-		{0x3196, 0x319f, 1},
-		{0x31c0, 0x31e3, 1},
-		{0x3200, 0x321e, 1},
-		{0x322a, 0x3247, 1},
-		{0x3250, 0x3260, 16},
-		{0x3261, 0x327f, 1},
-		{0x328a, 0x32b0, 1},
-		{0x32c0, 0x32fe, 1},
-		{0x3300, 0x33ff, 1},
-		{0x4dc0, 0x4dff, 1},
-		{0xa490, 0xa4c6, 1},
-		{0xa700, 0xa716, 1},
-		{0xa720, 0xa721, 1},
-		{0xa789, 0xa78a, 1},
-		{0xa828, 0xa82b, 1},
-		{0xa836, 0xa839, 1},
-		{0xaa77, 0xaa79, 1},
-		{0xab5b, 0xfb29, 20430},
-		{0xfbb2, 0xfbc1, 1},
-		{0xfdfc, 0xfdfd, 1},
-		{0xfe62, 0xfe64, 2},
-		{0xfe65, 0xfe66, 1},
-		{0xfe69, 0xff04, 155},
-		{0xff0b, 0xff1c, 17},
-		{0xff1d, 0xff1e, 1},
-		{0xff3e, 0xff40, 2},
-		{0xff5c, 0xff5e, 2},
-		{0xffe0, 0xffe6, 1},
-		{0xffe8, 0xffee, 1},
-		{0xfffc, 0xfffd, 1},
-	},
-	R32: []Range32{
-		{0x10137, 0x1013f, 1},
-		{0x10179, 0x10189, 1},
-		{0x1018c, 0x10190, 4},
-		{0x10191, 0x1019b, 1},
-		{0x101a0, 0x101d0, 48},
-		{0x101d1, 0x101fc, 1},
-		{0x10877, 0x10878, 1},
-		{0x10ac8, 0x1173f, 3191},
-		{0x16b3c, 0x16b3f, 1},
-		{0x16b45, 0x1bc9c, 20823},
-		{0x1d000, 0x1d0f5, 1},
-		{0x1d100, 0x1d126, 1},
-		{0x1d129, 0x1d164, 1},
-		{0x1d16a, 0x1d16c, 1},
-		{0x1d183, 0x1d184, 1},
-		{0x1d18c, 0x1d1a9, 1},
-		{0x1d1ae, 0x1d1e8, 1},
-		{0x1d200, 0x1d241, 1},
-		{0x1d245, 0x1d300, 187},
-		{0x1d301, 0x1d356, 1},
-		{0x1d6c1, 0x1d6db, 26},
-		{0x1d6fb, 0x1d715, 26},
-		{0x1d735, 0x1d74f, 26},
-		{0x1d76f, 0x1d789, 26},
-		{0x1d7a9, 0x1d7c3, 26},
-		{0x1d800, 0x1d9ff, 1},
-		{0x1da37, 0x1da3a, 1},
-		{0x1da6d, 0x1da74, 1},
-		{0x1da76, 0x1da83, 1},
-		{0x1da85, 0x1da86, 1},
-		{0x1eef0, 0x1eef1, 1},
-		{0x1f000, 0x1f02b, 1},
-		{0x1f030, 0x1f093, 1},
-		{0x1f0a0, 0x1f0ae, 1},
-		{0x1f0b1, 0x1f0bf, 1},
-		{0x1f0c1, 0x1f0cf, 1},
-		{0x1f0d1, 0x1f0f5, 1},
-		{0x1f110, 0x1f12e, 1},
-		{0x1f130, 0x1f16b, 1},
-		{0x1f170, 0x1f19a, 1},
-		{0x1f1e6, 0x1f202, 1},
-		{0x1f210, 0x1f23a, 1},
-		{0x1f240, 0x1f248, 1},
-		{0x1f250, 0x1f251, 1},
-		{0x1f300, 0x1f579, 1},
-		{0x1f57b, 0x1f5a3, 1},
-		{0x1f5a5, 0x1f6d0, 1},
-		{0x1f6e0, 0x1f6ec, 1},
-		{0x1f6f0, 0x1f6f3, 1},
-		{0x1f700, 0x1f773, 1},
-		{0x1f780, 0x1f7d4, 1},
-		{0x1f800, 0x1f80b, 1},
-		{0x1f810, 0x1f847, 1},
-		{0x1f850, 0x1f859, 1},
-		{0x1f860, 0x1f887, 1},
-		{0x1f890, 0x1f8ad, 1},
-		{0x1f910, 0x1f918, 1},
-		{0x1f980, 0x1f984, 1},
-		{0x1f9c0, 0x1f9c0, 1},
-	},
-	LatinOffset: 10,
-}
-
-var _Sc = &RangeTable{
-	R16: []Range16{
-		{0x0024, 0x00a2, 126},
-		{0x00a3, 0x00a5, 1},
-		{0x058f, 0x060b, 124},
-		{0x09f2, 0x09f3, 1},
-		{0x09fb, 0x0af1, 246},
-		{0x0bf9, 0x0e3f, 582},
-		{0x17db, 0x20a0, 2245},
-		{0x20a1, 0x20be, 1},
-		{0xa838, 0xfdfc, 21956},
-		{0xfe69, 0xff04, 155},
-		{0xffe0, 0xffe1, 1},
-		{0xffe5, 0xffe6, 1},
-	},
-	LatinOffset: 2,
-}
-
-var _Sk = &RangeTable{
-	R16: []Range16{
-		{0x005e, 0x0060, 2},
-		{0x00a8, 0x00af, 7},
-		{0x00b4, 0x00b8, 4},
-		{0x02c2, 0x02c5, 1},
-		{0x02d2, 0x02df, 1},
-		{0x02e5, 0x02eb, 1},
-		{0x02ed, 0x02ef, 2},
-		{0x02f0, 0x02ff, 1},
-		{0x0375, 0x0384, 15},
-		{0x0385, 0x1fbd, 7224},
-		{0x1fbf, 0x1fc1, 1},
-		{0x1fcd, 0x1fcf, 1},
-		{0x1fdd, 0x1fdf, 1},
-		{0x1fed, 0x1fef, 1},
-		{0x1ffd, 0x1ffe, 1},
-		{0x309b, 0x309c, 1},
-		{0xa700, 0xa716, 1},
-		{0xa720, 0xa721, 1},
-		{0xa789, 0xa78a, 1},
-		{0xab5b, 0xfbb2, 20567},
-		{0xfbb3, 0xfbc1, 1},
-		{0xff3e, 0xff40, 2},
-		{0xffe3, 0xffe3, 1},
-	},
-	R32: []Range32{
-		{0x1f3fb, 0x1f3fb, 1},
-		{0x1f3fc, 0x1f3ff, 1},
-	},
-	LatinOffset: 3,
-}
-
-var _Sm = &RangeTable{
-	R16: []Range16{
-		{0x002b, 0x003c, 17},
-		{0x003d, 0x003e, 1},
-		{0x007c, 0x007e, 2},
-		{0x00ac, 0x00b1, 5},
-		{0x00d7, 0x00f7, 32},
-		{0x03f6, 0x0606, 528},
-		{0x0607, 0x0608, 1},
-		{0x2044, 0x2052, 14},
-		{0x207a, 0x207c, 1},
-		{0x208a, 0x208c, 1},
-		{0x2118, 0x2140, 40},
-		{0x2141, 0x2144, 1},
-		{0x214b, 0x2190, 69},
-		{0x2191, 0x2194, 1},
-		{0x219a, 0x219b, 1},
-		{0x21a0, 0x21a6, 3},
-		{0x21ae, 0x21ce, 32},
-		{0x21cf, 0x21d2, 3},
-		{0x21d4, 0x21f4, 32},
-		{0x21f5, 0x22ff, 1},
-		{0x2320, 0x2321, 1},
-		{0x237c, 0x239b, 31},
-		{0x239c, 0x23b3, 1},
-		{0x23dc, 0x23e1, 1},
-		{0x25b7, 0x25c1, 10},
-		{0x25f8, 0x25ff, 1},
-		{0x266f, 0x27c0, 337},
-		{0x27c1, 0x27c4, 1},
-		{0x27c7, 0x27e5, 1},
-		{0x27f0, 0x27ff, 1},
-		{0x2900, 0x2982, 1},
-		{0x2999, 0x29d7, 1},
-		{0x29dc, 0x29fb, 1},
-		{0x29fe, 0x2aff, 1},
-		{0x2b30, 0x2b44, 1},
-		{0x2b47, 0x2b4c, 1},
-		{0xfb29, 0xfe62, 825},
-		{0xfe64, 0xfe66, 1},
-		{0xff0b, 0xff1c, 17},
-		{0xff1d, 0xff1e, 1},
-		{0xff5c, 0xff5e, 2},
-		{0xffe2, 0xffe9, 7},
-		{0xffea, 0xffec, 1},
-	},
-	R32: []Range32{
-		{0x1d6c1, 0x1d6db, 26},
-		{0x1d6fb, 0x1d715, 26},
-		{0x1d735, 0x1d74f, 26},
-		{0x1d76f, 0x1d789, 26},
-		{0x1d7a9, 0x1d7c3, 26},
-		{0x1eef0, 0x1eef1, 1},
-	},
-	LatinOffset: 5,
-}
-
-var _So = &RangeTable{
-	R16: []Range16{
-		{0x00a6, 0x00a9, 3},
-		{0x00ae, 0x00b0, 2},
-		{0x0482, 0x058d, 267},
-		{0x058e, 0x060e, 128},
-		{0x060f, 0x06de, 207},
-		{0x06e9, 0x06fd, 20},
-		{0x06fe, 0x07f6, 248},
-		{0x09fa, 0x0b70, 374},
-		{0x0bf3, 0x0bf8, 1},
-		{0x0bfa, 0x0c7f, 133},
-		{0x0d79, 0x0f01, 392},
-		{0x0f02, 0x0f03, 1},
-		{0x0f13, 0x0f15, 2},
-		{0x0f16, 0x0f17, 1},
-		{0x0f1a, 0x0f1f, 1},
-		{0x0f34, 0x0f38, 2},
-		{0x0fbe, 0x0fc5, 1},
-		{0x0fc7, 0x0fcc, 1},
-		{0x0fce, 0x0fcf, 1},
-		{0x0fd5, 0x0fd8, 1},
-		{0x109e, 0x109f, 1},
-		{0x1390, 0x1399, 1},
-		{0x1940, 0x19de, 158},
-		{0x19df, 0x19ff, 1},
-		{0x1b61, 0x1b6a, 1},
-		{0x1b74, 0x1b7c, 1},
-		{0x2100, 0x2101, 1},
-		{0x2103, 0x2106, 1},
-		{0x2108, 0x2109, 1},
-		{0x2114, 0x2116, 2},
-		{0x2117, 0x211e, 7},
-		{0x211f, 0x2123, 1},
-		{0x2125, 0x2129, 2},
-		{0x212e, 0x213a, 12},
-		{0x213b, 0x214a, 15},
-		{0x214c, 0x214d, 1},
-		{0x214f, 0x218a, 59},
-		{0x218b, 0x2195, 10},
-		{0x2196, 0x2199, 1},
-		{0x219c, 0x219f, 1},
-		{0x21a1, 0x21a2, 1},
-		{0x21a4, 0x21a5, 1},
-		{0x21a7, 0x21ad, 1},
-		{0x21af, 0x21cd, 1},
-		{0x21d0, 0x21d1, 1},
-		{0x21d3, 0x21d5, 2},
-		{0x21d6, 0x21f3, 1},
-		{0x2300, 0x2307, 1},
-		{0x230c, 0x231f, 1},
-		{0x2322, 0x2328, 1},
-		{0x232b, 0x237b, 1},
-		{0x237d, 0x239a, 1},
-		{0x23b4, 0x23db, 1},
-		{0x23e2, 0x23fa, 1},
-		{0x2400, 0x2426, 1},
-		{0x2440, 0x244a, 1},
-		{0x249c, 0x24e9, 1},
-		{0x2500, 0x25b6, 1},
-		{0x25b8, 0x25c0, 1},
-		{0x25c2, 0x25f7, 1},
-		{0x2600, 0x266e, 1},
-		{0x2670, 0x2767, 1},
-		{0x2794, 0x27bf, 1},
-		{0x2800, 0x28ff, 1},
-		{0x2b00, 0x2b2f, 1},
-		{0x2b45, 0x2b46, 1},
-		{0x2b4d, 0x2b73, 1},
-		{0x2b76, 0x2b95, 1},
-		{0x2b98, 0x2bb9, 1},
-		{0x2bbd, 0x2bc8, 1},
-		{0x2bca, 0x2bd1, 1},
-		{0x2bec, 0x2bef, 1},
-		{0x2ce5, 0x2cea, 1},
-		{0x2e80, 0x2e99, 1},
-		{0x2e9b, 0x2ef3, 1},
-		{0x2f00, 0x2fd5, 1},
-		{0x2ff0, 0x2ffb, 1},
-		{0x3004, 0x3012, 14},
-		{0x3013, 0x3020, 13},
-		{0x3036, 0x3037, 1},
-		{0x303e, 0x303f, 1},
-		{0x3190, 0x3191, 1},
-		{0x3196, 0x319f, 1},
-		{0x31c0, 0x31e3, 1},
-		{0x3200, 0x321e, 1},
-		{0x322a, 0x3247, 1},
-		{0x3250, 0x3260, 16},
-		{0x3261, 0x327f, 1},
-		{0x328a, 0x32b0, 1},
-		{0x32c0, 0x32fe, 1},
-		{0x3300, 0x33ff, 1},
-		{0x4dc0, 0x4dff, 1},
-		{0xa490, 0xa4c6, 1},
-		{0xa828, 0xa82b, 1},
-		{0xa836, 0xa837, 1},
-		{0xa839, 0xaa77, 574},
-		{0xaa78, 0xaa79, 1},
-		{0xfdfd, 0xffe4, 487},
-		{0xffe8, 0xffed, 5},
-		{0xffee, 0xfffc, 14},
-		{0xfffd, 0xfffd, 1},
-	},
-	R32: []Range32{
-		{0x10137, 0x10137, 1},
-		{0x10138, 0x1013f, 1},
-		{0x10179, 0x10189, 1},
-		{0x1018c, 0x10190, 4},
-		{0x10191, 0x1019b, 1},
-		{0x101a0, 0x101d0, 48},
-		{0x101d1, 0x101fc, 1},
-		{0x10877, 0x10878, 1},
-		{0x10ac8, 0x1173f, 3191},
-		{0x16b3c, 0x16b3f, 1},
-		{0x16b45, 0x1bc9c, 20823},
-		{0x1d000, 0x1d0f5, 1},
-		{0x1d100, 0x1d126, 1},
-		{0x1d129, 0x1d164, 1},
-		{0x1d16a, 0x1d16c, 1},
-		{0x1d183, 0x1d184, 1},
-		{0x1d18c, 0x1d1a9, 1},
-		{0x1d1ae, 0x1d1e8, 1},
-		{0x1d200, 0x1d241, 1},
-		{0x1d245, 0x1d300, 187},
-		{0x1d301, 0x1d356, 1},
-		{0x1d800, 0x1d9ff, 1},
-		{0x1da37, 0x1da3a, 1},
-		{0x1da6d, 0x1da74, 1},
-		{0x1da76, 0x1da83, 1},
-		{0x1da85, 0x1da86, 1},
-		{0x1f000, 0x1f02b, 1},
-		{0x1f030, 0x1f093, 1},
-		{0x1f0a0, 0x1f0ae, 1},
-		{0x1f0b1, 0x1f0bf, 1},
-		{0x1f0c1, 0x1f0cf, 1},
-		{0x1f0d1, 0x1f0f5, 1},
-		{0x1f110, 0x1f12e, 1},
-		{0x1f130, 0x1f16b, 1},
-		{0x1f170, 0x1f19a, 1},
-		{0x1f1e6, 0x1f202, 1},
-		{0x1f210, 0x1f23a, 1},
-		{0x1f240, 0x1f248, 1},
-		{0x1f250, 0x1f251, 1},
-		{0x1f300, 0x1f3fa, 1},
-		{0x1f400, 0x1f579, 1},
-		{0x1f57b, 0x1f5a3, 1},
-		{0x1f5a5, 0x1f6d0, 1},
-		{0x1f6e0, 0x1f6ec, 1},
-		{0x1f6f0, 0x1f6f3, 1},
-		{0x1f700, 0x1f773, 1},
-		{0x1f780, 0x1f7d4, 1},
-		{0x1f800, 0x1f80b, 1},
-		{0x1f810, 0x1f847, 1},
-		{0x1f850, 0x1f859, 1},
-		{0x1f860, 0x1f887, 1},
-		{0x1f890, 0x1f8ad, 1},
-		{0x1f910, 0x1f918, 1},
-		{0x1f980, 0x1f984, 1},
-		{0x1f9c0, 0x1f9c0, 1},
-	},
-	LatinOffset: 2,
-}
-
-var _Z = &RangeTable{
-	R16: []Range16{
-		{0x0020, 0x00a0, 128},
-		{0x1680, 0x2000, 2432},
-		{0x2001, 0x200a, 1},
-		{0x2028, 0x2029, 1},
-		{0x202f, 0x205f, 48},
-		{0x3000, 0x3000, 1},
-	},
-	LatinOffset: 1,
-}
-
-var _Zl = &RangeTable{
-	R16: []Range16{
-		{0x2028, 0x2028, 1},
-	},
-}
-
-var _Zp = &RangeTable{
-	R16: []Range16{
-		{0x2029, 0x2029, 1},
-	},
-}
-
-var _Zs = &RangeTable{
-	R16: []Range16{
-		{0x0020, 0x00a0, 128},
-		{0x1680, 0x2000, 2432},
-		{0x2001, 0x200a, 1},
-		{0x202f, 0x205f, 48},
-		{0x3000, 0x3000, 1},
-	},
-	LatinOffset: 1,
-}
-
-// These variables have type *RangeTable.
-var (
-	Cc     = _Cc // Cc is the set of Unicode characters in category Cc.
-	Cf     = _Cf // Cf is the set of Unicode characters in category Cf.
-	Co     = _Co // Co is the set of Unicode characters in category Co.
-	Cs     = _Cs // Cs is the set of Unicode characters in category Cs.
-	Digit  = _Nd // Digit is the set of Unicode characters with the "decimal digit" property.
-	Nd     = _Nd // Nd is the set of Unicode characters in category Nd.
-	Letter = _L  // Letter/L is the set of Unicode letters, category L.
-	L      = _L
-	Lm     = _Lm // Lm is the set of Unicode characters in category Lm.
-	Lo     = _Lo // Lo is the set of Unicode characters in category Lo.
-	Lower  = _Ll // Lower is the set of Unicode lower case letters.
-	Ll     = _Ll // Ll is the set of Unicode characters in category Ll.
-	Mark   = _M  // Mark/M is the set of Unicode mark characters, category M.
-	M      = _M
-	Mc     = _Mc // Mc is the set of Unicode characters in category Mc.
-	Me     = _Me // Me is the set of Unicode characters in category Me.
-	Mn     = _Mn // Mn is the set of Unicode characters in category Mn.
-	Nl     = _Nl // Nl is the set of Unicode characters in category Nl.
-	No     = _No // No is the set of Unicode characters in category No.
-	Number = _N  // Number/N is the set of Unicode number characters, category N.
-	N      = _N
-	Other  = _C // Other/C is the set of Unicode control and special characters, category C.
-	C      = _C
-	Pc     = _Pc // Pc is the set of Unicode characters in category Pc.
-	Pd     = _Pd // Pd is the set of Unicode characters in category Pd.
-	Pe     = _Pe // Pe is the set of Unicode characters in category Pe.
-	Pf     = _Pf // Pf is the set of Unicode characters in category Pf.
-	Pi     = _Pi // Pi is the set of Unicode characters in category Pi.
-	Po     = _Po // Po is the set of Unicode characters in category Po.
-	Ps     = _Ps // Ps is the set of Unicode characters in category Ps.
-	Punct  = _P  // Punct/P is the set of Unicode punctuation characters, category P.
-	P      = _P
-	Sc     = _Sc // Sc is the set of Unicode characters in category Sc.
-	Sk     = _Sk // Sk is the set of Unicode characters in category Sk.
-	Sm     = _Sm // Sm is the set of Unicode characters in category Sm.
-	So     = _So // So is the set of Unicode characters in category So.
-	Space  = _Z  // Space/Z is the set of Unicode space characters, category Z.
-	Z      = _Z
-	Symbol = _S // Symbol/S is the set of Unicode symbol characters, category S.
-	S      = _S
-	Title  = _Lt // Title is the set of Unicode title case letters.
-	Lt     = _Lt // Lt is the set of Unicode characters in category Lt.
-	Upper  = _Lu // Upper is the set of Unicode upper case letters.
-	Lu     = _Lu // Lu is the set of Unicode characters in category Lu.
-	Zl     = _Zl // Zl is the set of Unicode characters in category Zl.
-	Zp     = _Zp // Zp is the set of Unicode characters in category Zp.
-	Zs     = _Zs // Zs is the set of Unicode characters in category Zs.
-)
-
-// Generated by running
-//	maketables --scripts=all --url=http://www.unicode.org/Public/8.0.0/ucd/
-// DO NOT EDIT
-
-// Scripts is the set of Unicode script tables.
-var Scripts = map[string]*RangeTable{
-	"Ahom":                   Ahom,
-	"Anatolian_Hieroglyphs":  Anatolian_Hieroglyphs,
-	"Arabic":                 Arabic,
-	"Armenian":               Armenian,
-	"Avestan":                Avestan,
-	"Balinese":               Balinese,
-	"Bamum":                  Bamum,
-	"Bassa_Vah":              Bassa_Vah,
-	"Batak":                  Batak,
-	"Bengali":                Bengali,
-	"Bopomofo":               Bopomofo,
-	"Brahmi":                 Brahmi,
-	"Braille":                Braille,
-	"Buginese":               Buginese,
-	"Buhid":                  Buhid,
-	"Canadian_Aboriginal":    Canadian_Aboriginal,
-	"Carian":                 Carian,
-	"Caucasian_Albanian":     Caucasian_Albanian,
-	"Chakma":                 Chakma,
-	"Cham":                   Cham,
-	"Cherokee":               Cherokee,
-	"Common":                 Common,
-	"Coptic":                 Coptic,
-	"Cuneiform":              Cuneiform,
-	"Cypriot":                Cypriot,
-	"Cyrillic":               Cyrillic,
-	"Deseret":                Deseret,
-	"Devanagari":             Devanagari,
-	"Duployan":               Duployan,
-	"Egyptian_Hieroglyphs":   Egyptian_Hieroglyphs,
-	"Elbasan":                Elbasan,
-	"Ethiopic":               Ethiopic,
-	"Georgian":               Georgian,
-	"Glagolitic":             Glagolitic,
-	"Gothic":                 Gothic,
-	"Grantha":                Grantha,
-	"Greek":                  Greek,
-	"Gujarati":               Gujarati,
-	"Gurmukhi":               Gurmukhi,
-	"Han":                    Han,
-	"Hangul":                 Hangul,
-	"Hanunoo":                Hanunoo,
-	"Hatran":                 Hatran,
-	"Hebrew":                 Hebrew,
-	"Hiragana":               Hiragana,
-	"Imperial_Aramaic":       Imperial_Aramaic,
-	"Inherited":              Inherited,
-	"Inscriptional_Pahlavi":  Inscriptional_Pahlavi,
-	"Inscriptional_Parthian": Inscriptional_Parthian,
-	"Javanese":               Javanese,
-	"Kaithi":                 Kaithi,
-	"Kannada":                Kannada,
-	"Katakana":               Katakana,
-	"Kayah_Li":               Kayah_Li,
-	"Kharoshthi":             Kharoshthi,
-	"Khmer":                  Khmer,
-	"Khojki":                 Khojki,
-	"Khudawadi":              Khudawadi,
-	"Lao":                    Lao,
-	"Latin":                  Latin,
-	"Lepcha":                 Lepcha,
-	"Limbu":                  Limbu,
-	"Linear_A":               Linear_A,
-	"Linear_B":               Linear_B,
-	"Lisu":                   Lisu,
-	"Lycian":                 Lycian,
-	"Lydian":                 Lydian,
-	"Mahajani":               Mahajani,
-	"Malayalam":              Malayalam,
-	"Mandaic":                Mandaic,
-	"Manichaean":             Manichaean,
-	"Meetei_Mayek":           Meetei_Mayek,
-	"Mende_Kikakui":          Mende_Kikakui,
-	"Meroitic_Cursive":       Meroitic_Cursive,
-	"Meroitic_Hieroglyphs":   Meroitic_Hieroglyphs,
-	"Miao":                   Miao,
-	"Modi":                   Modi,
-	"Mongolian":              Mongolian,
-	"Mro":                    Mro,
-	"Multani":                Multani,
-	"Myanmar":                Myanmar,
-	"Nabataean":              Nabataean,
-	"New_Tai_Lue":            New_Tai_Lue,
-	"Nko":                    Nko,
-	"Ogham":                  Ogham,
-	"Ol_Chiki":               Ol_Chiki,
-	"Old_Hungarian":          Old_Hungarian,
-	"Old_Italic":             Old_Italic,
-	"Old_North_Arabian":      Old_North_Arabian,
-	"Old_Permic":             Old_Permic,
-	"Old_Persian":            Old_Persian,
-	"Old_South_Arabian":      Old_South_Arabian,
-	"Old_Turkic":             Old_Turkic,
-	"Oriya":                  Oriya,
-	"Osmanya":                Osmanya,
-	"Pahawh_Hmong":           Pahawh_Hmong,
-	"Palmyrene":              Palmyrene,
-	"Pau_Cin_Hau":            Pau_Cin_Hau,
-	"Phags_Pa":               Phags_Pa,
-	"Phoenician":             Phoenician,
-	"Psalter_Pahlavi":        Psalter_Pahlavi,
-	"Rejang":                 Rejang,
-	"Runic":                  Runic,
-	"Samaritan":              Samaritan,
-	"Saurashtra":             Saurashtra,
-	"Sharada":                Sharada,
-	"Shavian":                Shavian,
-	"Siddham":                Siddham,
-	"SignWriting":            SignWriting,
-	"Sinhala":                Sinhala,
-	"Sora_Sompeng":           Sora_Sompeng,
-	"Sundanese":              Sundanese,
-	"Syloti_Nagri":           Syloti_Nagri,
-	"Syriac":                 Syriac,
-	"Tagalog":                Tagalog,
-	"Tagbanwa":               Tagbanwa,
-	"Tai_Le":                 Tai_Le,
-	"Tai_Tham":               Tai_Tham,
-	"Tai_Viet":               Tai_Viet,
-	"Takri":                  Takri,
-	"Tamil":                  Tamil,
-	"Telugu":                 Telugu,
-	"Thaana":                 Thaana,
-	"Thai":                   Thai,
-	"Tibetan":                Tibetan,
-	"Tifinagh":               Tifinagh,
-	"Tirhuta":                Tirhuta,
-	"Ugaritic":               Ugaritic,
-	"Vai":                    Vai,
-	"Warang_Citi":            Warang_Citi,
-	"Yi":                     Yi,
-}
-
-var _Ahom = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11700, 0x11719, 1},
-		{0x1171d, 0x1172b, 1},
-		{0x11730, 0x1173f, 1},
-	},
-}
-
-var _Anatolian_Hieroglyphs = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x14400, 0x14646, 1},
-	},
-}
-
-var _Arabic = &RangeTable{
-	R16: []Range16{
-		{0x0600, 0x0604, 1},
-		{0x0606, 0x060b, 1},
-		{0x060d, 0x061a, 1},
-		{0x061e, 0x061e, 1},
-		{0x0620, 0x063f, 1},
-		{0x0641, 0x064a, 1},
-		{0x0656, 0x066f, 1},
-		{0x0671, 0x06dc, 1},
-		{0x06de, 0x06ff, 1},
-		{0x0750, 0x077f, 1},
-		{0x08a0, 0x08b4, 1},
-		{0x08e3, 0x08ff, 1},
-		{0xfb50, 0xfbc1, 1},
-		{0xfbd3, 0xfd3d, 1},
-		{0xfd50, 0xfd8f, 1},
-		{0xfd92, 0xfdc7, 1},
-		{0xfdf0, 0xfdfd, 1},
-		{0xfe70, 0xfe74, 1},
-		{0xfe76, 0xfefc, 1},
-	},
-	R32: []Range32{
-		{0x10e60, 0x10e7e, 1},
-		{0x1ee00, 0x1ee03, 1},
-		{0x1ee05, 0x1ee1f, 1},
-		{0x1ee21, 0x1ee22, 1},
-		{0x1ee24, 0x1ee24, 1},
-		{0x1ee27, 0x1ee27, 1},
-		{0x1ee29, 0x1ee32, 1},
-		{0x1ee34, 0x1ee37, 1},
-		{0x1ee39, 0x1ee39, 1},
-		{0x1ee3b, 0x1ee3b, 1},
-		{0x1ee42, 0x1ee42, 1},
-		{0x1ee47, 0x1ee47, 1},
-		{0x1ee49, 0x1ee49, 1},
-		{0x1ee4b, 0x1ee4b, 1},
-		{0x1ee4d, 0x1ee4f, 1},
-		{0x1ee51, 0x1ee52, 1},
-		{0x1ee54, 0x1ee54, 1},
-		{0x1ee57, 0x1ee57, 1},
-		{0x1ee59, 0x1ee59, 1},
-		{0x1ee5b, 0x1ee5b, 1},
-		{0x1ee5d, 0x1ee5d, 1},
-		{0x1ee5f, 0x1ee5f, 1},
-		{0x1ee61, 0x1ee62, 1},
-		{0x1ee64, 0x1ee64, 1},
-		{0x1ee67, 0x1ee6a, 1},
-		{0x1ee6c, 0x1ee72, 1},
-		{0x1ee74, 0x1ee77, 1},
-		{0x1ee79, 0x1ee7c, 1},
-		{0x1ee7e, 0x1ee7e, 1},
-		{0x1ee80, 0x1ee89, 1},
-		{0x1ee8b, 0x1ee9b, 1},
-		{0x1eea1, 0x1eea3, 1},
-		{0x1eea5, 0x1eea9, 1},
-		{0x1eeab, 0x1eebb, 1},
-		{0x1eef0, 0x1eef1, 1},
-	},
-}
-
-var _Armenian = &RangeTable{
-	R16: []Range16{
-		{0x0531, 0x0556, 1},
-		{0x0559, 0x055f, 1},
-		{0x0561, 0x0587, 1},
-		{0x058a, 0x058a, 1},
-		{0x058d, 0x058f, 1},
-		{0xfb13, 0xfb17, 1},
-	},
-}
-
-var _Avestan = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10b00, 0x10b35, 1},
-		{0x10b39, 0x10b3f, 1},
-	},
-}
-
-var _Balinese = &RangeTable{
-	R16: []Range16{
-		{0x1b00, 0x1b4b, 1},
-		{0x1b50, 0x1b7c, 1},
-	},
-}
-
-var _Bamum = &RangeTable{
-	R16: []Range16{
-		{0xa6a0, 0xa6f7, 1},
-	},
-	R32: []Range32{
-		{0x16800, 0x16a38, 1},
-	},
-}
-
-var _Bassa_Vah = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x16ad0, 0x16aed, 1},
-		{0x16af0, 0x16af5, 1},
-	},
-}
-
-var _Batak = &RangeTable{
-	R16: []Range16{
-		{0x1bc0, 0x1bf3, 1},
-		{0x1bfc, 0x1bff, 1},
-	},
-}
-
-var _Bengali = &RangeTable{
-	R16: []Range16{
-		{0x0980, 0x0983, 1},
-		{0x0985, 0x098c, 1},
-		{0x098f, 0x0990, 1},
-		{0x0993, 0x09a8, 1},
-		{0x09aa, 0x09b0, 1},
-		{0x09b2, 0x09b2, 1},
-		{0x09b6, 0x09b9, 1},
-		{0x09bc, 0x09c4, 1},
-		{0x09c7, 0x09c8, 1},
-		{0x09cb, 0x09ce, 1},
-		{0x09d7, 0x09d7, 1},
-		{0x09dc, 0x09dd, 1},
-		{0x09df, 0x09e3, 1},
-		{0x09e6, 0x09fb, 1},
-	},
-}
-
-var _Bopomofo = &RangeTable{
-	R16: []Range16{
-		{0x02ea, 0x02eb, 1},
-		{0x3105, 0x312d, 1},
-		{0x31a0, 0x31ba, 1},
-	},
-}
-
-var _Brahmi = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11000, 0x1104d, 1},
-		{0x11052, 0x1106f, 1},
-		{0x1107f, 0x1107f, 1},
-	},
-}
-
-var _Braille = &RangeTable{
-	R16: []Range16{
-		{0x2800, 0x28ff, 1},
-	},
-}
-
-var _Buginese = &RangeTable{
-	R16: []Range16{
-		{0x1a00, 0x1a1b, 1},
-		{0x1a1e, 0x1a1f, 1},
-	},
-}
-
-var _Buhid = &RangeTable{
-	R16: []Range16{
-		{0x1740, 0x1753, 1},
-	},
-}
-
-var _Canadian_Aboriginal = &RangeTable{
-	R16: []Range16{
-		{0x1400, 0x167f, 1},
-		{0x18b0, 0x18f5, 1},
-	},
-}
-
-var _Carian = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x102a0, 0x102d0, 1},
-	},
-}
-
-var _Caucasian_Albanian = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10530, 0x10563, 1},
-		{0x1056f, 0x1056f, 1},
-	},
-}
-
-var _Chakma = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11100, 0x11134, 1},
-		{0x11136, 0x11143, 1},
-	},
-}
-
-var _Cham = &RangeTable{
-	R16: []Range16{
-		{0xaa00, 0xaa36, 1},
-		{0xaa40, 0xaa4d, 1},
-		{0xaa50, 0xaa59, 1},
-		{0xaa5c, 0xaa5f, 1},
-	},
-}
-
-var _Cherokee = &RangeTable{
-	R16: []Range16{
-		{0x13a0, 0x13f5, 1},
-		{0x13f8, 0x13fd, 1},
-		{0xab70, 0xabbf, 1},
-	},
-}
-
-var _Common = &RangeTable{
-	R16: []Range16{
-		{0x0000, 0x0040, 1},
-		{0x005b, 0x0060, 1},
-		{0x007b, 0x00a9, 1},
-		{0x00ab, 0x00b9, 1},
-		{0x00bb, 0x00bf, 1},
-		{0x00d7, 0x00d7, 1},
-		{0x00f7, 0x00f7, 1},
-		{0x02b9, 0x02df, 1},
-		{0x02e5, 0x02e9, 1},
-		{0x02ec, 0x02ff, 1},
-		{0x0374, 0x0374, 1},
-		{0x037e, 0x037e, 1},
-		{0x0385, 0x0385, 1},
-		{0x0387, 0x0387, 1},
-		{0x0589, 0x0589, 1},
-		{0x0605, 0x0605, 1},
-		{0x060c, 0x060c, 1},
-		{0x061b, 0x061c, 1},
-		{0x061f, 0x061f, 1},
-		{0x0640, 0x0640, 1},
-		{0x06dd, 0x06dd, 1},
-		{0x0964, 0x0965, 1},
-		{0x0e3f, 0x0e3f, 1},
-		{0x0fd5, 0x0fd8, 1},
-		{0x10fb, 0x10fb, 1},
-		{0x16eb, 0x16ed, 1},
-		{0x1735, 0x1736, 1},
-		{0x1802, 0x1803, 1},
-		{0x1805, 0x1805, 1},
-		{0x1cd3, 0x1cd3, 1},
-		{0x1ce1, 0x1ce1, 1},
-		{0x1ce9, 0x1cec, 1},
-		{0x1cee, 0x1cf3, 1},
-		{0x1cf5, 0x1cf6, 1},
-		{0x2000, 0x200b, 1},
-		{0x200e, 0x2064, 1},
-		{0x2066, 0x2070, 1},
-		{0x2074, 0x207e, 1},
-		{0x2080, 0x208e, 1},
-		{0x20a0, 0x20be, 1},
-		{0x2100, 0x2125, 1},
-		{0x2127, 0x2129, 1},
-		{0x212c, 0x2131, 1},
-		{0x2133, 0x214d, 1},
-		{0x214f, 0x215f, 1},
-		{0x2189, 0x218b, 1},
-		{0x2190, 0x23fa, 1},
-		{0x2400, 0x2426, 1},
-		{0x2440, 0x244a, 1},
-		{0x2460, 0x27ff, 1},
-		{0x2900, 0x2b73, 1},
-		{0x2b76, 0x2b95, 1},
-		{0x2b98, 0x2bb9, 1},
-		{0x2bbd, 0x2bc8, 1},
-		{0x2bca, 0x2bd1, 1},
-		{0x2bec, 0x2bef, 1},
-		{0x2e00, 0x2e42, 1},
-		{0x2ff0, 0x2ffb, 1},
-		{0x3000, 0x3004, 1},
-		{0x3006, 0x3006, 1},
-		{0x3008, 0x3020, 1},
-		{0x3030, 0x3037, 1},
-		{0x303c, 0x303f, 1},
-		{0x309b, 0x309c, 1},
-		{0x30a0, 0x30a0, 1},
-		{0x30fb, 0x30fc, 1},
-		{0x3190, 0x319f, 1},
-		{0x31c0, 0x31e3, 1},
-		{0x3220, 0x325f, 1},
-		{0x327f, 0x32cf, 1},
-		{0x3358, 0x33ff, 1},
-		{0x4dc0, 0x4dff, 1},
-		{0xa700, 0xa721, 1},
-		{0xa788, 0xa78a, 1},
-		{0xa830, 0xa839, 1},
-		{0xa92e, 0xa92e, 1},
-		{0xa9cf, 0xa9cf, 1},
-		{0xab5b, 0xab5b, 1},
-		{0xfd3e, 0xfd3f, 1},
-		{0xfe10, 0xfe19, 1},
-		{0xfe30, 0xfe52, 1},
-		{0xfe54, 0xfe66, 1},
-		{0xfe68, 0xfe6b, 1},
-		{0xfeff, 0xfeff, 1},
-		{0xff01, 0xff20, 1},
-		{0xff3b, 0xff40, 1},
-		{0xff5b, 0xff65, 1},
-		{0xff70, 0xff70, 1},
-		{0xff9e, 0xff9f, 1},
-		{0xffe0, 0xffe6, 1},
-		{0xffe8, 0xffee, 1},
-		{0xfff9, 0xfffd, 1},
-	},
-	R32: []Range32{
-		{0x10100, 0x10102, 1},
-		{0x10107, 0x10133, 1},
-		{0x10137, 0x1013f, 1},
-		{0x10190, 0x1019b, 1},
-		{0x101d0, 0x101fc, 1},
-		{0x102e1, 0x102fb, 1},
-		{0x1bca0, 0x1bca3, 1},
-		{0x1d000, 0x1d0f5, 1},
-		{0x1d100, 0x1d126, 1},
-		{0x1d129, 0x1d166, 1},
-		{0x1d16a, 0x1d17a, 1},
-		{0x1d183, 0x1d184, 1},
-		{0x1d18c, 0x1d1a9, 1},
-		{0x1d1ae, 0x1d1e8, 1},
-		{0x1d300, 0x1d356, 1},
-		{0x1d360, 0x1d371, 1},
-		{0x1d400, 0x1d454, 1},
-		{0x1d456, 0x1d49c, 1},
-		{0x1d49e, 0x1d49f, 1},
-		{0x1d4a2, 0x1d4a2, 1},
-		{0x1d4a5, 0x1d4a6, 1},
-		{0x1d4a9, 0x1d4ac, 1},
-		{0x1d4ae, 0x1d4b9, 1},
-		{0x1d4bb, 0x1d4bb, 1},
-		{0x1d4bd, 0x1d4c3, 1},
-		{0x1d4c5, 0x1d505, 1},
-		{0x1d507, 0x1d50a, 1},
-		{0x1d50d, 0x1d514, 1},
-		{0x1d516, 0x1d51c, 1},
-		{0x1d51e, 0x1d539, 1},
-		{0x1d53b, 0x1d53e, 1},
-		{0x1d540, 0x1d544, 1},
-		{0x1d546, 0x1d546, 1},
-		{0x1d54a, 0x1d550, 1},
-		{0x1d552, 0x1d6a5, 1},
-		{0x1d6a8, 0x1d7cb, 1},
-		{0x1d7ce, 0x1d7ff, 1},
-		{0x1f000, 0x1f02b, 1},
-		{0x1f030, 0x1f093, 1},
-		{0x1f0a0, 0x1f0ae, 1},
-		{0x1f0b1, 0x1f0bf, 1},
-		{0x1f0c1, 0x1f0cf, 1},
-		{0x1f0d1, 0x1f0f5, 1},
-		{0x1f100, 0x1f10c, 1},
-		{0x1f110, 0x1f12e, 1},
-		{0x1f130, 0x1f16b, 1},
-		{0x1f170, 0x1f19a, 1},
-		{0x1f1e6, 0x1f1ff, 1},
-		{0x1f201, 0x1f202, 1},
-		{0x1f210, 0x1f23a, 1},
-		{0x1f240, 0x1f248, 1},
-		{0x1f250, 0x1f251, 1},
-		{0x1f300, 0x1f579, 1},
-		{0x1f57b, 0x1f5a3, 1},
-		{0x1f5a5, 0x1f6d0, 1},
-		{0x1f6e0, 0x1f6ec, 1},
-		{0x1f6f0, 0x1f6f3, 1},
-		{0x1f700, 0x1f773, 1},
-		{0x1f780, 0x1f7d4, 1},
-		{0x1f800, 0x1f80b, 1},
-		{0x1f810, 0x1f847, 1},
-		{0x1f850, 0x1f859, 1},
-		{0x1f860, 0x1f887, 1},
-		{0x1f890, 0x1f8ad, 1},
-		{0x1f910, 0x1f918, 1},
-		{0x1f980, 0x1f984, 1},
-		{0x1f9c0, 0x1f9c0, 1},
-		{0xe0001, 0xe0001, 1},
-		{0xe0020, 0xe007f, 1},
-	},
-	LatinOffset: 7,
-}
-
-var _Coptic = &RangeTable{
-	R16: []Range16{
-		{0x03e2, 0x03ef, 1},
-		{0x2c80, 0x2cf3, 1},
-		{0x2cf9, 0x2cff, 1},
-	},
-}
-
-var _Cuneiform = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x12000, 0x12399, 1},
-		{0x12400, 0x1246e, 1},
-		{0x12470, 0x12474, 1},
-		{0x12480, 0x12543, 1},
-	},
-}
-
-var _Cypriot = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10800, 0x10805, 1},
-		{0x10808, 0x10808, 1},
-		{0x1080a, 0x10835, 1},
-		{0x10837, 0x10838, 1},
-		{0x1083c, 0x1083c, 1},
-		{0x1083f, 0x1083f, 1},
-	},
-}
-
-var _Cyrillic = &RangeTable{
-	R16: []Range16{
-		{0x0400, 0x0484, 1},
-		{0x0487, 0x052f, 1},
-		{0x1d2b, 0x1d2b, 1},
-		{0x1d78, 0x1d78, 1},
-		{0x2de0, 0x2dff, 1},
-		{0xa640, 0xa69f, 1},
-		{0xfe2e, 0xfe2f, 1},
-	},
-}
-
-var _Deseret = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10400, 0x1044f, 1},
-	},
-}
-
-var _Devanagari = &RangeTable{
-	R16: []Range16{
-		{0x0900, 0x0950, 1},
-		{0x0953, 0x0963, 1},
-		{0x0966, 0x097f, 1},
-		{0xa8e0, 0xa8fd, 1},
-	},
-}
-
-var _Duployan = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x1bc00, 0x1bc6a, 1},
-		{0x1bc70, 0x1bc7c, 1},
-		{0x1bc80, 0x1bc88, 1},
-		{0x1bc90, 0x1bc99, 1},
-		{0x1bc9c, 0x1bc9f, 1},
-	},
-}
-
-var _Egyptian_Hieroglyphs = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x13000, 0x1342e, 1},
-	},
-}
-
-var _Elbasan = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10500, 0x10527, 1},
-	},
-}
-
-var _Ethiopic = &RangeTable{
-	R16: []Range16{
-		{0x1200, 0x1248, 1},
-		{0x124a, 0x124d, 1},
-		{0x1250, 0x1256, 1},
-		{0x1258, 0x1258, 1},
-		{0x125a, 0x125d, 1},
-		{0x1260, 0x1288, 1},
-		{0x128a, 0x128d, 1},
-		{0x1290, 0x12b0, 1},
-		{0x12b2, 0x12b5, 1},
-		{0x12b8, 0x12be, 1},
-		{0x12c0, 0x12c0, 1},
-		{0x12c2, 0x12c5, 1},
-		{0x12c8, 0x12d6, 1},
-		{0x12d8, 0x1310, 1},
-		{0x1312, 0x1315, 1},
-		{0x1318, 0x135a, 1},
-		{0x135d, 0x137c, 1},
-		{0x1380, 0x1399, 1},
-		{0x2d80, 0x2d96, 1},
-		{0x2da0, 0x2da6, 1},
-		{0x2da8, 0x2dae, 1},
-		{0x2db0, 0x2db6, 1},
-		{0x2db8, 0x2dbe, 1},
-		{0x2dc0, 0x2dc6, 1},
-		{0x2dc8, 0x2dce, 1},
-		{0x2dd0, 0x2dd6, 1},
-		{0x2dd8, 0x2dde, 1},
-		{0xab01, 0xab06, 1},
-		{0xab09, 0xab0e, 1},
-		{0xab11, 0xab16, 1},
-		{0xab20, 0xab26, 1},
-		{0xab28, 0xab2e, 1},
-	},
-}
-
-var _Georgian = &RangeTable{
-	R16: []Range16{
-		{0x10a0, 0x10c5, 1},
-		{0x10c7, 0x10c7, 1},
-		{0x10cd, 0x10cd, 1},
-		{0x10d0, 0x10fa, 1},
-		{0x10fc, 0x10ff, 1},
-		{0x2d00, 0x2d25, 1},
-		{0x2d27, 0x2d27, 1},
-		{0x2d2d, 0x2d2d, 1},
-	},
-}
-
-var _Glagolitic = &RangeTable{
-	R16: []Range16{
-		{0x2c00, 0x2c2e, 1},
-		{0x2c30, 0x2c5e, 1},
-	},
-}
-
-var _Gothic = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10330, 0x1034a, 1},
-	},
-}
-
-var _Grantha = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11300, 0x11303, 1},
-		{0x11305, 0x1130c, 1},
-		{0x1130f, 0x11310, 1},
-		{0x11313, 0x11328, 1},
-		{0x1132a, 0x11330, 1},
-		{0x11332, 0x11333, 1},
-		{0x11335, 0x11339, 1},
-		{0x1133c, 0x11344, 1},
-		{0x11347, 0x11348, 1},
-		{0x1134b, 0x1134d, 1},
-		{0x11350, 0x11350, 1},
-		{0x11357, 0x11357, 1},
-		{0x1135d, 0x11363, 1},
-		{0x11366, 0x1136c, 1},
-		{0x11370, 0x11374, 1},
-	},
-}
-
-var _Greek = &RangeTable{
-	R16: []Range16{
-		{0x0370, 0x0373, 1},
-		{0x0375, 0x0377, 1},
-		{0x037a, 0x037d, 1},
-		{0x037f, 0x037f, 1},
-		{0x0384, 0x0384, 1},
-		{0x0386, 0x0386, 1},
-		{0x0388, 0x038a, 1},
-		{0x038c, 0x038c, 1},
-		{0x038e, 0x03a1, 1},
-		{0x03a3, 0x03e1, 1},
-		{0x03f0, 0x03ff, 1},
-		{0x1d26, 0x1d2a, 1},
-		{0x1d5d, 0x1d61, 1},
-		{0x1d66, 0x1d6a, 1},
-		{0x1dbf, 0x1dbf, 1},
-		{0x1f00, 0x1f15, 1},
-		{0x1f18, 0x1f1d, 1},
-		{0x1f20, 0x1f45, 1},
-		{0x1f48, 0x1f4d, 1},
-		{0x1f50, 0x1f57, 1},
-		{0x1f59, 0x1f59, 1},
-		{0x1f5b, 0x1f5b, 1},
-		{0x1f5d, 0x1f5d, 1},
-		{0x1f5f, 0x1f7d, 1},
-		{0x1f80, 0x1fb4, 1},
-		{0x1fb6, 0x1fc4, 1},
-		{0x1fc6, 0x1fd3, 1},
-		{0x1fd6, 0x1fdb, 1},
-		{0x1fdd, 0x1fef, 1},
-		{0x1ff2, 0x1ff4, 1},
-		{0x1ff6, 0x1ffe, 1},
-		{0x2126, 0x2126, 1},
-		{0xab65, 0xab65, 1},
-	},
-	R32: []Range32{
-		{0x10140, 0x1018c, 1},
-		{0x101a0, 0x101a0, 1},
-		{0x1d200, 0x1d245, 1},
-	},
-}
-
-var _Gujarati = &RangeTable{
-	R16: []Range16{
-		{0x0a81, 0x0a83, 1},
-		{0x0a85, 0x0a8d, 1},
-		{0x0a8f, 0x0a91, 1},
-		{0x0a93, 0x0aa8, 1},
-		{0x0aaa, 0x0ab0, 1},
-		{0x0ab2, 0x0ab3, 1},
-		{0x0ab5, 0x0ab9, 1},
-		{0x0abc, 0x0ac5, 1},
-		{0x0ac7, 0x0ac9, 1},
-		{0x0acb, 0x0acd, 1},
-		{0x0ad0, 0x0ad0, 1},
-		{0x0ae0, 0x0ae3, 1},
-		{0x0ae6, 0x0af1, 1},
-		{0x0af9, 0x0af9, 1},
-	},
-}
-
-var _Gurmukhi = &RangeTable{
-	R16: []Range16{
-		{0x0a01, 0x0a03, 1},
-		{0x0a05, 0x0a0a, 1},
-		{0x0a0f, 0x0a10, 1},
-		{0x0a13, 0x0a28, 1},
-		{0x0a2a, 0x0a30, 1},
-		{0x0a32, 0x0a33, 1},
-		{0x0a35, 0x0a36, 1},
-		{0x0a38, 0x0a39, 1},
-		{0x0a3c, 0x0a3c, 1},
-		{0x0a3e, 0x0a42, 1},
-		{0x0a47, 0x0a48, 1},
-		{0x0a4b, 0x0a4d, 1},
-		{0x0a51, 0x0a51, 1},
-		{0x0a59, 0x0a5c, 1},
-		{0x0a5e, 0x0a5e, 1},
-		{0x0a66, 0x0a75, 1},
-	},
-}
-
-var _Han = &RangeTable{
-	R16: []Range16{
-		{0x2e80, 0x2e99, 1},
-		{0x2e9b, 0x2ef3, 1},
-		{0x2f00, 0x2fd5, 1},
-		{0x3005, 0x3005, 1},
-		{0x3007, 0x3007, 1},
-		{0x3021, 0x3029, 1},
-		{0x3038, 0x303b, 1},
-		{0x3400, 0x4db5, 1},
-		{0x4e00, 0x9fd5, 1},
-		{0xf900, 0xfa6d, 1},
-		{0xfa70, 0xfad9, 1},
-	},
-	R32: []Range32{
-		{0x20000, 0x2a6d6, 1},
-		{0x2a700, 0x2b734, 1},
-		{0x2b740, 0x2b81d, 1},
-		{0x2b820, 0x2cea1, 1},
-		{0x2f800, 0x2fa1d, 1},
-	},
-}
-
-var _Hangul = &RangeTable{
-	R16: []Range16{
-		{0x1100, 0x11ff, 1},
-		{0x302e, 0x302f, 1},
-		{0x3131, 0x318e, 1},
-		{0x3200, 0x321e, 1},
-		{0x3260, 0x327e, 1},
-		{0xa960, 0xa97c, 1},
-		{0xac00, 0xd7a3, 1},
-		{0xd7b0, 0xd7c6, 1},
-		{0xd7cb, 0xd7fb, 1},
-		{0xffa0, 0xffbe, 1},
-		{0xffc2, 0xffc7, 1},
-		{0xffca, 0xffcf, 1},
-		{0xffd2, 0xffd7, 1},
-		{0xffda, 0xffdc, 1},
-	},
-}
-
-var _Hanunoo = &RangeTable{
-	R16: []Range16{
-		{0x1720, 0x1734, 1},
-	},
-}
-
-var _Hatran = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x108e0, 0x108f2, 1},
-		{0x108f4, 0x108f5, 1},
-		{0x108fb, 0x108ff, 1},
-	},
-}
-
-var _Hebrew = &RangeTable{
-	R16: []Range16{
-		{0x0591, 0x05c7, 1},
-		{0x05d0, 0x05ea, 1},
-		{0x05f0, 0x05f4, 1},
-		{0xfb1d, 0xfb36, 1},
-		{0xfb38, 0xfb3c, 1},
-		{0xfb3e, 0xfb3e, 1},
-		{0xfb40, 0xfb41, 1},
-		{0xfb43, 0xfb44, 1},
-		{0xfb46, 0xfb4f, 1},
-	},
-}
-
-var _Hiragana = &RangeTable{
-	R16: []Range16{
-		{0x3041, 0x3096, 1},
-		{0x309d, 0x309f, 1},
-	},
-	R32: []Range32{
-		{0x1b001, 0x1b001, 1},
-		{0x1f200, 0x1f200, 1},
-	},
-}
-
-var _Imperial_Aramaic = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10840, 0x10855, 1},
-		{0x10857, 0x1085f, 1},
-	},
-}
-
-var _Inherited = &RangeTable{
-	R16: []Range16{
-		{0x0300, 0x036f, 1},
-		{0x0485, 0x0486, 1},
-		{0x064b, 0x0655, 1},
-		{0x0670, 0x0670, 1},
-		{0x0951, 0x0952, 1},
-		{0x1ab0, 0x1abe, 1},
-		{0x1cd0, 0x1cd2, 1},
-		{0x1cd4, 0x1ce0, 1},
-		{0x1ce2, 0x1ce8, 1},
-		{0x1ced, 0x1ced, 1},
-		{0x1cf4, 0x1cf4, 1},
-		{0x1cf8, 0x1cf9, 1},
-		{0x1dc0, 0x1df5, 1},
-		{0x1dfc, 0x1dff, 1},
-		{0x200c, 0x200d, 1},
-		{0x20d0, 0x20f0, 1},
-		{0x302a, 0x302d, 1},
-		{0x3099, 0x309a, 1},
-		{0xfe00, 0xfe0f, 1},
-		{0xfe20, 0xfe2d, 1},
-	},
-	R32: []Range32{
-		{0x101fd, 0x101fd, 1},
-		{0x102e0, 0x102e0, 1},
-		{0x1d167, 0x1d169, 1},
-		{0x1d17b, 0x1d182, 1},
-		{0x1d185, 0x1d18b, 1},
-		{0x1d1aa, 0x1d1ad, 1},
-		{0xe0100, 0xe01ef, 1},
-	},
-}
-
-var _Inscriptional_Pahlavi = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10b60, 0x10b72, 1},
-		{0x10b78, 0x10b7f, 1},
-	},
-}
-
-var _Inscriptional_Parthian = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10b40, 0x10b55, 1},
-		{0x10b58, 0x10b5f, 1},
-	},
-}
-
-var _Javanese = &RangeTable{
-	R16: []Range16{
-		{0xa980, 0xa9cd, 1},
-		{0xa9d0, 0xa9d9, 1},
-		{0xa9de, 0xa9df, 1},
-	},
-}
-
-var _Kaithi = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11080, 0x110c1, 1},
-	},
-}
-
-var _Kannada = &RangeTable{
-	R16: []Range16{
-		{0x0c81, 0x0c83, 1},
-		{0x0c85, 0x0c8c, 1},
-		{0x0c8e, 0x0c90, 1},
-		{0x0c92, 0x0ca8, 1},
-		{0x0caa, 0x0cb3, 1},
-		{0x0cb5, 0x0cb9, 1},
-		{0x0cbc, 0x0cc4, 1},
-		{0x0cc6, 0x0cc8, 1},
-		{0x0cca, 0x0ccd, 1},
-		{0x0cd5, 0x0cd6, 1},
-		{0x0cde, 0x0cde, 1},
-		{0x0ce0, 0x0ce3, 1},
-		{0x0ce6, 0x0cef, 1},
-		{0x0cf1, 0x0cf2, 1},
-	},
-}
-
-var _Katakana = &RangeTable{
-	R16: []Range16{
-		{0x30a1, 0x30fa, 1},
-		{0x30fd, 0x30ff, 1},
-		{0x31f0, 0x31ff, 1},
-		{0x32d0, 0x32fe, 1},
-		{0x3300, 0x3357, 1},
-		{0xff66, 0xff6f, 1},
-		{0xff71, 0xff9d, 1},
-	},
-	R32: []Range32{
-		{0x1b000, 0x1b000, 1},
-	},
-}
-
-var _Kayah_Li = &RangeTable{
-	R16: []Range16{
-		{0xa900, 0xa92d, 1},
-		{0xa92f, 0xa92f, 1},
-	},
-}
-
-var _Kharoshthi = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10a00, 0x10a03, 1},
-		{0x10a05, 0x10a06, 1},
-		{0x10a0c, 0x10a13, 1},
-		{0x10a15, 0x10a17, 1},
-		{0x10a19, 0x10a33, 1},
-		{0x10a38, 0x10a3a, 1},
-		{0x10a3f, 0x10a47, 1},
-		{0x10a50, 0x10a58, 1},
-	},
-}
-
-var _Khmer = &RangeTable{
-	R16: []Range16{
-		{0x1780, 0x17dd, 1},
-		{0x17e0, 0x17e9, 1},
-		{0x17f0, 0x17f9, 1},
-		{0x19e0, 0x19ff, 1},
-	},
-}
-
-var _Khojki = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11200, 0x11211, 1},
-		{0x11213, 0x1123d, 1},
-	},
-}
-
-var _Khudawadi = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x112b0, 0x112ea, 1},
-		{0x112f0, 0x112f9, 1},
-	},
-}
-
-var _Lao = &RangeTable{
-	R16: []Range16{
-		{0x0e81, 0x0e82, 1},
-		{0x0e84, 0x0e84, 1},
-		{0x0e87, 0x0e88, 1},
-		{0x0e8a, 0x0e8a, 1},
-		{0x0e8d, 0x0e8d, 1},
-		{0x0e94, 0x0e97, 1},
-		{0x0e99, 0x0e9f, 1},
-		{0x0ea1, 0x0ea3, 1},
-		{0x0ea5, 0x0ea5, 1},
-		{0x0ea7, 0x0ea7, 1},
-		{0x0eaa, 0x0eab, 1},
-		{0x0ead, 0x0eb9, 1},
-		{0x0ebb, 0x0ebd, 1},
-		{0x0ec0, 0x0ec4, 1},
-		{0x0ec6, 0x0ec6, 1},
-		{0x0ec8, 0x0ecd, 1},
-		{0x0ed0, 0x0ed9, 1},
-		{0x0edc, 0x0edf, 1},
-	},
-}
-
-var _Latin = &RangeTable{
-	R16: []Range16{
-		{0x0041, 0x005a, 1},
-		{0x0061, 0x007a, 1},
-		{0x00aa, 0x00aa, 1},
-		{0x00ba, 0x00ba, 1},
-		{0x00c0, 0x00d6, 1},
-		{0x00d8, 0x00f6, 1},
-		{0x00f8, 0x02b8, 1},
-		{0x02e0, 0x02e4, 1},
-		{0x1d00, 0x1d25, 1},
-		{0x1d2c, 0x1d5c, 1},
-		{0x1d62, 0x1d65, 1},
-		{0x1d6b, 0x1d77, 1},
-		{0x1d79, 0x1dbe, 1},
-		{0x1e00, 0x1eff, 1},
-		{0x2071, 0x2071, 1},
-		{0x207f, 0x207f, 1},
-		{0x2090, 0x209c, 1},
-		{0x212a, 0x212b, 1},
-		{0x2132, 0x2132, 1},
-		{0x214e, 0x214e, 1},
-		{0x2160, 0x2188, 1},
-		{0x2c60, 0x2c7f, 1},
-		{0xa722, 0xa787, 1},
-		{0xa78b, 0xa7ad, 1},
-		{0xa7b0, 0xa7b7, 1},
-		{0xa7f7, 0xa7ff, 1},
-		{0xab30, 0xab5a, 1},
-		{0xab5c, 0xab64, 1},
-		{0xfb00, 0xfb06, 1},
-		{0xff21, 0xff3a, 1},
-		{0xff41, 0xff5a, 1},
-	},
-	LatinOffset: 6,
-}
-
-var _Lepcha = &RangeTable{
-	R16: []Range16{
-		{0x1c00, 0x1c37, 1},
-		{0x1c3b, 0x1c49, 1},
-		{0x1c4d, 0x1c4f, 1},
-	},
-}
-
-var _Limbu = &RangeTable{
-	R16: []Range16{
-		{0x1900, 0x191e, 1},
-		{0x1920, 0x192b, 1},
-		{0x1930, 0x193b, 1},
-		{0x1940, 0x1940, 1},
-		{0x1944, 0x194f, 1},
-	},
-}
-
-var _Linear_A = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10600, 0x10736, 1},
-		{0x10740, 0x10755, 1},
-		{0x10760, 0x10767, 1},
-	},
-}
-
-var _Linear_B = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10000, 0x1000b, 1},
-		{0x1000d, 0x10026, 1},
-		{0x10028, 0x1003a, 1},
-		{0x1003c, 0x1003d, 1},
-		{0x1003f, 0x1004d, 1},
-		{0x10050, 0x1005d, 1},
-		{0x10080, 0x100fa, 1},
-	},
-}
-
-var _Lisu = &RangeTable{
-	R16: []Range16{
-		{0xa4d0, 0xa4ff, 1},
-	},
-}
-
-var _Lycian = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10280, 0x1029c, 1},
-	},
-}
-
-var _Lydian = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10920, 0x10939, 1},
-		{0x1093f, 0x1093f, 1},
-	},
-}
-
-var _Mahajani = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11150, 0x11176, 1},
-	},
-}
-
-var _Malayalam = &RangeTable{
-	R16: []Range16{
-		{0x0d01, 0x0d03, 1},
-		{0x0d05, 0x0d0c, 1},
-		{0x0d0e, 0x0d10, 1},
-		{0x0d12, 0x0d3a, 1},
-		{0x0d3d, 0x0d44, 1},
-		{0x0d46, 0x0d48, 1},
-		{0x0d4a, 0x0d4e, 1},
-		{0x0d57, 0x0d57, 1},
-		{0x0d5f, 0x0d63, 1},
-		{0x0d66, 0x0d75, 1},
-		{0x0d79, 0x0d7f, 1},
-	},
-}
-
-var _Mandaic = &RangeTable{
-	R16: []Range16{
-		{0x0840, 0x085b, 1},
-		{0x085e, 0x085e, 1},
-	},
-}
-
-var _Manichaean = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10ac0, 0x10ae6, 1},
-		{0x10aeb, 0x10af6, 1},
-	},
-}
-
-var _Meetei_Mayek = &RangeTable{
-	R16: []Range16{
-		{0xaae0, 0xaaf6, 1},
-		{0xabc0, 0xabed, 1},
-		{0xabf0, 0xabf9, 1},
-	},
-}
-
-var _Mende_Kikakui = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x1e800, 0x1e8c4, 1},
-		{0x1e8c7, 0x1e8d6, 1},
-	},
-}
-
-var _Meroitic_Cursive = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x109a0, 0x109b7, 1},
-		{0x109bc, 0x109cf, 1},
-		{0x109d2, 0x109ff, 1},
-	},
-}
-
-var _Meroitic_Hieroglyphs = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10980, 0x1099f, 1},
-	},
-}
-
-var _Miao = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x16f00, 0x16f44, 1},
-		{0x16f50, 0x16f7e, 1},
-		{0x16f8f, 0x16f9f, 1},
-	},
-}
-
-var _Modi = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11600, 0x11644, 1},
-		{0x11650, 0x11659, 1},
-	},
-}
-
-var _Mongolian = &RangeTable{
-	R16: []Range16{
-		{0x1800, 0x1801, 1},
-		{0x1804, 0x1804, 1},
-		{0x1806, 0x180e, 1},
-		{0x1810, 0x1819, 1},
-		{0x1820, 0x1877, 1},
-		{0x1880, 0x18aa, 1},
-	},
-}
-
-var _Mro = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x16a40, 0x16a5e, 1},
-		{0x16a60, 0x16a69, 1},
-		{0x16a6e, 0x16a6f, 1},
-	},
-}
-
-var _Multani = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11280, 0x11286, 1},
-		{0x11288, 0x11288, 1},
-		{0x1128a, 0x1128d, 1},
-		{0x1128f, 0x1129d, 1},
-		{0x1129f, 0x112a9, 1},
-	},
-}
-
-var _Myanmar = &RangeTable{
-	R16: []Range16{
-		{0x1000, 0x109f, 1},
-		{0xa9e0, 0xa9fe, 1},
-		{0xaa60, 0xaa7f, 1},
-	},
-}
-
-var _Nabataean = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10880, 0x1089e, 1},
-		{0x108a7, 0x108af, 1},
-	},
-}
-
-var _New_Tai_Lue = &RangeTable{
-	R16: []Range16{
-		{0x1980, 0x19ab, 1},
-		{0x19b0, 0x19c9, 1},
-		{0x19d0, 0x19da, 1},
-		{0x19de, 0x19df, 1},
-	},
-}
-
-var _Nko = &RangeTable{
-	R16: []Range16{
-		{0x07c0, 0x07fa, 1},
-	},
-}
-
-var _Ogham = &RangeTable{
-	R16: []Range16{
-		{0x1680, 0x169c, 1},
-	},
-}
-
-var _Ol_Chiki = &RangeTable{
-	R16: []Range16{
-		{0x1c50, 0x1c7f, 1},
-	},
-}
-
-var _Old_Hungarian = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10c80, 0x10cb2, 1},
-		{0x10cc0, 0x10cf2, 1},
-		{0x10cfa, 0x10cff, 1},
-	},
-}
-
-var _Old_Italic = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10300, 0x10323, 1},
-	},
-}
-
-var _Old_North_Arabian = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10a80, 0x10a9f, 1},
-	},
-}
-
-var _Old_Permic = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10350, 0x1037a, 1},
-	},
-}
-
-var _Old_Persian = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x103a0, 0x103c3, 1},
-		{0x103c8, 0x103d5, 1},
-	},
-}
-
-var _Old_South_Arabian = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10a60, 0x10a7f, 1},
-	},
-}
-
-var _Old_Turkic = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10c00, 0x10c48, 1},
-	},
-}
-
-var _Oriya = &RangeTable{
-	R16: []Range16{
-		{0x0b01, 0x0b03, 1},
-		{0x0b05, 0x0b0c, 1},
-		{0x0b0f, 0x0b10, 1},
-		{0x0b13, 0x0b28, 1},
-		{0x0b2a, 0x0b30, 1},
-		{0x0b32, 0x0b33, 1},
-		{0x0b35, 0x0b39, 1},
-		{0x0b3c, 0x0b44, 1},
-		{0x0b47, 0x0b48, 1},
-		{0x0b4b, 0x0b4d, 1},
-		{0x0b56, 0x0b57, 1},
-		{0x0b5c, 0x0b5d, 1},
-		{0x0b5f, 0x0b63, 1},
-		{0x0b66, 0x0b77, 1},
-	},
-}
-
-var _Osmanya = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10480, 0x1049d, 1},
-		{0x104a0, 0x104a9, 1},
-	},
-}
-
-var _Pahawh_Hmong = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x16b00, 0x16b45, 1},
-		{0x16b50, 0x16b59, 1},
-		{0x16b5b, 0x16b61, 1},
-		{0x16b63, 0x16b77, 1},
-		{0x16b7d, 0x16b8f, 1},
-	},
-}
-
-var _Palmyrene = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10860, 0x1087f, 1},
-	},
-}
-
-var _Pau_Cin_Hau = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11ac0, 0x11af8, 1},
-	},
-}
-
-var _Phags_Pa = &RangeTable{
-	R16: []Range16{
-		{0xa840, 0xa877, 1},
-	},
-}
-
-var _Phoenician = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10900, 0x1091b, 1},
-		{0x1091f, 0x1091f, 1},
-	},
-}
-
-var _Psalter_Pahlavi = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10b80, 0x10b91, 1},
-		{0x10b99, 0x10b9c, 1},
-		{0x10ba9, 0x10baf, 1},
-	},
-}
-
-var _Rejang = &RangeTable{
-	R16: []Range16{
-		{0xa930, 0xa953, 1},
-		{0xa95f, 0xa95f, 1},
-	},
-}
-
-var _Runic = &RangeTable{
-	R16: []Range16{
-		{0x16a0, 0x16ea, 1},
-		{0x16ee, 0x16f8, 1},
-	},
-}
-
-var _Samaritan = &RangeTable{
-	R16: []Range16{
-		{0x0800, 0x082d, 1},
-		{0x0830, 0x083e, 1},
-	},
-}
-
-var _Saurashtra = &RangeTable{
-	R16: []Range16{
-		{0xa880, 0xa8c4, 1},
-		{0xa8ce, 0xa8d9, 1},
-	},
-}
-
-var _Sharada = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11180, 0x111cd, 1},
-		{0x111d0, 0x111df, 1},
-	},
-}
-
-var _Shavian = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10450, 0x1047f, 1},
-	},
-}
-
-var _Siddham = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11580, 0x115b5, 1},
-		{0x115b8, 0x115dd, 1},
-	},
-}
-
-var _SignWriting = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x1d800, 0x1da8b, 1},
-		{0x1da9b, 0x1da9f, 1},
-		{0x1daa1, 0x1daaf, 1},
-	},
-}
-
-var _Sinhala = &RangeTable{
-	R16: []Range16{
-		{0x0d82, 0x0d83, 1},
-		{0x0d85, 0x0d96, 1},
-		{0x0d9a, 0x0db1, 1},
-		{0x0db3, 0x0dbb, 1},
-		{0x0dbd, 0x0dbd, 1},
-		{0x0dc0, 0x0dc6, 1},
-		{0x0dca, 0x0dca, 1},
-		{0x0dcf, 0x0dd4, 1},
-		{0x0dd6, 0x0dd6, 1},
-		{0x0dd8, 0x0ddf, 1},
-		{0x0de6, 0x0def, 1},
-		{0x0df2, 0x0df4, 1},
-	},
-	R32: []Range32{
-		{0x111e1, 0x111f4, 1},
-	},
-}
-
-var _Sora_Sompeng = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x110d0, 0x110e8, 1},
-		{0x110f0, 0x110f9, 1},
-	},
-}
-
-var _Sundanese = &RangeTable{
-	R16: []Range16{
-		{0x1b80, 0x1bbf, 1},
-		{0x1cc0, 0x1cc7, 1},
-	},
-}
-
-var _Syloti_Nagri = &RangeTable{
-	R16: []Range16{
-		{0xa800, 0xa82b, 1},
-	},
-}
-
-var _Syriac = &RangeTable{
-	R16: []Range16{
-		{0x0700, 0x070d, 1},
-		{0x070f, 0x074a, 1},
-		{0x074d, 0x074f, 1},
-	},
-}
-
-var _Tagalog = &RangeTable{
-	R16: []Range16{
-		{0x1700, 0x170c, 1},
-		{0x170e, 0x1714, 1},
-	},
-}
-
-var _Tagbanwa = &RangeTable{
-	R16: []Range16{
-		{0x1760, 0x176c, 1},
-		{0x176e, 0x1770, 1},
-		{0x1772, 0x1773, 1},
-	},
-}
-
-var _Tai_Le = &RangeTable{
-	R16: []Range16{
-		{0x1950, 0x196d, 1},
-		{0x1970, 0x1974, 1},
-	},
-}
-
-var _Tai_Tham = &RangeTable{
-	R16: []Range16{
-		{0x1a20, 0x1a5e, 1},
-		{0x1a60, 0x1a7c, 1},
-		{0x1a7f, 0x1a89, 1},
-		{0x1a90, 0x1a99, 1},
-		{0x1aa0, 0x1aad, 1},
-	},
-}
-
-var _Tai_Viet = &RangeTable{
-	R16: []Range16{
-		{0xaa80, 0xaac2, 1},
-		{0xaadb, 0xaadf, 1},
-	},
-}
-
-var _Takri = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11680, 0x116b7, 1},
-		{0x116c0, 0x116c9, 1},
-	},
-}
-
-var _Tamil = &RangeTable{
-	R16: []Range16{
-		{0x0b82, 0x0b83, 1},
-		{0x0b85, 0x0b8a, 1},
-		{0x0b8e, 0x0b90, 1},
-		{0x0b92, 0x0b95, 1},
-		{0x0b99, 0x0b9a, 1},
-		{0x0b9c, 0x0b9c, 1},
-		{0x0b9e, 0x0b9f, 1},
-		{0x0ba3, 0x0ba4, 1},
-		{0x0ba8, 0x0baa, 1},
-		{0x0bae, 0x0bb9, 1},
-		{0x0bbe, 0x0bc2, 1},
-		{0x0bc6, 0x0bc8, 1},
-		{0x0bca, 0x0bcd, 1},
-		{0x0bd0, 0x0bd0, 1},
-		{0x0bd7, 0x0bd7, 1},
-		{0x0be6, 0x0bfa, 1},
-	},
-}
-
-var _Telugu = &RangeTable{
-	R16: []Range16{
-		{0x0c00, 0x0c03, 1},
-		{0x0c05, 0x0c0c, 1},
-		{0x0c0e, 0x0c10, 1},
-		{0x0c12, 0x0c28, 1},
-		{0x0c2a, 0x0c39, 1},
-		{0x0c3d, 0x0c44, 1},
-		{0x0c46, 0x0c48, 1},
-		{0x0c4a, 0x0c4d, 1},
-		{0x0c55, 0x0c56, 1},
-		{0x0c58, 0x0c5a, 1},
-		{0x0c60, 0x0c63, 1},
-		{0x0c66, 0x0c6f, 1},
-		{0x0c78, 0x0c7f, 1},
-	},
-}
-
-var _Thaana = &RangeTable{
-	R16: []Range16{
-		{0x0780, 0x07b1, 1},
-	},
-}
-
-var _Thai = &RangeTable{
-	R16: []Range16{
-		{0x0e01, 0x0e3a, 1},
-		{0x0e40, 0x0e5b, 1},
-	},
-}
-
-var _Tibetan = &RangeTable{
-	R16: []Range16{
-		{0x0f00, 0x0f47, 1},
-		{0x0f49, 0x0f6c, 1},
-		{0x0f71, 0x0f97, 1},
-		{0x0f99, 0x0fbc, 1},
-		{0x0fbe, 0x0fcc, 1},
-		{0x0fce, 0x0fd4, 1},
-		{0x0fd9, 0x0fda, 1},
-	},
-}
-
-var _Tifinagh = &RangeTable{
-	R16: []Range16{
-		{0x2d30, 0x2d67, 1},
-		{0x2d6f, 0x2d70, 1},
-		{0x2d7f, 0x2d7f, 1},
-	},
-}
-
-var _Tirhuta = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x11480, 0x114c7, 1},
-		{0x114d0, 0x114d9, 1},
-	},
-}
-
-var _Ugaritic = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x10380, 0x1039d, 1},
-		{0x1039f, 0x1039f, 1},
-	},
-}
-
-var _Vai = &RangeTable{
-	R16: []Range16{
-		{0xa500, 0xa62b, 1},
-	},
-}
-
-var _Warang_Citi = &RangeTable{
-	R16: []Range16{},
-	R32: []Range32{
-		{0x118a0, 0x118f2, 1},
-		{0x118ff, 0x118ff, 1},
-	},
-}
-
-var _Yi = &RangeTable{
-	R16: []Range16{
-		{0xa000, 0xa48c, 1},
-		{0xa490, 0xa4c6, 1},
-	},
-}
-
-// These variables have type *RangeTable.
-var (
-	Ahom                   = _Ahom                   // Ahom is the set of Unicode characters in script Ahom.
-	Anatolian_Hieroglyphs  = _Anatolian_Hieroglyphs  // Anatolian_Hieroglyphs is the set of Unicode characters in script Anatolian_Hieroglyphs.
-	Arabic                 = _Arabic                 // Arabic is the set of Unicode characters in script Arabic.
-	Armenian               = _Armenian               // Armenian is the set of Unicode characters in script Armenian.
-	Avestan                = _Avestan                // Avestan is the set of Unicode characters in script Avestan.
-	Balinese               = _Balinese               // Balinese is the set of Unicode characters in script Balinese.
-	Bamum                  = _Bamum                  // Bamum is the set of Unicode characters in script Bamum.
-	Bassa_Vah              = _Bassa_Vah              // Bassa_Vah is the set of Unicode characters in script Bassa_Vah.
-	Batak                  = _Batak                  // Batak is the set of Unicode characters in script Batak.
-	Bengali                = _Bengali                // Bengali is the set of Unicode characters in script Bengali.
-	Bopomofo               = _Bopomofo               // Bopomofo is the set of Unicode characters in script Bopomofo.
-	Brahmi                 = _Brahmi                 // Brahmi is the set of Unicode characters in script Brahmi.
-	Braille                = _Braille                // Braille is the set of Unicode characters in script Braille.
-	Buginese               = _Buginese               // Buginese is the set of Unicode characters in script Buginese.
-	Buhid                  = _Buhid                  // Buhid is the set of Unicode characters in script Buhid.
-	Canadian_Aboriginal    = _Canadian_Aboriginal    // Canadian_Aboriginal is the set of Unicode characters in script Canadian_Aboriginal.
-	Carian                 = _Carian                 // Carian is the set of Unicode characters in script Carian.
-	Caucasian_Albanian     = _Caucasian_Albanian     // Caucasian_Albanian is the set of Unicode characters in script Caucasian_Albanian.
-	Chakma                 = _Chakma                 // Chakma is the set of Unicode characters in script Chakma.
-	Cham                   = _Cham                   // Cham is the set of Unicode characters in script Cham.
-	Cherokee               = _Cherokee               // Cherokee is the set of Unicode characters in script Cherokee.
-	Common                 = _Common                 // Common is the set of Unicode characters in script Common.
-	Coptic                 = _Coptic                 // Coptic is the set of Unicode characters in script Coptic.
-	Cuneiform              = _Cuneiform              // Cuneiform is the set of Unicode characters in script Cuneiform.
-	Cypriot                = _Cypriot                // Cypriot is the set of Unicode characters in script Cypriot.
-	Cyrillic               = _Cyrillic               // Cyrillic is the set of Unicode characters in script Cyrillic.
-	Deseret                = _Deseret                // Deseret is the set of Unicode characters in script Deseret.
-	Devanagari             = _Devanagari             // Devanagari is the set of Unicode characters in script Devanagari.
-	Duployan               = _Duployan               // Duployan is the set of Unicode characters in script Duployan.
-	Egyptian_Hieroglyphs   = _Egyptian_Hieroglyphs   // Egyptian_Hieroglyphs is the set of Unicode characters in script Egyptian_Hieroglyphs.
-	Elbasan                = _Elbasan                // Elbasan is the set of Unicode characters in script Elbasan.
-	Ethiopic               = _Ethiopic               // Ethiopic is the set of Unicode characters in script Ethiopic.
-	Georgian               = _Georgian               // Georgian is the set of Unicode characters in script Georgian.
-	Glagolitic             = _Glagolitic             // Glagolitic is the set of Unicode characters in script Glagolitic.
-	Gothic                 = _Gothic                 // Gothic is the set of Unicode characters in script Gothic.
-	Grantha                = _Grantha                // Grantha is the set of Unicode characters in script Grantha.
-	Greek                  = _Greek                  // Greek is the set of Unicode characters in script Greek.
-	Gujarati               = _Gujarati               // Gujarati is the set of Unicode characters in script Gujarati.
-	Gurmukhi               = _Gurmukhi               // Gurmukhi is the set of Unicode characters in script Gurmukhi.
-	Han                    = _Han                    // Han is the set of Unicode characters in script Han.
-	Hangul                 = _Hangul                 // Hangul is the set of Unicode characters in script Hangul.
-	Hanunoo                = _Hanunoo                // Hanunoo is the set of Unicode characters in script Hanunoo.
-	Hatran                 = _Hatran                 // Hatran is the set of Unicode characters in script Hatran.
-	Hebrew                 = _Hebrew                 // Hebrew is the set of Unicode characters in script Hebrew.
-	Hiragana               = _Hiragana               // Hiragana is the set of Unicode characters in script Hiragana.
-	Imperial_Aramaic       = _Imperial_Aramaic       // Imperial_Aramaic is the set of Unicode characters in script Imperial_Aramaic.
-	Inherited              = _Inherited              // Inherited is the set of Unicode characters in script Inherited.
-	Inscriptional_Pahlavi  = _Inscriptional_Pahlavi  // Inscriptional_Pahlavi is the set of Unicode characters in script Inscriptional_Pahlavi.
-	Inscriptional_Parthian = _Inscriptional_Parthian // Inscriptional_Parthian is the set of Unicode characters in script Inscriptional_Parthian.
-	Javanese               = _Javanese               // Javanese is the set of Unicode characters in script Javanese.
-	Kaithi                 = _Kaithi                 // Kaithi is the set of Unicode characters in script Kaithi.
-	Kannada                = _Kannada                // Kannada is the set of Unicode characters in script Kannada.
-	Katakana               = _Katakana               // Katakana is the set of Unicode characters in script Katakana.
-	Kayah_Li               = _Kayah_Li               // Kayah_Li is the set of Unicode characters in script Kayah_Li.
-	Kharoshthi             = _Kharoshthi             // Kharoshthi is the set of Unicode characters in script Kharoshthi.
-	Khmer                  = _Khmer                  // Khmer is the set of Unicode characters in script Khmer.
-	Khojki                 = _Khojki                 // Khojki is the set of Unicode characters in script Khojki.
-	Khudawadi              = _Khudawadi              // Khudawadi is the set of Unicode characters in script Khudawadi.
-	Lao                    = _Lao                    // Lao is the set of Unicode characters in script Lao.
-	Latin                  = _Latin                  // Latin is the set of Unicode characters in script Latin.
-	Lepcha                 = _Lepcha                 // Lepcha is the set of Unicode characters in script Lepcha.
-	Limbu                  = _Limbu                  // Limbu is the set of Unicode characters in script Limbu.
-	Linear_A               = _Linear_A               // Linear_A is the set of Unicode characters in script Linear_A.
-	Linear_B               = _Linear_B               // Linear_B is the set of Unicode characters in script Linear_B.
-	Lisu                   = _Lisu                   // Lisu is the set of Unicode characters in script Lisu.
-	Lycian                 = _Lycian                 // Lycian is the set of Unicode characters in script Lycian.
-	Lydian                 = _Lydian                 // Lydian is the set of Unicode characters in script Lydian.
-	Mahajani               = _Mahajani               // Mahajani is the set of Unicode characters in script Mahajani.
-	Malayalam              = _Malayalam              // Malayalam is the set of Unicode characters in script Malayalam.
-	Mandaic                = _Mandaic                // Mandaic is the set of Unicode characters in script Mandaic.
-	Manichaean             = _Manichaean             // Manichaean is the set of Unicode characters in script Manichaean.
-	Meetei_Mayek           = _Meetei_Mayek           // Meetei_Mayek is the set of Unicode characters in script Meetei_Mayek.
-	Mende_Kikakui          = _Mende_Kikakui          // Mende_Kikakui is the set of Unicode characters in script Mende_Kikakui.
-	Meroitic_Cursive       = _Meroitic_Cursive       // Meroitic_Cursive is the set of Unicode characters in script Meroitic_Cursive.
-	Meroitic_Hieroglyphs   = _Meroitic_Hieroglyphs   // Meroitic_Hieroglyphs is the set of Unicode characters in script Meroitic_Hieroglyphs.
-	Miao                   = _Miao                   // Miao is the set of Unicode characters in script Miao.
-	Modi                   = _Modi                   // Modi is the set of Unicode characters in script Modi.
-	Mongolian              = _Mongolian              // Mongolian is the set of Unicode characters in script Mongolian.
-	Mro                    = _Mro                    // Mro is the set of Unicode characters in script Mro.
-	Multani                = _Multani                // Multani is the set of Unicode characters in script Multani.
-	Myanmar                = _Myanmar                // Myanmar is the set of Unicode characters in script Myanmar.
-	Nabataean              = _Nabataean              // Nabataean is the set of Unicode characters in script Nabataean.
-	New_Tai_Lue            = _New_Tai_Lue            // New_Tai_Lue is the set of Unicode characters in script New_Tai_Lue.
-	Nko                    = _Nko                    // Nko is the set of Unicode characters in script Nko.
-	Ogham                  = _Ogham                  // Ogham is the set of Unicode characters in script Ogham.
-	Ol_Chiki               = _Ol_Chiki               // Ol_Chiki is the set of Unicode characters in script Ol_Chiki.
-	Old_Hungarian          = _Old_Hungarian          // Old_Hungarian is the set of Unicode characters in script Old_Hungarian.
-	Old_Italic             = _Old_Italic             // Old_Italic is the set of Unicode characters in script Old_Italic.
-	Old_North_Arabian      = _Old_North_Arabian      // Old_North_Arabian is the set of Unicode characters in script Old_North_Arabian.
-	Old_Permic             = _Old_Permic             // Old_Permic is the set of Unicode characters in script Old_Permic.
-	Old_Persian            = _Old_Persian            // Old_Persian is the set of Unicode characters in script Old_Persian.
-	Old_South_Arabian      = _Old_South_Arabian      // Old_South_Arabian is the set of Unicode characters in script Old_South_Arabian.
-	Old_Turkic             = _Old_Turkic             // Old_Turkic is the set of Unicode characters in script Old_Turkic.
-	Oriya                  = _Oriya                  // Oriya is the set of Unicode characters in script Oriya.
-	Osmanya                = _Osmanya                // Osmanya is the set of Unicode characters in script Osmanya.
-	Pahawh_Hmong           = _Pahawh_Hmong           // Pahawh_Hmong is the set of Unicode characters in script Pahawh_Hmong.
-	Palmyrene              = _Palmyrene              // Palmyrene is the set of Unicode characters in script Palmyrene.
-	Pau_Cin_Hau            = _Pau_Cin_Hau            // Pau_Cin_Hau is the set of Unicode characters in script Pau_Cin_Hau.
-	Phags_Pa               = _Phags_Pa               // Phags_Pa is the set of Unicode characters in script Phags_Pa.
-	Phoenician             = _Phoenician             // Phoenician is the set of Unicode characters in script Phoenician.
-	Psalter_Pahlavi        = _Psalter_Pahlavi        // Psalter_Pahlavi is the set of Unicode characters in script Psalter_Pahlavi.
-	Rejang                 = _Rejang                 // Rejang is the set of Unicode characters in script Rejang.
-	Runic                  = _Runic                  // Runic is the set of Unicode characters in script Runic.
-	Samaritan              = _Samaritan              // Samaritan is the set of Unicode characters in script Samaritan.
-	Saurashtra             = _Saurashtra             // Saurashtra is the set of Unicode characters in script Saurashtra.
-	Sharada                = _Sharada                // Sharada is the set of Unicode characters in script Sharada.
-	Shavian                = _Shavian                // Shavian is the set of Unicode characters in script Shavian.
-	Siddham                = _Siddham                // Siddham is the set of Unicode characters in script Siddham.
-	SignWriting            = _SignWriting            // SignWriting is the set of Unicode characters in script SignWriting.
-	Sinhala                = _Sinhala                // Sinhala is the set of Unicode characters in script Sinhala.
-	Sora_Sompeng           = _Sora_Sompeng           // Sora_Sompeng is the set of Unicode characters in script Sora_Sompeng.
-	Sundanese              = _Sundanese              // Sundanese is the set of Unicode characters in script Sundanese.
-	Syloti_Nagri           = _Syloti_Nagri           // Syloti_Nagri is the set of Unicode characters in script Syloti_Nagri.
-	Syriac                 = _Syriac                 // Syriac is the set of Unicode characters in script Syriac.
-	Tagalog                = _Tagalog                // Tagalog is the set of Unicode characters in script Tagalog.
-	Tagbanwa               = _Tagbanwa               // Tagbanwa is the set of Unicode characters in script Tagbanwa.
-	Tai_Le                 = _Tai_Le                 // Tai_Le is the set of Unicode characters in script Tai_Le.
-	Tai_Tham               = _Tai_Tham               // Tai_Tham is the set of Unicode characters in script Tai_Tham.
-	Tai_Viet               = _Tai_Viet               // Tai_Viet is the set of Unicode characters in script Tai_Viet.
-	Takri                  = _Takri                  // Takri is the set of Unicode characters in script Takri.
-	Tamil                  = _Tamil                  // Tamil is the set of Unicode characters in script Tamil.
-	Telugu                 = _Telugu                 // Telugu is the set of Unicode characters in script Telugu.
-	Thaana                 = _Thaana                 // Thaana is the set of Unicode characters in script Thaana.
-	Thai                   = _Thai                   // Thai is the set of Unicode characters in script Thai.
-	Tibetan                = _Tibetan                // Tibetan is the set of Unicode characters in script Tibetan.
-	Tifinagh               = _Tifinagh               // Tifinagh is the set of Unicode characters in script Tifinagh.
-	Tirhuta                = _Tirhuta                // Tirhuta is the set of Unicode characters in script Tirhuta.
-	Ugaritic               = _Ugaritic               // Ugaritic is the set of Unicode characters in script Ugaritic.
-	Vai                    = _Vai                    // Vai is the set of Unicode characters in script Vai.
-	Warang_Citi            = _Warang_Citi            // Warang_Citi is the set of Unicode characters in script Warang_Citi.
-	Yi                     = _Yi                     // Yi is the set of Unicode characters in script Yi.
-)
-
-// Generated by running
-//	maketables --props=all --url=http://www.unicode.org/Public/8.0.0/ucd/
-// DO NOT EDIT
-
-// Properties is the set of Unicode property tables.
-var Properties = map[string]*RangeTable{
-	"ASCII_Hex_Digit":                    ASCII_Hex_Digit,
-	"Bidi_Control":                       Bidi_Control,
-	"Dash":                               Dash,
-	"Deprecated":                         Deprecated,
-	"Diacritic":                          Diacritic,
-	"Extender":                           Extender,
-	"Hex_Digit":                          Hex_Digit,
-	"Hyphen":                             Hyphen,
-	"IDS_Binary_Operator":                IDS_Binary_Operator,
-	"IDS_Trinary_Operator":               IDS_Trinary_Operator,
-	"Ideographic":                        Ideographic,
-	"Join_Control":                       Join_Control,
-	"Logical_Order_Exception":            Logical_Order_Exception,
-	"Noncharacter_Code_Point":            Noncharacter_Code_Point,
-	"Other_Alphabetic":                   Other_Alphabetic,
-	"Other_Default_Ignorable_Code_Point": Other_Default_Ignorable_Code_Point,
-	"Other_Grapheme_Extend":              Other_Grapheme_Extend,
-	"Other_ID_Continue":                  Other_ID_Continue,
-	"Other_ID_Start":                     Other_ID_Start,
-	"Other_Lowercase":                    Other_Lowercase,
-	"Other_Math":                         Other_Math,
-	"Other_Uppercase":                    Other_Uppercase,
-	"Pattern_Syntax":                     Pattern_Syntax,
-	"Pattern_White_Space":                Pattern_White_Space,
-	"Quotation_Mark":                     Quotation_Mark,
-	"Radical":                            Radical,
-	"STerm":                              STerm,
-	"Soft_Dotted":                        Soft_Dotted,
-	"Terminal_Punctuation":               Terminal_Punctuation,
-	"Unified_Ideograph":                  Unified_Ideograph,
-	"Variation_Selector":                 Variation_Selector,
-	"White_Space":                        White_Space,
-}
-
-var _ASCII_Hex_Digit = &RangeTable{
-	R16: []Range16{
-		{0x0030, 0x0039, 1},
-		{0x0041, 0x0046, 1},
-		{0x0061, 0x0066, 1},
-	},
-	LatinOffset: 3,
-}
-
-var _Bidi_Control = &RangeTable{
-	R16: []Range16{
-		{0x061c, 0x061c, 1},
-		{0x200e, 0x200f, 1},
-		{0x202a, 0x202e, 1},
-		{0x2066, 0x2069, 1},
-	},
-}
-
-var _Dash = &RangeTable{
-	R16: []Range16{
-		{0x002d, 0x002d, 1},
-		{0x058a, 0x058a, 1},
-		{0x05be, 0x05be, 1},
-		{0x1400, 0x1400, 1},
-		{0x1806, 0x1806, 1},
-		{0x2010, 0x2015, 1},
-		{0x2053, 0x2053, 1},
-		{0x207b, 0x207b, 1},
-		{0x208b, 0x208b, 1},
-		{0x2212, 0x2212, 1},
-		{0x2e17, 0x2e17, 1},
-		{0x2e1a, 0x2e1a, 1},
-		{0x2e3a, 0x2e3b, 1},
-		{0x2e40, 0x2e40, 1},
-		{0x301c, 0x301c, 1},
-		{0x3030, 0x3030, 1},
-		{0x30a0, 0x30a0, 1},
-		{0xfe31, 0xfe32, 1},
-		{0xfe58, 0xfe58, 1},
-		{0xfe63, 0xfe63, 1},
-		{0xff0d, 0xff0d, 1},
-	},
-	LatinOffset: 1,
-}
-
-var _Deprecated = &RangeTable{
-	R16: []Range16{
-		{0x0149, 0x0149, 1},
-		{0x0673, 0x0673, 1},
-		{0x0f77, 0x0f77, 1},
-		{0x0f79, 0x0f79, 1},
-		{0x17a3, 0x17a4, 1},
-		{0x206a, 0x206f, 1},
-		{0x2329, 0x232a, 1},
-	},
-	R32: []Range32{
-		{0xe0001, 0xe0001, 1},
-		{0xe007f, 0xe007f, 1},
-	},
-}
-
-var _Diacritic = &RangeTable{
-	R16: []Range16{
-		{0x005e, 0x005e, 1},
-		{0x0060, 0x0060, 1},
-		{0x00a8, 0x00a8, 1},
-		{0x00af, 0x00af, 1},
-		{0x00b4, 0x00b4, 1},
-		{0x00b7, 0x00b8, 1},
-		{0x02b0, 0x034e, 1},
-		{0x0350, 0x0357, 1},
-		{0x035d, 0x0362, 1},
-		{0x0374, 0x0375, 1},
-		{0x037a, 0x037a, 1},
-		{0x0384, 0x0385, 1},
-		{0x0483, 0x0487, 1},
-		{0x0559, 0x0559, 1},
-		{0x0591, 0x05a1, 1},
-		{0x05a3, 0x05bd, 1},
-		{0x05bf, 0x05bf, 1},
-		{0x05c1, 0x05c2, 1},
-		{0x05c4, 0x05c4, 1},
-		{0x064b, 0x0652, 1},
-		{0x0657, 0x0658, 1},
-		{0x06df, 0x06e0, 1},
-		{0x06e5, 0x06e6, 1},
-		{0x06ea, 0x06ec, 1},
-		{0x0730, 0x074a, 1},
-		{0x07a6, 0x07b0, 1},
-		{0x07eb, 0x07f5, 1},
-		{0x0818, 0x0819, 1},
-		{0x08e3, 0x08fe, 1},
-		{0x093c, 0x093c, 1},
-		{0x094d, 0x094d, 1},
-		{0x0951, 0x0954, 1},
-		{0x0971, 0x0971, 1},
-		{0x09bc, 0x09bc, 1},
-		{0x09cd, 0x09cd, 1},
-		{0x0a3c, 0x0a3c, 1},
-		{0x0a4d, 0x0a4d, 1},
-		{0x0abc, 0x0abc, 1},
-		{0x0acd, 0x0acd, 1},
-		{0x0b3c, 0x0b3c, 1},
-		{0x0b4d, 0x0b4d, 1},
-		{0x0bcd, 0x0bcd, 1},
-		{0x0c4d, 0x0c4d, 1},
-		{0x0cbc, 0x0cbc, 1},
-		{0x0ccd, 0x0ccd, 1},
-		{0x0d4d, 0x0d4d, 1},
-		{0x0dca, 0x0dca, 1},
-		{0x0e47, 0x0e4c, 1},
-		{0x0e4e, 0x0e4e, 1},
-		{0x0ec8, 0x0ecc, 1},
-		{0x0f18, 0x0f19, 1},
-		{0x0f35, 0x0f35, 1},
-		{0x0f37, 0x0f37, 1},
-		{0x0f39, 0x0f39, 1},
-		{0x0f3e, 0x0f3f, 1},
-		{0x0f82, 0x0f84, 1},
-		{0x0f86, 0x0f87, 1},
-		{0x0fc6, 0x0fc6, 1},
-		{0x1037, 0x1037, 1},
-		{0x1039, 0x103a, 1},
-		{0x1087, 0x108d, 1},
-		{0x108f, 0x108f, 1},
-		{0x109a, 0x109b, 1},
-		{0x17c9, 0x17d3, 1},
-		{0x17dd, 0x17dd, 1},
-		{0x1939, 0x193b, 1},
-		{0x1a75, 0x1a7c, 1},
-		{0x1a7f, 0x1a7f, 1},
-		{0x1ab0, 0x1abd, 1},
-		{0x1b34, 0x1b34, 1},
-		{0x1b44, 0x1b44, 1},
-		{0x1b6b, 0x1b73, 1},
-		{0x1baa, 0x1bab, 1},
-		{0x1c36, 0x1c37, 1},
-		{0x1c78, 0x1c7d, 1},
-		{0x1cd0, 0x1ce8, 1},
-		{0x1ced, 0x1ced, 1},
-		{0x1cf4, 0x1cf4, 1},
-		{0x1cf8, 0x1cf9, 1},
-		{0x1d2c, 0x1d6a, 1},
-		{0x1dc4, 0x1dcf, 1},
-		{0x1df5, 0x1df5, 1},
-		{0x1dfd, 0x1dff, 1},
-		{0x1fbd, 0x1fbd, 1},
-		{0x1fbf, 0x1fc1, 1},
-		{0x1fcd, 0x1fcf, 1},
-		{0x1fdd, 0x1fdf, 1},
-		{0x1fed, 0x1fef, 1},
-		{0x1ffd, 0x1ffe, 1},
-		{0x2cef, 0x2cf1, 1},
-		{0x2e2f, 0x2e2f, 1},
-		{0x302a, 0x302f, 1},
-		{0x3099, 0x309c, 1},
-		{0x30fc, 0x30fc, 1},
-		{0xa66f, 0xa66f, 1},
-		{0xa67c, 0xa67d, 1},
-		{0xa67f, 0xa67f, 1},
-		{0xa69c, 0xa69d, 1},
-		{0xa6f0, 0xa6f1, 1},
-		{0xa717, 0xa721, 1},
-		{0xa788, 0xa788, 1},
-		{0xa7f8, 0xa7f9, 1},
-		{0xa8c4, 0xa8c4, 1},
-		{0xa8e0, 0xa8f1, 1},
-		{0xa92b, 0xa92e, 1},
-		{0xa953, 0xa953, 1},
-		{0xa9b3, 0xa9b3, 1},
-		{0xa9c0, 0xa9c0, 1},
-		{0xa9e5, 0xa9e5, 1},
-		{0xaa7b, 0xaa7d, 1},
-		{0xaabf, 0xaac2, 1},
-		{0xaaf6, 0xaaf6, 1},
-		{0xab5b, 0xab5f, 1},
-		{0xabec, 0xabed, 1},
-		{0xfb1e, 0xfb1e, 1},
-		{0xfe20, 0xfe2f, 1},
-		{0xff3e, 0xff3e, 1},
-		{0xff40, 0xff40, 1},
-		{0xff70, 0xff70, 1},
-		{0xff9e, 0xff9f, 1},
-		{0xffe3, 0xffe3, 1},
-	},
-	R32: []Range32{
-		{0x102e0, 0x102e0, 1},
-		{0x10ae5, 0x10ae6, 1},
-		{0x110b9, 0x110ba, 1},
-		{0x11133, 0x11134, 1},
-		{0x11173, 0x11173, 1},
-		{0x111c0, 0x111c0, 1},
-		{0x111ca, 0x111cc, 1},
-		{0x11235, 0x11236, 1},
-		{0x112e9, 0x112ea, 1},
-		{0x1133c, 0x1133c, 1},
-		{0x1134d, 0x1134d, 1},
-		{0x11366, 0x1136c, 1},
-		{0x11370, 0x11374, 1},
-		{0x114c2, 0x114c3, 1},
-		{0x115bf, 0x115c0, 1},
-		{0x1163f, 0x1163f, 1},
-		{0x116b6, 0x116b7, 1},
-		{0x1172b, 0x1172b, 1},
-		{0x16af0, 0x16af4, 1},
-		{0x16f8f, 0x16f9f, 1},
-		{0x1d167, 0x1d169, 1},
-		{0x1d16d, 0x1d172, 1},
-		{0x1d17b, 0x1d182, 1},
-		{0x1d185, 0x1d18b, 1},
-		{0x1d1aa, 0x1d1ad, 1},
-		{0x1e8d0, 0x1e8d6, 1},
-	},
-	LatinOffset: 6,
-}
-
-var _Extender = &RangeTable{
-	R16: []Range16{
-		{0x00b7, 0x00b7, 1},
-		{0x02d0, 0x02d1, 1},
-		{0x0640, 0x0640, 1},
-		{0x07fa, 0x07fa, 1},
-		{0x0e46, 0x0e46, 1},
-		{0x0ec6, 0x0ec6, 1},
-		{0x180a, 0x180a, 1},
-		{0x1843, 0x1843, 1},
-		{0x1aa7, 0x1aa7, 1},
-		{0x1c36, 0x1c36, 1},
-		{0x1c7b, 0x1c7b, 1},
-		{0x3005, 0x3005, 1},
-		{0x3031, 0x3035, 1},
-		{0x309d, 0x309e, 1},
-		{0x30fc, 0x30fe, 1},
-		{0xa015, 0xa015, 1},
-		{0xa60c, 0xa60c, 1},
-		{0xa9cf, 0xa9cf, 1},
-		{0xa9e6, 0xa9e6, 1},
-		{0xaa70, 0xaa70, 1},
-		{0xaadd, 0xaadd, 1},
-		{0xaaf3, 0xaaf4, 1},
-		{0xff70, 0xff70, 1},
-	},
-	R32: []Range32{
-		{0x1135d, 0x1135d, 1},
-		{0x115c6, 0x115c8, 1},
-		{0x16b42, 0x16b43, 1},
-	},
-	LatinOffset: 1,
-}
-
-var _Hex_Digit = &RangeTable{
-	R16: []Range16{
-		{0x0030, 0x0039, 1},
-		{0x0041, 0x0046, 1},
-		{0x0061, 0x0066, 1},
-		{0xff10, 0xff19, 1},
-		{0xff21, 0xff26, 1},
-		{0xff41, 0xff46, 1},
-	},
-	LatinOffset: 3,
-}
-
-var _Hyphen = &RangeTable{
-	R16: []Range16{
-		{0x002d, 0x002d, 1},
-		{0x00ad, 0x00ad, 1},
-		{0x058a, 0x058a, 1},
-		{0x1806, 0x1806, 1},
-		{0x2010, 0x2011, 1},
-		{0x2e17, 0x2e17, 1},
-		{0x30fb, 0x30fb, 1},
-		{0xfe63, 0xfe63, 1},
-		{0xff0d, 0xff0d, 1},
-		{0xff65, 0xff65, 1},
-	},
-	LatinOffset: 2,
-}
-
-var _IDS_Binary_Operator = &RangeTable{
-	R16: []Range16{
-		{0x2ff0, 0x2ff1, 1},
-		{0x2ff4, 0x2ffb, 1},
-	},
-}
-
-var _IDS_Trinary_Operator = &RangeTable{
-	R16: []Range16{
-		{0x2ff2, 0x2ff3, 1},
-	},
-}
-
-var _Ideographic = &RangeTable{
-	R16: []Range16{
-		{0x3006, 0x3007, 1},
-		{0x3021, 0x3029, 1},
-		{0x3038, 0x303a, 1},
-		{0x3400, 0x4db5, 1},
-		{0x4e00, 0x9fd5, 1},
-		{0xf900, 0xfa6d, 1},
-		{0xfa70, 0xfad9, 1},
-	},
-	R32: []Range32{
-		{0x20000, 0x2a6d6, 1},
-		{0x2a700, 0x2b734, 1},
-		{0x2b740, 0x2b81d, 1},
-		{0x2b820, 0x2cea1, 1},
-		{0x2f800, 0x2fa1d, 1},
-	},
-}
-
-var _Join_Control = &RangeTable{
-	R16: []Range16{
-		{0x200c, 0x200d, 1},
-	},
-}
-
-var _Logical_Order_Exception = &RangeTable{
-	R16: []Range16{
-		{0x0e40, 0x0e44, 1},
-		{0x0ec0, 0x0ec4, 1},
-		{0x19b5, 0x19b7, 1},
-		{0x19ba, 0x19ba, 1},
-		{0xaab5, 0xaab6, 1},
-		{0xaab9, 0xaab9, 1},
-		{0xaabb, 0xaabc, 1},
-	},
-}
-
-var _Noncharacter_Code_Point = &RangeTable{
-	R16: []Range16{
-		{0xfdd0, 0xfdef, 1},
-		{0xfffe, 0xffff, 1},
-	},
-	R32: []Range32{
-		{0x1fffe, 0x1ffff, 1},
-		{0x2fffe, 0x2ffff, 1},
-		{0x3fffe, 0x3ffff, 1},
-		{0x4fffe, 0x4ffff, 1},
-		{0x5fffe, 0x5ffff, 1},
-		{0x6fffe, 0x6ffff, 1},
-		{0x7fffe, 0x7ffff, 1},
-		{0x8fffe, 0x8ffff, 1},
-		{0x9fffe, 0x9ffff, 1},
-		{0xafffe, 0xaffff, 1},
-		{0xbfffe, 0xbffff, 1},
-		{0xcfffe, 0xcffff, 1},
-		{0xdfffe, 0xdffff, 1},
-		{0xefffe, 0xeffff, 1},
-		{0xffffe, 0xfffff, 1},
-		{0x10fffe, 0x10ffff, 1},
-	},
-}
-
-var _Other_Alphabetic = &RangeTable{
-	R16: []Range16{
-		{0x0345, 0x0345, 1},
-		{0x05b0, 0x05bd, 1},
-		{0x05bf, 0x05bf, 1},
-		{0x05c1, 0x05c2, 1},
-		{0x05c4, 0x05c5, 1},
-		{0x05c7, 0x05c7, 1},
-		{0x0610, 0x061a, 1},
-		{0x064b, 0x0657, 1},
-		{0x0659, 0x065f, 1},
-		{0x0670, 0x0670, 1},
-		{0x06d6, 0x06dc, 1},
-		{0x06e1, 0x06e4, 1},
-		{0x06e7, 0x06e8, 1},
-		{0x06ed, 0x06ed, 1},
-		{0x0711, 0x0711, 1},
-		{0x0730, 0x073f, 1},
-		{0x07a6, 0x07b0, 1},
-		{0x0816, 0x0817, 1},
-		{0x081b, 0x0823, 1},
-		{0x0825, 0x0827, 1},
-		{0x0829, 0x082c, 1},
-		{0x08e3, 0x08e9, 1},
-		{0x08f0, 0x0903, 1},
-		{0x093a, 0x093b, 1},
-		{0x093e, 0x094c, 1},
-		{0x094e, 0x094f, 1},
-		{0x0955, 0x0957, 1},
-		{0x0962, 0x0963, 1},
-		{0x0981, 0x0983, 1},
-		{0x09be, 0x09c4, 1},
-		{0x09c7, 0x09c8, 1},
-		{0x09cb, 0x09cc, 1},
-		{0x09d7, 0x09d7, 1},
-		{0x09e2, 0x09e3, 1},
-		{0x0a01, 0x0a03, 1},
-		{0x0a3e, 0x0a42, 1},
-		{0x0a47, 0x0a48, 1},
-		{0x0a4b, 0x0a4c, 1},
-		{0x0a51, 0x0a51, 1},
-		{0x0a70, 0x0a71, 1},
-		{0x0a75, 0x0a75, 1},
-		{0x0a81, 0x0a83, 1},
-		{0x0abe, 0x0ac5, 1},
-		{0x0ac7, 0x0ac9, 1},
-		{0x0acb, 0x0acc, 1},
-		{0x0ae2, 0x0ae3, 1},
-		{0x0b01, 0x0b03, 1},
-		{0x0b3e, 0x0b44, 1},
-		{0x0b47, 0x0b48, 1},
-		{0x0b4b, 0x0b4c, 1},
-		{0x0b56, 0x0b57, 1},
-		{0x0b62, 0x0b63, 1},
-		{0x0b82, 0x0b82, 1},
-		{0x0bbe, 0x0bc2, 1},
-		{0x0bc6, 0x0bc8, 1},
-		{0x0bca, 0x0bcc, 1},
-		{0x0bd7, 0x0bd7, 1},
-		{0x0c00, 0x0c03, 1},
-		{0x0c3e, 0x0c44, 1},
-		{0x0c46, 0x0c48, 1},
-		{0x0c4a, 0x0c4c, 1},
-		{0x0c55, 0x0c56, 1},
-		{0x0c62, 0x0c63, 1},
-		{0x0c81, 0x0c83, 1},
-		{0x0cbe, 0x0cc4, 1},
-		{0x0cc6, 0x0cc8, 1},
-		{0x0cca, 0x0ccc, 1},
-		{0x0cd5, 0x0cd6, 1},
-		{0x0ce2, 0x0ce3, 1},
-		{0x0d01, 0x0d03, 1},
-		{0x0d3e, 0x0d44, 1},
-		{0x0d46, 0x0d48, 1},
-		{0x0d4a, 0x0d4c, 1},
-		{0x0d57, 0x0d57, 1},
-		{0x0d62, 0x0d63, 1},
-		{0x0d82, 0x0d83, 1},
-		{0x0dcf, 0x0dd4, 1},
-		{0x0dd6, 0x0dd6, 1},
-		{0x0dd8, 0x0ddf, 1},
-		{0x0df2, 0x0df3, 1},
-		{0x0e31, 0x0e31, 1},
-		{0x0e34, 0x0e3a, 1},
-		{0x0e4d, 0x0e4d, 1},
-		{0x0eb1, 0x0eb1, 1},
-		{0x0eb4, 0x0eb9, 1},
-		{0x0ebb, 0x0ebc, 1},
-		{0x0ecd, 0x0ecd, 1},
-		{0x0f71, 0x0f81, 1},
-		{0x0f8d, 0x0f97, 1},
-		{0x0f99, 0x0fbc, 1},
-		{0x102b, 0x1036, 1},
-		{0x1038, 0x1038, 1},
-		{0x103b, 0x103e, 1},
-		{0x1056, 0x1059, 1},
-		{0x105e, 0x1060, 1},
-		{0x1062, 0x1062, 1},
-		{0x1067, 0x1068, 1},
-		{0x1071, 0x1074, 1},
-		{0x1082, 0x1086, 1},
-		{0x109c, 0x109d, 1},
-		{0x135f, 0x135f, 1},
-		{0x1712, 0x1713, 1},
-		{0x1732, 0x1733, 1},
-		{0x1752, 0x1753, 1},
-		{0x1772, 0x1773, 1},
-		{0x17b6, 0x17c8, 1},
-		{0x18a9, 0x18a9, 1},
-		{0x1920, 0x192b, 1},
-		{0x1930, 0x1938, 1},
-		{0x1a17, 0x1a1b, 1},
-		{0x1a55, 0x1a5e, 1},
-		{0x1a61, 0x1a74, 1},
-		{0x1b00, 0x1b04, 1},
-		{0x1b35, 0x1b43, 1},
-		{0x1b80, 0x1b82, 1},
-		{0x1ba1, 0x1ba9, 1},
-		{0x1bac, 0x1bad, 1},
-		{0x1be7, 0x1bf1, 1},
-		{0x1c24, 0x1c35, 1},
-		{0x1cf2, 0x1cf3, 1},
-		{0x1de7, 0x1df4, 1},
-		{0x24b6, 0x24e9, 1},
-		{0x2de0, 0x2dff, 1},
-		{0xa674, 0xa67b, 1},
-		{0xa69e, 0xa69f, 1},
-		{0xa823, 0xa827, 1},
-		{0xa880, 0xa881, 1},
-		{0xa8b4, 0xa8c3, 1},
-		{0xa926, 0xa92a, 1},
-		{0xa947, 0xa952, 1},
-		{0xa980, 0xa983, 1},
-		{0xa9b4, 0xa9bf, 1},
-		{0xaa29, 0xaa36, 1},
-		{0xaa43, 0xaa43, 1},
-		{0xaa4c, 0xaa4d, 1},
-		{0xaab0, 0xaab0, 1},
-		{0xaab2, 0xaab4, 1},
-		{0xaab7, 0xaab8, 1},
-		{0xaabe, 0xaabe, 1},
-		{0xaaeb, 0xaaef, 1},
-		{0xaaf5, 0xaaf5, 1},
-		{0xabe3, 0xabea, 1},
-		{0xfb1e, 0xfb1e, 1},
-	},
-	R32: []Range32{
-		{0x10376, 0x1037a, 1},
-		{0x10a01, 0x10a03, 1},
-		{0x10a05, 0x10a06, 1},
-		{0x10a0c, 0x10a0f, 1},
-		{0x11000, 0x11002, 1},
-		{0x11038, 0x11045, 1},
-		{0x11082, 0x11082, 1},
-		{0x110b0, 0x110b8, 1},
-		{0x11100, 0x11102, 1},
-		{0x11127, 0x11132, 1},
-		{0x11180, 0x11182, 1},
-		{0x111b3, 0x111bf, 1},
-		{0x1122c, 0x11234, 1},
-		{0x11237, 0x11237, 1},
-		{0x112df, 0x112e8, 1},
-		{0x11300, 0x11303, 1},
-		{0x1133e, 0x11344, 1},
-		{0x11347, 0x11348, 1},
-		{0x1134b, 0x1134c, 1},
-		{0x11357, 0x11357, 1},
-		{0x11362, 0x11363, 1},
-		{0x114b0, 0x114c1, 1},
-		{0x115af, 0x115b5, 1},
-		{0x115b8, 0x115be, 1},
-		{0x115dc, 0x115dd, 1},
-		{0x11630, 0x1163e, 1},
-		{0x11640, 0x11640, 1},
-		{0x116ab, 0x116b5, 1},
-		{0x1171d, 0x1172a, 1},
-		{0x16b30, 0x16b36, 1},
-		{0x16f51, 0x16f7e, 1},
-		{0x1bc9e, 0x1bc9e, 1},
-		{0x1f130, 0x1f149, 1},
-		{0x1f150, 0x1f169, 1},
-		{0x1f170, 0x1f189, 1},
-	},
-}
-
-var _Other_Default_Ignorable_Code_Point = &RangeTable{
-	R16: []Range16{
-		{0x034f, 0x034f, 1},
-		{0x115f, 0x1160, 1},
-		{0x17b4, 0x17b5, 1},
-		{0x2065, 0x2065, 1},
-		{0x3164, 0x3164, 1},
-		{0xffa0, 0xffa0, 1},
-		{0xfff0, 0xfff8, 1},
-	},
-	R32: []Range32{
-		{0xe0000, 0xe0000, 1},
-		{0xe0002, 0xe001f, 1},
-		{0xe0080, 0xe00ff, 1},
-		{0xe01f0, 0xe0fff, 1},
-	},
-}
-
-var _Other_Grapheme_Extend = &RangeTable{
-	R16: []Range16{
-		{0x09be, 0x09be, 1},
-		{0x09d7, 0x09d7, 1},
-		{0x0b3e, 0x0b3e, 1},
-		{0x0b57, 0x0b57, 1},
-		{0x0bbe, 0x0bbe, 1},
-		{0x0bd7, 0x0bd7, 1},
-		{0x0cc2, 0x0cc2, 1},
-		{0x0cd5, 0x0cd6, 1},
-		{0x0d3e, 0x0d3e, 1},
-		{0x0d57, 0x0d57, 1},
-		{0x0dcf, 0x0dcf, 1},
-		{0x0ddf, 0x0ddf, 1},
-		{0x200c, 0x200d, 1},
-		{0x302e, 0x302f, 1},
-		{0xff9e, 0xff9f, 1},
-	},
-	R32: []Range32{
-		{0x1133e, 0x1133e, 1},
-		{0x11357, 0x11357, 1},
-		{0x114b0, 0x114b0, 1},
-		{0x114bd, 0x114bd, 1},
-		{0x115af, 0x115af, 1},
-		{0x1d165, 0x1d165, 1},
-		{0x1d16e, 0x1d172, 1},
-	},
-}
-
-var _Other_ID_Continue = &RangeTable{
-	R16: []Range16{
-		{0x00b7, 0x00b7, 1},
-		{0x0387, 0x0387, 1},
-		{0x1369, 0x1371, 1},
-		{0x19da, 0x19da, 1},
-	},
-	LatinOffset: 1,
-}
-
-var _Other_ID_Start = &RangeTable{
-	R16: []Range16{
-		{0x2118, 0x2118, 1},
-		{0x212e, 0x212e, 1},
-		{0x309b, 0x309c, 1},
-	},
-}
-
-var _Other_Lowercase = &RangeTable{
-	R16: []Range16{
-		{0x00aa, 0x00aa, 1},
-		{0x00ba, 0x00ba, 1},
-		{0x02b0, 0x02b8, 1},
-		{0x02c0, 0x02c1, 1},
-		{0x02e0, 0x02e4, 1},
-		{0x0345, 0x0345, 1},
-		{0x037a, 0x037a, 1},
-		{0x1d2c, 0x1d6a, 1},
-		{0x1d78, 0x1d78, 1},
-		{0x1d9b, 0x1dbf, 1},
-		{0x2071, 0x2071, 1},
-		{0x207f, 0x207f, 1},
-		{0x2090, 0x209c, 1},
-		{0x2170, 0x217f, 1},
-		{0x24d0, 0x24e9, 1},
-		{0x2c7c, 0x2c7d, 1},
-		{0xa69c, 0xa69d, 1},
-		{0xa770, 0xa770, 1},
-		{0xa7f8, 0xa7f9, 1},
-		{0xab5c, 0xab5f, 1},
-	},
-	LatinOffset: 2,
-}
-
-var _Other_Math = &RangeTable{
-	R16: []Range16{
-		{0x005e, 0x005e, 1},
-		{0x03d0, 0x03d2, 1},
-		{0x03d5, 0x03d5, 1},
-		{0x03f0, 0x03f1, 1},
-		{0x03f4, 0x03f5, 1},
-		{0x2016, 0x2016, 1},
-		{0x2032, 0x2034, 1},
-		{0x2040, 0x2040, 1},
-		{0x2061, 0x2064, 1},
-		{0x207d, 0x207e, 1},
-		{0x208d, 0x208e, 1},
-		{0x20d0, 0x20dc, 1},
-		{0x20e1, 0x20e1, 1},
-		{0x20e5, 0x20e6, 1},
-		{0x20eb, 0x20ef, 1},
-		{0x2102, 0x2102, 1},
-		{0x2107, 0x2107, 1},
-		{0x210a, 0x2113, 1},
-		{0x2115, 0x2115, 1},
-		{0x2119, 0x211d, 1},
-		{0x2124, 0x2124, 1},
-		{0x2128, 0x2129, 1},
-		{0x212c, 0x212d, 1},
-		{0x212f, 0x2131, 1},
-		{0x2133, 0x2138, 1},
-		{0x213c, 0x213f, 1},
-		{0x2145, 0x2149, 1},
-		{0x2195, 0x2199, 1},
-		{0x219c, 0x219f, 1},
-		{0x21a1, 0x21a2, 1},
-		{0x21a4, 0x21a5, 1},
-		{0x21a7, 0x21a7, 1},
-		{0x21a9, 0x21ad, 1},
-		{0x21b0, 0x21b1, 1},
-		{0x21b6, 0x21b7, 1},
-		{0x21bc, 0x21cd, 1},
-		{0x21d0, 0x21d1, 1},
-		{0x21d3, 0x21d3, 1},
-		{0x21d5, 0x21db, 1},
-		{0x21dd, 0x21dd, 1},
-		{0x21e4, 0x21e5, 1},
-		{0x2308, 0x230b, 1},
-		{0x23b4, 0x23b5, 1},
-		{0x23b7, 0x23b7, 1},
-		{0x23d0, 0x23d0, 1},
-		{0x23e2, 0x23e2, 1},
-		{0x25a0, 0x25a1, 1},
-		{0x25ae, 0x25b6, 1},
-		{0x25bc, 0x25c0, 1},
-		{0x25c6, 0x25c7, 1},
-		{0x25ca, 0x25cb, 1},
-		{0x25cf, 0x25d3, 1},
-		{0x25e2, 0x25e2, 1},
-		{0x25e4, 0x25e4, 1},
-		{0x25e7, 0x25ec, 1},
-		{0x2605, 0x2606, 1},
-		{0x2640, 0x2640, 1},
-		{0x2642, 0x2642, 1},
-		{0x2660, 0x2663, 1},
-		{0x266d, 0x266e, 1},
-		{0x27c5, 0x27c6, 1},
-		{0x27e6, 0x27ef, 1},
-		{0x2983, 0x2998, 1},
-		{0x29d8, 0x29db, 1},
-		{0x29fc, 0x29fd, 1},
-		{0xfe61, 0xfe61, 1},
-		{0xfe63, 0xfe63, 1},
-		{0xfe68, 0xfe68, 1},
-		{0xff3c, 0xff3c, 1},
-		{0xff3e, 0xff3e, 1},
-	},
-	R32: []Range32{
-		{0x1d400, 0x1d454, 1},
-		{0x1d456, 0x1d49c, 1},
-		{0x1d49e, 0x1d49f, 1},
-		{0x1d4a2, 0x1d4a2, 1},
-		{0x1d4a5, 0x1d4a6, 1},
-		{0x1d4a9, 0x1d4ac, 1},
-		{0x1d4ae, 0x1d4b9, 1},
-		{0x1d4bb, 0x1d4bb, 1},
-		{0x1d4bd, 0x1d4c3, 1},
-		{0x1d4c5, 0x1d505, 1},
-		{0x1d507, 0x1d50a, 1},
-		{0x1d50d, 0x1d514, 1},
-		{0x1d516, 0x1d51c, 1},
-		{0x1d51e, 0x1d539, 1},
-		{0x1d53b, 0x1d53e, 1},
-		{0x1d540, 0x1d544, 1},
-		{0x1d546, 0x1d546, 1},
-		{0x1d54a, 0x1d550, 1},
-		{0x1d552, 0x1d6a5, 1},
-		{0x1d6a8, 0x1d6c0, 1},
-		{0x1d6c2, 0x1d6da, 1},
-		{0x1d6dc, 0x1d6fa, 1},
-		{0x1d6fc, 0x1d714, 1},
-		{0x1d716, 0x1d734, 1},
-		{0x1d736, 0x1d74e, 1},
-		{0x1d750, 0x1d76e, 1},
-		{0x1d770, 0x1d788, 1},
-		{0x1d78a, 0x1d7a8, 1},
-		{0x1d7aa, 0x1d7c2, 1},
-		{0x1d7c4, 0x1d7cb, 1},
-		{0x1d7ce, 0x1d7ff, 1},
-		{0x1ee00, 0x1ee03, 1},
-		{0x1ee05, 0x1ee1f, 1},
-		{0x1ee21, 0x1ee22, 1},
-		{0x1ee24, 0x1ee24, 1},
-		{0x1ee27, 0x1ee27, 1},
-		{0x1ee29, 0x1ee32, 1},
-		{0x1ee34, 0x1ee37, 1},
-		{0x1ee39, 0x1ee39, 1},
-		{0x1ee3b, 0x1ee3b, 1},
-		{0x1ee42, 0x1ee42, 1},
-		{0x1ee47, 0x1ee47, 1},
-		{0x1ee49, 0x1ee49, 1},
-		{0x1ee4b, 0x1ee4b, 1},
-		{0x1ee4d, 0x1ee4f, 1},
-		{0x1ee51, 0x1ee52, 1},
-		{0x1ee54, 0x1ee54, 1},
-		{0x1ee57, 0x1ee57, 1},
-		{0x1ee59, 0x1ee59, 1},
-		{0x1ee5b, 0x1ee5b, 1},
-		{0x1ee5d, 0x1ee5d, 1},
-		{0x1ee5f, 0x1ee5f, 1},
-		{0x1ee61, 0x1ee62, 1},
-		{0x1ee64, 0x1ee64, 1},
-		{0x1ee67, 0x1ee6a, 1},
-		{0x1ee6c, 0x1ee72, 1},
-		{0x1ee74, 0x1ee77, 1},
-		{0x1ee79, 0x1ee7c, 1},
-		{0x1ee7e, 0x1ee7e, 1},
-		{0x1ee80, 0x1ee89, 1},
-		{0x1ee8b, 0x1ee9b, 1},
-		{0x1eea1, 0x1eea3, 1},
-		{0x1eea5, 0x1eea9, 1},
-		{0x1eeab, 0x1eebb, 1},
-	},
-	LatinOffset: 1,
-}
-
-var _Other_Uppercase = &RangeTable{
-	R16: []Range16{
-		{0x2160, 0x216f, 1},
-		{0x24b6, 0x24cf, 1},
-	},
-	R32: []Range32{
-		{0x1f130, 0x1f149, 1},
-		{0x1f150, 0x1f169, 1},
-		{0x1f170, 0x1f189, 1},
-	},
-}
-
-var _Pattern_Syntax = &RangeTable{
-	R16: []Range16{
-		{0x0021, 0x002f, 1},
-		{0x003a, 0x0040, 1},
-		{0x005b, 0x005e, 1},
-		{0x0060, 0x0060, 1},
-		{0x007b, 0x007e, 1},
-		{0x00a1, 0x00a7, 1},
-		{0x00a9, 0x00a9, 1},
-		{0x00ab, 0x00ac, 1},
-		{0x00ae, 0x00ae, 1},
-		{0x00b0, 0x00b1, 1},
-		{0x00b6, 0x00b6, 1},
-		{0x00bb, 0x00bb, 1},
-		{0x00bf, 0x00bf, 1},
-		{0x00d7, 0x00d7, 1},
-		{0x00f7, 0x00f7, 1},
-		{0x2010, 0x2027, 1},
-		{0x2030, 0x203e, 1},
-		{0x2041, 0x2053, 1},
-		{0x2055, 0x205e, 1},
-		{0x2190, 0x245f, 1},
-		{0x2500, 0x2775, 1},
-		{0x2794, 0x2bff, 1},
-		{0x2e00, 0x2e7f, 1},
-		{0x3001, 0x3003, 1},
-		{0x3008, 0x3020, 1},
-		{0x3030, 0x3030, 1},
-		{0xfd3e, 0xfd3f, 1},
-		{0xfe45, 0xfe46, 1},
-	},
-	LatinOffset: 15,
-}
-
-var _Pattern_White_Space = &RangeTable{
-	R16: []Range16{
-		{0x0009, 0x000d, 1},
-		{0x0020, 0x0020, 1},
-		{0x0085, 0x0085, 1},
-		{0x200e, 0x200f, 1},
-		{0x2028, 0x2029, 1},
-	},
-	LatinOffset: 3,
-}
-
-var _Quotation_Mark = &RangeTable{
-	R16: []Range16{
-		{0x0022, 0x0022, 1},
-		{0x0027, 0x0027, 1},
-		{0x00ab, 0x00ab, 1},
-		{0x00bb, 0x00bb, 1},
-		{0x2018, 0x201f, 1},
-		{0x2039, 0x203a, 1},
-		{0x2e42, 0x2e42, 1},
-		{0x300c, 0x300f, 1},
-		{0x301d, 0x301f, 1},
-		{0xfe41, 0xfe44, 1},
-		{0xff02, 0xff02, 1},
-		{0xff07, 0xff07, 1},
-		{0xff62, 0xff63, 1},
-	},
-	LatinOffset: 4,
-}
-
-var _Radical = &RangeTable{
-	R16: []Range16{
-		{0x2e80, 0x2e99, 1},
-		{0x2e9b, 0x2ef3, 1},
-		{0x2f00, 0x2fd5, 1},
-	},
-}
-
-var _STerm = &RangeTable{
-	R16: []Range16{
-		{0x0021, 0x0021, 1},
-		{0x002e, 0x002e, 1},
-		{0x003f, 0x003f, 1},
-		{0x0589, 0x0589, 1},
-		{0x061f, 0x061f, 1},
-		{0x06d4, 0x06d4, 1},
-		{0x0700, 0x0702, 1},
-		{0x07f9, 0x07f9, 1},
-		{0x0964, 0x0965, 1},
-		{0x104a, 0x104b, 1},
-		{0x1362, 0x1362, 1},
-		{0x1367, 0x1368, 1},
-		{0x166e, 0x166e, 1},
-		{0x1735, 0x1736, 1},
-		{0x1803, 0x1803, 1},
-		{0x1809, 0x1809, 1},
-		{0x1944, 0x1945, 1},
-		{0x1aa8, 0x1aab, 1},
-		{0x1b5a, 0x1b5b, 1},
-		{0x1b5e, 0x1b5f, 1},
-		{0x1c3b, 0x1c3c, 1},
-		{0x1c7e, 0x1c7f, 1},
-		{0x203c, 0x203d, 1},
-		{0x2047, 0x2049, 1},
-		{0x2e2e, 0x2e2e, 1},
-		{0x2e3c, 0x2e3c, 1},
-		{0x3002, 0x3002, 1},
-		{0xa4ff, 0xa4ff, 1},
-		{0xa60e, 0xa60f, 1},
-		{0xa6f3, 0xa6f3, 1},
-		{0xa6f7, 0xa6f7, 1},
-		{0xa876, 0xa877, 1},
-		{0xa8ce, 0xa8cf, 1},
-		{0xa92f, 0xa92f, 1},
-		{0xa9c8, 0xa9c9, 1},
-		{0xaa5d, 0xaa5f, 1},
-		{0xaaf0, 0xaaf1, 1},
-		{0xabeb, 0xabeb, 1},
-		{0xfe52, 0xfe52, 1},
-		{0xfe56, 0xfe57, 1},
-		{0xff01, 0xff01, 1},
-		{0xff0e, 0xff0e, 1},
-		{0xff1f, 0xff1f, 1},
-		{0xff61, 0xff61, 1},
-	},
-	R32: []Range32{
-		{0x10a56, 0x10a57, 1},
-		{0x11047, 0x11048, 1},
-		{0x110be, 0x110c1, 1},
-		{0x11141, 0x11143, 1},
-		{0x111c5, 0x111c6, 1},
-		{0x111cd, 0x111cd, 1},
-		{0x111de, 0x111df, 1},
-		{0x11238, 0x11239, 1},
-		{0x1123b, 0x1123c, 1},
-		{0x112a9, 0x112a9, 1},
-		{0x115c2, 0x115c3, 1},
-		{0x115c9, 0x115d7, 1},
-		{0x11641, 0x11642, 1},
-		{0x1173c, 0x1173e, 1},
-		{0x16a6e, 0x16a6f, 1},
-		{0x16af5, 0x16af5, 1},
-		{0x16b37, 0x16b38, 1},
-		{0x16b44, 0x16b44, 1},
-		{0x1bc9f, 0x1bc9f, 1},
-		{0x1da88, 0x1da88, 1},
-	},
-	LatinOffset: 3,
-}
-
-var _Soft_Dotted = &RangeTable{
-	R16: []Range16{
-		{0x0069, 0x006a, 1},
-		{0x012f, 0x012f, 1},
-		{0x0249, 0x0249, 1},
-		{0x0268, 0x0268, 1},
-		{0x029d, 0x029d, 1},
-		{0x02b2, 0x02b2, 1},
-		{0x03f3, 0x03f3, 1},
-		{0x0456, 0x0456, 1},
-		{0x0458, 0x0458, 1},
-		{0x1d62, 0x1d62, 1},
-		{0x1d96, 0x1d96, 1},
-		{0x1da4, 0x1da4, 1},
-		{0x1da8, 0x1da8, 1},
-		{0x1e2d, 0x1e2d, 1},
-		{0x1ecb, 0x1ecb, 1},
-		{0x2071, 0x2071, 1},
-		{0x2148, 0x2149, 1},
-		{0x2c7c, 0x2c7c, 1},
-	},
-	R32: []Range32{
-		{0x1d422, 0x1d423, 1},
-		{0x1d456, 0x1d457, 1},
-		{0x1d48a, 0x1d48b, 1},
-		{0x1d4be, 0x1d4bf, 1},
-		{0x1d4f2, 0x1d4f3, 1},
-		{0x1d526, 0x1d527, 1},
-		{0x1d55a, 0x1d55b, 1},
-		{0x1d58e, 0x1d58f, 1},
-		{0x1d5c2, 0x1d5c3, 1},
-		{0x1d5f6, 0x1d5f7, 1},
-		{0x1d62a, 0x1d62b, 1},
-		{0x1d65e, 0x1d65f, 1},
-		{0x1d692, 0x1d693, 1},
-	},
-	LatinOffset: 1,
-}
-
-var _Terminal_Punctuation = &RangeTable{
-	R16: []Range16{
-		{0x0021, 0x0021, 1},
-		{0x002c, 0x002c, 1},
-		{0x002e, 0x002e, 1},
-		{0x003a, 0x003b, 1},
-		{0x003f, 0x003f, 1},
-		{0x037e, 0x037e, 1},
-		{0x0387, 0x0387, 1},
-		{0x0589, 0x0589, 1},
-		{0x05c3, 0x05c3, 1},
-		{0x060c, 0x060c, 1},
-		{0x061b, 0x061b, 1},
-		{0x061f, 0x061f, 1},
-		{0x06d4, 0x06d4, 1},
-		{0x0700, 0x070a, 1},
-		{0x070c, 0x070c, 1},
-		{0x07f8, 0x07f9, 1},
-		{0x0830, 0x083e, 1},
-		{0x085e, 0x085e, 1},
-		{0x0964, 0x0965, 1},
-		{0x0e5a, 0x0e5b, 1},
-		{0x0f08, 0x0f08, 1},
-		{0x0f0d, 0x0f12, 1},
-		{0x104a, 0x104b, 1},
-		{0x1361, 0x1368, 1},
-		{0x166d, 0x166e, 1},
-		{0x16eb, 0x16ed, 1},
-		{0x1735, 0x1736, 1},
-		{0x17d4, 0x17d6, 1},
-		{0x17da, 0x17da, 1},
-		{0x1802, 0x1805, 1},
-		{0x1808, 0x1809, 1},
-		{0x1944, 0x1945, 1},
-		{0x1aa8, 0x1aab, 1},
-		{0x1b5a, 0x1b5b, 1},
-		{0x1b5d, 0x1b5f, 1},
-		{0x1c3b, 0x1c3f, 1},
-		{0x1c7e, 0x1c7f, 1},
-		{0x203c, 0x203d, 1},
-		{0x2047, 0x2049, 1},
-		{0x2e2e, 0x2e2e, 1},
-		{0x2e3c, 0x2e3c, 1},
-		{0x2e41, 0x2e41, 1},
-		{0x3001, 0x3002, 1},
-		{0xa4fe, 0xa4ff, 1},
-		{0xa60d, 0xa60f, 1},
-		{0xa6f3, 0xa6f7, 1},
-		{0xa876, 0xa877, 1},
-		{0xa8ce, 0xa8cf, 1},
-		{0xa92f, 0xa92f, 1},
-		{0xa9c7, 0xa9c9, 1},
-		{0xaa5d, 0xaa5f, 1},
-		{0xaadf, 0xaadf, 1},
-		{0xaaf0, 0xaaf1, 1},
-		{0xabeb, 0xabeb, 1},
-		{0xfe50, 0xfe52, 1},
-		{0xfe54, 0xfe57, 1},
-		{0xff01, 0xff01, 1},
-		{0xff0c, 0xff0c, 1},
-		{0xff0e, 0xff0e, 1},
-		{0xff1a, 0xff1b, 1},
-		{0xff1f, 0xff1f, 1},
-		{0xff61, 0xff61, 1},
-		{0xff64, 0xff64, 1},
-	},
-	R32: []Range32{
-		{0x1039f, 0x1039f, 1},
-		{0x103d0, 0x103d0, 1},
-		{0x10857, 0x10857, 1},
-		{0x1091f, 0x1091f, 1},
-		{0x10a56, 0x10a57, 1},
-		{0x10af0, 0x10af5, 1},
-		{0x10b3a, 0x10b3f, 1},
-		{0x10b99, 0x10b9c, 1},
-		{0x11047, 0x1104d, 1},
-		{0x110be, 0x110c1, 1},
-		{0x11141, 0x11143, 1},
-		{0x111c5, 0x111c6, 1},
-		{0x111cd, 0x111cd, 1},
-		{0x111de, 0x111df, 1},
-		{0x11238, 0x1123c, 1},
-		{0x112a9, 0x112a9, 1},
-		{0x115c2, 0x115c5, 1},
-		{0x115c9, 0x115d7, 1},
-		{0x11641, 0x11642, 1},
-		{0x1173c, 0x1173e, 1},
-		{0x12470, 0x12474, 1},
-		{0x16a6e, 0x16a6f, 1},
-		{0x16af5, 0x16af5, 1},
-		{0x16b37, 0x16b39, 1},
-		{0x16b44, 0x16b44, 1},
-		{0x1bc9f, 0x1bc9f, 1},
-		{0x1da87, 0x1da8a, 1},
-	},
-	LatinOffset: 5,
-}
-
-var _Unified_Ideograph = &RangeTable{
-	R16: []Range16{
-		{0x3400, 0x4db5, 1},
-		{0x4e00, 0x9fd5, 1},
-		{0xfa0e, 0xfa0f, 1},
-		{0xfa11, 0xfa11, 1},
-		{0xfa13, 0xfa14, 1},
-		{0xfa1f, 0xfa1f, 1},
-		{0xfa21, 0xfa21, 1},
-		{0xfa23, 0xfa24, 1},
-		{0xfa27, 0xfa29, 1},
-	},
-	R32: []Range32{
-		{0x20000, 0x2a6d6, 1},
-		{0x2a700, 0x2b734, 1},
-		{0x2b740, 0x2b81d, 1},
-		{0x2b820, 0x2cea1, 1},
-	},
-}
-
-var _Variation_Selector = &RangeTable{
-	R16: []Range16{
-		{0x180b, 0x180d, 1},
-		{0xfe00, 0xfe0f, 1},
-	},
-	R32: []Range32{
-		{0xe0100, 0xe01ef, 1},
-	},
-}
-
-var _White_Space = &RangeTable{
-	R16: []Range16{
-		{0x0009, 0x000d, 1},
-		{0x0020, 0x0020, 1},
-		{0x0085, 0x0085, 1},
-		{0x00a0, 0x00a0, 1},
-		{0x1680, 0x1680, 1},
-		{0x2000, 0x200a, 1},
-		{0x2028, 0x2029, 1},
-		{0x202f, 0x202f, 1},
-		{0x205f, 0x205f, 1},
-		{0x3000, 0x3000, 1},
-	},
-	LatinOffset: 4,
-}
-
-// These variables have type *RangeTable.
-var (
-	ASCII_Hex_Digit                    = _ASCII_Hex_Digit                    // ASCII_Hex_Digit is the set of Unicode characters with property ASCII_Hex_Digit.
-	Bidi_Control                       = _Bidi_Control                       // Bidi_Control is the set of Unicode characters with property Bidi_Control.
-	Dash                               = _Dash                               // Dash is the set of Unicode characters with property Dash.
-	Deprecated                         = _Deprecated                         // Deprecated is the set of Unicode characters with property Deprecated.
-	Diacritic                          = _Diacritic                          // Diacritic is the set of Unicode characters with property Diacritic.
-	Extender                           = _Extender                           // Extender is the set of Unicode characters with property Extender.
-	Hex_Digit                          = _Hex_Digit                          // Hex_Digit is the set of Unicode characters with property Hex_Digit.
-	Hyphen                             = _Hyphen                             // Hyphen is the set of Unicode characters with property Hyphen.
-	IDS_Binary_Operator                = _IDS_Binary_Operator                // IDS_Binary_Operator is the set of Unicode characters with property IDS_Binary_Operator.
-	IDS_Trinary_Operator               = _IDS_Trinary_Operator               // IDS_Trinary_Operator is the set of Unicode characters with property IDS_Trinary_Operator.
-	Ideographic                        = _Ideographic                        // Ideographic is the set of Unicode characters with property Ideographic.
-	Join_Control                       = _Join_Control                       // Join_Control is the set of Unicode characters with property Join_Control.
-	Logical_Order_Exception            = _Logical_Order_Exception            // Logical_Order_Exception is the set of Unicode characters with property Logical_Order_Exception.
-	Noncharacter_Code_Point            = _Noncharacter_Code_Point            // Noncharacter_Code_Point is the set of Unicode characters with property Noncharacter_Code_Point.
-	Other_Alphabetic                   = _Other_Alphabetic                   // Other_Alphabetic is the set of Unicode characters with property Other_Alphabetic.
-	Other_Default_Ignorable_Code_Point = _Other_Default_Ignorable_Code_Point // Other_Default_Ignorable_Code_Point is the set of Unicode characters with property Other_Default_Ignorable_Code_Point.
-	Other_Grapheme_Extend              = _Other_Grapheme_Extend              // Other_Grapheme_Extend is the set of Unicode characters with property Other_Grapheme_Extend.
-	Other_ID_Continue                  = _Other_ID_Continue                  // Other_ID_Continue is the set of Unicode characters with property Other_ID_Continue.
-	Other_ID_Start                     = _Other_ID_Start                     // Other_ID_Start is the set of Unicode characters with property Other_ID_Start.
-	Other_Lowercase                    = _Other_Lowercase                    // Other_Lowercase is the set of Unicode characters with property Other_Lowercase.
-	Other_Math                         = _Other_Math                         // Other_Math is the set of Unicode characters with property Other_Math.
-	Other_Uppercase                    = _Other_Uppercase                    // Other_Uppercase is the set of Unicode characters with property Other_Uppercase.
-	Pattern_Syntax                     = _Pattern_Syntax                     // Pattern_Syntax is the set of Unicode characters with property Pattern_Syntax.
-	Pattern_White_Space                = _Pattern_White_Space                // Pattern_White_Space is the set of Unicode characters with property Pattern_White_Space.
-	Quotation_Mark                     = _Quotation_Mark                     // Quotation_Mark is the set of Unicode characters with property Quotation_Mark.
-	Radical                            = _Radical                            // Radical is the set of Unicode characters with property Radical.
-	STerm                              = _STerm                              // STerm is the set of Unicode characters with property STerm.
-	Soft_Dotted                        = _Soft_Dotted                        // Soft_Dotted is the set of Unicode characters with property Soft_Dotted.
-	Terminal_Punctuation               = _Terminal_Punctuation               // Terminal_Punctuation is the set of Unicode characters with property Terminal_Punctuation.
-	Unified_Ideograph                  = _Unified_Ideograph                  // Unified_Ideograph is the set of Unicode characters with property Unified_Ideograph.
-	Variation_Selector                 = _Variation_Selector                 // Variation_Selector is the set of Unicode characters with property Variation_Selector.
-	White_Space                        = _White_Space                        // White_Space is the set of Unicode characters with property White_Space.
-)
-
-// Generated by running
-//	maketables --data=http://www.unicode.org/Public/8.0.0/ucd/UnicodeData.txt --casefolding=http://www.unicode.org/Public/8.0.0/ucd/CaseFolding.txt
-// DO NOT EDIT
-
-// CaseRanges is the table describing case mappings for all letters with
-// non-self mappings.
-var CaseRanges = _CaseRanges
-var _CaseRanges = []CaseRange{
-	{0x0041, 0x005A, d{0, 32, 0}},
-	{0x0061, 0x007A, d{-32, 0, -32}},
-	{0x00B5, 0x00B5, d{743, 0, 743}},
-	{0x00C0, 0x00D6, d{0, 32, 0}},
-	{0x00D8, 0x00DE, d{0, 32, 0}},
-	{0x00E0, 0x00F6, d{-32, 0, -32}},
-	{0x00F8, 0x00FE, d{-32, 0, -32}},
-	{0x00FF, 0x00FF, d{121, 0, 121}},
-	{0x0100, 0x012F, d{UpperLower, UpperLower, UpperLower}},
-	{0x0130, 0x0130, d{0, -199, 0}},
-	{0x0131, 0x0131, d{-232, 0, -232}},
-	{0x0132, 0x0137, d{UpperLower, UpperLower, UpperLower}},
-	{0x0139, 0x0148, d{UpperLower, UpperLower, UpperLower}},
-	{0x014A, 0x0177, d{UpperLower, UpperLower, UpperLower}},
-	{0x0178, 0x0178, d{0, -121, 0}},
-	{0x0179, 0x017E, d{UpperLower, UpperLower, UpperLower}},
-	{0x017F, 0x017F, d{-300, 0, -300}},
-	{0x0180, 0x0180, d{195, 0, 195}},
-	{0x0181, 0x0181, d{0, 210, 0}},
-	{0x0182, 0x0185, d{UpperLower, UpperLower, UpperLower}},
-	{0x0186, 0x0186, d{0, 206, 0}},
-	{0x0187, 0x0188, d{UpperLower, UpperLower, UpperLower}},
-	{0x0189, 0x018A, d{0, 205, 0}},
-	{0x018B, 0x018C, d{UpperLower, UpperLower, UpperLower}},
-	{0x018E, 0x018E, d{0, 79, 0}},
-	{0x018F, 0x018F, d{0, 202, 0}},
-	{0x0190, 0x0190, d{0, 203, 0}},
-	{0x0191, 0x0192, d{UpperLower, UpperLower, UpperLower}},
-	{0x0193, 0x0193, d{0, 205, 0}},
-	{0x0194, 0x0194, d{0, 207, 0}},
-	{0x0195, 0x0195, d{97, 0, 97}},
-	{0x0196, 0x0196, d{0, 211, 0}},
-	{0x0197, 0x0197, d{0, 209, 0}},
-	{0x0198, 0x0199, d{UpperLower, UpperLower, UpperLower}},
-	{0x019A, 0x019A, d{163, 0, 163}},
-	{0x019C, 0x019C, d{0, 211, 0}},
-	{0x019D, 0x019D, d{0, 213, 0}},
-	{0x019E, 0x019E, d{130, 0, 130}},
-	{0x019F, 0x019F, d{0, 214, 0}},
-	{0x01A0, 0x01A5, d{UpperLower, UpperLower, UpperLower}},
-	{0x01A6, 0x01A6, d{0, 218, 0}},
-	{0x01A7, 0x01A8, d{UpperLower, UpperLower, UpperLower}},
-	{0x01A9, 0x01A9, d{0, 218, 0}},
-	{0x01AC, 0x01AD, d{UpperLower, UpperLower, UpperLower}},
-	{0x01AE, 0x01AE, d{0, 218, 0}},
-	{0x01AF, 0x01B0, d{UpperLower, UpperLower, UpperLower}},
-	{0x01B1, 0x01B2, d{0, 217, 0}},
-	{0x01B3, 0x01B6, d{UpperLower, UpperLower, UpperLower}},
-	{0x01B7, 0x01B7, d{0, 219, 0}},
-	{0x01B8, 0x01B9, d{UpperLower, UpperLower, UpperLower}},
-	{0x01BC, 0x01BD, d{UpperLower, UpperLower, UpperLower}},
-	{0x01BF, 0x01BF, d{56, 0, 56}},
-	{0x01C4, 0x01C4, d{0, 2, 1}},
-	{0x01C5, 0x01C5, d{-1, 1, 0}},
-	{0x01C6, 0x01C6, d{-2, 0, -1}},
-	{0x01C7, 0x01C7, d{0, 2, 1}},
-	{0x01C8, 0x01C8, d{-1, 1, 0}},
-	{0x01C9, 0x01C9, d{-2, 0, -1}},
-	{0x01CA, 0x01CA, d{0, 2, 1}},
-	{0x01CB, 0x01CB, d{-1, 1, 0}},
-	{0x01CC, 0x01CC, d{-2, 0, -1}},
-	{0x01CD, 0x01DC, d{UpperLower, UpperLower, UpperLower}},
-	{0x01DD, 0x01DD, d{-79, 0, -79}},
-	{0x01DE, 0x01EF, d{UpperLower, UpperLower, UpperLower}},
-	{0x01F1, 0x01F1, d{0, 2, 1}},
-	{0x01F2, 0x01F2, d{-1, 1, 0}},
-	{0x01F3, 0x01F3, d{-2, 0, -1}},
-	{0x01F4, 0x01F5, d{UpperLower, UpperLower, UpperLower}},
-	{0x01F6, 0x01F6, d{0, -97, 0}},
-	{0x01F7, 0x01F7, d{0, -56, 0}},
-	{0x01F8, 0x021F, d{UpperLower, UpperLower, UpperLower}},
-	{0x0220, 0x0220, d{0, -130, 0}},
-	{0x0222, 0x0233, d{UpperLower, UpperLower, UpperLower}},
-	{0x023A, 0x023A, d{0, 10795, 0}},
-	{0x023B, 0x023C, d{UpperLower, UpperLower, UpperLower}},
-	{0x023D, 0x023D, d{0, -163, 0}},
-	{0x023E, 0x023E, d{0, 10792, 0}},
-	{0x023F, 0x0240, d{10815, 0, 10815}},
-	{0x0241, 0x0242, d{UpperLower, UpperLower, UpperLower}},
-	{0x0243, 0x0243, d{0, -195, 0}},
-	{0x0244, 0x0244, d{0, 69, 0}},
-	{0x0245, 0x0245, d{0, 71, 0}},
-	{0x0246, 0x024F, d{UpperLower, UpperLower, UpperLower}},
-	{0x0250, 0x0250, d{10783, 0, 10783}},
-	{0x0251, 0x0251, d{10780, 0, 10780}},
-	{0x0252, 0x0252, d{10782, 0, 10782}},
-	{0x0253, 0x0253, d{-210, 0, -210}},
-	{0x0254, 0x0254, d{-206, 0, -206}},
-	{0x0256, 0x0257, d{-205, 0, -205}},
-	{0x0259, 0x0259, d{-202, 0, -202}},
-	{0x025B, 0x025B, d{-203, 0, -203}},
-	{0x025C, 0x025C, d{42319, 0, 42319}},
-	{0x0260, 0x0260, d{-205, 0, -205}},
-	{0x0261, 0x0261, d{42315, 0, 42315}},
-	{0x0263, 0x0263, d{-207, 0, -207}},
-	{0x0265, 0x0265, d{42280, 0, 42280}},
-	{0x0266, 0x0266, d{42308, 0, 42308}},
-	{0x0268, 0x0268, d{-209, 0, -209}},
-	{0x0269, 0x0269, d{-211, 0, -211}},
-	{0x026B, 0x026B, d{10743, 0, 10743}},
-	{0x026C, 0x026C, d{42305, 0, 42305}},
-	{0x026F, 0x026F, d{-211, 0, -211}},
-	{0x0271, 0x0271, d{10749, 0, 10749}},
-	{0x0272, 0x0272, d{-213, 0, -213}},
-	{0x0275, 0x0275, d{-214, 0, -214}},
-	{0x027D, 0x027D, d{10727, 0, 10727}},
-	{0x0280, 0x0280, d{-218, 0, -218}},
-	{0x0283, 0x0283, d{-218, 0, -218}},
-	{0x0287, 0x0287, d{42282, 0, 42282}},
-	{0x0288, 0x0288, d{-218, 0, -218}},
-	{0x0289, 0x0289, d{-69, 0, -69}},
-	{0x028A, 0x028B, d{-217, 0, -217}},
-	{0x028C, 0x028C, d{-71, 0, -71}},
-	{0x0292, 0x0292, d{-219, 0, -219}},
-	{0x029D, 0x029D, d{42261, 0, 42261}},
-	{0x029E, 0x029E, d{42258, 0, 42258}},
-	{0x0345, 0x0345, d{84, 0, 84}},
-	{0x0370, 0x0373, d{UpperLower, UpperLower, UpperLower}},
-	{0x0376, 0x0377, d{UpperLower, UpperLower, UpperLower}},
-	{0x037B, 0x037D, d{130, 0, 130}},
-	{0x037F, 0x037F, d{0, 116, 0}},
-	{0x0386, 0x0386, d{0, 38, 0}},
-	{0x0388, 0x038A, d{0, 37, 0}},
-	{0x038C, 0x038C, d{0, 64, 0}},
-	{0x038E, 0x038F, d{0, 63, 0}},
-	{0x0391, 0x03A1, d{0, 32, 0}},
-	{0x03A3, 0x03AB, d{0, 32, 0}},
-	{0x03AC, 0x03AC, d{-38, 0, -38}},
-	{0x03AD, 0x03AF, d{-37, 0, -37}},
-	{0x03B1, 0x03C1, d{-32, 0, -32}},
-	{0x03C2, 0x03C2, d{-31, 0, -31}},
-	{0x03C3, 0x03CB, d{-32, 0, -32}},
-	{0x03CC, 0x03CC, d{-64, 0, -64}},
-	{0x03CD, 0x03CE, d{-63, 0, -63}},
-	{0x03CF, 0x03CF, d{0, 8, 0}},
-	{0x03D0, 0x03D0, d{-62, 0, -62}},
-	{0x03D1, 0x03D1, d{-57, 0, -57}},
-	{0x03D5, 0x03D5, d{-47, 0, -47}},
-	{0x03D6, 0x03D6, d{-54, 0, -54}},
-	{0x03D7, 0x03D7, d{-8, 0, -8}},
-	{0x03D8, 0x03EF, d{UpperLower, UpperLower, UpperLower}},
-	{0x03F0, 0x03F0, d{-86, 0, -86}},
-	{0x03F1, 0x03F1, d{-80, 0, -80}},
-	{0x03F2, 0x03F2, d{7, 0, 7}},
-	{0x03F3, 0x03F3, d{-116, 0, -116}},
-	{0x03F4, 0x03F4, d{0, -60, 0}},
-	{0x03F5, 0x03F5, d{-96, 0, -96}},
-	{0x03F7, 0x03F8, d{UpperLower, UpperLower, UpperLower}},
-	{0x03F9, 0x03F9, d{0, -7, 0}},
-	{0x03FA, 0x03FB, d{UpperLower, UpperLower, UpperLower}},
-	{0x03FD, 0x03FF, d{0, -130, 0}},
-	{0x0400, 0x040F, d{0, 80, 0}},
-	{0x0410, 0x042F, d{0, 32, 0}},
-	{0x0430, 0x044F, d{-32, 0, -32}},
-	{0x0450, 0x045F, d{-80, 0, -80}},
-	{0x0460, 0x0481, d{UpperLower, UpperLower, UpperLower}},
-	{0x048A, 0x04BF, d{UpperLower, UpperLower, UpperLower}},
-	{0x04C0, 0x04C0, d{0, 15, 0}},
-	{0x04C1, 0x04CE, d{UpperLower, UpperLower, UpperLower}},
-	{0x04CF, 0x04CF, d{-15, 0, -15}},
-	{0x04D0, 0x052F, d{UpperLower, UpperLower, UpperLower}},
-	{0x0531, 0x0556, d{0, 48, 0}},
-	{0x0561, 0x0586, d{-48, 0, -48}},
-	{0x10A0, 0x10C5, d{0, 7264, 0}},
-	{0x10C7, 0x10C7, d{0, 7264, 0}},
-	{0x10CD, 0x10CD, d{0, 7264, 0}},
-	{0x13A0, 0x13EF, d{0, 38864, 0}},
-	{0x13F0, 0x13F5, d{0, 8, 0}},
-	{0x13F8, 0x13FD, d{-8, 0, -8}},
-	{0x1D79, 0x1D79, d{35332, 0, 35332}},
-	{0x1D7D, 0x1D7D, d{3814, 0, 3814}},
-	{0x1E00, 0x1E95, d{UpperLower, UpperLower, UpperLower}},
-	{0x1E9B, 0x1E9B, d{-59, 0, -59}},
-	{0x1E9E, 0x1E9E, d{0, -7615, 0}},
-	{0x1EA0, 0x1EFF, d{UpperLower, UpperLower, UpperLower}},
-	{0x1F00, 0x1F07, d{8, 0, 8}},
-	{0x1F08, 0x1F0F, d{0, -8, 0}},
-	{0x1F10, 0x1F15, d{8, 0, 8}},
-	{0x1F18, 0x1F1D, d{0, -8, 0}},
-	{0x1F20, 0x1F27, d{8, 0, 8}},
-	{0x1F28, 0x1F2F, d{0, -8, 0}},
-	{0x1F30, 0x1F37, d{8, 0, 8}},
-	{0x1F38, 0x1F3F, d{0, -8, 0}},
-	{0x1F40, 0x1F45, d{8, 0, 8}},
-	{0x1F48, 0x1F4D, d{0, -8, 0}},
-	{0x1F51, 0x1F51, d{8, 0, 8}},
-	{0x1F53, 0x1F53, d{8, 0, 8}},
-	{0x1F55, 0x1F55, d{8, 0, 8}},
-	{0x1F57, 0x1F57, d{8, 0, 8}},
-	{0x1F59, 0x1F59, d{0, -8, 0}},
-	{0x1F5B, 0x1F5B, d{0, -8, 0}},
-	{0x1F5D, 0x1F5D, d{0, -8, 0}},
-	{0x1F5F, 0x1F5F, d{0, -8, 0}},
-	{0x1F60, 0x1F67, d{8, 0, 8}},
-	{0x1F68, 0x1F6F, d{0, -8, 0}},
-	{0x1F70, 0x1F71, d{74, 0, 74}},
-	{0x1F72, 0x1F75, d{86, 0, 86}},
-	{0x1F76, 0x1F77, d{100, 0, 100}},
-	{0x1F78, 0x1F79, d{128, 0, 128}},
-	{0x1F7A, 0x1F7B, d{112, 0, 112}},
-	{0x1F7C, 0x1F7D, d{126, 0, 126}},
-	{0x1F80, 0x1F87, d{8, 0, 8}},
-	{0x1F88, 0x1F8F, d{0, -8, 0}},
-	{0x1F90, 0x1F97, d{8, 0, 8}},
-	{0x1F98, 0x1F9F, d{0, -8, 0}},
-	{0x1FA0, 0x1FA7, d{8, 0, 8}},
-	{0x1FA8, 0x1FAF, d{0, -8, 0}},
-	{0x1FB0, 0x1FB1, d{8, 0, 8}},
-	{0x1FB3, 0x1FB3, d{9, 0, 9}},
-	{0x1FB8, 0x1FB9, d{0, -8, 0}},
-	{0x1FBA, 0x1FBB, d{0, -74, 0}},
-	{0x1FBC, 0x1FBC, d{0, -9, 0}},
-	{0x1FBE, 0x1FBE, d{-7205, 0, -7205}},
-	{0x1FC3, 0x1FC3, d{9, 0, 9}},
-	{0x1FC8, 0x1FCB, d{0, -86, 0}},
-	{0x1FCC, 0x1FCC, d{0, -9, 0}},
-	{0x1FD0, 0x1FD1, d{8, 0, 8}},
-	{0x1FD8, 0x1FD9, d{0, -8, 0}},
-	{0x1FDA, 0x1FDB, d{0, -100, 0}},
-	{0x1FE0, 0x1FE1, d{8, 0, 8}},
-	{0x1FE5, 0x1FE5, d{7, 0, 7}},
-	{0x1FE8, 0x1FE9, d{0, -8, 0}},
-	{0x1FEA, 0x1FEB, d{0, -112, 0}},
-	{0x1FEC, 0x1FEC, d{0, -7, 0}},
-	{0x1FF3, 0x1FF3, d{9, 0, 9}},
-	{0x1FF8, 0x1FF9, d{0, -128, 0}},
-	{0x1FFA, 0x1FFB, d{0, -126, 0}},
-	{0x1FFC, 0x1FFC, d{0, -9, 0}},
-	{0x2126, 0x2126, d{0, -7517, 0}},
-	{0x212A, 0x212A, d{0, -8383, 0}},
-	{0x212B, 0x212B, d{0, -8262, 0}},
-	{0x2132, 0x2132, d{0, 28, 0}},
-	{0x214E, 0x214E, d{-28, 0, -28}},
-	{0x2160, 0x216F, d{0, 16, 0}},
-	{0x2170, 0x217F, d{-16, 0, -16}},
-	{0x2183, 0x2184, d{UpperLower, UpperLower, UpperLower}},
-	{0x24B6, 0x24CF, d{0, 26, 0}},
-	{0x24D0, 0x24E9, d{-26, 0, -26}},
-	{0x2C00, 0x2C2E, d{0, 48, 0}},
-	{0x2C30, 0x2C5E, d{-48, 0, -48}},
-	{0x2C60, 0x2C61, d{UpperLower, UpperLower, UpperLower}},
-	{0x2C62, 0x2C62, d{0, -10743, 0}},
-	{0x2C63, 0x2C63, d{0, -3814, 0}},
-	{0x2C64, 0x2C64, d{0, -10727, 0}},
-	{0x2C65, 0x2C65, d{-10795, 0, -10795}},
-	{0x2C66, 0x2C66, d{-10792, 0, -10792}},
-	{0x2C67, 0x2C6C, d{UpperLower, UpperLower, UpperLower}},
-	{0x2C6D, 0x2C6D, d{0, -10780, 0}},
-	{0x2C6E, 0x2C6E, d{0, -10749, 0}},
-	{0x2C6F, 0x2C6F, d{0, -10783, 0}},
-	{0x2C70, 0x2C70, d{0, -10782, 0}},
-	{0x2C72, 0x2C73, d{UpperLower, UpperLower, UpperLower}},
-	{0x2C75, 0x2C76, d{UpperLower, UpperLower, UpperLower}},
-	{0x2C7E, 0x2C7F, d{0, -10815, 0}},
-	{0x2C80, 0x2CE3, d{UpperLower, UpperLower, UpperLower}},
-	{0x2CEB, 0x2CEE, d{UpperLower, UpperLower, UpperLower}},
-	{0x2CF2, 0x2CF3, d{UpperLower, UpperLower, UpperLower}},
-	{0x2D00, 0x2D25, d{-7264, 0, -7264}},
-	{0x2D27, 0x2D27, d{-7264, 0, -7264}},
-	{0x2D2D, 0x2D2D, d{-7264, 0, -7264}},
-	{0xA640, 0xA66D, d{UpperLower, UpperLower, UpperLower}},
-	{0xA680, 0xA69B, d{UpperLower, UpperLower, UpperLower}},
-	{0xA722, 0xA72F, d{UpperLower, UpperLower, UpperLower}},
-	{0xA732, 0xA76F, d{UpperLower, UpperLower, UpperLower}},
-	{0xA779, 0xA77C, d{UpperLower, UpperLower, UpperLower}},
-	{0xA77D, 0xA77D, d{0, -35332, 0}},
-	{0xA77E, 0xA787, d{UpperLower, UpperLower, UpperLower}},
-	{0xA78B, 0xA78C, d{UpperLower, UpperLower, UpperLower}},
-	{0xA78D, 0xA78D, d{0, -42280, 0}},
-	{0xA790, 0xA793, d{UpperLower, UpperLower, UpperLower}},
-	{0xA796, 0xA7A9, d{UpperLower, UpperLower, UpperLower}},
-	{0xA7AA, 0xA7AA, d{0, -42308, 0}},
-	{0xA7AB, 0xA7AB, d{0, -42319, 0}},
-	{0xA7AC, 0xA7AC, d{0, -42315, 0}},
-	{0xA7AD, 0xA7AD, d{0, -42305, 0}},
-	{0xA7B0, 0xA7B0, d{0, -42258, 0}},
-	{0xA7B1, 0xA7B1, d{0, -42282, 0}},
-	{0xA7B2, 0xA7B2, d{0, -42261, 0}},
-	{0xA7B3, 0xA7B3, d{0, 928, 0}},
-	{0xA7B4, 0xA7B7, d{UpperLower, UpperLower, UpperLower}},
-	{0xAB53, 0xAB53, d{-928, 0, -928}},
-	{0xAB70, 0xABBF, d{-38864, 0, -38864}},
-	{0xFF21, 0xFF3A, d{0, 32, 0}},
-	{0xFF41, 0xFF5A, d{-32, 0, -32}},
-	{0x10400, 0x10427, d{0, 40, 0}},
-	{0x10428, 0x1044F, d{-40, 0, -40}},
-	{0x10C80, 0x10CB2, d{0, 64, 0}},
-	{0x10CC0, 0x10CF2, d{-64, 0, -64}},
-	{0x118A0, 0x118BF, d{0, 32, 0}},
-	{0x118C0, 0x118DF, d{-32, 0, -32}},
-}
-var properties = [MaxLatin1 + 1]uint8{
-	0x00: pC,       // '\x00'
-	0x01: pC,       // '\x01'
-	0x02: pC,       // '\x02'
-	0x03: pC,       // '\x03'
-	0x04: pC,       // '\x04'
-	0x05: pC,       // '\x05'
-	0x06: pC,       // '\x06'
-	0x07: pC,       // '\a'
-	0x08: pC,       // '\b'
-	0x09: pC,       // '\t'
-	0x0A: pC,       // '\n'
-	0x0B: pC,       // '\v'
-	0x0C: pC,       // '\f'
-	0x0D: pC,       // '\r'
-	0x0E: pC,       // '\x0e'
-	0x0F: pC,       // '\x0f'
-	0x10: pC,       // '\x10'
-	0x11: pC,       // '\x11'
-	0x12: pC,       // '\x12'
-	0x13: pC,       // '\x13'
-	0x14: pC,       // '\x14'
-	0x15: pC,       // '\x15'
-	0x16: pC,       // '\x16'
-	0x17: pC,       // '\x17'
-	0x18: pC,       // '\x18'
-	0x19: pC,       // '\x19'
-	0x1A: pC,       // '\x1a'
-	0x1B: pC,       // '\x1b'
-	0x1C: pC,       // '\x1c'
-	0x1D: pC,       // '\x1d'
-	0x1E: pC,       // '\x1e'
-	0x1F: pC,       // '\x1f'
-	0x20: pZ | pp,  // ' '
-	0x21: pP | pp,  // '!'
-	0x22: pP | pp,  // '"'
-	0x23: pP | pp,  // '#'
-	0x24: pS | pp,  // '$'
-	0x25: pP | pp,  // '%'
-	0x26: pP | pp,  // '&'
-	0x27: pP | pp,  // '\''
-	0x28: pP | pp,  // '('
-	0x29: pP | pp,  // ')'
-	0x2A: pP | pp,  // '*'
-	0x2B: pS | pp,  // '+'
-	0x2C: pP | pp,  // ','
-	0x2D: pP | pp,  // '-'
-	0x2E: pP | pp,  // '.'
-	0x2F: pP | pp,  // '/'
-	0x30: pN | pp,  // '0'
-	0x31: pN | pp,  // '1'
-	0x32: pN | pp,  // '2'
-	0x33: pN | pp,  // '3'
-	0x34: pN | pp,  // '4'
-	0x35: pN | pp,  // '5'
-	0x36: pN | pp,  // '6'
-	0x37: pN | pp,  // '7'
-	0x38: pN | pp,  // '8'
-	0x39: pN | pp,  // '9'
-	0x3A: pP | pp,  // ':'
-	0x3B: pP | pp,  // ';'
-	0x3C: pS | pp,  // '<'
-	0x3D: pS | pp,  // '='
-	0x3E: pS | pp,  // '>'
-	0x3F: pP | pp,  // '?'
-	0x40: pP | pp,  // '@'
-	0x41: pLu | pp, // 'A'
-	0x42: pLu | pp, // 'B'
-	0x43: pLu | pp, // 'C'
-	0x44: pLu | pp, // 'D'
-	0x45: pLu | pp, // 'E'
-	0x46: pLu | pp, // 'F'
-	0x47: pLu | pp, // 'G'
-	0x48: pLu | pp, // 'H'
-	0x49: pLu | pp, // 'I'
-	0x4A: pLu | pp, // 'J'
-	0x4B: pLu | pp, // 'K'
-	0x4C: pLu | pp, // 'L'
-	0x4D: pLu | pp, // 'M'
-	0x4E: pLu | pp, // 'N'
-	0x4F: pLu | pp, // 'O'
-	0x50: pLu | pp, // 'P'
-	0x51: pLu | pp, // 'Q'
-	0x52: pLu | pp, // 'R'
-	0x53: pLu | pp, // 'S'
-	0x54: pLu | pp, // 'T'
-	0x55: pLu | pp, // 'U'
-	0x56: pLu | pp, // 'V'
-	0x57: pLu | pp, // 'W'
-	0x58: pLu | pp, // 'X'
-	0x59: pLu | pp, // 'Y'
-	0x5A: pLu | pp, // 'Z'
-	0x5B: pP | pp,  // '['
-	0x5C: pP | pp,  // '\\'
-	0x5D: pP | pp,  // ']'
-	0x5E: pS | pp,  // '^'
-	0x5F: pP | pp,  // '_'
-	0x60: pS | pp,  // '`'
-	0x61: pLl | pp, // 'a'
-	0x62: pLl | pp, // 'b'
-	0x63: pLl | pp, // 'c'
-	0x64: pLl | pp, // 'd'
-	0x65: pLl | pp, // 'e'
-	0x66: pLl | pp, // 'f'
-	0x67: pLl | pp, // 'g'
-	0x68: pLl | pp, // 'h'
-	0x69: pLl | pp, // 'i'
-	0x6A: pLl | pp, // 'j'
-	0x6B: pLl | pp, // 'k'
-	0x6C: pLl | pp, // 'l'
-	0x6D: pLl | pp, // 'm'
-	0x6E: pLl | pp, // 'n'
-	0x6F: pLl | pp, // 'o'
-	0x70: pLl | pp, // 'p'
-	0x71: pLl | pp, // 'q'
-	0x72: pLl | pp, // 'r'
-	0x73: pLl | pp, // 's'
-	0x74: pLl | pp, // 't'
-	0x75: pLl | pp, // 'u'
-	0x76: pLl | pp, // 'v'
-	0x77: pLl | pp, // 'w'
-	0x78: pLl | pp, // 'x'
-	0x79: pLl | pp, // 'y'
-	0x7A: pLl | pp, // 'z'
-	0x7B: pP | pp,  // '{'
-	0x7C: pS | pp,  // '|'
-	0x7D: pP | pp,  // '}'
-	0x7E: pS | pp,  // '~'
-	0x7F: pC,       // '\u007f'
-	0x80: pC,       // '\u0080'
-	0x81: pC,       // '\u0081'
-	0x82: pC,       // '\u0082'
-	0x83: pC,       // '\u0083'
-	0x84: pC,       // '\u0084'
-	0x85: pC,       // '\u0085'
-	0x86: pC,       // '\u0086'
-	0x87: pC,       // '\u0087'
-	0x88: pC,       // '\u0088'
-	0x89: pC,       // '\u0089'
-	0x8A: pC,       // '\u008a'
-	0x8B: pC,       // '\u008b'
-	0x8C: pC,       // '\u008c'
-	0x8D: pC,       // '\u008d'
-	0x8E: pC,       // '\u008e'
-	0x8F: pC,       // '\u008f'
-	0x90: pC,       // '\u0090'
-	0x91: pC,       // '\u0091'
-	0x92: pC,       // '\u0092'
-	0x93: pC,       // '\u0093'
-	0x94: pC,       // '\u0094'
-	0x95: pC,       // '\u0095'
-	0x96: pC,       // '\u0096'
-	0x97: pC,       // '\u0097'
-	0x98: pC,       // '\u0098'
-	0x99: pC,       // '\u0099'
-	0x9A: pC,       // '\u009a'
-	0x9B: pC,       // '\u009b'
-	0x9C: pC,       // '\u009c'
-	0x9D: pC,       // '\u009d'
-	0x9E: pC,       // '\u009e'
-	0x9F: pC,       // '\u009f'
-	0xA0: pZ,       // '\u00a0'
-	0xA1: pP | pp,  // '¡'
-	0xA2: pS | pp,  // '¢'
-	0xA3: pS | pp,  // '£'
-	0xA4: pS | pp,  // '¤'
-	0xA5: pS | pp,  // '¥'
-	0xA6: pS | pp,  // '¦'
-	0xA7: pP | pp,  // '§'
-	0xA8: pS | pp,  // '¨'
-	0xA9: pS | pp,  // '©'
-	0xAA: pLo | pp, // 'ª'
-	0xAB: pP | pp,  // '«'
-	0xAC: pS | pp,  // '¬'
-	0xAD: 0,        // '\u00ad'
-	0xAE: pS | pp,  // '®'
-	0xAF: pS | pp,  // '¯'
-	0xB0: pS | pp,  // '°'
-	0xB1: pS | pp,  // '±'
-	0xB2: pN | pp,  // '²'
-	0xB3: pN | pp,  // '³'
-	0xB4: pS | pp,  // '´'
-	0xB5: pLl | pp, // 'µ'
-	0xB6: pP | pp,  // '¶'
-	0xB7: pP | pp,  // '·'
-	0xB8: pS | pp,  // '¸'
-	0xB9: pN | pp,  // '¹'
-	0xBA: pLo | pp, // 'º'
-	0xBB: pP | pp,  // '»'
-	0xBC: pN | pp,  // '¼'
-	0xBD: pN | pp,  // '½'
-	0xBE: pN | pp,  // '¾'
-	0xBF: pP | pp,  // '¿'
-	0xC0: pLu | pp, // 'À'
-	0xC1: pLu | pp, // 'Á'
-	0xC2: pLu | pp, // 'Â'
-	0xC3: pLu | pp, // 'Ã'
-	0xC4: pLu | pp, // 'Ä'
-	0xC5: pLu | pp, // 'Å'
-	0xC6: pLu | pp, // 'Æ'
-	0xC7: pLu | pp, // 'Ç'
-	0xC8: pLu | pp, // 'È'
-	0xC9: pLu | pp, // 'É'
-	0xCA: pLu | pp, // 'Ê'
-	0xCB: pLu | pp, // 'Ë'
-	0xCC: pLu | pp, // 'Ì'
-	0xCD: pLu | pp, // 'Í'
-	0xCE: pLu | pp, // 'Î'
-	0xCF: pLu | pp, // 'Ï'
-	0xD0: pLu | pp, // 'Ð'
-	0xD1: pLu | pp, // 'Ñ'
-	0xD2: pLu | pp, // 'Ò'
-	0xD3: pLu | pp, // 'Ó'
-	0xD4: pLu | pp, // 'Ô'
-	0xD5: pLu | pp, // 'Õ'
-	0xD6: pLu | pp, // 'Ö'
-	0xD7: pS | pp,  // '×'
-	0xD8: pLu | pp, // 'Ø'
-	0xD9: pLu | pp, // 'Ù'
-	0xDA: pLu | pp, // 'Ú'
-	0xDB: pLu | pp, // 'Û'
-	0xDC: pLu | pp, // 'Ü'
-	0xDD: pLu | pp, // 'Ý'
-	0xDE: pLu | pp, // 'Þ'
-	0xDF: pLl | pp, // 'ß'
-	0xE0: pLl | pp, // 'à'
-	0xE1: pLl | pp, // 'á'
-	0xE2: pLl | pp, // 'â'
-	0xE3: pLl | pp, // 'ã'
-	0xE4: pLl | pp, // 'ä'
-	0xE5: pLl | pp, // 'å'
-	0xE6: pLl | pp, // 'æ'
-	0xE7: pLl | pp, // 'ç'
-	0xE8: pLl | pp, // 'è'
-	0xE9: pLl | pp, // 'é'
-	0xEA: pLl | pp, // 'ê'
-	0xEB: pLl | pp, // 'ë'
-	0xEC: pLl | pp, // 'ì'
-	0xED: pLl | pp, // 'í'
-	0xEE: pLl | pp, // 'î'
-	0xEF: pLl | pp, // 'ï'
-	0xF0: pLl | pp, // 'ð'
-	0xF1: pLl | pp, // 'ñ'
-	0xF2: pLl | pp, // 'ò'
-	0xF3: pLl | pp, // 'ó'
-	0xF4: pLl | pp, // 'ô'
-	0xF5: pLl | pp, // 'õ'
-	0xF6: pLl | pp, // 'ö'
-	0xF7: pS | pp,  // '÷'
-	0xF8: pLl | pp, // 'ø'
-	0xF9: pLl | pp, // 'ù'
-	0xFA: pLl | pp, // 'ú'
-	0xFB: pLl | pp, // 'û'
-	0xFC: pLl | pp, // 'ü'
-	0xFD: pLl | pp, // 'ý'
-	0xFE: pLl | pp, // 'þ'
-	0xFF: pLl | pp, // 'ÿ'
-}
-
-var caseOrbit = []foldPair{
-	{0x004B, 0x006B},
-	{0x0053, 0x0073},
-	{0x006B, 0x212A},
-	{0x0073, 0x017F},
-	{0x00B5, 0x039C},
-	{0x00C5, 0x00E5},
-	{0x00DF, 0x1E9E},
-	{0x00E5, 0x212B},
-	{0x0130, 0x0130},
-	{0x0131, 0x0131},
-	{0x017F, 0x0053},
-	{0x01C4, 0x01C5},
-	{0x01C5, 0x01C6},
-	{0x01C6, 0x01C4},
-	{0x01C7, 0x01C8},
-	{0x01C8, 0x01C9},
-	{0x01C9, 0x01C7},
-	{0x01CA, 0x01CB},
-	{0x01CB, 0x01CC},
-	{0x01CC, 0x01CA},
-	{0x01F1, 0x01F2},
-	{0x01F2, 0x01F3},
-	{0x01F3, 0x01F1},
-	{0x0345, 0x0399},
-	{0x0392, 0x03B2},
-	{0x0395, 0x03B5},
-	{0x0398, 0x03B8},
-	{0x0399, 0x03B9},
-	{0x039A, 0x03BA},
-	{0x039C, 0x03BC},
-	{0x03A0, 0x03C0},
-	{0x03A1, 0x03C1},
-	{0x03A3, 0x03C2},
-	{0x03A6, 0x03C6},
-	{0x03A9, 0x03C9},
-	{0x03B2, 0x03D0},
-	{0x03B5, 0x03F5},
-	{0x03B8, 0x03D1},
-	{0x03B9, 0x1FBE},
-	{0x03BA, 0x03F0},
-	{0x03BC, 0x00B5},
-	{0x03C0, 0x03D6},
-	{0x03C1, 0x03F1},
-	{0x03C2, 0x03C3},
-	{0x03C3, 0x03A3},
-	{0x03C6, 0x03D5},
-	{0x03C9, 0x2126},
-	{0x03D0, 0x0392},
-	{0x03D1, 0x03F4},
-	{0x03D5, 0x03A6},
-	{0x03D6, 0x03A0},
-	{0x03F0, 0x039A},
-	{0x03F1, 0x03A1},
-	{0x03F4, 0x0398},
-	{0x03F5, 0x0395},
-	{0x1E60, 0x1E61},
-	{0x1E61, 0x1E9B},
-	{0x1E9B, 0x1E60},
-	{0x1E9E, 0x00DF},
-	{0x1FBE, 0x0345},
-	{0x2126, 0x03A9},
-	{0x212A, 0x004B},
-	{0x212B, 0x00C5},
-}
-
-// FoldCategory maps a category name to a table of
-// code points outside the category that are equivalent under
-// simple case folding to code points inside the category.
-// If there is no entry for a category name, there are no such points.
-var FoldCategory = map[string]*RangeTable{
-	"Common":    foldCommon,
-	"Greek":     foldGreek,
-	"Inherited": foldInherited,
-	"L":         foldL,
-	"Ll":        foldLl,
-	"Lt":        foldLt,
-	"Lu":        foldLu,
-	"M":         foldM,
-	"Mn":        foldMn,
-}
-
-var foldCommon = &RangeTable{
-	R16: []Range16{
-		{0x039c, 0x03bc, 32},
-	},
-}
-
-var foldGreek = &RangeTable{
-	R16: []Range16{
-		{0x00b5, 0x0345, 656},
-	},
-}
-
-var foldInherited = &RangeTable{
-	R16: []Range16{
-		{0x0399, 0x03b9, 32},
-		{0x1fbe, 0x1fbe, 1},
-	},
-}
-
-var foldL = &RangeTable{
-	R16: []Range16{
-		{0x0345, 0x0345, 1},
-	},
-}
-
-var foldLl = &RangeTable{
-	R16: []Range16{
-		{0x0041, 0x005a, 1},
-		{0x00c0, 0x00d6, 1},
-		{0x00d8, 0x00de, 1},
-		{0x0100, 0x012e, 2},
-		{0x0132, 0x0136, 2},
-		{0x0139, 0x0147, 2},
-		{0x014a, 0x0178, 2},
-		{0x0179, 0x017d, 2},
-		{0x0181, 0x0182, 1},
-		{0x0184, 0x0186, 2},
-		{0x0187, 0x0189, 2},
-		{0x018a, 0x018b, 1},
-		{0x018e, 0x0191, 1},
-		{0x0193, 0x0194, 1},
-		{0x0196, 0x0198, 1},
-		{0x019c, 0x019d, 1},
-		{0x019f, 0x01a0, 1},
-		{0x01a2, 0x01a6, 2},
-		{0x01a7, 0x01a9, 2},
-		{0x01ac, 0x01ae, 2},
-		{0x01af, 0x01b1, 2},
-		{0x01b2, 0x01b3, 1},
-		{0x01b5, 0x01b7, 2},
-		{0x01b8, 0x01bc, 4},
-		{0x01c4, 0x01c5, 1},
-		{0x01c7, 0x01c8, 1},
-		{0x01ca, 0x01cb, 1},
-		{0x01cd, 0x01db, 2},
-		{0x01de, 0x01ee, 2},
-		{0x01f1, 0x01f2, 1},
-		{0x01f4, 0x01f6, 2},
-		{0x01f7, 0x01f8, 1},
-		{0x01fa, 0x0232, 2},
-		{0x023a, 0x023b, 1},
-		{0x023d, 0x023e, 1},
-		{0x0241, 0x0243, 2},
-		{0x0244, 0x0246, 1},
-		{0x0248, 0x024e, 2},
-		{0x0345, 0x0370, 43},
-		{0x0372, 0x0376, 4},
-		{0x037f, 0x0386, 7},
-		{0x0388, 0x038a, 1},
-		{0x038c, 0x038e, 2},
-		{0x038f, 0x0391, 2},
-		{0x0392, 0x03a1, 1},
-		{0x03a3, 0x03ab, 1},
-		{0x03cf, 0x03d8, 9},
-		{0x03da, 0x03ee, 2},
-		{0x03f4, 0x03f7, 3},
-		{0x03f9, 0x03fa, 1},
-		{0x03fd, 0x042f, 1},
-		{0x0460, 0x0480, 2},
-		{0x048a, 0x04c0, 2},
-		{0x04c1, 0x04cd, 2},
-		{0x04d0, 0x052e, 2},
-		{0x0531, 0x0556, 1},
-		{0x10a0, 0x10c5, 1},
-		{0x10c7, 0x10cd, 6},
-		{0x13a0, 0x13f5, 1},
-		{0x1e00, 0x1e94, 2},
-		{0x1e9e, 0x1efe, 2},
-		{0x1f08, 0x1f0f, 1},
-		{0x1f18, 0x1f1d, 1},
-		{0x1f28, 0x1f2f, 1},
-		{0x1f38, 0x1f3f, 1},
-		{0x1f48, 0x1f4d, 1},
-		{0x1f59, 0x1f5f, 2},
-		{0x1f68, 0x1f6f, 1},
-		{0x1f88, 0x1f8f, 1},
-		{0x1f98, 0x1f9f, 1},
-		{0x1fa8, 0x1faf, 1},
-		{0x1fb8, 0x1fbc, 1},
-		{0x1fc8, 0x1fcc, 1},
-		{0x1fd8, 0x1fdb, 1},
-		{0x1fe8, 0x1fec, 1},
-		{0x1ff8, 0x1ffc, 1},
-		{0x2126, 0x212a, 4},
-		{0x212b, 0x2132, 7},
-		{0x2183, 0x2c00, 2685},
-		{0x2c01, 0x2c2e, 1},
-		{0x2c60, 0x2c62, 2},
-		{0x2c63, 0x2c64, 1},
-		{0x2c67, 0x2c6d, 2},
-		{0x2c6e, 0x2c70, 1},
-		{0x2c72, 0x2c75, 3},
-		{0x2c7e, 0x2c80, 1},
-		{0x2c82, 0x2ce2, 2},
-		{0x2ceb, 0x2ced, 2},
-		{0x2cf2, 0xa640, 31054},
-		{0xa642, 0xa66c, 2},
-		{0xa680, 0xa69a, 2},
-		{0xa722, 0xa72e, 2},
-		{0xa732, 0xa76e, 2},
-		{0xa779, 0xa77d, 2},
-		{0xa77e, 0xa786, 2},
-		{0xa78b, 0xa78d, 2},
-		{0xa790, 0xa792, 2},
-		{0xa796, 0xa7aa, 2},
-		{0xa7ab, 0xa7ad, 1},
-		{0xa7b0, 0xa7b4, 1},
-		{0xa7b6, 0xff21, 22379},
-		{0xff22, 0xff3a, 1},
-	},
-	R32: []Range32{
-		{0x10400, 0x10427, 1},
-		{0x10c80, 0x10cb2, 1},
-		{0x118a0, 0x118bf, 1},
-	},
-	LatinOffset: 3,
-}
-
-var foldLt = &RangeTable{
-	R16: []Range16{
-		{0x01c4, 0x01c6, 2},
-		{0x01c7, 0x01c9, 2},
-		{0x01ca, 0x01cc, 2},
-		{0x01f1, 0x01f3, 2},
-		{0x1f80, 0x1f87, 1},
-		{0x1f90, 0x1f97, 1},
-		{0x1fa0, 0x1fa7, 1},
-		{0x1fb3, 0x1fc3, 16},
-		{0x1ff3, 0x1ff3, 1},
-	},
-}
-
-var foldLu = &RangeTable{
-	R16: []Range16{
-		{0x0061, 0x007a, 1},
-		{0x00b5, 0x00df, 42},
-		{0x00e0, 0x00f6, 1},
-		{0x00f8, 0x00ff, 1},
-		{0x0101, 0x012f, 2},
-		{0x0133, 0x0137, 2},
-		{0x013a, 0x0148, 2},
-		{0x014b, 0x0177, 2},
-		{0x017a, 0x017e, 2},
-		{0x017f, 0x0180, 1},
-		{0x0183, 0x0185, 2},
-		{0x0188, 0x018c, 4},
-		{0x0192, 0x0195, 3},
-		{0x0199, 0x019a, 1},
-		{0x019e, 0x01a1, 3},
-		{0x01a3, 0x01a5, 2},
-		{0x01a8, 0x01ad, 5},
-		{0x01b0, 0x01b4, 4},
-		{0x01b6, 0x01b9, 3},
-		{0x01bd, 0x01bf, 2},
-		{0x01c5, 0x01c6, 1},
-		{0x01c8, 0x01c9, 1},
-		{0x01cb, 0x01cc, 1},
-		{0x01ce, 0x01dc, 2},
-		{0x01dd, 0x01ef, 2},
-		{0x01f2, 0x01f3, 1},
-		{0x01f5, 0x01f9, 4},
-		{0x01fb, 0x021f, 2},
-		{0x0223, 0x0233, 2},
-		{0x023c, 0x023f, 3},
-		{0x0240, 0x0242, 2},
-		{0x0247, 0x024f, 2},
-		{0x0250, 0x0254, 1},
-		{0x0256, 0x0257, 1},
-		{0x0259, 0x025b, 2},
-		{0x025c, 0x0260, 4},
-		{0x0261, 0x0265, 2},
-		{0x0266, 0x0268, 2},
-		{0x0269, 0x026b, 2},
-		{0x026c, 0x026f, 3},
-		{0x0271, 0x0272, 1},
-		{0x0275, 0x027d, 8},
-		{0x0280, 0x0283, 3},
-		{0x0287, 0x028c, 1},
-		{0x0292, 0x029d, 11},
-		{0x029e, 0x0345, 167},
-		{0x0371, 0x0373, 2},
-		{0x0377, 0x037b, 4},
-		{0x037c, 0x037d, 1},
-		{0x03ac, 0x03af, 1},
-		{0x03b1, 0x03ce, 1},
-		{0x03d0, 0x03d1, 1},
-		{0x03d5, 0x03d7, 1},
-		{0x03d9, 0x03ef, 2},
-		{0x03f0, 0x03f3, 1},
-		{0x03f5, 0x03fb, 3},
-		{0x0430, 0x045f, 1},
-		{0x0461, 0x0481, 2},
-		{0x048b, 0x04bf, 2},
-		{0x04c2, 0x04ce, 2},
-		{0x04cf, 0x052f, 2},
-		{0x0561, 0x0586, 1},
-		{0x13f8, 0x13fd, 1},
-		{0x1d79, 0x1d7d, 4},
-		{0x1e01, 0x1e95, 2},
-		{0x1e9b, 0x1ea1, 6},
-		{0x1ea3, 0x1eff, 2},
-		{0x1f00, 0x1f07, 1},
-		{0x1f10, 0x1f15, 1},
-		{0x1f20, 0x1f27, 1},
-		{0x1f30, 0x1f37, 1},
-		{0x1f40, 0x1f45, 1},
-		{0x1f51, 0x1f57, 2},
-		{0x1f60, 0x1f67, 1},
-		{0x1f70, 0x1f7d, 1},
-		{0x1fb0, 0x1fb1, 1},
-		{0x1fbe, 0x1fd0, 18},
-		{0x1fd1, 0x1fe0, 15},
-		{0x1fe1, 0x1fe5, 4},
-		{0x214e, 0x2184, 54},
-		{0x2c30, 0x2c5e, 1},
-		{0x2c61, 0x2c65, 4},
-		{0x2c66, 0x2c6c, 2},
-		{0x2c73, 0x2c76, 3},
-		{0x2c81, 0x2ce3, 2},
-		{0x2cec, 0x2cee, 2},
-		{0x2cf3, 0x2d00, 13},
-		{0x2d01, 0x2d25, 1},
-		{0x2d27, 0x2d2d, 6},
-		{0xa641, 0xa66d, 2},
-		{0xa681, 0xa69b, 2},
-		{0xa723, 0xa72f, 2},
-		{0xa733, 0xa76f, 2},
-		{0xa77a, 0xa77c, 2},
-		{0xa77f, 0xa787, 2},
-		{0xa78c, 0xa791, 5},
-		{0xa793, 0xa797, 4},
-		{0xa799, 0xa7a9, 2},
-		{0xa7b5, 0xa7b7, 2},
-		{0xab53, 0xab70, 29},
-		{0xab71, 0xabbf, 1},
-		{0xff41, 0xff5a, 1},
-	},
-	R32: []Range32{
-		{0x10428, 0x1044f, 1},
-		{0x10cc0, 0x10cf2, 1},
-		{0x118c0, 0x118df, 1},
-	},
-	LatinOffset: 4,
-}
-
-var foldM = &RangeTable{
-	R16: []Range16{
-		{0x0399, 0x03b9, 32},
-		{0x1fbe, 0x1fbe, 1},
-	},
-}
-
-var foldMn = &RangeTable{
-	R16: []Range16{
-		{0x0399, 0x03b9, 32},
-		{0x1fbe, 0x1fbe, 1},
-	},
-}
-
-// FoldScript maps a script name to a table of
-// code points outside the script that are equivalent under
-// simple case folding to code points inside the script.
-// If there is no entry for a script name, there are no such points.
-var FoldScript = map[string]*RangeTable{}
-
-// Range entries: 3546 16-bit, 1306 32-bit, 4852 total.
-// Range bytes: 21276 16-bit, 15672 32-bit, 36948 total.
-
-// Fold orbit bytes: 63 pairs, 252 bytes
diff --git a/third_party/gofrontend/libgo/go/unicode/utf16/export_test.go b/third_party/gofrontend/libgo/go/unicode/utf16/export_test.go
deleted file mode 100644
index 306247e..0000000
--- a/third_party/gofrontend/libgo/go/unicode/utf16/export_test.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package utf16
-
-// Extra names for constants so we can validate them during testing.
-const (
-	MaxRune         = maxRune
-	ReplacementChar = replacementChar
-)
diff --git a/third_party/gofrontend/libgo/go/unicode/utf16/utf16.go b/third_party/gofrontend/libgo/go/unicode/utf16/utf16.go
deleted file mode 100644
index b497500..0000000
--- a/third_party/gofrontend/libgo/go/unicode/utf16/utf16.go
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package utf16 implements encoding and decoding of UTF-16 sequences.
-package utf16
-
-// The conditions replacementChar==unicode.ReplacementChar and
-// maxRune==unicode.MaxRune are verified in the tests.
-// Defining them locally avoids this package depending on package unicode.
-
-const (
-	replacementChar = '\uFFFD'     // Unicode replacement character
-	maxRune         = '\U0010FFFF' // Maximum valid Unicode code point.
-)
-
-const (
-	// 0xd800-0xdc00 encodes the high 10 bits of a pair.
-	// 0xdc00-0xe000 encodes the low 10 bits of a pair.
-	// the value is those 20 bits plus 0x10000.
-	surr1 = 0xd800
-	surr2 = 0xdc00
-	surr3 = 0xe000
-
-	surrSelf = 0x10000
-)
-
-// IsSurrogate reports whether the specified Unicode code point
-// can appear in a surrogate pair.
-func IsSurrogate(r rune) bool {
-	return surr1 <= r && r < surr3
-}
-
-// DecodeRune returns the UTF-16 decoding of a surrogate pair.
-// If the pair is not a valid UTF-16 surrogate pair, DecodeRune returns
-// the Unicode replacement code point U+FFFD.
-func DecodeRune(r1, r2 rune) rune {
-	if surr1 <= r1 && r1 < surr2 && surr2 <= r2 && r2 < surr3 {
-		return (r1-surr1)<<10 | (r2 - surr2) + 0x10000
-	}
-	return replacementChar
-}
-
-// EncodeRune returns the UTF-16 surrogate pair r1, r2 for the given rune.
-// If the rune is not a valid Unicode code point or does not need encoding,
-// EncodeRune returns U+FFFD, U+FFFD.
-func EncodeRune(r rune) (r1, r2 rune) {
-	if r < surrSelf || r > maxRune || IsSurrogate(r) {
-		return replacementChar, replacementChar
-	}
-	r -= surrSelf
-	return surr1 + (r>>10)&0x3ff, surr2 + r&0x3ff
-}
-
-// Encode returns the UTF-16 encoding of the Unicode code point sequence s.
-func Encode(s []rune) []uint16 {
-	n := len(s)
-	for _, v := range s {
-		if v >= surrSelf {
-			n++
-		}
-	}
-
-	a := make([]uint16, n)
-	n = 0
-	for _, v := range s {
-		switch {
-		case v < 0, surr1 <= v && v < surr3, v > maxRune:
-			v = replacementChar
-			fallthrough
-		case v < surrSelf:
-			a[n] = uint16(v)
-			n++
-		default:
-			r1, r2 := EncodeRune(v)
-			a[n] = uint16(r1)
-			a[n+1] = uint16(r2)
-			n += 2
-		}
-	}
-	return a[0:n]
-}
-
-// Decode returns the Unicode code point sequence represented
-// by the UTF-16 encoding s.
-func Decode(s []uint16) []rune {
-	a := make([]rune, len(s))
-	n := 0
-	for i := 0; i < len(s); i++ {
-		switch r := s[i]; {
-		case surr1 <= r && r < surr2 && i+1 < len(s) &&
-			surr2 <= s[i+1] && s[i+1] < surr3:
-			// valid surrogate sequence
-			a[n] = DecodeRune(rune(r), rune(s[i+1]))
-			i++
-			n++
-		case surr1 <= r && r < surr3:
-			// invalid surrogate sequence
-			a[n] = replacementChar
-			n++
-		default:
-			// normal rune
-			a[n] = rune(r)
-			n++
-		}
-	}
-	return a[0:n]
-}
diff --git a/third_party/gofrontend/libgo/go/unicode/utf16/utf16_test.go b/third_party/gofrontend/libgo/go/unicode/utf16/utf16_test.go
deleted file mode 100644
index 3dca472..0000000
--- a/third_party/gofrontend/libgo/go/unicode/utf16/utf16_test.go
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package utf16_test
-
-import (
-	"reflect"
-	"testing"
-	"unicode"
-	. "unicode/utf16"
-)
-
-// Validate the constants redefined from unicode.
-func TestConstants(t *testing.T) {
-	if MaxRune != unicode.MaxRune {
-		t.Errorf("utf16.maxRune is wrong: %x should be %x", MaxRune, unicode.MaxRune)
-	}
-	if ReplacementChar != unicode.ReplacementChar {
-		t.Errorf("utf16.replacementChar is wrong: %x should be %x", ReplacementChar, unicode.ReplacementChar)
-	}
-}
-
-type encodeTest struct {
-	in  []rune
-	out []uint16
-}
-
-var encodeTests = []encodeTest{
-	{[]rune{1, 2, 3, 4}, []uint16{1, 2, 3, 4}},
-	{[]rune{0xffff, 0x10000, 0x10001, 0x12345, 0x10ffff},
-		[]uint16{0xffff, 0xd800, 0xdc00, 0xd800, 0xdc01, 0xd808, 0xdf45, 0xdbff, 0xdfff}},
-	{[]rune{'a', 'b', 0xd7ff, 0xd800, 0xdfff, 0xe000, 0x110000, -1},
-		[]uint16{'a', 'b', 0xd7ff, 0xfffd, 0xfffd, 0xe000, 0xfffd, 0xfffd}},
-}
-
-func TestEncode(t *testing.T) {
-	for _, tt := range encodeTests {
-		out := Encode(tt.in)
-		if !reflect.DeepEqual(out, tt.out) {
-			t.Errorf("Encode(%x) = %x; want %x", tt.in, out, tt.out)
-		}
-	}
-}
-
-func TestEncodeRune(t *testing.T) {
-	for i, tt := range encodeTests {
-		j := 0
-		for _, r := range tt.in {
-			r1, r2 := EncodeRune(r)
-			if r < 0x10000 || r > unicode.MaxRune {
-				if j >= len(tt.out) {
-					t.Errorf("#%d: ran out of tt.out", i)
-					break
-				}
-				if r1 != unicode.ReplacementChar || r2 != unicode.ReplacementChar {
-					t.Errorf("EncodeRune(%#x) = %#x, %#x; want 0xfffd, 0xfffd", r, r1, r2)
-				}
-				j++
-			} else {
-				if j+1 >= len(tt.out) {
-					t.Errorf("#%d: ran out of tt.out", i)
-					break
-				}
-				if r1 != rune(tt.out[j]) || r2 != rune(tt.out[j+1]) {
-					t.Errorf("EncodeRune(%#x) = %#x, %#x; want %#x, %#x", r, r1, r2, tt.out[j], tt.out[j+1])
-				}
-				j += 2
-				dec := DecodeRune(r1, r2)
-				if dec != r {
-					t.Errorf("DecodeRune(%#x, %#x) = %#x; want %#x", r1, r2, dec, r)
-				}
-			}
-		}
-		if j != len(tt.out) {
-			t.Errorf("#%d: EncodeRune didn't generate enough output", i)
-		}
-	}
-}
-
-type decodeTest struct {
-	in  []uint16
-	out []rune
-}
-
-var decodeTests = []decodeTest{
-	{[]uint16{1, 2, 3, 4}, []rune{1, 2, 3, 4}},
-	{[]uint16{0xffff, 0xd800, 0xdc00, 0xd800, 0xdc01, 0xd808, 0xdf45, 0xdbff, 0xdfff},
-		[]rune{0xffff, 0x10000, 0x10001, 0x12345, 0x10ffff}},
-	{[]uint16{0xd800, 'a'}, []rune{0xfffd, 'a'}},
-	{[]uint16{0xdfff}, []rune{0xfffd}},
-}
-
-func TestDecode(t *testing.T) {
-	for _, tt := range decodeTests {
-		out := Decode(tt.in)
-		if !reflect.DeepEqual(out, tt.out) {
-			t.Errorf("Decode(%x) = %x; want %x", tt.in, out, tt.out)
-		}
-	}
-}
-
-var decodeRuneTests = []struct {
-	r1, r2 rune
-	want   rune
-}{
-	{0xd800, 0xdc00, 0x10000},
-	{0xd800, 0xdc01, 0x10001},
-	{0xd808, 0xdf45, 0x12345},
-	{0xdbff, 0xdfff, 0x10ffff},
-	{0xd800, 'a', 0xfffd}, // illegal, replacement rune substituted
-}
-
-func TestDecodeRune(t *testing.T) {
-	for i, tt := range decodeRuneTests {
-		got := DecodeRune(tt.r1, tt.r2)
-		if got != tt.want {
-			t.Errorf("%d: DecodeRune(%q, %q) = %v; want %v", i, tt.r1, tt.r2, got, tt.want)
-		}
-	}
-}
-
-var surrogateTests = []struct {
-	r    rune
-	want bool
-}{
-	// from http://en.wikipedia.org/wiki/UTF-16
-	{'\u007A', false},     // LATIN SMALL LETTER Z
-	{'\u6C34', false},     // CJK UNIFIED IDEOGRAPH-6C34 (water)
-	{'\uFEFF', false},     // Byte Order Mark
-	{'\U00010000', false}, // LINEAR B SYLLABLE B008 A (first non-BMP code point)
-	{'\U0001D11E', false}, // MUSICAL SYMBOL G CLEF
-	{'\U0010FFFD', false}, // PRIVATE USE CHARACTER-10FFFD (last Unicode code point)
-
-	{rune(0xd7ff), false}, // surr1-1
-	{rune(0xd800), true},  // surr1
-	{rune(0xdc00), true},  // surr2
-	{rune(0xe000), false}, // surr3
-	{rune(0xdfff), true},  // surr3-1
-}
-
-func TestIsSurrogate(t *testing.T) {
-	for i, tt := range surrogateTests {
-		got := IsSurrogate(tt.r)
-		if got != tt.want {
-			t.Errorf("%d: IsSurrogate(%q) = %v; want %v", i, tt.r, got, tt.want)
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/go/unicode/utf8/example_test.go b/third_party/gofrontend/libgo/go/unicode/utf8/example_test.go
deleted file mode 100644
index 7b3e7ac..0000000
--- a/third_party/gofrontend/libgo/go/unicode/utf8/example_test.go
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package utf8_test
-
-import (
-	"fmt"
-	"unicode/utf8"
-)
-
-func ExampleDecodeLastRune() {
-	b := []byte("Hello, 世界")
-
-	for len(b) > 0 {
-		r, size := utf8.DecodeLastRune(b)
-		fmt.Printf("%c %v\n", r, size)
-
-		b = b[:len(b)-size]
-	}
-	// Output:
-	// 界 3
-	// 世 3
-	//   1
-	// , 1
-	// o 1
-	// l 1
-	// l 1
-	// e 1
-	// H 1
-}
-
-func ExampleDecodeLastRuneInString() {
-	str := "Hello, 世界"
-
-	for len(str) > 0 {
-		r, size := utf8.DecodeLastRuneInString(str)
-		fmt.Printf("%c %v\n", r, size)
-
-		str = str[:len(str)-size]
-	}
-	// Output:
-	// 界 3
-	// 世 3
-	//   1
-	// , 1
-	// o 1
-	// l 1
-	// l 1
-	// e 1
-	// H 1
-
-}
-
-func ExampleDecodeRune() {
-	b := []byte("Hello, 世界")
-
-	for len(b) > 0 {
-		r, size := utf8.DecodeRune(b)
-		fmt.Printf("%c %v\n", r, size)
-
-		b = b[size:]
-	}
-	// Output:
-	// H 1
-	// e 1
-	// l 1
-	// l 1
-	// o 1
-	// , 1
-	//   1
-	// 世 3
-	// 界 3
-}
-
-func ExampleDecodeRuneInString() {
-	str := "Hello, 世界"
-
-	for len(str) > 0 {
-		r, size := utf8.DecodeRuneInString(str)
-		fmt.Printf("%c %v\n", r, size)
-
-		str = str[size:]
-	}
-	// Output:
-	// H 1
-	// e 1
-	// l 1
-	// l 1
-	// o 1
-	// , 1
-	//   1
-	// 世 3
-	// 界 3
-}
-
-func ExampleEncodeRune() {
-	r := '世'
-	buf := make([]byte, 3)
-
-	n := utf8.EncodeRune(buf, r)
-
-	fmt.Println(buf)
-	fmt.Println(n)
-	// Output:
-	// [228 184 150]
-	// 3
-}
-
-func ExampleFullRune() {
-	buf := []byte{228, 184, 150} // 世
-	fmt.Println(utf8.FullRune(buf))
-	fmt.Println(utf8.FullRune(buf[:2]))
-	// Output:
-	// true
-	// false
-}
-
-func ExampleFullRuneInString() {
-	str := "世"
-	fmt.Println(utf8.FullRuneInString(str))
-	fmt.Println(utf8.FullRuneInString(str[:2]))
-	// Output:
-	// true
-	// false
-}
-
-func ExampleRuneCount() {
-	buf := []byte("Hello, 世界")
-	fmt.Println("bytes =", len(buf))
-	fmt.Println("runes =", utf8.RuneCount(buf))
-	// Output:
-	// bytes = 13
-	// runes = 9
-}
-
-func ExampleRuneCountInString() {
-	str := "Hello, 世界"
-	fmt.Println("bytes =", len(str))
-	fmt.Println("runes =", utf8.RuneCountInString(str))
-	// Output:
-	// bytes = 13
-	// runes = 9
-}
-
-func ExampleRuneLen() {
-	fmt.Println(utf8.RuneLen('a'))
-	fmt.Println(utf8.RuneLen('界'))
-	// Output:
-	// 1
-	// 3
-}
-
-func ExampleRuneStart() {
-	buf := []byte("a界")
-	fmt.Println(utf8.RuneStart(buf[0]))
-	fmt.Println(utf8.RuneStart(buf[1]))
-	fmt.Println(utf8.RuneStart(buf[2]))
-	// Output:
-	// true
-	// true
-	// false
-}
-
-func ExampleValid() {
-	valid := []byte("Hello, 世界")
-	invalid := []byte{0xff, 0xfe, 0xfd}
-
-	fmt.Println(utf8.Valid(valid))
-	fmt.Println(utf8.Valid(invalid))
-	// Output:
-	// true
-	// false
-}
-
-func ExampleValidRune() {
-	valid := 'a'
-	invalid := rune(0xfffffff)
-
-	fmt.Println(utf8.ValidRune(valid))
-	fmt.Println(utf8.ValidRune(invalid))
-	// Output:
-	// true
-	// false
-}
-
-func ExampleValidString() {
-	valid := "Hello, 世界"
-	invalid := string([]byte{0xff, 0xfe, 0xfd})
-
-	fmt.Println(utf8.ValidString(valid))
-	fmt.Println(utf8.ValidString(invalid))
-	// Output:
-	// true
-	// false
-}
diff --git a/third_party/gofrontend/libgo/go/unicode/utf8/utf8.go b/third_party/gofrontend/libgo/go/unicode/utf8/utf8.go
deleted file mode 100644
index 9ac3718..0000000
--- a/third_party/gofrontend/libgo/go/unicode/utf8/utf8.go
+++ /dev/null
@@ -1,445 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package utf8 implements functions and constants to support text encoded in
-// UTF-8. It includes functions to translate between runes and UTF-8 byte sequences.
-package utf8
-
-// The conditions RuneError==unicode.ReplacementChar and
-// MaxRune==unicode.MaxRune are verified in the tests.
-// Defining them locally avoids this package depending on package unicode.
-
-// Numbers fundamental to the encoding.
-const (
-	RuneError = '\uFFFD'     // the "error" Rune or "Unicode replacement character"
-	RuneSelf  = 0x80         // characters below Runeself are represented as themselves in a single byte.
-	MaxRune   = '\U0010FFFF' // Maximum valid Unicode code point.
-	UTFMax    = 4            // maximum number of bytes of a UTF-8 encoded Unicode character.
-)
-
-// Code points in the surrogate range are not valid for UTF-8.
-const (
-	surrogateMin = 0xD800
-	surrogateMax = 0xDFFF
-)
-
-const (
-	t1 = 0x00 // 0000 0000
-	tx = 0x80 // 1000 0000
-	t2 = 0xC0 // 1100 0000
-	t3 = 0xE0 // 1110 0000
-	t4 = 0xF0 // 1111 0000
-	t5 = 0xF8 // 1111 1000
-
-	maskx = 0x3F // 0011 1111
-	mask2 = 0x1F // 0001 1111
-	mask3 = 0x0F // 0000 1111
-	mask4 = 0x07 // 0000 0111
-
-	rune1Max = 1<<7 - 1
-	rune2Max = 1<<11 - 1
-	rune3Max = 1<<16 - 1
-)
-
-func decodeRuneInternal(p []byte) (r rune, size int, short bool) {
-	n := len(p)
-	if n < 1 {
-		return RuneError, 0, true
-	}
-	c0 := p[0]
-
-	// 1-byte, 7-bit sequence?
-	if c0 < tx {
-		return rune(c0), 1, false
-	}
-
-	// unexpected continuation byte?
-	if c0 < t2 {
-		return RuneError, 1, false
-	}
-
-	// need first continuation byte
-	if n < 2 {
-		return RuneError, 1, true
-	}
-	c1 := p[1]
-	if c1 < tx || t2 <= c1 {
-		return RuneError, 1, false
-	}
-
-	// 2-byte, 11-bit sequence?
-	if c0 < t3 {
-		r = rune(c0&mask2)<<6 | rune(c1&maskx)
-		if r <= rune1Max {
-			return RuneError, 1, false
-		}
-		return r, 2, false
-	}
-
-	// need second continuation byte
-	if n < 3 {
-		return RuneError, 1, true
-	}
-	c2 := p[2]
-	if c2 < tx || t2 <= c2 {
-		return RuneError, 1, false
-	}
-
-	// 3-byte, 16-bit sequence?
-	if c0 < t4 {
-		r = rune(c0&mask3)<<12 | rune(c1&maskx)<<6 | rune(c2&maskx)
-		if r <= rune2Max {
-			return RuneError, 1, false
-		}
-		if surrogateMin <= r && r <= surrogateMax {
-			return RuneError, 1, false
-		}
-		return r, 3, false
-	}
-
-	// need third continuation byte
-	if n < 4 {
-		return RuneError, 1, true
-	}
-	c3 := p[3]
-	if c3 < tx || t2 <= c3 {
-		return RuneError, 1, false
-	}
-
-	// 4-byte, 21-bit sequence?
-	if c0 < t5 {
-		r = rune(c0&mask4)<<18 | rune(c1&maskx)<<12 | rune(c2&maskx)<<6 | rune(c3&maskx)
-		if r <= rune3Max || MaxRune < r {
-			return RuneError, 1, false
-		}
-		return r, 4, false
-	}
-
-	// error
-	return RuneError, 1, false
-}
-
-func decodeRuneInStringInternal(s string) (r rune, size int, short bool) {
-	n := len(s)
-	if n < 1 {
-		return RuneError, 0, true
-	}
-	c0 := s[0]
-
-	// 1-byte, 7-bit sequence?
-	if c0 < tx {
-		return rune(c0), 1, false
-	}
-
-	// unexpected continuation byte?
-	if c0 < t2 {
-		return RuneError, 1, false
-	}
-
-	// need first continuation byte
-	if n < 2 {
-		return RuneError, 1, true
-	}
-	c1 := s[1]
-	if c1 < tx || t2 <= c1 {
-		return RuneError, 1, false
-	}
-
-	// 2-byte, 11-bit sequence?
-	if c0 < t3 {
-		r = rune(c0&mask2)<<6 | rune(c1&maskx)
-		if r <= rune1Max {
-			return RuneError, 1, false
-		}
-		return r, 2, false
-	}
-
-	// need second continuation byte
-	if n < 3 {
-		return RuneError, 1, true
-	}
-	c2 := s[2]
-	if c2 < tx || t2 <= c2 {
-		return RuneError, 1, false
-	}
-
-	// 3-byte, 16-bit sequence?
-	if c0 < t4 {
-		r = rune(c0&mask3)<<12 | rune(c1&maskx)<<6 | rune(c2&maskx)
-		if r <= rune2Max {
-			return RuneError, 1, false
-		}
-		if surrogateMin <= r && r <= surrogateMax {
-			return RuneError, 1, false
-		}
-		return r, 3, false
-	}
-
-	// need third continuation byte
-	if n < 4 {
-		return RuneError, 1, true
-	}
-	c3 := s[3]
-	if c3 < tx || t2 <= c3 {
-		return RuneError, 1, false
-	}
-
-	// 4-byte, 21-bit sequence?
-	if c0 < t5 {
-		r = rune(c0&mask4)<<18 | rune(c1&maskx)<<12 | rune(c2&maskx)<<6 | rune(c3&maskx)
-		if r <= rune3Max || MaxRune < r {
-			return RuneError, 1, false
-		}
-		return r, 4, false
-	}
-
-	// error
-	return RuneError, 1, false
-}
-
-// FullRune reports whether the bytes in p begin with a full UTF-8 encoding of a rune.
-// An invalid encoding is considered a full Rune since it will convert as a width-1 error rune.
-func FullRune(p []byte) bool {
-	_, _, short := decodeRuneInternal(p)
-	return !short
-}
-
-// FullRuneInString is like FullRune but its input is a string.
-func FullRuneInString(s string) bool {
-	_, _, short := decodeRuneInStringInternal(s)
-	return !short
-}
-
-// DecodeRune unpacks the first UTF-8 encoding in p and returns the rune and
-// its width in bytes. If p is empty it returns (RuneError, 0). Otherwise, if
-// the encoding is invalid, it returns (RuneError, 1). Both are impossible
-// results for correct UTF-8.
-//
-// An encoding is invalid if it is incorrect UTF-8, encodes a rune that is
-// out of range, or is not the shortest possible UTF-8 encoding for the
-// value. No other validation is performed.
-func DecodeRune(p []byte) (r rune, size int) {
-	r, size, _ = decodeRuneInternal(p)
-	return
-}
-
-// DecodeRuneInString is like DecodeRune but its input is a string. If s is
-// empty it returns (RuneError, 0). Otherwise, if the encoding is invalid, it
-// returns (RuneError, 1). Both are impossible results for correct UTF-8.
-//
-// An encoding is invalid if it is incorrect UTF-8, encodes a rune that is
-// out of range, or is not the shortest possible UTF-8 encoding for the
-// value. No other validation is performed.
-func DecodeRuneInString(s string) (r rune, size int) {
-	r, size, _ = decodeRuneInStringInternal(s)
-	return
-}
-
-// DecodeLastRune unpacks the last UTF-8 encoding in p and returns the rune and
-// its width in bytes. If p is empty it returns (RuneError, 0). Otherwise, if
-// the encoding is invalid, it returns (RuneError, 1). Both are impossible
-// results for correct UTF-8.
-//
-// An encoding is invalid if it is incorrect UTF-8, encodes a rune that is
-// out of range, or is not the shortest possible UTF-8 encoding for the
-// value. No other validation is performed.
-func DecodeLastRune(p []byte) (r rune, size int) {
-	end := len(p)
-	if end == 0 {
-		return RuneError, 0
-	}
-	start := end - 1
-	r = rune(p[start])
-	if r < RuneSelf {
-		return r, 1
-	}
-	// guard against O(n^2) behavior when traversing
-	// backwards through strings with long sequences of
-	// invalid UTF-8.
-	lim := end - UTFMax
-	if lim < 0 {
-		lim = 0
-	}
-	for start--; start >= lim; start-- {
-		if RuneStart(p[start]) {
-			break
-		}
-	}
-	if start < 0 {
-		start = 0
-	}
-	r, size = DecodeRune(p[start:end])
-	if start+size != end {
-		return RuneError, 1
-	}
-	return r, size
-}
-
-// DecodeLastRuneInString is like DecodeLastRune but its input is a string. If
-// s is empty it returns (RuneError, 0). Otherwise, if the encoding is invalid,
-// it returns (RuneError, 1). Both are impossible results for correct UTF-8.
-//
-// An encoding is invalid if it is incorrect UTF-8, encodes a rune that is
-// out of range, or is not the shortest possible UTF-8 encoding for the
-// value. No other validation is performed.
-func DecodeLastRuneInString(s string) (r rune, size int) {
-	end := len(s)
-	if end == 0 {
-		return RuneError, 0
-	}
-	start := end - 1
-	r = rune(s[start])
-	if r < RuneSelf {
-		return r, 1
-	}
-	// guard against O(n^2) behavior when traversing
-	// backwards through strings with long sequences of
-	// invalid UTF-8.
-	lim := end - UTFMax
-	if lim < 0 {
-		lim = 0
-	}
-	for start--; start >= lim; start-- {
-		if RuneStart(s[start]) {
-			break
-		}
-	}
-	if start < 0 {
-		start = 0
-	}
-	r, size = DecodeRuneInString(s[start:end])
-	if start+size != end {
-		return RuneError, 1
-	}
-	return r, size
-}
-
-// RuneLen returns the number of bytes required to encode the rune.
-// It returns -1 if the rune is not a valid value to encode in UTF-8.
-func RuneLen(r rune) int {
-	switch {
-	case r < 0:
-		return -1
-	case r <= rune1Max:
-		return 1
-	case r <= rune2Max:
-		return 2
-	case surrogateMin <= r && r <= surrogateMax:
-		return -1
-	case r <= rune3Max:
-		return 3
-	case r <= MaxRune:
-		return 4
-	}
-	return -1
-}
-
-// EncodeRune writes into p (which must be large enough) the UTF-8 encoding of the rune.
-// It returns the number of bytes written.
-func EncodeRune(p []byte, r rune) int {
-	// Negative values are erroneous.  Making it unsigned addresses the problem.
-	switch i := uint32(r); {
-	case i <= rune1Max:
-		p[0] = byte(r)
-		return 1
-	case i <= rune2Max:
-		p[0] = t2 | byte(r>>6)
-		p[1] = tx | byte(r)&maskx
-		return 2
-	case i > MaxRune, surrogateMin <= i && i <= surrogateMax:
-		r = RuneError
-		fallthrough
-	case i <= rune3Max:
-		p[0] = t3 | byte(r>>12)
-		p[1] = tx | byte(r>>6)&maskx
-		p[2] = tx | byte(r)&maskx
-		return 3
-	default:
-		p[0] = t4 | byte(r>>18)
-		p[1] = tx | byte(r>>12)&maskx
-		p[2] = tx | byte(r>>6)&maskx
-		p[3] = tx | byte(r)&maskx
-		return 4
-	}
-}
-
-// RuneCount returns the number of runes in p.  Erroneous and short
-// encodings are treated as single runes of width 1 byte.
-func RuneCount(p []byte) int {
-	i := 0
-	var n int
-	for n = 0; i < len(p); n++ {
-		if p[i] < RuneSelf {
-			i++
-		} else {
-			_, size := DecodeRune(p[i:])
-			i += size
-		}
-	}
-	return n
-}
-
-// RuneCountInString is like RuneCount but its input is a string.
-func RuneCountInString(s string) (n int) {
-	for range s {
-		n++
-	}
-	return
-}
-
-// RuneStart reports whether the byte could be the first byte of
-// an encoded rune.  Second and subsequent bytes always have the top
-// two bits set to 10.
-func RuneStart(b byte) bool { return b&0xC0 != 0x80 }
-
-// Valid reports whether p consists entirely of valid UTF-8-encoded runes.
-func Valid(p []byte) bool {
-	i := 0
-	for i < len(p) {
-		if p[i] < RuneSelf {
-			i++
-		} else {
-			_, size := DecodeRune(p[i:])
-			if size == 1 {
-				// All valid runes of size 1 (those
-				// below RuneSelf) were handled above.
-				// This must be a RuneError.
-				return false
-			}
-			i += size
-		}
-	}
-	return true
-}
-
-// ValidString reports whether s consists entirely of valid UTF-8-encoded runes.
-func ValidString(s string) bool {
-	for i, r := range s {
-		if r == RuneError {
-			// The RuneError value can be an error
-			// sentinel value (if it's size 1) or the same
-			// value encoded properly. Decode it to see if
-			// it's the 1 byte sentinel value.
-			_, size := DecodeRuneInString(s[i:])
-			if size == 1 {
-				return false
-			}
-		}
-	}
-	return true
-}
-
-// ValidRune reports whether r can be legally encoded as UTF-8.
-// Code points that are out of range or a surrogate half are illegal.
-func ValidRune(r rune) bool {
-	switch {
-	case r < 0:
-		return false
-	case surrogateMin <= r && r <= surrogateMax:
-		return false
-	case r > MaxRune:
-		return false
-	}
-	return true
-}
diff --git a/third_party/gofrontend/libgo/go/unicode/utf8/utf8_test.go b/third_party/gofrontend/libgo/go/unicode/utf8/utf8_test.go
deleted file mode 100644
index 758d7a0..0000000
--- a/third_party/gofrontend/libgo/go/unicode/utf8/utf8_test.go
+++ /dev/null
@@ -1,444 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package utf8_test
-
-import (
-	"bytes"
-	"testing"
-	"unicode"
-	. "unicode/utf8"
-)
-
-// Validate the constants redefined from unicode.
-func init() {
-	if MaxRune != unicode.MaxRune {
-		panic("utf8.MaxRune is wrong")
-	}
-	if RuneError != unicode.ReplacementChar {
-		panic("utf8.RuneError is wrong")
-	}
-}
-
-// Validate the constants redefined from unicode.
-func TestConstants(t *testing.T) {
-	if MaxRune != unicode.MaxRune {
-		t.Errorf("utf8.MaxRune is wrong: %x should be %x", MaxRune, unicode.MaxRune)
-	}
-	if RuneError != unicode.ReplacementChar {
-		t.Errorf("utf8.RuneError is wrong: %x should be %x", RuneError, unicode.ReplacementChar)
-	}
-}
-
-type Utf8Map struct {
-	r   rune
-	str string
-}
-
-var utf8map = []Utf8Map{
-	{0x0000, "\x00"},
-	{0x0001, "\x01"},
-	{0x007e, "\x7e"},
-	{0x007f, "\x7f"},
-	{0x0080, "\xc2\x80"},
-	{0x0081, "\xc2\x81"},
-	{0x00bf, "\xc2\xbf"},
-	{0x00c0, "\xc3\x80"},
-	{0x00c1, "\xc3\x81"},
-	{0x00c8, "\xc3\x88"},
-	{0x00d0, "\xc3\x90"},
-	{0x00e0, "\xc3\xa0"},
-	{0x00f0, "\xc3\xb0"},
-	{0x00f8, "\xc3\xb8"},
-	{0x00ff, "\xc3\xbf"},
-	{0x0100, "\xc4\x80"},
-	{0x07ff, "\xdf\xbf"},
-	{0x0800, "\xe0\xa0\x80"},
-	{0x0801, "\xe0\xa0\x81"},
-	{0xd7ff, "\xed\x9f\xbf"}, // last code point before surrogate half.
-	{0xe000, "\xee\x80\x80"}, // first code point after surrogate half.
-	{0xfffe, "\xef\xbf\xbe"},
-	{0xffff, "\xef\xbf\xbf"},
-	{0x10000, "\xf0\x90\x80\x80"},
-	{0x10001, "\xf0\x90\x80\x81"},
-	{0x10fffe, "\xf4\x8f\xbf\xbe"},
-	{0x10ffff, "\xf4\x8f\xbf\xbf"},
-	{0xFFFD, "\xef\xbf\xbd"},
-}
-
-var surrogateMap = []Utf8Map{
-	{0xd800, "\xed\xa0\x80"}, // surrogate min decodes to (RuneError, 1)
-	{0xdfff, "\xed\xbf\xbf"}, // surrogate max decodes to (RuneError, 1)
-}
-
-var testStrings = []string{
-	"",
-	"abcd",
-	"☺☻☹",
-	"日a本b語ç日ð本Ê語þ日¥本¼語i日©",
-	"日a本b語ç日ð本Ê語þ日¥本¼語i日©日a本b語ç日ð本Ê語þ日¥本¼語i日©日a本b語ç日ð本Ê語þ日¥本¼語i日©",
-	"\x80\x80\x80\x80",
-}
-
-func TestFullRune(t *testing.T) {
-	for _, m := range utf8map {
-		b := []byte(m.str)
-		if !FullRune(b) {
-			t.Errorf("FullRune(%q) (%U) = false, want true", b, m.r)
-		}
-		s := m.str
-		if !FullRuneInString(s) {
-			t.Errorf("FullRuneInString(%q) (%U) = false, want true", s, m.r)
-		}
-		b1 := b[0 : len(b)-1]
-		if FullRune(b1) {
-			t.Errorf("FullRune(%q) = true, want false", b1)
-		}
-		s1 := string(b1)
-		if FullRuneInString(s1) {
-			t.Errorf("FullRune(%q) = true, want false", s1)
-		}
-	}
-}
-
-func TestEncodeRune(t *testing.T) {
-	for _, m := range utf8map {
-		b := []byte(m.str)
-		var buf [10]byte
-		n := EncodeRune(buf[0:], m.r)
-		b1 := buf[0:n]
-		if !bytes.Equal(b, b1) {
-			t.Errorf("EncodeRune(%#04x) = %q want %q", m.r, b1, b)
-		}
-	}
-}
-
-func TestDecodeRune(t *testing.T) {
-	for _, m := range utf8map {
-		b := []byte(m.str)
-		r, size := DecodeRune(b)
-		if r != m.r || size != len(b) {
-			t.Errorf("DecodeRune(%q) = %#04x, %d want %#04x, %d", b, r, size, m.r, len(b))
-		}
-		s := m.str
-		r, size = DecodeRuneInString(s)
-		if r != m.r || size != len(b) {
-			t.Errorf("DecodeRuneInString(%q) = %#04x, %d want %#04x, %d", s, r, size, m.r, len(b))
-		}
-
-		// there's an extra byte that bytes left behind - make sure trailing byte works
-		r, size = DecodeRune(b[0:cap(b)])
-		if r != m.r || size != len(b) {
-			t.Errorf("DecodeRune(%q) = %#04x, %d want %#04x, %d", b, r, size, m.r, len(b))
-		}
-		s = m.str + "\x00"
-		r, size = DecodeRuneInString(s)
-		if r != m.r || size != len(b) {
-			t.Errorf("DecodeRuneInString(%q) = %#04x, %d want %#04x, %d", s, r, size, m.r, len(b))
-		}
-
-		// make sure missing bytes fail
-		wantsize := 1
-		if wantsize >= len(b) {
-			wantsize = 0
-		}
-		r, size = DecodeRune(b[0 : len(b)-1])
-		if r != RuneError || size != wantsize {
-			t.Errorf("DecodeRune(%q) = %#04x, %d want %#04x, %d", b[0:len(b)-1], r, size, RuneError, wantsize)
-		}
-		s = m.str[0 : len(m.str)-1]
-		r, size = DecodeRuneInString(s)
-		if r != RuneError || size != wantsize {
-			t.Errorf("DecodeRuneInString(%q) = %#04x, %d want %#04x, %d", s, r, size, RuneError, wantsize)
-		}
-
-		// make sure bad sequences fail
-		if len(b) == 1 {
-			b[0] = 0x80
-		} else {
-			b[len(b)-1] = 0x7F
-		}
-		r, size = DecodeRune(b)
-		if r != RuneError || size != 1 {
-			t.Errorf("DecodeRune(%q) = %#04x, %d want %#04x, %d", b, r, size, RuneError, 1)
-		}
-		s = string(b)
-		r, size = DecodeRuneInString(s)
-		if r != RuneError || size != 1 {
-			t.Errorf("DecodeRuneInString(%q) = %#04x, %d want %#04x, %d", s, r, size, RuneError, 1)
-		}
-
-	}
-}
-
-func TestDecodeSurrogateRune(t *testing.T) {
-	for _, m := range surrogateMap {
-		b := []byte(m.str)
-		r, size := DecodeRune(b)
-		if r != RuneError || size != 1 {
-			t.Errorf("DecodeRune(%q) = %x, %d want %x, %d", b, r, size, RuneError, 1)
-		}
-		s := m.str
-		r, size = DecodeRuneInString(s)
-		if r != RuneError || size != 1 {
-			t.Errorf("DecodeRuneInString(%q) = %x, %d want %x, %d", b, r, size, RuneError, 1)
-		}
-	}
-}
-
-// Check that DecodeRune and DecodeLastRune correspond to
-// the equivalent range loop.
-func TestSequencing(t *testing.T) {
-	for _, ts := range testStrings {
-		for _, m := range utf8map {
-			for _, s := range []string{ts + m.str, m.str + ts, ts + m.str + ts} {
-				testSequence(t, s)
-			}
-		}
-	}
-}
-
-// Check that a range loop and a []int conversion visit the same runes.
-// Not really a test of this package, but the assumption is used here and
-// it's good to verify
-func TestIntConversion(t *testing.T) {
-	for _, ts := range testStrings {
-		runes := []rune(ts)
-		if RuneCountInString(ts) != len(runes) {
-			t.Errorf("%q: expected %d runes; got %d", ts, len(runes), RuneCountInString(ts))
-			break
-		}
-		i := 0
-		for _, r := range ts {
-			if r != runes[i] {
-				t.Errorf("%q[%d]: expected %c (%U); got %c (%U)", ts, i, runes[i], runes[i], r, r)
-			}
-			i++
-		}
-	}
-}
-
-func testSequence(t *testing.T, s string) {
-	type info struct {
-		index int
-		r     rune
-	}
-	index := make([]info, len(s))
-	b := []byte(s)
-	si := 0
-	j := 0
-	for i, r := range s {
-		if si != i {
-			t.Errorf("Sequence(%q) mismatched index %d, want %d", s, si, i)
-			return
-		}
-		index[j] = info{i, r}
-		j++
-		r1, size1 := DecodeRune(b[i:])
-		if r != r1 {
-			t.Errorf("DecodeRune(%q) = %#04x, want %#04x", s[i:], r1, r)
-			return
-		}
-		r2, size2 := DecodeRuneInString(s[i:])
-		if r != r2 {
-			t.Errorf("DecodeRuneInString(%q) = %#04x, want %#04x", s[i:], r2, r)
-			return
-		}
-		if size1 != size2 {
-			t.Errorf("DecodeRune/DecodeRuneInString(%q) size mismatch %d/%d", s[i:], size1, size2)
-			return
-		}
-		si += size1
-	}
-	j--
-	for si = len(s); si > 0; {
-		r1, size1 := DecodeLastRune(b[0:si])
-		r2, size2 := DecodeLastRuneInString(s[0:si])
-		if size1 != size2 {
-			t.Errorf("DecodeLastRune/DecodeLastRuneInString(%q, %d) size mismatch %d/%d", s, si, size1, size2)
-			return
-		}
-		if r1 != index[j].r {
-			t.Errorf("DecodeLastRune(%q, %d) = %#04x, want %#04x", s, si, r1, index[j].r)
-			return
-		}
-		if r2 != index[j].r {
-			t.Errorf("DecodeLastRuneInString(%q, %d) = %#04x, want %#04x", s, si, r2, index[j].r)
-			return
-		}
-		si -= size1
-		if si != index[j].index {
-			t.Errorf("DecodeLastRune(%q) index mismatch at %d, want %d", s, si, index[j].index)
-			return
-		}
-		j--
-	}
-	if si != 0 {
-		t.Errorf("DecodeLastRune(%q) finished at %d, not 0", s, si)
-	}
-}
-
-// Check that negative runes encode as U+FFFD.
-func TestNegativeRune(t *testing.T) {
-	errorbuf := make([]byte, UTFMax)
-	errorbuf = errorbuf[0:EncodeRune(errorbuf, RuneError)]
-	buf := make([]byte, UTFMax)
-	buf = buf[0:EncodeRune(buf, -1)]
-	if !bytes.Equal(buf, errorbuf) {
-		t.Errorf("incorrect encoding [% x] for -1; expected [% x]", buf, errorbuf)
-	}
-}
-
-type RuneCountTest struct {
-	in  string
-	out int
-}
-
-var runecounttests = []RuneCountTest{
-	{"abcd", 4},
-	{"☺☻☹", 3},
-	{"1,2,3,4", 7},
-	{"\xe2\x00", 2},
-}
-
-func TestRuneCount(t *testing.T) {
-	for _, tt := range runecounttests {
-		if out := RuneCountInString(tt.in); out != tt.out {
-			t.Errorf("RuneCountInString(%q) = %d, want %d", tt.in, out, tt.out)
-		}
-		if out := RuneCount([]byte(tt.in)); out != tt.out {
-			t.Errorf("RuneCount(%q) = %d, want %d", tt.in, out, tt.out)
-		}
-	}
-}
-
-type RuneLenTest struct {
-	r    rune
-	size int
-}
-
-var runelentests = []RuneLenTest{
-	{0, 1},
-	{'e', 1},
-	{'é', 2},
-	{'☺', 3},
-	{RuneError, 3},
-	{MaxRune, 4},
-	{0xD800, -1},
-	{0xDFFF, -1},
-	{MaxRune + 1, -1},
-	{-1, -1},
-}
-
-func TestRuneLen(t *testing.T) {
-	for _, tt := range runelentests {
-		if size := RuneLen(tt.r); size != tt.size {
-			t.Errorf("RuneLen(%#U) = %d, want %d", tt.r, size, tt.size)
-		}
-	}
-}
-
-type ValidTest struct {
-	in  string
-	out bool
-}
-
-var validTests = []ValidTest{
-	{"", true},
-	{"a", true},
-	{"abc", true},
-	{"Ж", true},
-	{"ЖЖ", true},
-	{"брэд-ЛГТМ", true},
-	{"☺☻☹", true},
-	{string([]byte{66, 250}), false},
-	{string([]byte{66, 250, 67}), false},
-	{"a\uFFFDb", true},
-	{string("\xF4\x8F\xBF\xBF"), true},      // U+10FFFF
-	{string("\xF4\x90\x80\x80"), false},     // U+10FFFF+1; out of range
-	{string("\xF7\xBF\xBF\xBF"), false},     // 0x1FFFFF; out of range
-	{string("\xFB\xBF\xBF\xBF\xBF"), false}, // 0x3FFFFFF; out of range
-	{string("\xc0\x80"), false},             // U+0000 encoded in two bytes: incorrect
-	{string("\xed\xa0\x80"), false},         // U+D800 high surrogate (sic)
-	{string("\xed\xbf\xbf"), false},         // U+DFFF low surrogate (sic)
-}
-
-func TestValid(t *testing.T) {
-	for _, tt := range validTests {
-		if Valid([]byte(tt.in)) != tt.out {
-			t.Errorf("Valid(%q) = %v; want %v", tt.in, !tt.out, tt.out)
-		}
-		if ValidString(tt.in) != tt.out {
-			t.Errorf("ValidString(%q) = %v; want %v", tt.in, !tt.out, tt.out)
-		}
-	}
-}
-
-type ValidRuneTest struct {
-	r  rune
-	ok bool
-}
-
-var validrunetests = []ValidRuneTest{
-	{0, true},
-	{'e', true},
-	{'é', true},
-	{'☺', true},
-	{RuneError, true},
-	{MaxRune, true},
-	{0xD7FF, true},
-	{0xD800, false},
-	{0xDFFF, false},
-	{0xE000, true},
-	{MaxRune + 1, false},
-	{-1, false},
-}
-
-func TestValidRune(t *testing.T) {
-	for _, tt := range validrunetests {
-		if ok := ValidRune(tt.r); ok != tt.ok {
-			t.Errorf("ValidRune(%#U) = %t, want %t", tt.r, ok, tt.ok)
-		}
-	}
-}
-
-func BenchmarkRuneCountTenASCIIChars(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		RuneCountInString("0123456789")
-	}
-}
-
-func BenchmarkRuneCountTenJapaneseChars(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		RuneCountInString("日本語日本語日本語日")
-	}
-}
-
-func BenchmarkEncodeASCIIRune(b *testing.B) {
-	buf := make([]byte, UTFMax)
-	for i := 0; i < b.N; i++ {
-		EncodeRune(buf, 'a')
-	}
-}
-
-func BenchmarkEncodeJapaneseRune(b *testing.B) {
-	buf := make([]byte, UTFMax)
-	for i := 0; i < b.N; i++ {
-		EncodeRune(buf, '本')
-	}
-}
-
-func BenchmarkDecodeASCIIRune(b *testing.B) {
-	a := []byte{'a'}
-	for i := 0; i < b.N; i++ {
-		DecodeRune(a)
-	}
-}
-
-func BenchmarkDecodeJapaneseRune(b *testing.B) {
-	nihon := []byte("本")
-	for i := 0; i < b.N; i++ {
-		DecodeRune(nihon)
-	}
-}
diff --git a/third_party/gofrontend/libgo/godeps.sh b/third_party/gofrontend/libgo/godeps.sh
deleted file mode 100755
index 7ae5af9..0000000
--- a/third_party/gofrontend/libgo/godeps.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/sh
-
-# Copyright 2011 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# The godeps.sh script outputs a dependency file for a package.  The
-# dependency file is then included in the libgo Makefile.  This is
-# automatic dependency generation, Go style.
-
-# The first parameter is the name of the file being generated.  The
-# remaining parameters are the names of Go files which are scanned for
-# imports.
-
-set -e
-
-if test $# = 0; then
-    echo 1>&2 "Usage: godeps.sh OUTPUT INPUTS..."
-    exit 1
-fi
-
-output=$1
-shift
-
-deps=`for f in $*; do cat $f; done | 
-  sed -n -e '/^import.*"/p; /^import[ 	]*(/,/^)/p' |
-  grep '"' |
-  grep -v '"unsafe"' |
-  sed -e 's/^.*"\([^"]*\)".*$/\1/' -e 's/$/.gox/' |
-  sort -u`
-
-echo $output: $deps
diff --git a/third_party/gofrontend/libgo/merge.sh b/third_party/gofrontend/libgo/merge.sh
deleted file mode 100755
index 24f63d9..0000000
--- a/third_party/gofrontend/libgo/merge.sh
+++ /dev/null
@@ -1,201 +0,0 @@
-#!/bin/sh
-
-# Copyright 2009 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# This script merges changes from the master copy of the Go library
-# into the libgo library.  This does the easy stuff; the hard stuff is
-# left to the user.
-
-# The file MERGE should hold the Git revision number of the last
-# revision which was merged into these sources.  Given that, and given
-# the current sources, we can run the usual diff3 algorithm to merge
-# all changes into our sources.
-
-set -e
-
-TMPDIR=${TMPDIR:-/tmp}
-
-OLDDIR=${TMPDIR}/libgo-merge-old
-NEWDIR=${TMPDIR}/libgo-merge-new
-
-if ! test -f MERGE; then
-  echo 1>&2 "merge.sh: must be run in libgo source directory"
-  exit 1
-fi
-
-rev=weekly
-case $# in
-1) ;;
-2) rev=$2 ;;
-*)
-  echo 1>&2 "merge.sh: Usage: merge.sh git-repository [revision]"
-  exit 1
-  ;;
-esac
-
-repository=$1
-
-old_rev=`sed 1q MERGE`
-
-rm -rf ${OLDDIR}
-git clone ${repository} ${OLDDIR}
-(cd ${OLDDIR} && git checkout ${old_rev})
-
-rm -rf ${NEWDIR}
-git clone ${repository} ${NEWDIR}
-(cd ${NEWDIR} && git checkout ${rev})
-
-new_rev=`cd ${NEWDIR} && git log | sed 1q | sed -e 's/commit //'`
-
-merge() {
-  name=$1
-  old=$2
-  new=$3
-  libgo=$4
-  if ! test -f ${new}; then
-    # The file does not exist in the new version.
-    if ! test -f ${old}; then
-      echo 1>&2 "merge.sh internal error no files $old $new"
-      exit 1
-    fi
-    if ! test -f ${libgo}; then
-      # File removed in new version and libgo.
-      :;
-    else
-      echo "merge.sh: ${name}: REMOVED"
-      rm -f ${libgo}
-      git rm ${libgo}
-    fi
-  elif test -f ${old}; then
-    # The file exists in the old version.
-    if ! test -f ${libgo}; then
-      echo "merge.sh: $name: skipping: exists in old and new git, but not in libgo"
-      continue
-    fi
-    if cmp -s ${old} ${libgo}; then
-      # The libgo file is unchanged from the old version.
-      if cmp -s ${new} ${libgo}; then
-        # File is unchanged from old to new version.
-        continue
-      fi
-      # Update file in libgo.
-      echo "merge.sh: $name: updating"
-      cp ${new} ${libgo}
-    else
-      # The libgo file has local changes.
-      set +e
-      diff3 -m -E ${libgo} ${old} ${new} > ${libgo}.tmp
-      status=$?
-      set -e
-      case $status in
-      0)
-        echo "merge.sh: $name: updating"
-        mv ${libgo}.tmp ${libgo}
-        ;;
-      1)
-        echo "merge.sh: $name: CONFLICTS"
-        mv ${libgo}.tmp ${libgo}
-        ;;
-      *)
-        echo 1>&2 "merge.sh: $name: diff3 failure"
-        exit 1
-        ;;
-      esac
-    fi
-  else
-    # The file does not exist in the old version.
-    if test -f ${libgo}; then
-      if ! cmp -s ${new} ${libgo}; then
-        echo 1>&2 "merge.sh: $name: IN NEW AND LIBGO BUT NOT OLD"
-      fi
-    else
-      echo "merge.sh: $name: NEW"
-      dir=`dirname ${libgo}`
-      if ! test -d ${dir}; then
-        mkdir -p ${dir}
-      fi
-      cp ${new} ${libgo}
-      git add ${libgo}
-    fi
-  fi
-}
-
-merge_c() {
-  from=$1
-  to=$2
-  oldfile=${OLDDIR}/src/runtime/$from
-  if test -f ${oldfile}; then
-    sed -e 's/·/_/g' < ${oldfile} > ${oldfile}.tmp
-    oldfile=${oldfile}.tmp
-    newfile=${NEWDIR}/src/runtime/$from
-    sed -e 's/·/_/g' < ${newfile} > ${newfile}.tmp
-    newfile=${newfile}.tmp
-    libgofile=runtime/$to
-    merge $from ${oldfile} ${newfile} ${libgofile}
-  fi
-}
-
-if test -f VERSION; then
-  if ! cmp -s ${NEWDIR}/VERSION VERSION; then
-    cp ${NEWDIR}/VERSION .
-  fi
-else
-  if test -f ${NEWDIR}/VERSION; then
-    cp ${NEWDIR}/VERSION .
-  fi
-fi
-
-(cd ${NEWDIR}/src && find . -name '*.go' -print) | while read f; do
-  oldfile=${OLDDIR}/src/$f
-  newfile=${NEWDIR}/src/$f
-  libgofile=go/$f
-  merge $f ${oldfile} ${newfile} ${libgofile}
-done
-
-(cd ${NEWDIR}/src && find . -name testdata -print) | while read d; do
-  oldtd=${OLDDIR}/src/$d
-  newtd=${NEWDIR}/src/$d
-  libgotd=go/$d
-  if ! test -d ${oldtd}; then
-    continue
-  fi
-  (cd ${oldtd} && git ls-files .) | while read f; do
-    if test "`basename $f`" = ".gitignore"; then
-      continue
-    fi
-    name=$d/$f
-    oldfile=${oldtd}/$f
-    newfile=${newtd}/$f
-    libgofile=${libgotd}/$f
-    merge ${name} ${oldfile} ${newfile} ${libgofile}
-  done
-done
-
-runtime="chan.goc chan.h cpuprof.goc env_posix.c heapdump.c lock_futex.c lfstack.goc lock_sema.c mcache.c mcentral.c mfixalloc.c mgc0.c mgc0.h mheap.c msize.c netpoll.goc netpoll_epoll.c netpoll_kqueue.c netpoll_stub.c panic.c print.c proc.c race.h rdebug.goc runtime.c runtime.h signal_unix.c signal_unix.h malloc.h malloc.goc mprof.goc parfor.c runtime1.goc sema.goc sigqueue.goc string.goc time.goc"
-for f in $runtime; do
-  # merge_c $f $f
-  true
-done
-
-# merge_c os_linux.c thread-linux.c
-# merge_c mem_linux.c mem.c
-
-(cd ${OLDDIR}/src && find . -name '*.go' -print) | while read f; do
-  oldfile=${OLDDIR}/src/$f
-  newfile=${NEWDIR}/src/$f
-  libgofile=go/$f
-  if test -f ${newfile}; then
-    continue
-  fi
-  if ! test -f ${libgofile}; then
-    continue
-  fi
-  echo "merge.sh: ${libgofile}: REMOVED"
-  rm -f ${libgofile}
-  git rm ${libgofile}
-done
-
-(echo ${new_rev}; sed -ne '2,$p' MERGE) > MERGE.tmp
-mv MERGE.tmp MERGE
diff --git a/third_party/gofrontend/libgo/mksysinfo.sh b/third_party/gofrontend/libgo/mksysinfo.sh
deleted file mode 100755
index 662619f..0000000
--- a/third_party/gofrontend/libgo/mksysinfo.sh
+++ /dev/null
@@ -1,1511 +0,0 @@
-#!/bin/sh
-
-# Copyright 2009 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# Create sysinfo.go.
-
-# This shell script creates the sysinfo.go file which holds types and
-# constants extracted from the system header files.  This relies on a
-# hook in gcc: the -fdump-go-spec option will generate debugging
-# information in Go syntax.
-
-# We currently #include all the files at once, which works, but leads
-# to exposing some names which ideally should not be exposed, as they
-# match grep patterns.  E.g., WCHAR_MIN gets exposed because it starts
-# with W, like the wait flags.
-
-CC=${CC:-gcc}
-OUT=tmp-sysinfo.go
-
-set -e
-
-rm -f sysinfo.c
-cat > sysinfo.c <<EOF
-#include "config.h"
-
-#include <sys/types.h>
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <netinet/in.h>
-/* <netinet/tcp.h> needs u_char/u_short, but <sys/bsd_types> is only
-   included by <netinet/in.h> if _SGIAPI (i.e. _SGI_SOURCE
-   && !_XOPEN_SOURCE.
-   <sys/termios.h> only defines TIOCNOTTY if !_XOPEN_SOURCE, while
-   <sys/ttold.h> does so unconditionally.  */
-#ifdef __sgi__
-#include <sys/bsd_types.h>
-#include <sys/ttold.h>
-#endif
-#include <netinet/tcp.h>
-#if defined(HAVE_NETINET_IN_SYSTM_H)
-#include <netinet/in_systm.h>
-#endif
-#if defined(HAVE_NETINET_IP_H)
-#include <netinet/ip.h>
-#endif
-#if defined(HAVE_NETINET_IP_MROUTE_H)
-#include <netinet/ip_mroute.h>
-#endif
-#if defined(HAVE_NETINET_IF_ETHER_H)
-#include <netinet/if_ether.h>
-#endif
-#include <signal.h>
-#include <sys/ioctl.h>
-#include <termios.h>
-#if defined(HAVE_SYSCALL_H)
-#include <syscall.h>
-#endif
-#if defined(HAVE_SYS_SYSCALL_H)
-#include <sys/syscall.h>
-#endif
-#if defined(HAVE_SYS_EPOLL_H)
-#include <sys/epoll.h>
-#endif
-#if defined(HAVE_SYS_FILE_H)
-#include <sys/file.h>
-#endif
-#if defined(HAVE_SYS_MMAN_H)
-#include <sys/mman.h>
-#endif
-#if defined(HAVE_SYS_PRCTL_H)
-#include <sys/prctl.h>
-#endif
-#if defined(HAVE_SYS_PTRACE_H)
-#include <sys/ptrace.h>
-#endif
-#include <sys/resource.h>
-#include <sys/uio.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/times.h>
-#include <sys/wait.h>
-#include <sys/un.h>
-#if defined(HAVE_SYS_USER_H)
-#include <sys/user.h>
-#endif
-#if defined(HAVE_SYS_UTSNAME_H)
-#include <sys/utsname.h>
-#endif
-#if defined(HAVE_SYS_SELECT_H)
-#include <sys/select.h>
-#endif
-#include <time.h>
-#include <unistd.h>
-#include <netdb.h>
-#include <pwd.h>
-#if defined(HAVE_LINUX_FILTER_H)
-#include <linux/filter.h>
-#endif
-#if defined(HAVE_LINUX_IF_ADDR_H)
-#include <linux/if_addr.h>
-#endif
-#if defined(HAVE_LINUX_IF_ETHER_H)
-#include <linux/if_ether.h>
-#endif
-#if defined(HAVE_LINUX_IF_TUN_H)
-#include <linux/if_tun.h>
-#endif
-#if defined(HAVE_LINUX_NETLINK_H)
-#include <linux/netlink.h>
-#endif
-#if defined(HAVE_LINUX_RTNETLINK_H)
-#include <linux/rtnetlink.h>
-#endif
-#if defined(HAVE_NET_IF_H)
-#include <net/if.h>
-#endif
-#if defined(HAVE_NET_IF_ARP_H)
-#include <net/if_arp.h>
-#endif
-#if defined(HAVE_NET_ROUTE_H)
-#include <net/route.h>
-#endif
-#if defined (HAVE_NETPACKET_PACKET_H)
-#include <netpacket/packet.h>
-#endif
-#if defined(HAVE_SYS_MOUNT_H)
-#include <sys/mount.h>
-#endif
-#if defined(HAVE_SYS_VFS_H)
-#include <sys/vfs.h>
-#endif
-#if defined(HAVE_STATFS_H)
-#include <sys/statfs.h>
-#endif
-#if defined(HAVE_SYS_TIMEX_H)
-#include <sys/timex.h>
-#endif
-#if defined(HAVE_SYS_SYSINFO_H)
-#include <sys/sysinfo.h>
-#endif
-#if defined(HAVE_USTAT_H)
-#include <ustat.h>
-#endif
-#if defined(HAVE_UTIME_H)
-#include <utime.h>
-#endif
-#if defined(HAVE_LINUX_ETHER_H)
-#include <linux/ether.h>
-#endif
-#if defined(HAVE_LINUX_FS_H)
-#include <linux/fs.h>
-#endif
-#if defined(HAVE_LINUX_REBOOT_H)
-#include <linux/reboot.h>
-#endif
-#if defined(HAVE_SYS_INOTIFY_H)
-#include <sys/inotify.h>
-#endif
-#if defined(HAVE_NETINET_ICMP6_H)
-#include <netinet/icmp6.h>
-#endif
-#if defined(HAVE_SCHED_H)
-#include <sched.h>
-#endif
-
-/* Constants that may only be defined as expressions on some systems,
-   expressions too complex for -fdump-go-spec to handle.  These are
-   handled specially below.  */
-enum {
-#ifdef TIOCGWINSZ
-  TIOCGWINSZ_val = TIOCGWINSZ,
-#endif
-#ifdef TIOCSWINSZ
-  TIOCSWINSZ_val = TIOCSWINSZ,
-#endif
-#ifdef TIOCNOTTY
-  TIOCNOTTY_val = TIOCNOTTY,
-#endif
-#ifdef TIOCSCTTY
-  TIOCSCTTY_val = TIOCSCTTY,
-#endif
-#ifdef TIOCGPGRP
-  TIOCGPGRP_val = TIOCGPGRP,
-#endif
-#ifdef TIOCSPGRP
-  TIOCSPGRP_val = TIOCSPGRP,
-#endif
-#ifdef TIOCGPTN
-  TIOCGPTN_val = TIOCGPTN,
-#endif
-#ifdef TIOCSPTLCK
-  TIOCSPTLCK_val = TIOCSPTLCK,
-#endif
-#ifdef TIOCGDEV
-  TIOCGDEV_val = TIOCGDEV,
-#endif
-#ifdef TIOCSIG
-  TIOCSIG_val = TIOCSIG,
-#endif
-#ifdef TCGETS
-  TCGETS_val = TCGETS,
-#endif
-#ifdef TCSETS
-  TCSETS_val = TCSETS,
-#endif
-#ifdef TUNSETIFF
-  TUNSETIFF_val = TUNSETIFF,
-#endif
-#ifdef TUNSETNOCSUM
-  TUNSETNOCSUM_val = TUNSETNOCSUM,
-#endif
-#ifdef TUNSETDEBUG
-  TUNSETDEBUG_val = TUNSETDEBUG,
-#endif
-#ifdef TUNSETPERSIST
-  TUNSETPERSIST_val = TUNSETPERSIST,
-#endif
-#ifdef TUNSETOWNER
-  TUNSETOWNER_val = TUNSETOWNER,
-#endif
-#ifdef TUNSETLINK
-  TUNSETLINK_val = TUNSETLINK,
-#endif
-#ifdef TUNSETGROUP
-  TUNSETGROUP_val = TUNSETGROUP,
-#endif
-#ifdef TUNGETFEATURES
-  TUNGETFEATURES_val = TUNGETFEATURES,
-#endif
-#ifdef TUNSETOFFLOAD
-  TUNSETOFFLOAD_val = TUNSETOFFLOAD,
-#endif
-#ifdef TUNSETTXFILTER
-  TUNSETTXFILTER_val = TUNSETTXFILTER,
-#endif
-#ifdef TUNGETIFF
-  TUNGETIFF_val = TUNGETIFF,
-#endif
-#ifdef TUNGETSNDBUF
-  TUNGETSNDBUF_val = TUNGETSNDBUF,
-#endif
-#ifdef TUNSETSNDBUF
-  TUNSETSNDBUF_val = TUNSETSNDBUF,
-#endif
-#ifdef TUNATTACHFILTER
-  TUNATTACHFILTER_val = TUNATTACHFILTER,
-#endif
-#ifdef TUNDETACHFILTER
-  TUNDETACHFILTER_val = TUNDETACHFILTER,
-#endif
-#ifdef TUNGETVNETHDRSZ
-  TUNGETVNETHDRSZ_val = TUNGETVNETHDRSZ,
-#endif
-#ifdef TUNSETVNETHDRSZ
-  TUNSETVNETHDRSZ_val = TUNSETVNETHDRSZ,
-#endif
-#ifdef TUNSETQUEUE
-  TUNSETQUEUE_val = TUNSETQUEUE,
-#endif
-#ifdef TUNSETIFINDEX
-  TUNSETIFINDEX_val = TUNSETIFINDEX,
-#endif
-#ifdef TUNGETFILTER
-  TUNGETFILTER_val = TUNGETFILTER,
-#endif
-
-};
-EOF
-
-${CC} -fdump-go-spec=gen-sysinfo.go -std=gnu99 -S -o sysinfo.s sysinfo.c
-
-echo 'package syscall' > ${OUT}
-echo 'import "unsafe"' >> ${OUT}
-echo 'type _ unsafe.Pointer' >> ${OUT}
-
-# Get all the consts and types, skipping ones which could not be
-# represented in Go and ones which we need to rewrite.  We also skip
-# function declarations, as we don't need them here.  All the symbols
-# will all have a leading underscore.
-grep -v '^// ' gen-sysinfo.go | \
-  grep -v '^func' | \
-  grep -v '^type _timeval ' | \
-  grep -v '^type _timespec_t ' | \
-  grep -v '^type _timespec ' | \
-  grep -v '^type _timestruc_t ' | \
-  grep -v '^type _epoll_' | \
-  grep -v 'in6_addr' | \
-  grep -v 'sockaddr_in6' | \
-  sed -e 's/\([^a-zA-Z0-9_]\)_timeval\([^a-zA-Z0-9_]\)/\1Timeval\2/g' \
-      -e 's/\([^a-zA-Z0-9_]\)_timespec_t\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \
-      -e 's/\([^a-zA-Z0-9_]\)_timespec\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \
-      -e 's/\([^a-zA-Z0-9_]\)_timestruc_t\([^a-zA-Z0-9_]\)/\1Timestruc\2/g' \
-    >> ${OUT}
-
-# The errno constants.  These get type Errno.
-echo '#include <errno.h>' | ${CC} -x c - -E -dM | \
-  egrep '#define E[A-Z0-9_]+ ' | \
-  sed -e 's/^#define \(E[A-Z0-9_]*\) .*$/const \1 = Errno(_\1)/' >> ${OUT}
-
-# The O_xxx flags.
-egrep '^const _(O|F|FD)_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\([^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-if ! grep '^const O_ASYNC' ${OUT} >/dev/null 2>&1; then
-  echo "const O_ASYNC = 0" >> ${OUT}
-fi
-if ! grep '^const O_CLOEXEC' ${OUT} >/dev/null 2>&1; then
-  echo "const O_CLOEXEC = 0" >> ${OUT}
-fi
-
-# The os package requires F_DUPFD_CLOEXEC to be defined.
-if ! grep '^const F_DUPFD_CLOEXEC' ${OUT} >/dev/null 2>&1; then
-  echo "const F_DUPFD_CLOEXEC = 0" >> ${OUT}
-fi
-
-# These flags can be lost on i386 GNU/Linux when using
-# -D_FILE_OFFSET_BITS=64, because we see "#define F_SETLK F_SETLK64"
-# before we see the definition of F_SETLK64.
-for flag in F_GETLK F_SETLK F_SETLKW; do
-  if ! grep "^const ${flag} " ${OUT} >/dev/null 2>&1 \
-      && grep "^const ${flag}64 " ${OUT} >/dev/null 2>&1; then
-    echo "const ${flag} = ${flag}64" >> ${OUT}
-  fi
-done
-
-# The Flock_t struct for fcntl.
-grep '^type _flock ' gen-sysinfo.go | \
-    sed -e 's/type _flock/type Flock_t/' \
-      -e 's/l_type/Type/' \
-      -e 's/l_whence/Whence/' \
-      -e 's/l_start/Start/' \
-      -e 's/l_len/Len/' \
-      -e 's/l_pid/Pid/' \
-    >> ${OUT}
-
-# The signal numbers.
-grep '^const _SIG[^_]' gen-sysinfo.go | \
-  grep -v '^const _SIGEV_' | \
-  sed -e 's/^\(const \)_\(SIG[^= ]*\)\(.*\)$/\1\2 = Signal(_\2)/' >> ${OUT}
-if ! grep '^const SIGPOLL ' ${OUT} >/dev/null 2>&1; then
-  if grep '^const SIGIO ' ${OUT} > /dev/null 2>&1; then
-    echo "const SIGPOLL = SIGIO" >> ${OUT}
-  fi
-fi
-if ! grep '^const SIGCLD ' ${OUT} >/dev/null 2>&1; then
-  if grep '^const SIGCHLD ' ${OUT} >/dev/null 2>&1; then
-    echo "const SIGCLD = SIGCHLD" >> ${OUT}
-  fi
-fi
-
-# The syscall numbers.  We force the names to upper case.
-grep '^const _SYS_' gen-sysinfo.go | \
-  sed -e 's/const _\(SYS_[^= ]*\).*$/\1/' | \
-  while read sys; do
-    sup=`echo $sys | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
-    echo "const $sup = _$sys" >> ${OUT}
-  done
-
-# The GNU/Linux support wants to use SYS_GETDENTS64 if available.
-if ! grep '^const SYS_GETDENTS ' ${OUT} >/dev/null 2>&1; then
-  echo "const SYS_GETDENTS = 0" >> ${OUT}
-fi
-if ! grep '^const SYS_GETDENTS64 ' ${OUT} >/dev/null 2>&1; then
-  echo "const SYS_GETDENTS64 = 0" >> ${OUT}
-fi
-
-# Stat constants.
-grep '^const _S_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(S_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# Mmap constants.
-grep '^const _PROT_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(PROT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _MAP_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(MAP_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _MADV_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(MADV_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _MCL_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(MCL_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# Process status constants.
-grep '^const _W' gen-sysinfo.go |
-  sed -e 's/^\(const \)_\(W[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-# WSTOPPED was introduced in glibc 2.3.4.
-if ! grep '^const _WSTOPPED = ' gen-sysinfo.go >/dev/null 2>&1; then
-  if grep '^const _WUNTRACED = ' gen-sysinfo.go > /dev/null 2>&1; then
-    echo 'const WSTOPPED = _WUNTRACED' >> ${OUT}
-  else
-    echo 'const WSTOPPED = 2' >> ${OUT}
-  fi
-fi
-if grep '^const ___WALL = ' gen-sysinfo.go >/dev/null 2>&1 \
-   && ! grep '^const _WALL = ' gen-sysinfo.go >/dev/null 2>&1; then
-  echo 'const WALL = ___WALL' >> ${OUT}
-fi
-
-# Networking constants.
-egrep '^const _(AF|ARPHRD|ETH|IN|SOCK|SOL|SO|IPPROTO|TCP|IP|IPV6)_' gen-sysinfo.go |
-  sed -e 's/^\(const \)_\([^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _SOMAXCONN' gen-sysinfo.go |
-  sed -e 's/^\(const \)_\(SOMAXCONN[^= ]*\)\(.*\)$/\1\2 = _\2/' \
-    >> ${OUT}
-grep '^const _SHUT_' gen-sysinfo.go |
-  sed -e 's/^\(const \)_\(SHUT[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The net package requires some const definitions.
-for m in IP_PKTINFO IPV6_V6ONLY IPPROTO_IPV6 IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_TCLASS SO_REUSEPORT; do
-  if ! grep "^const $m " ${OUT} >/dev/null 2>&1; then
-    echo "const $m = 0" >> ${OUT}
-  fi
-done
-for m in SOCK_CLOEXEC SOCK_NONBLOCK; do
-  if ! grep "^const $m " ${OUT} >/dev/null 2>&1; then
-    echo "const $m = -1" >> ${OUT}
-  fi
-done
-
-# The syscall package requires AF_LOCAL.
-if ! grep '^const AF_LOCAL ' ${OUT} >/dev/null 2>&1; then
-  if grep '^const AF_UNIX ' ${OUT} >/dev/null 2>&1; then
-    echo "const AF_LOCAL = AF_UNIX" >> ${OUT}
-  fi
-fi
-
-# pathconf constants.
-grep '^const __PC' gen-sysinfo.go |
-  sed -e 's/^\(const \)__\(PC[^= ]*\)\(.*\)$/\1\2 = __\2/' >> ${OUT}
-
-# The PATH_MAX constant.
-if grep '^const _PATH_MAX ' gen-sysinfo.go >/dev/null 2>&1; then
-  echo 'const PathMax = _PATH_MAX' >> ${OUT}
-fi
-
-# epoll constants.
-grep '^const _EPOLL' gen-sysinfo.go |
-  sed -e 's/^\(const \)_\(EPOLL[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-# Make sure EPOLLRDHUP and EPOLL_CLOEXEC are defined.
-if ! grep '^const EPOLLRDHUP' ${OUT} >/dev/null 2>&1; then
-  echo "const EPOLLRDHUP = 0x2000" >> ${OUT}
-fi
-if ! grep '^const EPOLL_CLOEXEC' ${OUT} >/dev/null 2>&1; then
-  echo "const EPOLL_CLOEXEC = 02000000" >> ${OUT}
-fi
-
-# Prctl constants.
-grep '^const _PR_' gen-sysinfo.go |
-  sed -e 's/^\(const \)_\(PR_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# Ptrace constants.
-grep '^const _PTRACE' gen-sysinfo.go |
-  sed -e 's/^\(const \)_\(PTRACE[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-# We need some ptrace options that are not defined in older versions
-# of glibc.
-if ! grep '^const PTRACE_SETOPTIONS' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_SETOPTIONS = 0x4200" >> ${OUT}
-fi
-if ! grep '^const PTRACE_O_TRACESYSGOOD' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_O_TRACESYSGOOD = 0x1" >> ${OUT}
-fi
-if ! grep '^const PTRACE_O_TRACEFORK' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_O_TRACEFORK = 0x2" >> ${OUT}
-fi
-if ! grep '^const PTRACE_O_TRACEVFORK' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_O_TRACEVFORK = 0x4" >> ${OUT}
-fi
-if ! grep '^const PTRACE_O_TRACECLONE' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_O_TRACECLONE = 0x8" >> ${OUT}
-fi
-if ! grep '^const PTRACE_O_TRACEEXEC' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_O_TRACEEXEC = 0x10" >> ${OUT}
-fi
-if ! grep '^const PTRACE_O_TRACEVFORKDONE' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_O_TRACEVFORKDONE = 0x20" >> ${OUT}
-fi
-if ! grep '^const PTRACE_O_TRACEEXIT' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_O_TRACEEXIT = 0x40" >> ${OUT}
-fi
-if ! grep '^const PTRACE_O_MASK' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_O_MASK = 0x7f" >> ${OUT}
-fi
-if ! grep '^const _PTRACE_GETEVENTMSG' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_GETEVENTMSG = 0x4201" >> ${OUT}
-fi
-if ! grep '^const PTRACE_EVENT_FORK' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_EVENT_FORK = 1" >> ${OUT}
-fi
-if ! grep '^const PTRACE_EVENT_VFORK' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_EVENT_VFORK = 2" >> ${OUT}
-fi
-if ! grep '^const PTRACE_EVENT_CLONE' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_EVENT_CLONE = 3" >> ${OUT}
-fi
-if ! grep '^const PTRACE_EVENT_EXEC' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_EVENT_EXEC = 4" >> ${OUT}
-fi
-if ! grep '^const PTRACE_EVENT_VFORK_DONE' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_EVENT_VFORK_DONE = 5" >> ${OUT}
-fi
-if ! grep '^const PTRACE_EVENT_EXIT' ${OUT} > /dev/null 2>&1; then
-  echo "const PTRACE_EVENT_EXIT = 6" >> ${OUT}
-fi
-if ! grep '^const _PTRACE_TRACEME' ${OUT} > /dev/null 2>&1; then
-  echo "const _PTRACE_TRACEME = 0" >> ${OUT}
-fi
-
-# A helper function that prints a structure from gen-sysinfo.go with the first
-# letter of the field names in upper case.  $1 is the name of structure.  If $2
-# is not empty, the structure or type is renamed to $2.
-upcase_fields () {
-  name="$1"
-  def=`grep "^type $name" gen-sysinfo.go`
-  fields=`echo $def | sed -e 's/^[^{]*{\(.*\)}$/\1/'`
-  prefix=`echo $def | sed -e 's/{.*//'`
-  if test "$2" != ""; then
-    prefix=`echo $prefix | sed -e "s/$1/$2/"`
-  fi
-  if test "$fields" != ""; then
-    nfields=
-    while test -n "$fields"; do
-      field=`echo $fields | sed -e 's/^\([^;]*\);.*$/\1/'`
-      fields=`echo $fields | sed -e 's/^[^;]*; *\(.*\)$/\1/'`
-      # capitalize the next character.
-      f=`echo $field | sed -e 's/^\(.\).*$/\1/'`
-      r=`echo $field | sed -e 's/^.\(.*\)$/\1/'`
-      f=`echo $f | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
-      field="$f$r"
-      nfields="$nfields $field;"
-    done
-    echo "${prefix} {$nfields }"
-  fi
-}
-
-# The registers returned by PTRACE_GETREGS.  This is probably
-# GNU/Linux specific; it should do no harm if there is no
-# _user_regs_struct.
-regs=`grep '^type _user_regs_struct struct' gen-sysinfo.go || true`
-if test "$regs" = ""; then
-  # s390
-  regs=`grep '^type __user_regs_struct struct' gen-sysinfo.go || true`
-  if test "$regs" != ""; then
-    # Substructures of __user_regs_struct on s390
-    upcase_fields "__user_psw_struct" "PtracePsw" >> ${OUT} || true
-    upcase_fields "__user_fpregs_struct" "PtraceFpregs" >> ${OUT} || true
-    upcase_fields "__user_per_struct" "PtracePer" >> ${OUT} || true
-  fi
-fi
-if test "$regs" != ""; then
-  regs=`echo $regs |
-    sed -e 's/type __*user_regs_struct struct //' -e 's/[{}]//g'`
-  regs=`echo $regs | sed -e s'/^ *//'`
-  nregs=
-  while test -n "$regs"; do
-    field=`echo $regs | sed -e 's/^\([^;]*\);.*$/\1/'`
-    regs=`echo $regs | sed -e 's/^[^;]*; *\(.*\)$/\1/'`
-    # Capitalize the first character of the field.
-    f=`echo $field | sed -e 's/^\(.\).*$/\1/'`
-    r=`echo $field | sed -e 's/^.\(.*\)$/\1/'`
-    f=`echo $f | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
-    field="$f$r"
-    field=`echo "$field" | sed \
-      -e 's/__user_psw_struct/PtracePsw/' \
-      -e 's/__user_fpregs_struct/PtraceFpregs/' \
-      -e 's/__user_per_struct/PtracePer/'`
-    nregs="$nregs $field;"
-  done
-  echo "type PtraceRegs struct {$nregs }" >> ${OUT}
-fi
-
-# Some basic types.
-echo 'type Size_t _size_t' >> ${OUT}
-echo "type Ssize_t _ssize_t" >> ${OUT}
-if grep '^const _HAVE_OFF64_T = ' gen-sysinfo.go > /dev/null 2>&1; then
-  echo "type Offset_t _off64_t" >> ${OUT}
-else
-  echo "type Offset_t _off_t" >> ${OUT}
-fi
-echo "type Mode_t _mode_t" >> ${OUT}
-echo "type Pid_t _pid_t" >> ${OUT}
-echo "type Uid_t _uid_t" >> ${OUT}
-echo "type Gid_t _gid_t" >> ${OUT}
-echo "type Socklen_t _socklen_t" >> ${OUT}
-
-# The C int type.
-sizeof_int=`grep '^const ___SIZEOF_INT__ = ' gen-sysinfo.go | sed -e 's/.*= //'`
-if test "$sizeof_int" = "4"; then
-  echo "type _C_int int32" >> ${OUT}
-  echo "type _C_uint uint32" >> ${OUT}
-elif test "$sizeof_int" = "8"; then
-  echo "type _C_int int64" >> ${OUT}
-  echo "type _C_uint uint64" >> ${OUT}
-else
-  echo 1>&2 "mksysinfo.sh: could not determine size of int (got $sizeof_int)"
-  exit 1
-fi
-
-# The C long type, needed because that is the type that ptrace returns.
-sizeof_long=`grep '^const ___SIZEOF_LONG__ = ' gen-sysinfo.go | sed -e 's/.*= //'`
-if test "$sizeof_long" = "4"; then
-  echo "type _C_long int32" >> ${OUT}
-elif test "$sizeof_long" = "8"; then
-  echo "type _C_long int64" >> ${OUT}
-else
-  echo 1>&2 "mksysinfo.sh: could not determine size of long (got $sizeof_long)"
-  exit 1
-fi
-
-# Solaris 2 needs _u?pad128_t, but its default definition in terms of long
-# double is commented by -fdump-go-spec.
-if grep "^// type _pad128_t" gen-sysinfo.go > /dev/null 2>&1; then
-  echo "type _pad128_t struct { _l [4]int32; }" >> ${OUT}
-fi
-if grep "^// type _upad128_t" gen-sysinfo.go > /dev/null 2>&1; then
-  echo "type _upad128_t struct { _l [4]uint32; }" >> ${OUT}
-fi
-
-# The time_t type.
-if grep '^type _time_t ' gen-sysinfo.go > /dev/null 2>&1; then
-  echo 'type Time_t _time_t' >> ${OUT}
-fi
-
-# The time structures need special handling: we need to name the
-# types, so that we can cast integers to the right types when
-# assigning to the structures.
-timeval=`grep '^type _timeval ' gen-sysinfo.go`
-timeval_sec=`echo $timeval | sed -n -e 's/^.*tv_sec \([^ ]*\);.*$/\1/p'`
-timeval_usec=`echo $timeval | sed -n -e 's/^.*tv_usec \([^ ]*\);.*$/\1/p'`
-echo "type Timeval_sec_t $timeval_sec" >> ${OUT}
-echo "type Timeval_usec_t $timeval_usec" >> ${OUT}
-echo $timeval | \
-  sed -e 's/type _timeval /type Timeval /' \
-      -e 's/tv_sec *[a-zA-Z0-9_]*/Sec Timeval_sec_t/' \
-      -e 's/tv_usec *[a-zA-Z0-9_]*/Usec Timeval_usec_t/' >> ${OUT}
-timespec=`grep '^type _timespec ' gen-sysinfo.go || true`
-if test "$timespec" = ""; then
-  # IRIX 6.5 has __timespec instead.
-  timespec=`grep '^type ___timespec ' gen-sysinfo.go || true`
-fi
-timespec_sec=`echo $timespec | sed -n -e 's/^.*tv_sec \([^ ]*\);.*$/\1/p'`
-timespec_nsec=`echo $timespec | sed -n -e 's/^.*tv_nsec \([^ ]*\);.*$/\1/p'`
-echo "type Timespec_sec_t $timespec_sec" >> ${OUT}
-echo "type Timespec_nsec_t $timespec_nsec" >> ${OUT}
-echo $timespec | \
-  sed -e 's/^type ___timespec /type Timespec /' \
-      -e 's/^type _timespec /type Timespec /' \
-      -e 's/tv_sec *[a-zA-Z0-9_]*/Sec Timespec_sec_t/' \
-      -e 's/tv_nsec *[a-zA-Z0-9_]*/Nsec Timespec_nsec_t/' >> ${OUT}
-
-timestruc=`grep '^type _timestruc_t ' gen-sysinfo.go || true`
-if test "$timestruc" != ""; then
-  timestruc_sec=`echo $timestruc | sed -n -e 's/^.*tv_sec \([^ ]*\);.*$/\1/p'`
-  timestruc_nsec=`echo $timestruc | sed -n -e 's/^.*tv_nsec \([^ ]*\);.*$/\1/p'`
-  echo "type Timestruc_sec_t $timestruc_sec" >> ${OUT}
-  echo "type Timestruc_nsec_t $timestruc_nsec" >> ${OUT}
-  echo $timestruc | \
-    sed -e 's/^type _timestruc_t /type Timestruc /' \
-        -e 's/tv_sec *[a-zA-Z0-9_]*/Sec Timestruc_sec_t/' \
-        -e 's/tv_nsec *[a-zA-Z0-9_]*/Nsec Timestruc_nsec_t/' >> ${OUT}
-fi
-
-# The tms struct.
-grep '^type _tms ' gen-sysinfo.go | \
-    sed -e 's/type _tms/type Tms/' \
-      -e 's/tms_utime/Utime/' \
-      -e 's/tms_stime/Stime/' \
-      -e 's/tms_cutime/Cutime/' \
-      -e 's/tms_cstime/Cstime/' \
-    >> ${OUT}
-
-# The stat type.
-# Prefer largefile variant if available.
-stat=`grep '^type _stat64 ' gen-sysinfo.go || true`
-if test "$stat" != ""; then
-  grep '^type _stat64 ' gen-sysinfo.go
-else
-  grep '^type _stat ' gen-sysinfo.go
-fi | sed -e 's/type _stat64/type Stat_t/' \
-         -e 's/type _stat/type Stat_t/' \
-         -e 's/st_dev/Dev/' \
-         -e 's/st_ino/Ino/g' \
-         -e 's/st_nlink/Nlink/' \
-         -e 's/st_mode/Mode/' \
-         -e 's/st_uid/Uid/' \
-         -e 's/st_gid/Gid/' \
-         -e 's/st_rdev/Rdev/' \
-         -e 's/st_size/Size/' \
-         -e 's/st_blksize/Blksize/' \
-         -e 's/st_blocks/Blocks/' \
-         -e 's/st_atim/Atim/' \
-         -e 's/st_mtim/Mtim/' \
-         -e 's/st_ctim/Ctim/' \
-         -e 's/\([^a-zA-Z0-9_]\)_timeval\([^a-zA-Z0-9_]\)/\1Timeval\2/g' \
-         -e 's/\([^a-zA-Z0-9_]\)_timespec_t\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \
-         -e 's/\([^a-zA-Z0-9_]\)_timespec\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \
-         -e 's/\([^a-zA-Z0-9_]\)_timestruc_t\([^a-zA-Z0-9_]\)/\1Timestruc\2/g' \
-         -e 's/Godump_[0-9] struct { \([^;]*;\) };/\1/g' \
-       >> ${OUT}
-
-# The directory searching types.
-# Prefer largefile variant if available.
-dirent=`grep '^type _dirent64 ' gen-sysinfo.go || true`
-if test "$dirent" != ""; then
-  grep '^type _dirent64 ' gen-sysinfo.go
-else
-  grep '^type _dirent ' gen-sysinfo.go
-fi | sed -e 's/type _dirent64/type Dirent/' \
-         -e 's/type _dirent/type Dirent/' \
-         -e 's/d_name \[0+1\]/d_name [0+256]/' \
-         -e 's/d_name/Name/' \
-         -e 's/]int8/]byte/' \
-         -e 's/d_ino/Ino/' \
-         -e 's/d_off/Off/' \
-         -e 's/d_reclen/Reclen/' \
-         -e 's/d_type/Type/' \
-      >> ${OUT}
-echo "type DIR _DIR" >> ${OUT}
-
-# Values for d_type field in dirent.
-grep '^const _DT_' gen-sysinfo.go |
-  sed -e 's/^\(const \)_\(DT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The rusage struct.
-rusage=`grep '^type _rusage struct' gen-sysinfo.go`
-if test "$rusage" != ""; then
-  # Remove anonymous unions from GNU/Linux <bits/resource.h>.
-  rusage=`echo $rusage | sed -e 's/Godump_[0-9][0-9]* struct {\([^}]*\)};/\1/g'`
-  rusage=`echo $rusage | sed -e 's/type _rusage struct //' -e 's/[{}]//g'`
-  rusage=`echo $rusage | sed -e 's/^ *//'`
-  nrusage=
-  while test -n "$rusage"; do
-    field=`echo $rusage | sed -e 's/^\([^;]*\);.*$/\1/'`
-    rusage=`echo $rusage | sed -e 's/^[^;]*; *\(.*\)$/\1/'`
-    # Drop the leading ru_, capitalize the next character.
-    field=`echo $field | sed -e 's/^ru_//'`
-    f=`echo $field | sed -e 's/^\(.\).*$/\1/'`
-    r=`echo $field | sed -e 's/^.\(.*\)$/\1/'`
-    f=`echo $f | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
-    # Fix _timeval _timespec, and _timestruc_t.
-    r=`echo $r | sed -e s'/ _timeval$/ Timeval/'`
-    r=`echo $r | sed -e s'/ _timespec$/ Timespec/'`
-    r=`echo $r | sed -e s'/ _timestruc_t$/ Timestruc/'`
-    field="$f$r"
-    nrusage="$nrusage $field;"
-  done
-  echo "type Rusage struct {$nrusage }" >> ${OUT}
-else
-  echo "type Rusage struct {}" >> ${OUT}
-fi
-
-# The RUSAGE constants.
-grep '^const _RUSAGE_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(RUSAGE_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The utsname struct.
-grep '^type _utsname ' gen-sysinfo.go | \
-    sed -e 's/_utsname/Utsname/' \
-      -e 's/sysname/Sysname/' \
-      -e 's/nodename/Nodename/' \
-      -e 's/release/Release/' \
-      -e 's/version/Version/' \
-      -e 's/machine/Machine/' \
-      -e 's/domainname/Domainname/' \
-    >> ${OUT}
-
-# The iovec struct.
-iovec=`grep '^type _iovec ' gen-sysinfo.go`
-iovec_len=`echo $iovec | sed -n -e 's/^.*iov_len \([^ ]*\);.*$/\1/p'`
-echo "type Iovec_len_t $iovec_len" >> ${OUT}
-echo $iovec | \
-    sed -e 's/_iovec/Iovec/' \
-      -e 's/iov_base/Base/' \
-      -e 's/iov_len *[a-zA-Z0-9_]*/Len Iovec_len_t/' \
-    >> ${OUT}
-
-# The msghdr struct.
-msghdr=`grep '^type _msghdr ' gen-sysinfo.go`
-msghdr_controllen=`echo $msghdr | sed -n -e 's/^.*msg_controllen \([^ ]*\);.*$/\1/p'`
-echo "type Msghdr_controllen_t $msghdr_controllen" >> ${OUT}
-echo $msghdr | \
-    sed -e 's/_msghdr/Msghdr/' \
-      -e 's/msg_name/Name/' \
-      -e 's/msg_namelen/Namelen/' \
-      -e 's/msg_iov/Iov/' \
-      -e 's/msg_iovlen/Iovlen/' \
-      -e 's/_iovec/Iovec/' \
-      -e 's/msg_control/Control/' \
-      -e 's/msg_controllen *[a-zA-Z0-9_]*/Controllen Msghdr_controllen_t/' \
-      -e 's/msg_flags/Flags/' \
-    >> ${OUT}
-
-# The MSG_ flags for Msghdr.
-grep '^const _MSG_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(MSG_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The cmsghdr struct.
-cmsghdr=`grep '^type _cmsghdr ' gen-sysinfo.go`
-if test -n "$cmsghdr"; then
-  cmsghdr_len=`echo $cmsghdr | sed -n -e 's/^.*cmsg_len \([^ ]*\);.*$/\1/p'`
-  echo "type Cmsghdr_len_t $cmsghdr_len" >> ${OUT}
-  echo "$cmsghdr" | \
-      sed -e 's/_cmsghdr/Cmsghdr/' \
-        -e 's/cmsg_len *[a-zA-Z0-9_]*/Len Cmsghdr_len_t/' \
-        -e 's/cmsg_level/Level/' \
-        -e 's/cmsg_type/Type/' \
-        -e 's/\[\]/[0]/' \
-      >> ${OUT}
-fi
-
-# The SCM_ flags for Cmsghdr.
-grep '^const _SCM_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(SCM_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The ucred struct.
-upcase_fields "_ucred" "Ucred" >> ${OUT} || true
-
-# The ip_mreq struct.
-grep '^type _ip_mreq ' gen-sysinfo.go | \
-    sed -e 's/_ip_mreq/IPMreq/' \
-      -e 's/imr_multiaddr/Multiaddr/' \
-      -e 's/imr_interface/Interface/' \
-      -e 's/_in_addr/[4]byte/g' \
-    >> ${OUT}
-
-# We need IPMreq to compile the net package.
-if ! grep 'type IPMreq ' ${OUT} >/dev/null 2>&1; then
-  echo 'type IPMreq struct { Multiaddr [4]byte; Interface [4]byte; }' >> ${OUT}
-fi
-
-# The ipv6_mreq struct.
-grep '^type _ipv6_mreq ' gen-sysinfo.go | \
-    sed -e 's/_ipv6_mreq/IPv6Mreq/' \
-      -e 's/ipv6mr_multiaddr/Multiaddr/' \
-      -e 's/ipv6mr_interface/Interface/' \
-      -e 's/_in6_addr/[16]byte/' \
-    >> ${OUT}
-
-# We need IPv6Mreq to compile the net package.
-if ! grep 'type IPv6Mreq ' ${OUT} >/dev/null 2>&1; then
-  echo 'type IPv6Mreq struct { Multiaddr [16]byte; Interface uint32; }' >> ${OUT}
-fi
-
-# The ip_mreqn struct.
-grep '^type _ip_mreqn ' gen-sysinfo.go | \
-    sed -e 's/_ip_mreqn/IPMreqn/' \
-      -e 's/imr_multiaddr/Multiaddr/' \
-      -e 's/imr_address/Address/' \
-      -e 's/imr_ifindex/Ifindex/' \
-      -e 's/_in_addr/[4]byte/g' \
-    >> ${OUT}
-
-# We need IPMreq to compile the net package.
-if ! grep 'type IPMreqn ' ${OUT} >/dev/null 2>&1; then
-  echo 'type IPMreqn struct { Multiaddr [4]byte; Interface [4]byte; Ifindex int32 }' >> ${OUT}
-fi
-
-# The icmp6_filter struct.
-grep '^type _icmp6_filter ' gen-sysinfo.go | \
-    sed -e 's/_icmp6_filter/ICMPv6Filter/' \
-      -e 's/data/Data/' \
-      -e 's/filt/Filt/' \
-    >> ${OUT}
-
-# We need ICMPv6Filter to compile the syscall package.
-if ! grep 'type ICMPv6Filter ' ${OUT} > /dev/null 2>&1; then
-  echo 'type ICMPv6Filter struct { Data [8]uint32 }' >> ${OUT}
-fi
-
-# Try to guess the type to use for fd_set.
-fd_set=`grep '^type _fd_set ' gen-sysinfo.go || true`
-fds_bits_type="_C_long"
-if test "$fd_set" != ""; then
-    fds_bits_type=`echo $fd_set | sed -e 's/.*[]]\([^;]*\); }$/\1/'`
-fi
-echo "type fds_bits_type $fds_bits_type" >> ${OUT}
-
-# The addrinfo struct.
-grep '^type _addrinfo ' gen-sysinfo.go | \
-    sed -e 's/_addrinfo/Addrinfo/g' \
-      -e 's/ ai_/ Ai_/g' \
-    >> ${OUT}
-
-# The addrinfo and nameinfo flags and errors.
-grep '^const _AI_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(AI_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _EAI_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(EAI_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _NI_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(NI_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The passwd struct.
-grep '^type _passwd ' gen-sysinfo.go | \
-    sed -e 's/_passwd/Passwd/' \
-      -e 's/ pw_/ Pw_/g' \
-    >> ${OUT}
-
-# The ioctl flags for the controlling TTY.
-grep '^const _TIOC' gen-sysinfo.go | \
-    grep -v '_val =' | \
-    sed -e 's/^\(const \)_\(TIOC[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _TUNSET' gen-sysinfo.go | \
-    grep -v '_val =' | \
-    sed -e 's/^\(const \)_\(TUNSET[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-# We need TIOCGWINSZ.
-if ! grep '^const TIOCGWINSZ' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TIOCGWINSZ_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TIOCGWINSZ = _TIOCGWINSZ_val' >> ${OUT}
-  fi
-fi
-if ! grep '^const TIOCSWINSZ' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TIOCSWINSZ_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TIOCSWINSZ = _TIOCSWINSZ_val' >> ${OUT}
-  fi
-fi
-if ! grep '^const TIOCNOTTY' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TIOCNOTTY_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TIOCNOTTY = _TIOCNOTTY_val' >> ${OUT}
-  fi
-fi
-if ! grep '^const TIOCSCTTY' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TIOCSCTTY_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TIOCSCTTY = _TIOCSCTTY_val' >> ${OUT}
-  fi
-fi
-if ! grep '^const TIOCGPGRP' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TIOCGPGRP_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TIOCGPGRP = _TIOCGPGRP_val' >> ${OUT}
-  fi
-fi
-if ! grep '^const TIOCSPGRP' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TIOCSPGRP_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TIOCSPGRP = _TIOCSPGRP_val' >> ${OUT}
-  fi
-fi
-if ! grep '^const TIOCGPTN' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TIOCGPTN_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TIOCGPTN = _TIOCGPTN_val' >> ${OUT}
-  fi
-fi
-if ! grep '^const TIOCSPTLCK' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TIOCSPTLCK_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TIOCSPTLCK = _TIOCSPTLCK_val' >> ${OUT}
-  fi
-fi
-if ! grep '^const TIOCGDEV' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TIOCGDEV_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TIOCGDEV = _TIOCGDEV_val' >> ${OUT}
-  fi
-fi
-if ! grep '^const TIOCSIG' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TIOCSIG_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TIOCSIG = _TIOCSIG_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNSETNOCSUM' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNSETNOCSUM_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNSETNOCSUM = _TUNSETNOCSUM_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNSETDEBUG' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNSETDEBUG_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNSETDEBUG = _TUNSETDEBUG_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNSETIFF' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNSETIFF_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNSETIFF = _TUNSETIFF_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNSETPERSIST' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNSETPERSIST_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNSETPERSIST = _TUNSETPERSIST_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNSETOWNER' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNSETOWNER_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNSETOWNER = _TUNSETOWNER_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNSETLINK' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNSETLINK_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNSETLINK = _TUNSETLINK_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNSETGROUP' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNSETGROUP_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNSETGROUP = _TUNSETGROUP_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNGETFEATURES' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNGETFEATURES_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNGETFEATURES = _TUNGETFEATURES_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNSETOFFLOAD' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNSETOFFLOAD_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNSETOFFLOAD = _TUNSETOFFLOAD_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNSETTXFILTER' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNSETTXFILTER_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNSETTXFILTER = _TUNSETTXFILTER_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNGETIFF' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNGETIFF_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNGETIFF = _TUNGETIFF_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNGETSNDBUF' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNGETSNDBUF_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNGETSNDBUF = _TUNGETSNDBUF_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNSETSNDBUF' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNSETSNDBUF_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNSETSNDBUF = _TUNSETSNDBUF_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNATTACHFILTER' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNATTACHFILTER_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNATTACHFILTER = _TUNATTACHFILTER_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNDETACHFILTER' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNDETACHFILTER_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNDETACHFILTER = _TUNDETACHFILTER_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNGETVNETHDRSZ' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNGETVNETHDRSZ_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNGETVNETHDRSZ = _TUNGETVNETHDRSZ_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNSETVNETHDRSZ' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNSETVNETHDRSZ_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNSETVNETHDRSZ = _TUNSETVNETHDRSZ_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNSETQUEUE' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNSETQUEUE_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNSETQUEUE = _TUNSETQUEUE_val' >> ${OUT}
-  fi
-fi
-
-
-if ! grep '^const TUNSETIFINDEX' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNSETIFINDEX_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNSETIFINDEX = _TUNSETIFINDEX_val' >> ${OUT}
-  fi
-fi
-
-if ! grep '^const TUNGETFILTER' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TUNGETFILTER_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TUNGETFILTER = _TUNGETFILTER_val' >> ${OUT}
-  fi
-fi
-
-
-
-# The ioctl flags for terminal control
-grep '^const _TC[GS]ET' gen-sysinfo.go | grep -v _val | \
-    sed -e 's/^\(const \)_\(TC[GS]ET[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-if ! grep '^const TCGETS' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TCGETS_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TCGETS = _TCGETS_val' >> ${OUT}
-  fi
-fi
-if ! grep '^const TCSETS' ${OUT} >/dev/null 2>&1; then
-  if grep '^const _TCSETS_val' ${OUT} >/dev/null 2>&1; then
-    echo 'const TCSETS = _TCSETS_val' >> ${OUT}
-  fi
-fi
-
-# ioctl constants.  Might fall back to 0 if TIOCNXCL is missing, too, but
-# needs handling in syscalls.exec.go.
-if ! grep '^const _TIOCSCTTY ' gen-sysinfo.go >/dev/null 2>&1; then
-  if grep '^const _TIOCNXCL ' gen-sysinfo.go >/dev/null 2>&1; then
-    echo "const TIOCSCTTY = TIOCNXCL" >> ${OUT}
-  fi
-fi
-
-# The nlmsghdr struct.
-grep '^type _nlmsghdr ' gen-sysinfo.go | \
-    sed -e 's/_nlmsghdr/NlMsghdr/' \
-      -e 's/nlmsg_len/Len/' \
-      -e 's/nlmsg_type/Type/' \
-      -e 's/nlmsg_flags/Flags/' \
-      -e 's/nlmsg_seq/Seq/' \
-      -e 's/nlmsg_pid/Pid/' \
-    >> ${OUT}
-
-# The nlmsg flags and operators.
-grep '^const _NLM' gen-sysinfo.go | \
-    sed -e 's/^\(const \)_\(NLM[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# NLMSG_HDRLEN is defined as an expression using sizeof.
-if ! grep '^const NLMSG_HDRLEN' ${OUT} > /dev/null 2>&1; then
-  if grep '^const _sizeof_nlmsghdr ' ${OUT} > /dev/null 2>&1; then
-    echo 'const NLMSG_HDRLEN = (_sizeof_nlmsghdr + (NLMSG_ALIGNTO-1)) &^ (NLMSG_ALIGNTO-1)' >> ${OUT}
-  fi
-fi
-
-# The rtmsg struct.
-grep '^type _rtmsg ' gen-sysinfo.go | \
-    sed -e 's/_rtmsg/RtMsg/' \
-      -e 's/rtm_family/Family/' \
-      -e 's/rtm_dst_len/Dst_len/' \
-      -e 's/rtm_src_len/Src_len/' \
-      -e 's/rtm_tos/Tos/' \
-      -e 's/rtm_table/Table/' \
-      -e 's/rtm_protocol/Protocol/' \
-      -e 's/rtm_scope/Scope/' \
-      -e 's/rtm_type/Type/' \
-      -e 's/rtm_flags/Flags/' \
-    >> ${OUT}
-
-# The rtgenmsg struct.
-grep '^type _rtgenmsg ' gen-sysinfo.go | \
-    sed -e 's/_rtgenmsg/RtGenmsg/' \
-      -e 's/rtgen_family/Family/' \
-    >> ${OUT}
-
-# The routing message flags.
-grep '^const _RT_' gen-sysinfo.go | \
-    sed -e 's/^\(const \)_\(RT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _RTA' gen-sysinfo.go | \
-    sed -e 's/^\(const \)_\(RTA[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _RTF' gen-sysinfo.go | \
-    sed -e 's/^\(const \)_\(RTF[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _RTCF' gen-sysinfo.go | \
-    sed -e 's/^\(const \)_\(RTCF[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _RTM' gen-sysinfo.go | \
-    sed -e 's/^\(const \)_\(RTM[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _RTN' gen-sysinfo.go | \
-    sed -e 's/^\(const \)_\(RTN[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _RTPROT' gen-sysinfo.go | \
-    sed -e 's/^\(const \)_\(RTPROT[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The ifinfomsg struct.
-grep '^type _ifinfomsg ' gen-sysinfo.go | \
-    sed -e 's/_ifinfomsg/IfInfomsg/' \
-      -e 's/ifi_family/Family/' \
-      -e 's/ifi_type/Type/' \
-      -e 's/ifi_index/Index/' \
-      -e 's/ifi_flags/Flags/' \
-      -e 's/ifi_change/Change/' \
-    >> ${OUT}
-
-# The interface information types and flags.
-grep '^const _IFA' gen-sysinfo.go | \
-    sed -e 's/^\(const \)_\(IFA[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _IFLA' gen-sysinfo.go | \
-    sed -e 's/^\(const \)_\(IFLA[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _IFF' gen-sysinfo.go | \
-    sed -e 's/^\(const \)_\(IFF[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _IFNAMSIZ' gen-sysinfo.go | \
-    sed -e 's/^\(const \)_\(IFNAMSIZ[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _SIOC' gen-sysinfo.go |
-    sed -e 's/^\(const \)_\(SIOC[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The ifaddrmsg struct.
-grep '^type _ifaddrmsg ' gen-sysinfo.go | \
-    sed -e 's/_ifaddrmsg/IfAddrmsg/' \
-      -e 's/ifa_family/Family/' \
-      -e 's/ifa_prefixlen/Prefixlen/' \
-      -e 's/ifa_flags/Flags/' \
-      -e 's/ifa_scope/Scope/' \
-      -e 's/ifa_index/Index/' \
-    >> ${OUT}
-
-# The rtattr struct.
-grep '^type _rtattr ' gen-sysinfo.go | \
-    sed -e 's/_rtattr/RtAttr/' \
-      -e 's/rta_len/Len/' \
-      -e 's/rta_type/Type/' \
-    >> ${OUT}
-
-# The in_pktinfo struct.
-grep '^type _in_pktinfo ' gen-sysinfo.go | \
-    sed -e 's/_in_pktinfo/Inet4Pktinfo/' \
-      -e 's/ipi_ifindex/Ifindex/' \
-      -e 's/ipi_spec_dst/Spec_dst/' \
-      -e 's/ipi_addr/Addr/' \
-      -e 's/_in_addr/[4]byte/g' \
-    >> ${OUT}
-
-# The in6_pktinfo struct.
-grep '^type _in6_pktinfo ' gen-sysinfo.go | \
-    sed -e 's/_in6_pktinfo/Inet6Pktinfo/' \
-      -e 's/ipi6_addr/Addr/' \
-      -e 's/ipi6_ifindex/Ifindex/' \
-      -e 's/_in6_addr/[16]byte/' \
-    >> ${OUT}
-
-# The termios struct.
-grep '^type _termios ' gen-sysinfo.go | \
-    sed -e 's/_termios/Termios/' \
-      -e 's/c_iflag/Iflag/' \
-      -e 's/c_oflag/Oflag/' \
-      -e 's/c_cflag/Cflag/' \
-      -e 's/c_lflag/Lflag/' \
-      -e 's/c_line/Line/' \
-      -e 's/c_cc/Cc/' \
-      -e 's/c_ispeed/Ispeed/' \
-      -e 's/c_ospeed/Ospeed/' \
-    >> ${OUT}
-
-# The termios constants.
-for n in IGNBRK BRKINT IGNPAR PARMRK INPCK ISTRIP INLCR IGNCR ICRNL IUCLC \
-    IXON IXANY IXOFF IMAXBEL IUTF8 OPOST OLCUC ONLCR OCRNL ONOCR ONLRET \
-    OFILL OFDEL NLDLY NL0 NL1 CRDLY CR0 CR1 CR2 CR3 CS5 CS6 CS7 CS8 TABDLY \
-    BSDLY VTDLY FFDLY CBAUD CBAUDEX CSIZE CSTOPB CREAD PARENB PARODD HUPCL \
-    CLOCAL LOBLK CIBAUD CMSPAR CRTSCTS ISIG ICANON XCASE ECHO ECHOE ECHOK \
-    ECHONL ECHOCTL ECHOPRT ECHOKE DEFECHO FLUSHO NOFLSH TOSTOP PENDIN IEXTEN \
-    VINTR VQUIT VERASE VKILL VEOF VMIN VEOL VTIME VEOL2 VSWTCH VSTART VSTOP \
-    VSUSP VDSUSP VLNEXT VWERASE VREPRINT VDISCARD VSTATUS TCSANOW TCSADRAIN \
-    TCSAFLUSH TCIFLUSH TCOFLUSH TCIOFLUSH TCOOFF TCOON TCIOFF TCION B0 B50 \
-    B75 B110 B134 B150 B200 B300 B600 B1200 B1800 B2400 B4800 B9600 B19200 \
-    B38400 B57600 B115200 B230400 B460800 B500000 B576000 B921600 B1000000 \
-    B1152000 B1500000 B2000000 B2500000 B3000000 B3500000 B4000000; do
-
-    grep "^const _$n " gen-sysinfo.go | \
-	sed -e 's/^\(const \)_\([^=]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-done
-
-# The mount flags
-grep '^const _MNT_' gen-sysinfo.go |
-    sed -e 's/^\(const \)_\(MNT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _MS_' gen-sysinfo.go |
-    sed -e 's/^\(const \)_\(MS_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The fallocate flags.
-grep '^const _FALLOC_' gen-sysinfo.go |
-    sed -e 's/^\(const \)_\(FALLOC_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The statfs struct.
-# Prefer largefile variant if available.
-statfs=`grep '^type _statfs64 ' gen-sysinfo.go || true`
-if test "$statfs" != ""; then
-  grep '^type _statfs64 ' gen-sysinfo.go
-else
-  grep '^type _statfs ' gen-sysinfo.go
-fi | sed -e 's/type _statfs64/type Statfs_t/' \
-	 -e 's/type _statfs/type Statfs_t/' \
-	 -e 's/f_type/Type/' \
-	 -e 's/f_bsize/Bsize/' \
-	 -e 's/f_blocks/Blocks/' \
-	 -e 's/f_bfree/Bfree/' \
-	 -e 's/f_bavail/Bavail/' \
-	 -e 's/f_files/Files/' \
-	 -e 's/f_ffree/Ffree/' \
-	 -e 's/f_fsid/Fsid/' \
-	 -e 's/f_namelen/Namelen/' \
-	 -e 's/f_frsize/Frsize/' \
-	 -e 's/f_flags/Flags/' \
-	 -e 's/f_spare/Spare/' \
-    >> ${OUT}
-
-# The timex struct.
-timex=`grep '^type _timex ' gen-sysinfo.go || true`
-if test "$timex" = ""; then
-  timex=`grep '^// type _timex ' gen-sysinfo.go || true`
-  if test "$timex" != ""; then
-    timex=`echo $timex | sed -e 's|// ||' -e 's/INVALID-bit-field/int32/g'`
-  fi
-fi
-if test "$timex" != ""; then
-  echo "$timex" | \
-    sed -e 's/_timex/Timex/' \
-      -e 's/modes/Modes/' \
-      -e 's/offset/Offset/' \
-      -e 's/freq/Freq/' \
-      -e 's/maxerror/Maxerror/' \
-      -e 's/esterror/Esterror/' \
-      -e 's/status/Status/' \
-      -e 's/constant/Constant/' \
-      -e 's/precision/Precision/' \
-      -e 's/tolerance/Tolerance/' \
-      -e 's/ time / Time /' \
-      -e 's/tick/Tick/' \
-      -e 's/ppsfreq/Ppsfreq/' \
-      -e 's/jitter/Jitter/' \
-      -e 's/shift/Shift/' \
-      -e 's/stabil/Stabil/' \
-      -e 's/jitcnt/Jitcnt/' \
-      -e 's/calcnt/Calcnt/' \
-      -e 's/errcnt/Errcnt/' \
-      -e 's/stbcnt/Stbcnt/' \
-      -e 's/tai/Tai/' \
-      -e 's/_timeval/Timeval/' \
-    >> ${OUT}
-fi
-
-# The rlimit struct.
-grep '^type _rlimit ' gen-sysinfo.go | \
-    sed -e 's/_rlimit/Rlimit/' \
-      -e 's/rlim_cur/Cur/' \
-      -e 's/rlim_max/Max/' \
-    >> ${OUT}
-
-# The RLIMIT constants.
-grep '^const _RLIMIT_' gen-sysinfo.go |
-    sed -e 's/^\(const \)_\(RLIMIT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _RLIM_' gen-sysinfo.go |
-    sed -e 's/^\(const \)_\(RLIM_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The sysinfo struct.
-grep '^type _sysinfo ' gen-sysinfo.go | \
-    sed -e 's/_sysinfo/Sysinfo_t/' \
-      -e 's/uptime/Uptime/' \
-      -e 's/loads/Loads/' \
-      -e 's/totalram/Totalram/' \
-      -e 's/freeram/Freeram/' \
-      -e 's/sharedram/Sharedram/' \
-      -e 's/bufferram/Bufferram/' \
-      -e 's/totalswap/Totalswap/' \
-      -e 's/freeswap/Freeswap/' \
-      -e 's/procs/Procs/' \
-      -e 's/totalhigh/Totalhigh/' \
-      -e 's/freehigh/Freehigh/' \
-      -e 's/mem_unit/Unit/' \
-    >> ${OUT}
-
-# The ustat struct.
-grep '^type _ustat ' gen-sysinfo.go | \
-    sed -e 's/_ustat/Ustat_t/' \
-      -e 's/f_tfree/Tfree/' \
-      -e 's/f_tinode/Tinoe/' \
-      -e 's/f_fname/Fname/' \
-      -e 's/f_fpack/Fpack/' \
-    >> ${OUT}
-# Force it to be defined, as on some older GNU/Linux systems the
-# header file fails when using with <linux/filter.h>.
-if ! grep 'type _ustat ' gen-sysinfo.go >/dev/null 2>&1; then
-  echo 'type Ustat_t struct { Tfree int32; Tinoe uint64; Fname [5+1]int8; Fpack [5+1]int8; }' >> ${OUT}
-fi
-
-# The utimbuf struct.
-grep '^type _utimbuf ' gen-sysinfo.go | \
-    sed -e 's/_utimbuf/Utimbuf/' \
-      -e 's/actime/Actime/' \
-      -e 's/modtime/Modtime/' \
-    >> ${OUT}
-
-# The LOCK flags for flock.
-grep '^const _LOCK_' gen-sysinfo.go |
-    sed -e 's/^\(const \)_\(LOCK_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The PRIO constants.
-grep '^const _PRIO_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(PRIO_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The GNU/Linux LINUX_REBOOT flags.
-grep '^const _LINUX_REBOOT_' gen-sysinfo.go |
-    sed -e 's/^\(const \)_\(LINUX_REBOOT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The GNU/Linux sock_filter struct.
-grep '^type _sock_filter ' gen-sysinfo.go | \
-    sed -e 's/_sock_filter/SockFilter/' \
-      -e 's/code/Code/' \
-      -e 's/jt/Jt/' \
-      -e 's/jf/Jf/' \
-      -e 's/k /K /' \
-    >> ${OUT}
-
-# The GNU/Linux sock_fprog struct.
-grep '^type _sock_fprog ' gen-sysinfo.go | \
-    sed -e 's/_sock_fprog/SockFprog/' \
-      -e 's/len/Len/' \
-      -e 's/filter/Filter/' \
-      -e 's/_sock_filter/SockFilter/' \
-    >> ${OUT}
-
-# The GNU/Linux filter flags.
-grep '^const _BPF_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(BPF_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The GNU/Linux nlattr struct.
-grep '^type _nlattr ' gen-sysinfo.go | \
-    sed -e 's/_nlattr/NlAttr/' \
-      -e 's/nla_len/Len/' \
-      -e 's/nla_type/Type/' \
-    >> ${OUT}
-
-# The GNU/Linux nlmsgerr struct.
-grep '^type _nlmsgerr ' gen-sysinfo.go | \
-    sed -e 's/_nlmsgerr/NlMsgerr/' \
-      -e 's/error/Error/' \
-      -e 's/msg/Msg/' \
-      -e 's/_nlmsghdr/NlMsghdr/' \
-    >> ${OUT}
-
-# The GNU/Linux rtnexthop struct.
-grep '^type _rtnexthop ' gen-sysinfo.go | \
-    sed -e 's/_rtnexthop/RtNexthop/' \
-      -e 's/rtnh_len/Len/' \
-      -e 's/rtnh_flags/Flags/' \
-      -e 's/rtnh_hops/Hops/' \
-      -e 's/rtnh_ifindex/Ifindex/' \
-    >> ${OUT}
-
-# The GNU/Linux netlink flags.
-grep '^const _NETLINK_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(NETLINK_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-grep '^const _NLA_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(NLA_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The GNU/Linux packet socket flags.
-grep '^const _PACKET_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(PACKET_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-
-# The GNU/Linux inotify_event struct.
-grep '^type _inotify_event ' gen-sysinfo.go | \
-    sed -e 's/_inotify_event/InotifyEvent/' \
-      -e 's/wd/Wd/' \
-      -e 's/mask/Mask/' \
-      -e 's/cookie/Cookie/' \
-      -e 's/len/Len/' \
-      -e 's/name/Name/' \
-      -e 's/\[\]/[0]/' \
-      -e 's/\[0\]byte/[0]int8/' \
-    >> ${OUT}
-
-# The GNU/Linux CLONE flags.
-grep '^const _CLONE_' gen-sysinfo.go | \
-  sed -e 's/^\(const \)_\(CLONE_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
-# We need some CLONE constants that are not defined in older versions
-# of glibc.
-if ! grep '^const CLONE_NEWUSER ' ${OUT} > /dev/null 2>&1; then
-  echo "const CLONE_NEWUSER = 0x10000000" >> ${OUT}
-fi
-
-# Struct sizes.
-set cmsghdr Cmsghdr ip_mreq IPMreq ip_mreqn IPMreqn ipv6_mreq IPv6Mreq \
-    ifaddrmsg IfAddrmsg ifinfomsg IfInfomsg in_pktinfo Inet4Pktinfo \
-    in6_pktinfo Inet6Pktinfo inotify_event InotifyEvent linger Linger \
-    msghdr Msghdr nlattr NlAttr nlmsgerr NlMsgerr nlmsghdr NlMsghdr \
-    rtattr RtAttr rtgenmsg RtGenmsg rtmsg RtMsg rtnexthop RtNexthop \
-    sock_filter SockFilter sock_fprog SockFprog ucred Ucred \
-    icmp6_filter ICMPv6Filter
-while test $# != 0; do
-    nc=$1
-    ngo=$2
-    shift
-    shift
-    if grep "^const _sizeof_$nc =" gen-sysinfo.go >/dev/null 2>&1; then
-	echo "const Sizeof$ngo = _sizeof_$nc" >> ${OUT}
-    fi
-done
-
-# In order to compile the net package, we need some sizes to exist
-# even if the types do not.
-if ! grep 'const SizeofIPMreq ' ${OUT} >/dev/null 2>&1; then
-    echo 'const SizeofIPMreq = 8' >> ${OUT}
-fi
-if ! grep 'const SizeofIPv6Mreq ' ${OUT} >/dev/null 2>&1; then
-    echo 'const SizeofIPv6Mreq = 20' >> ${OUT}
-fi
-if ! grep 'const SizeofIPMreqn ' ${OUT} >/dev/null 2>&1; then
-    echo 'const SizeofIPMreqn = 12' >> ${OUT}
-fi
-if ! grep 'const SizeofICMPv6Filter ' ${OUT} >/dev/null 2>&1; then
-    echo 'const SizeofICMPv6Filter = 32' >> ${OUT}
-fi
-
-# The Solaris 11 Update 1 _zone_net_addr_t struct.
-grep '^type _zone_net_addr_t ' gen-sysinfo.go | \
-    sed -e 's/_in6_addr/[16]byte/' \
-    >> ${OUT}
-
-# The Solaris 12 _flow_arp_desc_t struct.
-grep '^type _flow_arp_desc_t ' gen-sysinfo.go | \
-    sed -e 's/_in6_addr_t/[16]byte/g' \
-    >> ${OUT}
-
-# The Solaris 12 _flow_l3_desc_t struct.
-grep '^type _flow_l3_desc_t ' gen-sysinfo.go | \
-    sed -e 's/_in6_addr_t/[16]byte/g' \
-    >> ${OUT}
-
-# The Solaris 12 _mac_ipaddr_t struct.
-grep '^type _mac_ipaddr_t ' gen-sysinfo.go | \
-    sed -e 's/_in6_addr_t/[16]byte/g' \
-    >> ${OUT}
-
-# The Solaris 12 _mactun_info_t struct.
-grep '^type _mactun_info_t ' gen-sysinfo.go | \
-    sed -e 's/_in6_addr_t/[16]byte/g' \
-    >> ${OUT}
-
-exit $?
diff --git a/third_party/gofrontend/libgo/mvifdiff.sh b/third_party/gofrontend/libgo/mvifdiff.sh
deleted file mode 100755
index 6706e40..0000000
--- a/third_party/gofrontend/libgo/mvifdiff.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-
-# Copyright 2014 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# The mvifdiff.sh script works like the mv(1) command, except
-# that it does not touch the destination file if its contents
-# are the same as the source file.
-
-if cmp -s "$1" "$2" ; then
-  rm "$1"
-else
-  mv "$1" "$2"
-fi
diff --git a/third_party/gofrontend/libgo/runtime/arch.h b/third_party/gofrontend/libgo/runtime/arch.h
deleted file mode 100644
index 0546a5d..0000000
--- a/third_party/gofrontend/libgo/runtime/arch.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// FIXME: Ideally CacheLineSize would be dependent on the host architecture.
-enum {
-	CacheLineSize = 64
-};
diff --git a/third_party/gofrontend/libgo/runtime/array.h b/third_party/gofrontend/libgo/runtime/array.h
deleted file mode 100644
index 14a9bb4..0000000
--- a/third_party/gofrontend/libgo/runtime/array.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* array.h -- the open array type for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#ifndef LIBGO_ARRAY_H
-#define LIBGO_ARRAY_H
-
-/* An open array is an instance of this structure.  */
-
-struct __go_open_array
-{
-  /* The elements of the array.  In use in the compiler this is a
-     pointer to the element type.  */
-  void* __values;
-  /* The number of elements in the array.  Note that this is "int",
-     not "size_t".  The language definition says that "int" is large
-     enough to hold the size of any allocated object.  Using "int"
-     saves 8 bytes per slice header on a 64-bit system with 32-bit
-     ints.  */
-  intgo __count;
-  /* The capacity of the array--the number of elements that can fit in
-     the __VALUES field.  */
-  intgo __capacity;
-};
-
-#endif /* !defined(LIBGO_ARRAY_H) */
diff --git a/third_party/gofrontend/libgo/runtime/chan.goc b/third_party/gofrontend/libgo/runtime/chan.goc
deleted file mode 100644
index 378f57f..0000000
--- a/third_party/gofrontend/libgo/runtime/chan.goc
+++ /dev/null
@@ -1,1136 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime
-#include "runtime.h"
-#include "arch.h"
-#include "go-type.h"
-#include "malloc.h"
-#include "chan.h"
-
-uint32 runtime_Hchansize = sizeof(Hchan);
-
-static	void	dequeueg(WaitQ*);
-static	SudoG*	dequeue(WaitQ*);
-static	void	enqueue(WaitQ*, SudoG*);
-
-static Hchan*
-makechan(ChanType *t, int64 hint)
-{
-	Hchan *c;
-	uintptr n;
-	const Type *elem;
-
-	elem = t->__element_type;
-
-	// compiler checks this but be safe.
-	if(elem->__size >= (1<<16))
-		runtime_throw("makechan: invalid channel element type");
-
-	if(hint < 0 || (intgo)hint != hint || (elem->__size > 0 && (uintptr)hint > (MaxMem - sizeof(*c)) / elem->__size))
-		runtime_panicstring("makechan: size out of range");
-
-	n = sizeof(*c);
-	n = ROUND(n, elem->__align);
-
-	// allocate memory in one call
-	c = (Hchan*)runtime_mallocgc(sizeof(*c) + hint*elem->__size, (uintptr)t | TypeInfo_Chan, 0);
-	c->elemsize = elem->__size;
-	c->elemtype = elem;
-	c->dataqsiz = hint;
-
-	if(debug)
-		runtime_printf("makechan: chan=%p; elemsize=%D; dataqsiz=%D\n",
-			c, (int64)elem->__size, (int64)c->dataqsiz);
-
-	return c;
-}
-
-func reflect.makechan(t *ChanType, size uint64) (c *Hchan) {
-	c = makechan(t, size);
-}
-
-Hchan*
-__go_new_channel(ChanType *t, uintptr hint)
-{
-	return makechan(t, hint);
-}
-
-Hchan*
-__go_new_channel_big(ChanType *t, uint64 hint)
-{
-	return makechan(t, hint);
-}
-
-/*
- * generic single channel send/recv
- * if the bool pointer is nil,
- * then the full exchange will
- * occur. if pres is not nil,
- * then the protocol will not
- * sleep but return if it could
- * not complete.
- *
- * sleep can wake up with g->param == nil
- * when a channel involved in the sleep has
- * been closed.  it is easiest to loop and re-run
- * the operation; we'll see that it's now closed.
- */
-static bool
-chansend(ChanType *t, Hchan *c, byte *ep, bool block, void *pc)
-{
-	USED(pc);
-	SudoG *sg;
-	SudoG mysg;
-	G* gp;
-	int64 t0;
-	G* g;
-
-	g = runtime_g();
-
-	if(c == nil) {
-		USED(t);
-		if(!block)
-			return false;
-		runtime_park(nil, nil, "chan send (nil chan)");
-		return false;  // not reached
-	}
-
-	if(runtime_gcwaiting())
-		runtime_gosched();
-
-	if(debug) {
-		runtime_printf("chansend: chan=%p\n", c);
-	}
-
-	t0 = 0;
-	mysg.releasetime = 0;
-	if(runtime_blockprofilerate > 0) {
-		t0 = runtime_cputicks();
-		mysg.releasetime = -1;
-	}
-
-	runtime_lock(&c->lock);
-	if(c->closed)
-		goto closed;
-
-	if(c->dataqsiz > 0)
-		goto asynch;
-
-	sg = dequeue(&c->recvq);
-	if(sg != nil) {
-		runtime_unlock(&c->lock);
-
-		gp = sg->g;
-		gp->param = sg;
-		if(sg->elem != nil)
-			runtime_memmove(sg->elem, ep, c->elemsize);
-		if(sg->releasetime)
-			sg->releasetime = runtime_cputicks();
-		runtime_ready(gp);
-		return true;
-	}
-
-	if(!block) {
-		runtime_unlock(&c->lock);
-		return false;
-	}
-
-	mysg.elem = ep;
-	mysg.g = g;
-	mysg.selectdone = nil;
-	g->param = nil;
-	enqueue(&c->sendq, &mysg);
-	runtime_parkunlock(&c->lock, "chan send");
-
-	if(g->param == nil) {
-		runtime_lock(&c->lock);
-		if(!c->closed)
-			runtime_throw("chansend: spurious wakeup");
-		goto closed;
-	}
-
-	if(mysg.releasetime > 0)
-		runtime_blockevent(mysg.releasetime - t0, 2);
-
-	return true;
-
-asynch:
-	if(c->closed)
-		goto closed;
-
-	if(c->qcount >= c->dataqsiz) {
-		if(!block) {
-			runtime_unlock(&c->lock);
-			return false;
-		}
-		mysg.g = g;
-		mysg.elem = nil;
-		mysg.selectdone = nil;
-		enqueue(&c->sendq, &mysg);
-		runtime_parkunlock(&c->lock, "chan send");
-
-		runtime_lock(&c->lock);
-		goto asynch;
-	}
-
-	runtime_memmove(chanbuf(c, c->sendx), ep, c->elemsize);
-	if(++c->sendx == c->dataqsiz)
-		c->sendx = 0;
-	c->qcount++;
-
-	sg = dequeue(&c->recvq);
-	if(sg != nil) {
-		gp = sg->g;
-		runtime_unlock(&c->lock);
-		if(sg->releasetime)
-			sg->releasetime = runtime_cputicks();
-		runtime_ready(gp);
-	} else
-		runtime_unlock(&c->lock);
-	if(mysg.releasetime > 0)
-		runtime_blockevent(mysg.releasetime - t0, 2);
-	return true;
-
-closed:
-	runtime_unlock(&c->lock);
-	runtime_panicstring("send on closed channel");
-	return false;  // not reached
-}
-
-
-static bool
-chanrecv(ChanType *t, Hchan* c, byte *ep, bool block, bool *received)
-{
-	SudoG *sg;
-	SudoG mysg;
-	G *gp;
-	int64 t0;
-	G *g;
-
-	if(runtime_gcwaiting())
-		runtime_gosched();
-
-	if(debug)
-		runtime_printf("chanrecv: chan=%p\n", c);
-
-	g = runtime_g();
-
-	if(c == nil) {
-		USED(t);
-		if(!block)
-			return false;
-		runtime_park(nil, nil, "chan receive (nil chan)");
-		return false;  // not reached
-	}
-
-	t0 = 0;
-	mysg.releasetime = 0;
-	if(runtime_blockprofilerate > 0) {
-		t0 = runtime_cputicks();
-		mysg.releasetime = -1;
-	}
-
-	runtime_lock(&c->lock);
-	if(c->dataqsiz > 0)
-		goto asynch;
-
-	if(c->closed)
-		goto closed;
-
-	sg = dequeue(&c->sendq);
-	if(sg != nil) {
-		runtime_unlock(&c->lock);
-
-		if(ep != nil)
-			runtime_memmove(ep, sg->elem, c->elemsize);
-		gp = sg->g;
-		gp->param = sg;
-		if(sg->releasetime)
-			sg->releasetime = runtime_cputicks();
-		runtime_ready(gp);
-
-		if(received != nil)
-			*received = true;
-		return true;
-	}
-
-	if(!block) {
-		runtime_unlock(&c->lock);
-		return false;
-	}
-
-	mysg.elem = ep;
-	mysg.g = g;
-	mysg.selectdone = nil;
-	g->param = nil;
-	enqueue(&c->recvq, &mysg);
-	runtime_parkunlock(&c->lock, "chan receive");
-
-	if(g->param == nil) {
-		runtime_lock(&c->lock);
-		if(!c->closed)
-			runtime_throw("chanrecv: spurious wakeup");
-		goto closed;
-	}
-
-	if(received != nil)
-		*received = true;
-	if(mysg.releasetime > 0)
-		runtime_blockevent(mysg.releasetime - t0, 2);
-	return true;
-
-asynch:
-	if(c->qcount <= 0) {
-		if(c->closed)
-			goto closed;
-
-		if(!block) {
-			runtime_unlock(&c->lock);
-			if(received != nil)
-				*received = false;
-			return false;
-		}
-		mysg.g = g;
-		mysg.elem = nil;
-		mysg.selectdone = nil;
-		enqueue(&c->recvq, &mysg);
-		runtime_parkunlock(&c->lock, "chan receive");
-
-		runtime_lock(&c->lock);
-		goto asynch;
-	}
-
-	if(ep != nil)
-		runtime_memmove(ep, chanbuf(c, c->recvx), c->elemsize);
-	runtime_memclr(chanbuf(c, c->recvx), c->elemsize);
-	if(++c->recvx == c->dataqsiz)
-		c->recvx = 0;
-	c->qcount--;
-
-	sg = dequeue(&c->sendq);
-	if(sg != nil) {
-		gp = sg->g;
-		runtime_unlock(&c->lock);
-		if(sg->releasetime)
-			sg->releasetime = runtime_cputicks();
-		runtime_ready(gp);
-	} else
-		runtime_unlock(&c->lock);
-
-	if(received != nil)
-		*received = true;
-	if(mysg.releasetime > 0)
-		runtime_blockevent(mysg.releasetime - t0, 2);
-	return true;
-
-closed:
-	if(ep != nil)
-		runtime_memclr(ep, c->elemsize);
-	if(received != nil)
-		*received = false;
-	runtime_unlock(&c->lock);
-	if(mysg.releasetime > 0)
-		runtime_blockevent(mysg.releasetime - t0, 2);
-	return true;
-}
-
-// The compiler generates a call to __go_send_small to send a value 8
-// bytes or smaller.
-void
-__go_send_small(ChanType *t, Hchan* c, uint64 val)
-{
-	union
-	{
-		byte b[sizeof(uint64)];
-		uint64 v;
-	} u;
-	byte *v;
-
-	u.v = val;
-#ifndef WORDS_BIGENDIAN
-	v = u.b;
-#else
-	v = u.b + sizeof(uint64) - t->__element_type->__size;
-#endif
-	chansend(t, c, v, true, runtime_getcallerpc(&t));
-}
-
-// The compiler generates a call to __go_send_big to send a value
-// larger than 8 bytes or smaller.
-void
-__go_send_big(ChanType *t, Hchan* c, byte* v)
-{
-	chansend(t, c, v, true, runtime_getcallerpc(&t));
-}
-
-// The compiler generates a call to __go_receive to receive a
-// value from a channel.
-void
-__go_receive(ChanType *t, Hchan* c, byte* v)
-{
-	chanrecv(t, c, v, true, nil);
-}
-
-_Bool runtime_chanrecv2(ChanType *t, Hchan* c, byte* v)
-  __asm__ (GOSYM_PREFIX "runtime.chanrecv2");
-
-_Bool
-runtime_chanrecv2(ChanType *t, Hchan* c, byte* v)
-{
-	bool received = false;
-
-	chanrecv(t, c, v, true, &received);
-	return received;
-}
-
-// compiler implements
-//
-//	select {
-//	case c <- v:
-//		... foo
-//	default:
-//		... bar
-//	}
-//
-// as
-//
-//	if selectnbsend(c, v) {
-//		... foo
-//	} else {
-//		... bar
-//	}
-//
-func selectnbsend(t *ChanType, c *Hchan, elem *byte) (selected bool) {
-	selected = chansend(t, c, elem, false, runtime_getcallerpc(&t));
-}
-
-// compiler implements
-//
-//	select {
-//	case v = <-c:
-//		... foo
-//	default:
-//		... bar
-//	}
-//
-// as
-//
-//	if selectnbrecv(&v, c) {
-//		... foo
-//	} else {
-//		... bar
-//	}
-//
-func selectnbrecv(t *ChanType, elem *byte, c *Hchan) (selected bool) {
-	selected = chanrecv(t, c, elem, false, nil);
-}
-
-// compiler implements
-//
-//	select {
-//	case v, ok = <-c:
-//		... foo
-//	default:
-//		... bar
-//	}
-//
-// as
-//
-//	if c != nil && selectnbrecv2(&v, &ok, c) {
-//		... foo
-//	} else {
-//		... bar
-//	}
-//
-func selectnbrecv2(t *ChanType, elem *byte, received *bool, c *Hchan) (selected bool) {
-	bool r;
-
-	selected = chanrecv(t, c, elem, false, received == nil ? nil : &r);
-	if(received != nil)
-		*received = r;
-}
-
-func reflect.chansend(t *ChanType, c *Hchan, elem *byte, nb bool) (selected bool) {
-	selected = chansend(t, c, elem, !nb, runtime_getcallerpc(&t));
-}
-
-func reflect.chanrecv(t *ChanType, c *Hchan, nb bool, elem *byte) (selected bool, received bool) {
-	received = false;
-	selected = chanrecv(t, c, elem, !nb, &received);
-}
-
-static Select* newselect(int32);
-
-func newselect(size int32) (sel *byte) {
- 	sel = (byte*)newselect(size);
-}
-
-static Select*
-newselect(int32 size)
-{
-	int32 n;
-	Select *sel;
-
-	n = 0;
-	if(size > 1)
-		n = size-1;
-
-	// allocate all the memory we need in a single allocation
-	// start with Select with size cases
-	// then lockorder with size entries
-	// then pollorder with size entries
-	sel = runtime_mal(sizeof(*sel) +
-		n*sizeof(sel->scase[0]) +
-		size*sizeof(sel->lockorder[0]) +
-		size*sizeof(sel->pollorder[0]));
-
-	sel->tcase = size;
-	sel->ncase = 0;
-	sel->lockorder = (void*)(sel->scase + size);
-	sel->pollorder = (void*)(sel->lockorder + size);
-
-	if(debug)
-		runtime_printf("newselect s=%p size=%d\n", sel, size);
-	return sel;
-}
-
-// cut in half to give stack a chance to split
-static void selectsend(Select *sel, Hchan *c, int index, void *elem);
-
-func selectsend(sel *Select, c *Hchan, elem *byte, index int32) {
-	// nil cases do not compete
-	if(c != nil)
-		selectsend(sel, c, index, elem);
-}
-
-static void
-selectsend(Select *sel, Hchan *c, int index, void *elem)
-{
-	int32 i;
-	Scase *cas;
-
-	i = sel->ncase;
-	if(i >= sel->tcase)
-		runtime_throw("selectsend: too many cases");
-	sel->ncase = i+1;
-	cas = &sel->scase[i];
-
-	cas->index = index;
-	cas->chan = c;
-	cas->kind = CaseSend;
-	cas->sg.elem = elem;
-
-	if(debug)
-		runtime_printf("selectsend s=%p index=%d chan=%p\n",
-			sel, cas->index, cas->chan);
-}
-
-// cut in half to give stack a chance to split
-static void selectrecv(Select *sel, Hchan *c, int index, void *elem, bool*);
-
-func selectrecv(sel *Select, c *Hchan, elem *byte, index int32) {
-	// nil cases do not compete
-	if(c != nil)
-		selectrecv(sel, c, index, elem, nil);
-}
-
-func selectrecv2(sel *Select, c *Hchan, elem *byte, received *bool, index int32) {
-	// nil cases do not compete
-	if(c != nil)
-		selectrecv(sel, c, index, elem, received);
-}
-
-static void
-selectrecv(Select *sel, Hchan *c, int index, void *elem, bool *received)
-{
-	int32 i;
-	Scase *cas;
-
-	i = sel->ncase;
-	if(i >= sel->tcase)
-		runtime_throw("selectrecv: too many cases");
-	sel->ncase = i+1;
-	cas = &sel->scase[i];
-	cas->index = index;
-	cas->chan = c;
-
-	cas->kind = CaseRecv;
-	cas->sg.elem = elem;
-	cas->receivedp = received;
-
-	if(debug)
-		runtime_printf("selectrecv s=%p index=%d chan=%p\n",
-			sel, cas->index, cas->chan);
-}
-
-// cut in half to give stack a chance to split
-static void selectdefault(Select*, int);
-
-func selectdefault(sel *Select, index int32) {
-	selectdefault(sel, index);
-}
-
-static void
-selectdefault(Select *sel, int32 index)
-{
-	int32 i;
-	Scase *cas;
-
-	i = sel->ncase;
-	if(i >= sel->tcase)
-		runtime_throw("selectdefault: too many cases");
-	sel->ncase = i+1;
-	cas = &sel->scase[i];
-	cas->index = index;
-	cas->chan = nil;
-
-	cas->kind = CaseDefault;
-
-	if(debug)
-		runtime_printf("selectdefault s=%p index=%d\n",
-			sel, cas->index);
-}
-
-static void
-sellock(Select *sel)
-{
-	uint32 i;
-	Hchan *c, *c0;
-
-	c = nil;
-	for(i=0; i<sel->ncase; i++) {
-		c0 = sel->lockorder[i];
-		if(c0 && c0 != c) {
-			c = sel->lockorder[i];
-			runtime_lock(&c->lock);
-		}
-	}
-}
-
-static void
-selunlock(Select *sel)
-{
-	int32 i, n, r;
-	Hchan *c;
-
-	// We must be very careful here to not touch sel after we have unlocked
-	// the last lock, because sel can be freed right after the last unlock.
-	// Consider the following situation.
-	// First M calls runtime_park() in runtime_selectgo() passing the sel.
-	// Once runtime_park() has unlocked the last lock, another M makes
-	// the G that calls select runnable again and schedules it for execution.
-	// When the G runs on another M, it locks all the locks and frees sel.
-	// Now if the first M touches sel, it will access freed memory.
-	n = (int32)sel->ncase;
-	r = 0;
-	// skip the default case
-	if(n>0 && sel->lockorder[0] == nil)
-		r = 1;
-	for(i = n-1; i >= r; i--) {
-		c = sel->lockorder[i];
-		if(i>0 && sel->lockorder[i-1] == c)
-			continue;  // will unlock it on the next iteration
-		runtime_unlock(&c->lock);
-	}
-}
-
-static bool
-selparkcommit(G *gp, void *sel)
-{
-	USED(gp);
-	selunlock(sel);
-	return true;
-}
-
-func block() {
-	runtime_park(nil, nil, "select (no cases)");	// forever
-}
-
-static int selectgo(Select**);
-
-// selectgo(sel *byte);
-
-func selectgo(sel *Select) (ret int32) {
-	return selectgo(&sel);
-}
-
-static int
-selectgo(Select **selp)
-{
-	Select *sel;
-	uint32 o, i, j, k, done;
-	int64 t0;
-	Scase *cas, *dfl;
-	Hchan *c;
-	SudoG *sg;
-	G *gp;
-	int index;
-	G *g;
-
-	sel = *selp;
-	if(runtime_gcwaiting())
-		runtime_gosched();
-
-	if(debug)
-		runtime_printf("select: sel=%p\n", sel);
-
-	g = runtime_g();
-
-	t0 = 0;
-	if(runtime_blockprofilerate > 0) {
-		t0 = runtime_cputicks();
-		for(i=0; i<sel->ncase; i++)
-			sel->scase[i].sg.releasetime = -1;
-	}
-
-	// The compiler rewrites selects that statically have
-	// only 0 or 1 cases plus default into simpler constructs.
-	// The only way we can end up with such small sel->ncase
-	// values here is for a larger select in which most channels
-	// have been nilled out.  The general code handles those
-	// cases correctly, and they are rare enough not to bother
-	// optimizing (and needing to test).
-
-	// generate permuted order
-	for(i=0; i<sel->ncase; i++)
-		sel->pollorder[i] = i;
-	for(i=1; i<sel->ncase; i++) {
-		o = sel->pollorder[i];
-		j = runtime_fastrand1()%(i+1);
-		sel->pollorder[i] = sel->pollorder[j];
-		sel->pollorder[j] = o;
-	}
-
-	// sort the cases by Hchan address to get the locking order.
-	// simple heap sort, to guarantee n log n time and constant stack footprint.
-	for(i=0; i<sel->ncase; i++) {
-		j = i;
-		c = sel->scase[j].chan;
-		while(j > 0 && sel->lockorder[k=(j-1)/2] < c) {
-			sel->lockorder[j] = sel->lockorder[k];
-			j = k;
-		}
-		sel->lockorder[j] = c;
-	}
-	for(i=sel->ncase; i-->0; ) {
-		c = sel->lockorder[i];
-		sel->lockorder[i] = sel->lockorder[0];
-		j = 0;
-		for(;;) {
-			k = j*2+1;
-			if(k >= i)
-				break;
-			if(k+1 < i && sel->lockorder[k] < sel->lockorder[k+1])
-				k++;
-			if(c < sel->lockorder[k]) {
-				sel->lockorder[j] = sel->lockorder[k];
-				j = k;
-				continue;
-			}
-			break;
-		}
-		sel->lockorder[j] = c;
-	}
-	/*
-	for(i=0; i+1<sel->ncase; i++)
-		if(sel->lockorder[i] > sel->lockorder[i+1]) {
-			runtime_printf("i=%d %p %p\n", i, sel->lockorder[i], sel->lockorder[i+1]);
-			runtime_throw("select: broken sort");
-		}
-	*/
-	sellock(sel);
-
-loop:
-	// pass 1 - look for something already waiting
-	dfl = nil;
-	for(i=0; i<sel->ncase; i++) {
-		o = sel->pollorder[i];
-		cas = &sel->scase[o];
-		c = cas->chan;
-
-		switch(cas->kind) {
-		case CaseRecv:
-			if(c->dataqsiz > 0) {
-				if(c->qcount > 0)
-					goto asyncrecv;
-			} else {
-				sg = dequeue(&c->sendq);
-				if(sg != nil)
-					goto syncrecv;
-			}
-			if(c->closed)
-				goto rclose;
-			break;
-
-		case CaseSend:
-			if(c->closed)
-				goto sclose;
-			if(c->dataqsiz > 0) {
-				if(c->qcount < c->dataqsiz)
-					goto asyncsend;
-			} else {
-				sg = dequeue(&c->recvq);
-				if(sg != nil)
-					goto syncsend;
-			}
-			break;
-
-		case CaseDefault:
-			dfl = cas;
-			break;
-		}
-	}
-
-	if(dfl != nil) {
-		selunlock(sel);
-		cas = dfl;
-		goto retc;
-	}
-
-
-	// pass 2 - enqueue on all chans
-	done = 0;
-	for(i=0; i<sel->ncase; i++) {
-		o = sel->pollorder[i];
-		cas = &sel->scase[o];
-		c = cas->chan;
-		sg = &cas->sg;
-		sg->g = g;
-		sg->selectdone = &done;
-
-		switch(cas->kind) {
-		case CaseRecv:
-			enqueue(&c->recvq, sg);
-			break;
-
-		case CaseSend:
-			enqueue(&c->sendq, sg);
-			break;
-		}
-	}
-
-	g->param = nil;
-	runtime_park(selparkcommit, sel, "select");
-
-	sellock(sel);
-	sg = g->param;
-
-	// pass 3 - dequeue from unsuccessful chans
-	// otherwise they stack up on quiet channels
-	for(i=0; i<sel->ncase; i++) {
-		cas = &sel->scase[i];
-		if(cas != (Scase*)sg) {
-			c = cas->chan;
-			if(cas->kind == CaseSend)
-				dequeueg(&c->sendq);
-			else
-				dequeueg(&c->recvq);
-		}
-	}
-
-	if(sg == nil)
-		goto loop;
-
-	cas = (Scase*)sg;
-	c = cas->chan;
-
-	if(c->dataqsiz > 0)
-		runtime_throw("selectgo: shouldn't happen");
-
-	if(debug)
-		runtime_printf("wait-return: sel=%p c=%p cas=%p kind=%d\n",
-			sel, c, cas, cas->kind);
-
-	if(cas->kind == CaseRecv) {
-		if(cas->receivedp != nil)
-			*cas->receivedp = true;
-	}
-
-	selunlock(sel);
-	goto retc;
-
-asyncrecv:
-	// can receive from buffer
-	if(cas->receivedp != nil)
-		*cas->receivedp = true;
-	if(cas->sg.elem != nil)
-		runtime_memmove(cas->sg.elem, chanbuf(c, c->recvx), c->elemsize);
-	runtime_memclr(chanbuf(c, c->recvx), c->elemsize);
-	if(++c->recvx == c->dataqsiz)
-		c->recvx = 0;
-	c->qcount--;
-	sg = dequeue(&c->sendq);
-	if(sg != nil) {
-		gp = sg->g;
-		selunlock(sel);
-		if(sg->releasetime)
-			sg->releasetime = runtime_cputicks();
-		runtime_ready(gp);
-	} else {
-		selunlock(sel);
-	}
-	goto retc;
-
-asyncsend:
-	// can send to buffer
-	runtime_memmove(chanbuf(c, c->sendx), cas->sg.elem, c->elemsize);
-	if(++c->sendx == c->dataqsiz)
-		c->sendx = 0;
-	c->qcount++;
-	sg = dequeue(&c->recvq);
-	if(sg != nil) {
-		gp = sg->g;
-		selunlock(sel);
-		if(sg->releasetime)
-			sg->releasetime = runtime_cputicks();
-		runtime_ready(gp);
-	} else {
-		selunlock(sel);
-	}
-	goto retc;
-
-syncrecv:
-	// can receive from sleeping sender (sg)
-	selunlock(sel);
-	if(debug)
-		runtime_printf("syncrecv: sel=%p c=%p o=%d\n", sel, c, o);
-	if(cas->receivedp != nil)
-		*cas->receivedp = true;
-	if(cas->sg.elem != nil)
-		runtime_memmove(cas->sg.elem, sg->elem, c->elemsize);
-	gp = sg->g;
-	gp->param = sg;
-	if(sg->releasetime)
-		sg->releasetime = runtime_cputicks();
-	runtime_ready(gp);
-	goto retc;
-
-rclose:
-	// read at end of closed channel
-	selunlock(sel);
-	if(cas->receivedp != nil)
-		*cas->receivedp = false;
-	if(cas->sg.elem != nil)
-		runtime_memclr(cas->sg.elem, c->elemsize);
-	goto retc;
-
-syncsend:
-	// can send to sleeping receiver (sg)
-	selunlock(sel);
-	if(debug)
-		runtime_printf("syncsend: sel=%p c=%p o=%d\n", sel, c, o);
-	if(sg->elem != nil)
-		runtime_memmove(sg->elem, cas->sg.elem, c->elemsize);
-	gp = sg->g;
-	gp->param = sg;
-	if(sg->releasetime)
-		sg->releasetime = runtime_cputicks();
-	runtime_ready(gp);
-
-retc:
-	// return index corresponding to chosen case
-	index = cas->index;
-	if(cas->sg.releasetime > 0)
-		runtime_blockevent(cas->sg.releasetime - t0, 2);
-	runtime_free(sel);
-	return index;
-
-sclose:
-	// send on closed channel
-	selunlock(sel);
-	runtime_panicstring("send on closed channel");
-	return 0;  // not reached
-}
-
-// This struct must match ../reflect/value.go:/runtimeSelect.
-typedef struct runtimeSelect runtimeSelect;
-struct runtimeSelect
-{
-	uintptr dir;
-	ChanType *typ;
-	Hchan *ch;
-	byte *val;
-};
-
-// This enum must match ../reflect/value.go:/SelectDir.
-enum SelectDir {
-	SelectSend = 1,
-	SelectRecv,
-	SelectDefault,
-};
-
-func reflect.rselect(cases Slice) (chosen int, recvOK bool) {
-	int32 i;
-	Select *sel;
-	runtimeSelect* rcase, *rc;
-
-	chosen = -1;
-	recvOK = false;
-
-	rcase = (runtimeSelect*)cases.__values;
-
-	sel = newselect(cases.__count);
-	for(i=0; i<cases.__count; i++) {
-		rc = &rcase[i];
-		switch(rc->dir) {
-		case SelectDefault:
-			selectdefault(sel, i);
-			break;
-		case SelectSend:
-			if(rc->ch == nil)
-				break;
-			selectsend(sel, rc->ch, i, rc->val);
-			break;
-		case SelectRecv:
-			if(rc->ch == nil)
-				break;
-			selectrecv(sel, rc->ch, i, rc->val, &recvOK);
-			break;
-		}
-	}
-
-	chosen = (intgo)(uintptr)selectgo(&sel);
-}
-
-static void closechan(Hchan *c, void *pc);
-
-func closechan(c *Hchan) {
-	closechan(c, runtime_getcallerpc(&c));
-}
-
-func reflect.chanclose(c *Hchan) {
-	closechan(c, runtime_getcallerpc(&c));
-}
-
-static void
-closechan(Hchan *c, void *pc)
-{
-	USED(pc);
-	SudoG *sg;
-	G* gp;
-
-	if(c == nil)
-		runtime_panicstring("close of nil channel");
-
-	if(runtime_gcwaiting())
-		runtime_gosched();
-
-	runtime_lock(&c->lock);
-	if(c->closed) {
-		runtime_unlock(&c->lock);
-		runtime_panicstring("close of closed channel");
-	}
-	c->closed = true;
-
-	// release all readers
-	for(;;) {
-		sg = dequeue(&c->recvq);
-		if(sg == nil)
-			break;
-		gp = sg->g;
-		gp->param = nil;
-		if(sg->releasetime)
-			sg->releasetime = runtime_cputicks();
-		runtime_ready(gp);
-	}
-
-	// release all writers
-	for(;;) {
-		sg = dequeue(&c->sendq);
-		if(sg == nil)
-			break;
-		gp = sg->g;
-		gp->param = nil;
-		if(sg->releasetime)
-			sg->releasetime = runtime_cputicks();
-		runtime_ready(gp);
-	}
-
-	runtime_unlock(&c->lock);
-}
-
-void
-__go_builtin_close(Hchan *c)
-{
-	runtime_closechan(c);
-}
-
-func reflect.chanlen(c *Hchan) (len int) {
-	if(c == nil)
-		len = 0;
-	else
-		len = c->qcount;
-}
-
-intgo
-__go_chan_len(Hchan *c)
-{
-	return reflect_chanlen(c);
-}
-
-func reflect.chancap(c *Hchan) (cap int) {
-	if(c == nil)
-		cap = 0;
-	else
-		cap = c->dataqsiz;
-}
-
-intgo
-__go_chan_cap(Hchan *c)
-{
-	return reflect_chancap(c);
-}
-
-static SudoG*
-dequeue(WaitQ *q)
-{
-	SudoG *sgp;
-
-loop:
-	sgp = q->first;
-	if(sgp == nil)
-		return nil;
-	q->first = sgp->link;
-
-	// if sgp participates in a select and is already signaled, ignore it
-	if(sgp->selectdone != nil) {
-		// claim the right to signal
-		if(*sgp->selectdone != 0 || !runtime_cas(sgp->selectdone, 0, 1))
-			goto loop;
-	}
-
-	return sgp;
-}
-
-static void
-dequeueg(WaitQ *q)
-{
-	SudoG **l, *sgp, *prevsgp;
-	G *g;
-
-	g = runtime_g();
-	prevsgp = nil;
-	for(l=&q->first; (sgp=*l) != nil; l=&sgp->link, prevsgp=sgp) {
-		if(sgp->g == g) {
-			*l = sgp->link;
-			if(q->last == sgp)
-				q->last = prevsgp;
-			break;
-		}
-	}
-}
-
-static void
-enqueue(WaitQ *q, SudoG *sgp)
-{
-	sgp->link = nil;
-	if(q->first == nil) {
-		q->first = sgp;
-		q->last = sgp;
-		return;
-	}
-	q->last->link = sgp;
-	q->last = sgp;
-}
diff --git a/third_party/gofrontend/libgo/runtime/chan.h b/third_party/gofrontend/libgo/runtime/chan.h
deleted file mode 100644
index 271803c..0000000
--- a/third_party/gofrontend/libgo/runtime/chan.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-typedef	struct	WaitQ	WaitQ;
-typedef	struct	SudoG	SudoG;
-typedef	struct	Select	Select;
-typedef	struct	Scase	Scase;
-
-typedef struct	__go_type_descriptor	Type;
-typedef struct	__go_channel_type	ChanType;
-
-struct	SudoG
-{
-	G*	g;
-	uint32*	selectdone;
-	SudoG*	link;
-	int64	releasetime;
-	byte*	elem;		// data element
-};
-
-struct	WaitQ
-{
-	SudoG*	first;
-	SudoG*	last;
-};
-
-// The garbage collector is assuming that Hchan can only contain pointers into the stack
-// and cannot contain pointers into the heap.
-struct	Hchan
-{
-	uintgo	qcount;			// total data in the q
-	uintgo	dataqsiz;		// size of the circular q
-	uint16	elemsize;
-	uint16	pad;			// ensures proper alignment of the buffer that follows Hchan in memory
-	bool	closed;
-	const Type* elemtype;		// element type
-	uintgo	sendx;			// send index
-	uintgo	recvx;			// receive index
-	WaitQ	recvq;			// list of recv waiters
-	WaitQ	sendq;			// list of send waiters
-	Lock	lock;
-};
-
-// Buffer follows Hchan immediately in memory.
-// chanbuf(c, i) is pointer to the i'th slot in the buffer.
-#define chanbuf(c, i) ((byte*)((c)+1)+(uintptr)(c)->elemsize*(i))
-
-enum
-{
-	debug = 0,
-
-	// Scase.kind
-	CaseRecv,
-	CaseSend,
-	CaseDefault,
-};
-
-struct	Scase
-{
-	SudoG	sg;			// must be first member (cast to Scase)
-	Hchan*	chan;			// chan
-	uint16	kind;
-	uint16	index;			// index to return
-	bool*	receivedp;		// pointer to received bool (recv2)
-};
-
-struct	Select
-{
-	uint16	tcase;			// total count of scase[]
-	uint16	ncase;			// currently filled scase[]
-	uint16*	pollorder;		// case poll order
-	Hchan**	lockorder;		// channel lock order
-	Scase	scase[1];		// one per case (in order of appearance)
-};
diff --git a/third_party/gofrontend/libgo/runtime/cpuprof.goc b/third_party/gofrontend/libgo/runtime/cpuprof.goc
deleted file mode 100644
index 7d27bc6..0000000
--- a/third_party/gofrontend/libgo/runtime/cpuprof.goc
+++ /dev/null
@@ -1,442 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// CPU profiling.
-// Based on algorithms and data structures used in
-// http://code.google.com/p/google-perftools/.
-//
-// The main difference between this code and the google-perftools
-// code is that this code is written to allow copying the profile data
-// to an arbitrary io.Writer, while the google-perftools code always
-// writes to an operating system file.
-//
-// The signal handler for the profiling clock tick adds a new stack trace
-// to a hash table tracking counts for recent traces.  Most clock ticks
-// hit in the cache.  In the event of a cache miss, an entry must be 
-// evicted from the hash table, copied to a log that will eventually be
-// written as profile data.  The google-perftools code flushed the
-// log itself during the signal handler.  This code cannot do that, because
-// the io.Writer might block or need system calls or locks that are not
-// safe to use from within the signal handler.  Instead, we split the log
-// into two halves and let the signal handler fill one half while a goroutine
-// is writing out the other half.  When the signal handler fills its half, it
-// offers to swap with the goroutine.  If the writer is not done with its half,
-// we lose the stack trace for this clock tick (and record that loss).
-// The goroutine interacts with the signal handler by calling getprofile() to
-// get the next log piece to write, implicitly handing back the last log
-// piece it obtained.
-//
-// The state of this dance between the signal handler and the goroutine
-// is encoded in the Profile.handoff field.  If handoff == 0, then the goroutine
-// is not using either log half and is waiting (or will soon be waiting) for
-// a new piece by calling notesleep(&p->wait).  If the signal handler
-// changes handoff from 0 to non-zero, it must call notewakeup(&p->wait)
-// to wake the goroutine.  The value indicates the number of entries in the
-// log half being handed off.  The goroutine leaves the non-zero value in
-// place until it has finished processing the log half and then flips the number
-// back to zero.  Setting the high bit in handoff means that the profiling is over, 
-// and the goroutine is now in charge of flushing the data left in the hash table
-// to the log and returning that data.  
-//
-// The handoff field is manipulated using atomic operations.
-// For the most part, the manipulation of handoff is orderly: if handoff == 0
-// then the signal handler owns it and can change it to non-zero.  
-// If handoff != 0 then the goroutine owns it and can change it to zero.
-// If that were the end of the story then we would not need to manipulate
-// handoff using atomic operations.  The operations are needed, however,
-// in order to let the log closer set the high bit to indicate "EOF" safely
-// in the situation when normally the goroutine "owns" handoff.
-
-package runtime
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-#include "array.h"
-typedef struct __go_open_array Slice;
-#define array __values
-#define len __count
-#define cap __capacity
-
-enum
-{
-	HashSize = 1<<10,
-	LogSize = 1<<17,
-	Assoc = 4,
-	MaxStack = 64,
-};
-
-typedef struct Profile Profile;
-typedef struct Bucket Bucket;
-typedef struct Entry Entry;
-
-struct Entry {
-	uintptr count;
-	uintptr depth;
-	uintptr stack[MaxStack];
-};
-
-struct Bucket {
-	Entry entry[Assoc];
-};
-
-struct Profile {
-	bool on;		// profiling is on
-	Note wait;		// goroutine waits here
-	uintptr count;		// tick count
-	uintptr evicts;		// eviction count
-	uintptr lost;		// lost ticks that need to be logged
-
-	// Active recent stack traces.
-	Bucket hash[HashSize];
-
-	// Log of traces evicted from hash.
-	// Signal handler has filled log[toggle][:nlog].
-	// Goroutine is writing log[1-toggle][:handoff].
-	uintptr log[2][LogSize/2];
-	uintptr nlog;
-	int32 toggle;
-	uint32 handoff;
-	
-	// Writer state.
-	// Writer maintains its own toggle to avoid races
-	// looking at signal handler's toggle.
-	uint32 wtoggle;
-	bool wholding;	// holding & need to release a log half
-	bool flushing;	// flushing hash table - profile is over
-	bool eod_sent;  // special end-of-data record sent; => flushing
-};
-
-static Lock lk;
-static Profile *prof;
-
-static void tick(uintptr*, int32);
-static void add(Profile*, uintptr*, int32);
-static bool evict(Profile*, Entry*);
-static bool flushlog(Profile*);
-
-static uintptr eod[3] = {0, 1, 0};
-
-// LostProfileData is a no-op function used in profiles
-// to mark the number of profiling stack traces that were
-// discarded due to slow data writers.
-static void
-LostProfileData(void)
-{
-}
-
-extern void runtime_SetCPUProfileRate(intgo)
-     __asm__ (GOSYM_PREFIX "runtime.SetCPUProfileRate");
-
-// SetCPUProfileRate sets the CPU profiling rate.
-// The user documentation is in debug.go.
-void
-runtime_SetCPUProfileRate(intgo hz)
-{
-	uintptr *p;
-	uintptr n;
-
-	// Clamp hz to something reasonable.
-	if(hz < 0)
-		hz = 0;
-	if(hz > 1000000)
-		hz = 1000000;
-
-	runtime_lock(&lk);
-	if(hz > 0) {
-		if(prof == nil) {
-			prof = runtime_SysAlloc(sizeof *prof, &mstats.other_sys);
-			if(prof == nil) {
-				runtime_printf("runtime: cpu profiling cannot allocate memory\n");
-				runtime_unlock(&lk);
-				return;
-			}
-		}
-		if(prof->on || prof->handoff != 0) {
-			runtime_printf("runtime: cannot set cpu profile rate until previous profile has finished.\n");
-			runtime_unlock(&lk);
-			return;
-		}
-
-		prof->on = true;
-		p = prof->log[0];
-		// pprof binary header format.
-		// http://code.google.com/p/google-perftools/source/browse/trunk/src/profiledata.cc#117
-		*p++ = 0;  // count for header
-		*p++ = 3;  // depth for header
-		*p++ = 0;  // version number
-		*p++ = 1000000 / hz;  // period (microseconds)
-		*p++ = 0;
-		prof->nlog = p - prof->log[0];
-		prof->toggle = 0;
-		prof->wholding = false;
-		prof->wtoggle = 0;
-		prof->flushing = false;
-		prof->eod_sent = false;
-		runtime_noteclear(&prof->wait);
-
-		runtime_setcpuprofilerate(tick, hz);
-	} else if(prof != nil && prof->on) {
-		runtime_setcpuprofilerate(nil, 0);
-		prof->on = false;
-
-		// Now add is not running anymore, and getprofile owns the entire log.
-		// Set the high bit in prof->handoff to tell getprofile.
-		for(;;) {
-			n = prof->handoff;
-			if(n&0x80000000)
-				runtime_printf("runtime: setcpuprofile(off) twice");
-			if(runtime_cas(&prof->handoff, n, n|0x80000000))
-				break;
-		}
-		if(n == 0) {
-			// we did the transition from 0 -> nonzero so we wake getprofile
-			runtime_notewakeup(&prof->wait);
-		}
-	}
-	runtime_unlock(&lk);
-}
-
-static void
-tick(uintptr *pc, int32 n)
-{
-	add(prof, pc, n);
-}
-
-// add adds the stack trace to the profile.
-// It is called from signal handlers and other limited environments
-// and cannot allocate memory or acquire locks that might be
-// held at the time of the signal, nor can it use substantial amounts
-// of stack.  It is allowed to call evict.
-static void
-add(Profile *p, uintptr *pc, int32 n)
-{
-	int32 i, j;
-	uintptr h, x;
-	Bucket *b;
-	Entry *e;
-
-	if(n > MaxStack)
-		n = MaxStack;
-	
-	// Compute hash.
-	h = 0;
-	for(i=0; i<n; i++) {
-		h = h<<8 | (h>>(8*(sizeof(h)-1)));
-		x = pc[i];
-		h += x*31 + x*7 + x*3;
-	}
-	p->count++;
-
-	// Add to entry count if already present in table.
-	b = &p->hash[h%HashSize];
-	for(i=0; i<Assoc; i++) {
-		e = &b->entry[i];
-		if(e->depth != (uintptr)n)	
-			continue;
-		for(j=0; j<n; j++)
-			if(e->stack[j] != pc[j])
-				goto ContinueAssoc;
-		e->count++;
-		return;
-	ContinueAssoc:;
-	}
-
-	// Evict entry with smallest count.
-	e = &b->entry[0];
-	for(i=1; i<Assoc; i++)
-		if(b->entry[i].count < e->count)
-			e = &b->entry[i];
-	if(e->count > 0) {
-		if(!evict(p, e)) {
-			// Could not evict entry.  Record lost stack.
-			p->lost++;
-			return;
-		}
-		p->evicts++;
-	}
-	
-	// Reuse the newly evicted entry.
-	e->depth = n;
-	e->count = 1;
-	for(i=0; i<n; i++)
-		e->stack[i] = pc[i];
-}
-
-// evict copies the given entry's data into the log, so that
-// the entry can be reused.  evict is called from add, which
-// is called from the profiling signal handler, so it must not
-// allocate memory or block.  It is safe to call flushLog.
-// evict returns true if the entry was copied to the log,
-// false if there was no room available.
-static bool
-evict(Profile *p, Entry *e)
-{
-	int32 i, d, nslot;
-	uintptr *log, *q;
-	
-	d = e->depth;
-	nslot = d+2;
-	log = p->log[p->toggle];
-	if(p->nlog+nslot > nelem(p->log[0])) {
-		if(!flushlog(p))
-			return false;
-		log = p->log[p->toggle];
-	}
-	
-	q = log+p->nlog;
-	*q++ = e->count;
-	*q++ = d;
-	for(i=0; i<d; i++)
-		*q++ = e->stack[i];
-	p->nlog = q - log;
-	e->count = 0;
-	return true;
-}
-
-// flushlog tries to flush the current log and switch to the other one.
-// flushlog is called from evict, called from add, called from the signal handler,
-// so it cannot allocate memory or block.  It can try to swap logs with
-// the writing goroutine, as explained in the comment at the top of this file.
-static bool
-flushlog(Profile *p)
-{
-	uintptr *log, *q;
-
-	if(!runtime_cas(&p->handoff, 0, p->nlog))
-		return false;
-	runtime_notewakeup(&p->wait);
-
-	p->toggle = 1 - p->toggle;
-	log = p->log[p->toggle];
-	q = log;
-	if(p->lost > 0) {
-		*q++ = p->lost;
-		*q++ = 1;
-		*q++ = (uintptr)LostProfileData;
-		p->lost = 0;
-	}
-	p->nlog = q - log;
-	return true;
-}
-
-// getprofile blocks until the next block of profiling data is available
-// and returns it as a []byte.  It is called from the writing goroutine.
-Slice
-getprofile(Profile *p)
-{
-	uint32 i, j, n;
-	Slice ret;
-	Bucket *b;
-	Entry *e;
-
-	ret.array = nil;
-	ret.len = 0;
-	ret.cap = 0;
-	
-	if(p == nil)	
-		return ret;
-
-	if(p->wholding) {
-		// Release previous log to signal handling side.
-		// Loop because we are racing against SetCPUProfileRate(0).
-		for(;;) {
-			n = p->handoff;
-			if(n == 0) {
-				runtime_printf("runtime: phase error during cpu profile handoff\n");
-				return ret;
-			}
-			if(n & 0x80000000) {
-				p->wtoggle = 1 - p->wtoggle;
-				p->wholding = false;
-				p->flushing = true;
-				goto flush;
-			}
-			if(runtime_cas(&p->handoff, n, 0))
-				break;
-		}
-		p->wtoggle = 1 - p->wtoggle;
-		p->wholding = false;
-	}
-	
-	if(p->flushing)
-		goto flush;
-	
-	if(!p->on && p->handoff == 0)
-		return ret;
-
-	// Wait for new log.
-	runtime_notetsleepg(&p->wait, -1);
-	runtime_noteclear(&p->wait);
-
-	n = p->handoff;
-	if(n == 0) {
-		runtime_printf("runtime: phase error during cpu profile wait\n");
-		return ret;
-	}
-	if(n == 0x80000000) {
-		p->flushing = true;
-		goto flush;
-	}
-	n &= ~0x80000000;
-
-	// Return new log to caller.
-	p->wholding = true;
-
-	ret.array = (byte*)p->log[p->wtoggle];
-	ret.len = n*sizeof(uintptr);
-	ret.cap = ret.len;
-	return ret;
-
-flush:
-	// In flush mode.
-	// Add is no longer being called.  We own the log.
-	// Also, p->handoff is non-zero, so flushlog will return false.
-	// Evict the hash table into the log and return it.
-	for(i=0; i<HashSize; i++) {
-		b = &p->hash[i];
-		for(j=0; j<Assoc; j++) {
-			e = &b->entry[j];
-			if(e->count > 0 && !evict(p, e)) {
-				// Filled the log.  Stop the loop and return what we've got.
-				goto breakflush;
-			}
-		}
-	}
-breakflush:
-
-	// Return pending log data.
-	if(p->nlog > 0) {
-		// Note that we're using toggle now, not wtoggle,
-		// because we're working on the log directly.
-		ret.array = (byte*)p->log[p->toggle];
-		ret.len = p->nlog*sizeof(uintptr);
-		ret.cap = ret.len;
-		p->nlog = 0;
-		return ret;
-	}
-
-	// Made it through the table without finding anything to log.
-	if(!p->eod_sent) {
-		// We may not have space to append this to the partial log buf,
-		// so we always return a new slice for the end-of-data marker.
-		p->eod_sent = true;
-		ret.array = (byte*)eod;
-		ret.len = sizeof eod;
-		ret.cap = ret.len;
-		return ret;
-	}
-
-	// Finally done.  Clean up and return nil.
-	p->flushing = false;
-	if(!runtime_cas(&p->handoff, p->handoff, 0))
-		runtime_printf("runtime: profile flush racing with something\n");
-	return ret;  // set to nil at top of function
-}
-
-// CPUProfile returns the next cpu profile block as a []byte.
-// The user documentation is in debug.go.
-func CPUProfile() (ret Slice) {
-	ret = getprofile(prof);
-}
diff --git a/third_party/gofrontend/libgo/runtime/defs.h b/third_party/gofrontend/libgo/runtime/defs.h
deleted file mode 100644
index 67ad212..0000000
--- a/third_party/gofrontend/libgo/runtime/defs.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/* defs.h -- runtime definitions for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-/* The gc library uses this file for system defines, and generates it
-   automatically using the godefs program.  The logical thing to put
-   here for gccgo would be #include statements for system header
-   files.  We can't do that, though, because runtime.h #define's the
-   standard types.  So we #include the system headers from runtime.h
-   instead.  */
diff --git a/third_party/gofrontend/libgo/runtime/env_posix.c b/third_party/gofrontend/libgo/runtime/env_posix.c
deleted file mode 100644
index b93edd6..0000000
--- a/third_party/gofrontend/libgo/runtime/env_posix.c
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
-
-#include "runtime.h"
-#include "array.h"
-#include "arch.h"
-#include "malloc.h"
-
-extern Slice envs;
-
-String
-runtime_getenv(const char *s)
-{
-	int32 i, j;
-	intgo len;
-	const byte *v, *bs;
-	String* envv;
-	int32 envc;
-	String ret;
-
-	bs = (const byte*)s;
-	len = runtime_findnull(bs);
-	envv = (String*)envs.__values;
-	envc = envs.__count;
-	for(i=0; i<envc; i++){
-		if(envv[i].len <= len)
-			continue;
-		v = (const byte*)envv[i].str;
-		for(j=0; j<len; j++)
-			if(bs[j] != v[j])
-				goto nomatch;
-		if(v[len] != '=')
-			goto nomatch;
-		ret.str = v+len+1;
-		ret.len = envv[i].len-len-1;
-		return ret;
-	nomatch:;
-	}
-	ret.str = nil;
-	ret.len = 0;
-	return ret;
-}
diff --git a/third_party/gofrontend/libgo/runtime/getncpu-bsd.c b/third_party/gofrontend/libgo/runtime/getncpu-bsd.c
deleted file mode 100644
index 00a81d1..0000000
--- a/third_party/gofrontend/libgo/runtime/getncpu-bsd.c
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <sys/types.h>
-#include <sys/sysctl.h>
-
-#include "runtime.h"
-#include "defs.h"
-
-int32
-getproccount(void)
-{
-	int mib[2], out;
-	size_t len;
-
-	mib[0] = CTL_HW;
-	mib[1] = HW_NCPU;
-	len = sizeof(out);
-	if(sysctl(mib, 2, &out, &len, NULL, 0) >= 0)
-		return (int32)out;
-	else
-		return 0;
-}
diff --git a/third_party/gofrontend/libgo/runtime/getncpu-irix.c b/third_party/gofrontend/libgo/runtime/getncpu-irix.c
deleted file mode 100644
index a65ca63..0000000
--- a/third_party/gofrontend/libgo/runtime/getncpu-irix.c
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <unistd.h>
-
-#include "runtime.h"
-#include "defs.h"
-
-int32
-getproccount(void)
-{
-	int32 n;
-	n = (int32)sysconf(_SC_NPROC_ONLN);
-	return n > 1 ? n : 1;
-}
diff --git a/third_party/gofrontend/libgo/runtime/getncpu-linux.c b/third_party/gofrontend/libgo/runtime/getncpu-linux.c
deleted file mode 100644
index de6606f..0000000
--- a/third_party/gofrontend/libgo/runtime/getncpu-linux.c
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <features.h>
-#include <sched.h>
-
-// CPU_COUNT is only provided by glibc 2.6 or higher
-#ifndef CPU_COUNT
-#define CPU_COUNT(set) _CPU_COUNT((unsigned int *)(set), sizeof(*(set))/sizeof(unsigned int))
-static int _CPU_COUNT(unsigned int *set, size_t len) {
-	int cnt;
-
-	cnt = 0;
-	while (len--)
-		cnt += __builtin_popcount(*set++);
-	return cnt;
-}
-#endif
-
-#include "runtime.h"
-#include "defs.h"
-
-int32
-getproccount(void)
-{
-	cpu_set_t set;
-	int32 r, cnt;
-
-	cnt = 0;
-	r = sched_getaffinity(0, sizeof(set), &set);
-	if(r == 0)
-		cnt += CPU_COUNT(&set);
-
-	return cnt ? cnt : 1;
-}
diff --git a/third_party/gofrontend/libgo/runtime/getncpu-none.c b/third_party/gofrontend/libgo/runtime/getncpu-none.c
deleted file mode 100644
index ba6fd4e..0000000
--- a/third_party/gofrontend/libgo/runtime/getncpu-none.c
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "runtime.h"
-#include "defs.h"
-
-int32
-getproccount(void)
-{
-	return 0;
-}
diff --git a/third_party/gofrontend/libgo/runtime/getncpu-solaris.c b/third_party/gofrontend/libgo/runtime/getncpu-solaris.c
deleted file mode 100644
index 5d5d702..0000000
--- a/third_party/gofrontend/libgo/runtime/getncpu-solaris.c
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <unistd.h>
-
-#include "runtime.h"
-#include "defs.h"
-
-int32
-getproccount(void)
-{
-	int32 n;
-	n = (int32)sysconf(_SC_NPROCESSORS_ONLN);
-	return n > 1 ? n : 1;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-alloc.h b/third_party/gofrontend/libgo/runtime/go-alloc.h
deleted file mode 100644
index c880a04..0000000
--- a/third_party/gofrontend/libgo/runtime/go-alloc.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* go-alloc.h -- allocate memory for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-#include <stdint.h>
-
-extern void *__go_alloc (unsigned int __attribute__ ((mode (pointer))));
-extern void __go_free (void *);
diff --git a/third_party/gofrontend/libgo/runtime/go-append.c b/third_party/gofrontend/libgo/runtime/go-append.c
deleted file mode 100644
index 1b2d49e..0000000
--- a/third_party/gofrontend/libgo/runtime/go-append.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* go-append.c -- the go builtin append function.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-panic.h"
-#include "go-type.h"
-#include "array.h"
-#include "arch.h"
-#include "malloc.h"
-
-/* We should be OK if we don't split the stack here, since the only
-   libc functions we call are memcpy and memmove.  If we don't do
-   this, we will always split the stack, because of memcpy and
-   memmove.  */
-extern struct __go_open_array
-__go_append (struct __go_open_array, void *, uintptr_t, uintptr_t)
-  __attribute__ ((no_split_stack));
-
-struct __go_open_array
-__go_append (struct __go_open_array a, void *bvalues, uintptr_t bcount,
-	     uintptr_t element_size)
-{
-  uintptr_t ucount;
-  intgo count;
-
-  if (bvalues == NULL || bcount == 0)
-    return a;
-
-  ucount = (uintptr_t) a.__count + bcount;
-  count = (intgo) ucount;
-  if ((uintptr_t) count != ucount || count <= a.__count)
-    runtime_panicstring ("append: slice overflow");
-
-  if (count > a.__capacity)
-    {
-      intgo m;
-      uintptr capmem;
-      void *n;
-
-      m = a.__capacity;
-      if (m + m < count)
-	m = count;
-      else
-	{
-	  do
-	    {
-	      if (a.__count < 1024)
-		m += m;
-	      else
-		m += m / 4;
-	    }
-	  while (m < count);
-	}
-
-      if (element_size > 0 && (uintptr) m > MaxMem / element_size)
-	runtime_panicstring ("growslice: cap out of range");
-
-      capmem = runtime_roundupsize (m * element_size);
-
-      n = __go_alloc (capmem);
-      __builtin_memcpy (n, a.__values, a.__count * element_size);
-
-      a.__values = n;
-      a.__capacity = m;
-    }
-
-  __builtin_memmove ((char *) a.__values + a.__count * element_size,
-		     bvalues, bcount * element_size);
-  a.__count = count;
-  return a;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-assert-interface.c b/third_party/gofrontend/libgo/runtime/go-assert-interface.c
deleted file mode 100644
index 427916f..0000000
--- a/third_party/gofrontend/libgo/runtime/go-assert-interface.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* go-assert-interface.c -- interface type assertion for Go.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-alloc.h"
-#include "go-assert.h"
-#include "go-panic.h"
-#include "go-type.h"
-#include "interface.h"
-
-/* This is called by the compiler to implement a type assertion from
-   one interface type to another.  This returns the value that should
-   go in the first field of the result tuple.  The result may be an
-   empty or a non-empty interface.  */
-
-const void *
-__go_assert_interface (const struct __go_type_descriptor *lhs_descriptor,
-		       const struct __go_type_descriptor *rhs_descriptor)
-{
-  const struct __go_interface_type *lhs_interface;
-
-  if (rhs_descriptor == NULL)
-    {
-      struct __go_empty_interface panic_arg;
-
-      /* A type assertion is not permitted with a nil interface.  */
-
-      runtime_newTypeAssertionError (NULL, NULL, lhs_descriptor->__reflection,
-				     NULL, &panic_arg);
-      __go_panic (panic_arg);
-    }
-
-  /* A type assertion to an empty interface just returns the object
-     descriptor.  */
-
-  __go_assert ((lhs_descriptor->__code & GO_CODE_MASK) == GO_INTERFACE);
-  lhs_interface = (const struct __go_interface_type *) lhs_descriptor;
-  if (lhs_interface->__methods.__count == 0)
-    return rhs_descriptor;
-
-  return __go_convert_interface_2 (lhs_descriptor, rhs_descriptor, 0);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-assert.c b/third_party/gofrontend/libgo/runtime/go-assert.c
deleted file mode 100644
index a36f43a..0000000
--- a/third_party/gofrontend/libgo/runtime/go-assert.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* go-assert.c -- libgo specific assertions
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "runtime.h"
-#include "go-assert.h"
-
-void
-__go_assert_fail (const char *file, unsigned int lineno)
-{
-  /* FIXME: Eventually we should dump a stack trace here.  */
-  runtime_printf ("%s:%U: libgo assertion failure\n", file, (uint64) lineno);
-  abort ();
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-assert.h b/third_party/gofrontend/libgo/runtime/go-assert.h
deleted file mode 100644
index 6365595..0000000
--- a/third_party/gofrontend/libgo/runtime/go-assert.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/* go-assert.h -- libgo specific assertions
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#ifndef LIBGO_GO_ASSERT_H
-#define LIBGO_GO_ASSERT_H
-
-/* We use a Go specific assert function so that functions which call
-   assert aren't required to always split the stack.  */
-
-extern void __go_assert_fail (const char *file, unsigned int lineno)
-  __attribute__ ((noreturn));
-
-#define __go_assert(e) ((e) ? (void) 0 : __go_assert_fail (__FILE__, __LINE__))
-
-#endif /* !defined(LIBGO_GO_ASSERT_H) */
diff --git a/third_party/gofrontend/libgo/runtime/go-breakpoint.c b/third_party/gofrontend/libgo/runtime/go-breakpoint.c
deleted file mode 100644
index e403a2a..0000000
--- a/third_party/gofrontend/libgo/runtime/go-breakpoint.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* go-breakpoint.c -- the runtime.Breakpoint function.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <sched.h>
-
-#include "runtime.h"
-
-void Breakpoint (void) __asm__ (GOSYM_PREFIX "runtime.Breakpoint");
-
-void
-Breakpoint (void)
-{
-  __builtin_trap ();
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-byte-array-to-string.c b/third_party/gofrontend/libgo/runtime/go-byte-array-to-string.c
deleted file mode 100644
index 088b786..0000000
--- a/third_party/gofrontend/libgo/runtime/go-byte-array-to-string.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* go-byte-array-to-string.c -- convert an array of bytes to a string in Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-String
-__go_byte_array_to_string (const void* p, intgo len)
-{
-  const unsigned char *bytes;
-  unsigned char *retdata;
-  String ret;
-
-  bytes = (const unsigned char *) p;
-  retdata = runtime_mallocgc ((uintptr) len, 0, FlagNoScan);
-  __builtin_memcpy (retdata, bytes, len);
-  ret.str = retdata;
-  ret.len = len;
-  return ret;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-caller.c b/third_party/gofrontend/libgo/runtime/go-caller.c
deleted file mode 100644
index d6901e0..0000000
--- a/third_party/gofrontend/libgo/runtime/go-caller.c
+++ /dev/null
@@ -1,247 +0,0 @@
-/* go-caller.c -- runtime.Caller and runtime.FuncForPC for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-/* Implement runtime.Caller.  */
-
-#include <stdint.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include "backtrace.h"
-
-#include "runtime.h"
-
-/* Get the function name, file name, and line number for a PC value.
-   We use the backtrace library to get this.  */
-
-/* Data structure to gather file/line information.  */
-
-struct caller
-{
-  String fn;
-  String file;
-  intgo line;
-};
-
-/* Collect file/line information for a PC value.  If this is called
-   more than once, due to inlined functions, we use the last call, as
-   that is usually the most useful one.  */
-
-static int
-callback (void *data, uintptr_t pc __attribute__ ((unused)),
-	  const char *filename, int lineno, const char *function)
-{
-  struct caller *c = (struct caller *) data;
-
-  /* The libbacktrace library says that these strings might disappear,
-     but with the current implementation they won't.  We can't easily
-     allocate memory here, so for now assume that we can save a
-     pointer to the strings.  */
-  c->fn = runtime_gostringnocopy ((const byte *) function);
-  c->file = runtime_gostringnocopy ((const byte *) filename);
-  c->line = lineno;
-
-  return 0;
-}
-
-/* The error callback for backtrace_pcinfo and backtrace_syminfo.  */
-
-static void
-error_callback (void *data __attribute__ ((unused)),
-		const char *msg, int errnum)
-{
-  if (errnum == -1)
-    return;
-  if (errnum > 0)
-    runtime_printf ("%s errno %d\n", msg, errnum);
-  runtime_throw (msg);
-}
-
-/* The backtrace library state.  */
-
-static void *back_state;
-
-/* A lock to control creating back_state.  */
-
-static Lock back_state_lock;
-
-/* Fetch back_state, creating it if necessary.  */
-
-struct backtrace_state *
-__go_get_backtrace_state ()
-{
-  runtime_lock (&back_state_lock);
-  if (back_state == NULL)
-    {
-      const char *filename;
-      struct stat s;
-
-      filename = (const char *) runtime_progname ();
-
-      /* If there is no '/' in FILENAME, it was found on PATH, and
-	 might not be the same as the file with the same name in the
-	 current directory.  */
-      if (__builtin_strchr (filename, '/') == NULL)
-	filename = NULL;
-
-      /* If the file is small, then it's not the real executable.
-	 This is specifically to deal with Docker, which uses a bogus
-	 argv[0] (http://gcc.gnu.org/PR61895).  It would be nice to
-	 have a better check for whether this file is the real
-	 executable.  */
-      if (stat (filename, &s) < 0 || s.st_size < 1024)
-	filename = NULL;
-
-      back_state = backtrace_create_state (filename, 1, error_callback, NULL);
-    }
-  runtime_unlock (&back_state_lock);
-  return back_state;
-}
-
-/* Return function/file/line information for PC.  */
-
-_Bool
-__go_file_line (uintptr pc, String *fn, String *file, intgo *line)
-{
-  struct caller c;
-
-  runtime_memclr (&c, sizeof c);
-  backtrace_pcinfo (__go_get_backtrace_state (), pc, callback,
-		    error_callback, &c);
-  *fn = c.fn;
-  *file = c.file;
-  *line = c.line;
-  return c.file.len > 0;
-}
-
-/* Collect symbol information.  */
-
-static void
-syminfo_callback (void *data, uintptr_t pc __attribute__ ((unused)),
-		  const char *symname __attribute__ ((unused)),
-		  uintptr_t address, uintptr_t size __attribute__ ((unused)))
-{
-  uintptr_t *pval = (uintptr_t *) data;
-
-  *pval = address;
-}
-
-/* Set *VAL to the value of the symbol for PC.  */
-
-static _Bool
-__go_symbol_value (uintptr_t pc, uintptr_t *val)
-{
-  *val = 0;
-  backtrace_syminfo (__go_get_backtrace_state (), pc, syminfo_callback,
-		     error_callback, val);
-  return *val != 0;
-}
-
-/* The values returned by runtime.Caller.  */
-
-struct caller_ret
-{
-  uintptr_t pc;
-  String file;
-  intgo line;
-  _Bool ok;
-};
-
-struct caller_ret Caller (int n) __asm__ (GOSYM_PREFIX "runtime.Caller");
-
-Func *FuncForPC (uintptr_t) __asm__ (GOSYM_PREFIX "runtime.FuncForPC");
-
-/* Implement runtime.Caller.  */
-
-struct caller_ret
-Caller (int skip)
-{
-  struct caller_ret ret;
-  Location loc;
-  int32 n;
-
-  runtime_memclr (&ret, sizeof ret);
-  n = runtime_callers (skip + 1, &loc, 1, false);
-  if (n < 1 || loc.pc == 0)
-    return ret;
-  ret.pc = loc.pc;
-  ret.file = loc.filename;
-  ret.line = loc.lineno;
-  ret.ok = 1;
-  return ret;
-}
-
-/* Implement runtime.FuncForPC.  */
-
-Func *
-FuncForPC (uintptr_t pc)
-{
-  Func *ret;
-  String fn;
-  String file;
-  intgo line;
-  uintptr_t val;
-
-  if (!__go_file_line (pc, &fn, &file, &line))
-    return NULL;
-
-  ret = (Func *) runtime_malloc (sizeof (*ret));
-  ret->name = fn;
-
-  if (__go_symbol_value (pc, &val))
-    ret->entry = val;
-  else
-    ret->entry = 0;
-
-  return ret;
-}
-
-/* Look up the file and line information for a PC within a
-   function.  */
-
-struct funcline_go_return
-{
-  String retfile;
-  intgo retline;
-};
-
-struct funcline_go_return
-runtime_funcline_go (Func *f, uintptr targetpc)
-  __asm__ (GOSYM_PREFIX "runtime.funcline_go");
-
-struct funcline_go_return
-runtime_funcline_go (Func *f __attribute__((unused)), uintptr targetpc)
-{
-  struct funcline_go_return ret;
-  String fn;
-
-  if (!__go_file_line (targetpc, &fn, &ret.retfile,  &ret.retline))
-    runtime_memclr (&ret, sizeof ret);
-  return ret;
-}
-
-/* Return the name of a function.  */
-String runtime_funcname_go (Func *f)
-  __asm__ (GOSYM_PREFIX "runtime.funcname_go");
-
-String
-runtime_funcname_go (Func *f)
-{
-  if (f == NULL)
-    return runtime_gostringnocopy ((const byte *) "");
-  return f->name;
-}
-
-/* Return the entry point of a function.  */
-uintptr runtime_funcentry_go(Func *f)
-  __asm__ (GOSYM_PREFIX "runtime.funcentry_go");
-
-uintptr
-runtime_funcentry_go (Func *f)
-{
-  return f->entry;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-callers.c b/third_party/gofrontend/libgo/runtime/go-callers.c
deleted file mode 100644
index b5ab3be..0000000
--- a/third_party/gofrontend/libgo/runtime/go-callers.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/* go-callers.c -- get callers for Go.
-
-   Copyright 2012 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "config.h"
-
-#include "backtrace.h"
-
-#include "runtime.h"
-#include "array.h"
-
-/* This is set to non-zero when calling backtrace_full.  This is used
-   to avoid getting hanging on a recursive lock in dl_iterate_phdr on
-   older versions of glibc when a SIGPROF signal arrives while
-   collecting a backtrace.  */
-
-uint32 runtime_in_callers;
-
-/* Argument passed to callback function.  */
-
-struct callers_data
-{
-  Location *locbuf;
-  int skip;
-  int index;
-  int max;
-  int keep_thunks;
-};
-
-/* Callback function for backtrace_full.  Just collect the locations.
-   Return zero to continue, non-zero to stop.  */
-
-static int
-callback (void *data, uintptr_t pc, const char *filename, int lineno,
-	  const char *function)
-{
-  struct callers_data *arg = (struct callers_data *) data;
-  Location *loc;
-
-  /* Skip split stack functions.  */
-  if (function != NULL)
-    {
-      const char *p;
-
-      p = function;
-      if (__builtin_strncmp (p, "___", 3) == 0)
-	++p;
-      if (__builtin_strncmp (p, "__morestack_", 12) == 0)
-	return 0;
-    }
-  else if (filename != NULL)
-    {
-      const char *p;
-
-      p = strrchr (filename, '/');
-      if (p == NULL)
-	p = filename;
-      if (__builtin_strncmp (p, "/morestack.S", 12) == 0)
-	return 0;
-    }
-
-  /* Skip thunks and recover functions.  There is no equivalent to
-     these functions in the gc toolchain, so returning them here means
-     significantly different results for runtime.Caller(N).  */
-  if (function != NULL && !arg->keep_thunks)
-    {
-      const char *p;
-
-      p = __builtin_strchr (function, '.');
-      if (p != NULL && __builtin_strncmp (p + 1, "$thunk", 6) == 0)
-	return 0;
-      p = __builtin_strrchr (function, '$');
-      if (p != NULL && __builtin_strcmp(p, "$recover") == 0)
-	return 0;
-    }
-
-  if (arg->skip > 0)
-    {
-      --arg->skip;
-      return 0;
-    }
-
-  loc = &arg->locbuf[arg->index];
-
-  /* On the call to backtrace_full the pc value was most likely
-     decremented if there was a normal call, since the pc referred to
-     the instruction where the call returned and not the call itself.
-     This was done so that the line number referred to the call
-     instruction.  To make sure the actual pc from the call stack is
-     used, it is incremented here.
-
-     In the case of a signal, the pc was not decremented by
-     backtrace_full but still incremented here.  That doesn't really
-     hurt anything since the line number is right and the pc refers to
-     the same instruction.  */
-
-  loc->pc = pc + 1;
-
-  /* The libbacktrace library says that these strings might disappear,
-     but with the current implementation they won't.  We can't easily
-     allocate memory here, so for now assume that we can save a
-     pointer to the strings.  */
-  loc->filename = runtime_gostringnocopy ((const byte *) filename);
-  loc->function = runtime_gostringnocopy ((const byte *) function);
-
-  loc->lineno = lineno;
-  ++arg->index;
-
-  /* There is no point to tracing past certain runtime functions.
-     Stopping the backtrace here can avoid problems on systems that
-     don't provide proper unwind information for makecontext, such as
-     Solaris (http://gcc.gnu.org/PR52583 comment #21).  */
-  if (function != NULL)
-    {
-      if (__builtin_strcmp (function, "makecontext") == 0)
-	return 1;
-      if (filename != NULL)
-	{
-	  const char *p;
-
-	  p = strrchr (filename, '/');
-	  if (p == NULL)
-	    p = filename;
-	  if (__builtin_strcmp (p, "/proc.c") == 0)
-	    {
-	      if (__builtin_strcmp (function, "kickoff") == 0
-		  || __builtin_strcmp (function, "runtime_mstart") == 0
-		  || __builtin_strcmp (function, "runtime_main") == 0)
-		return 1;
-	    }
-	}
-    }
-
-  return arg->index >= arg->max;
-}
-
-/* Error callback.  */
-
-static void
-error_callback (void *data __attribute__ ((unused)),
-		const char *msg, int errnum)
-{
-  if (errnum == -1)
-    {
-      /* No debug info available.  Carry on as best we can.  */
-      return;
-    }
-  if (errnum != 0)
-    runtime_printf ("%s errno %d\n", msg, errnum);
-  runtime_throw (msg);
-}
-
-/* Gather caller PC's.  */
-
-int32
-runtime_callers (int32 skip, Location *locbuf, int32 m, bool keep_thunks)
-{
-  struct callers_data data;
-
-  data.locbuf = locbuf;
-  data.skip = skip + 1;
-  data.index = 0;
-  data.max = m;
-  data.keep_thunks = keep_thunks;
-  runtime_xadd (&runtime_in_callers, 1);
-  backtrace_full (__go_get_backtrace_state (), 0, callback, error_callback,
-		  &data);
-  runtime_xadd (&runtime_in_callers, -1);
-  return data.index;
-}
-
-int Callers (int, struct __go_open_array)
-  __asm__ (GOSYM_PREFIX "runtime.Callers");
-
-int
-Callers (int skip, struct __go_open_array pc)
-{
-  Location *locbuf;
-  int ret;
-  int i;
-
-  locbuf = (Location *) runtime_mal (pc.__count * sizeof (Location));
-
-  /* In the Go 1 release runtime.Callers has an off-by-one error,
-     which we can not correct because it would break backward
-     compatibility.  Normally we would add 1 to SKIP here, but we
-     don't so that we are compatible.  */
-  ret = runtime_callers (skip, locbuf, pc.__count, false);
-
-  for (i = 0; i < ret; i++)
-    ((uintptr *) pc.__values)[i] = locbuf[i].pc;
-
-  return ret;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-can-convert-interface.c b/third_party/gofrontend/libgo/runtime/go-can-convert-interface.c
deleted file mode 100644
index aac889d..0000000
--- a/third_party/gofrontend/libgo/runtime/go-can-convert-interface.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* go-can-convert-interface.c -- can we convert to an interface?
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-assert.h"
-#include "go-string.h"
-#include "go-type.h"
-#include "interface.h"
-
-/* Return whether we can convert from the type in FROM_DESCRIPTOR to
-   the interface in TO_DESCRIPTOR.  This is used for type
-   switches.  */
-
-_Bool
-__go_can_convert_to_interface (
-    const struct __go_type_descriptor *to_descriptor,
-    const struct __go_type_descriptor *from_descriptor)
-{
-  const struct __go_interface_type *to_interface;
-  int to_method_count;
-  const struct __go_interface_method *to_method;
-  const struct __go_uncommon_type *from_uncommon;
-  int from_method_count;
-  const struct __go_method *from_method;
-  int i;
-
-  /* In a type switch FROM_DESCRIPTOR can be NULL.  */
-  if (from_descriptor == NULL)
-    return 0;
-
-  __go_assert ((to_descriptor->__code & GO_CODE_MASK) == GO_INTERFACE);
-  to_interface = (const struct __go_interface_type *) to_descriptor;
-  to_method_count = to_interface->__methods.__count;
-  to_method = ((const struct __go_interface_method *)
-	       to_interface->__methods.__values);
-
-  from_uncommon = from_descriptor->__uncommon;
-  if (from_uncommon == NULL)
-    {
-      from_method_count = 0;
-      from_method = NULL;
-    }
-  else
-    {
-      from_method_count = from_uncommon->__methods.__count;
-      from_method = ((const struct __go_method *)
-		     from_uncommon->__methods.__values);
-    }
-
-  for (i = 0; i < to_method_count; ++i)
-    {
-      while (from_method_count > 0
-	     && (!__go_ptr_strings_equal (from_method->__name,
-					  to_method->__name)
-		 || !__go_ptr_strings_equal (from_method->__pkg_path,
-					     to_method->__pkg_path)))
-	{
-	  ++from_method;
-	  --from_method_count;
-	}
-
-      if (from_method_count == 0)
-	return 0;
-
-      if (!__go_type_descriptors_equal (from_method->__mtype,
-					to_method->__type))
-	return 0;
-
-      ++to_method;
-      ++from_method;
-      --from_method_count;
-    }
-
-  return 1;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-cdiv.c b/third_party/gofrontend/libgo/runtime/go-cdiv.c
deleted file mode 100644
index 0355e26..0000000
--- a/third_party/gofrontend/libgo/runtime/go-cdiv.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* go-cdiv.c -- complex division routines
-
-   Copyright 2013 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <complex.h>
-#include <math.h>
-
-/* Calls to these functions are generated by the Go frontend for
-   division of complex64 or complex128.  We use these because Go's
-   complex division expects slightly different results from the GCC
-   default.  When dividing NaN+1.0i / 0+0i, Go expects NaN+NaNi but
-   GCC generates NaN+Infi.  NaN+Infi seems wrong seems the rules of
-   C99 Annex G specify that if either side of a complex number is Inf,
-   the the whole number is Inf, but an operation involving NaN ought
-   to result in NaN, not Inf.  */
-
-complex float
-__go_complex64_div (complex float a, complex float b)
-{
-  if (__builtin_expect (b == 0, 0))
-    {
-      if (!isinf (crealf (a))
-	  && !isinf (cimagf (a))
-	  && (isnan (crealf (a)) || isnan (cimagf (a))))
-	{
-	  /* Pass "1" to nanf to match math/bits.go.  */
-	  return nanf("1") + nanf("1")*I;
-	}
-    }
-  return a / b;
-}
-
-complex double
-__go_complex128_div (complex double a, complex double b)
-{
-  if (__builtin_expect (b == 0, 0))
-    {
-      if (!isinf (creal (a))
-	  && !isinf (cimag (a))
-	  && (isnan (creal (a)) || isnan (cimag (a))))
-	{
-	  /* Pass "1" to nan to match math/bits.go.  */
-	  return nan("1") + nan("1")*I;
-	}
-    }
-  return a / b;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-cgo.c b/third_party/gofrontend/libgo/runtime/go-cgo.c
deleted file mode 100644
index a36eac9..0000000
--- a/third_party/gofrontend/libgo/runtime/go-cgo.c
+++ /dev/null
@@ -1,253 +0,0 @@
-/* go-cgo.c -- SWIG support routines for libgo.
-
-   Copyright 2011 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-alloc.h"
-#include "interface.h"
-#include "go-panic.h"
-#include "go-type.h"
-
-extern void __go_receive (ChanType *, Hchan *, byte *);
-
-/* Prepare to call from code written in Go to code written in C or
-   C++.  This takes the current goroutine out of the Go scheduler, as
-   though it were making a system call.  Otherwise the program can
-   lock up if the C code goes to sleep on a mutex or for some other
-   reason.  This idea is to call this function, then immediately call
-   the C/C++ function.  After the C/C++ function returns, call
-   syscall_cgocalldone.  The usual Go code would look like
-
-       syscall.Cgocall()
-       defer syscall.Cgocalldone()
-       cfunction()
-
-   */
-
-/* We let Go code call these via the syscall package.  */
-void syscall_cgocall(void) __asm__ (GOSYM_PREFIX "syscall.Cgocall");
-void syscall_cgocalldone(void) __asm__ (GOSYM_PREFIX "syscall.CgocallDone");
-void syscall_cgocallback(void) __asm__ (GOSYM_PREFIX "syscall.CgocallBack");
-void syscall_cgocallbackdone(void) __asm__ (GOSYM_PREFIX "syscall.CgocallBackDone");
-
-void
-syscall_cgocall ()
-{
-  M* m;
-  G* g;
-
-  if (runtime_needextram && runtime_cas (&runtime_needextram, 1, 0))
-    runtime_newextram ();
-
-  m = runtime_m ();
-  ++m->ncgocall;
-  g = runtime_g ();
-  ++g->ncgo;
-  runtime_entersyscall ();
-}
-
-/* Prepare to return to Go code from C/C++ code.  */
-
-void
-syscall_cgocalldone ()
-{
-  G* g;
-
-  g = runtime_g ();
-  __go_assert (g != NULL);
-  --g->ncgo;
-  if (g->ncgo == 0)
-    {
-      /* We are going back to Go, and we are not in a recursive call.
-	 Let the garbage collector clean up any unreferenced
-	 memory.  */
-      g->cgomal = NULL;
-    }
-
-  /* If we are invoked because the C function called _cgo_panic, then
-     _cgo_panic will already have exited syscall mode.  */
-  if (g->status == Gsyscall)
-    runtime_exitsyscall ();
-}
-
-/* Call back from C/C++ code to Go code.  */
-
-void
-syscall_cgocallback ()
-{
-  M *mp;
-
-  mp = runtime_m ();
-  if (mp == NULL)
-    {
-      runtime_needm ();
-      mp = runtime_m ();
-      mp->dropextram = true;
-    }
-
-  runtime_exitsyscall ();
-
-  if (runtime_g ()->ncgo == 0)
-    {
-      /* The C call to Go came from a thread not currently running any
-	 Go.  In the case of -buildmode=c-archive or c-shared, this
-	 call may be coming in before package initialization is
-	 complete.  Wait until it is.  */
-      __go_receive (NULL, runtime_main_init_done, NULL);
-    }
-
-  mp = runtime_m ();
-  if (mp->needextram)
-    {
-      mp->needextram = 0;
-      runtime_newextram ();
-    }
-}
-
-/* Prepare to return to C/C++ code from a callback to Go code.  */
-
-void
-syscall_cgocallbackdone ()
-{
-  M *mp;
-
-  runtime_entersyscall ();
-  mp = runtime_m ();
-  if (mp->dropextram && runtime_g ()->ncgo == 0)
-    {
-      mp->dropextram = false;
-      runtime_dropm ();
-    }
-}
-
-/* Allocate memory and save it in a list visible to the Go garbage
-   collector.  */
-
-void *
-alloc_saved (size_t n)
-{
-  void *ret;
-  G *g;
-  CgoMal *c;
-
-  ret = __go_alloc (n);
-
-  g = runtime_g ();
-  c = (CgoMal *) __go_alloc (sizeof (CgoMal));
-  c->next = g->cgomal;
-  c->alloc = ret;
-  g->cgomal = c;
-
-  return ret;
-}
-
-/* These are routines used by SWIG.  The gc runtime library provides
-   the same routines under the same name, though in that case the code
-   is required to import runtime/cgo.  */
-
-void *
-_cgo_allocate (size_t n)
-{
-  void *ret;
-
-  runtime_exitsyscall ();
-  ret = alloc_saved (n);
-  runtime_entersyscall ();
-  return ret;
-}
-
-extern const struct __go_type_descriptor string_type_descriptor
-  __asm__ (GOSYM_PREFIX "__go_tdn_string");
-
-void
-_cgo_panic (const char *p)
-{
-  intgo len;
-  unsigned char *data;
-  String *ps;
-  struct __go_empty_interface e;
-
-  runtime_exitsyscall ();
-  len = __builtin_strlen (p);
-  data = alloc_saved (len);
-  __builtin_memcpy (data, p, len);
-  ps = alloc_saved (sizeof *ps);
-  ps->str = data;
-  ps->len = len;
-  e.__type_descriptor = &string_type_descriptor;
-  e.__object = ps;
-
-  /* We don't call runtime_entersyscall here, because normally what
-     will happen is that we will walk up the stack to a Go deferred
-     function that calls recover.  However, this will do the wrong
-     thing if this panic is recovered and the stack unwinding is
-     caught by a C++ exception handler.  It might be possible to
-     handle this by calling runtime_entersyscall in the personality
-     function in go-unwind.c.  FIXME.  */
-
-  __go_panic (e);
-}
-
-/* Used for _cgo_wait_runtime_init_done.  This is based on code in
-   runtime/cgo/gcc_libinit.c in the master library.  */
-
-static pthread_cond_t runtime_init_cond = PTHREAD_COND_INITIALIZER;
-static pthread_mutex_t runtime_init_mu = PTHREAD_MUTEX_INITIALIZER;
-static _Bool runtime_init_done;
-
-/* This is called by exported cgo functions to ensure that the runtime
-   has been initialized before we enter the function.  This is needed
-   when building with -buildmode=c-archive or similar.  */
-
-void
-_cgo_wait_runtime_init_done (void)
-{
-  int err;
-
-  if (__atomic_load_n (&runtime_init_done, __ATOMIC_ACQUIRE))
-    return;
-
-  err = pthread_mutex_lock (&runtime_init_mu);
-  if (err != 0)
-    abort ();
-  while (!__atomic_load_n (&runtime_init_done, __ATOMIC_ACQUIRE))
-    {
-      err = pthread_cond_wait (&runtime_init_cond, &runtime_init_mu);
-      if (err != 0)
-	abort ();
-    }
-  err = pthread_mutex_unlock (&runtime_init_mu);
-  if (err != 0)
-    abort ();
-}
-
-/* This is called by runtime_main after the Go runtime is
-   initialized.  */
-
-void
-_cgo_notify_runtime_init_done (void)
-{
-  int err;
-
-  err = pthread_mutex_lock (&runtime_init_mu);
-  if (err != 0)
-    abort ();
-  __atomic_store_n (&runtime_init_done, 1, __ATOMIC_RELEASE);
-  err = pthread_cond_broadcast (&runtime_init_cond);
-  if (err != 0)
-    abort ();
-  err = pthread_mutex_unlock (&runtime_init_mu);
-  if (err != 0)
-    abort ();
-}
-
-// runtime_iscgo is set to true if some cgo code is linked in.
-// This is done by a constructor in the cgo generated code.
-_Bool runtime_iscgo;
-
-// runtime_cgoHasExtraM is set on startup when an extra M is created
-// for cgo.  The extra M must be created before any C/C++ code calls
-// cgocallback.
-_Bool runtime_cgoHasExtraM;
diff --git a/third_party/gofrontend/libgo/runtime/go-check-interface.c b/third_party/gofrontend/libgo/runtime/go-check-interface.c
deleted file mode 100644
index 722a421..0000000
--- a/third_party/gofrontend/libgo/runtime/go-check-interface.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* go-check-interface.c -- check an interface type for a conversion
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-panic.h"
-#include "go-type.h"
-#include "interface.h"
-
-/* Check that an interface type matches for a conversion to a
-   non-interface type.  This panics if the types are bad.  The actual
-   extraction of the object is inlined.  */
-
-void
-__go_check_interface_type (
-    const struct __go_type_descriptor *lhs_descriptor,
-    const struct __go_type_descriptor *rhs_descriptor,
-    const struct __go_type_descriptor *rhs_inter_descriptor)
-{
-  if (rhs_descriptor == NULL)
-    {
-      struct __go_empty_interface panic_arg;
-
-      runtime_newTypeAssertionError(NULL, NULL, lhs_descriptor->__reflection,
-				    NULL, &panic_arg);
-      __go_panic(panic_arg);
-    }
-
-  if (lhs_descriptor != rhs_descriptor
-      && !__go_type_descriptors_equal (lhs_descriptor, rhs_descriptor)
-      && ((lhs_descriptor->__code & GO_CODE_MASK) != GO_UNSAFE_POINTER
-	  || !__go_is_pointer_type (rhs_descriptor))
-      && ((rhs_descriptor->__code & GO_CODE_MASK) != GO_UNSAFE_POINTER
-	  || !__go_is_pointer_type (lhs_descriptor)))
-    {
-      struct __go_empty_interface panic_arg;
-
-      runtime_newTypeAssertionError(rhs_inter_descriptor->__reflection,
-				    rhs_descriptor->__reflection,
-				    lhs_descriptor->__reflection,
-				    NULL, &panic_arg);
-      __go_panic(panic_arg);
-    }
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-construct-map.c b/third_party/gofrontend/libgo/runtime/go-construct-map.c
deleted file mode 100644
index 4bd79d2..0000000
--- a/third_party/gofrontend/libgo/runtime/go-construct-map.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* go-construct-map.c -- construct a map from an initializer.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include "runtime.h"
-#include "map.h"
-
-struct __go_map *
-__go_construct_map (const struct __go_map_descriptor *descriptor,
-		    uintptr_t count, uintptr_t entry_size,
-		    uintptr_t val_offset, uintptr_t val_size,
-		    const void *ventries)
-{
-  struct __go_map *ret;
-  const unsigned char *entries;
-  uintptr_t i;
-
-  ret = __go_new_map (descriptor, count);
-
-  entries = (const unsigned char *) ventries;
-  for (i = 0; i < count; ++i)
-    {
-      void *val = __go_map_index (ret, entries, 1);
-      __builtin_memcpy (val, entries + val_offset, val_size);
-      entries += entry_size;
-    }
-
-  return ret;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-convert-interface.c b/third_party/gofrontend/libgo/runtime/go-convert-interface.c
deleted file mode 100644
index 0e8a306..0000000
--- a/third_party/gofrontend/libgo/runtime/go-convert-interface.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/* go-convert-interface.c -- convert interfaces for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-alloc.h"
-#include "go-assert.h"
-#include "go-panic.h"
-#include "go-string.h"
-#include "go-type.h"
-#include "interface.h"
-
-/* This is called when converting one interface type into another
-   interface type.  LHS_DESCRIPTOR is the type descriptor of the
-   resulting interface.  RHS_DESCRIPTOR is the type descriptor of the
-   object being converted.  This builds and returns a new interface
-   method table.  If any method in the LHS_DESCRIPTOR interface is not
-   implemented by the object, the conversion fails.  If the conversion
-   fails, then if MAY_FAIL is true this returns NULL; otherwise, it
-   panics.  */
-
-void *
-__go_convert_interface_2 (const struct __go_type_descriptor *lhs_descriptor,
-			  const struct __go_type_descriptor *rhs_descriptor,
-			  _Bool may_fail)
-{
-  const struct __go_interface_type *lhs_interface;
-  int lhs_method_count;
-  const struct __go_interface_method* lhs_methods;
-  const void **methods;
-  const struct __go_uncommon_type *rhs_uncommon;
-  int rhs_method_count;
-  const struct __go_method *p_rhs_method;
-  int i;
-
-  if (rhs_descriptor == NULL)
-    {
-      /* A nil value always converts to nil.  */
-      return NULL;
-    }
-
-  __go_assert ((lhs_descriptor->__code & GO_CODE_MASK) == GO_INTERFACE);
-  lhs_interface = (const struct __go_interface_type *) lhs_descriptor;
-  lhs_method_count = lhs_interface->__methods.__count;
-  lhs_methods = ((const struct __go_interface_method *)
-		 lhs_interface->__methods.__values);
-
-  /* This should not be called for an empty interface.  */
-  __go_assert (lhs_method_count > 0);
-
-  rhs_uncommon = rhs_descriptor->__uncommon;
-  if (rhs_uncommon == NULL || rhs_uncommon->__methods.__count == 0)
-    {
-      struct __go_empty_interface panic_arg;
-
-      if (may_fail)
-	return NULL;
-
-      runtime_newTypeAssertionError (NULL, rhs_descriptor->__reflection,
-				     lhs_descriptor->__reflection,
-				     lhs_methods[0].__name,
-				     &panic_arg);
-      __go_panic (panic_arg);
-    }
-
-  rhs_method_count = rhs_uncommon->__methods.__count;
-  p_rhs_method = ((const struct __go_method *)
-		  rhs_uncommon->__methods.__values);
-
-  methods = NULL;
-
-  for (i = 0; i < lhs_method_count; ++i)
-    {
-      const struct __go_interface_method *p_lhs_method;
-
-      p_lhs_method = &lhs_methods[i];
-
-      while (rhs_method_count > 0
-	     && (!__go_ptr_strings_equal (p_lhs_method->__name,
-					  p_rhs_method->__name)
-		 || !__go_ptr_strings_equal (p_lhs_method->__pkg_path,
-					     p_rhs_method->__pkg_path)))
-	{
-	  ++p_rhs_method;
-	  --rhs_method_count;
-	}
-
-      if (rhs_method_count == 0
-	  || !__go_type_descriptors_equal (p_lhs_method->__type,
-					   p_rhs_method->__mtype))
-	{
-	  struct __go_empty_interface panic_arg;
-
-	  if (methods != NULL)
-	    __go_free (methods);
-
-	  if (may_fail)
-	    return NULL;
-
-	  runtime_newTypeAssertionError (NULL, rhs_descriptor->__reflection,
-					 lhs_descriptor->__reflection,
-					 p_lhs_method->__name, &panic_arg);
-	  __go_panic (panic_arg);
-	}
-
-      if (methods == NULL)
-	{
-	  methods = (const void **) __go_alloc ((lhs_method_count + 1)
-						* sizeof (void *));
-
-	  /* The first field in the method table is always the type of
-	     the object.  */
-	  methods[0] = rhs_descriptor;
-	}
-
-      methods[i + 1] = p_rhs_method->__function;
-    }
-
-  return methods;
-}
-
-/* This is called by the compiler to convert a value from one
-   interface type to another.  */
-
-void *
-__go_convert_interface (const struct __go_type_descriptor *lhs_descriptor,
-			const struct __go_type_descriptor *rhs_descriptor)
-{
-  return __go_convert_interface_2 (lhs_descriptor, rhs_descriptor, 0);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-copy.c b/third_party/gofrontend/libgo/runtime/go-copy.c
deleted file mode 100644
index 05e16ac..0000000
--- a/third_party/gofrontend/libgo/runtime/go-copy.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* go-append.c -- the go builtin copy function.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-#include <stdint.h>
-
-/* We should be OK if we don't split the stack here, since we are just
-   calling memmove which shouldn't need much stack.  If we don't do
-   this we will always split the stack, because of memmove.  */
-
-extern void
-__go_copy (void *, void *, uintptr_t)
-  __attribute__ ((no_split_stack));
-
-void
-__go_copy (void *a, void *b, uintptr_t len)
-{
-  __builtin_memmove (a, b, len);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-defer.c b/third_party/gofrontend/libgo/runtime/go-defer.c
deleted file mode 100644
index 3a48fe1..0000000
--- a/third_party/gofrontend/libgo/runtime/go-defer.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/* go-defer.c -- manage the defer stack.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-
-#include "runtime.h"
-#include "go-alloc.h"
-#include "go-panic.h"
-#include "go-defer.h"
-
-/* This function is called each time we need to defer a call.  */
-
-void
-__go_defer (_Bool *frame, void (*pfn) (void *), void *arg)
-{
-  G *g;
-  struct __go_defer_stack *n;
-
-  g = runtime_g ();
-  n = runtime_newdefer ();
-  n->__next = g->defer;
-  n->__frame = frame;
-  n->__panic = g->panic;
-  n->__pfn = pfn;
-  n->__arg = arg;
-  n->__retaddr = NULL;
-  n->__makefunc_can_recover = 0;
-  n->__special = 0;
-  g->defer = n;
-}
-
-/* This function is called when we want to undefer the stack.  */
-
-void
-__go_undefer (_Bool *frame)
-{
-  G *g;
-
-  g = runtime_g ();
-  while (g->defer != NULL && g->defer->__frame == frame)
-    {
-      struct __go_defer_stack *d;
-      void (*pfn) (void *);
-
-      d = g->defer;
-      pfn = d->__pfn;
-      d->__pfn = NULL;
-
-      if (pfn != NULL)
-	(*pfn) (d->__arg);
-
-      g->defer = d->__next;
-
-      /* This may be called by a cgo callback routine to defer the
-	 call to syscall.CgocallBackDone, in which case we will not
-	 have a memory context.  Don't try to free anything in that
-	 case--the GC will release it later.  */
-      if (runtime_m () != NULL)
-	runtime_freedefer (d);
-
-      /* Since we are executing a defer function here, we know we are
-	 returning from the calling function.  If the calling
-	 function, or one of its callees, paniced, then the defer
-	 functions would be executed by __go_panic.  */
-      *frame = 1;
-    }
-}
-
-/* This function is called to record the address to which the deferred
-   function returns.  This may in turn be checked by __go_can_recover.
-   The frontend relies on this function returning false.  */
-
-_Bool
-__go_set_defer_retaddr (void *retaddr)
-{
-  G *g;
-
-  g = runtime_g ();
-  if (g->defer != NULL)
-    g->defer->__retaddr = __builtin_extract_return_addr (retaddr);
-  return 0;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-defer.h b/third_party/gofrontend/libgo/runtime/go-defer.h
deleted file mode 100644
index acf2d40..0000000
--- a/third_party/gofrontend/libgo/runtime/go-defer.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* go-defer.h -- the defer stack.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-struct __go_panic_stack;
-
-/* The defer stack is a list of these structures.  */
-
-struct __go_defer_stack
-{
-  /* The next entry in the stack.  */
-  struct __go_defer_stack *__next;
-
-  /* The stack variable for the function which called this defer
-     statement.  This is set to 1 if we are returning from that
-     function, 0 if we are panicing through it.  */
-  _Bool *__frame;
-
-  /* The value of the panic stack when this function is deferred.
-     This function can not recover this value from the panic stack.
-     This can happen if a deferred function has a defer statement
-     itself.  */
-  struct __go_panic_stack *__panic;
-
-  /* The function to call.  */
-  void (*__pfn) (void *);
-
-  /* The argument to pass to the function.  */
-  void *__arg;
-
-  /* The return address that a recover thunk matches against.  This is
-     set by __go_set_defer_retaddr which is called by the thunks
-     created by defer statements.  */
-  const void *__retaddr;
-
-  /* Set to true if a function created by reflect.MakeFunc is
-     permitted to recover.  The return address of such a function
-     function will be somewhere in libffi, so __retaddr is not
-     useful.  */
-  _Bool __makefunc_can_recover;
-
-  /* Set to true if this defer stack entry is not part of the defer
-     pool.  */
-  _Bool __special;
-};
diff --git a/third_party/gofrontend/libgo/runtime/go-deferred-recover.c b/third_party/gofrontend/libgo/runtime/go-deferred-recover.c
deleted file mode 100644
index 78ef287..0000000
--- a/third_party/gofrontend/libgo/runtime/go-deferred-recover.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/* go-deferred-recover.c -- support for a deferred recover function.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-
-#include "runtime.h"
-#include "go-panic.h"
-#include "go-defer.h"
-
-/* This is called when a call to recover is deferred.  That is,
-   something like
-     defer recover()
-
-   We need to handle this specially.  In 6g/8g, the recover function
-   looks up the stack frame.  In particular, that means that a
-   deferred recover will not recover a panic thrown in the same
-   function that defers the recover.  It will only recover a panic
-   thrown in a function that defers the deferred call to recover.
-
-   In other words:
-
-   func f1() {
-	defer recover()	// does not stop panic
-	panic(0)
-   }
-
-   func f2() {
-	defer func() {
-		defer recover()	// stops panic(0)
-	}()
-	panic(0)
-   }
-
-   func f3() {
-	defer func() {
-		defer recover()	// does not stop panic
-		panic(0)
-	}()
-	panic(1)
-   }
-
-   func f4() {
-	defer func() {
-		defer func() {
-			defer recover()	// stops panic(0)
-		}()
-		panic(0)
-	}()
-	panic(1)
-   }
-
-   The interesting case here is f3.  As can be seen from f2, the
-   deferred recover could pick up panic(1).  However, this does not
-   happen because it is blocked by the panic(0).
-
-   When a function calls recover, then when we invoke it we pass a
-   hidden parameter indicating whether it should recover something.
-   This parameter is set based on whether the function is being
-   invoked directly from defer.  The parameter winds up determining
-   whether __go_recover or __go_deferred_recover is called at all.
-
-   In the case of a deferred recover, the hidden parameter which
-   controls the call is actually the one set up for the function which
-   runs the defer recover() statement.  That is the right thing in all
-   the cases above except for f3.  In f3 the function is permitted to
-   call recover, but the deferred recover call is not.  We address
-   that here by checking for that specific case before calling
-   recover.  If this function was deferred when there is already a
-   panic on the panic stack, then we can only recover that panic, not
-   any other.
-
-   Note that we can get away with using a special function here
-   because you are not permitted to take the address of a predeclared
-   function like recover.  */
-
-struct __go_empty_interface
-__go_deferred_recover ()
-{
-  G *g;
-
-  g = runtime_g ();
-  if (g->defer == NULL || g->defer->__panic != g->panic)
-    {
-      struct __go_empty_interface ret;
-
-      ret.__type_descriptor = NULL;
-      ret.__object = NULL;
-      return ret;
-    }
-  return __go_recover ();
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-eface-compare.c b/third_party/gofrontend/libgo/runtime/go-eface-compare.c
deleted file mode 100644
index 40b716e..0000000
--- a/third_party/gofrontend/libgo/runtime/go-eface-compare.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* go-eface-compare.c -- compare two empty values.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-type.h"
-#include "interface.h"
-
-/* Compare two interface values.  Return 0 for equal, not zero for not
-   equal (return value is like strcmp).  */
-
-intgo
-__go_empty_interface_compare (struct __go_empty_interface left,
-			      struct __go_empty_interface right)
-{
-  const struct __go_type_descriptor *left_descriptor;
-
-  left_descriptor = left.__type_descriptor;
-
-  if (left_descriptor == NULL && right.__type_descriptor == NULL)
-    return 0;
-  if (left_descriptor == NULL || right.__type_descriptor == NULL)
-    return 1;
-  if (!__go_type_descriptors_equal (left_descriptor,
-				    right.__type_descriptor))
-    return 1;
-  if (__go_is_pointer_type (left_descriptor))
-    return left.__object == right.__object ? 0 : 1;
-  if (!__go_call_equalfn (left_descriptor->__equalfn, left.__object,
-			  right.__object, left_descriptor->__size))
-    return 1;
-  return 0;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-eface-val-compare.c b/third_party/gofrontend/libgo/runtime/go-eface-val-compare.c
deleted file mode 100644
index e810750..0000000
--- a/third_party/gofrontend/libgo/runtime/go-eface-val-compare.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* go-eface-val-compare.c -- compare an empty interface with a value.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-type.h"
-#include "interface.h"
-
-/* Compare an empty interface with a value.  Return 0 for equal, not
-   zero for not equal (return value is like strcmp).  */
-
-intgo
-__go_empty_interface_value_compare (
-    struct __go_empty_interface left,
-    const struct __go_type_descriptor *right_descriptor,
-    const void *val)
-{
-  const struct __go_type_descriptor *left_descriptor;
-
-  left_descriptor = left.__type_descriptor;
-  if (left_descriptor == NULL)
-    return 1;
-  if (!__go_type_descriptors_equal (left_descriptor, right_descriptor))
-    return 1;
-  if (__go_is_pointer_type (left_descriptor))
-    return left.__object == val ? 0 : 1;
-  if (!__go_call_equalfn (left_descriptor->__equalfn, left.__object, val,
-			  left_descriptor->__size))
-    return 1;
-  return 0;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-ffi.c b/third_party/gofrontend/libgo/runtime/go-ffi.c
deleted file mode 100644
index aafc7b2..0000000
--- a/third_party/gofrontend/libgo/runtime/go-ffi.c
+++ /dev/null
@@ -1,346 +0,0 @@
-/* go-ffi.c -- convert Go type description to libffi.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include "runtime.h"
-#include "go-alloc.h"
-#include "go-assert.h"
-#include "go-type.h"
-
-#ifdef USE_LIBFFI
-
-#include "ffi.h"
-
-/* The functions in this file are only called from reflect_call and
-   reflect.ffi.  As these functions call libffi functions, which will
-   be compiled without -fsplit-stack, they will always run with a
-   large stack.  */
-
-static ffi_type *go_array_to_ffi (const struct __go_array_type *)
-  __attribute__ ((no_split_stack));
-static ffi_type *go_slice_to_ffi (const struct __go_slice_type *)
-  __attribute__ ((no_split_stack));
-static ffi_type *go_struct_to_ffi (const struct __go_struct_type *)
-  __attribute__ ((no_split_stack));
-static ffi_type *go_string_to_ffi (void) __attribute__ ((no_split_stack));
-static ffi_type *go_interface_to_ffi (void) __attribute__ ((no_split_stack));
-static ffi_type *go_type_to_ffi (const struct __go_type_descriptor *)
-  __attribute__ ((no_split_stack));
-static ffi_type *go_func_return_ffi (const struct __go_func_type *)
-  __attribute__ ((no_split_stack));
-
-/* Return an ffi_type for a Go array type.  The libffi library does
-   not have any builtin support for passing arrays as values.  We work
-   around this by pretending that the array is a struct.  */
-
-static ffi_type *
-go_array_to_ffi (const struct __go_array_type *descriptor)
-{
-  ffi_type *ret;
-  uintptr_t len;
-  ffi_type *element;
-  uintptr_t i;
-
-  ret = (ffi_type *) __go_alloc (sizeof (ffi_type));
-  ret->type = FFI_TYPE_STRUCT;
-  len = descriptor->__len;
-  if (len == 0)
-    {
-      /* The libffi library won't accept an empty struct.  */
-      ret->elements = (ffi_type **) __go_alloc (2 * sizeof (ffi_type *));
-      ret->elements[0] = &ffi_type_void;
-      ret->elements[1] = NULL;
-      return ret;
-    }
-  ret->elements = (ffi_type **) __go_alloc ((len + 1) * sizeof (ffi_type *));
-  element = go_type_to_ffi (descriptor->__element_type);
-  for (i = 0; i < len; ++i)
-    ret->elements[i] = element;
-  ret->elements[len] = NULL;
-  return ret;
-}
-
-/* Return an ffi_type for a Go slice type.  This describes the
-   __go_open_array type defines in array.h.  */
-
-static ffi_type *
-go_slice_to_ffi (
-    const struct __go_slice_type *descriptor __attribute__ ((unused)))
-{
-  ffi_type *ret;
-  ffi_type *ffi_intgo;
-
-  ret = (ffi_type *) __go_alloc (sizeof (ffi_type));
-  ret->type = FFI_TYPE_STRUCT;
-  ret->elements = (ffi_type **) __go_alloc (4 * sizeof (ffi_type *));
-  ret->elements[0] = &ffi_type_pointer;
-  ffi_intgo = sizeof (intgo) == 4 ? &ffi_type_sint32 : &ffi_type_sint64;
-  ret->elements[1] = ffi_intgo;
-  ret->elements[2] = ffi_intgo;
-  ret->elements[3] = NULL;
-  return ret;
-}
-
-/* Return an ffi_type for a Go struct type.  */
-
-static ffi_type *
-go_struct_to_ffi (const struct __go_struct_type *descriptor)
-{
-  ffi_type *ret;
-  int field_count;
-  const struct __go_struct_field *fields;
-  int i;
-
-  field_count = descriptor->__fields.__count;
-  ret = (ffi_type *) __go_alloc (sizeof (ffi_type));
-  ret->type = FFI_TYPE_STRUCT;
-  if (field_count == 0)
-    {
-      /* The libffi library won't accept an empty struct.  */
-      ret->elements = (ffi_type **) __go_alloc (2 * sizeof (ffi_type *));
-      ret->elements[0] = &ffi_type_void;
-      ret->elements[1] = NULL;
-      return ret;
-    }
-  fields = (const struct __go_struct_field *) descriptor->__fields.__values;
-  ret->elements = (ffi_type **) __go_alloc ((field_count + 1)
-					    * sizeof (ffi_type *));
-  for (i = 0; i < field_count; ++i)
-    ret->elements[i] = go_type_to_ffi (fields[i].__type);
-  ret->elements[field_count] = NULL;
-  return ret;
-}
-
-/* Return an ffi_type for a Go string type.  This describes the String
-   struct.  */
-
-static ffi_type *
-go_string_to_ffi (void)
-{
-  ffi_type *ret;
-  ffi_type *ffi_intgo;
-
-  ret = (ffi_type *) __go_alloc (sizeof (ffi_type));
-  ret->type = FFI_TYPE_STRUCT;
-  ret->elements = (ffi_type **) __go_alloc (3 * sizeof (ffi_type *));
-  ret->elements[0] = &ffi_type_pointer;
-  ffi_intgo = sizeof (intgo) == 4 ? &ffi_type_sint32 : &ffi_type_sint64;
-  ret->elements[1] = ffi_intgo;
-  ret->elements[2] = NULL;
-  return ret;
-}
-
-/* Return an ffi_type for a Go interface type.  This describes the
-   __go_interface and __go_empty_interface structs.  */
-
-static ffi_type *
-go_interface_to_ffi (void)
-{
-  ffi_type *ret;
-
-  ret = (ffi_type *) __go_alloc (sizeof (ffi_type));
-  ret->type = FFI_TYPE_STRUCT;
-  ret->elements = (ffi_type **) __go_alloc (3 * sizeof (ffi_type *));
-  ret->elements[0] = &ffi_type_pointer;
-  ret->elements[1] = &ffi_type_pointer;
-  ret->elements[2] = NULL;
-  return ret;
-}
-
-
-#ifndef FFI_TARGET_HAS_COMPLEX_TYPE
-/* If libffi hasn't been updated for this target to support complex,
-   pretend complex is a structure.  Warning: This does not work for
-   all ABIs.  Eventually libffi should be updated for all targets
-   and this should go away.  */
-
-static ffi_type *go_complex_to_ffi (ffi_type *)
-  __attribute__ ((no_split_stack));
-
-static ffi_type *
-go_complex_to_ffi (ffi_type *float_type)
-{
-  ffi_type *ret;
-
-  ret = (ffi_type *) __go_alloc (sizeof (ffi_type));
-  ret->type = FFI_TYPE_STRUCT;
-  ret->elements = (ffi_type **) __go_alloc (3 * sizeof (ffi_type *));
-  ret->elements[0] = float_type;
-  ret->elements[1] = float_type;
-  ret->elements[2] = NULL;
-  return ret;
-}
-#endif
-
-/* Return an ffi_type for a type described by a
-   __go_type_descriptor.  */
-
-static ffi_type *
-go_type_to_ffi (const struct __go_type_descriptor *descriptor)
-{
-  switch (descriptor->__code & GO_CODE_MASK)
-    {
-    case GO_BOOL:
-      if (sizeof (_Bool) == 1)
-	return &ffi_type_uint8;
-      else if (sizeof (_Bool) == sizeof (int))
-	return &ffi_type_uint;
-      abort ();
-    case GO_FLOAT32:
-      if (sizeof (float) == 4)
-	return &ffi_type_float;
-      abort ();
-    case GO_FLOAT64:
-      if (sizeof (double) == 8)
-	return &ffi_type_double;
-      abort ();
-    case GO_COMPLEX64:
-      if (sizeof (float) == 4)
-	{
-#ifdef FFI_TARGET_HAS_COMPLEX_TYPE
-	  return &ffi_type_complex_float;
-#else
-	  return go_complex_to_ffi (&ffi_type_float);
-#endif
-	}
-      abort ();
-    case GO_COMPLEX128:
-      if (sizeof (double) == 8)
-	{
-#ifdef FFI_TARGET_HAS_COMPLEX_TYPE
-	  return &ffi_type_complex_double;
-#else
-	  return go_complex_to_ffi (&ffi_type_double);
-#endif
-	}
-      abort ();
-    case GO_INT16:
-      return &ffi_type_sint16;
-    case GO_INT32:
-      return &ffi_type_sint32;
-    case GO_INT64:
-      return &ffi_type_sint64;
-    case GO_INT8:
-      return &ffi_type_sint8;
-    case GO_INT:
-      return sizeof (intgo) == 4 ? &ffi_type_sint32 : &ffi_type_sint64;
-    case GO_UINT16:
-      return &ffi_type_uint16;
-    case GO_UINT32:
-      return &ffi_type_uint32;
-    case GO_UINT64:
-      return &ffi_type_uint64;
-    case GO_UINT8:
-      return &ffi_type_uint8;
-    case GO_UINT:
-      return sizeof (uintgo) == 4 ? &ffi_type_uint32 : &ffi_type_uint64;
-    case GO_UINTPTR:
-      if (sizeof (void *) == 2)
-	return &ffi_type_uint16;
-      else if (sizeof (void *) == 4)
-	return &ffi_type_uint32;
-      else if (sizeof (void *) == 8)
-	return &ffi_type_uint64;
-      abort ();
-    case GO_ARRAY:
-      return go_array_to_ffi ((const struct __go_array_type *) descriptor);
-    case GO_SLICE:
-      return go_slice_to_ffi ((const struct __go_slice_type *) descriptor);
-    case GO_STRUCT:
-      return go_struct_to_ffi ((const struct __go_struct_type *) descriptor);
-    case GO_STRING:
-      return go_string_to_ffi ();
-    case GO_INTERFACE:
-      return go_interface_to_ffi ();
-    case GO_CHAN:
-    case GO_FUNC:
-    case GO_MAP:
-    case GO_PTR:
-    case GO_UNSAFE_POINTER:
-      /* These types are always pointers, and for FFI purposes nothing
-	 else matters.  */
-      return &ffi_type_pointer;
-    default:
-      abort ();
-    }
-}
-
-/* Return the return type for a function, given the number of out
-   parameters and their types.  */
-
-static ffi_type *
-go_func_return_ffi (const struct __go_func_type *func)
-{
-  int count;
-  const struct __go_type_descriptor **types;
-  ffi_type *ret;
-  int i;
-
-  count = func->__out.__count;
-  if (count == 0)
-    return &ffi_type_void;
-
-  types = (const struct __go_type_descriptor **) func->__out.__values;
-
-  if (count == 1)
-    return go_type_to_ffi (types[0]);
-
-  ret = (ffi_type *) __go_alloc (sizeof (ffi_type));
-  ret->type = FFI_TYPE_STRUCT;
-  ret->elements = (ffi_type **) __go_alloc ((count + 1) * sizeof (ffi_type *));
-  for (i = 0; i < count; ++i)
-    ret->elements[i] = go_type_to_ffi (types[i]);
-  ret->elements[count] = NULL;
-  return ret;
-}
-
-/* Build an ffi_cif structure for a function described by a
-   __go_func_type structure.  */
-
-void
-__go_func_to_cif (const struct __go_func_type *func, _Bool is_interface,
-		_Bool is_method, ffi_cif *cif)
-{
-  int num_params;
-  const struct __go_type_descriptor **in_types;
-  size_t num_args;
-  ffi_type **args;
-  int off;
-  int i;
-  ffi_type *rettype;
-  ffi_status status;
-
-  num_params = func->__in.__count;
-  in_types = ((const struct __go_type_descriptor **)
-	      func->__in.__values);
-
-  num_args = num_params + (is_interface ? 1 : 0);
-  args = (ffi_type **) __go_alloc (num_args * sizeof (ffi_type *));
-  i = 0;
-  off = 0;
-  if (is_interface)
-    {
-      args[0] = &ffi_type_pointer;
-      off = 1;
-    }
-  else if (is_method)
-    {
-      args[0] = &ffi_type_pointer;
-      i = 1;
-    }
-  for (; i < num_params; ++i)
-    args[i + off] = go_type_to_ffi (in_types[i]);
-
-  rettype = go_func_return_ffi (func);
-
-  status = ffi_prep_cif (cif, FFI_DEFAULT_ABI, num_args, rettype, args);
-  __go_assert (status == FFI_OK);
-}
-
-#endif /* defined(USE_LIBFFI) */
diff --git a/third_party/gofrontend/libgo/runtime/go-ffi.h b/third_party/gofrontend/libgo/runtime/go-ffi.h
deleted file mode 100644
index afae4b6..0000000
--- a/third_party/gofrontend/libgo/runtime/go-ffi.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/* go-ffi.c -- convert Go type description to libffi.
-
-   Copyright 2014 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "config.h"
-#include "go-type.h"
-
-#ifdef USE_LIBFFI
-
-#include "ffi.h"
-
-void __go_func_to_cif (const struct __go_func_type *, _Bool, _Bool, ffi_cif *);
-
-#endif
diff --git a/third_party/gofrontend/libgo/runtime/go-fieldtrack.c b/third_party/gofrontend/libgo/runtime/go-fieldtrack.c
deleted file mode 100644
index a7e2c13..0000000
--- a/third_party/gofrontend/libgo/runtime/go-fieldtrack.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* go-fieldtrack.c -- structure field data analysis.
-
-   Copyright 2012 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-type.h"
-#include "map.h"
-
-/* The compiler will track fields that have the tag go:"track".  Any
-   function that refers to such a field will call this function with a
-   string
-       fieldtrack "package.type.field"
-
-   This function does not actually do anything.  Instead, we gather
-   the field tracking information by looking for strings of that form
-   in the read-only data section.  This is, of course, a horrible
-   hack, but it's good enough for now.  We can improve it, e.g., by a
-   linker plugin, if this turns out to be useful.  */
-
-void
-__go_fieldtrack (byte *p __attribute__ ((unused)))
-{
-}
-
-/* A runtime function to add all the tracked fields to a
-   map[string]bool.  */
-
-extern const char _etext[] __attribute__ ((weak));
-extern const char __etext[] __attribute__ ((weak));
-extern const char __data_start[] __attribute__ ((weak));
-extern const char _edata[] __attribute__ ((weak));
-extern const char __edata[] __attribute__ ((weak));
-extern const char __bss_start[] __attribute__ ((weak));
-
-void runtime_Fieldtrack (struct __go_map *) __asm__ (GOSYM_PREFIX "runtime.Fieldtrack");
-
-void
-runtime_Fieldtrack (struct __go_map *m)
-{
-  const char *p;
-  const char *pend;
-  const char *prefix;
-  size_t prefix_len;
-
-  p = __data_start;
-  if (p == NULL)
-    p = __etext;
-  if (p == NULL)
-    p = _etext;
-  if (p == NULL)
-    return;
-
-  pend = __edata;
-  if (pend == NULL)
-    pend = _edata;
-  if (pend == NULL)
-    pend = __bss_start;
-  if (pend == NULL)
-    return;
-
-  prefix = "fieldtrack ";
-  prefix_len = __builtin_strlen (prefix);
-
-  while (p < pend)
-    {
-      const char *q1;
-      const char *q2;
-
-      q1 = __builtin_memchr (p + prefix_len, '"', pend - (p + prefix_len));
-      if (q1 == NULL)
-	break;
-
-      if (__builtin_memcmp (q1 - prefix_len, prefix, prefix_len) != 0)
-	{
-	  p = q1 + 1;
-	  continue;
-	}
-
-      q1++;
-      q2 = __builtin_memchr (q1, '"', pend - q1);
-      if (q2 == NULL)
-	break;
-
-      if (__builtin_memchr (q1, '\0', q2 - q1) == NULL)
-	{
-	  String s;
-	  void *v;
-	  _Bool *pb;
-
-	  s.str = (const byte *) q1;
-	  s.len = q2 - q1;
-	  v = __go_map_index (m, &s, 1);
-	  pb = (_Bool *) v;
-	  *pb = 1;
-	}
-
-      p = q2;
-    }
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-iface.goc b/third_party/gofrontend/libgo/runtime/go-iface.goc
deleted file mode 100644
index 0d5cb5e..0000000
--- a/third_party/gofrontend/libgo/runtime/go-iface.goc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime
-#include "runtime.h"
-#include "go-type.h"
-#include "interface.h"
-
-typedef struct __go_type_descriptor descriptor;
-typedef const struct __go_type_descriptor const_descriptor;
-typedef struct __go_interface interface;
-typedef struct __go_empty_interface empty_interface;
-
-// Compare two type descriptors.
-func ifacetypeeq(a *descriptor, b *descriptor) (eq bool) {
-	eq = __go_type_descriptors_equal(a, b);
-}
-
-// Return the descriptor for an empty interface type.n
-func efacetype(e empty_interface) (d *const_descriptor) {
-	return e.__type_descriptor;
-}
-
-// Return the descriptor for a non-empty interface type.
-func ifacetype(i interface) (d *const_descriptor) {
-	if (i.__methods == nil) {
-		return nil;
-	}
-	d = i.__methods[0];
-}
-
-// Convert an empty interface to an empty interface.
-func ifaceE2E2(e empty_interface) (ret empty_interface, ok bool) {
-	ret = e;
-	ok = ret.__type_descriptor != nil;
-}
-
-// Convert a non-empty interface to an empty interface.
-func ifaceI2E2(i interface) (ret empty_interface, ok bool) {
-	if (i.__methods == nil) {
-		ret.__type_descriptor = nil;
-		ret.__object = nil;
-		ok = 0;
-	} else {
-		ret.__type_descriptor = i.__methods[0];
-		ret.__object = i.__object;
-		ok = 1;
-	}
-}
-
-// Convert an empty interface to a non-empty interface.
-func ifaceE2I2(inter *descriptor, e empty_interface) (ret interface, ok bool) {
-	if (e.__type_descriptor == nil) {
-		ret.__methods = nil;
-		ret.__object = nil;
-		ok = 0;
-	} else {
-		ret.__methods = __go_convert_interface_2(inter,
-							 e.__type_descriptor,
-							 1);
-		ret.__object = e.__object;
-		ok = ret.__methods != nil;
-	}
-}
-
-// Convert a non-empty interface to a non-empty interface.
-func ifaceI2I2(inter *descriptor, i interface) (ret interface, ok bool) {
-	if (i.__methods == nil) {
-		ret.__methods = nil;
-		ret.__object = nil;
-		ok = 0;
-	} else {
-		ret.__methods = __go_convert_interface_2(inter,
-							 i.__methods[0], 1);
-		ret.__object = i.__object;
-		ok = ret.__methods != nil;
-	}
-}
-
-// Convert an empty interface to a pointer type.
-func ifaceE2T2P(inter *descriptor, e empty_interface) (ret *void, ok bool) {
-	if (!__go_type_descriptors_equal(inter, e.__type_descriptor)) {
-		ret = nil;
-		ok = 0;
-	} else {
-		ret = e.__object;
-		ok = 1;
-	}
-}
-
-// Convert a non-empty interface to a pointer type.
-func ifaceI2T2P(inter *descriptor, i interface) (ret *void, ok bool) {
-	if (i.__methods == nil
-	    || !__go_type_descriptors_equal(inter, i.__methods[0])) {
-		ret = nil;
-		ok = 0;
-	} else {
-		ret = i.__object;
-		ok = 1;
-	}
-}
-
-// Convert an empty interface to a non-pointer type.
-func ifaceE2T2(inter *descriptor, e empty_interface, ret *void) (ok bool) {
-	if (!__go_type_descriptors_equal(inter, e.__type_descriptor)) {
-		__builtin_memset(ret, 0, inter->__size);
-		ok = 0;
-	} else {
-		__builtin_memcpy(ret, e.__object, inter->__size);
-		ok = 1;
-	}
-}
-
-// Convert a non-empty interface to a non-pointer type.
-func ifaceI2T2(inter *descriptor, i interface, ret *void) (ok bool) {
-	if (i.__methods == nil
-	    || !__go_type_descriptors_equal(inter, i.__methods[0])) {
-		__builtin_memset(ret, 0, inter->__size);
-		ok = 0;
-	} else {
-		__builtin_memcpy(ret, i.__object, inter->__size);
-		ok = 1;
-	}
-}
-
-// Return whether we can convert an interface to a type.
-func ifaceI2Tp(to *descriptor, from *descriptor) (ok bool) {
-	ok = __go_can_convert_to_interface(to, from);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-int-array-to-string.c b/third_party/gofrontend/libgo/runtime/go-int-array-to-string.c
deleted file mode 100644
index f372131..0000000
--- a/third_party/gofrontend/libgo/runtime/go-int-array-to-string.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* go-int-array-to-string.c -- convert an array of ints to a string in Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "go-assert.h"
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-String
-__go_int_array_to_string (const void* p, intgo len)
-{
-  const int32 *ints;
-  intgo slen;
-  intgo i;
-  unsigned char *retdata;
-  String ret;
-  unsigned char *s;
-
-  ints = (const int32 *) p;
-
-  slen = 0;
-  for (i = 0; i < len; ++i)
-    {
-      int32 v;
-
-      v = ints[i];
-
-      if (v < 0 || v > 0x10ffff)
-	v = 0xfffd;
-      else if (0xd800 <= v && v <= 0xdfff)
-	v = 0xfffd;
-
-      if (v <= 0x7f)
-	slen += 1;
-      else if (v <= 0x7ff)
-	slen += 2;
-      else if (v <= 0xffff)
-	slen += 3;
-      else
-	slen += 4;
-    }
-
-  retdata = runtime_mallocgc ((uintptr) slen, 0, FlagNoScan);
-  ret.str = retdata;
-  ret.len = slen;
-
-  s = retdata;
-  for (i = 0; i < len; ++i)
-    {
-      int32 v;
-
-      v = ints[i];
-
-      /* If V is out of range for UTF-8, substitute the replacement
-	 character.  */
-      if (v < 0 || v > 0x10ffff)
-	v = 0xfffd;
-      else if (0xd800 <= v && v <= 0xdfff)
-	v = 0xfffd;
-
-      if (v <= 0x7f)
-	*s++ = v;
-      else if (v <= 0x7ff)
-	{
-	  *s++ = 0xc0 | ((v >> 6) & 0x1f);
-	  *s++ = 0x80 | (v & 0x3f);
-	}
-      else if (v <= 0xffff)
-	{
-	  *s++ = 0xe0 | ((v >> 12) & 0xf);
-	  *s++ = 0x80 | ((v >> 6) & 0x3f);
-	  *s++ = 0x80 | (v & 0x3f);
-	}
-      else
-	{
-	  *s++ = 0xf0 | ((v >> 18) & 0x7);
-	  *s++ = 0x80 | ((v >> 12) & 0x3f);
-	  *s++ = 0x80 | ((v >> 6) & 0x3f);
-	  *s++ = 0x80 | (v & 0x3f);
-	}
-    }
-
-  __go_assert (s - retdata == slen);
-
-  return ret;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-int-to-string.c b/third_party/gofrontend/libgo/runtime/go-int-to-string.c
deleted file mode 100644
index d90b1dd..0000000
--- a/third_party/gofrontend/libgo/runtime/go-int-to-string.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* go-int-to-string.c -- convert an integer to a string in Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-String
-__go_int_to_string (intgo v)
-{
-  char buf[4];
-  int len;
-  unsigned char *retdata;
-  String ret;
-
-  /* A negative value is not valid UTF-8; turn it into the replacement
-     character.  */
-  if (v < 0)
-    v = 0xfffd;
-
-  if (v <= 0x7f)
-    {
-      buf[0] = v;
-      len = 1;
-    }
-  else if (v <= 0x7ff)
-    {
-      buf[0] = 0xc0 + (v >> 6);
-      buf[1] = 0x80 + (v & 0x3f);
-      len = 2;
-    }
-  else
-    {
-      /* If the value is out of range for UTF-8, turn it into the
-	 "replacement character".  */
-      if (v > 0x10ffff)
-	v = 0xfffd;
-      /* If the value is a surrogate pair, which is invalid in UTF-8,
-	 turn it into the replacement character.  */
-      if (v >= 0xd800 && v < 0xe000)
-	v = 0xfffd;
-
-      if (v <= 0xffff)
-	{
-	  buf[0] = 0xe0 + (v >> 12);
-	  buf[1] = 0x80 + ((v >> 6) & 0x3f);
-	  buf[2] = 0x80 + (v & 0x3f);
-	  len = 3;
-	}
-      else
-	{
-	  buf[0] = 0xf0 + (v >> 18);
-	  buf[1] = 0x80 + ((v >> 12) & 0x3f);
-	  buf[2] = 0x80 + ((v >> 6) & 0x3f);
-	  buf[3] = 0x80 + (v & 0x3f);
-	  len = 4;
-	}
-    }
-
-  retdata = runtime_mallocgc (len, 0, FlagNoScan);
-  __builtin_memcpy (retdata, buf, len);
-  ret.str = retdata;
-  ret.len = len;
-
-  return ret;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-interface-compare.c b/third_party/gofrontend/libgo/runtime/go-interface-compare.c
deleted file mode 100644
index 1d36775..0000000
--- a/third_party/gofrontend/libgo/runtime/go-interface-compare.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* go-interface-compare.c -- compare two interface values.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-
-#include "runtime.h"
-#include "go-type.h"
-#include "interface.h"
-
-/* Compare two interface values.  Return 0 for equal, not zero for not
-   equal (return value is like strcmp).  */
-
-int
-__go_interface_compare (struct __go_interface left,
-			struct __go_interface right)
-{
-  const struct __go_type_descriptor *left_descriptor;
-
-  if (left.__methods == NULL && right.__methods == NULL)
-    return 0;
-  if (left.__methods == NULL || right.__methods == NULL)
-    return 1;
-  left_descriptor = left.__methods[0];
-  if (!__go_type_descriptors_equal (left_descriptor, right.__methods[0]))
-    return 1;
-  if (__go_is_pointer_type (left_descriptor))
-    return left.__object == right.__object ? 0 : 1;
-  if (!__go_call_equalfn (left_descriptor->__equalfn, left.__object,
-			  right.__object, left_descriptor->__size))
-    return 1;
-  return 0;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-interface-eface-compare.c b/third_party/gofrontend/libgo/runtime/go-interface-eface-compare.c
deleted file mode 100644
index d1e6fd0..0000000
--- a/third_party/gofrontend/libgo/runtime/go-interface-eface-compare.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* go-interface-eface-compare.c -- compare non-empty and empty interface.
-
-   Copyright 2011 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-type.h"
-#include "interface.h"
-
-/* Compare a non-empty interface value with an empty interface value.
-   Return 0 for equal, not zero for not equal (return value is like
-   strcmp).  */
-
-intgo
-__go_interface_empty_compare (struct __go_interface left,
-			      struct __go_empty_interface right)
-{
-  const struct __go_type_descriptor *left_descriptor;
-
-  if (left.__methods == NULL && right.__type_descriptor == NULL)
-    return 0;
-  if (left.__methods == NULL || right.__type_descriptor == NULL)
-    return 1;
-  left_descriptor = left.__methods[0];
-  if (!__go_type_descriptors_equal (left_descriptor, right.__type_descriptor))
-    return 1;
-  if (__go_is_pointer_type (left_descriptor))
-    return left.__object == right.__object ? 0 : 1;
-  if (!__go_call_equalfn (left_descriptor->__equalfn, left.__object,
-			  right.__object, left_descriptor->__size))
-    return 1;
-  return 0;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-interface-val-compare.c b/third_party/gofrontend/libgo/runtime/go-interface-val-compare.c
deleted file mode 100644
index 36b6efd..0000000
--- a/third_party/gofrontend/libgo/runtime/go-interface-val-compare.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* go-interface-val-compare.c -- compare an interface to a value.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-type.h"
-#include "interface.h"
-
-/* Compare two interface values.  Return 0 for equal, not zero for not
-   equal (return value is like strcmp).  */
-
-intgo
-__go_interface_value_compare (
-    struct __go_interface left,
-    const struct __go_type_descriptor *right_descriptor,
-    const void *val)
-{
-  const struct __go_type_descriptor *left_descriptor;
-
-  if (left.__methods == NULL)
-    return 1;
-  left_descriptor = left.__methods[0];
-  if (!__go_type_descriptors_equal (left_descriptor, right_descriptor))
-    return 1;
-  if (__go_is_pointer_type (left_descriptor))
-    return left.__object == val ? 0 : 1;
-  if (!__go_call_equalfn (left_descriptor->__equalfn, left.__object, val,
-			  left_descriptor->__size))
-    return 1;
-  return 0;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-libmain.c b/third_party/gofrontend/libgo/runtime/go-libmain.c
deleted file mode 100644
index f578aab..0000000
--- a/third_party/gofrontend/libgo/runtime/go-libmain.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* go-libmain.c -- the startup function for a Go library.
-
-   Copyright 2015 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "config.h"
-
-#include <errno.h>
-#include <pthread.h>
-#include <stdlib.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "runtime.h"
-#include "go-alloc.h"
-#include "array.h"
-#include "arch.h"
-#include "malloc.h"
-
-/* This is used when building a standalone Go library using the Go
-   command's -buildmode=c-archive or -buildmode=c-shared option.  It
-   starts up the Go code as a global constructor but does not take any
-   other action.  The main program is written in some other language
-   and calls exported Go functions as needed.  */
-
-static void die (const char *, int);
-static void initfn (int, char **, char **);
-static void *gostart (void *);
-
-/* Used to pass arguments to the thread that runs the Go startup.  */
-
-struct args {
-  int argc;
-  char **argv;
-};
-
-/* We use .init_array so that we can get the command line arguments.
-   This obviously assumes .init_array support; different systems may
-   require other approaches.  */
-
-typedef void (*initarrayfn) (int, char **, char **);
-
-static initarrayfn initarray[1]
-__attribute__ ((section (".init_array"), used)) =
-  { initfn };
-
-/* This function is called at program startup time.  It starts a new
-   thread to do the actual Go startup, so that program startup is not
-   paused waiting for the Go initialization functions.  Exported cgo
-   functions will wait for initialization to complete if
-   necessary.  */
-
-static void
-initfn (int argc, char **argv, char** env __attribute__ ((unused)))
-{
-  int err;
-  pthread_attr_t attr;
-  struct args *a;
-  pthread_t tid;
-
-  a = (struct args *) malloc (sizeof *a);
-  if (a == NULL)
-    die ("malloc", errno);
-  a->argc = argc;
-  a->argv = argv;
-
-  err = pthread_attr_init (&attr);
-  if (err != 0)
-    die ("pthread_attr_init", err);
-  err = pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
-  if (err != 0)
-    die ("pthread_attr_setdetachstate", err);
-
-  err = pthread_create (&tid, &attr, gostart, (void *) a);
-  if (err != 0)
-    die ("pthread_create", err);
-
-  err = pthread_attr_destroy (&attr);
-  if (err != 0)
-    die ("pthread_attr_destroy", err);
-}
-
-/* Start up the Go runtime.  */
-
-static void *
-gostart (void *arg)
-{
-  struct args *a = (struct args *) arg;
-
-  runtime_isarchive = true;
-
-  if (runtime_isstarted)
-    return NULL;
-  runtime_isstarted = true;
-
-  runtime_check ();
-  runtime_args (a->argc, (byte **) a->argv);
-  runtime_osinit ();
-  runtime_schedinit ();
-  __go_go (runtime_main, NULL);
-  runtime_mstart (runtime_m ());
-  abort ();
-}
-
-/* If something goes wrong during program startup, crash.  There is no
-   way to report failure and nobody to whom to report it.  */
-
-static void
-die (const char *fn, int err)
-{
-  fprintf (stderr, "%s: %d\n", fn, err);
-  exit (EXIT_FAILURE);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-main.c b/third_party/gofrontend/libgo/runtime/go-main.c
deleted file mode 100644
index 026469b..0000000
--- a/third_party/gofrontend/libgo/runtime/go-main.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* go-main.c -- the main function for a Go program.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <time.h>
-#include <unistd.h>
-
-#ifdef HAVE_FPU_CONTROL_H
-#include <fpu_control.h>
-#endif
-
-#include "runtime.h"
-#include "go-alloc.h"
-#include "array.h"
-#include "arch.h"
-#include "malloc.h"
-
-#undef int
-#undef char
-#undef unsigned
-
-/* The main function for a Go program.  This records the command line
-   parameters, calls the real main function, and returns a zero status
-   if the real main function returns.  */
-
-extern char **environ;
-
-/* The main function.  */
-
-int
-main (int argc, char **argv)
-{
-  runtime_isarchive = false;
-
-  if (runtime_isstarted)
-    return 0;
-  runtime_isstarted = true;
-
-  runtime_check ();
-  runtime_args (argc, (byte **) argv);
-  runtime_osinit ();
-  runtime_schedinit ();
-  __go_go (runtime_main, NULL);
-  runtime_mstart (runtime_m ());
-  abort ();
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-make-slice.c b/third_party/gofrontend/libgo/runtime/go-make-slice.c
deleted file mode 100644
index ccd07e5..0000000
--- a/third_party/gofrontend/libgo/runtime/go-make-slice.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/* go-make-slice.c -- make a slice.
-
-   Copyright 2011 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stdint.h>
-
-#include "runtime.h"
-#include "go-alloc.h"
-#include "go-assert.h"
-#include "go-panic.h"
-#include "go-type.h"
-#include "array.h"
-#include "arch.h"
-#include "malloc.h"
-
-/* Dummy word to use as base pointer for make([]T, 0).
-   Since you cannot take the address of such a slice,
-   you can't tell that they all have the same base pointer.  */
-uintptr runtime_zerobase;
-
-struct __go_open_array
-__go_make_slice2 (const struct __go_type_descriptor *td, uintptr_t len,
-		  uintptr_t cap)
-{
-  const struct __go_slice_type* std;
-  intgo ilen;
-  intgo icap;
-  uintptr_t size;
-  struct __go_open_array ret;
-
-  __go_assert ((td->__code & GO_CODE_MASK) == GO_SLICE);
-  std = (const struct __go_slice_type *) td;
-
-  ilen = (intgo) len;
-  if (ilen < 0
-      || (uintptr_t) ilen != len
-      || (std->__element_type->__size > 0
-	  && len > MaxMem / std->__element_type->__size))
-    runtime_panicstring ("makeslice: len out of range");
-
-  icap = (intgo) cap;
-  if (cap < len
-      || (uintptr_t) icap != cap
-      || (std->__element_type->__size > 0
-	  && cap > MaxMem / std->__element_type->__size))
-    runtime_panicstring ("makeslice: cap out of range");
-
-  ret.__count = ilen;
-  ret.__capacity = icap;
-
-  size = cap * std->__element_type->__size;
-
-  if (size == 0)
-    ret.__values = &runtime_zerobase;
-  else if ((std->__element_type->__code & GO_NO_POINTERS) != 0)
-    ret.__values =
-      runtime_mallocgc (size,
-			(uintptr) std->__element_type | TypeInfo_Array,
-			FlagNoScan);
-  else
-    ret.__values =
-      runtime_mallocgc (size,
-			(uintptr) std->__element_type | TypeInfo_Array,
-			0);
-
-  return ret;
-}
-
-struct __go_open_array
-__go_make_slice1 (const struct __go_type_descriptor *td, uintptr_t len)
-{
-  return __go_make_slice2 (td, len, len);
-}
-
-struct __go_open_array
-__go_make_slice2_big (const struct __go_type_descriptor *td, uint64_t len,
-		      uint64_t cap)
-{
-  uintptr_t slen;
-  uintptr_t scap;
-
-  slen = (uintptr_t) len;
-  if ((uint64_t) slen != len)
-    runtime_panicstring ("makeslice: len out of range");
-
-  scap = (uintptr_t) cap;
-  if ((uint64_t) scap != cap)
-    runtime_panicstring ("makeslice: cap out of range");
-
-  return __go_make_slice2 (td, slen, scap);
-}
-
-struct __go_open_array
-__go_make_slice1_big (const struct __go_type_descriptor *td, uint64_t len)
-{
-  return __go_make_slice2_big (td, len, len);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-map-delete.c b/third_party/gofrontend/libgo/runtime/go-map-delete.c
deleted file mode 100644
index fb7c331..0000000
--- a/third_party/gofrontend/libgo/runtime/go-map-delete.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* go-map-delete.c -- delete an entry from a map.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-#include <stdlib.h>
-
-#include "runtime.h"
-#include "malloc.h"
-#include "go-alloc.h"
-#include "go-assert.h"
-#include "map.h"
-
-/* Delete the entry matching KEY from MAP.  */
-
-void
-__go_map_delete (struct __go_map *map, const void *key)
-{
-  const struct __go_map_descriptor *descriptor;
-  const struct __go_type_descriptor *key_descriptor;
-  uintptr_t key_offset;
-  const FuncVal *equalfn;
-  size_t key_hash;
-  size_t key_size;
-  size_t bucket_index;
-  void **pentry;
-
-  if (map == NULL)
-    return;
-
-  descriptor = map->__descriptor;
-
-  key_descriptor = descriptor->__map_descriptor->__key_type;
-  key_offset = descriptor->__key_offset;
-  key_size = key_descriptor->__size;
-  if (key_size == 0)
-    return;
-
-  __go_assert (key_size != -1UL);
-  equalfn = key_descriptor->__equalfn;
-
-  key_hash = __go_call_hashfn (key_descriptor->__hashfn, key, key_size);
-  bucket_index = key_hash % map->__bucket_count;
-
-  pentry = map->__buckets + bucket_index;
-  while (*pentry != NULL)
-    {
-      char *entry = (char *) *pentry;
-      if (__go_call_equalfn (equalfn, key, entry + key_offset, key_size))
-	{
-	  *pentry = *(void **) entry;
-	  if (descriptor->__entry_size >= TinySize)
-	    __go_free (entry);
-	  map->__element_count -= 1;
-	  break;
-	}
-      pentry = (void **) entry;
-    }
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-map-index.c b/third_party/gofrontend/libgo/runtime/go-map-index.c
deleted file mode 100644
index 353041d..0000000
--- a/third_party/gofrontend/libgo/runtime/go-map-index.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/* go-map-index.c -- find or insert an entry in a map.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-#include <stdlib.h>
-
-#include "runtime.h"
-#include "malloc.h"
-#include "go-alloc.h"
-#include "go-assert.h"
-#include "map.h"
-
-/* Rehash MAP to a larger size.  */
-
-static void
-__go_map_rehash (struct __go_map *map)
-{
-  const struct __go_map_descriptor *descriptor;
-  const struct __go_type_descriptor *key_descriptor;
-  uintptr_t key_offset;
-  size_t key_size;
-  const FuncVal *hashfn;
-  uintptr_t old_bucket_count;
-  void **old_buckets;
-  uintptr_t new_bucket_count;
-  void **new_buckets;
-  uintptr_t i;
-
-  descriptor = map->__descriptor;
-
-  key_descriptor = descriptor->__map_descriptor->__key_type;
-  key_offset = descriptor->__key_offset;
-  key_size = key_descriptor->__size;
-  hashfn = key_descriptor->__hashfn;
-
-  old_bucket_count = map->__bucket_count;
-  old_buckets = map->__buckets;
-
-  new_bucket_count = __go_map_next_prime (old_bucket_count * 2);
-  new_buckets = (void **) __go_alloc (new_bucket_count * sizeof (void *));
-  __builtin_memset (new_buckets, 0, new_bucket_count * sizeof (void *));
-
-  for (i = 0; i < old_bucket_count; ++i)
-    {
-      char* entry;
-      char* next;
-
-      for (entry = old_buckets[i]; entry != NULL; entry = next)
-	{
-	  size_t key_hash;
-	  size_t new_bucket_index;
-
-	  /* We could speed up rehashing at the cost of memory space
-	     by caching the hash code.  */
-	  key_hash = __go_call_hashfn (hashfn, entry + key_offset, key_size);
-	  new_bucket_index = key_hash % new_bucket_count;
-
-	  next = *(char **) entry;
-	  *(char **) entry = new_buckets[new_bucket_index];
-	  new_buckets[new_bucket_index] = entry;
-	}
-    }
-
-  if (old_bucket_count * sizeof (void *) >= TinySize)
-    __go_free (old_buckets);
-
-  map->__bucket_count = new_bucket_count;
-  map->__buckets = new_buckets;
-}
-
-/* Find KEY in MAP, return a pointer to the value.  If KEY is not
-   present, then if INSERT is false, return NULL, and if INSERT is
-   true, insert a new value and zero-initialize it before returning a
-   pointer to it.  */
-
-void *
-__go_map_index (struct __go_map *map, const void *key, _Bool insert)
-{
-  const struct __go_map_descriptor *descriptor;
-  const struct __go_type_descriptor *key_descriptor;
-  uintptr_t key_offset;
-  const FuncVal *equalfn;
-  size_t key_hash;
-  size_t key_size;
-  size_t bucket_index;
-  char *entry;
-
-  if (map == NULL)
-    {
-      if (insert)
-	runtime_panicstring ("assignment to entry in nil map");
-      return NULL;
-    }
-
-  descriptor = map->__descriptor;
-
-  key_descriptor = descriptor->__map_descriptor->__key_type;
-  key_offset = descriptor->__key_offset;
-  key_size = key_descriptor->__size;
-  __go_assert (key_size != -1UL);
-  equalfn = key_descriptor->__equalfn;
-
-  key_hash = __go_call_hashfn (key_descriptor->__hashfn, key, key_size);
-  bucket_index = key_hash % map->__bucket_count;
-
-  entry = (char *) map->__buckets[bucket_index];
-  while (entry != NULL)
-    {
-      if (__go_call_equalfn (equalfn, key, entry + key_offset, key_size))
-	return entry + descriptor->__val_offset;
-      entry = *(char **) entry;
-    }
-
-  if (!insert)
-    return NULL;
-
-  if (map->__element_count >= map->__bucket_count)
-    {
-      __go_map_rehash (map);
-      bucket_index = key_hash % map->__bucket_count;
-    }
-
-  entry = (char *) __go_alloc (descriptor->__entry_size);
-  __builtin_memset (entry, 0, descriptor->__entry_size);
-
-  __builtin_memcpy (entry + key_offset, key, key_size);
-
-  *(char **) entry = map->__buckets[bucket_index];
-  map->__buckets[bucket_index] = entry;
-
-  map->__element_count += 1;
-
-  return entry + descriptor->__val_offset;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-map-len.c b/third_party/gofrontend/libgo/runtime/go-map-len.c
deleted file mode 100644
index 7da10c2..0000000
--- a/third_party/gofrontend/libgo/runtime/go-map-len.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* go-map-len.c -- return the length of a map.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-
-#include "runtime.h"
-#include "go-assert.h"
-#include "map.h"
-
-/* Return the length of a map.  This could be done inline, of course,
-   but I'm doing it as a function for now to make it easy to change
-   the map structure.  */
-
-intgo
-__go_map_len (struct __go_map *map)
-{
-  if (map == NULL)
-    return 0;
-  __go_assert (map->__element_count
-	       == (uintptr_t) (intgo) map->__element_count);
-  return map->__element_count;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-map-range.c b/third_party/gofrontend/libgo/runtime/go-map-range.c
deleted file mode 100644
index 5dbb92c..0000000
--- a/third_party/gofrontend/libgo/runtime/go-map-range.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* go-map-range.c -- implement a range clause over a map.
-
-   Copyright 2009, 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-assert.h"
-#include "map.h"
-
-/* Initialize a range over a map.  */
-
-void
-__go_mapiterinit (const struct __go_map *h, struct __go_hash_iter *it)
-{
-  it->entry = NULL;
-  if (h != NULL)
-    {
-      it->map = h;
-      it->next_entry = NULL;
-      it->bucket = 0;
-      --it->bucket;
-      __go_mapiternext(it);
-    }
-}
-
-/* Move to the next iteration, updating *HITER.  */
-
-void
-__go_mapiternext (struct __go_hash_iter *it)
-{
-  const void *entry;
-
-  entry = it->next_entry;
-  if (entry == NULL)
-    {
-      const struct __go_map *map;
-      uintptr_t bucket;
-
-      map = it->map;
-      bucket = it->bucket;
-      while (1)
-	{
-	  ++bucket;
-	  if (bucket >= map->__bucket_count)
-	    {
-	      /* Map iteration is complete.  */
-	      it->entry = NULL;
-	      return;
-	    }
-	  entry = map->__buckets[bucket];
-	  if (entry != NULL)
-	    break;
-	}
-      it->bucket = bucket;
-    }
-  it->entry = entry;
-  it->next_entry = *(const void * const *) entry;
-}
-
-/* Get the key of the current iteration.  */
-
-void
-__go_mapiter1 (struct __go_hash_iter *it, unsigned char *key)
-{
-  const struct __go_map *map;
-  const struct __go_map_descriptor *descriptor;
-  const struct __go_type_descriptor *key_descriptor;
-  const char *p;
-
-  map = it->map;
-  descriptor = map->__descriptor;
-  key_descriptor = descriptor->__map_descriptor->__key_type;
-  p = it->entry;
-  __go_assert (p != NULL);
-  __builtin_memcpy (key, p + descriptor->__key_offset, key_descriptor->__size);
-}
-
-/* Get the key and value of the current iteration.  */
-
-void
-__go_mapiter2 (struct __go_hash_iter *it, unsigned char *key,
-	       unsigned char *val)
-{
-  const struct __go_map *map;
-  const struct __go_map_descriptor *descriptor;
-  const struct __go_map_type *map_descriptor;
-  const struct __go_type_descriptor *key_descriptor;
-  const struct __go_type_descriptor *val_descriptor;
-  const char *p;
-
-  map = it->map;
-  descriptor = map->__descriptor;
-  map_descriptor = descriptor->__map_descriptor;
-  key_descriptor = map_descriptor->__key_type;
-  val_descriptor = map_descriptor->__val_type;
-  p = it->entry;
-  __go_assert (p != NULL);
-  __builtin_memcpy (key, p + descriptor->__key_offset,
-		    key_descriptor->__size);
-  __builtin_memcpy (val, p + descriptor->__val_offset,
-		    val_descriptor->__size);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-matherr.c b/third_party/gofrontend/libgo/runtime/go-matherr.c
deleted file mode 100644
index d620ba0..0000000
--- a/third_party/gofrontend/libgo/runtime/go-matherr.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/* go-matherr.c -- a Go version of the matherr function.
-
-   Copyright 2012 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-/* The gccgo version of the math library calls libc functions.  On
-   some systems, such as Solaris, those functions will call matherr on
-   exceptional conditions.  This is a version of matherr appropriate
-   for Go, one which returns the values that the Go math library
-   expects.  This is fine for pure Go programs.  For mixed Go and C
-   programs this will be problematic if the C programs themselves use
-   matherr.  Normally the C version of matherr will override this, and
-   the Go code will just have to cope.  If this turns out to be too
-   problematic we can change to run pure Go code in the math library
-   on systems that use matherr.  */
-
-#include <math.h>
-#include <stdint.h>
-
-#include "config.h"
-
-#if defined(HAVE_MATHERR) && defined(HAVE_STRUCT_EXCEPTION)
-
-#define PI 3.14159265358979323846264338327950288419716939937510582097494459
-
-int
-matherr (struct exception* e)
-{
-  const char *n;
-
-  if (e->type != DOMAIN)
-    return 0;
-
-  n = e->name;
-  if (__builtin_strcmp (n, "acos") == 0
-      || __builtin_strcmp (n, "asin") == 0)
-    e->retval = __builtin_nan ("");
-  else if (__builtin_strcmp (n, "atan2") == 0)
-    {
-      if (e->arg1 == 0 && e->arg2 == 0)
-	{
-	  double nz;
-
-	  nz = -0.0;
-	  if (__builtin_memcmp (&e->arg2, &nz, sizeof (double)) != 0)
-	    e->retval = e->arg1;
-	  else
-	    e->retval = copysign (PI, e->arg1);
-	}
-      else
-	return 0;
-    }
-  else if (__builtin_strcmp (n, "log") == 0
-	   || __builtin_strcmp (n, "log10") == 0)
-    e->retval = __builtin_nan ("");
-  else if (__builtin_strcmp (n, "pow") == 0)
-    {
-      if (e->arg1 < 0)
-	e->retval = __builtin_nan ("");
-      else if (e->arg1 == 0 && e->arg2 == 0)
-	e->retval = 1.0;
-      else if (e->arg1 == 0 && e->arg2 < 0)
-	{
-	  double i;
-
-	  if (modf (e->arg2, &i) == 0 && ((int64_t) i & 1) == 1)
-	    e->retval = copysign (__builtin_inf (), e->arg1);
-	  else
-	    e->retval = __builtin_inf ();
-	}
-      else
-	return 0;
-    }
-  else if (__builtin_strcmp (n, "sqrt") == 0)
-    {
-      if (e->arg1 < 0)
-	e->retval = __builtin_nan ("");
-      else
-	return 0;
-    }
-  else
-    return 0;
-
-  return 1;
-}
-
-#endif
diff --git a/third_party/gofrontend/libgo/runtime/go-memcmp.c b/third_party/gofrontend/libgo/runtime/go-memcmp.c
deleted file mode 100644
index 78a356b..0000000
--- a/third_party/gofrontend/libgo/runtime/go-memcmp.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* go-memcmp.c -- the go memory comparison function.
-
-   Copyright 2012 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-
-intgo
-__go_memcmp (const void *p1, const void *p2, uintptr len)
-{
-  return __builtin_memcmp (p1, p2, len);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-nanotime.c b/third_party/gofrontend/libgo/runtime/go-nanotime.c
deleted file mode 100644
index 7e5e3e0..0000000
--- a/third_party/gofrontend/libgo/runtime/go-nanotime.c
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Return current time in nanoseconds.
-
-#include <sys/time.h>
-
-#include "runtime.h"
-
-int64 runtime_nanotime (void)
-  __attribute__ ((no_split_stack));
-
-int64
-runtime_nanotime (void)
-{
-  struct timeval tv;
-
-  gettimeofday (&tv, NULL);
-  return (int64) tv.tv_sec * 1000000000 + (int64) tv.tv_usec * 1000;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-new-map.c b/third_party/gofrontend/libgo/runtime/go-new-map.c
deleted file mode 100644
index c289bc0..0000000
--- a/third_party/gofrontend/libgo/runtime/go-new-map.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* go-new-map.c -- allocate a new map.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-alloc.h"
-#include "map.h"
-
-/* List of prime numbers, copied from libstdc++/src/hashtable.c.  */
-
-static const unsigned long prime_list[] = /* 256 + 1 or 256 + 48 + 1 */
-{
-  2ul, 3ul, 5ul, 7ul, 11ul, 13ul, 17ul, 19ul, 23ul, 29ul, 31ul,
-  37ul, 41ul, 43ul, 47ul, 53ul, 59ul, 61ul, 67ul, 71ul, 73ul, 79ul,
-  83ul, 89ul, 97ul, 103ul, 109ul, 113ul, 127ul, 137ul, 139ul, 149ul,
-  157ul, 167ul, 179ul, 193ul, 199ul, 211ul, 227ul, 241ul, 257ul,
-  277ul, 293ul, 313ul, 337ul, 359ul, 383ul, 409ul, 439ul, 467ul,
-  503ul, 541ul, 577ul, 619ul, 661ul, 709ul, 761ul, 823ul, 887ul,
-  953ul, 1031ul, 1109ul, 1193ul, 1289ul, 1381ul, 1493ul, 1613ul,
-  1741ul, 1879ul, 2029ul, 2179ul, 2357ul, 2549ul, 2753ul, 2971ul,
-  3209ul, 3469ul, 3739ul, 4027ul, 4349ul, 4703ul, 5087ul, 5503ul,
-  5953ul, 6427ul, 6949ul, 7517ul, 8123ul, 8783ul, 9497ul, 10273ul,
-  11113ul, 12011ul, 12983ul, 14033ul, 15173ul, 16411ul, 17749ul,
-  19183ul, 20753ul, 22447ul, 24281ul, 26267ul, 28411ul, 30727ul,
-  33223ul, 35933ul, 38873ul, 42043ul, 45481ul, 49201ul, 53201ul,
-  57557ul, 62233ul, 67307ul, 72817ul, 78779ul, 85229ul, 92203ul,
-  99733ul, 107897ul, 116731ul, 126271ul, 136607ul, 147793ul,
-  159871ul, 172933ul, 187091ul, 202409ul, 218971ul, 236897ul,
-  256279ul, 277261ul, 299951ul, 324503ul, 351061ul, 379787ul,
-  410857ul, 444487ul, 480881ul, 520241ul, 562841ul, 608903ul,
-  658753ul, 712697ul, 771049ul, 834181ul, 902483ul, 976369ul,
-  1056323ul, 1142821ul, 1236397ul, 1337629ul, 1447153ul, 1565659ul,
-  1693859ul, 1832561ul, 1982627ul, 2144977ul, 2320627ul, 2510653ul,
-  2716249ul, 2938679ul, 3179303ul, 3439651ul, 3721303ul, 4026031ul,
-  4355707ul, 4712381ul, 5098259ul, 5515729ul, 5967347ul, 6456007ul,
-  6984629ul, 7556579ul, 8175383ul, 8844859ul, 9569143ul, 10352717ul,
-  11200489ul, 12117689ul, 13109983ul, 14183539ul, 15345007ul,
-  16601593ul, 17961079ul, 19431899ul, 21023161ul, 22744717ul,
-  24607243ul, 26622317ul, 28802401ul, 31160981ul, 33712729ul,
-  36473443ul, 39460231ul, 42691603ul, 46187573ul, 49969847ul,
-  54061849ul, 58488943ul, 63278561ul, 68460391ul, 74066549ul,
-  80131819ul, 86693767ul, 93793069ul, 101473717ul, 109783337ul,
-  118773397ul, 128499677ul, 139022417ul, 150406843ul, 162723577ul,
-  176048909ul, 190465427ul, 206062531ul, 222936881ul, 241193053ul,
-  260944219ul, 282312799ul, 305431229ul, 330442829ul, 357502601ul,
-  386778277ul, 418451333ul, 452718089ul, 489790921ul, 529899637ul,
-  573292817ul, 620239453ul, 671030513ul, 725980837ul, 785430967ul,
-  849749479ul, 919334987ul, 994618837ul, 1076067617ul, 1164186217ul,
-  1259520799ul, 1362662261ul, 1474249943ul, 1594975441ul, 1725587117ul,
-  1866894511ul, 2019773507ul, 2185171673ul, 2364114217ul, 2557710269ul,
-  2767159799ul, 2993761039ul, 3238918481ul, 3504151727ul, 3791104843ul,
-  4101556399ul, 4294967291ul,
-#if __SIZEOF_LONG__ >= 8
-  6442450933ul, 8589934583ul, 12884901857ul, 17179869143ul,
-  25769803693ul, 34359738337ul, 51539607367ul, 68719476731ul,
-  103079215087ul, 137438953447ul, 206158430123ul, 274877906899ul,
-  412316860387ul, 549755813881ul, 824633720731ul, 1099511627689ul,
-  1649267441579ul, 2199023255531ul, 3298534883309ul, 4398046511093ul,
-  6597069766607ul, 8796093022151ul, 13194139533241ul, 17592186044399ul,
-  26388279066581ul, 35184372088777ul, 52776558133177ul, 70368744177643ul,
-  105553116266399ul, 140737488355213ul, 211106232532861ul, 281474976710597ul,
-  562949953421231ul, 1125899906842597ul, 2251799813685119ul,
-  4503599627370449ul, 9007199254740881ul, 18014398509481951ul,
-  36028797018963913ul, 72057594037927931ul, 144115188075855859ul,
-  288230376151711717ul, 576460752303423433ul,
-  1152921504606846883ul, 2305843009213693951ul,
-  4611686018427387847ul, 9223372036854775783ul,
-  18446744073709551557ul
-#endif
-};
-
-/* Return the next number from PRIME_LIST >= N.  */
-
-uintptr_t
-__go_map_next_prime (uintptr_t n)
-{
-  size_t low;
-  size_t high;
-
-  low = 0;
-  high = sizeof prime_list / sizeof prime_list[0];
-  while (low < high)
-    {
-      size_t mid;
-
-      mid = (low + high) / 2;
-
-      /* Here LOW <= MID < HIGH.  */
-
-      if (prime_list[mid] < n)
-	low = mid + 1;
-      else if (prime_list[mid] > n)
-	high = mid;
-      else
-	return n;
-    }
-  if (low >= sizeof prime_list / sizeof prime_list[0])
-    return n;
-  return prime_list[low];
-}
-
-/* Allocate a new map.  */
-
-struct __go_map *
-__go_new_map (const struct __go_map_descriptor *descriptor, uintptr_t entries)
-{
-  int32 ientries;
-  struct __go_map *ret;
-
-  /* The master library limits map entries to int32, so we do too.  */
-  ientries = (int32) entries;
-  if (ientries < 0 || (uintptr_t) ientries != entries)
-    runtime_panicstring ("map size out of range");
-
-  if (entries == 0)
-    entries = 5;
-  else
-    entries = __go_map_next_prime (entries);
-  ret = (struct __go_map *) __go_alloc (sizeof (struct __go_map));
-  ret->__descriptor = descriptor;
-  ret->__element_count = 0;
-  ret->__bucket_count = entries;
-  ret->__buckets = (void **) __go_alloc (entries * sizeof (void *));
-  __builtin_memset (ret->__buckets, 0, entries * sizeof (void *));
-  return ret;
-}
-
-/* Allocate a new map when the argument to make is a large type.  */
-
-struct __go_map *
-__go_new_map_big (const struct __go_map_descriptor *descriptor,
-		  uint64_t entries)
-{
-  uintptr_t sentries;
-
-  sentries = (uintptr_t) entries;
-  if ((uint64_t) sentries != entries)
-    runtime_panicstring ("map size out of range");
-  return __go_new_map (descriptor, sentries);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-new.c b/third_party/gofrontend/libgo/runtime/go-new.c
deleted file mode 100644
index 01bc2af..0000000
--- a/third_party/gofrontend/libgo/runtime/go-new.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* go-new.c -- the generic go new() function.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "go-alloc.h"
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-#include "go-type.h"
-
-void *
-__go_new (const struct __go_type_descriptor *td, uintptr_t size)
-{
-  return runtime_mallocgc (size,
-			   (uintptr) td | TypeInfo_SingleObject,
-			   td->__code & GO_NO_POINTERS ? FlagNoScan : 0);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-nosys.c b/third_party/gofrontend/libgo/runtime/go-nosys.c
deleted file mode 100644
index 0a94de0..0000000
--- a/third_party/gofrontend/libgo/runtime/go-nosys.c
+++ /dev/null
@@ -1,450 +0,0 @@
-/* go-nosys.c -- functions missing from system.
-
-   Copyright 2012 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-/* This file exists to provide definitions for functions that are
-   missing from libc, according to the configure script.  This permits
-   the Go syscall package to not worry about whether the functions
-   exist or not.  */
-
-#include "config.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <math.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <time.h>
-#include <unistd.h>
-
-#ifndef HAVE_OFF64_T
-typedef signed int off64_t __attribute__ ((mode (DI)));
-#endif
-
-#ifndef HAVE_LOFF_T
-typedef off64_t loff_t;
-#endif
-
-#ifndef HAVE_ACCEPT4
-struct sockaddr;
-int
-accept4 (int sockfd __attribute__ ((unused)),
-	 struct sockaddr *addr __attribute__ ((unused)),
-	 socklen_t *addrlen __attribute__ ((unused)),
-	 int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_DUP3
-int
-dup3 (int oldfd __attribute__ ((unused)),
-      int newfd __attribute__ ((unused)),
-      int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_EPOLL_CREATE1
-int
-epoll_create1 (int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_FACCESSAT
-int
-faccessat (int fd __attribute__ ((unused)),
-	   const char *pathname __attribute__ ((unused)),
-	   int mode __attribute__ ((unused)),
-	   int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_FALLOCATE
-int
-fallocate (int fd __attribute__ ((unused)),
-	   int mode __attribute__ ((unused)),
-	   off_t offset __attribute__ ((unused)),
-	   off_t len __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_FCHMODAT
-int
-fchmodat (int dirfd __attribute__ ((unused)),
-	  const char *pathname __attribute__ ((unused)),
-	  mode_t mode __attribute__ ((unused)),
-	  int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_FCHOWNAT
-int
-fchownat (int dirfd __attribute__ ((unused)),
-	  const char *pathname __attribute__ ((unused)),
-	  uid_t owner __attribute__ ((unused)),
-	  gid_t group __attribute__ ((unused)),
-	  int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_FUTIMESAT
-int
-futimesat (int dirfd __attribute__ ((unused)),
-	   const char *pathname __attribute__ ((unused)),
-	   const struct timeval times[2] __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_GETXATTR
-ssize_t
-getxattr (const char *path __attribute__ ((unused)),
-	  const char *name __attribute__ ((unused)),
-	  void *value __attribute__ ((unused)),
-	  size_t size __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_INOTIFY_ADD_WATCH
-int
-inotify_add_watch (int fd __attribute__ ((unused)),
-		   const char* pathname __attribute__ ((unused)),
-		   uint32_t mask __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_INOTIFY_INIT
-int
-inotify_init (void)
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_INOTIFY_INIT1
-int
-inotify_init1 (int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_INOTIFY_RM_WATCH
-int
-inotify_rm_watch (int fd __attribute__ ((unused)),
-		  uint32_t wd __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_LISTXATTR
-ssize_t
-listxattr (const char *path __attribute__ ((unused)),
-	   char *list __attribute__ ((unused)),
-	   size_t size __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_MKDIRAT
-int
-mkdirat (int dirfd __attribute__ ((unused)),
-	 const char *pathname __attribute__ ((unused)),
-	 mode_t mode __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_MKNODAT
-int
-mknodat (int dirfd __attribute__ ((unused)),
-	 const char *pathname __attribute__ ((unused)),
-	 mode_t mode __attribute__ ((unused)),
-	 dev_t dev __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_OPENAT
-int
-openat (int dirfd __attribute__ ((unused)),
-	const char *pathname __attribute__ ((unused)),
-	int oflag __attribute__ ((unused)),
-	...)
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_PIPE2
-int
-pipe2 (int pipefd[2] __attribute__ ((unused)),
-       int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_REMOVEXATTR
-int
-removexattr (const char *path __attribute__ ((unused)),
-	     const char *name __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_RENAMEAT
-int
-renameat (int olddirfd __attribute__ ((unused)),
-	  const char *oldpath __attribute__ ((unused)),
-	  int newdirfd __attribute__ ((unused)),
-	  const char *newpath __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_SETXATTR
-int
-setxattr (const char *path __attribute__ ((unused)),
-	  const char *name __attribute__ ((unused)),
-	  const void *value __attribute__ ((unused)),
-	  size_t size __attribute__ ((unused)),
-	  int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_SPLICE
-int
-splice (int fd __attribute__ ((unused)),
-	loff_t *off_in __attribute__ ((unused)),
-	int fd_out __attribute__ ((unused)),
-	loff_t *off_out __attribute__ ((unused)),
-	size_t len __attribute__ ((unused)),
-	unsigned int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_SYNC_FILE_RANGE
-int
-sync_file_range (int fd __attribute__ ((unused)),
-		 off64_t offset __attribute__ ((unused)),
-		 off64_t nbytes __attribute__ ((unused)),
-		 unsigned int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_TEE
-int
-tee (int fd_in __attribute__ ((unused)),
-     int fd_out __attribute__ ((unused)),
-     size_t len __attribute__ ((unused)),
-     unsigned int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_UNLINKAT
-int
-unlinkat (int dirfd __attribute__ ((unused)),
-	  const char *pathname __attribute__ ((unused)),
-	  int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_UNSHARE
-int
-unshare (int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-#ifndef HAVE_UTIMENSAT
-struct timespec;
-int
-utimensat(int dirfd __attribute__ ((unused)),
-	  const char *pathname __attribute__ ((unused)),
-	  const struct timespec times[2] __attribute__ ((unused)),
-	  int flags __attribute__ ((unused)))
-{
-  errno = ENOSYS;
-  return -1;
-}
-#endif
-
-/* Long double math functions.  These are needed on old i386 systems
-   that don't have them in libm.  The compiler translates calls to
-   these functions on float64 to call an 80-bit floating point
-   function instead, because when optimizing that function can be
-   executed as an x87 instructure.  However, when not optimizing, this
-   translates into a call to the math function.  So on systems that
-   don't provide these functions, we provide a version that just calls
-   the float64 version.  */
-
-#ifndef HAVE_COSL
-long double
-cosl (long double a)
-{
-  return (long double) cos ((double) a);
-}
-#endif
-
-#ifndef HAVE_EXPL
-long double
-expl (long double a)
-{
-  return (long double) exp ((double) a);
-}
-#endif
-
-#ifndef HAVE_LOGL
-long double
-logl (long double a)
-{
-  return (long double) log ((double) a);
-}
-#endif
-
-#ifndef HAVE_SINL
-long double
-sinl (long double a)
-{
-  return (long double) sin ((double) a);
-}
-#endif
-
-#ifndef HAVE_TANL
-long double
-tanl (long double a)
-{
-  return (long double) tan ((double) a);
-}
-#endif
-
-#ifndef HAVE_ACOSL
-long double
-acosl (long double a)
-{
-  return (long double) acos ((double) a);
-}
-#endif
-
-#ifndef HAVE_ASINL
-long double
-asinl (long double a)
-{
-  return (long double) asin ((double) a);
-}
-#endif
-
-#ifndef HAVE_ATANL
-long double
-atanl (long double a)
-{
-  return (long double) atan ((double) a);
-}
-#endif
-
-#ifndef HAVE_ATAN2L
-long double
-atan2l (long double a, long double b)
-{
-  return (long double) atan2 ((double) a, (double) b);
-}
-#endif
-
-#ifndef HAVE_EXPM1L
-long double
-expm1l (long double a)
-{
-  return (long double) expm1 ((double) a);
-}
-#endif
-
-#ifndef HAVE_LDEXPL
-long double
-ldexpl (long double a, int exp)
-{
-  return (long double) ldexp ((double) a, exp);
-}
-#endif
-
-#ifndef HAVE_LOG10L
-long double
-log10l (long double a)
-{
-  return (long double) log10 ((double) a);
-}
-#endif
-
-#ifndef HAVE_LOG1PL
-long double
-log1pl (long double a)
-{
-  return (long double) log1p ((double) a);
-}
-#endif
diff --git a/third_party/gofrontend/libgo/runtime/go-now.c b/third_party/gofrontend/libgo/runtime/go-now.c
deleted file mode 100644
index d24e6ee..0000000
--- a/third_party/gofrontend/libgo/runtime/go-now.c
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-#include <sys/time.h>
-
-#include "runtime.h"
-
-// Return current time.  This is the implementation of time.now().
-
-struct time_now_ret
-now()
-{
-  struct timespec ts;
-  struct time_now_ret ret;
-
-  clock_gettime (CLOCK_REALTIME, &ts);
-  ret.sec = ts.tv_sec;
-  ret.nsec = ts.tv_nsec;
-  return ret;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-panic.c b/third_party/gofrontend/libgo/runtime/go-panic.c
deleted file mode 100644
index 77975c6..0000000
--- a/third_party/gofrontend/libgo/runtime/go-panic.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/* go-panic.c -- support for the go panic function.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-#include "go-alloc.h"
-#include "go-defer.h"
-#include "go-panic.h"
-#include "interface.h"
-
-/* Print the panic stack.  This is used when there is no recover.  */
-
-static void
-__printpanics (struct __go_panic_stack *p)
-{
-  if (p->__next != NULL)
-    {
-      __printpanics (p->__next);
-      runtime_printf ("\t");
-    }
-  runtime_printf ("panic: ");
-  runtime_printany (p->__arg);
-  if (p->__was_recovered)
-    runtime_printf (" [recovered]");
-  runtime_printf ("\n");
-}
-
-/* This implements __go_panic which is used for the panic
-   function.  */
-
-void
-__go_panic (struct __go_empty_interface arg)
-{
-  G *g;
-  struct __go_panic_stack *n;
-
-  g = runtime_g ();
-
-  n = (struct __go_panic_stack *) __go_alloc (sizeof (struct __go_panic_stack));
-  n->__arg = arg;
-  n->__next = g->panic;
-  g->panic = n;
-
-  /* Run all the defer functions.  */
-
-  while (1)
-    {
-      struct __go_defer_stack *d;
-      void (*pfn) (void *);
-
-      d = g->defer;
-      if (d == NULL)
-	break;
-
-      pfn = d->__pfn;
-      d->__pfn = NULL;
-
-      if (pfn != NULL)
-	{
-	  (*pfn) (d->__arg);
-
-	  if (n->__was_recovered)
-	    {
-	      /* Some defer function called recover.  That means that
-		 we should stop running this panic.  */
-
-	      g->panic = n->__next;
-	      __go_free (n);
-
-	      /* Now unwind the stack by throwing an exception.  The
-		 compiler has arranged to create exception handlers in
-		 each function which uses a defer statement.  These
-		 exception handlers will check whether the entry on
-		 the top of the defer stack is from the current
-		 function.  If it is, we have unwound the stack far
-		 enough.  */
-	      __go_unwind_stack ();
-
-	      /* __go_unwind_stack should not return.  */
-	      abort ();
-	    }
-
-	  /* Because we executed that defer function by a panic, and
-	     it did not call recover, we know that we are not
-	     returning from the calling function--we are panicing
-	     through it.  */
-	  *d->__frame = 0;
-	}
-
-      g->defer = d->__next;
-
-      /* This may be called by a cgo callback routine to defer the
-	 call to syscall.CgocallBackDone, in which case we will not
-	 have a memory context.  Don't try to free anything in that
-	 case--the GC will release it later.  */
-      if (runtime_m () != NULL)
-	runtime_freedefer (d);
-    }
-
-  /* The panic was not recovered.  */
-
-  runtime_startpanic ();
-  __printpanics (g->panic);
-  runtime_dopanic (0);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-panic.h b/third_party/gofrontend/libgo/runtime/go-panic.h
deleted file mode 100644
index d29fe88..0000000
--- a/third_party/gofrontend/libgo/runtime/go-panic.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* go-panic.h -- declare the go panic functions.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#ifndef LIBGO_GO_PANIC_H
-#define LIBGO_GO_PANIC_H
-
-#include "interface.h"
-
-struct String;
-struct __go_type_descriptor;
-struct __go_defer_stack;
-
-/* The stack of panic calls.  */
-
-struct __go_panic_stack
-{
-  /* The next entry in the stack.  */
-  struct __go_panic_stack *__next;
-
-  /* The value associated with this panic.  */
-  struct __go_empty_interface __arg;
-
-  /* Whether this panic has been recovered.  */
-  _Bool __was_recovered;
-
-  /* Whether this panic was pushed on the stack because of an
-     exception thrown in some other language.  */
-  _Bool __is_foreign;
-};
-
-extern void __go_panic (struct __go_empty_interface)
-  __attribute__ ((noreturn));
-
-extern void __go_print_string (struct String);
-
-extern struct __go_empty_interface __go_recover (void);
-
-extern _Bool __go_can_recover (void *);
-
-extern void __go_makefunc_can_recover (void *retaddr);
-
-struct Location;
-extern void __go_makefunc_ffi_can_recover (struct Location *, int);
-
-extern void __go_makefunc_returning (void);
-
-extern void __go_unwind_stack (void);
-
-#endif /* !defined(LIBGO_GO_PANIC_H) */
diff --git a/third_party/gofrontend/libgo/runtime/go-print.c b/third_party/gofrontend/libgo/runtime/go-print.c
deleted file mode 100644
index 4c520de..0000000
--- a/third_party/gofrontend/libgo/runtime/go-print.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* go-print.c -- support for the go print statement.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <math.h>
-#include <stdint.h>
-#include <stdio.h>
-
-#include "runtime.h"
-#include "array.h"
-#include "go-panic.h"
-#include "interface.h"
-
-/* This implements the various little functions which are called by
-   the predeclared functions print/println/panic/panicln.  */
-
-void
-__go_print_empty_interface (struct __go_empty_interface e)
-{
-  runtime_printf ("(%p,%p)", e.__type_descriptor, e.__object);
-}
-
-void
-__go_print_interface (struct __go_interface i)
-{
-  runtime_printf ("(%p,%p)", i.__methods, i.__object);
-}
-
-void
-__go_print_slice (struct __go_open_array val)
-{
-  runtime_printf ("[%d/%d]", val.__count, val.__capacity);
-  runtime_printpointer (val.__values);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-recover.c b/third_party/gofrontend/libgo/runtime/go-recover.c
deleted file mode 100644
index fc66f61..0000000
--- a/third_party/gofrontend/libgo/runtime/go-recover.c
+++ /dev/null
@@ -1,275 +0,0 @@
-/* go-recover.c -- support for the go recover function.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "interface.h"
-#include "go-panic.h"
-#include "go-defer.h"
-
-/* If the top of the defer stack can be recovered, then return it.
-   Otherwise return NULL.  */
-
-static struct __go_defer_stack *
-current_defer ()
-{
-  G *g;
-  struct __go_defer_stack *d;
-
-  g = runtime_g ();
-
-  d = g->defer;
-  if (d == NULL)
-    return NULL;
-
-  /* The panic which would be recovered is the one on the top of the
-     panic stack.  We do not want to recover it if that panic was on
-     the top of the panic stack when this function was deferred.  */
-  if (d->__panic == g->panic)
-    return NULL;
-
-  /* The deferred thunk will call _go_set_defer_retaddr.  If this has
-     not happened, then we have not been called via defer, and we can
-     not recover.  */
-  if (d->__retaddr == NULL)
-    return NULL;
-
-  return d;
-}
-
-/* This is called by a thunk to see if the real function should be
-   permitted to recover a panic value.  Recovering a value is
-   permitted if the thunk was called directly by defer.  RETADDR is
-   the return address of the function which is calling
-   __go_can_recover--this is, the thunk.  */
-
-_Bool
-__go_can_recover (void *retaddr)
-{
-  struct __go_defer_stack *d;
-  const char* ret;
-  const char* dret;
-  Location locs[16];
-  const byte *name;
-  intgo len;
-  int n;
-  int i;
-  _Bool found_ffi_callback;
-
-  d = current_defer ();
-  if (d == NULL)
-    return 0;
-
-  ret = (const char *) __builtin_extract_return_addr (retaddr);
-
-  dret = (const char *) d->__retaddr;
-  if (ret <= dret && ret + 16 >= dret)
-    return 1;
-
-  /* On some systems, in some cases, the return address does not work
-     reliably.  See http://gcc.gnu.org/PR60406.  If we are permitted
-     to call recover, the call stack will look like this:
-       __go_panic, __go_undefer, etc.
-       thunk to call deferred function (calls __go_set_defer_retaddr)
-       function that calls __go_can_recover (passing return address)
-       __go_can_recover
-     Calling runtime_callers will skip the thunks.  So if our caller's
-     caller starts with __go, then we are permitted to call
-     recover.  */
-
-  if (runtime_callers (1, &locs[0], 2, false) < 2)
-    return 0;
-
-  name = locs[1].function.str;
-  len = locs[1].function.len;
-
-  /* Although locs[1].function is a Go string, we know it is
-     NUL-terminated.  */
-  if (len > 4
-      && __builtin_strchr ((const char *) name, '.') == NULL
-      && __builtin_strncmp ((const char *) name, "__go_", 4) == 0)
-    return 1;
-
-  /* If we are called from __go_makefunc_can_recover, then we need to
-     look one level higher.  */
-  if (locs[0].function.len > 0
-      && __builtin_strcmp ((const char *) locs[0].function.str,
-			   "__go_makefunc_can_recover") == 0)
-    {
-      if (runtime_callers (3, &locs[0], 1, false) < 1)
-	return 0;
-      name = locs[0].function.str;
-      len = locs[0].function.len;
-      if (len > 4
-	  && __builtin_strchr ((const char *) name, '.') == NULL
-	  && __builtin_strncmp ((const char *) name, "__go_", 4) == 0)
-	return 1;
-    }
-
-  /* If the function calling recover was created by reflect.MakeFunc,
-     then __go_makefunc_can_recover or __go_makefunc_ffi_can_recover
-     will have set the __makefunc_can_recover field.  */
-  if (!d->__makefunc_can_recover)
-    return 0;
-
-  /* We look up the stack, ignoring libffi functions and functions in
-     the reflect package, until we find reflect.makeFuncStub or
-     reflect.ffi_callback called by FFI functions.  Then we check the
-     caller of that function.  */
-
-  n = runtime_callers (2, &locs[0], sizeof locs / sizeof locs[0], false);
-  found_ffi_callback = 0;
-  for (i = 0; i < n; i++)
-    {
-      const byte *name;
-
-      if (locs[i].function.len == 0)
-	{
-	  /* No function name means this caller isn't Go code.  Assume
-	     that this is libffi.  */
-	  continue;
-	}
-
-      /* Ignore functions in libffi.  */
-      name = locs[i].function.str;
-      if (__builtin_strncmp ((const char *) name, "ffi_", 4) == 0)
-	continue;
-
-      if (found_ffi_callback)
-	break;
-
-      if (__builtin_strcmp ((const char *) name, "reflect.ffi_callback") == 0)
-	{
-	  found_ffi_callback = 1;
-	  continue;
-	}
-
-      if (__builtin_strcmp ((const char *) name, "reflect.makeFuncStub") == 0)
-	{
-	  i++;
-	  break;
-	}
-
-      /* Ignore other functions in the reflect package.  */
-      if (__builtin_strncmp ((const char *) name, "reflect.", 8) == 0)
-	continue;
-
-      /* We should now be looking at the real caller.  */
-      break;
-    }
-
-  if (i < n && locs[i].function.len > 0)
-    {
-      name = locs[i].function.str;
-      if (__builtin_strncmp ((const char *) name, "__go_", 4) == 0)
-	return 1;
-    }
-
-  return 0;
-}
-
-/* This function is called when code is about to enter a function
-   created by reflect.MakeFunc.  It is called by the function stub
-   used by MakeFunc.  If the stub is permitted to call recover, then a
-   real MakeFunc function is permitted to call recover.  */
-
-void
-__go_makefunc_can_recover (void *retaddr)
-{
-  struct __go_defer_stack *d;
-
-  d = current_defer ();
-  if (d == NULL)
-    return;
-
-  /* If we are already in a call stack of MakeFunc functions, there is
-     nothing we can usefully check here.  */
-  if (d->__makefunc_can_recover)
-    return;
-
-  if (__go_can_recover (retaddr))
-    d->__makefunc_can_recover = 1;
-}
-
-/* This function is called when code is about to enter a function
-   created by the libffi version of reflect.MakeFunc.  This function
-   is passed the names of the callers of the libffi code that called
-   the stub.  It uses to decide whether it is permitted to call
-   recover, and sets d->__makefunc_can_recover so that __go_recover
-   can make the same decision.  */
-
-void
-__go_makefunc_ffi_can_recover (struct Location *loc, int n)
-{
-  struct __go_defer_stack *d;
-  const byte *name;
-  intgo len;
-
-  d = current_defer ();
-  if (d == NULL)
-    return;
-
-  /* If we are already in a call stack of MakeFunc functions, there is
-     nothing we can usefully check here.  */
-  if (d->__makefunc_can_recover)
-    return;
-
-  /* LOC points to the caller of our caller.  That will be a thunk.
-     If its caller was a runtime function, then it was called directly
-     by defer.  */
-
-  if (n < 2)
-    return;
-
-  name = (loc + 1)->function.str;
-  len = (loc + 1)->function.len;
-  if (len > 4
-      && __builtin_strchr ((const char *) name, '.') == NULL
-      && __builtin_strncmp ((const char *) name, "__go_", 4) == 0)
-    d->__makefunc_can_recover = 1;
-}
-
-/* This function is called when code is about to exit a function
-   created by reflect.MakeFunc.  It is called by the function stub
-   used by MakeFunc.  It clears the __makefunc_can_recover field.
-   It's OK to always clear this field, because __go_can_recover will
-   only be called by a stub created for a function that calls recover.
-   That stub will not call a function created by reflect.MakeFunc, so
-   by the time we get here any caller higher up on the call stack no
-   longer needs the information.  */
-
-void
-__go_makefunc_returning (void)
-{
-  struct __go_defer_stack *d;
-
-  d = runtime_g ()->defer;
-  if (d != NULL)
-    d->__makefunc_can_recover = 0;
-}
-
-/* This is only called when it is valid for the caller to recover the
-   value on top of the panic stack, if there is one.  */
-
-struct __go_empty_interface
-__go_recover ()
-{
-  G *g;
-  struct __go_panic_stack *p;
-
-  g = runtime_g ();
-
-  if (g->panic == NULL || g->panic->__was_recovered)
-    {
-      struct __go_empty_interface ret;
-
-      ret.__type_descriptor = NULL;
-      ret.__object = NULL;
-      return ret;
-    }
-  p = g->panic;
-  p->__was_recovered = 1;
-  return p->__arg;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-reflect-call.c b/third_party/gofrontend/libgo/runtime/go-reflect-call.c
deleted file mode 100644
index 2a14d6c..0000000
--- a/third_party/gofrontend/libgo/runtime/go-reflect-call.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/* go-reflect-call.c -- call reflection support for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include "runtime.h"
-#include "go-alloc.h"
-#include "go-assert.h"
-#include "go-type.h"
-#include "go-ffi.h"
-
-#if defined(USE_LIBFFI) && FFI_GO_CLOSURES
-
-/* The functions in this file are only called from reflect_call.  As
-   reflect_call calls a libffi function, which will be compiled
-   without -fsplit-stack, it will always run with a large stack.  */
-
-static size_t go_results_size (const struct __go_func_type *)
-  __attribute__ ((no_split_stack));
-static void go_set_results (const struct __go_func_type *, unsigned char *,
-			    void **)
-  __attribute__ ((no_split_stack));
-
-/* Get the total size required for the result parameters of a
-   function.  */
-
-static size_t
-go_results_size (const struct __go_func_type *func)
-{
-  int count;
-  const struct __go_type_descriptor **types;
-  size_t off;
-  size_t maxalign;
-  int i;
-
-  count = func->__out.__count;
-  if (count == 0)
-    return 0;
-
-  types = (const struct __go_type_descriptor **) func->__out.__values;
-
-  /* A single integer return value is always promoted to a full
-     word.  */
-  if (count == 1)
-    {
-      switch (types[0]->__code & GO_CODE_MASK)
-	{
-	case GO_BOOL:
-	case GO_INT8:
-	case GO_INT16:
-	case GO_INT32:
-	case GO_UINT8:
-	case GO_UINT16:
-	case GO_UINT32:
-	case GO_INT:
-	case GO_UINT:
-	  return sizeof (ffi_arg);
-
-	default:
-	  break;
-	}
-    }
-
-  off = 0;
-  maxalign = 0;
-  for (i = 0; i < count; ++i)
-    {
-      size_t align;
-
-      align = types[i]->__field_align;
-      if (align > maxalign)
-	maxalign = align;
-      off = (off + align - 1) & ~ (align - 1);
-      off += types[i]->__size;
-    }
-
-  off = (off + maxalign - 1) & ~ (maxalign - 1);
-
-  // The libffi library doesn't understand a struct with no fields.
-  // We generate a struct with a single field of type void.  When used
-  // as a return value, libffi will think that requires a byte.
-  if (off == 0)
-    off = 1;
-
-  return off;
-}
-
-/* Copy the results of calling a function via FFI from CALL_RESULT
-   into the addresses in RESULTS.  */
-
-static void
-go_set_results (const struct __go_func_type *func, unsigned char *call_result,
-		void **results)
-{
-  int count;
-  const struct __go_type_descriptor **types;
-  size_t off;
-  int i;
-
-  count = func->__out.__count;
-  if (count == 0)
-    return;
-
-  types = (const struct __go_type_descriptor **) func->__out.__values;
-
-  /* A single integer return value is always promoted to a full
-     word.  */
-  if (count == 1)
-    {
-      switch (types[0]->__code & GO_CODE_MASK)
-	{
-	case GO_BOOL:
-	case GO_INT8:
-	case GO_INT16:
-	case GO_INT32:
-	case GO_UINT8:
-	case GO_UINT16:
-	case GO_UINT32:
-	case GO_INT:
-	case GO_UINT:
-	  {
-	    union
-	    {
-	      unsigned char buf[sizeof (ffi_arg)];
-	      ffi_arg v;
-	    } u;
-	    ffi_arg v;
-
-	    __builtin_memcpy (&u.buf, call_result, sizeof (ffi_arg));
-	    v = u.v;
-
-	    switch (types[0]->__size)
-	      {
-	      case 1:
-		{
-		  uint8_t b;
-
-		  b = (uint8_t) v;
-		  __builtin_memcpy (results[0], &b, 1);
-		}
-		break;
-
-	      case 2:
-		{
-		  uint16_t s;
-
-		  s = (uint16_t) v;
-		  __builtin_memcpy (results[0], &s, 2);
-		}
-		break;
-
-	      case 4:
-		{
-		  uint32_t w;
-
-		  w = (uint32_t) v;
-		  __builtin_memcpy (results[0], &w, 4);
-		}
-		break;
-
-	      case 8:
-		{
-		  uint64_t d;
-
-		  d = (uint64_t) v;
-		  __builtin_memcpy (results[0], &d, 8);
-		}
-		break;
-
-	      default:
-		abort ();
-	      }
-	  }
-	  return;
-
-	default:
-	  break;
-	}
-    }
-
-  off = 0;
-  for (i = 0; i < count; ++i)
-    {
-      size_t align;
-      size_t size;
-
-      align = types[i]->__field_align;
-      size = types[i]->__size;
-      off = (off + align - 1) & ~ (align - 1);
-      __builtin_memcpy (results[i], call_result + off, size);
-      off += size;
-    }
-}
-
-/* Call a function.  The type of the function is FUNC_TYPE, and the
-   closure is FUNC_VAL.  PARAMS is an array of parameter addresses.
-   RESULTS is an array of result addresses.
-
-   If IS_INTERFACE is true this is a call to an interface method and
-   the first argument is the receiver, which is always a pointer.
-   This argument, the receiver, is not described in FUNC_TYPE.
-
-   If IS_METHOD is true this is a call to a method expression.  The
-   first argument is the receiver.  It is described in FUNC_TYPE, but
-   regardless of FUNC_TYPE, it is passed as a pointer.  */
-
-void
-reflect_call (const struct __go_func_type *func_type, FuncVal *func_val,
-	      _Bool is_interface, _Bool is_method, void **params,
-	      void **results)
-{
-  ffi_cif cif;
-  unsigned char *call_result;
-
-  __go_assert ((func_type->__common.__code & GO_CODE_MASK) == GO_FUNC);
-  __go_func_to_cif (func_type, is_interface, is_method, &cif);
-
-  call_result = (unsigned char *) malloc (go_results_size (func_type));
-
-  ffi_call_go (&cif, func_val->fn, call_result, params, func_val);
-
-  /* Some day we may need to free result values if RESULTS is
-     NULL.  */
-  if (results != NULL)
-    go_set_results (func_type, call_result, results);
-
-  free (call_result);
-}
-
-#else /* !defined(USE_LIBFFI) */
-
-void
-reflect_call (const struct __go_func_type *func_type __attribute__ ((unused)),
-	      FuncVal *func_val __attribute__ ((unused)),
-	      _Bool is_interface __attribute__ ((unused)),
-	      _Bool is_method __attribute__ ((unused)),
-	      void **params __attribute__ ((unused)),
-	      void **results __attribute__ ((unused)))
-{
-  /* Without FFI there is nothing we can do.  */
-  runtime_throw("libgo built without FFI does not support "
-		"reflect.Call or runtime.SetFinalizer");
-}
-
-#endif /* !defined(USE_LIBFFI) */
diff --git a/third_party/gofrontend/libgo/runtime/go-reflect-map.c b/third_party/gofrontend/libgo/runtime/go-reflect-map.c
deleted file mode 100644
index 36f3102..0000000
--- a/third_party/gofrontend/libgo/runtime/go-reflect-map.c
+++ /dev/null
@@ -1,156 +0,0 @@
-/* go-reflect-map.c -- map reflection support for Go.
-
-   Copyright 2009, 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stdlib.h>
-#include <stdint.h>
-
-#include "runtime.h"
-#include "go-alloc.h"
-#include "go-assert.h"
-#include "go-type.h"
-#include "map.h"
-
-/* This file implements support for reflection on maps.  These
-   functions are called from reflect/value.go.  */
-
-extern void *mapaccess (struct __go_map_type *, void *, void *)
-  __asm__ (GOSYM_PREFIX "reflect.mapaccess");
-
-void *
-mapaccess (struct __go_map_type *mt, void *m, void *key)
-{
-  struct __go_map *map = (struct __go_map *) m;
-
-  __go_assert ((mt->__common.__code & GO_CODE_MASK) == GO_MAP);
-  if (map == NULL)
-    return NULL;
-  else
-    return __go_map_index (map, key, 0);
-}
-
-extern void mapassign (struct __go_map_type *, void *, void *, void *)
-  __asm__ (GOSYM_PREFIX "reflect.mapassign");
-
-void
-mapassign (struct __go_map_type *mt, void *m, void *key, void *val)
-{
-  struct __go_map *map = (struct __go_map *) m;
-  void *p;
-
-  __go_assert ((mt->__common.__code & GO_CODE_MASK) == GO_MAP);
-  if (map == NULL)
-    runtime_panicstring ("assignment to entry in nil map");
-  p = __go_map_index (map, key, 1);
-  __builtin_memcpy (p, val, mt->__val_type->__size);
-}
-
-extern void mapdelete (struct __go_map_type *, void *, void *)
-  __asm__ (GOSYM_PREFIX "reflect.mapdelete");
-
-void
-mapdelete (struct __go_map_type *mt, void *m, void *key)
-{
-  struct __go_map *map = (struct __go_map *) m;
-
-  __go_assert ((mt->__common.__code & GO_CODE_MASK) == GO_MAP);
-  if (map == NULL)
-    return;
-  __go_map_delete (map, key);
-}
-
-extern int32_t maplen (void *) __asm__ (GOSYM_PREFIX "reflect.maplen");
-
-int32_t
-maplen (void *m)
-{
-  struct __go_map *map = (struct __go_map *) m;
-
-  if (map == NULL)
-    return 0;
-  return (int32_t) map->__element_count;
-}
-
-extern unsigned char *mapiterinit (struct __go_map_type *, void *)
-  __asm__ (GOSYM_PREFIX "reflect.mapiterinit");
-
-unsigned char *
-mapiterinit (struct __go_map_type *mt, void *m)
-{
-  struct __go_hash_iter *it;
-
-  __go_assert ((mt->__common.__code & GO_CODE_MASK) == GO_MAP);
-  it = __go_alloc (sizeof (struct __go_hash_iter));
-  __go_mapiterinit ((struct __go_map *) m, it);
-  return (unsigned char *) it;
-}
-
-extern void mapiternext (void *) __asm__ (GOSYM_PREFIX "reflect.mapiternext");
-
-void
-mapiternext (void *it)
-{
-  __go_mapiternext ((struct __go_hash_iter *) it);
-}
-
-extern void *mapiterkey (void *) __asm__ (GOSYM_PREFIX "reflect.mapiterkey");
-
-void *
-mapiterkey (void *ita)
-{
-  struct __go_hash_iter *it = (struct __go_hash_iter *) ita;
-  const struct __go_type_descriptor *key_descriptor;
-  void *key;
-
-  if (it->entry == NULL)
-    return NULL;
-
-  key_descriptor = it->map->__descriptor->__map_descriptor->__key_type;
-  key = __go_alloc (key_descriptor->__size);
-  __go_mapiter1 (it, key);
-  return key;
-}
-
-/* Make a new map.  We have to build our own map descriptor.  */
-
-extern struct __go_map *makemap (const struct __go_map_type *)
-  __asm__ (GOSYM_PREFIX "reflect.makemap");
-
-struct __go_map *
-makemap (const struct __go_map_type *t)
-{
-  struct __go_map_descriptor *md;
-  unsigned int o;
-  const struct __go_type_descriptor *kt;
-  const struct __go_type_descriptor *vt;
-
-  md = (struct __go_map_descriptor *) __go_alloc (sizeof (*md));
-  md->__map_descriptor = t;
-  o = sizeof (void *);
-  kt = t->__key_type;
-  o = (o + kt->__field_align - 1) & ~ (kt->__field_align - 1);
-  md->__key_offset = o;
-  o += kt->__size;
-  vt = t->__val_type;
-  o = (o + vt->__field_align - 1) & ~ (vt->__field_align - 1);
-  md->__val_offset = o;
-  o += vt->__size;
-  o = (o + sizeof (void *) - 1) & ~ (sizeof (void *) - 1);
-  o = (o + kt->__field_align - 1) & ~ (kt->__field_align - 1);
-  o = (o + vt->__field_align - 1) & ~ (vt->__field_align - 1);
-  md->__entry_size = o;
-
-  return __go_new_map (md, 0);
-}
-
-extern _Bool ismapkey (const struct __go_type_descriptor *)
-  __asm__ (GOSYM_PREFIX "reflect.ismapkey");
-
-_Bool
-ismapkey (const struct __go_type_descriptor *typ)
-{
-  return (typ != NULL
-	  && (void *) typ->__hashfn->fn != (void *) __go_type_hash_error);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-rune.c b/third_party/gofrontend/libgo/runtime/go-rune.c
deleted file mode 100644
index 4c65e21..0000000
--- a/third_party/gofrontend/libgo/runtime/go-rune.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/* go-rune.c -- rune functions for Go.
-
-   Copyright 2009, 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-
-#include "runtime.h"
-#include "go-string.h"
-
-/* Get a character from the UTF-8 string STR, of length LEN.  Store
-   the Unicode character, if any, in *RUNE.  Return the number of
-   characters used from STR.  */
-
-int
-__go_get_rune (const unsigned char *str, size_t len, int32 *rune)
-{
-  int c, c1, c2, c3, l;
-
-  /* Default to the "replacement character".  */
-  *rune = 0xfffd;
-
-  if (len <= 0)
-    return 1;
-
-  c = *str;
-  if (c <= 0x7f)
-    {
-      *rune = c;
-      return 1;
-    }
-
-  if (len <= 1)
-    return 1;
-
-  c1 = str[1];
-  if ((c & 0xe0) == 0xc0
-      && (c1 & 0xc0) == 0x80)
-    {
-      l = (((c & 0x1f) << 6) + (c1 & 0x3f));
-      if (l <= 0x7f)
-	return 1;
-      *rune = l;
-      return 2;
-    }
-
-  if (len <= 2)
-    return 1;
-
-  c2 = str[2];
-  if ((c & 0xf0) == 0xe0
-      && (c1 & 0xc0) == 0x80
-      && (c2 & 0xc0) == 0x80)
-    {
-      l = (((c & 0xf) << 12)
-	   + ((c1 & 0x3f) << 6)
-	   + (c2 & 0x3f));
-
-      if (l <= 0x7ff)
-	return 1;
-
-      if (l >= 0xd800 && l < 0xe000)
-	{
-	  /* Invalid surrogate half; return replace character.  */
-	  return 1;
-	}
-
-      *rune = l;
-
-      return 3;
-    }
-
-  if (len <= 3)
-    return 1;
-
-  c3 = str[3];
-  if ((c & 0xf8) == 0xf0
-      && (c1 & 0xc0) == 0x80
-      && (c2 & 0xc0) == 0x80
-      && (c3 & 0xc0) == 0x80)
-    {
-      l = (((c & 0x7) << 18)
-	   + ((c1 & 0x3f) << 12)
-	   + ((c2 & 0x3f) << 6)
-	   + (c3 & 0x3f));
-
-      if (l <= 0xffff || l > 0x10ffff)
-	return 1;
-
-      *rune = l;
-      return 4;
-    }
-
-  /* Invalid encoding.  Return 1 so that we advance.  */
-  return 1;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-runtime-error.c b/third_party/gofrontend/libgo/runtime/go-runtime-error.c
deleted file mode 100644
index f5ab4f9..0000000
--- a/third_party/gofrontend/libgo/runtime/go-runtime-error.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* go-runtime-error.c -- Go runtime error.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-
-/* The compiler generates calls to this function.  This enum values
-   are known to the compiler and used by compiled code.  Any change
-   here must be reflected in the compiler.  */
-
-enum
-{
-  /* Slice index out of bounds: negative or larger than the length of
-     the slice.  */
-  SLICE_INDEX_OUT_OF_BOUNDS = 0,
-
-  /* Array index out of bounds.  */
-  ARRAY_INDEX_OUT_OF_BOUNDS = 1,
-
-  /* String index out of bounds.  */
-  STRING_INDEX_OUT_OF_BOUNDS = 2,
-
-  /* Slice slice out of bounds: negative or larger than the length of
-     the slice or high bound less than low bound.  */
-  SLICE_SLICE_OUT_OF_BOUNDS = 3,
-
-  /* Array slice out of bounds.  */
-  ARRAY_SLICE_OUT_OF_BOUNDS = 4,
-
-  /* String slice out of bounds.  */
-  STRING_SLICE_OUT_OF_BOUNDS = 5,
-
-  /* Dereference of nil pointer.  This is used when there is a
-     dereference of a pointer to a very large struct or array, to
-     ensure that a gigantic array is not used a proxy to access random
-     memory locations.  */
-  NIL_DEREFERENCE = 6,
-
-  /* Slice length or capacity out of bounds in make: negative or
-     overflow or length greater than capacity.  */
-  MAKE_SLICE_OUT_OF_BOUNDS = 7,
-
-  /* Map capacity out of bounds in make: negative or overflow.  */
-  MAKE_MAP_OUT_OF_BOUNDS = 8,
-
-  /* Channel capacity out of bounds in make: negative or overflow.  */
-  MAKE_CHAN_OUT_OF_BOUNDS = 9,
-
-  /* Integer division by zero.  */
-  DIVISION_BY_ZERO = 10
-};
-
-extern void __go_runtime_error () __attribute__ ((noreturn));
-
-void
-__go_runtime_error (int32 i)
-{
-  switch (i)
-    {
-    case SLICE_INDEX_OUT_OF_BOUNDS:
-    case ARRAY_INDEX_OUT_OF_BOUNDS:
-    case STRING_INDEX_OUT_OF_BOUNDS:
-      runtime_panicstring ("index out of range");
-
-    case SLICE_SLICE_OUT_OF_BOUNDS:
-    case ARRAY_SLICE_OUT_OF_BOUNDS:
-    case STRING_SLICE_OUT_OF_BOUNDS:
-      runtime_panicstring ("slice bounds out of range");
-
-    case NIL_DEREFERENCE:
-      runtime_panicstring ("nil pointer dereference");
-
-    case MAKE_SLICE_OUT_OF_BOUNDS:
-      runtime_panicstring ("make slice len or cap out of range");
-
-    case MAKE_MAP_OUT_OF_BOUNDS:
-      runtime_panicstring ("make map len out of range");
-
-    case MAKE_CHAN_OUT_OF_BOUNDS:
-      runtime_panicstring ("make chan len out of range");
-
-    case DIVISION_BY_ZERO:
-      runtime_panicstring ("integer divide by zero");
-
-    default:
-      runtime_panicstring ("unknown runtime error");
-    }
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-setenv.c b/third_party/gofrontend/libgo/runtime/go-setenv.c
deleted file mode 100644
index a75d7c4..0000000
--- a/third_party/gofrontend/libgo/runtime/go-setenv.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* go-setenv.c -- set the C environment from Go.
-
-   Copyright 2011 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "config.h"
-
-#include <stddef.h>
-#include <stdlib.h>
-
-#include "go-alloc.h"
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-/* Set the C environment from Go.  This is called by syscall.Setenv.  */
-
-void setenv_c (String, String) __asm__ (GOSYM_PREFIX "syscall.setenv_c");
-
-void
-setenv_c (String k, String v)
-{
-  const byte *ks;
-  unsigned char *kn;
-  const byte *vs;
-  unsigned char *vn;
-  intgo len;
-
-  ks = k.str;
-  if (ks == NULL)
-    ks = (const byte *) "";
-  kn = NULL;
-
-  vs = v.str;
-  if (vs == NULL)
-    vs = (const byte *) "";
-  vn = NULL;
-
-#ifdef HAVE_SETENV
-
-  if (ks != NULL && ks[k.len] != 0)
-    {
-      // Objects that are explicitly freed must be at least 16 bytes in size,
-      // so that they are not allocated using tiny alloc.
-      len = k.len + 1;
-      if (len < TinySize)
-	len = TinySize;
-      kn = __go_alloc (len);
-      __builtin_memcpy (kn, ks, k.len);
-      ks = kn;
-    }
-
-  if (vs != NULL && vs[v.len] != 0)
-    {
-      len = v.len + 1;
-      if (len < TinySize)
-	len = TinySize;
-      vn = __go_alloc (len);
-      __builtin_memcpy (vn, vs, v.len);
-      vs = vn;
-    }
-
-  setenv ((const char *) ks, (const char *) vs, 1);
-
-#else /* !defined(HAVE_SETENV) */
-
-  len = k.len + v.len + 2;
-  if (len < TinySize)
-    len = TinySize;
-  kn = __go_alloc (len);
-  __builtin_memcpy (kn, ks, k.len);
-  kn[k.len] = '=';
-  __builtin_memcpy (kn + k.len + 1, vs, v.len);
-  kn[k.len + v.len + 1] = '\0';
-  putenv ((char *) kn);
-
-#endif /* !defined(HAVE_SETENV) */
-
-  if (kn != NULL)
-    __go_free (kn);
-  if (vn != NULL)
-    __go_free (vn);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-signal.c b/third_party/gofrontend/libgo/runtime/go-signal.c
deleted file mode 100644
index 4a1bf56..0000000
--- a/third_party/gofrontend/libgo/runtime/go-signal.c
+++ /dev/null
@@ -1,546 +0,0 @@
-/* go-signal.c -- signal handling for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <signal.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/time.h>
-
-#include "runtime.h"
-#include "go-assert.h"
-#include "go-panic.h"
-#include "signal_unix.h"
-
-#ifndef SA_RESTART
-  #define SA_RESTART 0
-#endif
-
-#ifdef USING_SPLIT_STACK
-
-extern void __splitstack_getcontext(void *context[10]);
-
-extern void __splitstack_setcontext(void *context[10]);
-
-#endif
-
-#define N SigNotify
-#define K SigKill
-#define T SigThrow
-#define P SigPanic
-#define D SigDefault
-
-/* Signal actions.  This collects the sigtab tables for several
-   different targets from the master library.  SIGKILL, SIGCONT, and
-   SIGSTOP are not listed, as we don't want to set signal handlers for
-   them.  */
-
-SigTab runtime_sigtab[] = {
-#ifdef SIGHUP
-  { SIGHUP,	N + K },
-#endif
-#ifdef SIGINT
-  { SIGINT, 	N + K },
-#endif
-#ifdef SIGQUIT
-  { SIGQUIT, 	N + T },
-#endif
-#ifdef SIGILL
-  { SIGILL, 	T },
-#endif
-#ifdef SIGTRAP
-  { SIGTRAP, 	T },
-#endif
-#ifdef SIGABRT
-  { SIGABRT, 	N + T },
-#endif
-#ifdef SIGBUS
-  { SIGBUS, 	P },
-#endif
-#ifdef SIGFPE
-  { SIGFPE, 	P },
-#endif
-#ifdef SIGUSR1
-  { SIGUSR1, 	N },
-#endif
-#ifdef SIGSEGV
-  { SIGSEGV, 	P },
-#endif
-#ifdef SIGUSR2
-  { SIGUSR2, 	N },
-#endif
-#ifdef SIGPIPE
-  { SIGPIPE, 	N },
-#endif
-#ifdef SIGALRM
-  { SIGALRM, 	N },
-#endif
-#ifdef SIGTERM
-  { SIGTERM, 	N + K },
-#endif
-#ifdef SIGSTKFLT
-  { SIGSTKFLT, 	T },
-#endif
-#ifdef SIGCHLD
-  { SIGCHLD, 	N },
-#endif
-#ifdef SIGTSTP
-  { SIGTSTP, 	N + D },
-#endif
-#ifdef SIGTTIN
-  { SIGTTIN, 	N + D },
-#endif
-#ifdef SIGTTOU
-  { SIGTTOU, 	N + D },
-#endif
-#ifdef SIGURG
-  { SIGURG, 	N },
-#endif
-#ifdef SIGXCPU
-  { SIGXCPU, 	N },
-#endif
-#ifdef SIGXFSZ
-  { SIGXFSZ, 	N },
-#endif
-#ifdef SIGVTALRM
-  { SIGVTALRM, 	N },
-#endif
-#ifdef SIGPROF
-  { SIGPROF, 	N },
-#endif
-#ifdef SIGWINCH
-  { SIGWINCH, 	N },
-#endif
-#ifdef SIGIO
-  { SIGIO, 	N },
-#endif
-#ifdef SIGPWR
-  { SIGPWR, 	N },
-#endif
-#ifdef SIGSYS
-  { SIGSYS, 	N },
-#endif
-#ifdef SIGEMT
-  { SIGEMT,	T },
-#endif
-#ifdef SIGINFO
-  { SIGINFO,	N },
-#endif
-#ifdef SIGTHR
-  { SIGTHR,	N },
-#endif
-  { -1,		0 }
-};
-#undef N
-#undef K
-#undef T
-#undef P
-#undef D
-
-/* Handle a signal, for cases where we don't panic.  We can split the
-   stack here.  */
-
-void
-runtime_sighandler (int sig, Siginfo *info,
-		    void *context __attribute__ ((unused)), G *gp)
-{
-  M *m;
-  int i;
-
-  m = runtime_m ();
-
-#ifdef SIGPROF
-  if (sig == SIGPROF)
-    {
-      if (m != NULL && gp != m->g0 && gp != m->gsignal)
-	runtime_sigprof ();
-      return;
-    }
-#endif
-
-  if (m == NULL)
-    {
-      runtime_badsignal (sig);
-      return;
-    }
-
-  for (i = 0; runtime_sigtab[i].sig != -1; ++i)
-    {
-      SigTab *t;
-      bool notify, crash;
-
-      t = &runtime_sigtab[i];
-
-      if (t->sig != sig)
-	continue;
-
-      notify = false;
-#ifdef SA_SIGINFO
-      notify = info != NULL && info->si_code == SI_USER;
-#endif
-      if (notify || (t->flags & SigNotify) != 0)
-	{
-	  if (__go_sigsend (sig))
-	    return;
-	}
-      if ((t->flags & SigKill) != 0)
-	runtime_exit (2);
-      if ((t->flags & SigThrow) == 0)
-	return;
-
-      runtime_startpanic ();
-
-      {
-	const char *name = NULL;
-
-#ifdef HAVE_STRSIGNAL
-	name = strsignal (sig);
-#endif
-
-	if (name == NULL)
-	  runtime_printf ("Signal %d\n", sig);
-	else
-	  runtime_printf ("%s\n", name);
-      }
-
-      if (m->lockedg != NULL && m->ncgo > 0 && gp == m->g0)
-	{
-	  runtime_printf("signal arrived during cgo execution\n");
-	  gp = m->lockedg;
-	}
-
-      runtime_printf ("\n");
-
-      if (runtime_gotraceback (&crash))
-	{
-	  G *g;
-
-	  g = runtime_g ();
-	  runtime_traceback ();
-	  runtime_tracebackothers (g);
-
-	  /* The gc library calls runtime_dumpregs here, and provides
-	     a function that prints the registers saved in context in
-	     a readable form.  */
-	}
-
-      if (crash)
-	runtime_crash ();
-
-      runtime_exit (2);
-    }
-
-  __builtin_unreachable ();
-}
-
-/* The start of handling a signal which panics.  */
-
-static void
-sig_panic_leadin (G *gp)
-{
-  int i;
-  sigset_t clear;
-
-  if (!runtime_canpanic (gp))
-    runtime_throw ("unexpected signal during runtime execution");
-
-  /* The signal handler blocked signals; unblock them.  */
-  i = sigfillset (&clear);
-  __go_assert (i == 0);
-  i = pthread_sigmask (SIG_UNBLOCK, &clear, NULL);
-  __go_assert (i == 0);
-}
-
-#ifdef SA_SIGINFO
-
-/* Signal dispatch for signals which panic, on systems which support
-   SA_SIGINFO.  This is called on the thread stack, and as such it is
-   permitted to split the stack.  */
-
-static void
-sig_panic_info_handler (int sig, Siginfo *info, void *context)
-{
-  G *g;
-
-  g = runtime_g ();
-  if (g == NULL || info->si_code == SI_USER)
-    {
-      runtime_sighandler (sig, info, context, g);
-      return;
-    }
-
-  g->sig = sig;
-  g->sigcode0 = info->si_code;
-  g->sigcode1 = (uintptr_t) info->si_addr;
-
-  /* It would be nice to set g->sigpc here as the gc library does, but
-     I don't know how to get it portably.  */
-
-  sig_panic_leadin (g);
-
-  switch (sig)
-    {
-#ifdef SIGBUS
-    case SIGBUS:
-      if ((info->si_code == BUS_ADRERR && (uintptr_t) info->si_addr < 0x1000)
-	  || g->paniconfault)
-	runtime_panicstring ("invalid memory address or "
-			     "nil pointer dereference");
-      runtime_printf ("unexpected fault address %p\n", info->si_addr);
-      runtime_throw ("fault");
-#endif
-
-#ifdef SIGSEGV
-    case SIGSEGV:
-      if (((info->si_code == 0
-	    || info->si_code == SEGV_MAPERR
-	    || info->si_code == SEGV_ACCERR)
-	   && (uintptr_t) info->si_addr < 0x1000)
-	  || g->paniconfault)
-	runtime_panicstring ("invalid memory address or "
-			     "nil pointer dereference");
-      runtime_printf ("unexpected fault address %p\n", info->si_addr);
-      runtime_throw ("fault");
-#endif
-
-#ifdef SIGFPE
-    case SIGFPE:
-      switch (info->si_code)
-	{
-	case FPE_INTDIV:
-	  runtime_panicstring ("integer divide by zero");
-	case FPE_INTOVF:
-	  runtime_panicstring ("integer overflow");
-	}
-      runtime_panicstring ("floating point error");
-#endif
-    }
-
-  /* All signals with SigPanic should be in cases above, and this
-     handler should only be invoked for those signals.  */
-  __builtin_unreachable ();
-}
-
-#else /* !defined (SA_SIGINFO) */
-
-static void
-sig_panic_handler (int sig)
-{
-  G *g;
-
-  g = runtime_g ();
-  if (g == NULL)
-    {
-      runtime_sighandler (sig, NULL, NULL, g);
-      return;
-    }
-
-  g->sig = sig;
-  g->sigcode0 = 0;
-  g->sigcode1 = 0;
-
-  sig_panic_leadin (g);
-
-  switch (sig)
-    {
-#ifdef SIGBUS
-    case SIGBUS:
-      runtime_panicstring ("invalid memory address or "
-			   "nil pointer dereference");
-#endif
-
-#ifdef SIGSEGV
-    case SIGSEGV:
-      runtime_panicstring ("invalid memory address or "
-			   "nil pointer dereference");
-#endif
-
-#ifdef SIGFPE
-    case SIGFPE:
-      runtime_panicstring ("integer divide by zero or floating point error");
-#endif
-    }
-
-  /* All signals with SigPanic should be in cases above, and this
-     handler should only be invoked for those signals.  */
-  __builtin_unreachable ();
-}
-
-#endif /* !defined (SA_SIGINFO) */
-
-/* A signal handler used for signals which are not going to panic.
-   This is called on the alternate signal stack so it may not split
-   the stack.  */
-
-static void
-sig_tramp_info (int, Siginfo *, void *) __attribute__ ((no_split_stack));
-
-static void
-sig_tramp_info (int sig, Siginfo *info, void *context)
-{
-  G *gp;
-  M *mp;
-#ifdef USING_SPLIT_STACK
-  void *stack_context[10];
-#endif
-
-  /* We are now running on the stack registered via sigaltstack.
-     (Actually there is a small span of time between runtime_siginit
-     and sigaltstack when the program starts.)  */
-  gp = runtime_g ();
-  mp = runtime_m ();
-
-  if (gp != NULL)
-    {
-#ifdef USING_SPLIT_STACK
-      __splitstack_getcontext (&stack_context[0]);
-#endif
-    }
-
-  if (gp != NULL && mp->gsignal != NULL)
-    {
-      /* We are running on the signal stack.  Set the split stack
-	 context so that the stack guards are checked correctly.  */
-#ifdef USING_SPLIT_STACK
-      __splitstack_setcontext (&mp->gsignal->stack_context[0]);
-#endif
-    }
-
-  runtime_sighandler (sig, info, context, gp);
-
-  /* We are going to return back to the signal trampoline and then to
-     whatever we were doing before we got the signal.  Restore the
-     split stack context so that stack guards are checked
-     correctly.  */
-
-  if (gp != NULL)
-    {
-#ifdef USING_SPLIT_STACK
-      __splitstack_setcontext (&stack_context[0]);
-#endif
-    }
-}
-
-#ifndef SA_SIGINFO
-
-static void sig_tramp (int sig) __attribute__ ((no_split_stack));
-
-static void
-sig_tramp (int sig)
-{
-  sig_tramp_info (sig, NULL, NULL);
-}
-
-#endif
-
-void
-runtime_setsig (int32 i, GoSighandler *fn, bool restart)
-{
-  struct sigaction sa;
-  int r;
-  SigTab *t;
-
-  memset (&sa, 0, sizeof sa);
-
-  r = sigfillset (&sa.sa_mask);
-  __go_assert (r == 0);
-
-  t = &runtime_sigtab[i];
-
-  if ((t->flags & SigPanic) == 0)
-    {
-#ifdef SA_SIGINFO
-      sa.sa_flags = SA_ONSTACK | SA_SIGINFO;
-      if (fn == runtime_sighandler)
-	fn = (void *) sig_tramp_info;
-      sa.sa_sigaction = (void *) fn;
-#else
-      sa.sa_flags = SA_ONSTACK;
-      if (fn == runtime_sighandler)
-	fn = (void *) sig_tramp;
-      sa.sa_handler = (void *) fn;
-#endif
-    }
-  else
-    {
-#ifdef SA_SIGINFO
-      sa.sa_flags = SA_SIGINFO;
-      if (fn == runtime_sighandler)
-	fn = (void *) sig_panic_info_handler;
-      sa.sa_sigaction = (void *) fn;
-#else
-      sa.sa_flags = 0;
-      if (fn == runtime_sighandler)
-	fn = (void *) sig_panic_handler;
-      sa.sa_handler = (void *) fn;
-#endif
-    }
-
-  if (restart)
-    sa.sa_flags |= SA_RESTART;
-
-  if (sigaction (t->sig, &sa, NULL) != 0)
-    __go_assert (0);
-}
-
-GoSighandler*
-runtime_getsig (int32 i)
-{
-  struct sigaction sa;
-  int r;
-  SigTab *t;
-
-  memset (&sa, 0, sizeof sa);
-
-  r = sigemptyset (&sa.sa_mask);
-  __go_assert (r == 0);
-
-  t = &runtime_sigtab[i];
-
-  if (sigaction (t->sig, NULL, &sa) != 0)
-    runtime_throw ("sigaction read failure");
-
-  if ((void *) sa.sa_handler == sig_tramp_info)
-    return runtime_sighandler;
-#ifdef SA_SIGINFO
-  if ((void *) sa.sa_handler == sig_panic_info_handler)
-    return runtime_sighandler;
-#else
-  if ((void *) sa.sa_handler == sig_tramp
-      || (void *) sa.sa_handler == sig_panic_handler)
-    return runtime_sighandler;
-#endif
-
-  return (void *) sa.sa_handler;
-}
-
-/* Used by the os package to raise SIGPIPE.  */
-
-void os_sigpipe (void) __asm__ (GOSYM_PREFIX "os.sigpipe");
-
-void
-os_sigpipe (void)
-{
-  struct sigaction sa;
-  int i;
-
-  memset (&sa, 0, sizeof sa);
-
-  sa.sa_handler = SIG_DFL;
-
-  i = sigemptyset (&sa.sa_mask);
-  __go_assert (i == 0);
-
-  if (sigaction (SIGPIPE, &sa, NULL) != 0)
-    abort ();
-
-  raise (SIGPIPE);
-}
-
-void
-runtime_setprof(bool on)
-{
-	USED(on);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-strcmp.c b/third_party/gofrontend/libgo/runtime/go-strcmp.c
deleted file mode 100644
index bcc270b..0000000
--- a/third_party/gofrontend/libgo/runtime/go-strcmp.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* go-strcmp.c -- the go string comparison function.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-
-intgo
-__go_strcmp(String s1, String s2)
-{
-  int i;
-
-  i = __builtin_memcmp(s1.str, s2.str,
-		       (s1.len < s2.len ? s1.len : s2.len));
-  if (i != 0)
-    return i;
-
-  if (s1.len < s2.len)
-    return -1;
-  else if (s1.len > s2.len)
-    return 1;
-  else
-    return 0;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-string-to-byte-array.c b/third_party/gofrontend/libgo/runtime/go-string-to-byte-array.c
deleted file mode 100644
index a4edb50..0000000
--- a/third_party/gofrontend/libgo/runtime/go-string-to-byte-array.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* go-string-to-byte-array.c -- convert a string to an array of bytes in Go.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "array.h"
-#include "arch.h"
-#include "malloc.h"
-
-struct __go_open_array
-__go_string_to_byte_array (String str)
-{
-  uintptr cap;
-  unsigned char *data;
-  struct __go_open_array ret;
-
-  cap = runtime_roundupsize (str.len);
-  data = (unsigned char *) runtime_mallocgc (cap, 0, FlagNoScan | FlagNoZero);
-  __builtin_memcpy (data, str.str, str.len);
-  if (cap != (uintptr) str.len)
-    __builtin_memset (data + str.len, 0, cap - (uintptr) str.len);
-  ret.__values = (void *) data;
-  ret.__count = str.len;
-  ret.__capacity = (intgo) cap;
-  return ret;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-string-to-int-array.c b/third_party/gofrontend/libgo/runtime/go-string-to-int-array.c
deleted file mode 100644
index 5546889..0000000
--- a/third_party/gofrontend/libgo/runtime/go-string-to-int-array.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* go-string-to-int-array.c -- convert a string to an array of ints in Go.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-alloc.h"
-#include "go-string.h"
-#include "array.h"
-#include "arch.h"
-#include "malloc.h"
-
-struct __go_open_array
-__go_string_to_int_array (String str)
-{
-  size_t c;
-  const unsigned char *p;
-  const unsigned char *pend;
-  uintptr mem;
-  uint32_t *data;
-  uint32_t *pd;
-  struct __go_open_array ret;
-
-  c = 0;
-  p = str.str;
-  pend = p + str.len;
-  while (p < pend)
-    {
-      int rune;
-
-      ++c;
-      p += __go_get_rune (p, pend - p, &rune);
-    }
-
-  if (c > MaxMem / sizeof (uint32_t))
-    runtime_throw ("out of memory");
-
-  mem = runtime_roundupsize (c * sizeof (uint32_t));
-  data = (uint32_t *) runtime_mallocgc (mem, 0, FlagNoScan | FlagNoZero);
-  p = str.str;
-  pd = data;
-  while (p < pend)
-    {
-      int rune;
-
-      p += __go_get_rune (p, pend - p, &rune);
-      *pd++ = rune;
-    }
-  if (mem > (uintptr) c * sizeof (uint32_t))
-    __builtin_memset (data + c, 0, mem - (uintptr) c * sizeof (uint32_t));
-  ret.__values = (void *) data;
-  ret.__count = c;
-  ret.__capacity = (intgo) (mem / sizeof (uint32_t));
-  return ret;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-string.h b/third_party/gofrontend/libgo/runtime/go-string.h
deleted file mode 100644
index 7fee1da..0000000
--- a/third_party/gofrontend/libgo/runtime/go-string.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* go-string.h -- the string type for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#ifndef LIBGO_GO_STRING_H
-#define LIBGO_GO_STRING_H
-
-#include <stddef.h>
-
-static inline _Bool
-__go_strings_equal (String s1, String s2)
-{
-  return (s1.len == s2.len
-	  && __builtin_memcmp (s1.str, s2.str, s1.len) == 0);
-}
-
-static inline _Bool
-__go_ptr_strings_equal (const String *ps1, const String *ps2)
-{
-  if (ps1 == NULL)
-    return ps2 == NULL;
-  if (ps2 == NULL)
-    return 0;
-  return __go_strings_equal (*ps1, *ps2);
-}
-
-extern int __go_get_rune (const unsigned char *, size_t, int32 *);
-
-#endif /* !defined(LIBGO_GO_STRING_H) */
diff --git a/third_party/gofrontend/libgo/runtime/go-strplus.c b/third_party/gofrontend/libgo/runtime/go-strplus.c
deleted file mode 100644
index 13915e3..0000000
--- a/third_party/gofrontend/libgo/runtime/go-strplus.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* go-strplus.c -- the go string append function.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-String
-__go_string_plus (String s1, String s2)
-{
-  int len;
-  byte *retdata;
-  String ret;
-
-  if (s1.len == 0)
-    return s2;
-  else if (s2.len == 0)
-    return s1;
-
-  len = s1.len + s2.len;
-  retdata = runtime_mallocgc (len, 0, FlagNoScan | FlagNoZero);
-  __builtin_memcpy (retdata, s1.str, s1.len);
-  __builtin_memcpy (retdata + s1.len, s2.str, s2.len);
-  ret.str = retdata;
-  ret.len = len;
-  return ret;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-strslice.c b/third_party/gofrontend/libgo/runtime/go-strslice.c
deleted file mode 100644
index 21e1bc0..0000000
--- a/third_party/gofrontend/libgo/runtime/go-strslice.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* go-strslice.c -- the go string slice function.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "go-panic.h"
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-String
-__go_string_slice (String s, intgo start, intgo end)
-{
-  intgo len;
-  String ret;
-
-  len = s.len;
-  if (end == -1)
-    end = len;
-  if (start > len || end < start || end > len)
-    runtime_panicstring ("string index out of bounds");
-  ret.str = s.str + start;
-  ret.len = end - start;
-  return ret;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-traceback.c b/third_party/gofrontend/libgo/runtime/go-traceback.c
deleted file mode 100644
index 7b33cca..0000000
--- a/third_party/gofrontend/libgo/runtime/go-traceback.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* go-traceback.c -- stack backtrace for Go.
-
-   Copyright 2012 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "config.h"
-
-#include "runtime.h"
-
-/* Print a stack trace for the current goroutine.  */
-
-void
-runtime_traceback ()
-{
-  Location locbuf[100];
-  int32 c;
-
-  c = runtime_callers (1, locbuf, nelem (locbuf), false);
-  runtime_printtrace (locbuf, c, true);
-}
-
-void
-runtime_printtrace (Location *locbuf, int32 c, bool current)
-{
-  int32 i;
-
-  for (i = 0; i < c; ++i)
-    {
-      if (runtime_showframe (locbuf[i].function, current))
-	{
-	  runtime_printf ("%S\n", locbuf[i].function);
-	  runtime_printf ("\t%S:%D\n", locbuf[i].filename,
-			  (int64) locbuf[i].lineno);
-	}
-    }
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-type-complex.c b/third_party/gofrontend/libgo/runtime/go-type-complex.c
deleted file mode 100644
index 585984e..0000000
--- a/third_party/gofrontend/libgo/runtime/go-type-complex.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/* go-type-complex.c -- hash and equality complex functions.
-
-   Copyright 2012 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <complex.h>
-#include <math.h>
-#include <stdint.h>
-#include <string.h>
-#include "runtime.h"
-#include "go-type.h"
-
-/* Hash function for float types.  */
-
-uintptr_t
-__go_type_hash_complex (const void *vkey, uintptr_t key_size)
-{
-  if (key_size == 8)
-    {
-      const complex float *cfp;
-      complex float cf;
-      float cfr;
-      float cfi;
-      uint64_t fi;
-
-      cfp = (const complex float *) vkey;
-      cf = *cfp;
-
-      cfr = crealf (cf);
-      cfi = cimagf (cf);
-
-      if (isinf (cfr) || isinf (cfi))
-	return 0;
-
-      /* NaN != NaN, so the hash code of a NaN is irrelevant.  Make it
-	 random so that not all NaNs wind up in the same place.  */
-      if (isnan (cfr) || isnan (cfi))
-	return runtime_fastrand1 ();
-
-      /* Avoid negative zero.  */
-      if (cfr == 0 && cfi == 0)
-	return 0;
-      else if (cfr == 0)
-	cf = cfi * I;
-      else if (cfi == 0)
-	cf = cfr;
-
-      memcpy (&fi, &cf, 8);
-      return (uintptr_t) cfi;
-    }
-  else if (key_size == 16)
-    {
-      const complex double *cdp;
-      complex double cd;
-      double cdr;
-      double cdi;
-      uint64_t di[2];
-
-      cdp = (const complex double *) vkey;
-      cd = *cdp;
-
-      cdr = creal (cd);
-      cdi = cimag (cd);
-
-      if (isinf (cdr) || isinf (cdi))
-	return 0;
-
-      if (isnan (cdr) || isnan (cdi))
-	return runtime_fastrand1 ();
-
-      /* Avoid negative zero.  */
-      if (cdr == 0 && cdi == 0)
-	return 0;
-      else if (cdr == 0)
-	cd = cdi * I;
-      else if (cdi == 0)
-	cd = cdr;
-
-      memcpy (&di, &cd, 16);
-      return di[0] ^ di[1];
-    }
-  else
-    runtime_throw ("__go_type_hash_complex: invalid complex size");
-}
-
-const FuncVal __go_type_hash_complex_descriptor =
-  { (void *) __go_type_hash_complex };
-
-/* Equality function for complex types.  */
-
-_Bool
-__go_type_equal_complex (const void *vk1, const void *vk2, uintptr_t key_size)
-{
-  if (key_size == 8)
-    {
-      const complex float *cfp1;
-      const complex float *cfp2;
-      
-      cfp1 = (const complex float *) vk1;
-      cfp2 = (const complex float *) vk2;
-
-      return *cfp1 == *cfp2;
-    }
-  else if (key_size == 16)
-    {
-      const complex double *cdp1;
-      const complex double *cdp2;
-      
-      cdp1 = (const complex double *) vk1;
-      cdp2 = (const complex double *) vk2;
-
-      return *cdp1 == *cdp2;
-    }
-  else
-    runtime_throw ("__go_type_equal_complex: invalid complex size");
-}
-
-const FuncVal __go_type_equal_complex_descriptor =
-  { (void *) __go_type_equal_complex };
diff --git a/third_party/gofrontend/libgo/runtime/go-type-eface.c b/third_party/gofrontend/libgo/runtime/go-type-eface.c
deleted file mode 100644
index 315c30e..0000000
--- a/third_party/gofrontend/libgo/runtime/go-type-eface.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* go-type-eface.c -- hash and equality empty interface functions.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "interface.h"
-#include "go-type.h"
-
-/* A hash function for an empty interface.  */
-
-uintptr_t
-__go_type_hash_empty_interface (const void *vval,
-				uintptr_t key_size __attribute__ ((unused)))
-{
-  const struct __go_empty_interface *val;
-  const struct __go_type_descriptor *descriptor;
-  uintptr_t size;
-
-  val = (const struct __go_empty_interface *) vval;
-  descriptor = val->__type_descriptor;
-  if (descriptor == NULL)
-    return 0;
-  size = descriptor->__size;
-  if (__go_is_pointer_type (descriptor))
-    return __go_call_hashfn (descriptor->__hashfn, &val->__object, size);
-  else
-    return __go_call_hashfn (descriptor->__hashfn, val->__object, size);
-}
-
-const FuncVal __go_type_hash_empty_interface_descriptor =
-  { (void *) __go_type_hash_empty_interface };
-
-/* An equality function for an empty interface.  */
-
-_Bool
-__go_type_equal_empty_interface (const void *vv1, const void *vv2,
-				 uintptr_t key_size __attribute__ ((unused)))
-{
-  const struct __go_empty_interface *v1;
-  const struct __go_empty_interface *v2;
-  const struct __go_type_descriptor* v1_descriptor;
-  const struct __go_type_descriptor* v2_descriptor;
-
-  v1 = (const struct __go_empty_interface *) vv1;
-  v2 = (const struct __go_empty_interface *) vv2;
-  v1_descriptor = v1->__type_descriptor;
-  v2_descriptor = v2->__type_descriptor;
-  if (v1_descriptor == NULL || v2_descriptor == NULL)
-    return v1_descriptor == v2_descriptor;
-  if (!__go_type_descriptors_equal (v1_descriptor, v2_descriptor))
-    return 0;
-  if (__go_is_pointer_type (v1_descriptor))
-    return v1->__object == v2->__object;
-  else
-    return __go_call_equalfn (v1_descriptor->__equalfn, v1->__object,
-			      v2->__object, v1_descriptor->__size);
-}
-
-const FuncVal __go_type_equal_empty_interface_descriptor =
-  { (void *) __go_type_equal_empty_interface };
diff --git a/third_party/gofrontend/libgo/runtime/go-type-error.c b/third_party/gofrontend/libgo/runtime/go-type-error.c
deleted file mode 100644
index 8881a86..0000000
--- a/third_party/gofrontend/libgo/runtime/go-type-error.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* go-type-error.c -- invalid hash and equality functions.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-type.h"
-
-/* A hash function used for a type which does not support hash
-   functions.  */
-
-uintptr_t
-__go_type_hash_error (const void *val __attribute__ ((unused)),
-		      uintptr_t key_size __attribute__ ((unused)))
-{
-  runtime_panicstring ("hash of unhashable type");
-}
-
-const FuncVal __go_type_hash_error_descriptor =
-  { (void *) __go_type_hash_error };
-
-/* An equality function for an interface.  */
-
-_Bool
-__go_type_equal_error (const void *v1 __attribute__ ((unused)),
-		       const void *v2 __attribute__ ((unused)),
-		       uintptr_t key_size __attribute__ ((unused)))
-{
-  runtime_panicstring ("comparing uncomparable types");
-}
-
-const FuncVal __go_type_equal_error_descriptor =
-  { (void *) __go_type_equal_error };
diff --git a/third_party/gofrontend/libgo/runtime/go-type-float.c b/third_party/gofrontend/libgo/runtime/go-type-float.c
deleted file mode 100644
index 39f9b29..0000000
--- a/third_party/gofrontend/libgo/runtime/go-type-float.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* go-type-float.c -- hash and equality float functions.
-
-   Copyright 2012 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <math.h>
-#include <stdint.h>
-#include "runtime.h"
-#include "go-type.h"
-
-/* Hash function for float types.  */
-
-uintptr_t
-__go_type_hash_float (const void *vkey, uintptr_t key_size)
-{
-  if (key_size == 4)
-    {
-      const float *fp;
-      float f;
-      uint32_t si;
-
-      fp = (const float *) vkey;
-      f = *fp;
-
-      if (isinf (f) || f == 0)
-	return 0;
-
-      /* NaN != NaN, so the hash code of a NaN is irrelevant.  Make it
-	 random so that not all NaNs wind up in the same place.  */
-      if (isnan (f))
-	return runtime_fastrand1 ();
-
-      memcpy (&si, vkey, 4);
-      return (uintptr_t) si;
-    }
-  else if (key_size == 8)
-    {
-      const double *dp;
-      double d;
-      uint64_t di;
-
-      dp = (const double *) vkey;
-      d = *dp;
-
-      if (isinf (d) || d == 0)
-	return 0;
-
-      if (isnan (d))
-	return runtime_fastrand1 ();
-
-      memcpy (&di, vkey, 8);
-      return (uintptr_t) di;
-    }
-  else
-    runtime_throw ("__go_type_hash_float: invalid float size");
-}
-
-const FuncVal __go_type_hash_float_descriptor =
-  { (void *) __go_type_hash_float };
-
-/* Equality function for float types.  */
-
-_Bool
-__go_type_equal_float (const void *vk1, const void *vk2, uintptr_t key_size)
-{
-  if (key_size == 4)
-    {
-      const float *fp1;
-      const float *fp2;
-
-      fp1 = (const float *) vk1;
-      fp2 = (const float *) vk2;
-
-      return *fp1 == *fp2;
-    }
-  else if (key_size == 8)
-    {
-      const double *dp1;
-      const double *dp2;
-
-      dp1 = (const double *) vk1;
-      dp2 = (const double *) vk2;
-
-      return *dp1 == *dp2;
-    }
-  else
-    runtime_throw ("__go_type_equal_float: invalid float size");
-}
-
-const FuncVal __go_type_equal_float_descriptor =
-  { (void *) __go_type_equal_float };
diff --git a/third_party/gofrontend/libgo/runtime/go-type-identity.c b/third_party/gofrontend/libgo/runtime/go-type-identity.c
deleted file mode 100644
index a334d56..0000000
--- a/third_party/gofrontend/libgo/runtime/go-type-identity.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* go-type-identity.c -- hash and equality identity functions.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-
-#include "runtime.h"
-#include "go-type.h"
-
-/* An identity hash function for a type.  This is used for types where
-   we can simply use the type value itself as a hash code.  This is
-   true of, e.g., integers and pointers.  */
-
-uintptr_t
-__go_type_hash_identity (const void *key, uintptr_t key_size)
-{
-  uintptr_t ret;
-  uintptr_t i;
-  const unsigned char *p;
-
-  if (key_size <= 8)
-    {
-      union
-      {
-	uint64 v;
-	unsigned char a[8];
-      } u;
-      u.v = 0;
-#ifdef WORDS_BIGENDIAN
-      __builtin_memcpy (&u.a[8 - key_size], key, key_size);
-#else
-      __builtin_memcpy (&u.a[0], key, key_size);
-#endif
-      if (sizeof (uintptr_t) >= 8)
-	return (uintptr_t) u.v;
-      else
-	return (uintptr_t) ((u.v >> 32) ^ (u.v & 0xffffffff));
-    }
-
-  ret = 5381;
-  for (i = 0, p = (const unsigned char *) key; i < key_size; i++, p++)
-    ret = ret * 33 + *p;
-  return ret;
-}
-
-const FuncVal __go_type_hash_identity_descriptor =
-  { (void *) __go_type_hash_identity };
-
-/* An identity equality function for a type.  This is used for types
-   where we can check for equality by checking that the values have
-   the same bits.  */
-
-_Bool
-__go_type_equal_identity (const void *k1, const void *k2, uintptr_t key_size)
-{
-  return __builtin_memcmp (k1, k2, key_size) == 0;
-}
-
-const FuncVal __go_type_equal_identity_descriptor =
-  { (void *) __go_type_equal_identity };
diff --git a/third_party/gofrontend/libgo/runtime/go-type-interface.c b/third_party/gofrontend/libgo/runtime/go-type-interface.c
deleted file mode 100644
index e9e5779..0000000
--- a/third_party/gofrontend/libgo/runtime/go-type-interface.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* go-type-interface.c -- hash and equality interface functions.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "interface.h"
-#include "go-type.h"
-
-/* A hash function for an interface.  */
-
-uintptr_t
-__go_type_hash_interface (const void *vval,
-			  uintptr_t key_size __attribute__ ((unused)))
-{
-  const struct __go_interface *val;
-  const struct __go_type_descriptor *descriptor;
-  uintptr_t size;
-
-  val = (const struct __go_interface *) vval;
-  if (val->__methods == NULL)
-    return 0;
-  descriptor = (const struct __go_type_descriptor *) val->__methods[0];
-  size = descriptor->__size;
-  if (__go_is_pointer_type (descriptor))
-    return __go_call_hashfn (descriptor->__hashfn, &val->__object, size);
-  else
-    return __go_call_hashfn (descriptor->__hashfn, val->__object, size);
-}
-
-const FuncVal __go_type_hash_interface_descriptor =
-  { (void *) __go_type_hash_interface };
-
-/* An equality function for an interface.  */
-
-_Bool
-__go_type_equal_interface (const void *vv1, const void *vv2,
-			   uintptr_t key_size __attribute__ ((unused)))
-{
-  const struct __go_interface *v1;
-  const struct __go_interface *v2;
-  const struct __go_type_descriptor* v1_descriptor;
-  const struct __go_type_descriptor* v2_descriptor;
-
-  v1 = (const struct __go_interface *) vv1;
-  v2 = (const struct __go_interface *) vv2;
-  if (v1->__methods == NULL || v2->__methods == NULL)
-    return v1->__methods == v2->__methods;
-  v1_descriptor = (const struct __go_type_descriptor *) v1->__methods[0];
-  v2_descriptor = (const struct __go_type_descriptor *) v2->__methods[0];
-  if (!__go_type_descriptors_equal (v1_descriptor, v2_descriptor))
-    return 0;
-  if (__go_is_pointer_type (v1_descriptor))
-    return v1->__object == v2->__object;
-  else
-    return __go_call_equalfn (v1_descriptor->__equalfn, v1->__object,
-			      v2->__object, v1_descriptor->__size);
-}
-
-const FuncVal __go_type_equal_interface_descriptor =
-  { (void *) __go_type_equal_interface };
diff --git a/third_party/gofrontend/libgo/runtime/go-type-string.c b/third_party/gofrontend/libgo/runtime/go-type-string.c
deleted file mode 100644
index 3d33d6e..0000000
--- a/third_party/gofrontend/libgo/runtime/go-type-string.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* go-type-string.c -- hash and equality string functions.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-type.h"
-#include "go-string.h"
-
-/* A string hash function for a map.  */
-
-uintptr_t
-__go_type_hash_string (const void *vkey,
-		       uintptr_t key_size __attribute__ ((unused)))
-{
-  uintptr_t ret;
-  const String *key;
-  intgo len;
-  intgo i;
-  const byte *p;
-
-  ret = 5381;
-  key = (const String *) vkey;
-  len = key->len;
-  for (i = 0, p = key->str; i < len; i++, p++)
-    ret = ret * 33 + *p;
-  return ret;
-}
-
-const FuncVal __go_type_hash_string_descriptor =
-  { (void *) __go_type_hash_string };
-
-/* A string equality function for a map.  */
-
-_Bool
-__go_type_equal_string (const void *vk1, const void *vk2,
-			uintptr_t key_size __attribute__ ((unused)))
-{
-  const String *k1;
-  const String *k2;
-
-  k1 = (const String *) vk1;
-  k2 = (const String *) vk2;
-  return __go_ptr_strings_equal (k1, k2);
-}
-
-const FuncVal __go_type_equal_string_descriptor =
-  { (void *) __go_type_equal_string };
diff --git a/third_party/gofrontend/libgo/runtime/go-type.h b/third_party/gofrontend/libgo/runtime/go-type.h
deleted file mode 100644
index eb063ec..0000000
--- a/third_party/gofrontend/libgo/runtime/go-type.h
+++ /dev/null
@@ -1,362 +0,0 @@
-/* go-type.h -- basic information for a Go type.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#ifndef LIBGO_GO_TYPE_H
-#define LIBGO_GO_TYPE_H
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "array.h"
-
-struct String;
-
-/* Many of the types in this file must match the data structures
-   generated by the compiler, and must also match the Go types which
-   appear in go/runtime/type.go and go/reflect/type.go.  */
-
-/* Type kinds.  These are used to get the type descriptor to use for
-   the type itself, when using unsafe.Typeof or unsafe.Reflect.  The
-   values here must match the values generated by the compiler (the
-   RUNTIME_TYPE_KIND_xxx values in gcc/go/types.h).  These are macros
-   rather than an enum to make it easy to change values in the future
-   and hard to get confused about it.
-
-   These correspond to the kind values used by the gc compiler.  */
-
-#define GO_BOOL 1
-#define GO_INT 2
-#define GO_INT8 3
-#define GO_INT16 4
-#define GO_INT32 5
-#define GO_INT64 6
-#define GO_UINT 7
-#define GO_UINT8 8
-#define GO_UINT16 9
-#define GO_UINT32 10
-#define GO_UINT64 11
-#define GO_UINTPTR 12
-#define GO_FLOAT32 13
-#define GO_FLOAT64 14
-#define GO_COMPLEX64 15
-#define GO_COMPLEX128 16
-#define GO_ARRAY 17
-#define GO_CHAN 18
-#define GO_FUNC 19
-#define GO_INTERFACE 20
-#define GO_MAP 21
-#define GO_PTR 22
-#define GO_SLICE 23
-#define GO_STRING 24
-#define GO_STRUCT 25
-#define GO_UNSAFE_POINTER 26
-
-#define GO_DIRECT_IFACE (1 << 5)
-#define GO_GC_PROG (1 << 6)
-#define GO_NO_POINTERS (1 << 7)
-
-#define GO_CODE_MASK 0x1f
-
-/* For each Go type the compiler constructs one of these structures.
-   This is used for type reflection, interfaces, maps, and reference
-   counting.  */
-
-struct __go_type_descriptor
-{
-  /* The type code for this type, one of the type kind values above.
-     This is used by unsafe.Reflect and unsafe.Typeof to determine the
-     type descriptor to return for this type itself.  It is also used
-     by reflect.toType when mapping to a reflect Type structure.  */
-  unsigned char __code;
-
-  /* The alignment in bytes of a variable with this type.  */
-  unsigned char __align;
-
-  /* The alignment in bytes of a struct field with this type.  */
-  unsigned char __field_align;
-
-  /* The size in bytes of a value of this type.  Note that all types
-     in Go have a fixed size.  */
-  uintptr_t __size;
-
-  /* The type's hash code.  */
-  uint32_t __hash;
-
-  /* This function takes a pointer to a value of this type, and the
-     size of this type, and returns a hash code.  We pass the size
-     explicitly becaues it means that we can share a single instance
-     of this function for various different types.  */
-  const FuncVal *__hashfn;
-
-  /* This function takes two pointers to values of this type, and the
-     size of this type, and returns whether the values are equal.  */
-  const FuncVal *__equalfn;
-
-  /* The garbage collection data. */
-  const uintptr *__gc;
-
-  /* A string describing this type.  This is only used for
-     debugging.  */
-  const struct String *__reflection;
-
-  /* A pointer to fields which are only used for some types.  */
-  const struct __go_uncommon_type *__uncommon;
-
-  /* The descriptor for the type which is a pointer to this type.
-     This may be NULL.  */
-  const struct __go_type_descriptor *__pointer_to_this;
-};
-
-/* The information we store for each method of a type.  */
-
-struct __go_method
-{
-  /* The name of the method.  */
-  const struct String *__name;
-
-  /* This is NULL for an exported method, or the name of the package
-     where it lives.  */
-  const struct String *__pkg_path;
-
-  /* The type of the method, without the receiver.  This will be a
-     function type.  */
-  const struct __go_type_descriptor *__mtype;
-
-  /* The type of the method, with the receiver.  This will be a
-     function type.  */
-  const struct __go_type_descriptor *__type;
-
-  /* A pointer to the code which implements the method.  This is
-     really a function pointer.  */
-  const void *__function;
-};
-
-/* Additional information that we keep for named types and for types
-   with methods.  */
-
-struct __go_uncommon_type
-{
-  /* The name of the type.  */
-  const struct String *__name;
-
-  /* The type's package.  This is NULL for builtin types.  */
-  const struct String *__pkg_path;
-
-  /* The type's methods.  This is an array of struct __go_method.  */
-  struct __go_open_array __methods;
-};
-
-/* The type descriptor for a fixed array type.  */
-
-struct __go_array_type
-{
-  /* Starts like all type descriptors.  */
-  struct __go_type_descriptor __common;
-
-  /* The element type.  */
-  struct __go_type_descriptor *__element_type;
-
-  /* The type of a slice of the same element type.  */
-  struct __go_type_descriptor *__slice_type;
-
-  /* The length of the array.  */
-  uintptr_t __len;
-};
-
-/* The type descriptor for a slice.  */
-
-struct __go_slice_type
-{
-  /* Starts like all other type descriptors.  */
-  struct __go_type_descriptor __common;
-
-  /* The element type.  */
-  struct __go_type_descriptor *__element_type;
-};
-
-/* The direction of a channel.  */
-#define CHANNEL_RECV_DIR 1
-#define CHANNEL_SEND_DIR 2
-#define CHANNEL_BOTH_DIR (CHANNEL_RECV_DIR | CHANNEL_SEND_DIR)
-
-/* The type descriptor for a channel.  */
-
-struct __go_channel_type
-{
-  /* Starts like all other type descriptors.  */
-  struct __go_type_descriptor __common;
-
-  /* The element type.  */
-  const struct __go_type_descriptor *__element_type;
-
-  /* The direction.  */
-  uintptr_t __dir;
-};
-
-/* The type descriptor for a function.  */
-
-struct __go_func_type
-{
-  /* Starts like all other type descriptors.  */
-  struct __go_type_descriptor __common;
-
-  /* Whether this is a varargs function.  If this is true, there will
-     be at least one parameter.  For "..." the last parameter type is
-     "interface{}".  For "... T" the last parameter type is "[]T".  */
-  _Bool __dotdotdot;
-
-  /* The input parameter types.  This is an array of pointers to
-     struct __go_type_descriptor.  */
-  struct __go_open_array __in;
-
-  /* The output parameter types.  This is an array of pointers to
-     struct __go_type_descriptor.  */
-  struct __go_open_array __out;
-};
-
-/* A method on an interface type.  */
-
-struct __go_interface_method
-{
-  /* The name of the method.  */
-  const struct String *__name;
-
-  /* This is NULL for an exported method, or the name of the package
-     where it lives.  */
-  const struct String *__pkg_path;
-
-  /* The real type of the method.  */
-  struct __go_type_descriptor *__type;
-};
-
-/* An interface type.  */
-
-struct __go_interface_type
-{
-  /* Starts like all other type descriptors.  */
-  struct __go_type_descriptor __common;
-
-  /* Array of __go_interface_method .  The methods are sorted in the
-     same order that they appear in the definition of the
-     interface.  */
-  struct __go_open_array __methods;
-};
-
-/* A map type.  */
-
-struct __go_map_type
-{
-  /* Starts like all other type descriptors.  */
-  struct __go_type_descriptor __common;
-
-  /* The map key type.  */
-  const struct __go_type_descriptor *__key_type;
-
-  /* The map value type.  */
-  const struct __go_type_descriptor *__val_type;
-};
-
-/* A pointer type.  */
-
-struct __go_ptr_type
-{
-  /* Starts like all other type descriptors.  */
-  struct __go_type_descriptor __common;
-
-  /* The type to which this points.  */
-  const struct __go_type_descriptor *__element_type;
-};
-
-/* A field in a structure.  */
-
-struct __go_struct_field
-{
-  /* The name of the field--NULL for an anonymous field.  */
-  const struct String *__name;
-
-  /* This is NULL for an exported method, or the name of the package
-     where it lives.  */
-  const struct String *__pkg_path;
-
-  /* The type of the field.  */
-  const struct __go_type_descriptor *__type;
-
-  /* The field tag, or NULL.  */
-  const struct String *__tag;
-
-  /* The offset of the field in the struct.  */
-  uintptr_t __offset;
-};
-
-/* A struct type.  */
-
-struct __go_struct_type
-{
-  /* Starts like all other type descriptors.  */
-  struct __go_type_descriptor __common;
-
-  /* An array of struct __go_struct_field.  */
-  struct __go_open_array __fields;
-};
-
-/* Whether a type descriptor is a pointer.  */
-
-static inline _Bool
-__go_is_pointer_type (const struct __go_type_descriptor *td)
-{
-  return ((td->__code & GO_CODE_MASK) == GO_PTR
-	  || (td->__code & GO_CODE_MASK) == GO_UNSAFE_POINTER);
-}
-
-/* Call a type hash function, given the __hashfn value.  */
-
-static inline uintptr_t
-__go_call_hashfn (const FuncVal *hashfn, const void *p, uintptr_t size)
-{
-  uintptr_t (*h) (const void *, uintptr_t) = (void *) hashfn->fn;
-  return __builtin_call_with_static_chain (h (p, size), hashfn);
-}
-
-/* Call a type equality function, given the __equalfn value.  */
-
-static inline _Bool
-__go_call_equalfn (const FuncVal *equalfn, const void *p1, const void *p2,
-		   uintptr_t size)
-{
-  _Bool (*e) (const void *, const void *, uintptr_t) = (void *) equalfn->fn;
-  return __builtin_call_with_static_chain (e (p1, p2, size), equalfn);
-}
-
-extern _Bool
-__go_type_descriptors_equal(const struct __go_type_descriptor*,
-			    const struct __go_type_descriptor*);
-
-extern uintptr_t __go_type_hash_identity (const void *, uintptr_t);
-extern const FuncVal __go_type_hash_identity_descriptor;
-extern _Bool __go_type_equal_identity (const void *, const void *, uintptr_t);
-extern const FuncVal __go_type_equal_identity_descriptor;
-extern uintptr_t __go_type_hash_string (const void *, uintptr_t);
-extern const FuncVal __go_type_hash_string_descriptor;
-extern _Bool __go_type_equal_string (const void *, const void *, uintptr_t);
-extern const FuncVal __go_type_equal_string_descriptor;
-extern uintptr_t __go_type_hash_float (const void *, uintptr_t);
-extern const FuncVal __go_type_hash_float_descriptor;
-extern _Bool __go_type_equal_float (const void *, const void *, uintptr_t);
-extern const FuncVal __go_type_equal_float_descriptor;
-extern uintptr_t __go_type_hash_complex (const void *, uintptr_t);
-extern const FuncVal __go_type_hash_complex_descriptor;
-extern _Bool __go_type_equal_complex (const void *, const void *, uintptr_t);
-extern const FuncVal __go_type_equal_complex_descriptor;
-extern uintptr_t __go_type_hash_interface (const void *, uintptr_t);
-extern const FuncVal __go_type_hash_interface_descriptor;
-extern _Bool __go_type_equal_interface (const void *, const void *, uintptr_t);
-extern const FuncVal __go_type_equal_interface_descriptor;
-extern uintptr_t __go_type_hash_error (const void *, uintptr_t);
-extern const FuncVal __go_type_hash_error_descriptor;
-extern _Bool __go_type_equal_error (const void *, const void *, uintptr_t);
-extern const FuncVal __go_type_equal_error_descriptor;
-
-#endif /* !defined(LIBGO_GO_TYPE_H) */
diff --git a/third_party/gofrontend/libgo/runtime/go-typedesc-equal.c b/third_party/gofrontend/libgo/runtime/go-typedesc-equal.c
deleted file mode 100644
index 90079f2..0000000
--- a/third_party/gofrontend/libgo/runtime/go-typedesc-equal.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* go-typedesc-equal.c -- return whether two type descriptors are equal.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "go-string.h"
-#include "go-type.h"
-
-/* Compare type descriptors for equality.  This is necessary because
-   types may have different descriptors in different shared libraries.
-   Also, unnamed types may have multiple type descriptors even in a
-   single shared library.  */
-
-_Bool
-__go_type_descriptors_equal (const struct __go_type_descriptor *td1,
-			     const struct __go_type_descriptor *td2)
-{
-  if (td1 == td2)
-    return 1;
-  /* In a type switch we can get a NULL descriptor.  */
-  if (td1 == NULL || td2 == NULL)
-    return 0;
-  if (td1->__code != td2->__code || td1->__hash != td2->__hash)
-    return 0;
-  return __go_ptr_strings_equal (td1->__reflection, td2->__reflection);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-unsafe-new.c b/third_party/gofrontend/libgo/runtime/go-unsafe-new.c
deleted file mode 100644
index 7848642..0000000
--- a/third_party/gofrontend/libgo/runtime/go-unsafe-new.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* go-unsafe-new.c -- unsafe.New function for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-#include "go-type.h"
-#include "interface.h"
-
-/* Implement unsafe_New, called from the reflect package.  */
-
-void *unsafe_New (const struct __go_type_descriptor *)
-  __asm__ (GOSYM_PREFIX "reflect.unsafe_New");
-
-/* The dynamic type of the argument will be a pointer to a type
-   descriptor.  */
-
-void *
-unsafe_New (const struct __go_type_descriptor *descriptor)
-{
-  return runtime_cnew (descriptor);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-unsafe-newarray.c b/third_party/gofrontend/libgo/runtime/go-unsafe-newarray.c
deleted file mode 100644
index f5c5efc..0000000
--- a/third_party/gofrontend/libgo/runtime/go-unsafe-newarray.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* go-unsafe-newarray.c -- unsafe.NewArray function for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-#include "go-type.h"
-#include "interface.h"
-
-/* Implement unsafe_NewArray, called from the reflect package.  */
-
-void *unsafe_NewArray (const struct __go_type_descriptor *, intgo)
-  __asm__ (GOSYM_PREFIX "reflect.unsafe_NewArray");
-
-/* The dynamic type of the argument will be a pointer to a type
-   descriptor.  */
-
-void *
-unsafe_NewArray (const struct __go_type_descriptor *descriptor, intgo n)
-{
-  return runtime_cnewarray (descriptor, n);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-unsafe-pointer.c b/third_party/gofrontend/libgo/runtime/go-unsafe-pointer.c
deleted file mode 100644
index ce82fcd..0000000
--- a/third_party/gofrontend/libgo/runtime/go-unsafe-pointer.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/* go-unsafe-pointer.c -- unsafe.Pointer type descriptor for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-
-#include "runtime.h"
-#include "go-type.h"
-#include "mgc0.h"
-
-/* This file provides the type descriptor for the unsafe.Pointer type.
-   The unsafe package is defined by the compiler itself, which means
-   that there is no package to compile to define the type
-   descriptor.  */
-
-extern const struct __go_type_descriptor unsafe_Pointer
-  __asm__ (GOSYM_PREFIX "__go_tdn_unsafe.Pointer");
-
-extern const uintptr unsafe_Pointer_gc[]
-  __asm__ (GOSYM_PREFIX "__go_tdn_unsafe.Pointer$gc");
-
-/* Used to determine the field alignment.  */
-struct field_align
-{
-  char c;
-  void *p;
-};
-
-/* The reflection string.  */
-#define REFLECTION "unsafe.Pointer"
-static const String reflection_string =
-{
-  (const byte *) REFLECTION,
-  sizeof REFLECTION - 1
-};
-
-const uintptr unsafe_Pointer_gc[] = {sizeof(void*), GC_APTR, 0, GC_END};
-
-const struct __go_type_descriptor unsafe_Pointer =
-{
-  /* __code */
-  GO_UNSAFE_POINTER | GO_DIRECT_IFACE,
-  /* __align */
-  __alignof (void *),
-  /* __field_align */
-  offsetof (struct field_align, p) - 1,
-  /* __size */
-  sizeof (void *),
-  /* __hash */
-  78501163U,
-  /* __hashfn */
-  &__go_type_hash_identity_descriptor,
-  /* __equalfn */
-  &__go_type_equal_identity_descriptor,
-  /* __gc */
-  unsafe_Pointer_gc,
-  /* __reflection */
-  &reflection_string,
-  /* __uncommon */
-  NULL,
-  /* __pointer_to_this */
-  NULL
-};
-
-/* We also need the type descriptor for the pointer to unsafe.Pointer,
-   since any package which refers to that type descriptor will expect
-   it to be defined elsewhere.  */
-
-extern const struct __go_ptr_type pointer_unsafe_Pointer
-  __asm__ (GOSYM_PREFIX "__go_td_pN14_unsafe.Pointer");
-
-/* The reflection string.  */
-#define PREFLECTION "*unsafe.Pointer"
-static const String preflection_string =
-{
-  (const byte *) PREFLECTION,
-  sizeof PREFLECTION - 1,
-};
-
-const struct __go_ptr_type pointer_unsafe_Pointer =
-{
-  /* __common */
-  {
-    /* __code */
-    GO_PTR | GO_DIRECT_IFACE,
-    /* __align */
-    __alignof (void *),
-    /* __field_align */
-    offsetof (struct field_align, p) - 1,
-    /* __size */
-    sizeof (void *),
-    /* __hash */
-    1256018616U,
-    /* __hashfn */
-    &__go_type_hash_identity_descriptor,
-    /* __equalfn */
-    &__go_type_equal_identity_descriptor,
-    /* __gc */
-    unsafe_Pointer_gc,
-    /* __reflection */
-    &preflection_string,
-    /* __uncommon */
-    NULL,
-    /* __pointer_to_this */
-    NULL
-  },
-  /* __element_type */
-  &unsafe_Pointer
-};
diff --git a/third_party/gofrontend/libgo/runtime/go-unsetenv.c b/third_party/gofrontend/libgo/runtime/go-unsetenv.c
deleted file mode 100644
index 409436a..0000000
--- a/third_party/gofrontend/libgo/runtime/go-unsetenv.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* go-unsetenv.c -- unset an environment variable from Go.
-
-   Copyright 2015 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "config.h"
-
-#include <stddef.h>
-#include <stdlib.h>
-
-#include "go-alloc.h"
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-/* Unset an environment variable from Go.  This is called by
-   syscall.Unsetenv.  */
-
-void unsetenv_c (String) __asm__ (GOSYM_PREFIX "syscall.unsetenv_c");
-
-void
-unsetenv_c (String k)
-{
-  const byte *ks;
-  unsigned char *kn;
-  intgo len;
-
-  ks = k.str;
-  if (ks == NULL)
-    ks = (const byte *) "";
-  kn = NULL;
-
-#ifdef HAVE_UNSETENV
-
-  if (ks != NULL && ks[k.len] != 0)
-    {
-      // Objects that are explicitly freed must be at least 16 bytes in size,
-      // so that they are not allocated using tiny alloc.
-      len = k.len + 1;
-      if (len < TinySize)
-	len = TinySize;
-      kn = __go_alloc (len);
-      __builtin_memcpy (kn, ks, k.len);
-      ks = kn;
-    }
-
-  unsetenv ((const char *) ks);
-
-#endif /* !defined(HAVE_UNSETENV) */
-
-  if (kn != NULL)
-    __go_free (kn);
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-unwind.c b/third_party/gofrontend/libgo/runtime/go-unwind.c
deleted file mode 100644
index 87d9eb3..0000000
--- a/third_party/gofrontend/libgo/runtime/go-unwind.c
+++ /dev/null
@@ -1,443 +0,0 @@
-/* go-unwind.c -- unwind the stack for panic/recover.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "unwind.h"
-#define NO_SIZE_OF_ENCODED_VALUE
-#include "unwind-pe.h"
-
-#include "runtime.h"
-#include "go-alloc.h"
-#include "go-defer.h"
-#include "go-panic.h"
-
-/* The code for a Go exception.  */
-
-#ifdef __ARM_EABI_UNWINDER__
-static const _Unwind_Exception_Class __go_exception_class =
-  { 'G', 'N', 'U', 'C', 'G', 'O', '\0', '\0' };
-#else
-static const _Unwind_Exception_Class __go_exception_class =
-  ((((((((_Unwind_Exception_Class) 'G' 
-         << 8 | (_Unwind_Exception_Class) 'N')
-        << 8 | (_Unwind_Exception_Class) 'U')
-       << 8 | (_Unwind_Exception_Class) 'C')
-      << 8 | (_Unwind_Exception_Class) 'G')
-     << 8 | (_Unwind_Exception_Class) 'O')
-    << 8 | (_Unwind_Exception_Class) '\0')
-   << 8 | (_Unwind_Exception_Class) '\0');
-#endif
-
-
-/* This function is called by exception handlers used when unwinding
-   the stack after a recovered panic.  The exception handler looks
-   like this:
-     __go_check_defer (frame);
-     return;
-   If we have not yet reached the frame we are looking for, we
-   continue unwinding.  */
-
-void
-__go_check_defer (_Bool *frame)
-{
-  G *g;
-  struct _Unwind_Exception *hdr;
-
-  g = runtime_g ();
-
-  if (g == NULL)
-    {
-      /* Some other language has thrown an exception.  We know there
-	 are no defer handlers, so there is nothing to do.  */
-    }
-  else if (g->is_foreign)
-    {
-      struct __go_panic_stack *n;
-      _Bool was_recovered;
-
-      /* Some other language has thrown an exception.  We need to run
-	 the local defer handlers.  If they call recover, we stop
-	 unwinding the stack here.  */
-
-      n = ((struct __go_panic_stack *)
-	   __go_alloc (sizeof (struct __go_panic_stack)));
-
-      n->__arg.__type_descriptor = NULL;
-      n->__arg.__object = NULL;
-      n->__was_recovered = 0;
-      n->__is_foreign = 1;
-      n->__next = g->panic;
-      g->panic = n;
-
-      while (1)
-	{
-	  struct __go_defer_stack *d;
-	  void (*pfn) (void *);
-
-	  d = g->defer;
-	  if (d == NULL || d->__frame != frame || d->__pfn == NULL)
-	    break;
-
-	  pfn = d->__pfn;
-	  g->defer = d->__next;
-
-	  (*pfn) (d->__arg);
-
-	  if (runtime_m () != NULL)
-	    runtime_freedefer (d);
-
-	  if (n->__was_recovered)
-	    {
-	      /* The recover function caught the panic thrown by some
-		 other language.  */
-	      break;
-	    }
-	}
-
-      was_recovered = n->__was_recovered;
-      g->panic = n->__next;
-      __go_free (n);
-
-      if (was_recovered)
-	{
-	  /* Just return and continue executing Go code.  */
-	  *frame = 1;
-	  return;
-	}
-
-      /* We are panicing through this function.  */
-      *frame = 0;
-    }
-  else if (g->defer != NULL
-	   && g->defer->__pfn == NULL
-	   && g->defer->__frame == frame)
-    {
-      struct __go_defer_stack *d;
-
-      /* This is the defer function which called recover.  Simply
-	 return to stop the stack unwind, and let the Go code continue
-	 to execute.  */
-      d = g->defer;
-      g->defer = d->__next;
-
-      if (runtime_m () != NULL)
-	runtime_freedefer (d);
-
-      /* We are returning from this function.  */
-      *frame = 1;
-
-      return;
-    }
-
-  /* This is some other defer function.  It was already run by the
-     call to panic, or just above.  Rethrow the exception.  */
-
-  hdr = (struct _Unwind_Exception *) g->exception;
-
-#ifdef __USING_SJLJ_EXCEPTIONS__
-  _Unwind_SjLj_Resume_or_Rethrow (hdr);
-#else
-#if defined(_LIBUNWIND_STD_ABI)
-  _Unwind_RaiseException (hdr);
-#else
-  _Unwind_Resume_or_Rethrow (hdr);
-#endif
-#endif
-
-  /* Rethrowing the exception should not return.  */
-  abort();
-}
-
-/* Unwind function calls until we reach the one which used a defer
-   function which called recover.  Each function which uses a defer
-   statement will have an exception handler, as shown above.  */
-
-void
-__go_unwind_stack ()
-{
-  struct _Unwind_Exception *hdr;
-
-  hdr = ((struct _Unwind_Exception *)
-	 __go_alloc (sizeof (struct _Unwind_Exception)));
-  __builtin_memcpy (&hdr->exception_class, &__go_exception_class,
-		    sizeof hdr->exception_class);
-  hdr->exception_cleanup = NULL;
-
-  runtime_g ()->exception = hdr;
-
-#ifdef __USING_SJLJ_EXCEPTIONS__
-  _Unwind_SjLj_RaiseException (hdr);
-#else
-  _Unwind_RaiseException (hdr);
-#endif
-
-  /* Raising an exception should not return.  */
-  abort ();
-}
-
-/* The rest of this code is really similar to gcc/unwind-c.c and
-   libjava/exception.cc.  */
-
-typedef struct
-{
-  _Unwind_Ptr Start;
-  _Unwind_Ptr LPStart;
-  _Unwind_Ptr ttype_base;
-  const unsigned char *TType;
-  const unsigned char *action_table;
-  unsigned char ttype_encoding;
-  unsigned char call_site_encoding;
-} lsda_header_info;
-
-static const unsigned char *
-parse_lsda_header (struct _Unwind_Context *context, const unsigned char *p,
-		   lsda_header_info *info)
-{
-  _uleb128_t tmp;
-  unsigned char lpstart_encoding;
-
-  info->Start = (context ? _Unwind_GetRegionStart (context) : 0);
-
-  /* Find @LPStart, the base to which landing pad offsets are relative.  */
-  lpstart_encoding = *p++;
-  if (lpstart_encoding != DW_EH_PE_omit)
-    p = read_encoded_value (context, lpstart_encoding, p, &info->LPStart);
-  else
-    info->LPStart = info->Start;
-
-  /* Find @TType, the base of the handler and exception spec type data.  */
-  info->ttype_encoding = *p++;
-  if (info->ttype_encoding != DW_EH_PE_omit)
-    {
-      p = read_uleb128 (p, &tmp);
-      info->TType = p + tmp;
-    }
-  else
-    info->TType = 0;
-
-  /* The encoding and length of the call-site table; the action table
-     immediately follows.  */
-  info->call_site_encoding = *p++;
-  p = read_uleb128 (p, &tmp);
-  info->action_table = p + tmp;
-
-  return p;
-}
-
-/* The personality function is invoked when unwinding the stack due to
-   a panic.  Its job is to find the cleanup and exception handlers to
-   run.  We can't split the stack here, because we won't be able to
-   unwind from that split.  */
-
-#ifdef __ARM_EABI_UNWINDER__
-/* ARM EABI personality routines must also unwind the stack.  */
-#define CONTINUE_UNWINDING \
-  do								\
-    {								\
-      if (__gnu_unwind_frame (ue_header, context) != _URC_OK)	\
-	return _URC_FAILURE;					\
-      return _URC_CONTINUE_UNWIND;				\
-    }								\
-  while (0)
-#else
-#define CONTINUE_UNWINDING return _URC_CONTINUE_UNWIND
-#endif
-
-#ifdef __USING_SJLJ_EXCEPTIONS__
-#define PERSONALITY_FUNCTION    __gccgo_personality_sj0
-#define __builtin_eh_return_data_regno(x) x
-#else
-#define PERSONALITY_FUNCTION    __gccgo_personality_v0
-#endif
-
-#ifdef __ARM_EABI_UNWINDER__
-_Unwind_Reason_Code
-PERSONALITY_FUNCTION (_Unwind_State, struct _Unwind_Exception *,
-		      struct _Unwind_Context *)
-  __attribute__ ((no_split_stack, flatten));
-
-_Unwind_Reason_Code
-PERSONALITY_FUNCTION (_Unwind_State state,
-		      struct _Unwind_Exception * ue_header,
-		      struct _Unwind_Context * context)
-#else
-_Unwind_Reason_Code
-PERSONALITY_FUNCTION (int, _Unwind_Action, _Unwind_Exception_Class,
-		      struct _Unwind_Exception *, struct _Unwind_Context *)
-  __attribute__ ((no_split_stack, flatten));
-
-_Unwind_Reason_Code
-PERSONALITY_FUNCTION (int version,
-		      _Unwind_Action actions,
-		      _Unwind_Exception_Class exception_class,
-		      struct _Unwind_Exception *ue_header,
-		      struct _Unwind_Context *context)
-#endif
-{
-  lsda_header_info info;
-  const unsigned char *language_specific_data, *p, *action_record;
-  _Unwind_Ptr landing_pad, ip;
-  int ip_before_insn = 0;
-  _Bool is_foreign;
-  G *g;
-
-#ifdef __ARM_EABI_UNWINDER__
-  _Unwind_Action actions;
-
-  switch (state & _US_ACTION_MASK)
-    {
-    case _US_VIRTUAL_UNWIND_FRAME:
-      actions = _UA_SEARCH_PHASE;
-      break;
-
-    case _US_UNWIND_FRAME_STARTING:
-      actions = _UA_CLEANUP_PHASE;
-      if (!(state & _US_FORCE_UNWIND)
-	  && ue_header->barrier_cache.sp == _Unwind_GetGR(context, 13))
-	actions |= _UA_HANDLER_FRAME;
-      break;
-
-    case _US_UNWIND_FRAME_RESUME:
-      CONTINUE_UNWINDING;
-      break;
-
-    default:
-      abort();
-    }
-  actions |= state & _US_FORCE_UNWIND;
-
-  is_foreign = 0;
-
-  /* The dwarf unwinder assumes the context structure holds things like the
-     function and LSDA pointers.  The ARM implementation caches these in
-     the exception header (UCB).  To avoid rewriting everything we make the
-     virtual IP register point at the UCB.  */
-  ip = (_Unwind_Ptr) ue_header;
-  _Unwind_SetGR (context, 12, ip);
-#else
-  if (version != 1)
-    return _URC_FATAL_PHASE1_ERROR;
-
-  is_foreign = exception_class != __go_exception_class;
-#endif
-
-  language_specific_data = (const unsigned char *)
-    _Unwind_GetLanguageSpecificData (context);
-
-  /* If no LSDA, then there are no handlers or cleanups.  */
-  if (! language_specific_data)
-    CONTINUE_UNWINDING;
-
-  /* Parse the LSDA header.  */
-  p = parse_lsda_header (context, language_specific_data, &info);
-#ifdef HAVE_GETIPINFO
-  ip = _Unwind_GetIPInfo (context, &ip_before_insn);
-#else
-  ip = _Unwind_GetIP (context);
-#endif
-  if (! ip_before_insn)
-    --ip;
-  landing_pad = 0;
-  action_record = NULL;
-
-#ifdef __USING_SJLJ_EXCEPTIONS__
-  /* The given "IP" is an index into the call-site table, with two
-     exceptions -- -1 means no-action, and 0 means terminate.  But
-     since we're using uleb128 values, we've not got random access
-     to the array.  */
-  if ((int) ip <= 0)
-    return _URC_CONTINUE_UNWIND;
-  else
-    {
-      _uleb128_t cs_lp, cs_action;
-      do
-	{
-	  p = read_uleb128 (p, &cs_lp);
-	  p = read_uleb128 (p, &cs_action);
-	}
-      while (--ip);
-
-      /* Can never have null landing pad for sjlj -- that would have
-	 been indicated by a -1 call site index.  */
-      landing_pad = (_Unwind_Ptr)cs_lp + 1;
-      if (cs_action)
-	action_record = info.action_table + cs_action - 1;
-      goto found_something;
-    }
-#else
-  /* Search the call-site table for the action associated with this IP.  */
-  while (p < info.action_table)
-    {
-      _Unwind_Ptr cs_start, cs_len, cs_lp;
-      _uleb128_t cs_action;
-
-      /* Note that all call-site encodings are "absolute" displacements.  */
-      p = read_encoded_value (0, info.call_site_encoding, p, &cs_start);
-      p = read_encoded_value (0, info.call_site_encoding, p, &cs_len);
-      p = read_encoded_value (0, info.call_site_encoding, p, &cs_lp);
-      p = read_uleb128 (p, &cs_action);
-
-      /* The table is sorted, so if we've passed the ip, stop.  */
-      if (ip < info.Start + cs_start)
-	p = info.action_table;
-      else if (ip < info.Start + cs_start + cs_len)
-	{
-	  if (cs_lp)
-	    landing_pad = info.LPStart + cs_lp;
-	  if (cs_action)
-	    action_record = info.action_table + cs_action - 1;
-	  goto found_something;
-	}
-    }
-#endif
-
-  /* IP is not in table.  No associated cleanups.  */
-  CONTINUE_UNWINDING;
-
- found_something:
-  if (landing_pad == 0)
-    {
-      /* IP is present, but has a null landing pad.
-	 No handler to be run.  */
-      CONTINUE_UNWINDING;
-    }
-
-  if (actions & _UA_SEARCH_PHASE)
-    {
-      if (action_record == 0)
-	{
-	  /* This indicates a cleanup rather than an exception
-	     handler.  */
-	  CONTINUE_UNWINDING;
-	}
-
-      return _URC_HANDLER_FOUND;
-    }
-
-  /* It's possible for g to be NULL here for an exception thrown by a
-     language other than Go.  */
-  g = runtime_g ();
-  if (g == NULL)
-    {
-      if (!is_foreign)
-	abort ();
-    }
-  else
-    {
-      g->exception = ue_header;
-      g->is_foreign = is_foreign;
-    }
-
-  _Unwind_SetGR (context, __builtin_eh_return_data_regno (0),
-		 (_Unwind_Ptr) ue_header);
-  _Unwind_SetGR (context, __builtin_eh_return_data_regno (1), 0);
-  _Unwind_SetIP (context, landing_pad);
-  return _URC_INSTALL_CONTEXT;
-}
diff --git a/third_party/gofrontend/libgo/runtime/go-varargs.c b/third_party/gofrontend/libgo/runtime/go-varargs.c
deleted file mode 100644
index 691ee56..0000000
--- a/third_party/gofrontend/libgo/runtime/go-varargs.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* go-varargs.c -- functions for calling C varargs functions.
-
-   Copyright 2013 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include "config.h"
-
-#include <errno.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-
-/* The syscall package calls C functions.  The Go compiler can not
-   represent a C varargs functions.  On some systems it's important
-   that the declaration of a function match the call.  This function
-   holds non-varargs C functions that the Go code can call.  */
-
-int
-__go_open (char *path, int mode, mode_t perm)
-{
-  return open (path, mode, perm);
-}
-
-int
-__go_fcntl (int fd, int cmd, int arg)
-{
-  return fcntl (fd, cmd, arg);
-}
-
-int
-__go_fcntl_flock (int fd, int cmd, struct flock *arg)
-{
-  return fcntl (fd, cmd, arg);
-}
-
-// This is for the net package.  We use uintptr_t to make sure that
-// the types match, since the Go and C "int" types are not the same.
-struct go_fcntl_ret {
-  uintptr_t r;
-  uintptr_t err;
-};
-
-struct go_fcntl_ret
-__go_fcntl_uintptr (uintptr_t fd, uintptr_t cmd, uintptr_t arg)
-{
-  int r;
-  struct go_fcntl_ret ret;
-
-  r = fcntl ((int) fd, (int) cmd, (int) arg);
-  ret.r = (uintptr_t) r;
-  if (r < 0)
-    ret.err = (uintptr_t) errno;
-  else
-    ret.err = 0;
-  return ret;
-}
-
-int
-__go_ioctl (int d, int request, int arg)
-{
-  return ioctl (d, request, arg);
-}
-
-int
-__go_ioctl_ptr (int d, int request, void *arg)
-{
-  return ioctl (d, request, arg);
-}
-
-#ifdef HAVE_OPEN64
-
-int
-__go_open64 (char *path, int mode, mode_t perm)
-{
-  return open64 (path, mode, perm);
-}
-
-#endif
-
-#ifdef HAVE_OPENAT
-
-int
-__go_openat (int fd, char *path, int flags, mode_t mode)
-{
-  return openat (fd, path, flags, mode);
-}
-
-#endif
diff --git a/third_party/gofrontend/libgo/runtime/goc2c.c b/third_party/gofrontend/libgo/runtime/goc2c.c
deleted file mode 100644
index 68281c3..0000000
--- a/third_party/gofrontend/libgo/runtime/goc2c.c
+++ /dev/null
@@ -1,689 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-/*
- * Translate a .goc file into a .c file.  A .goc file is a combination
- * of a limited form of Go with C.
- */
-
-/*
-	package PACKAGENAME
-	{# line}
-	func NAME([NAME TYPE { , NAME TYPE }]) [(NAME TYPE { , NAME TYPE })] \{
-	  C code with proper brace nesting
-	\}
-*/
-
-/*
- * We generate C code which implements the function such that it can
- * be called from Go and executes the C code.
- */
-
-#include <assert.h>
-#include <ctype.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-/* Package path to use.  */
-static const char *pkgpath;
-
-/* Package prefix to use.  */
-static const char *prefix;
-
-/* File and line number */
-static const char *file;
-static unsigned int lineno = 1;
-
-/* List of names and types.  */
-struct params {
-	struct params *next;
-	char *name;
-	char *type;
-};
-
-char *argv0;
-
-static void
-sysfatal(char *fmt, ...)
-{
-	char buf[256];
-	va_list arg;
-
-	va_start(arg, fmt);
-	vsnprintf(buf, sizeof buf, fmt, arg);
-	va_end(arg);
-
-	fprintf(stderr, "%s: %s\n", argv0 ? argv0 : "<prog>", buf);
-	exit(1);
-}
-
-/* Unexpected EOF.  */
-static void
-bad_eof(void)
-{
-	sysfatal("%s:%ud: unexpected EOF\n", file, lineno);
-}
-
-/* Out of memory.  */
-static void
-bad_mem(void)
-{
-	sysfatal("%s:%ud: out of memory\n", file, lineno);
-}
-
-/* Allocate memory without fail.  */
-static void *
-xmalloc(unsigned int size)
-{
-	void *ret = malloc(size);
-	if (ret == NULL)
-		bad_mem();
-	return ret;
-}
-
-/* Reallocate memory without fail.  */
-static void*
-xrealloc(void *buf, unsigned int size)
-{
-	void *ret = realloc(buf, size);
-	if (ret == NULL)
-		bad_mem();
-	return ret;
-}
-
-/* Copy a string into memory without fail.  */
-static char *
-xstrdup(const char *p)
-{
-	char *ret = xmalloc(strlen(p) + 1);
-	strcpy(ret, p);
-	return ret;
-}
-
-/* Free a list of parameters.  */
-static void
-free_params(struct params *p)
-{
-	while (p != NULL) {
-		struct params *next;
-
-		next = p->next;
-		free(p->name);
-		free(p->type);
-		free(p);
-		p = next;
-	}
-}
-
-/* Read a character, tracking lineno.  */
-static int
-getchar_update_lineno(void)
-{
-	int c;
-
-	c = getchar();
-	if (c == '\n')
-		++lineno;
-	return c;
-}
-
-/* Read a character, giving an error on EOF, tracking lineno.  */
-static int
-getchar_no_eof(void)
-{
-	int c;
-
-	c = getchar_update_lineno();
-	if (c == EOF)
-		bad_eof();
-	return c;
-}
-
-/* Read a character, skipping comments.  */
-static int
-getchar_skipping_comments(void)
-{
-	int c;
-
-	while (1) {
-		c = getchar_update_lineno();
-		if (c != '/')
-			return c;
-
-		c = getchar();
-		if (c == '/') {
-			do {
-				c = getchar_update_lineno();
-			} while (c != EOF && c != '\n');
-			return c;
-		} else if (c == '*') {
-			while (1) {
-				c = getchar_update_lineno();
-				if (c == EOF)
-					return EOF;
-				if (c == '*') {
-					do {
-						c = getchar_update_lineno();
-					} while (c == '*');
-					if (c == '/')
-						break;
-				}
-			}
-		} else {
-			ungetc(c, stdin);
-			return '/';
-		}
-	}
-}
-
-/*
- * Read and return a token.  Tokens are string or character literals
- * or else delimited by whitespace or by [(),{}].
- * The latter are all returned as single characters.
- */
-static char *
-read_token(void)
-{
-	int c, q;
-	char *buf;
-	unsigned int alc, off;
-	const char* delims = "(),{}";
-
-	while (1) {
-		c = getchar_skipping_comments();
-		if (c == EOF)
-			return NULL;
-		if (!isspace(c))
-			break;
-	}
-	alc = 16;
-	buf = xmalloc(alc + 1);
-	off = 0;
-	if(c == '"' || c == '\'') {
-		q = c;
-		buf[off] = c;
-		++off;
-		while (1) {
-			if (off+2 >= alc) { // room for c and maybe next char
-				alc *= 2;
-				buf = xrealloc(buf, alc + 1);
-			}
-			c = getchar_no_eof();
-			buf[off] = c;
-			++off;
-			if(c == q)
-				break;
-			if(c == '\\') {
-				buf[off] = getchar_no_eof();
-				++off;
-			}
-		}
-	} else if (strchr(delims, c) != NULL) {
-		buf[off] = c;
-		++off;
-	} else {
-		while (1) {
-			if (off >= alc) {
-				alc *= 2;
-				buf = xrealloc(buf, alc + 1);
-			}
-			buf[off] = c;
-			++off;
-			c = getchar_skipping_comments();
-			if (c == EOF)
-				break;
-			if (isspace(c) || strchr(delims, c) != NULL) {
-				if (c == '\n')
-					lineno--;
-				ungetc(c, stdin);
-				break;
-			}
-		}
-	}
-	buf[off] = '\0';
-	return buf;
-}
-
-/* Read a token, giving an error on EOF.  */
-static char *
-read_token_no_eof(void)
-{
-	char *token = read_token();
-	if (token == NULL)
-		bad_eof();
-	return token;
-}
-
-/* Read the package clause, and return the package name.  */
-static char *
-read_package(void)
-{
-	char *token;
-
-	token = read_token_no_eof();
-	if (token == NULL)
-		sysfatal("%s:%ud: no token\n", file, lineno);
-	if (strcmp(token, "package") != 0) {
-		sysfatal("%s:%ud: expected \"package\", got \"%s\"\n",
-			file, lineno, token);
-	}
-	return read_token_no_eof();
-}
-
-/* Read and copy preprocessor lines.  */
-static void
-read_preprocessor_lines(void)
-{
-	while (1) {
-		int c;
-
-		do {
-			c = getchar_skipping_comments();
-		} while (isspace(c));
-		if (c != '#') {
-			ungetc(c, stdin);
-			break;
-		}
-		putchar(c);
-		do {
-			c = getchar_update_lineno();
-			putchar(c);
-		} while (c != '\n');
-	}
-}
-
-/*
- * Read a type in Go syntax and return a type in C syntax.  We only
- * permit basic types and pointers.
- */
-static char *
-read_type(void)
-{
-	char *p, *op, *q;
-	int pointer_count;
-	unsigned int len;
-
-	p = read_token_no_eof();
-	if (*p != '*') {
-		/* Convert the Go type "int" to the C type "intgo",
-		   and similarly for "uint".  */
-		if (strcmp(p, "int") == 0)
-			return xstrdup("intgo");
-		else if (strcmp(p, "uint") == 0)
-			return xstrdup("uintgo");
-		return p;
-	}
-	op = p;
-	pointer_count = 0;
-	while (*p == '*') {
-		++pointer_count;
-		++p;
-	}
-
-	/* Convert the Go type "int" to the C type "intgo", and
-	   similarly for "uint".  */
-	if (strcmp(p, "int") == 0)
-	  p = (char *) "intgo";
-	else if (strcmp(p, "uint") == 0)
-	  p = (char *) "uintgo";
-
-	len = strlen(p);
-	q = xmalloc(len + pointer_count + 1);
-	memcpy(q, p, len);
-	while (pointer_count > 0) {
-		q[len] = '*';
-		++len;
-		--pointer_count;
-	}
-	q[len] = '\0';
-	free(op);
-	return q;
-}
-
-/*
- * Read a list of parameters.  Each parameter is a name and a type.
- * The list ends with a ')'.  We have already read the '('.
- */
-static struct params *
-read_params()
-{
-	char *token;
-	struct params *ret, **pp, *p;
-
-	ret = NULL;
-	pp = &ret;
-	token = read_token_no_eof();
-	if (strcmp(token, ")") != 0) {
-		while (1) {
-			p = xmalloc(sizeof(struct params));
-			p->name = token;
-			p->type = read_type();
-			p->next = NULL;
-			*pp = p;
-			pp = &p->next;
-
-			token = read_token_no_eof();
-			if (strcmp(token, ",") != 0)
-				break;
-			token = read_token_no_eof();
-		}
-	}
-	if (strcmp(token, ")") != 0) {
-		sysfatal("%s:%ud: expected '('\n",
-			file, lineno);
-	}
-	return ret;
-}
-
-/*
- * Read a function header.  This reads up to and including the initial
- * '{' character.  Returns 1 if it read a header, 0 at EOF.
- */
-static int
-read_func_header(char **name, struct params **params, struct params **rets)
-{
-	int lastline;
-	char *token;
-
-	lastline = -1;
-	while (1) {
-		token = read_token();
-		if (token == NULL)
-			return 0;
-		if (strcmp(token, "func") == 0) {
-			if(lastline != -1)
-				printf("\n");
-			break;
-		}
-		if (lastline != lineno) {
-			if (lastline == lineno-1)
-				printf("\n");
-			else
-				printf("\n#line %d \"%s\"\n", lineno, file);
-			lastline = lineno;
-		}
-		printf("%s ", token);
-	}
-
-	*name = read_token_no_eof();
-
-	token = read_token();
-	if (token == NULL || strcmp(token, "(") != 0) {
-		sysfatal("%s:%ud: expected \"(\"\n",
-			file, lineno);
-	}
-	*params = read_params();
-
-	token = read_token();
-	if (token == NULL || strcmp(token, "(") != 0)
-		*rets = NULL;
-	else {
-		*rets = read_params();
-		token = read_token();
-	}
-	if (token == NULL || strcmp(token, "{") != 0) {
-		sysfatal("%s:%ud: expected \"{\"\n",
-			file, lineno);
-	}
-	return 1;
-}
-
-/* Write out parameters.  */
-static void
-write_params(struct params *params, int *first)
-{
-	struct params *p;
-
-	for (p = params; p != NULL; p = p->next) {
-		if (*first)
-			*first = 0;
-		else
-			printf(", ");
-		printf("%s %s", p->type, p->name);
-	}
-}
-
-/* Define the gcc function return type if necessary.  */
-static void
-define_gcc_return_type(char *package, char *name, struct params *rets)
-{
-	struct params *p;
-
-	if (rets == NULL || rets->next == NULL)
-		return;
-	printf("struct %s_%s_ret {\n", package, name);
-	for (p = rets; p != NULL; p = p->next)
-		printf("  %s %s;\n", p->type, p->name);
-	printf("};\n");
-}
-
-/* Write out the gcc function return type.  */
-static void
-write_gcc_return_type(char *package, char *name, struct params *rets)
-{
-	if (rets == NULL)
-		printf("void");
-	else if (rets->next == NULL)
-		printf("%s", rets->type);
-	else
-		printf("struct %s_%s_ret", package, name);
-}
-
-/* Write out a gcc function header.  */
-static void
-write_gcc_func_header(char *package, char *name, struct params *params,
-		      struct params *rets)
-{
-	int first;
-	struct params *p;
-
-	define_gcc_return_type(package, name, rets);
-	write_gcc_return_type(package, name, rets);
-	printf(" %s_%s(", package, name);
-	first = 1;
-	write_params(params, &first);
-	printf(") __asm__ (GOSYM_PREFIX \"");
-	if (pkgpath != NULL)
-	  printf("%s", pkgpath);
-	else if (prefix != NULL)
-	  printf("%s.%s", prefix, package);
-	else
-	  printf("%s", package);
-	printf(".%s\");\n", name);
-	write_gcc_return_type(package, name, rets);
-	printf(" %s_%s(", package, name);
-	first = 1;
-	write_params(params, &first);
-	printf(")\n{\n");
-	for (p = rets; p != NULL; p = p->next)
-		printf("  %s %s;\n", p->type, p->name);
-}
-
-/* Write out a gcc function trailer.  */
-static void
-write_gcc_func_trailer(char *package, char *name, struct params *rets)
-{
-	if (rets == NULL)
-		;
-	else if (rets->next == NULL)
-		printf("return %s;\n", rets->name);
-	else {
-		struct params *p;
-
-		printf("  {\n    struct %s_%s_ret __ret;\n", package, name);
-		for (p = rets; p != NULL; p = p->next)
-			printf("    __ret.%s = %s;\n", p->name, p->name);
-		printf("    return __ret;\n  }\n");
-	}
-	printf("}\n");
-}
-
-/* Write out a function header.  */
-static void
-write_func_header(char *package, char *name, struct params *params, 
-		  struct params *rets)
-{
-	write_gcc_func_header(package, name, params, rets);
-	printf("#line %d \"%s\"\n", lineno, file);
-}
-
-/* Write out a function trailer.  */
-static void
-write_func_trailer(char *package, char *name,
-		   struct params *rets)
-{
-	write_gcc_func_trailer(package, name, rets);
-}
-
-/*
- * Read and write the body of the function, ending in an unnested }
- * (which is read but not written).
- */
-static void
-copy_body(void)
-{
-	int nesting = 0;
-	while (1) {
-		int c;
-
-		c = getchar_no_eof();
-		if (c == '}' && nesting == 0)
-			return;
-		putchar(c);
-		switch (c) {
-		default:
-			break;
-		case '{':
-			++nesting;
-			break;
-		case '}':
-			--nesting;
-			break;
-		case '/':
-			c = getchar_update_lineno();
-			putchar(c);
-			if (c == '/') {
-				do {
-					c = getchar_no_eof();
-					putchar(c);
-				} while (c != '\n');
-			} else if (c == '*') {
-				while (1) {
-					c = getchar_no_eof();
-					putchar(c);
-					if (c == '*') {
-						do {
-							c = getchar_no_eof();
-							putchar(c);
-						} while (c == '*');
-						if (c == '/')
-							break;
-					}
-				}
-			}
-			break;
-		case '"':
-		case '\'':
-			{
-				int delim = c;
-				do {
-					c = getchar_no_eof();
-					putchar(c);
-					if (c == '\\') {
-						c = getchar_no_eof();
-						putchar(c);
-						c = '\0';
-					}
-				} while (c != delim);
-			}
-			break;
-		}
-	}
-}
-
-/* Process the entire file.  */
-static void
-process_file(void)
-{
-	char *package, *name;
-	struct params *params, *rets;
-
-	package = read_package();
-	read_preprocessor_lines();
-	while (read_func_header(&name, &params, &rets)) {
-		char *p;
-		char *pkg;
-		char *nm;
-
-		p = strchr(name, '.');
-		if (p == NULL) {
-			pkg = package;
-			nm = name;
-		} else {
-			pkg = name;
-			nm = p + 1;
-			*p = '\0';
-		}
-		write_func_header(pkg, nm, params, rets);
-		copy_body();
-		write_func_trailer(pkg, nm, rets);
-		free(name);
-		free_params(params);
-		free_params(rets);
-	}
-	free(package);
-}
-
-static void
-usage(void)
-{
-	sysfatal("Usage: goc2c [--go-pkgpath PKGPATH] [--go-prefix PREFIX] [file]\n");
-}
-
-int
-main(int argc, char **argv)
-{
-	char *goarch;
-
-	argv0 = argv[0];
-	while(argc > 1 && argv[1][0] == '-') {
-		if(strcmp(argv[1], "-") == 0)
-			break;
-		if (strcmp(argv[1], "--go-pkgpath") == 0 && argc > 2) {
-			pkgpath = argv[2];
-			argc--;
-			argv++;
-		} else if (strcmp(argv[1], "--go-prefix") == 0 && argc > 2) {
-			prefix = argv[2];
-			argc--;
-			argv++;
-		} else
-			usage();
-		argc--;
-		argv++;
-	}
-
-	if(argc <= 1 || strcmp(argv[1], "-") == 0) {
-		file = "<stdin>";
-		process_file();
-		exit(0);
-	}
-
-	if(argc > 2)
-		usage();
-
-	file = argv[1];
-	if(freopen(file, "r", stdin) == 0) {
-		sysfatal("open %s: %r\n", file);
-	}
-
-	printf("// AUTO-GENERATED by autogen.sh; DO NOT EDIT\n\n");
-	process_file();
-	exit(0);
-}
diff --git a/third_party/gofrontend/libgo/runtime/heapdump.c b/third_party/gofrontend/libgo/runtime/heapdump.c
deleted file mode 100644
index 35990bb..0000000
--- a/third_party/gofrontend/libgo/runtime/heapdump.c
+++ /dev/null
@@ -1,776 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Implementation of runtime/debug.WriteHeapDump.  Writes all
-// objects in the heap plus additional info (roots, threads,
-// finalizers, etc.) to a file.
-
-// The format of the dumped file is described at
-// http://code.google.com/p/go-wiki/wiki/heapdump13
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-#include "mgc0.h"
-#include "go-type.h"
-#include "go-defer.h"
-#include "go-panic.h"
-
-#define hash __hash
-#define KindNoPointers GO_NO_POINTERS
-
-enum {
-	FieldKindEol = 0,
-	FieldKindPtr = 1,
-	FieldKindString = 2,
-	FieldKindSlice = 3,
-	FieldKindIface = 4,
-	FieldKindEface = 5,
-
-	TagEOF = 0,
-	TagObject = 1,
-	TagOtherRoot = 2,
-	TagType = 3,
-	TagGoRoutine = 4,
-	TagStackFrame = 5,
-	TagParams = 6,
-	TagFinalizer = 7,
-	TagItab = 8,
-	TagOSThread = 9,
-	TagMemStats = 10,
-	TagQueuedFinalizer = 11,
-	TagData = 12,
-	TagBss = 13,
-	TagDefer = 14,
-	TagPanic = 15,
-	TagMemProf = 16,
-	TagAllocSample = 17,
-
-	TypeInfo_Conservative = 127,
-};
-
-// static uintptr* playgcprog(uintptr offset, uintptr *prog, void (*callback)(void*,uintptr,uintptr), void *arg);
-// static void dumpfields(uintptr *prog);
-static void dumpefacetypes(void *obj, uintptr size, const Type *type, uintptr kind);
-
-// fd to write the dump to.
-static uintptr dumpfd;
-
-// buffer of pending write data
-enum {
-	BufSize = 4096,
-};
-static byte buf[BufSize];
-static uintptr nbuf;
-
-static void
-hwrite(const byte *data, uintptr len)
-{
-	if(len + nbuf <= BufSize) {
-		runtime_memmove(buf + nbuf, data, len);
-		nbuf += len;
-		return;
-	}
-	runtime_write(dumpfd, buf, nbuf);
-	if(len >= BufSize) {
-		runtime_write(dumpfd, data, len);
-		nbuf = 0;
-	} else {
-		runtime_memmove(buf, data, len);
-		nbuf = len;
-	}
-}
-
-static void
-flush(void)
-{
-	runtime_write(dumpfd, buf, nbuf);
-	nbuf = 0;
-}
-
-// Cache of types that have been serialized already.
-// We use a type's hash field to pick a bucket.
-// Inside a bucket, we keep a list of types that
-// have been serialized so far, most recently used first.
-// Note: when a bucket overflows we may end up
-// serializing a type more than once.  That's ok.
-enum {
-	TypeCacheBuckets = 256, // must be a power of 2
-	TypeCacheAssoc = 4,
-};
-typedef struct TypeCacheBucket TypeCacheBucket;
-struct TypeCacheBucket {
-	const Type *t[TypeCacheAssoc];
-};
-static TypeCacheBucket typecache[TypeCacheBuckets];
-
-// dump a uint64 in a varint format parseable by encoding/binary
-static void
-dumpint(uint64 v)
-{
-	byte buf[10];
-	int32 n;
-	n = 0;
-	while(v >= 0x80) {
-		buf[n++] = v | 0x80;
-		v >>= 7;
-	}
-	buf[n++] = v;
-	hwrite(buf, n);
-}
-
-static void
-dumpbool(bool b)
-{
-	dumpint(b ? 1 : 0);
-}
-
-// dump varint uint64 length followed by memory contents
-static void
-dumpmemrange(const byte *data, uintptr len)
-{
-	dumpint(len);
-	hwrite(data, len);
-}
-
-static void
-dumpstr(String s)
-{
-	dumpmemrange(s.str, s.len);
-}
-
-static void
-dumpcstr(const int8 *c)
-{
-	dumpmemrange((const byte*)c, runtime_findnull((const byte*)c));
-}
-
-// dump information for a type
-static void
-dumptype(const Type *t)
-{
-	TypeCacheBucket *b;
-	int32 i, j;
-
-	if(t == nil) {
-		return;
-	}
-
-	// If we've definitely serialized the type before,
-	// no need to do it again.
-	b = &typecache[t->hash & (TypeCacheBuckets-1)];
-	if(t == b->t[0]) return;
-	for(i = 1; i < TypeCacheAssoc; i++) {
-		if(t == b->t[i]) {
-			// Move-to-front
-			for(j = i; j > 0; j--) {
-				b->t[j] = b->t[j-1];
-			}
-			b->t[0] = t;
-			return;
-		}
-	}
-	// Might not have been dumped yet.  Dump it and
-	// remember we did so.
-	for(j = TypeCacheAssoc-1; j > 0; j--) {
-		b->t[j] = b->t[j-1];
-	}
-	b->t[0] = t;
-	
-	// dump the type
-	dumpint(TagType);
-	dumpint((uintptr)t);
-	dumpint(t->__size);
-	if(t->__uncommon == nil || t->__uncommon->__pkg_path == nil || t->__uncommon->__name == nil) {
-		dumpstr(*t->__reflection);
-	} else {
-		dumpint(t->__uncommon->__pkg_path->len + 1 + t->__uncommon->__name->len);
-		hwrite(t->__uncommon->__pkg_path->str, t->__uncommon->__pkg_path->len);
-		hwrite((const byte*)".", 1);
-		hwrite(t->__uncommon->__name->str, t->__uncommon->__name->len);
-	}
-	dumpbool(t->__size > PtrSize || (t->__code & KindNoPointers) == 0);
-	// dumpfields((uintptr*)t->gc + 1);
-}
-
-// returns true if object is scannable
-static bool
-scannable(byte *obj)
-{
-	uintptr *b, off, shift;
-
-	off = (uintptr*)obj - (uintptr*)runtime_mheap.arena_start;  // word offset
-	b = (uintptr*)runtime_mheap.arena_start - off/wordsPerBitmapWord - 1;
-	shift = off % wordsPerBitmapWord;
-	return ((*b >> shift) & bitScan) != 0;
-}
-
-// dump an object
-static void
-dumpobj(byte *obj, uintptr size, const Type *type, uintptr kind)
-{
-	if(type != nil) {
-		dumptype(type);
-		dumpefacetypes(obj, size, type, kind);
-	}
-
-	dumpint(TagObject);
-	dumpint((uintptr)obj);
-	dumpint((uintptr)type);
-	dumpint(kind);
-	dumpmemrange(obj, size);
-}
-
-static void
-dumpotherroot(const char *description, byte *to)
-{
-	dumpint(TagOtherRoot);
-	dumpcstr((const int8 *)description);
-	dumpint((uintptr)to);
-}
-
-static void
-dumpfinalizer(byte *obj, FuncVal *fn, const FuncType* ft, const PtrType *ot)
-{
-	dumpint(TagFinalizer);
-	dumpint((uintptr)obj);
-	dumpint((uintptr)fn);
-	dumpint((uintptr)fn->fn);
-	dumpint((uintptr)ft);
-	dumpint((uintptr)ot);
-}
-
-typedef struct ChildInfo ChildInfo;
-struct ChildInfo {
-	// Information passed up from the callee frame about
-	// the layout of the outargs region.
-	uintptr argoff;     // where the arguments start in the frame
-	uintptr arglen;     // size of args region
-	BitVector args;    // if args.n >= 0, pointer map of args region
-
-	byte *sp;           // callee sp
-	uintptr depth;      // depth in call stack (0 == most recent)
-};
-
-static void
-dumpgoroutine(G *gp)
-{
-	// ChildInfo child;
-	Defer *d;
-	Panic *p;
-
-	dumpint(TagGoRoutine);
-	dumpint((uintptr)gp);
-	dumpint((uintptr)0);
-	dumpint(gp->goid);
-	dumpint(gp->gopc);
-	dumpint(gp->status);
-	dumpbool(gp->issystem);
-	dumpbool(gp->isbackground);
-	dumpint(gp->waitsince);
-	dumpcstr((const int8 *)gp->waitreason);
-	dumpint((uintptr)0);
-	dumpint((uintptr)gp->m);
-	dumpint((uintptr)gp->defer);
-	dumpint((uintptr)gp->panic);
-
-	// dump stack
-	// child.args.n = -1;
-	// child.arglen = 0;
-	// child.sp = nil;
-	// child.depth = 0;
-	// if(!ScanStackByFrames)
-	// 	runtime_throw("need frame info to dump stacks");
-	// runtime_gentraceback(pc, sp, lr, gp, 0, nil, 0x7fffffff, dumpframe, &child, false);
-
-	// dump defer & panic records
-	for(d = gp->defer; d != nil; d = d->__next) {
-		dumpint(TagDefer);
-		dumpint((uintptr)d);
-		dumpint((uintptr)gp);
-		dumpint((uintptr)d->__arg);
-		dumpint((uintptr)d->__frame);
-		dumpint((uintptr)d->__pfn);
-		dumpint((uintptr)0);
-		dumpint((uintptr)d->__next);
-	}
-	for (p = gp->panic; p != nil; p = p->__next) {
-		dumpint(TagPanic);
-		dumpint((uintptr)p);
-		dumpint((uintptr)gp);
-		dumpint((uintptr)p->__arg.__type_descriptor);
-		dumpint((uintptr)p->__arg.__object);
-		dumpint((uintptr)0);
-		dumpint((uintptr)p->__next);
-	}
-}
-
-static void
-dumpgs(void)
-{
-	G *gp;
-	uint32 i;
-
-	// goroutines & stacks
-	for(i = 0; i < runtime_allglen; i++) {
-		gp = runtime_allg[i];
-		switch(gp->status){
-		default:
-			runtime_printf("unexpected G.status %d\n", gp->status);
-			runtime_throw("mark - bad status");
-		case Gdead:
-			break;
-		case Grunnable:
-		case Gsyscall:
-		case Gwaiting:
-			dumpgoroutine(gp);
-			break;
-		}
-	}
-}
-
-static void
-finq_callback(FuncVal *fn, void *obj, const FuncType *ft, const PtrType *ot)
-{
-	dumpint(TagQueuedFinalizer);
-	dumpint((uintptr)obj);
-	dumpint((uintptr)fn);
-	dumpint((uintptr)fn->fn);
-	dumpint((uintptr)ft);
-	dumpint((uintptr)ot);
-}
-
-
-static void
-dumproots(void)
-{
-	MSpan *s, **allspans;
-	uint32 spanidx;
-	Special *sp;
-	SpecialFinalizer *spf;
-	byte *p;
-
-	// data segment
-	// dumpint(TagData);
-	// dumpint((uintptr)data);
-	// dumpmemrange(data, edata - data);
-	// dumpfields((uintptr*)gcdata + 1);
-
-	// bss segment
-	// dumpint(TagBss);
-	// dumpint((uintptr)bss);
-	// dumpmemrange(bss, ebss - bss);
-	// dumpfields((uintptr*)gcbss + 1);
-	
-	// MSpan.types
-	allspans = runtime_mheap.allspans;
-	for(spanidx=0; spanidx<runtime_mheap.nspan; spanidx++) {
-		s = allspans[spanidx];
-		if(s->state == MSpanInUse) {
-			// The garbage collector ignores type pointers stored in MSpan.types:
-			//  - Compiler-generated types are stored outside of heap.
-			//  - The reflect package has runtime-generated types cached in its data structures.
-			//    The garbage collector relies on finding the references via that cache.
-			switch(s->types.compression) {
-			case MTypes_Empty:
-			case MTypes_Single:
-				break;
-			case MTypes_Words:
-			case MTypes_Bytes:
-				dumpotherroot("runtime type info", (byte*)s->types.data);
-				break;
-			}
-
-			// Finalizers
-			for(sp = s->specials; sp != nil; sp = sp->next) {
-				if(sp->kind != KindSpecialFinalizer)
-					continue;
-				spf = (SpecialFinalizer*)sp;
-				p = (byte*)((s->start << PageShift) + spf->special.offset);
-				dumpfinalizer(p, spf->fn, spf->ft, spf->ot);
-			}
-		}
-	}
-
-	// Finalizer queue
-	runtime_iterate_finq(finq_callback);
-}
-
-// Bit vector of free marks.
-// Needs to be as big as the largest number of objects per span.
-static byte hfree[PageSize/8];
-
-static void
-dumpobjs(void)
-{
-	uintptr i, j, size, n, off, shift, *bitp, bits, ti, kind;
-	MSpan *s;
-	MLink *l;
-	byte *p;
-	const Type *t;
-
-	for(i = 0; i < runtime_mheap.nspan; i++) {
-		s = runtime_mheap.allspans[i];
-		if(s->state != MSpanInUse)
-			continue;
-		p = (byte*)(s->start << PageShift);
-		size = s->elemsize;
-		n = (s->npages << PageShift) / size;
-		if(n > PageSize/8)
-			runtime_throw("free array doesn't have enough entries");
-		for(l = s->freelist; l != nil; l = l->next) {
-			hfree[((byte*)l - p) / size] = true;
-		}
-		for(j = 0; j < n; j++, p += size) {
-			if(hfree[j]) {
-				hfree[j] = false;
-				continue;
-			}
-			off = (uintptr*)p - (uintptr*)runtime_mheap.arena_start;
-			bitp = (uintptr*)runtime_mheap.arena_start - off/wordsPerBitmapWord - 1;
-			shift = off % wordsPerBitmapWord;
-			bits = *bitp >> shift;
-
-			// Skip FlagNoGC allocations (stacks)
-			if((bits & bitAllocated) == 0)
-				continue;
-
-			// extract type and kind
-			ti = runtime_gettype(p);
-			t = (Type*)(ti & ~(uintptr)(PtrSize-1));
-			kind = ti & (PtrSize-1);
-			
-			// dump it
-			if(kind == TypeInfo_Chan)
-				t = ((const ChanType*)t)->__element_type; // use element type for chan encoding
-			if(t == nil && scannable(p))
-				kind = TypeInfo_Conservative; // special kind for conservatively scanned objects
-			dumpobj(p, size, t, kind);
-		}
-	}
-}
-
-static void
-dumpparams(void)
-{
-	byte *x;
-
-	dumpint(TagParams);
-	x = (byte*)1;
-	if(*(byte*)&x == 1)
-		dumpbool(false); // little-endian ptrs
-	else
-		dumpbool(true); // big-endian ptrs
-	dumpint(PtrSize);
-	dumpint(runtime_Hchansize);
-	dumpint((uintptr)runtime_mheap.arena_start);
-	dumpint((uintptr)runtime_mheap.arena_used);
-	dumpint(0);
-	dumpcstr((const int8 *)"");
-	dumpint(runtime_ncpu);
-}
-
-static void
-dumpms(void)
-{
-	M *mp;
-
-	for(mp = runtime_allm; mp != nil; mp = mp->alllink) {
-		dumpint(TagOSThread);
-		dumpint((uintptr)mp);
-		dumpint(mp->id);
-		dumpint(0);
-	}
-}
-
-static void
-dumpmemstats(void)
-{
-	int32 i;
-
-	dumpint(TagMemStats);
-	dumpint(mstats.alloc);
-	dumpint(mstats.total_alloc);
-	dumpint(mstats.sys);
-	dumpint(mstats.nlookup);
-	dumpint(mstats.nmalloc);
-	dumpint(mstats.nfree);
-	dumpint(mstats.heap_alloc);
-	dumpint(mstats.heap_sys);
-	dumpint(mstats.heap_idle);
-	dumpint(mstats.heap_inuse);
-	dumpint(mstats.heap_released);
-	dumpint(mstats.heap_objects);
-	dumpint(mstats.stacks_inuse);
-	dumpint(mstats.stacks_sys);
-	dumpint(mstats.mspan_inuse);
-	dumpint(mstats.mspan_sys);
-	dumpint(mstats.mcache_inuse);
-	dumpint(mstats.mcache_sys);
-	dumpint(mstats.buckhash_sys);
-	dumpint(mstats.gc_sys);
-	dumpint(mstats.other_sys);
-	dumpint(mstats.next_gc);
-	dumpint(mstats.last_gc);
-	dumpint(mstats.pause_total_ns);
-	for(i = 0; i < 256; i++)
-		dumpint(mstats.pause_ns[i]);
-	dumpint(mstats.numgc);
-}
-
-static void
-dumpmemprof_callback(Bucket *b, uintptr nstk, Location *stk, uintptr size, uintptr allocs, uintptr frees)
-{
-	uintptr i, pc;
-	byte buf[20];
-
-	dumpint(TagMemProf);
-	dumpint((uintptr)b);
-	dumpint(size);
-	dumpint(nstk);
-	for(i = 0; i < nstk; i++) {
-		pc = stk[i].pc;
-		if(stk[i].function.len == 0) {
-			runtime_snprintf(buf, sizeof(buf), "%X", (uint64)pc);
-			dumpcstr((int8*)buf);
-			dumpcstr((const int8*)"?");
-			dumpint(0);
-		} else {
-			dumpstr(stk[i].function);
-			dumpstr(stk[i].filename);
-			dumpint(stk[i].lineno);
-		}
-	}
-	dumpint(allocs);
-	dumpint(frees);
-}
-
-static void
-dumpmemprof(void)
-{
-	MSpan *s, **allspans;
-	uint32 spanidx;
-	Special *sp;
-	SpecialProfile *spp;
-	byte *p;
-
-	runtime_iterate_memprof(dumpmemprof_callback);
-
-	allspans = runtime_mheap.allspans;
-	for(spanidx=0; spanidx<runtime_mheap.nspan; spanidx++) {
-		s = allspans[spanidx];
-		if(s->state != MSpanInUse)
-			continue;
-		for(sp = s->specials; sp != nil; sp = sp->next) {
-			if(sp->kind != KindSpecialProfile)
-				continue;
-			spp = (SpecialProfile*)sp;
-			p = (byte*)((s->start << PageShift) + spp->special.offset);
-			dumpint(TagAllocSample);
-			dumpint((uintptr)p);
-			dumpint((uintptr)spp->b);
-		}
-	}
-}
-
-static void
-mdump(G *gp)
-{
-	const byte *hdr;
-	uintptr i;
-	MSpan *s;
-
-	// make sure we're done sweeping
-	for(i = 0; i < runtime_mheap.nspan; i++) {
-		s = runtime_mheap.allspans[i];
-		if(s->state == MSpanInUse)
-			runtime_MSpan_EnsureSwept(s);
-	}
-
-	runtime_memclr((byte*)&typecache[0], sizeof(typecache));
-	hdr = (const byte*)"go1.3 heap dump\n";
-	hwrite(hdr, runtime_findnull(hdr));
-	dumpparams();
-	dumpobjs();
-	dumpgs();
-	dumpms();
-	dumproots();
-	dumpmemstats();
-	dumpmemprof();
-	dumpint(TagEOF);
-	flush();
-
-	gp->param = nil;
-	gp->status = Grunning;
-	runtime_gogo(gp);
-}
-
-void runtime_debug_WriteHeapDump(uintptr)
-  __asm__(GOSYM_PREFIX "runtime_debug.WriteHeapDump");
-
-void
-runtime_debug_WriteHeapDump(uintptr fd)
-{
-	M *m;
-	G *g;
-
-	// Stop the world.
-	runtime_semacquire(&runtime_worldsema, false);
-	m = runtime_m();
-	m->gcing = 1;
-	m->locks++;
-	runtime_stoptheworld();
-
-	// Update stats so we can dump them.
-	// As a side effect, flushes all the MCaches so the MSpan.freelist
-	// lists contain all the free objects.
-	runtime_updatememstats(nil);
-
-	// Set dump file.
-	dumpfd = fd;
-
-	// Call dump routine on M stack.
-	g = runtime_g();
-	g->status = Gwaiting;
-	g->waitreason = "dumping heap";
-	runtime_mcall(mdump);
-
-	// Reset dump file.
-	dumpfd = 0;
-
-	// Start up the world again.
-	m->gcing = 0;
-	runtime_semrelease(&runtime_worldsema);
-	runtime_starttheworld();
-	m->locks--;
-}
-
-// Runs the specified gc program.  Calls the callback for every
-// pointer-like field specified by the program and passes to the
-// callback the kind and offset of that field within the object.
-// offset is the offset in the object of the start of the program.
-// Returns a pointer to the opcode that ended the gc program (either
-// GC_END or GC_ARRAY_NEXT).
-/*
-static uintptr*
-playgcprog(uintptr offset, uintptr *prog, void (*callback)(void*,uintptr,uintptr), void *arg)
-{
-	uintptr len, elemsize, i, *end;
-
-	for(;;) {
-		switch(prog[0]) {
-		case GC_END:
-			return prog;
-		case GC_PTR:
-			callback(arg, FieldKindPtr, offset + prog[1]);
-			prog += 3;
-			break;
-		case GC_APTR:
-			callback(arg, FieldKindPtr, offset + prog[1]);
-			prog += 2;
-			break;
-		case GC_ARRAY_START:
-			len = prog[2];
-			elemsize = prog[3];
-			end = nil;
-			for(i = 0; i < len; i++) {
-				end = playgcprog(offset + prog[1] + i * elemsize, prog + 4, callback, arg);
-				if(end[0] != GC_ARRAY_NEXT)
-					runtime_throw("GC_ARRAY_START did not have matching GC_ARRAY_NEXT");
-			}
-			prog = end + 1;
-			break;
-		case GC_ARRAY_NEXT:
-			return prog;
-		case GC_CALL:
-			playgcprog(offset + prog[1], (uintptr*)((byte*)prog + *(int32*)&prog[2]), callback, arg);
-			prog += 3;
-			break;
-		case GC_CHAN_PTR:
-			callback(arg, FieldKindPtr, offset + prog[1]);
-			prog += 3;
-			break;
-		case GC_STRING:
-			callback(arg, FieldKindString, offset + prog[1]);
-			prog += 2;
-			break;
-		case GC_EFACE:
-			callback(arg, FieldKindEface, offset + prog[1]);
-			prog += 2;
-			break;
-		case GC_IFACE:
-			callback(arg, FieldKindIface, offset + prog[1]);
-			prog += 2;
-			break;
-		case GC_SLICE:
-			callback(arg, FieldKindSlice, offset + prog[1]);
-			prog += 3;
-			break;
-		case GC_REGION:
-			playgcprog(offset + prog[1], (uintptr*)prog[3] + 1, callback, arg);
-			prog += 4;
-			break;
-		default:
-			runtime_printf("%D\n", (uint64)prog[0]);
-			runtime_throw("bad gc op");
-		}
-	}
-}
-
-static void
-dump_callback(void *p, uintptr kind, uintptr offset)
-{
-	USED(&p);
-	dumpint(kind);
-	dumpint(offset);
-}
-
-// dumpint() the kind & offset of each field in an object.
-static void
-dumpfields(uintptr *prog)
-{
-	playgcprog(0, prog, dump_callback, nil);
-	dumpint(FieldKindEol);
-}
-
-static void
-dumpeface_callback(void *p, uintptr kind, uintptr offset)
-{
-	Eface *e;
-
-	if(kind != FieldKindEface)
-		return;
-	e = (Eface*)((byte*)p + offset);
-	dumptype(e->__type_descriptor);
-}
-*/
-
-// The heap dump reader needs to be able to disambiguate
-// Eface entries.  So it needs to know every type that might
-// appear in such an entry.  The following two routines accomplish
-// that.
-
-// Dump all the types that appear in the type field of
-// any Eface contained in obj.
-static void
-dumpefacetypes(void *obj __attribute__ ((unused)), uintptr size, const Type *type, uintptr kind)
-{
-	uintptr i;
-
-	switch(kind) {
-	case TypeInfo_SingleObject:
-		//playgcprog(0, (uintptr*)type->gc + 1, dumpeface_callback, obj);
-		break;
-	case TypeInfo_Array:
-		for(i = 0; i <= size - type->__size; i += type->__size)
-			//playgcprog(i, (uintptr*)type->gc + 1, dumpeface_callback, obj);
-		break;
-	case TypeInfo_Chan:
-		if(type->__size == 0) // channels may have zero-sized objects in them
-			break;
-		for(i = runtime_Hchansize; i <= size - type->__size; i += type->__size)
-			//playgcprog(i, (uintptr*)type->gc + 1, dumpeface_callback, obj);
-		break;
-	}
-}
diff --git a/third_party/gofrontend/libgo/runtime/interface.h b/third_party/gofrontend/libgo/runtime/interface.h
deleted file mode 100644
index f3068a6..0000000
--- a/third_party/gofrontend/libgo/runtime/interface.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* interface.h -- the interface type for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#ifndef LIBGO_INTERFACE_H
-#define LIBGO_INTERFACE_H
-
-struct __go_type_descriptor;
-
-/* A variable of interface type is an instance of this struct, if the
-   interface has any methods.  */
-
-struct __go_interface
-{
-  /* A pointer to the interface method table.  The first pointer is
-     the type descriptor of the object.  Subsequent pointers are
-     pointers to functions.  This is effectively the vtable for this
-     interface.  The function pointers are in the same order as the
-     list in the internal representation of the interface, which sorts
-     them by name.  */
-  const void **__methods;
-
-  /* The object.  If the object is a pointer--if the type descriptor
-     code is GO_PTR or GO_UNSAFE_POINTER--then this field is the value
-     of the object itself.  Otherwise this is a pointer to memory
-     which holds the value.  */
-  void *__object;
-};
-
-/* A variable of an empty interface type is an instance of this
-   struct.  */
-
-struct __go_empty_interface
-{
-  /* The type descriptor of the object.  */
-  const struct __go_type_descriptor *__type_descriptor;
-
-  /* The object.  This is the same as __go_interface above.  */
-  void *__object;
-};
-
-extern void *
-__go_convert_interface (const struct __go_type_descriptor *,
-			const struct __go_type_descriptor *);
-
-extern void *
-__go_convert_interface_2 (const struct __go_type_descriptor *,
-			  const struct __go_type_descriptor *,
-			  _Bool may_fail);
-
-extern _Bool
-__go_can_convert_to_interface(const struct __go_type_descriptor *,
-			      const struct __go_type_descriptor *);
-
-#endif /* !defined(LIBGO_INTERFACE_H) */
diff --git a/third_party/gofrontend/libgo/runtime/lfstack.goc b/third_party/gofrontend/libgo/runtime/lfstack.goc
deleted file mode 100644
index 5ab1baa..0000000
--- a/third_party/gofrontend/libgo/runtime/lfstack.goc
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Lock-free stack.
-
-package runtime
-#include "runtime.h"
-#include "arch.h"
-
-#if __SIZEOF_POINTER__ == 8
-// SPARC64 and Solaris on AMD64 uses all 64 bits of virtual addresses.
-// Use low-order three bits as ABA counter.
-// http://docs.oracle.com/cd/E19120-01/open.solaris/816-5138/6mba6ua5p/index.html
-# if defined(__sparc__) || (defined(__sun__) && defined(__amd64__))
-static inline uint64 lfPack(LFNode *node, uintptr cnt) {
-	return ((uint64)(node)) | ((cnt)&7);
-}
-static inline LFNode* lfUnpack(uint64 val) {
-	return (LFNode*)(val&~7);
-}
-# else
-#  if defined(__aarch64__)
-// Depending on the kernel options, pointers on arm64 can have up to 48 significant
-// bits (see https://www.kernel.org/doc/Documentation/arm64/memory.txt).
-#   define PTR_BITS 48
-#  else
-// Amd64 uses 48-bit virtual addresses, 47-th bit is used as kernel/user flag.
-// So we use 17msb of pointers as ABA counter.
-#   define PTR_BITS 47
-#  endif
-# define CNT_BITS (64 - PTR_BITS + 3)
-static inline uint64 lfPack(LFNode *node, uintptr cnt) {
-	return ((uint64)(node)<<(64-PTR_BITS)) | (cnt&(((1<<CNT_BITS)-1)));
-}
-static inline LFNode* lfUnpack(uint64 val) {
-	return (LFNode*)((val >> CNT_BITS) << 3);
-}
-# endif
-#else
-static inline uint64 lfPack(LFNode *node, uintptr cnt) {
-	return ((uint64)(uintptr)(node)<<32) | cnt;
-}
-static inline LFNode* lfUnpack(uint64 val) {
-	return (LFNode*)(uintptr)(val >> 32);
-}
-#endif
-
-void
-runtime_lfstackpush(uint64 *head, LFNode *node)
-{
-	uint64 old, new;
-
-	if(node != lfUnpack(lfPack(node, 0))) {
-		runtime_printf("p=%p\n", node);
-		runtime_throw("runtime_lfstackpush: invalid pointer");
-	}
-
-	node->pushcnt++;
-	new = lfPack(node, node->pushcnt);
-	for(;;) {
-		old = runtime_atomicload64(head);
-		node->next = lfUnpack(old);
-		if(runtime_cas64(head, old, new))
-			break;
-	}
-}
-
-LFNode*
-runtime_lfstackpop(uint64 *head)
-{
-	LFNode *node, *node2;
-	uint64 old, new;
-
-	for(;;) {
-		old = runtime_atomicload64(head);
-		if(old == 0)
-			return nil;
-		node = lfUnpack(old);
-		node2 = runtime_atomicloadp(&node->next);
-		new = 0;
-		if(node2 != nil)
-			new = lfPack(node2, node2->pushcnt);
-		if(runtime_cas64(head, old, new))
-			return node;
-	}
-}
-
-func lfstackpush_go(head *uint64, node *LFNode) {
-	runtime_lfstackpush(head, node);
-}
-
-func lfstackpop_go(head *uint64) (node *LFNode) {
-	node = runtime_lfstackpop(head);
-}
diff --git a/third_party/gofrontend/libgo/runtime/lock_futex.c b/third_party/gofrontend/libgo/runtime/lock_futex.c
deleted file mode 100644
index 33ef073..0000000
--- a/third_party/gofrontend/libgo/runtime/lock_futex.c
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build dragonfly freebsd linux
-
-#include "runtime.h"
-
-// This implementation depends on OS-specific implementations of
-//
-//	runtime_futexsleep(uint32 *addr, uint32 val, int64 ns)
-//		Atomically,
-//			if(*addr == val) sleep
-//		Might be woken up spuriously; that's allowed.
-//		Don't sleep longer than ns; ns < 0 means forever.
-//
-//	runtime_futexwakeup(uint32 *addr, uint32 cnt)
-//		If any procs are sleeping on addr, wake up at most cnt.
-
-enum
-{
-	MUTEX_UNLOCKED = 0,
-	MUTEX_LOCKED = 1,
-	MUTEX_SLEEPING = 2,
-
-	ACTIVE_SPIN = 4,
-	ACTIVE_SPIN_CNT = 30,
-	PASSIVE_SPIN = 1,
-};
-
-// Possible lock states are MUTEX_UNLOCKED, MUTEX_LOCKED and MUTEX_SLEEPING.
-// MUTEX_SLEEPING means that there is presumably at least one sleeping thread.
-// Note that there can be spinning threads during all states - they do not
-// affect mutex's state.
-void
-runtime_lock(Lock *l)
-{
-	uint32 i, v, wait, spin;
-
-	if(runtime_m()->locks++ < 0)
-		runtime_throw("runtime_lock: lock count");
-
-	// Speculative grab for lock.
-	v = runtime_xchg((uint32*)&l->key, MUTEX_LOCKED);
-	if(v == MUTEX_UNLOCKED)
-		return;
-
-	// wait is either MUTEX_LOCKED or MUTEX_SLEEPING
-	// depending on whether there is a thread sleeping
-	// on this mutex.  If we ever change l->key from
-	// MUTEX_SLEEPING to some other value, we must be
-	// careful to change it back to MUTEX_SLEEPING before
-	// returning, to ensure that the sleeping thread gets
-	// its wakeup call.
-	wait = v;
-
-	// On uniprocessor's, no point spinning.
-	// On multiprocessors, spin for ACTIVE_SPIN attempts.
-	spin = 0;
-	if(runtime_ncpu > 1)
-		spin = ACTIVE_SPIN;
-
-	for(;;) {
-		// Try for lock, spinning.
-		for(i = 0; i < spin; i++) {
-			while(l->key == MUTEX_UNLOCKED)
-				if(runtime_cas((uint32*)&l->key, MUTEX_UNLOCKED, wait))
-					return;
-			runtime_procyield(ACTIVE_SPIN_CNT);
-		}
-
-		// Try for lock, rescheduling.
-		for(i=0; i < PASSIVE_SPIN; i++) {
-			while(l->key == MUTEX_UNLOCKED)
-				if(runtime_cas((uint32*)&l->key, MUTEX_UNLOCKED, wait))
-					return;
-			runtime_osyield();
-		}
-
-		// Sleep.
-		v = runtime_xchg((uint32*)&l->key, MUTEX_SLEEPING);
-		if(v == MUTEX_UNLOCKED)
-			return;
-		wait = MUTEX_SLEEPING;
-		runtime_futexsleep((uint32*)&l->key, MUTEX_SLEEPING, -1);
-	}
-}
-
-void
-runtime_unlock(Lock *l)
-{
-	uint32 v;
-
-	v = runtime_xchg((uint32*)&l->key, MUTEX_UNLOCKED);
-	if(v == MUTEX_UNLOCKED)
-		runtime_throw("unlock of unlocked lock");
-	if(v == MUTEX_SLEEPING)
-		runtime_futexwakeup((uint32*)&l->key, 1);
-
-	if(--runtime_m()->locks < 0)
-		runtime_throw("runtime_unlock: lock count");
-}
-
-// One-time notifications.
-void
-runtime_noteclear(Note *n)
-{
-	n->key = 0;
-}
-
-void
-runtime_notewakeup(Note *n)
-{
-	uint32 old;
-
-	old = runtime_xchg((uint32*)&n->key, 1);
-	if(old != 0) {
-		runtime_printf("notewakeup - double wakeup (%d)\n", old);
-		runtime_throw("notewakeup - double wakeup");
-	}
-	runtime_futexwakeup((uint32*)&n->key, 1);
-}
-
-void
-runtime_notesleep(Note *n)
-{
-	M *m = runtime_m();
-
-  /* For gccgo it's OK to sleep in non-g0, and it happens in
-     stoptheworld because we have not implemented preemption.
-
-	if(runtime_g() != runtime_m()->g0)
-		runtime_throw("notesleep not on g0");
-  */
-	while(runtime_atomicload((uint32*)&n->key) == 0) {
-		m->blocked = true;
-		runtime_futexsleep((uint32*)&n->key, 0, -1);
-		m->blocked = false;
-	}
-}
-
-static bool
-notetsleep(Note *n, int64 ns, int64 deadline, int64 now)
-{
-	M *m = runtime_m();
-
-	// Conceptually, deadline and now are local variables.
-	// They are passed as arguments so that the space for them
-	// does not count against our nosplit stack sequence.
-
-	if(ns < 0) {
-		while(runtime_atomicload((uint32*)&n->key) == 0) {
-			m->blocked = true;
-			runtime_futexsleep((uint32*)&n->key, 0, -1);
-			m->blocked = false;
-		}
-		return true;
-	}
-
-	if(runtime_atomicload((uint32*)&n->key) != 0)
-		return true;
-
-	deadline = runtime_nanotime() + ns;
-	for(;;) {
-		m->blocked = true;
-		runtime_futexsleep((uint32*)&n->key, 0, ns);
-		m->blocked = false;
-		if(runtime_atomicload((uint32*)&n->key) != 0)
-			break;
-		now = runtime_nanotime();
-		if(now >= deadline)
-			break;
-		ns = deadline - now;
-	}
-	return runtime_atomicload((uint32*)&n->key) != 0;
-}
-
-bool
-runtime_notetsleep(Note *n, int64 ns)
-{
-	bool res;
-
-	if(runtime_g() != runtime_m()->g0 && !runtime_m()->gcing)
-		runtime_throw("notetsleep not on g0");
-
-	res = notetsleep(n, ns, 0, 0);
-	return res;
-}
-
-// same as runtime_notetsleep, but called on user g (not g0)
-// calls only nosplit functions between entersyscallblock/exitsyscall
-bool
-runtime_notetsleepg(Note *n, int64 ns)
-{
-	bool res;
-
-	if(runtime_g() == runtime_m()->g0)
-		runtime_throw("notetsleepg on g0");
-
-	runtime_entersyscallblock();
-	res = notetsleep(n, ns, 0, 0);
-	runtime_exitsyscall();
-	return res;
-}
diff --git a/third_party/gofrontend/libgo/runtime/lock_sema.c b/third_party/gofrontend/libgo/runtime/lock_sema.c
deleted file mode 100644
index ef611fb..0000000
--- a/third_party/gofrontend/libgo/runtime/lock_sema.c
+++ /dev/null
@@ -1,281 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin nacl netbsd openbsd plan9 solaris windows
-
-#include "runtime.h"
-
-// This implementation depends on OS-specific implementations of
-//
-//	uintptr runtime_semacreate(void)
-//		Create a semaphore, which will be assigned to m->waitsema.
-//		The zero value is treated as absence of any semaphore,
-//		so be sure to return a non-zero value.
-//
-//	int32 runtime_semasleep(int64 ns)
-//		If ns < 0, acquire m->waitsema and return 0.
-//		If ns >= 0, try to acquire m->waitsema for at most ns nanoseconds.
-//		Return 0 if the semaphore was acquired, -1 if interrupted or timed out.
-//
-//	int32 runtime_semawakeup(M *mp)
-//		Wake up mp, which is or will soon be sleeping on mp->waitsema.
-//
-
-enum
-{
-	LOCKED = 1,
-
-	ACTIVE_SPIN = 4,
-	ACTIVE_SPIN_CNT = 30,
-	PASSIVE_SPIN = 1,
-};
-
-void
-runtime_lock(Lock *l)
-{
-	M *m;
-	uintptr v;
-	uint32 i, spin;
-
-	m = runtime_m();
-	if(m->locks++ < 0)
-		runtime_throw("runtime_lock: lock count");
-
-	// Speculative grab for lock.
-	if(runtime_casp((void**)&l->key, nil, (void*)LOCKED))
-		return;
-
-	if(m->waitsema == 0)
-		m->waitsema = runtime_semacreate();
-
-	// On uniprocessor's, no point spinning.
-	// On multiprocessors, spin for ACTIVE_SPIN attempts.
-	spin = 0;
-	if(runtime_ncpu > 1)
-		spin = ACTIVE_SPIN;
-
-	for(i=0;; i++) {
-		v = (uintptr)runtime_atomicloadp((void**)&l->key);
-		if((v&LOCKED) == 0) {
-unlocked:
-			if(runtime_casp((void**)&l->key, (void*)v, (void*)(v|LOCKED)))
-				return;
-			i = 0;
-		}
-		if(i<spin)
-			runtime_procyield(ACTIVE_SPIN_CNT);
-		else if(i<spin+PASSIVE_SPIN)
-			runtime_osyield();
-		else {
-			// Someone else has it.
-			// l->waitm points to a linked list of M's waiting
-			// for this lock, chained through m->nextwaitm.
-			// Queue this M.
-			for(;;) {
-				m->nextwaitm = (void*)(v&~LOCKED);
-				if(runtime_casp((void**)&l->key, (void*)v, (void*)((uintptr)m|LOCKED)))
-					break;
-				v = (uintptr)runtime_atomicloadp((void**)&l->key);
-				if((v&LOCKED) == 0)
-					goto unlocked;
-			}
-			if(v&LOCKED) {
-				// Queued.  Wait.
-				runtime_semasleep(-1);
-				i = 0;
-			}
-		}
-	}
-}
-
-void
-runtime_unlock(Lock *l)
-{
-	uintptr v;
-	M *mp;
-
-	for(;;) {
-		v = (uintptr)runtime_atomicloadp((void**)&l->key);
-		if(v == LOCKED) {
-			if(runtime_casp((void**)&l->key, (void*)LOCKED, nil))
-				break;
-		} else {
-			// Other M's are waiting for the lock.
-			// Dequeue an M.
-			mp = (void*)(v&~LOCKED);
-			if(runtime_casp((void**)&l->key, (void*)v, mp->nextwaitm)) {
-				// Dequeued an M.  Wake it.
-				runtime_semawakeup(mp);
-				break;
-			}
-		}
-	}
-
-	if(--runtime_m()->locks < 0)
-		runtime_throw("runtime_unlock: lock count");
-}
-
-// One-time notifications.
-void
-runtime_noteclear(Note *n)
-{
-	n->key = 0;
-}
-
-void
-runtime_notewakeup(Note *n)
-{
-	M *mp;
-
-	do
-		mp = runtime_atomicloadp((void**)&n->key);
-	while(!runtime_casp((void**)&n->key, mp, (void*)LOCKED));
-
-	// Successfully set waitm to LOCKED.
-	// What was it before?
-	if(mp == nil) {
-		// Nothing was waiting.  Done.
-	} else if(mp == (M*)LOCKED) {
-		// Two notewakeups!  Not allowed.
-		runtime_throw("notewakeup - double wakeup");
-	} else {
-		// Must be the waiting m.  Wake it up.
-		runtime_semawakeup(mp);
-	}
-}
-
-void
-runtime_notesleep(Note *n)
-{
-	M *m;
-
-	m = runtime_m();
-
-  /* For gccgo it's OK to sleep in non-g0, and it happens in
-     stoptheworld because we have not implemented preemption.
-
-	if(runtime_g() != m->g0)
-		runtime_throw("notesleep not on g0");
-  */
-
-	if(m->waitsema == 0)
-		m->waitsema = runtime_semacreate();
-	if(!runtime_casp((void**)&n->key, nil, m)) {  // must be LOCKED (got wakeup)
-		if(n->key != LOCKED)
-			runtime_throw("notesleep - waitm out of sync");
-		return;
-	}
-	// Queued.  Sleep.
-	m->blocked = true;
-	runtime_semasleep(-1);
-	m->blocked = false;
-}
-
-static bool
-notetsleep(Note *n, int64 ns, int64 deadline, M *mp)
-{
-	M *m;
-
-	m = runtime_m();
-
-	// Conceptually, deadline and mp are local variables.
-	// They are passed as arguments so that the space for them
-	// does not count against our nosplit stack sequence.
-
-	// Register for wakeup on n->waitm.
-	if(!runtime_casp((void**)&n->key, nil, m)) {  // must be LOCKED (got wakeup already)
-		if(n->key != LOCKED)
-			runtime_throw("notetsleep - waitm out of sync");
-		return true;
-	}
-
-	if(ns < 0) {
-		// Queued.  Sleep.
-		m->blocked = true;
-		runtime_semasleep(-1);
-		m->blocked = false;
-		return true;
-	}
-
-	deadline = runtime_nanotime() + ns;
-	for(;;) {
-		// Registered.  Sleep.
-		m->blocked = true;
-		if(runtime_semasleep(ns) >= 0) {
-			m->blocked = false;
-			// Acquired semaphore, semawakeup unregistered us.
-			// Done.
-			return true;
-		}
-		m->blocked = false;
-
-		// Interrupted or timed out.  Still registered.  Semaphore not acquired.
-		ns = deadline - runtime_nanotime();
-		if(ns <= 0)
-			break;
-		// Deadline hasn't arrived.  Keep sleeping.
-	}
-
-	// Deadline arrived.  Still registered.  Semaphore not acquired.
-	// Want to give up and return, but have to unregister first,
-	// so that any notewakeup racing with the return does not
-	// try to grant us the semaphore when we don't expect it.
-	for(;;) {
-		mp = runtime_atomicloadp((void**)&n->key);
-		if(mp == m) {
-			// No wakeup yet; unregister if possible.
-			if(runtime_casp((void**)&n->key, mp, nil))
-				return false;
-		} else if(mp == (M*)LOCKED) {
-			// Wakeup happened so semaphore is available.
-			// Grab it to avoid getting out of sync.
-			m->blocked = true;
-			if(runtime_semasleep(-1) < 0)
-				runtime_throw("runtime: unable to acquire - semaphore out of sync");
-			m->blocked = false;
-			return true;
-		} else
-			runtime_throw("runtime: unexpected waitm - semaphore out of sync");
-	}
-}
-
-bool
-runtime_notetsleep(Note *n, int64 ns)
-{
-	M *m;
-	bool res;
-
-	m = runtime_m();
-
-	if(runtime_g() != m->g0 && !m->gcing)
-		runtime_throw("notetsleep not on g0");
-
-	if(m->waitsema == 0)
-		m->waitsema = runtime_semacreate();
-
-	res = notetsleep(n, ns, 0, nil);
-	return res;
-}
-
-// same as runtime_notetsleep, but called on user g (not g0)
-// calls only nosplit functions between entersyscallblock/exitsyscall
-bool
-runtime_notetsleepg(Note *n, int64 ns)
-{
-	M *m;
-	bool res;
-
-	m = runtime_m();
-
-	if(runtime_g() == m->g0)
-		runtime_throw("notetsleepg on g0");
-
-	if(m->waitsema == 0)
-		m->waitsema = runtime_semacreate();
-
-	runtime_entersyscallblock();
-	res = notetsleep(n, ns, 0, nil);
-	runtime_exitsyscall();
-	return res;
-}
diff --git a/third_party/gofrontend/libgo/runtime/malloc.goc b/third_party/gofrontend/libgo/runtime/malloc.goc
deleted file mode 100644
index b29a01b..0000000
--- a/third_party/gofrontend/libgo/runtime/malloc.goc
+++ /dev/null
@@ -1,992 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// See malloc.h for overview.
-//
-// TODO(rsc): double-check stats.
-
-package runtime
-#include <stddef.h>
-#include <errno.h>
-#include <stdlib.h>
-#include "go-alloc.h"
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-#include "interface.h"
-#include "go-type.h"
-
-// Map gccgo field names to gc field names.
-// Eface aka __go_empty_interface.
-#define type __type_descriptor
-// Type aka __go_type_descriptor
-#define kind __code
-#define string __reflection
-#define KindPtr GO_PTR
-#define KindNoPointers GO_NO_POINTERS
-#define kindMask GO_CODE_MASK
-
-// GCCGO SPECIFIC CHANGE
-//
-// There is a long comment in runtime_mallocinit about where to put the heap
-// on a 64-bit system.  It makes assumptions that are not valid on linux/arm64
-// -- it assumes user space can choose the lower 47 bits of a pointer, but on
-// linux/arm64 we can only choose the lower 39 bits.  This means the heap is
-// roughly a quarter of the available address space and we cannot choose a bit
-// pattern that all pointers will have -- luckily the GC is mostly precise
-// these days so this doesn't matter all that much.  The kernel (as of 3.13)
-// will allocate address space starting either down from 0x7fffffffff or up
-// from 0x2000000000, so we put the heap roughly in the middle of these two
-// addresses to minimize the chance that a non-heap allocation will get in the
-// way of the heap.
-//
-// This all means that there isn't much point in trying 256 different
-// locations for the heap on such systems.
-#ifdef __aarch64__
-#define HeapBase(i) ((void*)(uintptr)(0x40ULL<<32))
-#define HeapBaseOptions 1
-#else
-#define HeapBase(i) ((void*)(uintptr)(i<<40|0x00c0ULL<<32))
-#define HeapBaseOptions 0x80
-#endif
-// END GCCGO SPECIFIC CHANGE
-
-// Mark mheap as 'no pointers', it does not contain interesting pointers but occupies ~45K.
-MHeap runtime_mheap;
-MStats mstats;
-
-int32	runtime_checking;
-
-extern MStats mstats;	// defined in zruntime_def_$GOOS_$GOARCH.go
-
-extern volatile intgo runtime_MemProfileRate
-  __asm__ (GOSYM_PREFIX "runtime.MemProfileRate");
-
-static MSpan* largealloc(uint32, uintptr*);
-static void runtime_profilealloc(void *v, uintptr size);
-static void settype(MSpan *s, void *v, uintptr typ);
-
-// Allocate an object of at least size bytes.
-// Small objects are allocated from the per-thread cache's free lists.
-// Large objects (> 32 kB) are allocated straight from the heap.
-// If the block will be freed with runtime_free(), typ must be 0.
-void*
-runtime_mallocgc(uintptr size, uintptr typ, uint32 flag)
-{
-	M *m;
-	G *g;
-	int32 sizeclass;
-	uintptr tinysize, size1;
-	intgo rate;
-	MCache *c;
-	MSpan *s;
-	MLink *v, *next;
-	byte *tiny;
-	bool incallback;
-
-	if(size == 0) {
-		// All 0-length allocations use this pointer.
-		// The language does not require the allocations to
-		// have distinct values.
-		return &runtime_zerobase;
-	}
-
-	m = runtime_m();
-	g = runtime_g();
-
-	incallback = false;
-	if(m->mcache == nil && g->ncgo > 0) {
-		// For gccgo this case can occur when a cgo or SWIG function
-		// has an interface return type and the function
-		// returns a non-pointer, so memory allocation occurs
-		// after syscall.Cgocall but before syscall.CgocallDone.
-		// We treat it as a callback.
-		runtime_exitsyscall();
-		m = runtime_m();
-		incallback = true;
-		flag |= FlagNoInvokeGC;
-	}
-
-	if(runtime_gcwaiting() && g != m->g0 && m->locks == 0 && !(flag & FlagNoInvokeGC)) {
-		runtime_gosched();
-		m = runtime_m();
-	}
-	if(m->mallocing)
-		runtime_throw("malloc/free - deadlock");
-	// Disable preemption during settype.
-	// We can not use m->mallocing for this, because settype calls mallocgc.
-	m->locks++;
-	m->mallocing = 1;
-
-	if(DebugTypeAtBlockEnd)
-		size += sizeof(uintptr);
-
-	c = m->mcache;
-	if(!runtime_debug.efence && size <= MaxSmallSize) {
-		if((flag&(FlagNoScan|FlagNoGC)) == FlagNoScan && size < TinySize) {
-			// Tiny allocator.
-			//
-			// Tiny allocator combines several tiny allocation requests
-			// into a single memory block. The resulting memory block
-			// is freed when all subobjects are unreachable. The subobjects
-			// must be FlagNoScan (don't have pointers), this ensures that
-			// the amount of potentially wasted memory is bounded.
-			//
-			// Size of the memory block used for combining (TinySize) is tunable.
-			// Current setting is 16 bytes, which relates to 2x worst case memory
-			// wastage (when all but one subobjects are unreachable).
-			// 8 bytes would result in no wastage at all, but provides less
-			// opportunities for combining.
-			// 32 bytes provides more opportunities for combining,
-			// but can lead to 4x worst case wastage.
-			// The best case winning is 8x regardless of block size.
-			//
-			// Objects obtained from tiny allocator must not be freed explicitly.
-			// So when an object will be freed explicitly, we ensure that
-			// its size >= TinySize.
-			//
-			// SetFinalizer has a special case for objects potentially coming
-			// from tiny allocator, it such case it allows to set finalizers
-			// for an inner byte of a memory block.
-			//
-			// The main targets of tiny allocator are small strings and
-			// standalone escaping variables. On a json benchmark
-			// the allocator reduces number of allocations by ~12% and
-			// reduces heap size by ~20%.
-
-			tinysize = c->tinysize;
-			if(size <= tinysize) {
-				tiny = c->tiny;
-				// Align tiny pointer for required (conservative) alignment.
-				if((size&7) == 0)
-					tiny = (byte*)ROUND((uintptr)tiny, 8);
-				else if((size&3) == 0)
-					tiny = (byte*)ROUND((uintptr)tiny, 4);
-				else if((size&1) == 0)
-					tiny = (byte*)ROUND((uintptr)tiny, 2);
-				size1 = size + (tiny - c->tiny);
-				if(size1 <= tinysize) {
-					// The object fits into existing tiny block.
-					v = (MLink*)tiny;
-					c->tiny += size1;
-					c->tinysize -= size1;
-					m->mallocing = 0;
-					m->locks--;
-					if(incallback)
-						runtime_entersyscall();
-					return v;
-				}
-			}
-			// Allocate a new TinySize block.
-			s = c->alloc[TinySizeClass];
-			if(s->freelist == nil)
-				s = runtime_MCache_Refill(c, TinySizeClass);
-			v = s->freelist;
-			next = v->next;
-			s->freelist = next;
-			s->ref++;
-			if(next != nil)  // prefetching nil leads to a DTLB miss
-				PREFETCH(next);
-			((uint64*)v)[0] = 0;
-			((uint64*)v)[1] = 0;
-			// See if we need to replace the existing tiny block with the new one
-			// based on amount of remaining free space.
-			if(TinySize-size > tinysize) {
-				c->tiny = (byte*)v + size;
-				c->tinysize = TinySize - size;
-			}
-			size = TinySize;
-			goto done;
-		}
-		// Allocate from mcache free lists.
-		// Inlined version of SizeToClass().
-		if(size <= 1024-8)
-			sizeclass = runtime_size_to_class8[(size+7)>>3];
-		else
-			sizeclass = runtime_size_to_class128[(size-1024+127) >> 7];
-		size = runtime_class_to_size[sizeclass];
-		s = c->alloc[sizeclass];
-		if(s->freelist == nil)
-			s = runtime_MCache_Refill(c, sizeclass);
-		v = s->freelist;
-		next = v->next;
-		s->freelist = next;
-		s->ref++;
-		if(next != nil)  // prefetching nil leads to a DTLB miss
-			PREFETCH(next);
-		if(!(flag & FlagNoZero)) {
-			v->next = nil;
-			// block is zeroed iff second word is zero ...
-			if(size > 2*sizeof(uintptr) && ((uintptr*)v)[1] != 0)
-				runtime_memclr((byte*)v, size);
-		}
-	done:
-		c->local_cachealloc += size;
-	} else {
-		// Allocate directly from heap.
-		s = largealloc(flag, &size);
-		v = (void*)(s->start << PageShift);
-	}
-
-	if(flag & FlagNoGC)
-		runtime_marknogc(v);
-	else if(!(flag & FlagNoScan))
-		runtime_markscan(v);
-
-	if(DebugTypeAtBlockEnd)
-		*(uintptr*)((uintptr)v+size-sizeof(uintptr)) = typ;
-
-	m->mallocing = 0;
-	// TODO: save type even if FlagNoScan?  Potentially expensive but might help
-	// heap profiling/tracing.
-	if(UseSpanType && !(flag & FlagNoScan) && typ != 0)
-		settype(s, v, typ);
-
-	if(runtime_debug.allocfreetrace)
-		runtime_tracealloc(v, size, typ);
-
-	if(!(flag & FlagNoProfiling) && (rate = runtime_MemProfileRate) > 0) {
-		if(size < (uintptr)rate && size < (uintptr)(uint32)c->next_sample)
-			c->next_sample -= size;
-		else
-			runtime_profilealloc(v, size);
-	}
-
-	m->locks--;
-
-	if(!(flag & FlagNoInvokeGC) && mstats.heap_alloc >= mstats.next_gc)
-		runtime_gc(0);
-
-	if(incallback)
-		runtime_entersyscall();
-
-	return v;
-}
-
-static MSpan*
-largealloc(uint32 flag, uintptr *sizep)
-{
-	uintptr npages, size;
-	MSpan *s;
-	void *v;
-
-	// Allocate directly from heap.
-	size = *sizep;
-	if(size + PageSize < size)
-		runtime_throw("out of memory");
-	npages = size >> PageShift;
-	if((size & PageMask) != 0)
-		npages++;
-	s = runtime_MHeap_Alloc(&runtime_mheap, npages, 0, 1, !(flag & FlagNoZero));
-	if(s == nil)
-		runtime_throw("out of memory");
-	s->limit = (byte*)(s->start<<PageShift) + size;
-	*sizep = npages<<PageShift;
-	v = (void*)(s->start << PageShift);
-	// setup for mark sweep
-	runtime_markspan(v, 0, 0, true);
-	return s;
-}
-
-static void
-runtime_profilealloc(void *v, uintptr size)
-{
-	uintptr rate;
-	int32 next;
-	MCache *c;
-
-	c = runtime_m()->mcache;
-	rate = runtime_MemProfileRate;
-	if(size < rate) {
-		// pick next profile time
-		// If you change this, also change allocmcache.
-		if(rate > 0x3fffffff)	// make 2*rate not overflow
-			rate = 0x3fffffff;
-		next = runtime_fastrand1() % (2*rate);
-		// Subtract the "remainder" of the current allocation.
-		// Otherwise objects that are close in size to sampling rate
-		// will be under-sampled, because we consistently discard this remainder.
-		next -= (size - c->next_sample);
-		if(next < 0)
-			next = 0;
-		c->next_sample = next;
-	}
-	runtime_MProf_Malloc(v, size);
-}
-
-void*
-__go_alloc(uintptr size)
-{
-	return runtime_mallocgc(size, 0, FlagNoInvokeGC);
-}
-
-// Free the object whose base pointer is v.
-void
-__go_free(void *v)
-{
-	M *m;
-	int32 sizeclass;
-	MSpan *s;
-	MCache *c;
-	uintptr size;
-
-	if(v == nil)
-		return;
-	
-	// If you change this also change mgc0.c:/^sweep,
-	// which has a copy of the guts of free.
-
-	m = runtime_m();
-	if(m->mallocing)
-		runtime_throw("malloc/free - deadlock");
-	m->mallocing = 1;
-
-	if(!runtime_mlookup(v, nil, nil, &s)) {
-		runtime_printf("free %p: not an allocated block\n", v);
-		runtime_throw("free runtime_mlookup");
-	}
-	size = s->elemsize;
-	sizeclass = s->sizeclass;
-	// Objects that are smaller than TinySize can be allocated using tiny alloc,
-	// if then such object is combined with an object with finalizer, we will crash.
-	if(size < TinySize)
-		runtime_throw("freeing too small block");
-
-	if(runtime_debug.allocfreetrace)
-		runtime_tracefree(v, size);
-
-	// Ensure that the span is swept.
-	// If we free into an unswept span, we will corrupt GC bitmaps.
-	runtime_MSpan_EnsureSwept(s);
-
-	if(s->specials != nil)
-		runtime_freeallspecials(s, v, size);
-
-	c = m->mcache;
-	if(sizeclass == 0) {
-		// Large object.
-		s->needzero = 1;
-		// Must mark v freed before calling unmarkspan and MHeap_Free:
-		// they might coalesce v into other spans and change the bitmap further.
-		runtime_markfreed(v);
-		runtime_unmarkspan(v, 1<<PageShift);
-		// NOTE(rsc,dvyukov): The original implementation of efence
-		// in CL 22060046 used SysFree instead of SysFault, so that
-		// the operating system would eventually give the memory
-		// back to us again, so that an efence program could run
-		// longer without running out of memory. Unfortunately,
-		// calling SysFree here without any kind of adjustment of the
-		// heap data structures means that when the memory does
-		// come back to us, we have the wrong metadata for it, either in
-		// the MSpan structures or in the garbage collection bitmap.
-		// Using SysFault here means that the program will run out of
-		// memory fairly quickly in efence mode, but at least it won't
-		// have mysterious crashes due to confused memory reuse.
-		// It should be possible to switch back to SysFree if we also 
-		// implement and then call some kind of MHeap_DeleteSpan.
-		if(runtime_debug.efence)
-			runtime_SysFault((void*)(s->start<<PageShift), size);
-		else
-			runtime_MHeap_Free(&runtime_mheap, s, 1);
-		c->local_nlargefree++;
-		c->local_largefree += size;
-	} else {
-		// Small object.
-		if(size > 2*sizeof(uintptr))
-			((uintptr*)v)[1] = (uintptr)0xfeedfeedfeedfeedll;	// mark as "needs to be zeroed"
-		else if(size > sizeof(uintptr))
-			((uintptr*)v)[1] = 0;
-		// Must mark v freed before calling MCache_Free:
-		// it might coalesce v and other blocks into a bigger span
-		// and change the bitmap further.
-		c->local_nsmallfree[sizeclass]++;
-		c->local_cachealloc -= size;
-		if(c->alloc[sizeclass] == s) {
-			// We own the span, so we can just add v to the freelist
-			runtime_markfreed(v);
-			((MLink*)v)->next = s->freelist;
-			s->freelist = v;
-			s->ref--;
-		} else {
-			// Someone else owns this span.  Add to free queue.
-			runtime_MCache_Free(c, v, sizeclass, size);
-		}
-	}
-	m->mallocing = 0;
-}
-
-int32
-runtime_mlookup(void *v, byte **base, uintptr *size, MSpan **sp)
-{
-	M *m;
-	uintptr n, i;
-	byte *p;
-	MSpan *s;
-
-	m = runtime_m();
-
-	m->mcache->local_nlookup++;
-	if (sizeof(void*) == 4 && m->mcache->local_nlookup >= (1<<30)) {
-		// purge cache stats to prevent overflow
-		runtime_lock(&runtime_mheap.lock);
-		runtime_purgecachedstats(m->mcache);
-		runtime_unlock(&runtime_mheap.lock);
-	}
-
-	s = runtime_MHeap_LookupMaybe(&runtime_mheap, v);
-	if(sp)
-		*sp = s;
-	if(s == nil) {
-		runtime_checkfreed(v, 1);
-		if(base)
-			*base = nil;
-		if(size)
-			*size = 0;
-		return 0;
-	}
-
-	p = (byte*)((uintptr)s->start<<PageShift);
-	if(s->sizeclass == 0) {
-		// Large object.
-		if(base)
-			*base = p;
-		if(size)
-			*size = s->npages<<PageShift;
-		return 1;
-	}
-
-	n = s->elemsize;
-	if(base) {
-		i = ((byte*)v - p)/n;
-		*base = p + i*n;
-	}
-	if(size)
-		*size = n;
-
-	return 1;
-}
-
-void
-runtime_purgecachedstats(MCache *c)
-{
-	MHeap *h;
-	int32 i;
-
-	// Protected by either heap or GC lock.
-	h = &runtime_mheap;
-	mstats.heap_alloc += c->local_cachealloc;
-	c->local_cachealloc = 0;
-	mstats.nlookup += c->local_nlookup;
-	c->local_nlookup = 0;
-	h->largefree += c->local_largefree;
-	c->local_largefree = 0;
-	h->nlargefree += c->local_nlargefree;
-	c->local_nlargefree = 0;
-	for(i=0; i<(int32)nelem(c->local_nsmallfree); i++) {
-		h->nsmallfree[i] += c->local_nsmallfree[i];
-		c->local_nsmallfree[i] = 0;
-	}
-}
-
-extern uintptr runtime_sizeof_C_MStats
-  __asm__ (GOSYM_PREFIX "runtime.Sizeof_C_MStats");
-
-// Size of the trailing by_size array differs between Go and C,
-// NumSizeClasses was changed, but we can not change Go struct because of backward compatibility.
-// sizeof_C_MStats is what C thinks about size of Go struct.
-
-// Initialized in mallocinit because it's defined in go/runtime/mem.go.
-
-#define MaxArena32 (2U<<30)
-
-void
-runtime_mallocinit(void)
-{
-	byte *p, *p1;
-	uintptr arena_size, bitmap_size, spans_size, p_size;
-	extern byte _end[];
-	uintptr limit;
-	uint64 i;
-	bool reserved;
-
-	runtime_sizeof_C_MStats = sizeof(MStats) - (NumSizeClasses - 61) * sizeof(mstats.by_size[0]);
-
-	p = nil;
-	p_size = 0;
-	arena_size = 0;
-	bitmap_size = 0;
-	spans_size = 0;
-	reserved = false;
-
-	// for 64-bit build
-	USED(p);
-	USED(p_size);
-	USED(arena_size);
-	USED(bitmap_size);
-	USED(spans_size);
-
-	runtime_InitSizes();
-
-	if(runtime_class_to_size[TinySizeClass] != TinySize)
-		runtime_throw("bad TinySizeClass");
-
-	// limit = runtime_memlimit();
-	// See https://code.google.com/p/go/issues/detail?id=5049
-	// TODO(rsc): Fix after 1.1.
-	limit = 0;
-
-	// Set up the allocation arena, a contiguous area of memory where
-	// allocated data will be found.  The arena begins with a bitmap large
-	// enough to hold 4 bits per allocated word.
-	if(sizeof(void*) == 8 && (limit == 0 || limit > (1<<30))) {
-		// On a 64-bit machine, allocate from a single contiguous reservation.
-		// 128 GB (MaxMem) should be big enough for now.
-		//
-		// The code will work with the reservation at any address, but ask
-		// SysReserve to use 0x0000XXc000000000 if possible (XX=00...7f).
-		// Allocating a 128 GB region takes away 37 bits, and the amd64
-		// doesn't let us choose the top 17 bits, so that leaves the 11 bits
-		// in the middle of 0x00c0 for us to choose.  Choosing 0x00c0 means
-		// that the valid memory addresses will begin 0x00c0, 0x00c1, ..., 0x00df.
-		// In little-endian, that's c0 00, c1 00, ..., df 00. None of those are valid
-		// UTF-8 sequences, and they are otherwise as far away from 
-		// ff (likely a common byte) as possible.  If that fails, we try other 0xXXc0
-		// addresses.  An earlier attempt to use 0x11f8 caused out of memory errors
-		// on OS X during thread allocations.  0x00c0 causes conflicts with
-		// AddressSanitizer which reserves all memory up to 0x0100.
-		// These choices are both for debuggability and to reduce the
-		// odds of the conservative garbage collector not collecting memory
-		// because some non-pointer block of memory had a bit pattern
-		// that matched a memory address.
-		//
-		// Actually we reserve 136 GB (because the bitmap ends up being 8 GB)
-		// but it hardly matters: e0 00 is not valid UTF-8 either.
-		//
-		// If this fails we fall back to the 32 bit memory mechanism
-		arena_size = MaxMem;
-		bitmap_size = arena_size / (sizeof(void*)*8/4);
-		spans_size = arena_size / PageSize * sizeof(runtime_mheap.spans[0]);
-		spans_size = ROUND(spans_size, PageSize);
-		for(i = 0; i < HeapBaseOptions; i++) {
-			p = HeapBase(i);
-			p_size = bitmap_size + spans_size + arena_size + PageSize;
-			p = runtime_SysReserve(p, p_size, &reserved);
-			if(p != nil)
-				break;
-		}
-	}
-	if (p == nil) {
-		// On a 32-bit machine, we can't typically get away
-		// with a giant virtual address space reservation.
-		// Instead we map the memory information bitmap
-		// immediately after the data segment, large enough
-		// to handle another 2GB of mappings (256 MB),
-		// along with a reservation for another 512 MB of memory.
-		// When that gets used up, we'll start asking the kernel
-		// for any memory anywhere and hope it's in the 2GB
-		// following the bitmap (presumably the executable begins
-		// near the bottom of memory, so we'll have to use up
-		// most of memory before the kernel resorts to giving out
-		// memory before the beginning of the text segment).
-		//
-		// Alternatively we could reserve 512 MB bitmap, enough
-		// for 4GB of mappings, and then accept any memory the
-		// kernel threw at us, but normally that's a waste of 512 MB
-		// of address space, which is probably too much in a 32-bit world.
-		bitmap_size = MaxArena32 / (sizeof(void*)*8/4);
-		arena_size = 512<<20;
-		spans_size = MaxArena32 / PageSize * sizeof(runtime_mheap.spans[0]);
-		if(limit > 0 && arena_size+bitmap_size+spans_size > limit) {
-			bitmap_size = (limit / 9) & ~((1<<PageShift) - 1);
-			arena_size = bitmap_size * 8;
-			spans_size = arena_size / PageSize * sizeof(runtime_mheap.spans[0]);
-		}
-		spans_size = ROUND(spans_size, PageSize);
-
-		// SysReserve treats the address we ask for, end, as a hint,
-		// not as an absolute requirement.  If we ask for the end
-		// of the data segment but the operating system requires
-		// a little more space before we can start allocating, it will
-		// give out a slightly higher pointer.  Except QEMU, which
-		// is buggy, as usual: it won't adjust the pointer upward.
-		// So adjust it upward a little bit ourselves: 1/4 MB to get
-		// away from the running binary image and then round up
-		// to a MB boundary.
-		p = (byte*)ROUND((uintptr)_end + (1<<18), 1<<20);
-		p_size = bitmap_size + spans_size + arena_size + PageSize;
-		p = runtime_SysReserve(p, p_size, &reserved);
-		if(p == nil)
-			runtime_throw("runtime: cannot reserve arena virtual address space");
-	}
-
-	// PageSize can be larger than OS definition of page size,
-	// so SysReserve can give us a PageSize-unaligned pointer.
-	// To overcome this we ask for PageSize more and round up the pointer.
-	p1 = (byte*)ROUND((uintptr)p, PageSize);
-
-	runtime_mheap.spans = (MSpan**)p1;
-	runtime_mheap.bitmap = p1 + spans_size;
-	runtime_mheap.arena_start = p1 + spans_size + bitmap_size;
-	runtime_mheap.arena_used = runtime_mheap.arena_start;
-	runtime_mheap.arena_end = p + p_size;
-	runtime_mheap.arena_reserved = reserved;
-
-	if(((uintptr)runtime_mheap.arena_start & (PageSize-1)) != 0)
-		runtime_throw("misrounded allocation in mallocinit");
-
-	// Initialize the rest of the allocator.	
-	runtime_MHeap_Init(&runtime_mheap);
-	runtime_m()->mcache = runtime_allocmcache();
-
-	// See if it works.
-	runtime_free(runtime_malloc(TinySize));
-}
-
-void*
-runtime_MHeap_SysAlloc(MHeap *h, uintptr n)
-{
-	byte *p, *p_end;
-	uintptr p_size;
-	bool reserved;
-
-
-	if(n > (uintptr)(h->arena_end - h->arena_used)) {
-		// We are in 32-bit mode, maybe we didn't use all possible address space yet.
-		// Reserve some more space.
-		byte *new_end;
-
-		p_size = ROUND(n + PageSize, 256<<20);
-		new_end = h->arena_end + p_size;
-		if(new_end <= h->arena_start + MaxArena32) {
-			// TODO: It would be bad if part of the arena
-			// is reserved and part is not.
-			p = runtime_SysReserve(h->arena_end, p_size, &reserved);
-			if(p == h->arena_end) {
-				h->arena_end = new_end;
-				h->arena_reserved = reserved;
-			}
-			else if(p+p_size <= h->arena_start + MaxArena32) {
-				// Keep everything page-aligned.
-				// Our pages are bigger than hardware pages.
-				h->arena_end = p+p_size;
-				h->arena_used = p + (-(uintptr)p&(PageSize-1));
-				h->arena_reserved = reserved;
-			} else {
-				uint64 stat;
-				stat = 0;
-				runtime_SysFree(p, p_size, &stat);
-			}
-		}
-	}
-	if(n <= (uintptr)(h->arena_end - h->arena_used)) {
-		// Keep taking from our reservation.
-		p = h->arena_used;
-		runtime_SysMap(p, n, h->arena_reserved, &mstats.heap_sys);
-		h->arena_used += n;
-		runtime_MHeap_MapBits(h);
-		runtime_MHeap_MapSpans(h);
-		
-		if(((uintptr)p & (PageSize-1)) != 0)
-			runtime_throw("misrounded allocation in MHeap_SysAlloc");
-		return p;
-	}
-	
-	// If using 64-bit, our reservation is all we have.
-	if((uintptr)(h->arena_end - h->arena_start) >= MaxArena32)
-		return nil;
-
-	// On 32-bit, once the reservation is gone we can
-	// try to get memory at a location chosen by the OS
-	// and hope that it is in the range we allocated bitmap for.
-	p_size = ROUND(n, PageSize) + PageSize;
-	p = runtime_SysAlloc(p_size, &mstats.heap_sys);
-	if(p == nil)
-		return nil;
-
-	if(p < h->arena_start || (uintptr)(p+p_size - h->arena_start) >= MaxArena32) {
-		runtime_printf("runtime: memory allocated by OS (%p) not in usable range [%p,%p)\n",
-			p, h->arena_start, h->arena_start+MaxArena32);
-		runtime_SysFree(p, p_size, &mstats.heap_sys);
-		return nil;
-	}
-	
-	p_end = p + p_size;
-	p += -(uintptr)p & (PageSize-1);
-	if(p+n > h->arena_used) {
-		h->arena_used = p+n;
-		if(p_end > h->arena_end)
-			h->arena_end = p_end;
-		runtime_MHeap_MapBits(h);
-		runtime_MHeap_MapSpans(h);
-	}
-	
-	if(((uintptr)p & (PageSize-1)) != 0)
-		runtime_throw("misrounded allocation in MHeap_SysAlloc");
-	return p;
-}
-
-static struct
-{
-	Lock	lock;
-	byte*	pos;
-	byte*	end;
-} persistent;
-
-enum
-{
-	PersistentAllocChunk	= 256<<10,
-	PersistentAllocMaxBlock	= 64<<10,  // VM reservation granularity is 64K on windows
-};
-
-// Wrapper around SysAlloc that can allocate small chunks.
-// There is no associated free operation.
-// Intended for things like function/type/debug-related persistent data.
-// If align is 0, uses default align (currently 8).
-void*
-runtime_persistentalloc(uintptr size, uintptr align, uint64 *stat)
-{
-	byte *p;
-
-	if(align != 0) {
-		if(align&(align-1))
-			runtime_throw("persistentalloc: align is not a power of 2");
-		if(align > PageSize)
-			runtime_throw("persistentalloc: align is too large");
-	} else
-		align = 8;
-	if(size >= PersistentAllocMaxBlock)
-		return runtime_SysAlloc(size, stat);
-	runtime_lock(&persistent.lock);
-	persistent.pos = (byte*)ROUND((uintptr)persistent.pos, align);
-	if(persistent.pos + size > persistent.end) {
-		persistent.pos = runtime_SysAlloc(PersistentAllocChunk, &mstats.other_sys);
-		if(persistent.pos == nil) {
-			runtime_unlock(&persistent.lock);
-			runtime_throw("runtime: cannot allocate memory");
-		}
-		persistent.end = persistent.pos + PersistentAllocChunk;
-	}
-	p = persistent.pos;
-	persistent.pos += size;
-	runtime_unlock(&persistent.lock);
-	if(stat != &mstats.other_sys) {
-		// reaccount the allocation against provided stat
-		runtime_xadd64(stat, size);
-		runtime_xadd64(&mstats.other_sys, -(uint64)size);
-	}
-	return p;
-}
-
-static void
-settype(MSpan *s, void *v, uintptr typ)
-{
-	uintptr size, ofs, j, t;
-	uintptr ntypes, nbytes2, nbytes3;
-	uintptr *data2;
-	byte *data3;
-
-	if(s->sizeclass == 0) {
-		s->types.compression = MTypes_Single;
-		s->types.data = typ;
-		return;
-	}
-	size = s->elemsize;
-	ofs = ((uintptr)v - (s->start<<PageShift)) / size;
-
-	switch(s->types.compression) {
-	case MTypes_Empty:
-		ntypes = (s->npages << PageShift) / size;
-		nbytes3 = 8*sizeof(uintptr) + 1*ntypes;
-		data3 = runtime_mallocgc(nbytes3, 0, FlagNoProfiling|FlagNoScan|FlagNoInvokeGC);
-		s->types.compression = MTypes_Bytes;
-		s->types.data = (uintptr)data3;
-		((uintptr*)data3)[1] = typ;
-		data3[8*sizeof(uintptr) + ofs] = 1;
-		break;
-		
-	case MTypes_Words:
-		((uintptr*)s->types.data)[ofs] = typ;
-		break;
-		
-	case MTypes_Bytes:
-		data3 = (byte*)s->types.data;
-		for(j=1; j<8; j++) {
-			if(((uintptr*)data3)[j] == typ) {
-				break;
-			}
-			if(((uintptr*)data3)[j] == 0) {
-				((uintptr*)data3)[j] = typ;
-				break;
-			}
-		}
-		if(j < 8) {
-			data3[8*sizeof(uintptr) + ofs] = j;
-		} else {
-			ntypes = (s->npages << PageShift) / size;
-			nbytes2 = ntypes * sizeof(uintptr);
-			data2 = runtime_mallocgc(nbytes2, 0, FlagNoProfiling|FlagNoScan|FlagNoInvokeGC);
-			s->types.compression = MTypes_Words;
-			s->types.data = (uintptr)data2;
-			
-			// Move the contents of data3 to data2. Then deallocate data3.
-			for(j=0; j<ntypes; j++) {
-				t = data3[8*sizeof(uintptr) + j];
-				t = ((uintptr*)data3)[t];
-				data2[j] = t;
-			}
-			data2[ofs] = typ;
-		}
-		break;
-	}
-}
-
-uintptr
-runtime_gettype(void *v)
-{
-	MSpan *s;
-	uintptr t, ofs;
-	byte *data;
-
-	s = runtime_MHeap_LookupMaybe(&runtime_mheap, v);
-	if(s != nil) {
-		t = 0;
-		switch(s->types.compression) {
-		case MTypes_Empty:
-			break;
-		case MTypes_Single:
-			t = s->types.data;
-			break;
-		case MTypes_Words:
-			ofs = (uintptr)v - (s->start<<PageShift);
-			t = ((uintptr*)s->types.data)[ofs/s->elemsize];
-			break;
-		case MTypes_Bytes:
-			ofs = (uintptr)v - (s->start<<PageShift);
-			data = (byte*)s->types.data;
-			t = data[8*sizeof(uintptr) + ofs/s->elemsize];
-			t = ((uintptr*)data)[t];
-			break;
-		default:
-			runtime_throw("runtime_gettype: invalid compression kind");
-		}
-		if(0) {
-			runtime_printf("%p -> %d,%X\n", v, (int32)s->types.compression, (int64)t);
-		}
-		return t;
-	}
-	return 0;
-}
-
-// Runtime stubs.
-
-void*
-runtime_mal(uintptr n)
-{
-	return runtime_mallocgc(n, 0, 0);
-}
-
-func new(typ *Type) (ret *uint8) {
-	ret = runtime_mallocgc(typ->__size, (uintptr)typ | TypeInfo_SingleObject, typ->kind&KindNoPointers ? FlagNoScan : 0);
-}
-
-static void*
-cnew(const Type *typ, intgo n, int32 objtyp)
-{
-	if((objtyp&(PtrSize-1)) != objtyp)
-		runtime_throw("runtime: invalid objtyp");
-	if(n < 0 || (typ->__size > 0 && (uintptr)n > (MaxMem/typ->__size)))
-		runtime_panicstring("runtime: allocation size out of range");
-	return runtime_mallocgc(typ->__size*n, (uintptr)typ | objtyp, typ->kind&KindNoPointers ? FlagNoScan : 0);
-}
-
-// same as runtime_new, but callable from C
-void*
-runtime_cnew(const Type *typ)
-{
-	return cnew(typ, 1, TypeInfo_SingleObject);
-}
-
-void*
-runtime_cnewarray(const Type *typ, intgo n)
-{
-	return cnew(typ, n, TypeInfo_Array);
-}
-
-func GC() {
-	runtime_gc(2);  // force GC and do eager sweep
-}
-
-func SetFinalizer(obj Eface, finalizer Eface) {
-	byte *base;
-	uintptr size;
-	const FuncType *ft;
-	const Type *fint;
-	const PtrType *ot;
-
-	if(obj.__type_descriptor == nil) {
-		runtime_printf("runtime.SetFinalizer: first argument is nil interface\n");
-		goto throw;
-	}
-	if((obj.__type_descriptor->kind&kindMask) != GO_PTR) {
-		runtime_printf("runtime.SetFinalizer: first argument is %S, not pointer\n", *obj.__type_descriptor->__reflection);
-		goto throw;
-	}
-	ot = (const PtrType*)obj.type;
-	// As an implementation detail we do not run finalizers for zero-sized objects,
-	// because we use &runtime_zerobase for all such allocations.
-	if(ot->__element_type != nil && ot->__element_type->__size == 0)
-		return;
-	// The following check is required for cases when a user passes a pointer to composite literal,
-	// but compiler makes it a pointer to global. For example:
-	//	var Foo = &Object{}
-	//	func main() {
-	//		runtime.SetFinalizer(Foo, nil)
-	//	}
-	// See issue 7656.
-	if((byte*)obj.__object < runtime_mheap.arena_start || runtime_mheap.arena_used <= (byte*)obj.__object)
-		return;
-	if(!runtime_mlookup(obj.__object, &base, &size, nil) || obj.__object != base) {
-		// As an implementation detail we allow to set finalizers for an inner byte
-		// of an object if it could come from tiny alloc (see mallocgc for details).
-		if(ot->__element_type == nil || (ot->__element_type->kind&KindNoPointers) == 0 || ot->__element_type->__size >= TinySize) {
-			runtime_printf("runtime.SetFinalizer: pointer not at beginning of allocated block (%p)\n", obj.__object);
-			goto throw;
-		}
-	}
-	if(finalizer.__type_descriptor != nil) {
-		runtime_createfing();
-		if((finalizer.__type_descriptor->kind&kindMask) != GO_FUNC)
-			goto badfunc;
-		ft = (const FuncType*)finalizer.__type_descriptor;
-		if(ft->__dotdotdot || ft->__in.__count != 1)
-			goto badfunc;
-		fint = *(Type**)ft->__in.__values;
-		if(__go_type_descriptors_equal(fint, obj.__type_descriptor)) {
-			// ok - same type
-		} else if((fint->kind&kindMask) == GO_PTR && (fint->__uncommon == nil || fint->__uncommon->__name == nil || obj.type->__uncommon == nil || obj.type->__uncommon->__name == nil) && __go_type_descriptors_equal(((const PtrType*)fint)->__element_type, ((const PtrType*)obj.type)->__element_type)) {
-			// ok - not same type, but both pointers,
-			// one or the other is unnamed, and same element type, so assignable.
-		} else if((fint->kind&kindMask) == GO_INTERFACE && ((const InterfaceType*)fint)->__methods.__count == 0) {
-			// ok - satisfies empty interface
-		} else if((fint->kind&kindMask) == GO_INTERFACE && __go_convert_interface_2(fint, obj.__type_descriptor, 1) != nil) {
-			// ok - satisfies non-empty interface
-		} else
-			goto badfunc;
-
-		ot = (const PtrType*)obj.__type_descriptor;
-		if(!runtime_addfinalizer(obj.__object, *(FuncVal**)finalizer.__object, ft, ot)) {
-			runtime_printf("runtime.SetFinalizer: finalizer already set\n");
-			goto throw;
-		}
-	} else {
-		// NOTE: asking to remove a finalizer when there currently isn't one set is OK.
-		runtime_removefinalizer(obj.__object);
-	}
-	return;
-
-badfunc:
-	runtime_printf("runtime.SetFinalizer: cannot pass %S to finalizer %S\n", *obj.__type_descriptor->__reflection, *finalizer.__type_descriptor->__reflection);
-throw:
-	runtime_throw("runtime.SetFinalizer");
-}
diff --git a/third_party/gofrontend/libgo/runtime/malloc.h b/third_party/gofrontend/libgo/runtime/malloc.h
deleted file mode 100644
index d0d1cb2..0000000
--- a/third_party/gofrontend/libgo/runtime/malloc.h
+++ /dev/null
@@ -1,660 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Memory allocator, based on tcmalloc.
-// http://goog-perftools.sourceforge.net/doc/tcmalloc.html
-
-// The main allocator works in runs of pages.
-// Small allocation sizes (up to and including 32 kB) are
-// rounded to one of about 100 size classes, each of which
-// has its own free list of objects of exactly that size.
-// Any free page of memory can be split into a set of objects
-// of one size class, which are then managed using free list
-// allocators.
-//
-// The allocator's data structures are:
-//
-//	FixAlloc: a free-list allocator for fixed-size objects,
-//		used to manage storage used by the allocator.
-//	MHeap: the malloc heap, managed at page (4096-byte) granularity.
-//	MSpan: a run of pages managed by the MHeap.
-//	MCentral: a shared free list for a given size class.
-//	MCache: a per-thread (in Go, per-P) cache for small objects.
-//	MStats: allocation statistics.
-//
-// Allocating a small object proceeds up a hierarchy of caches:
-//
-//	1. Round the size up to one of the small size classes
-//	   and look in the corresponding MCache free list.
-//	   If the list is not empty, allocate an object from it.
-//	   This can all be done without acquiring a lock.
-//
-//	2. If the MCache free list is empty, replenish it by
-//	   taking a bunch of objects from the MCentral free list.
-//	   Moving a bunch amortizes the cost of acquiring the MCentral lock.
-//
-//	3. If the MCentral free list is empty, replenish it by
-//	   allocating a run of pages from the MHeap and then
-//	   chopping that memory into a objects of the given size.
-//	   Allocating many objects amortizes the cost of locking
-//	   the heap.
-//
-//	4. If the MHeap is empty or has no page runs large enough,
-//	   allocate a new group of pages (at least 1MB) from the
-//	   operating system.  Allocating a large run of pages
-//	   amortizes the cost of talking to the operating system.
-//
-// Freeing a small object proceeds up the same hierarchy:
-//
-//	1. Look up the size class for the object and add it to
-//	   the MCache free list.
-//
-//	2. If the MCache free list is too long or the MCache has
-//	   too much memory, return some to the MCentral free lists.
-//
-//	3. If all the objects in a given span have returned to
-//	   the MCentral list, return that span to the page heap.
-//
-//	4. If the heap has too much memory, return some to the
-//	   operating system.
-//
-//	TODO(rsc): Step 4 is not implemented.
-//
-// Allocating and freeing a large object uses the page heap
-// directly, bypassing the MCache and MCentral free lists.
-//
-// The small objects on the MCache and MCentral free lists
-// may or may not be zeroed.  They are zeroed if and only if
-// the second word of the object is zero.  A span in the
-// page heap is zeroed unless s->needzero is set. When a span
-// is allocated to break into small objects, it is zeroed if needed
-// and s->needzero is set. There are two main benefits to delaying the
-// zeroing this way:
-//
-//	1. stack frames allocated from the small object lists
-//	   or the page heap can avoid zeroing altogether.
-//	2. the cost of zeroing when reusing a small object is
-//	   charged to the mutator, not the garbage collector.
-//
-// This C code was written with an eye toward translating to Go
-// in the future.  Methods have the form Type_Method(Type *t, ...).
-
-typedef struct MCentral	MCentral;
-typedef struct MHeap	MHeap;
-typedef struct MSpan	MSpan;
-typedef struct MStats	MStats;
-typedef struct MLink	MLink;
-typedef struct MTypes	MTypes;
-typedef struct GCStats	GCStats;
-
-enum
-{
-	PageShift	= 13,
-	PageSize	= 1<<PageShift,
-	PageMask	= PageSize - 1,
-};
-typedef	uintptr	PageID;		// address >> PageShift
-
-enum
-{
-	// Computed constant.  The definition of MaxSmallSize and the
-	// algorithm in msize.c produce some number of different allocation
-	// size classes.  NumSizeClasses is that number.  It's needed here
-	// because there are static arrays of this length; when msize runs its
-	// size choosing algorithm it double-checks that NumSizeClasses agrees.
-	NumSizeClasses = 67,
-
-	// Tunable constants.
-	MaxSmallSize = 32<<10,
-
-	// Tiny allocator parameters, see "Tiny allocator" comment in malloc.goc.
-	TinySize = 16,
-	TinySizeClass = 2,
-
-	FixAllocChunk = 16<<10,		// Chunk size for FixAlloc
-	MaxMHeapList = 1<<(20 - PageShift),	// Maximum page length for fixed-size list in MHeap.
-	HeapAllocChunk = 1<<20,		// Chunk size for heap growth
-
-	// Number of bits in page to span calculations (4k pages).
-	// On Windows 64-bit we limit the arena to 32GB or 35 bits (see below for reason).
-	// On other 64-bit platforms, we limit the arena to 128GB, or 37 bits.
-	// On 32-bit, we don't bother limiting anything, so we use the full 32-bit address.
-#if __SIZEOF_POINTER__ == 8
-#ifdef GOOS_windows
-	// Windows counts memory used by page table into committed memory
-	// of the process, so we can't reserve too much memory.
-	// See http://golang.org/issue/5402 and http://golang.org/issue/5236.
-	MHeapMap_Bits = 35 - PageShift,
-#else
-	MHeapMap_Bits = 37 - PageShift,
-#endif
-#else
-	MHeapMap_Bits = 32 - PageShift,
-#endif
-
-	// Max number of threads to run garbage collection.
-	// 2, 3, and 4 are all plausible maximums depending
-	// on the hardware details of the machine.  The garbage
-	// collector scales well to 8 cpus.
-	MaxGcproc = 8,
-};
-
-// Maximum memory allocation size, a hint for callers.
-// This must be a #define instead of an enum because it
-// is so large.
-#if __SIZEOF_POINTER__ == 8
-#define	MaxMem	(1ULL<<(MHeapMap_Bits+PageShift))	/* 128 GB or 32 GB */
-#else
-#define	MaxMem	((uintptr)-1)
-#endif
-
-// A generic linked list of blocks.  (Typically the block is bigger than sizeof(MLink).)
-struct MLink
-{
-	MLink *next;
-};
-
-// SysAlloc obtains a large chunk of zeroed memory from the
-// operating system, typically on the order of a hundred kilobytes
-// or a megabyte.
-// NOTE: SysAlloc returns OS-aligned memory, but the heap allocator
-// may use larger alignment, so the caller must be careful to realign the
-// memory obtained by SysAlloc.
-//
-// SysUnused notifies the operating system that the contents
-// of the memory region are no longer needed and can be reused
-// for other purposes.
-// SysUsed notifies the operating system that the contents
-// of the memory region are needed again.
-//
-// SysFree returns it unconditionally; this is only used if
-// an out-of-memory error has been detected midway through
-// an allocation.  It is okay if SysFree is a no-op.
-//
-// SysReserve reserves address space without allocating memory.
-// If the pointer passed to it is non-nil, the caller wants the
-// reservation there, but SysReserve can still choose another
-// location if that one is unavailable.  On some systems and in some
-// cases SysReserve will simply check that the address space is
-// available and not actually reserve it.  If SysReserve returns
-// non-nil, it sets *reserved to true if the address space is
-// reserved, false if it has merely been checked.
-// NOTE: SysReserve returns OS-aligned memory, but the heap allocator
-// may use larger alignment, so the caller must be careful to realign the
-// memory obtained by SysAlloc.
-//
-// SysMap maps previously reserved address space for use.
-// The reserved argument is true if the address space was really
-// reserved, not merely checked.
-//
-// SysFault marks a (already SysAlloc'd) region to fault
-// if accessed.  Used only for debugging the runtime.
-
-void*	runtime_SysAlloc(uintptr nbytes, uint64 *stat);
-void	runtime_SysFree(void *v, uintptr nbytes, uint64 *stat);
-void	runtime_SysUnused(void *v, uintptr nbytes);
-void	runtime_SysUsed(void *v, uintptr nbytes);
-void	runtime_SysMap(void *v, uintptr nbytes, bool reserved, uint64 *stat);
-void*	runtime_SysReserve(void *v, uintptr nbytes, bool *reserved);
-void	runtime_SysFault(void *v, uintptr nbytes);
-
-// FixAlloc is a simple free-list allocator for fixed size objects.
-// Malloc uses a FixAlloc wrapped around SysAlloc to manages its
-// MCache and MSpan objects.
-//
-// Memory returned by FixAlloc_Alloc is not zeroed.
-// The caller is responsible for locking around FixAlloc calls.
-// Callers can keep state in the object but the first word is
-// smashed by freeing and reallocating.
-struct FixAlloc
-{
-	uintptr	size;
-	void	(*first)(void *arg, byte *p);	// called first time p is returned
-	void*	arg;
-	MLink*	list;
-	byte*	chunk;
-	uint32	nchunk;
-	uintptr	inuse;	// in-use bytes now
-	uint64*	stat;
-};
-
-void	runtime_FixAlloc_Init(FixAlloc *f, uintptr size, void (*first)(void*, byte*), void *arg, uint64 *stat);
-void*	runtime_FixAlloc_Alloc(FixAlloc *f);
-void	runtime_FixAlloc_Free(FixAlloc *f, void *p);
-
-
-// Statistics.
-// Shared with Go: if you edit this structure, also edit type MemStats in mem.go.
-struct MStats
-{
-	// General statistics.
-	uint64	alloc;		// bytes allocated and still in use
-	uint64	total_alloc;	// bytes allocated (even if freed)
-	uint64	sys;		// bytes obtained from system (should be sum of xxx_sys below, no locking, approximate)
-	uint64	nlookup;	// number of pointer lookups
-	uint64	nmalloc;	// number of mallocs
-	uint64	nfree;  // number of frees
-
-	// Statistics about malloc heap.
-	// protected by mheap.Lock
-	uint64	heap_alloc;	// bytes allocated and still in use
-	uint64	heap_sys;	// bytes obtained from system
-	uint64	heap_idle;	// bytes in idle spans
-	uint64	heap_inuse;	// bytes in non-idle spans
-	uint64	heap_released;	// bytes released to the OS
-	uint64	heap_objects;	// total number of allocated objects
-
-	// Statistics about allocation of low-level fixed-size structures.
-	// Protected by FixAlloc locks.
-	uint64	stacks_inuse;	// bootstrap stacks
-	uint64	stacks_sys;
-	uint64	mspan_inuse;	// MSpan structures
-	uint64	mspan_sys;
-	uint64	mcache_inuse;	// MCache structures
-	uint64	mcache_sys;
-	uint64	buckhash_sys;	// profiling bucket hash table
-	uint64	gc_sys;
-	uint64	other_sys;
-
-	// Statistics about garbage collector.
-	// Protected by mheap or stopping the world during GC.
-	uint64	next_gc;	// next GC (in heap_alloc time)
-	uint64  last_gc;	// last GC (in absolute time)
-	uint64	pause_total_ns;
-	uint64	pause_ns[256];
-	uint64	pause_end[256];
-	uint32	numgc;
-	float64	gc_cpu_fraction;
-	bool	enablegc;
-	bool	debuggc;
-
-	// Statistics about allocation size classes.
-	struct {
-		uint32 size;
-		uint64 nmalloc;
-		uint64 nfree;
-	} by_size[NumSizeClasses];
-};
-
-extern MStats mstats
-  __asm__ (GOSYM_PREFIX "runtime.memStats");
-void	runtime_updatememstats(GCStats *stats);
-
-// Size classes.  Computed and initialized by InitSizes.
-//
-// SizeToClass(0 <= n <= MaxSmallSize) returns the size class,
-//	1 <= sizeclass < NumSizeClasses, for n.
-//	Size class 0 is reserved to mean "not small".
-//
-// class_to_size[i] = largest size in class i
-// class_to_allocnpages[i] = number of pages to allocate when
-//	making new objects in class i
-
-int32	runtime_SizeToClass(int32);
-uintptr	runtime_roundupsize(uintptr);
-extern	int32	runtime_class_to_size[NumSizeClasses];
-extern	int32	runtime_class_to_allocnpages[NumSizeClasses];
-extern	int8	runtime_size_to_class8[1024/8 + 1];
-extern	int8	runtime_size_to_class128[(MaxSmallSize-1024)/128 + 1];
-extern	void	runtime_InitSizes(void);
-
-
-typedef struct MCacheList MCacheList;
-struct MCacheList
-{
-	MLink *list;
-	uint32 nlist;
-};
-
-// Per-thread (in Go, per-P) cache for small objects.
-// No locking needed because it is per-thread (per-P).
-struct MCache
-{
-	// The following members are accessed on every malloc,
-	// so they are grouped here for better caching.
-	int32 next_sample;		// trigger heap sample after allocating this many bytes
-	intptr local_cachealloc;	// bytes allocated (or freed) from cache since last lock of heap
-	// Allocator cache for tiny objects w/o pointers.
-	// See "Tiny allocator" comment in malloc.goc.
-	byte*	tiny;
-	uintptr	tinysize;
-	// The rest is not accessed on every malloc.
-	MSpan*	alloc[NumSizeClasses];	// spans to allocate from
-	MCacheList free[NumSizeClasses];// lists of explicitly freed objects
-	// Local allocator stats, flushed during GC.
-	uintptr local_nlookup;		// number of pointer lookups
-	uintptr local_largefree;	// bytes freed for large objects (>MaxSmallSize)
-	uintptr local_nlargefree;	// number of frees for large objects (>MaxSmallSize)
-	uintptr local_nsmallfree[NumSizeClasses];	// number of frees for small objects (<=MaxSmallSize)
-};
-
-MSpan*	runtime_MCache_Refill(MCache *c, int32 sizeclass);
-void	runtime_MCache_Free(MCache *c, MLink *p, int32 sizeclass, uintptr size);
-void	runtime_MCache_ReleaseAll(MCache *c);
-
-// MTypes describes the types of blocks allocated within a span.
-// The compression field describes the layout of the data.
-//
-// MTypes_Empty:
-//     All blocks are free, or no type information is available for
-//     allocated blocks.
-//     The data field has no meaning.
-// MTypes_Single:
-//     The span contains just one block.
-//     The data field holds the type information.
-//     The sysalloc field has no meaning.
-// MTypes_Words:
-//     The span contains multiple blocks.
-//     The data field points to an array of type [NumBlocks]uintptr,
-//     and each element of the array holds the type of the corresponding
-//     block.
-// MTypes_Bytes:
-//     The span contains at most seven different types of blocks.
-//     The data field points to the following structure:
-//         struct {
-//             type  [8]uintptr       // type[0] is always 0
-//             index [NumBlocks]byte
-//         }
-//     The type of the i-th block is: data.type[data.index[i]]
-enum
-{
-	MTypes_Empty = 0,
-	MTypes_Single = 1,
-	MTypes_Words = 2,
-	MTypes_Bytes = 3,
-};
-struct MTypes
-{
-	byte	compression;	// one of MTypes_*
-	uintptr	data;
-};
-
-enum
-{
-	KindSpecialFinalizer = 1,
-	KindSpecialProfile = 2,
-	// Note: The finalizer special must be first because if we're freeing
-	// an object, a finalizer special will cause the freeing operation
-	// to abort, and we want to keep the other special records around
-	// if that happens.
-};
-
-typedef struct Special Special;
-struct Special
-{
-	Special*	next;	// linked list in span
-	uint16		offset;	// span offset of object
-	byte		kind;	// kind of Special
-};
-
-// The described object has a finalizer set for it.
-typedef struct SpecialFinalizer SpecialFinalizer;
-struct SpecialFinalizer
-{
-	Special		special;
-	FuncVal*	fn;
-	const FuncType*	ft;
-	const PtrType*	ot;
-};
-
-// The described object is being heap profiled.
-typedef struct Bucket Bucket; // from mprof.goc
-typedef struct SpecialProfile SpecialProfile;
-struct SpecialProfile
-{
-	Special	special;
-	Bucket*	b;
-};
-
-// An MSpan is a run of pages.
-enum
-{
-	MSpanInUse = 0,
-	MSpanFree,
-	MSpanListHead,
-	MSpanDead,
-};
-struct MSpan
-{
-	MSpan	*next;		// in a span linked list
-	MSpan	*prev;		// in a span linked list
-	PageID	start;		// starting page number
-	uintptr	npages;		// number of pages in span
-	MLink	*freelist;	// list of free objects
-	// sweep generation:
-	// if sweepgen == h->sweepgen - 2, the span needs sweeping
-	// if sweepgen == h->sweepgen - 1, the span is currently being swept
-	// if sweepgen == h->sweepgen, the span is swept and ready to use
-	// h->sweepgen is incremented by 2 after every GC
-	uint32	sweepgen;
-	uint16	ref;		// capacity - number of objects in freelist
-	uint8	sizeclass;	// size class
-	bool	incache;	// being used by an MCache
-	uint8	state;		// MSpanInUse etc
-	uint8	needzero;	// needs to be zeroed before allocation
-	uintptr	elemsize;	// computed from sizeclass or from npages
-	int64   unusedsince;	// First time spotted by GC in MSpanFree state
-	uintptr npreleased;	// number of pages released to the OS
-	byte	*limit;		// end of data in span
-	MTypes	types;		// types of allocated objects in this span
-	Lock	specialLock;	// guards specials list
-	Special	*specials;	// linked list of special records sorted by offset.
-	MLink	*freebuf;	// objects freed explicitly, not incorporated into freelist yet
-};
-
-void	runtime_MSpan_Init(MSpan *span, PageID start, uintptr npages);
-void	runtime_MSpan_EnsureSwept(MSpan *span);
-bool	runtime_MSpan_Sweep(MSpan *span);
-
-// Every MSpan is in one doubly-linked list,
-// either one of the MHeap's free lists or one of the
-// MCentral's span lists.  We use empty MSpan structures as list heads.
-void	runtime_MSpanList_Init(MSpan *list);
-bool	runtime_MSpanList_IsEmpty(MSpan *list);
-void	runtime_MSpanList_Insert(MSpan *list, MSpan *span);
-void	runtime_MSpanList_InsertBack(MSpan *list, MSpan *span);
-void	runtime_MSpanList_Remove(MSpan *span);	// from whatever list it is in
-
-
-// Central list of free objects of a given size.
-struct MCentral
-{
-	Lock  lock;
-	int32 sizeclass;
-	MSpan nonempty;	// list of spans with a free object
-	MSpan empty;	// list of spans with no free objects (or cached in an MCache)
-	int32 nfree;	// # of objects available in nonempty spans
-};
-
-void	runtime_MCentral_Init(MCentral *c, int32 sizeclass);
-MSpan*	runtime_MCentral_CacheSpan(MCentral *c);
-void	runtime_MCentral_UncacheSpan(MCentral *c, MSpan *s);
-bool	runtime_MCentral_FreeSpan(MCentral *c, MSpan *s, int32 n, MLink *start, MLink *end);
-void	runtime_MCentral_FreeList(MCentral *c, MLink *start); // TODO: need this?
-
-// Main malloc heap.
-// The heap itself is the "free[]" and "large" arrays,
-// but all the other global data is here too.
-struct MHeap
-{
-	Lock lock;
-	MSpan free[MaxMHeapList];	// free lists of given length
-	MSpan freelarge;		// free lists length >= MaxMHeapList
-	MSpan busy[MaxMHeapList];	// busy lists of large objects of given length
-	MSpan busylarge;		// busy lists of large objects length >= MaxMHeapList
-	MSpan **allspans;		// all spans out there
-	MSpan **sweepspans;		// copy of allspans referenced by sweeper
-	uint32	nspan;
-	uint32	nspancap;
-	uint32	sweepgen;		// sweep generation, see comment in MSpan
-	uint32	sweepdone;		// all spans are swept
-
-	// span lookup
-	MSpan**	spans;
-	uintptr	spans_mapped;
-
-	// range of addresses we might see in the heap
-	byte *bitmap;
-	uintptr bitmap_mapped;
-	byte *arena_start;
-	byte *arena_used;
-	byte *arena_end;
-	bool arena_reserved;
-
-	// central free lists for small size classes.
-	// the padding makes sure that the MCentrals are
-	// spaced CacheLineSize bytes apart, so that each MCentral.Lock
-	// gets its own cache line.
-	struct {
-		MCentral mcentral;
-		byte pad[64];
-	} central[NumSizeClasses];
-
-	FixAlloc spanalloc;	// allocator for Span*
-	FixAlloc cachealloc;	// allocator for MCache*
-	FixAlloc specialfinalizeralloc;	// allocator for SpecialFinalizer*
-	FixAlloc specialprofilealloc;	// allocator for SpecialProfile*
-	Lock speciallock; // lock for sepcial record allocators.
-
-	// Malloc stats.
-	uint64 largefree;	// bytes freed for large objects (>MaxSmallSize)
-	uint64 nlargefree;	// number of frees for large objects (>MaxSmallSize)
-	uint64 nsmallfree[NumSizeClasses];	// number of frees for small objects (<=MaxSmallSize)
-};
-extern MHeap runtime_mheap;
-
-void	runtime_MHeap_Init(MHeap *h);
-MSpan*	runtime_MHeap_Alloc(MHeap *h, uintptr npage, int32 sizeclass, bool large, bool needzero);
-void	runtime_MHeap_Free(MHeap *h, MSpan *s, int32 acct);
-MSpan*	runtime_MHeap_Lookup(MHeap *h, void *v);
-MSpan*	runtime_MHeap_LookupMaybe(MHeap *h, void *v);
-void	runtime_MGetSizeClassInfo(int32 sizeclass, uintptr *size, int32 *npages, int32 *nobj);
-void*	runtime_MHeap_SysAlloc(MHeap *h, uintptr n);
-void	runtime_MHeap_MapBits(MHeap *h);
-void	runtime_MHeap_MapSpans(MHeap *h);
-void	runtime_MHeap_Scavenger(void*);
-void	runtime_MHeap_SplitSpan(MHeap *h, MSpan *s);
-
-void*	runtime_mallocgc(uintptr size, uintptr typ, uint32 flag);
-void*	runtime_persistentalloc(uintptr size, uintptr align, uint64 *stat);
-int32	runtime_mlookup(void *v, byte **base, uintptr *size, MSpan **s);
-void	runtime_gc(int32 force);
-uintptr	runtime_sweepone(void);
-void	runtime_markscan(void *v);
-void	runtime_marknogc(void *v);
-void	runtime_checkallocated(void *v, uintptr n);
-void	runtime_markfreed(void *v);
-void	runtime_checkfreed(void *v, uintptr n);
-extern	int32	runtime_checking;
-void	runtime_markspan(void *v, uintptr size, uintptr n, bool leftover);
-void	runtime_unmarkspan(void *v, uintptr size);
-void	runtime_purgecachedstats(MCache*);
-void*	runtime_cnew(const Type*);
-void*	runtime_cnewarray(const Type*, intgo);
-void	runtime_tracealloc(void*, uintptr, uintptr);
-void	runtime_tracefree(void*, uintptr);
-void	runtime_tracegc(void);
-
-uintptr	runtime_gettype(void*);
-
-enum
-{
-	// flags to malloc
-	FlagNoScan	= 1<<0,	// GC doesn't have to scan object
-	FlagNoProfiling	= 1<<1,	// must not profile
-	FlagNoGC	= 1<<2,	// must not free or scan for pointers
-	FlagNoZero	= 1<<3, // don't zero memory
-	FlagNoInvokeGC	= 1<<4, // don't invoke GC
-};
-
-typedef struct Obj Obj;
-struct Obj
-{
-	byte	*p;	// data pointer
-	uintptr	n;	// size of data in bytes
-	uintptr	ti;	// type info
-};
-
-void	runtime_MProf_Malloc(void*, uintptr);
-void	runtime_MProf_Free(Bucket*, uintptr, bool);
-void	runtime_MProf_GC(void);
-void	runtime_iterate_memprof(void (*callback)(Bucket*, uintptr, Location*, uintptr, uintptr, uintptr));
-int32	runtime_gcprocs(void);
-void	runtime_helpgc(int32 nproc);
-void	runtime_gchelper(void);
-void	runtime_createfing(void);
-G*	runtime_wakefing(void);
-extern bool	runtime_fingwait;
-extern bool	runtime_fingwake;
-
-void	runtime_setprofilebucket(void *p, Bucket *b);
-
-struct __go_func_type;
-struct __go_ptr_type;
-bool	runtime_addfinalizer(void *p, FuncVal *fn, const struct __go_func_type*, const struct __go_ptr_type*);
-void	runtime_removefinalizer(void*);
-void	runtime_queuefinalizer(void *p, FuncVal *fn, const struct __go_func_type *ft, const struct __go_ptr_type *ot);
-
-void	runtime_freeallspecials(MSpan *span, void *p, uintptr size);
-bool	runtime_freespecial(Special *s, void *p, uintptr size, bool freed);
-
-enum
-{
-	TypeInfo_SingleObject = 0,
-	TypeInfo_Array = 1,
-	TypeInfo_Chan = 2,
-
-	// Enables type information at the end of blocks allocated from heap	
-	DebugTypeAtBlockEnd = 0,
-};
-
-// Information from the compiler about the layout of stack frames.
-typedef struct BitVector BitVector;
-struct BitVector
-{
-	int32 n; // # of bits
-	uint32 *data;
-};
-typedef struct StackMap StackMap;
-struct StackMap
-{
-	int32 n; // number of bitmaps
-	int32 nbit; // number of bits in each bitmap
-	uint32 data[];
-};
-enum {
-	// Pointer map
-	BitsPerPointer = 2,
-	BitsDead = 0,
-	BitsScalar = 1,
-	BitsPointer = 2,
-	BitsMultiWord = 3,
-	// BitsMultiWord will be set for the first word of a multi-word item.
-	// When it is set, one of the following will be set for the second word.
-	BitsString = 0,
-	BitsSlice = 1,
-	BitsIface = 2,
-	BitsEface = 3,
-};
-// Returns pointer map data for the given stackmap index
-// (the index is encoded in PCDATA_StackMapIndex).
-BitVector	runtime_stackmapdata(StackMap *stackmap, int32 n);
-
-// defined in mgc0.go
-void	runtime_gc_m_ptr(Eface*);
-void	runtime_gc_g_ptr(Eface*);
-void	runtime_gc_itab_ptr(Eface*);
-
-void	runtime_memorydump(void);
-int32	runtime_setgcpercent(int32);
-
-// Value we use to mark dead pointers when GODEBUG=gcdead=1.
-#define PoisonGC ((uintptr)0xf969696969696969ULL)
-#define PoisonStack ((uintptr)0x6868686868686868ULL)
-
-struct Workbuf;
-void	runtime_MProf_Mark(struct Workbuf**, void (*)(struct Workbuf**, Obj));
-void	runtime_proc_scan(struct Workbuf**, void (*)(struct Workbuf**, Obj));
-void	runtime_time_scan(struct Workbuf**, void (*)(struct Workbuf**, Obj));
-void	runtime_netpoll_scan(struct Workbuf**, void (*)(struct Workbuf**, Obj));
diff --git a/third_party/gofrontend/libgo/runtime/map.goc b/third_party/gofrontend/libgo/runtime/map.goc
deleted file mode 100644
index e4b8456..0000000
--- a/third_party/gofrontend/libgo/runtime/map.goc
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime
-#include "runtime.h"
-#include "map.h"
-
-typedef struct __go_map Hmap;
-typedef struct __go_hash_iter hiter;
-
-/* Access a value in a map, returning a value and a presence indicator.  */
-
-func mapaccess2(t *MapType, h *Hmap, key *byte, val *byte) (present bool) {
-	byte *mapval;
-	size_t valsize;
-
-	mapval = __go_map_index(h, key, 0);
-	valsize = t->__val_type->__size;
-	if (mapval == nil) {
-		__builtin_memset(val, 0, valsize);
-		present = 0;
-	} else {
-		__builtin_memcpy(val, mapval, valsize);
-		present = 1;
-	}
-}
-
-/* Optionally assign a value to a map (m[k] = v, p).  */
-
-func mapassign2(h *Hmap, key *byte, val *byte, p bool) {
-	if (!p) {
-		__go_map_delete(h, key);
-	} else {
-		byte *mapval;
-		size_t valsize;
-
-		mapval = __go_map_index(h, key, 1);
-		valsize = h->__descriptor->__map_descriptor->__val_type->__size;
-		__builtin_memcpy(mapval, val, valsize);
-	}
-}
-
-/* Delete a key from a map.  */
-
-func mapdelete(h *Hmap, key *byte) {
-	__go_map_delete(h, key);
-}
-
-/* Initialize a range over a map.  */
-
-func mapiterinit(h *Hmap, it *hiter) {
-	__go_mapiterinit(h, it);
-}
-
-/* Move to the next iteration, updating *HITER.  */
-
-func mapiternext(it *hiter) {
-	__go_mapiternext(it);
-}
-
-/* Get the key of the current iteration.  */
-
-func mapiter1(it *hiter, key *byte) {
-	__go_mapiter1(it, key);
-}
-
-/* Get the key and value of the current iteration.  */
-
-func mapiter2(it *hiter, key *byte, val *byte) {
-	__go_mapiter2(it, key, val);
-}
diff --git a/third_party/gofrontend/libgo/runtime/map.h b/third_party/gofrontend/libgo/runtime/map.h
deleted file mode 100644
index 0c587bb..0000000
--- a/third_party/gofrontend/libgo/runtime/map.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* map.h -- the map type for Go.
-
-   Copyright 2009 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "go-type.h"
-
-/* A map descriptor is what we need to manipulate the map.  This is
-   constant for a given map type.  */
-
-struct __go_map_descriptor
-{
-  /* A pointer to the type descriptor for the type of the map itself.  */
-  const struct __go_map_type *__map_descriptor;
-
-  /* A map entry is a struct with three fields:
-       map_entry_type *next_entry;
-       key_type key;
-       value_type value;
-     This is the size of that struct.  */
-  uintptr_t __entry_size;
-
-  /* The offset of the key field in a map entry struct.  */
-  uintptr_t __key_offset;
-
-  /* The offset of the value field in a map entry struct (the value
-     field immediately follows the key field, but there may be some
-     bytes inserted for alignment).  */
-  uintptr_t __val_offset;
-};
-
-struct __go_map
-{
-  /* The constant descriptor for this map.  */
-  const struct __go_map_descriptor *__descriptor;
-
-  /* The number of elements in the hash table.  */
-  uintptr_t __element_count;
-
-  /* The number of entries in the __buckets array.  */
-  uintptr_t __bucket_count;
-
-  /* Each bucket is a pointer to a linked list of map entries.  */
-  void **__buckets;
-};
-
-/* For a map iteration the compiled code will use a pointer to an
-   iteration structure.  The iteration structure will be allocated on
-   the stack.  The Go code must allocate at least enough space.  */
-
-struct __go_hash_iter
-{
-  /* A pointer to the current entry.  This will be set to NULL when
-     the range has completed.  The Go will test this field, so it must
-     be the first one in the structure.  */
-  const void *entry;
-  /* The map we are iterating over.  */
-  const struct __go_map *map;
-  /* A pointer to the next entry in the current bucket.  This permits
-     deleting the current entry.  This will be NULL when we have seen
-     all the entries in the current bucket.  */
-  const void *next_entry;
-  /* The bucket index of the current and next entry.  */
-  uintptr_t bucket;
-};
-
-extern struct __go_map *__go_new_map (const struct __go_map_descriptor *,
-				      uintptr_t);
-
-extern uintptr_t __go_map_next_prime (uintptr_t);
-
-extern void *__go_map_index (struct __go_map *, const void *, _Bool);
-
-extern void __go_map_delete (struct __go_map *, const void *);
-
-extern void __go_mapiterinit (const struct __go_map *, struct __go_hash_iter *);
-
-extern void __go_mapiternext (struct __go_hash_iter *);
-
-extern void __go_mapiter1 (struct __go_hash_iter *it, unsigned char *key);
-
-extern void __go_mapiter2 (struct __go_hash_iter *it, unsigned char *key,
-			   unsigned char *val);
diff --git a/third_party/gofrontend/libgo/runtime/mcache.c b/third_party/gofrontend/libgo/runtime/mcache.c
deleted file mode 100644
index 178831d..0000000
--- a/third_party/gofrontend/libgo/runtime/mcache.c
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Per-P malloc cache for small objects.
-//
-// See malloc.h for an overview.
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-extern volatile intgo runtime_MemProfileRate
-  __asm__ (GOSYM_PREFIX "runtime.MemProfileRate");
-
-// dummy MSpan that contains no free objects.
-static MSpan emptymspan;
-
-MCache*
-runtime_allocmcache(void)
-{
-	intgo rate;
-	MCache *c;
-	int32 i;
-
-	runtime_lock(&runtime_mheap.lock);
-	c = runtime_FixAlloc_Alloc(&runtime_mheap.cachealloc);
-	runtime_unlock(&runtime_mheap.lock);
-	runtime_memclr((byte*)c, sizeof(*c));
-	for(i = 0; i < NumSizeClasses; i++)
-		c->alloc[i] = &emptymspan;
-
-	// Set first allocation sample size.
-	rate = runtime_MemProfileRate;
-	if(rate > 0x3fffffff)	// make 2*rate not overflow
-		rate = 0x3fffffff;
-	if(rate != 0)
-		c->next_sample = runtime_fastrand1() % (2*rate);
-
-	return c;
-}
-
-void
-runtime_freemcache(MCache *c)
-{
-	runtime_MCache_ReleaseAll(c);
-	runtime_lock(&runtime_mheap.lock);
-	runtime_purgecachedstats(c);
-	runtime_FixAlloc_Free(&runtime_mheap.cachealloc, c);
-	runtime_unlock(&runtime_mheap.lock);
-}
-
-// Gets a span that has a free object in it and assigns it
-// to be the cached span for the given sizeclass.  Returns this span.
-MSpan*
-runtime_MCache_Refill(MCache *c, int32 sizeclass)
-{
-	MCacheList *l;
-	MSpan *s;
-
-	runtime_m()->locks++;
-	// Return the current cached span to the central lists.
-	s = c->alloc[sizeclass];
-	if(s->freelist != nil)
-		runtime_throw("refill on a nonempty span");
-	if(s != &emptymspan)
-		runtime_MCentral_UncacheSpan(&runtime_mheap.central[sizeclass].mcentral, s);
-
-	// Push any explicitly freed objects to the central lists.
-	// Not required, but it seems like a good time to do it.
-	l = &c->free[sizeclass];
-	if(l->nlist > 0) {
-		runtime_MCentral_FreeList(&runtime_mheap.central[sizeclass].mcentral, l->list);
-		l->list = nil;
-		l->nlist = 0;
-	}
-
-	// Get a new cached span from the central lists.
-	s = runtime_MCentral_CacheSpan(&runtime_mheap.central[sizeclass].mcentral);
-	if(s == nil)
-		runtime_throw("out of memory");
-	if(s->freelist == nil) {
-		runtime_printf("%d %d\n", s->ref, (int32)((s->npages << PageShift) / s->elemsize));
-		runtime_throw("empty span");
-	}
-	c->alloc[sizeclass] = s;
-	runtime_m()->locks--;
-	return s;
-}
-
-void
-runtime_MCache_Free(MCache *c, MLink *p, int32 sizeclass, uintptr size)
-{
-	MCacheList *l;
-
-	// Put on free list.
-	l = &c->free[sizeclass];
-	p->next = l->list;
-	l->list = p;
-	l->nlist++;
-
-	// We transfer a span at a time from MCentral to MCache,
-	// so we'll do the same in the other direction.
-	if(l->nlist >= (runtime_class_to_allocnpages[sizeclass]<<PageShift)/size) {
-		runtime_MCentral_FreeList(&runtime_mheap.central[sizeclass].mcentral, l->list);
-		l->list = nil;
-		l->nlist = 0;
-	}
-}
-
-void
-runtime_MCache_ReleaseAll(MCache *c)
-{
-	int32 i;
-	MSpan *s;
-	MCacheList *l;
-
-	for(i=0; i<NumSizeClasses; i++) {
-		s = c->alloc[i];
-		if(s != &emptymspan) {
-			runtime_MCentral_UncacheSpan(&runtime_mheap.central[i].mcentral, s);
-			c->alloc[i] = &emptymspan;
-		}
-		l = &c->free[i];
-		if(l->nlist > 0) {
-			runtime_MCentral_FreeList(&runtime_mheap.central[i].mcentral, l->list);
-			l->list = nil;
-			l->nlist = 0;
-		}
-	}
-}
diff --git a/third_party/gofrontend/libgo/runtime/mcentral.c b/third_party/gofrontend/libgo/runtime/mcentral.c
deleted file mode 100644
index 0106fe5..0000000
--- a/third_party/gofrontend/libgo/runtime/mcentral.c
+++ /dev/null
@@ -1,307 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Central free lists.
-//
-// See malloc.h for an overview.
-//
-// The MCentral doesn't actually contain the list of free objects; the MSpan does.
-// Each MCentral is two lists of MSpans: those with free objects (c->nonempty)
-// and those that are completely allocated (c->empty).
-//
-// TODO(rsc): tcmalloc uses a "transfer cache" to split the list
-// into sections of class_to_transfercount[sizeclass] objects
-// so that it is faster to move those lists between MCaches and MCentrals.
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-static bool MCentral_Grow(MCentral *c);
-static void MCentral_Free(MCentral *c, MLink *v);
-static void MCentral_ReturnToHeap(MCentral *c, MSpan *s);
-
-// Initialize a single central free list.
-void
-runtime_MCentral_Init(MCentral *c, int32 sizeclass)
-{
-	c->sizeclass = sizeclass;
-	runtime_MSpanList_Init(&c->nonempty);
-	runtime_MSpanList_Init(&c->empty);
-}
-
-// Allocate a span to use in an MCache.
-MSpan*
-runtime_MCentral_CacheSpan(MCentral *c)
-{
-	MSpan *s;
-	int32 cap, n;
-	uint32 sg;
-
-	runtime_lock(&c->lock);
-	sg = runtime_mheap.sweepgen;
-retry:
-	for(s = c->nonempty.next; s != &c->nonempty; s = s->next) {
-		if(s->sweepgen == sg-2 && runtime_cas(&s->sweepgen, sg-2, sg-1)) {
-			runtime_unlock(&c->lock);
-			runtime_MSpan_Sweep(s);
-			runtime_lock(&c->lock);
-			// the span could have been moved to heap, retry
-			goto retry;
-		}
-		if(s->sweepgen == sg-1) {
-			// the span is being swept by background sweeper, skip
-			continue;
-		}
-		// we have a nonempty span that does not require sweeping, allocate from it
-		goto havespan;
-	}
-
-	for(s = c->empty.next; s != &c->empty; s = s->next) {
-		if(s->sweepgen == sg-2 && runtime_cas(&s->sweepgen, sg-2, sg-1)) {
-			// we have an empty span that requires sweeping,
-			// sweep it and see if we can free some space in it
-			runtime_MSpanList_Remove(s);
-			// swept spans are at the end of the list
-			runtime_MSpanList_InsertBack(&c->empty, s);
-			runtime_unlock(&c->lock);
-			runtime_MSpan_Sweep(s);
-			runtime_lock(&c->lock);
-			// the span could be moved to nonempty or heap, retry
-			goto retry;
-		}
-		if(s->sweepgen == sg-1) {
-			// the span is being swept by background sweeper, skip
-			continue;
-		}
-		// already swept empty span,
-		// all subsequent ones must also be either swept or in process of sweeping
-		break;
-	}
-
-	// Replenish central list if empty.
-	if(!MCentral_Grow(c)) {
-		runtime_unlock(&c->lock);
-		return nil;
-	}
-	goto retry;
-
-havespan:
-	cap = (s->npages << PageShift) / s->elemsize;
-	n = cap - s->ref;
-	if(n == 0)
-		runtime_throw("empty span");
-	if(s->freelist == nil)
-		runtime_throw("freelist empty");
-	c->nfree -= n;
-	runtime_MSpanList_Remove(s);
-	runtime_MSpanList_InsertBack(&c->empty, s);
-	s->incache = true;
-	runtime_unlock(&c->lock);
-	return s;
-}
-
-// Return span from an MCache.
-void
-runtime_MCentral_UncacheSpan(MCentral *c, MSpan *s)
-{
-	MLink *v;
-	int32 cap, n;
-
-	runtime_lock(&c->lock);
-
-	s->incache = false;
-
-	// Move any explicitly freed items from the freebuf to the freelist.
-	while((v = s->freebuf) != nil) {
-		s->freebuf = v->next;
-		runtime_markfreed(v);
-		v->next = s->freelist;
-		s->freelist = v;
-		s->ref--;
-	}
-
-	if(s->ref == 0) {
-		// Free back to heap.  Unlikely, but possible.
-		MCentral_ReturnToHeap(c, s); // unlocks c
-		return;
-	}
-	
-	cap = (s->npages << PageShift) / s->elemsize;
-	n = cap - s->ref;
-	if(n > 0) {
-		c->nfree += n;
-		runtime_MSpanList_Remove(s);
-		runtime_MSpanList_Insert(&c->nonempty, s);
-	}
-	runtime_unlock(&c->lock);
-}
-
-// Free the list of objects back into the central free list c.
-// Called from runtime_free.
-void
-runtime_MCentral_FreeList(MCentral *c, MLink *start)
-{
-	MLink *next;
-
-	runtime_lock(&c->lock);
-	for(; start != nil; start = next) {
-		next = start->next;
-		MCentral_Free(c, start);
-	}
-	runtime_unlock(&c->lock);
-}
-
-// Helper: free one object back into the central free list.
-// Caller must hold lock on c on entry.  Holds lock on exit.
-static void
-MCentral_Free(MCentral *c, MLink *v)
-{
-	MSpan *s;
-
-	// Find span for v.
-	s = runtime_MHeap_Lookup(&runtime_mheap, v);
-	if(s == nil || s->ref == 0)
-		runtime_throw("invalid free");
-	if(s->sweepgen != runtime_mheap.sweepgen)
-		runtime_throw("free into unswept span");
-	
-	// If the span is currently being used unsynchronized by an MCache,
-	// we can't modify the freelist.  Add to the freebuf instead.  The
-	// items will get moved to the freelist when the span is returned
-	// by the MCache.
-	if(s->incache) {
-		v->next = s->freebuf;
-		s->freebuf = v;
-		return;
-	}
-
-	// Move span to nonempty if necessary.
-	if(s->freelist == nil) {
-		runtime_MSpanList_Remove(s);
-		runtime_MSpanList_Insert(&c->nonempty, s);
-	}
-
-	// Add the object to span's free list.
-	runtime_markfreed(v);
-	v->next = s->freelist;
-	s->freelist = v;
-	s->ref--;
-	c->nfree++;
-
-	// If s is completely freed, return it to the heap.
-	if(s->ref == 0) {
-		MCentral_ReturnToHeap(c, s); // unlocks c
-		runtime_lock(&c->lock);
-	}
-}
-
-// Free n objects from a span s back into the central free list c.
-// Called during sweep.
-// Returns true if the span was returned to heap.  Sets sweepgen to
-// the latest generation.
-bool
-runtime_MCentral_FreeSpan(MCentral *c, MSpan *s, int32 n, MLink *start, MLink *end)
-{
-	if(s->incache)
-		runtime_throw("freespan into cached span");
-	runtime_lock(&c->lock);
-
-	// Move to nonempty if necessary.
-	if(s->freelist == nil) {
-		runtime_MSpanList_Remove(s);
-		runtime_MSpanList_Insert(&c->nonempty, s);
-	}
-
-	// Add the objects back to s's free list.
-	end->next = s->freelist;
-	s->freelist = start;
-	s->ref -= n;
-	c->nfree += n;
-	
-	// delay updating sweepgen until here.  This is the signal that
-	// the span may be used in an MCache, so it must come after the
-	// linked list operations above (actually, just after the
-	// lock of c above.)
-	runtime_atomicstore(&s->sweepgen, runtime_mheap.sweepgen);
-
-	if(s->ref != 0) {
-		runtime_unlock(&c->lock);
-		return false;
-	}
-
-	// s is completely freed, return it to the heap.
-	MCentral_ReturnToHeap(c, s); // unlocks c
-	return true;
-}
-
-void
-runtime_MGetSizeClassInfo(int32 sizeclass, uintptr *sizep, int32 *npagesp, int32 *nobj)
-{
-	int32 size;
-	int32 npages;
-
-	npages = runtime_class_to_allocnpages[sizeclass];
-	size = runtime_class_to_size[sizeclass];
-	*npagesp = npages;
-	*sizep = size;
-	*nobj = (npages << PageShift) / size;
-}
-
-// Fetch a new span from the heap and
-// carve into objects for the free list.
-static bool
-MCentral_Grow(MCentral *c)
-{
-	int32 i, n, npages;
-	uintptr size;
-	MLink **tailp, *v;
-	byte *p;
-	MSpan *s;
-
-	runtime_unlock(&c->lock);
-	runtime_MGetSizeClassInfo(c->sizeclass, &size, &npages, &n);
-	s = runtime_MHeap_Alloc(&runtime_mheap, npages, c->sizeclass, 0, 1);
-	if(s == nil) {
-		// TODO(rsc): Log out of memory
-		runtime_lock(&c->lock);
-		return false;
-	}
-
-	// Carve span into sequence of blocks.
-	tailp = &s->freelist;
-	p = (byte*)(s->start << PageShift);
-	s->limit = p + size*n;
-	for(i=0; i<n; i++) {
-		v = (MLink*)p;
-		*tailp = v;
-		tailp = &v->next;
-		p += size;
-	}
-	*tailp = nil;
-	runtime_markspan((byte*)(s->start<<PageShift), size, n, size*n < (s->npages<<PageShift));
-
-	runtime_lock(&c->lock);
-	c->nfree += n;
-	runtime_MSpanList_Insert(&c->nonempty, s);
-	return true;
-}
-
-// Return s to the heap.  s must be unused (s->ref == 0).  Unlocks c.
-static void
-MCentral_ReturnToHeap(MCentral *c, MSpan *s)
-{
-	int32 size;
-
-	size = runtime_class_to_size[c->sizeclass];
-	runtime_MSpanList_Remove(s);
-	s->needzero = 1;
-	s->freelist = nil;
-	if(s->ref != 0)
-		runtime_throw("ref wrong");
-	c->nfree -= (s->npages << PageShift) / size;
-	runtime_unlock(&c->lock);
-	runtime_unmarkspan((byte*)(s->start<<PageShift), s->npages<<PageShift);
-	runtime_MHeap_Free(&runtime_mheap, s, 0);
-}
diff --git a/third_party/gofrontend/libgo/runtime/mem.c b/third_party/gofrontend/libgo/runtime/mem.c
deleted file mode 100644
index 6312480..0000000
--- a/third_party/gofrontend/libgo/runtime/mem.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/* Defining _XOPEN_SOURCE hides the declaration of madvise() on Solaris <
-   11 and the MADV_DONTNEED definition on IRIX 6.5.  */
-#undef _XOPEN_SOURCE
-
-#include <errno.h>
-#include <unistd.h>
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-#ifndef MAP_ANON
-#ifdef MAP_ANONYMOUS
-#define MAP_ANON MAP_ANONYMOUS
-#else
-#define USE_DEV_ZERO
-#define MAP_ANON 0
-#endif
-#endif
-
-#ifndef MAP_NORESERVE
-#define MAP_NORESERVE 0
-#endif
-
-#ifdef USE_DEV_ZERO
-static int dev_zero = -1;
-#endif
-
-static int32
-addrspace_free(void *v __attribute__ ((unused)), uintptr n __attribute__ ((unused)))
-{
-#ifdef HAVE_MINCORE
-	size_t page_size = getpagesize();
-	int32 errval;
-	uintptr chunk;
-	uintptr off;
-	
-	// NOTE: vec must be just 1 byte long here.
-	// Mincore returns ENOMEM if any of the pages are unmapped,
-	// but we want to know that all of the pages are unmapped.
-	// To make these the same, we can only ask about one page
-	// at a time. See golang.org/issue/7476.
-	static byte vec[1];
-
-	errno = 0;
-	for(off = 0; off < n; off += chunk) {
-		chunk = page_size * sizeof vec;
-		if(chunk > (n - off))
-			chunk = n - off;
-		errval = mincore((char*)v + off, chunk, (void*)vec);
-		// ENOMEM means unmapped, which is what we want.
-		// Anything else we assume means the pages are mapped.
-		if(errval == 0 || errno != ENOMEM)
-			return 0;
-	}
-#endif
-	return 1;
-}
-
-static void *
-mmap_fixed(byte *v, uintptr n, int32 prot, int32 flags, int32 fd, uint32 offset)
-{
-	void *p;
-
-	p = runtime_mmap((void *)v, n, prot, flags, fd, offset);
-	if(p != v && addrspace_free(v, n)) {
-		// On some systems, mmap ignores v without
-		// MAP_FIXED, so retry if the address space is free.
-		if(p != MAP_FAILED)
-			runtime_munmap(p, n);
-		p = runtime_mmap((void *)v, n, prot, flags|MAP_FIXED, fd, offset);
-	}
-	return p;
-}
-
-void*
-runtime_SysAlloc(uintptr n, uint64 *stat)
-{
-	void *p;
-	int fd = -1;
-
-#ifdef USE_DEV_ZERO
-	if (dev_zero == -1) {
-		dev_zero = open("/dev/zero", O_RDONLY);
-		if (dev_zero < 0) {
-			runtime_printf("open /dev/zero: errno=%d\n", errno);
-			exit(2);
-		}
-	}
-	fd = dev_zero;
-#endif
-
-	p = runtime_mmap(nil, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, fd, 0);
-	if (p == MAP_FAILED) {
-		if(errno == EACCES) {
-			runtime_printf("runtime: mmap: access denied\n");
-			runtime_printf("if you're running SELinux, enable execmem for this process.\n");
-			exit(2);
-		}
-		if(errno == EAGAIN) {
-			runtime_printf("runtime: mmap: too much locked memory (check 'ulimit -l').\n");
-			runtime_exit(2);
-		}
-		return nil;
-	}
-	runtime_xadd64(stat, n);
-	return p;
-}
-
-void
-runtime_SysUnused(void *v __attribute__ ((unused)), uintptr n __attribute__ ((unused)))
-{
-#ifdef MADV_DONTNEED
-	runtime_madvise(v, n, MADV_DONTNEED);
-#endif
-}
-
-void
-runtime_SysUsed(void *v, uintptr n)
-{
-	USED(v);
-	USED(n);
-}
-
-void
-runtime_SysFree(void *v, uintptr n, uint64 *stat)
-{
-	runtime_xadd64(stat, -(uint64)n);
-	runtime_munmap(v, n);
-}
-
-void
-runtime_SysFault(void *v, uintptr n)
-{
-	int fd = -1;
-
-#ifdef USE_DEV_ZERO
-	if (dev_zero == -1) {
-		dev_zero = open("/dev/zero", O_RDONLY);
-		if (dev_zero < 0) {
-			runtime_printf("open /dev/zero: errno=%d\n", errno);
-			exit(2);
-		}
-	}
-	fd = dev_zero;
-#endif
-
-	runtime_mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, fd, 0);
-}
-
-void*
-runtime_SysReserve(void *v, uintptr n, bool *reserved)
-{
-	int fd = -1;
-	void *p;
-
-#ifdef USE_DEV_ZERO
-	if (dev_zero == -1) {
-		dev_zero = open("/dev/zero", O_RDONLY);
-		if (dev_zero < 0) {
-			runtime_printf("open /dev/zero: errno=%d\n", errno);
-			exit(2);
-		}
-	}
-	fd = dev_zero;
-#endif
-
-	// On 64-bit, people with ulimit -v set complain if we reserve too
-	// much address space.  Instead, assume that the reservation is okay
-	// if we can reserve at least 64K and check the assumption in SysMap.
-	// Only user-mode Linux (UML) rejects these requests.
-	if(sizeof(void*) == 8 && (n >> 16) > 1LLU<<16) {
-		p = mmap_fixed(v, 64<<10, PROT_NONE, MAP_ANON|MAP_PRIVATE, fd, 0);
-		if (p != v) {
-			runtime_munmap(p, 64<<10);
-			return nil;
-		}
-		runtime_munmap(p, 64<<10);
-		*reserved = false;
-		return v;
-	}
-	
-	// Use the MAP_NORESERVE mmap() flag here because typically most of
-	// this reservation will never be used. It does not make sense
-	// reserve a huge amount of unneeded swap space. This is important on
-	// systems which do not overcommit memory by default.
-	p = runtime_mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_NORESERVE, fd, 0);
-	if(p == MAP_FAILED)
-		return nil;
-	*reserved = true;
-	return p;
-}
-
-void
-runtime_SysMap(void *v, uintptr n, bool reserved, uint64 *stat)
-{
-	void *p;
-	int fd = -1;
-	
-	runtime_xadd64(stat, n);
-
-#ifdef USE_DEV_ZERO
-	if (dev_zero == -1) {
-		dev_zero = open("/dev/zero", O_RDONLY);
-		if (dev_zero < 0) {
-			runtime_printf("open /dev/zero: errno=%d\n", errno);
-			exit(2);
-		}
-	}
-	fd = dev_zero;
-#endif
-
-	// On 64-bit, we don't actually have v reserved, so tread carefully.
-	if(!reserved) {
-		p = mmap_fixed(v, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, fd, 0);
-		if(p == MAP_FAILED && errno == ENOMEM)
-			runtime_throw("runtime: out of memory");
-		if(p != v) {
-			runtime_printf("runtime: address space conflict: map(%p) = %p\n", v, p);
-			runtime_throw("runtime: address space conflict");
-		}
-		return;
-	}
-
-	p = runtime_mmap(v, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_FIXED|MAP_PRIVATE, fd, 0);
-	if(p == MAP_FAILED && errno == ENOMEM)
-		runtime_throw("runtime: out of memory");
-	if(p != v)
-		runtime_throw("runtime: cannot map pages in arena address space");
-}
diff --git a/third_party/gofrontend/libgo/runtime/mem_posix_memalign.c b/third_party/gofrontend/libgo/runtime/mem_posix_memalign.c
deleted file mode 100644
index 8acdf07..0000000
--- a/third_party/gofrontend/libgo/runtime/mem_posix_memalign.c
+++ /dev/null
@@ -1,48 +0,0 @@
-#include <errno.h>
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-void*
-runtime_SysAlloc(uintptr n)
-{
-	void *p;
-
-	mstats.sys += n;
-	errno = posix_memalign(&p, PageSize, n);
-	if (errno > 0) {
-		perror("posix_memalign");
-		exit(2);
-	}
-	return p;
-}
-
-void
-runtime_SysUnused(void *v, uintptr n)
-{
-	USED(v);
-	USED(n);
-	// TODO(rsc): call madvise MADV_DONTNEED
-}
-
-void
-runtime_SysFree(void *v, uintptr n)
-{
-	mstats.sys -= n;
-	free(v);
-}
-
-void*
-runtime_SysReserve(void *v, uintptr n)
-{
-	USED(v);
-	return runtime_SysAlloc(n);
-}
-
-void
-runtime_SysMap(void *v, uintptr n)
-{
-	USED(v);
-	USED(n);
-}
diff --git a/third_party/gofrontend/libgo/runtime/mfixalloc.c b/third_party/gofrontend/libgo/runtime/mfixalloc.c
deleted file mode 100644
index 9d0b3bb..0000000
--- a/third_party/gofrontend/libgo/runtime/mfixalloc.c
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Fixed-size object allocator.  Returned memory is not zeroed.
-//
-// See malloc.h for overview.
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-// Initialize f to allocate objects of the given size,
-// using the allocator to obtain chunks of memory.
-void
-runtime_FixAlloc_Init(FixAlloc *f, uintptr size, void (*first)(void*, byte*), void *arg, uint64 *stat)
-{
-	f->size = size;
-	f->first = first;
-	f->arg = arg;
-	f->list = nil;
-	f->chunk = nil;
-	f->nchunk = 0;
-	f->inuse = 0;
-	f->stat = stat;
-}
-
-void*
-runtime_FixAlloc_Alloc(FixAlloc *f)
-{
-	void *v;
-	
-	if(f->size == 0) {
-		runtime_printf("runtime: use of FixAlloc_Alloc before FixAlloc_Init\n");
-		runtime_throw("runtime: internal error");
-	}
-
-	if(f->list) {
-		v = f->list;
-		f->list = *(void**)f->list;
-		f->inuse += f->size;
-		return v;
-	}
-	if(f->nchunk < f->size) {
-		f->chunk = runtime_persistentalloc(FixAllocChunk, 0, f->stat);
-		f->nchunk = FixAllocChunk;
-	}
-	v = f->chunk;
-	if(f->first)
-		f->first(f->arg, v);
-	f->chunk += f->size;
-	f->nchunk -= f->size;
-	f->inuse += f->size;
-	return v;
-}
-
-void
-runtime_FixAlloc_Free(FixAlloc *f, void *p)
-{
-	f->inuse -= f->size;
-	*(void**)p = f->list;
-	f->list = p;
-}
-
diff --git a/third_party/gofrontend/libgo/runtime/mgc0.c b/third_party/gofrontend/libgo/runtime/mgc0.c
deleted file mode 100644
index 73fe2ba..0000000
--- a/third_party/gofrontend/libgo/runtime/mgc0.c
+++ /dev/null
@@ -1,2791 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Garbage collector (GC).
-//
-// GC is:
-// - mark&sweep
-// - mostly precise (with the exception of some C-allocated objects, assembly frames/arguments, etc)
-// - parallel (up to MaxGcproc threads)
-// - partially concurrent (mark is stop-the-world, while sweep is concurrent)
-// - non-moving/non-compacting
-// - full (non-partial)
-//
-// GC rate.
-// Next GC is after we've allocated an extra amount of memory proportional to
-// the amount already in use. The proportion is controlled by GOGC environment variable
-// (100 by default). If GOGC=100 and we're using 4M, we'll GC again when we get to 8M
-// (this mark is tracked in next_gc variable). This keeps the GC cost in linear
-// proportion to the allocation cost. Adjusting GOGC just changes the linear constant
-// (and also the amount of extra memory used).
-//
-// Concurrent sweep.
-// The sweep phase proceeds concurrently with normal program execution.
-// The heap is swept span-by-span both lazily (when a goroutine needs another span)
-// and concurrently in a background goroutine (this helps programs that are not CPU bound).
-// However, at the end of the stop-the-world GC phase we don't know the size of the live heap,
-// and so next_gc calculation is tricky and happens as follows.
-// At the end of the stop-the-world phase next_gc is conservatively set based on total
-// heap size; all spans are marked as "needs sweeping".
-// Whenever a span is swept, next_gc is decremented by GOGC*newly_freed_memory.
-// The background sweeper goroutine simply sweeps spans one-by-one bringing next_gc
-// closer to the target value. However, this is not enough to avoid over-allocating memory.
-// Consider that a goroutine wants to allocate a new span for a large object and
-// there are no free swept spans, but there are small-object unswept spans.
-// If the goroutine naively allocates a new span, it can surpass the yet-unknown
-// target next_gc value. In order to prevent such cases (1) when a goroutine needs
-// to allocate a new small-object span, it sweeps small-object spans for the same
-// object size until it frees at least one object; (2) when a goroutine needs to
-// allocate large-object span from heap, it sweeps spans until it frees at least
-// that many pages into heap. Together these two measures ensure that we don't surpass
-// target next_gc value by a large margin. There is an exception: if a goroutine sweeps
-// and frees two nonadjacent one-page spans to the heap, it will allocate a new two-page span,
-// but there can still be other one-page unswept spans which could be combined into a two-page span.
-// It's critical to ensure that no operations proceed on unswept spans (that would corrupt
-// mark bits in GC bitmap). During GC all mcaches are flushed into the central cache,
-// so they are empty. When a goroutine grabs a new span into mcache, it sweeps it.
-// When a goroutine explicitly frees an object or sets a finalizer, it ensures that
-// the span is swept (either by sweeping it, or by waiting for the concurrent sweep to finish).
-// The finalizer goroutine is kicked off only when all spans are swept.
-// When the next GC starts, it sweeps all not-yet-swept spans (if any).
-
-#include <unistd.h>
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-#include "mgc0.h"
-#include "chan.h"
-#include "go-type.h"
-
-// Map gccgo field names to gc field names.
-// Slice aka __go_open_array.
-#define array __values
-#define cap __capacity
-// Iface aka __go_interface
-#define tab __methods
-// Hmap aka __go_map
-typedef struct __go_map Hmap;
-// Type aka __go_type_descriptor
-#define string __reflection
-#define KindPtr GO_PTR
-#define KindNoPointers GO_NO_POINTERS
-#define kindMask GO_CODE_MASK
-// PtrType aka __go_ptr_type
-#define elem __element_type
-
-#ifdef USING_SPLIT_STACK
-
-extern void * __splitstack_find (void *, void *, size_t *, void **, void **,
-				 void **);
-
-extern void * __splitstack_find_context (void *context[10], size_t *, void **,
-					 void **, void **);
-
-#endif
-
-enum {
-	Debug = 0,
-	CollectStats = 0,
-	ConcurrentSweep = 1,
-
-	WorkbufSize	= 16*1024,
-	FinBlockSize	= 4*1024,
-
-	handoffThreshold = 4,
-	IntermediateBufferCapacity = 64,
-
-	// Bits in type information
-	PRECISE = 1,
-	LOOP = 2,
-	PC_BITS = PRECISE | LOOP,
-
-	RootData	= 0,
-	RootBss		= 1,
-	RootFinalizers	= 2,
-	RootSpanTypes	= 3,
-	RootFlushCaches = 4,
-	RootCount	= 5,
-};
-
-#define GcpercentUnknown (-2)
-
-// Initialized from $GOGC.  GOGC=off means no gc.
-static int32 gcpercent = GcpercentUnknown;
-
-static FuncVal* poolcleanup;
-
-void sync_runtime_registerPoolCleanup(FuncVal*)
-  __asm__ (GOSYM_PREFIX "sync.runtime_registerPoolCleanup");
-
-void
-sync_runtime_registerPoolCleanup(FuncVal *f)
-{
-	poolcleanup = f;
-}
-
-static void
-clearpools(void)
-{
-	P *p, **pp;
-	MCache *c;
-
-	// clear sync.Pool's
-	if(poolcleanup != nil) {
-		__builtin_call_with_static_chain(poolcleanup->fn(),
-						 poolcleanup);
-	}
-
-	for(pp=runtime_allp; (p=*pp) != nil; pp++) {
-		// clear tinyalloc pool
-		c = p->mcache;
-		if(c != nil) {
-			c->tiny = nil;
-			c->tinysize = 0;
-		}
-		// clear defer pools
-		p->deferpool = nil;
-	}
-}
-
-// Holding worldsema grants an M the right to try to stop the world.
-// The procedure is:
-//
-//	runtime_semacquire(&runtime_worldsema);
-//	m->gcing = 1;
-//	runtime_stoptheworld();
-//
-//	... do stuff ...
-//
-//	m->gcing = 0;
-//	runtime_semrelease(&runtime_worldsema);
-//	runtime_starttheworld();
-//
-uint32 runtime_worldsema = 1;
-
-typedef struct Workbuf Workbuf;
-struct Workbuf
-{
-#define SIZE (WorkbufSize-sizeof(LFNode)-sizeof(uintptr))
-	LFNode  node; // must be first
-	uintptr nobj;
-	Obj     obj[SIZE/sizeof(Obj) - 1];
-	uint8   _padding[SIZE%sizeof(Obj) + sizeof(Obj)];
-#undef SIZE
-};
-
-typedef struct Finalizer Finalizer;
-struct Finalizer
-{
-	FuncVal *fn;
-	void *arg;
-	const struct __go_func_type *ft;
-	const PtrType *ot;
-};
-
-typedef struct FinBlock FinBlock;
-struct FinBlock
-{
-	FinBlock *alllink;
-	FinBlock *next;
-	int32 cnt;
-	int32 cap;
-	Finalizer fin[1];
-};
-
-static Lock	finlock;	// protects the following variables
-static FinBlock	*finq;		// list of finalizers that are to be executed
-static FinBlock	*finc;		// cache of free blocks
-static FinBlock	*allfin;	// list of all blocks
-bool	runtime_fingwait;
-bool	runtime_fingwake;
-
-static Lock	gclock;
-static G*	fing;
-
-static void	runfinq(void*);
-static void	bgsweep(void*);
-static Workbuf* getempty(Workbuf*);
-static Workbuf* getfull(Workbuf*);
-static void	putempty(Workbuf*);
-static Workbuf* handoff(Workbuf*);
-static void	gchelperstart(void);
-static void	flushallmcaches(void);
-static void	addstackroots(G *gp, Workbuf **wbufp);
-
-static struct {
-	uint64	full;  // lock-free list of full blocks
-	uint64	empty; // lock-free list of empty blocks
-	byte	pad0[CacheLineSize]; // prevents false-sharing between full/empty and nproc/nwait
-	uint32	nproc;
-	int64	tstart;
-	volatile uint32	nwait;
-	volatile uint32	ndone;
-	Note	alldone;
-	ParFor	*markfor;
-
-	Lock	lock;
-	byte	*chunk;
-	uintptr	nchunk;
-} work __attribute__((aligned(8)));
-
-enum {
-	GC_DEFAULT_PTR = GC_NUM_INSTR,
-	GC_CHAN,
-
-	GC_NUM_INSTR2
-};
-
-static struct {
-	struct {
-		uint64 sum;
-		uint64 cnt;
-	} ptr;
-	uint64 nbytes;
-	struct {
-		uint64 sum;
-		uint64 cnt;
-		uint64 notype;
-		uint64 typelookup;
-	} obj;
-	uint64 rescan;
-	uint64 rescanbytes;
-	uint64 instr[GC_NUM_INSTR2];
-	uint64 putempty;
-	uint64 getfull;
-	struct {
-		uint64 foundbit;
-		uint64 foundword;
-		uint64 foundspan;
-	} flushptrbuf;
-	struct {
-		uint64 foundbit;
-		uint64 foundword;
-		uint64 foundspan;
-	} markonly;
-	uint32 nbgsweep;
-	uint32 npausesweep;
-} gcstats;
-
-// markonly marks an object. It returns true if the object
-// has been marked by this function, false otherwise.
-// This function doesn't append the object to any buffer.
-static bool
-markonly(const void *obj)
-{
-	byte *p;
-	uintptr *bitp, bits, shift, x, xbits, off, j;
-	MSpan *s;
-	PageID k;
-
-	// Words outside the arena cannot be pointers.
-	if((const byte*)obj < runtime_mheap.arena_start || (const byte*)obj >= runtime_mheap.arena_used)
-		return false;
-
-	// obj may be a pointer to a live object.
-	// Try to find the beginning of the object.
-
-	// Round down to word boundary.
-	obj = (const void*)((uintptr)obj & ~((uintptr)PtrSize-1));
-
-	// Find bits for this word.
-	off = (const uintptr*)obj - (uintptr*)runtime_mheap.arena_start;
-	bitp = (uintptr*)runtime_mheap.arena_start - off/wordsPerBitmapWord - 1;
-	shift = off % wordsPerBitmapWord;
-	xbits = *bitp;
-	bits = xbits >> shift;
-
-	// Pointing at the beginning of a block?
-	if((bits & (bitAllocated|bitBlockBoundary)) != 0) {
-		if(CollectStats)
-			runtime_xadd64(&gcstats.markonly.foundbit, 1);
-		goto found;
-	}
-
-	// Pointing just past the beginning?
-	// Scan backward a little to find a block boundary.
-	for(j=shift; j-->0; ) {
-		if(((xbits>>j) & (bitAllocated|bitBlockBoundary)) != 0) {
-			shift = j;
-			bits = xbits>>shift;
-			if(CollectStats)
-				runtime_xadd64(&gcstats.markonly.foundword, 1);
-			goto found;
-		}
-	}
-
-	// Otherwise consult span table to find beginning.
-	// (Manually inlined copy of MHeap_LookupMaybe.)
-	k = (uintptr)obj>>PageShift;
-	x = k;
-	x -= (uintptr)runtime_mheap.arena_start>>PageShift;
-	s = runtime_mheap.spans[x];
-	if(s == nil || k < s->start || (const byte*)obj >= s->limit || s->state != MSpanInUse)
-		return false;
-	p = (byte*)((uintptr)s->start<<PageShift);
-	if(s->sizeclass == 0) {
-		obj = p;
-	} else {
-		uintptr size = s->elemsize;
-		int32 i = ((const byte*)obj - p)/size;
-		obj = p+i*size;
-	}
-
-	// Now that we know the object header, reload bits.
-	off = (const uintptr*)obj - (uintptr*)runtime_mheap.arena_start;
-	bitp = (uintptr*)runtime_mheap.arena_start - off/wordsPerBitmapWord - 1;
-	shift = off % wordsPerBitmapWord;
-	xbits = *bitp;
-	bits = xbits >> shift;
-	if(CollectStats)
-		runtime_xadd64(&gcstats.markonly.foundspan, 1);
-
-found:
-	// Now we have bits, bitp, and shift correct for
-	// obj pointing at the base of the object.
-	// Only care about allocated and not marked.
-	if((bits & (bitAllocated|bitMarked)) != bitAllocated)
-		return false;
-	if(work.nproc == 1)
-		*bitp |= bitMarked<<shift;
-	else {
-		for(;;) {
-			x = *bitp;
-			if(x & (bitMarked<<shift))
-				return false;
-			if(runtime_casp((void**)bitp, (void*)x, (void*)(x|(bitMarked<<shift))))
-				break;
-		}
-	}
-
-	// The object is now marked
-	return true;
-}
-
-// PtrTarget is a structure used by intermediate buffers.
-// The intermediate buffers hold GC data before it
-// is moved/flushed to the work buffer (Workbuf).
-// The size of an intermediate buffer is very small,
-// such as 32 or 64 elements.
-typedef struct PtrTarget PtrTarget;
-struct PtrTarget
-{
-	void *p;
-	uintptr ti;
-};
-
-typedef	struct Scanbuf Scanbuf;
-struct	Scanbuf
-{
-	struct {
-		PtrTarget *begin;
-		PtrTarget *end;
-		PtrTarget *pos;
-	} ptr;
-	struct {
-		Obj *begin;
-		Obj *end;
-		Obj *pos;
-	} obj;
-	Workbuf *wbuf;
-	Obj *wp;
-	uintptr nobj;
-};
-
-typedef struct BufferList BufferList;
-struct BufferList
-{
-	PtrTarget ptrtarget[IntermediateBufferCapacity];
-	Obj obj[IntermediateBufferCapacity];
-	uint32 busy;
-	byte pad[CacheLineSize];
-};
-static BufferList bufferList[MaxGcproc];
-
-static void enqueue(Obj obj, Workbuf **_wbuf, Obj **_wp, uintptr *_nobj);
-
-// flushptrbuf moves data from the PtrTarget buffer to the work buffer.
-// The PtrTarget buffer contains blocks irrespective of whether the blocks have been marked or scanned,
-// while the work buffer contains blocks which have been marked
-// and are prepared to be scanned by the garbage collector.
-//
-// _wp, _wbuf, _nobj are input/output parameters and are specifying the work buffer.
-//
-// A simplified drawing explaining how the todo-list moves from a structure to another:
-//
-//     scanblock
-//  (find pointers)
-//    Obj ------> PtrTarget (pointer targets)
-//     ↑          |
-//     |          |
-//     `----------'
-//     flushptrbuf
-//  (find block start, mark and enqueue)
-static void
-flushptrbuf(Scanbuf *sbuf)
-{
-	byte *p, *arena_start, *obj;
-	uintptr size, *bitp, bits, shift, j, x, xbits, off, nobj, ti, n;
-	MSpan *s;
-	PageID k;
-	Obj *wp;
-	Workbuf *wbuf;
-	PtrTarget *ptrbuf;
-	PtrTarget *ptrbuf_end;
-
-	arena_start = runtime_mheap.arena_start;
-
-	wp = sbuf->wp;
-	wbuf = sbuf->wbuf;
-	nobj = sbuf->nobj;
-
-	ptrbuf = sbuf->ptr.begin;
-	ptrbuf_end = sbuf->ptr.pos;
-	n = ptrbuf_end - sbuf->ptr.begin;
-	sbuf->ptr.pos = sbuf->ptr.begin;
-
-	if(CollectStats) {
-		runtime_xadd64(&gcstats.ptr.sum, n);
-		runtime_xadd64(&gcstats.ptr.cnt, 1);
-	}
-
-	// If buffer is nearly full, get a new one.
-	if(wbuf == nil || nobj+n >= nelem(wbuf->obj)) {
-		if(wbuf != nil)
-			wbuf->nobj = nobj;
-		wbuf = getempty(wbuf);
-		wp = wbuf->obj;
-		nobj = 0;
-
-		if(n >= nelem(wbuf->obj))
-			runtime_throw("ptrbuf has to be smaller than WorkBuf");
-	}
-
-	while(ptrbuf < ptrbuf_end) {
-		obj = ptrbuf->p;
-		ti = ptrbuf->ti;
-		ptrbuf++;
-
-		// obj belongs to interval [mheap.arena_start, mheap.arena_used).
-		if(Debug > 1) {
-			if(obj < runtime_mheap.arena_start || obj >= runtime_mheap.arena_used)
-				runtime_throw("object is outside of mheap");
-		}
-
-		// obj may be a pointer to a live object.
-		// Try to find the beginning of the object.
-
-		// Round down to word boundary.
-		if(((uintptr)obj & ((uintptr)PtrSize-1)) != 0) {
-			obj = (void*)((uintptr)obj & ~((uintptr)PtrSize-1));
-			ti = 0;
-		}
-
-		// Find bits for this word.
-		off = (uintptr*)obj - (uintptr*)arena_start;
-		bitp = (uintptr*)arena_start - off/wordsPerBitmapWord - 1;
-		shift = off % wordsPerBitmapWord;
-		xbits = *bitp;
-		bits = xbits >> shift;
-
-		// Pointing at the beginning of a block?
-		if((bits & (bitAllocated|bitBlockBoundary)) != 0) {
-			if(CollectStats)
-				runtime_xadd64(&gcstats.flushptrbuf.foundbit, 1);
-			goto found;
-		}
-
-		ti = 0;
-
-		// Pointing just past the beginning?
-		// Scan backward a little to find a block boundary.
-		for(j=shift; j-->0; ) {
-			if(((xbits>>j) & (bitAllocated|bitBlockBoundary)) != 0) {
-				obj = (byte*)obj - (shift-j)*PtrSize;
-				shift = j;
-				bits = xbits>>shift;
-				if(CollectStats)
-					runtime_xadd64(&gcstats.flushptrbuf.foundword, 1);
-				goto found;
-			}
-		}
-
-		// Otherwise consult span table to find beginning.
-		// (Manually inlined copy of MHeap_LookupMaybe.)
-		k = (uintptr)obj>>PageShift;
-		x = k;
-		x -= (uintptr)arena_start>>PageShift;
-		s = runtime_mheap.spans[x];
-		if(s == nil || k < s->start || obj >= s->limit || s->state != MSpanInUse)
-			continue;
-		p = (byte*)((uintptr)s->start<<PageShift);
-		if(s->sizeclass == 0) {
-			obj = p;
-		} else {
-			size = s->elemsize;
-			int32 i = ((byte*)obj - p)/size;
-			obj = p+i*size;
-		}
-
-		// Now that we know the object header, reload bits.
-		off = (uintptr*)obj - (uintptr*)arena_start;
-		bitp = (uintptr*)arena_start - off/wordsPerBitmapWord - 1;
-		shift = off % wordsPerBitmapWord;
-		xbits = *bitp;
-		bits = xbits >> shift;
-		if(CollectStats)
-			runtime_xadd64(&gcstats.flushptrbuf.foundspan, 1);
-
-	found:
-		// Now we have bits, bitp, and shift correct for
-		// obj pointing at the base of the object.
-		// Only care about allocated and not marked.
-		if((bits & (bitAllocated|bitMarked)) != bitAllocated)
-			continue;
-		if(work.nproc == 1)
-			*bitp |= bitMarked<<shift;
-		else {
-			for(;;) {
-				x = *bitp;
-				if(x & (bitMarked<<shift))
-					goto continue_obj;
-				if(runtime_casp((void**)bitp, (void*)x, (void*)(x|(bitMarked<<shift))))
-					break;
-			}
-		}
-
-		// If object has no pointers, don't need to scan further.
-		if((bits & bitScan) == 0)
-			continue;
-
-		// Ask span about size class.
-		// (Manually inlined copy of MHeap_Lookup.)
-		x = (uintptr)obj >> PageShift;
-		x -= (uintptr)arena_start>>PageShift;
-		s = runtime_mheap.spans[x];
-
-		PREFETCH(obj);
-
-		*wp = (Obj){obj, s->elemsize, ti};
-		wp++;
-		nobj++;
-	continue_obj:;
-	}
-
-	// If another proc wants a pointer, give it some.
-	if(work.nwait > 0 && nobj > handoffThreshold && work.full == 0) {
-		wbuf->nobj = nobj;
-		wbuf = handoff(wbuf);
-		nobj = wbuf->nobj;
-		wp = wbuf->obj + nobj;
-	}
-
-	sbuf->wp = wp;
-	sbuf->wbuf = wbuf;
-	sbuf->nobj = nobj;
-}
-
-static void
-flushobjbuf(Scanbuf *sbuf)
-{
-	uintptr nobj, off;
-	Obj *wp, obj;
-	Workbuf *wbuf;
-	Obj *objbuf;
-	Obj *objbuf_end;
-
-	wp = sbuf->wp;
-	wbuf = sbuf->wbuf;
-	nobj = sbuf->nobj;
-
-	objbuf = sbuf->obj.begin;
-	objbuf_end = sbuf->obj.pos;
-	sbuf->obj.pos = sbuf->obj.begin;
-
-	while(objbuf < objbuf_end) {
-		obj = *objbuf++;
-
-		// Align obj.b to a word boundary.
-		off = (uintptr)obj.p & (PtrSize-1);
-		if(off != 0) {
-			obj.p += PtrSize - off;
-			obj.n -= PtrSize - off;
-			obj.ti = 0;
-		}
-
-		if(obj.p == nil || obj.n == 0)
-			continue;
-
-		// If buffer is full, get a new one.
-		if(wbuf == nil || nobj >= nelem(wbuf->obj)) {
-			if(wbuf != nil)
-				wbuf->nobj = nobj;
-			wbuf = getempty(wbuf);
-			wp = wbuf->obj;
-			nobj = 0;
-		}
-
-		*wp = obj;
-		wp++;
-		nobj++;
-	}
-
-	// If another proc wants a pointer, give it some.
-	if(work.nwait > 0 && nobj > handoffThreshold && work.full == 0) {
-		wbuf->nobj = nobj;
-		wbuf = handoff(wbuf);
-		nobj = wbuf->nobj;
-		wp = wbuf->obj + nobj;
-	}
-
-	sbuf->wp = wp;
-	sbuf->wbuf = wbuf;
-	sbuf->nobj = nobj;
-}
-
-// Program that scans the whole block and treats every block element as a potential pointer
-static uintptr defaultProg[2] = {PtrSize, GC_DEFAULT_PTR};
-
-// Hchan program
-static uintptr chanProg[2] = {0, GC_CHAN};
-
-// Local variables of a program fragment or loop
-typedef struct Frame Frame;
-struct Frame {
-	uintptr count, elemsize, b;
-	const uintptr *loop_or_ret;
-};
-
-// Sanity check for the derived type info objti.
-static void
-checkptr(void *obj, uintptr objti)
-{
-	uintptr *pc1, type, tisize, i, j, x;
-	const uintptr *pc2;
-	byte *objstart;
-	Type *t;
-	MSpan *s;
-
-	if(!Debug)
-		runtime_throw("checkptr is debug only");
-
-	if((byte*)obj < runtime_mheap.arena_start || (byte*)obj >= runtime_mheap.arena_used)
-		return;
-	type = runtime_gettype(obj);
-	t = (Type*)(type & ~(uintptr)(PtrSize-1));
-	if(t == nil)
-		return;
-	x = (uintptr)obj >> PageShift;
-	x -= (uintptr)(runtime_mheap.arena_start)>>PageShift;
-	s = runtime_mheap.spans[x];
-	objstart = (byte*)((uintptr)s->start<<PageShift);
-	if(s->sizeclass != 0) {
-		i = ((byte*)obj - objstart)/s->elemsize;
-		objstart += i*s->elemsize;
-	}
-	tisize = *(uintptr*)objti;
-	// Sanity check for object size: it should fit into the memory block.
-	if((byte*)obj + tisize > objstart + s->elemsize) {
-		runtime_printf("object of type '%S' at %p/%p does not fit in block %p/%p\n",
-			       *t->string, obj, tisize, objstart, s->elemsize);
-		runtime_throw("invalid gc type info");
-	}
-	if(obj != objstart)
-		return;
-	// If obj points to the beginning of the memory block,
-	// check type info as well.
-	if(t->string == nil ||
-		// Gob allocates unsafe pointers for indirection.
-		(runtime_strcmp((const char *)t->string->str, (const char*)"unsafe.Pointer") &&
-		// Runtime and gc think differently about closures.
-		 runtime_strstr((const char *)t->string->str, (const char*)"struct { F uintptr") != (const char *)t->string->str)) {
-		pc1 = (uintptr*)objti;
-		pc2 = (const uintptr*)t->__gc;
-		// A simple best-effort check until first GC_END.
-		for(j = 1; pc1[j] != GC_END && pc2[j] != GC_END; j++) {
-			if(pc1[j] != pc2[j]) {
-				runtime_printf("invalid gc type info for '%s', type info %p [%d]=%p, block info %p [%d]=%p\n",
-					       t->string ? (const int8*)t->string->str : (const int8*)"?", pc1, (int32)j, pc1[j], pc2, (int32)j, pc2[j]);
-				runtime_throw("invalid gc type info");
-			}
-		}
-	}
-}					
-
-// scanblock scans a block of n bytes starting at pointer b for references
-// to other objects, scanning any it finds recursively until there are no
-// unscanned objects left.  Instead of using an explicit recursion, it keeps
-// a work list in the Workbuf* structures and loops in the main function
-// body.  Keeping an explicit work list is easier on the stack allocator and
-// more efficient.
-static void
-scanblock(Workbuf *wbuf, bool keepworking)
-{
-	byte *b, *arena_start, *arena_used;
-	uintptr n, i, end_b, elemsize, size, ti, objti, count, type, nobj;
-	uintptr precise_type, nominal_size;
-	const uintptr *pc, *chan_ret;
-	uintptr chancap;
-	void *obj;
-	const Type *t, *et;
-	Slice *sliceptr;
-	String *stringptr;
-	Frame *stack_ptr, stack_top, stack[GC_STACK_CAPACITY+4];
-	BufferList *scanbuffers;
-	Scanbuf sbuf;
-	Eface *eface;
-	Iface *iface;
-	Hchan *chan;
-	const ChanType *chantype;
-	Obj *wp;
-
-	if(sizeof(Workbuf) % WorkbufSize != 0)
-		runtime_throw("scanblock: size of Workbuf is suboptimal");
-
-	// Memory arena parameters.
-	arena_start = runtime_mheap.arena_start;
-	arena_used = runtime_mheap.arena_used;
-
-	stack_ptr = stack+nelem(stack)-1;
-
-	precise_type = false;
-	nominal_size = 0;
-
-	if(wbuf) {
-		nobj = wbuf->nobj;
-		wp = &wbuf->obj[nobj];
-	} else {
-		nobj = 0;
-		wp = nil;
-	}
-
-	// Initialize sbuf
-	scanbuffers = &bufferList[runtime_m()->helpgc];
-
-	sbuf.ptr.begin = sbuf.ptr.pos = &scanbuffers->ptrtarget[0];
-	sbuf.ptr.end = sbuf.ptr.begin + nelem(scanbuffers->ptrtarget);
-
-	sbuf.obj.begin = sbuf.obj.pos = &scanbuffers->obj[0];
-	sbuf.obj.end = sbuf.obj.begin + nelem(scanbuffers->obj);
-
-	sbuf.wbuf = wbuf;
-	sbuf.wp = wp;
-	sbuf.nobj = nobj;
-
-	// (Silence the compiler)
-	chan = nil;
-	chantype = nil;
-	chan_ret = nil;
-
-	goto next_block;
-
-	for(;;) {
-		// Each iteration scans the block b of length n, queueing pointers in
-		// the work buffer.
-
-		if(CollectStats) {
-			runtime_xadd64(&gcstats.nbytes, n);
-			runtime_xadd64(&gcstats.obj.sum, sbuf.nobj);
-			runtime_xadd64(&gcstats.obj.cnt, 1);
-		}
-
-		if(ti != 0) {
-			if(Debug > 1) {
-				runtime_printf("scanblock %p %D ti %p\n", b, (int64)n, ti);
-			}
-			pc = (uintptr*)(ti & ~(uintptr)PC_BITS);
-			precise_type = (ti & PRECISE);
-			stack_top.elemsize = pc[0];
-			if(!precise_type)
-				nominal_size = pc[0];
-			if(ti & LOOP) {
-				stack_top.count = 0;	// 0 means an infinite number of iterations
-				stack_top.loop_or_ret = pc+1;
-			} else {
-				stack_top.count = 1;
-			}
-			if(Debug) {
-				// Simple sanity check for provided type info ti:
-				// The declared size of the object must be not larger than the actual size
-				// (it can be smaller due to inferior pointers).
-				// It's difficult to make a comprehensive check due to inferior pointers,
-				// reflection, gob, etc.
-				if(pc[0] > n) {
-					runtime_printf("invalid gc type info: type info size %p, block size %p\n", pc[0], n);
-					runtime_throw("invalid gc type info");
-				}
-			}
-		} else if(UseSpanType) {
-			if(CollectStats)
-				runtime_xadd64(&gcstats.obj.notype, 1);
-
-			type = runtime_gettype(b);
-			if(type != 0) {
-				if(CollectStats)
-					runtime_xadd64(&gcstats.obj.typelookup, 1);
-
-				t = (Type*)(type & ~(uintptr)(PtrSize-1));
-				switch(type & (PtrSize-1)) {
-				case TypeInfo_SingleObject:
-					pc = (const uintptr*)t->__gc;
-					precise_type = true;  // type information about 'b' is precise
-					stack_top.count = 1;
-					stack_top.elemsize = pc[0];
-					break;
-				case TypeInfo_Array:
-					pc = (const uintptr*)t->__gc;
-					if(pc[0] == 0)
-						goto next_block;
-					precise_type = true;  // type information about 'b' is precise
-					stack_top.count = 0;  // 0 means an infinite number of iterations
-					stack_top.elemsize = pc[0];
-					stack_top.loop_or_ret = pc+1;
-					break;
-				case TypeInfo_Chan:
-					chan = (Hchan*)b;
-					chantype = (const ChanType*)t;
-					chan_ret = nil;
-					pc = chanProg;
-					break;
-				default:
-					if(Debug > 1)
-						runtime_printf("scanblock %p %D type %p %S\n", b, (int64)n, type, *t->string);
-					runtime_throw("scanblock: invalid type");
-					return;
-				}
-				if(Debug > 1)
-					runtime_printf("scanblock %p %D type %p %S pc=%p\n", b, (int64)n, type, *t->string, pc);
-			} else {
-				pc = defaultProg;
-				if(Debug > 1)
-					runtime_printf("scanblock %p %D unknown type\n", b, (int64)n);
-			}
-		} else {
-			pc = defaultProg;
-			if(Debug > 1)
-				runtime_printf("scanblock %p %D no span types\n", b, (int64)n);
-		}
-
-		if(IgnorePreciseGC)
-			pc = defaultProg;
-
-		pc++;
-		stack_top.b = (uintptr)b;
-		end_b = (uintptr)b + n - PtrSize;
-
-	for(;;) {
-		if(CollectStats)
-			runtime_xadd64(&gcstats.instr[pc[0]], 1);
-
-		obj = nil;
-		objti = 0;
-		switch(pc[0]) {
-		case GC_PTR:
-			obj = *(void**)(stack_top.b + pc[1]);
-			objti = pc[2];
-			if(Debug > 2)
-				runtime_printf("gc_ptr @%p: %p ti=%p\n", stack_top.b+pc[1], obj, objti);
-			pc += 3;
-			if(Debug)
-				checkptr(obj, objti);
-			break;
-
-		case GC_SLICE:
-			sliceptr = (Slice*)(stack_top.b + pc[1]);
-			if(Debug > 2)
-				runtime_printf("gc_slice @%p: %p/%D/%D\n", sliceptr, sliceptr->array, (int64)sliceptr->__count, (int64)sliceptr->cap);
-			if(sliceptr->cap != 0) {
-				obj = sliceptr->array;
-				// Can't use slice element type for scanning,
-				// because if it points to an array embedded
-				// in the beginning of a struct,
-				// we will scan the whole struct as the slice.
-				// So just obtain type info from heap.
-			}
-			pc += 3;
-			break;
-
-		case GC_APTR:
-			obj = *(void**)(stack_top.b + pc[1]);
-			if(Debug > 2)
-				runtime_printf("gc_aptr @%p: %p\n", stack_top.b+pc[1], obj);
-			pc += 2;
-			break;
-
-		case GC_STRING:
-			stringptr = (String*)(stack_top.b + pc[1]);
-			if(Debug > 2)
-				runtime_printf("gc_string @%p: %p/%D\n", stack_top.b+pc[1], stringptr->str, (int64)stringptr->len);
-			if(stringptr->len != 0)
-				markonly(stringptr->str);
-			pc += 2;
-			continue;
-
-		case GC_EFACE:
-			eface = (Eface*)(stack_top.b + pc[1]);
-			pc += 2;
-			if(Debug > 2)
-				runtime_printf("gc_eface @%p: %p %p\n", stack_top.b+pc[1], eface->__type_descriptor, eface->__object);
-			if(eface->__type_descriptor == nil)
-				continue;
-
-			// eface->type
-			t = eface->__type_descriptor;
-			if((const byte*)t >= arena_start && (const byte*)t < arena_used) {
-				union { const Type *tc; Type *tr; } u;
-				u.tc = t;
-				*sbuf.ptr.pos++ = (PtrTarget){u.tr, 0};
-				if(sbuf.ptr.pos == sbuf.ptr.end)
-					flushptrbuf(&sbuf);
-			}
-
-			// eface->__object
-			if((byte*)eface->__object >= arena_start && (byte*)eface->__object < arena_used) {
-				if(__go_is_pointer_type(t)) {
-					if((t->__code & KindNoPointers))
-						continue;
-
-					obj = eface->__object;
-					if((t->__code & kindMask) == KindPtr) {
-						// Only use type information if it is a pointer-containing type.
-						// This matches the GC programs written by cmd/gc/reflect.c's
-						// dgcsym1 in case TPTR32/case TPTR64. See rationale there.
-						et = ((const PtrType*)t)->elem;
-						if(!(et->__code & KindNoPointers))
-							objti = (uintptr)((const PtrType*)t)->elem->__gc;
-					}
-				} else {
-					obj = eface->__object;
-					objti = (uintptr)t->__gc;
-				}
-			}
-			break;
-
-		case GC_IFACE:
-			iface = (Iface*)(stack_top.b + pc[1]);
-			pc += 2;
-			if(Debug > 2)
-				runtime_printf("gc_iface @%p: %p/%p %p\n", stack_top.b+pc[1], iface->__methods[0], nil, iface->__object);
-			if(iface->tab == nil)
-				continue;
-			
-			// iface->tab
-			if((byte*)iface->tab >= arena_start && (byte*)iface->tab < arena_used) {
-				*sbuf.ptr.pos++ = (PtrTarget){iface->tab, 0};
-				if(sbuf.ptr.pos == sbuf.ptr.end)
-					flushptrbuf(&sbuf);
-			}
-
-			// iface->data
-			if((byte*)iface->__object >= arena_start && (byte*)iface->__object < arena_used) {
-				t = (const Type*)iface->tab[0];
-				if(__go_is_pointer_type(t)) {
-					if((t->__code & KindNoPointers))
-						continue;
-
-					obj = iface->__object;
-					if((t->__code & kindMask) == KindPtr) {
-						// Only use type information if it is a pointer-containing type.
-						// This matches the GC programs written by cmd/gc/reflect.c's
-						// dgcsym1 in case TPTR32/case TPTR64. See rationale there.
-						et = ((const PtrType*)t)->elem;
-						if(!(et->__code & KindNoPointers))
-							objti = (uintptr)((const PtrType*)t)->elem->__gc;
-					}
-				} else {
-					obj = iface->__object;
-					objti = (uintptr)t->__gc;
-				}
-			}
-			break;
-
-		case GC_DEFAULT_PTR:
-			while(stack_top.b <= end_b) {
-				obj = *(byte**)stack_top.b;
-				if(Debug > 2)
-					runtime_printf("gc_default_ptr @%p: %p\n", stack_top.b, obj);
-				stack_top.b += PtrSize;
-				if((byte*)obj >= arena_start && (byte*)obj < arena_used) {
-					*sbuf.ptr.pos++ = (PtrTarget){obj, 0};
-					if(sbuf.ptr.pos == sbuf.ptr.end)
-						flushptrbuf(&sbuf);
-				}
-			}
-			goto next_block;
-
-		case GC_END:
-			if(--stack_top.count != 0) {
-				// Next iteration of a loop if possible.
-				stack_top.b += stack_top.elemsize;
-				if(stack_top.b + stack_top.elemsize <= end_b+PtrSize) {
-					pc = stack_top.loop_or_ret;
-					continue;
-				}
-				i = stack_top.b;
-			} else {
-				// Stack pop if possible.
-				if(stack_ptr+1 < stack+nelem(stack)) {
-					pc = stack_top.loop_or_ret;
-					stack_top = *(++stack_ptr);
-					continue;
-				}
-				i = (uintptr)b + nominal_size;
-			}
-			if(!precise_type) {
-				// Quickly scan [b+i,b+n) for possible pointers.
-				for(; i<=end_b; i+=PtrSize) {
-					if(*(byte**)i != nil) {
-						// Found a value that may be a pointer.
-						// Do a rescan of the entire block.
-						enqueue((Obj){b, n, 0}, &sbuf.wbuf, &sbuf.wp, &sbuf.nobj);
-						if(CollectStats) {
-							runtime_xadd64(&gcstats.rescan, 1);
-							runtime_xadd64(&gcstats.rescanbytes, n);
-						}
-						break;
-					}
-				}
-			}
-			goto next_block;
-
-		case GC_ARRAY_START:
-			i = stack_top.b + pc[1];
-			count = pc[2];
-			elemsize = pc[3];
-			pc += 4;
-
-			// Stack push.
-			*stack_ptr-- = stack_top;
-			stack_top = (Frame){count, elemsize, i, pc};
-			continue;
-
-		case GC_ARRAY_NEXT:
-			if(--stack_top.count != 0) {
-				stack_top.b += stack_top.elemsize;
-				pc = stack_top.loop_or_ret;
-			} else {
-				// Stack pop.
-				stack_top = *(++stack_ptr);
-				pc += 1;
-			}
-			continue;
-
-		case GC_CALL:
-			// Stack push.
-			*stack_ptr-- = stack_top;
-			stack_top = (Frame){1, 0, stack_top.b + pc[1], pc+3 /*return address*/};
-			pc = (const uintptr*)((const byte*)pc + *(const int32*)(pc+2));  // target of the CALL instruction
-			continue;
-
-		case GC_REGION:
-			obj = (void*)(stack_top.b + pc[1]);
-			size = pc[2];
-			objti = pc[3];
-			pc += 4;
-
-			if(Debug > 2)
-				runtime_printf("gc_region @%p: %D %p\n", stack_top.b+pc[1], (int64)size, objti);
-			*sbuf.obj.pos++ = (Obj){obj, size, objti};
-			if(sbuf.obj.pos == sbuf.obj.end)
-				flushobjbuf(&sbuf);
-			continue;
-
-		case GC_CHAN_PTR:
-			chan = *(Hchan**)(stack_top.b + pc[1]);
-			if(Debug > 2 && chan != nil)
-				runtime_printf("gc_chan_ptr @%p: %p/%D/%D %p\n", stack_top.b+pc[1], chan, (int64)chan->qcount, (int64)chan->dataqsiz, pc[2]);
-			if(chan == nil) {
-				pc += 3;
-				continue;
-			}
-			if(markonly(chan)) {
-				chantype = (ChanType*)pc[2];
-				if(!(chantype->elem->__code & KindNoPointers)) {
-					// Start chanProg.
-					chan_ret = pc+3;
-					pc = chanProg+1;
-					continue;
-				}
-			}
-			pc += 3;
-			continue;
-
-		case GC_CHAN:
-			// There are no heap pointers in struct Hchan,
-			// so we can ignore the leading sizeof(Hchan) bytes.
-			if(!(chantype->elem->__code & KindNoPointers)) {
-				// Channel's buffer follows Hchan immediately in memory.
-				// Size of buffer (cap(c)) is second int in the chan struct.
-				chancap = ((uintgo*)chan)[1];
-				if(chancap > 0) {
-					// TODO(atom): split into two chunks so that only the
-					// in-use part of the circular buffer is scanned.
-					// (Channel routines zero the unused part, so the current
-					// code does not lead to leaks, it's just a little inefficient.)
-					*sbuf.obj.pos++ = (Obj){(byte*)chan+runtime_Hchansize, chancap*chantype->elem->__size,
-						(uintptr)chantype->elem->__gc | PRECISE | LOOP};
-					if(sbuf.obj.pos == sbuf.obj.end)
-						flushobjbuf(&sbuf);
-				}
-			}
-			if(chan_ret == nil)
-				goto next_block;
-			pc = chan_ret;
-			continue;
-
-		default:
-			runtime_printf("runtime: invalid GC instruction %p at %p\n", pc[0], pc);
-			runtime_throw("scanblock: invalid GC instruction");
-			return;
-		}
-
-		if((byte*)obj >= arena_start && (byte*)obj < arena_used) {
-			*sbuf.ptr.pos++ = (PtrTarget){obj, objti};
-			if(sbuf.ptr.pos == sbuf.ptr.end)
-				flushptrbuf(&sbuf);
-		}
-	}
-
-	next_block:
-		// Done scanning [b, b+n).  Prepare for the next iteration of
-		// the loop by setting b, n, ti to the parameters for the next block.
-
-		if(sbuf.nobj == 0) {
-			flushptrbuf(&sbuf);
-			flushobjbuf(&sbuf);
-
-			if(sbuf.nobj == 0) {
-				if(!keepworking) {
-					if(sbuf.wbuf)
-						putempty(sbuf.wbuf);
-					return;
-				}
-				// Emptied our buffer: refill.
-				sbuf.wbuf = getfull(sbuf.wbuf);
-				if(sbuf.wbuf == nil)
-					return;
-				sbuf.nobj = sbuf.wbuf->nobj;
-				sbuf.wp = sbuf.wbuf->obj + sbuf.wbuf->nobj;
-			}
-		}
-
-		// Fetch b from the work buffer.
-		--sbuf.wp;
-		b = sbuf.wp->p;
-		n = sbuf.wp->n;
-		ti = sbuf.wp->ti;
-		sbuf.nobj--;
-	}
-}
-
-static struct root_list* roots;
-
-void
-__go_register_gc_roots (struct root_list* r)
-{
-	// FIXME: This needs locking if multiple goroutines can call
-	// dlopen simultaneously.
-	r->next = roots;
-	roots = r;
-}
-
-// Append obj to the work buffer.
-// _wbuf, _wp, _nobj are input/output parameters and are specifying the work buffer.
-static void
-enqueue(Obj obj, Workbuf **_wbuf, Obj **_wp, uintptr *_nobj)
-{
-	uintptr nobj, off;
-	Obj *wp;
-	Workbuf *wbuf;
-
-	if(Debug > 1)
-		runtime_printf("append obj(%p %D %p)\n", obj.p, (int64)obj.n, obj.ti);
-
-	// Align obj.b to a word boundary.
-	off = (uintptr)obj.p & (PtrSize-1);
-	if(off != 0) {
-		obj.p += PtrSize - off;
-		obj.n -= PtrSize - off;
-		obj.ti = 0;
-	}
-
-	if(obj.p == nil || obj.n == 0)
-		return;
-
-	// Load work buffer state
-	wp = *_wp;
-	wbuf = *_wbuf;
-	nobj = *_nobj;
-
-	// If another proc wants a pointer, give it some.
-	if(work.nwait > 0 && nobj > handoffThreshold && work.full == 0) {
-		wbuf->nobj = nobj;
-		wbuf = handoff(wbuf);
-		nobj = wbuf->nobj;
-		wp = wbuf->obj + nobj;
-	}
-
-	// If buffer is full, get a new one.
-	if(wbuf == nil || nobj >= nelem(wbuf->obj)) {
-		if(wbuf != nil)
-			wbuf->nobj = nobj;
-		wbuf = getempty(wbuf);
-		wp = wbuf->obj;
-		nobj = 0;
-	}
-
-	*wp = obj;
-	wp++;
-	nobj++;
-
-	// Save work buffer state
-	*_wp = wp;
-	*_wbuf = wbuf;
-	*_nobj = nobj;
-}
-
-static void
-enqueue1(Workbuf **wbufp, Obj obj)
-{
-	Workbuf *wbuf;
-
-	wbuf = *wbufp;
-	if(wbuf->nobj >= nelem(wbuf->obj))
-		*wbufp = wbuf = getempty(wbuf);
-	wbuf->obj[wbuf->nobj++] = obj;
-}
-
-static void
-markroot(ParFor *desc, uint32 i)
-{
-	Workbuf *wbuf;
-	FinBlock *fb;
-	MHeap *h;
-	MSpan **allspans, *s;
-	uint32 spanidx, sg;
-	G *gp;
-	void *p;
-
-	USED(&desc);
-	wbuf = getempty(nil);
-	// Note: if you add a case here, please also update heapdump.c:dumproots.
-	switch(i) {
-	case RootData:
-		// For gccgo this is both data and bss.
-		{
-			struct root_list *pl;
-
-			for(pl = roots; pl != nil; pl = pl->next) {
-				struct root *pr = &pl->roots[0];
-				while(1) {
-					void *decl = pr->decl;
-					if(decl == nil)
-						break;
-					enqueue1(&wbuf, (Obj){decl, pr->size, 0});
-					pr++;
-				}
-			}
-		}
-		break;
-
-	case RootBss:
-		// For gccgo we use this for all the other global roots.
-		enqueue1(&wbuf, (Obj){(byte*)&runtime_m0, sizeof runtime_m0, 0});
-		enqueue1(&wbuf, (Obj){(byte*)&runtime_g0, sizeof runtime_g0, 0});
-		enqueue1(&wbuf, (Obj){(byte*)&runtime_allg, sizeof runtime_allg, 0});
-		enqueue1(&wbuf, (Obj){(byte*)&runtime_allm, sizeof runtime_allm, 0});
-		enqueue1(&wbuf, (Obj){(byte*)&runtime_allp, sizeof runtime_allp, 0});
-		enqueue1(&wbuf, (Obj){(byte*)&work, sizeof work, 0});
-		runtime_proc_scan(&wbuf, enqueue1);
-		runtime_MProf_Mark(&wbuf, enqueue1);
-		runtime_time_scan(&wbuf, enqueue1);
-		runtime_netpoll_scan(&wbuf, enqueue1);
-		break;
-
-	case RootFinalizers:
-		for(fb=allfin; fb; fb=fb->alllink)
-			enqueue1(&wbuf, (Obj){(byte*)fb->fin, fb->cnt*sizeof(fb->fin[0]), 0});
-		break;
-
-	case RootSpanTypes:
-		// mark span types and MSpan.specials (to walk spans only once)
-		h = &runtime_mheap;
-		sg = h->sweepgen;
-		allspans = h->allspans;
-		for(spanidx=0; spanidx<runtime_mheap.nspan; spanidx++) {
-			Special *sp;
-			SpecialFinalizer *spf;
-
-			s = allspans[spanidx];
-			if(s->sweepgen != sg) {
-				runtime_printf("sweep %d %d\n", s->sweepgen, sg);
-				runtime_throw("gc: unswept span");
-			}
-			if(s->state != MSpanInUse)
-				continue;
-			// The garbage collector ignores type pointers stored in MSpan.types:
-			//  - Compiler-generated types are stored outside of heap.
-			//  - The reflect package has runtime-generated types cached in its data structures.
-			//    The garbage collector relies on finding the references via that cache.
-			if(s->types.compression == MTypes_Words || s->types.compression == MTypes_Bytes)
-				markonly((byte*)s->types.data);
-			for(sp = s->specials; sp != nil; sp = sp->next) {
-				if(sp->kind != KindSpecialFinalizer)
-					continue;
-				// don't mark finalized object, but scan it so we
-				// retain everything it points to.
-				spf = (SpecialFinalizer*)sp;
-				// A finalizer can be set for an inner byte of an object, find object beginning.
-				p = (void*)((s->start << PageShift) + spf->special.offset/s->elemsize*s->elemsize);
-				enqueue1(&wbuf, (Obj){p, s->elemsize, 0});
-				enqueue1(&wbuf, (Obj){(void*)&spf->fn, PtrSize, 0});
-				enqueue1(&wbuf, (Obj){(void*)&spf->ft, PtrSize, 0});
-				enqueue1(&wbuf, (Obj){(void*)&spf->ot, PtrSize, 0});
-			}
-		}
-		break;
-
-	case RootFlushCaches:
-		flushallmcaches();
-		break;
-
-	default:
-		// the rest is scanning goroutine stacks
-		if(i - RootCount >= runtime_allglen)
-			runtime_throw("markroot: bad index");
-		gp = runtime_allg[i - RootCount];
-		// remember when we've first observed the G blocked
-		// needed only to output in traceback
-		if((gp->status == Gwaiting || gp->status == Gsyscall) && gp->waitsince == 0)
-			gp->waitsince = work.tstart;
-		addstackroots(gp, &wbuf);
-		break;
-		
-	}
-
-	if(wbuf)
-		scanblock(wbuf, false);
-}
-
-static const FuncVal markroot_funcval = { (void *) markroot };
-
-// Get an empty work buffer off the work.empty list,
-// allocating new buffers as needed.
-static Workbuf*
-getempty(Workbuf *b)
-{
-	if(b != nil)
-		runtime_lfstackpush(&work.full, &b->node);
-	b = (Workbuf*)runtime_lfstackpop(&work.empty);
-	if(b == nil) {
-		// Need to allocate.
-		runtime_lock(&work.lock);
-		if(work.nchunk < sizeof *b) {
-			work.nchunk = 1<<20;
-			work.chunk = runtime_SysAlloc(work.nchunk, &mstats.gc_sys);
-			if(work.chunk == nil)
-				runtime_throw("runtime: cannot allocate memory");
-		}
-		b = (Workbuf*)work.chunk;
-		work.chunk += sizeof *b;
-		work.nchunk -= sizeof *b;
-		runtime_unlock(&work.lock);
-	}
-	b->nobj = 0;
-	return b;
-}
-
-static void
-putempty(Workbuf *b)
-{
-	if(CollectStats)
-		runtime_xadd64(&gcstats.putempty, 1);
-
-	runtime_lfstackpush(&work.empty, &b->node);
-}
-
-// Get a full work buffer off the work.full list, or return nil.
-static Workbuf*
-getfull(Workbuf *b)
-{
-	M *m;
-	int32 i;
-
-	if(CollectStats)
-		runtime_xadd64(&gcstats.getfull, 1);
-
-	if(b != nil)
-		runtime_lfstackpush(&work.empty, &b->node);
-	b = (Workbuf*)runtime_lfstackpop(&work.full);
-	if(b != nil || work.nproc == 1)
-		return b;
-
-	m = runtime_m();
-	runtime_xadd(&work.nwait, +1);
-	for(i=0;; i++) {
-		if(work.full != 0) {
-			runtime_xadd(&work.nwait, -1);
-			b = (Workbuf*)runtime_lfstackpop(&work.full);
-			if(b != nil)
-				return b;
-			runtime_xadd(&work.nwait, +1);
-		}
-		if(work.nwait == work.nproc)
-			return nil;
-		if(i < 10) {
-			m->gcstats.nprocyield++;
-			runtime_procyield(20);
-		} else if(i < 20) {
-			m->gcstats.nosyield++;
-			runtime_osyield();
-		} else {
-			m->gcstats.nsleep++;
-			runtime_usleep(100);
-		}
-	}
-}
-
-static Workbuf*
-handoff(Workbuf *b)
-{
-	M *m;
-	int32 n;
-	Workbuf *b1;
-
-	m = runtime_m();
-
-	// Make new buffer with half of b's pointers.
-	b1 = getempty(nil);
-	n = b->nobj/2;
-	b->nobj -= n;
-	b1->nobj = n;
-	runtime_memmove(b1->obj, b->obj+b->nobj, n*sizeof b1->obj[0]);
-	m->gcstats.nhandoff++;
-	m->gcstats.nhandoffcnt += n;
-
-	// Put b on full list - let first half of b get stolen.
-	runtime_lfstackpush(&work.full, &b->node);
-	return b1;
-}
-
-static void
-addstackroots(G *gp, Workbuf **wbufp)
-{
-	switch(gp->status){
-	default:
-		runtime_printf("unexpected G.status %d (goroutine %p %D)\n", gp->status, gp, gp->goid);
-		runtime_throw("mark - bad status");
-	case Gdead:
-		return;
-	case Grunning:
-		runtime_throw("mark - world not stopped");
-	case Grunnable:
-	case Gsyscall:
-	case Gwaiting:
-		break;
-	}
-
-#ifdef USING_SPLIT_STACK
-	M *mp;
-	void* sp;
-	size_t spsize;
-	void* next_segment;
-	void* next_sp;
-	void* initial_sp;
-
-	if(gp == runtime_g()) {
-		// Scanning our own stack.
-		sp = __splitstack_find(nil, nil, &spsize, &next_segment,
-				       &next_sp, &initial_sp);
-	} else if((mp = gp->m) != nil && mp->helpgc) {
-		// gchelper's stack is in active use and has no interesting pointers.
-		return;
-	} else {
-		// Scanning another goroutine's stack.
-		// The goroutine is usually asleep (the world is stopped).
-
-		// The exception is that if the goroutine is about to enter or might
-		// have just exited a system call, it may be executing code such
-		// as schedlock and may have needed to start a new stack segment.
-		// Use the stack segment and stack pointer at the time of
-		// the system call instead, since that won't change underfoot.
-		if(gp->gcstack != nil) {
-			sp = gp->gcstack;
-			spsize = gp->gcstack_size;
-			next_segment = gp->gcnext_segment;
-			next_sp = gp->gcnext_sp;
-			initial_sp = gp->gcinitial_sp;
-		} else {
-			sp = __splitstack_find_context(&gp->stack_context[0],
-						       &spsize, &next_segment,
-						       &next_sp, &initial_sp);
-		}
-	}
-	if(sp != nil) {
-		enqueue1(wbufp, (Obj){sp, spsize, 0});
-		while((sp = __splitstack_find(next_segment, next_sp,
-					      &spsize, &next_segment,
-					      &next_sp, &initial_sp)) != nil)
-			enqueue1(wbufp, (Obj){sp, spsize, 0});
-	}
-#else
-	M *mp;
-	byte* bottom;
-	byte* top;
-
-	if(gp == runtime_g()) {
-		// Scanning our own stack.
-		bottom = (byte*)&gp;
-	} else if((mp = gp->m) != nil && mp->helpgc) {
-		// gchelper's stack is in active use and has no interesting pointers.
-		return;
-	} else {
-		// Scanning another goroutine's stack.
-		// The goroutine is usually asleep (the world is stopped).
-		bottom = (byte*)gp->gcnext_sp;
-		if(bottom == nil)
-			return;
-	}
-	top = (byte*)gp->gcinitial_sp + gp->gcstack_size;
-	if(top > bottom)
-		enqueue1(wbufp, (Obj){bottom, top - bottom, 0});
-	else
-		enqueue1(wbufp, (Obj){top, bottom - top, 0});
-#endif
-}
-
-void
-runtime_queuefinalizer(void *p, FuncVal *fn, const FuncType *ft, const PtrType *ot)
-{
-	FinBlock *block;
-	Finalizer *f;
-
-	runtime_lock(&finlock);
-	if(finq == nil || finq->cnt == finq->cap) {
-		if(finc == nil) {
-			finc = runtime_persistentalloc(FinBlockSize, 0, &mstats.gc_sys);
-			finc->cap = (FinBlockSize - sizeof(FinBlock)) / sizeof(Finalizer) + 1;
-			finc->alllink = allfin;
-			allfin = finc;
-		}
-		block = finc;
-		finc = block->next;
-		block->next = finq;
-		finq = block;
-	}
-	f = &finq->fin[finq->cnt];
-	finq->cnt++;
-	f->fn = fn;
-	f->ft = ft;
-	f->ot = ot;
-	f->arg = p;
-	runtime_fingwake = true;
-	runtime_unlock(&finlock);
-}
-
-void
-runtime_iterate_finq(void (*callback)(FuncVal*, void*, const FuncType*, const PtrType*))
-{
-	FinBlock *fb;
-	Finalizer *f;
-	int32 i;
-
-	for(fb = allfin; fb; fb = fb->alllink) {
-		for(i = 0; i < fb->cnt; i++) {
-			f = &fb->fin[i];
-			callback(f->fn, f->arg, f->ft, f->ot);
-		}
-	}
-}
-
-void
-runtime_MSpan_EnsureSwept(MSpan *s)
-{
-	M *m = runtime_m();
-	G *g = runtime_g();
-	uint32 sg;
-
-	// Caller must disable preemption.
-	// Otherwise when this function returns the span can become unswept again
-	// (if GC is triggered on another goroutine).
-	if(m->locks == 0 && m->mallocing == 0 && g != m->g0)
-		runtime_throw("MSpan_EnsureSwept: m is not locked");
-
-	sg = runtime_mheap.sweepgen;
-	if(runtime_atomicload(&s->sweepgen) == sg)
-		return;
-	if(runtime_cas(&s->sweepgen, sg-2, sg-1)) {
-		runtime_MSpan_Sweep(s);
-		return;
-	}
-	// unfortunate condition, and we don't have efficient means to wait
-	while(runtime_atomicload(&s->sweepgen) != sg)
-		runtime_osyield();  
-}
-
-// Sweep frees or collects finalizers for blocks not marked in the mark phase.
-// It clears the mark bits in preparation for the next GC round.
-// Returns true if the span was returned to heap.
-bool
-runtime_MSpan_Sweep(MSpan *s)
-{
-	M *m;
-	int32 cl, n, npages, nfree;
-	uintptr size, off, *bitp, shift, bits;
-	uint32 sweepgen;
-	byte *p;
-	MCache *c;
-	byte *arena_start;
-	MLink head, *end;
-	byte *type_data;
-	byte compression;
-	uintptr type_data_inc;
-	MLink *x;
-	Special *special, **specialp, *y;
-	bool res, sweepgenset;
-
-	m = runtime_m();
-
-	// It's critical that we enter this function with preemption disabled,
-	// GC must not start while we are in the middle of this function.
-	if(m->locks == 0 && m->mallocing == 0 && runtime_g() != m->g0)
-		runtime_throw("MSpan_Sweep: m is not locked");
-	sweepgen = runtime_mheap.sweepgen;
-	if(s->state != MSpanInUse || s->sweepgen != sweepgen-1) {
-		runtime_printf("MSpan_Sweep: state=%d sweepgen=%d mheap.sweepgen=%d\n",
-			s->state, s->sweepgen, sweepgen);
-		runtime_throw("MSpan_Sweep: bad span state");
-	}
-	arena_start = runtime_mheap.arena_start;
-	cl = s->sizeclass;
-	size = s->elemsize;
-	if(cl == 0) {
-		n = 1;
-	} else {
-		// Chunk full of small blocks.
-		npages = runtime_class_to_allocnpages[cl];
-		n = (npages << PageShift) / size;
-	}
-	res = false;
-	nfree = 0;
-	end = &head;
-	c = m->mcache;
-	sweepgenset = false;
-
-	// mark any free objects in this span so we don't collect them
-	for(x = s->freelist; x != nil; x = x->next) {
-		// This is markonly(x) but faster because we don't need
-		// atomic access and we're guaranteed to be pointing at
-		// the head of a valid object.
-		off = (uintptr*)x - (uintptr*)runtime_mheap.arena_start;
-		bitp = (uintptr*)runtime_mheap.arena_start - off/wordsPerBitmapWord - 1;
-		shift = off % wordsPerBitmapWord;
-		*bitp |= bitMarked<<shift;
-	}
-
-	// Unlink & free special records for any objects we're about to free.
-	specialp = &s->specials;
-	special = *specialp;
-	while(special != nil) {
-		// A finalizer can be set for an inner byte of an object, find object beginning.
-		p = (byte*)(s->start << PageShift) + special->offset/size*size;
-		off = (uintptr*)p - (uintptr*)arena_start;
-		bitp = (uintptr*)arena_start - off/wordsPerBitmapWord - 1;
-		shift = off % wordsPerBitmapWord;
-		bits = *bitp>>shift;
-		if((bits & (bitAllocated|bitMarked)) == bitAllocated) {
-			// Find the exact byte for which the special was setup
-			// (as opposed to object beginning).
-			p = (byte*)(s->start << PageShift) + special->offset;
-			// about to free object: splice out special record
-			y = special;
-			special = special->next;
-			*specialp = special;
-			if(!runtime_freespecial(y, p, size, false)) {
-				// stop freeing of object if it has a finalizer
-				*bitp |= bitMarked << shift;
-			}
-		} else {
-			// object is still live: keep special record
-			specialp = &special->next;
-			special = *specialp;
-		}
-	}
-
-	type_data = (byte*)s->types.data;
-	type_data_inc = sizeof(uintptr);
-	compression = s->types.compression;
-	switch(compression) {
-	case MTypes_Bytes:
-		type_data += 8*sizeof(uintptr);
-		type_data_inc = 1;
-		break;
-	}
-
-	// Sweep through n objects of given size starting at p.
-	// This thread owns the span now, so it can manipulate
-	// the block bitmap without atomic operations.
-	p = (byte*)(s->start << PageShift);
-	for(; n > 0; n--, p += size, type_data+=type_data_inc) {
-		off = (uintptr*)p - (uintptr*)arena_start;
-		bitp = (uintptr*)arena_start - off/wordsPerBitmapWord - 1;
-		shift = off % wordsPerBitmapWord;
-		bits = *bitp>>shift;
-
-		if((bits & bitAllocated) == 0)
-			continue;
-
-		if((bits & bitMarked) != 0) {
-			*bitp &= ~(bitMarked<<shift);
-			continue;
-		}
-
-		if(runtime_debug.allocfreetrace)
-			runtime_tracefree(p, size);
-
-		// Clear mark and scan bits.
-		*bitp &= ~((bitScan|bitMarked)<<shift);
-
-		if(cl == 0) {
-			// Free large span.
-			runtime_unmarkspan(p, 1<<PageShift);
-			s->needzero = 1;
-			// important to set sweepgen before returning it to heap
-			runtime_atomicstore(&s->sweepgen, sweepgen);
-			sweepgenset = true;
-			// See note about SysFault vs SysFree in malloc.goc.
-			if(runtime_debug.efence)
-				runtime_SysFault(p, size);
-			else
-				runtime_MHeap_Free(&runtime_mheap, s, 1);
-			c->local_nlargefree++;
-			c->local_largefree += size;
-			runtime_xadd64(&mstats.next_gc, -(uint64)(size * (gcpercent + 100)/100));
-			res = true;
-		} else {
-			// Free small object.
-			switch(compression) {
-			case MTypes_Words:
-				*(uintptr*)type_data = 0;
-				break;
-			case MTypes_Bytes:
-				*(byte*)type_data = 0;
-				break;
-			}
-			if(size > 2*sizeof(uintptr))
-				((uintptr*)p)[1] = (uintptr)0xdeaddeaddeaddeadll;	// mark as "needs to be zeroed"
-			else if(size > sizeof(uintptr))
-				((uintptr*)p)[1] = 0;
-
-			end->next = (MLink*)p;
-			end = (MLink*)p;
-			nfree++;
-		}
-	}
-
-	// We need to set s->sweepgen = h->sweepgen only when all blocks are swept,
-	// because of the potential for a concurrent free/SetFinalizer.
-	// But we need to set it before we make the span available for allocation
-	// (return it to heap or mcentral), because allocation code assumes that a
-	// span is already swept if available for allocation.
-
-	if(!sweepgenset && nfree == 0) {
-		// The span must be in our exclusive ownership until we update sweepgen,
-		// check for potential races.
-		if(s->state != MSpanInUse || s->sweepgen != sweepgen-1) {
-			runtime_printf("MSpan_Sweep: state=%d sweepgen=%d mheap.sweepgen=%d\n",
-				s->state, s->sweepgen, sweepgen);
-			runtime_throw("MSpan_Sweep: bad span state after sweep");
-		}
-		runtime_atomicstore(&s->sweepgen, sweepgen);
-	}
-	if(nfree > 0) {
-		c->local_nsmallfree[cl] += nfree;
-		c->local_cachealloc -= nfree * size;
-		runtime_xadd64(&mstats.next_gc, -(uint64)(nfree * size * (gcpercent + 100)/100));
-		res = runtime_MCentral_FreeSpan(&runtime_mheap.central[cl].mcentral, s, nfree, head.next, end);
-		//MCentral_FreeSpan updates sweepgen
-	}
-	return res;
-}
-
-// State of background sweep.
-// Protected by gclock.
-static struct
-{
-	G*	g;
-	bool	parked;
-
-	MSpan**	spans;
-	uint32	nspan;
-	uint32	spanidx;
-} sweep;
-
-// background sweeping goroutine
-static void
-bgsweep(void* dummy __attribute__ ((unused)))
-{
-	runtime_g()->issystem = 1;
-	for(;;) {
-		while(runtime_sweepone() != (uintptr)-1) {
-			gcstats.nbgsweep++;
-			runtime_gosched();
-		}
-		runtime_lock(&gclock);
-		if(!runtime_mheap.sweepdone) {
-			// It's possible if GC has happened between sweepone has
-			// returned -1 and gclock lock.
-			runtime_unlock(&gclock);
-			continue;
-		}
-		sweep.parked = true;
-		runtime_g()->isbackground = true;
-		runtime_parkunlock(&gclock, "GC sweep wait");
-		runtime_g()->isbackground = false;
-	}
-}
-
-// sweeps one span
-// returns number of pages returned to heap, or -1 if there is nothing to sweep
-uintptr
-runtime_sweepone(void)
-{
-	M *m = runtime_m();
-	MSpan *s;
-	uint32 idx, sg;
-	uintptr npages;
-
-	// increment locks to ensure that the goroutine is not preempted
-	// in the middle of sweep thus leaving the span in an inconsistent state for next GC
-	m->locks++;
-	sg = runtime_mheap.sweepgen;
-	for(;;) {
-		idx = runtime_xadd(&sweep.spanidx, 1) - 1;
-		if(idx >= sweep.nspan) {
-			runtime_mheap.sweepdone = true;
-			m->locks--;
-			return (uintptr)-1;
-		}
-		s = sweep.spans[idx];
-		if(s->state != MSpanInUse) {
-			s->sweepgen = sg;
-			continue;
-		}
-		if(s->sweepgen != sg-2 || !runtime_cas(&s->sweepgen, sg-2, sg-1))
-			continue;
-		if(s->incache)
-			runtime_throw("sweep of incache span");
-		npages = s->npages;
-		if(!runtime_MSpan_Sweep(s))
-			npages = 0;
-		m->locks--;
-		return npages;
-	}
-}
-
-static void
-dumpspan(uint32 idx)
-{
-	int32 sizeclass, n, npages, i, column;
-	uintptr size;
-	byte *p;
-	byte *arena_start;
-	MSpan *s;
-	bool allocated;
-
-	s = runtime_mheap.allspans[idx];
-	if(s->state != MSpanInUse)
-		return;
-	arena_start = runtime_mheap.arena_start;
-	p = (byte*)(s->start << PageShift);
-	sizeclass = s->sizeclass;
-	size = s->elemsize;
-	if(sizeclass == 0) {
-		n = 1;
-	} else {
-		npages = runtime_class_to_allocnpages[sizeclass];
-		n = (npages << PageShift) / size;
-	}
-	
-	runtime_printf("%p .. %p:\n", p, p+n*size);
-	column = 0;
-	for(; n>0; n--, p+=size) {
-		uintptr off, *bitp, shift, bits;
-
-		off = (uintptr*)p - (uintptr*)arena_start;
-		bitp = (uintptr*)arena_start - off/wordsPerBitmapWord - 1;
-		shift = off % wordsPerBitmapWord;
-		bits = *bitp>>shift;
-
-		allocated = ((bits & bitAllocated) != 0);
-
-		for(i=0; (uint32)i<size; i+=sizeof(void*)) {
-			if(column == 0) {
-				runtime_printf("\t");
-			}
-			if(i == 0) {
-				runtime_printf(allocated ? "(" : "[");
-				runtime_printf("%p: ", p+i);
-			} else {
-				runtime_printf(" ");
-			}
-
-			runtime_printf("%p", *(void**)(p+i));
-
-			if(i+sizeof(void*) >= size) {
-				runtime_printf(allocated ? ") " : "] ");
-			}
-
-			column++;
-			if(column == 8) {
-				runtime_printf("\n");
-				column = 0;
-			}
-		}
-	}
-	runtime_printf("\n");
-}
-
-// A debugging function to dump the contents of memory
-void
-runtime_memorydump(void)
-{
-	uint32 spanidx;
-
-	for(spanidx=0; spanidx<runtime_mheap.nspan; spanidx++) {
-		dumpspan(spanidx);
-	}
-}
-
-void
-runtime_gchelper(void)
-{
-	uint32 nproc;
-
-	runtime_m()->traceback = 2;
-	gchelperstart();
-
-	// parallel mark for over gc roots
-	runtime_parfordo(work.markfor);
-
-	// help other threads scan secondary blocks
-	scanblock(nil, true);
-
-	bufferList[runtime_m()->helpgc].busy = 0;
-	nproc = work.nproc;  // work.nproc can change right after we increment work.ndone
-	if(runtime_xadd(&work.ndone, +1) == nproc-1)
-		runtime_notewakeup(&work.alldone);
-	runtime_m()->traceback = 0;
-}
-
-static void
-cachestats(void)
-{
-	MCache *c;
-	P *p, **pp;
-
-	for(pp=runtime_allp; (p=*pp) != nil; pp++) {
-		c = p->mcache;
-		if(c==nil)
-			continue;
-		runtime_purgecachedstats(c);
-	}
-}
-
-static void
-flushallmcaches(void)
-{
-	P *p, **pp;
-	MCache *c;
-
-	// Flush MCache's to MCentral.
-	for(pp=runtime_allp; (p=*pp) != nil; pp++) {
-		c = p->mcache;
-		if(c==nil)
-			continue;
-		runtime_MCache_ReleaseAll(c);
-	}
-}
-
-void
-runtime_updatememstats(GCStats *stats)
-{
-	M *mp;
-	MSpan *s;
-	uint32 i;
-	uint64 stacks_inuse, smallfree;
-	uint64 *src, *dst;
-
-	if(stats)
-		runtime_memclr((byte*)stats, sizeof(*stats));
-	stacks_inuse = 0;
-	for(mp=runtime_allm; mp; mp=mp->alllink) {
-		//stacks_inuse += mp->stackinuse*FixedStack;
-		if(stats) {
-			src = (uint64*)&mp->gcstats;
-			dst = (uint64*)stats;
-			for(i=0; i<sizeof(*stats)/sizeof(uint64); i++)
-				dst[i] += src[i];
-			runtime_memclr((byte*)&mp->gcstats, sizeof(mp->gcstats));
-		}
-	}
-	mstats.stacks_inuse = stacks_inuse;
-	mstats.mcache_inuse = runtime_mheap.cachealloc.inuse;
-	mstats.mspan_inuse = runtime_mheap.spanalloc.inuse;
-	mstats.sys = mstats.heap_sys + mstats.stacks_sys + mstats.mspan_sys +
-		mstats.mcache_sys + mstats.buckhash_sys + mstats.gc_sys + mstats.other_sys;
-	
-	// Calculate memory allocator stats.
-	// During program execution we only count number of frees and amount of freed memory.
-	// Current number of alive object in the heap and amount of alive heap memory
-	// are calculated by scanning all spans.
-	// Total number of mallocs is calculated as number of frees plus number of alive objects.
-	// Similarly, total amount of allocated memory is calculated as amount of freed memory
-	// plus amount of alive heap memory.
-	mstats.alloc = 0;
-	mstats.total_alloc = 0;
-	mstats.nmalloc = 0;
-	mstats.nfree = 0;
-	for(i = 0; i < nelem(mstats.by_size); i++) {
-		mstats.by_size[i].nmalloc = 0;
-		mstats.by_size[i].nfree = 0;
-	}
-
-	// Flush MCache's to MCentral.
-	flushallmcaches();
-
-	// Aggregate local stats.
-	cachestats();
-
-	// Scan all spans and count number of alive objects.
-	for(i = 0; i < runtime_mheap.nspan; i++) {
-		s = runtime_mheap.allspans[i];
-		if(s->state != MSpanInUse)
-			continue;
-		if(s->sizeclass == 0) {
-			mstats.nmalloc++;
-			mstats.alloc += s->elemsize;
-		} else {
-			mstats.nmalloc += s->ref;
-			mstats.by_size[s->sizeclass].nmalloc += s->ref;
-			mstats.alloc += s->ref*s->elemsize;
-		}
-	}
-
-	// Aggregate by size class.
-	smallfree = 0;
-	mstats.nfree = runtime_mheap.nlargefree;
-	for(i = 0; i < nelem(mstats.by_size); i++) {
-		mstats.nfree += runtime_mheap.nsmallfree[i];
-		mstats.by_size[i].nfree = runtime_mheap.nsmallfree[i];
-		mstats.by_size[i].nmalloc += runtime_mheap.nsmallfree[i];
-		smallfree += runtime_mheap.nsmallfree[i] * runtime_class_to_size[i];
-	}
-	mstats.nmalloc += mstats.nfree;
-
-	// Calculate derived stats.
-	mstats.total_alloc = mstats.alloc + runtime_mheap.largefree + smallfree;
-	mstats.heap_alloc = mstats.alloc;
-	mstats.heap_objects = mstats.nmalloc - mstats.nfree;
-}
-
-// Structure of arguments passed to function gc().
-// This allows the arguments to be passed via runtime_mcall.
-struct gc_args
-{
-	int64 start_time; // start time of GC in ns (just before stoptheworld)
-	bool  eagersweep;
-};
-
-static void gc(struct gc_args *args);
-static void mgc(G *gp);
-
-static int32
-readgogc(void)
-{
-	String s;
-	const byte *p;
-
-	s = runtime_getenv("GOGC");
-	if(s.len == 0)
-		return 100;
-	p = s.str;
-	if(s.len == 3 && runtime_strcmp((const char *)p, "off") == 0)
-		return -1;
-	return runtime_atoi(p, s.len);
-}
-
-// force = 1 - do GC regardless of current heap usage
-// force = 2 - go GC and eager sweep
-void
-runtime_gc(int32 force)
-{
-	M *m;
-	G *g;
-	struct gc_args a;
-	int32 i;
-
-	// The atomic operations are not atomic if the uint64s
-	// are not aligned on uint64 boundaries. This has been
-	// a problem in the past.
-	if((((uintptr)&work.empty) & 7) != 0)
-		runtime_throw("runtime: gc work buffer is misaligned");
-	if((((uintptr)&work.full) & 7) != 0)
-		runtime_throw("runtime: gc work buffer is misaligned");
-
-	// Make sure all registers are saved on stack so that
-	// scanstack sees them.
-	__builtin_unwind_init();
-
-	// The gc is turned off (via enablegc) until
-	// the bootstrap has completed.
-	// Also, malloc gets called in the guts
-	// of a number of libraries that might be
-	// holding locks.  To avoid priority inversion
-	// problems, don't bother trying to run gc
-	// while holding a lock.  The next mallocgc
-	// without a lock will do the gc instead.
-	m = runtime_m();
-	if(!mstats.enablegc || runtime_g() == m->g0 || m->locks > 0 || runtime_panicking)
-		return;
-
-	if(gcpercent == GcpercentUnknown) {	// first time through
-		runtime_lock(&runtime_mheap.lock);
-		if(gcpercent == GcpercentUnknown)
-			gcpercent = readgogc();
-		runtime_unlock(&runtime_mheap.lock);
-	}
-	if(gcpercent < 0)
-		return;
-
-	runtime_semacquire(&runtime_worldsema, false);
-	if(force==0 && mstats.heap_alloc < mstats.next_gc) {
-		// typically threads which lost the race to grab
-		// worldsema exit here when gc is done.
-		runtime_semrelease(&runtime_worldsema);
-		return;
-	}
-
-	// Ok, we're doing it!  Stop everybody else
-	a.start_time = runtime_nanotime();
-	a.eagersweep = force >= 2;
-	m->gcing = 1;
-	runtime_stoptheworld();
-	
-	clearpools();
-
-	// Run gc on the g0 stack.  We do this so that the g stack
-	// we're currently running on will no longer change.  Cuts
-	// the root set down a bit (g0 stacks are not scanned, and
-	// we don't need to scan gc's internal state).  Also an
-	// enabler for copyable stacks.
-	for(i = 0; i < (runtime_debug.gctrace > 1 ? 2 : 1); i++) {
-		if(i > 0)
-			a.start_time = runtime_nanotime();
-		// switch to g0, call gc(&a), then switch back
-		g = runtime_g();
-		g->param = &a;
-		g->status = Gwaiting;
-		g->waitreason = "garbage collection";
-		runtime_mcall(mgc);
-		m = runtime_m();
-	}
-
-	// all done
-	m->gcing = 0;
-	m->locks++;
-	runtime_semrelease(&runtime_worldsema);
-	runtime_starttheworld();
-	m->locks--;
-
-	// now that gc is done, kick off finalizer thread if needed
-	if(!ConcurrentSweep) {
-		// give the queued finalizers, if any, a chance to run
-		runtime_gosched();
-	} else {
-		// For gccgo, let other goroutines run.
-		runtime_gosched();
-	}
-}
-
-static void
-mgc(G *gp)
-{
-	gc(gp->param);
-	gp->param = nil;
-	gp->status = Grunning;
-	runtime_gogo(gp);
-}
-
-static void
-gc(struct gc_args *args)
-{
-	M *m;
-	int64 t0, t1, t2, t3, t4;
-	uint64 heap0, heap1, obj, ninstr;
-	GCStats stats;
-	uint32 i;
-	// Eface eface;
-
-	m = runtime_m();
-
-	if(runtime_debug.allocfreetrace)
-		runtime_tracegc();
-
-	m->traceback = 2;
-	t0 = args->start_time;
-	work.tstart = args->start_time; 
-
-	if(CollectStats)
-		runtime_memclr((byte*)&gcstats, sizeof(gcstats));
-
-	m->locks++;	// disable gc during mallocs in parforalloc
-	if(work.markfor == nil)
-		work.markfor = runtime_parforalloc(MaxGcproc);
-	m->locks--;
-
-	t1 = 0;
-	if(runtime_debug.gctrace)
-		t1 = runtime_nanotime();
-
-	// Sweep what is not sweeped by bgsweep.
-	while(runtime_sweepone() != (uintptr)-1)
-		gcstats.npausesweep++;
-
-	work.nwait = 0;
-	work.ndone = 0;
-	work.nproc = runtime_gcprocs();
-	runtime_parforsetup(work.markfor, work.nproc, RootCount + runtime_allglen, false, &markroot_funcval);
-	if(work.nproc > 1) {
-		runtime_noteclear(&work.alldone);
-		runtime_helpgc(work.nproc);
-	}
-
-	t2 = 0;
-	if(runtime_debug.gctrace)
-		t2 = runtime_nanotime();
-
-	gchelperstart();
-	runtime_parfordo(work.markfor);
-	scanblock(nil, true);
-
-	t3 = 0;
-	if(runtime_debug.gctrace)
-		t3 = runtime_nanotime();
-
-	bufferList[m->helpgc].busy = 0;
-	if(work.nproc > 1)
-		runtime_notesleep(&work.alldone);
-
-	cachestats();
-	// next_gc calculation is tricky with concurrent sweep since we don't know size of live heap
-	// estimate what was live heap size after previous GC (for tracing only)
-	heap0 = mstats.next_gc*100/(gcpercent+100);
-	// conservatively set next_gc to high value assuming that everything is live
-	// concurrent/lazy sweep will reduce this number while discovering new garbage
-	mstats.next_gc = mstats.heap_alloc+(mstats.heap_alloc-runtime_stacks_sys)*gcpercent/100;
-
-	t4 = runtime_nanotime();
-	mstats.last_gc = runtime_unixnanotime();  // must be Unix time to make sense to user
-	mstats.pause_ns[mstats.numgc%nelem(mstats.pause_ns)] = t4 - t0;
-	mstats.pause_end[mstats.numgc%nelem(mstats.pause_end)] = mstats.last_gc;
-	mstats.pause_total_ns += t4 - t0;
-	mstats.numgc++;
-	if(mstats.debuggc)
-		runtime_printf("pause %D\n", t4-t0);
-
-	if(runtime_debug.gctrace) {
-		heap1 = mstats.heap_alloc;
-		runtime_updatememstats(&stats);
-		if(heap1 != mstats.heap_alloc) {
-			runtime_printf("runtime: mstats skew: heap=%D/%D\n", heap1, mstats.heap_alloc);
-			runtime_throw("mstats skew");
-		}
-		obj = mstats.nmalloc - mstats.nfree;
-
-		stats.nprocyield += work.markfor->nprocyield;
-		stats.nosyield += work.markfor->nosyield;
-		stats.nsleep += work.markfor->nsleep;
-
-		runtime_printf("gc%d(%d): %D+%D+%D+%D us, %D -> %D MB, %D (%D-%D) objects,"
-				" %d/%d/%d sweeps,"
-				" %D(%D) handoff, %D(%D) steal, %D/%D/%D yields\n",
-			mstats.numgc, work.nproc, (t1-t0)/1000, (t2-t1)/1000, (t3-t2)/1000, (t4-t3)/1000,
-			heap0>>20, heap1>>20, obj,
-			mstats.nmalloc, mstats.nfree,
-			sweep.nspan, gcstats.nbgsweep, gcstats.npausesweep,
-			stats.nhandoff, stats.nhandoffcnt,
-			work.markfor->nsteal, work.markfor->nstealcnt,
-			stats.nprocyield, stats.nosyield, stats.nsleep);
-		gcstats.nbgsweep = gcstats.npausesweep = 0;
-		if(CollectStats) {
-			runtime_printf("scan: %D bytes, %D objects, %D untyped, %D types from MSpan\n",
-				gcstats.nbytes, gcstats.obj.cnt, gcstats.obj.notype, gcstats.obj.typelookup);
-			if(gcstats.ptr.cnt != 0)
-				runtime_printf("avg ptrbufsize: %D (%D/%D)\n",
-					gcstats.ptr.sum/gcstats.ptr.cnt, gcstats.ptr.sum, gcstats.ptr.cnt);
-			if(gcstats.obj.cnt != 0)
-				runtime_printf("avg nobj: %D (%D/%D)\n",
-					gcstats.obj.sum/gcstats.obj.cnt, gcstats.obj.sum, gcstats.obj.cnt);
-			runtime_printf("rescans: %D, %D bytes\n", gcstats.rescan, gcstats.rescanbytes);
-
-			runtime_printf("instruction counts:\n");
-			ninstr = 0;
-			for(i=0; i<nelem(gcstats.instr); i++) {
-				runtime_printf("\t%d:\t%D\n", i, gcstats.instr[i]);
-				ninstr += gcstats.instr[i];
-			}
-			runtime_printf("\ttotal:\t%D\n", ninstr);
-
-			runtime_printf("putempty: %D, getfull: %D\n", gcstats.putempty, gcstats.getfull);
-
-			runtime_printf("markonly base lookup: bit %D word %D span %D\n", gcstats.markonly.foundbit, gcstats.markonly.foundword, gcstats.markonly.foundspan);
-			runtime_printf("flushptrbuf base lookup: bit %D word %D span %D\n", gcstats.flushptrbuf.foundbit, gcstats.flushptrbuf.foundword, gcstats.flushptrbuf.foundspan);
-		}
-	}
-
-	// We cache current runtime_mheap.allspans array in sweep.spans,
-	// because the former can be resized and freed.
-	// Otherwise we would need to take heap lock every time
-	// we want to convert span index to span pointer.
-
-	// Free the old cached array if necessary.
-	if(sweep.spans && sweep.spans != runtime_mheap.allspans)
-		runtime_SysFree(sweep.spans, sweep.nspan*sizeof(sweep.spans[0]), &mstats.other_sys);
-	// Cache the current array.
-	runtime_mheap.sweepspans = runtime_mheap.allspans;
-	runtime_mheap.sweepgen += 2;
-	runtime_mheap.sweepdone = false;
-	sweep.spans = runtime_mheap.allspans;
-	sweep.nspan = runtime_mheap.nspan;
-	sweep.spanidx = 0;
-
-	// Temporary disable concurrent sweep, because we see failures on builders.
-	if(ConcurrentSweep && !args->eagersweep) {
-		runtime_lock(&gclock);
-		if(sweep.g == nil)
-			sweep.g = __go_go(bgsweep, nil);
-		else if(sweep.parked) {
-			sweep.parked = false;
-			runtime_ready(sweep.g);
-		}
-		runtime_unlock(&gclock);
-	} else {
-		// Sweep all spans eagerly.
-		while(runtime_sweepone() != (uintptr)-1)
-			gcstats.npausesweep++;
-		// Do an additional mProf_GC, because all 'free' events are now real as well.
-		runtime_MProf_GC();
-	}
-
-	runtime_MProf_GC();
-	m->traceback = 0;
-}
-
-extern uintptr runtime_sizeof_C_MStats
-  __asm__ (GOSYM_PREFIX "runtime.Sizeof_C_MStats");
-
-void runtime_ReadMemStats(MStats *)
-  __asm__ (GOSYM_PREFIX "runtime.ReadMemStats");
-
-void
-runtime_ReadMemStats(MStats *stats)
-{
-	M *m;
-
-	// Have to acquire worldsema to stop the world,
-	// because stoptheworld can only be used by
-	// one goroutine at a time, and there might be
-	// a pending garbage collection already calling it.
-	runtime_semacquire(&runtime_worldsema, false);
-	m = runtime_m();
-	m->gcing = 1;
-	runtime_stoptheworld();
-	runtime_updatememstats(nil);
-	// Size of the trailing by_size array differs between Go and C,
-	// NumSizeClasses was changed, but we can not change Go struct because of backward compatibility.
-	runtime_memmove(stats, &mstats, runtime_sizeof_C_MStats);
-	m->gcing = 0;
-	m->locks++;
-	runtime_semrelease(&runtime_worldsema);
-	runtime_starttheworld();
-	m->locks--;
-}
-
-void runtime_debug_readGCStats(Slice*)
-  __asm__("runtime_debug.readGCStats");
-
-void
-runtime_debug_readGCStats(Slice *pauses)
-{
-	uint64 *p;
-	uint32 i, n;
-
-	// Calling code in runtime/debug should make the slice large enough.
-	if((size_t)pauses->cap < nelem(mstats.pause_ns)+3)
-		runtime_throw("runtime: short slice passed to readGCStats");
-
-	// Pass back: pauses, last gc (absolute time), number of gc, total pause ns.
-	p = (uint64*)pauses->array;
-	runtime_lock(&runtime_mheap.lock);
-	n = mstats.numgc;
-	if(n > nelem(mstats.pause_ns))
-		n = nelem(mstats.pause_ns);
-	
-	// The pause buffer is circular. The most recent pause is at
-	// pause_ns[(numgc-1)%nelem(pause_ns)], and then backward
-	// from there to go back farther in time. We deliver the times
-	// most recent first (in p[0]).
-	for(i=0; i<n; i++)
-		p[i] = mstats.pause_ns[(mstats.numgc-1-i)%nelem(mstats.pause_ns)];
-
-	p[n] = mstats.last_gc;
-	p[n+1] = mstats.numgc;
-	p[n+2] = mstats.pause_total_ns;	
-	runtime_unlock(&runtime_mheap.lock);
-	pauses->__count = n+3;
-}
-
-int32
-runtime_setgcpercent(int32 in) {
-	int32 out;
-
-	runtime_lock(&runtime_mheap.lock);
-	if(gcpercent == GcpercentUnknown)
-		gcpercent = readgogc();
-	out = gcpercent;
-	if(in < 0)
-		in = -1;
-	gcpercent = in;
-	runtime_unlock(&runtime_mheap.lock);
-	return out;
-}
-
-static void
-gchelperstart(void)
-{
-	M *m;
-
-	m = runtime_m();
-	if(m->helpgc < 0 || m->helpgc >= MaxGcproc)
-		runtime_throw("gchelperstart: bad m->helpgc");
-	if(runtime_xchg(&bufferList[m->helpgc].busy, 1))
-		runtime_throw("gchelperstart: already busy");
-	if(runtime_g() != m->g0)
-		runtime_throw("gchelper not running on g0 stack");
-}
-
-static void
-runfinq(void* dummy __attribute__ ((unused)))
-{
-	Finalizer *f;
-	FinBlock *fb, *next;
-	uint32 i;
-	Eface ef;
-	Iface iface;
-
-	// This function blocks for long periods of time, and because it is written in C
-	// we have no liveness information. Zero everything so that uninitialized pointers
-	// do not cause memory leaks.
-	f = nil;
-	fb = nil;
-	next = nil;
-	i = 0;
-	ef.__type_descriptor = nil;
-	ef.__object = nil;
-	
-	// force flush to memory
-	USED(&f);
-	USED(&fb);
-	USED(&next);
-	USED(&i);
-	USED(&ef);
-
-	for(;;) {
-		runtime_lock(&finlock);
-		fb = finq;
-		finq = nil;
-		if(fb == nil) {
-			runtime_fingwait = true;
-			runtime_g()->isbackground = true;
-			runtime_parkunlock(&finlock, "finalizer wait");
-			runtime_g()->isbackground = false;
-			continue;
-		}
-		runtime_unlock(&finlock);
-		for(; fb; fb=next) {
-			next = fb->next;
-			for(i=0; i<(uint32)fb->cnt; i++) {
-				const Type *fint;
-				void *param;
-
-				f = &fb->fin[i];
-				fint = ((const Type**)f->ft->__in.array)[0];
-				if((fint->__code & kindMask) == KindPtr) {
-					// direct use of pointer
-					param = &f->arg;
-				} else if(((const InterfaceType*)fint)->__methods.__count == 0) {
-					// convert to empty interface
-					ef.__type_descriptor = (const Type*)f->ot;
-					ef.__object = f->arg;
-					param = &ef;
-				} else {
-					// convert to interface with methods
-					iface.__methods = __go_convert_interface_2((const Type*)fint,
-										   (const Type*)f->ot,
-										   1);
-					iface.__object = f->arg;
-					if(iface.__methods == nil)
-						runtime_throw("invalid type conversion in runfinq");
-					param = &iface;
-				}
-				reflect_call(f->ft, f->fn, 0, 0, &param, nil);
-				f->fn = nil;
-				f->arg = nil;
-				f->ot = nil;
-			}
-			fb->cnt = 0;
-			runtime_lock(&finlock);
-			fb->next = finc;
-			finc = fb;
-			runtime_unlock(&finlock);
-		}
-
-		// Zero everything that's dead, to avoid memory leaks.
-		// See comment at top of function.
-		f = nil;
-		fb = nil;
-		next = nil;
-		i = 0;
-		ef.__type_descriptor = nil;
-		ef.__object = nil;
-		runtime_gc(1);	// trigger another gc to clean up the finalized objects, if possible
-	}
-}
-
-void
-runtime_createfing(void)
-{
-	if(fing != nil)
-		return;
-	// Here we use gclock instead of finlock,
-	// because newproc1 can allocate, which can cause on-demand span sweep,
-	// which can queue finalizers, which would deadlock.
-	runtime_lock(&gclock);
-	if(fing == nil)
-		fing = __go_go(runfinq, nil);
-	runtime_unlock(&gclock);
-}
-
-G*
-runtime_wakefing(void)
-{
-	G *res;
-
-	res = nil;
-	runtime_lock(&finlock);
-	if(runtime_fingwait && runtime_fingwake) {
-		runtime_fingwait = false;
-		runtime_fingwake = false;
-		res = fing;
-	}
-	runtime_unlock(&finlock);
-	return res;
-}
-
-void
-runtime_marknogc(void *v)
-{
-	uintptr *b, off, shift;
-
-	off = (uintptr*)v - (uintptr*)runtime_mheap.arena_start;  // word offset
-	b = (uintptr*)runtime_mheap.arena_start - off/wordsPerBitmapWord - 1;
-	shift = off % wordsPerBitmapWord;
-	*b = (*b & ~(bitAllocated<<shift)) | bitBlockBoundary<<shift;
-}
-
-void
-runtime_markscan(void *v)
-{
-	uintptr *b, off, shift;
-
-	off = (uintptr*)v - (uintptr*)runtime_mheap.arena_start;  // word offset
-	b = (uintptr*)runtime_mheap.arena_start - off/wordsPerBitmapWord - 1;
-	shift = off % wordsPerBitmapWord;
-	*b |= bitScan<<shift;
-}
-
-// mark the block at v as freed.
-void
-runtime_markfreed(void *v)
-{
-	uintptr *b, off, shift;
-
-	if(0)
-		runtime_printf("markfreed %p\n", v);
-
-	if((byte*)v > (byte*)runtime_mheap.arena_used || (byte*)v < runtime_mheap.arena_start)
-		runtime_throw("markfreed: bad pointer");
-
-	off = (uintptr*)v - (uintptr*)runtime_mheap.arena_start;  // word offset
-	b = (uintptr*)runtime_mheap.arena_start - off/wordsPerBitmapWord - 1;
-	shift = off % wordsPerBitmapWord;
-	*b = (*b & ~(bitMask<<shift)) | (bitAllocated<<shift);
-}
-
-// check that the block at v of size n is marked freed.
-void
-runtime_checkfreed(void *v, uintptr n)
-{
-	uintptr *b, bits, off, shift;
-
-	if(!runtime_checking)
-		return;
-
-	if((byte*)v+n > (byte*)runtime_mheap.arena_used || (byte*)v < runtime_mheap.arena_start)
-		return;	// not allocated, so okay
-
-	off = (uintptr*)v - (uintptr*)runtime_mheap.arena_start;  // word offset
-	b = (uintptr*)runtime_mheap.arena_start - off/wordsPerBitmapWord - 1;
-	shift = off % wordsPerBitmapWord;
-
-	bits = *b>>shift;
-	if((bits & bitAllocated) != 0) {
-		runtime_printf("checkfreed %p+%p: off=%p have=%p\n",
-			v, n, off, bits & bitMask);
-		runtime_throw("checkfreed: not freed");
-	}
-}
-
-// mark the span of memory at v as having n blocks of the given size.
-// if leftover is true, there is left over space at the end of the span.
-void
-runtime_markspan(void *v, uintptr size, uintptr n, bool leftover)
-{
-	uintptr *b, *b0, off, shift, i, x;
-	byte *p;
-
-	if((byte*)v+size*n > (byte*)runtime_mheap.arena_used || (byte*)v < runtime_mheap.arena_start)
-		runtime_throw("markspan: bad pointer");
-
-	if(runtime_checking) {
-		// bits should be all zero at the start
-		off = (byte*)v + size - runtime_mheap.arena_start;
-		b = (uintptr*)(runtime_mheap.arena_start - off/wordsPerBitmapWord);
-		for(i = 0; i < size/PtrSize/wordsPerBitmapWord; i++) {
-			if(b[i] != 0)
-				runtime_throw("markspan: span bits not zero");
-		}
-	}
-
-	p = v;
-	if(leftover)	// mark a boundary just past end of last block too
-		n++;
-
-	b0 = nil;
-	x = 0;
-	for(; n-- > 0; p += size) {
-		// Okay to use non-atomic ops here, because we control
-		// the entire span, and each bitmap word has bits for only
-		// one span, so no other goroutines are changing these
-		// bitmap words.
-		off = (uintptr*)p - (uintptr*)runtime_mheap.arena_start;  // word offset
-		b = (uintptr*)runtime_mheap.arena_start - off/wordsPerBitmapWord - 1;
-		shift = off % wordsPerBitmapWord;
-		if(b0 != b) {
-			if(b0 != nil)
-				*b0 = x;
-			b0 = b;
-			x = 0;
-		}
-		x |= bitAllocated<<shift;
-	}
-	*b0 = x;
-}
-
-// unmark the span of memory at v of length n bytes.
-void
-runtime_unmarkspan(void *v, uintptr n)
-{
-	uintptr *p, *b, off;
-
-	if((byte*)v+n > (byte*)runtime_mheap.arena_used || (byte*)v < runtime_mheap.arena_start)
-		runtime_throw("markspan: bad pointer");
-
-	p = v;
-	off = p - (uintptr*)runtime_mheap.arena_start;  // word offset
-	if(off % wordsPerBitmapWord != 0)
-		runtime_throw("markspan: unaligned pointer");
-	b = (uintptr*)runtime_mheap.arena_start - off/wordsPerBitmapWord - 1;
-	n /= PtrSize;
-	if(n%wordsPerBitmapWord != 0)
-		runtime_throw("unmarkspan: unaligned length");
-	// Okay to use non-atomic ops here, because we control
-	// the entire span, and each bitmap word has bits for only
-	// one span, so no other goroutines are changing these
-	// bitmap words.
-	n /= wordsPerBitmapWord;
-	while(n-- > 0)
-		*b-- = 0;
-}
-
-void
-runtime_MHeap_MapBits(MHeap *h)
-{
-	size_t page_size;
-
-	// Caller has added extra mappings to the arena.
-	// Add extra mappings of bitmap words as needed.
-	// We allocate extra bitmap pieces in chunks of bitmapChunk.
-	enum {
-		bitmapChunk = 8192
-	};
-	uintptr n;
-
-	n = (h->arena_used - h->arena_start) / wordsPerBitmapWord;
-	n = ROUND(n, bitmapChunk);
-	n = ROUND(n, PageSize);
-	page_size = getpagesize();
-	n = ROUND(n, page_size);
-	if(h->bitmap_mapped >= n)
-		return;
-
-	runtime_SysMap(h->arena_start - n, n - h->bitmap_mapped, h->arena_reserved, &mstats.gc_sys);
-	h->bitmap_mapped = n;
-}
-
-// typedmemmove copies a value of type t to dst from src.
-
-extern void typedmemmove(const Type* td, void *dst, const void *src)
-  __asm__ (GOSYM_PREFIX "reflect.typedmemmove");
-
-void
-typedmemmove(const Type* td, void *dst, const void *src)
-{
-	runtime_memmove(dst, src, td->__size);
-}
-
-// typedslicecopy copies a slice of elemType values from src to dst,
-// returning the number of elements copied.
-
-extern intgo typedslicecopy(const Type* elem, Slice dst, Slice src)
-  __asm__ (GOSYM_PREFIX "reflect.typedslicecopy");
-
-intgo
-typedslicecopy(const Type* elem, Slice dst, Slice src)
-{
-	intgo n;
-	void *dstp;
-	void *srcp;
-
-	n = dst.__count;
-	if (n > src.__count)
-		n = src.__count;
-	if (n == 0)
-		return 0;
-	dstp = dst.__values;
-	srcp = src.__values;
-	memmove(dstp, srcp, (uintptr_t)n * elem->__size);
-	return n;
-}
diff --git a/third_party/gofrontend/libgo/runtime/mgc0.h b/third_party/gofrontend/libgo/runtime/mgc0.h
deleted file mode 100644
index 16000d1..0000000
--- a/third_party/gofrontend/libgo/runtime/mgc0.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Garbage collector (GC)
-
-// GC instruction opcodes.
-//
-// The opcode of an instruction is followed by zero or more
-// arguments to the instruction.
-//
-// Meaning of arguments:
-//   off      Offset (in bytes) from the start of the current object
-//   objgc    Pointer to GC info of an object
-//   objgcrel Offset to GC info of an object
-//   len      Length of an array
-//   elemsize Size (in bytes) of an element
-//   size     Size (in bytes)
-//
-// NOTE: There is a copy of these in ../reflect/type.go.
-// They must be kept in sync.
-enum {
-	GC_END,         // End of object, loop or subroutine. Args: none
-	GC_PTR,         // A typed pointer. Args: (off, objgc)
-	GC_APTR,        // Pointer to an arbitrary object. Args: (off)
-	GC_ARRAY_START, // Start an array with a fixed length. Args: (off, len, elemsize)
-	GC_ARRAY_NEXT,  // The next element of an array. Args: none
-	GC_CALL,        // Call a subroutine. Args: (off, objgcrel)
-	GC_CHAN_PTR,    // Go channel. Args: (off, ChanType*)
-	GC_STRING,      // Go string. Args: (off)
-	GC_EFACE,       // interface{}. Args: (off)
-	GC_IFACE,       // interface{...}. Args: (off)
-	GC_SLICE,       // Go slice. Args: (off, objgc)
-	GC_REGION,      // A region/part of the current object. Args: (off, size, objgc)
-
-	GC_NUM_INSTR,   // Number of instruction opcodes
-};
-
-enum {
-	// Size of GC's fixed stack.
-	//
-	// The current GC implementation permits:
-	//  - at most 1 stack allocation because of GC_CALL
-	//  - at most GC_STACK_CAPACITY allocations because of GC_ARRAY_START
-	GC_STACK_CAPACITY = 8,	
-};
-
-enum {
-	ScanStackByFrames = 1,
-	IgnorePreciseGC = 0,
-
-	// Four bits per word (see #defines below).
-	wordsPerBitmapWord = sizeof(void*)*8/4,
-	bitShift = sizeof(void*)*8/4,
-};
-
-// Bits in per-word bitmap.
-// #defines because enum might not be able to hold the values.
-//
-// Each word in the bitmap describes wordsPerBitmapWord words
-// of heap memory.  There are 4 bitmap bits dedicated to each heap word,
-// so on a 64-bit system there is one bitmap word per 16 heap words.
-// The bits in the word are packed together by type first, then by
-// heap location, so each 64-bit bitmap word consists of, from top to bottom,
-// the 16 bitMarked bits for the corresponding heap words,
-// then the 16 bitScan/bitBlockBoundary bits, then the 16 bitAllocated bits.
-// This layout makes it easier to iterate over the bits of a given type.
-//
-// The bitmap starts at mheap.arena_start and extends *backward* from
-// there.  On a 64-bit system the off'th word in the arena is tracked by
-// the off/16+1'th word before mheap.arena_start.  (On a 32-bit system,
-// the only difference is that the divisor is 8.)
-//
-// To pull out the bits corresponding to a given pointer p, we use:
-//
-//	off = p - (uintptr*)mheap.arena_start;  // word offset
-//	b = (uintptr*)mheap.arena_start - off/wordsPerBitmapWord - 1;
-//	shift = off % wordsPerBitmapWord
-//	bits = *b >> shift;
-//	/* then test bits & bitAllocated, bits & bitMarked, etc. */
-//
-#define bitAllocated		((uintptr)1<<(bitShift*0))	/* block start; eligible for garbage collection */
-#define bitScan			((uintptr)1<<(bitShift*1))	/* when bitAllocated is set */
-#define bitMarked		((uintptr)1<<(bitShift*2))	/* when bitAllocated is set */
-#define bitBlockBoundary	((uintptr)1<<(bitShift*1))	/* when bitAllocated is NOT set - mark for FlagNoGC objects */
-
-#define bitMask (bitAllocated | bitScan | bitMarked)
diff --git a/third_party/gofrontend/libgo/runtime/mheap.c b/third_party/gofrontend/libgo/runtime/mheap.c
deleted file mode 100644
index a4624fd..0000000
--- a/third_party/gofrontend/libgo/runtime/mheap.c
+++ /dev/null
@@ -1,950 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Page heap.
-//
-// See malloc.h for overview.
-//
-// When a MSpan is in the heap free list, state == MSpanFree
-// and heapmap(s->start) == span, heapmap(s->start+s->npages-1) == span.
-//
-// When a MSpan is allocated, state == MSpanInUse
-// and heapmap(i) == span for all s->start <= i < s->start+s->npages.
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-static MSpan *MHeap_AllocLocked(MHeap*, uintptr, int32);
-static bool MHeap_Grow(MHeap*, uintptr);
-static void MHeap_FreeLocked(MHeap*, MSpan*);
-static MSpan *MHeap_AllocLarge(MHeap*, uintptr);
-static MSpan *BestFit(MSpan*, uintptr, MSpan*);
-
-static void
-RecordSpan(void *vh, byte *p)
-{
-	MHeap *h;
-	MSpan *s;
-	MSpan **all;
-	uint32 cap;
-
-	h = vh;
-	s = (MSpan*)p;
-	if(h->nspan >= h->nspancap) {
-		cap = 64*1024/sizeof(all[0]);
-		if(cap < h->nspancap*3/2)
-			cap = h->nspancap*3/2;
-		all = (MSpan**)runtime_SysAlloc(cap*sizeof(all[0]), &mstats.other_sys);
-		if(all == nil)
-			runtime_throw("runtime: cannot allocate memory");
-		if(h->allspans) {
-			runtime_memmove(all, h->allspans, h->nspancap*sizeof(all[0]));
-			// Don't free the old array if it's referenced by sweep.
-			// See the comment in mgc0.c.
-			if(h->allspans != runtime_mheap.sweepspans)
-				runtime_SysFree(h->allspans, h->nspancap*sizeof(all[0]), &mstats.other_sys);
-		}
-		h->allspans = all;
-		h->nspancap = cap;
-	}
-	h->allspans[h->nspan++] = s;
-}
-
-// Initialize the heap; fetch memory using alloc.
-void
-runtime_MHeap_Init(MHeap *h)
-{
-	uint32 i;
-
-	runtime_FixAlloc_Init(&h->spanalloc, sizeof(MSpan), RecordSpan, h, &mstats.mspan_sys);
-	runtime_FixAlloc_Init(&h->cachealloc, sizeof(MCache), nil, nil, &mstats.mcache_sys);
-	runtime_FixAlloc_Init(&h->specialfinalizeralloc, sizeof(SpecialFinalizer), nil, nil, &mstats.other_sys);
-	runtime_FixAlloc_Init(&h->specialprofilealloc, sizeof(SpecialProfile), nil, nil, &mstats.other_sys);
-	// h->mapcache needs no init
-	for(i=0; i<nelem(h->free); i++) {
-		runtime_MSpanList_Init(&h->free[i]);
-		runtime_MSpanList_Init(&h->busy[i]);
-	}
-	runtime_MSpanList_Init(&h->freelarge);
-	runtime_MSpanList_Init(&h->busylarge);
-	for(i=0; i<nelem(h->central); i++)
-		runtime_MCentral_Init(&h->central[i].mcentral, i);
-}
-
-void
-runtime_MHeap_MapSpans(MHeap *h)
-{
-	uintptr pagesize;
-	uintptr n;
-
-	// Map spans array, PageSize at a time.
-	n = (uintptr)h->arena_used;
-	n -= (uintptr)h->arena_start;
-	n = n / PageSize * sizeof(h->spans[0]);
-	n = ROUND(n, PageSize);
-	pagesize = getpagesize();
-	n = ROUND(n, pagesize);
-	if(h->spans_mapped >= n)
-		return;
-	runtime_SysMap((byte*)h->spans + h->spans_mapped, n - h->spans_mapped, h->arena_reserved, &mstats.other_sys);
-	h->spans_mapped = n;
-}
-
-// Sweeps spans in list until reclaims at least npages into heap.
-// Returns the actual number of pages reclaimed.
-static uintptr
-MHeap_ReclaimList(MHeap *h, MSpan *list, uintptr npages)
-{
-	MSpan *s;
-	uintptr n;
-	uint32 sg;
-
-	n = 0;
-	sg = runtime_mheap.sweepgen;
-retry:
-	for(s = list->next; s != list; s = s->next) {
-		if(s->sweepgen == sg-2 && runtime_cas(&s->sweepgen, sg-2, sg-1)) {
-			runtime_MSpanList_Remove(s);
-			// swept spans are at the end of the list
-			runtime_MSpanList_InsertBack(list, s);
-			runtime_unlock(&h->lock);
-			n += runtime_MSpan_Sweep(s);
-			runtime_lock(&h->lock);
-			if(n >= npages)
-				return n;
-			// the span could have been moved elsewhere
-			goto retry;
-		}
-		if(s->sweepgen == sg-1) {
-			// the span is being sweept by background sweeper, skip
-			continue;
-		}
-		// already swept empty span,
-		// all subsequent ones must also be either swept or in process of sweeping
-		break;
-	}
-	return n;
-}
-
-// Sweeps and reclaims at least npage pages into heap.
-// Called before allocating npage pages.
-static void
-MHeap_Reclaim(MHeap *h, uintptr npage)
-{
-	uintptr reclaimed, n;
-
-	// First try to sweep busy spans with large objects of size >= npage,
-	// this has good chances of reclaiming the necessary space.
-	for(n=npage; n < nelem(h->busy); n++) {
-		if(MHeap_ReclaimList(h, &h->busy[n], npage))
-			return;  // Bingo!
-	}
-
-	// Then -- even larger objects.
-	if(MHeap_ReclaimList(h, &h->busylarge, npage))
-		return;  // Bingo!
-
-	// Now try smaller objects.
-	// One such object is not enough, so we need to reclaim several of them.
-	reclaimed = 0;
-	for(n=0; n < npage && n < nelem(h->busy); n++) {
-		reclaimed += MHeap_ReclaimList(h, &h->busy[n], npage-reclaimed);
-		if(reclaimed >= npage)
-			return;
-	}
-
-	// Now sweep everything that is not yet swept.
-	runtime_unlock(&h->lock);
-	for(;;) {
-		n = runtime_sweepone();
-		if(n == (uintptr)-1)  // all spans are swept
-			break;
-		reclaimed += n;
-		if(reclaimed >= npage)
-			break;
-	}
-	runtime_lock(&h->lock);
-}
-
-// Allocate a new span of npage pages from the heap
-// and record its size class in the HeapMap and HeapMapCache.
-MSpan*
-runtime_MHeap_Alloc(MHeap *h, uintptr npage, int32 sizeclass, bool large, bool needzero)
-{
-	MSpan *s;
-
-	runtime_lock(&h->lock);
-	mstats.heap_alloc += runtime_m()->mcache->local_cachealloc;
-	runtime_m()->mcache->local_cachealloc = 0;
-	s = MHeap_AllocLocked(h, npage, sizeclass);
-	if(s != nil) {
-		mstats.heap_inuse += npage<<PageShift;
-		if(large) {
-			mstats.heap_objects++;
-			mstats.heap_alloc += npage<<PageShift;
-			// Swept spans are at the end of lists.
-			if(s->npages < nelem(h->free))
-				runtime_MSpanList_InsertBack(&h->busy[s->npages], s);
-			else
-				runtime_MSpanList_InsertBack(&h->busylarge, s);
-		}
-	}
-	runtime_unlock(&h->lock);
-	if(s != nil) {
-		if(needzero && s->needzero)
-			runtime_memclr((byte*)(s->start<<PageShift), s->npages<<PageShift);
-		s->needzero = 0;
-	}
-	return s;
-}
-
-static MSpan*
-MHeap_AllocLocked(MHeap *h, uintptr npage, int32 sizeclass)
-{
-	uintptr n;
-	MSpan *s, *t;
-	PageID p;
-
-	// To prevent excessive heap growth, before allocating n pages
-	// we need to sweep and reclaim at least n pages.
-	if(!h->sweepdone)
-		MHeap_Reclaim(h, npage);
-
-	// Try in fixed-size lists up to max.
-	for(n=npage; n < nelem(h->free); n++) {
-		if(!runtime_MSpanList_IsEmpty(&h->free[n])) {
-			s = h->free[n].next;
-			goto HaveSpan;
-		}
-	}
-
-	// Best fit in list of large spans.
-	if((s = MHeap_AllocLarge(h, npage)) == nil) {
-		if(!MHeap_Grow(h, npage))
-			return nil;
-		if((s = MHeap_AllocLarge(h, npage)) == nil)
-			return nil;
-	}
-
-HaveSpan:
-	// Mark span in use.
-	if(s->state != MSpanFree)
-		runtime_throw("MHeap_AllocLocked - MSpan not free");
-	if(s->npages < npage)
-		runtime_throw("MHeap_AllocLocked - bad npages");
-	runtime_MSpanList_Remove(s);
-	runtime_atomicstore(&s->sweepgen, h->sweepgen);
-	s->state = MSpanInUse;
-	mstats.heap_idle -= s->npages<<PageShift;
-	mstats.heap_released -= s->npreleased<<PageShift;
-	if(s->npreleased > 0)
-		runtime_SysUsed((void*)(s->start<<PageShift), s->npages<<PageShift);
-	s->npreleased = 0;
-
-	if(s->npages > npage) {
-		// Trim extra and put it back in the heap.
-		t = runtime_FixAlloc_Alloc(&h->spanalloc);
-		runtime_MSpan_Init(t, s->start + npage, s->npages - npage);
-		s->npages = npage;
-		p = t->start;
-		p -= ((uintptr)h->arena_start>>PageShift);
-		if(p > 0)
-			h->spans[p-1] = s;
-		h->spans[p] = t;
-		h->spans[p+t->npages-1] = t;
-		t->needzero = s->needzero;
-		runtime_atomicstore(&t->sweepgen, h->sweepgen);
-		t->state = MSpanInUse;
-		MHeap_FreeLocked(h, t);
-		t->unusedsince = s->unusedsince; // preserve age
-	}
-	s->unusedsince = 0;
-
-	// Record span info, because gc needs to be
-	// able to map interior pointer to containing span.
-	s->sizeclass = sizeclass;
-	s->elemsize = (sizeclass==0 ? s->npages<<PageShift : (uintptr)runtime_class_to_size[sizeclass]);
-	s->types.compression = MTypes_Empty;
-	p = s->start;
-	p -= ((uintptr)h->arena_start>>PageShift);
-	for(n=0; n<npage; n++)
-		h->spans[p+n] = s;
-	return s;
-}
-
-// Allocate a span of exactly npage pages from the list of large spans.
-static MSpan*
-MHeap_AllocLarge(MHeap *h, uintptr npage)
-{
-	return BestFit(&h->freelarge, npage, nil);
-}
-
-// Search list for smallest span with >= npage pages.
-// If there are multiple smallest spans, take the one
-// with the earliest starting address.
-static MSpan*
-BestFit(MSpan *list, uintptr npage, MSpan *best)
-{
-	MSpan *s;
-
-	for(s=list->next; s != list; s=s->next) {
-		if(s->npages < npage)
-			continue;
-		if(best == nil
-		|| s->npages < best->npages
-		|| (s->npages == best->npages && s->start < best->start))
-			best = s;
-	}
-	return best;
-}
-
-// Try to add at least npage pages of memory to the heap,
-// returning whether it worked.
-static bool
-MHeap_Grow(MHeap *h, uintptr npage)
-{
-	uintptr ask;
-	void *v;
-	MSpan *s;
-	PageID p;
-
-	// Ask for a big chunk, to reduce the number of mappings
-	// the operating system needs to track; also amortizes
-	// the overhead of an operating system mapping.
-	// Allocate a multiple of 64kB (16 pages).
-	npage = (npage+15)&~15;
-	ask = npage<<PageShift;
-	if(ask < HeapAllocChunk)
-		ask = HeapAllocChunk;
-
-	v = runtime_MHeap_SysAlloc(h, ask);
-	if(v == nil) {
-		if(ask > (npage<<PageShift)) {
-			ask = npage<<PageShift;
-			v = runtime_MHeap_SysAlloc(h, ask);
-		}
-		if(v == nil) {
-			runtime_printf("runtime: out of memory: cannot allocate %D-byte block (%D in use)\n", (uint64)ask, mstats.heap_sys);
-			return false;
-		}
-	}
-
-	// Create a fake "in use" span and free it, so that the
-	// right coalescing happens.
-	s = runtime_FixAlloc_Alloc(&h->spanalloc);
-	runtime_MSpan_Init(s, (uintptr)v>>PageShift, ask>>PageShift);
-	p = s->start;
-	p -= ((uintptr)h->arena_start>>PageShift);
-	h->spans[p] = s;
-	h->spans[p + s->npages - 1] = s;
-	runtime_atomicstore(&s->sweepgen, h->sweepgen);
-	s->state = MSpanInUse;
-	MHeap_FreeLocked(h, s);
-	return true;
-}
-
-// Look up the span at the given address.
-// Address is guaranteed to be in map
-// and is guaranteed to be start or end of span.
-MSpan*
-runtime_MHeap_Lookup(MHeap *h, void *v)
-{
-	uintptr p;
-	
-	p = (uintptr)v;
-	p -= (uintptr)h->arena_start;
-	return h->spans[p >> PageShift];
-}
-
-// Look up the span at the given address.
-// Address is *not* guaranteed to be in map
-// and may be anywhere in the span.
-// Map entries for the middle of a span are only
-// valid for allocated spans.  Free spans may have
-// other garbage in their middles, so we have to
-// check for that.
-MSpan*
-runtime_MHeap_LookupMaybe(MHeap *h, void *v)
-{
-	MSpan *s;
-	PageID p, q;
-
-	if((byte*)v < h->arena_start || (byte*)v >= h->arena_used)
-		return nil;
-	p = (uintptr)v>>PageShift;
-	q = p;
-	q -= (uintptr)h->arena_start >> PageShift;
-	s = h->spans[q];
-	if(s == nil || p < s->start || (byte*)v >= s->limit || s->state != MSpanInUse)
-		return nil;
-	return s;
-}
-
-// Free the span back into the heap.
-void
-runtime_MHeap_Free(MHeap *h, MSpan *s, int32 acct)
-{
-	runtime_lock(&h->lock);
-	mstats.heap_alloc += runtime_m()->mcache->local_cachealloc;
-	runtime_m()->mcache->local_cachealloc = 0;
-	mstats.heap_inuse -= s->npages<<PageShift;
-	if(acct) {
-		mstats.heap_alloc -= s->npages<<PageShift;
-		mstats.heap_objects--;
-	}
-	MHeap_FreeLocked(h, s);
-	runtime_unlock(&h->lock);
-}
-
-static void
-MHeap_FreeLocked(MHeap *h, MSpan *s)
-{
-	MSpan *t;
-	PageID p;
-
-	s->types.compression = MTypes_Empty;
-
-	if(s->state != MSpanInUse || s->ref != 0 || s->sweepgen != h->sweepgen) {
-		runtime_printf("MHeap_FreeLocked - span %p ptr %p state %d ref %d sweepgen %d/%d\n",
-			s, s->start<<PageShift, s->state, s->ref, s->sweepgen, h->sweepgen);
-		runtime_throw("MHeap_FreeLocked - invalid free");
-	}
-	mstats.heap_idle += s->npages<<PageShift;
-	s->state = MSpanFree;
-	runtime_MSpanList_Remove(s);
-	// Stamp newly unused spans. The scavenger will use that
-	// info to potentially give back some pages to the OS.
-	s->unusedsince = runtime_nanotime();
-	s->npreleased = 0;
-
-	// Coalesce with earlier, later spans.
-	p = s->start;
-	p -= (uintptr)h->arena_start >> PageShift;
-	if(p > 0 && (t = h->spans[p-1]) != nil && t->state != MSpanInUse) {
-		s->start = t->start;
-		s->npages += t->npages;
-		s->npreleased = t->npreleased; // absorb released pages
-		s->needzero |= t->needzero;
-		p -= t->npages;
-		h->spans[p] = s;
-		runtime_MSpanList_Remove(t);
-		t->state = MSpanDead;
-		runtime_FixAlloc_Free(&h->spanalloc, t);
-	}
-	if((p+s->npages)*sizeof(h->spans[0]) < h->spans_mapped && (t = h->spans[p+s->npages]) != nil && t->state != MSpanInUse) {
-		s->npages += t->npages;
-		s->npreleased += t->npreleased;
-		s->needzero |= t->needzero;
-		h->spans[p + s->npages - 1] = s;
-		runtime_MSpanList_Remove(t);
-		t->state = MSpanDead;
-		runtime_FixAlloc_Free(&h->spanalloc, t);
-	}
-
-	// Insert s into appropriate list.
-	if(s->npages < nelem(h->free))
-		runtime_MSpanList_Insert(&h->free[s->npages], s);
-	else
-		runtime_MSpanList_Insert(&h->freelarge, s);
-}
-
-static void
-forcegchelper(void *vnote)
-{
-	Note *note = (Note*)vnote;
-
-	runtime_gc(1);
-	runtime_notewakeup(note);
-}
-
-static uintptr
-scavengelist(MSpan *list, uint64 now, uint64 limit)
-{
-	uintptr released, sumreleased, start, end, pagesize;
-	MSpan *s;
-
-	if(runtime_MSpanList_IsEmpty(list))
-		return 0;
-
-	sumreleased = 0;
-	for(s=list->next; s != list; s=s->next) {
-		if((now - s->unusedsince) > limit && s->npreleased != s->npages) {
-			released = (s->npages - s->npreleased) << PageShift;
-			mstats.heap_released += released;
-			sumreleased += released;
-			s->npreleased = s->npages;
-
-			start = s->start << PageShift;
-			end = start + (s->npages << PageShift);
-
-			// Round start up and end down to ensure we
-			// are acting on entire pages.
-			pagesize = getpagesize();
-			start = ROUND(start, pagesize);
-			end &= ~(pagesize - 1);
-			if(end > start)
-				runtime_SysUnused((void*)start, end - start);
-		}
-	}
-	return sumreleased;
-}
-
-static void
-scavenge(int32 k, uint64 now, uint64 limit)
-{
-	uint32 i;
-	uintptr sumreleased;
-	MHeap *h;
-	
-	h = &runtime_mheap;
-	sumreleased = 0;
-	for(i=0; i < nelem(h->free); i++)
-		sumreleased += scavengelist(&h->free[i], now, limit);
-	sumreleased += scavengelist(&h->freelarge, now, limit);
-
-	if(runtime_debug.gctrace > 0) {
-		if(sumreleased > 0)
-			runtime_printf("scvg%d: %D MB released\n", k, (uint64)sumreleased>>20);
-		runtime_printf("scvg%d: inuse: %D, idle: %D, sys: %D, released: %D, consumed: %D (MB)\n",
-			k, mstats.heap_inuse>>20, mstats.heap_idle>>20, mstats.heap_sys>>20,
-			mstats.heap_released>>20, (mstats.heap_sys - mstats.heap_released)>>20);
-	}
-}
-
-// Release (part of) unused memory to OS.
-// Goroutine created at startup.
-// Loop forever.
-void
-runtime_MHeap_Scavenger(void* dummy)
-{
-	G *g;
-	MHeap *h;
-	uint64 tick, now, forcegc, limit;
-	int64 unixnow;
-	uint32 k;
-	Note note, *notep;
-
-	USED(dummy);
-
-	g = runtime_g();
-	g->issystem = true;
-	g->isbackground = true;
-
-	// If we go two minutes without a garbage collection, force one to run.
-	forcegc = 2*60*1e9;
-	// If a span goes unused for 5 minutes after a garbage collection,
-	// we hand it back to the operating system.
-	limit = 5*60*1e9;
-	// Make wake-up period small enough for the sampling to be correct.
-	if(forcegc < limit)
-		tick = forcegc/2;
-	else
-		tick = limit/2;
-
-	h = &runtime_mheap;
-	for(k=0;; k++) {
-		runtime_noteclear(&note);
-		runtime_notetsleepg(&note, tick);
-
-		runtime_lock(&h->lock);
-		unixnow = runtime_unixnanotime();
-		if(unixnow - mstats.last_gc > forcegc) {
-			runtime_unlock(&h->lock);
-			// The scavenger can not block other goroutines,
-			// otherwise deadlock detector can fire spuriously.
-			// GC blocks other goroutines via the runtime_worldsema.
-			runtime_noteclear(&note);
-			notep = &note;
-			__go_go(forcegchelper, (void*)notep);
-			runtime_notetsleepg(&note, -1);
-			if(runtime_debug.gctrace > 0)
-				runtime_printf("scvg%d: GC forced\n", k);
-			runtime_lock(&h->lock);
-		}
-		now = runtime_nanotime();
-		scavenge(k, now, limit);
-		runtime_unlock(&h->lock);
-	}
-}
-
-void runtime_debug_freeOSMemory(void) __asm__("runtime_debug.freeOSMemory");
-
-void
-runtime_debug_freeOSMemory(void)
-{
-	runtime_gc(2);  // force GC and do eager sweep
-	runtime_lock(&runtime_mheap.lock);
-	scavenge(-1, ~(uintptr)0, 0);
-	runtime_unlock(&runtime_mheap.lock);
-}
-
-// Initialize a new span with the given start and npages.
-void
-runtime_MSpan_Init(MSpan *span, PageID start, uintptr npages)
-{
-	span->next = nil;
-	span->prev = nil;
-	span->start = start;
-	span->npages = npages;
-	span->freelist = nil;
-	span->ref = 0;
-	span->sizeclass = 0;
-	span->incache = false;
-	span->elemsize = 0;
-	span->state = MSpanDead;
-	span->unusedsince = 0;
-	span->npreleased = 0;
-	span->types.compression = MTypes_Empty;
-	span->specialLock.key = 0;
-	span->specials = nil;
-	span->needzero = 0;
-	span->freebuf = nil;
-}
-
-// Initialize an empty doubly-linked list.
-void
-runtime_MSpanList_Init(MSpan *list)
-{
-	list->state = MSpanListHead;
-	list->next = list;
-	list->prev = list;
-}
-
-void
-runtime_MSpanList_Remove(MSpan *span)
-{
-	if(span->prev == nil && span->next == nil)
-		return;
-	span->prev->next = span->next;
-	span->next->prev = span->prev;
-	span->prev = nil;
-	span->next = nil;
-}
-
-bool
-runtime_MSpanList_IsEmpty(MSpan *list)
-{
-	return list->next == list;
-}
-
-void
-runtime_MSpanList_Insert(MSpan *list, MSpan *span)
-{
-	if(span->next != nil || span->prev != nil) {
-		runtime_printf("failed MSpanList_Insert %p %p %p\n", span, span->next, span->prev);
-		runtime_throw("MSpanList_Insert");
-	}
-	span->next = list->next;
-	span->prev = list;
-	span->next->prev = span;
-	span->prev->next = span;
-}
-
-void
-runtime_MSpanList_InsertBack(MSpan *list, MSpan *span)
-{
-	if(span->next != nil || span->prev != nil) {
-		runtime_printf("failed MSpanList_Insert %p %p %p\n", span, span->next, span->prev);
-		runtime_throw("MSpanList_Insert");
-	}
-	span->next = list;
-	span->prev = list->prev;
-	span->next->prev = span;
-	span->prev->next = span;
-}
-
-// Adds the special record s to the list of special records for
-// the object p.  All fields of s should be filled in except for
-// offset & next, which this routine will fill in.
-// Returns true if the special was successfully added, false otherwise.
-// (The add will fail only if a record with the same p and s->kind
-//  already exists.)
-static bool
-addspecial(void *p, Special *s)
-{
-	MSpan *span;
-	Special **t, *x;
-	uintptr offset;
-	byte kind;
-
-	span = runtime_MHeap_LookupMaybe(&runtime_mheap, p);
-	if(span == nil)
-		runtime_throw("addspecial on invalid pointer");
-
-	// Ensure that the span is swept.
-	// GC accesses specials list w/o locks. And it's just much safer.
-	runtime_m()->locks++;
-	runtime_MSpan_EnsureSwept(span);
-
-	offset = (uintptr)p - (span->start << PageShift);
-	kind = s->kind;
-
-	runtime_lock(&span->specialLock);
-
-	// Find splice point, check for existing record.
-	t = &span->specials;
-	while((x = *t) != nil) {
-		if(offset == x->offset && kind == x->kind) {
-			runtime_unlock(&span->specialLock);
-			runtime_m()->locks--;
-			return false; // already exists
-		}
-		if(offset < x->offset || (offset == x->offset && kind < x->kind))
-			break;
-		t = &x->next;
-	}
-	// Splice in record, fill in offset.
-	s->offset = offset;
-	s->next = x;
-	*t = s;
-	runtime_unlock(&span->specialLock);
-	runtime_m()->locks--;
-	return true;
-}
-
-// Removes the Special record of the given kind for the object p.
-// Returns the record if the record existed, nil otherwise.
-// The caller must FixAlloc_Free the result.
-static Special*
-removespecial(void *p, byte kind)
-{
-	MSpan *span;
-	Special *s, **t;
-	uintptr offset;
-
-	span = runtime_MHeap_LookupMaybe(&runtime_mheap, p);
-	if(span == nil)
-		runtime_throw("removespecial on invalid pointer");
-
-	// Ensure that the span is swept.
-	// GC accesses specials list w/o locks. And it's just much safer.
-	runtime_m()->locks++;
-	runtime_MSpan_EnsureSwept(span);
-
-	offset = (uintptr)p - (span->start << PageShift);
-
-	runtime_lock(&span->specialLock);
-	t = &span->specials;
-	while((s = *t) != nil) {
-		// This function is used for finalizers only, so we don't check for
-		// "interior" specials (p must be exactly equal to s->offset).
-		if(offset == s->offset && kind == s->kind) {
-			*t = s->next;
-			runtime_unlock(&span->specialLock);
-			runtime_m()->locks--;
-			return s;
-		}
-		t = &s->next;
-	}
-	runtime_unlock(&span->specialLock);
-	runtime_m()->locks--;
-	return nil;
-}
-
-// Adds a finalizer to the object p.  Returns true if it succeeded.
-bool
-runtime_addfinalizer(void *p, FuncVal *f, const FuncType *ft, const PtrType *ot)
-{
-	SpecialFinalizer *s;
-
-	runtime_lock(&runtime_mheap.speciallock);
-	s = runtime_FixAlloc_Alloc(&runtime_mheap.specialfinalizeralloc);
-	runtime_unlock(&runtime_mheap.speciallock);
-	s->special.kind = KindSpecialFinalizer;
-	s->fn = f;
-	s->ft = ft;
-	s->ot = ot;
-	if(addspecial(p, &s->special))
-		return true;
-
-	// There was an old finalizer
-	runtime_lock(&runtime_mheap.speciallock);
-	runtime_FixAlloc_Free(&runtime_mheap.specialfinalizeralloc, s);
-	runtime_unlock(&runtime_mheap.speciallock);
-	return false;
-}
-
-// Removes the finalizer (if any) from the object p.
-void
-runtime_removefinalizer(void *p)
-{
-	SpecialFinalizer *s;
-
-	s = (SpecialFinalizer*)removespecial(p, KindSpecialFinalizer);
-	if(s == nil)
-		return; // there wasn't a finalizer to remove
-	runtime_lock(&runtime_mheap.speciallock);
-	runtime_FixAlloc_Free(&runtime_mheap.specialfinalizeralloc, s);
-	runtime_unlock(&runtime_mheap.speciallock);
-}
-
-// Set the heap profile bucket associated with addr to b.
-void
-runtime_setprofilebucket(void *p, Bucket *b)
-{
-	SpecialProfile *s;
-
-	runtime_lock(&runtime_mheap.speciallock);
-	s = runtime_FixAlloc_Alloc(&runtime_mheap.specialprofilealloc);
-	runtime_unlock(&runtime_mheap.speciallock);
-	s->special.kind = KindSpecialProfile;
-	s->b = b;
-	if(!addspecial(p, &s->special))
-		runtime_throw("setprofilebucket: profile already set");
-}
-
-// Do whatever cleanup needs to be done to deallocate s.  It has
-// already been unlinked from the MSpan specials list.
-// Returns true if we should keep working on deallocating p.
-bool
-runtime_freespecial(Special *s, void *p, uintptr size, bool freed)
-{
-	SpecialFinalizer *sf;
-	SpecialProfile *sp;
-
-	switch(s->kind) {
-	case KindSpecialFinalizer:
-		sf = (SpecialFinalizer*)s;
-		runtime_queuefinalizer(p, sf->fn, sf->ft, sf->ot);
-		runtime_lock(&runtime_mheap.speciallock);
-		runtime_FixAlloc_Free(&runtime_mheap.specialfinalizeralloc, sf);
-		runtime_unlock(&runtime_mheap.speciallock);
-		return false; // don't free p until finalizer is done
-	case KindSpecialProfile:
-		sp = (SpecialProfile*)s;
-		runtime_MProf_Free(sp->b, size, freed);
-		runtime_lock(&runtime_mheap.speciallock);
-		runtime_FixAlloc_Free(&runtime_mheap.specialprofilealloc, sp);
-		runtime_unlock(&runtime_mheap.speciallock);
-		return true;
-	default:
-		runtime_throw("bad special kind");
-		return true;
-	}
-}
-
-// Free all special records for p.
-void
-runtime_freeallspecials(MSpan *span, void *p, uintptr size)
-{
-	Special *s, **t, *list;
-	uintptr offset;
-
-	if(span->sweepgen != runtime_mheap.sweepgen)
-		runtime_throw("runtime: freeallspecials: unswept span");
-	// first, collect all specials into the list; then, free them
-	// this is required to not cause deadlock between span->specialLock and proflock
-	list = nil;
-	offset = (uintptr)p - (span->start << PageShift);
-	runtime_lock(&span->specialLock);
-	t = &span->specials;
-	while((s = *t) != nil) {
-		if(offset + size <= s->offset)
-			break;
-		if(offset <= s->offset) {
-			*t = s->next;
-			s->next = list;
-			list = s;
-		} else
-			t = &s->next;
-	}
-	runtime_unlock(&span->specialLock);
-
-	while(list != nil) {
-		s = list;
-		list = s->next;
-		if(!runtime_freespecial(s, p, size, true))
-			runtime_throw("can't explicitly free an object with a finalizer");
-	}
-}
-
-// Split an allocated span into two equal parts.
-void
-runtime_MHeap_SplitSpan(MHeap *h, MSpan *s)
-{
-	MSpan *t;
-	MCentral *c;
-	uintptr i;
-	uintptr npages;
-	PageID p;
-
-	if(s->state != MSpanInUse)
-		runtime_throw("MHeap_SplitSpan on a free span");
-	if(s->sizeclass != 0 && s->ref != 1)
-		runtime_throw("MHeap_SplitSpan doesn't have an allocated object");
-	npages = s->npages;
-
-	// remove the span from whatever list it is in now
-	if(s->sizeclass > 0) {
-		// must be in h->central[x].empty
-		c = &h->central[s->sizeclass].mcentral;
-		runtime_lock(&c->lock);
-		runtime_MSpanList_Remove(s);
-		runtime_unlock(&c->lock);
-		runtime_lock(&h->lock);
-	} else {
-		// must be in h->busy/busylarge
-		runtime_lock(&h->lock);
-		runtime_MSpanList_Remove(s);
-	}
-	// heap is locked now
-
-	if(npages == 1) {
-		// convert span of 1 PageSize object to a span of 2 PageSize/2 objects.
-		s->ref = 2;
-		s->sizeclass = runtime_SizeToClass(PageSize/2);
-		s->elemsize = PageSize/2;
-	} else {
-		// convert span of n>1 pages into two spans of n/2 pages each.
-		if((s->npages & 1) != 0)
-			runtime_throw("MHeap_SplitSpan on an odd size span");
-
-		// compute position in h->spans
-		p = s->start;
-		p -= (uintptr)h->arena_start >> PageShift;
-
-		// Allocate a new span for the first half.
-		t = runtime_FixAlloc_Alloc(&h->spanalloc);
-		runtime_MSpan_Init(t, s->start, npages/2);
-		t->limit = (byte*)((t->start + npages/2) << PageShift);
-		t->state = MSpanInUse;
-		t->elemsize = npages << (PageShift - 1);
-		t->sweepgen = s->sweepgen;
-		if(t->elemsize <= MaxSmallSize) {
-			t->sizeclass = runtime_SizeToClass(t->elemsize);
-			t->ref = 1;
-		}
-
-		// the old span holds the second half.
-		s->start += npages/2;
-		s->npages = npages/2;
-		s->elemsize = npages << (PageShift - 1);
-		if(s->elemsize <= MaxSmallSize) {
-			s->sizeclass = runtime_SizeToClass(s->elemsize);
-			s->ref = 1;
-		}
-
-		// update span lookup table
-		for(i = p; i < p + npages/2; i++)
-			h->spans[i] = t;
-	}
-
-	// place the span into a new list
-	if(s->sizeclass > 0) {
-		runtime_unlock(&h->lock);
-		c = &h->central[s->sizeclass].mcentral;
-		runtime_lock(&c->lock);
-		// swept spans are at the end of the list
-		runtime_MSpanList_InsertBack(&c->empty, s);
-		runtime_unlock(&c->lock);
-	} else {
-		// Swept spans are at the end of lists.
-		if(s->npages < nelem(h->free))
-			runtime_MSpanList_InsertBack(&h->busy[s->npages], s);
-		else
-			runtime_MSpanList_InsertBack(&h->busylarge, s);
-		runtime_unlock(&h->lock);
-	}
-}
diff --git a/third_party/gofrontend/libgo/runtime/mprof.goc b/third_party/gofrontend/libgo/runtime/mprof.goc
deleted file mode 100644
index 4e8cfc9..0000000
--- a/third_party/gofrontend/libgo/runtime/mprof.goc
+++ /dev/null
@@ -1,562 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Malloc profiling.
-// Patterned after tcmalloc's algorithms; shorter code.
-
-package runtime
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-#include "defs.h"
-#include "go-type.h"
-#include "go-string.h"
-
-// NOTE(rsc): Everything here could use cas if contention became an issue.
-static Lock proflock;
-
-// All memory allocations are local and do not escape outside of the profiler.
-// The profiler is forbidden from referring to garbage-collected memory.
-
-enum { MProf, BProf };  // profile types
-
-// Per-call-stack profiling information.
-// Lookup by hashing call stack into a linked-list hash table.
-struct Bucket
-{
-	Bucket	*next;	// next in hash list
-	Bucket	*allnext;	// next in list of all mbuckets/bbuckets
-	int32	typ;
-	// Generally unions can break precise GC,
-	// this one is fine because it does not contain pointers.
-	union
-	{
-		struct  // typ == MProf
-		{
-			// The following complex 3-stage scheme of stats accumulation
-			// is required to obtain a consistent picture of mallocs and frees
-			// for some point in time.
-			// The problem is that mallocs come in real time, while frees
-			// come only after a GC during concurrent sweeping. So if we would
-			// naively count them, we would get a skew toward mallocs.
-			//
-			// Mallocs are accounted in recent stats.
-			// Explicit frees are accounted in recent stats.
-			// GC frees are accounted in prev stats.
-			// After GC prev stats are added to final stats and
-			// recent stats are moved into prev stats.
-			uintptr	allocs;
-			uintptr	frees;
-			uintptr	alloc_bytes;
-			uintptr	free_bytes;
-
-			uintptr	prev_allocs;  // since last but one till last gc
-			uintptr	prev_frees;
-			uintptr	prev_alloc_bytes;
-			uintptr	prev_free_bytes;
-
-			uintptr	recent_allocs;  // since last gc till now
-			uintptr	recent_frees;
-			uintptr	recent_alloc_bytes;
-			uintptr	recent_free_bytes;
-
-		};
-		struct  // typ == BProf
-		{
-			int64	count;
-			int64	cycles;
-		};
-	};
-	uintptr	hash;	// hash of size + stk
-	uintptr	size;
-	uintptr	nstk;
-	Location stk[1];
-};
-enum {
-	BuckHashSize = 179999,
-};
-static Bucket **buckhash;
-static Bucket *mbuckets;  // memory profile buckets
-static Bucket *bbuckets;  // blocking profile buckets
-static uintptr bucketmem;
-
-// Return the bucket for stk[0:nstk], allocating new bucket if needed.
-static Bucket*
-stkbucket(int32 typ, uintptr size, Location *stk, int32 nstk, bool alloc)
-{
-	int32 i, j;
-	uintptr h;
-	Bucket *b;
-
-	if(buckhash == nil) {
-		buckhash = runtime_SysAlloc(BuckHashSize*sizeof buckhash[0], &mstats.buckhash_sys);
-		if(buckhash == nil)
-			runtime_throw("runtime: cannot allocate memory");
-	}
-
-	// Hash stack.
-	h = 0;
-	for(i=0; i<nstk; i++) {
-		h += stk[i].pc;
-		h += h<<10;
-		h ^= h>>6;
-	}
-	// hash in size
-	h += size;
-	h += h<<10;
-	h ^= h>>6;
-	// finalize
-	h += h<<3;
-	h ^= h>>11;
-
-	i = h%BuckHashSize;
-	for(b = buckhash[i]; b; b=b->next) {
-		if(b->typ == typ && b->hash == h && b->size == size && b->nstk == (uintptr)nstk) {
-			for(j = 0; j < nstk; j++) {
-				if(b->stk[j].pc != stk[j].pc ||
-				   b->stk[j].lineno != stk[j].lineno ||
-				   !__go_strings_equal(b->stk[j].filename, stk[j].filename))
-					break;
-			}
-			if (j == nstk)
-				return b;
-		}
-	}
-
-	if(!alloc)
-		return nil;
-
-	b = runtime_persistentalloc(sizeof *b + nstk*sizeof stk[0], 0, &mstats.buckhash_sys);
-	bucketmem += sizeof *b + nstk*sizeof stk[0];
-	runtime_memmove(b->stk, stk, nstk*sizeof stk[0]);
-	b->typ = typ;
-	b->hash = h;
-	b->size = size;
-	b->nstk = nstk;
-	b->next = buckhash[i];
-	buckhash[i] = b;
-	if(typ == MProf) {
-		b->allnext = mbuckets;
-		mbuckets = b;
-	} else {
-		b->allnext = bbuckets;
-		bbuckets = b;
-	}
-	return b;
-}
-
-static void
-MProf_GC(void)
-{
-	Bucket *b;
-
-	for(b=mbuckets; b; b=b->allnext) {
-		b->allocs += b->prev_allocs;
-		b->frees += b->prev_frees;
-		b->alloc_bytes += b->prev_alloc_bytes;
-		b->free_bytes += b->prev_free_bytes;
-
-		b->prev_allocs = b->recent_allocs;
-		b->prev_frees = b->recent_frees;
-		b->prev_alloc_bytes = b->recent_alloc_bytes;
-		b->prev_free_bytes = b->recent_free_bytes;
-
-		b->recent_allocs = 0;
-		b->recent_frees = 0;
-		b->recent_alloc_bytes = 0;
-		b->recent_free_bytes = 0;
-	}
-}
-
-// Record that a gc just happened: all the 'recent' statistics are now real.
-void
-runtime_MProf_GC(void)
-{
-	runtime_lock(&proflock);
-	MProf_GC();
-	runtime_unlock(&proflock);
-}
-
-// Called by malloc to record a profiled block.
-void
-runtime_MProf_Malloc(void *p, uintptr size)
-{
-	Location stk[32];
-	Bucket *b;
-	int32 nstk;
-
-	nstk = runtime_callers(1, stk, nelem(stk), false);
-	runtime_lock(&proflock);
-	b = stkbucket(MProf, size, stk, nstk, true);
-	b->recent_allocs++;
-	b->recent_alloc_bytes += size;
-	runtime_unlock(&proflock);
-
-	// Setprofilebucket locks a bunch of other mutexes, so we call it outside of proflock.
-	// This reduces potential contention and chances of deadlocks.
-	// Since the object must be alive during call to MProf_Malloc,
-	// it's fine to do this non-atomically.
-	runtime_setprofilebucket(p, b);
-}
-
-// Called when freeing a profiled block.
-void
-runtime_MProf_Free(Bucket *b, uintptr size, bool freed)
-{
-	runtime_lock(&proflock);
-	if(freed) {
-		b->recent_frees++;
-		b->recent_free_bytes += size;
-	} else {
-		b->prev_frees++;
-		b->prev_free_bytes += size;
-	}
-	runtime_unlock(&proflock);
-}
-
-int64 runtime_blockprofilerate;  // in CPU ticks
-
-void runtime_SetBlockProfileRate(intgo) __asm__ (GOSYM_PREFIX "runtime.SetBlockProfileRate");
-
-void
-runtime_SetBlockProfileRate(intgo rate)
-{
-	int64 r;
-
-	if(rate <= 0)
-		r = 0;  // disable profiling
-	else {
-		// convert ns to cycles, use float64 to prevent overflow during multiplication
-		r = (float64)rate*runtime_tickspersecond()/(1000*1000*1000);
-		if(r == 0)
-			r = 1;
-	}
-	runtime_atomicstore64((uint64*)&runtime_blockprofilerate, r);
-}
-
-void
-runtime_blockevent(int64 cycles, int32 skip)
-{
-	int32 nstk;
-	int64 rate;
-	Location stk[32];
-	Bucket *b;
-
-	if(cycles <= 0)
-		return;
-	rate = runtime_atomicload64((uint64*)&runtime_blockprofilerate);
-	if(rate <= 0 || (rate > cycles && runtime_fastrand1()%rate > cycles))
-		return;
-
-	nstk = runtime_callers(skip, stk, nelem(stk), false);
-	runtime_lock(&proflock);
-	b = stkbucket(BProf, 0, stk, nstk, true);
-	b->count++;
-	b->cycles += cycles;
-	runtime_unlock(&proflock);
-}
-
-// Go interface to profile data.  (Declared in debug.go)
-
-// Must match MemProfileRecord in debug.go.
-typedef struct Record Record;
-struct Record {
-	int64 alloc_bytes, free_bytes;
-	int64 alloc_objects, free_objects;
-	uintptr stk[32];
-};
-
-// Write b's data to r.
-static void
-record(Record *r, Bucket *b)
-{
-	uint32 i;
-
-	r->alloc_bytes = b->alloc_bytes;
-	r->free_bytes = b->free_bytes;
-	r->alloc_objects = b->allocs;
-	r->free_objects = b->frees;
-	for(i=0; i<b->nstk && i<nelem(r->stk); i++)
-		r->stk[i] = b->stk[i].pc;
-	for(; i<nelem(r->stk); i++)
-		r->stk[i] = 0;
-}
-
-func MemProfile(p Slice, include_inuse_zero bool) (n int, ok bool) {
-	Bucket *b;
-	Record *r;
-	bool clear;
-
-	runtime_lock(&proflock);
-	n = 0;
-	clear = true;
-	for(b=mbuckets; b; b=b->allnext) {
-		if(include_inuse_zero || b->alloc_bytes != b->free_bytes)
-			n++;
-		if(b->allocs != 0 || b->frees != 0)
-			clear = false;
-	}
-	if(clear) {
-		// Absolutely no data, suggesting that a garbage collection
-		// has not yet happened. In order to allow profiling when
-		// garbage collection is disabled from the beginning of execution,
-		// accumulate stats as if a GC just happened, and recount buckets.
-		MProf_GC();
-		MProf_GC();
-		n = 0;
-		for(b=mbuckets; b; b=b->allnext)
-			if(include_inuse_zero || b->alloc_bytes != b->free_bytes)
-				n++;
-	}
-	ok = false;
-	if(n <= p.__count) {
-		ok = true;
-		r = (Record*)p.__values;
-		for(b=mbuckets; b; b=b->allnext)
-			if(include_inuse_zero || b->alloc_bytes != b->free_bytes)
-				record(r++, b);
-	}
-	runtime_unlock(&proflock);
-}
-
-void
-runtime_MProf_Mark(struct Workbuf **wbufp, void (*enqueue1)(struct Workbuf**, Obj))
-{
-	// buckhash is not allocated via mallocgc.
-	enqueue1(wbufp, (Obj){(byte*)&mbuckets, sizeof mbuckets, 0});
-	enqueue1(wbufp, (Obj){(byte*)&bbuckets, sizeof bbuckets, 0});
-}
-
-void
-runtime_iterate_memprof(void (*callback)(Bucket*, uintptr, Location*, uintptr, uintptr, uintptr))
-{
-	Bucket *b;
-
-	runtime_lock(&proflock);
-	for(b=mbuckets; b; b=b->allnext) {
-		callback(b, b->nstk, b->stk, b->size, b->allocs, b->frees);
-	}
-	runtime_unlock(&proflock);
-}
-
-// Must match BlockProfileRecord in debug.go.
-typedef struct BRecord BRecord;
-struct BRecord {
-	int64 count;
-	int64 cycles;
-	uintptr stk[32];
-};
-
-func BlockProfile(p Slice) (n int, ok bool) {
-	Bucket *b;
-	BRecord *r;
-	int32 i;
-
-	runtime_lock(&proflock);
-	n = 0;
-	for(b=bbuckets; b; b=b->allnext)
-		n++;
-	ok = false;
-	if(n <= p.__count) {
-		ok = true;
-		r = (BRecord*)p.__values;
-		for(b=bbuckets; b; b=b->allnext, r++) {
-			r->count = b->count;
-			r->cycles = b->cycles;
-			for(i=0; (uintptr)i<b->nstk && (uintptr)i<nelem(r->stk); i++)
-				r->stk[i] = b->stk[i].pc;
-			for(; (uintptr)i<nelem(r->stk); i++)
-				r->stk[i] = 0;			
-		}
-	}
-	runtime_unlock(&proflock);
-}
-
-// Must match StackRecord in debug.go.
-typedef struct TRecord TRecord;
-struct TRecord {
-	uintptr stk[32];
-};
-
-func ThreadCreateProfile(p Slice) (n int, ok bool) {
-	TRecord *r;
-	M *first, *mp;
-	int32 i;
-	
-	first = runtime_atomicloadp(&runtime_allm);
-	n = 0;
-	for(mp=first; mp; mp=mp->alllink)
-		n++;
-	ok = false;
-	if(n <= p.__count) {
-		ok = true;
-		r = (TRecord*)p.__values;
-		for(mp=first; mp; mp=mp->alllink) {
-			for(i = 0; (uintptr)i < nelem(r->stk); i++) {
-				r->stk[i] = mp->createstack[i].pc;
-			}
-			r++;
-		}
-	}
-}
-
-func Stack(b Slice, all bool) (n int) {
-	byte *pc;
-	bool enablegc = false;
-	
-	pc = (byte*)(uintptr)runtime_getcallerpc(&b);
-
-	if(all) {
-		runtime_semacquire(&runtime_worldsema, false);
-		runtime_m()->gcing = 1;
-		runtime_stoptheworld();
-		enablegc = mstats.enablegc;
-		mstats.enablegc = false;
-	}
-
-	if(b.__count == 0)
-		n = 0;
-	else{
-		G* g = runtime_g();
-		g->writebuf = (byte*)b.__values;
-		g->writenbuf = b.__count;
-		USED(pc);
-		runtime_goroutineheader(g);
-		runtime_traceback();
-		runtime_printcreatedby(g);
-		if(all)
-			runtime_tracebackothers(g);
-		n = b.__count - g->writenbuf;
-		g->writebuf = nil;
-		g->writenbuf = 0;
-	}
-	
-	if(all) {
-		runtime_m()->gcing = 0;
-		mstats.enablegc = enablegc;
-		runtime_semrelease(&runtime_worldsema);
-		runtime_starttheworld();
-	}
-}
-
-static void
-saveg(G *gp, TRecord *r)
-{
-	int32 n, i;
-	Location locstk[nelem(r->stk)];
-
-	if(gp == runtime_g()) {
-		n = runtime_callers(0, locstk, nelem(r->stk), false);
-		for(i = 0; i < n; i++)
-			r->stk[i] = locstk[i].pc;
-	}
-	else {
-		// FIXME: Not implemented.
-		n = 0;
-	}
-	if((size_t)n < nelem(r->stk))
-		r->stk[n] = 0;
-}
-
-func GoroutineProfile(b Slice) (n int, ok bool) {
-	uintptr i;
-	TRecord *r;
-	G *gp;
-	
-	ok = false;
-	n = runtime_gcount();
-	if(n <= b.__count) {
-		runtime_semacquire(&runtime_worldsema, false);
-		runtime_m()->gcing = 1;
-		runtime_stoptheworld();
-
-		n = runtime_gcount();
-		if(n <= b.__count) {
-			G* g = runtime_g();
-			ok = true;
-			r = (TRecord*)b.__values;
-			saveg(g, r++);
-			for(i = 0; i < runtime_allglen; i++) {
-				gp = runtime_allg[i];
-				if(gp == g || gp->status == Gdead)
-					continue;
-				saveg(gp, r++);
-			}
-		}
-	
-		runtime_m()->gcing = 0;
-		runtime_semrelease(&runtime_worldsema);
-		runtime_starttheworld();
-	}
-}
-
-// Tracing of alloc/free/gc.
-
-static Lock tracelock;
-
-static const char*
-typeinfoname(int32 typeinfo)
-{
-	if(typeinfo == TypeInfo_SingleObject)
-		return "single object";
-	else if(typeinfo == TypeInfo_Array)
-		return "array";
-	else if(typeinfo == TypeInfo_Chan)
-		return "channel";
-	runtime_throw("typinfoname: unknown type info");
-	return nil;
-}
-
-void
-runtime_tracealloc(void *p, uintptr size, uintptr typ)
-{
-	const char *name;
-	Type *type;
-
-	runtime_lock(&tracelock);
-	runtime_m()->traceback = 2;
-	type = (Type*)(typ & ~3);
-	name = typeinfoname(typ & 3);
-	if(type == nil)
-		runtime_printf("tracealloc(%p, %p, %s)\n", p, size, name);
-	else	
-		runtime_printf("tracealloc(%p, %p, %s of %S)\n", p, size, name, *type->__reflection);
-	if(runtime_m()->curg == nil || runtime_g() == runtime_m()->curg) {
-		runtime_goroutineheader(runtime_g());
-		runtime_traceback();
-	} else {
-		runtime_goroutineheader(runtime_m()->curg);
-		runtime_traceback();
-	}
-	runtime_printf("\n");
-	runtime_m()->traceback = 0;
-	runtime_unlock(&tracelock);
-}
-
-void
-runtime_tracefree(void *p, uintptr size)
-{
-	runtime_lock(&tracelock);
-	runtime_m()->traceback = 2;
-	runtime_printf("tracefree(%p, %p)\n", p, size);
-	runtime_goroutineheader(runtime_g());
-	runtime_traceback();
-	runtime_printf("\n");
-	runtime_m()->traceback = 0;
-	runtime_unlock(&tracelock);
-}
-
-void
-runtime_tracegc(void)
-{
-	runtime_lock(&tracelock);
-	runtime_m()->traceback = 2;
-	runtime_printf("tracegc()\n");
-	// running on m->g0 stack; show all non-g0 goroutines
-	runtime_tracebackothers(runtime_g());
-	runtime_printf("end tracegc\n");
-	runtime_printf("\n");
-	runtime_m()->traceback = 0;
-	runtime_unlock(&tracelock);
-}
diff --git a/third_party/gofrontend/libgo/runtime/msize.c b/third_party/gofrontend/libgo/runtime/msize.c
deleted file mode 100644
index 34509d0..0000000
--- a/third_party/gofrontend/libgo/runtime/msize.c
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Malloc small size classes.
-//
-// See malloc.h for overview.
-//
-// The size classes are chosen so that rounding an allocation
-// request up to the next size class wastes at most 12.5% (1.125x).
-//
-// Each size class has its own page count that gets allocated
-// and chopped up when new objects of the size class are needed.
-// That page count is chosen so that chopping up the run of
-// pages into objects of the given size wastes at most 12.5% (1.125x)
-// of the memory.  It is not necessary that the cutoff here be
-// the same as above.
-//
-// The two sources of waste multiply, so the worst possible case
-// for the above constraints would be that allocations of some
-// size might have a 26.6% (1.266x) overhead.
-// In practice, only one of the wastes comes into play for a
-// given size (sizes < 512 waste mainly on the round-up,
-// sizes > 512 waste mainly on the page chopping).
-//
-// TODO(rsc): Compute max waste for any given size.
-
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-int32 runtime_class_to_size[NumSizeClasses];
-int32 runtime_class_to_allocnpages[NumSizeClasses];
-
-// The SizeToClass lookup is implemented using two arrays,
-// one mapping sizes <= 1024 to their class and one mapping
-// sizes >= 1024 and <= MaxSmallSize to their class.
-// All objects are 8-aligned, so the first array is indexed by
-// the size divided by 8 (rounded up).  Objects >= 1024 bytes
-// are 128-aligned, so the second array is indexed by the
-// size divided by 128 (rounded up).  The arrays are filled in
-// by InitSizes.
-
-int8 runtime_size_to_class8[1024/8 + 1];
-int8 runtime_size_to_class128[(MaxSmallSize-1024)/128 + 1];
-
-int32
-runtime_SizeToClass(int32 size)
-{
-	if(size > MaxSmallSize)
-		runtime_throw("SizeToClass - invalid size");
-	if(size > 1024-8)
-		return runtime_size_to_class128[(size-1024+127) >> 7];
-	return runtime_size_to_class8[(size+7)>>3];
-}
-
-void
-runtime_InitSizes(void)
-{
-	int32 align, sizeclass, size, nextsize, n;
-	uint32 i;
-	uintptr allocsize, npages;
-
-	// Initialize the runtime_class_to_size table (and choose class sizes in the process).
-	runtime_class_to_size[0] = 0;
-	sizeclass = 1;	// 0 means no class
-	align = 8;
-	for(size = align; size <= MaxSmallSize; size += align) {
-		if((size&(size-1)) == 0) {	// bump alignment once in a while
-			if(size >= 2048)
-				align = 256;
-			else if(size >= 128)
-				align = size / 8;
-			else if(size >= 16)
-				align = 16;	// required for x86 SSE instructions, if we want to use them
-		}
-		if((align&(align-1)) != 0)
-			runtime_throw("InitSizes - bug");
-
-		// Make the allocnpages big enough that
-		// the leftover is less than 1/8 of the total,
-		// so wasted space is at most 12.5%.
-		allocsize = PageSize;
-		while(allocsize%size > allocsize/8)
-			allocsize += PageSize;
-		npages = allocsize >> PageShift;
-
-		// If the previous sizeclass chose the same
-		// allocation size and fit the same number of
-		// objects into the page, we might as well
-		// use just this size instead of having two
-		// different sizes.
-		if(sizeclass > 1 &&
-			(int32)npages == runtime_class_to_allocnpages[sizeclass-1] &&
-			allocsize/size == allocsize/runtime_class_to_size[sizeclass-1]) {
-			runtime_class_to_size[sizeclass-1] = size;
-			continue;
-		}
-
-		runtime_class_to_allocnpages[sizeclass] = npages;
-		runtime_class_to_size[sizeclass] = size;
-		sizeclass++;
-	}
-	if(sizeclass != NumSizeClasses) {
-		runtime_printf("sizeclass=%d NumSizeClasses=%d\n", sizeclass, NumSizeClasses);
-		runtime_throw("InitSizes - bad NumSizeClasses");
-	}
-
-	// Initialize the size_to_class tables.
-	nextsize = 0;
-	for (sizeclass = 1; sizeclass < NumSizeClasses; sizeclass++) {
-		for(; nextsize < 1024 && nextsize <= runtime_class_to_size[sizeclass]; nextsize+=8)
-			runtime_size_to_class8[nextsize/8] = sizeclass;
-		if(nextsize >= 1024)
-			for(; nextsize <= runtime_class_to_size[sizeclass]; nextsize += 128)
-				runtime_size_to_class128[(nextsize-1024)/128] = sizeclass;
-	}
-
-	// Double-check SizeToClass.
-	if(0) {
-		for(n=0; n < MaxSmallSize; n++) {
-			sizeclass = runtime_SizeToClass(n);
-			if(sizeclass < 1 || sizeclass >= NumSizeClasses || runtime_class_to_size[sizeclass] < n) {
-				runtime_printf("size=%d sizeclass=%d runtime_class_to_size=%d\n", n, sizeclass, runtime_class_to_size[sizeclass]);
-				runtime_printf("incorrect SizeToClass");
-				goto dump;
-			}
-			if(sizeclass > 1 && runtime_class_to_size[sizeclass-1] >= n) {
-				runtime_printf("size=%d sizeclass=%d runtime_class_to_size=%d\n", n, sizeclass, runtime_class_to_size[sizeclass]);
-				runtime_printf("SizeToClass too big");
-				goto dump;
-			}
-		}
-	}
-
-	// Copy out for statistics table.
-	for(i=0; i<nelem(runtime_class_to_size); i++)
-		mstats.by_size[i].size = runtime_class_to_size[i];
-	return;
-
-dump:
-	if(1){
-		runtime_printf("NumSizeClasses=%d\n", NumSizeClasses);
-		runtime_printf("runtime_class_to_size:");
-		for(sizeclass=0; sizeclass<NumSizeClasses; sizeclass++)
-			runtime_printf(" %d", runtime_class_to_size[sizeclass]);
-		runtime_printf("\n\n");
-		runtime_printf("size_to_class8:");
-		for(i=0; i<nelem(runtime_size_to_class8); i++)
-			runtime_printf(" %d=>%d(%d)\n", i*8, runtime_size_to_class8[i],
-				runtime_class_to_size[runtime_size_to_class8[i]]);
-		runtime_printf("\n");
-		runtime_printf("size_to_class128:");
-		for(i=0; i<nelem(runtime_size_to_class128); i++)
-			runtime_printf(" %d=>%d(%d)\n", i*128, runtime_size_to_class128[i],
-				runtime_class_to_size[runtime_size_to_class128[i]]);
-		runtime_printf("\n");
-	}
-	runtime_throw("InitSizes failed");
-}
-
-// Returns size of the memory block that mallocgc will allocate if you ask for the size.
-uintptr
-runtime_roundupsize(uintptr size)
-{
-	if(size < MaxSmallSize) {
-		if(size <= 1024-8)
-			return runtime_class_to_size[runtime_size_to_class8[(size+7)>>3]];
-		else
-			return runtime_class_to_size[runtime_size_to_class128[(size-1024+127) >> 7]];
-	}
-	if(size + PageSize < size)
-		return size;
-	return ROUND(size, PageSize);
-}
diff --git a/third_party/gofrontend/libgo/runtime/netpoll.goc b/third_party/gofrontend/libgo/runtime/netpoll.goc
deleted file mode 100644
index 55ce9c4..0000000
--- a/third_party/gofrontend/libgo/runtime/netpoll.goc
+++ /dev/null
@@ -1,472 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
-
-package net
-
-#include "runtime.h"
-#include "defs.h"
-#include "arch.h"
-#include "malloc.h"
-
-// Map gccgo field names to gc field names.
-// Eface aka __go_empty_interface.
-#define type __type_descriptor
-#define data __object
-
-// Integrated network poller (platform-independent part).
-// A particular implementation (epoll/kqueue) must define the following functions:
-// void runtime_netpollinit(void);			// to initialize the poller
-// int32 runtime_netpollopen(uintptr fd, PollDesc *pd);	// to arm edge-triggered notifications
-							// and associate fd with pd.
-// An implementation must call the following function to denote that the pd is ready.
-// void runtime_netpollready(G **gpp, PollDesc *pd, int32 mode);
-
-// PollDesc contains 2 binary semaphores, rg and wg, to park reader and writer
-// goroutines respectively. The semaphore can be in the following states:
-// READY - io readiness notification is pending;
-//         a goroutine consumes the notification by changing the state to nil.
-// WAIT - a goroutine prepares to park on the semaphore, but not yet parked;
-//        the goroutine commits to park by changing the state to G pointer,
-//        or, alternatively, concurrent io notification changes the state to READY,
-//        or, alternatively, concurrent timeout/close changes the state to nil.
-// G pointer - the goroutine is blocked on the semaphore;
-//             io notification or timeout/close changes the state to READY or nil respectively
-//             and unparks the goroutine.
-// nil - nothing of the above.
-#define READY ((G*)1)
-#define WAIT  ((G*)2)
-
-enum
-{
-	PollBlockSize	= 4*1024,
-};
-
-struct PollDesc
-{
-	PollDesc* link;	// in pollcache, protected by pollcache.Lock
-
-	// The lock protects pollOpen, pollSetDeadline, pollUnblock and deadlineimpl operations.
-	// This fully covers seq, rt and wt variables. fd is constant throughout the PollDesc lifetime.
-	// pollReset, pollWait, pollWaitCanceled and runtime_netpollready (IO rediness notification)
-	// proceed w/o taking the lock. So closing, rg, rd, wg and wd are manipulated
-	// in a lock-free way by all operations.
-	Lock	lock;	// protectes the following fields
-	uintptr	fd;
-	bool	closing;
-	uintptr	seq;	// protects from stale timers and ready notifications
-	G*	rg;	// READY, WAIT, G waiting for read or nil
-	Timer	rt;	// read deadline timer (set if rt.fv != nil)
-	int64	rd;	// read deadline
-	G*	wg;	// READY, WAIT, G waiting for write or nil
-	Timer	wt;	// write deadline timer
-	int64	wd;	// write deadline
-	void*	user;	// user settable cookie
-};
-
-static struct
-{
-	Lock		lock;
-	PollDesc*	first;
-	// PollDesc objects must be type-stable,
-	// because we can get ready notification from epoll/kqueue
-	// after the descriptor is closed/reused.
-	// Stale notifications are detected using seq variable,
-	// seq is incremented when deadlines are changed or descriptor is reused.
-} pollcache;
-
-static bool	netpollblock(PollDesc*, int32, bool);
-static G*	netpollunblock(PollDesc*, int32, bool);
-static void	deadline(Eface, uintptr);
-static void	readDeadline(Eface, uintptr);
-static void	writeDeadline(Eface, uintptr);
-static PollDesc*	allocPollDesc(void);
-static intgo	checkerr(PollDesc *pd, int32 mode);
-
-static FuncVal deadlineFn	= {(void(*)(void))deadline};
-static FuncVal readDeadlineFn	= {(void(*)(void))readDeadline};
-static FuncVal writeDeadlineFn	= {(void(*)(void))writeDeadline};
-
-// runtimeNano returns the current value of the runtime clock in nanoseconds.
-func runtimeNano() (ns int64) {
-	ns = runtime_nanotime();
-}
-
-func runtime_pollServerInit() {
-	runtime_netpollinit();
-}
-
-func runtime_pollOpen(fd uintptr) (pd *PollDesc, errno int) {
-	pd = allocPollDesc();
-	runtime_lock(&pd->lock);
-	if(pd->wg != nil && pd->wg != READY)
-		runtime_throw("runtime_pollOpen: blocked write on free descriptor");
-	if(pd->rg != nil && pd->rg != READY)
-		runtime_throw("runtime_pollOpen: blocked read on free descriptor");
-	pd->fd = fd;
-	pd->closing = false;
-	pd->seq++;
-	pd->rg = nil;
-	pd->rd = 0;
-	pd->wg = nil;
-	pd->wd = 0;
-	runtime_unlock(&pd->lock);
-
-	errno = runtime_netpollopen(fd, pd);
-}
-
-func runtime_pollClose(pd *PollDesc) {
-	if(!pd->closing)
-		runtime_throw("runtime_pollClose: close w/o unblock");
-	if(pd->wg != nil && pd->wg != READY)
-		runtime_throw("runtime_pollClose: blocked write on closing descriptor");
-	if(pd->rg != nil && pd->rg != READY)
-		runtime_throw("runtime_pollClose: blocked read on closing descriptor");
-	runtime_netpollclose(pd->fd);
-	runtime_lock(&pollcache.lock);
-	pd->link = pollcache.first;
-	pollcache.first = pd;
-	runtime_unlock(&pollcache.lock);
-}
-
-func runtime_pollReset(pd *PollDesc, mode int) (err int) {
-	err = checkerr(pd, mode);
-	if(err)
-		goto ret;
-	if(mode == 'r')
-		pd->rg = nil;
-	else if(mode == 'w')
-		pd->wg = nil;
-ret:
-}
-
-func runtime_pollWait(pd *PollDesc, mode int) (err int) {
-	err = checkerr(pd, mode);
-	if(err == 0) {
-		// As for now only Solaris uses level-triggered IO.
-		if(Solaris)
-			runtime_netpollarm(pd, mode);
-		while(!netpollblock(pd, mode, false)) {
-			err = checkerr(pd, mode);
-			if(err != 0)
-				break;
-			// Can happen if timeout has fired and unblocked us,
-			// but before we had a chance to run, timeout has been reset.
-			// Pretend it has not happened and retry.
-		}
-	}
-}
-
-func runtime_pollWaitCanceled(pd *PollDesc, mode int) {
-	// This function is used only on windows after a failed attempt to cancel
-	// a pending async IO operation. Wait for ioready, ignore closing or timeouts.
-	while(!netpollblock(pd, mode, true))
-		;
-}
-
-func runtime_pollSetDeadline(pd *PollDesc, d int64, mode int) {
-	G *rg, *wg;
-
-	runtime_lock(&pd->lock);
-	if(pd->closing) {
-		runtime_unlock(&pd->lock);
-		return;
-	}
-	pd->seq++;  // invalidate current timers
-	// Reset current timers.
-	if(pd->rt.fv) {
-		runtime_deltimer(&pd->rt);
-		pd->rt.fv = nil;
-	}
-	if(pd->wt.fv) {
-		runtime_deltimer(&pd->wt);
-		pd->wt.fv = nil;
-	}
-	// Setup new timers.
-	if(d != 0 && d <= runtime_nanotime())
-		d = -1;
-	if(mode == 'r' || mode == 'r'+'w')
-		pd->rd = d;
-	if(mode == 'w' || mode == 'r'+'w')
-		pd->wd = d;
-	if(pd->rd > 0 && pd->rd == pd->wd) {
-		pd->rt.fv = &deadlineFn;
-		pd->rt.when = pd->rd;
-		// Copy current seq into the timer arg.
-		// Timer func will check the seq against current descriptor seq,
-		// if they differ the descriptor was reused or timers were reset.
-		pd->rt.arg.type = nil; // should be *pollDesc type descriptor.
-		pd->rt.arg.data = pd;
-		pd->rt.seq = pd->seq;
-		runtime_addtimer(&pd->rt);
-	} else {
-		if(pd->rd > 0) {
-			pd->rt.fv = &readDeadlineFn;
-			pd->rt.when = pd->rd;
-			pd->rt.arg.type = nil; // should be *pollDesc type descriptor.
-			pd->rt.arg.data = pd;
-			pd->rt.seq = pd->seq;
-			runtime_addtimer(&pd->rt);
-		}
-		if(pd->wd > 0) {
-			pd->wt.fv = &writeDeadlineFn;
-			pd->wt.when = pd->wd;
-			pd->wt.arg.type = nil; // should be *pollDesc type descriptor.
-			pd->wt.arg.data = pd;
-			pd->wt.seq = pd->seq;
-			runtime_addtimer(&pd->wt);
-		}
-	}
-	// If we set the new deadline in the past, unblock currently pending IO if any.
-	rg = nil;
-	runtime_atomicstorep(&wg, nil);  // full memory barrier between stores to rd/wd and load of rg/wg in netpollunblock
-	if(pd->rd < 0)
-		rg = netpollunblock(pd, 'r', false);
-	if(pd->wd < 0)
-		wg = netpollunblock(pd, 'w', false);
-	runtime_unlock(&pd->lock);
-	if(rg)
-		runtime_ready(rg);
-	if(wg)
-		runtime_ready(wg);
-}
-
-func runtime_pollUnblock(pd *PollDesc) {
-	G *rg, *wg;
-
-	runtime_lock(&pd->lock);
-	if(pd->closing)
-		runtime_throw("runtime_pollUnblock: already closing");
-	pd->closing = true;
-	pd->seq++;
-	runtime_atomicstorep(&rg, nil);  // full memory barrier between store to closing and read of rg/wg in netpollunblock
-	rg = netpollunblock(pd, 'r', false);
-	wg = netpollunblock(pd, 'w', false);
-	if(pd->rt.fv) {
-		runtime_deltimer(&pd->rt);
-		pd->rt.fv = nil;
-	}
-	if(pd->wt.fv) {
-		runtime_deltimer(&pd->wt);
-		pd->wt.fv = nil;
-	}
-	runtime_unlock(&pd->lock);
-	if(rg)
-		runtime_ready(rg);
-	if(wg)
-		runtime_ready(wg);
-}
-
-uintptr
-runtime_netpollfd(PollDesc *pd)
-{
-	return pd->fd;
-}
-
-void**
-runtime_netpolluser(PollDesc *pd)
-{
-	return &pd->user;
-}
-
-bool
-runtime_netpollclosing(PollDesc *pd)
-{
-	return pd->closing;
-}
-
-void
-runtime_netpolllock(PollDesc *pd)
-{
-	runtime_lock(&pd->lock);
-}
-
-void
-runtime_netpollunlock(PollDesc *pd)
-{
-	runtime_unlock(&pd->lock);
-}
-
-// make pd ready, newly runnable goroutines (if any) are enqueued info gpp list
-void
-runtime_netpollready(G **gpp, PollDesc *pd, int32 mode)
-{
-	G *rg, *wg;
-
-	rg = wg = nil;
-	if(mode == 'r' || mode == 'r'+'w')
-		rg = netpollunblock(pd, 'r', true);
-	if(mode == 'w' || mode == 'r'+'w')
-		wg = netpollunblock(pd, 'w', true);
-	if(rg) {
-		rg->schedlink = *gpp;
-		*gpp = rg;
-	}
-	if(wg) {
-		wg->schedlink = *gpp;
-		*gpp = wg;
-	}
-}
-
-static intgo
-checkerr(PollDesc *pd, int32 mode)
-{
-	if(pd->closing)
-		return 1;  // errClosing
-	if((mode == 'r' && pd->rd < 0) || (mode == 'w' && pd->wd < 0))
-		return 2;  // errTimeout
-	return 0;
-}
-
-static bool
-blockcommit(G *gp, G **gpp)
-{
-	return runtime_casp(gpp, WAIT, gp);
-}
-
-// returns true if IO is ready, or false if timedout or closed
-// waitio - wait only for completed IO, ignore errors
-static bool
-netpollblock(PollDesc *pd, int32 mode, bool waitio)
-{
-	G **gpp, *old;
-
-	gpp = &pd->rg;
-	if(mode == 'w')
-		gpp = &pd->wg;
-
-	// set the gpp semaphore to WAIT
-	for(;;) {
-		old = *gpp;
-		if(old == READY) {
-			*gpp = nil;
-			return true;
-		}
-		if(old != nil)
-			runtime_throw("netpollblock: double wait");
-		if(runtime_casp(gpp, nil, WAIT))
-			break;
-	}
-
-	// need to recheck error states after setting gpp to WAIT
-	// this is necessary because runtime_pollUnblock/runtime_pollSetDeadline/deadlineimpl
-	// do the opposite: store to closing/rd/wd, membarrier, load of rg/wg
-	if(waitio || checkerr(pd, mode) == 0)
-		runtime_park((bool(*)(G*, void*))blockcommit, gpp, "IO wait");
-	// be careful to not lose concurrent READY notification
-	old = runtime_xchgp(gpp, nil);
-	if(old > WAIT)
-		runtime_throw("netpollblock: corrupted state");
-	return old == READY;
-}
-
-static G*
-netpollunblock(PollDesc *pd, int32 mode, bool ioready)
-{
-	G **gpp, *old, *new;
-
-	gpp = &pd->rg;
-	if(mode == 'w')
-		gpp = &pd->wg;
-
-	for(;;) {
-		old = *gpp;
-		if(old == READY)
-			return nil;
-		if(old == nil && !ioready) {
-			// Only set READY for ioready. runtime_pollWait
-			// will check for timeout/cancel before waiting.
-			return nil;
-		}
-		new = nil;
-		if(ioready)
-			new = READY;
-		if(runtime_casp(gpp, old, new))
-			break;
-	}
-	if(old > WAIT)
-		return old;  // must be G*
-	return nil;
-}
-
-static void
-deadlineimpl(Eface arg, uintptr seq, bool read, bool write)
-{
-	PollDesc *pd;
-	G *rg, *wg;
-
-	pd = (PollDesc*)arg.data;
-	rg = wg = nil;
-	runtime_lock(&pd->lock);
-	// Seq arg is seq when the timer was set.
-	// If it's stale, ignore the timer event.
-	if(seq != pd->seq) {
-		// The descriptor was reused or timers were reset.
-		runtime_unlock(&pd->lock);
-		return;
-	}
-	if(read) {
-		if(pd->rd <= 0 || pd->rt.fv == nil)
-			runtime_throw("deadlineimpl: inconsistent read deadline");
-		pd->rd = -1;
-		runtime_atomicstorep(&pd->rt.fv, nil);  // full memory barrier between store to rd and load of rg in netpollunblock
-		rg = netpollunblock(pd, 'r', false);
-	}
-	if(write) {
-		if(pd->wd <= 0 || (pd->wt.fv == nil && !read))
-			runtime_throw("deadlineimpl: inconsistent write deadline");
-		pd->wd = -1;
-		runtime_atomicstorep(&pd->wt.fv, nil);  // full memory barrier between store to wd and load of wg in netpollunblock
-		wg = netpollunblock(pd, 'w', false);
-	}
-	runtime_unlock(&pd->lock);
-	if(rg)
-		runtime_ready(rg);
-	if(wg)
-		runtime_ready(wg);
-}
-
-static void
-deadline(Eface arg, uintptr seq)
-{
-	deadlineimpl(arg, seq, true, true);
-}
-
-static void
-readDeadline(Eface arg, uintptr seq)
-{
-	deadlineimpl(arg, seq, true, false);
-}
-
-static void
-writeDeadline(Eface arg, uintptr seq)
-{
-	deadlineimpl(arg, seq, false, true);
-}
-
-static PollDesc*
-allocPollDesc(void)
-{
-	PollDesc *pd;
-	uint32 i, n;
-
-	runtime_lock(&pollcache.lock);
-	if(pollcache.first == nil) {
-		n = PollBlockSize/sizeof(*pd);
-		if(n == 0)
-			n = 1;
-		// Must be in non-GC memory because can be referenced
-		// only from epoll/kqueue internals.
-		pd = runtime_persistentalloc(n*sizeof(*pd), 0, &mstats.other_sys);
-		for(i = 0; i < n; i++) {
-			pd[i].link = pollcache.first;
-			pollcache.first = &pd[i];
-		}
-	}
-	pd = pollcache.first;
-	pollcache.first = pd->link;
-	runtime_unlock(&pollcache.lock);
-	return pd;
-}
diff --git a/third_party/gofrontend/libgo/runtime/netpoll_epoll.c b/third_party/gofrontend/libgo/runtime/netpoll_epoll.c
deleted file mode 100644
index 1281f45..0000000
--- a/third_party/gofrontend/libgo/runtime/netpoll_epoll.c
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build linux
-
-#include <errno.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/epoll.h>
-
-#include "runtime.h"
-#include "defs.h"
-#include "malloc.h"
-
-#ifndef EPOLLRDHUP
-#define EPOLLRDHUP 0x2000
-#endif
-
-#ifndef EPOLL_CLOEXEC
-#define EPOLL_CLOEXEC 02000000
-#endif
-
-#ifndef HAVE_EPOLL_CREATE1
-extern int epoll_create1(int __flags);
-#endif
-
-typedef struct epoll_event EpollEvent;
-
-static int32
-runtime_epollcreate(int32 size)
-{
-	int r;
-
-	r = epoll_create(size);
-	if(r >= 0)
-		return r;
-	return - errno;
-}
-
-static int32
-runtime_epollcreate1(int32 flags)
-{
-	int r;
-
-	r = epoll_create1(flags);
-	if(r >= 0)
-		return r;
-	return - errno;
-}
-
-static int32
-runtime_epollctl(int32 epfd, int32 op, int32 fd, EpollEvent *ev)
-{
-	int r;
-
-	r = epoll_ctl(epfd, op, fd, ev);
-	if(r >= 0)
-		return r;
-	return - errno;
-}
-
-static int32
-runtime_epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout)
-{
-	int r;
-
-	r = epoll_wait(epfd, ev, nev, timeout);
-	if(r >= 0)
-		return r;
-	return - errno;
-}
-
-static void
-runtime_closeonexec(int32 fd)
-{
-	fcntl(fd, F_SETFD, FD_CLOEXEC);
-}
-
-static int32 epfd = -1;  // epoll descriptor
-
-void
-runtime_netpollinit(void)
-{
-	epfd = runtime_epollcreate1(EPOLL_CLOEXEC);
-	if(epfd >= 0)
-		return;
-	epfd = runtime_epollcreate(1024);
-	if(epfd >= 0) {
-		runtime_closeonexec(epfd);
-		return;
-	}
-	runtime_printf("netpollinit: failed to create descriptor (%d)\n", -epfd);
-	runtime_throw("netpollinit: failed to create descriptor");
-}
-
-int32
-runtime_netpollopen(uintptr fd, PollDesc *pd)
-{
-	EpollEvent ev;
-	int32 res;
-
-	ev.events = EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET;
-	ev.data.ptr = (void*)pd;
-	res = runtime_epollctl(epfd, EPOLL_CTL_ADD, (int32)fd, &ev);
-	return -res;
-}
-
-int32
-runtime_netpollclose(uintptr fd)
-{
-	EpollEvent ev;
-	int32 res;
-
-	res = runtime_epollctl(epfd, EPOLL_CTL_DEL, (int32)fd, &ev);
-	return -res;
-}
-
-void
-runtime_netpollarm(PollDesc* pd, int32 mode)
-{
-	USED(pd);
-	USED(mode);
-	runtime_throw("unused");
-}
-
-// polls for ready network connections
-// returns list of goroutines that become runnable
-G*
-runtime_netpoll(bool block)
-{
-	static int32 lasterr;
-	EpollEvent events[128], *ev;
-	int32 n, i, waitms, mode;
-	G *gp;
-
-	if(epfd == -1)
-		return nil;
-	waitms = -1;
-	if(!block)
-		waitms = 0;
-retry:
-	n = runtime_epollwait(epfd, events, nelem(events), waitms);
-	if(n < 0) {
-		if(n != -EINTR && n != lasterr) {
-			lasterr = n;
-			runtime_printf("runtime: epollwait on fd %d failed with %d\n", epfd, -n);
-		}
-		goto retry;
-	}
-	gp = nil;
-	for(i = 0; i < n; i++) {
-		ev = &events[i];
-		if(ev->events == 0)
-			continue;
-		mode = 0;
-		if(ev->events & (EPOLLIN|EPOLLRDHUP|EPOLLHUP|EPOLLERR))
-			mode += 'r';
-		if(ev->events & (EPOLLOUT|EPOLLHUP|EPOLLERR))
-			mode += 'w';
-		if(mode)
-			runtime_netpollready(&gp, (void*)ev->data.ptr, mode);
-	}
-	if(block && gp == nil)
-		goto retry;
-	return gp;
-}
-
-void
-runtime_netpoll_scan(struct Workbuf** wbufp, void (*enqueue1)(struct Workbuf**, Obj))
-{
-	USED(wbufp);
-	USED(enqueue1);
-}
diff --git a/third_party/gofrontend/libgo/runtime/netpoll_kqueue.c b/third_party/gofrontend/libgo/runtime/netpoll_kqueue.c
deleted file mode 100644
index 5144a87..0000000
--- a/third_party/gofrontend/libgo/runtime/netpoll_kqueue.c
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd netbsd openbsd
-
-#include "runtime.h"
-#include "defs.h"
-#include "malloc.h"
-
-// Integrated network poller (kqueue-based implementation).
-
-int32	runtime_kqueue(void);
-int32	runtime_kevent(int32, Kevent*, int32, Kevent*, int32, Timespec*);
-void	runtime_closeonexec(int32);
-
-static int32 kq = -1;
-
-void
-runtime_netpollinit(void)
-{
-	kq = runtime_kqueue();
-	if(kq < 0) {
-		runtime_printf("netpollinit: kqueue failed with %d\n", -kq);
-		runtime_throw("netpollinit: kqueue failed");
-	}
-	runtime_closeonexec(kq);
-}
-
-int32
-runtime_netpollopen(uintptr fd, PollDesc *pd)
-{
-	Kevent ev[2];
-	int32 n;
-
-	// Arm both EVFILT_READ and EVFILT_WRITE in edge-triggered mode (EV_CLEAR)
-	// for the whole fd lifetime.  The notifications are automatically unregistered
-	// when fd is closed.
-	ev[0].ident = (uint32)fd;
-	ev[0].filter = EVFILT_READ;
-	ev[0].flags = EV_ADD|EV_CLEAR;
-	ev[0].fflags = 0;
-	ev[0].data = 0;
-	ev[0].udata = (kevent_udata)pd;
-	ev[1] = ev[0];
-	ev[1].filter = EVFILT_WRITE;
-	n = runtime_kevent(kq, ev, 2, nil, 0, nil);
-	if(n < 0)
-		return -n;
-	return 0;
-}
-
-int32
-runtime_netpollclose(uintptr fd)
-{
-	// Don't need to unregister because calling close()
-	// on fd will remove any kevents that reference the descriptor.
-	USED(fd);
-	return 0;
-}
-
-void
-runtime_netpollarm(PollDesc* pd, int32 mode)
-{
-	USED(pd, mode);
-	runtime_throw("unused");
-}
-
-// Polls for ready network connections.
-// Returns list of goroutines that become runnable.
-G*
-runtime_netpoll(bool block)
-{
-	static int32 lasterr;
-	Kevent events[64], *ev;
-	Timespec ts, *tp;
-	int32 n, i, mode;
-	G *gp;
-
-	if(kq == -1)
-		return nil;
-	tp = nil;
-	if(!block) {
-		ts.tv_sec = 0;
-		ts.tv_nsec = 0;
-		tp = &ts;
-	}
-	gp = nil;
-retry:
-	n = runtime_kevent(kq, nil, 0, events, nelem(events), tp);
-	if(n < 0) {
-		if(n != -EINTR && n != lasterr) {
-			lasterr = n;
-			runtime_printf("runtime: kevent on fd %d failed with %d\n", kq, -n);
-		}
-		goto retry;
-	}
-	for(i = 0; i < n; i++) {
-		ev = &events[i];
-		mode = 0;
-		if(ev->filter == EVFILT_READ)
-			mode += 'r';
-		if(ev->filter == EVFILT_WRITE)
-			mode += 'w';
-		if(mode)
-			runtime_netpollready(&gp, (PollDesc*)ev->udata, mode);
-	}
-	if(block && gp == nil)
-		goto retry;
-	return gp;
-}
-
-void
-runtime_netpoll_scan(struct Workbuf** wbufp, void (*enqueue1)(struct Workbuf**, Obj))
-{
-	USED(wbufp);
-	USED(enqueue1);
-}
diff --git a/third_party/gofrontend/libgo/runtime/netpoll_select.c b/third_party/gofrontend/libgo/runtime/netpoll_select.c
deleted file mode 100644
index 033661d..0000000
--- a/third_party/gofrontend/libgo/runtime/netpoll_select.c
+++ /dev/null
@@ -1,256 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build solaris
-
-#include "config.h"
-
-#include <errno.h>
-#include <sys/times.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#ifdef HAVE_SYS_SELECT_H
-#include <sys/select.h>
-#endif
-
-#include "runtime.h"
-#include "malloc.h"
-
-static Lock selectlock;
-static int rdwake;
-static int wrwake;
-static fd_set fds;
-static PollDesc **data;
-static int allocated;
-
-void
-runtime_netpollinit(void)
-{
-	int p[2];
-	int fl;
-
-	FD_ZERO(&fds);
-	allocated = 128;
-	data = runtime_mallocgc(allocated * sizeof(PollDesc *), 0,
-				FlagNoScan|FlagNoProfiling|FlagNoInvokeGC);
-
-	if(pipe(p) < 0)
-		runtime_throw("netpollinit: failed to create pipe");
-	rdwake = p[0];
-	wrwake = p[1];
-
-	fl = fcntl(rdwake, F_GETFL);
-	if(fl < 0)
-		runtime_throw("netpollinit: fcntl failed");
-	fl |= O_NONBLOCK;
-	if(fcntl(rdwake, F_SETFL, fl))
-		 runtime_throw("netpollinit: fcntl failed");
-	fcntl(rdwake, F_SETFD, FD_CLOEXEC);
-
-	fl = fcntl(wrwake, F_GETFL);
-	if(fl < 0)
-		runtime_throw("netpollinit: fcntl failed");
-	fl |= O_NONBLOCK;
-	if(fcntl(wrwake, F_SETFL, fl))
-		 runtime_throw("netpollinit: fcntl failed");
-	fcntl(wrwake, F_SETFD, FD_CLOEXEC);
-
-	FD_SET(rdwake, &fds);
-}
-
-int32
-runtime_netpollopen(uintptr fd, PollDesc *pd)
-{
-	byte b;
-
-	runtime_lock(&selectlock);
-
-	if((int)fd >= allocated) {
-		int c;
-		PollDesc **n;
-
-		c = allocated;
-
-		runtime_unlock(&selectlock);
-
-		while((int)fd >= c)
-			c *= 2;
-		n = runtime_mallocgc(c * sizeof(PollDesc *), 0,
-				     FlagNoScan|FlagNoProfiling|FlagNoInvokeGC);
-
-		runtime_lock(&selectlock);
-
-		if(c > allocated) {
-			__builtin_memcpy(n, data, allocated * sizeof(PollDesc *));
-			allocated = c;
-			data = n;
-		}
-	}
-	FD_SET(fd, &fds);
-	data[fd] = pd;
-
-	runtime_unlock(&selectlock);
-
-	b = 0;
-	write(wrwake, &b, sizeof b);
-
-	return 0;
-}
-
-int32
-runtime_netpollclose(uintptr fd)
-{
-	byte b;
-
-	runtime_lock(&selectlock);
-
-	FD_CLR(fd, &fds);
-	data[fd] = nil;
-
-	runtime_unlock(&selectlock);
-
-	b = 0;
-	write(wrwake, &b, sizeof b);
-
-	return 0;
-}
-
-/* Used to avoid using too much stack memory.  */
-static bool inuse;
-static fd_set grfds, gwfds, gefds, gtfds;
-
-G*
-runtime_netpoll(bool block)
-{
-	fd_set *prfds, *pwfds, *pefds, *ptfds;
-	bool allocatedfds;
-	struct timeval timeout;
-	struct timeval *pt;
-	int max, c, i;
-	G *gp;
-	int32 mode;
-	byte b;
-	struct stat st;
-
-	allocatedfds = false;
-
- retry:
-	runtime_lock(&selectlock);
-
-	max = allocated;
-
-	if(max == 0) {
-		runtime_unlock(&selectlock);
-		return nil;
-	}
-
-	if(inuse) {
-		if(!allocatedfds) {
-			prfds = runtime_SysAlloc(4 * sizeof fds, &mstats.other_sys);
-			pwfds = prfds + 1;
-			pefds = pwfds + 1;
-			ptfds = pefds + 1;
-			allocatedfds = true;
-		}
-	} else {
-		prfds = &grfds;
-		pwfds = &gwfds;
-		pefds = &gefds;
-		ptfds = &gtfds;
-		inuse = true;
-		allocatedfds = false;
-	}
-
-	__builtin_memcpy(prfds, &fds, sizeof fds);
-
-	runtime_unlock(&selectlock);
-
-	__builtin_memcpy(pwfds, prfds, sizeof fds);
-	FD_CLR(rdwake, pwfds);
-	__builtin_memcpy(pefds, pwfds, sizeof fds);
-
-	__builtin_memcpy(ptfds, pwfds, sizeof fds);
-
-	__builtin_memset(&timeout, 0, sizeof timeout);
-	pt = &timeout;
-	if(block)
-		pt = nil;
-
-	c = select(max, prfds, pwfds, pefds, pt);
-	if(c < 0) {
-		if(errno == EBADF) {
-			// Some file descriptor has been closed.
-			// Check each one, and treat each closed
-			// descriptor as ready for read/write.
-			c = 0;
-			FD_ZERO(prfds);
-			FD_ZERO(pwfds);
-			FD_ZERO(pefds);
-			for(i = 0; i < max; i++) {
-				if(FD_ISSET(i, ptfds)
-				   && fstat(i, &st) < 0
-				   && errno == EBADF) {
-					FD_SET(i, prfds);
-					FD_SET(i, pwfds);
-					c += 2;
-				}
-			}
-		}
-		else {
-			if(errno != EINTR)
-				runtime_printf("runtime: select failed with %d\n", errno);
-			goto retry;
-		}
-	}
-	gp = nil;
-	for(i = 0; i < max && c > 0; i++) {
-		mode = 0;
-		if(FD_ISSET(i, prfds)) {
-			mode += 'r';
-			--c;
-		}
-		if(FD_ISSET(i, pwfds)) {
-			mode += 'w';
-			--c;
-		}
-		if(FD_ISSET(i, pefds)) {
-			mode = 'r' + 'w';
-			--c;
-		}
-		if(i == rdwake && mode != 0) {
-			while(read(rdwake, &b, sizeof b) > 0)
-				;
-			continue;
-		}
-		if(mode) {
-			PollDesc *pd;
-
-			runtime_lock(&selectlock);
-			pd = data[i];
-			runtime_unlock(&selectlock);
-			if(pd != nil)
-				runtime_netpollready(&gp, pd, mode);
-		}
-	}
-	if(block && gp == nil)
-		goto retry;
-
-	if(allocatedfds) {
-		runtime_SysFree(prfds, 4 * sizeof fds, &mstats.other_sys);
-	} else {
-		runtime_lock(&selectlock);
-		inuse = false;
-		runtime_unlock(&selectlock);
-	}
-
-	return gp;
-}
-
-void
-runtime_netpoll_scan(struct Workbuf** wbufp, void (*enqueue1)(struct Workbuf**, Obj))
-{
-	enqueue1(wbufp, (Obj){(byte*)&data, sizeof data, 0});
-}
diff --git a/third_party/gofrontend/libgo/runtime/netpoll_stub.c b/third_party/gofrontend/libgo/runtime/netpoll_stub.c
deleted file mode 100644
index 468a610..0000000
--- a/third_party/gofrontend/libgo/runtime/netpoll_stub.c
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build plan9
-
-#include "runtime.h"
-#include "malloc.h"
-
-// Polls for ready network connections.
-// Returns list of goroutines that become runnable.
-G*
-runtime_netpoll(bool block)
-{
-	// Implementation for platforms that do not support
-	// integrated network poller.
-	USED(block);
-	return nil;
-}
-
-void
-runtime_netpoll_scan(struct Workbuf** wbufp, void (*enqueue1)(struct Workbuf**, Obj))
-{
-	USED(wbufp);
-	USED(addroot);
-}
diff --git a/third_party/gofrontend/libgo/runtime/panic.c b/third_party/gofrontend/libgo/runtime/panic.c
deleted file mode 100644
index de000db..0000000
--- a/third_party/gofrontend/libgo/runtime/panic.c
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "runtime.h"
-#include "malloc.h"
-#include "go-defer.h"
-#include "go-panic.h"
-
-// Code related to defer, panic and recover.
-
-uint32 runtime_panicking;
-static Lock paniclk;
-
-// Allocate a Defer, usually using per-P pool.
-// Each defer must be released with freedefer.
-Defer*
-runtime_newdefer()
-{
-	Defer *d;
-	P *p;
-
-	d = nil;
-	p = runtime_m()->p;
-	d = p->deferpool;
-	if(d)
-		p->deferpool = d->__next;
-	if(d == nil) {
-		// deferpool is empty
-		d = runtime_malloc(sizeof(Defer));
-	}
-	return d;
-}
-
-// Free the given defer.
-// The defer cannot be used after this call.
-void
-runtime_freedefer(Defer *d)
-{
-	P *p;
-
-	if(d->__special)
-		return;
-	p = runtime_m()->p;
-	d->__next = p->deferpool;
-	p->deferpool = d;
-	// No need to wipe out pointers in argp/pc/fn/args,
-	// because we empty the pool before GC.
-}
-
-// Run all deferred functions for the current goroutine.
-// This is noinline for go_can_recover.
-static void __go_rundefer (void) __attribute__ ((noinline));
-static void
-__go_rundefer(void)
-{
-	G *g;
-	Defer *d;
-
-	g = runtime_g();
-	while((d = g->defer) != nil) {
-		void (*pfn)(void*);
-
-		g->defer = d->__next;
-		pfn = d->__pfn;
-		d->__pfn = nil;
-		if (pfn != nil)
-			(*pfn)(d->__arg);
-		runtime_freedefer(d);
-	}
-}
-
-void
-runtime_startpanic(void)
-{
-	M *m;
-
-	m = runtime_m();
-	if(runtime_mheap.cachealloc.size == 0) { // very early
-		runtime_printf("runtime: panic before malloc heap initialized\n");
-		m->mallocing = 1; // tell rest of panic not to try to malloc
-	} else if(m->mcache == nil) // can happen if called from signal handler or throw
-		m->mcache = runtime_allocmcache();
-	switch(m->dying) {
-	case 0:
-		m->dying = 1;
-		if(runtime_g() != nil)
-			runtime_g()->writebuf = nil;
-		runtime_xadd(&runtime_panicking, 1);
-		runtime_lock(&paniclk);
-		if(runtime_debug.schedtrace > 0 || runtime_debug.scheddetail > 0)
-			runtime_schedtrace(true);
-		runtime_freezetheworld();
-		return;
-	case 1:
-		// Something failed while panicing, probably the print of the
-		// argument to panic().  Just print a stack trace and exit.
-		m->dying = 2;
-		runtime_printf("panic during panic\n");
-		runtime_dopanic(0);
-		runtime_exit(3);
-	case 2:
-		// This is a genuine bug in the runtime, we couldn't even
-		// print the stack trace successfully.
-		m->dying = 3;
-		runtime_printf("stack trace unavailable\n");
-		runtime_exit(4);
-	default:
-		// Can't even print!  Just exit.
-		runtime_exit(5);
-	}
-}
-
-void
-runtime_dopanic(int32 unused __attribute__ ((unused)))
-{
-	G *g;
-	static bool didothers;
-	bool crash;
-	int32 t;
-
-	g = runtime_g();
-	if(g->sig != 0)
-		runtime_printf("[signal %x code=%p addr=%p]\n",
-			       g->sig, (void*)g->sigcode0, (void*)g->sigcode1);
-
-	if((t = runtime_gotraceback(&crash)) > 0){
-		if(g != runtime_m()->g0) {
-			runtime_printf("\n");
-			runtime_goroutineheader(g);
-			runtime_traceback();
-			runtime_printcreatedby(g);
-		} else if(t >= 2 || runtime_m()->throwing > 0) {
-			runtime_printf("\nruntime stack:\n");
-			runtime_traceback();
-		}
-		if(!didothers) {
-			didothers = true;
-			runtime_tracebackothers(g);
-		}
-	}
-	runtime_unlock(&paniclk);
-	if(runtime_xadd(&runtime_panicking, -1) != 0) {
-		// Some other m is panicking too.
-		// Let it print what it needs to print.
-		// Wait forever without chewing up cpu.
-		// It will exit when it's done.
-		static Lock deadlock;
-		runtime_lock(&deadlock);
-		runtime_lock(&deadlock);
-	}
-	
-	if(crash)
-		runtime_crash();
-
-	runtime_exit(2);
-}
-
-bool
-runtime_canpanic(G *gp)
-{
-	M *m = runtime_m();
-	byte g;
-
-	USED(&g);  // don't use global g, it points to gsignal
-
-	// Is it okay for gp to panic instead of crashing the program?
-	// Yes, as long as it is running Go code, not runtime code,
-	// and not stuck in a system call.
-	if(gp == nil || gp != m->curg)
-		return false;
-	if(m->locks-m->softfloat != 0 || m->mallocing != 0 || m->throwing != 0 || m->gcing != 0 || m->dying != 0)
-		return false;
-	if(gp->status != Grunning)
-		return false;
-#ifdef GOOS_windows
-	if(m->libcallsp != 0)
-		return false;
-#endif
-	return true;
-}
-
-void
-runtime_throw(const char *s)
-{
-	M *mp;
-
-	mp = runtime_m();
-	if(mp->throwing == 0)
-		mp->throwing = 1;
-	runtime_startpanic();
-	runtime_printf("fatal error: %s\n", s);
-	runtime_dopanic(0);
-	*(int32*)0 = 0;	// not reached
-	runtime_exit(1);	// even more not reached
-}
-
-void
-runtime_panicstring(const char *s)
-{
-	Eface err;
-
-	if(runtime_m()->mallocing) {
-		runtime_printf("panic: %s\n", s);
-		runtime_throw("panic during malloc");
-	}
-	if(runtime_m()->gcing) {
-		runtime_printf("panic: %s\n", s);
-		runtime_throw("panic during gc");
-	}
-	if(runtime_m()->locks) {
-		runtime_printf("panic: %s\n", s);
-		runtime_throw("panic holding locks");
-	}
-	runtime_newErrorCString(s, &err);
-	runtime_panic(err);
-}
-
-void runtime_Goexit (void) __asm__ (GOSYM_PREFIX "runtime.Goexit");
-
-void
-runtime_Goexit(void)
-{
-	__go_rundefer();
-	runtime_goexit();
-}
-
-void
-runtime_panicdivide(void)
-{
-	runtime_panicstring("integer divide by zero");
-}
diff --git a/third_party/gofrontend/libgo/runtime/parfor.c b/third_party/gofrontend/libgo/runtime/parfor.c
deleted file mode 100644
index ede921b..0000000
--- a/third_party/gofrontend/libgo/runtime/parfor.c
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Parallel for algorithm.
-
-#include "runtime.h"
-#include "arch.h"
-
-struct ParForThread
-{
-	// the thread's iteration space [32lsb, 32msb)
-	uint64 pos;
-	// stats
-	uint64 nsteal;
-	uint64 nstealcnt;
-	uint64 nprocyield;
-	uint64 nosyield;
-	uint64 nsleep;
-	byte pad[CacheLineSize];
-};
-
-ParFor*
-runtime_parforalloc(uint32 nthrmax)
-{
-	ParFor *desc;
-
-	// The ParFor object is followed by CacheLineSize padding
-	// and then nthrmax ParForThread.
-	desc = (ParFor*)runtime_malloc(sizeof(ParFor) + CacheLineSize + nthrmax * sizeof(ParForThread));
-	desc->thr = (ParForThread*)((byte*)(desc+1) + CacheLineSize);
-	desc->nthrmax = nthrmax;
-	return desc;
-}
-
-void
-runtime_parforsetup(ParFor *desc, uint32 nthr, uint32 n, bool wait, const FuncVal *body)
-{
-	uint32 i, begin, end;
-	uint64 *pos;
-
-	if(desc == nil || nthr == 0 || nthr > desc->nthrmax || body == nil) {
-		runtime_printf("desc=%p nthr=%d count=%d body=%p\n", desc, nthr, n, body);
-		runtime_throw("parfor: invalid args");
-	}
-
-	desc->body = body;
-	desc->done = 0;
-	desc->nthr = nthr;
-	desc->thrseq = 0;
-	desc->cnt = n;
-	desc->wait = wait;
-	desc->nsteal = 0;
-	desc->nstealcnt = 0;
-	desc->nprocyield = 0;
-	desc->nosyield = 0;
-	desc->nsleep = 0;
-	for(i=0; i<nthr; i++) {
-		begin = (uint64)n*i / nthr;
-		end = (uint64)n*(i+1) / nthr;
-		pos = &desc->thr[i].pos;
-		if(((uintptr)pos & 7) != 0)
-			runtime_throw("parforsetup: pos is not aligned");
-		*pos = (uint64)begin | (((uint64)end)<<32);
-	}
-}
-
-void
-runtime_parfordo(ParFor *desc)
-{
-	ParForThread *me;
-	uint32 tid, begin, end, begin2, try, victim, i;
-	uint64 *mypos, *victimpos, pos, newpos;
-	const FuncVal *body;
-	void (*bodyfn)(ParFor*, uint32);
-	bool idle;
-
-	// Obtain 0-based thread index.
-	tid = runtime_xadd(&desc->thrseq, 1) - 1;
-	if(tid >= desc->nthr) {
-		runtime_printf("tid=%d nthr=%d\n", tid, desc->nthr);
-		runtime_throw("parfor: invalid tid");
-	}
-
-	body = desc->body;
-	bodyfn = (void (*)(ParFor*, uint32))(void*)body->fn;
-
-	// If single-threaded, just execute the for serially.
-	if(desc->nthr==1) {
-		for(i=0; i<desc->cnt; i++)
-		  __builtin_call_with_static_chain (bodyfn(desc, i), body);
-		return;
-	}
-
-	me = &desc->thr[tid];
-	mypos = &me->pos;
-	for(;;) {
-		for(;;) {
-			// While there is local work,
-			// bump low index and execute the iteration.
-			pos = runtime_xadd64(mypos, 1);
-			begin = (uint32)pos-1;
-			end = (uint32)(pos>>32);
-			if(begin < end) {
-				__builtin_call_with_static_chain(bodyfn(desc, begin), body);
-				continue;
-			}
-			break;
-		}
-
-		// Out of work, need to steal something.
-		idle = false;
-		for(try=0;; try++) {
-			// If we don't see any work for long enough,
-			// increment the done counter...
-			if(try > desc->nthr*4 && !idle) {
-				idle = true;
-				runtime_xadd(&desc->done, 1);
-			}
-			// ...if all threads have incremented the counter,
-			// we are done.
-			if(desc->done + !idle == desc->nthr) {
-				if(!idle)
-					runtime_xadd(&desc->done, 1);
-				goto exit;
-			}
-			// Choose a random victim for stealing.
-			victim = runtime_fastrand1() % (desc->nthr-1);
-			if(victim >= tid)
-				victim++;
-			victimpos = &desc->thr[victim].pos;
-			for(;;) {
-				// See if it has any work.
-				pos = runtime_atomicload64(victimpos);
-				begin = (uint32)pos;
-				end = (uint32)(pos>>32);
-				if(begin+1 >= end) {
-					begin = end = 0;
-					break;
-				}
-				if(idle) {
-					runtime_xadd(&desc->done, -1);
-					idle = false;
-				}
-				begin2 = begin + (end-begin)/2;
-				newpos = (uint64)begin | (uint64)begin2<<32;
-				if(runtime_cas64(victimpos, pos, newpos)) {
-					begin = begin2;
-					break;
-				}
-			}
-			if(begin < end) {
-				// Has successfully stolen some work.
-				if(idle)
-					runtime_throw("parfor: should not be idle");
-				runtime_atomicstore64(mypos, (uint64)begin | (uint64)end<<32);
-				me->nsteal++;
-				me->nstealcnt += end-begin;
-				break;
-			}
-			// Backoff.
-			if(try < desc->nthr) {
-				// nothing
-			} else if (try < 4*desc->nthr) {
-				me->nprocyield++;
-				runtime_procyield(20);
-			// If a caller asked not to wait for the others, exit now
-			// (assume that most work is already done at this point).
-			} else if (!desc->wait) {
-				if(!idle)
-					runtime_xadd(&desc->done, 1);
-				goto exit;
-			} else if (try < 6*desc->nthr) {
-				me->nosyield++;
-				runtime_osyield();
-			} else {
-				me->nsleep++;
-				runtime_usleep(1);
-			}
-		}
-	}
-exit:
-	runtime_xadd64(&desc->nsteal, me->nsteal);
-	runtime_xadd64(&desc->nstealcnt, me->nstealcnt);
-	runtime_xadd64(&desc->nprocyield, me->nprocyield);
-	runtime_xadd64(&desc->nosyield, me->nosyield);
-	runtime_xadd64(&desc->nsleep, me->nsleep);
-	me->nsteal = 0;
-	me->nstealcnt = 0;
-	me->nprocyield = 0;
-	me->nosyield = 0;
-	me->nsleep = 0;
-}
-
-// For testing from Go.
-void
-runtime_parforiters(ParFor *desc, uintptr tid, uintptr *start, uintptr *end)
-{
-	*start = (uint32)desc->thr[tid].pos;
-	*end = (uint32)(desc->thr[tid].pos>>32);
-}
diff --git a/third_party/gofrontend/libgo/runtime/print.c b/third_party/gofrontend/libgo/runtime/print.c
deleted file mode 100644
index 69b1f81..0000000
--- a/third_party/gofrontend/libgo/runtime/print.c
+++ /dev/null
@@ -1,372 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <complex.h>
-#include <math.h>
-#include <stdarg.h>
-#include "runtime.h"
-#include "array.h"
-#include "go-type.h"
-
-//static Lock debuglock;
-
-// Clang requires this function to not be inlined (see below).
-static void go_vprintf(const char*, va_list)
-__attribute__((noinline));
-
-// write to goroutine-local buffer if diverting output,
-// or else standard error.
-static void
-gwrite(const void *v, intgo n)
-{
-	G* g = runtime_g();
-
-	if(g == nil || g->writebuf == nil) {
-		// Avoid -D_FORTIFY_SOURCE problems.
-		int rv __attribute__((unused));
-
-		rv = runtime_write(2, v, n);
-		return;
-	}
-
-	if(g->writenbuf == 0)
-		return;
-
-	if(n > g->writenbuf)
-		n = g->writenbuf;
-	runtime_memmove(g->writebuf, v, n);
-	g->writebuf += n;
-	g->writenbuf -= n;
-}
-
-void
-runtime_dump(byte *p, int32 n)
-{
-	int32 i;
-
-	for(i=0; i<n; i++) {
-		runtime_printpointer((byte*)(uintptr)(p[i]>>4));
-		runtime_printpointer((byte*)(uintptr)(p[i]&0xf));
-		if((i&15) == 15)
-			runtime_prints("\n");
-		else
-			runtime_prints(" ");
-	}
-	if(n & 15)
-		runtime_prints("\n");
-}
-
-void
-runtime_prints(const char *s)
-{
-	gwrite(s, runtime_findnull((const byte*)s));
-}
-
-#if defined (__clang__) && (defined (__i386__) || defined (__x86_64__))
-// LLVM's code generator does not currently support split stacks for vararg
-// functions, so we disable the feature for this function under Clang. This
-// appears to be OK as long as:
-// - this function only calls non-inlined, internal-linkage (hence no dynamic
-//   loader) functions compiled with split stacks (i.e. go_vprintf), which can
-//   allocate more stack space as required;
-// - this function itself does not occupy more than BACKOFF bytes of stack space
-//   (see libgcc/config/i386/morestack.S).
-// These conditions are currently known to be satisfied by Clang on x86-32 and
-// x86-64. Note that signal handlers receive slightly less stack space than they
-// would normally do if they happen to be called while this function is being
-// run. If this turns out to be a problem we could consider increasing BACKOFF.
-
-void
-runtime_printf(const char *s, ...)
-__attribute__((no_split_stack));
-
-int32
-runtime_snprintf(byte *buf, int32 n, const char *s, ...)
-__attribute__((no_split_stack));
-
-#endif
-
-void
-runtime_printf(const char *s, ...)
-{
-	va_list va;
-
-	va_start(va, s);
-	go_vprintf(s, va);
-	va_end(va);
-}
-
-int32
-runtime_snprintf(byte *buf, int32 n, const char *s, ...)
-{
-	G *g = runtime_g();
-	va_list va;
-	int32 m;
-
-	g->writebuf = buf;
-	g->writenbuf = n-1;
-	va_start(va, s);
-	go_vprintf(s, va);
-	va_end(va);
-	*g->writebuf = '\0';
-	m = g->writebuf - buf;
-	g->writenbuf = 0;
-	g->writebuf = nil;
-	return m;
-}
-
-// Very simple printf.  Only for debugging prints.
-// Do not add to this without checking with Rob.
-static void
-go_vprintf(const char *s, va_list va)
-{
-	const char *p, *lp;
-
-	//runtime_lock(&debuglock);
-
-	lp = p = s;
-	for(; *p; p++) {
-		if(*p != '%')
-			continue;
-		if(p > lp)
-			gwrite(lp, p-lp);
-		p++;
-		switch(*p) {
-		case 'a':
-			runtime_printslice(va_arg(va, Slice));
-			break;
-		case 'c':
-			runtime_printbyte(va_arg(va, int32));
-			break;
-		case 'd':
-			runtime_printint(va_arg(va, int32));
-			break;
-		case 'D':
-			runtime_printint(va_arg(va, int64));
-			break;
-		case 'e':
-			runtime_printeface(va_arg(va, Eface));
-			break;
-		case 'f':
-			runtime_printfloat(va_arg(va, float64));
-			break;
-		case 'C':
-			runtime_printcomplex(va_arg(va, complex double));
-			break;
-		case 'i':
-			runtime_printiface(va_arg(va, Iface));
-			break;
-		case 'p':
-			runtime_printpointer(va_arg(va, void*));
-			break;
-		case 's':
-			runtime_prints(va_arg(va, char*));
-			break;
-		case 'S':
-			runtime_printstring(va_arg(va, String));
-			break;
-		case 't':
-			runtime_printbool(va_arg(va, int));
-			break;
-		case 'U':
-			runtime_printuint(va_arg(va, uint64));
-			break;
-		case 'x':
-			runtime_printhex(va_arg(va, uint32));
-			break;
-		case 'X':
-			runtime_printhex(va_arg(va, uint64));
-			break;
-		}
-		lp = p+1;
-	}
-	if(p > lp)
-		gwrite(lp, p-lp);
-
-	//runtime_unlock(&debuglock);
-}
-
-void
-runtime_printpc(void *p __attribute__ ((unused)))
-{
-	runtime_prints("PC=");
-	runtime_printhex((uint64)(uintptr)runtime_getcallerpc(p));
-}
-
-void
-runtime_printbool(_Bool v)
-{
-	if(v) {
-		gwrite("true", 4);
-		return;
-	}
-	gwrite("false", 5);
-}
-
-void
-runtime_printbyte(int8 c)
-{
-	gwrite(&c, 1);
-}
-
-void
-runtime_printfloat(double v)
-{
-	byte buf[20];
-	int32 e, s, i, n;
-	float64 h;
-
-	if(ISNAN(v)) {
-		gwrite("NaN", 3);
-		return;
-	}
-	if(isinf(v)) {
-		if(signbit(v)) {
-			gwrite("-Inf", 4);
-		} else {
-			gwrite("+Inf", 4);
-		}
-		return;
-	}
-
-	n = 7;	// digits printed
-	e = 0;	// exp
-	s = 0;	// sign
-	if(v == 0) {
-		if(isinf(1/v) && 1/v < 0)
-			s = 1;
-	} else {
-		// sign
-		if(v < 0) {
-			v = -v;
-			s = 1;
-		}
-
-		// normalize
-		while(v >= 10) {
-			e++;
-			v /= 10;
-		}
-		while(v < 1) {
-			e--;
-			v *= 10;
-		}
-
-		// round
-		h = 5;
-		for(i=0; i<n; i++)
-			h /= 10;
-
-		v += h;
-		if(v >= 10) {
-			e++;
-			v /= 10;
-		}
-	}
-
-	// format +d.dddd+edd
-	buf[0] = '+';
-	if(s)
-		buf[0] = '-';
-	for(i=0; i<n; i++) {
-		s = v;
-		buf[i+2] = s+'0';
-		v -= s;
-		v *= 10.;
-	}
-	buf[1] = buf[2];
-	buf[2] = '.';
-
-	buf[n+2] = 'e';
-	buf[n+3] = '+';
-	if(e < 0) {
-		e = -e;
-		buf[n+3] = '-';
-	}
-
-	buf[n+4] = (e/100) + '0';
-	buf[n+5] = (e/10)%10 + '0';
-	buf[n+6] = (e%10) + '0';
-	gwrite(buf, n+7);
-}
-
-void
-runtime_printcomplex(complex double v)
-{
-	gwrite("(", 1);
-	runtime_printfloat(creal(v));
-	runtime_printfloat(cimag(v));
-	gwrite("i)", 2);
-}
-
-void
-runtime_printuint(uint64 v)
-{
-	byte buf[100];
-	int32 i;
-
-	for(i=nelem(buf)-1; i>0; i--) {
-		buf[i] = v%10 + '0';
-		if(v < 10)
-			break;
-		v = v/10;
-	}
-	gwrite(buf+i, nelem(buf)-i);
-}
-
-void
-runtime_printint(int64 v)
-{
-	if(v < 0) {
-		gwrite("-", 1);
-		v = -v;
-	}
-	runtime_printuint(v);
-}
-
-void
-runtime_printhex(uint64 v)
-{
-	static const char *dig = "0123456789abcdef";
-	byte buf[100];
-	int32 i;
-
-	i=nelem(buf);
-	for(; v>0; v/=16)
-		buf[--i] = dig[v%16];
-	if(i == nelem(buf))
-		buf[--i] = '0';
-	buf[--i] = 'x';
-	buf[--i] = '0';
-	gwrite(buf+i, nelem(buf)-i);
-}
-
-void
-runtime_printpointer(void *p)
-{
-	runtime_printhex((uintptr)p);
-}
-
-void
-runtime_printstring(String v)
-{
-	// if(v.len > runtime_maxstring) {
-	//	gwrite("[string too long]", 17);
-	//	return;
-	// }
-	if(v.len > 0)
-		gwrite(v.str, v.len);
-}
-
-void
-__go_print_space(void)
-{
-	gwrite(" ", 1);
-}
-
-void
-__go_print_nl(void)
-{
-	gwrite("\n", 1);
-}
diff --git a/third_party/gofrontend/libgo/runtime/proc.c b/third_party/gofrontend/libgo/runtime/proc.c
deleted file mode 100644
index 2d013f0..0000000
--- a/third_party/gofrontend/libgo/runtime/proc.c
+++ /dev/null
@@ -1,3497 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <limits.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <pthread.h>
-#include <unistd.h>
-
-#include "config.h"
-
-#ifdef HAVE_DL_ITERATE_PHDR
-#include <link.h>
-#endif
-
-#include "runtime.h"
-#include "arch.h"
-#include "defs.h"
-#include "malloc.h"
-#include "go-type.h"
-#include "go-defer.h"
-
-#ifdef USING_SPLIT_STACK
-
-/* FIXME: These are not declared anywhere.  */
-
-extern void __splitstack_getcontext(void *context[10]);
-
-extern void __splitstack_setcontext(void *context[10]);
-
-extern void *__splitstack_makecontext(size_t, void *context[10], size_t *);
-
-extern void * __splitstack_resetcontext(void *context[10], size_t *);
-
-extern void *__splitstack_find(void *, void *, size_t *, void **, void **,
-			       void **);
-
-extern void __splitstack_block_signals (int *, int *);
-
-extern void __splitstack_block_signals_context (void *context[10], int *,
-						int *);
-
-#endif
-
-#ifndef PTHREAD_STACK_MIN
-# define PTHREAD_STACK_MIN 8192
-#endif
-
-#if defined(USING_SPLIT_STACK) && defined(LINKER_SUPPORTS_SPLIT_STACK)
-# define StackMin PTHREAD_STACK_MIN
-#else
-# define StackMin ((sizeof(char *) < 8) ? 2 * 1024 * 1024 : 4 * 1024 * 1024)
-#endif
-
-uintptr runtime_stacks_sys;
-
-static void gtraceback(G*);
-
-#ifdef __rtems__
-#define __thread
-#endif
-
-static __thread G *g;
-static __thread M *m;
-
-#ifndef SETCONTEXT_CLOBBERS_TLS
-
-static inline void
-initcontext(void)
-{
-}
-
-static inline void
-fixcontext(ucontext_t *c __attribute__ ((unused)))
-{
-}
-
-#else
-
-# if defined(__x86_64__) && defined(__sun__)
-
-// x86_64 Solaris 10 and 11 have a bug: setcontext switches the %fs
-// register to that of the thread which called getcontext.  The effect
-// is that the address of all __thread variables changes.  This bug
-// also affects pthread_self() and pthread_getspecific.  We work
-// around it by clobbering the context field directly to keep %fs the
-// same.
-
-static __thread greg_t fs;
-
-static inline void
-initcontext(void)
-{
-	ucontext_t c;
-
-	getcontext(&c);
-	fs = c.uc_mcontext.gregs[REG_FSBASE];
-}
-
-static inline void
-fixcontext(ucontext_t* c)
-{
-	c->uc_mcontext.gregs[REG_FSBASE] = fs;
-}
-
-# elif defined(__NetBSD__)
-
-// NetBSD has a bug: setcontext clobbers tlsbase, we need to save
-// and restore it ourselves.
-
-static __thread __greg_t tlsbase;
-
-static inline void
-initcontext(void)
-{
-	ucontext_t c;
-
-	getcontext(&c);
-	tlsbase = c.uc_mcontext._mc_tlsbase;
-}
-
-static inline void
-fixcontext(ucontext_t* c)
-{
-	c->uc_mcontext._mc_tlsbase = tlsbase;
-}
-
-# elif defined(__sparc__)
-
-static inline void
-initcontext(void)
-{
-}
-
-static inline void
-fixcontext(ucontext_t *c)
-{
-	/* ??? Using 
-	     register unsigned long thread __asm__("%g7");
-	     c->uc_mcontext.gregs[REG_G7] = thread;
-	   results in
-	     error: variable ‘thread’ might be clobbered by \
-		‘longjmp’ or ‘vfork’ [-Werror=clobbered]
-	   which ought to be false, as %g7 is a fixed register.  */
-
-	if (sizeof (c->uc_mcontext.gregs[REG_G7]) == 8)
-		asm ("stx %%g7, %0" : "=m"(c->uc_mcontext.gregs[REG_G7]));
-	else
-		asm ("st %%g7, %0" : "=m"(c->uc_mcontext.gregs[REG_G7]));
-}
-
-# else
-
-#  error unknown case for SETCONTEXT_CLOBBERS_TLS
-
-# endif
-
-#endif
-
-// We can not always refer to the TLS variables directly.  The
-// compiler will call tls_get_addr to get the address of the variable,
-// and it may hold it in a register across a call to schedule.  When
-// we get back from the call we may be running in a different thread,
-// in which case the register now points to the TLS variable for a
-// different thread.  We use non-inlinable functions to avoid this
-// when necessary.
-
-G* runtime_g(void) __attribute__ ((noinline, no_split_stack));
-
-G*
-runtime_g(void)
-{
-	return g;
-}
-
-M* runtime_m(void) __attribute__ ((noinline, no_split_stack));
-
-M*
-runtime_m(void)
-{
-	return m;
-}
-
-// Set m and g.
-void
-runtime_setmg(M* mp, G* gp)
-{
-	m = mp;
-	g = gp;
-}
-
-// Start a new thread.
-static void
-runtime_newosproc(M *mp)
-{
-	pthread_attr_t attr;
-	sigset_t clear, old;
-	pthread_t tid;
-	int ret;
-
-	if(pthread_attr_init(&attr) != 0)
-		runtime_throw("pthread_attr_init");
-	if(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0)
-		runtime_throw("pthread_attr_setdetachstate");
-
-	// Block signals during pthread_create so that the new thread
-	// starts with signals disabled.  It will enable them in minit.
-	sigfillset(&clear);
-
-#ifdef SIGTRAP
-	// Blocking SIGTRAP reportedly breaks gdb on Alpha GNU/Linux.
-	sigdelset(&clear, SIGTRAP);
-#endif
-
-	sigemptyset(&old);
-	pthread_sigmask(SIG_BLOCK, &clear, &old);
-	ret = pthread_create(&tid, &attr, runtime_mstart, mp);
-	pthread_sigmask(SIG_SETMASK, &old, nil);
-
-	if (ret != 0)
-		runtime_throw("pthread_create");
-}
-
-// First function run by a new goroutine.  This replaces gogocall.
-static void
-kickoff(void)
-{
-	void (*fn)(void*);
-
-	if(g->traceback != nil)
-		gtraceback(g);
-
-	fn = (void (*)(void*))(g->entry);
-	fn(g->param);
-	runtime_goexit();
-}
-
-// Switch context to a different goroutine.  This is like longjmp.
-void runtime_gogo(G*) __attribute__ ((noinline));
-void
-runtime_gogo(G* newg)
-{
-#ifdef USING_SPLIT_STACK
-	__splitstack_setcontext(&newg->stack_context[0]);
-#endif
-	g = newg;
-	newg->fromgogo = true;
-	fixcontext(&newg->context);
-	setcontext(&newg->context);
-	runtime_throw("gogo setcontext returned");
-}
-
-// Save context and call fn passing g as a parameter.  This is like
-// setjmp.  Because getcontext always returns 0, unlike setjmp, we use
-// g->fromgogo as a code.  It will be true if we got here via
-// setcontext.  g == nil the first time this is called in a new m.
-void runtime_mcall(void (*)(G*)) __attribute__ ((noinline));
-void
-runtime_mcall(void (*pfn)(G*))
-{
-	M *mp;
-	G *gp;
-
-	// Ensure that all registers are on the stack for the garbage
-	// collector.
-	__builtin_unwind_init();
-
-	mp = m;
-	gp = g;
-	if(gp == mp->g0)
-		runtime_throw("runtime: mcall called on m->g0 stack");
-
-	if(gp != nil) {
-
-#ifdef USING_SPLIT_STACK
-		__splitstack_getcontext(&g->stack_context[0]);
-#else
-		gp->gcnext_sp = &pfn;
-#endif
-		gp->fromgogo = false;
-		getcontext(&gp->context);
-
-		// When we return from getcontext, we may be running
-		// in a new thread.  That means that m and g may have
-		// changed.  They are global variables so we will
-		// reload them, but the addresses of m and g may be
-		// cached in our local stack frame, and those
-		// addresses may be wrong.  Call functions to reload
-		// the values for this thread.
-		mp = runtime_m();
-		gp = runtime_g();
-
-		if(gp->traceback != nil)
-			gtraceback(gp);
-	}
-	if (gp == nil || !gp->fromgogo) {
-#ifdef USING_SPLIT_STACK
-		__splitstack_setcontext(&mp->g0->stack_context[0]);
-#endif
-		mp->g0->entry = (byte*)pfn;
-		mp->g0->param = gp;
-
-		// It's OK to set g directly here because this case
-		// can not occur if we got here via a setcontext to
-		// the getcontext call just above.
-		g = mp->g0;
-
-		fixcontext(&mp->g0->context);
-		setcontext(&mp->g0->context);
-		runtime_throw("runtime: mcall function returned");
-	}
-}
-
-// Goroutine scheduler
-// The scheduler's job is to distribute ready-to-run goroutines over worker threads.
-//
-// The main concepts are:
-// G - goroutine.
-// M - worker thread, or machine.
-// P - processor, a resource that is required to execute Go code.
-//     M must have an associated P to execute Go code, however it can be
-//     blocked or in a syscall w/o an associated P.
-//
-// Design doc at http://golang.org/s/go11sched.
-
-typedef struct Sched Sched;
-struct Sched {
-	Lock	lock;
-
-	uint64	goidgen;
-	M*	midle;	 // idle m's waiting for work
-	int32	nmidle;	 // number of idle m's waiting for work
-	int32	nmidlelocked; // number of locked m's waiting for work
-	int32	mcount;	 // number of m's that have been created
-	int32	maxmcount;	// maximum number of m's allowed (or die)
-
-	P*	pidle;  // idle P's
-	uint32	npidle;
-	uint32	nmspinning;
-
-	// Global runnable queue.
-	G*	runqhead;
-	G*	runqtail;
-	int32	runqsize;
-
-	// Global cache of dead G's.
-	Lock	gflock;
-	G*	gfree;
-
-	uint32	gcwaiting;	// gc is waiting to run
-	int32	stopwait;
-	Note	stopnote;
-	uint32	sysmonwait;
-	Note	sysmonnote;
-	uint64	lastpoll;
-
-	int32	profilehz;	// cpu profiling rate
-};
-
-enum
-{
-	// The max value of GOMAXPROCS.
-	// There are no fundamental restrictions on the value.
-	MaxGomaxprocs = 1<<8,
-
-	// Number of goroutine ids to grab from runtime_sched.goidgen to local per-P cache at once.
-	// 16 seems to provide enough amortization, but other than that it's mostly arbitrary number.
-	GoidCacheBatch = 16,
-};
-
-Sched	runtime_sched;
-int32	runtime_gomaxprocs;
-uint32	runtime_needextram = 1;
-M	runtime_m0;
-G	runtime_g0;	// idle goroutine for m0
-G*	runtime_lastg;
-M*	runtime_allm;
-P**	runtime_allp;
-M*	runtime_extram;
-int8*	runtime_goos;
-int32	runtime_ncpu;
-bool	runtime_precisestack;
-static int32	newprocs;
-
-static	Lock allglock;	// the following vars are protected by this lock or by stoptheworld
-G**	runtime_allg;
-uintptr runtime_allglen;
-static	uintptr allgcap;
-
-bool	runtime_isarchive;
-
-void* runtime_mstart(void*);
-static void runqput(P*, G*);
-static G* runqget(P*);
-static bool runqputslow(P*, G*, uint32, uint32);
-static G* runqsteal(P*, P*);
-static void mput(M*);
-static M* mget(void);
-static void mcommoninit(M*);
-static void schedule(void);
-static void procresize(int32);
-static void acquirep(P*);
-static P* releasep(void);
-static void newm(void(*)(void), P*);
-static void stopm(void);
-static void startm(P*, bool);
-static void handoffp(P*);
-static void wakep(void);
-static void stoplockedm(void);
-static void startlockedm(G*);
-static void sysmon(void);
-static uint32 retake(int64);
-static void incidlelocked(int32);
-static void checkdead(void);
-static void exitsyscall0(G*);
-static void park0(G*);
-static void goexit0(G*);
-static void gfput(P*, G*);
-static G* gfget(P*);
-static void gfpurge(P*);
-static void globrunqput(G*);
-static void globrunqputbatch(G*, G*, int32);
-static G* globrunqget(P*, int32);
-static P* pidleget(void);
-static void pidleput(P*);
-static void injectglist(G*);
-static bool preemptall(void);
-static bool exitsyscallfast(void);
-static void allgadd(G*);
-
-bool runtime_isstarted;
-
-// The bootstrap sequence is:
-//
-//	call osinit
-//	call schedinit
-//	make & queue new G
-//	call runtime_mstart
-//
-// The new G calls runtime_main.
-void
-runtime_schedinit(void)
-{
-	int32 n, procs;
-	String s;
-	const byte *p;
-	Eface i;
-
-	m = &runtime_m0;
-	g = &runtime_g0;
-	m->g0 = g;
-	m->curg = g;
-	g->m = m;
-
-	initcontext();
-
-	runtime_sched.maxmcount = 10000;
-	runtime_precisestack = 0;
-
-	// runtime_symtabinit();
-	runtime_mallocinit();
-	mcommoninit(m);
-	
-	// Initialize the itable value for newErrorCString,
-	// so that the next time it gets called, possibly
-	// in a fault during a garbage collection, it will not
-	// need to allocated memory.
-	runtime_newErrorCString(0, &i);
-	
-	// Initialize the cached gotraceback value, since
-	// gotraceback calls getenv, which mallocs on Plan 9.
-	runtime_gotraceback(nil);
-
-	runtime_goargs();
-	runtime_goenvs();
-	runtime_parsedebugvars();
-
-	runtime_sched.lastpoll = runtime_nanotime();
-	procs = 1;
-	s = runtime_getenv("GOMAXPROCS");
-	p = s.str;
-	if(p != nil && (n = runtime_atoi(p, s.len)) > 0) {
-		if(n > MaxGomaxprocs)
-			n = MaxGomaxprocs;
-		procs = n;
-	}
-	runtime_allp = runtime_malloc((MaxGomaxprocs+1)*sizeof(runtime_allp[0]));
-	procresize(procs);
-
-	// Can not enable GC until all roots are registered.
-	// mstats.enablegc = 1;
-}
-
-extern void main_init(void) __asm__ (GOSYM_PREFIX "__go_init_main");
-extern void main_main(void) __asm__ (GOSYM_PREFIX "main.main");
-
-// Used to determine the field alignment.
-
-struct field_align
-{
-  char c;
-  Hchan *p;
-};
-
-// main_init_done is a signal used by cgocallbackg that initialization
-// has been completed.  It is made before _cgo_notify_runtime_init_done,
-// so all cgo calls can rely on it existing.  When main_init is
-// complete, it is closed, meaning cgocallbackg can reliably receive
-// from it.
-Hchan *runtime_main_init_done;
-
-// The chan bool type, for runtime_main_init_done.
-
-extern const struct __go_type_descriptor bool_type_descriptor
-  __asm__ (GOSYM_PREFIX "__go_tdn_bool");
-
-static struct __go_channel_type chan_bool_type_descriptor =
-  {
-    /* __common */
-    {
-      /* __code */
-      GO_CHAN,
-      /* __align */
-      __alignof (Hchan *),
-      /* __field_align */
-      offsetof (struct field_align, p) - 1,
-      /* __size */
-      sizeof (Hchan *),
-      /* __hash */
-      0, /* This value doesn't matter.  */
-      /* __hashfn */
-      &__go_type_hash_error_descriptor,
-      /* __equalfn */
-      &__go_type_equal_error_descriptor,
-      /* __gc */
-      NULL, /* This value doesn't matter */
-      /* __reflection */
-      NULL, /* This value doesn't matter */
-      /* __uncommon */
-      NULL,
-      /* __pointer_to_this */
-      NULL
-    },
-    /* __element_type */
-    &bool_type_descriptor,
-    /* __dir */
-    CHANNEL_BOTH_DIR
-  };
-
-extern Hchan *__go_new_channel (ChanType *, uintptr);
-extern void closechan(Hchan *) __asm__ (GOSYM_PREFIX "runtime.closechan");
-
-static void
-initDone(void *arg __attribute__ ((unused))) {
-	runtime_unlockOSThread();
-};
-
-// The main goroutine.
-// Note: C frames in general are not copyable during stack growth, for two reasons:
-//   1) We don't know where in a frame to find pointers to other stack locations.
-//   2) There's no guarantee that globals or heap values do not point into the frame.
-//
-// The C frame for runtime.main is copyable, because:
-//   1) There are no pointers to other stack locations in the frame
-//      (d.fn points at a global, d.link is nil, d.argp is -1).
-//   2) The only pointer into this frame is from the defer chain,
-//      which is explicitly handled during stack copying.
-void
-runtime_main(void* dummy __attribute__((unused)))
-{
-	Defer d;
-	_Bool frame;
-	
-	newm(sysmon, nil);
-
-	// Lock the main goroutine onto this, the main OS thread,
-	// during initialization.  Most programs won't care, but a few
-	// do require certain calls to be made by the main thread.
-	// Those can arrange for main.main to run in the main thread
-	// by calling runtime.LockOSThread during initialization
-	// to preserve the lock.
-	runtime_lockOSThread();
-	
-	// Defer unlock so that runtime.Goexit during init does the unlock too.
-	d.__pfn = initDone;
-	d.__next = g->defer;
-	d.__arg = (void*)-1;
-	d.__panic = g->panic;
-	d.__retaddr = nil;
-	d.__makefunc_can_recover = 0;
-	d.__frame = &frame;
-	d.__special = true;
-	g->defer = &d;
-
-	if(m != &runtime_m0)
-		runtime_throw("runtime_main not on m0");
-	__go_go(runtime_MHeap_Scavenger, nil);
-
-	runtime_main_init_done = __go_new_channel(&chan_bool_type_descriptor, 0);
-
-	_cgo_notify_runtime_init_done();
-
-	main_init();
-
-	closechan(runtime_main_init_done);
-
-	if(g->defer != &d || d.__pfn != initDone)
-		runtime_throw("runtime: bad defer entry after init");
-	g->defer = d.__next;
-	runtime_unlockOSThread();
-
-	// For gccgo we have to wait until after main is initialized
-	// to enable GC, because initializing main registers the GC
-	// roots.
-	mstats.enablegc = 1;
-
-	if(runtime_isarchive) {
-		// This is not a complete program, but is instead a
-		// library built using -buildmode=c-archive or
-		// c-shared.  Now that we are initialized, there is
-		// nothing further to do.
-		return;
-	}
-
-	main_main();
-
-	// Make racy client program work: if panicking on
-	// another goroutine at the same time as main returns,
-	// let the other goroutine finish printing the panic trace.
-	// Once it does, it will exit. See issue 3934.
-	if(runtime_panicking)
-		runtime_park(nil, nil, "panicwait");
-
-	runtime_exit(0);
-	for(;;)
-		*(int32*)0 = 0;
-}
-
-void
-runtime_goroutineheader(G *gp)
-{
-	const char *status;
-	int64 waitfor;
-
-	switch(gp->status) {
-	case Gidle:
-		status = "idle";
-		break;
-	case Grunnable:
-		status = "runnable";
-		break;
-	case Grunning:
-		status = "running";
-		break;
-	case Gsyscall:
-		status = "syscall";
-		break;
-	case Gwaiting:
-		if(gp->waitreason)
-			status = gp->waitreason;
-		else
-			status = "waiting";
-		break;
-	default:
-		status = "???";
-		break;
-	}
-
-	// approx time the G is blocked, in minutes
-	waitfor = 0;
-	if((gp->status == Gwaiting || gp->status == Gsyscall) && gp->waitsince != 0)
-		waitfor = (runtime_nanotime() - gp->waitsince) / (60LL*1000*1000*1000);
-
-	if(waitfor < 1)
-		runtime_printf("goroutine %D [%s]:\n", gp->goid, status);
-	else
-		runtime_printf("goroutine %D [%s, %D minutes]:\n", gp->goid, status, waitfor);
-}
-
-void
-runtime_printcreatedby(G *g)
-{
-	if(g != nil && g->gopc != 0 && g->goid != 1) {
-		String fn;
-		String file;
-		intgo line;
-
-		if(__go_file_line(g->gopc - 1, &fn, &file, &line)) {
-			runtime_printf("created by %S\n", fn);
-			runtime_printf("\t%S:%D\n", file, (int64) line);
-		}
-	}
-}
-
-struct Traceback
-{
-	G* gp;
-	Location locbuf[TracebackMaxFrames];
-	int32 c;
-};
-
-void
-runtime_tracebackothers(G * volatile me)
-{
-	G * volatile gp;
-	Traceback tb;
-	int32 traceback;
-	volatile uintptr i;
-
-	tb.gp = me;
-	traceback = runtime_gotraceback(nil);
-	
-	// Show the current goroutine first, if we haven't already.
-	if((gp = m->curg) != nil && gp != me) {
-		runtime_printf("\n");
-		runtime_goroutineheader(gp);
-		gp->traceback = &tb;
-
-#ifdef USING_SPLIT_STACK
-		__splitstack_getcontext(&me->stack_context[0]);
-#endif
-		getcontext(&me->context);
-
-		if(gp->traceback != nil) {
-		  runtime_gogo(gp);
-		}
-
-		runtime_printtrace(tb.locbuf, tb.c, false);
-		runtime_printcreatedby(gp);
-	}
-
-	runtime_lock(&allglock);
-	for(i = 0; i < runtime_allglen; i++) {
-		gp = runtime_allg[i];
-		if(gp == me || gp == m->curg || gp->status == Gdead)
-			continue;
-		if(gp->issystem && traceback < 2)
-			continue;
-		runtime_printf("\n");
-		runtime_goroutineheader(gp);
-
-		// Our only mechanism for doing a stack trace is
-		// _Unwind_Backtrace.  And that only works for the
-		// current thread, not for other random goroutines.
-		// So we need to switch context to the goroutine, get
-		// the backtrace, and then switch back.
-
-		// This means that if g is running or in a syscall, we
-		// can't reliably print a stack trace.  FIXME.
-
-		if(gp->status == Grunning) {
-			runtime_printf("\tgoroutine running on other thread; stack unavailable\n");
-			runtime_printcreatedby(gp);
-		} else if(gp->status == Gsyscall) {
-			runtime_printf("\tgoroutine in C code; stack unavailable\n");
-			runtime_printcreatedby(gp);
-		} else {
-			gp->traceback = &tb;
-
-#ifdef USING_SPLIT_STACK
-			__splitstack_getcontext(&me->stack_context[0]);
-#endif
-			getcontext(&me->context);
-
-			if(gp->traceback != nil) {
-				runtime_gogo(gp);
-			}
-
-			runtime_printtrace(tb.locbuf, tb.c, false);
-			runtime_printcreatedby(gp);
-		}
-	}
-	runtime_unlock(&allglock);
-}
-
-static void
-checkmcount(void)
-{
-	// sched lock is held
-	if(runtime_sched.mcount > runtime_sched.maxmcount) {
-		runtime_printf("runtime: program exceeds %d-thread limit\n", runtime_sched.maxmcount);
-		runtime_throw("thread exhaustion");
-	}
-}
-
-// Do a stack trace of gp, and then restore the context to
-// gp->dotraceback.
-
-static void
-gtraceback(G* gp)
-{
-	Traceback* traceback;
-
-	traceback = gp->traceback;
-	gp->traceback = nil;
-	traceback->c = runtime_callers(1, traceback->locbuf,
-		sizeof traceback->locbuf / sizeof traceback->locbuf[0], false);
-	runtime_gogo(traceback->gp);
-}
-
-static void
-mcommoninit(M *mp)
-{
-	// If there is no mcache runtime_callers() will crash,
-	// and we are most likely in sysmon thread so the stack is senseless anyway.
-	if(m->mcache)
-		runtime_callers(1, mp->createstack, nelem(mp->createstack), false);
-
-	mp->fastrand = 0x49f6428aUL + mp->id + runtime_cputicks();
-
-	runtime_lock(&runtime_sched.lock);
-	mp->id = runtime_sched.mcount++;
-	checkmcount();
-	runtime_mpreinit(mp);
-
-	// Add to runtime_allm so garbage collector doesn't free m
-	// when it is just in a register or thread-local storage.
-	mp->alllink = runtime_allm;
-	// runtime_NumCgoCall() iterates over allm w/o schedlock,
-	// so we need to publish it safely.
-	runtime_atomicstorep(&runtime_allm, mp);
-	runtime_unlock(&runtime_sched.lock);
-}
-
-// Mark gp ready to run.
-void
-runtime_ready(G *gp)
-{
-	// Mark runnable.
-	m->locks++;  // disable preemption because it can be holding p in a local var
-	if(gp->status != Gwaiting) {
-		runtime_printf("goroutine %D has status %d\n", gp->goid, gp->status);
-		runtime_throw("bad g->status in ready");
-	}
-	gp->status = Grunnable;
-	runqput(m->p, gp);
-	if(runtime_atomicload(&runtime_sched.npidle) != 0 && runtime_atomicload(&runtime_sched.nmspinning) == 0)  // TODO: fast atomic
-		wakep();
-	m->locks--;
-}
-
-int32
-runtime_gcprocs(void)
-{
-	int32 n;
-
-	// Figure out how many CPUs to use during GC.
-	// Limited by gomaxprocs, number of actual CPUs, and MaxGcproc.
-	runtime_lock(&runtime_sched.lock);
-	n = runtime_gomaxprocs;
-	if(n > runtime_ncpu)
-		n = runtime_ncpu > 0 ? runtime_ncpu : 1;
-	if(n > MaxGcproc)
-		n = MaxGcproc;
-	if(n > runtime_sched.nmidle+1) // one M is currently running
-		n = runtime_sched.nmidle+1;
-	runtime_unlock(&runtime_sched.lock);
-	return n;
-}
-
-static bool
-needaddgcproc(void)
-{
-	int32 n;
-
-	runtime_lock(&runtime_sched.lock);
-	n = runtime_gomaxprocs;
-	if(n > runtime_ncpu)
-		n = runtime_ncpu;
-	if(n > MaxGcproc)
-		n = MaxGcproc;
-	n -= runtime_sched.nmidle+1; // one M is currently running
-	runtime_unlock(&runtime_sched.lock);
-	return n > 0;
-}
-
-void
-runtime_helpgc(int32 nproc)
-{
-	M *mp;
-	int32 n, pos;
-
-	runtime_lock(&runtime_sched.lock);
-	pos = 0;
-	for(n = 1; n < nproc; n++) {  // one M is currently running
-		if(runtime_allp[pos]->mcache == m->mcache)
-			pos++;
-		mp = mget();
-		if(mp == nil)
-			runtime_throw("runtime_gcprocs inconsistency");
-		mp->helpgc = n;
-		mp->mcache = runtime_allp[pos]->mcache;
-		pos++;
-		runtime_notewakeup(&mp->park);
-	}
-	runtime_unlock(&runtime_sched.lock);
-}
-
-// Similar to stoptheworld but best-effort and can be called several times.
-// There is no reverse operation, used during crashing.
-// This function must not lock any mutexes.
-void
-runtime_freezetheworld(void)
-{
-	int32 i;
-
-	if(runtime_gomaxprocs == 1)
-		return;
-	// stopwait and preemption requests can be lost
-	// due to races with concurrently executing threads,
-	// so try several times
-	for(i = 0; i < 5; i++) {
-		// this should tell the scheduler to not start any new goroutines
-		runtime_sched.stopwait = 0x7fffffff;
-		runtime_atomicstore((uint32*)&runtime_sched.gcwaiting, 1);
-		// this should stop running goroutines
-		if(!preemptall())
-			break;  // no running goroutines
-		runtime_usleep(1000);
-	}
-	// to be sure
-	runtime_usleep(1000);
-	preemptall();
-	runtime_usleep(1000);
-}
-
-void
-runtime_stoptheworld(void)
-{
-	int32 i;
-	uint32 s;
-	P *p;
-	bool wait;
-
-	runtime_lock(&runtime_sched.lock);
-	runtime_sched.stopwait = runtime_gomaxprocs;
-	runtime_atomicstore((uint32*)&runtime_sched.gcwaiting, 1);
-	preemptall();
-	// stop current P
-	m->p->status = Pgcstop;
-	runtime_sched.stopwait--;
-	// try to retake all P's in Psyscall status
-	for(i = 0; i < runtime_gomaxprocs; i++) {
-		p = runtime_allp[i];
-		s = p->status;
-		if(s == Psyscall && runtime_cas(&p->status, s, Pgcstop))
-			runtime_sched.stopwait--;
-	}
-	// stop idle P's
-	while((p = pidleget()) != nil) {
-		p->status = Pgcstop;
-		runtime_sched.stopwait--;
-	}
-	wait = runtime_sched.stopwait > 0;
-	runtime_unlock(&runtime_sched.lock);
-
-	// wait for remaining P's to stop voluntarily
-	if(wait) {
-		runtime_notesleep(&runtime_sched.stopnote);
-		runtime_noteclear(&runtime_sched.stopnote);
-	}
-	if(runtime_sched.stopwait)
-		runtime_throw("stoptheworld: not stopped");
-	for(i = 0; i < runtime_gomaxprocs; i++) {
-		p = runtime_allp[i];
-		if(p->status != Pgcstop)
-			runtime_throw("stoptheworld: not stopped");
-	}
-}
-
-static void
-mhelpgc(void)
-{
-	m->helpgc = -1;
-}
-
-void
-runtime_starttheworld(void)
-{
-	P *p, *p1;
-	M *mp;
-	G *gp;
-	bool add;
-
-	m->locks++;  // disable preemption because it can be holding p in a local var
-	gp = runtime_netpoll(false);  // non-blocking
-	injectglist(gp);
-	add = needaddgcproc();
-	runtime_lock(&runtime_sched.lock);
-	if(newprocs) {
-		procresize(newprocs);
-		newprocs = 0;
-	} else
-		procresize(runtime_gomaxprocs);
-	runtime_sched.gcwaiting = 0;
-
-	p1 = nil;
-	while((p = pidleget()) != nil) {
-		// procresize() puts p's with work at the beginning of the list.
-		// Once we reach a p without a run queue, the rest don't have one either.
-		if(p->runqhead == p->runqtail) {
-			pidleput(p);
-			break;
-		}
-		p->m = mget();
-		p->link = p1;
-		p1 = p;
-	}
-	if(runtime_sched.sysmonwait) {
-		runtime_sched.sysmonwait = false;
-		runtime_notewakeup(&runtime_sched.sysmonnote);
-	}
-	runtime_unlock(&runtime_sched.lock);
-
-	while(p1) {
-		p = p1;
-		p1 = p1->link;
-		if(p->m) {
-			mp = p->m;
-			p->m = nil;
-			if(mp->nextp)
-				runtime_throw("starttheworld: inconsistent mp->nextp");
-			mp->nextp = p;
-			runtime_notewakeup(&mp->park);
-		} else {
-			// Start M to run P.  Do not start another M below.
-			newm(nil, p);
-			add = false;
-		}
-	}
-
-	if(add) {
-		// If GC could have used another helper proc, start one now,
-		// in the hope that it will be available next time.
-		// It would have been even better to start it before the collection,
-		// but doing so requires allocating memory, so it's tricky to
-		// coordinate.  This lazy approach works out in practice:
-		// we don't mind if the first couple gc rounds don't have quite
-		// the maximum number of procs.
-		newm(mhelpgc, nil);
-	}
-	m->locks--;
-}
-
-// Called to start an M.
-void*
-runtime_mstart(void* mp)
-{
-	m = (M*)mp;
-	g = m->g0;
-
-	initcontext();
-
-	g->entry = nil;
-	g->param = nil;
-
-	// Record top of stack for use by mcall.
-	// Once we call schedule we're never coming back,
-	// so other calls can reuse this stack space.
-#ifdef USING_SPLIT_STACK
-	__splitstack_getcontext(&g->stack_context[0]);
-#else
-	g->gcinitial_sp = &mp;
-	// Setting gcstack_size to 0 is a marker meaning that gcinitial_sp
-	// is the top of the stack, not the bottom.
-	g->gcstack_size = 0;
-	g->gcnext_sp = &mp;
-#endif
-	getcontext(&g->context);
-
-	if(g->entry != nil) {
-		// Got here from mcall.
-		void (*pfn)(G*) = (void (*)(G*))g->entry;
-		G* gp = (G*)g->param;
-		pfn(gp);
-		*(int*)0x21 = 0x21;
-	}
-	runtime_minit();
-
-#ifdef USING_SPLIT_STACK
-	{
-		int dont_block_signals = 0;
-		__splitstack_block_signals(&dont_block_signals, nil);
-	}
-#endif
-
-	// Install signal handlers; after minit so that minit can
-	// prepare the thread to be able to handle the signals.
-	if(m == &runtime_m0) {
-		if(runtime_iscgo && !runtime_cgoHasExtraM) {
-			runtime_cgoHasExtraM = true;
-			runtime_newextram();
-			runtime_needextram = 0;
-		}
-		runtime_initsig();
-	}
-	
-	if(m->mstartfn)
-		m->mstartfn();
-
-	if(m->helpgc) {
-		m->helpgc = 0;
-		stopm();
-	} else if(m != &runtime_m0) {
-		acquirep(m->nextp);
-		m->nextp = nil;
-	}
-	schedule();
-
-	// TODO(brainman): This point is never reached, because scheduler
-	// does not release os threads at the moment. But once this path
-	// is enabled, we must remove our seh here.
-
-	return nil;
-}
-
-typedef struct CgoThreadStart CgoThreadStart;
-struct CgoThreadStart
-{
-	M *m;
-	G *g;
-	uintptr *tls;
-	void (*fn)(void);
-};
-
-// Allocate a new m unassociated with any thread.
-// Can use p for allocation context if needed.
-M*
-runtime_allocm(P *p, int32 stacksize, byte** ret_g0_stack, size_t* ret_g0_stacksize)
-{
-	M *mp;
-
-	m->locks++;  // disable GC because it can be called from sysmon
-	if(m->p == nil)
-		acquirep(p);  // temporarily borrow p for mallocs in this function
-#if 0
-	if(mtype == nil) {
-		Eface e;
-		runtime_gc_m_ptr(&e);
-		mtype = ((const PtrType*)e.__type_descriptor)->__element_type;
-	}
-#endif
-
-	mp = runtime_mal(sizeof *mp);
-	mcommoninit(mp);
-	mp->g0 = runtime_malg(stacksize, ret_g0_stack, ret_g0_stacksize);
-
-	if(p == m->p)
-		releasep();
-	m->locks--;
-
-	return mp;
-}
-
-static G*
-allocg(void)
-{
-	G *gp;
-	// static Type *gtype;
-	
-	// if(gtype == nil) {
-	// 	Eface e;
-	// 	runtime_gc_g_ptr(&e);
-	// 	gtype = ((PtrType*)e.__type_descriptor)->__element_type;
-	// }
-	// gp = runtime_cnew(gtype);
-	gp = runtime_malloc(sizeof(G));
-	return gp;
-}
-
-static M* lockextra(bool nilokay);
-static void unlockextra(M*);
-
-// needm is called when a cgo callback happens on a
-// thread without an m (a thread not created by Go).
-// In this case, needm is expected to find an m to use
-// and return with m, g initialized correctly.
-// Since m and g are not set now (likely nil, but see below)
-// needm is limited in what routines it can call. In particular
-// it can only call nosplit functions (textflag 7) and cannot
-// do any scheduling that requires an m.
-//
-// In order to avoid needing heavy lifting here, we adopt
-// the following strategy: there is a stack of available m's
-// that can be stolen. Using compare-and-swap
-// to pop from the stack has ABA races, so we simulate
-// a lock by doing an exchange (via casp) to steal the stack
-// head and replace the top pointer with MLOCKED (1).
-// This serves as a simple spin lock that we can use even
-// without an m. The thread that locks the stack in this way
-// unlocks the stack by storing a valid stack head pointer.
-//
-// In order to make sure that there is always an m structure
-// available to be stolen, we maintain the invariant that there
-// is always one more than needed. At the beginning of the
-// program (if cgo is in use) the list is seeded with a single m.
-// If needm finds that it has taken the last m off the list, its job
-// is - once it has installed its own m so that it can do things like
-// allocate memory - to create a spare m and put it on the list.
-//
-// Each of these extra m's also has a g0 and a curg that are
-// pressed into service as the scheduling stack and current
-// goroutine for the duration of the cgo callback.
-//
-// When the callback is done with the m, it calls dropm to
-// put the m back on the list.
-//
-// Unlike the gc toolchain, we start running on curg, since we are
-// just going to return and let the caller continue.
-void
-runtime_needm(void)
-{
-	M *mp;
-
-	if(runtime_needextram) {
-		// Can happen if C/C++ code calls Go from a global ctor.
-		// Can not throw, because scheduler is not initialized yet.
-		int rv __attribute__((unused));
-		rv = runtime_write(2, "fatal error: cgo callback before cgo call\n",
-			sizeof("fatal error: cgo callback before cgo call\n")-1);
-		runtime_exit(1);
-	}
-
-	// Lock extra list, take head, unlock popped list.
-	// nilokay=false is safe here because of the invariant above,
-	// that the extra list always contains or will soon contain
-	// at least one m.
-	mp = lockextra(false);
-
-	// Set needextram when we've just emptied the list,
-	// so that the eventual call into cgocallbackg will
-	// allocate a new m for the extra list. We delay the
-	// allocation until then so that it can be done
-	// after exitsyscall makes sure it is okay to be
-	// running at all (that is, there's no garbage collection
-	// running right now).
-	mp->needextram = mp->schedlink == nil;
-	unlockextra(mp->schedlink);
-
-	// Install m and g (= m->curg).
-	runtime_setmg(mp, mp->curg);
-
-	// Initialize g's context as in mstart.
-	initcontext();
-	g->status = Gsyscall;
-	g->entry = nil;
-	g->param = nil;
-#ifdef USING_SPLIT_STACK
-	__splitstack_getcontext(&g->stack_context[0]);
-#else
-	g->gcinitial_sp = &mp;
-	g->gcstack = nil;
-	g->gcstack_size = 0;
-	g->gcnext_sp = &mp;
-#endif
-	getcontext(&g->context);
-
-	if(g->entry != nil) {
-		// Got here from mcall.
-		void (*pfn)(G*) = (void (*)(G*))g->entry;
-		G* gp = (G*)g->param;
-		pfn(gp);
-		*(int*)0x22 = 0x22;
-	}
-
-	// Initialize this thread to use the m.
-	runtime_minit();
-
-#ifdef USING_SPLIT_STACK
-	{
-		int dont_block_signals = 0;
-		__splitstack_block_signals(&dont_block_signals, nil);
-	}
-#endif
-}
-
-// newextram allocates an m and puts it on the extra list.
-// It is called with a working local m, so that it can do things
-// like call schedlock and allocate.
-void
-runtime_newextram(void)
-{
-	M *mp, *mnext;
-	G *gp;
-	byte *g0_sp, *sp;
-	size_t g0_spsize, spsize;
-
-	// Create extra goroutine locked to extra m.
-	// The goroutine is the context in which the cgo callback will run.
-	// The sched.pc will never be returned to, but setting it to
-	// runtime.goexit makes clear to the traceback routines where
-	// the goroutine stack ends.
-	mp = runtime_allocm(nil, StackMin, &g0_sp, &g0_spsize);
-	gp = runtime_malg(StackMin, &sp, &spsize);
-	gp->status = Gdead;
-	mp->curg = gp;
-	mp->locked = LockInternal;
-	mp->lockedg = gp;
-	gp->lockedm = mp;
-	gp->goid = runtime_xadd64(&runtime_sched.goidgen, 1);
-	// put on allg for garbage collector
-	allgadd(gp);
-
-	// The context for gp will be set up in runtime_needm.  But
-	// here we need to set up the context for g0.
-	getcontext(&mp->g0->context);
-	mp->g0->context.uc_stack.ss_sp = g0_sp;
-	mp->g0->context.uc_stack.ss_size = g0_spsize;
-	makecontext(&mp->g0->context, kickoff, 0);
-
-	// Add m to the extra list.
-	mnext = lockextra(true);
-	mp->schedlink = mnext;
-	unlockextra(mp);
-}
-
-// dropm is called when a cgo callback has called needm but is now
-// done with the callback and returning back into the non-Go thread.
-// It puts the current m back onto the extra list.
-//
-// The main expense here is the call to signalstack to release the
-// m's signal stack, and then the call to needm on the next callback
-// from this thread. It is tempting to try to save the m for next time,
-// which would eliminate both these costs, but there might not be
-// a next time: the current thread (which Go does not control) might exit.
-// If we saved the m for that thread, there would be an m leak each time
-// such a thread exited. Instead, we acquire and release an m on each
-// call. These should typically not be scheduling operations, just a few
-// atomics, so the cost should be small.
-//
-// TODO(rsc): An alternative would be to allocate a dummy pthread per-thread
-// variable using pthread_key_create. Unlike the pthread keys we already use
-// on OS X, this dummy key would never be read by Go code. It would exist
-// only so that we could register at thread-exit-time destructor.
-// That destructor would put the m back onto the extra list.
-// This is purely a performance optimization. The current version,
-// in which dropm happens on each cgo call, is still correct too.
-// We may have to keep the current version on systems with cgo
-// but without pthreads, like Windows.
-void
-runtime_dropm(void)
-{
-	M *mp, *mnext;
-
-	// Undo whatever initialization minit did during needm.
-	runtime_unminit();
-
-	// Clear m and g, and return m to the extra list.
-	// After the call to setmg we can only call nosplit functions.
-	mp = m;
-	runtime_setmg(nil, nil);
-
-	mp->curg->status = Gdead;
-	mp->curg->gcstack = nil;
-	mp->curg->gcnext_sp = nil;
-
-	mnext = lockextra(true);
-	mp->schedlink = mnext;
-	unlockextra(mp);
-}
-
-#define MLOCKED ((M*)1)
-
-// lockextra locks the extra list and returns the list head.
-// The caller must unlock the list by storing a new list head
-// to runtime.extram. If nilokay is true, then lockextra will
-// return a nil list head if that's what it finds. If nilokay is false,
-// lockextra will keep waiting until the list head is no longer nil.
-static M*
-lockextra(bool nilokay)
-{
-	M *mp;
-	void (*yield)(void);
-
-	for(;;) {
-		mp = runtime_atomicloadp(&runtime_extram);
-		if(mp == MLOCKED) {
-			yield = runtime_osyield;
-			yield();
-			continue;
-		}
-		if(mp == nil && !nilokay) {
-			runtime_usleep(1);
-			continue;
-		}
-		if(!runtime_casp(&runtime_extram, mp, MLOCKED)) {
-			yield = runtime_osyield;
-			yield();
-			continue;
-		}
-		break;
-	}
-	return mp;
-}
-
-static void
-unlockextra(M *mp)
-{
-	runtime_atomicstorep(&runtime_extram, mp);
-}
-
-static int32
-countextra()
-{
-	M *mp, *mc;
-	int32 c;
-
-	for(;;) {
-		mp = runtime_atomicloadp(&runtime_extram);
-		if(mp == MLOCKED) {
-			runtime_osyield();
-			continue;
-		}
-		if(!runtime_casp(&runtime_extram, mp, MLOCKED)) {
-			runtime_osyield();
-			continue;
-		}
-		c = 0;
-		for(mc = mp; mc != nil; mc = mc->schedlink)
-			c++;
-		runtime_atomicstorep(&runtime_extram, mp);
-		return c;
-	}
-}
-
-// Create a new m.  It will start off with a call to fn, or else the scheduler.
-static void
-newm(void(*fn)(void), P *p)
-{
-	M *mp;
-
-	mp = runtime_allocm(p, -1, nil, nil);
-	mp->nextp = p;
-	mp->mstartfn = fn;
-
-	runtime_newosproc(mp);
-}
-
-// Stops execution of the current m until new work is available.
-// Returns with acquired P.
-static void
-stopm(void)
-{
-	if(m->locks)
-		runtime_throw("stopm holding locks");
-	if(m->p)
-		runtime_throw("stopm holding p");
-	if(m->spinning) {
-		m->spinning = false;
-		runtime_xadd(&runtime_sched.nmspinning, -1);
-	}
-
-retry:
-	runtime_lock(&runtime_sched.lock);
-	mput(m);
-	runtime_unlock(&runtime_sched.lock);
-	runtime_notesleep(&m->park);
-	runtime_noteclear(&m->park);
-	if(m->helpgc) {
-		runtime_gchelper();
-		m->helpgc = 0;
-		m->mcache = nil;
-		goto retry;
-	}
-	acquirep(m->nextp);
-	m->nextp = nil;
-}
-
-static void
-mspinning(void)
-{
-	m->spinning = true;
-}
-
-// Schedules some M to run the p (creates an M if necessary).
-// If p==nil, tries to get an idle P, if no idle P's does nothing.
-static void
-startm(P *p, bool spinning)
-{
-	M *mp;
-	void (*fn)(void);
-
-	runtime_lock(&runtime_sched.lock);
-	if(p == nil) {
-		p = pidleget();
-		if(p == nil) {
-			runtime_unlock(&runtime_sched.lock);
-			if(spinning)
-				runtime_xadd(&runtime_sched.nmspinning, -1);
-			return;
-		}
-	}
-	mp = mget();
-	runtime_unlock(&runtime_sched.lock);
-	if(mp == nil) {
-		fn = nil;
-		if(spinning)
-			fn = mspinning;
-		newm(fn, p);
-		return;
-	}
-	if(mp->spinning)
-		runtime_throw("startm: m is spinning");
-	if(mp->nextp)
-		runtime_throw("startm: m has p");
-	mp->spinning = spinning;
-	mp->nextp = p;
-	runtime_notewakeup(&mp->park);
-}
-
-// Hands off P from syscall or locked M.
-static void
-handoffp(P *p)
-{
-	// if it has local work, start it straight away
-	if(p->runqhead != p->runqtail || runtime_sched.runqsize) {
-		startm(p, false);
-		return;
-	}
-	// no local work, check that there are no spinning/idle M's,
-	// otherwise our help is not required
-	if(runtime_atomicload(&runtime_sched.nmspinning) + runtime_atomicload(&runtime_sched.npidle) == 0 &&  // TODO: fast atomic
-		runtime_cas(&runtime_sched.nmspinning, 0, 1)) {
-		startm(p, true);
-		return;
-	}
-	runtime_lock(&runtime_sched.lock);
-	if(runtime_sched.gcwaiting) {
-		p->status = Pgcstop;
-		if(--runtime_sched.stopwait == 0)
-			runtime_notewakeup(&runtime_sched.stopnote);
-		runtime_unlock(&runtime_sched.lock);
-		return;
-	}
-	if(runtime_sched.runqsize) {
-		runtime_unlock(&runtime_sched.lock);
-		startm(p, false);
-		return;
-	}
-	// If this is the last running P and nobody is polling network,
-	// need to wakeup another M to poll network.
-	if(runtime_sched.npidle == (uint32)runtime_gomaxprocs-1 && runtime_atomicload64(&runtime_sched.lastpoll) != 0) {
-		runtime_unlock(&runtime_sched.lock);
-		startm(p, false);
-		return;
-	}
-	pidleput(p);
-	runtime_unlock(&runtime_sched.lock);
-}
-
-// Tries to add one more P to execute G's.
-// Called when a G is made runnable (newproc, ready).
-static void
-wakep(void)
-{
-	// be conservative about spinning threads
-	if(!runtime_cas(&runtime_sched.nmspinning, 0, 1))
-		return;
-	startm(nil, true);
-}
-
-// Stops execution of the current m that is locked to a g until the g is runnable again.
-// Returns with acquired P.
-static void
-stoplockedm(void)
-{
-	P *p;
-
-	if(m->lockedg == nil || m->lockedg->lockedm != m)
-		runtime_throw("stoplockedm: inconsistent locking");
-	if(m->p) {
-		// Schedule another M to run this p.
-		p = releasep();
-		handoffp(p);
-	}
-	incidlelocked(1);
-	// Wait until another thread schedules lockedg again.
-	runtime_notesleep(&m->park);
-	runtime_noteclear(&m->park);
-	if(m->lockedg->status != Grunnable)
-		runtime_throw("stoplockedm: not runnable");
-	acquirep(m->nextp);
-	m->nextp = nil;
-}
-
-// Schedules the locked m to run the locked gp.
-static void
-startlockedm(G *gp)
-{
-	M *mp;
-	P *p;
-
-	mp = gp->lockedm;
-	if(mp == m)
-		runtime_throw("startlockedm: locked to me");
-	if(mp->nextp)
-		runtime_throw("startlockedm: m has p");
-	// directly handoff current P to the locked m
-	incidlelocked(-1);
-	p = releasep();
-	mp->nextp = p;
-	runtime_notewakeup(&mp->park);
-	stopm();
-}
-
-// Stops the current m for stoptheworld.
-// Returns when the world is restarted.
-static void
-gcstopm(void)
-{
-	P *p;
-
-	if(!runtime_sched.gcwaiting)
-		runtime_throw("gcstopm: not waiting for gc");
-	if(m->spinning) {
-		m->spinning = false;
-		runtime_xadd(&runtime_sched.nmspinning, -1);
-	}
-	p = releasep();
-	runtime_lock(&runtime_sched.lock);
-	p->status = Pgcstop;
-	if(--runtime_sched.stopwait == 0)
-		runtime_notewakeup(&runtime_sched.stopnote);
-	runtime_unlock(&runtime_sched.lock);
-	stopm();
-}
-
-// Schedules gp to run on the current M.
-// Never returns.
-static void
-execute(G *gp)
-{
-	int32 hz;
-
-	if(gp->status != Grunnable) {
-		runtime_printf("execute: bad g status %d\n", gp->status);
-		runtime_throw("execute: bad g status");
-	}
-	gp->status = Grunning;
-	gp->waitsince = 0;
-	m->p->schedtick++;
-	m->curg = gp;
-	gp->m = m;
-
-	// Check whether the profiler needs to be turned on or off.
-	hz = runtime_sched.profilehz;
-	if(m->profilehz != hz)
-		runtime_resetcpuprofiler(hz);
-
-	runtime_gogo(gp);
-}
-
-// Finds a runnable goroutine to execute.
-// Tries to steal from other P's, get g from global queue, poll network.
-static G*
-findrunnable(void)
-{
-	G *gp;
-	P *p;
-	int32 i;
-
-top:
-	if(runtime_sched.gcwaiting) {
-		gcstopm();
-		goto top;
-	}
-	if(runtime_fingwait && runtime_fingwake && (gp = runtime_wakefing()) != nil)
-		runtime_ready(gp);
-	// local runq
-	gp = runqget(m->p);
-	if(gp)
-		return gp;
-	// global runq
-	if(runtime_sched.runqsize) {
-		runtime_lock(&runtime_sched.lock);
-		gp = globrunqget(m->p, 0);
-		runtime_unlock(&runtime_sched.lock);
-		if(gp)
-			return gp;
-	}
-	// poll network
-	gp = runtime_netpoll(false);  // non-blocking
-	if(gp) {
-		injectglist(gp->schedlink);
-		gp->status = Grunnable;
-		return gp;
-	}
-	// If number of spinning M's >= number of busy P's, block.
-	// This is necessary to prevent excessive CPU consumption
-	// when GOMAXPROCS>>1 but the program parallelism is low.
-	if(!m->spinning && 2 * runtime_atomicload(&runtime_sched.nmspinning) >= runtime_gomaxprocs - runtime_atomicload(&runtime_sched.npidle))  // TODO: fast atomic
-		goto stop;
-	if(!m->spinning) {
-		m->spinning = true;
-		runtime_xadd(&runtime_sched.nmspinning, 1);
-	}
-	// random steal from other P's
-	for(i = 0; i < 2*runtime_gomaxprocs; i++) {
-		if(runtime_sched.gcwaiting)
-			goto top;
-		p = runtime_allp[runtime_fastrand1()%runtime_gomaxprocs];
-		if(p == m->p)
-			gp = runqget(p);
-		else
-			gp = runqsteal(m->p, p);
-		if(gp)
-			return gp;
-	}
-stop:
-	// return P and block
-	runtime_lock(&runtime_sched.lock);
-	if(runtime_sched.gcwaiting) {
-		runtime_unlock(&runtime_sched.lock);
-		goto top;
-	}
-	if(runtime_sched.runqsize) {
-		gp = globrunqget(m->p, 0);
-		runtime_unlock(&runtime_sched.lock);
-		return gp;
-	}
-	p = releasep();
-	pidleput(p);
-	runtime_unlock(&runtime_sched.lock);
-	if(m->spinning) {
-		m->spinning = false;
-		runtime_xadd(&runtime_sched.nmspinning, -1);
-	}
-	// check all runqueues once again
-	for(i = 0; i < runtime_gomaxprocs; i++) {
-		p = runtime_allp[i];
-		if(p && p->runqhead != p->runqtail) {
-			runtime_lock(&runtime_sched.lock);
-			p = pidleget();
-			runtime_unlock(&runtime_sched.lock);
-			if(p) {
-				acquirep(p);
-				goto top;
-			}
-			break;
-		}
-	}
-	// poll network
-	if(runtime_xchg64(&runtime_sched.lastpoll, 0) != 0) {
-		if(m->p)
-			runtime_throw("findrunnable: netpoll with p");
-		if(m->spinning)
-			runtime_throw("findrunnable: netpoll with spinning");
-		gp = runtime_netpoll(true);  // block until new work is available
-		runtime_atomicstore64(&runtime_sched.lastpoll, runtime_nanotime());
-		if(gp) {
-			runtime_lock(&runtime_sched.lock);
-			p = pidleget();
-			runtime_unlock(&runtime_sched.lock);
-			if(p) {
-				acquirep(p);
-				injectglist(gp->schedlink);
-				gp->status = Grunnable;
-				return gp;
-			}
-			injectglist(gp);
-		}
-	}
-	stopm();
-	goto top;
-}
-
-static void
-resetspinning(void)
-{
-	int32 nmspinning;
-
-	if(m->spinning) {
-		m->spinning = false;
-		nmspinning = runtime_xadd(&runtime_sched.nmspinning, -1);
-		if(nmspinning < 0)
-			runtime_throw("findrunnable: negative nmspinning");
-	} else
-		nmspinning = runtime_atomicload(&runtime_sched.nmspinning);
-
-	// M wakeup policy is deliberately somewhat conservative (see nmspinning handling),
-	// so see if we need to wakeup another P here.
-	if (nmspinning == 0 && runtime_atomicload(&runtime_sched.npidle) > 0)
-		wakep();
-}
-
-// Injects the list of runnable G's into the scheduler.
-// Can run concurrently with GC.
-static void
-injectglist(G *glist)
-{
-	int32 n;
-	G *gp;
-
-	if(glist == nil)
-		return;
-	runtime_lock(&runtime_sched.lock);
-	for(n = 0; glist; n++) {
-		gp = glist;
-		glist = gp->schedlink;
-		gp->status = Grunnable;
-		globrunqput(gp);
-	}
-	runtime_unlock(&runtime_sched.lock);
-
-	for(; n && runtime_sched.npidle; n--)
-		startm(nil, false);
-}
-
-// One round of scheduler: find a runnable goroutine and execute it.
-// Never returns.
-static void
-schedule(void)
-{
-	G *gp;
-	uint32 tick;
-
-	if(m->locks)
-		runtime_throw("schedule: holding locks");
-
-top:
-	if(runtime_sched.gcwaiting) {
-		gcstopm();
-		goto top;
-	}
-
-	gp = nil;
-	// Check the global runnable queue once in a while to ensure fairness.
-	// Otherwise two goroutines can completely occupy the local runqueue
-	// by constantly respawning each other.
-	tick = m->p->schedtick;
-	// This is a fancy way to say tick%61==0,
-	// it uses 2 MUL instructions instead of a single DIV and so is faster on modern processors.
-	if(tick - (((uint64)tick*0x4325c53fu)>>36)*61 == 0 && runtime_sched.runqsize > 0) {
-		runtime_lock(&runtime_sched.lock);
-		gp = globrunqget(m->p, 1);
-		runtime_unlock(&runtime_sched.lock);
-		if(gp)
-			resetspinning();
-	}
-	if(gp == nil) {
-		gp = runqget(m->p);
-		if(gp && m->spinning)
-			runtime_throw("schedule: spinning with local work");
-	}
-	if(gp == nil) {
-		gp = findrunnable();  // blocks until work is available
-		resetspinning();
-	}
-
-	if(gp->lockedm) {
-		// Hands off own p to the locked m,
-		// then blocks waiting for a new p.
-		startlockedm(gp);
-		goto top;
-	}
-
-	execute(gp);
-}
-
-// Puts the current goroutine into a waiting state and calls unlockf.
-// If unlockf returns false, the goroutine is resumed.
-void
-runtime_park(bool(*unlockf)(G*, void*), void *lock, const char *reason)
-{
-	if(g->status != Grunning)
-		runtime_throw("bad g status");
-	m->waitlock = lock;
-	m->waitunlockf = unlockf;
-	g->waitreason = reason;
-	runtime_mcall(park0);
-}
-
-static bool
-parkunlock(G *gp, void *lock)
-{
-	USED(gp);
-	runtime_unlock(lock);
-	return true;
-}
-
-// Puts the current goroutine into a waiting state and unlocks the lock.
-// The goroutine can be made runnable again by calling runtime_ready(gp).
-void
-runtime_parkunlock(Lock *lock, const char *reason)
-{
-	runtime_park(parkunlock, lock, reason);
-}
-
-// runtime_park continuation on g0.
-static void
-park0(G *gp)
-{
-	bool ok;
-
-	gp->status = Gwaiting;
-	gp->m = nil;
-	m->curg = nil;
-	if(m->waitunlockf) {
-		ok = m->waitunlockf(gp, m->waitlock);
-		m->waitunlockf = nil;
-		m->waitlock = nil;
-		if(!ok) {
-			gp->status = Grunnable;
-			execute(gp);  // Schedule it back, never returns.
-		}
-	}
-	if(m->lockedg) {
-		stoplockedm();
-		execute(gp);  // Never returns.
-	}
-	schedule();
-}
-
-// Scheduler yield.
-void
-runtime_gosched(void)
-{
-	if(g->status != Grunning)
-		runtime_throw("bad g status");
-	runtime_mcall(runtime_gosched0);
-}
-
-// runtime_gosched continuation on g0.
-void
-runtime_gosched0(G *gp)
-{
-	gp->status = Grunnable;
-	gp->m = nil;
-	m->curg = nil;
-	runtime_lock(&runtime_sched.lock);
-	globrunqput(gp);
-	runtime_unlock(&runtime_sched.lock);
-	if(m->lockedg) {
-		stoplockedm();
-		execute(gp);  // Never returns.
-	}
-	schedule();
-}
-
-// Finishes execution of the current goroutine.
-// Need to mark it as nosplit, because it runs with sp > stackbase (as runtime_lessstack).
-// Since it does not return it does not matter.  But if it is preempted
-// at the split stack check, GC will complain about inconsistent sp.
-void runtime_goexit(void) __attribute__ ((noinline));
-void
-runtime_goexit(void)
-{
-	if(g->status != Grunning)
-		runtime_throw("bad g status");
-	runtime_mcall(goexit0);
-}
-
-// runtime_goexit continuation on g0.
-static void
-goexit0(G *gp)
-{
-	gp->status = Gdead;
-	gp->entry = nil;
-	gp->m = nil;
-	gp->lockedm = nil;
-	gp->paniconfault = 0;
-	gp->defer = nil; // should be true already but just in case.
-	gp->panic = nil; // non-nil for Goexit during panic. points at stack-allocated data.
-	gp->writenbuf = 0;
-	gp->writebuf = nil;
-	gp->waitreason = nil;
-	gp->param = nil;
-	m->curg = nil;
-	m->lockedg = nil;
-	if(m->locked & ~LockExternal) {
-		runtime_printf("invalid m->locked = %d\n", m->locked);
-		runtime_throw("internal lockOSThread error");
-	}	
-	m->locked = 0;
-	gfput(m->p, gp);
-	schedule();
-}
-
-// The goroutine g is about to enter a system call.
-// Record that it's not using the cpu anymore.
-// This is called only from the go syscall library and cgocall,
-// not from the low-level system calls used by the runtime.
-//
-// Entersyscall cannot split the stack: the runtime_gosave must
-// make g->sched refer to the caller's stack segment, because
-// entersyscall is going to return immediately after.
-
-void runtime_entersyscall(void) __attribute__ ((no_split_stack));
-static void doentersyscall(void) __attribute__ ((no_split_stack, noinline));
-
-void
-runtime_entersyscall()
-{
-	// Save the registers in the g structure so that any pointers
-	// held in registers will be seen by the garbage collector.
-	getcontext(&g->gcregs);
-
-	// Do the work in a separate function, so that this function
-	// doesn't save any registers on its own stack.  If this
-	// function does save any registers, we might store the wrong
-	// value in the call to getcontext.
-	//
-	// FIXME: This assumes that we do not need to save any
-	// callee-saved registers to access the TLS variable g.  We
-	// don't want to put the ucontext_t on the stack because it is
-	// large and we can not split the stack here.
-	doentersyscall();
-}
-
-static void
-doentersyscall()
-{
-	// Disable preemption because during this function g is in Gsyscall status,
-	// but can have inconsistent g->sched, do not let GC observe it.
-	m->locks++;
-
-	// Leave SP around for GC and traceback.
-#ifdef USING_SPLIT_STACK
-	g->gcstack = __splitstack_find(nil, nil, &g->gcstack_size,
-				       &g->gcnext_segment, &g->gcnext_sp,
-				       &g->gcinitial_sp);
-#else
-	{
-		void *v;
-
-		g->gcnext_sp = (byte *) &v;
-	}
-#endif
-
-	g->status = Gsyscall;
-
-	if(runtime_atomicload(&runtime_sched.sysmonwait)) {  // TODO: fast atomic
-		runtime_lock(&runtime_sched.lock);
-		if(runtime_atomicload(&runtime_sched.sysmonwait)) {
-			runtime_atomicstore(&runtime_sched.sysmonwait, 0);
-			runtime_notewakeup(&runtime_sched.sysmonnote);
-		}
-		runtime_unlock(&runtime_sched.lock);
-	}
-
-	m->mcache = nil;
-	m->p->m = nil;
-	runtime_atomicstore(&m->p->status, Psyscall);
-	if(runtime_sched.gcwaiting) {
-		runtime_lock(&runtime_sched.lock);
-		if (runtime_sched.stopwait > 0 && runtime_cas(&m->p->status, Psyscall, Pgcstop)) {
-			if(--runtime_sched.stopwait == 0)
-				runtime_notewakeup(&runtime_sched.stopnote);
-		}
-		runtime_unlock(&runtime_sched.lock);
-	}
-
-	m->locks--;
-}
-
-// The same as runtime_entersyscall(), but with a hint that the syscall is blocking.
-void
-runtime_entersyscallblock(void)
-{
-	P *p;
-
-	m->locks++;  // see comment in entersyscall
-
-	// Leave SP around for GC and traceback.
-#ifdef USING_SPLIT_STACK
-	g->gcstack = __splitstack_find(nil, nil, &g->gcstack_size,
-				       &g->gcnext_segment, &g->gcnext_sp,
-				       &g->gcinitial_sp);
-#else
-	g->gcnext_sp = (byte *) &p;
-#endif
-
-	// Save the registers in the g structure so that any pointers
-	// held in registers will be seen by the garbage collector.
-	getcontext(&g->gcregs);
-
-	g->status = Gsyscall;
-
-	p = releasep();
-	handoffp(p);
-	if(g->isbackground)  // do not consider blocked scavenger for deadlock detection
-		incidlelocked(1);
-
-	m->locks--;
-}
-
-// The goroutine g exited its system call.
-// Arrange for it to run on a cpu again.
-// This is called only from the go syscall library, not
-// from the low-level system calls used by the runtime.
-void
-runtime_exitsyscall(void)
-{
-	G *gp;
-
-	m->locks++;  // see comment in entersyscall
-
-	gp = g;
-	if(gp->isbackground)  // do not consider blocked scavenger for deadlock detection
-		incidlelocked(-1);
-
-	g->waitsince = 0;
-	if(exitsyscallfast()) {
-		// There's a cpu for us, so we can run.
-		m->p->syscalltick++;
-		gp->status = Grunning;
-		// Garbage collector isn't running (since we are),
-		// so okay to clear gcstack and gcsp.
-#ifdef USING_SPLIT_STACK
-		gp->gcstack = nil;
-#endif
-		gp->gcnext_sp = nil;
-		runtime_memclr(&gp->gcregs, sizeof gp->gcregs);
-		m->locks--;
-		return;
-	}
-
-	m->locks--;
-
-	// Call the scheduler.
-	runtime_mcall(exitsyscall0);
-
-	// Scheduler returned, so we're allowed to run now.
-	// Delete the gcstack information that we left for
-	// the garbage collector during the system call.
-	// Must wait until now because until gosched returns
-	// we don't know for sure that the garbage collector
-	// is not running.
-#ifdef USING_SPLIT_STACK
-	gp->gcstack = nil;
-#endif
-	gp->gcnext_sp = nil;
-	runtime_memclr(&gp->gcregs, sizeof gp->gcregs);
-
-	// Don't refer to m again, we might be running on a different
-	// thread after returning from runtime_mcall.
-	runtime_m()->p->syscalltick++;
-}
-
-static bool
-exitsyscallfast(void)
-{
-	P *p;
-
-	// Freezetheworld sets stopwait but does not retake P's.
-	if(runtime_sched.stopwait) {
-		m->p = nil;
-		return false;
-	}
-
-	// Try to re-acquire the last P.
-	if(m->p && m->p->status == Psyscall && runtime_cas(&m->p->status, Psyscall, Prunning)) {
-		// There's a cpu for us, so we can run.
-		m->mcache = m->p->mcache;
-		m->p->m = m;
-		return true;
-	}
-	// Try to get any other idle P.
-	m->p = nil;
-	if(runtime_sched.pidle) {
-		runtime_lock(&runtime_sched.lock);
-		p = pidleget();
-		if(p && runtime_atomicload(&runtime_sched.sysmonwait)) {
-			runtime_atomicstore(&runtime_sched.sysmonwait, 0);
-			runtime_notewakeup(&runtime_sched.sysmonnote);
-		}
-		runtime_unlock(&runtime_sched.lock);
-		if(p) {
-			acquirep(p);
-			return true;
-		}
-	}
-	return false;
-}
-
-// runtime_exitsyscall slow path on g0.
-// Failed to acquire P, enqueue gp as runnable.
-static void
-exitsyscall0(G *gp)
-{
-	P *p;
-
-	gp->status = Grunnable;
-	gp->m = nil;
-	m->curg = nil;
-	runtime_lock(&runtime_sched.lock);
-	p = pidleget();
-	if(p == nil)
-		globrunqput(gp);
-	else if(runtime_atomicload(&runtime_sched.sysmonwait)) {
-		runtime_atomicstore(&runtime_sched.sysmonwait, 0);
-		runtime_notewakeup(&runtime_sched.sysmonnote);
-	}
-	runtime_unlock(&runtime_sched.lock);
-	if(p) {
-		acquirep(p);
-		execute(gp);  // Never returns.
-	}
-	if(m->lockedg) {
-		// Wait until another thread schedules gp and so m again.
-		stoplockedm();
-		execute(gp);  // Never returns.
-	}
-	stopm();
-	schedule();  // Never returns.
-}
-
-// Called from syscall package before fork.
-void syscall_runtime_BeforeFork(void)
-  __asm__(GOSYM_PREFIX "syscall.runtime_BeforeFork");
-void
-syscall_runtime_BeforeFork(void)
-{
-	// Fork can hang if preempted with signals frequently enough (see issue 5517).
-	// Ensure that we stay on the same M where we disable profiling.
-	runtime_m()->locks++;
-	if(runtime_m()->profilehz != 0)
-		runtime_resetcpuprofiler(0);
-}
-
-// Called from syscall package after fork in parent.
-void syscall_runtime_AfterFork(void)
-  __asm__(GOSYM_PREFIX "syscall.runtime_AfterFork");
-void
-syscall_runtime_AfterFork(void)
-{
-	int32 hz;
-
-	hz = runtime_sched.profilehz;
-	if(hz != 0)
-		runtime_resetcpuprofiler(hz);
-	runtime_m()->locks--;
-}
-
-// Allocate a new g, with a stack big enough for stacksize bytes.
-G*
-runtime_malg(int32 stacksize, byte** ret_stack, size_t* ret_stacksize)
-{
-	G *newg;
-
-	newg = allocg();
-	if(stacksize >= 0) {
-#if USING_SPLIT_STACK
-		int dont_block_signals = 0;
-
-		*ret_stack = __splitstack_makecontext(stacksize,
-						      &newg->stack_context[0],
-						      ret_stacksize);
-		__splitstack_block_signals_context(&newg->stack_context[0],
-						   &dont_block_signals, nil);
-#else
-                // In 64-bit mode, the maximum Go allocation space is
-                // 128G.  Our stack size is 4M, which only permits 32K
-                // goroutines.  In order to not limit ourselves,
-                // allocate the stacks out of separate memory.  In
-                // 32-bit mode, the Go allocation space is all of
-                // memory anyhow.
-		if(sizeof(void*) == 8) {
-			void *p = runtime_SysAlloc(stacksize, &mstats.other_sys);
-			if(p == nil)
-				runtime_throw("runtime: cannot allocate memory for goroutine stack");
-			*ret_stack = (byte*)p;
-		} else {
-			*ret_stack = runtime_mallocgc(stacksize, 0, FlagNoProfiling|FlagNoGC);
-			runtime_xadd(&runtime_stacks_sys, stacksize);
-		}
-		*ret_stacksize = stacksize;
-		newg->gcinitial_sp = *ret_stack;
-		newg->gcstack_size = stacksize;
-#endif
-	}
-	return newg;
-}
-
-/* For runtime package testing.  */
-
-
-// Create a new g running fn with siz bytes of arguments.
-// Put it on the queue of g's waiting to run.
-// The compiler turns a go statement into a call to this.
-// Cannot split the stack because it assumes that the arguments
-// are available sequentially after &fn; they would not be
-// copied if a stack split occurred.  It's OK for this to call
-// functions that split the stack.
-void runtime_testing_entersyscall(int32)
-  __asm__ (GOSYM_PREFIX "runtime.entersyscall");
-void
-runtime_testing_entersyscall(int32 dummy __attribute__ ((unused)))
-{
-	runtime_entersyscall();
-}
-
-void runtime_testing_exitsyscall(int32)
-  __asm__ (GOSYM_PREFIX "runtime.exitsyscall");
-
-void
-runtime_testing_exitsyscall(int32 dummy __attribute__ ((unused)))
-{
-	runtime_exitsyscall();
-}
-
-G*
-__go_go(void (*fn)(void*), void* arg)
-{
-	byte *sp;
-	size_t spsize;
-	G *newg;
-	P *p;
-
-//runtime_printf("newproc1 %p %p narg=%d nret=%d\n", fn->fn, argp, narg, nret);
-	if(fn == nil) {
-		m->throwing = -1;  // do not dump full stacks
-		runtime_throw("go of nil func value");
-	}
-	m->locks++;  // disable preemption because it can be holding p in a local var
-
-	p = m->p;
-	if((newg = gfget(p)) != nil) {
-#ifdef USING_SPLIT_STACK
-		int dont_block_signals = 0;
-
-		sp = __splitstack_resetcontext(&newg->stack_context[0],
-					       &spsize);
-		__splitstack_block_signals_context(&newg->stack_context[0],
-						   &dont_block_signals, nil);
-#else
-		sp = newg->gcinitial_sp;
-		spsize = newg->gcstack_size;
-		if(spsize == 0)
-			runtime_throw("bad spsize in __go_go");
-		newg->gcnext_sp = sp;
-#endif
-	} else {
-		newg = runtime_malg(StackMin, &sp, &spsize);
-		allgadd(newg);
-	}
-
-	newg->entry = (byte*)fn;
-	newg->param = arg;
-	newg->gopc = (uintptr)__builtin_return_address(0);
-	newg->status = Grunnable;
-	if(p->goidcache == p->goidcacheend) {
-		p->goidcache = runtime_xadd64(&runtime_sched.goidgen, GoidCacheBatch);
-		p->goidcacheend = p->goidcache + GoidCacheBatch;
-	}
-	newg->goid = p->goidcache++;
-
-	{
-		// Avoid warnings about variables clobbered by
-		// longjmp.
-		byte * volatile vsp = sp;
-		size_t volatile vspsize = spsize;
-		G * volatile vnewg = newg;
-
-		getcontext(&vnewg->context);
-		vnewg->context.uc_stack.ss_sp = vsp;
-#ifdef MAKECONTEXT_STACK_TOP
-		vnewg->context.uc_stack.ss_sp += vspsize;
-#endif
-		vnewg->context.uc_stack.ss_size = vspsize;
-		makecontext(&vnewg->context, kickoff, 0);
-
-		runqput(p, vnewg);
-
-		if(runtime_atomicload(&runtime_sched.npidle) != 0 && runtime_atomicload(&runtime_sched.nmspinning) == 0 && fn != runtime_main)  // TODO: fast atomic
-			wakep();
-		m->locks--;
-		return vnewg;
-	}
-}
-
-static void
-allgadd(G *gp)
-{
-	G **new;
-	uintptr cap;
-
-	runtime_lock(&allglock);
-	if(runtime_allglen >= allgcap) {
-		cap = 4096/sizeof(new[0]);
-		if(cap < 2*allgcap)
-			cap = 2*allgcap;
-		new = runtime_malloc(cap*sizeof(new[0]));
-		if(new == nil)
-			runtime_throw("runtime: cannot allocate memory");
-		if(runtime_allg != nil) {
-			runtime_memmove(new, runtime_allg, runtime_allglen*sizeof(new[0]));
-			runtime_free(runtime_allg);
-		}
-		runtime_allg = new;
-		allgcap = cap;
-	}
-	runtime_allg[runtime_allglen++] = gp;
-	runtime_unlock(&allglock);
-}
-
-// Put on gfree list.
-// If local list is too long, transfer a batch to the global list.
-static void
-gfput(P *p, G *gp)
-{
-	gp->schedlink = p->gfree;
-	p->gfree = gp;
-	p->gfreecnt++;
-	if(p->gfreecnt >= 64) {
-		runtime_lock(&runtime_sched.gflock);
-		while(p->gfreecnt >= 32) {
-			p->gfreecnt--;
-			gp = p->gfree;
-			p->gfree = gp->schedlink;
-			gp->schedlink = runtime_sched.gfree;
-			runtime_sched.gfree = gp;
-		}
-		runtime_unlock(&runtime_sched.gflock);
-	}
-}
-
-// Get from gfree list.
-// If local list is empty, grab a batch from global list.
-static G*
-gfget(P *p)
-{
-	G *gp;
-
-retry:
-	gp = p->gfree;
-	if(gp == nil && runtime_sched.gfree) {
-		runtime_lock(&runtime_sched.gflock);
-		while(p->gfreecnt < 32 && runtime_sched.gfree) {
-			p->gfreecnt++;
-			gp = runtime_sched.gfree;
-			runtime_sched.gfree = gp->schedlink;
-			gp->schedlink = p->gfree;
-			p->gfree = gp;
-		}
-		runtime_unlock(&runtime_sched.gflock);
-		goto retry;
-	}
-	if(gp) {
-		p->gfree = gp->schedlink;
-		p->gfreecnt--;
-	}
-	return gp;
-}
-
-// Purge all cached G's from gfree list to the global list.
-static void
-gfpurge(P *p)
-{
-	G *gp;
-
-	runtime_lock(&runtime_sched.gflock);
-	while(p->gfreecnt) {
-		p->gfreecnt--;
-		gp = p->gfree;
-		p->gfree = gp->schedlink;
-		gp->schedlink = runtime_sched.gfree;
-		runtime_sched.gfree = gp;
-	}
-	runtime_unlock(&runtime_sched.gflock);
-}
-
-void
-runtime_Breakpoint(void)
-{
-	runtime_breakpoint();
-}
-
-void runtime_Gosched (void) __asm__ (GOSYM_PREFIX "runtime.Gosched");
-
-void
-runtime_Gosched(void)
-{
-	runtime_gosched();
-}
-
-// Implementation of runtime.GOMAXPROCS.
-// delete when scheduler is even stronger
-int32
-runtime_gomaxprocsfunc(int32 n)
-{
-	int32 ret;
-
-	if(n > MaxGomaxprocs)
-		n = MaxGomaxprocs;
-	runtime_lock(&runtime_sched.lock);
-	ret = runtime_gomaxprocs;
-	if(n <= 0 || n == ret) {
-		runtime_unlock(&runtime_sched.lock);
-		return ret;
-	}
-	runtime_unlock(&runtime_sched.lock);
-
-	runtime_semacquire(&runtime_worldsema, false);
-	m->gcing = 1;
-	runtime_stoptheworld();
-	newprocs = n;
-	m->gcing = 0;
-	runtime_semrelease(&runtime_worldsema);
-	runtime_starttheworld();
-
-	return ret;
-}
-
-// lockOSThread is called by runtime.LockOSThread and runtime.lockOSThread below
-// after they modify m->locked. Do not allow preemption during this call,
-// or else the m might be different in this function than in the caller.
-static void
-lockOSThread(void)
-{
-	m->lockedg = g;
-	g->lockedm = m;
-}
-
-void	runtime_LockOSThread(void) __asm__ (GOSYM_PREFIX "runtime.LockOSThread");
-void
-runtime_LockOSThread(void)
-{
-	m->locked |= LockExternal;
-	lockOSThread();
-}
-
-void
-runtime_lockOSThread(void)
-{
-	m->locked += LockInternal;
-	lockOSThread();
-}
-
-
-// unlockOSThread is called by runtime.UnlockOSThread and runtime.unlockOSThread below
-// after they update m->locked. Do not allow preemption during this call,
-// or else the m might be in different in this function than in the caller.
-static void
-unlockOSThread(void)
-{
-	if(m->locked != 0)
-		return;
-	m->lockedg = nil;
-	g->lockedm = nil;
-}
-
-void	runtime_UnlockOSThread(void) __asm__ (GOSYM_PREFIX "runtime.UnlockOSThread");
-
-void
-runtime_UnlockOSThread(void)
-{
-	m->locked &= ~LockExternal;
-	unlockOSThread();
-}
-
-void
-runtime_unlockOSThread(void)
-{
-	if(m->locked < LockInternal)
-		runtime_throw("runtime: internal error: misuse of lockOSThread/unlockOSThread");
-	m->locked -= LockInternal;
-	unlockOSThread();
-}
-
-bool
-runtime_lockedOSThread(void)
-{
-	return g->lockedm != nil && m->lockedg != nil;
-}
-
-int32
-runtime_gcount(void)
-{
-	G *gp;
-	int32 n, s;
-	uintptr i;
-
-	n = 0;
-	runtime_lock(&allglock);
-	// TODO(dvyukov): runtime.NumGoroutine() is O(N).
-	// We do not want to increment/decrement centralized counter in newproc/goexit,
-	// just to make runtime.NumGoroutine() faster.
-	// Compromise solution is to introduce per-P counters of active goroutines.
-	for(i = 0; i < runtime_allglen; i++) {
-		gp = runtime_allg[i];
-		s = gp->status;
-		if(s == Grunnable || s == Grunning || s == Gsyscall || s == Gwaiting)
-			n++;
-	}
-	runtime_unlock(&allglock);
-	return n;
-}
-
-int32
-runtime_mcount(void)
-{
-	return runtime_sched.mcount;
-}
-
-static struct {
-	Lock lock;
-	void (*fn)(uintptr*, int32);
-	int32 hz;
-	uintptr pcbuf[TracebackMaxFrames];
-	Location locbuf[TracebackMaxFrames];
-} prof;
-
-static void System(void) {}
-static void GC(void) {}
-
-// Called if we receive a SIGPROF signal.
-void
-runtime_sigprof()
-{
-	M *mp = m;
-	int32 n, i;
-	bool traceback;
-
-	if(prof.fn == nil || prof.hz == 0)
-		return;
-
-	if(mp == nil)
-		return;
-
-	// Profiling runs concurrently with GC, so it must not allocate.
-	mp->mallocing++;
-
-	traceback = true;
-
-	if(mp->mcache == nil)
-		traceback = false;
-
-	runtime_lock(&prof.lock);
-	if(prof.fn == nil) {
-		runtime_unlock(&prof.lock);
-		mp->mallocing--;
-		return;
-	}
-	n = 0;
-
-	if(runtime_atomicload(&runtime_in_callers) > 0) {
-		// If SIGPROF arrived while already fetching runtime
-		// callers we can have trouble on older systems
-		// because the unwind library calls dl_iterate_phdr
-		// which was not recursive in the past.
-		traceback = false;
-	}
-
-	if(traceback) {
-		n = runtime_callers(0, prof.locbuf, nelem(prof.locbuf), false);
-		for(i = 0; i < n; i++)
-			prof.pcbuf[i] = prof.locbuf[i].pc;
-	}
-	if(!traceback || n <= 0) {
-		n = 2;
-		prof.pcbuf[0] = (uintptr)runtime_getcallerpc(&n);
-		if(mp->gcing || mp->helpgc)
-			prof.pcbuf[1] = (uintptr)GC;
-		else
-			prof.pcbuf[1] = (uintptr)System;
-	}
-	prof.fn(prof.pcbuf, n);
-	runtime_unlock(&prof.lock);
-	mp->mallocing--;
-}
-
-// Arrange to call fn with a traceback hz times a second.
-void
-runtime_setcpuprofilerate(void (*fn)(uintptr*, int32), int32 hz)
-{
-	// Force sane arguments.
-	if(hz < 0)
-		hz = 0;
-	if(hz == 0)
-		fn = nil;
-	if(fn == nil)
-		hz = 0;
-
-	// Disable preemption, otherwise we can be rescheduled to another thread
-	// that has profiling enabled.
-	m->locks++;
-
-	// Stop profiler on this thread so that it is safe to lock prof.
-	// if a profiling signal came in while we had prof locked,
-	// it would deadlock.
-	runtime_resetcpuprofiler(0);
-
-	runtime_lock(&prof.lock);
-	prof.fn = fn;
-	prof.hz = hz;
-	runtime_unlock(&prof.lock);
-	runtime_lock(&runtime_sched.lock);
-	runtime_sched.profilehz = hz;
-	runtime_unlock(&runtime_sched.lock);
-
-	if(hz != 0)
-		runtime_resetcpuprofiler(hz);
-
-	m->locks--;
-}
-
-// Change number of processors.  The world is stopped, sched is locked.
-static void
-procresize(int32 new)
-{
-	int32 i, old;
-	bool empty;
-	G *gp;
-	P *p;
-
-	old = runtime_gomaxprocs;
-	if(old < 0 || old > MaxGomaxprocs || new <= 0 || new >MaxGomaxprocs)
-		runtime_throw("procresize: invalid arg");
-	// initialize new P's
-	for(i = 0; i < new; i++) {
-		p = runtime_allp[i];
-		if(p == nil) {
-			p = (P*)runtime_mallocgc(sizeof(*p), 0, FlagNoInvokeGC);
-			p->id = i;
-			p->status = Pgcstop;
-			runtime_atomicstorep(&runtime_allp[i], p);
-		}
-		if(p->mcache == nil) {
-			if(old==0 && i==0)
-				p->mcache = m->mcache;  // bootstrap
-			else
-				p->mcache = runtime_allocmcache();
-		}
-	}
-
-	// redistribute runnable G's evenly
-	// collect all runnable goroutines in global queue preserving FIFO order
-	// FIFO order is required to ensure fairness even during frequent GCs
-	// see http://golang.org/issue/7126
-	empty = false;
-	while(!empty) {
-		empty = true;
-		for(i = 0; i < old; i++) {
-			p = runtime_allp[i];
-			if(p->runqhead == p->runqtail)
-				continue;
-			empty = false;
-			// pop from tail of local queue
-			p->runqtail--;
-			gp = p->runq[p->runqtail%nelem(p->runq)];
-			// push onto head of global queue
-			gp->schedlink = runtime_sched.runqhead;
-			runtime_sched.runqhead = gp;
-			if(runtime_sched.runqtail == nil)
-				runtime_sched.runqtail = gp;
-			runtime_sched.runqsize++;
-		}
-	}
-	// fill local queues with at most nelem(p->runq)/2 goroutines
-	// start at 1 because current M already executes some G and will acquire allp[0] below,
-	// so if we have a spare G we want to put it into allp[1].
-	for(i = 1; (uint32)i < (uint32)new * nelem(p->runq)/2 && runtime_sched.runqsize > 0; i++) {
-		gp = runtime_sched.runqhead;
-		runtime_sched.runqhead = gp->schedlink;
-		if(runtime_sched.runqhead == nil)
-			runtime_sched.runqtail = nil;
-		runtime_sched.runqsize--;
-		runqput(runtime_allp[i%new], gp);
-	}
-
-	// free unused P's
-	for(i = new; i < old; i++) {
-		p = runtime_allp[i];
-		runtime_freemcache(p->mcache);
-		p->mcache = nil;
-		gfpurge(p);
-		p->status = Pdead;
-		// can't free P itself because it can be referenced by an M in syscall
-	}
-
-	if(m->p)
-		m->p->m = nil;
-	m->p = nil;
-	m->mcache = nil;
-	p = runtime_allp[0];
-	p->m = nil;
-	p->status = Pidle;
-	acquirep(p);
-	for(i = new-1; i > 0; i--) {
-		p = runtime_allp[i];
-		p->status = Pidle;
-		pidleput(p);
-	}
-	runtime_atomicstore((uint32*)&runtime_gomaxprocs, new);
-}
-
-// Associate p and the current m.
-static void
-acquirep(P *p)
-{
-	if(m->p || m->mcache)
-		runtime_throw("acquirep: already in go");
-	if(p->m || p->status != Pidle) {
-		runtime_printf("acquirep: p->m=%p(%d) p->status=%d\n", p->m, p->m ? p->m->id : 0, p->status);
-		runtime_throw("acquirep: invalid p state");
-	}
-	m->mcache = p->mcache;
-	m->p = p;
-	p->m = m;
-	p->status = Prunning;
-}
-
-// Disassociate p and the current m.
-static P*
-releasep(void)
-{
-	P *p;
-
-	if(m->p == nil || m->mcache == nil)
-		runtime_throw("releasep: invalid arg");
-	p = m->p;
-	if(p->m != m || p->mcache != m->mcache || p->status != Prunning) {
-		runtime_printf("releasep: m=%p m->p=%p p->m=%p m->mcache=%p p->mcache=%p p->status=%d\n",
-			m, m->p, p->m, m->mcache, p->mcache, p->status);
-		runtime_throw("releasep: invalid p state");
-	}
-	m->p = nil;
-	m->mcache = nil;
-	p->m = nil;
-	p->status = Pidle;
-	return p;
-}
-
-static void
-incidlelocked(int32 v)
-{
-	runtime_lock(&runtime_sched.lock);
-	runtime_sched.nmidlelocked += v;
-	if(v > 0)
-		checkdead();
-	runtime_unlock(&runtime_sched.lock);
-}
-
-// Check for deadlock situation.
-// The check is based on number of running M's, if 0 -> deadlock.
-static void
-checkdead(void)
-{
-	G *gp;
-	int32 run, grunning, s;
-	uintptr i;
-
-	// For -buildmode=c-shared or -buildmode=c-archive it's OK if
-	// there are no running goroutines.  The calling program is
-	// assumed to be running.
-	if(runtime_isarchive) {
-		return;
-	}
-
-	// -1 for sysmon
-	run = runtime_sched.mcount - runtime_sched.nmidle - runtime_sched.nmidlelocked - 1 - countextra();
-	if(run > 0)
-		return;
-	// If we are dying because of a signal caught on an already idle thread,
-	// freezetheworld will cause all running threads to block.
-	// And runtime will essentially enter into deadlock state,
-	// except that there is a thread that will call runtime_exit soon.
-	if(runtime_panicking > 0)
-		return;
-	if(run < 0) {
-		runtime_printf("runtime: checkdead: nmidle=%d nmidlelocked=%d mcount=%d\n",
-			runtime_sched.nmidle, runtime_sched.nmidlelocked, runtime_sched.mcount);
-		runtime_throw("checkdead: inconsistent counts");
-	}
-	grunning = 0;
-	runtime_lock(&allglock);
-	for(i = 0; i < runtime_allglen; i++) {
-		gp = runtime_allg[i];
-		if(gp->isbackground)
-			continue;
-		s = gp->status;
-		if(s == Gwaiting)
-			grunning++;
-		else if(s == Grunnable || s == Grunning || s == Gsyscall) {
-			runtime_unlock(&allglock);
-			runtime_printf("runtime: checkdead: find g %D in status %d\n", gp->goid, s);
-			runtime_throw("checkdead: runnable g");
-		}
-	}
-	runtime_unlock(&allglock);
-	if(grunning == 0)  // possible if main goroutine calls runtime_Goexit()
-		runtime_throw("no goroutines (main called runtime.Goexit) - deadlock!");
-	m->throwing = -1;  // do not dump full stacks
-	runtime_throw("all goroutines are asleep - deadlock!");
-}
-
-static void
-sysmon(void)
-{
-	uint32 idle, delay;
-	int64 now, lastpoll, lasttrace;
-	G *gp;
-
-	lasttrace = 0;
-	idle = 0;  // how many cycles in succession we had not wokeup somebody
-	delay = 0;
-	for(;;) {
-		if(idle == 0)  // start with 20us sleep...
-			delay = 20;
-		else if(idle > 50)  // start doubling the sleep after 1ms...
-			delay *= 2;
-		if(delay > 10*1000)  // up to 10ms
-			delay = 10*1000;
-		runtime_usleep(delay);
-		if(runtime_debug.schedtrace <= 0 &&
-			(runtime_sched.gcwaiting || runtime_atomicload(&runtime_sched.npidle) == (uint32)runtime_gomaxprocs)) {  // TODO: fast atomic
-			runtime_lock(&runtime_sched.lock);
-			if(runtime_atomicload(&runtime_sched.gcwaiting) || runtime_atomicload(&runtime_sched.npidle) == (uint32)runtime_gomaxprocs) {
-				runtime_atomicstore(&runtime_sched.sysmonwait, 1);
-				runtime_unlock(&runtime_sched.lock);
-				runtime_notesleep(&runtime_sched.sysmonnote);
-				runtime_noteclear(&runtime_sched.sysmonnote);
-				idle = 0;
-				delay = 20;
-			} else
-				runtime_unlock(&runtime_sched.lock);
-		}
-		// poll network if not polled for more than 10ms
-		lastpoll = runtime_atomicload64(&runtime_sched.lastpoll);
-		now = runtime_nanotime();
-		if(lastpoll != 0 && lastpoll + 10*1000*1000 < now) {
-			runtime_cas64(&runtime_sched.lastpoll, lastpoll, now);
-			gp = runtime_netpoll(false);  // non-blocking
-			if(gp) {
-				// Need to decrement number of idle locked M's
-				// (pretending that one more is running) before injectglist.
-				// Otherwise it can lead to the following situation:
-				// injectglist grabs all P's but before it starts M's to run the P's,
-				// another M returns from syscall, finishes running its G,
-				// observes that there is no work to do and no other running M's
-				// and reports deadlock.
-				incidlelocked(-1);
-				injectglist(gp);
-				incidlelocked(1);
-			}
-		}
-		// retake P's blocked in syscalls
-		// and preempt long running G's
-		if(retake(now))
-			idle = 0;
-		else
-			idle++;
-
-		if(runtime_debug.schedtrace > 0 && lasttrace + runtime_debug.schedtrace*1000000ll <= now) {
-			lasttrace = now;
-			runtime_schedtrace(runtime_debug.scheddetail);
-		}
-	}
-}
-
-typedef struct Pdesc Pdesc;
-struct Pdesc
-{
-	uint32	schedtick;
-	int64	schedwhen;
-	uint32	syscalltick;
-	int64	syscallwhen;
-};
-static Pdesc pdesc[MaxGomaxprocs];
-
-static uint32
-retake(int64 now)
-{
-	uint32 i, s, n;
-	int64 t;
-	P *p;
-	Pdesc *pd;
-
-	n = 0;
-	for(i = 0; i < (uint32)runtime_gomaxprocs; i++) {
-		p = runtime_allp[i];
-		if(p==nil)
-			continue;
-		pd = &pdesc[i];
-		s = p->status;
-		if(s == Psyscall) {
-			// Retake P from syscall if it's there for more than 1 sysmon tick (at least 20us).
-			t = p->syscalltick;
-			if(pd->syscalltick != t) {
-				pd->syscalltick = t;
-				pd->syscallwhen = now;
-				continue;
-			}
-			// On the one hand we don't want to retake Ps if there is no other work to do,
-			// but on the other hand we want to retake them eventually
-			// because they can prevent the sysmon thread from deep sleep.
-			if(p->runqhead == p->runqtail &&
-				runtime_atomicload(&runtime_sched.nmspinning) + runtime_atomicload(&runtime_sched.npidle) > 0 &&
-				pd->syscallwhen + 10*1000*1000 > now)
-				continue;
-			// Need to decrement number of idle locked M's
-			// (pretending that one more is running) before the CAS.
-			// Otherwise the M from which we retake can exit the syscall,
-			// increment nmidle and report deadlock.
-			incidlelocked(-1);
-			if(runtime_cas(&p->status, s, Pidle)) {
-				n++;
-				handoffp(p);
-			}
-			incidlelocked(1);
-		} else if(s == Prunning) {
-			// Preempt G if it's running for more than 10ms.
-			t = p->schedtick;
-			if(pd->schedtick != t) {
-				pd->schedtick = t;
-				pd->schedwhen = now;
-				continue;
-			}
-			if(pd->schedwhen + 10*1000*1000 > now)
-				continue;
-			// preemptone(p);
-		}
-	}
-	return n;
-}
-
-// Tell all goroutines that they have been preempted and they should stop.
-// This function is purely best-effort.  It can fail to inform a goroutine if a
-// processor just started running it.
-// No locks need to be held.
-// Returns true if preemption request was issued to at least one goroutine.
-static bool
-preemptall(void)
-{
-	return false;
-}
-
-void
-runtime_schedtrace(bool detailed)
-{
-	static int64 starttime;
-	int64 now;
-	int64 id1, id2, id3;
-	int32 i, t, h;
-	uintptr gi;
-	const char *fmt;
-	M *mp, *lockedm;
-	G *gp, *lockedg;
-	P *p;
-
-	now = runtime_nanotime();
-	if(starttime == 0)
-		starttime = now;
-
-	runtime_lock(&runtime_sched.lock);
-	runtime_printf("SCHED %Dms: gomaxprocs=%d idleprocs=%d threads=%d idlethreads=%d runqueue=%d",
-		(now-starttime)/1000000, runtime_gomaxprocs, runtime_sched.npidle, runtime_sched.mcount,
-		runtime_sched.nmidle, runtime_sched.runqsize);
-	if(detailed) {
-		runtime_printf(" gcwaiting=%d nmidlelocked=%d nmspinning=%d stopwait=%d sysmonwait=%d\n",
-			runtime_sched.gcwaiting, runtime_sched.nmidlelocked, runtime_sched.nmspinning,
-			runtime_sched.stopwait, runtime_sched.sysmonwait);
-	}
-	// We must be careful while reading data from P's, M's and G's.
-	// Even if we hold schedlock, most data can be changed concurrently.
-	// E.g. (p->m ? p->m->id : -1) can crash if p->m changes from non-nil to nil.
-	for(i = 0; i < runtime_gomaxprocs; i++) {
-		p = runtime_allp[i];
-		if(p == nil)
-			continue;
-		mp = p->m;
-		h = runtime_atomicload(&p->runqhead);
-		t = runtime_atomicload(&p->runqtail);
-		if(detailed)
-			runtime_printf("  P%d: status=%d schedtick=%d syscalltick=%d m=%d runqsize=%d gfreecnt=%d\n",
-				i, p->status, p->schedtick, p->syscalltick, mp ? mp->id : -1, t-h, p->gfreecnt);
-		else {
-			// In non-detailed mode format lengths of per-P run queues as:
-			// [len1 len2 len3 len4]
-			fmt = " %d";
-			if(runtime_gomaxprocs == 1)
-				fmt = " [%d]\n";
-			else if(i == 0)
-				fmt = " [%d";
-			else if(i == runtime_gomaxprocs-1)
-				fmt = " %d]\n";
-			runtime_printf(fmt, t-h);
-		}
-	}
-	if(!detailed) {
-		runtime_unlock(&runtime_sched.lock);
-		return;
-	}
-	for(mp = runtime_allm; mp; mp = mp->alllink) {
-		p = mp->p;
-		gp = mp->curg;
-		lockedg = mp->lockedg;
-		id1 = -1;
-		if(p)
-			id1 = p->id;
-		id2 = -1;
-		if(gp)
-			id2 = gp->goid;
-		id3 = -1;
-		if(lockedg)
-			id3 = lockedg->goid;
-		runtime_printf("  M%d: p=%D curg=%D mallocing=%d throwing=%d gcing=%d"
-			" locks=%d dying=%d helpgc=%d spinning=%d blocked=%d lockedg=%D\n",
-			mp->id, id1, id2,
-			mp->mallocing, mp->throwing, mp->gcing, mp->locks, mp->dying, mp->helpgc,
-			mp->spinning, m->blocked, id3);
-	}
-	runtime_lock(&allglock);
-	for(gi = 0; gi < runtime_allglen; gi++) {
-		gp = runtime_allg[gi];
-		mp = gp->m;
-		lockedm = gp->lockedm;
-		runtime_printf("  G%D: status=%d(%s) m=%d lockedm=%d\n",
-			gp->goid, gp->status, gp->waitreason, mp ? mp->id : -1,
-			lockedm ? lockedm->id : -1);
-	}
-	runtime_unlock(&allglock);
-	runtime_unlock(&runtime_sched.lock);
-}
-
-// Put mp on midle list.
-// Sched must be locked.
-static void
-mput(M *mp)
-{
-	mp->schedlink = runtime_sched.midle;
-	runtime_sched.midle = mp;
-	runtime_sched.nmidle++;
-	checkdead();
-}
-
-// Try to get an m from midle list.
-// Sched must be locked.
-static M*
-mget(void)
-{
-	M *mp;
-
-	if((mp = runtime_sched.midle) != nil){
-		runtime_sched.midle = mp->schedlink;
-		runtime_sched.nmidle--;
-	}
-	return mp;
-}
-
-// Put gp on the global runnable queue.
-// Sched must be locked.
-static void
-globrunqput(G *gp)
-{
-	gp->schedlink = nil;
-	if(runtime_sched.runqtail)
-		runtime_sched.runqtail->schedlink = gp;
-	else
-		runtime_sched.runqhead = gp;
-	runtime_sched.runqtail = gp;
-	runtime_sched.runqsize++;
-}
-
-// Put a batch of runnable goroutines on the global runnable queue.
-// Sched must be locked.
-static void
-globrunqputbatch(G *ghead, G *gtail, int32 n)
-{
-	gtail->schedlink = nil;
-	if(runtime_sched.runqtail)
-		runtime_sched.runqtail->schedlink = ghead;
-	else
-		runtime_sched.runqhead = ghead;
-	runtime_sched.runqtail = gtail;
-	runtime_sched.runqsize += n;
-}
-
-// Try get a batch of G's from the global runnable queue.
-// Sched must be locked.
-static G*
-globrunqget(P *p, int32 max)
-{
-	G *gp, *gp1;
-	int32 n;
-
-	if(runtime_sched.runqsize == 0)
-		return nil;
-	n = runtime_sched.runqsize/runtime_gomaxprocs+1;
-	if(n > runtime_sched.runqsize)
-		n = runtime_sched.runqsize;
-	if(max > 0 && n > max)
-		n = max;
-	if((uint32)n > nelem(p->runq)/2)
-		n = nelem(p->runq)/2;
-	runtime_sched.runqsize -= n;
-	if(runtime_sched.runqsize == 0)
-		runtime_sched.runqtail = nil;
-	gp = runtime_sched.runqhead;
-	runtime_sched.runqhead = gp->schedlink;
-	n--;
-	while(n--) {
-		gp1 = runtime_sched.runqhead;
-		runtime_sched.runqhead = gp1->schedlink;
-		runqput(p, gp1);
-	}
-	return gp;
-}
-
-// Put p to on pidle list.
-// Sched must be locked.
-static void
-pidleput(P *p)
-{
-	p->link = runtime_sched.pidle;
-	runtime_sched.pidle = p;
-	runtime_xadd(&runtime_sched.npidle, 1);  // TODO: fast atomic
-}
-
-// Try get a p from pidle list.
-// Sched must be locked.
-static P*
-pidleget(void)
-{
-	P *p;
-
-	p = runtime_sched.pidle;
-	if(p) {
-		runtime_sched.pidle = p->link;
-		runtime_xadd(&runtime_sched.npidle, -1);  // TODO: fast atomic
-	}
-	return p;
-}
-
-// Try to put g on local runnable queue.
-// If it's full, put onto global queue.
-// Executed only by the owner P.
-static void
-runqput(P *p, G *gp)
-{
-	uint32 h, t;
-
-retry:
-	h = runtime_atomicload(&p->runqhead);  // load-acquire, synchronize with consumers
-	t = p->runqtail;
-	if(t - h < nelem(p->runq)) {
-		p->runq[t%nelem(p->runq)] = gp;
-		runtime_atomicstore(&p->runqtail, t+1);  // store-release, makes the item available for consumption
-		return;
-	}
-	if(runqputslow(p, gp, h, t))
-		return;
-	// the queue is not full, now the put above must suceed
-	goto retry;
-}
-
-// Put g and a batch of work from local runnable queue on global queue.
-// Executed only by the owner P.
-static bool
-runqputslow(P *p, G *gp, uint32 h, uint32 t)
-{
-	G *batch[nelem(p->runq)/2+1];
-	uint32 n, i;
-
-	// First, grab a batch from local queue.
-	n = t-h;
-	n = n/2;
-	if(n != nelem(p->runq)/2)
-		runtime_throw("runqputslow: queue is not full");
-	for(i=0; i<n; i++)
-		batch[i] = p->runq[(h+i)%nelem(p->runq)];
-	if(!runtime_cas(&p->runqhead, h, h+n))  // cas-release, commits consume
-		return false;
-	batch[n] = gp;
-	// Link the goroutines.
-	for(i=0; i<n; i++)
-		batch[i]->schedlink = batch[i+1];
-	// Now put the batch on global queue.
-	runtime_lock(&runtime_sched.lock);
-	globrunqputbatch(batch[0], batch[n], n+1);
-	runtime_unlock(&runtime_sched.lock);
-	return true;
-}
-
-// Get g from local runnable queue.
-// Executed only by the owner P.
-static G*
-runqget(P *p)
-{
-	G *gp;
-	uint32 t, h;
-
-	for(;;) {
-		h = runtime_atomicload(&p->runqhead);  // load-acquire, synchronize with other consumers
-		t = p->runqtail;
-		if(t == h)
-			return nil;
-		gp = p->runq[h%nelem(p->runq)];
-		if(runtime_cas(&p->runqhead, h, h+1))  // cas-release, commits consume
-			return gp;
-	}
-}
-
-// Grabs a batch of goroutines from local runnable queue.
-// batch array must be of size nelem(p->runq)/2. Returns number of grabbed goroutines.
-// Can be executed by any P.
-static uint32
-runqgrab(P *p, G **batch)
-{
-	uint32 t, h, n, i;
-
-	for(;;) {
-		h = runtime_atomicload(&p->runqhead);  // load-acquire, synchronize with other consumers
-		t = runtime_atomicload(&p->runqtail);  // load-acquire, synchronize with the producer
-		n = t-h;
-		n = n - n/2;
-		if(n == 0)
-			break;
-		if(n > nelem(p->runq)/2)  // read inconsistent h and t
-			continue;
-		for(i=0; i<n; i++)
-			batch[i] = p->runq[(h+i)%nelem(p->runq)];
-		if(runtime_cas(&p->runqhead, h, h+n))  // cas-release, commits consume
-			break;
-	}
-	return n;
-}
-
-// Steal half of elements from local runnable queue of p2
-// and put onto local runnable queue of p.
-// Returns one of the stolen elements (or nil if failed).
-static G*
-runqsteal(P *p, P *p2)
-{
-	G *gp;
-	G *batch[nelem(p->runq)/2];
-	uint32 t, h, n, i;
-
-	n = runqgrab(p2, batch);
-	if(n == 0)
-		return nil;
-	n--;
-	gp = batch[n];
-	if(n == 0)
-		return gp;
-	h = runtime_atomicload(&p->runqhead);  // load-acquire, synchronize with consumers
-	t = p->runqtail;
-	if(t - h + n >= nelem(p->runq))
-		runtime_throw("runqsteal: runq overflow");
-	for(i=0; i<n; i++, t++)
-		p->runq[t%nelem(p->runq)] = batch[i];
-	runtime_atomicstore(&p->runqtail, t);  // store-release, makes the item available for consumption
-	return gp;
-}
-
-void runtime_testSchedLocalQueue(void)
-  __asm__("runtime.testSchedLocalQueue");
-
-void
-runtime_testSchedLocalQueue(void)
-{
-	P p;
-	G gs[nelem(p.runq)];
-	int32 i, j;
-
-	runtime_memclr((byte*)&p, sizeof(p));
-
-	for(i = 0; i < (int32)nelem(gs); i++) {
-		if(runqget(&p) != nil)
-			runtime_throw("runq is not empty initially");
-		for(j = 0; j < i; j++)
-			runqput(&p, &gs[i]);
-		for(j = 0; j < i; j++) {
-			if(runqget(&p) != &gs[i]) {
-				runtime_printf("bad element at iter %d/%d\n", i, j);
-				runtime_throw("bad element");
-			}
-		}
-		if(runqget(&p) != nil)
-			runtime_throw("runq is not empty afterwards");
-	}
-}
-
-void runtime_testSchedLocalQueueSteal(void)
-  __asm__("runtime.testSchedLocalQueueSteal");
-
-void
-runtime_testSchedLocalQueueSteal(void)
-{
-	P p1, p2;
-	G gs[nelem(p1.runq)], *gp;
-	int32 i, j, s;
-
-	runtime_memclr((byte*)&p1, sizeof(p1));
-	runtime_memclr((byte*)&p2, sizeof(p2));
-
-	for(i = 0; i < (int32)nelem(gs); i++) {
-		for(j = 0; j < i; j++) {
-			gs[j].sig = 0;
-			runqput(&p1, &gs[j]);
-		}
-		gp = runqsteal(&p2, &p1);
-		s = 0;
-		if(gp) {
-			s++;
-			gp->sig++;
-		}
-		while((gp = runqget(&p2)) != nil) {
-			s++;
-			gp->sig++;
-		}
-		while((gp = runqget(&p1)) != nil)
-			gp->sig++;
-		for(j = 0; j < i; j++) {
-			if(gs[j].sig != 1) {
-				runtime_printf("bad element %d(%d) at iter %d\n", j, gs[j].sig, i);
-				runtime_throw("bad element");
-			}
-		}
-		if(s != i/2 && s != i/2+1) {
-			runtime_printf("bad steal %d, want %d or %d, iter %d\n",
-				s, i/2, i/2+1, i);
-			runtime_throw("bad steal");
-		}
-	}
-}
-
-int32
-runtime_setmaxthreads(int32 in)
-{
-	int32 out;
-
-	runtime_lock(&runtime_sched.lock);
-	out = runtime_sched.maxmcount;
-	runtime_sched.maxmcount = in;
-	checkmcount();
-	runtime_unlock(&runtime_sched.lock);
-	return out;
-}
-
-void
-runtime_proc_scan(struct Workbuf** wbufp, void (*enqueue1)(struct Workbuf**, Obj))
-{
-	enqueue1(wbufp, (Obj){(byte*)&runtime_sched, sizeof runtime_sched, 0});
-	enqueue1(wbufp, (Obj){(byte*)&runtime_main_init_done, sizeof runtime_main_init_done, 0});
-}
-
-// Return whether we are waiting for a GC.  This gc toolchain uses
-// preemption instead.
-bool
-runtime_gcwaiting(void)
-{
-	return runtime_sched.gcwaiting;
-}
-
-// os_beforeExit is called from os.Exit(0).
-//go:linkname os_beforeExit os.runtime_beforeExit
-
-extern void os_beforeExit() __asm__ (GOSYM_PREFIX "os.runtime_beforeExit");
-
-void
-os_beforeExit()
-{
-}
-
-// Active spinning for sync.Mutex.
-//go:linkname sync_runtime_canSpin sync.runtime_canSpin
-
-enum
-{
-	ACTIVE_SPIN = 4,
-	ACTIVE_SPIN_CNT = 30,
-};
-
-extern _Bool sync_runtime_canSpin(intgo i)
-  __asm__ (GOSYM_PREFIX "sync.runtime_canSpin");
-
-_Bool
-sync_runtime_canSpin(intgo i)
-{
-	P *p;
-
-	// sync.Mutex is cooperative, so we are conservative with spinning.
-	// Spin only few times and only if running on a multicore machine and
-	// GOMAXPROCS>1 and there is at least one other running P and local runq is empty.
-	// As opposed to runtime mutex we don't do passive spinning here,
-	// because there can be work on global runq on on other Ps.
-	if (i >= ACTIVE_SPIN || runtime_ncpu <= 1 || runtime_gomaxprocs <= (int32)(runtime_sched.npidle+runtime_sched.nmspinning)+1) {
-		return false;
-	}
-	p = m->p;
-	return p != nil && p->runqhead == p->runqtail;
-}
-
-//go:linkname sync_runtime_doSpin sync.runtime_doSpin
-//go:nosplit
-
-extern void sync_runtime_doSpin(void)
-  __asm__ (GOSYM_PREFIX "sync.runtime_doSpin");
-
-void
-sync_runtime_doSpin()
-{
-	runtime_procyield(ACTIVE_SPIN_CNT);
-}
diff --git a/third_party/gofrontend/libgo/runtime/rdebug.goc b/third_party/gofrontend/libgo/runtime/rdebug.goc
deleted file mode 100644
index 63eb4dd..0000000
--- a/third_party/gofrontend/libgo/runtime/rdebug.goc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime_debug
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-
-func setMaxStack(in int) (out int) {
-	out = runtime_maxstacksize;
-	runtime_maxstacksize = in;
-}
-
-func setGCPercent(in int) (out int) {
-	out = runtime_setgcpercent(in);
-}
-
-func setMaxThreads(in int) (out int) {
-	out = runtime_setmaxthreads(in);
-}
-
-func SetPanicOnFault(enabled bool) (old bool) {
-	old = runtime_g()->paniconfault;
-	runtime_g()->paniconfault = enabled;
-}
diff --git a/third_party/gofrontend/libgo/runtime/reflect.goc b/third_party/gofrontend/libgo/runtime/reflect.goc
deleted file mode 100644
index 4e493ee..0000000
--- a/third_party/gofrontend/libgo/runtime/reflect.goc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package reflect
-#include "runtime.h"
-#include "go-type.h"
-#include "interface.h"
-#include "go-panic.h"
-
-func ifaceE2I(inter *Type, e Eface, ret *Iface) {
-	const Type *t;
-	Eface err;
-
-	t = e.__type_descriptor;
-	if(t == nil) {
-		// explicit conversions require non-nil interface value.
-		runtime_newTypeAssertionError(
-			nil, nil, inter->__reflection,
-			nil, &err);
-		runtime_panic(err);
-	}
-	ret->__object = e.__object;
-	ret->__methods = __go_convert_interface(inter, t);
-}
diff --git a/third_party/gofrontend/libgo/runtime/rtems-task-variable-add.c b/third_party/gofrontend/libgo/runtime/rtems-task-variable-add.c
deleted file mode 100644
index 89dbb00..0000000
--- a/third_party/gofrontend/libgo/runtime/rtems-task-variable-add.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* rtems-task-variable-add.c -- adding a task specific variable in RTEMS OS.
-
-   Copyright 2010 The Go Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style
-   license that can be found in the LICENSE file.  */
-
-#include <rtems/error.h>
-#include <rtems/system.h>
-#include <rtems/rtems/tasks.h>
-
-#include "go-assert.h"
-
-/* RTEMS does not support GNU TLS extension __thread.  */
-void
-__wrap_rtems_task_variable_add (void **var)
-{
-  rtems_status_code sc = rtems_task_variable_add (RTEMS_SELF, var, NULL);
-  if (sc != RTEMS_SUCCESSFUL)
-    {
-      rtems_error (sc, "rtems_task_variable_add failed");
-      __go_assert (0);
-    }
-}
-
diff --git a/third_party/gofrontend/libgo/runtime/runtime.c b/third_party/gofrontend/libgo/runtime/runtime.c
deleted file mode 100644
index be7ccbd..0000000
--- a/third_party/gofrontend/libgo/runtime/runtime.c
+++ /dev/null
@@ -1,420 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <signal.h>
-#include <unistd.h>
-
-#include "config.h"
-
-#include "runtime.h"
-#include "arch.h"
-#include "array.h"
-
-enum {
-	maxround = sizeof(uintptr),
-};
-
-// Keep a cached value to make gotraceback fast,
-// since we call it on every call to gentraceback.
-// The cached value is a uint32 in which the low bit
-// is the "crash" setting and the top 31 bits are the
-// gotraceback value.
-static uint32 traceback_cache = ~(uint32)0;
-
-extern volatile intgo runtime_MemProfileRate
-  __asm__ (GOSYM_PREFIX "runtime.MemProfileRate");
-
-
-// The GOTRACEBACK environment variable controls the
-// behavior of a Go program that is crashing and exiting.
-//	GOTRACEBACK=0   suppress all tracebacks
-//	GOTRACEBACK=1   default behavior - show tracebacks but exclude runtime frames
-//	GOTRACEBACK=2   show tracebacks including runtime frames
-//	GOTRACEBACK=crash   show tracebacks including runtime frames, then crash (core dump etc)
-int32
-runtime_gotraceback(bool *crash)
-{
-	String s;
-	const byte *p;
-	uint32 x;
-
-	if(crash != nil)
-		*crash = false;
-	if(runtime_m()->traceback != 0)
-		return runtime_m()->traceback;
-	x = runtime_atomicload(&traceback_cache);
-	if(x == ~(uint32)0) {
-		s = runtime_getenv("GOTRACEBACK");
-		p = s.str;
-		if(s.len == 0)
-			x = 1<<1;
-		else if(s.len == 5 && runtime_strcmp((const char *)p, "crash") == 0)
-			x = (2<<1) | 1;
-		else
-			x = runtime_atoi(p, s.len)<<1;	
-		runtime_atomicstore(&traceback_cache, x);
-	}
-	if(crash != nil)
-		*crash = x&1;
-	return x>>1;
-}
-
-static int32	argc;
-static byte**	argv;
-
-static Slice args;
-Slice envs;
-
-void (*runtime_sysargs)(int32, uint8**);
-
-void
-runtime_args(int32 c, byte **v)
-{
-	argc = c;
-	argv = v;
-	if(runtime_sysargs != nil)
-		runtime_sysargs(c, v);
-}
-
-byte*
-runtime_progname()
-{
-  return argc == 0 ? nil : argv[0];
-}
-
-void
-runtime_goargs(void)
-{
-	String *s;
-	int32 i;
-
-	// for windows implementation see "os" package
-	if(Windows)
-		return;
-
-	s = runtime_malloc(argc*sizeof s[0]);
-	for(i=0; i<argc; i++)
-		s[i] = runtime_gostringnocopy((const byte*)argv[i]);
-	args.__values = (void*)s;
-	args.__count = argc;
-	args.__capacity = argc;
-}
-
-void
-runtime_goenvs_unix(void)
-{
-	String *s;
-	int32 i, n;
-
-	for(n=0; argv[argc+1+n] != 0; n++)
-		;
-
-	s = runtime_malloc(n*sizeof s[0]);
-	for(i=0; i<n; i++)
-		s[i] = runtime_gostringnocopy(argv[argc+1+i]);
-	envs.__values = (void*)s;
-	envs.__count = n;
-	envs.__capacity = n;
-}
-
-// Called from the syscall package.
-Slice runtime_envs(void) __asm__ (GOSYM_PREFIX "syscall.runtime_envs");
-
-Slice
-runtime_envs()
-{
-	return envs;
-}
-
-Slice os_runtime_args(void) __asm__ (GOSYM_PREFIX "os.runtime_args");
-
-Slice
-os_runtime_args()
-{
-	return args;
-}
-
-int32
-runtime_atoi(const byte *p, intgo len)
-{
-	int32 n;
-
-	n = 0;
-	while(len > 0 && '0' <= *p && *p <= '9') {
-		n = n*10 + *p++ - '0';
-		len--;
-	}
-	return n;
-}
-
-static struct root_list runtime_roots =
-{ nil,
-  { { &envs, sizeof envs },
-    { &args, sizeof args },
-    { nil, 0 } },
-};
-
-static void
-TestAtomic64(void)
-{
-	uint64 z64, x64;
-
-	z64 = 42;
-	x64 = 0;
-	PREFETCH(&z64);
-	if(runtime_cas64(&z64, x64, 1))
-		runtime_throw("cas64 failed");
-	if(x64 != 0)
-		runtime_throw("cas64 failed");
-	x64 = 42;
-	if(!runtime_cas64(&z64, x64, 1))
-		runtime_throw("cas64 failed");
-	if(x64 != 42 || z64 != 1)
-		runtime_throw("cas64 failed");
-	if(runtime_atomicload64(&z64) != 1)
-		runtime_throw("load64 failed");
-	runtime_atomicstore64(&z64, (1ull<<40)+1);
-	if(runtime_atomicload64(&z64) != (1ull<<40)+1)
-		runtime_throw("store64 failed");
-	if(runtime_xadd64(&z64, (1ull<<40)+1) != (2ull<<40)+2)
-		runtime_throw("xadd64 failed");
-	if(runtime_atomicload64(&z64) != (2ull<<40)+2)
-		runtime_throw("xadd64 failed");
-	if(runtime_xchg64(&z64, (3ull<<40)+3) != (2ull<<40)+2)
-		runtime_throw("xchg64 failed");
-	if(runtime_atomicload64(&z64) != (3ull<<40)+3)
-		runtime_throw("xchg64 failed");
-}
-
-void
-runtime_check(void)
-{
-	__go_register_gc_roots(&runtime_roots);
-
-	TestAtomic64();
-}
-
-uint32
-runtime_fastrand1(void)
-{
-	M *m;
-	uint32 x;
-
-	m = runtime_m();
-	x = m->fastrand;
-	x += x;
-	if(x & 0x80000000L)
-		x ^= 0x88888eefUL;
-	m->fastrand = x;
-	return x;
-}
-
-int64
-runtime_cputicks(void)
-{
-#if defined(__386__) || defined(__x86_64__)
-  uint32 low, high;
-  asm("rdtsc" : "=a" (low), "=d" (high));
-  return (int64)(((uint64)high << 32) | (uint64)low);
-#elif defined (__s390__) || defined (__s390x__)
-  uint64 clock = 0;
-  /* stckf may not write the return variable in case of a clock error, so make
-     it read-write to prevent that the initialisation is optimised out.
-     Note: Targets below z9-109 will crash when executing store clock fast, i.e.
-     we don't support Go for machines older than that.  */
-  asm volatile(".insn s,0xb27c0000,%0" /* stckf */ : "+Q" (clock) : : "cc" );
-  return (int64)clock;
-#else
-  // FIXME: implement for other processors.
-  return 0;
-#endif
-}
-
-bool
-runtime_showframe(String s, bool current)
-{
-	static int32 traceback = -1;
-
-	if(current && runtime_m()->throwing > 0)
-		return 1;
-	if(traceback < 0)
-		traceback = runtime_gotraceback(nil);
-	return traceback > 1 || (__builtin_memchr(s.str, '.', s.len) != nil && __builtin_memcmp(s.str, "runtime.", 7) != 0);
-}
-
-static Lock ticksLock;
-static int64 ticks;
-
-int64
-runtime_tickspersecond(void)
-{
-	int64 res, t0, t1, c0, c1;
-
-	res = (int64)runtime_atomicload64((uint64*)&ticks);
-	if(res != 0)
-		return ticks;
-	runtime_lock(&ticksLock);
-	res = ticks;
-	if(res == 0) {
-		t0 = runtime_nanotime();
-		c0 = runtime_cputicks();
-		runtime_usleep(100*1000);
-		t1 = runtime_nanotime();
-		c1 = runtime_cputicks();
-		if(t1 == t0)
-			t1++;
-		res = (c1-c0)*1000*1000*1000/(t1-t0);
-		if(res == 0)
-			res++;
-		runtime_atomicstore64((uint64*)&ticks, res);
-	}
-	runtime_unlock(&ticksLock);
-	return res;
-}
-
-// Called to initialize a new m (including the bootstrap m).
-// Called on the parent thread (main thread in case of bootstrap), can allocate memory.
-void
-runtime_mpreinit(M *mp)
-{
-	mp->gsignal = runtime_malg(32*1024, &mp->gsignalstack, &mp->gsignalstacksize);	// OS X wants >=8K, Linux >=2K
-}
-
-// Called to initialize a new m (including the bootstrap m).
-// Called on the new thread, can not allocate memory.
-void
-runtime_minit(void)
-{
-	M* m;
-	sigset_t sigs;
-
-	// Initialize signal handling.
-	m = runtime_m();
-	runtime_signalstack(m->gsignalstack, m->gsignalstacksize);
-	if (sigemptyset(&sigs) != 0)
-		runtime_throw("sigemptyset");
-	pthread_sigmask(SIG_SETMASK, &sigs, nil);
-}
-
-// Called from dropm to undo the effect of an minit.
-void
-runtime_unminit(void)
-{
-	runtime_signalstack(nil, 0);
-}
-
-
-void
-runtime_signalstack(byte *p, int32 n)
-{
-	stack_t st;
-
-	st.ss_sp = p;
-	st.ss_size = n;
-	st.ss_flags = 0;
-	if(p == nil)
-		st.ss_flags = SS_DISABLE;
-	if(sigaltstack(&st, nil) < 0)
-		*(int *)0xf1 = 0xf1;
-}
-
-DebugVars	runtime_debug;
-
-// Holds variables parsed from GODEBUG env var,
-// except for "memprofilerate" since there is an
-// existing var for that value which is int
-// instead of in32 and might have an
-// initial value.
-static struct {
-	const char* name;
-	int32*	value;
-} dbgvar[] = {
-	{"allocfreetrace", &runtime_debug.allocfreetrace},
-	{"efence", &runtime_debug.efence},
-	{"gctrace", &runtime_debug.gctrace},
-	{"gcdead", &runtime_debug.gcdead},
-	{"scheddetail", &runtime_debug.scheddetail},
-	{"schedtrace", &runtime_debug.schedtrace},
-};
-
-void
-runtime_parsedebugvars(void)
-{
-	String s;
-	const byte *p, *pn;
-	intgo len;
-	intgo i, n;
-	bool tmp;
-	
-	// gotraceback caches the GOTRACEBACK setting in traceback_cache.
-	// gotraceback can be called before the environment is available.
-	// traceback_cache must be reset after the environment is made
-	// available, in order for the environment variable to take effect.
-	// The code is fixed differently in Go 1.4.
-	// This is a limited fix for Go 1.3.3.
-	traceback_cache = ~(uint32)0;
-	runtime_gotraceback(&tmp);
-
-	s = runtime_getenv("GODEBUG");
-	if(s.len == 0)
-		return;
-	p = s.str;
-	len = s.len;
-	for(;;) {
-		for(i=0; i<(intgo)nelem(dbgvar); i++) {
-			n = runtime_findnull((const byte*)dbgvar[i].name);
-			if(len > n && runtime_mcmp(p, "memprofilerate", n) == 0 && p[n] == '=')
-				// Set the MemProfileRate directly since it
-				// is an int, not int32, and should only lbe
-				// set here if specified by GODEBUG
-				runtime_MemProfileRate = runtime_atoi(p+n+1, len-(n+1));
-			else if(len > n && runtime_mcmp(p, dbgvar[i].name, n) == 0 && p[n] == '=')
-				*dbgvar[i].value = runtime_atoi(p+n+1, len-(n+1));
-		}
-		pn = (const byte *)runtime_strstr((const char *)p, ",");
-		if(pn == nil || pn - p >= len)
-			break;
-		len -= (pn - p) - 1;
-		p = pn + 1;
-	}
-}
-
-// Poor mans 64-bit division.
-// This is a very special function, do not use it if you are not sure what you are doing.
-// int64 division is lowered into _divv() call on 386, which does not fit into nosplit functions.
-// Handles overflow in a time-specific manner.
-int32
-runtime_timediv(int64 v, int32 div, int32 *rem)
-{
-	int32 res, bit;
-
-	if(v >= (int64)div*0x7fffffffLL) {
-		if(rem != nil)
-			*rem = 0;
-		return 0x7fffffff;
-	}
-	res = 0;
-	for(bit = 30; bit >= 0; bit--) {
-		if(v >= ((int64)div<<bit)) {
-			v = v - ((int64)div<<bit);
-			res += 1<<bit;
-		}
-	}
-	if(rem != nil)
-		*rem = v;
-	return res;
-}
-
-// Setting the max stack size doesn't really do anything for gccgo.
-
-uintptr runtime_maxstacksize = 1<<20; // enough until runtime.main sets it for real
-
-void memclrBytes(Slice)
-     __asm__ (GOSYM_PREFIX "runtime.memclrBytes");
-
-void
-memclrBytes(Slice s)
-{
-	runtime_memclr(s.__values, s.__count);
-}
diff --git a/third_party/gofrontend/libgo/runtime/runtime.h b/third_party/gofrontend/libgo/runtime/runtime.h
deleted file mode 100644
index d1bf5a9..0000000
--- a/third_party/gofrontend/libgo/runtime/runtime.h
+++ /dev/null
@@ -1,854 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "config.h"
-
-#include "go-assert.h"
-#include <complex.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <semaphore.h>
-#include <ucontext.h>
-
-#ifdef HAVE_SYS_MMAN_H
-#include <sys/mman.h>
-#endif
-
-#include "interface.h"
-#include "go-alloc.h"
-
-#define _STRINGIFY2_(x) #x
-#define _STRINGIFY_(x) _STRINGIFY2_(x)
-#define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__)
-
-/* This file supports C files copied from the 6g runtime library.
-   This is a version of the 6g runtime.h rewritten for gccgo's version
-   of the code.  */
-
-typedef signed int   int8    __attribute__ ((mode (QI)));
-typedef unsigned int uint8   __attribute__ ((mode (QI)));
-typedef signed int   int16   __attribute__ ((mode (HI)));
-typedef unsigned int uint16  __attribute__ ((mode (HI)));
-typedef signed int   int32   __attribute__ ((mode (SI)));
-typedef unsigned int uint32  __attribute__ ((mode (SI)));
-typedef signed int   int64   __attribute__ ((mode (DI)));
-typedef unsigned int uint64  __attribute__ ((mode (DI)));
-typedef float        float32 __attribute__ ((mode (SF)));
-typedef double       float64 __attribute__ ((mode (DF)));
-typedef signed int   intptr __attribute__ ((mode (pointer)));
-typedef unsigned int uintptr __attribute__ ((mode (pointer)));
-
-typedef intptr		intgo; // Go's int
-typedef uintptr		uintgo; // Go's uint
-
-typedef uintptr		uintreg;
-
-/* Defined types.  */
-
-typedef	uint8			bool;
-typedef	uint8			byte;
-typedef	struct	Func		Func;
-typedef	struct	G		G;
-typedef	struct	Lock		Lock;
-typedef	struct	M		M;
-typedef	struct	P		P;
-typedef	struct	Note		Note;
-typedef	struct	String		String;
-typedef	struct	FuncVal		FuncVal;
-typedef	struct	SigTab		SigTab;
-typedef	struct	MCache		MCache;
-typedef struct	FixAlloc	FixAlloc;
-typedef	struct	Hchan		Hchan;
-typedef	struct	Timers		Timers;
-typedef	struct	Timer		Timer;
-typedef	struct	GCStats		GCStats;
-typedef	struct	LFNode		LFNode;
-typedef	struct	ParFor		ParFor;
-typedef	struct	ParForThread	ParForThread;
-typedef	struct	CgoMal		CgoMal;
-typedef	struct	PollDesc	PollDesc;
-typedef	struct	DebugVars	DebugVars;
-
-typedef	struct	__go_open_array		Slice;
-typedef struct	__go_interface		Iface;
-typedef	struct	__go_empty_interface	Eface;
-typedef	struct	__go_type_descriptor	Type;
-typedef	struct	__go_defer_stack	Defer;
-typedef	struct	__go_panic_stack	Panic;
-
-typedef struct	__go_ptr_type		PtrType;
-typedef struct	__go_func_type		FuncType;
-typedef struct	__go_interface_type	InterfaceType;
-typedef struct	__go_map_type		MapType;
-typedef struct	__go_channel_type	ChanType;
-
-typedef struct  Traceback	Traceback;
-
-typedef struct	Location	Location;
-
-/*
- * Per-CPU declaration.
- */
-extern M*	runtime_m(void);
-extern G*	runtime_g(void);
-
-extern M	runtime_m0;
-extern G	runtime_g0;
-
-/*
- * defined constants
- */
-enum
-{
-	// G status
-	//
-	// If you add to this list, add to the list
-	// of "okay during garbage collection" status
-	// in mgc0.c too.
-	Gidle,
-	Grunnable,
-	Grunning,
-	Gsyscall,
-	Gwaiting,
-	Gmoribund_unused,  // currently unused, but hardcoded in gdb scripts
-	Gdead,
-};
-enum
-{
-	// P status
-	Pidle,
-	Prunning,
-	Psyscall,
-	Pgcstop,
-	Pdead,
-};
-enum
-{
-	true	= 1,
-	false	= 0,
-};
-enum
-{
-	PtrSize = sizeof(void*),
-};
-enum
-{
-	// Per-M stack segment cache size.
-	StackCacheSize = 32,
-	// Global <-> per-M stack segment cache transfer batch size.
-	StackCacheBatch = 16,
-};
-/*
- * structures
- */
-struct	Lock
-{
-	// Futex-based impl treats it as uint32 key,
-	// while sema-based impl as M* waitm.
-	// Used to be a union, but unions break precise GC.
-	uintptr	key;
-};
-struct	Note
-{
-	// Futex-based impl treats it as uint32 key,
-	// while sema-based impl as M* waitm.
-	// Used to be a union, but unions break precise GC.
-	uintptr	key;
-};
-struct String
-{
-	const byte*	str;
-	intgo		len;
-};
-struct FuncVal
-{
-	void	(*fn)(void);
-	// variable-size, fn-specific data here
-};
-struct	GCStats
-{
-	// the struct must consist of only uint64's,
-	// because it is casted to uint64[].
-	uint64	nhandoff;
-	uint64	nhandoffcnt;
-	uint64	nprocyield;
-	uint64	nosyield;
-	uint64	nsleep;
-};
-
-// A location in the program, used for backtraces.
-struct	Location
-{
-	uintptr	pc;
-	String	filename;
-	String	function;
-	intgo	lineno;
-};
-
-struct	G
-{
-	Defer*	defer;
-	Panic*	panic;
-	void*	exception;	// current exception being thrown
-	bool	is_foreign;	// whether current exception from other language
-	void	*gcstack;	// if status==Gsyscall, gcstack = stackbase to use during gc
-	uintptr	gcstack_size;
-	void*	gcnext_segment;
-	void*	gcnext_sp;
-	void*	gcinitial_sp;
-	ucontext_t gcregs;
-	byte*	entry;		// initial function
-	void*	param;		// passed parameter on wakeup
-	bool	fromgogo;	// reached from gogo
-	int16	status;
-	uint32	selgen;		// valid sudog pointer
-	int64	goid;
-	int64	waitsince;	// approx time when the G become blocked
-	const char*	waitreason;	// if status==Gwaiting
-	G*	schedlink;
-	bool	ispanic;
-	bool	issystem;	// do not output in stack dump
-	bool	isbackground;	// ignore in deadlock detector
-	bool	paniconfault;	// panic (instead of crash) on unexpected fault address
-	M*	m;		// for debuggers, but offset not hard-coded
-	M*	lockedm;
-	int32	sig;
-	int32	writenbuf;
-	byte*	writebuf;
-	uintptr	sigcode0;
-	uintptr	sigcode1;
-	// uintptr	sigpc;
-	uintptr	gopc;	// pc of go statement that created this goroutine
-
-	int32	ncgo;
-	CgoMal*	cgomal;
-
-	Traceback* traceback;
-
-	ucontext_t	context;
-	void*		stack_context[10];
-};
-
-struct	M
-{
-	G*	g0;		// goroutine with scheduling stack
-	G*	gsignal;	// signal-handling G
-	byte*	gsignalstack;
-	size_t	gsignalstacksize;
-	void	(*mstartfn)(void);
-	G*	curg;		// current running goroutine
-	G*	caughtsig;	// goroutine running during fatal signal
-	P*	p;		// attached P for executing Go code (nil if not executing Go code)
-	P*	nextp;
-	int32	id;
-	int32	mallocing;
-	int32	throwing;
-	int32	gcing;
-	int32	locks;
-	int32	softfloat;
-	int32	dying;
-	int32	profilehz;
-	int32	helpgc;
-	bool	spinning;	// M is out of work and is actively looking for work
-	bool	blocked;	// M is blocked on a Note
-	uint32	fastrand;
-	uint64	ncgocall;	// number of cgo calls in total
-	int32	ncgo;		// number of cgo calls currently in progress
-	CgoMal*	cgomal;
-	Note	park;
-	M*	alllink;	// on allm
-	M*	schedlink;
-	MCache	*mcache;
-	G*	lockedg;
-	Location createstack[32];	// Stack that created this thread.
-	uint32	locked;	// tracking for LockOSThread
-	M*	nextwaitm;	// next M waiting for lock
-	uintptr	waitsema;	// semaphore for parking on locks
-	uint32	waitsemacount;
-	uint32	waitsemalock;
-	GCStats	gcstats;
-	bool	needextram;
-	bool	dropextram;	// for gccgo: drop after call is done.
-	uint8	traceback;
-	bool	(*waitunlockf)(G*, void*);
-	void*	waitlock;
-	uintptr	end[];
-};
-
-struct P
-{
-	Lock	lock;
-
-	int32	id;
-	uint32	status;		// one of Pidle/Prunning/...
-	P*	link;
-	uint32	schedtick;	// incremented on every scheduler call
-	uint32	syscalltick;	// incremented on every system call
-	M*	m;		// back-link to associated M (nil if idle)
-	MCache*	mcache;
-	Defer*	deferpool;	// pool of available Defer structs (see panic.c)
-
-	// Cache of goroutine ids, amortizes accesses to runtime_sched.goidgen.
-	uint64	goidcache;
-	uint64	goidcacheend;
-
-	// Queue of runnable goroutines.
-	uint32	runqhead;
-	uint32	runqtail;
-	G*	runq[256];
-
-	// Available G's (status == Gdead)
-	G*	gfree;
-	int32	gfreecnt;
-
-	byte	pad[64];
-};
-
-// The m->locked word holds two pieces of state counting active calls to LockOSThread/lockOSThread.
-// The low bit (LockExternal) is a boolean reporting whether any LockOSThread call is active.
-// External locks are not recursive; a second lock is silently ignored.
-// The upper bits of m->lockedcount record the nesting depth of calls to lockOSThread
-// (counting up by LockInternal), popped by unlockOSThread (counting down by LockInternal).
-// Internal locks can be recursive. For instance, a lock for cgo can occur while the main
-// goroutine is holding the lock during the initialization phase.
-enum
-{
-	LockExternal = 1,
-	LockInternal = 2,
-};
-
-struct	SigTab
-{
-	int32	sig;
-	int32	flags;
-};
-enum
-{
-	SigNotify = 1<<0,	// let signal.Notify have signal, even if from kernel
-	SigKill = 1<<1,		// if signal.Notify doesn't take it, exit quietly
-	SigThrow = 1<<2,	// if signal.Notify doesn't take it, exit loudly
-	SigPanic = 1<<3,	// if the signal is from the kernel, panic
-	SigDefault = 1<<4,	// if the signal isn't explicitly requested, don't monitor it
-	SigHandling = 1<<5,	// our signal handler is registered
-	SigIgnored = 1<<6,	// the signal was ignored before we registered for it
-	SigGoExit = 1<<7,	// cause all runtime procs to exit (only used on Plan 9).
-};
-
-// Layout of in-memory per-function information prepared by linker
-// See http://golang.org/s/go12symtab.
-// Keep in sync with linker and with ../../libmach/sym.c
-// and with package debug/gosym.
-struct	Func
-{
-	String	name;
-	uintptr	entry;	// entry pc
-};
-
-#ifdef GOOS_nacl
-enum {
-   NaCl = 1,
-};
-#else
-enum {
-   NaCl = 0,
-};
-#endif
-
-#ifdef GOOS_windows
-enum {
-   Windows = 1
-};
-#else
-enum {
-   Windows = 0
-};
-#endif
-#ifdef GOOS_solaris
-enum {
-   Solaris = 1
-};
-#else
-enum {
-   Solaris = 0
-};
-#endif
-
-struct	Timers
-{
-	Lock	lock;
-	G	*timerproc;
-	bool		sleeping;
-	bool		rescheduling;
-	Note	waitnote;
-	Timer	**t;
-	int32	len;
-	int32	cap;
-};
-
-// Package time knows the layout of this structure.
-// If this struct changes, adjust ../time/sleep.go:/runtimeTimer.
-// For GOOS=nacl, package syscall knows the layout of this structure.
-// If this struct changes, adjust ../syscall/net_nacl.go:/runtimeTimer.
-struct	Timer
-{
-	intgo	i;	// heap index
-
-	// Timer wakes up at when, and then at when+period, ... (period > 0 only)
-	// each time calling f(now, arg) in the timer goroutine, so f must be
-	// a well-behaved function and not block.
-	int64	when;
-	int64	period;
-	FuncVal	*fv;
-	Eface	arg;
-	uintptr	seq;
-};
-
-// Lock-free stack node.
-struct LFNode
-{
-	LFNode	*next;
-	uintptr	pushcnt;
-};
-
-// Parallel for descriptor.
-struct ParFor
-{
-	const FuncVal *body;		// executed for each element
-	uint32 done;			// number of idle threads
-	uint32 nthr;			// total number of threads
-	uint32 nthrmax;			// maximum number of threads
-	uint32 thrseq;			// thread id sequencer
-	uint32 cnt;			// iteration space [0, cnt)
-	bool wait;			// if true, wait while all threads finish processing,
-					// otherwise parfor may return while other threads are still working
-	ParForThread *thr;		// array of thread descriptors
-	// stats
-	uint64 nsteal;
-	uint64 nstealcnt;
-	uint64 nprocyield;
-	uint64 nosyield;
-	uint64 nsleep;
-};
-
-// Track memory allocated by code not written in Go during a cgo call,
-// so that the garbage collector can see them.
-struct CgoMal
-{
-	CgoMal	*next;
-	void	*alloc;
-};
-
-// Holds variables parsed from GODEBUG env var.
-struct DebugVars
-{
-	int32	allocfreetrace;
-	int32	efence;
-	int32	gctrace;
-	int32	gcdead;
-	int32	scheddetail;
-	int32	schedtrace;
-};
-
-extern bool runtime_precisestack;
-extern bool runtime_copystack;
-
-/*
- * defined macros
- *    you need super-gopher-guru privilege
- *    to add this list.
- */
-#define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
-#define	nil		((void*)0)
-#define USED(v)		((void) v)
-#define	ROUND(x, n)	(((x)+(n)-1)&~(uintptr)((n)-1)) /* all-caps to mark as macro: it evaluates n twice */
-
-byte*	runtime_startup_random_data;
-uint32	runtime_startup_random_data_len;
-void	runtime_get_random_data(byte**, int32*);
-
-enum {
-	// hashinit wants this many random bytes
-	HashRandomBytes = 32
-};
-void	runtime_hashinit(void);
-
-void	runtime_traceback(void);
-void	runtime_tracebackothers(G*);
-enum
-{
-	// The maximum number of frames we print for a traceback
-	TracebackMaxFrames = 100,
-};
-
-/*
- * external data
- */
-extern	uintptr runtime_zerobase;
-extern	G**	runtime_allg;
-extern	uintptr runtime_allglen;
-extern	G*	runtime_lastg;
-extern	M*	runtime_allm;
-extern	P**	runtime_allp;
-extern	int32	runtime_gomaxprocs;
-extern	uint32	runtime_needextram;
-extern	uint32	runtime_panicking;
-extern	int8*	runtime_goos;
-extern	int32	runtime_ncpu;
-extern 	void	(*runtime_sysargs)(int32, uint8**);
-extern	uint32	runtime_Hchansize;
-extern	DebugVars	runtime_debug;
-extern	uintptr	runtime_maxstacksize;
-
-extern	bool	runtime_isstarted;
-extern	bool	runtime_isarchive;
-
-/*
- * common functions and data
- */
-#define runtime_strcmp(s1, s2) __builtin_strcmp((s1), (s2))
-#define runtime_strncmp(s1, s2, n) __builtin_strncmp((s1), (s2), (n))
-#define runtime_strstr(s1, s2) __builtin_strstr((s1), (s2))
-intgo	runtime_findnull(const byte*);
-intgo	runtime_findnullw(const uint16*);
-void	runtime_dump(byte*, int32);
-
-void	runtime_gogo(G*);
-struct __go_func_type;
-void	runtime_args(int32, byte**);
-void	runtime_osinit();
-void	runtime_goargs(void);
-void	runtime_goenvs(void);
-void	runtime_goenvs_unix(void);
-void	runtime_throw(const char*) __attribute__ ((noreturn));
-void	runtime_panicstring(const char*) __attribute__ ((noreturn));
-bool	runtime_canpanic(G*);
-void	runtime_prints(const char*);
-void	runtime_printf(const char*, ...);
-int32	runtime_snprintf(byte*, int32, const char*, ...);
-#define runtime_mcmp(a, b, s) __builtin_memcmp((a), (b), (s))
-#define runtime_memmove(a, b, s) __builtin_memmove((a), (b), (s))
-void*	runtime_mal(uintptr);
-String	runtime_gostring(const byte*);
-String	runtime_gostringnocopy(const byte*);
-void	runtime_schedinit(void);
-void	runtime_initsig(void);
-void	runtime_sigenable(uint32 sig);
-void	runtime_sigdisable(uint32 sig);
-void	runtime_sigignore(uint32 sig);
-int32	runtime_gotraceback(bool *crash);
-void	runtime_goroutineheader(G*);
-void	runtime_printtrace(Location*, int32, bool);
-#define runtime_open(p, f, m) open((p), (f), (m))
-#define runtime_read(d, v, n) read((d), (v), (n))
-#define runtime_write(d, v, n) write((d), (v), (n))
-#define runtime_close(d) close(d)
-void	runtime_ready(G*);
-String	runtime_getenv(const char*);
-int32	runtime_atoi(const byte*, intgo);
-void*	runtime_mstart(void*);
-G*	runtime_malg(int32, byte**, size_t*);
-void	runtime_mpreinit(M*);
-void	runtime_minit(void);
-void	runtime_unminit(void);
-void	runtime_needm(void);
-void	runtime_dropm(void);
-void	runtime_signalstack(byte*, int32);
-MCache*	runtime_allocmcache(void);
-void	runtime_freemcache(MCache*);
-void	runtime_mallocinit(void);
-void	runtime_mprofinit(void);
-#define runtime_malloc(s) __go_alloc(s)
-#define runtime_free(p) __go_free(p)
-#define runtime_getcallersp(p) __builtin_frame_address(1)
-int32	runtime_mcount(void);
-int32	runtime_gcount(void);
-void	runtime_mcall(void(*)(G*));
-uint32	runtime_fastrand1(void);
-int32	runtime_timediv(int64, int32, int32*);
-int32	runtime_round2(int32 x); // round x up to a power of 2.
-
-// atomic operations
-#define runtime_cas(pval, old, new) __sync_bool_compare_and_swap (pval, old, new)
-#define runtime_cas64(pval, old, new) __sync_bool_compare_and_swap (pval, old, new)
-#define runtime_casp(pval, old, new) __sync_bool_compare_and_swap (pval, old, new)
-// Don't confuse with XADD x86 instruction,
-// this one is actually 'addx', that is, add-and-fetch.
-#define runtime_xadd(p, v) __sync_add_and_fetch (p, v)
-#define runtime_xadd64(p, v) __sync_add_and_fetch (p, v)
-#define runtime_xchg(p, v) __atomic_exchange_n (p, v, __ATOMIC_SEQ_CST)
-#define runtime_xchg64(p, v) __atomic_exchange_n (p, v, __ATOMIC_SEQ_CST)
-#define runtime_xchgp(p, v) __atomic_exchange_n (p, v, __ATOMIC_SEQ_CST)
-#define runtime_atomicload(p) __atomic_load_n (p, __ATOMIC_SEQ_CST)
-#define runtime_atomicstore(p, v) __atomic_store_n (p, v, __ATOMIC_SEQ_CST)
-#define runtime_atomicstore64(p, v) __atomic_store_n (p, v, __ATOMIC_SEQ_CST)
-#define runtime_atomicload64(p) __atomic_load_n (p, __ATOMIC_SEQ_CST)
-#define runtime_atomicloadp(p) __atomic_load_n (p, __ATOMIC_SEQ_CST)
-#define runtime_atomicstorep(p, v) __atomic_store_n (p, v, __ATOMIC_SEQ_CST)
-
-void runtime_setmg(M*, G*);
-void runtime_newextram(void);
-#define runtime_exit(s) exit(s)
-#define runtime_breakpoint() __builtin_trap()
-void	runtime_gosched(void);
-void	runtime_gosched0(G*);
-void	runtime_schedtrace(bool);
-void	runtime_park(bool(*)(G*, void*), void*, const char*);
-void	runtime_parkunlock(Lock*, const char*);
-void	runtime_tsleep(int64, const char*);
-M*	runtime_newm(void);
-void	runtime_goexit(void);
-void	runtime_entersyscall(void) __asm__ (GOSYM_PREFIX "syscall.Entersyscall");
-void	runtime_entersyscallblock(void);
-void	runtime_exitsyscall(void) __asm__ (GOSYM_PREFIX "syscall.Exitsyscall");
-G*	__go_go(void (*pfn)(void*), void*);
-void	siginit(void);
-bool	__go_sigsend(int32 sig);
-int32	runtime_callers(int32, Location*, int32, bool keep_callers);
-int64	runtime_nanotime(void);	// monotonic time
-int64	runtime_unixnanotime(void); // real time, can skip
-void	runtime_dopanic(int32) __attribute__ ((noreturn));
-void	runtime_startpanic(void);
-void	runtime_freezetheworld(void);
-void	runtime_unwindstack(G*, byte*);
-void	runtime_sigprof();
-void	runtime_resetcpuprofiler(int32);
-void	runtime_setcpuprofilerate(void(*)(uintptr*, int32), int32);
-void	runtime_usleep(uint32);
-int64	runtime_cputicks(void);
-int64	runtime_tickspersecond(void);
-void	runtime_blockevent(int64, int32);
-extern int64 runtime_blockprofilerate;
-void	runtime_addtimer(Timer*);
-bool	runtime_deltimer(Timer*);
-G*	runtime_netpoll(bool);
-void	runtime_netpollinit(void);
-int32	runtime_netpollopen(uintptr, PollDesc*);
-int32   runtime_netpollclose(uintptr);
-void	runtime_netpollready(G**, PollDesc*, int32);
-uintptr	runtime_netpollfd(PollDesc*);
-void	runtime_netpollarm(PollDesc*, int32);
-void**	runtime_netpolluser(PollDesc*);
-bool	runtime_netpollclosing(PollDesc*);
-void	runtime_netpolllock(PollDesc*);
-void	runtime_netpollunlock(PollDesc*);
-void	runtime_crash(void);
-void	runtime_parsedebugvars(void);
-void	_rt0_go(void);
-void*	runtime_funcdata(Func*, int32);
-int32	runtime_setmaxthreads(int32);
-G*	runtime_timejump(void);
-void	runtime_iterate_finq(void (*callback)(FuncVal*, void*, const FuncType*, const PtrType*));
-
-void	runtime_stoptheworld(void);
-void	runtime_starttheworld(void);
-extern uint32 runtime_worldsema;
-
-/*
- * mutual exclusion locks.  in the uncontended case,
- * as fast as spin locks (just a few user-level instructions),
- * but on the contention path they sleep in the kernel.
- * a zeroed Lock is unlocked (no need to initialize each lock).
- */
-void	runtime_lock(Lock*);
-void	runtime_unlock(Lock*);
-
-/*
- * sleep and wakeup on one-time events.
- * before any calls to notesleep or notewakeup,
- * must call noteclear to initialize the Note.
- * then, exactly one thread can call notesleep
- * and exactly one thread can call notewakeup (once).
- * once notewakeup has been called, the notesleep
- * will return.  future notesleep will return immediately.
- * subsequent noteclear must be called only after
- * previous notesleep has returned, e.g. it's disallowed
- * to call noteclear straight after notewakeup.
- *
- * notetsleep is like notesleep but wakes up after
- * a given number of nanoseconds even if the event
- * has not yet happened.  if a goroutine uses notetsleep to
- * wake up early, it must wait to call noteclear until it
- * can be sure that no other goroutine is calling
- * notewakeup.
- *
- * notesleep/notetsleep are generally called on g0,
- * notetsleepg is similar to notetsleep but is called on user g.
- */
-void	runtime_noteclear(Note*);
-void	runtime_notesleep(Note*);
-void	runtime_notewakeup(Note*);
-bool	runtime_notetsleep(Note*, int64);  // false - timeout
-bool	runtime_notetsleepg(Note*, int64);  // false - timeout
-
-/*
- * low-level synchronization for implementing the above
- */
-uintptr	runtime_semacreate(void);
-int32	runtime_semasleep(int64);
-void	runtime_semawakeup(M*);
-// or
-void	runtime_futexsleep(uint32*, uint32, int64);
-void	runtime_futexwakeup(uint32*, uint32);
-
-/*
- * Lock-free stack.
- * Initialize uint64 head to 0, compare with 0 to test for emptiness.
- * The stack does not keep pointers to nodes,
- * so they can be garbage collected if there are no other pointers to nodes.
- */
-void	runtime_lfstackpush(uint64 *head, LFNode *node)
-  __asm__ (GOSYM_PREFIX "runtime.lfstackpush");
-LFNode*	runtime_lfstackpop(uint64 *head);
-
-/*
- * Parallel for over [0, n).
- * body() is executed for each iteration.
- * nthr - total number of worker threads.
- * if wait=true, threads return from parfor() when all work is done;
- * otherwise, threads can return while other threads are still finishing processing.
- */
-ParFor*	runtime_parforalloc(uint32 nthrmax);
-void	runtime_parforsetup(ParFor *desc, uint32 nthr, uint32 n, bool wait, const FuncVal *body);
-void	runtime_parfordo(ParFor *desc);
-void	runtime_parforiters(ParFor*, uintptr, uintptr*, uintptr*);
-
-/*
- * low level C-called
- */
-#define runtime_mmap mmap
-#define runtime_munmap munmap
-#define runtime_madvise madvise
-#define runtime_memclr(buf, size) __builtin_memset((buf), 0, (size))
-#define runtime_getcallerpc(p) __builtin_return_address(0)
-
-#ifdef __rtems__
-void __wrap_rtems_task_variable_add(void **);
-#endif
-
-/*
- * Names generated by gccgo.
- */
-#define runtime_printbool	__go_print_bool
-#define runtime_printfloat	__go_print_double
-#define runtime_printint	__go_print_int64
-#define runtime_printiface	__go_print_interface
-#define runtime_printeface	__go_print_empty_interface
-#define runtime_printstring	__go_print_string
-#define runtime_printpointer	__go_print_pointer
-#define runtime_printuint	__go_print_uint64
-#define runtime_printslice	__go_print_slice
-#define runtime_printcomplex	__go_print_complex
-
-/*
- * runtime go-called
- */
-void	runtime_printbool(_Bool);
-void	runtime_printbyte(int8);
-void	runtime_printfloat(double);
-void	runtime_printint(int64);
-void	runtime_printiface(Iface);
-void	runtime_printeface(Eface);
-void	runtime_printstring(String);
-void	runtime_printpc(void*);
-void	runtime_printpointer(void*);
-void	runtime_printuint(uint64);
-void	runtime_printhex(uint64);
-void	runtime_printslice(Slice);
-void	runtime_printcomplex(complex double);
-void reflect_call(const struct __go_func_type *, FuncVal *, _Bool, _Bool,
-		  void **, void **)
-  __asm__ (GOSYM_PREFIX "reflect.call");
-#define runtime_panic __go_panic
-
-/*
- * runtime c-called (but written in Go)
- */
-void	runtime_printany(Eface)
-     __asm__ (GOSYM_PREFIX "runtime.Printany");
-void	runtime_newTypeAssertionError(const String*, const String*, const String*, const String*, Eface*)
-     __asm__ (GOSYM_PREFIX "runtime.NewTypeAssertionError");
-void	runtime_newErrorCString(const char*, Eface*)
-     __asm__ (GOSYM_PREFIX "runtime.NewErrorCString");
-
-/*
- * wrapped for go users
- */
-void	runtime_semacquire(uint32 volatile *, bool);
-void	runtime_semrelease(uint32 volatile *);
-int32	runtime_gomaxprocsfunc(int32 n);
-void	runtime_procyield(uint32);
-void	runtime_osyield(void);
-void	runtime_lockOSThread(void);
-void	runtime_unlockOSThread(void);
-bool	runtime_lockedOSThread(void);
-
-bool	runtime_showframe(String, bool);
-void	runtime_printcreatedby(G*);
-
-uintptr	runtime_memlimit(void);
-
-#define ISNAN(f) __builtin_isnan(f)
-
-enum
-{
-	UseSpanType = 1,
-};
-
-#define runtime_setitimer setitimer
-
-void	runtime_check(void);
-
-// A list of global variables that the garbage collector must scan.
-struct root_list {
-	struct root_list *next;
-	struct root {
-		void *decl;
-		size_t size;
-	} roots[];
-};
-
-void	__go_register_gc_roots(struct root_list*);
-
-// Size of stack space allocated using Go's allocator.
-// This will be 0 when using split stacks, as in that case
-// the stacks are allocated by the splitstack library.
-extern uintptr runtime_stacks_sys;
-
-struct backtrace_state;
-extern struct backtrace_state *__go_get_backtrace_state(void);
-extern _Bool __go_file_line(uintptr, String*, String*, intgo *);
-extern byte* runtime_progname();
-extern void runtime_main(void*);
-extern uint32 runtime_in_callers;
-
-int32 getproccount(void);
-
-#define PREFETCH(p) __builtin_prefetch(p)
-
-bool	runtime_gcwaiting(void);
-void	runtime_badsignal(int);
-Defer*	runtime_newdefer(void);
-void	runtime_freedefer(Defer*);
-
-struct time_now_ret
-{
-  int64_t sec;
-  int32_t nsec;
-};
-
-struct time_now_ret now() __asm__ (GOSYM_PREFIX "time.now")
-  __attribute__ ((no_split_stack));
-
-extern void _cgo_wait_runtime_init_done (void);
-extern void _cgo_notify_runtime_init_done (void);
-extern _Bool runtime_iscgo;
-extern _Bool runtime_cgoHasExtraM;
-extern Hchan *runtime_main_init_done;
diff --git a/third_party/gofrontend/libgo/runtime/runtime1.goc b/third_party/gofrontend/libgo/runtime/runtime1.goc
deleted file mode 100644
index cd9d301..0000000
--- a/third_party/gofrontend/libgo/runtime/runtime1.goc
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2010 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime
-#include "runtime.h"
-#include "arch.h"
-#include "go-type.h"
-
-func GOMAXPROCS(n int) (ret int) {
-	ret = runtime_gomaxprocsfunc(n);
-}
-
-func NumCPU() (ret int) {
-	ret = runtime_ncpu;
-}
-
-func NumCgoCall() (ret int64) {
-	M *mp;
-
-	ret = 0;
-	for(mp=runtime_atomicloadp(&runtime_allm); mp; mp=mp->alllink)
-		ret += mp->ncgocall;
-}
-
-func newParFor(nthrmax uint32) (desc *ParFor) {
-	desc = runtime_parforalloc(nthrmax);
-}
-
-func parForSetup(desc *ParFor, nthr uint32, n uint32, wait bool, body *byte) {
-	runtime_parforsetup(desc, nthr, n, wait, (const FuncVal*) body);
-}
-
-func parForDo(desc *ParFor) {
-	runtime_parfordo(desc);
-}
-
-func parForIters(desc *ParFor, tid uintptr) (start uintptr, end uintptr) {
-	runtime_parforiters(desc, tid, &start, &end);
-}
-
-func typestring(e Eface) (s String) {
-	s = *e.__type_descriptor->__reflection;
-}
-
-func golockedOSThread() (ret bool) {
-	ret = runtime_lockedOSThread();
-}
-
-func NumGoroutine() (ret int) {
-	ret = runtime_gcount();
-}
-
-func getgoroot() (out String) {
-	out = runtime_getenv("GOROOT");
-}
-
-func runtime_pprof.runtime_cyclesPerSecond() (res int64) {
-	res = runtime_tickspersecond();
-}
-
-func sync.runtime_procPin() (p int) {
-	M *mp;
-
-	mp = runtime_m();
-	// Disable preemption.
-	mp->locks++;
-	p = mp->p->id;
-}
-
-func sync.runtime_procUnpin() {
-	runtime_m()->locks--;
-}
-
-func sync_atomic.runtime_procPin() (p int) {
-	M *mp;
-
-	mp = runtime_m();
-	// Disable preemption.
-	mp->locks++;
-	p = mp->p->id;
-}
-
-func sync_atomic.runtime_procUnpin() {
-	runtime_m()->locks--;
-}
-
-extern Slice envs;
-
-func envs() (s Slice) {
-	s = envs;
-}
-
-func setenvs(e Slice) {
-	envs = e;
-}
diff --git a/third_party/gofrontend/libgo/runtime/sema.goc b/third_party/gofrontend/libgo/runtime/sema.goc
deleted file mode 100644
index 877ee07..0000000
--- a/third_party/gofrontend/libgo/runtime/sema.goc
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Semaphore implementation exposed to Go.
-// Intended use is provide a sleep and wakeup
-// primitive that can be used in the contended case
-// of other synchronization primitives.
-// Thus it targets the same goal as Linux's futex,
-// but it has much simpler semantics.
-//
-// That is, don't think of these as semaphores.
-// Think of them as a way to implement sleep and wakeup
-// such that every sleep is paired with a single wakeup,
-// even if, due to races, the wakeup happens before the sleep.
-//
-// See Mullender and Cox, ``Semaphores in Plan 9,''
-// http://swtch.com/semaphore.pdf
-
-package sync
-#include "runtime.h"
-#include "arch.h"
-
-typedef struct SemaWaiter SemaWaiter;
-struct SemaWaiter
-{
-	uint32 volatile*	addr;
-	G*	g;
-	int64	releasetime;
-	int32	nrelease;	// -1 for acquire
-	SemaWaiter*	prev;
-	SemaWaiter*	next;
-};
-
-typedef struct SemaRoot SemaRoot;
-struct SemaRoot
-{
-	Lock		lock;
-	SemaWaiter*	head;
-	SemaWaiter*	tail;
-	// Number of waiters. Read w/o the lock.
-	uint32 volatile	nwait;
-};
-
-// Prime to not correlate with any user patterns.
-#define SEMTABLESZ 251
-
-struct semtable
-{
-	SemaRoot root;
-	uint8 pad[CacheLineSize-sizeof(SemaRoot)];
-};
-static struct semtable semtable[SEMTABLESZ];
-
-static SemaRoot*
-semroot(uint32 volatile *addr)
-{
-	return &semtable[((uintptr)addr >> 3) % SEMTABLESZ].root;
-}
-
-static void
-semqueue(SemaRoot *root, uint32 volatile *addr, SemaWaiter *s)
-{
-	s->g = runtime_g();
-	s->addr = addr;
-	s->next = nil;
-	s->prev = root->tail;
-	if(root->tail)
-		root->tail->next = s;
-	else
-		root->head = s;
-	root->tail = s;
-}
-
-static void
-semdequeue(SemaRoot *root, SemaWaiter *s)
-{
-	if(s->next)
-		s->next->prev = s->prev;
-	else
-		root->tail = s->prev;
-	if(s->prev)
-		s->prev->next = s->next;
-	else
-		root->head = s->next;
-	s->prev = nil;
-	s->next = nil;
-}
-
-static int32
-cansemacquire(uint32 volatile *addr)
-{
-	uint32 v;
-
-	while((v = runtime_atomicload(addr)) > 0)
-		if(runtime_cas(addr, v, v-1))
-			return 1;
-	return 0;
-}
-
-void
-runtime_semacquire(uint32 volatile *addr, bool profile)
-{
-	SemaWaiter s;	// Needs to be allocated on stack, otherwise garbage collector could deallocate it
-	SemaRoot *root;
-	int64 t0;
-	
-	// Easy case.
-	if(cansemacquire(addr))
-		return;
-
-	// Harder case:
-	//	increment waiter count
-	//	try cansemacquire one more time, return if succeeded
-	//	enqueue itself as a waiter
-	//	sleep
-	//	(waiter descriptor is dequeued by signaler)
-	root = semroot(addr);
-	t0 = 0;
-	s.releasetime = 0;
-	if(profile && runtime_blockprofilerate > 0) {
-		t0 = runtime_cputicks();
-		s.releasetime = -1;
-	}
-	for(;;) {
-
-		runtime_lock(&root->lock);
-		// Add ourselves to nwait to disable "easy case" in semrelease.
-		runtime_xadd(&root->nwait, 1);
-		// Check cansemacquire to avoid missed wakeup.
-		if(cansemacquire(addr)) {
-			runtime_xadd(&root->nwait, -1);
-			runtime_unlock(&root->lock);
-			return;
-		}
-		// Any semrelease after the cansemacquire knows we're waiting
-		// (we set nwait above), so go to sleep.
-		semqueue(root, addr, &s);
-		runtime_parkunlock(&root->lock, "semacquire");
-		if(cansemacquire(addr)) {
-			if(t0)
-				runtime_blockevent(s.releasetime - t0, 3);
-			return;
-		}
-	}
-}
-
-void
-runtime_semrelease(uint32 volatile *addr)
-{
-	SemaWaiter *s;
-	SemaRoot *root;
-
-	root = semroot(addr);
-	runtime_xadd(addr, 1);
-
-	// Easy case: no waiters?
-	// This check must happen after the xadd, to avoid a missed wakeup
-	// (see loop in semacquire).
-	if(runtime_atomicload(&root->nwait) == 0)
-		return;
-
-	// Harder case: search for a waiter and wake it.
-	runtime_lock(&root->lock);
-	if(runtime_atomicload(&root->nwait) == 0) {
-		// The count is already consumed by another goroutine,
-		// so no need to wake up another goroutine.
-		runtime_unlock(&root->lock);
-		return;
-	}
-	for(s = root->head; s; s = s->next) {
-		if(s->addr == addr) {
-			runtime_xadd(&root->nwait, -1);
-			semdequeue(root, s);
-			break;
-		}
-	}
-	runtime_unlock(&root->lock);
-	if(s) {
-		if(s->releasetime)
-			s->releasetime = runtime_cputicks();
-		runtime_ready(s->g);
-	}
-}
-
-// TODO(dvyukov): move to netpoll.goc once it's used by all OSes.
-void net_runtime_Semacquire(uint32 *addr)
-  __asm__ (GOSYM_PREFIX "net.runtime_Semacquire");
-
-void net_runtime_Semacquire(uint32 *addr)
-{
-	runtime_semacquire(addr, true);
-}
-
-void net_runtime_Semrelease(uint32 *addr)
-  __asm__ (GOSYM_PREFIX "net.runtime_Semrelease");
-
-void net_runtime_Semrelease(uint32 *addr)
-{
-	runtime_semrelease(addr);
-}
-
-func runtime_Semacquire(addr *uint32) {
-	runtime_semacquire(addr, true);
-}
-
-func runtime_Semrelease(addr *uint32) {
-	runtime_semrelease(addr);
-}
-
-typedef struct SyncSema SyncSema;
-struct SyncSema
-{
-	Lock		lock;
-	SemaWaiter*	head;
-	SemaWaiter*	tail;
-};
-
-func runtime_Syncsemcheck(size uintptr) {
-	if(size != sizeof(SyncSema)) {
-		runtime_printf("bad SyncSema size: sync:%D runtime:%D\n", (int64)size, (int64)sizeof(SyncSema));
-		runtime_throw("bad SyncSema size");
-	}
-}
-
-// Syncsemacquire waits for a pairing Syncsemrelease on the same semaphore s.
-func runtime_Syncsemacquire(s *SyncSema) {
-	SemaWaiter w, *wake;
-	int64 t0;
-
-	w.g = runtime_g();
-	w.nrelease = -1;
-	w.next = nil;
-	w.releasetime = 0;
-	t0 = 0;
-	if(runtime_blockprofilerate > 0) {
-		t0 = runtime_cputicks();
-		w.releasetime = -1;
-	}
-
-	runtime_lock(&s->lock);
-	if(s->head && s->head->nrelease > 0) {
-		// have pending release, consume it
-		wake = nil;
-		s->head->nrelease--;
-		if(s->head->nrelease == 0) {
-			wake = s->head;
-			s->head = wake->next;
-			if(s->head == nil)
-				s->tail = nil;
-		}
-		runtime_unlock(&s->lock);
-		if(wake)
-			runtime_ready(wake->g);
-	} else {
-		// enqueue itself
-		if(s->tail == nil)
-			s->head = &w;
-		else
-			s->tail->next = &w;
-		s->tail = &w;
-		runtime_parkunlock(&s->lock, "semacquire");
-		if(t0)
-			runtime_blockevent(w.releasetime - t0, 2);
-	}
-}
-
-// Syncsemrelease waits for n pairing Syncsemacquire on the same semaphore s.
-func runtime_Syncsemrelease(s *SyncSema, n uint32) {
-	SemaWaiter w, *wake;
-
-	w.g = runtime_g();
-	w.nrelease = (int32)n;
-	w.next = nil;
-	w.releasetime = 0;
-
-	runtime_lock(&s->lock);
-	while(w.nrelease > 0 && s->head && s->head->nrelease < 0) {
-		// have pending acquire, satisfy it
-		wake = s->head;
-		s->head = wake->next;
-		if(s->head == nil)
-			s->tail = nil;
-		if(wake->releasetime)
-			wake->releasetime = runtime_cputicks();
-		runtime_ready(wake->g);
-		w.nrelease--;
-	}
-	if(w.nrelease > 0) {
-		// enqueue itself
-		if(s->tail == nil)
-			s->head = &w;
-		else
-			s->tail->next = &w;
-		s->tail = &w;
-		runtime_parkunlock(&s->lock, "semarelease");
-	} else
-		runtime_unlock(&s->lock);
-}
diff --git a/third_party/gofrontend/libgo/runtime/signal_unix.c b/third_party/gofrontend/libgo/runtime/signal_unix.c
deleted file mode 100644
index 43be0d8..0000000
--- a/third_party/gofrontend/libgo/runtime/signal_unix.c
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
-
-#include <sys/time.h>
-
-#include "runtime.h"
-#include "defs.h"
-#include "signal_unix.h"
-
-extern SigTab runtime_sigtab[];
-
-void
-runtime_initsig(void)
-{
-	int32 i;
-	SigTab *t;
-
-	// First call: basic setup.
-	for(i = 0; runtime_sigtab[i].sig != -1; i++) {
-		t = &runtime_sigtab[i];
-		if((t->flags == 0) || (t->flags & SigDefault))
-			continue;
-
-		// For some signals, we respect an inherited SIG_IGN handler
-		// rather than insist on installing our own default handler.
-		// Even these signals can be fetched using the os/signal package.
-		switch(t->sig) {
-		case SIGHUP:
-		case SIGINT:
-			if(runtime_getsig(i) == GO_SIG_IGN) {
-				t->flags = SigNotify | SigIgnored;
-				continue;
-			}
-		}
-
-		t->flags |= SigHandling;
-		runtime_setsig(i, runtime_sighandler, true);
-	}
-}
-
-void
-runtime_sigenable(uint32 sig)
-{
-	int32 i;
-	SigTab *t;
-
-	t = nil;
-	for(i = 0; runtime_sigtab[i].sig != -1; i++) {
-		if(runtime_sigtab[i].sig == (int32)sig) {
-			t = &runtime_sigtab[i];
-			break;
-		}
-	}
-
-	if(t == nil)
-		return;
-
-	if((t->flags & SigNotify) && !(t->flags & SigHandling)) {
-		t->flags |= SigHandling;
-		if(runtime_getsig(i) == GO_SIG_IGN)
-			t->flags |= SigIgnored;
-		runtime_setsig(i, runtime_sighandler, true);
-	}
-}
-
-void
-runtime_sigdisable(uint32 sig)
-{
-	int32 i;
-	SigTab *t;
-
-	t = nil;
-	for(i = 0; runtime_sigtab[i].sig != -1; i++) {
-		if(runtime_sigtab[i].sig == (int32)sig) {
-			t = &runtime_sigtab[i];
-			break;
-		}
-	}
-
-	if(t == nil)
-		return;
-
-	if((t->flags & SigNotify) && (t->flags & SigHandling)) {
-		t->flags &= ~SigHandling;
-		if(t->flags & SigIgnored)
-			runtime_setsig(i, GO_SIG_IGN, true);
-		else
-			runtime_setsig(i, GO_SIG_DFL, true);
-	}
-}
-
-void
-runtime_sigignore(uint32 sig)
-{
-	int32 i;
-	SigTab *t;
-
-	t = nil;
-	for(i = 0; runtime_sigtab[i].sig != -1; i++) {
-		if(runtime_sigtab[i].sig == (int32)sig) {
-			t = &runtime_sigtab[i];
-			break;
-		}
-	}
-
-	if(t == nil)
-		return;
-
-	if((t->flags & SigNotify) != 0) {
-		t->flags &= ~SigHandling;
-		runtime_setsig(i, GO_SIG_IGN, true);
-	}
-}
-
-void
-runtime_resetcpuprofiler(int32 hz)
-{
-	struct itimerval it;
-
-	runtime_memclr((byte*)&it, sizeof it);
-	if(hz == 0) {
-		runtime_setitimer(ITIMER_PROF, &it, nil);
-	} else {
-		it.it_interval.tv_sec = 0;
-		it.it_interval.tv_usec = 1000000 / hz;
-		it.it_value = it.it_interval;
-		runtime_setitimer(ITIMER_PROF, &it, nil);
-	}
-	runtime_m()->profilehz = hz;
-}
-
-void
-os_sigpipe(void)
-{
-	int32 i;
-
-	for(i = 0; runtime_sigtab[i].sig != -1; i++)
-		if(runtime_sigtab[i].sig == SIGPIPE)
-			break;
-	runtime_setsig(i, GO_SIG_DFL, false);
-	runtime_raise(SIGPIPE);
-}
-
-void
-runtime_unblocksignals(void)
-{
-	sigset_t sigset_none;
-	sigemptyset(&sigset_none);
-	pthread_sigmask(SIG_SETMASK, &sigset_none, nil);
-}
-
-void
-runtime_crash(void)
-{
-	int32 i;
-
-#ifdef GOOS_darwin
-	// OS X core dumps are linear dumps of the mapped memory,
-	// from the first virtual byte to the last, with zeros in the gaps.
-	// Because of the way we arrange the address space on 64-bit systems,
-	// this means the OS X core file will be >128 GB and even on a zippy
-	// workstation can take OS X well over an hour to write (uninterruptible).
-	// Save users from making that mistake.
-	if(sizeof(void*) == 8)
-		return;
-#endif
-
-	runtime_unblocksignals();
-	for(i = 0; runtime_sigtab[i].sig != -1; i++)
-		if(runtime_sigtab[i].sig == SIGABRT)
-			break;
-	runtime_setsig(i, GO_SIG_DFL, false);
-	runtime_raise(SIGABRT);
-}
-
-void
-runtime_raise(int32 sig)
-{
-	raise(sig);
-}
diff --git a/third_party/gofrontend/libgo/runtime/signal_unix.h b/third_party/gofrontend/libgo/runtime/signal_unix.h
deleted file mode 100644
index 1c51740..0000000
--- a/third_party/gofrontend/libgo/runtime/signal_unix.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <signal.h>
-
-#define GO_SIG_DFL ((void*)SIG_DFL)
-#define GO_SIG_IGN ((void*)SIG_IGN)
-
-#ifdef SA_SIGINFO
-typedef siginfo_t Siginfo;
-#else
-typedef void *Siginfo;
-#endif
-
-typedef void GoSighandler(int32, Siginfo*, void*, G*);
-void	runtime_setsig(int32, GoSighandler*, bool);
-GoSighandler* runtime_getsig(int32);
-
-void	runtime_sighandler(int32 sig, Siginfo *info, void *context, G *gp);
-void	runtime_raise(int32);
-
diff --git a/third_party/gofrontend/libgo/runtime/sigqueue.goc b/third_party/gofrontend/libgo/runtime/sigqueue.goc
deleted file mode 100644
index d9537c2..0000000
--- a/third_party/gofrontend/libgo/runtime/sigqueue.goc
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements runtime support for signal handling.
-//
-// Most synchronization primitives are not available from
-// the signal handler (it cannot block, allocate memory, or use locks)
-// so the handler communicates with a processing goroutine
-// via struct sig, below.
-//
-// sigsend() is called by the signal handler to queue a new signal.
-// signal_recv() is called by the Go program to receive a newly queued signal.
-// Synchronization between sigsend() and signal_recv() is based on the sig.state
-// variable.  It can be in 3 states: 0, HASWAITER and HASSIGNAL.
-// HASWAITER means that signal_recv() is blocked on sig.Note and there are no
-// new pending signals.
-// HASSIGNAL means that sig.mask *may* contain new pending signals,
-// signal_recv() can't be blocked in this state.
-// 0 means that there are no new pending signals and signal_recv() is not blocked.
-// Transitions between states are done atomically with CAS.
-// When signal_recv() is unblocked, it resets sig.Note and rechecks sig.mask.
-// If several sigsend()'s and signal_recv() execute concurrently, it can lead to
-// unnecessary rechecks of sig.mask, but must not lead to missed signals
-// nor deadlocks.
-
-package signal
-#include "config.h"
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-#include "defs.h"
-
-static struct {
-	Note note;
-	uint32 mask[(NSIG+31)/32];
-	uint32 wanted[(NSIG+31)/32];
-	uint32 state;
-	bool inuse;
-} sig;
-
-enum {
-	HASWAITER = 1,
-	HASSIGNAL = 2,
-};
-
-// Called from sighandler to send a signal back out of the signal handling thread.
-bool
-__go_sigsend(int32 s)
-{
-	uint32 bit, mask, old, new;
-
-	if(!sig.inuse || s < 0 || (size_t)s >= 32*nelem(sig.wanted) || !(sig.wanted[s/32]&(1U<<(s&31))))
-		return false;
-	bit = 1 << (s&31);
-	for(;;) {
-		mask = sig.mask[s/32];
-		if(mask & bit)
-			break;		// signal already in queue
-		if(runtime_cas(&sig.mask[s/32], mask, mask|bit)) {
-			// Added to queue.
-			// Only send a wakeup if the receiver needs a kick.
-			for(;;) {
-				old = runtime_atomicload(&sig.state);
-				if(old == HASSIGNAL)
-					break;
-				if(old == HASWAITER)
-					new = 0;
-				else  // if(old == 0)
-					new = HASSIGNAL;
-				if(runtime_cas(&sig.state, old, new)) {
-					if (old == HASWAITER)
-						runtime_notewakeup(&sig.note);
-					break;
-				}
-			}
-			break;
-		}
-	}
-	return true;
-}
-
-// Called to receive the next queued signal.
-// Must only be called from a single goroutine at a time.
-func signal_recv() (m uint32) {
-	static uint32 recv[nelem(sig.mask)];
-	uint32 i, old, new;
-	
-	for(;;) {
-		// Serve from local copy if there are bits left.
-		for(i=0; i<NSIG; i++) {
-			if(recv[i/32]&(1U<<(i&31))) {
-				recv[i/32] ^= 1U<<(i&31);
-				m = i;
-				goto done;
-			}
-		}
-
-		// Check and update sig.state.
-		for(;;) {
-			old = runtime_atomicload(&sig.state);
-			if(old == HASWAITER)
-				runtime_throw("inconsistent state in signal_recv");
-			if(old == HASSIGNAL)
-				new = 0;
-			else  // if(old == 0)
-				new = HASWAITER;
-			if(runtime_cas(&sig.state, old, new)) {
-				if (new == HASWAITER) {
-					runtime_notetsleepg(&sig.note, -1);
-					runtime_noteclear(&sig.note);
-				}
-				break;
-			}
-		}
-
-		// Get a new local copy.
-		for(i=0; (size_t)i<nelem(sig.mask); i++) {
-			for(;;) {
-				m = sig.mask[i];
-				if(runtime_cas(&sig.mask[i], m, 0))
-					break;
-			}
-			recv[i] = m;
-		}
-	}
-
-done:;
-	// goc requires that we fall off the end of functions
-	// that return values instead of using our own return
-	// statements.
-}
-
-// Must only be called from a single goroutine at a time.
-func signal_enable(s uint32) {
-	if(!sig.inuse) {
-		// The first call to signal_enable is for us
-		// to use for initialization.  It does not pass
-		// signal information in m.
-		sig.inuse = true;	// enable reception of signals; cannot disable
-		runtime_noteclear(&sig.note);
-		return;
-	}
-	
-	if(s >= nelem(sig.wanted)*32)
-		return;
-	sig.wanted[s/32] |= 1U<<(s&31);
-	runtime_sigenable(s);
-}
-
-// Must only be called from a single goroutine at a time.
-func signal_disable(s uint32) {
-	if(s >= nelem(sig.wanted)*32)
-		return;
-	sig.wanted[s/32] &= ~(1U<<(s&31));
-	runtime_sigdisable(s);
-}
-
-// Must only be called from a single goroutine at a time.
-func signal_ignore(s uint32) {
-	if (s >= nelem(sig.wanted)*32)
-		return;
-	sig.wanted[s/32] &= ~(1U<<(s&31));
-	runtime_sigignore(s);
-}
-
-// This runs on a foreign stack, without an m or a g.  No stack split.
-void
-runtime_badsignal(int sig)
-{
-	__go_sigsend(sig);
-}
diff --git a/third_party/gofrontend/libgo/runtime/string.goc b/third_party/gofrontend/libgo/runtime/string.goc
deleted file mode 100644
index 0ad180b..0000000
--- a/third_party/gofrontend/libgo/runtime/string.goc
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2009, 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime
-#include "runtime.h"
-#include "arch.h"
-#include "malloc.h"
-#include "go-string.h"
-
-#define charntorune(pv, str, len) __go_get_rune(str, len, pv)
-
-const String	runtime_emptystring;
-
-intgo
-runtime_findnull(const byte *s)
-{
-	if(s == nil)
-		return 0;
-	return __builtin_strlen((const char*) s);
-}
-
-intgo
-runtime_findnullw(const uint16 *s)
-{
-	intgo l;
-
-	if(s == nil)
-		return 0;
-	for(l=0; s[l]!=0; l++)
-		;
-	return l;
-}
-
-static String
-gostringsize(intgo l, byte** pmem)
-{
-	String s;
-	byte *mem;
-
-	if(l == 0) {
-		*pmem = nil;
-		return runtime_emptystring;
-	}
-	mem = runtime_mallocgc(l, 0, FlagNoScan|FlagNoZero);
-	s.str = mem;
-	s.len = l;
-	*pmem = mem;
-	return s;
-}
-
-String
-runtime_gostring(const byte *str)
-{
-	intgo l;
-	String s;
-	byte *mem;
-
-	l = runtime_findnull(str);
-	s = gostringsize(l, &mem);
-	runtime_memmove(mem, str, l);
-	return s;
-}
-
-String
-runtime_gostringnocopy(const byte *str)
-{
-	String s;
-	
-	s.str = str;
-	s.len = runtime_findnull(str);
-	return s;
-}
-
-func cstringToGo(str *byte) (s String) {
-	s = runtime_gostringnocopy(str);
-}
-
-enum
-{
-	Runeself	= 0x80,
-};
-
-func stringiter(s String, k int) (retk int) {
-	int32 l;
-
-	if(k >= s.len) {
-		// retk=0 is end of iteration
-		retk = 0;
-		goto out;
-	}
-
-	l = s.str[k];
-	if(l < Runeself) {
-		retk = k+1;
-		goto out;
-	}
-
-	// multi-char rune
-	retk = k + charntorune(&l, s.str+k, s.len-k);
-
-out:
-}
-
-func stringiter2(s String, k int) (retk int, retv int32) {
-	if(k >= s.len) {
-		// retk=0 is end of iteration
-		retk = 0;
-		retv = 0;
-		goto out;
-	}
-
-	retv = s.str[k];
-	if(retv < Runeself) {
-		retk = k+1;
-		goto out;
-	}
-
-	// multi-char rune
-	retk = k + charntorune(&retv, s.str+k, s.len-k);
-
-out:
-}
diff --git a/third_party/gofrontend/libgo/runtime/thread-linux.c b/third_party/gofrontend/libgo/runtime/thread-linux.c
deleted file mode 100644
index ae56261..0000000
--- a/third_party/gofrontend/libgo/runtime/thread-linux.c
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "runtime.h"
-#include "defs.h"
-#include "signal_unix.h"
-
-// Linux futex.
-//
-//	futexsleep(uint32 *addr, uint32 val)
-//	futexwakeup(uint32 *addr)
-//
-// Futexsleep atomically checks if *addr == val and if so, sleeps on addr.
-// Futexwakeup wakes up threads sleeping on addr.
-// Futexsleep is allowed to wake up spuriously.
-
-#include <errno.h>
-#include <string.h>
-#include <time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <syscall.h>
-#include <linux/futex.h>
-
-typedef struct timespec Timespec;
-
-// Atomically,
-//	if(*addr == val) sleep
-// Might be woken up spuriously; that's allowed.
-// Don't sleep longer than ns; ns < 0 means forever.
-void
-runtime_futexsleep(uint32 *addr, uint32 val, int64 ns)
-{
-	Timespec ts;
-	int32 nsec;
-
-	// Some Linux kernels have a bug where futex of
-	// FUTEX_WAIT returns an internal error code
-	// as an errno.  Libpthread ignores the return value
-	// here, and so can we: as it says a few lines up,
-	// spurious wakeups are allowed.
-
-	if(ns < 0) {
-		syscall(__NR_futex, addr, FUTEX_WAIT, val, nil, nil, 0);
-		return;
-	}
-	ts.tv_sec = runtime_timediv(ns, 1000000000LL, &nsec);
-	ts.tv_nsec = nsec;
-	syscall(__NR_futex, addr, FUTEX_WAIT, val, &ts, nil, 0);
-}
-
-// If any procs are sleeping on addr, wake up at most cnt.
-void
-runtime_futexwakeup(uint32 *addr, uint32 cnt)
-{
-	int64 ret;
-
-	ret = syscall(__NR_futex, addr, FUTEX_WAKE, cnt, nil, nil, 0);
-
-	if(ret >= 0)
-		return;
-
-	// I don't know that futex wakeup can return
-	// EAGAIN or EINTR, but if it does, it would be
-	// safe to loop and call futex again.
-	runtime_printf("futexwakeup addr=%p returned %D\n", addr, ret);
-	*(int32*)0x1006 = 0x1006;
-}
-
-void
-runtime_osinit(void)
-{
-	runtime_ncpu = getproccount();
-}
-
-void
-runtime_goenvs(void)
-{
-	runtime_goenvs_unix();
-}
diff --git a/third_party/gofrontend/libgo/runtime/thread-sema.c b/third_party/gofrontend/libgo/runtime/thread-sema.c
deleted file mode 100644
index 18827b0..0000000
--- a/third_party/gofrontend/libgo/runtime/thread-sema.c
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "config.h"
-#include "runtime.h"
-
-#include <errno.h>
-#include <stdlib.h>
-#include <time.h>
-#include <semaphore.h>
-
-/* If we don't have sem_timedwait, use pthread_cond_timedwait instead.
-   We don't always use condition variables because on some systems
-   pthread_mutex_lock and pthread_mutex_unlock must be called by the
-   same thread.  That is never true of semaphores.  */
-
-struct go_sem
-{
-  sem_t sem;
-
-#ifndef HAVE_SEM_TIMEDWAIT
-  int timedwait;
-  pthread_mutex_t mutex;
-  pthread_cond_t cond;
-#endif
-};
-
-/* Create a semaphore.  */
-
-uintptr
-runtime_semacreate(void)
-{
-  struct go_sem *p;
-
-  /* Call malloc rather than runtime_malloc.  This will allocate space
-     on the C heap.  We can't call runtime_malloc here because it
-     could cause a deadlock.  */
-  p = malloc (sizeof (struct go_sem));
-  if (sem_init (&p->sem, 0, 0) != 0)
-    runtime_throw ("sem_init");
-
-#ifndef HAVE_SEM_TIMEDWAIT
-  if (pthread_mutex_init (&p->mutex, NULL) != 0)
-    runtime_throw ("pthread_mutex_init");
-  if (pthread_cond_init (&p->cond, NULL) != 0)
-    runtime_throw ("pthread_cond_init");
-#endif
-
-  return (uintptr) p;
-}
-
-/* Acquire m->waitsema.  */
-
-int32
-runtime_semasleep (int64 ns)
-{
-  M *m;
-  struct go_sem *sem;
-  int r;
-
-  m = runtime_m ();
-  sem = (struct go_sem *) m->waitsema;
-  if (ns >= 0)
-    {
-      int64 abs;
-      struct timespec ts;
-      int err;
-
-      abs = ns + runtime_nanotime ();
-      ts.tv_sec = abs / 1000000000LL;
-      ts.tv_nsec = abs % 1000000000LL;
-
-      err = 0;
-
-#ifdef HAVE_SEM_TIMEDWAIT
-      r = sem_timedwait (&sem->sem, &ts);
-      if (r != 0)
-	err = errno;
-#else
-      if (pthread_mutex_lock (&sem->mutex) != 0)
-	runtime_throw ("pthread_mutex_lock");
-
-      while ((r = sem_trywait (&sem->sem)) != 0)
-	{
-	  r = pthread_cond_timedwait (&sem->cond, &sem->mutex, &ts);
-	  if (r != 0)
-	    {
-	      err = r;
-	      break;
-	    }
-	}
-
-      if (pthread_mutex_unlock (&sem->mutex) != 0)
-	runtime_throw ("pthread_mutex_unlock");
-#endif
-
-      if (err != 0)
-	{
-	  if (err == ETIMEDOUT || err == EAGAIN || err == EINTR)
-	    return -1;
-	  runtime_throw ("sema_timedwait");
-	}
-      return 0;
-    }
-
-  while (sem_wait (&sem->sem) != 0)
-    {
-      if (errno == EINTR)
-	continue;
-      runtime_throw ("sem_wait");
-    }
-
-  return 0;
-}
-
-/* Wake up mp->waitsema.  */
-
-void
-runtime_semawakeup (M *mp)
-{
-  struct go_sem *sem;
-
-  sem = (struct go_sem *) mp->waitsema;
-  if (sem_post (&sem->sem) != 0)
-    runtime_throw ("sem_post");
-
-#ifndef HAVE_SEM_TIMEDWAIT
-  if (pthread_mutex_lock (&sem->mutex) != 0)
-    runtime_throw ("pthread_mutex_lock");
-  if (pthread_cond_broadcast (&sem->cond) != 0)
-    runtime_throw ("pthread_cond_broadcast");
-  if (pthread_mutex_unlock (&sem->mutex) != 0)
-    runtime_throw ("pthread_mutex_unlock");
-#endif
-}
-
-void
-runtime_osinit (void)
-{
-  runtime_ncpu = getproccount();
-}
-
-void
-runtime_goenvs (void)
-{
-  runtime_goenvs_unix ();
-}
diff --git a/third_party/gofrontend/libgo/runtime/thread.c b/third_party/gofrontend/libgo/runtime/thread.c
deleted file mode 100644
index 83ee006..0000000
--- a/third_party/gofrontend/libgo/runtime/thread.c
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include <errno.h>
-#include <signal.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-#include "runtime.h"
-#include "go-assert.h"
-
-/* For targets which don't have the required sync support.  Really
-   these should be provided by gcc itself.  FIXME.  */
-
-#if !defined (HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4) || !defined (HAVE_SYNC_BOOL_COMPARE_AND_SWAP_8) || !defined (HAVE_SYNC_FETCH_AND_ADD_4) || !defined (HAVE_SYNC_ADD_AND_FETCH_8)
-
-static pthread_mutex_t sync_lock = PTHREAD_MUTEX_INITIALIZER;
-
-#endif
-
-#ifndef HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4
-
-_Bool
-__sync_bool_compare_and_swap_4 (uint32*, uint32, uint32)
-  __attribute__ ((visibility ("hidden")));
-
-_Bool
-__sync_bool_compare_and_swap_4 (uint32* ptr, uint32 old, uint32 new)
-{
-  int i;
-  _Bool ret;
-
-  i = pthread_mutex_lock (&sync_lock);
-  __go_assert (i == 0);
-
-  if (*ptr != old)
-    ret = 0;
-  else
-    {
-      *ptr = new;
-      ret = 1;
-    }
-
-  i = pthread_mutex_unlock (&sync_lock);
-  __go_assert (i == 0);
-
-  return ret;
-}
-
-#endif
-
-#ifndef HAVE_SYNC_BOOL_COMPARE_AND_SWAP_8
-
-_Bool
-__sync_bool_compare_and_swap_8 (uint64*, uint64, uint64)
-  __attribute__ ((visibility ("hidden")));
-
-_Bool
-__sync_bool_compare_and_swap_8 (uint64* ptr, uint64 old, uint64 new)
-{
-  int i;
-  _Bool ret;
-
-  i = pthread_mutex_lock (&sync_lock);
-  __go_assert (i == 0);
-
-  if (*ptr != old)
-    ret = 0;
-  else
-    {
-      *ptr = new;
-      ret = 1;
-    }
-
-  i = pthread_mutex_unlock (&sync_lock);
-  __go_assert (i == 0);
-
-  return ret;
-}
-
-#endif
-
-#ifndef HAVE_SYNC_FETCH_AND_ADD_4
-
-uint32
-__sync_fetch_and_add_4 (uint32*, uint32)
-  __attribute__ ((visibility ("hidden")));
-
-uint32
-__sync_fetch_and_add_4 (uint32* ptr, uint32 add)
-{
-  int i;
-  uint32 ret;
-
-  i = pthread_mutex_lock (&sync_lock);
-  __go_assert (i == 0);
-
-  ret = *ptr;
-  *ptr += add;
-
-  i = pthread_mutex_unlock (&sync_lock);
-  __go_assert (i == 0);
-
-  return ret;
-}
-
-#endif
-
-#ifndef HAVE_SYNC_ADD_AND_FETCH_8
-
-uint64
-__sync_add_and_fetch_8 (uint64*, uint64)
-  __attribute__ ((visibility ("hidden")));
-
-uint64
-__sync_add_and_fetch_8 (uint64* ptr, uint64 add)
-{
-  int i;
-  uint64 ret;
-
-  i = pthread_mutex_lock (&sync_lock);
-  __go_assert (i == 0);
-
-  *ptr += add;
-  ret = *ptr;
-
-  i = pthread_mutex_unlock (&sync_lock);
-  __go_assert (i == 0);
-
-  return ret;
-}
-
-#endif
-
-uintptr
-runtime_memlimit(void)
-{
-	struct rlimit rl;
-	uintptr used;
-
-	if(getrlimit(RLIMIT_AS, &rl) != 0)
-		return 0;
-	if(rl.rlim_cur >= 0x7fffffff)
-		return 0;
-
-	// Estimate our VM footprint excluding the heap.
-	// Not an exact science: use size of binary plus
-	// some room for thread stacks.
-	used = (64<<20);
-	if(used >= rl.rlim_cur)
-		return 0;
-
-	// If there's not at least 16 MB left, we're probably
-	// not going to be able to do much.  Treat as no limit.
-	rl.rlim_cur -= used;
-	if(rl.rlim_cur < (16<<20))
-		return 0;
-
-	return rl.rlim_cur - used;
-}
diff --git a/third_party/gofrontend/libgo/runtime/time.goc b/third_party/gofrontend/libgo/runtime/time.goc
deleted file mode 100644
index f9227ff..0000000
--- a/third_party/gofrontend/libgo/runtime/time.goc
+++ /dev/null
@@ -1,353 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Time-related runtime and pieces of package time.
-
-package time
-
-#include <sys/time.h>
-
-#include "runtime.h"
-#include "defs.h"
-#include "arch.h"
-#include "malloc.h"
-
-enum {
-	debug = 0,
-};
-
-static Timers timers;
-static void addtimer(Timer*);
-static void dumptimers(const char*);
-
-// nacl fake time support. 
-int64 runtime_timens;
-
-// Package time APIs.
-// Godoc uses the comments in package time, not these.
-
-// time.now is implemented in assembly.
-
-// runtimeNano returns the current value of the runtime clock in nanoseconds.
-func runtimeNano() (ns int64) {
-	ns = runtime_nanotime();
-}
-
-// Sleep puts the current goroutine to sleep for at least ns nanoseconds.
-func Sleep(ns int64) {
-	runtime_tsleep(ns, "sleep");
-}
-
-// startTimer adds t to the timer heap.
-func startTimer(t *Timer) {
-	runtime_addtimer(t);
-}
-
-// stopTimer removes t from the timer heap if it is there.
-// It returns true if t was removed, false if t wasn't even there.
-func stopTimer(t *Timer) (stopped bool) {
-	stopped = runtime_deltimer(t);
-}
-
-// C runtime.
-
-int64 runtime_unixnanotime(void)
-{
-	struct time_now_ret r;
-
-	r = now();
-	return r.sec*1000000000 + r.nsec;
-}
-
-static void timerproc(void*);
-static void siftup(int32);
-static void siftdown(int32);
-
-// Ready the goroutine e.data.
-static void
-ready(Eface e, uintptr seq)
-{
-	USED(seq);
-
-	runtime_ready(e.__object);
-}
-
-static FuncVal readyv = {(void(*)(void))ready};
-
-// Put the current goroutine to sleep for ns nanoseconds.
-void
-runtime_tsleep(int64 ns, const char *reason)
-{
-	G* g;
-	Timer t;
-
-	g = runtime_g();
-
-	if(ns <= 0)
-		return;
-
-	t.when = runtime_nanotime() + ns;
-	t.period = 0;
-	t.fv = &readyv;
-	t.arg.__object = g;
-	t.seq = 0;
-	runtime_lock(&timers.lock);
-	addtimer(&t);
-	runtime_parkunlock(&timers.lock, reason);
-}
-
-void
-runtime_addtimer(Timer *t)
-{
-	runtime_lock(&timers.lock);
-	addtimer(t);
-	runtime_unlock(&timers.lock);
-}
-
-// Add a timer to the heap and start or kick the timer proc
-// if the new timer is earlier than any of the others.
-static void
-addtimer(Timer *t)
-{
-	int32 n;
-	Timer **nt;
-
-	// when must never be negative; otherwise timerproc will overflow
-	// during its delta calculation and never expire other timers.
-	if(t->when < 0)
-		t->when = (int64)((1ULL<<63)-1);
-
-	if(timers.len >= timers.cap) {
-		// Grow slice.
-		n = 16;
-		if(n <= timers.cap)
-			n = timers.cap*3 / 2;
-		nt = runtime_malloc(n*sizeof nt[0]);
-		runtime_memmove(nt, timers.t, timers.len*sizeof nt[0]);
-		runtime_free(timers.t);
-		timers.t = nt;
-		timers.cap = n;
-	}
-	t->i = timers.len++;
-	timers.t[t->i] = t;
-	siftup(t->i);
-	if(t->i == 0) {
-		// siftup moved to top: new earliest deadline.
-		if(timers.sleeping) {
-			timers.sleeping = false;
-			runtime_notewakeup(&timers.waitnote);
-		}
-		if(timers.rescheduling) {
-			timers.rescheduling = false;
-			runtime_ready(timers.timerproc);
-		}
-	}
-	if(timers.timerproc == nil) {
-		timers.timerproc = __go_go(timerproc, nil);
-		timers.timerproc->issystem = true;
-	}
-	if(debug)
-		dumptimers("addtimer");
-}
-
-// Used to force a dereference before the lock is acquired.
-static int32 gi;
-
-// Delete timer t from the heap.
-// Do not need to update the timerproc:
-// if it wakes up early, no big deal.
-bool
-runtime_deltimer(Timer *t)
-{
-	int32 i;
-
-	// Dereference t so that any panic happens before the lock is held.
-	// Discard result, because t might be moving in the heap.
-	i = t->i;
-	gi = i;
-
-	runtime_lock(&timers.lock);
-
-	// t may not be registered anymore and may have
-	// a bogus i (typically 0, if generated by Go).
-	// Verify it before proceeding.
-	i = t->i;
-	if(i < 0 || i >= timers.len || timers.t[i] != t) {
-		runtime_unlock(&timers.lock);
-		return false;
-	}
-
-	timers.len--;
-	if(i == timers.len) {
-		timers.t[i] = nil;
-	} else {
-		timers.t[i] = timers.t[timers.len];
-		timers.t[timers.len] = nil;
-		timers.t[i]->i = i;
-		siftup(i);
-		siftdown(i);
-	}
-	if(debug)
-		dumptimers("deltimer");
-	runtime_unlock(&timers.lock);
-	return true;
-}
-
-// Timerproc runs the time-driven events.
-// It sleeps until the next event in the timers heap.
-// If addtimer inserts a new earlier event, addtimer
-// wakes timerproc early.
-static void
-timerproc(void* dummy __attribute__ ((unused)))
-{
-	int64 delta, now;
-	Timer *t;
-	FuncVal *fv;
-	void (*f)(Eface, uintptr);
-	Eface arg;
-	uintptr seq;
-
-	for(;;) {
-		runtime_lock(&timers.lock);
-		timers.sleeping = false;
-		now = runtime_nanotime();
-		for(;;) {
-			if(timers.len == 0) {
-				delta = -1;
-				break;
-			}
-			t = timers.t[0];
-			delta = t->when - now;
-			if(delta > 0)
-				break;
-			if(t->period > 0) {
-				// leave in heap but adjust next time to fire
-				t->when += t->period * (1 + -delta/t->period);
-				siftdown(0);
-			} else {
-				// remove from heap
-				timers.t[0] = timers.t[--timers.len];
-				timers.t[0]->i = 0;
-				siftdown(0);
-				t->i = -1;  // mark as removed
-			}
-			fv = t->fv;
-			f = (void*)t->fv->fn;
-			arg = t->arg;
-			seq = t->seq;
-			runtime_unlock(&timers.lock);
-			__builtin_call_with_static_chain(f(arg, seq), fv);
-
-			// clear f and arg to avoid leak while sleeping for next timer
-			f = nil;
-			USED(f);
-			arg.__type_descriptor = nil;
-			arg.__object = nil;
-			USED(&arg);
-
-			runtime_lock(&timers.lock);
-		}
-		if(delta < 0) {
-			// No timers left - put goroutine to sleep.
-			timers.rescheduling = true;
-			runtime_g()->isbackground = true;
-			runtime_parkunlock(&timers.lock, "timer goroutine (idle)");
-			runtime_g()->isbackground = false;
-			continue;
-		}
-		// At least one timer pending.  Sleep until then.
-		timers.sleeping = true;
-		runtime_noteclear(&timers.waitnote);
-		runtime_unlock(&timers.lock);
-		runtime_notetsleepg(&timers.waitnote, delta);
-	}
-}
-
-// heap maintenance algorithms.
-
-static void
-siftup(int32 i)
-{
-	int32 p;
-	int64 when;
-	Timer **t, *tmp;
-
-	t = timers.t;
-	when = t[i]->when;
-	tmp = t[i];
-	while(i > 0) {
-		p = (i-1)/4;  // parent
-		if(when >= t[p]->when)
-			break;
-		t[i] = t[p];
-		t[i]->i = i;
-		t[p] = tmp;
-		tmp->i = p;
-		i = p;
-	}
-}
-
-static void
-siftdown(int32 i)
-{
-	int32 c, c3, len;
-	int64 when, w, w3;
-	Timer **t, *tmp;
-
-	t = timers.t;
-	len = timers.len;
-	when = t[i]->when;
-	tmp = t[i];
-	for(;;) {
-		c = i*4 + 1;  // left child
-		c3 = c + 2;  // mid child
-		if(c >= len) {
-			break;
-		}
-		w = t[c]->when;
-		if(c+1 < len && t[c+1]->when < w) {
-			w = t[c+1]->when;
-			c++;
-		}
-		if(c3 < len) {
-			w3 = t[c3]->when;
-			if(c3+1 < len && t[c3+1]->when < w3) {
-				w3 = t[c3+1]->when;
-				c3++;
-			}
-			if(w3 < w) {
-				w = w3;
-				c = c3;
-			}
-		}
-		if(w >= when)
-			break;
-		t[i] = t[c];
-		t[i]->i = i;
-		t[c] = tmp;
-		tmp->i = c;
-		i = c;
-	}
-}
-
-static void
-dumptimers(const char *msg)
-{
-	Timer *t;
-	int32 i;
-
-	runtime_printf("timers: %s\n", msg);
-	for(i = 0; i < timers.len; i++) {
-		t = timers.t[i];
-		runtime_printf("\t%d\t%p:\ti %d when %D period %D fn %p\n",
-				i, t, t->i, t->when, t->period, t->fv->fn);
-	}
-	runtime_printf("\n");
-}
-
-void
-runtime_time_scan(struct Workbuf** wbufp, void (*enqueue1)(struct Workbuf**, Obj))
-{
-	enqueue1(wbufp, (Obj){(byte*)&timers, sizeof timers, 0});
-}
diff --git a/third_party/gofrontend/libgo/runtime/yield.c b/third_party/gofrontend/libgo/runtime/yield.c
deleted file mode 100644
index 442d346..0000000
--- a/third_party/gofrontend/libgo/runtime/yield.c
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-#include "config.h"
-
-#include <stddef.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sched.h>
-#include <unistd.h>
-
-#ifdef HAVE_SYS_SELECT_H
-#include <sys/select.h>
-#endif
-
-#if defined (__i386__) || defined (__x86_64__)
-#include <xmmintrin.h>
-#endif
-
-#include "runtime.h"
-
-/* Spin wait.  */
-
-void
-runtime_procyield (uint32 cnt)
-{
-  volatile uint32 i;
-
-  for (i = 0; i < cnt; ++i)
-    {
-#if defined (__i386__) || defined (__x86_64__)
-      _mm_pause ();
-#endif
-    }
-}
-
-/* Ask the OS to reschedule this thread.  */
-
-void
-runtime_osyield (void)
-{
-  sched_yield ();
-}
-
-/* Sleep for some number of microseconds.  */
-
-void
-runtime_usleep (uint32 us)
-{
-  struct timeval tv;
-
-  tv.tv_sec = us / 1000000;
-  tv.tv_usec = us % 1000000;
-  select (0, NULL, NULL, NULL, &tv);
-}
diff --git a/third_party/gofrontend/libgo/testsuite/Makefile.am b/third_party/gofrontend/libgo/testsuite/Makefile.am
deleted file mode 100644
index 8c6249d..0000000
--- a/third_party/gofrontend/libgo/testsuite/Makefile.am
+++ /dev/null
@@ -1,21 +0,0 @@
-## Process this file with automake to produce Makefile.in.
-
-AUTOMAKE_OPTIONS = foreign dejagnu
-
-# Setup the testing framework, if you have one
-EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \
-            echo $(top_builddir)/../expect/expect ; \
-          else echo expect ; fi`
-
-RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \
-	       echo $(top_srcdir)/../dejagnu/runtest ; \
-	    else echo runtest; fi`
-
-# When running the tests we set GCC_EXEC_PREFIX to the install tree so that
-# files that have already been installed there will be found.  The -B option
-# overrides it, so use of GCC_EXEC_PREFIX will not result in using GCC files
-# from the install tree.
-
-AM_RUNTESTFLAGS = "TEST_GCC_EXEC_PREFIX=$(libdir)/gcc"
-
-CLEANFILES = *.log *.sum
diff --git a/third_party/gofrontend/libgo/testsuite/Makefile.in b/third_party/gofrontend/libgo/testsuite/Makefile.in
deleted file mode 100644
index ba04a50..0000000
--- a/third_party/gofrontend/libgo/testsuite/Makefile.in
+++ /dev/null
@@ -1,458 +0,0 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-am__make_dryrun = \
-  { \
-    am__dry=no; \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
-          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
-      *) \
-        for am__flg in $$MAKEFLAGS; do \
-          case $$am__flg in \
-            *=*|--*) ;; \
-            *n*) am__dry=yes; break;; \
-          esac; \
-        done;; \
-    esac; \
-    test $$am__dry = yes; \
-  }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-target_triplet = @target@
-subdir = testsuite
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/depstand.m4 \
-	$(top_srcdir)/../config/lead-dot.m4 \
-	$(top_srcdir)/../config/multi.m4 \
-	$(top_srcdir)/../config/override.m4 \
-	$(top_srcdir)/../config/unwind_ipinfo.m4 \
-	$(top_srcdir)/config/go.m4 $(top_srcdir)/config/libtool.m4 \
-	$(top_srcdir)/config/ltoptions.m4 \
-	$(top_srcdir)/config/ltsugar.m4 \
-	$(top_srcdir)/config/ltversion.m4 \
-	$(top_srcdir)/config/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-DEJATOOL = $(PACKAGE)
-RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CC_FOR_BUILD = @CC_FOR_BUILD@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GOARCH = @GOARCH@
-GOC = @GOC@
-GOCFLAGS = @GOCFLAGS@
-GOOS = @GOOS@
-GO_LIBCALL_OS_ARCH_FILE = @GO_LIBCALL_OS_ARCH_FILE@
-GO_LIBCALL_OS_FILE = @GO_LIBCALL_OS_FILE@
-GO_SPLIT_STACK = @GO_SPLIT_STACK@
-GO_SYSCALL_OS_ARCH_FILE = @GO_SYSCALL_OS_ARCH_FILE@
-GO_SYSCALL_OS_FILE = @GO_SYSCALL_OS_FILE@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBATOMIC = @LIBATOMIC@
-LIBFFI = @LIBFFI@
-LIBFFIINCS = @LIBFFIINCS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAKEINFO = @MAKEINFO@
-MATH_FLAG = @MATH_FLAG@
-MATH_LIBS = @MATH_LIBS@
-MKDIR_P = @MKDIR_P@
-NET_LIBS = @NET_LIBS@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJCOPY = @OBJCOPY@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OSCFLAGS = @OSCFLAGS@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
-PTHREAD_LIBS = @PTHREAD_LIBS@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SIZEOF_STRUCT_EPOLL_EVENT = @SIZEOF_STRUCT_EPOLL_EVENT@
-SPLIT_STACK = @SPLIT_STACK@
-STRINGOPS_FLAG = @STRINGOPS_FLAG@
-STRIP = @STRIP@
-STRUCT_EPOLL_EVENT_FD_OFFSET = @STRUCT_EPOLL_EVENT_FD_OFFSET@
-USE_DEJAGNU = @USE_DEJAGNU@
-VERSION = @VERSION@
-WARN_FLAGS = @WARN_FLAGS@
-WERROR = @WERROR@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-enable_shared = @enable_shared@
-enable_static = @enable_static@
-exec_prefix = @exec_prefix@
-glibgo_toolexecdir = @glibgo_toolexecdir@
-glibgo_toolexeclibdir = @glibgo_toolexeclibdir@
-go_include = @go_include@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-libtool_VERSION = @libtool_VERSION@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-multi_basedir = @multi_basedir@
-nover_glibgo_toolexeclibdir = @nover_glibgo_toolexeclibdir@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target = @target@
-target_alias = @target_alias@
-target_cpu = @target_cpu@
-target_os = @target_os@
-target_vendor = @target_vendor@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AUTOMAKE_OPTIONS = foreign dejagnu
-
-# Setup the testing framework, if you have one
-EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \
-            echo $(top_builddir)/../expect/expect ; \
-          else echo expect ; fi`
-
-RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \
-	       echo $(top_srcdir)/../dejagnu/runtest ; \
-	    else echo runtest; fi`
-
-
-# When running the tests we set GCC_EXEC_PREFIX to the install tree so that
-# files that have already been installed there will be found.  The -B option
-# overrides it, so use of GCC_EXEC_PREFIX will not result in using GCC files
-# from the install tree.
-AM_RUNTESTFLAGS = "TEST_GCC_EXEC_PREFIX=$(libdir)/gcc"
-CLEANFILES = *.log *.sum
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testsuite/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign testsuite/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-check-DEJAGNU: site.exp
-	srcdir='$(srcdir)'; export srcdir; \
-	EXPECT=$(EXPECT); export EXPECT; \
-	runtest=$(RUNTEST); \
-	if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \
-	  exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \
-	    if $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \
-	    then :; else exit_status=1; fi; \
-	  done; \
-	else echo "WARNING: could not find \`runtest'" 1>&2; :;\
-	fi; \
-	exit $$exit_status
-site.exp: Makefile $(EXTRA_DEJAGNU_SITE_CONFIG)
-	@echo 'Making a new site.exp file...'
-	@echo '## these variables are automatically generated by make ##' >site.tmp
-	@echo '# Do not edit here.  If you wish to override these values' >>site.tmp
-	@echo '# edit the last section' >>site.tmp
-	@echo 'set srcdir "$(srcdir)"' >>site.tmp
-	@echo "set objdir `pwd`" >>site.tmp
-	@echo 'set build_alias "$(build_alias)"' >>site.tmp
-	@echo 'set build_triplet $(build_triplet)' >>site.tmp
-	@echo 'set host_alias "$(host_alias)"' >>site.tmp
-	@echo 'set host_triplet $(host_triplet)' >>site.tmp
-	@echo 'set target_alias "$(target_alias)"' >>site.tmp
-	@echo 'set target_triplet $(target_triplet)' >>site.tmp
-	@list='$(EXTRA_DEJAGNU_SITE_CONFIG)'; for f in $$list; do \
-	  echo "## Begin content included from file $$f.  Do not modify. ##" \
-	   && cat `test -f "$$f" || echo '$(srcdir)/'`$$f \
-	   && echo "## End content included from file $$f. ##" \
-	   || exit 1; \
-	 done >> site.tmp
-	@echo "## End of auto-generated content; you can edit from here. ##" >> site.tmp
-	@if test -f site.exp; then \
-	   sed -e '1,/^## End of auto-generated content.*##/d' site.exp >> site.tmp; \
-	 fi
-	@-rm -f site.bak
-	@test ! -f site.exp || mv site.exp site.bak
-	@mv site.tmp site.exp
-
-distclean-DEJAGNU:
-	-rm -f site.exp site.bak
-	-l='$(DEJATOOL)'; for tool in $$l; do \
-	  rm -f $$tool.sum $$tool.log; \
-	done
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-DEJAGNU distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: check-am install-am install-strip
-
-.PHONY: all all-am check check-DEJAGNU check-am clean clean-generic \
-	clean-libtool distclean distclean-DEJAGNU distclean-generic \
-	distclean-libtool dvi dvi-am html html-am info info-am install \
-	install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/gofrontend/libgo/testsuite/gotest b/third_party/gofrontend/libgo/testsuite/gotest
deleted file mode 100755
index 19cc6be..0000000
--- a/third_party/gofrontend/libgo/testsuite/gotest
+++ /dev/null
@@ -1,664 +0,0 @@
-#!/bin/sh
-# Copyright 2009 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# Using all the *_test.go files in the current directory, write out a file
-# _testmain.go that runs all its tests. Compile everything and run the
-# tests.
-# If files are named on the command line, use them instead of *_test.go.
-
-# Makes egrep,grep work better in general if we put them
-# in ordinary C mode instead of what the current language is.
-unset LANG
-export LC_ALL=C
-export LC_CTYPE=C
-
-GC=${GC:-gccgo}
-GL=${GL:-${GC-gccgo}}
-GOLIBS=${GOLIBS:-}
-export GC GL GOLIBS
-
-NM=${NM:-nm}
-
-# srcdir is where the source files are found.  basedir is where the
-# source file paths are relative to.
-# gofiles are the test files.  pkgfiles are the source files.
-srcdir=.
-basedir=.
-goarch=""
-gofiles=""
-goos=""
-pkgfiles=""
-loop=true
-keep=false
-pkgpath=
-prefix=
-dejagnu=no
-timeout=240
-testname=""
-bench=""
-trace=false
-while $loop; do
-	case "x$1" in
-        x--srcdir)
-		srcdir=$2
-		shift
-		shift
-		;;
-	x--srcdir=*)
-		srcdir=`echo $1 | sed -e 's/^--srcdir=//'`
-		shift
-		;;
-        x--basedir)
-		basedir=$2
-		shift
-		shift
-		;;
-	x--basedir=*)
-		basedir=`echo $1 | sed -e 's/^--basedir=//'`
-		shift
-		;;
-	x--goarch)
-		goarch=$2
-		shift
-		shift
-		;;
-	x--goarch=*)
-		goarch=`echo $1 | sed -e 's/^--goarch=//'`
-		shift
-		;;
-	x--goos)
-		goos=$2
-		shift
-		shift
-		;;
-	x--goos=*)
-		goos=`echo $1 | sed -e 's/^--goos=//'`
-		shift
-		;;
-	x--pkgpath)
-		pkgpath=$2
-		shift
-		shift
-		;;
-	x--pkgpath=*)
-		pkgpath=`echo $1 | sed -e 's/^--pkgpath=//'`
-		shift
-		;;
-	x--prefix)
-		prefix=$2
-		shift
-		shift
-		;;
-	x--prefix=*)
-		prefix=`echo $1 | sed -e 's/^--prefix=//'`
-		shift
-		;;
-	x--keep)
-		keep=true
-                shift
-		;;
-	x--pkgfiles)
-		pkgfiles=$2
-		shift
-		shift
-		;;
-	x--pkgfiles=*)
-		pkgfiles=`echo $1 | sed -e 's/^--pkgfiles=//'`
-		shift
-		;;
-	x--dejagnu)
-		dejagnu=$2
-		shift
-		shift
-		;;
-	x--dejagnu=*)
-		dejagnu=`echo $1 | sed -e 's/^--dejagnu=//'`
-		shift
-		;;
-	x--timeout)
-		timeout=$2
-		shift
-		shift
-		;;
-	x--timeout=*)
-		timeout=`echo $1 | sed -e 's/^--timeout=//'`
-		shift
-		;;
-	x--testname)
-		testname=$2
-		shift
-		shift
-		;;
-	x--testname=*)
-		testname=`echo $1 | sed -e 's/^--testname=//'`
-		shift
-		;;
-	x--bench)
-		bench=$2
-		shift
-		shift
-		;;
-	x--bench=*)
-		bench=`echo $1 | sed -e 's/^--bench=//'`
-		shift
-		;;
-	x--trace)
-		trace=true
-		shift
-		;;
-	x-*)
-		loop=false
-		;;
-	x)
-		loop=false
-		;;
-	*)
-		gofiles="$gofiles $1"
-		shift
-		;;
-	esac
-done
-
-DIR=gotest$$
-rm -rf $DIR
-mkdir $DIR
-
-cd $DIR
-mkdir test
-cd test
-
-if test $keep = false; then
-  trap "cd ../..; rm -rf $DIR" 0 1 2 3 14 15
-else
-  trap "cd ../..; echo Keeping $DIR" 0 1 2 3 14 15
-fi
-
-case "$srcdir" in
-	/*)
-		;;
-	*)
-		srcdir="../../$srcdir"
-                ;;
-esac
-
-SRCDIR=$srcdir
-export SRCDIR
-
-case "$basedir" in
-	/*)
-		;;
-	*)
-		basedir="../../$basedir"
-                ;;
-esac
-
-# Link all the files/directories in srcdir into our working directory,
-# so that the tests do not have to refer to srcdir to find test data.
-ln -s $srcdir/* .
-
-# Some tests refer to a ../testdata directory.
-if test -e $srcdir/../testdata; then
-  rm -f ../testdata
-  abssrcdir=`cd $srcdir && pwd`
-  ln -s $abssrcdir/../testdata ../testdata
-fi
-
-# Copy the .go files because io/utils_test.go expects a regular file.
-case "x$gofiles" in
-x)
-	case "x$pkgfiles" in
-	x)
-		for f in `cd $srcdir; ls *.go`; do
-		    rm -f $f;
-		    cp $srcdir/$f .
-		done
-		;;
-	*)
-		for f in $pkgfiles; do
-		    if test -f $basedir/$f; then
-			b=`basename $f`
-			rm -f $b
-			cp $basedir/$f $b
-		    elif test -f ../../$f; then
-			b=`basename $f`
-			rm -f $b
-			cp ../../$f $b
-		    else
-			echo "file $f not found" 1>&2
-			exit 1
-		    fi
-		done
-		for f in `cd $srcdir; ls *_test.go`; do
-		    rm -f $f
-		    cp $srcdir/$f .
-		done
-		;;
-	esac
-	;;
-*)
-	for f in $gofiles; do
-	    b=`basename $f`
-	    rm -f $b
-	    cp $basedir/$f $b
-	done
-	case "x$pkgfiles" in
-	x)
-		for f in `cd $srcdir; ls *.go | grep -v *_test.go`; do
-		    rm -f $f
-		    cp $srcdir/$f .
-		done
-		;;
-	*)
-		for f in $pkgfiles; do
-		    if test -f $basedir/$f; then
-			b=`basename $f`
-			rm -f $b
-			cp $basedir/$f $b
-		    elif test -f ../../$f; then
-			b=`basename $f`
-			rm -f $b
-			cp ../../$f $b
-		    else
-			echo "file $f not found" 1>&2
-			exit 1
-		    fi
-		done
-		;;
-	esac
-	;;
-esac
-
-# Some tests expect the _obj directory created by the gc Makefiles.
-mkdir _obj
-
-# Some tests expect the _test directory created by the gc Makefiles.
-mkdir _test
-
-case "x$gofiles" in
-x)
-	for f in `ls *_test.go`; do
-	    tag1=`echo $f | sed -e 's/^.*_\([^_]*\)_test.go$/\1/'`
-	    tag2=`echo $f | sed -e 's/^.*_\([^_]*\)_[^_]*_test.go$/\1/'`
-	    if test x$tag1 = x$f; then
-		tag1=
-	    fi
-	    if test x$tag2 = x$f; then
-		tag2=
-	    fi
-
-	    case "$tag1" in
-	    "") ;;
-	    $goarch) ;;
-	    $goos) ;;
-	    android | darwin | dragonfly | freebsd | linux | nacl | netbsd | openbsd | plan9 | solaris | windows)
-		tag1=nonmatchingtag
-		;;
-	    386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | m68k | ppc64 | ppc64le | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | mipso32 | mipsn32 | mipsn64 | mipso64 | ppc | s390 | s390x | sparc | sparc64)
-		tag1=nonmatchingtag
-		;;
-	    esac
-
-	    case "$tag2" in
-	    "") ;;
-	    $goarch) ;;
-	    $goos) ;;
-	    android | darwin | dragonfly | freebsd | linux | nacl | netbsd | openbsd | plan9 | solaris | windows)
-		tag2=nonmatchingtag
-		;;
-	    386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | m68k | ppc64 | ppc64le | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | mipso32 | mipsn32 | mipsn64 | mipso64 | ppc | s390 | s390x | sparc | sparc64)
-		tag2=nonmatchingtag
-		;;
-	    esac
-
-	    if test x$tag1 != xnonmatchingtag -a x$tag2 != xnonmatchingtag; then
-		taglines=`sed '/^package /q' < $f | fgrep '// +build '`
-		if test "$taglines" = ""; then
-		    omatch=true
-		else
-		    omatch=false
-		fi
-		for tags in $taglines; do
-		    match=false
-		    for tag in $tags; do
-			reverse=false
-			case $tag in
-			"!"*)
-			    reverse=true
-			    tag=`echo $tag | sed -e 's/^!//'`
-			    ;;
-			esac
-
-			case $tag in
-			"//" | "+build")
-			    ;;
-			$goos | $goarch | cgo)
-			    match=true
-			    ;;
-			*,*)
-			    match=true
-			    for ctag in `echo $tag | sed -e 's/,/ /g'`; do
-				case $ctag in
-				$goos | $goarch | cgo)
-				    ;;
-				*)
-				    match=false
-				    ;;
-				esac
-			    done
-			    ;;
-			esac
-
-			if test "$reverse" = true; then
-			    if test "$match" = true; then
-				match=false
-			    else
-				match=true
-			    fi
-			fi
-		    done
-		    if test "$match" = "true"; then
-			omatch=true
-		    fi
-		done
-
-		if test "$omatch" = "true"; then
-		    gofiles="$gofiles $f"
-		fi
-	    fi
-	done
-	;;
-*)
-	xgofiles=$gofiles
-	gofiles=
-	for f in $xgofiles; do
-	    gofiles="$gofiles `basename $f`"
-	done
-esac
-
-case "x$gofiles" in
-x)
-	echo 'no test files found' 1>&2
-	exit 1
-	;;
-esac
-
-# Run any commands given in sources, like
-#   // gotest: $GC foo.go
-# to build any test-only dependencies.
-holdGC="$GC"
-GC="$GC -g -c -I ."
-sed -n 's/^\/\/ gotest: //p' $gofiles | sh
-GC="$holdGC"
-
-case "x$pkgfiles" in
-x)
-	pkgbasefiles=`ls *.go | grep -v _test.go 2>/dev/null`
-	;;
-*)
-	for f in $pkgfiles; do
-	    pkgbasefiles="$pkgbasefiles `basename $f`"
-	done
-	;;
-esac
-
-case "x$pkgfiles" in
-x)
-	echo 'no source files found' 1>&2
-	exit 1
-	;;
-esac
-
-# Split $gofiles into external gofiles (those in *_test packages)
-# and internal ones (those in the main package).
-xgofiles=
-for f in $gofiles; do
-    package=`grep '^package[ 	]' $f | sed 1q`
-    case "$package" in
-    *_test)
-	xgofiles="$xgofiles $f"
-	;;
-    *)
-	ngofiles="$ngofiles $f"
-	;;
-    esac
-done
-gofiles=$ngofiles
-
-# External $O file
-xofile=""
-havex=false
-if [ "x$xgofiles" != "x" ]; then
-	xofile="_xtest_.o"
-	havex=true
-fi
-
-testmain=
-if $havex && fgrep 'func TestMain(' $xgofiles >/dev/null 2>&1; then
-  package=`grep '^package[ 	]' $xgofiles | sed 1q | sed -e 's/.* //'`
-  testmain="${package}.TestMain"
-elif test -n "$gofiles" && fgrep 'func TestMain(' $gofiles >/dev/null 2>&1; then
-  package=`grep '^package[ 	]' $gofiles | sed 1q | sed -e 's/.* //'`
-  testmain="${package}.TestMain"
-fi
-
-set -e
-
-package=`echo ${srcdir} | sed -e 's|^.*libgo/go/||'`
-
-pkgpatharg=
-xpkgpatharg=
-prefixarg=
-if test -n "$pkgpath"; then
-	pkgpatharg="-fgo-pkgpath=$pkgpath"
-	xpkgpatharg="-fgo-pkgpath=${pkgpath}_test"
-elif test -n "$prefix"; then
-	prefixarg="-fgo-prefix=$prefix"
-fi
-
-if test "$trace" = "true"; then
-  echo $GC -g $pkgpatharg $prefixarg -c -I . -fno-toplevel-reorder -o _gotest_.o $gofiles $pkgbasefiles
-fi
-$GC -g $pkgpatharg $prefixarg -c -I . -fno-toplevel-reorder -o _gotest_.o $gofiles $pkgbasefiles
-
-if $havex; then
-	mkdir -p `dirname $package`
-	cp _gotest_.o `dirname $package`/lib`basename $package`.a
-	if test "$trace" = "true"; then
-	    echo $GC -g $xpkgpatharg -c -I . -fno-toplevel-reorder -o $xofile $xgofiles
-	fi
-	$GC -g $xpkgpatharg -c -I . -fno-toplevel-reorder -o $xofile $xgofiles
-fi
-
-# They all compile; now generate the code to call them.
-
-testname() {
-	# Remove the package from the name used with the -test option.
-	echo $1 | sed 's/^.*\.//'
-}
-
-localname() {
-	# The package main has been renamed to __main__ when imported.
-	# Adjust its uses.
-	echo $1 | sed 's/^main\./__main__./'
-}
-
-{
-	text="T"
-	case "$goarch" in
-	ppc64*) text="[TD]" ;;
-	esac
-
-	symtogo='sed -e s/_test/XXXtest/ -e s/.*_\([^_]*\.\)/\1/ -e s/XXXtest/_test/'
-
-	# test functions are named TestFoo
-	# the grep -v eliminates methods and other special names
-	# that have multiple dots.
-	pattern='Test([^a-z].*)?'
-	# The -p option tells GNU nm not to sort.
-	# The -v option tells Solaris nm to sort by value.
-	tests=$($NM -p -v _gotest_.o $xofile | egrep " $text .*\."$pattern'$' | grep -v '\..*\..*\.' | fgrep -v '$' | fgrep -v ' __go_' | sed 's/.* //' | $symtogo)
-	if [ "x$tests" = x ]; then
-		echo 'gotest: warning: no tests matching '$pattern in _gotest_.o $xofile 1>&2
-		exit 2
-	fi
-	# benchmarks are named BenchmarkFoo.
-	pattern='Benchmark([^a-z].*)?'
-	benchmarks=$($NM -p -v _gotest_.o $xofile | egrep " $text .*\."$pattern'$' | grep -v '\..*\..*\.' | fgrep -v '$' | fgrep -v ' __go_' | sed 's/.* //' | $symtogo)
-
-	# examples are named ExampleFoo
-	pattern='Example([^a-z].*)?'
-	examples=$($NM -p -v _gotest_.o $xofile | egrep " $text .*\."$pattern'$' | grep -v '\..*\..*\.' | fgrep -v '$' | fgrep -v ' __go_' | sed 's/.* //' | $symtogo)
-
-	# package spec
-	echo 'package main'
-	echo
-	# imports
-	if echo "$tests" | egrep -v '_test\.' >/dev/null; then
-		echo 'import "./_gotest_"'
-	fi
-	if $havex; then
-		echo 'import "./_xtest_"'
-	fi
-	echo 'import "testing"'
-	echo 'import __regexp__ "regexp"' # rename in case tested package is called regexp
-	if ! test -n "$testmain"; then
-		echo 'import __os__ "os"'
-	fi
-	# test array
-	echo
-	echo 'var tests = []testing.InternalTest {'
-	for i in $tests
-	do
-		n=$(testname $i)
-		if test "$n" != "TestMain"; then
-			j=$(localname $i)
-			echo '	{"'$n'", '$j'},'
-		fi
-	done
-	echo '}'
-
-	# benchmark array
-	# The comment makes the multiline declaration
-	# gofmt-safe even when there are no benchmarks.
-	echo 'var benchmarks = []testing.InternalBenchmark{ //'
-	for i in $benchmarks
-	do
-		n=$(testname $i)
-		j=$(localname $i)
-		echo '	{"'$n'", '$j'},'
-	done
-	echo '}'
-
-	# examples array
-	echo 'var examples = []testing.InternalExample{ //'
-	# This doesn't work because we don't pick up the output.
-	#for i in $examples
-	#do
-	#	n=$(testname $i)
-	#	j=$(localname $i)
-	#	echo '	{"'$n'", '$j', ""},'
-	#done
-	echo '}'
-
-	# body
-	echo \
-'
-var matchPat string
-var matchRe *__regexp__.Regexp
-
-func matchString(pat, str string) (result bool, err error) {
-	if matchRe == nil || matchPat != pat {
-		matchPat = pat
-		matchRe, err = __regexp__.Compile(matchPat)
-		if err != nil {
-			return
-		}
-	}
-	return matchRe.MatchString(str), nil
-}
-
-func main() {
-	m := testing.MainStart(matchString, tests, benchmarks, examples)
-'
-	if test -n "$testmain"; then
-		echo "	${testmain}(m)"
-	else
-		echo '	__os__.Exit(m.Run())'
-	fi
-
-	echo '}'
-}>_testmain.go
-
-case "x$dejagnu" in
-xno)
-	if test "$trace" = "true"; then
-	    echo ${GC} -g -c _testmain.go
-	fi
-	${GC} -g -c _testmain.go
-
-	if test "$trace" = "true"; then
-	    echo ${GL} *.o ${GOLIBS}
-	fi
-	${GL} *.o ${GOLIBS}
-
-	set +e
-	if test "$bench" = ""; then
-		if test "$trace" = "true"; then
-		    echo ./a.out -test.short -test.timeout=${timeout}s "$@"
-		fi
-		./a.out -test.short -test.timeout=${timeout}s "$@" &
-		pid=$!
-		(sleep `expr $timeout + 10`
-		    echo > gotest-timeout
-		    echo "timed out in gotest" 1>&2
-		    kill -9 $pid) &
-		alarmpid=$!
-		wait $pid
-		status=$?
-		if ! test -f gotest-timeout; then
-		    sleeppid=`ps -o pid,ppid,cmd | grep " $alarmpid " | grep sleep | sed -e 's/ *\([0-9]*\) .*$/\1/'`
-		    kill $alarmpid
-		    wait $alarmpid
-		    if test "$sleeppid" != ""; then
-			kill $sleeppid
-		    fi
-		fi
-	else
-		if test "$trace" = "true"; then
-		    echo ./a.out -test.run=^\$ -test.bench="${bench}" "$@"
-		fi
-		./a.out -test.run=^\$ -test.bench="${bench}" "$@"
-		status=$?
-	fi
-	exit $status
-	;;
-xyes)
-	rm -rf ../../testsuite/*.o
-	files=`echo *`
-	for f in $files; do
-		if test "$f" = "_obj" || test "$f" = "_test"; then
-			continue
-		fi
-		rm -rf ../../testsuite/$f
-		if test -f $f; then
-			cp $f ../../testsuite/
-		else
-			ln -s ../$DIR/test/$f ../../testsuite/
-		fi
-	done
-	cd ../../testsuite
-	rm -rf _obj _test
-	mkdir _obj _test
-	if test "$testname" != ""; then
-	    GOTESTNAME="$testname"
-	    export GOTESTNAME
-	fi
-	$MAKE check RUNTESTFLAGS="$RUNTESTFLAGS GOTEST_TMPDIR=$DIR/test"
-	# Useful when using make check-target-libgo
-	cat libgo.log >> libgo-all.log
-	cat libgo.sum >> libgo-all.sum
-	rm -rf $files
-	;;
-esac
diff --git a/third_party/gofrontend/ltmain.sh b/third_party/gofrontend/ltmain.sh
deleted file mode 100644
index 9503ec8..0000000
--- a/third_party/gofrontend/ltmain.sh
+++ /dev/null
@@ -1,8636 +0,0 @@
-# Generated from ltmain.m4sh.
-
-# libtool (GNU libtool 1.3134 2009-11-29) 2.2.7a
-# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009 Free Software Foundation, Inc.
-# This is free software; see the source for copying conditions.  There is NO
-# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-# GNU Libtool is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#       --config             show all configuration variables
-#       --debug              enable verbose shell tracing
-#   -n, --dry-run            display commands without modifying any files
-#       --features           display basic configuration information and exit
-#       --mode=MODE          use operation mode MODE
-#       --no-finish          let install mode avoid finish commands
-#       --preserve-dup-deps  don't remove duplicate dependency libraries
-#       --quiet, --silent    don't print informational messages
-#       --no-quiet, --no-silent
-#                            print informational messages (default)
-#       --tag=TAG            use configuration variables from tag TAG
-#   -v, --verbose            print more informational messages than default
-#       --no-verbose         don't print the extra informational messages
-#       --version            print version information
-#   -h, --help, --help-all   print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-#         clean              remove files from the build directory
-#         compile            compile a source file into a libtool object
-#         execute            automatically set library path, then run a program
-#         finish             complete the installation of libtool libraries
-#         install            install libraries or executables
-#         link               create a library or an executable
-#         uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.  When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#         host-triplet:	$host
-#         shell:		$SHELL
-#         compiler:		$LTCC
-#         compiler flags:		$LTCFLAGS
-#         linker:		$LD (gnu? $with_gnu_ld)
-#         $progname:	(GNU libtool 1.3134 2009-11-29) 2.2.7a
-#         automake:	$automake_version
-#         autoconf:	$autoconf_version
-#
-# Report bugs to <bug-libtool@gnu.org>.
-
-PROGRAM=libtool
-PACKAGE=libtool
-VERSION=2.2.7a
-TIMESTAMP=" 1.3134 2009-11-29"
-package_revision=1.3134
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
-
-# NLS nuisances: We save the old values to restore during execute mode.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-	  export $lt_var
-	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
-	fi"
-done
-
-$lt_unset CDPATH
-
-
-
-
-
-
-
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
-
-
-
-: ${CP="cp -f"}
-: ${ECHO=$as_echo}
-: ${EGREP="/bin/grep -E"}
-: ${FGREP="/bin/grep -F"}
-: ${GREP="/bin/grep"}
-: ${LN_S="ln -s"}
-: ${MAKE="make"}
-: ${MKDIR="mkdir"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-: ${SED="/mount/endor/wildenhu/local-x86_64/bin/sed"}
-: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
-
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-  func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-}
-
-# Generated shell functions inserted here.
-
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
-		s@/\./@/@g
-		t dotsl
-		s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
-
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-#             value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
-  # Start from root dir and reassemble the path.
-  func_normal_abspath_result=
-  func_normal_abspath_tpath=$1
-  func_normal_abspath_altnamespace=
-  case $func_normal_abspath_tpath in
-    "")
-      # Empty path, that just means $cwd.
-      func_stripname '' '/' "`pwd`"
-      func_normal_abspath_result=$func_stripname_result
-      return
-    ;;
-    # The next three entries are used to spot a run of precisely
-    # two leading slashes without using negated character classes;
-    # we take advantage of case's first-match behaviour.
-    ///*)
-      # Unusual form of absolute path, do nothing.
-    ;;
-    //*)
-      # Not necessarily an ordinary path; POSIX reserves leading '//'
-      # and for example Cygwin uses it to access remote file shares
-      # over CIFS/SMB, so we conserve a leading double slash if found.
-      func_normal_abspath_altnamespace=/
-    ;;
-    /*)
-      # Absolute path, do nothing.
-    ;;
-    *)
-      # Relative path, prepend $cwd.
-      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
-    ;;
-  esac
-  # Cancel out all the simple stuff to save iterations.  We also want
-  # the path to end with a slash for ease of parsing, so make sure
-  # there is one (and only one) here.
-  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
-  while :; do
-    # Processed it all yet?
-    if test "$func_normal_abspath_tpath" = / ; then
-      # If we ascended to the root using ".." the result may be empty now.
-      if test -z "$func_normal_abspath_result" ; then
-        func_normal_abspath_result=/
-      fi
-      break
-    fi
-    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcar"`
-    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcdr"`
-    # Figure out what to do with it
-    case $func_normal_abspath_tcomponent in
-      "")
-        # Trailing empty path component, ignore it.
-      ;;
-      ..)
-        # Parent dir; strip last assembled component from result.
-        func_dirname "$func_normal_abspath_result"
-        func_normal_abspath_result=$func_dirname_result
-      ;;
-      *)
-        # Actual path component, append it.
-        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
-      ;;
-    esac
-  done
-  # Restore leading double-slash if one was found on entry.
-  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
-
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-#             value returned in "$func_relative_path_result"
-func_relative_path ()
-{
-  func_relative_path_result=
-  func_normal_abspath "$1"
-  func_relative_path_tlibdir=$func_normal_abspath_result
-  func_normal_abspath "$2"
-  func_relative_path_tbindir=$func_normal_abspath_result
-
-  # Ascend the tree starting from libdir
-  while :; do
-    # check if we have found a prefix of bindir
-    case $func_relative_path_tbindir in
-      $func_relative_path_tlibdir)
-        # found an exact match
-        func_relative_path_tcancelled=
-        break
-        ;;
-      $func_relative_path_tlibdir*)
-        # found a matching prefix
-        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
-        func_relative_path_tcancelled=$func_stripname_result
-        if test -z "$func_relative_path_result"; then
-          func_relative_path_result=.
-        fi
-        break
-        ;;
-      *)
-        func_dirname $func_relative_path_tlibdir
-        func_relative_path_tlibdir=${func_dirname_result}
-        if test "x$func_relative_path_tlibdir" = x ; then
-          # Have to descend all the way to the root!
-          func_relative_path_result=../$func_relative_path_result
-          func_relative_path_tcancelled=$func_relative_path_tbindir
-          break
-        fi
-        func_relative_path_result=../$func_relative_path_result
-        ;;
-    esac
-  done
-
-  # Now calculate path; take care to avoid doubling-up slashes.
-  func_stripname '' '/' "$func_relative_path_result"
-  func_relative_path_result=$func_stripname_result
-  func_stripname '/' '/' "$func_relative_path_tcancelled"
-  if test "x$func_stripname_result" != x ; then
-    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
-  fi
-
-  # Normalisation. If bindir is libdir, return empty string,
-  # else relative path ending with a slash; either way, target
-  # file name can be directly appended.
-  if test ! -z "$func_relative_path_result"; then
-    func_stripname './' '' "$func_relative_path_result/"
-    func_relative_path_result=$func_stripname_result
-  fi
-}
-
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
-
-# Make sure we have an absolute path for reexecution:
-case $progpath in
-  [\\/]*|[A-Za-z]:\\*) ;;
-  *[\\/]*)
-     progdir=$func_dirname_result
-     progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
-     ;;
-  *)
-     save_IFS="$IFS"
-     IFS=:
-     for progdir in $PATH; do
-       IFS="$save_IFS"
-       test -x "$progdir/$progname" && break
-     done
-     IFS="$save_IFS"
-     test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
-     ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
-
-# Standard options:
-opt_dry_run=false
-opt_help=false
-opt_quiet=false
-opt_verbose=false
-opt_warning=:
-
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname${mode+: }$mode: $*"
-}
-
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
-
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*"
-}
-
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
-}
-
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
-
-    # bash bug again:
-    :
-}
-
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
-{
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
-
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
-}
-help="Try \`$progname --help' for more information."  ## default
-
-
-# func_grep expression filename
-# Check whether EXPRESSION matches any line of FILENAME, without output.
-func_grep ()
-{
-    $GREP "$1" "$2" >/dev/null 2>&1
-}
-
-
-# func_mkdir_p directory-path
-# Make sure the entire path to DIRECTORY-PATH is available.
-func_mkdir_p ()
-{
-    my_directory_path="$1"
-    my_dir_list=
-
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
-
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
-      esac
-
-      # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
-        # ...make a list in topmost first order.  Use a colon delimited
-	# list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
-
-        # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
-
-        # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
-      done
-      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
-
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-	IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
-        # try to create one of the directories concurrently.  Don't
-        # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
-      done
-      IFS="$save_mkdir_p_IFS"
-
-      # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
-    fi
-}
-
-
-# func_mktempdir [string]
-# Make a temporary directory that won't clash with other running
-# libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
-func_mktempdir ()
-{
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
-
-    if test "$opt_dry_run" = ":"; then
-      # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
-    else
-
-      # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
-
-      if test ! -d "$my_tmpdir"; then
-        # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
-
-        save_mktempdir_umask=`umask`
-        umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
-      fi
-
-      # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
-    fi
-
-    $ECHO "$my_tmpdir"
-}
-
-
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
-{
-    case $1 in
-      *[\\\`\"\$]*)
-	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
-
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and and variable
-      # expansion for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
-        ;;
-      *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
-    esac
-}
-
-
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
-{
-    case $1 in
-      *[\\\`\"]*)
-	my_arg=`$ECHO "$1" | $SED \
-	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        my_arg="$1" ;;
-    esac
-
-    case $my_arg in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting and command substitution for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        my_arg="\"$my_arg\""
-        ;;
-    esac
-
-    func_quote_for_expand_result="$my_arg"
-}
-
-
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-	    $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-
-
-
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
-    $SED -n '/(C)/!b go
-	:more
-	/\./!{
-	  N
-	  s/\n# //
-	  b more
-	}
-	:go
-	/^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-	s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
-}
-
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
-{
-    $SED -n '/^# Usage:/,/^#  *-h/ {
-        s/^# //
-	s/^# *$//
-	s/\$progname/'$progname'/
-	p
-    }' < "$progpath"
-    echo
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
-}
-
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
-func_help ()
-{
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-        s/^# //
-	s/^# *$//
-	s*\$progname*'$progname'*
-	s*\$host*'"$host"'*
-	s*\$SHELL*'"$SHELL"'*
-	s*\$LTCC*'"$LTCC"'*
-	s*\$LTCFLAGS*'"$LTCFLAGS"'*
-	s*\$LD*'"$LD"'*
-	s/\$with_gnu_ld/'"$with_gnu_ld"'/
-	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
-	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
-	p
-     }' < "$progpath"
-    ret=$?
-    if test -z "$1"; then
-      exit $ret
-    fi
-}
-
-# func_missing_arg argname
-# Echo program name prefixed message to standard error and set global
-# exit_cmd.
-func_missing_arg ()
-{
-    func_error "missing argument for $1"
-    exit_cmd=exit
-}
-
-exit_cmd=:
-
-
-
-
-
-
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
-
-# Global variables.
-# $mode is unset
-nonopt=
-execute_dlfiles=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
-
-opt_dry_run=false
-opt_finish=:
-opt_duplicate_deps=false
-opt_silent=false
-opt_debug=:
-
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-
-# func_fatal_configuration arg...
-# Echo program name prefixed message to standard error, followed by
-# a configuration failure hint, and exit.
-func_fatal_configuration ()
-{
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
-}
-
-
-# func_config
-# Display the configuration for all the tags in this script.
-func_config ()
-{
-    re_begincf='^# ### BEGIN LIBTOOL'
-    re_endcf='^# ### END LIBTOOL'
-
-    # Default configuration.
-    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
-
-    # Now print the configurations for the tags.
-    for tagname in $taglist; do
-      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
-    done
-
-    exit $?
-}
-
-# func_features
-# Display the features supported by this script.
-func_features ()
-{
-    echo "host: $host"
-    if test "$build_libtool_libs" = yes; then
-      echo "enable shared libraries"
-    else
-      echo "disable shared libraries"
-    fi
-    if test "$build_old_libs" = yes; then
-      echo "enable static libraries"
-    else
-      echo "disable static libraries"
-    fi
-
-    exit $?
-}
-
-# func_enable_tag tagname
-# Verify that TAGNAME is valid, and either flag an error and exit, or
-# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
-# variable here.
-func_enable_tag ()
-{
-  # Global variable:
-  tagname="$1"
-
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
-
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
-
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
-    *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-	taglist="$taglist $tagname"
-
-	# Evaluate the configuration.  Be careful to quote the path
-	# and the sed script, to avoid splitting on whitespace, but
-	# also don't use non-portable quotes within backquotes within
-	# quotes we have to do it in 2 steps:
-	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-	eval "$extractedcf"
-      else
-	func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
-}
-
-# Parse options once, thoroughly.  This comes as soon as possible in
-# the script to make things like `libtool --version' happen quickly.
-{
-
-  # Shorthand for --mode=foo, only valid as the first argument
-  case $1 in
-  clean|clea|cle|cl)
-    shift; set dummy --mode clean ${1+"$@"}; shift
-    ;;
-  compile|compil|compi|comp|com|co|c)
-    shift; set dummy --mode compile ${1+"$@"}; shift
-    ;;
-  execute|execut|execu|exec|exe|ex|e)
-    shift; set dummy --mode execute ${1+"$@"}; shift
-    ;;
-  finish|finis|fini|fin|fi|f)
-    shift; set dummy --mode finish ${1+"$@"}; shift
-    ;;
-  install|instal|insta|inst|ins|in|i)
-    shift; set dummy --mode install ${1+"$@"}; shift
-    ;;
-  link|lin|li|l)
-    shift; set dummy --mode link ${1+"$@"}; shift
-    ;;
-  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-    shift; set dummy --mode uninstall ${1+"$@"}; shift
-    ;;
-  esac
-
-  # Parse non-mode specific arguments:
-  while test "$#" -gt 0; do
-    opt="$1"
-    shift
-
-    case $opt in
-      --config)		func_config					;;
-
-      --debug)		preserve_args="$preserve_args $opt"
-			func_echo "enabling shell trace mode"
-			opt_debug='set -x'
-			$opt_debug
-			;;
-
-      -dlopen)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			execute_dlfiles="$execute_dlfiles $1"
-			shift
-			;;
-
-      --dry-run | -n)	opt_dry_run=:					;;
-      --features)       func_features					;;
-      --finish)		mode="finish"					;;
-      --no-finish)	opt_finish=false				;;
-
-      --mode)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			case $1 in
-			  # Valid mode arguments:
-			  clean)	;;
-			  compile)	;;
-			  execute)	;;
-			  finish)	;;
-			  install)	;;
-			  link)		;;
-			  relink)	;;
-			  uninstall)	;;
-
-			  # Catch anything else as an error
-			  *) func_error "invalid argument for $opt"
-			     exit_cmd=exit
-			     break
-			     ;;
-		        esac
-
-			mode="$1"
-			shift
-			;;
-
-      --preserve-dup-deps)
-			opt_duplicate_deps=:				;;
-
-      --quiet|--silent)	preserve_args="$preserve_args $opt"
-			opt_silent=:
-			opt_verbose=false
-			;;
-
-      --no-quiet|--no-silent)
-			preserve_args="$preserve_args $opt"
-			opt_silent=false
-			;;
-
-      --verbose| -v)	preserve_args="$preserve_args $opt"
-			opt_silent=false
-			opt_verbose=:
-			;;
-
-      --no-verbose)	preserve_args="$preserve_args $opt"
-			opt_verbose=false
-			;;
-
-      --tag)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			preserve_args="$preserve_args $opt $1"
-			func_enable_tag "$1"	# tagname is set here
-			shift
-			;;
-
-      # Separate optargs to long options:
-      -dlopen=*|--mode=*|--tag=*)
-			func_opt_split "$opt"
-			set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
-			shift
-			;;
-
-      -\?|-h)		func_usage					;;
-      --help)		opt_help=:					;;
-      --help-all)	opt_help=': help-all'				;;
-      --version)	func_version					;;
-
-      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
-
-      *)		nonopt="$opt"
-			break
-			;;
-    esac
-  done
-
-
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* )
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
-      ;;
-  esac
-
-  # Having warned about all mis-specified options, bail out if
-  # anything was wrong.
-  $exit_cmd $EXIT_FAILURE
-}
-
-# func_check_version_match
-# Ensure that we are using m4 macros, and libtool script from the same
-# release of libtool.
-func_check_version_match ()
-{
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from an older release.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      else
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
-$progname: but the definition of this LT_INIT comes from revision $macro_revision.
-$progname: You should recreate aclocal.m4 with macros from revision $package_revision
-$progname: of $PACKAGE $VERSION and run autoconf again.
-_LT_EOF
-    fi
-
-    exit $EXIT_MISMATCH
-  fi
-}
-
-
-## ----------- ##
-##    Main.    ##
-## ----------- ##
-
-$opt_help || {
-  # Sanity checks first:
-  func_check_version_match
-
-  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-    func_fatal_configuration "not configured to build any kind of library"
-  fi
-
-  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
-
-
-  # Darwin sucks
-  eval "std_shrext=\"$shrext_cmds\""
-
-
-  # Only execute mode is allowed to have -dlopen flags.
-  if test -n "$execute_dlfiles" && test "$mode" != execute; then
-    func_error "unrecognized option \`-dlopen'"
-    $ECHO "$help" 1>&2
-    exit $EXIT_FAILURE
-  fi
-
-  # Change the help message to a mode-specific one.
-  generic_help="$help"
-  help="Try \`$progname --help --mode=$mode' for more information."
-}
-
-
-# func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_lalib_p ()
-{
-    test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
-}
-
-# func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function implements the same check as func_lalib_p without
-# resorting to external programs.  To this end, it redirects stdin and
-# closes it afterwards, without saving the original file descriptor.
-# As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
-func_lalib_unsafe_p ()
-{
-    lalib_p=no
-    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
-	for lalib_p_l in 1 2 3 4
-	do
-	    read lalib_p_line
-	    case "$lalib_p_line" in
-		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
-	    esac
-	done
-	exec 0<&5 5<&-
-    fi
-    test "$lalib_p" = yes
-}
-
-# func_ltwrapper_script_p file
-# True iff FILE is a libtool wrapper script
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_script_p ()
-{
-    func_lalib_p "$1"
-}
-
-# func_ltwrapper_executable_p file
-# True iff FILE is a libtool wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_executable_p ()
-{
-    func_ltwrapper_exec_suffix=
-    case $1 in
-    *.exe) ;;
-    *) func_ltwrapper_exec_suffix=.exe ;;
-    esac
-    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
-}
-
-# func_ltwrapper_scriptname file
-# Assumes file is an ltwrapper_executable
-# uses $file to determine the appropriate filename for a
-# temporary ltwrapper_script.
-func_ltwrapper_scriptname ()
-{
-    func_ltwrapper_scriptname_result=""
-    if func_ltwrapper_executable_p "$1"; then
-	func_dirname_and_basename "$1" "" "."
-	func_stripname '' '.exe' "$func_basename_result"
-	func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
-    fi
-}
-
-# func_ltwrapper_p file
-# True iff FILE is a libtool wrapper script or wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_p ()
-{
-    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
-}
-
-
-# func_execute_cmds commands fail_cmd
-# Execute tilde-delimited COMMANDS.
-# If FAIL_CMD is given, eval that upon failure.
-# FAIL_CMD may read-access the current command in variable CMD!
-func_execute_cmds ()
-{
-    $opt_debug
-    save_ifs=$IFS; IFS='~'
-    for cmd in $1; do
-      IFS=$save_ifs
-      eval "cmd=\"$cmd\""
-      func_show_eval "$cmd" "${2-:}"
-    done
-    IFS=$save_ifs
-}
-
-
-# func_source file
-# Source FILE, adding directory component if necessary.
-# Note that it is not necessary on cygwin/mingw to append a dot to
-# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
-# behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
-func_source ()
-{
-    $opt_debug
-    case $1 in
-    */* | *\\*)	. "$1" ;;
-    *)		. "./$1" ;;
-    esac
-}
-
-
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
-{
-    $opt_debug
-    if test -n "$available_tags" && test -z "$tagname"; then
-      CC_quoted=
-      for arg in $CC; do
-        func_quote_for_eval "$arg"
-	CC_quoted="$CC_quoted $func_quote_for_eval_result"
-      done
-      CC_expanded=`func_echo_all $CC`
-      CC_quoted_expanded=`func_echo_all $CC_quoted`
-      case $@ in
-      # Blanks in the command may have been stripped by the calling shell,
-      # but not from the CC environment variable when configure was run.
-      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
-      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
-      # Blanks at the start of $base_compile will cause this to fail
-      # if we don't check for them as well.
-      *)
-	for z in $available_tags; do
-	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
-	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
-	    CC_quoted=
-	    for arg in $CC; do
-	      # Double-quote args containing other shell metacharacters.
-	      func_quote_for_eval "$arg"
-	      CC_quoted="$CC_quoted $func_quote_for_eval_result"
-	    done
-	    CC_expanded=`func_echo_all $CC`
-	    CC_quoted_expanded=`func_echo_all $CC_quoted`
-	    case "$@ " in
-	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
-	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
-	      # The compiler in the base compile command matches
-	      # the one in the tagged configuration.
-	      # Assume this is the tagged configuration we want.
-	      tagname=$z
-	      break
-	      ;;
-	    esac
-	  fi
-	done
-	# If $tagname still isn't set, then no tagged configuration
-	# was found and let the user know that the "--tag" command
-	# line option must be used.
-	if test -z "$tagname"; then
-	  func_echo "unable to infer tagged configuration"
-	  func_fatal_error "specify a tag with \`--tag'"
-#	else
-#	  func_verbose "using $tagname tagged configuration"
-	fi
-	;;
-      esac
-    fi
-}
-
-
-
-# func_write_libtool_object output_name pic_name nonpic_name
-# Create a libtool object file (analogous to a ".la" file),
-# but don't create it if we're doing a dry run.
-func_write_libtool_object ()
-{
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
-    else
-      write_lobj=none
-    fi
-
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
-    else
-      write_oldobj=none
-    fi
-
-    $opt_dry_run || {
-      cat >${write_libobj}T <<EOF
-# $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-pic_object=$write_lobj
-
-# Name of the non-PIC object
-non_pic_object=$write_oldobj
-
-EOF
-      $MV "${write_libobj}T" "${write_libobj}"
-    }
-}
-
-# func_mode_compile arg...
-func_mode_compile ()
-{
-    $opt_debug
-    # Get the compilation command and the source file.
-    base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
-    suppress_opt=yes
-    suppress_output=
-    arg_mode=normal
-    libobj=
-    later=
-    pie_flag=
-
-    for arg
-    do
-      case $arg_mode in
-      arg  )
-	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
-	arg_mode=normal
-	;;
-
-      target )
-	libobj="$arg"
-	arg_mode=normal
-	continue
-	;;
-
-      normal )
-	# Accept any command-line options.
-	case $arg in
-	-o)
-	  test -n "$libobj" && \
-	    func_fatal_error "you cannot specify \`-o' more than once"
-	  arg_mode=target
-	  continue
-	  ;;
-
-	-pie | -fpie | -fPIE)
-          pie_flag="$pie_flag $arg"
-	  continue
-	  ;;
-
-	-shared | -static | -prefer-pic | -prefer-non-pic)
-	  later="$later $arg"
-	  continue
-	  ;;
-
-	-no-suppress)
-	  suppress_opt=no
-	  continue
-	  ;;
-
-	-Xcompiler)
-	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
-	  continue      #  The current "srcfile" will either be retained or
-	  ;;            #  replaced later.  I would guess that would be a bug.
-
-	-Wc,*)
-	  func_stripname '-Wc,' '' "$arg"
-	  args=$func_stripname_result
-	  lastarg=
-	  save_ifs="$IFS"; IFS=','
-	  for arg in $args; do
-	    IFS="$save_ifs"
-	    func_quote_for_eval "$arg"
-	    lastarg="$lastarg $func_quote_for_eval_result"
-	  done
-	  IFS="$save_ifs"
-	  func_stripname ' ' '' "$lastarg"
-	  lastarg=$func_stripname_result
-
-	  # Add the arguments to base_compile.
-	  base_compile="$base_compile $lastarg"
-	  continue
-	  ;;
-
-	*)
-	  # Accept the current argument as the source file.
-	  # The previous "srcfile" becomes the current argument.
-	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
-	  ;;
-	esac  #  case $arg
-	;;
-      esac    #  case $arg_mode
-
-      # Aesthetically quote the previous argument.
-      func_quote_for_eval "$lastarg"
-      base_compile="$base_compile $func_quote_for_eval_result"
-    done # for arg
-
-    case $arg_mode in
-    arg)
-      func_fatal_error "you must specify an argument for -Xcompile"
-      ;;
-    target)
-      func_fatal_error "you must specify a target with \`-o'"
-      ;;
-    *)
-      # Get the name of the library object.
-      test -z "$libobj" && {
-	func_basename "$srcfile"
-	libobj="$func_basename_result"
-      }
-      ;;
-    esac
-
-    # Recognize several different file suffixes.
-    # If the user specifies -o file.o, it is replaced with file.lo
-    case $libobj in
-    *.[cCFSifmso] | \
-    *.ada | *.adb | *.ads | *.asm | \
-    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
-    *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup)
-      func_xform "$libobj"
-      libobj=$func_xform_result
-      ;;
-    esac
-
-    case $libobj in
-    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
-    *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
-      ;;
-    esac
-
-    func_infer_tag $base_compile
-
-    for arg in $later; do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	continue
-	;;
-
-      -static)
-	build_libtool_libs=no
-	build_old_libs=yes
-	continue
-	;;
-
-      -prefer-pic)
-	pic_mode=yes
-	continue
-	;;
-
-      -prefer-non-pic)
-	pic_mode=no
-	continue
-	;;
-      esac
-    done
-
-    func_quote_for_eval "$libobj"
-    test "X$libobj" != "X$func_quote_for_eval_result" \
-      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
-    func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
-
-    test -z "$base_compile" && \
-      func_fatal_help "you must specify a compilation command"
-
-    # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
-      removelist="$obj $lobj $libobj ${libobj}T"
-    else
-      removelist="$lobj $libobj ${libobj}T"
-    fi
-
-    # On Cygwin there's no "real" PIC flag so we must build both object types
-    case $host_os in
-    cygwin* | mingw* | pw32* | os2* | cegcc*)
-      pic_mode=default
-      ;;
-    esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
-      # non-PIC code in shared libraries is not supported
-      pic_mode=default
-    fi
-
-    # Calculate the filename of the output object if compiler does
-    # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
-    else
-      output_obj=
-      need_locks=no
-      lockfile=
-    fi
-
-    # Lock this critical section if it is needed
-    # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    elif test "$need_locks" = warn; then
-      if test -f "$lockfile"; then
-	$ECHO "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-      removelist="$removelist $output_obj"
-      $ECHO "$srcfile" > "$lockfile"
-    fi
-
-    $opt_dry_run || $RM $removelist
-    removelist="$removelist $lockfile"
-    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
-
-    if test -n "$fix_srcfile_path"; then
-      eval "srcfile=\"$fix_srcfile_path\""
-    fi
-    func_quote_for_eval "$srcfile"
-    qsrcfile=$func_quote_for_eval_result
-
-    # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
-      # Without this assignment, base_compile gets emptied.
-      fbsd_hideous_sh_bug=$base_compile
-
-      if test "$pic_mode" != no; then
-	command="$base_compile $qsrcfile $pic_flag"
-      else
-	# Don't build PIC code
-	command="$base_compile $qsrcfile"
-      fi
-
-      func_mkdir_p "$xdir$objdir"
-
-      if test -z "$output_obj"; then
-	# Place PIC objects in $objdir
-	command="$command -o $lobj"
-      fi
-
-      func_show_eval_locale "$command"	\
-          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed, then go on to compile the next one
-      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
-	func_show_eval '$MV "$output_obj" "$lobj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-
-      # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
-	suppress_output=' >/dev/null 2>&1'
-      fi
-    fi
-
-    # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
-	# Don't build PIC code
-	command="$base_compile $qsrcfile$pie_flag"
-      else
-	command="$base_compile $qsrcfile $pic_flag"
-      fi
-      if test "$compiler_c_o" = yes; then
-	command="$command -o $obj"
-      fi
-
-      # Suppress compiler output if we already did a PIC compilation.
-      command="$command$suppress_output"
-      func_show_eval_locale "$command" \
-        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed
-      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
-	func_show_eval '$MV "$output_obj" "$obj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-    fi
-
-    $opt_dry_run || {
-      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
-
-      # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
-	removelist=$lockfile
-        $RM "$lockfile"
-      fi
-    }
-
-    exit $EXIT_SUCCESS
-}
-
-$opt_help || {
-  test "$mode" = compile && func_mode_compile ${1+"$@"}
-}
-
-func_mode_help ()
-{
-    # We need to display help for each of the modes.
-    case $mode in
-      "")
-        # Generic help is extracted from the usage comments
-        # at the start of this file.
-        func_help
-        ;;
-
-      clean)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      compile)
-      $ECHO \
-"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
-  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
-  -no-suppress      do not suppress compiler output for multiple passes
-  -prefer-pic       try to building PIC objects only
-  -prefer-non-pic   try to building non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
-  -Wc,FLAG          pass FLAG directly to the compiler
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
-        ;;
-
-      execute)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
-  -dlopen FILE      add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
-        ;;
-
-      finish)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
-        ;;
-
-      install)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
-
-The following components of INSTALL-COMMAND are treated specially:
-
-  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
-        ;;
-
-      link)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
-  -all-static       do not do any dynamic linking at all
-  -avoid-version    do not add a version suffix if possible
-  -bindir BINDIR    specify path to binaries directory (for systems where
-                    libraries must be found in the PATH setting at runtime)
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
-  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
-  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-  -export-symbols SYMFILE
-                    try to export only the symbols listed in SYMFILE
-  -export-symbols-regex REGEX
-                    try to export only the symbols matching REGEX
-  -LLIBDIR          search LIBDIR for required installed libraries
-  -lNAME            OUTPUT-FILE requires the installed library libNAME
-  -module           build a library that can dlopened
-  -no-fast-install  disable the fast-install mode
-  -no-install       link a not-installable executable
-  -no-undefined     declare that a library does not refer to external symbols
-  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
-  -precious-files-regex REGEX
-                    don't remove output files matching REGEX
-  -release RELEASE  specify package release information
-  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
-  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
-  -shared           only do dynamic linking of libtool libraries
-  -shrext SUFFIX    override the standard shared library file extension
-  -static           do not do any dynamic linking of uninstalled libtool libraries
-  -static-libtool-libs
-                    do not do any dynamic linking of libtool libraries
-  -version-info CURRENT[:REVISION[:AGE]]
-                    specify library version info [each variable defaults to 0]
-  -weak LIBNAME     declare that the target provides the LIBNAME interface
-  -Wc,FLAG
-  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
-  -Wl,FLAG
-  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
-  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename.  Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
-        ;;
-
-      uninstall)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      *)
-        func_fatal_help "invalid operation mode \`$mode'"
-        ;;
-    esac
-
-    echo
-    $ECHO "Try \`$progname --help' for more information about other modes."
-}
-
-# Now that we've collected a possible --mode arg, show help if necessary
-if $opt_help; then
-  if test "$opt_help" = :; then
-    func_mode_help
-  else
-    {
-      func_help noexit
-      for mode in compile link execute install finish uninstall clean; do
-	func_mode_help
-      done
-    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
-    {
-      func_help noexit
-      for mode in compile link execute install finish uninstall clean; do
-	echo
-	func_mode_help
-      done
-    } |
-    sed '1d
-      /^When reporting/,/^Report/{
-	H
-	d
-      }
-      $x
-      /information about other modes/d
-      /more detailed .*MODE/d
-      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
-  fi
-  exit $?
-fi
-
-
-# func_mode_execute arg...
-func_mode_execute ()
-{
-    $opt_debug
-    # The first argument is the command name.
-    cmd="$nonopt"
-    test -z "$cmd" && \
-      func_fatal_help "you must specify a COMMAND"
-
-    # Handle -dlopen flags immediately.
-    for file in $execute_dlfiles; do
-      test -f "$file" \
-	|| func_fatal_help "\`$file' is not a file"
-
-      dir=
-      case $file in
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$lib' is not a valid libtool archive"
-
-	# Read the libtool library.
-	dlname=
-	library_names=
-	func_source "$file"
-
-	# Skip this library if it cannot be dlopened.
-	if test -z "$dlname"; then
-	  # Warn if it was a shared library.
-	  test -n "$library_names" && \
-	    func_warning "\`$file' was not linked with \`-export-dynamic'"
-	  continue
-	fi
-
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-
-	if test -f "$dir/$objdir/$dlname"; then
-	  dir="$dir/$objdir"
-	else
-	  if test ! -f "$dir/$dlname"; then
-	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
-	  fi
-	fi
-	;;
-
-      *.lo)
-	# Just add the directory containing the .lo file.
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-	;;
-
-      *)
-	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
-	continue
-	;;
-      esac
-
-      # Get the absolute pathname.
-      absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
-
-      # Now add the directory to shlibpath_var.
-      if eval test -z \"\$$shlibpath_var\"; then
-	eval $shlibpath_var=\$dir
-      else
-	eval $shlibpath_var=\$dir:\$$shlibpath_var
-      fi
-    done
-
-    # This variable tells wrapper scripts just to set shlibpath_var
-    # rather than running their programs.
-    libtool_execute_magic="$magic"
-
-    # Check if any of the arguments is a wrapper script.
-    args=
-    for file
-    do
-      case $file in
-      -* | *.la | *.lo ) ;;
-      *)
-	# Do a test to see if this is really a libtool program.
-	if func_ltwrapper_script_p "$file"; then
-	  func_source "$file"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	elif func_ltwrapper_executable_p "$file"; then
-	  func_ltwrapper_scriptname "$file"
-	  func_source "$func_ltwrapper_scriptname_result"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	fi
-	;;
-      esac
-      # Quote arguments (to preserve shell metacharacters).
-      func_quote_for_eval "$file"
-      args="$args $func_quote_for_eval_result"
-    done
-
-    if test "X$opt_dry_run" = Xfalse; then
-      if test -n "$shlibpath_var"; then
-	# Export the shlibpath_var.
-	eval "export $shlibpath_var"
-      fi
-
-      # Restore saved environment variables
-      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-      do
-	eval "if test \"\${save_$lt_var+set}\" = set; then
-                $lt_var=\$save_$lt_var; export $lt_var
-	      else
-		$lt_unset $lt_var
-	      fi"
-      done
-
-      # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-	echo "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = execute && func_mode_execute ${1+"$@"}
-
-
-# func_mode_finish arg...
-func_mode_finish ()
-{
-    $opt_debug
-    libdirs="$nonopt"
-    admincmds=
-
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for dir
-      do
-	libdirs="$libdirs $dir"
-      done
-
-      for libdir in $libdirs; do
-	if test -n "$finish_cmds"; then
-	  # Do each command in the finish commands.
-	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
-'"$cmd"'"'
-	fi
-	if test -n "$finish_eval"; then
-	  # Do the single finish_eval.
-	  eval cmds=\"$finish_eval\"
-	  $opt_dry_run || eval "$cmds" || admincmds="$admincmds
-       $cmds"
-	fi
-      done
-    fi
-
-    # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
-
-    echo "----------------------------------------------------------------------"
-    echo "Libraries have been installed in:"
-    for libdir in $libdirs; do
-      $ECHO "   $libdir"
-    done
-    echo
-    echo "If you ever happen to want to link against installed libraries"
-    echo "in a given directory, LIBDIR, you must either use libtool, and"
-    echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
-    echo "flag during linking and do at least one of the following:"
-    if test -n "$shlibpath_var"; then
-      echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-      echo "     during execution"
-    fi
-    if test -n "$runpath_var"; then
-      echo "   - add LIBDIR to the \`$runpath_var' environment variable"
-      echo "     during linking"
-    fi
-    if test -n "$hardcode_libdir_flag_spec"; then
-      libdir=LIBDIR
-      eval "flag=\"$hardcode_libdir_flag_spec\""
-
-      $ECHO "   - use the \`$flag' linker flag"
-    fi
-    if test -n "$admincmds"; then
-      $ECHO "   - have your system administrator run these commands:$admincmds"
-    fi
-    if test -f /etc/ld.so.conf; then
-      echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-    fi
-    echo
-
-    echo "See any operating system documentation about shared libraries for"
-    case $host in
-      solaris2.[6789]|solaris2.1[0-9])
-        echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
-	echo "pages."
-	;;
-      *)
-        echo "more information, such as the ld(1) and ld.so(8) manual pages."
-        ;;
-    esac
-    echo "----------------------------------------------------------------------"
-    exit $EXIT_SUCCESS
-}
-
-test "$mode" = finish && func_mode_finish ${1+"$@"}
-
-
-# func_mode_install arg...
-func_mode_install ()
-{
-    $opt_debug
-    # There may be an optional sh(1) argument at the beginning of
-    # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
-       # Allow the use of GNU shtool's install command.
-       case $nonopt in *shtool*) :;; *) false;; esac; then
-      # Aesthetically quote it.
-      func_quote_for_eval "$nonopt"
-      install_prog="$func_quote_for_eval_result "
-      arg=$1
-      shift
-    else
-      install_prog=
-      arg=$nonopt
-    fi
-
-    # The real first argument should be the name of the installation program.
-    # Aesthetically quote it.
-    func_quote_for_eval "$arg"
-    install_prog="$install_prog$func_quote_for_eval_result"
-    install_shared_prog=$install_prog
-    case " $install_prog " in
-      *[\\\ /]cp\ *) install_cp=: ;;
-      *) install_cp=false ;;
-    esac
-
-    # We need to accept at least all the BSD install flags.
-    dest=
-    files=
-    opts=
-    prev=
-    install_type=
-    isdir=no
-    stripme=
-    no_mode=:
-    for arg
-    do
-      arg2=
-      if test -n "$dest"; then
-	files="$files $dest"
-	dest=$arg
-	continue
-      fi
-
-      case $arg in
-      -d) isdir=yes ;;
-      -f)
-	if $install_cp; then :; else
-	  prev=$arg
-	fi
-	;;
-      -g | -m | -o)
-	prev=$arg
-	;;
-      -s)
-	stripme=" -s"
-	continue
-	;;
-      -*)
-	;;
-      *)
-	# If the previous option needed an argument, then skip it.
-	if test -n "$prev"; then
-	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
-	    arg2=$install_override_mode
-	    no_mode=false
-	  fi
-	  prev=
-	else
-	  dest=$arg
-	  continue
-	fi
-	;;
-      esac
-
-      # Aesthetically quote the argument.
-      func_quote_for_eval "$arg"
-      install_prog="$install_prog $func_quote_for_eval_result"
-      if test -n "$arg2"; then
-	func_quote_for_eval "$arg2"
-      fi
-      install_shared_prog="$install_shared_prog $func_quote_for_eval_result"
-    done
-
-    test -z "$install_prog" && \
-      func_fatal_help "you must specify an install program"
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
-
-    if test -n "$install_override_mode" && $no_mode; then
-      if $install_cp; then :; else
-	func_quote_for_eval "$install_override_mode"
-	install_shared_prog="$install_shared_prog -m $func_quote_for_eval_result"
-      fi
-    fi
-
-    if test -z "$files"; then
-      if test -z "$dest"; then
-	func_fatal_help "no file or destination specified"
-      else
-	func_fatal_help "you must specify a destination"
-      fi
-    fi
-
-    # Strip any trailing slash from the destination.
-    func_stripname '' '/' "$dest"
-    dest=$func_stripname_result
-
-    # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
-      destname=
-    else
-      func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
-
-      # Not a directory, so check to see that there is only one file specified.
-      set dummy $files; shift
-      test "$#" -gt 1 && \
-	func_fatal_help "\`$dest' is not a directory"
-    fi
-    case $destdir in
-    [\\/]* | [A-Za-z]:[\\/]*) ;;
-    *)
-      for file in $files; do
-	case $file in
-	*.lo) ;;
-	*)
-	  func_fatal_help "\`$destdir' must be an absolute directory name"
-	  ;;
-	esac
-      done
-      ;;
-    esac
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    staticlibs=
-    future_libdirs=
-    current_libdirs=
-    for file in $files; do
-
-      # Do each installation.
-      case $file in
-      *.$libext)
-	# Do the static libraries later.
-	staticlibs="$staticlibs $file"
-	;;
-
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$file' is not a valid libtool archive"
-
-	library_names=
-	old_library=
-	relink_command=
-	func_source "$file"
-
-	# Add the libdir to current_libdirs if it is the destination.
-	if test "X$destdir" = "X$libdir"; then
-	  case "$current_libdirs " in
-	  *" $libdir "*) ;;
-	  *) current_libdirs="$current_libdirs $libdir" ;;
-	  esac
-	else
-	  # Note the libdir as a future libdir.
-	  case "$future_libdirs " in
-	  *" $libdir "*) ;;
-	  *) future_libdirs="$future_libdirs $libdir" ;;
-	  esac
-	fi
-
-	func_dirname "$file" "/" ""
-	dir="$func_dirname_result"
-	dir="$dir$objdir"
-
-	if test -n "$relink_command"; then
-	  # Determine the prefix the user has applied to our future dir.
-	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
-
-	  # Don't allow the user to place us outside of our expected
-	  # location b/c this prevents finding dependent libraries that
-	  # are installed to the same prefix.
-	  # At present, this check doesn't affect windows .dll's that
-	  # are installed into $libdir/../bin (currently, that works fine)
-	  # but it's something to keep an eye on.
-	  test "$inst_prefix_dir" = "$destdir" && \
-	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
-
-	  if test -n "$inst_prefix_dir"; then
-	    # Stick the inst_prefix_dir data into the link command.
-	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
-	  else
-	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
-	  fi
-
-	  func_warning "relinking \`$file'"
-	  func_show_eval "$relink_command" \
-	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
-	fi
-
-	# See the names of the shared library.
-	set dummy $library_names; shift
-	if test -n "$1"; then
-	  realname="$1"
-	  shift
-
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
-
-	  # Install the shared library and build the symlinks.
-	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
-	      'exit $?'
-	  tstripme="$stripme"
-	  case $host_os in
-	  cygwin* | mingw* | pw32* | cegcc*)
-	    case $realname in
-	    *.dll.a)
-	      tstripme=""
-	      ;;
-	    esac
-	    ;;
-	  esac
-	  if test -n "$tstripme" && test -n "$striplib"; then
-	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
-	  fi
-
-	  if test "$#" -gt 0; then
-	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
-	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
-	    # so we also need to try rm && ln -s.
-	    for linkname
-	    do
-	      test "$linkname" != "$realname" \
-		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
-	    done
-	  fi
-
-	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
-	  func_execute_cmds "$postinstall_cmds" 'exit $?'
-	fi
-
-	# Install the pseudo-library for information purposes.
-	func_basename "$file"
-	name="$func_basename_result"
-	instname="$dir/$name"i
-	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
-
-	# Maybe install the static library, too.
-	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
-	;;
-
-      *.lo)
-	# Install (i.e. copy) a libtool object.
-
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# Deduce the name of the destination old-style object file.
-	case $destfile in
-	*.lo)
-	  func_lo2o "$destfile"
-	  staticdest=$func_lo2o_result
-	  ;;
-	*.$objext)
-	  staticdest="$destfile"
-	  destfile=
-	  ;;
-	*)
-	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
-	  ;;
-	esac
-
-	# Install the libtool object if requested.
-	test -n "$destfile" && \
-	  func_show_eval "$install_prog $file $destfile" 'exit $?'
-
-	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
-	  # Deduce the name of the old-style object file.
-	  func_lo2o "$file"
-	  staticobj=$func_lo2o_result
-	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
-	fi
-	exit $EXIT_SUCCESS
-	;;
-
-      *)
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# If the file is missing, and there is a .exe on the end, strip it
-	# because it is most likely a libtool script we actually want to
-	# install
-	stripped_ext=""
-	case $file in
-	  *.exe)
-	    if test ! -f "$file"; then
-	      func_stripname '' '.exe' "$file"
-	      file=$func_stripname_result
-	      stripped_ext=".exe"
-	    fi
-	    ;;
-	esac
-
-	# Do a test to see if this is really a libtool program.
-	case $host in
-	*cygwin* | *mingw*)
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      wrapper=$func_ltwrapper_scriptname_result
-	    else
-	      func_stripname '' '.exe' "$file"
-	      wrapper=$func_stripname_result
-	    fi
-	    ;;
-	*)
-	    wrapper=$file
-	    ;;
-	esac
-	if func_ltwrapper_script_p "$wrapper"; then
-	  notinst_deplibs=
-	  relink_command=
-
-	  func_source "$wrapper"
-
-	  # Check the variables that should have been set.
-	  test -z "$generated_by_libtool_version" && \
-	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
-
-	  finalize=yes
-	  for lib in $notinst_deplibs; do
-	    # Check to see that each library is installed.
-	    libdir=
-	    if test -f "$lib"; then
-	      func_source "$lib"
-	    fi
-	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
-	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      func_warning "\`$lib' has not been installed in \`$libdir'"
-	      finalize=no
-	    fi
-	  done
-
-	  relink_command=
-	  func_source "$wrapper"
-
-	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
-	    $opt_dry_run || {
-	      if test "$finalize" = yes; then
-	        tmpdir=`func_mktempdir`
-		func_basename "$file$stripped_ext"
-		file="$func_basename_result"
-	        outputname="$tmpdir/$file"
-	        # Replace the output file specification.
-	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
-
-	        $opt_silent || {
-	          func_quote_for_expand "$relink_command"
-		  eval "func_echo $func_quote_for_expand_result"
-	        }
-	        if eval "$relink_command"; then :
-	          else
-		  func_error "error: relink \`$file' with the above command before installing it"
-		  $opt_dry_run || ${RM}r "$tmpdir"
-		  continue
-	        fi
-	        file="$outputname"
-	      else
-	        func_warning "cannot relink \`$file'"
-	      fi
-	    }
-	  else
-	    # Install the binary that we compiled earlier.
-	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
-	  fi
-	fi
-
-	# remove .exe since cygwin /usr/bin/install will append another
-	# one anyway
-	case $install_prog,$host in
-	*/usr/bin/install*,*cygwin*)
-	  case $file:$destfile in
-	  *.exe:*.exe)
-	    # this is ok
-	    ;;
-	  *.exe:*)
-	    destfile=$destfile.exe
-	    ;;
-	  *:*.exe)
-	    func_stripname '' '.exe' "$destfile"
-	    destfile=$func_stripname_result
-	    ;;
-	  esac
-	  ;;
-	esac
-	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
-	$opt_dry_run || if test -n "$outputname"; then
-	  ${RM}r "$tmpdir"
-	fi
-	;;
-      esac
-    done
-
-    for file in $staticlibs; do
-      func_basename "$file"
-      name="$func_basename_result"
-
-      # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
-
-      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
-
-      if test -n "$stripme" && test -n "$old_striplib"; then
-	func_show_eval "$old_striplib $oldlib" 'exit $?'
-      fi
-
-      # Do each command in the postinstall commands.
-      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
-    done
-
-    test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
-
-    if test -n "$current_libdirs" && $opt_finish; then
-      # Maybe just do a dry run.
-      $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
-    else
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = install && func_mode_install ${1+"$@"}
-
-
-# func_generate_dlsyms outputname originator pic_p
-# Extract symbols from dlprefiles and create ${outputname}S.o with
-# a dlpreopen symbol table.
-func_generate_dlsyms ()
-{
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
-    my_dlsyms=
-
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-      if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	my_dlsyms="${my_outputname}S.c"
-      else
-	func_error "not configured to extract global symbols from dlpreopened files"
-      fi
-    fi
-
-    if test -n "$my_dlsyms"; then
-      case $my_dlsyms in
-      "") ;;
-      *.c)
-	# Discover the nlist of each of the dlfiles.
-	nlist="$output_objdir/${my_outputname}.nm"
-
-	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
-
-	# Parse the name list into a source file.
-	func_verbose "creating $output_objdir/$my_dlsyms"
-
-	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
-#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
-#endif
-
-/* External symbol declarations for the compiler. */\
-"
-
-	if test "$dlself" = yes; then
-	  func_verbose "generating symbol list for \`$output'"
-
-	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
-
-	  # Add our own program objects to the symbol list.
-	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	  for progfile in $progfiles; do
-	    func_verbose "extracting global C symbols from \`$progfile'"
-	    $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
-	  done
-
-	  if test -n "$exclude_expsyms"; then
-	    $opt_dry_run || {
-	      $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	      $MV "$nlist"T "$nlist"
-	    }
-	  fi
-
-	  if test -n "$export_symbols_regex"; then
-	    $opt_dry_run || {
-	      $EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T
-	      $MV "$nlist"T "$nlist"
-	    }
-	  fi
-
-	  # Prepare the list of exported symbols
-	  if test -z "$export_symbols"; then
-	    export_symbols="$output_objdir/$outputname.exp"
-	    $opt_dry_run || {
-	      $RM $export_symbols
-	      ${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' < "$nlist" > "$export_symbols"
-	      case $host in
-	      *cygwin* | *mingw* | *cegcc* )
-                echo EXPORTS > "$output_objdir/$outputname.def"
-                cat "$export_symbols" >> "$output_objdir/$outputname.def"
-	        ;;
-	      esac
-	    }
-	  else
-	    $opt_dry_run || {
-	      ${SED} -e 's/\([].[*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/' < "$export_symbols" > "$output_objdir/$outputname.exp"
-	      $GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T
-	      $MV "$nlist"T "$nlist"
-	      case $host in
-	        *cygwin* | *mingw* | *cegcc* )
-	          echo EXPORTS > "$output_objdir/$outputname.def"
-	          cat "$nlist" >> "$output_objdir/$outputname.def"
-	          ;;
-	      esac
-	    }
-	  fi
-	fi
-
-	for dlprefile in $dlprefiles; do
-	  func_verbose "extracting global C symbols from \`$dlprefile'"
-	  func_basename "$dlprefile"
-	  name="$func_basename_result"
-	  $opt_dry_run || {
-	    $ECHO ": $name " >> "$nlist"
-	    eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
-	  }
-	done
-
-	$opt_dry_run || {
-	  # Make sure we have at least an empty file.
-	  test -f "$nlist" || : > "$nlist"
-
-	  if test -n "$exclude_expsyms"; then
-	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	    $MV "$nlist"T "$nlist"
-	  fi
-
-	  # Try sorting and uniquifying the output.
-	  if $GREP -v "^: " < "$nlist" |
-	      if sort -k 3 </dev/null >/dev/null 2>&1; then
-		sort -k 3
-	      else
-		sort +2
-	      fi |
-	      uniq > "$nlist"S; then
-	    :
-	  else
-	    $GREP -v "^: " < "$nlist" > "$nlist"S
-	  fi
-
-	  if test -f "$nlist"S; then
-	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
-	  else
-	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
-	  fi
-
-	  echo >> "$output_objdir/$my_dlsyms" "\
-
-/* The mapping between symbol names and symbols.  */
-typedef struct {
-  const char *name;
-  void *address;
-} lt_dlsymlist;
-"
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc* )
-	    echo >> "$output_objdir/$my_dlsyms" "\
-/* DATA imports from DLLs on WIN32 con't be const, because
-   runtime relocations are performed -- see ld's documentation
-   on pseudo-relocs.  */"
-	    lt_dlsym_const= ;;
-	  *osf5*)
-	    echo >> "$output_objdir/$my_dlsyms" "\
-/* This system does not cope well with relocations in const data */"
-	    lt_dlsym_const= ;;
-	  *)
-	    lt_dlsym_const=const ;;
-	  esac
-
-	  echo >> "$output_objdir/$my_dlsyms" "\
-extern $lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
-$lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
-
-	  case $need_lib_prefix in
-	  no)
-	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  *)
-	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  esac
-	  echo >> "$output_objdir/$my_dlsyms" "\
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt_${my_prefix}_LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
-	} # !$opt_dry_run
-
-	pic_flag_for_symtable=
-	case "$compile_command " in
-	*" -static "*) ;;
-	*)
-	  case $host in
-	  # compiling the symbol table file with pic_flag works around
-	  # a FreeBSD bug that causes programs to crash when -lm is
-	  # linked before any other PIC object.  But we must not use
-	  # pic_flag when linking with -static.  The problem exists in
-	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
-	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
-	  *-*-hpux*)
-	    pic_flag_for_symtable=" $pic_flag"  ;;
-	  *)
-	    if test "X$my_pic_p" != Xno; then
-	      pic_flag_for_symtable=" $pic_flag"
-	    fi
-	    ;;
-	  esac
-	  ;;
-	esac
-	symtab_cflags=
-	for arg in $LTCFLAGS; do
-	  case $arg in
-	  -pie | -fpie | -fPIE) ;;
-	  *) symtab_cflags="$symtab_cflags $arg" ;;
-	  esac
-	done
-
-	# Now compile the dynamic symbol file.
-	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
-
-	# Clean up the generated files.
-	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
-
-	# Transform the symbol file into the correct name.
-	symfileobj="$output_objdir/${my_outputname}S.$objext"
-	case $host in
-	*cygwin* | *mingw* | *cegcc* )
-	  if test -f "$output_objdir/$my_outputname.def"; then
-	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	  else
-	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  fi
-	  ;;
-	*)
-	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  ;;
-	esac
-	;;
-      *)
-	func_fatal_error "unknown suffix for \`$my_dlsyms'"
-	;;
-      esac
-    else
-      # We keep going just in case the user didn't refer to
-      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
-      # really was required.
-
-      # Nullify the symbol file.
-      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
-      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
-    fi
-}
-
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-# Despite the name, also deal with 64 bit binaries.
-func_win32_libid ()
-{
-  $opt_debug
-  win32_libid_type="unknown"
-  win32_fileres=`file -L $1 2>/dev/null`
-  case $win32_fileres in
-  *ar\ archive\ import\ library*) # definitely import
-    win32_libid_type="x86 archive import"
-    ;;
-  *ar\ archive*) # could be an import, or static
-    if $OBJDUMP -f "$1" | $SED -e '10q' 2>/dev/null |
-       $EGREP 'file format (pe-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
-      win32_nmres=`$NM -f posix -A "$1" |
-	$SED -n -e '
-	    1,100{
-		/ I /{
-		    s,.*,import,
-		    p
-		    q
-		}
-	    }'`
-      case $win32_nmres in
-      import*)  win32_libid_type="x86 archive import";;
-      *)        win32_libid_type="x86 archive static";;
-      esac
-    fi
-    ;;
-  *DLL*)
-    win32_libid_type="x86 DLL"
-    ;;
-  *executable*) # but shell scripts are "executable" too...
-    case $win32_fileres in
-    *MS\ Windows\ PE\ Intel*)
-      win32_libid_type="x86 DLL"
-      ;;
-    esac
-    ;;
-  esac
-  $ECHO "$win32_libid_type"
-}
-
-
-
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
-{
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    if test "$lock_old_archive_extraction" = yes; then
-      lockfile=$f_ex_an_ar_oldlib.lock
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    fi
-    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
-		   'stat=$?; rm -f "$lockfile"; exit $stat'
-    if test "$lock_old_archive_extraction" = yes; then
-      $opt_dry_run || rm -f "$lockfile"
-    fi
-    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
-     :
-    else
-      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
-    fi
-}
-
-
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
-{
-    $opt_debug
-    my_gentop="$1"; shift
-    my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
-
-    for my_xlib in $my_oldlibs; do
-      # Extract the objects.
-      case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
-	*) my_xabs=`pwd`"/$my_xlib" ;;
-      esac
-      func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
-      my_xlib_u=$my_xlib
-      while :; do
-        case " $extracted_archives " in
-	*" $my_xlib_u "*)
-	  func_arith $extracted_serial + 1
-	  extracted_serial=$func_arith_result
-	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
-	*) break ;;
-	esac
-      done
-      extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
-
-      func_mkdir_p "$my_xdir"
-
-      case $host in
-      *-darwin*)
-	func_verbose "Extracting $my_xabs"
-	# Do not bother doing anything if just a dry run
-	$opt_dry_run || {
-	  darwin_orig_dir=`pwd`
-	  cd $my_xdir || exit $?
-	  darwin_archive=$my_xabs
-	  darwin_curdir=`pwd`
-	  darwin_base_archive=`basename "$darwin_archive"`
-	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
-	  if test -n "$darwin_arches"; then
-	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
-	    darwin_arch=
-	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
-	      cd "$darwin_curdir"
-	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
-	    done # $darwin_arches
-            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
-	    darwin_file=
-	    darwin_files=
-	    for darwin_file in $darwin_filelist; do
-	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
-	      $LIPO -create -output "$darwin_file" $darwin_files
-	    done # $darwin_filelist
-	    $RM -rf unfat-$$
-	    cd "$darwin_orig_dir"
-	  else
-	    cd $darwin_orig_dir
-	    func_extract_an_archive "$my_xdir" "$my_xabs"
-	  fi # $darwin_arches
-	} # !$opt_dry_run
-	;;
-      *)
-        func_extract_an_archive "$my_xdir" "$my_xabs"
-	;;
-      esac
-      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
-    done
-
-    func_extract_archives_result="$my_oldobjs"
-}
-
-
-# func_emit_wrapper [arg=no]
-#
-# Emit a libtool wrapper script on stdout.
-# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable.  Must ONLY be called from within
-# func_mode_link because it depends on a number of variables
-# set therein.
-#
-# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the $objdir directory.  This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
-{
-	func_emit_wrapper_arg1=${1-no}
-
-	$ECHO "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='$sed_quote_subst'
-
-# Be Bourne compatible
-if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
-  # install mode needs the following variables:
-  generated_by_libtool_version='$macro_version'
-  notinst_deplibs='$notinst_deplibs'
-else
-  # When we are sourced in execute mode, \$file and \$ECHO are already set.
-  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    file=\"\$0\""
-
-    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
-    $ECHO "\
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-    ECHO=\"$qECHO\"
-  fi\
-
-  # Find the directory that this script lives in.
-  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
-  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
-  # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
-  while test -n \"\$file\"; do
-    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
-
-    # If there was a directory component, then change thisdir.
-    if test \"x\$destdir\" != \"x\$file\"; then
-      case \"\$destdir\" in
-      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
-      *) thisdir=\"\$thisdir/\$destdir\" ;;
-      esac
-    fi
-
-    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
-  done
-
-  # Usually 'no', except on cygwin/mingw when embedded into
-  # the cwrapper.
-  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
-  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
-    # special case for '.'
-    if test \"\$thisdir\" = \".\"; then
-      thisdir=\`pwd\`
-    fi
-    # remove .libs from thisdir
-    case \"\$thisdir\" in
-    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
-    $objdir )   thisdir=. ;;
-    esac
-  fi
-
-  # Try to get the absolute directory name.
-  absdir=\`cd \"\$thisdir\" && pwd\`
-  test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
-	if test "$fast_install" = yes; then
-	  $ECHO "\
-  program=lt-'$outputname'$exeext
-  progdir=\"\$thisdir/$objdir\"
-
-  if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
-       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
-    file=\"\$\$-\$program\"
-
-    if test ! -d \"\$progdir\"; then
-      $MKDIR \"\$progdir\"
-    else
-      $RM \"\$progdir/\$file\"
-    fi"
-
-	  $ECHO "\
-
-    # relink executable if necessary
-    if test -n \"\$relink_command\"; then
-      if relink_command_output=\`eval \"\$relink_command\" 2>&1\`; then :
-      else
-	$ECHO \"\$relink_command_output\" >&2
-	$RM \"\$progdir/\$file\"
-	exit 1
-      fi
-    fi
-
-    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
-    { $RM \"\$progdir/\$program\";
-      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
-    $RM \"\$progdir/\$file\"
-  fi"
-	else
-	  $ECHO "\
-  program='$outputname'
-  progdir=\"\$thisdir/$objdir\"
-"
-	fi
-
-	$ECHO "\
-
-  if test -f \"\$progdir/\$program\"; then"
-
-	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-	  $ECHO "\
-    # Add our own library path to $shlibpath_var
-    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
-    # Some systems cannot cope with colon-terminated $shlibpath_var
-    # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
-
-    export $shlibpath_var
-"
-	fi
-
-	# fixup the dll searchpath if we need to.
-	if test -n "$dllsearchpath"; then
-	  $ECHO "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
-	fi
-
-	$ECHO "\
-    if test \"\$libtool_execute_magic\" != \"$magic\"; then
-      # Run the actual program with our arguments.
-"
-	case $host in
-	# Backslashes separate directories on plain windows
-	*-*-mingw | *-*-os2* | *-cegcc*)
-	  $ECHO "\
-      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
-	  ;;
-
-	*)
-	  $ECHO "\
-      exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
-	  ;;
-	esac
-	$ECHO "\
-      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
-      exit 1
-    fi
-  else
-    # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
-    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
-    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
-    exit 1
-  fi
-fi\
-"
-}
-
-
-# func_to_host_path arg
-#
-# Convert paths to host format when used with build tools.
-# Intended for use with "native" mingw (where libtool itself
-# is running under the msys shell), or in the following cross-
-# build environments:
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-# where wine is equipped with the `winepath' executable.
-# In the native mingw case, the (msys) shell automatically
-# converts paths for any non-msys applications it launches,
-# but that facility isn't available from inside the cwrapper.
-# Similar accommodations are necessary for $host mingw and
-# $build cygwin.  Calling this function does no harm for other
-# $host/$build combinations not listed above.
-#
-# ARG is the path (on $build) that should be converted to
-# the proper representation for $host. The result is stored
-# in $func_to_host_path_result.
-func_to_host_path ()
-{
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        case $build in
-          *mingw* ) # actually, msys
-            # awkward: cmd appends spaces to result
-            func_to_host_path_result=`( cmd //c echo "$1" ) 2>/dev/null |
-              $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_path_result=`cygpath -w "$1" |
-	      $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # Unfortunately, winepath does not exit with a non-zero
-            # error code, so we are forced to check the contents of
-            # stdout. On the other hand, if the command is not
-            # found, the shell will set an exit code of 127 and print
-            # *an error message* to stdout. So we must check for both
-            # error code of zero AND non-empty stdout, which explains
-            # the odd construction:
-            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
-            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
-              func_to_host_path_result=`$ECHO "$func_to_host_path_tmp1" |
-                $SED -e "$lt_sed_naive_backslashify"`
-            else
-              # Allow warning below.
-              func_to_host_path_result=
-            fi
-            ;;
-        esac
-        if test -z "$func_to_host_path_result" ; then
-          func_error "Could not determine host path corresponding to"
-          func_error "  \`$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback:
-          func_to_host_path_result="$1"
-        fi
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_path
-
-# func_to_host_pathlist arg
-#
-# Convert pathlists to host format when used with build tools.
-# See func_to_host_path(), above. This function supports the
-# following $build/$host combinations (but does no harm for
-# combinations not listed here):
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-#
-# Path separators are also converted from $build format to
-# $host format. If ARG begins or ends with a path separator
-# character, it is preserved (but converted to $host format)
-# on output.
-#
-# ARG is a pathlist (on $build) that should be converted to
-# the proper representation on $host. The result is stored
-# in $func_to_host_pathlist_result.
-func_to_host_pathlist ()
-{
-  func_to_host_pathlist_result="$1"
-  if test -n "$1"; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        # Remove leading and trailing path separator characters from
-        # ARG. msys behavior is inconsistent here, cygpath turns them
-        # into '.;' and ';.', and winepath ignores them completely.
-	func_stripname : : "$1"
-        func_to_host_pathlist_tmp1=$func_stripname_result
-        case $build in
-          *mingw* ) # Actually, msys.
-            # Awkward: cmd appends spaces to result.
-            func_to_host_pathlist_result=`
-	      ( cmd //c echo "$func_to_host_pathlist_tmp1" ) 2>/dev/null |
-	      $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_pathlist_result=`cygpath -w -p "$func_to_host_pathlist_tmp1" |
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # unfortunately, winepath doesn't convert pathlists
-            func_to_host_pathlist_result=""
-            func_to_host_pathlist_oldIFS=$IFS
-            IFS=:
-            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
-              IFS=$func_to_host_pathlist_oldIFS
-              if test -n "$func_to_host_pathlist_f" ; then
-                func_to_host_path "$func_to_host_pathlist_f"
-                if test -n "$func_to_host_path_result" ; then
-                  if test -z "$func_to_host_pathlist_result" ; then
-                    func_to_host_pathlist_result="$func_to_host_path_result"
-                  else
-                    func_append func_to_host_pathlist_result ";$func_to_host_path_result"
-                  fi
-                fi
-              fi
-            done
-            IFS=$func_to_host_pathlist_oldIFS
-            ;;
-        esac
-        if test -z "$func_to_host_pathlist_result"; then
-          func_error "Could not determine the host path(s) corresponding to"
-          func_error "  \`$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback. This may break if $1 contains DOS-style drive
-          # specifications. The fix is not to complicate the expression
-          # below, but for the user to provide a working wine installation
-          # with winepath so that path translation in the cross-to-mingw
-          # case works properly.
-          lt_replace_pathsep_nix_to_dos="s|:|;|g"
-          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
-            $SED -e "$lt_replace_pathsep_nix_to_dos"`
-        fi
-        # Now, add the leading and trailing path separators back
-        case "$1" in
-          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
-            ;;
-        esac
-        case "$1" in
-          *: ) func_append func_to_host_pathlist_result ";"
-            ;;
-        esac
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_pathlist
-
-# func_emit_cwrapperexe_src
-# emit the source code for a wrapper executable on stdout
-# Must ONLY be called from within func_mode_link because
-# it depends on a number of variable set therein.
-func_emit_cwrapperexe_src ()
-{
-	cat <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-
-   The $output program cannot be directly executed until all the libtool
-   libraries that it depends on are installed.
-
-   This wrapper executable should never be moved out of the build directory.
-   If it is, it will not operate correctly.
-
-   Currently, it simply execs the wrapper *script* "$SHELL $output",
-   but could eventually absorb all of the scripts functionality and
-   exec $objdir/$outputname directly.
-*/
-EOF
-	    cat <<"EOF"
-#ifdef _MSC_VER
-# define _CRT_SECURE_NO_DEPRECATE 1
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef _MSC_VER
-# include <direct.h>
-# include <process.h>
-# include <io.h>
-#else
-# include <unistd.h>
-# include <stdint.h>
-# ifdef __CYGWIN__
-#  include <io.h>
-# endif
-#endif
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-/* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
-# ifdef __STRICT_ANSI__
-int _putenv (const char *);
-# endif
-#elif defined(__CYGWIN__)
-# ifdef __STRICT_ANSI__
-char *realpath (const char *, char *);
-int putenv (char *);
-int setenv (const char *, const char *, int);
-# endif
-/* #elif defined (other platforms) ... */
-#endif
-
-/* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
-# define setmode _setmode
-# define stat    _stat
-# define chmod   _chmod
-# define getcwd  _getcwd
-# define putenv  _putenv
-# define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-#  define _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#elif defined(__MINGW32__)
-# define setmode _setmode
-# define stat    _stat
-# define chmod   _chmod
-# define getcwd  _getcwd
-# define putenv  _putenv
-#elif defined(__CYGWIN__)
-# define HAVE_SETENV
-# define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
-#endif
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
-
-#ifndef S_IXOTH
-# define S_IXOTH 0
-#endif
-#ifndef S_IXGRP
-# define S_IXGRP 0
-#endif
-
-/* path handling portability macros */
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
-
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# define FOPEN_WB "wb"
-# ifndef DIR_SEPARATOR_2
-#  define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-#  define PATH_SEPARATOR_2 ';'
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
-	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
-
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
-
-#ifndef FOPEN_WB
-# define FOPEN_WB "w"
-#endif
-#ifndef _O_BINARY
-# define _O_BINARY 0
-#endif
-
-#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
-
-#undef LTWRAPPER_DEBUGPRINTF
-#if defined LT_DEBUGWRAPPER
-# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
-static void
-ltwrapper_debugprintf (const char *fmt, ...)
-{
-    va_list args;
-    va_start (args, fmt);
-    (void) vfprintf (stderr, fmt, args);
-    va_end (args);
-}
-#else
-# define LTWRAPPER_DEBUGPRINTF(args)
-#endif
-
-const char *program_name = NULL;
-
-void *xmalloc (size_t num);
-char *xstrdup (const char *string);
-const char *base_name (const char *name);
-char *find_executable (const char *wrapper);
-char *chase_symlinks (const char *pathspec);
-int make_executable (const char *path);
-int check_executable (const char *path);
-char *strendzap (char *str, const char *pat);
-void lt_fatal (const char *message, ...);
-void lt_setenv (const char *name, const char *value);
-char *lt_extend_str (const char *orig_value, const char *add, int to_end);
-void lt_update_exe_path (const char *name, const char *value);
-void lt_update_lib_path (const char *name, const char *value);
-char **prepare_spawn (char **argv);
-void lt_dump_script (FILE *f);
-EOF
-
-	    cat <<EOF
-const char * MAGIC_EXE = "$magic_exe";
-const char * LIB_PATH_VARNAME = "$shlibpath_var";
-EOF
-
-	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-              func_to_host_pathlist "$temp_rpath"
-	      cat <<EOF
-const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * LIB_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test -n "$dllsearchpath"; then
-              func_to_host_pathlist "$dllsearchpath:"
-	      cat <<EOF
-const char * EXE_PATH_VARNAME = "PATH";
-const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * EXE_PATH_VARNAME = "";
-const char * EXE_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test "$fast_install" = yes; then
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
-EOF
-	    else
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
-EOF
-	    fi
-
-
-	    cat <<"EOF"
-
-#define LTWRAPPER_OPTION_PREFIX         "--lt-"
-#define LTWRAPPER_OPTION_PREFIX_LENGTH  5
-
-static const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;
-static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
-
-static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
-
-int
-main (int argc, char *argv[])
-{
-  char **newargz;
-  int  newargc;
-  char *tmp_pathspec;
-  char *actual_cwrapper_path;
-  char *actual_cwrapper_name;
-  char *target_name;
-  char *lt_argv_zero;
-  intptr_t rval = 127;
-
-  int i;
-
-  program_name = (char *) xstrdup (base_name (argv[0]));
-  LTWRAPPER_DEBUGPRINTF (("(main) argv[0]      : %s\n", argv[0]));
-  LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
-
-  /* very simple arg parsing; don't want to rely on getopt */
-  for (i = 1; i < argc; i++)
-    {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
-	{
-EOF
-	    case "$host" in
-	      *mingw* | *cygwin* )
-		# make stdout use "unix" line endings
-		echo "          setmode(1,_O_BINARY);"
-		;;
-	      esac
-
-	    cat <<"EOF"
-	  lt_dump_script (stdout);
-	  return 0;
-	}
-    }
-
-  newargz = XMALLOC (char *, argc + 1);
-  tmp_pathspec = find_executable (argv[0]);
-  if (tmp_pathspec == NULL)
-    lt_fatal ("Couldn't find %s", argv[0]);
-  LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
-			  tmp_pathspec));
-
-  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
-  LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
-			  actual_cwrapper_path));
-  XFREE (tmp_pathspec);
-
-  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
-  strendzap (actual_cwrapper_path, actual_cwrapper_name);
-
-  /* wrapper name transforms */
-  strendzap (actual_cwrapper_name, ".exe");
-  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
-  XFREE (actual_cwrapper_name);
-  actual_cwrapper_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  /* target_name transforms -- use actual target program name; might have lt- prefix */
-  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
-  strendzap (target_name, ".exe");
-  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
-  XFREE (target_name);
-  target_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
-			  target_name));
-EOF
-
-	    cat <<EOF
-  newargz[0] =
-    XMALLOC (char, (strlen (actual_cwrapper_path) +
-		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
-  strcpy (newargz[0], actual_cwrapper_path);
-  strcat (newargz[0], "$objdir");
-  strcat (newargz[0], "/");
-EOF
-
-	    cat <<"EOF"
-  /* stop here, and copy so we don't have to do this twice */
-  tmp_pathspec = xstrdup (newargz[0]);
-
-  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
-  strcat (newargz[0], actual_cwrapper_name);
-
-  /* DO want the lt- prefix here if it exists, so use target_name */
-  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
-  XFREE (tmp_pathspec);
-  tmp_pathspec = NULL;
-EOF
-
-	    case $host_os in
-	      mingw*)
-	    cat <<"EOF"
-  {
-    char* p;
-    while ((p = strchr (newargz[0], '\\')) != NULL)
-      {
-	*p = '/';
-      }
-    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
-      {
-	*p = '/';
-      }
-  }
-EOF
-	    ;;
-	    esac
-
-	    cat <<"EOF"
-  XFREE (target_name);
-  XFREE (actual_cwrapper_path);
-  XFREE (actual_cwrapper_name);
-
-  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
-  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
-  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
-  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
-
-  newargc=0;
-  for (i = 1; i < argc; i++)
-    {
-      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
-        {
-          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
-             namespace, but it is not one of the ones we know about and
-             have already dealt with, above (inluding dump-script), then
-             report an error. Otherwise, targets might begin to believe
-             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
-             namespace. The first time any user complains about this, we'll
-             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
-             or a configure.ac-settable value.
-           */
-          lt_fatal ("Unrecognized option in %s namespace: '%s'",
-                    ltwrapper_option_prefix, argv[i]);
-        }
-      /* otherwise ... */
-      newargz[++newargc] = xstrdup (argv[i]);
-    }
-  newargz[++newargc] = NULL;
-
-  LTWRAPPER_DEBUGPRINTF     (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
-  for (i = 0; i < newargc; i++)
-    {
-      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
-    }
-
-EOF
-
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-  /* execv doesn't actually work on mingw as expected on unix */
-  newargz = prepare_spawn (newargz);
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
-  if (rval == -1)
-    {
-      /* failed to start process */
-      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
-      return 127;
-    }
-  return rval;
-EOF
-		;;
-	      *)
-		cat <<"EOF"
-  execv (lt_argv_zero, newargz);
-  return rval; /* =127, but avoids unused variable warning */
-EOF
-		;;
-	    esac
-
-	    cat <<"EOF"
-}
-
-void *
-xmalloc (size_t num)
-{
-  void *p = (void *) malloc (num);
-  if (!p)
-    lt_fatal ("Memory exhausted");
-
-  return p;
-}
-
-char *
-xstrdup (const char *string)
-{
-  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
-			  string) : NULL;
-}
-
-const char *
-base_name (const char *name)
-{
-  const char *base;
-
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  /* Skip over the disk name in MSDOS pathnames. */
-  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
-    name += 2;
-#endif
-
-  for (base = name; *name; name++)
-    if (IS_DIR_SEPARATOR (*name))
-      base = name + 1;
-  return base;
-}
-
-int
-check_executable (const char *path)
-{
-  struct stat st;
-
-  LTWRAPPER_DEBUGPRINTF (("(check_executable)  : %s\n",
-			  path ? (*path ? path : "EMPTY!") : "NULL!"));
-  if ((!path) || (!*path))
-    return 0;
-
-  if ((stat (path, &st) >= 0)
-      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
-    return 1;
-  else
-    return 0;
-}
-
-int
-make_executable (const char *path)
-{
-  int rval = 0;
-  struct stat st;
-
-  LTWRAPPER_DEBUGPRINTF (("(make_executable)   : %s\n",
-			  path ? (*path ? path : "EMPTY!") : "NULL!"));
-  if ((!path) || (!*path))
-    return 0;
-
-  if (stat (path, &st) >= 0)
-    {
-      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
-    }
-  return rval;
-}
-
-/* Searches for the full path of the wrapper.  Returns
-   newly allocated full path name if found, NULL otherwise
-   Does not chase symlinks, even on platforms that support them.
-*/
-char *
-find_executable (const char *wrapper)
-{
-  int has_slash = 0;
-  const char *p;
-  const char *p_next;
-  /* static buffer for getcwd */
-  char tmp[LT_PATHMAX + 1];
-  int tmp_len;
-  char *concat_name;
-
-  LTWRAPPER_DEBUGPRINTF (("(find_executable)   : %s\n",
-			  wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
-
-  if ((wrapper == NULL) || (*wrapper == '\0'))
-    return NULL;
-
-  /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
-    {
-      concat_name = xstrdup (wrapper);
-      if (check_executable (concat_name))
-	return concat_name;
-      XFREE (concat_name);
-    }
-  else
-    {
-#endif
-      if (IS_DIR_SEPARATOR (wrapper[0]))
-	{
-	  concat_name = xstrdup (wrapper);
-	  if (check_executable (concat_name))
-	    return concat_name;
-	  XFREE (concat_name);
-	}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-    }
-#endif
-
-  for (p = wrapper; *p; p++)
-    if (*p == '/')
-      {
-	has_slash = 1;
-	break;
-      }
-  if (!has_slash)
-    {
-      /* no slashes; search PATH */
-      const char *path = getenv ("PATH");
-      if (path != NULL)
-	{
-	  for (p = path; *p; p = p_next)
-	    {
-	      const char *q;
-	      size_t p_len;
-	      for (q = p; *q; q++)
-		if (IS_PATH_SEPARATOR (*q))
-		  break;
-	      p_len = q - p;
-	      p_next = (*q == '\0' ? q : q + 1);
-	      if (p_len == 0)
-		{
-		  /* empty path: current directory */
-		  if (getcwd (tmp, LT_PATHMAX) == NULL)
-		    lt_fatal ("getcwd failed");
-		  tmp_len = strlen (tmp);
-		  concat_name =
-		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, tmp, tmp_len);
-		  concat_name[tmp_len] = '/';
-		  strcpy (concat_name + tmp_len + 1, wrapper);
-		}
-	      else
-		{
-		  concat_name =
-		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, p, p_len);
-		  concat_name[p_len] = '/';
-		  strcpy (concat_name + p_len + 1, wrapper);
-		}
-	      if (check_executable (concat_name))
-		return concat_name;
-	      XFREE (concat_name);
-	    }
-	}
-      /* not found in PATH; assume curdir */
-    }
-  /* Relative path | not found in path: prepend cwd */
-  if (getcwd (tmp, LT_PATHMAX) == NULL)
-    lt_fatal ("getcwd failed");
-  tmp_len = strlen (tmp);
-  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-  memcpy (concat_name, tmp, tmp_len);
-  concat_name[tmp_len] = '/';
-  strcpy (concat_name + tmp_len + 1, wrapper);
-
-  if (check_executable (concat_name))
-    return concat_name;
-  XFREE (concat_name);
-  return NULL;
-}
-
-char *
-chase_symlinks (const char *pathspec)
-{
-#ifndef S_ISLNK
-  return xstrdup (pathspec);
-#else
-  char buf[LT_PATHMAX];
-  struct stat s;
-  char *tmp_pathspec = xstrdup (pathspec);
-  char *p;
-  int has_symlinks = 0;
-  while (strlen (tmp_pathspec) && !has_symlinks)
-    {
-      LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
-			      tmp_pathspec));
-      if (lstat (tmp_pathspec, &s) == 0)
-	{
-	  if (S_ISLNK (s.st_mode) != 0)
-	    {
-	      has_symlinks = 1;
-	      break;
-	    }
-
-	  /* search backwards for last DIR_SEPARATOR */
-	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
-	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    p--;
-	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    {
-	      /* no more DIR_SEPARATORS left */
-	      break;
-	    }
-	  *p = '\0';
-	}
-      else
-	{
-	  char *errstr = strerror (errno);
-	  lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
-	}
-    }
-  XFREE (tmp_pathspec);
-
-  if (!has_symlinks)
-    {
-      return xstrdup (pathspec);
-    }
-
-  tmp_pathspec = realpath (pathspec, buf);
-  if (tmp_pathspec == 0)
-    {
-      lt_fatal ("Could not follow symlinks for %s", pathspec);
-    }
-  return xstrdup (tmp_pathspec);
-#endif
-}
-
-char *
-strendzap (char *str, const char *pat)
-{
-  size_t len, patlen;
-
-  assert (str != NULL);
-  assert (pat != NULL);
-
-  len = strlen (str);
-  patlen = strlen (pat);
-
-  if (patlen <= len)
-    {
-      str += len - patlen;
-      if (strcmp (str, pat) == 0)
-	*str = '\0';
-    }
-  return str;
-}
-
-static void
-lt_error_core (int exit_status, const char *mode,
-	       const char *message, va_list ap)
-{
-  fprintf (stderr, "%s: %s: ", program_name, mode);
-  vfprintf (stderr, message, ap);
-  fprintf (stderr, ".\n");
-
-  if (exit_status >= 0)
-    exit (exit_status);
-}
-
-void
-lt_fatal (const char *message, ...)
-{
-  va_list ap;
-  va_start (ap, message);
-  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
-  va_end (ap);
-}
-
-void
-lt_setenv (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-  {
-#ifdef HAVE_SETENV
-    /* always make a copy, for consistency with !HAVE_SETENV */
-    char *str = xstrdup (value);
-    setenv (name, str, 1);
-#else
-    int len = strlen (name) + 1 + strlen (value) + 1;
-    char *str = XMALLOC (char, len);
-    sprintf (str, "%s=%s", name, value);
-    if (putenv (str) != EXIT_SUCCESS)
-      {
-        XFREE (str);
-      }
-#endif
-  }
-}
-
-char *
-lt_extend_str (const char *orig_value, const char *add, int to_end)
-{
-  char *new_value;
-  if (orig_value && *orig_value)
-    {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
-      new_value = XMALLOC (char, add_len + orig_value_len + 1);
-      if (to_end)
-        {
-          strcpy (new_value, orig_value);
-          strcpy (new_value + orig_value_len, add);
-        }
-      else
-        {
-          strcpy (new_value, add);
-          strcpy (new_value + add_len, orig_value);
-        }
-    }
-  else
-    {
-      new_value = xstrdup (add);
-    }
-  return new_value;
-}
-
-void
-lt_update_exe_path (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
-        {
-          new_value[len-1] = '\0';
-        }
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-void
-lt_update_lib_path (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-EOF
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-
-/* Prepares an argument vector before calling spawn().
-   Note that spawn() does not by itself call the command interpreter
-     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
-      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-         GetVersionEx(&v);
-         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
-      }) ? "cmd.exe" : "command.com").
-   Instead it simply concatenates the arguments, separated by ' ', and calls
-   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
-   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
-   special way:
-   - Space and tab are interpreted as delimiters. They are not treated as
-     delimiters if they are surrounded by double quotes: "...".
-   - Unescaped double quotes are removed from the input. Their only effect is
-     that within double quotes, space and tab are treated like normal
-     characters.
-   - Backslashes not followed by double quotes are not special.
-   - But 2*n+1 backslashes followed by a double quote become
-     n backslashes followed by a double quote (n >= 0):
-       \" -> "
-       \\\" -> \"
-       \\\\\" -> \\"
- */
-#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-char **
-prepare_spawn (char **argv)
-{
-  size_t argc;
-  char **new_argv;
-  size_t i;
-
-  /* Count number of arguments.  */
-  for (argc = 0; argv[argc] != NULL; argc++)
-    ;
-
-  /* Allocate new argument vector.  */
-  new_argv = XMALLOC (char *, argc + 1);
-
-  /* Put quoted arguments into the new argument vector.  */
-  for (i = 0; i < argc; i++)
-    {
-      const char *string = argv[i];
-
-      if (string[0] == '\0')
-	new_argv[i] = xstrdup ("\"\"");
-      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
-	{
-	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
-	  size_t length;
-	  unsigned int backslashes;
-	  const char *s;
-	  char *quoted_string;
-	  char *p;
-
-	  length = 0;
-	  backslashes = 0;
-	  if (quote_around)
-	    length++;
-	  for (s = string; *s != '\0'; s++)
-	    {
-	      char c = *s;
-	      if (c == '"')
-		length += backslashes + 1;
-	      length++;
-	      if (c == '\\')
-		backslashes++;
-	      else
-		backslashes = 0;
-	    }
-	  if (quote_around)
-	    length += backslashes + 1;
-
-	  quoted_string = XMALLOC (char, length + 1);
-
-	  p = quoted_string;
-	  backslashes = 0;
-	  if (quote_around)
-	    *p++ = '"';
-	  for (s = string; *s != '\0'; s++)
-	    {
-	      char c = *s;
-	      if (c == '"')
-		{
-		  unsigned int j;
-		  for (j = backslashes + 1; j > 0; j--)
-		    *p++ = '\\';
-		}
-	      *p++ = c;
-	      if (c == '\\')
-		backslashes++;
-	      else
-		backslashes = 0;
-	    }
-	  if (quote_around)
-	    {
-	      unsigned int j;
-	      for (j = backslashes; j > 0; j--)
-		*p++ = '\\';
-	      *p++ = '"';
-	    }
-	  *p = '\0';
-
-	  new_argv[i] = quoted_string;
-	}
-      else
-	new_argv[i] = (char *) string;
-    }
-  new_argv[argc] = NULL;
-
-  return new_argv;
-}
-EOF
-		;;
-	    esac
-
-            cat <<"EOF"
-void lt_dump_script (FILE* f)
-{
-EOF
-	    func_emit_wrapper yes |
-              $SED -e 's/\([\\"]\)/\\\1/g' \
-	           -e 's/^/  fputs ("/' -e 's/$/\\n", f);/'
-
-            cat <<"EOF"
-}
-EOF
-}
-# end: func_emit_cwrapperexe_src
-
-# func_win32_import_lib_p ARG
-# True if ARG is an import lib, as indicated by $file_magic_cmd
-func_win32_import_lib_p ()
-{
-    $opt_debug
-    case `eval "$file_magic_cmd \"\$1\" 2>/dev/null" | $SED -e 10q` in
-    *import*) : ;;
-    *) false ;;
-    esac
-}
-
-# func_mode_link arg...
-func_mode_link ()
-{
-    $opt_debug
-    case $host in
-    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-      # It is impossible to link a dll without this setting, and
-      # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
-      # flag for every libtool invocation.
-      # allow_undefined=no
-
-      # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
-      # even a static library is built.  For now, we need to specify
-      # -no-undefined on the libtool link line when we can be certain
-      # that all symbols are satisfied, otherwise we get a static library.
-      allow_undefined=yes
-      ;;
-    *)
-      allow_undefined=yes
-      ;;
-    esac
-    libtool_args=$nonopt
-    base_compile="$nonopt $@"
-    compile_command=$nonopt
-    finalize_command=$nonopt
-
-    compile_rpath=
-    finalize_rpath=
-    compile_shlibpath=
-    finalize_shlibpath=
-    convenience=
-    old_convenience=
-    deplibs=
-    old_deplibs=
-    compiler_flags=
-    linker_flags=
-    dllsearchpath=
-    lib_search_path=`pwd`
-    inst_prefix_dir=
-    new_inherited_linker_flags=
-
-    avoid_version=no
-    bindir=
-    dlfiles=
-    dlprefiles=
-    dlself=no
-    export_dynamic=no
-    export_symbols=
-    export_symbols_regex=
-    generated=
-    libobjs=
-    ltlibs=
-    module=no
-    no_install=no
-    objs=
-    non_pic_objects=
-    precious_files_regex=
-    prefer_static_libs=no
-    preload=no
-    prev=
-    prevarg=
-    release=
-    rpath=
-    xrpath=
-    perm_rpath=
-    temp_rpath=
-    thread_safe=no
-    vinfo=
-    vinfo_number=no
-    weak_libs=
-    single_module="${wl}-single_module"
-    func_infer_tag $base_compile
-
-    # We need to know -static, to get the right output filenames.
-    for arg
-    do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	break
-	;;
-      -all-static | -static | -static-libtool-libs)
-	case $arg in
-	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
-	    func_warning "complete static linking is impossible in this configuration"
-	  fi
-	  if test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	-static)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=built
-	  ;;
-	-static-libtool-libs)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	esac
-	build_libtool_libs=no
-	build_old_libs=yes
-	break
-	;;
-      esac
-    done
-
-    # See if our shared archives depend on static archives.
-    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
-    # Go through the arguments, transforming them on the way.
-    while test "$#" -gt 0; do
-      arg="$1"
-      shift
-      func_quote_for_eval "$arg"
-      qarg=$func_quote_for_eval_unquoted_result
-      func_append libtool_args " $func_quote_for_eval_result"
-
-      # If the previous option needs an argument, assign it.
-      if test -n "$prev"; then
-	case $prev in
-	output)
-	  func_append compile_command " @OUTPUT@"
-	  func_append finalize_command " @OUTPUT@"
-	  ;;
-	esac
-
-	case $prev in
-	bindir)
-	  bindir="$arg"
-	  prev=
-	  continue
-	  ;;
-	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
-	    # Add the symbol object into the linking commands.
-	    func_append compile_command " @SYMFILE@"
-	    func_append finalize_command " @SYMFILE@"
-	    preload=yes
-	  fi
-	  case $arg in
-	  *.la | *.lo) ;;  # We handle these cases below.
-	  force)
-	    if test "$dlself" = no; then
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  self)
-	    if test "$prev" = dlprefiles; then
-	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
-	      dlself=yes
-	    else
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  *)
-	    if test "$prev" = dlfiles; then
-	      dlfiles="$dlfiles $arg"
-	    else
-	      dlprefiles="$dlprefiles $arg"
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  esac
-	  ;;
-	expsyms)
-	  export_symbols="$arg"
-	  test -f "$arg" \
-	    || func_fatal_error "symbol file \`$arg' does not exist"
-	  prev=
-	  continue
-	  ;;
-	expsyms_regex)
-	  export_symbols_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	framework)
-	  case $host in
-	    *-*-darwin*)
-	      case "$deplibs " in
-		*" $qarg.ltframework "*) ;;
-		*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
-		   ;;
-	      esac
-	      ;;
-	  esac
-	  prev=
-	  continue
-	  ;;
-	inst_prefix)
-	  inst_prefix_dir="$arg"
-	  prev=
-	  continue
-	  ;;
-	objectlist)
-	  if test -f "$arg"; then
-	    save_arg=$arg
-	    moreargs=
-	    for fil in `cat "$save_arg"`
-	    do
-#	      moreargs="$moreargs $fil"
-	      arg=$fil
-	      # A libtool-controlled object.
-
-	      # Check to see that this really is a libtool object.
-	      if func_lalib_unsafe_p "$arg"; then
-		pic_object=
-		non_pic_object=
-
-		# Read the .lo file
-		func_source "$arg"
-
-		if test -z "$pic_object" ||
-		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none &&
-		   test "$non_pic_object" = none; then
-		  func_fatal_error "cannot find name of object for \`$arg'"
-		fi
-
-		# Extract subdirectory from the argument.
-		func_dirname "$arg" "/" ""
-		xdir="$func_dirname_result"
-
-		if test "$pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
-
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		      dlfiles="$dlfiles $pic_object"
-		      prev=
-		      continue
-		    else
-		      # If libtool objects are unsupported, then we need to preload.
-		      prev=dlprefiles
-		    fi
-		  fi
-
-		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
-		    # Preload the old-style object.
-		    dlprefiles="$dlprefiles $pic_object"
-		    prev=
-		  fi
-
-		  # A PIC object.
-		  func_append libobjs " $pic_object"
-		  arg="$pic_object"
-		fi
-
-		# Non-PIC object.
-		if test "$non_pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
-
-		  # A standard non-PIC object
-		  func_append non_pic_objects " $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
-		  fi
-		else
-		  # If the PIC object exists, use it instead.
-		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-		fi
-	      else
-		# Only an error if not doing a dry-run.
-		if $opt_dry_run; then
-		  # Extract subdirectory from the argument.
-		  func_dirname "$arg" "/" ""
-		  xdir="$func_dirname_result"
-
-		  func_lo2o "$arg"
-		  pic_object=$xdir$objdir/$func_lo2o_result
-		  non_pic_object=$xdir$func_lo2o_result
-		  func_append libobjs " $pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-	        else
-		  func_fatal_error "\`$arg' is not a valid libtool object"
-		fi
-	      fi
-	    done
-	  else
-	    func_fatal_error "link input file \`$arg' does not exist"
-	  fi
-	  arg=$save_arg
-	  prev=
-	  continue
-	  ;;
-	precious_regex)
-	  precious_files_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	release)
-	  release="-$arg"
-	  prev=
-	  continue
-	  ;;
-	rpath | xrpath)
-	  # We need an absolute path.
-	  case $arg in
-	  [\\/]* | [A-Za-z]:[\\/]*) ;;
-	  *)
-	    func_fatal_error "only absolute run-paths are allowed"
-	    ;;
-	  esac
-	  if test "$prev" = rpath; then
-	    case "$rpath " in
-	    *" $arg "*) ;;
-	    *) rpath="$rpath $arg" ;;
-	    esac
-	  else
-	    case "$xrpath " in
-	    *" $arg "*) ;;
-	    *) xrpath="$xrpath $arg" ;;
-	    esac
-	  fi
-	  prev=
-	  continue
-	  ;;
-	shrext)
-	  shrext_cmds="$arg"
-	  prev=
-	  continue
-	  ;;
-	weak)
-	  weak_libs="$weak_libs $arg"
-	  prev=
-	  continue
-	  ;;
-	xcclinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xcompiler)
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xlinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $wl$qarg"
-	  prev=
-	  func_append compile_command " $wl$qarg"
-	  func_append finalize_command " $wl$qarg"
-	  continue
-	  ;;
-	*)
-	  eval "$prev=\"\$arg\""
-	  prev=
-	  continue
-	  ;;
-	esac
-      fi # test -n "$prev"
-
-      prevarg="$arg"
-
-      case $arg in
-      -all-static)
-	if test -n "$link_static_flag"; then
-	  # See comment for -static flag below, for more details.
-	  func_append compile_command " $link_static_flag"
-	  func_append finalize_command " $link_static_flag"
-	fi
-	continue
-	;;
-
-      -allow-undefined)
-	# FIXME: remove this flag sometime in the future.
-	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
-	;;
-
-      -avoid-version)
-	avoid_version=yes
-	continue
-	;;
-
-      -bindir)
-	prev=bindir
-	continue
-	;;
-
-      -dlopen)
-	prev=dlfiles
-	continue
-	;;
-
-      -dlpreopen)
-	prev=dlprefiles
-	continue
-	;;
-
-      -export-dynamic)
-	export_dynamic=yes
-	continue
-	;;
-
-      -export-symbols | -export-symbols-regex)
-	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	  func_fatal_error "more than one -exported-symbols argument is not allowed"
-	fi
-	if test "X$arg" = "X-export-symbols"; then
-	  prev=expsyms
-	else
-	  prev=expsyms_regex
-	fi
-	continue
-	;;
-
-      -framework)
-	prev=framework
-	continue
-	;;
-
-      -inst-prefix-dir)
-	prev=inst_prefix
-	continue
-	;;
-
-      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
-      # so, if we see these flags be careful not to treat them like -L
-      -L[A-Z][A-Z]*:*)
-	case $with_gcc/$host in
-	no/*-*-irix* | /*-*-irix*)
-	  func_append compile_command " $arg"
-	  func_append finalize_command " $arg"
-	  ;;
-	esac
-	continue
-	;;
-
-      -L*)
-	func_stripname '-L' '' "$arg"
-	dir=$func_stripname_result
-	if test -z "$dir"; then
-	  if test "$#" -gt 0; then
-	    func_fatal_error "require no space between \`-L' and \`$1'"
-	  else
-	    func_fatal_error "need path for \`-L' option"
-	  fi
-	fi
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  absdir=`cd "$dir" && pwd`
-	  test -z "$absdir" && \
-	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
-	  dir="$absdir"
-	  ;;
-	esac
-	case "$deplibs " in
-	*" -L$dir "*) ;;
-	*)
-	  deplibs="$deplibs -L$dir"
-	  lib_search_path="$lib_search_path $dir"
-	  ;;
-	esac
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$dir:"*) ;;
-	  ::) dllsearchpath=$dir;;
-	  *) dllsearchpath="$dllsearchpath:$dir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-	continue
-	;;
-
-      -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
-	    # These systems don't actually have a C or math library (as such)
-	    continue
-	    ;;
-	  *-*-os2*)
-	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C and math libraries are in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    continue
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-linux*)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  esac
-	elif test "X$arg" = "X-lc_r"; then
-	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	   # Do not include libc_r directly, use -pthread flag.
-	   continue
-	   ;;
-	 esac
-	fi
-	deplibs="$deplibs $arg"
-	continue
-	;;
-
-      -module)
-	module=yes
-	continue
-	;;
-
-      # Tru64 UNIX uses -model [arg] to determine the layout of C++
-      # classes, name mangling, and exception handling.
-      # Darwin uses the -arch flag to determine output architecture.
-      -model|-arch|-isysroot)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	prev=xcompiler
-	continue
-	;;
-
-      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	case "$new_inherited_linker_flags " in
-	    *" $arg "*) ;;
-	    * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
-	esac
-	continue
-	;;
-
-      -multi_module)
-	single_module="${wl}-multi_module"
-	continue
-	;;
-
-      -no-fast-install)
-	fast_install=no
-	continue
-	;;
-
-      -no-install)
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
-	  # The PATH hackery in wrapper scripts is required on Windows
-	  # and Darwin in order for the loader to find any dlls it needs.
-	  func_warning "\`-no-install' is ignored for $host"
-	  func_warning "assuming \`-no-fast-install' instead"
-	  fast_install=no
-	  ;;
-	*) no_install=yes ;;
-	esac
-	continue
-	;;
-
-      -no-undefined)
-	allow_undefined=no
-	continue
-	;;
-
-      -objectlist)
-	prev=objectlist
-	continue
-	;;
-
-      -o) prev=output ;;
-
-      -precious-files-regex)
-	prev=precious_regex
-	continue
-	;;
-
-      -release)
-	prev=release
-	continue
-	;;
-
-      -rpath)
-	prev=rpath
-	continue
-	;;
-
-      -R)
-	prev=xrpath
-	continue
-	;;
-
-      -R*)
-	func_stripname '-R' '' "$arg"
-	dir=$func_stripname_result
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  func_fatal_error "only absolute run-paths are allowed"
-	  ;;
-	esac
-	case "$xrpath " in
-	*" $dir "*) ;;
-	*) xrpath="$xrpath $dir" ;;
-	esac
-	continue
-	;;
-
-      -shared)
-	# The effects of -shared are defined in a previous loop.
-	continue
-	;;
-
-      -shrext)
-	prev=shrext
-	continue
-	;;
-
-      -static | -static-libtool-libs)
-	# The effects of -static are defined in a previous loop.
-	# We used to do the same as -all-static on platforms that
-	# didn't have a PIC flag, but the assumption that the effects
-	# would be equivalent was wrong.  It would break on at least
-	# Digital Unix and AIX.
-	continue
-	;;
-
-      -thread-safe)
-	thread_safe=yes
-	continue
-	;;
-
-      -version-info)
-	prev=vinfo
-	continue
-	;;
-
-      -version-number)
-	prev=vinfo
-	vinfo_number=yes
-	continue
-	;;
-
-      -weak)
-        prev=weak
-	continue
-	;;
-
-      -Wc,*)
-	func_stripname '-Wc,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Wl,*)
-	func_stripname '-Wl,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $wl$func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
-	  linker_flags="$linker_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Xcompiler)
-	prev=xcompiler
-	continue
-	;;
-
-      -Xlinker)
-	prev=xlinker
-	continue
-	;;
-
-      -XCClinker)
-	prev=xcclinker
-	continue
-	;;
-
-      # -msg_* for osf cc
-      -msg_*)
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
-      # -r[0-9][0-9]* specifies the processor on the SGI compiler
-      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
-      # +DA*, +DD* enable 64-bit mode on the HP compiler
-      # -q* pass through compiler args for the IBM compiler
-      # -m*, -t[45]*, -txscale* pass through architecture-specific
-      # compiler args for GCC
-      # -F/path gives path to uninstalled frameworks, gcc on darwin
-      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
-      # @file GCC response files
-      # -tp=* Portland pgcc target processor selection
-      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-        func_append compile_command " $arg"
-        func_append finalize_command " $arg"
-        compiler_flags="$compiler_flags $arg"
-        continue
-        ;;
-
-      # Some other compiler flag.
-      -* | +*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      *.$objext)
-	# A standard object.
-	objs="$objs $arg"
-	;;
-
-      *.lo)
-	# A libtool-controlled object.
-
-	# Check to see that this really is a libtool object.
-	if func_lalib_unsafe_p "$arg"; then
-	  pic_object=
-	  non_pic_object=
-
-	  # Read the .lo file
-	  func_source "$arg"
-
-	  if test -z "$pic_object" ||
-	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none &&
-	     test "$non_pic_object" = none; then
-	    func_fatal_error "cannot find name of object for \`$arg'"
-	  fi
-
-	  # Extract subdirectory from the argument.
-	  func_dirname "$arg" "/" ""
-	  xdir="$func_dirname_result"
-
-	  if test "$pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
-
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		dlfiles="$dlfiles $pic_object"
-		prev=
-		continue
-	      else
-		# If libtool objects are unsupported, then we need to preload.
-		prev=dlprefiles
-	      fi
-	    fi
-
-	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
-	      # Preload the old-style object.
-	      dlprefiles="$dlprefiles $pic_object"
-	      prev=
-	    fi
-
-	    # A PIC object.
-	    func_append libobjs " $pic_object"
-	    arg="$pic_object"
-	  fi
-
-	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
-
-	    # A standard non-PIC object
-	    func_append non_pic_objects " $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
-	    fi
-	  else
-	    # If the PIC object exists, use it instead.
-	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  fi
-	else
-	  # Only an error if not doing a dry-run.
-	  if $opt_dry_run; then
-	    # Extract subdirectory from the argument.
-	    func_dirname "$arg" "/" ""
-	    xdir="$func_dirname_result"
-
-	    func_lo2o "$arg"
-	    pic_object=$xdir$objdir/$func_lo2o_result
-	    non_pic_object=$xdir$func_lo2o_result
-	    func_append libobjs " $pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  else
-	    func_fatal_error "\`$arg' is not a valid libtool object"
-	  fi
-	fi
-	;;
-
-      *.$libext)
-	# An archive.
-	deplibs="$deplibs $arg"
-	old_deplibs="$old_deplibs $arg"
-	continue
-	;;
-
-      *.la)
-	# A libtool-controlled library.
-
-	if test "$prev" = dlfiles; then
-	  # This library was specified with -dlopen.
-	  dlfiles="$dlfiles $arg"
-	  prev=
-	elif test "$prev" = dlprefiles; then
-	  # The library was specified with -dlpreopen.
-	  dlprefiles="$dlprefiles $arg"
-	  prev=
-	else
-	  deplibs="$deplibs $arg"
-	fi
-	continue
-	;;
-
-      # Some other compiler argument.
-      *)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-      esac # arg
-
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-      fi
-    done # argument parsing loop
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
-
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval "arg=\"$export_dynamic_flag_spec\""
-      func_append compile_command " $arg"
-      func_append finalize_command " $arg"
-    fi
-
-    oldlibs=
-    # calculate the name of the file, without its directory
-    func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
-
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
-    else
-      shlib_search_path=
-    fi
-    eval "sys_lib_search_path=\"$sys_lib_search_path_spec\""
-    eval "sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\""
-
-    func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
-    # Create the object directory.
-    func_mkdir_p "$output_objdir"
-
-    # Determine the type of output
-    case $output in
-    "")
-      func_fatal_help "you must specify an output file"
-      ;;
-    *.$libext) linkmode=oldlib ;;
-    *.lo | *.$objext) linkmode=obj ;;
-    *.la) linkmode=lib ;;
-    *) linkmode=prog ;; # Anything else should be a program.
-    esac
-
-    specialdeplibs=
-
-    libs=
-    # Find all interdependent deplibs by searching for libraries
-    # that are linked more than once (e.g. -la -lb -la)
-    for deplib in $deplibs; do
-      if $opt_duplicate_deps ; then
-	case "$libs " in
-	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	esac
-      fi
-      libs="$libs $deplib"
-    done
-
-    if test "$linkmode" = lib; then
-      libs="$predeps $libs $compiler_lib_search_path $postdeps"
-
-      # Compute libraries that are listed more than once in $predeps
-      # $postdeps and mark them as special (i.e., whose duplicates are
-      # not to be eliminated).
-      pre_post_deps=
-      if $opt_duplicate_compiler_generated_deps; then
-	for pre_post_dep in $predeps $postdeps; do
-	  case "$pre_post_deps " in
-	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
-	  esac
-	  pre_post_deps="$pre_post_deps $pre_post_dep"
-	done
-      fi
-      pre_post_deps=
-    fi
-
-    deplibs=
-    newdependency_libs=
-    newlib_search_path=
-    need_relink=no # whether we're linking any uninstalled libtool libraries
-    notinst_deplibs= # not-installed libtool libraries
-    notinst_path= # paths that contain not-installed libtool libraries
-
-    case $linkmode in
-    lib)
-	passes="conv dlpreopen link"
-	for file in $dlfiles $dlprefiles; do
-	  case $file in
-	  *.la) ;;
-	  *)
-	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
-	    ;;
-	  esac
-	done
-	;;
-    prog)
-	compile_deplibs=
-	finalize_deplibs=
-	alldeplibs=no
-	newdlfiles=
-	newdlprefiles=
-	passes="conv scan dlopen dlpreopen link"
-	;;
-    *)  passes="conv"
-	;;
-    esac
-
-    for pass in $passes; do
-      # The preopen pass in lib mode reverses $deplibs; put it back here
-      # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
-	## FIXME: Find the place where the list is rebuilt in the wrong
-	##        order, and fix it there properly
-        tmp_deplibs=
-	for deplib in $deplibs; do
-	  tmp_deplibs="$deplib $tmp_deplibs"
-	done
-	deplibs="$tmp_deplibs"
-      fi
-
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
-	deplibs=
-      fi
-      if test "$linkmode" = prog; then
-	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
-	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
-	esac
-      fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
-	# Collect and forward deplibs of preopened libtool libs
-	for lib in $dlprefiles; do
-	  # Ignore non-libtool-libs
-	  dependency_libs=
-	  case $lib in
-	  *.la)	func_source "$lib" ;;
-	  esac
-
-	  # Collect preopened libtool deplibs, except any this library
-	  # has declared as weak libs
-	  for deplib in $dependency_libs; do
-	    func_basename "$deplib"
-            deplib_base=$func_basename_result
-	    case " $weak_libs " in
-	    *" $deplib_base "*) ;;
-	    *) deplibs="$deplibs $deplib" ;;
-	    esac
-	  done
-	done
-	libs="$dlprefiles"
-      fi
-      if test "$pass" = dlopen; then
-	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
-	deplibs=
-      fi
-
-      for deplib in $libs; do
-	lib=
-	found=no
-	case $deplib in
-	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    compiler_flags="$compiler_flags $deplib"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    func_warning "\`-l' is ignored for archives/objects"
-	    continue
-	  fi
-	  func_stripname '-l' '' "$deplib"
-	  name=$func_stripname_result
-	  if test "$linkmode" = lib; then
-	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
-	  else
-	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
-	  fi
-	  for searchdir in $searchdirs; do
-	    for search_ext in .la $std_shrext .so .a; do
-	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
-	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
-		else
-		  found=no
-		fi
-		break 2
-	      fi
-	    done
-	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
-	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
-	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	      case " $predeps $postdeps " in
-	      *" $deplib "*)
-		if func_lalib_p "$lib"; then
-		  library_names=
-		  old_library=
-		  func_source "$lib"
-		  for l in $old_library $library_names; do
-		    ll="$l"
-		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
-		    func_dirname "$lib" "" "."
-		    ladir="$func_dirname_result"
-		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
-		      compile_deplibs="$deplib $compile_deplibs"
-		      finalize_deplibs="$deplib $finalize_deplibs"
-		    else
-		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-		    fi
-		    continue
-		  fi
-		fi
-		;;
-	      *) ;;
-	      esac
-	    fi
-	  fi
-	  ;; # -l
-	*.ltframework)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    deplibs="$deplib $deplibs"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-L*)
-	  case $linkmode in
-	  lib)
-	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
-	    newdependency_libs="$deplib $newdependency_libs"
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  prog)
-	    if test "$pass" = conv; then
-	      deplibs="$deplib $deplibs"
-	      continue
-	    fi
-	    if test "$pass" = scan; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  *)
-	    func_warning "\`-L' is ignored for archives/objects"
-	    ;;
-	  esac # linkmode
-	  continue
-	  ;; # -L
-	-R*)
-	  if test "$pass" = link; then
-	    func_stripname '-R' '' "$deplib"
-	    dir=$func_stripname_result
-	    # Make sure the xrpath contains only unique directories.
-	    case "$xrpath " in
-	    *" $dir "*) ;;
-	    *) xrpath="$xrpath $dir" ;;
-	    esac
-	  fi
-	  deplibs="$deplib $deplibs"
-	  continue
-	  ;;
-	*.la) lib="$deplib" ;;
-	*.$libext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	    continue
-	  fi
-	  case $linkmode in
-	  lib)
-	    # Linking convenience modules into shared libraries is allowed,
-	    # but linking other static libraries is non-portable.
-	    case " $dlpreconveniencelibs " in
-	    *" $deplib "*) ;;
-	    *)
-	      valid_a_lib=no
-	      case $deplibs_check_method in
-		match_pattern*)
-		  set dummy $deplibs_check_method; shift
-		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
-		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		    valid_a_lib=yes
-		  fi
-		;;
-		pass_all)
-		  valid_a_lib=yes
-		;;
-	      esac
-	      if test "$valid_a_lib" != yes; then
-		echo
-		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because the file extensions .$libext of this argument makes me believe"
-		echo "*** that it is just a static archive that I should not use here."
-	      else
-		echo
-		$ECHO "*** Warning: Linking the shared library $output against the"
-		$ECHO "*** static library $deplib is not portable!"
-		deplibs="$deplib $deplibs"
-	      fi
-	      ;;
-	    esac
-	    continue
-	    ;;
-	  prog)
-	    if test "$pass" != link; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    continue
-	    ;;
-	  esac # linkmode
-	  ;; # *.$libext
-	*.lo | *.$objext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
-	      # If there is no dlopen support or we're linking statically,
-	      # we need to preload.
-	      newdlprefiles="$newdlprefiles $deplib"
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      newdlfiles="$newdlfiles $deplib"
-	    fi
-	  fi
-	  continue
-	  ;;
-	%DEPLIBS%)
-	  alldeplibs=yes
-	  continue
-	  ;;
-	esac # case $deplib
-
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-	fi
-
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$lib" \
-	  || func_fatal_error "\`$lib' is not a valid libtool archive"
-
-	func_dirname "$lib" "" "."
-	ladir="$func_dirname_result"
-
-	dlname=
-	dlopen=
-	dlpreopen=
-	libdir=
-	library_names=
-	old_library=
-	inherited_linker_flags=
-	# If the library was installed with an old release of libtool,
-	# it will not redefine variables installed, or shouldnotlink
-	installed=yes
-	shouldnotlink=no
-	avoidtemprpath=
-
-
-	# Read the .la file
-	func_source "$lib"
-
-	# Convert "-framework foo" to "foo.ltframework"
-	if test -n "$inherited_linker_flags"; then
-	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
-	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
-	    case " $new_inherited_linker_flags " in
-	      *" $tmp_inherited_linker_flag "*) ;;
-	      *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
-	    esac
-	  done
-	fi
-	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
-	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
-	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
-	fi
-
-	if test "$pass" = conv; then
-	  # Only check for convenience libraries
-	  deplibs="$lib $deplibs"
-	  if test -z "$libdir"; then
-	    if test -z "$old_library"; then
-	      func_fatal_error "cannot find name of link library for \`$lib'"
-	    fi
-	    # It is a libtool convenience library, so add in its objects.
-	    convenience="$convenience $ladir/$objdir/$old_library"
-	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
-	  fi
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    deplibs="$deplib $deplibs"
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
-	  continue
-	fi # $pass = conv
-
-
-	# Get the name of the library we link against.
-	linklib=
-	for l in $old_library $library_names; do
-	  linklib="$l"
-	done
-	if test -z "$linklib"; then
-	  func_fatal_error "cannot find name of link library for \`$lib'"
-	fi
-
-	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-	  fi
-	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
-	    # If there is no dlname, no dlopen support or we're linking
-	    # statically, we need to preload.  We also need to preload any
-	    # dependent libraries so libltdl's deplib preloader doesn't
-	    # bomb out in the load deplibs phase.
-	    dlprefiles="$dlprefiles $lib $dependency_libs"
-	  else
-	    newdlfiles="$newdlfiles $lib"
-	  fi
-	  continue
-	fi # $pass = dlopen
-
-	# We need an absolute path.
-	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
-	*)
-	  abs_ladir=`cd "$ladir" && pwd`
-	  if test -z "$abs_ladir"; then
-	    func_warning "cannot determine absolute directory name of \`$ladir'"
-	    func_warning "passing it literally to the linker, although it might fail"
-	    abs_ladir="$ladir"
-	  fi
-	  ;;
-	esac
-	func_basename "$lib"
-	laname="$func_basename_result"
-
-	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
-	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    func_warning "library \`$lib' was moved."
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
-	  else
-	    dir="$libdir"
-	    absdir="$libdir"
-	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
-	else
-	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  fi
-	fi # $installed = yes
-	func_stripname 'lib' '.la' "$laname"
-	name=$func_stripname_result
-
-	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir" && test "$linkmode" = prog; then
-	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
-	  fi
-	  # Prefer using a static library (so that no silly _DYNAMIC symbols
-	  # are required to link).
-	  if test -n "$old_library"; then
-	    newdlprefiles="$newdlprefiles $dir/$old_library"
-	    # Keep a list of preopened convenience libraries to check
-	    # that they are being used correctly in the link pass.
-	    test -z "$libdir" && \
-		dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
-	  # Otherwise, use the dlname, so that lt_dlopen finds it.
-	  elif test -n "$dlname"; then
-	    newdlprefiles="$newdlprefiles $dir/$dlname"
-	  else
-	    newdlprefiles="$newdlprefiles $dir/$linklib"
-	  fi
-	fi # $pass = dlpreopen
-
-	if test -z "$libdir"; then
-	  # Link the convenience library
-	  if test "$linkmode" = lib; then
-	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$dir/$old_library $compile_deplibs"
-	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
-	  else
-	    deplibs="$lib $deplibs" # used for prog,scan pass
-	  fi
-	  continue
-	fi
-
-
-	if test "$linkmode" = prog && test "$pass" != link; then
-	  newlib_search_path="$newlib_search_path $ladir"
-	  deplibs="$lib $deplibs"
-
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
-	  fi
-
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    case $deplib in
-	    -L*) func_stripname '-L' '' "$deplib"
-	         newlib_search_path="$newlib_search_path $func_stripname_result"
-		 ;;
-	    esac
-	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      # Need to hardcode shared library paths
-	      # or/and link against static libraries
-	      newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done # for deplib
-	  continue
-	fi # $linkmode = prog...
-
-	if test "$linkmode,$pass" = "prog,link"; then
-	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
-	       test -z "$old_library"; }; then
-	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
-	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath:" in
-	      *"$absdir:"*) ;;
-	      *) temp_rpath="$temp_rpath$absdir:" ;;
-	      esac
-	    fi
-
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi # $linkmode,$pass = prog,link...
-
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
-		 test -n "$library_names"; }; }; then
-	    # We only need to search for static libraries
-	    continue
-	  fi
-	fi
-
-	link_static=no # Whether the deplib will be linked statically
-	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes; then
-	  use_static_libs=no
-	fi
-	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc*)
-	      # No point in relinking DLLs because paths are not encoded
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=no
-	    ;;
-	  *)
-	    if test "$installed" = no; then
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=yes
-	    fi
-	    ;;
-	  esac
-	  # This is a shared library
-
-	  # Warn about portability, can't link against -module's on some
-	  # systems (darwin).  Don't bleat about dlopened modules though!
-	  dlopenmodule=""
-	  for dlpremoduletest in $dlprefiles; do
-	    if test "X$dlpremoduletest" = "X$lib"; then
-	      dlopenmodule="$dlpremoduletest"
-	      break
-	    fi
-	  done
-	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
-	    echo
-	    if test "$linkmode" = prog; then
-	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
-	    else
-	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
-	    fi
-	    $ECHO "*** $linklib is not portable!"
-	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi
-
-	  if test -n "$old_archive_from_expsyms_cmds"; then
-	    # figure out the soname
-	    set dummy $library_names
-	    shift
-	    realname="$1"
-	    shift
-	    eval "libname=\"$libname_spec\""
-	    # use dlname if we got it. it's perfectly good, no?
-	    if test -n "$dlname"; then
-	      soname="$dlname"
-	    elif test -n "$soname_spec"; then
-	      # bleh windows
-	      case $host in
-	      *cygwin* | mingw* | *cegcc*)
-	        func_arith $current - $age
-		major=$func_arith_result
-		versuffix="-$major"
-		;;
-	      esac
-	      eval "soname=\"$soname_spec\""
-	    else
-	      soname="$realname"
-	    fi
-
-	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
-	    func_basename "$soroot"
-	    soname="$func_basename_result"
-	    func_stripname 'lib' '.dll' "$soname"
-	    newlib=libimp-$func_stripname_result.a
-
-	    # If the library has no export list, then create one now
-	    if test -f "$output_objdir/$soname-def"; then :
-	    else
-	      func_verbose "extracting exported symbol list from \`$soname'"
-	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
-	    fi
-
-	    # Create $newlib
-	    if test -f "$output_objdir/$newlib"; then :; else
-	      func_verbose "generating import library for \`$soname'"
-	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
-	    fi
-	    # make sure the library variables are pointing to the new library
-	    dir=$output_objdir
-	    linklib=$newlib
-	  fi # test -n "$old_archive_from_expsyms_cmds"
-
-	  if test "$linkmode" = prog || test "$mode" != relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    lib_linked=yes
-	    case $hardcode_action in
-	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
-		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
-		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
-		  *-*-darwin* )
-		    # if the lib is a (non-dlopened) module then we can not
-		    # link against it, someone is ignoring the earlier warnings
-		    if /usr/bin/file -L $add 2> /dev/null |
-			 $GREP ": [^:]* bundle" >/dev/null ; then
-		      if test "X$dlopenmodule" != "X$lib"; then
-			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
-			if test -z "$old_library" ; then
-			  echo
-			  echo "*** And there doesn't seem to be a static archive available"
-			  echo "*** The link will probably fail, sorry"
-			else
-			  add="$dir/$old_library"
-			fi
-		      elif test -n "$old_library"; then
-			add="$dir/$old_library"
-		      fi
-		    fi
-		esac
-	      elif test "$hardcode_minus_L" = no; then
-		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
-		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    relink)
-	      if test "$hardcode_direct" = yes &&
-	         test "$hardcode_direct_absolute" = no; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$absdir"
-		# Try looking first in the location we're being installed to.
-		if test -n "$inst_prefix_dir"; then
-		  case $libdir in
-		    [\\/]*)
-		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		      ;;
-		  esac
-		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    *) lib_linked=no ;;
-	    esac
-
-	    if test "$lib_linked" != yes; then
-	      func_fatal_configuration "unsupported hardcode properties"
-	    fi
-
-	    if test -n "$add_shlibpath"; then
-	      case :$compile_shlibpath: in
-	      *":$add_shlibpath:"*) ;;
-	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
-	      esac
-	    fi
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
-	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes &&
-		 test "$hardcode_minus_L" != yes &&
-		 test "$hardcode_shlibpath_var" = yes; then
-		case :$finalize_shlibpath: in
-		*":$libdir:"*) ;;
-		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-		esac
-	      fi
-	    fi
-	  fi
-
-	  if test "$linkmode" = prog || test "$mode" = relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes &&
-	       test "$hardcode_direct_absolute" = no; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
-	      case :$finalize_shlibpath: in
-	      *":$libdir:"*) ;;
-	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
-	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-		add="$inst_prefix_dir$libdir/$linklib"
-	      else
-		add="$libdir/$linklib"
-	      fi
-	    else
-	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
-	      # Try looking first in the location we're being installed to.
-	      if test -n "$inst_prefix_dir"; then
-		case $libdir in
-		  [\\/]*)
-		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		    ;;
-		esac
-	      fi
-	      add="-l$name"
-	    fi
-
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
-	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	    fi
-	  fi
-	elif test "$linkmode" = prog; then
-	  # Here we assume that one of hardcode_direct or hardcode_minus_L
-	  # is not unsupported.  This is valid on all known static and
-	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
-	    compile_deplibs="$dir/$linklib $compile_deplibs"
-	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
-	  else
-	    compile_deplibs="-l$name -L$dir $compile_deplibs"
-	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
-	  fi
-	elif test "$build_libtool_libs" = yes; then
-	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
-	    # We're trying link a shared library against a static one
-	    # but the system doesn't support it.
-
-	    # Just print a warning and add the library to dependency_libs so
-	    # that the program can be linked against the static library.
-	    echo
-	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
-	    echo "*** I have the capability to make that library automatically link in when"
-	    echo "*** you link to this library.  But I can only do this if you have a"
-	    echo "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
-	      echo "*** But as you try to build a module library, libtool will still create "
-	      echo "*** a static module, that should work as long as the dlopening application"
-	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
-	      if test -z "$global_symbol_pipe"; then
-		echo
-		echo "*** However, this would only work if libtool was able to extract symbol"
-		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-		echo "*** not find such a program.  So, this module is probably useless."
-		echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	      fi
-	      if test "$build_old_libs" = no; then
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  else
-	    deplibs="$dir/$old_library $deplibs"
-	    link_static=yes
-	  fi
-	fi # link shared/static library?
-
-	if test "$linkmode" = lib; then
-	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
-	    # Extract -R from dependency_libs
-	    temp_deplibs=
-	    for libdir in $dependency_libs; do
-	      case $libdir in
-	      -R*) func_stripname '-R' '' "$libdir"
-	           temp_xrpath=$func_stripname_result
-		   case " $xrpath " in
-		   *" $temp_xrpath "*) ;;
-		   *) xrpath="$xrpath $temp_xrpath";;
-		   esac;;
-	      *) temp_deplibs="$temp_deplibs $libdir";;
-	      esac
-	    done
-	    dependency_libs="$temp_deplibs"
-	  fi
-
-	  newlib_search_path="$newlib_search_path $absdir"
-	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
-	  # ... and its dependency_libs
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    newdependency_libs="$deplib $newdependency_libs"
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
-
-	  if test "$link_all_deplibs" != no; then
-	    # Add the search paths of all dependency libraries
-	    for deplib in $dependency_libs; do
-	      path=
-	      case $deplib in
-	      -L*) path="$deplib" ;;
-	      *.la)
-	        func_dirname "$deplib" "" "."
-		dir="$func_dirname_result"
-		# We need an absolute path.
-		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-		*)
-		  absdir=`cd "$dir" && pwd`
-		  if test -z "$absdir"; then
-		    func_warning "cannot determine absolute directory name of \`$dir'"
-		    absdir="$dir"
-		  fi
-		  ;;
-		esac
-		if $GREP "^installed=no" $deplib > /dev/null; then
-		case $host in
-		*-*-darwin*)
-		  depdepl=
-		  deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
-		      depdepl=$tmp
-		    done
-		    if test -f "$absdir/$objdir/$depdepl" ; then
-		      depdepl="$absdir/$objdir/$depdepl"
-		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
-                      if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
-                      fi
-		      compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-		      linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
-		      path=
-		    fi
-		  fi
-		  ;;
-		*)
-		  path="-L$absdir/$objdir"
-		  ;;
-		esac
-		else
-		  libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		  test -z "$libdir" && \
-		    func_fatal_error "\`$deplib' is not a valid libtool archive"
-		  test "$absdir" != "$libdir" && \
-		    func_warning "\`$deplib' seems to be moved"
-
-		  path="-L$absdir"
-		fi
-		;;
-	      esac
-	      case " $deplibs " in
-	      *" $path "*) ;;
-	      *) deplibs="$path $deplibs" ;;
-	      esac
-	    done
-	  fi # link_all_deplibs != no
-	fi # linkmode = lib
-      done # for deplib in $libs
-      if test "$pass" = link; then
-	if test "$linkmode" = "prog"; then
-	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
-	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
-	else
-	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	fi
-      fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
-	# Link the dlpreopened libraries before other libraries
-	for deplib in $save_deplibs; do
-	  deplibs="$deplib $deplibs"
-	done
-      fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
-	  # Make sure lib_search_path contains only unique directories.
-	  lib_search_path=
-	  for dir in $newlib_search_path; do
-	    case "$lib_search_path " in
-	    *" $dir "*) ;;
-	    *) lib_search_path="$lib_search_path $dir" ;;
-	    esac
-	  done
-	  newlib_search_path=
-	fi
-
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
-	  vars="compile_deplibs finalize_deplibs"
-	fi
-	for var in $vars dependency_libs; do
-	  # Add libraries to $var in reverse order
-	  eval tmp_libs=\$$var
-	  new_libs=
-	  for deplib in $tmp_libs; do
-	    # FIXME: Pedantically, this is the right thing to do, so
-	    #        that some nasty dependency loop isn't accidentally
-	    #        broken:
-	    #new_libs="$deplib $new_libs"
-	    # Pragmatically, this seems to cause very few problems in
-	    # practice:
-	    case $deplib in
-	    -L*) new_libs="$deplib $new_libs" ;;
-	    -R*) ;;
-	    *)
-	      # And here is the reason: when a library appears more
-	      # than once as an explicit dependence of a library, or
-	      # is implicitly linked in more than once by the
-	      # compiler, it is considered special, and multiple
-	      # occurrences thereof are not removed.  Compare this
-	      # with having the same library being listed as a
-	      # dependency of multiple other libraries: in this case,
-	      # we know (pedantically, we assume) the library does not
-	      # need to be listed more than once, so we keep only the
-	      # last copy.  This is not always right, but it is rare
-	      # enough that we require users that really mean to play
-	      # such unportable linking tricks to link the library
-	      # using -Wl,-lname, so that libtool does not consider it
-	      # for duplicate removal.
-	      case " $specialdeplibs " in
-	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
-	      *)
-		case " $new_libs " in
-		*" $deplib "*) ;;
-		*) new_libs="$deplib $new_libs" ;;
-		esac
-		;;
-	      esac
-	      ;;
-	    esac
-	  done
-	  tmp_libs=
-	  for deplib in $new_libs; do
-	    case $deplib in
-	    -L*)
-	      case " $tmp_libs " in
-	      *" $deplib "*) ;;
-	      *) tmp_libs="$tmp_libs $deplib" ;;
-	      esac
-	      ;;
-	    *) tmp_libs="$tmp_libs $deplib" ;;
-	    esac
-	  done
-	  eval $var=\$tmp_libs
-	done # for var
-      fi
-      # Last step: remove runtime libs from dependency_libs
-      # (they stay in deplibs)
-      tmp_libs=
-      for i in $dependency_libs ; do
-	case " $predeps $postdeps $compiler_lib_search_path " in
-	*" $i "*)
-	  i=""
-	  ;;
-	esac
-	if test -n "$i" ; then
-	  tmp_libs="$tmp_libs $i"
-	fi
-      done
-      dependency_libs=$tmp_libs
-    done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
-    fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
-    fi
-
-    case $linkmode in
-    oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for archives"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for archives" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for archives"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for archives"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info/-version-number' is ignored for archives"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for archives"
-
-      test -n "$export_symbols$export_symbols_regex" && \
-	func_warning "\`-export-symbols' is ignored for archives"
-
-      # Now set the variables for building old libraries.
-      build_libtool_libs=no
-      oldlibs="$output"
-      objs="$objs$old_deplibs"
-      ;;
-
-    lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
-      case $outputname in
-      lib*)
-	func_stripname 'lib' '.la' "$outputname"
-	name=$func_stripname_result
-	eval "shared_ext=\"$shrext_cmds\""
-	eval "libname=\"$libname_spec\""
-	;;
-      *)
-	test "$module" = no && \
-	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
-
-	if test "$need_lib_prefix" != no; then
-	  # Add the "lib" prefix for modules if required
-	  func_stripname '' '.la' "$outputname"
-	  name=$func_stripname_result
-	  eval "shared_ext=\"$shrext_cmds\""
-	  eval "libname=\"$libname_spec\""
-	else
-	  func_stripname '' '.la' "$outputname"
-	  libname=$func_stripname_result
-	fi
-	;;
-      esac
-
-      if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
-	else
-	  echo
-	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
-	  $ECHO "*** objects $objs is not portable!"
-	  libobjs="$libobjs $objs"
-	fi
-      fi
-
-      test "$dlself" != no && \
-	func_warning "\`-dlopen self' is ignored for libtool libraries"
-
-      set dummy $rpath
-      shift
-      test "$#" -gt 1 && \
-	func_warning "ignoring multiple \`-rpath's for a libtool library"
-
-      install_libdir="$1"
-
-      oldlibs=
-      if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
-	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
-	  # convenience libraries should have the same extension an
-	  # archive normally would.
-	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
-	  build_libtool_libs=convenience
-	  build_old_libs=yes
-	fi
-
-	test -n "$vinfo" && \
-	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
-
-	test -n "$release" && \
-	  func_warning "\`-release' is ignored for convenience libraries"
-      else
-
-	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
-	set dummy $vinfo 0 0 0
-	shift
-	IFS="$save_ifs"
-
-	test -n "$7" && \
-	  func_fatal_help "too many parameters to \`-version-info'"
-
-	# convert absolute version numbers to libtool ages
-	# this retains compatibility with .la files and attempts
-	# to make the code below a bit more comprehensible
-
-	case $vinfo_number in
-	yes)
-	  number_major="$1"
-	  number_minor="$2"
-	  number_revision="$3"
-	  #
-	  # There are really only two kinds -- those that
-	  # use the current revision as the major version
-	  # and those that subtract age and use age as
-	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
-	  #
-	  case $version_type in
-	  darwin|linux|osf|windows|none)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_revision"
-	    ;;
-	  freebsd-aout|freebsd-elf|qnx|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
-	    ;;
-	  irix|nonstopux)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_minor"
-	    lt_irix_increment=no
-	    ;;
-	  esac
-	  ;;
-	no)
-	  current="$1"
-	  revision="$2"
-	  age="$3"
-	  ;;
-	esac
-
-	# Check that each of the things are valid numbers.
-	case $current in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "CURRENT \`$current' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $revision in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "REVISION \`$revision' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $age in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "AGE \`$age' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	if test "$age" -gt "$current"; then
-	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	fi
-
-	# Calculate the version variables.
-	major=
-	versuffix=
-	verstring=
-	case $version_type in
-	none) ;;
-
-	darwin)
-	  # Like Linux, but with the current version available in
-	  # verstring for coding it into the library header
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  # Darwin ld doesn't like 0 for these options...
-	  func_arith $current + 1
-	  minor_current=$func_arith_result
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
-	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
-	  ;;
-
-	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
-	  ;;
-
-	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
-	    func_arith $current - $age
-	  else
-	    func_arith $current - $age + 1
-	  fi
-	  major=$func_arith_result
-
-	  case $version_type in
-	    nonstopux) verstring_prefix=nonstopux ;;
-	    *)         verstring_prefix=sgi ;;
-	  esac
-	  verstring="$verstring_prefix$major.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$revision
-	  while test "$loop" -ne 0; do
-	    func_arith $revision - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring_prefix$major.$iface:$verstring"
-	  done
-
-	  # Before this point, $major must not contain `.'.
-	  major=.$major
-	  versuffix="$major.$revision"
-	  ;;
-
-	linux)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  ;;
-
-	osf)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$age
-	  while test "$loop" -ne 0; do
-	    func_arith $current - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring:${iface}.0"
-	  done
-
-	  # Make executables depend on our current version.
-	  verstring="$verstring:${current}.0"
-	  ;;
-
-	qnx)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
-	  ;;
-
-	windows)
-	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
-	  func_arith $current - $age
-	  major=$func_arith_result
-	  versuffix="-$major"
-	  ;;
-
-	*)
-	  func_fatal_configuration "unknown library version type \`$version_type'"
-	  ;;
-	esac
-
-	# Clear the version info if we defaulted, and they specified a release.
-	if test -z "$vinfo" && test -n "$release"; then
-	  major=
-	  case $version_type in
-	  darwin)
-	    # we can't check for "0.0" in archive_cmds due to quoting
-	    # problems, so we reset it completely
-	    verstring=
-	    ;;
-	  *)
-	    verstring="0.0"
-	    ;;
-	  esac
-	  if test "$need_version" = no; then
-	    versuffix=
-	  else
-	    versuffix=".0.0"
-	  fi
-	fi
-
-	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
-	  major=
-	  versuffix=
-	  verstring=""
-	fi
-
-	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    func_warning "undefined symbols not allowed in $host shared libraries"
-	    build_libtool_libs=no
-	    build_old_libs=yes
-	  fi
-	else
-	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
-	fi
-
-      fi
-
-      func_generate_dlsyms "$libname" "$libname" "yes"
-      libobjs="$libobjs $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
-
-      if test "$mode" != relink; then
-	# Remove our outputs, but don't remove object files since they
-	# may have been created when compiling PIC objects.
-	removelist=
-	tempremovelist=`$ECHO "$output_objdir/*"`
-	for p in $tempremovelist; do
-	  case $p in
-	    *.$objext | *.gcno)
-	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
-		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
-		 then
-		   continue
-		 fi
-	       fi
-	       removelist="$removelist $p"
-	       ;;
-	    *) ;;
-	  esac
-	done
-	test -n "$removelist" && \
-	  func_show_eval "${RM}r \$removelist"
-      fi
-
-      # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-	oldlibs="$oldlibs $output_objdir/$libname.$libext"
-
-	# Transform .lo files to .o files.
-	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
-      fi
-
-      # Eliminate all temporary directories.
-      #for path in $notinst_path; do
-      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
-      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
-      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
-      #done
-
-      if test -n "$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	temp_xrpath=
-	for libdir in $xrpath; do
-	  temp_xrpath="$temp_xrpath -R$libdir"
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
-	  dependency_libs="$temp_xrpath $dependency_libs"
-	fi
-      fi
-
-      # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
-      dlfiles=
-      for lib in $old_dlfiles; do
-	case " $dlprefiles $dlfiles " in
-	*" $lib "*) ;;
-	*) dlfiles="$dlfiles $lib" ;;
-	esac
-      done
-
-      # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
-      dlprefiles=
-      for lib in $old_dlprefiles; do
-	case "$dlprefiles " in
-	*" $lib "*) ;;
-	*) dlprefiles="$dlprefiles $lib" ;;
-	esac
-      done
-
-      if test "$build_libtool_libs" = yes; then
-	if test -n "$rpath"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
-	    # these systems don't actually have a c library (as such)!
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C library is in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    ;;
-	  *-*-netbsd*)
-	    # Don't link with libc until the a.out ld.so is fixed.
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    ;;
-	  *)
-	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
-	      deplibs="$deplibs -lc"
-	    fi
-	    ;;
-	  esac
-	fi
-
-	# Transform deplibs into only deplibs that can be linked in shared.
-	name_save=$name
-	libname_save=$libname
-	release_save=$release
-	versuffix_save=$versuffix
-	major_save=$major
-	# I'm not sure if I'm treating the release correctly.  I think
-	# release should show up in the -l (ie -lgmp5) so we don't want to
-	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
-	newdeplibs=
-	droppeddeps=no
-	case $deplibs_check_method in
-	pass_all)
-	  # Don't check for shared/static.  Everything works.
-	  # This might be a little naive.  We might want to check
-	  # whether the library exists or not.  But this is on
-	  # osf3 & osf4 and I'm not really sure... Just
-	  # implementing what was already the behavior.
-	  newdeplibs=$deplibs
-	  ;;
-	test_compile)
-	  # This code stresses the "libraries are programs" paradigm to its
-	  # limits. Maybe even breaks it.  We compile a program, linking it
-	  # against the deplibs as a proxy for the library.  Then we can check
-	  # whether they linked in statically or dynamically with ldd.
-	  $opt_dry_run || $RM conftest.c
-	  cat > conftest.c <<EOF
-	  int main() { return 0; }
-EOF
-	  $opt_dry_run || $RM conftest
-	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
-	    ldd_output=`ldd conftest`
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		  case " $predeps $postdeps " in
-		  *" $i "*)
-		    newdeplibs="$newdeplibs $i"
-		    i=""
-		    ;;
-		  esac
-		fi
-		if test -n "$i" ; then
-		  eval "libname=\"$libname_spec\""
-		  eval "deplib_matches=\"$library_names_spec\""
-		  set dummy $deplib_matches; shift
-		  deplib_match=$1
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		    newdeplibs="$newdeplibs $i"
-		  else
-		    droppeddeps=yes
-		    echo
-		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		    echo "*** I have the capability to make that library automatically link in when"
-		    echo "*** you link to this library.  But I can only do this if you have a"
-		    echo "*** shared version of the library, which I believe you do not have"
-		    echo "*** because a test_compile did reveal that the linker did not use it for"
-		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
-		  fi
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  else
-	    # Error occurred in the first compile.  Let's try to salvage
-	    # the situation: Compile a separate program for each library.
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		$opt_dry_run || $RM conftest
-		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
-		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		    case " $predeps $postdeps " in
-		    *" $i "*)
-		      newdeplibs="$newdeplibs $i"
-		      i=""
-		      ;;
-		    esac
-		  fi
-		  if test -n "$i" ; then
-		    eval "libname=\"$libname_spec\""
-		    eval "deplib_matches=\"$library_names_spec\""
-		    set dummy $deplib_matches; shift
-		    deplib_match=$1
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		      newdeplibs="$newdeplibs $i"
-		    else
-		      droppeddeps=yes
-		      echo
-		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		      echo "*** I have the capability to make that library automatically link in when"
-		      echo "*** you link to this library.  But I can only do this if you have a"
-		      echo "*** shared version of the library, which you do not appear to have"
-		      echo "*** because a test_compile did reveal that the linker did not use this one"
-		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
-		    fi
-		  fi
-		else
-		  droppeddeps=yes
-		  echo
-		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
-		  echo "*** make it link in!  You will probably need to install it or some"
-		  echo "*** library that it depends on before this library will be fully"
-		  echo "*** functional.  Installing it before continuing would be even better."
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  fi
-	  ;;
-	file_magic*)
-	  set dummy $deplibs_check_method; shift
-	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		eval "libname=\"$libname_spec\""
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		      # Follow soft links.
-		      if ls -lLd "$potent_lib" 2>/dev/null |
-			 $GREP " -> " >/dev/null; then
-			continue
-		      fi
-		      # The statement above tries to avoid entering an
-		      # endless loop below, in case of cyclic links.
-		      # We might still enter an endless loop, since a link
-		      # loop can be closed while we follow links,
-		      # but so what?
-		      potlib="$potent_lib"
-		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
-			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
-			esac
-		      done
-		      if eval "$file_magic_cmd \"\$potlib\"" 2>/dev/null |
-			 $SED -e 10q |
-			 $EGREP "$file_magic_regex" > /dev/null; then
-			newdeplibs="$newdeplibs $a_deplib"
-			a_deplib=""
-			break 2
-		      fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		echo
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a file magic. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	match_pattern*)
-	  set dummy $deplibs_check_method; shift
-	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		eval "libname=\"$libname_spec\""
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
-		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
-		       $EGREP "$match_pattern_regex" > /dev/null; then
-		      newdeplibs="$newdeplibs $a_deplib"
-		      a_deplib=""
-		      break 2
-		    fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		echo
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	none | unknown | *)
-	  newdeplibs=""
-	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
-	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
-	    done
-	  fi
-	  case $tmp_deplibs in
-	  *[!\	\ ]*)
-	    echo
-	    if test "X$deplibs_check_method" = "Xnone"; then
-	      echo "*** Warning: inter-library dependencies are not supported in this platform."
-	    else
-	      echo "*** Warning: inter-library dependencies are not known to be supported."
-	    fi
-	    echo "*** All declared inter-library dependencies are being dropped."
-	    droppeddeps=yes
-	    ;;
-	  esac
-	  ;;
-	esac
-	versuffix=$versuffix_save
-	major=$major_save
-	release=$release_save
-	libname=$libname_save
-	name=$name_save
-
-	case $host in
-	*-*-rhapsody* | *-*-darwin1.[012])
-	  # On Rhapsody replace the C library with the System framework
-	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
-	  ;;
-	esac
-
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
-	    echo
-	    echo "*** Warning: libtool could not satisfy all declared inter-library"
-	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
-	    echo "*** a static module, that should work as long as the dlopening"
-	    echo "*** application is linked with the -dlopen flag."
-	    if test -z "$global_symbol_pipe"; then
-	      echo
-	      echo "*** However, this would only work if libtool was able to extract symbol"
-	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-	      echo "*** not find such a program.  So, this module is probably useless."
-	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
-	      build_libtool_libs=module
-	      build_old_libs=yes
-	    else
-	      build_libtool_libs=no
-	    fi
-	  else
-	    echo "*** The inter-library dependencies that have been dropped here will be"
-	    echo "*** automatically added whenever a program is linked with this library"
-	    echo "*** or is declared to -dlopen it."
-
-	    if test "$allow_undefined" = no; then
-	      echo
-	      echo "*** Since this library must not contain undefined symbols,"
-	      echo "*** because either the platform does not support them or"
-	      echo "*** it was explicitly requested with -no-undefined,"
-	      echo "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  fi
-	fi
-	# Done checking deplibs!
-	deplibs=$newdeplibs
-      fi
-      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
-      case $host in
-	*-*-darwin*)
-	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  ;;
-      esac
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      deplibs="$new_libs"
-
-      # All the library-specific variables (install_libdir is set above).
-      library_names=
-      old_library=
-      dlname=
-
-      # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	if test "$hardcode_into_libs" = yes; then
-	  # Hardcode the library paths
-	  hardcode_libdirs=
-	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$mode" != relink && rpath="$compile_rpath$rpath"
-	  for libdir in $rpath; do
-	    if test -n "$hardcode_libdir_flag_spec"; then
-	      if test -n "$hardcode_libdir_separator"; then
-		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
-		else
-		  # Just accumulate the unique libdirs.
-		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		    ;;
-		  *)
-		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		    ;;
-		  esac
-		fi
-	      else
-		eval "flag=\"$hardcode_libdir_flag_spec\""
-		dep_rpath="$dep_rpath $flag"
-	      fi
-	    elif test -n "$runpath_var"; then
-	      case "$perm_rpath " in
-	      *" $libdir "*) ;;
-	      *) perm_rpath="$perm_rpath $libdir" ;;
-	      esac
-	    fi
-	  done
-	  # Substitute the hardcoded libdirs into the rpath.
-	  if test -n "$hardcode_libdir_separator" &&
-	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
-	    if test -n "$hardcode_libdir_flag_spec_ld"; then
-	      eval "dep_rpath=\"$hardcode_libdir_flag_spec_ld\""
-	    else
-	      eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
-	    fi
-	  fi
-	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
-	    # We should set the runpath_var.
-	    rpath=
-	    for dir in $perm_rpath; do
-	      rpath="$rpath$dir:"
-	    done
-	    eval $runpath_var=\$rpath\$$runpath_var
-	    export $runpath_var
-	  fi
-	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
-	fi
-
-	shlibpath="$finalize_shlibpath"
-	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
-	if test -n "$shlibpath"; then
-	  eval $shlibpath_var=\$shlibpath\$$shlibpath_var
-	  export $shlibpath_var
-	fi
-
-	# Get the real and link names of the library.
-	eval "shared_ext=\"$shrext_cmds\""
-	eval "library_names=\"$library_names_spec\""
-	set dummy $library_names
-	shift
-	realname="$1"
-	shift
-
-	if test -n "$soname_spec"; then
-	  eval "soname=\"$soname_spec\""
-	else
-	  soname="$realname"
-	fi
-	if test -z "$dlname"; then
-	  dlname=$soname
-	fi
-
-	lib="$output_objdir/$realname"
-	linknames=
-	for link
-	do
-	  linknames="$linknames $link"
-	done
-
-	# Use standard objects if they are pic
-	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	test "X$libobjs" = "X " && libobjs=
-
-	delfiles=
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-	  export_symbols="$output_objdir/$libname.uexp"
-	  delfiles="$delfiles $export_symbols"
-	fi
-
-	orig_export_symbols=
-	case $host_os in
-	cygwin* | mingw* | cegcc*)
-	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
-	    # exporting using user supplied symfile
-	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
-	      # and it's NOT already a .def file. Must figure out
-	      # which of the given symbols are data symbols and tag
-	      # them as such. So, trigger use of export_symbols_cmds.
-	      # export_symbols gets reassigned inside the "prepare
-	      # the list of exported symbols" if statement, so the
-	      # include_expsyms logic still works.
-	      orig_export_symbols="$export_symbols"
-	      export_symbols=
-	      always_export_symbols=yes
-	    fi
-	  fi
-	  ;;
-	esac
-
-	# Prepare the list of exported symbols
-	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    func_verbose "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $opt_dry_run || $RM $export_symbols
-	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $cmds; do
-	      IFS="$save_ifs"
-	      eval "cmd=\"$cmd\""
-	      func_len " $cmd"
-	      len=$func_len_result
-	      if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-		func_show_eval "$cmd" 'exit $?'
-		skipped_export=false
-	      else
-		# The command line is too long to execute in one step.
-		func_verbose "using reloadable object file for export list..."
-		skipped_export=:
-		# Break out early, otherwise skipped_export may be
-		# set to false by a later but shorter cmd.
-		break
-	      fi
-	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-	fi
-
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  tmp_export_symbols="$export_symbols"
-	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	  $opt_dry_run || $ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"
-	fi
-
-	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
-	  # The given exports_symbols file has to be filtered, so filter it.
-	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	  # 's' commands which not all seds can handle. GNU sed should be fine
-	  # though. Also, the filter scales superlinearly with the number of
-	  # global variables. join(1) would be nice here, but unfortunately
-	  # isn't a blessed tool.
-	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	  delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	  export_symbols=$output_objdir/$libname.def
-	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	fi
-
-	tmp_deplibs=
-	for test_deplib in $deplibs; do
-	  case " $convenience " in
-	  *" $test_deplib "*) ;;
-	  *)
-	    tmp_deplibs="$tmp_deplibs $test_deplib"
-	    ;;
-	  esac
-	done
-	deplibs="$tmp_deplibs"
-
-	if test -n "$convenience"; then
-	  if test -n "$whole_archive_flag_spec" &&
-	    test "$compiler_needs_object" = yes &&
-	    test -z "$libobjs"; then
-	    # extract the archives, so we have objects to list.
-	    # TODO: could optimize this to just extract one archive.
-	    whole_archive_flag_spec=
-	  fi
-	  if test -n "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	    eval "libobjs=\"\$libobjs $whole_archive_flag_spec\""
-	    test "X$libobjs" = "X " && libobjs=
-	  else
-	    gentop="$output_objdir/${outputname}x"
-	    generated="$generated $gentop"
-
-	    func_extract_archives $gentop $convenience
-	    libobjs="$libobjs $func_extract_archives_result"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	fi
-
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
-	  eval "flag=\"$thread_safe_flag_spec\""
-	  linker_flags="$linker_flags $flag"
-	fi
-
-	# Make a backup of the uninstalled library when relinking
-	if test "$mode" = relink; then
-	  $opt_dry_run || (cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U) || exit $?
-	fi
-
-	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
-	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	    eval "test_cmds=\"$module_expsym_cmds\""
-	    cmds=$module_expsym_cmds
-	  else
-	    eval "test_cmds=\"$module_cmds\""
-	    cmds=$module_cmds
-	  fi
-	else
-	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	    eval "test_cmds=\"$archive_expsym_cmds\""
-	    cmds=$archive_expsym_cmds
-	  else
-	    eval "test_cmds=\"$archive_cmds\""
-	    cmds=$archive_cmds
-	  fi
-	fi
-
-	if test "X$skipped_export" != "X:" &&
-	   func_len " $test_cmds" &&
-	   len=$func_len_result &&
-	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  :
-	else
-	  # The command line is too long to link in one step, link piecewise
-	  # or, if using GNU ld and skipped_export is not :, use a linker
-	  # script.
-
-	  # Save the value of $output and $libobjs because we want to
-	  # use them later.  If we have whole_archive_flag_spec, we
-	  # want to use save_libobjs as it was before
-	  # whole_archive_flag_spec was expanded, because we can't
-	  # assume the linker understands whole_archive_flag_spec.
-	  # This may have to be revisited, in case too many
-	  # convenience libraries get linked in and end up exceeding
-	  # the spec.
-	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	  fi
-	  save_output=$output
-	  func_basename "$output"
-	  output_la=$func_basename_result
-
-	  # Clear the reloadable object creation command queue and
-	  # initialize k to one.
-	  test_cmds=
-	  concat_cmds=
-	  objlist=
-	  last_robj=
-	  k=1
-
-	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-	    output=${output_objdir}/${output_la}.lnkscript
-	    func_verbose "creating GNU ld script: $output"
-	    echo 'INPUT (' > $output
-	    for obj in $save_libobjs
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    echo ')' >> $output
-	    delfiles="$delfiles $output"
-	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-	    output=${output_objdir}/${output_la}.lnk
-	    func_verbose "creating linker input file list: $output"
-	    : > $output
-	    set x $save_libobjs
-	    shift
-	    firstobj=
-	    if test "$compiler_needs_object" = yes; then
-	      firstobj="$1 "
-	      shift
-	    fi
-	    for obj
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    delfiles="$delfiles $output"
-	    output=$firstobj\"$file_list_spec$output\"
-	  else
-	    if test -n "$save_libobjs"; then
-	      func_verbose "creating reloadable object files..."
-	      output=$output_objdir/$output_la-${k}.$objext
-	      eval "test_cmds=\"$reload_cmds\""
-	      func_len " $test_cmds"
-	      len0=$func_len_result
-	      len=$len0
-
-	      # Loop over the list of objects to be linked.
-	      for obj in $save_libobjs
-	      do
-		func_len " $obj"
-		func_arith $len + $func_len_result
-		len=$func_arith_result
-		if test "X$objlist" = X ||
-		   test "$len" -lt "$max_cmd_len"; then
-		  func_append objlist " $obj"
-		else
-		  # The command $test_cmds is almost too long, add a
-		  # command to the queue.
-		  if test "$k" -eq 1 ; then
-		    # The first file doesn't have a previous command to add.
-		    reload_objs=$objlist
-		    eval "concat_cmds=\"$reload_cmds\""
-		  else
-		    # All subsequent reloadable object files will link in
-		    # the last one created.
-		    reload_objs="$objlist $last_robj"
-		    eval "concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\""
-		  fi
-		  last_robj=$output_objdir/$output_la-${k}.$objext
-		  func_arith $k + 1
-		  k=$func_arith_result
-		  output=$output_objdir/$output_la-${k}.$objext
-		  objlist=" $obj"
-		  func_len " $last_robj"
-		  func_arith $len0 + $func_len_result
-		  len=$func_arith_result
-		fi
-	      done
-	      # Handle the remaining objects by creating one last
-	      # reloadable object file.  All subsequent reloadable object
-	      # files will link in the last one created.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      reload_objs="$objlist $last_robj"
-	      eval "concat_cmds=\"\${concat_cmds}$reload_cmds\""
-	      if test -n "$last_robj"; then
-	        eval "concat_cmds=\"\${concat_cmds}~\$RM $last_robj\""
-	      fi
-	      delfiles="$delfiles $output"
-
-	    else
-	      output=
-	    fi
-
-	    if ${skipped_export-false}; then
-	      func_verbose "generating symbol list for \`$libname.la'"
-	      export_symbols="$output_objdir/$libname.exp"
-	      $opt_dry_run || $RM $export_symbols
-	      libobjs=$output
-	      # Append the command to create the export file.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval "concat_cmds=\"\$concat_cmds$export_symbols_cmds\""
-	      if test -n "$last_robj"; then
-		eval "concat_cmds=\"\$concat_cmds~\$RM $last_robj\""
-	      fi
-	    fi
-
-	    test -n "$save_libobjs" &&
-	      func_verbose "creating a temporary reloadable object file: $output"
-
-	    # Loop through the commands generated above and execute them.
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $concat_cmds; do
-	      IFS="$save_ifs"
-	      $opt_silent || {
-		  func_quote_for_expand "$cmd"
-		  eval "func_echo $func_quote_for_expand_result"
-	      }
-	      $opt_dry_run || eval "$cmd" || {
-		lt_exit=$?
-
-		# Restore the uninstalled library and exit
-		if test "$mode" = relink; then
-		  ( cd "$output_objdir" && \
-		    $RM "${realname}T" && \
-		    $MV "${realname}U" "$realname" )
-		fi
-
-		exit $lt_exit
-	      }
-	    done
-	    IFS="$save_ifs"
-
-	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-
-          if ${skipped_export-false}; then
-	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	      tmp_export_symbols="$export_symbols"
-	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	      $opt_dry_run || $ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"
-	    fi
-
-	    if test -n "$orig_export_symbols"; then
-	      # The given exports_symbols file has to be filtered, so filter it.
-	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	      # 's' commands which not all seds can handle. GNU sed should be fine
-	      # though. Also, the filter scales superlinearly with the number of
-	      # global variables. join(1) would be nice here, but unfortunately
-	      # isn't a blessed tool.
-	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	      delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	      export_symbols=$output_objdir/$libname.def
-	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	    fi
-	  fi
-
-	  libobjs=$output
-	  # Restore the value of output.
-	  output=$save_output
-
-	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
-	    eval "libobjs=\"\$libobjs $whole_archive_flag_spec\""
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	  # Expand the library linking commands again to reset the
-	  # value of $libobjs for piecewise linking.
-
-	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
-	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	      cmds=$module_expsym_cmds
-	    else
-	      cmds=$module_cmds
-	    fi
-	  else
-	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	      cmds=$archive_expsym_cmds
-	    else
-	      cmds=$archive_cmds
-	    fi
-	  fi
-	fi
-
-	if test -n "$delfiles"; then
-	  # Append the command to remove temporary files to $cmds.
-	  eval "cmds=\"\$cmds~\$RM $delfiles\""
-	fi
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  libobjs="$libobjs $func_extract_archives_result"
-	  test "X$libobjs" = "X " && libobjs=
-	fi
-
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval "cmd=\"$cmd\""
-	  $opt_silent || {
-	    func_quote_for_expand "$cmd"
-	    eval "func_echo $func_quote_for_expand_result"
-	  }
-	  $opt_dry_run || eval "$cmd" || {
-	    lt_exit=$?
-
-	    # Restore the uninstalled library and exit
-	    if test "$mode" = relink; then
-	      ( cd "$output_objdir" && \
-	        $RM "${realname}T" && \
-		$MV "${realname}U" "$realname" )
-	    fi
-
-	    exit $lt_exit
-	  }
-	done
-	IFS="$save_ifs"
-
-	# Restore the uninstalled library and exit
-	if test "$mode" = relink; then
-	  $opt_dry_run || (cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname) || exit $?
-
-	  if test -n "$convenience"; then
-	    if test -z "$whole_archive_flag_spec"; then
-	      func_show_eval '${RM}r "$gentop"'
-	    fi
-	  fi
-
-	  exit $EXIT_SUCCESS
-	fi
-
-	# Create links to the real library.
-	for linkname in $linknames; do
-	  if test "$realname" != "$linkname"; then
-	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
-	  fi
-	done
-
-	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
-	  # On all known operating systems, these are identical.
-	  dlname="$soname"
-	fi
-      fi
-      ;;
-
-    obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for objects"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for objects" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for objects"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for objects"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for objects"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for objects"
-
-      case $output in
-      *.lo)
-	test -n "$objs$old_deplibs" && \
-	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
-
-	libobj=$output
-	func_lo2o "$libobj"
-	obj=$func_lo2o_result
-	;;
-      *)
-	libobj=
-	obj="$output"
-	;;
-      esac
-
-      # Delete the old objects.
-      $opt_dry_run || $RM $obj $libobj
-
-      # Objects from convenience libraries.  This assumes
-      # single-version convenience libraries.  Whenever we create
-      # different ones for PIC/non-PIC, this we'll have to duplicate
-      # the extraction.
-      reload_conv_objs=
-      gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
-      if test -n "$convenience"; then
-	if test -n "$whole_archive_flag_spec"; then
-	  eval "tmp_whole_archive_flags=\"$whole_archive_flag_spec\""
-	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
-	else
-	  gentop="$output_objdir/${obj}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $convenience
-	  reload_conv_objs="$reload_objs $func_extract_archives_result"
-	fi
-      fi
-
-      # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
-
-      output="$obj"
-      func_execute_cmds "$reload_cmds" 'exit $?'
-
-      # Exit if we aren't doing a library object file.
-      if test -z "$libobj"; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$build_libtool_libs" != yes; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	# Create an invalid libtool object if no PIC, so that we don't
-	# accidentally link it into a program.
-	# $show "echo timestamp > $libobj"
-	# $opt_dry_run || echo timestamp > $libobj || exit $?
-	exit $EXIT_SUCCESS
-      fi
-
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
-	# Only do commands if we really have different PIC objects.
-	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
-	func_execute_cmds "$reload_cmds" 'exit $?'
-      fi
-
-      if test -n "$gentop"; then
-	func_show_eval '${RM}r "$gentop"'
-      fi
-
-      exit $EXIT_SUCCESS
-      ;;
-
-    prog)
-      case $host in
-	*cygwin*) func_stripname '' '.exe' "$output"
-	          output=$func_stripname_result.exe;;
-      esac
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for programs"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for programs"
-
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-	&& test "$dlopen_self" = unknown \
-	&& test "$dlopen_self_static" = unknown && \
-	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
-
-      case $host in
-      *-*-rhapsody* | *-*-darwin1.[012])
-	# On Rhapsody replace the C library is the System framework
-	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
-	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
-	;;
-      esac
-
-      case $host in
-      *-*-darwin*)
-	# Don't allow lazy linking, it breaks C++ global constructors
-	# But is supposedly fixed on 10.4 or later (yay!).
-	if test "$tagname" = CXX ; then
-	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
-	    10.[0123])
-	      compile_command="$compile_command ${wl}-bind_at_load"
-	      finalize_command="$finalize_command ${wl}-bind_at_load"
-	    ;;
-	  esac
-	fi
-	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
-	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	;;
-      esac
-
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $compile_deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $compile_deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      compile_deplibs="$new_libs"
-
-
-      compile_command="$compile_command $compile_deplibs"
-      finalize_command="$finalize_command $finalize_deplibs"
-
-      if test -n "$rpath$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	for libdir in $rpath $xrpath; do
-	  # This is the magic to use -rpath.
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-      fi
-
-      # Now hardcode the library paths
-      rpath=
-      hardcode_libdirs=
-      for libdir in $compile_rpath $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval "flag=\"$hardcode_libdir_flag_spec\""
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) perm_rpath="$perm_rpath $libdir" ;;
-	  esac
-	fi
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$libdir:"*) ;;
-	  ::) dllsearchpath=$libdir;;
-	  *) dllsearchpath="$dllsearchpath:$libdir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval "rpath=\" $hardcode_libdir_flag_spec\""
-      fi
-      compile_rpath="$rpath"
-
-      rpath=
-      hardcode_libdirs=
-      for libdir in $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval "flag=\"$hardcode_libdir_flag_spec\""
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$finalize_perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
-	  esac
-	fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval "rpath=\" $hardcode_libdir_flag_spec\""
-      fi
-      finalize_rpath="$rpath"
-
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
-	# Transform all the library objects into standard objects.
-	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
-      fi
-
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
-
-      # template prelinking step
-      if test -n "$prelink_cmds"; then
-	func_execute_cmds "$prelink_cmds" 'exit $?'
-      fi
-
-      wrappers_required=yes
-      case $host in
-      *cegcc* | *mingw32ce*)
-        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
-        wrappers_required=no
-        ;;
-      *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      esac
-      if test "$wrappers_required" = no; then
-	# Replace the output file specification.
-	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
-
-	# We have no uninstalled library dependencies, so finalize right now.
-	exit_status=0
-	func_show_eval "$link_command" 'exit_status=$?'
-
-	# Delete the generated files.
-	if test -f "$output_objdir/${outputname}S.${objext}"; then
-	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
-	fi
-
-	exit $exit_status
-      fi
-
-      if test -n "$compile_shlibpath$finalize_shlibpath"; then
-	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
-      fi
-      if test -n "$finalize_shlibpath"; then
-	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
-      fi
-
-      compile_var=
-      finalize_var=
-      if test -n "$runpath_var"; then
-	if test -n "$perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-	if test -n "$finalize_perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $finalize_perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-      fi
-
-      if test "$no_install" = yes; then
-	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
-	# Replace the output file specification.
-	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	# Delete the old output file.
-	$opt_dry_run || $RM $output
-	# Link the executable and exit
-	func_show_eval "$link_command" 'exit $?'
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
-
-	func_warning "this platform does not like uninstalled shared libraries"
-	func_warning "\`$output' will be relinked during installation"
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
-
-      # Replace the output file specification.
-      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
-      # Delete the old output files.
-      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
-      func_show_eval "$link_command" 'exit $?'
-
-      # Now create the wrapper script.
-      func_verbose "creating $output"
-
-      # Quote the relink command for shipping.
-      if test -n "$relink_command"; then
-	# Preserve any variables that may affect compiler behavior
-	for var in $variables_saved_for_relink; do
-	  if eval test -z \"\${$var+set}\"; then
-	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	  elif eval var_value=\$$var; test -z "$var_value"; then
-	    relink_command="$var=; export $var; $relink_command"
-	  else
-	    func_quote_for_eval "$var_value"
-	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	  fi
-	done
-	relink_command="(cd `pwd`; $relink_command)"
-	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      fi
-
-      # Only actually do things if not in dry run mode.
-      $opt_dry_run || {
-	# win32 will think the script is a binary if it has
-	# a .exe suffix, so we strip it off here.
-	case $output in
-	  *.exe) func_stripname '' '.exe' "$output"
-	         output=$func_stripname_result ;;
-	esac
-	# test for cygwin because mv fails w/o .exe extensions
-	case $host in
-	  *cygwin*)
-	    exeext=.exe
-	    func_stripname '' '.exe' "$outputname"
-	    outputname=$func_stripname_result ;;
-	  *) exeext= ;;
-	esac
-	case $host in
-	  *cygwin* | *mingw* )
-	    func_dirname_and_basename "$output" "" "."
-	    output_name=$func_basename_result
-	    output_path=$func_dirname_result
-	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
-	    cwrapper="$output_path/$output_name.exe"
-	    $RM $cwrappersource $cwrapper
-	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_cwrapperexe_src > $cwrappersource
-
-	    # The wrapper executable is built using the $host compiler,
-	    # because it contains $host paths and files. If cross-
-	    # compiling, it, like the target executable, must be
-	    # executed on the $host or under an emulation environment.
-	    $opt_dry_run || {
-	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
-	      $STRIP $cwrapper
-	    }
-
-	    # Now, create the wrapper script for func_source use:
-	    func_ltwrapper_scriptname $cwrapper
-	    $RM $func_ltwrapper_scriptname_result
-	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
-	    $opt_dry_run || {
-	      # note: this script will not be executed, so do not chmod.
-	      if test "x$build" = "x$host" ; then
-		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
-	      else
-		func_emit_wrapper no > $func_ltwrapper_scriptname_result
-	      fi
-	    }
-	  ;;
-	  * )
-	    $RM $output
-	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_wrapper no > $output
-	    chmod +x $output
-	  ;;
-	esac
-      }
-      exit $EXIT_SUCCESS
-      ;;
-    esac
-
-    # See if we need to build an old-fashioned archive.
-    for oldlib in $oldlibs; do
-
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save $symfileobj"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
-	  build_libtool_libs=no
-	else
-	  oldobjs="$old_deplibs $non_pic_objects"
-	  if test "$preload" = yes && test -f "$symfileobj"; then
-	    oldobjs="$oldobjs $symfileobj"
-	  fi
-	fi
-	addlibs="$old_convenience"
-      fi
-
-      if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
-	generated="$generated $gentop"
-
-	func_extract_archives $gentop $addlibs
-	oldobjs="$oldobjs $func_extract_archives_result"
-      fi
-
-      # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-	cmds=$old_archive_from_new_cmds
-      else
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  oldobjs="$oldobjs $func_extract_archives_result"
-	fi
-
-	# POSIX demands no paths to be encoded in archives.  We have
-	# to avoid creating archives with duplicate basenames if we
-	# might have to extract them afterwards, e.g., when creating a
-	# static archive out of a convenience library, or when linking
-	# the entirety of a libtool archive into another (currently
-	# not supported by libtool).
-	if (for obj in $oldobjs
-	    do
-	      func_basename "$obj"
-	      $ECHO "$func_basename_result"
-	    done | sort | sort -uc >/dev/null 2>&1); then
-	  :
-	else
-	  echo "copying selected object files to avoid basename conflicts..."
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-	  func_mkdir_p "$gentop"
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  counter=1
-	  for obj in $save_oldobjs
-	  do
-	    func_basename "$obj"
-	    objbase="$func_basename_result"
-	    case " $oldobjs " in
-	    " ") oldobjs=$obj ;;
-	    *[\ /]"$objbase "*)
-	      while :; do
-		# Make sure we don't pick an alternate name that also
-		# overlaps.
-		newobj=lt$counter-$objbase
-		func_arith $counter + 1
-		counter=$func_arith_result
-		case " $oldobjs " in
-		*[\ /]"$newobj "*) ;;
-		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
-		esac
-	      done
-	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
-	      oldobjs="$oldobjs $gentop/$newobj"
-	      ;;
-	    *) oldobjs="$oldobjs $obj" ;;
-	    esac
-	  done
-	fi
-	eval "cmds=\"$old_archive_cmds\""
-
-	func_len " $cmds"
-	len=$func_len_result
-	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  cmds=$old_archive_cmds
-	else
-	  # the command line is too long to link in one step, link in parts
-	  func_verbose "using piecewise archive linking..."
-	  save_RANLIB=$RANLIB
-	  RANLIB=:
-	  objlist=
-	  concat_cmds=
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  # Is there a better way of finding the last object in the list?
-	  for obj in $save_oldobjs
-	  do
-	    last_oldobj=$obj
-	  done
-	  eval "test_cmds=\"$old_archive_cmds\""
-	  func_len " $test_cmds"
-	  len0=$func_len_result
-	  len=$len0
-	  for obj in $save_oldobjs
-	  do
-	    func_len " $obj"
-	    func_arith $len + $func_len_result
-	    len=$func_arith_result
-	    func_append objlist " $obj"
-	    if test "$len" -lt "$max_cmd_len"; then
-	      :
-	    else
-	      # the above command should be used before it gets too long
-	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
-		RANLIB=$save_RANLIB
-	      fi
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval "concat_cmds=\"\${concat_cmds}$old_archive_cmds\""
-	      objlist=
-	      len=$len0
-	    fi
-	  done
-	  RANLIB=$save_RANLIB
-	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
-	    eval "cmds=\"\$concat_cmds\""
-	  else
-	    eval "cmds=\"\$concat_cmds~\$old_archive_cmds\""
-	  fi
-	fi
-      fi
-      func_execute_cmds "$cmds" 'exit $?'
-    done
-
-    test -n "$generated" && \
-      func_show_eval "${RM}r$generated"
-
-    # Now create the libtool archive.
-    case $output in
-    *.la)
-      old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
-      func_verbose "creating $output"
-
-      # Preserve any variables that may affect compiler behavior
-      for var in $variables_saved_for_relink; do
-	if eval test -z \"\${$var+set}\"; then
-	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	elif eval var_value=\$$var; test -z "$var_value"; then
-	  relink_command="$var=; export $var; $relink_command"
-	else
-	  func_quote_for_eval "$var_value"
-	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	fi
-      done
-      # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
-	relink_command=
-      fi
-
-      # Only create the output if not a dry run.
-      $opt_dry_run || {
-	for installed in no yes; do
-	  if test "$installed" = yes; then
-	    if test -z "$install_libdir"; then
-	      break
-	    fi
-	    output="$output_objdir/$outputname"i
-	    # Replace all uninstalled libtool libraries with the installed ones
-	    newdependency_libs=
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      *.la)
-		func_basename "$deplib"
-		name="$func_basename_result"
-		libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$deplib' is not a valid libtool archive"
-		newdependency_libs="$newdependency_libs $libdir/$name"
-		;;
-	      *) newdependency_libs="$newdependency_libs $deplib" ;;
-	      esac
-	    done
-	    dependency_libs="$newdependency_libs"
-	    newdlfiles=
-
-	    for lib in $dlfiles; do
-	      case $lib in
-	      *.la)
-	        func_basename "$lib"
-		name="$func_basename_result"
-		libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlfiles="$newdlfiles $libdir/$name"
-		;;
-	      *) newdlfiles="$newdlfiles $lib" ;;
-	      esac
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-	      *.la)
-		# Only pass preopened files to the pseudo-archive (for
-		# eventual linking with the app. that links it) if we
-		# didn't already link the preopened objects directly into
-		# the library:
-		func_basename "$lib"
-		name="$func_basename_result"
-		libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlprefiles="$newdlprefiles $libdir/$name"
-		;;
-	      esac
-	    done
-	    dlprefiles="$newdlprefiles"
-	  else
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlfiles="$newdlfiles $abs"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlprefiles="$newdlprefiles $abs"
-	    done
-	    dlprefiles="$newdlprefiles"
-	  fi
-	  $RM $output
-	  # place dlname in correct position for cygwin
-	  # In fact, it would be nice if we could use this code for all target
-	  # systems that can't hard-code library paths into their executables
-	  # and that have no shared library path variable independent of PATH,
-	  # but it turns out we can't easily determine that from inspecting
-	  # libtool variables, so we have to hard-code the OSs to which it
-	  # applies here; at the moment, that means platforms that use the PE
-	  # object format with DLL files.  See the long comment at the top of
-	  # tests/bindir.at for full details.
-	  tdlname=$dlname
-	  case $host,$output,$installed,$module,$dlname in
-	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
-	      # If a -bindir argument was supplied, place the dll there.
-	      if test "x$bindir" != x ;
-	      then
-		func_relative_path "$install_libdir" "$bindir"
-		tdlname=$func_relative_path_result$dlname
-	      else
-		# Otherwise fall back on heuristic.
-		tdlname=../bin/$dlname
-	      fi
-	      ;;
-	  esac
-	  $ECHO > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$tdlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags='$new_inherited_linker_flags'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Names of additional weak libraries provided by this library
-weak_library_names='$weak_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
-
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
-	    $ECHO >> $output "\
-relink_command=\"$relink_command\""
-	  fi
-	done
-      }
-
-      # Do a symbolic link so that the libtool archive can be found in
-      # LD_LIBRARY_PATH before the program is installed.
-      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
-      ;;
-    esac
-    exit $EXIT_SUCCESS
-}
-
-{ test "$mode" = link || test "$mode" = relink; } &&
-    func_mode_link ${1+"$@"}
-
-
-# func_mode_uninstall arg...
-func_mode_uninstall ()
-{
-    $opt_debug
-    RM="$nonopt"
-    files=
-    rmforce=
-    exit_status=0
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    for arg
-    do
-      case $arg in
-      -f) RM="$RM $arg"; rmforce=yes ;;
-      -*) RM="$RM $arg" ;;
-      *) files="$files $arg" ;;
-      esac
-    done
-
-    test -z "$RM" && \
-      func_fatal_help "you must specify an RM program"
-
-    rmdirs=
-
-    origobjdir="$objdir"
-    for file in $files; do
-      func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-	objdir="$origobjdir"
-      else
-	objdir="$dir/$origobjdir"
-      fi
-      func_basename "$file"
-      name="$func_basename_result"
-      test "$mode" = uninstall && objdir="$dir"
-
-      # Remember objdir for removal later, being careful to avoid duplicates
-      if test "$mode" = clean; then
-	case " $rmdirs " in
-	  *" $objdir "*) ;;
-	  *) rmdirs="$rmdirs $objdir" ;;
-	esac
-      fi
-
-      # Don't error if the file doesn't exist and rm -f was used.
-      if { test -L "$file"; } >/dev/null 2>&1 ||
-	 { test -h "$file"; } >/dev/null 2>&1 ||
-	 test -f "$file"; then
-	:
-      elif test -d "$file"; then
-	exit_status=1
-	continue
-      elif test "$rmforce" = yes; then
-	continue
-      fi
-
-      rmfiles="$file"
-
-      case $name in
-      *.la)
-	# Possibly a libtool archive, so verify it.
-	if func_lalib_p "$file"; then
-	  func_source $dir/$name
-
-	  # Delete the libtool libraries and symlinks.
-	  for n in $library_names; do
-	    rmfiles="$rmfiles $objdir/$n"
-	  done
-	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
-
-	  case "$mode" in
-	  clean)
-	    case "  $library_names " in
-	    # "  " in the beginning catches empty $dlname
-	    *" $dlname "*) ;;
-	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
-	    esac
-	    test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
-	    ;;
-	  uninstall)
-	    if test -n "$library_names"; then
-	      # Do each command in the postuninstall commands.
-	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-
-	    if test -n "$old_library"; then
-	      # Do each command in the old_postuninstall commands.
-	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-	    # FIXME: should reinstall the best remaining shared library.
-	    ;;
-	  esac
-	fi
-	;;
-
-      *.lo)
-	# Possibly a libtool object, so verify it.
-	if func_lalib_p "$file"; then
-
-	  # Read the .lo file
-	  func_source $dir/$name
-
-	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" &&
-	     test "$pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$pic_object"
-	  fi
-
-	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" &&
-	     test "$non_pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$non_pic_object"
-	  fi
-	fi
-	;;
-
-      *)
-	if test "$mode" = clean ; then
-	  noexename=$name
-	  case $file in
-	  *.exe)
-	    func_stripname '' '.exe' "$file"
-	    file=$func_stripname_result
-	    func_stripname '' '.exe' "$name"
-	    noexename=$func_stripname_result
-	    # $file with .exe has already been added to rmfiles,
-	    # add $file without .exe
-	    rmfiles="$rmfiles $file"
-	    ;;
-	  esac
-	  # Do a test to see if this is a libtool program.
-	  if func_ltwrapper_p "$file"; then
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      relink_command=
-	      func_source $func_ltwrapper_scriptname_result
-	      rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
-	    else
-	      relink_command=
-	      func_source $dir/$noexename
-	    fi
-
-	    # note $name still contains .exe if it was in $file originally
-	    # as does the version of $file that was added into $rmfiles
-	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
-	      rmfiles="$rmfiles $objdir/lt-$name"
-	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
-	    fi
-	  fi
-	fi
-	;;
-      esac
-      func_show_eval "$RM $rmfiles" 'exit_status=1'
-    done
-    objdir="$origobjdir"
-
-    # Try to remove the ${objdir}s in the directories where we deleted files
-    for dir in $rmdirs; do
-      if test -d "$dir"; then
-	func_show_eval "rmdir $dir >/dev/null 2>&1"
-      fi
-    done
-
-    exit $exit_status
-}
-
-{ test "$mode" = uninstall || test "$mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
-
-test -z "$mode" && {
-  help="$generic_help"
-  func_fatal_help "you must specify a MODE"
-}
-
-test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$mode'"
-
-if test -n "$exec_cmd"; then
-  eval exec "$exec_cmd"
-  exit $EXIT_FAILURE
-fi
-
-exit $exit_status
-
-
-# The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
-# choices, we go for a static library, that is the most portable,
-# since we can't tell whether shared libraries were disabled because
-# the user asked for that or because the platform doesn't support
-# them.  This is particularly important on AIX, because we don't
-# support having both static and shared libraries enabled at the same
-# time on that platform, so we default to a shared-only configuration.
-# If a disable-shared tag is given, we'll fallback to a static-only
-# configuration.  But we'll never go from static-only to shared-only.
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-build_libtool_libs=no
-build_old_libs=yes
-# ### END LIBTOOL TAG CONFIG: disable-shared
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-static
-build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-# ### END LIBTOOL TAG CONFIG: disable-static
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
-# vi:sw=2
-
diff --git a/third_party/gofrontend/missing b/third_party/gofrontend/missing
deleted file mode 100644
index f62bbae..0000000
--- a/third_party/gofrontend/missing
+++ /dev/null
@@ -1,215 +0,0 @@
-#! /bin/sh
-# Common wrapper for a few potentially missing GNU programs.
-
-scriptversion=2013-10-28.13; # UTC
-
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
-# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try '$0 --help' for more information"
-  exit 1
-fi
-
-case $1 in
-
-  --is-lightweight)
-    # Used by our autoconf macros to check whether the available missing
-    # script is modern enough.
-    exit 0
-    ;;
-
-  --run)
-    # Back-compat with the calling convention used by older automake.
-    shift
-    ;;
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
-to PROGRAM being missing or too old.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-
-Supported PROGRAM values:
-  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
-  bison     yacc      flex         lex       help2man
-
-Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
-'g' are ignored when checking the name.
-
-Send bug reports to <bug-automake@gnu.org>."
-    exit $?
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing $scriptversion (GNU Automake)"
-    exit $?
-    ;;
-
-  -*)
-    echo 1>&2 "$0: unknown '$1' option"
-    echo 1>&2 "Try '$0 --help' for more information"
-    exit 1
-    ;;
-
-esac
-
-# Run the given program, remember its exit status.
-"$@"; st=$?
-
-# If it succeeded, we are done.
-test $st -eq 0 && exit 0
-
-# Also exit now if we it failed (or wasn't found), and '--version' was
-# passed; such an option is passed most likely to detect whether the
-# program is present and works.
-case $2 in --version|--help) exit $st;; esac
-
-# Exit code 63 means version mismatch.  This often happens when the user
-# tries to use an ancient version of a tool on a file that requires a
-# minimum version.
-if test $st -eq 63; then
-  msg="probably too old"
-elif test $st -eq 127; then
-  # Program was missing.
-  msg="missing on your system"
-else
-  # Program was found and executed, but failed.  Give up.
-  exit $st
-fi
-
-perl_URL=http://www.perl.org/
-flex_URL=http://flex.sourceforge.net/
-gnu_software_URL=http://www.gnu.org/software
-
-program_details ()
-{
-  case $1 in
-    aclocal|automake)
-      echo "The '$1' program is part of the GNU Automake package:"
-      echo "<$gnu_software_URL/automake>"
-      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
-      echo "<$gnu_software_URL/autoconf>"
-      echo "<$gnu_software_URL/m4/>"
-      echo "<$perl_URL>"
-      ;;
-    autoconf|autom4te|autoheader)
-      echo "The '$1' program is part of the GNU Autoconf package:"
-      echo "<$gnu_software_URL/autoconf/>"
-      echo "It also requires GNU m4 and Perl in order to run:"
-      echo "<$gnu_software_URL/m4/>"
-      echo "<$perl_URL>"
-      ;;
-  esac
-}
-
-give_advice ()
-{
-  # Normalize program name to check for.
-  normalized_program=`echo "$1" | sed '
-    s/^gnu-//; t
-    s/^gnu//; t
-    s/^g//; t'`
-
-  printf '%s\n' "'$1' is $msg."
-
-  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
-  case $normalized_program in
-    autoconf*)
-      echo "You should only need it if you modified 'configure.ac',"
-      echo "or m4 files included by it."
-      program_details 'autoconf'
-      ;;
-    autoheader*)
-      echo "You should only need it if you modified 'acconfig.h' or"
-      echo "$configure_deps."
-      program_details 'autoheader'
-      ;;
-    automake*)
-      echo "You should only need it if you modified 'Makefile.am' or"
-      echo "$configure_deps."
-      program_details 'automake'
-      ;;
-    aclocal*)
-      echo "You should only need it if you modified 'acinclude.m4' or"
-      echo "$configure_deps."
-      program_details 'aclocal'
-      ;;
-   autom4te*)
-      echo "You might have modified some maintainer files that require"
-      echo "the 'autom4te' program to be rebuilt."
-      program_details 'autom4te'
-      ;;
-    bison*|yacc*)
-      echo "You should only need it if you modified a '.y' file."
-      echo "You may want to install the GNU Bison package:"
-      echo "<$gnu_software_URL/bison/>"
-      ;;
-    lex*|flex*)
-      echo "You should only need it if you modified a '.l' file."
-      echo "You may want to install the Fast Lexical Analyzer package:"
-      echo "<$flex_URL>"
-      ;;
-    help2man*)
-      echo "You should only need it if you modified a dependency" \
-           "of a man page."
-      echo "You may want to install the GNU Help2man package:"
-      echo "<$gnu_software_URL/help2man/>"
-    ;;
-    makeinfo*)
-      echo "You should only need it if you modified a '.texi' file, or"
-      echo "any other file indirectly affecting the aspect of the manual."
-      echo "You might want to install the Texinfo package:"
-      echo "<$gnu_software_URL/texinfo/>"
-      echo "The spurious makeinfo call might also be the consequence of"
-      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
-      echo "want to install GNU make:"
-      echo "<$gnu_software_URL/make/>"
-      ;;
-    *)
-      echo "You might have modified some files without having the proper"
-      echo "tools for further handling them.  Check the 'README' file, it"
-      echo "often tells you about the needed prerequisites for installing"
-      echo "this package.  You may also peek at any GNU archive site, in"
-      echo "case some other package contains this missing '$1' program."
-      ;;
-  esac
-}
-
-give_advice "$1" | sed -e '1s/^/WARNING: /' \
-                       -e '2,$s/^/         /' >&2
-
-# Propagate the correct exit status (expected to be 127 for a program
-# not found, 63 for a program that failed due to version mismatch).
-exit $st
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/third_party/gotools/LICENSE b/third_party/gotools/LICENSE
deleted file mode 100644
index 6a66aea..0000000
--- a/third_party/gotools/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-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.
diff --git a/third_party/gotools/go/ast/astutil/enclosing.go b/third_party/gotools/go/ast/astutil/enclosing.go
deleted file mode 100644
index 2de739e..0000000
--- a/third_party/gotools/go/ast/astutil/enclosing.go
+++ /dev/null
@@ -1,625 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package astutil
-
-// This file defines utilities for working with source positions.
-
-import (
-	"fmt"
-	"go/ast"
-	"go/token"
-	"sort"
-)
-
-// PathEnclosingInterval returns the node that encloses the source
-// interval [start, end), and all its ancestors up to the AST root.
-//
-// The definition of "enclosing" used by this function considers
-// additional whitespace abutting a node to be enclosed by it.
-// In this example:
-//
-//              z := x + y // add them
-//                   <-A->
-//                  <----B----->
-//
-// the ast.BinaryExpr(+) node is considered to enclose interval B
-// even though its [Pos()..End()) is actually only interval A.
-// This behaviour makes user interfaces more tolerant of imperfect
-// input.
-//
-// This function treats tokens as nodes, though they are not included
-// in the result. e.g. PathEnclosingInterval("+") returns the
-// enclosing ast.BinaryExpr("x + y").
-//
-// If start==end, the 1-char interval following start is used instead.
-//
-// The 'exact' result is true if the interval contains only path[0]
-// and perhaps some adjacent whitespace.  It is false if the interval
-// overlaps multiple children of path[0], or if it contains only
-// interior whitespace of path[0].
-// In this example:
-//
-//              z := x + y // add them
-//                <--C-->     <---E-->
-//                  ^
-//                  D
-//
-// intervals C, D and E are inexact.  C is contained by the
-// z-assignment statement, because it spans three of its children (:=,
-// x, +).  So too is the 1-char interval D, because it contains only
-// interior whitespace of the assignment.  E is considered interior
-// whitespace of the BlockStmt containing the assignment.
-//
-// Precondition: [start, end) both lie within the same file as root.
-// TODO(adonovan): return (nil, false) in this case and remove precond.
-// Requires FileSet; see loader.tokenFileContainsPos.
-//
-// Postcondition: path is never nil; it always contains at least 'root'.
-//
-func PathEnclosingInterval(root *ast.File, start, end token.Pos) (path []ast.Node, exact bool) {
-	// fmt.Printf("EnclosingInterval %d %d\n", start, end) // debugging
-
-	// Precondition: node.[Pos..End) and adjoining whitespace contain [start, end).
-	var visit func(node ast.Node) bool
-	visit = func(node ast.Node) bool {
-		path = append(path, node)
-
-		nodePos := node.Pos()
-		nodeEnd := node.End()
-
-		// fmt.Printf("visit(%T, %d, %d)\n", node, nodePos, nodeEnd) // debugging
-
-		// Intersect [start, end) with interval of node.
-		if start < nodePos {
-			start = nodePos
-		}
-		if end > nodeEnd {
-			end = nodeEnd
-		}
-
-		// Find sole child that contains [start, end).
-		children := childrenOf(node)
-		l := len(children)
-		for i, child := range children {
-			// [childPos, childEnd) is unaugmented interval of child.
-			childPos := child.Pos()
-			childEnd := child.End()
-
-			// [augPos, augEnd) is whitespace-augmented interval of child.
-			augPos := childPos
-			augEnd := childEnd
-			if i > 0 {
-				augPos = children[i-1].End() // start of preceding whitespace
-			}
-			if i < l-1 {
-				nextChildPos := children[i+1].Pos()
-				// Does [start, end) lie between child and next child?
-				if start >= augEnd && end <= nextChildPos {
-					return false // inexact match
-				}
-				augEnd = nextChildPos // end of following whitespace
-			}
-
-			// fmt.Printf("\tchild %d: [%d..%d)\tcontains interval [%d..%d)?\n",
-			// 	i, augPos, augEnd, start, end) // debugging
-
-			// Does augmented child strictly contain [start, end)?
-			if augPos <= start && end <= augEnd {
-				_, isToken := child.(tokenNode)
-				return isToken || visit(child)
-			}
-
-			// Does [start, end) overlap multiple children?
-			// i.e. left-augmented child contains start
-			// but LR-augmented child does not contain end.
-			if start < childEnd && end > augEnd {
-				break
-			}
-		}
-
-		// No single child contained [start, end),
-		// so node is the result.  Is it exact?
-
-		// (It's tempting to put this condition before the
-		// child loop, but it gives the wrong result in the
-		// case where a node (e.g. ExprStmt) and its sole
-		// child have equal intervals.)
-		if start == nodePos && end == nodeEnd {
-			return true // exact match
-		}
-
-		return false // inexact: overlaps multiple children
-	}
-
-	if start > end {
-		start, end = end, start
-	}
-
-	if start < root.End() && end > root.Pos() {
-		if start == end {
-			end = start + 1 // empty interval => interval of size 1
-		}
-		exact = visit(root)
-
-		// Reverse the path:
-		for i, l := 0, len(path); i < l/2; i++ {
-			path[i], path[l-1-i] = path[l-1-i], path[i]
-		}
-	} else {
-		// Selection lies within whitespace preceding the
-		// first (or following the last) declaration in the file.
-		// The result nonetheless always includes the ast.File.
-		path = append(path, root)
-	}
-
-	return
-}
-
-// tokenNode is a dummy implementation of ast.Node for a single token.
-// They are used transiently by PathEnclosingInterval but never escape
-// this package.
-//
-type tokenNode struct {
-	pos token.Pos
-	end token.Pos
-}
-
-func (n tokenNode) Pos() token.Pos {
-	return n.pos
-}
-
-func (n tokenNode) End() token.Pos {
-	return n.end
-}
-
-func tok(pos token.Pos, len int) ast.Node {
-	return tokenNode{pos, pos + token.Pos(len)}
-}
-
-// childrenOf returns the direct non-nil children of ast.Node n.
-// It may include fake ast.Node implementations for bare tokens.
-// it is not safe to call (e.g.) ast.Walk on such nodes.
-//
-func childrenOf(n ast.Node) []ast.Node {
-	var children []ast.Node
-
-	// First add nodes for all true subtrees.
-	ast.Inspect(n, func(node ast.Node) bool {
-		if node == n { // push n
-			return true // recur
-		}
-		if node != nil { // push child
-			children = append(children, node)
-		}
-		return false // no recursion
-	})
-
-	// Then add fake Nodes for bare tokens.
-	switch n := n.(type) {
-	case *ast.ArrayType:
-		children = append(children,
-			tok(n.Lbrack, len("[")),
-			tok(n.Elt.End(), len("]")))
-
-	case *ast.AssignStmt:
-		children = append(children,
-			tok(n.TokPos, len(n.Tok.String())))
-
-	case *ast.BasicLit:
-		children = append(children,
-			tok(n.ValuePos, len(n.Value)))
-
-	case *ast.BinaryExpr:
-		children = append(children, tok(n.OpPos, len(n.Op.String())))
-
-	case *ast.BlockStmt:
-		children = append(children,
-			tok(n.Lbrace, len("{")),
-			tok(n.Rbrace, len("}")))
-
-	case *ast.BranchStmt:
-		children = append(children,
-			tok(n.TokPos, len(n.Tok.String())))
-
-	case *ast.CallExpr:
-		children = append(children,
-			tok(n.Lparen, len("(")),
-			tok(n.Rparen, len(")")))
-		if n.Ellipsis != 0 {
-			children = append(children, tok(n.Ellipsis, len("...")))
-		}
-
-	case *ast.CaseClause:
-		if n.List == nil {
-			children = append(children,
-				tok(n.Case, len("default")))
-		} else {
-			children = append(children,
-				tok(n.Case, len("case")))
-		}
-		children = append(children, tok(n.Colon, len(":")))
-
-	case *ast.ChanType:
-		switch n.Dir {
-		case ast.RECV:
-			children = append(children, tok(n.Begin, len("<-chan")))
-		case ast.SEND:
-			children = append(children, tok(n.Begin, len("chan<-")))
-		case ast.RECV | ast.SEND:
-			children = append(children, tok(n.Begin, len("chan")))
-		}
-
-	case *ast.CommClause:
-		if n.Comm == nil {
-			children = append(children,
-				tok(n.Case, len("default")))
-		} else {
-			children = append(children,
-				tok(n.Case, len("case")))
-		}
-		children = append(children, tok(n.Colon, len(":")))
-
-	case *ast.Comment:
-		// nop
-
-	case *ast.CommentGroup:
-		// nop
-
-	case *ast.CompositeLit:
-		children = append(children,
-			tok(n.Lbrace, len("{")),
-			tok(n.Rbrace, len("{")))
-
-	case *ast.DeclStmt:
-		// nop
-
-	case *ast.DeferStmt:
-		children = append(children,
-			tok(n.Defer, len("defer")))
-
-	case *ast.Ellipsis:
-		children = append(children,
-			tok(n.Ellipsis, len("...")))
-
-	case *ast.EmptyStmt:
-		// nop
-
-	case *ast.ExprStmt:
-		// nop
-
-	case *ast.Field:
-		// TODO(adonovan): Field.{Doc,Comment,Tag}?
-
-	case *ast.FieldList:
-		children = append(children,
-			tok(n.Opening, len("(")),
-			tok(n.Closing, len(")")))
-
-	case *ast.File:
-		// TODO test: Doc
-		children = append(children,
-			tok(n.Package, len("package")))
-
-	case *ast.ForStmt:
-		children = append(children,
-			tok(n.For, len("for")))
-
-	case *ast.FuncDecl:
-		// TODO(adonovan): FuncDecl.Comment?
-
-		// Uniquely, FuncDecl breaks the invariant that
-		// preorder traversal yields tokens in lexical order:
-		// in fact, FuncDecl.Recv precedes FuncDecl.Type.Func.
-		//
-		// As a workaround, we inline the case for FuncType
-		// here and order things correctly.
-		//
-		children = nil // discard ast.Walk(FuncDecl) info subtrees
-		children = append(children, tok(n.Type.Func, len("func")))
-		if n.Recv != nil {
-			children = append(children, n.Recv)
-		}
-		children = append(children, n.Name)
-		if n.Type.Params != nil {
-			children = append(children, n.Type.Params)
-		}
-		if n.Type.Results != nil {
-			children = append(children, n.Type.Results)
-		}
-		if n.Body != nil {
-			children = append(children, n.Body)
-		}
-
-	case *ast.FuncLit:
-		// nop
-
-	case *ast.FuncType:
-		if n.Func != 0 {
-			children = append(children,
-				tok(n.Func, len("func")))
-		}
-
-	case *ast.GenDecl:
-		children = append(children,
-			tok(n.TokPos, len(n.Tok.String())))
-		if n.Lparen != 0 {
-			children = append(children,
-				tok(n.Lparen, len("(")),
-				tok(n.Rparen, len(")")))
-		}
-
-	case *ast.GoStmt:
-		children = append(children,
-			tok(n.Go, len("go")))
-
-	case *ast.Ident:
-		children = append(children,
-			tok(n.NamePos, len(n.Name)))
-
-	case *ast.IfStmt:
-		children = append(children,
-			tok(n.If, len("if")))
-
-	case *ast.ImportSpec:
-		// TODO(adonovan): ImportSpec.{Doc,EndPos}?
-
-	case *ast.IncDecStmt:
-		children = append(children,
-			tok(n.TokPos, len(n.Tok.String())))
-
-	case *ast.IndexExpr:
-		children = append(children,
-			tok(n.Lbrack, len("{")),
-			tok(n.Rbrack, len("}")))
-
-	case *ast.InterfaceType:
-		children = append(children,
-			tok(n.Interface, len("interface")))
-
-	case *ast.KeyValueExpr:
-		children = append(children,
-			tok(n.Colon, len(":")))
-
-	case *ast.LabeledStmt:
-		children = append(children,
-			tok(n.Colon, len(":")))
-
-	case *ast.MapType:
-		children = append(children,
-			tok(n.Map, len("map")))
-
-	case *ast.ParenExpr:
-		children = append(children,
-			tok(n.Lparen, len("(")),
-			tok(n.Rparen, len(")")))
-
-	case *ast.RangeStmt:
-		children = append(children,
-			tok(n.For, len("for")),
-			tok(n.TokPos, len(n.Tok.String())))
-
-	case *ast.ReturnStmt:
-		children = append(children,
-			tok(n.Return, len("return")))
-
-	case *ast.SelectStmt:
-		children = append(children,
-			tok(n.Select, len("select")))
-
-	case *ast.SelectorExpr:
-		// nop
-
-	case *ast.SendStmt:
-		children = append(children,
-			tok(n.Arrow, len("<-")))
-
-	case *ast.SliceExpr:
-		children = append(children,
-			tok(n.Lbrack, len("[")),
-			tok(n.Rbrack, len("]")))
-
-	case *ast.StarExpr:
-		children = append(children, tok(n.Star, len("*")))
-
-	case *ast.StructType:
-		children = append(children, tok(n.Struct, len("struct")))
-
-	case *ast.SwitchStmt:
-		children = append(children, tok(n.Switch, len("switch")))
-
-	case *ast.TypeAssertExpr:
-		children = append(children,
-			tok(n.Lparen-1, len(".")),
-			tok(n.Lparen, len("(")),
-			tok(n.Rparen, len(")")))
-
-	case *ast.TypeSpec:
-		// TODO(adonovan): TypeSpec.{Doc,Comment}?
-
-	case *ast.TypeSwitchStmt:
-		children = append(children, tok(n.Switch, len("switch")))
-
-	case *ast.UnaryExpr:
-		children = append(children, tok(n.OpPos, len(n.Op.String())))
-
-	case *ast.ValueSpec:
-		// TODO(adonovan): ValueSpec.{Doc,Comment}?
-
-	default:
-		// Includes *ast.BadDecl, *ast.BadExpr, *ast.BadStmt.
-		panic(fmt.Sprintf("unexpected node type %T", n))
-	}
-
-	// TODO(adonovan): opt: merge the logic of ast.Inspect() into
-	// the switch above so we can make interleaved callbacks for
-	// both Nodes and Tokens in the right order and avoid the need
-	// to sort.
-	sort.Sort(byPos(children))
-
-	return children
-}
-
-type byPos []ast.Node
-
-func (sl byPos) Len() int {
-	return len(sl)
-}
-func (sl byPos) Less(i, j int) bool {
-	return sl[i].Pos() < sl[j].Pos()
-}
-func (sl byPos) Swap(i, j int) {
-	sl[i], sl[j] = sl[j], sl[i]
-}
-
-// NodeDescription returns a description of the concrete type of n suitable
-// for a user interface.
-//
-// TODO(adonovan): in some cases (e.g. Field, FieldList, Ident,
-// StarExpr) we could be much more specific given the path to the AST
-// root.  Perhaps we should do that.
-//
-func NodeDescription(n ast.Node) string {
-	switch n := n.(type) {
-	case *ast.ArrayType:
-		return "array type"
-	case *ast.AssignStmt:
-		return "assignment"
-	case *ast.BadDecl:
-		return "bad declaration"
-	case *ast.BadExpr:
-		return "bad expression"
-	case *ast.BadStmt:
-		return "bad statement"
-	case *ast.BasicLit:
-		return "basic literal"
-	case *ast.BinaryExpr:
-		return fmt.Sprintf("binary %s operation", n.Op)
-	case *ast.BlockStmt:
-		return "block"
-	case *ast.BranchStmt:
-		switch n.Tok {
-		case token.BREAK:
-			return "break statement"
-		case token.CONTINUE:
-			return "continue statement"
-		case token.GOTO:
-			return "goto statement"
-		case token.FALLTHROUGH:
-			return "fall-through statement"
-		}
-	case *ast.CallExpr:
-		return "function call (or conversion)"
-	case *ast.CaseClause:
-		return "case clause"
-	case *ast.ChanType:
-		return "channel type"
-	case *ast.CommClause:
-		return "communication clause"
-	case *ast.Comment:
-		return "comment"
-	case *ast.CommentGroup:
-		return "comment group"
-	case *ast.CompositeLit:
-		return "composite literal"
-	case *ast.DeclStmt:
-		return NodeDescription(n.Decl) + " statement"
-	case *ast.DeferStmt:
-		return "defer statement"
-	case *ast.Ellipsis:
-		return "ellipsis"
-	case *ast.EmptyStmt:
-		return "empty statement"
-	case *ast.ExprStmt:
-		return "expression statement"
-	case *ast.Field:
-		// Can be any of these:
-		// struct {x, y int}  -- struct field(s)
-		// struct {T}         -- anon struct field
-		// interface {I}      -- interface embedding
-		// interface {f()}    -- interface method
-		// func (A) func(B) C -- receiver, param(s), result(s)
-		return "field/method/parameter"
-	case *ast.FieldList:
-		return "field/method/parameter list"
-	case *ast.File:
-		return "source file"
-	case *ast.ForStmt:
-		return "for loop"
-	case *ast.FuncDecl:
-		return "function declaration"
-	case *ast.FuncLit:
-		return "function literal"
-	case *ast.FuncType:
-		return "function type"
-	case *ast.GenDecl:
-		switch n.Tok {
-		case token.IMPORT:
-			return "import declaration"
-		case token.CONST:
-			return "constant declaration"
-		case token.TYPE:
-			return "type declaration"
-		case token.VAR:
-			return "variable declaration"
-		}
-	case *ast.GoStmt:
-		return "go statement"
-	case *ast.Ident:
-		return "identifier"
-	case *ast.IfStmt:
-		return "if statement"
-	case *ast.ImportSpec:
-		return "import specification"
-	case *ast.IncDecStmt:
-		if n.Tok == token.INC {
-			return "increment statement"
-		}
-		return "decrement statement"
-	case *ast.IndexExpr:
-		return "index expression"
-	case *ast.InterfaceType:
-		return "interface type"
-	case *ast.KeyValueExpr:
-		return "key/value association"
-	case *ast.LabeledStmt:
-		return "statement label"
-	case *ast.MapType:
-		return "map type"
-	case *ast.Package:
-		return "package"
-	case *ast.ParenExpr:
-		return "parenthesized " + NodeDescription(n.X)
-	case *ast.RangeStmt:
-		return "range loop"
-	case *ast.ReturnStmt:
-		return "return statement"
-	case *ast.SelectStmt:
-		return "select statement"
-	case *ast.SelectorExpr:
-		return "selector"
-	case *ast.SendStmt:
-		return "channel send"
-	case *ast.SliceExpr:
-		return "slice expression"
-	case *ast.StarExpr:
-		return "*-operation" // load/store expr or pointer type
-	case *ast.StructType:
-		return "struct type"
-	case *ast.SwitchStmt:
-		return "switch statement"
-	case *ast.TypeAssertExpr:
-		return "type assertion"
-	case *ast.TypeSpec:
-		return "type specification"
-	case *ast.TypeSwitchStmt:
-		return "type switch"
-	case *ast.UnaryExpr:
-		return fmt.Sprintf("unary %s operation", n.Op)
-	case *ast.ValueSpec:
-		return "value specification"
-
-	}
-	panic(fmt.Sprintf("unexpected node type: %T", n))
-}
diff --git a/third_party/gotools/go/ast/astutil/enclosing_test.go b/third_party/gotools/go/ast/astutil/enclosing_test.go
deleted file mode 100644
index 001282a..0000000
--- a/third_party/gotools/go/ast/astutil/enclosing_test.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package astutil_test
-
-// This file defines tests of PathEnclosingInterval.
-
-// TODO(adonovan): exhaustive tests that run over the whole input
-// tree, not just handcrafted examples.
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"strings"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/ast/astutil"
-)
-
-// pathToString returns a string containing the concrete types of the
-// nodes in path.
-func pathToString(path []ast.Node) string {
-	var buf bytes.Buffer
-	fmt.Fprint(&buf, "[")
-	for i, n := range path {
-		if i > 0 {
-			fmt.Fprint(&buf, " ")
-		}
-		fmt.Fprint(&buf, strings.TrimPrefix(fmt.Sprintf("%T", n), "*ast."))
-	}
-	fmt.Fprint(&buf, "]")
-	return buf.String()
-}
-
-// findInterval parses input and returns the [start, end) positions of
-// the first occurrence of substr in input.  f==nil indicates failure;
-// an error has already been reported in that case.
-//
-func findInterval(t *testing.T, fset *token.FileSet, input, substr string) (f *ast.File, start, end token.Pos) {
-	f, err := parser.ParseFile(fset, "<input>", input, 0)
-	if err != nil {
-		t.Errorf("parse error: %s", err)
-		return
-	}
-
-	i := strings.Index(input, substr)
-	if i < 0 {
-		t.Errorf("%q is not a substring of input", substr)
-		f = nil
-		return
-	}
-
-	filePos := fset.File(f.Package)
-	return f, filePos.Pos(i), filePos.Pos(i + len(substr))
-}
-
-// Common input for following tests.
-const input = `
-// Hello.
-package main
-import "fmt"
-func f() {}
-func main() {
-	z := (x + y) // add them
-        f() // NB: ExprStmt and its CallExpr have same Pos/End
-}
-`
-
-func TestPathEnclosingInterval_Exact(t *testing.T) {
-	// For the exact tests, we check that a substring is mapped to
-	// the canonical string for the node it denotes.
-	tests := []struct {
-		substr string // first occurrence of this string indicates interval
-		node   string // complete text of expected containing node
-	}{
-		{"package",
-			input[11 : len(input)-1]},
-		{"\npack",
-			input[11 : len(input)-1]},
-		{"main",
-			"main"},
-		{"import",
-			"import \"fmt\""},
-		{"\"fmt\"",
-			"\"fmt\""},
-		{"\nfunc f() {}\n",
-			"func f() {}"},
-		{"x ",
-			"x"},
-		{" y",
-			"y"},
-		{"z",
-			"z"},
-		{" + ",
-			"x + y"},
-		{" :=",
-			"z := (x + y)"},
-		{"x + y",
-			"x + y"},
-		{"(x + y)",
-			"(x + y)"},
-		{" (x + y) ",
-			"(x + y)"},
-		{" (x + y) // add",
-			"(x + y)"},
-		{"func",
-			"func f() {}"},
-		{"func f() {}",
-			"func f() {}"},
-		{"\nfun",
-			"func f() {}"},
-		{" f",
-			"f"},
-	}
-	for _, test := range tests {
-		f, start, end := findInterval(t, new(token.FileSet), input, test.substr)
-		if f == nil {
-			continue
-		}
-
-		path, exact := astutil.PathEnclosingInterval(f, start, end)
-		if !exact {
-			t.Errorf("PathEnclosingInterval(%q) not exact", test.substr)
-			continue
-		}
-
-		if len(path) == 0 {
-			if test.node != "" {
-				t.Errorf("PathEnclosingInterval(%q).path: got [], want %q",
-					test.substr, test.node)
-			}
-			continue
-		}
-
-		if got := input[path[0].Pos():path[0].End()]; got != test.node {
-			t.Errorf("PathEnclosingInterval(%q): got %q, want %q (path was %s)",
-				test.substr, got, test.node, pathToString(path))
-			continue
-		}
-	}
-}
-
-func TestPathEnclosingInterval_Paths(t *testing.T) {
-	// For these tests, we check only the path of the enclosing
-	// node, but not its complete text because it's often quite
-	// large when !exact.
-	tests := []struct {
-		substr string // first occurrence of this string indicates interval
-		path   string // the pathToString(),exact of the expected path
-	}{
-		{"// add",
-			"[BlockStmt FuncDecl File],false"},
-		{"(x + y",
-			"[ParenExpr AssignStmt BlockStmt FuncDecl File],false"},
-		{"x +",
-			"[BinaryExpr ParenExpr AssignStmt BlockStmt FuncDecl File],false"},
-		{"z := (x",
-			"[AssignStmt BlockStmt FuncDecl File],false"},
-		{"func f",
-			"[FuncDecl File],false"},
-		{"func f()",
-			"[FuncDecl File],false"},
-		{" f()",
-			"[FuncDecl File],false"},
-		{"() {}",
-			"[FuncDecl File],false"},
-		{"// Hello",
-			"[File],false"},
-		{" f",
-			"[Ident FuncDecl File],true"},
-		{"func ",
-			"[FuncDecl File],true"},
-		{"mai",
-			"[Ident File],true"},
-		{"f() // NB",
-			"[CallExpr ExprStmt BlockStmt FuncDecl File],true"},
-	}
-	for _, test := range tests {
-		f, start, end := findInterval(t, new(token.FileSet), input, test.substr)
-		if f == nil {
-			continue
-		}
-
-		path, exact := astutil.PathEnclosingInterval(f, start, end)
-		if got := fmt.Sprintf("%s,%v", pathToString(path), exact); got != test.path {
-			t.Errorf("PathEnclosingInterval(%q): got %q, want %q",
-				test.substr, got, test.path)
-			continue
-		}
-	}
-}
diff --git a/third_party/gotools/go/ast/astutil/imports.go b/third_party/gotools/go/ast/astutil/imports.go
deleted file mode 100644
index 5a4820f..0000000
--- a/third_party/gotools/go/ast/astutil/imports.go
+++ /dev/null
@@ -1,356 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package astutil contains common utilities for working with the Go AST.
-package astutil // import "llvm.org/llgo/third_party/gotools/go/ast/astutil"
-
-import (
-	"fmt"
-	"go/ast"
-	"go/token"
-	"strconv"
-	"strings"
-)
-
-// AddImport adds the import path to the file f, if absent.
-func AddImport(fset *token.FileSet, f *ast.File, ipath string) (added bool) {
-	return AddNamedImport(fset, f, "", ipath)
-}
-
-// AddNamedImport adds the import path to the file f, if absent.
-// If name is not empty, it is used to rename the import.
-//
-// For example, calling
-//	AddNamedImport(fset, f, "pathpkg", "path")
-// adds
-//	import pathpkg "path"
-func AddNamedImport(fset *token.FileSet, f *ast.File, name, ipath string) (added bool) {
-	if imports(f, ipath) {
-		return false
-	}
-
-	newImport := &ast.ImportSpec{
-		Path: &ast.BasicLit{
-			Kind:  token.STRING,
-			Value: strconv.Quote(ipath),
-		},
-	}
-	if name != "" {
-		newImport.Name = &ast.Ident{Name: name}
-	}
-
-	// Find an import decl to add to.
-	// The goal is to find an existing import
-	// whose import path has the longest shared
-	// prefix with ipath.
-	var (
-		bestMatch  = -1         // length of longest shared prefix
-		lastImport = -1         // index in f.Decls of the file's final import decl
-		impDecl    *ast.GenDecl // import decl containing the best match
-		impIndex   = -1         // spec index in impDecl containing the best match
-	)
-	for i, decl := range f.Decls {
-		gen, ok := decl.(*ast.GenDecl)
-		if ok && gen.Tok == token.IMPORT {
-			lastImport = i
-			// Do not add to import "C", to avoid disrupting the
-			// association with its doc comment, breaking cgo.
-			if declImports(gen, "C") {
-				continue
-			}
-
-			// Match an empty import decl if that's all that is available.
-			if len(gen.Specs) == 0 && bestMatch == -1 {
-				impDecl = gen
-			}
-
-			// Compute longest shared prefix with imports in this group.
-			for j, spec := range gen.Specs {
-				impspec := spec.(*ast.ImportSpec)
-				n := matchLen(importPath(impspec), ipath)
-				if n > bestMatch {
-					bestMatch = n
-					impDecl = gen
-					impIndex = j
-				}
-			}
-		}
-	}
-
-	// If no import decl found, add one after the last import.
-	if impDecl == nil {
-		impDecl = &ast.GenDecl{
-			Tok: token.IMPORT,
-		}
-		if lastImport >= 0 {
-			impDecl.TokPos = f.Decls[lastImport].End()
-		} else {
-			// There are no existing imports.
-			// Our new import goes after the package declaration and after
-			// the comment, if any, that starts on the same line as the
-			// package declaration.
-			impDecl.TokPos = f.Package
-
-			file := fset.File(f.Package)
-			pkgLine := file.Line(f.Package)
-			for _, c := range f.Comments {
-				if file.Line(c.Pos()) > pkgLine {
-					break
-				}
-				impDecl.TokPos = c.End()
-			}
-		}
-		f.Decls = append(f.Decls, nil)
-		copy(f.Decls[lastImport+2:], f.Decls[lastImport+1:])
-		f.Decls[lastImport+1] = impDecl
-	}
-
-	// Insert new import at insertAt.
-	insertAt := 0
-	if impIndex >= 0 {
-		// insert after the found import
-		insertAt = impIndex + 1
-	}
-	impDecl.Specs = append(impDecl.Specs, nil)
-	copy(impDecl.Specs[insertAt+1:], impDecl.Specs[insertAt:])
-	impDecl.Specs[insertAt] = newImport
-	pos := impDecl.Pos()
-	if insertAt > 0 {
-		// Assign same position as the previous import,
-		// so that the sorter sees it as being in the same block.
-		pos = impDecl.Specs[insertAt-1].Pos()
-	}
-	newImport.Path.ValuePos = pos
-	newImport.EndPos = pos
-
-	// Clean up parens. impDecl contains at least one spec.
-	if len(impDecl.Specs) == 1 {
-		// Remove unneeded parens.
-		impDecl.Lparen = token.NoPos
-	} else if !impDecl.Lparen.IsValid() {
-		// impDecl needs parens added.
-		impDecl.Lparen = impDecl.Specs[0].Pos()
-	}
-
-	f.Imports = append(f.Imports, newImport)
-	return true
-}
-
-// DeleteImport deletes the import path from the file f, if present.
-func DeleteImport(fset *token.FileSet, f *ast.File, path string) (deleted bool) {
-	var delspecs []*ast.ImportSpec
-
-	// Find the import nodes that import path, if any.
-	for i := 0; i < len(f.Decls); i++ {
-		decl := f.Decls[i]
-		gen, ok := decl.(*ast.GenDecl)
-		if !ok || gen.Tok != token.IMPORT {
-			continue
-		}
-		for j := 0; j < len(gen.Specs); j++ {
-			spec := gen.Specs[j]
-			impspec := spec.(*ast.ImportSpec)
-			if importPath(impspec) != path {
-				continue
-			}
-
-			// We found an import spec that imports path.
-			// Delete it.
-			delspecs = append(delspecs, impspec)
-			deleted = true
-			copy(gen.Specs[j:], gen.Specs[j+1:])
-			gen.Specs = gen.Specs[:len(gen.Specs)-1]
-
-			// If this was the last import spec in this decl,
-			// delete the decl, too.
-			if len(gen.Specs) == 0 {
-				copy(f.Decls[i:], f.Decls[i+1:])
-				f.Decls = f.Decls[:len(f.Decls)-1]
-				i--
-				break
-			} else if len(gen.Specs) == 1 {
-				gen.Lparen = token.NoPos // drop parens
-			}
-			if j > 0 {
-				lastImpspec := gen.Specs[j-1].(*ast.ImportSpec)
-				lastLine := fset.Position(lastImpspec.Path.ValuePos).Line
-				line := fset.Position(impspec.Path.ValuePos).Line
-
-				// We deleted an entry but now there may be
-				// a blank line-sized hole where the import was.
-				if line-lastLine > 1 {
-					// There was a blank line immediately preceding the deleted import,
-					// so there's no need to close the hole.
-					// Do nothing.
-				} else {
-					// There was no blank line. Close the hole.
-					fset.File(gen.Rparen).MergeLine(line)
-				}
-			}
-			j--
-		}
-	}
-
-	// Delete them from f.Imports.
-	for i := 0; i < len(f.Imports); i++ {
-		imp := f.Imports[i]
-		for j, del := range delspecs {
-			if imp == del {
-				copy(f.Imports[i:], f.Imports[i+1:])
-				f.Imports = f.Imports[:len(f.Imports)-1]
-				copy(delspecs[j:], delspecs[j+1:])
-				delspecs = delspecs[:len(delspecs)-1]
-				i--
-				break
-			}
-		}
-	}
-
-	if len(delspecs) > 0 {
-		panic(fmt.Sprintf("deleted specs from Decls but not Imports: %v", delspecs))
-	}
-
-	return
-}
-
-// RewriteImport rewrites any import of path oldPath to path newPath.
-func RewriteImport(fset *token.FileSet, f *ast.File, oldPath, newPath string) (rewrote bool) {
-	for _, imp := range f.Imports {
-		if importPath(imp) == oldPath {
-			rewrote = true
-			// record old End, because the default is to compute
-			// it using the length of imp.Path.Value.
-			imp.EndPos = imp.End()
-			imp.Path.Value = strconv.Quote(newPath)
-		}
-	}
-	return
-}
-
-// UsesImport reports whether a given import is used.
-func UsesImport(f *ast.File, path string) (used bool) {
-	spec := importSpec(f, path)
-	if spec == nil {
-		return
-	}
-
-	name := spec.Name.String()
-	switch name {
-	case "<nil>":
-		// If the package name is not explicitly specified,
-		// make an educated guess. This is not guaranteed to be correct.
-		lastSlash := strings.LastIndex(path, "/")
-		if lastSlash == -1 {
-			name = path
-		} else {
-			name = path[lastSlash+1:]
-		}
-	case "_", ".":
-		// Not sure if this import is used - err on the side of caution.
-		return true
-	}
-
-	ast.Walk(visitFn(func(n ast.Node) {
-		sel, ok := n.(*ast.SelectorExpr)
-		if ok && isTopName(sel.X, name) {
-			used = true
-		}
-	}), f)
-
-	return
-}
-
-type visitFn func(node ast.Node)
-
-func (fn visitFn) Visit(node ast.Node) ast.Visitor {
-	fn(node)
-	return fn
-}
-
-// imports returns true if f imports path.
-func imports(f *ast.File, path string) bool {
-	return importSpec(f, path) != nil
-}
-
-// importSpec returns the import spec if f imports path,
-// or nil otherwise.
-func importSpec(f *ast.File, path string) *ast.ImportSpec {
-	for _, s := range f.Imports {
-		if importPath(s) == path {
-			return s
-		}
-	}
-	return nil
-}
-
-// importPath returns the unquoted import path of s,
-// or "" if the path is not properly quoted.
-func importPath(s *ast.ImportSpec) string {
-	t, err := strconv.Unquote(s.Path.Value)
-	if err == nil {
-		return t
-	}
-	return ""
-}
-
-// declImports reports whether gen contains an import of path.
-func declImports(gen *ast.GenDecl, path string) bool {
-	if gen.Tok != token.IMPORT {
-		return false
-	}
-	for _, spec := range gen.Specs {
-		impspec := spec.(*ast.ImportSpec)
-		if importPath(impspec) == path {
-			return true
-		}
-	}
-	return false
-}
-
-// matchLen returns the length of the longest path segment prefix shared by x and y.
-func matchLen(x, y string) int {
-	n := 0
-	for i := 0; i < len(x) && i < len(y) && x[i] == y[i]; i++ {
-		if x[i] == '/' {
-			n++
-		}
-	}
-	return n
-}
-
-// isTopName returns true if n is a top-level unresolved identifier with the given name.
-func isTopName(n ast.Expr, name string) bool {
-	id, ok := n.(*ast.Ident)
-	return ok && id.Name == name && id.Obj == nil
-}
-
-// Imports returns the file imports grouped by paragraph.
-func Imports(fset *token.FileSet, f *ast.File) [][]*ast.ImportSpec {
-	var groups [][]*ast.ImportSpec
-
-	for _, decl := range f.Decls {
-		genDecl, ok := decl.(*ast.GenDecl)
-		if !ok || genDecl.Tok != token.IMPORT {
-			break
-		}
-
-		group := []*ast.ImportSpec{}
-
-		var lastLine int
-		for _, spec := range genDecl.Specs {
-			importSpec := spec.(*ast.ImportSpec)
-			pos := importSpec.Path.ValuePos
-			line := fset.Position(pos).Line
-			if lastLine > 0 && pos > 0 && line-lastLine > 1 {
-				groups = append(groups, group)
-				group = []*ast.ImportSpec{}
-			}
-			group = append(group, importSpec)
-			lastLine = line
-		}
-		groups = append(groups, group)
-	}
-
-	return groups
-}
diff --git a/third_party/gotools/go/ast/astutil/imports_test.go b/third_party/gotools/go/ast/astutil/imports_test.go
deleted file mode 100644
index 2c901d2..0000000
--- a/third_party/gotools/go/ast/astutil/imports_test.go
+++ /dev/null
@@ -1,930 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package astutil
-
-import (
-	"bytes"
-	"go/ast"
-	"go/format"
-	"go/parser"
-	"go/token"
-	"reflect"
-	"strconv"
-	"testing"
-)
-
-var fset = token.NewFileSet()
-
-func parse(t *testing.T, name, in string) *ast.File {
-	file, err := parser.ParseFile(fset, name, in, parser.ParseComments)
-	if err != nil {
-		t.Fatalf("%s parse: %v", name, err)
-	}
-	return file
-}
-
-func print(t *testing.T, name string, f *ast.File) string {
-	var buf bytes.Buffer
-	if err := format.Node(&buf, fset, f); err != nil {
-		t.Fatalf("%s gofmt: %v", name, err)
-	}
-	return string(buf.Bytes())
-}
-
-type test struct {
-	name       string
-	renamedPkg string
-	pkg        string
-	in         string
-	out        string
-	broken     bool // known broken
-}
-
-var addTests = []test{
-	{
-		name: "leave os alone",
-		pkg:  "os",
-		in: `package main
-
-import (
-	"os"
-)
-`,
-		out: `package main
-
-import (
-	"os"
-)
-`,
-	},
-	{
-		name: "import.1",
-		pkg:  "os",
-		in: `package main
-`,
-		out: `package main
-
-import "os"
-`,
-	},
-	{
-		name: "import.2",
-		pkg:  "os",
-		in: `package main
-
-// Comment
-import "C"
-`,
-		out: `package main
-
-// Comment
-import "C"
-import "os"
-`,
-	},
-	{
-		name: "import.3",
-		pkg:  "os",
-		in: `package main
-
-// Comment
-import "C"
-
-import (
-	"io"
-	"utf8"
-)
-`,
-		out: `package main
-
-// Comment
-import "C"
-
-import (
-	"io"
-	"os"
-	"utf8"
-)
-`,
-	},
-	{
-		name: "import.17",
-		pkg:  "x/y/z",
-		in: `package main
-
-// Comment
-import "C"
-
-import (
-	"a"
-	"b"
-
-	"x/w"
-
-	"d/f"
-)
-`,
-		out: `package main
-
-// Comment
-import "C"
-
-import (
-	"a"
-	"b"
-
-	"x/w"
-	"x/y/z"
-
-	"d/f"
-)
-`,
-	},
-	{
-		name: "import into singular group",
-		pkg:  "bytes",
-		in: `package main
-
-import "os"
-
-`,
-		out: `package main
-
-import (
-	"bytes"
-	"os"
-)
-`,
-	},
-	{
-		name: "import into singular group with comment",
-		pkg:  "bytes",
-		in: `package main
-
-import /* why */ /* comment here? */ "os"
-
-`,
-		out: `package main
-
-import /* why */ /* comment here? */ (
-	"bytes"
-	"os"
-)
-`,
-	},
-	{
-		name: "import into group with leading comment",
-		pkg:  "strings",
-		in: `package main
-
-import (
-	// comment before bytes
-	"bytes"
-	"os"
-)
-
-`,
-		out: `package main
-
-import (
-	// comment before bytes
-	"bytes"
-	"os"
-	"strings"
-)
-`,
-	},
-	{
-		name:       "",
-		renamedPkg: "fmtpkg",
-		pkg:        "fmt",
-		in: `package main
-
-import "os"
-
-`,
-		out: `package main
-
-import (
-	fmtpkg "fmt"
-	"os"
-)
-`,
-	},
-	{
-		name: "struct comment",
-		pkg:  "time",
-		in: `package main
-
-// This is a comment before a struct.
-type T struct {
-	t  time.Time
-}
-`,
-		out: `package main
-
-import "time"
-
-// This is a comment before a struct.
-type T struct {
-	t time.Time
-}
-`,
-	},
-	{
-		name: "issue 8729 import C",
-		pkg:  "time",
-		in: `package main
-
-import "C"
-
-// comment
-type T time.Time
-`,
-		out: `package main
-
-import "C"
-import "time"
-
-// comment
-type T time.Time
-`,
-	},
-	{
-		name: "issue 8729 empty import",
-		pkg:  "time",
-		in: `package main
-
-import ()
-
-// comment
-type T time.Time
-`,
-		out: `package main
-
-import "time"
-
-// comment
-type T time.Time
-`,
-	},
-	{
-		name: "issue 8729 comment on package line",
-		pkg:  "time",
-		in: `package main // comment
-
-type T time.Time
-`,
-		out: `package main // comment
-import "time"
-
-type T time.Time
-`,
-	},
-	{
-		name: "issue 8729 comment after package",
-		pkg:  "time",
-		in: `package main
-// comment
-
-type T time.Time
-`,
-		out: `package main
-
-import "time"
-
-// comment
-
-type T time.Time
-`,
-	},
-	{
-		name: "issue 8729 comment before and on package line",
-		pkg:  "time",
-		in: `// comment before
-package main // comment on
-
-type T time.Time
-`,
-		out: `// comment before
-package main // comment on
-import "time"
-
-type T time.Time
-`,
-	},
-
-	// Issue 9961: Match prefixes using path segments rather than bytes
-	{
-		name: "issue 9961",
-		pkg:  "regexp",
-		in: `package main
-
-import (
-	"flag"
-	"testing"
-
-	"rsc.io/p"
-)
-`,
-		out: `package main
-
-import (
-	"flag"
-	"regexp"
-	"testing"
-
-	"rsc.io/p"
-)
-`,
-	},
-}
-
-func TestAddImport(t *testing.T) {
-	for _, test := range addTests {
-		file := parse(t, test.name, test.in)
-		var before bytes.Buffer
-		ast.Fprint(&before, fset, file, nil)
-		AddNamedImport(fset, file, test.renamedPkg, test.pkg)
-		if got := print(t, test.name, file); got != test.out {
-			if test.broken {
-				t.Logf("%s is known broken:\ngot: %s\nwant: %s", test.name, got, test.out)
-			} else {
-				t.Errorf("%s:\ngot: %s\nwant: %s", test.name, got, test.out)
-			}
-			var after bytes.Buffer
-			ast.Fprint(&after, fset, file, nil)
-
-			t.Logf("AST before:\n%s\nAST after:\n%s\n", before.String(), after.String())
-		}
-	}
-}
-
-func TestDoubleAddImport(t *testing.T) {
-	file := parse(t, "doubleimport", "package main\n")
-	AddImport(fset, file, "os")
-	AddImport(fset, file, "bytes")
-	want := `package main
-
-import (
-	"bytes"
-	"os"
-)
-`
-	if got := print(t, "doubleimport", file); got != want {
-		t.Errorf("got: %s\nwant: %s", got, want)
-	}
-}
-
-// Part of issue 8729.
-func TestDoubleAddImportWithDeclComment(t *testing.T) {
-	file := parse(t, "doubleimport", `package main
-
-import (
-)
-
-// comment
-type I int
-`)
-	// The AddImport order here matters.
-	AddImport(fset, file, "llvm.org/llgo/third_party/gotools/go/ast/astutil")
-	AddImport(fset, file, "os")
-	want := `package main
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/ast/astutil"
-	"os"
-)
-
-// comment
-type I int
-`
-	if got := print(t, "doubleimport_with_decl_comment", file); got != want {
-		t.Errorf("got: %s\nwant: %s", got, want)
-	}
-}
-
-var deleteTests = []test{
-	{
-		name: "import.4",
-		pkg:  "os",
-		in: `package main
-
-import (
-	"os"
-)
-`,
-		out: `package main
-`,
-	},
-	{
-		name: "import.5",
-		pkg:  "os",
-		in: `package main
-
-// Comment
-import "C"
-import "os"
-`,
-		out: `package main
-
-// Comment
-import "C"
-`,
-	},
-	{
-		name: "import.6",
-		pkg:  "os",
-		in: `package main
-
-// Comment
-import "C"
-
-import (
-	"io"
-	"os"
-	"utf8"
-)
-`,
-		out: `package main
-
-// Comment
-import "C"
-
-import (
-	"io"
-	"utf8"
-)
-`,
-	},
-	{
-		name: "import.7",
-		pkg:  "io",
-		in: `package main
-
-import (
-	"io"   // a
-	"os"   // b
-	"utf8" // c
-)
-`,
-		out: `package main
-
-import (
-	// a
-	"os"   // b
-	"utf8" // c
-)
-`,
-	},
-	{
-		name: "import.8",
-		pkg:  "os",
-		in: `package main
-
-import (
-	"io"   // a
-	"os"   // b
-	"utf8" // c
-)
-`,
-		out: `package main
-
-import (
-	"io" // a
-	// b
-	"utf8" // c
-)
-`,
-	},
-	{
-		name: "import.9",
-		pkg:  "utf8",
-		in: `package main
-
-import (
-	"io"   // a
-	"os"   // b
-	"utf8" // c
-)
-`,
-		out: `package main
-
-import (
-	"io" // a
-	"os" // b
-	// c
-)
-`,
-	},
-	{
-		name: "import.10",
-		pkg:  "io",
-		in: `package main
-
-import (
-	"io"
-	"os"
-	"utf8"
-)
-`,
-		out: `package main
-
-import (
-	"os"
-	"utf8"
-)
-`,
-	},
-	{
-		name: "import.11",
-		pkg:  "os",
-		in: `package main
-
-import (
-	"io"
-	"os"
-	"utf8"
-)
-`,
-		out: `package main
-
-import (
-	"io"
-	"utf8"
-)
-`,
-	},
-	{
-		name: "import.12",
-		pkg:  "utf8",
-		in: `package main
-
-import (
-	"io"
-	"os"
-	"utf8"
-)
-`,
-		out: `package main
-
-import (
-	"io"
-	"os"
-)
-`,
-	},
-	{
-		name: "handle.raw.quote.imports",
-		pkg:  "os",
-		in:   "package main\n\nimport `os`",
-		out: `package main
-`,
-	},
-	{
-		name: "import.13",
-		pkg:  "io",
-		in: `package main
-
-import (
-	"fmt"
-
-	"io"
-	"os"
-	"utf8"
-
-	"go/format"
-)
-`,
-		out: `package main
-
-import (
-	"fmt"
-
-	"os"
-	"utf8"
-
-	"go/format"
-)
-`,
-	},
-	{
-		name: "import.14",
-		pkg:  "io",
-		in: `package main
-
-import (
-	"fmt" // a
-
-	"io"   // b
-	"os"   // c
-	"utf8" // d
-
-	"go/format" // e
-)
-`,
-		out: `package main
-
-import (
-	"fmt" // a
-
-	// b
-	"os"   // c
-	"utf8" // d
-
-	"go/format" // e
-)
-`,
-	},
-	{
-		name: "import.15",
-		pkg:  "double",
-		in: `package main
-
-import (
-	"double"
-	"double"
-)
-`,
-		out: `package main
-`,
-	},
-	{
-		name: "import.16",
-		pkg:  "bubble",
-		in: `package main
-
-import (
-	"toil"
-	"bubble"
-	"bubble"
-	"trouble"
-)
-`,
-		out: `package main
-
-import (
-	"toil"
-	"trouble"
-)
-`,
-	},
-	{
-		name: "import.17",
-		pkg:  "quad",
-		in: `package main
-
-import (
-	"quad"
-	"quad"
-)
-
-import (
-	"quad"
-	"quad"
-)
-`,
-		out: `package main
-`,
-	},
-}
-
-func TestDeleteImport(t *testing.T) {
-	for _, test := range deleteTests {
-		file := parse(t, test.name, test.in)
-		DeleteImport(fset, file, test.pkg)
-		if got := print(t, test.name, file); got != test.out {
-			t.Errorf("%s:\ngot: %s\nwant: %s", test.name, got, test.out)
-		}
-	}
-}
-
-type rewriteTest struct {
-	name   string
-	srcPkg string
-	dstPkg string
-	in     string
-	out    string
-}
-
-var rewriteTests = []rewriteTest{
-	{
-		name:   "import.13",
-		srcPkg: "utf8",
-		dstPkg: "encoding/utf8",
-		in: `package main
-
-import (
-	"io"
-	"os"
-	"utf8" // thanks ken
-)
-`,
-		out: `package main
-
-import (
-	"encoding/utf8" // thanks ken
-	"io"
-	"os"
-)
-`,
-	},
-	{
-		name:   "import.14",
-		srcPkg: "asn1",
-		dstPkg: "encoding/asn1",
-		in: `package main
-
-import (
-	"asn1"
-	"crypto"
-	"crypto/rsa"
-	_ "crypto/sha1"
-	"crypto/x509"
-	"crypto/x509/pkix"
-	"time"
-)
-
-var x = 1
-`,
-		out: `package main
-
-import (
-	"crypto"
-	"crypto/rsa"
-	_ "crypto/sha1"
-	"crypto/x509"
-	"crypto/x509/pkix"
-	"encoding/asn1"
-	"time"
-)
-
-var x = 1
-`,
-	},
-	{
-		name:   "import.15",
-		srcPkg: "url",
-		dstPkg: "net/url",
-		in: `package main
-
-import (
-	"bufio"
-	"net"
-	"path"
-	"url"
-)
-
-var x = 1 // comment on x, not on url
-`,
-		out: `package main
-
-import (
-	"bufio"
-	"net"
-	"net/url"
-	"path"
-)
-
-var x = 1 // comment on x, not on url
-`,
-	},
-	{
-		name:   "import.16",
-		srcPkg: "http",
-		dstPkg: "net/http",
-		in: `package main
-
-import (
-	"flag"
-	"http"
-	"log"
-	"text/template"
-)
-
-var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18
-`,
-		out: `package main
-
-import (
-	"flag"
-	"log"
-	"net/http"
-	"text/template"
-)
-
-var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18
-`,
-	},
-}
-
-func TestRewriteImport(t *testing.T) {
-	for _, test := range rewriteTests {
-		file := parse(t, test.name, test.in)
-		RewriteImport(fset, file, test.srcPkg, test.dstPkg)
-		if got := print(t, test.name, file); got != test.out {
-			t.Errorf("%s:\ngot: %s\nwant: %s", test.name, got, test.out)
-		}
-	}
-}
-
-var importsTests = []struct {
-	name string
-	in   string
-	want [][]string
-}{
-	{
-		name: "no packages",
-		in: `package foo
-`,
-		want: nil,
-	},
-	{
-		name: "one group",
-		in: `package foo
-
-import (
-	"fmt"
-	"testing"
-)
-`,
-		want: [][]string{{"fmt", "testing"}},
-	},
-	{
-		name: "four groups",
-		in: `package foo
-
-import "C"
-import (
-	"fmt"
-	"testing"
-
-	"appengine"
-
-	"myproject/mylib1"
-	"myproject/mylib2"
-)
-`,
-		want: [][]string{
-			{"C"},
-			{"fmt", "testing"},
-			{"appengine"},
-			{"myproject/mylib1", "myproject/mylib2"},
-		},
-	},
-	{
-		name: "multiple factored groups",
-		in: `package foo
-
-import (
-	"fmt"
-	"testing"
-
-	"appengine"
-)
-import (
-	"reflect"
-
-	"bytes"
-)
-`,
-		want: [][]string{
-			{"fmt", "testing"},
-			{"appengine"},
-			{"reflect"},
-			{"bytes"},
-		},
-	},
-}
-
-func unquote(s string) string {
-	res, err := strconv.Unquote(s)
-	if err != nil {
-		return "could_not_unquote"
-	}
-	return res
-}
-
-func TestImports(t *testing.T) {
-	fset := token.NewFileSet()
-	for _, test := range importsTests {
-		f, err := parser.ParseFile(fset, "test.go", test.in, 0)
-		if err != nil {
-			t.Errorf("%s: %v", test.name, err)
-			continue
-		}
-		var got [][]string
-		for _, group := range Imports(fset, f) {
-			var b []string
-			for _, spec := range group {
-				b = append(b, unquote(spec.Path.Value))
-			}
-			got = append(got, b)
-		}
-		if !reflect.DeepEqual(got, test.want) {
-			t.Errorf("Imports(%s)=%v, want %v", test.name, got, test.want)
-		}
-	}
-}
diff --git a/third_party/gotools/go/ast/astutil/util.go b/third_party/gotools/go/ast/astutil/util.go
deleted file mode 100644
index 7630629..0000000
--- a/third_party/gotools/go/ast/astutil/util.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package astutil
-
-import "go/ast"
-
-// Unparen returns e with any enclosing parentheses stripped.
-func Unparen(e ast.Expr) ast.Expr {
-	for {
-		p, ok := e.(*ast.ParenExpr)
-		if !ok {
-			return e
-		}
-		e = p.X
-	}
-}
diff --git a/third_party/gotools/go/buildutil/allpackages.go b/third_party/gotools/go/buildutil/allpackages.go
deleted file mode 100644
index 9d531a3..0000000
--- a/third_party/gotools/go/buildutil/allpackages.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package buildutil provides utilities related to the go/build
-// package in the standard library.
-//
-// All I/O is done via the build.Context file system interface, which must
-// be concurrency-safe.
-package buildutil // import "llvm.org/llgo/third_party/gotools/go/buildutil"
-
-import (
-	"go/build"
-	"os"
-	"path/filepath"
-	"sort"
-	"strings"
-	"sync"
-)
-
-// AllPackages returns the import path of each Go package in any source
-// directory of the specified build context (e.g. $GOROOT or an element
-// of $GOPATH).  Errors are ignored.  The results are sorted.
-//
-// The result may include import paths for directories that contain no
-// *.go files, such as "archive" (in $GOROOT/src).
-//
-// All I/O is done via the build.Context file system interface,
-// which must be concurrency-safe.
-//
-func AllPackages(ctxt *build.Context) []string {
-	var list []string
-	ForEachPackage(ctxt, func(pkg string, _ error) {
-		list = append(list, pkg)
-	})
-	sort.Strings(list)
-	return list
-}
-
-// ForEachPackage calls the found function with the import path of
-// each Go package it finds in any source directory of the specified
-// build context (e.g. $GOROOT or an element of $GOPATH).
-//
-// If the package directory exists but could not be read, the second
-// argument to the found function provides the error.
-//
-// All I/O is done via the build.Context file system interface,
-// which must be concurrency-safe.
-//
-func ForEachPackage(ctxt *build.Context, found func(importPath string, err error)) {
-	// We use a counting semaphore to limit
-	// the number of parallel calls to ReadDir.
-	sema := make(chan bool, 20)
-
-	ch := make(chan item)
-
-	var wg sync.WaitGroup
-	for _, root := range ctxt.SrcDirs() {
-		root := root
-		wg.Add(1)
-		go func() {
-			allPackages(ctxt, sema, root, ch)
-			wg.Done()
-		}()
-	}
-	go func() {
-		wg.Wait()
-		close(ch)
-	}()
-
-	// All calls to found occur in the caller's goroutine.
-	for i := range ch {
-		found(i.importPath, i.err)
-	}
-}
-
-type item struct {
-	importPath string
-	err        error // (optional)
-}
-
-func allPackages(ctxt *build.Context, sema chan bool, root string, ch chan<- item) {
-	root = filepath.Clean(root) + string(os.PathSeparator)
-
-	var wg sync.WaitGroup
-
-	var walkDir func(dir string)
-	walkDir = func(dir string) {
-		// Avoid .foo, _foo, and testdata directory trees.
-		base := filepath.Base(dir)
-		if base == "" || base[0] == '.' || base[0] == '_' || base == "testdata" {
-			return
-		}
-
-		pkg := filepath.ToSlash(strings.TrimPrefix(dir, root))
-
-		// Prune search if we encounter any of these import paths.
-		switch pkg {
-		case "builtin":
-			return
-		}
-
-		sema <- true
-		files, err := ReadDir(ctxt, dir)
-		<-sema
-		if pkg != "" || err != nil {
-			ch <- item{pkg, err}
-		}
-		for _, fi := range files {
-			fi := fi
-			if fi.IsDir() {
-				wg.Add(1)
-				go func() {
-					walkDir(filepath.Join(dir, fi.Name()))
-					wg.Done()
-				}()
-			}
-		}
-	}
-
-	walkDir(root)
-	wg.Wait()
-}
diff --git a/third_party/gotools/go/buildutil/allpackages_test.go b/third_party/gotools/go/buildutil/allpackages_test.go
deleted file mode 100644
index 0aa0655..0000000
--- a/third_party/gotools/go/buildutil/allpackages_test.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package buildutil_test
-
-import (
-	"go/build"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/buildutil"
-)
-
-func TestAllPackages(t *testing.T) {
-	all := buildutil.AllPackages(&build.Default)
-
-	set := make(map[string]bool)
-	for _, pkg := range all {
-		set[pkg] = true
-	}
-
-	const wantAtLeast = 250
-	if len(all) < wantAtLeast {
-		t.Errorf("Found only %d packages, want at least %d", len(all), wantAtLeast)
-	}
-
-	for _, want := range []string{"fmt", "crypto/sha256", "llvm.org/llgo/third_party/gotools/go/buildutil"} {
-		if !set[want] {
-			t.Errorf("Package %q not found; got %s", want, all)
-		}
-	}
-}
diff --git a/third_party/gotools/go/buildutil/fakecontext.go b/third_party/gotools/go/buildutil/fakecontext.go
deleted file mode 100644
index 24cbcbe..0000000
--- a/third_party/gotools/go/buildutil/fakecontext.go
+++ /dev/null
@@ -1,108 +0,0 @@
-package buildutil
-
-import (
-	"fmt"
-	"go/build"
-	"io"
-	"io/ioutil"
-	"os"
-	"path"
-	"path/filepath"
-	"sort"
-	"strings"
-	"time"
-)
-
-// FakeContext returns a build.Context for the fake file tree specified
-// by pkgs, which maps package import paths to a mapping from file base
-// names to contents.
-//
-// The fake Context has a GOROOT of "/go" and no GOPATH, and overrides
-// the necessary file access methods to read from memory instead of the
-// real file system.
-//
-// Unlike a real file tree, the fake one has only two levels---packages
-// and files---so ReadDir("/go/src/") returns all packages under
-// /go/src/ including, for instance, "math" and "math/big".
-// ReadDir("/go/src/math/big") would return all the files in the
-// "math/big" package.
-//
-func FakeContext(pkgs map[string]map[string]string) *build.Context {
-	clean := func(filename string) string {
-		f := path.Clean(filepath.ToSlash(filename))
-		// Removing "/go/src" while respecting segment
-		// boundaries has this unfortunate corner case:
-		if f == "/go/src" {
-			return ""
-		}
-		return strings.TrimPrefix(f, "/go/src/")
-	}
-
-	ctxt := build.Default // copy
-	ctxt.GOROOT = "/go"
-	ctxt.GOPATH = ""
-	ctxt.IsDir = func(dir string) bool {
-		dir = clean(dir)
-		if dir == "" {
-			return true // needed by (*build.Context).SrcDirs
-		}
-		return pkgs[dir] != nil
-	}
-	ctxt.ReadDir = func(dir string) ([]os.FileInfo, error) {
-		dir = clean(dir)
-		var fis []os.FileInfo
-		if dir == "" {
-			// enumerate packages
-			for importPath := range pkgs {
-				fis = append(fis, fakeDirInfo(importPath))
-			}
-		} else {
-			// enumerate files of package
-			for basename := range pkgs[dir] {
-				fis = append(fis, fakeFileInfo(basename))
-			}
-		}
-		sort.Sort(byName(fis))
-		return fis, nil
-	}
-	ctxt.OpenFile = func(filename string) (io.ReadCloser, error) {
-		filename = clean(filename)
-		dir, base := path.Split(filename)
-		content, ok := pkgs[path.Clean(dir)][base]
-		if !ok {
-			return nil, fmt.Errorf("file not found: %s", filename)
-		}
-		return ioutil.NopCloser(strings.NewReader(content)), nil
-	}
-	ctxt.IsAbsPath = func(path string) bool {
-		path = filepath.ToSlash(path)
-		// Don't rely on the default (filepath.Path) since on
-		// Windows, it reports virtual paths as non-absolute.
-		return strings.HasPrefix(path, "/")
-	}
-	return &ctxt
-}
-
-type byName []os.FileInfo
-
-func (s byName) Len() int           { return len(s) }
-func (s byName) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
-func (s byName) Less(i, j int) bool { return s[i].Name() < s[j].Name() }
-
-type fakeFileInfo string
-
-func (fi fakeFileInfo) Name() string    { return string(fi) }
-func (fakeFileInfo) Sys() interface{}   { return nil }
-func (fakeFileInfo) ModTime() time.Time { return time.Time{} }
-func (fakeFileInfo) IsDir() bool        { return false }
-func (fakeFileInfo) Size() int64        { return 0 }
-func (fakeFileInfo) Mode() os.FileMode  { return 0644 }
-
-type fakeDirInfo string
-
-func (fd fakeDirInfo) Name() string    { return string(fd) }
-func (fakeDirInfo) Sys() interface{}   { return nil }
-func (fakeDirInfo) ModTime() time.Time { return time.Time{} }
-func (fakeDirInfo) IsDir() bool        { return true }
-func (fakeDirInfo) Size() int64        { return 0 }
-func (fakeDirInfo) Mode() os.FileMode  { return 0755 }
diff --git a/third_party/gotools/go/buildutil/util.go b/third_party/gotools/go/buildutil/util.go
deleted file mode 100644
index 60eeae2..0000000
--- a/third_party/gotools/go/buildutil/util.go
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package buildutil
-
-import (
-	"fmt"
-	"go/ast"
-	"go/build"
-	"go/parser"
-	"go/token"
-	"io"
-	"io/ioutil"
-	"os"
-	"path"
-	"path/filepath"
-	"strings"
-)
-
-// ParseFile behaves like parser.ParseFile,
-// but uses the build context's file system interface, if any.
-//
-// If file is not absolute (as defined by IsAbsPath), the (dir, file)
-// components are joined using JoinPath; dir must be absolute.
-//
-// The displayPath function, if provided, is used to transform the
-// filename that will be attached to the ASTs.
-//
-// TODO(adonovan): call this from go/loader.parseFiles when the tree thaws.
-//
-func ParseFile(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, file string, mode parser.Mode) (*ast.File, error) {
-	if !IsAbsPath(ctxt, file) {
-		file = JoinPath(ctxt, dir, file)
-	}
-	rd, err := OpenFile(ctxt, file)
-	if err != nil {
-		return nil, err
-	}
-	defer rd.Close() // ignore error
-	if displayPath != nil {
-		file = displayPath(file)
-	}
-	return parser.ParseFile(fset, file, rd, mode)
-}
-
-// ContainingPackage returns the package containing filename.
-//
-// If filename is not absolute, it is interpreted relative to working directory dir.
-// All I/O is via the build context's file system interface, if any.
-//
-// The '...Files []string' fields of the resulting build.Package are not
-// populated (build.FindOnly mode).
-//
-// TODO(adonovan): call this from oracle when the tree thaws.
-//
-func ContainingPackage(ctxt *build.Context, dir, filename string) (*build.Package, error) {
-	if !IsAbsPath(ctxt, filename) {
-		filename = JoinPath(ctxt, dir, filename)
-	}
-
-	// We must not assume the file tree uses
-	// "/" always,
-	// `\` always,
-	// or os.PathSeparator (which varies by platform),
-	// but to make any progress, we are forced to assume that
-	// paths will not use `\` unless the PathSeparator
-	// is also `\`, thus we can rely on filepath.ToSlash for some sanity.
-
-	dirSlash := path.Dir(filepath.ToSlash(filename)) + "/"
-
-	// We assume that no source root (GOPATH[i] or GOROOT) contains any other.
-	for _, srcdir := range ctxt.SrcDirs() {
-		srcdirSlash := filepath.ToSlash(srcdir) + "/"
-		if strings.HasPrefix(dirSlash, srcdirSlash) {
-			importPath := dirSlash[len(srcdirSlash) : len(dirSlash)-len("/")]
-			return ctxt.Import(importPath, dir, build.FindOnly)
-		}
-	}
-
-	return nil, fmt.Errorf("can't find package containing %s", filename)
-}
-
-// -- Effective methods of file system interface -------------------------
-
-// (go/build.Context defines these as methods, but does not export them.)
-
-// TODO(adonovan): HasSubdir?
-
-// FileExists returns true if the specified file exists,
-// using the build context's file system interface.
-func FileExists(ctxt *build.Context, path string) bool {
-	if ctxt.OpenFile != nil {
-		r, err := ctxt.OpenFile(path)
-		if err != nil {
-			return false
-		}
-		r.Close() // ignore error
-		return true
-	}
-	_, err := os.Stat(path)
-	return err == nil
-}
-
-// OpenFile behaves like os.Open,
-// but uses the build context's file system interface, if any.
-func OpenFile(ctxt *build.Context, path string) (io.ReadCloser, error) {
-	if ctxt.OpenFile != nil {
-		return ctxt.OpenFile(path)
-	}
-	return os.Open(path)
-}
-
-// IsAbsPath behaves like filepath.IsAbs,
-// but uses the build context's file system interface, if any.
-func IsAbsPath(ctxt *build.Context, path string) bool {
-	if ctxt.IsAbsPath != nil {
-		return ctxt.IsAbsPath(path)
-	}
-	return filepath.IsAbs(path)
-}
-
-// JoinPath behaves like filepath.Join,
-// but uses the build context's file system interface, if any.
-func JoinPath(ctxt *build.Context, path ...string) string {
-	if ctxt.JoinPath != nil {
-		return ctxt.JoinPath(path...)
-	}
-	return filepath.Join(path...)
-}
-
-// IsDir behaves like os.Stat plus IsDir,
-// but uses the build context's file system interface, if any.
-func IsDir(ctxt *build.Context, path string) bool {
-	if ctxt.IsDir != nil {
-		return ctxt.IsDir(path)
-	}
-	fi, err := os.Stat(path)
-	return err == nil && fi.IsDir()
-}
-
-// ReadDir behaves like ioutil.ReadDir,
-// but uses the build context's file system interface, if any.
-func ReadDir(ctxt *build.Context, path string) ([]os.FileInfo, error) {
-	if ctxt.ReadDir != nil {
-		return ctxt.ReadDir(path)
-	}
-	return ioutil.ReadDir(path)
-}
-
-// SplitPathList behaves like filepath.SplitList,
-// but uses the build context's file system interface, if any.
-func SplitPathList(ctxt *build.Context, s string) []string {
-	if ctxt.SplitPathList != nil {
-		return ctxt.SplitPathList(s)
-	}
-	return filepath.SplitList(s)
-}
diff --git a/third_party/gotools/go/buildutil/util_test.go b/third_party/gotools/go/buildutil/util_test.go
deleted file mode 100644
index 3b43b53..0000000
--- a/third_party/gotools/go/buildutil/util_test.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package buildutil_test
-
-import (
-	"go/build"
-	"os"
-	"path/filepath"
-	"runtime"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/buildutil"
-)
-
-func TestContainingPackage(t *testing.T) {
-	// unvirtualized:
-	goroot := runtime.GOROOT()
-	gopath := filepath.SplitList(os.Getenv("GOPATH"))[0]
-
-	for _, test := range [][2]string{
-		{goroot + "/src/fmt/print.go", "fmt"},
-		{goroot + "/src/encoding/json/foo.go", "encoding/json"},
-		{goroot + "/src/encoding/missing/foo.go", "(not found)"},
-		{gopath + "/src/golang.org/x/tools/go/buildutil/util_test.go",
-			"llvm.org/llgo/third_party/gotools/go/buildutil"},
-	} {
-		file, want := test[0], test[1]
-		bp, err := buildutil.ContainingPackage(&build.Default, ".", file)
-		got := bp.ImportPath
-		if err != nil {
-			got = "(not found)"
-		}
-		if got != want {
-			t.Errorf("ContainingPackage(%q) = %s, want %s", file, got, want)
-		}
-	}
-
-	// TODO(adonovan): test on virtualized GOPATH too.
-}
diff --git a/third_party/gotools/go/callgraph/callgraph.go b/third_party/gotools/go/callgraph/callgraph.go
deleted file mode 100644
index da249a5..0000000
--- a/third_party/gotools/go/callgraph/callgraph.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-
-Package callgraph defines the call graph and various algorithms
-and utilities to operate on it.
-
-A call graph is a labelled directed graph whose nodes represent
-functions and whose edge labels represent syntactic function call
-sites.  The presence of a labelled edge (caller, site, callee)
-indicates that caller may call callee at the specified call site.
-
-A call graph is a multigraph: it may contain multiple edges (caller,
-*, callee) connecting the same pair of nodes, so long as the edges
-differ by label; this occurs when one function calls another function
-from multiple call sites.  Also, it may contain multiple edges
-(caller, site, *) that differ only by callee; this indicates a
-polymorphic call.
-
-A SOUND call graph is one that overapproximates the dynamic calling
-behaviors of the program in all possible executions.  One call graph
-is more PRECISE than another if it is a smaller overapproximation of
-the dynamic behavior.
-
-All call graphs have a synthetic root node which is responsible for
-calling main() and init().
-
-Calls to built-in functions (e.g. panic, println) are not represented
-in the call graph; they are treated like built-in operators of the
-language.
-
-*/
-package callgraph // import "llvm.org/llgo/third_party/gotools/go/callgraph"
-
-// TODO(adonovan): add a function to eliminate wrappers from the
-// callgraph, preserving topology.
-// More generally, we could eliminate "uninteresting" nodes such as
-// nodes from packages we don't care about.
-
-import (
-	"fmt"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-)
-
-// A Graph represents a call graph.
-//
-// A graph may contain nodes that are not reachable from the root.
-// If the call graph is sound, such nodes indicate unreachable
-// functions.
-//
-type Graph struct {
-	Root  *Node                   // the distinguished root node
-	Nodes map[*ssa.Function]*Node // all nodes by function
-}
-
-// New returns a new Graph with the specified root node.
-func New(root *ssa.Function) *Graph {
-	g := &Graph{Nodes: make(map[*ssa.Function]*Node)}
-	g.Root = g.CreateNode(root)
-	return g
-}
-
-// CreateNode returns the Node for fn, creating it if not present.
-func (g *Graph) CreateNode(fn *ssa.Function) *Node {
-	n, ok := g.Nodes[fn]
-	if !ok {
-		n = &Node{Func: fn, ID: len(g.Nodes)}
-		g.Nodes[fn] = n
-	}
-	return n
-}
-
-// A Node represents a node in a call graph.
-type Node struct {
-	Func *ssa.Function // the function this node represents
-	ID   int           // 0-based sequence number
-	In   []*Edge       // unordered set of incoming call edges (n.In[*].Callee == n)
-	Out  []*Edge       // unordered set of outgoing call edges (n.Out[*].Caller == n)
-}
-
-func (n *Node) String() string {
-	return fmt.Sprintf("n%d:%s", n.ID, n.Func)
-}
-
-// A Edge represents an edge in the call graph.
-//
-// Site is nil for edges originating in synthetic or intrinsic
-// functions, e.g. reflect.Call or the root of the call graph.
-type Edge struct {
-	Caller *Node
-	Site   ssa.CallInstruction
-	Callee *Node
-}
-
-func (e Edge) String() string {
-	return fmt.Sprintf("%s --> %s", e.Caller, e.Callee)
-}
-
-func (e Edge) Description() string {
-	if e.Site == nil {
-		return "synthetic call"
-	}
-	return e.Site.Common().Description()
-}
-
-func (e Edge) Pos() token.Pos {
-	if e.Site == nil {
-		return token.NoPos
-	}
-	return e.Site.Pos()
-}
-
-// AddEdge adds the edge (caller, site, callee) to the call graph.
-// Elimination of duplicate edges is the caller's responsibility.
-func AddEdge(caller *Node, site ssa.CallInstruction, callee *Node) {
-	e := &Edge{caller, site, callee}
-	callee.In = append(callee.In, e)
-	caller.Out = append(caller.Out, e)
-}
diff --git a/third_party/gotools/go/callgraph/cha/cha.go b/third_party/gotools/go/callgraph/cha/cha.go
deleted file mode 100644
index 0792879..0000000
--- a/third_party/gotools/go/callgraph/cha/cha.go
+++ /dev/null
@@ -1,120 +0,0 @@
-// Package cha computes the call graph of a Go program using the Class
-// Hierarchy Analysis (CHA) algorithm.
-//
-// CHA was first described in "Optimization of Object-Oriented Programs
-// Using Static Class Hierarchy Analysis", Jeffrey Dean, David Grove,
-// and Craig Chambers, ECOOP'95.
-//
-// CHA is related to RTA (see go/callgraph/rta); the difference is that
-// CHA conservatively computes the entire "implements" relation between
-// interfaces and concrete types ahead of time, whereas RTA uses dynamic
-// programming to construct it on the fly as it encounters new functions
-// reachable from main.  CHA may thus include spurious call edges for
-// types that haven't been instantiated yet, or types that are never
-// instantiated.
-//
-// Since CHA conservatively assumes that all functions are address-taken
-// and all concrete types are put into interfaces, it is sound to run on
-// partial programs, such as libraries without a main or test function.
-//
-package cha // import "llvm.org/llgo/third_party/gotools/go/callgraph/cha"
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/callgraph"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/ssa/ssautil"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-)
-
-// CallGraph computes the call graph of the specified program using the
-// Class Hierarchy Analysis algorithm.
-//
-func CallGraph(prog *ssa.Program) *callgraph.Graph {
-	cg := callgraph.New(nil) // TODO(adonovan) eliminate concept of rooted callgraph
-
-	allFuncs := ssautil.AllFunctions(prog)
-
-	// funcsBySig contains all functions, keyed by signature.  It is
-	// the effective set of address-taken functions used to resolve
-	// a dynamic call of a particular signature.
-	var funcsBySig typeutil.Map // value is []*ssa.Function
-
-	// methodsByName contains all methods,
-	// grouped by name for efficient lookup.
-	methodsByName := make(map[string][]*ssa.Function)
-
-	// methodsMemo records, for every abstract method call call I.f on
-	// interface type I, the set of concrete methods C.f of all
-	// types C that satisfy interface I.
-	methodsMemo := make(map[*types.Func][]*ssa.Function)
-	lookupMethods := func(m *types.Func) []*ssa.Function {
-		methods, ok := methodsMemo[m]
-		if !ok {
-			I := m.Type().(*types.Signature).Recv().Type().Underlying().(*types.Interface)
-			for _, f := range methodsByName[m.Name()] {
-				C := f.Signature.Recv().Type() // named or *named
-				if types.Implements(C, I) {
-					methods = append(methods, f)
-				}
-			}
-			methodsMemo[m] = methods
-		}
-		return methods
-	}
-
-	for f := range allFuncs {
-		if f.Signature.Recv() == nil {
-			// Package initializers can never be address-taken.
-			if f.Name() == "init" && f.Synthetic == "package initializer" {
-				continue
-			}
-			funcs, _ := funcsBySig.At(f.Signature).([]*ssa.Function)
-			funcs = append(funcs, f)
-			funcsBySig.Set(f.Signature, funcs)
-		} else {
-			methodsByName[f.Name()] = append(methodsByName[f.Name()], f)
-		}
-	}
-
-	addEdge := func(fnode *callgraph.Node, site ssa.CallInstruction, g *ssa.Function) {
-		gnode := cg.CreateNode(g)
-		callgraph.AddEdge(fnode, site, gnode)
-	}
-
-	addEdges := func(fnode *callgraph.Node, site ssa.CallInstruction, callees []*ssa.Function) {
-		// Because every call to a highly polymorphic and
-		// frequently used abstract method such as
-		// (io.Writer).Write is assumed to call every concrete
-		// Write method in the program, the call graph can
-		// contain a lot of duplication.
-		//
-		// TODO(adonovan): opt: consider factoring the callgraph
-		// API so that the Callers component of each edge is a
-		// slice of nodes, not a singleton.
-		for _, g := range callees {
-			addEdge(fnode, site, g)
-		}
-	}
-
-	for f := range allFuncs {
-		fnode := cg.CreateNode(f)
-		for _, b := range f.Blocks {
-			for _, instr := range b.Instrs {
-				if site, ok := instr.(ssa.CallInstruction); ok {
-					call := site.Common()
-					if call.IsInvoke() {
-						addEdges(fnode, site, lookupMethods(call.Method))
-					} else if g := call.StaticCallee(); g != nil {
-						addEdge(fnode, site, g)
-					} else if _, ok := call.Value.(*ssa.Builtin); !ok {
-						callees, _ := funcsBySig.At(call.Signature()).([]*ssa.Function)
-						addEdges(fnode, site, callees)
-					}
-				}
-			}
-		}
-	}
-
-	return cg
-}
diff --git a/third_party/gotools/go/callgraph/cha/cha_test.go b/third_party/gotools/go/callgraph/cha/cha_test.go
deleted file mode 100644
index 11d78ab..0000000
--- a/third_party/gotools/go/callgraph/cha/cha_test.go
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cha_test
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"io/ioutil"
-	"sort"
-	"strings"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/callgraph"
-	"llvm.org/llgo/third_party/gotools/go/callgraph/cha"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var inputs = []string{
-	"testdata/func.go",
-	"testdata/iface.go",
-	"testdata/recv.go",
-}
-
-func expectation(f *ast.File) (string, token.Pos) {
-	for _, c := range f.Comments {
-		text := strings.TrimSpace(c.Text())
-		if t := strings.TrimPrefix(text, "WANT:\n"); t != text {
-			return t, c.Pos()
-		}
-	}
-	return "", token.NoPos
-}
-
-// TestCHA runs CHA on each file in inputs, prints the dynamic edges of
-// the call graph, and compares it with the golden results embedded in
-// the WANT comment at the end of the file.
-//
-func TestCHA(t *testing.T) {
-	for _, filename := range inputs {
-		content, err := ioutil.ReadFile(filename)
-		if err != nil {
-			t.Errorf("couldn't read file '%s': %s", filename, err)
-			continue
-		}
-
-		conf := loader.Config{
-			ParserMode: parser.ParseComments,
-		}
-		f, err := conf.ParseFile(filename, content)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-
-		want, pos := expectation(f)
-		if pos == token.NoPos {
-			t.Errorf("No WANT: comment in %s", filename)
-			continue
-		}
-
-		conf.CreateFromFiles("main", f)
-		iprog, err := conf.Load()
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-
-		prog := ssa.Create(iprog, 0)
-		mainPkg := prog.Package(iprog.Created[0].Pkg)
-		prog.BuildAll()
-
-		cg := cha.CallGraph(prog)
-
-		if got := printGraph(cg, mainPkg.Object); got != want {
-			t.Errorf("%s: got:\n%s\nwant:\n%s",
-				prog.Fset.Position(pos), got, want)
-		}
-	}
-}
-
-func printGraph(cg *callgraph.Graph, from *types.Package) string {
-	var edges []string
-	callgraph.GraphVisitEdges(cg, func(e *callgraph.Edge) error {
-		if strings.Contains(e.Description(), "dynamic") {
-			edges = append(edges, fmt.Sprintf("%s --> %s",
-				e.Caller.Func.RelString(from),
-				e.Callee.Func.RelString(from)))
-		}
-		return nil
-	})
-	sort.Strings(edges)
-
-	var buf bytes.Buffer
-	buf.WriteString("Dynamic calls\n")
-	for _, edge := range edges {
-		fmt.Fprintf(&buf, "  %s\n", edge)
-	}
-	return strings.TrimSpace(buf.String())
-}
diff --git a/third_party/gotools/go/callgraph/cha/testdata/func.go b/third_party/gotools/go/callgraph/cha/testdata/func.go
deleted file mode 100644
index ad483f1..0000000
--- a/third_party/gotools/go/callgraph/cha/testdata/func.go
+++ /dev/null
@@ -1,23 +0,0 @@
-//+build ignore
-
-package main
-
-// Test of dynamic function calls; no interfaces.
-
-func A(int) {}
-
-var (
-	B = func(int) {}
-	C = func(int) {}
-)
-
-func f() {
-	pfn := B
-	pfn(0) // calls A, B, C, even though A is not even address-taken
-}
-
-// WANT:
-// Dynamic calls
-//   f --> A
-//   f --> init$1
-//   f --> init$2
diff --git a/third_party/gotools/go/callgraph/cha/testdata/iface.go b/third_party/gotools/go/callgraph/cha/testdata/iface.go
deleted file mode 100644
index 1622ec1..0000000
--- a/third_party/gotools/go/callgraph/cha/testdata/iface.go
+++ /dev/null
@@ -1,65 +0,0 @@
-//+build ignore
-
-package main
-
-// Test of interface calls.  None of the concrete types are ever
-// instantiated or converted to interfaces.
-
-type I interface {
-	f()
-}
-
-type J interface {
-	f()
-	g()
-}
-
-type C int // implements I
-
-func (*C) f()
-
-type D int // implements I and J
-
-func (*D) f()
-func (*D) g()
-
-func one(i I, j J) {
-	i.f() // calls *C and *D
-}
-
-func two(i I, j J) {
-	j.f() // calls *D (but not *C, even though it defines method f)
-}
-
-func three(i I, j J) {
-	j.g() // calls *D
-}
-
-func four(i I, j J) {
-	Jf := J.f
-	if unknown {
-		Jf = nil // suppress SSA constant propagation
-	}
-	Jf(nil) // calls *D
-}
-
-func five(i I, j J) {
-	jf := j.f
-	if unknown {
-		jf = nil // suppress SSA constant propagation
-	}
-	jf() // calls *D
-}
-
-var unknown bool
-
-// WANT:
-// Dynamic calls
-//   (J).f$bound --> (*D).f
-//   (J).f$thunk --> (*D).f
-//   five --> (J).f$bound
-//   four --> (J).f$thunk
-//   one --> (*C).f
-//   one --> (*D).f
-//   three --> (*D).g
-//   two --> (*D).f
diff --git a/third_party/gotools/go/callgraph/cha/testdata/recv.go b/third_party/gotools/go/callgraph/cha/testdata/recv.go
deleted file mode 100644
index 5ba48e9..0000000
--- a/third_party/gotools/go/callgraph/cha/testdata/recv.go
+++ /dev/null
@@ -1,37 +0,0 @@
-//+build ignore
-
-package main
-
-type I interface {
-	f()
-}
-
-type J interface {
-	g()
-}
-
-type C int // C and *C implement I; *C implements J
-
-func (C) f()
-func (*C) g()
-
-type D int // *D implements I and J
-
-func (*D) f()
-func (*D) g()
-
-func f(i I) {
-	i.f() // calls C, *C, *D
-}
-
-func g(j J) {
-	j.g() // calls *C, *D
-}
-
-// WANT:
-// Dynamic calls
-//   f --> (*C).f
-//   f --> (*D).f
-//   f --> (C).f
-//   g --> (*C).g
-//   g --> (*D).g
diff --git a/third_party/gotools/go/callgraph/rta/rta.go b/third_party/gotools/go/callgraph/rta/rta.go
deleted file mode 100644
index 17590ed..0000000
--- a/third_party/gotools/go/callgraph/rta/rta.go
+++ /dev/null
@@ -1,459 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This package provides Rapid Type Analysis (RTA) for Go, a fast
-// algorithm for call graph construction and discovery of reachable code
-// (and hence dead code) and runtime types.  The algorithm was first
-// described in:
-//
-// David F. Bacon and Peter F. Sweeney. 1996.
-// Fast static analysis of C++ virtual function calls. (OOPSLA '96)
-// http://doi.acm.org/10.1145/236337.236371
-//
-// The algorithm uses dynamic programming to tabulate the cross-product
-// of the set of known "address taken" functions with the set of known
-// dynamic calls of the same type.  As each new address-taken function
-// is discovered, call graph edges are added from each known callsite,
-// and as each new call site is discovered, call graph edges are added
-// from it to each known address-taken function.
-//
-// A similar approach is used for dynamic calls via interfaces: it
-// tabulates the cross-product of the set of known "runtime types",
-// i.e. types that may appear in an interface value, or be derived from
-// one via reflection, with the set of known "invoke"-mode dynamic
-// calls.  As each new "runtime type" is discovered, call edges are
-// added from the known call sites, and as each new call site is
-// discovered, call graph edges are added to each compatible
-// method.
-//
-// In addition, we must consider all exported methods of any runtime type
-// as reachable, since they may be called via reflection.
-//
-// Each time a newly added call edge causes a new function to become
-// reachable, the code of that function is analyzed for more call sites,
-// address-taken functions, and runtime types.  The process continues
-// until a fixed point is achieved.
-//
-// The resulting call graph is less precise than one produced by pointer
-// analysis, but the algorithm is much faster.  For example, running the
-// cmd/callgraph tool on its own source takes ~2.1s for RTA and ~5.4s
-// for points-to analysis.
-//
-package rta // import "llvm.org/llgo/third_party/gotools/go/callgraph/rta"
-
-// TODO(adonovan): test it by connecting it to the interpreter and
-// replacing all "unreachable" functions by a special intrinsic, and
-// ensure that that intrinsic is never called.
-
-import (
-	"fmt"
-
-	"llvm.org/llgo/third_party/gotools/go/callgraph"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-)
-
-// A Result holds the results of Rapid Type Analysis, which includes the
-// set of reachable functions/methods, runtime types, and the call graph.
-//
-type Result struct {
-	// CallGraph is the discovered callgraph.
-	// It does not include edges for calls made via reflection.
-	CallGraph *callgraph.Graph
-
-	// Reachable contains the set of reachable functions and methods.
-	// This includes exported methods of runtime types, since
-	// they may be accessed via reflection.
-	// The value indicates whether the function is address-taken.
-	//
-	// (We wrap the bool in a struct to avoid inadvertent use of
-	// "if Reachable[f] {" to test for set membership.)
-	Reachable map[*ssa.Function]struct{ AddrTaken bool }
-
-	// RuntimeTypes contains the set of types that are needed at
-	// runtime, for interfaces or reflection.
-	//
-	// The value indicates whether the type is inaccessible to reflection.
-	// Consider:
-	// 	type A struct{B}
-	// 	fmt.Println(new(A))
-	// Types *A, A and B are accessible to reflection, but the unnamed
-	// type struct{B} is not.
-	RuntimeTypes typeutil.Map
-}
-
-// Working state of the RTA algorithm.
-type rta struct {
-	result *Result
-
-	prog *ssa.Program
-
-	worklist []*ssa.Function // list of functions to visit
-
-	// addrTakenFuncsBySig contains all address-taken *Functions, grouped by signature.
-	// Keys are *types.Signature, values are map[*ssa.Function]bool sets.
-	addrTakenFuncsBySig typeutil.Map
-
-	// dynCallSites contains all dynamic "call"-mode call sites, grouped by signature.
-	// Keys are *types.Signature, values are unordered []ssa.CallInstruction.
-	dynCallSites typeutil.Map
-
-	// invokeSites contains all "invoke"-mode call sites, grouped by interface.
-	// Keys are *types.Interface (never *types.Named),
-	// Values are unordered []ssa.CallInstruction sets.
-	invokeSites typeutil.Map
-
-	// The following two maps together define the subset of the
-	// m:n "implements" relation needed by the algorithm.
-
-	// concreteTypes maps each concrete type to the set of interfaces that it implements.
-	// Keys are types.Type, values are unordered []*types.Interface.
-	// Only concrete types used as MakeInterface operands are included.
-	concreteTypes typeutil.Map
-
-	// interfaceTypes maps each interface type to
-	// the set of concrete types that implement it.
-	// Keys are *types.Interface, values are unordered []types.Type.
-	// Only interfaces used in "invoke"-mode CallInstructions are included.
-	interfaceTypes typeutil.Map
-}
-
-// addReachable marks a function as potentially callable at run-time,
-// and ensures that it gets processed.
-func (r *rta) addReachable(f *ssa.Function, addrTaken bool) {
-	reachable := r.result.Reachable
-	n := len(reachable)
-	v := reachable[f]
-	if addrTaken {
-		v.AddrTaken = true
-	}
-	reachable[f] = v
-	if len(reachable) > n {
-		// First time seeing f.  Add it to the worklist.
-		r.worklist = append(r.worklist, f)
-	}
-}
-
-// addEdge adds the specified call graph edge, and marks it reachable.
-// addrTaken indicates whether to mark the callee as "address-taken".
-func (r *rta) addEdge(site ssa.CallInstruction, callee *ssa.Function, addrTaken bool) {
-	r.addReachable(callee, addrTaken)
-
-	if g := r.result.CallGraph; g != nil {
-		if site.Parent() == nil {
-			panic(site)
-		}
-		from := g.CreateNode(site.Parent())
-		to := g.CreateNode(callee)
-		callgraph.AddEdge(from, site, to)
-	}
-}
-
-// ---------- addrTakenFuncs × dynCallSites ----------
-
-// visitAddrTakenFunc is called each time we encounter an address-taken function f.
-func (r *rta) visitAddrTakenFunc(f *ssa.Function) {
-	// Create two-level map (Signature -> Function -> bool).
-	S := f.Signature
-	funcs, _ := r.addrTakenFuncsBySig.At(S).(map[*ssa.Function]bool)
-	if funcs == nil {
-		funcs = make(map[*ssa.Function]bool)
-		r.addrTakenFuncsBySig.Set(S, funcs)
-	}
-	if !funcs[f] {
-		// First time seeing f.
-		funcs[f] = true
-
-		// If we've seen any dyncalls of this type, mark it reachable,
-		// and add call graph edges.
-		sites, _ := r.dynCallSites.At(S).([]ssa.CallInstruction)
-		for _, site := range sites {
-			r.addEdge(site, f, true)
-		}
-	}
-}
-
-// visitDynCall is called each time we encounter a dynamic "call"-mode call.
-func (r *rta) visitDynCall(site ssa.CallInstruction) {
-	S := site.Common().Signature()
-
-	// Record the call site.
-	sites, _ := r.dynCallSites.At(S).([]ssa.CallInstruction)
-	r.dynCallSites.Set(S, append(sites, site))
-
-	// For each function of signature S that we know is address-taken,
-	// mark it reachable.  We'll add the callgraph edges later.
-	funcs, _ := r.addrTakenFuncsBySig.At(S).(map[*ssa.Function]bool)
-	for g := range funcs {
-		r.addEdge(site, g, true)
-	}
-}
-
-// ---------- concrete types × invoke sites ----------
-
-// addInvokeEdge is called for each new pair (site, C) in the matrix.
-func (r *rta) addInvokeEdge(site ssa.CallInstruction, C types.Type) {
-	// Ascertain the concrete method of C to be called.
-	imethod := site.Common().Method
-	cmethod := r.prog.Method(r.prog.MethodSets.MethodSet(C).Lookup(imethod.Pkg(), imethod.Name()))
-	r.addEdge(site, cmethod, true)
-}
-
-// visitInvoke is called each time the algorithm encounters an "invoke"-mode call.
-func (r *rta) visitInvoke(site ssa.CallInstruction) {
-	I := site.Common().Value.Type().Underlying().(*types.Interface)
-
-	// Record the invoke site.
-	sites, _ := r.invokeSites.At(I).([]ssa.CallInstruction)
-	r.invokeSites.Set(I, append(sites, site))
-
-	// Add callgraph edge for each existing
-	// address-taken concrete type implementing I.
-	for _, C := range r.implementations(I) {
-		r.addInvokeEdge(site, C)
-	}
-}
-
-// ---------- main algorithm ----------
-
-// visitFunc processes function f.
-func (r *rta) visitFunc(f *ssa.Function) {
-	var space [32]*ssa.Value // preallocate space for common case
-
-	for _, b := range f.Blocks {
-		for _, instr := range b.Instrs {
-			rands := instr.Operands(space[:0])
-
-			switch instr := instr.(type) {
-			case ssa.CallInstruction:
-				call := instr.Common()
-				if call.IsInvoke() {
-					r.visitInvoke(instr)
-				} else if g := call.StaticCallee(); g != nil {
-					r.addEdge(instr, g, false)
-				} else if _, ok := call.Value.(*ssa.Builtin); !ok {
-					r.visitDynCall(instr)
-				}
-
-				// Ignore the call-position operand when
-				// looking for address-taken Functions.
-				// Hack: assume this is rands[0].
-				rands = rands[1:]
-
-			case *ssa.MakeInterface:
-				r.addRuntimeType(instr.X.Type(), false)
-			}
-
-			// Process all address-taken functions.
-			for _, op := range rands {
-				if g, ok := (*op).(*ssa.Function); ok {
-					r.visitAddrTakenFunc(g)
-				}
-			}
-		}
-	}
-}
-
-// Analyze performs Rapid Type Analysis, starting at the specified root
-// functions.  It returns nil if no roots were specified.
-//
-// If buildCallGraph is true, Result.CallGraph will contain a call
-// graph; otherwise, only the other fields (reachable functions) are
-// populated.
-//
-func Analyze(roots []*ssa.Function, buildCallGraph bool) *Result {
-	if len(roots) == 0 {
-		return nil
-	}
-
-	r := &rta{
-		result: &Result{Reachable: make(map[*ssa.Function]struct{ AddrTaken bool })},
-		prog:   roots[0].Prog,
-	}
-
-	if buildCallGraph {
-		// TODO(adonovan): change callgraph API to eliminate the
-		// notion of a distinguished root node.  Some callgraphs
-		// have many roots, or none.
-		r.result.CallGraph = callgraph.New(roots[0])
-	}
-
-	hasher := typeutil.MakeHasher()
-	r.result.RuntimeTypes.SetHasher(hasher)
-	r.addrTakenFuncsBySig.SetHasher(hasher)
-	r.dynCallSites.SetHasher(hasher)
-	r.invokeSites.SetHasher(hasher)
-	r.concreteTypes.SetHasher(hasher)
-	r.interfaceTypes.SetHasher(hasher)
-
-	// Visit functions, processing their instructions, and adding
-	// new functions to the worklist, until a fixed point is
-	// reached.
-	var shadow []*ssa.Function // for efficiency, we double-buffer the worklist
-	r.worklist = append(r.worklist, roots...)
-	for len(r.worklist) > 0 {
-		shadow, r.worklist = r.worklist, shadow[:0]
-		for _, f := range shadow {
-			r.visitFunc(f)
-		}
-	}
-	return r.result
-}
-
-// interfaces(C) returns all currently known interfaces implemented by C.
-func (r *rta) interfaces(C types.Type) []*types.Interface {
-	// Ascertain set of interfaces C implements
-	// and update 'implements' relation.
-	var ifaces []*types.Interface
-	r.interfaceTypes.Iterate(func(I types.Type, concs interface{}) {
-		if I := I.(*types.Interface); types.Implements(C, I) {
-			concs, _ := concs.([]types.Type)
-			r.interfaceTypes.Set(I, append(concs, C))
-			ifaces = append(ifaces, I)
-		}
-	})
-	r.concreteTypes.Set(C, ifaces)
-	return ifaces
-}
-
-// implementations(I) returns all currently known concrete types that implement I.
-func (r *rta) implementations(I *types.Interface) []types.Type {
-	var concs []types.Type
-	if v := r.interfaceTypes.At(I); v != nil {
-		concs = v.([]types.Type)
-	} else {
-		// First time seeing this interface.
-		// Update the 'implements' relation.
-		r.concreteTypes.Iterate(func(C types.Type, ifaces interface{}) {
-			if types.Implements(C, I) {
-				ifaces, _ := ifaces.([]*types.Interface)
-				r.concreteTypes.Set(C, append(ifaces, I))
-				concs = append(concs, C)
-			}
-		})
-		r.interfaceTypes.Set(I, concs)
-	}
-	return concs
-}
-
-// addRuntimeType is called for each concrete type that can be the
-// dynamic type of some interface or reflect.Value.
-// Adapted from needMethods in go/ssa/builder.go
-//
-func (r *rta) addRuntimeType(T types.Type, skip bool) {
-	if prev, ok := r.result.RuntimeTypes.At(T).(bool); ok {
-		if skip && !prev {
-			r.result.RuntimeTypes.Set(T, skip)
-		}
-		return
-	}
-	r.result.RuntimeTypes.Set(T, skip)
-
-	mset := r.prog.MethodSets.MethodSet(T)
-
-	if _, ok := T.Underlying().(*types.Interface); !ok {
-		// T is a new concrete type.
-		for i, n := 0, mset.Len(); i < n; i++ {
-			sel := mset.At(i)
-			m := sel.Obj()
-
-			if m.Exported() {
-				// Exported methods are always potentially callable via reflection.
-				r.addReachable(r.prog.Method(sel), true)
-			}
-		}
-
-		// Add callgraph edge for each existing dynamic
-		// "invoke"-mode call via that interface.
-		for _, I := range r.interfaces(T) {
-			sites, _ := r.invokeSites.At(I).([]ssa.CallInstruction)
-			for _, site := range sites {
-				r.addInvokeEdge(site, T)
-			}
-		}
-	}
-
-	// Precondition: T is not a method signature (*Signature with Recv()!=nil).
-	// Recursive case: skip => don't call makeMethods(T).
-	// Each package maintains its own set of types it has visited.
-
-	var n *types.Named
-	switch T := T.(type) {
-	case *types.Named:
-		n = T
-	case *types.Pointer:
-		n, _ = T.Elem().(*types.Named)
-	}
-	if n != nil {
-		owner := n.Obj().Pkg()
-		if owner == nil {
-			return // built-in error type
-		}
-	}
-
-	// Recursion over signatures of each exported method.
-	for i := 0; i < mset.Len(); i++ {
-		if mset.At(i).Obj().Exported() {
-			sig := mset.At(i).Type().(*types.Signature)
-			r.addRuntimeType(sig.Params(), true)  // skip the Tuple itself
-			r.addRuntimeType(sig.Results(), true) // skip the Tuple itself
-		}
-	}
-
-	switch t := T.(type) {
-	case *types.Basic:
-		// nop
-
-	case *types.Interface:
-		// nop---handled by recursion over method set.
-
-	case *types.Pointer:
-		r.addRuntimeType(t.Elem(), false)
-
-	case *types.Slice:
-		r.addRuntimeType(t.Elem(), false)
-
-	case *types.Chan:
-		r.addRuntimeType(t.Elem(), false)
-
-	case *types.Map:
-		r.addRuntimeType(t.Key(), false)
-		r.addRuntimeType(t.Elem(), false)
-
-	case *types.Signature:
-		if t.Recv() != nil {
-			panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv()))
-		}
-		r.addRuntimeType(t.Params(), true)  // skip the Tuple itself
-		r.addRuntimeType(t.Results(), true) // skip the Tuple itself
-
-	case *types.Named:
-		// A pointer-to-named type can be derived from a named
-		// type via reflection.  It may have methods too.
-		r.addRuntimeType(types.NewPointer(T), false)
-
-		// Consider 'type T struct{S}' where S has methods.
-		// Reflection provides no way to get from T to struct{S},
-		// only to S, so the method set of struct{S} is unwanted,
-		// so set 'skip' flag during recursion.
-		r.addRuntimeType(t.Underlying(), true)
-
-	case *types.Array:
-		r.addRuntimeType(t.Elem(), false)
-
-	case *types.Struct:
-		for i, n := 0, t.NumFields(); i < n; i++ {
-			r.addRuntimeType(t.Field(i).Type(), false)
-		}
-
-	case *types.Tuple:
-		for i, n := 0, t.Len(); i < n; i++ {
-			r.addRuntimeType(t.At(i).Type(), false)
-		}
-
-	default:
-		panic(T)
-	}
-}
diff --git a/third_party/gotools/go/callgraph/rta/rta_test.go b/third_party/gotools/go/callgraph/rta/rta_test.go
deleted file mode 100644
index 52006f4..0000000
--- a/third_party/gotools/go/callgraph/rta/rta_test.go
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package rta_test
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"io/ioutil"
-	"sort"
-	"strings"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/callgraph"
-	"llvm.org/llgo/third_party/gotools/go/callgraph/rta"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var inputs = []string{
-	"testdata/func.go",
-	"testdata/rtype.go",
-	"testdata/iface.go",
-}
-
-func expectation(f *ast.File) (string, token.Pos) {
-	for _, c := range f.Comments {
-		text := strings.TrimSpace(c.Text())
-		if t := strings.TrimPrefix(text, "WANT:\n"); t != text {
-			return t, c.Pos()
-		}
-	}
-	return "", token.NoPos
-}
-
-// TestRTA runs RTA on each file in inputs, prints the results, and
-// compares it with the golden results embedded in the WANT comment at
-// the end of the file.
-//
-// The results string consists of two parts: the set of dynamic call
-// edges, "f --> g", one per line, and the set of reachable functions,
-// one per line.  Each set is sorted.
-//
-func TestRTA(t *testing.T) {
-	for _, filename := range inputs {
-		content, err := ioutil.ReadFile(filename)
-		if err != nil {
-			t.Errorf("couldn't read file '%s': %s", filename, err)
-			continue
-		}
-
-		conf := loader.Config{
-			ParserMode: parser.ParseComments,
-		}
-		f, err := conf.ParseFile(filename, content)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-
-		want, pos := expectation(f)
-		if pos == token.NoPos {
-			t.Errorf("No WANT: comment in %s", filename)
-			continue
-		}
-
-		conf.CreateFromFiles("main", f)
-		iprog, err := conf.Load()
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-
-		prog := ssa.Create(iprog, 0)
-		mainPkg := prog.Package(iprog.Created[0].Pkg)
-		prog.BuildAll()
-
-		res := rta.Analyze([]*ssa.Function{
-			mainPkg.Func("main"),
-			mainPkg.Func("init"),
-		}, true)
-
-		if got := printResult(res, mainPkg.Object); got != want {
-			t.Errorf("%s: got:\n%s\nwant:\n%s",
-				prog.Fset.Position(pos), got, want)
-		}
-	}
-}
-
-func printResult(res *rta.Result, from *types.Package) string {
-	var buf bytes.Buffer
-
-	writeSorted := func(ss []string) {
-		sort.Strings(ss)
-		for _, s := range ss {
-			fmt.Fprintf(&buf, "  %s\n", s)
-		}
-	}
-
-	buf.WriteString("Dynamic calls\n")
-	var edges []string
-	callgraph.GraphVisitEdges(res.CallGraph, func(e *callgraph.Edge) error {
-		if strings.Contains(e.Description(), "dynamic") {
-			edges = append(edges, fmt.Sprintf("%s --> %s",
-				e.Caller.Func.RelString(from),
-				e.Callee.Func.RelString(from)))
-		}
-		return nil
-	})
-	writeSorted(edges)
-
-	buf.WriteString("Reachable functions\n")
-	var reachable []string
-	for f := range res.Reachable {
-		reachable = append(reachable, f.RelString(from))
-	}
-	writeSorted(reachable)
-
-	buf.WriteString("Reflect types\n")
-	var rtypes []string
-	res.RuntimeTypes.Iterate(func(key types.Type, value interface{}) {
-		if value == false { // accessible to reflection
-			rtypes = append(rtypes, types.TypeString(from, key))
-		}
-	})
-	writeSorted(rtypes)
-
-	return strings.TrimSpace(buf.String())
-}
diff --git a/third_party/gotools/go/callgraph/rta/testdata/func.go b/third_party/gotools/go/callgraph/rta/testdata/func.go
deleted file mode 100644
index 968c73d..0000000
--- a/third_party/gotools/go/callgraph/rta/testdata/func.go
+++ /dev/null
@@ -1,37 +0,0 @@
-//+build ignore
-
-package main
-
-// Test of dynamic function calls.
-// No interfaces, so no runtime/reflect types.
-
-func A1() {
-	A2(0)
-}
-
-func A2(int) {} // not address-taken
-
-func B() {} // unreachable
-
-var (
-	C = func(int) {}
-	D = func(int) {}
-)
-
-func main() {
-	A1()
-
-	pfn := C
-	pfn(0) // calls C and D but not A2 (same sig but not address-taken)
-}
-
-// WANT:
-// Dynamic calls
-//   main --> init$1
-//   main --> init$2
-// Reachable functions
-//   A1
-//   A2
-//   init$1
-//   init$2
-// Reflect types
diff --git a/third_party/gotools/go/callgraph/rta/testdata/iface.go b/third_party/gotools/go/callgraph/rta/testdata/iface.go
deleted file mode 100644
index c3ee570..0000000
--- a/third_party/gotools/go/callgraph/rta/testdata/iface.go
+++ /dev/null
@@ -1,79 +0,0 @@
-//+build ignore
-
-package main
-
-// Test of interface calls.
-
-func use(interface{})
-
-type A byte // instantiated but not a reflect type
-
-func (A) f() {} // called directly
-func (A) F() {} // unreachable
-
-type B int // a reflect type
-
-func (*B) f() {} // reachable via interface invoke
-func (*B) F() {} // reachable: exported method of reflect type
-
-type B2 int // a reflect type, and *B2 also
-
-func (B2) f() {} // reachable via interface invoke
-func (B2) g() {} // reachable: exported method of reflect type
-
-type C string // not instantiated
-
-func (C) f() {} // unreachable
-func (C) F() {} // unreachable
-
-type D uint // instantiated only in dead code
-
-func (D) f() {} // unreachable
-func (D) F() {} // unreachable
-
-func main() {
-	A(0).f()
-
-	use(new(B))
-	use(B2(0))
-
-	var i interface {
-		f()
-	}
-	i.f() // calls (*B).f, (*B2).f and (B2.f)
-
-	live()
-}
-
-func live() {
-	var j interface {
-		f()
-		g()
-	}
-	j.f() // calls (B2).f and (*B2).f but not (*B).f (no g method).
-}
-
-func dead() {
-	use(D(0))
-}
-
-// WANT:
-// Dynamic calls
-//   live --> (*B2).f
-//   live --> (B2).f
-//   main --> (*B).f
-//   main --> (*B2).f
-//   main --> (B2).f
-// Reachable functions
-//   (*B).F
-//   (*B).f
-//   (*B2).f
-//   (A).f
-//   (B2).f
-//   live
-//   use
-// Reflect types
-//   *B
-//   *B2
-//   B
-//   B2
diff --git a/third_party/gotools/go/callgraph/rta/testdata/rtype.go b/third_party/gotools/go/callgraph/rta/testdata/rtype.go
deleted file mode 100644
index 85414e5..0000000
--- a/third_party/gotools/go/callgraph/rta/testdata/rtype.go
+++ /dev/null
@@ -1,35 +0,0 @@
-//+build ignore
-
-package main
-
-// Test of runtime types (types for which descriptors are needed).
-
-func use(interface{})
-
-type A byte // neither A nor byte are runtime types
-
-type B struct{ x uint } // B and uint are runtime types, but not the struct
-
-func main() {
-	var x int // not a runtime type
-	print(x)
-
-	var y string // runtime type due to interface conversion
-	use(y)
-
-	use(struct{ uint64 }{}) // struct is a runtime type
-
-	use(new(B)) // *B is a runtime type
-}
-
-// WANT:
-// Dynamic calls
-// Reachable functions
-//   use
-// Reflect types
-//   *B
-//   B
-//   string
-//   struct{uint64}
-//   uint
-//   uint64
diff --git a/third_party/gotools/go/callgraph/static/static.go b/third_party/gotools/go/callgraph/static/static.go
deleted file mode 100644
index 633870c..0000000
--- a/third_party/gotools/go/callgraph/static/static.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Package static computes the call graph of a Go program containing
-// only static call edges.
-package static // import "llvm.org/llgo/third_party/gotools/go/callgraph/static"
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/callgraph"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/ssa/ssautil"
-)
-
-// CallGraph computes the call graph of the specified program
-// considering only static calls.
-//
-func CallGraph(prog *ssa.Program) *callgraph.Graph {
-	cg := callgraph.New(nil) // TODO(adonovan) eliminate concept of rooted callgraph
-
-	// TODO(adonovan): opt: use only a single pass over the ssa.Program.
-	for f := range ssautil.AllFunctions(prog) {
-		fnode := cg.CreateNode(f)
-		for _, b := range f.Blocks {
-			for _, instr := range b.Instrs {
-				if site, ok := instr.(ssa.CallInstruction); ok {
-					if g := site.Common().StaticCallee(); g != nil {
-						gnode := cg.CreateNode(g)
-						callgraph.AddEdge(fnode, site, gnode)
-					}
-				}
-			}
-		}
-	}
-
-	return cg
-}
diff --git a/third_party/gotools/go/callgraph/static/static_test.go b/third_party/gotools/go/callgraph/static/static_test.go
deleted file mode 100644
index d3cc85b..0000000
--- a/third_party/gotools/go/callgraph/static/static_test.go
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package static_test
-
-import (
-	"fmt"
-	"go/parser"
-	"reflect"
-	"sort"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/callgraph"
-	"llvm.org/llgo/third_party/gotools/go/callgraph/static"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-)
-
-const input = `package P
-
-type C int
-func (C) f()
-
-type I interface{f()}
-
-func f() {
-	p := func() {}
-	g()
-	p() // SSA constant propagation => static
-
-	if unknown {
-		p = h
-	}
-	p() // dynamic
-
-	C(0).f()
-}
-
-func g() {
-	var i I = C(0)
-	i.f()
-}
-
-func h()
-
-var unknown bool
-`
-
-func TestStatic(t *testing.T) {
-	conf := loader.Config{ParserMode: parser.ParseComments}
-	f, err := conf.ParseFile("P.go", input)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	conf.CreateFromFiles("P", f)
-	iprog, err := conf.Load()
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	P := iprog.Created[0].Pkg
-
-	prog := ssa.Create(iprog, 0)
-	prog.BuildAll()
-
-	cg := static.CallGraph(prog)
-
-	var edges []string
-	callgraph.GraphVisitEdges(cg, func(e *callgraph.Edge) error {
-		edges = append(edges, fmt.Sprintf("%s -> %s",
-			e.Caller.Func.RelString(P),
-			e.Callee.Func.RelString(P)))
-		return nil
-	})
-	sort.Strings(edges)
-
-	want := []string{
-		"(*C).f -> (C).f",
-		"f -> (C).f",
-		"f -> f$1",
-		"f -> g",
-	}
-	if !reflect.DeepEqual(edges, want) {
-		t.Errorf("Got edges %v, want %v", edges, want)
-	}
-}
diff --git a/third_party/gotools/go/callgraph/util.go b/third_party/gotools/go/callgraph/util.go
deleted file mode 100644
index fab68e3..0000000
--- a/third_party/gotools/go/callgraph/util.go
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package callgraph
-
-import "llvm.org/llgo/third_party/gotools/go/ssa"
-
-// This file provides various utilities over call graphs, such as
-// visitation and path search.
-
-// CalleesOf returns a new set containing all direct callees of the
-// caller node.
-//
-func CalleesOf(caller *Node) map[*Node]bool {
-	callees := make(map[*Node]bool)
-	for _, e := range caller.Out {
-		callees[e.Callee] = true
-	}
-	return callees
-}
-
-// GraphVisitEdges visits all the edges in graph g in depth-first order.
-// The edge function is called for each edge in postorder.  If it
-// returns non-nil, visitation stops and GraphVisitEdges returns that
-// value.
-//
-func GraphVisitEdges(g *Graph, edge func(*Edge) error) error {
-	seen := make(map[*Node]bool)
-	var visit func(n *Node) error
-	visit = func(n *Node) error {
-		if !seen[n] {
-			seen[n] = true
-			for _, e := range n.Out {
-				if err := visit(e.Callee); err != nil {
-					return err
-				}
-				if err := edge(e); err != nil {
-					return err
-				}
-			}
-		}
-		return nil
-	}
-	for _, n := range g.Nodes {
-		if err := visit(n); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// PathSearch finds an arbitrary path starting at node start and
-// ending at some node for which isEnd() returns true.  On success,
-// PathSearch returns the path as an ordered list of edges; on
-// failure, it returns nil.
-//
-func PathSearch(start *Node, isEnd func(*Node) bool) []*Edge {
-	stack := make([]*Edge, 0, 32)
-	seen := make(map[*Node]bool)
-	var search func(n *Node) []*Edge
-	search = func(n *Node) []*Edge {
-		if !seen[n] {
-			seen[n] = true
-			if isEnd(n) {
-				return stack
-			}
-			for _, e := range n.Out {
-				stack = append(stack, e) // push
-				if found := search(e.Callee); found != nil {
-					return found
-				}
-				stack = stack[:len(stack)-1] // pop
-			}
-		}
-		return nil
-	}
-	return search(start)
-}
-
-// DeleteSyntheticNodes removes from call graph g all nodes for
-// synthetic functions (except g.Root and package initializers),
-// preserving the topology.  In effect, calls to synthetic wrappers
-// are "inlined".
-//
-func (g *Graph) DeleteSyntheticNodes() {
-	// Measurements on the standard library and go.tools show that
-	// resulting graph has ~15% fewer nodes and 4-8% fewer edges
-	// than the input.
-	//
-	// Inlining a wrapper of in-degree m, out-degree n adds m*n
-	// and removes m+n edges.  Since most wrappers are monomorphic
-	// (n=1) this results in a slight reduction.  Polymorphic
-	// wrappers (n>1), e.g. from embedding an interface value
-	// inside a struct to satisfy some interface, cause an
-	// increase in the graph, but they seem to be uncommon.
-
-	// Hash all existing edges to avoid creating duplicates.
-	edges := make(map[Edge]bool)
-	for _, cgn := range g.Nodes {
-		for _, e := range cgn.Out {
-			edges[*e] = true
-		}
-	}
-	for fn, cgn := range g.Nodes {
-		if cgn == g.Root || fn.Synthetic == "" || isInit(cgn.Func) {
-			continue // keep
-		}
-		for _, eIn := range cgn.In {
-			for _, eOut := range cgn.Out {
-				newEdge := Edge{eIn.Caller, eIn.Site, eOut.Callee}
-				if edges[newEdge] {
-					continue // don't add duplicate
-				}
-				AddEdge(eIn.Caller, eIn.Site, eOut.Callee)
-				edges[newEdge] = true
-			}
-		}
-		g.DeleteNode(cgn)
-	}
-}
-
-func isInit(fn *ssa.Function) bool {
-	return fn.Pkg != nil && fn.Pkg.Func("init") == fn
-}
-
-// DeleteNode removes node n and its edges from the graph g.
-// (NB: not efficient for batch deletion.)
-func (g *Graph) DeleteNode(n *Node) {
-	n.deleteIns()
-	n.deleteOuts()
-	delete(g.Nodes, n.Func)
-}
-
-// deleteIns deletes all incoming edges to n.
-func (n *Node) deleteIns() {
-	for _, e := range n.In {
-		removeOutEdge(e)
-	}
-	n.In = nil
-}
-
-// deleteOuts deletes all outgoing edges from n.
-func (n *Node) deleteOuts() {
-	for _, e := range n.Out {
-		removeInEdge(e)
-	}
-	n.Out = nil
-}
-
-// removeOutEdge removes edge.Caller's outgoing edge 'edge'.
-func removeOutEdge(edge *Edge) {
-	caller := edge.Caller
-	n := len(caller.Out)
-	for i, e := range caller.Out {
-		if e == edge {
-			// Replace it with the final element and shrink the slice.
-			caller.Out[i] = caller.Out[n-1]
-			caller.Out[n-1] = nil // aid GC
-			caller.Out = caller.Out[:n-1]
-			return
-		}
-	}
-	panic("edge not found: " + edge.String())
-}
-
-// removeInEdge removes edge.Callee's incoming edge 'edge'.
-func removeInEdge(edge *Edge) {
-	caller := edge.Callee
-	n := len(caller.In)
-	for i, e := range caller.In {
-		if e == edge {
-			// Replace it with the final element and shrink the slice.
-			caller.In[i] = caller.In[n-1]
-			caller.In[n-1] = nil // aid GC
-			caller.In = caller.In[:n-1]
-			return
-		}
-	}
-	panic("edge not found: " + edge.String())
-}
diff --git a/third_party/gotools/go/exact/exact.go b/third_party/gotools/go/exact/exact.go
deleted file mode 100644
index 7ba8b05..0000000
--- a/third_party/gotools/go/exact/exact.go
+++ /dev/null
@@ -1,920 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package exact implements Values representing untyped
-// Go constants and the corresponding operations. Values
-// and operations have unlimited precision.
-//
-// A special Unknown value may be used when a value
-// is unknown due to an error. Operations on unknown
-// values produce unknown values unless specified
-// otherwise.
-//
-package exact // import "llvm.org/llgo/third_party/gotools/go/exact"
-
-import (
-	"fmt"
-	"go/token"
-	"math/big"
-	"strconv"
-)
-
-// Kind specifies the kind of value represented by a Value.
-type Kind int
-
-// Implementation note: Kinds must be enumerated in
-// order of increasing "complexity" (used by match).
-
-const (
-	// unknown values
-	Unknown Kind = iota
-
-	// non-numeric values
-	Bool
-	String
-
-	// numeric values
-	Int
-	Float
-	Complex
-)
-
-// A Value represents a mathematically exact value of a given Kind.
-type Value interface {
-	// Kind returns the value kind; it is always the smallest
-	// kind in which the value can be represented exactly.
-	Kind() Kind
-
-	// String returns a human-readable form of the value.
-	String() string
-
-	// Prevent external implementations.
-	implementsValue()
-}
-
-// ----------------------------------------------------------------------------
-// Implementations
-
-type (
-	unknownVal struct{}
-	boolVal    bool
-	stringVal  string
-	int64Val   int64
-	intVal     struct{ val *big.Int }
-	floatVal   struct{ val *big.Rat }
-	complexVal struct{ re, im *big.Rat }
-)
-
-func (unknownVal) Kind() Kind { return Unknown }
-func (boolVal) Kind() Kind    { return Bool }
-func (stringVal) Kind() Kind  { return String }
-func (int64Val) Kind() Kind   { return Int }
-func (intVal) Kind() Kind     { return Int }
-func (floatVal) Kind() Kind   { return Float }
-func (complexVal) Kind() Kind { return Complex }
-
-func (unknownVal) String() string   { return "unknown" }
-func (x boolVal) String() string    { return fmt.Sprintf("%v", bool(x)) }
-func (x stringVal) String() string  { return strconv.Quote(string(x)) }
-func (x int64Val) String() string   { return strconv.FormatInt(int64(x), 10) }
-func (x intVal) String() string     { return x.val.String() }
-func (x floatVal) String() string   { return x.val.String() }
-func (x complexVal) String() string { return fmt.Sprintf("(%s + %si)", x.re, x.im) }
-
-func (unknownVal) implementsValue() {}
-func (boolVal) implementsValue()    {}
-func (stringVal) implementsValue()  {}
-func (int64Val) implementsValue()   {}
-func (intVal) implementsValue()     {}
-func (floatVal) implementsValue()   {}
-func (complexVal) implementsValue() {}
-
-// int64 bounds
-var (
-	minInt64 = big.NewInt(-1 << 63)
-	maxInt64 = big.NewInt(1<<63 - 1)
-)
-
-func normInt(x *big.Int) Value {
-	if minInt64.Cmp(x) <= 0 && x.Cmp(maxInt64) <= 0 {
-		return int64Val(x.Int64())
-	}
-	return intVal{x}
-}
-
-func normFloat(x *big.Rat) Value {
-	if x.IsInt() {
-		return normInt(x.Num())
-	}
-	return floatVal{x}
-}
-
-func normComplex(re, im *big.Rat) Value {
-	if im.Sign() == 0 {
-		return normFloat(re)
-	}
-	return complexVal{re, im}
-}
-
-// ----------------------------------------------------------------------------
-// Factories
-
-// MakeUnknown returns the Unknown value.
-func MakeUnknown() Value { return unknownVal{} }
-
-// MakeBool returns the Bool value for x.
-func MakeBool(b bool) Value { return boolVal(b) }
-
-// MakeString returns the String value for x.
-func MakeString(s string) Value { return stringVal(s) }
-
-// MakeInt64 returns the Int value for x.
-func MakeInt64(x int64) Value { return int64Val(x) }
-
-// MakeUint64 returns the Int value for x.
-func MakeUint64(x uint64) Value { return normInt(new(big.Int).SetUint64(x)) }
-
-// MakeFloat64 returns the numeric value for x.
-// If x is not finite, the result is unknown.
-func MakeFloat64(x float64) Value {
-	if f := new(big.Rat).SetFloat64(x); f != nil {
-		return normFloat(f)
-	}
-	return unknownVal{}
-}
-
-// MakeFromLiteral returns the corresponding integer, floating-point,
-// imaginary, character, or string value for a Go literal string. The
-// result is nil if the literal string is invalid.
-func MakeFromLiteral(lit string, tok token.Token) Value {
-	switch tok {
-	case token.INT:
-		if x, err := strconv.ParseInt(lit, 0, 64); err == nil {
-			return int64Val(x)
-		}
-		if x, ok := new(big.Int).SetString(lit, 0); ok {
-			return intVal{x}
-		}
-
-	case token.FLOAT:
-		if x, ok := new(big.Rat).SetString(lit); ok {
-			return normFloat(x)
-		}
-
-	case token.IMAG:
-		if n := len(lit); n > 0 && lit[n-1] == 'i' {
-			if im, ok := new(big.Rat).SetString(lit[0 : n-1]); ok {
-				return normComplex(big.NewRat(0, 1), im)
-			}
-		}
-
-	case token.CHAR:
-		if n := len(lit); n >= 2 {
-			if code, _, _, err := strconv.UnquoteChar(lit[1:n-1], '\''); err == nil {
-				return int64Val(code)
-			}
-		}
-
-	case token.STRING:
-		if s, err := strconv.Unquote(lit); err == nil {
-			return stringVal(s)
-		}
-	}
-
-	return nil
-}
-
-// ----------------------------------------------------------------------------
-// Accessors
-//
-// For unknown arguments the result is the zero value for the respective
-// accessor type, except for Sign, where the result is 1.
-
-// BoolVal returns the Go boolean value of x, which must be a Bool or an Unknown.
-// If x is Unknown, the result is false.
-func BoolVal(x Value) bool {
-	switch x := x.(type) {
-	case boolVal:
-		return bool(x)
-	case unknownVal:
-		return false
-	}
-	panic(fmt.Sprintf("%v not a Bool", x))
-}
-
-// StringVal returns the Go string value of x, which must be a String or an Unknown.
-// If x is Unknown, the result is "".
-func StringVal(x Value) string {
-	switch x := x.(type) {
-	case stringVal:
-		return string(x)
-	case unknownVal:
-		return ""
-	}
-	panic(fmt.Sprintf("%v not a String", x))
-}
-
-// Int64Val returns the Go int64 value of x and whether the result is exact;
-// x must be an Int or an Unknown. If the result is not exact, its value is undefined.
-// If x is Unknown, the result is (0, false).
-func Int64Val(x Value) (int64, bool) {
-	switch x := x.(type) {
-	case int64Val:
-		return int64(x), true
-	case intVal:
-		return x.val.Int64(), x.val.BitLen() <= 63
-	case unknownVal:
-		return 0, false
-	}
-	panic(fmt.Sprintf("%v not an Int", x))
-}
-
-// Uint64Val returns the Go uint64 value of x and whether the result is exact;
-// x must be an Int or an Unknown. If the result is not exact, its value is undefined.
-// If x is Unknown, the result is (0, false).
-func Uint64Val(x Value) (uint64, bool) {
-	switch x := x.(type) {
-	case int64Val:
-		return uint64(x), x >= 0
-	case intVal:
-		return x.val.Uint64(), x.val.Sign() >= 0 && x.val.BitLen() <= 64
-	case unknownVal:
-		return 0, false
-	}
-	panic(fmt.Sprintf("%v not an Int", x))
-}
-
-// Float32Val is like Float64Val but for float32 instead of float64.
-func Float32Val(x Value) (float32, bool) {
-	switch x := x.(type) {
-	case int64Val:
-		f := float32(x)
-		return f, int64Val(f) == x
-	case intVal:
-		return ratToFloat32(new(big.Rat).SetFrac(x.val, int1))
-	case floatVal:
-		return ratToFloat32(x.val)
-	case unknownVal:
-		return 0, false
-	}
-	panic(fmt.Sprintf("%v not a Float", x))
-}
-
-// Float64Val returns the nearest Go float64 value of x and whether the result is exact;
-// x must be numeric but not Complex, or Unknown. For values too small (too close to 0)
-// to represent as float64, Float64Val silently underflows to 0. The result sign always
-// matches the sign of x, even for 0.
-// If x is Unknown, the result is (0, false).
-func Float64Val(x Value) (float64, bool) {
-	switch x := x.(type) {
-	case int64Val:
-		f := float64(int64(x))
-		return f, int64Val(f) == x
-	case intVal:
-		return new(big.Rat).SetFrac(x.val, int1).Float64()
-	case floatVal:
-		return x.val.Float64()
-	case unknownVal:
-		return 0, false
-	}
-	panic(fmt.Sprintf("%v not a Float", x))
-}
-
-// BitLen returns the number of bits required to represent
-// the absolute value x in binary representation; x must be an Int or an Unknown.
-// If x is Unknown, the result is 0.
-func BitLen(x Value) int {
-	switch x := x.(type) {
-	case int64Val:
-		return new(big.Int).SetInt64(int64(x)).BitLen()
-	case intVal:
-		return x.val.BitLen()
-	case unknownVal:
-		return 0
-	}
-	panic(fmt.Sprintf("%v not an Int", x))
-}
-
-// Sign returns -1, 0, or 1 depending on whether x < 0, x == 0, or x > 0;
-// x must be numeric or Unknown. For complex values x, the sign is 0 if x == 0,
-// otherwise it is != 0. If x is Unknown, the result is 1.
-func Sign(x Value) int {
-	switch x := x.(type) {
-	case int64Val:
-		switch {
-		case x < 0:
-			return -1
-		case x > 0:
-			return 1
-		}
-		return 0
-	case intVal:
-		return x.val.Sign()
-	case floatVal:
-		return x.val.Sign()
-	case complexVal:
-		return x.re.Sign() | x.im.Sign()
-	case unknownVal:
-		return 1 // avoid spurious division by zero errors
-	}
-	panic(fmt.Sprintf("%v not numeric", x))
-}
-
-// ----------------------------------------------------------------------------
-// Support for serializing/deserializing integers
-
-const (
-	// Compute the size of a Word in bytes.
-	_m       = ^big.Word(0)
-	_log     = _m>>8&1 + _m>>16&1 + _m>>32&1
-	wordSize = 1 << _log
-)
-
-// Bytes returns the bytes for the absolute value of x in little-
-// endian binary representation; x must be an Int.
-func Bytes(x Value) []byte {
-	var val *big.Int
-	switch x := x.(type) {
-	case int64Val:
-		val = new(big.Int).SetInt64(int64(x))
-	case intVal:
-		val = x.val
-	default:
-		panic(fmt.Sprintf("%v not an Int", x))
-	}
-
-	words := val.Bits()
-	bytes := make([]byte, len(words)*wordSize)
-
-	i := 0
-	for _, w := range words {
-		for j := 0; j < wordSize; j++ {
-			bytes[i] = byte(w)
-			w >>= 8
-			i++
-		}
-	}
-	// remove leading 0's
-	for i > 0 && bytes[i-1] == 0 {
-		i--
-	}
-
-	return bytes[:i]
-}
-
-// MakeFromBytes returns the Int value given the bytes of its little-endian
-// binary representation. An empty byte slice argument represents 0.
-func MakeFromBytes(bytes []byte) Value {
-	words := make([]big.Word, (len(bytes)+(wordSize-1))/wordSize)
-
-	i := 0
-	var w big.Word
-	var s uint
-	for _, b := range bytes {
-		w |= big.Word(b) << s
-		if s += 8; s == wordSize*8 {
-			words[i] = w
-			i++
-			w = 0
-			s = 0
-		}
-	}
-	// store last word
-	if i < len(words) {
-		words[i] = w
-		i++
-	}
-	// remove leading 0's
-	for i > 0 && words[i-1] == 0 {
-		i--
-	}
-
-	return normInt(new(big.Int).SetBits(words[:i]))
-}
-
-// ----------------------------------------------------------------------------
-// Support for disassembling fractions
-
-// Num returns the numerator of x; x must be Int, Float, or Unknown.
-// If x is Unknown, the result is Unknown, otherwise it is an Int
-// with the same sign as x.
-func Num(x Value) Value {
-	switch x := x.(type) {
-	case unknownVal, int64Val, intVal:
-		return x
-	case floatVal:
-		return normInt(x.val.Num())
-	}
-	panic(fmt.Sprintf("%v not Int or Float", x))
-}
-
-// Denom returns the denominator of x; x must be Int, Float, or Unknown.
-// If x is Unknown, the result is Unknown, otherwise it is an Int >= 1.
-func Denom(x Value) Value {
-	switch x := x.(type) {
-	case unknownVal:
-		return x
-	case int64Val, intVal:
-		return int64Val(1)
-	case floatVal:
-		return normInt(x.val.Denom())
-	}
-	panic(fmt.Sprintf("%v not Int or Float", x))
-}
-
-// ----------------------------------------------------------------------------
-// Support for assembling/disassembling complex numbers
-
-// MakeImag returns the numeric value x*i (possibly 0);
-// x must be Int, Float, or Unknown.
-// If x is Unknown, the result is Unknown.
-func MakeImag(x Value) Value {
-	var im *big.Rat
-	switch x := x.(type) {
-	case unknownVal:
-		return x
-	case int64Val:
-		im = big.NewRat(int64(x), 1)
-	case intVal:
-		im = new(big.Rat).SetFrac(x.val, int1)
-	case floatVal:
-		im = x.val
-	default:
-		panic(fmt.Sprintf("%v not Int or Float", x))
-	}
-	return normComplex(rat0, im)
-}
-
-// Real returns the real part of x, which must be a numeric or unknown value.
-// If x is Unknown, the result is Unknown.
-func Real(x Value) Value {
-	switch x := x.(type) {
-	case unknownVal, int64Val, intVal, floatVal:
-		return x
-	case complexVal:
-		return normFloat(x.re)
-	}
-	panic(fmt.Sprintf("%v not numeric", x))
-}
-
-// Imag returns the imaginary part of x, which must be a numeric or unknown value.
-// If x is Unknown, the result is Unknown.
-func Imag(x Value) Value {
-	switch x := x.(type) {
-	case unknownVal:
-		return x
-	case int64Val, intVal, floatVal:
-		return int64Val(0)
-	case complexVal:
-		return normFloat(x.im)
-	}
-	panic(fmt.Sprintf("%v not numeric", x))
-}
-
-// ----------------------------------------------------------------------------
-// Operations
-
-// is32bit reports whether x can be represented using 32 bits.
-func is32bit(x int64) bool {
-	const s = 32
-	return -1<<(s-1) <= x && x <= 1<<(s-1)-1
-}
-
-// is63bit reports whether x can be represented using 63 bits.
-func is63bit(x int64) bool {
-	const s = 63
-	return -1<<(s-1) <= x && x <= 1<<(s-1)-1
-}
-
-// UnaryOp returns the result of the unary expression op y.
-// The operation must be defined for the operand.
-// If size >= 0 it specifies the ^ (xor) result size in bytes.
-// If y is Unknown, the result is Unknown.
-//
-func UnaryOp(op token.Token, y Value, size int) Value {
-	switch op {
-	case token.ADD:
-		switch y.(type) {
-		case unknownVal, int64Val, intVal, floatVal, complexVal:
-			return y
-		}
-
-	case token.SUB:
-		switch y := y.(type) {
-		case unknownVal:
-			return y
-		case int64Val:
-			if z := -y; z != y {
-				return z // no overflow
-			}
-			return normInt(new(big.Int).Neg(big.NewInt(int64(y))))
-		case intVal:
-			return normInt(new(big.Int).Neg(y.val))
-		case floatVal:
-			return normFloat(new(big.Rat).Neg(y.val))
-		case complexVal:
-			return normComplex(new(big.Rat).Neg(y.re), new(big.Rat).Neg(y.im))
-		}
-
-	case token.XOR:
-		var z big.Int
-		switch y := y.(type) {
-		case unknownVal:
-			return y
-		case int64Val:
-			z.Not(big.NewInt(int64(y)))
-		case intVal:
-			z.Not(y.val)
-		default:
-			goto Error
-		}
-		// For unsigned types, the result will be negative and
-		// thus "too large": We must limit the result size to
-		// the type's size.
-		if size >= 0 {
-			s := uint(size) * 8
-			z.AndNot(&z, new(big.Int).Lsh(big.NewInt(-1), s)) // z &^= (-1)<<s
-		}
-		return normInt(&z)
-
-	case token.NOT:
-		switch y := y.(type) {
-		case unknownVal:
-			return y
-		case boolVal:
-			return !y
-		}
-	}
-
-Error:
-	panic(fmt.Sprintf("invalid unary operation %s%v", op, y))
-}
-
-var (
-	int1 = big.NewInt(1)
-	rat0 = big.NewRat(0, 1)
-)
-
-func ord(x Value) int {
-	switch x.(type) {
-	default:
-		return 0
-	case boolVal, stringVal:
-		return 1
-	case int64Val:
-		return 2
-	case intVal:
-		return 3
-	case floatVal:
-		return 4
-	case complexVal:
-		return 5
-	}
-}
-
-// match returns the matching representation (same type) with the
-// smallest complexity for two values x and y. If one of them is
-// numeric, both of them must be numeric. If one of them is Unknown,
-// both results are Unknown.
-//
-func match(x, y Value) (_, _ Value) {
-	if ord(x) > ord(y) {
-		y, x = match(y, x)
-		return x, y
-	}
-	// ord(x) <= ord(y)
-
-	switch x := x.(type) {
-	case unknownVal:
-		return x, x
-
-	case boolVal, stringVal, complexVal:
-		return x, y
-
-	case int64Val:
-		switch y := y.(type) {
-		case int64Val:
-			return x, y
-		case intVal:
-			return intVal{big.NewInt(int64(x))}, y
-		case floatVal:
-			return floatVal{big.NewRat(int64(x), 1)}, y
-		case complexVal:
-			return complexVal{big.NewRat(int64(x), 1), rat0}, y
-		}
-
-	case intVal:
-		switch y := y.(type) {
-		case intVal:
-			return x, y
-		case floatVal:
-			return floatVal{new(big.Rat).SetFrac(x.val, int1)}, y
-		case complexVal:
-			return complexVal{new(big.Rat).SetFrac(x.val, int1), rat0}, y
-		}
-
-	case floatVal:
-		switch y := y.(type) {
-		case floatVal:
-			return x, y
-		case complexVal:
-			return complexVal{x.val, rat0}, y
-		}
-	}
-
-	panic("unreachable")
-}
-
-// BinaryOp returns the result of the binary expression x op y.
-// The operation must be defined for the operands. If one of the
-// operands is Unknown, the result is Unknown.
-// To force integer division of Int operands, use op == token.QUO_ASSIGN
-// instead of token.QUO; the result is guaranteed to be Int in this case.
-// Division by zero leads to a run-time panic.
-//
-func BinaryOp(x Value, op token.Token, y Value) Value {
-	x, y = match(x, y)
-
-	switch x := x.(type) {
-	case unknownVal:
-		return x
-
-	case boolVal:
-		y := y.(boolVal)
-		switch op {
-		case token.LAND:
-			return x && y
-		case token.LOR:
-			return x || y
-		}
-
-	case int64Val:
-		a := int64(x)
-		b := int64(y.(int64Val))
-		var c int64
-		switch op {
-		case token.ADD:
-			if !is63bit(a) || !is63bit(b) {
-				return normInt(new(big.Int).Add(big.NewInt(a), big.NewInt(b)))
-			}
-			c = a + b
-		case token.SUB:
-			if !is63bit(a) || !is63bit(b) {
-				return normInt(new(big.Int).Sub(big.NewInt(a), big.NewInt(b)))
-			}
-			c = a - b
-		case token.MUL:
-			if !is32bit(a) || !is32bit(b) {
-				return normInt(new(big.Int).Mul(big.NewInt(a), big.NewInt(b)))
-			}
-			c = a * b
-		case token.QUO:
-			return normFloat(new(big.Rat).SetFrac(big.NewInt(a), big.NewInt(b)))
-		case token.QUO_ASSIGN: // force integer division
-			c = a / b
-		case token.REM:
-			c = a % b
-		case token.AND:
-			c = a & b
-		case token.OR:
-			c = a | b
-		case token.XOR:
-			c = a ^ b
-		case token.AND_NOT:
-			c = a &^ b
-		default:
-			goto Error
-		}
-		return int64Val(c)
-
-	case intVal:
-		a := x.val
-		b := y.(intVal).val
-		var c big.Int
-		switch op {
-		case token.ADD:
-			c.Add(a, b)
-		case token.SUB:
-			c.Sub(a, b)
-		case token.MUL:
-			c.Mul(a, b)
-		case token.QUO:
-			return normFloat(new(big.Rat).SetFrac(a, b))
-		case token.QUO_ASSIGN: // force integer division
-			c.Quo(a, b)
-		case token.REM:
-			c.Rem(a, b)
-		case token.AND:
-			c.And(a, b)
-		case token.OR:
-			c.Or(a, b)
-		case token.XOR:
-			c.Xor(a, b)
-		case token.AND_NOT:
-			c.AndNot(a, b)
-		default:
-			goto Error
-		}
-		return normInt(&c)
-
-	case floatVal:
-		a := x.val
-		b := y.(floatVal).val
-		var c big.Rat
-		switch op {
-		case token.ADD:
-			c.Add(a, b)
-		case token.SUB:
-			c.Sub(a, b)
-		case token.MUL:
-			c.Mul(a, b)
-		case token.QUO:
-			c.Quo(a, b)
-		default:
-			goto Error
-		}
-		return normFloat(&c)
-
-	case complexVal:
-		y := y.(complexVal)
-		a, b := x.re, x.im
-		c, d := y.re, y.im
-		var re, im big.Rat
-		switch op {
-		case token.ADD:
-			// (a+c) + i(b+d)
-			re.Add(a, c)
-			im.Add(b, d)
-		case token.SUB:
-			// (a-c) + i(b-d)
-			re.Sub(a, c)
-			im.Sub(b, d)
-		case token.MUL:
-			// (ac-bd) + i(bc+ad)
-			var ac, bd, bc, ad big.Rat
-			ac.Mul(a, c)
-			bd.Mul(b, d)
-			bc.Mul(b, c)
-			ad.Mul(a, d)
-			re.Sub(&ac, &bd)
-			im.Add(&bc, &ad)
-		case token.QUO:
-			// (ac+bd)/s + i(bc-ad)/s, with s = cc + dd
-			var ac, bd, bc, ad, s, cc, dd big.Rat
-			ac.Mul(a, c)
-			bd.Mul(b, d)
-			bc.Mul(b, c)
-			ad.Mul(a, d)
-			cc.Mul(c, c)
-			dd.Mul(d, d)
-			s.Add(&cc, &dd)
-			re.Add(&ac, &bd)
-			re.Quo(&re, &s)
-			im.Sub(&bc, &ad)
-			im.Quo(&im, &s)
-		default:
-			goto Error
-		}
-		return normComplex(&re, &im)
-
-	case stringVal:
-		if op == token.ADD {
-			return x + y.(stringVal)
-		}
-	}
-
-Error:
-	panic(fmt.Sprintf("invalid binary operation %v %s %v", x, op, y))
-}
-
-// Shift returns the result of the shift expression x op s
-// with op == token.SHL or token.SHR (<< or >>). x must be
-// an Int or an Unknown. If x is Unknown, the result is x.
-//
-func Shift(x Value, op token.Token, s uint) Value {
-	switch x := x.(type) {
-	case unknownVal:
-		return x
-
-	case int64Val:
-		if s == 0 {
-			return x
-		}
-		switch op {
-		case token.SHL:
-			z := big.NewInt(int64(x))
-			return normInt(z.Lsh(z, s))
-		case token.SHR:
-			return x >> s
-		}
-
-	case intVal:
-		if s == 0 {
-			return x
-		}
-		var z big.Int
-		switch op {
-		case token.SHL:
-			return normInt(z.Lsh(x.val, s))
-		case token.SHR:
-			return normInt(z.Rsh(x.val, s))
-		}
-	}
-
-	panic(fmt.Sprintf("invalid shift %v %s %d", x, op, s))
-}
-
-func cmpZero(x int, op token.Token) bool {
-	switch op {
-	case token.EQL:
-		return x == 0
-	case token.NEQ:
-		return x != 0
-	case token.LSS:
-		return x < 0
-	case token.LEQ:
-		return x <= 0
-	case token.GTR:
-		return x > 0
-	case token.GEQ:
-		return x >= 0
-	}
-	panic("unreachable")
-}
-
-// Compare returns the result of the comparison x op y.
-// The comparison must be defined for the operands.
-// If one of the operands is Unknown, the result is
-// false.
-//
-func Compare(x Value, op token.Token, y Value) bool {
-	x, y = match(x, y)
-
-	switch x := x.(type) {
-	case unknownVal:
-		return false
-
-	case boolVal:
-		y := y.(boolVal)
-		switch op {
-		case token.EQL:
-			return x == y
-		case token.NEQ:
-			return x != y
-		}
-
-	case int64Val:
-		y := y.(int64Val)
-		switch op {
-		case token.EQL:
-			return x == y
-		case token.NEQ:
-			return x != y
-		case token.LSS:
-			return x < y
-		case token.LEQ:
-			return x <= y
-		case token.GTR:
-			return x > y
-		case token.GEQ:
-			return x >= y
-		}
-
-	case intVal:
-		return cmpZero(x.val.Cmp(y.(intVal).val), op)
-
-	case floatVal:
-		return cmpZero(x.val.Cmp(y.(floatVal).val), op)
-
-	case complexVal:
-		y := y.(complexVal)
-		re := x.re.Cmp(y.re)
-		im := x.im.Cmp(y.im)
-		switch op {
-		case token.EQL:
-			return re == 0 && im == 0
-		case token.NEQ:
-			return re != 0 || im != 0
-		}
-
-	case stringVal:
-		y := y.(stringVal)
-		switch op {
-		case token.EQL:
-			return x == y
-		case token.NEQ:
-			return x != y
-		case token.LSS:
-			return x < y
-		case token.LEQ:
-			return x <= y
-		case token.GTR:
-			return x > y
-		case token.GEQ:
-			return x >= y
-		}
-	}
-
-	panic(fmt.Sprintf("invalid comparison %v %s %v", x, op, y))
-}
diff --git a/third_party/gotools/go/exact/exact_test.go b/third_party/gotools/go/exact/exact_test.go
deleted file mode 100644
index aa38a89..0000000
--- a/third_party/gotools/go/exact/exact_test.go
+++ /dev/null
@@ -1,375 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package exact
-
-import (
-	"go/token"
-	"strings"
-	"testing"
-)
-
-// TODO(gri) expand this test framework
-
-var opTests = []string{
-	// unary operations
-	`+ 0 = 0`,
-	`+ ? = ?`,
-	`- 1 = -1`,
-	`- ? = ?`,
-	`^ 0 = -1`,
-	`^ ? = ?`,
-
-	`! true = false`,
-	`! false = true`,
-	`! ? = ?`,
-
-	// etc.
-
-	// binary operations
-	`"" + "" = ""`,
-	`"foo" + "" = "foo"`,
-	`"" + "bar" = "bar"`,
-	`"foo" + "bar" = "foobar"`,
-
-	`0 + 0 = 0`,
-	`0 + 0.1 = 0.1`,
-	`0 + 0.1i = 0.1i`,
-	`0.1 + 0.9 = 1`,
-	`1e100 + 1e100 = 2e100`,
-	`? + 0 = ?`,
-	`0 + ? = ?`,
-
-	`0 - 0 = 0`,
-	`0 - 0.1 = -0.1`,
-	`0 - 0.1i = -0.1i`,
-	`1e100 - 1e100 = 0`,
-	`? - 0 = ?`,
-	`0 - ? = ?`,
-
-	`0 * 0 = 0`,
-	`1 * 0.1 = 0.1`,
-	`1 * 0.1i = 0.1i`,
-	`1i * 1i = -1`,
-	`? * 0 = ?`,
-	`0 * ? = ?`,
-
-	`0 / 0 = "division_by_zero"`,
-	`10 / 2 = 5`,
-	`5 / 3 = 5/3`,
-	`5i / 3i = 5/3`,
-	`? / 0 = ?`,
-	`0 / ? = ?`,
-
-	`0 % 0 = "runtime_error:_integer_divide_by_zero"`, // TODO(gri) should be the same as for /
-	`10 % 3 = 1`,
-	`? % 0 = ?`,
-	`0 % ? = ?`,
-
-	`0 & 0 = 0`,
-	`12345 & 0 = 0`,
-	`0xff & 0xf = 0xf`,
-	`? & 0 = ?`,
-	`0 & ? = ?`,
-
-	`0 | 0 = 0`,
-	`12345 | 0 = 12345`,
-	`0xb | 0xa0 = 0xab`,
-	`? | 0 = ?`,
-	`0 | ? = ?`,
-
-	`0 ^ 0 = 0`,
-	`1 ^ -1 = -2`,
-	`? ^ 0 = ?`,
-	`0 ^ ? = ?`,
-
-	`0 &^ 0 = 0`,
-	`0xf &^ 1 = 0xe`,
-	`1 &^ 0xf = 0`,
-	// etc.
-
-	// shifts
-	`0 << 0 = 0`,
-	`1 << 10 = 1024`,
-	`0 >> 0 = 0`,
-	`1024 >> 10 == 1`,
-	`? << 0 == ?`,
-	`? >> 10 == ?`,
-	// etc.
-
-	// comparisons
-	`false == false = true`,
-	`false == true = false`,
-	`true == false = false`,
-	`true == true = true`,
-
-	`false != false = false`,
-	`false != true = true`,
-	`true != false = true`,
-	`true != true = false`,
-
-	`"foo" == "bar" = false`,
-	`"foo" != "bar" = true`,
-	`"foo" < "bar" = false`,
-	`"foo" <= "bar" = false`,
-	`"foo" > "bar" = true`,
-	`"foo" >= "bar" = true`,
-
-	`0 == 0 = true`,
-	`0 != 0 = false`,
-	`0 < 10 = true`,
-	`10 <= 10 = true`,
-	`0 > 10 = false`,
-	`10 >= 10 = true`,
-
-	`1/123456789 == 1/123456789 == true`,
-	`1/123456789 != 1/123456789 == false`,
-	`1/123456789 < 1/123456788 == true`,
-	`1/123456788 <= 1/123456789 == false`,
-	`0.11 > 0.11 = false`,
-	`0.11 >= 0.11 = true`,
-
-	`? == 0 = false`,
-	`? != 0 = false`,
-	`? < 10 = false`,
-	`? <= 10 = false`,
-	`? > 10 = false`,
-	`? >= 10 = false`,
-
-	`0 == ? = false`,
-	`0 != ? = false`,
-	`0 < ? = false`,
-	`10 <= ? = false`,
-	`0 > ? = false`,
-	`10 >= ? = false`,
-
-	// etc.
-}
-
-func TestOps(t *testing.T) {
-	for _, test := range opTests {
-		a := strings.Split(test, " ")
-		i := 0 // operator index
-
-		var x, x0 Value
-		switch len(a) {
-		case 4:
-			// unary operation
-		case 5:
-			// binary operation
-			x, x0 = val(a[0]), val(a[0])
-			i = 1
-		default:
-			t.Errorf("invalid test case: %s", test)
-			continue
-		}
-
-		op, ok := optab[a[i]]
-		if !ok {
-			panic("missing optab entry for " + a[i])
-		}
-
-		y, y0 := val(a[i+1]), val(a[i+1])
-
-		got := doOp(x, op, y)
-		want := val(a[i+3])
-		if !eql(got, want) {
-			t.Errorf("%s: got %s; want %s", test, got, want)
-		}
-		if x0 != nil && !eql(x, x0) {
-			t.Errorf("%s: x changed to %s", test, x)
-		}
-		if !eql(y, y0) {
-			t.Errorf("%s: y changed to %s", test, y)
-		}
-	}
-}
-
-func eql(x, y Value) bool {
-	_, ux := x.(unknownVal)
-	_, uy := y.(unknownVal)
-	if ux || uy {
-		return ux == uy
-	}
-	return Compare(x, token.EQL, y)
-}
-
-// ----------------------------------------------------------------------------
-// Support functions
-
-func val(lit string) Value {
-	if len(lit) == 0 {
-		return MakeUnknown()
-	}
-
-	switch lit {
-	case "?":
-		return MakeUnknown()
-	case "true":
-		return MakeBool(true)
-	case "false":
-		return MakeBool(false)
-	}
-
-	tok := token.INT
-	switch first, last := lit[0], lit[len(lit)-1]; {
-	case first == '"' || first == '`':
-		tok = token.STRING
-		lit = strings.Replace(lit, "_", " ", -1)
-	case first == '\'':
-		tok = token.CHAR
-	case last == 'i':
-		tok = token.IMAG
-	default:
-		if !strings.HasPrefix(lit, "0x") && strings.ContainsAny(lit, "./Ee") {
-			tok = token.FLOAT
-		}
-	}
-
-	return MakeFromLiteral(lit, tok)
-}
-
-var optab = map[string]token.Token{
-	"!": token.NOT,
-
-	"+": token.ADD,
-	"-": token.SUB,
-	"*": token.MUL,
-	"/": token.QUO,
-	"%": token.REM,
-
-	"<<": token.SHL,
-	">>": token.SHR,
-
-	"&":  token.AND,
-	"|":  token.OR,
-	"^":  token.XOR,
-	"&^": token.AND_NOT,
-
-	"==": token.EQL,
-	"!=": token.NEQ,
-	"<":  token.LSS,
-	"<=": token.LEQ,
-	">":  token.GTR,
-	">=": token.GEQ,
-}
-
-func panicHandler(v *Value) {
-	switch p := recover().(type) {
-	case nil:
-		// nothing to do
-	case string:
-		*v = MakeString(p)
-	case error:
-		*v = MakeString(p.Error())
-	default:
-		panic(p)
-	}
-}
-
-func doOp(x Value, op token.Token, y Value) (z Value) {
-	defer panicHandler(&z)
-
-	if x == nil {
-		return UnaryOp(op, y, -1)
-	}
-
-	switch op {
-	case token.EQL, token.NEQ, token.LSS, token.LEQ, token.GTR, token.GEQ:
-		return MakeBool(Compare(x, op, y))
-	case token.SHL, token.SHR:
-		s, _ := Int64Val(y)
-		return Shift(x, op, uint(s))
-	default:
-		return BinaryOp(x, op, y)
-	}
-}
-
-// ----------------------------------------------------------------------------
-// Other tests
-
-var fracTests = []string{
-	"0 0 1",
-	"1 1 1",
-	"-1 -1 1",
-	"1.2 6 5",
-	"-0.991 -991 1000",
-	"1e100 1e100 1",
-}
-
-func TestFractions(t *testing.T) {
-	for _, test := range fracTests {
-		a := strings.Split(test, " ")
-		if len(a) != 3 {
-			t.Errorf("invalid test case: %s", test)
-			continue
-		}
-
-		x := val(a[0])
-		n := val(a[1])
-		d := val(a[2])
-
-		if got := Num(x); !eql(got, n) {
-			t.Errorf("%s: got num = %s; want %s", test, got, n)
-		}
-
-		if got := Denom(x); !eql(got, d) {
-			t.Errorf("%s: got denom = %s; want %s", test, got, d)
-		}
-	}
-}
-
-var bytesTests = []string{
-	"0",
-	"1",
-	"123456789",
-	"123456789012345678901234567890123456789012345678901234567890",
-}
-
-func TestBytes(t *testing.T) {
-	for _, test := range bytesTests {
-		x := val(test)
-		bytes := Bytes(x)
-
-		// special case 0
-		if Sign(x) == 0 && len(bytes) != 0 {
-			t.Errorf("%s: got %v; want empty byte slice", test, bytes)
-		}
-
-		if n := len(bytes); n > 0 && bytes[n-1] == 0 {
-			t.Errorf("%s: got %v; want no leading 0 byte", test, bytes)
-		}
-
-		if got := MakeFromBytes(bytes); !eql(got, x) {
-			t.Errorf("%s: got %s; want %s (bytes = %v)", test, got, x, bytes)
-		}
-	}
-}
-
-func TestUnknown(t *testing.T) {
-	u := MakeUnknown()
-	var values = []Value{
-		u,
-		MakeBool(false), // token.ADD ok below, operation is never considered
-		MakeString(""),
-		MakeInt64(1),
-		MakeFromLiteral("-1234567890123456789012345678901234567890", token.INT),
-		MakeFloat64(1.2),
-		MakeImag(MakeFloat64(1.2)),
-	}
-	for _, val := range values {
-		x, y := val, u
-		for i := range [2]int{} {
-			if i == 1 {
-				x, y = y, x
-			}
-			if got := BinaryOp(x, token.ADD, y); got.Kind() != Unknown {
-				t.Errorf("%s + %s: got %s; want %s", x, y, got, u)
-			}
-			if got := Compare(x, token.EQL, y); got {
-				t.Errorf("%s == %s: got true; want false", x, y)
-			}
-		}
-	}
-}
diff --git a/third_party/gotools/go/exact/go13.go b/third_party/gotools/go/exact/go13.go
deleted file mode 100644
index 1016c14..0000000
--- a/third_party/gotools/go/exact/go13.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.4
-
-package exact
-
-import (
-	"math"
-	"math/big"
-)
-
-func ratToFloat32(x *big.Rat) (float32, bool) {
-	// Before 1.4, there's no Rat.Float32.
-	// Emulate it, albeit at the cost of
-	// imprecision in corner cases.
-	x64, exact := x.Float64()
-	x32 := float32(x64)
-	if math.IsInf(float64(x32), 0) {
-		exact = false
-	}
-	return x32, exact
-}
diff --git a/third_party/gotools/go/exact/go14.go b/third_party/gotools/go/exact/go14.go
deleted file mode 100644
index b86e5d2..0000000
--- a/third_party/gotools/go/exact/go14.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.4
-
-package exact
-
-import "math/big"
-
-func ratToFloat32(x *big.Rat) (float32, bool) {
-	return x.Float32()
-}
diff --git a/third_party/gotools/go/gccgoimporter/gccgoinstallation.go b/third_party/gotools/go/gccgoimporter/gccgoinstallation.go
deleted file mode 100644
index 1e1a40d..0000000
--- a/third_party/gotools/go/gccgoimporter/gccgoinstallation.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-import (
-	"bufio"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// Information about a specific installation of gccgo.
-type GccgoInstallation struct {
-	// Version of gcc (e.g. 4.8.0).
-	GccVersion string
-
-	// Target triple (e.g. x86_64-unknown-linux-gnu).
-	TargetTriple string
-
-	// Built-in library paths used by this installation.
-	LibPaths []string
-}
-
-// Ask the driver at the given path for information for this GccgoInstallation.
-func (inst *GccgoInstallation) InitFromDriver(gccgoPath string) (err error) {
-	cmd := exec.Command(gccgoPath, "-###", "-S", "-x", "go", "-")
-	stderr, err := cmd.StderrPipe()
-	if err != nil {
-		return
-	}
-
-	err = cmd.Start()
-	if err != nil {
-		return
-	}
-
-	scanner := bufio.NewScanner(stderr)
-	for scanner.Scan() {
-		line := scanner.Text()
-		switch {
-		case strings.HasPrefix(line, "Target: "):
-			inst.TargetTriple = line[8:]
-
-		case line[0] == ' ':
-			args := strings.Fields(line)
-			for _, arg := range args[1:] {
-				if strings.HasPrefix(arg, "-L") {
-					inst.LibPaths = append(inst.LibPaths, arg[2:])
-				}
-			}
-		}
-	}
-
-	stdout, err := exec.Command(gccgoPath, "-dumpversion").Output()
-	if err != nil {
-		return
-	}
-	inst.GccVersion = strings.TrimSpace(string(stdout))
-
-	return
-}
-
-// Return the list of export search paths for this GccgoInstallation.
-func (inst *GccgoInstallation) SearchPaths() (paths []string) {
-	for _, lpath := range inst.LibPaths {
-		spath := filepath.Join(lpath, "go", inst.GccVersion)
-		fi, err := os.Stat(spath)
-		if err != nil || !fi.IsDir() {
-			continue
-		}
-		paths = append(paths, spath)
-
-		spath = filepath.Join(spath, inst.TargetTriple)
-		fi, err = os.Stat(spath)
-		if err != nil || !fi.IsDir() {
-			continue
-		}
-		paths = append(paths, spath)
-	}
-
-	paths = append(paths, inst.LibPaths...)
-
-	return
-}
-
-// Return an importer that searches incpaths followed by the gcc installation's
-// built-in search paths and the current directory.
-func (inst *GccgoInstallation) GetImporter(incpaths []string, initmap map[*types.Package]InitData) types.Importer {
-	return GetImporter(append(append(incpaths, inst.SearchPaths()...), "."), initmap)
-}
diff --git a/third_party/gotools/go/gccgoimporter/gccgoinstallation_test.go b/third_party/gotools/go/gccgoimporter/gccgoinstallation_test.go
deleted file mode 100644
index eecd952..0000000
--- a/third_party/gotools/go/gccgoimporter/gccgoinstallation_test.go
+++ /dev/null
@@ -1,194 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-import (
-	"runtime"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var importablePackages = [...]string{
-	"archive/tar",
-	"archive/zip",
-	"bufio",
-	"bytes",
-	"compress/bzip2",
-	"compress/flate",
-	"compress/gzip",
-	"compress/lzw",
-	"compress/zlib",
-	"container/heap",
-	"container/list",
-	"container/ring",
-	"crypto/aes",
-	"crypto/cipher",
-	"crypto/des",
-	"crypto/dsa",
-	"crypto/ecdsa",
-	"crypto/elliptic",
-	"crypto",
-	"crypto/hmac",
-	"crypto/md5",
-	"crypto/rand",
-	"crypto/rc4",
-	"crypto/rsa",
-	"crypto/sha1",
-	"crypto/sha256",
-	"crypto/sha512",
-	"crypto/subtle",
-	"crypto/tls",
-	"crypto/x509",
-	"crypto/x509/pkix",
-	"database/sql/driver",
-	"database/sql",
-	"debug/dwarf",
-	"debug/elf",
-	"debug/gosym",
-	"debug/macho",
-	"debug/pe",
-	"encoding/ascii85",
-	"encoding/asn1",
-	"encoding/base32",
-	"encoding/base64",
-	"encoding/binary",
-	"encoding/csv",
-	"encoding/gob",
-	"encoding",
-	"encoding/hex",
-	"encoding/json",
-	"encoding/pem",
-	"encoding/xml",
-	"errors",
-	"exp/proxy",
-	"exp/terminal",
-	"expvar",
-	"flag",
-	"fmt",
-	"go/ast",
-	"go/build",
-	"go/doc",
-	"go/format",
-	"go/parser",
-	"go/printer",
-	"go/scanner",
-	"go/token",
-	"hash/adler32",
-	"hash/crc32",
-	"hash/crc64",
-	"hash/fnv",
-	"hash",
-	"html",
-	"html/template",
-	"image/color",
-	"image/color/palette",
-	"image/draw",
-	"image/gif",
-	"image",
-	"image/jpeg",
-	"image/png",
-	"index/suffixarray",
-	"io",
-	"io/ioutil",
-	"log",
-	"log/syslog",
-	"math/big",
-	"math/cmplx",
-	"math",
-	"math/rand",
-	"mime",
-	"mime/multipart",
-	"net",
-	"net/http/cgi",
-	"net/http/cookiejar",
-	"net/http/fcgi",
-	"net/http",
-	"net/http/httptest",
-	"net/http/httputil",
-	"net/http/pprof",
-	"net/mail",
-	"net/rpc",
-	"net/rpc/jsonrpc",
-	"net/smtp",
-	"net/textproto",
-	"net/url",
-	"old/regexp",
-	"old/template",
-	"os/exec",
-	"os",
-	"os/signal",
-	"os/user",
-	"path/filepath",
-	"path",
-	"reflect",
-	"regexp",
-	"regexp/syntax",
-	"runtime/debug",
-	"runtime",
-	"runtime/pprof",
-	"sort",
-	"strconv",
-	"strings",
-	"sync/atomic",
-	"sync",
-	"syscall",
-	"testing",
-	"testing/iotest",
-	"testing/quick",
-	"text/scanner",
-	"text/tabwriter",
-	"text/template",
-	"text/template/parse",
-	"time",
-	"unicode",
-	"unicode/utf16",
-	"unicode/utf8",
-}
-
-func TestInstallationImporter(t *testing.T) {
-	// This test relies on gccgo being around, which it most likely will be if we
-	// were compiled with gccgo.
-	if runtime.Compiler != "gccgo" {
-		t.Skip("This test needs gccgo")
-		return
-	}
-
-	var inst GccgoInstallation
-	err := inst.InitFromDriver("gccgo")
-	if err != nil {
-		t.Fatal(err)
-	}
-	imp := inst.GetImporter(nil, nil)
-
-	// Ensure we don't regress the number of packages we can parse. First import
-	// all packages into the same map and then each individually.
-	pkgMap := make(map[string]*types.Package)
-	for _, pkg := range importablePackages {
-		_, err = imp(pkgMap, pkg)
-		if err != nil {
-			t.Error(err)
-		}
-	}
-
-	for _, pkg := range importablePackages {
-		_, err = imp(make(map[string]*types.Package), pkg)
-		if err != nil {
-			t.Error(err)
-		}
-	}
-
-	// Test for certain specific entities in the imported data.
-	for _, test := range [...]importerTest{
-		{pkgpath: "io", name: "Reader", want: "type Reader interface{Read(p []uint8) (n int, err error)}"},
-		{pkgpath: "io", name: "ReadWriter", want: "type ReadWriter interface{Reader; Writer}"},
-		{pkgpath: "math", name: "Pi", want: "const Pi untyped float"},
-		{pkgpath: "math", name: "Sin", want: "func Sin(x float64) float64"},
-		{pkgpath: "sort", name: "Ints", want: "func Ints(a []int)"},
-		{pkgpath: "unsafe", name: "Pointer", want: "type Pointer unsafe.Pointer"},
-	} {
-		runImporterTest(t, imp, nil, &test)
-	}
-}
diff --git a/third_party/gotools/go/gccgoimporter/importer.go b/third_party/gotools/go/gccgoimporter/importer.go
deleted file mode 100644
index cb28496..0000000
--- a/third_party/gotools/go/gccgoimporter/importer.go
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package gccgoimporter implements Import for gccgo-generated object files.
-package gccgoimporter // import "llvm.org/llgo/third_party/gotools/go/gccgoimporter"
-
-import (
-	"bytes"
-	"debug/elf"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-
-	"llvm.org/llgo/third_party/gotools/go/importer"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// A PackageInit describes an imported package that needs initialization.
-type PackageInit struct {
-	Name     string // short package name
-	InitFunc string // name of init function
-	Priority int    // priority of init function, see InitData.Priority
-}
-
-// The gccgo-specific init data for a package.
-type InitData struct {
-	// Initialization priority of this package relative to other packages.
-	// This is based on the maximum depth of the package's dependency graph;
-	// it is guaranteed to be greater than that of its dependencies.
-	Priority int
-
-	// The list of packages which this package depends on to be initialized,
-	// including itself if needed. This is the subset of the transitive closure of
-	// the package's dependencies that need initialization.
-	Inits []PackageInit
-}
-
-// Locate the file from which to read export data.
-// This is intended to replicate the logic in gofrontend.
-func findExportFile(searchpaths []string, pkgpath string) (string, error) {
-	for _, spath := range searchpaths {
-		pkgfullpath := filepath.Join(spath, pkgpath)
-		pkgdir, name := filepath.Split(pkgfullpath)
-
-		for _, filepath := range [...]string{
-			pkgfullpath,
-			pkgfullpath + ".gox",
-			pkgdir + "lib" + name + ".so",
-			pkgdir + "lib" + name + ".a",
-			pkgfullpath + ".o",
-		} {
-			fi, err := os.Stat(filepath)
-			if err == nil && !fi.IsDir() {
-				return filepath, nil
-			}
-		}
-	}
-
-	return "", fmt.Errorf("%s: could not find export data (tried %s)", pkgpath, strings.Join(searchpaths, ":"))
-}
-
-const (
-	gccgov1Magic    = "v1;\n"
-	goimporterMagic = "\n$$ "
-	archiveMagic    = "!<ar"
-)
-
-// Opens the export data file at the given path. If this is an ELF file,
-// searches for and opens the .go_export section. If this is an archive,
-// reads the export data from the first member, which is assumed to be an ELF file.
-// This is intended to replicate the logic in gofrontend.
-func openExportFile(fpath string) (reader io.ReadSeeker, closer io.Closer, err error) {
-	f, err := os.Open(fpath)
-	if err != nil {
-		return
-	}
-	closer = f
-	defer func() {
-		if err != nil && closer != nil {
-			f.Close()
-		}
-	}()
-
-	var magic [4]byte
-	_, err = f.ReadAt(magic[:], 0)
-	if err != nil {
-		return
-	}
-
-	var elfreader io.ReaderAt
-	switch string(magic[:]) {
-	case gccgov1Magic, goimporterMagic:
-		// Raw export data.
-		reader = f
-		return
-
-	case archiveMagic:
-		// TODO(pcc): Read the archive directly instead of using "ar".
-		f.Close()
-		closer = nil
-
-		cmd := exec.Command("ar", "p", fpath)
-		var out []byte
-		out, err = cmd.Output()
-		if err != nil {
-			return
-		}
-
-		elfreader = bytes.NewReader(out)
-
-	default:
-		elfreader = f
-	}
-
-	ef, err := elf.NewFile(elfreader)
-	if err != nil {
-		return
-	}
-
-	sec := ef.Section(".go_export")
-	if sec == nil {
-		err = fmt.Errorf("%s: .go_export section not found", fpath)
-		return
-	}
-
-	reader = sec.Open()
-	return
-}
-
-func GetImporter(searchpaths []string, initmap map[*types.Package]InitData) types.Importer {
-	return func(imports map[string]*types.Package, pkgpath string) (pkg *types.Package, err error) {
-		if pkgpath == "unsafe" {
-			return types.Unsafe, nil
-		}
-
-		fpath, err := findExportFile(searchpaths, pkgpath)
-		if err != nil {
-			return
-		}
-
-		reader, closer, err := openExportFile(fpath)
-		if err != nil {
-			return
-		}
-		if closer != nil {
-			defer closer.Close()
-		}
-
-		var magic [4]byte
-		_, err = reader.Read(magic[:])
-		if err != nil {
-			return
-		}
-		_, err = reader.Seek(0, 0)
-		if err != nil {
-			return
-		}
-
-		switch string(magic[:]) {
-		case gccgov1Magic:
-			var p parser
-			p.init(fpath, reader, imports)
-			pkg = p.parsePackage()
-			if initmap != nil {
-				initmap[pkg] = p.initdata
-			}
-
-		case goimporterMagic:
-			var data []byte
-			data, err = ioutil.ReadAll(reader)
-			if err != nil {
-				return
-			}
-			var n int
-			n, pkg, err = importer.ImportData(imports, data)
-			if err != nil {
-				return
-			}
-
-			if initmap != nil {
-				suffixreader := bytes.NewReader(data[n:])
-				var p parser
-				p.init(fpath, suffixreader, nil)
-				p.parseInitData()
-				initmap[pkg] = p.initdata
-			}
-
-		default:
-			err = fmt.Errorf("unrecognized magic string: %q", string(magic[:]))
-		}
-
-		return
-	}
-}
diff --git a/third_party/gotools/go/gccgoimporter/importer_test.go b/third_party/gotools/go/gccgoimporter/importer_test.go
deleted file mode 100644
index 90a7cc1..0000000
--- a/third_party/gotools/go/gccgoimporter/importer_test.go
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-import (
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-type importerTest struct {
-	pkgpath, name, want, wantval string
-	wantinits                    []string
-}
-
-func runImporterTest(t *testing.T, imp types.Importer, initmap map[*types.Package]InitData, test *importerTest) {
-	pkg, err := imp(make(map[string]*types.Package), test.pkgpath)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	if test.name != "" {
-		obj := pkg.Scope().Lookup(test.name)
-		if obj == nil {
-			t.Errorf("%s: object not found", test.name)
-			return
-		}
-
-		got := types.ObjectString(pkg, obj)
-		if got != test.want {
-			t.Errorf("%s: got %q; want %q", test.name, got, test.want)
-		}
-
-		if test.wantval != "" {
-			gotval := obj.(*types.Const).Val().String()
-			if gotval != test.wantval {
-				t.Errorf("%s: got val %q; want val %q", test.name, gotval, test.wantval)
-			}
-		}
-	}
-
-	if len(test.wantinits) > 0 {
-		initdata := initmap[pkg]
-		found := false
-		// Check that the package's own init function has the package's priority
-		for _, pkginit := range initdata.Inits {
-			if pkginit.InitFunc == test.wantinits[0] {
-				if initdata.Priority != pkginit.Priority {
-					t.Errorf("%s: got self priority %d; want %d", test.pkgpath, pkginit.Priority, initdata.Priority)
-				}
-				found = true
-				break
-			}
-		}
-
-		if !found {
-			t.Errorf("%s: could not find expected function %q", test.pkgpath, test.wantinits[0])
-		}
-
-		// Each init function in the list other than the first one is a
-		// dependency of the function immediately before it. Check that
-		// the init functions appear in descending priority order.
-		priority := initdata.Priority
-		for _, wantdepinit := range test.wantinits[1:] {
-			found = false
-			for _, pkginit := range initdata.Inits {
-				if pkginit.InitFunc == wantdepinit {
-					if priority <= pkginit.Priority {
-						t.Errorf("%s: got dep priority %d; want less than %d", test.pkgpath, pkginit.Priority, priority)
-					}
-					found = true
-					priority = pkginit.Priority
-					break
-				}
-			}
-
-			if !found {
-				t.Errorf("%s: could not find expected function %q", test.pkgpath, wantdepinit)
-			}
-		}
-	}
-}
-
-var importerTests = [...]importerTest{
-	{pkgpath: "pointer", name: "Int8Ptr", want: "type Int8Ptr *int8"},
-	{pkgpath: "complexnums", name: "NN", want: "const NN untyped complex", wantval: "(-1/1 + -1/1i)"},
-	{pkgpath: "complexnums", name: "NP", want: "const NP untyped complex", wantval: "(-1/1 + 1/1i)"},
-	{pkgpath: "complexnums", name: "PN", want: "const PN untyped complex", wantval: "(1/1 + -1/1i)"},
-	{pkgpath: "complexnums", name: "PP", want: "const PP untyped complex", wantval: "(1/1 + 1/1i)"},
-	// TODO: enable this entry once bug has been tracked down
-	//{pkgpath: "imports", wantinits: []string{"imports..import", "fmt..import", "math..import"}},
-}
-
-func TestGoxImporter(t *testing.T) {
-	initmap := make(map[*types.Package]InitData)
-	imp := GetImporter([]string{"testdata"}, initmap)
-
-	for _, test := range importerTests {
-		runImporterTest(t, imp, initmap, &test)
-	}
-}
-
-func TestObjImporter(t *testing.T) {
-	// This test relies on gccgo being around, which it most likely will be if we
-	// were compiled with gccgo.
-	if runtime.Compiler != "gccgo" {
-		t.Skip("This test needs gccgo")
-		return
-	}
-
-	tmpdir, err := ioutil.TempDir("", "")
-	if err != nil {
-		t.Fatal(err)
-	}
-	initmap := make(map[*types.Package]InitData)
-	imp := GetImporter([]string{tmpdir}, initmap)
-
-	artmpdir, err := ioutil.TempDir("", "")
-	if err != nil {
-		t.Fatal(err)
-	}
-	arinitmap := make(map[*types.Package]InitData)
-	arimp := GetImporter([]string{artmpdir}, arinitmap)
-
-	for _, test := range importerTests {
-		gofile := filepath.Join("testdata", test.pkgpath+".go")
-		ofile := filepath.Join(tmpdir, test.pkgpath+".o")
-		afile := filepath.Join(artmpdir, "lib"+test.pkgpath+".a")
-
-		cmd := exec.Command("gccgo", "-fgo-pkgpath="+test.pkgpath, "-c", "-o", ofile, gofile)
-		out, err := cmd.CombinedOutput()
-		if err != nil {
-			t.Logf("%s", out)
-			t.Fatalf("gccgo %s failed: %s", gofile, err)
-		}
-
-		runImporterTest(t, imp, initmap, &test)
-
-		cmd = exec.Command("ar", "cr", afile, ofile)
-		out, err = cmd.CombinedOutput()
-		if err != nil {
-			t.Logf("%s", out)
-			t.Fatalf("ar cr %s %s failed: %s", afile, ofile, err)
-		}
-
-		runImporterTest(t, arimp, arinitmap, &test)
-
-		if err = os.Remove(ofile); err != nil {
-			t.Fatal(err)
-		}
-		if err = os.Remove(afile); err != nil {
-			t.Fatal(err)
-		}
-	}
-
-	if err = os.Remove(tmpdir); err != nil {
-		t.Fatal(err)
-	}
-}
diff --git a/third_party/gotools/go/gccgoimporter/parser.go b/third_party/gotools/go/gccgoimporter/parser.go
deleted file mode 100644
index a9dec66..0000000
--- a/third_party/gotools/go/gccgoimporter/parser.go
+++ /dev/null
@@ -1,856 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"go/token"
-	"io"
-	"strconv"
-	"strings"
-	"text/scanner"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-type parser struct {
-	scanner  scanner.Scanner
-	tok      rune                      // current token
-	lit      string                    // literal string; only valid for Ident, Int, String tokens
-	pkgpath  string                    // package path of imported package
-	pkgname  string                    // name of imported package
-	pkg      *types.Package            // reference to imported package
-	imports  map[string]*types.Package // package path -> package object
-	typeMap  map[int]types.Type        // type number -> type
-	initdata InitData                  // package init priority data
-}
-
-func (p *parser) init(filename string, src io.Reader, imports map[string]*types.Package) {
-	p.scanner.Init(src)
-	p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) }
-	p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanFloats | scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments
-	p.scanner.Whitespace = 1<<'\t' | 1<<'\n' | 1<<' '
-	p.scanner.Filename = filename // for good error messages
-	p.next()
-	p.imports = imports
-	p.typeMap = make(map[int]types.Type)
-}
-
-type importError struct {
-	pos scanner.Position
-	err error
-}
-
-func (e importError) Error() string {
-	return fmt.Sprintf("import error %s (byte offset = %d): %s", e.pos, e.pos.Offset, e.err)
-}
-
-func (p *parser) error(err interface{}) {
-	if s, ok := err.(string); ok {
-		err = errors.New(s)
-	}
-	// panic with a runtime.Error if err is not an error
-	panic(importError{p.scanner.Pos(), err.(error)})
-}
-
-func (p *parser) errorf(format string, args ...interface{}) {
-	p.error(fmt.Errorf(format, args...))
-}
-
-func (p *parser) expect(tok rune) string {
-	lit := p.lit
-	if p.tok != tok {
-		p.errorf("expected %s, got %s (%s)", scanner.TokenString(tok), scanner.TokenString(p.tok), lit)
-	}
-	p.next()
-	return lit
-}
-
-func (p *parser) expectKeyword(keyword string) {
-	lit := p.expect(scanner.Ident)
-	if lit != keyword {
-		p.errorf("expected keyword %s, got %q", keyword, lit)
-	}
-}
-
-func (p *parser) parseString() string {
-	str, err := strconv.Unquote(p.expect(scanner.String))
-	if err != nil {
-		p.error(err)
-	}
-	return str
-}
-
-// unquotedString     = { unquotedStringChar } .
-// unquotedStringChar = <neither a whitespace nor a ';' char> .
-func (p *parser) parseUnquotedString() string {
-	if p.tok == scanner.EOF {
-		p.error("unexpected EOF")
-	}
-	var buf bytes.Buffer
-	buf.WriteString(p.scanner.TokenText())
-	// This loop needs to examine each character before deciding whether to consume it. If we see a semicolon,
-	// we need to let it be consumed by p.next().
-	for ch := p.scanner.Peek(); ch != ';' && ch != scanner.EOF && p.scanner.Whitespace&(1<<uint(ch)) == 0; ch = p.scanner.Peek() {
-		buf.WriteRune(ch)
-		p.scanner.Next()
-	}
-	p.next()
-	return buf.String()
-}
-
-func (p *parser) next() {
-	p.tok = p.scanner.Scan()
-	switch p.tok {
-	case scanner.Ident, scanner.Int, scanner.Float, scanner.String, '·':
-		p.lit = p.scanner.TokenText()
-	default:
-		p.lit = ""
-	}
-}
-
-func (p *parser) parseQualifiedName() (path, name string) {
-	return p.parseQualifiedNameStr(p.parseString())
-}
-
-func (p *parser) parseUnquotedQualifiedName() (path, name string) {
-	return p.parseQualifiedNameStr(p.parseUnquotedString())
-}
-
-// qualifiedName = [ ["."] unquotedString "." ] unquotedString .
-//
-// The above production uses greedy matching.
-func (p *parser) parseQualifiedNameStr(unquotedName string) (pkgpath, name string) {
-	parts := strings.Split(unquotedName, ".")
-	if parts[0] == "" {
-		parts = parts[1:]
-	}
-
-	switch len(parts) {
-	case 0:
-		p.errorf("malformed qualified name: %q", unquotedName)
-	case 1:
-		// unqualified name
-		pkgpath = p.pkgpath
-		name = parts[0]
-	default:
-		// qualified name, which may contain periods
-		pkgpath = strings.Join(parts[0:len(parts)-1], ".")
-		name = parts[len(parts)-1]
-	}
-
-	return
-}
-
-// getPkg returns the package for a given path. If the package is
-// not found but we have a package name, create the package and
-// add it to the p.imports map.
-//
-func (p *parser) getPkg(pkgpath, name string) *types.Package {
-	// package unsafe is not in the imports map - handle explicitly
-	if pkgpath == "unsafe" {
-		return types.Unsafe
-	}
-	pkg := p.imports[pkgpath]
-	if pkg == nil && name != "" {
-		pkg = types.NewPackage(pkgpath, name)
-		p.imports[pkgpath] = pkg
-	}
-	return pkg
-}
-
-// parseExportedName is like parseQualifiedName, but
-// the package path is resolved to an imported *types.Package.
-//
-// ExportedName = string [string] .
-func (p *parser) parseExportedName() (pkg *types.Package, name string) {
-	path, name := p.parseQualifiedName()
-	var pkgname string
-	if p.tok == scanner.String {
-		pkgname = p.parseString()
-	}
-	pkg = p.getPkg(path, pkgname)
-	if pkg == nil {
-		p.errorf("package %s (path = %q) not found", name, path)
-	}
-	return
-}
-
-// Name = QualifiedName | "?" .
-func (p *parser) parseName() string {
-	if p.tok == '?' {
-		// Anonymous.
-		p.next()
-		return ""
-	}
-	// The package path is redundant for us. Don't try to parse it.
-	_, name := p.parseUnquotedQualifiedName()
-	return name
-}
-
-func deref(typ types.Type) types.Type {
-	if p, _ := typ.(*types.Pointer); p != nil {
-		typ = p.Elem()
-	}
-	return typ
-}
-
-// Field = Name Type [string] .
-func (p *parser) parseField(pkg *types.Package) (field *types.Var, tag string) {
-	name := p.parseName()
-	typ := p.parseType(pkg)
-	anon := false
-	if name == "" {
-		anon = true
-		switch typ := deref(typ).(type) {
-		case *types.Basic:
-			name = typ.Name()
-		case *types.Named:
-			name = typ.Obj().Name()
-		default:
-			p.error("anonymous field expected")
-		}
-	}
-	field = types.NewField(token.NoPos, pkg, name, typ, anon)
-	if p.tok == scanner.String {
-		tag = p.parseString()
-	}
-	return
-}
-
-// Param = Name ["..."] Type .
-func (p *parser) parseParam(pkg *types.Package) (param *types.Var, isVariadic bool) {
-	name := p.parseName()
-	if p.tok == '.' {
-		p.next()
-		p.expect('.')
-		p.expect('.')
-		isVariadic = true
-	}
-	typ := p.parseType(pkg)
-	if isVariadic {
-		typ = types.NewSlice(typ)
-	}
-	param = types.NewParam(token.NoPos, pkg, name, typ)
-	return
-}
-
-// Var = Name Type .
-func (p *parser) parseVar(pkg *types.Package) *types.Var {
-	name := p.parseName()
-	return types.NewVar(token.NoPos, pkg, name, p.parseType(pkg))
-}
-
-// ConstValue     = string | "false" | "true" | ["-"] (int ["'"] | FloatOrComplex) .
-// FloatOrComplex = float ["i" | ("+"|"-") float "i"] .
-func (p *parser) parseConstValue() (val exact.Value, typ types.Type) {
-	switch p.tok {
-	case scanner.String:
-		str := p.parseString()
-		val = exact.MakeString(str)
-		typ = types.Typ[types.UntypedString]
-		return
-
-	case scanner.Ident:
-		b := false
-		switch p.lit {
-		case "false":
-		case "true":
-			b = true
-
-		default:
-			p.errorf("expected const value, got %s (%q)", scanner.TokenString(p.tok), p.lit)
-		}
-
-		p.next()
-		val = exact.MakeBool(b)
-		typ = types.Typ[types.UntypedBool]
-		return
-	}
-
-	sign := ""
-	if p.tok == '-' {
-		p.next()
-		sign = "-"
-	}
-
-	switch p.tok {
-	case scanner.Int:
-		val = exact.MakeFromLiteral(sign+p.lit, token.INT)
-		if val == nil {
-			p.error("could not parse integer literal")
-		}
-
-		p.next()
-		if p.tok == '\'' {
-			p.next()
-			typ = types.Typ[types.UntypedRune]
-		} else {
-			typ = types.Typ[types.UntypedInt]
-		}
-
-	case scanner.Float:
-		re := sign + p.lit
-		p.next()
-
-		var im string
-		switch p.tok {
-		case '+':
-			p.next()
-			im = p.expect(scanner.Float)
-
-		case '-':
-			p.next()
-			im = "-" + p.expect(scanner.Float)
-
-		case scanner.Ident:
-			// re is in fact the imaginary component. Expect "i" below.
-			im = re
-			re = "0"
-
-		default:
-			val = exact.MakeFromLiteral(re, token.FLOAT)
-			if val == nil {
-				p.error("could not parse float literal")
-			}
-			typ = types.Typ[types.UntypedFloat]
-			return
-		}
-
-		p.expectKeyword("i")
-		reval := exact.MakeFromLiteral(re, token.FLOAT)
-		if reval == nil {
-			p.error("could not parse real component of complex literal")
-		}
-		imval := exact.MakeFromLiteral(im+"i", token.IMAG)
-		if imval == nil {
-			p.error("could not parse imag component of complex literal")
-		}
-		val = exact.BinaryOp(reval, token.ADD, imval)
-		typ = types.Typ[types.UntypedComplex]
-
-	default:
-		p.errorf("expected const value, got %s (%q)", scanner.TokenString(p.tok), p.lit)
-	}
-
-	return
-}
-
-// Const = Name [Type] "=" ConstValue .
-func (p *parser) parseConst(pkg *types.Package) *types.Const {
-	name := p.parseName()
-	var typ types.Type
-	if p.tok == '<' {
-		typ = p.parseType(pkg)
-	}
-	p.expect('=')
-	val, vtyp := p.parseConstValue()
-	if typ == nil {
-		typ = vtyp
-	}
-	return types.NewConst(token.NoPos, pkg, name, typ, val)
-}
-
-// TypeName = ExportedName .
-func (p *parser) parseTypeName() *types.TypeName {
-	pkg, name := p.parseExportedName()
-	scope := pkg.Scope()
-	if obj := scope.Lookup(name); obj != nil {
-		return obj.(*types.TypeName)
-	}
-	obj := types.NewTypeName(token.NoPos, pkg, name, nil)
-	// a named type may be referred to before the underlying type
-	// is known - set it up
-	types.NewNamed(obj, nil, nil)
-	scope.Insert(obj)
-	return obj
-}
-
-// NamedType = TypeName Type { Method } .
-// Method    = "func" "(" Param ")" Name ParamList ResultList ";" .
-func (p *parser) parseNamedType(n int) types.Type {
-	obj := p.parseTypeName()
-
-	pkg := obj.Pkg()
-	typ := obj.Type()
-	p.typeMap[n] = typ
-
-	nt, ok := typ.(*types.Named)
-	if !ok {
-		// This can happen for unsafe.Pointer, which is a TypeName holding a Basic type.
-		pt := p.parseType(pkg)
-		if pt != typ {
-			p.error("unexpected underlying type for non-named TypeName")
-		}
-		return typ
-	}
-
-	underlying := p.parseType(pkg)
-	if nt.Underlying() == nil {
-		nt.SetUnderlying(underlying.Underlying())
-	}
-
-	for p.tok == scanner.Ident {
-		// collect associated methods
-		p.expectKeyword("func")
-		p.expect('(')
-		receiver, _ := p.parseParam(pkg)
-		p.expect(')')
-		name := p.parseName()
-		params, isVariadic := p.parseParamList(pkg)
-		results := p.parseResultList(pkg)
-		p.expect(';')
-
-		sig := types.NewSignature(pkg.Scope(), receiver, params, results, isVariadic)
-		nt.AddMethod(types.NewFunc(token.NoPos, pkg, name, sig))
-	}
-
-	return nt
-}
-
-func (p *parser) parseInt() int64 {
-	lit := p.expect(scanner.Int)
-	n, err := strconv.ParseInt(lit, 10, 0)
-	if err != nil {
-		p.error(err)
-	}
-	return n
-}
-
-// ArrayOrSliceType = "[" [ int ] "]" Type .
-func (p *parser) parseArrayOrSliceType(pkg *types.Package) types.Type {
-	p.expect('[')
-	if p.tok == ']' {
-		p.next()
-		return types.NewSlice(p.parseType(pkg))
-	}
-
-	n := p.parseInt()
-	p.expect(']')
-	return types.NewArray(p.parseType(pkg), n)
-}
-
-// MapType = "map" "[" Type "]" Type .
-func (p *parser) parseMapType(pkg *types.Package) types.Type {
-	p.expectKeyword("map")
-	p.expect('[')
-	key := p.parseType(pkg)
-	p.expect(']')
-	elem := p.parseType(pkg)
-	return types.NewMap(key, elem)
-}
-
-// ChanType = "chan" ["<-" | "-<"] Type .
-func (p *parser) parseChanType(pkg *types.Package) types.Type {
-	p.expectKeyword("chan")
-	dir := types.SendRecv
-	switch p.tok {
-	case '-':
-		p.next()
-		p.expect('<')
-		dir = types.SendOnly
-
-	case '<':
-		// don't consume '<' if it belongs to Type
-		if p.scanner.Peek() == '-' {
-			p.next()
-			p.expect('-')
-			dir = types.RecvOnly
-		}
-	}
-
-	return types.NewChan(dir, p.parseType(pkg))
-}
-
-// StructType = "struct" "{" { Field } "}" .
-func (p *parser) parseStructType(pkg *types.Package) types.Type {
-	p.expectKeyword("struct")
-
-	var fields []*types.Var
-	var tags []string
-
-	p.expect('{')
-	for p.tok != '}' && p.tok != scanner.EOF {
-		field, tag := p.parseField(pkg)
-		p.expect(';')
-		fields = append(fields, field)
-		tags = append(tags, tag)
-	}
-	p.expect('}')
-
-	return types.NewStruct(fields, tags)
-}
-
-// ParamList = "(" [ { Parameter "," } Parameter ] ")" .
-func (p *parser) parseParamList(pkg *types.Package) (*types.Tuple, bool) {
-	var list []*types.Var
-	isVariadic := false
-
-	p.expect('(')
-	for p.tok != ')' && p.tok != scanner.EOF {
-		if len(list) > 0 {
-			p.expect(',')
-		}
-		par, variadic := p.parseParam(pkg)
-		list = append(list, par)
-		if variadic {
-			if isVariadic {
-				p.error("... not on final argument")
-			}
-			isVariadic = true
-		}
-	}
-	p.expect(')')
-
-	return types.NewTuple(list...), isVariadic
-}
-
-// ResultList = Type | ParamList .
-func (p *parser) parseResultList(pkg *types.Package) *types.Tuple {
-	switch p.tok {
-	case '<':
-		return types.NewTuple(types.NewParam(token.NoPos, pkg, "", p.parseType(pkg)))
-
-	case '(':
-		params, _ := p.parseParamList(pkg)
-		return params
-
-	default:
-		return nil
-	}
-}
-
-// FunctionType = ParamList ResultList .
-func (p *parser) parseFunctionType(pkg *types.Package) *types.Signature {
-	params, isVariadic := p.parseParamList(pkg)
-	results := p.parseResultList(pkg)
-	return types.NewSignature(pkg.Scope(), nil, params, results, isVariadic)
-}
-
-// Func = Name FunctionType .
-func (p *parser) parseFunc(pkg *types.Package) *types.Func {
-	name := p.parseName()
-	if strings.ContainsRune(name, '$') {
-		// This is a Type$equal or Type$hash function, which we don't want to parse,
-		// except for the types.
-		p.discardDirectiveWhileParsingTypes(pkg)
-		return nil
-	}
-	return types.NewFunc(token.NoPos, pkg, name, p.parseFunctionType(pkg))
-}
-
-// InterfaceType = "interface" "{" { ("?" Type | Func) ";" } "}" .
-func (p *parser) parseInterfaceType(pkg *types.Package) types.Type {
-	p.expectKeyword("interface")
-
-	var methods []*types.Func
-	var typs []*types.Named
-
-	p.expect('{')
-	for p.tok != '}' && p.tok != scanner.EOF {
-		if p.tok == '?' {
-			p.next()
-			typs = append(typs, p.parseType(pkg).(*types.Named))
-		} else {
-			method := p.parseFunc(pkg)
-			methods = append(methods, method)
-		}
-		p.expect(';')
-	}
-	p.expect('}')
-
-	return types.NewInterface(methods, typs)
-}
-
-// PointerType = "*" ("any" | Type) .
-func (p *parser) parsePointerType(pkg *types.Package) types.Type {
-	p.expect('*')
-	if p.tok == scanner.Ident {
-		p.expectKeyword("any")
-		return types.Typ[types.UnsafePointer]
-	}
-	return types.NewPointer(p.parseType(pkg))
-}
-
-// TypeDefinition = NamedType | MapType | ChanType | StructType | InterfaceType | PointerType | ArrayOrSliceType | FunctionType .
-func (p *parser) parseTypeDefinition(pkg *types.Package, n int) types.Type {
-	var t types.Type
-	switch p.tok {
-	case scanner.String:
-		t = p.parseNamedType(n)
-
-	case scanner.Ident:
-		switch p.lit {
-		case "map":
-			t = p.parseMapType(pkg)
-
-		case "chan":
-			t = p.parseChanType(pkg)
-
-		case "struct":
-			t = p.parseStructType(pkg)
-
-		case "interface":
-			t = p.parseInterfaceType(pkg)
-		}
-
-	case '*':
-		t = p.parsePointerType(pkg)
-
-	case '[':
-		t = p.parseArrayOrSliceType(pkg)
-
-	case '(':
-		t = p.parseFunctionType(pkg)
-	}
-
-	p.typeMap[n] = t
-	return t
-}
-
-const (
-	// From gofrontend/go/export.h
-	// Note that these values are negative in the gofrontend and have been made positive
-	// in the gccgoimporter.
-	gccgoBuiltinINT8       = 1
-	gccgoBuiltinINT16      = 2
-	gccgoBuiltinINT32      = 3
-	gccgoBuiltinINT64      = 4
-	gccgoBuiltinUINT8      = 5
-	gccgoBuiltinUINT16     = 6
-	gccgoBuiltinUINT32     = 7
-	gccgoBuiltinUINT64     = 8
-	gccgoBuiltinFLOAT32    = 9
-	gccgoBuiltinFLOAT64    = 10
-	gccgoBuiltinINT        = 11
-	gccgoBuiltinUINT       = 12
-	gccgoBuiltinUINTPTR    = 13
-	gccgoBuiltinBOOL       = 15
-	gccgoBuiltinSTRING     = 16
-	gccgoBuiltinCOMPLEX64  = 17
-	gccgoBuiltinCOMPLEX128 = 18
-	gccgoBuiltinERROR      = 19
-	gccgoBuiltinBYTE       = 20
-	gccgoBuiltinRUNE       = 21
-)
-
-func lookupBuiltinType(typ int) types.Type {
-	return [...]types.Type{
-		gccgoBuiltinINT8:       types.Typ[types.Int8],
-		gccgoBuiltinINT16:      types.Typ[types.Int16],
-		gccgoBuiltinINT32:      types.Typ[types.Int32],
-		gccgoBuiltinINT64:      types.Typ[types.Int64],
-		gccgoBuiltinUINT8:      types.Typ[types.Uint8],
-		gccgoBuiltinUINT16:     types.Typ[types.Uint16],
-		gccgoBuiltinUINT32:     types.Typ[types.Uint32],
-		gccgoBuiltinUINT64:     types.Typ[types.Uint64],
-		gccgoBuiltinFLOAT32:    types.Typ[types.Float32],
-		gccgoBuiltinFLOAT64:    types.Typ[types.Float64],
-		gccgoBuiltinINT:        types.Typ[types.Int],
-		gccgoBuiltinUINT:       types.Typ[types.Uint],
-		gccgoBuiltinUINTPTR:    types.Typ[types.Uintptr],
-		gccgoBuiltinBOOL:       types.Typ[types.Bool],
-		gccgoBuiltinSTRING:     types.Typ[types.String],
-		gccgoBuiltinCOMPLEX64:  types.Typ[types.Complex64],
-		gccgoBuiltinCOMPLEX128: types.Typ[types.Complex128],
-		gccgoBuiltinERROR:      types.Universe.Lookup("error").Type(),
-		gccgoBuiltinBYTE:       types.Typ[types.Byte],
-		gccgoBuiltinRUNE:       types.Typ[types.Rune],
-	}[typ]
-}
-
-// Type = "<" "type" ( "-" int | int [ TypeDefinition ] ) ">" .
-func (p *parser) parseType(pkg *types.Package) (t types.Type) {
-	p.expect('<')
-	p.expectKeyword("type")
-
-	switch p.tok {
-	case scanner.Int:
-		n := p.parseInt()
-
-		if p.tok == '>' {
-			t = p.typeMap[int(n)]
-		} else {
-			t = p.parseTypeDefinition(pkg, int(n))
-		}
-
-	case '-':
-		p.next()
-		n := p.parseInt()
-		t = lookupBuiltinType(int(n))
-
-	default:
-		p.errorf("expected type number, got %s (%q)", scanner.TokenString(p.tok), p.lit)
-		return nil
-	}
-
-	p.expect('>')
-	return
-}
-
-// PackageInit = unquotedString unquotedString int .
-func (p *parser) parsePackageInit() PackageInit {
-	name := p.parseUnquotedString()
-	initfunc := p.parseUnquotedString()
-	priority := int(p.parseInt())
-	return PackageInit{Name: name, InitFunc: initfunc, Priority: priority}
-}
-
-// Throw away tokens until we see a ';'. If we see a '<', attempt to parse as a type.
-func (p *parser) discardDirectiveWhileParsingTypes(pkg *types.Package) {
-	for {
-		switch p.tok {
-		case ';':
-			return
-		case '<':
-			p.parseType(p.pkg)
-		case scanner.EOF:
-			p.error("unexpected EOF")
-		default:
-			p.next()
-		}
-	}
-}
-
-// Create the package if we have parsed both the package path and package name.
-func (p *parser) maybeCreatePackage() {
-	if p.pkgname != "" && p.pkgpath != "" {
-		p.pkg = p.getPkg(p.pkgpath, p.pkgname)
-	}
-}
-
-// InitDataDirective = "v1" ";" |
-//                     "priority" int ";" |
-//                     "init" { PackageInit } ";" |
-//                     "checksum" unquotedString ";" .
-func (p *parser) parseInitDataDirective() {
-	if p.tok != scanner.Ident {
-		// unexpected token kind; panic
-		p.expect(scanner.Ident)
-	}
-
-	switch p.lit {
-	case "v1":
-		p.next()
-		p.expect(';')
-
-	case "priority":
-		p.next()
-		p.initdata.Priority = int(p.parseInt())
-		p.expect(';')
-
-	case "init":
-		p.next()
-		for p.tok != ';' && p.tok != scanner.EOF {
-			p.initdata.Inits = append(p.initdata.Inits, p.parsePackageInit())
-		}
-		p.expect(';')
-
-	case "checksum":
-		// Don't let the scanner try to parse the checksum as a number.
-		defer func(mode uint) {
-			p.scanner.Mode = mode
-		}(p.scanner.Mode)
-		p.scanner.Mode &^= scanner.ScanInts | scanner.ScanFloats
-		p.next()
-		p.parseUnquotedString()
-		p.expect(';')
-
-	default:
-		p.errorf("unexpected identifier: %q", p.lit)
-	}
-}
-
-// Directive = InitDataDirective |
-//             "package" unquotedString ";" |
-//             "pkgpath" unquotedString ";" |
-//             "import" unquotedString unquotedString string ";" |
-//             "func" Func ";" |
-//             "type" Type ";" |
-//             "var" Var ";" |
-//             "const" Const ";" .
-func (p *parser) parseDirective() {
-	if p.tok != scanner.Ident {
-		// unexpected token kind; panic
-		p.expect(scanner.Ident)
-	}
-
-	switch p.lit {
-	case "v1", "priority", "init", "checksum":
-		p.parseInitDataDirective()
-
-	case "package":
-		p.next()
-		p.pkgname = p.parseUnquotedString()
-		p.maybeCreatePackage()
-		p.expect(';')
-
-	case "pkgpath":
-		p.next()
-		p.pkgpath = p.parseUnquotedString()
-		p.maybeCreatePackage()
-		p.expect(';')
-
-	case "import":
-		p.next()
-		pkgname := p.parseUnquotedString()
-		pkgpath := p.parseUnquotedString()
-		p.getPkg(pkgpath, pkgname)
-		p.parseString()
-		p.expect(';')
-
-	case "func":
-		p.next()
-		fun := p.parseFunc(p.pkg)
-		if fun != nil {
-			p.pkg.Scope().Insert(fun)
-		}
-		p.expect(';')
-
-	case "type":
-		p.next()
-		p.parseType(p.pkg)
-		p.expect(';')
-
-	case "var":
-		p.next()
-		v := p.parseVar(p.pkg)
-		p.pkg.Scope().Insert(v)
-		p.expect(';')
-
-	case "const":
-		p.next()
-		c := p.parseConst(p.pkg)
-		p.pkg.Scope().Insert(c)
-		p.expect(';')
-
-	default:
-		p.errorf("unexpected identifier: %q", p.lit)
-	}
-}
-
-// Package = { Directive } .
-func (p *parser) parsePackage() *types.Package {
-	for p.tok != scanner.EOF {
-		p.parseDirective()
-	}
-	for _, typ := range p.typeMap {
-		if it, ok := typ.(*types.Interface); ok {
-			it.Complete()
-		}
-	}
-	p.pkg.MarkComplete()
-	return p.pkg
-}
-
-// InitData = { InitDataDirective } .
-func (p *parser) parseInitData() {
-	for p.tok != scanner.EOF {
-		p.parseInitDataDirective()
-	}
-}
diff --git a/third_party/gotools/go/gccgoimporter/parser_test.go b/third_party/gotools/go/gccgoimporter/parser_test.go
deleted file mode 100644
index 8a37599..0000000
--- a/third_party/gotools/go/gccgoimporter/parser_test.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gccgoimporter
-
-import (
-	"bytes"
-	"strings"
-	"testing"
-	"text/scanner"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var typeParserTests = []struct {
-	id, typ, want, underlying, methods string
-}{
-	{id: "foo", typ: "<type -1>", want: "int8"},
-	{id: "foo", typ: "<type 1 *<type -19>>", want: "*error"},
-	{id: "foo", typ: "<type 1 *any>", want: "unsafe.Pointer"},
-	{id: "foo", typ: "<type 1 \"Bar\" <type 2 *<type 1>>>", want: "foo.Bar", underlying: "*foo.Bar"},
-	{id: "foo", typ: "<type 1 \"bar.Foo\" \"bar\" <type -1> func (? <type 1>) M (); >", want: "bar.Foo", underlying: "int8", methods: "func (bar.Foo).M()"},
-	{id: "foo", typ: "<type 1 \".bar.foo\" \"bar\" <type -1>>", want: "bar.foo", underlying: "int8"},
-	{id: "foo", typ: "<type 1 []<type -1>>", want: "[]int8"},
-	{id: "foo", typ: "<type 1 [42]<type -1>>", want: "[42]int8"},
-	{id: "foo", typ: "<type 1 map [<type -1>] <type -2>>", want: "map[int8]int16"},
-	{id: "foo", typ: "<type 1 chan <type -1>>", want: "chan int8"},
-	{id: "foo", typ: "<type 1 chan <- <type -1>>", want: "<-chan int8"},
-	{id: "foo", typ: "<type 1 chan -< <type -1>>", want: "chan<- int8"},
-	{id: "foo", typ: "<type 1 struct { I8 <type -1>; I16 <type -2> \"i16\"; }>", want: "struct{I8 int8; I16 int16 \"i16\"}"},
-	{id: "foo", typ: "<type 1 interface { Foo (a <type -1>, b <type -2>) <type -1>; Bar (? <type -2>, ? ...<type -1>) (? <type -2>, ? <type -1>); Baz (); }>", want: "interface{Bar(int16, ...int8) (int16, int8); Baz(); Foo(a int8, b int16) int8}"},
-	{id: "foo", typ: "<type 1 (? <type -1>) <type -2>>", want: "func(int8) int16"},
-}
-
-func TestTypeParser(t *testing.T) {
-	for _, test := range typeParserTests {
-		var p parser
-		p.init("test.gox", strings.NewReader(test.typ), make(map[string]*types.Package))
-		p.pkgname = test.id
-		p.pkgpath = test.id
-		p.maybeCreatePackage()
-		typ := p.parseType(p.pkg)
-
-		if p.tok != scanner.EOF {
-			t.Errorf("expected full parse, stopped at %q", p.lit)
-		}
-
-		got := typ.String()
-		if got != test.want {
-			t.Errorf("got type %q, expected %q", got, test.want)
-		}
-
-		if test.underlying != "" {
-			underlying := typ.Underlying().String()
-			if underlying != test.underlying {
-				t.Errorf("got underlying type %q, expected %q", underlying, test.underlying)
-			}
-		}
-
-		if test.methods != "" {
-			nt := typ.(*types.Named)
-			var buf bytes.Buffer
-			for i := 0; i != nt.NumMethods(); i++ {
-				buf.WriteString(nt.Method(i).String())
-			}
-			methods := buf.String()
-			if methods != test.methods {
-				t.Errorf("got methods %q, expected %q", methods, test.methods)
-			}
-		}
-	}
-}
diff --git a/third_party/gotools/go/gccgoimporter/testdata/complexnums.go b/third_party/gotools/go/gccgoimporter/testdata/complexnums.go
deleted file mode 100644
index a51b6b0..0000000
--- a/third_party/gotools/go/gccgoimporter/testdata/complexnums.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package complexnums
-
-const NN = -1 - 1i
-const NP = -1 + 1i
-const PN = 1 - 1i
-const PP = 1 + 1i
diff --git a/third_party/gotools/go/gccgoimporter/testdata/complexnums.gox b/third_party/gotools/go/gccgoimporter/testdata/complexnums.gox
deleted file mode 100644
index b66524f..0000000
--- a/third_party/gotools/go/gccgoimporter/testdata/complexnums.gox
+++ /dev/null
@@ -1,8 +0,0 @@
-v1;
-package complexnums;
-pkgpath complexnums;
-priority 1;
-const NN = -0.1E1-0.1E1i ;
-const NP = -0.1E1+0.1E1i ;
-const PN = 0.1E1-0.1E1i ;
-const PP = 0.1E1+0.1E1i ;
diff --git a/third_party/gotools/go/gccgoimporter/testdata/imports.go b/third_party/gotools/go/gccgoimporter/testdata/imports.go
deleted file mode 100644
index 7907316..0000000
--- a/third_party/gotools/go/gccgoimporter/testdata/imports.go
+++ /dev/null
@@ -1,5 +0,0 @@
-package imports
-
-import "fmt"
-
-var Hello = fmt.Sprintf("Hello, world")
diff --git a/third_party/gotools/go/gccgoimporter/testdata/imports.gox b/third_party/gotools/go/gccgoimporter/testdata/imports.gox
deleted file mode 100644
index 958a4f5..0000000
--- a/third_party/gotools/go/gccgoimporter/testdata/imports.gox
+++ /dev/null
@@ -1,7 +0,0 @@
-v1;
-package imports;
-pkgpath imports;
-priority 7;
-import fmt fmt "fmt";
-init imports imports..import 7 math math..import 1 runtime runtime..import 1 strconv strconv..import 2 io io..import 3 reflect reflect..import 3 syscall syscall..import 3 time time..import 4 os os..import 5 fmt fmt..import 6;
-var Hello <type -16>;
diff --git a/third_party/gotools/go/gccgoimporter/testdata/pointer.go b/third_party/gotools/go/gccgoimporter/testdata/pointer.go
deleted file mode 100644
index 4ebc671..0000000
--- a/third_party/gotools/go/gccgoimporter/testdata/pointer.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package pointer
-
-type Int8Ptr *int8
diff --git a/third_party/gotools/go/gccgoimporter/testdata/pointer.gox b/third_party/gotools/go/gccgoimporter/testdata/pointer.gox
deleted file mode 100644
index d96ebbd..0000000
--- a/third_party/gotools/go/gccgoimporter/testdata/pointer.gox
+++ /dev/null
@@ -1,4 +0,0 @@
-v1;
-package pointer;
-pkgpath pointer;
-type <type 1 "Int8Ptr" <type 2 *<type -1>>>;
diff --git a/third_party/gotools/go/gcimporter/exportdata.go b/third_party/gotools/go/gcimporter/exportdata.go
deleted file mode 100644
index 657742b..0000000
--- a/third_party/gotools/go/gcimporter/exportdata.go
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements FindExportData.
-
-package gcimporter
-
-import (
-	"bufio"
-	"errors"
-	"fmt"
-	"io"
-	"strconv"
-	"strings"
-)
-
-func readGopackHeader(r *bufio.Reader) (name string, size int, err error) {
-	// See $GOROOT/include/ar.h.
-	hdr := make([]byte, 16+12+6+6+8+10+2)
-	_, err = io.ReadFull(r, hdr)
-	if err != nil {
-		return
-	}
-	// leave for debugging
-	if false {
-		fmt.Printf("header: %s", hdr)
-	}
-	s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10]))
-	size, err = strconv.Atoi(s)
-	if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' {
-		err = errors.New("invalid archive header")
-		return
-	}
-	name = strings.TrimSpace(string(hdr[:16]))
-	return
-}
-
-// FindExportData positions the reader r at the beginning of the
-// export data section of an underlying GC-created object/archive
-// file by reading from it. The reader must be positioned at the
-// start of the file before calling this function.
-//
-func FindExportData(r *bufio.Reader) (err error) {
-	// Read first line to make sure this is an object file.
-	line, err := r.ReadSlice('\n')
-	if err != nil {
-		return
-	}
-	if string(line) == "!<arch>\n" {
-		// Archive file. Scan to __.PKGDEF.
-		var name string
-		var size int
-		if name, size, err = readGopackHeader(r); err != nil {
-			return
-		}
-
-		// Optional leading __.GOSYMDEF or __.SYMDEF.
-		// Read and discard.
-		if name == "__.SYMDEF" || name == "__.GOSYMDEF" {
-			const block = 4096
-			tmp := make([]byte, block)
-			for size > 0 {
-				n := size
-				if n > block {
-					n = block
-				}
-				if _, err = io.ReadFull(r, tmp[:n]); err != nil {
-					return
-				}
-				size -= n
-			}
-
-			if name, size, err = readGopackHeader(r); err != nil {
-				return
-			}
-		}
-
-		// First real entry should be __.PKGDEF.
-		if name != "__.PKGDEF" {
-			err = errors.New("go archive is missing __.PKGDEF")
-			return
-		}
-
-		// Read first line of __.PKGDEF data, so that line
-		// is once again the first line of the input.
-		if line, err = r.ReadSlice('\n'); err != nil {
-			return
-		}
-	}
-
-	// Now at __.PKGDEF in archive or still at beginning of file.
-	// Either way, line should begin with "go object ".
-	if !strings.HasPrefix(string(line), "go object ") {
-		err = errors.New("not a go object file")
-		return
-	}
-
-	// Skip over object header to export data.
-	// Begins after first line with $$.
-	for line[0] != '$' {
-		if line, err = r.ReadSlice('\n'); err != nil {
-			return
-		}
-	}
-
-	return
-}
diff --git a/third_party/gotools/go/gcimporter/gcimporter.go b/third_party/gotools/go/gcimporter/gcimporter.go
deleted file mode 100644
index 92f4c0e..0000000
--- a/third_party/gotools/go/gcimporter/gcimporter.go
+++ /dev/null
@@ -1,961 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package gcimporter implements Import for gc-generated object files.
-// Importing this package installs Import as go/types.DefaultImport.
-package gcimporter // import "llvm.org/llgo/third_party/gotools/go/gcimporter"
-
-import (
-	"bufio"
-	"errors"
-	"fmt"
-	"go/build"
-	"go/token"
-	"io"
-	"os"
-	"path/filepath"
-	"strconv"
-	"strings"
-	"text/scanner"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// debugging/development support
-const debug = false
-
-func init() {
-	types.DefaultImport = Import
-}
-
-var pkgExts = [...]string{".a", ".5", ".6", ".8"}
-
-// FindPkg returns the filename and unique package id for an import
-// path based on package information provided by build.Import (using
-// the build.Default build.Context).
-// If no file was found, an empty filename is returned.
-//
-func FindPkg(path, srcDir string) (filename, id string) {
-	if len(path) == 0 {
-		return
-	}
-
-	id = path
-	var noext string
-	switch {
-	default:
-		// "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x"
-		// Don't require the source files to be present.
-		bp, _ := build.Import(path, srcDir, build.FindOnly|build.AllowBinary)
-		if bp.PkgObj == "" {
-			return
-		}
-		noext = strings.TrimSuffix(bp.PkgObj, ".a")
-
-	case build.IsLocalImport(path):
-		// "./x" -> "/this/directory/x.ext", "/this/directory/x"
-		noext = filepath.Join(srcDir, path)
-		id = noext
-
-	case filepath.IsAbs(path):
-		// for completeness only - go/build.Import
-		// does not support absolute imports
-		// "/x" -> "/x.ext", "/x"
-		noext = path
-	}
-
-	// try extensions
-	for _, ext := range pkgExts {
-		filename = noext + ext
-		if f, err := os.Stat(filename); err == nil && !f.IsDir() {
-			return
-		}
-	}
-
-	filename = "" // not found
-	return
-}
-
-// ImportData imports a package by reading the gc-generated export data,
-// adds the corresponding package object to the imports map indexed by id,
-// and returns the object.
-//
-// The imports map must contains all packages already imported. The data
-// reader position must be the beginning of the export data section. The
-// filename is only used in error messages.
-//
-// If imports[id] contains the completely imported package, that package
-// can be used directly, and there is no need to call this function (but
-// there is also no harm but for extra time used).
-//
-func ImportData(imports map[string]*types.Package, filename, id string, data io.Reader) (pkg *types.Package, err error) {
-	// support for parser error handling
-	defer func() {
-		switch r := recover().(type) {
-		case nil:
-			// nothing to do
-		case importError:
-			err = r
-		default:
-			panic(r) // internal error
-		}
-	}()
-
-	var p parser
-	p.init(filename, id, data, imports)
-	pkg = p.parseExport()
-
-	return
-}
-
-// Import imports a gc-generated package given its import path, adds the
-// corresponding package object to the imports map, and returns the object.
-// Local import paths are interpreted relative to the current working directory.
-// The imports map must contains all packages already imported.
-//
-func Import(imports map[string]*types.Package, path string) (pkg *types.Package, err error) {
-	if path == "unsafe" {
-		return types.Unsafe, nil
-	}
-
-	srcDir := "."
-	if build.IsLocalImport(path) {
-		srcDir, err = os.Getwd()
-		if err != nil {
-			return
-		}
-	}
-
-	filename, id := FindPkg(path, srcDir)
-	if filename == "" {
-		err = fmt.Errorf("can't find import: %s", id)
-		return
-	}
-
-	// no need to re-import if the package was imported completely before
-	if pkg = imports[id]; pkg != nil && pkg.Complete() {
-		return
-	}
-
-	// open file
-	f, err := os.Open(filename)
-	if err != nil {
-		return
-	}
-	defer func() {
-		f.Close()
-		if err != nil {
-			// add file name to error
-			err = fmt.Errorf("reading export data: %s: %v", filename, err)
-		}
-	}()
-
-	buf := bufio.NewReader(f)
-	if err = FindExportData(buf); err != nil {
-		return
-	}
-
-	pkg, err = ImportData(imports, filename, id, buf)
-
-	return
-}
-
-// ----------------------------------------------------------------------------
-// Parser
-
-// TODO(gri) Imported objects don't have position information.
-//           Ideally use the debug table line info; alternatively
-//           create some fake position (or the position of the
-//           import). That way error messages referring to imported
-//           objects can print meaningful information.
-
-// parser parses the exports inside a gc compiler-produced
-// object/archive file and populates its scope with the results.
-type parser struct {
-	scanner scanner.Scanner
-	tok     rune                      // current token
-	lit     string                    // literal string; only valid for Ident, Int, String tokens
-	id      string                    // package id of imported package
-	imports map[string]*types.Package // package id -> package object
-}
-
-func (p *parser) init(filename, id string, src io.Reader, imports map[string]*types.Package) {
-	p.scanner.Init(src)
-	p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) }
-	p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanChars | scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments
-	p.scanner.Whitespace = 1<<'\t' | 1<<' '
-	p.scanner.Filename = filename // for good error messages
-	p.next()
-	p.id = id
-	p.imports = imports
-	if debug {
-		// check consistency of imports map
-		for _, pkg := range imports {
-			if pkg.Name() == "" {
-				fmt.Printf("no package name for %s\n", pkg.Path())
-			}
-		}
-	}
-}
-
-func (p *parser) next() {
-	p.tok = p.scanner.Scan()
-	switch p.tok {
-	case scanner.Ident, scanner.Int, scanner.Char, scanner.String, '·':
-		p.lit = p.scanner.TokenText()
-	default:
-		p.lit = ""
-	}
-	if debug {
-		fmt.Printf("%s: %q -> %q\n", scanner.TokenString(p.tok), p.scanner.TokenText(), p.lit)
-	}
-}
-
-func declTypeName(pkg *types.Package, name string) *types.TypeName {
-	scope := pkg.Scope()
-	if obj := scope.Lookup(name); obj != nil {
-		return obj.(*types.TypeName)
-	}
-	obj := types.NewTypeName(token.NoPos, pkg, name, nil)
-	// a named type may be referred to before the underlying type
-	// is known - set it up
-	types.NewNamed(obj, nil, nil)
-	scope.Insert(obj)
-	return obj
-}
-
-// ----------------------------------------------------------------------------
-// Error handling
-
-// Internal errors are boxed as importErrors.
-type importError struct {
-	pos scanner.Position
-	err error
-}
-
-func (e importError) Error() string {
-	return fmt.Sprintf("import error %s (byte offset = %d): %s", e.pos, e.pos.Offset, e.err)
-}
-
-func (p *parser) error(err interface{}) {
-	if s, ok := err.(string); ok {
-		err = errors.New(s)
-	}
-	// panic with a runtime.Error if err is not an error
-	panic(importError{p.scanner.Pos(), err.(error)})
-}
-
-func (p *parser) errorf(format string, args ...interface{}) {
-	p.error(fmt.Sprintf(format, args...))
-}
-
-func (p *parser) expect(tok rune) string {
-	lit := p.lit
-	if p.tok != tok {
-		p.errorf("expected %s, got %s (%s)", scanner.TokenString(tok), scanner.TokenString(p.tok), lit)
-	}
-	p.next()
-	return lit
-}
-
-func (p *parser) expectSpecial(tok string) {
-	sep := 'x' // not white space
-	i := 0
-	for i < len(tok) && p.tok == rune(tok[i]) && sep > ' ' {
-		sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token
-		p.next()
-		i++
-	}
-	if i < len(tok) {
-		p.errorf("expected %q, got %q", tok, tok[0:i])
-	}
-}
-
-func (p *parser) expectKeyword(keyword string) {
-	lit := p.expect(scanner.Ident)
-	if lit != keyword {
-		p.errorf("expected keyword %s, got %q", keyword, lit)
-	}
-}
-
-// ----------------------------------------------------------------------------
-// Qualified and unqualified names
-
-// PackageId = string_lit .
-//
-func (p *parser) parsePackageId() string {
-	id, err := strconv.Unquote(p.expect(scanner.String))
-	if err != nil {
-		p.error(err)
-	}
-	// id == "" stands for the imported package id
-	// (only known at time of package installation)
-	if id == "" {
-		id = p.id
-	}
-	return id
-}
-
-// PackageName = ident .
-//
-func (p *parser) parsePackageName() string {
-	return p.expect(scanner.Ident)
-}
-
-// dotIdentifier = ( ident | '·' ) { ident | int | '·' } .
-func (p *parser) parseDotIdent() string {
-	ident := ""
-	if p.tok != scanner.Int {
-		sep := 'x' // not white space
-		for (p.tok == scanner.Ident || p.tok == scanner.Int || p.tok == '·') && sep > ' ' {
-			ident += p.lit
-			sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token
-			p.next()
-		}
-	}
-	if ident == "" {
-		p.expect(scanner.Ident) // use expect() for error handling
-	}
-	return ident
-}
-
-// QualifiedName = "@" PackageId "." ( "?" | dotIdentifier ) .
-//
-func (p *parser) parseQualifiedName() (id, name string) {
-	p.expect('@')
-	id = p.parsePackageId()
-	p.expect('.')
-	// Per rev f280b8a485fd (10/2/2013), qualified names may be used for anonymous fields.
-	if p.tok == '?' {
-		p.next()
-	} else {
-		name = p.parseDotIdent()
-	}
-	return
-}
-
-// getPkg returns the package for a given id. If the package is
-// not found but we have a package name, create the package and
-// add it to the p.imports map.
-//
-func (p *parser) getPkg(id, name string) *types.Package {
-	// package unsafe is not in the imports map - handle explicitly
-	if id == "unsafe" {
-		return types.Unsafe
-	}
-	pkg := p.imports[id]
-	if pkg == nil && name != "" {
-		pkg = types.NewPackage(id, name)
-		p.imports[id] = pkg
-	}
-	return pkg
-}
-
-// parseExportedName is like parseQualifiedName, but
-// the package id is resolved to an imported *types.Package.
-//
-func (p *parser) parseExportedName() (pkg *types.Package, name string) {
-	id, name := p.parseQualifiedName()
-	pkg = p.getPkg(id, "")
-	if pkg == nil {
-		p.errorf("%s package not found", id)
-	}
-	return
-}
-
-// ----------------------------------------------------------------------------
-// Types
-
-// BasicType = identifier .
-//
-func (p *parser) parseBasicType() types.Type {
-	id := p.expect(scanner.Ident)
-	obj := types.Universe.Lookup(id)
-	if obj, ok := obj.(*types.TypeName); ok {
-		return obj.Type()
-	}
-	p.errorf("not a basic type: %s", id)
-	return nil
-}
-
-// ArrayType = "[" int_lit "]" Type .
-//
-func (p *parser) parseArrayType() types.Type {
-	// "[" already consumed and lookahead known not to be "]"
-	lit := p.expect(scanner.Int)
-	p.expect(']')
-	elem := p.parseType()
-	n, err := strconv.ParseInt(lit, 10, 64)
-	if err != nil {
-		p.error(err)
-	}
-	return types.NewArray(elem, n)
-}
-
-// MapType = "map" "[" Type "]" Type .
-//
-func (p *parser) parseMapType() types.Type {
-	p.expectKeyword("map")
-	p.expect('[')
-	key := p.parseType()
-	p.expect(']')
-	elem := p.parseType()
-	return types.NewMap(key, elem)
-}
-
-// Name = identifier | "?" | QualifiedName .
-//
-// If materializePkg is set, the returned package is guaranteed to be set.
-// For fully qualified names, the returned package may be a fake package
-// (without name, scope, and not in the p.imports map), created for the
-// sole purpose of providing a package path. Fake packages are created
-// when the package id is not found in the p.imports map; in that case
-// we cannot create a real package because we don't have a package name.
-// For non-qualified names, the returned package is the imported package.
-//
-func (p *parser) parseName(materializePkg bool) (pkg *types.Package, name string) {
-	switch p.tok {
-	case scanner.Ident:
-		pkg = p.imports[p.id]
-		name = p.lit
-		p.next()
-	case '?':
-		// anonymous
-		pkg = p.imports[p.id]
-		p.next()
-	case '@':
-		// exported name prefixed with package path
-		var id string
-		id, name = p.parseQualifiedName()
-		if materializePkg {
-			// we don't have a package name - if the package
-			// doesn't exist yet, create a fake package instead
-			pkg = p.getPkg(id, "")
-			if pkg == nil {
-				pkg = types.NewPackage(id, "")
-			}
-		}
-	default:
-		p.error("name expected")
-	}
-	return
-}
-
-func deref(typ types.Type) types.Type {
-	if p, _ := typ.(*types.Pointer); p != nil {
-		return p.Elem()
-	}
-	return typ
-}
-
-// Field = Name Type [ string_lit ] .
-//
-func (p *parser) parseField() (*types.Var, string) {
-	pkg, name := p.parseName(true)
-	typ := p.parseType()
-	anonymous := false
-	if name == "" {
-		// anonymous field - typ must be T or *T and T must be a type name
-		switch typ := deref(typ).(type) {
-		case *types.Basic: // basic types are named types
-			pkg = nil
-			name = typ.Name()
-		case *types.Named:
-			name = typ.Obj().Name()
-		default:
-			p.errorf("anonymous field expected")
-		}
-		anonymous = true
-	}
-	tag := ""
-	if p.tok == scanner.String {
-		s := p.expect(scanner.String)
-		var err error
-		tag, err = strconv.Unquote(s)
-		if err != nil {
-			p.errorf("invalid struct tag %s: %s", s, err)
-		}
-	}
-	return types.NewField(token.NoPos, pkg, name, typ, anonymous), tag
-}
-
-// StructType = "struct" "{" [ FieldList ] "}" .
-// FieldList  = Field { ";" Field } .
-//
-func (p *parser) parseStructType() types.Type {
-	var fields []*types.Var
-	var tags []string
-
-	p.expectKeyword("struct")
-	p.expect('{')
-	for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ {
-		if i > 0 {
-			p.expect(';')
-		}
-		fld, tag := p.parseField()
-		if tag != "" && tags == nil {
-			tags = make([]string, i)
-		}
-		if tags != nil {
-			tags = append(tags, tag)
-		}
-		fields = append(fields, fld)
-	}
-	p.expect('}')
-
-	return types.NewStruct(fields, tags)
-}
-
-// Parameter = ( identifier | "?" ) [ "..." ] Type [ string_lit ] .
-//
-func (p *parser) parseParameter() (par *types.Var, isVariadic bool) {
-	_, name := p.parseName(false)
-	// remove gc-specific parameter numbering
-	if i := strings.Index(name, "·"); i >= 0 {
-		name = name[:i]
-	}
-	if p.tok == '.' {
-		p.expectSpecial("...")
-		isVariadic = true
-	}
-	typ := p.parseType()
-	if isVariadic {
-		typ = types.NewSlice(typ)
-	}
-	// ignore argument tag (e.g. "noescape")
-	if p.tok == scanner.String {
-		p.next()
-	}
-	// TODO(gri) should we provide a package?
-	par = types.NewVar(token.NoPos, nil, name, typ)
-	return
-}
-
-// Parameters    = "(" [ ParameterList ] ")" .
-// ParameterList = { Parameter "," } Parameter .
-//
-func (p *parser) parseParameters() (list []*types.Var, isVariadic bool) {
-	p.expect('(')
-	for p.tok != ')' && p.tok != scanner.EOF {
-		if len(list) > 0 {
-			p.expect(',')
-		}
-		par, variadic := p.parseParameter()
-		list = append(list, par)
-		if variadic {
-			if isVariadic {
-				p.error("... not on final argument")
-			}
-			isVariadic = true
-		}
-	}
-	p.expect(')')
-
-	return
-}
-
-// Signature = Parameters [ Result ] .
-// Result    = Type | Parameters .
-//
-func (p *parser) parseSignature(recv *types.Var) *types.Signature {
-	params, isVariadic := p.parseParameters()
-
-	// optional result type
-	var results []*types.Var
-	if p.tok == '(' {
-		var variadic bool
-		results, variadic = p.parseParameters()
-		if variadic {
-			p.error("... not permitted on result type")
-		}
-	}
-
-	return types.NewSignature(nil, recv, types.NewTuple(params...), types.NewTuple(results...), isVariadic)
-}
-
-// InterfaceType = "interface" "{" [ MethodList ] "}" .
-// MethodList    = Method { ";" Method } .
-// Method        = Name Signature .
-//
-// The methods of embedded interfaces are always "inlined"
-// by the compiler and thus embedded interfaces are never
-// visible in the export data.
-//
-func (p *parser) parseInterfaceType() types.Type {
-	var methods []*types.Func
-
-	p.expectKeyword("interface")
-	p.expect('{')
-	for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ {
-		if i > 0 {
-			p.expect(';')
-		}
-		pkg, name := p.parseName(true)
-		sig := p.parseSignature(nil)
-		methods = append(methods, types.NewFunc(token.NoPos, pkg, name, sig))
-	}
-	p.expect('}')
-
-	// Complete requires the type's embedded interfaces to be fully defined,
-	// but we do not define any
-	return types.NewInterface(methods, nil).Complete()
-}
-
-// ChanType = ( "chan" [ "<-" ] | "<-" "chan" ) Type .
-//
-func (p *parser) parseChanType() types.Type {
-	dir := types.SendRecv
-	if p.tok == scanner.Ident {
-		p.expectKeyword("chan")
-		if p.tok == '<' {
-			p.expectSpecial("<-")
-			dir = types.SendOnly
-		}
-	} else {
-		p.expectSpecial("<-")
-		p.expectKeyword("chan")
-		dir = types.RecvOnly
-	}
-	elem := p.parseType()
-	return types.NewChan(dir, elem)
-}
-
-// Type =
-//	BasicType | TypeName | ArrayType | SliceType | StructType |
-//      PointerType | FuncType | InterfaceType | MapType | ChanType |
-//      "(" Type ")" .
-//
-// BasicType   = ident .
-// TypeName    = ExportedName .
-// SliceType   = "[" "]" Type .
-// PointerType = "*" Type .
-// FuncType    = "func" Signature .
-//
-func (p *parser) parseType() types.Type {
-	switch p.tok {
-	case scanner.Ident:
-		switch p.lit {
-		default:
-			return p.parseBasicType()
-		case "struct":
-			return p.parseStructType()
-		case "func":
-			// FuncType
-			p.next()
-			return p.parseSignature(nil)
-		case "interface":
-			return p.parseInterfaceType()
-		case "map":
-			return p.parseMapType()
-		case "chan":
-			return p.parseChanType()
-		}
-	case '@':
-		// TypeName
-		pkg, name := p.parseExportedName()
-		return declTypeName(pkg, name).Type()
-	case '[':
-		p.next() // look ahead
-		if p.tok == ']' {
-			// SliceType
-			p.next()
-			return types.NewSlice(p.parseType())
-		}
-		return p.parseArrayType()
-	case '*':
-		// PointerType
-		p.next()
-		return types.NewPointer(p.parseType())
-	case '<':
-		return p.parseChanType()
-	case '(':
-		// "(" Type ")"
-		p.next()
-		typ := p.parseType()
-		p.expect(')')
-		return typ
-	}
-	p.errorf("expected type, got %s (%q)", scanner.TokenString(p.tok), p.lit)
-	return nil
-}
-
-// ----------------------------------------------------------------------------
-// Declarations
-
-// ImportDecl = "import" PackageName PackageId .
-//
-func (p *parser) parseImportDecl() {
-	p.expectKeyword("import")
-	name := p.parsePackageName()
-	p.getPkg(p.parsePackageId(), name)
-}
-
-// int_lit = [ "+" | "-" ] { "0" ... "9" } .
-//
-func (p *parser) parseInt() string {
-	s := ""
-	switch p.tok {
-	case '-':
-		s = "-"
-		p.next()
-	case '+':
-		p.next()
-	}
-	return s + p.expect(scanner.Int)
-}
-
-// number = int_lit [ "p" int_lit ] .
-//
-func (p *parser) parseNumber() (typ *types.Basic, val exact.Value) {
-	// mantissa
-	mant := exact.MakeFromLiteral(p.parseInt(), token.INT)
-	if mant == nil {
-		panic("invalid mantissa")
-	}
-
-	if p.lit == "p" {
-		// exponent (base 2)
-		p.next()
-		exp, err := strconv.ParseInt(p.parseInt(), 10, 0)
-		if err != nil {
-			p.error(err)
-		}
-		if exp < 0 {
-			denom := exact.MakeInt64(1)
-			denom = exact.Shift(denom, token.SHL, uint(-exp))
-			typ = types.Typ[types.UntypedFloat]
-			val = exact.BinaryOp(mant, token.QUO, denom)
-			return
-		}
-		if exp > 0 {
-			mant = exact.Shift(mant, token.SHL, uint(exp))
-		}
-		typ = types.Typ[types.UntypedFloat]
-		val = mant
-		return
-	}
-
-	typ = types.Typ[types.UntypedInt]
-	val = mant
-	return
-}
-
-// ConstDecl   = "const" ExportedName [ Type ] "=" Literal .
-// Literal     = bool_lit | int_lit | float_lit | complex_lit | rune_lit | string_lit .
-// bool_lit    = "true" | "false" .
-// complex_lit = "(" float_lit "+" float_lit "i" ")" .
-// rune_lit    = "(" int_lit "+" int_lit ")" .
-// string_lit  = `"` { unicode_char } `"` .
-//
-func (p *parser) parseConstDecl() {
-	p.expectKeyword("const")
-	pkg, name := p.parseExportedName()
-
-	var typ0 types.Type
-	if p.tok != '=' {
-		typ0 = p.parseType()
-	}
-
-	p.expect('=')
-	var typ types.Type
-	var val exact.Value
-	switch p.tok {
-	case scanner.Ident:
-		// bool_lit
-		if p.lit != "true" && p.lit != "false" {
-			p.error("expected true or false")
-		}
-		typ = types.Typ[types.UntypedBool]
-		val = exact.MakeBool(p.lit == "true")
-		p.next()
-
-	case '-', scanner.Int:
-		// int_lit
-		typ, val = p.parseNumber()
-
-	case '(':
-		// complex_lit or rune_lit
-		p.next()
-		if p.tok == scanner.Char {
-			p.next()
-			p.expect('+')
-			typ = types.Typ[types.UntypedRune]
-			_, val = p.parseNumber()
-			p.expect(')')
-			break
-		}
-		_, re := p.parseNumber()
-		p.expect('+')
-		_, im := p.parseNumber()
-		p.expectKeyword("i")
-		p.expect(')')
-		typ = types.Typ[types.UntypedComplex]
-		val = exact.BinaryOp(re, token.ADD, exact.MakeImag(im))
-
-	case scanner.Char:
-		// rune_lit
-		typ = types.Typ[types.UntypedRune]
-		val = exact.MakeFromLiteral(p.lit, token.CHAR)
-		p.next()
-
-	case scanner.String:
-		// string_lit
-		typ = types.Typ[types.UntypedString]
-		val = exact.MakeFromLiteral(p.lit, token.STRING)
-		p.next()
-
-	default:
-		p.errorf("expected literal got %s", scanner.TokenString(p.tok))
-	}
-
-	if typ0 == nil {
-		typ0 = typ
-	}
-
-	pkg.Scope().Insert(types.NewConst(token.NoPos, pkg, name, typ0, val))
-}
-
-// TypeDecl = "type" ExportedName Type .
-//
-func (p *parser) parseTypeDecl() {
-	p.expectKeyword("type")
-	pkg, name := p.parseExportedName()
-	obj := declTypeName(pkg, name)
-
-	// The type object may have been imported before and thus already
-	// have a type associated with it. We still need to parse the type
-	// structure, but throw it away if the object already has a type.
-	// This ensures that all imports refer to the same type object for
-	// a given type declaration.
-	typ := p.parseType()
-
-	if name := obj.Type().(*types.Named); name.Underlying() == nil {
-		name.SetUnderlying(typ)
-	}
-}
-
-// VarDecl = "var" ExportedName Type .
-//
-func (p *parser) parseVarDecl() {
-	p.expectKeyword("var")
-	pkg, name := p.parseExportedName()
-	typ := p.parseType()
-	pkg.Scope().Insert(types.NewVar(token.NoPos, pkg, name, typ))
-}
-
-// Func = Signature [ Body ] .
-// Body = "{" ... "}" .
-//
-func (p *parser) parseFunc(recv *types.Var) *types.Signature {
-	sig := p.parseSignature(recv)
-	if p.tok == '{' {
-		p.next()
-		for i := 1; i > 0; p.next() {
-			switch p.tok {
-			case '{':
-				i++
-			case '}':
-				i--
-			}
-		}
-	}
-	return sig
-}
-
-// MethodDecl = "func" Receiver Name Func .
-// Receiver   = "(" ( identifier | "?" ) [ "*" ] ExportedName ")" .
-//
-func (p *parser) parseMethodDecl() {
-	// "func" already consumed
-	p.expect('(')
-	recv, _ := p.parseParameter() // receiver
-	p.expect(')')
-
-	// determine receiver base type object
-	base := deref(recv.Type()).(*types.Named)
-
-	// parse method name, signature, and possibly inlined body
-	_, name := p.parseName(true)
-	sig := p.parseFunc(recv)
-
-	// methods always belong to the same package as the base type object
-	pkg := base.Obj().Pkg()
-
-	// add method to type unless type was imported before
-	// and method exists already
-	// TODO(gri) This leads to a quadratic algorithm - ok for now because method counts are small.
-	base.AddMethod(types.NewFunc(token.NoPos, pkg, name, sig))
-}
-
-// FuncDecl = "func" ExportedName Func .
-//
-func (p *parser) parseFuncDecl() {
-	// "func" already consumed
-	pkg, name := p.parseExportedName()
-	typ := p.parseFunc(nil)
-	pkg.Scope().Insert(types.NewFunc(token.NoPos, pkg, name, typ))
-}
-
-// Decl = [ ImportDecl | ConstDecl | TypeDecl | VarDecl | FuncDecl | MethodDecl ] "\n" .
-//
-func (p *parser) parseDecl() {
-	if p.tok == scanner.Ident {
-		switch p.lit {
-		case "import":
-			p.parseImportDecl()
-		case "const":
-			p.parseConstDecl()
-		case "type":
-			p.parseTypeDecl()
-		case "var":
-			p.parseVarDecl()
-		case "func":
-			p.next() // look ahead
-			if p.tok == '(' {
-				p.parseMethodDecl()
-			} else {
-				p.parseFuncDecl()
-			}
-		}
-	}
-	p.expect('\n')
-}
-
-// ----------------------------------------------------------------------------
-// Export
-
-// Export        = "PackageClause { Decl } "$$" .
-// PackageClause = "package" PackageName [ "safe" ] "\n" .
-//
-func (p *parser) parseExport() *types.Package {
-	p.expectKeyword("package")
-	name := p.parsePackageName()
-	if p.tok == scanner.Ident && p.lit == "safe" {
-		// package was compiled with -u option - ignore
-		p.next()
-	}
-	p.expect('\n')
-
-	pkg := p.getPkg(p.id, name)
-
-	for p.tok != '$' && p.tok != scanner.EOF {
-		p.parseDecl()
-	}
-
-	if ch := p.scanner.Peek(); p.tok != '$' || ch != '$' {
-		// don't call next()/expect() since reading past the
-		// export data may cause scanner errors (e.g. NUL chars)
-		p.errorf("expected '$$', got %s %c", scanner.TokenString(p.tok), ch)
-	}
-
-	if n := p.scanner.ErrorCount; n != 0 {
-		p.errorf("expected no scanner errors, got %d", n)
-	}
-
-	// package was imported completely and without errors
-	pkg.MarkComplete()
-
-	return pkg
-}
diff --git a/third_party/gotools/go/gcimporter/gcimporter_test.go b/third_party/gotools/go/gcimporter/gcimporter_test.go
deleted file mode 100644
index 38a29c3..0000000
--- a/third_party/gotools/go/gcimporter/gcimporter_test.go
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gcimporter
-
-import (
-	"go/build"
-	"io/ioutil"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"testing"
-	"time"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var gcPath string // Go compiler path
-
-func init() {
-	// determine compiler
-	var gc string
-	switch runtime.GOARCH {
-	case "386":
-		gc = "8g"
-	case "amd64":
-		gc = "6g"
-	case "arm":
-		gc = "5g"
-	default:
-		gcPath = "unknown-GOARCH-compiler"
-		return
-	}
-	gcPath = filepath.Join(build.ToolDir, gc)
-}
-
-func compile(t *testing.T, dirname, filename string) string {
-	cmd := exec.Command(gcPath, filename)
-	cmd.Dir = dirname
-	out, err := cmd.CombinedOutput()
-	if err != nil {
-		t.Logf("%s", out)
-		t.Fatalf("%s %s failed: %s", gcPath, filename, err)
-	}
-	archCh, _ := build.ArchChar(runtime.GOARCH)
-	// filename should end with ".go"
-	return filepath.Join(dirname, filename[:len(filename)-2]+archCh)
-}
-
-// Use the same global imports map for all tests. The effect is
-// as if all tested packages were imported into a single package.
-var imports = make(map[string]*types.Package)
-
-func testPath(t *testing.T, path string) bool {
-	t0 := time.Now()
-	_, err := Import(imports, path)
-	if err != nil {
-		t.Errorf("testPath(%s): %s", path, err)
-		return false
-	}
-	t.Logf("testPath(%s): %v", path, time.Since(t0))
-	return true
-}
-
-const maxTime = 30 * time.Second
-
-func testDir(t *testing.T, dir string, endTime time.Time) (nimports int) {
-	dirname := filepath.Join(runtime.GOROOT(), "pkg", runtime.GOOS+"_"+runtime.GOARCH, dir)
-	list, err := ioutil.ReadDir(dirname)
-	if err != nil {
-		t.Fatalf("testDir(%s): %s", dirname, err)
-	}
-	for _, f := range list {
-		if time.Now().After(endTime) {
-			t.Log("testing time used up")
-			return
-		}
-		switch {
-		case !f.IsDir():
-			// try extensions
-			for _, ext := range pkgExts {
-				if strings.HasSuffix(f.Name(), ext) {
-					name := f.Name()[0 : len(f.Name())-len(ext)] // remove extension
-					if testPath(t, filepath.Join(dir, name)) {
-						nimports++
-					}
-				}
-			}
-		case f.IsDir():
-			nimports += testDir(t, filepath.Join(dir, f.Name()), endTime)
-		}
-	}
-	return
-}
-
-func TestImport(t *testing.T) {
-	// This package does not handle gccgo export data.
-	if runtime.Compiler == "gccgo" {
-		return
-	}
-
-	// On cross-compile builds, the path will not exist.
-	// Need to use GOHOSTOS, which is not available.
-	if _, err := os.Stat(gcPath); err != nil {
-		t.Skipf("skipping test: %v", err)
-	}
-
-	if outFn := compile(t, "testdata", "exports.go"); outFn != "" {
-		defer os.Remove(outFn)
-	}
-
-	nimports := 0
-	if testPath(t, "./testdata/exports") {
-		nimports++
-	}
-	nimports += testDir(t, "", time.Now().Add(maxTime)) // installed packages
-	t.Logf("tested %d imports", nimports)
-}
-
-var importedObjectTests = []struct {
-	name string
-	want string
-}{
-	{"unsafe.Pointer", "type Pointer unsafe.Pointer"},
-	{"math.Pi", "const Pi untyped float"},
-	{"io.Reader", "type Reader interface{Read(p []byte) (n int, err error)}"},
-	{"io.ReadWriter", "type ReadWriter interface{Read(p []byte) (n int, err error); Write(p []byte) (n int, err error)}"},
-	{"math.Sin", "func Sin(x float64) float64"},
-	// TODO(gri) add more tests
-}
-
-func TestImportedTypes(t *testing.T) {
-	// This package does not handle gccgo export data.
-	if runtime.Compiler == "gccgo" {
-		return
-	}
-	for _, test := range importedObjectTests {
-		s := strings.Split(test.name, ".")
-		if len(s) != 2 {
-			t.Fatal("inconsistent test data")
-		}
-		importPath := s[0]
-		objName := s[1]
-
-		pkg, err := Import(imports, importPath)
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-
-		obj := pkg.Scope().Lookup(objName)
-		if obj == nil {
-			t.Errorf("%s: object not found", test.name)
-			continue
-		}
-
-		got := types.ObjectString(pkg, obj)
-		if got != test.want {
-			t.Errorf("%s: got %q; want %q", test.name, got, test.want)
-		}
-	}
-}
-
-func TestIssue5815(t *testing.T) {
-	// This package does not handle gccgo export data.
-	if runtime.Compiler == "gccgo" {
-		return
-	}
-
-	pkg, err := Import(make(map[string]*types.Package), "strings")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	scope := pkg.Scope()
-	for _, name := range scope.Names() {
-		obj := scope.Lookup(name)
-		if obj.Pkg() == nil {
-			t.Errorf("no pkg for %s", obj)
-		}
-		if tname, _ := obj.(*types.TypeName); tname != nil {
-			named := tname.Type().(*types.Named)
-			for i := 0; i < named.NumMethods(); i++ {
-				m := named.Method(i)
-				if m.Pkg() == nil {
-					t.Errorf("no pkg for %s", m)
-				}
-			}
-		}
-	}
-}
-
-// Smoke test to ensure that imported methods get the correct package.
-func TestCorrectMethodPackage(t *testing.T) {
-	// This package does not handle gccgo export data.
-	if runtime.Compiler == "gccgo" {
-		return
-	}
-
-	imports := make(map[string]*types.Package)
-	_, err := Import(imports, "net/http")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	mutex := imports["sync"].Scope().Lookup("Mutex").(*types.TypeName).Type()
-	mset := types.NewMethodSet(types.NewPointer(mutex)) // methods of *sync.Mutex
-	sel := mset.Lookup(nil, "Lock")
-	lock := sel.Obj().(*types.Func)
-	if got, want := lock.Pkg().Path(), "sync"; got != want {
-		t.Errorf("got package path %q; want %q", got, want)
-	}
-}
diff --git a/third_party/gotools/go/gcimporter/testdata/exports.go b/third_party/gotools/go/gcimporter/testdata/exports.go
deleted file mode 100644
index 8ee28b0..0000000
--- a/third_party/gotools/go/gcimporter/testdata/exports.go
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file is used to generate an object file which
-// serves as test file for gcimporter_test.go.
-
-package exports
-
-import (
-	"go/ast"
-)
-
-// Issue 3682: Correctly read dotted identifiers from export data.
-const init1 = 0
-
-func init() {}
-
-const (
-	C0 int = 0
-	C1     = 3.14159265
-	C2     = 2.718281828i
-	C3     = -123.456e-789
-	C4     = +123.456E+789
-	C5     = 1234i
-	C6     = "foo\n"
-	C7     = `bar\n`
-)
-
-type (
-	T1  int
-	T2  [10]int
-	T3  []int
-	T4  *int
-	T5  chan int
-	T6a chan<- int
-	T6b chan (<-chan int)
-	T6c chan<- (chan int)
-	T7  <-chan *ast.File
-	T8  struct{}
-	T9  struct {
-		a    int
-		b, c float32
-		d    []string `go:"tag"`
-	}
-	T10 struct {
-		T8
-		T9
-		_ *T10
-	}
-	T11 map[int]string
-	T12 interface{}
-	T13 interface {
-		m1()
-		m2(int) float32
-	}
-	T14 interface {
-		T12
-		T13
-		m3(x ...struct{}) []T9
-	}
-	T15 func()
-	T16 func(int)
-	T17 func(x int)
-	T18 func() float32
-	T19 func() (x float32)
-	T20 func(...interface{})
-	T21 struct{ next *T21 }
-	T22 struct{ link *T23 }
-	T23 struct{ link *T22 }
-	T24 *T24
-	T25 *T26
-	T26 *T27
-	T27 *T25
-	T28 func(T28) T28
-)
-
-var (
-	V0 int
-	V1 = -991.0
-)
-
-func F1()         {}
-func F2(x int)    {}
-func F3() int     { return 0 }
-func F4() float32 { return 0 }
-func F5(a, b, c int, u, v, w struct{ x, y T1 }, more ...interface{}) (p, q, r chan<- T10)
-
-func (p *T1) M1()
diff --git a/third_party/gotools/go/importer/export.go b/third_party/gotools/go/importer/export.go
deleted file mode 100644
index 02f9128..0000000
--- a/third_party/gotools/go/importer/export.go
+++ /dev/null
@@ -1,462 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package importer
-
-import (
-	"bytes"
-	"encoding/binary"
-	"fmt"
-	"go/ast"
-	"strings"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// debugging support
-const (
-	debug = false // emit debugging data
-	trace = false // print emitted data
-)
-
-// format returns a byte indicating the low-level encoding/decoding format
-// (debug vs product).
-func format() byte {
-	if debug {
-		return 'd'
-	}
-	return 'p'
-}
-
-// ExportData serializes the interface (exported package objects)
-// of package pkg and returns the corresponding data. The export
-// format is described elsewhere (TODO).
-func ExportData(pkg *types.Package) []byte {
-	p := exporter{
-		data:     append([]byte(magic), format()),
-		pkgIndex: make(map[*types.Package]int),
-		typIndex: make(map[types.Type]int),
-	}
-
-	// populate typIndex with predeclared types
-	for _, t := range predeclared {
-		p.typIndex[t] = len(p.typIndex)
-	}
-
-	if trace {
-		p.tracef("export %s\n", pkg.Name())
-		defer p.tracef("\n")
-	}
-
-	p.string(version)
-
-	p.pkg(pkg)
-
-	// collect exported objects from package scope
-	var list []types.Object
-	scope := pkg.Scope()
-	for _, name := range scope.Names() {
-		if exported(name) {
-			list = append(list, scope.Lookup(name))
-		}
-	}
-
-	// write objects
-	p.int(len(list))
-	for _, obj := range list {
-		p.obj(obj)
-	}
-
-	return p.data
-}
-
-type exporter struct {
-	data     []byte
-	pkgIndex map[*types.Package]int
-	typIndex map[types.Type]int
-
-	// tracing support
-	indent string
-}
-
-func (p *exporter) pkg(pkg *types.Package) {
-	if trace {
-		p.tracef("package { ")
-		defer p.tracef("} ")
-	}
-
-	if pkg == nil {
-		panic("unexpected nil pkg")
-	}
-
-	// if the package was seen before, write its index (>= 0)
-	if i, ok := p.pkgIndex[pkg]; ok {
-		p.int(i)
-		return
-	}
-	p.pkgIndex[pkg] = len(p.pkgIndex)
-
-	// otherwise, write the package tag (< 0) and package data
-	p.int(packageTag)
-	p.string(pkg.Name())
-	p.string(pkg.Path())
-}
-
-func (p *exporter) obj(obj types.Object) {
-	if trace {
-		p.tracef("object %s {\n", obj.Name())
-		defer p.tracef("}\n")
-	}
-
-	switch obj := obj.(type) {
-	case *types.Const:
-		p.int(constTag)
-		p.string(obj.Name())
-		p.typ(obj.Type())
-		p.value(obj.Val())
-	case *types.TypeName:
-		p.int(typeTag)
-		// name is written by corresponding named type
-		p.typ(obj.Type().(*types.Named))
-	case *types.Var:
-		p.int(varTag)
-		p.string(obj.Name())
-		p.typ(obj.Type())
-	case *types.Func:
-		p.int(funcTag)
-		p.string(obj.Name())
-		p.typ(obj.Type())
-	default:
-		panic(fmt.Sprintf("unexpected object type %T", obj))
-	}
-}
-
-func (p *exporter) value(x exact.Value) {
-	if trace {
-		p.tracef("value { ")
-		defer p.tracef("} ")
-	}
-
-	switch kind := x.Kind(); kind {
-	case exact.Bool:
-		tag := falseTag
-		if exact.BoolVal(x) {
-			tag = trueTag
-		}
-		p.int(tag)
-	case exact.Int:
-		if i, ok := exact.Int64Val(x); ok {
-			p.int(int64Tag)
-			p.int64(i)
-			return
-		}
-		p.int(floatTag)
-		p.float(x)
-	case exact.Float:
-		p.int(fractionTag)
-		p.fraction(x)
-	case exact.Complex:
-		p.int(complexTag)
-		p.fraction(exact.Real(x))
-		p.fraction(exact.Imag(x))
-	case exact.String:
-		p.int(stringTag)
-		p.string(exact.StringVal(x))
-	default:
-		panic(fmt.Sprintf("unexpected value kind %d", kind))
-	}
-}
-
-func (p *exporter) float(x exact.Value) {
-	sign := exact.Sign(x)
-	p.int(sign)
-	if sign == 0 {
-		return
-	}
-
-	p.ufloat(x)
-}
-
-func (p *exporter) fraction(x exact.Value) {
-	sign := exact.Sign(x)
-	p.int(sign)
-	if sign == 0 {
-		return
-	}
-
-	p.ufloat(exact.Num(x))
-	p.ufloat(exact.Denom(x))
-}
-
-// ufloat writes abs(x) in form of a binary exponent
-// followed by its mantissa bytes; x must be != 0.
-func (p *exporter) ufloat(x exact.Value) {
-	mant := exact.Bytes(x)
-	exp8 := -1
-	for i, b := range mant {
-		if b != 0 {
-			exp8 = i
-			break
-		}
-	}
-	if exp8 < 0 {
-		panic(fmt.Sprintf("%s has no mantissa", x))
-	}
-	p.int(exp8 * 8)
-	p.bytes(mant[exp8:])
-}
-
-func (p *exporter) typ(typ types.Type) {
-	if trace {
-		p.tracef("type {\n")
-		defer p.tracef("}\n")
-	}
-
-	// if the type was seen before, write its index (>= 0)
-	if i, ok := p.typIndex[typ]; ok {
-		p.int(i)
-		return
-	}
-	p.typIndex[typ] = len(p.typIndex)
-
-	// otherwise, write the type tag (< 0) and type data
-	switch t := typ.(type) {
-	case *types.Array:
-		p.int(arrayTag)
-		p.int64(t.Len())
-		p.typ(t.Elem())
-
-	case *types.Slice:
-		p.int(sliceTag)
-		p.typ(t.Elem())
-
-	case *types.Struct:
-		p.int(structTag)
-		n := t.NumFields()
-		p.int(n)
-		for i := 0; i < n; i++ {
-			p.field(t.Field(i))
-			p.string(t.Tag(i))
-		}
-
-	case *types.Pointer:
-		p.int(pointerTag)
-		p.typ(t.Elem())
-
-	case *types.Signature:
-		p.int(signatureTag)
-		p.signature(t)
-
-	case *types.Interface:
-		p.int(interfaceTag)
-
-		// write embedded interfaces
-		m := t.NumEmbeddeds()
-		p.int(m)
-		for i := 0; i < m; i++ {
-			p.typ(t.Embedded(i))
-		}
-
-		// write methods
-		n := t.NumExplicitMethods()
-		p.int(n)
-		for i := 0; i < n; i++ {
-			m := t.ExplicitMethod(i)
-			p.qualifiedName(m.Pkg(), m.Name())
-			p.typ(m.Type())
-		}
-
-	case *types.Map:
-		p.int(mapTag)
-		p.typ(t.Key())
-		p.typ(t.Elem())
-
-	case *types.Chan:
-		p.int(chanTag)
-		p.int(int(t.Dir()))
-		p.typ(t.Elem())
-
-	case *types.Named:
-		p.int(namedTag)
-
-		// write type object
-		obj := t.Obj()
-		p.string(obj.Name())
-		p.pkg(obj.Pkg())
-
-		// write underlying type
-		p.typ(t.Underlying())
-
-		// write associated methods
-		n := t.NumMethods()
-		p.int(n)
-		for i := 0; i < n; i++ {
-			m := t.Method(i)
-			p.string(m.Name())
-			p.typ(m.Type())
-		}
-
-	default:
-		panic("unreachable")
-	}
-}
-
-func (p *exporter) field(f *types.Var) {
-	// anonymous fields have "" name
-	name := ""
-	if !f.Anonymous() {
-		name = f.Name()
-	}
-
-	// qualifiedName will always emit the field package for
-	// anonymous fields because "" is not an exported name.
-	p.qualifiedName(f.Pkg(), name)
-	p.typ(f.Type())
-}
-
-func (p *exporter) qualifiedName(pkg *types.Package, name string) {
-	p.string(name)
-	// exported names don't need package
-	if !exported(name) {
-		if pkg == nil {
-			panic(fmt.Sprintf("nil package for unexported qualified name %s", name))
-		}
-		p.pkg(pkg)
-	}
-}
-
-func (p *exporter) signature(sig *types.Signature) {
-	// We need the receiver information (T vs *T)
-	// for methods associated with named types.
-	// We do not record interface receiver types in the
-	// export data because 1) the importer can derive them
-	// from the interface type and 2) they create cycles
-	// in the type graph.
-	if recv := sig.Recv(); recv != nil {
-		if _, ok := recv.Type().Underlying().(*types.Interface); !ok {
-			// 1-element tuple
-			p.int(1)
-			p.param(recv)
-		} else {
-			// 0-element tuple
-			p.int(0)
-		}
-	} else {
-		// 0-element tuple
-		p.int(0)
-	}
-	p.tuple(sig.Params())
-	p.tuple(sig.Results())
-	if sig.Variadic() {
-		p.int(1)
-	} else {
-		p.int(0)
-	}
-}
-
-func (p *exporter) param(v *types.Var) {
-	p.string(v.Name())
-	p.typ(v.Type())
-}
-
-func (p *exporter) tuple(t *types.Tuple) {
-	n := t.Len()
-	p.int(n)
-	for i := 0; i < n; i++ {
-		p.param(t.At(i))
-	}
-}
-
-// ----------------------------------------------------------------------------
-// encoders
-
-func (p *exporter) string(s string) {
-	p.bytes([]byte(s)) // (could be inlined if extra allocation matters)
-}
-
-func (p *exporter) int(x int) {
-	p.int64(int64(x))
-}
-
-func (p *exporter) int64(x int64) {
-	if debug {
-		p.marker('i')
-	}
-
-	if trace {
-		p.tracef("%d ", x)
-	}
-
-	p.rawInt64(x)
-}
-
-func (p *exporter) bytes(b []byte) {
-	if debug {
-		p.marker('b')
-	}
-
-	if trace {
-		p.tracef("%q ", b)
-	}
-
-	p.rawInt64(int64(len(b)))
-	if len(b) > 0 {
-		p.data = append(p.data, b...)
-	}
-}
-
-// marker emits a marker byte and position information which makes
-// it easy for a reader to detect if it is "out of sync". Used for
-// debug format only.
-func (p *exporter) marker(m byte) {
-	if debug {
-		p.data = append(p.data, m)
-		p.rawInt64(int64(len(p.data)))
-	}
-}
-
-// rawInt64 should only be used by low-level encoders
-func (p *exporter) rawInt64(x int64) {
-	var tmp [binary.MaxVarintLen64]byte
-	n := binary.PutVarint(tmp[:], x)
-	p.data = append(p.data, tmp[:n]...)
-}
-
-// utility functions
-
-func (p *exporter) tracef(format string, args ...interface{}) {
-	// rewrite format string to take care of indentation
-	const indent = ".  "
-	if strings.IndexAny(format, "{}\n") >= 0 {
-		var buf bytes.Buffer
-		for i := 0; i < len(format); i++ {
-			// no need to deal with runes
-			ch := format[i]
-			switch ch {
-			case '{':
-				p.indent += indent
-			case '}':
-				p.indent = p.indent[:len(p.indent)-len(indent)]
-				if i+1 < len(format) && format[i+1] == '\n' {
-					buf.WriteByte('\n')
-					buf.WriteString(p.indent)
-					buf.WriteString("} ")
-					i++
-					continue
-				}
-			}
-			buf.WriteByte(ch)
-			if ch == '\n' {
-				buf.WriteString(p.indent)
-			}
-		}
-		format = buf.String()
-	}
-	fmt.Printf(format, args...)
-}
-
-func exported(name string) bool {
-	return ast.IsExported(name)
-}
diff --git a/third_party/gotools/go/importer/import.go b/third_party/gotools/go/importer/import.go
deleted file mode 100644
index 6164597..0000000
--- a/third_party/gotools/go/importer/import.go
+++ /dev/null
@@ -1,456 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This implementation is loosely based on the algorithm described
-// in: "On the linearization of graphs and writing symbol files",
-// by R. Griesemer, Technical Report 156, ETH Zürich, 1991.
-
-// package importer implements an exporter and importer for Go export data.
-package importer // import "llvm.org/llgo/third_party/gotools/go/importer"
-
-import (
-	"encoding/binary"
-	"fmt"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// ImportData imports a package from the serialized package data
-// and returns the number of bytes consumed and a reference to the package.
-// If data is obviously malformed, an error is returned but in
-// general it is not recommended to call ImportData on untrusted
-// data.
-func ImportData(imports map[string]*types.Package, data []byte) (int, *types.Package, error) {
-	datalen := len(data)
-
-	// check magic string
-	var s string
-	if len(data) >= len(magic) {
-		s = string(data[:len(magic)])
-		data = data[len(magic):]
-	}
-	if s != magic {
-		return 0, nil, fmt.Errorf("incorrect magic string: got %q; want %q", s, magic)
-	}
-
-	// check low-level encoding format
-	var m byte = 'm' // missing format
-	if len(data) > 0 {
-		m = data[0]
-		data = data[1:]
-	}
-	if m != format() {
-		return 0, nil, fmt.Errorf("incorrect low-level encoding format: got %c; want %c", m, format())
-	}
-
-	p := importer{
-		data:    data,
-		datalen: datalen,
-		imports: imports,
-	}
-
-	// populate typList with predeclared types
-	for _, t := range predeclared {
-		p.typList = append(p.typList, t)
-	}
-
-	if v := p.string(); v != version {
-		return 0, nil, fmt.Errorf("unknown version: got %s; want %s", v, version)
-	}
-
-	pkg := p.pkg()
-	if debug && p.pkgList[0] != pkg {
-		panic("imported packaged not found in pkgList[0]")
-	}
-
-	// read objects
-	n := p.int()
-	for i := 0; i < n; i++ {
-		p.obj(pkg)
-	}
-
-	// complete interfaces
-	for _, typ := range p.typList {
-		if it, ok := typ.(*types.Interface); ok {
-			it.Complete()
-		}
-	}
-
-	// package was imported completely and without errors
-	pkg.MarkComplete()
-
-	return p.consumed(), pkg, nil
-}
-
-type importer struct {
-	data    []byte
-	datalen int
-	imports map[string]*types.Package
-	pkgList []*types.Package
-	typList []types.Type
-}
-
-func (p *importer) pkg() *types.Package {
-	// if the package was seen before, i is its index (>= 0)
-	i := p.int()
-	if i >= 0 {
-		return p.pkgList[i]
-	}
-
-	// otherwise, i is the package tag (< 0)
-	if i != packageTag {
-		panic(fmt.Sprintf("unexpected package tag %d", i))
-	}
-
-	// read package data
-	name := p.string()
-	path := p.string()
-
-	// if the package was imported before, use that one; otherwise create a new one
-	pkg := p.imports[path]
-	if pkg == nil {
-		pkg = types.NewPackage(path, name)
-		p.imports[path] = pkg
-	}
-	p.pkgList = append(p.pkgList, pkg)
-
-	return pkg
-}
-
-func (p *importer) obj(pkg *types.Package) {
-	var obj types.Object
-	switch tag := p.int(); tag {
-	case constTag:
-		obj = types.NewConst(token.NoPos, pkg, p.string(), p.typ(), p.value())
-	case typeTag:
-		// type object is added to scope via respective named type
-		_ = p.typ().(*types.Named)
-		return
-	case varTag:
-		obj = types.NewVar(token.NoPos, pkg, p.string(), p.typ())
-	case funcTag:
-		obj = types.NewFunc(token.NoPos, pkg, p.string(), p.typ().(*types.Signature))
-	default:
-		panic(fmt.Sprintf("unexpected object tag %d", tag))
-	}
-
-	if alt := pkg.Scope().Insert(obj); alt != nil {
-		panic(fmt.Sprintf("%s already declared", alt.Name()))
-	}
-}
-
-func (p *importer) value() exact.Value {
-	switch kind := exact.Kind(p.int()); kind {
-	case falseTag:
-		return exact.MakeBool(false)
-	case trueTag:
-		return exact.MakeBool(true)
-	case int64Tag:
-		return exact.MakeInt64(p.int64())
-	case floatTag:
-		return p.float()
-	case fractionTag:
-		return p.fraction()
-	case complexTag:
-		re := p.fraction()
-		im := p.fraction()
-		return exact.BinaryOp(re, token.ADD, exact.MakeImag(im))
-	case stringTag:
-		return exact.MakeString(p.string())
-	default:
-		panic(fmt.Sprintf("unexpected value kind %d", kind))
-	}
-}
-
-func (p *importer) float() exact.Value {
-	sign := p.int()
-	if sign == 0 {
-		return exact.MakeInt64(0)
-	}
-
-	x := p.ufloat()
-	if sign < 0 {
-		x = exact.UnaryOp(token.SUB, x, 0)
-	}
-	return x
-}
-
-func (p *importer) fraction() exact.Value {
-	sign := p.int()
-	if sign == 0 {
-		return exact.MakeInt64(0)
-	}
-
-	x := exact.BinaryOp(p.ufloat(), token.QUO, p.ufloat())
-	if sign < 0 {
-		x = exact.UnaryOp(token.SUB, x, 0)
-	}
-	return x
-}
-
-func (p *importer) ufloat() exact.Value {
-	exp := p.int()
-	x := exact.MakeFromBytes(p.bytes())
-	switch {
-	case exp < 0:
-		d := exact.Shift(exact.MakeInt64(1), token.SHL, uint(-exp))
-		x = exact.BinaryOp(x, token.QUO, d)
-	case exp > 0:
-		x = exact.Shift(x, token.SHL, uint(exp))
-	}
-	return x
-}
-
-func (p *importer) record(t types.Type) {
-	p.typList = append(p.typList, t)
-}
-
-func (p *importer) typ() types.Type {
-	// if the type was seen before, i is its index (>= 0)
-	i := p.int()
-	if i >= 0 {
-		return p.typList[i]
-	}
-
-	// otherwise, i is the type tag (< 0)
-	switch i {
-	case arrayTag:
-		t := new(types.Array)
-		p.record(t)
-
-		n := p.int64()
-		*t = *types.NewArray(p.typ(), n)
-		return t
-
-	case sliceTag:
-		t := new(types.Slice)
-		p.record(t)
-
-		*t = *types.NewSlice(p.typ())
-		return t
-
-	case structTag:
-		t := new(types.Struct)
-		p.record(t)
-
-		n := p.int()
-		fields := make([]*types.Var, n)
-		tags := make([]string, n)
-		for i := range fields {
-			fields[i] = p.field()
-			tags[i] = p.string()
-		}
-		*t = *types.NewStruct(fields, tags)
-		return t
-
-	case pointerTag:
-		t := new(types.Pointer)
-		p.record(t)
-
-		*t = *types.NewPointer(p.typ())
-		return t
-
-	case signatureTag:
-		t := new(types.Signature)
-		p.record(t)
-
-		*t = *p.signature()
-		return t
-
-	case interfaceTag:
-		// Create a dummy entry in the type list. This is safe because we
-		// cannot expect the interface type to appear in a cycle, as any
-		// such cycle must contain a named type which would have been
-		// first defined earlier.
-		n := len(p.typList)
-		p.record(nil)
-
-		// read embedded interfaces
-		embeddeds := make([]*types.Named, p.int())
-		for i := range embeddeds {
-			embeddeds[i] = p.typ().(*types.Named)
-		}
-
-		// read methods
-		methods := make([]*types.Func, p.int())
-		for i := range methods {
-			pkg, name := p.qualifiedName()
-			methods[i] = types.NewFunc(token.NoPos, pkg, name, p.typ().(*types.Signature))
-		}
-
-		t := types.NewInterface(methods, embeddeds)
-		p.typList[n] = t
-		return t
-
-	case mapTag:
-		t := new(types.Map)
-		p.record(t)
-
-		*t = *types.NewMap(p.typ(), p.typ())
-		return t
-
-	case chanTag:
-		t := new(types.Chan)
-		p.record(t)
-
-		*t = *types.NewChan(types.ChanDir(p.int()), p.typ())
-		return t
-
-	case namedTag:
-		// read type object
-		name := p.string()
-		pkg := p.pkg()
-		scope := pkg.Scope()
-		obj := scope.Lookup(name)
-
-		// if the object doesn't exist yet, create and insert it
-		if obj == nil {
-			obj = types.NewTypeName(token.NoPos, pkg, name, nil)
-			scope.Insert(obj)
-		}
-
-		// associate new named type with obj if it doesn't exist yet
-		t0 := types.NewNamed(obj.(*types.TypeName), nil, nil)
-
-		// but record the existing type, if any
-		t := obj.Type().(*types.Named)
-		p.record(t)
-
-		// read underlying type
-		t0.SetUnderlying(p.typ())
-
-		// read associated methods
-		for i, n := 0, p.int(); i < n; i++ {
-			t0.AddMethod(types.NewFunc(token.NoPos, pkg, p.string(), p.typ().(*types.Signature)))
-		}
-
-		return t
-
-	default:
-		panic(fmt.Sprintf("unexpected type tag %d", i))
-	}
-}
-
-func deref(typ types.Type) types.Type {
-	if p, _ := typ.(*types.Pointer); p != nil {
-		return p.Elem()
-	}
-	return typ
-}
-
-func (p *importer) field() *types.Var {
-	pkg, name := p.qualifiedName()
-	typ := p.typ()
-
-	anonymous := false
-	if name == "" {
-		// anonymous field - typ must be T or *T and T must be a type name
-		switch typ := deref(typ).(type) {
-		case *types.Basic: // basic types are named types
-			pkg = nil
-			name = typ.Name()
-		case *types.Named:
-			obj := typ.Obj()
-			name = obj.Name()
-			// correct the field package for anonymous fields
-			if exported(name) {
-				pkg = p.pkgList[0]
-			}
-		default:
-			panic("anonymous field expected")
-		}
-		anonymous = true
-	}
-
-	return types.NewField(token.NoPos, pkg, name, typ, anonymous)
-}
-
-func (p *importer) qualifiedName() (*types.Package, string) {
-	name := p.string()
-	pkg := p.pkgList[0] // exported names assume current package
-	if !exported(name) {
-		pkg = p.pkg()
-	}
-	return pkg, name
-}
-
-func (p *importer) signature() *types.Signature {
-	var recv *types.Var
-	if p.int() != 0 {
-		recv = p.param()
-	}
-	return types.NewSignature(nil, recv, p.tuple(), p.tuple(), p.int() != 0)
-}
-
-func (p *importer) param() *types.Var {
-	return types.NewVar(token.NoPos, nil, p.string(), p.typ())
-}
-
-func (p *importer) tuple() *types.Tuple {
-	vars := make([]*types.Var, p.int())
-	for i := range vars {
-		vars[i] = p.param()
-	}
-	return types.NewTuple(vars...)
-}
-
-// ----------------------------------------------------------------------------
-// decoders
-
-func (p *importer) string() string {
-	return string(p.bytes())
-}
-
-func (p *importer) int() int {
-	return int(p.int64())
-}
-
-func (p *importer) int64() int64 {
-	if debug {
-		p.marker('i')
-	}
-
-	return p.rawInt64()
-}
-
-// Note: bytes() returns the respective byte slice w/o copy.
-func (p *importer) bytes() []byte {
-	if debug {
-		p.marker('b')
-	}
-
-	var b []byte
-	if n := int(p.rawInt64()); n > 0 {
-		b = p.data[:n]
-		p.data = p.data[n:]
-	}
-	return b
-}
-
-func (p *importer) marker(want byte) {
-	if debug {
-		if got := p.data[0]; got != want {
-			panic(fmt.Sprintf("incorrect marker: got %c; want %c (pos = %d)", got, want, p.consumed()))
-		}
-		p.data = p.data[1:]
-
-		pos := p.consumed()
-		if n := int(p.rawInt64()); n != pos {
-			panic(fmt.Sprintf("incorrect position: got %d; want %d", n, pos))
-		}
-	}
-}
-
-// rawInt64 should only be used by low-level decoders
-func (p *importer) rawInt64() int64 {
-	i, n := binary.Varint(p.data)
-	p.data = p.data[n:]
-	return i
-}
-
-func (p *importer) consumed() int {
-	return p.datalen - len(p.data)
-}
diff --git a/third_party/gotools/go/importer/import_test.go b/third_party/gotools/go/importer/import_test.go
deleted file mode 100644
index 4fb2d5f..0000000
--- a/third_party/gotools/go/importer/import_test.go
+++ /dev/null
@@ -1,382 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package importer
-
-import (
-	"bufio"
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/build"
-	"go/parser"
-	"go/token"
-	"os"
-	"path/filepath"
-	"runtime"
-	"sort"
-	"strconv"
-	"testing"
-	"time"
-
-	"llvm.org/llgo/third_party/gotools/go/gcimporter"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var fset = token.NewFileSet()
-
-var tests = []string{
-	`package p`,
-
-	// consts
-	`package p; const X = true`,
-	`package p; const X, y, Z = true, false, 0 != 0`,
-	`package p; const ( A float32 = 1<<iota; B; C; D)`,
-	`package p; const X = "foo"`,
-	`package p; const X string = "foo"`,
-	`package p; const X = 0`,
-	`package p; const X = -42`,
-	`package p; const X = 3.14159265`,
-	`package p; const X = -1e-10`,
-	`package p; const X = 1.2 + 2.3i`,
-	`package p; const X = -1i`,
-	`package p; import "math"; const Pi = math.Pi`,
-	`package p; import m "math"; const Pi = m.Pi`,
-
-	// types
-	`package p; type T int`,
-	`package p; type T [10]int`,
-	`package p; type T []int`,
-	`package p; type T struct{}`,
-	`package p; type T struct{x int}`,
-	`package p; type T *int`,
-	`package p; type T func()`,
-	`package p; type T *T`,
-	`package p; type T interface{}`,
-	`package p; type T interface{ foo() }`,
-	`package p; type T interface{ m() T }`,
-	// TODO(gri) disabled for now - import/export works but
-	// types.Type.String() used in the test cannot handle cases
-	// like this yet
-	// `package p; type T interface{ m() interface{T} }`,
-	`package p; type T map[string]bool`,
-	`package p; type T chan int`,
-	`package p; type T <-chan complex64`,
-	`package p; type T chan<- map[int]string`,
-	// test case for issue 8177
-	`package p; type T1 interface { F(T2) }; type T2 interface { T1 }`,
-
-	// vars
-	`package p; var X int`,
-	`package p; var X, Y, Z struct{f int "tag"}`,
-
-	// funcs
-	`package p; func F()`,
-	`package p; func F(x int, y struct{}) bool`,
-	`package p; type T int; func (*T) F(x int, y struct{}) T`,
-
-	// selected special cases
-	`package p; type T int`,
-	`package p; type T uint8`,
-	`package p; type T byte`,
-	`package p; type T error`,
-	`package p; import "net/http"; type T http.Client`,
-	`package p; import "net/http"; type ( T1 http.Client; T2 struct { http.Client } )`,
-	`package p; import "unsafe"; type ( T1 unsafe.Pointer; T2 unsafe.Pointer )`,
-	`package p; import "unsafe"; type T struct { p unsafe.Pointer }`,
-}
-
-func TestImportSrc(t *testing.T) {
-	for _, src := range tests {
-		pkg, err := pkgForSource(src)
-		if err != nil {
-			t.Errorf("typecheck failed: %s", err)
-			continue
-		}
-		testExportImport(t, pkg, "")
-	}
-}
-
-func TestImportStdLib(t *testing.T) {
-	start := time.Now()
-
-	libs, err := stdLibs()
-	if err != nil {
-		t.Fatalf("could not compute list of std libraries: %s", err)
-	}
-	if len(libs) < 100 {
-		t.Fatalf("only %d std libraries found - something's not right", len(libs))
-	}
-
-	// make sure printed go/types types and gc-imported types
-	// can be compared reasonably well
-	types.GcCompatibilityMode = true
-
-	var totSize, totGcSize int
-	for _, lib := range libs {
-		// limit run time for short tests
-		if testing.Short() && time.Since(start) >= 750*time.Millisecond {
-			return
-		}
-
-		pkg, err := pkgForPath(lib)
-		switch err := err.(type) {
-		case nil:
-			// ok
-		case *build.NoGoError:
-			// no Go files - ignore
-			continue
-		default:
-			t.Errorf("typecheck failed: %s", err)
-			continue
-		}
-
-		size, gcsize := testExportImport(t, pkg, lib)
-		if gcsize == 0 {
-			// if gc import didn't happen, assume same size
-			// (and avoid division by zero below)
-			gcsize = size
-		}
-
-		if testing.Verbose() {
-			fmt.Printf("%s\t%d\t%d\t%d%%\n", lib, size, gcsize, int(float64(size)*100/float64(gcsize)))
-		}
-		totSize += size
-		totGcSize += gcsize
-	}
-
-	if testing.Verbose() {
-		fmt.Printf("\n%d\t%d\t%d%%\n", totSize, totGcSize, int(float64(totSize)*100/float64(totGcSize)))
-	}
-
-	types.GcCompatibilityMode = false
-}
-
-func testExportImport(t *testing.T, pkg0 *types.Package, path string) (size, gcsize int) {
-	data := ExportData(pkg0)
-	size = len(data)
-
-	imports := make(map[string]*types.Package)
-	n, pkg1, err := ImportData(imports, data)
-	if err != nil {
-		t.Errorf("package %s: import failed: %s", pkg0.Name(), err)
-		return
-	}
-	if n != size {
-		t.Errorf("package %s: not all input data consumed", pkg0.Name())
-		return
-	}
-
-	s0 := pkgString(pkg0)
-	s1 := pkgString(pkg1)
-	if s1 != s0 {
-		t.Errorf("package %s: \nimport got:\n%s\nwant:\n%s\n", pkg0.Name(), s1, s0)
-	}
-
-	// If we have a standard library, compare also against the gcimported package.
-	if path == "" {
-		return // not std library
-	}
-
-	gcdata, err := gcExportData(path)
-	if err != nil {
-		if pkg0.Name() == "main" {
-			return // no export data present for main package
-		}
-		t.Errorf("package %s: couldn't get export data: %s", pkg0.Name(), err)
-	}
-	gcsize = len(gcdata)
-
-	imports = make(map[string]*types.Package)
-	pkg2, err := gcImportData(imports, gcdata, path)
-	if err != nil {
-		t.Errorf("package %s: gcimport failed: %s", pkg0.Name(), err)
-		return
-	}
-
-	s2 := pkgString(pkg2)
-	if s2 != s0 {
-		t.Errorf("package %s: \ngcimport got:\n%s\nwant:\n%s\n", pkg0.Name(), s2, s0)
-	}
-
-	return
-}
-
-func pkgForSource(src string) (*types.Package, error) {
-	f, err := parser.ParseFile(fset, "", src, 0)
-	if err != nil {
-		return nil, err
-	}
-	return typecheck("import-test", f)
-}
-
-func pkgForPath(path string) (*types.Package, error) {
-	// collect filenames
-	ctxt := build.Default
-	pkginfo, err := ctxt.Import(path, "", 0)
-	if err != nil {
-		return nil, err
-	}
-	filenames := append(pkginfo.GoFiles, pkginfo.CgoFiles...)
-
-	// parse files
-	files := make([]*ast.File, len(filenames))
-	for i, filename := range filenames {
-		var err error
-		files[i], err = parser.ParseFile(fset, filepath.Join(pkginfo.Dir, filename), nil, 0)
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	return typecheck(path, files...)
-}
-
-var defaultConf = types.Config{
-	// we only care about exports and thus can ignore function bodies
-	IgnoreFuncBodies: true,
-	// work around C imports if possible
-	FakeImportC: true,
-	// strconv exports IntSize as a constant. The type-checker must
-	// use the same word size otherwise the result of the type-checker
-	// and gc imports is different. We don't care about alignment
-	// since none of the tests have exported constants depending
-	// on alignment (see also issue 8366).
-	Sizes: &types.StdSizes{WordSize: strconv.IntSize / 8, MaxAlign: 8},
-}
-
-func typecheck(path string, files ...*ast.File) (*types.Package, error) {
-	return defaultConf.Check(path, fset, files, nil)
-}
-
-// pkgString returns a string representation of a package's exported interface.
-func pkgString(pkg *types.Package) string {
-	var buf bytes.Buffer
-
-	fmt.Fprintf(&buf, "package %s\n", pkg.Name())
-
-	scope := pkg.Scope()
-	for _, name := range scope.Names() {
-		if exported(name) {
-			obj := scope.Lookup(name)
-			buf.WriteString(obj.String())
-
-			switch obj := obj.(type) {
-			case *types.Const:
-				// For now only print constant values if they are not float
-				// or complex. This permits comparing go/types results with
-				// gc-generated gcimported package interfaces.
-				info := obj.Type().Underlying().(*types.Basic).Info()
-				if info&types.IsFloat == 0 && info&types.IsComplex == 0 {
-					fmt.Fprintf(&buf, " = %s", obj.Val())
-				}
-
-			case *types.TypeName:
-				// Print associated methods.
-				// Basic types (e.g., unsafe.Pointer) have *types.Basic
-				// type rather than *types.Named; so we need to check.
-				if typ, _ := obj.Type().(*types.Named); typ != nil {
-					if n := typ.NumMethods(); n > 0 {
-						// Sort methods by name so that we get the
-						// same order independent of whether the
-						// methods got imported or coming directly
-						// for the source.
-						// TODO(gri) This should probably be done
-						// in go/types.
-						list := make([]*types.Func, n)
-						for i := 0; i < n; i++ {
-							list[i] = typ.Method(i)
-						}
-						sort.Sort(byName(list))
-
-						buf.WriteString("\nmethods (\n")
-						for _, m := range list {
-							fmt.Fprintf(&buf, "\t%s\n", m)
-						}
-						buf.WriteString(")")
-					}
-				}
-			}
-			buf.WriteByte('\n')
-		}
-	}
-
-	return buf.String()
-}
-
-var stdLibRoot = filepath.Join(runtime.GOROOT(), "src") + string(filepath.Separator)
-
-// The following std libraries are excluded from the stdLibs list.
-var excluded = map[string]bool{
-	"builtin": true, // contains type declarations with cycles
-	"unsafe":  true, // contains fake declarations
-}
-
-// stdLibs returns the list of standard library package paths.
-func stdLibs() (list []string, err error) {
-	err = filepath.Walk(stdLibRoot, func(path string, info os.FileInfo, err error) error {
-		if err == nil && info.IsDir() {
-			// testdata directories don't contain importable libraries
-			if info.Name() == "testdata" {
-				return filepath.SkipDir
-			}
-			pkgPath := path[len(stdLibRoot):] // remove stdLibRoot
-			if len(pkgPath) > 0 && !excluded[pkgPath] {
-				list = append(list, pkgPath)
-			}
-		}
-		return nil
-	})
-	return
-}
-
-type byName []*types.Func
-
-func (a byName) Len() int           { return len(a) }
-func (a byName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-func (a byName) Less(i, j int) bool { return a[i].Name() < a[j].Name() }
-
-// gcExportData returns the gc-generated export data for the given path.
-// It is based on a trimmed-down version of gcimporter.Import which does
-// not do the actual import, does not handle package unsafe, and assumes
-// that path is a correct standard library package path (no canonicalization,
-// or handling of local import paths).
-func gcExportData(path string) ([]byte, error) {
-	filename, id := gcimporter.FindPkg(path, "")
-	if filename == "" {
-		return nil, fmt.Errorf("can't find import: %s", path)
-	}
-	if id != path {
-		panic("path should be canonicalized")
-	}
-
-	f, err := os.Open(filename)
-	if err != nil {
-		return nil, err
-	}
-	defer f.Close()
-
-	buf := bufio.NewReader(f)
-	if err = gcimporter.FindExportData(buf); err != nil {
-		return nil, err
-	}
-
-	var data []byte
-	for {
-		line, err := buf.ReadBytes('\n')
-		if err != nil {
-			return nil, err
-		}
-		data = append(data, line...)
-		// export data ends in "$$\n"
-		if len(line) == 3 && line[0] == '$' && line[1] == '$' {
-			return data, nil
-		}
-	}
-}
-
-func gcImportData(imports map[string]*types.Package, data []byte, path string) (*types.Package, error) {
-	filename := fmt.Sprintf("<filename for %s>", path) // so we have a decent error message if necessary
-	return gcimporter.ImportData(imports, filename, path, bufio.NewReader(bytes.NewBuffer(data)))
-}
diff --git a/third_party/gotools/go/importer/predefined.go b/third_party/gotools/go/importer/predefined.go
deleted file mode 100644
index 2d35474..0000000
--- a/third_party/gotools/go/importer/predefined.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package importer
-
-import "llvm.org/llgo/third_party/gotools/go/types"
-
-const (
-	magic   = "\n$$ exports $$\n"
-	version = "v0"
-)
-
-// Tags. Must be < 0.
-const (
-	// Packages
-	packageTag = -(iota + 1)
-
-	// Objects
-	constTag
-	typeTag
-	varTag
-	funcTag
-
-	// Types
-	arrayTag
-	sliceTag
-	structTag
-	pointerTag
-	signatureTag
-	interfaceTag
-	mapTag
-	chanTag
-	namedTag
-
-	// Values
-	falseTag
-	trueTag
-	int64Tag
-	floatTag
-	fractionTag
-	complexTag
-	stringTag
-)
-
-var predeclared = []types.Type{
-	// basic types
-	types.Typ[types.Bool],
-	types.Typ[types.Int],
-	types.Typ[types.Int8],
-	types.Typ[types.Int16],
-	types.Typ[types.Int32],
-	types.Typ[types.Int64],
-	types.Typ[types.Uint],
-	types.Typ[types.Uint8],
-	types.Typ[types.Uint16],
-	types.Typ[types.Uint32],
-	types.Typ[types.Uint64],
-	types.Typ[types.Uintptr],
-	types.Typ[types.Float32],
-	types.Typ[types.Float64],
-	types.Typ[types.Complex64],
-	types.Typ[types.Complex128],
-	types.Typ[types.String],
-
-	// untyped types
-	types.Typ[types.UntypedBool],
-	types.Typ[types.UntypedInt],
-	types.Typ[types.UntypedRune],
-	types.Typ[types.UntypedFloat],
-	types.Typ[types.UntypedComplex],
-	types.Typ[types.UntypedString],
-	types.Typ[types.UntypedNil],
-
-	// package unsafe
-	types.Typ[types.UnsafePointer],
-
-	// aliases
-	types.UniverseByte,
-	types.UniverseRune,
-
-	types.Universe.Lookup("error").Type(),
-}
diff --git a/third_party/gotools/go/loader/cgo.go b/third_party/gotools/go/loader/cgo.go
deleted file mode 100644
index 299e725..0000000
--- a/third_party/gotools/go/loader/cgo.go
+++ /dev/null
@@ -1,199 +0,0 @@
-package loader
-
-// This file handles cgo preprocessing of files containing `import "C"`.
-//
-// DESIGN
-//
-// The approach taken is to run the cgo processor on the package's
-// CgoFiles and parse the output, faking the filenames of the
-// resulting ASTs so that the synthetic file containing the C types is
-// called "C" (e.g. "~/go/src/net/C") and the preprocessed files
-// have their original names (e.g. "~/go/src/net/cgo_unix.go"),
-// not the names of the actual temporary files.
-//
-// The advantage of this approach is its fidelity to 'go build'.  The
-// downside is that the token.Position.Offset for each AST node is
-// incorrect, being an offset within the temporary file.  Line numbers
-// should still be correct because of the //line comments.
-//
-// The logic of this file is mostly plundered from the 'go build'
-// tool, which also invokes the cgo preprocessor.
-//
-//
-// REJECTED ALTERNATIVE
-//
-// An alternative approach that we explored is to extend go/types'
-// Importer mechanism to provide the identity of the importing package
-// so that each time `import "C"` appears it resolves to a different
-// synthetic package containing just the objects needed in that case.
-// The loader would invoke cgo but parse only the cgo_types.go file
-// defining the package-level objects, discarding the other files
-// resulting from preprocessing.
-//
-// The benefit of this approach would have been that source-level
-// syntax information would correspond exactly to the original cgo
-// file, with no preprocessing involved, making source tools like
-// godoc, oracle, and eg happy.  However, the approach was rejected
-// due to the additional complexity it would impose on go/types.  (It
-// made for a beautiful demo, though.)
-//
-// cgo files, despite their *.go extension, are not legal Go source
-// files per the specification since they may refer to unexported
-// members of package "C" such as C.int.  Also, a function such as
-// C.getpwent has in effect two types, one matching its C type and one
-// which additionally returns (errno C.int).  The cgo preprocessor
-// uses name mangling to distinguish these two functions in the
-// processed code, but go/types would need to duplicate this logic in
-// its handling of function calls, analogous to the treatment of map
-// lookups in which y=m[k] and y,ok=m[k] are both legal.
-
-import (
-	"fmt"
-	"go/ast"
-	"go/build"
-	"go/parser"
-	"go/token"
-	"io/ioutil"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"regexp"
-	"strings"
-)
-
-// processCgoFiles invokes the cgo preprocessor on bp.CgoFiles, parses
-// the output and returns the resulting ASTs.
-//
-func processCgoFiles(bp *build.Package, fset *token.FileSet, DisplayPath func(path string) string, mode parser.Mode) ([]*ast.File, error) {
-	tmpdir, err := ioutil.TempDir("", strings.Replace(bp.ImportPath, "/", "_", -1)+"_C")
-	if err != nil {
-		return nil, err
-	}
-	defer os.RemoveAll(tmpdir)
-
-	pkgdir := bp.Dir
-	if DisplayPath != nil {
-		pkgdir = DisplayPath(pkgdir)
-	}
-
-	cgoFiles, cgoDisplayFiles, err := runCgo(bp, pkgdir, tmpdir)
-	if err != nil {
-		return nil, err
-	}
-	var files []*ast.File
-	for i := range cgoFiles {
-		rd, err := os.Open(cgoFiles[i])
-		if err != nil {
-			return nil, err
-		}
-		defer rd.Close()
-		display := filepath.Join(bp.Dir, cgoDisplayFiles[i])
-		f, err := parser.ParseFile(fset, display, rd, mode)
-		if err != nil {
-			return nil, err
-		}
-		files = append(files, f)
-	}
-	return files, nil
-}
-
-var cgoRe = regexp.MustCompile(`[/\\:]`)
-
-// runCgo invokes the cgo preprocessor on bp.CgoFiles and returns two
-// lists of files: the resulting processed files (in temporary
-// directory tmpdir) and the corresponding names of the unprocessed files.
-//
-// runCgo is adapted from (*builder).cgo in
-// $GOROOT/src/cmd/go/build.go, but these features are unsupported:
-// pkg-config, Objective C, CGOPKGPATH, CGO_FLAGS.
-//
-func runCgo(bp *build.Package, pkgdir, tmpdir string) (files, displayFiles []string, err error) {
-	cgoCPPFLAGS, _, _, _ := cflags(bp, true)
-	_, cgoexeCFLAGS, _, _ := cflags(bp, false)
-
-	if len(bp.CgoPkgConfig) > 0 {
-		return nil, nil, fmt.Errorf("cgo pkg-config not supported")
-	}
-
-	// Allows including _cgo_export.h from .[ch] files in the package.
-	cgoCPPFLAGS = append(cgoCPPFLAGS, "-I", tmpdir)
-
-	// _cgo_gotypes.go (displayed "C") contains the type definitions.
-	files = append(files, filepath.Join(tmpdir, "_cgo_gotypes.go"))
-	displayFiles = append(displayFiles, "C")
-	for _, fn := range bp.CgoFiles {
-		// "foo.cgo1.go" (displayed "foo.go") is the processed Go source.
-		f := cgoRe.ReplaceAllString(fn[:len(fn)-len("go")], "_")
-		files = append(files, filepath.Join(tmpdir, f+"cgo1.go"))
-		displayFiles = append(displayFiles, fn)
-	}
-
-	var cgoflags []string
-	if bp.Goroot && bp.ImportPath == "runtime/cgo" {
-		cgoflags = append(cgoflags, "-import_runtime_cgo=false")
-	}
-	if bp.Goroot && bp.ImportPath == "runtime/race" || bp.ImportPath == "runtime/cgo" {
-		cgoflags = append(cgoflags, "-import_syscall=false")
-	}
-
-	args := stringList(
-		"go", "tool", "cgo", "-objdir", tmpdir, cgoflags, "--",
-		cgoCPPFLAGS, cgoexeCFLAGS, bp.CgoFiles,
-	)
-	if false {
-		log.Printf("Running cgo for package %q: %s (dir=%s)", bp.ImportPath, args, pkgdir)
-	}
-	cmd := exec.Command(args[0], args[1:]...)
-	cmd.Dir = pkgdir
-	cmd.Stdout = os.Stderr
-	cmd.Stderr = os.Stderr
-	if err := cmd.Run(); err != nil {
-		return nil, nil, fmt.Errorf("cgo failed: %s: %s", args, err)
-	}
-
-	return files, displayFiles, nil
-}
-
-// -- unmodified from 'go build' ---------------------------------------
-
-// Return the flags to use when invoking the C or C++ compilers, or cgo.
-func cflags(p *build.Package, def bool) (cppflags, cflags, cxxflags, ldflags []string) {
-	var defaults string
-	if def {
-		defaults = "-g -O2"
-	}
-
-	cppflags = stringList(envList("CGO_CPPFLAGS", ""), p.CgoCPPFLAGS)
-	cflags = stringList(envList("CGO_CFLAGS", defaults), p.CgoCFLAGS)
-	cxxflags = stringList(envList("CGO_CXXFLAGS", defaults), p.CgoCXXFLAGS)
-	ldflags = stringList(envList("CGO_LDFLAGS", defaults), p.CgoLDFLAGS)
-	return
-}
-
-// envList returns the value of the given environment variable broken
-// into fields, using the default value when the variable is empty.
-func envList(key, def string) []string {
-	v := os.Getenv(key)
-	if v == "" {
-		v = def
-	}
-	return strings.Fields(v)
-}
-
-// stringList's arguments should be a sequence of string or []string values.
-// stringList flattens them into a single []string.
-func stringList(args ...interface{}) []string {
-	var x []string
-	for _, arg := range args {
-		switch arg := arg.(type) {
-		case []string:
-			x = append(x, arg...)
-		case string:
-			x = append(x, arg)
-		default:
-			panic("stringList: invalid argument")
-		}
-	}
-	return x
-}
diff --git a/third_party/gotools/go/loader/loader.go b/third_party/gotools/go/loader/loader.go
deleted file mode 100644
index abe64fe..0000000
--- a/third_party/gotools/go/loader/loader.go
+++ /dev/null
@@ -1,1180 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package loader loads, parses and type-checks packages of Go code
-// plus their transitive closure, and retains both the ASTs and the
-// derived facts.
-//
-// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE.
-//
-// The package defines two primary types: Config, which specifies a
-// set of initial packages to load and various other options; and
-// Program, which is the result of successfully loading the packages
-// specified by a configuration.
-//
-// The configuration can be set directly, but *Config provides various
-// convenience methods to simplify the common cases, each of which can
-// be called any number of times.  Finally, these are followed by a
-// call to Load() to actually load and type-check the program.
-//
-//      var conf loader.Config
-//
-//      // Use the command-line arguments to specify
-//      // a set of initial packages to load from source.
-//      // See FromArgsUsage for help.
-//      rest, err := conf.FromArgs(os.Args[1:], wantTests)
-//
-//      // Parse the specified files and create an ad-hoc package with path "foo".
-//      // All files must have the same 'package' declaration.
-//      conf.CreateFromFilenames("foo", "foo.go", "bar.go")
-//
-//      // Create an ad-hoc package with path "foo" from
-//      // the specified already-parsed files.
-//      // All ASTs must have the same 'package' declaration.
-//      conf.CreateFromFiles("foo", parsedFiles)
-//
-//      // Add "runtime" to the set of packages to be loaded.
-//      conf.Import("runtime")
-//
-//      // Adds "fmt" and "fmt_test" to the set of packages
-//      // to be loaded.  "fmt" will include *_test.go files.
-//      conf.ImportWithTests("fmt")
-//
-//      // Finally, load all the packages specified by the configuration.
-//      prog, err := conf.Load()
-//
-//
-// CONCEPTS AND TERMINOLOGY
-//
-// An AD-HOC package is one specified as a set of source files on the
-// command line.  In the simplest case, it may consist of a single file
-// such as $GOROOT/src/net/http/triv.go.
-//
-// EXTERNAL TEST packages are those comprised of a set of *_test.go
-// files all with the same 'package foo_test' declaration, all in the
-// same directory.  (go/build.Package calls these files XTestFiles.)
-//
-// An IMPORTABLE package is one that can be referred to by some import
-// spec.  The Path() of each importable package is unique within a
-// Program.
-//
-// Ad-hoc packages and external test packages are NON-IMPORTABLE.  The
-// Path() of an ad-hoc package is inferred from the package
-// declarations of its files and is therefore not a unique package key.
-// For example, Config.CreatePkgs may specify two initial ad-hoc
-// packages both called "main".
-//
-// An AUGMENTED package is an importable package P plus all the
-// *_test.go files with same 'package foo' declaration as P.
-// (go/build.Package calls these files TestFiles.)
-//
-// The INITIAL packages are those specified in the configuration.  A
-// DEPENDENCY is a package loaded to satisfy an import in an initial
-// package or another dependency.
-//
-package loader
-
-// 'go test', in-package test files, and import cycles
-// ---------------------------------------------------
-//
-// An external test package may depend upon members of the augmented
-// package that are not in the unaugmented package, such as functions
-// that expose internals.  (See bufio/export_test.go for an example.)
-// So, the loader must ensure that for each external test package
-// it loads, it also augments the corresponding non-test package.
-//
-// The import graph over n unaugmented packages must be acyclic; the
-// import graph over n-1 unaugmented packages plus one augmented
-// package must also be acyclic.  ('go test' relies on this.)  But the
-// import graph over n augmented packages may contain cycles.
-//
-// First, all the (unaugmented) non-test packages and their
-// dependencies are imported in the usual way; the loader reports an
-// error if it detects an import cycle.
-//
-// Then, each package P for which testing is desired is augmented by
-// the list P' of its in-package test files, by calling
-// (*types.Checker).Files.  This arrangement ensures that P' may
-// reference definitions within P, but P may not reference definitions
-// within P'.  Furthermore, P' may import any other package, including
-// ones that depend upon P, without an import cycle error.
-//
-// Consider two packages A and B, both of which have lists of
-// in-package test files we'll call A' and B', and which have the
-// following import graph edges:
-//    B  imports A
-//    B' imports A
-//    A' imports B
-// This last edge would be expected to create an error were it not
-// for the special type-checking discipline above.
-// Cycles of size greater than two are possible.  For example:
-//   compress/bzip2/bzip2_test.go (package bzip2)  imports "io/ioutil"
-//   io/ioutil/tempfile_test.go   (package ioutil) imports "regexp"
-//   regexp/exec_test.go          (package regexp) imports "compress/bzip2"
-//
-//
-// Concurrency
-// -----------
-//
-// Let us define the import dependency graph as follows.  Each node is a
-// list of files passed to (Checker).Files at once.  Many of these lists
-// are the production code of an importable Go package, so those nodes
-// are labelled by the package's import path.  The remaining nodes are
-// ad-hoc packages and lists of in-package *_test.go files that augment
-// an importable package; those nodes have no label.
-//
-// The edges of the graph represent import statements appearing within a
-// file.  An edge connects a node (a list of files) to the node it
-// imports, which is importable and thus always labelled.
-//
-// Loading is controlled by this dependency graph.
-//
-// To reduce I/O latency, we start loading a package's dependencies
-// asynchronously as soon as we've parsed its files and enumerated its
-// imports (scanImports).  This performs a preorder traversal of the
-// import dependency graph.
-//
-// To exploit hardware parallelism, we type-check unrelated packages in
-// parallel, where "unrelated" means not ordered by the partial order of
-// the import dependency graph.
-//
-// We use a concurrency-safe blocking cache (importer.imported) to
-// record the results of type-checking, whether success or failure.  An
-// entry is created in this cache by startLoad the first time the
-// package is imported.  The first goroutine to request an entry becomes
-// responsible for completing the task and broadcasting completion to
-// subsequent requestors, which block until then.
-//
-// Type checking occurs in (parallel) postorder: we cannot type-check a
-// set of files until we have loaded and type-checked all of their
-// immediate dependencies (and thus all of their transitive
-// dependencies). If the input were guaranteed free of import cycles,
-// this would be trivial: we could simply wait for completion of the
-// dependencies and then invoke the typechecker.
-//
-// But as we saw in the 'go test' section above, some cycles in the
-// import graph over packages are actually legal, so long as the
-// cycle-forming edge originates in the in-package test files that
-// augment the package.  This explains why the nodes of the import
-// dependency graph are not packages, but lists of files: the unlabelled
-// nodes avoid the cycles.  Consider packages A and B where B imports A
-// and A's in-package tests AT import B.  The naively constructed import
-// graph over packages would contain a cycle (A+AT) --> B --> (A+AT) but
-// the graph over lists of files is AT --> B --> A, where AT is an
-// unlabelled node.
-//
-// Awaiting completion of the dependencies in a cyclic graph would
-// deadlock, so we must materialize the import dependency graph (as
-// importer.graph) and check whether each import edge forms a cycle.  If
-// x imports y, and the graph already contains a path from y to x, then
-// there is an import cycle, in which case the processing of x must not
-// wait for the completion of processing of y.
-//
-// When the type-checker makes a callback (doImport) to the loader for a
-// given import edge, there are two possible cases.  In the normal case,
-// the dependency has already been completely type-checked; doImport
-// does a cache lookup and returns it.  In the cyclic case, the entry in
-// the cache is still necessarily incomplete, indicating a cycle.  We
-// perform the cycle check again to obtain the error message, and return
-// the error.
-//
-// The result of using concurrency is about a 2.5x speedup for stdlib_test.
-
-// TODO(adonovan):
-// - cache the calls to build.Import so we don't do it three times per
-//   test package.
-// - Thorough overhaul of package documentation.
-
-import (
-	"errors"
-	"fmt"
-	"go/ast"
-	"go/build"
-	"go/parser"
-	"go/token"
-	"os"
-	"sort"
-	"strings"
-	"sync"
-	"time"
-
-	"llvm.org/llgo/third_party/gotools/go/ast/astutil"
-	"llvm.org/llgo/third_party/gotools/go/gcimporter"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-const trace = false // show timing info for type-checking
-
-// Config specifies the configuration for a program to load.
-// The zero value for Config is a ready-to-use default configuration.
-type Config struct {
-	// Fset is the file set for the parser to use when loading the
-	// program.  If nil, it may be lazily initialized by any
-	// method of Config.
-	Fset *token.FileSet
-
-	// ParserMode specifies the mode to be used by the parser when
-	// loading source packages.
-	ParserMode parser.Mode
-
-	// TypeChecker contains options relating to the type checker.
-	//
-	// The supplied IgnoreFuncBodies is not used; the effective
-	// value comes from the TypeCheckFuncBodies func below.
-	//
-	// TypeChecker.Packages is lazily initialized during Load.
-	TypeChecker types.Config
-
-	// TypeCheckFuncBodies is a predicate over package import
-	// paths.  A package for which the predicate is false will
-	// have its package-level declarations type checked, but not
-	// its function bodies; this can be used to quickly load
-	// dependencies from source.  If nil, all func bodies are type
-	// checked.
-	TypeCheckFuncBodies func(string) bool
-
-	// ImportFromBinary determines whether to satisfy dependencies by
-	// loading gc export data instead of Go source code.
-	//
-	// If false, the entire program---the initial packages and their
-	// transitive closure of dependencies---will be loaded from
-	// source, parsed, and type-checked.  This is required for
-	// whole-program analyses such as pointer analysis.
-	//
-	// If true, the go/gcimporter mechanism is used instead to read
-	// the binary export-data files written by the gc toolchain.
-	// They supply only the types of package-level declarations and
-	// values of constants, but no code, this option will not yield
-	// a whole program.  It is intended for analyses that perform
-	// modular analysis of a single package, e.g. traditional
-	// compilation.
-	//
-	// No check is made that the export data files are up-to-date.
-	//
-	// The initial packages (CreatePkgs and ImportPkgs) are always
-	// loaded from Go source, regardless of this flag's setting.
-	//
-	// NB: there is a bug when loading multiple initial packages with
-	// this flag enabled: https://github.com/golang/go/issues/9955.
-	ImportFromBinary bool
-
-	// If Build is non-nil, it is used to locate source packages.
-	// Otherwise &build.Default is used.
-	//
-	// By default, cgo is invoked to preprocess Go files that
-	// import the fake package "C".  This behaviour can be
-	// disabled by setting CGO_ENABLED=0 in the environment prior
-	// to startup, or by setting Build.CgoEnabled=false.
-	Build *build.Context
-
-	// The current directory, used for resolving relative package
-	// references such as "./go/loader".  If empty, os.Getwd will be
-	// used instead.
-	Cwd string
-
-	// If DisplayPath is non-nil, it is used to transform each
-	// file name obtained from Build.Import().  This can be used
-	// to prevent a virtualized build.Config's file names from
-	// leaking into the user interface.
-	DisplayPath func(path string) string
-
-	// If AllowErrors is true, Load will return a Program even
-	// if some of the its packages contained I/O, parser or type
-	// errors; such errors are accessible via PackageInfo.Errors.  If
-	// false, Load will fail if any package had an error.
-	AllowErrors bool
-
-	// CreatePkgs specifies a list of non-importable initial
-	// packages to create.  The resulting packages will appear in
-	// the corresponding elements of the Program.Created slice.
-	CreatePkgs []PkgSpec
-
-	// ImportPkgs specifies a set of initial packages to load from
-	// source.  The map keys are package import paths, used to
-	// locate the package relative to $GOROOT.
-	//
-	// The map value indicates whether to load tests.  If true, Load
-	// will add and type-check two lists of files to the package:
-	// non-test files followed by in-package *_test.go files.  In
-	// addition, it will append the external test package (if any)
-	// to Program.Created.
-	ImportPkgs map[string]bool
-
-	// FindPackage is called during Load to create the build.Package
-	// for a given import path.  If nil, a default implementation
-	// based on ctxt.Import is used.  A client may use this hook to
-	// adapt to a proprietary build system that does not follow the
-	// "go build" layout conventions, for example.
-	//
-	// It must be safe to call concurrently from multiple goroutines.
-	FindPackage func(ctxt *build.Context, importPath string) (*build.Package, error)
-
-	// PackageCreated is a hook called when a types.Package
-	// is created but before it has been populated.
-	//
-	// The package's import Path() and Scope() are defined,
-	// but not its Name() since no package declaration has
-	// been seen yet.
-	//
-	// Clients may use this to insert synthetic items into
-	// the package scope, for example.
-	//
-	// It must be safe to call concurrently from multiple goroutines.
-	PackageCreated func(*types.Package)
-}
-
-// A PkgSpec specifies a non-importable package to be created by Load.
-// Files are processed first, but typically only one of Files and
-// Filenames is provided.  The path needn't be globally unique.
-//
-type PkgSpec struct {
-	Path      string      // import path ("" => use package declaration)
-	Files     []*ast.File // ASTs of already-parsed files
-	Filenames []string    // names of files to be parsed
-}
-
-// A Program is a Go program loaded from source or binary
-// as specified by a Config.
-type Program struct {
-	Fset *token.FileSet // the file set for this program
-
-	// Created[i] contains the initial package whose ASTs or
-	// filenames were supplied by Config.CreatePkgs[i], followed by
-	// the external test package, if any, of each package in
-	// Config.ImportPkgs ordered by ImportPath.
-	Created []*PackageInfo
-
-	// Imported contains the initially imported packages,
-	// as specified by Config.ImportPkgs.
-	Imported map[string]*PackageInfo
-
-	// ImportMap is the canonical mapping of import paths to
-	// packages used by the type-checker (Config.TypeChecker.Packages).
-	// It contains all Imported initial packages, but not Created
-	// ones, and all imported dependencies.
-	ImportMap map[string]*types.Package
-
-	// AllPackages contains the PackageInfo of every package
-	// encountered by Load: all initial packages and all
-	// dependencies, including incomplete ones.
-	AllPackages map[*types.Package]*PackageInfo
-}
-
-// PackageInfo holds the ASTs and facts derived by the type-checker
-// for a single package.
-//
-// Not mutated once exposed via the API.
-//
-type PackageInfo struct {
-	Pkg                   *types.Package
-	Importable            bool        // true if 'import "Pkg.Path()"' would resolve to this
-	TransitivelyErrorFree bool        // true if Pkg and all its dependencies are free of errors
-	Files                 []*ast.File // syntax trees for the package's files
-	Errors                []error     // non-nil if the package had errors
-	types.Info                        // type-checker deductions.
-
-	checker   *types.Checker // transient type-checker state
-	errorFunc func(error)
-}
-
-func (info *PackageInfo) String() string { return info.Pkg.Path() }
-
-func (info *PackageInfo) appendError(err error) {
-	if info.errorFunc != nil {
-		info.errorFunc(err)
-	} else {
-		fmt.Fprintln(os.Stderr, err)
-	}
-	info.Errors = append(info.Errors, err)
-}
-
-func (conf *Config) fset() *token.FileSet {
-	if conf.Fset == nil {
-		conf.Fset = token.NewFileSet()
-	}
-	return conf.Fset
-}
-
-// ParseFile is a convenience function (intended for testing) that invokes
-// the parser using the Config's FileSet, which is initialized if nil.
-//
-// src specifies the parser input as a string, []byte, or io.Reader, and
-// filename is its apparent name.  If src is nil, the contents of
-// filename are read from the file system.
-//
-func (conf *Config) ParseFile(filename string, src interface{}) (*ast.File, error) {
-	// TODO(adonovan): use conf.build() etc like parseFiles does.
-	return parser.ParseFile(conf.fset(), filename, src, conf.ParserMode)
-}
-
-// FromArgsUsage is a partial usage message that applications calling
-// FromArgs may wish to include in their -help output.
-const FromArgsUsage = `
-<args> is a list of arguments denoting a set of initial packages.
-It may take one of two forms:
-
-1. A list of *.go source files.
-
-   All of the specified files are loaded, parsed and type-checked
-   as a single package.  All the files must belong to the same directory.
-
-2. A list of import paths, each denoting a package.
-
-   The package's directory is found relative to the $GOROOT and
-   $GOPATH using similar logic to 'go build', and the *.go files in
-   that directory are loaded, parsed and type-checked as a single
-   package.
-
-   In addition, all *_test.go files in the directory are then loaded
-   and parsed.  Those files whose package declaration equals that of
-   the non-*_test.go files are included in the primary package.  Test
-   files whose package declaration ends with "_test" are type-checked
-   as another package, the 'external' test package, so that a single
-   import path may denote two packages.  (Whether this behaviour is
-   enabled is tool-specific, and may depend on additional flags.)
-
-A '--' argument terminates the list of packages.
-`
-
-// FromArgs interprets args as a set of initial packages to load from
-// source and updates the configuration.  It returns the list of
-// unconsumed arguments.
-//
-// It is intended for use in command-line interfaces that require a
-// set of initial packages to be specified; see FromArgsUsage message
-// for details.
-//
-// Only superficial errors are reported at this stage; errors dependent
-// on I/O are detected during Load.
-//
-func (conf *Config) FromArgs(args []string, xtest bool) ([]string, error) {
-	var rest []string
-	for i, arg := range args {
-		if arg == "--" {
-			rest = args[i+1:]
-			args = args[:i]
-			break // consume "--" and return the remaining args
-		}
-	}
-
-	if len(args) > 0 && strings.HasSuffix(args[0], ".go") {
-		// Assume args is a list of a *.go files
-		// denoting a single ad-hoc package.
-		for _, arg := range args {
-			if !strings.HasSuffix(arg, ".go") {
-				return nil, fmt.Errorf("named files must be .go files: %s", arg)
-			}
-		}
-		conf.CreateFromFilenames("", args...)
-	} else {
-		// Assume args are directories each denoting a
-		// package and (perhaps) an external test, iff xtest.
-		for _, arg := range args {
-			if xtest {
-				conf.ImportWithTests(arg)
-			} else {
-				conf.Import(arg)
-			}
-		}
-	}
-
-	return rest, nil
-}
-
-// CreateFromFilenames is a convenience function that adds
-// a conf.CreatePkgs entry to create a package of the specified *.go
-// files.
-//
-func (conf *Config) CreateFromFilenames(path string, filenames ...string) {
-	conf.CreatePkgs = append(conf.CreatePkgs, PkgSpec{Path: path, Filenames: filenames})
-}
-
-// CreateFromFiles is a convenience function that adds a conf.CreatePkgs
-// entry to create package of the specified path and parsed files.
-//
-func (conf *Config) CreateFromFiles(path string, files ...*ast.File) {
-	conf.CreatePkgs = append(conf.CreatePkgs, PkgSpec{Path: path, Files: files})
-}
-
-// ImportWithTests is a convenience function that adds path to
-// ImportPkgs, the set of initial source packages located relative to
-// $GOPATH.  The package will be augmented by any *_test.go files in
-// its directory that contain a "package x" (not "package x_test")
-// declaration.
-//
-// In addition, if any *_test.go files contain a "package x_test"
-// declaration, an additional package comprising just those files will
-// be added to CreatePkgs.
-//
-func (conf *Config) ImportWithTests(path string) { conf.addImport(path, true) }
-
-// Import is a convenience function that adds path to ImportPkgs, the
-// set of initial packages that will be imported from source.
-//
-func (conf *Config) Import(path string) { conf.addImport(path, false) }
-
-func (conf *Config) addImport(path string, tests bool) {
-	if path == "unsafe" {
-		return // ignore; not a real package
-	}
-	if conf.ImportPkgs == nil {
-		conf.ImportPkgs = make(map[string]bool)
-	}
-	conf.ImportPkgs[path] = conf.ImportPkgs[path] || tests
-}
-
-// PathEnclosingInterval returns the PackageInfo and ast.Node that
-// contain source interval [start, end), and all the node's ancestors
-// up to the AST root.  It searches all ast.Files of all packages in prog.
-// exact is defined as for astutil.PathEnclosingInterval.
-//
-// The zero value is returned if not found.
-//
-func (prog *Program) PathEnclosingInterval(start, end token.Pos) (pkg *PackageInfo, path []ast.Node, exact bool) {
-	for _, info := range prog.AllPackages {
-		for _, f := range info.Files {
-			if !tokenFileContainsPos(prog.Fset.File(f.Pos()), start) {
-				continue
-			}
-			if path, exact := astutil.PathEnclosingInterval(f, start, end); path != nil {
-				return info, path, exact
-			}
-		}
-	}
-	return nil, nil, false
-}
-
-// InitialPackages returns a new slice containing the set of initial
-// packages (Created + Imported) in unspecified order.
-//
-func (prog *Program) InitialPackages() []*PackageInfo {
-	infos := make([]*PackageInfo, 0, len(prog.Created)+len(prog.Imported))
-	infos = append(infos, prog.Created...)
-	for _, info := range prog.Imported {
-		infos = append(infos, info)
-	}
-	return infos
-}
-
-// ---------- Implementation ----------
-
-// importer holds the working state of the algorithm.
-type importer struct {
-	conf  *Config   // the client configuration
-	prog  *Program  // resulting program
-	start time.Time // for logging
-
-	// This mutex serializes access to prog.ImportMap (aka
-	// TypeChecker.Packages); we also use it for AllPackages.
-	//
-	// The TypeChecker.Packages map is not really used by this
-	// package, but may be used by the client's Import function,
-	// and by clients of the returned Program.
-	typecheckerMu sync.Mutex
-
-	importedMu sync.Mutex
-	imported   map[string]*importInfo // all imported packages (incl. failures) by import path
-
-	// import dependency graph: graph[x][y] => x imports y
-	//
-	// Since non-importable packages cannot be cyclic, we ignore
-	// their imports, thus we only need the subgraph over importable
-	// packages.  Nodes are identified by their import paths.
-	graphMu sync.Mutex
-	graph   map[string]map[string]bool
-}
-
-// importInfo tracks the success or failure of a single import.
-//
-// Upon completion, exactly one of info and err is non-nil:
-// info on successful creation of a package, err otherwise.
-// A successful package may still contain type errors.
-//
-type importInfo struct {
-	path     string       // import path
-	mu       sync.Mutex   // guards the following fields prior to completion
-	info     *PackageInfo // results of typechecking (including errors)
-	err      error        // reason for failure to create a package
-	complete sync.Cond    // complete condition is that one of info, err is non-nil.
-}
-
-// awaitCompletion blocks until ii is complete,
-// i.e. the info and err fields are safe to inspect without a lock.
-// It is concurrency-safe and idempotent.
-func (ii *importInfo) awaitCompletion() {
-	ii.mu.Lock()
-	for ii.info == nil && ii.err == nil {
-		ii.complete.Wait()
-	}
-	ii.mu.Unlock()
-}
-
-// Complete marks ii as complete.
-// Its info and err fields will not be subsequently updated.
-func (ii *importInfo) Complete(info *PackageInfo, err error) {
-	ii.mu.Lock()
-	ii.info = info
-	ii.err = err
-	ii.complete.Broadcast()
-	ii.mu.Unlock()
-}
-
-// Load creates the initial packages specified by conf.{Create,Import}Pkgs,
-// loading their dependencies packages as needed.
-//
-// On success, Load returns a Program containing a PackageInfo for
-// each package.  On failure, it returns an error.
-//
-// If AllowErrors is true, Load will return a Program even if some
-// packages contained I/O, parser or type errors, or if dependencies
-// were missing.  (Such errors are accessible via PackageInfo.Errors.  If
-// false, Load will fail if any package had an error.
-//
-// It is an error if no packages were loaded.
-//
-func (conf *Config) Load() (*Program, error) {
-	// Initialize by setting the conf's copy, so all copies of
-	// TypeChecker agree on the identity of the map.
-	if conf.TypeChecker.Packages == nil {
-		conf.TypeChecker.Packages = make(map[string]*types.Package)
-	}
-
-	// Create a simple default error handler for parse/type errors.
-	if conf.TypeChecker.Error == nil {
-		conf.TypeChecker.Error = func(e error) { fmt.Fprintln(os.Stderr, e) }
-	}
-
-	// Set default working directory for relative package references.
-	if conf.Cwd == "" {
-		var err error
-		conf.Cwd, err = os.Getwd()
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	// Install default FindPackage hook using go/build logic.
-	if conf.FindPackage == nil {
-		conf.FindPackage = func(ctxt *build.Context, path string) (*build.Package, error) {
-			bp, err := ctxt.Import(path, conf.Cwd, 0)
-			if _, ok := err.(*build.NoGoError); ok {
-				return bp, nil // empty directory is not an error
-			}
-			return bp, err
-		}
-	}
-
-	prog := &Program{
-		Fset:        conf.fset(),
-		Imported:    make(map[string]*PackageInfo),
-		ImportMap:   conf.TypeChecker.Packages,
-		AllPackages: make(map[*types.Package]*PackageInfo),
-	}
-
-	imp := importer{
-		conf:     conf,
-		prog:     prog,
-		imported: make(map[string]*importInfo),
-		start:    time.Now(),
-		graph:    make(map[string]map[string]bool),
-	}
-
-	// -- loading proper (concurrent phase) --------------------------------
-
-	var errpkgs []string // packages that contained errors
-
-	// Load the initially imported packages and their dependencies,
-	// in parallel.
-	for _, ii := range imp.loadAll("", conf.ImportPkgs) {
-		if ii.err != nil {
-			conf.TypeChecker.Error(ii.err) // failed to create package
-			errpkgs = append(errpkgs, ii.path)
-			continue
-		}
-		prog.Imported[ii.info.Pkg.Path()] = ii.info
-	}
-
-	// Augment the designated initial packages by their tests.
-	// Dependencies are loaded in parallel.
-	var xtestPkgs []*build.Package
-	for path, augment := range conf.ImportPkgs {
-		if !augment {
-			continue
-		}
-
-		bp, err := conf.FindPackage(conf.build(), path)
-		if err != nil {
-			// Package not found, or can't even parse package declaration.
-			// Already reported by previous loop; ignore it.
-			continue
-		}
-
-		// Needs external test package?
-		if len(bp.XTestGoFiles) > 0 {
-			xtestPkgs = append(xtestPkgs, bp)
-		}
-
-		imp.importedMu.Lock()           // (unnecessary, we're sequential here)
-		info := imp.imported[path].info // must be non-nil, see above
-		imp.importedMu.Unlock()
-
-		// Parse the in-package test files.
-		files, errs := imp.conf.parsePackageFiles(bp, 't')
-		for _, err := range errs {
-			info.appendError(err)
-		}
-
-		// The test files augmenting package P cannot be imported,
-		// but may import packages that import P,
-		// so we must disable the cycle check.
-		imp.addFiles(info, files, false)
-	}
-
-	createPkg := func(path string, files []*ast.File, errs []error) {
-		info := imp.newPackageInfo(path)
-		for _, err := range errs {
-			info.appendError(err)
-		}
-
-		// Ad-hoc packages are non-importable,
-		// so no cycle check is needed.
-		// addFiles loads dependencies in parallel.
-		imp.addFiles(info, files, false)
-		prog.Created = append(prog.Created, info)
-	}
-
-	// Create packages specified by conf.CreatePkgs.
-	for _, cp := range conf.CreatePkgs {
-		files, errs := parseFiles(conf.fset(), conf.build(), nil, ".", cp.Filenames, conf.ParserMode)
-		files = append(files, cp.Files...)
-
-		path := cp.Path
-		if path == "" {
-			if len(files) > 0 {
-				path = files[0].Name.Name
-			} else {
-				path = "(unnamed)"
-			}
-		}
-		createPkg(path, files, errs)
-	}
-
-	// Create external test packages.
-	sort.Sort(byImportPath(xtestPkgs))
-	for _, bp := range xtestPkgs {
-		files, errs := imp.conf.parsePackageFiles(bp, 'x')
-		createPkg(bp.ImportPath+"_test", files, errs)
-	}
-
-	// -- finishing up (sequential) ----------------------------------------
-
-	if len(prog.Imported)+len(prog.Created) == 0 {
-		return nil, errors.New("no initial packages were loaded")
-	}
-
-	// Create infos for indirectly imported packages.
-	// e.g. incomplete packages without syntax, loaded from export data.
-	for _, obj := range prog.ImportMap {
-		info := prog.AllPackages[obj]
-		if info == nil {
-			prog.AllPackages[obj] = &PackageInfo{Pkg: obj, Importable: true}
-		} else {
-			// finished
-			info.checker = nil
-			info.errorFunc = nil
-		}
-	}
-
-	if !conf.AllowErrors {
-		// Report errors in indirectly imported packages.
-		for _, info := range prog.AllPackages {
-			if len(info.Errors) > 0 {
-				errpkgs = append(errpkgs, info.Pkg.Path())
-			}
-		}
-		if errpkgs != nil {
-			var more string
-			if len(errpkgs) > 3 {
-				more = fmt.Sprintf(" and %d more", len(errpkgs)-3)
-				errpkgs = errpkgs[:3]
-			}
-			return nil, fmt.Errorf("couldn't load packages due to errors: %s%s",
-				strings.Join(errpkgs, ", "), more)
-		}
-	}
-
-	markErrorFreePackages(prog.AllPackages)
-
-	return prog, nil
-}
-
-type byImportPath []*build.Package
-
-func (b byImportPath) Len() int           { return len(b) }
-func (b byImportPath) Less(i, j int) bool { return b[i].ImportPath < b[j].ImportPath }
-func (b byImportPath) Swap(i, j int)      { b[i], b[j] = b[j], b[i] }
-
-// markErrorFreePackages sets the TransitivelyErrorFree flag on all
-// applicable packages.
-func markErrorFreePackages(allPackages map[*types.Package]*PackageInfo) {
-	// Build the transpose of the import graph.
-	importedBy := make(map[*types.Package]map[*types.Package]bool)
-	for P := range allPackages {
-		for _, Q := range P.Imports() {
-			clients, ok := importedBy[Q]
-			if !ok {
-				clients = make(map[*types.Package]bool)
-				importedBy[Q] = clients
-			}
-			clients[P] = true
-		}
-	}
-
-	// Find all packages reachable from some error package.
-	reachable := make(map[*types.Package]bool)
-	var visit func(*types.Package)
-	visit = func(p *types.Package) {
-		if !reachable[p] {
-			reachable[p] = true
-			for q := range importedBy[p] {
-				visit(q)
-			}
-		}
-	}
-	for _, info := range allPackages {
-		if len(info.Errors) > 0 {
-			visit(info.Pkg)
-		}
-	}
-
-	// Mark the others as "transitively error-free".
-	for _, info := range allPackages {
-		if !reachable[info.Pkg] {
-			info.TransitivelyErrorFree = true
-		}
-	}
-}
-
-// build returns the effective build context.
-func (conf *Config) build() *build.Context {
-	if conf.Build != nil {
-		return conf.Build
-	}
-	return &build.Default
-}
-
-// parsePackageFiles enumerates the files belonging to package path,
-// then loads, parses and returns them, plus a list of I/O or parse
-// errors that were encountered.
-//
-// 'which' indicates which files to include:
-//    'g': include non-test *.go source files (GoFiles + processed CgoFiles)
-//    't': include in-package *_test.go source files (TestGoFiles)
-//    'x': include external *_test.go source files. (XTestGoFiles)
-//
-func (conf *Config) parsePackageFiles(bp *build.Package, which rune) ([]*ast.File, []error) {
-	var filenames []string
-	switch which {
-	case 'g':
-		filenames = bp.GoFiles
-	case 't':
-		filenames = bp.TestGoFiles
-	case 'x':
-		filenames = bp.XTestGoFiles
-	default:
-		panic(which)
-	}
-
-	files, errs := parseFiles(conf.fset(), conf.build(), conf.DisplayPath, bp.Dir, filenames, conf.ParserMode)
-
-	// Preprocess CgoFiles and parse the outputs (sequentially).
-	if which == 'g' && bp.CgoFiles != nil {
-		cgofiles, err := processCgoFiles(bp, conf.fset(), conf.DisplayPath, conf.ParserMode)
-		if err != nil {
-			errs = append(errs, err)
-		} else {
-			files = append(files, cgofiles...)
-		}
-	}
-
-	return files, errs
-}
-
-// doImport imports the package denoted by path.
-// It implements the types.Importer signature.
-//
-// imports is the type-checker's package canonicalization map.
-//
-// It returns an error if a package could not be created
-// (e.g. go/build or parse error), but type errors are reported via
-// the types.Config.Error callback (the first of which is also saved
-// in the package's PackageInfo).
-//
-// Idempotent.
-//
-func (imp *importer) doImport(from *PackageInfo, to string) (*types.Package, error) {
-	// Package unsafe is handled specially, and has no PackageInfo.
-	// TODO(adonovan): move this check into go/types?
-	if to == "unsafe" {
-		return types.Unsafe, nil
-	}
-
-	imp.importedMu.Lock()
-	ii := imp.imported[to]
-	imp.importedMu.Unlock()
-	if ii == nil {
-		panic("internal error: unexpected import: " + to)
-	}
-	if ii.err != nil {
-		return nil, ii.err
-	}
-	if ii.info != nil {
-		return ii.info.Pkg, nil
-	}
-
-	// Import of incomplete package: this indicates a cycle.
-	fromPath := from.Pkg.Path()
-	if cycle := imp.findPath(to, fromPath); cycle != nil {
-		cycle = append([]string{fromPath}, cycle...)
-		return nil, fmt.Errorf("import cycle: %s", strings.Join(cycle, " -> "))
-	}
-
-	panic("internal error: import of incomplete (yet acyclic) package: " + fromPath)
-}
-
-// loadAll loads, parses, and type-checks the specified packages in
-// parallel and returns their completed importInfos in unspecified order.
-//
-// fromPath is the import path of the importing package, if it is
-// importable, "" otherwise.  It is used for cycle detection.
-//
-func (imp *importer) loadAll(fromPath string, paths map[string]bool) []*importInfo {
-	result := make([]*importInfo, 0, len(paths))
-	for path := range paths {
-		result = append(result, imp.startLoad(path))
-	}
-
-	if fromPath != "" {
-		// We're loading a set of imports.
-		//
-		// We must record graph edges from the importing package
-		// to its dependencies, and check for cycles.
-		imp.graphMu.Lock()
-		deps, ok := imp.graph[fromPath]
-		if !ok {
-			deps = make(map[string]bool)
-			imp.graph[fromPath] = deps
-		}
-		for path := range paths {
-			deps[path] = true
-		}
-		imp.graphMu.Unlock()
-	}
-
-	for _, ii := range result {
-		if fromPath != "" {
-			if cycle := imp.findPath(ii.path, fromPath); cycle != nil {
-				// Cycle-forming import: we must not await its
-				// completion since it would deadlock.
-				//
-				// We don't record the error in ii since
-				// the error is really associated with the
-				// cycle-forming edge, not the package itself.
-				// (Also it would complicate the
-				// invariants of importPath completion.)
-				if trace {
-					fmt.Fprintln(os.Stderr, "import cycle: %q", cycle)
-				}
-				continue
-			}
-		}
-		ii.awaitCompletion()
-
-	}
-	return result
-}
-
-// findPath returns an arbitrary path from 'from' to 'to' in the import
-// graph, or nil if there was none.
-func (imp *importer) findPath(from, to string) []string {
-	imp.graphMu.Lock()
-	defer imp.graphMu.Unlock()
-
-	seen := make(map[string]bool)
-	var search func(stack []string, importPath string) []string
-	search = func(stack []string, importPath string) []string {
-		if !seen[importPath] {
-			seen[importPath] = true
-			stack = append(stack, importPath)
-			if importPath == to {
-				return stack
-			}
-			for x := range imp.graph[importPath] {
-				if p := search(stack, x); p != nil {
-					return p
-				}
-			}
-		}
-		return nil
-	}
-	return search(make([]string, 0, 20), from)
-}
-
-// startLoad initiates the loading, parsing and type-checking of the
-// specified package and its dependencies, if it has not already begun.
-//
-// It returns an importInfo, not necessarily in a completed state.  The
-// caller must call awaitCompletion() before accessing its info and err
-// fields.
-//
-// startLoad is concurrency-safe and idempotent.
-//
-// Precondition: path != "unsafe".
-//
-func (imp *importer) startLoad(path string) *importInfo {
-	imp.importedMu.Lock()
-	ii, ok := imp.imported[path]
-	if !ok {
-		ii = &importInfo{path: path}
-		ii.complete.L = &ii.mu
-		imp.imported[path] = ii
-
-		go imp.load(path, ii)
-	}
-	imp.importedMu.Unlock()
-
-	return ii
-}
-
-func (imp *importer) load(path string, ii *importInfo) {
-	var info *PackageInfo
-	var err error
-	// Find and create the actual package.
-	if _, ok := imp.conf.ImportPkgs[path]; ok || !imp.conf.ImportFromBinary {
-		info, err = imp.loadFromSource(path)
-	} else {
-		info, err = imp.importFromBinary(path)
-	}
-	ii.Complete(info, err)
-}
-
-// importFromBinary implements package loading from the client-supplied
-// external source, e.g. object files from the gc compiler.
-//
-func (imp *importer) importFromBinary(path string) (*PackageInfo, error) {
-	// Determine the caller's effective Import function.
-	importfn := imp.conf.TypeChecker.Import
-	if importfn == nil {
-		importfn = gcimporter.Import
-	}
-	imp.typecheckerMu.Lock()
-	pkg, err := importfn(imp.conf.TypeChecker.Packages, path)
-	if pkg != nil {
-		imp.conf.TypeChecker.Packages[path] = pkg
-	}
-	imp.typecheckerMu.Unlock()
-	if err != nil {
-		return nil, err
-	}
-	info := &PackageInfo{Pkg: pkg}
-	info.Importable = true
-	imp.typecheckerMu.Lock()
-	imp.prog.AllPackages[pkg] = info
-	imp.typecheckerMu.Unlock()
-	return info, nil
-}
-
-// loadFromSource implements package loading by parsing Go source files
-// located by go/build.
-// The returned PackageInfo's typeCheck function must be called.
-//
-func (imp *importer) loadFromSource(path string) (*PackageInfo, error) {
-	bp, err := imp.conf.FindPackage(imp.conf.build(), path)
-	if err != nil {
-		return nil, err // package not found
-	}
-	info := imp.newPackageInfo(bp.ImportPath)
-	info.Importable = true
-	files, errs := imp.conf.parsePackageFiles(bp, 'g')
-	for _, err := range errs {
-		info.appendError(err)
-	}
-
-	imp.addFiles(info, files, true)
-
-	imp.typecheckerMu.Lock()
-	imp.conf.TypeChecker.Packages[path] = info.Pkg
-	imp.typecheckerMu.Unlock()
-
-	return info, nil
-}
-
-// addFiles adds and type-checks the specified files to info, loading
-// their dependencies if needed.  The order of files determines the
-// package initialization order.  It may be called multiple times on the
-// same package.  Errors are appended to the info.Errors field.
-//
-// cycleCheck determines whether the imports within files create
-// dependency edges that should be checked for potential cycles.
-//
-func (imp *importer) addFiles(info *PackageInfo, files []*ast.File, cycleCheck bool) {
-	info.Files = append(info.Files, files...)
-
-	// Ensure the dependencies are loaded, in parallel.
-	var fromPath string
-	if cycleCheck {
-		fromPath = info.Pkg.Path()
-	}
-	imp.loadAll(fromPath, scanImports(files))
-
-	if trace {
-		fmt.Fprintf(os.Stderr, "%s: start %q (%d)\n",
-			time.Since(imp.start), info.Pkg.Path(), len(files))
-	}
-
-	// Ignore the returned (first) error since we
-	// already collect them all in the PackageInfo.
-	info.checker.Files(files)
-
-	if trace {
-		fmt.Fprintf(os.Stderr, "%s: stop %q\n",
-			time.Since(imp.start), info.Pkg.Path())
-	}
-}
-
-func (imp *importer) newPackageInfo(path string) *PackageInfo {
-	pkg := types.NewPackage(path, "")
-	if imp.conf.PackageCreated != nil {
-		imp.conf.PackageCreated(pkg)
-	}
-	info := &PackageInfo{
-		Pkg: pkg,
-		Info: types.Info{
-			Types:      make(map[ast.Expr]types.TypeAndValue),
-			Defs:       make(map[*ast.Ident]types.Object),
-			Uses:       make(map[*ast.Ident]types.Object),
-			Implicits:  make(map[ast.Node]types.Object),
-			Scopes:     make(map[ast.Node]*types.Scope),
-			Selections: make(map[*ast.SelectorExpr]*types.Selection),
-		},
-		errorFunc: imp.conf.TypeChecker.Error,
-	}
-
-	// Copy the types.Config so we can vary it across PackageInfos.
-	tc := imp.conf.TypeChecker
-	tc.IgnoreFuncBodies = false
-	if f := imp.conf.TypeCheckFuncBodies; f != nil {
-		tc.IgnoreFuncBodies = !f(path)
-	}
-	tc.Import = func(_ map[string]*types.Package, to string) (*types.Package, error) {
-		return imp.doImport(info, to)
-	}
-	tc.Error = info.appendError // appendError wraps the user's Error function
-
-	info.checker = types.NewChecker(&tc, imp.conf.fset(), pkg, &info.Info)
-	imp.typecheckerMu.Lock()
-	imp.prog.AllPackages[pkg] = info
-	imp.typecheckerMu.Unlock()
-	return info
-}
diff --git a/third_party/gotools/go/loader/loader_test.go b/third_party/gotools/go/loader/loader_test.go
deleted file mode 100644
index bf1c0d9..0000000
--- a/third_party/gotools/go/loader/loader_test.go
+++ /dev/null
@@ -1,669 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package loader_test
-
-import (
-	"fmt"
-	"go/build"
-	"reflect"
-	"sort"
-	"strings"
-	"sync"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/buildutil"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-)
-
-// TestFromArgs checks that conf.FromArgs populates conf correctly.
-// It does no I/O.
-func TestFromArgs(t *testing.T) {
-	type result struct {
-		Err        string
-		Rest       []string
-		ImportPkgs map[string]bool
-		CreatePkgs []loader.PkgSpec
-	}
-	for _, test := range []struct {
-		args  []string
-		tests bool
-		want  result
-	}{
-		// Mix of existing and non-existent packages.
-		{
-			args: []string{"nosuchpkg", "errors"},
-			want: result{
-				ImportPkgs: map[string]bool{"errors": false, "nosuchpkg": false},
-			},
-		},
-		// Same, with -test flag.
-		{
-			args:  []string{"nosuchpkg", "errors"},
-			tests: true,
-			want: result{
-				ImportPkgs: map[string]bool{"errors": true, "nosuchpkg": true},
-			},
-		},
-		// Surplus arguments.
-		{
-			args: []string{"fmt", "errors", "--", "surplus"},
-			want: result{
-				Rest:       []string{"surplus"},
-				ImportPkgs: map[string]bool{"errors": false, "fmt": false},
-			},
-		},
-		// Ad hoc package specified as *.go files.
-		{
-			args: []string{"foo.go", "bar.go"},
-			want: result{CreatePkgs: []loader.PkgSpec{{
-				Filenames: []string{"foo.go", "bar.go"},
-			}}},
-		},
-		// Mixture of *.go and import paths.
-		{
-			args: []string{"foo.go", "fmt"},
-			want: result{
-				Err: "named files must be .go files: fmt",
-			},
-		},
-	} {
-		var conf loader.Config
-		rest, err := conf.FromArgs(test.args, test.tests)
-		got := result{
-			Rest:       rest,
-			ImportPkgs: conf.ImportPkgs,
-			CreatePkgs: conf.CreatePkgs,
-		}
-		if err != nil {
-			got.Err = err.Error()
-		}
-		if !reflect.DeepEqual(got, test.want) {
-			t.Errorf("FromArgs(%q) = %+v, want %+v", test.args, got, test.want)
-		}
-	}
-}
-
-func TestLoad_NoInitialPackages(t *testing.T) {
-	var conf loader.Config
-
-	const wantErr = "no initial packages were loaded"
-
-	prog, err := conf.Load()
-	if err == nil {
-		t.Errorf("Load succeeded unexpectedly, want %q", wantErr)
-	} else if err.Error() != wantErr {
-		t.Errorf("Load failed with wrong error %q, want %q", err, wantErr)
-	}
-	if prog != nil {
-		t.Errorf("Load unexpectedly returned a Program")
-	}
-}
-
-func TestLoad_MissingInitialPackage(t *testing.T) {
-	var conf loader.Config
-	conf.Import("nosuchpkg")
-	conf.Import("errors")
-
-	const wantErr = "couldn't load packages due to errors: nosuchpkg"
-
-	prog, err := conf.Load()
-	if err == nil {
-		t.Errorf("Load succeeded unexpectedly, want %q", wantErr)
-	} else if err.Error() != wantErr {
-		t.Errorf("Load failed with wrong error %q, want %q", err, wantErr)
-	}
-	if prog != nil {
-		t.Errorf("Load unexpectedly returned a Program")
-	}
-}
-
-func TestLoad_MissingInitialPackage_AllowErrors(t *testing.T) {
-	var conf loader.Config
-	conf.AllowErrors = true
-	conf.Import("nosuchpkg")
-	conf.ImportWithTests("errors")
-
-	prog, err := conf.Load()
-	if err != nil {
-		t.Errorf("Load failed unexpectedly: %v", err)
-	}
-	if prog == nil {
-		t.Fatalf("Load returned a nil Program")
-	}
-	if got, want := created(prog), "errors_test"; got != want {
-		t.Errorf("Created = %s, want %s", got, want)
-	}
-	if got, want := imported(prog), "errors"; got != want {
-		t.Errorf("Imported = %s, want %s", got, want)
-	}
-}
-
-func TestCreateUnnamedPackage(t *testing.T) {
-	var conf loader.Config
-	conf.CreateFromFilenames("")
-	prog, err := conf.Load()
-	if err != nil {
-		t.Fatalf("Load failed: %v", err)
-	}
-	if got, want := fmt.Sprint(prog.InitialPackages()), "[(unnamed)]"; got != want {
-		t.Errorf("InitialPackages = %s, want %s", got, want)
-	}
-}
-
-func TestLoad_MissingFileInCreatedPackage(t *testing.T) {
-	var conf loader.Config
-	conf.CreateFromFilenames("", "missing.go")
-
-	const wantErr = "couldn't load packages due to errors: (unnamed)"
-
-	prog, err := conf.Load()
-	if prog != nil {
-		t.Errorf("Load unexpectedly returned a Program")
-	}
-	if err == nil {
-		t.Fatalf("Load succeeded unexpectedly, want %q", wantErr)
-	}
-	if err.Error() != wantErr {
-		t.Fatalf("Load failed with wrong error %q, want %q", err, wantErr)
-	}
-}
-
-func TestLoad_MissingFileInCreatedPackage_AllowErrors(t *testing.T) {
-	conf := loader.Config{AllowErrors: true}
-	conf.CreateFromFilenames("", "missing.go")
-
-	prog, err := conf.Load()
-	if err != nil {
-		t.Errorf("Load failed: %v", err)
-	}
-	if got, want := fmt.Sprint(prog.InitialPackages()), "[(unnamed)]"; got != want {
-		t.Fatalf("InitialPackages = %s, want %s", got, want)
-	}
-}
-
-func TestLoad_ParseError(t *testing.T) {
-	var conf loader.Config
-	conf.CreateFromFilenames("badpkg", "testdata/badpkgdecl.go")
-
-	const wantErr = "couldn't load packages due to errors: badpkg"
-
-	prog, err := conf.Load()
-	if prog != nil {
-		t.Errorf("Load unexpectedly returned a Program")
-	}
-	if err == nil {
-		t.Fatalf("Load succeeded unexpectedly, want %q", wantErr)
-	}
-	if err.Error() != wantErr {
-		t.Fatalf("Load failed with wrong error %q, want %q", err, wantErr)
-	}
-}
-
-func TestLoad_ParseError_AllowErrors(t *testing.T) {
-	var conf loader.Config
-	conf.AllowErrors = true
-	conf.CreateFromFilenames("badpkg", "testdata/badpkgdecl.go")
-
-	prog, err := conf.Load()
-	if err != nil {
-		t.Errorf("Load failed unexpectedly: %v", err)
-	}
-	if prog == nil {
-		t.Fatalf("Load returned a nil Program")
-	}
-	if got, want := created(prog), "badpkg"; got != want {
-		t.Errorf("Created = %s, want %s", got, want)
-	}
-
-	badpkg := prog.Created[0]
-	if len(badpkg.Files) != 1 {
-		t.Errorf("badpkg has %d files, want 1", len(badpkg.Files))
-	}
-	wantErr := "testdata/badpkgdecl.go:1:34: expected 'package', found 'EOF'"
-	if !hasError(badpkg.Errors, wantErr) {
-		t.Errorf("badpkg.Errors = %v, want %s", badpkg.Errors, wantErr)
-	}
-}
-
-func TestLoad_FromSource_Success(t *testing.T) {
-	var conf loader.Config
-	conf.CreateFromFilenames("P", "testdata/a.go", "testdata/b.go")
-
-	prog, err := conf.Load()
-	if err != nil {
-		t.Errorf("Load failed unexpectedly: %v", err)
-	}
-	if prog == nil {
-		t.Fatalf("Load returned a nil Program")
-	}
-	if got, want := created(prog), "P"; got != want {
-		t.Errorf("Created = %s, want %s", got, want)
-	}
-}
-
-func TestLoad_FromImports_Success(t *testing.T) {
-	var conf loader.Config
-	conf.ImportWithTests("fmt")
-	conf.ImportWithTests("errors")
-
-	prog, err := conf.Load()
-	if err != nil {
-		t.Errorf("Load failed unexpectedly: %v", err)
-	}
-	if prog == nil {
-		t.Fatalf("Load returned a nil Program")
-	}
-	if got, want := created(prog), "errors_test fmt_test"; got != want {
-		t.Errorf("Created = %q, want %s", got, want)
-	}
-	if got, want := imported(prog), "errors fmt"; got != want {
-		t.Errorf("Imported = %s, want %s", got, want)
-	}
-	// Check set of transitive packages.
-	// There are >30 and the set may grow over time, so only check a few.
-	want := map[string]bool{
-		"strings": true,
-		"time":    true,
-		"runtime": true,
-		"testing": true,
-		"unicode": true,
-	}
-	for _, path := range all(prog) {
-		delete(want, path)
-	}
-	if len(want) > 0 {
-		t.Errorf("AllPackages is missing these keys: %q", keys(want))
-	}
-}
-
-func TestLoad_MissingIndirectImport(t *testing.T) {
-	pkgs := map[string]string{
-		"a": `package a; import _ "b"`,
-		"b": `package b; import _ "c"`,
-	}
-	conf := loader.Config{Build: fakeContext(pkgs)}
-	conf.Import("a")
-
-	const wantErr = "couldn't load packages due to errors: b"
-
-	prog, err := conf.Load()
-	if err == nil {
-		t.Errorf("Load succeeded unexpectedly, want %q", wantErr)
-	} else if err.Error() != wantErr {
-		t.Errorf("Load failed with wrong error %q, want %q", err, wantErr)
-	}
-	if prog != nil {
-		t.Errorf("Load unexpectedly returned a Program")
-	}
-}
-
-func TestLoad_BadDependency_AllowErrors(t *testing.T) {
-	for _, test := range []struct {
-		descr    string
-		pkgs     map[string]string
-		wantPkgs string
-	}{
-
-		{
-			descr: "missing dependency",
-			pkgs: map[string]string{
-				"a": `package a; import _ "b"`,
-				"b": `package b; import _ "c"`,
-			},
-			wantPkgs: "a b",
-		},
-		{
-			descr: "bad package decl in dependency",
-			pkgs: map[string]string{
-				"a": `package a; import _ "b"`,
-				"b": `package b; import _ "c"`,
-				"c": `package`,
-			},
-			wantPkgs: "a b",
-		},
-		{
-			descr: "parse error in dependency",
-			pkgs: map[string]string{
-				"a": `package a; import _ "b"`,
-				"b": `package b; import _ "c"`,
-				"c": `package c; var x = `,
-			},
-			wantPkgs: "a b c",
-		},
-	} {
-		conf := loader.Config{
-			AllowErrors: true,
-			Build:       fakeContext(test.pkgs),
-		}
-		conf.Import("a")
-
-		prog, err := conf.Load()
-		if err != nil {
-			t.Errorf("%s: Load failed unexpectedly: %v", test.descr, err)
-		}
-		if prog == nil {
-			t.Fatalf("%s: Load returned a nil Program", test.descr)
-		}
-
-		if got, want := imported(prog), "a"; got != want {
-			t.Errorf("%s: Imported = %s, want %s", test.descr, got, want)
-		}
-		if got := all(prog); strings.Join(got, " ") != test.wantPkgs {
-			t.Errorf("%s: AllPackages = %s, want %s", test.descr, got, test.wantPkgs)
-		}
-	}
-}
-
-func TestCwd(t *testing.T) {
-	ctxt := fakeContext(map[string]string{"one/two/three": `package three`})
-	for _, test := range []struct {
-		cwd, arg, want string
-	}{
-		{cwd: "/go/src/one", arg: "./two/three", want: "one/two/three"},
-		{cwd: "/go/src/one", arg: "../one/two/three", want: "one/two/three"},
-		{cwd: "/go/src/one", arg: "one/two/three", want: "one/two/three"},
-		{cwd: "/go/src/one/two/three", arg: ".", want: "one/two/three"},
-		{cwd: "/go/src/one", arg: "two/three", want: ""},
-	} {
-		conf := loader.Config{
-			Cwd:   test.cwd,
-			Build: ctxt,
-		}
-		conf.Import(test.arg)
-
-		var got string
-		prog, err := conf.Load()
-		if prog != nil {
-			got = imported(prog)
-		}
-		if got != test.want {
-			t.Errorf("Load(%s) from %s: Imported = %s, want %s",
-				test.arg, test.cwd, got, test.want)
-			if err != nil {
-				t.Errorf("Load failed: %v", err)
-			}
-		}
-	}
-}
-
-// TODO(adonovan): more Load tests:
-//
-// failures:
-// - to parse package decl of *_test.go files
-// - to parse package decl of external *_test.go files
-// - to parse whole of *_test.go files
-// - to parse whole of external *_test.go files
-// - to open a *.go file during import scanning
-// - to import from binary
-
-// features:
-// - InitialPackages
-// - PackageCreated hook
-// - TypeCheckFuncBodies hook
-
-func TestTransitivelyErrorFreeFlag(t *testing.T) {
-	// Create an minimal custom build.Context
-	// that fakes the following packages:
-	//
-	// a --> b --> c!   c has an error
-	//   \              d and e are transitively error-free.
-	//    e --> d
-	//
-	// Each package [a-e] consists of one file, x.go.
-	pkgs := map[string]string{
-		"a": `package a; import (_ "b"; _ "e")`,
-		"b": `package b; import _ "c"`,
-		"c": `package c; func f() { _ = int(false) }`, // type error within function body
-		"d": `package d;`,
-		"e": `package e; import _ "d"`,
-	}
-	conf := loader.Config{
-		AllowErrors: true,
-		Build:       fakeContext(pkgs),
-	}
-	conf.Import("a")
-
-	prog, err := conf.Load()
-	if err != nil {
-		t.Errorf("Load failed: %s", err)
-	}
-	if prog == nil {
-		t.Fatalf("Load returned nil *Program")
-	}
-
-	for pkg, info := range prog.AllPackages {
-		var wantErr, wantTEF bool
-		switch pkg.Path() {
-		case "a", "b":
-		case "c":
-			wantErr = true
-		case "d", "e":
-			wantTEF = true
-		default:
-			t.Errorf("unexpected package: %q", pkg.Path())
-			continue
-		}
-
-		if (info.Errors != nil) != wantErr {
-			if wantErr {
-				t.Errorf("Package %q.Error = nil, want error", pkg.Path())
-			} else {
-				t.Errorf("Package %q has unexpected Errors: %v",
-					pkg.Path(), info.Errors)
-			}
-		}
-
-		if info.TransitivelyErrorFree != wantTEF {
-			t.Errorf("Package %q.TransitivelyErrorFree=%t, want %t",
-				pkg.Path(), info.TransitivelyErrorFree, wantTEF)
-		}
-	}
-}
-
-// Test that syntax (scan/parse), type, and loader errors are recorded
-// (in PackageInfo.Errors) and reported (via Config.TypeChecker.Error).
-func TestErrorReporting(t *testing.T) {
-	pkgs := map[string]string{
-		"a": `package a; import (_ "b"; _ "c"); var x int = false`,
-		"b": `package b; 'syntax error!`,
-	}
-	conf := loader.Config{
-		AllowErrors: true,
-		Build:       fakeContext(pkgs),
-	}
-	var mu sync.Mutex
-	var allErrors []error
-	conf.TypeChecker.Error = func(err error) {
-		mu.Lock()
-		allErrors = append(allErrors, err)
-		mu.Unlock()
-	}
-	conf.Import("a")
-
-	prog, err := conf.Load()
-	if err != nil {
-		t.Errorf("Load failed: %s", err)
-	}
-	if prog == nil {
-		t.Fatalf("Load returned nil *Program")
-	}
-
-	// TODO(adonovan): test keys of ImportMap.
-
-	// Check errors recorded in each PackageInfo.
-	for pkg, info := range prog.AllPackages {
-		switch pkg.Path() {
-		case "a":
-			if !hasError(info.Errors, "cannot convert false") {
-				t.Errorf("a.Errors = %v, want bool conversion (type) error", info.Errors)
-			}
-			if !hasError(info.Errors, "could not import c") {
-				t.Errorf("a.Errors = %v, want import (loader) error", info.Errors)
-			}
-		case "b":
-			if !hasError(info.Errors, "rune literal not terminated") {
-				t.Errorf("b.Errors = %v, want unterminated literal (syntax) error", info.Errors)
-			}
-		}
-	}
-
-	// Check errors reported via error handler.
-	if !hasError(allErrors, "cannot convert false") ||
-		!hasError(allErrors, "rune literal not terminated") ||
-		!hasError(allErrors, "could not import c") {
-		t.Errorf("allErrors = %v, want syntax, type and loader errors", allErrors)
-	}
-}
-
-func TestCycles(t *testing.T) {
-	for _, test := range []struct {
-		descr   string
-		ctxt    *build.Context
-		wantErr string
-	}{
-		{
-			"self-cycle",
-			fakeContext(map[string]string{
-				"main":      `package main; import _ "selfcycle"`,
-				"selfcycle": `package selfcycle; import _ "selfcycle"`,
-			}),
-			`import cycle: selfcycle -> selfcycle`,
-		},
-		{
-			"three-package cycle",
-			fakeContext(map[string]string{
-				"main": `package main; import _ "a"`,
-				"a":    `package a; import _ "b"`,
-				"b":    `package b; import _ "c"`,
-				"c":    `package c; import _ "a"`,
-			}),
-			`import cycle: c -> a -> b -> c`,
-		},
-		{
-			"self-cycle in dependency of test file",
-			buildutil.FakeContext(map[string]map[string]string{
-				"main": {
-					"main.go":      `package main`,
-					"main_test.go": `package main; import _ "a"`,
-				},
-				"a": {
-					"a.go": `package a; import _ "a"`,
-				},
-			}),
-			`import cycle: a -> a`,
-		},
-		// TODO(adonovan): fix: these fail
-		// {
-		// 	"two-package cycle in dependency of test file",
-		// 	buildutil.FakeContext(map[string]map[string]string{
-		// 		"main": {
-		// 			"main.go":      `package main`,
-		// 			"main_test.go": `package main; import _ "a"`,
-		// 		},
-		// 		"a": {
-		// 			"a.go": `package a; import _ "main"`,
-		// 		},
-		// 	}),
-		// 	`import cycle: main -> a -> main`,
-		// },
-		// {
-		// 	"self-cycle in augmented package",
-		// 	buildutil.FakeContext(map[string]map[string]string{
-		// 		"main": {
-		// 			"main.go":      `package main`,
-		// 			"main_test.go": `package main; import _ "main"`,
-		// 		},
-		// 	}),
-		// 	`import cycle: main -> main`,
-		// },
-	} {
-		conf := loader.Config{
-			AllowErrors: true,
-			Build:       test.ctxt,
-		}
-		var mu sync.Mutex
-		var allErrors []error
-		conf.TypeChecker.Error = func(err error) {
-			mu.Lock()
-			allErrors = append(allErrors, err)
-			mu.Unlock()
-		}
-		conf.ImportWithTests("main")
-
-		prog, err := conf.Load()
-		if err != nil {
-			t.Errorf("%s: Load failed: %s", test.descr, err)
-		}
-		if prog == nil {
-			t.Fatalf("%s: Load returned nil *Program", test.descr)
-		}
-
-		if !hasError(allErrors, test.wantErr) {
-			t.Errorf("%s: Load() errors = %q, want %q",
-				test.descr, allErrors, test.wantErr)
-		}
-	}
-
-	// TODO(adonovan):
-	// - Test that in a legal test cycle, none of the symbols
-	//   defined by augmentation are visible via import.
-}
-
-// ---- utilities ----
-
-// Simplifying wrapper around buildutil.FakeContext for single-file packages.
-func fakeContext(pkgs map[string]string) *build.Context {
-	pkgs2 := make(map[string]map[string]string)
-	for path, content := range pkgs {
-		pkgs2[path] = map[string]string{"x.go": content}
-	}
-	return buildutil.FakeContext(pkgs2)
-}
-
-func hasError(errors []error, substr string) bool {
-	for _, err := range errors {
-		if strings.Contains(err.Error(), substr) {
-			return true
-		}
-	}
-	return false
-}
-
-func keys(m map[string]bool) (keys []string) {
-	for key := range m {
-		keys = append(keys, key)
-	}
-	sort.Strings(keys)
-	return
-}
-
-// Returns all loaded packages.
-func all(prog *loader.Program) []string {
-	var pkgs []string
-	for _, info := range prog.AllPackages {
-		pkgs = append(pkgs, info.Pkg.Path())
-	}
-	sort.Strings(pkgs)
-	return pkgs
-}
-
-// Returns initially imported packages, as a string.
-func imported(prog *loader.Program) string {
-	var pkgs []string
-	for _, info := range prog.Imported {
-		pkgs = append(pkgs, info.Pkg.Path())
-	}
-	sort.Strings(pkgs)
-	return strings.Join(pkgs, " ")
-}
-
-// Returns initially created packages, as a string.
-func created(prog *loader.Program) string {
-	var pkgs []string
-	for _, info := range prog.Created {
-		pkgs = append(pkgs, info.Pkg.Path())
-	}
-	return strings.Join(pkgs, " ")
-}
diff --git a/third_party/gotools/go/loader/source_test.go b/third_party/gotools/go/loader/source_test.go
deleted file mode 100644
index 400224b..0000000
--- a/third_party/gotools/go/loader/source_test.go
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package loader_test
-
-// This file defines tests of source utilities.
-
-import (
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"strings"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/ast/astutil"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-)
-
-// findInterval parses input and returns the [start, end) positions of
-// the first occurrence of substr in input.  f==nil indicates failure;
-// an error has already been reported in that case.
-//
-func findInterval(t *testing.T, fset *token.FileSet, input, substr string) (f *ast.File, start, end token.Pos) {
-	f, err := parser.ParseFile(fset, "<input>", input, 0)
-	if err != nil {
-		t.Errorf("parse error: %s", err)
-		return
-	}
-
-	i := strings.Index(input, substr)
-	if i < 0 {
-		t.Errorf("%q is not a substring of input", substr)
-		f = nil
-		return
-	}
-
-	filePos := fset.File(f.Package)
-	return f, filePos.Pos(i), filePos.Pos(i + len(substr))
-}
-
-func TestEnclosingFunction(t *testing.T) {
-	tests := []struct {
-		input  string // the input file
-		substr string // first occurrence of this string denotes interval
-		fn     string // name of expected containing function
-	}{
-		// We use distinctive numbers as syntactic landmarks.
-
-		// Ordinary function:
-		{`package main
-		  func f() { println(1003) }`,
-			"100", "main.f"},
-		// Methods:
-		{`package main
-                  type T int
-		  func (t T) f() { println(200) }`,
-			"200", "(main.T).f"},
-		// Function literal:
-		{`package main
-		  func f() { println(func() { print(300) }) }`,
-			"300", "main.f$1"},
-		// Doubly nested
-		{`package main
-		  func f() { println(func() { print(func() { print(350) })})}`,
-			"350", "main.f$1$1"},
-		// Implicit init for package-level var initializer.
-		{"package main; var a = 400", "400", "main.init"},
-		// No code for constants:
-		{"package main; const a = 500", "500", "(none)"},
-		// Explicit init()
-		{"package main; func init() { println(600) }", "600", "main.init#1"},
-		// Multiple explicit init functions:
-		{`package main
-		  func init() { println("foo") }
-		  func init() { println(800) }`,
-			"800", "main.init#2"},
-		// init() containing FuncLit.
-		{`package main
-		  func init() { println(func(){print(900)}) }`,
-			"900", "main.init#1$1"},
-	}
-	for _, test := range tests {
-		conf := loader.Config{Fset: token.NewFileSet()}
-		f, start, end := findInterval(t, conf.Fset, test.input, test.substr)
-		if f == nil {
-			continue
-		}
-		path, exact := astutil.PathEnclosingInterval(f, start, end)
-		if !exact {
-			t.Errorf("EnclosingFunction(%q) not exact", test.substr)
-			continue
-		}
-
-		conf.CreateFromFiles("main", f)
-
-		iprog, err := conf.Load()
-		if err != nil {
-			t.Error(err)
-			continue
-		}
-		prog := ssa.Create(iprog, 0)
-		pkg := prog.Package(iprog.Created[0].Pkg)
-		pkg.Build()
-
-		name := "(none)"
-		fn := ssa.EnclosingFunction(pkg, path)
-		if fn != nil {
-			name = fn.String()
-		}
-
-		if name != test.fn {
-			t.Errorf("EnclosingFunction(%q in %q) got %s, want %s",
-				test.substr, test.input, name, test.fn)
-			continue
-		}
-
-		// While we're here: test HasEnclosingFunction.
-		if has := ssa.HasEnclosingFunction(pkg, path); has != (fn != nil) {
-			t.Errorf("HasEnclosingFunction(%q in %q) got %v, want %v",
-				test.substr, test.input, has, fn != nil)
-			continue
-		}
-	}
-}
diff --git a/third_party/gotools/go/loader/stdlib_test.go b/third_party/gotools/go/loader/stdlib_test.go
deleted file mode 100644
index 0af2a69..0000000
--- a/third_party/gotools/go/loader/stdlib_test.go
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package loader_test
-
-// This file enumerates all packages beneath $GOROOT, loads them, plus
-// their external tests if any, runs the type checker on them, and
-// prints some summary information.
-//
-// Run test with GOMAXPROCS=8.
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/build"
-	"go/token"
-	"io/ioutil"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"testing"
-	"time"
-
-	"llvm.org/llgo/third_party/gotools/go/buildutil"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-func TestStdlib(t *testing.T) {
-	runtime.GC()
-	t0 := time.Now()
-	var memstats runtime.MemStats
-	runtime.ReadMemStats(&memstats)
-	alloc := memstats.Alloc
-
-	// Load, parse and type-check the program.
-	ctxt := build.Default // copy
-	ctxt.GOPATH = ""      // disable GOPATH
-	conf := loader.Config{Build: &ctxt}
-	for _, path := range buildutil.AllPackages(conf.Build) {
-		conf.ImportWithTests(path)
-	}
-
-	prog, err := conf.Load()
-	if err != nil {
-		t.Fatalf("Load failed: %v", err)
-	}
-
-	t1 := time.Now()
-	runtime.GC()
-	runtime.ReadMemStats(&memstats)
-
-	numPkgs := len(prog.AllPackages)
-	if want := 205; numPkgs < want {
-		t.Errorf("Loaded only %d packages, want at least %d", numPkgs, want)
-	}
-
-	// Dump package members.
-	if false {
-		for pkg := range prog.AllPackages {
-			fmt.Printf("Package %s:\n", pkg.Path())
-			scope := pkg.Scope()
-			for _, name := range scope.Names() {
-				if ast.IsExported(name) {
-					fmt.Printf("\t%s\n", types.ObjectString(pkg, scope.Lookup(name)))
-				}
-			}
-			fmt.Println()
-		}
-	}
-
-	// Check that Test functions for io/ioutil, regexp and
-	// compress/bzip2 are all simultaneously present.
-	// (The apparent cycle formed when augmenting all three of
-	// these packages by their tests was the original motivation
-	// for reporting b/7114.)
-	//
-	// compress/bzip2.TestBitReader in bzip2_test.go    imports io/ioutil
-	// io/ioutil.TestTempFile       in tempfile_test.go imports regexp
-	// regexp.TestRE2Search         in exec_test.go     imports compress/bzip2
-	for _, test := range []struct{ pkg, fn string }{
-		{"io/ioutil", "TestTempFile"},
-		{"regexp", "TestRE2Search"},
-		{"compress/bzip2", "TestBitReader"},
-	} {
-		info := prog.Imported[test.pkg]
-		if info == nil {
-			t.Errorf("failed to load package %q", test.pkg)
-			continue
-		}
-		obj, _ := info.Pkg.Scope().Lookup(test.fn).(*types.Func)
-		if obj == nil {
-			t.Errorf("package %q has no func %q", test.pkg, test.fn)
-			continue
-		}
-	}
-
-	// Dump some statistics.
-
-	// determine line count
-	var lineCount int
-	prog.Fset.Iterate(func(f *token.File) bool {
-		lineCount += f.LineCount()
-		return true
-	})
-
-	t.Log("GOMAXPROCS:           ", runtime.GOMAXPROCS(0))
-	t.Log("#Source lines:        ", lineCount)
-	t.Log("Load/parse/typecheck: ", t1.Sub(t0))
-	t.Log("#MB:                  ", int64(memstats.Alloc-alloc)/1000000)
-}
-
-func TestCgoOption(t *testing.T) {
-	switch runtime.GOOS {
-	// On these systems, the net and os/user packages don't use cgo.
-	case "plan9", "solaris", "windows":
-		return
-	}
-	// In nocgo builds (e.g. linux-amd64-nocgo),
-	// there is no "runtime/cgo" package,
-	// so cgo-generated Go files will have a failing import.
-	if !build.Default.CgoEnabled {
-		return
-	}
-	// Test that we can load cgo-using packages with
-	// CGO_ENABLED=[01], which causes go/build to select pure
-	// Go/native implementations, respectively, based on build
-	// tags.
-	//
-	// Each entry specifies a package-level object and the generic
-	// file expected to define it when cgo is disabled.
-	// When cgo is enabled, the exact file is not specified (since
-	// it varies by platform), but must differ from the generic one.
-	//
-	// The test also loads the actual file to verify that the
-	// object is indeed defined at that location.
-	for _, test := range []struct {
-		pkg, name, genericFile string
-	}{
-		{"net", "cgoLookupHost", "cgo_stub.go"},
-		{"os/user", "lookupId", "lookup_stubs.go"},
-	} {
-		ctxt := build.Default
-		for _, ctxt.CgoEnabled = range []bool{false, true} {
-			conf := loader.Config{Build: &ctxt}
-			conf.Import(test.pkg)
-			prog, err := conf.Load()
-			if err != nil {
-				t.Errorf("Load failed: %v", err)
-				continue
-			}
-			info := prog.Imported[test.pkg]
-			if info == nil {
-				t.Errorf("package %s not found", test.pkg)
-				continue
-			}
-			obj := info.Pkg.Scope().Lookup(test.name)
-			if obj == nil {
-				t.Errorf("no object %s.%s", test.pkg, test.name)
-				continue
-			}
-			posn := prog.Fset.Position(obj.Pos())
-			t.Logf("%s: %s (CgoEnabled=%t)", posn, obj, ctxt.CgoEnabled)
-
-			gotFile := filepath.Base(posn.Filename)
-			filesMatch := gotFile == test.genericFile
-
-			if ctxt.CgoEnabled && filesMatch {
-				t.Errorf("CGO_ENABLED=1: %s found in %s, want native file",
-					obj, gotFile)
-			} else if !ctxt.CgoEnabled && !filesMatch {
-				t.Errorf("CGO_ENABLED=0: %s found in %s, want %s",
-					obj, gotFile, test.genericFile)
-			}
-
-			// Load the file and check the object is declared at the right place.
-			b, err := ioutil.ReadFile(posn.Filename)
-			if err != nil {
-				t.Errorf("can't read %s: %s", posn.Filename, err)
-				continue
-			}
-			line := string(bytes.Split(b, []byte("\n"))[posn.Line-1])
-			ident := line[posn.Column-1:]
-			if !strings.HasPrefix(ident, test.name) {
-				t.Errorf("%s: %s not declared here (looking at %q)", posn, obj, ident)
-			}
-		}
-	}
-}
diff --git a/third_party/gotools/go/loader/testdata/a.go b/third_party/gotools/go/loader/testdata/a.go
deleted file mode 100644
index bae3955..0000000
--- a/third_party/gotools/go/loader/testdata/a.go
+++ /dev/null
@@ -1 +0,0 @@
-package P
diff --git a/third_party/gotools/go/loader/testdata/b.go b/third_party/gotools/go/loader/testdata/b.go
deleted file mode 100644
index bae3955..0000000
--- a/third_party/gotools/go/loader/testdata/b.go
+++ /dev/null
@@ -1 +0,0 @@
-package P
diff --git a/third_party/gotools/go/loader/testdata/badpkgdecl.go b/third_party/gotools/go/loader/testdata/badpkgdecl.go
deleted file mode 100644
index 1e39359..0000000
--- a/third_party/gotools/go/loader/testdata/badpkgdecl.go
+++ /dev/null
@@ -1 +0,0 @@
-// this file has no package decl
diff --git a/third_party/gotools/go/loader/util.go b/third_party/gotools/go/loader/util.go
deleted file mode 100644
index f0cb5a0..0000000
--- a/third_party/gotools/go/loader/util.go
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package loader
-
-import (
-	"go/ast"
-	"go/build"
-	"go/parser"
-	"go/token"
-	"io"
-	"os"
-	"strconv"
-	"sync"
-
-	"llvm.org/llgo/third_party/gotools/go/buildutil"
-)
-
-// parseFiles parses the Go source files within directory dir and
-// returns the ASTs of the ones that could be at least partially parsed,
-// along with a list of I/O and parse errors encountered.
-//
-// I/O is done via ctxt, which may specify a virtual file system.
-// displayPath is used to transform the filenames attached to the ASTs.
-//
-func parseFiles(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, files []string, mode parser.Mode) ([]*ast.File, []error) {
-	if displayPath == nil {
-		displayPath = func(path string) string { return path }
-	}
-	var wg sync.WaitGroup
-	n := len(files)
-	parsed := make([]*ast.File, n)
-	errors := make([]error, n)
-	for i, file := range files {
-		if !buildutil.IsAbsPath(ctxt, file) {
-			file = buildutil.JoinPath(ctxt, dir, file)
-		}
-		wg.Add(1)
-		go func(i int, file string) {
-			defer wg.Done()
-			var rd io.ReadCloser
-			var err error
-			if ctxt.OpenFile != nil {
-				rd, err = ctxt.OpenFile(file)
-			} else {
-				rd, err = os.Open(file)
-			}
-			if err != nil {
-				errors[i] = err // open failed
-				return
-			}
-
-			// ParseFile may return both an AST and an error.
-			parsed[i], errors[i] = parser.ParseFile(fset, displayPath(file), rd, mode)
-			rd.Close()
-		}(i, file)
-	}
-	wg.Wait()
-
-	// Eliminate nils, preserving order.
-	var o int
-	for _, f := range parsed {
-		if f != nil {
-			parsed[o] = f
-			o++
-		}
-	}
-	parsed = parsed[:o]
-
-	o = 0
-	for _, err := range errors {
-		if err != nil {
-			errors[o] = err
-			o++
-		}
-	}
-	errors = errors[:o]
-
-	return parsed, errors
-}
-
-// scanImports returns the set of all package import paths from all
-// import specs in the specified files.
-func scanImports(files []*ast.File) map[string]bool {
-	imports := make(map[string]bool)
-	for _, f := range files {
-		for _, decl := range f.Decls {
-			if decl, ok := decl.(*ast.GenDecl); ok && decl.Tok == token.IMPORT {
-				for _, spec := range decl.Specs {
-					spec := spec.(*ast.ImportSpec)
-
-					// NB: do not assume the program is well-formed!
-					path, err := strconv.Unquote(spec.Path.Value)
-					if err != nil {
-						continue // quietly ignore the error
-					}
-					if path == "C" || path == "unsafe" {
-						continue // skip pseudo packages
-					}
-					imports[path] = true
-				}
-			}
-		}
-	}
-	return imports
-}
-
-// ---------- Internal helpers ----------
-
-// TODO(adonovan): make this a method: func (*token.File) Contains(token.Pos)
-func tokenFileContainsPos(f *token.File, pos token.Pos) bool {
-	p := int(pos)
-	base := f.Base()
-	return base <= p && p < base+f.Size()
-}
diff --git a/third_party/gotools/go/pointer/TODO b/third_party/gotools/go/pointer/TODO
deleted file mode 100644
index f95e706..0000000
--- a/third_party/gotools/go/pointer/TODO
+++ /dev/null
@@ -1,33 +0,0 @@
--*- text -*-
-
-Pointer analysis to-do list
-===========================
-
-CONSTRAINT GENERATION:
-- support reflection:
-  - a couple of operators are missing
-  - reflect.Values may contain lvalues (CanAddr)
-- implement native intrinsics.  These vary by platform.
-- add to pts(a.panic) a label representing all runtime panics, e.g.
-  runtime.{TypeAssertionError,errorString,errorCString}.
-
-OPTIMISATIONS
-- pre-solver: 
-  pointer equivalence: extend HVN to HRU
-  location equivalence
-- solver: HCD, LCD.
-- experiment with map+slice worklist in lieu of bitset.
-  It may have faster insert.
-
-MISC:
-- Test on all platforms.  
-  Currently we assume these go/build tags: linux, amd64, !cgo.
-
-MAINTAINABILITY
-- Think about ways to make debugging this code easier.  PTA logs
-  routinely exceed a million lines and require training to read.
-
-BUGS: 
-- There's a crash bug in stdlib_test + reflection, rVCallConstraint.
-
-
diff --git a/third_party/gotools/go/pointer/analysis.go b/third_party/gotools/go/pointer/analysis.go
deleted file mode 100644
index d02c3f7..0000000
--- a/third_party/gotools/go/pointer/analysis.go
+++ /dev/null
@@ -1,447 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file defines the main datatypes and Analyze function of the pointer analysis.
-
-import (
-	"fmt"
-	"go/token"
-	"io"
-	"os"
-	"reflect"
-	"runtime"
-	"runtime/debug"
-	"sort"
-
-	"llvm.org/llgo/third_party/gotools/go/callgraph"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-)
-
-const (
-	// optimization options; enable all when committing
-	optRenumber = true // enable renumbering optimization (makes logs hard to read)
-	optHVN      = true // enable pointer equivalence via Hash-Value Numbering
-
-	// debugging options; disable all when committing
-	debugHVN           = false // enable assertions in HVN
-	debugHVNVerbose    = false // enable extra HVN logging
-	debugHVNCrossCheck = false // run solver with/without HVN and compare (caveats below)
-	debugTimers        = false // show running time of each phase
-)
-
-// object.flags bitmask values.
-const (
-	otTagged   = 1 << iota // type-tagged object
-	otIndirect             // type-tagged object with indirect payload
-	otFunction             // function object
-)
-
-// An object represents a contiguous block of memory to which some
-// (generalized) pointer may point.
-//
-// (Note: most variables called 'obj' are not *objects but nodeids
-// such that a.nodes[obj].obj != nil.)
-//
-type object struct {
-	// flags is a bitset of the node type (ot*) flags defined above.
-	flags uint32
-
-	// Number of following nodes belonging to the same "object"
-	// allocation.  Zero for all other nodes.
-	size uint32
-
-	// data describes this object; it has one of these types:
-	//
-	// ssa.Value	for an object allocated by an SSA operation.
-	// types.Type	for an rtype instance object or *rtype-tagged object.
-	// string	for an instrinsic object, e.g. the array behind os.Args.
-	// nil		for an object allocated by an instrinsic.
-	//		(cgn provides the identity of the intrinsic.)
-	data interface{}
-
-	// The call-graph node (=context) in which this object was allocated.
-	// May be nil for global objects: Global, Const, some Functions.
-	cgn *cgnode
-}
-
-// nodeid denotes a node.
-// It is an index within analysis.nodes.
-// We use small integers, not *node pointers, for many reasons:
-// - they are smaller on 64-bit systems.
-// - sets of them can be represented compactly in bitvectors or BDDs.
-// - order matters; a field offset can be computed by simple addition.
-type nodeid uint32
-
-// A node is an equivalence class of memory locations.
-// Nodes may be pointers, pointed-to locations, neither, or both.
-//
-// Nodes that are pointed-to locations ("labels") have an enclosing
-// object (see analysis.enclosingObject).
-//
-type node struct {
-	// If non-nil, this node is the start of an object
-	// (addressable memory location).
-	// The following obj.size nodes implicitly belong to the object;
-	// they locate their object by scanning back.
-	obj *object
-
-	// The type of the field denoted by this node.  Non-aggregate,
-	// unless this is an tagged.T node (i.e. the thing
-	// pointed to by an interface) in which case typ is that type.
-	typ types.Type
-
-	// subelement indicates which directly embedded subelement of
-	// an object of aggregate type (struct, tuple, array) this is.
-	subelement *fieldInfo // e.g. ".a.b[*].c"
-
-	// Solver state for the canonical node of this pointer-
-	// equivalence class.  Each node is created with its own state
-	// but they become shared after HVN.
-	solve *solverState
-}
-
-// An analysis instance holds the state of a single pointer analysis problem.
-type analysis struct {
-	config      *Config                     // the client's control/observer interface
-	prog        *ssa.Program                // the program being analyzed
-	log         io.Writer                   // log stream; nil to disable
-	panicNode   nodeid                      // sink for panic, source for recover
-	nodes       []*node                     // indexed by nodeid
-	flattenMemo map[types.Type][]*fieldInfo // memoization of flatten()
-	trackTypes  map[types.Type]bool         // memoization of shouldTrack()
-	constraints []constraint                // set of constraints
-	cgnodes     []*cgnode                   // all cgnodes
-	genq        []*cgnode                   // queue of functions to generate constraints for
-	intrinsics  map[*ssa.Function]intrinsic // non-nil values are summaries for intrinsic fns
-	globalval   map[ssa.Value]nodeid        // node for each global ssa.Value
-	globalobj   map[ssa.Value]nodeid        // maps v to sole member of pts(v), if singleton
-	localval    map[ssa.Value]nodeid        // node for each local ssa.Value
-	localobj    map[ssa.Value]nodeid        // maps v to sole member of pts(v), if singleton
-	atFuncs     map[*ssa.Function]bool      // address-taken functions (for presolver)
-	mapValues   []nodeid                    // values of makemap objects (indirect in HVN)
-	work        nodeset                     // solver's worklist
-	result      *Result                     // results of the analysis
-	track       track                       // pointerlike types whose aliasing we track
-	deltaSpace  []int                       // working space for iterating over PTS deltas
-
-	// Reflection & intrinsics:
-	hasher              typeutil.Hasher // cache of type hashes
-	reflectValueObj     types.Object    // type symbol for reflect.Value (if present)
-	reflectValueCall    *ssa.Function   // (reflect.Value).Call
-	reflectRtypeObj     types.Object    // *types.TypeName for reflect.rtype (if present)
-	reflectRtypePtr     *types.Pointer  // *reflect.rtype
-	reflectType         *types.Named    // reflect.Type
-	rtypes              typeutil.Map    // nodeid of canonical *rtype-tagged object for type T
-	reflectZeros        typeutil.Map    // nodeid of canonical T-tagged object for zero value
-	runtimeSetFinalizer *ssa.Function   // runtime.SetFinalizer
-}
-
-// enclosingObj returns the first node of the addressable memory
-// object that encloses node id.  Panic ensues if that node does not
-// belong to any object.
-func (a *analysis) enclosingObj(id nodeid) nodeid {
-	// Find previous node with obj != nil.
-	for i := id; i >= 0; i-- {
-		n := a.nodes[i]
-		if obj := n.obj; obj != nil {
-			if i+nodeid(obj.size) <= id {
-				break // out of bounds
-			}
-			return i
-		}
-	}
-	panic("node has no enclosing object")
-}
-
-// labelFor returns the Label for node id.
-// Panic ensues if that node is not addressable.
-func (a *analysis) labelFor(id nodeid) *Label {
-	return &Label{
-		obj:        a.nodes[a.enclosingObj(id)].obj,
-		subelement: a.nodes[id].subelement,
-	}
-}
-
-func (a *analysis) warnf(pos token.Pos, format string, args ...interface{}) {
-	msg := fmt.Sprintf(format, args...)
-	if a.log != nil {
-		fmt.Fprintf(a.log, "%s: warning: %s\n", a.prog.Fset.Position(pos), msg)
-	}
-	a.result.Warnings = append(a.result.Warnings, Warning{pos, msg})
-}
-
-// computeTrackBits sets a.track to the necessary 'track' bits for the pointer queries.
-func (a *analysis) computeTrackBits() {
-	var queryTypes []types.Type
-	for v := range a.config.Queries {
-		queryTypes = append(queryTypes, v.Type())
-	}
-	for v := range a.config.IndirectQueries {
-		queryTypes = append(queryTypes, mustDeref(v.Type()))
-	}
-	for _, t := range queryTypes {
-		switch t.Underlying().(type) {
-		case *types.Chan:
-			a.track |= trackChan
-		case *types.Map:
-			a.track |= trackMap
-		case *types.Pointer:
-			a.track |= trackPtr
-		case *types.Slice:
-			a.track |= trackSlice
-		case *types.Interface:
-			a.track = trackAll
-			return
-		}
-		if rVObj := a.reflectValueObj; rVObj != nil && types.Identical(t, rVObj.Type()) {
-			a.track = trackAll
-			return
-		}
-	}
-}
-
-// Analyze runs the pointer analysis with the scope and options
-// specified by config, and returns the (synthetic) root of the callgraph.
-//
-// Pointer analysis of a transitively closed well-typed program should
-// always succeed.  An error can occur only due to an internal bug.
-//
-func Analyze(config *Config) (result *Result, err error) {
-	if config.Mains == nil {
-		return nil, fmt.Errorf("no main/test packages to analyze (check $GOROOT/$GOPATH)")
-	}
-	defer func() {
-		if p := recover(); p != nil {
-			err = fmt.Errorf("internal error in pointer analysis: %v (please report this bug)", p)
-			fmt.Fprintln(os.Stderr, "Internal panic in pointer analysis:")
-			debug.PrintStack()
-		}
-	}()
-
-	a := &analysis{
-		config:      config,
-		log:         config.Log,
-		prog:        config.prog(),
-		globalval:   make(map[ssa.Value]nodeid),
-		globalobj:   make(map[ssa.Value]nodeid),
-		flattenMemo: make(map[types.Type][]*fieldInfo),
-		trackTypes:  make(map[types.Type]bool),
-		atFuncs:     make(map[*ssa.Function]bool),
-		hasher:      typeutil.MakeHasher(),
-		intrinsics:  make(map[*ssa.Function]intrinsic),
-		result: &Result{
-			Queries:         make(map[ssa.Value]Pointer),
-			IndirectQueries: make(map[ssa.Value]Pointer),
-		},
-		deltaSpace: make([]int, 0, 100),
-	}
-
-	if false {
-		a.log = os.Stderr // for debugging crashes; extremely verbose
-	}
-
-	if a.log != nil {
-		fmt.Fprintln(a.log, "==== Starting analysis")
-	}
-
-	// Pointer analysis requires a complete program for soundness.
-	// Check to prevent accidental misconfiguration.
-	for _, pkg := range a.prog.AllPackages() {
-		// (This only checks that the package scope is complete,
-		// not that func bodies exist, but it's a good signal.)
-		if !pkg.Object.Complete() {
-			return nil, fmt.Errorf(`pointer analysis requires a complete program yet package %q was incomplete (don't set loader.Config.ImportFromBinary during loading)`, pkg.Object.Path())
-		}
-	}
-
-	if reflect := a.prog.ImportedPackage("reflect"); reflect != nil {
-		rV := reflect.Object.Scope().Lookup("Value")
-		a.reflectValueObj = rV
-		a.reflectValueCall = a.prog.LookupMethod(rV.Type(), nil, "Call")
-		a.reflectType = reflect.Object.Scope().Lookup("Type").Type().(*types.Named)
-		a.reflectRtypeObj = reflect.Object.Scope().Lookup("rtype")
-		a.reflectRtypePtr = types.NewPointer(a.reflectRtypeObj.Type())
-
-		// Override flattening of reflect.Value, treating it like a basic type.
-		tReflectValue := a.reflectValueObj.Type()
-		a.flattenMemo[tReflectValue] = []*fieldInfo{{typ: tReflectValue}}
-
-		// Override shouldTrack of reflect.Value and *reflect.rtype.
-		// Always track pointers of these types.
-		a.trackTypes[tReflectValue] = true
-		a.trackTypes[a.reflectRtypePtr] = true
-
-		a.rtypes.SetHasher(a.hasher)
-		a.reflectZeros.SetHasher(a.hasher)
-	}
-	if runtime := a.prog.ImportedPackage("runtime"); runtime != nil {
-		a.runtimeSetFinalizer = runtime.Func("SetFinalizer")
-	}
-	a.computeTrackBits()
-
-	a.generate()
-	a.showCounts()
-
-	if optRenumber {
-		a.renumber()
-	}
-
-	N := len(a.nodes) // excludes solver-created nodes
-
-	if optHVN {
-		if debugHVNCrossCheck {
-			// Cross-check: run the solver once without
-			// optimization, once with, and compare the
-			// solutions.
-			savedConstraints := a.constraints
-
-			a.solve()
-			a.dumpSolution("A.pts", N)
-
-			// Restore.
-			a.constraints = savedConstraints
-			for _, n := range a.nodes {
-				n.solve = new(solverState)
-			}
-			a.nodes = a.nodes[:N]
-
-			// rtypes is effectively part of the solver state.
-			a.rtypes = typeutil.Map{}
-			a.rtypes.SetHasher(a.hasher)
-		}
-
-		a.hvn()
-	}
-
-	if debugHVNCrossCheck {
-		runtime.GC()
-		runtime.GC()
-	}
-
-	a.solve()
-
-	// Compare solutions.
-	if optHVN && debugHVNCrossCheck {
-		a.dumpSolution("B.pts", N)
-
-		if !diff("A.pts", "B.pts") {
-			return nil, fmt.Errorf("internal error: optimization changed solution")
-		}
-	}
-
-	// Create callgraph.Nodes in deterministic order.
-	if cg := a.result.CallGraph; cg != nil {
-		for _, caller := range a.cgnodes {
-			cg.CreateNode(caller.fn)
-		}
-	}
-
-	// Add dynamic edges to call graph.
-	var space [100]int
-	for _, caller := range a.cgnodes {
-		for _, site := range caller.sites {
-			for _, callee := range a.nodes[site.targets].solve.pts.AppendTo(space[:0]) {
-				a.callEdge(caller, site, nodeid(callee))
-			}
-		}
-	}
-
-	return a.result, nil
-}
-
-// callEdge is called for each edge in the callgraph.
-// calleeid is the callee's object node (has otFunction flag).
-//
-func (a *analysis) callEdge(caller *cgnode, site *callsite, calleeid nodeid) {
-	obj := a.nodes[calleeid].obj
-	if obj.flags&otFunction == 0 {
-		panic(fmt.Sprintf("callEdge %s -> n%d: not a function object", site, calleeid))
-	}
-	callee := obj.cgn
-
-	if cg := a.result.CallGraph; cg != nil {
-		// TODO(adonovan): opt: I would expect duplicate edges
-		// (to wrappers) to arise due to the elimination of
-		// context information, but I haven't observed any.
-		// Understand this better.
-		callgraph.AddEdge(cg.CreateNode(caller.fn), site.instr, cg.CreateNode(callee.fn))
-	}
-
-	if a.log != nil {
-		fmt.Fprintf(a.log, "\tcall edge %s -> %s\n", site, callee)
-	}
-
-	// Warn about calls to non-intrinsic external functions.
-	// TODO(adonovan): de-dup these messages.
-	if fn := callee.fn; fn.Blocks == nil && a.findIntrinsic(fn) == nil {
-		a.warnf(site.pos(), "unsound call to unknown intrinsic: %s", fn)
-		a.warnf(fn.Pos(), " (declared here)")
-	}
-}
-
-// dumpSolution writes the PTS solution to the specified file.
-//
-// It only dumps the nodes that existed before solving.  The order in
-// which solver-created nodes are created depends on pre-solver
-// optimization, so we can't include them in the cross-check.
-//
-func (a *analysis) dumpSolution(filename string, N int) {
-	f, err := os.Create(filename)
-	if err != nil {
-		panic(err)
-	}
-	for id, n := range a.nodes[:N] {
-		if _, err := fmt.Fprintf(f, "pts(n%d) = {", id); err != nil {
-			panic(err)
-		}
-		var sep string
-		for _, l := range n.solve.pts.AppendTo(a.deltaSpace) {
-			if l >= N {
-				break
-			}
-			fmt.Fprintf(f, "%s%d", sep, l)
-			sep = " "
-		}
-		fmt.Fprintf(f, "} : %s\n", n.typ)
-	}
-	if err := f.Close(); err != nil {
-		panic(err)
-	}
-}
-
-// showCounts logs the size of the constraint system.  A typical
-// optimized distribution is 65% copy, 13% load, 11% addr, 5%
-// offsetAddr, 4% store, 2% others.
-//
-func (a *analysis) showCounts() {
-	if a.log != nil {
-		counts := make(map[reflect.Type]int)
-		for _, c := range a.constraints {
-			counts[reflect.TypeOf(c)]++
-		}
-		fmt.Fprintf(a.log, "# constraints:\t%d\n", len(a.constraints))
-		var lines []string
-		for t, n := range counts {
-			line := fmt.Sprintf("%7d  (%2d%%)\t%s", n, 100*n/len(a.constraints), t)
-			lines = append(lines, line)
-		}
-		sort.Sort(sort.Reverse(sort.StringSlice(lines)))
-		for _, line := range lines {
-			fmt.Fprintf(a.log, "\t%s\n", line)
-		}
-
-		fmt.Fprintf(a.log, "# nodes:\t%d\n", len(a.nodes))
-
-		// Show number of pointer equivalence classes.
-		m := make(map[*solverState]bool)
-		for _, n := range a.nodes {
-			m[n.solve] = true
-		}
-		fmt.Fprintf(a.log, "# ptsets:\t%d\n", len(m))
-	}
-}
diff --git a/third_party/gotools/go/pointer/api.go b/third_party/gotools/go/pointer/api.go
deleted file mode 100644
index 6042aa5..0000000
--- a/third_party/gotools/go/pointer/api.go
+++ /dev/null
@@ -1,245 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import (
-	"bytes"
-	"fmt"
-	"go/token"
-	"io"
-
-	"llvm.org/llgo/third_party/gotools/container/intsets"
-	"llvm.org/llgo/third_party/gotools/go/callgraph"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-)
-
-// A Config formulates a pointer analysis problem for Analyze().
-type Config struct {
-	// Mains contains the set of 'main' packages to analyze
-	// Clients must provide the analysis with at least one
-	// package defining a main() function.
-	//
-	// Non-main packages in the ssa.Program that are not
-	// dependencies of any main package may still affect the
-	// analysis result, because they contribute runtime types and
-	// thus methods.
-	// TODO(adonovan): investigate whether this is desirable.
-	Mains []*ssa.Package
-
-	// Reflection determines whether to handle reflection
-	// operators soundly, which is currently rather slow since it
-	// causes constraint to be generated during solving
-	// proportional to the number of constraint variables, which
-	// has not yet been reduced by presolver optimisation.
-	Reflection bool
-
-	// BuildCallGraph determines whether to construct a callgraph.
-	// If enabled, the graph will be available in Result.CallGraph.
-	BuildCallGraph bool
-
-	// The client populates Queries[v] or IndirectQueries[v]
-	// for each ssa.Value v of interest, to request that the
-	// points-to sets pts(v) or pts(*v) be computed.  If the
-	// client needs both points-to sets, v may appear in both
-	// maps.
-	//
-	// (IndirectQueries is typically used for Values corresponding
-	// to source-level lvalues, e.g. an *ssa.Global.)
-	//
-	// The analysis populates the corresponding
-	// Result.{Indirect,}Queries map when it creates the pointer
-	// variable for v or *v.  Upon completion the client can
-	// inspect that map for the results.
-	//
-	// TODO(adonovan): this API doesn't scale well for batch tools
-	// that want to dump the entire solution.  Perhaps optionally
-	// populate a map[*ssa.DebugRef]Pointer in the Result, one
-	// entry per source expression.
-	//
-	Queries         map[ssa.Value]struct{}
-	IndirectQueries map[ssa.Value]struct{}
-
-	// If Log is non-nil, log messages are written to it.
-	// Logging is extremely verbose.
-	Log io.Writer
-}
-
-type track uint32
-
-const (
-	trackChan  track = 1 << iota // track 'chan' references
-	trackMap                     // track 'map' references
-	trackPtr                     // track regular pointers
-	trackSlice                   // track slice references
-
-	trackAll = ^track(0)
-)
-
-// AddQuery adds v to Config.Queries.
-// Precondition: CanPoint(v.Type()).
-// TODO(adonovan): consider returning a new Pointer for this query,
-// which will be initialized during analysis.  That avoids the needs
-// for the corresponding ssa.Value-keyed maps in Config and Result.
-func (c *Config) AddQuery(v ssa.Value) {
-	if !CanPoint(v.Type()) {
-		panic(fmt.Sprintf("%s is not a pointer-like value: %s", v, v.Type()))
-	}
-	if c.Queries == nil {
-		c.Queries = make(map[ssa.Value]struct{})
-	}
-	c.Queries[v] = struct{}{}
-}
-
-// AddQuery adds v to Config.IndirectQueries.
-// Precondition: CanPoint(v.Type().Underlying().(*types.Pointer).Elem()).
-func (c *Config) AddIndirectQuery(v ssa.Value) {
-	if c.IndirectQueries == nil {
-		c.IndirectQueries = make(map[ssa.Value]struct{})
-	}
-	if !CanPoint(mustDeref(v.Type())) {
-		panic(fmt.Sprintf("%s is not the address of a pointer-like value: %s", v, v.Type()))
-	}
-	c.IndirectQueries[v] = struct{}{}
-}
-
-func (c *Config) prog() *ssa.Program {
-	for _, main := range c.Mains {
-		return main.Prog
-	}
-	panic("empty scope")
-}
-
-type Warning struct {
-	Pos     token.Pos
-	Message string
-}
-
-// A Result contains the results of a pointer analysis.
-//
-// See Config for how to request the various Result components.
-//
-type Result struct {
-	CallGraph       *callgraph.Graph      // discovered call graph
-	Queries         map[ssa.Value]Pointer // pts(v) for each v in Config.Queries.
-	IndirectQueries map[ssa.Value]Pointer // pts(*v) for each v in Config.IndirectQueries.
-	Warnings        []Warning             // warnings of unsoundness
-}
-
-// A Pointer is an equivalence class of pointer-like values.
-//
-// A Pointer doesn't have a unique type because pointers of distinct
-// types may alias the same object.
-//
-type Pointer struct {
-	a *analysis
-	n nodeid
-}
-
-// A PointsToSet is a set of labels (locations or allocations).
-type PointsToSet struct {
-	a   *analysis // may be nil if pts is nil
-	pts *nodeset
-}
-
-func (s PointsToSet) String() string {
-	var buf bytes.Buffer
-	buf.WriteByte('[')
-	if s.pts != nil {
-		var space [50]int
-		for i, l := range s.pts.AppendTo(space[:0]) {
-			if i > 0 {
-				buf.WriteString(", ")
-			}
-			buf.WriteString(s.a.labelFor(nodeid(l)).String())
-		}
-	}
-	buf.WriteByte(']')
-	return buf.String()
-}
-
-// PointsTo returns the set of labels that this points-to set
-// contains.
-func (s PointsToSet) Labels() []*Label {
-	var labels []*Label
-	if s.pts != nil {
-		var space [50]int
-		for _, l := range s.pts.AppendTo(space[:0]) {
-			labels = append(labels, s.a.labelFor(nodeid(l)))
-		}
-	}
-	return labels
-}
-
-// If this PointsToSet came from a Pointer of interface kind
-// or a reflect.Value, DynamicTypes returns the set of dynamic
-// types that it may contain.  (For an interface, they will
-// always be concrete types.)
-//
-// The result is a mapping whose keys are the dynamic types to which
-// it may point.  For each pointer-like key type, the corresponding
-// map value is the PointsToSet for pointers of that type.
-//
-// The result is empty unless CanHaveDynamicTypes(T).
-//
-func (s PointsToSet) DynamicTypes() *typeutil.Map {
-	var tmap typeutil.Map
-	tmap.SetHasher(s.a.hasher)
-	if s.pts != nil {
-		var space [50]int
-		for _, x := range s.pts.AppendTo(space[:0]) {
-			ifaceObjId := nodeid(x)
-			if !s.a.isTaggedObject(ifaceObjId) {
-				continue // !CanHaveDynamicTypes(tDyn)
-			}
-			tDyn, v, indirect := s.a.taggedValue(ifaceObjId)
-			if indirect {
-				panic("indirect tagged object") // implement later
-			}
-			pts, ok := tmap.At(tDyn).(PointsToSet)
-			if !ok {
-				pts = PointsToSet{s.a, new(nodeset)}
-				tmap.Set(tDyn, pts)
-			}
-			pts.pts.addAll(&s.a.nodes[v].solve.pts)
-		}
-	}
-	return &tmap
-}
-
-// Intersects reports whether this points-to set and the
-// argument points-to set contain common members.
-func (x PointsToSet) Intersects(y PointsToSet) bool {
-	if x.pts == nil || y.pts == nil {
-		return false
-	}
-	// This takes Θ(|x|+|y|) time.
-	var z intsets.Sparse
-	z.Intersection(&x.pts.Sparse, &y.pts.Sparse)
-	return !z.IsEmpty()
-}
-
-func (p Pointer) String() string {
-	return fmt.Sprintf("n%d", p.n)
-}
-
-// PointsTo returns the points-to set of this pointer.
-func (p Pointer) PointsTo() PointsToSet {
-	if p.n == 0 {
-		return PointsToSet{}
-	}
-	return PointsToSet{p.a, &p.a.nodes[p.n].solve.pts}
-}
-
-// MayAlias reports whether the receiver pointer may alias
-// the argument pointer.
-func (p Pointer) MayAlias(q Pointer) bool {
-	return p.PointsTo().Intersects(q.PointsTo())
-}
-
-// DynamicTypes returns p.PointsTo().DynamicTypes().
-func (p Pointer) DynamicTypes() *typeutil.Map {
-	return p.PointsTo().DynamicTypes()
-}
diff --git a/third_party/gotools/go/pointer/callgraph.go b/third_party/gotools/go/pointer/callgraph.go
deleted file mode 100644
index 165059f..0000000
--- a/third_party/gotools/go/pointer/callgraph.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file defines the internal (context-sensitive) call graph.
-
-import (
-	"fmt"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-)
-
-type cgnode struct {
-	fn         *ssa.Function
-	obj        nodeid      // start of this contour's object block
-	sites      []*callsite // ordered list of callsites within this function
-	callersite *callsite   // where called from, if known; nil for shared contours
-}
-
-// contour returns a description of this node's contour.
-func (n *cgnode) contour() string {
-	if n.callersite == nil {
-		return "shared contour"
-	}
-	if n.callersite.instr != nil {
-		return fmt.Sprintf("as called from %s", n.callersite.instr.Parent())
-	}
-	return fmt.Sprintf("as called from intrinsic (targets=n%d)", n.callersite.targets)
-}
-
-func (n *cgnode) String() string {
-	return fmt.Sprintf("cg%d:%s", n.obj, n.fn)
-}
-
-// A callsite represents a single call site within a cgnode;
-// it is implicitly context-sensitive.
-// callsites never represent calls to built-ins;
-// they are handled as intrinsics.
-//
-type callsite struct {
-	targets nodeid              // pts(·) contains objects for dynamically called functions
-	instr   ssa.CallInstruction // the call instruction; nil for synthetic/intrinsic
-}
-
-func (c *callsite) String() string {
-	if c.instr != nil {
-		return c.instr.Common().Description()
-	}
-	return "synthetic function call"
-}
-
-// pos returns the source position of this callsite, or token.NoPos if implicit.
-func (c *callsite) pos() token.Pos {
-	if c.instr != nil {
-		return c.instr.Pos()
-	}
-	return token.NoPos
-}
diff --git a/third_party/gotools/go/pointer/constraint.go b/third_party/gotools/go/pointer/constraint.go
deleted file mode 100644
index 0a3535a..0000000
--- a/third_party/gotools/go/pointer/constraint.go
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-type constraint interface {
-	// For a complex constraint, returns the nodeid of the pointer
-	// to which it is attached.   For addr and copy, returns dst.
-	ptr() nodeid
-
-	// renumber replaces each nodeid n in the constraint by mapping[n].
-	renumber(mapping []nodeid)
-
-	// presolve is a hook for constraint-specific behaviour during
-	// pre-solver optimization.  Typical implementations mark as
-	// indirect the set of nodes to which the solver will add copy
-	// edges or PTS labels.
-	presolve(h *hvn)
-
-	// solve is called for complex constraints when the pts for
-	// the node to which they are attached has changed.
-	solve(a *analysis, delta *nodeset)
-
-	String() string
-}
-
-// dst = &src
-// pts(dst) ⊇ {src}
-// A base constraint used to initialize the solver's pt sets
-type addrConstraint struct {
-	dst nodeid // (ptr)
-	src nodeid
-}
-
-func (c *addrConstraint) ptr() nodeid { return c.dst }
-func (c *addrConstraint) renumber(mapping []nodeid) {
-	c.dst = mapping[c.dst]
-	c.src = mapping[c.src]
-}
-
-// dst = src
-// A simple constraint represented directly as a copyTo graph edge.
-type copyConstraint struct {
-	dst nodeid // (ptr)
-	src nodeid
-}
-
-func (c *copyConstraint) ptr() nodeid { return c.dst }
-func (c *copyConstraint) renumber(mapping []nodeid) {
-	c.dst = mapping[c.dst]
-	c.src = mapping[c.src]
-}
-
-// dst = src[offset]
-// A complex constraint attached to src (the pointer)
-type loadConstraint struct {
-	offset uint32
-	dst    nodeid
-	src    nodeid // (ptr)
-}
-
-func (c *loadConstraint) ptr() nodeid { return c.src }
-func (c *loadConstraint) renumber(mapping []nodeid) {
-	c.dst = mapping[c.dst]
-	c.src = mapping[c.src]
-}
-
-// dst[offset] = src
-// A complex constraint attached to dst (the pointer)
-type storeConstraint struct {
-	offset uint32
-	dst    nodeid // (ptr)
-	src    nodeid
-}
-
-func (c *storeConstraint) ptr() nodeid { return c.dst }
-func (c *storeConstraint) renumber(mapping []nodeid) {
-	c.dst = mapping[c.dst]
-	c.src = mapping[c.src]
-}
-
-// dst = &src.f  or  dst = &src[0]
-// A complex constraint attached to dst (the pointer)
-type offsetAddrConstraint struct {
-	offset uint32
-	dst    nodeid
-	src    nodeid // (ptr)
-}
-
-func (c *offsetAddrConstraint) ptr() nodeid { return c.src }
-func (c *offsetAddrConstraint) renumber(mapping []nodeid) {
-	c.dst = mapping[c.dst]
-	c.src = mapping[c.src]
-}
-
-// dst = src.(typ)  where typ is an interface
-// A complex constraint attached to src (the interface).
-// No representation change: pts(dst) and pts(src) contains tagged objects.
-type typeFilterConstraint struct {
-	typ types.Type // an interface type
-	dst nodeid
-	src nodeid // (ptr)
-}
-
-func (c *typeFilterConstraint) ptr() nodeid { return c.src }
-func (c *typeFilterConstraint) renumber(mapping []nodeid) {
-	c.dst = mapping[c.dst]
-	c.src = mapping[c.src]
-}
-
-// dst = src.(typ)  where typ is a concrete type
-// A complex constraint attached to src (the interface).
-//
-// If exact, only tagged objects identical to typ are untagged.
-// If !exact, tagged objects assignable to typ are untagged too.
-// The latter is needed for various reflect operators, e.g. Send.
-//
-// This entails a representation change:
-// pts(src) contains tagged objects,
-// pts(dst) contains their payloads.
-type untagConstraint struct {
-	typ   types.Type // a concrete type
-	dst   nodeid
-	src   nodeid // (ptr)
-	exact bool
-}
-
-func (c *untagConstraint) ptr() nodeid { return c.src }
-func (c *untagConstraint) renumber(mapping []nodeid) {
-	c.dst = mapping[c.dst]
-	c.src = mapping[c.src]
-}
-
-// src.method(params...)
-// A complex constraint attached to iface.
-type invokeConstraint struct {
-	method *types.Func // the abstract method
-	iface  nodeid      // (ptr) the interface
-	params nodeid      // the start of the identity/params/results block
-}
-
-func (c *invokeConstraint) ptr() nodeid { return c.iface }
-func (c *invokeConstraint) renumber(mapping []nodeid) {
-	c.iface = mapping[c.iface]
-	c.params = mapping[c.params]
-}
diff --git a/third_party/gotools/go/pointer/doc.go b/third_party/gotools/go/pointer/doc.go
deleted file mode 100644
index 4da599f..0000000
--- a/third_party/gotools/go/pointer/doc.go
+++ /dev/null
@@ -1,610 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-
-Package pointer implements Andersen's analysis, an inclusion-based
-pointer analysis algorithm first described in (Andersen, 1994).
-
-A pointer analysis relates every pointer expression in a whole program
-to the set of memory locations to which it might point.  This
-information can be used to construct a call graph of the program that
-precisely represents the destinations of dynamic function and method
-calls.  It can also be used to determine, for example, which pairs of
-channel operations operate on the same channel.
-
-The package allows the client to request a set of expressions of
-interest for which the points-to information will be returned once the
-analysis is complete.  In addition, the client may request that a
-callgraph is constructed.  The example program in example_test.go
-demonstrates both of these features.  Clients should not request more
-information than they need since it may increase the cost of the
-analysis significantly.
-
-
-CLASSIFICATION
-
-Our algorithm is INCLUSION-BASED: the points-to sets for x and y will
-be related by pts(y) ⊇ pts(x) if the program contains the statement
-y = x.
-
-It is FLOW-INSENSITIVE: it ignores all control flow constructs and the
-order of statements in a program.  It is therefore a "MAY ALIAS"
-analysis: its facts are of the form "P may/may not point to L",
-not "P must point to L".
-
-It is FIELD-SENSITIVE: it builds separate points-to sets for distinct
-fields, such as x and y in struct { x, y *int }.
-
-It is mostly CONTEXT-INSENSITIVE: most functions are analyzed once,
-so values can flow in at one call to the function and return out at
-another.  Only some smaller functions are analyzed with consideration
-of their calling context.
-
-It has a CONTEXT-SENSITIVE HEAP: objects are named by both allocation
-site and context, so the objects returned by two distinct calls to f:
-   func f() *T { return new(T) }
-are distinguished up to the limits of the calling context.
-
-It is a WHOLE PROGRAM analysis: it requires SSA-form IR for the
-complete Go program and summaries for native code.
-
-See the (Hind, PASTE'01) survey paper for an explanation of these terms.
-
-
-SOUNDNESS
-
-The analysis is fully sound when invoked on pure Go programs that do not
-use reflection or unsafe.Pointer conversions.  In other words, if there
-is any possible execution of the program in which pointer P may point to
-object O, the analysis will report that fact.
-
-
-REFLECTION
-
-By default, the "reflect" library is ignored by the analysis, as if all
-its functions were no-ops, but if the client enables the Reflection flag,
-the analysis will make a reasonable attempt to model the effects of
-calls into this library.  However, this comes at a significant
-performance cost, and not all features of that library are yet
-implemented.  In addition, some simplifying approximations must be made
-to ensure that the analysis terminates; for example, reflection can be
-used to construct an infinite set of types and values of those types,
-but the analysis arbitrarily bounds the depth of such types.
-
-Most but not all reflection operations are supported.
-In particular, addressable reflect.Values are not yet implemented, so
-operations such as (reflect.Value).Set have no analytic effect.
-
-
-UNSAFE POINTER CONVERSIONS
-
-The pointer analysis makes no attempt to understand aliasing between the
-operand x and result y of an unsafe.Pointer conversion:
-   y = (*T)(unsafe.Pointer(x))
-It is as if the conversion allocated an entirely new object:
-   y = new(T)
-
-
-NATIVE CODE
-
-The analysis cannot model the aliasing effects of functions written in
-languages other than Go, such as runtime intrinsics in C or assembly, or
-code accessed via cgo.  The result is as if such functions are no-ops.
-However, various important intrinsics are understood by the analysis,
-along with built-ins such as append.
-
-The analysis currently provides no way for users to specify the aliasing
-effects of native code.
-
-------------------------------------------------------------------------
-
-IMPLEMENTATION
-
-The remaining documentation is intended for package maintainers and
-pointer analysis specialists.  Maintainers should have a solid
-understanding of the referenced papers (especially those by H&L and PKH)
-before making making significant changes.
-
-The implementation is similar to that described in (Pearce et al,
-PASTE'04).  Unlike many algorithms which interleave constraint
-generation and solving, constructing the callgraph as they go, this
-implementation for the most part observes a phase ordering (generation
-before solving), with only simple (copy) constraints being generated
-during solving.  (The exception is reflection, which creates various
-constraints during solving as new types flow to reflect.Value
-operations.)  This improves the traction of presolver optimisations,
-but imposes certain restrictions, e.g. potential context sensitivity
-is limited since all variants must be created a priori.
-
-
-TERMINOLOGY
-
-A type is said to be "pointer-like" if it is a reference to an object.
-Pointer-like types include pointers and also interfaces, maps, channels,
-functions and slices.
-
-We occasionally use C's x->f notation to distinguish the case where x
-is a struct pointer from x.f where is a struct value.
-
-Pointer analysis literature (and our comments) often uses the notation
-dst=*src+offset to mean something different than what it means in Go.
-It means: for each node index p in pts(src), the node index p+offset is
-in pts(dst).  Similarly *dst+offset=src is used for store constraints
-and dst=src+offset for offset-address constraints.
-
-
-NODES
-
-Nodes are the key datastructure of the analysis, and have a dual role:
-they represent both constraint variables (equivalence classes of
-pointers) and members of points-to sets (things that can be pointed
-at, i.e. "labels").
-
-Nodes are naturally numbered.  The numbering enables compact
-representations of sets of nodes such as bitvectors (or BDDs); and the
-ordering enables a very cheap way to group related nodes together.  For
-example, passing n parameters consists of generating n parallel
-constraints from caller+i to callee+i for 0<=i<n.
-
-The zero nodeid means "not a pointer".  For simplicity, we generate flow
-constraints even for non-pointer types such as int.  The pointer
-equivalence (PE) presolver optimization detects which variables cannot
-point to anything; this includes not only all variables of non-pointer
-types (such as int) but also variables of pointer-like types if they are
-always nil, or are parameters to a function that is never called.
-
-Each node represents a scalar part of a value or object.
-Aggregate types (structs, tuples, arrays) are recursively flattened
-out into a sequential list of scalar component types, and all the
-elements of an array are represented by a single node.  (The
-flattening of a basic type is a list containing a single node.)
-
-Nodes are connected into a graph with various kinds of labelled edges:
-simple edges (or copy constraints) represent value flow.  Complex
-edges (load, store, etc) trigger the creation of new simple edges
-during the solving phase.
-
-
-OBJECTS
-
-Conceptually, an "object" is a contiguous sequence of nodes denoting
-an addressable location: something that a pointer can point to.  The
-first node of an object has a non-nil obj field containing information
-about the allocation: its size, context, and ssa.Value.
-
-Objects include:
-   - functions and globals;
-   - variable allocations in the stack frame or heap;
-   - maps, channels and slices created by calls to make();
-   - allocations to construct an interface;
-   - allocations caused by conversions, e.g. []byte(str).
-   - arrays allocated by calls to append();
-
-Many objects have no Go types.  For example, the func, map and chan type
-kinds in Go are all varieties of pointers, but their respective objects
-are actual functions (executable code), maps (hash tables), and channels
-(synchronized queues).  Given the way we model interfaces, they too are
-pointers to "tagged" objects with no Go type.  And an *ssa.Global denotes
-the address of a global variable, but the object for a Global is the
-actual data.  So, the types of an ssa.Value that creates an object is
-"off by one indirection": a pointer to the object.
-
-The individual nodes of an object are sometimes referred to as "labels".
-
-For uniformity, all objects have a non-zero number of fields, even those
-of the empty type struct{}.  (All arrays are treated as if of length 1,
-so there are no empty arrays.  The empty tuple is never address-taken,
-so is never an object.)
-
-
-TAGGED OBJECTS
-
-An tagged object has the following layout:
-
-    T          -- obj.flags ⊇ {otTagged}
-    v
-    ...
-
-The T node's typ field is the dynamic type of the "payload": the value
-v which follows, flattened out.  The T node's obj has the otTagged
-flag.
-
-Tagged objects are needed when generalizing across types: interfaces,
-reflect.Values, reflect.Types.  Each of these three types is modelled
-as a pointer that exclusively points to tagged objects.
-
-Tagged objects may be indirect (obj.flags ⊇ {otIndirect}) meaning that
-the value v is not of type T but *T; this is used only for
-reflect.Values that represent lvalues.  (These are not implemented yet.)
-
-
-ANALYSIS ABSTRACTION OF EACH TYPE
-
-Variables of the following "scalar" types may be represented by a
-single node: basic types, pointers, channels, maps, slices, 'func'
-pointers, interfaces.
-
-Pointers
-  Nothing to say here, oddly.
-
-Basic types (bool, string, numbers, unsafe.Pointer)
-  Currently all fields in the flattening of a type, including
-  non-pointer basic types such as int, are represented in objects and
-  values.  Though non-pointer nodes within values are uninteresting,
-  non-pointer nodes in objects may be useful (if address-taken)
-  because they permit the analysis to deduce, in this example,
-
-     var s struct{ ...; x int; ... }
-     p := &s.x
-
-  that p points to s.x.  If we ignored such object fields, we could only
-  say that p points somewhere within s.
-
-  All other basic types are ignored.  Expressions of these types have
-  zero nodeid, and fields of these types within aggregate other types
-  are omitted.
-
-  unsafe.Pointers are not modelled as pointers, so a conversion of an
-  unsafe.Pointer to *T is (unsoundly) treated equivalent to new(T).
-
-Channels
-  An expression of type 'chan T' is a kind of pointer that points
-  exclusively to channel objects, i.e. objects created by MakeChan (or
-  reflection).
-
-  'chan T' is treated like *T.
-  *ssa.MakeChan is treated as equivalent to new(T).
-  *ssa.Send and receive (*ssa.UnOp(ARROW)) and are equivalent to store
-   and load.
-
-Maps
-  An expression of type 'map[K]V' is a kind of pointer that points
-  exclusively to map objects, i.e. objects created by MakeMap (or
-  reflection).
-
-  map K[V] is treated like *M where M = struct{k K; v V}.
-  *ssa.MakeMap is equivalent to new(M).
-  *ssa.MapUpdate is equivalent to *y=x where *y and x have type M.
-  *ssa.Lookup is equivalent to y=x.v where x has type *M.
-
-Slices
-  A slice []T, which dynamically resembles a struct{array *T, len, cap int},
-  is treated as if it were just a *T pointer; the len and cap fields are
-  ignored.
-
-  *ssa.MakeSlice is treated like new([1]T): an allocation of a
-   singleton array.
-  *ssa.Index on a slice is equivalent to a load.
-  *ssa.IndexAddr on a slice returns the address of the sole element of the
-  slice, i.e. the same address.
-  *ssa.Slice is treated as a simple copy.
-
-Functions
-  An expression of type 'func...' is a kind of pointer that points
-  exclusively to function objects.
-
-  A function object has the following layout:
-
-     identity         -- typ:*types.Signature; obj.flags ⊇ {otFunction}
-     params_0         -- (the receiver, if a method)
-     ...
-     params_n-1
-     results_0
-     ...
-     results_m-1
-
-  There may be multiple function objects for the same *ssa.Function
-  due to context-sensitive treatment of some functions.
-
-  The first node is the function's identity node.
-  Associated with every callsite is a special "targets" variable,
-  whose pts() contains the identity node of each function to which
-  the call may dispatch.  Identity words are not otherwise used during
-  the analysis, but we construct the call graph from the pts()
-  solution for such nodes.
-
-  The following block of contiguous nodes represents the flattened-out
-  types of the parameters ("P-block") and results ("R-block") of the
-  function object.
-
-  The treatment of free variables of closures (*ssa.FreeVar) is like
-  that of global variables; it is not context-sensitive.
-  *ssa.MakeClosure instructions create copy edges to Captures.
-
-  A Go value of type 'func' (i.e. a pointer to one or more functions)
-  is a pointer whose pts() contains function objects.  The valueNode()
-  for an *ssa.Function returns a singleton for that function.
-
-Interfaces
-  An expression of type 'interface{...}' is a kind of pointer that
-  points exclusively to tagged objects.  All tagged objects pointed to
-  by an interface are direct (the otIndirect flag is clear) and
-  concrete (the tag type T is not itself an interface type).  The
-  associated ssa.Value for an interface's tagged objects may be an
-  *ssa.MakeInterface instruction, or nil if the tagged object was
-  created by an instrinsic (e.g. reflection).
-
-  Constructing an interface value causes generation of constraints for
-  all of the concrete type's methods; we can't tell a priori which
-  ones may be called.
-
-  TypeAssert y = x.(T) is implemented by a dynamic constraint
-  triggered by each tagged object O added to pts(x): a typeFilter
-  constraint if T is an interface type, or an untag constraint if T is
-  a concrete type.  A typeFilter tests whether O.typ implements T; if
-  so, O is added to pts(y).  An untagFilter tests whether O.typ is
-  assignable to T,and if so, a copy edge O.v -> y is added.
-
-  ChangeInterface is a simple copy because the representation of
-  tagged objects is independent of the interface type (in contrast
-  to the "method tables" approach used by the gc runtime).
-
-  y := Invoke x.m(...) is implemented by allocating contiguous P/R
-  blocks for the callsite and adding a dynamic rule triggered by each
-  tagged object added to pts(x).  The rule adds param/results copy
-  edges to/from each discovered concrete method.
-
-  (Q. Why do we model an interface as a pointer to a pair of type and
-  value, rather than as a pair of a pointer to type and a pointer to
-  value?
-  A. Control-flow joins would merge interfaces ({T1}, {V1}) and ({T2},
-  {V2}) to make ({T1,T2}, {V1,V2}), leading to the infeasible and
-  type-unsafe combination (T1,V2).  Treating the value and its concrete
-  type as inseparable makes the analysis type-safe.)
-
-reflect.Value
-  A reflect.Value is modelled very similar to an interface{}, i.e. as
-  a pointer exclusively to tagged objects, but with two generalizations.
-
-  1) a reflect.Value that represents an lvalue points to an indirect
-     (obj.flags ⊇ {otIndirect}) tagged object, which has a similar
-     layout to an tagged object except that the value is a pointer to
-     the dynamic type.  Indirect tagged objects preserve the correct
-     aliasing so that mutations made by (reflect.Value).Set can be
-     observed.
-
-     Indirect objects only arise when an lvalue is derived from an
-     rvalue by indirection, e.g. the following code:
-
-        type S struct { X T }
-        var s S
-        var i interface{} = &s    // i points to a *S-tagged object (from MakeInterface)
-        v1 := reflect.ValueOf(i)  // v1 points to same *S-tagged object as i
-        v2 := v1.Elem()           // v2 points to an indirect S-tagged object, pointing to s
-        v3 := v2.FieldByName("X") // v3 points to an indirect int-tagged object, pointing to s.X
-        v3.Set(y)                 // pts(s.X) ⊇ pts(y)
-
-     Whether indirect or not, the concrete type of the tagged object
-     corresponds to the user-visible dynamic type, and the existence
-     of a pointer is an implementation detail.
-
-     (NB: indirect tagged objects are not yet implemented)
-
-  2) The dynamic type tag of a tagged object pointed to by a
-     reflect.Value may be an interface type; it need not be concrete.
-
-     This arises in code such as this:
-        tEface := reflect.TypeOf(new(interface{}).Elem() // interface{}
-        eface := reflect.Zero(tEface)
-     pts(eface) is a singleton containing an interface{}-tagged
-     object.  That tagged object's payload is an interface{} value,
-     i.e. the pts of the payload contains only concrete-tagged
-     objects, although in this example it's the zero interface{} value,
-     so its pts is empty.
-
-reflect.Type
-  Just as in the real "reflect" library, we represent a reflect.Type
-  as an interface whose sole implementation is the concrete type,
-  *reflect.rtype.  (This choice is forced on us by go/types: clients
-  cannot fabricate types with arbitrary method sets.)
-
-  rtype instances are canonical: there is at most one per dynamic
-  type.  (rtypes are in fact large structs but since identity is all
-  that matters, we represent them by a single node.)
-
-  The payload of each *rtype-tagged object is an *rtype pointer that
-  points to exactly one such canonical rtype object.  We exploit this
-  by setting the node.typ of the payload to the dynamic type, not
-  '*rtype'.  This saves us an indirection in each resolution rule.  As
-  an optimisation, *rtype-tagged objects are canonicalized too.
-
-
-Aggregate types:
-
-Aggregate types are treated as if all directly contained
-aggregates are recursively flattened out.
-
-Structs
-  *ssa.Field y = x.f creates a simple edge to y from x's node at f's offset.
-
-  *ssa.FieldAddr y = &x->f requires a dynamic closure rule to create
-   simple edges for each struct discovered in pts(x).
-
-  The nodes of a struct consist of a special 'identity' node (whose
-  type is that of the struct itself), followed by the nodes for all
-  the struct's fields, recursively flattened out.  A pointer to the
-  struct is a pointer to its identity node.  That node allows us to
-  distinguish a pointer to a struct from a pointer to its first field.
-
-  Field offsets are logical field offsets (plus one for the identity
-  node), so the sizes of the fields can be ignored by the analysis.
-
-  (The identity node is non-traditional but enables the distiction
-  described above, which is valuable for code comprehension tools.
-  Typical pointer analyses for C, whose purpose is compiler
-  optimization, must soundly model unsafe.Pointer (void*) conversions,
-  and this requires fidelity to the actual memory layout using physical
-  field offsets.)
-
-  *ssa.Field y = x.f creates a simple edge to y from x's node at f's offset.
-
-  *ssa.FieldAddr y = &x->f requires a dynamic closure rule to create
-   simple edges for each struct discovered in pts(x).
-
-Arrays
-  We model an array by an identity node (whose type is that of the
-  array itself) followed by a node representing all the elements of
-  the array; the analysis does not distinguish elements with different
-  indices.  Effectively, an array is treated like struct{elem T}, a
-  load y=x[i] like y=x.elem, and a store x[i]=y like x.elem=y; the
-  index i is ignored.
-
-  A pointer to an array is pointer to its identity node.  (A slice is
-  also a pointer to an array's identity node.)  The identity node
-  allows us to distinguish a pointer to an array from a pointer to one
-  of its elements, but it is rather costly because it introduces more
-  offset constraints into the system.  Furthermore, sound treatment of
-  unsafe.Pointer would require us to dispense with this node.
-
-  Arrays may be allocated by Alloc, by make([]T), by calls to append,
-  and via reflection.
-
-Tuples (T, ...)
-  Tuples are treated like structs with naturally numbered fields.
-  *ssa.Extract is analogous to *ssa.Field.
-
-  However, tuples have no identity field since by construction, they
-  cannot be address-taken.
-
-
-FUNCTION CALLS
-
-  There are three kinds of function call:
-  (1) static "call"-mode calls of functions.
-  (2) dynamic "call"-mode calls of functions.
-  (3) dynamic "invoke"-mode calls of interface methods.
-  Cases 1 and 2 apply equally to methods and standalone functions.
-
-  Static calls.
-    A static call consists three steps:
-    - finding the function object of the callee;
-    - creating copy edges from the actual parameter value nodes to the
-      P-block in the function object (this includes the receiver if
-      the callee is a method);
-    - creating copy edges from the R-block in the function object to
-      the value nodes for the result of the call.
-
-    A static function call is little more than two struct value copies
-    between the P/R blocks of caller and callee:
-
-       callee.P = caller.P
-       caller.R = callee.R
-
-    Context sensitivity
-
-      Static calls (alone) may be treated context sensitively,
-      i.e. each callsite may cause a distinct re-analysis of the
-      callee, improving precision.  Our current context-sensitivity
-      policy treats all intrinsics and getter/setter methods in this
-      manner since such functions are small and seem like an obvious
-      source of spurious confluences, though this has not yet been
-      evaluated.
-
-  Dynamic function calls
-
-    Dynamic calls work in a similar manner except that the creation of
-    copy edges occurs dynamically, in a similar fashion to a pair of
-    struct copies in which the callee is indirect:
-
-       callee->P = caller.P
-       caller.R = callee->R
-
-    (Recall that the function object's P- and R-blocks are contiguous.)
-
-  Interface method invocation
-
-    For invoke-mode calls, we create a params/results block for the
-    callsite and attach a dynamic closure rule to the interface.  For
-    each new tagged object that flows to the interface, we look up
-    the concrete method, find its function object, and connect its P/R
-    blocks to the callsite's P/R blocks, adding copy edges to the graph
-    during solving.
-
-  Recording call targets
-
-    The analysis notifies its clients of each callsite it encounters,
-    passing a CallSite interface.  Among other things, the CallSite
-    contains a synthetic constraint variable ("targets") whose
-    points-to solution includes the set of all function objects to
-    which the call may dispatch.
-
-    It is via this mechanism that the callgraph is made available.
-    Clients may also elect to be notified of callgraph edges directly;
-    internally this just iterates all "targets" variables' pts(·)s.
-
-
-PRESOLVER
-
-We implement Hash-Value Numbering (HVN), a pre-solver constraint
-optimization described in Hardekopf & Lin, SAS'07.  This is documented
-in more detail in hvn.go.  We intend to add its cousins HR and HU in
-future.
-
-
-SOLVER
-
-The solver is currently a naive Andersen-style implementation; it does
-not perform online cycle detection, though we plan to add solver
-optimisations such as Hybrid- and Lazy- Cycle Detection from (Hardekopf
-& Lin, PLDI'07).
-
-It uses difference propagation (Pearce et al, SQC'04) to avoid
-redundant re-triggering of closure rules for values already seen.
-
-Points-to sets are represented using sparse bit vectors (similar to
-those used in LLVM and gcc), which are more space- and time-efficient
-than sets based on Go's built-in map type or dense bit vectors.
-
-Nodes are permuted prior to solving so that object nodes (which may
-appear in points-to sets) are lower numbered than non-object (var)
-nodes.  This improves the density of the set over which the PTSs
-range, and thus the efficiency of the representation.
-
-Partly thanks to avoiding map iteration, the execution of the solver is
-100% deterministic, a great help during debugging.
-
-
-FURTHER READING
-
-Andersen, L. O. 1994. Program analysis and specialization for the C
-programming language. Ph.D. dissertation. DIKU, University of
-Copenhagen.
-
-David J. Pearce, Paul H. J. Kelly, and Chris Hankin. 2004.  Efficient
-field-sensitive pointer analysis for C. In Proceedings of the 5th ACM
-SIGPLAN-SIGSOFT workshop on Program analysis for software tools and
-engineering (PASTE '04). ACM, New York, NY, USA, 37-42.
-http://doi.acm.org/10.1145/996821.996835
-
-David J. Pearce, Paul H. J. Kelly, and Chris Hankin. 2004. Online
-Cycle Detection and Difference Propagation: Applications to Pointer
-Analysis. Software Quality Control 12, 4 (December 2004), 311-337.
-http://dx.doi.org/10.1023/B:SQJO.0000039791.93071.a2
-
-David Grove and Craig Chambers. 2001. A framework for call graph
-construction algorithms. ACM Trans. Program. Lang. Syst. 23, 6
-(November 2001), 685-746.
-http://doi.acm.org/10.1145/506315.506316
-
-Ben Hardekopf and Calvin Lin. 2007. The ant and the grasshopper: fast
-and accurate pointer analysis for millions of lines of code. In
-Proceedings of the 2007 ACM SIGPLAN conference on Programming language
-design and implementation (PLDI '07). ACM, New York, NY, USA, 290-299.
-http://doi.acm.org/10.1145/1250734.1250767
-
-Ben Hardekopf and Calvin Lin. 2007. Exploiting pointer and location
-equivalence to optimize pointer analysis. In Proceedings of the 14th
-international conference on Static Analysis (SAS'07), Hanne Riis
-Nielson and Gilberto Filé (Eds.). Springer-Verlag, Berlin, Heidelberg,
-265-280.
-
-Atanas Rountev and Satish Chandra. 2000. Off-line variable substitution
-for scaling points-to analysis. In Proceedings of the ACM SIGPLAN 2000
-conference on Programming language design and implementation (PLDI '00).
-ACM, New York, NY, USA, 47-56. DOI=10.1145/349299.349310
-http://doi.acm.org/10.1145/349299.349310
-
-*/
-package pointer // import "llvm.org/llgo/third_party/gotools/go/pointer"
diff --git a/third_party/gotools/go/pointer/example_test.go b/third_party/gotools/go/pointer/example_test.go
deleted file mode 100644
index a8a2cb1..0000000
--- a/third_party/gotools/go/pointer/example_test.go
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer_test
-
-import (
-	"fmt"
-	"sort"
-
-	"llvm.org/llgo/third_party/gotools/go/callgraph"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/pointer"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-)
-
-// This program demonstrates how to use the pointer analysis to
-// obtain a conservative call-graph of a Go program.
-// It also shows how to compute the points-to set of a variable,
-// in this case, (C).f's ch parameter.
-//
-func Example() {
-	const myprog = `
-package main
-
-import "fmt"
-
-type I interface {
-	f(map[string]int)
-}
-
-type C struct{}
-
-func (C) f(m map[string]int) {
-	fmt.Println("C.f()")
-}
-
-func main() {
-	var i I = C{}
-	x := map[string]int{"one":1}
-	i.f(x) // dynamic method call
-}
-`
-	var conf loader.Config
-
-	// Parse the input file, a string.
-	// (Command-line tools should use conf.FromArgs.)
-	file, err := conf.ParseFile("myprog.go", myprog)
-	if err != nil {
-		fmt.Print(err) // parse error
-		return
-	}
-
-	// Create single-file main package and import its dependencies.
-	conf.CreateFromFiles("main", file)
-
-	iprog, err := conf.Load()
-	if err != nil {
-		fmt.Print(err) // type error in some package
-		return
-	}
-
-	// Create SSA-form program representation.
-	prog := ssa.Create(iprog, 0)
-	mainPkg := prog.Package(iprog.Created[0].Pkg)
-
-	// Build SSA code for bodies of all functions in the whole program.
-	prog.BuildAll()
-
-	// Configure the pointer analysis to build a call-graph.
-	config := &pointer.Config{
-		Mains:          []*ssa.Package{mainPkg},
-		BuildCallGraph: true,
-	}
-
-	// Query points-to set of (C).f's parameter m, a map.
-	C := mainPkg.Type("C").Type()
-	Cfm := prog.LookupMethod(C, mainPkg.Object, "f").Params[1]
-	config.AddQuery(Cfm)
-
-	// Run the pointer analysis.
-	result, err := pointer.Analyze(config)
-	if err != nil {
-		panic(err) // internal error in pointer analysis
-	}
-
-	// Find edges originating from the main package.
-	// By converting to strings, we de-duplicate nodes
-	// representing the same function due to context sensitivity.
-	var edges []string
-	callgraph.GraphVisitEdges(result.CallGraph, func(edge *callgraph.Edge) error {
-		caller := edge.Caller.Func
-		if caller.Pkg == mainPkg {
-			edges = append(edges, fmt.Sprint(caller, " --> ", edge.Callee.Func))
-		}
-		return nil
-	})
-
-	// Print the edges in sorted order.
-	sort.Strings(edges)
-	for _, edge := range edges {
-		fmt.Println(edge)
-	}
-	fmt.Println()
-
-	// Print the labels of (C).f(m)'s points-to set.
-	fmt.Println("m may point to:")
-	var labels []string
-	for _, l := range result.Queries[Cfm].PointsTo().Labels() {
-		label := fmt.Sprintf("  %s: %s", prog.Fset.Position(l.Pos()), l)
-		labels = append(labels, label)
-	}
-	sort.Strings(labels)
-	for _, label := range labels {
-		fmt.Println(label)
-	}
-
-	// Output:
-	// (main.C).f --> fmt.Println
-	// main.init --> fmt.init
-	// main.main --> (main.C).f
-	//
-	// m may point to:
-	//   myprog.go:18:21: makemap
-}
diff --git a/third_party/gotools/go/pointer/gen.go b/third_party/gotools/go/pointer/gen.go
deleted file mode 100644
index 5099448..0000000
--- a/third_party/gotools/go/pointer/gen.go
+++ /dev/null
@@ -1,1292 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file defines the constraint generation phase.
-
-// TODO(adonovan): move the constraint definitions and the store() etc
-// functions which add them (and are also used by the solver) into a
-// new file, constraints.go.
-
-import (
-	"fmt"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/callgraph"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var (
-	tEface     = types.NewInterface(nil, nil).Complete()
-	tInvalid   = types.Typ[types.Invalid]
-	tUnsafePtr = types.Typ[types.UnsafePointer]
-)
-
-// ---------- Node creation ----------
-
-// nextNode returns the index of the next unused node.
-func (a *analysis) nextNode() nodeid {
-	return nodeid(len(a.nodes))
-}
-
-// addNodes creates nodes for all scalar elements in type typ, and
-// returns the id of the first one, or zero if the type was
-// analytically uninteresting.
-//
-// comment explains the origin of the nodes, as a debugging aid.
-//
-func (a *analysis) addNodes(typ types.Type, comment string) nodeid {
-	id := a.nextNode()
-	for _, fi := range a.flatten(typ) {
-		a.addOneNode(fi.typ, comment, fi)
-	}
-	if id == a.nextNode() {
-		return 0 // type contained no pointers
-	}
-	return id
-}
-
-// addOneNode creates a single node with type typ, and returns its id.
-//
-// typ should generally be scalar (except for tagged.T nodes
-// and struct/array identity nodes).  Use addNodes for non-scalar types.
-//
-// comment explains the origin of the nodes, as a debugging aid.
-// subelement indicates the subelement, e.g. ".a.b[*].c".
-//
-func (a *analysis) addOneNode(typ types.Type, comment string, subelement *fieldInfo) nodeid {
-	id := a.nextNode()
-	a.nodes = append(a.nodes, &node{typ: typ, subelement: subelement, solve: new(solverState)})
-	if a.log != nil {
-		fmt.Fprintf(a.log, "\tcreate n%d %s for %s%s\n",
-			id, typ, comment, subelement.path())
-	}
-	return id
-}
-
-// setValueNode associates node id with the value v.
-// cgn identifies the context iff v is a local variable.
-//
-func (a *analysis) setValueNode(v ssa.Value, id nodeid, cgn *cgnode) {
-	if cgn != nil {
-		a.localval[v] = id
-	} else {
-		a.globalval[v] = id
-	}
-	if a.log != nil {
-		fmt.Fprintf(a.log, "\tval[%s] = n%d  (%T)\n", v.Name(), id, v)
-	}
-
-	// Due to context-sensitivity, we may encounter the same Value
-	// in many contexts. We merge them to a canonical node, since
-	// that's what all clients want.
-
-	// Record the (v, id) relation if the client has queried pts(v).
-	if _, ok := a.config.Queries[v]; ok {
-		t := v.Type()
-		ptr, ok := a.result.Queries[v]
-		if !ok {
-			// First time?  Create the canonical query node.
-			ptr = Pointer{a, a.addNodes(t, "query")}
-			a.result.Queries[v] = ptr
-		}
-		a.result.Queries[v] = ptr
-		a.copy(ptr.n, id, a.sizeof(t))
-	}
-
-	// Record the (*v, id) relation if the client has queried pts(*v).
-	if _, ok := a.config.IndirectQueries[v]; ok {
-		t := v.Type()
-		ptr, ok := a.result.IndirectQueries[v]
-		if !ok {
-			// First time? Create the canonical indirect query node.
-			ptr = Pointer{a, a.addNodes(v.Type(), "query.indirect")}
-			a.result.IndirectQueries[v] = ptr
-		}
-		a.genLoad(cgn, ptr.n, v, 0, a.sizeof(t))
-	}
-}
-
-// endObject marks the end of a sequence of calls to addNodes denoting
-// a single object allocation.
-//
-// obj is the start node of the object, from a prior call to nextNode.
-// Its size, flags and optional data will be updated.
-//
-func (a *analysis) endObject(obj nodeid, cgn *cgnode, data interface{}) *object {
-	// Ensure object is non-empty by padding;
-	// the pad will be the object node.
-	size := uint32(a.nextNode() - obj)
-	if size == 0 {
-		a.addOneNode(tInvalid, "padding", nil)
-	}
-	objNode := a.nodes[obj]
-	o := &object{
-		size: size, // excludes padding
-		cgn:  cgn,
-		data: data,
-	}
-	objNode.obj = o
-
-	return o
-}
-
-// makeFunctionObject creates and returns a new function object
-// (contour) for fn, and returns the id of its first node.  It also
-// enqueues fn for subsequent constraint generation.
-//
-// For a context-sensitive contour, callersite identifies the sole
-// callsite; for shared contours, caller is nil.
-//
-func (a *analysis) makeFunctionObject(fn *ssa.Function, callersite *callsite) nodeid {
-	if a.log != nil {
-		fmt.Fprintf(a.log, "\t---- makeFunctionObject %s\n", fn)
-	}
-
-	// obj is the function object (identity, params, results).
-	obj := a.nextNode()
-	cgn := a.makeCGNode(fn, obj, callersite)
-	sig := fn.Signature
-	a.addOneNode(sig, "func.cgnode", nil) // (scalar with Signature type)
-	if recv := sig.Recv(); recv != nil {
-		a.addNodes(recv.Type(), "func.recv")
-	}
-	a.addNodes(sig.Params(), "func.params")
-	a.addNodes(sig.Results(), "func.results")
-	a.endObject(obj, cgn, fn).flags |= otFunction
-
-	if a.log != nil {
-		fmt.Fprintf(a.log, "\t----\n")
-	}
-
-	// Queue it up for constraint processing.
-	a.genq = append(a.genq, cgn)
-
-	return obj
-}
-
-// makeTagged creates a tagged object of type typ.
-func (a *analysis) makeTagged(typ types.Type, cgn *cgnode, data interface{}) nodeid {
-	obj := a.addOneNode(typ, "tagged.T", nil) // NB: type may be non-scalar!
-	a.addNodes(typ, "tagged.v")
-	a.endObject(obj, cgn, data).flags |= otTagged
-	return obj
-}
-
-// makeRtype returns the canonical tagged object of type *rtype whose
-// payload points to the sole rtype object for T.
-//
-// TODO(adonovan): move to reflect.go; it's part of the solver really.
-//
-func (a *analysis) makeRtype(T types.Type) nodeid {
-	if v := a.rtypes.At(T); v != nil {
-		return v.(nodeid)
-	}
-
-	// Create the object for the reflect.rtype itself, which is
-	// ordinarily a large struct but here a single node will do.
-	obj := a.nextNode()
-	a.addOneNode(T, "reflect.rtype", nil)
-	a.endObject(obj, nil, T)
-
-	id := a.makeTagged(a.reflectRtypePtr, nil, T)
-	a.nodes[id+1].typ = T // trick (each *rtype tagged object is a singleton)
-	a.addressOf(a.reflectRtypePtr, id+1, obj)
-
-	a.rtypes.Set(T, id)
-	return id
-}
-
-// rtypeValue returns the type of the *reflect.rtype-tagged object obj.
-func (a *analysis) rtypeTaggedValue(obj nodeid) types.Type {
-	tDyn, t, _ := a.taggedValue(obj)
-	if tDyn != a.reflectRtypePtr {
-		panic(fmt.Sprintf("not a *reflect.rtype-tagged object: obj=n%d tag=%v payload=n%d", obj, tDyn, t))
-	}
-	return a.nodes[t].typ
-}
-
-// valueNode returns the id of the value node for v, creating it (and
-// the association) as needed.  It may return zero for uninteresting
-// values containing no pointers.
-//
-func (a *analysis) valueNode(v ssa.Value) nodeid {
-	// Value nodes for locals are created en masse by genFunc.
-	if id, ok := a.localval[v]; ok {
-		return id
-	}
-
-	// Value nodes for globals are created on demand.
-	id, ok := a.globalval[v]
-	if !ok {
-		var comment string
-		if a.log != nil {
-			comment = v.String()
-		}
-		id = a.addNodes(v.Type(), comment)
-		if obj := a.objectNode(nil, v); obj != 0 {
-			a.addressOf(v.Type(), id, obj)
-		}
-		a.setValueNode(v, id, nil)
-	}
-	return id
-}
-
-// valueOffsetNode ascertains the node for tuple/struct value v,
-// then returns the node for its subfield #index.
-//
-func (a *analysis) valueOffsetNode(v ssa.Value, index int) nodeid {
-	id := a.valueNode(v)
-	if id == 0 {
-		panic(fmt.Sprintf("cannot offset within n0: %s = %s", v.Name(), v))
-	}
-	return id + nodeid(a.offsetOf(v.Type(), index))
-}
-
-// isTaggedObject reports whether object obj is a tagged object.
-func (a *analysis) isTaggedObject(obj nodeid) bool {
-	return a.nodes[obj].obj.flags&otTagged != 0
-}
-
-// taggedValue returns the dynamic type tag, the (first node of the)
-// payload, and the indirect flag of the tagged object starting at id.
-// Panic ensues if !isTaggedObject(id).
-//
-func (a *analysis) taggedValue(obj nodeid) (tDyn types.Type, v nodeid, indirect bool) {
-	n := a.nodes[obj]
-	flags := n.obj.flags
-	if flags&otTagged == 0 {
-		panic(fmt.Sprintf("not a tagged object: n%d", obj))
-	}
-	return n.typ, obj + 1, flags&otIndirect != 0
-}
-
-// funcParams returns the first node of the params (P) block of the
-// function whose object node (obj.flags&otFunction) is id.
-//
-func (a *analysis) funcParams(id nodeid) nodeid {
-	n := a.nodes[id]
-	if n.obj == nil || n.obj.flags&otFunction == 0 {
-		panic(fmt.Sprintf("funcParams(n%d): not a function object block", id))
-	}
-	return id + 1
-}
-
-// funcResults returns the first node of the results (R) block of the
-// function whose object node (obj.flags&otFunction) is id.
-//
-func (a *analysis) funcResults(id nodeid) nodeid {
-	n := a.nodes[id]
-	if n.obj == nil || n.obj.flags&otFunction == 0 {
-		panic(fmt.Sprintf("funcResults(n%d): not a function object block", id))
-	}
-	sig := n.typ.(*types.Signature)
-	id += 1 + nodeid(a.sizeof(sig.Params()))
-	if sig.Recv() != nil {
-		id += nodeid(a.sizeof(sig.Recv().Type()))
-	}
-	return id
-}
-
-// ---------- Constraint creation ----------
-
-// copy creates a constraint of the form dst = src.
-// sizeof is the width (in logical fields) of the copied type.
-//
-func (a *analysis) copy(dst, src nodeid, sizeof uint32) {
-	if src == dst || sizeof == 0 {
-		return // trivial
-	}
-	if src == 0 || dst == 0 {
-		panic(fmt.Sprintf("ill-typed copy dst=n%d src=n%d", dst, src))
-	}
-	for i := uint32(0); i < sizeof; i++ {
-		a.addConstraint(&copyConstraint{dst, src})
-		src++
-		dst++
-	}
-}
-
-// addressOf creates a constraint of the form id = &obj.
-// T is the type of the address.
-func (a *analysis) addressOf(T types.Type, id, obj nodeid) {
-	if id == 0 {
-		panic("addressOf: zero id")
-	}
-	if obj == 0 {
-		panic("addressOf: zero obj")
-	}
-	if a.shouldTrack(T) {
-		a.addConstraint(&addrConstraint{id, obj})
-	}
-}
-
-// load creates a load constraint of the form dst = src[offset].
-// offset is the pointer offset in logical fields.
-// sizeof is the width (in logical fields) of the loaded type.
-//
-func (a *analysis) load(dst, src nodeid, offset, sizeof uint32) {
-	if dst == 0 {
-		return // load of non-pointerlike value
-	}
-	if src == 0 && dst == 0 {
-		return // non-pointerlike operation
-	}
-	if src == 0 || dst == 0 {
-		panic(fmt.Sprintf("ill-typed load dst=n%d src=n%d", dst, src))
-	}
-	for i := uint32(0); i < sizeof; i++ {
-		a.addConstraint(&loadConstraint{offset, dst, src})
-		offset++
-		dst++
-	}
-}
-
-// store creates a store constraint of the form dst[offset] = src.
-// offset is the pointer offset in logical fields.
-// sizeof is the width (in logical fields) of the stored type.
-//
-func (a *analysis) store(dst, src nodeid, offset uint32, sizeof uint32) {
-	if src == 0 {
-		return // store of non-pointerlike value
-	}
-	if src == 0 && dst == 0 {
-		return // non-pointerlike operation
-	}
-	if src == 0 || dst == 0 {
-		panic(fmt.Sprintf("ill-typed store dst=n%d src=n%d", dst, src))
-	}
-	for i := uint32(0); i < sizeof; i++ {
-		a.addConstraint(&storeConstraint{offset, dst, src})
-		offset++
-		src++
-	}
-}
-
-// offsetAddr creates an offsetAddr constraint of the form dst = &src.#offset.
-// offset is the field offset in logical fields.
-// T is the type of the address.
-//
-func (a *analysis) offsetAddr(T types.Type, dst, src nodeid, offset uint32) {
-	if !a.shouldTrack(T) {
-		return
-	}
-	if offset == 0 {
-		// Simplify  dst = &src->f0
-		//       to  dst = src
-		// (NB: this optimisation is defeated by the identity
-		// field prepended to struct and array objects.)
-		a.copy(dst, src, 1)
-	} else {
-		a.addConstraint(&offsetAddrConstraint{offset, dst, src})
-	}
-}
-
-// typeAssert creates a typeFilter or untag constraint of the form dst = src.(T):
-// typeFilter for an interface, untag for a concrete type.
-// The exact flag is specified as for untagConstraint.
-//
-func (a *analysis) typeAssert(T types.Type, dst, src nodeid, exact bool) {
-	if isInterface(T) {
-		a.addConstraint(&typeFilterConstraint{T, dst, src})
-	} else {
-		a.addConstraint(&untagConstraint{T, dst, src, exact})
-	}
-}
-
-// addConstraint adds c to the constraint set.
-func (a *analysis) addConstraint(c constraint) {
-	a.constraints = append(a.constraints, c)
-	if a.log != nil {
-		fmt.Fprintf(a.log, "\t%s\n", c)
-	}
-}
-
-// copyElems generates load/store constraints for *dst = *src,
-// where src and dst are slices or *arrays.
-//
-func (a *analysis) copyElems(cgn *cgnode, typ types.Type, dst, src ssa.Value) {
-	tmp := a.addNodes(typ, "copy")
-	sz := a.sizeof(typ)
-	a.genLoad(cgn, tmp, src, 1, sz)
-	a.genStore(cgn, dst, tmp, 1, sz)
-}
-
-// ---------- Constraint generation ----------
-
-// genConv generates constraints for the conversion operation conv.
-func (a *analysis) genConv(conv *ssa.Convert, cgn *cgnode) {
-	res := a.valueNode(conv)
-	if res == 0 {
-		return // result is non-pointerlike
-	}
-
-	tSrc := conv.X.Type()
-	tDst := conv.Type()
-
-	switch utSrc := tSrc.Underlying().(type) {
-	case *types.Slice:
-		// []byte/[]rune -> string?
-		return
-
-	case *types.Pointer:
-		// *T -> unsafe.Pointer?
-		if tDst.Underlying() == tUnsafePtr {
-			return // we don't model unsafe aliasing (unsound)
-		}
-
-	case *types.Basic:
-		switch tDst.Underlying().(type) {
-		case *types.Pointer:
-			// Treat unsafe.Pointer->*T conversions like
-			// new(T) and create an unaliased object.
-			if utSrc == tUnsafePtr {
-				obj := a.addNodes(mustDeref(tDst), "unsafe.Pointer conversion")
-				a.endObject(obj, cgn, conv)
-				a.addressOf(tDst, res, obj)
-				return
-			}
-
-		case *types.Slice:
-			// string -> []byte/[]rune (or named aliases)?
-			if utSrc.Info()&types.IsString != 0 {
-				obj := a.addNodes(sliceToArray(tDst), "convert")
-				a.endObject(obj, cgn, conv)
-				a.addressOf(tDst, res, obj)
-				return
-			}
-
-		case *types.Basic:
-			// All basic-to-basic type conversions are no-ops.
-			// This includes uintptr<->unsafe.Pointer conversions,
-			// which we (unsoundly) ignore.
-			return
-		}
-	}
-
-	panic(fmt.Sprintf("illegal *ssa.Convert %s -> %s: %s", tSrc, tDst, conv.Parent()))
-}
-
-// genAppend generates constraints for a call to append.
-func (a *analysis) genAppend(instr *ssa.Call, cgn *cgnode) {
-	// Consider z = append(x, y).   y is optional.
-	// This may allocate a new [1]T array; call its object w.
-	// We get the following constraints:
-	// 	z = x
-	// 	z = &w
-	//     *z = *y
-
-	x := instr.Call.Args[0]
-
-	z := instr
-	a.copy(a.valueNode(z), a.valueNode(x), 1) // z = x
-
-	if len(instr.Call.Args) == 1 {
-		return // no allocation for z = append(x) or _ = append(x).
-	}
-
-	// TODO(adonovan): test append([]byte, ...string) []byte.
-
-	y := instr.Call.Args[1]
-	tArray := sliceToArray(instr.Call.Args[0].Type())
-
-	var w nodeid
-	w = a.nextNode()
-	a.addNodes(tArray, "append")
-	a.endObject(w, cgn, instr)
-
-	a.copyElems(cgn, tArray.Elem(), z, y)        // *z = *y
-	a.addressOf(instr.Type(), a.valueNode(z), w) //  z = &w
-}
-
-// genBuiltinCall generates contraints for a call to a built-in.
-func (a *analysis) genBuiltinCall(instr ssa.CallInstruction, cgn *cgnode) {
-	call := instr.Common()
-	switch call.Value.(*ssa.Builtin).Name() {
-	case "append":
-		// Safe cast: append cannot appear in a go or defer statement.
-		a.genAppend(instr.(*ssa.Call), cgn)
-
-	case "copy":
-		tElem := call.Args[0].Type().Underlying().(*types.Slice).Elem()
-		a.copyElems(cgn, tElem, call.Args[0], call.Args[1])
-
-	case "panic":
-		a.copy(a.panicNode, a.valueNode(call.Args[0]), 1)
-
-	case "recover":
-		if v := instr.Value(); v != nil {
-			a.copy(a.valueNode(v), a.panicNode, 1)
-		}
-
-	case "print":
-		// In the tests, the probe might be the sole reference
-		// to its arg, so make sure we create nodes for it.
-		if len(call.Args) > 0 {
-			a.valueNode(call.Args[0])
-		}
-
-	case "ssa:wrapnilchk":
-		a.copy(a.valueNode(instr.Value()), a.valueNode(call.Args[0]), 1)
-
-	default:
-		// No-ops: close len cap real imag complex print println delete.
-	}
-}
-
-// shouldUseContext defines the context-sensitivity policy.  It
-// returns true if we should analyse all static calls to fn anew.
-//
-// Obviously this interface rather limits how much freedom we have to
-// choose a policy.  The current policy, rather arbitrarily, is true
-// for intrinsics and accessor methods (actually: short, single-block,
-// call-free functions).  This is just a starting point.
-//
-func (a *analysis) shouldUseContext(fn *ssa.Function) bool {
-	if a.findIntrinsic(fn) != nil {
-		return true // treat intrinsics context-sensitively
-	}
-	if len(fn.Blocks) != 1 {
-		return false // too expensive
-	}
-	blk := fn.Blocks[0]
-	if len(blk.Instrs) > 10 {
-		return false // too expensive
-	}
-	if fn.Synthetic != "" && (fn.Pkg == nil || fn != fn.Pkg.Func("init")) {
-		return true // treat synthetic wrappers context-sensitively
-	}
-	for _, instr := range blk.Instrs {
-		switch instr := instr.(type) {
-		case ssa.CallInstruction:
-			// Disallow function calls (except to built-ins)
-			// because of the danger of unbounded recursion.
-			if _, ok := instr.Common().Value.(*ssa.Builtin); !ok {
-				return false
-			}
-		}
-	}
-	return true
-}
-
-// genStaticCall generates constraints for a statically dispatched function call.
-func (a *analysis) genStaticCall(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) {
-	fn := call.StaticCallee()
-
-	// Special cases for inlined intrinsics.
-	switch fn {
-	case a.runtimeSetFinalizer:
-		// Inline SetFinalizer so the call appears direct.
-		site.targets = a.addOneNode(tInvalid, "SetFinalizer.targets", nil)
-		a.addConstraint(&runtimeSetFinalizerConstraint{
-			targets: site.targets,
-			x:       a.valueNode(call.Args[0]),
-			f:       a.valueNode(call.Args[1]),
-		})
-		return
-
-	case a.reflectValueCall:
-		// Inline (reflect.Value).Call so the call appears direct.
-		dotdotdot := false
-		ret := reflectCallImpl(a, caller, site, a.valueNode(call.Args[0]), a.valueNode(call.Args[1]), dotdotdot)
-		if result != 0 {
-			a.addressOf(fn.Signature.Results().At(0).Type(), result, ret)
-		}
-		return
-	}
-
-	// Ascertain the context (contour/cgnode) for a particular call.
-	var obj nodeid
-	if a.shouldUseContext(fn) {
-		obj = a.makeFunctionObject(fn, site) // new contour
-	} else {
-		obj = a.objectNode(nil, fn) // shared contour
-	}
-	a.callEdge(caller, site, obj)
-
-	sig := call.Signature()
-
-	// Copy receiver, if any.
-	params := a.funcParams(obj)
-	args := call.Args
-	if sig.Recv() != nil {
-		sz := a.sizeof(sig.Recv().Type())
-		a.copy(params, a.valueNode(args[0]), sz)
-		params += nodeid(sz)
-		args = args[1:]
-	}
-
-	// Copy actual parameters into formal params block.
-	// Must loop, since the actuals aren't contiguous.
-	for i, arg := range args {
-		sz := a.sizeof(sig.Params().At(i).Type())
-		a.copy(params, a.valueNode(arg), sz)
-		params += nodeid(sz)
-	}
-
-	// Copy formal results block to actual result.
-	if result != 0 {
-		a.copy(result, a.funcResults(obj), a.sizeof(sig.Results()))
-	}
-}
-
-// genDynamicCall generates constraints for a dynamic function call.
-func (a *analysis) genDynamicCall(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) {
-	// pts(targets) will be the set of possible call targets.
-	site.targets = a.valueNode(call.Value)
-
-	// We add dynamic closure rules that store the arguments into
-	// the P-block and load the results from the R-block of each
-	// function discovered in pts(targets).
-
-	sig := call.Signature()
-	var offset uint32 = 1 // P/R block starts at offset 1
-	for i, arg := range call.Args {
-		sz := a.sizeof(sig.Params().At(i).Type())
-		a.genStore(caller, call.Value, a.valueNode(arg), offset, sz)
-		offset += sz
-	}
-	if result != 0 {
-		a.genLoad(caller, result, call.Value, offset, a.sizeof(sig.Results()))
-	}
-}
-
-// genInvoke generates constraints for a dynamic method invocation.
-func (a *analysis) genInvoke(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) {
-	if call.Value.Type() == a.reflectType {
-		a.genInvokeReflectType(caller, site, call, result)
-		return
-	}
-
-	sig := call.Signature()
-
-	// Allocate a contiguous targets/params/results block for this call.
-	block := a.nextNode()
-	// pts(targets) will be the set of possible call targets
-	site.targets = a.addOneNode(sig, "invoke.targets", nil)
-	p := a.addNodes(sig.Params(), "invoke.params")
-	r := a.addNodes(sig.Results(), "invoke.results")
-
-	// Copy the actual parameters into the call's params block.
-	for i, n := 0, sig.Params().Len(); i < n; i++ {
-		sz := a.sizeof(sig.Params().At(i).Type())
-		a.copy(p, a.valueNode(call.Args[i]), sz)
-		p += nodeid(sz)
-	}
-	// Copy the call's results block to the actual results.
-	if result != 0 {
-		a.copy(result, r, a.sizeof(sig.Results()))
-	}
-
-	// We add a dynamic invoke constraint that will connect the
-	// caller's and the callee's P/R blocks for each discovered
-	// call target.
-	a.addConstraint(&invokeConstraint{call.Method, a.valueNode(call.Value), block})
-}
-
-// genInvokeReflectType is a specialization of genInvoke where the
-// receiver type is a reflect.Type, under the assumption that there
-// can be at most one implementation of this interface, *reflect.rtype.
-//
-// (Though this may appear to be an instance of a pattern---method
-// calls on interfaces known to have exactly one implementation---in
-// practice it occurs rarely, so we special case for reflect.Type.)
-//
-// In effect we treat this:
-//    var rt reflect.Type = ...
-//    rt.F()
-// as this:
-//    rt.(*reflect.rtype).F()
-//
-func (a *analysis) genInvokeReflectType(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) {
-	// Unpack receiver into rtype
-	rtype := a.addOneNode(a.reflectRtypePtr, "rtype.recv", nil)
-	recv := a.valueNode(call.Value)
-	a.typeAssert(a.reflectRtypePtr, rtype, recv, true)
-
-	// Look up the concrete method.
-	fn := a.prog.LookupMethod(a.reflectRtypePtr, call.Method.Pkg(), call.Method.Name())
-
-	obj := a.makeFunctionObject(fn, site) // new contour for this call
-	a.callEdge(caller, site, obj)
-
-	// From now on, it's essentially a static call, but little is
-	// gained by factoring together the code for both cases.
-
-	sig := fn.Signature // concrete method
-	targets := a.addOneNode(sig, "call.targets", nil)
-	a.addressOf(sig, targets, obj) // (a singleton)
-
-	// Copy receiver.
-	params := a.funcParams(obj)
-	a.copy(params, rtype, 1)
-	params++
-
-	// Copy actual parameters into formal P-block.
-	// Must loop, since the actuals aren't contiguous.
-	for i, arg := range call.Args {
-		sz := a.sizeof(sig.Params().At(i).Type())
-		a.copy(params, a.valueNode(arg), sz)
-		params += nodeid(sz)
-	}
-
-	// Copy formal R-block to actual R-block.
-	if result != 0 {
-		a.copy(result, a.funcResults(obj), a.sizeof(sig.Results()))
-	}
-}
-
-// genCall generates constraints for call instruction instr.
-func (a *analysis) genCall(caller *cgnode, instr ssa.CallInstruction) {
-	call := instr.Common()
-
-	// Intrinsic implementations of built-in functions.
-	if _, ok := call.Value.(*ssa.Builtin); ok {
-		a.genBuiltinCall(instr, caller)
-		return
-	}
-
-	var result nodeid
-	if v := instr.Value(); v != nil {
-		result = a.valueNode(v)
-	}
-
-	site := &callsite{instr: instr}
-	if call.StaticCallee() != nil {
-		a.genStaticCall(caller, site, call, result)
-	} else if call.IsInvoke() {
-		a.genInvoke(caller, site, call, result)
-	} else {
-		a.genDynamicCall(caller, site, call, result)
-	}
-
-	caller.sites = append(caller.sites, site)
-
-	if a.log != nil {
-		// TODO(adonovan): debug: improve log message.
-		fmt.Fprintf(a.log, "\t%s to targets %s from %s\n", site, site.targets, caller)
-	}
-}
-
-// objectNode returns the object to which v points, if known.
-// In other words, if the points-to set of v is a singleton, it
-// returns the sole label, zero otherwise.
-//
-// We exploit this information to make the generated constraints less
-// dynamic.  For example, a complex load constraint can be replaced by
-// a simple copy constraint when the sole destination is known a priori.
-//
-// Some SSA instructions always have singletons points-to sets:
-// 	Alloc, Function, Global, MakeChan, MakeClosure,  MakeInterface,  MakeMap,  MakeSlice.
-// Others may be singletons depending on their operands:
-// 	FreeVar, Const, Convert, FieldAddr, IndexAddr, Slice.
-//
-// Idempotent.  Objects are created as needed, possibly via recursion
-// down the SSA value graph, e.g IndexAddr(FieldAddr(Alloc))).
-//
-func (a *analysis) objectNode(cgn *cgnode, v ssa.Value) nodeid {
-	switch v.(type) {
-	case *ssa.Global, *ssa.Function, *ssa.Const, *ssa.FreeVar:
-		// Global object.
-		obj, ok := a.globalobj[v]
-		if !ok {
-			switch v := v.(type) {
-			case *ssa.Global:
-				obj = a.nextNode()
-				a.addNodes(mustDeref(v.Type()), "global")
-				a.endObject(obj, nil, v)
-
-			case *ssa.Function:
-				obj = a.makeFunctionObject(v, nil)
-
-			case *ssa.Const:
-				// not addressable
-
-			case *ssa.FreeVar:
-				// not addressable
-			}
-
-			if a.log != nil {
-				fmt.Fprintf(a.log, "\tglobalobj[%s] = n%d\n", v, obj)
-			}
-			a.globalobj[v] = obj
-		}
-		return obj
-	}
-
-	// Local object.
-	obj, ok := a.localobj[v]
-	if !ok {
-		switch v := v.(type) {
-		case *ssa.Alloc:
-			obj = a.nextNode()
-			a.addNodes(mustDeref(v.Type()), "alloc")
-			a.endObject(obj, cgn, v)
-
-		case *ssa.MakeSlice:
-			obj = a.nextNode()
-			a.addNodes(sliceToArray(v.Type()), "makeslice")
-			a.endObject(obj, cgn, v)
-
-		case *ssa.MakeChan:
-			obj = a.nextNode()
-			a.addNodes(v.Type().Underlying().(*types.Chan).Elem(), "makechan")
-			a.endObject(obj, cgn, v)
-
-		case *ssa.MakeMap:
-			obj = a.nextNode()
-			tmap := v.Type().Underlying().(*types.Map)
-			a.addNodes(tmap.Key(), "makemap.key")
-			elem := a.addNodes(tmap.Elem(), "makemap.value")
-
-			// To update the value field, MapUpdate
-			// generates store-with-offset constraints which
-			// the presolver can't model, so we must mark
-			// those nodes indirect.
-			for id, end := elem, elem+nodeid(a.sizeof(tmap.Elem())); id < end; id++ {
-				a.mapValues = append(a.mapValues, id)
-			}
-			a.endObject(obj, cgn, v)
-
-		case *ssa.MakeInterface:
-			tConc := v.X.Type()
-			obj = a.makeTagged(tConc, cgn, v)
-
-			// Copy the value into it, if nontrivial.
-			if x := a.valueNode(v.X); x != 0 {
-				a.copy(obj+1, x, a.sizeof(tConc))
-			}
-
-		case *ssa.FieldAddr:
-			if xobj := a.objectNode(cgn, v.X); xobj != 0 {
-				obj = xobj + nodeid(a.offsetOf(mustDeref(v.X.Type()), v.Field))
-			}
-
-		case *ssa.IndexAddr:
-			if xobj := a.objectNode(cgn, v.X); xobj != 0 {
-				obj = xobj + 1
-			}
-
-		case *ssa.Slice:
-			obj = a.objectNode(cgn, v.X)
-
-		case *ssa.Convert:
-			// TODO(adonovan): opt: handle these cases too:
-			// - unsafe.Pointer->*T conversion acts like Alloc
-			// - string->[]byte/[]rune conversion acts like MakeSlice
-		}
-
-		if a.log != nil {
-			fmt.Fprintf(a.log, "\tlocalobj[%s] = n%d\n", v.Name(), obj)
-		}
-		a.localobj[v] = obj
-	}
-	return obj
-}
-
-// genLoad generates constraints for result = *(ptr + val).
-func (a *analysis) genLoad(cgn *cgnode, result nodeid, ptr ssa.Value, offset, sizeof uint32) {
-	if obj := a.objectNode(cgn, ptr); obj != 0 {
-		// Pre-apply loadConstraint.solve().
-		a.copy(result, obj+nodeid(offset), sizeof)
-	} else {
-		a.load(result, a.valueNode(ptr), offset, sizeof)
-	}
-}
-
-// genOffsetAddr generates constraints for a 'v=ptr.field' (FieldAddr)
-// or 'v=ptr[*]' (IndexAddr) instruction v.
-func (a *analysis) genOffsetAddr(cgn *cgnode, v ssa.Value, ptr nodeid, offset uint32) {
-	dst := a.valueNode(v)
-	if obj := a.objectNode(cgn, v); obj != 0 {
-		// Pre-apply offsetAddrConstraint.solve().
-		a.addressOf(v.Type(), dst, obj)
-	} else {
-		a.offsetAddr(v.Type(), dst, ptr, offset)
-	}
-}
-
-// genStore generates constraints for *(ptr + offset) = val.
-func (a *analysis) genStore(cgn *cgnode, ptr ssa.Value, val nodeid, offset, sizeof uint32) {
-	if obj := a.objectNode(cgn, ptr); obj != 0 {
-		// Pre-apply storeConstraint.solve().
-		a.copy(obj+nodeid(offset), val, sizeof)
-	} else {
-		a.store(a.valueNode(ptr), val, offset, sizeof)
-	}
-}
-
-// genInstr generates constraints for instruction instr in context cgn.
-func (a *analysis) genInstr(cgn *cgnode, instr ssa.Instruction) {
-	if a.log != nil {
-		var prefix string
-		if val, ok := instr.(ssa.Value); ok {
-			prefix = val.Name() + " = "
-		}
-		fmt.Fprintf(a.log, "; %s%s\n", prefix, instr)
-	}
-
-	switch instr := instr.(type) {
-	case *ssa.DebugRef:
-		// no-op.
-
-	case *ssa.UnOp:
-		switch instr.Op {
-		case token.ARROW: // <-x
-			// We can ignore instr.CommaOk because the node we're
-			// altering is always at zero offset relative to instr
-			tElem := instr.X.Type().Underlying().(*types.Chan).Elem()
-			a.genLoad(cgn, a.valueNode(instr), instr.X, 0, a.sizeof(tElem))
-
-		case token.MUL: // *x
-			a.genLoad(cgn, a.valueNode(instr), instr.X, 0, a.sizeof(instr.Type()))
-
-		default:
-			// NOT, SUB, XOR: no-op.
-		}
-
-	case *ssa.BinOp:
-		// All no-ops.
-
-	case ssa.CallInstruction: // *ssa.Call, *ssa.Go, *ssa.Defer
-		a.genCall(cgn, instr)
-
-	case *ssa.ChangeType:
-		a.copy(a.valueNode(instr), a.valueNode(instr.X), 1)
-
-	case *ssa.Convert:
-		a.genConv(instr, cgn)
-
-	case *ssa.Extract:
-		a.copy(a.valueNode(instr),
-			a.valueOffsetNode(instr.Tuple, instr.Index),
-			a.sizeof(instr.Type()))
-
-	case *ssa.FieldAddr:
-		a.genOffsetAddr(cgn, instr, a.valueNode(instr.X),
-			a.offsetOf(mustDeref(instr.X.Type()), instr.Field))
-
-	case *ssa.IndexAddr:
-		a.genOffsetAddr(cgn, instr, a.valueNode(instr.X), 1)
-
-	case *ssa.Field:
-		a.copy(a.valueNode(instr),
-			a.valueOffsetNode(instr.X, instr.Field),
-			a.sizeof(instr.Type()))
-
-	case *ssa.Index:
-		a.copy(a.valueNode(instr), 1+a.valueNode(instr.X), a.sizeof(instr.Type()))
-
-	case *ssa.Select:
-		recv := a.valueOffsetNode(instr, 2) // instr : (index, recvOk, recv0, ... recv_n-1)
-		for _, st := range instr.States {
-			elemSize := a.sizeof(st.Chan.Type().Underlying().(*types.Chan).Elem())
-			switch st.Dir {
-			case types.RecvOnly:
-				a.genLoad(cgn, recv, st.Chan, 0, elemSize)
-				recv += nodeid(elemSize)
-
-			case types.SendOnly:
-				a.genStore(cgn, st.Chan, a.valueNode(st.Send), 0, elemSize)
-			}
-		}
-
-	case *ssa.Return:
-		results := a.funcResults(cgn.obj)
-		for _, r := range instr.Results {
-			sz := a.sizeof(r.Type())
-			a.copy(results, a.valueNode(r), sz)
-			results += nodeid(sz)
-		}
-
-	case *ssa.Send:
-		a.genStore(cgn, instr.Chan, a.valueNode(instr.X), 0, a.sizeof(instr.X.Type()))
-
-	case *ssa.Store:
-		a.genStore(cgn, instr.Addr, a.valueNode(instr.Val), 0, a.sizeof(instr.Val.Type()))
-
-	case *ssa.Alloc, *ssa.MakeSlice, *ssa.MakeChan, *ssa.MakeMap, *ssa.MakeInterface:
-		v := instr.(ssa.Value)
-		a.addressOf(v.Type(), a.valueNode(v), a.objectNode(cgn, v))
-
-	case *ssa.ChangeInterface:
-		a.copy(a.valueNode(instr), a.valueNode(instr.X), 1)
-
-	case *ssa.TypeAssert:
-		a.typeAssert(instr.AssertedType, a.valueNode(instr), a.valueNode(instr.X), true)
-
-	case *ssa.Slice:
-		a.copy(a.valueNode(instr), a.valueNode(instr.X), 1)
-
-	case *ssa.If, *ssa.Jump:
-		// no-op.
-
-	case *ssa.Phi:
-		sz := a.sizeof(instr.Type())
-		for _, e := range instr.Edges {
-			a.copy(a.valueNode(instr), a.valueNode(e), sz)
-		}
-
-	case *ssa.MakeClosure:
-		fn := instr.Fn.(*ssa.Function)
-		a.copy(a.valueNode(instr), a.valueNode(fn), 1)
-		// Free variables are treated like global variables.
-		for i, b := range instr.Bindings {
-			a.copy(a.valueNode(fn.FreeVars[i]), a.valueNode(b), a.sizeof(b.Type()))
-		}
-
-	case *ssa.RunDefers:
-		// The analysis is flow insensitive, so we just "call"
-		// defers as we encounter them.
-
-	case *ssa.Range:
-		// Do nothing.  Next{Iter: *ssa.Range} handles this case.
-
-	case *ssa.Next:
-		if !instr.IsString { // map
-			// Assumes that Next is always directly applied to a Range result.
-			theMap := instr.Iter.(*ssa.Range).X
-			tMap := theMap.Type().Underlying().(*types.Map)
-			ksize := a.sizeof(tMap.Key())
-			vsize := a.sizeof(tMap.Elem())
-
-			// Load from the map's (k,v) into the tuple's (ok, k, v).
-			a.genLoad(cgn, a.valueNode(instr)+1, theMap, 0, ksize+vsize)
-		}
-
-	case *ssa.Lookup:
-		if tMap, ok := instr.X.Type().Underlying().(*types.Map); ok {
-			// CommaOk can be ignored: field 0 is a no-op.
-			ksize := a.sizeof(tMap.Key())
-			vsize := a.sizeof(tMap.Elem())
-			a.genLoad(cgn, a.valueNode(instr), instr.X, ksize, vsize)
-		}
-
-	case *ssa.MapUpdate:
-		tmap := instr.Map.Type().Underlying().(*types.Map)
-		ksize := a.sizeof(tmap.Key())
-		vsize := a.sizeof(tmap.Elem())
-		a.genStore(cgn, instr.Map, a.valueNode(instr.Key), 0, ksize)
-		a.genStore(cgn, instr.Map, a.valueNode(instr.Value), ksize, vsize)
-
-	case *ssa.Panic:
-		a.copy(a.panicNode, a.valueNode(instr.X), 1)
-
-	default:
-		panic(fmt.Sprintf("unimplemented: %T", instr))
-	}
-}
-
-func (a *analysis) makeCGNode(fn *ssa.Function, obj nodeid, callersite *callsite) *cgnode {
-	cgn := &cgnode{fn: fn, obj: obj, callersite: callersite}
-	a.cgnodes = append(a.cgnodes, cgn)
-	return cgn
-}
-
-// genRootCalls generates the synthetic root of the callgraph and the
-// initial calls from it to the analysis scope, such as main, a test
-// or a library.
-//
-func (a *analysis) genRootCalls() *cgnode {
-	r := a.prog.NewFunction("<root>", new(types.Signature), "root of callgraph")
-	root := a.makeCGNode(r, 0, nil)
-
-	// TODO(adonovan): make an ssa utility to construct an actual
-	// root function so we don't need to special-case site-less
-	// call edges.
-
-	// For each main package, call main.init(), main.main().
-	for _, mainPkg := range a.config.Mains {
-		main := mainPkg.Func("main")
-		if main == nil {
-			panic(fmt.Sprintf("%s has no main function", mainPkg))
-		}
-
-		targets := a.addOneNode(main.Signature, "root.targets", nil)
-		site := &callsite{targets: targets}
-		root.sites = append(root.sites, site)
-		for _, fn := range [2]*ssa.Function{mainPkg.Func("init"), main} {
-			if a.log != nil {
-				fmt.Fprintf(a.log, "\troot call to %s:\n", fn)
-			}
-			a.copy(targets, a.valueNode(fn), 1)
-		}
-	}
-
-	return root
-}
-
-// genFunc generates constraints for function fn.
-func (a *analysis) genFunc(cgn *cgnode) {
-	fn := cgn.fn
-
-	impl := a.findIntrinsic(fn)
-
-	if a.log != nil {
-		fmt.Fprintf(a.log, "\n\n==== Generating constraints for %s, %s\n", cgn, cgn.contour())
-
-		// Hack: don't display body if intrinsic.
-		if impl != nil {
-			fn2 := *cgn.fn // copy
-			fn2.Locals = nil
-			fn2.Blocks = nil
-			fn2.WriteTo(a.log)
-		} else {
-			cgn.fn.WriteTo(a.log)
-		}
-	}
-
-	if impl != nil {
-		impl(a, cgn)
-		return
-	}
-
-	if fn.Blocks == nil {
-		// External function with no intrinsic treatment.
-		// We'll warn about calls to such functions at the end.
-		return
-	}
-
-	if a.log != nil {
-		fmt.Fprintln(a.log, "; Creating nodes for local values")
-	}
-
-	a.localval = make(map[ssa.Value]nodeid)
-	a.localobj = make(map[ssa.Value]nodeid)
-
-	// The value nodes for the params are in the func object block.
-	params := a.funcParams(cgn.obj)
-	for _, p := range fn.Params {
-		a.setValueNode(p, params, cgn)
-		params += nodeid(a.sizeof(p.Type()))
-	}
-
-	// Free variables have global cardinality:
-	// the outer function sets them with MakeClosure;
-	// the inner function accesses them with FreeVar.
-	//
-	// TODO(adonovan): treat free vars context-sensitively.
-
-	// Create value nodes for all value instructions
-	// since SSA may contain forward references.
-	var space [10]*ssa.Value
-	for _, b := range fn.Blocks {
-		for _, instr := range b.Instrs {
-			switch instr := instr.(type) {
-			case *ssa.Range:
-				// do nothing: it has a funky type,
-				// and *ssa.Next does all the work.
-
-			case ssa.Value:
-				var comment string
-				if a.log != nil {
-					comment = instr.Name()
-				}
-				id := a.addNodes(instr.Type(), comment)
-				a.setValueNode(instr, id, cgn)
-			}
-
-			// Record all address-taken functions (for presolver).
-			rands := instr.Operands(space[:0])
-			if call, ok := instr.(ssa.CallInstruction); ok && !call.Common().IsInvoke() {
-				// Skip CallCommon.Value in "call" mode.
-				// TODO(adonovan): fix: relies on unspecified ordering.  Specify it.
-				rands = rands[1:]
-			}
-			for _, rand := range rands {
-				if atf, ok := (*rand).(*ssa.Function); ok {
-					a.atFuncs[atf] = true
-				}
-			}
-		}
-	}
-
-	// Generate constraints for instructions.
-	for _, b := range fn.Blocks {
-		for _, instr := range b.Instrs {
-			a.genInstr(cgn, instr)
-		}
-	}
-
-	a.localval = nil
-	a.localobj = nil
-}
-
-// genMethodsOf generates nodes and constraints for all methods of type T.
-func (a *analysis) genMethodsOf(T types.Type) {
-	itf := isInterface(T)
-
-	// TODO(adonovan): can we skip this entirely if itf is true?
-	// I think so, but the answer may depend on reflection.
-	mset := a.prog.MethodSets.MethodSet(T)
-	for i, n := 0, mset.Len(); i < n; i++ {
-		m := a.prog.Method(mset.At(i))
-		a.valueNode(m)
-
-		if !itf {
-			// Methods of concrete types are address-taken functions.
-			a.atFuncs[m] = true
-		}
-	}
-}
-
-// generate generates offline constraints for the entire program.
-func (a *analysis) generate() {
-	start("Constraint generation")
-	if a.log != nil {
-		fmt.Fprintln(a.log, "==== Generating constraints")
-	}
-
-	// Create a dummy node since we use the nodeid 0 for
-	// non-pointerlike variables.
-	a.addNodes(tInvalid, "(zero)")
-
-	// Create the global node for panic values.
-	a.panicNode = a.addNodes(tEface, "panic")
-
-	// Create nodes and constraints for all methods of reflect.rtype.
-	// (Shared contours are used by dynamic calls to reflect.Type
-	// methods---typically just String().)
-	if rtype := a.reflectRtypePtr; rtype != nil {
-		a.genMethodsOf(rtype)
-	}
-
-	root := a.genRootCalls()
-
-	if a.config.BuildCallGraph {
-		a.result.CallGraph = callgraph.New(root.fn)
-	}
-
-	// Create nodes and constraints for all methods of all types
-	// that are dynamically accessible via reflection or interfaces.
-	for _, T := range a.prog.RuntimeTypes() {
-		a.genMethodsOf(T)
-	}
-
-	// Generate constraints for entire program.
-	for len(a.genq) > 0 {
-		cgn := a.genq[0]
-		a.genq = a.genq[1:]
-		a.genFunc(cgn)
-	}
-
-	// The runtime magically allocates os.Args; so should we.
-	if os := a.prog.ImportedPackage("os"); os != nil {
-		// In effect:  os.Args = new([1]string)[:]
-		T := types.NewSlice(types.Typ[types.String])
-		obj := a.addNodes(sliceToArray(T), "<command-line args>")
-		a.endObject(obj, nil, "<command-line args>")
-		a.addressOf(T, a.objectNode(nil, os.Var("Args")), obj)
-	}
-
-	// Discard generation state, to avoid confusion after node renumbering.
-	a.panicNode = 0
-	a.globalval = nil
-	a.localval = nil
-	a.localobj = nil
-
-	stop("Constraint generation")
-}
diff --git a/third_party/gotools/go/pointer/hvn.go b/third_party/gotools/go/pointer/hvn.go
deleted file mode 100644
index b48b40c..0000000
--- a/third_party/gotools/go/pointer/hvn.go
+++ /dev/null
@@ -1,969 +0,0 @@
-package pointer
-
-// This file implements Hash-Value Numbering (HVN), a pre-solver
-// constraint optimization described in Hardekopf & Lin, SAS'07 (see
-// doc.go) that analyses the graph topology to determine which sets of
-// variables are "pointer equivalent" (PE), i.e. must have identical
-// points-to sets in the solution.
-//
-// A separate ("offline") graph is constructed.  Its nodes are those of
-// the main-graph, plus an additional node *X for each pointer node X.
-// With this graph we can reason about the unknown points-to set of
-// dereferenced pointers.  (We do not generalize this to represent
-// unknown fields x->f, perhaps because such fields would be numerous,
-// though it might be worth an experiment.)
-//
-// Nodes whose points-to relations are not entirely captured by the
-// graph are marked as "indirect": the *X nodes, the parameters of
-// address-taken functions (which includes all functions in method
-// sets), or nodes updated by the solver rules for reflection, etc.
-//
-// All addr (y=&x) nodes are initially assigned a pointer-equivalence
-// (PE) label equal to x's nodeid in the main graph.  (These are the
-// only PE labels that are less than len(a.nodes).)
-//
-// All offsetAddr (y=&x.f) constraints are initially assigned a PE
-// label; such labels are memoized, keyed by (x, f), so that equivalent
-// nodes y as assigned the same label.
-//
-// Then we process each strongly connected component (SCC) of the graph
-// in topological order, assigning it a PE label based on the set P of
-// PE labels that flow to it from its immediate dependencies.
-//
-// If any node in P is "indirect", the entire SCC is assigned a fresh PE
-// label.  Otherwise:
-//
-// |P|=0  if P is empty, all nodes in the SCC are non-pointers (e.g.
-//        uninitialized variables, or formal params of dead functions)
-//        and the SCC is assigned the PE label of zero.
-//
-// |P|=1  if P is a singleton, the SCC is assigned the same label as the
-//        sole element of P.
-//
-// |P|>1  if P contains multiple labels, a unique label representing P is
-//        invented and recorded in an hash table, so that other
-//        equivalent SCCs may also be assigned this label, akin to
-//        conventional hash-value numbering in a compiler.
-//
-// Finally, a renumbering is computed such that each node is replaced by
-// the lowest-numbered node with the same PE label.  All constraints are
-// renumbered, and any resulting duplicates are eliminated.
-//
-// The only nodes that are not renumbered are the objects x in addr
-// (y=&x) constraints, since the ids of these nodes (and fields derived
-// from them via offsetAddr rules) are the elements of all points-to
-// sets, so they must remain as they are if we want the same solution.
-//
-// The solverStates (node.solve) for nodes in the same equivalence class
-// are linked together so that all nodes in the class have the same
-// solution.  This avoids the need to renumber nodeids buried in
-// Queries, cgnodes, etc (like (*analysis).renumber() does) since only
-// the solution is needed.
-//
-// The result of HVN is that the number of distinct nodes and
-// constraints is reduced, but the solution is identical (almost---see
-// CROSS-CHECK below).  In particular, both linear and cyclic chains of
-// copies are each replaced by a single node.
-//
-// Nodes and constraints created "online" (e.g. while solving reflection
-// constraints) are not subject to this optimization.
-//
-// PERFORMANCE
-//
-// In two benchmarks (oracle and godoc), HVN eliminates about two thirds
-// of nodes, the majority accounted for by non-pointers: nodes of
-// non-pointer type, pointers that remain nil, formal parameters of dead
-// functions, nodes of untracked types, etc.  It also reduces the number
-// of constraints, also by about two thirds, and the solving time by
-// 30--42%, although we must pay about 15% for the running time of HVN
-// itself.  The benefit is greater for larger applications.
-//
-// There are many possible optimizations to improve the performance:
-// * Use fewer than 1:1 onodes to main graph nodes: many of the onodes
-//   we create are not needed.
-// * HU (HVN with Union---see paper): coalesce "union" peLabels when
-//   their expanded-out sets are equal.
-// * HR (HVN with deReference---see paper): this will require that we
-//   apply HVN until fixed point, which may need more bookkeeping of the
-//   correspondance of main nodes to onodes.
-// * Location Equivalence (see paper): have points-to sets contain not
-//   locations but location-equivalence class labels, each representing
-//   a set of locations.
-// * HVN with field-sensitive ref: model each of the fields of a
-//   pointer-to-struct.
-//
-// CROSS-CHECK
-//
-// To verify the soundness of the optimization, when the
-// debugHVNCrossCheck option is enabled, we run the solver twice, once
-// before and once after running HVN, dumping the solution to disk, and
-// then we compare the results.  If they are not identical, the analysis
-// panics.
-//
-// The solution dumped to disk includes only the N*N submatrix of the
-// complete solution where N is the number of nodes after generation.
-// In other words, we ignore pointer variables and objects created by
-// the solver itself, since their numbering depends on the solver order,
-// which is affected by the optimization.  In any case, that's the only
-// part the client cares about.
-//
-// The cross-check is too strict and may fail spuriously.  Although the
-// H&L paper describing HVN states that the solutions obtained should be
-// identical, this is not the case in practice because HVN can collapse
-// cycles involving *p even when pts(p)={}.  Consider this example
-// distilled from testdata/hello.go:
-//
-//	var x T
-//	func f(p **T) {
-//		t0 = *p
-//		...
-//		t1 = φ(t0, &x)
-//		*p = t1
-//	}
-//
-// If f is dead code, we get:
-// 	unoptimized:  pts(p)={} pts(t0)={} pts(t1)={&x}
-// 	optimized:    pts(p)={} pts(t0)=pts(t1)=pts(*p)={&x}
-//
-// It's hard to argue that this is a bug: the result is sound and the
-// loss of precision is inconsequential---f is dead code, after all.
-// But unfortunately it limits the usefulness of the cross-check since
-// failures must be carefully analyzed.  Ben Hardekopf suggests (in
-// personal correspondence) some approaches to mitigating it:
-//
-// 	If there is a node with an HVN points-to set that is a superset
-// 	of the NORM points-to set, then either it's a bug or it's a
-// 	result of this issue. If it's a result of this issue, then in
-// 	the offline constraint graph there should be a REF node inside
-// 	some cycle that reaches this node, and in the NORM solution the
-// 	pointer being dereferenced by that REF node should be the empty
-// 	set. If that isn't true then this is a bug. If it is true, then
-// 	you can further check that in the NORM solution the "extra"
-// 	points-to info in the HVN solution does in fact come from that
-// 	purported cycle (if it doesn't, then this is still a bug). If
-// 	you're doing the further check then you'll need to do it for
-// 	each "extra" points-to element in the HVN points-to set.
-//
-// 	There are probably ways to optimize these checks by taking
-// 	advantage of graph properties. For example, extraneous points-to
-// 	info will flow through the graph and end up in many
-// 	nodes. Rather than checking every node with extra info, you
-// 	could probably work out the "origin point" of the extra info and
-// 	just check there. Note that the check in the first bullet is
-// 	looking for soundness bugs, while the check in the second bullet
-// 	is looking for precision bugs; depending on your needs, you may
-// 	care more about one than the other.
-//
-// which we should evaluate.  The cross-check is nonetheless invaluable
-// for all but one of the programs in the pointer_test suite.
-
-import (
-	"fmt"
-	"io"
-	"reflect"
-
-	"llvm.org/llgo/third_party/gotools/container/intsets"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// A peLabel is a pointer-equivalence label: two nodes with the same
-// peLabel have identical points-to solutions.
-//
-// The numbers are allocated consecutively like so:
-// 	0	not a pointer
-//	1..N-1	addrConstraints (equals the constraint's .src field, hence sparse)
-//	...	offsetAddr constraints
-//	...	SCCs (with indirect nodes or multiple inputs)
-//
-// Each PE label denotes a set of pointers containing a single addr, a
-// single offsetAddr, or some set of other PE labels.
-//
-type peLabel int
-
-type hvn struct {
-	a        *analysis
-	N        int                // len(a.nodes) immediately after constraint generation
-	log      io.Writer          // (optional) log of HVN lemmas
-	onodes   []*onode           // nodes of the offline graph
-	label    peLabel            // the next available PE label
-	hvnLabel map[string]peLabel // hash-value numbering (PE label) for each set of onodeids
-	stack    []onodeid          // DFS stack
-	index    int32              // next onode.index, from Tarjan's SCC algorithm
-
-	// For each distinct offsetAddrConstraint (src, offset) pair,
-	// offsetAddrLabels records a unique PE label >= N.
-	offsetAddrLabels map[offsetAddr]peLabel
-}
-
-// The index of an node in the offline graph.
-// (Currently the first N align with the main nodes,
-// but this may change with HRU.)
-type onodeid uint32
-
-// An onode is a node in the offline constraint graph.
-// (Where ambiguous, members of analysis.nodes are referred to as
-// "main graph" nodes.)
-//
-// Edges in the offline constraint graph (edges and implicit) point to
-// the source, i.e. against the flow of values: they are dependencies.
-// Implicit edges are used for SCC computation, but not for gathering
-// incoming labels.
-//
-type onode struct {
-	rep onodeid // index of representative of SCC in offline constraint graph
-
-	edges    intsets.Sparse // constraint edges X-->Y (this onode is X)
-	implicit intsets.Sparse // implicit edges *X-->*Y (this onode is X)
-	peLabels intsets.Sparse // set of peLabels are pointer-equivalent to this one
-	indirect bool           // node has points-to relations not represented in graph
-
-	// Tarjan's SCC algorithm
-	index, lowlink int32 // Tarjan numbering
-	scc            int32 // -ve => on stack; 0 => unvisited; +ve => node is root of a found SCC
-}
-
-type offsetAddr struct {
-	ptr    nodeid
-	offset uint32
-}
-
-// nextLabel issues the next unused pointer-equivalence label.
-func (h *hvn) nextLabel() peLabel {
-	h.label++
-	return h.label
-}
-
-// ref(X) returns the index of the onode for *X.
-func (h *hvn) ref(id onodeid) onodeid {
-	return id + onodeid(len(h.a.nodes))
-}
-
-// hvn computes pointer-equivalence labels (peLabels) using the Hash-based
-// Value Numbering (HVN) algorithm described in Hardekopf & Lin, SAS'07.
-//
-func (a *analysis) hvn() {
-	start("HVN")
-
-	if a.log != nil {
-		fmt.Fprintf(a.log, "\n\n==== Pointer equivalence optimization\n\n")
-	}
-
-	h := hvn{
-		a:                a,
-		N:                len(a.nodes),
-		log:              a.log,
-		hvnLabel:         make(map[string]peLabel),
-		offsetAddrLabels: make(map[offsetAddr]peLabel),
-	}
-
-	if h.log != nil {
-		fmt.Fprintf(h.log, "\nCreating offline graph nodes...\n")
-	}
-
-	// Create offline nodes.  The first N nodes correspond to main
-	// graph nodes; the next N are their corresponding ref() nodes.
-	h.onodes = make([]*onode, 2*h.N)
-	for id := range a.nodes {
-		id := onodeid(id)
-		h.onodes[id] = &onode{}
-		h.onodes[h.ref(id)] = &onode{indirect: true}
-	}
-
-	// Each node initially represents just itself.
-	for id, o := range h.onodes {
-		o.rep = onodeid(id)
-	}
-
-	h.markIndirectNodes()
-
-	// Reserve the first N PE labels for addrConstraints.
-	h.label = peLabel(h.N)
-
-	// Add offline constraint edges.
-	if h.log != nil {
-		fmt.Fprintf(h.log, "\nAdding offline graph edges...\n")
-	}
-	for _, c := range a.constraints {
-		if debugHVNVerbose && h.log != nil {
-			fmt.Fprintf(h.log, "; %s\n", c)
-		}
-		c.presolve(&h)
-	}
-
-	// Find and collapse SCCs.
-	if h.log != nil {
-		fmt.Fprintf(h.log, "\nFinding SCCs...\n")
-	}
-	h.index = 1
-	for id, o := range h.onodes {
-		if id > 0 && o.index == 0 {
-			// Start depth-first search at each unvisited node.
-			h.visit(onodeid(id))
-		}
-	}
-
-	// Dump the solution
-	// (NB: somewhat redundant with logging from simplify().)
-	if debugHVNVerbose && h.log != nil {
-		fmt.Fprintf(h.log, "\nPointer equivalences:\n")
-		for id, o := range h.onodes {
-			if id == 0 {
-				continue
-			}
-			if id == int(h.N) {
-				fmt.Fprintf(h.log, "---\n")
-			}
-			fmt.Fprintf(h.log, "o%d\t", id)
-			if o.rep != onodeid(id) {
-				fmt.Fprintf(h.log, "rep=o%d", o.rep)
-			} else {
-				fmt.Fprintf(h.log, "p%d", o.peLabels.Min())
-				if o.indirect {
-					fmt.Fprint(h.log, " indirect")
-				}
-			}
-			fmt.Fprintln(h.log)
-		}
-	}
-
-	// Simplify the main constraint graph
-	h.simplify()
-
-	a.showCounts()
-
-	stop("HVN")
-}
-
-// ---- constraint-specific rules ----
-
-// dst := &src
-func (c *addrConstraint) presolve(h *hvn) {
-	// Each object (src) is an initial PE label.
-	label := peLabel(c.src) // label < N
-	if debugHVNVerbose && h.log != nil {
-		// duplicate log messages are possible
-		fmt.Fprintf(h.log, "\tcreate p%d: {&n%d}\n", label, c.src)
-	}
-	odst := onodeid(c.dst)
-	osrc := onodeid(c.src)
-
-	// Assign dst this label.
-	h.onodes[odst].peLabels.Insert(int(label))
-	if debugHVNVerbose && h.log != nil {
-		fmt.Fprintf(h.log, "\to%d has p%d\n", odst, label)
-	}
-
-	h.addImplicitEdge(h.ref(odst), osrc) // *dst ~~> src.
-}
-
-// dst = src
-func (c *copyConstraint) presolve(h *hvn) {
-	odst := onodeid(c.dst)
-	osrc := onodeid(c.src)
-	h.addEdge(odst, osrc)                       //  dst -->  src
-	h.addImplicitEdge(h.ref(odst), h.ref(osrc)) // *dst ~~> *src
-}
-
-// dst = *src + offset
-func (c *loadConstraint) presolve(h *hvn) {
-	odst := onodeid(c.dst)
-	osrc := onodeid(c.src)
-	if c.offset == 0 {
-		h.addEdge(odst, h.ref(osrc)) // dst --> *src
-	} else {
-		// We don't interpret load-with-offset, e.g. results
-		// of map value lookup, R-block of dynamic call, slice
-		// copy/append, reflection.
-		h.markIndirect(odst, "load with offset")
-	}
-}
-
-// *dst + offset = src
-func (c *storeConstraint) presolve(h *hvn) {
-	odst := onodeid(c.dst)
-	osrc := onodeid(c.src)
-	if c.offset == 0 {
-		h.onodes[h.ref(odst)].edges.Insert(int(osrc)) // *dst --> src
-		if debugHVNVerbose && h.log != nil {
-			fmt.Fprintf(h.log, "\to%d --> o%d\n", h.ref(odst), osrc)
-		}
-	} else {
-		// We don't interpret store-with-offset.
-		// See discussion of soundness at markIndirectNodes.
-	}
-}
-
-// dst = &src.offset
-func (c *offsetAddrConstraint) presolve(h *hvn) {
-	// Give each distinct (addr, offset) pair a fresh PE label.
-	// The cache performs CSE, effectively.
-	key := offsetAddr{c.src, c.offset}
-	label, ok := h.offsetAddrLabels[key]
-	if !ok {
-		label = h.nextLabel()
-		h.offsetAddrLabels[key] = label
-		if debugHVNVerbose && h.log != nil {
-			fmt.Fprintf(h.log, "\tcreate p%d: {&n%d.#%d}\n",
-				label, c.src, c.offset)
-		}
-	}
-
-	// Assign dst this label.
-	h.onodes[c.dst].peLabels.Insert(int(label))
-	if debugHVNVerbose && h.log != nil {
-		fmt.Fprintf(h.log, "\to%d has p%d\n", c.dst, label)
-	}
-}
-
-// dst = src.(typ)  where typ is an interface
-func (c *typeFilterConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.dst), "typeFilter result")
-}
-
-// dst = src.(typ)  where typ is concrete
-func (c *untagConstraint) presolve(h *hvn) {
-	odst := onodeid(c.dst)
-	for end := odst + onodeid(h.a.sizeof(c.typ)); odst < end; odst++ {
-		h.markIndirect(odst, "untag result")
-	}
-}
-
-// dst = src.method(c.params...)
-func (c *invokeConstraint) presolve(h *hvn) {
-	// All methods are address-taken functions, so
-	// their formal P-blocks were already marked indirect.
-
-	// Mark the caller's targets node as indirect.
-	sig := c.method.Type().(*types.Signature)
-	id := c.params
-	h.markIndirect(onodeid(c.params), "invoke targets node")
-	id++
-
-	id += nodeid(h.a.sizeof(sig.Params()))
-
-	// Mark the caller's R-block as indirect.
-	end := id + nodeid(h.a.sizeof(sig.Results()))
-	for id < end {
-		h.markIndirect(onodeid(id), "invoke R-block")
-		id++
-	}
-}
-
-// markIndirectNodes marks as indirect nodes whose points-to relations
-// are not entirely captured by the offline graph, including:
-//
-//    (a) All address-taken nodes (including the following nodes within
-//        the same object).  This is described in the paper.
-//
-// The most subtle cause of indirect nodes is the generation of
-// store-with-offset constraints since the offline graph doesn't
-// represent them.  A global audit of constraint generation reveals the
-// following uses of store-with-offset:
-//
-//    (b) genDynamicCall, for P-blocks of dynamically called functions,
-//        to which dynamic copy edges will be added to them during
-//        solving: from storeConstraint for standalone functions,
-//        and from invokeConstraint for methods.
-//        All such P-blocks must be marked indirect.
-//    (c) MakeUpdate, to update the value part of a map object.
-//        All MakeMap objects's value parts must be marked indirect.
-//    (d) copyElems, to update the destination array.
-//        All array elements must be marked indirect.
-//
-// Not all indirect marking happens here.  ref() nodes are marked
-// indirect at construction, and each constraint's presolve() method may
-// mark additional nodes.
-//
-func (h *hvn) markIndirectNodes() {
-	// (a) all address-taken nodes, plus all nodes following them
-	//     within the same object, since these may be indirectly
-	//     stored or address-taken.
-	for _, c := range h.a.constraints {
-		if c, ok := c.(*addrConstraint); ok {
-			start := h.a.enclosingObj(c.src)
-			end := start + nodeid(h.a.nodes[start].obj.size)
-			for id := c.src; id < end; id++ {
-				h.markIndirect(onodeid(id), "A-T object")
-			}
-		}
-	}
-
-	// (b) P-blocks of all address-taken functions.
-	for id := 0; id < h.N; id++ {
-		obj := h.a.nodes[id].obj
-
-		// TODO(adonovan): opt: if obj.cgn.fn is a method and
-		// obj.cgn is not its shared contour, this is an
-		// "inlined" static method call.  We needn't consider it
-		// address-taken since no invokeConstraint will affect it.
-
-		if obj != nil && obj.flags&otFunction != 0 && h.a.atFuncs[obj.cgn.fn] {
-			// address-taken function
-			if debugHVNVerbose && h.log != nil {
-				fmt.Fprintf(h.log, "n%d is address-taken: %s\n", id, obj.cgn.fn)
-			}
-			h.markIndirect(onodeid(id), "A-T func identity")
-			id++
-			sig := obj.cgn.fn.Signature
-			psize := h.a.sizeof(sig.Params())
-			if sig.Recv() != nil {
-				psize += h.a.sizeof(sig.Recv().Type())
-			}
-			for end := id + int(psize); id < end; id++ {
-				h.markIndirect(onodeid(id), "A-T func P-block")
-			}
-			id--
-			continue
-		}
-	}
-
-	// (c) all map objects' value fields.
-	for _, id := range h.a.mapValues {
-		h.markIndirect(onodeid(id), "makemap.value")
-	}
-
-	// (d) all array element objects.
-	// TODO(adonovan): opt: can we do better?
-	for id := 0; id < h.N; id++ {
-		// Identity node for an object of array type?
-		if tArray, ok := h.a.nodes[id].typ.(*types.Array); ok {
-			// Mark the array element nodes indirect.
-			// (Skip past the identity field.)
-			for _ = range h.a.flatten(tArray.Elem()) {
-				id++
-				h.markIndirect(onodeid(id), "array elem")
-			}
-		}
-	}
-}
-
-func (h *hvn) markIndirect(oid onodeid, comment string) {
-	h.onodes[oid].indirect = true
-	if debugHVNVerbose && h.log != nil {
-		fmt.Fprintf(h.log, "\to%d is indirect: %s\n", oid, comment)
-	}
-}
-
-// Adds an edge dst-->src.
-// Note the unusual convention: edges are dependency (contraflow) edges.
-func (h *hvn) addEdge(odst, osrc onodeid) {
-	h.onodes[odst].edges.Insert(int(osrc))
-	if debugHVNVerbose && h.log != nil {
-		fmt.Fprintf(h.log, "\to%d --> o%d\n", odst, osrc)
-	}
-}
-
-func (h *hvn) addImplicitEdge(odst, osrc onodeid) {
-	h.onodes[odst].implicit.Insert(int(osrc))
-	if debugHVNVerbose && h.log != nil {
-		fmt.Fprintf(h.log, "\to%d ~~> o%d\n", odst, osrc)
-	}
-}
-
-// visit implements the depth-first search of Tarjan's SCC algorithm.
-// Precondition: x is canonical.
-func (h *hvn) visit(x onodeid) {
-	h.checkCanonical(x)
-	xo := h.onodes[x]
-	xo.index = h.index
-	xo.lowlink = h.index
-	h.index++
-
-	h.stack = append(h.stack, x) // push
-	assert(xo.scc == 0, "node revisited")
-	xo.scc = -1
-
-	var deps []int
-	deps = xo.edges.AppendTo(deps)
-	deps = xo.implicit.AppendTo(deps)
-
-	for _, y := range deps {
-		// Loop invariant: x is canonical.
-
-		y := h.find(onodeid(y))
-
-		if x == y {
-			continue // nodes already coalesced
-		}
-
-		xo := h.onodes[x]
-		yo := h.onodes[y]
-
-		switch {
-		case yo.scc > 0:
-			// y is already a collapsed SCC
-
-		case yo.scc < 0:
-			// y is on the stack, and thus in the current SCC.
-			if yo.index < xo.lowlink {
-				xo.lowlink = yo.index
-			}
-
-		default:
-			// y is unvisited; visit it now.
-			h.visit(y)
-			// Note: x and y are now non-canonical.
-
-			x = h.find(onodeid(x))
-
-			if yo.lowlink < xo.lowlink {
-				xo.lowlink = yo.lowlink
-			}
-		}
-	}
-	h.checkCanonical(x)
-
-	// Is x the root of an SCC?
-	if xo.lowlink == xo.index {
-		// Coalesce all nodes in the SCC.
-		if debugHVNVerbose && h.log != nil {
-			fmt.Fprintf(h.log, "scc o%d\n", x)
-		}
-		for {
-			// Pop y from stack.
-			i := len(h.stack) - 1
-			y := h.stack[i]
-			h.stack = h.stack[:i]
-
-			h.checkCanonical(x)
-			xo := h.onodes[x]
-			h.checkCanonical(y)
-			yo := h.onodes[y]
-
-			if xo == yo {
-				// SCC is complete.
-				xo.scc = 1
-				h.labelSCC(x)
-				break
-			}
-			h.coalesce(x, y)
-		}
-	}
-}
-
-// Precondition: x is canonical.
-func (h *hvn) labelSCC(x onodeid) {
-	h.checkCanonical(x)
-	xo := h.onodes[x]
-	xpe := &xo.peLabels
-
-	// All indirect nodes get new labels.
-	if xo.indirect {
-		label := h.nextLabel()
-		if debugHVNVerbose && h.log != nil {
-			fmt.Fprintf(h.log, "\tcreate p%d: indirect SCC\n", label)
-			fmt.Fprintf(h.log, "\to%d has p%d\n", x, label)
-		}
-
-		// Remove pre-labeling, in case a direct pre-labeled node was
-		// merged with an indirect one.
-		xpe.Clear()
-		xpe.Insert(int(label))
-
-		return
-	}
-
-	// Invariant: all peLabels sets are non-empty.
-	// Those that are logically empty contain zero as their sole element.
-	// No other sets contains zero.
-
-	// Find all labels coming in to the coalesced SCC node.
-	for _, y := range xo.edges.AppendTo(nil) {
-		y := h.find(onodeid(y))
-		if y == x {
-			continue // already coalesced
-		}
-		ype := &h.onodes[y].peLabels
-		if debugHVNVerbose && h.log != nil {
-			fmt.Fprintf(h.log, "\tedge from o%d = %s\n", y, ype)
-		}
-
-		if ype.IsEmpty() {
-			if debugHVNVerbose && h.log != nil {
-				fmt.Fprintf(h.log, "\tnode has no PE label\n")
-			}
-		}
-		assert(!ype.IsEmpty(), "incoming node has no PE label")
-
-		if ype.Has(0) {
-			// {0} represents a non-pointer.
-			assert(ype.Len() == 1, "PE set contains {0, ...}")
-		} else {
-			xpe.UnionWith(ype)
-		}
-	}
-
-	switch xpe.Len() {
-	case 0:
-		// SCC has no incoming non-zero PE labels: it is a non-pointer.
-		xpe.Insert(0)
-
-	case 1:
-		// already a singleton
-
-	default:
-		// SCC has multiple incoming non-zero PE labels.
-		// Find the canonical label representing this set.
-		// We use String() as a fingerprint consistent with Equals().
-		key := xpe.String()
-		label, ok := h.hvnLabel[key]
-		if !ok {
-			label = h.nextLabel()
-			if debugHVNVerbose && h.log != nil {
-				fmt.Fprintf(h.log, "\tcreate p%d: union %s\n", label, xpe.String())
-			}
-			h.hvnLabel[key] = label
-		}
-		xpe.Clear()
-		xpe.Insert(int(label))
-	}
-
-	if debugHVNVerbose && h.log != nil {
-		fmt.Fprintf(h.log, "\to%d has p%d\n", x, xpe.Min())
-	}
-}
-
-// coalesce combines two nodes in the offline constraint graph.
-// Precondition: x and y are canonical.
-func (h *hvn) coalesce(x, y onodeid) {
-	xo := h.onodes[x]
-	yo := h.onodes[y]
-
-	// x becomes y's canonical representative.
-	yo.rep = x
-
-	if debugHVNVerbose && h.log != nil {
-		fmt.Fprintf(h.log, "\tcoalesce o%d into o%d\n", y, x)
-	}
-
-	// x accumulates y's edges.
-	xo.edges.UnionWith(&yo.edges)
-	yo.edges.Clear()
-
-	// x accumulates y's implicit edges.
-	xo.implicit.UnionWith(&yo.implicit)
-	yo.implicit.Clear()
-
-	// x accumulates y's pointer-equivalence labels.
-	xo.peLabels.UnionWith(&yo.peLabels)
-	yo.peLabels.Clear()
-
-	// x accumulates y's indirect flag.
-	if yo.indirect {
-		xo.indirect = true
-	}
-}
-
-// simplify computes a degenerate renumbering of nodeids from the PE
-// labels assigned by the hvn, and uses it to simplify the main
-// constraint graph, eliminating non-pointer nodes and duplicate
-// constraints.
-//
-func (h *hvn) simplify() {
-	// canon maps each peLabel to its canonical main node.
-	canon := make([]nodeid, h.label)
-	for i := range canon {
-		canon[i] = nodeid(h.N) // indicates "unset"
-	}
-
-	// mapping maps each main node index to the index of the canonical node.
-	mapping := make([]nodeid, len(h.a.nodes))
-
-	for id := range h.a.nodes {
-		id := nodeid(id)
-		if id == 0 {
-			canon[0] = 0
-			mapping[0] = 0
-			continue
-		}
-		oid := h.find(onodeid(id))
-		peLabels := &h.onodes[oid].peLabels
-		assert(peLabels.Len() == 1, "PE class is not a singleton")
-		label := peLabel(peLabels.Min())
-
-		canonId := canon[label]
-		if canonId == nodeid(h.N) {
-			// id becomes the representative of the PE label.
-			canonId = id
-			canon[label] = canonId
-
-			if h.a.log != nil {
-				fmt.Fprintf(h.a.log, "\tpts(n%d) is canonical : \t(%s)\n",
-					id, h.a.nodes[id].typ)
-			}
-
-		} else {
-			// Link the solver states for the two nodes.
-			assert(h.a.nodes[canonId].solve != nil, "missing solver state")
-			h.a.nodes[id].solve = h.a.nodes[canonId].solve
-
-			if h.a.log != nil {
-				// TODO(adonovan): debug: reorganize the log so it prints
-				// one line:
-				// 	pe y = x1, ..., xn
-				// for each canonical y.  Requires allocation.
-				fmt.Fprintf(h.a.log, "\tpts(n%d) = pts(n%d) : %s\n",
-					id, canonId, h.a.nodes[id].typ)
-			}
-		}
-
-		mapping[id] = canonId
-	}
-
-	// Renumber the constraints, eliminate duplicates, and eliminate
-	// any containing non-pointers (n0).
-	addrs := make(map[addrConstraint]bool)
-	copys := make(map[copyConstraint]bool)
-	loads := make(map[loadConstraint]bool)
-	stores := make(map[storeConstraint]bool)
-	offsetAddrs := make(map[offsetAddrConstraint]bool)
-	untags := make(map[untagConstraint]bool)
-	typeFilters := make(map[typeFilterConstraint]bool)
-	invokes := make(map[invokeConstraint]bool)
-
-	nbefore := len(h.a.constraints)
-	cc := h.a.constraints[:0] // in-situ compaction
-	for _, c := range h.a.constraints {
-		// Renumber.
-		switch c := c.(type) {
-		case *addrConstraint:
-			// Don't renumber c.src since it is the label of
-			// an addressable object and will appear in PT sets.
-			c.dst = mapping[c.dst]
-		default:
-			c.renumber(mapping)
-		}
-
-		if c.ptr() == 0 {
-			continue // skip: constraint attached to non-pointer
-		}
-
-		var dup bool
-		switch c := c.(type) {
-		case *addrConstraint:
-			_, dup = addrs[*c]
-			addrs[*c] = true
-
-		case *copyConstraint:
-			if c.src == c.dst {
-				continue // skip degenerate copies
-			}
-			if c.src == 0 {
-				continue // skip copy from non-pointer
-			}
-			_, dup = copys[*c]
-			copys[*c] = true
-
-		case *loadConstraint:
-			if c.src == 0 {
-				continue // skip load from non-pointer
-			}
-			_, dup = loads[*c]
-			loads[*c] = true
-
-		case *storeConstraint:
-			if c.src == 0 {
-				continue // skip store from non-pointer
-			}
-			_, dup = stores[*c]
-			stores[*c] = true
-
-		case *offsetAddrConstraint:
-			if c.src == 0 {
-				continue // skip offset from non-pointer
-			}
-			_, dup = offsetAddrs[*c]
-			offsetAddrs[*c] = true
-
-		case *untagConstraint:
-			if c.src == 0 {
-				continue // skip untag of non-pointer
-			}
-			_, dup = untags[*c]
-			untags[*c] = true
-
-		case *typeFilterConstraint:
-			if c.src == 0 {
-				continue // skip filter of non-pointer
-			}
-			_, dup = typeFilters[*c]
-			typeFilters[*c] = true
-
-		case *invokeConstraint:
-			if c.params == 0 {
-				panic("non-pointer invoke.params")
-			}
-			if c.iface == 0 {
-				continue // skip invoke on non-pointer
-			}
-			_, dup = invokes[*c]
-			invokes[*c] = true
-
-		default:
-			// We don't bother de-duping advanced constraints
-			// (e.g. reflection) since they are uncommon.
-
-			// Eliminate constraints containing non-pointer nodeids.
-			//
-			// We use reflection to find the fields to avoid
-			// adding yet another method to constraint.
-			//
-			// TODO(adonovan): experiment with a constraint
-			// method that returns a slice of pointers to
-			// nodeids fields to enable uniform iteration;
-			// the renumber() method could be removed and
-			// implemented using the new one.
-			//
-			// TODO(adonovan): opt: this is unsound since
-			// some constraints still have an effect if one
-			// of the operands is zero: rVCall, rVMapIndex,
-			// rvSetMapIndex.  Handle them specially.
-			rtNodeid := reflect.TypeOf(nodeid(0))
-			x := reflect.ValueOf(c).Elem()
-			for i, nf := 0, x.NumField(); i < nf; i++ {
-				f := x.Field(i)
-				if f.Type() == rtNodeid {
-					if f.Uint() == 0 {
-						dup = true // skip it
-						break
-					}
-				}
-			}
-		}
-		if dup {
-			continue // skip duplicates
-		}
-
-		cc = append(cc, c)
-	}
-	h.a.constraints = cc
-
-	if h.log != nil {
-		fmt.Fprintf(h.log, "#constraints: was %d, now %d\n", nbefore, len(h.a.constraints))
-	}
-}
-
-// find returns the canonical onodeid for x.
-// (The onodes form a disjoint set forest.)
-func (h *hvn) find(x onodeid) onodeid {
-	// TODO(adonovan): opt: this is a CPU hotspot.  Try "union by rank".
-	xo := h.onodes[x]
-	rep := xo.rep
-	if rep != x {
-		rep = h.find(rep) // simple path compression
-		xo.rep = rep
-	}
-	return rep
-}
-
-func (h *hvn) checkCanonical(x onodeid) {
-	if debugHVN {
-		assert(x == h.find(x), "not canonical")
-	}
-}
-
-func assert(p bool, msg string) {
-	if debugHVN && !p {
-		panic("assertion failed: " + msg)
-	}
-}
diff --git a/third_party/gotools/go/pointer/intrinsics.go b/third_party/gotools/go/pointer/intrinsics.go
deleted file mode 100644
index 5f60e68..0000000
--- a/third_party/gotools/go/pointer/intrinsics.go
+++ /dev/null
@@ -1,380 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This package defines the treatment of intrinsics, i.e. library
-// functions requiring special analytical treatment.
-//
-// Most of these are C or assembly functions, but even some Go
-// functions require may special treatment if the analysis completely
-// replaces the implementation of an API such as reflection.
-
-// TODO(adonovan): support a means of writing analytic summaries in
-// the target code, so that users can summarise the effects of their
-// own C functions using a snippet of Go.
-
-import (
-	"fmt"
-
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// Instances of 'intrinsic' generate analysis constraints for calls to
-// intrinsic functions.
-// Implementations may exploit information from the calling site
-// via cgn.callersite; for shared contours this is nil.
-type intrinsic func(a *analysis, cgn *cgnode)
-
-// Initialized in explicit init() to defeat (spurious) initialization
-// cycle error.
-var intrinsicsByName = make(map[string]intrinsic)
-
-func init() {
-	// Key strings are from Function.String().
-	// That little dot ۰ is an Arabic zero numeral (U+06F0),
-	// categories [Nd].
-	for name, fn := range map[string]intrinsic{
-		// Other packages.
-		"bytes.Equal":                           ext۰NoEffect,
-		"bytes.IndexByte":                       ext۰NoEffect,
-		"crypto/aes.decryptBlockAsm":            ext۰NoEffect,
-		"crypto/aes.encryptBlockAsm":            ext۰NoEffect,
-		"crypto/aes.expandKeyAsm":               ext۰NoEffect,
-		"crypto/aes.hasAsm":                     ext۰NoEffect,
-		"crypto/md5.block":                      ext۰NoEffect,
-		"crypto/rc4.xorKeyStream":               ext۰NoEffect,
-		"crypto/sha1.block":                     ext۰NoEffect,
-		"crypto/sha256.block":                   ext۰NoEffect,
-		"hash/crc32.castagnoliSSE42":            ext۰NoEffect,
-		"hash/crc32.haveSSE42":                  ext۰NoEffect,
-		"math.Abs":                              ext۰NoEffect,
-		"math.Acos":                             ext۰NoEffect,
-		"math.Asin":                             ext۰NoEffect,
-		"math.Atan":                             ext۰NoEffect,
-		"math.Atan2":                            ext۰NoEffect,
-		"math.Ceil":                             ext۰NoEffect,
-		"math.Cos":                              ext۰NoEffect,
-		"math.Dim":                              ext۰NoEffect,
-		"math.Exp":                              ext۰NoEffect,
-		"math.Exp2":                             ext۰NoEffect,
-		"math.Expm1":                            ext۰NoEffect,
-		"math.Float32bits":                      ext۰NoEffect,
-		"math.Float32frombits":                  ext۰NoEffect,
-		"math.Float64bits":                      ext۰NoEffect,
-		"math.Float64frombits":                  ext۰NoEffect,
-		"math.Floor":                            ext۰NoEffect,
-		"math.Frexp":                            ext۰NoEffect,
-		"math.Hypot":                            ext۰NoEffect,
-		"math.Ldexp":                            ext۰NoEffect,
-		"math.Log":                              ext۰NoEffect,
-		"math.Log10":                            ext۰NoEffect,
-		"math.Log1p":                            ext۰NoEffect,
-		"math.Log2":                             ext۰NoEffect,
-		"math.Max":                              ext۰NoEffect,
-		"math.Min":                              ext۰NoEffect,
-		"math.Mod":                              ext۰NoEffect,
-		"math.Modf":                             ext۰NoEffect,
-		"math.Remainder":                        ext۰NoEffect,
-		"math.Sin":                              ext۰NoEffect,
-		"math.Sincos":                           ext۰NoEffect,
-		"math.Sqrt":                             ext۰NoEffect,
-		"math.Tan":                              ext۰NoEffect,
-		"math.Trunc":                            ext۰NoEffect,
-		"math/big.addMulVVW":                    ext۰NoEffect,
-		"math/big.addVV":                        ext۰NoEffect,
-		"math/big.addVW":                        ext۰NoEffect,
-		"math/big.bitLen":                       ext۰NoEffect,
-		"math/big.divWVW":                       ext۰NoEffect,
-		"math/big.divWW":                        ext۰NoEffect,
-		"math/big.mulAddVWW":                    ext۰NoEffect,
-		"math/big.mulWW":                        ext۰NoEffect,
-		"math/big.shlVU":                        ext۰NoEffect,
-		"math/big.shrVU":                        ext۰NoEffect,
-		"math/big.subVV":                        ext۰NoEffect,
-		"math/big.subVW":                        ext۰NoEffect,
-		"net.runtime_Semacquire":                ext۰NoEffect,
-		"net.runtime_Semrelease":                ext۰NoEffect,
-		"net.runtime_pollClose":                 ext۰NoEffect,
-		"net.runtime_pollOpen":                  ext۰NoEffect,
-		"net.runtime_pollReset":                 ext۰NoEffect,
-		"net.runtime_pollServerInit":            ext۰NoEffect,
-		"net.runtime_pollSetDeadline":           ext۰NoEffect,
-		"net.runtime_pollUnblock":               ext۰NoEffect,
-		"net.runtime_pollWait":                  ext۰NoEffect,
-		"net.runtime_pollWaitCanceled":          ext۰NoEffect,
-		"os.epipecheck":                         ext۰NoEffect,
-		"runtime.BlockProfile":                  ext۰NoEffect,
-		"runtime.Breakpoint":                    ext۰NoEffect,
-		"runtime.CPUProfile":                    ext۰NoEffect, // good enough
-		"runtime.Caller":                        ext۰NoEffect,
-		"runtime.Callers":                       ext۰NoEffect, // good enough
-		"runtime.FuncForPC":                     ext۰NoEffect,
-		"runtime.GC":                            ext۰NoEffect,
-		"runtime.GOMAXPROCS":                    ext۰NoEffect,
-		"runtime.Goexit":                        ext۰NoEffect,
-		"runtime.GoroutineProfile":              ext۰NoEffect,
-		"runtime.Gosched":                       ext۰NoEffect,
-		"runtime.MemProfile":                    ext۰NoEffect,
-		"runtime.NumCPU":                        ext۰NoEffect,
-		"runtime.NumGoroutine":                  ext۰NoEffect,
-		"runtime.ReadMemStats":                  ext۰NoEffect,
-		"runtime.SetBlockProfileRate":           ext۰NoEffect,
-		"runtime.SetCPUProfileRate":             ext۰NoEffect,
-		"runtime.SetFinalizer":                  ext۰runtime۰SetFinalizer,
-		"runtime.Stack":                         ext۰NoEffect,
-		"runtime.ThreadCreateProfile":           ext۰NoEffect,
-		"runtime.cstringToGo":                   ext۰NoEffect,
-		"runtime.funcentry_go":                  ext۰NoEffect,
-		"runtime.funcline_go":                   ext۰NoEffect,
-		"runtime.funcname_go":                   ext۰NoEffect,
-		"runtime.getgoroot":                     ext۰NoEffect,
-		"runtime/pprof.runtime_cyclesPerSecond": ext۰NoEffect,
-		"strings.IndexByte":                     ext۰NoEffect,
-		"sync.runtime_Semacquire":               ext۰NoEffect,
-		"sync.runtime_Semrelease":               ext۰NoEffect,
-		"sync.runtime_Syncsemacquire":           ext۰NoEffect,
-		"sync.runtime_Syncsemcheck":             ext۰NoEffect,
-		"sync.runtime_Syncsemrelease":           ext۰NoEffect,
-		"sync.runtime_procPin":                  ext۰NoEffect,
-		"sync.runtime_procUnpin":                ext۰NoEffect,
-		"sync.runtime_registerPool":             ext۰NoEffect,
-		"sync/atomic.AddInt32":                  ext۰NoEffect,
-		"sync/atomic.AddInt64":                  ext۰NoEffect,
-		"sync/atomic.AddUint32":                 ext۰NoEffect,
-		"sync/atomic.AddUint64":                 ext۰NoEffect,
-		"sync/atomic.AddUintptr":                ext۰NoEffect,
-		"sync/atomic.CompareAndSwapInt32":       ext۰NoEffect,
-		"sync/atomic.CompareAndSwapUint32":      ext۰NoEffect,
-		"sync/atomic.CompareAndSwapUint64":      ext۰NoEffect,
-		"sync/atomic.CompareAndSwapUintptr":     ext۰NoEffect,
-		"sync/atomic.LoadInt32":                 ext۰NoEffect,
-		"sync/atomic.LoadInt64":                 ext۰NoEffect,
-		"sync/atomic.LoadPointer":               ext۰NoEffect, // ignore unsafe.Pointers
-		"sync/atomic.LoadUint32":                ext۰NoEffect,
-		"sync/atomic.LoadUint64":                ext۰NoEffect,
-		"sync/atomic.LoadUintptr":               ext۰NoEffect,
-		"sync/atomic.StoreInt32":                ext۰NoEffect,
-		"sync/atomic.StorePointer":              ext۰NoEffect, // ignore unsafe.Pointers
-		"sync/atomic.StoreUint32":               ext۰NoEffect,
-		"sync/atomic.StoreUintptr":              ext۰NoEffect,
-		"syscall.Close":                         ext۰NoEffect,
-		"syscall.Exit":                          ext۰NoEffect,
-		"syscall.Getpid":                        ext۰NoEffect,
-		"syscall.Getwd":                         ext۰NoEffect,
-		"syscall.Kill":                          ext۰NoEffect,
-		"syscall.RawSyscall":                    ext۰NoEffect,
-		"syscall.RawSyscall6":                   ext۰NoEffect,
-		"syscall.Syscall":                       ext۰NoEffect,
-		"syscall.Syscall6":                      ext۰NoEffect,
-		"syscall.runtime_AfterFork":             ext۰NoEffect,
-		"syscall.runtime_BeforeFork":            ext۰NoEffect,
-		"syscall.setenv_c":                      ext۰NoEffect,
-		"time.Sleep":                            ext۰NoEffect,
-		"time.now":                              ext۰NoEffect,
-		"time.startTimer":                       ext۰time۰startTimer,
-		"time.stopTimer":                        ext۰NoEffect,
-	} {
-		intrinsicsByName[name] = fn
-	}
-}
-
-// findIntrinsic returns the constraint generation function for an
-// intrinsic function fn, or nil if the function should be handled normally.
-//
-func (a *analysis) findIntrinsic(fn *ssa.Function) intrinsic {
-	// Consult the *Function-keyed cache.
-	// A cached nil indicates a normal non-intrinsic function.
-	impl, ok := a.intrinsics[fn]
-	if !ok {
-		impl = intrinsicsByName[fn.String()] // may be nil
-
-		if a.isReflect(fn) {
-			if !a.config.Reflection {
-				impl = ext۰NoEffect // reflection disabled
-			} else if impl == nil {
-				// Ensure all "reflect" code is treated intrinsically.
-				impl = ext۰NotYetImplemented
-			}
-		}
-
-		a.intrinsics[fn] = impl
-	}
-	return impl
-}
-
-// isReflect reports whether fn belongs to the "reflect" package.
-func (a *analysis) isReflect(fn *ssa.Function) bool {
-	if a.reflectValueObj == nil {
-		return false // "reflect" package not loaded
-	}
-	reflectPackage := a.reflectValueObj.Pkg()
-	if fn.Pkg != nil && fn.Pkg.Object == reflectPackage {
-		return true
-	}
-	// Synthetic wrappers have a nil Pkg, so they slip through the
-	// previous check.  Check the receiver package.
-	// TODO(adonovan): should synthetic wrappers have a non-nil Pkg?
-	if recv := fn.Signature.Recv(); recv != nil {
-		if named, ok := deref(recv.Type()).(*types.Named); ok {
-			if named.Obj().Pkg() == reflectPackage {
-				return true // e.g. wrapper of (reflect.Value).f
-			}
-		}
-	}
-	return false
-}
-
-// A trivial intrinsic suitable for any function that does not:
-// 1) induce aliases between its arguments or any global variables;
-// 2) call any functions; or
-// 3) create any labels.
-//
-// Many intrinsics (such as CompareAndSwapInt32) have a fourth kind of
-// effect: loading or storing through a pointer.  Though these could
-// be significant, we deliberately ignore them because they are
-// generally not worth the effort.
-//
-// We sometimes violate condition #3 if the function creates only
-// non-function labels, as the control-flow graph is still sound.
-//
-func ext۰NoEffect(a *analysis, cgn *cgnode) {}
-
-func ext۰NotYetImplemented(a *analysis, cgn *cgnode) {
-	fn := cgn.fn
-	a.warnf(fn.Pos(), "unsound: intrinsic treatment of %s not yet implemented", fn)
-}
-
-// ---------- func runtime.SetFinalizer(x, f interface{}) ----------
-
-// runtime.SetFinalizer(x, f)
-type runtimeSetFinalizerConstraint struct {
-	targets nodeid // (indirect)
-	f       nodeid // (ptr)
-	x       nodeid
-}
-
-func (c *runtimeSetFinalizerConstraint) ptr() nodeid { return c.f }
-func (c *runtimeSetFinalizerConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.targets), "SetFinalizer.targets")
-}
-func (c *runtimeSetFinalizerConstraint) renumber(mapping []nodeid) {
-	c.targets = mapping[c.targets]
-	c.f = mapping[c.f]
-	c.x = mapping[c.x]
-}
-
-func (c *runtimeSetFinalizerConstraint) String() string {
-	return fmt.Sprintf("runtime.SetFinalizer(n%d, n%d)", c.x, c.f)
-}
-
-func (c *runtimeSetFinalizerConstraint) solve(a *analysis, delta *nodeset) {
-	for _, fObj := range delta.AppendTo(a.deltaSpace) {
-		tDyn, f, indirect := a.taggedValue(nodeid(fObj))
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		tSig, ok := tDyn.Underlying().(*types.Signature)
-		if !ok {
-			continue // not a function
-		}
-		if tSig.Recv() != nil {
-			panic(tSig)
-		}
-		if tSig.Params().Len() != 1 {
-			continue //  not a unary function
-		}
-
-		// Extract x to tmp.
-		tx := tSig.Params().At(0).Type()
-		tmp := a.addNodes(tx, "SetFinalizer.tmp")
-		a.typeAssert(tx, tmp, c.x, false)
-
-		// Call f(tmp).
-		a.store(f, tmp, 1, a.sizeof(tx))
-
-		// Add dynamic call target.
-		if a.onlineCopy(c.targets, f) {
-			a.addWork(c.targets)
-		}
-	}
-}
-
-func ext۰runtime۰SetFinalizer(a *analysis, cgn *cgnode) {
-	// This is the shared contour, used for dynamic calls.
-	targets := a.addOneNode(tInvalid, "SetFinalizer.targets", nil)
-	cgn.sites = append(cgn.sites, &callsite{targets: targets})
-	params := a.funcParams(cgn.obj)
-	a.addConstraint(&runtimeSetFinalizerConstraint{
-		targets: targets,
-		x:       params,
-		f:       params + 1,
-	})
-}
-
-// ---------- func time.startTimer(t *runtimeTimer) ----------
-
-// time.StartTimer(t)
-type timeStartTimerConstraint struct {
-	targets nodeid // (indirect)
-	t       nodeid // (ptr)
-}
-
-func (c *timeStartTimerConstraint) ptr() nodeid { return c.t }
-func (c *timeStartTimerConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.targets), "StartTimer.targets")
-}
-func (c *timeStartTimerConstraint) renumber(mapping []nodeid) {
-	c.targets = mapping[c.targets]
-	c.t = mapping[c.t]
-}
-
-func (c *timeStartTimerConstraint) String() string {
-	return fmt.Sprintf("time.startTimer(n%d)", c.t)
-}
-
-func (c *timeStartTimerConstraint) solve(a *analysis, delta *nodeset) {
-	for _, tObj := range delta.AppendTo(a.deltaSpace) {
-		t := nodeid(tObj)
-
-		// We model startTimer as if it was defined thus:
-		// 	func startTimer(t *runtimeTimer) { t.f(t.arg) }
-
-		// We hard-code the field offsets of time.runtimeTimer:
-		// type runtimeTimer struct {
-		//  0     __identity__
-		//  1    i      int32
-		//  2    when   int64
-		//  3    period int64
-		//  4    f      func(int64, interface{})
-		//  5    arg    interface{}
-		// }
-		f := t + 4
-		arg := t + 5
-
-		// store t.arg to t.f.params[0]
-		// (offset 1 => skip identity)
-		a.store(f, arg, 1, 1)
-
-		// Add dynamic call target.
-		if a.onlineCopy(c.targets, f) {
-			a.addWork(c.targets)
-		}
-	}
-}
-
-func ext۰time۰startTimer(a *analysis, cgn *cgnode) {
-	// This is the shared contour, used for dynamic calls.
-	targets := a.addOneNode(tInvalid, "startTimer.targets", nil)
-	cgn.sites = append(cgn.sites, &callsite{targets: targets})
-	params := a.funcParams(cgn.obj)
-	a.addConstraint(&timeStartTimerConstraint{
-		targets: targets,
-		t:       params,
-	})
-}
diff --git a/third_party/gotools/go/pointer/labels.go b/third_party/gotools/go/pointer/labels.go
deleted file mode 100644
index 3c8c9a8..0000000
--- a/third_party/gotools/go/pointer/labels.go
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import (
-	"fmt"
-	"go/token"
-	"strings"
-
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// A Label is an entity that may be pointed to by a pointer, map,
-// channel, 'func', slice or interface.
-//
-// Labels include:
-//      - functions
-//      - globals
-//      - tagged objects, representing interfaces and reflect.Values
-//      - arrays created by conversions (e.g. []byte("foo"), []byte(s))
-//      - stack- and heap-allocated variables (including composite literals)
-//      - channels, maps and arrays created by make()
-//      - intrinsic or reflective operations that allocate (e.g. append, reflect.New)
-//      - intrinsic objects, e.g. the initial array behind os.Args.
-//      - and their subelements, e.g. "alloc.y[*].z"
-//
-// Labels are so varied that they defy good generalizations;
-// some have no value, no callgraph node, or no position.
-// Many objects have types that are inexpressible in Go:
-// maps, channels, functions, tagged objects.
-//
-// At most one of Value() or ReflectType() may return non-nil.
-//
-type Label struct {
-	obj        *object    // the addressable memory location containing this label
-	subelement *fieldInfo // subelement path within obj, e.g. ".a.b[*].c"
-}
-
-// Value returns the ssa.Value that allocated this label's object, if any.
-func (l Label) Value() ssa.Value {
-	val, _ := l.obj.data.(ssa.Value)
-	return val
-}
-
-// ReflectType returns the type represented by this label if it is an
-// reflect.rtype instance object or *reflect.rtype-tagged object.
-//
-func (l Label) ReflectType() types.Type {
-	rtype, _ := l.obj.data.(types.Type)
-	return rtype
-}
-
-// Path returns the path to the subelement of the object containing
-// this label.  For example, ".x[*].y".
-//
-func (l Label) Path() string {
-	return l.subelement.path()
-}
-
-// Pos returns the position of this label, if known, zero otherwise.
-func (l Label) Pos() token.Pos {
-	switch data := l.obj.data.(type) {
-	case ssa.Value:
-		return data.Pos()
-	case types.Type:
-		if nt, ok := deref(data).(*types.Named); ok {
-			return nt.Obj().Pos()
-		}
-	}
-	if cgn := l.obj.cgn; cgn != nil {
-		return cgn.fn.Pos()
-	}
-	return token.NoPos
-}
-
-// String returns the printed form of this label.
-//
-// Examples:                                    Object type:
-//      x                                       (a variable)
-//      (sync.Mutex).Lock                       (a function)
-//      convert                                 (array created by conversion)
-//      makemap                                 (map allocated via make)
-//      makechan                                (channel allocated via make)
-//      makeinterface                           (tagged object allocated by makeinterface)
-//      <alloc in reflect.Zero>                 (allocation in instrinsic)
-//      sync.Mutex                              (a reflect.rtype instance)
-//      <command-line arguments>                (an intrinsic object)
-//
-// Labels within compound objects have subelement paths:
-//      x.y[*].z                                (a struct variable, x)
-//      append.y[*].z                           (array allocated by append)
-//      makeslice.y[*].z                        (array allocated via make)
-//
-// TODO(adonovan): expose func LabelString(*types.Package, Label).
-//
-func (l Label) String() string {
-	var s string
-	switch v := l.obj.data.(type) {
-	case types.Type:
-		return v.String()
-
-	case string:
-		s = v // an intrinsic object (e.g. os.Args[*])
-
-	case nil:
-		if l.obj.cgn != nil {
-			// allocation by intrinsic or reflective operation
-			s = fmt.Sprintf("<alloc in %s>", l.obj.cgn.fn)
-		} else {
-			s = "<unknown>" // should be unreachable
-		}
-
-	case *ssa.Function:
-		s = v.String()
-
-	case *ssa.Global:
-		s = v.String()
-
-	case *ssa.Const:
-		s = v.Name()
-
-	case *ssa.Alloc:
-		s = v.Comment
-		if s == "" {
-			s = "alloc"
-		}
-
-	case *ssa.Call:
-		// Currently only calls to append can allocate objects.
-		if v.Call.Value.(*ssa.Builtin).Object().Name() != "append" {
-			panic("unhandled *ssa.Call label: " + v.Name())
-		}
-		s = "append"
-
-	case *ssa.MakeMap, *ssa.MakeChan, *ssa.MakeSlice, *ssa.Convert:
-		s = strings.ToLower(strings.TrimPrefix(fmt.Sprintf("%T", v), "*ssa."))
-
-	case *ssa.MakeInterface:
-		// MakeInterface is usually implicit in Go source (so
-		// Pos()==0), and tagged objects may be allocated
-		// synthetically (so no *MakeInterface data).
-		s = "makeinterface:" + v.X.Type().String()
-
-	default:
-		panic(fmt.Sprintf("unhandled object data type: %T", v))
-	}
-
-	return s + l.subelement.path()
-}
diff --git a/third_party/gotools/go/pointer/opt.go b/third_party/gotools/go/pointer/opt.go
deleted file mode 100644
index 2620cc0..0000000
--- a/third_party/gotools/go/pointer/opt.go
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file implements renumbering, a pre-solver optimization to
-// improve the efficiency of the solver's points-to set representation.
-//
-// TODO(adonovan): rename file "renumber.go"
-
-import "fmt"
-
-// renumber permutes a.nodes so that all nodes within an addressable
-// object appear before all non-addressable nodes, maintaining the
-// order of nodes within the same object (as required by offsetAddr).
-//
-// renumber must update every nodeid in the analysis (constraints,
-// Pointers, callgraph, etc) to reflect the new ordering.
-//
-// This is an optimisation to increase the locality and efficiency of
-// sparse representations of points-to sets.  (Typically only about
-// 20% of nodes are within an object.)
-//
-// NB: nodes added during solving (e.g. for reflection, SetFinalizer)
-// will be appended to the end.
-//
-// Renumbering makes the PTA log inscrutable.  To aid debugging, later
-// phases (e.g. HVN) must not rely on it having occurred.
-//
-func (a *analysis) renumber() {
-	if a.log != nil {
-		fmt.Fprintf(a.log, "\n\n==== Renumbering\n\n")
-	}
-
-	N := nodeid(len(a.nodes))
-	newNodes := make([]*node, N, N)
-	renumbering := make([]nodeid, N, N) // maps old to new
-
-	var i, j nodeid
-
-	// The zero node is special.
-	newNodes[j] = a.nodes[i]
-	renumbering[i] = j
-	i++
-	j++
-
-	// Pass 1: object nodes.
-	for i < N {
-		obj := a.nodes[i].obj
-		if obj == nil {
-			i++
-			continue
-		}
-
-		end := i + nodeid(obj.size)
-		for i < end {
-			newNodes[j] = a.nodes[i]
-			renumbering[i] = j
-			i++
-			j++
-		}
-	}
-	nobj := j
-
-	// Pass 2: non-object nodes.
-	for i = 1; i < N; {
-		obj := a.nodes[i].obj
-		if obj != nil {
-			i += nodeid(obj.size)
-			continue
-		}
-
-		newNodes[j] = a.nodes[i]
-		renumbering[i] = j
-		i++
-		j++
-	}
-
-	if j != N {
-		panic(fmt.Sprintf("internal error: j=%d, N=%d", j, N))
-	}
-
-	// Log the remapping table.
-	if a.log != nil {
-		fmt.Fprintf(a.log, "Renumbering nodes to improve density:\n")
-		fmt.Fprintf(a.log, "(%d object nodes of %d total)\n", nobj, N)
-		for old, new := range renumbering {
-			fmt.Fprintf(a.log, "\tn%d -> n%d\n", old, new)
-		}
-	}
-
-	// Now renumber all existing nodeids to use the new node permutation.
-	// It is critical that all reachable nodeids are accounted for!
-
-	// Renumber nodeids in queried Pointers.
-	for v, ptr := range a.result.Queries {
-		ptr.n = renumbering[ptr.n]
-		a.result.Queries[v] = ptr
-	}
-	for v, ptr := range a.result.IndirectQueries {
-		ptr.n = renumbering[ptr.n]
-		a.result.IndirectQueries[v] = ptr
-	}
-
-	// Renumber nodeids in global objects.
-	for v, id := range a.globalobj {
-		a.globalobj[v] = renumbering[id]
-	}
-
-	// Renumber nodeids in constraints.
-	for _, c := range a.constraints {
-		c.renumber(renumbering)
-	}
-
-	// Renumber nodeids in the call graph.
-	for _, cgn := range a.cgnodes {
-		cgn.obj = renumbering[cgn.obj]
-		for _, site := range cgn.sites {
-			site.targets = renumbering[site.targets]
-		}
-	}
-
-	a.nodes = newNodes
-}
diff --git a/third_party/gotools/go/pointer/pointer_test.go b/third_party/gotools/go/pointer/pointer_test.go
deleted file mode 100644
index a0a04f7..0000000
--- a/third_party/gotools/go/pointer/pointer_test.go
+++ /dev/null
@@ -1,581 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer_test
-
-// This test uses 'expectation' comments embedded within testdata/*.go
-// files to specify the expected pointer analysis behaviour.
-// See below for grammar.
-
-import (
-	"bytes"
-	"errors"
-	"fmt"
-	"go/parser"
-	"go/token"
-	"io/ioutil"
-	"os"
-	"regexp"
-	"strconv"
-	"strings"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/callgraph"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/pointer"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/ssa/ssautil"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-)
-
-var inputs = []string{
-	"testdata/a_test.go",
-	"testdata/another.go",
-	"testdata/arrayreflect.go",
-	"testdata/arrays.go",
-	"testdata/channels.go",
-	"testdata/chanreflect.go",
-	"testdata/context.go",
-	"testdata/conv.go",
-	"testdata/finalizer.go",
-	"testdata/flow.go",
-	"testdata/fmtexcerpt.go",
-	"testdata/func.go",
-	"testdata/funcreflect.go",
-	"testdata/hello.go", // NB: causes spurious failure of HVN cross-check
-	"testdata/interfaces.go",
-	"testdata/issue9002.go",
-	"testdata/mapreflect.go",
-	"testdata/maps.go",
-	"testdata/panic.go",
-	"testdata/recur.go",
-	"testdata/reflect.go",
-	"testdata/rtti.go",
-	"testdata/structreflect.go",
-	"testdata/structs.go",
-	"testdata/timer.go",
-}
-
-// Expectation grammar:
-//
-// @calls f -> g
-//
-//   A 'calls' expectation asserts that edge (f, g) appears in the
-//   callgraph.  f and g are notated as per Function.String(), which
-//   may contain spaces (e.g. promoted method in anon struct).
-//
-// @pointsto a | b | c
-//
-//   A 'pointsto' expectation asserts that the points-to set of its
-//   operand contains exactly the set of labels {a,b,c} notated as per
-//   labelString.
-//
-//   A 'pointsto' expectation must appear on the same line as a
-//   print(x) statement; the expectation's operand is x.
-//
-//   If one of the strings is "...", the expectation asserts that the
-//   points-to set at least the other labels.
-//
-//   We use '|' because label names may contain spaces, e.g.  methods
-//   of anonymous structs.
-//
-//   From a theoretical perspective, concrete types in interfaces are
-//   labels too, but they are represented differently and so have a
-//   different expectation, @types, below.
-//
-// @types t | u | v
-//
-//   A 'types' expectation asserts that the set of possible dynamic
-//   types of its interface operand is exactly {t,u,v}, notated per
-//   go/types.Type.String(). In other words, it asserts that the type
-//   component of the interface may point to that set of concrete type
-//   literals.  It also works for reflect.Value, though the types
-//   needn't be concrete in that case.
-//
-//   A 'types' expectation must appear on the same line as a
-//   print(x) statement; the expectation's operand is x.
-//
-//   If one of the strings is "...", the expectation asserts that the
-//   interface's type may point to at least the other types.
-//
-//   We use '|' because type names may contain spaces.
-//
-// @warning "regexp"
-//
-//   A 'warning' expectation asserts that the analysis issues a
-//   warning that matches the regular expression within the string
-//   literal.
-//
-// @line id
-//
-//   A line directive associates the name "id" with the current
-//   file:line.  The string form of labels will use this id instead of
-//   a file:line, making @pointsto expectations more robust against
-//   perturbations in the source file.
-//   (NB, anon functions still include line numbers.)
-//
-type expectation struct {
-	kind     string // "pointsto" | "types" | "calls" | "warning"
-	filename string
-	linenum  int // source line number, 1-based
-	args     []string
-	types    []types.Type // for types
-}
-
-func (e *expectation) String() string {
-	return fmt.Sprintf("@%s[%s]", e.kind, strings.Join(e.args, " | "))
-}
-
-func (e *expectation) errorf(format string, args ...interface{}) {
-	fmt.Printf("%s:%d: ", e.filename, e.linenum)
-	fmt.Printf(format, args...)
-	fmt.Println()
-}
-
-func (e *expectation) needsProbe() bool {
-	return e.kind == "pointsto" || e.kind == "types"
-}
-
-// Find probe (call to print(x)) of same source file/line as expectation.
-func findProbe(prog *ssa.Program, probes map[*ssa.CallCommon]bool, queries map[ssa.Value]pointer.Pointer, e *expectation) (site *ssa.CallCommon, pts pointer.PointsToSet) {
-	for call := range probes {
-		pos := prog.Fset.Position(call.Pos())
-		if pos.Line == e.linenum && pos.Filename == e.filename {
-			// TODO(adonovan): send this to test log (display only on failure).
-			// fmt.Printf("%s:%d: info: found probe for %s: %s\n",
-			// 	e.filename, e.linenum, e, p.arg0) // debugging
-			return call, queries[call.Args[0]].PointsTo()
-		}
-	}
-	return // e.g. analysis didn't reach this call
-}
-
-func doOneInput(input, filename string) bool {
-	var conf loader.Config
-
-	// Parsing.
-	f, err := conf.ParseFile(filename, input)
-	if err != nil {
-		fmt.Println(err)
-		return false
-	}
-
-	// Create single-file main package and import its dependencies.
-	conf.CreateFromFiles("main", f)
-	iprog, err := conf.Load()
-	if err != nil {
-		fmt.Println(err)
-		return false
-	}
-	mainPkgInfo := iprog.Created[0].Pkg
-
-	// SSA creation + building.
-	prog := ssa.Create(iprog, ssa.SanityCheckFunctions)
-	prog.BuildAll()
-
-	mainpkg := prog.Package(mainPkgInfo)
-	ptrmain := mainpkg // main package for the pointer analysis
-	if mainpkg.Func("main") == nil {
-		// No main function; assume it's a test.
-		ptrmain = prog.CreateTestMainPackage(mainpkg)
-	}
-
-	// Find all calls to the built-in print(x).  Analytically,
-	// print is a no-op, but it's a convenient hook for testing
-	// the PTS of an expression, so our tests use it.
-	probes := make(map[*ssa.CallCommon]bool)
-	for fn := range ssautil.AllFunctions(prog) {
-		if fn.Pkg == mainpkg {
-			for _, b := range fn.Blocks {
-				for _, instr := range b.Instrs {
-					if instr, ok := instr.(ssa.CallInstruction); ok {
-						call := instr.Common()
-						if b, ok := call.Value.(*ssa.Builtin); ok && b.Name() == "print" && len(call.Args) == 1 {
-							probes[instr.Common()] = true
-						}
-					}
-				}
-			}
-		}
-	}
-
-	ok := true
-
-	lineMapping := make(map[string]string) // maps "file:line" to @line tag
-
-	// Parse expectations in this input.
-	var exps []*expectation
-	re := regexp.MustCompile("// *@([a-z]*) *(.*)$")
-	lines := strings.Split(input, "\n")
-	for linenum, line := range lines {
-		linenum++ // make it 1-based
-		if matches := re.FindAllStringSubmatch(line, -1); matches != nil {
-			match := matches[0]
-			kind, rest := match[1], match[2]
-			e := &expectation{kind: kind, filename: filename, linenum: linenum}
-
-			if kind == "line" {
-				if rest == "" {
-					ok = false
-					e.errorf("@%s expectation requires identifier", kind)
-				} else {
-					lineMapping[fmt.Sprintf("%s:%d", filename, linenum)] = rest
-				}
-				continue
-			}
-
-			if e.needsProbe() && !strings.Contains(line, "print(") {
-				ok = false
-				e.errorf("@%s expectation must follow call to print(x)", kind)
-				continue
-			}
-
-			switch kind {
-			case "pointsto":
-				e.args = split(rest, "|")
-
-			case "types":
-				for _, typstr := range split(rest, "|") {
-					var t types.Type = types.Typ[types.Invalid] // means "..."
-					if typstr != "..." {
-						texpr, err := parser.ParseExpr(typstr)
-						if err != nil {
-							ok = false
-							// Don't print err since its location is bad.
-							e.errorf("'%s' is not a valid type", typstr)
-							continue
-						}
-						mainFileScope := mainpkg.Object.Scope().Child(0)
-						tv, err := types.EvalNode(prog.Fset, texpr, mainpkg.Object, mainFileScope)
-						if err != nil {
-							ok = false
-							// Don't print err since its location is bad.
-							e.errorf("'%s' is not a valid type: %s", typstr, err)
-							continue
-						}
-						t = tv.Type
-					}
-					e.types = append(e.types, t)
-				}
-
-			case "calls":
-				e.args = split(rest, "->")
-				// TODO(adonovan): eagerly reject the
-				// expectation if fn doesn't denote
-				// existing function, rather than fail
-				// the expectation after analysis.
-				if len(e.args) != 2 {
-					ok = false
-					e.errorf("@calls expectation wants 'caller -> callee' arguments")
-					continue
-				}
-
-			case "warning":
-				lit, err := strconv.Unquote(strings.TrimSpace(rest))
-				if err != nil {
-					ok = false
-					e.errorf("couldn't parse @warning operand: %s", err.Error())
-					continue
-				}
-				e.args = append(e.args, lit)
-
-			default:
-				ok = false
-				e.errorf("unknown expectation kind: %s", e)
-				continue
-			}
-			exps = append(exps, e)
-		}
-	}
-
-	var log bytes.Buffer
-	fmt.Fprintf(&log, "Input: %s\n", filename)
-
-	// Run the analysis.
-	config := &pointer.Config{
-		Reflection:     true,
-		BuildCallGraph: true,
-		Mains:          []*ssa.Package{ptrmain},
-		Log:            &log,
-	}
-	for probe := range probes {
-		v := probe.Args[0]
-		if pointer.CanPoint(v.Type()) {
-			config.AddQuery(v)
-		}
-	}
-
-	// Print the log is there was an error or a panic.
-	complete := false
-	defer func() {
-		if !complete || !ok {
-			log.WriteTo(os.Stderr)
-		}
-	}()
-
-	result, err := pointer.Analyze(config)
-	if err != nil {
-		panic(err) // internal error in pointer analysis
-	}
-
-	// Check the expectations.
-	for _, e := range exps {
-		var call *ssa.CallCommon
-		var pts pointer.PointsToSet
-		var tProbe types.Type
-		if e.needsProbe() {
-			if call, pts = findProbe(prog, probes, result.Queries, e); call == nil {
-				ok = false
-				e.errorf("unreachable print() statement has expectation %s", e)
-				continue
-			}
-			tProbe = call.Args[0].Type()
-			if !pointer.CanPoint(tProbe) {
-				ok = false
-				e.errorf("expectation on non-pointerlike operand: %s", tProbe)
-				continue
-			}
-		}
-
-		switch e.kind {
-		case "pointsto":
-			if !checkPointsToExpectation(e, pts, lineMapping, prog) {
-				ok = false
-			}
-
-		case "types":
-			if !checkTypesExpectation(e, pts, tProbe) {
-				ok = false
-			}
-
-		case "calls":
-			if !checkCallsExpectation(prog, e, result.CallGraph) {
-				ok = false
-			}
-
-		case "warning":
-			if !checkWarningExpectation(prog, e, result.Warnings) {
-				ok = false
-			}
-		}
-	}
-
-	complete = true
-
-	// ok = false // debugging: uncomment to always see log
-
-	return ok
-}
-
-func labelString(l *pointer.Label, lineMapping map[string]string, prog *ssa.Program) string {
-	// Functions and Globals need no pos suffix,
-	// nor do allocations in intrinsic operations
-	// (for which we'll print the function name).
-	switch l.Value().(type) {
-	case nil, *ssa.Function, *ssa.Global:
-		return l.String()
-	}
-
-	str := l.String()
-	if pos := l.Pos(); pos != token.NoPos {
-		// Append the position, using a @line tag instead of a line number, if defined.
-		posn := prog.Fset.Position(pos)
-		s := fmt.Sprintf("%s:%d", posn.Filename, posn.Line)
-		if tag, ok := lineMapping[s]; ok {
-			return fmt.Sprintf("%s@%s:%d", str, tag, posn.Column)
-		}
-		str = fmt.Sprintf("%s@%s", str, posn)
-	}
-	return str
-}
-
-func checkPointsToExpectation(e *expectation, pts pointer.PointsToSet, lineMapping map[string]string, prog *ssa.Program) bool {
-	expected := make(map[string]int)
-	surplus := make(map[string]int)
-	exact := true
-	for _, g := range e.args {
-		if g == "..." {
-			exact = false
-			continue
-		}
-		expected[g]++
-	}
-	// Find the set of labels that the probe's
-	// argument (x in print(x)) may point to.
-	for _, label := range pts.Labels() {
-		name := labelString(label, lineMapping, prog)
-		if expected[name] > 0 {
-			expected[name]--
-		} else if exact {
-			surplus[name]++
-		}
-	}
-	// Report multiset difference:
-	ok := true
-	for _, count := range expected {
-		if count > 0 {
-			ok = false
-			e.errorf("value does not alias these expected labels: %s", join(expected))
-			break
-		}
-	}
-	for _, count := range surplus {
-		if count > 0 {
-			ok = false
-			e.errorf("value may additionally alias these labels: %s", join(surplus))
-			break
-		}
-	}
-	return ok
-}
-
-func checkTypesExpectation(e *expectation, pts pointer.PointsToSet, typ types.Type) bool {
-	var expected typeutil.Map
-	var surplus typeutil.Map
-	exact := true
-	for _, g := range e.types {
-		if g == types.Typ[types.Invalid] {
-			exact = false
-			continue
-		}
-		expected.Set(g, struct{}{})
-	}
-
-	if !pointer.CanHaveDynamicTypes(typ) {
-		e.errorf("@types expectation requires an interface- or reflect.Value-typed operand, got %s", typ)
-		return false
-	}
-
-	// Find the set of types that the probe's
-	// argument (x in print(x)) may contain.
-	for _, T := range pts.DynamicTypes().Keys() {
-		if expected.At(T) != nil {
-			expected.Delete(T)
-		} else if exact {
-			surplus.Set(T, struct{}{})
-		}
-	}
-	// Report set difference:
-	ok := true
-	if expected.Len() > 0 {
-		ok = false
-		e.errorf("interface cannot contain these types: %s", expected.KeysString())
-	}
-	if surplus.Len() > 0 {
-		ok = false
-		e.errorf("interface may additionally contain these types: %s", surplus.KeysString())
-	}
-	return ok
-}
-
-var errOK = errors.New("OK")
-
-func checkCallsExpectation(prog *ssa.Program, e *expectation, cg *callgraph.Graph) bool {
-	found := make(map[string]int)
-	err := callgraph.GraphVisitEdges(cg, func(edge *callgraph.Edge) error {
-		// Name-based matching is inefficient but it allows us to
-		// match functions whose names that would not appear in an
-		// index ("<root>") or which are not unique ("func@1.2").
-		if edge.Caller.Func.String() == e.args[0] {
-			calleeStr := edge.Callee.Func.String()
-			if calleeStr == e.args[1] {
-				return errOK // expectation satisified; stop the search
-			}
-			found[calleeStr]++
-		}
-		return nil
-	})
-	if err == errOK {
-		return true
-	}
-	if len(found) == 0 {
-		e.errorf("didn't find any calls from %s", e.args[0])
-	}
-	e.errorf("found no call from %s to %s, but only to %s",
-		e.args[0], e.args[1], join(found))
-	return false
-}
-
-func checkWarningExpectation(prog *ssa.Program, e *expectation, warnings []pointer.Warning) bool {
-	// TODO(adonovan): check the position part of the warning too?
-	re, err := regexp.Compile(e.args[0])
-	if err != nil {
-		e.errorf("invalid regular expression in @warning expectation: %s", err.Error())
-		return false
-	}
-
-	if len(warnings) == 0 {
-		e.errorf("@warning %s expectation, but no warnings", strconv.Quote(e.args[0]))
-		return false
-	}
-
-	for _, w := range warnings {
-		if re.MatchString(w.Message) {
-			return true
-		}
-	}
-
-	e.errorf("@warning %s expectation not satised; found these warnings though:", strconv.Quote(e.args[0]))
-	for _, w := range warnings {
-		fmt.Printf("%s: warning: %s\n", prog.Fset.Position(w.Pos), w.Message)
-	}
-	return false
-}
-
-func TestInput(t *testing.T) {
-	ok := true
-
-	wd, err := os.Getwd()
-	if err != nil {
-		t.Errorf("os.Getwd: %s", err)
-		return
-	}
-
-	// 'go test' does a chdir so that relative paths in
-	// diagnostics no longer make sense relative to the invoking
-	// shell's cwd.  We print a special marker so that Emacs can
-	// make sense of them.
-	fmt.Fprintf(os.Stderr, "Entering directory `%s'\n", wd)
-
-	for _, filename := range inputs {
-		content, err := ioutil.ReadFile(filename)
-		if err != nil {
-			t.Errorf("couldn't read file '%s': %s", filename, err)
-			continue
-		}
-
-		if !doOneInput(string(content), filename) {
-			ok = false
-		}
-	}
-	if !ok {
-		t.Fail()
-	}
-}
-
-// join joins the elements of multiset with " | "s.
-func join(set map[string]int) string {
-	var buf bytes.Buffer
-	sep := ""
-	for name, count := range set {
-		for i := 0; i < count; i++ {
-			buf.WriteString(sep)
-			sep = " | "
-			buf.WriteString(name)
-		}
-	}
-	return buf.String()
-}
-
-// split returns the list of sep-delimited non-empty strings in s.
-func split(s, sep string) (r []string) {
-	for _, elem := range strings.Split(s, sep) {
-		elem = strings.TrimSpace(elem)
-		if elem != "" {
-			r = append(r, elem)
-		}
-	}
-	return
-}
diff --git a/third_party/gotools/go/pointer/print.go b/third_party/gotools/go/pointer/print.go
deleted file mode 100644
index 4f2f4c7..0000000
--- a/third_party/gotools/go/pointer/print.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import "fmt"
-
-func (c *addrConstraint) String() string {
-	return fmt.Sprintf("addr n%d <- {&n%d}", c.dst, c.src)
-}
-
-func (c *copyConstraint) String() string {
-	return fmt.Sprintf("copy n%d <- n%d", c.dst, c.src)
-}
-
-func (c *loadConstraint) String() string {
-	return fmt.Sprintf("load n%d <- n%d[%d]", c.dst, c.src, c.offset)
-}
-
-func (c *storeConstraint) String() string {
-	return fmt.Sprintf("store n%d[%d] <- n%d", c.dst, c.offset, c.src)
-}
-
-func (c *offsetAddrConstraint) String() string {
-	return fmt.Sprintf("offsetAddr n%d <- n%d.#%d", c.dst, c.src, c.offset)
-}
-
-func (c *typeFilterConstraint) String() string {
-	return fmt.Sprintf("typeFilter n%d <- n%d.(%s)", c.dst, c.src, c.typ)
-}
-
-func (c *untagConstraint) String() string {
-	return fmt.Sprintf("untag n%d <- n%d.(%s)", c.dst, c.src, c.typ)
-}
-
-func (c *invokeConstraint) String() string {
-	return fmt.Sprintf("invoke n%d.%s(n%d ...)", c.iface, c.method.Name(), c.params)
-}
-
-func (n nodeid) String() string {
-	return fmt.Sprintf("n%d", n)
-}
diff --git a/third_party/gotools/go/pointer/reflect.go b/third_party/gotools/go/pointer/reflect.go
deleted file mode 100644
index f4bc4d9..0000000
--- a/third_party/gotools/go/pointer/reflect.go
+++ /dev/null
@@ -1,1971 +0,0 @@
-package pointer
-
-// This file implements the generation and resolution rules for
-// constraints arising from the use of reflection in the target
-// program.  See doc.go for explanation of the representation.
-//
-// For consistency, the names of all parameters match those of the
-// actual functions in the "reflect" package.
-//
-// To avoid proliferation of equivalent labels, intrinsics should
-// memoize as much as possible, like TypeOf and Zero do for their
-// tagged objects.
-//
-// TODO(adonovan): this file is rather subtle.  Explain how we derive
-// the implementation of each reflect operator from its spec,
-// including the subtleties of reflect.flag{Addr,RO,Indir}.
-// [Hint: our implementation is as if reflect.flagIndir was always
-// true, i.e. reflect.Values are pointers to tagged objects, there is
-// no inline allocation optimization; and indirect tagged objects (not
-// yet implemented) correspond to reflect.Values with
-// reflect.flagAddr.]
-// A picture would help too.
-//
-// TODO(adonovan): try factoring up the common parts of the majority of
-// these constraints that are single input, single output.
-
-import (
-	"fmt"
-	"reflect"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-func init() {
-	for name, fn := range map[string]intrinsic{
-		// reflect.Value methods.
-		"(reflect.Value).Addr":            ext۰reflect۰Value۰Addr,
-		"(reflect.Value).Bool":            ext۰NoEffect,
-		"(reflect.Value).Bytes":           ext۰reflect۰Value۰Bytes,
-		"(reflect.Value).Call":            ext۰reflect۰Value۰Call,
-		"(reflect.Value).CallSlice":       ext۰reflect۰Value۰CallSlice,
-		"(reflect.Value).CanAddr":         ext۰NoEffect,
-		"(reflect.Value).CanInterface":    ext۰NoEffect,
-		"(reflect.Value).CanSet":          ext۰NoEffect,
-		"(reflect.Value).Cap":             ext۰NoEffect,
-		"(reflect.Value).Close":           ext۰NoEffect,
-		"(reflect.Value).Complex":         ext۰NoEffect,
-		"(reflect.Value).Convert":         ext۰reflect۰Value۰Convert,
-		"(reflect.Value).Elem":            ext۰reflect۰Value۰Elem,
-		"(reflect.Value).Field":           ext۰reflect۰Value۰Field,
-		"(reflect.Value).FieldByIndex":    ext۰reflect۰Value۰FieldByIndex,
-		"(reflect.Value).FieldByName":     ext۰reflect۰Value۰FieldByName,
-		"(reflect.Value).FieldByNameFunc": ext۰reflect۰Value۰FieldByNameFunc,
-		"(reflect.Value).Float":           ext۰NoEffect,
-		"(reflect.Value).Index":           ext۰reflect۰Value۰Index,
-		"(reflect.Value).Int":             ext۰NoEffect,
-		"(reflect.Value).Interface":       ext۰reflect۰Value۰Interface,
-		"(reflect.Value).InterfaceData":   ext۰NoEffect,
-		"(reflect.Value).IsNil":           ext۰NoEffect,
-		"(reflect.Value).IsValid":         ext۰NoEffect,
-		"(reflect.Value).Kind":            ext۰NoEffect,
-		"(reflect.Value).Len":             ext۰NoEffect,
-		"(reflect.Value).MapIndex":        ext۰reflect۰Value۰MapIndex,
-		"(reflect.Value).MapKeys":         ext۰reflect۰Value۰MapKeys,
-		"(reflect.Value).Method":          ext۰reflect۰Value۰Method,
-		"(reflect.Value).MethodByName":    ext۰reflect۰Value۰MethodByName,
-		"(reflect.Value).NumField":        ext۰NoEffect,
-		"(reflect.Value).NumMethod":       ext۰NoEffect,
-		"(reflect.Value).OverflowComplex": ext۰NoEffect,
-		"(reflect.Value).OverflowFloat":   ext۰NoEffect,
-		"(reflect.Value).OverflowInt":     ext۰NoEffect,
-		"(reflect.Value).OverflowUint":    ext۰NoEffect,
-		"(reflect.Value).Pointer":         ext۰NoEffect,
-		"(reflect.Value).Recv":            ext۰reflect۰Value۰Recv,
-		"(reflect.Value).Send":            ext۰reflect۰Value۰Send,
-		"(reflect.Value).Set":             ext۰reflect۰Value۰Set,
-		"(reflect.Value).SetBool":         ext۰NoEffect,
-		"(reflect.Value).SetBytes":        ext۰reflect۰Value۰SetBytes,
-		"(reflect.Value).SetComplex":      ext۰NoEffect,
-		"(reflect.Value).SetFloat":        ext۰NoEffect,
-		"(reflect.Value).SetInt":          ext۰NoEffect,
-		"(reflect.Value).SetLen":          ext۰NoEffect,
-		"(reflect.Value).SetMapIndex":     ext۰reflect۰Value۰SetMapIndex,
-		"(reflect.Value).SetPointer":      ext۰reflect۰Value۰SetPointer,
-		"(reflect.Value).SetString":       ext۰NoEffect,
-		"(reflect.Value).SetUint":         ext۰NoEffect,
-		"(reflect.Value).Slice":           ext۰reflect۰Value۰Slice,
-		"(reflect.Value).String":          ext۰NoEffect,
-		"(reflect.Value).TryRecv":         ext۰reflect۰Value۰Recv,
-		"(reflect.Value).TrySend":         ext۰reflect۰Value۰Send,
-		"(reflect.Value).Type":            ext۰NoEffect,
-		"(reflect.Value).Uint":            ext۰NoEffect,
-		"(reflect.Value).UnsafeAddr":      ext۰NoEffect,
-
-		// Standalone reflect.* functions.
-		"reflect.Append":      ext۰reflect۰Append,
-		"reflect.AppendSlice": ext۰reflect۰AppendSlice,
-		"reflect.Copy":        ext۰reflect۰Copy,
-		"reflect.ChanOf":      ext۰reflect۰ChanOf,
-		"reflect.DeepEqual":   ext۰NoEffect,
-		"reflect.Indirect":    ext۰reflect۰Indirect,
-		"reflect.MakeChan":    ext۰reflect۰MakeChan,
-		"reflect.MakeFunc":    ext۰reflect۰MakeFunc,
-		"reflect.MakeMap":     ext۰reflect۰MakeMap,
-		"reflect.MakeSlice":   ext۰reflect۰MakeSlice,
-		"reflect.MapOf":       ext۰reflect۰MapOf,
-		"reflect.New":         ext۰reflect۰New,
-		"reflect.NewAt":       ext۰reflect۰NewAt,
-		"reflect.PtrTo":       ext۰reflect۰PtrTo,
-		"reflect.Select":      ext۰reflect۰Select,
-		"reflect.SliceOf":     ext۰reflect۰SliceOf,
-		"reflect.TypeOf":      ext۰reflect۰TypeOf,
-		"reflect.ValueOf":     ext۰reflect۰ValueOf,
-		"reflect.Zero":        ext۰reflect۰Zero,
-		"reflect.init":        ext۰NoEffect,
-
-		// *reflect.rtype methods
-		"(*reflect.rtype).Align":           ext۰NoEffect,
-		"(*reflect.rtype).AssignableTo":    ext۰NoEffect,
-		"(*reflect.rtype).Bits":            ext۰NoEffect,
-		"(*reflect.rtype).ChanDir":         ext۰NoEffect,
-		"(*reflect.rtype).ConvertibleTo":   ext۰NoEffect,
-		"(*reflect.rtype).Elem":            ext۰reflect۰rtype۰Elem,
-		"(*reflect.rtype).Field":           ext۰reflect۰rtype۰Field,
-		"(*reflect.rtype).FieldAlign":      ext۰NoEffect,
-		"(*reflect.rtype).FieldByIndex":    ext۰reflect۰rtype۰FieldByIndex,
-		"(*reflect.rtype).FieldByName":     ext۰reflect۰rtype۰FieldByName,
-		"(*reflect.rtype).FieldByNameFunc": ext۰reflect۰rtype۰FieldByNameFunc,
-		"(*reflect.rtype).Implements":      ext۰NoEffect,
-		"(*reflect.rtype).In":              ext۰reflect۰rtype۰In,
-		"(*reflect.rtype).IsVariadic":      ext۰NoEffect,
-		"(*reflect.rtype).Key":             ext۰reflect۰rtype۰Key,
-		"(*reflect.rtype).Kind":            ext۰NoEffect,
-		"(*reflect.rtype).Len":             ext۰NoEffect,
-		"(*reflect.rtype).Method":          ext۰reflect۰rtype۰Method,
-		"(*reflect.rtype).MethodByName":    ext۰reflect۰rtype۰MethodByName,
-		"(*reflect.rtype).Name":            ext۰NoEffect,
-		"(*reflect.rtype).NumField":        ext۰NoEffect,
-		"(*reflect.rtype).NumIn":           ext۰NoEffect,
-		"(*reflect.rtype).NumMethod":       ext۰NoEffect,
-		"(*reflect.rtype).NumOut":          ext۰NoEffect,
-		"(*reflect.rtype).Out":             ext۰reflect۰rtype۰Out,
-		"(*reflect.rtype).PkgPath":         ext۰NoEffect,
-		"(*reflect.rtype).Size":            ext۰NoEffect,
-		"(*reflect.rtype).String":          ext۰NoEffect,
-	} {
-		intrinsicsByName[name] = fn
-	}
-}
-
-// -------------------- (reflect.Value) --------------------
-
-func ext۰reflect۰Value۰Addr(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Bytes() Value ----------
-
-// result = v.Bytes()
-type rVBytesConstraint struct {
-	v      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *rVBytesConstraint) ptr() nodeid { return c.v }
-func (c *rVBytesConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "rVBytes.result")
-}
-func (c *rVBytesConstraint) renumber(mapping []nodeid) {
-	c.v = mapping[c.v]
-	c.result = mapping[c.result]
-}
-
-func (c *rVBytesConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect n%d.Bytes()", c.result, c.v)
-}
-
-func (c *rVBytesConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		vObj := nodeid(x)
-		tDyn, slice, indirect := a.taggedValue(vObj)
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		tSlice, ok := tDyn.Underlying().(*types.Slice)
-		if ok && types.Identical(tSlice.Elem(), types.Typ[types.Uint8]) {
-			if a.onlineCopy(c.result, slice) {
-				changed = true
-			}
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰Value۰Bytes(a *analysis, cgn *cgnode) {
-	a.addConstraint(&rVBytesConstraint{
-		v:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// ---------- func (Value).Call(in []Value) []Value ----------
-
-// result = v.Call(in)
-type rVCallConstraint struct {
-	cgn       *cgnode
-	targets   nodeid // (indirect)
-	v         nodeid // (ptr)
-	arg       nodeid // = in[*]
-	result    nodeid // (indirect)
-	dotdotdot bool   // interpret last arg as a "..." slice
-}
-
-func (c *rVCallConstraint) ptr() nodeid { return c.v }
-func (c *rVCallConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.targets), "rVCall.targets")
-	h.markIndirect(onodeid(c.result), "rVCall.result")
-}
-func (c *rVCallConstraint) renumber(mapping []nodeid) {
-	c.targets = mapping[c.targets]
-	c.v = mapping[c.v]
-	c.arg = mapping[c.arg]
-	c.result = mapping[c.result]
-}
-
-func (c *rVCallConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect n%d.Call(n%d)", c.result, c.v, c.arg)
-}
-
-func (c *rVCallConstraint) solve(a *analysis, delta *nodeset) {
-	if c.targets == 0 {
-		panic("no targets")
-	}
-
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		vObj := nodeid(x)
-		tDyn, fn, indirect := a.taggedValue(vObj)
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		tSig, ok := tDyn.Underlying().(*types.Signature)
-		if !ok {
-			continue // not a function
-		}
-		if tSig.Recv() != nil {
-			panic(tSig) // TODO(adonovan): rethink when we implement Method()
-		}
-
-		// Add dynamic call target.
-		if a.onlineCopy(c.targets, fn) {
-			a.addWork(c.targets)
-			// TODO(adonovan): is 'else continue' a sound optimisation here?
-		}
-
-		// Allocate a P/R block.
-		tParams := tSig.Params()
-		tResults := tSig.Results()
-		params := a.addNodes(tParams, "rVCall.params")
-		results := a.addNodes(tResults, "rVCall.results")
-
-		// Make a dynamic call to 'fn'.
-		a.store(fn, params, 1, a.sizeof(tParams))
-		a.load(results, fn, 1+a.sizeof(tParams), a.sizeof(tResults))
-
-		// Populate P by type-asserting each actual arg (all merged in c.arg).
-		for i, n := 0, tParams.Len(); i < n; i++ {
-			T := tParams.At(i).Type()
-			a.typeAssert(T, params, c.arg, false)
-			params += nodeid(a.sizeof(T))
-		}
-
-		// Use R by tagging and copying each actual result to c.result.
-		for i, n := 0, tResults.Len(); i < n; i++ {
-			T := tResults.At(i).Type()
-			// Convert from an arbitrary type to a reflect.Value
-			// (like MakeInterface followed by reflect.ValueOf).
-			if isInterface(T) {
-				// (don't tag)
-				if a.onlineCopy(c.result, results) {
-					changed = true
-				}
-			} else {
-				obj := a.makeTagged(T, c.cgn, nil)
-				a.onlineCopyN(obj+1, results, a.sizeof(T))
-				if a.addLabel(c.result, obj) { // (true)
-					changed = true
-				}
-			}
-			results += nodeid(a.sizeof(T))
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-// Common code for direct (inlined) and indirect calls to (reflect.Value).Call.
-func reflectCallImpl(a *analysis, cgn *cgnode, site *callsite, recv, arg nodeid, dotdotdot bool) nodeid {
-	// Allocate []reflect.Value array for the result.
-	ret := a.nextNode()
-	a.addNodes(types.NewArray(a.reflectValueObj.Type(), 1), "rVCall.ret")
-	a.endObject(ret, cgn, nil)
-
-	// pts(targets) will be the set of possible call targets.
-	site.targets = a.addOneNode(tInvalid, "rvCall.targets", nil)
-
-	// All arguments are merged since they arrive in a slice.
-	argelts := a.addOneNode(a.reflectValueObj.Type(), "rVCall.args", nil)
-	a.load(argelts, arg, 1, 1) // slice elements
-
-	a.addConstraint(&rVCallConstraint{
-		cgn:       cgn,
-		targets:   site.targets,
-		v:         recv,
-		arg:       argelts,
-		result:    ret + 1, // results go into elements of ret
-		dotdotdot: dotdotdot,
-	})
-	return ret
-}
-
-func reflectCall(a *analysis, cgn *cgnode, dotdotdot bool) {
-	// This is the shared contour implementation of (reflect.Value).Call
-	// and CallSlice, as used by indirect calls (rare).
-	// Direct calls are inlined in gen.go, eliding the
-	// intermediate cgnode for Call.
-	site := new(callsite)
-	cgn.sites = append(cgn.sites, site)
-	recv := a.funcParams(cgn.obj)
-	arg := recv + 1
-	ret := reflectCallImpl(a, cgn, site, recv, arg, dotdotdot)
-	a.addressOf(cgn.fn.Signature.Results().At(0).Type(), a.funcResults(cgn.obj), ret)
-}
-
-func ext۰reflect۰Value۰Call(a *analysis, cgn *cgnode) {
-	reflectCall(a, cgn, false)
-}
-
-func ext۰reflect۰Value۰CallSlice(a *analysis, cgn *cgnode) {
-	// TODO(adonovan): implement.  Also, inline direct calls in gen.go too.
-	if false {
-		reflectCall(a, cgn, true)
-	}
-}
-
-func ext۰reflect۰Value۰Convert(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Elem() Value ----------
-
-// result = v.Elem()
-type rVElemConstraint struct {
-	cgn    *cgnode
-	v      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *rVElemConstraint) ptr() nodeid { return c.v }
-func (c *rVElemConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "rVElem.result")
-}
-func (c *rVElemConstraint) renumber(mapping []nodeid) {
-	c.v = mapping[c.v]
-	c.result = mapping[c.result]
-}
-
-func (c *rVElemConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect n%d.Elem()", c.result, c.v)
-}
-
-func (c *rVElemConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		vObj := nodeid(x)
-		tDyn, payload, indirect := a.taggedValue(vObj)
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		switch t := tDyn.Underlying().(type) {
-		case *types.Interface:
-			if a.onlineCopy(c.result, payload) {
-				changed = true
-			}
-
-		case *types.Pointer:
-			obj := a.makeTagged(t.Elem(), c.cgn, nil)
-			a.load(obj+1, payload, 0, a.sizeof(t.Elem()))
-			if a.addLabel(c.result, obj) {
-				changed = true
-			}
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰Value۰Elem(a *analysis, cgn *cgnode) {
-	a.addConstraint(&rVElemConstraint{
-		cgn:    cgn,
-		v:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-func ext۰reflect۰Value۰Field(a *analysis, cgn *cgnode)           {} // TODO(adonovan)
-func ext۰reflect۰Value۰FieldByIndex(a *analysis, cgn *cgnode)    {} // TODO(adonovan)
-func ext۰reflect۰Value۰FieldByName(a *analysis, cgn *cgnode)     {} // TODO(adonovan)
-func ext۰reflect۰Value۰FieldByNameFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Index() Value ----------
-
-// result = v.Index()
-type rVIndexConstraint struct {
-	cgn    *cgnode
-	v      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *rVIndexConstraint) ptr() nodeid { return c.v }
-func (c *rVIndexConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "rVIndex.result")
-}
-func (c *rVIndexConstraint) renumber(mapping []nodeid) {
-	c.v = mapping[c.v]
-	c.result = mapping[c.result]
-}
-
-func (c *rVIndexConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect n%d.Index()", c.result, c.v)
-}
-
-func (c *rVIndexConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		vObj := nodeid(x)
-		tDyn, payload, indirect := a.taggedValue(vObj)
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		var res nodeid
-		switch t := tDyn.Underlying().(type) {
-		case *types.Array:
-			res = a.makeTagged(t.Elem(), c.cgn, nil)
-			a.onlineCopyN(res+1, payload+1, a.sizeof(t.Elem()))
-
-		case *types.Slice:
-			res = a.makeTagged(t.Elem(), c.cgn, nil)
-			a.load(res+1, payload, 1, a.sizeof(t.Elem()))
-
-		case *types.Basic:
-			if t.Kind() == types.String {
-				res = a.makeTagged(types.Typ[types.Rune], c.cgn, nil)
-			}
-		}
-		if res != 0 && a.addLabel(c.result, res) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰Value۰Index(a *analysis, cgn *cgnode) {
-	a.addConstraint(&rVIndexConstraint{
-		cgn:    cgn,
-		v:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// ---------- func (Value).Interface() Value ----------
-
-// result = v.Interface()
-type rVInterfaceConstraint struct {
-	v      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *rVInterfaceConstraint) ptr() nodeid { return c.v }
-func (c *rVInterfaceConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "rVInterface.result")
-}
-func (c *rVInterfaceConstraint) renumber(mapping []nodeid) {
-	c.v = mapping[c.v]
-	c.result = mapping[c.result]
-}
-
-func (c *rVInterfaceConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect n%d.Interface()", c.result, c.v)
-}
-
-func (c *rVInterfaceConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		vObj := nodeid(x)
-		tDyn, payload, indirect := a.taggedValue(vObj)
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		if isInterface(tDyn) {
-			if a.onlineCopy(c.result, payload) {
-				a.addWork(c.result)
-			}
-		} else {
-			if a.addLabel(c.result, vObj) {
-				changed = true
-			}
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰Value۰Interface(a *analysis, cgn *cgnode) {
-	a.addConstraint(&rVInterfaceConstraint{
-		v:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// ---------- func (Value).MapIndex(Value) Value ----------
-
-// result = v.MapIndex(_)
-type rVMapIndexConstraint struct {
-	cgn    *cgnode
-	v      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *rVMapIndexConstraint) ptr() nodeid { return c.v }
-func (c *rVMapIndexConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "rVMapIndex.result")
-}
-func (c *rVMapIndexConstraint) renumber(mapping []nodeid) {
-	c.v = mapping[c.v]
-	c.result = mapping[c.result]
-}
-
-func (c *rVMapIndexConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect n%d.MapIndex(_)", c.result, c.v)
-}
-
-func (c *rVMapIndexConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		vObj := nodeid(x)
-		tDyn, m, indirect := a.taggedValue(vObj)
-		tMap, _ := tDyn.Underlying().(*types.Map)
-		if tMap == nil {
-			continue // not a map
-		}
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		obj := a.makeTagged(tMap.Elem(), c.cgn, nil)
-		a.load(obj+1, m, a.sizeof(tMap.Key()), a.sizeof(tMap.Elem()))
-		if a.addLabel(c.result, obj) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰Value۰MapIndex(a *analysis, cgn *cgnode) {
-	a.addConstraint(&rVMapIndexConstraint{
-		cgn:    cgn,
-		v:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// ---------- func (Value).MapKeys() []Value ----------
-
-// result = v.MapKeys()
-type rVMapKeysConstraint struct {
-	cgn    *cgnode
-	v      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *rVMapKeysConstraint) ptr() nodeid { return c.v }
-func (c *rVMapKeysConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "rVMapKeys.result")
-}
-func (c *rVMapKeysConstraint) renumber(mapping []nodeid) {
-	c.v = mapping[c.v]
-	c.result = mapping[c.result]
-}
-
-func (c *rVMapKeysConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect n%d.MapKeys()", c.result, c.v)
-}
-
-func (c *rVMapKeysConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		vObj := nodeid(x)
-		tDyn, m, indirect := a.taggedValue(vObj)
-		tMap, _ := tDyn.Underlying().(*types.Map)
-		if tMap == nil {
-			continue // not a map
-		}
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		kObj := a.makeTagged(tMap.Key(), c.cgn, nil)
-		a.load(kObj+1, m, 0, a.sizeof(tMap.Key()))
-		if a.addLabel(c.result, kObj) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰Value۰MapKeys(a *analysis, cgn *cgnode) {
-	// Allocate an array for the result.
-	obj := a.nextNode()
-	T := types.NewSlice(a.reflectValueObj.Type())
-	a.addNodes(sliceToArray(T), "reflect.MapKeys result")
-	a.endObject(obj, cgn, nil)
-	a.addressOf(T, a.funcResults(cgn.obj), obj)
-
-	a.addConstraint(&rVMapKeysConstraint{
-		cgn:    cgn,
-		v:      a.funcParams(cgn.obj),
-		result: obj + 1, // result is stored in array elems
-	})
-}
-
-func ext۰reflect۰Value۰Method(a *analysis, cgn *cgnode)       {} // TODO(adonovan)
-func ext۰reflect۰Value۰MethodByName(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Recv(Value) Value ----------
-
-// result, _ = v.Recv()
-type rVRecvConstraint struct {
-	cgn    *cgnode
-	v      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *rVRecvConstraint) ptr() nodeid { return c.v }
-func (c *rVRecvConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "rVRecv.result")
-}
-func (c *rVRecvConstraint) renumber(mapping []nodeid) {
-	c.v = mapping[c.v]
-	c.result = mapping[c.result]
-}
-
-func (c *rVRecvConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect n%d.Recv()", c.result, c.v)
-}
-
-func (c *rVRecvConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		vObj := nodeid(x)
-		tDyn, ch, indirect := a.taggedValue(vObj)
-		tChan, _ := tDyn.Underlying().(*types.Chan)
-		if tChan == nil {
-			continue // not a channel
-		}
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		tElem := tChan.Elem()
-		elemObj := a.makeTagged(tElem, c.cgn, nil)
-		a.load(elemObj+1, ch, 0, a.sizeof(tElem))
-		if a.addLabel(c.result, elemObj) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰Value۰Recv(a *analysis, cgn *cgnode) {
-	a.addConstraint(&rVRecvConstraint{
-		cgn:    cgn,
-		v:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// ---------- func (Value).Send(Value) ----------
-
-// v.Send(x)
-type rVSendConstraint struct {
-	cgn *cgnode
-	v   nodeid // (ptr)
-	x   nodeid
-}
-
-func (c *rVSendConstraint) ptr() nodeid   { return c.v }
-func (c *rVSendConstraint) presolve(*hvn) {}
-func (c *rVSendConstraint) renumber(mapping []nodeid) {
-	c.v = mapping[c.v]
-	c.x = mapping[c.x]
-}
-
-func (c *rVSendConstraint) String() string {
-	return fmt.Sprintf("reflect n%d.Send(n%d)", c.v, c.x)
-}
-
-func (c *rVSendConstraint) solve(a *analysis, delta *nodeset) {
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		vObj := nodeid(x)
-		tDyn, ch, indirect := a.taggedValue(vObj)
-		tChan, _ := tDyn.Underlying().(*types.Chan)
-		if tChan == nil {
-			continue // not a channel
-		}
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		// Extract x's payload to xtmp, then store to channel.
-		tElem := tChan.Elem()
-		xtmp := a.addNodes(tElem, "Send.xtmp")
-		a.typeAssert(tElem, xtmp, c.x, false)
-		a.store(ch, xtmp, 0, a.sizeof(tElem))
-	}
-}
-
-func ext۰reflect۰Value۰Send(a *analysis, cgn *cgnode) {
-	params := a.funcParams(cgn.obj)
-	a.addConstraint(&rVSendConstraint{
-		cgn: cgn,
-		v:   params,
-		x:   params + 1,
-	})
-}
-
-func ext۰reflect۰Value۰Set(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).SetBytes(x []byte) ----------
-
-// v.SetBytes(x)
-type rVSetBytesConstraint struct {
-	cgn *cgnode
-	v   nodeid // (ptr)
-	x   nodeid
-}
-
-func (c *rVSetBytesConstraint) ptr() nodeid   { return c.v }
-func (c *rVSetBytesConstraint) presolve(*hvn) {}
-func (c *rVSetBytesConstraint) renumber(mapping []nodeid) {
-	c.v = mapping[c.v]
-	c.x = mapping[c.x]
-}
-
-func (c *rVSetBytesConstraint) String() string {
-	return fmt.Sprintf("reflect n%d.SetBytes(n%d)", c.v, c.x)
-}
-
-func (c *rVSetBytesConstraint) solve(a *analysis, delta *nodeset) {
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		vObj := nodeid(x)
-		tDyn, slice, indirect := a.taggedValue(vObj)
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		tSlice, ok := tDyn.Underlying().(*types.Slice)
-		if ok && types.Identical(tSlice.Elem(), types.Typ[types.Uint8]) {
-			if a.onlineCopy(slice, c.x) {
-				a.addWork(slice)
-			}
-		}
-	}
-}
-
-func ext۰reflect۰Value۰SetBytes(a *analysis, cgn *cgnode) {
-	params := a.funcParams(cgn.obj)
-	a.addConstraint(&rVSetBytesConstraint{
-		cgn: cgn,
-		v:   params,
-		x:   params + 1,
-	})
-}
-
-// ---------- func (Value).SetMapIndex(k Value, v Value) ----------
-
-// v.SetMapIndex(key, val)
-type rVSetMapIndexConstraint struct {
-	cgn *cgnode
-	v   nodeid // (ptr)
-	key nodeid
-	val nodeid
-}
-
-func (c *rVSetMapIndexConstraint) ptr() nodeid   { return c.v }
-func (c *rVSetMapIndexConstraint) presolve(*hvn) {}
-func (c *rVSetMapIndexConstraint) renumber(mapping []nodeid) {
-	c.v = mapping[c.v]
-	c.key = mapping[c.key]
-	c.val = mapping[c.val]
-}
-
-func (c *rVSetMapIndexConstraint) String() string {
-	return fmt.Sprintf("reflect n%d.SetMapIndex(n%d, n%d)", c.v, c.key, c.val)
-}
-
-func (c *rVSetMapIndexConstraint) solve(a *analysis, delta *nodeset) {
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		vObj := nodeid(x)
-		tDyn, m, indirect := a.taggedValue(vObj)
-		tMap, _ := tDyn.Underlying().(*types.Map)
-		if tMap == nil {
-			continue // not a map
-		}
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		keysize := a.sizeof(tMap.Key())
-
-		// Extract key's payload to keytmp, then store to map key.
-		keytmp := a.addNodes(tMap.Key(), "SetMapIndex.keytmp")
-		a.typeAssert(tMap.Key(), keytmp, c.key, false)
-		a.store(m, keytmp, 0, keysize)
-
-		// Extract val's payload to vtmp, then store to map value.
-		valtmp := a.addNodes(tMap.Elem(), "SetMapIndex.valtmp")
-		a.typeAssert(tMap.Elem(), valtmp, c.val, false)
-		a.store(m, valtmp, keysize, a.sizeof(tMap.Elem()))
-	}
-}
-
-func ext۰reflect۰Value۰SetMapIndex(a *analysis, cgn *cgnode) {
-	params := a.funcParams(cgn.obj)
-	a.addConstraint(&rVSetMapIndexConstraint{
-		cgn: cgn,
-		v:   params,
-		key: params + 1,
-		val: params + 2,
-	})
-}
-
-func ext۰reflect۰Value۰SetPointer(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (Value).Slice(v Value, i, j int) Value ----------
-
-// result = v.Slice(_, _)
-type rVSliceConstraint struct {
-	cgn    *cgnode
-	v      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *rVSliceConstraint) ptr() nodeid { return c.v }
-func (c *rVSliceConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "rVSlice.result")
-}
-func (c *rVSliceConstraint) renumber(mapping []nodeid) {
-	c.v = mapping[c.v]
-	c.result = mapping[c.result]
-}
-
-func (c *rVSliceConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect n%d.Slice(_, _)", c.result, c.v)
-}
-
-func (c *rVSliceConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		vObj := nodeid(x)
-		tDyn, payload, indirect := a.taggedValue(vObj)
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		var res nodeid
-		switch t := tDyn.Underlying().(type) {
-		case *types.Pointer:
-			if tArr, ok := t.Elem().Underlying().(*types.Array); ok {
-				// pointer to array
-				res = a.makeTagged(types.NewSlice(tArr.Elem()), c.cgn, nil)
-				if a.onlineCopy(res+1, payload) {
-					a.addWork(res + 1)
-				}
-			}
-
-		case *types.Array:
-			// TODO(adonovan): implement addressable
-			// arrays when we do indirect tagged objects.
-
-		case *types.Slice:
-			res = vObj
-
-		case *types.Basic:
-			if t == types.Typ[types.String] {
-				res = vObj
-			}
-		}
-
-		if res != 0 && a.addLabel(c.result, res) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰Value۰Slice(a *analysis, cgn *cgnode) {
-	a.addConstraint(&rVSliceConstraint{
-		cgn:    cgn,
-		v:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// -------------------- Standalone reflect functions --------------------
-
-func ext۰reflect۰Append(a *analysis, cgn *cgnode)      {} // TODO(adonovan)
-func ext۰reflect۰AppendSlice(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-func ext۰reflect۰Copy(a *analysis, cgn *cgnode)        {} // TODO(adonovan)
-
-// ---------- func ChanOf(ChanDir, Type) Type ----------
-
-// result = ChanOf(dir, t)
-type reflectChanOfConstraint struct {
-	cgn    *cgnode
-	t      nodeid // (ptr)
-	result nodeid // (indirect)
-	dirs   []types.ChanDir
-}
-
-func (c *reflectChanOfConstraint) ptr() nodeid { return c.t }
-func (c *reflectChanOfConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "reflectChanOf.result")
-}
-func (c *reflectChanOfConstraint) renumber(mapping []nodeid) {
-	c.t = mapping[c.t]
-	c.result = mapping[c.result]
-}
-
-func (c *reflectChanOfConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect.ChanOf(n%d)", c.result, c.t)
-}
-
-func (c *reflectChanOfConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		tObj := nodeid(x)
-		T := a.rtypeTaggedValue(tObj)
-
-		if typeTooHigh(T) {
-			continue
-		}
-
-		for _, dir := range c.dirs {
-			if a.addLabel(c.result, a.makeRtype(types.NewChan(dir, T))) {
-				changed = true
-			}
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-// dirMap maps reflect.ChanDir to the set of channel types generated by ChanOf.
-var dirMap = [...][]types.ChanDir{
-	0:               {types.SendOnly, types.RecvOnly, types.SendRecv}, // unknown
-	reflect.RecvDir: {types.RecvOnly},
-	reflect.SendDir: {types.SendOnly},
-	reflect.BothDir: {types.SendRecv},
-}
-
-func ext۰reflect۰ChanOf(a *analysis, cgn *cgnode) {
-	// If we have access to the callsite,
-	// and the channel argument is a constant (as is usual),
-	// only generate the requested direction.
-	var dir reflect.ChanDir // unknown
-	if site := cgn.callersite; site != nil {
-		if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok {
-			v, _ := exact.Int64Val(c.Value)
-			if 0 <= v && v <= int64(reflect.BothDir) {
-				dir = reflect.ChanDir(v)
-			}
-		}
-	}
-
-	params := a.funcParams(cgn.obj)
-	a.addConstraint(&reflectChanOfConstraint{
-		cgn:    cgn,
-		t:      params + 1,
-		result: a.funcResults(cgn.obj),
-		dirs:   dirMap[dir],
-	})
-}
-
-// ---------- func Indirect(v Value) Value ----------
-
-// result = Indirect(v)
-type reflectIndirectConstraint struct {
-	cgn    *cgnode
-	v      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *reflectIndirectConstraint) ptr() nodeid { return c.v }
-func (c *reflectIndirectConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "reflectIndirect.result")
-}
-func (c *reflectIndirectConstraint) renumber(mapping []nodeid) {
-	c.v = mapping[c.v]
-	c.result = mapping[c.result]
-}
-
-func (c *reflectIndirectConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect.Indirect(n%d)", c.result, c.v)
-}
-
-func (c *reflectIndirectConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		vObj := nodeid(x)
-		tDyn, _, _ := a.taggedValue(vObj)
-		var res nodeid
-		if tPtr, ok := tDyn.Underlying().(*types.Pointer); ok {
-			// load the payload of the pointer's tagged object
-			// into a new tagged object
-			res = a.makeTagged(tPtr.Elem(), c.cgn, nil)
-			a.load(res+1, vObj+1, 0, a.sizeof(tPtr.Elem()))
-		} else {
-			res = vObj
-		}
-
-		if a.addLabel(c.result, res) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰Indirect(a *analysis, cgn *cgnode) {
-	a.addConstraint(&reflectIndirectConstraint{
-		cgn:    cgn,
-		v:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// ---------- func MakeChan(Type) Value ----------
-
-// result = MakeChan(typ)
-type reflectMakeChanConstraint struct {
-	cgn    *cgnode
-	typ    nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *reflectMakeChanConstraint) ptr() nodeid { return c.typ }
-func (c *reflectMakeChanConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "reflectMakeChan.result")
-}
-func (c *reflectMakeChanConstraint) renumber(mapping []nodeid) {
-	c.typ = mapping[c.typ]
-	c.result = mapping[c.result]
-}
-
-func (c *reflectMakeChanConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect.MakeChan(n%d)", c.result, c.typ)
-}
-
-func (c *reflectMakeChanConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		typObj := nodeid(x)
-		T := a.rtypeTaggedValue(typObj)
-		tChan, ok := T.Underlying().(*types.Chan)
-		if !ok || tChan.Dir() != types.SendRecv {
-			continue // not a bidirectional channel type
-		}
-
-		obj := a.nextNode()
-		a.addNodes(tChan.Elem(), "reflect.MakeChan.value")
-		a.endObject(obj, c.cgn, nil)
-
-		// put its address in a new T-tagged object
-		id := a.makeTagged(T, c.cgn, nil)
-		a.addLabel(id+1, obj)
-
-		// flow the T-tagged object to the result
-		if a.addLabel(c.result, id) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰MakeChan(a *analysis, cgn *cgnode) {
-	a.addConstraint(&reflectMakeChanConstraint{
-		cgn:    cgn,
-		typ:    a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-func ext۰reflect۰MakeFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func MakeMap(Type) Value ----------
-
-// result = MakeMap(typ)
-type reflectMakeMapConstraint struct {
-	cgn    *cgnode
-	typ    nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *reflectMakeMapConstraint) ptr() nodeid { return c.typ }
-func (c *reflectMakeMapConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "reflectMakeMap.result")
-}
-func (c *reflectMakeMapConstraint) renumber(mapping []nodeid) {
-	c.typ = mapping[c.typ]
-	c.result = mapping[c.result]
-}
-
-func (c *reflectMakeMapConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect.MakeMap(n%d)", c.result, c.typ)
-}
-
-func (c *reflectMakeMapConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		typObj := nodeid(x)
-		T := a.rtypeTaggedValue(typObj)
-		tMap, ok := T.Underlying().(*types.Map)
-		if !ok {
-			continue // not a map type
-		}
-
-		mapObj := a.nextNode()
-		a.addNodes(tMap.Key(), "reflect.MakeMap.key")
-		a.addNodes(tMap.Elem(), "reflect.MakeMap.value")
-		a.endObject(mapObj, c.cgn, nil)
-
-		// put its address in a new T-tagged object
-		id := a.makeTagged(T, c.cgn, nil)
-		a.addLabel(id+1, mapObj)
-
-		// flow the T-tagged object to the result
-		if a.addLabel(c.result, id) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰MakeMap(a *analysis, cgn *cgnode) {
-	a.addConstraint(&reflectMakeMapConstraint{
-		cgn:    cgn,
-		typ:    a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// ---------- func MakeSlice(Type) Value ----------
-
-// result = MakeSlice(typ)
-type reflectMakeSliceConstraint struct {
-	cgn    *cgnode
-	typ    nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *reflectMakeSliceConstraint) ptr() nodeid { return c.typ }
-func (c *reflectMakeSliceConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "reflectMakeSlice.result")
-}
-func (c *reflectMakeSliceConstraint) renumber(mapping []nodeid) {
-	c.typ = mapping[c.typ]
-	c.result = mapping[c.result]
-}
-
-func (c *reflectMakeSliceConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect.MakeSlice(n%d)", c.result, c.typ)
-}
-
-func (c *reflectMakeSliceConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		typObj := nodeid(x)
-		T := a.rtypeTaggedValue(typObj)
-		if _, ok := T.Underlying().(*types.Slice); !ok {
-			continue // not a slice type
-		}
-
-		obj := a.nextNode()
-		a.addNodes(sliceToArray(T), "reflect.MakeSlice")
-		a.endObject(obj, c.cgn, nil)
-
-		// put its address in a new T-tagged object
-		id := a.makeTagged(T, c.cgn, nil)
-		a.addLabel(id+1, obj)
-
-		// flow the T-tagged object to the result
-		if a.addLabel(c.result, id) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰MakeSlice(a *analysis, cgn *cgnode) {
-	a.addConstraint(&reflectMakeSliceConstraint{
-		cgn:    cgn,
-		typ:    a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-func ext۰reflect۰MapOf(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func New(Type) Value ----------
-
-// result = New(typ)
-type reflectNewConstraint struct {
-	cgn    *cgnode
-	typ    nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *reflectNewConstraint) ptr() nodeid { return c.typ }
-func (c *reflectNewConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "reflectNew.result")
-}
-func (c *reflectNewConstraint) renumber(mapping []nodeid) {
-	c.typ = mapping[c.typ]
-	c.result = mapping[c.result]
-}
-
-func (c *reflectNewConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect.New(n%d)", c.result, c.typ)
-}
-
-func (c *reflectNewConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		typObj := nodeid(x)
-		T := a.rtypeTaggedValue(typObj)
-
-		// allocate new T object
-		newObj := a.nextNode()
-		a.addNodes(T, "reflect.New")
-		a.endObject(newObj, c.cgn, nil)
-
-		// put its address in a new *T-tagged object
-		id := a.makeTagged(types.NewPointer(T), c.cgn, nil)
-		a.addLabel(id+1, newObj)
-
-		// flow the pointer to the result
-		if a.addLabel(c.result, id) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰New(a *analysis, cgn *cgnode) {
-	a.addConstraint(&reflectNewConstraint{
-		cgn:    cgn,
-		typ:    a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-func ext۰reflect۰NewAt(a *analysis, cgn *cgnode) {
-	ext۰reflect۰New(a, cgn)
-
-	// TODO(adonovan): also report dynamic calls to unsound intrinsics.
-	if site := cgn.callersite; site != nil {
-		a.warnf(site.pos(), "unsound: %s contains a reflect.NewAt() call", site.instr.Parent())
-	}
-}
-
-// ---------- func PtrTo(Type) Type ----------
-
-// result = PtrTo(t)
-type reflectPtrToConstraint struct {
-	cgn    *cgnode
-	t      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *reflectPtrToConstraint) ptr() nodeid { return c.t }
-func (c *reflectPtrToConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "reflectPtrTo.result")
-}
-func (c *reflectPtrToConstraint) renumber(mapping []nodeid) {
-	c.t = mapping[c.t]
-	c.result = mapping[c.result]
-}
-
-func (c *reflectPtrToConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect.PtrTo(n%d)", c.result, c.t)
-}
-
-func (c *reflectPtrToConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		tObj := nodeid(x)
-		T := a.rtypeTaggedValue(tObj)
-
-		if typeTooHigh(T) {
-			continue
-		}
-
-		if a.addLabel(c.result, a.makeRtype(types.NewPointer(T))) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰PtrTo(a *analysis, cgn *cgnode) {
-	a.addConstraint(&reflectPtrToConstraint{
-		cgn:    cgn,
-		t:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-func ext۰reflect۰Select(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func SliceOf(Type) Type ----------
-
-// result = SliceOf(t)
-type reflectSliceOfConstraint struct {
-	cgn    *cgnode
-	t      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *reflectSliceOfConstraint) ptr() nodeid { return c.t }
-func (c *reflectSliceOfConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "reflectSliceOf.result")
-}
-func (c *reflectSliceOfConstraint) renumber(mapping []nodeid) {
-	c.t = mapping[c.t]
-	c.result = mapping[c.result]
-}
-
-func (c *reflectSliceOfConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect.SliceOf(n%d)", c.result, c.t)
-}
-
-func (c *reflectSliceOfConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		tObj := nodeid(x)
-		T := a.rtypeTaggedValue(tObj)
-
-		if typeTooHigh(T) {
-			continue
-		}
-
-		if a.addLabel(c.result, a.makeRtype(types.NewSlice(T))) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰SliceOf(a *analysis, cgn *cgnode) {
-	a.addConstraint(&reflectSliceOfConstraint{
-		cgn:    cgn,
-		t:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// ---------- func TypeOf(v Value) Type ----------
-
-// result = TypeOf(i)
-type reflectTypeOfConstraint struct {
-	cgn    *cgnode
-	i      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *reflectTypeOfConstraint) ptr() nodeid { return c.i }
-func (c *reflectTypeOfConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "reflectTypeOf.result")
-}
-func (c *reflectTypeOfConstraint) renumber(mapping []nodeid) {
-	c.i = mapping[c.i]
-	c.result = mapping[c.result]
-}
-
-func (c *reflectTypeOfConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect.TypeOf(n%d)", c.result, c.i)
-}
-
-func (c *reflectTypeOfConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		iObj := nodeid(x)
-		tDyn, _, _ := a.taggedValue(iObj)
-		if a.addLabel(c.result, a.makeRtype(tDyn)) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰TypeOf(a *analysis, cgn *cgnode) {
-	a.addConstraint(&reflectTypeOfConstraint{
-		cgn:    cgn,
-		i:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// ---------- func ValueOf(interface{}) Value ----------
-
-func ext۰reflect۰ValueOf(a *analysis, cgn *cgnode) {
-	// TODO(adonovan): when we start creating indirect tagged
-	// objects, we'll need to handle them specially here since
-	// they must never appear in the PTS of an interface{}.
-	a.copy(a.funcResults(cgn.obj), a.funcParams(cgn.obj), 1)
-}
-
-// ---------- func Zero(Type) Value ----------
-
-// result = Zero(typ)
-type reflectZeroConstraint struct {
-	cgn    *cgnode
-	typ    nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *reflectZeroConstraint) ptr() nodeid { return c.typ }
-func (c *reflectZeroConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "reflectZero.result")
-}
-func (c *reflectZeroConstraint) renumber(mapping []nodeid) {
-	c.typ = mapping[c.typ]
-	c.result = mapping[c.result]
-}
-
-func (c *reflectZeroConstraint) String() string {
-	return fmt.Sprintf("n%d = reflect.Zero(n%d)", c.result, c.typ)
-}
-
-func (c *reflectZeroConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		typObj := nodeid(x)
-		T := a.rtypeTaggedValue(typObj)
-
-		// TODO(adonovan): if T is an interface type, we need
-		// to create an indirect tagged object containing
-		// new(T).  To avoid updates of such shared values,
-		// we'll need another flag on indirect tagged objects
-		// that marks whether they are addressable or
-		// readonly, just like the reflect package does.
-
-		// memoize using a.reflectZeros[T]
-		var id nodeid
-		if z := a.reflectZeros.At(T); false && z != nil {
-			id = z.(nodeid)
-		} else {
-			id = a.makeTagged(T, c.cgn, nil)
-			a.reflectZeros.Set(T, id)
-		}
-		if a.addLabel(c.result, id) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰Zero(a *analysis, cgn *cgnode) {
-	a.addConstraint(&reflectZeroConstraint{
-		cgn:    cgn,
-		typ:    a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// -------------------- (*reflect.rtype) methods --------------------
-
-// ---------- func (*rtype) Elem() Type ----------
-
-// result = Elem(t)
-type rtypeElemConstraint struct {
-	cgn    *cgnode
-	t      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *rtypeElemConstraint) ptr() nodeid { return c.t }
-func (c *rtypeElemConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "rtypeElem.result")
-}
-func (c *rtypeElemConstraint) renumber(mapping []nodeid) {
-	c.t = mapping[c.t]
-	c.result = mapping[c.result]
-}
-
-func (c *rtypeElemConstraint) String() string {
-	return fmt.Sprintf("n%d = (*reflect.rtype).Elem(n%d)", c.result, c.t)
-}
-
-func (c *rtypeElemConstraint) solve(a *analysis, delta *nodeset) {
-	// Implemented by *types.{Map,Chan,Array,Slice,Pointer}.
-	type hasElem interface {
-		Elem() types.Type
-	}
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		tObj := nodeid(x)
-		T := a.nodes[tObj].obj.data.(types.Type)
-		if tHasElem, ok := T.Underlying().(hasElem); ok {
-			if a.addLabel(c.result, a.makeRtype(tHasElem.Elem())) {
-				changed = true
-			}
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰rtype۰Elem(a *analysis, cgn *cgnode) {
-	a.addConstraint(&rtypeElemConstraint{
-		cgn:    cgn,
-		t:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// ---------- func (*rtype) Field(int) StructField ----------
-// ---------- func (*rtype) FieldByName(string) (StructField, bool) ----------
-
-// result = FieldByName(t, name)
-// result = Field(t, _)
-type rtypeFieldByNameConstraint struct {
-	cgn    *cgnode
-	name   string // name of field; "" for unknown
-	t      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *rtypeFieldByNameConstraint) ptr() nodeid { return c.t }
-func (c *rtypeFieldByNameConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result+3), "rtypeFieldByName.result.Type")
-}
-func (c *rtypeFieldByNameConstraint) renumber(mapping []nodeid) {
-	c.t = mapping[c.t]
-	c.result = mapping[c.result]
-}
-
-func (c *rtypeFieldByNameConstraint) String() string {
-	return fmt.Sprintf("n%d = (*reflect.rtype).FieldByName(n%d, %q)", c.result, c.t, c.name)
-}
-
-func (c *rtypeFieldByNameConstraint) solve(a *analysis, delta *nodeset) {
-	// type StructField struct {
-	// 0	__identity__
-	// 1	Name      string
-	// 2	PkgPath   string
-	// 3	Type      Type
-	// 4	Tag       StructTag
-	// 5	Offset    uintptr
-	// 6	Index     []int
-	// 7	Anonymous bool
-	// }
-
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		tObj := nodeid(x)
-		T := a.nodes[tObj].obj.data.(types.Type)
-		tStruct, ok := T.Underlying().(*types.Struct)
-		if !ok {
-			continue // not a struct type
-		}
-
-		n := tStruct.NumFields()
-		for i := 0; i < n; i++ {
-			f := tStruct.Field(i)
-			if c.name == "" || c.name == f.Name() {
-
-				// a.offsetOf(Type) is 3.
-				if id := c.result + 3; a.addLabel(id, a.makeRtype(f.Type())) {
-					a.addWork(id)
-				}
-				// TODO(adonovan): StructField.Index should be non-nil.
-			}
-		}
-	}
-}
-
-func ext۰reflect۰rtype۰FieldByName(a *analysis, cgn *cgnode) {
-	// If we have access to the callsite,
-	// and the argument is a string constant,
-	// return only that field.
-	var name string
-	if site := cgn.callersite; site != nil {
-		if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok {
-			name = exact.StringVal(c.Value)
-		}
-	}
-
-	a.addConstraint(&rtypeFieldByNameConstraint{
-		cgn:    cgn,
-		name:   name,
-		t:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-func ext۰reflect۰rtype۰Field(a *analysis, cgn *cgnode) {
-	// No-one ever calls Field with a constant argument,
-	// so we don't specialize that case.
-	a.addConstraint(&rtypeFieldByNameConstraint{
-		cgn:    cgn,
-		t:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-func ext۰reflect۰rtype۰FieldByIndex(a *analysis, cgn *cgnode)    {} // TODO(adonovan)
-func ext۰reflect۰rtype۰FieldByNameFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan)
-
-// ---------- func (*rtype) In/Out(i int) Type ----------
-
-// result = In/Out(t, i)
-type rtypeInOutConstraint struct {
-	cgn    *cgnode
-	t      nodeid // (ptr)
-	result nodeid // (indirect)
-	out    bool
-	i      int // -ve if not a constant
-}
-
-func (c *rtypeInOutConstraint) ptr() nodeid { return c.t }
-func (c *rtypeInOutConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "rtypeInOut.result")
-}
-func (c *rtypeInOutConstraint) renumber(mapping []nodeid) {
-	c.t = mapping[c.t]
-	c.result = mapping[c.result]
-}
-
-func (c *rtypeInOutConstraint) String() string {
-	return fmt.Sprintf("n%d = (*reflect.rtype).InOut(n%d, %d)", c.result, c.t, c.i)
-}
-
-func (c *rtypeInOutConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		tObj := nodeid(x)
-		T := a.nodes[tObj].obj.data.(types.Type)
-		sig, ok := T.Underlying().(*types.Signature)
-		if !ok {
-			continue // not a func type
-		}
-
-		tuple := sig.Params()
-		if c.out {
-			tuple = sig.Results()
-		}
-		for i, n := 0, tuple.Len(); i < n; i++ {
-			if c.i < 0 || c.i == i {
-				if a.addLabel(c.result, a.makeRtype(tuple.At(i).Type())) {
-					changed = true
-				}
-			}
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰rtype۰InOut(a *analysis, cgn *cgnode, out bool) {
-	// If we have access to the callsite,
-	// and the argument is an int constant,
-	// return only that parameter.
-	index := -1
-	if site := cgn.callersite; site != nil {
-		if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok {
-			v, _ := exact.Int64Val(c.Value)
-			index = int(v)
-		}
-	}
-	a.addConstraint(&rtypeInOutConstraint{
-		cgn:    cgn,
-		t:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-		out:    out,
-		i:      index,
-	})
-}
-
-func ext۰reflect۰rtype۰In(a *analysis, cgn *cgnode) {
-	ext۰reflect۰rtype۰InOut(a, cgn, false)
-}
-
-func ext۰reflect۰rtype۰Out(a *analysis, cgn *cgnode) {
-	ext۰reflect۰rtype۰InOut(a, cgn, true)
-}
-
-// ---------- func (*rtype) Key() Type ----------
-
-// result = Key(t)
-type rtypeKeyConstraint struct {
-	cgn    *cgnode
-	t      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *rtypeKeyConstraint) ptr() nodeid { return c.t }
-func (c *rtypeKeyConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result), "rtypeKey.result")
-}
-func (c *rtypeKeyConstraint) renumber(mapping []nodeid) {
-	c.t = mapping[c.t]
-	c.result = mapping[c.result]
-}
-
-func (c *rtypeKeyConstraint) String() string {
-	return fmt.Sprintf("n%d = (*reflect.rtype).Key(n%d)", c.result, c.t)
-}
-
-func (c *rtypeKeyConstraint) solve(a *analysis, delta *nodeset) {
-	changed := false
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		tObj := nodeid(x)
-		T := a.nodes[tObj].obj.data.(types.Type)
-		if tMap, ok := T.Underlying().(*types.Map); ok {
-			if a.addLabel(c.result, a.makeRtype(tMap.Key())) {
-				changed = true
-			}
-		}
-	}
-	if changed {
-		a.addWork(c.result)
-	}
-}
-
-func ext۰reflect۰rtype۰Key(a *analysis, cgn *cgnode) {
-	a.addConstraint(&rtypeKeyConstraint{
-		cgn:    cgn,
-		t:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// ---------- func (*rtype) Method(int) (Method, bool) ----------
-// ---------- func (*rtype) MethodByName(string) (Method, bool) ----------
-
-// result = MethodByName(t, name)
-// result = Method(t, _)
-type rtypeMethodByNameConstraint struct {
-	cgn    *cgnode
-	name   string // name of method; "" for unknown
-	t      nodeid // (ptr)
-	result nodeid // (indirect)
-}
-
-func (c *rtypeMethodByNameConstraint) ptr() nodeid { return c.t }
-func (c *rtypeMethodByNameConstraint) presolve(h *hvn) {
-	h.markIndirect(onodeid(c.result+3), "rtypeMethodByName.result.Type")
-	h.markIndirect(onodeid(c.result+4), "rtypeMethodByName.result.Func")
-}
-func (c *rtypeMethodByNameConstraint) renumber(mapping []nodeid) {
-	c.t = mapping[c.t]
-	c.result = mapping[c.result]
-}
-
-func (c *rtypeMethodByNameConstraint) String() string {
-	return fmt.Sprintf("n%d = (*reflect.rtype).MethodByName(n%d, %q)", c.result, c.t, c.name)
-}
-
-// changeRecv returns sig with Recv prepended to Params().
-func changeRecv(sig *types.Signature) *types.Signature {
-	params := sig.Params()
-	n := params.Len()
-	p2 := make([]*types.Var, n+1)
-	p2[0] = sig.Recv()
-	for i := 0; i < n; i++ {
-		p2[i+1] = params.At(i)
-	}
-	return types.NewSignature(nil, nil, types.NewTuple(p2...), sig.Results(), sig.Variadic())
-}
-
-func (c *rtypeMethodByNameConstraint) solve(a *analysis, delta *nodeset) {
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		tObj := nodeid(x)
-		T := a.nodes[tObj].obj.data.(types.Type)
-
-		isIface := isInterface(T)
-
-		// We don't use Lookup(c.name) when c.name != "" to avoid
-		// ambiguity: >1 unexported methods could match.
-		mset := a.prog.MethodSets.MethodSet(T)
-		for i, n := 0, mset.Len(); i < n; i++ {
-			sel := mset.At(i)
-			if c.name == "" || c.name == sel.Obj().Name() {
-				// type Method struct {
-				// 0     __identity__
-				// 1	Name    string
-				// 2	PkgPath string
-				// 3	Type    Type
-				// 4	Func    Value
-				// 5	Index   int
-				// }
-
-				var sig *types.Signature
-				var fn *ssa.Function
-				if isIface {
-					sig = sel.Type().(*types.Signature)
-				} else {
-					fn = a.prog.Method(sel)
-					// move receiver to params[0]
-					sig = changeRecv(fn.Signature)
-				}
-
-				// a.offsetOf(Type) is 3.
-				if id := c.result + 3; a.addLabel(id, a.makeRtype(sig)) {
-					a.addWork(id)
-				}
-				if fn != nil {
-					// a.offsetOf(Func) is 4.
-					if id := c.result + 4; a.addLabel(id, a.objectNode(nil, fn)) {
-						a.addWork(id)
-					}
-				}
-			}
-		}
-	}
-}
-
-func ext۰reflect۰rtype۰MethodByName(a *analysis, cgn *cgnode) {
-	// If we have access to the callsite,
-	// and the argument is a string constant,
-	// return only that method.
-	var name string
-	if site := cgn.callersite; site != nil {
-		if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok {
-			name = exact.StringVal(c.Value)
-		}
-	}
-
-	a.addConstraint(&rtypeMethodByNameConstraint{
-		cgn:    cgn,
-		name:   name,
-		t:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-func ext۰reflect۰rtype۰Method(a *analysis, cgn *cgnode) {
-	// No-one ever calls Method with a constant argument,
-	// so we don't specialize that case.
-	a.addConstraint(&rtypeMethodByNameConstraint{
-		cgn:    cgn,
-		t:      a.funcParams(cgn.obj),
-		result: a.funcResults(cgn.obj),
-	})
-}
-
-// typeHeight returns the "height" of the type, which is roughly
-// speaking the number of chan, map, pointer and slice type constructors
-// at the root of T; these are the four type kinds that can be created
-// via reflection.  Chan and map constructors are counted as double the
-// height of slice and pointer constructors since they are less often
-// deeply nested.
-//
-// The solver rules for type constructors must somehow bound the set of
-// types they create to ensure termination of the algorithm in cases
-// where the output of a type constructor flows to its input, e.g.
-//
-// 	func f(t reflect.Type) {
-// 		f(reflect.PtrTo(t))
-// 	}
-//
-// It does this by limiting the type height to k, but this still leaves
-// a potentially exponential (4^k) number of of types that may be
-// enumerated in pathological cases.
-//
-func typeHeight(T types.Type) int {
-	switch T := T.(type) {
-	case *types.Chan:
-		return 2 + typeHeight(T.Elem())
-	case *types.Map:
-		k := typeHeight(T.Key())
-		v := typeHeight(T.Elem())
-		if v > k {
-			k = v // max(k, v)
-		}
-		return 2 + k
-	case *types.Slice:
-		return 1 + typeHeight(T.Elem())
-	case *types.Pointer:
-		return 1 + typeHeight(T.Elem())
-	}
-	return 0
-}
-
-func typeTooHigh(T types.Type) bool {
-	return typeHeight(T) > 3
-}
diff --git a/third_party/gotools/go/pointer/solve.go b/third_party/gotools/go/pointer/solve.go
deleted file mode 100644
index d315cc3..0000000
--- a/third_party/gotools/go/pointer/solve.go
+++ /dev/null
@@ -1,371 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file defines a naive Andersen-style solver for the inclusion
-// constraint system.
-
-import (
-	"fmt"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-type solverState struct {
-	complex []constraint // complex constraints attached to this node
-	copyTo  nodeset      // simple copy constraint edges
-	pts     nodeset      // points-to set of this node
-	prevPTS nodeset      // pts(n) in previous iteration (for difference propagation)
-}
-
-func (a *analysis) solve() {
-	start("Solving")
-	if a.log != nil {
-		fmt.Fprintf(a.log, "\n\n==== Solving constraints\n\n")
-	}
-
-	// Solver main loop.
-	var delta nodeset
-	for {
-		// Add new constraints to the graph:
-		// static constraints from SSA on round 1,
-		// dynamic constraints from reflection thereafter.
-		a.processNewConstraints()
-
-		var x int
-		if !a.work.TakeMin(&x) {
-			break // empty
-		}
-		id := nodeid(x)
-		if a.log != nil {
-			fmt.Fprintf(a.log, "\tnode n%d\n", id)
-		}
-
-		n := a.nodes[id]
-
-		// Difference propagation.
-		delta.Difference(&n.solve.pts.Sparse, &n.solve.prevPTS.Sparse)
-		if delta.IsEmpty() {
-			continue
-		}
-		if a.log != nil {
-			fmt.Fprintf(a.log, "\t\tpts(n%d : %s) = %s + %s\n",
-				id, n.typ, &delta, &n.solve.prevPTS)
-		}
-		n.solve.prevPTS.Copy(&n.solve.pts.Sparse)
-
-		// Apply all resolution rules attached to n.
-		a.solveConstraints(n, &delta)
-
-		if a.log != nil {
-			fmt.Fprintf(a.log, "\t\tpts(n%d) = %s\n", id, &n.solve.pts)
-		}
-	}
-
-	if !a.nodes[0].solve.pts.IsEmpty() {
-		panic(fmt.Sprintf("pts(0) is nonempty: %s", &a.nodes[0].solve.pts))
-	}
-
-	// Release working state (but keep final PTS).
-	for _, n := range a.nodes {
-		n.solve.complex = nil
-		n.solve.copyTo.Clear()
-		n.solve.prevPTS.Clear()
-	}
-
-	if a.log != nil {
-		fmt.Fprintf(a.log, "Solver done\n")
-
-		// Dump solution.
-		for i, n := range a.nodes {
-			if !n.solve.pts.IsEmpty() {
-				fmt.Fprintf(a.log, "pts(n%d) = %s : %s\n", i, &n.solve.pts, n.typ)
-			}
-		}
-	}
-	stop("Solving")
-}
-
-// processNewConstraints takes the new constraints from a.constraints
-// and adds them to the graph, ensuring
-// that new constraints are applied to pre-existing labels and
-// that pre-existing constraints are applied to new labels.
-//
-func (a *analysis) processNewConstraints() {
-	// Take the slice of new constraints.
-	// (May grow during call to solveConstraints.)
-	constraints := a.constraints
-	a.constraints = nil
-
-	// Initialize points-to sets from addr-of (base) constraints.
-	for _, c := range constraints {
-		if c, ok := c.(*addrConstraint); ok {
-			dst := a.nodes[c.dst]
-			dst.solve.pts.add(c.src)
-
-			// Populate the worklist with nodes that point to
-			// something initially (due to addrConstraints) and
-			// have other constraints attached.
-			// (A no-op in round 1.)
-			if !dst.solve.copyTo.IsEmpty() || len(dst.solve.complex) > 0 {
-				a.addWork(c.dst)
-			}
-		}
-	}
-
-	// Attach simple (copy) and complex constraints to nodes.
-	var stale nodeset
-	for _, c := range constraints {
-		var id nodeid
-		switch c := c.(type) {
-		case *addrConstraint:
-			// base constraints handled in previous loop
-			continue
-		case *copyConstraint:
-			// simple (copy) constraint
-			id = c.src
-			a.nodes[id].solve.copyTo.add(c.dst)
-		default:
-			// complex constraint
-			id = c.ptr()
-			solve := a.nodes[id].solve
-			solve.complex = append(solve.complex, c)
-		}
-
-		if n := a.nodes[id]; !n.solve.pts.IsEmpty() {
-			if !n.solve.prevPTS.IsEmpty() {
-				stale.add(id)
-			}
-			a.addWork(id)
-		}
-	}
-	// Apply new constraints to pre-existing PTS labels.
-	var space [50]int
-	for _, id := range stale.AppendTo(space[:0]) {
-		n := a.nodes[nodeid(id)]
-		a.solveConstraints(n, &n.solve.prevPTS)
-	}
-}
-
-// solveConstraints applies each resolution rule attached to node n to
-// the set of labels delta.  It may generate new constraints in
-// a.constraints.
-//
-func (a *analysis) solveConstraints(n *node, delta *nodeset) {
-	if delta.IsEmpty() {
-		return
-	}
-
-	// Process complex constraints dependent on n.
-	for _, c := range n.solve.complex {
-		if a.log != nil {
-			fmt.Fprintf(a.log, "\t\tconstraint %s\n", c)
-		}
-		c.solve(a, delta)
-	}
-
-	// Process copy constraints.
-	var copySeen nodeset
-	for _, x := range n.solve.copyTo.AppendTo(a.deltaSpace) {
-		mid := nodeid(x)
-		if copySeen.add(mid) {
-			if a.nodes[mid].solve.pts.addAll(delta) {
-				a.addWork(mid)
-			}
-		}
-	}
-}
-
-// addLabel adds label to the points-to set of ptr and reports whether the set grew.
-func (a *analysis) addLabel(ptr, label nodeid) bool {
-	b := a.nodes[ptr].solve.pts.add(label)
-	if b && a.log != nil {
-		fmt.Fprintf(a.log, "\t\tpts(n%d) += n%d\n", ptr, label)
-	}
-	return b
-}
-
-func (a *analysis) addWork(id nodeid) {
-	a.work.Insert(int(id))
-	if a.log != nil {
-		fmt.Fprintf(a.log, "\t\twork: n%d\n", id)
-	}
-}
-
-// onlineCopy adds a copy edge.  It is called online, i.e. during
-// solving, so it adds edges and pts members directly rather than by
-// instantiating a 'constraint'.
-//
-// The size of the copy is implicitly 1.
-// It returns true if pts(dst) changed.
-//
-func (a *analysis) onlineCopy(dst, src nodeid) bool {
-	if dst != src {
-		if nsrc := a.nodes[src]; nsrc.solve.copyTo.add(dst) {
-			if a.log != nil {
-				fmt.Fprintf(a.log, "\t\t\tdynamic copy n%d <- n%d\n", dst, src)
-			}
-			// TODO(adonovan): most calls to onlineCopy
-			// are followed by addWork, possibly batched
-			// via a 'changed' flag; see if there's a
-			// noticeable penalty to calling addWork here.
-			return a.nodes[dst].solve.pts.addAll(&nsrc.solve.pts)
-		}
-	}
-	return false
-}
-
-// Returns sizeof.
-// Implicitly adds nodes to worklist.
-//
-// TODO(adonovan): now that we support a.copy() during solving, we
-// could eliminate onlineCopyN, but it's much slower.  Investigate.
-//
-func (a *analysis) onlineCopyN(dst, src nodeid, sizeof uint32) uint32 {
-	for i := uint32(0); i < sizeof; i++ {
-		if a.onlineCopy(dst, src) {
-			a.addWork(dst)
-		}
-		src++
-		dst++
-	}
-	return sizeof
-}
-
-func (c *loadConstraint) solve(a *analysis, delta *nodeset) {
-	var changed bool
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		k := nodeid(x)
-		koff := k + nodeid(c.offset)
-		if a.onlineCopy(c.dst, koff) {
-			changed = true
-		}
-	}
-	if changed {
-		a.addWork(c.dst)
-	}
-}
-
-func (c *storeConstraint) solve(a *analysis, delta *nodeset) {
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		k := nodeid(x)
-		koff := k + nodeid(c.offset)
-		if a.onlineCopy(koff, c.src) {
-			a.addWork(koff)
-		}
-	}
-}
-
-func (c *offsetAddrConstraint) solve(a *analysis, delta *nodeset) {
-	dst := a.nodes[c.dst]
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		k := nodeid(x)
-		if dst.solve.pts.add(k + nodeid(c.offset)) {
-			a.addWork(c.dst)
-		}
-	}
-}
-
-func (c *typeFilterConstraint) solve(a *analysis, delta *nodeset) {
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		ifaceObj := nodeid(x)
-		tDyn, _, indirect := a.taggedValue(ifaceObj)
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		if types.AssignableTo(tDyn, c.typ) {
-			if a.addLabel(c.dst, ifaceObj) {
-				a.addWork(c.dst)
-			}
-		}
-	}
-}
-
-func (c *untagConstraint) solve(a *analysis, delta *nodeset) {
-	predicate := types.AssignableTo
-	if c.exact {
-		predicate = types.Identical
-	}
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		ifaceObj := nodeid(x)
-		tDyn, v, indirect := a.taggedValue(ifaceObj)
-		if indirect {
-			// TODO(adonovan): we'll need to implement this
-			// when we start creating indirect tagged objects.
-			panic("indirect tagged object")
-		}
-
-		if predicate(tDyn, c.typ) {
-			// Copy payload sans tag to dst.
-			//
-			// TODO(adonovan): opt: if tDyn is
-			// nonpointerlike we can skip this entire
-			// constraint, perhaps.  We only care about
-			// pointers among the fields.
-			a.onlineCopyN(c.dst, v, a.sizeof(tDyn))
-		}
-	}
-}
-
-func (c *invokeConstraint) solve(a *analysis, delta *nodeset) {
-	for _, x := range delta.AppendTo(a.deltaSpace) {
-		ifaceObj := nodeid(x)
-		tDyn, v, indirect := a.taggedValue(ifaceObj)
-		if indirect {
-			// TODO(adonovan): we may need to implement this if
-			// we ever apply invokeConstraints to reflect.Value PTSs,
-			// e.g. for (reflect.Value).Call.
-			panic("indirect tagged object")
-		}
-
-		// Look up the concrete method.
-		fn := a.prog.LookupMethod(tDyn, c.method.Pkg(), c.method.Name())
-		if fn == nil {
-			panic(fmt.Sprintf("n%d: no ssa.Function for %s", c.iface, c.method))
-		}
-		sig := fn.Signature
-
-		fnObj := a.globalobj[fn] // dynamic calls use shared contour
-		if fnObj == 0 {
-			// a.objectNode(fn) was not called during gen phase.
-			panic(fmt.Sprintf("a.globalobj[%s]==nil", fn))
-		}
-
-		// Make callsite's fn variable point to identity of
-		// concrete method.  (There's no need to add it to
-		// worklist since it never has attached constraints.)
-		a.addLabel(c.params, fnObj)
-
-		// Extract value and connect to method's receiver.
-		// Copy payload to method's receiver param (arg0).
-		arg0 := a.funcParams(fnObj)
-		recvSize := a.sizeof(sig.Recv().Type())
-		a.onlineCopyN(arg0, v, recvSize)
-
-		src := c.params + 1 // skip past identity
-		dst := arg0 + nodeid(recvSize)
-
-		// Copy caller's argument block to method formal parameters.
-		paramsSize := a.sizeof(sig.Params())
-		a.onlineCopyN(dst, src, paramsSize)
-		src += nodeid(paramsSize)
-		dst += nodeid(paramsSize)
-
-		// Copy method results to caller's result block.
-		resultsSize := a.sizeof(sig.Results())
-		a.onlineCopyN(src, dst, resultsSize)
-	}
-}
-
-func (c *addrConstraint) solve(a *analysis, delta *nodeset) {
-	panic("addr is not a complex constraint")
-}
-
-func (c *copyConstraint) solve(a *analysis, delta *nodeset) {
-	panic("copy is not a complex constraint")
-}
diff --git a/third_party/gotools/go/pointer/stdlib_test.go b/third_party/gotools/go/pointer/stdlib_test.go
deleted file mode 100644
index 9d479aa..0000000
--- a/third_party/gotools/go/pointer/stdlib_test.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-// This file runs the pointer analysis on all packages and tests beneath
-// $GOROOT.  It provides a "smoke test" that the analysis doesn't crash
-// on a large input, and a benchmark for performance measurement.
-//
-// Because it is relatively slow, the --stdlib flag must be enabled for
-// this test to run:
-//    % go test -v golang.org/x/tools/go/pointer --stdlib
-
-import (
-	"flag"
-	"go/build"
-	"go/token"
-	"testing"
-	"time"
-
-	"llvm.org/llgo/third_party/gotools/go/buildutil"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/ssa/ssautil"
-)
-
-var runStdlibTest = flag.Bool("stdlib", false, "Run the (slow) stdlib test")
-
-func TestStdlib(t *testing.T) {
-	if !*runStdlibTest {
-		t.Skip("skipping (slow) stdlib test (use --stdlib)")
-	}
-
-	// Load, parse and type-check the program.
-	ctxt := build.Default // copy
-	ctxt.GOPATH = ""      // disable GOPATH
-	conf := loader.Config{Build: &ctxt}
-	if _, err := conf.FromArgs(buildutil.AllPackages(conf.Build), true); err != nil {
-		t.Errorf("FromArgs failed: %v", err)
-		return
-	}
-
-	iprog, err := conf.Load()
-	if err != nil {
-		t.Fatalf("Load failed: %v", err)
-	}
-
-	// Create SSA packages.
-	prog := ssa.Create(iprog, 0)
-	prog.BuildAll()
-
-	numPkgs := len(prog.AllPackages())
-	if want := 240; numPkgs < want {
-		t.Errorf("Loaded only %d packages, want at least %d", numPkgs, want)
-	}
-
-	// Determine the set of packages/tests to analyze.
-	var testPkgs []*ssa.Package
-	for _, info := range iprog.InitialPackages() {
-		testPkgs = append(testPkgs, prog.Package(info.Pkg))
-	}
-	testmain := prog.CreateTestMainPackage(testPkgs...)
-	if testmain == nil {
-		t.Fatal("analysis scope has tests")
-	}
-
-	// Run the analysis.
-	config := &Config{
-		Reflection:     false, // TODO(adonovan): fix remaining bug in rVCallConstraint, then enable.
-		BuildCallGraph: true,
-		Mains:          []*ssa.Package{testmain},
-	}
-	// TODO(adonovan): add some query values (affects track bits).
-
-	t0 := time.Now()
-
-	result, err := Analyze(config)
-	if err != nil {
-		t.Fatal(err) // internal error in pointer analysis
-	}
-	_ = result // TODO(adonovan): measure something
-
-	t1 := time.Now()
-
-	// Dump some statistics.
-	allFuncs := ssautil.AllFunctions(prog)
-	var numInstrs int
-	for fn := range allFuncs {
-		for _, b := range fn.Blocks {
-			numInstrs += len(b.Instrs)
-		}
-	}
-
-	// determine line count
-	var lineCount int
-	prog.Fset.Iterate(func(f *token.File) bool {
-		lineCount += f.LineCount()
-		return true
-	})
-
-	t.Log("#Source lines:          ", lineCount)
-	t.Log("#Instructions:          ", numInstrs)
-	t.Log("Pointer analysis:       ", t1.Sub(t0))
-}
diff --git a/third_party/gotools/go/pointer/testdata/a_test.go b/third_party/gotools/go/pointer/testdata/a_test.go
deleted file mode 100644
index 3baa9ac..0000000
--- a/third_party/gotools/go/pointer/testdata/a_test.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// +build ignore
-
-package a
-
-// This test exercises the synthesis of testmain packages for tests.
-// The test framework doesn't directly let us perform negative
-// assertions (i.e. that TestingQuux isn't called, or that its
-// parameter's PTS is empty) so this test is rather roundabout.
-
-import "testing"
-
-func log(f func(*testing.T)) {
-	// The PTS of f is the set of called tests.  TestingQuux is not present.
-	print(f) // @pointsto main.Test | main.TestFoo
-}
-
-func Test(t *testing.T) {
-	// Don't assert @pointsto(t) since its label contains a fragile line number.
-	log(Test)
-}
-
-func TestFoo(t *testing.T) {
-	// Don't assert @pointsto(t) since its label contains a fragile line number.
-	log(TestFoo)
-}
-
-func TestingQuux(t *testing.T) {
-	// We can't assert @pointsto(t) since this is dead code.
-	log(TestingQuux)
-}
-
-func BenchmarkFoo(b *testing.B) {
-}
-
-func ExampleBar() {
-}
-
-// Excludes TestingQuux.
-// @calls testing.tRunner -> main.Test
-// @calls testing.tRunner -> main.TestFoo
-// @calls testing.runExample -> main.ExampleBar
-// @calls (*testing.B).runN -> main.BenchmarkFoo
diff --git a/third_party/gotools/go/pointer/testdata/another.go b/third_party/gotools/go/pointer/testdata/another.go
deleted file mode 100644
index 12ed690..0000000
--- a/third_party/gotools/go/pointer/testdata/another.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// +build ignore
-
-package main
-
-var unknown bool
-
-type S string
-
-func incr(x int) int { return x + 1 }
-
-func main() {
-	var i interface{}
-	i = 1
-	if unknown {
-		i = S("foo")
-	}
-	if unknown {
-		i = (func(int, int))(nil) // NB type compares equal to that below.
-	}
-	// Look, the test harness can handle equal-but-not-String-equal
-	// types because we parse types and using a typemap.
-	if unknown {
-		i = (func(x int, y int))(nil)
-	}
-	if unknown {
-		i = incr
-	}
-	print(i) // @types int | S | func(int, int) | func(int) int
-
-	// NB, an interface may never directly alias any global
-	// labels, even though it may contain pointers that do.
-	print(i)                 // @pointsto makeinterface:func(x int) int | makeinterface:func(x int, y int) | makeinterface:func(int, int) | makeinterface:int | makeinterface:main.S
-	print(i.(func(int) int)) // @pointsto main.incr
-
-	print() // regression test for crash
-}
diff --git a/third_party/gotools/go/pointer/testdata/arrayreflect.go b/third_party/gotools/go/pointer/testdata/arrayreflect.go
deleted file mode 100644
index 2b23674..0000000
--- a/third_party/gotools/go/pointer/testdata/arrayreflect.go
+++ /dev/null
@@ -1,191 +0,0 @@
-// +build ignore
-
-package main
-
-// Test of arrays & slices with reflection.
-
-import "reflect"
-
-var a, b int
-
-type S string
-
-func reflectValueSlice() {
-	// reflect.Value contains a slice.
-	slice := make([]*int, 10) // @line slice
-	slice[0] = &a
-	rvsl := reflect.ValueOf(slice).Slice(0, 0)
-	print(rvsl.Interface())              // @types []*int
-	print(rvsl.Interface().([]*int))     // @pointsto makeslice@slice:15
-	print(rvsl.Interface().([]*int)[42]) // @pointsto main.a
-
-	// reflect.Value contains an array (non-addressable).
-	array := [10]*int{&a} // @line array
-	rvarray := reflect.ValueOf(array).Slice(0, 0)
-	print(rvarray.Interface())              // @types
-	print(rvarray.Interface().([]*int))     // @pointsto
-	print(rvarray.Interface().([]*int)[42]) // @pointsto
-
-	// reflect.Value contains a pointer-to-array
-	rvparray := reflect.ValueOf(&array).Slice(0, 0)
-	print(rvparray.Interface())              // @types []*int
-	print(rvparray.Interface().([]*int))     // @pointsto array@array:2
-	print(rvparray.Interface().([]*int)[42]) // @pointsto main.a
-
-	// reflect.Value contains a string.
-	rvstring := reflect.ValueOf("hi").Slice(0, 0)
-	print(rvstring.Interface()) // @types string
-
-	// reflect.Value contains a (named) string type.
-	rvS := reflect.ValueOf(S("hi")).Slice(0, 0)
-	print(rvS.Interface()) // @types S
-
-	// reflect.Value contains a non-array pointer.
-	rvptr := reflect.ValueOf(new(int)).Slice(0, 0)
-	print(rvptr.Interface()) // @types
-
-	// reflect.Value contains a non-string basic type.
-	rvint := reflect.ValueOf(3).Slice(0, 0)
-	print(rvint.Interface()) // @types
-}
-
-func reflectValueBytes() {
-	sl1 := make([]byte, 0) // @line ar5sl1
-	sl2 := make([]byte, 0) // @line ar5sl2
-
-	rvsl1 := reflect.ValueOf(sl1)
-	print(rvsl1.Interface())          // @types []byte
-	print(rvsl1.Interface().([]byte)) // @pointsto makeslice@ar5sl1:13
-	print(rvsl1.Bytes())              // @pointsto makeslice@ar5sl1:13
-
-	rvsl2 := reflect.ValueOf(123)
-	rvsl2.SetBytes(sl2)
-	print(rvsl2.Interface())          // @types int
-	print(rvsl2.Interface().([]byte)) // @pointsto
-	print(rvsl2.Bytes())              // @pointsto
-
-	rvsl3 := reflect.ValueOf([]byte(nil))
-	rvsl3.SetBytes(sl2)
-	print(rvsl3.Interface())          // @types []byte
-	print(rvsl3.Interface().([]byte)) // @pointsto makeslice@ar5sl2:13
-	print(rvsl3.Bytes())              // @pointsto makeslice@ar5sl2:13
-}
-
-func reflectValueIndex() {
-	slice := []*int{&a} // @line ar6slice
-	rv1 := reflect.ValueOf(slice)
-	print(rv1.Index(42).Interface())        // @types *int
-	print(rv1.Index(42).Interface().(*int)) // @pointsto main.a
-
-	array := [10]*int{&a}
-	rv2 := reflect.ValueOf(array)
-	print(rv2.Index(42).Interface())        // @types *int
-	print(rv2.Index(42).Interface().(*int)) // @pointsto main.a
-
-	rv3 := reflect.ValueOf("string")
-	print(rv3.Index(42).Interface()) // @types rune
-
-	rv4 := reflect.ValueOf(&array)
-	print(rv4.Index(42).Interface()) // @types
-
-	rv5 := reflect.ValueOf(3)
-	print(rv5.Index(42).Interface()) // @types
-}
-
-func reflectValueElem() {
-	// Interface.
-	var iface interface{} = &a
-	rv1 := reflect.ValueOf(&iface).Elem()
-	print(rv1.Interface())               // @types *int
-	print(rv1.Interface().(*int))        // @pointsto main.a
-	print(rv1.Elem().Interface())        // @types *int
-	print(rv1.Elem().Interface().(*int)) // @pointsto main.a
-
-	print(reflect.ValueOf(new(interface{})).Elem().Elem()) // @types
-
-	// Pointer.
-	ptr := &a
-	rv2 := reflect.ValueOf(&ptr)
-	print(rv2.Elem().Interface())        // @types *int
-	print(rv2.Elem().Interface().(*int)) // @pointsto main.a
-
-	// No other type works with (rV).Elem, not even those that
-	// work with (rT).Elem: slice, array, map, chan.
-
-	rv3 := reflect.ValueOf([]*int{&a})
-	print(rv3.Elem().Interface()) // @types
-
-	rv4 := reflect.ValueOf([10]*int{&a})
-	print(rv4.Elem().Interface()) // @types
-
-	rv5 := reflect.ValueOf(map[*int]*int{&a: &b})
-	print(rv5.Elem().Interface()) // @types
-
-	ch := make(chan *int)
-	ch <- &a
-	rv6 := reflect.ValueOf(ch)
-	print(rv6.Elem().Interface()) // @types
-
-	rv7 := reflect.ValueOf(3)
-	print(rv7.Elem().Interface()) // @types
-}
-
-func reflectTypeElem() {
-	rt1 := reflect.TypeOf(make([]*int, 0))
-	print(reflect.Zero(rt1.Elem())) // @types *int
-
-	rt2 := reflect.TypeOf([10]*int{})
-	print(reflect.Zero(rt2.Elem())) // @types *int
-
-	rt3 := reflect.TypeOf(map[*int]*int{})
-	print(reflect.Zero(rt3.Elem())) // @types *int
-
-	rt4 := reflect.TypeOf(make(chan *int))
-	print(reflect.Zero(rt4.Elem())) // @types *int
-
-	ptr := &a
-	rt5 := reflect.TypeOf(&ptr)
-	print(reflect.Zero(rt5.Elem())) // @types *int
-
-	rt6 := reflect.TypeOf(3)
-	print(reflect.Zero(rt6.Elem())) // @types
-}
-
-func reflectPtrTo() {
-	tInt := reflect.TypeOf(3)
-	tPtrInt := reflect.PtrTo(tInt)
-	print(reflect.Zero(tPtrInt)) // @types *int
-	tPtrPtrInt := reflect.PtrTo(tPtrInt)
-	print(reflect.Zero(tPtrPtrInt)) // @types **int
-}
-
-func reflectSliceOf() {
-	tInt := reflect.TypeOf(3)
-	tSliceInt := reflect.SliceOf(tInt)
-	print(reflect.Zero(tSliceInt)) // @types []int
-}
-
-type T struct{ x int }
-
-func reflectMakeSlice() {
-	rt := []reflect.Type{
-		reflect.TypeOf(3),
-		reflect.TypeOf([]int{}),
-		reflect.TypeOf([]T{}),
-	}[0]
-	sl := reflect.MakeSlice(rt, 0, 0)
-	print(sl)                         // @types []int | []T
-	print(sl)                         // @pointsto <alloc in reflect.MakeSlice> | <alloc in reflect.MakeSlice>
-	print(&sl.Interface().([]T)[0].x) // @pointsto <alloc in reflect.MakeSlice>[*].x
-}
-
-func main() {
-	reflectValueSlice()
-	reflectValueBytes()
-	reflectValueIndex()
-	reflectValueElem()
-	reflectTypeElem()
-	reflectPtrTo()
-	reflectSliceOf()
-	reflectMakeSlice()
-}
diff --git a/third_party/gotools/go/pointer/testdata/arrays.go b/third_party/gotools/go/pointer/testdata/arrays.go
deleted file mode 100644
index e57a15b..0000000
--- a/third_party/gotools/go/pointer/testdata/arrays.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// +build ignore
-
-package main
-
-var unknown bool // defeat dead-code elimination
-
-var a, b int
-
-func array1() {
-	sliceA := make([]*int, 10) // @line a1make
-	sliceA[0] = &a
-
-	var sliceB []*int
-	sliceB = append(sliceB, &b) // @line a1append
-
-	print(sliceA)    // @pointsto makeslice@a1make:16
-	print(sliceA[0]) // @pointsto main.a
-
-	print(sliceB)      // @pointsto append@a1append:17
-	print(sliceB[100]) // @pointsto main.b
-}
-
-func array2() {
-	sliceA := make([]*int, 10) // @line a2make
-	sliceA[0] = &a
-
-	sliceB := sliceA[:]
-
-	print(sliceA)    // @pointsto makeslice@a2make:16
-	print(sliceA[0]) // @pointsto main.a
-
-	print(sliceB)    // @pointsto makeslice@a2make:16
-	print(sliceB[0]) // @pointsto main.a
-}
-
-func array3() {
-	a := []interface{}{"", 1}
-	b := []interface{}{true, func() {}}
-	print(a[0]) // @types string | int
-	print(b[0]) // @types bool | func()
-}
-
-// Test of append, copy, slice.
-func array4() {
-	var s2 struct { // @line a4L0
-		a [3]int
-		b struct{ c, d int }
-	}
-	var sl1 = make([]*int, 10) // @line a4make
-	var someint int            // @line a4L1
-	sl1[1] = &someint
-	sl2 := append(sl1, &s2.a[1]) // @line a4append1
-	print(sl1)                   // @pointsto makeslice@a4make:16
-	print(sl2)                   // @pointsto append@a4append1:15 | makeslice@a4make:16
-	print(sl1[0])                // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
-	print(sl2[0])                // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
-
-	// In z=append(x,y) we should observe flow from y[*] to x[*].
-	var sl3 = make([]*int, 10) // @line a4L2
-	_ = append(sl3, &s2.a[1])
-	print(sl3)    // @pointsto makeslice@a4L2:16
-	print(sl3[0]) // @pointsto s2.a[*]@a4L0:6
-
-	var sl4 = []*int{&a} // @line a4L3
-	sl4a := append(sl4)  // @line a4L4
-	print(sl4a)          // @pointsto slicelit@a4L3:18 | append@a4L4:16
-	print(&sl4a[0])      // @pointsto slicelit[*]@a4L3:18 | append[*]@a4L4:16
-	print(sl4a[0])       // @pointsto main.a
-
-	var sl5 = []*int{&b} // @line a4L5
-	copy(sl5, sl4)
-	print(sl5)     // @pointsto slicelit@a4L5:18
-	print(&sl5[0]) // @pointsto slicelit[*]@a4L5:18
-	print(sl5[0])  // @pointsto main.b | main.a
-
-	var sl6 = sl5[:0]
-	print(sl6)     // @pointsto slicelit@a4L5:18
-	print(&sl6[0]) // @pointsto slicelit[*]@a4L5:18
-	print(sl6[0])  // @pointsto main.b | main.a
-}
-
-func array5() {
-	var arr [2]*int
-	arr[0] = &a
-	arr[1] = &b
-
-	var n int
-	print(arr[n]) // @pointsto main.a | main.b
-}
-
-func main() {
-	array1()
-	array2()
-	array3()
-	array4()
-	array5()
-}
diff --git a/third_party/gotools/go/pointer/testdata/channels.go b/third_party/gotools/go/pointer/testdata/channels.go
deleted file mode 100644
index 76eb5f8..0000000
--- a/third_party/gotools/go/pointer/testdata/channels.go
+++ /dev/null
@@ -1,118 +0,0 @@
-// +build ignore
-
-package main
-
-func incr(x int) int { return x + 1 }
-
-func decr(x int) int { return x - 1 }
-
-var unknown bool // defeat dead-code elimination
-
-func chan1() {
-	chA := make(chan func(int) int, 0) // @line c1makeA
-	chB := make(chan func(int) int, 0) // @line c1makeB
-	chA <- incr
-	chB <- decr
-	chB <- func(int) int { return 1 }
-
-	print(chA)   // @pointsto makechan@c1makeA:13
-	print(<-chA) // @pointsto main.incr
-
-	print(chB)   // @pointsto makechan@c1makeB:13
-	print(<-chB) // @pointsto main.decr | main.chan1$1
-}
-
-func chan2() {
-	chA := make(chan func(int) int, 0) // @line c2makeA
-	chB := make(chan func(int) int, 0) // @line c2makeB
-	chA <- incr
-	chB <- decr
-	chB <- func(int) int { return 1 }
-
-	// Channels flow together.
-	// Labelsets remain distinct but elements are merged.
-	chAB := chA
-	if unknown {
-		chAB = chB
-	}
-
-	print(chA)   // @pointsto makechan@c2makeA:13
-	print(<-chA) // @pointsto main.incr
-
-	print(chB)   // @pointsto makechan@c2makeB:13
-	print(<-chB) // @pointsto main.decr | main.chan2$1
-
-	print(chAB)   // @pointsto makechan@c2makeA:13 | makechan@c2makeB:13
-	print(<-chAB) // @pointsto main.incr | main.decr | main.chan2$1
-
-	(<-chA)(3)
-}
-
-// @calls main.chan2 -> main.incr
-
-func chan3() {
-	chA := make(chan func(int) int, 0) // @line c3makeA
-	chB := make(chan func(int) int, 0) // @line c3makeB
-	chA <- incr
-	chB <- decr
-	chB <- func(int) int { return 1 }
-	print(chA)   // @pointsto makechan@c3makeA:13
-	print(<-chA) // @pointsto main.incr
-	print(chB)   // @pointsto makechan@c3makeB:13
-	print(<-chB) // @pointsto main.decr | main.chan3$1
-
-	(<-chA)(3)
-}
-
-// @calls main.chan3 -> main.incr
-
-func chan4() {
-	chA := make(chan func(int) int, 0) // @line c4makeA
-	chB := make(chan func(int) int, 0) // @line c4makeB
-
-	select {
-	case chA <- incr:
-	case chB <- decr:
-	case a := <-chA:
-		print(a) // @pointsto main.incr
-	case b := <-chB:
-		print(b) // @pointsto main.decr
-	default:
-		print(chA) // @pointsto makechan@c4makeA:13
-		print(chB) // @pointsto makechan@c4makeB:13
-	}
-
-	for k := range chA {
-		print(k) // @pointsto main.incr
-	}
-	// Exercise constraint generation (regtest for a crash).
-	for _ = range chA {
-	}
-}
-
-// Multi-word channel value in select with multiple receive cases.
-// (Regtest for a crash.)
-func chan5() {
-	type T struct {
-		x *int
-		y interface{}
-	}
-	ch := make(chan T)
-	ch <- T{new(int), incr} // @line ch5new
-	select {
-	case a := <-ch:
-		print(a.x) // @pointsto new@ch5new:13
-		print(a.y) // @types func(x int) int
-	case b := <-ch:
-		print(b.x) // @pointsto new@ch5new:13
-		print(b.y) // @types func(x int) int
-	}
-}
-
-func main() {
-	chan1()
-	chan2()
-	chan3()
-	chan4()
-	chan5()
-}
diff --git a/third_party/gotools/go/pointer/testdata/chanreflect.go b/third_party/gotools/go/pointer/testdata/chanreflect.go
deleted file mode 100644
index 7d22efe..0000000
--- a/third_party/gotools/go/pointer/testdata/chanreflect.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// +build ignore
-
-package main
-
-import "reflect"
-
-// Test of channels with reflection.
-
-var a, b int
-
-func chanreflect1() {
-	ch := make(chan *int, 0) // @line cr1make
-	crv := reflect.ValueOf(ch)
-	crv.Send(reflect.ValueOf(&a))
-	print(crv.Interface())             // @types chan *int
-	print(crv.Interface().(chan *int)) // @pointsto makechan@cr1make:12
-	print(<-ch)                        // @pointsto main.a
-}
-
-func chanreflect1i() {
-	// Exercises reflect.Value conversions to/from interfaces:
-	// a different code path than for concrete types.
-	ch := make(chan interface{}, 0)
-	reflect.ValueOf(ch).Send(reflect.ValueOf(&a))
-	v := <-ch
-	print(v)        // @types *int
-	print(v.(*int)) // @pointsto main.a
-}
-
-func chanreflect2() {
-	ch := make(chan *int, 0)
-	ch <- &b
-	crv := reflect.ValueOf(ch)
-	r, _ := crv.Recv()
-	print(r.Interface())        // @types *int
-	print(r.Interface().(*int)) // @pointsto main.b
-}
-
-func chanOfRecv() {
-	// MakeChan(<-chan) is a no-op.
-	t := reflect.ChanOf(reflect.RecvDir, reflect.TypeOf(&a))
-	print(reflect.Zero(t).Interface())                      // @types <-chan *int
-	print(reflect.MakeChan(t, 0).Interface().(<-chan *int)) // @pointsto
-	print(reflect.MakeChan(t, 0).Interface().(chan *int))   // @pointsto
-}
-
-func chanOfSend() {
-	// MakeChan(chan<-) is a no-op.
-	t := reflect.ChanOf(reflect.SendDir, reflect.TypeOf(&a))
-	print(reflect.Zero(t).Interface())                      // @types chan<- *int
-	print(reflect.MakeChan(t, 0).Interface().(chan<- *int)) // @pointsto
-	print(reflect.MakeChan(t, 0).Interface().(chan *int))   // @pointsto
-}
-
-func chanOfBoth() {
-	t := reflect.ChanOf(reflect.BothDir, reflect.TypeOf(&a))
-	print(reflect.Zero(t).Interface()) // @types chan *int
-	ch := reflect.MakeChan(t, 0)
-	print(ch.Interface().(chan *int)) // @pointsto <alloc in reflect.MakeChan>
-	ch.Send(reflect.ValueOf(&b))
-	ch.Interface().(chan *int) <- &a
-	r, _ := ch.Recv()
-	print(r.Interface().(*int))         // @pointsto main.a | main.b
-	print(<-ch.Interface().(chan *int)) // @pointsto main.a | main.b
-}
-
-var unknownDir reflect.ChanDir // not a constant
-
-func chanOfUnknown() {
-	// Unknown channel direction: assume all three.
-	// MakeChan only works on the bi-di channel type.
-	t := reflect.ChanOf(unknownDir, reflect.TypeOf(&a))
-	print(reflect.Zero(t).Interface())        // @types <-chan *int | chan<- *int | chan *int
-	print(reflect.MakeChan(t, 0).Interface()) // @types chan *int
-}
-
-func main() {
-	chanreflect1()
-	chanreflect1i()
-	chanreflect2()
-	chanOfRecv()
-	chanOfSend()
-	chanOfBoth()
-	chanOfUnknown()
-}
diff --git a/third_party/gotools/go/pointer/testdata/chanreflect1.go b/third_party/gotools/go/pointer/testdata/chanreflect1.go
deleted file mode 100644
index c5e2587..0000000
--- a/third_party/gotools/go/pointer/testdata/chanreflect1.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// +build ignore
-
-package main
-
-import "reflect"
-
-//
-// This test is very sensitive to line-number perturbations!
-
-// Test of channels with reflection.
-
-var a, b int
-
-func chanreflect1() {
-	ch := make(chan *int, 0)
-	crv := reflect.ValueOf(ch)
-	crv.Send(reflect.ValueOf(&a))
-	print(crv.Interface())             // @types chan *int
-	print(crv.Interface().(chan *int)) // @pointsto makechan@testdata/chanreflect.go:15:12
-	print(<-ch)                        // @pointsto main.a
-}
-
-func chanreflect2() {
-	ch := make(chan *int, 0)
-	ch <- &b
-	crv := reflect.ValueOf(ch)
-	r, _ := crv.Recv()
-	print(r.Interface())        // @types *int
-	print(r.Interface().(*int)) // @pointsto main.b
-}
-
-func main() {
-	chanreflect1()
-	chanreflect2()
-}
diff --git a/third_party/gotools/go/pointer/testdata/context.go b/third_party/gotools/go/pointer/testdata/context.go
deleted file mode 100644
index ed616e7..0000000
--- a/third_party/gotools/go/pointer/testdata/context.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// +build ignore
-
-package main
-
-// Test of context-sensitive treatment of certain function calls,
-// e.g. static calls to simple accessor methods.
-
-var a, b int
-
-type T struct{ x *int }
-
-func (t *T) SetX(x *int) { t.x = x }
-func (t *T) GetX() *int  { return t.x }
-
-func context1() {
-	var t1, t2 T
-	t1.SetX(&a)
-	t2.SetX(&b)
-	print(t1.GetX()) // @pointsto main.a
-	print(t2.GetX()) // @pointsto main.b
-}
-
-func context2() {
-	id := func(x *int) *int {
-		print(x) // @pointsto main.a | main.b
-		return x
-	}
-	print(id(&a)) // @pointsto main.a
-	print(id(&b)) // @pointsto main.b
-
-	// Same again, but anon func has free vars.
-	var c int // @line context2c
-	id2 := func(x *int) (*int, *int) {
-		print(x) // @pointsto main.a | main.b
-		return x, &c
-	}
-	p, q := id2(&a)
-	print(p) // @pointsto main.a
-	print(q) // @pointsto c@context2c:6
-	r, s := id2(&b)
-	print(r) // @pointsto main.b
-	print(s) // @pointsto c@context2c:6
-}
-
-func main() {
-	context1()
-	context2()
-}
diff --git a/third_party/gotools/go/pointer/testdata/conv.go b/third_party/gotools/go/pointer/testdata/conv.go
deleted file mode 100644
index 692f0ce..0000000
--- a/third_party/gotools/go/pointer/testdata/conv.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// +build ignore
-
-package main
-
-import "unsafe"
-
-var a int
-
-func conv1() {
-	// Conversions of channel direction.
-	ch := make(chan int)    // @line c1make
-	print((<-chan int)(ch)) // @pointsto makechan@c1make:12
-	print((chan<- int)(ch)) // @pointsto makechan@c1make:12
-}
-
-func conv2() {
-	// string -> []byte/[]rune conversion
-	s := "foo"
-	ba := []byte(s) // @line c2ba
-	ra := []rune(s) // @line c2ra
-	print(ba)       // @pointsto convert@c2ba:14
-	print(ra)       // @pointsto convert@c2ra:14
-}
-
-func conv3() {
-	// Conversion of same underlying types.
-	type PI *int
-	pi := PI(&a)
-	print(pi) // @pointsto main.a
-
-	pint := (*int)(pi)
-	print(pint) // @pointsto main.a
-
-	// Conversions between pointers to identical base types.
-	var y *PI = &pi
-	var x **int = (**int)(y)
-	print(*x) // @pointsto main.a
-	print(*y) // @pointsto main.a
-	y = (*PI)(x)
-	print(*y) // @pointsto main.a
-}
-
-func conv4() {
-	// Handling of unsafe.Pointer conversion is unsound:
-	// we lose the alias to main.a and get something like new(int) instead.
-	p := (*int)(unsafe.Pointer(&a)) // @line c2p
-	print(p)                        // @pointsto convert@c2p:13
-}
-
-// Regression test for b/8231.
-func conv5() {
-	type P unsafe.Pointer
-	var i *struct{}
-	_ = P(i)
-}
-
-func main() {
-	conv1()
-	conv2()
-	conv3()
-	conv4()
-	conv5()
-}
diff --git a/third_party/gotools/go/pointer/testdata/finalizer.go b/third_party/gotools/go/pointer/testdata/finalizer.go
deleted file mode 100644
index 97f25c9..0000000
--- a/third_party/gotools/go/pointer/testdata/finalizer.go
+++ /dev/null
@@ -1,89 +0,0 @@
-package main
-
-import "runtime"
-
-func final1a(x *int) int {
-	print(x) // @pointsto new@newint:10
-	return *x
-}
-
-func final1b(x *bool) {
-	print(x) // @pointsto
-}
-
-func runtimeSetFinalizer1() {
-	x := new(int)                    // @line newint
-	runtime.SetFinalizer(x, final1a) // ok: final1a's result is ignored
-	runtime.SetFinalizer(x, final1b) // param type mismatch: no effect
-}
-
-// @calls main.runtimeSetFinalizer1 -> main.final1a
-// @calls main.runtimeSetFinalizer1 -> main.final1b
-
-func final2a(x *bool) {
-	print(x) // @pointsto new@newbool1:10 | new@newbool2:10
-}
-
-func final2b(x *bool) {
-	print(x) // @pointsto new@newbool1:10 | new@newbool2:10
-}
-
-func runtimeSetFinalizer2() {
-	x := new(bool) // @line newbool1
-	f := final2a
-	if unknown {
-		x = new(bool) // @line newbool2
-		f = final2b
-	}
-	runtime.SetFinalizer(x, f)
-}
-
-// @calls main.runtimeSetFinalizer2 -> main.final2a
-// @calls main.runtimeSetFinalizer2 -> main.final2b
-
-type T int
-
-func (t *T) finalize() {
-	print(t) // @pointsto new@final3:10
-}
-
-func runtimeSetFinalizer3() {
-	x := new(T) // @line final3
-	runtime.SetFinalizer(x, (*T).finalize)
-}
-
-// @calls main.runtimeSetFinalizer3 -> (*main.T).finalize$thunk
-
-// I hope I never live to see this code in the wild.
-var setFinalizer = runtime.SetFinalizer
-
-func final4(x *int) {
-	print(x) // @pointsto new@finalIndirect:10
-}
-
-func runtimeSetFinalizerIndirect() {
-	// In an indirect call, the shared contour for SetFinalizer is
-	// used, i.e. the call is not inlined and appears in the call graph.
-	x := new(int) // @line finalIndirect
-	setFinalizer(x, final4)
-}
-
-// Exercise the elimination of SetFinalizer
-// constraints with non-pointer operands.
-func runtimeSetFinalizerNonpointer() {
-	runtime.SetFinalizer(nil, (*T).finalize) // x is a non-pointer
-	runtime.SetFinalizer((*T).finalize, nil) // f is a non-pointer
-}
-
-// @calls main.runtimeSetFinalizerIndirect -> runtime.SetFinalizer
-// @calls runtime.SetFinalizer -> main.final4
-
-func main() {
-	runtimeSetFinalizer1()
-	runtimeSetFinalizer2()
-	runtimeSetFinalizer3()
-	runtimeSetFinalizerIndirect()
-	runtimeSetFinalizerNonpointer()
-}
-
-var unknown bool // defeat dead-code elimination
diff --git a/third_party/gotools/go/pointer/testdata/flow.go b/third_party/gotools/go/pointer/testdata/flow.go
deleted file mode 100644
index 6fb599e..0000000
--- a/third_party/gotools/go/pointer/testdata/flow.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// +build ignore
-
-package main
-
-// Demonstration of directionality of flow edges.
-
-func f1() {}
-func f2() {}
-
-var somepred bool
-
-// Tracking functions.
-func flow1() {
-	s := f1
-	p := f2
-	q := p
-	r := q
-	if somepred {
-		r = s
-	}
-	print(s) // @pointsto main.f1
-	print(p) // @pointsto main.f2
-	print(q) // @pointsto main.f2
-	print(r) // @pointsto main.f1 | main.f2
-}
-
-// Tracking concrete types in interfaces.
-func flow2() {
-	var s interface{} = 1
-	var p interface{} = "foo"
-	q := p
-	r := q
-	if somepred {
-		r = s
-	}
-	print(s) // @types int
-	print(p) // @types string
-	print(q) // @types string
-	print(r) // @types int | string
-}
-
-var g1, g2 int
-
-// Tracking addresses of globals.
-func flow3() {
-	s := &g1
-	p := &g2
-	q := p
-	r := q
-	if somepred {
-		r = s
-	}
-	print(s) // @pointsto main.g1
-	print(p) // @pointsto main.g2
-	print(q) // @pointsto main.g2
-	print(r) // @pointsto main.g2 | main.g1
-}
-
-func main() {
-	flow1()
-	flow2()
-	flow3()
-}
diff --git a/third_party/gotools/go/pointer/testdata/fmtexcerpt.go b/third_party/gotools/go/pointer/testdata/fmtexcerpt.go
deleted file mode 100644
index ee2a0e7..0000000
--- a/third_party/gotools/go/pointer/testdata/fmtexcerpt.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// +build ignore
-
-// This is a slice of the fmt package.
-
-package main
-
-type pp struct {
-	field interface{}
-}
-
-func newPrinter() *pp {
-	return new(pp)
-}
-
-func Fprintln(a ...interface{}) {
-	p := newPrinter()
-	p.doPrint(a, true, true)
-}
-
-func Println(a ...interface{}) {
-	Fprintln(a...)
-}
-
-func (p *pp) doPrint(a []interface{}, addspace, addnewline bool) {
-	print(a[0]) // @types S | string
-	stringer := a[0].(interface {
-		String() string
-	})
-
-	stringer.String()
-	print(stringer) // @types S
-}
-
-type S int
-
-func (S) String() string { return "" }
-
-func main() {
-	Println("Hello, World!", S(0))
-}
-
-// @calls (*main.pp).doPrint -> (main.S).String
diff --git a/third_party/gotools/go/pointer/testdata/func.go b/third_party/gotools/go/pointer/testdata/func.go
deleted file mode 100644
index 2155f8e..0000000
--- a/third_party/gotools/go/pointer/testdata/func.go
+++ /dev/null
@@ -1,205 +0,0 @@
-// +build ignore
-
-package main
-
-var a, b, c int
-
-var unknown bool // defeat dead-code elimination
-
-func func1() {
-	var h int // @line f1h
-	f := func(x *int) *int {
-		if unknown {
-			return &b
-		}
-		return x
-	}
-
-	// FV(g) = {f, h}
-	g := func(x *int) *int {
-		if unknown {
-			return &h
-		}
-		return f(x)
-	}
-
-	print(g(&a)) // @pointsto main.a | main.b | h@f1h:6
-	print(f(&a)) // @pointsto main.a | main.b
-	print(&a)    // @pointsto main.a
-}
-
-// @calls main.func1 -> main.func1$2
-// @calls main.func1 -> main.func1$1
-// @calls main.func1$2 ->  main.func1$1
-
-func func2() {
-	var x, y *int
-	defer func() {
-		x = &a
-	}()
-	go func() {
-		y = &b
-	}()
-	print(x) // @pointsto main.a
-	print(y) // @pointsto main.b
-}
-
-func func3() {
-	x, y := func() (x, y *int) {
-		x = &a
-		y = &b
-		if unknown {
-			return nil, &c
-		}
-		return
-	}()
-	print(x) // @pointsto main.a
-	print(y) // @pointsto main.b | main.c
-}
-
-func swap(x, y *int) (*int, *int) { // @line swap
-	print(&x) // @pointsto x@swap:11
-	print(x)  // @pointsto makeslice[*]@func4make:11
-	print(&y) // @pointsto y@swap:14
-	print(y)  // @pointsto j@f4j:5
-	return y, x
-}
-
-func func4() {
-	a := make([]int, 10) // @line func4make
-	i, j := 123, 456     // @line f4j
-	_ = i
-	p, q := swap(&a[3], &j)
-	print(p) // @pointsto j@f4j:5
-	print(q) // @pointsto makeslice[*]@func4make:11
-
-	f := &b
-	print(f) // @pointsto main.b
-}
-
-type T int
-
-func (t *T) f(x *int) *int {
-	print(t) // @pointsto main.a
-	print(x) // @pointsto main.c
-	return &b
-}
-
-func (t *T) g(x *int) *int {
-	print(t) // @pointsto main.a
-	print(x) // @pointsto main.b
-	return &c
-}
-
-func (t *T) h(x *int) *int {
-	print(t) // @pointsto main.a
-	print(x) // @pointsto main.b
-	return &c
-}
-
-var h func(*T, *int) *int
-
-func func5() {
-	// Static call of method.
-	t := (*T)(&a)
-	print(t.f(&c)) // @pointsto main.b
-
-	// Static call of method as function
-	print((*T).g(t, &b)) // @pointsto main.c
-
-	// Dynamic call (not invoke) of method.
-	h = (*T).h
-	print(h(t, &b)) // @pointsto main.c
-}
-
-// @calls main.func5 -> (*main.T).f
-// @calls main.func5 -> (*main.T).g$thunk
-// @calls main.func5 -> (*main.T).h$thunk
-
-func func6() {
-	A := &a
-	f := func() *int {
-		return A // (free variable)
-	}
-	print(f()) // @pointsto main.a
-}
-
-// @calls main.func6 -> main.func6$1
-
-type I interface {
-	f()
-}
-
-type D struct{}
-
-func (D) f() {}
-
-func func7() {
-	var i I = D{}
-	imethodClosure := i.f
-	imethodClosure()
-	// @calls main.func7 -> (main.I).f$bound
-	// @calls (main.I).f$bound -> (main.D).f
-
-	var d D
-	cmethodClosure := d.f
-	cmethodClosure()
-	// @calls main.func7 -> (main.D).f$bound
-	// @calls (main.D).f$bound ->(main.D).f
-
-	methodExpr := D.f
-	methodExpr(d)
-	// @calls main.func7 -> (main.D).f$thunk
-}
-
-func func8(x ...int) {
-	print(&x[0]) // @pointsto varargs[*]@varargs:15
-}
-
-type E struct {
-	x1, x2, x3, x4, x5 *int
-}
-
-func (e E) f() {}
-
-func func9() {
-	// Regression test for bug reported by Jon Valdes on golang-dev, Jun 19 2014.
-	// The receiver of a bound method closure may be of a multi-node type, E.
-	// valueNode was reserving only a single node for it, so the
-	// nodes used by the immediately following constraints
-	// (e.g. param 'i') would get clobbered.
-
-	var e E
-	e.x1 = &a
-	e.x2 = &a
-	e.x3 = &a
-	e.x4 = &a
-	e.x5 = &a
-
-	_ = e.f // form a closure---must reserve sizeof(E) nodes
-
-	func(i I) {
-		i.f() // must not crash the solver
-	}(new(D))
-
-	print(e.x1) // @pointsto main.a
-	print(e.x2) // @pointsto main.a
-	print(e.x3) // @pointsto main.a
-	print(e.x4) // @pointsto main.a
-	print(e.x5) // @pointsto main.a
-}
-
-func main() {
-	func1()
-	func2()
-	func3()
-	func4()
-	func5()
-	func6()
-	func7()
-	func8(1, 2, 3) // @line varargs
-	func9()
-}
-
-// @calls <root> -> main.main
-// @calls <root> -> main.init
diff --git a/third_party/gotools/go/pointer/testdata/funcreflect.go b/third_party/gotools/go/pointer/testdata/funcreflect.go
deleted file mode 100644
index a0a9a5f..0000000
--- a/third_party/gotools/go/pointer/testdata/funcreflect.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// +build ignore
-
-package main
-
-import "reflect"
-
-var zero, a, b int
-var false2 bool
-
-func f(p *int, q hasF) *int {
-	print(p)      // @pointsto main.a
-	print(q)      // @types *T
-	print(q.(*T)) // @pointsto new@newT1:22
-	return &b
-}
-
-func g(p *bool) (*int, *bool, hasF) {
-	return &b, p, new(T) // @line newT2
-}
-
-func reflectValueCall() {
-	rvf := reflect.ValueOf(f)
-	res := rvf.Call([]reflect.Value{
-		// argument order is not significant:
-		reflect.ValueOf(new(T)), // @line newT1
-		reflect.ValueOf(&a),
-	})
-	print(res[0].Interface())        // @types *int
-	print(res[0].Interface().(*int)) // @pointsto main.b
-}
-
-// @calls main.reflectValueCall -> main.f
-
-func reflectValueCallIndirect() {
-	rvf := reflect.ValueOf(g)
-	call := rvf.Call // kids, don't try this at home
-
-	// Indirect call uses shared contour.
-	//
-	// Also notice that argument position doesn't matter, and args
-	// of inappropriate type (e.g. 'a') are ignored.
-	res := call([]reflect.Value{
-		reflect.ValueOf(&a),
-		reflect.ValueOf(&false2),
-	})
-	res0 := res[0].Interface()
-	print(res0)         // @types *int | *bool | *T
-	print(res0.(*int))  // @pointsto main.b
-	print(res0.(*bool)) // @pointsto main.false2
-	print(res0.(hasF))  // @types *T
-	print(res0.(*T))    // @pointsto new@newT2:19
-}
-
-// @calls main.reflectValueCallIndirect -> (reflect.Value).Call$bound
-// @calls (reflect.Value).Call$bound -> main.g
-
-func reflectTypeInOut() {
-	var f func(float64, bool) (string, int)
-	print(reflect.Zero(reflect.TypeOf(f).In(0)).Interface())    // @types float64
-	print(reflect.Zero(reflect.TypeOf(f).In(1)).Interface())    // @types bool
-	print(reflect.Zero(reflect.TypeOf(f).In(-1)).Interface())   // @types float64 | bool
-	print(reflect.Zero(reflect.TypeOf(f).In(zero)).Interface()) // @types float64 | bool
-
-	print(reflect.Zero(reflect.TypeOf(f).Out(0)).Interface()) // @types string
-	print(reflect.Zero(reflect.TypeOf(f).Out(1)).Interface()) // @types int
-	print(reflect.Zero(reflect.TypeOf(f).Out(2)).Interface()) // @types
-
-	print(reflect.Zero(reflect.TypeOf(3).Out(0)).Interface()) // @types
-}
-
-type hasF interface {
-	F()
-}
-
-type T struct{}
-
-func (T) F()    {}
-func (T) g(int) {}
-
-type U struct{}
-
-func (U) F(int)    {}
-func (U) g(string) {}
-
-type I interface {
-	f()
-}
-
-var nonconst string
-
-func reflectTypeMethodByName() {
-	TU := reflect.TypeOf([]interface{}{T{}, U{}}[0])
-	print(reflect.Zero(TU)) // @types T | U
-
-	F, _ := TU.MethodByName("F")
-	print(reflect.Zero(F.Type)) // @types func(T) | func(U, int)
-	print(F.Func)               // @pointsto (main.T).F | (main.U).F
-
-	g, _ := TU.MethodByName("g")
-	print(reflect.Zero(g.Type)) // @types func(T, int) | func(U, string)
-	print(g.Func)               // @pointsto (main.T).g | (main.U).g
-
-	// Non-literal method names are treated less precisely.
-	U := reflect.TypeOf(U{})
-	X, _ := U.MethodByName(nonconst)
-	print(reflect.Zero(X.Type)) // @types func(U, int) | func(U, string)
-	print(X.Func)               // @pointsto (main.U).F | (main.U).g
-
-	// Interface methods.
-	rThasF := reflect.TypeOf(new(hasF)).Elem()
-	print(reflect.Zero(rThasF)) // @types hasF
-	F2, _ := rThasF.MethodByName("F")
-	print(reflect.Zero(F2.Type)) // @types func()
-	print(F2.Func)               // @pointsto
-
-}
-
-func reflectTypeMethod() {
-	m := reflect.TypeOf(T{}).Method(0)
-	print(reflect.Zero(m.Type)) // @types func(T) | func(T, int)
-	print(m.Func)               // @pointsto (main.T).F | (main.T).g
-}
-
-func main() {
-	reflectValueCall()
-	reflectValueCallIndirect()
-	reflectTypeInOut()
-	reflectTypeMethodByName()
-	reflectTypeMethod()
-}
diff --git a/third_party/gotools/go/pointer/testdata/hello.go b/third_party/gotools/go/pointer/testdata/hello.go
deleted file mode 100644
index b81784b..0000000
--- a/third_party/gotools/go/pointer/testdata/hello.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// +build ignore
-
-package main
-
-import (
-	"fmt"
-	"os"
-)
-
-type S int
-
-var theS S
-
-func (s *S) String() string {
-	print(s) // @pointsto main.theS
-	return ""
-}
-
-func main() {
-	// os.Args is considered intrinsically allocated,
-	// but may also be set explicitly (e.g. on Windows), hence '...'.
-	print(os.Args) // @pointsto <command-line args> | ...
-	fmt.Println("Hello, World!", &theS)
-}
-
-// @calls main.main               -> fmt.Println
-// @calls (*fmt.pp).handleMethods -> (*main.S).String
diff --git a/third_party/gotools/go/pointer/testdata/interfaces.go b/third_party/gotools/go/pointer/testdata/interfaces.go
deleted file mode 100644
index 91c0fa9..0000000
--- a/third_party/gotools/go/pointer/testdata/interfaces.go
+++ /dev/null
@@ -1,152 +0,0 @@
-// +build ignore
-
-package main
-
-type I interface {
-	f()
-}
-
-type C int
-
-func (*C) f() {}
-
-type D struct{ ptr *int }
-
-func (D) f() {}
-
-type E struct{}
-
-func (*E) f() {}
-
-var a, b int
-
-var unknown bool // defeat dead-code elimination
-
-func interface1() {
-	var i interface{} = &a
-	var j interface{} = D{&b}
-	k := j
-	if unknown {
-		k = i
-	}
-
-	print(i) // @types *int
-	print(j) // @types D
-	print(k) // @types *int | D
-
-	print(i.(*int)) // @pointsto main.a
-	print(j.(*int)) // @pointsto
-	print(k.(*int)) // @pointsto main.a
-
-	print(i.(D).ptr) // @pointsto
-	print(j.(D).ptr) // @pointsto main.b
-	print(k.(D).ptr) // @pointsto main.b
-}
-
-func interface2() {
-	var i I = (*C)(&a)
-	var j I = D{&a}
-	k := j
-	if unknown {
-		k = i
-	}
-
-	print(i) // @types *C
-	print(j) // @types D
-	print(k) // @types *C | D
-	print(k) // @pointsto makeinterface:main.D | makeinterface:*main.C
-
-	k.f()
-	// @calls main.interface2 -> (*main.C).f
-	// @calls main.interface2 -> (main.D).f
-
-	print(i.(*C))    // @pointsto main.a
-	print(j.(D).ptr) // @pointsto main.a
-	print(k.(*C))    // @pointsto main.a
-
-	switch x := k.(type) {
-	case *C:
-		print(x) // @pointsto main.a
-	case D:
-		print(x.ptr) // @pointsto main.a
-	case *E:
-		print(x) // @pointsto
-	}
-}
-
-func interface3() {
-	// There should be no backflow of concrete types from the type-switch to x.
-	var x interface{} = 0
-	print(x) // @types int
-	switch x.(type) {
-	case int:
-	case string:
-	}
-}
-
-func interface4() {
-	var i interface{} = D{&a}
-	if unknown {
-		i = 123
-	}
-
-	print(i) // @types int | D
-
-	j := i.(I)       // interface narrowing type-assertion
-	print(j)         // @types D
-	print(j.(D).ptr) // @pointsto main.a
-
-	var l interface{} = j // interface widening assignment.
-	print(l)              // @types D
-	print(l.(D).ptr)      // @pointsto main.a
-
-	m := j.(interface{}) // interface widening type-assertion.
-	print(m)             // @types D
-	print(m.(D).ptr)     // @pointsto main.a
-}
-
-// Interface method calls and value flow:
-
-type J interface {
-	f(*int) *int
-}
-
-type P struct {
-	x int
-}
-
-func (p *P) f(pi *int) *int {
-	print(p)  // @pointsto p@i5p:6
-	print(pi) // @pointsto i@i5i:6
-	return &p.x
-}
-
-func interface5() {
-	var p P // @line i5p
-	var j J = &p
-	var i int      // @line i5i
-	print(j.f(&i)) // @pointsto p.x@i5p:6
-	print(&i)      // @pointsto i@i5i:6
-
-	print(j) // @pointsto makeinterface:*main.P
-}
-
-// @calls main.interface5 -> (*main.P).f
-
-func interface6() {
-	f := I.f
-	print(f) // @pointsto (main.I).f$thunk
-	f(new(struct{ D }))
-}
-
-// @calls main.interface6 -> (main.I).f$thunk
-// @calls (main.I).f$thunk -> (*struct{main.D}).f
-
-func main() {
-	interface1()
-	interface2()
-	interface3()
-	interface4()
-	interface5()
-	interface6()
-}
diff --git a/third_party/gotools/go/pointer/testdata/issue9002.go b/third_party/gotools/go/pointer/testdata/issue9002.go
deleted file mode 100644
index b7c2c61..0000000
--- a/third_party/gotools/go/pointer/testdata/issue9002.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package main
-
-func main() {
-	// Regression test for golang issue 9002.
-	//
-	// The two-result "value,ok" receive operation generated a
-	// too-wide constraint loading (value int, ok bool), not bool,
-	// from the channel.
-	//
-	// This bug manifested itself in an out-of-bounds array access
-	// when the makechan object was the highest-numbered node, as in
-	// this program.
-	//
-	// In more realistic programs it silently resulted in bogus
-	// constraints.
-	_, _ = <-make(chan int)
-}
diff --git a/third_party/gotools/go/pointer/testdata/mapreflect.go b/third_party/gotools/go/pointer/testdata/mapreflect.go
deleted file mode 100644
index bc5e7e6..0000000
--- a/third_party/gotools/go/pointer/testdata/mapreflect.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// +build ignore
-
-package main
-
-// Test of maps with reflection.
-
-import "reflect"
-
-var a int
-var b bool
-
-func reflectMapKeysIndex() {
-	m := make(map[*int]*bool) // @line mr1make
-	m[&a] = &b
-
-	mrv := reflect.ValueOf(m)
-	print(mrv.Interface())                  // @types map[*int]*bool
-	print(mrv.Interface().(map[*int]*bool)) // @pointsto makemap@mr1make:11
-	print(mrv)                              // @pointsto makeinterface:map[*int]*bool
-	print(mrv)                              // @types map[*int]*bool
-
-	keys := mrv.MapKeys()
-	print(keys) // @pointsto <alloc in (reflect.Value).MapKeys>
-	for _, k := range keys {
-		print(k)                    // @pointsto <alloc in (reflect.Value).MapKeys>
-		print(k)                    // @types *int
-		print(k.Interface())        // @types *int
-		print(k.Interface().(*int)) // @pointsto main.a
-
-		v := mrv.MapIndex(k)
-		print(v.Interface())         // @types *bool
-		print(v.Interface().(*bool)) // @pointsto main.b
-	}
-}
-
-func reflectSetMapIndex() {
-	m := make(map[*int]*bool)
-	mrv := reflect.ValueOf(m)
-	mrv.SetMapIndex(reflect.ValueOf(&a), reflect.ValueOf(&b))
-
-	print(m[nil]) // @pointsto main.b
-
-	for _, k := range mrv.MapKeys() {
-		print(k.Interface())        // @types *int
-		print(k.Interface().(*int)) // @pointsto main.a
-	}
-
-	tmap := reflect.TypeOf(m)
-	// types.EvalNode won't let us refer to non-exported types:
-	// print(tmap) // #@types *reflect.rtype
-	print(tmap) // @pointsto map[*int]*bool
-
-	zmap := reflect.Zero(tmap)
-	print(zmap)             // @pointsto <alloc in reflect.Zero>
-	print(zmap.Interface()) // @pointsto <alloc in reflect.Zero>
-
-	print(tmap.Key())                            // @pointsto *int
-	print(tmap.Elem())                           // @pointsto *bool
-	print(reflect.Zero(tmap.Key()))              // @pointsto <alloc in reflect.Zero>
-	print(reflect.Zero(tmap.Key()).Interface())  // @pointsto <alloc in reflect.Zero>
-	print(reflect.Zero(tmap.Key()).Interface())  // @types *int
-	print(reflect.Zero(tmap.Elem()))             // @pointsto <alloc in reflect.Zero>
-	print(reflect.Zero(tmap.Elem()).Interface()) // @pointsto <alloc in reflect.Zero>
-	print(reflect.Zero(tmap.Elem()).Interface()) // @types *bool
-}
-
-func reflectSetMapIndexInterface() {
-	// Exercises reflect.Value conversions to/from interfaces:
-	// a different code path than for concrete types.
-	m := make(map[interface{}]interface{})
-	reflect.ValueOf(m).SetMapIndex(reflect.ValueOf(&a), reflect.ValueOf(&b))
-	for k, v := range m {
-		print(k)         // @types *int
-		print(k.(*int))  // @pointsto main.a
-		print(v)         // @types *bool
-		print(v.(*bool)) // @pointsto main.b
-	}
-}
-
-func reflectSetMapIndexAssignable() {
-	// SetMapIndex performs implicit assignability conversions.
-	type I *int
-	type J *int
-
-	str := reflect.ValueOf("")
-
-	// *int is assignable to I.
-	m1 := make(map[string]I)
-	reflect.ValueOf(m1).SetMapIndex(str, reflect.ValueOf(new(int))) // @line int
-	print(m1[""])                                                   // @pointsto new@int:58
-
-	// I is assignable to I.
-	m2 := make(map[string]I)
-	reflect.ValueOf(m2).SetMapIndex(str, reflect.ValueOf(I(new(int)))) // @line I
-	print(m2[""])                                                      // @pointsto new@I:60
-
-	// J is not assignable to I.
-	m3 := make(map[string]I)
-	reflect.ValueOf(m3).SetMapIndex(str, reflect.ValueOf(J(new(int))))
-	print(m3[""]) // @pointsto
-}
-
-func reflectMakeMap() {
-	t := reflect.TypeOf(map[*int]*bool(nil))
-	v := reflect.MakeMap(t)
-	print(v) // @types map[*int]*bool
-	print(v) // @pointsto <alloc in reflect.MakeMap>
-}
-
-func main() {
-	reflectMapKeysIndex()
-	reflectSetMapIndex()
-	reflectSetMapIndexInterface()
-	reflectSetMapIndexAssignable()
-	reflectMakeMap()
-	// TODO(adonovan): reflect.MapOf(Type)
-}
diff --git a/third_party/gotools/go/pointer/testdata/maps.go b/third_party/gotools/go/pointer/testdata/maps.go
deleted file mode 100644
index 6f3751d..0000000
--- a/third_party/gotools/go/pointer/testdata/maps.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// +build ignore
-
-package main
-
-// Test of maps.
-
-var a, b, c int
-
-func maps1() {
-	m1 := map[*int]*int{&a: &b} // @line m1m1
-	m2 := make(map[*int]*int)   // @line m1m2
-	m2[&b] = &a
-
-	print(m1[nil]) // @pointsto main.b | main.c
-	print(m2[nil]) // @pointsto main.a
-
-	print(m1) // @pointsto makemap@m1m1:21
-	print(m2) // @pointsto makemap@m1m2:12
-
-	m1[&b] = &c
-
-	for k, v := range m1 {
-		print(k) // @pointsto main.a | main.b
-		print(v) // @pointsto main.b | main.c
-	}
-
-	for k, v := range m2 {
-		print(k) // @pointsto main.b
-		print(v) // @pointsto main.a
-	}
-
-	// Lookup doesn't create any aliases.
-	print(m2[&c]) // @pointsto main.a
-	if _, ok := m2[&a]; ok {
-		print(m2[&c]) // @pointsto main.a
-	}
-}
-
-func maps2() {
-	m1 := map[*int]*int{&a: &b}
-	m2 := map[*int]*int{&b: &c}
-	_ = []map[*int]*int{m1, m2} // (no spurious merging of m1, m2)
-
-	print(m1[nil]) // @pointsto main.b
-	print(m2[nil]) // @pointsto main.c
-}
-
-func main() {
-	maps1()
-	maps2()
-}
diff --git a/third_party/gotools/go/pointer/testdata/panic.go b/third_party/gotools/go/pointer/testdata/panic.go
deleted file mode 100644
index ee8a766..0000000
--- a/third_party/gotools/go/pointer/testdata/panic.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// +build ignore
-
-package main
-
-// Test of value flow from panic() to recover().
-// We model them as stores/loads of a global location.
-// We ignore concrete panic types originating from the runtime.
-
-var someval int
-
-type myPanic struct{}
-
-func f(int) {}
-
-func g() string { return "" }
-
-func deadcode() {
-	panic(123) // not reached
-}
-
-func main() {
-	switch someval {
-	case 0:
-		panic("oops")
-	case 1:
-		panic(myPanic{})
-	case 2:
-		panic(f)
-	case 3:
-		panic(g)
-	}
-	ex := recover()
-	print(ex)                 // @types myPanic | string | func(int) | func() string
-	print(ex.(func(int)))     // @pointsto main.f
-	print(ex.(func() string)) // @pointsto main.g
-}
diff --git a/third_party/gotools/go/pointer/testdata/recur.go b/third_party/gotools/go/pointer/testdata/recur.go
deleted file mode 100644
index 4c7229d..0000000
--- a/third_party/gotools/go/pointer/testdata/recur.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// +build ignore
-
-package main
-
-// Analysis abstraction of recursive calls is finite.
-
-func main() {
-	main()
-}
-
-// @calls main.main -> main.main
diff --git a/third_party/gotools/go/pointer/testdata/reflect.go b/third_party/gotools/go/pointer/testdata/reflect.go
deleted file mode 100644
index 6b8d0f2..0000000
--- a/third_party/gotools/go/pointer/testdata/reflect.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// +build ignore
-
-package main
-
-import "reflect"
-import "unsafe"
-
-var a, b int
-var unknown bool
-
-func reflectIndirect() {
-	ptr := &a
-	// Pointer:
-	print(reflect.Indirect(reflect.ValueOf(&ptr)).Interface().(*int)) // @pointsto main.a
-	// Non-pointer:
-	print(reflect.Indirect(reflect.ValueOf([]*int{ptr})).Interface().([]*int)[0]) // @pointsto main.a
-}
-
-func reflectNewAt() {
-	var x [8]byte
-	print(reflect.NewAt(reflect.TypeOf(3), unsafe.Pointer(&x)).Interface()) // @types *int
-}
-
-// @warning "unsound: main.reflectNewAt contains a reflect.NewAt.. call"
-
-func reflectTypeOf() {
-	t := reflect.TypeOf(3)
-	if unknown {
-		t = reflect.TypeOf("foo")
-	}
-	// TODO(adonovan): make types.Eval let us refer to unexported types.
-	print(t)                             // #@types *reflect.rtype
-	print(reflect.Zero(t).Interface())   // @types int | string
-	newint := reflect.New(t).Interface() // @line rtonew
-	print(newint)                        // @types *int | *string
-	print(newint.(*int))                 // @pointsto <alloc in reflect.New>
-	print(newint.(*string))              // @pointsto <alloc in reflect.New>
-}
-
-func reflectTypeElem() {
-	print(reflect.Zero(reflect.TypeOf(&a).Elem()).Interface())                       // @types int
-	print(reflect.Zero(reflect.TypeOf([]string{}).Elem()).Interface())               // @types string
-	print(reflect.Zero(reflect.TypeOf(make(chan bool)).Elem()).Interface())          // @types bool
-	print(reflect.Zero(reflect.TypeOf(make(map[string]float64)).Elem()).Interface()) // @types float64
-	print(reflect.Zero(reflect.TypeOf([3]complex64{}).Elem()).Interface())           // @types complex64
-	print(reflect.Zero(reflect.TypeOf(3).Elem()).Interface())                        // @types
-	print(reflect.Zero(reflect.TypeOf(new(interface{})).Elem()))                     // @types interface{}
-	print(reflect.Zero(reflect.TypeOf(new(interface{})).Elem()).Interface())         // @types
-}
-
-// reflect.Values within reflect.Values.
-func metareflection() {
-	// "box" a *int twice, unbox it twice.
-	v0 := reflect.ValueOf(&a)
-	print(v0)                              // @types *int
-	v1 := reflect.ValueOf(v0)              // box
-	print(v1)                              // @types reflect.Value
-	v2 := reflect.ValueOf(v1)              // box
-	print(v2)                              // @types reflect.Value
-	v1a := v2.Interface().(reflect.Value)  // unbox
-	print(v1a)                             // @types reflect.Value
-	v0a := v1a.Interface().(reflect.Value) // unbox
-	print(v0a)                             // @types *int
-	print(v0a.Interface().(*int))          // @pointsto main.a
-
-	// "box" an interface{} lvalue twice, unbox it twice.
-	var iface interface{} = 3
-	x0 := reflect.ValueOf(&iface).Elem()
-	print(x0)                              // @types interface{}
-	x1 := reflect.ValueOf(x0)              // box
-	print(x1)                              // @types reflect.Value
-	x2 := reflect.ValueOf(x1)              // box
-	print(x2)                              // @types reflect.Value
-	x1a := x2.Interface().(reflect.Value)  // unbox
-	print(x1a)                             // @types reflect.Value
-	x0a := x1a.Interface().(reflect.Value) // unbox
-	print(x0a)                             // @types interface{}
-	print(x0a.Interface())                 // @types int
-}
-
-type T struct{}
-
-// When the output of a type constructor flows to its input, we must
-// bound the set of types created to ensure termination of the algorithm.
-func typeCycle() {
-	t := reflect.TypeOf(0)
-	u := reflect.TypeOf("")
-	v := reflect.TypeOf(T{})
-	for unknown {
-		t = reflect.PtrTo(t)
-		t = reflect.SliceOf(t)
-
-		u = reflect.SliceOf(u)
-
-		if unknown {
-			v = reflect.ChanOf(reflect.BothDir, v)
-		} else {
-			v = reflect.PtrTo(v)
-		}
-	}
-
-	// Type height is bounded to about 4 map/slice/chan/pointer constructors.
-	print(reflect.Zero(t).Interface()) // @types int | []*int | []*[]*int
-	print(reflect.Zero(u).Interface()) // @types string | []string | [][]string | [][][]string | [][][][]string
-	print(reflect.Zero(v).Interface()) // @types T | *T | **T | ***T | ****T | chan T | *chan T | **chan T | chan *T | *chan *T | chan **T | chan ***T | chan chan T | chan *chan T | chan chan *T
-}
-
-func main() {
-	reflectIndirect()
-	reflectNewAt()
-	reflectTypeOf()
-	reflectTypeElem()
-	metareflection()
-	typeCycle()
-}
diff --git a/third_party/gotools/go/pointer/testdata/rtti.go b/third_party/gotools/go/pointer/testdata/rtti.go
deleted file mode 100644
index 826936d..0000000
--- a/third_party/gotools/go/pointer/testdata/rtti.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package main
-
-// Regression test for oracle crash
-// https://code.google.com/p/go/issues/detail?id=6605
-//
-// Using reflection, methods may be called on types that are not the
-// operand of any ssa.MakeInterface instruction.  In this example,
-// (Y).F is called by deriving the type Y from *Y.  Prior to the fix,
-// no RTTI (or method set) for type Y was included in the program, so
-// the F() call would crash.
-
-import "reflect"
-
-var a int
-
-type X struct{}
-
-func (X) F() *int {
-	return &a
-}
-
-type I interface {
-	F() *int
-}
-
-func main() {
-	type Y struct{ X }
-	print(reflect.Indirect(reflect.ValueOf(new(Y))).Interface().(I).F()) // @pointsto main.a
-}
diff --git a/third_party/gotools/go/pointer/testdata/structreflect.go b/third_party/gotools/go/pointer/testdata/structreflect.go
deleted file mode 100644
index 9fb49f5..0000000
--- a/third_party/gotools/go/pointer/testdata/structreflect.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// +build ignore
-
-package main
-
-import "reflect"
-
-type A struct {
-	f *int
-	g interface{}
-	h bool
-}
-
-var dyn string
-
-func reflectTypeFieldByName() {
-	f, _ := reflect.TypeOf(A{}).FieldByName("f")
-	print(f.Type) // @pointsto *int
-
-	g, _ := reflect.TypeOf(A{}).FieldByName("g")
-	print(g.Type)               // @pointsto interface{}
-	print(reflect.Zero(g.Type)) // @pointsto <alloc in reflect.Zero>
-	print(reflect.Zero(g.Type)) // @types interface{}
-
-	print(reflect.Zero(g.Type).Interface()) // @pointsto
-	print(reflect.Zero(g.Type).Interface()) // @types
-
-	h, _ := reflect.TypeOf(A{}).FieldByName("h")
-	print(h.Type) // @pointsto bool
-
-	missing, _ := reflect.TypeOf(A{}).FieldByName("missing")
-	print(missing.Type) // @pointsto
-
-	dyn, _ := reflect.TypeOf(A{}).FieldByName(dyn)
-	print(dyn.Type) // @pointsto *int | bool | interface{}
-}
-
-func reflectTypeField() {
-	fld := reflect.TypeOf(A{}).Field(0)
-	print(fld.Type) // @pointsto *int | bool | interface{}
-}
-
-func main() {
-	reflectTypeFieldByName()
-	reflectTypeField()
-}
diff --git a/third_party/gotools/go/pointer/testdata/structs.go b/third_party/gotools/go/pointer/testdata/structs.go
deleted file mode 100644
index 9036d60..0000000
--- a/third_party/gotools/go/pointer/testdata/structs.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// +build ignore
-
-package main
-
-var unknown bool // defeat dead-code elimination
-
-var p, q int
-
-type A struct {
-	f *int
-	g interface{}
-}
-
-func (a A) m1() {
-	print(a.f) // @pointsto main.p
-}
-
-func (a *A) m2() {
-	print(a)   // @pointsto complit.A@struct1s:9
-	print(a.f) // @pointsto main.p
-}
-
-type B struct {
-	h *int
-	A
-}
-
-func structs1() {
-	b := &B{ // @line struct1s
-		h: &q,
-	}
-	b.f = &p
-	b.g = b
-
-	print(b.h) // @pointsto main.q
-	print(b.f) // @pointsto main.p
-	print(b.g) // @types *B
-
-	ptr := &b.f
-	print(*ptr) // @pointsto main.p
-
-	b.m1()
-	b.m2()
-}
-
-// @calls main.structs1 -> (main.A).m1
-// @calls main.structs1 -> (*main.A).m2
-// @calls (*main.B).m1 -> (main.A).m1
-// @calls (*main.B).m2 -> (*main.A).m2
-
-type T struct {
-	x int
-	y int
-}
-
-type S struct {
-	a [3]T
-	b *[3]T
-	c [3]*T
-}
-
-func structs2() {
-	var s S          // @line s2s
-	print(&s)        // @pointsto s@s2s:6
-	print(&s.a)      // @pointsto s.a@s2s:6
-	print(&s.a[0])   // @pointsto s.a[*]@s2s:6
-	print(&s.a[0].x) // @pointsto s.a[*].x@s2s:6
-	print(&s.a[0].y) // @pointsto s.a[*].y@s2s:6
-	print(&s.b)      // @pointsto s.b@s2s:6
-	print(&s.b[0])   // @pointsto
-	print(&s.b[0].x) // @pointsto
-	print(&s.b[0].y) // @pointsto
-	print(&s.c)      // @pointsto s.c@s2s:6
-	print(&s.c[0])   // @pointsto s.c[*]@s2s:6
-	print(&s.c[0].x) // @pointsto
-	print(&s.c[0].y) // @pointsto
-
-	var s2 S          // @line s2s2
-	s2.b = new([3]T)  // @line s2s2b
-	print(s2.b)       // @pointsto new@s2s2b:12
-	print(&s2.b)      // @pointsto s2.b@s2s2:6
-	print(&s2.b[0])   // @pointsto new[*]@s2s2b:12
-	print(&s2.b[0].x) // @pointsto new[*].x@s2s2b:12
-	print(&s2.b[0].y) // @pointsto new[*].y@s2s2b:12
-	print(&s2.c[0].x) // @pointsto
-	print(&s2.c[0].y) // @pointsto
-
-	var s3 S          // @line s2s3
-	s3.c[2] = new(T)  // @line s2s3c
-	print(&s3.c)      // @pointsto s3.c@s2s3:6
-	print(s3.c[1])    // @pointsto new@s2s3c:15
-	print(&s3.c[1])   // @pointsto s3.c[*]@s2s3:6
-	print(&s3.c[1].x) // @pointsto new.x@s2s3c:15
-	print(&s3.c[1].y) // @pointsto new.y@s2s3c:15
-}
-
-func main() {
-	structs1()
-	structs2()
-}
diff --git a/third_party/gotools/go/pointer/testdata/timer.go b/third_party/gotools/go/pointer/testdata/timer.go
deleted file mode 100644
index 465d081..0000000
--- a/third_party/gotools/go/pointer/testdata/timer.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// +build ignore
-
-package main
-
-import "time"
-
-func after() {}
-
-func main() {
-	// @calls time.startTimer -> time.sendTime
-	ticker := time.NewTicker(1)
-	<-ticker.C
-
-	// @calls time.startTimer -> time.sendTime
-	timer := time.NewTimer(time.Second)
-	<-timer.C
-
-	// @calls time.startTimer -> time.goFunc
-	// @calls time.goFunc -> main.after
-	timer = time.AfterFunc(time.Second, after)
-	<-timer.C
-}
-
-// @calls time.sendTime -> time.Now
diff --git a/third_party/gotools/go/pointer/util.go b/third_party/gotools/go/pointer/util.go
deleted file mode 100644
index ff854b1..0000000
--- a/third_party/gotools/go/pointer/util.go
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package pointer
-
-import (
-	"bytes"
-	"fmt"
-	"log"
-	"os"
-	"os/exec"
-	"runtime"
-	"time"
-
-	"llvm.org/llgo/third_party/gotools/container/intsets"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// CanPoint reports whether the type T is pointerlike,
-// for the purposes of this analysis.
-func CanPoint(T types.Type) bool {
-	switch T := T.(type) {
-	case *types.Named:
-		if obj := T.Obj(); obj.Name() == "Value" && obj.Pkg().Path() == "reflect" {
-			return true // treat reflect.Value like interface{}
-		}
-		return CanPoint(T.Underlying())
-
-	case *types.Pointer, *types.Interface, *types.Map, *types.Chan, *types.Signature, *types.Slice:
-		return true
-	}
-
-	return false // array struct tuple builtin basic
-}
-
-// CanHaveDynamicTypes reports whether the type T can "hold" dynamic types,
-// i.e. is an interface (incl. reflect.Type) or a reflect.Value.
-//
-func CanHaveDynamicTypes(T types.Type) bool {
-	switch T := T.(type) {
-	case *types.Named:
-		if obj := T.Obj(); obj.Name() == "Value" && obj.Pkg().Path() == "reflect" {
-			return true // reflect.Value
-		}
-		return CanHaveDynamicTypes(T.Underlying())
-	case *types.Interface:
-		return true
-	}
-	return false
-}
-
-func isInterface(T types.Type) bool { return types.IsInterface(T) }
-
-// mustDeref returns the element type of its argument, which must be a
-// pointer; panic ensues otherwise.
-func mustDeref(typ types.Type) types.Type {
-	return typ.Underlying().(*types.Pointer).Elem()
-}
-
-// deref returns a pointer's element type; otherwise it returns typ.
-func deref(typ types.Type) types.Type {
-	if p, ok := typ.Underlying().(*types.Pointer); ok {
-		return p.Elem()
-	}
-	return typ
-}
-
-// A fieldInfo describes one subelement (node) of the flattening-out
-// of a type T: the subelement's type and its path from the root of T.
-//
-// For example, for this type:
-//     type line struct{ points []struct{x, y int} }
-// flatten() of the inner struct yields the following []fieldInfo:
-//    struct{ x, y int }                      ""
-//    int                                     ".x"
-//    int                                     ".y"
-// and flatten(line) yields:
-//    struct{ points []struct{x, y int} }     ""
-//    struct{ x, y int }                      ".points[*]"
-//    int                                     ".points[*].x
-//    int                                     ".points[*].y"
-//
-type fieldInfo struct {
-	typ types.Type
-
-	// op and tail describe the path to the element (e.g. ".a#2.b[*].c").
-	op   interface{} // *Array: true; *Tuple: int; *Struct: *types.Var; *Named: nil
-	tail *fieldInfo
-}
-
-// path returns a user-friendly string describing the subelement path.
-//
-func (fi *fieldInfo) path() string {
-	var buf bytes.Buffer
-	for p := fi; p != nil; p = p.tail {
-		switch op := p.op.(type) {
-		case bool:
-			fmt.Fprintf(&buf, "[*]")
-		case int:
-			fmt.Fprintf(&buf, "#%d", op)
-		case *types.Var:
-			fmt.Fprintf(&buf, ".%s", op.Name())
-		}
-	}
-	return buf.String()
-}
-
-// flatten returns a list of directly contained fields in the preorder
-// traversal of the type tree of t.  The resulting elements are all
-// scalars (basic types or pointerlike types), except for struct/array
-// "identity" nodes, whose type is that of the aggregate.
-//
-// reflect.Value is considered pointerlike, similar to interface{}.
-//
-// Callers must not mutate the result.
-//
-func (a *analysis) flatten(t types.Type) []*fieldInfo {
-	fl, ok := a.flattenMemo[t]
-	if !ok {
-		switch t := t.(type) {
-		case *types.Named:
-			u := t.Underlying()
-			if isInterface(u) {
-				// Debuggability hack: don't remove
-				// the named type from interfaces as
-				// they're very verbose.
-				fl = append(fl, &fieldInfo{typ: t})
-			} else {
-				fl = a.flatten(u)
-			}
-
-		case *types.Basic,
-			*types.Signature,
-			*types.Chan,
-			*types.Map,
-			*types.Interface,
-			*types.Slice,
-			*types.Pointer:
-			fl = append(fl, &fieldInfo{typ: t})
-
-		case *types.Array:
-			fl = append(fl, &fieldInfo{typ: t}) // identity node
-			for _, fi := range a.flatten(t.Elem()) {
-				fl = append(fl, &fieldInfo{typ: fi.typ, op: true, tail: fi})
-			}
-
-		case *types.Struct:
-			fl = append(fl, &fieldInfo{typ: t}) // identity node
-			for i, n := 0, t.NumFields(); i < n; i++ {
-				f := t.Field(i)
-				for _, fi := range a.flatten(f.Type()) {
-					fl = append(fl, &fieldInfo{typ: fi.typ, op: f, tail: fi})
-				}
-			}
-
-		case *types.Tuple:
-			// No identity node: tuples are never address-taken.
-			n := t.Len()
-			if n == 1 {
-				// Don't add a fieldInfo link for singletons,
-				// e.g. in params/results.
-				fl = append(fl, a.flatten(t.At(0).Type())...)
-			} else {
-				for i := 0; i < n; i++ {
-					f := t.At(i)
-					for _, fi := range a.flatten(f.Type()) {
-						fl = append(fl, &fieldInfo{typ: fi.typ, op: i, tail: fi})
-					}
-				}
-			}
-
-		default:
-			panic(t)
-		}
-
-		a.flattenMemo[t] = fl
-	}
-
-	return fl
-}
-
-// sizeof returns the number of pointerlike abstractions (nodes) in the type t.
-func (a *analysis) sizeof(t types.Type) uint32 {
-	return uint32(len(a.flatten(t)))
-}
-
-// shouldTrack reports whether object type T contains (recursively)
-// any fields whose addresses should be tracked.
-func (a *analysis) shouldTrack(T types.Type) bool {
-	if a.track == trackAll {
-		return true // fast path
-	}
-	track, ok := a.trackTypes[T]
-	if !ok {
-		a.trackTypes[T] = true // break cycles conservatively
-		// NB: reflect.Value, reflect.Type are pre-populated to true.
-		for _, fi := range a.flatten(T) {
-			switch ft := fi.typ.Underlying().(type) {
-			case *types.Interface, *types.Signature:
-				track = true // needed for callgraph
-			case *types.Basic:
-				// no-op
-			case *types.Chan:
-				track = a.track&trackChan != 0 || a.shouldTrack(ft.Elem())
-			case *types.Map:
-				track = a.track&trackMap != 0 || a.shouldTrack(ft.Key()) || a.shouldTrack(ft.Elem())
-			case *types.Slice:
-				track = a.track&trackSlice != 0 || a.shouldTrack(ft.Elem())
-			case *types.Pointer:
-				track = a.track&trackPtr != 0 || a.shouldTrack(ft.Elem())
-			case *types.Array, *types.Struct:
-				// No need to look at field types since they will follow (flattened).
-			default:
-				// Includes *types.Tuple, which are never address-taken.
-				panic(ft)
-			}
-			if track {
-				break
-			}
-		}
-		a.trackTypes[T] = track
-		if !track && a.log != nil {
-			fmt.Fprintf(a.log, "\ttype not tracked: %s\n", T)
-		}
-	}
-	return track
-}
-
-// offsetOf returns the (abstract) offset of field index within struct
-// or tuple typ.
-func (a *analysis) offsetOf(typ types.Type, index int) uint32 {
-	var offset uint32
-	switch t := typ.Underlying().(type) {
-	case *types.Tuple:
-		for i := 0; i < index; i++ {
-			offset += a.sizeof(t.At(i).Type())
-		}
-	case *types.Struct:
-		offset++ // the node for the struct itself
-		for i := 0; i < index; i++ {
-			offset += a.sizeof(t.Field(i).Type())
-		}
-	default:
-		panic(fmt.Sprintf("offsetOf(%s : %T)", typ, typ))
-	}
-	return offset
-}
-
-// sliceToArray returns the type representing the arrays to which
-// slice type slice points.
-func sliceToArray(slice types.Type) *types.Array {
-	return types.NewArray(slice.Underlying().(*types.Slice).Elem(), 1)
-}
-
-// Node set -------------------------------------------------------------------
-
-type nodeset struct {
-	intsets.Sparse
-}
-
-func (ns *nodeset) String() string {
-	var buf bytes.Buffer
-	buf.WriteRune('{')
-	var space [50]int
-	for i, n := range ns.AppendTo(space[:0]) {
-		if i > 0 {
-			buf.WriteString(", ")
-		}
-		buf.WriteRune('n')
-		fmt.Fprintf(&buf, "%d", n)
-	}
-	buf.WriteRune('}')
-	return buf.String()
-}
-
-func (ns *nodeset) add(n nodeid) bool {
-	return ns.Sparse.Insert(int(n))
-}
-
-func (x *nodeset) addAll(y *nodeset) bool {
-	return x.UnionWith(&y.Sparse)
-}
-
-// Profiling & debugging -------------------------------------------------------
-
-var timers = make(map[string]time.Time)
-
-func start(name string) {
-	if debugTimers {
-		timers[name] = time.Now()
-		log.Printf("%s...\n", name)
-	}
-}
-
-func stop(name string) {
-	if debugTimers {
-		log.Printf("%s took %s\n", name, time.Since(timers[name]))
-	}
-}
-
-// diff runs the command "diff a b" and reports its success.
-func diff(a, b string) bool {
-	var cmd *exec.Cmd
-	switch runtime.GOOS {
-	case "plan9":
-		cmd = exec.Command("/bin/diff", "-c", a, b)
-	default:
-		cmd = exec.Command("/usr/bin/diff", "-u", a, b)
-	}
-	cmd.Stdout = os.Stderr
-	cmd.Stderr = os.Stderr
-	return cmd.Run() == nil
-}
diff --git a/third_party/gotools/go/ssa/blockopt.go b/third_party/gotools/go/ssa/blockopt.go
deleted file mode 100644
index e79260a..0000000
--- a/third_party/gotools/go/ssa/blockopt.go
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// Simple block optimizations to simplify the control flow graph.
-
-// TODO(adonovan): opt: instead of creating several "unreachable" blocks
-// per function in the Builder, reuse a single one (e.g. at Blocks[1])
-// to reduce garbage.
-
-import (
-	"fmt"
-	"os"
-)
-
-// If true, perform sanity checking and show progress at each
-// successive iteration of optimizeBlocks.  Very verbose.
-const debugBlockOpt = false
-
-// markReachable sets Index=-1 for all blocks reachable from b.
-func markReachable(b *BasicBlock) {
-	b.Index = -1
-	for _, succ := range b.Succs {
-		if succ.Index == 0 {
-			markReachable(succ)
-		}
-	}
-}
-
-// deleteUnreachableBlocks marks all reachable blocks of f and
-// eliminates (nils) all others, including possibly cyclic subgraphs.
-//
-func deleteUnreachableBlocks(f *Function) {
-	const white, black = 0, -1
-	// We borrow b.Index temporarily as the mark bit.
-	for _, b := range f.Blocks {
-		b.Index = white
-	}
-	markReachable(f.Blocks[0])
-	if f.Recover != nil {
-		markReachable(f.Recover)
-	}
-	for i, b := range f.Blocks {
-		if b.Index == white {
-			for _, c := range b.Succs {
-				if c.Index == black {
-					c.removePred(b) // delete white->black edge
-				}
-			}
-			if debugBlockOpt {
-				fmt.Fprintln(os.Stderr, "unreachable", b)
-			}
-			f.Blocks[i] = nil // delete b
-		}
-	}
-	f.removeNilBlocks()
-}
-
-// jumpThreading attempts to apply simple jump-threading to block b,
-// in which a->b->c become a->c if b is just a Jump.
-// The result is true if the optimization was applied.
-//
-func jumpThreading(f *Function, b *BasicBlock) bool {
-	if b.Index == 0 {
-		return false // don't apply to entry block
-	}
-	if b.Instrs == nil {
-		return false
-	}
-	if _, ok := b.Instrs[0].(*Jump); !ok {
-		return false // not just a jump
-	}
-	c := b.Succs[0]
-	if c == b {
-		return false // don't apply to degenerate jump-to-self.
-	}
-	if c.hasPhi() {
-		return false // not sound without more effort
-	}
-	for j, a := range b.Preds {
-		a.replaceSucc(b, c)
-
-		// If a now has two edges to c, replace its degenerate If by Jump.
-		if len(a.Succs) == 2 && a.Succs[0] == c && a.Succs[1] == c {
-			jump := new(Jump)
-			jump.setBlock(a)
-			a.Instrs[len(a.Instrs)-1] = jump
-			a.Succs = a.Succs[:1]
-			c.removePred(b)
-		} else {
-			if j == 0 {
-				c.replacePred(b, a)
-			} else {
-				c.Preds = append(c.Preds, a)
-			}
-		}
-
-		if debugBlockOpt {
-			fmt.Fprintln(os.Stderr, "jumpThreading", a, b, c)
-		}
-	}
-	f.Blocks[b.Index] = nil // delete b
-	return true
-}
-
-// fuseBlocks attempts to apply the block fusion optimization to block
-// a, in which a->b becomes ab if len(a.Succs)==len(b.Preds)==1.
-// The result is true if the optimization was applied.
-//
-func fuseBlocks(f *Function, a *BasicBlock) bool {
-	if len(a.Succs) != 1 {
-		return false
-	}
-	b := a.Succs[0]
-	if len(b.Preds) != 1 {
-		return false
-	}
-
-	// Degenerate &&/|| ops may result in a straight-line CFG
-	// containing φ-nodes. (Ideally we'd replace such them with
-	// their sole operand but that requires Referrers, built later.)
-	if b.hasPhi() {
-		return false // not sound without further effort
-	}
-
-	// Eliminate jump at end of A, then copy all of B across.
-	a.Instrs = append(a.Instrs[:len(a.Instrs)-1], b.Instrs...)
-	for _, instr := range b.Instrs {
-		instr.setBlock(a)
-	}
-
-	// A inherits B's successors
-	a.Succs = append(a.succs2[:0], b.Succs...)
-
-	// Fix up Preds links of all successors of B.
-	for _, c := range b.Succs {
-		c.replacePred(b, a)
-	}
-
-	if debugBlockOpt {
-		fmt.Fprintln(os.Stderr, "fuseBlocks", a, b)
-	}
-
-	f.Blocks[b.Index] = nil // delete b
-	return true
-}
-
-// optimizeBlocks() performs some simple block optimizations on a
-// completed function: dead block elimination, block fusion, jump
-// threading.
-//
-func optimizeBlocks(f *Function) {
-	deleteUnreachableBlocks(f)
-
-	// Loop until no further progress.
-	changed := true
-	for changed {
-		changed = false
-
-		if debugBlockOpt {
-			f.WriteTo(os.Stderr)
-			mustSanityCheck(f, nil)
-		}
-
-		for _, b := range f.Blocks {
-			// f.Blocks will temporarily contain nils to indicate
-			// deleted blocks; we remove them at the end.
-			if b == nil {
-				continue
-			}
-
-			// Fuse blocks.  b->c becomes bc.
-			if fuseBlocks(f, b) {
-				changed = true
-			}
-
-			// a->b->c becomes a->c if b contains only a Jump.
-			if jumpThreading(f, b) {
-				changed = true
-				continue // (b was disconnected)
-			}
-		}
-	}
-	f.removeNilBlocks()
-}
diff --git a/third_party/gotools/go/ssa/builder.go b/third_party/gotools/go/ssa/builder.go
deleted file mode 100644
index 3437346..0000000
--- a/third_party/gotools/go/ssa/builder.go
+++ /dev/null
@@ -1,2365 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the BUILD phase of SSA construction.
-//
-// SSA construction has two phases, CREATE and BUILD.  In the CREATE phase
-// (create.go), all packages are constructed and type-checked and
-// definitions of all package members are created, method-sets are
-// computed, and wrapper methods are synthesized.
-// ssa.Packages are created in arbitrary order.
-//
-// In the BUILD phase (builder.go), the builder traverses the AST of
-// each Go source function and generates SSA instructions for the
-// function body.  Initializer expressions for package-level variables
-// are emitted to the package's init() function in the order specified
-// by go/types.Info.InitOrder, then code for each function in the
-// package is generated in lexical order.
-// The BUILD phases for distinct packages are independent and are
-// executed in parallel.
-//
-// TODO(adonovan): indeed, building functions is now embarrassingly parallel.
-// Audit for concurrency then benchmark using more goroutines.
-//
-// The builder's and Program's indices (maps) are populated and
-// mutated during the CREATE phase, but during the BUILD phase they
-// remain constant.  The sole exception is Prog.methodSets and its
-// related maps, which are protected by a dedicated mutex.
-
-import (
-	"fmt"
-	"go/ast"
-	"go/token"
-	"os"
-	"sync"
-	"sync/atomic"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-type opaqueType struct {
-	types.Type
-	name string
-}
-
-func (t *opaqueType) String() string { return t.name }
-
-var (
-	varOk    = newVar("ok", tBool)
-	varIndex = newVar("index", tInt)
-
-	// Type constants.
-	tBool       = types.Typ[types.Bool]
-	tByte       = types.Typ[types.Byte]
-	tInt        = types.Typ[types.Int]
-	tInvalid    = types.Typ[types.Invalid]
-	tString     = types.Typ[types.String]
-	tUntypedNil = types.Typ[types.UntypedNil]
-	tRangeIter  = &opaqueType{nil, "iter"} // the type of all "range" iterators
-	tEface      = new(types.Interface)
-
-	// SSA Value constants.
-	vZero = intConst(0)
-	vOne  = intConst(1)
-	vTrue = NewConst(exact.MakeBool(true), tBool)
-)
-
-// builder holds state associated with the package currently being built.
-// Its methods contain all the logic for AST-to-SSA conversion.
-type builder struct{}
-
-// cond emits to fn code to evaluate boolean condition e and jump
-// to t or f depending on its value, performing various simplifications.
-//
-// Postcondition: fn.currentBlock is nil.
-//
-func (b *builder) cond(fn *Function, e ast.Expr, t, f *BasicBlock) {
-	switch e := e.(type) {
-	case *ast.ParenExpr:
-		b.cond(fn, e.X, t, f)
-		return
-
-	case *ast.BinaryExpr:
-		switch e.Op {
-		case token.LAND:
-			ltrue := fn.newBasicBlock("cond.true")
-			b.cond(fn, e.X, ltrue, f)
-			fn.currentBlock = ltrue
-			b.cond(fn, e.Y, t, f)
-			return
-
-		case token.LOR:
-			lfalse := fn.newBasicBlock("cond.false")
-			b.cond(fn, e.X, t, lfalse)
-			fn.currentBlock = lfalse
-			b.cond(fn, e.Y, t, f)
-			return
-		}
-
-	case *ast.UnaryExpr:
-		if e.Op == token.NOT {
-			b.cond(fn, e.X, f, t)
-			return
-		}
-	}
-
-	// A traditional compiler would simplify "if false" (etc) here
-	// but we do not, for better fidelity to the source code.
-	//
-	// The value of a constant condition may be platform-specific,
-	// and may cause blocks that are reachable in some configuration
-	// to be hidden from subsequent analyses such as bug-finding tools.
-	emitIf(fn, b.expr(fn, e), t, f)
-}
-
-// logicalBinop emits code to fn to evaluate e, a &&- or
-// ||-expression whose reified boolean value is wanted.
-// The value is returned.
-//
-func (b *builder) logicalBinop(fn *Function, e *ast.BinaryExpr) Value {
-	rhs := fn.newBasicBlock("binop.rhs")
-	done := fn.newBasicBlock("binop.done")
-
-	// T(e) = T(e.X) = T(e.Y) after untyped constants have been
-	// eliminated.
-	// TODO(adonovan): not true; MyBool==MyBool yields UntypedBool.
-	t := fn.Pkg.typeOf(e)
-
-	var short Value // value of the short-circuit path
-	switch e.Op {
-	case token.LAND:
-		b.cond(fn, e.X, rhs, done)
-		short = NewConst(exact.MakeBool(false), t)
-
-	case token.LOR:
-		b.cond(fn, e.X, done, rhs)
-		short = NewConst(exact.MakeBool(true), t)
-	}
-
-	// Is rhs unreachable?
-	if rhs.Preds == nil {
-		// Simplify false&&y to false, true||y to true.
-		fn.currentBlock = done
-		return short
-	}
-
-	// Is done unreachable?
-	if done.Preds == nil {
-		// Simplify true&&y (or false||y) to y.
-		fn.currentBlock = rhs
-		return b.expr(fn, e.Y)
-	}
-
-	// All edges from e.X to done carry the short-circuit value.
-	var edges []Value
-	for _ = range done.Preds {
-		edges = append(edges, short)
-	}
-
-	// The edge from e.Y to done carries the value of e.Y.
-	fn.currentBlock = rhs
-	edges = append(edges, b.expr(fn, e.Y))
-	emitJump(fn, done)
-	fn.currentBlock = done
-
-	phi := &Phi{Edges: edges, Comment: e.Op.String()}
-	phi.pos = e.OpPos
-	phi.typ = t
-	return done.emit(phi)
-}
-
-// exprN lowers a multi-result expression e to SSA form, emitting code
-// to fn and returning a single Value whose type is a *types.Tuple.
-// The caller must access the components via Extract.
-//
-// Multi-result expressions include CallExprs in a multi-value
-// assignment or return statement, and "value,ok" uses of
-// TypeAssertExpr, IndexExpr (when X is a map), and UnaryExpr (when Op
-// is token.ARROW).
-//
-func (b *builder) exprN(fn *Function, e ast.Expr) Value {
-	typ := fn.Pkg.typeOf(e).(*types.Tuple)
-	switch e := e.(type) {
-	case *ast.ParenExpr:
-		return b.exprN(fn, e.X)
-
-	case *ast.CallExpr:
-		// Currently, no built-in function nor type conversion
-		// has multiple results, so we can avoid some of the
-		// cases for single-valued CallExpr.
-		var c Call
-		b.setCall(fn, e, &c.Call)
-		c.typ = typ
-		return fn.emit(&c)
-
-	case *ast.IndexExpr:
-		mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
-		lookup := &Lookup{
-			X:       b.expr(fn, e.X),
-			Index:   emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
-			CommaOk: true,
-		}
-		lookup.setType(typ)
-		lookup.setPos(e.Lbrack)
-		return fn.emit(lookup)
-
-	case *ast.TypeAssertExpr:
-		return emitTypeTest(fn, b.expr(fn, e.X), typ.At(0).Type(), e.Lparen)
-
-	case *ast.UnaryExpr: // must be receive <-
-		unop := &UnOp{
-			Op:      token.ARROW,
-			X:       b.expr(fn, e.X),
-			CommaOk: true,
-		}
-		unop.setType(typ)
-		unop.setPos(e.OpPos)
-		return fn.emit(unop)
-	}
-	panic(fmt.Sprintf("exprN(%T) in %s", e, fn))
-}
-
-// builtin emits to fn SSA instructions to implement a call to the
-// built-in function obj with the specified arguments
-// and return type.  It returns the value defined by the result.
-//
-// The result is nil if no special handling was required; in this case
-// the caller should treat this like an ordinary library function
-// call.
-//
-func (b *builder) builtin(fn *Function, obj *types.Builtin, args []ast.Expr, typ types.Type, pos token.Pos) Value {
-	switch obj.Name() {
-	case "make":
-		switch typ.Underlying().(type) {
-		case *types.Slice:
-			n := b.expr(fn, args[1])
-			m := n
-			if len(args) == 3 {
-				m = b.expr(fn, args[2])
-			}
-			if m, ok := m.(*Const); ok {
-				// treat make([]T, n, m) as new([m]T)[:n]
-				cap, _ := exact.Int64Val(m.Value)
-				at := types.NewArray(typ.Underlying().(*types.Slice).Elem(), cap)
-				alloc := emitNew(fn, at, pos)
-				alloc.Comment = "makeslice"
-				v := &Slice{
-					X:    alloc,
-					High: n,
-				}
-				v.setPos(pos)
-				v.setType(typ)
-				return fn.emit(v)
-			}
-			v := &MakeSlice{
-				Len: n,
-				Cap: m,
-			}
-			v.setPos(pos)
-			v.setType(typ)
-			return fn.emit(v)
-
-		case *types.Map:
-			var res Value
-			if len(args) == 2 {
-				res = b.expr(fn, args[1])
-			}
-			v := &MakeMap{Reserve: res}
-			v.setPos(pos)
-			v.setType(typ)
-			return fn.emit(v)
-
-		case *types.Chan:
-			var sz Value = vZero
-			if len(args) == 2 {
-				sz = b.expr(fn, args[1])
-			}
-			v := &MakeChan{Size: sz}
-			v.setPos(pos)
-			v.setType(typ)
-			return fn.emit(v)
-		}
-
-	case "new":
-		alloc := emitNew(fn, deref(typ), pos)
-		alloc.Comment = "new"
-		return alloc
-
-	case "len", "cap":
-		// Special case: len or cap of an array or *array is
-		// based on the type, not the value which may be nil.
-		// We must still evaluate the value, though.  (If it
-		// was side-effect free, the whole call would have
-		// been constant-folded.)
-		t := deref(fn.Pkg.typeOf(args[0])).Underlying()
-		if at, ok := t.(*types.Array); ok {
-			b.expr(fn, args[0]) // for effects only
-			return intConst(at.Len())
-		}
-		// Otherwise treat as normal.
-
-	case "panic":
-		fn.emit(&Panic{
-			X:   emitConv(fn, b.expr(fn, args[0]), tEface),
-			pos: pos,
-		})
-		fn.currentBlock = fn.newBasicBlock("unreachable")
-		return vTrue // any non-nil Value will do
-	}
-	return nil // treat all others as a regular function call
-}
-
-// addr lowers a single-result addressable expression e to SSA form,
-// emitting code to fn and returning the location (an lvalue) defined
-// by the expression.
-//
-// If escaping is true, addr marks the base variable of the
-// addressable expression e as being a potentially escaping pointer
-// value.  For example, in this code:
-//
-//   a := A{
-//     b: [1]B{B{c: 1}}
-//   }
-//   return &a.b[0].c
-//
-// the application of & causes a.b[0].c to have its address taken,
-// which means that ultimately the local variable a must be
-// heap-allocated.  This is a simple but very conservative escape
-// analysis.
-//
-// Operations forming potentially escaping pointers include:
-// - &x, including when implicit in method call or composite literals.
-// - a[:] iff a is an array (not *array)
-// - references to variables in lexically enclosing functions.
-//
-func (b *builder) addr(fn *Function, e ast.Expr, escaping bool) lvalue {
-	switch e := e.(type) {
-	case *ast.Ident:
-		if isBlankIdent(e) {
-			return blank{}
-		}
-		obj := fn.Pkg.objectOf(e)
-		v := fn.Prog.packageLevelValue(obj) // var (address)
-		if v == nil {
-			v = fn.lookup(obj, escaping)
-		}
-		return &address{addr: v, pos: e.Pos(), expr: e}
-
-	case *ast.CompositeLit:
-		t := deref(fn.Pkg.typeOf(e))
-		var v *Alloc
-		if escaping {
-			v = emitNew(fn, t, e.Lbrace)
-		} else {
-			v = fn.addLocal(t, e.Lbrace)
-		}
-		v.Comment = "complit"
-		var sb storebuf
-		b.compLit(fn, v, e, true, &sb)
-		sb.emit(fn)
-		return &address{addr: v, pos: e.Lbrace, expr: e}
-
-	case *ast.ParenExpr:
-		return b.addr(fn, e.X, escaping)
-
-	case *ast.SelectorExpr:
-		sel, ok := fn.Pkg.info.Selections[e]
-		if !ok {
-			// qualified identifier
-			return b.addr(fn, e.Sel, escaping)
-		}
-		if sel.Kind() != types.FieldVal {
-			panic(sel)
-		}
-		wantAddr := true
-		v := b.receiver(fn, e.X, wantAddr, escaping, sel)
-		last := len(sel.Index()) - 1
-		return &address{
-			addr: emitFieldSelection(fn, v, sel.Index()[last], true, e.Sel),
-			pos:  e.Sel.Pos(),
-			expr: e.Sel,
-		}
-
-	case *ast.IndexExpr:
-		var x Value
-		var et types.Type
-		switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
-		case *types.Array:
-			x = b.addr(fn, e.X, escaping).address(fn)
-			et = types.NewPointer(t.Elem())
-		case *types.Pointer: // *array
-			x = b.expr(fn, e.X)
-			et = types.NewPointer(t.Elem().Underlying().(*types.Array).Elem())
-		case *types.Slice:
-			x = b.expr(fn, e.X)
-			et = types.NewPointer(t.Elem())
-		case *types.Map:
-			return &element{
-				m:   b.expr(fn, e.X),
-				k:   emitConv(fn, b.expr(fn, e.Index), t.Key()),
-				t:   t.Elem(),
-				pos: e.Lbrack,
-			}
-		default:
-			panic("unexpected container type in IndexExpr: " + t.String())
-		}
-		v := &IndexAddr{
-			X:     x,
-			Index: emitConv(fn, b.expr(fn, e.Index), tInt),
-		}
-		v.setPos(e.Lbrack)
-		v.setType(et)
-		return &address{addr: fn.emit(v), pos: e.Lbrack, expr: e}
-
-	case *ast.StarExpr:
-		return &address{addr: b.expr(fn, e.X), pos: e.Star, expr: e}
-	}
-
-	panic(fmt.Sprintf("unexpected address expression: %T", e))
-}
-
-type store struct {
-	lhs lvalue
-	rhs Value
-}
-
-type storebuf struct{ stores []store }
-
-func (sb *storebuf) store(lhs lvalue, rhs Value) {
-	sb.stores = append(sb.stores, store{lhs, rhs})
-}
-
-func (sb *storebuf) emit(fn *Function) {
-	for _, s := range sb.stores {
-		s.lhs.store(fn, s.rhs)
-	}
-}
-
-// assign emits to fn code to initialize the lvalue loc with the value
-// of expression e.  If isZero is true, assign assumes that loc holds
-// the zero value for its type.
-//
-// This is equivalent to loc.store(fn, b.expr(fn, e)), but may generate
-// better code in some cases, e.g., for composite literals in an
-// addressable location.
-//
-// If sb is not nil, assign generates code to evaluate expression e, but
-// not to update loc.  Instead, the necessary stores are appended to the
-// storebuf sb so that they can be executed later.  This allows correct
-// in-place update of existing variables when the RHS is a composite
-// literal that may reference parts of the LHS.
-//
-func (b *builder) assign(fn *Function, loc lvalue, e ast.Expr, isZero bool, sb *storebuf) {
-	// Can we initialize it in place?
-	if e, ok := unparen(e).(*ast.CompositeLit); ok {
-		// A CompositeLit never evaluates to a pointer,
-		// so if the type of the location is a pointer,
-		// an &-operation is implied.
-		if _, ok := loc.(blank); !ok { // avoid calling blank.typ()
-			if isPointer(loc.typ()) {
-				ptr := b.addr(fn, e, true).address(fn)
-				// copy address
-				if sb != nil {
-					sb.store(loc, ptr)
-				} else {
-					loc.store(fn, ptr)
-				}
-				return
-			}
-		}
-
-		if _, ok := loc.(*address); ok {
-			if isInterface(loc.typ()) {
-				// e.g. var x interface{} = T{...}
-				// Can't in-place initialize an interface value.
-				// Fall back to copying.
-			} else {
-				// x = T{...} or x := T{...}
-				addr := loc.address(fn)
-				if sb != nil {
-					b.compLit(fn, addr, e, isZero, sb)
-				} else {
-					var sb storebuf
-					b.compLit(fn, addr, e, isZero, &sb)
-					sb.emit(fn)
-				}
-
-				// Subtle: emit debug ref for aggregate types only;
-				// slice and map are handled by store ops in compLit.
-				switch loc.typ().Underlying().(type) {
-				case *types.Struct, *types.Array:
-					emitDebugRef(fn, e, addr, true)
-				}
-
-				return
-			}
-		}
-	}
-
-	// simple case: just copy
-	rhs := b.expr(fn, e)
-	if sb != nil {
-		sb.store(loc, rhs)
-	} else {
-		loc.store(fn, rhs)
-	}
-}
-
-// expr lowers a single-result expression e to SSA form, emitting code
-// to fn and returning the Value defined by the expression.
-//
-func (b *builder) expr(fn *Function, e ast.Expr) Value {
-	e = unparen(e)
-
-	tv := fn.Pkg.info.Types[e]
-
-	// Is expression a constant?
-	if tv.Value != nil {
-		return NewConst(tv.Value, tv.Type)
-	}
-
-	var v Value
-	if tv.Addressable() {
-		// Prefer pointer arithmetic ({Index,Field}Addr) followed
-		// by Load over subelement extraction (e.g. Index, Field),
-		// to avoid large copies.
-		v = b.addr(fn, e, false).load(fn)
-	} else {
-		v = b.expr0(fn, e, tv)
-	}
-	if fn.debugInfo() {
-		emitDebugRef(fn, e, v, false)
-	}
-	return v
-}
-
-func (b *builder) expr0(fn *Function, e ast.Expr, tv types.TypeAndValue) Value {
-	switch e := e.(type) {
-	case *ast.BasicLit:
-		panic("non-constant BasicLit") // unreachable
-
-	case *ast.FuncLit:
-		fn2 := &Function{
-			name:      fmt.Sprintf("%s$%d", fn.Name(), 1+len(fn.AnonFuncs)),
-			Signature: fn.Pkg.typeOf(e.Type).Underlying().(*types.Signature),
-			pos:       e.Type.Func,
-			parent:    fn,
-			Pkg:       fn.Pkg,
-			Prog:      fn.Prog,
-			syntax:    e,
-		}
-		fn.AnonFuncs = append(fn.AnonFuncs, fn2)
-		b.buildFunction(fn2)
-		if fn2.FreeVars == nil {
-			return fn2
-		}
-		v := &MakeClosure{Fn: fn2}
-		v.setType(tv.Type)
-		for _, fv := range fn2.FreeVars {
-			v.Bindings = append(v.Bindings, fv.outer)
-			fv.outer = nil
-		}
-		return fn.emit(v)
-
-	case *ast.TypeAssertExpr: // single-result form only
-		return emitTypeAssert(fn, b.expr(fn, e.X), tv.Type, e.Lparen)
-
-	case *ast.CallExpr:
-		if fn.Pkg.info.Types[e.Fun].IsType() {
-			// Explicit type conversion, e.g. string(x) or big.Int(x)
-			x := b.expr(fn, e.Args[0])
-			y := emitConv(fn, x, tv.Type)
-			if y != x {
-				switch y := y.(type) {
-				case *Convert:
-					y.pos = e.Lparen
-				case *ChangeType:
-					y.pos = e.Lparen
-				case *MakeInterface:
-					y.pos = e.Lparen
-				}
-			}
-			return y
-		}
-		// Call to "intrinsic" built-ins, e.g. new, make, panic.
-		if id, ok := unparen(e.Fun).(*ast.Ident); ok {
-			if obj, ok := fn.Pkg.info.Uses[id].(*types.Builtin); ok {
-				if v := b.builtin(fn, obj, e.Args, tv.Type, e.Lparen); v != nil {
-					return v
-				}
-			}
-		}
-		// Regular function call.
-		var v Call
-		b.setCall(fn, e, &v.Call)
-		v.setType(tv.Type)
-		return fn.emit(&v)
-
-	case *ast.UnaryExpr:
-		switch e.Op {
-		case token.AND: // &X --- potentially escaping.
-			addr := b.addr(fn, e.X, true)
-			if _, ok := unparen(e.X).(*ast.StarExpr); ok {
-				// &*p must panic if p is nil (http://golang.org/s/go12nil).
-				// For simplicity, we'll just (suboptimally) rely
-				// on the side effects of a load.
-				// TODO(adonovan): emit dedicated nilcheck.
-				addr.load(fn)
-			}
-			return addr.address(fn)
-		case token.ADD:
-			return b.expr(fn, e.X)
-		case token.NOT, token.ARROW, token.SUB, token.XOR: // ! <- - ^
-			v := &UnOp{
-				Op: e.Op,
-				X:  b.expr(fn, e.X),
-			}
-			v.setPos(e.OpPos)
-			v.setType(tv.Type)
-			return fn.emit(v)
-		default:
-			panic(e.Op)
-		}
-
-	case *ast.BinaryExpr:
-		switch e.Op {
-		case token.LAND, token.LOR:
-			return b.logicalBinop(fn, e)
-		case token.SHL, token.SHR:
-			fallthrough
-		case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
-			return emitArith(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), tv.Type, e.OpPos)
-
-		case token.EQL, token.NEQ, token.GTR, token.LSS, token.LEQ, token.GEQ:
-			cmp := emitCompare(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), e.OpPos)
-			// The type of x==y may be UntypedBool.
-			return emitConv(fn, cmp, DefaultType(tv.Type))
-		default:
-			panic("illegal op in BinaryExpr: " + e.Op.String())
-		}
-
-	case *ast.SliceExpr:
-		var low, high, max Value
-		var x Value
-		switch fn.Pkg.typeOf(e.X).Underlying().(type) {
-		case *types.Array:
-			// Potentially escaping.
-			x = b.addr(fn, e.X, true).address(fn)
-		case *types.Basic, *types.Slice, *types.Pointer: // *array
-			x = b.expr(fn, e.X)
-		default:
-			panic("unreachable")
-		}
-		if e.High != nil {
-			high = b.expr(fn, e.High)
-		}
-		if e.Low != nil {
-			low = b.expr(fn, e.Low)
-		}
-		if e.Slice3 {
-			max = b.expr(fn, e.Max)
-		}
-		v := &Slice{
-			X:    x,
-			Low:  low,
-			High: high,
-			Max:  max,
-		}
-		v.setPos(e.Lbrack)
-		v.setType(tv.Type)
-		return fn.emit(v)
-
-	case *ast.Ident:
-		obj := fn.Pkg.info.Uses[e]
-		// Universal built-in or nil?
-		switch obj := obj.(type) {
-		case *types.Builtin:
-			return &Builtin{name: obj.Name(), sig: tv.Type.(*types.Signature)}
-		case *types.Nil:
-			return nilConst(tv.Type)
-		}
-		// Package-level func or var?
-		if v := fn.Prog.packageLevelValue(obj); v != nil {
-			if _, ok := obj.(*types.Var); ok {
-				return emitLoad(fn, v) // var (address)
-			}
-			return v // (func)
-		}
-		// Local var.
-		return emitLoad(fn, fn.lookup(obj, false)) // var (address)
-
-	case *ast.SelectorExpr:
-		sel, ok := fn.Pkg.info.Selections[e]
-		if !ok {
-			// qualified identifier
-			return b.expr(fn, e.Sel)
-		}
-		switch sel.Kind() {
-		case types.MethodExpr:
-			// (*T).f or T.f, the method f from the method-set of type T.
-			// The result is a "thunk".
-			return emitConv(fn, makeThunk(fn.Prog, sel), tv.Type)
-
-		case types.MethodVal:
-			// e.f where e is an expression and f is a method.
-			// The result is a "bound".
-			obj := sel.Obj().(*types.Func)
-			rt := recvType(obj)
-			wantAddr := isPointer(rt)
-			escaping := true
-			v := b.receiver(fn, e.X, wantAddr, escaping, sel)
-			if isInterface(rt) {
-				// If v has interface type I,
-				// we must emit a check that v is non-nil.
-				// We use: typeassert v.(I).
-				emitTypeAssert(fn, v, rt, token.NoPos)
-			}
-			c := &MakeClosure{
-				Fn:       makeBound(fn.Prog, obj),
-				Bindings: []Value{v},
-			}
-			c.setPos(e.Sel.Pos())
-			c.setType(tv.Type)
-			return fn.emit(c)
-
-		case types.FieldVal:
-			indices := sel.Index()
-			last := len(indices) - 1
-			v := b.expr(fn, e.X)
-			v = emitImplicitSelections(fn, v, indices[:last])
-			v = emitFieldSelection(fn, v, indices[last], false, e.Sel)
-			return v
-		}
-
-		panic("unexpected expression-relative selector")
-
-	case *ast.IndexExpr:
-		switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
-		case *types.Array:
-			// Non-addressable array (in a register).
-			v := &Index{
-				X:     b.expr(fn, e.X),
-				Index: emitConv(fn, b.expr(fn, e.Index), tInt),
-			}
-			v.setPos(e.Lbrack)
-			v.setType(t.Elem())
-			return fn.emit(v)
-
-		case *types.Map:
-			// Maps are not addressable.
-			mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
-			v := &Lookup{
-				X:     b.expr(fn, e.X),
-				Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
-			}
-			v.setPos(e.Lbrack)
-			v.setType(mapt.Elem())
-			return fn.emit(v)
-
-		case *types.Basic: // => string
-			// Strings are not addressable.
-			v := &Lookup{
-				X:     b.expr(fn, e.X),
-				Index: b.expr(fn, e.Index),
-			}
-			v.setPos(e.Lbrack)
-			v.setType(tByte)
-			return fn.emit(v)
-
-		case *types.Slice, *types.Pointer: // *array
-			// Addressable slice/array; use IndexAddr and Load.
-			return b.addr(fn, e, false).load(fn)
-
-		default:
-			panic("unexpected container type in IndexExpr: " + t.String())
-		}
-
-	case *ast.CompositeLit, *ast.StarExpr:
-		// Addressable types (lvalues)
-		return b.addr(fn, e, false).load(fn)
-	}
-
-	panic(fmt.Sprintf("unexpected expr: %T", e))
-}
-
-// stmtList emits to fn code for all statements in list.
-func (b *builder) stmtList(fn *Function, list []ast.Stmt) {
-	for _, s := range list {
-		b.stmt(fn, s)
-	}
-}
-
-// receiver emits to fn code for expression e in the "receiver"
-// position of selection e.f (where f may be a field or a method) and
-// returns the effective receiver after applying the implicit field
-// selections of sel.
-//
-// wantAddr requests that the result is an an address.  If
-// !sel.Indirect(), this may require that e be built in addr() mode; it
-// must thus be addressable.
-//
-// escaping is defined as per builder.addr().
-//
-func (b *builder) receiver(fn *Function, e ast.Expr, wantAddr, escaping bool, sel *types.Selection) Value {
-	var v Value
-	if wantAddr && !sel.Indirect() && !isPointer(fn.Pkg.typeOf(e)) {
-		v = b.addr(fn, e, escaping).address(fn)
-	} else {
-		v = b.expr(fn, e)
-	}
-
-	last := len(sel.Index()) - 1
-	v = emitImplicitSelections(fn, v, sel.Index()[:last])
-	if !wantAddr && isPointer(v.Type()) {
-		v = emitLoad(fn, v)
-	}
-	return v
-}
-
-// setCallFunc populates the function parts of a CallCommon structure
-// (Func, Method, Recv, Args[0]) based on the kind of invocation
-// occurring in e.
-//
-func (b *builder) setCallFunc(fn *Function, e *ast.CallExpr, c *CallCommon) {
-	c.pos = e.Lparen
-
-	// Is this a method call?
-	if selector, ok := unparen(e.Fun).(*ast.SelectorExpr); ok {
-		sel, ok := fn.Pkg.info.Selections[selector]
-		if ok && sel.Kind() == types.MethodVal {
-			obj := sel.Obj().(*types.Func)
-			recv := recvType(obj)
-			wantAddr := isPointer(recv)
-			escaping := true
-			v := b.receiver(fn, selector.X, wantAddr, escaping, sel)
-			if isInterface(recv) {
-				// Invoke-mode call.
-				c.Value = v
-				c.Method = obj
-			} else {
-				// "Call"-mode call.
-				c.Value = fn.Prog.declaredFunc(obj)
-				c.Args = append(c.Args, v)
-			}
-			return
-		}
-
-		// sel.Kind()==MethodExpr indicates T.f() or (*T).f():
-		// a statically dispatched call to the method f in the
-		// method-set of T or *T.  T may be an interface.
-		//
-		// e.Fun would evaluate to a concrete method, interface
-		// wrapper function, or promotion wrapper.
-		//
-		// For now, we evaluate it in the usual way.
-		//
-		// TODO(adonovan): opt: inline expr() here, to make the
-		// call static and to avoid generation of wrappers.
-		// It's somewhat tricky as it may consume the first
-		// actual parameter if the call is "invoke" mode.
-		//
-		// Examples:
-		//  type T struct{}; func (T) f() {}   // "call" mode
-		//  type T interface { f() }           // "invoke" mode
-		//
-		//  type S struct{ T }
-		//
-		//  var s S
-		//  S.f(s)
-		//  (*S).f(&s)
-		//
-		// Suggested approach:
-		// - consume the first actual parameter expression
-		//   and build it with b.expr().
-		// - apply implicit field selections.
-		// - use MethodVal logic to populate fields of c.
-	}
-
-	// Evaluate the function operand in the usual way.
-	c.Value = b.expr(fn, e.Fun)
-}
-
-// emitCallArgs emits to f code for the actual parameters of call e to
-// a (possibly built-in) function of effective type sig.
-// The argument values are appended to args, which is then returned.
-//
-func (b *builder) emitCallArgs(fn *Function, sig *types.Signature, e *ast.CallExpr, args []Value) []Value {
-	// f(x, y, z...): pass slice z straight through.
-	if e.Ellipsis != 0 {
-		for i, arg := range e.Args {
-			v := emitConv(fn, b.expr(fn, arg), sig.Params().At(i).Type())
-			args = append(args, v)
-		}
-		return args
-	}
-
-	offset := len(args) // 1 if call has receiver, 0 otherwise
-
-	// Evaluate actual parameter expressions.
-	//
-	// If this is a chained call of the form f(g()) where g has
-	// multiple return values (MRV), they are flattened out into
-	// args; a suffix of them may end up in a varargs slice.
-	for _, arg := range e.Args {
-		v := b.expr(fn, arg)
-		if ttuple, ok := v.Type().(*types.Tuple); ok { // MRV chain
-			for i, n := 0, ttuple.Len(); i < n; i++ {
-				args = append(args, emitExtract(fn, v, i))
-			}
-		} else {
-			args = append(args, v)
-		}
-	}
-
-	// Actual->formal assignability conversions for normal parameters.
-	np := sig.Params().Len() // number of normal parameters
-	if sig.Variadic() {
-		np--
-	}
-	for i := 0; i < np; i++ {
-		args[offset+i] = emitConv(fn, args[offset+i], sig.Params().At(i).Type())
-	}
-
-	// Actual->formal assignability conversions for variadic parameter,
-	// and construction of slice.
-	if sig.Variadic() {
-		varargs := args[offset+np:]
-		st := sig.Params().At(np).Type().(*types.Slice)
-		vt := st.Elem()
-		if len(varargs) == 0 {
-			args = append(args, nilConst(st))
-		} else {
-			// Replace a suffix of args with a slice containing it.
-			at := types.NewArray(vt, int64(len(varargs)))
-			a := emitNew(fn, at, token.NoPos)
-			a.setPos(e.Rparen)
-			a.Comment = "varargs"
-			for i, arg := range varargs {
-				iaddr := &IndexAddr{
-					X:     a,
-					Index: intConst(int64(i)),
-				}
-				iaddr.setType(types.NewPointer(vt))
-				fn.emit(iaddr)
-				emitStore(fn, iaddr, arg, arg.Pos())
-			}
-			s := &Slice{X: a}
-			s.setType(st)
-			args[offset+np] = fn.emit(s)
-			args = args[:offset+np+1]
-		}
-	}
-	return args
-}
-
-// setCall emits to fn code to evaluate all the parameters of a function
-// call e, and populates *c with those values.
-//
-func (b *builder) setCall(fn *Function, e *ast.CallExpr, c *CallCommon) {
-	// First deal with the f(...) part and optional receiver.
-	b.setCallFunc(fn, e, c)
-
-	// Then append the other actual parameters.
-	sig, _ := fn.Pkg.typeOf(e.Fun).Underlying().(*types.Signature)
-	if sig == nil {
-		panic(fmt.Sprintf("no signature for call of %s", e.Fun))
-	}
-	c.Args = b.emitCallArgs(fn, sig, e, c.Args)
-}
-
-// assignOp emits to fn code to perform loc += incr or loc -= incr.
-func (b *builder) assignOp(fn *Function, loc lvalue, incr Value, op token.Token) {
-	oldv := loc.load(fn)
-	loc.store(fn, emitArith(fn, op, oldv, emitConv(fn, incr, oldv.Type()), loc.typ(), token.NoPos))
-}
-
-// localValueSpec emits to fn code to define all of the vars in the
-// function-local ValueSpec, spec.
-//
-func (b *builder) localValueSpec(fn *Function, spec *ast.ValueSpec) {
-	switch {
-	case len(spec.Values) == len(spec.Names):
-		// e.g. var x, y = 0, 1
-		// 1:1 assignment
-		for i, id := range spec.Names {
-			if !isBlankIdent(id) {
-				fn.addLocalForIdent(id)
-			}
-			lval := b.addr(fn, id, false) // non-escaping
-			b.assign(fn, lval, spec.Values[i], true, nil)
-		}
-
-	case len(spec.Values) == 0:
-		// e.g. var x, y int
-		// Locals are implicitly zero-initialized.
-		for _, id := range spec.Names {
-			if !isBlankIdent(id) {
-				lhs := fn.addLocalForIdent(id)
-				if fn.debugInfo() {
-					emitDebugRef(fn, id, lhs, true)
-				}
-			}
-		}
-
-	default:
-		// e.g. var x, y = pos()
-		tuple := b.exprN(fn, spec.Values[0])
-		for i, id := range spec.Names {
-			if !isBlankIdent(id) {
-				fn.addLocalForIdent(id)
-				lhs := b.addr(fn, id, false) // non-escaping
-				lhs.store(fn, emitExtract(fn, tuple, i))
-			}
-		}
-	}
-}
-
-// assignStmt emits code to fn for a parallel assignment of rhss to lhss.
-// isDef is true if this is a short variable declaration (:=).
-//
-// Note the similarity with localValueSpec.
-//
-func (b *builder) assignStmt(fn *Function, lhss, rhss []ast.Expr, isDef bool) {
-	// Side effects of all LHSs and RHSs must occur in left-to-right order.
-	lvals := make([]lvalue, len(lhss))
-	isZero := make([]bool, len(lhss))
-	for i, lhs := range lhss {
-		var lval lvalue = blank{}
-		if !isBlankIdent(lhs) {
-			if isDef {
-				if obj := fn.Pkg.info.Defs[lhs.(*ast.Ident)]; obj != nil {
-					fn.addNamedLocal(obj)
-					isZero[i] = true
-				}
-			}
-			lval = b.addr(fn, lhs, false) // non-escaping
-		}
-		lvals[i] = lval
-	}
-	if len(lhss) == len(rhss) {
-		// Simple assignment:   x     = f()        (!isDef)
-		// Parallel assignment: x, y  = f(), g()   (!isDef)
-		// or short var decl:   x, y := f(), g()   (isDef)
-		//
-		// In all cases, the RHSs may refer to the LHSs,
-		// so we need a storebuf.
-		var sb storebuf
-		for i := range rhss {
-			b.assign(fn, lvals[i], rhss[i], isZero[i], &sb)
-		}
-		sb.emit(fn)
-	} else {
-		// e.g. x, y = pos()
-		tuple := b.exprN(fn, rhss[0])
-		for i, lval := range lvals {
-			lval.store(fn, emitExtract(fn, tuple, i))
-		}
-	}
-}
-
-// arrayLen returns the length of the array whose composite literal elements are elts.
-func (b *builder) arrayLen(fn *Function, elts []ast.Expr) int64 {
-	var max int64 = -1
-	var i int64 = -1
-	for _, e := range elts {
-		if kv, ok := e.(*ast.KeyValueExpr); ok {
-			i = b.expr(fn, kv.Key).(*Const).Int64()
-		} else {
-			i++
-		}
-		if i > max {
-			max = i
-		}
-	}
-	return max + 1
-}
-
-// compLit emits to fn code to initialize a composite literal e at
-// address addr with type typ.
-//
-// Nested composite literals are recursively initialized in place
-// where possible. If isZero is true, compLit assumes that addr
-// holds the zero value for typ.
-//
-// Because the elements of a composite literal may refer to the
-// variables being updated, as in the second line below,
-//	x := T{a: 1}
-//	x = T{a: x.a}
-// all the reads must occur before all the writes.  Thus all stores to
-// loc are emitted to the storebuf sb for later execution.
-//
-// A CompositeLit may have pointer type only in the recursive (nested)
-// case when the type name is implicit.  e.g. in []*T{{}}, the inner
-// literal has type *T behaves like &T{}.
-// In that case, addr must hold a T, not a *T.
-//
-func (b *builder) compLit(fn *Function, addr Value, e *ast.CompositeLit, isZero bool, sb *storebuf) {
-	typ := deref(fn.Pkg.typeOf(e))
-	switch t := typ.Underlying().(type) {
-	case *types.Struct:
-		if !isZero && len(e.Elts) != t.NumFields() {
-			// memclear
-			sb.store(&address{addr, e.Lbrace, nil},
-				zeroValue(fn, deref(addr.Type())))
-			isZero = true
-		}
-		for i, e := range e.Elts {
-			fieldIndex := i
-			pos := e.Pos()
-			if kv, ok := e.(*ast.KeyValueExpr); ok {
-				fname := kv.Key.(*ast.Ident).Name
-				for i, n := 0, t.NumFields(); i < n; i++ {
-					sf := t.Field(i)
-					if sf.Name() == fname {
-						fieldIndex = i
-						pos = kv.Colon
-						e = kv.Value
-						break
-					}
-				}
-			}
-			sf := t.Field(fieldIndex)
-			faddr := &FieldAddr{
-				X:     addr,
-				Field: fieldIndex,
-			}
-			faddr.setType(types.NewPointer(sf.Type()))
-			fn.emit(faddr)
-			b.assign(fn, &address{addr: faddr, pos: pos, expr: e}, e, isZero, sb)
-		}
-
-	case *types.Array, *types.Slice:
-		var at *types.Array
-		var array Value
-		switch t := t.(type) {
-		case *types.Slice:
-			at = types.NewArray(t.Elem(), b.arrayLen(fn, e.Elts))
-			alloc := emitNew(fn, at, e.Lbrace)
-			alloc.Comment = "slicelit"
-			array = alloc
-		case *types.Array:
-			at = t
-			array = addr
-
-			if !isZero && int64(len(e.Elts)) != at.Len() {
-				// memclear
-				sb.store(&address{array, e.Lbrace, nil},
-					zeroValue(fn, deref(array.Type())))
-			}
-		}
-
-		var idx *Const
-		for _, e := range e.Elts {
-			pos := e.Pos()
-			if kv, ok := e.(*ast.KeyValueExpr); ok {
-				idx = b.expr(fn, kv.Key).(*Const)
-				pos = kv.Colon
-				e = kv.Value
-			} else {
-				var idxval int64
-				if idx != nil {
-					idxval = idx.Int64() + 1
-				}
-				idx = intConst(idxval)
-			}
-			iaddr := &IndexAddr{
-				X:     array,
-				Index: idx,
-			}
-			iaddr.setType(types.NewPointer(at.Elem()))
-			fn.emit(iaddr)
-			if t != at { // slice
-				// backing array is unaliased => storebuf not needed.
-				b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, nil)
-			} else {
-				b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, sb)
-			}
-		}
-
-		if t != at { // slice
-			s := &Slice{X: array}
-			s.setPos(e.Lbrace)
-			s.setType(typ)
-			sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, fn.emit(s))
-		}
-
-	case *types.Map:
-		m := &MakeMap{Reserve: intConst(int64(len(e.Elts)))}
-		m.setPos(e.Lbrace)
-		m.setType(typ)
-		fn.emit(m)
-		for _, e := range e.Elts {
-			e := e.(*ast.KeyValueExpr)
-			loc := element{
-				m:   m,
-				k:   emitConv(fn, b.expr(fn, e.Key), t.Key()),
-				t:   t.Elem(),
-				pos: e.Colon,
-			}
-
-			// We call assign() only because it takes care
-			// of any &-operation required in the recursive
-			// case, e.g.,
-			// map[int]*struct{}{0: {}} implies &struct{}{}.
-			// In-place update is of course impossible,
-			// and no storebuf is needed.
-			b.assign(fn, &loc, e.Value, true, nil)
-		}
-		sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, m)
-
-	default:
-		panic("unexpected CompositeLit type: " + t.String())
-	}
-}
-
-// switchStmt emits to fn code for the switch statement s, optionally
-// labelled by label.
-//
-func (b *builder) switchStmt(fn *Function, s *ast.SwitchStmt, label *lblock) {
-	// We treat SwitchStmt like a sequential if-else chain.
-	// Multiway dispatch can be recovered later by ssautil.Switches()
-	// to those cases that are free of side effects.
-	if s.Init != nil {
-		b.stmt(fn, s.Init)
-	}
-	var tag Value = vTrue
-	if s.Tag != nil {
-		tag = b.expr(fn, s.Tag)
-	}
-	done := fn.newBasicBlock("switch.done")
-	if label != nil {
-		label._break = done
-	}
-	// We pull the default case (if present) down to the end.
-	// But each fallthrough label must point to the next
-	// body block in source order, so we preallocate a
-	// body block (fallthru) for the next case.
-	// Unfortunately this makes for a confusing block order.
-	var dfltBody *[]ast.Stmt
-	var dfltFallthrough *BasicBlock
-	var fallthru, dfltBlock *BasicBlock
-	ncases := len(s.Body.List)
-	for i, clause := range s.Body.List {
-		body := fallthru
-		if body == nil {
-			body = fn.newBasicBlock("switch.body") // first case only
-		}
-
-		// Preallocate body block for the next case.
-		fallthru = done
-		if i+1 < ncases {
-			fallthru = fn.newBasicBlock("switch.body")
-		}
-
-		cc := clause.(*ast.CaseClause)
-		if cc.List == nil {
-			// Default case.
-			dfltBody = &cc.Body
-			dfltFallthrough = fallthru
-			dfltBlock = body
-			continue
-		}
-
-		var nextCond *BasicBlock
-		for _, cond := range cc.List {
-			nextCond = fn.newBasicBlock("switch.next")
-			// TODO(adonovan): opt: when tag==vTrue, we'd
-			// get better code if we use b.cond(cond)
-			// instead of BinOp(EQL, tag, b.expr(cond))
-			// followed by If.  Don't forget conversions
-			// though.
-			cond := emitCompare(fn, token.EQL, tag, b.expr(fn, cond), token.NoPos)
-			emitIf(fn, cond, body, nextCond)
-			fn.currentBlock = nextCond
-		}
-		fn.currentBlock = body
-		fn.targets = &targets{
-			tail:         fn.targets,
-			_break:       done,
-			_fallthrough: fallthru,
-		}
-		b.stmtList(fn, cc.Body)
-		fn.targets = fn.targets.tail
-		emitJump(fn, done)
-		fn.currentBlock = nextCond
-	}
-	if dfltBlock != nil {
-		emitJump(fn, dfltBlock)
-		fn.currentBlock = dfltBlock
-		fn.targets = &targets{
-			tail:         fn.targets,
-			_break:       done,
-			_fallthrough: dfltFallthrough,
-		}
-		b.stmtList(fn, *dfltBody)
-		fn.targets = fn.targets.tail
-	}
-	emitJump(fn, done)
-	fn.currentBlock = done
-}
-
-// typeSwitchStmt emits to fn code for the type switch statement s, optionally
-// labelled by label.
-//
-func (b *builder) typeSwitchStmt(fn *Function, s *ast.TypeSwitchStmt, label *lblock) {
-	// We treat TypeSwitchStmt like a sequential if-else chain.
-	// Multiway dispatch can be recovered later by ssautil.Switches().
-
-	// Typeswitch lowering:
-	//
-	// var x X
-	// switch y := x.(type) {
-	// case T1, T2: S1                  // >1 	(y := x)
-	// case nil:    SN                  // nil 	(y := x)
-	// default:     SD                  // 0 types 	(y := x)
-	// case T3:     S3                  // 1 type 	(y := x.(T3))
-	// }
-	//
-	//      ...s.Init...
-	// 	x := eval x
-	// .caseT1:
-	// 	t1, ok1 := typeswitch,ok x <T1>
-	// 	if ok1 then goto S1 else goto .caseT2
-	// .caseT2:
-	// 	t2, ok2 := typeswitch,ok x <T2>
-	// 	if ok2 then goto S1 else goto .caseNil
-	// .S1:
-	//      y := x
-	// 	...S1...
-	// 	goto done
-	// .caseNil:
-	// 	if t2, ok2 := typeswitch,ok x <T2>
-	// 	if x == nil then goto SN else goto .caseT3
-	// .SN:
-	//      y := x
-	// 	...SN...
-	// 	goto done
-	// .caseT3:
-	// 	t3, ok3 := typeswitch,ok x <T3>
-	// 	if ok3 then goto S3 else goto default
-	// .S3:
-	//      y := t3
-	// 	...S3...
-	// 	goto done
-	// .default:
-	//      y := x
-	// 	...SD...
-	// 	goto done
-	// .done:
-
-	if s.Init != nil {
-		b.stmt(fn, s.Init)
-	}
-
-	var x Value
-	switch ass := s.Assign.(type) {
-	case *ast.ExprStmt: // x.(type)
-		x = b.expr(fn, unparen(ass.X).(*ast.TypeAssertExpr).X)
-	case *ast.AssignStmt: // y := x.(type)
-		x = b.expr(fn, unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X)
-	}
-
-	done := fn.newBasicBlock("typeswitch.done")
-	if label != nil {
-		label._break = done
-	}
-	var default_ *ast.CaseClause
-	for _, clause := range s.Body.List {
-		cc := clause.(*ast.CaseClause)
-		if cc.List == nil {
-			default_ = cc
-			continue
-		}
-		body := fn.newBasicBlock("typeswitch.body")
-		var next *BasicBlock
-		var casetype types.Type
-		var ti Value // ti, ok := typeassert,ok x <Ti>
-		for _, cond := range cc.List {
-			next = fn.newBasicBlock("typeswitch.next")
-			casetype = fn.Pkg.typeOf(cond)
-			var condv Value
-			if casetype == tUntypedNil {
-				condv = emitCompare(fn, token.EQL, x, nilConst(x.Type()), token.NoPos)
-				ti = x
-			} else {
-				yok := emitTypeTest(fn, x, casetype, cc.Case)
-				ti = emitExtract(fn, yok, 0)
-				condv = emitExtract(fn, yok, 1)
-			}
-			emitIf(fn, condv, body, next)
-			fn.currentBlock = next
-		}
-		if len(cc.List) != 1 {
-			ti = x
-		}
-		fn.currentBlock = body
-		b.typeCaseBody(fn, cc, ti, done)
-		fn.currentBlock = next
-	}
-	if default_ != nil {
-		b.typeCaseBody(fn, default_, x, done)
-	} else {
-		emitJump(fn, done)
-	}
-	fn.currentBlock = done
-}
-
-func (b *builder) typeCaseBody(fn *Function, cc *ast.CaseClause, x Value, done *BasicBlock) {
-	if obj := fn.Pkg.info.Implicits[cc]; obj != nil {
-		// In a switch y := x.(type), each case clause
-		// implicitly declares a distinct object y.
-		// In a single-type case, y has that type.
-		// In multi-type cases, 'case nil' and default,
-		// y has the same type as the interface operand.
-		emitStore(fn, fn.addNamedLocal(obj), x, obj.Pos())
-	}
-	fn.targets = &targets{
-		tail:   fn.targets,
-		_break: done,
-	}
-	b.stmtList(fn, cc.Body)
-	fn.targets = fn.targets.tail
-	emitJump(fn, done)
-}
-
-// selectStmt emits to fn code for the select statement s, optionally
-// labelled by label.
-//
-func (b *builder) selectStmt(fn *Function, s *ast.SelectStmt, label *lblock) {
-	// A blocking select of a single case degenerates to a
-	// simple send or receive.
-	// TODO(adonovan): opt: is this optimization worth its weight?
-	if len(s.Body.List) == 1 {
-		clause := s.Body.List[0].(*ast.CommClause)
-		if clause.Comm != nil {
-			b.stmt(fn, clause.Comm)
-			done := fn.newBasicBlock("select.done")
-			if label != nil {
-				label._break = done
-			}
-			fn.targets = &targets{
-				tail:   fn.targets,
-				_break: done,
-			}
-			b.stmtList(fn, clause.Body)
-			fn.targets = fn.targets.tail
-			emitJump(fn, done)
-			fn.currentBlock = done
-			return
-		}
-	}
-
-	// First evaluate all channels in all cases, and find
-	// the directions of each state.
-	var states []*SelectState
-	blocking := true
-	debugInfo := fn.debugInfo()
-	for _, clause := range s.Body.List {
-		var st *SelectState
-		switch comm := clause.(*ast.CommClause).Comm.(type) {
-		case nil: // default case
-			blocking = false
-			continue
-
-		case *ast.SendStmt: // ch<- i
-			ch := b.expr(fn, comm.Chan)
-			st = &SelectState{
-				Dir:  types.SendOnly,
-				Chan: ch,
-				Send: emitConv(fn, b.expr(fn, comm.Value),
-					ch.Type().Underlying().(*types.Chan).Elem()),
-				Pos: comm.Arrow,
-			}
-			if debugInfo {
-				st.DebugNode = comm
-			}
-
-		case *ast.AssignStmt: // x := <-ch
-			recv := unparen(comm.Rhs[0]).(*ast.UnaryExpr)
-			st = &SelectState{
-				Dir:  types.RecvOnly,
-				Chan: b.expr(fn, recv.X),
-				Pos:  recv.OpPos,
-			}
-			if debugInfo {
-				st.DebugNode = recv
-			}
-
-		case *ast.ExprStmt: // <-ch
-			recv := unparen(comm.X).(*ast.UnaryExpr)
-			st = &SelectState{
-				Dir:  types.RecvOnly,
-				Chan: b.expr(fn, recv.X),
-				Pos:  recv.OpPos,
-			}
-			if debugInfo {
-				st.DebugNode = recv
-			}
-		}
-		states = append(states, st)
-	}
-
-	// We dispatch on the (fair) result of Select using a
-	// sequential if-else chain, in effect:
-	//
-	// idx, recvOk, r0...r_n-1 := select(...)
-	// if idx == 0 {  // receive on channel 0  (first receive => r0)
-	//     x, ok := r0, recvOk
-	//     ...state0...
-	// } else if v == 1 {   // send on channel 1
-	//     ...state1...
-	// } else {
-	//     ...default...
-	// }
-	sel := &Select{
-		States:   states,
-		Blocking: blocking,
-	}
-	sel.setPos(s.Select)
-	var vars []*types.Var
-	vars = append(vars, varIndex, varOk)
-	for _, st := range states {
-		if st.Dir == types.RecvOnly {
-			tElem := st.Chan.Type().Underlying().(*types.Chan).Elem()
-			vars = append(vars, anonVar(tElem))
-		}
-	}
-	sel.setType(types.NewTuple(vars...))
-
-	fn.emit(sel)
-	idx := emitExtract(fn, sel, 0)
-
-	done := fn.newBasicBlock("select.done")
-	if label != nil {
-		label._break = done
-	}
-
-	var defaultBody *[]ast.Stmt
-	state := 0
-	r := 2 // index in 'sel' tuple of value; increments if st.Dir==RECV
-	for _, cc := range s.Body.List {
-		clause := cc.(*ast.CommClause)
-		if clause.Comm == nil {
-			defaultBody = &clause.Body
-			continue
-		}
-		body := fn.newBasicBlock("select.body")
-		next := fn.newBasicBlock("select.next")
-		emitIf(fn, emitCompare(fn, token.EQL, idx, intConst(int64(state)), token.NoPos), body, next)
-		fn.currentBlock = body
-		fn.targets = &targets{
-			tail:   fn.targets,
-			_break: done,
-		}
-		switch comm := clause.Comm.(type) {
-		case *ast.ExprStmt: // <-ch
-			if debugInfo {
-				v := emitExtract(fn, sel, r)
-				emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
-			}
-			r++
-
-		case *ast.AssignStmt: // x := <-states[state].Chan
-			if comm.Tok == token.DEFINE {
-				fn.addLocalForIdent(comm.Lhs[0].(*ast.Ident))
-			}
-			x := b.addr(fn, comm.Lhs[0], false) // non-escaping
-			v := emitExtract(fn, sel, r)
-			if debugInfo {
-				emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
-			}
-			x.store(fn, v)
-
-			if len(comm.Lhs) == 2 { // x, ok := ...
-				if comm.Tok == token.DEFINE {
-					fn.addLocalForIdent(comm.Lhs[1].(*ast.Ident))
-				}
-				ok := b.addr(fn, comm.Lhs[1], false) // non-escaping
-				ok.store(fn, emitExtract(fn, sel, 1))
-			}
-			r++
-		}
-		b.stmtList(fn, clause.Body)
-		fn.targets = fn.targets.tail
-		emitJump(fn, done)
-		fn.currentBlock = next
-		state++
-	}
-	if defaultBody != nil {
-		fn.targets = &targets{
-			tail:   fn.targets,
-			_break: done,
-		}
-		b.stmtList(fn, *defaultBody)
-		fn.targets = fn.targets.tail
-	} else {
-		// A blocking select must match some case.
-		// (This should really be a runtime.errorString, not a string.)
-		fn.emit(&Panic{
-			X: emitConv(fn, stringConst("blocking select matched no case"), tEface),
-		})
-		fn.currentBlock = fn.newBasicBlock("unreachable")
-	}
-	emitJump(fn, done)
-	fn.currentBlock = done
-}
-
-// forStmt emits to fn code for the for statement s, optionally
-// labelled by label.
-//
-func (b *builder) forStmt(fn *Function, s *ast.ForStmt, label *lblock) {
-	//	...init...
-	//      jump loop
-	// loop:
-	//      if cond goto body else done
-	// body:
-	//      ...body...
-	//      jump post
-	// post:				 (target of continue)
-	//      ...post...
-	//      jump loop
-	// done:                                 (target of break)
-	if s.Init != nil {
-		b.stmt(fn, s.Init)
-	}
-	body := fn.newBasicBlock("for.body")
-	done := fn.newBasicBlock("for.done") // target of 'break'
-	loop := body                         // target of back-edge
-	if s.Cond != nil {
-		loop = fn.newBasicBlock("for.loop")
-	}
-	cont := loop // target of 'continue'
-	if s.Post != nil {
-		cont = fn.newBasicBlock("for.post")
-	}
-	if label != nil {
-		label._break = done
-		label._continue = cont
-	}
-	emitJump(fn, loop)
-	fn.currentBlock = loop
-	if loop != body {
-		b.cond(fn, s.Cond, body, done)
-		fn.currentBlock = body
-	}
-	fn.targets = &targets{
-		tail:      fn.targets,
-		_break:    done,
-		_continue: cont,
-	}
-	b.stmt(fn, s.Body)
-	fn.targets = fn.targets.tail
-	emitJump(fn, cont)
-
-	if s.Post != nil {
-		fn.currentBlock = cont
-		b.stmt(fn, s.Post)
-		emitJump(fn, loop) // back-edge
-	}
-	fn.currentBlock = done
-}
-
-// rangeIndexed emits to fn the header for an integer-indexed loop
-// over array, *array or slice value x.
-// The v result is defined only if tv is non-nil.
-// forPos is the position of the "for" token.
-//
-func (b *builder) rangeIndexed(fn *Function, x Value, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
-	//
-	//      length = len(x)
-	//      index = -1
-	// loop:                                   (target of continue)
-	//      index++
-	// 	if index < length goto body else done
-	// body:
-	//      k = index
-	//      v = x[index]
-	//      ...body...
-	// 	jump loop
-	// done:                                   (target of break)
-
-	// Determine number of iterations.
-	var length Value
-	if arr, ok := deref(x.Type()).Underlying().(*types.Array); ok {
-		// For array or *array, the number of iterations is
-		// known statically thanks to the type.  We avoid a
-		// data dependence upon x, permitting later dead-code
-		// elimination if x is pure, static unrolling, etc.
-		// Ranging over a nil *array may have >0 iterations.
-		// We still generate code for x, in case it has effects.
-		length = intConst(arr.Len())
-	} else {
-		// length = len(x).
-		var c Call
-		c.Call.Value = makeLen(x.Type())
-		c.Call.Args = []Value{x}
-		c.setType(tInt)
-		length = fn.emit(&c)
-	}
-
-	index := fn.addLocal(tInt, token.NoPos)
-	emitStore(fn, index, intConst(-1), pos)
-
-	loop = fn.newBasicBlock("rangeindex.loop")
-	emitJump(fn, loop)
-	fn.currentBlock = loop
-
-	incr := &BinOp{
-		Op: token.ADD,
-		X:  emitLoad(fn, index),
-		Y:  vOne,
-	}
-	incr.setType(tInt)
-	emitStore(fn, index, fn.emit(incr), pos)
-
-	body := fn.newBasicBlock("rangeindex.body")
-	done = fn.newBasicBlock("rangeindex.done")
-	emitIf(fn, emitCompare(fn, token.LSS, incr, length, token.NoPos), body, done)
-	fn.currentBlock = body
-
-	k = emitLoad(fn, index)
-	if tv != nil {
-		switch t := x.Type().Underlying().(type) {
-		case *types.Array:
-			instr := &Index{
-				X:     x,
-				Index: k,
-			}
-			instr.setType(t.Elem())
-			v = fn.emit(instr)
-
-		case *types.Pointer: // *array
-			instr := &IndexAddr{
-				X:     x,
-				Index: k,
-			}
-			instr.setType(types.NewPointer(t.Elem().Underlying().(*types.Array).Elem()))
-			v = emitLoad(fn, fn.emit(instr))
-
-		case *types.Slice:
-			instr := &IndexAddr{
-				X:     x,
-				Index: k,
-			}
-			instr.setType(types.NewPointer(t.Elem()))
-			v = emitLoad(fn, fn.emit(instr))
-
-		default:
-			panic("rangeIndexed x:" + t.String())
-		}
-	}
-	return
-}
-
-// rangeIter emits to fn the header for a loop using
-// Range/Next/Extract to iterate over map or string value x.
-// tk and tv are the types of the key/value results k and v, or nil
-// if the respective component is not wanted.
-//
-func (b *builder) rangeIter(fn *Function, x Value, tk, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
-	//
-	//	it = range x
-	// loop:                                   (target of continue)
-	//	okv = next it                      (ok, key, value)
-	//  	ok = extract okv #0
-	// 	if ok goto body else done
-	// body:
-	// 	k = extract okv #1
-	// 	v = extract okv #2
-	//      ...body...
-	// 	jump loop
-	// done:                                   (target of break)
-	//
-
-	if tk == nil {
-		tk = tInvalid
-	}
-	if tv == nil {
-		tv = tInvalid
-	}
-
-	rng := &Range{X: x}
-	rng.setPos(pos)
-	rng.setType(tRangeIter)
-	it := fn.emit(rng)
-
-	loop = fn.newBasicBlock("rangeiter.loop")
-	emitJump(fn, loop)
-	fn.currentBlock = loop
-
-	_, isString := x.Type().Underlying().(*types.Basic)
-
-	okv := &Next{
-		Iter:     it,
-		IsString: isString,
-	}
-	okv.setType(types.NewTuple(
-		varOk,
-		newVar("k", tk),
-		newVar("v", tv),
-	))
-	fn.emit(okv)
-
-	body := fn.newBasicBlock("rangeiter.body")
-	done = fn.newBasicBlock("rangeiter.done")
-	emitIf(fn, emitExtract(fn, okv, 0), body, done)
-	fn.currentBlock = body
-
-	if tk != tInvalid {
-		k = emitExtract(fn, okv, 1)
-	}
-	if tv != tInvalid {
-		v = emitExtract(fn, okv, 2)
-	}
-	return
-}
-
-// rangeChan emits to fn the header for a loop that receives from
-// channel x until it fails.
-// tk is the channel's element type, or nil if the k result is
-// not wanted
-// pos is the position of the '=' or ':=' token.
-//
-func (b *builder) rangeChan(fn *Function, x Value, tk types.Type, pos token.Pos) (k Value, loop, done *BasicBlock) {
-	//
-	// loop:                                   (target of continue)
-	//      ko = <-x                           (key, ok)
-	//      ok = extract ko #1
-	//      if ok goto body else done
-	// body:
-	//      k = extract ko #0
-	//      ...
-	//      goto loop
-	// done:                                   (target of break)
-
-	loop = fn.newBasicBlock("rangechan.loop")
-	emitJump(fn, loop)
-	fn.currentBlock = loop
-	recv := &UnOp{
-		Op:      token.ARROW,
-		X:       x,
-		CommaOk: true,
-	}
-	recv.setPos(pos)
-	recv.setType(types.NewTuple(
-		newVar("k", x.Type().Underlying().(*types.Chan).Elem()),
-		varOk,
-	))
-	ko := fn.emit(recv)
-	body := fn.newBasicBlock("rangechan.body")
-	done = fn.newBasicBlock("rangechan.done")
-	emitIf(fn, emitExtract(fn, ko, 1), body, done)
-	fn.currentBlock = body
-	if tk != nil {
-		k = emitExtract(fn, ko, 0)
-	}
-	return
-}
-
-// rangeStmt emits to fn code for the range statement s, optionally
-// labelled by label.
-//
-func (b *builder) rangeStmt(fn *Function, s *ast.RangeStmt, label *lblock) {
-	var tk, tv types.Type
-	if s.Key != nil && !isBlankIdent(s.Key) {
-		tk = fn.Pkg.typeOf(s.Key)
-	}
-	if s.Value != nil && !isBlankIdent(s.Value) {
-		tv = fn.Pkg.typeOf(s.Value)
-	}
-
-	// If iteration variables are defined (:=), this
-	// occurs once outside the loop.
-	//
-	// Unlike a short variable declaration, a RangeStmt
-	// using := never redeclares an existing variable; it
-	// always creates a new one.
-	if s.Tok == token.DEFINE {
-		if tk != nil {
-			fn.addLocalForIdent(s.Key.(*ast.Ident))
-		}
-		if tv != nil {
-			fn.addLocalForIdent(s.Value.(*ast.Ident))
-		}
-	}
-
-	x := b.expr(fn, s.X)
-
-	var k, v Value
-	var loop, done *BasicBlock
-	switch rt := x.Type().Underlying().(type) {
-	case *types.Slice, *types.Array, *types.Pointer: // *array
-		k, v, loop, done = b.rangeIndexed(fn, x, tv, s.For)
-
-	case *types.Chan:
-		k, loop, done = b.rangeChan(fn, x, tk, s.For)
-
-	case *types.Map, *types.Basic: // string
-		k, v, loop, done = b.rangeIter(fn, x, tk, tv, s.For)
-
-	default:
-		panic("Cannot range over: " + rt.String())
-	}
-
-	// Evaluate both LHS expressions before we update either.
-	var kl, vl lvalue
-	if tk != nil {
-		kl = b.addr(fn, s.Key, false) // non-escaping
-	}
-	if tv != nil {
-		vl = b.addr(fn, s.Value, false) // non-escaping
-	}
-	if tk != nil {
-		kl.store(fn, k)
-	}
-	if tv != nil {
-		vl.store(fn, v)
-	}
-
-	if label != nil {
-		label._break = done
-		label._continue = loop
-	}
-
-	fn.targets = &targets{
-		tail:      fn.targets,
-		_break:    done,
-		_continue: loop,
-	}
-	b.stmt(fn, s.Body)
-	fn.targets = fn.targets.tail
-	emitJump(fn, loop) // back-edge
-	fn.currentBlock = done
-}
-
-// stmt lowers statement s to SSA form, emitting code to fn.
-func (b *builder) stmt(fn *Function, _s ast.Stmt) {
-	// The label of the current statement.  If non-nil, its _goto
-	// target is always set; its _break and _continue are set only
-	// within the body of switch/typeswitch/select/for/range.
-	// It is effectively an additional default-nil parameter of stmt().
-	var label *lblock
-start:
-	switch s := _s.(type) {
-	case *ast.EmptyStmt:
-		// ignore.  (Usually removed by gofmt.)
-
-	case *ast.DeclStmt: // Con, Var or Typ
-		d := s.Decl.(*ast.GenDecl)
-		if d.Tok == token.VAR {
-			for _, spec := range d.Specs {
-				if vs, ok := spec.(*ast.ValueSpec); ok {
-					b.localValueSpec(fn, vs)
-				}
-			}
-		}
-
-	case *ast.LabeledStmt:
-		label = fn.labelledBlock(s.Label)
-		emitJump(fn, label._goto)
-		fn.currentBlock = label._goto
-		_s = s.Stmt
-		goto start // effectively: tailcall stmt(fn, s.Stmt, label)
-
-	case *ast.ExprStmt:
-		b.expr(fn, s.X)
-
-	case *ast.SendStmt:
-		fn.emit(&Send{
-			Chan: b.expr(fn, s.Chan),
-			X: emitConv(fn, b.expr(fn, s.Value),
-				fn.Pkg.typeOf(s.Chan).Underlying().(*types.Chan).Elem()),
-			pos: s.Arrow,
-		})
-
-	case *ast.IncDecStmt:
-		op := token.ADD
-		if s.Tok == token.DEC {
-			op = token.SUB
-		}
-		loc := b.addr(fn, s.X, false)
-		b.assignOp(fn, loc, NewConst(exact.MakeInt64(1), loc.typ()), op)
-
-	case *ast.AssignStmt:
-		switch s.Tok {
-		case token.ASSIGN, token.DEFINE:
-			b.assignStmt(fn, s.Lhs, s.Rhs, s.Tok == token.DEFINE)
-
-		default: // +=, etc.
-			op := s.Tok + token.ADD - token.ADD_ASSIGN
-			b.assignOp(fn, b.addr(fn, s.Lhs[0], false), b.expr(fn, s.Rhs[0]), op)
-		}
-
-	case *ast.GoStmt:
-		// The "intrinsics" new/make/len/cap are forbidden here.
-		// panic is treated like an ordinary function call.
-		v := Go{pos: s.Go}
-		b.setCall(fn, s.Call, &v.Call)
-		fn.emit(&v)
-
-	case *ast.DeferStmt:
-		// The "intrinsics" new/make/len/cap are forbidden here.
-		// panic is treated like an ordinary function call.
-		v := Defer{pos: s.Defer}
-		b.setCall(fn, s.Call, &v.Call)
-		fn.emit(&v)
-
-		// A deferred call can cause recovery from panic,
-		// and control resumes at the Recover block.
-		createRecoverBlock(fn)
-
-	case *ast.ReturnStmt:
-		var results []Value
-		if len(s.Results) == 1 && fn.Signature.Results().Len() > 1 {
-			// Return of one expression in a multi-valued function.
-			tuple := b.exprN(fn, s.Results[0])
-			ttuple := tuple.Type().(*types.Tuple)
-			for i, n := 0, ttuple.Len(); i < n; i++ {
-				results = append(results,
-					emitConv(fn, emitExtract(fn, tuple, i),
-						fn.Signature.Results().At(i).Type()))
-			}
-		} else {
-			// 1:1 return, or no-arg return in non-void function.
-			for i, r := range s.Results {
-				v := emitConv(fn, b.expr(fn, r), fn.Signature.Results().At(i).Type())
-				results = append(results, v)
-			}
-		}
-		if fn.namedResults != nil {
-			// Function has named result parameters (NRPs).
-			// Perform parallel assignment of return operands to NRPs.
-			for i, r := range results {
-				emitStore(fn, fn.namedResults[i], r, s.Return)
-			}
-		}
-		// Run function calls deferred in this
-		// function when explicitly returning from it.
-		fn.emit(new(RunDefers))
-		if fn.namedResults != nil {
-			// Reload NRPs to form the result tuple.
-			results = results[:0]
-			for _, r := range fn.namedResults {
-				results = append(results, emitLoad(fn, r))
-			}
-		}
-		fn.emit(&Return{Results: results, pos: s.Return})
-		fn.currentBlock = fn.newBasicBlock("unreachable")
-
-	case *ast.BranchStmt:
-		var block *BasicBlock
-		switch s.Tok {
-		case token.BREAK:
-			if s.Label != nil {
-				block = fn.labelledBlock(s.Label)._break
-			} else {
-				for t := fn.targets; t != nil && block == nil; t = t.tail {
-					block = t._break
-				}
-			}
-
-		case token.CONTINUE:
-			if s.Label != nil {
-				block = fn.labelledBlock(s.Label)._continue
-			} else {
-				for t := fn.targets; t != nil && block == nil; t = t.tail {
-					block = t._continue
-				}
-			}
-
-		case token.FALLTHROUGH:
-			for t := fn.targets; t != nil && block == nil; t = t.tail {
-				block = t._fallthrough
-			}
-
-		case token.GOTO:
-			block = fn.labelledBlock(s.Label)._goto
-		}
-		emitJump(fn, block)
-		fn.currentBlock = fn.newBasicBlock("unreachable")
-
-	case *ast.BlockStmt:
-		b.stmtList(fn, s.List)
-
-	case *ast.IfStmt:
-		if s.Init != nil {
-			b.stmt(fn, s.Init)
-		}
-		then := fn.newBasicBlock("if.then")
-		done := fn.newBasicBlock("if.done")
-		els := done
-		if s.Else != nil {
-			els = fn.newBasicBlock("if.else")
-		}
-		b.cond(fn, s.Cond, then, els)
-		fn.currentBlock = then
-		b.stmt(fn, s.Body)
-		emitJump(fn, done)
-
-		if s.Else != nil {
-			fn.currentBlock = els
-			b.stmt(fn, s.Else)
-			emitJump(fn, done)
-		}
-
-		fn.currentBlock = done
-
-	case *ast.SwitchStmt:
-		b.switchStmt(fn, s, label)
-
-	case *ast.TypeSwitchStmt:
-		b.typeSwitchStmt(fn, s, label)
-
-	case *ast.SelectStmt:
-		b.selectStmt(fn, s, label)
-
-	case *ast.ForStmt:
-		b.forStmt(fn, s, label)
-
-	case *ast.RangeStmt:
-		b.rangeStmt(fn, s, label)
-
-	default:
-		panic(fmt.Sprintf("unexpected statement kind: %T", s))
-	}
-}
-
-// buildFunction builds SSA code for the body of function fn.  Idempotent.
-func (b *builder) buildFunction(fn *Function) {
-	if fn.Blocks != nil {
-		return // building already started
-	}
-
-	var recvField *ast.FieldList
-	var body *ast.BlockStmt
-	var functype *ast.FuncType
-	switch n := fn.syntax.(type) {
-	case nil:
-		return // not a Go source function.  (Synthetic, or from object file.)
-	case *ast.FuncDecl:
-		functype = n.Type
-		recvField = n.Recv
-		body = n.Body
-	case *ast.FuncLit:
-		functype = n.Type
-		body = n.Body
-	default:
-		panic(n)
-	}
-
-	if body == nil {
-		// External function.
-		if fn.Params == nil {
-			// This condition ensures we add a non-empty
-			// params list once only, but we may attempt
-			// the degenerate empty case repeatedly.
-			// TODO(adonovan): opt: don't do that.
-
-			// We set Function.Params even though there is no body
-			// code to reference them.  This simplifies clients.
-			if recv := fn.Signature.Recv(); recv != nil {
-				fn.addParamObj(recv)
-			}
-			params := fn.Signature.Params()
-			for i, n := 0, params.Len(); i < n; i++ {
-				fn.addParamObj(params.At(i))
-			}
-		}
-		return
-	}
-	if fn.Prog.mode&LogSource != 0 {
-		defer logStack("build function %s @ %s", fn, fn.Prog.Fset.Position(fn.pos))()
-	}
-	fn.startBody()
-	fn.createSyntacticParams(recvField, functype)
-	b.stmt(fn, body)
-	if cb := fn.currentBlock; cb != nil && (cb == fn.Blocks[0] || cb == fn.Recover || cb.Preds != nil) {
-		// Control fell off the end of the function's body block.
-		//
-		// Block optimizations eliminate the current block, if
-		// unreachable.  It is a builder invariant that
-		// if this no-arg return is ill-typed for
-		// fn.Signature.Results, this block must be
-		// unreachable.  The sanity checker checks this.
-		fn.emit(new(RunDefers))
-		fn.emit(new(Return))
-	}
-	fn.finishBody()
-}
-
-// buildFuncDecl builds SSA code for the function or method declared
-// by decl in package pkg.
-//
-func (b *builder) buildFuncDecl(pkg *Package, decl *ast.FuncDecl) {
-	id := decl.Name
-	if isBlankIdent(id) {
-		return // discard
-	}
-	fn := pkg.values[pkg.info.Defs[id]].(*Function)
-	if decl.Recv == nil && id.Name == "init" {
-		var v Call
-		v.Call.Value = fn
-		v.setType(types.NewTuple())
-		pkg.init.emit(&v)
-	}
-	b.buildFunction(fn)
-}
-
-// BuildAll calls Package.Build() for each package in prog.
-// Building occurs in parallel unless the BuildSerially mode flag was set.
-//
-// BuildAll is idempotent and thread-safe.
-//
-func (prog *Program) BuildAll() {
-	var wg sync.WaitGroup
-	for _, p := range prog.packages {
-		if prog.mode&BuildSerially != 0 {
-			p.Build()
-		} else {
-			wg.Add(1)
-			go func(p *Package) {
-				p.Build()
-				wg.Done()
-			}(p)
-		}
-	}
-	wg.Wait()
-}
-
-// Build builds SSA code for all functions and vars in package p.
-//
-// Precondition: CreatePackage must have been called for all of p's
-// direct imports (and hence its direct imports must have been
-// error-free).
-//
-// Build is idempotent and thread-safe.
-//
-func (p *Package) Build() {
-	if !atomic.CompareAndSwapInt32(&p.started, 0, 1) {
-		return // already started
-	}
-	if p.info == nil {
-		return // synthetic package, e.g. "testmain"
-	}
-	if len(p.info.Files) == 0 {
-		p.info = nil
-		return // package loaded from export data
-	}
-
-	// Ensure we have runtime type info for all exported members.
-	// TODO(adonovan): ideally belongs in memberFromObject, but
-	// that would require package creation in topological order.
-	for name, mem := range p.Members {
-		if ast.IsExported(name) {
-			p.Prog.needMethodsOf(mem.Type())
-		}
-	}
-	if p.Prog.mode&LogSource != 0 {
-		defer logStack("build %s", p)()
-	}
-	init := p.init
-	init.startBody()
-
-	var done *BasicBlock
-
-	if p.Prog.mode&BareInits == 0 {
-		// Make init() skip if package is already initialized.
-		initguard := p.Var("init$guard")
-		doinit := init.newBasicBlock("init.start")
-		done = init.newBasicBlock("init.done")
-		emitIf(init, emitLoad(init, initguard), done, doinit)
-		init.currentBlock = doinit
-		emitStore(init, initguard, vTrue, token.NoPos)
-
-		// Call the init() function of each package we import.
-		for _, pkg := range p.info.Pkg.Imports() {
-			prereq := p.Prog.packages[pkg]
-			if prereq == nil {
-				panic(fmt.Sprintf("Package(%q).Build(): unsatisfied import: Program.CreatePackage(%q) was not called", p.Object.Path(), pkg.Path()))
-			}
-			var v Call
-			v.Call.Value = prereq.init
-			v.Call.pos = init.pos
-			v.setType(types.NewTuple())
-			init.emit(&v)
-		}
-	}
-
-	var b builder
-
-	// Initialize package-level vars in correct order.
-	for _, varinit := range p.info.InitOrder {
-		if init.Prog.mode&LogSource != 0 {
-			fmt.Fprintf(os.Stderr, "build global initializer %v @ %s\n",
-				varinit.Lhs, p.Prog.Fset.Position(varinit.Rhs.Pos()))
-		}
-		if len(varinit.Lhs) == 1 {
-			// 1:1 initialization: var x, y = a(), b()
-			var lval lvalue
-			if v := varinit.Lhs[0]; v.Name() != "_" {
-				lval = &address{addr: p.values[v].(*Global), pos: v.Pos()}
-			} else {
-				lval = blank{}
-			}
-			b.assign(init, lval, varinit.Rhs, true, nil)
-		} else {
-			// n:1 initialization: var x, y :=  f()
-			tuple := b.exprN(init, varinit.Rhs)
-			for i, v := range varinit.Lhs {
-				if v.Name() == "_" {
-					continue
-				}
-				emitStore(init, p.values[v].(*Global), emitExtract(init, tuple, i), v.Pos())
-			}
-		}
-	}
-
-	// Build all package-level functions, init functions
-	// and methods, including unreachable/blank ones.
-	// We build them in source order, but it's not significant.
-	for _, file := range p.info.Files {
-		for _, decl := range file.Decls {
-			if decl, ok := decl.(*ast.FuncDecl); ok {
-				b.buildFuncDecl(p, decl)
-			}
-		}
-	}
-
-	// Finish up init().
-	if p.Prog.mode&BareInits == 0 {
-		emitJump(init, done)
-		init.currentBlock = done
-	}
-	init.emit(new(Return))
-	init.finishBody()
-
-	p.info = nil // We no longer need ASTs or go/types deductions.
-
-	if p.Prog.mode&SanityCheckFunctions != 0 {
-		sanityCheckPackage(p)
-	}
-}
-
-// Like ObjectOf, but panics instead of returning nil.
-// Only valid during p's create and build phases.
-func (p *Package) objectOf(id *ast.Ident) types.Object {
-	if o := p.info.ObjectOf(id); o != nil {
-		return o
-	}
-	panic(fmt.Sprintf("no types.Object for ast.Ident %s @ %s",
-		id.Name, p.Prog.Fset.Position(id.Pos())))
-}
-
-// Like TypeOf, but panics instead of returning nil.
-// Only valid during p's create and build phases.
-func (p *Package) typeOf(e ast.Expr) types.Type {
-	if T := p.info.TypeOf(e); T != nil {
-		return T
-	}
-	panic(fmt.Sprintf("no type for %T @ %s",
-		e, p.Prog.Fset.Position(e.Pos())))
-}
diff --git a/third_party/gotools/go/ssa/builder_test.go b/third_party/gotools/go/ssa/builder_test.go
deleted file mode 100644
index 6c5b6bc..0000000
--- a/third_party/gotools/go/ssa/builder_test.go
+++ /dev/null
@@ -1,415 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa_test
-
-import (
-	"bytes"
-	"reflect"
-	"sort"
-	"strings"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/ssa/ssautil"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-func isEmpty(f *ssa.Function) bool { return f.Blocks == nil }
-
-// Tests that programs partially loaded from gc object files contain
-// functions with no code for the external portions, but are otherwise ok.
-func TestImportFromBinary(t *testing.T) {
-	test := `
-package main
-
-import (
-	"bytes"
-	"io"
-	"testing"
-)
-
-func main() {
-        var t testing.T
-	t.Parallel()    // static call to external declared method
-        t.Fail()        // static call to promoted external declared method
-        testing.Short() // static call to external package-level function
-
-        var w io.Writer = new(bytes.Buffer)
-        w.Write(nil)    // interface invoke of external declared method
-}
-`
-
-	// Create a single-file main package.
-	conf := loader.Config{ImportFromBinary: true}
-	f, err := conf.ParseFile("<input>", test)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	conf.CreateFromFiles("main", f)
-
-	iprog, err := conf.Load()
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	prog := ssa.Create(iprog, ssa.SanityCheckFunctions)
-	mainPkg := prog.Package(iprog.Created[0].Pkg)
-	mainPkg.Build()
-
-	// The main package, its direct and indirect dependencies are loaded.
-	deps := []string{
-		// directly imported dependencies:
-		"bytes", "io", "testing",
-		// indirect dependencies (partial list):
-		"errors", "fmt", "os", "runtime",
-	}
-
-	all := prog.AllPackages()
-	if len(all) <= len(deps) {
-		t.Errorf("unexpected set of loaded packages: %q", all)
-	}
-	for _, path := range deps {
-		pkg := prog.ImportedPackage(path)
-		if pkg == nil {
-			t.Errorf("package not loaded: %q", path)
-			continue
-		}
-
-		// External packages should have no function bodies (except for wrappers).
-		isExt := pkg != mainPkg
-
-		// init()
-		if isExt && !isEmpty(pkg.Func("init")) {
-			t.Errorf("external package %s has non-empty init", pkg)
-		} else if !isExt && isEmpty(pkg.Func("init")) {
-			t.Errorf("main package %s has empty init", pkg)
-		}
-
-		for _, mem := range pkg.Members {
-			switch mem := mem.(type) {
-			case *ssa.Function:
-				// Functions at package level.
-				if isExt && !isEmpty(mem) {
-					t.Errorf("external function %s is non-empty", mem)
-				} else if !isExt && isEmpty(mem) {
-					t.Errorf("function %s is empty", mem)
-				}
-
-			case *ssa.Type:
-				// Methods of named types T.
-				// (In this test, all exported methods belong to *T not T.)
-				if !isExt {
-					t.Fatalf("unexpected name type in main package: %s", mem)
-				}
-				mset := prog.MethodSets.MethodSet(types.NewPointer(mem.Type()))
-				for i, n := 0, mset.Len(); i < n; i++ {
-					m := prog.Method(mset.At(i))
-					// For external types, only synthetic wrappers have code.
-					expExt := !strings.Contains(m.Synthetic, "wrapper")
-					if expExt && !isEmpty(m) {
-						t.Errorf("external method %s is non-empty: %s",
-							m, m.Synthetic)
-					} else if !expExt && isEmpty(m) {
-						t.Errorf("method function %s is empty: %s",
-							m, m.Synthetic)
-					}
-				}
-			}
-		}
-	}
-
-	expectedCallee := []string{
-		"(*testing.T).Parallel",
-		"(*testing.common).Fail",
-		"testing.Short",
-		"N/A",
-	}
-	callNum := 0
-	for _, b := range mainPkg.Func("main").Blocks {
-		for _, instr := range b.Instrs {
-			switch instr := instr.(type) {
-			case ssa.CallInstruction:
-				call := instr.Common()
-				if want := expectedCallee[callNum]; want != "N/A" {
-					got := call.StaticCallee().String()
-					if want != got {
-						t.Errorf("call #%d from main.main: got callee %s, want %s",
-							callNum, got, want)
-					}
-				}
-				callNum++
-			}
-		}
-	}
-	if callNum != 4 {
-		t.Errorf("in main.main: got %d calls, want %d", callNum, 4)
-	}
-}
-
-// TestRuntimeTypes tests that (*Program).RuntimeTypes() includes all necessary types.
-func TestRuntimeTypes(t *testing.T) {
-	tests := []struct {
-		input string
-		want  []string
-	}{
-		// An exported package-level type is needed.
-		{`package A; type T struct{}; func (T) f() {}`,
-			[]string{"*p.T", "p.T"},
-		},
-		// An unexported package-level type is not needed.
-		{`package B; type t struct{}; func (t) f() {}`,
-			nil,
-		},
-		// Subcomponents of type of exported package-level var are needed.
-		{`package C; import "bytes"; var V struct {*bytes.Buffer}`,
-			[]string{"*bytes.Buffer", "*struct{*bytes.Buffer}", "struct{*bytes.Buffer}"},
-		},
-		// Subcomponents of type of unexported package-level var are not needed.
-		{`package D; import "bytes"; var v struct {*bytes.Buffer}`,
-			nil,
-		},
-		// Subcomponents of type of exported package-level function are needed.
-		{`package E; import "bytes"; func F(struct {*bytes.Buffer}) {}`,
-			[]string{"*bytes.Buffer", "struct{*bytes.Buffer}"},
-		},
-		// Subcomponents of type of unexported package-level function are not needed.
-		{`package F; import "bytes"; func f(struct {*bytes.Buffer}) {}`,
-			nil,
-		},
-		// Subcomponents of type of exported method of uninstantiated unexported type are not needed.
-		{`package G; import "bytes"; type x struct{}; func (x) G(struct {*bytes.Buffer}) {}; var v x`,
-			nil,
-		},
-		// ...unless used by MakeInterface.
-		{`package G2; import "bytes"; type x struct{}; func (x) G(struct {*bytes.Buffer}) {}; var v interface{} = x{}`,
-			[]string{"*bytes.Buffer", "*p.x", "p.x", "struct{*bytes.Buffer}"},
-		},
-		// Subcomponents of type of unexported method are not needed.
-		{`package I; import "bytes"; type X struct{}; func (X) G(struct {*bytes.Buffer}) {}`,
-			[]string{"*bytes.Buffer", "*p.X", "p.X", "struct{*bytes.Buffer}"},
-		},
-		// Local types aren't needed.
-		{`package J; import "bytes"; func f() { type T struct {*bytes.Buffer}; var t T; _ = t }`,
-			nil,
-		},
-		// ...unless used by MakeInterface.
-		{`package K; import "bytes"; func f() { type T struct {*bytes.Buffer}; _ = interface{}(T{}) }`,
-			[]string{"*bytes.Buffer", "*p.T", "p.T"},
-		},
-		// Types used as operand of MakeInterface are needed.
-		{`package L; import "bytes"; func f() { _ = interface{}(struct{*bytes.Buffer}{}) }`,
-			[]string{"*bytes.Buffer", "struct{*bytes.Buffer}"},
-		},
-		// MakeInterface is optimized away when storing to a blank.
-		{`package M; import "bytes"; var _ interface{} = struct{*bytes.Buffer}{}`,
-			nil,
-		},
-	}
-	for _, test := range tests {
-		// Create a single-file main package.
-		conf := loader.Config{ImportFromBinary: true}
-		f, err := conf.ParseFile("<input>", test.input)
-		if err != nil {
-			t.Errorf("test %q: %s", test.input[:15], err)
-			continue
-		}
-		conf.CreateFromFiles("p", f)
-
-		iprog, err := conf.Load()
-		if err != nil {
-			t.Errorf("test 'package %s': Load: %s", f.Name.Name, err)
-			continue
-		}
-		prog := ssa.Create(iprog, ssa.SanityCheckFunctions)
-		prog.BuildAll()
-
-		var typstrs []string
-		for _, T := range prog.RuntimeTypes() {
-			typstrs = append(typstrs, T.String())
-		}
-		sort.Strings(typstrs)
-
-		if !reflect.DeepEqual(typstrs, test.want) {
-			t.Errorf("test 'package %s': got %q, want %q",
-				f.Name.Name, typstrs, test.want)
-		}
-	}
-}
-
-// Tests that synthesized init functions are correctly formed.
-// Bare init functions omit calls to dependent init functions and the use of
-// an init guard. They are useful in cases where the client uses a different
-// calling convention for init functions, or cases where it is easier for a
-// client to analyze bare init functions. Both of these aspects are used by
-// the llgo compiler for simpler integration with gccgo's runtime library,
-// and to simplify the analysis whereby it deduces which stores to globals
-// can be lowered to global initializers.
-func TestInit(t *testing.T) {
-	tests := []struct {
-		mode        ssa.BuilderMode
-		input, want string
-	}{
-		{0, `package A; import _ "errors"; var i int = 42`,
-			`# Name: A.init
-# Package: A
-# Synthetic: package initializer
-func init():
-0:                                                                entry P:0 S:2
-	t0 = *init$guard                                                   bool
-	if t0 goto 2 else 1
-1:                                                           init.start P:1 S:1
-	*init$guard = true:bool
-	t1 = errors.init()                                                   ()
-	*i = 42:int
-	jump 2
-2:                                                            init.done P:2 S:0
-	return
-
-`},
-		{ssa.BareInits, `package B; import _ "errors"; var i int = 42`,
-			`# Name: B.init
-# Package: B
-# Synthetic: package initializer
-func init():
-0:                                                                entry P:0 S:0
-	*i = 42:int
-	return
-
-`},
-	}
-	for _, test := range tests {
-		// Create a single-file main package.
-		var conf loader.Config
-		f, err := conf.ParseFile("<input>", test.input)
-		if err != nil {
-			t.Errorf("test %q: %s", test.input[:15], err)
-			continue
-		}
-		conf.CreateFromFiles(f.Name.Name, f)
-
-		iprog, err := conf.Load()
-		if err != nil {
-			t.Errorf("test 'package %s': Load: %s", f.Name.Name, err)
-			continue
-		}
-		prog := ssa.Create(iprog, test.mode)
-		mainPkg := prog.Package(iprog.Created[0].Pkg)
-		prog.BuildAll()
-		initFunc := mainPkg.Func("init")
-		if initFunc == nil {
-			t.Errorf("test 'package %s': no init function", f.Name.Name)
-			continue
-		}
-
-		var initbuf bytes.Buffer
-		_, err = initFunc.WriteTo(&initbuf)
-		if err != nil {
-			t.Errorf("test 'package %s': WriteTo: %s", f.Name.Name, err)
-			continue
-		}
-
-		if initbuf.String() != test.want {
-			t.Errorf("test 'package %s': got %s, want %s", f.Name.Name, initbuf.String(), test.want)
-		}
-	}
-}
-
-// TestSyntheticFuncs checks that the expected synthetic functions are
-// created, reachable, and not duplicated.
-func TestSyntheticFuncs(t *testing.T) {
-	const input = `package P
-type T int
-func (T) f() int
-func (*T) g() int
-var (
-	// thunks
-	a = T.f
-	b = T.f
-	c = (struct{T}).f
-	d = (struct{T}).f
-	e = (*T).g
-	f = (*T).g
-	g = (struct{*T}).g
-	h = (struct{*T}).g
-
-	// bounds
-	i = T(0).f
-	j = T(0).f
-	k = new(T).g
-	l = new(T).g
-
-	// wrappers
-	m interface{} = struct{T}{}
-	n interface{} = struct{T}{}
-	o interface{} = struct{*T}{}
-	p interface{} = struct{*T}{}
-	q interface{} = new(struct{T})
-	r interface{} = new(struct{T})
-	s interface{} = new(struct{*T})
-	t interface{} = new(struct{*T})
-)
-`
-	// Parse
-	var conf loader.Config
-	f, err := conf.ParseFile("<input>", input)
-	if err != nil {
-		t.Fatalf("parse: %v", err)
-	}
-	conf.CreateFromFiles(f.Name.Name, f)
-
-	// Load
-	iprog, err := conf.Load()
-	if err != nil {
-		t.Fatalf("Load: %v", err)
-	}
-
-	// Create and build SSA
-	prog := ssa.Create(iprog, 0)
-	prog.BuildAll()
-
-	// Enumerate reachable synthetic functions
-	want := map[string]string{
-		"(*P.T).g$bound": "bound method wrapper for func (*P.T).g() int",
-		"(P.T).f$bound":  "bound method wrapper for func (P.T).f() int",
-
-		"(*P.T).g$thunk":         "thunk for func (*P.T).g() int",
-		"(P.T).f$thunk":          "thunk for func (P.T).f() int",
-		"(struct{*P.T}).g$thunk": "thunk for func (*P.T).g() int",
-		"(struct{P.T}).f$thunk":  "thunk for func (P.T).f() int",
-
-		"(*P.T).f":          "wrapper for func (P.T).f() int",
-		"(*struct{*P.T}).f": "wrapper for func (P.T).f() int",
-		"(*struct{*P.T}).g": "wrapper for func (*P.T).g() int",
-		"(*struct{P.T}).f":  "wrapper for func (P.T).f() int",
-		"(*struct{P.T}).g":  "wrapper for func (*P.T).g() int",
-		"(struct{*P.T}).f":  "wrapper for func (P.T).f() int",
-		"(struct{*P.T}).g":  "wrapper for func (*P.T).g() int",
-		"(struct{P.T}).f":   "wrapper for func (P.T).f() int",
-
-		"P.init": "package initializer",
-	}
-	for fn := range ssautil.AllFunctions(prog) {
-		if fn.Synthetic == "" {
-			continue
-		}
-		name := fn.String()
-		wantDescr, ok := want[name]
-		if !ok {
-			t.Errorf("got unexpected/duplicate func: %q: %q", name, fn.Synthetic)
-			continue
-		}
-		delete(want, name)
-
-		if wantDescr != fn.Synthetic {
-			t.Errorf("(%s).Synthetic = %q, want %q", name, fn.Synthetic, wantDescr)
-		}
-	}
-	for fn, descr := range want {
-		t.Errorf("want func: %q: %q", fn, descr)
-	}
-}
diff --git a/third_party/gotools/go/ssa/const.go b/third_party/gotools/go/ssa/const.go
deleted file mode 100644
index d9a14ee..0000000
--- a/third_party/gotools/go/ssa/const.go
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines the Const SSA value type.
-
-import (
-	"fmt"
-	"go/token"
-	"strconv"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// NewConst returns a new constant of the specified value and type.
-// val must be valid according to the specification of Const.Value.
-//
-func NewConst(val exact.Value, typ types.Type) *Const {
-	return &Const{typ, val}
-}
-
-// intConst returns an 'int' constant that evaluates to i.
-// (i is an int64 in case the host is narrower than the target.)
-func intConst(i int64) *Const {
-	return NewConst(exact.MakeInt64(i), tInt)
-}
-
-// nilConst returns a nil constant of the specified type, which may
-// be any reference type, including interfaces.
-//
-func nilConst(typ types.Type) *Const {
-	return NewConst(nil, typ)
-}
-
-// stringConst returns a 'string' constant that evaluates to s.
-func stringConst(s string) *Const {
-	return NewConst(exact.MakeString(s), tString)
-}
-
-// zeroConst returns a new "zero" constant of the specified type,
-// which must not be an array or struct type: the zero values of
-// aggregates are well-defined but cannot be represented by Const.
-//
-func zeroConst(t types.Type) *Const {
-	switch t := t.(type) {
-	case *types.Basic:
-		switch {
-		case t.Info()&types.IsBoolean != 0:
-			return NewConst(exact.MakeBool(false), t)
-		case t.Info()&types.IsNumeric != 0:
-			return NewConst(exact.MakeInt64(0), t)
-		case t.Info()&types.IsString != 0:
-			return NewConst(exact.MakeString(""), t)
-		case t.Kind() == types.UnsafePointer:
-			fallthrough
-		case t.Kind() == types.UntypedNil:
-			return nilConst(t)
-		default:
-			panic(fmt.Sprint("zeroConst for unexpected type:", t))
-		}
-	case *types.Pointer, *types.Slice, *types.Interface, *types.Chan, *types.Map, *types.Signature:
-		return nilConst(t)
-	case *types.Named:
-		return NewConst(zeroConst(t.Underlying()).Value, t)
-	case *types.Array, *types.Struct, *types.Tuple:
-		panic(fmt.Sprint("zeroConst applied to aggregate:", t))
-	}
-	panic(fmt.Sprint("zeroConst: unexpected ", t))
-}
-
-func (c *Const) RelString(from *types.Package) string {
-	var s string
-	if c.Value == nil {
-		s = "nil"
-	} else if c.Value.Kind() == exact.String {
-		s = exact.StringVal(c.Value)
-		const max = 20
-		// TODO(adonovan): don't cut a rune in half.
-		if len(s) > max {
-			s = s[:max-3] + "..." // abbreviate
-		}
-		s = strconv.Quote(s)
-	} else {
-		s = c.Value.String()
-	}
-	return s + ":" + relType(c.Type(), from)
-}
-
-func (c *Const) Name() string {
-	return c.RelString(nil)
-}
-
-func (c *Const) String() string {
-	return c.Name()
-}
-
-func (c *Const) Type() types.Type {
-	return c.typ
-}
-
-func (c *Const) Referrers() *[]Instruction {
-	return nil
-}
-
-func (c *Const) Parent() *Function { return nil }
-
-func (c *Const) Pos() token.Pos {
-	return token.NoPos
-}
-
-// IsNil returns true if this constant represents a typed or untyped nil value.
-func (c *Const) IsNil() bool {
-	return c.Value == nil
-}
-
-// Int64 returns the numeric value of this constant truncated to fit
-// a signed 64-bit integer.
-//
-func (c *Const) Int64() int64 {
-	switch x := c.Value; x.Kind() {
-	case exact.Int:
-		if i, ok := exact.Int64Val(x); ok {
-			return i
-		}
-		return 0
-	case exact.Float:
-		f, _ := exact.Float64Val(x)
-		return int64(f)
-	}
-	panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
-}
-
-// Uint64 returns the numeric value of this constant truncated to fit
-// an unsigned 64-bit integer.
-//
-func (c *Const) Uint64() uint64 {
-	switch x := c.Value; x.Kind() {
-	case exact.Int:
-		if u, ok := exact.Uint64Val(x); ok {
-			return u
-		}
-		return 0
-	case exact.Float:
-		f, _ := exact.Float64Val(x)
-		return uint64(f)
-	}
-	panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
-}
-
-// Float64 returns the numeric value of this constant truncated to fit
-// a float64.
-//
-func (c *Const) Float64() float64 {
-	f, _ := exact.Float64Val(c.Value)
-	return f
-}
-
-// Complex128 returns the complex value of this constant truncated to
-// fit a complex128.
-//
-func (c *Const) Complex128() complex128 {
-	re, _ := exact.Float64Val(exact.Real(c.Value))
-	im, _ := exact.Float64Val(exact.Imag(c.Value))
-	return complex(re, im)
-}
diff --git a/third_party/gotools/go/ssa/create.go b/third_party/gotools/go/ssa/create.go
deleted file mode 100644
index e6b1568..0000000
--- a/third_party/gotools/go/ssa/create.go
+++ /dev/null
@@ -1,272 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the CREATE phase of SSA construction.
-// See builder.go for explanation.
-
-import (
-	"fmt"
-	"go/ast"
-	"go/token"
-	"os"
-	"sync"
-
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-)
-
-// Create returns a new SSA Program.  An SSA Package is created for
-// each transitively error-free package of iprog.
-//
-// Code for bodies of functions is not built until Build() is called
-// on the result.
-//
-// mode controls diagnostics and checking during SSA construction.
-//
-func Create(iprog *loader.Program, mode BuilderMode) *Program {
-	prog := &Program{
-		Fset:     iprog.Fset,
-		imported: make(map[string]*Package),
-		packages: make(map[*types.Package]*Package),
-		thunks:   make(map[selectionKey]*Function),
-		bounds:   make(map[*types.Func]*Function),
-		mode:     mode,
-	}
-
-	h := typeutil.MakeHasher() // protected by methodsMu, in effect
-	prog.methodSets.SetHasher(h)
-	prog.canon.SetHasher(h)
-
-	for _, info := range iprog.AllPackages {
-		// TODO(adonovan): relax this constraint if the
-		// program contains only "soft" errors.
-		if info.TransitivelyErrorFree {
-			prog.CreatePackage(info)
-		}
-	}
-
-	return prog
-}
-
-// memberFromObject populates package pkg with a member for the
-// typechecker object obj.
-//
-// For objects from Go source code, syntax is the associated syntax
-// tree (for funcs and vars only); it will be used during the build
-// phase.
-//
-func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) {
-	name := obj.Name()
-	switch obj := obj.(type) {
-	case *types.TypeName:
-		pkg.Members[name] = &Type{
-			object: obj,
-			pkg:    pkg,
-		}
-
-	case *types.Const:
-		c := &NamedConst{
-			object: obj,
-			Value:  NewConst(obj.Val(), obj.Type()),
-			pkg:    pkg,
-		}
-		pkg.values[obj] = c.Value
-		pkg.Members[name] = c
-
-	case *types.Var:
-		g := &Global{
-			Pkg:    pkg,
-			name:   name,
-			object: obj,
-			typ:    types.NewPointer(obj.Type()), // address
-			pos:    obj.Pos(),
-		}
-		pkg.values[obj] = g
-		pkg.Members[name] = g
-
-	case *types.Func:
-		sig := obj.Type().(*types.Signature)
-		if sig.Recv() == nil && name == "init" {
-			pkg.ninit++
-			name = fmt.Sprintf("init#%d", pkg.ninit)
-		}
-		fn := &Function{
-			name:      name,
-			object:    obj,
-			Signature: sig,
-			syntax:    syntax,
-			pos:       obj.Pos(),
-			Pkg:       pkg,
-			Prog:      pkg.Prog,
-		}
-		if syntax == nil {
-			fn.Synthetic = "loaded from gc object file"
-		}
-
-		pkg.values[obj] = fn
-		if sig.Recv() == nil {
-			pkg.Members[name] = fn // package-level function
-		}
-
-	default: // (incl. *types.Package)
-		panic("unexpected Object type: " + obj.String())
-	}
-}
-
-// membersFromDecl populates package pkg with members for each
-// typechecker object (var, func, const or type) associated with the
-// specified decl.
-//
-func membersFromDecl(pkg *Package, decl ast.Decl) {
-	switch decl := decl.(type) {
-	case *ast.GenDecl: // import, const, type or var
-		switch decl.Tok {
-		case token.CONST:
-			for _, spec := range decl.Specs {
-				for _, id := range spec.(*ast.ValueSpec).Names {
-					if !isBlankIdent(id) {
-						memberFromObject(pkg, pkg.info.Defs[id], nil)
-					}
-				}
-			}
-
-		case token.VAR:
-			for _, spec := range decl.Specs {
-				for _, id := range spec.(*ast.ValueSpec).Names {
-					if !isBlankIdent(id) {
-						memberFromObject(pkg, pkg.info.Defs[id], spec)
-					}
-				}
-			}
-
-		case token.TYPE:
-			for _, spec := range decl.Specs {
-				id := spec.(*ast.TypeSpec).Name
-				if !isBlankIdent(id) {
-					memberFromObject(pkg, pkg.info.Defs[id], nil)
-				}
-			}
-		}
-
-	case *ast.FuncDecl:
-		id := decl.Name
-		if !isBlankIdent(id) {
-			memberFromObject(pkg, pkg.info.Defs[id], decl)
-		}
-	}
-}
-
-// CreatePackage constructs and returns an SSA Package from an
-// error-free package described by info, and populates its Members
-// mapping.
-//
-// Repeated calls with the same info return the same Package.
-//
-// The real work of building SSA form for each function is not done
-// until a subsequent call to Package.Build().
-//
-func (prog *Program) CreatePackage(info *loader.PackageInfo) *Package {
-	if p := prog.packages[info.Pkg]; p != nil {
-		return p // already loaded
-	}
-
-	p := &Package{
-		Prog:    prog,
-		Members: make(map[string]Member),
-		values:  make(map[types.Object]Value),
-		Object:  info.Pkg,
-		info:    info, // transient (CREATE and BUILD phases)
-	}
-
-	// Add init() function.
-	p.init = &Function{
-		name:      "init",
-		Signature: new(types.Signature),
-		Synthetic: "package initializer",
-		Pkg:       p,
-		Prog:      prog,
-	}
-	p.Members[p.init.name] = p.init
-
-	// CREATE phase.
-	// Allocate all package members: vars, funcs, consts and types.
-	if len(info.Files) > 0 {
-		// Go source package.
-		for _, file := range info.Files {
-			for _, decl := range file.Decls {
-				membersFromDecl(p, decl)
-			}
-		}
-	} else {
-		// GC-compiled binary package.
-		// No code.
-		// No position information.
-		scope := p.Object.Scope()
-		for _, name := range scope.Names() {
-			obj := scope.Lookup(name)
-			memberFromObject(p, obj, nil)
-			if obj, ok := obj.(*types.TypeName); ok {
-				named := obj.Type().(*types.Named)
-				for i, n := 0, named.NumMethods(); i < n; i++ {
-					memberFromObject(p, named.Method(i), nil)
-				}
-			}
-		}
-	}
-
-	if prog.mode&BareInits == 0 {
-		// Add initializer guard variable.
-		initguard := &Global{
-			Pkg:  p,
-			name: "init$guard",
-			typ:  types.NewPointer(tBool),
-		}
-		p.Members[initguard.Name()] = initguard
-	}
-
-	if prog.mode&GlobalDebug != 0 {
-		p.SetDebugMode(true)
-	}
-
-	if prog.mode&PrintPackages != 0 {
-		printMu.Lock()
-		p.WriteTo(os.Stdout)
-		printMu.Unlock()
-	}
-
-	if info.Importable {
-		prog.imported[info.Pkg.Path()] = p
-	}
-	prog.packages[p.Object] = p
-
-	return p
-}
-
-// printMu serializes printing of Packages/Functions to stdout.
-var printMu sync.Mutex
-
-// AllPackages returns a new slice containing all packages in the
-// program prog in unspecified order.
-//
-func (prog *Program) AllPackages() []*Package {
-	pkgs := make([]*Package, 0, len(prog.packages))
-	for _, pkg := range prog.packages {
-		pkgs = append(pkgs, pkg)
-	}
-	return pkgs
-}
-
-// ImportedPackage returns the importable SSA Package whose import
-// path is path, or nil if no such SSA package has been created.
-//
-// Not all packages are importable.  For example, no import
-// declaration can resolve to the x_test package created by 'go test'
-// or the ad-hoc main package created 'go build foo.go'.
-//
-func (prog *Program) ImportedPackage(path string) *Package {
-	return prog.imported[path]
-}
diff --git a/third_party/gotools/go/ssa/doc.go b/third_party/gotools/go/ssa/doc.go
deleted file mode 100644
index 3781c95..0000000
--- a/third_party/gotools/go/ssa/doc.go
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package ssa defines a representation of the elements of Go programs
-// (packages, types, functions, variables and constants) using a
-// static single-assignment (SSA) form intermediate representation
-// (IR) for the bodies of functions.
-//
-// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE.
-//
-// For an introduction to SSA form, see
-// http://en.wikipedia.org/wiki/Static_single_assignment_form.
-// This page provides a broader reading list:
-// http://www.dcs.gla.ac.uk/~jsinger/ssa.html.
-//
-// The level of abstraction of the SSA form is intentionally close to
-// the source language to facilitate construction of source analysis
-// tools.  It is not intended for machine code generation.
-//
-// All looping, branching and switching constructs are replaced with
-// unstructured control flow.  Higher-level control flow constructs
-// such as multi-way branch can be reconstructed as needed; see
-// ssautil.Switches() for an example.
-//
-// To construct an SSA-form program, call ssa.Create on a
-// loader.Program, a set of type-checked packages created from
-// parsed Go source files.  The resulting ssa.Program contains all the
-// packages and their members, but SSA code is not created for
-// function bodies until a subsequent call to (*Package).Build.
-//
-// The builder initially builds a naive SSA form in which all local
-// variables are addresses of stack locations with explicit loads and
-// stores.  Registerisation of eligible locals and φ-node insertion
-// using dominance and dataflow are then performed as a second pass
-// called "lifting" to improve the accuracy and performance of
-// subsequent analyses; this pass can be skipped by setting the
-// NaiveForm builder flag.
-//
-// The primary interfaces of this package are:
-//
-//    - Member: a named member of a Go package.
-//    - Value: an expression that yields a value.
-//    - Instruction: a statement that consumes values and performs computation.
-//    - Node: a Value or Instruction (emphasizing its membership in the SSA value graph)
-//
-// A computation that yields a result implements both the Value and
-// Instruction interfaces.  The following table shows for each
-// concrete type which of these interfaces it implements.
-//
-//                      Value?          Instruction?    Member?
-//   *Alloc             ✔               ✔
-//   *BinOp             ✔               ✔
-//   *Builtin           ✔
-//   *Call              ✔               ✔
-//   *ChangeInterface   ✔               ✔
-//   *ChangeType        ✔               ✔
-//   *Const             ✔
-//   *Convert           ✔               ✔
-//   *DebugRef                          ✔
-//   *Defer                             ✔
-//   *Extract           ✔               ✔
-//   *Field             ✔               ✔
-//   *FieldAddr         ✔               ✔
-//   *FreeVar           ✔
-//   *Function          ✔                               ✔ (func)
-//   *Global            ✔                               ✔ (var)
-//   *Go                                ✔
-//   *If                                ✔
-//   *Index             ✔               ✔
-//   *IndexAddr         ✔               ✔
-//   *Jump                              ✔
-//   *Lookup            ✔               ✔
-//   *MakeChan          ✔               ✔
-//   *MakeClosure       ✔               ✔
-//   *MakeInterface     ✔               ✔
-//   *MakeMap           ✔               ✔
-//   *MakeSlice         ✔               ✔
-//   *MapUpdate                         ✔
-//   *NamedConst                                        ✔ (const)
-//   *Next              ✔               ✔
-//   *Panic                             ✔
-//   *Parameter         ✔
-//   *Phi               ✔               ✔
-//   *Range             ✔               ✔
-//   *Return                            ✔
-//   *RunDefers                         ✔
-//   *Select            ✔               ✔
-//   *Send                              ✔
-//   *Slice             ✔               ✔
-//   *Store                             ✔
-//   *Type                                              ✔ (type)
-//   *TypeAssert        ✔               ✔
-//   *UnOp              ✔               ✔
-//
-// Other key types in this package include: Program, Package, Function
-// and BasicBlock.
-//
-// The program representation constructed by this package is fully
-// resolved internally, i.e. it does not rely on the names of Values,
-// Packages, Functions, Types or BasicBlocks for the correct
-// interpretation of the program.  Only the identities of objects and
-// the topology of the SSA and type graphs are semantically
-// significant.  (There is one exception: Ids, used to identify field
-// and method names, contain strings.)  Avoidance of name-based
-// operations simplifies the implementation of subsequent passes and
-// can make them very efficient.  Many objects are nonetheless named
-// to aid in debugging, but it is not essential that the names be
-// either accurate or unambiguous.  The public API exposes a number of
-// name-based maps for client convenience.
-//
-// The ssa/ssautil package provides various utilities that depend only
-// on the public API of this package.
-//
-// TODO(adonovan): Consider the exceptional control-flow implications
-// of defer and recover().
-//
-// TODO(adonovan): write a how-to document for all the various cases
-// of trying to determine corresponding elements across the four
-// domains of source locations, ast.Nodes, types.Objects,
-// ssa.Values/Instructions.
-//
-package ssa // import "llvm.org/llgo/third_party/gotools/go/ssa"
diff --git a/third_party/gotools/go/ssa/dom.go b/third_party/gotools/go/ssa/dom.go
deleted file mode 100644
index 12ef430..0000000
--- a/third_party/gotools/go/ssa/dom.go
+++ /dev/null
@@ -1,341 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines algorithms related to dominance.
-
-// Dominator tree construction ----------------------------------------
-//
-// We use the algorithm described in Lengauer & Tarjan. 1979.  A fast
-// algorithm for finding dominators in a flowgraph.
-// http://doi.acm.org/10.1145/357062.357071
-//
-// We also apply the optimizations to SLT described in Georgiadis et
-// al, Finding Dominators in Practice, JGAA 2006,
-// http://jgaa.info/accepted/2006/GeorgiadisTarjanWerneck2006.10.1.pdf
-// to avoid the need for buckets of size > 1.
-
-import (
-	"bytes"
-	"fmt"
-	"math/big"
-	"os"
-	"sort"
-)
-
-// Idom returns the block that immediately dominates b:
-// its parent in the dominator tree, if any.
-// Neither the entry node (b.Index==0) nor recover node
-// (b==b.Parent().Recover()) have a parent.
-//
-func (b *BasicBlock) Idom() *BasicBlock { return b.dom.idom }
-
-// Dominees returns the list of blocks that b immediately dominates:
-// its children in the dominator tree.
-//
-func (b *BasicBlock) Dominees() []*BasicBlock { return b.dom.children }
-
-// Dominates reports whether b dominates c.
-func (b *BasicBlock) Dominates(c *BasicBlock) bool {
-	return b.dom.pre <= c.dom.pre && c.dom.post <= b.dom.post
-}
-
-type byDomPreorder []*BasicBlock
-
-func (a byDomPreorder) Len() int           { return len(a) }
-func (a byDomPreorder) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-func (a byDomPreorder) Less(i, j int) bool { return a[i].dom.pre < a[j].dom.pre }
-
-// DomPreorder returns a new slice containing the blocks of f in
-// dominator tree preorder.
-//
-func (f *Function) DomPreorder() []*BasicBlock {
-	n := len(f.Blocks)
-	order := make(byDomPreorder, n, n)
-	copy(order, f.Blocks)
-	sort.Sort(order)
-	return order
-}
-
-// domInfo contains a BasicBlock's dominance information.
-type domInfo struct {
-	idom      *BasicBlock   // immediate dominator (parent in domtree)
-	children  []*BasicBlock // nodes immediately dominated by this one
-	pre, post int32         // pre- and post-order numbering within domtree
-}
-
-// ltState holds the working state for Lengauer-Tarjan algorithm
-// (during which domInfo.pre is repurposed for CFG DFS preorder number).
-type ltState struct {
-	// Each slice is indexed by b.Index.
-	sdom     []*BasicBlock // b's semidominator
-	parent   []*BasicBlock // b's parent in DFS traversal of CFG
-	ancestor []*BasicBlock // b's ancestor with least sdom
-}
-
-// dfs implements the depth-first search part of the LT algorithm.
-func (lt *ltState) dfs(v *BasicBlock, i int32, preorder []*BasicBlock) int32 {
-	preorder[i] = v
-	v.dom.pre = i // For now: DFS preorder of spanning tree of CFG
-	i++
-	lt.sdom[v.Index] = v
-	lt.link(nil, v)
-	for _, w := range v.Succs {
-		if lt.sdom[w.Index] == nil {
-			lt.parent[w.Index] = v
-			i = lt.dfs(w, i, preorder)
-		}
-	}
-	return i
-}
-
-// eval implements the EVAL part of the LT algorithm.
-func (lt *ltState) eval(v *BasicBlock) *BasicBlock {
-	// TODO(adonovan): opt: do path compression per simple LT.
-	u := v
-	for ; lt.ancestor[v.Index] != nil; v = lt.ancestor[v.Index] {
-		if lt.sdom[v.Index].dom.pre < lt.sdom[u.Index].dom.pre {
-			u = v
-		}
-	}
-	return u
-}
-
-// link implements the LINK part of the LT algorithm.
-func (lt *ltState) link(v, w *BasicBlock) {
-	lt.ancestor[w.Index] = v
-}
-
-// buildDomTree computes the dominator tree of f using the LT algorithm.
-// Precondition: all blocks are reachable (e.g. optimizeBlocks has been run).
-//
-func buildDomTree(f *Function) {
-	// The step numbers refer to the original LT paper; the
-	// reordering is due to Georgiadis.
-
-	// Clear any previous domInfo.
-	for _, b := range f.Blocks {
-		b.dom = domInfo{}
-	}
-
-	n := len(f.Blocks)
-	// Allocate space for 5 contiguous [n]*BasicBlock arrays:
-	// sdom, parent, ancestor, preorder, buckets.
-	space := make([]*BasicBlock, 5*n, 5*n)
-	lt := ltState{
-		sdom:     space[0:n],
-		parent:   space[n : 2*n],
-		ancestor: space[2*n : 3*n],
-	}
-
-	// Step 1.  Number vertices by depth-first preorder.
-	preorder := space[3*n : 4*n]
-	root := f.Blocks[0]
-	prenum := lt.dfs(root, 0, preorder)
-	recover := f.Recover
-	if recover != nil {
-		lt.dfs(recover, prenum, preorder)
-	}
-
-	buckets := space[4*n : 5*n]
-	copy(buckets, preorder)
-
-	// In reverse preorder...
-	for i := int32(n) - 1; i > 0; i-- {
-		w := preorder[i]
-
-		// Step 3. Implicitly define the immediate dominator of each node.
-		for v := buckets[i]; v != w; v = buckets[v.dom.pre] {
-			u := lt.eval(v)
-			if lt.sdom[u.Index].dom.pre < i {
-				v.dom.idom = u
-			} else {
-				v.dom.idom = w
-			}
-		}
-
-		// Step 2. Compute the semidominators of all nodes.
-		lt.sdom[w.Index] = lt.parent[w.Index]
-		for _, v := range w.Preds {
-			u := lt.eval(v)
-			if lt.sdom[u.Index].dom.pre < lt.sdom[w.Index].dom.pre {
-				lt.sdom[w.Index] = lt.sdom[u.Index]
-			}
-		}
-
-		lt.link(lt.parent[w.Index], w)
-
-		if lt.parent[w.Index] == lt.sdom[w.Index] {
-			w.dom.idom = lt.parent[w.Index]
-		} else {
-			buckets[i] = buckets[lt.sdom[w.Index].dom.pre]
-			buckets[lt.sdom[w.Index].dom.pre] = w
-		}
-	}
-
-	// The final 'Step 3' is now outside the loop.
-	for v := buckets[0]; v != root; v = buckets[v.dom.pre] {
-		v.dom.idom = root
-	}
-
-	// Step 4. Explicitly define the immediate dominator of each
-	// node, in preorder.
-	for _, w := range preorder[1:] {
-		if w == root || w == recover {
-			w.dom.idom = nil
-		} else {
-			if w.dom.idom != lt.sdom[w.Index] {
-				w.dom.idom = w.dom.idom.dom.idom
-			}
-			// Calculate Children relation as inverse of Idom.
-			w.dom.idom.dom.children = append(w.dom.idom.dom.children, w)
-		}
-	}
-
-	pre, post := numberDomTree(root, 0, 0)
-	if recover != nil {
-		numberDomTree(recover, pre, post)
-	}
-
-	// printDomTreeDot(os.Stderr, f)        // debugging
-	// printDomTreeText(os.Stderr, root, 0) // debugging
-
-	if f.Prog.mode&SanityCheckFunctions != 0 {
-		sanityCheckDomTree(f)
-	}
-}
-
-// numberDomTree sets the pre- and post-order numbers of a depth-first
-// traversal of the dominator tree rooted at v.  These are used to
-// answer dominance queries in constant time.
-//
-func numberDomTree(v *BasicBlock, pre, post int32) (int32, int32) {
-	v.dom.pre = pre
-	pre++
-	for _, child := range v.dom.children {
-		pre, post = numberDomTree(child, pre, post)
-	}
-	v.dom.post = post
-	post++
-	return pre, post
-}
-
-// Testing utilities ----------------------------------------
-
-// sanityCheckDomTree checks the correctness of the dominator tree
-// computed by the LT algorithm by comparing against the dominance
-// relation computed by a naive Kildall-style forward dataflow
-// analysis (Algorithm 10.16 from the "Dragon" book).
-//
-func sanityCheckDomTree(f *Function) {
-	n := len(f.Blocks)
-
-	// D[i] is the set of blocks that dominate f.Blocks[i],
-	// represented as a bit-set of block indices.
-	D := make([]big.Int, n)
-
-	one := big.NewInt(1)
-
-	// all is the set of all blocks; constant.
-	var all big.Int
-	all.Set(one).Lsh(&all, uint(n)).Sub(&all, one)
-
-	// Initialization.
-	for i, b := range f.Blocks {
-		if i == 0 || b == f.Recover {
-			// A root is dominated only by itself.
-			D[i].SetBit(&D[0], 0, 1)
-		} else {
-			// All other blocks are (initially) dominated
-			// by every block.
-			D[i].Set(&all)
-		}
-	}
-
-	// Iteration until fixed point.
-	for changed := true; changed; {
-		changed = false
-		for i, b := range f.Blocks {
-			if i == 0 || b == f.Recover {
-				continue
-			}
-			// Compute intersection across predecessors.
-			var x big.Int
-			x.Set(&all)
-			for _, pred := range b.Preds {
-				x.And(&x, &D[pred.Index])
-			}
-			x.SetBit(&x, i, 1) // a block always dominates itself.
-			if D[i].Cmp(&x) != 0 {
-				D[i].Set(&x)
-				changed = true
-			}
-		}
-	}
-
-	// Check the entire relation.  O(n^2).
-	// The Recover block (if any) must be treated specially so we skip it.
-	ok := true
-	for i := 0; i < n; i++ {
-		for j := 0; j < n; j++ {
-			b, c := f.Blocks[i], f.Blocks[j]
-			if c == f.Recover {
-				continue
-			}
-			actual := b.Dominates(c)
-			expected := D[j].Bit(i) == 1
-			if actual != expected {
-				fmt.Fprintf(os.Stderr, "dominates(%s, %s)==%t, want %t\n", b, c, actual, expected)
-				ok = false
-			}
-		}
-	}
-
-	preorder := f.DomPreorder()
-	for _, b := range f.Blocks {
-		if got := preorder[b.dom.pre]; got != b {
-			fmt.Fprintf(os.Stderr, "preorder[%d]==%s, want %s\n", b.dom.pre, got, b)
-			ok = false
-		}
-	}
-
-	if !ok {
-		panic("sanityCheckDomTree failed for " + f.String())
-	}
-
-}
-
-// Printing functions ----------------------------------------
-
-// printDomTree prints the dominator tree as text, using indentation.
-func printDomTreeText(buf *bytes.Buffer, v *BasicBlock, indent int) {
-	fmt.Fprintf(buf, "%*s%s\n", 4*indent, "", v)
-	for _, child := range v.dom.children {
-		printDomTreeText(buf, child, indent+1)
-	}
-}
-
-// printDomTreeDot prints the dominator tree of f in AT&T GraphViz
-// (.dot) format.
-func printDomTreeDot(buf *bytes.Buffer, f *Function) {
-	fmt.Fprintln(buf, "//", f)
-	fmt.Fprintln(buf, "digraph domtree {")
-	for i, b := range f.Blocks {
-		v := b.dom
-		fmt.Fprintf(buf, "\tn%d [label=\"%s (%d, %d)\",shape=\"rectangle\"];\n", v.pre, b, v.pre, v.post)
-		// TODO(adonovan): improve appearance of edges
-		// belonging to both dominator tree and CFG.
-
-		// Dominator tree edge.
-		if i != 0 {
-			fmt.Fprintf(buf, "\tn%d -> n%d [style=\"solid\",weight=100];\n", v.idom.dom.pre, v.pre)
-		}
-		// CFG edges.
-		for _, pred := range b.Preds {
-			fmt.Fprintf(buf, "\tn%d -> n%d [style=\"dotted\",weight=0];\n", pred.dom.pre, v.pre)
-		}
-	}
-	fmt.Fprintln(buf, "}")
-}
diff --git a/third_party/gotools/go/ssa/emit.go b/third_party/gotools/go/ssa/emit.go
deleted file mode 100644
index 6dfb298..0000000
--- a/third_party/gotools/go/ssa/emit.go
+++ /dev/null
@@ -1,469 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// Helpers for emitting SSA instructions.
-
-import (
-	"fmt"
-	"go/ast"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// emitNew emits to f a new (heap Alloc) instruction allocating an
-// object of type typ.  pos is the optional source location.
-//
-func emitNew(f *Function, typ types.Type, pos token.Pos) *Alloc {
-	v := &Alloc{Heap: true}
-	v.setType(types.NewPointer(typ))
-	v.setPos(pos)
-	f.emit(v)
-	return v
-}
-
-// emitLoad emits to f an instruction to load the address addr into a
-// new temporary, and returns the value so defined.
-//
-func emitLoad(f *Function, addr Value) *UnOp {
-	v := &UnOp{Op: token.MUL, X: addr}
-	v.setType(deref(addr.Type()))
-	f.emit(v)
-	return v
-}
-
-// emitDebugRef emits to f a DebugRef pseudo-instruction associating
-// expression e with value v.
-//
-func emitDebugRef(f *Function, e ast.Expr, v Value, isAddr bool) {
-	if !f.debugInfo() {
-		return // debugging not enabled
-	}
-	if v == nil || e == nil {
-		panic("nil")
-	}
-	var obj types.Object
-	e = unparen(e)
-	if id, ok := e.(*ast.Ident); ok {
-		if isBlankIdent(id) {
-			return
-		}
-		obj = f.Pkg.objectOf(id)
-		switch obj.(type) {
-		case *types.Nil, *types.Const, *types.Builtin:
-			return
-		}
-	}
-	f.emit(&DebugRef{
-		X:      v,
-		Expr:   e,
-		IsAddr: isAddr,
-		object: obj,
-	})
-}
-
-// emitArith emits to f code to compute the binary operation op(x, y)
-// where op is an eager shift, logical or arithmetic operation.
-// (Use emitCompare() for comparisons and Builder.logicalBinop() for
-// non-eager operations.)
-//
-func emitArith(f *Function, op token.Token, x, y Value, t types.Type, pos token.Pos) Value {
-	switch op {
-	case token.SHL, token.SHR:
-		x = emitConv(f, x, t)
-		// y may be signed or an 'untyped' constant.
-		// TODO(adonovan): whence signed values?
-		if b, ok := y.Type().Underlying().(*types.Basic); ok && b.Info()&types.IsUnsigned == 0 {
-			y = emitConv(f, y, types.Typ[types.Uint64])
-		}
-
-	case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
-		x = emitConv(f, x, t)
-		y = emitConv(f, y, t)
-
-	default:
-		panic("illegal op in emitArith: " + op.String())
-
-	}
-	v := &BinOp{
-		Op: op,
-		X:  x,
-		Y:  y,
-	}
-	v.setPos(pos)
-	v.setType(t)
-	return f.emit(v)
-}
-
-// emitCompare emits to f code compute the boolean result of
-// comparison comparison 'x op y'.
-//
-func emitCompare(f *Function, op token.Token, x, y Value, pos token.Pos) Value {
-	xt := x.Type().Underlying()
-	yt := y.Type().Underlying()
-
-	// Special case to optimise a tagless SwitchStmt so that
-	// these are equivalent
-	//   switch { case e: ...}
-	//   switch true { case e: ... }
-	//   if e==true { ... }
-	// even in the case when e's type is an interface.
-	// TODO(adonovan): opt: generalise to x==true, false!=y, etc.
-	if x == vTrue && op == token.EQL {
-		if yt, ok := yt.(*types.Basic); ok && yt.Info()&types.IsBoolean != 0 {
-			return y
-		}
-	}
-
-	if types.Identical(xt, yt) {
-		// no conversion necessary
-	} else if _, ok := xt.(*types.Interface); ok {
-		y = emitConv(f, y, x.Type())
-	} else if _, ok := yt.(*types.Interface); ok {
-		x = emitConv(f, x, y.Type())
-	} else if _, ok := x.(*Const); ok {
-		x = emitConv(f, x, y.Type())
-	} else if _, ok := y.(*Const); ok {
-		y = emitConv(f, y, x.Type())
-	} else {
-		// other cases, e.g. channels.  No-op.
-	}
-
-	v := &BinOp{
-		Op: op,
-		X:  x,
-		Y:  y,
-	}
-	v.setPos(pos)
-	v.setType(tBool)
-	return f.emit(v)
-}
-
-// isValuePreserving returns true if a conversion from ut_src to
-// ut_dst is value-preserving, i.e. just a change of type.
-// Precondition: neither argument is a named type.
-//
-func isValuePreserving(ut_src, ut_dst types.Type) bool {
-	// Identical underlying types?
-	if types.Identical(ut_dst, ut_src) {
-		return true
-	}
-
-	switch ut_dst.(type) {
-	case *types.Chan:
-		// Conversion between channel types?
-		_, ok := ut_src.(*types.Chan)
-		return ok
-
-	case *types.Pointer:
-		// Conversion between pointers with identical base types?
-		_, ok := ut_src.(*types.Pointer)
-		return ok
-	}
-	return false
-}
-
-// emitConv emits to f code to convert Value val to exactly type typ,
-// and returns the converted value.  Implicit conversions are required
-// by language assignability rules in assignments, parameter passing,
-// etc.  Conversions cannot fail dynamically.
-//
-func emitConv(f *Function, val Value, typ types.Type) Value {
-	t_src := val.Type()
-
-	// Identical types?  Conversion is a no-op.
-	if types.Identical(t_src, typ) {
-		return val
-	}
-
-	ut_dst := typ.Underlying()
-	ut_src := t_src.Underlying()
-
-	// Just a change of type, but not value or representation?
-	if isValuePreserving(ut_src, ut_dst) {
-		c := &ChangeType{X: val}
-		c.setType(typ)
-		return f.emit(c)
-	}
-
-	// Conversion to, or construction of a value of, an interface type?
-	if _, ok := ut_dst.(*types.Interface); ok {
-		// Assignment from one interface type to another?
-		if _, ok := ut_src.(*types.Interface); ok {
-			c := &ChangeInterface{X: val}
-			c.setType(typ)
-			return f.emit(c)
-		}
-
-		// Untyped nil constant?  Return interface-typed nil constant.
-		if ut_src == tUntypedNil {
-			return nilConst(typ)
-		}
-
-		// Convert (non-nil) "untyped" literals to their default type.
-		if t, ok := ut_src.(*types.Basic); ok && t.Info()&types.IsUntyped != 0 {
-			val = emitConv(f, val, DefaultType(ut_src))
-		}
-
-		f.Pkg.Prog.needMethodsOf(val.Type())
-		mi := &MakeInterface{X: val}
-		mi.setType(typ)
-		return f.emit(mi)
-	}
-
-	// Conversion of a compile-time constant value?
-	if c, ok := val.(*Const); ok {
-		if _, ok := ut_dst.(*types.Basic); ok || c.IsNil() {
-			// Conversion of a compile-time constant to
-			// another constant type results in a new
-			// constant of the destination type and
-			// (initially) the same abstract value.
-			// We don't truncate the value yet.
-			return NewConst(c.Value, typ)
-		}
-
-		// We're converting from constant to non-constant type,
-		// e.g. string -> []byte/[]rune.
-	}
-
-	// A representation-changing conversion?
-	// At least one of {ut_src,ut_dst} must be *Basic.
-	// (The other may be []byte or []rune.)
-	_, ok1 := ut_src.(*types.Basic)
-	_, ok2 := ut_dst.(*types.Basic)
-	if ok1 || ok2 {
-		c := &Convert{X: val}
-		c.setType(typ)
-		return f.emit(c)
-	}
-
-	panic(fmt.Sprintf("in %s: cannot convert %s (%s) to %s", f, val, val.Type(), typ))
-}
-
-// emitStore emits to f an instruction to store value val at location
-// addr, applying implicit conversions as required by assignability rules.
-//
-func emitStore(f *Function, addr, val Value, pos token.Pos) *Store {
-	s := &Store{
-		Addr: addr,
-		Val:  emitConv(f, val, deref(addr.Type())),
-		pos:  pos,
-	}
-	f.emit(s)
-	return s
-}
-
-// emitJump emits to f a jump to target, and updates the control-flow graph.
-// Postcondition: f.currentBlock is nil.
-//
-func emitJump(f *Function, target *BasicBlock) {
-	b := f.currentBlock
-	b.emit(new(Jump))
-	addEdge(b, target)
-	f.currentBlock = nil
-}
-
-// emitIf emits to f a conditional jump to tblock or fblock based on
-// cond, and updates the control-flow graph.
-// Postcondition: f.currentBlock is nil.
-//
-func emitIf(f *Function, cond Value, tblock, fblock *BasicBlock) {
-	b := f.currentBlock
-	b.emit(&If{Cond: cond})
-	addEdge(b, tblock)
-	addEdge(b, fblock)
-	f.currentBlock = nil
-}
-
-// emitExtract emits to f an instruction to extract the index'th
-// component of tuple.  It returns the extracted value.
-//
-func emitExtract(f *Function, tuple Value, index int) Value {
-	e := &Extract{Tuple: tuple, Index: index}
-	e.setType(tuple.Type().(*types.Tuple).At(index).Type())
-	return f.emit(e)
-}
-
-// emitTypeAssert emits to f a type assertion value := x.(t) and
-// returns the value.  x.Type() must be an interface.
-//
-func emitTypeAssert(f *Function, x Value, t types.Type, pos token.Pos) Value {
-	a := &TypeAssert{X: x, AssertedType: t}
-	a.setPos(pos)
-	a.setType(t)
-	return f.emit(a)
-}
-
-// emitTypeTest emits to f a type test value,ok := x.(t) and returns
-// a (value, ok) tuple.  x.Type() must be an interface.
-//
-func emitTypeTest(f *Function, x Value, t types.Type, pos token.Pos) Value {
-	a := &TypeAssert{
-		X:            x,
-		AssertedType: t,
-		CommaOk:      true,
-	}
-	a.setPos(pos)
-	a.setType(types.NewTuple(
-		newVar("value", t),
-		varOk,
-	))
-	return f.emit(a)
-}
-
-// emitTailCall emits to f a function call in tail position.  The
-// caller is responsible for all fields of 'call' except its type.
-// Intended for wrapper methods.
-// Precondition: f does/will not use deferred procedure calls.
-// Postcondition: f.currentBlock is nil.
-//
-func emitTailCall(f *Function, call *Call) {
-	tresults := f.Signature.Results()
-	nr := tresults.Len()
-	if nr == 1 {
-		call.typ = tresults.At(0).Type()
-	} else {
-		call.typ = tresults
-	}
-	tuple := f.emit(call)
-	var ret Return
-	switch nr {
-	case 0:
-		// no-op
-	case 1:
-		ret.Results = []Value{tuple}
-	default:
-		for i := 0; i < nr; i++ {
-			v := emitExtract(f, tuple, i)
-			// TODO(adonovan): in principle, this is required:
-			//   v = emitConv(f, o.Type, f.Signature.Results[i].Type)
-			// but in practice emitTailCall is only used when
-			// the types exactly match.
-			ret.Results = append(ret.Results, v)
-		}
-	}
-	f.emit(&ret)
-	f.currentBlock = nil
-}
-
-// emitImplicitSelections emits to f code to apply the sequence of
-// implicit field selections specified by indices to base value v, and
-// returns the selected value.
-//
-// If v is the address of a struct, the result will be the address of
-// a field; if it is the value of a struct, the result will be the
-// value of a field.
-//
-func emitImplicitSelections(f *Function, v Value, indices []int) Value {
-	for _, index := range indices {
-		fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
-
-		if isPointer(v.Type()) {
-			instr := &FieldAddr{
-				X:     v,
-				Field: index,
-			}
-			instr.setType(types.NewPointer(fld.Type()))
-			v = f.emit(instr)
-			// Load the field's value iff indirectly embedded.
-			if isPointer(fld.Type()) {
-				v = emitLoad(f, v)
-			}
-		} else {
-			instr := &Field{
-				X:     v,
-				Field: index,
-			}
-			instr.setType(fld.Type())
-			v = f.emit(instr)
-		}
-	}
-	return v
-}
-
-// emitFieldSelection emits to f code to select the index'th field of v.
-//
-// If wantAddr, the input must be a pointer-to-struct and the result
-// will be the field's address; otherwise the result will be the
-// field's value.
-// Ident id is used for position and debug info.
-//
-func emitFieldSelection(f *Function, v Value, index int, wantAddr bool, id *ast.Ident) Value {
-	fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
-	if isPointer(v.Type()) {
-		instr := &FieldAddr{
-			X:     v,
-			Field: index,
-		}
-		instr.setPos(id.Pos())
-		instr.setType(types.NewPointer(fld.Type()))
-		v = f.emit(instr)
-		// Load the field's value iff we don't want its address.
-		if !wantAddr {
-			v = emitLoad(f, v)
-		}
-	} else {
-		instr := &Field{
-			X:     v,
-			Field: index,
-		}
-		instr.setPos(id.Pos())
-		instr.setType(fld.Type())
-		v = f.emit(instr)
-	}
-	emitDebugRef(f, id, v, wantAddr)
-	return v
-}
-
-// zeroValue emits to f code to produce a zero value of type t,
-// and returns it.
-//
-func zeroValue(f *Function, t types.Type) Value {
-	switch t.Underlying().(type) {
-	case *types.Struct, *types.Array:
-		return emitLoad(f, f.addLocal(t, token.NoPos))
-	default:
-		return zeroConst(t)
-	}
-}
-
-// createRecoverBlock emits to f a block of code to return after a
-// recovered panic, and sets f.Recover to it.
-//
-// If f's result parameters are named, the code loads and returns
-// their current values, otherwise it returns the zero values of their
-// type.
-//
-// Idempotent.
-//
-func createRecoverBlock(f *Function) {
-	if f.Recover != nil {
-		return // already created
-	}
-	saved := f.currentBlock
-
-	f.Recover = f.newBasicBlock("recover")
-	f.currentBlock = f.Recover
-
-	var results []Value
-	if f.namedResults != nil {
-		// Reload NRPs to form value tuple.
-		for _, r := range f.namedResults {
-			results = append(results, emitLoad(f, r))
-		}
-	} else {
-		R := f.Signature.Results()
-		for i, n := 0, R.Len(); i < n; i++ {
-			T := R.At(i).Type()
-
-			// Return zero value of each result type.
-			results = append(results, zeroValue(f, T))
-		}
-	}
-	f.emit(&Return{Results: results})
-
-	f.currentBlock = saved
-}
diff --git a/third_party/gotools/go/ssa/example_test.go b/third_party/gotools/go/ssa/example_test.go
deleted file mode 100644
index cccec7a..0000000
--- a/third_party/gotools/go/ssa/example_test.go
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa_test
-
-import (
-	"fmt"
-	"os"
-
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-)
-
-// This program demonstrates how to run the SSA builder on a "Hello,
-// World!" program and shows the printed representation of packages,
-// functions and instructions.
-//
-// Within the function listing, the name of each BasicBlock such as
-// ".0.entry" is printed left-aligned, followed by the block's
-// Instructions.
-//
-// For each instruction that defines an SSA virtual register
-// (i.e. implements Value), the type of that value is shown in the
-// right column.
-//
-// Build and run the ssadump.go program if you want a standalone tool
-// with similar functionality. It is located at
-// golang.org/x/tools/cmd/ssadump.
-//
-func Example() {
-	const hello = `
-package main
-
-import "fmt"
-
-const message = "Hello, World!"
-
-func main() {
-	fmt.Println(message)
-}
-`
-	var conf loader.Config
-
-	// Parse the input file.
-	file, err := conf.ParseFile("hello.go", hello)
-	if err != nil {
-		fmt.Print(err) // parse error
-		return
-	}
-
-	// Create single-file main package.
-	conf.CreateFromFiles("main", file)
-
-	// Load the main package and its dependencies.
-	iprog, err := conf.Load()
-	if err != nil {
-		fmt.Print(err) // type error in some package
-		return
-	}
-
-	// Create SSA-form program representation.
-	prog := ssa.Create(iprog, ssa.SanityCheckFunctions)
-	mainPkg := prog.Package(iprog.Created[0].Pkg)
-
-	// Print out the package.
-	mainPkg.WriteTo(os.Stdout)
-
-	// Build SSA code for bodies of functions in mainPkg.
-	mainPkg.Build()
-
-	// Print out the package-level functions.
-	mainPkg.Func("init").WriteTo(os.Stdout)
-	mainPkg.Func("main").WriteTo(os.Stdout)
-
-	// Output:
-	//
-	// package main:
-	//   func  init       func()
-	//   var   init$guard bool
-	//   func  main       func()
-	//   const message    message = "Hello, World!":untyped string
-	//
-	// # Name: main.init
-	// # Package: main
-	// # Synthetic: package initializer
-	// func init():
-	// 0:                                                                entry P:0 S:2
-	// 	t0 = *init$guard                                                   bool
-	// 	if t0 goto 2 else 1
-	// 1:                                                           init.start P:1 S:1
-	// 	*init$guard = true:bool
-	// 	t1 = fmt.init()                                                      ()
-	// 	jump 2
-	// 2:                                                            init.done P:2 S:0
-	// 	return
-	//
-	// # Name: main.main
-	// # Package: main
-	// # Location: hello.go:8:6
-	// func main():
-	// 0:                                                                entry P:0 S:0
-	// 	t0 = new [1]interface{} (varargs)                       *[1]interface{}
-	// 	t1 = &t0[0:int]                                            *interface{}
-	// 	t2 = make interface{} <- string ("Hello, World!":string)    interface{}
-	// 	*t1 = t2
-	// 	t3 = slice t0[:]                                          []interface{}
-	// 	t4 = fmt.Println(t3...)                              (n int, err error)
-	// 	return
-}
diff --git a/third_party/gotools/go/ssa/func.go b/third_party/gotools/go/ssa/func.go
deleted file mode 100644
index 1b5c854..0000000
--- a/third_party/gotools/go/ssa/func.go
+++ /dev/null
@@ -1,690 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the Function and BasicBlock types.
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/token"
-	"io"
-	"os"
-	"strings"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// addEdge adds a control-flow graph edge from from to to.
-func addEdge(from, to *BasicBlock) {
-	from.Succs = append(from.Succs, to)
-	to.Preds = append(to.Preds, from)
-}
-
-// Parent returns the function that contains block b.
-func (b *BasicBlock) Parent() *Function { return b.parent }
-
-// String returns a human-readable label of this block.
-// It is not guaranteed unique within the function.
-//
-func (b *BasicBlock) String() string {
-	return fmt.Sprintf("%d", b.Index)
-}
-
-// emit appends an instruction to the current basic block.
-// If the instruction defines a Value, it is returned.
-//
-func (b *BasicBlock) emit(i Instruction) Value {
-	i.setBlock(b)
-	b.Instrs = append(b.Instrs, i)
-	v, _ := i.(Value)
-	return v
-}
-
-// predIndex returns the i such that b.Preds[i] == c or panics if
-// there is none.
-func (b *BasicBlock) predIndex(c *BasicBlock) int {
-	for i, pred := range b.Preds {
-		if pred == c {
-			return i
-		}
-	}
-	panic(fmt.Sprintf("no edge %s -> %s", c, b))
-}
-
-// hasPhi returns true if b.Instrs contains φ-nodes.
-func (b *BasicBlock) hasPhi() bool {
-	_, ok := b.Instrs[0].(*Phi)
-	return ok
-}
-
-// phis returns the prefix of b.Instrs containing all the block's φ-nodes.
-func (b *BasicBlock) phis() []Instruction {
-	for i, instr := range b.Instrs {
-		if _, ok := instr.(*Phi); !ok {
-			return b.Instrs[:i]
-		}
-	}
-	return nil // unreachable in well-formed blocks
-}
-
-// replacePred replaces all occurrences of p in b's predecessor list with q.
-// Ordinarily there should be at most one.
-//
-func (b *BasicBlock) replacePred(p, q *BasicBlock) {
-	for i, pred := range b.Preds {
-		if pred == p {
-			b.Preds[i] = q
-		}
-	}
-}
-
-// replaceSucc replaces all occurrences of p in b's successor list with q.
-// Ordinarily there should be at most one.
-//
-func (b *BasicBlock) replaceSucc(p, q *BasicBlock) {
-	for i, succ := range b.Succs {
-		if succ == p {
-			b.Succs[i] = q
-		}
-	}
-}
-
-// removePred removes all occurrences of p in b's
-// predecessor list and φ-nodes.
-// Ordinarily there should be at most one.
-//
-func (b *BasicBlock) removePred(p *BasicBlock) {
-	phis := b.phis()
-
-	// We must preserve edge order for φ-nodes.
-	j := 0
-	for i, pred := range b.Preds {
-		if pred != p {
-			b.Preds[j] = b.Preds[i]
-			// Strike out φ-edge too.
-			for _, instr := range phis {
-				phi := instr.(*Phi)
-				phi.Edges[j] = phi.Edges[i]
-			}
-			j++
-		}
-	}
-	// Nil out b.Preds[j:] and φ-edges[j:] to aid GC.
-	for i := j; i < len(b.Preds); i++ {
-		b.Preds[i] = nil
-		for _, instr := range phis {
-			instr.(*Phi).Edges[i] = nil
-		}
-	}
-	b.Preds = b.Preds[:j]
-	for _, instr := range phis {
-		phi := instr.(*Phi)
-		phi.Edges = phi.Edges[:j]
-	}
-}
-
-// Destinations associated with unlabelled for/switch/select stmts.
-// We push/pop one of these as we enter/leave each construct and for
-// each BranchStmt we scan for the innermost target of the right type.
-//
-type targets struct {
-	tail         *targets // rest of stack
-	_break       *BasicBlock
-	_continue    *BasicBlock
-	_fallthrough *BasicBlock
-}
-
-// Destinations associated with a labelled block.
-// We populate these as labels are encountered in forward gotos or
-// labelled statements.
-//
-type lblock struct {
-	_goto     *BasicBlock
-	_break    *BasicBlock
-	_continue *BasicBlock
-}
-
-// labelledBlock returns the branch target associated with the
-// specified label, creating it if needed.
-//
-func (f *Function) labelledBlock(label *ast.Ident) *lblock {
-	lb := f.lblocks[label.Obj]
-	if lb == nil {
-		lb = &lblock{_goto: f.newBasicBlock(label.Name)}
-		if f.lblocks == nil {
-			f.lblocks = make(map[*ast.Object]*lblock)
-		}
-		f.lblocks[label.Obj] = lb
-	}
-	return lb
-}
-
-// addParam adds a (non-escaping) parameter to f.Params of the
-// specified name, type and source position.
-//
-func (f *Function) addParam(name string, typ types.Type, pos token.Pos) *Parameter {
-	v := &Parameter{
-		name:   name,
-		typ:    typ,
-		pos:    pos,
-		parent: f,
-	}
-	f.Params = append(f.Params, v)
-	return v
-}
-
-func (f *Function) addParamObj(obj types.Object) *Parameter {
-	name := obj.Name()
-	if name == "" {
-		name = fmt.Sprintf("arg%d", len(f.Params))
-	}
-	param := f.addParam(name, obj.Type(), obj.Pos())
-	param.object = obj
-	return param
-}
-
-// addSpilledParam declares a parameter that is pre-spilled to the
-// stack; the function body will load/store the spilled location.
-// Subsequent lifting will eliminate spills where possible.
-//
-func (f *Function) addSpilledParam(obj types.Object) {
-	param := f.addParamObj(obj)
-	spill := &Alloc{Comment: obj.Name()}
-	spill.setType(types.NewPointer(obj.Type()))
-	spill.setPos(obj.Pos())
-	f.objects[obj] = spill
-	f.Locals = append(f.Locals, spill)
-	f.emit(spill)
-	f.emit(&Store{Addr: spill, Val: param})
-}
-
-// startBody initializes the function prior to generating SSA code for its body.
-// Precondition: f.Type() already set.
-//
-func (f *Function) startBody() {
-	f.currentBlock = f.newBasicBlock("entry")
-	f.objects = make(map[types.Object]Value) // needed for some synthetics, e.g. init
-}
-
-// createSyntacticParams populates f.Params and generates code (spills
-// and named result locals) for all the parameters declared in the
-// syntax.  In addition it populates the f.objects mapping.
-//
-// Preconditions:
-// f.startBody() was called.
-// Postcondition:
-// len(f.Params) == len(f.Signature.Params) + (f.Signature.Recv() ? 1 : 0)
-//
-func (f *Function) createSyntacticParams(recv *ast.FieldList, functype *ast.FuncType) {
-	// Receiver (at most one inner iteration).
-	if recv != nil {
-		for _, field := range recv.List {
-			for _, n := range field.Names {
-				f.addSpilledParam(f.Pkg.info.Defs[n])
-			}
-			// Anonymous receiver?  No need to spill.
-			if field.Names == nil {
-				f.addParamObj(f.Signature.Recv())
-			}
-		}
-	}
-
-	// Parameters.
-	if functype.Params != nil {
-		n := len(f.Params) // 1 if has recv, 0 otherwise
-		for _, field := range functype.Params.List {
-			for _, n := range field.Names {
-				f.addSpilledParam(f.Pkg.info.Defs[n])
-			}
-			// Anonymous parameter?  No need to spill.
-			if field.Names == nil {
-				f.addParamObj(f.Signature.Params().At(len(f.Params) - n))
-			}
-		}
-	}
-
-	// Named results.
-	if functype.Results != nil {
-		for _, field := range functype.Results.List {
-			// Implicit "var" decl of locals for named results.
-			for _, n := range field.Names {
-				f.namedResults = append(f.namedResults, f.addLocalForIdent(n))
-			}
-		}
-	}
-}
-
-// numberRegisters assigns numbers to all SSA registers
-// (value-defining Instructions) in f, to aid debugging.
-// (Non-Instruction Values are named at construction.)
-//
-func numberRegisters(f *Function) {
-	v := 0
-	for _, b := range f.Blocks {
-		for _, instr := range b.Instrs {
-			switch instr.(type) {
-			case Value:
-				instr.(interface {
-					setNum(int)
-				}).setNum(v)
-				v++
-			}
-		}
-	}
-}
-
-// buildReferrers populates the def/use information in all non-nil
-// Value.Referrers slice.
-// Precondition: all such slices are initially empty.
-func buildReferrers(f *Function) {
-	var rands []*Value
-	for _, b := range f.Blocks {
-		for _, instr := range b.Instrs {
-			rands = instr.Operands(rands[:0]) // recycle storage
-			for _, rand := range rands {
-				if r := *rand; r != nil {
-					if ref := r.Referrers(); ref != nil {
-						*ref = append(*ref, instr)
-					}
-				}
-			}
-		}
-	}
-}
-
-// finishBody() finalizes the function after SSA code generation of its body.
-func (f *Function) finishBody() {
-	f.objects = nil
-	f.currentBlock = nil
-	f.lblocks = nil
-
-	// Don't pin the AST in memory (except in debug mode).
-	if n := f.syntax; n != nil && !f.debugInfo() {
-		f.syntax = extentNode{n.Pos(), n.End()}
-	}
-
-	// Remove from f.Locals any Allocs that escape to the heap.
-	j := 0
-	for _, l := range f.Locals {
-		if !l.Heap {
-			f.Locals[j] = l
-			j++
-		}
-	}
-	// Nil out f.Locals[j:] to aid GC.
-	for i := j; i < len(f.Locals); i++ {
-		f.Locals[i] = nil
-	}
-	f.Locals = f.Locals[:j]
-
-	optimizeBlocks(f)
-
-	buildReferrers(f)
-
-	buildDomTree(f)
-
-	if f.Prog.mode&NaiveForm == 0 {
-		// For debugging pre-state of lifting pass:
-		// numberRegisters(f)
-		// f.WriteTo(os.Stderr)
-		lift(f)
-	}
-
-	f.namedResults = nil // (used by lifting)
-
-	numberRegisters(f)
-
-	if f.Prog.mode&PrintFunctions != 0 {
-		printMu.Lock()
-		f.WriteTo(os.Stdout)
-		printMu.Unlock()
-	}
-
-	if f.Prog.mode&SanityCheckFunctions != 0 {
-		mustSanityCheck(f, nil)
-	}
-}
-
-// removeNilBlocks eliminates nils from f.Blocks and updates each
-// BasicBlock.Index.  Use this after any pass that may delete blocks.
-//
-func (f *Function) removeNilBlocks() {
-	j := 0
-	for _, b := range f.Blocks {
-		if b != nil {
-			b.Index = j
-			f.Blocks[j] = b
-			j++
-		}
-	}
-	// Nil out f.Blocks[j:] to aid GC.
-	for i := j; i < len(f.Blocks); i++ {
-		f.Blocks[i] = nil
-	}
-	f.Blocks = f.Blocks[:j]
-}
-
-// SetDebugMode sets the debug mode for package pkg.  If true, all its
-// functions will include full debug info.  This greatly increases the
-// size of the instruction stream, and causes Functions to depend upon
-// the ASTs, potentially keeping them live in memory for longer.
-//
-func (pkg *Package) SetDebugMode(debug bool) {
-	// TODO(adonovan): do we want ast.File granularity?
-	pkg.debug = debug
-}
-
-// debugInfo reports whether debug info is wanted for this function.
-func (f *Function) debugInfo() bool {
-	return f.Pkg != nil && f.Pkg.debug
-}
-
-// addNamedLocal creates a local variable, adds it to function f and
-// returns it.  Its name and type are taken from obj.  Subsequent
-// calls to f.lookup(obj) will return the same local.
-//
-func (f *Function) addNamedLocal(obj types.Object) *Alloc {
-	l := f.addLocal(obj.Type(), obj.Pos())
-	l.Comment = obj.Name()
-	f.objects[obj] = l
-	return l
-}
-
-func (f *Function) addLocalForIdent(id *ast.Ident) *Alloc {
-	return f.addNamedLocal(f.Pkg.info.Defs[id])
-}
-
-// addLocal creates an anonymous local variable of type typ, adds it
-// to function f and returns it.  pos is the optional source location.
-//
-func (f *Function) addLocal(typ types.Type, pos token.Pos) *Alloc {
-	v := &Alloc{}
-	v.setType(types.NewPointer(typ))
-	v.setPos(pos)
-	f.Locals = append(f.Locals, v)
-	f.emit(v)
-	return v
-}
-
-// lookup returns the address of the named variable identified by obj
-// that is local to function f or one of its enclosing functions.
-// If escaping, the reference comes from a potentially escaping pointer
-// expression and the referent must be heap-allocated.
-//
-func (f *Function) lookup(obj types.Object, escaping bool) Value {
-	if v, ok := f.objects[obj]; ok {
-		if alloc, ok := v.(*Alloc); ok && escaping {
-			alloc.Heap = true
-		}
-		return v // function-local var (address)
-	}
-
-	// Definition must be in an enclosing function;
-	// plumb it through intervening closures.
-	if f.parent == nil {
-		panic("no ssa.Value for " + obj.String())
-	}
-	outer := f.parent.lookup(obj, true) // escaping
-	v := &FreeVar{
-		name:   obj.Name(),
-		typ:    outer.Type(),
-		pos:    outer.Pos(),
-		outer:  outer,
-		parent: f,
-	}
-	f.objects[obj] = v
-	f.FreeVars = append(f.FreeVars, v)
-	return v
-}
-
-// emit emits the specified instruction to function f.
-func (f *Function) emit(instr Instruction) Value {
-	return f.currentBlock.emit(instr)
-}
-
-// RelString returns the full name of this function, qualified by
-// package name, receiver type, etc.
-//
-// The specific formatting rules are not guaranteed and may change.
-//
-// Examples:
-//      "math.IsNaN"                  // a package-level function
-//      "(*bytes.Buffer).Bytes"       // a declared method or a wrapper
-//      "(*bytes.Buffer).Bytes$thunk" // thunk (func wrapping method; receiver is param 0)
-//      "(*bytes.Buffer).Bytes$bound" // bound (func wrapping method; receiver supplied by closure)
-//      "main.main$1"                 // an anonymous function in main
-//      "main.init#1"                 // a declared init function
-//      "main.init"                   // the synthesized package initializer
-//
-// When these functions are referred to from within the same package
-// (i.e. from == f.Pkg.Object), they are rendered without the package path.
-// For example: "IsNaN", "(*Buffer).Bytes", etc.
-//
-// All non-synthetic functions have distinct package-qualified names.
-// (But two methods may have the same name "(T).f" if one is a synthetic
-// wrapper promoting a non-exported method "f" from another package; in
-// that case, the strings are equal but the identifiers "f" are distinct.)
-//
-func (f *Function) RelString(from *types.Package) string {
-	// Anonymous?
-	if f.parent != nil {
-		// An anonymous function's Name() looks like "parentName$1",
-		// but its String() should include the type/package/etc.
-		parent := f.parent.RelString(from)
-		for i, anon := range f.parent.AnonFuncs {
-			if anon == f {
-				return fmt.Sprintf("%s$%d", parent, 1+i)
-			}
-		}
-
-		return f.name // should never happen
-	}
-
-	// Method (declared or wrapper)?
-	if recv := f.Signature.Recv(); recv != nil {
-		return f.relMethod(from, recv.Type())
-	}
-
-	// Thunk?
-	if f.method != nil {
-		return f.relMethod(from, f.method.Recv())
-	}
-
-	// Bound?
-	if len(f.FreeVars) == 1 && strings.HasSuffix(f.name, "$bound") {
-		return f.relMethod(from, f.FreeVars[0].Type())
-	}
-
-	// Package-level function?
-	// Prefix with package name for cross-package references only.
-	if p := f.pkgobj(); p != nil && p != from {
-		return fmt.Sprintf("%s.%s", p.Path(), f.name)
-	}
-
-	// Unknown.
-	return f.name
-}
-
-func (f *Function) relMethod(from *types.Package, recv types.Type) string {
-	return fmt.Sprintf("(%s).%s", relType(recv, from), f.name)
-}
-
-// writeSignature writes to buf the signature sig in declaration syntax.
-func writeSignature(buf *bytes.Buffer, from *types.Package, name string, sig *types.Signature, params []*Parameter) {
-	buf.WriteString("func ")
-	if recv := sig.Recv(); recv != nil {
-		buf.WriteString("(")
-		if n := params[0].Name(); n != "" {
-			buf.WriteString(n)
-			buf.WriteString(" ")
-		}
-		types.WriteType(buf, from, params[0].Type())
-		buf.WriteString(") ")
-	}
-	buf.WriteString(name)
-	types.WriteSignature(buf, from, sig)
-}
-
-func (f *Function) pkgobj() *types.Package {
-	if f.Pkg != nil {
-		return f.Pkg.Object
-	}
-	return nil
-}
-
-var _ io.WriterTo = (*Function)(nil) // *Function implements io.Writer
-
-func (f *Function) WriteTo(w io.Writer) (int64, error) {
-	var buf bytes.Buffer
-	WriteFunction(&buf, f)
-	n, err := w.Write(buf.Bytes())
-	return int64(n), err
-}
-
-// WriteFunction writes to buf a human-readable "disassembly" of f.
-func WriteFunction(buf *bytes.Buffer, f *Function) {
-	fmt.Fprintf(buf, "# Name: %s\n", f.String())
-	if f.Pkg != nil {
-		fmt.Fprintf(buf, "# Package: %s\n", f.Pkg.Object.Path())
-	}
-	if syn := f.Synthetic; syn != "" {
-		fmt.Fprintln(buf, "# Synthetic:", syn)
-	}
-	if pos := f.Pos(); pos.IsValid() {
-		fmt.Fprintf(buf, "# Location: %s\n", f.Prog.Fset.Position(pos))
-	}
-
-	if f.parent != nil {
-		fmt.Fprintf(buf, "# Parent: %s\n", f.parent.Name())
-	}
-
-	if f.Recover != nil {
-		fmt.Fprintf(buf, "# Recover: %s\n", f.Recover)
-	}
-
-	from := f.pkgobj()
-
-	if f.FreeVars != nil {
-		buf.WriteString("# Free variables:\n")
-		for i, fv := range f.FreeVars {
-			fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, fv.Name(), relType(fv.Type(), from))
-		}
-	}
-
-	if len(f.Locals) > 0 {
-		buf.WriteString("# Locals:\n")
-		for i, l := range f.Locals {
-			fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, l.Name(), relType(deref(l.Type()), from))
-		}
-	}
-	writeSignature(buf, from, f.Name(), f.Signature, f.Params)
-	buf.WriteString(":\n")
-
-	if f.Blocks == nil {
-		buf.WriteString("\t(external)\n")
-	}
-
-	// NB. column calculations are confused by non-ASCII
-	// characters and assume 8-space tabs.
-	const punchcard = 80 // for old time's sake.
-	const tabwidth = 8
-	for _, b := range f.Blocks {
-		if b == nil {
-			// Corrupt CFG.
-			fmt.Fprintf(buf, ".nil:\n")
-			continue
-		}
-		n, _ := fmt.Fprintf(buf, "%d:", b.Index)
-		bmsg := fmt.Sprintf("%s P:%d S:%d", b.Comment, len(b.Preds), len(b.Succs))
-		fmt.Fprintf(buf, "%*s%s\n", punchcard-1-n-len(bmsg), "", bmsg)
-
-		if false { // CFG debugging
-			fmt.Fprintf(buf, "\t# CFG: %s --> %s --> %s\n", b.Preds, b, b.Succs)
-		}
-		for _, instr := range b.Instrs {
-			buf.WriteString("\t")
-			switch v := instr.(type) {
-			case Value:
-				l := punchcard - tabwidth
-				// Left-align the instruction.
-				if name := v.Name(); name != "" {
-					n, _ := fmt.Fprintf(buf, "%s = ", name)
-					l -= n
-				}
-				n, _ := buf.WriteString(instr.String())
-				l -= n
-				// Right-align the type if there's space.
-				if t := v.Type(); t != nil {
-					buf.WriteByte(' ')
-					ts := relType(t, from)
-					l -= len(ts) + len("  ") // (spaces before and after type)
-					if l > 0 {
-						fmt.Fprintf(buf, "%*s", l, "")
-					}
-					buf.WriteString(ts)
-				}
-			case nil:
-				// Be robust against bad transforms.
-				buf.WriteString("<deleted>")
-			default:
-				buf.WriteString(instr.String())
-			}
-			buf.WriteString("\n")
-		}
-	}
-	fmt.Fprintf(buf, "\n")
-}
-
-// newBasicBlock adds to f a new basic block and returns it.  It does
-// not automatically become the current block for subsequent calls to emit.
-// comment is an optional string for more readable debugging output.
-//
-func (f *Function) newBasicBlock(comment string) *BasicBlock {
-	b := &BasicBlock{
-		Index:   len(f.Blocks),
-		Comment: comment,
-		parent:  f,
-	}
-	b.Succs = b.succs2[:0]
-	f.Blocks = append(f.Blocks, b)
-	return b
-}
-
-// NewFunction returns a new synthetic Function instance belonging to
-// prog, with its name and signature fields set as specified.
-//
-// The caller is responsible for initializing the remaining fields of
-// the function object, e.g. Pkg, Params, Blocks.
-//
-// It is practically impossible for clients to construct well-formed
-// SSA functions/packages/programs directly, so we assume this is the
-// job of the Builder alone.  NewFunction exists to provide clients a
-// little flexibility.  For example, analysis tools may wish to
-// construct fake Functions for the root of the callgraph, a fake
-// "reflect" package, etc.
-//
-// TODO(adonovan): think harder about the API here.
-//
-func (prog *Program) NewFunction(name string, sig *types.Signature, provenance string) *Function {
-	return &Function{Prog: prog, name: name, Signature: sig, Synthetic: provenance}
-}
-
-type extentNode [2]token.Pos
-
-func (n extentNode) Pos() token.Pos { return n[0] }
-func (n extentNode) End() token.Pos { return n[1] }
-
-// Syntax returns an ast.Node whose Pos/End methods provide the
-// lexical extent of the function if it was defined by Go source code
-// (f.Synthetic==""), or nil otherwise.
-//
-// If f was built with debug information (see Package.SetDebugRef),
-// the result is the *ast.FuncDecl or *ast.FuncLit that declared the
-// function.  Otherwise, it is an opaque Node providing only position
-// information; this avoids pinning the AST in memory.
-//
-func (f *Function) Syntax() ast.Node { return f.syntax }
diff --git a/third_party/gotools/go/ssa/interp/external.go b/third_party/gotools/go/ssa/interp/external.go
deleted file mode 100644
index aef6515..0000000
--- a/third_party/gotools/go/ssa/interp/external.go
+++ /dev/null
@@ -1,483 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-// Emulated functions that we cannot interpret because they are
-// external or because they use "unsafe" or "reflect" operations.
-
-import (
-	"math"
-	"os"
-	"runtime"
-	"syscall"
-	"time"
-	"unsafe"
-
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-type externalFn func(fr *frame, args []value) value
-
-// TODO(adonovan): fix: reflect.Value abstracts an lvalue or an
-// rvalue; Set() causes mutations that can be observed via aliases.
-// We have not captured that correctly here.
-
-// Key strings are from Function.String().
-var externals map[string]externalFn
-
-func init() {
-	// That little dot ۰ is an Arabic zero numeral (U+06F0), categories [Nd].
-	externals = map[string]externalFn{
-		"(*sync.Pool).Get":                 ext۰sync۰Pool۰Get,
-		"(*sync.Pool).Put":                 ext۰sync۰Pool۰Put,
-		"(reflect.Value).Bool":             ext۰reflect۰Value۰Bool,
-		"(reflect.Value).CanAddr":          ext۰reflect۰Value۰CanAddr,
-		"(reflect.Value).CanInterface":     ext۰reflect۰Value۰CanInterface,
-		"(reflect.Value).Elem":             ext۰reflect۰Value۰Elem,
-		"(reflect.Value).Field":            ext۰reflect۰Value۰Field,
-		"(reflect.Value).Float":            ext۰reflect۰Value۰Float,
-		"(reflect.Value).Index":            ext۰reflect۰Value۰Index,
-		"(reflect.Value).Int":              ext۰reflect۰Value۰Int,
-		"(reflect.Value).Interface":        ext۰reflect۰Value۰Interface,
-		"(reflect.Value).IsNil":            ext۰reflect۰Value۰IsNil,
-		"(reflect.Value).IsValid":          ext۰reflect۰Value۰IsValid,
-		"(reflect.Value).Kind":             ext۰reflect۰Value۰Kind,
-		"(reflect.Value).Len":              ext۰reflect۰Value۰Len,
-		"(reflect.Value).MapIndex":         ext۰reflect۰Value۰MapIndex,
-		"(reflect.Value).MapKeys":          ext۰reflect۰Value۰MapKeys,
-		"(reflect.Value).NumField":         ext۰reflect۰Value۰NumField,
-		"(reflect.Value).NumMethod":        ext۰reflect۰Value۰NumMethod,
-		"(reflect.Value).Pointer":          ext۰reflect۰Value۰Pointer,
-		"(reflect.Value).Set":              ext۰reflect۰Value۰Set,
-		"(reflect.Value).String":           ext۰reflect۰Value۰String,
-		"(reflect.Value).Type":             ext۰reflect۰Value۰Type,
-		"(reflect.Value).Uint":             ext۰reflect۰Value۰Uint,
-		"(reflect.error).Error":            ext۰reflect۰error۰Error,
-		"(reflect.rtype).Bits":             ext۰reflect۰rtype۰Bits,
-		"(reflect.rtype).Elem":             ext۰reflect۰rtype۰Elem,
-		"(reflect.rtype).Field":            ext۰reflect۰rtype۰Field,
-		"(reflect.rtype).Kind":             ext۰reflect۰rtype۰Kind,
-		"(reflect.rtype).NumField":         ext۰reflect۰rtype۰NumField,
-		"(reflect.rtype).NumMethod":        ext۰reflect۰rtype۰NumMethod,
-		"(reflect.rtype).NumOut":           ext۰reflect۰rtype۰NumOut,
-		"(reflect.rtype).Out":              ext۰reflect۰rtype۰Out,
-		"(reflect.rtype).Size":             ext۰reflect۰rtype۰Size,
-		"(reflect.rtype).String":           ext۰reflect۰rtype۰String,
-		"bytes.Equal":                      ext۰bytes۰Equal,
-		"bytes.IndexByte":                  ext۰bytes۰IndexByte,
-		"hash/crc32.haveSSE42":             ext۰crc32۰haveSSE42,
-		"math.Abs":                         ext۰math۰Abs,
-		"math.Exp":                         ext۰math۰Exp,
-		"math.Float32bits":                 ext۰math۰Float32bits,
-		"math.Float32frombits":             ext۰math۰Float32frombits,
-		"math.Float64bits":                 ext۰math۰Float64bits,
-		"math.Float64frombits":             ext۰math۰Float64frombits,
-		"math.Ldexp":                       ext۰math۰Ldexp,
-		"math.Log":                         ext۰math۰Log,
-		"math.Min":                         ext۰math۰Min,
-		"os.runtime_args":                  ext۰os۰runtime_args,
-		"reflect.New":                      ext۰reflect۰New,
-		"reflect.SliceOf":                  ext۰reflect۰SliceOf,
-		"reflect.TypeOf":                   ext۰reflect۰TypeOf,
-		"reflect.ValueOf":                  ext۰reflect۰ValueOf,
-		"reflect.init":                     ext۰reflect۰Init,
-		"reflect.valueInterface":           ext۰reflect۰valueInterface,
-		"runtime.Breakpoint":               ext۰runtime۰Breakpoint,
-		"runtime.Caller":                   ext۰runtime۰Caller,
-		"runtime.Callers":                  ext۰runtime۰Callers,
-		"runtime.FuncForPC":                ext۰runtime۰FuncForPC,
-		"runtime.GC":                       ext۰runtime۰GC,
-		"runtime.GOMAXPROCS":               ext۰runtime۰GOMAXPROCS,
-		"runtime.Goexit":                   ext۰runtime۰Goexit,
-		"runtime.Gosched":                  ext۰runtime۰Gosched,
-		"runtime.init":                     ext۰runtime۰init,
-		"runtime.NumCPU":                   ext۰runtime۰NumCPU,
-		"runtime.ReadMemStats":             ext۰runtime۰ReadMemStats,
-		"runtime.SetFinalizer":             ext۰runtime۰SetFinalizer,
-		"(*runtime.Func).Entry":            ext۰runtime۰Func۰Entry,
-		"(*runtime.Func).FileLine":         ext۰runtime۰Func۰FileLine,
-		"(*runtime.Func).Name":             ext۰runtime۰Func۰Name,
-		"runtime.environ":                  ext۰runtime۰environ,
-		"runtime.getgoroot":                ext۰runtime۰getgoroot,
-		"strings.IndexByte":                ext۰strings۰IndexByte,
-		"sync.runtime_Semacquire":          ext۰sync۰runtime_Semacquire,
-		"sync.runtime_Semrelease":          ext۰sync۰runtime_Semrelease,
-		"sync.runtime_Syncsemcheck":        ext۰sync۰runtime_Syncsemcheck,
-		"sync.runtime_registerPoolCleanup": ext۰sync۰runtime_registerPoolCleanup,
-		"sync/atomic.AddInt32":             ext۰atomic۰AddInt32,
-		"sync/atomic.AddUint32":            ext۰atomic۰AddUint32,
-		"sync/atomic.AddUint64":            ext۰atomic۰AddUint64,
-		"sync/atomic.CompareAndSwapInt32":  ext۰atomic۰CompareAndSwapInt32,
-		"sync/atomic.LoadInt32":            ext۰atomic۰LoadInt32,
-		"sync/atomic.LoadUint32":           ext۰atomic۰LoadUint32,
-		"sync/atomic.StoreInt32":           ext۰atomic۰StoreInt32,
-		"sync/atomic.StoreUint32":          ext۰atomic۰StoreUint32,
-		"syscall.Close":                    ext۰syscall۰Close,
-		"syscall.Exit":                     ext۰syscall۰Exit,
-		"syscall.Fstat":                    ext۰syscall۰Fstat,
-		"syscall.Getpid":                   ext۰syscall۰Getpid,
-		"syscall.Getwd":                    ext۰syscall۰Getwd,
-		"syscall.Kill":                     ext۰syscall۰Kill,
-		"syscall.Lstat":                    ext۰syscall۰Lstat,
-		"syscall.Open":                     ext۰syscall۰Open,
-		"syscall.ParseDirent":              ext۰syscall۰ParseDirent,
-		"syscall.RawSyscall":               ext۰syscall۰RawSyscall,
-		"syscall.Read":                     ext۰syscall۰Read,
-		"syscall.ReadDirent":               ext۰syscall۰ReadDirent,
-		"syscall.Stat":                     ext۰syscall۰Stat,
-		"syscall.Write":                    ext۰syscall۰Write,
-		"syscall.runtime_envs":             ext۰runtime۰environ,
-		"time.Sleep":                       ext۰time۰Sleep,
-		"time.now":                         ext۰time۰now,
-	}
-}
-
-// wrapError returns an interpreted 'error' interface value for err.
-func wrapError(err error) value {
-	if err == nil {
-		return iface{}
-	}
-	return iface{t: errorType, v: err.Error()}
-}
-
-func ext۰sync۰Pool۰Get(fr *frame, args []value) value {
-	Pool := fr.i.prog.ImportedPackage("sync").Type("Pool").Object()
-	_, newIndex, _ := types.LookupFieldOrMethod(Pool.Type(), false, Pool.Pkg(), "New")
-
-	if New := (*args[0].(*value)).(structure)[newIndex[0]]; New != nil {
-		return call(fr.i, fr, 0, New, nil)
-	}
-	return nil
-}
-
-func ext۰sync۰Pool۰Put(fr *frame, args []value) value {
-	return nil
-}
-
-func ext۰bytes۰Equal(fr *frame, args []value) value {
-	// func Equal(a, b []byte) bool
-	a := args[0].([]value)
-	b := args[1].([]value)
-	if len(a) != len(b) {
-		return false
-	}
-	for i := range a {
-		if a[i] != b[i] {
-			return false
-		}
-	}
-	return true
-}
-
-func ext۰bytes۰IndexByte(fr *frame, args []value) value {
-	// func IndexByte(s []byte, c byte) int
-	s := args[0].([]value)
-	c := args[1].(byte)
-	for i, b := range s {
-		if b.(byte) == c {
-			return i
-		}
-	}
-	return -1
-}
-
-func ext۰crc32۰haveSSE42(fr *frame, args []value) value {
-	return false
-}
-
-func ext۰math۰Float64frombits(fr *frame, args []value) value {
-	return math.Float64frombits(args[0].(uint64))
-}
-
-func ext۰math۰Float64bits(fr *frame, args []value) value {
-	return math.Float64bits(args[0].(float64))
-}
-
-func ext۰math۰Float32frombits(fr *frame, args []value) value {
-	return math.Float32frombits(args[0].(uint32))
-}
-
-func ext۰math۰Abs(fr *frame, args []value) value {
-	return math.Abs(args[0].(float64))
-}
-
-func ext۰math۰Exp(fr *frame, args []value) value {
-	return math.Exp(args[0].(float64))
-}
-
-func ext۰math۰Float32bits(fr *frame, args []value) value {
-	return math.Float32bits(args[0].(float32))
-}
-
-func ext۰math۰Min(fr *frame, args []value) value {
-	return math.Min(args[0].(float64), args[1].(float64))
-}
-
-func ext۰math۰Ldexp(fr *frame, args []value) value {
-	return math.Ldexp(args[0].(float64), args[1].(int))
-}
-
-func ext۰math۰Log(fr *frame, args []value) value {
-	return math.Log(args[0].(float64))
-}
-
-func ext۰os۰runtime_args(fr *frame, args []value) value {
-	return fr.i.osArgs
-}
-
-func ext۰runtime۰Breakpoint(fr *frame, args []value) value {
-	runtime.Breakpoint()
-	return nil
-}
-
-func ext۰runtime۰Caller(fr *frame, args []value) value {
-	// func Caller(skip int) (pc uintptr, file string, line int, ok bool)
-	skip := 1 + args[0].(int)
-	for i := 0; i < skip; i++ {
-		if fr != nil {
-			fr = fr.caller
-		}
-	}
-	var pc uintptr
-	var file string
-	var line int
-	var ok bool
-	if fr != nil {
-		fn := fr.fn
-		// TODO(adonovan): use pc/posn of current instruction, not start of fn.
-		pc = uintptr(unsafe.Pointer(fn))
-		posn := fn.Prog.Fset.Position(fn.Pos())
-		file = posn.Filename
-		line = posn.Line
-		ok = true
-	}
-	return tuple{pc, file, line, ok}
-}
-
-func ext۰runtime۰Callers(fr *frame, args []value) value {
-	// Callers(skip int, pc []uintptr) int
-	skip := args[0].(int)
-	pc := args[1].([]value)
-	for i := 0; i < skip; i++ {
-		if fr != nil {
-			fr = fr.caller
-		}
-	}
-	i := 0
-	for fr != nil {
-		pc[i] = uintptr(unsafe.Pointer(fr.fn))
-		i++
-		fr = fr.caller
-	}
-	return i
-}
-
-func ext۰runtime۰FuncForPC(fr *frame, args []value) value {
-	// FuncForPC(pc uintptr) *Func
-	pc := args[0].(uintptr)
-	var fn *ssa.Function
-	if pc != 0 {
-		fn = (*ssa.Function)(unsafe.Pointer(pc)) // indeed unsafe!
-	}
-	var Func value
-	Func = structure{fn} // a runtime.Func
-	return &Func
-}
-
-func ext۰runtime۰environ(fr *frame, args []value) value {
-	// This function also implements syscall.runtime_envs.
-	return environ
-}
-
-func ext۰runtime۰getgoroot(fr *frame, args []value) value {
-	return os.Getenv("GOROOT")
-}
-
-func ext۰strings۰IndexByte(fr *frame, args []value) value {
-	// func IndexByte(s string, c byte) int
-	s := args[0].(string)
-	c := args[1].(byte)
-	for i := 0; i < len(s); i++ {
-		if s[i] == c {
-			return i
-		}
-	}
-	return -1
-}
-
-func ext۰sync۰runtime_Syncsemcheck(fr *frame, args []value) value {
-	// TODO(adonovan): fix: implement.
-	return nil
-}
-
-func ext۰sync۰runtime_registerPoolCleanup(fr *frame, args []value) value {
-	return nil
-}
-
-func ext۰sync۰runtime_Semacquire(fr *frame, args []value) value {
-	// TODO(adonovan): fix: implement.
-	return nil
-}
-
-func ext۰sync۰runtime_Semrelease(fr *frame, args []value) value {
-	// TODO(adonovan): fix: implement.
-	return nil
-}
-
-func ext۰runtime۰GOMAXPROCS(fr *frame, args []value) value {
-	return runtime.GOMAXPROCS(args[0].(int))
-}
-
-func ext۰runtime۰Goexit(fr *frame, args []value) value {
-	// TODO(adonovan): don't kill the interpreter's main goroutine.
-	runtime.Goexit()
-	return nil
-}
-
-func ext۰runtime۰GC(fr *frame, args []value) value {
-	runtime.GC()
-	return nil
-}
-
-func ext۰runtime۰Gosched(fr *frame, args []value) value {
-	runtime.Gosched()
-	return nil
-}
-
-func ext۰runtime۰init(fr *frame, args []value) value {
-	return nil
-}
-
-func ext۰runtime۰NumCPU(fr *frame, args []value) value {
-	return runtime.NumCPU()
-}
-
-func ext۰runtime۰ReadMemStats(fr *frame, args []value) value {
-	// TODO(adonovan): populate args[0].(Struct)
-	return nil
-}
-
-func ext۰atomic۰LoadUint32(fr *frame, args []value) value {
-	// TODO(adonovan): fix: not atomic!
-	return (*args[0].(*value)).(uint32)
-}
-
-func ext۰atomic۰StoreUint32(fr *frame, args []value) value {
-	// TODO(adonovan): fix: not atomic!
-	*args[0].(*value) = args[1].(uint32)
-	return nil
-}
-
-func ext۰atomic۰LoadInt32(fr *frame, args []value) value {
-	// TODO(adonovan): fix: not atomic!
-	return (*args[0].(*value)).(int32)
-}
-
-func ext۰atomic۰StoreInt32(fr *frame, args []value) value {
-	// TODO(adonovan): fix: not atomic!
-	*args[0].(*value) = args[1].(int32)
-	return nil
-}
-
-func ext۰atomic۰CompareAndSwapInt32(fr *frame, args []value) value {
-	// TODO(adonovan): fix: not atomic!
-	p := args[0].(*value)
-	if (*p).(int32) == args[1].(int32) {
-		*p = args[2].(int32)
-		return true
-	}
-	return false
-}
-
-func ext۰atomic۰AddInt32(fr *frame, args []value) value {
-	// TODO(adonovan): fix: not atomic!
-	p := args[0].(*value)
-	newv := (*p).(int32) + args[1].(int32)
-	*p = newv
-	return newv
-}
-
-func ext۰atomic۰AddUint32(fr *frame, args []value) value {
-	// TODO(adonovan): fix: not atomic!
-	p := args[0].(*value)
-	newv := (*p).(uint32) + args[1].(uint32)
-	*p = newv
-	return newv
-}
-
-func ext۰atomic۰AddUint64(fr *frame, args []value) value {
-	// TODO(adonovan): fix: not atomic!
-	p := args[0].(*value)
-	newv := (*p).(uint64) + args[1].(uint64)
-	*p = newv
-	return newv
-}
-
-func ext۰runtime۰SetFinalizer(fr *frame, args []value) value {
-	return nil // ignore
-}
-
-// Pretend: type runtime.Func struct { entry *ssa.Function }
-
-func ext۰runtime۰Func۰FileLine(fr *frame, args []value) value {
-	// func (*runtime.Func) FileLine(uintptr) (string, int)
-	f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function)
-	pc := args[1].(uintptr)
-	_ = pc
-	if f != nil {
-		// TODO(adonovan): use position of current instruction, not fn.
-		posn := f.Prog.Fset.Position(f.Pos())
-		return tuple{posn.Filename, posn.Line}
-	}
-	return tuple{"", 0}
-}
-
-func ext۰runtime۰Func۰Name(fr *frame, args []value) value {
-	// func (*runtime.Func) Name() string
-	f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function)
-	if f != nil {
-		return f.String()
-	}
-	return ""
-}
-
-func ext۰runtime۰Func۰Entry(fr *frame, args []value) value {
-	// func (*runtime.Func) Entry() uintptr
-	f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function)
-	return uintptr(unsafe.Pointer(f))
-}
-
-func ext۰time۰now(fr *frame, args []value) value {
-	nano := time.Now().UnixNano()
-	return tuple{int64(nano / 1e9), int32(nano % 1e9)}
-}
-
-func ext۰time۰Sleep(fr *frame, args []value) value {
-	time.Sleep(time.Duration(args[0].(int64)))
-	return nil
-}
-
-func ext۰syscall۰Exit(fr *frame, args []value) value {
-	panic(exitPanic(args[0].(int)))
-}
-
-func ext۰syscall۰Getwd(fr *frame, args []value) value {
-	s, err := syscall.Getwd()
-	return tuple{s, wrapError(err)}
-}
-
-func ext۰syscall۰Getpid(fr *frame, args []value) value {
-	return syscall.Getpid()
-}
-
-func valueToBytes(v value) []byte {
-	in := v.([]value)
-	b := make([]byte, len(in))
-	for i := range in {
-		b[i] = in[i].(byte)
-	}
-	return b
-}
diff --git a/third_party/gotools/go/ssa/interp/external_darwin.go b/third_party/gotools/go/ssa/interp/external_darwin.go
deleted file mode 100644
index 4974ad6..0000000
--- a/third_party/gotools/go/ssa/interp/external_darwin.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build darwin
-
-package interp
-
-import "syscall"
-
-func init() {
-	externals["syscall.Sysctl"] = ext۰syscall۰Sysctl
-}
-
-func ext۰syscall۰Sysctl(fr *frame, args []value) value {
-	r, err := syscall.Sysctl(args[0].(string))
-	return tuple{r, wrapError(err)}
-}
diff --git a/third_party/gotools/go/ssa/interp/external_freebsd.go b/third_party/gotools/go/ssa/interp/external_freebsd.go
deleted file mode 100644
index 5203303..0000000
--- a/third_party/gotools/go/ssa/interp/external_freebsd.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2014 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build freebsd
-
-package interp
-
-import "syscall"
-
-func init() {
-	externals["syscall.Sysctl"] = ext۰syscall۰Sysctl
-	externals["syscall.SysctlUint32"] = ext۰syscall۰SysctlUint32
-}
-
-func ext۰syscall۰Sysctl(fr *frame, args []value) value {
-	r, err := syscall.Sysctl(args[0].(string))
-	return tuple{r, wrapError(err)}
-}
-
-func ext۰syscall۰SysctlUint32(fr *frame, args []value) value {
-	r, err := syscall.SysctlUint32(args[0].(string))
-	return tuple{r, wrapError(err)}
-}
diff --git a/third_party/gotools/go/ssa/interp/external_plan9.go b/third_party/gotools/go/ssa/interp/external_plan9.go
deleted file mode 100644
index 05d02d5..0000000
--- a/third_party/gotools/go/ssa/interp/external_plan9.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-import "syscall"
-
-func ext۰syscall۰Close(fr *frame, args []value) value {
-	panic("syscall.Close not yet implemented")
-}
-func ext۰syscall۰Fstat(fr *frame, args []value) value {
-	panic("syscall.Fstat not yet implemented")
-}
-func ext۰syscall۰Kill(fr *frame, args []value) value {
-	panic("syscall.Kill not yet implemented")
-}
-func ext۰syscall۰Lstat(fr *frame, args []value) value {
-	panic("syscall.Lstat not yet implemented")
-}
-func ext۰syscall۰Open(fr *frame, args []value) value {
-	panic("syscall.Open not yet implemented")
-}
-func ext۰syscall۰ParseDirent(fr *frame, args []value) value {
-	panic("syscall.ParseDirent not yet implemented")
-}
-func ext۰syscall۰Read(fr *frame, args []value) value {
-	panic("syscall.Read not yet implemented")
-}
-func ext۰syscall۰ReadDirent(fr *frame, args []value) value {
-	panic("syscall.ReadDirent not yet implemented")
-}
-func ext۰syscall۰Stat(fr *frame, args []value) value {
-	panic("syscall.Stat not yet implemented")
-}
-func ext۰syscall۰Write(fr *frame, args []value) value {
-	// func Write(fd int, p []byte) (n int, err error)
-	n, err := write(args[0].(int), valueToBytes(args[1]))
-	return tuple{n, wrapError(err)}
-}
-func ext۰syscall۰RawSyscall(fr *frame, args []value) value {
-	return tuple{^uintptr(0), uintptr(0), uintptr(0)}
-}
-
-func syswrite(fd int, b []byte) (int, error) {
-	return syscall.Write(fd, b)
-}
diff --git a/third_party/gotools/go/ssa/interp/external_unix.go b/third_party/gotools/go/ssa/interp/external_unix.go
deleted file mode 100644
index c482eab..0000000
--- a/third_party/gotools/go/ssa/interp/external_unix.go
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !windows,!plan9
-
-package interp
-
-import "syscall"
-
-func fillStat(st *syscall.Stat_t, stat structure) {
-	stat[0] = st.Dev
-	stat[1] = st.Ino
-	stat[2] = st.Nlink
-	stat[3] = st.Mode
-	stat[4] = st.Uid
-	stat[5] = st.Gid
-
-	stat[7] = st.Rdev
-	stat[8] = st.Size
-	stat[9] = st.Blksize
-	stat[10] = st.Blocks
-	// TODO(adonovan): fix: copy Timespecs.
-	// stat[11] = st.Atim
-	// stat[12] = st.Mtim
-	// stat[13] = st.Ctim
-}
-
-func ext۰syscall۰Close(fr *frame, args []value) value {
-	// func Close(fd int) (err error)
-	return wrapError(syscall.Close(args[0].(int)))
-}
-
-func ext۰syscall۰Fstat(fr *frame, args []value) value {
-	// func Fstat(fd int, stat *Stat_t) (err error)
-	fd := args[0].(int)
-	stat := (*args[1].(*value)).(structure)
-
-	var st syscall.Stat_t
-	err := syscall.Fstat(fd, &st)
-	fillStat(&st, stat)
-	return wrapError(err)
-}
-
-func ext۰syscall۰ReadDirent(fr *frame, args []value) value {
-	// func ReadDirent(fd int, buf []byte) (n int, err error)
-	fd := args[0].(int)
-	p := args[1].([]value)
-	b := make([]byte, len(p))
-	n, err := syscall.ReadDirent(fd, b)
-	for i := 0; i < n; i++ {
-		p[i] = b[i]
-	}
-	return tuple{n, wrapError(err)}
-}
-
-func ext۰syscall۰Kill(fr *frame, args []value) value {
-	// func Kill(pid int, sig Signal) (err error)
-	return wrapError(syscall.Kill(args[0].(int), syscall.Signal(args[1].(int))))
-}
-
-func ext۰syscall۰Lstat(fr *frame, args []value) value {
-	// func Lstat(name string, stat *Stat_t) (err error)
-	name := args[0].(string)
-	stat := (*args[1].(*value)).(structure)
-
-	var st syscall.Stat_t
-	err := syscall.Lstat(name, &st)
-	fillStat(&st, stat)
-	return wrapError(err)
-}
-
-func ext۰syscall۰Open(fr *frame, args []value) value {
-	// func Open(path string, mode int, perm uint32) (fd int, err error) {
-	path := args[0].(string)
-	mode := args[1].(int)
-	perm := args[2].(uint32)
-	fd, err := syscall.Open(path, mode, perm)
-	return tuple{fd, wrapError(err)}
-}
-
-func ext۰syscall۰ParseDirent(fr *frame, args []value) value {
-	// func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string)
-	max := args[1].(int)
-	var names []string
-	for _, iname := range args[2].([]value) {
-		names = append(names, iname.(string))
-	}
-	consumed, count, newnames := syscall.ParseDirent(valueToBytes(args[0]), max, names)
-	var inewnames []value
-	for _, newname := range newnames {
-		inewnames = append(inewnames, newname)
-	}
-	return tuple{consumed, count, inewnames}
-}
-
-func ext۰syscall۰Read(fr *frame, args []value) value {
-	// func Read(fd int, p []byte) (n int, err error)
-	fd := args[0].(int)
-	p := args[1].([]value)
-	b := make([]byte, len(p))
-	n, err := syscall.Read(fd, b)
-	for i := 0; i < n; i++ {
-		p[i] = b[i]
-	}
-	return tuple{n, wrapError(err)}
-}
-
-func ext۰syscall۰Stat(fr *frame, args []value) value {
-	// func Stat(name string, stat *Stat_t) (err error)
-	name := args[0].(string)
-	stat := (*args[1].(*value)).(structure)
-
-	var st syscall.Stat_t
-	err := syscall.Stat(name, &st)
-	fillStat(&st, stat)
-	return wrapError(err)
-}
-
-func ext۰syscall۰Write(fr *frame, args []value) value {
-	// func Write(fd int, p []byte) (n int, err error)
-	n, err := write(args[0].(int), valueToBytes(args[1]))
-	return tuple{n, wrapError(err)}
-}
-
-func ext۰syscall۰RawSyscall(fr *frame, args []value) value {
-	return tuple{uintptr(0), uintptr(0), uintptr(syscall.ENOSYS)}
-}
-
-func syswrite(fd int, b []byte) (int, error) {
-	return syscall.Write(fd, b)
-}
diff --git a/third_party/gotools/go/ssa/interp/external_windows.go b/third_party/gotools/go/ssa/interp/external_windows.go
deleted file mode 100644
index ef28a37..0000000
--- a/third_party/gotools/go/ssa/interp/external_windows.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-import "syscall"
-
-func ext۰syscall۰Close(fr *frame, args []value) value {
-	panic("syscall.Close not yet implemented")
-}
-func ext۰syscall۰Fstat(fr *frame, args []value) value {
-	panic("syscall.Fstat not yet implemented")
-}
-func ext۰syscall۰Kill(fr *frame, args []value) value {
-	panic("syscall.Kill not yet implemented")
-}
-func ext۰syscall۰Lstat(fr *frame, args []value) value {
-	panic("syscall.Lstat not yet implemented")
-}
-func ext۰syscall۰Open(fr *frame, args []value) value {
-	panic("syscall.Open not yet implemented")
-}
-func ext۰syscall۰ParseDirent(fr *frame, args []value) value {
-	panic("syscall.ParseDirent not yet implemented")
-}
-func ext۰syscall۰Read(fr *frame, args []value) value {
-	panic("syscall.Read not yet implemented")
-}
-func ext۰syscall۰ReadDirent(fr *frame, args []value) value {
-	panic("syscall.ReadDirent not yet implemented")
-}
-func ext۰syscall۰Stat(fr *frame, args []value) value {
-	panic("syscall.Stat not yet implemented")
-}
-func ext۰syscall۰Write(fr *frame, args []value) value {
-	panic("syscall.Write not yet implemented")
-}
-func ext۰syscall۰RawSyscall(fr *frame, args []value) value {
-	return tuple{uintptr(0), uintptr(0), uintptr(syscall.ENOSYS)}
-}
-func syswrite(fd int, b []byte) (int, error) {
-	panic("syswrite not yet implemented")
-}
diff --git a/third_party/gotools/go/ssa/interp/interp.go b/third_party/gotools/go/ssa/interp/interp.go
deleted file mode 100644
index b6d1c32..0000000
--- a/third_party/gotools/go/ssa/interp/interp.go
+++ /dev/null
@@ -1,750 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package ssa/interp defines an interpreter for the SSA
-// representation of Go programs.
-//
-// This interpreter is provided as an adjunct for testing the SSA
-// construction algorithm.  Its purpose is to provide a minimal
-// metacircular implementation of the dynamic semantics of each SSA
-// instruction.  It is not, and will never be, a production-quality Go
-// interpreter.
-//
-// The following is a partial list of Go features that are currently
-// unsupported or incomplete in the interpreter.
-//
-// * Unsafe operations, including all uses of unsafe.Pointer, are
-// impossible to support given the "boxed" value representation we
-// have chosen.
-//
-// * The reflect package is only partially implemented.
-//
-// * "sync/atomic" operations are not currently atomic due to the
-// "boxed" value representation: it is not possible to read, modify
-// and write an interface value atomically.  As a consequence, Mutexes
-// are currently broken.  TODO(adonovan): provide a metacircular
-// implementation of Mutex avoiding the broken atomic primitives.
-//
-// * recover is only partially implemented.  Also, the interpreter
-// makes no attempt to distinguish target panics from interpreter
-// crashes.
-//
-// * map iteration is asymptotically inefficient.
-//
-// * the sizes of the int, uint and uintptr types in the target
-// program are assumed to be the same as those of the interpreter
-// itself.
-//
-// * all values occupy space, even those of types defined by the spec
-// to have zero size, e.g. struct{}.  This can cause asymptotic
-// performance degradation.
-//
-// * os.Exit is implemented using panic, causing deferred functions to
-// run.
-package interp // import "llvm.org/llgo/third_party/gotools/go/ssa/interp"
-
-import (
-	"fmt"
-	"go/token"
-	"os"
-	"reflect"
-	"runtime"
-
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-type continuation int
-
-const (
-	kNext continuation = iota
-	kReturn
-	kJump
-)
-
-// Mode is a bitmask of options affecting the interpreter.
-type Mode uint
-
-const (
-	DisableRecover Mode = 1 << iota // Disable recover() in target programs; show interpreter crash instead.
-	EnableTracing                   // Print a trace of all instructions as they are interpreted.
-)
-
-type methodSet map[string]*ssa.Function
-
-// State shared between all interpreted goroutines.
-type interpreter struct {
-	osArgs             []value              // the value of os.Args
-	prog               *ssa.Program         // the SSA program
-	globals            map[ssa.Value]*value // addresses of global variables (immutable)
-	mode               Mode                 // interpreter options
-	reflectPackage     *ssa.Package         // the fake reflect package
-	errorMethods       methodSet            // the method set of reflect.error, which implements the error interface.
-	rtypeMethods       methodSet            // the method set of rtype, which implements the reflect.Type interface.
-	runtimeErrorString types.Type           // the runtime.errorString type
-	sizes              types.Sizes          // the effective type-sizing function
-}
-
-type deferred struct {
-	fn    value
-	args  []value
-	instr *ssa.Defer
-	tail  *deferred
-}
-
-type frame struct {
-	i                *interpreter
-	caller           *frame
-	fn               *ssa.Function
-	block, prevBlock *ssa.BasicBlock
-	env              map[ssa.Value]value // dynamic values of SSA variables
-	locals           []value
-	defers           *deferred
-	result           value
-	panicking        bool
-	panic            interface{}
-}
-
-func (fr *frame) get(key ssa.Value) value {
-	switch key := key.(type) {
-	case nil:
-		// Hack; simplifies handling of optional attributes
-		// such as ssa.Slice.{Low,High}.
-		return nil
-	case *ssa.Function, *ssa.Builtin:
-		return key
-	case *ssa.Const:
-		return constValue(key)
-	case *ssa.Global:
-		if r, ok := fr.i.globals[key]; ok {
-			return r
-		}
-	}
-	if r, ok := fr.env[key]; ok {
-		return r
-	}
-	panic(fmt.Sprintf("get: no value for %T: %v", key, key.Name()))
-}
-
-// runDefer runs a deferred call d.
-// It always returns normally, but may set or clear fr.panic.
-//
-func (fr *frame) runDefer(d *deferred) {
-	if fr.i.mode&EnableTracing != 0 {
-		fmt.Fprintf(os.Stderr, "%s: invoking deferred function call\n",
-			fr.i.prog.Fset.Position(d.instr.Pos()))
-	}
-	var ok bool
-	defer func() {
-		if !ok {
-			// Deferred call created a new state of panic.
-			fr.panicking = true
-			fr.panic = recover()
-		}
-	}()
-	call(fr.i, fr, d.instr.Pos(), d.fn, d.args)
-	ok = true
-}
-
-// runDefers executes fr's deferred function calls in LIFO order.
-//
-// On entry, fr.panicking indicates a state of panic; if
-// true, fr.panic contains the panic value.
-//
-// On completion, if a deferred call started a panic, or if no
-// deferred call recovered from a previous state of panic, then
-// runDefers itself panics after the last deferred call has run.
-//
-// If there was no initial state of panic, or it was recovered from,
-// runDefers returns normally.
-//
-func (fr *frame) runDefers() {
-	for d := fr.defers; d != nil; d = d.tail {
-		fr.runDefer(d)
-	}
-	fr.defers = nil
-	if fr.panicking {
-		panic(fr.panic) // new panic, or still panicking
-	}
-}
-
-// lookupMethod returns the method set for type typ, which may be one
-// of the interpreter's fake types.
-func lookupMethod(i *interpreter, typ types.Type, meth *types.Func) *ssa.Function {
-	switch typ {
-	case rtypeType:
-		return i.rtypeMethods[meth.Id()]
-	case errorType:
-		return i.errorMethods[meth.Id()]
-	}
-	return i.prog.LookupMethod(typ, meth.Pkg(), meth.Name())
-}
-
-// visitInstr interprets a single ssa.Instruction within the activation
-// record frame.  It returns a continuation value indicating where to
-// read the next instruction from.
-func visitInstr(fr *frame, instr ssa.Instruction) continuation {
-	switch instr := instr.(type) {
-	case *ssa.DebugRef:
-		// no-op
-
-	case *ssa.UnOp:
-		fr.env[instr] = unop(instr, fr.get(instr.X))
-
-	case *ssa.BinOp:
-		fr.env[instr] = binop(instr.Op, instr.X.Type(), fr.get(instr.X), fr.get(instr.Y))
-
-	case *ssa.Call:
-		fn, args := prepareCall(fr, &instr.Call)
-		fr.env[instr] = call(fr.i, fr, instr.Pos(), fn, args)
-
-	case *ssa.ChangeInterface:
-		fr.env[instr] = fr.get(instr.X)
-
-	case *ssa.ChangeType:
-		fr.env[instr] = fr.get(instr.X) // (can't fail)
-
-	case *ssa.Convert:
-		fr.env[instr] = conv(instr.Type(), instr.X.Type(), fr.get(instr.X))
-
-	case *ssa.MakeInterface:
-		fr.env[instr] = iface{t: instr.X.Type(), v: fr.get(instr.X)}
-
-	case *ssa.Extract:
-		fr.env[instr] = fr.get(instr.Tuple).(tuple)[instr.Index]
-
-	case *ssa.Slice:
-		fr.env[instr] = slice(fr.get(instr.X), fr.get(instr.Low), fr.get(instr.High), fr.get(instr.Max))
-
-	case *ssa.Return:
-		switch len(instr.Results) {
-		case 0:
-		case 1:
-			fr.result = fr.get(instr.Results[0])
-		default:
-			var res []value
-			for _, r := range instr.Results {
-				res = append(res, fr.get(r))
-			}
-			fr.result = tuple(res)
-		}
-		fr.block = nil
-		return kReturn
-
-	case *ssa.RunDefers:
-		fr.runDefers()
-
-	case *ssa.Panic:
-		panic(targetPanic{fr.get(instr.X)})
-
-	case *ssa.Send:
-		fr.get(instr.Chan).(chan value) <- fr.get(instr.X)
-
-	case *ssa.Store:
-		store(deref(instr.Addr.Type()), fr.get(instr.Addr).(*value), fr.get(instr.Val))
-
-	case *ssa.If:
-		succ := 1
-		if fr.get(instr.Cond).(bool) {
-			succ = 0
-		}
-		fr.prevBlock, fr.block = fr.block, fr.block.Succs[succ]
-		return kJump
-
-	case *ssa.Jump:
-		fr.prevBlock, fr.block = fr.block, fr.block.Succs[0]
-		return kJump
-
-	case *ssa.Defer:
-		fn, args := prepareCall(fr, &instr.Call)
-		fr.defers = &deferred{
-			fn:    fn,
-			args:  args,
-			instr: instr,
-			tail:  fr.defers,
-		}
-
-	case *ssa.Go:
-		fn, args := prepareCall(fr, &instr.Call)
-		go call(fr.i, nil, instr.Pos(), fn, args)
-
-	case *ssa.MakeChan:
-		fr.env[instr] = make(chan value, asInt(fr.get(instr.Size)))
-
-	case *ssa.Alloc:
-		var addr *value
-		if instr.Heap {
-			// new
-			addr = new(value)
-			fr.env[instr] = addr
-		} else {
-			// local
-			addr = fr.env[instr].(*value)
-		}
-		*addr = zero(deref(instr.Type()))
-
-	case *ssa.MakeSlice:
-		slice := make([]value, asInt(fr.get(instr.Cap)))
-		tElt := instr.Type().Underlying().(*types.Slice).Elem()
-		for i := range slice {
-			slice[i] = zero(tElt)
-		}
-		fr.env[instr] = slice[:asInt(fr.get(instr.Len))]
-
-	case *ssa.MakeMap:
-		reserve := 0
-		if instr.Reserve != nil {
-			reserve = asInt(fr.get(instr.Reserve))
-		}
-		fr.env[instr] = makeMap(instr.Type().Underlying().(*types.Map).Key(), reserve)
-
-	case *ssa.Range:
-		fr.env[instr] = rangeIter(fr.get(instr.X), instr.X.Type())
-
-	case *ssa.Next:
-		fr.env[instr] = fr.get(instr.Iter).(iter).next()
-
-	case *ssa.FieldAddr:
-		x := fr.get(instr.X)
-		// FIXME wrong!  &global.f must not change if we do *global = zero!
-		fr.env[instr] = &(*x.(*value)).(structure)[instr.Field]
-
-	case *ssa.Field:
-		fr.env[instr] = fr.get(instr.X).(structure)[instr.Field]
-
-	case *ssa.IndexAddr:
-		x := fr.get(instr.X)
-		idx := fr.get(instr.Index)
-		switch x := x.(type) {
-		case []value:
-			fr.env[instr] = &x[asInt(idx)]
-		case *value: // *array
-			fr.env[instr] = &(*x).(array)[asInt(idx)]
-		default:
-			panic(fmt.Sprintf("unexpected x type in IndexAddr: %T", x))
-		}
-
-	case *ssa.Index:
-		fr.env[instr] = fr.get(instr.X).(array)[asInt(fr.get(instr.Index))]
-
-	case *ssa.Lookup:
-		fr.env[instr] = lookup(instr, fr.get(instr.X), fr.get(instr.Index))
-
-	case *ssa.MapUpdate:
-		m := fr.get(instr.Map)
-		key := fr.get(instr.Key)
-		v := fr.get(instr.Value)
-		switch m := m.(type) {
-		case map[value]value:
-			m[key] = v
-		case *hashmap:
-			m.insert(key.(hashable), v)
-		default:
-			panic(fmt.Sprintf("illegal map type: %T", m))
-		}
-
-	case *ssa.TypeAssert:
-		fr.env[instr] = typeAssert(fr.i, instr, fr.get(instr.X).(iface))
-
-	case *ssa.MakeClosure:
-		var bindings []value
-		for _, binding := range instr.Bindings {
-			bindings = append(bindings, fr.get(binding))
-		}
-		fr.env[instr] = &closure{instr.Fn.(*ssa.Function), bindings}
-
-	case *ssa.Phi:
-		for i, pred := range instr.Block().Preds {
-			if fr.prevBlock == pred {
-				fr.env[instr] = fr.get(instr.Edges[i])
-				break
-			}
-		}
-
-	case *ssa.Select:
-		var cases []reflect.SelectCase
-		if !instr.Blocking {
-			cases = append(cases, reflect.SelectCase{
-				Dir: reflect.SelectDefault,
-			})
-		}
-		for _, state := range instr.States {
-			var dir reflect.SelectDir
-			if state.Dir == types.RecvOnly {
-				dir = reflect.SelectRecv
-			} else {
-				dir = reflect.SelectSend
-			}
-			var send reflect.Value
-			if state.Send != nil {
-				send = reflect.ValueOf(fr.get(state.Send))
-			}
-			cases = append(cases, reflect.SelectCase{
-				Dir:  dir,
-				Chan: reflect.ValueOf(fr.get(state.Chan)),
-				Send: send,
-			})
-		}
-		chosen, recv, recvOk := reflect.Select(cases)
-		if !instr.Blocking {
-			chosen-- // default case should have index -1.
-		}
-		r := tuple{chosen, recvOk}
-		for i, st := range instr.States {
-			if st.Dir == types.RecvOnly {
-				var v value
-				if i == chosen && recvOk {
-					// No need to copy since send makes an unaliased copy.
-					v = recv.Interface().(value)
-				} else {
-					v = zero(st.Chan.Type().Underlying().(*types.Chan).Elem())
-				}
-				r = append(r, v)
-			}
-		}
-		fr.env[instr] = r
-
-	default:
-		panic(fmt.Sprintf("unexpected instruction: %T", instr))
-	}
-
-	// if val, ok := instr.(ssa.Value); ok {
-	// 	fmt.Println(toString(fr.env[val])) // debugging
-	// }
-
-	return kNext
-}
-
-// prepareCall determines the function value and argument values for a
-// function call in a Call, Go or Defer instruction, performing
-// interface method lookup if needed.
-//
-func prepareCall(fr *frame, call *ssa.CallCommon) (fn value, args []value) {
-	v := fr.get(call.Value)
-	if call.Method == nil {
-		// Function call.
-		fn = v
-	} else {
-		// Interface method invocation.
-		recv := v.(iface)
-		if recv.t == nil {
-			panic("method invoked on nil interface")
-		}
-		if f := lookupMethod(fr.i, recv.t, call.Method); f == nil {
-			// Unreachable in well-typed programs.
-			panic(fmt.Sprintf("method set for dynamic type %v does not contain %s", recv.t, call.Method))
-		} else {
-			fn = f
-		}
-		args = append(args, recv.v)
-	}
-	for _, arg := range call.Args {
-		args = append(args, fr.get(arg))
-	}
-	return
-}
-
-// call interprets a call to a function (function, builtin or closure)
-// fn with arguments args, returning its result.
-// callpos is the position of the callsite.
-//
-func call(i *interpreter, caller *frame, callpos token.Pos, fn value, args []value) value {
-	switch fn := fn.(type) {
-	case *ssa.Function:
-		if fn == nil {
-			panic("call of nil function") // nil of func type
-		}
-		return callSSA(i, caller, callpos, fn, args, nil)
-	case *closure:
-		return callSSA(i, caller, callpos, fn.Fn, args, fn.Env)
-	case *ssa.Builtin:
-		return callBuiltin(caller, callpos, fn, args)
-	}
-	panic(fmt.Sprintf("cannot call %T", fn))
-}
-
-func loc(fset *token.FileSet, pos token.Pos) string {
-	if pos == token.NoPos {
-		return ""
-	}
-	return " at " + fset.Position(pos).String()
-}
-
-// callSSA interprets a call to function fn with arguments args,
-// and lexical environment env, returning its result.
-// callpos is the position of the callsite.
-//
-func callSSA(i *interpreter, caller *frame, callpos token.Pos, fn *ssa.Function, args []value, env []value) value {
-	if i.mode&EnableTracing != 0 {
-		fset := fn.Prog.Fset
-		// TODO(adonovan): fix: loc() lies for external functions.
-		fmt.Fprintf(os.Stderr, "Entering %s%s.\n", fn, loc(fset, fn.Pos()))
-		suffix := ""
-		if caller != nil {
-			suffix = ", resuming " + caller.fn.String() + loc(fset, callpos)
-		}
-		defer fmt.Fprintf(os.Stderr, "Leaving %s%s.\n", fn, suffix)
-	}
-	fr := &frame{
-		i:      i,
-		caller: caller, // for panic/recover
-		fn:     fn,
-	}
-	if fn.Parent() == nil {
-		name := fn.String()
-		if ext := externals[name]; ext != nil {
-			if i.mode&EnableTracing != 0 {
-				fmt.Fprintln(os.Stderr, "\t(external)")
-			}
-			return ext(fr, args)
-		}
-		if fn.Blocks == nil {
-			panic("no code for function: " + name)
-		}
-	}
-	fr.env = make(map[ssa.Value]value)
-	fr.block = fn.Blocks[0]
-	fr.locals = make([]value, len(fn.Locals))
-	for i, l := range fn.Locals {
-		fr.locals[i] = zero(deref(l.Type()))
-		fr.env[l] = &fr.locals[i]
-	}
-	for i, p := range fn.Params {
-		fr.env[p] = args[i]
-	}
-	for i, fv := range fn.FreeVars {
-		fr.env[fv] = env[i]
-	}
-	for fr.block != nil {
-		runFrame(fr)
-	}
-	// Destroy the locals to avoid accidental use after return.
-	for i := range fn.Locals {
-		fr.locals[i] = bad{}
-	}
-	return fr.result
-}
-
-// runFrame executes SSA instructions starting at fr.block and
-// continuing until a return, a panic, or a recovered panic.
-//
-// After a panic, runFrame panics.
-//
-// After a normal return, fr.result contains the result of the call
-// and fr.block is nil.
-//
-// A recovered panic in a function without named return parameters
-// (NRPs) becomes a normal return of the zero value of the function's
-// result type.
-//
-// After a recovered panic in a function with NRPs, fr.result is
-// undefined and fr.block contains the block at which to resume
-// control.
-//
-func runFrame(fr *frame) {
-	defer func() {
-		if fr.block == nil {
-			return // normal return
-		}
-		if fr.i.mode&DisableRecover != 0 {
-			return // let interpreter crash
-		}
-		fr.panicking = true
-		fr.panic = recover()
-		if fr.i.mode&EnableTracing != 0 {
-			fmt.Fprintf(os.Stderr, "Panicking: %T %v.\n", fr.panic, fr.panic)
-		}
-		fr.runDefers()
-		fr.block = fr.fn.Recover
-	}()
-
-	for {
-		if fr.i.mode&EnableTracing != 0 {
-			fmt.Fprintf(os.Stderr, ".%s:\n", fr.block)
-		}
-	block:
-		for _, instr := range fr.block.Instrs {
-			if fr.i.mode&EnableTracing != 0 {
-				if v, ok := instr.(ssa.Value); ok {
-					fmt.Fprintln(os.Stderr, "\t", v.Name(), "=", instr)
-				} else {
-					fmt.Fprintln(os.Stderr, "\t", instr)
-				}
-			}
-			switch visitInstr(fr, instr) {
-			case kReturn:
-				return
-			case kNext:
-				// no-op
-			case kJump:
-				break block
-			}
-		}
-	}
-}
-
-// doRecover implements the recover() built-in.
-func doRecover(caller *frame) value {
-	// recover() must be exactly one level beneath the deferred
-	// function (two levels beneath the panicking function) to
-	// have any effect.  Thus we ignore both "defer recover()" and
-	// "defer f() -> g() -> recover()".
-	if caller.i.mode&DisableRecover == 0 &&
-		caller != nil && !caller.panicking &&
-		caller.caller != nil && caller.caller.panicking {
-		caller.caller.panicking = false
-		p := caller.caller.panic
-		caller.caller.panic = nil
-		switch p := p.(type) {
-		case targetPanic:
-			// The target program explicitly called panic().
-			return p.v
-		case runtime.Error:
-			// The interpreter encountered a runtime error.
-			return iface{caller.i.runtimeErrorString, p.Error()}
-		case string:
-			// The interpreter explicitly called panic().
-			return iface{caller.i.runtimeErrorString, p}
-		default:
-			panic(fmt.Sprintf("unexpected panic type %T in target call to recover()", p))
-		}
-	}
-	return iface{}
-}
-
-// setGlobal sets the value of a system-initialized global variable.
-func setGlobal(i *interpreter, pkg *ssa.Package, name string, v value) {
-	if g, ok := i.globals[pkg.Var(name)]; ok {
-		*g = v
-		return
-	}
-	panic("no global variable: " + pkg.Object.Path() + "." + name)
-}
-
-var environ []value
-
-func init() {
-	for _, s := range os.Environ() {
-		environ = append(environ, s)
-	}
-	environ = append(environ, "GOSSAINTERP=1")
-	environ = append(environ, "GOARCH="+runtime.GOARCH)
-}
-
-// deleteBodies delete the bodies of all standalone functions except the
-// specified ones.  A missing intrinsic leads to a clear runtime error.
-func deleteBodies(pkg *ssa.Package, except ...string) {
-	keep := make(map[string]bool)
-	for _, e := range except {
-		keep[e] = true
-	}
-	for _, mem := range pkg.Members {
-		if fn, ok := mem.(*ssa.Function); ok && !keep[fn.Name()] {
-			fn.Blocks = nil
-		}
-	}
-}
-
-// Interpret interprets the Go program whose main package is mainpkg.
-// mode specifies various interpreter options.  filename and args are
-// the initial values of os.Args for the target program.  sizes is the
-// effective type-sizing function for this program.
-//
-// Interpret returns the exit code of the program: 2 for panic (like
-// gc does), or the argument to os.Exit for normal termination.
-//
-// The SSA program must include the "runtime" package.
-//
-func Interpret(mainpkg *ssa.Package, mode Mode, sizes types.Sizes, filename string, args []string) (exitCode int) {
-	i := &interpreter{
-		prog:    mainpkg.Prog,
-		globals: make(map[ssa.Value]*value),
-		mode:    mode,
-		sizes:   sizes,
-	}
-	runtimePkg := i.prog.ImportedPackage("runtime")
-	if runtimePkg == nil {
-		panic("ssa.Program doesn't include runtime package")
-	}
-	i.runtimeErrorString = runtimePkg.Type("errorString").Object().Type()
-
-	initReflect(i)
-
-	i.osArgs = append(i.osArgs, filename)
-	for _, arg := range args {
-		i.osArgs = append(i.osArgs, arg)
-	}
-
-	for _, pkg := range i.prog.AllPackages() {
-		// Initialize global storage.
-		for _, m := range pkg.Members {
-			switch v := m.(type) {
-			case *ssa.Global:
-				cell := zero(deref(v.Type()))
-				i.globals[v] = &cell
-			}
-		}
-
-		// Ad-hoc initialization for magic system variables.
-		switch pkg.Object.Path() {
-		case "syscall":
-			setGlobal(i, pkg, "envs", environ)
-
-		case "reflect":
-			deleteBodies(pkg, "DeepEqual", "deepValueEqual")
-
-		case "runtime":
-			sz := sizes.Sizeof(pkg.Object.Scope().Lookup("MemStats").Type())
-			setGlobal(i, pkg, "sizeof_C_MStats", uintptr(sz))
-			deleteBodies(pkg, "GOROOT", "gogetenv")
-		}
-	}
-
-	// Top-level error handler.
-	exitCode = 2
-	defer func() {
-		if exitCode != 2 || i.mode&DisableRecover != 0 {
-			return
-		}
-		switch p := recover().(type) {
-		case exitPanic:
-			exitCode = int(p)
-			return
-		case targetPanic:
-			fmt.Fprintln(os.Stderr, "panic:", toString(p.v))
-		case runtime.Error:
-			fmt.Fprintln(os.Stderr, "panic:", p.Error())
-		case string:
-			fmt.Fprintln(os.Stderr, "panic:", p)
-		default:
-			fmt.Fprintf(os.Stderr, "panic: unexpected type: %T: %v\n", p, p)
-		}
-
-		// TODO(adonovan): dump panicking interpreter goroutine?
-		// buf := make([]byte, 0x10000)
-		// runtime.Stack(buf, false)
-		// fmt.Fprintln(os.Stderr, string(buf))
-		// (Or dump panicking target goroutine?)
-	}()
-
-	// Run!
-	call(i, nil, token.NoPos, mainpkg.Func("init"), nil)
-	if mainFn := mainpkg.Func("main"); mainFn != nil {
-		call(i, nil, token.NoPos, mainFn, nil)
-		exitCode = 0
-	} else {
-		fmt.Fprintln(os.Stderr, "No main function.")
-		exitCode = 1
-	}
-	return
-}
-
-// deref returns a pointer's element type; otherwise it returns typ.
-// TODO(adonovan): Import from ssa?
-func deref(typ types.Type) types.Type {
-	if p, ok := typ.Underlying().(*types.Pointer); ok {
-		return p.Elem()
-	}
-	return typ
-}
diff --git a/third_party/gotools/go/ssa/interp/interp_test.go b/third_party/gotools/go/ssa/interp/interp_test.go
deleted file mode 100644
index c7cc631..0000000
--- a/third_party/gotools/go/ssa/interp/interp_test.go
+++ /dev/null
@@ -1,356 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !windows,!plan9
-
-package interp_test
-
-import (
-	"bytes"
-	"fmt"
-	"go/build"
-	"os"
-	"path/filepath"
-	"strings"
-	"testing"
-	"time"
-
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/ssa/interp"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// Each line contains a space-separated list of $GOROOT/test/
-// filenames comprising the main package of a program.
-// They are ordered quickest-first, roughly.
-//
-// TODO(adonovan): integrate into the $GOROOT/test driver scripts,
-// golden file checking, etc.
-var gorootTestTests = []string{
-	"235.go",
-	"alias1.go",
-	"chancap.go",
-	"func5.go",
-	"func6.go",
-	"func7.go",
-	"func8.go",
-	"helloworld.go",
-	"varinit.go",
-	"escape3.go",
-	"initcomma.go",
-	"cmp.go",
-	"compos.go",
-	"turing.go",
-	"indirect.go",
-	"complit.go",
-	"for.go",
-	"struct0.go",
-	"intcvt.go",
-	"printbig.go",
-	"deferprint.go",
-	"escape.go",
-	"range.go",
-	"const4.go",
-	"float_lit.go",
-	"bigalg.go",
-	"decl.go",
-	"if.go",
-	"named.go",
-	"bigmap.go",
-	"func.go",
-	"reorder2.go",
-	"closure.go",
-	"gc.go",
-	"simassign.go",
-	"iota.go",
-	"nilptr2.go",
-	"goprint.go", // doesn't actually assert anything (cmpout)
-	"utf.go",
-	"method.go",
-	"char_lit.go",
-	"env.go",
-	"int_lit.go",
-	"string_lit.go",
-	"defer.go",
-	"typeswitch.go",
-	"stringrange.go",
-	"reorder.go",
-	"method3.go",
-	"literal.go",
-	"nul1.go", // doesn't actually assert anything (errorcheckoutput)
-	"zerodivide.go",
-	"convert.go",
-	"convT2X.go",
-	"switch.go",
-	"initialize.go",
-	"ddd.go",
-	"blank.go", // partly disabled
-	"map.go",
-	"closedchan.go",
-	"divide.go",
-	"rename.go",
-	"const3.go",
-	"nil.go",
-	"recover.go", // reflection parts disabled
-	"recover1.go",
-	"recover2.go",
-	"recover3.go",
-	"typeswitch1.go",
-	"floatcmp.go",
-	"crlf.go", // doesn't actually assert anything (runoutput)
-	// Slow tests follow.
-	"bom.go", // ~1.7s
-	"gc1.go", // ~1.7s
-	"cmplxdivide.go cmplxdivide1.go", // ~2.4s
-
-	// Working, but not worth enabling:
-	// "append.go",    // works, but slow (15s).
-	// "gc2.go",       // works, but slow, and cheats on the memory check.
-	// "sigchld.go",   // works, but only on POSIX.
-	// "peano.go",     // works only up to n=9, and slow even then.
-	// "stack.go",     // works, but too slow (~30s) by default.
-	// "solitaire.go", // works, but too slow (~30s).
-	// "const.go",     // works but for but one bug: constant folder doesn't consider representations.
-	// "init1.go",     // too slow (80s) and not that interesting. Cheats on ReadMemStats check too.
-	// "rotate.go rotate0.go", // emits source for a test
-	// "rotate.go rotate1.go", // emits source for a test
-	// "rotate.go rotate2.go", // emits source for a test
-	// "rotate.go rotate3.go", // emits source for a test
-	// "64bit.go",             // emits source for a test
-	// "run.go",               // test driver, not a test.
-
-	// Broken.  TODO(adonovan): fix.
-	// copy.go         // very slow; but with N=4 quickly crashes, slice index out of range.
-	// nilptr.go       // interp: V > uintptr not implemented. Slow test, lots of mem
-	// args.go         // works, but requires specific os.Args from the driver.
-	// index.go        // a template, not a real test.
-	// mallocfin.go    // SetFinalizer not implemented.
-
-	// TODO(adonovan): add tests from $GOROOT/test/* subtrees:
-	// bench chan bugs fixedbugs interface ken.
-}
-
-// These are files in go.tools/go/ssa/interp/testdata/.
-var testdataTests = []string{
-	"boundmeth.go",
-	"complit.go",
-	"coverage.go",
-	"defer.go",
-	"fieldprom.go",
-	"ifaceconv.go",
-	"ifaceprom.go",
-	"initorder.go",
-	"methprom.go",
-	"mrvchain.go",
-	"range.go",
-	"recover.go",
-	"reflect.go",
-	"static.go",
-	"callstack.go",
-}
-
-// These are files and packages in $GOROOT/src/.
-var gorootSrcTests = []string{
-	"encoding/ascii85",
-	"encoding/csv",
-	"encoding/hex",
-	"encoding/pem",
-	"hash/crc32",
-	// "testing", // TODO(adonovan): implement runtime.Goexit correctly
-	"text/scanner",
-	"unicode",
-
-	// Too slow:
-	// "container/ring",
-	// "hash/adler32",
-
-	// TODO(adonovan): packages with Examples require os.Pipe (unimplemented):
-	// "unicode/utf8",
-	// "log",
-	// "path",
-	// "flag",
-}
-
-type successPredicate func(exitcode int, output string) error
-
-func run(t *testing.T, dir, input string, success successPredicate) bool {
-	fmt.Printf("Input: %s\n", input)
-
-	start := time.Now()
-
-	var inputs []string
-	for _, i := range strings.Split(input, " ") {
-		if strings.HasSuffix(i, ".go") {
-			i = dir + i
-		}
-		inputs = append(inputs, i)
-	}
-
-	var conf loader.Config
-	if _, err := conf.FromArgs(inputs, true); err != nil {
-		t.Errorf("FromArgs(%s) failed: %s", inputs, err)
-		return false
-	}
-
-	conf.Import("runtime")
-
-	// Print a helpful hint if we don't make it to the end.
-	var hint string
-	defer func() {
-		if hint != "" {
-			fmt.Println("FAIL")
-			fmt.Println(hint)
-		} else {
-			fmt.Println("PASS")
-		}
-
-		interp.CapturedOutput = nil
-	}()
-
-	hint = fmt.Sprintf("To dump SSA representation, run:\n%% go build golang.org/x/tools/cmd/ssadump && ./ssadump -build=CFP %s\n", input)
-
-	iprog, err := conf.Load()
-	if err != nil {
-		t.Errorf("conf.Load(%s) failed: %s", inputs, err)
-		return false
-	}
-
-	prog := ssa.Create(iprog, ssa.SanityCheckFunctions)
-	prog.BuildAll()
-
-	var mainPkg *ssa.Package
-	var initialPkgs []*ssa.Package
-	for _, info := range iprog.InitialPackages() {
-		if info.Pkg.Path() == "runtime" {
-			continue // not an initial package
-		}
-		p := prog.Package(info.Pkg)
-		initialPkgs = append(initialPkgs, p)
-		if mainPkg == nil && p.Func("main") != nil {
-			mainPkg = p
-		}
-	}
-	if mainPkg == nil {
-		testmainPkg := prog.CreateTestMainPackage(initialPkgs...)
-		if testmainPkg == nil {
-			t.Errorf("CreateTestMainPackage(%s) returned nil", mainPkg)
-			return false
-		}
-		if testmainPkg.Func("main") == nil {
-			t.Errorf("synthetic testmain package has no main")
-			return false
-		}
-		mainPkg = testmainPkg
-	}
-
-	var out bytes.Buffer
-	interp.CapturedOutput = &out
-
-	hint = fmt.Sprintf("To trace execution, run:\n%% go build golang.org/x/tools/cmd/ssadump && ./ssadump -build=C -run --interp=T %s\n", input)
-	exitCode := interp.Interpret(mainPkg, 0, &types.StdSizes{8, 8}, inputs[0], []string{})
-
-	// The definition of success varies with each file.
-	if err := success(exitCode, out.String()); err != nil {
-		t.Errorf("interp.Interpret(%s) failed: %s", inputs, err)
-		return false
-	}
-
-	hint = "" // call off the hounds
-
-	if false {
-		fmt.Println(input, time.Since(start)) // test profiling
-	}
-
-	return true
-}
-
-const slash = string(os.PathSeparator)
-
-func printFailures(failures []string) {
-	if failures != nil {
-		fmt.Println("The following tests failed:")
-		for _, f := range failures {
-			fmt.Printf("\t%s\n", f)
-		}
-	}
-}
-
-func success(exitcode int, output string) error {
-	if exitcode != 0 {
-		return fmt.Errorf("exit code was %d", exitcode)
-	}
-	if strings.Contains(output, "BUG") {
-		return fmt.Errorf("exited zero but output contained 'BUG'")
-	}
-	return nil
-}
-
-// TestTestdataFiles runs the interpreter on testdata/*.go.
-func TestTestdataFiles(t *testing.T) {
-	var failures []string
-	for _, input := range testdataTests {
-		if !run(t, "testdata"+slash, input, success) {
-			failures = append(failures, input)
-		}
-	}
-	printFailures(failures)
-}
-
-// TestGorootTest runs the interpreter on $GOROOT/test/*.go.
-func TestGorootTest(t *testing.T) {
-	if testing.Short() {
-		return // too slow (~30s)
-	}
-
-	var failures []string
-
-	for _, input := range gorootTestTests {
-		if !run(t, filepath.Join(build.Default.GOROOT, "test")+slash, input, success) {
-			failures = append(failures, input)
-		}
-	}
-	for _, input := range gorootSrcTests {
-		if !run(t, filepath.Join(build.Default.GOROOT, "src")+slash, input, success) {
-			failures = append(failures, input)
-		}
-	}
-	printFailures(failures)
-}
-
-// TestTestmainPackage runs the interpreter on a synthetic "testmain" package.
-func TestTestmainPackage(t *testing.T) {
-	success := func(exitcode int, output string) error {
-		if exitcode == 0 {
-			return fmt.Errorf("unexpected success")
-		}
-		if !strings.Contains(output, "FAIL: TestFoo") {
-			return fmt.Errorf("missing failure log for TestFoo")
-		}
-		if !strings.Contains(output, "FAIL: TestBar") {
-			return fmt.Errorf("missing failure log for TestBar")
-		}
-		// TODO(adonovan): test benchmarks too
-		return nil
-	}
-	run(t, "testdata"+slash, "a_test.go", success)
-}
-
-// CreateTestMainPackage should return nil if there were no tests.
-func TestNullTestmainPackage(t *testing.T) {
-	var conf loader.Config
-	conf.CreateFromFilenames("", "testdata/b_test.go")
-	iprog, err := conf.Load()
-	if err != nil {
-		t.Fatalf("CreatePackages failed: %s", err)
-	}
-	prog := ssa.Create(iprog, ssa.SanityCheckFunctions)
-	mainPkg := prog.Package(iprog.Created[0].Pkg)
-	if mainPkg.Func("main") != nil {
-		t.Fatalf("unexpected main function")
-	}
-	if prog.CreateTestMainPackage(mainPkg) != nil {
-		t.Fatalf("CreateTestMainPackage returned non-nil")
-	}
-}
diff --git a/third_party/gotools/go/ssa/interp/map.go b/third_party/gotools/go/ssa/interp/map.go
deleted file mode 100644
index b9ec4a2..0000000
--- a/third_party/gotools/go/ssa/interp/map.go
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-// Custom hashtable atop map.
-// For use when the key's equivalence relation is not consistent with ==.
-
-// The Go specification doesn't address the atomicity of map operations.
-// The FAQ states that an implementation is permitted to crash on
-// concurrent map access.
-
-import (
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-type hashable interface {
-	hash(t types.Type) int
-	eq(t types.Type, x interface{}) bool
-}
-
-type entry struct {
-	key   hashable
-	value value
-	next  *entry
-}
-
-// A hashtable atop the built-in map.  Since each bucket contains
-// exactly one hash value, there's no need to perform hash-equality
-// tests when walking the linked list.  Rehashing is done by the
-// underlying map.
-type hashmap struct {
-	keyType types.Type
-	table   map[int]*entry
-	length  int // number of entries in map
-}
-
-// makeMap returns an empty initialized map of key type kt,
-// preallocating space for reserve elements.
-func makeMap(kt types.Type, reserve int) value {
-	if usesBuiltinMap(kt) {
-		return make(map[value]value, reserve)
-	}
-	return &hashmap{keyType: kt, table: make(map[int]*entry, reserve)}
-}
-
-// delete removes the association for key k, if any.
-func (m *hashmap) delete(k hashable) {
-	if m != nil {
-		hash := k.hash(m.keyType)
-		head := m.table[hash]
-		if head != nil {
-			if k.eq(m.keyType, head.key) {
-				m.table[hash] = head.next
-				m.length--
-				return
-			}
-			prev := head
-			for e := head.next; e != nil; e = e.next {
-				if k.eq(m.keyType, e.key) {
-					prev.next = e.next
-					m.length--
-					return
-				}
-				prev = e
-			}
-		}
-	}
-}
-
-// lookup returns the value associated with key k, if present, or
-// value(nil) otherwise.
-func (m *hashmap) lookup(k hashable) value {
-	if m != nil {
-		hash := k.hash(m.keyType)
-		for e := m.table[hash]; e != nil; e = e.next {
-			if k.eq(m.keyType, e.key) {
-				return e.value
-			}
-		}
-	}
-	return nil
-}
-
-// insert updates the map to associate key k with value v.  If there
-// was already an association for an eq() (though not necessarily ==)
-// k, the previous key remains in the map and its associated value is
-// updated.
-func (m *hashmap) insert(k hashable, v value) {
-	hash := k.hash(m.keyType)
-	head := m.table[hash]
-	for e := head; e != nil; e = e.next {
-		if k.eq(m.keyType, e.key) {
-			e.value = v
-			return
-		}
-	}
-	m.table[hash] = &entry{
-		key:   k,
-		value: v,
-		next:  head,
-	}
-	m.length++
-}
-
-// len returns the number of key/value associations in the map.
-func (m *hashmap) len() int {
-	if m != nil {
-		return m.length
-	}
-	return 0
-}
diff --git a/third_party/gotools/go/ssa/interp/ops.go b/third_party/gotools/go/ssa/interp/ops.go
deleted file mode 100644
index 1f6a1bc..0000000
--- a/third_party/gotools/go/ssa/interp/ops.go
+++ /dev/null
@@ -1,1394 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-import (
-	"bytes"
-	"fmt"
-	"go/token"
-	"strings"
-	"sync"
-	"unsafe"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// If the target program panics, the interpreter panics with this type.
-type targetPanic struct {
-	v value
-}
-
-func (p targetPanic) String() string {
-	return toString(p.v)
-}
-
-// If the target program calls exit, the interpreter panics with this type.
-type exitPanic int
-
-// constValue returns the value of the constant with the
-// dynamic type tag appropriate for c.Type().
-func constValue(c *ssa.Const) value {
-	if c.IsNil() {
-		return zero(c.Type()) // typed nil
-	}
-
-	if t, ok := c.Type().Underlying().(*types.Basic); ok {
-		// TODO(adonovan): eliminate untyped constants from SSA form.
-		switch t.Kind() {
-		case types.Bool, types.UntypedBool:
-			return exact.BoolVal(c.Value)
-		case types.Int, types.UntypedInt:
-			// Assume sizeof(int) is same on host and target.
-			return int(c.Int64())
-		case types.Int8:
-			return int8(c.Int64())
-		case types.Int16:
-			return int16(c.Int64())
-		case types.Int32, types.UntypedRune:
-			return int32(c.Int64())
-		case types.Int64:
-			return c.Int64()
-		case types.Uint:
-			// Assume sizeof(uint) is same on host and target.
-			return uint(c.Uint64())
-		case types.Uint8:
-			return uint8(c.Uint64())
-		case types.Uint16:
-			return uint16(c.Uint64())
-		case types.Uint32:
-			return uint32(c.Uint64())
-		case types.Uint64:
-			return c.Uint64()
-		case types.Uintptr:
-			// Assume sizeof(uintptr) is same on host and target.
-			return uintptr(c.Uint64())
-		case types.Float32:
-			return float32(c.Float64())
-		case types.Float64, types.UntypedFloat:
-			return c.Float64()
-		case types.Complex64:
-			return complex64(c.Complex128())
-		case types.Complex128, types.UntypedComplex:
-			return c.Complex128()
-		case types.String, types.UntypedString:
-			if c.Value.Kind() == exact.String {
-				return exact.StringVal(c.Value)
-			}
-			return string(rune(c.Int64()))
-		}
-	}
-
-	panic(fmt.Sprintf("constValue: %s", c))
-}
-
-// asInt converts x, which must be an integer, to an int suitable for
-// use as a slice or array index or operand to make().
-func asInt(x value) int {
-	switch x := x.(type) {
-	case int:
-		return x
-	case int8:
-		return int(x)
-	case int16:
-		return int(x)
-	case int32:
-		return int(x)
-	case int64:
-		return int(x)
-	case uint:
-		return int(x)
-	case uint8:
-		return int(x)
-	case uint16:
-		return int(x)
-	case uint32:
-		return int(x)
-	case uint64:
-		return int(x)
-	case uintptr:
-		return int(x)
-	}
-	panic(fmt.Sprintf("cannot convert %T to int", x))
-}
-
-// asUint64 converts x, which must be an unsigned integer, to a uint64
-// suitable for use as a bitwise shift count.
-func asUint64(x value) uint64 {
-	switch x := x.(type) {
-	case uint:
-		return uint64(x)
-	case uint8:
-		return uint64(x)
-	case uint16:
-		return uint64(x)
-	case uint32:
-		return uint64(x)
-	case uint64:
-		return x
-	case uintptr:
-		return uint64(x)
-	}
-	panic(fmt.Sprintf("cannot convert %T to uint64", x))
-}
-
-// zero returns a new "zero" value of the specified type.
-func zero(t types.Type) value {
-	switch t := t.(type) {
-	case *types.Basic:
-		if t.Kind() == types.UntypedNil {
-			panic("untyped nil has no zero value")
-		}
-		if t.Info()&types.IsUntyped != 0 {
-			// TODO(adonovan): make it an invariant that
-			// this is unreachable.  Currently some
-			// constants have 'untyped' types when they
-			// should be defaulted by the typechecker.
-			t = ssa.DefaultType(t).(*types.Basic)
-		}
-		switch t.Kind() {
-		case types.Bool:
-			return false
-		case types.Int:
-			return int(0)
-		case types.Int8:
-			return int8(0)
-		case types.Int16:
-			return int16(0)
-		case types.Int32:
-			return int32(0)
-		case types.Int64:
-			return int64(0)
-		case types.Uint:
-			return uint(0)
-		case types.Uint8:
-			return uint8(0)
-		case types.Uint16:
-			return uint16(0)
-		case types.Uint32:
-			return uint32(0)
-		case types.Uint64:
-			return uint64(0)
-		case types.Uintptr:
-			return uintptr(0)
-		case types.Float32:
-			return float32(0)
-		case types.Float64:
-			return float64(0)
-		case types.Complex64:
-			return complex64(0)
-		case types.Complex128:
-			return complex128(0)
-		case types.String:
-			return ""
-		case types.UnsafePointer:
-			return unsafe.Pointer(nil)
-		default:
-			panic(fmt.Sprint("zero for unexpected type:", t))
-		}
-	case *types.Pointer:
-		return (*value)(nil)
-	case *types.Array:
-		a := make(array, t.Len())
-		for i := range a {
-			a[i] = zero(t.Elem())
-		}
-		return a
-	case *types.Named:
-		return zero(t.Underlying())
-	case *types.Interface:
-		return iface{} // nil type, methodset and value
-	case *types.Slice:
-		return []value(nil)
-	case *types.Struct:
-		s := make(structure, t.NumFields())
-		for i := range s {
-			s[i] = zero(t.Field(i).Type())
-		}
-		return s
-	case *types.Tuple:
-		if t.Len() == 1 {
-			return zero(t.At(0).Type())
-		}
-		s := make(tuple, t.Len())
-		for i := range s {
-			s[i] = zero(t.At(i).Type())
-		}
-		return s
-	case *types.Chan:
-		return chan value(nil)
-	case *types.Map:
-		if usesBuiltinMap(t.Key()) {
-			return map[value]value(nil)
-		}
-		return (*hashmap)(nil)
-	case *types.Signature:
-		return (*ssa.Function)(nil)
-	}
-	panic(fmt.Sprint("zero: unexpected ", t))
-}
-
-// slice returns x[lo:hi:max].  Any of lo, hi and max may be nil.
-func slice(x, lo, hi, max value) value {
-	var Len, Cap int
-	switch x := x.(type) {
-	case string:
-		Len = len(x)
-	case []value:
-		Len = len(x)
-		Cap = cap(x)
-	case *value: // *array
-		a := (*x).(array)
-		Len = len(a)
-		Cap = cap(a)
-	}
-
-	l := 0
-	if lo != nil {
-		l = asInt(lo)
-	}
-
-	h := Len
-	if hi != nil {
-		h = asInt(hi)
-	}
-
-	m := Cap
-	if max != nil {
-		m = asInt(max)
-	}
-
-	switch x := x.(type) {
-	case string:
-		return x[l:h]
-	case []value:
-		return x[l:h:m]
-	case *value: // *array
-		a := (*x).(array)
-		return []value(a)[l:h:m]
-	}
-	panic(fmt.Sprintf("slice: unexpected X type: %T", x))
-}
-
-// lookup returns x[idx] where x is a map or string.
-func lookup(instr *ssa.Lookup, x, idx value) value {
-	switch x := x.(type) { // map or string
-	case map[value]value, *hashmap:
-		var v value
-		var ok bool
-		switch x := x.(type) {
-		case map[value]value:
-			v, ok = x[idx]
-		case *hashmap:
-			v = x.lookup(idx.(hashable))
-			ok = v != nil
-		}
-		if !ok {
-			v = zero(instr.X.Type().Underlying().(*types.Map).Elem())
-		}
-		if instr.CommaOk {
-			v = tuple{v, ok}
-		}
-		return v
-	case string:
-		return x[asInt(idx)]
-	}
-	panic(fmt.Sprintf("unexpected x type in Lookup: %T", x))
-}
-
-// binop implements all arithmetic and logical binary operators for
-// numeric datatypes and strings.  Both operands must have identical
-// dynamic type.
-//
-func binop(op token.Token, t types.Type, x, y value) value {
-	switch op {
-	case token.ADD:
-		switch x.(type) {
-		case int:
-			return x.(int) + y.(int)
-		case int8:
-			return x.(int8) + y.(int8)
-		case int16:
-			return x.(int16) + y.(int16)
-		case int32:
-			return x.(int32) + y.(int32)
-		case int64:
-			return x.(int64) + y.(int64)
-		case uint:
-			return x.(uint) + y.(uint)
-		case uint8:
-			return x.(uint8) + y.(uint8)
-		case uint16:
-			return x.(uint16) + y.(uint16)
-		case uint32:
-			return x.(uint32) + y.(uint32)
-		case uint64:
-			return x.(uint64) + y.(uint64)
-		case uintptr:
-			return x.(uintptr) + y.(uintptr)
-		case float32:
-			return x.(float32) + y.(float32)
-		case float64:
-			return x.(float64) + y.(float64)
-		case complex64:
-			return x.(complex64) + y.(complex64)
-		case complex128:
-			return x.(complex128) + y.(complex128)
-		case string:
-			return x.(string) + y.(string)
-		}
-
-	case token.SUB:
-		switch x.(type) {
-		case int:
-			return x.(int) - y.(int)
-		case int8:
-			return x.(int8) - y.(int8)
-		case int16:
-			return x.(int16) - y.(int16)
-		case int32:
-			return x.(int32) - y.(int32)
-		case int64:
-			return x.(int64) - y.(int64)
-		case uint:
-			return x.(uint) - y.(uint)
-		case uint8:
-			return x.(uint8) - y.(uint8)
-		case uint16:
-			return x.(uint16) - y.(uint16)
-		case uint32:
-			return x.(uint32) - y.(uint32)
-		case uint64:
-			return x.(uint64) - y.(uint64)
-		case uintptr:
-			return x.(uintptr) - y.(uintptr)
-		case float32:
-			return x.(float32) - y.(float32)
-		case float64:
-			return x.(float64) - y.(float64)
-		case complex64:
-			return x.(complex64) - y.(complex64)
-		case complex128:
-			return x.(complex128) - y.(complex128)
-		}
-
-	case token.MUL:
-		switch x.(type) {
-		case int:
-			return x.(int) * y.(int)
-		case int8:
-			return x.(int8) * y.(int8)
-		case int16:
-			return x.(int16) * y.(int16)
-		case int32:
-			return x.(int32) * y.(int32)
-		case int64:
-			return x.(int64) * y.(int64)
-		case uint:
-			return x.(uint) * y.(uint)
-		case uint8:
-			return x.(uint8) * y.(uint8)
-		case uint16:
-			return x.(uint16) * y.(uint16)
-		case uint32:
-			return x.(uint32) * y.(uint32)
-		case uint64:
-			return x.(uint64) * y.(uint64)
-		case uintptr:
-			return x.(uintptr) * y.(uintptr)
-		case float32:
-			return x.(float32) * y.(float32)
-		case float64:
-			return x.(float64) * y.(float64)
-		case complex64:
-			return x.(complex64) * y.(complex64)
-		case complex128:
-			return x.(complex128) * y.(complex128)
-		}
-
-	case token.QUO:
-		switch x.(type) {
-		case int:
-			return x.(int) / y.(int)
-		case int8:
-			return x.(int8) / y.(int8)
-		case int16:
-			return x.(int16) / y.(int16)
-		case int32:
-			return x.(int32) / y.(int32)
-		case int64:
-			return x.(int64) / y.(int64)
-		case uint:
-			return x.(uint) / y.(uint)
-		case uint8:
-			return x.(uint8) / y.(uint8)
-		case uint16:
-			return x.(uint16) / y.(uint16)
-		case uint32:
-			return x.(uint32) / y.(uint32)
-		case uint64:
-			return x.(uint64) / y.(uint64)
-		case uintptr:
-			return x.(uintptr) / y.(uintptr)
-		case float32:
-			return x.(float32) / y.(float32)
-		case float64:
-			return x.(float64) / y.(float64)
-		case complex64:
-			return x.(complex64) / y.(complex64)
-		case complex128:
-			return x.(complex128) / y.(complex128)
-		}
-
-	case token.REM:
-		switch x.(type) {
-		case int:
-			return x.(int) % y.(int)
-		case int8:
-			return x.(int8) % y.(int8)
-		case int16:
-			return x.(int16) % y.(int16)
-		case int32:
-			return x.(int32) % y.(int32)
-		case int64:
-			return x.(int64) % y.(int64)
-		case uint:
-			return x.(uint) % y.(uint)
-		case uint8:
-			return x.(uint8) % y.(uint8)
-		case uint16:
-			return x.(uint16) % y.(uint16)
-		case uint32:
-			return x.(uint32) % y.(uint32)
-		case uint64:
-			return x.(uint64) % y.(uint64)
-		case uintptr:
-			return x.(uintptr) % y.(uintptr)
-		}
-
-	case token.AND:
-		switch x.(type) {
-		case int:
-			return x.(int) & y.(int)
-		case int8:
-			return x.(int8) & y.(int8)
-		case int16:
-			return x.(int16) & y.(int16)
-		case int32:
-			return x.(int32) & y.(int32)
-		case int64:
-			return x.(int64) & y.(int64)
-		case uint:
-			return x.(uint) & y.(uint)
-		case uint8:
-			return x.(uint8) & y.(uint8)
-		case uint16:
-			return x.(uint16) & y.(uint16)
-		case uint32:
-			return x.(uint32) & y.(uint32)
-		case uint64:
-			return x.(uint64) & y.(uint64)
-		case uintptr:
-			return x.(uintptr) & y.(uintptr)
-		}
-
-	case token.OR:
-		switch x.(type) {
-		case int:
-			return x.(int) | y.(int)
-		case int8:
-			return x.(int8) | y.(int8)
-		case int16:
-			return x.(int16) | y.(int16)
-		case int32:
-			return x.(int32) | y.(int32)
-		case int64:
-			return x.(int64) | y.(int64)
-		case uint:
-			return x.(uint) | y.(uint)
-		case uint8:
-			return x.(uint8) | y.(uint8)
-		case uint16:
-			return x.(uint16) | y.(uint16)
-		case uint32:
-			return x.(uint32) | y.(uint32)
-		case uint64:
-			return x.(uint64) | y.(uint64)
-		case uintptr:
-			return x.(uintptr) | y.(uintptr)
-		}
-
-	case token.XOR:
-		switch x.(type) {
-		case int:
-			return x.(int) ^ y.(int)
-		case int8:
-			return x.(int8) ^ y.(int8)
-		case int16:
-			return x.(int16) ^ y.(int16)
-		case int32:
-			return x.(int32) ^ y.(int32)
-		case int64:
-			return x.(int64) ^ y.(int64)
-		case uint:
-			return x.(uint) ^ y.(uint)
-		case uint8:
-			return x.(uint8) ^ y.(uint8)
-		case uint16:
-			return x.(uint16) ^ y.(uint16)
-		case uint32:
-			return x.(uint32) ^ y.(uint32)
-		case uint64:
-			return x.(uint64) ^ y.(uint64)
-		case uintptr:
-			return x.(uintptr) ^ y.(uintptr)
-		}
-
-	case token.AND_NOT:
-		switch x.(type) {
-		case int:
-			return x.(int) &^ y.(int)
-		case int8:
-			return x.(int8) &^ y.(int8)
-		case int16:
-			return x.(int16) &^ y.(int16)
-		case int32:
-			return x.(int32) &^ y.(int32)
-		case int64:
-			return x.(int64) &^ y.(int64)
-		case uint:
-			return x.(uint) &^ y.(uint)
-		case uint8:
-			return x.(uint8) &^ y.(uint8)
-		case uint16:
-			return x.(uint16) &^ y.(uint16)
-		case uint32:
-			return x.(uint32) &^ y.(uint32)
-		case uint64:
-			return x.(uint64) &^ y.(uint64)
-		case uintptr:
-			return x.(uintptr) &^ y.(uintptr)
-		}
-
-	case token.SHL:
-		y := asUint64(y)
-		switch x.(type) {
-		case int:
-			return x.(int) << y
-		case int8:
-			return x.(int8) << y
-		case int16:
-			return x.(int16) << y
-		case int32:
-			return x.(int32) << y
-		case int64:
-			return x.(int64) << y
-		case uint:
-			return x.(uint) << y
-		case uint8:
-			return x.(uint8) << y
-		case uint16:
-			return x.(uint16) << y
-		case uint32:
-			return x.(uint32) << y
-		case uint64:
-			return x.(uint64) << y
-		case uintptr:
-			return x.(uintptr) << y
-		}
-
-	case token.SHR:
-		y := asUint64(y)
-		switch x.(type) {
-		case int:
-			return x.(int) >> y
-		case int8:
-			return x.(int8) >> y
-		case int16:
-			return x.(int16) >> y
-		case int32:
-			return x.(int32) >> y
-		case int64:
-			return x.(int64) >> y
-		case uint:
-			return x.(uint) >> y
-		case uint8:
-			return x.(uint8) >> y
-		case uint16:
-			return x.(uint16) >> y
-		case uint32:
-			return x.(uint32) >> y
-		case uint64:
-			return x.(uint64) >> y
-		case uintptr:
-			return x.(uintptr) >> y
-		}
-
-	case token.LSS:
-		switch x.(type) {
-		case int:
-			return x.(int) < y.(int)
-		case int8:
-			return x.(int8) < y.(int8)
-		case int16:
-			return x.(int16) < y.(int16)
-		case int32:
-			return x.(int32) < y.(int32)
-		case int64:
-			return x.(int64) < y.(int64)
-		case uint:
-			return x.(uint) < y.(uint)
-		case uint8:
-			return x.(uint8) < y.(uint8)
-		case uint16:
-			return x.(uint16) < y.(uint16)
-		case uint32:
-			return x.(uint32) < y.(uint32)
-		case uint64:
-			return x.(uint64) < y.(uint64)
-		case uintptr:
-			return x.(uintptr) < y.(uintptr)
-		case float32:
-			return x.(float32) < y.(float32)
-		case float64:
-			return x.(float64) < y.(float64)
-		case string:
-			return x.(string) < y.(string)
-		}
-
-	case token.LEQ:
-		switch x.(type) {
-		case int:
-			return x.(int) <= y.(int)
-		case int8:
-			return x.(int8) <= y.(int8)
-		case int16:
-			return x.(int16) <= y.(int16)
-		case int32:
-			return x.(int32) <= y.(int32)
-		case int64:
-			return x.(int64) <= y.(int64)
-		case uint:
-			return x.(uint) <= y.(uint)
-		case uint8:
-			return x.(uint8) <= y.(uint8)
-		case uint16:
-			return x.(uint16) <= y.(uint16)
-		case uint32:
-			return x.(uint32) <= y.(uint32)
-		case uint64:
-			return x.(uint64) <= y.(uint64)
-		case uintptr:
-			return x.(uintptr) <= y.(uintptr)
-		case float32:
-			return x.(float32) <= y.(float32)
-		case float64:
-			return x.(float64) <= y.(float64)
-		case string:
-			return x.(string) <= y.(string)
-		}
-
-	case token.EQL:
-		return eqnil(t, x, y)
-
-	case token.NEQ:
-		return !eqnil(t, x, y)
-
-	case token.GTR:
-		switch x.(type) {
-		case int:
-			return x.(int) > y.(int)
-		case int8:
-			return x.(int8) > y.(int8)
-		case int16:
-			return x.(int16) > y.(int16)
-		case int32:
-			return x.(int32) > y.(int32)
-		case int64:
-			return x.(int64) > y.(int64)
-		case uint:
-			return x.(uint) > y.(uint)
-		case uint8:
-			return x.(uint8) > y.(uint8)
-		case uint16:
-			return x.(uint16) > y.(uint16)
-		case uint32:
-			return x.(uint32) > y.(uint32)
-		case uint64:
-			return x.(uint64) > y.(uint64)
-		case uintptr:
-			return x.(uintptr) > y.(uintptr)
-		case float32:
-			return x.(float32) > y.(float32)
-		case float64:
-			return x.(float64) > y.(float64)
-		case string:
-			return x.(string) > y.(string)
-		}
-
-	case token.GEQ:
-		switch x.(type) {
-		case int:
-			return x.(int) >= y.(int)
-		case int8:
-			return x.(int8) >= y.(int8)
-		case int16:
-			return x.(int16) >= y.(int16)
-		case int32:
-			return x.(int32) >= y.(int32)
-		case int64:
-			return x.(int64) >= y.(int64)
-		case uint:
-			return x.(uint) >= y.(uint)
-		case uint8:
-			return x.(uint8) >= y.(uint8)
-		case uint16:
-			return x.(uint16) >= y.(uint16)
-		case uint32:
-			return x.(uint32) >= y.(uint32)
-		case uint64:
-			return x.(uint64) >= y.(uint64)
-		case uintptr:
-			return x.(uintptr) >= y.(uintptr)
-		case float32:
-			return x.(float32) >= y.(float32)
-		case float64:
-			return x.(float64) >= y.(float64)
-		case string:
-			return x.(string) >= y.(string)
-		}
-	}
-	panic(fmt.Sprintf("invalid binary op: %T %s %T", x, op, y))
-}
-
-// eqnil returns the comparison x == y using the equivalence relation
-// appropriate for type t.
-// If t is a reference type, at most one of x or y may be a nil value
-// of that type.
-//
-func eqnil(t types.Type, x, y value) bool {
-	switch t.Underlying().(type) {
-	case *types.Map, *types.Signature, *types.Slice:
-		// Since these types don't support comparison,
-		// one of the operands must be a literal nil.
-		switch x := x.(type) {
-		case *hashmap:
-			return (x != nil) == (y.(*hashmap) != nil)
-		case map[value]value:
-			return (x != nil) == (y.(map[value]value) != nil)
-		case *ssa.Function:
-			switch y := y.(type) {
-			case *ssa.Function:
-				return (x != nil) == (y != nil)
-			case *closure:
-				return true
-			}
-		case *closure:
-			return (x != nil) == (y.(*ssa.Function) != nil)
-		case []value:
-			return (x != nil) == (y.([]value) != nil)
-		}
-		panic(fmt.Sprintf("eqnil(%s): illegal dynamic type: %T", t, x))
-	}
-
-	return equals(t, x, y)
-}
-
-func unop(instr *ssa.UnOp, x value) value {
-	switch instr.Op {
-	case token.ARROW: // receive
-		v, ok := <-x.(chan value)
-		if !ok {
-			v = zero(instr.X.Type().Underlying().(*types.Chan).Elem())
-		}
-		if instr.CommaOk {
-			v = tuple{v, ok}
-		}
-		return v
-	case token.SUB:
-		switch x := x.(type) {
-		case int:
-			return -x
-		case int8:
-			return -x
-		case int16:
-			return -x
-		case int32:
-			return -x
-		case int64:
-			return -x
-		case uint:
-			return -x
-		case uint8:
-			return -x
-		case uint16:
-			return -x
-		case uint32:
-			return -x
-		case uint64:
-			return -x
-		case uintptr:
-			return -x
-		case float32:
-			return -x
-		case float64:
-			return -x
-		case complex64:
-			return -x
-		case complex128:
-			return -x
-		}
-	case token.MUL:
-		return load(deref(instr.X.Type()), x.(*value))
-	case token.NOT:
-		return !x.(bool)
-	case token.XOR:
-		switch x := x.(type) {
-		case int:
-			return ^x
-		case int8:
-			return ^x
-		case int16:
-			return ^x
-		case int32:
-			return ^x
-		case int64:
-			return ^x
-		case uint:
-			return ^x
-		case uint8:
-			return ^x
-		case uint16:
-			return ^x
-		case uint32:
-			return ^x
-		case uint64:
-			return ^x
-		case uintptr:
-			return ^x
-		}
-	}
-	panic(fmt.Sprintf("invalid unary op %s %T", instr.Op, x))
-}
-
-// typeAssert checks whether dynamic type of itf is instr.AssertedType.
-// It returns the extracted value on success, and panics on failure,
-// unless instr.CommaOk, in which case it always returns a "value,ok" tuple.
-//
-func typeAssert(i *interpreter, instr *ssa.TypeAssert, itf iface) value {
-	var v value
-	err := ""
-	if itf.t == nil {
-		err = fmt.Sprintf("interface conversion: interface is nil, not %s", instr.AssertedType)
-
-	} else if idst, ok := instr.AssertedType.Underlying().(*types.Interface); ok {
-		v = itf
-		err = checkInterface(i, idst, itf)
-
-	} else if types.Identical(itf.t, instr.AssertedType) {
-		v = itf.v // extract value
-
-	} else {
-		err = fmt.Sprintf("interface conversion: interface is %s, not %s", itf.t, instr.AssertedType)
-	}
-
-	if err != "" {
-		if !instr.CommaOk {
-			panic(err)
-		}
-		return tuple{zero(instr.AssertedType), false}
-	}
-	if instr.CommaOk {
-		return tuple{v, true}
-	}
-	return v
-}
-
-// If CapturedOutput is non-nil, all writes by the interpreted program
-// to file descriptors 1 and 2 will also be written to CapturedOutput.
-//
-// (The $GOROOT/test system requires that the test be considered a
-// failure if "BUG" appears in the combined stdout/stderr output, even
-// if it exits zero.  This is a global variable shared by all
-// interpreters in the same process.)
-//
-var CapturedOutput *bytes.Buffer
-var capturedOutputMu sync.Mutex
-
-// write writes bytes b to the target program's file descriptor fd.
-// The print/println built-ins and the write() system call funnel
-// through here so they can be captured by the test driver.
-func write(fd int, b []byte) (int, error) {
-	// TODO(adonovan): fix: on Windows, std{out,err} are not 1, 2.
-	if CapturedOutput != nil && (fd == 1 || fd == 2) {
-		capturedOutputMu.Lock()
-		CapturedOutput.Write(b) // ignore errors
-		capturedOutputMu.Unlock()
-	}
-	return syswrite(fd, b)
-}
-
-// callBuiltin interprets a call to builtin fn with arguments args,
-// returning its result.
-func callBuiltin(caller *frame, callpos token.Pos, fn *ssa.Builtin, args []value) value {
-	switch fn.Name() {
-	case "append":
-		if len(args) == 1 {
-			return args[0]
-		}
-		if s, ok := args[1].(string); ok {
-			// append([]byte, ...string) []byte
-			arg0 := args[0].([]value)
-			for i := 0; i < len(s); i++ {
-				arg0 = append(arg0, s[i])
-			}
-			return arg0
-		}
-		// append([]T, ...[]T) []T
-		return append(args[0].([]value), args[1].([]value)...)
-
-	case "copy": // copy([]T, []T) int or copy([]byte, string) int
-		src := args[1]
-		if _, ok := src.(string); ok {
-			params := fn.Type().(*types.Signature).Params()
-			src = conv(params.At(0).Type(), params.At(1).Type(), src)
-		}
-		return copy(args[0].([]value), src.([]value))
-
-	case "close": // close(chan T)
-		close(args[0].(chan value))
-		return nil
-
-	case "delete": // delete(map[K]value, K)
-		switch m := args[0].(type) {
-		case map[value]value:
-			delete(m, args[1])
-		case *hashmap:
-			m.delete(args[1].(hashable))
-		default:
-			panic(fmt.Sprintf("illegal map type: %T", m))
-		}
-		return nil
-
-	case "print", "println": // print(any, ...)
-		ln := fn.Name() == "println"
-		var buf bytes.Buffer
-		for i, arg := range args {
-			if i > 0 && ln {
-				buf.WriteRune(' ')
-			}
-			buf.WriteString(toString(arg))
-		}
-		if ln {
-			buf.WriteRune('\n')
-		}
-		write(1, buf.Bytes())
-		return nil
-
-	case "len":
-		switch x := args[0].(type) {
-		case string:
-			return len(x)
-		case array:
-			return len(x)
-		case *value:
-			return len((*x).(array))
-		case []value:
-			return len(x)
-		case map[value]value:
-			return len(x)
-		case *hashmap:
-			return x.len()
-		case chan value:
-			return len(x)
-		default:
-			panic(fmt.Sprintf("len: illegal operand: %T", x))
-		}
-
-	case "cap":
-		switch x := args[0].(type) {
-		case array:
-			return cap(x)
-		case *value:
-			return cap((*x).(array))
-		case []value:
-			return cap(x)
-		case chan value:
-			return cap(x)
-		default:
-			panic(fmt.Sprintf("cap: illegal operand: %T", x))
-		}
-
-	case "real":
-		switch c := args[0].(type) {
-		case complex64:
-			return real(c)
-		case complex128:
-			return real(c)
-		default:
-			panic(fmt.Sprintf("real: illegal operand: %T", c))
-		}
-
-	case "imag":
-		switch c := args[0].(type) {
-		case complex64:
-			return imag(c)
-		case complex128:
-			return imag(c)
-		default:
-			panic(fmt.Sprintf("imag: illegal operand: %T", c))
-		}
-
-	case "complex":
-		switch f := args[0].(type) {
-		case float32:
-			return complex(f, args[1].(float32))
-		case float64:
-			return complex(f, args[1].(float64))
-		default:
-			panic(fmt.Sprintf("complex: illegal operand: %T", f))
-		}
-
-	case "panic":
-		// ssa.Panic handles most cases; this is only for "go
-		// panic" or "defer panic".
-		panic(targetPanic{args[0]})
-
-	case "recover":
-		return doRecover(caller)
-
-	case "ssa:wrapnilchk":
-		recv := args[0]
-		if recv.(*value) == nil {
-			recvType := args[1]
-			methodName := args[2]
-			panic(fmt.Sprintf("value method (%s).%s called using nil *%s pointer",
-				recvType, methodName, recvType))
-		}
-		return recv
-	}
-
-	panic("unknown built-in: " + fn.Name())
-}
-
-func rangeIter(x value, t types.Type) iter {
-	switch x := x.(type) {
-	case map[value]value:
-		// TODO(adonovan): fix: leaks goroutines and channels
-		// on each incomplete map iteration.  We need to open
-		// up an iteration interface using the
-		// reflect.(Value).MapKeys machinery.
-		it := make(mapIter)
-		go func() {
-			for k, v := range x {
-				it <- [2]value{k, v}
-			}
-			close(it)
-		}()
-		return it
-	case *hashmap:
-		// TODO(adonovan): fix: leaks goroutines and channels
-		// on each incomplete map iteration.  We need to open
-		// up an iteration interface using the
-		// reflect.(Value).MapKeys machinery.
-		it := make(mapIter)
-		go func() {
-			for _, e := range x.table {
-				for e != nil {
-					it <- [2]value{e.key, e.value}
-					e = e.next
-				}
-			}
-			close(it)
-		}()
-		return it
-	case string:
-		return &stringIter{Reader: strings.NewReader(x)}
-	}
-	panic(fmt.Sprintf("cannot range over %T", x))
-}
-
-// widen widens a basic typed value x to the widest type of its
-// category, one of:
-//   bool, int64, uint64, float64, complex128, string.
-// This is inefficient but reduces the size of the cross-product of
-// cases we have to consider.
-//
-func widen(x value) value {
-	switch y := x.(type) {
-	case bool, int64, uint64, float64, complex128, string, unsafe.Pointer:
-		return x
-	case int:
-		return int64(y)
-	case int8:
-		return int64(y)
-	case int16:
-		return int64(y)
-	case int32:
-		return int64(y)
-	case uint:
-		return uint64(y)
-	case uint8:
-		return uint64(y)
-	case uint16:
-		return uint64(y)
-	case uint32:
-		return uint64(y)
-	case uintptr:
-		return uint64(y)
-	case float32:
-		return float64(y)
-	case complex64:
-		return complex128(y)
-	}
-	panic(fmt.Sprintf("cannot widen %T", x))
-}
-
-// conv converts the value x of type t_src to type t_dst and returns
-// the result.
-// Possible cases are described with the ssa.Convert operator.
-//
-func conv(t_dst, t_src types.Type, x value) value {
-	ut_src := t_src.Underlying()
-	ut_dst := t_dst.Underlying()
-
-	// Destination type is not an "untyped" type.
-	if b, ok := ut_dst.(*types.Basic); ok && b.Info()&types.IsUntyped != 0 {
-		panic("oops: conversion to 'untyped' type: " + b.String())
-	}
-
-	// Nor is it an interface type.
-	if _, ok := ut_dst.(*types.Interface); ok {
-		if _, ok := ut_src.(*types.Interface); ok {
-			panic("oops: Convert should be ChangeInterface")
-		} else {
-			panic("oops: Convert should be MakeInterface")
-		}
-	}
-
-	// Remaining conversions:
-	//    + untyped string/number/bool constant to a specific
-	//      representation.
-	//    + conversions between non-complex numeric types.
-	//    + conversions between complex numeric types.
-	//    + integer/[]byte/[]rune -> string.
-	//    + string -> []byte/[]rune.
-	//
-	// All are treated the same: first we extract the value to the
-	// widest representation (int64, uint64, float64, complex128,
-	// or string), then we convert it to the desired type.
-
-	switch ut_src := ut_src.(type) {
-	case *types.Pointer:
-		switch ut_dst := ut_dst.(type) {
-		case *types.Basic:
-			// *value to unsafe.Pointer?
-			if ut_dst.Kind() == types.UnsafePointer {
-				return unsafe.Pointer(x.(*value))
-			}
-		}
-
-	case *types.Slice:
-		// []byte or []rune -> string
-		// TODO(adonovan): fix: type B byte; conv([]B -> string).
-		switch ut_src.Elem().(*types.Basic).Kind() {
-		case types.Byte:
-			x := x.([]value)
-			b := make([]byte, 0, len(x))
-			for i := range x {
-				b = append(b, x[i].(byte))
-			}
-			return string(b)
-
-		case types.Rune:
-			x := x.([]value)
-			r := make([]rune, 0, len(x))
-			for i := range x {
-				r = append(r, x[i].(rune))
-			}
-			return string(r)
-		}
-
-	case *types.Basic:
-		x = widen(x)
-
-		// integer -> string?
-		// TODO(adonovan): fix: test integer -> named alias of string.
-		if ut_src.Info()&types.IsInteger != 0 {
-			if ut_dst, ok := ut_dst.(*types.Basic); ok && ut_dst.Kind() == types.String {
-				return string(asInt(x))
-			}
-		}
-
-		// string -> []rune, []byte or string?
-		if s, ok := x.(string); ok {
-			switch ut_dst := ut_dst.(type) {
-			case *types.Slice:
-				var res []value
-				// TODO(adonovan): fix: test named alias of rune, byte.
-				switch ut_dst.Elem().(*types.Basic).Kind() {
-				case types.Rune:
-					for _, r := range []rune(s) {
-						res = append(res, r)
-					}
-					return res
-				case types.Byte:
-					for _, b := range []byte(s) {
-						res = append(res, b)
-					}
-					return res
-				}
-			case *types.Basic:
-				if ut_dst.Kind() == types.String {
-					return x.(string)
-				}
-			}
-			break // fail: no other conversions for string
-		}
-
-		// unsafe.Pointer -> *value
-		if ut_src.Kind() == types.UnsafePointer {
-			// TODO(adonovan): this is wrong and cannot
-			// really be fixed with the current design.
-			//
-			// return (*value)(x.(unsafe.Pointer))
-			// creates a new pointer of a different
-			// type but the underlying interface value
-			// knows its "true" type and so cannot be
-			// meaningfully used through the new pointer.
-			//
-			// To make this work, the interpreter needs to
-			// simulate the memory layout of a real
-			// compiled implementation.
-			//
-			// To at least preserve type-safety, we'll
-			// just return the zero value of the
-			// destination type.
-			return zero(t_dst)
-		}
-
-		// Conversions between complex numeric types?
-		if ut_src.Info()&types.IsComplex != 0 {
-			switch ut_dst.(*types.Basic).Kind() {
-			case types.Complex64:
-				return complex64(x.(complex128))
-			case types.Complex128:
-				return x.(complex128)
-			}
-			break // fail: no other conversions for complex
-		}
-
-		// Conversions between non-complex numeric types?
-		if ut_src.Info()&types.IsNumeric != 0 {
-			kind := ut_dst.(*types.Basic).Kind()
-			switch x := x.(type) {
-			case int64: // signed integer -> numeric?
-				switch kind {
-				case types.Int:
-					return int(x)
-				case types.Int8:
-					return int8(x)
-				case types.Int16:
-					return int16(x)
-				case types.Int32:
-					return int32(x)
-				case types.Int64:
-					return int64(x)
-				case types.Uint:
-					return uint(x)
-				case types.Uint8:
-					return uint8(x)
-				case types.Uint16:
-					return uint16(x)
-				case types.Uint32:
-					return uint32(x)
-				case types.Uint64:
-					return uint64(x)
-				case types.Uintptr:
-					return uintptr(x)
-				case types.Float32:
-					return float32(x)
-				case types.Float64:
-					return float64(x)
-				}
-
-			case uint64: // unsigned integer -> numeric?
-				switch kind {
-				case types.Int:
-					return int(x)
-				case types.Int8:
-					return int8(x)
-				case types.Int16:
-					return int16(x)
-				case types.Int32:
-					return int32(x)
-				case types.Int64:
-					return int64(x)
-				case types.Uint:
-					return uint(x)
-				case types.Uint8:
-					return uint8(x)
-				case types.Uint16:
-					return uint16(x)
-				case types.Uint32:
-					return uint32(x)
-				case types.Uint64:
-					return uint64(x)
-				case types.Uintptr:
-					return uintptr(x)
-				case types.Float32:
-					return float32(x)
-				case types.Float64:
-					return float64(x)
-				}
-
-			case float64: // floating point -> numeric?
-				switch kind {
-				case types.Int:
-					return int(x)
-				case types.Int8:
-					return int8(x)
-				case types.Int16:
-					return int16(x)
-				case types.Int32:
-					return int32(x)
-				case types.Int64:
-					return int64(x)
-				case types.Uint:
-					return uint(x)
-				case types.Uint8:
-					return uint8(x)
-				case types.Uint16:
-					return uint16(x)
-				case types.Uint32:
-					return uint32(x)
-				case types.Uint64:
-					return uint64(x)
-				case types.Uintptr:
-					return uintptr(x)
-				case types.Float32:
-					return float32(x)
-				case types.Float64:
-					return float64(x)
-				}
-			}
-		}
-	}
-
-	panic(fmt.Sprintf("unsupported conversion: %s  -> %s, dynamic type %T", t_src, t_dst, x))
-}
-
-// checkInterface checks that the method set of x implements the
-// interface itype.
-// On success it returns "", on failure, an error message.
-//
-func checkInterface(i *interpreter, itype *types.Interface, x iface) string {
-	if meth, _ := types.MissingMethod(x.t, itype, true); meth != nil {
-		return fmt.Sprintf("interface conversion: %v is not %v: missing method %s",
-			x.t, itype, meth.Name())
-	}
-	return "" // ok
-}
diff --git a/third_party/gotools/go/ssa/interp/reflect.go b/third_party/gotools/go/ssa/interp/reflect.go
deleted file mode 100644
index 9a3ebc7..0000000
--- a/third_party/gotools/go/ssa/interp/reflect.go
+++ /dev/null
@@ -1,548 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-// Emulated "reflect" package.
-//
-// We completely replace the built-in "reflect" package.
-// The only thing clients can depend upon are that reflect.Type is an
-// interface and reflect.Value is an (opaque) struct.
-
-import (
-	"fmt"
-	"go/token"
-	"reflect"
-	"unsafe"
-
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-type opaqueType struct {
-	types.Type
-	name string
-}
-
-func (t *opaqueType) String() string { return t.name }
-
-// A bogus "reflect" type-checker package.  Shared across interpreters.
-var reflectTypesPackage = types.NewPackage("reflect", "reflect")
-
-// rtype is the concrete type the interpreter uses to implement the
-// reflect.Type interface.
-//
-// type rtype <opaque>
-var rtypeType = makeNamedType("rtype", &opaqueType{nil, "rtype"})
-
-// error is an (interpreted) named type whose underlying type is string.
-// The interpreter uses it for all implementations of the built-in error
-// interface that it creates.
-// We put it in the "reflect" package for expedience.
-//
-// type error string
-var errorType = makeNamedType("error", &opaqueType{nil, "error"})
-
-func makeNamedType(name string, underlying types.Type) *types.Named {
-	obj := types.NewTypeName(token.NoPos, reflectTypesPackage, name, nil)
-	return types.NewNamed(obj, underlying, nil)
-}
-
-func makeReflectValue(t types.Type, v value) value {
-	return structure{rtype{t}, v}
-}
-
-// Given a reflect.Value, returns its rtype.
-func rV2T(v value) rtype {
-	return v.(structure)[0].(rtype)
-}
-
-// Given a reflect.Value, returns the underlying interpreter value.
-func rV2V(v value) value {
-	return v.(structure)[1]
-}
-
-// makeReflectType boxes up an rtype in a reflect.Type interface.
-func makeReflectType(rt rtype) value {
-	return iface{rtypeType, rt}
-}
-
-func ext۰reflect۰Init(fr *frame, args []value) value {
-	// Signature: func()
-	return nil
-}
-
-func ext۰reflect۰rtype۰Bits(fr *frame, args []value) value {
-	// Signature: func (t reflect.rtype) int
-	rt := args[0].(rtype).t
-	basic, ok := rt.Underlying().(*types.Basic)
-	if !ok {
-		panic(fmt.Sprintf("reflect.Type.Bits(%T): non-basic type", rt))
-	}
-	return int(fr.i.sizes.Sizeof(basic)) * 8
-}
-
-func ext۰reflect۰rtype۰Elem(fr *frame, args []value) value {
-	// Signature: func (t reflect.rtype) reflect.Type
-	return makeReflectType(rtype{args[0].(rtype).t.Underlying().(interface {
-		Elem() types.Type
-	}).Elem()})
-}
-
-func ext۰reflect۰rtype۰Field(fr *frame, args []value) value {
-	// Signature: func (t reflect.rtype, i int) reflect.StructField
-	st := args[0].(rtype).t.Underlying().(*types.Struct)
-	i := args[1].(int)
-	f := st.Field(i)
-	return structure{
-		f.Name(),
-		f.Pkg().Path(),
-		makeReflectType(rtype{f.Type()}),
-		st.Tag(i),
-		0,         // TODO(adonovan): offset
-		[]value{}, // TODO(adonovan): indices
-		f.Anonymous(),
-	}
-}
-
-func ext۰reflect۰rtype۰Kind(fr *frame, args []value) value {
-	// Signature: func (t reflect.rtype) uint
-	return uint(reflectKind(args[0].(rtype).t))
-}
-
-func ext۰reflect۰rtype۰NumField(fr *frame, args []value) value {
-	// Signature: func (t reflect.rtype) int
-	return args[0].(rtype).t.Underlying().(*types.Struct).NumFields()
-}
-
-func ext۰reflect۰rtype۰NumMethod(fr *frame, args []value) value {
-	// Signature: func (t reflect.rtype) int
-	return fr.i.prog.MethodSets.MethodSet(args[0].(rtype).t).Len()
-}
-
-func ext۰reflect۰rtype۰NumOut(fr *frame, args []value) value {
-	// Signature: func (t reflect.rtype) int
-	return args[0].(rtype).t.(*types.Signature).Results().Len()
-}
-
-func ext۰reflect۰rtype۰Out(fr *frame, args []value) value {
-	// Signature: func (t reflect.rtype, i int) int
-	i := args[1].(int)
-	return makeReflectType(rtype{args[0].(rtype).t.(*types.Signature).Results().At(i).Type()})
-}
-
-func ext۰reflect۰rtype۰Size(fr *frame, args []value) value {
-	// Signature: func (t reflect.rtype) uintptr
-	return uintptr(fr.i.sizes.Sizeof(args[0].(rtype).t))
-}
-
-func ext۰reflect۰rtype۰String(fr *frame, args []value) value {
-	// Signature: func (t reflect.rtype) string
-	return args[0].(rtype).t.String()
-}
-
-func ext۰reflect۰New(fr *frame, args []value) value {
-	// Signature: func (t reflect.Type) reflect.Value
-	t := args[0].(iface).v.(rtype).t
-	alloc := zero(t)
-	return makeReflectValue(types.NewPointer(t), &alloc)
-}
-
-func ext۰reflect۰SliceOf(fr *frame, args []value) value {
-	// Signature: func (t reflect.rtype) Type
-	return makeReflectType(rtype{types.NewSlice(args[0].(iface).v.(rtype).t)})
-}
-
-func ext۰reflect۰TypeOf(fr *frame, args []value) value {
-	// Signature: func (t reflect.rtype) Type
-	return makeReflectType(rtype{args[0].(iface).t})
-}
-
-func ext۰reflect۰ValueOf(fr *frame, args []value) value {
-	// Signature: func (interface{}) reflect.Value
-	itf := args[0].(iface)
-	return makeReflectValue(itf.t, itf.v)
-}
-
-func reflectKind(t types.Type) reflect.Kind {
-	switch t := t.(type) {
-	case *types.Named:
-		return reflectKind(t.Underlying())
-	case *types.Basic:
-		switch t.Kind() {
-		case types.Bool:
-			return reflect.Bool
-		case types.Int:
-			return reflect.Int
-		case types.Int8:
-			return reflect.Int8
-		case types.Int16:
-			return reflect.Int16
-		case types.Int32:
-			return reflect.Int32
-		case types.Int64:
-			return reflect.Int64
-		case types.Uint:
-			return reflect.Uint
-		case types.Uint8:
-			return reflect.Uint8
-		case types.Uint16:
-			return reflect.Uint16
-		case types.Uint32:
-			return reflect.Uint32
-		case types.Uint64:
-			return reflect.Uint64
-		case types.Uintptr:
-			return reflect.Uintptr
-		case types.Float32:
-			return reflect.Float32
-		case types.Float64:
-			return reflect.Float64
-		case types.Complex64:
-			return reflect.Complex64
-		case types.Complex128:
-			return reflect.Complex128
-		case types.String:
-			return reflect.String
-		case types.UnsafePointer:
-			return reflect.UnsafePointer
-		}
-	case *types.Array:
-		return reflect.Array
-	case *types.Chan:
-		return reflect.Chan
-	case *types.Signature:
-		return reflect.Func
-	case *types.Interface:
-		return reflect.Interface
-	case *types.Map:
-		return reflect.Map
-	case *types.Pointer:
-		return reflect.Ptr
-	case *types.Slice:
-		return reflect.Slice
-	case *types.Struct:
-		return reflect.Struct
-	}
-	panic(fmt.Sprint("unexpected type: ", t))
-}
-
-func ext۰reflect۰Value۰Kind(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) uint
-	return uint(reflectKind(rV2T(args[0]).t))
-}
-
-func ext۰reflect۰Value۰String(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) string
-	return toString(rV2V(args[0]))
-}
-
-func ext۰reflect۰Value۰Type(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) reflect.Type
-	return makeReflectType(rV2T(args[0]))
-}
-
-func ext۰reflect۰Value۰Uint(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) uint64
-	switch v := rV2V(args[0]).(type) {
-	case uint:
-		return uint64(v)
-	case uint8:
-		return uint64(v)
-	case uint16:
-		return uint64(v)
-	case uint32:
-		return uint64(v)
-	case uint64:
-		return uint64(v)
-	case uintptr:
-		return uint64(v)
-	}
-	panic("reflect.Value.Uint")
-}
-
-func ext۰reflect۰Value۰Len(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) int
-	switch v := rV2V(args[0]).(type) {
-	case string:
-		return len(v)
-	case array:
-		return len(v)
-	case chan value:
-		return cap(v)
-	case []value:
-		return len(v)
-	case *hashmap:
-		return v.len()
-	case map[value]value:
-		return len(v)
-	default:
-		panic(fmt.Sprintf("reflect.(Value).Len(%v)", v))
-	}
-}
-
-func ext۰reflect۰Value۰MapIndex(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) Value
-	tValue := rV2T(args[0]).t.Underlying().(*types.Map).Key()
-	k := rV2V(args[1])
-	switch m := rV2V(args[0]).(type) {
-	case map[value]value:
-		if v, ok := m[k]; ok {
-			return makeReflectValue(tValue, v)
-		}
-
-	case *hashmap:
-		if v := m.lookup(k.(hashable)); v != nil {
-			return makeReflectValue(tValue, v)
-		}
-
-	default:
-		panic(fmt.Sprintf("(reflect.Value).MapIndex(%T, %T)", m, k))
-	}
-	return makeReflectValue(nil, nil)
-}
-
-func ext۰reflect۰Value۰MapKeys(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) []Value
-	var keys []value
-	tKey := rV2T(args[0]).t.Underlying().(*types.Map).Key()
-	switch v := rV2V(args[0]).(type) {
-	case map[value]value:
-		for k := range v {
-			keys = append(keys, makeReflectValue(tKey, k))
-		}
-
-	case *hashmap:
-		for _, e := range v.table {
-			for ; e != nil; e = e.next {
-				keys = append(keys, makeReflectValue(tKey, e.key))
-			}
-		}
-
-	default:
-		panic(fmt.Sprintf("(reflect.Value).MapKeys(%T)", v))
-	}
-	return keys
-}
-
-func ext۰reflect۰Value۰NumField(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) int
-	return len(rV2V(args[0]).(structure))
-}
-
-func ext۰reflect۰Value۰NumMethod(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) int
-	return fr.i.prog.MethodSets.MethodSet(rV2T(args[0]).t).Len()
-}
-
-func ext۰reflect۰Value۰Pointer(fr *frame, args []value) value {
-	// Signature: func (v reflect.Value) uintptr
-	switch v := rV2V(args[0]).(type) {
-	case *value:
-		return uintptr(unsafe.Pointer(v))
-	case chan value:
-		return reflect.ValueOf(v).Pointer()
-	case []value:
-		return reflect.ValueOf(v).Pointer()
-	case *hashmap:
-		return reflect.ValueOf(v.table).Pointer()
-	case map[value]value:
-		return reflect.ValueOf(v).Pointer()
-	case *ssa.Function:
-		return uintptr(unsafe.Pointer(v))
-	case *closure:
-		return uintptr(unsafe.Pointer(v))
-	default:
-		panic(fmt.Sprintf("reflect.(Value).Pointer(%T)", v))
-	}
-}
-
-func ext۰reflect۰Value۰Index(fr *frame, args []value) value {
-	// Signature: func (v reflect.Value, i int) Value
-	i := args[1].(int)
-	t := rV2T(args[0]).t.Underlying()
-	switch v := rV2V(args[0]).(type) {
-	case array:
-		return makeReflectValue(t.(*types.Array).Elem(), v[i])
-	case []value:
-		return makeReflectValue(t.(*types.Slice).Elem(), v[i])
-	default:
-		panic(fmt.Sprintf("reflect.(Value).Index(%T)", v))
-	}
-}
-
-func ext۰reflect۰Value۰Bool(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) bool
-	return rV2V(args[0]).(bool)
-}
-
-func ext۰reflect۰Value۰CanAddr(fr *frame, args []value) value {
-	// Signature: func (v reflect.Value) bool
-	// Always false for our representation.
-	return false
-}
-
-func ext۰reflect۰Value۰CanInterface(fr *frame, args []value) value {
-	// Signature: func (v reflect.Value) bool
-	// Always true for our representation.
-	return true
-}
-
-func ext۰reflect۰Value۰Elem(fr *frame, args []value) value {
-	// Signature: func (v reflect.Value) reflect.Value
-	switch x := rV2V(args[0]).(type) {
-	case iface:
-		return makeReflectValue(x.t, x.v)
-	case *value:
-		return makeReflectValue(rV2T(args[0]).t.Underlying().(*types.Pointer).Elem(), *x)
-	default:
-		panic(fmt.Sprintf("reflect.(Value).Elem(%T)", x))
-	}
-}
-
-func ext۰reflect۰Value۰Field(fr *frame, args []value) value {
-	// Signature: func (v reflect.Value, i int) reflect.Value
-	v := args[0]
-	i := args[1].(int)
-	return makeReflectValue(rV2T(v).t.Underlying().(*types.Struct).Field(i).Type(), rV2V(v).(structure)[i])
-}
-
-func ext۰reflect۰Value۰Float(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) float64
-	switch v := rV2V(args[0]).(type) {
-	case float32:
-		return float64(v)
-	case float64:
-		return float64(v)
-	}
-	panic("reflect.Value.Float")
-}
-
-func ext۰reflect۰Value۰Interface(fr *frame, args []value) value {
-	// Signature: func (v reflect.Value) interface{}
-	return ext۰reflect۰valueInterface(fr, args)
-}
-
-func ext۰reflect۰Value۰Int(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) int64
-	switch x := rV2V(args[0]).(type) {
-	case int:
-		return int64(x)
-	case int8:
-		return int64(x)
-	case int16:
-		return int64(x)
-	case int32:
-		return int64(x)
-	case int64:
-		return x
-	default:
-		panic(fmt.Sprintf("reflect.(Value).Int(%T)", x))
-	}
-}
-
-func ext۰reflect۰Value۰IsNil(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) bool
-	switch x := rV2V(args[0]).(type) {
-	case *value:
-		return x == nil
-	case chan value:
-		return x == nil
-	case map[value]value:
-		return x == nil
-	case *hashmap:
-		return x == nil
-	case iface:
-		return x.t == nil
-	case []value:
-		return x == nil
-	case *ssa.Function:
-		return x == nil
-	case *ssa.Builtin:
-		return x == nil
-	case *closure:
-		return x == nil
-	default:
-		panic(fmt.Sprintf("reflect.(Value).IsNil(%T)", x))
-	}
-}
-
-func ext۰reflect۰Value۰IsValid(fr *frame, args []value) value {
-	// Signature: func (reflect.Value) bool
-	return rV2V(args[0]) != nil
-}
-
-func ext۰reflect۰Value۰Set(fr *frame, args []value) value {
-	// TODO(adonovan): implement.
-	return nil
-}
-
-func ext۰reflect۰valueInterface(fr *frame, args []value) value {
-	// Signature: func (v reflect.Value, safe bool) interface{}
-	v := args[0].(structure)
-	return iface{rV2T(v).t, rV2V(v)}
-}
-
-func ext۰reflect۰error۰Error(fr *frame, args []value) value {
-	return args[0]
-}
-
-// newMethod creates a new method of the specified name, package and receiver type.
-func newMethod(pkg *ssa.Package, recvType types.Type, name string) *ssa.Function {
-	// TODO(adonovan): fix: hack: currently the only part of Signature
-	// that is needed is the "pointerness" of Recv.Type, and for
-	// now, we'll set it to always be false since we're only
-	// concerned with rtype.  Encapsulate this better.
-	sig := types.NewSignature(nil, types.NewVar(token.NoPos, nil, "recv", recvType), nil, nil, false)
-	fn := pkg.Prog.NewFunction(name, sig, "fake reflect method")
-	fn.Pkg = pkg
-	return fn
-}
-
-func initReflect(i *interpreter) {
-	i.reflectPackage = &ssa.Package{
-		Prog:    i.prog,
-		Object:  reflectTypesPackage,
-		Members: make(map[string]ssa.Member),
-	}
-
-	// Clobber the type-checker's notion of reflect.Value's
-	// underlying type so that it more closely matches the fake one
-	// (at least in the number of fields---we lie about the type of
-	// the rtype field).
-	//
-	// We must ensure that calls to (ssa.Value).Type() return the
-	// fake type so that correct "shape" is used when allocating
-	// variables, making zero values, loading, and storing.
-	//
-	// TODO(adonovan): obviously this is a hack.  We need a cleaner
-	// way to fake the reflect package (almost---DeepEqual is fine).
-	// One approach would be not to even load its source code, but
-	// provide fake source files.  This would guarantee that no bad
-	// information leaks into other packages.
-	if r := i.prog.ImportedPackage("reflect"); r != nil {
-		rV := r.Object.Scope().Lookup("Value").Type().(*types.Named)
-		tEface := types.NewInterface(nil, nil).Complete()
-		rV.SetUnderlying(types.NewStruct([]*types.Var{
-			types.NewField(token.NoPos, r.Object, "t", tEface, false), // a lie
-			types.NewField(token.NoPos, r.Object, "v", tEface, false),
-		}, nil))
-	}
-
-	i.rtypeMethods = methodSet{
-		"Bits":      newMethod(i.reflectPackage, rtypeType, "Bits"),
-		"Elem":      newMethod(i.reflectPackage, rtypeType, "Elem"),
-		"Field":     newMethod(i.reflectPackage, rtypeType, "Field"),
-		"Kind":      newMethod(i.reflectPackage, rtypeType, "Kind"),
-		"NumField":  newMethod(i.reflectPackage, rtypeType, "NumField"),
-		"NumMethod": newMethod(i.reflectPackage, rtypeType, "NumMethod"),
-		"NumOut":    newMethod(i.reflectPackage, rtypeType, "NumOut"),
-		"Out":       newMethod(i.reflectPackage, rtypeType, "Out"),
-		"Size":      newMethod(i.reflectPackage, rtypeType, "Size"),
-		"String":    newMethod(i.reflectPackage, rtypeType, "String"),
-	}
-	i.errorMethods = methodSet{
-		"Error": newMethod(i.reflectPackage, errorType, "Error"),
-	}
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/a_test.go b/third_party/gotools/go/ssa/interp/testdata/a_test.go
deleted file mode 100644
index 844ec5c..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/a_test.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package a
-
-import "testing"
-
-func TestFoo(t *testing.T) {
-	t.Error("foo")
-}
-
-func TestBar(t *testing.T) {
-	t.Error("bar")
-}
-
-func BenchmarkWiz(b *testing.B) {
-	b.Error("wiz")
-}
-
-// Don't test Examples since that testing package needs pipe(2) for that.
diff --git a/third_party/gotools/go/ssa/interp/testdata/b_test.go b/third_party/gotools/go/ssa/interp/testdata/b_test.go
deleted file mode 100644
index 4a30e96..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/b_test.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package b
-
-import "testing"
-
-func NotATest(t *testing.T) {
-	t.Error("foo")
-}
-
-func NotABenchmark(b *testing.B) {
-	b.Error("wiz")
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/boundmeth.go b/third_party/gotools/go/ssa/interp/testdata/boundmeth.go
deleted file mode 100644
index 255cc60..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/boundmeth.go
+++ /dev/null
@@ -1,144 +0,0 @@
-// Tests of bound method closures.
-
-package main
-
-import "fmt"
-
-func assert(b bool) {
-	if !b {
-		panic("oops")
-	}
-}
-
-type I int
-
-func (i I) add(x int) int {
-	return int(i) + x
-}
-
-func valueReceiver() {
-	var three I = 3
-	assert(three.add(5) == 8)
-	var add3 func(int) int = three.add
-	assert(add3(5) == 8)
-}
-
-type S struct{ x int }
-
-func (s *S) incr() {
-	s.x++
-}
-
-func (s *S) get() int {
-	return s.x
-}
-
-func pointerReceiver() {
-	ps := new(S)
-	incr := ps.incr
-	get := ps.get
-	assert(get() == 0)
-	incr()
-	incr()
-	incr()
-	assert(get() == 3)
-}
-
-func addressibleValuePointerReceiver() {
-	var s S
-	incr := s.incr
-	get := s.get
-	assert(get() == 0)
-	incr()
-	incr()
-	incr()
-	assert(get() == 3)
-}
-
-type S2 struct {
-	S
-}
-
-func promotedReceiver() {
-	var s2 S2
-	incr := s2.incr
-	get := s2.get
-	assert(get() == 0)
-	incr()
-	incr()
-	incr()
-	assert(get() == 3)
-}
-
-func anonStruct() {
-	var s struct{ S }
-	incr := s.incr
-	get := s.get
-	assert(get() == 0)
-	incr()
-	incr()
-	incr()
-	assert(get() == 3)
-}
-
-func typeCheck() {
-	var i interface{}
-	i = (*S).incr
-	_ = i.(func(*S)) // type assertion: receiver type prepended to params
-
-	var s S
-	i = s.incr
-	_ = i.(func()) // type assertion: receiver type disappears
-}
-
-type errString string
-
-func (err errString) Error() string {
-	return string(err)
-}
-
-// Regression test for a builder crash.
-func regress1(x error) func() string {
-	return x.Error
-}
-
-// Regression test for b/7269:
-// taking the value of an interface method performs a nil check.
-func nilInterfaceMethodValue() {
-	err := fmt.Errorf("ok")
-	f := err.Error
-	if got := f(); got != "ok" {
-		panic(got)
-	}
-
-	err = nil
-	if got := f(); got != "ok" {
-		panic(got)
-	}
-
-	defer func() {
-		r := fmt.Sprint(recover())
-		// runtime panic string varies across toolchains
-		if r != "runtime error: interface conversion: interface is nil, not error" &&
-			r != "runtime error: invalid memory address or nil pointer dereference" {
-			panic("want runtime panic from nil interface method value, got " + r)
-		}
-	}()
-	f = err.Error // runtime panic: err is nil
-	panic("unreachable")
-}
-
-func main() {
-	valueReceiver()
-	pointerReceiver()
-	addressibleValuePointerReceiver()
-	promotedReceiver()
-	anonStruct()
-	typeCheck()
-
-	if e := regress1(errString("hi"))(); e != "hi" {
-		panic(e)
-	}
-
-	nilInterfaceMethodValue()
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/callstack.go b/third_party/gotools/go/ssa/interp/testdata/callstack.go
deleted file mode 100644
index 56f3b28..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/callstack.go
+++ /dev/null
@@ -1,52 +0,0 @@
-package main
-
-import (
-	"fmt"
-	"path"
-	"runtime"
-	"strings"
-)
-
-var stack string
-
-func f() {
-	pc := make([]uintptr, 6)
-	pc = pc[:runtime.Callers(1, pc)]
-	for _, f := range pc {
-		Func := runtime.FuncForPC(f)
-		name := Func.Name()
-		if strings.Contains(name, "$") || strings.Contains(name, ".func") {
-			name = "func" // anon funcs vary across toolchains
-		}
-		file, line := Func.FileLine(0)
-		stack += fmt.Sprintf("%s at %s:%d\n", name, path.Base(file), line)
-	}
-}
-
-func g() { f() }
-func h() { g() }
-func i() { func() { h() }() }
-
-// Hack: the 'func' and the call to Caller are on the same line,
-// to paper over differences between toolchains.
-// (The interpreter's location info isn't yet complete.)
-func runtimeCaller0() (uintptr, string, int, bool) { return runtime.Caller(0) }
-
-func main() {
-	i()
-	if stack != `main.f at callstack.go:12
-main.g at callstack.go:26
-main.h at callstack.go:27
-func at callstack.go:28
-main.i at callstack.go:28
-main.main at callstack.go:35
-` {
-		panic("unexpected stack: " + stack)
-	}
-
-	pc, file, line, _ := runtimeCaller0()
-	got := fmt.Sprintf("%s @ %s:%d", runtime.FuncForPC(pc).Name(), path.Base(file), line)
-	if got != "main.runtimeCaller0 @ callstack.go:33" {
-		panic("runtime.Caller: " + got)
-	}
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/complit.go b/third_party/gotools/go/ssa/interp/testdata/complit.go
deleted file mode 100644
index 02f9916..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/complit.go
+++ /dev/null
@@ -1,168 +0,0 @@
-package main
-
-// Tests of composite literals.
-
-import "fmt"
-
-// Map literals.
-func init() {
-	type M map[int]int
-	m1 := []*M{{1: 1}, &M{2: 2}}
-	want := "map[1:1] map[2:2]"
-	if got := fmt.Sprint(*m1[0], *m1[1]); got != want {
-		panic(got)
-	}
-	m2 := []M{{1: 1}, M{2: 2}}
-	if got := fmt.Sprint(m2[0], m2[1]); got != want {
-		panic(got)
-	}
-}
-
-// Nonliteral keys in composite literal.
-func init() {
-	const zero int = 1
-	var v = []int{1 + zero: 42}
-	if x := fmt.Sprint(v); x != "[0 0 42]" {
-		panic(x)
-	}
-}
-
-// Test for in-place initialization.
-func init() {
-	// struct
-	type S struct {
-		a, b int
-	}
-	s := S{1, 2}
-	s = S{b: 3}
-	if s.a != 0 {
-		panic("s.a != 0")
-	}
-	if s.b != 3 {
-		panic("s.b != 3")
-	}
-	s = S{}
-	if s.a != 0 {
-		panic("s.a != 0")
-	}
-	if s.b != 0 {
-		panic("s.b != 0")
-	}
-
-	// array
-	type A [4]int
-	a := A{2, 4, 6, 8}
-	a = A{1: 6, 2: 4}
-	if a[0] != 0 {
-		panic("a[0] != 0")
-	}
-	if a[1] != 6 {
-		panic("a[1] != 6")
-	}
-	if a[2] != 4 {
-		panic("a[2] != 4")
-	}
-	if a[3] != 0 {
-		panic("a[3] != 0")
-	}
-	a = A{}
-	if a[0] != 0 {
-		panic("a[0] != 0")
-	}
-	if a[1] != 0 {
-		panic("a[1] != 0")
-	}
-	if a[2] != 0 {
-		panic("a[2] != 0")
-	}
-	if a[3] != 0 {
-		panic("a[3] != 0")
-	}
-}
-
-// Regression test for https://github.com/golang/go/issues/10127:
-// composite literal clobbers destination before reading from it.
-func init() {
-	// map
-	{
-		type M map[string]int
-		m := M{"x": 1, "y": 2}
-		m = M{"x": m["y"], "y": m["x"]}
-		if m["x"] != 2 || m["y"] != 1 {
-			panic(fmt.Sprint(m))
-		}
-
-		n := M{"x": 3}
-		m, n = M{"x": n["x"]}, M{"x": m["x"]} // parallel assignment
-		if got := fmt.Sprint(m["x"], n["x"]); got != "3 2" {
-			panic(got)
-		}
-	}
-
-	// struct
-	{
-		type T struct{ x, y, z int }
-		t := T{x: 1, y: 2, z: 3}
-
-		t = T{x: t.y, y: t.z, z: t.x} // all fields
-		if got := fmt.Sprint(t); got != "{2 3 1}" {
-			panic(got)
-		}
-
-		t = T{x: t.y, y: t.z + 3} // not all fields
-		if got := fmt.Sprint(t); got != "{3 4 0}" {
-			panic(got)
-		}
-
-		u := T{x: 5, y: 6, z: 7}
-		t, u = T{x: u.x}, T{x: t.x} // parallel assignment
-		if got := fmt.Sprint(t, u); got != "{5 0 0} {3 0 0}" {
-			panic(got)
-		}
-	}
-
-	// array
-	{
-		a := [3]int{0: 1, 1: 2, 2: 3}
-
-		a = [3]int{0: a[1], 1: a[2], 2: a[0]} //  all elements
-		if got := fmt.Sprint(a); got != "[2 3 1]" {
-			panic(got)
-		}
-
-		a = [3]int{0: a[1], 1: a[2] + 3} //  not all elements
-		if got := fmt.Sprint(a); got != "[3 4 0]" {
-			panic(got)
-		}
-
-		b := [3]int{0: 5, 1: 6, 2: 7}
-		a, b = [3]int{0: b[0]}, [3]int{0: a[0]} // parallel assignment
-		if got := fmt.Sprint(a, b); got != "[5 0 0] [3 0 0]" {
-			panic(got)
-		}
-	}
-
-	// slice
-	{
-		s := []int{0: 1, 1: 2, 2: 3}
-
-		s = []int{0: s[1], 1: s[2], 2: s[0]} //  all elements
-		if got := fmt.Sprint(s); got != "[2 3 1]" {
-			panic(got)
-		}
-
-		s = []int{0: s[1], 1: s[2] + 3} //  not all elements
-		if got := fmt.Sprint(s); got != "[3 4]" {
-			panic(got)
-		}
-
-		t := []int{0: 5, 1: 6, 2: 7}
-		s, t = []int{0: t[0]}, []int{0: s[0]} // parallel assignment
-		if got := fmt.Sprint(s, t); got != "[5] [3]" {
-			panic(got)
-		}
-	}
-}
-
-func main() {
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/coverage.go b/third_party/gotools/go/ssa/interp/testdata/coverage.go
deleted file mode 100644
index 0bc0586..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/coverage.go
+++ /dev/null
@@ -1,534 +0,0 @@
-// This interpreter test is designed to run very quickly yet provide
-// some coverage of a broad selection of constructs.
-//
-// Validate this file with 'go run' after editing.
-// TODO(adonovan): break this into small files organized by theme.
-
-package main
-
-import (
-	"fmt"
-	"reflect"
-)
-
-func init() {
-	// Call of variadic function with (implicit) empty slice.
-	if x := fmt.Sprint(); x != "" {
-		panic(x)
-	}
-}
-
-type empty interface{}
-
-type I interface {
-	f() int
-}
-
-type T struct{ z int }
-
-func (t T) f() int { return t.z }
-
-func use(interface{}) {}
-
-var counter = 2
-
-// Test initialization, including init blocks containing 'return'.
-// Assertion is in main.
-func init() {
-	counter *= 3
-	return
-	counter *= 3
-}
-
-func init() {
-	counter *= 5
-	return
-	counter *= 5
-}
-
-// Recursion.
-func fib(x int) int {
-	if x < 2 {
-		return x
-	}
-	return fib(x-1) + fib(x-2)
-}
-
-func fibgen(ch chan int) {
-	for x := 0; x < 10; x++ {
-		ch <- fib(x)
-	}
-	close(ch)
-}
-
-// Goroutines and channels.
-func init() {
-	ch := make(chan int)
-	go fibgen(ch)
-	var fibs []int
-	for v := range ch {
-		fibs = append(fibs, v)
-		if len(fibs) == 10 {
-			break
-		}
-	}
-	if x := fmt.Sprint(fibs); x != "[0 1 1 2 3 5 8 13 21 34]" {
-		panic(x)
-	}
-}
-
-// Test of aliasing.
-func init() {
-	type S struct {
-		a, b string
-	}
-
-	s1 := []string{"foo", "bar"}
-	s2 := s1 // creates an alias
-	s2[0] = "wiz"
-	if x := fmt.Sprint(s1, s2); x != "[wiz bar] [wiz bar]" {
-		panic(x)
-	}
-
-	pa1 := &[2]string{"foo", "bar"}
-	pa2 := pa1 // creates an alias
-	pa2[0] = "wiz"
-	if x := fmt.Sprint(*pa1, *pa2); x != "[wiz bar] [wiz bar]" {
-		panic(x)
-	}
-
-	a1 := [2]string{"foo", "bar"}
-	a2 := a1 // creates a copy
-	a2[0] = "wiz"
-	if x := fmt.Sprint(a1, a2); x != "[foo bar] [wiz bar]" {
-		panic(x)
-	}
-
-	t1 := S{"foo", "bar"}
-	t2 := t1 // copy
-	t2.a = "wiz"
-	if x := fmt.Sprint(t1, t2); x != "{foo bar} {wiz bar}" {
-		panic(x)
-	}
-}
-
-func main() {
-	print() // legal
-
-	if counter != 2*3*5 {
-		panic(counter)
-	}
-
-	// Test builtins (e.g. complex) preserve named argument types.
-	type N complex128
-	var n N
-	n = complex(1.0, 2.0)
-	if n != complex(1.0, 2.0) {
-		panic(n)
-	}
-	if x := reflect.TypeOf(n).String(); x != "main.N" {
-		panic(x)
-	}
-	if real(n) != 1.0 || imag(n) != 2.0 {
-		panic(n)
-	}
-
-	// Channel + select.
-	ch := make(chan int, 1)
-	select {
-	case ch <- 1:
-		// ok
-	default:
-		panic("couldn't send")
-	}
-	if <-ch != 1 {
-		panic("couldn't receive")
-	}
-	// A "receive" select-case that doesn't declare its vars.  (regression test)
-	anint := 0
-	ok := false
-	select {
-	case anint, ok = <-ch:
-	case anint = <-ch:
-	default:
-	}
-	_ = anint
-	_ = ok
-
-	// Anon structs with methods.
-	anon := struct{ T }{T: T{z: 1}}
-	if x := anon.f(); x != 1 {
-		panic(x)
-	}
-	var i I = anon
-	if x := i.f(); x != 1 {
-		panic(x)
-	}
-	// NB. precise output of reflect.Type.String is undefined.
-	if x := reflect.TypeOf(i).String(); x != "struct { main.T }" && x != "struct{main.T}" {
-		panic(x)
-	}
-
-	// fmt.
-	const message = "Hello, World!"
-	if fmt.Sprintf("%s, %s!", "Hello", "World") != message {
-		panic("oops")
-	}
-
-	// Type assertion.
-	type S struct {
-		f int
-	}
-	var e empty = S{f: 42}
-	switch v := e.(type) {
-	case S:
-		if v.f != 42 {
-			panic(v.f)
-		}
-	default:
-		panic(reflect.TypeOf(v))
-	}
-	if i, ok := e.(I); ok {
-		panic(i)
-	}
-
-	// Switch.
-	var x int
-	switch x {
-	case 1:
-		panic(x)
-		fallthrough
-	case 2, 3:
-		panic(x)
-	default:
-		// ok
-	}
-	// empty switch
-	switch {
-	}
-	// empty switch
-	switch {
-	default:
-	}
-	// empty switch
-	switch {
-	default:
-		fallthrough
-	case false:
-	}
-
-	// string -> []rune conversion.
-	use([]rune("foo"))
-
-	// Calls of form x.f().
-	type S2 struct {
-		f func() int
-	}
-	S2{f: func() int { return 1 }}.f() // field is a func value
-	T{}.f()                            // method call
-	i.f()                              // interface method invocation
-	(interface {
-		f() int
-	}(T{})).f() // anon interface method invocation
-
-	// Map lookup.
-	if v, ok := map[string]string{}["foo5"]; v != "" || ok {
-		panic("oops")
-	}
-
-	// Regression test: implicit address-taken struct literal
-	// inside literal map element.
-	_ = map[int]*struct{}{0: {}}
-}
-
-type mybool bool
-
-func (mybool) f() {}
-
-func init() {
-	type mybool bool
-	var b mybool
-	var i interface{} = b || b // result preserves types of operands
-	_ = i.(mybool)
-
-	i = false && b // result preserves type of "typed" operand
-	_ = i.(mybool)
-
-	i = b || true // result preserves type of "typed" operand
-	_ = i.(mybool)
-}
-
-func init() {
-	var x, y int
-	var b mybool = x == y // x==y is an untyped bool
-	b.f()
-}
-
-// Simple closures.
-func init() {
-	b := 3
-	f := func(a int) int {
-		return a + b
-	}
-	b++
-	if x := f(1); x != 5 { // 1+4 == 5
-		panic(x)
-	}
-	b++
-	if x := f(2); x != 7 { // 2+5 == 7
-		panic(x)
-	}
-	if b := f(1) < 16 || f(2) < 17; !b {
-		panic("oops")
-	}
-}
-
-// Shifts.
-func init() {
-	var i int64 = 1
-	var u uint64 = 1 << 32
-	if x := i << uint32(u); x != 1 {
-		panic(x)
-	}
-	if x := i << uint64(u); x != 0 {
-		panic(x)
-	}
-}
-
-// Implicit conversion of delete() key operand.
-func init() {
-	type I interface{}
-	m := make(map[I]bool)
-	m[1] = true
-	m[I(2)] = true
-	if len(m) != 2 {
-		panic(m)
-	}
-	delete(m, I(1))
-	delete(m, 2)
-	if len(m) != 0 {
-		panic(m)
-	}
-}
-
-// An I->I conversion always succeeds.
-func init() {
-	var x I
-	if I(x) != I(nil) {
-		panic("I->I conversion failed")
-	}
-}
-
-// An I->I type-assert fails iff the value is nil.
-func init() {
-	defer func() {
-		r := fmt.Sprint(recover())
-		// Exact error varies by toolchain.
-		if r != "runtime error: interface conversion: interface is nil, not main.I" &&
-			r != "interface conversion: interface is nil, not main.I" {
-			panic("I->I type assertion succeeded for nil value")
-		}
-	}()
-	var x I
-	_ = x.(I)
-}
-
-//////////////////////////////////////////////////////////////////////
-// Variadic bridge methods and interface thunks.
-
-type VT int
-
-var vcount = 0
-
-func (VT) f(x int, y ...string) {
-	vcount++
-	if x != 1 {
-		panic(x)
-	}
-	if len(y) != 2 || y[0] != "foo" || y[1] != "bar" {
-		panic(y)
-	}
-}
-
-type VS struct {
-	VT
-}
-
-type VI interface {
-	f(x int, y ...string)
-}
-
-func init() {
-	foobar := []string{"foo", "bar"}
-	var s VS
-	s.f(1, "foo", "bar")
-	s.f(1, foobar...)
-	if vcount != 2 {
-		panic("s.f not called twice")
-	}
-
-	fn := VI.f
-	fn(s, 1, "foo", "bar")
-	fn(s, 1, foobar...)
-	if vcount != 4 {
-		panic("I.f not called twice")
-	}
-}
-
-// Multiple labels on same statement.
-func multipleLabels() {
-	var trace []int
-	i := 0
-one:
-two:
-	for ; i < 3; i++ {
-		trace = append(trace, i)
-		switch i {
-		case 0:
-			continue two
-		case 1:
-			i++
-			goto one
-		case 2:
-			break two
-		}
-	}
-	if x := fmt.Sprint(trace); x != "[0 1 2]" {
-		panic(x)
-	}
-}
-
-func init() {
-	multipleLabels()
-}
-
-func init() {
-	// Struct equivalence ignores blank fields.
-	type s struct{ x, _, z int }
-	s1 := s{x: 1, z: 3}
-	s2 := s{x: 1, z: 3}
-	if s1 != s2 {
-		panic("not equal")
-	}
-}
-
-func init() {
-	// A slice var can be compared to const []T nil.
-	var i interface{} = []string{"foo"}
-	var j interface{} = []string(nil)
-	if i.([]string) == nil {
-		panic("expected i non-nil")
-	}
-	if j.([]string) != nil {
-		panic("expected j nil")
-	}
-	// But two slices cannot be compared, even if one is nil.
-	defer func() {
-		r := fmt.Sprint(recover())
-		if r != "runtime error: comparing uncomparable type []string" {
-			panic("want panic from slice comparison, got " + r)
-		}
-	}()
-	_ = i == j // interface comparison recurses on types
-}
-
-func init() {
-	// Regression test for SSA renaming bug.
-	var ints []int
-	for _ = range "foo" {
-		var x int
-		x++
-		ints = append(ints, x)
-	}
-	if fmt.Sprint(ints) != "[1 1 1]" {
-		panic(ints)
-	}
-}
-
-// Regression test for issue 6949:
-// []byte("foo") is not a constant since it allocates memory.
-func init() {
-	var r string
-	for i, b := range "ABC" {
-		x := []byte("abc")
-		x[i] = byte(b)
-		r += string(x)
-	}
-	if r != "AbcaBcabC" {
-		panic(r)
-	}
-}
-
-// Test of 3-operand x[lo:hi:max] slice.
-func init() {
-	s := []int{0, 1, 2, 3}
-	lenCapLoHi := func(x []int) [4]int { return [4]int{len(x), cap(x), x[0], x[len(x)-1]} }
-	if got := lenCapLoHi(s[1:3]); got != [4]int{2, 3, 1, 2} {
-		panic(got)
-	}
-	if got := lenCapLoHi(s[1:3:3]); got != [4]int{2, 2, 1, 2} {
-		panic(got)
-	}
-	max := 3
-	if "a"[0] == 'a' {
-		max = 2 // max is non-constant, even in SSA form
-	}
-	if got := lenCapLoHi(s[1:2:max]); got != [4]int{1, 1, 1, 1} {
-		panic(got)
-	}
-}
-
-var one = 1 // not a constant
-
-// Test makeslice.
-func init() {
-	check := func(s []string, wantLen, wantCap int) {
-		if len(s) != wantLen {
-			panic(len(s))
-		}
-		if cap(s) != wantCap {
-			panic(cap(s))
-		}
-	}
-	//                                       SSA form:
-	check(make([]string, 10), 10, 10)     // new([10]string)[:10]
-	check(make([]string, one), 1, 1)      // make([]string, one, one)
-	check(make([]string, 0, 10), 0, 10)   // new([10]string)[:0]
-	check(make([]string, 0, one), 0, 1)   // make([]string, 0, one)
-	check(make([]string, one, 10), 1, 10) // new([10]string)[:one]
-	check(make([]string, one, one), 1, 1) // make([]string, one, one)
-}
-
-// Test that a nice error is issued by indirection wrappers.
-func init() {
-	var ptr *T
-	var i I = ptr
-
-	defer func() {
-		r := fmt.Sprint(recover())
-		// Exact error varies by toolchain:
-		if r != "runtime error: value method (main.T).f called using nil *main.T pointer" &&
-			r != "value method main.T.f called using nil *T pointer" {
-			panic("want panic from call with nil receiver, got " + r)
-		}
-	}()
-	i.f()
-	panic("unreachable")
-}
-
-// Regression test for a subtle bug in which copying values would causes
-// subcomponents of aggregate variables to change address, breaking
-// aliases.
-func init() {
-	type T struct{ f int }
-	var x T
-	p := &x.f
-	x = T{}
-	*p = 1
-	if x.f != 1 {
-		panic("lost store")
-	}
-	if p != &x.f {
-		panic("unstable address")
-	}
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/defer.go b/third_party/gotools/go/ssa/interp/testdata/defer.go
deleted file mode 100644
index f5bae6c..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/defer.go
+++ /dev/null
@@ -1,53 +0,0 @@
-package main
-
-// Tests of defer.  (Deferred recover() belongs is recover.go.)
-
-import "fmt"
-
-func deferMutatesResults(noArgReturn bool) (a, b int) {
-	defer func() {
-		if a != 1 || b != 2 {
-			panic(fmt.Sprint(a, b))
-		}
-		a, b = 3, 4
-	}()
-	if noArgReturn {
-		a, b = 1, 2
-		return
-	}
-	return 1, 2
-}
-
-func init() {
-	a, b := deferMutatesResults(true)
-	if a != 3 || b != 4 {
-		panic(fmt.Sprint(a, b))
-	}
-	a, b = deferMutatesResults(false)
-	if a != 3 || b != 4 {
-		panic(fmt.Sprint(a, b))
-	}
-}
-
-// We concatenate init blocks to make a single function, but we must
-// run defers at the end of each block, not the combined function.
-var deferCount = 0
-
-func init() {
-	deferCount = 1
-	defer func() {
-		deferCount++
-	}()
-	// defer runs HERE
-}
-
-func init() {
-	// Strictly speaking the spec says deferCount may be 0 or 2
-	// since the relative order of init blocks is unspecified.
-	if deferCount != 2 {
-		panic(deferCount) // defer call has not run!
-	}
-}
-
-func main() {
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/fieldprom.go b/third_party/gotools/go/ssa/interp/testdata/fieldprom.go
deleted file mode 100644
index fc276dd..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/fieldprom.go
+++ /dev/null
@@ -1,114 +0,0 @@
-package main
-
-// Tests of field promotion logic.
-
-type A struct {
-	x int
-	y *int
-}
-
-type B struct {
-	p int
-	q *int
-}
-
-type C struct {
-	A
-	*B
-}
-
-type D struct {
-	a int
-	C
-}
-
-func assert(cond bool) {
-	if !cond {
-		panic("failed")
-	}
-}
-
-func f1(c C) {
-	assert(c.x == c.A.x)
-	assert(c.y == c.A.y)
-	assert(&c.x == &c.A.x)
-	assert(&c.y == &c.A.y)
-
-	assert(c.p == c.B.p)
-	assert(c.q == c.B.q)
-	assert(&c.p == &c.B.p)
-	assert(&c.q == &c.B.q)
-
-	c.x = 1
-	*c.y = 1
-	c.p = 1
-	*c.q = 1
-}
-
-func f2(c *C) {
-	assert(c.x == c.A.x)
-	assert(c.y == c.A.y)
-	assert(&c.x == &c.A.x)
-	assert(&c.y == &c.A.y)
-
-	assert(c.p == c.B.p)
-	assert(c.q == c.B.q)
-	assert(&c.p == &c.B.p)
-	assert(&c.q == &c.B.q)
-
-	c.x = 1
-	*c.y = 1
-	c.p = 1
-	*c.q = 1
-}
-
-func f3(d D) {
-	assert(d.x == d.C.A.x)
-	assert(d.y == d.C.A.y)
-	assert(&d.x == &d.C.A.x)
-	assert(&d.y == &d.C.A.y)
-
-	assert(d.p == d.C.B.p)
-	assert(d.q == d.C.B.q)
-	assert(&d.p == &d.C.B.p)
-	assert(&d.q == &d.C.B.q)
-
-	d.x = 1
-	*d.y = 1
-	d.p = 1
-	*d.q = 1
-}
-
-func f4(d *D) {
-	assert(d.x == d.C.A.x)
-	assert(d.y == d.C.A.y)
-	assert(&d.x == &d.C.A.x)
-	assert(&d.y == &d.C.A.y)
-
-	assert(d.p == d.C.B.p)
-	assert(d.q == d.C.B.q)
-	assert(&d.p == &d.C.B.p)
-	assert(&d.q == &d.C.B.q)
-
-	d.x = 1
-	*d.y = 1
-	d.p = 1
-	*d.q = 1
-}
-
-func main() {
-	y := 123
-	c := C{
-		A{x: 42, y: &y},
-		&B{p: 42, q: &y},
-	}
-
-	assert(&c.x == &c.A.x)
-
-	f1(c)
-	f2(&c)
-
-	d := D{C: c}
-	f3(d)
-	f4(&d)
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/ifaceconv.go b/third_party/gotools/go/ssa/interp/testdata/ifaceconv.go
deleted file mode 100644
index 96fc105..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/ifaceconv.go
+++ /dev/null
@@ -1,83 +0,0 @@
-package main
-
-// Tests of interface conversions and type assertions.
-
-type I0 interface {
-}
-type I1 interface {
-	f()
-}
-type I2 interface {
-	f()
-	g()
-}
-
-type C0 struct{}
-type C1 struct{}
-
-func (C1) f() {}
-
-type C2 struct{}
-
-func (C2) f() {}
-func (C2) g() {}
-
-func main() {
-	var i0 I0
-	var i1 I1
-	var i2 I2
-
-	// Nil always causes a type assertion to fail, even to the
-	// same type.
-	if _, ok := i0.(I0); ok {
-		panic("nil i0.(I0) succeeded")
-	}
-	if _, ok := i1.(I1); ok {
-		panic("nil i1.(I1) succeeded")
-	}
-	if _, ok := i2.(I2); ok {
-		panic("nil i2.(I2) succeeded")
-	}
-
-	// Conversions can't fail, even with nil.
-	_ = I0(i0)
-
-	_ = I0(i1)
-	_ = I1(i1)
-
-	_ = I0(i2)
-	_ = I1(i2)
-	_ = I2(i2)
-
-	// Non-nil type assertions pass or fail based on the concrete type.
-	i1 = C1{}
-	if _, ok := i1.(I0); !ok {
-		panic("C1 i1.(I0) failed")
-	}
-	if _, ok := i1.(I1); !ok {
-		panic("C1 i1.(I1) failed")
-	}
-	if _, ok := i1.(I2); ok {
-		panic("C1 i1.(I2) succeeded")
-	}
-
-	i1 = C2{}
-	if _, ok := i1.(I0); !ok {
-		panic("C2 i1.(I0) failed")
-	}
-	if _, ok := i1.(I1); !ok {
-		panic("C2 i1.(I1) failed")
-	}
-	if _, ok := i1.(I2); !ok {
-		panic("C2 i1.(I2) failed")
-	}
-
-	// Conversions can't fail.
-	i1 = C1{}
-	if I0(i1) == nil {
-		panic("C1 I0(i1) was nil")
-	}
-	if I1(i1) == nil {
-		panic("C1 I1(i1) was nil")
-	}
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/ifaceprom.go b/third_party/gotools/go/ssa/interp/testdata/ifaceprom.go
deleted file mode 100644
index 414dc73..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/ifaceprom.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package main
-
-// Test of promotion of methods of an interface embedded within a
-// struct.  In particular, this test exercises that the correct
-// method is called.
-
-type I interface {
-	one() int
-	two() string
-}
-
-type S struct {
-	I
-}
-
-type impl struct{}
-
-func (impl) one() int {
-	return 1
-}
-
-func (impl) two() string {
-	return "two"
-}
-
-func main() {
-	var s S
-	s.I = impl{}
-	if one := s.I.one(); one != 1 {
-		panic(one)
-	}
-	if one := s.one(); one != 1 {
-		panic(one)
-	}
-	closOne := s.I.one
-	if one := closOne(); one != 1 {
-		panic(one)
-	}
-	closOne = s.one
-	if one := closOne(); one != 1 {
-		panic(one)
-	}
-
-	if two := s.I.two(); two != "two" {
-		panic(two)
-	}
-	if two := s.two(); two != "two" {
-		panic(two)
-	}
-	closTwo := s.I.two
-	if two := closTwo(); two != "two" {
-		panic(two)
-	}
-	closTwo = s.two
-	if two := closTwo(); two != "two" {
-		panic(two)
-	}
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/initorder.go b/third_party/gotools/go/ssa/interp/testdata/initorder.go
deleted file mode 100644
index 0f26bed..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/initorder.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package main
-
-import "fmt"
-
-// Test of initialization order of package-level vars.
-
-var counter int
-
-func next() int {
-	c := counter
-	counter++
-	return c
-}
-
-func next2() (x int, y int) {
-	x = next()
-	y = next()
-	return
-}
-
-func makeOrder() int {
-	_, _, _, _ = f, b, d, e
-	return 0
-}
-
-func main() {
-	// Initialization constraints:
-	// - {f,b,c/d,e} < order  (ref graph traversal)
-	// - order < {a}          (lexical order)
-	// - b < c/d < e < f      (lexical order)
-	// Solution: a b c/d e f
-	abcdef := [6]int{a, b, c, d, e, f}
-	if abcdef != [6]int{0, 1, 2, 3, 4, 5} {
-		panic(abcdef)
-	}
-}
-
-var order = makeOrder()
-
-var a, b = next(), next()
-var c, d = next2()
-var e, f = next(), next()
-
-// ------------------------------------------------------------------------
-
-var order2 []string
-
-func create(x int, name string) int {
-	order2 = append(order2, name)
-	return x
-}
-
-var C = create(B+1, "C")
-var A, B = create(1, "A"), create(2, "B")
-
-// Initialization order of package-level value specs.
-func init() {
-	x := fmt.Sprint(order2)
-	// Result varies by toolchain.  This is a spec bug.
-	if x != "[B C A]" && // gc
-		x != "[A B C]" { // go/types
-		panic(x)
-	}
-	if C != 3 {
-		panic(c)
-	}
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/methprom.go b/third_party/gotools/go/ssa/interp/testdata/methprom.go
deleted file mode 100644
index e8e384c..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/methprom.go
+++ /dev/null
@@ -1,93 +0,0 @@
-package main
-
-// Tests of method promotion logic.
-
-type A struct{ magic int }
-
-func (a A) x() {
-	if a.magic != 1 {
-		panic(a.magic)
-	}
-}
-func (a *A) y() *A {
-	return a
-}
-
-type B struct{ magic int }
-
-func (b B) p() {
-	if b.magic != 2 {
-		panic(b.magic)
-	}
-}
-func (b *B) q() {
-	if b != theC.B {
-		panic("oops")
-	}
-}
-
-type I interface {
-	f()
-}
-
-type impl struct{ magic int }
-
-func (i impl) f() {
-	if i.magic != 3 {
-		panic("oops")
-	}
-}
-
-type C struct {
-	A
-	*B
-	I
-}
-
-func assert(cond bool) {
-	if !cond {
-		panic("failed")
-	}
-}
-
-var theC = C{
-	A: A{1},
-	B: &B{2},
-	I: impl{3},
-}
-
-func addr() *C {
-	return &theC
-}
-
-func value() C {
-	return theC
-}
-
-func main() {
-	// address
-	addr().x()
-	if addr().y() != &theC.A {
-		panic("oops")
-	}
-	addr().p()
-	addr().q()
-	addr().f()
-
-	// addressable value
-	var c C = value()
-	c.x()
-	if c.y() != &c.A {
-		panic("oops")
-	}
-	c.p()
-	c.q()
-	c.f()
-
-	// non-addressable value
-	value().x()
-	// value().y() // not in method set
-	value().p()
-	value().q()
-	value().f()
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/mrvchain.go b/third_party/gotools/go/ssa/interp/testdata/mrvchain.go
deleted file mode 100644
index 70dfd02..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/mrvchain.go
+++ /dev/null
@@ -1,75 +0,0 @@
-// Tests of call chaining f(g()) when g has multiple return values (MRVs).
-// See https://code.google.com/p/go/issues/detail?id=4573.
-
-package main
-
-func assert(actual, expected int) {
-	if actual != expected {
-		panic(actual)
-	}
-}
-
-func g() (int, int) {
-	return 5, 7
-}
-
-func g2() (float64, float64) {
-	return 5, 7
-}
-
-func f1v(x int, v ...int) {
-	assert(x, 5)
-	assert(v[0], 7)
-}
-
-func f2(x, y int) {
-	assert(x, 5)
-	assert(y, 7)
-}
-
-func f2v(x, y int, v ...int) {
-	assert(x, 5)
-	assert(y, 7)
-	assert(len(v), 0)
-}
-
-func complexArgs() (float64, float64) {
-	return 5, 7
-}
-
-func appendArgs() ([]string, string) {
-	return []string{"foo"}, "bar"
-}
-
-func h() (i interface{}, ok bool) {
-	m := map[int]string{1: "hi"}
-	i, ok = m[1] // string->interface{} conversion within multi-valued expression
-	return
-}
-
-func h2() (i interface{}, ok bool) {
-	ch := make(chan string, 1)
-	ch <- "hi"
-	i, ok = <-ch // string->interface{} conversion within multi-valued expression
-	return
-}
-
-func main() {
-	f1v(g())
-	f2(g())
-	f2v(g())
-	if c := complex(complexArgs()); c != 5+7i {
-		panic(c)
-	}
-	if s := append(appendArgs()); len(s) != 2 || s[0] != "foo" || s[1] != "bar" {
-		panic(s)
-	}
-	i, ok := h()
-	if !ok || i.(string) != "hi" {
-		panic(i)
-	}
-	i, ok = h2()
-	if !ok || i.(string) != "hi" {
-		panic(i)
-	}
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/range.go b/third_party/gotools/go/ssa/interp/testdata/range.go
deleted file mode 100644
index da8a421..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/range.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package main
-
-// Tests of range loops.
-
-import "fmt"
-
-// Range over string.
-func init() {
-	if x := len("Hello, 世界"); x != 13 { // bytes
-		panic(x)
-	}
-	var indices []int
-	var runes []rune
-	for i, r := range "Hello, 世界" {
-		runes = append(runes, r)
-		indices = append(indices, i)
-	}
-	if x := fmt.Sprint(runes); x != "[72 101 108 108 111 44 32 19990 30028]" {
-		panic(x)
-	}
-	if x := fmt.Sprint(indices); x != "[0 1 2 3 4 5 6 7 10]" {
-		panic(x)
-	}
-	s := ""
-	for _, r := range runes {
-		s = fmt.Sprintf("%s%c", s, r)
-	}
-	if s != "Hello, 世界" {
-		panic(s)
-	}
-
-	var x int
-	for range "Hello, 世界" {
-		x++
-	}
-	if x != len(indices) {
-		panic(x)
-	}
-}
-
-// Regression test for range of pointer to named array type.
-func init() {
-	type intarr [3]int
-	ia := intarr{1, 2, 3}
-	var count int
-	for _, x := range &ia {
-		count += x
-	}
-	if count != 6 {
-		panic(count)
-	}
-}
-
-func main() {
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/recover.go b/third_party/gotools/go/ssa/interp/testdata/recover.go
deleted file mode 100644
index b560052..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/recover.go
+++ /dev/null
@@ -1,34 +0,0 @@
-package main
-
-// Tests of panic/recover.
-
-import "fmt"
-
-func fortyTwo() (r int) {
-	r = 42
-	// The next two statements simulate a 'return' statement.
-	defer func() { recover() }()
-	panic(nil)
-}
-
-func zero() int {
-	defer func() { recover() }()
-	panic(1)
-}
-
-func zeroEmpty() (int, string) {
-	defer func() { recover() }()
-	panic(1)
-}
-
-func main() {
-	if r := fortyTwo(); r != 42 {
-		panic(r)
-	}
-	if r := zero(); r != 0 {
-		panic(r)
-	}
-	if r, s := zeroEmpty(); r != 0 || s != "" {
-		panic(fmt.Sprint(r, s))
-	}
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/reflect.go b/third_party/gotools/go/ssa/interp/testdata/reflect.go
deleted file mode 100644
index 6aa9a67..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/reflect.go
+++ /dev/null
@@ -1,11 +0,0 @@
-package main
-
-import "reflect"
-
-func main() {
-	// Regression test for issue 9462.
-	got := reflect.SliceOf(reflect.TypeOf(byte(0))).String()
-	if got != "[]uint8" && got != "[]byte" { // result varies by toolchain
-		println("BUG: " + got)
-	}
-}
diff --git a/third_party/gotools/go/ssa/interp/testdata/static.go b/third_party/gotools/go/ssa/interp/testdata/static.go
deleted file mode 100644
index b115513..0000000
--- a/third_party/gotools/go/ssa/interp/testdata/static.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package main
-
-// Static tests of SSA builder (via the sanity checker).
-// Dynamic semantics are not exercised.
-
-func init() {
-	// Regression test for issue 6806.
-	ch := make(chan int)
-	select {
-	case n, _ := <-ch:
-		_ = n
-	default:
-		// The default case disables the simplification of
-		// select to a simple receive statement.
-	}
-
-	// value,ok-form receive where TypeOf(ok) is a named boolean.
-	type mybool bool
-	var x int
-	var y mybool
-	select {
-	case x, y = <-ch:
-	default:
-		// The default case disables the simplification of
-		// select to a simple receive statement.
-	}
-	_ = x
-	_ = y
-}
-
-var a int
-
-// Regression test for issue 7840 (covered by SSA sanity checker).
-func bug7840() bool {
-	// This creates a single-predecessor block with a φ-node.
-	return false && a == 0 && a == 0
-}
-
-// A blocking select (sans "default:") cannot fall through.
-// Regression test for issue 7022.
-func bug7022() int {
-	var c1, c2 chan int
-	select {
-	case <-c1:
-		return 123
-	case <-c2:
-		return 456
-	}
-}
-
-// Parens should not prevent intrinsic treatment of built-ins.
-// (Regression test for a crash.)
-func init() {
-	_ = (new)(int)
-	_ = (make)([]int, 0)
-}
-
-func main() {}
diff --git a/third_party/gotools/go/ssa/interp/value.go b/third_party/gotools/go/ssa/interp/value.go
deleted file mode 100644
index ce408a2..0000000
--- a/third_party/gotools/go/ssa/interp/value.go
+++ /dev/null
@@ -1,497 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package interp
-
-// Values
-//
-// All interpreter values are "boxed" in the empty interface, value.
-// The range of possible dynamic types within value are:
-//
-// - bool
-// - numbers (all built-in int/float/complex types are distinguished)
-// - string
-// - map[value]value --- maps for which  usesBuiltinMap(keyType)
-//   *hashmap        --- maps for which !usesBuiltinMap(keyType)
-// - chan value
-// - []value --- slices
-// - iface --- interfaces.
-// - structure --- structs.  Fields are ordered and accessed by numeric indices.
-// - array --- arrays.
-// - *value --- pointers.  Careful: *value is a distinct type from *array etc.
-// - *ssa.Function \
-//   *ssa.Builtin   } --- functions.  A nil 'func' is always of type *ssa.Function.
-//   *closure      /
-// - tuple --- as returned by Return, Next, "value,ok" modes, etc.
-// - iter --- iterators from 'range' over map or string.
-// - bad --- a poison pill for locals that have gone out of scope.
-// - rtype -- the interpreter's concrete implementation of reflect.Type
-//
-// Note that nil is not on this list.
-//
-// Pay close attention to whether or not the dynamic type is a pointer.
-// The compiler cannot help you since value is an empty interface.
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"reflect"
-	"strings"
-	"sync"
-	"unsafe"
-
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-)
-
-type value interface{}
-
-type tuple []value
-
-type array []value
-
-type iface struct {
-	t types.Type // never an "untyped" type
-	v value
-}
-
-type structure []value
-
-// For map, array, *array, slice, string or channel.
-type iter interface {
-	// next returns a Tuple (key, value, ok).
-	// key and value are unaliased, e.g. copies of the sequence element.
-	next() tuple
-}
-
-type closure struct {
-	Fn  *ssa.Function
-	Env []value
-}
-
-type bad struct{}
-
-type rtype struct {
-	t types.Type
-}
-
-// Hash functions and equivalence relation:
-
-// hashString computes the FNV hash of s.
-func hashString(s string) int {
-	var h uint32
-	for i := 0; i < len(s); i++ {
-		h ^= uint32(s[i])
-		h *= 16777619
-	}
-	return int(h)
-}
-
-var (
-	mu     sync.Mutex
-	hasher = typeutil.MakeHasher()
-)
-
-// hashType returns a hash for t such that
-// types.Identical(x, y) => hashType(x) == hashType(y).
-func hashType(t types.Type) int {
-	mu.Lock()
-	h := int(hasher.Hash(t))
-	mu.Unlock()
-	return h
-}
-
-// usesBuiltinMap returns true if the built-in hash function and
-// equivalence relation for type t are consistent with those of the
-// interpreter's representation of type t.  Such types are: all basic
-// types (bool, numbers, string), pointers and channels.
-//
-// usesBuiltinMap returns false for types that require a custom map
-// implementation: interfaces, arrays and structs.
-//
-// Panic ensues if t is an invalid map key type: function, map or slice.
-func usesBuiltinMap(t types.Type) bool {
-	switch t := t.(type) {
-	case *types.Basic, *types.Chan, *types.Pointer:
-		return true
-	case *types.Named:
-		return usesBuiltinMap(t.Underlying())
-	case *types.Interface, *types.Array, *types.Struct:
-		return false
-	}
-	panic(fmt.Sprintf("invalid map key type: %T", t))
-}
-
-func (x array) eq(t types.Type, _y interface{}) bool {
-	y := _y.(array)
-	tElt := t.Underlying().(*types.Array).Elem()
-	for i, xi := range x {
-		if !equals(tElt, xi, y[i]) {
-			return false
-		}
-	}
-	return true
-}
-
-func (x array) hash(t types.Type) int {
-	h := 0
-	tElt := t.Underlying().(*types.Array).Elem()
-	for _, xi := range x {
-		h += hash(tElt, xi)
-	}
-	return h
-}
-
-func (x structure) eq(t types.Type, _y interface{}) bool {
-	y := _y.(structure)
-	tStruct := t.Underlying().(*types.Struct)
-	for i, n := 0, tStruct.NumFields(); i < n; i++ {
-		if f := tStruct.Field(i); !f.Anonymous() {
-			if !equals(f.Type(), x[i], y[i]) {
-				return false
-			}
-		}
-	}
-	return true
-}
-
-func (x structure) hash(t types.Type) int {
-	tStruct := t.Underlying().(*types.Struct)
-	h := 0
-	for i, n := 0, tStruct.NumFields(); i < n; i++ {
-		if f := tStruct.Field(i); !f.Anonymous() {
-			h += hash(f.Type(), x[i])
-		}
-	}
-	return h
-}
-
-// nil-tolerant variant of types.Identical.
-func sameType(x, y types.Type) bool {
-	if x == nil {
-		return y == nil
-	}
-	return y != nil && types.Identical(x, y)
-}
-
-func (x iface) eq(t types.Type, _y interface{}) bool {
-	y := _y.(iface)
-	return sameType(x.t, y.t) && (x.t == nil || equals(x.t, x.v, y.v))
-}
-
-func (x iface) hash(_ types.Type) int {
-	return hashType(x.t)*8581 + hash(x.t, x.v)
-}
-
-func (x rtype) hash(_ types.Type) int {
-	return hashType(x.t)
-}
-
-func (x rtype) eq(_ types.Type, y interface{}) bool {
-	return types.Identical(x.t, y.(rtype).t)
-}
-
-// equals returns true iff x and y are equal according to Go's
-// linguistic equivalence relation for type t.
-// In a well-typed program, the dynamic types of x and y are
-// guaranteed equal.
-func equals(t types.Type, x, y value) bool {
-	switch x := x.(type) {
-	case bool:
-		return x == y.(bool)
-	case int:
-		return x == y.(int)
-	case int8:
-		return x == y.(int8)
-	case int16:
-		return x == y.(int16)
-	case int32:
-		return x == y.(int32)
-	case int64:
-		return x == y.(int64)
-	case uint:
-		return x == y.(uint)
-	case uint8:
-		return x == y.(uint8)
-	case uint16:
-		return x == y.(uint16)
-	case uint32:
-		return x == y.(uint32)
-	case uint64:
-		return x == y.(uint64)
-	case uintptr:
-		return x == y.(uintptr)
-	case float32:
-		return x == y.(float32)
-	case float64:
-		return x == y.(float64)
-	case complex64:
-		return x == y.(complex64)
-	case complex128:
-		return x == y.(complex128)
-	case string:
-		return x == y.(string)
-	case *value:
-		return x == y.(*value)
-	case chan value:
-		return x == y.(chan value)
-	case structure:
-		return x.eq(t, y)
-	case array:
-		return x.eq(t, y)
-	case iface:
-		return x.eq(t, y)
-	case rtype:
-		return x.eq(t, y)
-	}
-
-	// Since map, func and slice don't support comparison, this
-	// case is only reachable if one of x or y is literally nil
-	// (handled in eqnil) or via interface{} values.
-	panic(fmt.Sprintf("comparing uncomparable type %s", t))
-}
-
-// Returns an integer hash of x such that equals(x, y) => hash(x) == hash(y).
-func hash(t types.Type, x value) int {
-	switch x := x.(type) {
-	case bool:
-		if x {
-			return 1
-		}
-		return 0
-	case int:
-		return x
-	case int8:
-		return int(x)
-	case int16:
-		return int(x)
-	case int32:
-		return int(x)
-	case int64:
-		return int(x)
-	case uint:
-		return int(x)
-	case uint8:
-		return int(x)
-	case uint16:
-		return int(x)
-	case uint32:
-		return int(x)
-	case uint64:
-		return int(x)
-	case uintptr:
-		return int(x)
-	case float32:
-		return int(x)
-	case float64:
-		return int(x)
-	case complex64:
-		return int(real(x))
-	case complex128:
-		return int(real(x))
-	case string:
-		return hashString(x)
-	case *value:
-		return int(uintptr(unsafe.Pointer(x)))
-	case chan value:
-		return int(uintptr(reflect.ValueOf(x).Pointer()))
-	case structure:
-		return x.hash(t)
-	case array:
-		return x.hash(t)
-	case iface:
-		return x.hash(t)
-	case rtype:
-		return x.hash(t)
-	}
-	panic(fmt.Sprintf("%T is unhashable", x))
-}
-
-// reflect.Value struct values don't have a fixed shape, since the
-// payload can be a scalar or an aggregate depending on the instance.
-// So store (and load) can't simply use recursion over the shape of the
-// rhs value, or the lhs, to copy the value; we need the static type
-// information.  (We can't make reflect.Value a new basic data type
-// because its "structness" is exposed to Go programs.)
-
-// load returns the value of type T in *addr.
-func load(T types.Type, addr *value) value {
-	switch T := T.Underlying().(type) {
-	case *types.Struct:
-		v := (*addr).(structure)
-		a := make(structure, len(v))
-		for i := range a {
-			a[i] = load(T.Field(i).Type(), &v[i])
-		}
-		return a
-	case *types.Array:
-		v := (*addr).(array)
-		a := make(array, len(v))
-		for i := range a {
-			a[i] = load(T.Elem(), &v[i])
-		}
-		return a
-	default:
-		return *addr
-	}
-}
-
-// store stores value v of type T into *addr.
-func store(T types.Type, addr *value, v value) {
-	switch T := T.Underlying().(type) {
-	case *types.Struct:
-		lhs := (*addr).(structure)
-		rhs := v.(structure)
-		for i := range lhs {
-			store(T.Field(i).Type(), &lhs[i], rhs[i])
-		}
-	case *types.Array:
-		lhs := (*addr).(array)
-		rhs := v.(array)
-		for i := range lhs {
-			store(T.Elem(), &lhs[i], rhs[i])
-		}
-	default:
-		*addr = v
-	}
-}
-
-// Prints in the style of built-in println.
-// (More or less; in gc println is actually a compiler intrinsic and
-// can distinguish println(1) from println(interface{}(1)).)
-func writeValue(buf *bytes.Buffer, v value) {
-	switch v := v.(type) {
-	case nil, bool, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr, float32, float64, complex64, complex128, string:
-		fmt.Fprintf(buf, "%v", v)
-
-	case map[value]value:
-		buf.WriteString("map[")
-		sep := ""
-		for k, e := range v {
-			buf.WriteString(sep)
-			sep = " "
-			writeValue(buf, k)
-			buf.WriteString(":")
-			writeValue(buf, e)
-		}
-		buf.WriteString("]")
-
-	case *hashmap:
-		buf.WriteString("map[")
-		sep := " "
-		for _, e := range v.table {
-			for e != nil {
-				buf.WriteString(sep)
-				sep = " "
-				writeValue(buf, e.key)
-				buf.WriteString(":")
-				writeValue(buf, e.value)
-				e = e.next
-			}
-		}
-		buf.WriteString("]")
-
-	case chan value:
-		fmt.Fprintf(buf, "%v", v) // (an address)
-
-	case *value:
-		if v == nil {
-			buf.WriteString("<nil>")
-		} else {
-			fmt.Fprintf(buf, "%p", v)
-		}
-
-	case iface:
-		fmt.Fprintf(buf, "(%s, ", v.t)
-		writeValue(buf, v.v)
-		buf.WriteString(")")
-
-	case structure:
-		buf.WriteString("{")
-		for i, e := range v {
-			if i > 0 {
-				buf.WriteString(" ")
-			}
-			writeValue(buf, e)
-		}
-		buf.WriteString("}")
-
-	case array:
-		buf.WriteString("[")
-		for i, e := range v {
-			if i > 0 {
-				buf.WriteString(" ")
-			}
-			writeValue(buf, e)
-		}
-		buf.WriteString("]")
-
-	case []value:
-		buf.WriteString("[")
-		for i, e := range v {
-			if i > 0 {
-				buf.WriteString(" ")
-			}
-			writeValue(buf, e)
-		}
-		buf.WriteString("]")
-
-	case *ssa.Function, *ssa.Builtin, *closure:
-		fmt.Fprintf(buf, "%p", v) // (an address)
-
-	case rtype:
-		buf.WriteString(v.t.String())
-
-	case tuple:
-		// Unreachable in well-formed Go programs
-		buf.WriteString("(")
-		for i, e := range v {
-			if i > 0 {
-				buf.WriteString(", ")
-			}
-			writeValue(buf, e)
-		}
-		buf.WriteString(")")
-
-	default:
-		fmt.Fprintf(buf, "<%T>", v)
-	}
-}
-
-// Implements printing of Go values in the style of built-in println.
-func toString(v value) string {
-	var b bytes.Buffer
-	writeValue(&b, v)
-	return b.String()
-}
-
-// ------------------------------------------------------------------------
-// Iterators
-
-type stringIter struct {
-	*strings.Reader
-	i int
-}
-
-func (it *stringIter) next() tuple {
-	okv := make(tuple, 3)
-	ch, n, err := it.ReadRune()
-	ok := err != io.EOF
-	okv[0] = ok
-	if ok {
-		okv[1] = it.i
-		okv[2] = ch
-	}
-	it.i += n
-	return okv
-}
-
-type mapIter chan [2]value
-
-func (it mapIter) next() tuple {
-	kv, ok := <-it
-	return tuple{ok, kv[0], kv[1]}
-}
diff --git a/third_party/gotools/go/ssa/lift.go b/third_party/gotools/go/ssa/lift.go
deleted file mode 100644
index e7996cc..0000000
--- a/third_party/gotools/go/ssa/lift.go
+++ /dev/null
@@ -1,599 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines the lifting pass which tries to "lift" Alloc
-// cells (new/local variables) into SSA registers, replacing loads
-// with the dominating stored value, eliminating loads and stores, and
-// inserting φ-nodes as needed.
-
-// Cited papers and resources:
-//
-// Ron Cytron et al. 1991. Efficiently computing SSA form...
-// http://doi.acm.org/10.1145/115372.115320
-//
-// Cooper, Harvey, Kennedy.  2001.  A Simple, Fast Dominance Algorithm.
-// Software Practice and Experience 2001, 4:1-10.
-// http://www.hipersoft.rice.edu/grads/publications/dom14.pdf
-//
-// Daniel Berlin, llvmdev mailing list, 2012.
-// http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-January/046638.html
-// (Be sure to expand the whole thread.)
-
-// TODO(adonovan): opt: there are many optimizations worth evaluating, and
-// the conventional wisdom for SSA construction is that a simple
-// algorithm well engineered often beats those of better asymptotic
-// complexity on all but the most egregious inputs.
-//
-// Danny Berlin suggests that the Cooper et al. algorithm for
-// computing the dominance frontier is superior to Cytron et al.
-// Furthermore he recommends that rather than computing the DF for the
-// whole function then renaming all alloc cells, it may be cheaper to
-// compute the DF for each alloc cell separately and throw it away.
-//
-// Consider exploiting liveness information to avoid creating dead
-// φ-nodes which we then immediately remove.
-//
-// Integrate lifting with scalar replacement of aggregates (SRA) since
-// the two are synergistic.
-//
-// Also see many other "TODO: opt" suggestions in the code.
-
-import (
-	"fmt"
-	"go/token"
-	"math/big"
-	"os"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// If true, perform sanity checking and show diagnostic information at
-// each step of lifting.  Very verbose.
-const debugLifting = false
-
-// domFrontier maps each block to the set of blocks in its dominance
-// frontier.  The outer slice is conceptually a map keyed by
-// Block.Index.  The inner slice is conceptually a set, possibly
-// containing duplicates.
-//
-// TODO(adonovan): opt: measure impact of dups; consider a packed bit
-// representation, e.g. big.Int, and bitwise parallel operations for
-// the union step in the Children loop.
-//
-// domFrontier's methods mutate the slice's elements but not its
-// length, so their receivers needn't be pointers.
-//
-type domFrontier [][]*BasicBlock
-
-func (df domFrontier) add(u, v *BasicBlock) {
-	p := &df[u.Index]
-	*p = append(*p, v)
-}
-
-// build builds the dominance frontier df for the dominator (sub)tree
-// rooted at u, using the Cytron et al. algorithm.
-//
-// TODO(adonovan): opt: consider Berlin approach, computing pruned SSA
-// by pruning the entire IDF computation, rather than merely pruning
-// the DF -> IDF step.
-func (df domFrontier) build(u *BasicBlock) {
-	// Encounter each node u in postorder of dom tree.
-	for _, child := range u.dom.children {
-		df.build(child)
-	}
-	for _, vb := range u.Succs {
-		if v := vb.dom; v.idom != u {
-			df.add(u, vb)
-		}
-	}
-	for _, w := range u.dom.children {
-		for _, vb := range df[w.Index] {
-			// TODO(adonovan): opt: use word-parallel bitwise union.
-			if v := vb.dom; v.idom != u {
-				df.add(u, vb)
-			}
-		}
-	}
-}
-
-func buildDomFrontier(fn *Function) domFrontier {
-	df := make(domFrontier, len(fn.Blocks))
-	df.build(fn.Blocks[0])
-	if fn.Recover != nil {
-		df.build(fn.Recover)
-	}
-	return df
-}
-
-func removeInstr(refs []Instruction, instr Instruction) []Instruction {
-	i := 0
-	for _, ref := range refs {
-		if ref == instr {
-			continue
-		}
-		refs[i] = ref
-		i++
-	}
-	for j := i; j != len(refs); j++ {
-		refs[j] = nil // aid GC
-	}
-	return refs[:i]
-}
-
-// lift attempts to replace local and new Allocs accessed only with
-// load/store by SSA registers, inserting φ-nodes where necessary.
-// The result is a program in classical pruned SSA form.
-//
-// Preconditions:
-// - fn has no dead blocks (blockopt has run).
-// - Def/use info (Operands and Referrers) is up-to-date.
-// - The dominator tree is up-to-date.
-//
-func lift(fn *Function) {
-	// TODO(adonovan): opt: lots of little optimizations may be
-	// worthwhile here, especially if they cause us to avoid
-	// buildDomFrontier.  For example:
-	//
-	// - Alloc never loaded?  Eliminate.
-	// - Alloc never stored?  Replace all loads with a zero constant.
-	// - Alloc stored once?  Replace loads with dominating store;
-	//   don't forget that an Alloc is itself an effective store
-	//   of zero.
-	// - Alloc used only within a single block?
-	//   Use degenerate algorithm avoiding φ-nodes.
-	// - Consider synergy with scalar replacement of aggregates (SRA).
-	//   e.g. *(&x.f) where x is an Alloc.
-	//   Perhaps we'd get better results if we generated this as x.f
-	//   i.e. Field(x, .f) instead of Load(FieldIndex(x, .f)).
-	//   Unclear.
-	//
-	// But we will start with the simplest correct code.
-	df := buildDomFrontier(fn)
-
-	if debugLifting {
-		title := false
-		for i, blocks := range df {
-			if blocks != nil {
-				if !title {
-					fmt.Fprintf(os.Stderr, "Dominance frontier of %s:\n", fn)
-					title = true
-				}
-				fmt.Fprintf(os.Stderr, "\t%s: %s\n", fn.Blocks[i], blocks)
-			}
-		}
-	}
-
-	newPhis := make(newPhiMap)
-
-	// During this pass we will replace some BasicBlock.Instrs
-	// (allocs, loads and stores) with nil, keeping a count in
-	// BasicBlock.gaps.  At the end we will reset Instrs to the
-	// concatenation of all non-dead newPhis and non-nil Instrs
-	// for the block, reusing the original array if space permits.
-
-	// While we're here, we also eliminate 'rundefers'
-	// instructions in functions that contain no 'defer'
-	// instructions.
-	usesDefer := false
-
-	// Determine which allocs we can lift and number them densely.
-	// The renaming phase uses this numbering for compact maps.
-	numAllocs := 0
-	for _, b := range fn.Blocks {
-		b.gaps = 0
-		b.rundefers = 0
-		for _, instr := range b.Instrs {
-			switch instr := instr.(type) {
-			case *Alloc:
-				index := -1
-				if liftAlloc(df, instr, newPhis) {
-					index = numAllocs
-					numAllocs++
-				}
-				instr.index = index
-			case *Defer:
-				usesDefer = true
-			case *RunDefers:
-				b.rundefers++
-			}
-		}
-	}
-
-	// renaming maps an alloc (keyed by index) to its replacement
-	// value.  Initially the renaming contains nil, signifying the
-	// zero constant of the appropriate type; we construct the
-	// Const lazily at most once on each path through the domtree.
-	// TODO(adonovan): opt: cache per-function not per subtree.
-	renaming := make([]Value, numAllocs)
-
-	// Renaming.
-	rename(fn.Blocks[0], renaming, newPhis)
-
-	// Eliminate dead new phis, then prepend the live ones to each block.
-	for _, b := range fn.Blocks {
-
-		// Compress the newPhis slice to eliminate unused phis.
-		// TODO(adonovan): opt: compute liveness to avoid
-		// placing phis in blocks for which the alloc cell is
-		// not live.
-		nps := newPhis[b]
-		j := 0
-		for _, np := range nps {
-			if !phiIsLive(np.phi) {
-				// discard it, first removing it from referrers
-				for _, newval := range np.phi.Edges {
-					if refs := newval.Referrers(); refs != nil {
-						*refs = removeInstr(*refs, np.phi)
-					}
-				}
-				continue
-			}
-			nps[j] = np
-			j++
-		}
-		nps = nps[:j]
-
-		rundefersToKill := b.rundefers
-		if usesDefer {
-			rundefersToKill = 0
-		}
-
-		if j+b.gaps+rundefersToKill == 0 {
-			continue // fast path: no new phis or gaps
-		}
-
-		// Compact nps + non-nil Instrs into a new slice.
-		// TODO(adonovan): opt: compact in situ if there is
-		// sufficient space or slack in the slice.
-		dst := make([]Instruction, len(b.Instrs)+j-b.gaps-rundefersToKill)
-		for i, np := range nps {
-			dst[i] = np.phi
-		}
-		for _, instr := range b.Instrs {
-			if instr == nil {
-				continue
-			}
-			if !usesDefer {
-				if _, ok := instr.(*RunDefers); ok {
-					continue
-				}
-			}
-			dst[j] = instr
-			j++
-		}
-		for i, np := range nps {
-			dst[i] = np.phi
-		}
-		b.Instrs = dst
-	}
-
-	// Remove any fn.Locals that were lifted.
-	j := 0
-	for _, l := range fn.Locals {
-		if l.index < 0 {
-			fn.Locals[j] = l
-			j++
-		}
-	}
-	// Nil out fn.Locals[j:] to aid GC.
-	for i := j; i < len(fn.Locals); i++ {
-		fn.Locals[i] = nil
-	}
-	fn.Locals = fn.Locals[:j]
-}
-
-func phiIsLive(phi *Phi) bool {
-	for _, instr := range *phi.Referrers() {
-		if instr == phi {
-			continue // self-refs don't count
-		}
-		if _, ok := instr.(*DebugRef); ok {
-			continue // debug refs don't count
-		}
-		return true
-	}
-	return false
-}
-
-type blockSet struct{ big.Int } // (inherit methods from Int)
-
-// add adds b to the set and returns true if the set changed.
-func (s *blockSet) add(b *BasicBlock) bool {
-	i := b.Index
-	if s.Bit(i) != 0 {
-		return false
-	}
-	s.SetBit(&s.Int, i, 1)
-	return true
-}
-
-// take removes an arbitrary element from a set s and
-// returns its index, or returns -1 if empty.
-func (s *blockSet) take() int {
-	l := s.BitLen()
-	for i := 0; i < l; i++ {
-		if s.Bit(i) == 1 {
-			s.SetBit(&s.Int, i, 0)
-			return i
-		}
-	}
-	return -1
-}
-
-// newPhi is a pair of a newly introduced φ-node and the lifted Alloc
-// it replaces.
-type newPhi struct {
-	phi   *Phi
-	alloc *Alloc
-}
-
-// newPhiMap records for each basic block, the set of newPhis that
-// must be prepended to the block.
-type newPhiMap map[*BasicBlock][]newPhi
-
-// liftAlloc determines whether alloc can be lifted into registers,
-// and if so, it populates newPhis with all the φ-nodes it may require
-// and returns true.
-//
-func liftAlloc(df domFrontier, alloc *Alloc, newPhis newPhiMap) bool {
-	// Don't lift aggregates into registers, because we don't have
-	// a way to express their zero-constants.
-	switch deref(alloc.Type()).Underlying().(type) {
-	case *types.Array, *types.Struct:
-		return false
-	}
-
-	// Don't lift named return values in functions that defer
-	// calls that may recover from panic.
-	if fn := alloc.Parent(); fn.Recover != nil {
-		for _, nr := range fn.namedResults {
-			if nr == alloc {
-				return false
-			}
-		}
-	}
-
-	// Compute defblocks, the set of blocks containing a
-	// definition of the alloc cell.
-	var defblocks blockSet
-	for _, instr := range *alloc.Referrers() {
-		// Bail out if we discover the alloc is not liftable;
-		// the only operations permitted to use the alloc are
-		// loads/stores into the cell, and DebugRef.
-		switch instr := instr.(type) {
-		case *Store:
-			if instr.Val == alloc {
-				return false // address used as value
-			}
-			if instr.Addr != alloc {
-				panic("Alloc.Referrers is inconsistent")
-			}
-			defblocks.add(instr.Block())
-		case *UnOp:
-			if instr.Op != token.MUL {
-				return false // not a load
-			}
-			if instr.X != alloc {
-				panic("Alloc.Referrers is inconsistent")
-			}
-		case *DebugRef:
-			// ok
-		default:
-			return false // some other instruction
-		}
-	}
-	// The Alloc itself counts as a (zero) definition of the cell.
-	defblocks.add(alloc.Block())
-
-	if debugLifting {
-		fmt.Fprintln(os.Stderr, "\tlifting ", alloc, alloc.Name())
-	}
-
-	fn := alloc.Parent()
-
-	// Φ-insertion.
-	//
-	// What follows is the body of the main loop of the insert-φ
-	// function described by Cytron et al, but instead of using
-	// counter tricks, we just reset the 'hasAlready' and 'work'
-	// sets each iteration.  These are bitmaps so it's pretty cheap.
-	//
-	// TODO(adonovan): opt: recycle slice storage for W,
-	// hasAlready, defBlocks across liftAlloc calls.
-	var hasAlready blockSet
-
-	// Initialize W and work to defblocks.
-	var work blockSet = defblocks // blocks seen
-	var W blockSet                // blocks to do
-	W.Set(&defblocks.Int)
-
-	// Traverse iterated dominance frontier, inserting φ-nodes.
-	for i := W.take(); i != -1; i = W.take() {
-		u := fn.Blocks[i]
-		for _, v := range df[u.Index] {
-			if hasAlready.add(v) {
-				// Create φ-node.
-				// It will be prepended to v.Instrs later, if needed.
-				phi := &Phi{
-					Edges:   make([]Value, len(v.Preds)),
-					Comment: alloc.Comment,
-				}
-				phi.pos = alloc.Pos()
-				phi.setType(deref(alloc.Type()))
-				phi.block = v
-				if debugLifting {
-					fmt.Fprintf(os.Stderr, "\tplace %s = %s at block %s\n", phi.Name(), phi, v)
-				}
-				newPhis[v] = append(newPhis[v], newPhi{phi, alloc})
-
-				if work.add(v) {
-					W.add(v)
-				}
-			}
-		}
-	}
-
-	return true
-}
-
-// replaceAll replaces all intraprocedural uses of x with y,
-// updating x.Referrers and y.Referrers.
-// Precondition: x.Referrers() != nil, i.e. x must be local to some function.
-//
-func replaceAll(x, y Value) {
-	var rands []*Value
-	pxrefs := x.Referrers()
-	pyrefs := y.Referrers()
-	for _, instr := range *pxrefs {
-		rands = instr.Operands(rands[:0]) // recycle storage
-		for _, rand := range rands {
-			if *rand != nil {
-				if *rand == x {
-					*rand = y
-				}
-			}
-		}
-		if pyrefs != nil {
-			*pyrefs = append(*pyrefs, instr) // dups ok
-		}
-	}
-	*pxrefs = nil // x is now unreferenced
-}
-
-// renamed returns the value to which alloc is being renamed,
-// constructing it lazily if it's the implicit zero initialization.
-//
-func renamed(renaming []Value, alloc *Alloc) Value {
-	v := renaming[alloc.index]
-	if v == nil {
-		v = zeroConst(deref(alloc.Type()))
-		renaming[alloc.index] = v
-	}
-	return v
-}
-
-// rename implements the (Cytron et al) SSA renaming algorithm, a
-// preorder traversal of the dominator tree replacing all loads of
-// Alloc cells with the value stored to that cell by the dominating
-// store instruction.  For lifting, we need only consider loads,
-// stores and φ-nodes.
-//
-// renaming is a map from *Alloc (keyed by index number) to its
-// dominating stored value; newPhis[x] is the set of new φ-nodes to be
-// prepended to block x.
-//
-func rename(u *BasicBlock, renaming []Value, newPhis newPhiMap) {
-	// Each φ-node becomes the new name for its associated Alloc.
-	for _, np := range newPhis[u] {
-		phi := np.phi
-		alloc := np.alloc
-		renaming[alloc.index] = phi
-	}
-
-	// Rename loads and stores of allocs.
-	for i, instr := range u.Instrs {
-		switch instr := instr.(type) {
-		case *Alloc:
-			if instr.index >= 0 { // store of zero to Alloc cell
-				// Replace dominated loads by the zero value.
-				renaming[instr.index] = nil
-				if debugLifting {
-					fmt.Fprintf(os.Stderr, "\tkill alloc %s\n", instr)
-				}
-				// Delete the Alloc.
-				u.Instrs[i] = nil
-				u.gaps++
-			}
-
-		case *Store:
-			if alloc, ok := instr.Addr.(*Alloc); ok && alloc.index >= 0 { // store to Alloc cell
-				// Replace dominated loads by the stored value.
-				renaming[alloc.index] = instr.Val
-				if debugLifting {
-					fmt.Fprintf(os.Stderr, "\tkill store %s; new value: %s\n",
-						instr, instr.Val.Name())
-				}
-				// Remove the store from the referrer list of the stored value.
-				if refs := instr.Val.Referrers(); refs != nil {
-					*refs = removeInstr(*refs, instr)
-				}
-				// Delete the Store.
-				u.Instrs[i] = nil
-				u.gaps++
-			}
-
-		case *UnOp:
-			if instr.Op == token.MUL {
-				if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // load of Alloc cell
-					newval := renamed(renaming, alloc)
-					if debugLifting {
-						fmt.Fprintf(os.Stderr, "\tupdate load %s = %s with %s\n",
-							instr.Name(), instr, newval.Name())
-					}
-					// Replace all references to
-					// the loaded value by the
-					// dominating stored value.
-					replaceAll(instr, newval)
-					// Delete the Load.
-					u.Instrs[i] = nil
-					u.gaps++
-				}
-			}
-
-		case *DebugRef:
-			if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // ref of Alloc cell
-				if instr.IsAddr {
-					instr.X = renamed(renaming, alloc)
-					instr.IsAddr = false
-
-					// Add DebugRef to instr.X's referrers.
-					if refs := instr.X.Referrers(); refs != nil {
-						*refs = append(*refs, instr)
-					}
-				} else {
-					// A source expression denotes the address
-					// of an Alloc that was optimized away.
-					instr.X = nil
-
-					// Delete the DebugRef.
-					u.Instrs[i] = nil
-					u.gaps++
-				}
-			}
-		}
-	}
-
-	// For each φ-node in a CFG successor, rename the edge.
-	for _, v := range u.Succs {
-		phis := newPhis[v]
-		if len(phis) == 0 {
-			continue
-		}
-		i := v.predIndex(u)
-		for _, np := range phis {
-			phi := np.phi
-			alloc := np.alloc
-			newval := renamed(renaming, alloc)
-			if debugLifting {
-				fmt.Fprintf(os.Stderr, "\tsetphi %s edge %s -> %s (#%d) (alloc=%s) := %s\n",
-					phi.Name(), u, v, i, alloc.Name(), newval.Name())
-			}
-			phi.Edges[i] = newval
-			if prefs := newval.Referrers(); prefs != nil {
-				*prefs = append(*prefs, phi)
-			}
-		}
-	}
-
-	// Continue depth-first recursion over domtree, pushing a
-	// fresh copy of the renaming map for each subtree.
-	for _, v := range u.dom.children {
-		// TODO(adonovan): opt: avoid copy on final iteration; use destructive update.
-		r := make([]Value, len(renaming))
-		copy(r, renaming)
-		rename(v, r, newPhis)
-	}
-}
diff --git a/third_party/gotools/go/ssa/lvalue.go b/third_party/gotools/go/ssa/lvalue.go
deleted file mode 100644
index 1fbbb7b..0000000
--- a/third_party/gotools/go/ssa/lvalue.go
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// lvalues are the union of addressable expressions and map-index
-// expressions.
-
-import (
-	"go/ast"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// An lvalue represents an assignable location that may appear on the
-// left-hand side of an assignment.  This is a generalization of a
-// pointer to permit updates to elements of maps.
-//
-type lvalue interface {
-	store(fn *Function, v Value) // stores v into the location
-	load(fn *Function) Value     // loads the contents of the location
-	address(fn *Function) Value  // address of the location
-	typ() types.Type             // returns the type of the location
-}
-
-// An address is an lvalue represented by a true pointer.
-type address struct {
-	addr Value
-	pos  token.Pos // source position
-	expr ast.Expr  // source syntax of the value (not address) [debug mode]
-}
-
-func (a *address) load(fn *Function) Value {
-	load := emitLoad(fn, a.addr)
-	load.pos = a.pos
-	return load
-}
-
-func (a *address) store(fn *Function, v Value) {
-	store := emitStore(fn, a.addr, v, a.pos)
-	if a.expr != nil {
-		// store.Val is v, converted for assignability.
-		emitDebugRef(fn, a.expr, store.Val, false)
-	}
-}
-
-func (a *address) address(fn *Function) Value {
-	if a.expr != nil {
-		emitDebugRef(fn, a.expr, a.addr, true)
-	}
-	return a.addr
-}
-
-func (a *address) typ() types.Type {
-	return deref(a.addr.Type())
-}
-
-// An element is an lvalue represented by m[k], the location of an
-// element of a map or string.  These locations are not addressable
-// since pointers cannot be formed from them, but they do support
-// load(), and in the case of maps, store().
-//
-type element struct {
-	m, k Value      // map or string
-	t    types.Type // map element type or string byte type
-	pos  token.Pos  // source position of colon ({k:v}) or lbrack (m[k]=v)
-}
-
-func (e *element) load(fn *Function) Value {
-	l := &Lookup{
-		X:     e.m,
-		Index: e.k,
-	}
-	l.setPos(e.pos)
-	l.setType(e.t)
-	return fn.emit(l)
-}
-
-func (e *element) store(fn *Function, v Value) {
-	up := &MapUpdate{
-		Map:   e.m,
-		Key:   e.k,
-		Value: emitConv(fn, v, e.t),
-	}
-	up.pos = e.pos
-	fn.emit(up)
-}
-
-func (e *element) address(fn *Function) Value {
-	panic("map/string elements are not addressable")
-}
-
-func (e *element) typ() types.Type {
-	return e.t
-}
-
-// A blank is a dummy variable whose name is "_".
-// It is not reified: loads are illegal and stores are ignored.
-//
-type blank struct{}
-
-func (bl blank) load(fn *Function) Value {
-	panic("blank.load is illegal")
-}
-
-func (bl blank) store(fn *Function, v Value) {
-	// no-op
-}
-
-func (bl blank) address(fn *Function) Value {
-	panic("blank var is not addressable")
-}
-
-func (bl blank) typ() types.Type {
-	// This should be the type of the blank Ident; the typechecker
-	// doesn't provide this yet, but fortunately, we don't need it
-	// yet either.
-	panic("blank.typ is unimplemented")
-}
diff --git a/third_party/gotools/go/ssa/methods.go b/third_party/gotools/go/ssa/methods.go
deleted file mode 100644
index 5113002..0000000
--- a/third_party/gotools/go/ssa/methods.go
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines utilities for population of method sets.
-
-import (
-	"fmt"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// Method returns the Function implementing method sel, building
-// wrapper methods on demand.  It returns nil if sel denotes an
-// abstract (interface) method.
-//
-// Precondition: sel.Kind() == MethodVal.
-//
-// TODO(adonovan): rename this to MethodValue because of the
-// precondition, and for consistency with functions in source.go.
-//
-// Thread-safe.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
-//
-func (prog *Program) Method(sel *types.Selection) *Function {
-	if sel.Kind() != types.MethodVal {
-		panic(fmt.Sprintf("Method(%s) kind != MethodVal", sel))
-	}
-	T := sel.Recv()
-	if isInterface(T) {
-		return nil // abstract method
-	}
-	if prog.mode&LogSource != 0 {
-		defer logStack("Method %s %v", T, sel)()
-	}
-
-	prog.methodsMu.Lock()
-	defer prog.methodsMu.Unlock()
-
-	return prog.addMethod(prog.createMethodSet(T), sel)
-}
-
-// LookupMethod returns the implementation of the method of type T
-// identified by (pkg, name).  It returns nil if the method exists but
-// is abstract, and panics if T has no such method.
-//
-func (prog *Program) LookupMethod(T types.Type, pkg *types.Package, name string) *Function {
-	sel := prog.MethodSets.MethodSet(T).Lookup(pkg, name)
-	if sel == nil {
-		panic(fmt.Sprintf("%s has no method %s", T, types.Id(pkg, name)))
-	}
-	return prog.Method(sel)
-}
-
-// methodSet contains the (concrete) methods of a non-interface type.
-type methodSet struct {
-	mapping  map[string]*Function // populated lazily
-	complete bool                 // mapping contains all methods
-}
-
-// Precondition: !isInterface(T).
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-func (prog *Program) createMethodSet(T types.Type) *methodSet {
-	mset, ok := prog.methodSets.At(T).(*methodSet)
-	if !ok {
-		mset = &methodSet{mapping: make(map[string]*Function)}
-		prog.methodSets.Set(T, mset)
-	}
-	return mset
-}
-
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-func (prog *Program) addMethod(mset *methodSet, sel *types.Selection) *Function {
-	if sel.Kind() == types.MethodExpr {
-		panic(sel)
-	}
-	id := sel.Obj().Id()
-	fn := mset.mapping[id]
-	if fn == nil {
-		obj := sel.Obj().(*types.Func)
-
-		needsPromotion := len(sel.Index()) > 1
-		needsIndirection := !isPointer(recvType(obj)) && isPointer(sel.Recv())
-		if needsPromotion || needsIndirection {
-			fn = makeWrapper(prog, sel)
-		} else {
-			fn = prog.declaredFunc(obj)
-		}
-		if fn.Signature.Recv() == nil {
-			panic(fn) // missing receiver
-		}
-		mset.mapping[id] = fn
-	}
-	return fn
-}
-
-// RuntimeTypes returns a new unordered slice containing all
-// concrete types in the program for which a complete (non-empty)
-// method set is required at run-time.
-//
-// Thread-safe.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
-//
-func (prog *Program) RuntimeTypes() []types.Type {
-	prog.methodsMu.Lock()
-	defer prog.methodsMu.Unlock()
-
-	var res []types.Type
-	prog.methodSets.Iterate(func(T types.Type, v interface{}) {
-		if v.(*methodSet).complete {
-			res = append(res, T)
-		}
-	})
-	return res
-}
-
-// declaredFunc returns the concrete function/method denoted by obj.
-// Panic ensues if there is none.
-//
-func (prog *Program) declaredFunc(obj *types.Func) *Function {
-	if v := prog.packageLevelValue(obj); v != nil {
-		return v.(*Function)
-	}
-	panic("no concrete method: " + obj.String())
-}
-
-// needMethodsOf ensures that runtime type information (including the
-// complete method set) is available for the specified type T and all
-// its subcomponents.
-//
-// needMethodsOf must be called for at least every type that is an
-// operand of some MakeInterface instruction, and for the type of
-// every exported package member.
-//
-// Precondition: T is not a method signature (*Signature with Recv()!=nil).
-//
-// Thread-safe.  (Called via emitConv from multiple builder goroutines.)
-//
-// TODO(adonovan): make this faster.  It accounts for 20% of SSA build time.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
-//
-func (prog *Program) needMethodsOf(T types.Type) {
-	prog.methodsMu.Lock()
-	prog.needMethods(T, false)
-	prog.methodsMu.Unlock()
-}
-
-// Precondition: T is not a method signature (*Signature with Recv()!=nil).
-// Recursive case: skip => don't create methods for T.
-//
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-//
-func (prog *Program) needMethods(T types.Type, skip bool) {
-	// Each package maintains its own set of types it has visited.
-	if prevSkip, ok := prog.runtimeTypes.At(T).(bool); ok {
-		// needMethods(T) was previously called
-		if !prevSkip || skip {
-			return // already seen, with same or false 'skip' value
-		}
-	}
-	prog.runtimeTypes.Set(T, skip)
-
-	tmset := prog.MethodSets.MethodSet(T)
-
-	if !skip && !isInterface(T) && tmset.Len() > 0 {
-		// Create methods of T.
-		mset := prog.createMethodSet(T)
-		if !mset.complete {
-			mset.complete = true
-			n := tmset.Len()
-			for i := 0; i < n; i++ {
-				prog.addMethod(mset, tmset.At(i))
-			}
-		}
-	}
-
-	// Recursion over signatures of each method.
-	for i := 0; i < tmset.Len(); i++ {
-		sig := tmset.At(i).Type().(*types.Signature)
-		prog.needMethods(sig.Params(), false)
-		prog.needMethods(sig.Results(), false)
-	}
-
-	switch t := T.(type) {
-	case *types.Basic:
-		// nop
-
-	case *types.Interface:
-		// nop---handled by recursion over method set.
-
-	case *types.Pointer:
-		prog.needMethods(t.Elem(), false)
-
-	case *types.Slice:
-		prog.needMethods(t.Elem(), false)
-
-	case *types.Chan:
-		prog.needMethods(t.Elem(), false)
-
-	case *types.Map:
-		prog.needMethods(t.Key(), false)
-		prog.needMethods(t.Elem(), false)
-
-	case *types.Signature:
-		if t.Recv() != nil {
-			panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv()))
-		}
-		prog.needMethods(t.Params(), false)
-		prog.needMethods(t.Results(), false)
-
-	case *types.Named:
-		// A pointer-to-named type can be derived from a named
-		// type via reflection.  It may have methods too.
-		prog.needMethods(types.NewPointer(T), false)
-
-		// Consider 'type T struct{S}' where S has methods.
-		// Reflection provides no way to get from T to struct{S},
-		// only to S, so the method set of struct{S} is unwanted,
-		// so set 'skip' flag during recursion.
-		prog.needMethods(t.Underlying(), true)
-
-	case *types.Array:
-		prog.needMethods(t.Elem(), false)
-
-	case *types.Struct:
-		for i, n := 0, t.NumFields(); i < n; i++ {
-			prog.needMethods(t.Field(i).Type(), false)
-		}
-
-	case *types.Tuple:
-		for i, n := 0, t.Len(); i < n; i++ {
-			prog.needMethods(t.At(i).Type(), false)
-		}
-
-	default:
-		panic(T)
-	}
-}
diff --git a/third_party/gotools/go/ssa/mode.go b/third_party/gotools/go/ssa/mode.go
deleted file mode 100644
index bbd613a..0000000
--- a/third_party/gotools/go/ssa/mode.go
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines the BuilderMode type and its command-line flag.
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-)
-
-// BuilderMode is a bitmask of options for diagnostics and checking.
-type BuilderMode uint
-
-const (
-	PrintPackages        BuilderMode = 1 << iota // Print package inventory to stdout
-	PrintFunctions                               // Print function SSA code to stdout
-	LogSource                                    // Log source locations as SSA builder progresses
-	SanityCheckFunctions                         // Perform sanity checking of function bodies
-	NaiveForm                                    // Build naïve SSA form: don't replace local loads/stores with registers
-	BuildSerially                                // Build packages serially, not in parallel.
-	GlobalDebug                                  // Enable debug info for all packages
-	BareInits                                    // Build init functions without guards or calls to dependent inits
-)
-
-const modeFlagUsage = `Options controlling the SSA builder.
-The value is a sequence of zero or more of these letters:
-C	perform sanity [C]hecking of the SSA form.
-D	include [D]ebug info for every function.
-P	print [P]ackage inventory.
-F	print [F]unction SSA code.
-S	log [S]ource locations as SSA builder progresses.
-L	build distinct packages seria[L]ly instead of in parallel.
-N	build [N]aive SSA form: don't replace local loads/stores with registers.
-I	build bare [I]nit functions: no init guards or calls to dependent inits.
-`
-
-// BuilderModeFlag creates a new command line flag of type BuilderMode,
-// adds it to the specified flag set, and returns it.
-//
-// Example:
-// 	var ssabuild = BuilderModeFlag(flag.CommandLine, "ssabuild", 0)
-//
-func BuilderModeFlag(set *flag.FlagSet, name string, value BuilderMode) *BuilderMode {
-	set.Var((*builderModeValue)(&value), name, modeFlagUsage)
-	return &value
-}
-
-type builderModeValue BuilderMode // satisfies flag.Value and flag.Getter.
-
-func (v *builderModeValue) Set(s string) error {
-	var mode BuilderMode
-	for _, c := range s {
-		switch c {
-		case 'D':
-			mode |= GlobalDebug
-		case 'P':
-			mode |= PrintPackages
-		case 'F':
-			mode |= PrintFunctions
-		case 'S':
-			mode |= LogSource | BuildSerially
-		case 'C':
-			mode |= SanityCheckFunctions
-		case 'N':
-			mode |= NaiveForm
-		case 'L':
-			mode |= BuildSerially
-		default:
-			return fmt.Errorf("unknown BuilderMode option: %q", c)
-		}
-	}
-	*v = builderModeValue(mode)
-	return nil
-}
-
-func (v *builderModeValue) Get() interface{} { return BuilderMode(*v) }
-
-func (v *builderModeValue) String() string {
-	mode := BuilderMode(*v)
-	var buf bytes.Buffer
-	if mode&GlobalDebug != 0 {
-		buf.WriteByte('D')
-	}
-	if mode&PrintPackages != 0 {
-		buf.WriteByte('P')
-	}
-	if mode&PrintFunctions != 0 {
-		buf.WriteByte('F')
-	}
-	if mode&LogSource != 0 {
-		buf.WriteByte('S')
-	}
-	if mode&SanityCheckFunctions != 0 {
-		buf.WriteByte('C')
-	}
-	if mode&NaiveForm != 0 {
-		buf.WriteByte('N')
-	}
-	if mode&BuildSerially != 0 {
-		buf.WriteByte('L')
-	}
-	return buf.String()
-}
diff --git a/third_party/gotools/go/ssa/print.go b/third_party/gotools/go/ssa/print.go
deleted file mode 100644
index 3b8bb21..0000000
--- a/third_party/gotools/go/ssa/print.go
+++ /dev/null
@@ -1,427 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file implements the String() methods for all Value and
-// Instruction types.
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"reflect"
-	"sort"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-)
-
-// relName returns the name of v relative to i.
-// In most cases, this is identical to v.Name(), but references to
-// Functions (including methods) and Globals use RelString and
-// all types are displayed with relType, so that only cross-package
-// references are package-qualified.
-//
-func relName(v Value, i Instruction) string {
-	var from *types.Package
-	if i != nil {
-		from = i.Parent().pkgobj()
-	}
-	switch v := v.(type) {
-	case Member: // *Function or *Global
-		return v.RelString(from)
-	case *Const:
-		return v.RelString(from)
-	}
-	return v.Name()
-}
-
-func relType(t types.Type, from *types.Package) string {
-	return types.TypeString(from, t)
-}
-
-func relString(m Member, from *types.Package) string {
-	// NB: not all globals have an Object (e.g. init$guard),
-	// so use Package().Object not Object.Package().
-	if obj := m.Package().Object; obj != nil && obj != from {
-		return fmt.Sprintf("%s.%s", obj.Path(), m.Name())
-	}
-	return m.Name()
-}
-
-// Value.String()
-//
-// This method is provided only for debugging.
-// It never appears in disassembly, which uses Value.Name().
-
-func (v *Parameter) String() string {
-	from := v.Parent().pkgobj()
-	return fmt.Sprintf("parameter %s : %s", v.Name(), relType(v.Type(), from))
-}
-
-func (v *FreeVar) String() string {
-	from := v.Parent().pkgobj()
-	return fmt.Sprintf("freevar %s : %s", v.Name(), relType(v.Type(), from))
-}
-
-func (v *Builtin) String() string {
-	return fmt.Sprintf("builtin %s", v.Name())
-}
-
-// Instruction.String()
-
-func (v *Alloc) String() string {
-	op := "local"
-	if v.Heap {
-		op = "new"
-	}
-	from := v.Parent().pkgobj()
-	return fmt.Sprintf("%s %s (%s)", op, relType(deref(v.Type()), from), v.Comment)
-}
-
-func (v *Phi) String() string {
-	var b bytes.Buffer
-	b.WriteString("phi [")
-	for i, edge := range v.Edges {
-		if i > 0 {
-			b.WriteString(", ")
-		}
-		// Be robust against malformed CFG.
-		block := -1
-		if v.block != nil && i < len(v.block.Preds) {
-			block = v.block.Preds[i].Index
-		}
-		fmt.Fprintf(&b, "%d: ", block)
-		edgeVal := "<nil>" // be robust
-		if edge != nil {
-			edgeVal = relName(edge, v)
-		}
-		b.WriteString(edgeVal)
-	}
-	b.WriteString("]")
-	if v.Comment != "" {
-		b.WriteString(" #")
-		b.WriteString(v.Comment)
-	}
-	return b.String()
-}
-
-func printCall(v *CallCommon, prefix string, instr Instruction) string {
-	var b bytes.Buffer
-	b.WriteString(prefix)
-	if !v.IsInvoke() {
-		b.WriteString(relName(v.Value, instr))
-	} else {
-		fmt.Fprintf(&b, "invoke %s.%s", relName(v.Value, instr), v.Method.Name())
-	}
-	b.WriteString("(")
-	for i, arg := range v.Args {
-		if i > 0 {
-			b.WriteString(", ")
-		}
-		b.WriteString(relName(arg, instr))
-	}
-	if v.Signature().Variadic() {
-		b.WriteString("...")
-	}
-	b.WriteString(")")
-	return b.String()
-}
-
-func (c *CallCommon) String() string {
-	return printCall(c, "", nil)
-}
-
-func (v *Call) String() string {
-	return printCall(&v.Call, "", v)
-}
-
-func (v *BinOp) String() string {
-	return fmt.Sprintf("%s %s %s", relName(v.X, v), v.Op.String(), relName(v.Y, v))
-}
-
-func (v *UnOp) String() string {
-	return fmt.Sprintf("%s%s%s", v.Op, relName(v.X, v), commaOk(v.CommaOk))
-}
-
-func printConv(prefix string, v, x Value) string {
-	from := v.Parent().pkgobj()
-	return fmt.Sprintf("%s %s <- %s (%s)",
-		prefix,
-		relType(v.Type(), from),
-		relType(x.Type(), from),
-		relName(x, v.(Instruction)))
-}
-
-func (v *ChangeType) String() string      { return printConv("changetype", v, v.X) }
-func (v *Convert) String() string         { return printConv("convert", v, v.X) }
-func (v *ChangeInterface) String() string { return printConv("change interface", v, v.X) }
-func (v *MakeInterface) String() string   { return printConv("make", v, v.X) }
-
-func (v *MakeClosure) String() string {
-	var b bytes.Buffer
-	fmt.Fprintf(&b, "make closure %s", relName(v.Fn, v))
-	if v.Bindings != nil {
-		b.WriteString(" [")
-		for i, c := range v.Bindings {
-			if i > 0 {
-				b.WriteString(", ")
-			}
-			b.WriteString(relName(c, v))
-		}
-		b.WriteString("]")
-	}
-	return b.String()
-}
-
-func (v *MakeSlice) String() string {
-	from := v.Parent().pkgobj()
-	return fmt.Sprintf("make %s %s %s",
-		relType(v.Type(), from),
-		relName(v.Len, v),
-		relName(v.Cap, v))
-}
-
-func (v *Slice) String() string {
-	var b bytes.Buffer
-	b.WriteString("slice ")
-	b.WriteString(relName(v.X, v))
-	b.WriteString("[")
-	if v.Low != nil {
-		b.WriteString(relName(v.Low, v))
-	}
-	b.WriteString(":")
-	if v.High != nil {
-		b.WriteString(relName(v.High, v))
-	}
-	if v.Max != nil {
-		b.WriteString(":")
-		b.WriteString(relName(v.Max, v))
-	}
-	b.WriteString("]")
-	return b.String()
-}
-
-func (v *MakeMap) String() string {
-	res := ""
-	if v.Reserve != nil {
-		res = relName(v.Reserve, v)
-	}
-	from := v.Parent().pkgobj()
-	return fmt.Sprintf("make %s %s", relType(v.Type(), from), res)
-}
-
-func (v *MakeChan) String() string {
-	from := v.Parent().pkgobj()
-	return fmt.Sprintf("make %s %s", relType(v.Type(), from), relName(v.Size, v))
-}
-
-func (v *FieldAddr) String() string {
-	st := deref(v.X.Type()).Underlying().(*types.Struct)
-	// Be robust against a bad index.
-	name := "?"
-	if 0 <= v.Field && v.Field < st.NumFields() {
-		name = st.Field(v.Field).Name()
-	}
-	return fmt.Sprintf("&%s.%s [#%d]", relName(v.X, v), name, v.Field)
-}
-
-func (v *Field) String() string {
-	st := v.X.Type().Underlying().(*types.Struct)
-	// Be robust against a bad index.
-	name := "?"
-	if 0 <= v.Field && v.Field < st.NumFields() {
-		name = st.Field(v.Field).Name()
-	}
-	return fmt.Sprintf("%s.%s [#%d]", relName(v.X, v), name, v.Field)
-}
-
-func (v *IndexAddr) String() string {
-	return fmt.Sprintf("&%s[%s]", relName(v.X, v), relName(v.Index, v))
-}
-
-func (v *Index) String() string {
-	return fmt.Sprintf("%s[%s]", relName(v.X, v), relName(v.Index, v))
-}
-
-func (v *Lookup) String() string {
-	return fmt.Sprintf("%s[%s]%s", relName(v.X, v), relName(v.Index, v), commaOk(v.CommaOk))
-}
-
-func (v *Range) String() string {
-	return "range " + relName(v.X, v)
-}
-
-func (v *Next) String() string {
-	return "next " + relName(v.Iter, v)
-}
-
-func (v *TypeAssert) String() string {
-	from := v.Parent().pkgobj()
-	return fmt.Sprintf("typeassert%s %s.(%s)", commaOk(v.CommaOk), relName(v.X, v), relType(v.AssertedType, from))
-}
-
-func (v *Extract) String() string {
-	return fmt.Sprintf("extract %s #%d", relName(v.Tuple, v), v.Index)
-}
-
-func (s *Jump) String() string {
-	// Be robust against malformed CFG.
-	block := -1
-	if s.block != nil && len(s.block.Succs) == 1 {
-		block = s.block.Succs[0].Index
-	}
-	return fmt.Sprintf("jump %d", block)
-}
-
-func (s *If) String() string {
-	// Be robust against malformed CFG.
-	tblock, fblock := -1, -1
-	if s.block != nil && len(s.block.Succs) == 2 {
-		tblock = s.block.Succs[0].Index
-		fblock = s.block.Succs[1].Index
-	}
-	return fmt.Sprintf("if %s goto %d else %d", relName(s.Cond, s), tblock, fblock)
-}
-
-func (s *Go) String() string {
-	return printCall(&s.Call, "go ", s)
-}
-
-func (s *Panic) String() string {
-	return "panic " + relName(s.X, s)
-}
-
-func (s *Return) String() string {
-	var b bytes.Buffer
-	b.WriteString("return")
-	for i, r := range s.Results {
-		if i == 0 {
-			b.WriteString(" ")
-		} else {
-			b.WriteString(", ")
-		}
-		b.WriteString(relName(r, s))
-	}
-	return b.String()
-}
-
-func (*RunDefers) String() string {
-	return "rundefers"
-}
-
-func (s *Send) String() string {
-	return fmt.Sprintf("send %s <- %s", relName(s.Chan, s), relName(s.X, s))
-}
-
-func (s *Defer) String() string {
-	return printCall(&s.Call, "defer ", s)
-}
-
-func (s *Select) String() string {
-	var b bytes.Buffer
-	for i, st := range s.States {
-		if i > 0 {
-			b.WriteString(", ")
-		}
-		if st.Dir == types.RecvOnly {
-			b.WriteString("<-")
-			b.WriteString(relName(st.Chan, s))
-		} else {
-			b.WriteString(relName(st.Chan, s))
-			b.WriteString("<-")
-			b.WriteString(relName(st.Send, s))
-		}
-	}
-	non := ""
-	if !s.Blocking {
-		non = "non"
-	}
-	return fmt.Sprintf("select %sblocking [%s]", non, b.String())
-}
-
-func (s *Store) String() string {
-	return fmt.Sprintf("*%s = %s", relName(s.Addr, s), relName(s.Val, s))
-}
-
-func (s *MapUpdate) String() string {
-	return fmt.Sprintf("%s[%s] = %s", relName(s.Map, s), relName(s.Key, s), relName(s.Value, s))
-}
-
-func (s *DebugRef) String() string {
-	p := s.Parent().Prog.Fset.Position(s.Pos())
-	var descr interface{}
-	if s.object != nil {
-		descr = s.object // e.g. "var x int"
-	} else {
-		descr = reflect.TypeOf(s.Expr) // e.g. "*ast.CallExpr"
-	}
-	var addr string
-	if s.IsAddr {
-		addr = "address of "
-	}
-	return fmt.Sprintf("; %s%s @ %d:%d is %s", addr, descr, p.Line, p.Column, s.X.Name())
-}
-
-func (p *Package) String() string {
-	return "package " + p.Object.Path()
-}
-
-var _ io.WriterTo = (*Package)(nil) // *Package implements io.Writer
-
-func (p *Package) WriteTo(w io.Writer) (int64, error) {
-	var buf bytes.Buffer
-	WritePackage(&buf, p)
-	n, err := w.Write(buf.Bytes())
-	return int64(n), err
-}
-
-// WritePackage writes to buf a human-readable summary of p.
-func WritePackage(buf *bytes.Buffer, p *Package) {
-	fmt.Fprintf(buf, "%s:\n", p)
-
-	var names []string
-	maxname := 0
-	for name := range p.Members {
-		if l := len(name); l > maxname {
-			maxname = l
-		}
-		names = append(names, name)
-	}
-
-	from := p.Object
-	sort.Strings(names)
-	for _, name := range names {
-		switch mem := p.Members[name].(type) {
-		case *NamedConst:
-			fmt.Fprintf(buf, "  const %-*s %s = %s\n",
-				maxname, name, mem.Name(), mem.Value.RelString(from))
-
-		case *Function:
-			fmt.Fprintf(buf, "  func  %-*s %s\n",
-				maxname, name, relType(mem.Type(), from))
-
-		case *Type:
-			fmt.Fprintf(buf, "  type  %-*s %s\n",
-				maxname, name, relType(mem.Type().Underlying(), from))
-			for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) {
-				fmt.Fprintf(buf, "    %s\n", types.SelectionString(from, meth))
-			}
-
-		case *Global:
-			fmt.Fprintf(buf, "  var   %-*s %s\n",
-				maxname, name, relType(mem.Type().(*types.Pointer).Elem(), from))
-		}
-	}
-
-	fmt.Fprintf(buf, "\n")
-}
-
-func commaOk(x bool) string {
-	if x {
-		return ",ok"
-	}
-	return ""
-}
diff --git a/third_party/gotools/go/ssa/sanity.go b/third_party/gotools/go/ssa/sanity.go
deleted file mode 100644
index 81ed6d0..0000000
--- a/third_party/gotools/go/ssa/sanity.go
+++ /dev/null
@@ -1,520 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// An optional pass for sanity-checking invariants of the SSA representation.
-// Currently it checks CFG invariants but little at the instruction level.
-
-import (
-	"fmt"
-	"io"
-	"os"
-	"strings"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-type sanity struct {
-	reporter io.Writer
-	fn       *Function
-	block    *BasicBlock
-	instrs   map[Instruction]struct{}
-	insane   bool
-}
-
-// sanityCheck performs integrity checking of the SSA representation
-// of the function fn and returns true if it was valid.  Diagnostics
-// are written to reporter if non-nil, os.Stderr otherwise.  Some
-// diagnostics are only warnings and do not imply a negative result.
-//
-// Sanity-checking is intended to facilitate the debugging of code
-// transformation passes.
-//
-func sanityCheck(fn *Function, reporter io.Writer) bool {
-	if reporter == nil {
-		reporter = os.Stderr
-	}
-	return (&sanity{reporter: reporter}).checkFunction(fn)
-}
-
-// mustSanityCheck is like sanityCheck but panics instead of returning
-// a negative result.
-//
-func mustSanityCheck(fn *Function, reporter io.Writer) {
-	if !sanityCheck(fn, reporter) {
-		fn.WriteTo(os.Stderr)
-		panic("SanityCheck failed")
-	}
-}
-
-func (s *sanity) diagnostic(prefix, format string, args ...interface{}) {
-	fmt.Fprintf(s.reporter, "%s: function %s", prefix, s.fn)
-	if s.block != nil {
-		fmt.Fprintf(s.reporter, ", block %s", s.block)
-	}
-	io.WriteString(s.reporter, ": ")
-	fmt.Fprintf(s.reporter, format, args...)
-	io.WriteString(s.reporter, "\n")
-}
-
-func (s *sanity) errorf(format string, args ...interface{}) {
-	s.insane = true
-	s.diagnostic("Error", format, args...)
-}
-
-func (s *sanity) warnf(format string, args ...interface{}) {
-	s.diagnostic("Warning", format, args...)
-}
-
-// findDuplicate returns an arbitrary basic block that appeared more
-// than once in blocks, or nil if all were unique.
-func findDuplicate(blocks []*BasicBlock) *BasicBlock {
-	if len(blocks) < 2 {
-		return nil
-	}
-	if blocks[0] == blocks[1] {
-		return blocks[0]
-	}
-	// Slow path:
-	m := make(map[*BasicBlock]bool)
-	for _, b := range blocks {
-		if m[b] {
-			return b
-		}
-		m[b] = true
-	}
-	return nil
-}
-
-func (s *sanity) checkInstr(idx int, instr Instruction) {
-	switch instr := instr.(type) {
-	case *If, *Jump, *Return, *Panic:
-		s.errorf("control flow instruction not at end of block")
-	case *Phi:
-		if idx == 0 {
-			// It suffices to apply this check to just the first phi node.
-			if dup := findDuplicate(s.block.Preds); dup != nil {
-				s.errorf("phi node in block with duplicate predecessor %s", dup)
-			}
-		} else {
-			prev := s.block.Instrs[idx-1]
-			if _, ok := prev.(*Phi); !ok {
-				s.errorf("Phi instruction follows a non-Phi: %T", prev)
-			}
-		}
-		if ne, np := len(instr.Edges), len(s.block.Preds); ne != np {
-			s.errorf("phi node has %d edges but %d predecessors", ne, np)
-
-		} else {
-			for i, e := range instr.Edges {
-				if e == nil {
-					s.errorf("phi node '%s' has no value for edge #%d from %s", instr.Comment, i, s.block.Preds[i])
-				}
-			}
-		}
-
-	case *Alloc:
-		if !instr.Heap {
-			found := false
-			for _, l := range s.fn.Locals {
-				if l == instr {
-					found = true
-					break
-				}
-			}
-			if !found {
-				s.errorf("local alloc %s = %s does not appear in Function.Locals", instr.Name(), instr)
-			}
-		}
-
-	case *BinOp:
-	case *Call:
-	case *ChangeInterface:
-	case *ChangeType:
-	case *Convert:
-		if _, ok := instr.X.Type().Underlying().(*types.Basic); !ok {
-			if _, ok := instr.Type().Underlying().(*types.Basic); !ok {
-				s.errorf("convert %s -> %s: at least one type must be basic", instr.X.Type(), instr.Type())
-			}
-		}
-
-	case *Defer:
-	case *Extract:
-	case *Field:
-	case *FieldAddr:
-	case *Go:
-	case *Index:
-	case *IndexAddr:
-	case *Lookup:
-	case *MakeChan:
-	case *MakeClosure:
-		numFree := len(instr.Fn.(*Function).FreeVars)
-		numBind := len(instr.Bindings)
-		if numFree != numBind {
-			s.errorf("MakeClosure has %d Bindings for function %s with %d free vars",
-				numBind, instr.Fn, numFree)
-
-		}
-		if recv := instr.Type().(*types.Signature).Recv(); recv != nil {
-			s.errorf("MakeClosure's type includes receiver %s", recv.Type())
-		}
-
-	case *MakeInterface:
-	case *MakeMap:
-	case *MakeSlice:
-	case *MapUpdate:
-	case *Next:
-	case *Range:
-	case *RunDefers:
-	case *Select:
-	case *Send:
-	case *Slice:
-	case *Store:
-	case *TypeAssert:
-	case *UnOp:
-	case *DebugRef:
-		// TODO(adonovan): implement checks.
-	default:
-		panic(fmt.Sprintf("Unknown instruction type: %T", instr))
-	}
-
-	if call, ok := instr.(CallInstruction); ok {
-		if call.Common().Signature() == nil {
-			s.errorf("nil signature: %s", call)
-		}
-	}
-
-	// Check that value-defining instructions have valid types
-	// and a valid referrer list.
-	if v, ok := instr.(Value); ok {
-		t := v.Type()
-		if t == nil {
-			s.errorf("no type: %s = %s", v.Name(), v)
-		} else if t == tRangeIter {
-			// not a proper type; ignore.
-		} else if b, ok := t.Underlying().(*types.Basic); ok && b.Info()&types.IsUntyped != 0 {
-			s.errorf("instruction has 'untyped' result: %s = %s : %s", v.Name(), v, t)
-		}
-		s.checkReferrerList(v)
-	}
-
-	// Untyped constants are legal as instruction Operands(),
-	// for example:
-	//   _ = "foo"[0]
-	// or:
-	//   if wordsize==64 {...}
-
-	// All other non-Instruction Values can be found via their
-	// enclosing Function or Package.
-}
-
-func (s *sanity) checkFinalInstr(idx int, instr Instruction) {
-	switch instr := instr.(type) {
-	case *If:
-		if nsuccs := len(s.block.Succs); nsuccs != 2 {
-			s.errorf("If-terminated block has %d successors; expected 2", nsuccs)
-			return
-		}
-		if s.block.Succs[0] == s.block.Succs[1] {
-			s.errorf("If-instruction has same True, False target blocks: %s", s.block.Succs[0])
-			return
-		}
-
-	case *Jump:
-		if nsuccs := len(s.block.Succs); nsuccs != 1 {
-			s.errorf("Jump-terminated block has %d successors; expected 1", nsuccs)
-			return
-		}
-
-	case *Return:
-		if nsuccs := len(s.block.Succs); nsuccs != 0 {
-			s.errorf("Return-terminated block has %d successors; expected none", nsuccs)
-			return
-		}
-		if na, nf := len(instr.Results), s.fn.Signature.Results().Len(); nf != na {
-			s.errorf("%d-ary return in %d-ary function", na, nf)
-		}
-
-	case *Panic:
-		if nsuccs := len(s.block.Succs); nsuccs != 0 {
-			s.errorf("Panic-terminated block has %d successors; expected none", nsuccs)
-			return
-		}
-
-	default:
-		s.errorf("non-control flow instruction at end of block")
-	}
-}
-
-func (s *sanity) checkBlock(b *BasicBlock, index int) {
-	s.block = b
-
-	if b.Index != index {
-		s.errorf("block has incorrect Index %d", b.Index)
-	}
-	if b.parent != s.fn {
-		s.errorf("block has incorrect parent %s", b.parent)
-	}
-
-	// Check all blocks are reachable.
-	// (The entry block is always implicitly reachable,
-	// as is the Recover block, if any.)
-	if (index > 0 && b != b.parent.Recover) && len(b.Preds) == 0 {
-		s.warnf("unreachable block")
-		if b.Instrs == nil {
-			// Since this block is about to be pruned,
-			// tolerating transient problems in it
-			// simplifies other optimizations.
-			return
-		}
-	}
-
-	// Check predecessor and successor relations are dual,
-	// and that all blocks in CFG belong to same function.
-	for _, a := range b.Preds {
-		found := false
-		for _, bb := range a.Succs {
-			if bb == b {
-				found = true
-				break
-			}
-		}
-		if !found {
-			s.errorf("expected successor edge in predecessor %s; found only: %s", a, a.Succs)
-		}
-		if a.parent != s.fn {
-			s.errorf("predecessor %s belongs to different function %s", a, a.parent)
-		}
-	}
-	for _, c := range b.Succs {
-		found := false
-		for _, bb := range c.Preds {
-			if bb == b {
-				found = true
-				break
-			}
-		}
-		if !found {
-			s.errorf("expected predecessor edge in successor %s; found only: %s", c, c.Preds)
-		}
-		if c.parent != s.fn {
-			s.errorf("successor %s belongs to different function %s", c, c.parent)
-		}
-	}
-
-	// Check each instruction is sane.
-	n := len(b.Instrs)
-	if n == 0 {
-		s.errorf("basic block contains no instructions")
-	}
-	var rands [10]*Value // reuse storage
-	for j, instr := range b.Instrs {
-		if instr == nil {
-			s.errorf("nil instruction at index %d", j)
-			continue
-		}
-		if b2 := instr.Block(); b2 == nil {
-			s.errorf("nil Block() for instruction at index %d", j)
-			continue
-		} else if b2 != b {
-			s.errorf("wrong Block() (%s) for instruction at index %d ", b2, j)
-			continue
-		}
-		if j < n-1 {
-			s.checkInstr(j, instr)
-		} else {
-			s.checkFinalInstr(j, instr)
-		}
-
-		// Check Instruction.Operands.
-	operands:
-		for i, op := range instr.Operands(rands[:0]) {
-			if op == nil {
-				s.errorf("nil operand pointer %d of %s", i, instr)
-				continue
-			}
-			val := *op
-			if val == nil {
-				continue // a nil operand is ok
-			}
-
-			// Check that "untyped" types only appear on constant operands.
-			if _, ok := (*op).(*Const); !ok {
-				if basic, ok := (*op).Type().(*types.Basic); ok {
-					if basic.Info()&types.IsUntyped != 0 {
-						s.errorf("operand #%d of %s is untyped: %s", i, instr, basic)
-					}
-				}
-			}
-
-			// Check that Operands that are also Instructions belong to same function.
-			// TODO(adonovan): also check their block dominates block b.
-			if val, ok := val.(Instruction); ok {
-				if val.Parent() != s.fn {
-					s.errorf("operand %d of %s is an instruction (%s) from function %s", i, instr, val, val.Parent())
-				}
-			}
-
-			// Check that each function-local operand of
-			// instr refers back to instr.  (NB: quadratic)
-			switch val := val.(type) {
-			case *Const, *Global, *Builtin:
-				continue // not local
-			case *Function:
-				if val.parent == nil {
-					continue // only anon functions are local
-				}
-			}
-
-			// TODO(adonovan): check val.Parent() != nil <=> val.Referrers() is defined.
-
-			if refs := val.Referrers(); refs != nil {
-				for _, ref := range *refs {
-					if ref == instr {
-						continue operands
-					}
-				}
-				s.errorf("operand %d of %s (%s) does not refer to us", i, instr, val)
-			} else {
-				s.errorf("operand %d of %s (%s) has no referrers", i, instr, val)
-			}
-		}
-	}
-}
-
-func (s *sanity) checkReferrerList(v Value) {
-	refs := v.Referrers()
-	if refs == nil {
-		s.errorf("%s has missing referrer list", v.Name())
-		return
-	}
-	for i, ref := range *refs {
-		if _, ok := s.instrs[ref]; !ok {
-			s.errorf("%s.Referrers()[%d] = %s is not an instruction belonging to this function", v.Name(), i, ref)
-		}
-	}
-}
-
-func (s *sanity) checkFunction(fn *Function) bool {
-	// TODO(adonovan): check Function invariants:
-	// - check params match signature
-	// - check transient fields are nil
-	// - warn if any fn.Locals do not appear among block instructions.
-	s.fn = fn
-	if fn.Prog == nil {
-		s.errorf("nil Prog")
-	}
-
-	fn.String()               // must not crash
-	fn.RelString(fn.pkgobj()) // must not crash
-
-	// All functions have a package, except delegates (which are
-	// shared across packages, or duplicated as weak symbols in a
-	// separate-compilation model), and error.Error.
-	if fn.Pkg == nil {
-		if strings.HasPrefix(fn.Synthetic, "wrapper ") ||
-			strings.HasPrefix(fn.Synthetic, "bound ") ||
-			strings.HasPrefix(fn.Synthetic, "thunk ") ||
-			strings.HasSuffix(fn.name, "Error") {
-			// ok
-		} else {
-			s.errorf("nil Pkg")
-		}
-	}
-	if src, syn := fn.Synthetic == "", fn.Syntax() != nil; src != syn {
-		s.errorf("got fromSource=%t, hasSyntax=%t; want same values", src, syn)
-	}
-	for i, l := range fn.Locals {
-		if l.Parent() != fn {
-			s.errorf("Local %s at index %d has wrong parent", l.Name(), i)
-		}
-		if l.Heap {
-			s.errorf("Local %s at index %d has Heap flag set", l.Name(), i)
-		}
-	}
-	// Build the set of valid referrers.
-	s.instrs = make(map[Instruction]struct{})
-	for _, b := range fn.Blocks {
-		for _, instr := range b.Instrs {
-			s.instrs[instr] = struct{}{}
-		}
-	}
-	for i, p := range fn.Params {
-		if p.Parent() != fn {
-			s.errorf("Param %s at index %d has wrong parent", p.Name(), i)
-		}
-		s.checkReferrerList(p)
-	}
-	for i, fv := range fn.FreeVars {
-		if fv.Parent() != fn {
-			s.errorf("FreeVar %s at index %d has wrong parent", fv.Name(), i)
-		}
-		s.checkReferrerList(fv)
-	}
-
-	if fn.Blocks != nil && len(fn.Blocks) == 0 {
-		// Function _had_ blocks (so it's not external) but
-		// they were "optimized" away, even the entry block.
-		s.errorf("Blocks slice is non-nil but empty")
-	}
-	for i, b := range fn.Blocks {
-		if b == nil {
-			s.warnf("nil *BasicBlock at f.Blocks[%d]", i)
-			continue
-		}
-		s.checkBlock(b, i)
-	}
-	if fn.Recover != nil && fn.Blocks[fn.Recover.Index] != fn.Recover {
-		s.errorf("Recover block is not in Blocks slice")
-	}
-
-	s.block = nil
-	for i, anon := range fn.AnonFuncs {
-		if anon.Parent() != fn {
-			s.errorf("AnonFuncs[%d]=%s but %s.Parent()=%s", i, anon, anon, anon.Parent())
-		}
-	}
-	s.fn = nil
-	return !s.insane
-}
-
-// sanityCheckPackage checks invariants of packages upon creation.
-// It does not require that the package is built.
-// Unlike sanityCheck (for functions), it just panics at the first error.
-func sanityCheckPackage(pkg *Package) {
-	if pkg.Object == nil {
-		panic(fmt.Sprintf("Package %s has no Object", pkg))
-	}
-	pkg.String() // must not crash
-
-	for name, mem := range pkg.Members {
-		if name != mem.Name() {
-			panic(fmt.Sprintf("%s: %T.Name() = %s, want %s",
-				pkg.Object.Path(), mem, mem.Name(), name))
-		}
-		obj := mem.Object()
-		if obj == nil {
-			// This check is sound because fields
-			// {Global,Function}.object have type
-			// types.Object.  (If they were declared as
-			// *types.{Var,Func}, we'd have a non-empty
-			// interface containing a nil pointer.)
-
-			continue // not all members have typechecker objects
-		}
-		if obj.Name() != name {
-			if obj.Name() == "init" && strings.HasPrefix(mem.Name(), "init#") {
-				// Ok.  The name of a declared init function varies between
-				// its types.Func ("init") and its ssa.Function ("init#%d").
-			} else {
-				panic(fmt.Sprintf("%s: %T.Object().Name() = %s, want %s",
-					pkg.Object.Path(), mem, obj.Name(), name))
-			}
-		}
-		if obj.Pos() != mem.Pos() {
-			panic(fmt.Sprintf("%s Pos=%d obj.Pos=%d", mem, mem.Pos(), obj.Pos()))
-		}
-	}
-}
diff --git a/third_party/gotools/go/ssa/source.go b/third_party/gotools/go/ssa/source.go
deleted file mode 100644
index eac8907..0000000
--- a/third_party/gotools/go/ssa/source.go
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines utilities for working with source positions
-// or source-level named entities ("objects").
-
-// TODO(adonovan): test that {Value,Instruction}.Pos() positions match
-// the originating syntax, as specified.
-
-import (
-	"go/ast"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// EnclosingFunction returns the function that contains the syntax
-// node denoted by path.
-//
-// Syntax associated with package-level variable specifications is
-// enclosed by the package's init() function.
-//
-// Returns nil if not found; reasons might include:
-//    - the node is not enclosed by any function.
-//    - the node is within an anonymous function (FuncLit) and
-//      its SSA function has not been created yet
-//      (pkg.Build() has not yet been called).
-//
-func EnclosingFunction(pkg *Package, path []ast.Node) *Function {
-	// Start with package-level function...
-	fn := findEnclosingPackageLevelFunction(pkg, path)
-	if fn == nil {
-		return nil // not in any function
-	}
-
-	// ...then walk down the nested anonymous functions.
-	n := len(path)
-outer:
-	for i := range path {
-		if lit, ok := path[n-1-i].(*ast.FuncLit); ok {
-			for _, anon := range fn.AnonFuncs {
-				if anon.Pos() == lit.Type.Func {
-					fn = anon
-					continue outer
-				}
-			}
-			// SSA function not found:
-			// - package not yet built, or maybe
-			// - builder skipped FuncLit in dead block
-			//   (in principle; but currently the Builder
-			//   generates even dead FuncLits).
-			return nil
-		}
-	}
-	return fn
-}
-
-// HasEnclosingFunction returns true if the AST node denoted by path
-// is contained within the declaration of some function or
-// package-level variable.
-//
-// Unlike EnclosingFunction, the behaviour of this function does not
-// depend on whether SSA code for pkg has been built, so it can be
-// used to quickly reject check inputs that will cause
-// EnclosingFunction to fail, prior to SSA building.
-//
-func HasEnclosingFunction(pkg *Package, path []ast.Node) bool {
-	return findEnclosingPackageLevelFunction(pkg, path) != nil
-}
-
-// findEnclosingPackageLevelFunction returns the Function
-// corresponding to the package-level function enclosing path.
-//
-func findEnclosingPackageLevelFunction(pkg *Package, path []ast.Node) *Function {
-	if n := len(path); n >= 2 { // [... {Gen,Func}Decl File]
-		switch decl := path[n-2].(type) {
-		case *ast.GenDecl:
-			if decl.Tok == token.VAR && n >= 3 {
-				// Package-level 'var' initializer.
-				return pkg.init
-			}
-
-		case *ast.FuncDecl:
-			if decl.Recv == nil && decl.Name.Name == "init" {
-				// Explicit init() function.
-				for _, b := range pkg.init.Blocks {
-					for _, instr := range b.Instrs {
-						if instr, ok := instr.(*Call); ok {
-							if callee, ok := instr.Call.Value.(*Function); ok && callee.Pkg == pkg && callee.Pos() == decl.Name.NamePos {
-								return callee
-							}
-						}
-					}
-				}
-				// Hack: return non-nil when SSA is not yet
-				// built so that HasEnclosingFunction works.
-				return pkg.init
-			}
-			// Declared function/method.
-			return findNamedFunc(pkg, decl.Name.NamePos)
-		}
-	}
-	return nil // not in any function
-}
-
-// findNamedFunc returns the named function whose FuncDecl.Ident is at
-// position pos.
-//
-func findNamedFunc(pkg *Package, pos token.Pos) *Function {
-	// Look at all package members and method sets of named types.
-	// Not very efficient.
-	for _, mem := range pkg.Members {
-		switch mem := mem.(type) {
-		case *Function:
-			if mem.Pos() == pos {
-				return mem
-			}
-		case *Type:
-			mset := pkg.Prog.MethodSets.MethodSet(types.NewPointer(mem.Type()))
-			for i, n := 0, mset.Len(); i < n; i++ {
-				// Don't call Program.Method: avoid creating wrappers.
-				obj := mset.At(i).Obj().(*types.Func)
-				if obj.Pos() == pos {
-					return pkg.values[obj].(*Function)
-				}
-			}
-		}
-	}
-	return nil
-}
-
-// ValueForExpr returns the SSA Value that corresponds to non-constant
-// expression e.
-//
-// It returns nil if no value was found, e.g.
-//    - the expression is not lexically contained within f;
-//    - f was not built with debug information; or
-//    - e is a constant expression.  (For efficiency, no debug
-//      information is stored for constants. Use
-//      loader.PackageInfo.ValueOf(e) instead.)
-//    - e is a reference to nil or a built-in function.
-//    - the value was optimised away.
-//
-// If e is an addressable expression used in an lvalue context,
-// value is the address denoted by e, and isAddr is true.
-//
-// The types of e (or &e, if isAddr) and the result are equal
-// (modulo "untyped" bools resulting from comparisons).
-//
-// (Tip: to find the ssa.Value given a source position, use
-// importer.PathEnclosingInterval to locate the ast.Node, then
-// EnclosingFunction to locate the Function, then ValueForExpr to find
-// the ssa.Value.)
-//
-func (f *Function) ValueForExpr(e ast.Expr) (value Value, isAddr bool) {
-	if f.debugInfo() { // (opt)
-		e = unparen(e)
-		for _, b := range f.Blocks {
-			for _, instr := range b.Instrs {
-				if ref, ok := instr.(*DebugRef); ok {
-					if ref.Expr == e {
-						return ref.X, ref.IsAddr
-					}
-				}
-			}
-		}
-	}
-	return
-}
-
-// --- Lookup functions for source-level named entities (types.Objects) ---
-
-// Package returns the SSA Package corresponding to the specified
-// type-checker package object.
-// It returns nil if no such SSA package has been created.
-//
-func (prog *Program) Package(obj *types.Package) *Package {
-	return prog.packages[obj]
-}
-
-// packageLevelValue returns the package-level value corresponding to
-// the specified named object, which may be a package-level const
-// (*Const), var (*Global) or func (*Function) of some package in
-// prog.  It returns nil if the object is not found.
-//
-func (prog *Program) packageLevelValue(obj types.Object) Value {
-	if pkg, ok := prog.packages[obj.Pkg()]; ok {
-		return pkg.values[obj]
-	}
-	return nil
-}
-
-// FuncValue returns the concrete Function denoted by the source-level
-// named function obj, or nil if obj denotes an interface method.
-//
-// TODO(adonovan): check the invariant that obj.Type() matches the
-// result's Signature, both in the params/results and in the receiver.
-//
-func (prog *Program) FuncValue(obj *types.Func) *Function {
-	fn, _ := prog.packageLevelValue(obj).(*Function)
-	return fn
-}
-
-// ConstValue returns the SSA Value denoted by the source-level named
-// constant obj.
-//
-func (prog *Program) ConstValue(obj *types.Const) *Const {
-	// TODO(adonovan): opt: share (don't reallocate)
-	// Consts for const objects and constant ast.Exprs.
-
-	// Universal constant? {true,false,nil}
-	if obj.Parent() == types.Universe {
-		return NewConst(obj.Val(), obj.Type())
-	}
-	// Package-level named constant?
-	if v := prog.packageLevelValue(obj); v != nil {
-		return v.(*Const)
-	}
-	return NewConst(obj.Val(), obj.Type())
-}
-
-// VarValue returns the SSA Value that corresponds to a specific
-// identifier denoting the source-level named variable obj.
-//
-// VarValue returns nil if a local variable was not found, perhaps
-// because its package was not built, the debug information was not
-// requested during SSA construction, or the value was optimized away.
-//
-// ref is the path to an ast.Ident (e.g. from PathEnclosingInterval),
-// and that ident must resolve to obj.
-//
-// pkg is the package enclosing the reference.  (A reference to a var
-// always occurs within a function, so we need to know where to find it.)
-//
-// If the identifier is a field selector and its base expression is
-// non-addressable, then VarValue returns the value of that field.
-// For example:
-//    func f() struct {x int}
-//    f().x  // VarValue(x) returns a *Field instruction of type int
-//
-// All other identifiers denote addressable locations (variables).
-// For them, VarValue may return either the variable's address or its
-// value, even when the expression is evaluated only for its value; the
-// situation is reported by isAddr, the second component of the result.
-//
-// If !isAddr, the returned value is the one associated with the
-// specific identifier.  For example,
-//       var x int    // VarValue(x) returns Const 0 here
-//       x = 1        // VarValue(x) returns Const 1 here
-//
-// It is not specified whether the value or the address is returned in
-// any particular case, as it may depend upon optimizations performed
-// during SSA code generation, such as registerization, constant
-// folding, avoidance of materialization of subexpressions, etc.
-//
-func (prog *Program) VarValue(obj *types.Var, pkg *Package, ref []ast.Node) (value Value, isAddr bool) {
-	// All references to a var are local to some function, possibly init.
-	fn := EnclosingFunction(pkg, ref)
-	if fn == nil {
-		return // e.g. def of struct field; SSA not built?
-	}
-
-	id := ref[0].(*ast.Ident)
-
-	// Defining ident of a parameter?
-	if id.Pos() == obj.Pos() {
-		for _, param := range fn.Params {
-			if param.Object() == obj {
-				return param, false
-			}
-		}
-	}
-
-	// Other ident?
-	for _, b := range fn.Blocks {
-		for _, instr := range b.Instrs {
-			if dr, ok := instr.(*DebugRef); ok {
-				if dr.Pos() == id.Pos() {
-					return dr.X, dr.IsAddr
-				}
-			}
-		}
-	}
-
-	// Defining ident of package-level var?
-	if v := prog.packageLevelValue(obj); v != nil {
-		return v.(*Global), true
-	}
-
-	return // e.g. debug info not requested, or var optimized away
-}
diff --git a/third_party/gotools/go/ssa/source_test.go b/third_party/gotools/go/ssa/source_test.go
deleted file mode 100644
index 87d2fef..0000000
--- a/third_party/gotools/go/ssa/source_test.go
+++ /dev/null
@@ -1,276 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa_test
-
-// This file defines tests of source-level debugging utilities.
-
-import (
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"os"
-	"regexp"
-	"strings"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/ast/astutil"
-	"llvm.org/llgo/third_party/gotools/go/exact"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-func TestObjValueLookup(t *testing.T) {
-	conf := loader.Config{ParserMode: parser.ParseComments}
-	f, err := conf.ParseFile("testdata/objlookup.go", nil)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	conf.CreateFromFiles("main", f)
-
-	// Maps each var Ident (represented "name:linenum") to the
-	// kind of ssa.Value we expect (represented "Constant", "&Alloc").
-	expectations := make(map[string]string)
-
-	// Find all annotations of form x::BinOp, &y::Alloc, etc.
-	re := regexp.MustCompile(`(\b|&)?(\w*)::(\w*)\b`)
-	for _, c := range f.Comments {
-		text := c.Text()
-		pos := conf.Fset.Position(c.Pos())
-		for _, m := range re.FindAllStringSubmatch(text, -1) {
-			key := fmt.Sprintf("%s:%d", m[2], pos.Line)
-			value := m[1] + m[3]
-			expectations[key] = value
-		}
-	}
-
-	iprog, err := conf.Load()
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	prog := ssa.Create(iprog, 0 /*|ssa.PrintFunctions*/)
-	mainInfo := iprog.Created[0]
-	mainPkg := prog.Package(mainInfo.Pkg)
-	mainPkg.SetDebugMode(true)
-	mainPkg.Build()
-
-	var varIds []*ast.Ident
-	var varObjs []*types.Var
-	for id, obj := range mainInfo.Defs {
-		// Check invariants for func and const objects.
-		switch obj := obj.(type) {
-		case *types.Func:
-			checkFuncValue(t, prog, obj)
-
-		case *types.Const:
-			checkConstValue(t, prog, obj)
-
-		case *types.Var:
-			if id.Name == "_" {
-				continue
-			}
-			varIds = append(varIds, id)
-			varObjs = append(varObjs, obj)
-		}
-	}
-	for id, obj := range mainInfo.Uses {
-		if obj, ok := obj.(*types.Var); ok {
-			varIds = append(varIds, id)
-			varObjs = append(varObjs, obj)
-		}
-	}
-
-	// Check invariants for var objects.
-	// The result varies based on the specific Ident.
-	for i, id := range varIds {
-		obj := varObjs[i]
-		ref, _ := astutil.PathEnclosingInterval(f, id.Pos(), id.Pos())
-		pos := prog.Fset.Position(id.Pos())
-		exp := expectations[fmt.Sprintf("%s:%d", id.Name, pos.Line)]
-		if exp == "" {
-			t.Errorf("%s: no expectation for var ident %s ", pos, id.Name)
-			continue
-		}
-		wantAddr := false
-		if exp[0] == '&' {
-			wantAddr = true
-			exp = exp[1:]
-		}
-		checkVarValue(t, prog, mainPkg, ref, obj, exp, wantAddr)
-	}
-}
-
-func checkFuncValue(t *testing.T, prog *ssa.Program, obj *types.Func) {
-	fn := prog.FuncValue(obj)
-	// fmt.Printf("FuncValue(%s) = %s\n", obj, fn) // debugging
-	if fn == nil {
-		if obj.Name() != "interfaceMethod" {
-			t.Errorf("FuncValue(%s) == nil", obj)
-		}
-		return
-	}
-	if fnobj := fn.Object(); fnobj != obj {
-		t.Errorf("FuncValue(%s).Object() == %s; value was %s",
-			obj, fnobj, fn.Name())
-		return
-	}
-	if !types.Identical(fn.Type(), obj.Type()) {
-		t.Errorf("FuncValue(%s).Type() == %s", obj, fn.Type())
-		return
-	}
-}
-
-func checkConstValue(t *testing.T, prog *ssa.Program, obj *types.Const) {
-	c := prog.ConstValue(obj)
-	// fmt.Printf("ConstValue(%s) = %s\n", obj, c) // debugging
-	if c == nil {
-		t.Errorf("ConstValue(%s) == nil", obj)
-		return
-	}
-	if !types.Identical(c.Type(), obj.Type()) {
-		t.Errorf("ConstValue(%s).Type() == %s", obj, c.Type())
-		return
-	}
-	if obj.Name() != "nil" {
-		if !exact.Compare(c.Value, token.EQL, obj.Val()) {
-			t.Errorf("ConstValue(%s).Value (%s) != %s",
-				obj, c.Value, obj.Val())
-			return
-		}
-	}
-}
-
-func checkVarValue(t *testing.T, prog *ssa.Program, pkg *ssa.Package, ref []ast.Node, obj *types.Var, expKind string, wantAddr bool) {
-	// The prefix of all assertions messages.
-	prefix := fmt.Sprintf("VarValue(%s @ L%d)",
-		obj, prog.Fset.Position(ref[0].Pos()).Line)
-
-	v, gotAddr := prog.VarValue(obj, pkg, ref)
-
-	// Kind is the concrete type of the ssa Value.
-	gotKind := "nil"
-	if v != nil {
-		gotKind = fmt.Sprintf("%T", v)[len("*ssa."):]
-	}
-
-	// fmt.Printf("%s = %v (kind %q; expect %q) wantAddr=%t gotAddr=%t\n", prefix, v, gotKind, expKind, wantAddr, gotAddr) // debugging
-
-	// Check the kinds match.
-	// "nil" indicates expected failure (e.g. optimized away).
-	if expKind != gotKind {
-		t.Errorf("%s concrete type == %s, want %s", prefix, gotKind, expKind)
-	}
-
-	// Check the types match.
-	// If wantAddr, the expected type is the object's address.
-	if v != nil {
-		expType := obj.Type()
-		if wantAddr {
-			expType = types.NewPointer(expType)
-			if !gotAddr {
-				t.Errorf("%s: got value, want address", prefix)
-			}
-		} else if gotAddr {
-			t.Errorf("%s: got address, want value", prefix)
-		}
-		if !types.Identical(v.Type(), expType) {
-			t.Errorf("%s.Type() == %s, want %s", prefix, v.Type(), expType)
-		}
-	}
-}
-
-// Ensure that, in debug mode, we can determine the ssa.Value
-// corresponding to every ast.Expr.
-func TestValueForExpr(t *testing.T) {
-	conf := loader.Config{ParserMode: parser.ParseComments}
-	f, err := conf.ParseFile("testdata/valueforexpr.go", nil)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	conf.CreateFromFiles("main", f)
-
-	iprog, err := conf.Load()
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	mainInfo := iprog.Created[0]
-
-	prog := ssa.Create(iprog, 0)
-	mainPkg := prog.Package(mainInfo.Pkg)
-	mainPkg.SetDebugMode(true)
-	mainPkg.Build()
-
-	if false {
-		// debugging
-		for _, mem := range mainPkg.Members {
-			if fn, ok := mem.(*ssa.Function); ok {
-				fn.WriteTo(os.Stderr)
-			}
-		}
-	}
-
-	// Find the actual AST node for each canonical position.
-	parenExprByPos := make(map[token.Pos]*ast.ParenExpr)
-	ast.Inspect(f, func(n ast.Node) bool {
-		if n != nil {
-			if e, ok := n.(*ast.ParenExpr); ok {
-				parenExprByPos[e.Pos()] = e
-			}
-		}
-		return true
-	})
-
-	// Find all annotations of form /*@kind*/.
-	for _, c := range f.Comments {
-		text := strings.TrimSpace(c.Text())
-		if text == "" || text[0] != '@' {
-			continue
-		}
-		text = text[1:]
-		pos := c.End() + 1
-		position := prog.Fset.Position(pos)
-		var e ast.Expr
-		if target := parenExprByPos[pos]; target == nil {
-			t.Errorf("%s: annotation doesn't precede ParenExpr: %q", position, text)
-			continue
-		} else {
-			e = target.X
-		}
-
-		path, _ := astutil.PathEnclosingInterval(f, pos, pos)
-		if path == nil {
-			t.Errorf("%s: can't find AST path from root to comment: %s", position, text)
-			continue
-		}
-
-		fn := ssa.EnclosingFunction(mainPkg, path)
-		if fn == nil {
-			t.Errorf("%s: can't find enclosing function", position)
-			continue
-		}
-
-		v, gotAddr := fn.ValueForExpr(e) // (may be nil)
-		got := strings.TrimPrefix(fmt.Sprintf("%T", v), "*ssa.")
-		if want := text; got != want {
-			t.Errorf("%s: got value %q, want %q", position, got, want)
-		}
-		if v != nil {
-			T := v.Type()
-			if gotAddr {
-				T = T.Underlying().(*types.Pointer).Elem() // deref
-			}
-			if !types.Identical(T, mainInfo.TypeOf(e)) {
-				t.Errorf("%s: got type %s, want %s", position, mainInfo.TypeOf(e), T)
-			}
-		}
-	}
-}
diff --git a/third_party/gotools/go/ssa/ssa.go b/third_party/gotools/go/ssa/ssa.go
deleted file mode 100644
index d8e83b9..0000000
--- a/third_party/gotools/go/ssa/ssa.go
+++ /dev/null
@@ -1,1700 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This package defines a high-level intermediate representation for
-// Go programs using static single-assignment (SSA) form.
-
-import (
-	"fmt"
-	"go/ast"
-	"go/token"
-	"sync"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-)
-
-// A Program is a partial or complete Go program converted to SSA form.
-type Program struct {
-	Fset       *token.FileSet              // position information for the files of this Program
-	imported   map[string]*Package         // all importable Packages, keyed by import path
-	packages   map[*types.Package]*Package // all loaded Packages, keyed by object
-	mode       BuilderMode                 // set of mode bits for SSA construction
-	MethodSets types.MethodSetCache        // cache of type-checker's method-sets
-
-	methodsMu    sync.Mutex                 // guards the following maps:
-	methodSets   typeutil.Map               // maps type to its concrete methodSet
-	runtimeTypes typeutil.Map               // types for which rtypes are needed
-	canon        typeutil.Map               // type canonicalization map
-	bounds       map[*types.Func]*Function  // bounds for curried x.Method closures
-	thunks       map[selectionKey]*Function // thunks for T.Method expressions
-}
-
-// A Package is a single analyzed Go package containing Members for
-// all package-level functions, variables, constants and types it
-// declares.  These may be accessed directly via Members, or via the
-// type-specific accessor methods Func, Type, Var and Const.
-//
-// Members also contains entries for "init" (the synthetic package
-// initializer) and "init#%d", the nth declared init function,
-// and unspecified other things too.
-//
-type Package struct {
-	Prog    *Program               // the owning program
-	Object  *types.Package         // the type checker's package object for this package
-	Members map[string]Member      // all package members keyed by name (incl. init and init#%d)
-	values  map[types.Object]Value // package members (incl. types and methods), keyed by object
-	init    *Function              // Func("init"); the package's init function
-	debug   bool                   // include full debug info in this package
-
-	// The following fields are set transiently, then cleared
-	// after building.
-	started int32               // atomically tested and set at start of build phase
-	ninit   int32               // number of init functions
-	info    *loader.PackageInfo // package ASTs and type information
-}
-
-// A Member is a member of a Go package, implemented by *NamedConst,
-// *Global, *Function, or *Type; they are created by package-level
-// const, var, func and type declarations respectively.
-//
-type Member interface {
-	Name() string                    // declared name of the package member
-	String() string                  // package-qualified name of the package member
-	RelString(*types.Package) string // like String, but relative refs are unqualified
-	Object() types.Object            // typechecker's object for this member, if any
-	Pos() token.Pos                  // position of member's declaration, if known
-	Type() types.Type                // type of the package member
-	Token() token.Token              // token.{VAR,FUNC,CONST,TYPE}
-	Package() *Package               // the containing package
-}
-
-// A Type is a Member of a Package representing a package-level named type.
-//
-// Type() returns a *types.Named.
-//
-type Type struct {
-	object *types.TypeName
-	pkg    *Package
-}
-
-// A NamedConst is a Member of a Package representing a package-level
-// named constant.
-//
-// Pos() returns the position of the declaring ast.ValueSpec.Names[*]
-// identifier.
-//
-// NB: a NamedConst is not a Value; it contains a constant Value, which
-// it augments with the name and position of its 'const' declaration.
-//
-type NamedConst struct {
-	object *types.Const
-	Value  *Const
-	pos    token.Pos
-	pkg    *Package
-}
-
-// A Value is an SSA value that can be referenced by an instruction.
-type Value interface {
-	// Name returns the name of this value, and determines how
-	// this Value appears when used as an operand of an
-	// Instruction.
-	//
-	// This is the same as the source name for Parameters,
-	// Builtins, Functions, FreeVars, Globals.
-	// For constants, it is a representation of the constant's value
-	// and type.  For all other Values this is the name of the
-	// virtual register defined by the instruction.
-	//
-	// The name of an SSA Value is not semantically significant,
-	// and may not even be unique within a function.
-	Name() string
-
-	// If this value is an Instruction, String returns its
-	// disassembled form; otherwise it returns unspecified
-	// human-readable information about the Value, such as its
-	// kind, name and type.
-	String() string
-
-	// Type returns the type of this value.  Many instructions
-	// (e.g. IndexAddr) change their behaviour depending on the
-	// types of their operands.
-	Type() types.Type
-
-	// Parent returns the function to which this Value belongs.
-	// It returns nil for named Functions, Builtin, Const and Global.
-	Parent() *Function
-
-	// Referrers returns the list of instructions that have this
-	// value as one of their operands; it may contain duplicates
-	// if an instruction has a repeated operand.
-	//
-	// Referrers actually returns a pointer through which the
-	// caller may perform mutations to the object's state.
-	//
-	// Referrers is currently only defined if Parent()!=nil,
-	// i.e. for the function-local values FreeVar, Parameter,
-	// Functions (iff anonymous) and all value-defining instructions.
-	// It returns nil for named Functions, Builtin, Const and Global.
-	//
-	// Instruction.Operands contains the inverse of this relation.
-	Referrers() *[]Instruction
-
-	// Pos returns the location of the AST token most closely
-	// associated with the operation that gave rise to this value,
-	// or token.NoPos if it was not explicit in the source.
-	//
-	// For each ast.Node type, a particular token is designated as
-	// the closest location for the expression, e.g. the Lparen
-	// for an *ast.CallExpr.  This permits a compact but
-	// approximate mapping from Values to source positions for use
-	// in diagnostic messages, for example.
-	//
-	// (Do not use this position to determine which Value
-	// corresponds to an ast.Expr; use Function.ValueForExpr
-	// instead.  NB: it requires that the function was built with
-	// debug information.)
-	Pos() token.Pos
-}
-
-// An Instruction is an SSA instruction that computes a new Value or
-// has some effect.
-//
-// An Instruction that defines a value (e.g. BinOp) also implements
-// the Value interface; an Instruction that only has an effect (e.g. Store)
-// does not.
-//
-type Instruction interface {
-	// String returns the disassembled form of this value.
-	//
-	// Examples of Instructions that are Values:
-	//       "x + y"     (BinOp)
-	//       "len([])"   (Call)
-	// Note that the name of the Value is not printed.
-	//
-	// Examples of Instructions that are not Values:
-	//       "return x"  (Return)
-	//       "*y = x"    (Store)
-	//
-	// (The separation Value.Name() from Value.String() is useful
-	// for some analyses which distinguish the operation from the
-	// value it defines, e.g., 'y = local int' is both an allocation
-	// of memory 'local int' and a definition of a pointer y.)
-	String() string
-
-	// Parent returns the function to which this instruction
-	// belongs.
-	Parent() *Function
-
-	// Block returns the basic block to which this instruction
-	// belongs.
-	Block() *BasicBlock
-
-	// setBlock sets the basic block to which this instruction belongs.
-	setBlock(*BasicBlock)
-
-	// Operands returns the operands of this instruction: the
-	// set of Values it references.
-	//
-	// Specifically, it appends their addresses to rands, a
-	// user-provided slice, and returns the resulting slice,
-	// permitting avoidance of memory allocation.
-	//
-	// The operands are appended in undefined order, but the order
-	// is consistent for a given Instruction; the addresses are
-	// always non-nil but may point to a nil Value.  Clients may
-	// store through the pointers, e.g. to effect a value
-	// renaming.
-	//
-	// Value.Referrers is a subset of the inverse of this
-	// relation.  (Referrers are not tracked for all types of
-	// Values.)
-	Operands(rands []*Value) []*Value
-
-	// Pos returns the location of the AST token most closely
-	// associated with the operation that gave rise to this
-	// instruction, or token.NoPos if it was not explicit in the
-	// source.
-	//
-	// For each ast.Node type, a particular token is designated as
-	// the closest location for the expression, e.g. the Go token
-	// for an *ast.GoStmt.  This permits a compact but approximate
-	// mapping from Instructions to source positions for use in
-	// diagnostic messages, for example.
-	//
-	// (Do not use this position to determine which Instruction
-	// corresponds to an ast.Expr; see the notes for Value.Pos.
-	// This position may be used to determine which non-Value
-	// Instruction corresponds to some ast.Stmts, but not all: If
-	// and Jump instructions have no Pos(), for example.)
-	Pos() token.Pos
-}
-
-// A Node is a node in the SSA value graph.  Every concrete type that
-// implements Node is also either a Value, an Instruction, or both.
-//
-// Node contains the methods common to Value and Instruction, plus the
-// Operands and Referrers methods generalized to return nil for
-// non-Instructions and non-Values, respectively.
-//
-// Node is provided to simplify SSA graph algorithms.  Clients should
-// use the more specific and informative Value or Instruction
-// interfaces where appropriate.
-//
-type Node interface {
-	// Common methods:
-	String() string
-	Pos() token.Pos
-	Parent() *Function
-
-	// Partial methods:
-	Operands(rands []*Value) []*Value // nil for non-Instructions
-	Referrers() *[]Instruction        // nil for non-Values
-}
-
-// Function represents the parameters, results, and code of a function
-// or method.
-//
-// If Blocks is nil, this indicates an external function for which no
-// Go source code is available.  In this case, FreeVars and Locals
-// are nil too.  Clients performing whole-program analysis must
-// handle external functions specially.
-//
-// Blocks contains the function's control-flow graph (CFG).
-// Blocks[0] is the function entry point; block order is not otherwise
-// semantically significant, though it may affect the readability of
-// the disassembly.
-// To iterate over the blocks in dominance order, use DomPreorder().
-//
-// Recover is an optional second entry point to which control resumes
-// after a recovered panic.  The Recover block may contain only a return
-// statement, preceded by a load of the function's named return
-// parameters, if any.
-//
-// A nested function (Parent()!=nil) that refers to one or more
-// lexically enclosing local variables ("free variables") has FreeVars.
-// Such functions cannot be called directly but require a
-// value created by MakeClosure which, via its Bindings, supplies
-// values for these parameters.
-//
-// If the function is a method (Signature.Recv() != nil) then the first
-// element of Params is the receiver parameter.
-//
-// A Go package may declare many functions called "init".
-// For each one, Object().Name() returns "init" but Name() returns
-// "init#1", etc, in declaration order.
-//
-// Pos() returns the declaring ast.FuncLit.Type.Func or the position
-// of the ast.FuncDecl.Name, if the function was explicit in the
-// source.  Synthetic wrappers, for which Synthetic != "", may share
-// the same position as the function they wrap.
-// Syntax.Pos() always returns the position of the declaring "func" token.
-//
-// Type() returns the function's Signature.
-//
-type Function struct {
-	name      string
-	object    types.Object     // a declared *types.Func or one of its wrappers
-	method    *types.Selection // info about provenance of synthetic methods
-	Signature *types.Signature
-	pos       token.Pos
-
-	Synthetic string        // provenance of synthetic function; "" for true source functions
-	syntax    ast.Node      // *ast.Func{Decl,Lit}; replaced with simple ast.Node after build, unless debug mode
-	parent    *Function     // enclosing function if anon; nil if global
-	Pkg       *Package      // enclosing package; nil for shared funcs (wrappers and error.Error)
-	Prog      *Program      // enclosing program
-	Params    []*Parameter  // function parameters; for methods, includes receiver
-	FreeVars  []*FreeVar    // free variables whose values must be supplied by closure
-	Locals    []*Alloc      // local variables of this function
-	Blocks    []*BasicBlock // basic blocks of the function; nil => external
-	Recover   *BasicBlock   // optional; control transfers here after recovered panic
-	AnonFuncs []*Function   // anonymous functions directly beneath this one
-	referrers []Instruction // referring instructions (iff Parent() != nil)
-
-	// The following fields are set transiently during building,
-	// then cleared.
-	currentBlock *BasicBlock             // where to emit code
-	objects      map[types.Object]Value  // addresses of local variables
-	namedResults []*Alloc                // tuple of named results
-	targets      *targets                // linked stack of branch targets
-	lblocks      map[*ast.Object]*lblock // labelled blocks
-}
-
-// BasicBlock represents an SSA basic block.
-//
-// The final element of Instrs is always an explicit transfer of
-// control (If, Jump, Return, or Panic).
-//
-// A block may contain no Instructions only if it is unreachable,
-// i.e., Preds is nil.  Empty blocks are typically pruned.
-//
-// BasicBlocks and their Preds/Succs relation form a (possibly cyclic)
-// graph independent of the SSA Value graph: the control-flow graph or
-// CFG.  It is illegal for multiple edges to exist between the same
-// pair of blocks.
-//
-// Each BasicBlock is also a node in the dominator tree of the CFG.
-// The tree may be navigated using Idom()/Dominees() and queried using
-// Dominates().
-//
-// The order of Preds and Succs is significant (to Phi and If
-// instructions, respectively).
-//
-type BasicBlock struct {
-	Index        int            // index of this block within Parent().Blocks
-	Comment      string         // optional label; no semantic significance
-	parent       *Function      // parent function
-	Instrs       []Instruction  // instructions in order
-	Preds, Succs []*BasicBlock  // predecessors and successors
-	succs2       [2]*BasicBlock // initial space for Succs
-	dom          domInfo        // dominator tree info
-	gaps         int            // number of nil Instrs (transient)
-	rundefers    int            // number of rundefers (transient)
-}
-
-// Pure values ----------------------------------------
-
-// A FreeVar represents a free variable of the function to which it
-// belongs.
-//
-// FreeVars are used to implement anonymous functions, whose free
-// variables are lexically captured in a closure formed by
-// MakeClosure.  The value of such a free var is an Alloc or another
-// FreeVar and is considered a potentially escaping heap address, with
-// pointer type.
-//
-// FreeVars are also used to implement bound method closures.  Such a
-// free var represents the receiver value and may be of any type that
-// has concrete methods.
-//
-// Pos() returns the position of the value that was captured, which
-// belongs to an enclosing function.
-//
-type FreeVar struct {
-	name      string
-	typ       types.Type
-	pos       token.Pos
-	parent    *Function
-	referrers []Instruction
-
-	// Transiently needed during building.
-	outer Value // the Value captured from the enclosing context.
-}
-
-// A Parameter represents an input parameter of a function.
-//
-type Parameter struct {
-	name      string
-	object    types.Object // a *types.Var; nil for non-source locals
-	typ       types.Type
-	pos       token.Pos
-	parent    *Function
-	referrers []Instruction
-}
-
-// A Const represents the value of a constant expression.
-//
-// The underlying type of a constant may be any boolean, numeric, or
-// string type.  In addition, a Const may represent the nil value of
-// any reference type---interface, map, channel, pointer, slice, or
-// function---but not "untyped nil".
-//
-// All source-level constant expressions are represented by a Const
-// of the same type and value.
-//
-// Value holds the exact value of the constant, independent of its
-// Type(), using the same representation as package go/exact uses for
-// constants, or nil for a typed nil value.
-//
-// Pos() returns token.NoPos.
-//
-// Example printed form:
-// 	42:int
-//	"hello":untyped string
-//	3+4i:MyComplex
-//
-type Const struct {
-	typ   types.Type
-	Value exact.Value
-}
-
-// A Global is a named Value holding the address of a package-level
-// variable.
-//
-// Pos() returns the position of the ast.ValueSpec.Names[*]
-// identifier.
-//
-type Global struct {
-	name   string
-	object types.Object // a *types.Var; may be nil for synthetics e.g. init$guard
-	typ    types.Type
-	pos    token.Pos
-
-	Pkg *Package
-}
-
-// A Builtin represents a specific use of a built-in function, e.g. len.
-//
-// Builtins are immutable values.  Builtins do not have addresses.
-// Builtins can only appear in CallCommon.Func.
-//
-// Name() indicates the function: one of the built-in functions from the
-// Go spec (excluding "make" and "new") or one of these ssa-defined
-// intrinsics:
-//
-//   // wrapnilchk returns ptr if non-nil, panics otherwise.
-//   // (For use in indirection wrappers.)
-//   func ssa:wrapnilchk(ptr *T, recvType, methodName string) *T
-//
-// Object() returns a *types.Builtin for built-ins defined by the spec,
-// nil for others.
-//
-// Type() returns a *types.Signature representing the effective
-// signature of the built-in for this call.
-//
-type Builtin struct {
-	name string
-	sig  *types.Signature
-}
-
-// Value-defining instructions  ----------------------------------------
-
-// The Alloc instruction reserves space for a variable of the given type,
-// zero-initializes it, and yields its address.
-//
-// Alloc values are always addresses, and have pointer types, so the
-// type of the allocated variable is actually
-// Type().Underlying().(*types.Pointer).Elem().
-//
-// If Heap is false, Alloc allocates space in the function's
-// activation record (frame); we refer to an Alloc(Heap=false) as a
-// "local" alloc.  Each local Alloc returns the same address each time
-// it is executed within the same activation; the space is
-// re-initialized to zero.
-//
-// If Heap is true, Alloc allocates space in the heap; we
-// refer to an Alloc(Heap=true) as a "new" alloc.  Each new Alloc
-// returns a different address each time it is executed.
-//
-// When Alloc is applied to a channel, map or slice type, it returns
-// the address of an uninitialized (nil) reference of that kind; store
-// the result of MakeSlice, MakeMap or MakeChan in that location to
-// instantiate these types.
-//
-// Pos() returns the ast.CompositeLit.Lbrace for a composite literal,
-// or the ast.CallExpr.Rparen for a call to new() or for a call that
-// allocates a varargs slice.
-//
-// Example printed form:
-// 	t0 = local int
-// 	t1 = new int
-//
-type Alloc struct {
-	register
-	Comment string
-	Heap    bool
-	index   int // dense numbering; for lifting
-}
-
-// The Phi instruction represents an SSA φ-node, which combines values
-// that differ across incoming control-flow edges and yields a new
-// value.  Within a block, all φ-nodes must appear before all non-φ
-// nodes.
-//
-// Pos() returns the position of the && or || for short-circuit
-// control-flow joins, or that of the *Alloc for φ-nodes inserted
-// during SSA renaming.
-//
-// Example printed form:
-// 	t2 = phi [0: t0, 1: t1]
-//
-type Phi struct {
-	register
-	Comment string  // a hint as to its purpose
-	Edges   []Value // Edges[i] is value for Block().Preds[i]
-}
-
-// The Call instruction represents a function or method call.
-//
-// The Call instruction yields the function result if there is exactly
-// one.  Otherwise it returns a tuple, the components of which are
-// accessed via Extract.
-//
-// See CallCommon for generic function call documentation.
-//
-// Pos() returns the ast.CallExpr.Lparen, if explicit in the source.
-//
-// Example printed form:
-// 	t2 = println(t0, t1)
-// 	t4 = t3()
-// 	t7 = invoke t5.Println(...t6)
-//
-type Call struct {
-	register
-	Call CallCommon
-}
-
-// The BinOp instruction yields the result of binary operation X Op Y.
-//
-// Pos() returns the ast.BinaryExpr.OpPos, if explicit in the source.
-//
-// Example printed form:
-// 	t1 = t0 + 1:int
-//
-type BinOp struct {
-	register
-	// One of:
-	// ADD SUB MUL QUO REM          + - * / %
-	// AND OR XOR SHL SHR AND_NOT   & | ^ << >> &~
-	// EQL LSS GTR NEQ LEQ GEQ      == != < <= < >=
-	Op   token.Token
-	X, Y Value
-}
-
-// The UnOp instruction yields the result of Op X.
-// ARROW is channel receive.
-// MUL is pointer indirection (load).
-// XOR is bitwise complement.
-// SUB is negation.
-// NOT is logical negation.
-//
-// If CommaOk and Op=ARROW, the result is a 2-tuple of the value above
-// and a boolean indicating the success of the receive.  The
-// components of the tuple are accessed using Extract.
-//
-// Pos() returns the ast.UnaryExpr.OpPos, if explicit in the source.
-// For receive operations (ARROW) implicit in ranging over a channel,
-// Pos() returns the ast.RangeStmt.For.
-// For implicit memory loads (STAR), Pos() returns the position of the
-// most closely associated source-level construct; the details are not
-// specified.
-//
-// Example printed form:
-// 	t0 = *x
-// 	t2 = <-t1,ok
-//
-type UnOp struct {
-	register
-	Op      token.Token // One of: NOT SUB ARROW MUL XOR ! - <- * ^
-	X       Value
-	CommaOk bool
-}
-
-// The ChangeType instruction applies to X a value-preserving type
-// change to Type().
-//
-// Type changes are permitted:
-//    - between a named type and its underlying type.
-//    - between two named types of the same underlying type.
-//    - between (possibly named) pointers to identical base types.
-//    - from a bidirectional channel to a read- or write-channel,
-//      optionally adding/removing a name.
-//
-// This operation cannot fail dynamically.
-//
-// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
-// from an explicit conversion in the source.
-//
-// Example printed form:
-// 	t1 = changetype *int <- IntPtr (t0)
-//
-type ChangeType struct {
-	register
-	X Value
-}
-
-// The Convert instruction yields the conversion of value X to type
-// Type().  One or both of those types is basic (but possibly named).
-//
-// A conversion may change the value and representation of its operand.
-// Conversions are permitted:
-//    - between real numeric types.
-//    - between complex numeric types.
-//    - between string and []byte or []rune.
-//    - between pointers and unsafe.Pointer.
-//    - between unsafe.Pointer and uintptr.
-//    - from (Unicode) integer to (UTF-8) string.
-// A conversion may imply a type name change also.
-//
-// This operation cannot fail dynamically.
-//
-// Conversions of untyped string/number/bool constants to a specific
-// representation are eliminated during SSA construction.
-//
-// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
-// from an explicit conversion in the source.
-//
-// Example printed form:
-// 	t1 = convert []byte <- string (t0)
-//
-type Convert struct {
-	register
-	X Value
-}
-
-// ChangeInterface constructs a value of one interface type from a
-// value of another interface type known to be assignable to it.
-// This operation cannot fail.
-//
-// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
-// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
-// instruction arose from an explicit e.(T) operation; or token.NoPos
-// otherwise.
-//
-// Example printed form:
-// 	t1 = change interface interface{} <- I (t0)
-//
-type ChangeInterface struct {
-	register
-	X Value
-}
-
-// MakeInterface constructs an instance of an interface type from a
-// value of a concrete type.
-//
-// Use Program.MethodSets.MethodSet(X.Type()) to find the method-set
-// of X, and Program.Method(m) to find the implementation of a method.
-//
-// To construct the zero value of an interface type T, use:
-// 	NewConst(exact.MakeNil(), T, pos)
-//
-// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
-// from an explicit conversion in the source.
-//
-// Example printed form:
-// 	t1 = make interface{} <- int (42:int)
-// 	t2 = make Stringer <- t0
-//
-type MakeInterface struct {
-	register
-	X Value
-}
-
-// The MakeClosure instruction yields a closure value whose code is
-// Fn and whose free variables' values are supplied by Bindings.
-//
-// Type() returns a (possibly named) *types.Signature.
-//
-// Pos() returns the ast.FuncLit.Type.Func for a function literal
-// closure or the ast.SelectorExpr.Sel for a bound method closure.
-//
-// Example printed form:
-// 	t0 = make closure anon@1.2 [x y z]
-// 	t1 = make closure bound$(main.I).add [i]
-//
-type MakeClosure struct {
-	register
-	Fn       Value   // always a *Function
-	Bindings []Value // values for each free variable in Fn.FreeVars
-}
-
-// The MakeMap instruction creates a new hash-table-based map object
-// and yields a value of kind map.
-//
-// Type() returns a (possibly named) *types.Map.
-//
-// Pos() returns the ast.CallExpr.Lparen, if created by make(map), or
-// the ast.CompositeLit.Lbrack if created by a literal.
-//
-// Example printed form:
-// 	t1 = make map[string]int t0
-// 	t1 = make StringIntMap t0
-//
-type MakeMap struct {
-	register
-	Reserve Value // initial space reservation; nil => default
-}
-
-// The MakeChan instruction creates a new channel object and yields a
-// value of kind chan.
-//
-// Type() returns a (possibly named) *types.Chan.
-//
-// Pos() returns the ast.CallExpr.Lparen for the make(chan) that
-// created it.
-//
-// Example printed form:
-// 	t0 = make chan int 0
-// 	t0 = make IntChan 0
-//
-type MakeChan struct {
-	register
-	Size Value // int; size of buffer; zero => synchronous.
-}
-
-// The MakeSlice instruction yields a slice of length Len backed by a
-// newly allocated array of length Cap.
-//
-// Both Len and Cap must be non-nil Values of integer type.
-//
-// (Alloc(types.Array) followed by Slice will not suffice because
-// Alloc can only create arrays of constant length.)
-//
-// Type() returns a (possibly named) *types.Slice.
-//
-// Pos() returns the ast.CallExpr.Lparen for the make([]T) that
-// created it.
-//
-// Example printed form:
-// 	t1 = make []string 1:int t0
-// 	t1 = make StringSlice 1:int t0
-//
-type MakeSlice struct {
-	register
-	Len Value
-	Cap Value
-}
-
-// The Slice instruction yields a slice of an existing string, slice
-// or *array X between optional integer bounds Low and High.
-//
-// Dynamically, this instruction panics if X evaluates to a nil *array
-// pointer.
-//
-// Type() returns string if the type of X was string, otherwise a
-// *types.Slice with the same element type as X.
-//
-// Pos() returns the ast.SliceExpr.Lbrack if created by a x[:] slice
-// operation, the ast.CompositeLit.Lbrace if created by a literal, or
-// NoPos if not explicit in the source (e.g. a variadic argument slice).
-//
-// Example printed form:
-// 	t1 = slice t0[1:]
-//
-type Slice struct {
-	register
-	X              Value // slice, string, or *array
-	Low, High, Max Value // each may be nil
-}
-
-// The FieldAddr instruction yields the address of Field of *struct X.
-//
-// The field is identified by its index within the field list of the
-// struct type of X.
-//
-// Dynamically, this instruction panics if X evaluates to a nil
-// pointer.
-//
-// Type() returns a (possibly named) *types.Pointer.
-//
-// Pos() returns the position of the ast.SelectorExpr.Sel for the
-// field, if explicit in the source.
-//
-// Example printed form:
-// 	t1 = &t0.name [#1]
-//
-type FieldAddr struct {
-	register
-	X     Value // *struct
-	Field int   // index into X.Type().Deref().(*types.Struct).Fields
-}
-
-// The Field instruction yields the Field of struct X.
-//
-// The field is identified by its index within the field list of the
-// struct type of X; by using numeric indices we avoid ambiguity of
-// package-local identifiers and permit compact representations.
-//
-// Pos() returns the position of the ast.SelectorExpr.Sel for the
-// field, if explicit in the source.
-//
-// Example printed form:
-// 	t1 = t0.name [#1]
-//
-type Field struct {
-	register
-	X     Value // struct
-	Field int   // index into X.Type().(*types.Struct).Fields
-}
-
-// The IndexAddr instruction yields the address of the element at
-// index Index of collection X.  Index is an integer expression.
-//
-// The elements of maps and strings are not addressable; use Lookup or
-// MapUpdate instead.
-//
-// Dynamically, this instruction panics if X evaluates to a nil *array
-// pointer.
-//
-// Type() returns a (possibly named) *types.Pointer.
-//
-// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
-// explicit in the source.
-//
-// Example printed form:
-// 	t2 = &t0[t1]
-//
-type IndexAddr struct {
-	register
-	X     Value // slice or *array,
-	Index Value // numeric index
-}
-
-// The Index instruction yields element Index of array X.
-//
-// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
-// explicit in the source.
-//
-// Example printed form:
-// 	t2 = t0[t1]
-//
-type Index struct {
-	register
-	X     Value // array
-	Index Value // integer index
-}
-
-// The Lookup instruction yields element Index of collection X, a map
-// or string.  Index is an integer expression if X is a string or the
-// appropriate key type if X is a map.
-//
-// If CommaOk, the result is a 2-tuple of the value above and a
-// boolean indicating the result of a map membership test for the key.
-// The components of the tuple are accessed using Extract.
-//
-// Pos() returns the ast.IndexExpr.Lbrack, if explicit in the source.
-//
-// Example printed form:
-// 	t2 = t0[t1]
-// 	t5 = t3[t4],ok
-//
-type Lookup struct {
-	register
-	X       Value // string or map
-	Index   Value // numeric or key-typed index
-	CommaOk bool  // return a value,ok pair
-}
-
-// SelectState is a helper for Select.
-// It represents one goal state and its corresponding communication.
-//
-type SelectState struct {
-	Dir       types.ChanDir // direction of case (SendOnly or RecvOnly)
-	Chan      Value         // channel to use (for send or receive)
-	Send      Value         // value to send (for send)
-	Pos       token.Pos     // position of token.ARROW
-	DebugNode ast.Node      // ast.SendStmt or ast.UnaryExpr(<-) [debug mode]
-}
-
-// The Select instruction tests whether (or blocks until) one
-// of the specified sent or received states is entered.
-//
-// Let n be the number of States for which Dir==RECV and T_i (0<=i<n)
-// be the element type of each such state's Chan.
-// Select returns an n+2-tuple
-//    (index int, recvOk bool, r_0 T_0, ... r_n-1 T_n-1)
-// The tuple's components, described below, must be accessed via the
-// Extract instruction.
-//
-// If Blocking, select waits until exactly one state holds, i.e. a
-// channel becomes ready for the designated operation of sending or
-// receiving; select chooses one among the ready states
-// pseudorandomly, performs the send or receive operation, and sets
-// 'index' to the index of the chosen channel.
-//
-// If !Blocking, select doesn't block if no states hold; instead it
-// returns immediately with index equal to -1.
-//
-// If the chosen channel was used for a receive, the r_i component is
-// set to the received value, where i is the index of that state among
-// all n receive states; otherwise r_i has the zero value of type T_i.
-// Note that the receive index i is not the same as the state
-// index index.
-//
-// The second component of the triple, recvOk, is a boolean whose value
-// is true iff the selected operation was a receive and the receive
-// successfully yielded a value.
-//
-// Pos() returns the ast.SelectStmt.Select.
-//
-// Example printed form:
-// 	t3 = select nonblocking [<-t0, t1<-t2]
-// 	t4 = select blocking []
-//
-type Select struct {
-	register
-	States   []*SelectState
-	Blocking bool
-}
-
-// The Range instruction yields an iterator over the domain and range
-// of X, which must be a string or map.
-//
-// Elements are accessed via Next.
-//
-// Type() returns an opaque and degenerate "rangeIter" type.
-//
-// Pos() returns the ast.RangeStmt.For.
-//
-// Example printed form:
-// 	t0 = range "hello":string
-//
-type Range struct {
-	register
-	X Value // string or map
-}
-
-// The Next instruction reads and advances the (map or string)
-// iterator Iter and returns a 3-tuple value (ok, k, v).  If the
-// iterator is not exhausted, ok is true and k and v are the next
-// elements of the domain and range, respectively.  Otherwise ok is
-// false and k and v are undefined.
-//
-// Components of the tuple are accessed using Extract.
-//
-// The IsString field distinguishes iterators over strings from those
-// over maps, as the Type() alone is insufficient: consider
-// map[int]rune.
-//
-// Type() returns a *types.Tuple for the triple (ok, k, v).
-// The types of k and/or v may be types.Invalid.
-//
-// Example printed form:
-// 	t1 = next t0
-//
-type Next struct {
-	register
-	Iter     Value
-	IsString bool // true => string iterator; false => map iterator.
-}
-
-// The TypeAssert instruction tests whether interface value X has type
-// AssertedType.
-//
-// If !CommaOk, on success it returns v, the result of the conversion
-// (defined below); on failure it panics.
-//
-// If CommaOk: on success it returns a pair (v, true) where v is the
-// result of the conversion; on failure it returns (z, false) where z
-// is AssertedType's zero value.  The components of the pair must be
-// accessed using the Extract instruction.
-//
-// If AssertedType is a concrete type, TypeAssert checks whether the
-// dynamic type in interface X is equal to it, and if so, the result
-// of the conversion is a copy of the value in the interface.
-//
-// If AssertedType is an interface, TypeAssert checks whether the
-// dynamic type of the interface is assignable to it, and if so, the
-// result of the conversion is a copy of the interface value X.
-// If AssertedType is a superinterface of X.Type(), the operation will
-// fail iff the operand is nil.  (Contrast with ChangeInterface, which
-// performs no nil-check.)
-//
-// Type() reflects the actual type of the result, possibly a
-// 2-types.Tuple; AssertedType is the asserted type.
-//
-// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
-// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
-// instruction arose from an explicit e.(T) operation; or the
-// ast.CaseClause.Case if the instruction arose from a case of a
-// type-switch statement.
-//
-// Example printed form:
-// 	t1 = typeassert t0.(int)
-// 	t3 = typeassert,ok t2.(T)
-//
-type TypeAssert struct {
-	register
-	X            Value
-	AssertedType types.Type
-	CommaOk      bool
-}
-
-// The Extract instruction yields component Index of Tuple.
-//
-// This is used to access the results of instructions with multiple
-// return values, such as Call, TypeAssert, Next, UnOp(ARROW) and
-// IndexExpr(Map).
-//
-// Example printed form:
-// 	t1 = extract t0 #1
-//
-type Extract struct {
-	register
-	Tuple Value
-	Index int
-}
-
-// Instructions executed for effect.  They do not yield a value. --------------------
-
-// The Jump instruction transfers control to the sole successor of its
-// owning block.
-//
-// A Jump must be the last instruction of its containing BasicBlock.
-//
-// Pos() returns NoPos.
-//
-// Example printed form:
-// 	jump done
-//
-type Jump struct {
-	anInstruction
-}
-
-// The If instruction transfers control to one of the two successors
-// of its owning block, depending on the boolean Cond: the first if
-// true, the second if false.
-//
-// An If instruction must be the last instruction of its containing
-// BasicBlock.
-//
-// Pos() returns NoPos.
-//
-// Example printed form:
-// 	if t0 goto done else body
-//
-type If struct {
-	anInstruction
-	Cond Value
-}
-
-// The Return instruction returns values and control back to the calling
-// function.
-//
-// len(Results) is always equal to the number of results in the
-// function's signature.
-//
-// If len(Results) > 1, Return returns a tuple value with the specified
-// components which the caller must access using Extract instructions.
-//
-// There is no instruction to return a ready-made tuple like those
-// returned by a "value,ok"-mode TypeAssert, Lookup or UnOp(ARROW) or
-// a tail-call to a function with multiple result parameters.
-//
-// Return must be the last instruction of its containing BasicBlock.
-// Such a block has no successors.
-//
-// Pos() returns the ast.ReturnStmt.Return, if explicit in the source.
-//
-// Example printed form:
-// 	return
-// 	return nil:I, 2:int
-//
-type Return struct {
-	anInstruction
-	Results []Value
-	pos     token.Pos
-}
-
-// The RunDefers instruction pops and invokes the entire stack of
-// procedure calls pushed by Defer instructions in this function.
-//
-// It is legal to encounter multiple 'rundefers' instructions in a
-// single control-flow path through a function; this is useful in
-// the combined init() function, for example.
-//
-// Pos() returns NoPos.
-//
-// Example printed form:
-//	rundefers
-//
-type RunDefers struct {
-	anInstruction
-}
-
-// The Panic instruction initiates a panic with value X.
-//
-// A Panic instruction must be the last instruction of its containing
-// BasicBlock, which must have no successors.
-//
-// NB: 'go panic(x)' and 'defer panic(x)' do not use this instruction;
-// they are treated as calls to a built-in function.
-//
-// Pos() returns the ast.CallExpr.Lparen if this panic was explicit
-// in the source.
-//
-// Example printed form:
-// 	panic t0
-//
-type Panic struct {
-	anInstruction
-	X   Value // an interface{}
-	pos token.Pos
-}
-
-// The Go instruction creates a new goroutine and calls the specified
-// function within it.
-//
-// See CallCommon for generic function call documentation.
-//
-// Pos() returns the ast.GoStmt.Go.
-//
-// Example printed form:
-// 	go println(t0, t1)
-// 	go t3()
-// 	go invoke t5.Println(...t6)
-//
-type Go struct {
-	anInstruction
-	Call CallCommon
-	pos  token.Pos
-}
-
-// The Defer instruction pushes the specified call onto a stack of
-// functions to be called by a RunDefers instruction or by a panic.
-//
-// See CallCommon for generic function call documentation.
-//
-// Pos() returns the ast.DeferStmt.Defer.
-//
-// Example printed form:
-// 	defer println(t0, t1)
-// 	defer t3()
-// 	defer invoke t5.Println(...t6)
-//
-type Defer struct {
-	anInstruction
-	Call CallCommon
-	pos  token.Pos
-}
-
-// The Send instruction sends X on channel Chan.
-//
-// Pos() returns the ast.SendStmt.Arrow, if explicit in the source.
-//
-// Example printed form:
-// 	send t0 <- t1
-//
-type Send struct {
-	anInstruction
-	Chan, X Value
-	pos     token.Pos
-}
-
-// The Store instruction stores Val at address Addr.
-// Stores can be of arbitrary types.
-//
-// Pos() returns the position of the source-level construct most closely
-// associated with the memory store operation.
-// Since implicit memory stores are numerous and varied and depend upon
-// implementation choices, the details are not specified.
-//
-// Example printed form:
-// 	*x = y
-//
-type Store struct {
-	anInstruction
-	Addr Value
-	Val  Value
-	pos  token.Pos
-}
-
-// The MapUpdate instruction updates the association of Map[Key] to
-// Value.
-//
-// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack,
-// if explicit in the source.
-//
-// Example printed form:
-//	t0[t1] = t2
-//
-type MapUpdate struct {
-	anInstruction
-	Map   Value
-	Key   Value
-	Value Value
-	pos   token.Pos
-}
-
-// A DebugRef instruction maps a source-level expression Expr to the
-// SSA value X that represents the value (!IsAddr) or address (IsAddr)
-// of that expression.
-//
-// DebugRef is a pseudo-instruction: it has no dynamic effect.
-//
-// Pos() returns Expr.Pos(), the start position of the source-level
-// expression.  This is not the same as the "designated" token as
-// documented at Value.Pos(). e.g. CallExpr.Pos() does not return the
-// position of the ("designated") Lparen token.
-//
-// If Expr is an *ast.Ident denoting a var or func, Object() returns
-// the object; though this information can be obtained from the type
-// checker, including it here greatly facilitates debugging.
-// For non-Ident expressions, Object() returns nil.
-//
-// DebugRefs are generated only for functions built with debugging
-// enabled; see Package.SetDebugMode() and the GlobalDebug builder
-// mode flag.
-//
-// DebugRefs are not emitted for ast.Idents referring to constants or
-// predeclared identifiers, since they are trivial and numerous.
-// Nor are they emitted for ast.ParenExprs.
-//
-// (By representing these as instructions, rather than out-of-band,
-// consistency is maintained during transformation passes by the
-// ordinary SSA renaming machinery.)
-//
-// Example printed form:
-//      ; *ast.CallExpr @ 102:9 is t5
-//      ; var x float64 @ 109:72 is x
-//      ; address of *ast.CompositeLit @ 216:10 is t0
-//
-type DebugRef struct {
-	anInstruction
-	Expr   ast.Expr     // the referring expression (never *ast.ParenExpr)
-	object types.Object // the identity of the source var/func
-	IsAddr bool         // Expr is addressable and X is the address it denotes
-	X      Value        // the value or address of Expr
-}
-
-// Embeddable mix-ins and helpers for common parts of other structs. -----------
-
-// register is a mix-in embedded by all SSA values that are also
-// instructions, i.e. virtual registers, and provides a uniform
-// implementation of most of the Value interface: Value.Name() is a
-// numbered register (e.g. "t0"); the other methods are field accessors.
-//
-// Temporary names are automatically assigned to each register on
-// completion of building a function in SSA form.
-//
-// Clients must not assume that the 'id' value (and the Name() derived
-// from it) is unique within a function.  As always in this API,
-// semantics are determined only by identity; names exist only to
-// facilitate debugging.
-//
-type register struct {
-	anInstruction
-	num       int        // "name" of virtual register, e.g. "t0".  Not guaranteed unique.
-	typ       types.Type // type of virtual register
-	pos       token.Pos  // position of source expression, or NoPos
-	referrers []Instruction
-}
-
-// anInstruction is a mix-in embedded by all Instructions.
-// It provides the implementations of the Block and setBlock methods.
-type anInstruction struct {
-	block *BasicBlock // the basic block of this instruction
-}
-
-// CallCommon is contained by Go, Defer and Call to hold the
-// common parts of a function or method call.
-//
-// Each CallCommon exists in one of two modes, function call and
-// interface method invocation, or "call" and "invoke" for short.
-//
-// 1. "call" mode: when Method is nil (!IsInvoke), a CallCommon
-// represents an ordinary function call of the value in Value,
-// which may be a *Builtin, a *Function or any other value of kind
-// 'func'.
-//
-// Value may be one of:
-//    (a) a *Function, indicating a statically dispatched call
-//        to a package-level function, an anonymous function, or
-//        a method of a named type.
-//    (b) a *MakeClosure, indicating an immediately applied
-//        function literal with free variables.
-//    (c) a *Builtin, indicating a statically dispatched call
-//        to a built-in function.
-//    (d) any other value, indicating a dynamically dispatched
-//        function call.
-// StaticCallee returns the identity of the callee in cases
-// (a) and (b), nil otherwise.
-//
-// Args contains the arguments to the call.  If Value is a method,
-// Args[0] contains the receiver parameter.
-//
-// Example printed form:
-// 	t2 = println(t0, t1)
-// 	go t3()
-//	defer t5(...t6)
-//
-// 2. "invoke" mode: when Method is non-nil (IsInvoke), a CallCommon
-// represents a dynamically dispatched call to an interface method.
-// In this mode, Value is the interface value and Method is the
-// interface's abstract method.  Note: an abstract method may be
-// shared by multiple interfaces due to embedding; Value.Type()
-// provides the specific interface used for this call.
-//
-// Value is implicitly supplied to the concrete method implementation
-// as the receiver parameter; in other words, Args[0] holds not the
-// receiver but the first true argument.
-//
-// Example printed form:
-// 	t1 = invoke t0.String()
-// 	go invoke t3.Run(t2)
-// 	defer invoke t4.Handle(...t5)
-//
-// For all calls to variadic functions (Signature().Variadic()),
-// the last element of Args is a slice.
-//
-type CallCommon struct {
-	Value  Value       // receiver (invoke mode) or func value (call mode)
-	Method *types.Func // abstract method (invoke mode)
-	Args   []Value     // actual parameters (in static method call, includes receiver)
-	pos    token.Pos   // position of CallExpr.Lparen, iff explicit in source
-}
-
-// IsInvoke returns true if this call has "invoke" (not "call") mode.
-func (c *CallCommon) IsInvoke() bool {
-	return c.Method != nil
-}
-
-func (c *CallCommon) Pos() token.Pos { return c.pos }
-
-// Signature returns the signature of the called function.
-//
-// For an "invoke"-mode call, the signature of the interface method is
-// returned.
-//
-// In either "call" or "invoke" mode, if the callee is a method, its
-// receiver is represented by sig.Recv, not sig.Params().At(0).
-//
-func (c *CallCommon) Signature() *types.Signature {
-	if c.Method != nil {
-		return c.Method.Type().(*types.Signature)
-	}
-	return c.Value.Type().Underlying().(*types.Signature)
-}
-
-// StaticCallee returns the callee if this is a trivially static
-// "call"-mode call to a function.
-func (c *CallCommon) StaticCallee() *Function {
-	switch fn := c.Value.(type) {
-	case *Function:
-		return fn
-	case *MakeClosure:
-		return fn.Fn.(*Function)
-	}
-	return nil
-}
-
-// Description returns a description of the mode of this call suitable
-// for a user interface, e.g., "static method call".
-func (c *CallCommon) Description() string {
-	switch fn := c.Value.(type) {
-	case *Builtin:
-		return "built-in function call"
-	case *MakeClosure:
-		return "static function closure call"
-	case *Function:
-		if fn.Signature.Recv() != nil {
-			return "static method call"
-		}
-		return "static function call"
-	}
-	if c.IsInvoke() {
-		return "dynamic method call" // ("invoke" mode)
-	}
-	return "dynamic function call"
-}
-
-// The CallInstruction interface, implemented by *Go, *Defer and *Call,
-// exposes the common parts of function-calling instructions,
-// yet provides a way back to the Value defined by *Call alone.
-//
-type CallInstruction interface {
-	Instruction
-	Common() *CallCommon // returns the common parts of the call
-	Value() *Call        // returns the result value of the call (*Call) or nil (*Go, *Defer)
-}
-
-func (s *Call) Common() *CallCommon  { return &s.Call }
-func (s *Defer) Common() *CallCommon { return &s.Call }
-func (s *Go) Common() *CallCommon    { return &s.Call }
-
-func (s *Call) Value() *Call  { return s }
-func (s *Defer) Value() *Call { return nil }
-func (s *Go) Value() *Call    { return nil }
-
-func (v *Builtin) Type() types.Type        { return v.sig }
-func (v *Builtin) Name() string            { return v.name }
-func (*Builtin) Referrers() *[]Instruction { return nil }
-func (v *Builtin) Pos() token.Pos          { return token.NoPos }
-func (v *Builtin) Object() types.Object    { return types.Universe.Lookup(v.name) }
-func (v *Builtin) Parent() *Function       { return nil }
-
-func (v *FreeVar) Type() types.Type          { return v.typ }
-func (v *FreeVar) Name() string              { return v.name }
-func (v *FreeVar) Referrers() *[]Instruction { return &v.referrers }
-func (v *FreeVar) Pos() token.Pos            { return v.pos }
-func (v *FreeVar) Parent() *Function         { return v.parent }
-
-func (v *Global) Type() types.Type                     { return v.typ }
-func (v *Global) Name() string                         { return v.name }
-func (v *Global) Parent() *Function                    { return nil }
-func (v *Global) Pos() token.Pos                       { return v.pos }
-func (v *Global) Referrers() *[]Instruction            { return nil }
-func (v *Global) Token() token.Token                   { return token.VAR }
-func (v *Global) Object() types.Object                 { return v.object }
-func (v *Global) String() string                       { return v.RelString(nil) }
-func (v *Global) Package() *Package                    { return v.Pkg }
-func (v *Global) RelString(from *types.Package) string { return relString(v, from) }
-
-func (v *Function) Name() string         { return v.name }
-func (v *Function) Type() types.Type     { return v.Signature }
-func (v *Function) Pos() token.Pos       { return v.pos }
-func (v *Function) Token() token.Token   { return token.FUNC }
-func (v *Function) Object() types.Object { return v.object }
-func (v *Function) String() string       { return v.RelString(nil) }
-func (v *Function) Package() *Package    { return v.Pkg }
-func (v *Function) Parent() *Function    { return v.parent }
-func (v *Function) Referrers() *[]Instruction {
-	if v.parent != nil {
-		return &v.referrers
-	}
-	return nil
-}
-
-func (v *Parameter) Type() types.Type          { return v.typ }
-func (v *Parameter) Name() string              { return v.name }
-func (v *Parameter) Object() types.Object      { return v.object }
-func (v *Parameter) Referrers() *[]Instruction { return &v.referrers }
-func (v *Parameter) Pos() token.Pos            { return v.pos }
-func (v *Parameter) Parent() *Function         { return v.parent }
-
-func (v *Alloc) Type() types.Type          { return v.typ }
-func (v *Alloc) Referrers() *[]Instruction { return &v.referrers }
-func (v *Alloc) Pos() token.Pos            { return v.pos }
-
-func (v *register) Type() types.Type          { return v.typ }
-func (v *register) setType(typ types.Type)    { v.typ = typ }
-func (v *register) Name() string              { return fmt.Sprintf("t%d", v.num) }
-func (v *register) setNum(num int)            { v.num = num }
-func (v *register) Referrers() *[]Instruction { return &v.referrers }
-func (v *register) Pos() token.Pos            { return v.pos }
-func (v *register) setPos(pos token.Pos)      { v.pos = pos }
-
-func (v *anInstruction) Parent() *Function          { return v.block.parent }
-func (v *anInstruction) Block() *BasicBlock         { return v.block }
-func (v *anInstruction) setBlock(block *BasicBlock) { v.block = block }
-func (v *anInstruction) Referrers() *[]Instruction  { return nil }
-
-func (t *Type) Name() string                         { return t.object.Name() }
-func (t *Type) Pos() token.Pos                       { return t.object.Pos() }
-func (t *Type) Type() types.Type                     { return t.object.Type() }
-func (t *Type) Token() token.Token                   { return token.TYPE }
-func (t *Type) Object() types.Object                 { return t.object }
-func (t *Type) String() string                       { return t.RelString(nil) }
-func (t *Type) Package() *Package                    { return t.pkg }
-func (t *Type) RelString(from *types.Package) string { return relString(t, from) }
-
-func (c *NamedConst) Name() string                         { return c.object.Name() }
-func (c *NamedConst) Pos() token.Pos                       { return c.object.Pos() }
-func (c *NamedConst) String() string                       { return c.RelString(nil) }
-func (c *NamedConst) Type() types.Type                     { return c.object.Type() }
-func (c *NamedConst) Token() token.Token                   { return token.CONST }
-func (c *NamedConst) Object() types.Object                 { return c.object }
-func (c *NamedConst) Package() *Package                    { return c.pkg }
-func (c *NamedConst) RelString(from *types.Package) string { return relString(c, from) }
-
-// Func returns the package-level function of the specified name,
-// or nil if not found.
-//
-func (p *Package) Func(name string) (f *Function) {
-	f, _ = p.Members[name].(*Function)
-	return
-}
-
-// Var returns the package-level variable of the specified name,
-// or nil if not found.
-//
-func (p *Package) Var(name string) (g *Global) {
-	g, _ = p.Members[name].(*Global)
-	return
-}
-
-// Const returns the package-level constant of the specified name,
-// or nil if not found.
-//
-func (p *Package) Const(name string) (c *NamedConst) {
-	c, _ = p.Members[name].(*NamedConst)
-	return
-}
-
-// Type returns the package-level type of the specified name,
-// or nil if not found.
-//
-func (p *Package) Type(name string) (t *Type) {
-	t, _ = p.Members[name].(*Type)
-	return
-}
-
-func (v *Call) Pos() token.Pos      { return v.Call.pos }
-func (s *Defer) Pos() token.Pos     { return s.pos }
-func (s *Go) Pos() token.Pos        { return s.pos }
-func (s *MapUpdate) Pos() token.Pos { return s.pos }
-func (s *Panic) Pos() token.Pos     { return s.pos }
-func (s *Return) Pos() token.Pos    { return s.pos }
-func (s *Send) Pos() token.Pos      { return s.pos }
-func (s *Store) Pos() token.Pos     { return s.pos }
-func (s *If) Pos() token.Pos        { return token.NoPos }
-func (s *Jump) Pos() token.Pos      { return token.NoPos }
-func (s *RunDefers) Pos() token.Pos { return token.NoPos }
-func (s *DebugRef) Pos() token.Pos  { return s.Expr.Pos() }
-
-// Operands.
-
-func (v *Alloc) Operands(rands []*Value) []*Value {
-	return rands
-}
-
-func (v *BinOp) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X, &v.Y)
-}
-
-func (c *CallCommon) Operands(rands []*Value) []*Value {
-	rands = append(rands, &c.Value)
-	for i := range c.Args {
-		rands = append(rands, &c.Args[i])
-	}
-	return rands
-}
-
-func (s *Go) Operands(rands []*Value) []*Value {
-	return s.Call.Operands(rands)
-}
-
-func (s *Call) Operands(rands []*Value) []*Value {
-	return s.Call.Operands(rands)
-}
-
-func (s *Defer) Operands(rands []*Value) []*Value {
-	return s.Call.Operands(rands)
-}
-
-func (v *ChangeInterface) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X)
-}
-
-func (v *ChangeType) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X)
-}
-
-func (v *Convert) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X)
-}
-
-func (s *DebugRef) Operands(rands []*Value) []*Value {
-	return append(rands, &s.X)
-}
-
-func (v *Extract) Operands(rands []*Value) []*Value {
-	return append(rands, &v.Tuple)
-}
-
-func (v *Field) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X)
-}
-
-func (v *FieldAddr) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X)
-}
-
-func (s *If) Operands(rands []*Value) []*Value {
-	return append(rands, &s.Cond)
-}
-
-func (v *Index) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X, &v.Index)
-}
-
-func (v *IndexAddr) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X, &v.Index)
-}
-
-func (*Jump) Operands(rands []*Value) []*Value {
-	return rands
-}
-
-func (v *Lookup) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X, &v.Index)
-}
-
-func (v *MakeChan) Operands(rands []*Value) []*Value {
-	return append(rands, &v.Size)
-}
-
-func (v *MakeClosure) Operands(rands []*Value) []*Value {
-	rands = append(rands, &v.Fn)
-	for i := range v.Bindings {
-		rands = append(rands, &v.Bindings[i])
-	}
-	return rands
-}
-
-func (v *MakeInterface) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X)
-}
-
-func (v *MakeMap) Operands(rands []*Value) []*Value {
-	return append(rands, &v.Reserve)
-}
-
-func (v *MakeSlice) Operands(rands []*Value) []*Value {
-	return append(rands, &v.Len, &v.Cap)
-}
-
-func (v *MapUpdate) Operands(rands []*Value) []*Value {
-	return append(rands, &v.Map, &v.Key, &v.Value)
-}
-
-func (v *Next) Operands(rands []*Value) []*Value {
-	return append(rands, &v.Iter)
-}
-
-func (s *Panic) Operands(rands []*Value) []*Value {
-	return append(rands, &s.X)
-}
-
-func (v *Phi) Operands(rands []*Value) []*Value {
-	for i := range v.Edges {
-		rands = append(rands, &v.Edges[i])
-	}
-	return rands
-}
-
-func (v *Range) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X)
-}
-
-func (s *Return) Operands(rands []*Value) []*Value {
-	for i := range s.Results {
-		rands = append(rands, &s.Results[i])
-	}
-	return rands
-}
-
-func (*RunDefers) Operands(rands []*Value) []*Value {
-	return rands
-}
-
-func (v *Select) Operands(rands []*Value) []*Value {
-	for i := range v.States {
-		rands = append(rands, &v.States[i].Chan, &v.States[i].Send)
-	}
-	return rands
-}
-
-func (s *Send) Operands(rands []*Value) []*Value {
-	return append(rands, &s.Chan, &s.X)
-}
-
-func (v *Slice) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X, &v.Low, &v.High, &v.Max)
-}
-
-func (s *Store) Operands(rands []*Value) []*Value {
-	return append(rands, &s.Addr, &s.Val)
-}
-
-func (v *TypeAssert) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X)
-}
-
-func (v *UnOp) Operands(rands []*Value) []*Value {
-	return append(rands, &v.X)
-}
-
-// Non-Instruction Values:
-func (v *Builtin) Operands(rands []*Value) []*Value   { return rands }
-func (v *FreeVar) Operands(rands []*Value) []*Value   { return rands }
-func (v *Const) Operands(rands []*Value) []*Value     { return rands }
-func (v *Function) Operands(rands []*Value) []*Value  { return rands }
-func (v *Global) Operands(rands []*Value) []*Value    { return rands }
-func (v *Parameter) Operands(rands []*Value) []*Value { return rands }
diff --git a/third_party/gotools/go/ssa/ssautil/switch.go b/third_party/gotools/go/ssa/ssautil/switch.go
deleted file mode 100644
index 700cd7e..0000000
--- a/third_party/gotools/go/ssa/ssautil/switch.go
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssautil
-
-// This file implements discovery of switch and type-switch constructs
-// from low-level control flow.
-//
-// Many techniques exist for compiling a high-level switch with
-// constant cases to efficient machine code.  The optimal choice will
-// depend on the data type, the specific case values, the code in the
-// body of each case, and the hardware.
-// Some examples:
-// - a lookup table (for a switch that maps constants to constants)
-// - a computed goto
-// - a binary tree
-// - a perfect hash
-// - a two-level switch (to partition constant strings by their first byte).
-
-import (
-	"bytes"
-	"fmt"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// A ConstCase represents a single constant comparison.
-// It is part of a Switch.
-type ConstCase struct {
-	Block *ssa.BasicBlock // block performing the comparison
-	Body  *ssa.BasicBlock // body of the case
-	Value *ssa.Const      // case comparand
-}
-
-// A TypeCase represents a single type assertion.
-// It is part of a Switch.
-type TypeCase struct {
-	Block   *ssa.BasicBlock // block performing the type assert
-	Body    *ssa.BasicBlock // body of the case
-	Type    types.Type      // case type
-	Binding ssa.Value       // value bound by this case
-}
-
-// A Switch is a logical high-level control flow operation
-// (a multiway branch) discovered by analysis of a CFG containing
-// only if/else chains.  It is not part of the ssa.Instruction set.
-//
-// One of ConstCases and TypeCases has length >= 2;
-// the other is nil.
-//
-// In a value switch, the list of cases may contain duplicate constants.
-// A type switch may contain duplicate types, or types assignable
-// to an interface type also in the list.
-// TODO(adonovan): eliminate such duplicates.
-//
-type Switch struct {
-	Start      *ssa.BasicBlock // block containing start of if/else chain
-	X          ssa.Value       // the switch operand
-	ConstCases []ConstCase     // ordered list of constant comparisons
-	TypeCases  []TypeCase      // ordered list of type assertions
-	Default    *ssa.BasicBlock // successor if all comparisons fail
-}
-
-func (sw *Switch) String() string {
-	// We represent each block by the String() of its
-	// first Instruction, e.g. "print(42:int)".
-	var buf bytes.Buffer
-	if sw.ConstCases != nil {
-		fmt.Fprintf(&buf, "switch %s {\n", sw.X.Name())
-		for _, c := range sw.ConstCases {
-			fmt.Fprintf(&buf, "case %s: %s\n", c.Value, c.Body.Instrs[0])
-		}
-	} else {
-		fmt.Fprintf(&buf, "switch %s.(type) {\n", sw.X.Name())
-		for _, c := range sw.TypeCases {
-			fmt.Fprintf(&buf, "case %s %s: %s\n",
-				c.Binding.Name(), c.Type, c.Body.Instrs[0])
-		}
-	}
-	if sw.Default != nil {
-		fmt.Fprintf(&buf, "default: %s\n", sw.Default.Instrs[0])
-	}
-	fmt.Fprintf(&buf, "}")
-	return buf.String()
-}
-
-// Switches examines the control-flow graph of fn and returns the
-// set of inferred value and type switches.  A value switch tests an
-// ssa.Value for equality against two or more compile-time constant
-// values.  Switches involving link-time constants (addresses) are
-// ignored.  A type switch type-asserts an ssa.Value against two or
-// more types.
-//
-// The switches are returned in dominance order.
-//
-// The resulting switches do not necessarily correspond to uses of the
-// 'switch' keyword in the source: for example, a single source-level
-// switch statement with non-constant cases may result in zero, one or
-// many Switches, one per plural sequence of constant cases.
-// Switches may even be inferred from if/else- or goto-based control flow.
-// (In general, the control flow constructs of the source program
-// cannot be faithfully reproduced from the SSA representation.)
-//
-func Switches(fn *ssa.Function) []Switch {
-	// Traverse the CFG in dominance order, so we don't
-	// enter an if/else-chain in the middle.
-	var switches []Switch
-	seen := make(map[*ssa.BasicBlock]bool) // TODO(adonovan): opt: use ssa.blockSet
-	for _, b := range fn.DomPreorder() {
-		if x, k := isComparisonBlock(b); x != nil {
-			// Block b starts a switch.
-			sw := Switch{Start: b, X: x}
-			valueSwitch(&sw, k, seen)
-			if len(sw.ConstCases) > 1 {
-				switches = append(switches, sw)
-			}
-		}
-
-		if y, x, T := isTypeAssertBlock(b); y != nil {
-			// Block b starts a type switch.
-			sw := Switch{Start: b, X: x}
-			typeSwitch(&sw, y, T, seen)
-			if len(sw.TypeCases) > 1 {
-				switches = append(switches, sw)
-			}
-		}
-	}
-	return switches
-}
-
-func valueSwitch(sw *Switch, k *ssa.Const, seen map[*ssa.BasicBlock]bool) {
-	b := sw.Start
-	x := sw.X
-	for x == sw.X {
-		if seen[b] {
-			break
-		}
-		seen[b] = true
-
-		sw.ConstCases = append(sw.ConstCases, ConstCase{
-			Block: b,
-			Body:  b.Succs[0],
-			Value: k,
-		})
-		b = b.Succs[1]
-		if len(b.Instrs) > 2 {
-			// Block b contains not just 'if x == k',
-			// so it may have side effects that
-			// make it unsafe to elide.
-			break
-		}
-		if len(b.Preds) != 1 {
-			// Block b has multiple predecessors,
-			// so it cannot be treated as a case.
-			break
-		}
-		x, k = isComparisonBlock(b)
-	}
-	sw.Default = b
-}
-
-func typeSwitch(sw *Switch, y ssa.Value, T types.Type, seen map[*ssa.BasicBlock]bool) {
-	b := sw.Start
-	x := sw.X
-	for x == sw.X {
-		if seen[b] {
-			break
-		}
-		seen[b] = true
-
-		sw.TypeCases = append(sw.TypeCases, TypeCase{
-			Block:   b,
-			Body:    b.Succs[0],
-			Type:    T,
-			Binding: y,
-		})
-		b = b.Succs[1]
-		if len(b.Instrs) > 4 {
-			// Block b contains not just
-			//  {TypeAssert; Extract #0; Extract #1; If}
-			// so it may have side effects that
-			// make it unsafe to elide.
-			break
-		}
-		if len(b.Preds) != 1 {
-			// Block b has multiple predecessors,
-			// so it cannot be treated as a case.
-			break
-		}
-		y, x, T = isTypeAssertBlock(b)
-	}
-	sw.Default = b
-}
-
-// isComparisonBlock returns the operands (v, k) if a block ends with
-// a comparison v==k, where k is a compile-time constant.
-//
-func isComparisonBlock(b *ssa.BasicBlock) (v ssa.Value, k *ssa.Const) {
-	if n := len(b.Instrs); n >= 2 {
-		if i, ok := b.Instrs[n-1].(*ssa.If); ok {
-			if binop, ok := i.Cond.(*ssa.BinOp); ok && binop.Block() == b && binop.Op == token.EQL {
-				if k, ok := binop.Y.(*ssa.Const); ok {
-					return binop.X, k
-				}
-				if k, ok := binop.X.(*ssa.Const); ok {
-					return binop.Y, k
-				}
-			}
-		}
-	}
-	return
-}
-
-// isTypeAssertBlock returns the operands (y, x, T) if a block ends with
-// a type assertion "if y, ok := x.(T); ok {".
-//
-func isTypeAssertBlock(b *ssa.BasicBlock) (y, x ssa.Value, T types.Type) {
-	if n := len(b.Instrs); n >= 4 {
-		if i, ok := b.Instrs[n-1].(*ssa.If); ok {
-			if ext1, ok := i.Cond.(*ssa.Extract); ok && ext1.Block() == b && ext1.Index == 1 {
-				if ta, ok := ext1.Tuple.(*ssa.TypeAssert); ok && ta.Block() == b {
-					// hack: relies upon instruction ordering.
-					if ext0, ok := b.Instrs[n-3].(*ssa.Extract); ok {
-						return ext0, ta.X, ta.AssertedType
-					}
-				}
-			}
-		}
-	}
-	return
-}
diff --git a/third_party/gotools/go/ssa/ssautil/switch_test.go b/third_party/gotools/go/ssa/ssautil/switch_test.go
deleted file mode 100644
index de43814..0000000
--- a/third_party/gotools/go/ssa/ssautil/switch_test.go
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssautil_test
-
-import (
-	"go/parser"
-	"strings"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/ssa/ssautil"
-)
-
-func TestSwitches(t *testing.T) {
-	conf := loader.Config{ParserMode: parser.ParseComments}
-	f, err := conf.ParseFile("testdata/switches.go", nil)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	conf.CreateFromFiles("main", f)
-	iprog, err := conf.Load()
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	prog := ssa.Create(iprog, 0)
-	mainPkg := prog.Package(iprog.Created[0].Pkg)
-	mainPkg.Build()
-
-	for _, mem := range mainPkg.Members {
-		if fn, ok := mem.(*ssa.Function); ok {
-			if fn.Synthetic != "" {
-				continue // e.g. init()
-			}
-			// Each (multi-line) "switch" comment within
-			// this function must match the printed form
-			// of a ConstSwitch.
-			var wantSwitches []string
-			for _, c := range f.Comments {
-				if fn.Syntax().Pos() <= c.Pos() && c.Pos() < fn.Syntax().End() {
-					text := strings.TrimSpace(c.Text())
-					if strings.HasPrefix(text, "switch ") {
-						wantSwitches = append(wantSwitches, text)
-					}
-				}
-			}
-
-			switches := ssautil.Switches(fn)
-			if len(switches) != len(wantSwitches) {
-				t.Errorf("in %s, found %d switches, want %d", fn, len(switches), len(wantSwitches))
-			}
-			for i, sw := range switches {
-				got := sw.String()
-				if i >= len(wantSwitches) {
-					continue
-				}
-				want := wantSwitches[i]
-				if got != want {
-					t.Errorf("in %s, found switch %d: got <<%s>>, want <<%s>>", fn, i, got, want)
-				}
-			}
-		}
-	}
-}
diff --git a/third_party/gotools/go/ssa/ssautil/testdata/switches.go b/third_party/gotools/go/ssa/ssautil/testdata/switches.go
deleted file mode 100644
index 8ab4c11..0000000
--- a/third_party/gotools/go/ssa/ssautil/testdata/switches.go
+++ /dev/null
@@ -1,357 +0,0 @@
-// +build ignore
-
-package main
-
-// This file is the input to TestSwitches in switch_test.go.
-// Each multiway conditional with constant or type cases (Switch)
-// discovered by Switches is printed, and compared with the
-// comments.
-//
-// The body of each case is printed as the value of its first
-// instruction.
-
-// -------- Value switches --------
-
-func SimpleSwitch(x, y int) {
-	// switch x {
-	// case 1:int: print(1:int)
-	// case 2:int: print(23:int)
-	// case 3:int: print(23:int)
-	// case 4:int: print(3:int)
-	// default: x == y
-	// }
-	switch x {
-	case 1:
-		print(1)
-	case 2, 3:
-		print(23)
-		fallthrough
-	case 4:
-		print(3)
-	default:
-		print(4)
-	case y:
-		print(5)
-	}
-	print(6)
-}
-
-func four() int { return 4 }
-
-// A non-constant case makes a switch "impure", but its pure
-// cases form two separate switches.
-func SwitchWithNonConstantCase(x int) {
-	// switch x {
-	// case 1:int: print(1:int)
-	// case 2:int: print(23:int)
-	// case 3:int: print(23:int)
-	// default: four()
-	// }
-
-	// switch x {
-	// case 5:int: print(5:int)
-	// case 6:int: print(6:int)
-	// default: print("done":string)
-	// }
-	switch x {
-	case 1:
-		print(1)
-	case 2, 3:
-		print(23)
-	case four():
-		print(3)
-	case 5:
-		print(5)
-	case 6:
-		print(6)
-	}
-	print("done")
-}
-
-// Switches may be found even where the source
-// program doesn't have a switch statement.
-
-func ImplicitSwitches(x, y int) {
-	// switch x {
-	// case 1:int: print(12:int)
-	// case 2:int: print(12:int)
-	// default: x < 5:int
-	// }
-	if x == 1 || 2 == x || x < 5 {
-		print(12)
-	}
-
-	// switch x {
-	// case 3:int: print(34:int)
-	// case 4:int: print(34:int)
-	// default: x == y
-	// }
-	if x == 3 || 4 == x || x == y {
-		print(34)
-	}
-
-	// Not a switch: no consistent variable.
-	if x == 5 || y == 6 {
-		print(56)
-	}
-
-	// Not a switch: only one constant comparison.
-	if x == 7 || x == y {
-		print(78)
-	}
-}
-
-func IfElseBasedSwitch(x int) {
-	// switch x {
-	// case 1:int: print(1:int)
-	// case 2:int: print(2:int)
-	// default: print("else":string)
-	// }
-	if x == 1 {
-		print(1)
-	} else if x == 2 {
-		print(2)
-	} else {
-		print("else")
-	}
-}
-
-func GotoBasedSwitch(x int) {
-	// switch x {
-	// case 1:int: print(1:int)
-	// case 2:int: print(2:int)
-	// default: print("else":string)
-	// }
-	if x == 1 {
-		goto L1
-	}
-	if x == 2 {
-		goto L2
-	}
-	print("else")
-L1:
-	print(1)
-	goto end
-L2:
-	print(2)
-end:
-}
-
-func SwitchInAForLoop(x int) {
-	// switch x {
-	// case 1:int: print(1:int)
-	// case 2:int: print(2:int)
-	// default: print("head":string)
-	// }
-loop:
-	for {
-		print("head")
-		switch x {
-		case 1:
-			print(1)
-			break loop
-		case 2:
-			print(2)
-			break loop
-		}
-	}
-}
-
-// This case is a switch in a for-loop, both constructed using goto.
-// As before, the default case points back to the block containing the
-// switch, but that's ok.
-func SwitchInAForLoopUsingGoto(x int) {
-	// switch x {
-	// case 1:int: print(1:int)
-	// case 2:int: print(2:int)
-	// default: print("head":string)
-	// }
-loop:
-	print("head")
-	if x == 1 {
-		goto L1
-	}
-	if x == 2 {
-		goto L2
-	}
-	goto loop
-L1:
-	print(1)
-	goto end
-L2:
-	print(2)
-end:
-}
-
-func UnstructuredSwitchInAForLoop(x int) {
-	// switch x {
-	// case 1:int: print(1:int)
-	// case 2:int: x == 1:int
-	// default: print("end":string)
-	// }
-	for {
-		if x == 1 {
-			print(1)
-			return
-		}
-		if x == 2 {
-			continue
-		}
-		break
-	}
-	print("end")
-}
-
-func CaseWithMultiplePreds(x int) {
-	for {
-		if x == 1 {
-			print(1)
-			return
-		}
-	loop:
-		// This block has multiple predecessors,
-		// so can't be treated as a switch case.
-		if x == 2 {
-			goto loop
-		}
-		break
-	}
-	print("end")
-}
-
-func DuplicateConstantsAreNotEliminated(x int) {
-	// switch x {
-	// case 1:int: print(1:int)
-	// case 1:int: print("1a":string)
-	// case 2:int: print(2:int)
-	// default: return
-	// }
-	if x == 1 {
-		print(1)
-	} else if x == 1 { // duplicate => unreachable
-		print("1a")
-	} else if x == 2 {
-		print(2)
-	}
-}
-
-// Interface values (created by comparisons) are not constants,
-// so ConstSwitch.X is never of interface type.
-func MakeInterfaceIsNotAConstant(x interface{}) {
-	if x == "foo" {
-		print("foo")
-	} else if x == 1 {
-		print(1)
-	}
-}
-
-func ZeroInitializedVarsAreConstants(x int) {
-	// switch x {
-	// case 0:int: print(1:int)
-	// case 2:int: print(2:int)
-	// default: print("end":string)
-	// }
-	var zero int // SSA construction replaces zero with 0
-	if x == zero {
-		print(1)
-	} else if x == 2 {
-		print(2)
-	}
-	print("end")
-}
-
-// -------- Select --------
-
-// NB, potentially fragile reliance on register number.
-func SelectDesugarsToSwitch(ch chan int) {
-	// switch t1 {
-	// case 0:int: extract t0 #2
-	// case 1:int: println(0:int)
-	// case 2:int: println(1:int)
-	// default: println("default":string)
-	// }
-	select {
-	case x := <-ch:
-		println(x)
-	case <-ch:
-		println(0)
-	case ch <- 1:
-		println(1)
-	default:
-		println("default")
-	}
-}
-
-// NB, potentially fragile reliance on register number.
-func NonblockingSelectDefaultCasePanics(ch chan int) {
-	// switch t1 {
-	// case 0:int: extract t0 #2
-	// case 1:int: println(0:int)
-	// case 2:int: println(1:int)
-	// default: make interface{} <- string ("blocking select m...":string)
-	// }
-	select {
-	case x := <-ch:
-		println(x)
-	case <-ch:
-		println(0)
-	case ch <- 1:
-		println(1)
-	}
-}
-
-// -------- Type switches --------
-
-// NB, reliance on fragile register numbering.
-func SimpleTypeSwitch(x interface{}) {
-	// switch x.(type) {
-	// case t3 int: println(x)
-	// case t7 bool: println(x)
-	// case t10 string: println(t10)
-	// default: println(x)
-	// }
-	switch y := x.(type) {
-	case nil:
-		println(y)
-	case int, bool:
-		println(y)
-	case string:
-		println(y)
-	default:
-		println(y)
-	}
-}
-
-// NB, potentially fragile reliance on register number.
-func DuplicateTypesAreNotEliminated(x interface{}) {
-	// switch x.(type) {
-	// case t1 string: println(1:int)
-	// case t5 interface{}: println(t5)
-	// case t9 int: println(3:int)
-	// default: return
-	// }
-	switch y := x.(type) {
-	case string:
-		println(1)
-	case interface{}:
-		println(y)
-	case int:
-		println(3) // unreachable!
-	}
-}
-
-// NB, potentially fragile reliance on register number.
-func AdHocTypeSwitch(x interface{}) {
-	// switch x.(type) {
-	// case t1 int: println(t1)
-	// case t5 string: println(t5)
-	// default: print("default":string)
-	// }
-	if i, ok := x.(int); ok {
-		println(i)
-	} else if s, ok := x.(string); ok {
-		println(s)
-	} else {
-		print("default")
-	}
-}
diff --git a/third_party/gotools/go/ssa/ssautil/visit.go b/third_party/gotools/go/ssa/ssautil/visit.go
deleted file mode 100644
index f2e5632..0000000
--- a/third_party/gotools/go/ssa/ssautil/visit.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssautil // import "llvm.org/llgo/third_party/gotools/go/ssa/ssautil"
-
-import "llvm.org/llgo/third_party/gotools/go/ssa"
-
-// This file defines utilities for visiting the SSA representation of
-// a Program.
-//
-// TODO(adonovan): test coverage.
-
-// AllFunctions finds and returns the set of functions potentially
-// needed by program prog, as determined by a simple linker-style
-// reachability algorithm starting from the members and method-sets of
-// each package.  The result may include anonymous functions and
-// synthetic wrappers.
-//
-// Precondition: all packages are built.
-//
-func AllFunctions(prog *ssa.Program) map[*ssa.Function]bool {
-	visit := visitor{
-		prog: prog,
-		seen: make(map[*ssa.Function]bool),
-	}
-	visit.program()
-	return visit.seen
-}
-
-type visitor struct {
-	prog *ssa.Program
-	seen map[*ssa.Function]bool
-}
-
-func (visit *visitor) program() {
-	for _, pkg := range visit.prog.AllPackages() {
-		for _, mem := range pkg.Members {
-			if fn, ok := mem.(*ssa.Function); ok {
-				visit.function(fn)
-			}
-		}
-	}
-	for _, T := range visit.prog.RuntimeTypes() {
-		mset := visit.prog.MethodSets.MethodSet(T)
-		for i, n := 0, mset.Len(); i < n; i++ {
-			visit.function(visit.prog.Method(mset.At(i)))
-		}
-	}
-}
-
-func (visit *visitor) function(fn *ssa.Function) {
-	if !visit.seen[fn] {
-		visit.seen[fn] = true
-		var buf [10]*ssa.Value // avoid alloc in common case
-		for _, b := range fn.Blocks {
-			for _, instr := range b.Instrs {
-				for _, op := range instr.Operands(buf[:0]) {
-					if fn, ok := (*op).(*ssa.Function); ok {
-						visit.function(fn)
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/third_party/gotools/go/ssa/stdlib_test.go b/third_party/gotools/go/ssa/stdlib_test.go
deleted file mode 100644
index d57bc5f..0000000
--- a/third_party/gotools/go/ssa/stdlib_test.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa_test
-
-// This file runs the SSA builder in sanity-checking mode on all
-// packages beneath $GOROOT and prints some summary information.
-//
-// Run with "go test -cpu=8 to" set GOMAXPROCS.
-
-import (
-	"go/ast"
-	"go/build"
-	"go/token"
-	"runtime"
-	"testing"
-	"time"
-
-	"llvm.org/llgo/third_party/gotools/go/buildutil"
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-	"llvm.org/llgo/third_party/gotools/go/ssa/ssautil"
-)
-
-func bytesAllocated() uint64 {
-	runtime.GC()
-	var stats runtime.MemStats
-	runtime.ReadMemStats(&stats)
-	return stats.Alloc
-}
-
-func TestStdlib(t *testing.T) {
-	// Load, parse and type-check the program.
-	t0 := time.Now()
-	alloc0 := bytesAllocated()
-
-	// Load, parse and type-check the program.
-	ctxt := build.Default // copy
-	ctxt.GOPATH = ""      // disable GOPATH
-	conf := loader.Config{Build: &ctxt}
-	if _, err := conf.FromArgs(buildutil.AllPackages(conf.Build), true); err != nil {
-		t.Errorf("FromArgs failed: %v", err)
-		return
-	}
-
-	iprog, err := conf.Load()
-	if err != nil {
-		t.Fatalf("Load failed: %v", err)
-	}
-
-	t1 := time.Now()
-	alloc1 := bytesAllocated()
-
-	// Create SSA packages.
-	var mode ssa.BuilderMode
-	// Comment out these lines during benchmarking.  Approx SSA build costs are noted.
-	mode |= ssa.SanityCheckFunctions // + 2% space, + 4% time
-	mode |= ssa.GlobalDebug          // +30% space, +18% time
-	prog := ssa.Create(iprog, mode)
-
-	t2 := time.Now()
-
-	// Build SSA.
-	prog.BuildAll()
-
-	t3 := time.Now()
-	alloc3 := bytesAllocated()
-
-	numPkgs := len(prog.AllPackages())
-	if want := 140; numPkgs < want {
-		t.Errorf("Loaded only %d packages, want at least %d", numPkgs, want)
-	}
-
-	// Keep iprog reachable until after we've measured memory usage.
-	if len(iprog.AllPackages) == 0 {
-		print() // unreachable
-	}
-
-	allFuncs := ssautil.AllFunctions(prog)
-
-	// Check that all non-synthetic functions have distinct names.
-	// Synthetic wrappers for exported methods should be distinct too,
-	// except for unexported ones (explained at (*Function).RelString).
-	byName := make(map[string]*ssa.Function)
-	for fn := range allFuncs {
-		if fn.Synthetic == "" || ast.IsExported(fn.Name()) {
-			str := fn.String()
-			prev := byName[str]
-			byName[str] = fn
-			if prev != nil {
-				t.Errorf("%s: duplicate function named %s",
-					prog.Fset.Position(fn.Pos()), str)
-				t.Errorf("%s:   (previously defined here)",
-					prog.Fset.Position(prev.Pos()))
-			}
-		}
-	}
-
-	// Dump some statistics.
-	var numInstrs int
-	for fn := range allFuncs {
-		for _, b := range fn.Blocks {
-			numInstrs += len(b.Instrs)
-		}
-	}
-
-	// determine line count
-	var lineCount int
-	prog.Fset.Iterate(func(f *token.File) bool {
-		lineCount += f.LineCount()
-		return true
-	})
-
-	// NB: when benchmarking, don't forget to clear the debug +
-	// sanity builder flags for better performance.
-
-	t.Log("GOMAXPROCS:           ", runtime.GOMAXPROCS(0))
-	t.Log("#Source lines:        ", lineCount)
-	t.Log("Load/parse/typecheck: ", t1.Sub(t0))
-	t.Log("SSA create:           ", t2.Sub(t1))
-	t.Log("SSA build:            ", t3.Sub(t2))
-
-	// SSA stats:
-	t.Log("#Packages:            ", numPkgs)
-	t.Log("#Functions:           ", len(allFuncs))
-	t.Log("#Instructions:        ", numInstrs)
-	t.Log("#MB AST+types:        ", int64(alloc1-alloc0)/1e6)
-	t.Log("#MB SSA:              ", int64(alloc3-alloc1)/1e6)
-}
diff --git a/third_party/gotools/go/ssa/testdata/objlookup.go b/third_party/gotools/go/ssa/testdata/objlookup.go
deleted file mode 100644
index 1aaa417..0000000
--- a/third_party/gotools/go/ssa/testdata/objlookup.go
+++ /dev/null
@@ -1,160 +0,0 @@
-//+build ignore
-
-package main
-
-// This file is the input to TestObjValueLookup in source_test.go,
-// which ensures that each occurrence of an ident defining or
-// referring to a func, var or const object can be mapped to its
-// corresponding SSA Value.
-//
-// For every reference to a var object, we use annotations in comments
-// to denote both the expected SSA Value kind, and whether to expect
-// its value (x) or its address (&x).
-//
-// For const and func objects, the results don't vary by reference and
-// are always values not addresses, so no annotations are needed.  The
-// declaration is enough.
-
-import "fmt"
-import "os"
-
-type J int
-
-func (*J) method() {}
-
-const globalConst = 0
-
-var globalVar int // &globalVar::Global
-
-func globalFunc() {}
-
-type I interface {
-	interfaceMethod()
-}
-
-type S struct {
-	x int // x::nil
-}
-
-func main() {
-	print(globalVar) // globalVar::UnOp
-	globalVar = 1    // globalVar::Const
-
-	var v0 int = 1 // v0::Const (simple local value spec)
-	if v0 > 0 {    // v0::Const
-		v0 = 2 // v0::Const
-	}
-	print(v0) // v0::Phi
-
-	// v1 is captured and thus implicitly address-taken.
-	var v1 int = 1         // v1::Const
-	v1 = 2                 // v1::Const
-	fmt.Println(v1)        // v1::UnOp (load)
-	f := func(param int) { // f::MakeClosure param::Parameter
-		if y := 1; y > 0 { // y::Const
-			print(v1, param) // v1::UnOp (load) param::Parameter
-		}
-		param = 2      // param::Const
-		println(param) // param::Const
-	}
-
-	f(0) // f::MakeClosure
-
-	var v2 int // v2::Const (implicitly zero-initialized local value spec)
-	print(v2)  // v2::Const
-
-	m := make(map[string]int) // m::MakeMap
-
-	// Local value spec with multi-valued RHS:
-	var v3, v4 = m[""] // v3::Extract v4::Extract m::MakeMap
-	print(v3)          // v3::Extract
-	print(v4)          // v4::Extract
-
-	v3++    // v3::BinOp (assign with op)
-	v3 += 2 // v3::BinOp (assign with op)
-
-	v5, v6 := false, "" // v5::Const v6::Const (defining assignment)
-	print(v5)           // v5::Const
-	print(v6)           // v6::Const
-
-	var v7 S    // &v7::Alloc
-	v7.x = 1    // &v7::Alloc &x::FieldAddr
-	print(v7.x) // &v7::Alloc &x::FieldAddr
-
-	var v8 [1]int // &v8::Alloc
-	v8[0] = 0     // &v8::Alloc
-	print(v8[:])  // &v8::Alloc
-	_ = v8[0]     // &v8::Alloc
-	_ = v8[:][0]  // &v8::Alloc
-	v8ptr := &v8  // v8ptr::Alloc &v8::Alloc
-	_ = v8ptr[0]  // v8ptr::Alloc
-	_ = *v8ptr    // v8ptr::Alloc
-
-	v8a := make([]int, 1) // v8a::Slice
-	v8a[0] = 0            // v8a::Slice
-	print(v8a[:])         // v8a::Slice
-
-	v9 := S{} // &v9::Alloc
-
-	v10 := &v9 // v10::Alloc &v9::Alloc
-	_ = v10    // v10::Alloc
-
-	var v11 *J = nil // v11::Const
-	v11.method()     // v11::Const
-
-	var v12 J    // &v12::Alloc
-	v12.method() // &v12::Alloc (implicitly address-taken)
-
-	// NB, in the following, 'method' resolves to the *types.Func
-	// of (*J).method, so it doesn't help us locate the specific
-	// ssa.Values here: a bound-method closure and a promotion
-	// wrapper.
-	_ = v11.method            // v11::Const
-	_ = (*struct{ J }).method // J::nil
-
-	// These vars are not optimised away.
-	if false {
-		v13 := 0     // v13::Const
-		println(v13) // v13::Const
-	}
-
-	switch x := 1; x { // x::Const
-	case v0: // v0::Phi
-	}
-
-	for k, v := range m { // k::Extract v::Extract m::MakeMap
-		_ = k // k::Extract
-		v++   // v::BinOp
-	}
-
-	if y := 0; y > 1 { // y::Const y::Const
-	}
-
-	var i interface{}      // i::Const (nil interface)
-	i = 1                  // i::MakeInterface
-	switch i := i.(type) { // i::MakeInterface i::MakeInterface
-	case int:
-		println(i) // i::Extract
-	}
-
-	ch := make(chan int) // ch::MakeChan
-	select {
-	case x := <-ch: // x::UnOp (receive) ch::MakeChan
-		_ = x // x::UnOp
-	}
-
-	// .Op is an inter-package FieldVal-selection.
-	var err os.PathError // &err::Alloc
-	_ = err.Op           // &err::Alloc &Op::FieldAddr
-	_ = &err.Op          // &err::Alloc &Op::FieldAddr
-
-	// Exercise corner-cases of lvalues vs rvalues.
-	// (Guessing IsAddr from the 'pointerness' won't cut it here.)
-	type N *N
-	var n N    // n::Const
-	n1 := n    // n1::Const n::Const
-	n2 := &n1  // n2::Alloc &n1::Alloc
-	n3 := *n2  // n3::UnOp n2::Alloc
-	n4 := **n3 // n4::UnOp n3::UnOp
-	_ = n4     // n4::UnOp
-}
diff --git a/third_party/gotools/go/ssa/testdata/valueforexpr.go b/third_party/gotools/go/ssa/testdata/valueforexpr.go
deleted file mode 100644
index 028c153..0000000
--- a/third_party/gotools/go/ssa/testdata/valueforexpr.go
+++ /dev/null
@@ -1,148 +0,0 @@
-//+build ignore
-
-package main
-
-// This file is the input to TestValueForExpr in source_test.go, which
-// ensures that each expression e immediately following a /*@kind*/(x)
-// annotation, when passed to Function.ValueForExpr(e), returns a
-// non-nil Value of the same type as e and of kind 'kind'.
-
-func f(spilled, unspilled int) {
-	_ = /*@UnOp*/ (spilled)
-	_ = /*@Parameter*/ (unspilled)
-	_ = /*@<nil>*/ (1 + 2) // (constant)
-	i := 0
-	/*@Call*/ (print( /*@BinOp*/ (i + 1)))
-	ch := /*@MakeChan*/ (make(chan int))
-	/*@UnOp*/ (<-ch)
-	x := /*@UnOp*/ (<-ch)
-	_ = x
-	select {
-	case /*@Extract*/ (<-ch):
-	case x := /*@Extract*/ (<-ch):
-		_ = x
-	}
-	defer /*@Function*/ (func() {
-	})()
-	go /*@Function*/ (func() {
-	})()
-	y := 0
-	if true && /*@BinOp*/ (bool(y > 0)) {
-		y = 1
-	}
-	_ = /*@Phi*/ (y)
-	map1 := /*@MakeMap*/ (make(map[string]string))
-	_ = map1
-	_ = /*@Slice*/ (make([]int, 0))
-	_ = /*@MakeClosure*/ (func() { print(spilled) })
-
-	sl := []int{}
-	_ = /*@Slice*/ (sl[:0])
-
-	_ = /*@<nil>*/ (new(int)) // optimized away
-	tmp := /*@Alloc*/ (new(int))
-	_ = tmp
-	var iface interface{}
-	_ = /*@TypeAssert*/ (iface.(int))
-	_ = /*@UnOp*/ (sl[0])
-	_ = /*@IndexAddr*/ (&sl[0])
-	_ = /*@Index*/ ([2]int{}[0])
-	var p *int
-	_ = /*@UnOp*/ (*p)
-
-	_ = /*@UnOp*/ (global)
-	/*@UnOp*/ (global)[""] = ""
-	/*@Global*/ (global) = map[string]string{}
-
-	var local t
-	/*UnOp*/ (local.x) = 1
-
-	// Exercise corner-cases of lvalues vs rvalues.
-	type N *N
-	var n N
-	/*@UnOp*/ (n) = /*@UnOp*/ (n)
-	/*@ChangeType*/ (n) = /*@Alloc*/ (&n)
-	/*@UnOp*/ (n) = /*@UnOp*/ (*n)
-	/*@UnOp*/ (n) = /*@UnOp*/ (**n)
-}
-
-func complit() {
-	// Composite literals.
-	// We get different results for
-	// - composite literal as value (e.g. operand to print)
-	// - composite literal initializer for addressable value
-	// - composite literal value assigned to blank var
-
-	// 1. Slices
-	print( /*@Slice*/ ([]int{}))
-	print( /*@Alloc*/ (&[]int{}))
-	print(& /*@Slice*/ ([]int{}))
-
-	sl1 := /*@Slice*/ ([]int{})
-	sl2 := /*@Alloc*/ (&[]int{})
-	sl3 := & /*@Slice*/ ([]int{})
-	_, _, _ = sl1, sl2, sl3
-
-	_ = /*@Slice*/ ([]int{})
-	_ = /*@<nil>*/ (& /*@Slice*/ ([]int{})) // & optimized away
-	_ = & /*@Slice*/ ([]int{})
-
-	// 2. Arrays
-	print( /*@UnOp*/ ([1]int{}))
-	print( /*@Alloc*/ (&[1]int{}))
-	print(& /*@Alloc*/ ([1]int{}))
-
-	arr1 := /*@Alloc*/ ([1]int{})
-	arr2 := /*@Alloc*/ (&[1]int{})
-	arr3 := & /*@Alloc*/ ([1]int{})
-	_, _, _ = arr1, arr2, arr3
-
-	_ = /*@UnOp*/ ([1]int{})
-	_ = /*@Alloc*/ (& /*@Alloc*/ ([1]int{}))
-	_ = & /*@Alloc*/ ([1]int{})
-
-	// 3. Maps
-	type M map[int]int
-	print( /*@MakeMap*/ (M{}))
-	print( /*@Alloc*/ (&M{}))
-	print(& /*@MakeMap*/ (M{}))
-
-	m1 := /*@MakeMap*/ (M{})
-	m2 := /*@Alloc*/ (&M{})
-	m3 := & /*@MakeMap*/ (M{})
-	_, _, _ = m1, m2, m3
-
-	_ = /*@MakeMap*/ (M{})
-	_ = /*@<nil>*/ (& /*@MakeMap*/ (M{})) // & optimized away
-	_ = & /*@MakeMap*/ (M{})
-
-	// 4. Structs
-	print( /*@UnOp*/ (struct{}{}))
-	print( /*@Alloc*/ (&struct{}{}))
-	print(& /*@Alloc*/ (struct{}{}))
-
-	s1 := /*@Alloc*/ (struct{}{})
-	s2 := /*@Alloc*/ (&struct{}{})
-	s3 := & /*@Alloc*/ (struct{}{})
-	_, _, _ = s1, s2, s3
-
-	_ = /*@UnOp*/ (struct{}{})
-	_ = /*@Alloc*/ (& /*@Alloc*/ (struct{}{}))
-	_ = & /*@Alloc*/ (struct{}{})
-}
-
-type t struct{ x int }
-
-// Ensure we can locate methods of named types.
-func (t) f(param int) {
-	_ = /*@Parameter*/ (param)
-}
-
-// Ensure we can locate init functions.
-func init() {
-	m := /*@MakeMap*/ (make(map[string]string))
-	_ = m
-}
-
-// Ensure we can locate variables in initializer expressions.
-var global = /*@MakeMap*/ (make(map[string]string))
diff --git a/third_party/gotools/go/ssa/testmain.go b/third_party/gotools/go/ssa/testmain.go
deleted file mode 100644
index 4785afe..0000000
--- a/third_party/gotools/go/ssa/testmain.go
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// CreateTestMainPackage synthesizes a main package that runs all the
-// tests of the supplied packages.
-// It is closely coupled to $GOROOT/src/cmd/go/test.go and $GOROOT/src/testing.
-
-import (
-	"go/ast"
-	"go/token"
-	"os"
-	"sort"
-	"strings"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// FindTests returns the list of packages that define at least one Test,
-// Example or Benchmark function (as defined by "go test"), and the
-// lists of all such functions.
-//
-func FindTests(pkgs []*Package) (testpkgs []*Package, tests, benchmarks, examples []*Function) {
-	if len(pkgs) == 0 {
-		return
-	}
-	prog := pkgs[0].Prog
-
-	// The first two of these may be nil: if the program doesn't import "testing",
-	// it can't contain any tests, but it may yet contain Examples.
-	var testSig *types.Signature                                   // func(*testing.T)
-	var benchmarkSig *types.Signature                              // func(*testing.B)
-	var exampleSig = types.NewSignature(nil, nil, nil, nil, false) // func()
-
-	// Obtain the types from the parameters of testing.Main().
-	if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
-		params := testingPkg.Func("Main").Signature.Params()
-		testSig = funcField(params.At(1).Type())
-		benchmarkSig = funcField(params.At(2).Type())
-	}
-
-	seen := make(map[*Package]bool)
-	for _, pkg := range pkgs {
-		if pkg.Prog != prog {
-			panic("wrong Program")
-		}
-
-		// TODO(adonovan): use a stable order, e.g. lexical.
-		for _, mem := range pkg.Members {
-			if f, ok := mem.(*Function); ok &&
-				ast.IsExported(f.Name()) &&
-				strings.HasSuffix(prog.Fset.Position(f.Pos()).Filename, "_test.go") {
-
-				switch {
-				case testSig != nil && isTestSig(f, "Test", testSig):
-					tests = append(tests, f)
-				case benchmarkSig != nil && isTestSig(f, "Benchmark", benchmarkSig):
-					benchmarks = append(benchmarks, f)
-				case isTestSig(f, "Example", exampleSig):
-					examples = append(examples, f)
-				default:
-					continue
-				}
-
-				if !seen[pkg] {
-					seen[pkg] = true
-					testpkgs = append(testpkgs, pkg)
-				}
-			}
-		}
-	}
-	return
-}
-
-// Like isTest, but checks the signature too.
-func isTestSig(f *Function, prefix string, sig *types.Signature) bool {
-	return isTest(f.Name(), prefix) && types.Identical(f.Signature, sig)
-}
-
-// If non-nil, testMainStartBodyHook is called immediately after
-// startBody for main.init and main.main, making it easy for users to
-// add custom imports and initialization steps for proprietary build
-// systems that don't exactly follow 'go test' conventions.
-var testMainStartBodyHook func(*Function)
-
-// CreateTestMainPackage creates and returns a synthetic "main"
-// package that runs all the tests of the supplied packages, similar
-// to the one that would be created by the 'go test' tool.
-//
-// It returns nil if the program contains no tests.
-//
-func (prog *Program) CreateTestMainPackage(pkgs ...*Package) *Package {
-	pkgs, tests, benchmarks, examples := FindTests(pkgs)
-	if len(pkgs) == 0 {
-		return nil
-	}
-
-	testmain := &Package{
-		Prog:    prog,
-		Members: make(map[string]Member),
-		values:  make(map[types.Object]Value),
-		Object:  types.NewPackage("test$main", "main"),
-	}
-
-	// Build package's init function.
-	init := &Function{
-		name:      "init",
-		Signature: new(types.Signature),
-		Synthetic: "package initializer",
-		Pkg:       testmain,
-		Prog:      prog,
-	}
-	init.startBody()
-
-	if testMainStartBodyHook != nil {
-		testMainStartBodyHook(init)
-	}
-
-	// Initialize packages to test.
-	var pkgpaths []string
-	for _, pkg := range pkgs {
-		var v Call
-		v.Call.Value = pkg.init
-		v.setType(types.NewTuple())
-		init.emit(&v)
-
-		pkgpaths = append(pkgpaths, pkg.Object.Path())
-	}
-	sort.Strings(pkgpaths)
-	init.emit(new(Return))
-	init.finishBody()
-	testmain.init = init
-	testmain.Object.MarkComplete()
-	testmain.Members[init.name] = init
-
-	// For debugging convenience, define an unexported const
-	// that enumerates the packages.
-	packagesConst := types.NewConst(token.NoPos, testmain.Object, "packages", tString,
-		exact.MakeString(strings.Join(pkgpaths, " ")))
-	memberFromObject(testmain, packagesConst, nil)
-
-	// Create main *types.Func and *ssa.Function
-	mainFunc := types.NewFunc(token.NoPos, testmain.Object, "main", new(types.Signature))
-	memberFromObject(testmain, mainFunc, nil)
-	main := testmain.Func("main")
-	main.Synthetic = "test main function"
-
-	main.startBody()
-
-	if testMainStartBodyHook != nil {
-		testMainStartBodyHook(main)
-	}
-
-	if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
-		testingMain := testingPkg.Func("Main")
-		testingMainParams := testingMain.Signature.Params()
-
-		// The generated code is as if compiled from this:
-		//
-		// func main() {
-		//      match      := func(_, _ string) (bool, error) { return true, nil }
-		//      tests      := []testing.InternalTest{{"TestFoo", TestFoo}, ...}
-		//      benchmarks := []testing.InternalBenchmark{...}
-		//      examples   := []testing.InternalExample{...}
-		// 	testing.Main(match, tests, benchmarks, examples)
-		// }
-
-		matcher := &Function{
-			name:      "matcher",
-			Signature: testingMainParams.At(0).Type().(*types.Signature),
-			Synthetic: "test matcher predicate",
-			parent:    main,
-			Pkg:       testmain,
-			Prog:      prog,
-		}
-		main.AnonFuncs = append(main.AnonFuncs, matcher)
-		matcher.startBody()
-		matcher.emit(&Return{Results: []Value{vTrue, nilConst(types.Universe.Lookup("error").Type())}})
-		matcher.finishBody()
-
-		// Emit call: testing.Main(matcher, tests, benchmarks, examples).
-		var c Call
-		c.Call.Value = testingMain
-		c.Call.Args = []Value{
-			matcher,
-			testMainSlice(main, tests, testingMainParams.At(1).Type()),
-			testMainSlice(main, benchmarks, testingMainParams.At(2).Type()),
-			testMainSlice(main, examples, testingMainParams.At(3).Type()),
-		}
-		emitTailCall(main, &c)
-	} else {
-		// The program does not import "testing", but FindTests
-		// returned non-nil, which must mean there were Examples
-		// but no Tests or Benchmarks.
-		// We'll simply call them from testmain.main; this will
-		// ensure they don't panic, but will not check any
-		// "Output:" comments.
-		for _, eg := range examples {
-			var c Call
-			c.Call.Value = eg
-			c.setType(types.NewTuple())
-			main.emit(&c)
-		}
-		main.emit(&Return{})
-		main.currentBlock = nil
-	}
-
-	main.finishBody()
-
-	testmain.Members["main"] = main
-
-	if prog.mode&PrintPackages != 0 {
-		printMu.Lock()
-		testmain.WriteTo(os.Stdout)
-		printMu.Unlock()
-	}
-
-	if prog.mode&SanityCheckFunctions != 0 {
-		sanityCheckPackage(testmain)
-	}
-
-	prog.packages[testmain.Object] = testmain
-
-	return testmain
-}
-
-// testMainSlice emits to fn code to construct a slice of type slice
-// (one of []testing.Internal{Test,Benchmark,Example}) for all
-// functions in testfuncs.  It returns the slice value.
-//
-func testMainSlice(fn *Function, testfuncs []*Function, slice types.Type) Value {
-	if testfuncs == nil {
-		return nilConst(slice)
-	}
-
-	tElem := slice.(*types.Slice).Elem()
-	tPtrString := types.NewPointer(tString)
-	tPtrElem := types.NewPointer(tElem)
-	tPtrFunc := types.NewPointer(funcField(slice))
-
-	// Emit: array = new [n]testing.InternalTest
-	tArray := types.NewArray(tElem, int64(len(testfuncs)))
-	array := emitNew(fn, tArray, token.NoPos)
-	array.Comment = "test main"
-	for i, testfunc := range testfuncs {
-		// Emit: pitem = &array[i]
-		ia := &IndexAddr{X: array, Index: intConst(int64(i))}
-		ia.setType(tPtrElem)
-		pitem := fn.emit(ia)
-
-		// Emit: pname = &pitem.Name
-		fa := &FieldAddr{X: pitem, Field: 0} // .Name
-		fa.setType(tPtrString)
-		pname := fn.emit(fa)
-
-		// Emit: *pname = "testfunc"
-		emitStore(fn, pname, stringConst(testfunc.Name()), token.NoPos)
-
-		// Emit: pfunc = &pitem.F
-		fa = &FieldAddr{X: pitem, Field: 1} // .F
-		fa.setType(tPtrFunc)
-		pfunc := fn.emit(fa)
-
-		// Emit: *pfunc = testfunc
-		emitStore(fn, pfunc, testfunc, token.NoPos)
-	}
-
-	// Emit: slice array[:]
-	sl := &Slice{X: array}
-	sl.setType(slice)
-	return fn.emit(sl)
-}
-
-// Given the type of one of the three slice parameters of testing.Main,
-// returns the function type.
-func funcField(slice types.Type) *types.Signature {
-	return slice.(*types.Slice).Elem().Underlying().(*types.Struct).Field(1).Type().(*types.Signature)
-}
-
-// Plundered from $GOROOT/src/cmd/go/test.go
-
-// isTest tells whether name looks like a test (or benchmark, according to prefix).
-// It is a Test (say) if there is a character after Test that is not a lower-case letter.
-// We don't want TesticularCancer.
-func isTest(name, prefix string) bool {
-	if !strings.HasPrefix(name, prefix) {
-		return false
-	}
-	if len(name) == len(prefix) { // "Test" is ok
-		return true
-	}
-	return ast.IsExported(name[len(prefix):])
-}
diff --git a/third_party/gotools/go/ssa/testmain_test.go b/third_party/gotools/go/ssa/testmain_test.go
deleted file mode 100644
index 1e36e4f..0000000
--- a/third_party/gotools/go/ssa/testmain_test.go
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa_test
-
-// Tests of FindTests.  CreateTestMainPackage is tested via the interpreter.
-// TODO(adonovan): test the 'pkgs' result from FindTests.
-
-import (
-	"fmt"
-	"sort"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/loader"
-	"llvm.org/llgo/third_party/gotools/go/ssa"
-)
-
-func create(t *testing.T, content string) []*ssa.Package {
-	var conf loader.Config
-	f, err := conf.ParseFile("foo_test.go", content)
-	if err != nil {
-		t.Fatal(err)
-	}
-	conf.CreateFromFiles("foo", f)
-
-	iprog, err := conf.Load()
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// We needn't call Build.
-	return ssa.Create(iprog, ssa.SanityCheckFunctions).AllPackages()
-}
-
-func TestFindTests(t *testing.T) {
-	test := `
-package foo
-
-import "testing"
-
-type T int
-
-// Tests:
-func Test(t *testing.T) {}
-func TestA(t *testing.T) {}
-func TestB(t *testing.T) {}
-
-// Not tests:
-func testC(t *testing.T) {}
-func TestD() {}
-func testE(t *testing.T) int { return 0 }
-func (T) Test(t *testing.T) {}
-
-// Benchmarks:
-func Benchmark(*testing.B) {}
-func BenchmarkA(b *testing.B) {}
-func BenchmarkB(*testing.B) {}
-
-// Not benchmarks:
-func benchmarkC(t *testing.T) {}
-func BenchmarkD() {}
-func benchmarkE(t *testing.T) int { return 0 }
-func (T) Benchmark(t *testing.T) {}
-
-// Examples:
-func Example() {}
-func ExampleA() {}
-
-// Not examples:
-func exampleC() {}
-func ExampleD(t *testing.T) {}
-func exampleE() int { return 0 }
-func (T) Example() {}
-`
-	pkgs := create(t, test)
-	_, tests, benchmarks, examples := ssa.FindTests(pkgs)
-
-	sort.Sort(funcsByPos(tests))
-	if got, want := fmt.Sprint(tests), "[foo.Test foo.TestA foo.TestB]"; got != want {
-		t.Errorf("FindTests.tests = %s, want %s", got, want)
-	}
-
-	sort.Sort(funcsByPos(benchmarks))
-	if got, want := fmt.Sprint(benchmarks), "[foo.Benchmark foo.BenchmarkA foo.BenchmarkB]"; got != want {
-		t.Errorf("FindTests.benchmarks = %s, want %s", got, want)
-	}
-
-	sort.Sort(funcsByPos(examples))
-	if got, want := fmt.Sprint(examples), "[foo.Example foo.ExampleA]"; got != want {
-		t.Errorf("FindTests examples = %s, want %s", got, want)
-	}
-}
-
-func TestFindTestsTesting(t *testing.T) {
-	test := `
-package foo
-
-// foo does not import "testing", but defines Examples.
-
-func Example() {}
-func ExampleA() {}
-`
-	pkgs := create(t, test)
-	_, tests, benchmarks, examples := ssa.FindTests(pkgs)
-	if len(tests) > 0 {
-		t.Errorf("FindTests.tests = %s, want none", tests)
-	}
-	if len(benchmarks) > 0 {
-		t.Errorf("FindTests.benchmarks = %s, want none", benchmarks)
-	}
-	sort.Sort(funcsByPos(examples))
-	if got, want := fmt.Sprint(examples), "[foo.Example foo.ExampleA]"; got != want {
-		t.Errorf("FindTests examples = %s, want %s", got, want)
-	}
-}
-
-type funcsByPos []*ssa.Function
-
-func (p funcsByPos) Len() int           { return len(p) }
-func (p funcsByPos) Less(i, j int) bool { return p[i].Pos() < p[j].Pos() }
-func (p funcsByPos) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
diff --git a/third_party/gotools/go/ssa/util.go b/third_party/gotools/go/ssa/util.go
deleted file mode 100644
index 9333383..0000000
--- a/third_party/gotools/go/ssa/util.go
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines a number of miscellaneous utility functions.
-
-import (
-	"fmt"
-	"go/ast"
-	"go/token"
-	"io"
-	"os"
-
-	"llvm.org/llgo/third_party/gotools/go/ast/astutil"
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-//// AST utilities
-
-func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
-
-// isBlankIdent returns true iff e is an Ident with name "_".
-// They have no associated types.Object, and thus no type.
-//
-func isBlankIdent(e ast.Expr) bool {
-	id, ok := e.(*ast.Ident)
-	return ok && id.Name == "_"
-}
-
-//// Type utilities.  Some of these belong in go/types.
-
-// isPointer returns true for types whose underlying type is a pointer.
-func isPointer(typ types.Type) bool {
-	_, ok := typ.Underlying().(*types.Pointer)
-	return ok
-}
-
-func isInterface(T types.Type) bool { return types.IsInterface(T) }
-
-// deref returns a pointer's element type; otherwise it returns typ.
-func deref(typ types.Type) types.Type {
-	if p, ok := typ.Underlying().(*types.Pointer); ok {
-		return p.Elem()
-	}
-	return typ
-}
-
-// recvType returns the receiver type of method obj.
-func recvType(obj *types.Func) types.Type {
-	return obj.Type().(*types.Signature).Recv().Type()
-}
-
-// DefaultType returns the default "typed" type for an "untyped" type;
-// it returns the incoming type for all other types.  The default type
-// for untyped nil is untyped nil.
-//
-// Exported to ssa/interp.
-//
-// TODO(gri): this is a copy of go/types.defaultType; export that function.
-//
-func DefaultType(typ types.Type) types.Type {
-	if t, ok := typ.(*types.Basic); ok {
-		k := t.Kind()
-		switch k {
-		case types.UntypedBool:
-			k = types.Bool
-		case types.UntypedInt:
-			k = types.Int
-		case types.UntypedRune:
-			k = types.Rune
-		case types.UntypedFloat:
-			k = types.Float64
-		case types.UntypedComplex:
-			k = types.Complex128
-		case types.UntypedString:
-			k = types.String
-		}
-		typ = types.Typ[k]
-	}
-	return typ
-}
-
-// logStack prints the formatted "start" message to stderr and
-// returns a closure that prints the corresponding "end" message.
-// Call using 'defer logStack(...)()' to show builder stack on panic.
-// Don't forget trailing parens!
-//
-func logStack(format string, args ...interface{}) func() {
-	msg := fmt.Sprintf(format, args...)
-	io.WriteString(os.Stderr, msg)
-	io.WriteString(os.Stderr, "\n")
-	return func() {
-		io.WriteString(os.Stderr, msg)
-		io.WriteString(os.Stderr, " end\n")
-	}
-}
-
-// newVar creates a 'var' for use in a types.Tuple.
-func newVar(name string, typ types.Type) *types.Var {
-	return types.NewParam(token.NoPos, nil, name, typ)
-}
-
-// anonVar creates an anonymous 'var' for use in a types.Tuple.
-func anonVar(typ types.Type) *types.Var {
-	return newVar("", typ)
-}
-
-var lenResults = types.NewTuple(anonVar(tInt))
-
-// makeLen returns the len builtin specialized to type func(T)int.
-func makeLen(T types.Type) *Builtin {
-	lenParams := types.NewTuple(anonVar(T))
-	return &Builtin{
-		name: "len",
-		sig:  types.NewSignature(nil, nil, lenParams, lenResults, false),
-	}
-}
diff --git a/third_party/gotools/go/ssa/wrappers.go b/third_party/gotools/go/ssa/wrappers.go
deleted file mode 100644
index 3e04452..0000000
--- a/third_party/gotools/go/ssa/wrappers.go
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package ssa
-
-// This file defines synthesis of Functions that delegate to declared
-// methods; they come in three kinds:
-//
-// (1) wrappers: methods that wrap declared methods, performing
-//     implicit pointer indirections and embedded field selections.
-//
-// (2) thunks: funcs that wrap declared methods.  Like wrappers,
-//     thunks perform indirections and field selections. The thunk's
-//     first parameter is used as the receiver for the method call.
-//
-// (3) bounds: funcs that wrap declared methods.  The bound's sole
-//     free variable, supplied by a closure, is used as the receiver
-//     for the method call.  No indirections or field selections are
-//     performed since they can be done before the call.
-
-import (
-	"fmt"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// -- wrappers -----------------------------------------------------------
-
-// makeWrapper returns a synthetic method that delegates to the
-// declared method denoted by meth.Obj(), first performing any
-// necessary pointer indirections or field selections implied by meth.
-//
-// The resulting method's receiver type is meth.Recv().
-//
-// This function is versatile but quite subtle!  Consider the
-// following axes of variation when making changes:
-//   - optional receiver indirection
-//   - optional implicit field selections
-//   - meth.Obj() may denote a concrete or an interface method
-//   - the result may be a thunk or a wrapper.
-//
-// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
-//
-func makeWrapper(prog *Program, sel *types.Selection) *Function {
-	obj := sel.Obj().(*types.Func)       // the declared function
-	sig := sel.Type().(*types.Signature) // type of this wrapper
-
-	var recv *types.Var // wrapper's receiver or thunk's params[0]
-	name := obj.Name()
-	var description string
-	var start int // first regular param
-	if sel.Kind() == types.MethodExpr {
-		name += "$thunk"
-		description = "thunk"
-		recv = sig.Params().At(0)
-		start = 1
-	} else {
-		description = "wrapper"
-		recv = sig.Recv()
-	}
-
-	description = fmt.Sprintf("%s for %s", description, sel.Obj())
-	if prog.mode&LogSource != 0 {
-		defer logStack("make %s to (%s)", description, recv.Type())()
-	}
-	fn := &Function{
-		name:      name,
-		method:    sel,
-		object:    obj,
-		Signature: sig,
-		Synthetic: description,
-		Prog:      prog,
-		pos:       obj.Pos(),
-	}
-	fn.startBody()
-	fn.addSpilledParam(recv)
-	createParams(fn, start)
-
-	indices := sel.Index()
-
-	var v Value = fn.Locals[0] // spilled receiver
-	if isPointer(sel.Recv()) {
-		v = emitLoad(fn, v)
-
-		// For simple indirection wrappers, perform an informative nil-check:
-		// "value method (T).f called using nil *T pointer"
-		if len(indices) == 1 && !isPointer(recvType(obj)) {
-			var c Call
-			c.Call.Value = &Builtin{
-				name: "ssa:wrapnilchk",
-				sig: types.NewSignature(nil, nil,
-					types.NewTuple(anonVar(sel.Recv()), anonVar(tString), anonVar(tString)),
-					types.NewTuple(anonVar(sel.Recv())), false),
-			}
-			c.Call.Args = []Value{
-				v,
-				stringConst(deref(sel.Recv()).String()),
-				stringConst(sel.Obj().Name()),
-			}
-			c.setType(v.Type())
-			v = fn.emit(&c)
-		}
-	}
-
-	// Invariant: v is a pointer, either
-	//   value of *A receiver param, or
-	// address of  A spilled receiver.
-
-	// We use pointer arithmetic (FieldAddr possibly followed by
-	// Load) in preference to value extraction (Field possibly
-	// preceded by Load).
-
-	v = emitImplicitSelections(fn, v, indices[:len(indices)-1])
-
-	// Invariant: v is a pointer, either
-	//   value of implicit *C field, or
-	// address of implicit  C field.
-
-	var c Call
-	if r := recvType(obj); !isInterface(r) { // concrete method
-		if !isPointer(r) {
-			v = emitLoad(fn, v)
-		}
-		c.Call.Value = prog.declaredFunc(obj)
-		c.Call.Args = append(c.Call.Args, v)
-	} else {
-		c.Call.Method = obj
-		c.Call.Value = emitLoad(fn, v)
-	}
-	for _, arg := range fn.Params[1:] {
-		c.Call.Args = append(c.Call.Args, arg)
-	}
-	emitTailCall(fn, &c)
-	fn.finishBody()
-	return fn
-}
-
-// createParams creates parameters for wrapper method fn based on its
-// Signature.Params, which do not include the receiver.
-// start is the index of the first regular parameter to use.
-//
-func createParams(fn *Function, start int) {
-	var last *Parameter
-	tparams := fn.Signature.Params()
-	for i, n := start, tparams.Len(); i < n; i++ {
-		last = fn.addParamObj(tparams.At(i))
-	}
-	if fn.Signature.Variadic() {
-		last.typ = types.NewSlice(last.typ)
-	}
-}
-
-// -- bounds -----------------------------------------------------------
-
-// makeBound returns a bound method wrapper (or "bound"), a synthetic
-// function that delegates to a concrete or interface method denoted
-// by obj.  The resulting function has no receiver, but has one free
-// variable which will be used as the method's receiver in the
-// tail-call.
-//
-// Use MakeClosure with such a wrapper to construct a bound method
-// closure.  e.g.:
-//
-//   type T int          or:  type T interface { meth() }
-//   func (t T) meth()
-//   var t T
-//   f := t.meth
-//   f() // calls t.meth()
-//
-// f is a closure of a synthetic wrapper defined as if by:
-//
-//   f := func() { return t.meth() }
-//
-// Unlike makeWrapper, makeBound need perform no indirection or field
-// selections because that can be done before the closure is
-// constructed.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
-//
-func makeBound(prog *Program, obj *types.Func) *Function {
-	prog.methodsMu.Lock()
-	defer prog.methodsMu.Unlock()
-	fn, ok := prog.bounds[obj]
-	if !ok {
-		description := fmt.Sprintf("bound method wrapper for %s", obj)
-		if prog.mode&LogSource != 0 {
-			defer logStack("%s", description)()
-		}
-		fn = &Function{
-			name:      obj.Name() + "$bound",
-			object:    obj,
-			Signature: changeRecv(obj.Type().(*types.Signature), nil), // drop receiver
-			Synthetic: description,
-			Prog:      prog,
-			pos:       obj.Pos(),
-		}
-
-		fv := &FreeVar{name: "recv", typ: recvType(obj), parent: fn}
-		fn.FreeVars = []*FreeVar{fv}
-		fn.startBody()
-		createParams(fn, 0)
-		var c Call
-
-		if !isInterface(recvType(obj)) { // concrete
-			c.Call.Value = prog.declaredFunc(obj)
-			c.Call.Args = []Value{fv}
-		} else {
-			c.Call.Value = fv
-			c.Call.Method = obj
-		}
-		for _, arg := range fn.Params {
-			c.Call.Args = append(c.Call.Args, arg)
-		}
-		emitTailCall(fn, &c)
-		fn.finishBody()
-
-		prog.bounds[obj] = fn
-	}
-	return fn
-}
-
-// -- thunks -----------------------------------------------------------
-
-// makeThunk returns a thunk, a synthetic function that delegates to a
-// concrete or interface method denoted by sel.Obj().  The resulting
-// function has no receiver, but has an additional (first) regular
-// parameter.
-//
-// Precondition: sel.Kind() == types.MethodExpr.
-//
-//   type T int          or:  type T interface { meth() }
-//   func (t T) meth()
-//   f := T.meth
-//   var t T
-//   f(t) // calls t.meth()
-//
-// f is a synthetic wrapper defined as if by:
-//
-//   f := func(t T) { return t.meth() }
-//
-// TODO(adonovan): opt: currently the stub is created even when used
-// directly in a function call: C.f(i, 0).  This is less efficient
-// than inlining the stub.
-//
-// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
-//
-func makeThunk(prog *Program, sel *types.Selection) *Function {
-	if sel.Kind() != types.MethodExpr {
-		panic(sel)
-	}
-
-	key := selectionKey{
-		kind:     sel.Kind(),
-		recv:     sel.Recv(),
-		obj:      sel.Obj(),
-		index:    fmt.Sprint(sel.Index()),
-		indirect: sel.Indirect(),
-	}
-
-	prog.methodsMu.Lock()
-	defer prog.methodsMu.Unlock()
-
-	// Canonicalize key.recv to avoid constructing duplicate thunks.
-	canonRecv, ok := prog.canon.At(key.recv).(types.Type)
-	if !ok {
-		canonRecv = key.recv
-		prog.canon.Set(key.recv, canonRecv)
-	}
-	key.recv = canonRecv
-
-	fn, ok := prog.thunks[key]
-	if !ok {
-		fn = makeWrapper(prog, sel)
-		if fn.Signature.Recv() != nil {
-			panic(fn) // unexpected receiver
-		}
-		prog.thunks[key] = fn
-	}
-	return fn
-}
-
-func changeRecv(s *types.Signature, recv *types.Var) *types.Signature {
-	return types.NewSignature(nil, recv, s.Params(), s.Results(), s.Variadic())
-}
-
-// selectionKey is like types.Selection but a usable map key.
-type selectionKey struct {
-	kind     types.SelectionKind
-	recv     types.Type // canonicalized via Program.canon
-	obj      types.Object
-	index    string
-	indirect bool
-}
diff --git a/third_party/gotools/go/types/api.go b/third_party/gotools/go/types/api.go
deleted file mode 100644
index ed1f591..0000000
--- a/third_party/gotools/go/types/api.go
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package types declares the data types and implements
-// the algorithms for type-checking of Go packages.
-// Use Check and Config.Check to invoke the type-checker.
-//
-// Type-checking consists of several interdependent phases:
-//
-// Name resolution maps each identifier (ast.Ident) in the program to the
-// language object (Object) it denotes.
-// Use Info.{Defs,Uses,Implicits} for the results of name resolution.
-//
-// Constant folding computes the exact constant value (exact.Value) for
-// every expression (ast.Expr) that is a compile-time constant.
-// Use Info.Types[expr].Value for the results of constant folding.
-//
-// Type inference computes the type (Type) of every expression (ast.Expr)
-// and checks for compliance with the language specification.
-// Use Info.Types[expr].Type for the results of type inference.
-//
-package types // import "llvm.org/llgo/third_party/gotools/go/types"
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-)
-
-// Check type-checks a package and returns the resulting complete package
-// object, or a nil package and the first error. The package is specified
-// by a list of *ast.Files and corresponding file set, and the import path
-// the package is identified with. The clean path must not be empty or dot (".").
-//
-// For more control over type-checking and results, use Config.Check.
-func Check(path string, fset *token.FileSet, files []*ast.File) (*Package, error) {
-	var conf Config
-	pkg, err := conf.Check(path, fset, files, nil)
-	if err != nil {
-		return nil, err
-	}
-	return pkg, nil
-}
-
-// An Error describes a type-checking error; it implements the error interface.
-// A "soft" error is an error that still permits a valid interpretation of a
-// package (such as "unused variable"); "hard" errors may lead to unpredictable
-// behavior if ignored.
-type Error struct {
-	Fset *token.FileSet // file set for interpretation of Pos
-	Pos  token.Pos      // error position
-	Msg  string         // error message
-	Soft bool           // if set, error is "soft"
-}
-
-// Error returns an error string formatted as follows:
-// filename:line:column: message
-func (err Error) Error() string {
-	return fmt.Sprintf("%s: %s", err.Fset.Position(err.Pos), err.Msg)
-}
-
-// An importer resolves import paths to Packages.
-// The imports map records packages already known,
-// indexed by package path. The type-checker
-// will invoke Import with Config.Packages.
-// An importer must determine the canonical package path and
-// check imports to see if it is already present in the map.
-// If so, the Importer can return the map entry.  Otherwise,
-// the importer must load the package data for the given path
-// into a new *Package, record it in imports map, and return
-// the package.
-// TODO(gri) Need to be clearer about requirements of completeness.
-type Importer func(map[string]*Package, string) (*Package, error)
-
-// A Config specifies the configuration for type checking.
-// The zero value for Config is a ready-to-use default configuration.
-type Config struct {
-	// If IgnoreFuncBodies is set, function bodies are not
-	// type-checked.
-	IgnoreFuncBodies bool
-
-	// If FakeImportC is set, `import "C"` (for packages requiring Cgo)
-	// declares an empty "C" package and errors are omitted for qualified
-	// identifiers referring to package C (which won't find an object).
-	// This feature is intended for the standard library cmd/api tool.
-	//
-	// Caution: Effects may be unpredictable due to follow-up errors.
-	//          Do not use casually!
-	FakeImportC bool
-
-	// Packages is used to look up (and thus canonicalize) packages by
-	// package path. If Packages is nil, it is set to a new empty map.
-	// During type-checking, imported packages are added to the map.
-	Packages map[string]*Package
-
-	// If Error != nil, it is called with each error found
-	// during type checking; err has dynamic type Error.
-	// Secondary errors (for instance, to enumerate all types
-	// involved in an invalid recursive type declaration) have
-	// error strings that start with a '\t' character.
-	// If Error == nil, type-checking stops with the first
-	// error found.
-	Error func(err error)
-
-	// If Import != nil, it is called for each imported package.
-	// Otherwise, DefaultImport is called.
-	Import Importer
-
-	// If Sizes != nil, it provides the sizing functions for package unsafe.
-	// Otherwise &StdSizes{WordSize: 8, MaxAlign: 8} is used instead.
-	Sizes Sizes
-
-	// If DisableUnusedImportCheck is set, packages are not checked
-	// for unused imports.
-	DisableUnusedImportCheck bool
-}
-
-// DefaultImport is the default importer invoked if Config.Import == nil.
-// The declaration:
-//
-//	import _ "llvm.org/llgo/third_party/gotools/go/gcimporter"
-//
-// in a client of go/types will initialize DefaultImport to gcimporter.Import.
-var DefaultImport Importer
-
-// Info holds result type information for a type-checked package.
-// Only the information for which a map is provided is collected.
-// If the package has type errors, the collected information may
-// be incomplete.
-type Info struct {
-	// Types maps expressions to their types, and for constant
-	// expressions, their values. Invalid expressions are omitted.
-	//
-	// For (possibly parenthesized) identifiers denoting built-in
-	// functions, the recorded signatures are call-site specific:
-	// if the call result is not a constant, the recorded type is
-	// an argument-specific signature. Otherwise, the recorded type
-	// is invalid.
-	//
-	// Identifiers on the lhs of declarations (i.e., the identifiers
-	// which are being declared) are collected in the Defs map.
-	// Identifiers denoting packages are collected in the Uses maps.
-	Types map[ast.Expr]TypeAndValue
-
-	// Defs maps identifiers to the objects they define (including
-	// package names, dots "." of dot-imports, and blank "_" identifiers).
-	// For identifiers that do not denote objects (e.g., the package name
-	// in package clauses, or symbolic variables t in t := x.(type) of
-	// type switch headers), the corresponding objects are nil.
-	//
-	// For an anonymous field, Defs returns the field *Var it defines.
-	//
-	// Invariant: Defs[id] == nil || Defs[id].Pos() == id.Pos()
-	Defs map[*ast.Ident]Object
-
-	// Uses maps identifiers to the objects they denote.
-	//
-	// For an anonymous field, Uses returns the *TypeName it denotes.
-	//
-	// Invariant: Uses[id].Pos() != id.Pos()
-	Uses map[*ast.Ident]Object
-
-	// Implicits maps nodes to their implicitly declared objects, if any.
-	// The following node and object types may appear:
-	//
-	//	node               declared object
-	//
-	//	*ast.ImportSpec    *PkgName for dot-imports and imports without renames
-	//	*ast.CaseClause    type-specific *Var for each type switch case clause (incl. default)
-	//      *ast.Field         anonymous struct field or parameter *Var
-	//
-	Implicits map[ast.Node]Object
-
-	// Selections maps selector expressions (excluding qualified identifiers)
-	// to their corresponding selections.
-	Selections map[*ast.SelectorExpr]*Selection
-
-	// Scopes maps ast.Nodes to the scopes they define. Package scopes are not
-	// associated with a specific node but with all files belonging to a package.
-	// Thus, the package scope can be found in the type-checked Package object.
-	// Scopes nest, with the Universe scope being the outermost scope, enclosing
-	// the package scope, which contains (one or more) files scopes, which enclose
-	// function scopes which in turn enclose statement and function literal scopes.
-	// Note that even though package-level functions are declared in the package
-	// scope, the function scopes are embedded in the file scope of the file
-	// containing the function declaration.
-	//
-	// The following node types may appear in Scopes:
-	//
-	//	*ast.File
-	//	*ast.FuncType
-	//	*ast.BlockStmt
-	//	*ast.IfStmt
-	//	*ast.SwitchStmt
-	//	*ast.TypeSwitchStmt
-	//	*ast.CaseClause
-	//	*ast.CommClause
-	//	*ast.ForStmt
-	//	*ast.RangeStmt
-	//
-	Scopes map[ast.Node]*Scope
-
-	// InitOrder is the list of package-level initializers in the order in which
-	// they must be executed. Initializers referring to variables related by an
-	// initialization dependency appear in topological order, the others appear
-	// in source order. Variables without an initialization expression do not
-	// appear in this list.
-	InitOrder []*Initializer
-}
-
-// TypeOf returns the type of expression e, or nil if not found.
-// Precondition: the Types, Uses and Defs maps are populated.
-//
-func (info *Info) TypeOf(e ast.Expr) Type {
-	if t, ok := info.Types[e]; ok {
-		return t.Type
-	}
-	if id, _ := e.(*ast.Ident); id != nil {
-		if obj := info.ObjectOf(id); obj != nil {
-			return obj.Type()
-		}
-	}
-	return nil
-}
-
-// ObjectOf returns the object denoted by the specified id,
-// or nil if not found.
-//
-// If id is an anonymous struct field, ObjectOf returns the field (*Var)
-// it uses, not the type (*TypeName) it defines.
-//
-// Precondition: the Uses and Defs maps are populated.
-//
-func (info *Info) ObjectOf(id *ast.Ident) Object {
-	if obj, _ := info.Defs[id]; obj != nil {
-		return obj
-	}
-	return info.Uses[id]
-}
-
-// TypeAndValue reports the type and value (for constants)
-// of the corresponding expression.
-type TypeAndValue struct {
-	mode  operandMode
-	Type  Type
-	Value exact.Value
-}
-
-// TODO(gri) Consider eliminating the IsVoid predicate. Instead, report
-// "void" values as regular values but with the empty tuple type.
-
-// IsVoid reports whether the corresponding expression
-// is a function call without results.
-func (tv TypeAndValue) IsVoid() bool {
-	return tv.mode == novalue
-}
-
-// IsType reports whether the corresponding expression specifies a type.
-func (tv TypeAndValue) IsType() bool {
-	return tv.mode == typexpr
-}
-
-// IsBuiltin reports whether the corresponding expression denotes
-// a (possibly parenthesized) built-in function.
-func (tv TypeAndValue) IsBuiltin() bool {
-	return tv.mode == builtin
-}
-
-// IsValue reports whether the corresponding expression is a value.
-// Builtins are not considered values. Constant values have a non-
-// nil Value.
-func (tv TypeAndValue) IsValue() bool {
-	switch tv.mode {
-	case constant, variable, mapindex, value, commaok:
-		return true
-	}
-	return false
-}
-
-// IsNil reports whether the corresponding expression denotes the
-// predeclared value nil.
-func (tv TypeAndValue) IsNil() bool {
-	return tv.mode == value && tv.Type == Typ[UntypedNil]
-}
-
-// Addressable reports whether the corresponding expression
-// is addressable (http://golang.org/ref/spec#Address_operators).
-func (tv TypeAndValue) Addressable() bool {
-	return tv.mode == variable
-}
-
-// Assignable reports whether the corresponding expression
-// is assignable to (provided a value of the right type).
-func (tv TypeAndValue) Assignable() bool {
-	return tv.mode == variable || tv.mode == mapindex
-}
-
-// HasOk reports whether the corresponding expression may be
-// used on the lhs of a comma-ok assignment.
-func (tv TypeAndValue) HasOk() bool {
-	return tv.mode == commaok || tv.mode == mapindex
-}
-
-// An Initializer describes a package-level variable, or a list of variables in case
-// of a multi-valued initialization expression, and the corresponding initialization
-// expression.
-type Initializer struct {
-	Lhs []*Var // var Lhs = Rhs
-	Rhs ast.Expr
-}
-
-func (init *Initializer) String() string {
-	var buf bytes.Buffer
-	for i, lhs := range init.Lhs {
-		if i > 0 {
-			buf.WriteString(", ")
-		}
-		buf.WriteString(lhs.Name())
-	}
-	buf.WriteString(" = ")
-	WriteExpr(&buf, init.Rhs)
-	return buf.String()
-}
-
-// Check type-checks a package and returns the resulting package object,
-// the first error if any, and if info != nil, additional type information.
-// The package is marked as complete if no errors occurred, otherwise it is
-// incomplete. See Config.Error for controlling behavior in the presence of
-// errors.
-//
-// The package is specified by a list of *ast.Files and corresponding
-// file set, and the package path the package is identified with.
-// The clean path must not be empty or dot (".").
-func (conf *Config) Check(path string, fset *token.FileSet, files []*ast.File, info *Info) (*Package, error) {
-	pkg := NewPackage(path, "")
-	return pkg, NewChecker(conf, fset, pkg, info).Files(files)
-}
-
-// AssertableTo reports whether a value of type V can be asserted to have type T.
-func AssertableTo(V *Interface, T Type) bool {
-	m, _ := assertableTo(V, T)
-	return m == nil
-}
-
-// AssignableTo reports whether a value of type V is assignable to a variable of type T.
-func AssignableTo(V, T Type) bool {
-	x := operand{mode: value, typ: V}
-	return x.assignableTo(nil, T) // config not needed for non-constant x
-}
-
-// ConvertibleTo reports whether a value of type V is convertible to a value of type T.
-func ConvertibleTo(V, T Type) bool {
-	x := operand{mode: value, typ: V}
-	return x.convertibleTo(nil, T) // config not needed for non-constant x
-}
-
-// Implements reports whether type V implements interface T.
-func Implements(V Type, T *Interface) bool {
-	f, _ := MissingMethod(V, T, true)
-	return f == nil
-}
diff --git a/third_party/gotools/go/types/api_test.go b/third_party/gotools/go/types/api_test.go
deleted file mode 100644
index c9471fb..0000000
--- a/third_party/gotools/go/types/api_test.go
+++ /dev/null
@@ -1,936 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"strings"
-	"testing"
-
-	_ "llvm.org/llgo/third_party/gotools/go/gcimporter"
-	. "llvm.org/llgo/third_party/gotools/go/types"
-)
-
-func pkgFor(path, source string, info *Info) (*Package, error) {
-	fset := token.NewFileSet()
-	f, err := parser.ParseFile(fset, path, source, 0)
-	if err != nil {
-		return nil, err
-	}
-
-	var conf Config
-	return conf.Check(f.Name.Name, fset, []*ast.File{f}, info)
-}
-
-func mustTypecheck(t *testing.T, path, source string, info *Info) string {
-	pkg, err := pkgFor(path, source, info)
-	if err != nil {
-		name := path
-		if pkg != nil {
-			name = "package " + pkg.Name()
-		}
-		t.Fatalf("%s: didn't type-check (%s)", name, err)
-	}
-	return pkg.Name()
-}
-
-func TestValuesInfo(t *testing.T) {
-	var tests = []struct {
-		src  string
-		expr string // constant expression
-		typ  string // constant type
-		val  string // constant value
-	}{
-		{`package a0; const _ = false`, `false`, `untyped bool`, `false`},
-		{`package a1; const _ = 0`, `0`, `untyped int`, `0`},
-		{`package a2; const _ = 'A'`, `'A'`, `untyped rune`, `65`},
-		{`package a3; const _ = 0.`, `0.`, `untyped float`, `0`},
-		{`package a4; const _ = 0i`, `0i`, `untyped complex`, `0`},
-		{`package a5; const _ = "foo"`, `"foo"`, `untyped string`, `"foo"`},
-
-		{`package b0; var _ = false`, `false`, `bool`, `false`},
-		{`package b1; var _ = 0`, `0`, `int`, `0`},
-		{`package b2; var _ = 'A'`, `'A'`, `rune`, `65`},
-		{`package b3; var _ = 0.`, `0.`, `float64`, `0`},
-		{`package b4; var _ = 0i`, `0i`, `complex128`, `0`},
-		{`package b5; var _ = "foo"`, `"foo"`, `string`, `"foo"`},
-
-		{`package c0a; var _ = bool(false)`, `false`, `bool`, `false`},
-		{`package c0b; var _ = bool(false)`, `bool(false)`, `bool`, `false`},
-		{`package c0c; type T bool; var _ = T(false)`, `T(false)`, `c0c.T`, `false`},
-
-		{`package c1a; var _ = int(0)`, `0`, `int`, `0`},
-		{`package c1b; var _ = int(0)`, `int(0)`, `int`, `0`},
-		{`package c1c; type T int; var _ = T(0)`, `T(0)`, `c1c.T`, `0`},
-
-		{`package c2a; var _ = rune('A')`, `'A'`, `rune`, `65`},
-		{`package c2b; var _ = rune('A')`, `rune('A')`, `rune`, `65`},
-		{`package c2c; type T rune; var _ = T('A')`, `T('A')`, `c2c.T`, `65`},
-
-		{`package c3a; var _ = float32(0.)`, `0.`, `float32`, `0`},
-		{`package c3b; var _ = float32(0.)`, `float32(0.)`, `float32`, `0`},
-		{`package c3c; type T float32; var _ = T(0.)`, `T(0.)`, `c3c.T`, `0`},
-
-		{`package c4a; var _ = complex64(0i)`, `0i`, `complex64`, `0`},
-		{`package c4b; var _ = complex64(0i)`, `complex64(0i)`, `complex64`, `0`},
-		{`package c4c; type T complex64; var _ = T(0i)`, `T(0i)`, `c4c.T`, `0`},
-
-		{`package c5a; var _ = string("foo")`, `"foo"`, `string`, `"foo"`},
-		{`package c5b; var _ = string("foo")`, `string("foo")`, `string`, `"foo"`},
-		{`package c5c; type T string; var _ = T("foo")`, `T("foo")`, `c5c.T`, `"foo"`},
-
-		{`package d0; var _ = []byte("foo")`, `"foo"`, `string`, `"foo"`},
-		{`package d1; var _ = []byte(string("foo"))`, `"foo"`, `string`, `"foo"`},
-		{`package d2; var _ = []byte(string("foo"))`, `string("foo")`, `string`, `"foo"`},
-		{`package d3; type T []byte; var _ = T("foo")`, `"foo"`, `string`, `"foo"`},
-
-		{`package e0; const _ = float32( 1e-200)`, `float32(1e-200)`, `float32`, `0`},
-		{`package e1; const _ = float32(-1e-200)`, `float32(-1e-200)`, `float32`, `0`},
-		{`package e2; const _ = float64( 1e-2000)`, `float64(1e-2000)`, `float64`, `0`},
-		{`package e3; const _ = float64(-1e-2000)`, `float64(-1e-2000)`, `float64`, `0`},
-		{`package e4; const _ = complex64( 1e-200)`, `complex64(1e-200)`, `complex64`, `0`},
-		{`package e5; const _ = complex64(-1e-200)`, `complex64(-1e-200)`, `complex64`, `0`},
-		{`package e6; const _ = complex128( 1e-2000)`, `complex128(1e-2000)`, `complex128`, `0`},
-		{`package e7; const _ = complex128(-1e-2000)`, `complex128(-1e-2000)`, `complex128`, `0`},
-
-		{`package f0 ; var _ float32 =  1e-200`, `1e-200`, `float32`, `0`},
-		{`package f1 ; var _ float32 = -1e-200`, `-1e-200`, `float32`, `0`},
-		{`package f2a; var _ float64 =  1e-2000`, `1e-2000`, `float64`, `0`},
-		{`package f3a; var _ float64 = -1e-2000`, `-1e-2000`, `float64`, `0`},
-		{`package f2b; var _         =  1e-2000`, `1e-2000`, `float64`, `0`},
-		{`package f3b; var _         = -1e-2000`, `-1e-2000`, `float64`, `0`},
-		{`package f4 ; var _ complex64  =  1e-200 `, `1e-200`, `complex64`, `0`},
-		{`package f5 ; var _ complex64  = -1e-200 `, `-1e-200`, `complex64`, `0`},
-		{`package f6a; var _ complex128 =  1e-2000i`, `1e-2000i`, `complex128`, `0`},
-		{`package f7a; var _ complex128 = -1e-2000i`, `-1e-2000i`, `complex128`, `0`},
-		{`package f6b; var _            =  1e-2000i`, `1e-2000i`, `complex128`, `0`},
-		{`package f7b; var _            = -1e-2000i`, `-1e-2000i`, `complex128`, `0`},
-	}
-
-	for _, test := range tests {
-		info := Info{
-			Types: make(map[ast.Expr]TypeAndValue),
-		}
-		name := mustTypecheck(t, "ValuesInfo", test.src, &info)
-
-		// look for constant expression
-		var expr ast.Expr
-		for e := range info.Types {
-			if ExprString(e) == test.expr {
-				expr = e
-				break
-			}
-		}
-		if expr == nil {
-			t.Errorf("package %s: no expression found for %s", name, test.expr)
-			continue
-		}
-		tv := info.Types[expr]
-
-		// check that type is correct
-		if got := tv.Type.String(); got != test.typ {
-			t.Errorf("package %s: got type %s; want %s", name, got, test.typ)
-			continue
-		}
-
-		// check that value is correct
-		if got := tv.Value.String(); got != test.val {
-			t.Errorf("package %s: got value %s; want %s", name, got, test.val)
-		}
-	}
-}
-
-func TestTypesInfo(t *testing.T) {
-	var tests = []struct {
-		src  string
-		expr string // expression
-		typ  string // value type
-	}{
-		// single-valued expressions of untyped constants
-		{`package b0; var x interface{} = false`, `false`, `bool`},
-		{`package b1; var x interface{} = 0`, `0`, `int`},
-		{`package b2; var x interface{} = 0.`, `0.`, `float64`},
-		{`package b3; var x interface{} = 0i`, `0i`, `complex128`},
-		{`package b4; var x interface{} = "foo"`, `"foo"`, `string`},
-
-		// comma-ok expressions
-		{`package p0; var x interface{}; var _, _ = x.(int)`,
-			`x.(int)`,
-			`(int, bool)`,
-		},
-		{`package p1; var x interface{}; func _() { _, _ = x.(int) }`,
-			`x.(int)`,
-			`(int, bool)`,
-		},
-		// TODO(gri): uncomment if we accept issue 8189.
-		// {`package p2; type mybool bool; var m map[string]complex128; var b mybool; func _() { _, b = m["foo"] }`,
-		// 	`m["foo"]`,
-		// 	`(complex128, p2.mybool)`,
-		// },
-		// TODO(gri): remove if we accept issue 8189.
-		{`package p2; var m map[string]complex128; var b bool; func _() { _, b = m["foo"] }`,
-			`m["foo"]`,
-			`(complex128, bool)`,
-		},
-		{`package p3; var c chan string; var _, _ = <-c`,
-			`<-c`,
-			`(string, bool)`,
-		},
-
-		// issue 6796
-		{`package issue6796_a; var x interface{}; var _, _ = (x.(int))`,
-			`x.(int)`,
-			`(int, bool)`,
-		},
-		{`package issue6796_b; var c chan string; var _, _ = (<-c)`,
-			`(<-c)`,
-			`(string, bool)`,
-		},
-		{`package issue6796_c; var c chan string; var _, _ = (<-c)`,
-			`<-c`,
-			`(string, bool)`,
-		},
-		{`package issue6796_d; var c chan string; var _, _ = ((<-c))`,
-			`(<-c)`,
-			`(string, bool)`,
-		},
-		{`package issue6796_e; func f(c chan string) { _, _ = ((<-c)) }`,
-			`(<-c)`,
-			`(string, bool)`,
-		},
-
-		// issue 7060
-		{`package issue7060_a; var ( m map[int]string; x, ok = m[0] )`,
-			`m[0]`,
-			`(string, bool)`,
-		},
-		{`package issue7060_b; var ( m map[int]string; x, ok interface{} = m[0] )`,
-			`m[0]`,
-			`(string, bool)`,
-		},
-		{`package issue7060_c; func f(x interface{}, ok bool, m map[int]string) { x, ok = m[0] }`,
-			`m[0]`,
-			`(string, bool)`,
-		},
-		{`package issue7060_d; var ( ch chan string; x, ok = <-ch )`,
-			`<-ch`,
-			`(string, bool)`,
-		},
-		{`package issue7060_e; var ( ch chan string; x, ok interface{} = <-ch )`,
-			`<-ch`,
-			`(string, bool)`,
-		},
-		{`package issue7060_f; func f(x interface{}, ok bool, ch chan string) { x, ok = <-ch }`,
-			`<-ch`,
-			`(string, bool)`,
-		},
-	}
-
-	for _, test := range tests {
-		info := Info{Types: make(map[ast.Expr]TypeAndValue)}
-		name := mustTypecheck(t, "TypesInfo", test.src, &info)
-
-		// look for expression type
-		var typ Type
-		for e, tv := range info.Types {
-			if ExprString(e) == test.expr {
-				typ = tv.Type
-				break
-			}
-		}
-		if typ == nil {
-			t.Errorf("package %s: no type found for %s", name, test.expr)
-			continue
-		}
-
-		// check that type is correct
-		if got := typ.String(); got != test.typ {
-			t.Errorf("package %s: got %s; want %s", name, got, test.typ)
-		}
-	}
-}
-
-func predString(tv TypeAndValue) string {
-	var buf bytes.Buffer
-	pred := func(b bool, s string) {
-		if b {
-			if buf.Len() > 0 {
-				buf.WriteString(", ")
-			}
-			buf.WriteString(s)
-		}
-	}
-
-	pred(tv.IsVoid(), "void")
-	pred(tv.IsType(), "type")
-	pred(tv.IsBuiltin(), "builtin")
-	pred(tv.IsValue() && tv.Value != nil, "const")
-	pred(tv.IsValue() && tv.Value == nil, "value")
-	pred(tv.IsNil(), "nil")
-	pred(tv.Addressable(), "addressable")
-	pred(tv.Assignable(), "assignable")
-	pred(tv.HasOk(), "hasOk")
-
-	if buf.Len() == 0 {
-		return "invalid"
-	}
-	return buf.String()
-}
-
-func TestPredicatesInfo(t *testing.T) {
-	var tests = []struct {
-		src  string
-		expr string
-		pred string
-	}{
-		// void
-		{`package n0; func f() { f() }`, `f()`, `void`},
-
-		// types
-		{`package t0; type _ int`, `int`, `type`},
-		{`package t1; type _ []int`, `[]int`, `type`},
-		{`package t2; type _ func()`, `func()`, `type`},
-
-		// built-ins
-		{`package b0; var _ = len("")`, `len`, `builtin`},
-		{`package b1; var _ = (len)("")`, `(len)`, `builtin`},
-
-		// constants
-		{`package c0; var _ = 42`, `42`, `const`},
-		{`package c1; var _ = "foo" + "bar"`, `"foo" + "bar"`, `const`},
-		{`package c2; const (i = 1i; _ = i)`, `i`, `const`},
-
-		// values
-		{`package v0; var (a, b int; _ = a + b)`, `a + b`, `value`},
-		{`package v1; var _ = &[]int{1}`, `([]int literal)`, `value`},
-		{`package v2; var _ = func(){}`, `(func() literal)`, `value`},
-		{`package v4; func f() { _ = f }`, `f`, `value`},
-		{`package v3; var _ *int = nil`, `nil`, `value, nil`},
-		{`package v3; var _ *int = (nil)`, `(nil)`, `value, nil`},
-
-		// addressable (and thus assignable) operands
-		{`package a0; var (x int; _ = x)`, `x`, `value, addressable, assignable`},
-		{`package a1; var (p *int; _ = *p)`, `*p`, `value, addressable, assignable`},
-		{`package a2; var (s []int; _ = s[0])`, `s[0]`, `value, addressable, assignable`},
-		{`package a3; var (s struct{f int}; _ = s.f)`, `s.f`, `value, addressable, assignable`},
-		{`package a4; var (a [10]int; _ = a[0])`, `a[0]`, `value, addressable, assignable`},
-		{`package a5; func _(x int) { _ = x }`, `x`, `value, addressable, assignable`},
-		{`package a6; func _()(x int) { _ = x; return }`, `x`, `value, addressable, assignable`},
-		{`package a7; type T int; func (x T) _() { _ = x }`, `x`, `value, addressable, assignable`},
-		// composite literals are not addressable
-
-		// assignable but not addressable values
-		{`package s0; var (m map[int]int; _ = m[0])`, `m[0]`, `value, assignable, hasOk`},
-		{`package s1; var (m map[int]int; _, _ = m[0])`, `m[0]`, `value, assignable, hasOk`},
-
-		// hasOk expressions
-		{`package k0; var (ch chan int; _ = <-ch)`, `<-ch`, `value, hasOk`},
-		{`package k1; var (ch chan int; _, _ = <-ch)`, `<-ch`, `value, hasOk`},
-
-		// missing entries
-		// - package names are collected in the Uses map
-		// - identifiers being declared are collected in the Defs map
-		{`package m0; import "os"; func _() { _ = os.Stdout }`, `os`, `<missing>`},
-		{`package m1; import p "os"; func _() { _ = p.Stdout }`, `p`, `<missing>`},
-		{`package m2; const c = 0`, `c`, `<missing>`},
-		{`package m3; type T int`, `T`, `<missing>`},
-		{`package m4; var v int`, `v`, `<missing>`},
-		{`package m5; func f() {}`, `f`, `<missing>`},
-		{`package m6; func _(x int) {}`, `x`, `<missing>`},
-		{`package m6; func _()(x int) { return }`, `x`, `<missing>`},
-		{`package m6; type T int; func (x T) _() {}`, `x`, `<missing>`},
-	}
-
-	for _, test := range tests {
-		info := Info{Types: make(map[ast.Expr]TypeAndValue)}
-		name := mustTypecheck(t, "PredicatesInfo", test.src, &info)
-
-		// look for expression predicates
-		got := "<missing>"
-		for e, tv := range info.Types {
-			//println(name, ExprString(e))
-			if ExprString(e) == test.expr {
-				got = predString(tv)
-				break
-			}
-		}
-
-		if got != test.pred {
-			t.Errorf("package %s: got %s; want %s", name, got, test.pred)
-		}
-	}
-}
-
-func TestScopesInfo(t *testing.T) {
-	var tests = []struct {
-		src    string
-		scopes []string // list of scope descriptors of the form kind:varlist
-	}{
-		{`package p0`, []string{
-			"file:",
-		}},
-		{`package p1; import ( "fmt"; m "math"; _ "os" ); var ( _ = fmt.Println; _ = m.Pi )`, []string{
-			"file:fmt m",
-		}},
-		{`package p2; func _() {}`, []string{
-			"file:", "func:",
-		}},
-		{`package p3; func _(x, y int) {}`, []string{
-			"file:", "func:x y",
-		}},
-		{`package p4; func _(x, y int) { x, z := 1, 2; _ = z }`, []string{
-			"file:", "func:x y z", // redeclaration of x
-		}},
-		{`package p5; func _(x, y int) (u, _ int) { return }`, []string{
-			"file:", "func:u x y",
-		}},
-		{`package p6; func _() { { var x int; _ = x } }`, []string{
-			"file:", "func:", "block:x",
-		}},
-		{`package p7; func _() { if true {} }`, []string{
-			"file:", "func:", "if:", "block:",
-		}},
-		{`package p8; func _() { if x := 0; x < 0 { y := x; _ = y } }`, []string{
-			"file:", "func:", "if:x", "block:y",
-		}},
-		{`package p9; func _() { switch x := 0; x {} }`, []string{
-			"file:", "func:", "switch:x",
-		}},
-		{`package p10; func _() { switch x := 0; x { case 1: y := x; _ = y; default: }}`, []string{
-			"file:", "func:", "switch:x", "case:y", "case:",
-		}},
-		{`package p11; func _(t interface{}) { switch t.(type) {} }`, []string{
-			"file:", "func:t", "type switch:",
-		}},
-		{`package p12; func _(t interface{}) { switch t := t; t.(type) {} }`, []string{
-			"file:", "func:t", "type switch:t",
-		}},
-		{`package p13; func _(t interface{}) { switch x := t.(type) { case int: _ = x } }`, []string{
-			"file:", "func:t", "type switch:", "case:x", // x implicitly declared
-		}},
-		{`package p14; func _() { select{} }`, []string{
-			"file:", "func:",
-		}},
-		{`package p15; func _(c chan int) { select{ case <-c: } }`, []string{
-			"file:", "func:c", "comm:",
-		}},
-		{`package p16; func _(c chan int) { select{ case i := <-c: x := i; _ = x} }`, []string{
-			"file:", "func:c", "comm:i x",
-		}},
-		{`package p17; func _() { for{} }`, []string{
-			"file:", "func:", "for:", "block:",
-		}},
-		{`package p18; func _(n int) { for i := 0; i < n; i++ { _ = i } }`, []string{
-			"file:", "func:n", "for:i", "block:",
-		}},
-		{`package p19; func _(a []int) { for i := range a { _ = i} }`, []string{
-			"file:", "func:a", "range:i", "block:",
-		}},
-		{`package p20; var s int; func _(a []int) { for i, x := range a { s += x; _ = i } }`, []string{
-			"file:", "func:a", "range:i x", "block:",
-		}},
-	}
-
-	for _, test := range tests {
-		info := Info{Scopes: make(map[ast.Node]*Scope)}
-		name := mustTypecheck(t, "ScopesInfo", test.src, &info)
-
-		// number of scopes must match
-		if len(info.Scopes) != len(test.scopes) {
-			t.Errorf("package %s: got %d scopes; want %d", name, len(info.Scopes), len(test.scopes))
-		}
-
-		// scope descriptions must match
-		for node, scope := range info.Scopes {
-			kind := "<unknown node kind>"
-			switch node.(type) {
-			case *ast.File:
-				kind = "file"
-			case *ast.FuncType:
-				kind = "func"
-			case *ast.BlockStmt:
-				kind = "block"
-			case *ast.IfStmt:
-				kind = "if"
-			case *ast.SwitchStmt:
-				kind = "switch"
-			case *ast.TypeSwitchStmt:
-				kind = "type switch"
-			case *ast.CaseClause:
-				kind = "case"
-			case *ast.CommClause:
-				kind = "comm"
-			case *ast.ForStmt:
-				kind = "for"
-			case *ast.RangeStmt:
-				kind = "range"
-			}
-
-			// look for matching scope description
-			desc := kind + ":" + strings.Join(scope.Names(), " ")
-			found := false
-			for _, d := range test.scopes {
-				if desc == d {
-					found = true
-					break
-				}
-			}
-			if !found {
-				t.Errorf("package %s: no matching scope found for %s", name, desc)
-			}
-		}
-	}
-}
-
-func TestInitOrderInfo(t *testing.T) {
-	var tests = []struct {
-		src   string
-		inits []string
-	}{
-		{`package p0; var (x = 1; y = x)`, []string{
-			"x = 1", "y = x",
-		}},
-		{`package p1; var (a = 1; b = 2; c = 3)`, []string{
-			"a = 1", "b = 2", "c = 3",
-		}},
-		{`package p2; var (a, b, c = 1, 2, 3)`, []string{
-			"a = 1", "b = 2", "c = 3",
-		}},
-		{`package p3; var _ = f(); func f() int { return 1 }`, []string{
-			"_ = f()", // blank var
-		}},
-		{`package p4; var (a = 0; x = y; y = z; z = 0)`, []string{
-			"a = 0", "z = 0", "y = z", "x = y",
-		}},
-		{`package p5; var (a, _ = m[0]; m map[int]string)`, []string{
-			"a, _ = m[0]", // blank var
-		}},
-		{`package p6; var a, b = f(); func f() (_, _ int) { return z, z }; var z = 0`, []string{
-			"z = 0", "a, b = f()",
-		}},
-		{`package p7; var (a = func() int { return b }(); b = 1)`, []string{
-			"b = 1", "a = (func() int literal)()",
-		}},
-		{`package p8; var (a, b = func() (_, _ int) { return c, c }(); c = 1)`, []string{
-			"c = 1", "a, b = (func() (_, _ int) literal)()",
-		}},
-		{`package p9; type T struct{}; func (T) m() int { _ = y; return 0 }; var x, y = T.m, 1`, []string{
-			"y = 1", "x = T.m",
-		}},
-		{`package p10; var (d = c + b; a = 0; b = 0; c = 0)`, []string{
-			"a = 0", "b = 0", "c = 0", "d = c + b",
-		}},
-		{`package p11; var (a = e + c; b = d + c; c = 0; d = 0; e = 0)`, []string{
-			"c = 0", "d = 0", "b = d + c", "e = 0", "a = e + c",
-		}},
-		// emit an initializer for n:1 initializations only once (not for each node
-		// on the lhs which may appear in different order in the dependency graph)
-		{`package p12; var (a = x; b = 0; x, y = m[0]; m map[int]int)`, []string{
-			"b = 0", "x, y = m[0]", "a = x",
-		}},
-		// test case from spec section on package initialization
-		{`package p12
-
-		var (
-			a = c + b
-			b = f()
-			c = f()
-			d = 3
-		)
-
-		func f() int {
-			d++
-			return d
-		}`, []string{
-			"d = 3", "b = f()", "c = f()", "a = c + b",
-		}},
-		// test case for issue 7131
-		{`package main
-
-		var counter int
-		func next() int { counter++; return counter }
-
-		var _ = makeOrder()
-		func makeOrder() []int { return []int{f, b, d, e, c, a} }
-
-		var a       = next()
-		var b, c    = next(), next()
-		var d, e, f = next(), next(), next()
-		`, []string{
-			"a = next()", "b = next()", "c = next()", "d = next()", "e = next()", "f = next()", "_ = makeOrder()",
-		}},
-	}
-
-	for _, test := range tests {
-		info := Info{}
-		name := mustTypecheck(t, "InitOrderInfo", test.src, &info)
-
-		// number of initializers must match
-		if len(info.InitOrder) != len(test.inits) {
-			t.Errorf("package %s: got %d initializers; want %d", name, len(info.InitOrder), len(test.inits))
-			continue
-		}
-
-		// initializers must match
-		for i, want := range test.inits {
-			got := info.InitOrder[i].String()
-			if got != want {
-				t.Errorf("package %s, init %d: got %s; want %s", name, i, got, want)
-				continue
-			}
-		}
-	}
-}
-
-func TestMultiFileInitOrder(t *testing.T) {
-	fset := token.NewFileSet()
-	mustParse := func(src string) *ast.File {
-		f, err := parser.ParseFile(fset, "main", src, 0)
-		if err != nil {
-			t.Fatal(err)
-		}
-		return f
-	}
-
-	fileA := mustParse(`package main; var a = 1`)
-	fileB := mustParse(`package main; var b = 2`)
-
-	// The initialization order must not depend on the parse
-	// order of the files, only on the presentation order to
-	// the type-checker.
-	for _, test := range []struct {
-		files []*ast.File
-		want  string
-	}{
-		{[]*ast.File{fileA, fileB}, "[a = 1 b = 2]"},
-		{[]*ast.File{fileB, fileA}, "[b = 2 a = 1]"},
-	} {
-		var info Info
-		if _, err := new(Config).Check("main", fset, test.files, &info); err != nil {
-			t.Fatal(err)
-		}
-		if got := fmt.Sprint(info.InitOrder); got != test.want {
-			t.Fatalf("got %s; want %s", got, test.want)
-		}
-	}
-}
-
-func TestFiles(t *testing.T) {
-	var sources = []string{
-		"package p; type T struct{}; func (T) m1() {}",
-		"package p; func (T) m2() {}; var x interface{ m1(); m2() } = T{}",
-		"package p; func (T) m3() {}; var y interface{ m1(); m2(); m3() } = T{}",
-		"package p",
-	}
-
-	var conf Config
-	fset := token.NewFileSet()
-	pkg := NewPackage("p", "p")
-	var info Info
-	check := NewChecker(&conf, fset, pkg, &info)
-
-	for i, src := range sources {
-		filename := fmt.Sprintf("sources%d", i)
-		f, err := parser.ParseFile(fset, filename, src, 0)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if err := check.Files([]*ast.File{f}); err != nil {
-			t.Error(err)
-		}
-	}
-
-	// check InitOrder is [x y]
-	var vars []string
-	for _, init := range info.InitOrder {
-		for _, v := range init.Lhs {
-			vars = append(vars, v.Name())
-		}
-	}
-	if got, want := fmt.Sprint(vars), "[x y]"; got != want {
-		t.Errorf("InitOrder == %s, want %s", got, want)
-	}
-}
-
-func TestSelection(t *testing.T) {
-	selections := make(map[*ast.SelectorExpr]*Selection)
-
-	fset := token.NewFileSet()
-	conf := Config{
-		Packages: make(map[string]*Package),
-		Import: func(imports map[string]*Package, path string) (*Package, error) {
-			return imports[path], nil
-		},
-	}
-	makePkg := func(path, src string) {
-		f, err := parser.ParseFile(fset, path+".go", src, 0)
-		if err != nil {
-			t.Fatal(err)
-		}
-		pkg, err := conf.Check(path, fset, []*ast.File{f}, &Info{Selections: selections})
-		if err != nil {
-			t.Fatal(err)
-		}
-		conf.Packages[path] = pkg
-	}
-
-	const libSrc = `
-package lib
-type T float64
-const C T = 3
-var V T
-func F() {}
-func (T) M() {}
-`
-	const mainSrc = `
-package main
-import "lib"
-
-type A struct {
-	*B
-	C
-}
-
-type B struct {
-	b int
-}
-
-func (B) f(int)
-
-type C struct {
-	c int
-}
-
-func (C) g()
-func (*C) h()
-
-func main() {
-	// qualified identifiers
-	var _ lib.T
-        _ = lib.C
-        _ = lib.F
-        _ = lib.V
-	_ = lib.T.M
-
-	// fields
-	_ = A{}.B
-	_ = new(A).B
-
-	_ = A{}.C
-	_ = new(A).C
-
-	_ = A{}.b
-	_ = new(A).b
-
-	_ = A{}.c
-	_ = new(A).c
-
-	// methods
-        _ = A{}.f
-        _ = new(A).f
-        _ = A{}.g
-        _ = new(A).g
-        _ = new(A).h
-
-        _ = B{}.f
-        _ = new(B).f
-
-        _ = C{}.g
-        _ = new(C).g
-        _ = new(C).h
-
-	// method expressions
-        _ = A.f
-        _ = (*A).f
-        _ = B.f
-        _ = (*B).f
-}`
-
-	wantOut := map[string][2]string{
-		"lib.T.M": {"method expr (lib.T) M(lib.T)", ".[0]"},
-
-		"A{}.B":    {"field (main.A) B *main.B", ".[0]"},
-		"new(A).B": {"field (*main.A) B *main.B", "->[0]"},
-		"A{}.C":    {"field (main.A) C main.C", ".[1]"},
-		"new(A).C": {"field (*main.A) C main.C", "->[1]"},
-		"A{}.b":    {"field (main.A) b int", "->[0 0]"},
-		"new(A).b": {"field (*main.A) b int", "->[0 0]"},
-		"A{}.c":    {"field (main.A) c int", ".[1 0]"},
-		"new(A).c": {"field (*main.A) c int", "->[1 0]"},
-
-		"A{}.f":    {"method (main.A) f(int)", "->[0 0]"},
-		"new(A).f": {"method (*main.A) f(int)", "->[0 0]"},
-		"A{}.g":    {"method (main.A) g()", ".[1 0]"},
-		"new(A).g": {"method (*main.A) g()", "->[1 0]"},
-		"new(A).h": {"method (*main.A) h()", "->[1 1]"}, // TODO(gri) should this report .[1 1] ?
-		"B{}.f":    {"method (main.B) f(int)", ".[0]"},
-		"new(B).f": {"method (*main.B) f(int)", "->[0]"},
-		"C{}.g":    {"method (main.C) g()", ".[0]"},
-		"new(C).g": {"method (*main.C) g()", "->[0]"},
-		"new(C).h": {"method (*main.C) h()", "->[1]"}, // TODO(gri) should this report .[1] ?
-
-		"A.f":    {"method expr (main.A) f(main.A, int)", "->[0 0]"},
-		"(*A).f": {"method expr (*main.A) f(*main.A, int)", "->[0 0]"},
-		"B.f":    {"method expr (main.B) f(main.B, int)", ".[0]"},
-		"(*B).f": {"method expr (*main.B) f(*main.B, int)", "->[0]"},
-	}
-
-	makePkg("lib", libSrc)
-	makePkg("main", mainSrc)
-
-	for e, sel := range selections {
-		sel.String() // assertion: must not panic
-
-		start := fset.Position(e.Pos()).Offset
-		end := fset.Position(e.End()).Offset
-		syntax := mainSrc[start:end] // (all SelectorExprs are in main, not lib)
-
-		direct := "."
-		if sel.Indirect() {
-			direct = "->"
-		}
-		got := [2]string{
-			sel.String(),
-			fmt.Sprintf("%s%v", direct, sel.Index()),
-		}
-		want := wantOut[syntax]
-		if want != got {
-			t.Errorf("%s: got %q; want %q", syntax, got, want)
-		}
-		delete(wantOut, syntax)
-
-		// We must explicitly assert properties of the
-		// Signature's receiver since it doesn't participate
-		// in Identical() or String().
-		sig, _ := sel.Type().(*Signature)
-		if sel.Kind() == MethodVal {
-			got := sig.Recv().Type()
-			want := sel.Recv()
-			if !Identical(got, want) {
-				t.Errorf("%s: Recv() = %s, want %s", syntax, got, want)
-			}
-		} else if sig != nil && sig.Recv() != nil {
-			t.Errorf("%s: signature has receiver %s", sig, sig.Recv().Type())
-		}
-	}
-	// Assert that all wantOut entries were used exactly once.
-	for syntax := range wantOut {
-		t.Errorf("no ast.Selection found with syntax %q", syntax)
-	}
-}
-
-func TestIssue8518(t *testing.T) {
-	fset := token.NewFileSet()
-	conf := Config{
-		Packages: make(map[string]*Package),
-		Error:    func(err error) { t.Log(err) }, // don't exit after first error
-		Import: func(imports map[string]*Package, path string) (*Package, error) {
-			return imports[path], nil
-		},
-	}
-	makePkg := func(path, src string) {
-		f, err := parser.ParseFile(fset, path, src, 0)
-		if err != nil {
-			t.Fatal(err)
-		}
-		pkg, _ := conf.Check(path, fset, []*ast.File{f}, nil) // errors logged via conf.Error
-		conf.Packages[path] = pkg
-	}
-
-	const libSrc = `
-package a 
-import "missing"
-const C1 = foo
-const C2 = missing.C
-`
-
-	const mainSrc = `
-package main
-import "a"
-var _ = a.C1
-var _ = a.C2
-`
-
-	makePkg("a", libSrc)
-	makePkg("main", mainSrc) // don't crash when type-checking this package
-}
-
-func TestLookupFieldOrMethod(t *testing.T) {
-	// Test cases assume a lookup of the form a.f or x.f, where a stands for an
-	// addressable value, and x for a non-addressable value (even though a variable
-	// for ease of test case writing).
-	var tests = []struct {
-		src      string
-		found    bool
-		index    []int
-		indirect bool
-	}{
-		// field lookups
-		{"var x T; type T struct{}", false, nil, false},
-		{"var x T; type T struct{ f int }", true, []int{0}, false},
-		{"var x T; type T struct{ a, b, f, c int }", true, []int{2}, false},
-
-		// method lookups
-		{"var a T; type T struct{}; func (T) f() {}", true, []int{0}, false},
-		{"var a *T; type T struct{}; func (T) f() {}", true, []int{0}, true},
-		{"var a T; type T struct{}; func (*T) f() {}", true, []int{0}, false},
-		{"var a *T; type T struct{}; func (*T) f() {}", true, []int{0}, true}, // TODO(gri) should this report indirect = false?
-
-		// collisions
-		{"type ( E1 struct{ f int }; E2 struct{ f int }; x struct{ E1; *E2 })", false, []int{1, 0}, false},
-		{"type ( E1 struct{ f int }; E2 struct{}; x struct{ E1; *E2 }); func (E2) f() {}", false, []int{1, 0}, false},
-
-		// outside methodset
-		// (*T).f method exists, but value of type T is not addressable
-		{"var x T; type T struct{}; func (*T) f() {}", false, nil, true},
-	}
-
-	for _, test := range tests {
-		pkg, err := pkgFor("test", "package p;"+test.src, nil)
-		if err != nil {
-			t.Errorf("%s: incorrect test case: %s", test.src, err)
-			continue
-		}
-
-		obj := pkg.Scope().Lookup("a")
-		if obj == nil {
-			if obj = pkg.Scope().Lookup("x"); obj == nil {
-				t.Errorf("%s: incorrect test case - no object a or x", test.src)
-				continue
-			}
-		}
-
-		f, index, indirect := LookupFieldOrMethod(obj.Type(), obj.Name() == "a", pkg, "f")
-		if (f != nil) != test.found {
-			if f == nil {
-				t.Errorf("%s: got no object; want one", test.src)
-			} else {
-				t.Errorf("%s: got object = %v; want none", test.src, f)
-			}
-		}
-		if !sameSlice(index, test.index) {
-			t.Errorf("%s: got index = %v; want %v", test.src, index, test.index)
-		}
-		if indirect != test.indirect {
-			t.Errorf("%s: got indirect = %v; want %v", test.src, indirect, test.indirect)
-		}
-	}
-}
-
-func sameSlice(a, b []int) bool {
-	if len(a) != len(b) {
-		return false
-	}
-	for i, x := range a {
-		if x != b[i] {
-			return false
-		}
-	}
-	return true
-}
diff --git a/third_party/gotools/go/types/assignments.go b/third_party/gotools/go/types/assignments.go
deleted file mode 100644
index 14ee286..0000000
--- a/third_party/gotools/go/types/assignments.go
+++ /dev/null
@@ -1,323 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements initialization and assignment checks.
-
-package types
-
-import (
-	"go/ast"
-	"go/token"
-)
-
-// assignment reports whether x can be assigned to a variable of type T,
-// if necessary by attempting to convert untyped values to the appropriate
-// type. If x.mode == invalid upon return, then assignment has already
-// issued an error message and the caller doesn't have to report another.
-// Use T == nil to indicate assignment to an untyped blank identifier.
-//
-// TODO(gri) Should find a better way to handle in-band errors.
-//
-func (check *Checker) assignment(x *operand, T Type) bool {
-	switch x.mode {
-	case invalid:
-		return true // error reported before
-	case constant, variable, mapindex, value, commaok:
-		// ok
-	default:
-		unreachable()
-	}
-
-	// x must be a single value
-	// (tuple types are never named - no need for underlying type)
-	if t, _ := x.typ.(*Tuple); t != nil {
-		assert(t.Len() > 1)
-		check.errorf(x.pos(), "%d-valued expression %s used as single value", t.Len(), x)
-		x.mode = invalid
-		return false
-	}
-
-	if isUntyped(x.typ) {
-		target := T
-		// spec: "If an untyped constant is assigned to a variable of interface
-		// type or the blank identifier, the constant is first converted to type
-		// bool, rune, int, float64, complex128 or string respectively, depending
-		// on whether the value is a boolean, rune, integer, floating-point, complex,
-		// or string constant."
-		if T == nil || IsInterface(T) {
-			if T == nil && x.typ == Typ[UntypedNil] {
-				check.errorf(x.pos(), "use of untyped nil")
-				x.mode = invalid
-				return false
-			}
-			target = defaultType(x.typ)
-		}
-		check.convertUntyped(x, target)
-		if x.mode == invalid {
-			return false
-		}
-	}
-
-	// spec: "If a left-hand side is the blank identifier, any typed or
-	// non-constant value except for the predeclared identifier nil may
-	// be assigned to it."
-	return T == nil || x.assignableTo(check.conf, T)
-}
-
-func (check *Checker) initConst(lhs *Const, x *operand) {
-	if x.mode == invalid || x.typ == Typ[Invalid] || lhs.typ == Typ[Invalid] {
-		if lhs.typ == nil {
-			lhs.typ = Typ[Invalid]
-		}
-		return
-	}
-
-	// rhs must be a constant
-	if x.mode != constant {
-		check.errorf(x.pos(), "%s is not constant", x)
-		if lhs.typ == nil {
-			lhs.typ = Typ[Invalid]
-		}
-		return
-	}
-	assert(isConstType(x.typ))
-
-	// If the lhs doesn't have a type yet, use the type of x.
-	if lhs.typ == nil {
-		lhs.typ = x.typ
-	}
-
-	if !check.assignment(x, lhs.typ) {
-		if x.mode != invalid {
-			check.errorf(x.pos(), "cannot define constant %s (type %s) as %s", lhs.Name(), lhs.typ, x)
-		}
-		return
-	}
-
-	lhs.val = x.val
-}
-
-// If result is set, lhs is a function result parameter and x is a return result.
-func (check *Checker) initVar(lhs *Var, x *operand, result bool) Type {
-	if x.mode == invalid || x.typ == Typ[Invalid] || lhs.typ == Typ[Invalid] {
-		if lhs.typ == nil {
-			lhs.typ = Typ[Invalid]
-		}
-		return nil
-	}
-
-	// If the lhs doesn't have a type yet, use the type of x.
-	if lhs.typ == nil {
-		typ := x.typ
-		if isUntyped(typ) {
-			// convert untyped types to default types
-			if typ == Typ[UntypedNil] {
-				check.errorf(x.pos(), "use of untyped nil")
-				lhs.typ = Typ[Invalid]
-				return nil
-			}
-			typ = defaultType(typ)
-		}
-		lhs.typ = typ
-	}
-
-	if !check.assignment(x, lhs.typ) {
-		if x.mode != invalid {
-			if result {
-				// don't refer to lhs.name because it may be an anonymous result parameter
-				check.errorf(x.pos(), "cannot return %s as value of type %s", x, lhs.typ)
-			} else {
-				check.errorf(x.pos(), "cannot initialize %s with %s", lhs, x)
-			}
-		}
-		return nil
-	}
-
-	return x.typ
-}
-
-func (check *Checker) assignVar(lhs ast.Expr, x *operand) Type {
-	if x.mode == invalid || x.typ == Typ[Invalid] {
-		return nil
-	}
-
-	// Determine if the lhs is a (possibly parenthesized) identifier.
-	ident, _ := unparen(lhs).(*ast.Ident)
-
-	// Don't evaluate lhs if it is the blank identifier.
-	if ident != nil && ident.Name == "_" {
-		check.recordDef(ident, nil)
-		if !check.assignment(x, nil) {
-			assert(x.mode == invalid)
-			x.typ = nil
-		}
-		return x.typ
-	}
-
-	// If the lhs is an identifier denoting a variable v, this assignment
-	// is not a 'use' of v. Remember current value of v.used and restore
-	// after evaluating the lhs via check.expr.
-	var v *Var
-	var v_used bool
-	if ident != nil {
-		if _, obj := check.scope.LookupParent(ident.Name); obj != nil {
-			v, _ = obj.(*Var)
-			if v != nil {
-				v_used = v.used
-			}
-		}
-	}
-
-	var z operand
-	check.expr(&z, lhs)
-	if v != nil {
-		v.used = v_used // restore v.used
-	}
-
-	if z.mode == invalid || z.typ == Typ[Invalid] {
-		return nil
-	}
-
-	// spec: "Each left-hand side operand must be addressable, a map index
-	// expression, or the blank identifier. Operands may be parenthesized."
-	switch z.mode {
-	case invalid:
-		return nil
-	case variable, mapindex:
-		// ok
-	default:
-		check.errorf(z.pos(), "cannot assign to %s", &z)
-		return nil
-	}
-
-	if !check.assignment(x, z.typ) {
-		if x.mode != invalid {
-			check.errorf(x.pos(), "cannot assign %s to %s", x, &z)
-		}
-		return nil
-	}
-
-	return x.typ
-}
-
-// If returnPos is valid, initVars is called to type-check the assignment of
-// return expressions, and returnPos is the position of the return statement.
-func (check *Checker) initVars(lhs []*Var, rhs []ast.Expr, returnPos token.Pos) {
-	l := len(lhs)
-	get, r, commaOk := unpack(func(x *operand, i int) { check.expr(x, rhs[i]) }, len(rhs), l == 2 && !returnPos.IsValid())
-	if get == nil || l != r {
-		// invalidate lhs and use rhs
-		for _, obj := range lhs {
-			if obj.typ == nil {
-				obj.typ = Typ[Invalid]
-			}
-		}
-		if get == nil {
-			return // error reported by unpack
-		}
-		check.useGetter(get, r)
-		if returnPos.IsValid() {
-			check.errorf(returnPos, "wrong number of return values (want %d, got %d)", l, r)
-			return
-		}
-		check.errorf(rhs[0].Pos(), "assignment count mismatch (%d vs %d)", l, r)
-		return
-	}
-
-	var x operand
-	if commaOk {
-		var a [2]Type
-		for i := range a {
-			get(&x, i)
-			a[i] = check.initVar(lhs[i], &x, returnPos.IsValid())
-		}
-		check.recordCommaOkTypes(rhs[0], a)
-		return
-	}
-
-	for i, lhs := range lhs {
-		get(&x, i)
-		check.initVar(lhs, &x, returnPos.IsValid())
-	}
-}
-
-func (check *Checker) assignVars(lhs, rhs []ast.Expr) {
-	l := len(lhs)
-	get, r, commaOk := unpack(func(x *operand, i int) { check.expr(x, rhs[i]) }, len(rhs), l == 2)
-	if get == nil {
-		return // error reported by unpack
-	}
-	if l != r {
-		check.useGetter(get, r)
-		check.errorf(rhs[0].Pos(), "assignment count mismatch (%d vs %d)", l, r)
-		return
-	}
-
-	var x operand
-	if commaOk {
-		var a [2]Type
-		for i := range a {
-			get(&x, i)
-			a[i] = check.assignVar(lhs[i], &x)
-		}
-		check.recordCommaOkTypes(rhs[0], a)
-		return
-	}
-
-	for i, lhs := range lhs {
-		get(&x, i)
-		check.assignVar(lhs, &x)
-	}
-}
-
-func (check *Checker) shortVarDecl(pos token.Pos, lhs, rhs []ast.Expr) {
-	scope := check.scope
-
-	// collect lhs variables
-	var newVars []*Var
-	var lhsVars = make([]*Var, len(lhs))
-	for i, lhs := range lhs {
-		var obj *Var
-		if ident, _ := lhs.(*ast.Ident); ident != nil {
-			// Use the correct obj if the ident is redeclared. The
-			// variable's scope starts after the declaration; so we
-			// must use Scope.Lookup here and call Scope.Insert
-			// (via check.declare) later.
-			name := ident.Name
-			if alt := scope.Lookup(name); alt != nil {
-				// redeclared object must be a variable
-				if alt, _ := alt.(*Var); alt != nil {
-					obj = alt
-				} else {
-					check.errorf(lhs.Pos(), "cannot assign to %s", lhs)
-				}
-				check.recordUse(ident, alt)
-			} else {
-				// declare new variable, possibly a blank (_) variable
-				obj = NewVar(ident.Pos(), check.pkg, name, nil)
-				if name != "_" {
-					newVars = append(newVars, obj)
-				}
-				check.recordDef(ident, obj)
-			}
-		} else {
-			check.errorf(lhs.Pos(), "cannot declare %s", lhs)
-		}
-		if obj == nil {
-			obj = NewVar(lhs.Pos(), check.pkg, "_", nil) // dummy variable
-		}
-		lhsVars[i] = obj
-	}
-
-	check.initVars(lhsVars, rhs, token.NoPos)
-
-	// declare new variables
-	if len(newVars) > 0 {
-		for _, obj := range newVars {
-			check.declare(scope, nil, obj) // recordObject already called
-		}
-	} else {
-		check.softErrorf(pos, "no new variables on left side of :=")
-	}
-}
diff --git a/third_party/gotools/go/types/builtins.go b/third_party/gotools/go/types/builtins.go
deleted file mode 100644
index f9358ef..0000000
--- a/third_party/gotools/go/types/builtins.go
+++ /dev/null
@@ -1,620 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements typechecking of builtin function calls.
-
-package types
-
-import (
-	"go/ast"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/ast/astutil"
-	"llvm.org/llgo/third_party/gotools/go/exact"
-)
-
-// builtin type-checks a call to the built-in specified by id and
-// returns true if the call is valid, with *x holding the result;
-// but x.expr is not set. If the call is invalid, the result is
-// false, and *x is undefined.
-//
-func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ bool) {
-	// append is the only built-in that permits the use of ... for the last argument
-	bin := predeclaredFuncs[id]
-	if call.Ellipsis.IsValid() && id != _Append {
-		check.invalidOp(call.Ellipsis, "invalid use of ... with built-in %s", bin.name)
-		check.use(call.Args...)
-		return
-	}
-
-	// For len(x) and cap(x) we need to know if x contains any function calls or
-	// receive operations. Save/restore current setting and set hasCallOrRecv to
-	// false for the evaluation of x so that we can check it afterwards.
-	// Note: We must do this _before_ calling unpack because unpack evaluates the
-	//       first argument before we even call arg(x, 0)!
-	if id == _Len || id == _Cap {
-		defer func(b bool) {
-			check.hasCallOrRecv = b
-		}(check.hasCallOrRecv)
-		check.hasCallOrRecv = false
-	}
-
-	// determine actual arguments
-	var arg getter
-	nargs := len(call.Args)
-	switch id {
-	default:
-		// make argument getter
-		arg, nargs, _ = unpack(func(x *operand, i int) { check.expr(x, call.Args[i]) }, nargs, false)
-		if arg == nil {
-			return
-		}
-		// evaluate first argument, if present
-		if nargs > 0 {
-			arg(x, 0)
-			if x.mode == invalid {
-				return
-			}
-		}
-	case _Make, _New, _Offsetof, _Trace:
-		// arguments require special handling
-	}
-
-	// check argument count
-	{
-		msg := ""
-		if nargs < bin.nargs {
-			msg = "not enough"
-		} else if !bin.variadic && nargs > bin.nargs {
-			msg = "too many"
-		}
-		if msg != "" {
-			check.invalidOp(call.Rparen, "%s arguments for %s (expected %d, found %d)", msg, call, bin.nargs, nargs)
-			return
-		}
-	}
-
-	switch id {
-	case _Append:
-		// append(s S, x ...T) S, where T is the element type of S
-		// spec: "The variadic function append appends zero or more values x to s of type
-		// S, which must be a slice type, and returns the resulting slice, also of type S.
-		// The values x are passed to a parameter of type ...T where T is the element type
-		// of S and the respective parameter passing rules apply."
-		S := x.typ
-		var T Type
-		if s, _ := S.Underlying().(*Slice); s != nil {
-			T = s.elem
-		} else {
-			check.invalidArg(x.pos(), "%s is not a slice", x)
-			return
-		}
-
-		// remember arguments that have been evaluated already
-		alist := []operand{*x}
-
-		// spec: "As a special case, append also accepts a first argument assignable
-		// to type []byte with a second argument of string type followed by ... .
-		// This form appends the bytes of the string.
-		if nargs == 2 && call.Ellipsis.IsValid() && x.assignableTo(check.conf, NewSlice(UniverseByte)) {
-			arg(x, 1)
-			if x.mode == invalid {
-				return
-			}
-			if isString(x.typ) {
-				if check.Types != nil {
-					sig := makeSig(S, S, x.typ)
-					sig.variadic = true
-					check.recordBuiltinType(call.Fun, sig)
-				}
-				x.mode = value
-				x.typ = S
-				break
-			}
-			alist = append(alist, *x)
-			// fallthrough
-		}
-
-		// check general case by creating custom signature
-		sig := makeSig(S, S, NewSlice(T)) // []T required for variadic signature
-		sig.variadic = true
-		check.arguments(x, call, sig, func(x *operand, i int) {
-			// only evaluate arguments that have not been evaluated before
-			if i < len(alist) {
-				*x = alist[i]
-				return
-			}
-			arg(x, i)
-		}, nargs)
-		// ok to continue even if check.arguments reported errors
-
-		x.mode = value
-		x.typ = S
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, sig)
-		}
-
-	case _Cap, _Len:
-		// cap(x)
-		// len(x)
-		mode := invalid
-		var typ Type
-		var val exact.Value
-		switch typ = implicitArrayDeref(x.typ.Underlying()); t := typ.(type) {
-		case *Basic:
-			if isString(t) && id == _Len {
-				if x.mode == constant {
-					mode = constant
-					val = exact.MakeInt64(int64(len(exact.StringVal(x.val))))
-				} else {
-					mode = value
-				}
-			}
-
-		case *Array:
-			mode = value
-			// spec: "The expressions len(s) and cap(s) are constants
-			// if the type of s is an array or pointer to an array and
-			// the expression s does not contain channel receives or
-			// function calls; in this case s is not evaluated."
-			if !check.hasCallOrRecv {
-				mode = constant
-				val = exact.MakeInt64(t.len)
-			}
-
-		case *Slice, *Chan:
-			mode = value
-
-		case *Map:
-			if id == _Len {
-				mode = value
-			}
-		}
-
-		if mode == invalid {
-			check.invalidArg(x.pos(), "%s for %s", x, bin.name)
-			return
-		}
-
-		x.mode = mode
-		x.typ = Typ[Int]
-		x.val = val
-		if check.Types != nil && mode != constant {
-			check.recordBuiltinType(call.Fun, makeSig(x.typ, typ))
-		}
-
-	case _Close:
-		// close(c)
-		c, _ := x.typ.Underlying().(*Chan)
-		if c == nil {
-			check.invalidArg(x.pos(), "%s is not a channel", x)
-			return
-		}
-		if c.dir == RecvOnly {
-			check.invalidArg(x.pos(), "%s must not be a receive-only channel", x)
-			return
-		}
-
-		x.mode = novalue
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(nil, c))
-		}
-
-	case _Complex:
-		// complex(x, y realT) complexT
-		if !check.complexArg(x) {
-			return
-		}
-
-		var y operand
-		arg(&y, 1)
-		if y.mode == invalid {
-			return
-		}
-		if !check.complexArg(&y) {
-			return
-		}
-
-		check.convertUntyped(x, y.typ)
-		if x.mode == invalid {
-			return
-		}
-		check.convertUntyped(&y, x.typ)
-		if y.mode == invalid {
-			return
-		}
-
-		if !Identical(x.typ, y.typ) {
-			check.invalidArg(x.pos(), "mismatched types %s and %s", x.typ, y.typ)
-			return
-		}
-
-		if x.mode == constant && y.mode == constant {
-			x.val = exact.BinaryOp(x.val, token.ADD, exact.MakeImag(y.val))
-		} else {
-			x.mode = value
-		}
-
-		realT := x.typ
-		complexT := Typ[Invalid]
-		switch realT.Underlying().(*Basic).kind {
-		case Float32:
-			complexT = Typ[Complex64]
-		case Float64:
-			complexT = Typ[Complex128]
-		case UntypedInt, UntypedRune, UntypedFloat:
-			if x.mode == constant {
-				realT = defaultType(realT).(*Basic)
-				complexT = Typ[UntypedComplex]
-			} else {
-				// untyped but not constant; probably because one
-				// operand is a non-constant shift of untyped lhs
-				realT = Typ[Float64]
-				complexT = Typ[Complex128]
-			}
-		default:
-			check.invalidArg(x.pos(), "float32 or float64 arguments expected")
-			return
-		}
-
-		x.typ = complexT
-		if check.Types != nil && x.mode != constant {
-			check.recordBuiltinType(call.Fun, makeSig(complexT, realT, realT))
-		}
-
-		if x.mode != constant {
-			// The arguments have now their final types, which at run-
-			// time will be materialized. Update the expression trees.
-			// If the current types are untyped, the materialized type
-			// is the respective default type.
-			// (If the result is constant, the arguments are never
-			// materialized and there is nothing to do.)
-			check.updateExprType(x.expr, realT, true)
-			check.updateExprType(y.expr, realT, true)
-		}
-
-	case _Copy:
-		// copy(x, y []T) int
-		var dst Type
-		if t, _ := x.typ.Underlying().(*Slice); t != nil {
-			dst = t.elem
-		}
-
-		var y operand
-		arg(&y, 1)
-		if y.mode == invalid {
-			return
-		}
-		var src Type
-		switch t := y.typ.Underlying().(type) {
-		case *Basic:
-			if isString(y.typ) {
-				src = UniverseByte
-			}
-		case *Slice:
-			src = t.elem
-		}
-
-		if dst == nil || src == nil {
-			check.invalidArg(x.pos(), "copy expects slice arguments; found %s and %s", x, &y)
-			return
-		}
-
-		if !Identical(dst, src) {
-			check.invalidArg(x.pos(), "arguments to copy %s and %s have different element types %s and %s", x, &y, dst, src)
-			return
-		}
-
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(Typ[Int], x.typ, y.typ))
-		}
-		x.mode = value
-		x.typ = Typ[Int]
-
-	case _Delete:
-		// delete(m, k)
-		m, _ := x.typ.Underlying().(*Map)
-		if m == nil {
-			check.invalidArg(x.pos(), "%s is not a map", x)
-			return
-		}
-		arg(x, 1) // k
-		if x.mode == invalid {
-			return
-		}
-
-		if !x.assignableTo(check.conf, m.key) {
-			check.invalidArg(x.pos(), "%s is not assignable to %s", x, m.key)
-			return
-		}
-
-		x.mode = novalue
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(nil, m, m.key))
-		}
-
-	case _Imag, _Real:
-		// imag(complexT) realT
-		// real(complexT) realT
-		if !isComplex(x.typ) {
-			check.invalidArg(x.pos(), "%s must be a complex number", x)
-			return
-		}
-		if x.mode == constant {
-			if id == _Real {
-				x.val = exact.Real(x.val)
-			} else {
-				x.val = exact.Imag(x.val)
-			}
-		} else {
-			x.mode = value
-		}
-		var k BasicKind
-		switch x.typ.Underlying().(*Basic).kind {
-		case Complex64:
-			k = Float32
-		case Complex128:
-			k = Float64
-		case UntypedComplex:
-			k = UntypedFloat
-		default:
-			unreachable()
-		}
-
-		if check.Types != nil && x.mode != constant {
-			check.recordBuiltinType(call.Fun, makeSig(Typ[k], x.typ))
-		}
-		x.typ = Typ[k]
-
-	case _Make:
-		// make(T, n)
-		// make(T, n, m)
-		// (no argument evaluated yet)
-		arg0 := call.Args[0]
-		T := check.typ(arg0)
-		if T == Typ[Invalid] {
-			return
-		}
-
-		var min int // minimum number of arguments
-		switch T.Underlying().(type) {
-		case *Slice:
-			min = 2
-		case *Map, *Chan:
-			min = 1
-		default:
-			check.invalidArg(arg0.Pos(), "cannot make %s; type must be slice, map, or channel", arg0)
-			return
-		}
-		if nargs < min || min+1 < nargs {
-			check.errorf(call.Pos(), "%s expects %d or %d arguments; found %d", call, min, min+1, nargs)
-			return
-		}
-		var sizes []int64 // constant integer arguments, if any
-		for _, arg := range call.Args[1:] {
-			if s, ok := check.index(arg, -1); ok && s >= 0 {
-				sizes = append(sizes, s)
-			}
-		}
-		if len(sizes) == 2 && sizes[0] > sizes[1] {
-			check.invalidArg(call.Args[1].Pos(), "length and capacity swapped")
-			// safe to continue
-		}
-		x.mode = value
-		x.typ = T
-		if check.Types != nil {
-			params := [...]Type{T, Typ[Int], Typ[Int]}
-			check.recordBuiltinType(call.Fun, makeSig(x.typ, params[:1+len(sizes)]...))
-		}
-
-	case _New:
-		// new(T)
-		// (no argument evaluated yet)
-		T := check.typ(call.Args[0])
-		if T == Typ[Invalid] {
-			return
-		}
-
-		x.mode = value
-		x.typ = &Pointer{base: T}
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(x.typ, T))
-		}
-
-	case _Panic:
-		// panic(x)
-		T := new(Interface)
-		if !check.assignment(x, T) {
-			assert(x.mode == invalid)
-			return
-		}
-
-		x.mode = novalue
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(nil, T))
-		}
-
-	case _Print, _Println:
-		// print(x, y, ...)
-		// println(x, y, ...)
-		var params []Type
-		if nargs > 0 {
-			params = make([]Type, nargs)
-			for i := 0; i < nargs; i++ {
-				if i > 0 {
-					arg(x, i) // first argument already evaluated
-				}
-				if !check.assignment(x, nil) {
-					assert(x.mode == invalid)
-					return
-				}
-				params[i] = x.typ
-			}
-		}
-
-		x.mode = novalue
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(nil, params...))
-		}
-
-	case _Recover:
-		// recover() interface{}
-		x.mode = value
-		x.typ = new(Interface)
-		if check.Types != nil {
-			check.recordBuiltinType(call.Fun, makeSig(x.typ))
-		}
-
-	case _Alignof:
-		// unsafe.Alignof(x T) uintptr
-		if !check.assignment(x, nil) {
-			assert(x.mode == invalid)
-			return
-		}
-
-		x.mode = constant
-		x.val = exact.MakeInt64(check.conf.alignof(x.typ))
-		x.typ = Typ[Uintptr]
-		// result is constant - no need to record signature
-
-	case _Offsetof:
-		// unsafe.Offsetof(x T) uintptr, where x must be a selector
-		// (no argument evaluated yet)
-		arg0 := call.Args[0]
-		selx, _ := unparen(arg0).(*ast.SelectorExpr)
-		if selx == nil {
-			check.invalidArg(arg0.Pos(), "%s is not a selector expression", arg0)
-			check.use(arg0)
-			return
-		}
-
-		check.expr(x, selx.X)
-		if x.mode == invalid {
-			return
-		}
-
-		base := derefStructPtr(x.typ)
-		sel := selx.Sel.Name
-		obj, index, indirect := LookupFieldOrMethod(base, false, check.pkg, sel)
-		switch obj.(type) {
-		case nil:
-			check.invalidArg(x.pos(), "%s has no single field %s", base, sel)
-			return
-		case *Func:
-			// TODO(gri) Using derefStructPtr may result in methods being found
-			// that don't actually exist. An error either way, but the error
-			// message is confusing. See: http://play.golang.org/p/al75v23kUy ,
-			// but go/types reports: "invalid argument: x.m is a method value".
-			check.invalidArg(arg0.Pos(), "%s is a method value", arg0)
-			return
-		}
-		if indirect {
-			check.invalidArg(x.pos(), "field %s is embedded via a pointer in %s", sel, base)
-			return
-		}
-
-		// TODO(gri) Should we pass x.typ instead of base (and indirect report if derefStructPtr indirected)?
-		check.recordSelection(selx, FieldVal, base, obj, index, false)
-
-		offs := check.conf.offsetof(base, index)
-		x.mode = constant
-		x.val = exact.MakeInt64(offs)
-		x.typ = Typ[Uintptr]
-		// result is constant - no need to record signature
-
-	case _Sizeof:
-		// unsafe.Sizeof(x T) uintptr
-		if !check.assignment(x, nil) {
-			assert(x.mode == invalid)
-			return
-		}
-
-		x.mode = constant
-		x.val = exact.MakeInt64(check.conf.sizeof(x.typ))
-		x.typ = Typ[Uintptr]
-		// result is constant - no need to record signature
-
-	case _Assert:
-		// assert(pred) causes a typechecker error if pred is false.
-		// The result of assert is the value of pred if there is no error.
-		// Note: assert is only available in self-test mode.
-		if x.mode != constant || !isBoolean(x.typ) {
-			check.invalidArg(x.pos(), "%s is not a boolean constant", x)
-			return
-		}
-		if x.val.Kind() != exact.Bool {
-			check.errorf(x.pos(), "internal error: value of %s should be a boolean constant", x)
-			return
-		}
-		if !exact.BoolVal(x.val) {
-			check.errorf(call.Pos(), "%s failed", call)
-			// compile-time assertion failure - safe to continue
-		}
-		// result is constant - no need to record signature
-
-	case _Trace:
-		// trace(x, y, z, ...) dumps the positions, expressions, and
-		// values of its arguments. The result of trace is the value
-		// of the first argument.
-		// Note: trace is only available in self-test mode.
-		// (no argument evaluated yet)
-		if nargs == 0 {
-			check.dump("%s: trace() without arguments", call.Pos())
-			x.mode = novalue
-			break
-		}
-		var t operand
-		x1 := x
-		for _, arg := range call.Args {
-			check.rawExpr(x1, arg, nil) // permit trace for types, e.g.: new(trace(T))
-			check.dump("%s: %s", x1.pos(), x1)
-			x1 = &t // use incoming x only for first argument
-		}
-		// trace is only available in test mode - no need to record signature
-
-	default:
-		unreachable()
-	}
-
-	return true
-}
-
-// makeSig makes a signature for the given argument and result types.
-// Default types are used for untyped arguments, and res may be nil.
-func makeSig(res Type, args ...Type) *Signature {
-	list := make([]*Var, len(args))
-	for i, param := range args {
-		list[i] = NewVar(token.NoPos, nil, "", defaultType(param))
-	}
-	params := NewTuple(list...)
-	var result *Tuple
-	if res != nil {
-		assert(!isUntyped(res))
-		result = NewTuple(NewVar(token.NoPos, nil, "", res))
-	}
-	return &Signature{params: params, results: result}
-}
-
-// implicitArrayDeref returns A if typ is of the form *A and A is an array;
-// otherwise it returns typ.
-//
-func implicitArrayDeref(typ Type) Type {
-	if p, ok := typ.(*Pointer); ok {
-		if a, ok := p.base.Underlying().(*Array); ok {
-			return a
-		}
-	}
-	return typ
-}
-
-func unparen(x ast.Expr) ast.Expr { return astutil.Unparen(x) }
-
-func (check *Checker) complexArg(x *operand) bool {
-	t, _ := x.typ.Underlying().(*Basic)
-	if t != nil && (t.info&IsFloat != 0 || t.kind == UntypedInt || t.kind == UntypedRune) {
-		return true
-	}
-	check.invalidArg(x.pos(), "%s must be a float32, float64, or an untyped non-complex numeric constant", x)
-	return false
-}
diff --git a/third_party/gotools/go/types/builtins_test.go b/third_party/gotools/go/types/builtins_test.go
deleted file mode 100644
index 95179cf..0000000
--- a/third_party/gotools/go/types/builtins_test.go
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"testing"
-
-	_ "llvm.org/llgo/third_party/gotools/go/gcimporter"
-	. "llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var builtinCalls = []struct {
-	name, src, sig string
-}{
-	{"append", `var s []int; _ = append(s)`, `func([]int, ...int) []int`},
-	{"append", `var s []int; _ = append(s, 0)`, `func([]int, ...int) []int`},
-	{"append", `var s []int; _ = (append)(s, 0)`, `func([]int, ...int) []int`},
-	{"append", `var s []byte; _ = ((append))(s, 0)`, `func([]byte, ...byte) []byte`},
-	{"append", `var s []byte; _ = append(s, "foo"...)`, `func([]byte, string...) []byte`},
-	{"append", `type T []byte; var s T; var str string; _ = append(s, str...)`, `func(p.T, string...) p.T`},
-	{"append", `type T []byte; type U string; var s T; var str U; _ = append(s, str...)`, `func(p.T, p.U...) p.T`},
-
-	{"cap", `var s [10]int; _ = cap(s)`, `invalid type`},  // constant
-	{"cap", `var s [10]int; _ = cap(&s)`, `invalid type`}, // constant
-	{"cap", `var s []int64; _ = cap(s)`, `func([]int64) int`},
-	{"cap", `var c chan<-bool; _ = cap(c)`, `func(chan<- bool) int`},
-
-	{"len", `_ = len("foo")`, `invalid type`}, // constant
-	{"len", `var s string; _ = len(s)`, `func(string) int`},
-	{"len", `var s [10]int; _ = len(s)`, `invalid type`},  // constant
-	{"len", `var s [10]int; _ = len(&s)`, `invalid type`}, // constant
-	{"len", `var s []int64; _ = len(s)`, `func([]int64) int`},
-	{"len", `var c chan<-bool; _ = len(c)`, `func(chan<- bool) int`},
-	{"len", `var m map[string]float32; _ = len(m)`, `func(map[string]float32) int`},
-
-	{"close", `var c chan int; close(c)`, `func(chan int)`},
-	{"close", `var c chan<- chan string; close(c)`, `func(chan<- chan string)`},
-
-	{"complex", `_ = complex(1, 0)`, `invalid type`}, // constant
-	{"complex", `var re float32; _ = complex(re, 1.0)`, `func(float32, float32) complex64`},
-	{"complex", `var im float64; _ = complex(1, im)`, `func(float64, float64) complex128`},
-	{"complex", `type F32 float32; var re, im F32; _ = complex(re, im)`, `func(p.F32, p.F32) complex64`},
-	{"complex", `type F64 float64; var re, im F64; _ = complex(re, im)`, `func(p.F64, p.F64) complex128`},
-
-	{"copy", `var src, dst []byte; copy(dst, src)`, `func([]byte, []byte) int`},
-	{"copy", `type T [][]int; var src, dst T; _ = copy(dst, src)`, `func(p.T, p.T) int`},
-	{"copy", `var src string; var dst []byte; copy(dst, src)`, `func([]byte, string) int`},
-	{"copy", `type T string; type U []byte; var src T; var dst U; copy(dst, src)`, `func(p.U, p.T) int`},
-	{"copy", `var dst []byte; copy(dst, "hello")`, `func([]byte, string) int`},
-
-	{"delete", `var m map[string]bool; delete(m, "foo")`, `func(map[string]bool, string)`},
-	{"delete", `type (K string; V int); var m map[K]V; delete(m, "foo")`, `func(map[p.K]p.V, p.K)`},
-
-	{"imag", `_ = imag(1i)`, `invalid type`}, // constant
-	{"imag", `var c complex64; _ = imag(c)`, `func(complex64) float32`},
-	{"imag", `var c complex128; _ = imag(c)`, `func(complex128) float64`},
-	{"imag", `type C64 complex64; var c C64; _ = imag(c)`, `func(p.C64) float32`},
-	{"imag", `type C128 complex128; var c C128; _ = imag(c)`, `func(p.C128) float64`},
-
-	{"real", `_ = real(1i)`, `invalid type`}, // constant
-	{"real", `var c complex64; _ = real(c)`, `func(complex64) float32`},
-	{"real", `var c complex128; _ = real(c)`, `func(complex128) float64`},
-	{"real", `type C64 complex64; var c C64; _ = real(c)`, `func(p.C64) float32`},
-	{"real", `type C128 complex128; var c C128; _ = real(c)`, `func(p.C128) float64`},
-
-	{"make", `_ = make([]int, 10)`, `func([]int, int) []int`},
-	{"make", `type T []byte; _ = make(T, 10, 20)`, `func(p.T, int, int) p.T`},
-
-	{"new", `_ = new(int)`, `func(int) *int`},
-	{"new", `type T struct{}; _ = new(T)`, `func(p.T) *p.T`},
-
-	{"panic", `panic(0)`, `func(interface{})`},
-	{"panic", `panic("foo")`, `func(interface{})`},
-
-	{"print", `print()`, `func()`},
-	{"print", `print(0)`, `func(int)`},
-	{"print", `print(1, 2.0, "foo", true)`, `func(int, float64, string, bool)`},
-
-	{"println", `println()`, `func()`},
-	{"println", `println(0)`, `func(int)`},
-	{"println", `println(1, 2.0, "foo", true)`, `func(int, float64, string, bool)`},
-
-	{"recover", `recover()`, `func() interface{}`},
-	{"recover", `_ = recover()`, `func() interface{}`},
-
-	{"Alignof", `_ = unsafe.Alignof(0)`, `invalid type`},                 // constant
-	{"Alignof", `var x struct{}; _ = unsafe.Alignof(x)`, `invalid type`}, // constant
-
-	{"Offsetof", `var x struct{f bool}; _ = unsafe.Offsetof(x.f)`, `invalid type`},           // constant
-	{"Offsetof", `var x struct{_ int; f bool}; _ = unsafe.Offsetof((&x).f)`, `invalid type`}, // constant
-
-	{"Sizeof", `_ = unsafe.Sizeof(0)`, `invalid type`},                 // constant
-	{"Sizeof", `var x struct{}; _ = unsafe.Sizeof(x)`, `invalid type`}, // constant
-
-	{"assert", `assert(true)`, `invalid type`},                                    // constant
-	{"assert", `type B bool; const pred B = 1 < 2; assert(pred)`, `invalid type`}, // constant
-
-	// no tests for trace since it produces output as a side-effect
-}
-
-func TestBuiltinSignatures(t *testing.T) {
-	DefPredeclaredTestFuncs()
-
-	seen := map[string]bool{"trace": true} // no test for trace built-in; add it manually
-	for _, call := range builtinCalls {
-		testBuiltinSignature(t, call.name, call.src, call.sig)
-		seen[call.name] = true
-	}
-
-	// make sure we didn't miss one
-	for _, name := range Universe.Names() {
-		if _, ok := Universe.Lookup(name).(*Builtin); ok && !seen[name] {
-			t.Errorf("missing test for %s", name)
-		}
-	}
-	for _, name := range Unsafe.Scope().Names() {
-		if _, ok := Unsafe.Scope().Lookup(name).(*Builtin); ok && !seen[name] {
-			t.Errorf("missing test for unsafe.%s", name)
-		}
-	}
-}
-
-func testBuiltinSignature(t *testing.T, name, src0, want string) {
-	src := fmt.Sprintf(`package p; import "unsafe"; type _ unsafe.Pointer /* use unsafe */; func _() { %s }`, src0)
-	f, err := parser.ParseFile(fset, "", src, 0)
-	if err != nil {
-		t.Errorf("%s: %s", src0, err)
-		return
-	}
-
-	var conf Config
-	uses := make(map[*ast.Ident]Object)
-	types := make(map[ast.Expr]TypeAndValue)
-	_, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Uses: uses, Types: types})
-	if err != nil {
-		t.Errorf("%s: %s", src0, err)
-		return
-	}
-
-	// find called function
-	n := 0
-	var fun ast.Expr
-	for x := range types {
-		if call, _ := x.(*ast.CallExpr); call != nil {
-			fun = call.Fun
-			n++
-		}
-	}
-	if n != 1 {
-		t.Errorf("%s: got %d CallExprs; want 1", src0, n)
-		return
-	}
-
-	// check recorded types for fun and descendents (may be parenthesized)
-	for {
-		// the recorded type for the built-in must match the wanted signature
-		typ := types[fun].Type
-		if typ == nil {
-			t.Errorf("%s: no type recorded for %s", src0, ExprString(fun))
-			return
-		}
-		if got := typ.String(); got != want {
-			t.Errorf("%s: got type %s; want %s", src0, got, want)
-			return
-		}
-
-		// called function must be a (possibly parenthesized, qualified)
-		// identifier denoting the expected built-in
-		switch p := fun.(type) {
-		case *ast.Ident:
-			obj := uses[p]
-			if obj == nil {
-				t.Errorf("%s: no object found for %s", src0, p)
-				return
-			}
-			bin, _ := obj.(*Builtin)
-			if bin == nil {
-				t.Errorf("%s: %s does not denote a built-in", src0, p)
-				return
-			}
-			if bin.Name() != name {
-				t.Errorf("%s: got built-in %s; want %s", src0, bin.Name(), name)
-				return
-			}
-			return // we're done
-
-		case *ast.ParenExpr:
-			fun = p.X // unpack
-
-		case *ast.SelectorExpr:
-			// built-in from package unsafe - ignore details
-			return // we're done
-
-		default:
-			t.Errorf("%s: invalid function call", src0)
-			return
-		}
-	}
-}
diff --git a/third_party/gotools/go/types/call.go b/third_party/gotools/go/types/call.go
deleted file mode 100644
index 7f366a8..0000000
--- a/third_party/gotools/go/types/call.go
+++ /dev/null
@@ -1,441 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements typechecking of call and selector expressions.
-
-package types
-
-import (
-	"go/ast"
-	"go/token"
-)
-
-func (check *Checker) call(x *operand, e *ast.CallExpr) exprKind {
-	check.exprOrType(x, e.Fun)
-
-	switch x.mode {
-	case invalid:
-		check.use(e.Args...)
-		x.mode = invalid
-		x.expr = e
-		return statement
-
-	case typexpr:
-		// conversion
-		T := x.typ
-		x.mode = invalid
-		switch n := len(e.Args); n {
-		case 0:
-			check.errorf(e.Rparen, "missing argument in conversion to %s", T)
-		case 1:
-			check.expr(x, e.Args[0])
-			if x.mode != invalid {
-				check.conversion(x, T)
-			}
-		default:
-			check.errorf(e.Args[n-1].Pos(), "too many arguments in conversion to %s", T)
-		}
-		x.expr = e
-		return conversion
-
-	case builtin:
-		id := x.id
-		if !check.builtin(x, e, id) {
-			x.mode = invalid
-		}
-		x.expr = e
-		// a non-constant result implies a function call
-		if x.mode != invalid && x.mode != constant {
-			check.hasCallOrRecv = true
-		}
-		return predeclaredFuncs[id].kind
-
-	default:
-		// function/method call
-		sig, _ := x.typ.Underlying().(*Signature)
-		if sig == nil {
-			check.invalidOp(x.pos(), "cannot call non-function %s", x)
-			x.mode = invalid
-			x.expr = e
-			return statement
-		}
-
-		arg, n, _ := unpack(func(x *operand, i int) { check.expr(x, e.Args[i]) }, len(e.Args), false)
-		if arg == nil {
-			x.mode = invalid
-			x.expr = e
-			return statement
-		}
-
-		check.arguments(x, e, sig, arg, n)
-
-		// determine result
-		switch sig.results.Len() {
-		case 0:
-			x.mode = novalue
-		case 1:
-			x.mode = value
-			x.typ = sig.results.vars[0].typ // unpack tuple
-		default:
-			x.mode = value
-			x.typ = sig.results
-		}
-		x.expr = e
-		check.hasCallOrRecv = true
-
-		return statement
-	}
-}
-
-// use type-checks each argument.
-// Useful to make sure expressions are evaluated
-// (and variables are "used") in the presence of other errors.
-func (check *Checker) use(arg ...ast.Expr) {
-	var x operand
-	for _, e := range arg {
-		check.rawExpr(&x, e, nil)
-	}
-}
-
-// useGetter is like use, but takes a getter instead of a list of expressions.
-// It should be called instead of use if a getter is present to avoid repeated
-// evaluation of the first argument (since the getter was likely obtained via
-// unpack, which may have evaluated the first argument already).
-func (check *Checker) useGetter(get getter, n int) {
-	var x operand
-	for i := 0; i < n; i++ {
-		get(&x, i)
-	}
-}
-
-// A getter sets x as the i'th operand, where 0 <= i < n and n is the total
-// number of operands (context-specific, and maintained elsewhere). A getter
-// type-checks the i'th operand; the details of the actual check are getter-
-// specific.
-type getter func(x *operand, i int)
-
-// unpack takes a getter get and a number of operands n. If n == 1, unpack
-// calls the incoming getter for the first operand. If that operand is
-// invalid, unpack returns (nil, 0, false). Otherwise, if that operand is a
-// function call, or a comma-ok expression and allowCommaOk is set, the result
-// is a new getter and operand count providing access to the function results,
-// or comma-ok values, respectively. The third result value reports if it
-// is indeed the comma-ok case. In all other cases, the incoming getter and
-// operand count are returned unchanged, and the third result value is false.
-//
-// In other words, if there's exactly one operand that - after type-checking
-// by calling get - stands for multiple operands, the resulting getter provides
-// access to those operands instead.
-//
-// If the returned getter is called at most once for a given operand index i
-// (including i == 0), that operand is guaranteed to cause only one call of
-// the incoming getter with that i.
-//
-func unpack(get getter, n int, allowCommaOk bool) (getter, int, bool) {
-	if n == 1 {
-		// possibly result of an n-valued function call or comma,ok value
-		var x0 operand
-		get(&x0, 0)
-		if x0.mode == invalid {
-			return nil, 0, false
-		}
-
-		if t, ok := x0.typ.(*Tuple); ok {
-			// result of an n-valued function call
-			return func(x *operand, i int) {
-				x.mode = value
-				x.expr = x0.expr
-				x.typ = t.At(i).typ
-			}, t.Len(), false
-		}
-
-		if x0.mode == mapindex || x0.mode == commaok {
-			// comma-ok value
-			if allowCommaOk {
-				a := [2]Type{x0.typ, Typ[UntypedBool]}
-				return func(x *operand, i int) {
-					x.mode = value
-					x.expr = x0.expr
-					x.typ = a[i]
-				}, 2, true
-			}
-			x0.mode = value
-		}
-
-		// single value
-		return func(x *operand, i int) {
-			if i != 0 {
-				unreachable()
-			}
-			*x = x0
-		}, 1, false
-	}
-
-	// zero or multiple values
-	return get, n, false
-}
-
-// arguments checks argument passing for the call with the given signature.
-// The arg function provides the operand for the i'th argument.
-func (check *Checker) arguments(x *operand, call *ast.CallExpr, sig *Signature, arg getter, n int) {
-	if call.Ellipsis.IsValid() {
-		// last argument is of the form x...
-		if len(call.Args) == 1 && n > 1 {
-			// f()... is not permitted if f() is multi-valued
-			check.errorf(call.Ellipsis, "cannot use ... with %d-valued expression %s", n, call.Args[0])
-			check.useGetter(arg, n)
-			return
-		}
-		if !sig.variadic {
-			check.errorf(call.Ellipsis, "cannot use ... in call to non-variadic %s", call.Fun)
-			check.useGetter(arg, n)
-			return
-		}
-	}
-
-	// evaluate arguments
-	for i := 0; i < n; i++ {
-		arg(x, i)
-		if x.mode != invalid {
-			var ellipsis token.Pos
-			if i == n-1 && call.Ellipsis.IsValid() {
-				ellipsis = call.Ellipsis
-			}
-			check.argument(sig, i, x, ellipsis)
-		}
-	}
-
-	// check argument count
-	if sig.variadic {
-		// a variadic function accepts an "empty"
-		// last argument: count one extra
-		n++
-	}
-	if n < sig.params.Len() {
-		check.errorf(call.Rparen, "too few arguments in call to %s", call.Fun)
-		// ok to continue
-	}
-}
-
-// argument checks passing of argument x to the i'th parameter of the given signature.
-// If ellipsis is valid, the argument is followed by ... at that position in the call.
-func (check *Checker) argument(sig *Signature, i int, x *operand, ellipsis token.Pos) {
-	n := sig.params.Len()
-
-	// determine parameter type
-	var typ Type
-	switch {
-	case i < n:
-		typ = sig.params.vars[i].typ
-	case sig.variadic:
-		typ = sig.params.vars[n-1].typ
-		if debug {
-			if _, ok := typ.(*Slice); !ok {
-				check.dump("%s: expected unnamed slice type, got %s", sig.params.vars[n-1].Pos(), typ)
-			}
-		}
-	default:
-		check.errorf(x.pos(), "too many arguments")
-		return
-	}
-
-	if ellipsis.IsValid() {
-		// argument is of the form x...
-		if i != n-1 {
-			check.errorf(ellipsis, "can only use ... with matching parameter")
-			return
-		}
-		switch t := x.typ.Underlying().(type) {
-		case *Slice:
-			// ok
-		case *Tuple:
-			check.errorf(ellipsis, "cannot use ... with %d-valued expression %s", t.Len(), x)
-			return
-		default:
-			check.errorf(x.pos(), "cannot use %s as parameter of type %s", x, typ)
-			return
-		}
-	} else if sig.variadic && i >= n-1 {
-		// use the variadic parameter slice's element type
-		typ = typ.(*Slice).elem
-	}
-
-	if !check.assignment(x, typ) && x.mode != invalid {
-		check.errorf(x.pos(), "cannot pass argument %s to parameter of type %s", x, typ)
-	}
-}
-
-func (check *Checker) selector(x *operand, e *ast.SelectorExpr) {
-	// these must be declared before the "goto Error" statements
-	var (
-		obj      Object
-		index    []int
-		indirect bool
-	)
-
-	sel := e.Sel.Name
-	// If the identifier refers to a package, handle everything here
-	// so we don't need a "package" mode for operands: package names
-	// can only appear in qualified identifiers which are mapped to
-	// selector expressions.
-	if ident, ok := e.X.(*ast.Ident); ok {
-		_, obj := check.scope.LookupParent(ident.Name)
-		if pkg, _ := obj.(*PkgName); pkg != nil {
-			assert(pkg.pkg == check.pkg)
-			check.recordUse(ident, pkg)
-			pkg.used = true
-			exp := pkg.imported.scope.Lookup(sel)
-			if exp == nil {
-				if !pkg.imported.fake {
-					check.errorf(e.Pos(), "%s not declared by package %s", sel, ident)
-				}
-				goto Error
-			}
-			if !exp.Exported() {
-				check.errorf(e.Pos(), "%s not exported by package %s", sel, ident)
-				// ok to continue
-			}
-			check.recordUse(e.Sel, exp)
-			// Simplified version of the code for *ast.Idents:
-			// - imported objects are always fully initialized
-			switch exp := exp.(type) {
-			case *Const:
-				assert(exp.Val() != nil)
-				x.mode = constant
-				x.typ = exp.typ
-				x.val = exp.val
-			case *TypeName:
-				x.mode = typexpr
-				x.typ = exp.typ
-			case *Var:
-				x.mode = variable
-				x.typ = exp.typ
-			case *Func:
-				x.mode = value
-				x.typ = exp.typ
-			case *Builtin:
-				x.mode = builtin
-				x.typ = exp.typ
-				x.id = exp.id
-			default:
-				unreachable()
-			}
-			x.expr = e
-			return
-		}
-	}
-
-	check.exprOrType(x, e.X)
-	if x.mode == invalid {
-		goto Error
-	}
-
-	obj, index, indirect = LookupFieldOrMethod(x.typ, x.mode == variable, check.pkg, sel)
-	if obj == nil {
-		switch {
-		case index != nil:
-			// TODO(gri) should provide actual type where the conflict happens
-			check.invalidOp(e.Pos(), "ambiguous selector %s", sel)
-		case indirect:
-			check.invalidOp(e.Pos(), "%s is not in method set of %s", sel, x.typ)
-		default:
-			check.invalidOp(e.Pos(), "%s has no field or method %s", x, sel)
-		}
-		goto Error
-	}
-
-	if x.mode == typexpr {
-		// method expression
-		m, _ := obj.(*Func)
-		if m == nil {
-			check.invalidOp(e.Pos(), "%s has no method %s", x, sel)
-			goto Error
-		}
-
-		check.recordSelection(e, MethodExpr, x.typ, m, index, indirect)
-
-		// the receiver type becomes the type of the first function
-		// argument of the method expression's function type
-		var params []*Var
-		sig := m.typ.(*Signature)
-		if sig.params != nil {
-			params = sig.params.vars
-		}
-		x.mode = value
-		x.typ = &Signature{
-			params:   NewTuple(append([]*Var{NewVar(token.NoPos, check.pkg, "", x.typ)}, params...)...),
-			results:  sig.results,
-			variadic: sig.variadic,
-		}
-
-		check.addDeclDep(m)
-
-	} else {
-		// regular selector
-		switch obj := obj.(type) {
-		case *Var:
-			check.recordSelection(e, FieldVal, x.typ, obj, index, indirect)
-			if x.mode == variable || indirect {
-				x.mode = variable
-			} else {
-				x.mode = value
-			}
-			x.typ = obj.typ
-
-		case *Func:
-			// TODO(gri) If we needed to take into account the receiver's
-			// addressability, should we report the type &(x.typ) instead?
-			check.recordSelection(e, MethodVal, x.typ, obj, index, indirect)
-
-			if debug {
-				// Verify that LookupFieldOrMethod and MethodSet.Lookup agree.
-				typ := x.typ
-				if x.mode == variable {
-					// If typ is not an (unnamed) pointer or an interface,
-					// use *typ instead, because the method set of *typ
-					// includes the methods of typ.
-					// Variables are addressable, so we can always take their
-					// address.
-					if _, ok := typ.(*Pointer); !ok && !IsInterface(typ) {
-						typ = &Pointer{base: typ}
-					}
-				}
-				// If we created a synthetic pointer type above, we will throw
-				// away the method set computed here after use.
-				// TODO(gri) Method set computation should probably always compute
-				// both, the value and the pointer receiver method set and represent
-				// them in a single structure.
-				// TODO(gri) Consider also using a method set cache for the lifetime
-				// of checker once we rely on MethodSet lookup instead of individual
-				// lookup.
-				mset := NewMethodSet(typ)
-				if m := mset.Lookup(check.pkg, sel); m == nil || m.obj != obj {
-					check.dump("%s: (%s).%v -> %s", e.Pos(), typ, obj.name, m)
-					check.dump("%s\n", mset)
-					panic("method sets and lookup don't agree")
-				}
-			}
-
-			x.mode = value
-
-			// remove receiver
-			sig := *obj.typ.(*Signature)
-			sig.recv = nil
-			x.typ = &sig
-
-			check.addDeclDep(obj)
-
-		default:
-			unreachable()
-		}
-	}
-
-	// everything went well
-	x.expr = e
-	return
-
-Error:
-	x.mode = invalid
-	x.expr = e
-}
diff --git a/third_party/gotools/go/types/check.go b/third_party/gotools/go/types/check.go
deleted file mode 100644
index 77c2fb5..0000000
--- a/third_party/gotools/go/types/check.go
+++ /dev/null
@@ -1,363 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements the Check function, which drives type-checking.
-
-package types
-
-import (
-	"go/ast"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-)
-
-// debugging/development support
-const (
-	debug = false // leave on during development
-	trace = false // turn on for detailed type resolution traces
-)
-
-// If Strict is set, the type-checker enforces additional
-// rules not specified by the Go 1 spec, but which will
-// catch guaranteed run-time errors if the respective
-// code is executed. In other words, programs passing in
-// Strict mode are Go 1 compliant, but not all Go 1 programs
-// will pass in Strict mode. The additional rules are:
-//
-// - A type assertion x.(T) where T is an interface type
-//   is invalid if any (statically known) method that exists
-//   for both x and T have different signatures.
-//
-const strict = false
-
-// exprInfo stores information about an untyped expression.
-type exprInfo struct {
-	isLhs bool // expression is lhs operand of a shift with delayed type-check
-	mode  operandMode
-	typ   *Basic
-	val   exact.Value // constant value; or nil (if not a constant)
-}
-
-// funcInfo stores the information required for type-checking a function.
-type funcInfo struct {
-	name string    // for debugging/tracing only
-	decl *declInfo // for cycle detection
-	sig  *Signature
-	body *ast.BlockStmt
-}
-
-// A context represents the context within which an object is type-checked.
-type context struct {
-	decl          *declInfo   // package-level declaration whose init expression/function body is checked
-	scope         *Scope      // top-most scope for lookups
-	iota          exact.Value // value of iota in a constant declaration; nil otherwise
-	sig           *Signature  // function signature if inside a function; nil otherwise
-	hasLabel      bool        // set if a function makes use of labels (only ~1% of functions); unused outside functions
-	hasCallOrRecv bool        // set if an expression contains a function call or channel receive operation
-}
-
-// A Checker maintains the state of the type checker.
-// It must be created with NewChecker.
-type Checker struct {
-	// package information
-	// (initialized by NewChecker, valid for the life-time of checker)
-	conf *Config
-	fset *token.FileSet
-	pkg  *Package
-	*Info
-	objMap map[Object]*declInfo // maps package-level object to declaration info
-
-	// information collected during type-checking of a set of package files
-	// (initialized by Files, valid only for the duration of check.Files;
-	// maps and lists are allocated on demand)
-	files            []*ast.File                       // package files
-	unusedDotImports map[*Scope]map[*Package]token.Pos // positions of unused dot-imported packages for each file scope
-
-	firstErr error                 // first error encountered
-	methods  map[string][]*Func    // maps type names to associated methods
-	untyped  map[ast.Expr]exprInfo // map of expressions without final type
-	funcs    []funcInfo            // list of functions to type-check
-	delayed  []func()              // delayed checks requiring fully setup types
-
-	// context within which the current object is type-checked
-	// (valid only for the duration of type-checking a specific object)
-	context
-
-	// debugging
-	indent int // indentation for tracing
-}
-
-// addUnusedImport adds the position of a dot-imported package
-// pkg to the map of dot imports for the given file scope.
-func (check *Checker) addUnusedDotImport(scope *Scope, pkg *Package, pos token.Pos) {
-	mm := check.unusedDotImports
-	if mm == nil {
-		mm = make(map[*Scope]map[*Package]token.Pos)
-		check.unusedDotImports = mm
-	}
-	m := mm[scope]
-	if m == nil {
-		m = make(map[*Package]token.Pos)
-		mm[scope] = m
-	}
-	m[pkg] = pos
-}
-
-// addDeclDep adds the dependency edge (check.decl -> to) if check.decl exists
-func (check *Checker) addDeclDep(to Object) {
-	from := check.decl
-	if from == nil {
-		return // not in a package-level init expression
-	}
-	if _, found := check.objMap[to]; !found {
-		return // to is not a package-level object
-	}
-	from.addDep(to)
-}
-
-func (check *Checker) assocMethod(tname string, meth *Func) {
-	m := check.methods
-	if m == nil {
-		m = make(map[string][]*Func)
-		check.methods = m
-	}
-	m[tname] = append(m[tname], meth)
-}
-
-func (check *Checker) rememberUntyped(e ast.Expr, lhs bool, mode operandMode, typ *Basic, val exact.Value) {
-	m := check.untyped
-	if m == nil {
-		m = make(map[ast.Expr]exprInfo)
-		check.untyped = m
-	}
-	m[e] = exprInfo{lhs, mode, typ, val}
-}
-
-func (check *Checker) later(name string, decl *declInfo, sig *Signature, body *ast.BlockStmt) {
-	check.funcs = append(check.funcs, funcInfo{name, decl, sig, body})
-}
-
-func (check *Checker) delay(f func()) {
-	check.delayed = append(check.delayed, f)
-}
-
-// NewChecker returns a new Checker instance for a given package.
-// Package files may be added incrementally via checker.Files.
-func NewChecker(conf *Config, fset *token.FileSet, pkg *Package, info *Info) *Checker {
-	// make sure we have a configuration
-	if conf == nil {
-		conf = new(Config)
-	}
-
-	// make sure we have a package canonicalization map
-	if conf.Packages == nil {
-		conf.Packages = make(map[string]*Package)
-	}
-
-	// make sure we have an info struct
-	if info == nil {
-		info = new(Info)
-	}
-
-	return &Checker{
-		conf:   conf,
-		fset:   fset,
-		pkg:    pkg,
-		Info:   info,
-		objMap: make(map[Object]*declInfo),
-	}
-}
-
-// initFiles initializes the files-specific portion of checker.
-// The provided files must all belong to the same package.
-func (check *Checker) initFiles(files []*ast.File) {
-	// start with a clean slate (check.Files may be called multiple times)
-	check.files = nil
-	check.unusedDotImports = nil
-
-	check.firstErr = nil
-	check.methods = nil
-	check.untyped = nil
-	check.funcs = nil
-	check.delayed = nil
-
-	// determine package name and collect valid files
-	pkg := check.pkg
-	for _, file := range files {
-		switch name := file.Name.Name; pkg.name {
-		case "":
-			if name != "_" {
-				pkg.name = name
-			} else {
-				check.errorf(file.Name.Pos(), "invalid package name _")
-			}
-			fallthrough
-
-		case name:
-			check.files = append(check.files, file)
-
-		default:
-			check.errorf(file.Package, "package %s; expected %s", name, pkg.name)
-			// ignore this file
-		}
-	}
-}
-
-// A bailout panic is used for early termination.
-type bailout struct{}
-
-func (check *Checker) handleBailout(err *error) {
-	switch p := recover().(type) {
-	case nil, bailout:
-		// normal return or early exit
-		*err = check.firstErr
-	default:
-		// re-panic
-		panic(p)
-	}
-}
-
-// Files checks the provided files as part of the checker's package.
-func (check *Checker) Files(files []*ast.File) (err error) {
-	defer check.handleBailout(&err)
-
-	check.initFiles(files)
-
-	check.collectObjects()
-
-	check.packageObjects(check.resolveOrder())
-
-	check.functionBodies()
-
-	check.initOrder()
-
-	if !check.conf.DisableUnusedImportCheck {
-		check.unusedImports()
-	}
-
-	// perform delayed checks
-	for _, f := range check.delayed {
-		f()
-	}
-
-	check.recordUntyped()
-
-	check.pkg.complete = true
-	return
-}
-
-func (check *Checker) recordUntyped() {
-	if !debug && check.Types == nil {
-		return // nothing to do
-	}
-
-	for x, info := range check.untyped {
-		if debug && isTyped(info.typ) {
-			check.dump("%s: %s (type %s) is typed", x.Pos(), x, info.typ)
-			unreachable()
-		}
-		check.recordTypeAndValue(x, info.mode, info.typ, info.val)
-	}
-}
-
-func (check *Checker) recordTypeAndValue(x ast.Expr, mode operandMode, typ Type, val exact.Value) {
-	assert(x != nil)
-	assert(typ != nil)
-	if mode == invalid {
-		return // omit
-	}
-	assert(typ != nil)
-	if mode == constant {
-		assert(val != nil)
-		assert(typ == Typ[Invalid] || isConstType(typ))
-	}
-	if m := check.Types; m != nil {
-		m[x] = TypeAndValue{mode, typ, val}
-	}
-}
-
-func (check *Checker) recordBuiltinType(f ast.Expr, sig *Signature) {
-	// f must be a (possibly parenthesized) identifier denoting a built-in
-	// (built-ins in package unsafe always produce a constant result and
-	// we don't record their signatures, so we don't see qualified idents
-	// here): record the signature for f and possible children.
-	for {
-		check.recordTypeAndValue(f, builtin, sig, nil)
-		switch p := f.(type) {
-		case *ast.Ident:
-			return // we're done
-		case *ast.ParenExpr:
-			f = p.X
-		default:
-			unreachable()
-		}
-	}
-}
-
-func (check *Checker) recordCommaOkTypes(x ast.Expr, a [2]Type) {
-	assert(x != nil)
-	if a[0] == nil || a[1] == nil {
-		return
-	}
-	assert(isTyped(a[0]) && isTyped(a[1]) && isBoolean(a[1]))
-	if m := check.Types; m != nil {
-		for {
-			tv := m[x]
-			assert(tv.Type != nil) // should have been recorded already
-			pos := x.Pos()
-			tv.Type = NewTuple(
-				NewVar(pos, check.pkg, "", a[0]),
-				NewVar(pos, check.pkg, "", a[1]),
-			)
-			m[x] = tv
-			// if x is a parenthesized expression (p.X), update p.X
-			p, _ := x.(*ast.ParenExpr)
-			if p == nil {
-				break
-			}
-			x = p.X
-		}
-	}
-}
-
-func (check *Checker) recordDef(id *ast.Ident, obj Object) {
-	assert(id != nil)
-	if m := check.Defs; m != nil {
-		m[id] = obj
-	}
-}
-
-func (check *Checker) recordUse(id *ast.Ident, obj Object) {
-	assert(id != nil)
-	assert(obj != nil)
-	if m := check.Uses; m != nil {
-		m[id] = obj
-	}
-}
-
-func (check *Checker) recordImplicit(node ast.Node, obj Object) {
-	assert(node != nil)
-	assert(obj != nil)
-	if m := check.Implicits; m != nil {
-		m[node] = obj
-	}
-}
-
-func (check *Checker) recordSelection(x *ast.SelectorExpr, kind SelectionKind, recv Type, obj Object, index []int, indirect bool) {
-	assert(obj != nil && (recv == nil || len(index) > 0))
-	check.recordUse(x.Sel, obj)
-	// TODO(gri) Should we also call recordTypeAndValue?
-	if m := check.Selections; m != nil {
-		m[x] = &Selection{kind, recv, obj, index, indirect}
-	}
-}
-
-func (check *Checker) recordScope(node ast.Node, scope *Scope) {
-	assert(node != nil)
-	assert(scope != nil)
-	if m := check.Scopes; m != nil {
-		m[node] = scope
-	}
-}
diff --git a/third_party/gotools/go/types/check_test.go b/third_party/gotools/go/types/check_test.go
deleted file mode 100644
index 0473eb0..0000000
--- a/third_party/gotools/go/types/check_test.go
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements a typechecker test harness. The packages specified
-// in tests are typechecked. Error messages reported by the typechecker are
-// compared against the error messages expected in the test files.
-//
-// Expected errors are indicated in the test files by putting a comment
-// of the form /* ERROR "rx" */ immediately following an offending token.
-// The harness will verify that an error matching the regular expression
-// rx is reported at that source position. Consecutive comments may be
-// used to indicate multiple errors for the same token position.
-//
-// For instance, the following test file indicates that a "not declared"
-// error should be reported for the undeclared variable x:
-//
-//	package p
-//	func f() {
-//		_ = x /* ERROR "not declared" */ + 1
-//	}
-
-// TODO(gri) Also collect strict mode errors of the form /* STRICT ... */
-//           and test against strict mode.
-
-package types_test
-
-import (
-	"flag"
-	"go/ast"
-	"go/parser"
-	"go/scanner"
-	"go/token"
-	"io/ioutil"
-	"regexp"
-	"strings"
-	"testing"
-
-	_ "llvm.org/llgo/third_party/gotools/go/gcimporter"
-	. "llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var (
-	listErrors = flag.Bool("list", false, "list errors")
-	testFiles  = flag.String("files", "", "space-separated list of test files")
-)
-
-// The test filenames do not end in .go so that they are invisible
-// to gofmt since they contain comments that must not change their
-// positions relative to surrounding tokens.
-
-// Each tests entry is list of files belonging to the same package.
-var tests = [][]string{
-	{"testdata/errors.src"},
-	{"testdata/importdecl0a.src", "testdata/importdecl0b.src"},
-	{"testdata/importdecl1a.src", "testdata/importdecl1b.src"},
-	{"testdata/cycles.src"},
-	{"testdata/cycles1.src"},
-	{"testdata/cycles2.src"},
-	{"testdata/cycles3.src"},
-	{"testdata/cycles4.src"},
-	{"testdata/init0.src"},
-	{"testdata/init1.src"},
-	{"testdata/init2.src"},
-	{"testdata/decls0.src"},
-	{"testdata/decls1.src"},
-	{"testdata/decls2a.src", "testdata/decls2b.src"},
-	{"testdata/decls3.src"},
-	{"testdata/const0.src"},
-	{"testdata/const1.src"},
-	{"testdata/constdecl.src"},
-	{"testdata/vardecl.src"},
-	{"testdata/expr0.src"},
-	{"testdata/expr1.src"},
-	{"testdata/expr2.src"},
-	{"testdata/expr3.src"},
-	{"testdata/methodsets.src"},
-	{"testdata/shifts.src"},
-	{"testdata/builtins.src"},
-	{"testdata/conversions.src"},
-	{"testdata/stmt0.src"},
-	{"testdata/stmt1.src"},
-	{"testdata/gotos.src"},
-	{"testdata/labels.src"},
-	{"testdata/issues.src"},
-	{"testdata/blank.src"},
-}
-
-var fset = token.NewFileSet()
-
-// Positioned errors are of the form filename:line:column: message .
-var posMsgRx = regexp.MustCompile(`^(.*:[0-9]+:[0-9]+): *(.*)`)
-
-// splitError splits an error's error message into a position string
-// and the actual error message. If there's no position information,
-// pos is the empty string, and msg is the entire error message.
-//
-func splitError(err error) (pos, msg string) {
-	msg = err.Error()
-	if m := posMsgRx.FindStringSubmatch(msg); len(m) == 3 {
-		pos = m[1]
-		msg = m[2]
-	}
-	return
-}
-
-func parseFiles(t *testing.T, filenames []string) ([]*ast.File, []error) {
-	var files []*ast.File
-	var errlist []error
-	for _, filename := range filenames {
-		file, err := parser.ParseFile(fset, filename, nil, parser.AllErrors)
-		if file == nil {
-			t.Fatalf("%s: %s", filename, err)
-		}
-		files = append(files, file)
-		if err != nil {
-			if list, _ := err.(scanner.ErrorList); len(list) > 0 {
-				for _, err := range list {
-					errlist = append(errlist, err)
-				}
-			} else {
-				errlist = append(errlist, err)
-			}
-		}
-	}
-	return files, errlist
-}
-
-// ERROR comments must start with text `ERROR "rx"` or `ERROR rx` where
-// rx is a regular expression that matches the expected error message.
-// Space around "rx" or rx is ignored. Use the form `ERROR HERE "rx"`
-// for error messages that are located immediately after rather than
-// at a token's position.
-//
-var errRx = regexp.MustCompile(`^ *ERROR *(HERE)? *"?([^"]*)"?`)
-
-// errMap collects the regular expressions of ERROR comments found
-// in files and returns them as a map of error positions to error messages.
-//
-func errMap(t *testing.T, testname string, files []*ast.File) map[string][]string {
-	// map of position strings to lists of error message patterns
-	errmap := make(map[string][]string)
-
-	for _, file := range files {
-		filename := fset.Position(file.Package).Filename
-		src, err := ioutil.ReadFile(filename)
-		if err != nil {
-			t.Fatalf("%s: could not read %s", testname, filename)
-		}
-
-		var s scanner.Scanner
-		s.Init(fset.AddFile(filename, -1, len(src)), src, nil, scanner.ScanComments)
-		var prev token.Pos // position of last non-comment, non-semicolon token
-		var here token.Pos // position immediately after the token at position prev
-
-	scanFile:
-		for {
-			pos, tok, lit := s.Scan()
-			switch tok {
-			case token.EOF:
-				break scanFile
-			case token.COMMENT:
-				if lit[1] == '*' {
-					lit = lit[:len(lit)-2] // strip trailing */
-				}
-				if s := errRx.FindStringSubmatch(lit[2:]); len(s) == 3 {
-					pos := prev
-					if s[1] == "HERE" {
-						pos = here
-					}
-					p := fset.Position(pos).String()
-					errmap[p] = append(errmap[p], strings.TrimSpace(s[2]))
-				}
-			case token.SEMICOLON:
-				// ignore automatically inserted semicolon
-				if lit == "\n" {
-					continue scanFile
-				}
-				fallthrough
-			default:
-				prev = pos
-				var l int // token length
-				if tok.IsLiteral() {
-					l = len(lit)
-				} else {
-					l = len(tok.String())
-				}
-				here = prev + token.Pos(l)
-			}
-		}
-	}
-
-	return errmap
-}
-
-func eliminate(t *testing.T, errmap map[string][]string, errlist []error) {
-	for _, err := range errlist {
-		pos, gotMsg := splitError(err)
-		list := errmap[pos]
-		index := -1 // list index of matching message, if any
-		// we expect one of the messages in list to match the error at pos
-		for i, wantRx := range list {
-			rx, err := regexp.Compile(wantRx)
-			if err != nil {
-				t.Errorf("%s: %v", pos, err)
-				continue
-			}
-			if rx.MatchString(gotMsg) {
-				index = i
-				break
-			}
-		}
-		if index >= 0 {
-			// eliminate from list
-			if n := len(list) - 1; n > 0 {
-				// not the last entry - swap in last element and shorten list by 1
-				list[index] = list[n]
-				errmap[pos] = list[:n]
-			} else {
-				// last entry - remove list from map
-				delete(errmap, pos)
-			}
-		} else {
-			t.Errorf("%s: no error expected: %q", pos, gotMsg)
-		}
-	}
-}
-
-func checkFiles(t *testing.T, testfiles []string) {
-	// parse files and collect parser errors
-	files, errlist := parseFiles(t, testfiles)
-
-	pkgName := "<no package>"
-	if len(files) > 0 {
-		pkgName = files[0].Name.Name
-	}
-
-	if *listErrors && len(errlist) > 0 {
-		t.Errorf("--- %s:", pkgName)
-		for _, err := range errlist {
-			t.Error(err)
-		}
-	}
-
-	// typecheck and collect typechecker errors
-	var conf Config
-	conf.Error = func(err error) {
-		if *listErrors {
-			t.Error(err)
-			return
-		}
-		// Ignore secondary error messages starting with "\t";
-		// they are clarifying messages for a primary error.
-		if !strings.Contains(err.Error(), ": \t") {
-			errlist = append(errlist, err)
-		}
-	}
-	conf.Check(pkgName, fset, files, nil)
-
-	if *listErrors {
-		return
-	}
-
-	// match and eliminate errors;
-	// we are expecting the following errors
-	errmap := errMap(t, pkgName, files)
-	eliminate(t, errmap, errlist)
-
-	// there should be no expected errors left
-	if len(errmap) > 0 {
-		t.Errorf("--- %s: %d source positions with expected (but not reported) errors:", pkgName, len(errmap))
-		for pos, list := range errmap {
-			for _, rx := range list {
-				t.Errorf("%s: %q", pos, rx)
-			}
-		}
-	}
-}
-
-func TestCheck(t *testing.T) {
-	// Declare builtins for testing.
-	DefPredeclaredTestFuncs()
-
-	// If explicit test files are specified, only check those.
-	if files := *testFiles; files != "" {
-		checkFiles(t, strings.Split(files, " "))
-		return
-	}
-
-	// Otherwise, run all the tests.
-	for _, files := range tests {
-		checkFiles(t, files)
-	}
-}
diff --git a/third_party/gotools/go/types/conversions.go b/third_party/gotools/go/types/conversions.go
deleted file mode 100644
index 74cd795..0000000
--- a/third_party/gotools/go/types/conversions.go
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements typechecking of conversions.
-
-package types
-
-import "llvm.org/llgo/third_party/gotools/go/exact"
-
-// Conversion type-checks the conversion T(x).
-// The result is in x.
-func (check *Checker) conversion(x *operand, T Type) {
-	constArg := x.mode == constant
-
-	var ok bool
-	switch {
-	case constArg && isConstType(T):
-		// constant conversion
-		switch t := T.Underlying().(*Basic); {
-		case representableConst(x.val, check.conf, t.kind, &x.val):
-			ok = true
-		case x.isInteger() && isString(t):
-			codepoint := int64(-1)
-			if i, ok := exact.Int64Val(x.val); ok {
-				codepoint = i
-			}
-			// If codepoint < 0 the absolute value is too large (or unknown) for
-			// conversion. This is the same as converting any other out-of-range
-			// value - let string(codepoint) do the work.
-			x.val = exact.MakeString(string(codepoint))
-			ok = true
-		}
-	case x.convertibleTo(check.conf, T):
-		// non-constant conversion
-		x.mode = value
-		ok = true
-	}
-
-	if !ok {
-		check.errorf(x.pos(), "cannot convert %s to %s", x, T)
-		x.mode = invalid
-		return
-	}
-
-	// The conversion argument types are final. For untyped values the
-	// conversion provides the type, per the spec: "A constant may be
-	// given a type explicitly by a constant declaration or conversion,...".
-	final := x.typ
-	if isUntyped(x.typ) {
-		final = T
-		// - For conversions to interfaces, use the argument's default type.
-		// - For conversions of untyped constants to non-constant types, also
-		//   use the default type (e.g., []byte("foo") should report string
-		//   not []byte as type for the constant "foo").
-		// - Keep untyped nil for untyped nil arguments.
-		if IsInterface(T) || constArg && !isConstType(T) {
-			final = defaultType(x.typ)
-		}
-		check.updateExprType(x.expr, final, true)
-	}
-
-	x.typ = T
-}
-
-func (x *operand) convertibleTo(conf *Config, T Type) bool {
-	// "x is assignable to T"
-	if x.assignableTo(conf, T) {
-		return true
-	}
-
-	// "x's type and T have identical underlying types"
-	V := x.typ
-	Vu := V.Underlying()
-	Tu := T.Underlying()
-	if Identical(Vu, Tu) {
-		return true
-	}
-
-	// "x's type and T are unnamed pointer types and their pointer base types have identical underlying types"
-	if V, ok := V.(*Pointer); ok {
-		if T, ok := T.(*Pointer); ok {
-			if Identical(V.base.Underlying(), T.base.Underlying()) {
-				return true
-			}
-		}
-	}
-
-	// "x's type and T are both integer or floating point types"
-	if (isInteger(V) || isFloat(V)) && (isInteger(T) || isFloat(T)) {
-		return true
-	}
-
-	// "x's type and T are both complex types"
-	if isComplex(V) && isComplex(T) {
-		return true
-	}
-
-	// "x is an integer or a slice of bytes or runes and T is a string type"
-	if (isInteger(V) || isBytesOrRunes(Vu)) && isString(T) {
-		return true
-	}
-
-	// "x is a string and T is a slice of bytes or runes"
-	if isString(V) && isBytesOrRunes(Tu) {
-		return true
-	}
-
-	// package unsafe:
-	// "any pointer or value of underlying type uintptr can be converted into a unsafe.Pointer"
-	if (isPointer(Vu) || isUintptr(Vu)) && isUnsafePointer(T) {
-		return true
-	}
-	// "and vice versa"
-	if isUnsafePointer(V) && (isPointer(Tu) || isUintptr(Tu)) {
-		return true
-	}
-
-	return false
-}
-
-func isUintptr(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.kind == Uintptr
-}
-
-func isUnsafePointer(typ Type) bool {
-	// TODO(gri): Is this (typ.Underlying() instead of just typ) correct?
-	//            The spec does not say so, but gc claims it is. See also
-	//            issue 6326.
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.kind == UnsafePointer
-}
-
-func isPointer(typ Type) bool {
-	_, ok := typ.Underlying().(*Pointer)
-	return ok
-}
-
-func isBytesOrRunes(typ Type) bool {
-	if s, ok := typ.(*Slice); ok {
-		t, ok := s.elem.Underlying().(*Basic)
-		return ok && (t.kind == Byte || t.kind == Rune)
-	}
-	return false
-}
diff --git a/third_party/gotools/go/types/decl.go b/third_party/gotools/go/types/decl.go
deleted file mode 100644
index 17e651a..0000000
--- a/third_party/gotools/go/types/decl.go
+++ /dev/null
@@ -1,419 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import (
-	"go/ast"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-)
-
-func (check *Checker) reportAltDecl(obj Object) {
-	if pos := obj.Pos(); pos.IsValid() {
-		// We use "other" rather than "previous" here because
-		// the first declaration seen may not be textually
-		// earlier in the source.
-		check.errorf(pos, "\tother declaration of %s", obj.Name()) // secondary error, \t indented
-	}
-}
-
-func (check *Checker) declare(scope *Scope, id *ast.Ident, obj Object) {
-	// spec: "The blank identifier, represented by the underscore
-	// character _, may be used in a declaration like any other
-	// identifier but the declaration does not introduce a new
-	// binding."
-	if obj.Name() != "_" {
-		if alt := scope.Insert(obj); alt != nil {
-			check.errorf(obj.Pos(), "%s redeclared in this block", obj.Name())
-			check.reportAltDecl(alt)
-			return
-		}
-	}
-	if id != nil {
-		check.recordDef(id, obj)
-	}
-}
-
-// objDecl type-checks the declaration of obj in its respective (file) context.
-// See check.typ for the details on def and path.
-func (check *Checker) objDecl(obj Object, def *Named, path []*TypeName) {
-	if obj.Type() != nil {
-		return // already checked - nothing to do
-	}
-
-	if trace {
-		check.trace(obj.Pos(), "-- declaring %s", obj.Name())
-		check.indent++
-		defer func() {
-			check.indent--
-			check.trace(obj.Pos(), "=> %s", obj)
-		}()
-	}
-
-	d := check.objMap[obj]
-	if d == nil {
-		check.dump("%s: %s should have been declared", obj.Pos(), obj.Name())
-		unreachable()
-	}
-
-	// save/restore current context and setup object context
-	defer func(ctxt context) {
-		check.context = ctxt
-	}(check.context)
-	check.context = context{
-		scope: d.file,
-	}
-
-	// Const and var declarations must not have initialization
-	// cycles. We track them by remembering the current declaration
-	// in check.decl. Initialization expressions depending on other
-	// consts, vars, or functions, add dependencies to the current
-	// check.decl.
-	switch obj := obj.(type) {
-	case *Const:
-		check.decl = d // new package-level const decl
-		check.constDecl(obj, d.typ, d.init)
-	case *Var:
-		check.decl = d // new package-level var decl
-		check.varDecl(obj, d.lhs, d.typ, d.init)
-	case *TypeName:
-		// invalid recursive types are detected via path
-		check.typeDecl(obj, d.typ, def, path)
-	case *Func:
-		// functions may be recursive - no need to track dependencies
-		check.funcDecl(obj, d)
-	default:
-		unreachable()
-	}
-}
-
-func (check *Checker) constDecl(obj *Const, typ, init ast.Expr) {
-	assert(obj.typ == nil)
-
-	if obj.visited {
-		obj.typ = Typ[Invalid]
-		return
-	}
-	obj.visited = true
-
-	// use the correct value of iota
-	assert(check.iota == nil)
-	check.iota = obj.val
-	defer func() { check.iota = nil }()
-
-	// provide valid constant value under all circumstances
-	obj.val = exact.MakeUnknown()
-
-	// determine type, if any
-	if typ != nil {
-		t := check.typ(typ)
-		if !isConstType(t) {
-			check.errorf(typ.Pos(), "invalid constant type %s", t)
-			obj.typ = Typ[Invalid]
-			return
-		}
-		obj.typ = t
-	}
-
-	// check initialization
-	var x operand
-	if init != nil {
-		check.expr(&x, init)
-	}
-	check.initConst(obj, &x)
-}
-
-func (check *Checker) varDecl(obj *Var, lhs []*Var, typ, init ast.Expr) {
-	assert(obj.typ == nil)
-
-	if obj.visited {
-		obj.typ = Typ[Invalid]
-		return
-	}
-	obj.visited = true
-
-	// var declarations cannot use iota
-	assert(check.iota == nil)
-
-	// determine type, if any
-	if typ != nil {
-		obj.typ = check.typ(typ)
-	}
-
-	// check initialization
-	if init == nil {
-		if typ == nil {
-			// error reported before by arityMatch
-			obj.typ = Typ[Invalid]
-		}
-		return
-	}
-
-	if lhs == nil || len(lhs) == 1 {
-		assert(lhs == nil || lhs[0] == obj)
-		var x operand
-		check.expr(&x, init)
-		check.initVar(obj, &x, false)
-		return
-	}
-
-	if debug {
-		// obj must be one of lhs
-		found := false
-		for _, lhs := range lhs {
-			if obj == lhs {
-				found = true
-				break
-			}
-		}
-		if !found {
-			panic("inconsistent lhs")
-		}
-	}
-	check.initVars(lhs, []ast.Expr{init}, token.NoPos)
-}
-
-// underlying returns the underlying type of typ; possibly by following
-// forward chains of named types. Such chains only exist while named types
-// are incomplete.
-func underlying(typ Type) Type {
-	for {
-		n, _ := typ.(*Named)
-		if n == nil {
-			break
-		}
-		typ = n.underlying
-	}
-	return typ
-}
-
-func (n *Named) setUnderlying(typ Type) {
-	if n != nil {
-		n.underlying = typ
-	}
-}
-
-func (check *Checker) typeDecl(obj *TypeName, typ ast.Expr, def *Named, path []*TypeName) {
-	assert(obj.typ == nil)
-
-	// type declarations cannot use iota
-	assert(check.iota == nil)
-
-	named := &Named{obj: obj}
-	def.setUnderlying(named)
-	obj.typ = named // make sure recursive type declarations terminate
-
-	// determine underlying type of named
-	check.typExpr(typ, named, append(path, obj))
-
-	// The underlying type of named may be itself a named type that is
-	// incomplete:
-	//
-	//	type (
-	//		A B
-	//		B *C
-	//		C A
-	//	)
-	//
-	// The type of C is the (named) type of A which is incomplete,
-	// and which has as its underlying type the named type B.
-	// Determine the (final, unnamed) underlying type by resolving
-	// any forward chain (they always end in an unnamed type).
-	named.underlying = underlying(named.underlying)
-
-	// check and add associated methods
-	// TODO(gri) It's easy to create pathological cases where the
-	// current approach is incorrect: In general we need to know
-	// and add all methods _before_ type-checking the type.
-	// See http://play.golang.org/p/WMpE0q2wK8
-	check.addMethodDecls(obj)
-}
-
-func (check *Checker) addMethodDecls(obj *TypeName) {
-	// get associated methods
-	methods := check.methods[obj.name]
-	if len(methods) == 0 {
-		return // no methods
-	}
-	delete(check.methods, obj.name)
-
-	// use an objset to check for name conflicts
-	var mset objset
-
-	// spec: "If the base type is a struct type, the non-blank method
-	// and field names must be distinct."
-	base := obj.typ.(*Named)
-	if t, _ := base.underlying.(*Struct); t != nil {
-		for _, fld := range t.fields {
-			if fld.name != "_" {
-				assert(mset.insert(fld) == nil)
-			}
-		}
-	}
-
-	// Checker.Files may be called multiple times; additional package files
-	// may add methods to already type-checked types. Add pre-existing methods
-	// so that we can detect redeclarations.
-	for _, m := range base.methods {
-		assert(m.name != "_")
-		assert(mset.insert(m) == nil)
-	}
-
-	// type-check methods
-	for _, m := range methods {
-		// spec: "For a base type, the non-blank names of methods bound
-		// to it must be unique."
-		if m.name != "_" {
-			if alt := mset.insert(m); alt != nil {
-				switch alt.(type) {
-				case *Var:
-					check.errorf(m.pos, "field and method with the same name %s", m.name)
-				case *Func:
-					check.errorf(m.pos, "method %s already declared for %s", m.name, base)
-				default:
-					unreachable()
-				}
-				check.reportAltDecl(alt)
-				continue
-			}
-		}
-		check.objDecl(m, nil, nil)
-		// methods with blank _ names cannot be found - don't keep them
-		if m.name != "_" {
-			base.methods = append(base.methods, m)
-		}
-	}
-}
-
-func (check *Checker) funcDecl(obj *Func, decl *declInfo) {
-	assert(obj.typ == nil)
-
-	// func declarations cannot use iota
-	assert(check.iota == nil)
-
-	sig := new(Signature)
-	obj.typ = sig // guard against cycles
-	fdecl := decl.fdecl
-	check.funcType(sig, fdecl.Recv, fdecl.Type)
-	if sig.recv == nil && obj.name == "init" && (sig.params.Len() > 0 || sig.results.Len() > 0) {
-		check.errorf(fdecl.Pos(), "func init must have no arguments and no return values")
-		// ok to continue
-	}
-
-	// function body must be type-checked after global declarations
-	// (functions implemented elsewhere have no body)
-	if !check.conf.IgnoreFuncBodies && fdecl.Body != nil {
-		check.later(obj.name, decl, sig, fdecl.Body)
-	}
-}
-
-func (check *Checker) declStmt(decl ast.Decl) {
-	pkg := check.pkg
-
-	switch d := decl.(type) {
-	case *ast.BadDecl:
-		// ignore
-
-	case *ast.GenDecl:
-		var last *ast.ValueSpec // last ValueSpec with type or init exprs seen
-		for iota, spec := range d.Specs {
-			switch s := spec.(type) {
-			case *ast.ValueSpec:
-				switch d.Tok {
-				case token.CONST:
-					// determine which init exprs to use
-					switch {
-					case s.Type != nil || len(s.Values) > 0:
-						last = s
-					case last == nil:
-						last = new(ast.ValueSpec) // make sure last exists
-					}
-
-					// declare all constants
-					lhs := make([]*Const, len(s.Names))
-					for i, name := range s.Names {
-						obj := NewConst(name.Pos(), pkg, name.Name, nil, exact.MakeInt64(int64(iota)))
-						lhs[i] = obj
-
-						var init ast.Expr
-						if i < len(last.Values) {
-							init = last.Values[i]
-						}
-
-						check.constDecl(obj, last.Type, init)
-					}
-
-					check.arityMatch(s, last)
-
-					for i, name := range s.Names {
-						check.declare(check.scope, name, lhs[i])
-					}
-
-				case token.VAR:
-					lhs0 := make([]*Var, len(s.Names))
-					for i, name := range s.Names {
-						lhs0[i] = NewVar(name.Pos(), pkg, name.Name, nil)
-					}
-
-					// initialize all variables
-					for i, obj := range lhs0 {
-						var lhs []*Var
-						var init ast.Expr
-						switch len(s.Values) {
-						case len(s.Names):
-							// lhs and rhs match
-							init = s.Values[i]
-						case 1:
-							// rhs is expected to be a multi-valued expression
-							lhs = lhs0
-							init = s.Values[0]
-						default:
-							if i < len(s.Values) {
-								init = s.Values[i]
-							}
-						}
-						check.varDecl(obj, lhs, s.Type, init)
-						if len(s.Values) == 1 {
-							// If we have a single lhs variable we are done either way.
-							// If we have a single rhs expression, it must be a multi-
-							// valued expression, in which case handling the first lhs
-							// variable will cause all lhs variables to have a type
-							// assigned, and we are done as well.
-							if debug {
-								for _, obj := range lhs0 {
-									assert(obj.typ != nil)
-								}
-							}
-							break
-						}
-					}
-
-					check.arityMatch(s, nil)
-
-					// declare all variables
-					// (only at this point are the variable scopes (parents) set)
-					for i, name := range s.Names {
-						check.declare(check.scope, name, lhs0[i])
-					}
-
-				default:
-					check.invalidAST(s.Pos(), "invalid token %s", d.Tok)
-				}
-
-			case *ast.TypeSpec:
-				obj := NewTypeName(s.Name.Pos(), pkg, s.Name.Name, nil)
-				check.declare(check.scope, s.Name, obj)
-				check.typeDecl(obj, s.Type, nil, nil)
-
-			default:
-				check.invalidAST(s.Pos(), "const, type, or var declaration expected")
-			}
-		}
-
-	default:
-		check.invalidAST(d.Pos(), "unknown ast.Decl node %T", d)
-	}
-}
diff --git a/third_party/gotools/go/types/errors.go b/third_party/gotools/go/types/errors.go
deleted file mode 100644
index 0a9dd0e..0000000
--- a/third_party/gotools/go/types/errors.go
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements various error reporters.
-
-package types
-
-import (
-	"fmt"
-	"go/ast"
-	"go/token"
-	"strings"
-)
-
-func assert(p bool) {
-	if !p {
-		panic("assertion failed")
-	}
-}
-
-func unreachable() {
-	panic("unreachable")
-}
-
-func (check *Checker) sprintf(format string, args ...interface{}) string {
-	for i, arg := range args {
-		switch a := arg.(type) {
-		case nil:
-			arg = "<nil>"
-		case operand:
-			panic("internal error: should always pass *operand")
-		case *operand:
-			arg = operandString(check.pkg, a)
-		case token.Pos:
-			arg = check.fset.Position(a).String()
-		case ast.Expr:
-			arg = ExprString(a)
-		case Object:
-			arg = ObjectString(check.pkg, a)
-		case Type:
-			arg = TypeString(check.pkg, a)
-		}
-		args[i] = arg
-	}
-	return fmt.Sprintf(format, args...)
-}
-
-func (check *Checker) trace(pos token.Pos, format string, args ...interface{}) {
-	fmt.Printf("%s:\t%s%s\n",
-		check.fset.Position(pos),
-		strings.Repeat(".  ", check.indent),
-		check.sprintf(format, args...),
-	)
-}
-
-// dump is only needed for debugging
-func (check *Checker) dump(format string, args ...interface{}) {
-	fmt.Println(check.sprintf(format, args...))
-}
-
-func (check *Checker) err(pos token.Pos, msg string, soft bool) {
-	err := Error{check.fset, pos, msg, soft}
-	if check.firstErr == nil {
-		check.firstErr = err
-	}
-	f := check.conf.Error
-	if f == nil {
-		panic(bailout{}) // report only first error
-	}
-	f(err)
-}
-
-func (check *Checker) error(pos token.Pos, msg string) {
-	check.err(pos, msg, false)
-}
-
-func (check *Checker) errorf(pos token.Pos, format string, args ...interface{}) {
-	check.err(pos, check.sprintf(format, args...), false)
-}
-
-func (check *Checker) softErrorf(pos token.Pos, format string, args ...interface{}) {
-	check.err(pos, check.sprintf(format, args...), true)
-}
-
-func (check *Checker) invalidAST(pos token.Pos, format string, args ...interface{}) {
-	check.errorf(pos, "invalid AST: "+format, args...)
-}
-
-func (check *Checker) invalidArg(pos token.Pos, format string, args ...interface{}) {
-	check.errorf(pos, "invalid argument: "+format, args...)
-}
-
-func (check *Checker) invalidOp(pos token.Pos, format string, args ...interface{}) {
-	check.errorf(pos, "invalid operation: "+format, args...)
-}
diff --git a/third_party/gotools/go/types/eval.go b/third_party/gotools/go/types/eval.go
deleted file mode 100644
index 7fa319e..0000000
--- a/third_party/gotools/go/types/eval.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements New, Eval and EvalNode.
-
-package types
-
-import (
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-)
-
-// New is a convenience function to create a new type from a given
-// expression or type literal string evaluated in Universe scope.
-// New(str) is shorthand for Eval(str, nil, nil), but only returns
-// the type result, and panics in case of an error.
-// Position info for objects in the result type is undefined.
-//
-func New(str string) Type {
-	tv, err := Eval(str, nil, nil)
-	if err != nil {
-		panic(err)
-	}
-	return tv.Type
-}
-
-// Eval returns the type and, if constant, the value for the
-// expression or type literal string str evaluated in scope.
-// If the expression contains function literals, the function
-// bodies are ignored (though they must be syntactically correct).
-//
-// If pkg == nil, the Universe scope is used and the provided
-// scope is ignored. Otherwise, the scope must belong to the
-// package (either the package scope, or nested within the
-// package scope).
-//
-// An error is returned if the scope is incorrect, the string
-// has syntax errors, or if it cannot be evaluated in the scope.
-// Position info for objects in the result type is undefined.
-//
-// Note: Eval should not be used instead of running Check to compute
-// types and values, but in addition to Check. Eval will re-evaluate
-// its argument each time, and it also does not know about the context
-// in which an expression is used (e.g., an assignment). Thus, top-
-// level untyped constants will return an untyped type rather then the
-// respective context-specific type.
-//
-func Eval(str string, pkg *Package, scope *Scope) (TypeAndValue, error) {
-	node, err := parser.ParseExpr(str)
-	if err != nil {
-		return TypeAndValue{}, err
-	}
-
-	// Create a file set that looks structurally identical to the
-	// one created by parser.ParseExpr for correct error positions.
-	fset := token.NewFileSet()
-	fset.AddFile("", len(str), fset.Base()).SetLinesForContent([]byte(str))
-
-	return EvalNode(fset, node, pkg, scope)
-}
-
-// EvalNode is like Eval but instead of string it accepts
-// an expression node and respective file set.
-//
-// An error is returned if the scope is incorrect
-// if the node cannot be evaluated in the scope.
-//
-func EvalNode(fset *token.FileSet, node ast.Expr, pkg *Package, scope *Scope) (tv TypeAndValue, err error) {
-	// verify package/scope relationship
-	if pkg == nil {
-		scope = Universe
-	} else {
-		s := scope
-		for s != nil && s != pkg.scope {
-			s = s.parent
-		}
-		// s == nil || s == pkg.scope
-		if s == nil {
-			return TypeAndValue{}, fmt.Errorf("scope does not belong to package %s", pkg.name)
-		}
-	}
-
-	// initialize checker
-	check := NewChecker(nil, fset, pkg, nil)
-	check.scope = scope
-	defer check.handleBailout(&err)
-
-	// evaluate node
-	var x operand
-	check.rawExpr(&x, node, nil)
-	return TypeAndValue{x.mode, x.typ, x.val}, nil
-}
diff --git a/third_party/gotools/go/types/eval_test.go b/third_party/gotools/go/types/eval_test.go
deleted file mode 100644
index d637955..0000000
--- a/third_party/gotools/go/types/eval_test.go
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains tests for Eval.
-
-package types_test
-
-import (
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"strings"
-	"testing"
-
-	_ "llvm.org/llgo/third_party/gotools/go/gcimporter"
-	. "llvm.org/llgo/third_party/gotools/go/types"
-)
-
-func testEval(t *testing.T, pkg *Package, scope *Scope, str string, typ Type, typStr, valStr string) {
-	gotTv, err := Eval(str, pkg, scope)
-	if err != nil {
-		t.Errorf("Eval(%q) failed: %s", str, err)
-		return
-	}
-	if gotTv.Type == nil {
-		t.Errorf("Eval(%q) got nil type but no error", str)
-		return
-	}
-
-	// compare types
-	if typ != nil {
-		// we have a type, check identity
-		if !Identical(gotTv.Type, typ) {
-			t.Errorf("Eval(%q) got type %s, want %s", str, gotTv.Type, typ)
-			return
-		}
-	} else {
-		// we have a string, compare type string
-		gotStr := gotTv.Type.String()
-		if gotStr != typStr {
-			t.Errorf("Eval(%q) got type %s, want %s", str, gotStr, typStr)
-			return
-		}
-	}
-
-	// compare values
-	gotStr := ""
-	if gotTv.Value != nil {
-		gotStr = gotTv.Value.String()
-	}
-	if gotStr != valStr {
-		t.Errorf("Eval(%q) got value %s, want %s", str, gotStr, valStr)
-	}
-}
-
-func TestEvalBasic(t *testing.T) {
-	for _, typ := range Typ[Bool : String+1] {
-		testEval(t, nil, nil, typ.Name(), typ, "", "")
-	}
-}
-
-func TestEvalComposite(t *testing.T) {
-	for _, test := range independentTestTypes {
-		testEval(t, nil, nil, test.src, nil, test.str, "")
-	}
-}
-
-func TestEvalArith(t *testing.T) {
-	var tests = []string{
-		`true`,
-		`false == false`,
-		`12345678 + 87654321 == 99999999`,
-		`10 * 20 == 200`,
-		`(1<<1000)*2 >> 100 == 2<<900`,
-		`"foo" + "bar" == "foobar"`,
-		`"abc" <= "bcd"`,
-		`len([10]struct{}{}) == 2*5`,
-	}
-	for _, test := range tests {
-		testEval(t, nil, nil, test, Typ[UntypedBool], "", "true")
-	}
-}
-
-func TestEvalContext(t *testing.T) {
-	src := `
-package p
-import "fmt"
-import m "math"
-const c = 3.0
-type T []int
-func f(a int, s string) float64 {
-	fmt.Println("calling f")
-	_ = m.Pi // use package math
-	const d int = c + 1
-	var x int
-	x = a + len(s)
-	return float64(x)
-}
-`
-	fset := token.NewFileSet()
-	file, err := parser.ParseFile(fset, "p", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	pkg, err := Check("p", fset, []*ast.File{file})
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	pkgScope := pkg.Scope()
-	if n := pkgScope.NumChildren(); n != 1 {
-		t.Fatalf("got %d file scopes, want 1", n)
-	}
-
-	fileScope := pkgScope.Child(0)
-	if n := fileScope.NumChildren(); n != 1 {
-		t.Fatalf("got %d functions scopes, want 1", n)
-	}
-
-	funcScope := fileScope.Child(0)
-
-	var tests = []string{
-		`true => true, untyped bool`,
-		`fmt.Println => , func(a ...interface{}) (n int, err error)`,
-		`c => 3, untyped float`,
-		`T => , p.T`,
-		`a => , int`,
-		`s => , string`,
-		`d => 4, int`,
-		`x => , int`,
-		`d/c => 1, int`,
-		`c/2 => 3/2, untyped float`,
-		`m.Pi < m.E => false, untyped bool`,
-	}
-	for _, test := range tests {
-		str, typ := split(test, ", ")
-		str, val := split(str, "=>")
-		testEval(t, pkg, funcScope, str, nil, typ, val)
-	}
-}
-
-// split splits string s at the first occurrence of s.
-func split(s, sep string) (string, string) {
-	i := strings.Index(s, sep)
-	return strings.TrimSpace(s[:i]), strings.TrimSpace(s[i+len(sep):])
-}
diff --git a/third_party/gotools/go/types/expr.go b/third_party/gotools/go/types/expr.go
deleted file mode 100644
index 7a73a91..0000000
--- a/third_party/gotools/go/types/expr.go
+++ /dev/null
@@ -1,1483 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements typechecking of expressions.
-
-package types
-
-import (
-	"fmt"
-	"go/ast"
-	"go/token"
-	"math"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-)
-
-/*
-Basic algorithm:
-
-Expressions are checked recursively, top down. Expression checker functions
-are generally of the form:
-
-  func f(x *operand, e *ast.Expr, ...)
-
-where e is the expression to be checked, and x is the result of the check.
-The check performed by f may fail in which case x.mode == invalid, and
-related error messages will have been issued by f.
-
-If a hint argument is present, it is the composite literal element type
-of an outer composite literal; it is used to type-check composite literal
-elements that have no explicit type specification in the source
-(e.g.: []T{{...}, {...}}, the hint is the type T in this case).
-
-All expressions are checked via rawExpr, which dispatches according
-to expression kind. Upon returning, rawExpr is recording the types and
-constant values for all expressions that have an untyped type (those types
-may change on the way up in the expression tree). Usually these are constants,
-but the results of comparisons or non-constant shifts of untyped constants
-may also be untyped, but not constant.
-
-Untyped expressions may eventually become fully typed (i.e., not untyped),
-typically when the value is assigned to a variable, or is used otherwise.
-The updateExprType method is used to record this final type and update
-the recorded types: the type-checked expression tree is again traversed down,
-and the new type is propagated as needed. Untyped constant expression values
-that become fully typed must now be representable by the full type (constant
-sub-expression trees are left alone except for their roots). This mechanism
-ensures that a client sees the actual (run-time) type an untyped value would
-have. It also permits type-checking of lhs shift operands "as if the shift
-were not present": when updateExprType visits an untyped lhs shift operand
-and assigns it it's final type, that type must be an integer type, and a
-constant lhs must be representable as an integer.
-
-When an expression gets its final type, either on the way out from rawExpr,
-on the way down in updateExprType, or at the end of the type checker run,
-the type (and constant value, if any) is recorded via Info.Types, if present.
-*/
-
-type opPredicates map[token.Token]func(Type) bool
-
-var unaryOpPredicates = opPredicates{
-	token.ADD: isNumeric,
-	token.SUB: isNumeric,
-	token.XOR: isInteger,
-	token.NOT: isBoolean,
-}
-
-func (check *Checker) op(m opPredicates, x *operand, op token.Token) bool {
-	if pred := m[op]; pred != nil {
-		if !pred(x.typ) {
-			check.invalidOp(x.pos(), "operator %s not defined for %s", op, x)
-			return false
-		}
-	} else {
-		check.invalidAST(x.pos(), "unknown operator %s", op)
-		return false
-	}
-	return true
-}
-
-func (check *Checker) unary(x *operand, op token.Token) {
-	switch op {
-	case token.AND:
-		// spec: "As an exception to the addressability
-		// requirement x may also be a composite literal."
-		if _, ok := unparen(x.expr).(*ast.CompositeLit); !ok && x.mode != variable {
-			check.invalidOp(x.pos(), "cannot take address of %s", x)
-			x.mode = invalid
-			return
-		}
-		x.mode = value
-		x.typ = &Pointer{base: x.typ}
-		return
-
-	case token.ARROW:
-		typ, ok := x.typ.Underlying().(*Chan)
-		if !ok {
-			check.invalidOp(x.pos(), "cannot receive from non-channel %s", x)
-			x.mode = invalid
-			return
-		}
-		if typ.dir == SendOnly {
-			check.invalidOp(x.pos(), "cannot receive from send-only channel %s", x)
-			x.mode = invalid
-			return
-		}
-		x.mode = commaok
-		x.typ = typ.elem
-		check.hasCallOrRecv = true
-		return
-	}
-
-	if !check.op(unaryOpPredicates, x, op) {
-		x.mode = invalid
-		return
-	}
-
-	if x.mode == constant {
-		typ := x.typ.Underlying().(*Basic)
-		size := -1
-		if isUnsigned(typ) {
-			size = int(check.conf.sizeof(typ))
-		}
-		x.val = exact.UnaryOp(op, x.val, size)
-		// Typed constants must be representable in
-		// their type after each constant operation.
-		if isTyped(typ) {
-			check.representable(x, typ)
-		}
-		return
-	}
-
-	x.mode = value
-	// x.typ remains unchanged
-}
-
-func isShift(op token.Token) bool {
-	return op == token.SHL || op == token.SHR
-}
-
-func isComparison(op token.Token) bool {
-	// Note: tokens are not ordered well to make this much easier
-	switch op {
-	case token.EQL, token.NEQ, token.LSS, token.LEQ, token.GTR, token.GEQ:
-		return true
-	}
-	return false
-}
-
-func fitsFloat32(x exact.Value) bool {
-	f32, _ := exact.Float32Val(x)
-	f := float64(f32)
-	return !math.IsInf(f, 0)
-}
-
-func roundFloat32(x exact.Value) exact.Value {
-	f32, _ := exact.Float32Val(x)
-	f := float64(f32)
-	if !math.IsInf(f, 0) {
-		return exact.MakeFloat64(f)
-	}
-	return nil
-}
-
-func fitsFloat64(x exact.Value) bool {
-	f, _ := exact.Float64Val(x)
-	return !math.IsInf(f, 0)
-}
-
-func roundFloat64(x exact.Value) exact.Value {
-	f, _ := exact.Float64Val(x)
-	if !math.IsInf(f, 0) {
-		return exact.MakeFloat64(f)
-	}
-	return nil
-}
-
-// representableConst reports whether x can be represented as
-// value of the given basic type kind and for the configuration
-// provided (only needed for int/uint sizes).
-//
-// If rounded != nil, *rounded is set to the rounded value of x for
-// representable floating-point values; it is left alone otherwise.
-// It is ok to provide the addressof the first argument for rounded.
-func representableConst(x exact.Value, conf *Config, as BasicKind, rounded *exact.Value) bool {
-	switch x.Kind() {
-	case exact.Unknown:
-		return true
-
-	case exact.Bool:
-		return as == Bool || as == UntypedBool
-
-	case exact.Int:
-		if x, ok := exact.Int64Val(x); ok {
-			switch as {
-			case Int:
-				var s = uint(conf.sizeof(Typ[as])) * 8
-				return int64(-1)<<(s-1) <= x && x <= int64(1)<<(s-1)-1
-			case Int8:
-				const s = 8
-				return -1<<(s-1) <= x && x <= 1<<(s-1)-1
-			case Int16:
-				const s = 16
-				return -1<<(s-1) <= x && x <= 1<<(s-1)-1
-			case Int32:
-				const s = 32
-				return -1<<(s-1) <= x && x <= 1<<(s-1)-1
-			case Int64:
-				return true
-			case Uint, Uintptr:
-				if s := uint(conf.sizeof(Typ[as])) * 8; s < 64 {
-					return 0 <= x && x <= int64(1)<<s-1
-				}
-				return 0 <= x
-			case Uint8:
-				const s = 8
-				return 0 <= x && x <= 1<<s-1
-			case Uint16:
-				const s = 16
-				return 0 <= x && x <= 1<<s-1
-			case Uint32:
-				const s = 32
-				return 0 <= x && x <= 1<<s-1
-			case Uint64:
-				return 0 <= x
-			case Float32, Float64, Complex64, Complex128,
-				UntypedInt, UntypedFloat, UntypedComplex:
-				return true
-			}
-		}
-
-		n := exact.BitLen(x)
-		switch as {
-		case Uint, Uintptr:
-			var s = uint(conf.sizeof(Typ[as])) * 8
-			return exact.Sign(x) >= 0 && n <= int(s)
-		case Uint64:
-			return exact.Sign(x) >= 0 && n <= 64
-		case Float32, Complex64:
-			if rounded == nil {
-				return fitsFloat32(x)
-			}
-			r := roundFloat32(x)
-			if r != nil {
-				*rounded = r
-				return true
-			}
-		case Float64, Complex128:
-			if rounded == nil {
-				return fitsFloat64(x)
-			}
-			r := roundFloat64(x)
-			if r != nil {
-				*rounded = r
-				return true
-			}
-		case UntypedInt, UntypedFloat, UntypedComplex:
-			return true
-		}
-
-	case exact.Float:
-		switch as {
-		case Float32, Complex64:
-			if rounded == nil {
-				return fitsFloat32(x)
-			}
-			r := roundFloat32(x)
-			if r != nil {
-				*rounded = r
-				return true
-			}
-		case Float64, Complex128:
-			if rounded == nil {
-				return fitsFloat64(x)
-			}
-			r := roundFloat64(x)
-			if r != nil {
-				*rounded = r
-				return true
-			}
-		case UntypedFloat, UntypedComplex:
-			return true
-		}
-
-	case exact.Complex:
-		switch as {
-		case Complex64:
-			if rounded == nil {
-				return fitsFloat32(exact.Real(x)) && fitsFloat32(exact.Imag(x))
-			}
-			re := roundFloat32(exact.Real(x))
-			im := roundFloat32(exact.Imag(x))
-			if re != nil && im != nil {
-				*rounded = exact.BinaryOp(re, token.ADD, exact.MakeImag(im))
-				return true
-			}
-		case Complex128:
-			if rounded == nil {
-				return fitsFloat64(exact.Real(x)) && fitsFloat64(exact.Imag(x))
-			}
-			re := roundFloat64(exact.Real(x))
-			im := roundFloat64(exact.Imag(x))
-			if re != nil && im != nil {
-				*rounded = exact.BinaryOp(re, token.ADD, exact.MakeImag(im))
-				return true
-			}
-		case UntypedComplex:
-			return true
-		}
-
-	case exact.String:
-		return as == String || as == UntypedString
-
-	default:
-		unreachable()
-	}
-
-	return false
-}
-
-// representable checks that a constant operand is representable in the given basic type.
-func (check *Checker) representable(x *operand, typ *Basic) {
-	assert(x.mode == constant)
-	if !representableConst(x.val, check.conf, typ.kind, &x.val) {
-		var msg string
-		if isNumeric(x.typ) && isNumeric(typ) {
-			// numeric conversion : error msg
-			//
-			// integer -> integer : overflows
-			// integer -> float   : overflows (actually not possible)
-			// float   -> integer : truncated
-			// float   -> float   : overflows
-			//
-			if !isInteger(x.typ) && isInteger(typ) {
-				msg = "%s truncated to %s"
-			} else {
-				msg = "%s overflows %s"
-			}
-		} else {
-			msg = "cannot convert %s to %s"
-		}
-		check.errorf(x.pos(), msg, x, typ)
-		x.mode = invalid
-	}
-}
-
-// updateExprType updates the type of x to typ and invokes itself
-// recursively for the operands of x, depending on expression kind.
-// If typ is still an untyped and not the final type, updateExprType
-// only updates the recorded untyped type for x and possibly its
-// operands. Otherwise (i.e., typ is not an untyped type anymore,
-// or it is the final type for x), the type and value are recorded.
-// Also, if x is a constant, it must be representable as a value of typ,
-// and if x is the (formerly untyped) lhs operand of a non-constant
-// shift, it must be an integer value.
-//
-func (check *Checker) updateExprType(x ast.Expr, typ Type, final bool) {
-	old, found := check.untyped[x]
-	if !found {
-		return // nothing to do
-	}
-
-	// update operands of x if necessary
-	switch x := x.(type) {
-	case *ast.BadExpr,
-		*ast.FuncLit,
-		*ast.CompositeLit,
-		*ast.IndexExpr,
-		*ast.SliceExpr,
-		*ast.TypeAssertExpr,
-		*ast.StarExpr,
-		*ast.KeyValueExpr,
-		*ast.ArrayType,
-		*ast.StructType,
-		*ast.FuncType,
-		*ast.InterfaceType,
-		*ast.MapType,
-		*ast.ChanType:
-		// These expression are never untyped - nothing to do.
-		// The respective sub-expressions got their final types
-		// upon assignment or use.
-		if debug {
-			check.dump("%s: found old type(%s): %s (new: %s)", x.Pos(), x, old.typ, typ)
-			unreachable()
-		}
-		return
-
-	case *ast.CallExpr:
-		// Resulting in an untyped constant (e.g., built-in complex).
-		// The respective calls take care of calling updateExprType
-		// for the arguments if necessary.
-
-	case *ast.Ident, *ast.BasicLit, *ast.SelectorExpr:
-		// An identifier denoting a constant, a constant literal,
-		// or a qualified identifier (imported untyped constant).
-		// No operands to take care of.
-
-	case *ast.ParenExpr:
-		check.updateExprType(x.X, typ, final)
-
-	case *ast.UnaryExpr:
-		// If x is a constant, the operands were constants.
-		// They don't need to be updated since they never
-		// get "materialized" into a typed value; and they
-		// will be processed at the end of the type check.
-		if old.val != nil {
-			break
-		}
-		check.updateExprType(x.X, typ, final)
-
-	case *ast.BinaryExpr:
-		if old.val != nil {
-			break // see comment for unary expressions
-		}
-		if isComparison(x.Op) {
-			// The result type is independent of operand types
-			// and the operand types must have final types.
-		} else if isShift(x.Op) {
-			// The result type depends only on lhs operand.
-			// The rhs type was updated when checking the shift.
-			check.updateExprType(x.X, typ, final)
-		} else {
-			// The operand types match the result type.
-			check.updateExprType(x.X, typ, final)
-			check.updateExprType(x.Y, typ, final)
-		}
-
-	default:
-		unreachable()
-	}
-
-	// If the new type is not final and still untyped, just
-	// update the recorded type.
-	if !final && isUntyped(typ) {
-		old.typ = typ.Underlying().(*Basic)
-		check.untyped[x] = old
-		return
-	}
-
-	// Otherwise we have the final (typed or untyped type).
-	// Remove it from the map of yet untyped expressions.
-	delete(check.untyped, x)
-
-	// If x is the lhs of a shift, its final type must be integer.
-	// We already know from the shift check that it is representable
-	// as an integer if it is a constant.
-	if old.isLhs && !isInteger(typ) {
-		check.invalidOp(x.Pos(), "shifted operand %s (type %s) must be integer", x, typ)
-		return
-	}
-
-	// Everything's fine, record final type and value for x.
-	check.recordTypeAndValue(x, old.mode, typ, old.val)
-}
-
-// updateExprVal updates the value of x to val.
-func (check *Checker) updateExprVal(x ast.Expr, val exact.Value) {
-	if info, ok := check.untyped[x]; ok {
-		info.val = val
-		check.untyped[x] = info
-	}
-}
-
-// convertUntyped attempts to set the type of an untyped value to the target type.
-func (check *Checker) convertUntyped(x *operand, target Type) {
-	if x.mode == invalid || isTyped(x.typ) || target == Typ[Invalid] {
-		return
-	}
-
-	// TODO(gri) Sloppy code - clean up. This function is central
-	//           to assignment and expression checking.
-
-	if isUntyped(target) {
-		// both x and target are untyped
-		xkind := x.typ.(*Basic).kind
-		tkind := target.(*Basic).kind
-		if isNumeric(x.typ) && isNumeric(target) {
-			if xkind < tkind {
-				x.typ = target
-				check.updateExprType(x.expr, target, false)
-			}
-		} else if xkind != tkind {
-			goto Error
-		}
-		return
-	}
-
-	// typed target
-	switch t := target.Underlying().(type) {
-	case *Basic:
-		if x.mode == constant {
-			check.representable(x, t)
-			if x.mode == invalid {
-				return
-			}
-			// expression value may have been rounded - update if needed
-			// TODO(gri) A floating-point value may silently underflow to
-			// zero. If it was negative, the sign is lost. See issue 6898.
-			check.updateExprVal(x.expr, x.val)
-		} else {
-			// Non-constant untyped values may appear as the
-			// result of comparisons (untyped bool), intermediate
-			// (delayed-checked) rhs operands of shifts, and as
-			// the value nil.
-			switch x.typ.(*Basic).kind {
-			case UntypedBool:
-				if !isBoolean(target) {
-					goto Error
-				}
-			case UntypedInt, UntypedRune, UntypedFloat, UntypedComplex:
-				if !isNumeric(target) {
-					goto Error
-				}
-			case UntypedString:
-				// Non-constant untyped string values are not
-				// permitted by the spec and should not occur.
-				unreachable()
-			case UntypedNil:
-				// Unsafe.Pointer is a basic type that includes nil.
-				if !hasNil(target) {
-					goto Error
-				}
-			default:
-				goto Error
-			}
-		}
-	case *Interface:
-		if !x.isNil() && !t.Empty() /* empty interfaces are ok */ {
-			goto Error
-		}
-		// Update operand types to the default type rather then
-		// the target (interface) type: values must have concrete
-		// dynamic types. If the value is nil, keep it untyped
-		// (this is important for tools such as go vet which need
-		// the dynamic type for argument checking of say, print
-		// functions)
-		if x.isNil() {
-			target = Typ[UntypedNil]
-		} else {
-			// cannot assign untyped values to non-empty interfaces
-			if !t.Empty() {
-				goto Error
-			}
-			target = defaultType(x.typ)
-		}
-	case *Pointer, *Signature, *Slice, *Map, *Chan:
-		if !x.isNil() {
-			goto Error
-		}
-		// keep nil untyped - see comment for interfaces, above
-		target = Typ[UntypedNil]
-	default:
-		goto Error
-	}
-
-	x.typ = target
-	check.updateExprType(x.expr, target, true) // UntypedNils are final
-	return
-
-Error:
-	check.errorf(x.pos(), "cannot convert %s to %s", x, target)
-	x.mode = invalid
-}
-
-func (check *Checker) comparison(x, y *operand, op token.Token) {
-	// spec: "In any comparison, the first operand must be assignable
-	// to the type of the second operand, or vice versa."
-	err := ""
-	if x.assignableTo(check.conf, y.typ) || y.assignableTo(check.conf, x.typ) {
-		defined := false
-		switch op {
-		case token.EQL, token.NEQ:
-			// spec: "The equality operators == and != apply to operands that are comparable."
-			defined = Comparable(x.typ) || x.isNil() && hasNil(y.typ) || y.isNil() && hasNil(x.typ)
-		case token.LSS, token.LEQ, token.GTR, token.GEQ:
-			// spec: The ordering operators <, <=, >, and >= apply to operands that are ordered."
-			defined = isOrdered(x.typ)
-		default:
-			unreachable()
-		}
-		if !defined {
-			typ := x.typ
-			if x.isNil() {
-				typ = y.typ
-			}
-			err = check.sprintf("operator %s not defined for %s", op, typ)
-		}
-	} else {
-		err = check.sprintf("mismatched types %s and %s", x.typ, y.typ)
-	}
-
-	if err != "" {
-		check.errorf(x.pos(), "cannot compare %s %s %s (%s)", x.expr, op, y.expr, err)
-		x.mode = invalid
-		return
-	}
-
-	if x.mode == constant && y.mode == constant {
-		x.val = exact.MakeBool(exact.Compare(x.val, op, y.val))
-		// The operands are never materialized; no need to update
-		// their types.
-	} else {
-		x.mode = value
-		// The operands have now their final types, which at run-
-		// time will be materialized. Update the expression trees.
-		// If the current types are untyped, the materialized type
-		// is the respective default type.
-		check.updateExprType(x.expr, defaultType(x.typ), true)
-		check.updateExprType(y.expr, defaultType(y.typ), true)
-	}
-
-	// spec: "Comparison operators compare two operands and yield
-	//        an untyped boolean value."
-	x.typ = Typ[UntypedBool]
-}
-
-func (check *Checker) shift(x, y *operand, op token.Token) {
-	untypedx := isUntyped(x.typ)
-
-	// The lhs must be of integer type or be representable
-	// as an integer; otherwise the shift has no chance.
-	if !isInteger(x.typ) && (!untypedx || !representableConst(x.val, nil, UntypedInt, nil)) {
-		check.invalidOp(x.pos(), "shifted operand %s must be integer", x)
-		x.mode = invalid
-		return
-	}
-
-	// spec: "The right operand in a shift expression must have unsigned
-	// integer type or be an untyped constant that can be converted to
-	// unsigned integer type."
-	switch {
-	case isInteger(y.typ) && isUnsigned(y.typ):
-		// nothing to do
-	case isUntyped(y.typ):
-		check.convertUntyped(y, Typ[UntypedInt])
-		if y.mode == invalid {
-			x.mode = invalid
-			return
-		}
-	default:
-		check.invalidOp(y.pos(), "shift count %s must be unsigned integer", y)
-		x.mode = invalid
-		return
-	}
-
-	if x.mode == constant {
-		if y.mode == constant {
-			// rhs must be within reasonable bounds
-			const stupidShift = 1023 - 1 + 52 // so we can express smallestFloat64
-			s, ok := exact.Uint64Val(y.val)
-			if !ok || s > stupidShift {
-				check.invalidOp(y.pos(), "stupid shift count %s", y)
-				x.mode = invalid
-				return
-			}
-			// The lhs is representable as an integer but may not be an integer
-			// (e.g., 2.0, an untyped float) - this can only happen for untyped
-			// non-integer numeric constants. Correct the type so that the shift
-			// result is of integer type.
-			if !isInteger(x.typ) {
-				x.typ = Typ[UntypedInt]
-			}
-			x.val = exact.Shift(x.val, op, uint(s))
-			return
-		}
-
-		// non-constant shift with constant lhs
-		if untypedx {
-			// spec: "If the left operand of a non-constant shift
-			// expression is an untyped constant, the type of the
-			// constant is what it would be if the shift expression
-			// were replaced by its left operand alone.".
-			//
-			// Delay operand checking until we know the final type:
-			// The lhs expression must be in the untyped map, mark
-			// the entry as lhs shift operand.
-			info, found := check.untyped[x.expr]
-			assert(found)
-			info.isLhs = true
-			check.untyped[x.expr] = info
-			// keep x's type
-			x.mode = value
-			return
-		}
-	}
-
-	// constant rhs must be >= 0
-	if y.mode == constant && exact.Sign(y.val) < 0 {
-		check.invalidOp(y.pos(), "shift count %s must not be negative", y)
-	}
-
-	// non-constant shift - lhs must be an integer
-	if !isInteger(x.typ) {
-		check.invalidOp(x.pos(), "shifted operand %s must be integer", x)
-		x.mode = invalid
-		return
-	}
-
-	x.mode = value
-}
-
-var binaryOpPredicates = opPredicates{
-	token.ADD: func(typ Type) bool { return isNumeric(typ) || isString(typ) },
-	token.SUB: isNumeric,
-	token.MUL: isNumeric,
-	token.QUO: isNumeric,
-	token.REM: isInteger,
-
-	token.AND:     isInteger,
-	token.OR:      isInteger,
-	token.XOR:     isInteger,
-	token.AND_NOT: isInteger,
-
-	token.LAND: isBoolean,
-	token.LOR:  isBoolean,
-}
-
-func (check *Checker) binary(x *operand, lhs, rhs ast.Expr, op token.Token) {
-	var y operand
-
-	check.expr(x, lhs)
-	check.expr(&y, rhs)
-
-	if x.mode == invalid {
-		return
-	}
-	if y.mode == invalid {
-		x.mode = invalid
-		x.expr = y.expr
-		return
-	}
-
-	if isShift(op) {
-		check.shift(x, &y, op)
-		return
-	}
-
-	check.convertUntyped(x, y.typ)
-	if x.mode == invalid {
-		return
-	}
-	check.convertUntyped(&y, x.typ)
-	if y.mode == invalid {
-		x.mode = invalid
-		return
-	}
-
-	if isComparison(op) {
-		check.comparison(x, &y, op)
-		return
-	}
-
-	if !Identical(x.typ, y.typ) {
-		// only report an error if we have valid types
-		// (otherwise we had an error reported elsewhere already)
-		if x.typ != Typ[Invalid] && y.typ != Typ[Invalid] {
-			check.invalidOp(x.pos(), "mismatched types %s and %s", x.typ, y.typ)
-		}
-		x.mode = invalid
-		return
-	}
-
-	if !check.op(binaryOpPredicates, x, op) {
-		x.mode = invalid
-		return
-	}
-
-	if (op == token.QUO || op == token.REM) && (x.mode == constant || isInteger(x.typ)) && y.mode == constant && exact.Sign(y.val) == 0 {
-		check.invalidOp(y.pos(), "division by zero")
-		x.mode = invalid
-		return
-	}
-
-	if x.mode == constant && y.mode == constant {
-		typ := x.typ.Underlying().(*Basic)
-		// force integer division of integer operands
-		if op == token.QUO && isInteger(typ) {
-			op = token.QUO_ASSIGN
-		}
-		x.val = exact.BinaryOp(x.val, op, y.val)
-		// Typed constants must be representable in
-		// their type after each constant operation.
-		if isTyped(typ) {
-			check.representable(x, typ)
-		}
-		return
-	}
-
-	x.mode = value
-	// x.typ is unchanged
-}
-
-// index checks an index expression for validity.
-// If max >= 0, it is the upper bound for index.
-// If index is valid and the result i >= 0, then i is the constant value of index.
-func (check *Checker) index(index ast.Expr, max int64) (i int64, valid bool) {
-	var x operand
-	check.expr(&x, index)
-	if x.mode == invalid {
-		return
-	}
-
-	// an untyped constant must be representable as Int
-	check.convertUntyped(&x, Typ[Int])
-	if x.mode == invalid {
-		return
-	}
-
-	// the index must be of integer type
-	if !isInteger(x.typ) {
-		check.invalidArg(x.pos(), "index %s must be integer", &x)
-		return
-	}
-
-	// a constant index i must be in bounds
-	if x.mode == constant {
-		if exact.Sign(x.val) < 0 {
-			check.invalidArg(x.pos(), "index %s must not be negative", &x)
-			return
-		}
-		i, valid = exact.Int64Val(x.val)
-		if !valid || max >= 0 && i >= max {
-			check.errorf(x.pos(), "index %s is out of bounds", &x)
-			return i, false
-		}
-		// 0 <= i [ && i < max ]
-		return i, true
-	}
-
-	return -1, true
-}
-
-// indexElts checks the elements (elts) of an array or slice composite literal
-// against the literal's element type (typ), and the element indices against
-// the literal length if known (length >= 0). It returns the length of the
-// literal (maximum index value + 1).
-//
-func (check *Checker) indexedElts(elts []ast.Expr, typ Type, length int64) int64 {
-	visited := make(map[int64]bool, len(elts))
-	var index, max int64
-	for _, e := range elts {
-		// determine and check index
-		validIndex := false
-		eval := e
-		if kv, _ := e.(*ast.KeyValueExpr); kv != nil {
-			if i, ok := check.index(kv.Key, length); ok {
-				if i >= 0 {
-					index = i
-					validIndex = true
-				} else {
-					check.errorf(e.Pos(), "index %s must be integer constant", kv.Key)
-				}
-			}
-			eval = kv.Value
-		} else if length >= 0 && index >= length {
-			check.errorf(e.Pos(), "index %d is out of bounds (>= %d)", index, length)
-		} else {
-			validIndex = true
-		}
-
-		// if we have a valid index, check for duplicate entries
-		if validIndex {
-			if visited[index] {
-				check.errorf(e.Pos(), "duplicate index %d in array or slice literal", index)
-			}
-			visited[index] = true
-		}
-		index++
-		if index > max {
-			max = index
-		}
-
-		// check element against composite literal element type
-		var x operand
-		check.exprWithHint(&x, eval, typ)
-		if !check.assignment(&x, typ) && x.mode != invalid {
-			check.errorf(x.pos(), "cannot use %s as %s value in array or slice literal", &x, typ)
-		}
-	}
-	return max
-}
-
-// exprKind describes the kind of an expression; the kind
-// determines if an expression is valid in 'statement context'.
-type exprKind int
-
-const (
-	conversion exprKind = iota
-	expression
-	statement
-)
-
-// rawExpr typechecks expression e and initializes x with the expression
-// value or type. If an error occurred, x.mode is set to invalid.
-// If hint != nil, it is the type of a composite literal element.
-//
-func (check *Checker) rawExpr(x *operand, e ast.Expr, hint Type) exprKind {
-	if trace {
-		check.trace(e.Pos(), "%s", e)
-		check.indent++
-		defer func() {
-			check.indent--
-			check.trace(e.Pos(), "=> %s", x)
-		}()
-	}
-
-	kind := check.exprInternal(x, e, hint)
-
-	// convert x into a user-friendly set of values
-	// TODO(gri) this code can be simplified
-	var typ Type
-	var val exact.Value
-	switch x.mode {
-	case invalid:
-		typ = Typ[Invalid]
-	case novalue:
-		typ = (*Tuple)(nil)
-	case constant:
-		typ = x.typ
-		val = x.val
-	default:
-		typ = x.typ
-	}
-	assert(x.expr != nil && typ != nil)
-
-	if isUntyped(typ) {
-		// delay type and value recording until we know the type
-		// or until the end of type checking
-		check.rememberUntyped(x.expr, false, x.mode, typ.(*Basic), val)
-	} else {
-		check.recordTypeAndValue(e, x.mode, typ, val)
-	}
-
-	return kind
-}
-
-// exprInternal contains the core of type checking of expressions.
-// Must only be called by rawExpr.
-//
-func (check *Checker) exprInternal(x *operand, e ast.Expr, hint Type) exprKind {
-	// make sure x has a valid state in case of bailout
-	// (was issue 5770)
-	x.mode = invalid
-	x.typ = Typ[Invalid]
-
-	switch e := e.(type) {
-	case *ast.BadExpr:
-		goto Error // error was reported before
-
-	case *ast.Ident:
-		check.ident(x, e, nil, nil)
-
-	case *ast.Ellipsis:
-		// ellipses are handled explicitly where they are legal
-		// (array composite literals and parameter lists)
-		check.error(e.Pos(), "invalid use of '...'")
-		goto Error
-
-	case *ast.BasicLit:
-		x.setConst(e.Kind, e.Value)
-		if x.mode == invalid {
-			check.invalidAST(e.Pos(), "invalid literal %v", e.Value)
-			goto Error
-		}
-
-	case *ast.FuncLit:
-		if sig, ok := check.typ(e.Type).(*Signature); ok {
-			// Anonymous functions are considered part of the
-			// init expression/func declaration which contains
-			// them: use existing package-level declaration info.
-			check.funcBody(check.decl, "", sig, e.Body)
-			x.mode = value
-			x.typ = sig
-		} else {
-			check.invalidAST(e.Pos(), "invalid function literal %s", e)
-			goto Error
-		}
-
-	case *ast.CompositeLit:
-		typ := hint
-		openArray := false
-		if e.Type != nil {
-			// [...]T array types may only appear with composite literals.
-			// Check for them here so we don't have to handle ... in general.
-			typ = nil
-			if atyp, _ := e.Type.(*ast.ArrayType); atyp != nil && atyp.Len != nil {
-				if ellip, _ := atyp.Len.(*ast.Ellipsis); ellip != nil && ellip.Elt == nil {
-					// We have an "open" [...]T array type.
-					// Create a new ArrayType with unknown length (-1)
-					// and finish setting it up after analyzing the literal.
-					typ = &Array{len: -1, elem: check.typ(atyp.Elt)}
-					openArray = true
-				}
-			}
-			if typ == nil {
-				typ = check.typ(e.Type)
-			}
-		}
-		if typ == nil {
-			// TODO(gri) provide better error messages depending on context
-			check.error(e.Pos(), "missing type in composite literal")
-			goto Error
-		}
-
-		switch typ, _ := deref(typ); utyp := typ.Underlying().(type) {
-		case *Struct:
-			if len(e.Elts) == 0 {
-				break
-			}
-			fields := utyp.fields
-			if _, ok := e.Elts[0].(*ast.KeyValueExpr); ok {
-				// all elements must have keys
-				visited := make([]bool, len(fields))
-				for _, e := range e.Elts {
-					kv, _ := e.(*ast.KeyValueExpr)
-					if kv == nil {
-						check.error(e.Pos(), "mixture of field:value and value elements in struct literal")
-						continue
-					}
-					key, _ := kv.Key.(*ast.Ident)
-					if key == nil {
-						check.errorf(kv.Pos(), "invalid field name %s in struct literal", kv.Key)
-						continue
-					}
-					i := fieldIndex(utyp.fields, check.pkg, key.Name)
-					if i < 0 {
-						check.errorf(kv.Pos(), "unknown field %s in struct literal", key.Name)
-						continue
-					}
-					fld := fields[i]
-					check.recordUse(key, fld)
-					// 0 <= i < len(fields)
-					if visited[i] {
-						check.errorf(kv.Pos(), "duplicate field name %s in struct literal", key.Name)
-						continue
-					}
-					visited[i] = true
-					check.expr(x, kv.Value)
-					etyp := fld.typ
-					if !check.assignment(x, etyp) {
-						if x.mode != invalid {
-							check.errorf(x.pos(), "cannot use %s as %s value in struct literal", x, etyp)
-						}
-						continue
-					}
-				}
-			} else {
-				// no element must have a key
-				for i, e := range e.Elts {
-					if kv, _ := e.(*ast.KeyValueExpr); kv != nil {
-						check.error(kv.Pos(), "mixture of field:value and value elements in struct literal")
-						continue
-					}
-					check.expr(x, e)
-					if i >= len(fields) {
-						check.error(x.pos(), "too many values in struct literal")
-						break // cannot continue
-					}
-					// i < len(fields)
-					fld := fields[i]
-					if !fld.Exported() && fld.pkg != check.pkg {
-						check.errorf(x.pos(), "implicit assignment to unexported field %s in %s literal", fld.name, typ)
-						continue
-					}
-					etyp := fld.typ
-					if !check.assignment(x, etyp) {
-						if x.mode != invalid {
-							check.errorf(x.pos(), "cannot use %s as %s value in struct literal", x, etyp)
-						}
-						continue
-					}
-				}
-				if len(e.Elts) < len(fields) {
-					check.error(e.Rbrace, "too few values in struct literal")
-					// ok to continue
-				}
-			}
-
-		case *Array:
-			n := check.indexedElts(e.Elts, utyp.elem, utyp.len)
-			// if we have an "open" [...]T array, set the length now that we know it
-			if openArray {
-				utyp.len = n
-			}
-
-		case *Slice:
-			check.indexedElts(e.Elts, utyp.elem, -1)
-
-		case *Map:
-			visited := make(map[interface{}][]Type, len(e.Elts))
-			for _, e := range e.Elts {
-				kv, _ := e.(*ast.KeyValueExpr)
-				if kv == nil {
-					check.error(e.Pos(), "missing key in map literal")
-					continue
-				}
-				check.exprWithHint(x, kv.Key, utyp.key)
-				if !check.assignment(x, utyp.key) {
-					if x.mode != invalid {
-						check.errorf(x.pos(), "cannot use %s as %s key in map literal", x, utyp.key)
-					}
-					continue
-				}
-				if x.mode == constant {
-					duplicate := false
-					// if the key is of interface type, the type is also significant when checking for duplicates
-					if _, ok := utyp.key.Underlying().(*Interface); ok {
-						for _, vtyp := range visited[x.val] {
-							if Identical(vtyp, x.typ) {
-								duplicate = true
-								break
-							}
-						}
-						visited[x.val] = append(visited[x.val], x.typ)
-					} else {
-						_, duplicate = visited[x.val]
-						visited[x.val] = nil
-					}
-					if duplicate {
-						check.errorf(x.pos(), "duplicate key %s in map literal", x.val)
-						continue
-					}
-				}
-				check.exprWithHint(x, kv.Value, utyp.elem)
-				if !check.assignment(x, utyp.elem) {
-					if x.mode != invalid {
-						check.errorf(x.pos(), "cannot use %s as %s value in map literal", x, utyp.elem)
-					}
-					continue
-				}
-			}
-
-		default:
-			// if utyp is invalid, an error was reported before
-			if utyp != Typ[Invalid] {
-				check.errorf(e.Pos(), "invalid composite literal type %s", typ)
-				goto Error
-			}
-		}
-
-		x.mode = value
-		x.typ = typ
-
-	case *ast.ParenExpr:
-		kind := check.rawExpr(x, e.X, nil)
-		x.expr = e
-		return kind
-
-	case *ast.SelectorExpr:
-		check.selector(x, e)
-
-	case *ast.IndexExpr:
-		check.expr(x, e.X)
-		if x.mode == invalid {
-			goto Error
-		}
-
-		valid := false
-		length := int64(-1) // valid if >= 0
-		switch typ := x.typ.Underlying().(type) {
-		case *Basic:
-			if isString(typ) {
-				valid = true
-				if x.mode == constant {
-					length = int64(len(exact.StringVal(x.val)))
-				}
-				// an indexed string always yields a byte value
-				// (not a constant) even if the string and the
-				// index are constant
-				x.mode = value
-				x.typ = UniverseByte // use 'byte' name
-			}
-
-		case *Array:
-			valid = true
-			length = typ.len
-			if x.mode != variable {
-				x.mode = value
-			}
-			x.typ = typ.elem
-
-		case *Pointer:
-			if typ, _ := typ.base.Underlying().(*Array); typ != nil {
-				valid = true
-				length = typ.len
-				x.mode = variable
-				x.typ = typ.elem
-			}
-
-		case *Slice:
-			valid = true
-			x.mode = variable
-			x.typ = typ.elem
-
-		case *Map:
-			var key operand
-			check.expr(&key, e.Index)
-			if !check.assignment(&key, typ.key) {
-				if key.mode != invalid {
-					check.invalidOp(key.pos(), "cannot use %s as map index of type %s", &key, typ.key)
-				}
-				goto Error
-			}
-			x.mode = mapindex
-			x.typ = typ.elem
-			x.expr = e
-			return expression
-		}
-
-		if !valid {
-			check.invalidOp(x.pos(), "cannot index %s", x)
-			goto Error
-		}
-
-		if e.Index == nil {
-			check.invalidAST(e.Pos(), "missing index for %s", x)
-			goto Error
-		}
-
-		check.index(e.Index, length)
-		// ok to continue
-
-	case *ast.SliceExpr:
-		check.expr(x, e.X)
-		if x.mode == invalid {
-			goto Error
-		}
-
-		valid := false
-		length := int64(-1) // valid if >= 0
-		switch typ := x.typ.Underlying().(type) {
-		case *Basic:
-			if isString(typ) {
-				if slice3(e) {
-					check.invalidOp(x.pos(), "3-index slice of string")
-					goto Error
-				}
-				valid = true
-				if x.mode == constant {
-					length = int64(len(exact.StringVal(x.val)))
-				}
-				// spec: "For untyped string operands the result
-				// is a non-constant value of type string."
-				if typ.kind == UntypedString {
-					x.typ = Typ[String]
-				}
-			}
-
-		case *Array:
-			valid = true
-			length = typ.len
-			if x.mode != variable {
-				check.invalidOp(x.pos(), "cannot slice %s (value not addressable)", x)
-				goto Error
-			}
-			x.typ = &Slice{elem: typ.elem}
-
-		case *Pointer:
-			if typ, _ := typ.base.Underlying().(*Array); typ != nil {
-				valid = true
-				length = typ.len
-				x.typ = &Slice{elem: typ.elem}
-			}
-
-		case *Slice:
-			valid = true
-			// x.typ doesn't change
-		}
-
-		if !valid {
-			check.invalidOp(x.pos(), "cannot slice %s", x)
-			goto Error
-		}
-
-		x.mode = value
-
-		// spec: "Only the first index may be omitted; it defaults to 0."
-		if slice3(e) && (e.High == nil || sliceMax(e) == nil) {
-			check.error(e.Rbrack, "2nd and 3rd index required in 3-index slice")
-			goto Error
-		}
-
-		// check indices
-		var ind [3]int64
-		for i, expr := range []ast.Expr{e.Low, e.High, sliceMax(e)} {
-			x := int64(-1)
-			switch {
-			case expr != nil:
-				// The "capacity" is only known statically for strings, arrays,
-				// and pointers to arrays, and it is the same as the length for
-				// those types.
-				max := int64(-1)
-				if length >= 0 {
-					max = length + 1
-				}
-				if t, ok := check.index(expr, max); ok && t >= 0 {
-					x = t
-				}
-			case i == 0:
-				// default is 0 for the first index
-				x = 0
-			case length >= 0:
-				// default is length (== capacity) otherwise
-				x = length
-			}
-			ind[i] = x
-		}
-
-		// constant indices must be in range
-		// (check.index already checks that existing indices >= 0)
-	L:
-		for i, x := range ind[:len(ind)-1] {
-			if x > 0 {
-				for _, y := range ind[i+1:] {
-					if y >= 0 && x > y {
-						check.errorf(e.Rbrack, "invalid slice indices: %d > %d", x, y)
-						break L // only report one error, ok to continue
-					}
-				}
-			}
-		}
-
-	case *ast.TypeAssertExpr:
-		check.expr(x, e.X)
-		if x.mode == invalid {
-			goto Error
-		}
-		xtyp, _ := x.typ.Underlying().(*Interface)
-		if xtyp == nil {
-			check.invalidOp(x.pos(), "%s is not an interface", x)
-			goto Error
-		}
-		// x.(type) expressions are handled explicitly in type switches
-		if e.Type == nil {
-			check.invalidAST(e.Pos(), "use of .(type) outside type switch")
-			goto Error
-		}
-		T := check.typ(e.Type)
-		if T == Typ[Invalid] {
-			goto Error
-		}
-		check.typeAssertion(x.pos(), x, xtyp, T)
-		x.mode = commaok
-		x.typ = T
-
-	case *ast.CallExpr:
-		return check.call(x, e)
-
-	case *ast.StarExpr:
-		check.exprOrType(x, e.X)
-		switch x.mode {
-		case invalid:
-			goto Error
-		case typexpr:
-			x.typ = &Pointer{base: x.typ}
-		default:
-			if typ, ok := x.typ.Underlying().(*Pointer); ok {
-				x.mode = variable
-				x.typ = typ.base
-			} else {
-				check.invalidOp(x.pos(), "cannot indirect %s", x)
-				goto Error
-			}
-		}
-
-	case *ast.UnaryExpr:
-		check.expr(x, e.X)
-		if x.mode == invalid {
-			goto Error
-		}
-		check.unary(x, e.Op)
-		if x.mode == invalid {
-			goto Error
-		}
-		if e.Op == token.ARROW {
-			x.expr = e
-			return statement // receive operations may appear in statement context
-		}
-
-	case *ast.BinaryExpr:
-		check.binary(x, e.X, e.Y, e.Op)
-		if x.mode == invalid {
-			goto Error
-		}
-
-	case *ast.KeyValueExpr:
-		// key:value expressions are handled in composite literals
-		check.invalidAST(e.Pos(), "no key:value expected")
-		goto Error
-
-	case *ast.ArrayType, *ast.StructType, *ast.FuncType,
-		*ast.InterfaceType, *ast.MapType, *ast.ChanType:
-		x.mode = typexpr
-		x.typ = check.typ(e)
-		// Note: rawExpr (caller of exprInternal) will call check.recordTypeAndValue
-		// even though check.typ has already called it. This is fine as both
-		// times the same expression and type are recorded. It is also not a
-		// performance issue because we only reach here for composite literal
-		// types, which are comparatively rare.
-
-	default:
-		panic(fmt.Sprintf("%s: unknown expression type %T", check.fset.Position(e.Pos()), e))
-	}
-
-	// everything went well
-	x.expr = e
-	return expression
-
-Error:
-	x.mode = invalid
-	x.expr = e
-	return statement // avoid follow-up errors
-}
-
-// typeAssertion checks that x.(T) is legal; xtyp must be the type of x.
-func (check *Checker) typeAssertion(pos token.Pos, x *operand, xtyp *Interface, T Type) {
-	method, wrongType := assertableTo(xtyp, T)
-	if method == nil {
-		return
-	}
-
-	var msg string
-	if wrongType {
-		msg = "wrong type for method"
-	} else {
-		msg = "missing method"
-	}
-	check.errorf(pos, "%s cannot have dynamic type %s (%s %s)", x, T, msg, method.name)
-}
-
-// expr typechecks expression e and initializes x with the expression value.
-// If an error occurred, x.mode is set to invalid.
-//
-func (check *Checker) expr(x *operand, e ast.Expr) {
-	check.rawExpr(x, e, nil)
-	var msg string
-	switch x.mode {
-	default:
-		return
-	case novalue:
-		msg = "used as value"
-	case builtin:
-		msg = "must be called"
-	case typexpr:
-		msg = "is not an expression"
-	}
-	check.errorf(x.pos(), "%s %s", x, msg)
-	x.mode = invalid
-}
-
-// exprWithHint typechecks expression e and initializes x with the expression value.
-// If an error occurred, x.mode is set to invalid.
-// If hint != nil, it is the type of a composite literal element.
-//
-func (check *Checker) exprWithHint(x *operand, e ast.Expr, hint Type) {
-	assert(hint != nil)
-	check.rawExpr(x, e, hint)
-	var msg string
-	switch x.mode {
-	default:
-		return
-	case novalue:
-		msg = "used as value"
-	case builtin:
-		msg = "must be called"
-	case typexpr:
-		msg = "is not an expression"
-	}
-	check.errorf(x.pos(), "%s %s", x, msg)
-	x.mode = invalid
-}
-
-// exprOrType typechecks expression or type e and initializes x with the expression value or type.
-// If an error occurred, x.mode is set to invalid.
-//
-func (check *Checker) exprOrType(x *operand, e ast.Expr) {
-	check.rawExpr(x, e, nil)
-	if x.mode == novalue {
-		check.errorf(x.pos(), "%s used as value or type", x)
-		x.mode = invalid
-	}
-}
diff --git a/third_party/gotools/go/types/exprstring.go b/third_party/gotools/go/types/exprstring.go
deleted file mode 100644
index 370bdf3..0000000
--- a/third_party/gotools/go/types/exprstring.go
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements printing of expressions.
-
-package types
-
-import (
-	"bytes"
-	"go/ast"
-)
-
-// ExprString returns the (possibly simplified) string representation for x.
-func ExprString(x ast.Expr) string {
-	var buf bytes.Buffer
-	WriteExpr(&buf, x)
-	return buf.String()
-}
-
-// WriteExpr writes the (possibly simplified) string representation for x to buf.
-func WriteExpr(buf *bytes.Buffer, x ast.Expr) {
-	// The AST preserves source-level parentheses so there is
-	// no need to introduce them here to correct for different
-	// operator precedences. (This assumes that the AST was
-	// generated by a Go parser.)
-
-	switch x := x.(type) {
-	default:
-		buf.WriteString("(bad expr)") // nil, ast.BadExpr, ast.KeyValueExpr
-
-	case *ast.Ident:
-		buf.WriteString(x.Name)
-
-	case *ast.Ellipsis:
-		buf.WriteString("...")
-		if x.Elt != nil {
-			WriteExpr(buf, x.Elt)
-		}
-
-	case *ast.BasicLit:
-		buf.WriteString(x.Value)
-
-	case *ast.FuncLit:
-		buf.WriteByte('(')
-		WriteExpr(buf, x.Type)
-		buf.WriteString(" literal)") // simplified
-
-	case *ast.CompositeLit:
-		buf.WriteByte('(')
-		WriteExpr(buf, x.Type)
-		buf.WriteString(" literal)") // simplified
-
-	case *ast.ParenExpr:
-		buf.WriteByte('(')
-		WriteExpr(buf, x.X)
-		buf.WriteByte(')')
-
-	case *ast.SelectorExpr:
-		WriteExpr(buf, x.X)
-		buf.WriteByte('.')
-		buf.WriteString(x.Sel.Name)
-
-	case *ast.IndexExpr:
-		WriteExpr(buf, x.X)
-		buf.WriteByte('[')
-		WriteExpr(buf, x.Index)
-		buf.WriteByte(']')
-
-	case *ast.SliceExpr:
-		WriteExpr(buf, x.X)
-		buf.WriteByte('[')
-		if x.Low != nil {
-			WriteExpr(buf, x.Low)
-		}
-		buf.WriteByte(':')
-		if x.High != nil {
-			WriteExpr(buf, x.High)
-		}
-		if x.Slice3 {
-			buf.WriteByte(':')
-			if x.Max != nil {
-				WriteExpr(buf, x.Max)
-			}
-		}
-		buf.WriteByte(']')
-
-	case *ast.TypeAssertExpr:
-		WriteExpr(buf, x.X)
-		buf.WriteString(".(")
-		WriteExpr(buf, x.Type)
-		buf.WriteByte(')')
-
-	case *ast.CallExpr:
-		WriteExpr(buf, x.Fun)
-		buf.WriteByte('(')
-		for i, arg := range x.Args {
-			if i > 0 {
-				buf.WriteString(", ")
-			}
-			WriteExpr(buf, arg)
-		}
-		if x.Ellipsis.IsValid() {
-			buf.WriteString("...")
-		}
-		buf.WriteByte(')')
-
-	case *ast.StarExpr:
-		buf.WriteByte('*')
-		WriteExpr(buf, x.X)
-
-	case *ast.UnaryExpr:
-		buf.WriteString(x.Op.String())
-		WriteExpr(buf, x.X)
-
-	case *ast.BinaryExpr:
-		WriteExpr(buf, x.X)
-		buf.WriteByte(' ')
-		buf.WriteString(x.Op.String())
-		buf.WriteByte(' ')
-		WriteExpr(buf, x.Y)
-
-	case *ast.ArrayType:
-		buf.WriteByte('[')
-		if x.Len != nil {
-			WriteExpr(buf, x.Len)
-		}
-		buf.WriteByte(']')
-		WriteExpr(buf, x.Elt)
-
-	case *ast.StructType:
-		buf.WriteString("struct{")
-		writeFieldList(buf, x.Fields, "; ", false)
-		buf.WriteByte('}')
-
-	case *ast.FuncType:
-		buf.WriteString("func")
-		writeSigExpr(buf, x)
-
-	case *ast.InterfaceType:
-		buf.WriteString("interface{")
-		writeFieldList(buf, x.Methods, "; ", true)
-		buf.WriteByte('}')
-
-	case *ast.MapType:
-		buf.WriteString("map[")
-		WriteExpr(buf, x.Key)
-		buf.WriteByte(']')
-		WriteExpr(buf, x.Value)
-
-	case *ast.ChanType:
-		var s string
-		switch x.Dir {
-		case ast.SEND:
-			s = "chan<- "
-		case ast.RECV:
-			s = "<-chan "
-		default:
-			s = "chan "
-		}
-		buf.WriteString(s)
-		WriteExpr(buf, x.Value)
-	}
-}
-
-func writeSigExpr(buf *bytes.Buffer, sig *ast.FuncType) {
-	buf.WriteByte('(')
-	writeFieldList(buf, sig.Params, ", ", false)
-	buf.WriteByte(')')
-
-	res := sig.Results
-	n := res.NumFields()
-	if n == 0 {
-		// no result
-		return
-	}
-
-	buf.WriteByte(' ')
-	if n == 1 && len(res.List[0].Names) == 0 {
-		// single unnamed result
-		WriteExpr(buf, res.List[0].Type)
-		return
-	}
-
-	// multiple or named result(s)
-	buf.WriteByte('(')
-	writeFieldList(buf, res, ", ", false)
-	buf.WriteByte(')')
-}
-
-func writeFieldList(buf *bytes.Buffer, fields *ast.FieldList, sep string, iface bool) {
-	for i, f := range fields.List {
-		if i > 0 {
-			buf.WriteString(sep)
-		}
-
-		// field list names
-		for i, name := range f.Names {
-			if i > 0 {
-				buf.WriteString(", ")
-			}
-			buf.WriteString(name.Name)
-		}
-
-		// types of interface methods consist of signatures only
-		if sig, _ := f.Type.(*ast.FuncType); sig != nil && iface {
-			writeSigExpr(buf, sig)
-			continue
-		}
-
-		// named fields are separated with a blank from the field type
-		if len(f.Names) > 0 {
-			buf.WriteByte(' ')
-		}
-
-		WriteExpr(buf, f.Type)
-
-		// ignore tag
-	}
-}
diff --git a/third_party/gotools/go/types/exprstring_test.go b/third_party/gotools/go/types/exprstring_test.go
deleted file mode 100644
index e5e8638..0000000
--- a/third_party/gotools/go/types/exprstring_test.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"go/parser"
-	"testing"
-
-	. "llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var testExprs = []testEntry{
-	// basic type literals
-	dup("x"),
-	dup("true"),
-	dup("42"),
-	dup("3.1415"),
-	dup("2.71828i"),
-	dup(`'a'`),
-	dup(`"foo"`),
-	dup("`bar`"),
-
-	// func and composite literals
-	{"func(){}", "(func() literal)"},
-	{"func(x int) complex128 {}", "(func(x int) complex128 literal)"},
-	{"[]int{1, 2, 3}", "([]int literal)"},
-
-	// non-type expressions
-	dup("(x)"),
-	dup("x.f"),
-	dup("a[i]"),
-
-	dup("s[:]"),
-	dup("s[i:]"),
-	dup("s[:j]"),
-	dup("s[i:j]"),
-	dup("s[:j:k]"),
-	dup("s[i:j:k]"),
-
-	dup("x.(T)"),
-
-	dup("x.([10]int)"),
-	dup("x.([...]int)"),
-
-	dup("x.(struct{})"),
-	dup("x.(struct{x int; y, z float32; E})"),
-
-	dup("x.(func())"),
-	dup("x.(func(x int))"),
-	dup("x.(func() int)"),
-	dup("x.(func(x, y int, z float32) (r int))"),
-	dup("x.(func(a, b, c int))"),
-	dup("x.(func(x ...T))"),
-
-	dup("x.(interface{})"),
-	dup("x.(interface{m(); n(x int); E})"),
-	dup("x.(interface{m(); n(x int) T; E; F})"),
-
-	dup("x.(map[K]V)"),
-
-	dup("x.(chan E)"),
-	dup("x.(<-chan E)"),
-	dup("x.(chan<- chan int)"),
-	dup("x.(chan<- <-chan int)"),
-	dup("x.(<-chan chan int)"),
-	dup("x.(chan (<-chan int))"),
-
-	dup("f()"),
-	dup("f(x)"),
-	dup("int(x)"),
-	dup("f(x, x + y)"),
-	dup("f(s...)"),
-	dup("f(a, s...)"),
-
-	dup("*x"),
-	dup("&x"),
-	dup("x + y"),
-	dup("x + y << (2 * s)"),
-}
-
-func TestExprString(t *testing.T) {
-	for _, test := range testExprs {
-		x, err := parser.ParseExpr(test.src)
-		if err != nil {
-			t.Errorf("%s: %s", test.src, err)
-			continue
-		}
-		if got := ExprString(x); got != test.str {
-			t.Errorf("%s: got %s, want %s", test.src, got, test.str)
-		}
-	}
-}
diff --git a/third_party/gotools/go/types/go11.go b/third_party/gotools/go/types/go11.go
deleted file mode 100644
index cf41cab..0000000
--- a/third_party/gotools/go/types/go11.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !go1.2
-
-package types
-
-import "go/ast"
-
-func slice3(x *ast.SliceExpr) bool {
-	return false
-}
-
-func sliceMax(x *ast.SliceExpr) ast.Expr {
-	return nil
-}
diff --git a/third_party/gotools/go/types/go12.go b/third_party/gotools/go/types/go12.go
deleted file mode 100644
index 2017442..0000000
--- a/third_party/gotools/go/types/go12.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build go1.2
-
-package types
-
-import "go/ast"
-
-func slice3(x *ast.SliceExpr) bool {
-	return x.Slice3
-}
-
-func sliceMax(x *ast.SliceExpr) ast.Expr {
-	return x.Max
-}
diff --git a/third_party/gotools/go/types/hilbert_test.go b/third_party/gotools/go/types/hilbert_test.go
deleted file mode 100644
index c472a6f..0000000
--- a/third_party/gotools/go/types/hilbert_test.go
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"bytes"
-	"flag"
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"io/ioutil"
-	"testing"
-
-	. "llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var (
-	H   = flag.Int("H", 5, "Hilbert matrix size")
-	out = flag.String("out", "", "write generated program to out")
-)
-
-func TestHilbert(t *testing.T) {
-	// generate source
-	src := program(*H, *out)
-	if *out != "" {
-		ioutil.WriteFile(*out, src, 0666)
-		return
-	}
-
-	// parse source
-	fset := token.NewFileSet()
-	f, err := parser.ParseFile(fset, "hilbert.go", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// type-check file
-	DefPredeclaredTestFuncs() // define assert built-in
-	_, err = Check(f.Name.Name, fset, []*ast.File{f})
-	if err != nil {
-		t.Fatal(err)
-	}
-}
-
-func program(n int, out string) []byte {
-	var g gen
-
-	g.p(`// WARNING: GENERATED FILE - DO NOT MODIFY MANUALLY!
-// (To generate, in go/types directory: go test -run=Hilbert -H=%d -out=%q)
-
-// This program tests arbitrary precision constant arithmetic
-// by generating the constant elements of a Hilbert matrix H,
-// its inverse I, and the product P = H*I. The product should
-// be the identity matrix.
-package main
-
-func main() {
-	if !ok {
-		printProduct()
-		return
-	}
-	println("PASS")
-}
-
-`, n, out)
-	g.hilbert(n)
-	g.inverse(n)
-	g.product(n)
-	g.verify(n)
-	g.printProduct(n)
-	g.binomials(2*n - 1)
-	g.factorials(2*n - 1)
-
-	return g.Bytes()
-}
-
-type gen struct {
-	bytes.Buffer
-}
-
-func (g *gen) p(format string, args ...interface{}) {
-	fmt.Fprintf(&g.Buffer, format, args...)
-}
-
-func (g *gen) hilbert(n int) {
-	g.p(`// Hilbert matrix, n = %d
-const (
-`, n)
-	for i := 0; i < n; i++ {
-		g.p("\t")
-		for j := 0; j < n; j++ {
-			if j > 0 {
-				g.p(", ")
-			}
-			g.p("h%d_%d", i, j)
-		}
-		if i == 0 {
-			g.p(" = ")
-			for j := 0; j < n; j++ {
-				if j > 0 {
-					g.p(", ")
-				}
-				g.p("1.0/(iota + %d)", j+1)
-			}
-		}
-		g.p("\n")
-	}
-	g.p(")\n\n")
-}
-
-func (g *gen) inverse(n int) {
-	g.p(`// Inverse Hilbert matrix
-const (
-`)
-	for i := 0; i < n; i++ {
-		for j := 0; j < n; j++ {
-			s := "+"
-			if (i+j)&1 != 0 {
-				s = "-"
-			}
-			g.p("\ti%d_%d = %s%d * b%d_%d * b%d_%d * b%d_%d * b%d_%d\n",
-				i, j, s, i+j+1, n+i, n-j-1, n+j, n-i-1, i+j, i, i+j, i)
-		}
-		g.p("\n")
-	}
-	g.p(")\n\n")
-}
-
-func (g *gen) product(n int) {
-	g.p(`// Product matrix
-const (
-`)
-	for i := 0; i < n; i++ {
-		for j := 0; j < n; j++ {
-			g.p("\tp%d_%d = ", i, j)
-			for k := 0; k < n; k++ {
-				if k > 0 {
-					g.p(" + ")
-				}
-				g.p("h%d_%d*i%d_%d", i, k, k, j)
-			}
-			g.p("\n")
-		}
-		g.p("\n")
-	}
-	g.p(")\n\n")
-}
-
-func (g *gen) verify(n int) {
-	g.p(`// Verify that product is the identity matrix
-const ok =
-`)
-	for i := 0; i < n; i++ {
-		for j := 0; j < n; j++ {
-			if j == 0 {
-				g.p("\t")
-			} else {
-				g.p(" && ")
-			}
-			v := 0
-			if i == j {
-				v = 1
-			}
-			g.p("p%d_%d == %d", i, j, v)
-		}
-		g.p(" &&\n")
-	}
-	g.p("\ttrue\n\n")
-
-	// verify ok at type-check time
-	if *out == "" {
-		g.p("const _ = assert(ok)\n\n")
-	}
-}
-
-func (g *gen) printProduct(n int) {
-	g.p("func printProduct() {\n")
-	for i := 0; i < n; i++ {
-		g.p("\tprintln(")
-		for j := 0; j < n; j++ {
-			if j > 0 {
-				g.p(", ")
-			}
-			g.p("p%d_%d", i, j)
-		}
-		g.p(")\n")
-	}
-	g.p("}\n\n")
-}
-
-func (g *gen) mulRange(a, b int) {
-	if a > b {
-		g.p("1")
-		return
-	}
-	for i := a; i <= b; i++ {
-		if i > a {
-			g.p("*")
-		}
-		g.p("%d", i)
-	}
-}
-
-func (g *gen) binomials(n int) {
-	g.p(`// Binomials
-const (
-`)
-	for j := 0; j <= n; j++ {
-		if j > 0 {
-			g.p("\n")
-		}
-		for k := 0; k <= j; k++ {
-			g.p("\tb%d_%d = f%d / (f%d*f%d)\n", j, k, j, k, j-k)
-		}
-	}
-	g.p(")\n\n")
-}
-
-func (g *gen) factorials(n int) {
-	g.p(`// Factorials
-const (
-	f0 = 1
-	f1 = 1
-`)
-	for i := 2; i <= n; i++ {
-		g.p("\tf%d = f%d * %d\n", i, i-1, i)
-	}
-	g.p(")\n\n")
-}
diff --git a/third_party/gotools/go/types/initorder.go b/third_party/gotools/go/types/initorder.go
deleted file mode 100644
index 0fd567b..0000000
--- a/third_party/gotools/go/types/initorder.go
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import (
-	"container/heap"
-	"fmt"
-)
-
-// initOrder computes the Info.InitOrder for package variables.
-func (check *Checker) initOrder() {
-	// An InitOrder may already have been computed if a package is
-	// built from several calls to (*Checker).Files.  Clear it.
-	check.Info.InitOrder = check.Info.InitOrder[:0]
-
-	// compute the object dependency graph and
-	// initialize a priority queue with the list
-	// of graph nodes
-	pq := nodeQueue(dependencyGraph(check.objMap))
-	heap.Init(&pq)
-
-	const debug = false
-	if debug {
-		fmt.Printf("package %s: object dependency graph\n", check.pkg.Name())
-		for _, n := range pq {
-			for _, o := range n.out {
-				fmt.Printf("\t%s -> %s\n", n.obj.Name(), o.obj.Name())
-			}
-		}
-		fmt.Println()
-		fmt.Printf("package %s: initialization order\n", check.pkg.Name())
-	}
-
-	// determine initialization order by removing the highest priority node
-	// (the one with the fewest dependencies) and its edges from the graph,
-	// repeatedly, until there are no nodes left.
-	// In a valid Go program, those nodes always have zero dependencies (after
-	// removing all incoming dependencies), otherwise there are initialization
-	// cycles.
-	mark := 0
-	emitted := make(map[*declInfo]bool)
-	for len(pq) > 0 {
-		// get the next node
-		n := heap.Pop(&pq).(*objNode)
-
-		// if n still depends on other nodes, we have a cycle
-		if n.in > 0 {
-			mark++ // mark nodes using a different value each time
-			cycle := findPath(n, n, mark)
-			if i := valIndex(cycle); i >= 0 {
-				check.reportCycle(cycle, i)
-			}
-			// ok to continue, but the variable initialization order
-			// will be incorrect at this point since it assumes no
-			// cycle errors
-		}
-
-		// reduce dependency count of all dependent nodes
-		// and update priority queue
-		for _, out := range n.out {
-			out.in--
-			heap.Fix(&pq, out.index)
-		}
-
-		// record the init order for variables with initializers only
-		v, _ := n.obj.(*Var)
-		info := check.objMap[v]
-		if v == nil || !info.hasInitializer() {
-			continue
-		}
-
-		// n:1 variable declarations such as: a, b = f()
-		// introduce a node for each lhs variable (here: a, b);
-		// but they all have the same initializer - emit only
-		// one, for the first variable seen
-		if emitted[info] {
-			continue // initializer already emitted, if any
-		}
-		emitted[info] = true
-
-		infoLhs := info.lhs // possibly nil (see declInfo.lhs field comment)
-		if infoLhs == nil {
-			infoLhs = []*Var{v}
-		}
-		init := &Initializer{infoLhs, info.init}
-		check.Info.InitOrder = append(check.Info.InitOrder, init)
-
-		if debug {
-			fmt.Printf("\t%s\n", init)
-		}
-	}
-
-	if debug {
-		fmt.Println()
-	}
-}
-
-// findPath returns the (reversed) list of nodes z, ... c, b, a,
-// such that there is a path (list of edges) from a to z.
-// If there is no such path, the result is nil.
-// Nodes marked with the value mark are considered "visited";
-// unvisited nodes are marked during the graph search.
-func findPath(a, z *objNode, mark int) []*objNode {
-	if a.mark == mark {
-		return nil // node already seen
-	}
-	a.mark = mark
-
-	for _, n := range a.out {
-		if n == z {
-			return []*objNode{z}
-		}
-		if P := findPath(n, z, mark); P != nil {
-			return append(P, n)
-		}
-	}
-
-	return nil
-}
-
-// valIndex returns the index of the first constant or variable in a,
-// if any; or a value < 0.
-func valIndex(a []*objNode) int {
-	for i, n := range a {
-		switch n.obj.(type) {
-		case *Const, *Var:
-			return i
-		}
-	}
-	return -1
-}
-
-// reportCycle reports an error for the cycle starting at i.
-func (check *Checker) reportCycle(cycle []*objNode, i int) {
-	obj := cycle[i].obj
-	check.errorf(obj.Pos(), "initialization cycle for %s", obj.Name())
-	// print cycle
-	for _ = range cycle {
-		check.errorf(obj.Pos(), "\t%s refers to", obj.Name()) // secondary error, \t indented
-		i++
-		if i >= len(cycle) {
-			i = 0
-		}
-		obj = cycle[i].obj
-	}
-	check.errorf(obj.Pos(), "\t%s", obj.Name())
-}
-
-// An objNode represents a node in the object dependency graph.
-// Each node b in a.out represents an edge a->b indicating that
-// b depends on a.
-// Nodes may be marked for cycle detection. A node n is marked
-// if n.mark corresponds to the current mark value.
-type objNode struct {
-	obj   Object     // object represented by this node
-	in    int        // number of nodes this node depends on
-	out   []*objNode // list of nodes that depend on this node
-	index int        // node index in list of nodes
-	mark  int        // for cycle detection
-}
-
-// dependencyGraph computes the transposed object dependency graph
-// from the given objMap. The transposed graph is returned as a list
-// of nodes; an edge d->n indicates that node n depends on node d.
-func dependencyGraph(objMap map[Object]*declInfo) []*objNode {
-	// M maps each object to its corresponding node
-	M := make(map[Object]*objNode, len(objMap))
-	for obj := range objMap {
-		M[obj] = &objNode{obj: obj}
-	}
-
-	// G is the graph of nodes n
-	G := make([]*objNode, len(M))
-	i := 0
-	for obj, n := range M {
-		deps := objMap[obj].deps
-		n.in = len(deps)
-		for d := range deps {
-			d := M[d]                // node n depends on node d
-			d.out = append(d.out, n) // add edge d->n
-		}
-
-		G[i] = n
-		n.index = i
-		i++
-	}
-
-	return G
-}
-
-// nodeQueue implements the container/heap interface;
-// a nodeQueue may be used as a priority queue.
-type nodeQueue []*objNode
-
-func (a nodeQueue) Len() int { return len(a) }
-
-func (a nodeQueue) Swap(i, j int) {
-	x, y := a[i], a[j]
-	a[i], a[j] = y, x
-	x.index, y.index = j, i
-}
-
-func (a nodeQueue) Less(i, j int) bool {
-	x, y := a[i], a[j]
-	// nodes are prioritized by number of incoming dependencies (1st key)
-	// and source order (2nd key)
-	return x.in < y.in || x.in == y.in && x.obj.order() < y.obj.order()
-}
-
-func (a *nodeQueue) Push(x interface{}) {
-	panic("unreachable")
-}
-
-func (a *nodeQueue) Pop() interface{} {
-	n := len(*a)
-	x := (*a)[n-1]
-	x.index = -1 // for safety
-	*a = (*a)[:n-1]
-	return x
-}
diff --git a/third_party/gotools/go/types/issues_test.go b/third_party/gotools/go/types/issues_test.go
deleted file mode 100644
index 8681721..0000000
--- a/third_party/gotools/go/types/issues_test.go
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements tests for various issues.
-
-package types_test
-
-import (
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"sort"
-	"strings"
-	"testing"
-
-	_ "llvm.org/llgo/third_party/gotools/go/gcimporter"
-	. "llvm.org/llgo/third_party/gotools/go/types"
-)
-
-func TestIssue5770(t *testing.T) {
-	src := `package p; type S struct{T}`
-	f, err := parser.ParseFile(fset, "", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	_, err = Check(f.Name.Name, fset, []*ast.File{f}) // do not crash
-	want := "undeclared name: T"
-	if err == nil || !strings.Contains(err.Error(), want) {
-		t.Errorf("got: %v; want: %s", err, want)
-	}
-}
-
-func TestIssue5849(t *testing.T) {
-	src := `
-package p
-var (
-	s uint
-	_ = uint8(8)
-	_ = uint16(16) << s
-	_ = uint32(32 << s)
-	_ = uint64(64 << s + s)
-	_ = (interface{})("foo")
-	_ = (interface{})(nil)
-)`
-	f, err := parser.ParseFile(fset, "", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	var conf Config
-	types := make(map[ast.Expr]TypeAndValue)
-	_, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Types: types})
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	for x, tv := range types {
-		var want Type
-		switch x := x.(type) {
-		case *ast.BasicLit:
-			switch x.Value {
-			case `8`:
-				want = Typ[Uint8]
-			case `16`:
-				want = Typ[Uint16]
-			case `32`:
-				want = Typ[Uint32]
-			case `64`:
-				want = Typ[Uint] // because of "+ s", s is of type uint
-			case `"foo"`:
-				want = Typ[String]
-			}
-		case *ast.Ident:
-			if x.Name == "nil" {
-				want = Typ[UntypedNil]
-			}
-		}
-		if want != nil && !Identical(tv.Type, want) {
-			t.Errorf("got %s; want %s", tv.Type, want)
-		}
-	}
-}
-
-func TestIssue6413(t *testing.T) {
-	src := `
-package p
-func f() int {
-	defer f()
-	go f()
-	return 0
-}
-`
-	f, err := parser.ParseFile(fset, "", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	var conf Config
-	types := make(map[ast.Expr]TypeAndValue)
-	_, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Types: types})
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	want := Typ[Int]
-	n := 0
-	for x, tv := range types {
-		if _, ok := x.(*ast.CallExpr); ok {
-			if tv.Type != want {
-				t.Errorf("%s: got %s; want %s", fset.Position(x.Pos()), tv.Type, want)
-			}
-			n++
-		}
-	}
-
-	if n != 2 {
-		t.Errorf("got %d CallExprs; want 2", n)
-	}
-}
-
-func TestIssue7245(t *testing.T) {
-	src := `
-package p
-func (T) m() (res bool) { return }
-type T struct{} // receiver type after method declaration
-`
-	f, err := parser.ParseFile(fset, "", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	var conf Config
-	defs := make(map[*ast.Ident]Object)
-	_, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Defs: defs})
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	m := f.Decls[0].(*ast.FuncDecl)
-	res1 := defs[m.Name].(*Func).Type().(*Signature).Results().At(0)
-	res2 := defs[m.Type.Results.List[0].Names[0]].(*Var)
-
-	if res1 != res2 {
-		t.Errorf("got %s (%p) != %s (%p)", res1, res2, res1, res2)
-	}
-}
-
-// This tests that uses of existing vars on the LHS of an assignment
-// are Uses, not Defs; and also that the (illegal) use of a non-var on
-// the LHS of an assignment is a Use nonetheless.
-func TestIssue7827(t *testing.T) {
-	const src = `
-package p
-func _() {
-	const w = 1        // defs w
-        x, y := 2, 3       // defs x, y
-        w, x, z := 4, 5, 6 // uses w, x, defs z; error: cannot assign to w
-        _, _, _ = x, y, z  // uses x, y, z
-}
-`
-	const want = `L3 defs func p._()
-L4 defs const w untyped int
-L5 defs var x int
-L5 defs var y int
-L6 defs var z int
-L6 uses const w untyped int
-L6 uses var x int
-L7 uses var x int
-L7 uses var y int
-L7 uses var z int`
-
-	f, err := parser.ParseFile(fset, "", src, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// don't abort at the first error
-	conf := Config{Error: func(err error) { t.Log(err) }}
-	defs := make(map[*ast.Ident]Object)
-	uses := make(map[*ast.Ident]Object)
-	_, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Defs: defs, Uses: uses})
-	if s := fmt.Sprint(err); !strings.HasSuffix(s, "cannot assign to w") {
-		t.Errorf("Check: unexpected error: %s", s)
-	}
-
-	var facts []string
-	for id, obj := range defs {
-		if obj != nil {
-			fact := fmt.Sprintf("L%d defs %s", fset.Position(id.Pos()).Line, obj)
-			facts = append(facts, fact)
-		}
-	}
-	for id, obj := range uses {
-		fact := fmt.Sprintf("L%d uses %s", fset.Position(id.Pos()).Line, obj)
-		facts = append(facts, fact)
-	}
-	sort.Strings(facts)
-
-	got := strings.Join(facts, "\n")
-	if got != want {
-		t.Errorf("Unexpected defs/uses\ngot:\n%s\nwant:\n%s", got, want)
-	}
-}
diff --git a/third_party/gotools/go/types/labels.go b/third_party/gotools/go/types/labels.go
deleted file mode 100644
index d6ffc52..0000000
--- a/third_party/gotools/go/types/labels.go
+++ /dev/null
@@ -1,268 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import (
-	"go/ast"
-	"go/token"
-)
-
-// labels checks correct label use in body.
-func (check *Checker) labels(body *ast.BlockStmt) {
-	// set of all labels in this body
-	all := NewScope(nil, "label")
-
-	fwdJumps := check.blockBranches(all, nil, nil, body.List)
-
-	// If there are any forward jumps left, no label was found for
-	// the corresponding goto statements. Either those labels were
-	// never defined, or they are inside blocks and not reachable
-	// for the respective gotos.
-	for _, jmp := range fwdJumps {
-		var msg string
-		name := jmp.Label.Name
-		if alt := all.Lookup(name); alt != nil {
-			msg = "goto %s jumps into block"
-			alt.(*Label).used = true // avoid another error
-		} else {
-			msg = "label %s not declared"
-		}
-		check.errorf(jmp.Label.Pos(), msg, name)
-	}
-
-	// spec: "It is illegal to define a label that is never used."
-	for _, obj := range all.elems {
-		if lbl := obj.(*Label); !lbl.used {
-			check.softErrorf(lbl.pos, "label %s declared but not used", lbl.name)
-		}
-	}
-}
-
-// A block tracks label declarations in a block and its enclosing blocks.
-type block struct {
-	parent *block                      // enclosing block
-	lstmt  *ast.LabeledStmt            // labeled statement to which this block belongs, or nil
-	labels map[string]*ast.LabeledStmt // allocated lazily
-}
-
-// insert records a new label declaration for the current block.
-// The label must not have been declared before in any block.
-func (b *block) insert(s *ast.LabeledStmt) {
-	name := s.Label.Name
-	if debug {
-		assert(b.gotoTarget(name) == nil)
-	}
-	labels := b.labels
-	if labels == nil {
-		labels = make(map[string]*ast.LabeledStmt)
-		b.labels = labels
-	}
-	labels[name] = s
-}
-
-// gotoTarget returns the labeled statement in the current
-// or an enclosing block with the given label name, or nil.
-func (b *block) gotoTarget(name string) *ast.LabeledStmt {
-	for s := b; s != nil; s = s.parent {
-		if t := s.labels[name]; t != nil {
-			return t
-		}
-	}
-	return nil
-}
-
-// enclosingTarget returns the innermost enclosing labeled
-// statement with the given label name, or nil.
-func (b *block) enclosingTarget(name string) *ast.LabeledStmt {
-	for s := b; s != nil; s = s.parent {
-		if t := s.lstmt; t != nil && t.Label.Name == name {
-			return t
-		}
-	}
-	return nil
-}
-
-// blockBranches processes a block's statement list and returns the set of outgoing forward jumps.
-// all is the scope of all declared labels, parent the set of labels declared in the immediately
-// enclosing block, and lstmt is the labeled statement this block is associated with (or nil).
-func (check *Checker) blockBranches(all *Scope, parent *block, lstmt *ast.LabeledStmt, list []ast.Stmt) []*ast.BranchStmt {
-	b := &block{parent: parent, lstmt: lstmt}
-
-	var (
-		varDeclPos         token.Pos
-		fwdJumps, badJumps []*ast.BranchStmt
-	)
-
-	// All forward jumps jumping over a variable declaration are possibly
-	// invalid (they may still jump out of the block and be ok).
-	// recordVarDecl records them for the given position.
-	recordVarDecl := func(pos token.Pos) {
-		varDeclPos = pos
-		badJumps = append(badJumps[:0], fwdJumps...) // copy fwdJumps to badJumps
-	}
-
-	jumpsOverVarDecl := func(jmp *ast.BranchStmt) bool {
-		if varDeclPos.IsValid() {
-			for _, bad := range badJumps {
-				if jmp == bad {
-					return true
-				}
-			}
-		}
-		return false
-	}
-
-	blockBranches := func(lstmt *ast.LabeledStmt, list []ast.Stmt) {
-		// Unresolved forward jumps inside the nested block
-		// become forward jumps in the current block.
-		fwdJumps = append(fwdJumps, check.blockBranches(all, b, lstmt, list)...)
-	}
-
-	var stmtBranches func(ast.Stmt)
-	stmtBranches = func(s ast.Stmt) {
-		switch s := s.(type) {
-		case *ast.DeclStmt:
-			if d, _ := s.Decl.(*ast.GenDecl); d != nil && d.Tok == token.VAR {
-				recordVarDecl(d.Pos())
-			}
-
-		case *ast.LabeledStmt:
-			// declare non-blank label
-			if name := s.Label.Name; name != "_" {
-				lbl := NewLabel(s.Label.Pos(), check.pkg, name)
-				if alt := all.Insert(lbl); alt != nil {
-					check.softErrorf(lbl.pos, "label %s already declared", name)
-					check.reportAltDecl(alt)
-					// ok to continue
-				} else {
-					b.insert(s)
-					check.recordDef(s.Label, lbl)
-				}
-				// resolve matching forward jumps and remove them from fwdJumps
-				i := 0
-				for _, jmp := range fwdJumps {
-					if jmp.Label.Name == name {
-						// match
-						lbl.used = true
-						check.recordUse(jmp.Label, lbl)
-						if jumpsOverVarDecl(jmp) {
-							check.softErrorf(
-								jmp.Label.Pos(),
-								"goto %s jumps over variable declaration at line %d",
-								name,
-								check.fset.Position(varDeclPos).Line,
-							)
-							// ok to continue
-						}
-					} else {
-						// no match - record new forward jump
-						fwdJumps[i] = jmp
-						i++
-					}
-				}
-				fwdJumps = fwdJumps[:i]
-				lstmt = s
-			}
-			stmtBranches(s.Stmt)
-
-		case *ast.BranchStmt:
-			if s.Label == nil {
-				return // checked in 1st pass (check.stmt)
-			}
-
-			// determine and validate target
-			name := s.Label.Name
-			switch s.Tok {
-			case token.BREAK:
-				// spec: "If there is a label, it must be that of an enclosing
-				// "for", "switch", or "select" statement, and that is the one
-				// whose execution terminates."
-				valid := false
-				if t := b.enclosingTarget(name); t != nil {
-					switch t.Stmt.(type) {
-					case *ast.SwitchStmt, *ast.TypeSwitchStmt, *ast.SelectStmt, *ast.ForStmt, *ast.RangeStmt:
-						valid = true
-					}
-				}
-				if !valid {
-					check.errorf(s.Label.Pos(), "invalid break label %s", name)
-					return
-				}
-
-			case token.CONTINUE:
-				// spec: "If there is a label, it must be that of an enclosing
-				// "for" statement, and that is the one whose execution advances."
-				valid := false
-				if t := b.enclosingTarget(name); t != nil {
-					switch t.Stmt.(type) {
-					case *ast.ForStmt, *ast.RangeStmt:
-						valid = true
-					}
-				}
-				if !valid {
-					check.errorf(s.Label.Pos(), "invalid continue label %s", name)
-					return
-				}
-
-			case token.GOTO:
-				if b.gotoTarget(name) == nil {
-					// label may be declared later - add branch to forward jumps
-					fwdJumps = append(fwdJumps, s)
-					return
-				}
-
-			default:
-				check.invalidAST(s.Pos(), "branch statement: %s %s", s.Tok, name)
-				return
-			}
-
-			// record label use
-			obj := all.Lookup(name)
-			obj.(*Label).used = true
-			check.recordUse(s.Label, obj)
-
-		case *ast.AssignStmt:
-			if s.Tok == token.DEFINE {
-				recordVarDecl(s.Pos())
-			}
-
-		case *ast.BlockStmt:
-			blockBranches(lstmt, s.List)
-
-		case *ast.IfStmt:
-			stmtBranches(s.Body)
-			if s.Else != nil {
-				stmtBranches(s.Else)
-			}
-
-		case *ast.CaseClause:
-			blockBranches(nil, s.Body)
-
-		case *ast.SwitchStmt:
-			stmtBranches(s.Body)
-
-		case *ast.TypeSwitchStmt:
-			stmtBranches(s.Body)
-
-		case *ast.CommClause:
-			blockBranches(nil, s.Body)
-
-		case *ast.SelectStmt:
-			stmtBranches(s.Body)
-
-		case *ast.ForStmt:
-			stmtBranches(s.Body)
-
-		case *ast.RangeStmt:
-			stmtBranches(s.Body)
-		}
-	}
-
-	for _, s := range list {
-		stmtBranches(s)
-	}
-
-	return fwdJumps
-}
diff --git a/third_party/gotools/go/types/lookup.go b/third_party/gotools/go/types/lookup.go
deleted file mode 100644
index 3caca55..0000000
--- a/third_party/gotools/go/types/lookup.go
+++ /dev/null
@@ -1,341 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements various field and method lookup functions.
-
-package types
-
-// LookupFieldOrMethod looks up a field or method with given package and name
-// in T and returns the corresponding *Var or *Func, an index sequence, and a
-// bool indicating if there were any pointer indirections on the path to the
-// field or method. If addressable is set, T is the type of an addressable
-// variable (only matters for method lookups).
-//
-// The last index entry is the field or method index in the (possibly embedded)
-// type where the entry was found, either:
-//
-//	1) the list of declared methods of a named type; or
-//	2) the list of all methods (method set) of an interface type; or
-//	3) the list of fields of a struct type.
-//
-// The earlier index entries are the indices of the anonymous struct fields
-// traversed to get to the found entry, starting at depth 0.
-//
-// If no entry is found, a nil object is returned. In this case, the returned
-// index and indirect values have the following meaning:
-//
-//	- If index != nil, the index sequence points to an ambiguous entry
-//	(the same name appeared more than once at the same embedding level).
-//
-//	- If indirect is set, a method with a pointer receiver type was found
-//      but there was no pointer on the path from the actual receiver type to
-//	the method's formal receiver base type, nor was the receiver addressable.
-//
-func LookupFieldOrMethod(T Type, addressable bool, pkg *Package, name string) (obj Object, index []int, indirect bool) {
-	// Methods cannot be associated to a named pointer type
-	// (spec: "The type denoted by T is called the receiver base type;
-	// it must not be a pointer or interface type and it must be declared
-	// in the same package as the method.").
-	// Thus, if we have a named pointer type, proceed with the underlying
-	// pointer type but discard the result if it is a method since we would
-	// not have found it for T (see also issue 8590).
-	if t, _ := T.(*Named); t != nil {
-		if p, _ := t.underlying.(*Pointer); p != nil {
-			obj, index, indirect = lookupFieldOrMethod(p, false, pkg, name)
-			if _, ok := obj.(*Func); ok {
-				return nil, nil, false
-			}
-			return
-		}
-	}
-
-	return lookupFieldOrMethod(T, addressable, pkg, name)
-}
-
-// TODO(gri) The named type consolidation and seen maps below must be
-//           indexed by unique keys for a given type. Verify that named
-//           types always have only one representation (even when imported
-//           indirectly via different packages.)
-
-func lookupFieldOrMethod(T Type, addressable bool, pkg *Package, name string) (obj Object, index []int, indirect bool) {
-	// WARNING: The code in this function is extremely subtle - do not modify casually!
-	//          This function and NewMethodSet should be kept in sync.
-
-	if name == "_" {
-		return // blank fields/methods are never found
-	}
-
-	typ, isPtr := deref(T)
-	named, _ := typ.(*Named)
-
-	// *typ where typ is an interface has no methods.
-	if isPtr {
-		utyp := typ
-		if named != nil {
-			utyp = named.underlying
-		}
-		if _, ok := utyp.(*Interface); ok {
-			return
-		}
-	}
-
-	// Start with typ as single entry at shallowest depth.
-	// If typ is not a named type, insert a nil type instead.
-	current := []embeddedType{{named, nil, isPtr, false}}
-
-	// named types that we have seen already, allocated lazily
-	var seen map[*Named]bool
-
-	// search current depth
-	for len(current) > 0 {
-		var next []embeddedType // embedded types found at current depth
-
-		// look for (pkg, name) in all types at current depth
-		for _, e := range current {
-			// The very first time only, e.typ may be nil.
-			// In this case, we don't have a named type and
-			// we simply continue with the underlying type.
-			if e.typ != nil {
-				if seen[e.typ] {
-					// We have seen this type before, at a more shallow depth
-					// (note that multiples of this type at the current depth
-					// were consolidated before). The type at that depth shadows
-					// this same type at the current depth, so we can ignore
-					// this one.
-					continue
-				}
-				if seen == nil {
-					seen = make(map[*Named]bool)
-				}
-				seen[e.typ] = true
-
-				// look for a matching attached method
-				if i, m := lookupMethod(e.typ.methods, pkg, name); m != nil {
-					// potential match
-					assert(m.typ != nil)
-					index = concat(e.index, i)
-					if obj != nil || e.multiples {
-						return nil, index, false // collision
-					}
-					obj = m
-					indirect = e.indirect
-					continue // we can't have a matching field or interface method
-				}
-
-				// continue with underlying type
-				typ = e.typ.underlying
-			}
-
-			switch t := typ.(type) {
-			case *Struct:
-				// look for a matching field and collect embedded types
-				for i, f := range t.fields {
-					if f.sameId(pkg, name) {
-						assert(f.typ != nil)
-						index = concat(e.index, i)
-						if obj != nil || e.multiples {
-							return nil, index, false // collision
-						}
-						obj = f
-						indirect = e.indirect
-						continue // we can't have a matching interface method
-					}
-					// Collect embedded struct fields for searching the next
-					// lower depth, but only if we have not seen a match yet
-					// (if we have a match it is either the desired field or
-					// we have a name collision on the same depth; in either
-					// case we don't need to look further).
-					// Embedded fields are always of the form T or *T where
-					// T is a named type. If e.typ appeared multiple times at
-					// this depth, f.typ appears multiple times at the next
-					// depth.
-					if obj == nil && f.anonymous {
-						// Ignore embedded basic types - only user-defined
-						// named types can have methods or struct fields.
-						typ, isPtr := deref(f.typ)
-						if t, _ := typ.(*Named); t != nil {
-							next = append(next, embeddedType{t, concat(e.index, i), e.indirect || isPtr, e.multiples})
-						}
-					}
-				}
-
-			case *Interface:
-				// look for a matching method
-				// TODO(gri) t.allMethods is sorted - use binary search
-				if i, m := lookupMethod(t.allMethods, pkg, name); m != nil {
-					assert(m.typ != nil)
-					index = concat(e.index, i)
-					if obj != nil || e.multiples {
-						return nil, index, false // collision
-					}
-					obj = m
-					indirect = e.indirect
-				}
-			}
-		}
-
-		if obj != nil {
-			// found a potential match
-			// spec: "A method call x.m() is valid if the method set of (the type of) x
-			//        contains m and the argument list can be assigned to the parameter
-			//        list of m. If x is addressable and &x's method set contains m, x.m()
-			//        is shorthand for (&x).m()".
-			if f, _ := obj.(*Func); f != nil && ptrRecv(f) && !indirect && !addressable {
-				return nil, nil, true // pointer/addressable receiver required
-			}
-			return
-		}
-
-		current = consolidateMultiples(next)
-	}
-
-	return nil, nil, false // not found
-}
-
-// embeddedType represents an embedded named type
-type embeddedType struct {
-	typ       *Named // nil means use the outer typ variable instead
-	index     []int  // embedded field indices, starting with index at depth 0
-	indirect  bool   // if set, there was a pointer indirection on the path to this field
-	multiples bool   // if set, typ appears multiple times at this depth
-}
-
-// consolidateMultiples collects multiple list entries with the same type
-// into a single entry marked as containing multiples. The result is the
-// consolidated list.
-func consolidateMultiples(list []embeddedType) []embeddedType {
-	if len(list) <= 1 {
-		return list // at most one entry - nothing to do
-	}
-
-	n := 0                       // number of entries w/ unique type
-	prev := make(map[*Named]int) // index at which type was previously seen
-	for _, e := range list {
-		if i, found := prev[e.typ]; found {
-			list[i].multiples = true
-			// ignore this entry
-		} else {
-			prev[e.typ] = n
-			list[n] = e
-			n++
-		}
-	}
-	return list[:n]
-}
-
-// MissingMethod returns (nil, false) if V implements T, otherwise it
-// returns a missing method required by T and whether it is missing or
-// just has the wrong type.
-//
-// For non-interface types V, or if static is set, V implements T if all
-// methods of T are present in V. Otherwise (V is an interface and static
-// is not set), MissingMethod only checks that methods of T which are also
-// present in V have matching types (e.g., for a type assertion x.(T) where
-// x is of interface type V).
-//
-func MissingMethod(V Type, T *Interface, static bool) (method *Func, wrongType bool) {
-	// fast path for common case
-	if T.Empty() {
-		return
-	}
-
-	// TODO(gri) Consider using method sets here. Might be more efficient.
-
-	if ityp, _ := V.Underlying().(*Interface); ityp != nil {
-		// TODO(gri) allMethods is sorted - can do this more efficiently
-		for _, m := range T.allMethods {
-			_, obj := lookupMethod(ityp.allMethods, m.pkg, m.name)
-			switch {
-			case obj == nil:
-				if static {
-					return m, false
-				}
-			case !Identical(obj.Type(), m.typ):
-				return m, true
-			}
-		}
-		return
-	}
-
-	// A concrete type implements T if it implements all methods of T.
-	for _, m := range T.allMethods {
-		obj, _, _ := lookupFieldOrMethod(V, false, m.pkg, m.name)
-
-		f, _ := obj.(*Func)
-		if f == nil {
-			return m, false
-		}
-
-		if !Identical(f.typ, m.typ) {
-			return m, true
-		}
-	}
-
-	return
-}
-
-// assertableTo reports whether a value of type V can be asserted to have type T.
-// It returns (nil, false) as affirmative answer. Otherwise it returns a missing
-// method required by V and whether it is missing or just has the wrong type.
-func assertableTo(V *Interface, T Type) (method *Func, wrongType bool) {
-	// no static check is required if T is an interface
-	// spec: "If T is an interface type, x.(T) asserts that the
-	//        dynamic type of x implements the interface T."
-	if _, ok := T.Underlying().(*Interface); ok && !strict {
-		return
-	}
-	return MissingMethod(T, V, false)
-}
-
-// deref dereferences typ if it is a *Pointer and returns its base and true.
-// Otherwise it returns (typ, false).
-func deref(typ Type) (Type, bool) {
-	if p, _ := typ.(*Pointer); p != nil {
-		return p.base, true
-	}
-	return typ, false
-}
-
-// derefStructPtr dereferences typ if it is a (named or unnamed) pointer to a
-// (named or unnamed) struct and returns its base. Otherwise it returns typ.
-func derefStructPtr(typ Type) Type {
-	if p, _ := typ.Underlying().(*Pointer); p != nil {
-		if _, ok := p.base.Underlying().(*Struct); ok {
-			return p.base
-		}
-	}
-	return typ
-}
-
-// concat returns the result of concatenating list and i.
-// The result does not share its underlying array with list.
-func concat(list []int, i int) []int {
-	var t []int
-	t = append(t, list...)
-	return append(t, i)
-}
-
-// fieldIndex returns the index for the field with matching package and name, or a value < 0.
-func fieldIndex(fields []*Var, pkg *Package, name string) int {
-	if name != "_" {
-		for i, f := range fields {
-			if f.sameId(pkg, name) {
-				return i
-			}
-		}
-	}
-	return -1
-}
-
-// lookupMethod returns the index of and method with matching package and name, or (-1, nil).
-func lookupMethod(methods []*Func, pkg *Package, name string) (int, *Func) {
-	if name != "_" {
-		for i, m := range methods {
-			if m.sameId(pkg, name) {
-				return i, m
-			}
-		}
-	}
-	return -1, nil
-}
diff --git a/third_party/gotools/go/types/methodset.go b/third_party/gotools/go/types/methodset.go
deleted file mode 100644
index 8aff6f9..0000000
--- a/third_party/gotools/go/types/methodset.go
+++ /dev/null
@@ -1,271 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements method sets.
-
-package types
-
-import (
-	"bytes"
-	"fmt"
-	"sort"
-)
-
-// A MethodSet is an ordered set of concrete or abstract (interface) methods;
-// a method is a MethodVal selection, and they are ordered by ascending m.Obj().Id().
-// The zero value for a MethodSet is a ready-to-use empty method set.
-type MethodSet struct {
-	list []*Selection
-}
-
-func (s *MethodSet) String() string {
-	if s.Len() == 0 {
-		return "MethodSet {}"
-	}
-
-	var buf bytes.Buffer
-	fmt.Fprintln(&buf, "MethodSet {")
-	for _, f := range s.list {
-		fmt.Fprintf(&buf, "\t%s\n", f)
-	}
-	fmt.Fprintln(&buf, "}")
-	return buf.String()
-}
-
-// Len returns the number of methods in s.
-func (s *MethodSet) Len() int { return len(s.list) }
-
-// At returns the i'th method in s for 0 <= i < s.Len().
-func (s *MethodSet) At(i int) *Selection { return s.list[i] }
-
-// Lookup returns the method with matching package and name, or nil if not found.
-func (s *MethodSet) Lookup(pkg *Package, name string) *Selection {
-	if s.Len() == 0 {
-		return nil
-	}
-
-	key := Id(pkg, name)
-	i := sort.Search(len(s.list), func(i int) bool {
-		m := s.list[i]
-		return m.obj.Id() >= key
-	})
-	if i < len(s.list) {
-		m := s.list[i]
-		if m.obj.Id() == key {
-			return m
-		}
-	}
-	return nil
-}
-
-// Shared empty method set.
-var emptyMethodSet MethodSet
-
-// NewMethodSet returns the method set for the given type T.  It
-// always returns a non-nil method set, even if it is empty.
-//
-// A MethodSetCache handles repeat queries more efficiently.
-//
-func NewMethodSet(T Type) *MethodSet {
-	// WARNING: The code in this function is extremely subtle - do not modify casually!
-	//          This function and lookupFieldOrMethod should be kept in sync.
-
-	// method set up to the current depth, allocated lazily
-	var base methodSet
-
-	typ, isPtr := deref(T)
-	named, _ := typ.(*Named)
-
-	// *typ where typ is an interface has no methods.
-	if isPtr {
-		utyp := typ
-		if named != nil {
-			utyp = named.underlying
-		}
-		if _, ok := utyp.(*Interface); ok {
-			return &emptyMethodSet
-		}
-	}
-
-	// Start with typ as single entry at shallowest depth.
-	// If typ is not a named type, insert a nil type instead.
-	current := []embeddedType{{named, nil, isPtr, false}}
-
-	// named types that we have seen already, allocated lazily
-	var seen map[*Named]bool
-
-	// collect methods at current depth
-	for len(current) > 0 {
-		var next []embeddedType // embedded types found at current depth
-
-		// field and method sets at current depth, allocated lazily
-		var fset fieldSet
-		var mset methodSet
-
-		for _, e := range current {
-			// The very first time only, e.typ may be nil.
-			// In this case, we don't have a named type and
-			// we simply continue with the underlying type.
-			if e.typ != nil {
-				if seen[e.typ] {
-					// We have seen this type before, at a more shallow depth
-					// (note that multiples of this type at the current depth
-					// were consolidated before). The type at that depth shadows
-					// this same type at the current depth, so we can ignore
-					// this one.
-					continue
-				}
-				if seen == nil {
-					seen = make(map[*Named]bool)
-				}
-				seen[e.typ] = true
-
-				mset = mset.add(e.typ.methods, e.index, e.indirect, e.multiples)
-
-				// continue with underlying type
-				typ = e.typ.underlying
-			}
-
-			switch t := typ.(type) {
-			case *Struct:
-				for i, f := range t.fields {
-					fset = fset.add(f, e.multiples)
-
-					// Embedded fields are always of the form T or *T where
-					// T is a named type. If typ appeared multiple times at
-					// this depth, f.Type appears multiple times at the next
-					// depth.
-					if f.anonymous {
-						// Ignore embedded basic types - only user-defined
-						// named types can have methods or struct fields.
-						typ, isPtr := deref(f.typ)
-						if t, _ := typ.(*Named); t != nil {
-							next = append(next, embeddedType{t, concat(e.index, i), e.indirect || isPtr, e.multiples})
-						}
-					}
-				}
-
-			case *Interface:
-				mset = mset.add(t.allMethods, e.index, true, e.multiples)
-			}
-		}
-
-		// Add methods and collisions at this depth to base if no entries with matching
-		// names exist already.
-		for k, m := range mset {
-			if _, found := base[k]; !found {
-				// Fields collide with methods of the same name at this depth.
-				if _, found := fset[k]; found {
-					m = nil // collision
-				}
-				if base == nil {
-					base = make(methodSet)
-				}
-				base[k] = m
-			}
-		}
-
-		// Multiple fields with matching names collide at this depth and shadow all
-		// entries further down; add them as collisions to base if no entries with
-		// matching names exist already.
-		for k, f := range fset {
-			if f == nil {
-				if _, found := base[k]; !found {
-					if base == nil {
-						base = make(methodSet)
-					}
-					base[k] = nil // collision
-				}
-			}
-		}
-
-		current = consolidateMultiples(next)
-	}
-
-	if len(base) == 0 {
-		return &emptyMethodSet
-	}
-
-	// collect methods
-	var list []*Selection
-	for _, m := range base {
-		if m != nil {
-			m.recv = T
-			list = append(list, m)
-		}
-	}
-	sort.Sort(byUniqueName(list))
-	return &MethodSet{list}
-}
-
-// A fieldSet is a set of fields and name collisions.
-// A collision indicates that multiple fields with the
-// same unique id appeared.
-type fieldSet map[string]*Var // a nil entry indicates a name collision
-
-// Add adds field f to the field set s.
-// If multiples is set, f appears multiple times
-// and is treated as a collision.
-func (s fieldSet) add(f *Var, multiples bool) fieldSet {
-	if s == nil {
-		s = make(fieldSet)
-	}
-	key := f.Id()
-	// if f is not in the set, add it
-	if !multiples {
-		if _, found := s[key]; !found {
-			s[key] = f
-			return s
-		}
-	}
-	s[key] = nil // collision
-	return s
-}
-
-// A methodSet is a set of methods and name collisions.
-// A collision indicates that multiple methods with the
-// same unique id appeared.
-type methodSet map[string]*Selection // a nil entry indicates a name collision
-
-// Add adds all functions in list to the method set s.
-// If multiples is set, every function in list appears multiple times
-// and is treated as a collision.
-func (s methodSet) add(list []*Func, index []int, indirect bool, multiples bool) methodSet {
-	if len(list) == 0 {
-		return s
-	}
-	if s == nil {
-		s = make(methodSet)
-	}
-	for i, f := range list {
-		key := f.Id()
-		// if f is not in the set, add it
-		if !multiples {
-			// TODO(gri) A found method may not be added because it's not in the method set
-			// (!indirect && ptrRecv(f)). A 2nd method on the same level may be in the method
-			// set and may not collide with the first one, thus leading to a false positive.
-			// Is that possible? Investigate.
-			if _, found := s[key]; !found && (indirect || !ptrRecv(f)) {
-				s[key] = &Selection{MethodVal, nil, f, concat(index, i), indirect}
-				continue
-			}
-		}
-		s[key] = nil // collision
-	}
-	return s
-}
-
-// ptrRecv reports whether the receiver is of the form *T.
-// The receiver must exist.
-func ptrRecv(f *Func) bool {
-	_, isPtr := deref(f.typ.(*Signature).recv.typ)
-	return isPtr
-}
-
-// byUniqueName function lists can be sorted by their unique names.
-type byUniqueName []*Selection
-
-func (a byUniqueName) Len() int           { return len(a) }
-func (a byUniqueName) Less(i, j int) bool { return a[i].obj.Id() < a[j].obj.Id() }
-func (a byUniqueName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
diff --git a/third_party/gotools/go/types/methodsetcache.go b/third_party/gotools/go/types/methodsetcache.go
deleted file mode 100644
index 5a482e9..0000000
--- a/third_party/gotools/go/types/methodsetcache.go
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements a cache of method sets.
-
-package types
-
-import "sync"
-
-// A MethodSetCache records the method set of each type T for which
-// MethodSet(T) is called so that repeat queries are fast.
-// The zero value is a ready-to-use cache instance.
-type MethodSetCache struct {
-	mu     sync.Mutex
-	named  map[*Named]struct{ value, pointer *MethodSet } // method sets for named N and *N
-	others map[Type]*MethodSet                            // all other types
-}
-
-// MethodSet returns the method set of type T.  It is thread-safe.
-//
-// If cache is nil, this function is equivalent to NewMethodSet(T).
-// Utility functions can thus expose an optional *MethodSetCache
-// parameter to clients that care about performance.
-//
-func (cache *MethodSetCache) MethodSet(T Type) *MethodSet {
-	if cache == nil {
-		return NewMethodSet(T)
-	}
-	cache.mu.Lock()
-	defer cache.mu.Unlock()
-
-	switch T := T.(type) {
-	case *Named:
-		return cache.lookupNamed(T).value
-
-	case *Pointer:
-		if N, ok := T.Elem().(*Named); ok {
-			return cache.lookupNamed(N).pointer
-		}
-	}
-
-	// all other types
-	// (The map uses pointer equivalence, not type identity.)
-	mset := cache.others[T]
-	if mset == nil {
-		mset = NewMethodSet(T)
-		if cache.others == nil {
-			cache.others = make(map[Type]*MethodSet)
-		}
-		cache.others[T] = mset
-	}
-	return mset
-}
-
-func (cache *MethodSetCache) lookupNamed(named *Named) struct{ value, pointer *MethodSet } {
-	if cache.named == nil {
-		cache.named = make(map[*Named]struct{ value, pointer *MethodSet })
-	}
-	// Avoid recomputing mset(*T) for each distinct Pointer
-	// instance whose underlying type is a named type.
-	msets, ok := cache.named[named]
-	if !ok {
-		msets.value = NewMethodSet(named)
-		msets.pointer = NewMethodSet(NewPointer(named))
-		cache.named[named] = msets
-	}
-	return msets
-}
diff --git a/third_party/gotools/go/types/object.go b/third_party/gotools/go/types/object.go
deleted file mode 100644
index 48f49ee..0000000
--- a/third_party/gotools/go/types/object.go
+++ /dev/null
@@ -1,340 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import (
-	"bytes"
-	"fmt"
-	"go/ast"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-)
-
-// TODO(gri) Document factory, accessor methods, and fields. General clean-up.
-
-// An Object describes a named language entity such as a package,
-// constant, type, variable, function (incl. methods), or label.
-// All objects implement the Object interface.
-//
-type Object interface {
-	Parent() *Scope // scope in which this object is declared
-	Pos() token.Pos // position of object identifier in declaration
-	Pkg() *Package  // nil for objects in the Universe scope and labels
-	Name() string   // package local object name
-	Type() Type     // object type
-	Exported() bool // reports whether the name starts with a capital letter
-	Id() string     // object id (see Id below)
-
-	// String returns a human-readable string of the object.
-	String() string
-
-	// order reflects a package-level object's source order: if object
-	// a is before object b in the source, then a.order() < b.order().
-	// order returns a value > 0 for package-level objects; it returns
-	// 0 for all other objects (including objects in file scopes).
-	order() uint32
-
-	// setOrder sets the order number of the object. It must be > 0.
-	setOrder(uint32)
-
-	// setParent sets the parent scope of the object.
-	setParent(*Scope)
-
-	// sameId reports whether obj.Id() and Id(pkg, name) are the same.
-	sameId(pkg *Package, name string) bool
-}
-
-// Id returns name if it is exported, otherwise it
-// returns the name qualified with the package path.
-func Id(pkg *Package, name string) string {
-	if ast.IsExported(name) {
-		return name
-	}
-	// unexported names need the package path for differentiation
-	// (if there's no package, make sure we don't start with '.'
-	// as that may change the order of methods between a setup
-	// inside a package and outside a package - which breaks some
-	// tests)
-	path := "_"
-	// TODO(gri): shouldn't !ast.IsExported(name) => pkg != nil be an precondition?
-	// if pkg == nil {
-	// 	panic("nil package in lookup of unexported name")
-	// }
-	if pkg != nil {
-		path = pkg.path
-		if path == "" {
-			path = "_"
-		}
-	}
-	return path + "." + name
-}
-
-// An object implements the common parts of an Object.
-type object struct {
-	parent *Scope
-	pos    token.Pos
-	pkg    *Package
-	name   string
-	typ    Type
-	order_ uint32
-}
-
-func (obj *object) Parent() *Scope { return obj.parent }
-func (obj *object) Pos() token.Pos { return obj.pos }
-func (obj *object) Pkg() *Package  { return obj.pkg }
-func (obj *object) Name() string   { return obj.name }
-func (obj *object) Type() Type     { return obj.typ }
-func (obj *object) Exported() bool { return ast.IsExported(obj.name) }
-func (obj *object) Id() string     { return Id(obj.pkg, obj.name) }
-func (obj *object) String() string { panic("abstract") }
-func (obj *object) order() uint32  { return obj.order_ }
-
-func (obj *object) setOrder(order uint32)   { assert(order > 0); obj.order_ = order }
-func (obj *object) setParent(parent *Scope) { obj.parent = parent }
-
-func (obj *object) sameId(pkg *Package, name string) bool {
-	// spec:
-	// "Two identifiers are different if they are spelled differently,
-	// or if they appear in different packages and are not exported.
-	// Otherwise, they are the same."
-	if name != obj.name {
-		return false
-	}
-	// obj.Name == name
-	if obj.Exported() {
-		return true
-	}
-	// not exported, so packages must be the same (pkg == nil for
-	// fields in Universe scope; this can only happen for types
-	// introduced via Eval)
-	if pkg == nil || obj.pkg == nil {
-		return pkg == obj.pkg
-	}
-	// pkg != nil && obj.pkg != nil
-	return pkg.path == obj.pkg.path
-}
-
-// A PkgName represents an imported Go package.
-type PkgName struct {
-	object
-	imported *Package
-	used     bool // set if the package was used
-}
-
-func NewPkgName(pos token.Pos, pkg *Package, name string, imported *Package) *PkgName {
-	return &PkgName{object{nil, pos, pkg, name, Typ[Invalid], 0}, imported, false}
-}
-
-// Imported returns the package that was imported.
-// It is distinct from Pkg(), which is the package containing the import statement.
-func (obj *PkgName) Imported() *Package { return obj.imported }
-
-// A Const represents a declared constant.
-type Const struct {
-	object
-	val     exact.Value
-	visited bool // for initialization cycle detection
-}
-
-func NewConst(pos token.Pos, pkg *Package, name string, typ Type, val exact.Value) *Const {
-	return &Const{object{nil, pos, pkg, name, typ, 0}, val, false}
-}
-
-func (obj *Const) Val() exact.Value { return obj.val }
-
-// A TypeName represents a declared type.
-type TypeName struct {
-	object
-}
-
-func NewTypeName(pos token.Pos, pkg *Package, name string, typ Type) *TypeName {
-	return &TypeName{object{nil, pos, pkg, name, typ, 0}}
-}
-
-// A Variable represents a declared variable (including function parameters and results, and struct fields).
-type Var struct {
-	object
-	anonymous bool // if set, the variable is an anonymous struct field, and name is the type name
-	visited   bool // for initialization cycle detection
-	isField   bool // var is struct field
-	used      bool // set if the variable was used
-}
-
-func NewVar(pos token.Pos, pkg *Package, name string, typ Type) *Var {
-	return &Var{object: object{nil, pos, pkg, name, typ, 0}}
-}
-
-func NewParam(pos token.Pos, pkg *Package, name string, typ Type) *Var {
-	return &Var{object: object{nil, pos, pkg, name, typ, 0}, used: true} // parameters are always 'used'
-}
-
-func NewField(pos token.Pos, pkg *Package, name string, typ Type, anonymous bool) *Var {
-	return &Var{object: object{nil, pos, pkg, name, typ, 0}, anonymous: anonymous, isField: true}
-}
-
-func (obj *Var) Anonymous() bool { return obj.anonymous }
-
-func (obj *Var) IsField() bool { return obj.isField }
-
-// A Func represents a declared function, concrete method, or abstract
-// (interface) method.  Its Type() is always a *Signature.
-// An abstract method may belong to many interfaces due to embedding.
-type Func struct {
-	object
-}
-
-func NewFunc(pos token.Pos, pkg *Package, name string, sig *Signature) *Func {
-	// don't store a nil signature
-	var typ Type
-	if sig != nil {
-		typ = sig
-	}
-	return &Func{object{nil, pos, pkg, name, typ, 0}}
-}
-
-// FullName returns the package- or receiver-type-qualified name of
-// function or method obj.
-func (obj *Func) FullName() string {
-	var buf bytes.Buffer
-	writeFuncName(&buf, nil, obj)
-	return buf.String()
-}
-
-func (obj *Func) Scope() *Scope {
-	return obj.typ.(*Signature).scope
-}
-
-// A Label represents a declared label.
-type Label struct {
-	object
-	used bool // set if the label was used
-}
-
-func NewLabel(pos token.Pos, pkg *Package, name string) *Label {
-	return &Label{object{pos: pos, pkg: pkg, name: name, typ: Typ[Invalid]}, false}
-}
-
-// A Builtin represents a built-in function.
-// Builtins don't have a valid type.
-type Builtin struct {
-	object
-	id builtinId
-}
-
-func newBuiltin(id builtinId) *Builtin {
-	return &Builtin{object{name: predeclaredFuncs[id].name, typ: Typ[Invalid]}, id}
-}
-
-// Nil represents the predeclared value nil.
-type Nil struct {
-	object
-}
-
-func writeObject(buf *bytes.Buffer, this *Package, obj Object) {
-	typ := obj.Type()
-	switch obj := obj.(type) {
-	case *PkgName:
-		fmt.Fprintf(buf, "package %s", obj.Name())
-		if path := obj.imported.path; path != "" && path != obj.name {
-			fmt.Fprintf(buf, " (%q)", path)
-		}
-		return
-
-	case *Const:
-		buf.WriteString("const")
-
-	case *TypeName:
-		buf.WriteString("type")
-		typ = typ.Underlying()
-
-	case *Var:
-		if obj.isField {
-			buf.WriteString("field")
-		} else {
-			buf.WriteString("var")
-		}
-
-	case *Func:
-		buf.WriteString("func ")
-		writeFuncName(buf, this, obj)
-		if typ != nil {
-			WriteSignature(buf, this, typ.(*Signature))
-		}
-		return
-
-	case *Label:
-		buf.WriteString("label")
-		typ = nil
-
-	case *Builtin:
-		buf.WriteString("builtin")
-		typ = nil
-
-	case *Nil:
-		buf.WriteString("nil")
-		return
-
-	default:
-		panic(fmt.Sprintf("writeObject(%T)", obj))
-	}
-
-	buf.WriteByte(' ')
-
-	// For package-level objects, package-qualify the name,
-	// except for intra-package references (this != nil).
-	if pkg := obj.Pkg(); pkg != nil && this != pkg && pkg.scope.Lookup(obj.Name()) == obj {
-		buf.WriteString(pkg.path)
-		buf.WriteByte('.')
-	}
-	buf.WriteString(obj.Name())
-	if typ != nil {
-		buf.WriteByte(' ')
-		WriteType(buf, this, typ)
-	}
-}
-
-// ObjectString returns the string form of obj.
-// Object and type names are printed package-qualified
-// only if they do not belong to this package.
-//
-func ObjectString(this *Package, obj Object) string {
-	var buf bytes.Buffer
-	writeObject(&buf, this, obj)
-	return buf.String()
-}
-
-func (obj *PkgName) String() string  { return ObjectString(nil, obj) }
-func (obj *Const) String() string    { return ObjectString(nil, obj) }
-func (obj *TypeName) String() string { return ObjectString(nil, obj) }
-func (obj *Var) String() string      { return ObjectString(nil, obj) }
-func (obj *Func) String() string     { return ObjectString(nil, obj) }
-func (obj *Label) String() string    { return ObjectString(nil, obj) }
-func (obj *Builtin) String() string  { return ObjectString(nil, obj) }
-func (obj *Nil) String() string      { return ObjectString(nil, obj) }
-
-func writeFuncName(buf *bytes.Buffer, this *Package, f *Func) {
-	if f.typ != nil {
-		sig := f.typ.(*Signature)
-		if recv := sig.Recv(); recv != nil {
-			buf.WriteByte('(')
-			if _, ok := recv.Type().(*Interface); ok {
-				// gcimporter creates abstract methods of
-				// named interfaces using the interface type
-				// (not the named type) as the receiver.
-				// Don't print it in full.
-				buf.WriteString("interface")
-			} else {
-				WriteType(buf, this, recv.Type())
-			}
-			buf.WriteByte(')')
-			buf.WriteByte('.')
-		} else if f.pkg != nil && f.pkg != this {
-			buf.WriteString(f.pkg.path)
-			buf.WriteByte('.')
-		}
-	}
-	buf.WriteString(f.name)
-}
diff --git a/third_party/gotools/go/types/objset.go b/third_party/gotools/go/types/objset.go
deleted file mode 100644
index 55eb74a..0000000
--- a/third_party/gotools/go/types/objset.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements objsets.
-//
-// An objset is similar to a Scope but objset elements
-// are identified by their unique id, instead of their
-// object name.
-
-package types
-
-// An objset is a set of objects identified by their unique id.
-// The zero value for objset is a ready-to-use empty objset.
-type objset map[string]Object // initialized lazily
-
-// insert attempts to insert an object obj into objset s.
-// If s already contains an alternative object alt with
-// the same name, insert leaves s unchanged and returns alt.
-// Otherwise it inserts obj and returns nil.
-func (s *objset) insert(obj Object) Object {
-	id := obj.Id()
-	if alt := (*s)[id]; alt != nil {
-		return alt
-	}
-	if *s == nil {
-		*s = make(map[string]Object)
-	}
-	(*s)[id] = obj
-	return nil
-}
diff --git a/third_party/gotools/go/types/operand.go b/third_party/gotools/go/types/operand.go
deleted file mode 100644
index 408d437..0000000
--- a/third_party/gotools/go/types/operand.go
+++ /dev/null
@@ -1,287 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file defines operands and associated operations.
-
-package types
-
-import (
-	"bytes"
-	"go/ast"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-)
-
-// An operandMode specifies the (addressing) mode of an operand.
-type operandMode byte
-
-const (
-	invalid  operandMode = iota // operand is invalid
-	novalue                     // operand represents no value (result of a function call w/o result)
-	builtin                     // operand is a built-in function
-	typexpr                     // operand is a type
-	constant                    // operand is a constant; the operand's typ is a Basic type
-	variable                    // operand is an addressable variable
-	mapindex                    // operand is a map index expression (acts like a variable on lhs, commaok on rhs of an assignment)
-	value                       // operand is a computed value
-	commaok                     // like value, but operand may be used in a comma,ok expression
-)
-
-var operandModeString = [...]string{
-	invalid:  "invalid operand",
-	novalue:  "no value",
-	builtin:  "built-in",
-	typexpr:  "type",
-	constant: "constant",
-	variable: "variable",
-	mapindex: "map index expression",
-	value:    "value",
-	commaok:  "comma, ok expression",
-}
-
-// An operand represents an intermediate value during type checking.
-// Operands have an (addressing) mode, the expression evaluating to
-// the operand, the operand's type, a value for constants, and an id
-// for built-in functions.
-// The zero value of operand is a ready to use invalid operand.
-//
-type operand struct {
-	mode operandMode
-	expr ast.Expr
-	typ  Type
-	val  exact.Value
-	id   builtinId
-}
-
-// pos returns the position of the expression corresponding to x.
-// If x is invalid the position is token.NoPos.
-//
-func (x *operand) pos() token.Pos {
-	// x.expr may not be set if x is invalid
-	if x.expr == nil {
-		return token.NoPos
-	}
-	return x.expr.Pos()
-}
-
-// Operand string formats
-// (not all "untyped" cases can appear due to the type system,
-// but they fall out naturally here)
-//
-// mode       format
-//
-// invalid    <expr> (               <mode>                    )
-// novalue    <expr> (               <mode>                    )
-// builtin    <expr> (               <mode>                    )
-// typexpr    <expr> (               <mode>                    )
-//
-// constant   <expr> (<untyped kind> <mode>                    )
-// constant   <expr> (               <mode>       of type <typ>)
-// constant   <expr> (<untyped kind> <mode> <val>              )
-// constant   <expr> (               <mode> <val> of type <typ>)
-//
-// variable   <expr> (<untyped kind> <mode>                    )
-// variable   <expr> (               <mode>       of type <typ>)
-//
-// mapindex   <expr> (<untyped kind> <mode>                    )
-// mapindex   <expr> (               <mode>       of type <typ>)
-//
-// value      <expr> (<untyped kind> <mode>                    )
-// value      <expr> (               <mode>       of type <typ>)
-//
-// commaok    <expr> (<untyped kind> <mode>                    )
-// commaok    <expr> (               <mode>       of type <typ>)
-//
-func operandString(this *Package, x *operand) string {
-	var buf bytes.Buffer
-
-	var expr string
-	if x.expr != nil {
-		expr = ExprString(x.expr)
-	} else {
-		switch x.mode {
-		case builtin:
-			expr = predeclaredFuncs[x.id].name
-		case typexpr:
-			expr = TypeString(this, x.typ)
-		case constant:
-			expr = x.val.String()
-		}
-	}
-
-	// <expr> (
-	if expr != "" {
-		buf.WriteString(expr)
-		buf.WriteString(" (")
-	}
-
-	// <untyped kind>
-	hasType := false
-	switch x.mode {
-	case invalid, novalue, builtin, typexpr:
-		// no type
-	default:
-		// has type
-		if isUntyped(x.typ) {
-			buf.WriteString(x.typ.(*Basic).name)
-			buf.WriteByte(' ')
-			break
-		}
-		hasType = true
-	}
-
-	// <mode>
-	buf.WriteString(operandModeString[x.mode])
-
-	// <val>
-	if x.mode == constant {
-		if s := x.val.String(); s != expr {
-			buf.WriteByte(' ')
-			buf.WriteString(s)
-		}
-	}
-
-	// <typ>
-	if hasType {
-		if x.typ != Typ[Invalid] {
-			buf.WriteString(" of type ")
-			WriteType(&buf, this, x.typ)
-		} else {
-			buf.WriteString(" with invalid type")
-		}
-	}
-
-	// )
-	if expr != "" {
-		buf.WriteByte(')')
-	}
-
-	return buf.String()
-}
-
-func (x *operand) String() string {
-	return operandString(nil, x)
-}
-
-// setConst sets x to the untyped constant for literal lit.
-func (x *operand) setConst(tok token.Token, lit string) {
-	val := exact.MakeFromLiteral(lit, tok)
-	if val == nil {
-		// TODO(gri) Should we make it an unknown constant instead?
-		x.mode = invalid
-		return
-	}
-
-	var kind BasicKind
-	switch tok {
-	case token.INT:
-		kind = UntypedInt
-	case token.FLOAT:
-		kind = UntypedFloat
-	case token.IMAG:
-		kind = UntypedComplex
-	case token.CHAR:
-		kind = UntypedRune
-	case token.STRING:
-		kind = UntypedString
-	}
-
-	x.mode = constant
-	x.typ = Typ[kind]
-	x.val = val
-}
-
-// isNil reports whether x is the nil value.
-func (x *operand) isNil() bool {
-	return x.mode == value && x.typ == Typ[UntypedNil]
-}
-
-// TODO(gri) The functions operand.assignableTo, checker.convertUntyped,
-//           checker.representable, and checker.assignment are
-//           overlapping in functionality. Need to simplify and clean up.
-
-// assignableTo reports whether x is assignable to a variable of type T.
-func (x *operand) assignableTo(conf *Config, T Type) bool {
-	if x.mode == invalid || T == Typ[Invalid] {
-		return true // avoid spurious errors
-	}
-
-	V := x.typ
-
-	// x's type is identical to T
-	if Identical(V, T) {
-		return true
-	}
-
-	Vu := V.Underlying()
-	Tu := T.Underlying()
-
-	// T is an interface type and x implements T
-	// (Do this check first as it might succeed early.)
-	if Ti, ok := Tu.(*Interface); ok {
-		if Implements(x.typ, Ti) {
-			return true
-		}
-	}
-
-	// x's type V and T have identical underlying types
-	// and at least one of V or T is not a named type
-	if Identical(Vu, Tu) && (!isNamed(V) || !isNamed(T)) {
-		return true
-	}
-
-	// x is a bidirectional channel value, T is a channel
-	// type, x's type V and T have identical element types,
-	// and at least one of V or T is not a named type
-	if Vc, ok := Vu.(*Chan); ok && Vc.dir == SendRecv {
-		if Tc, ok := Tu.(*Chan); ok && Identical(Vc.elem, Tc.elem) {
-			return !isNamed(V) || !isNamed(T)
-		}
-	}
-
-	// x is the predeclared identifier nil and T is a pointer,
-	// function, slice, map, channel, or interface type
-	if x.isNil() {
-		switch t := Tu.(type) {
-		case *Basic:
-			if t.kind == UnsafePointer {
-				return true
-			}
-		case *Pointer, *Signature, *Slice, *Map, *Chan, *Interface:
-			return true
-		}
-		return false
-	}
-
-	// x is an untyped constant representable by a value of type T
-	// TODO(gri) This is borrowing from checker.convertUntyped and
-	//           checker.representable. Need to clean up.
-	if isUntyped(Vu) {
-		switch t := Tu.(type) {
-		case *Basic:
-			if x.mode == constant {
-				return representableConst(x.val, conf, t.kind, nil)
-			}
-			// The result of a comparison is an untyped boolean,
-			// but may not be a constant.
-			if Vb, _ := Vu.(*Basic); Vb != nil {
-				return Vb.kind == UntypedBool && isBoolean(Tu)
-			}
-		case *Interface:
-			return x.isNil() || t.Empty()
-		case *Pointer, *Signature, *Slice, *Map, *Chan:
-			return x.isNil()
-		}
-	}
-
-	return false
-}
-
-// isInteger reports whether x is a (typed or untyped) integer value.
-func (x *operand) isInteger() bool {
-	return x.mode == invalid ||
-		isInteger(x.typ) ||
-		x.mode == constant && representableConst(x.val, nil, UntypedInt, nil) // no *Config required for UntypedInt
-}
diff --git a/third_party/gotools/go/types/ordering.go b/third_party/gotools/go/types/ordering.go
deleted file mode 100644
index 6bb98f2..0000000
--- a/third_party/gotools/go/types/ordering.go
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements resolveOrder.
-
-package types
-
-import (
-	"go/ast"
-	"sort"
-)
-
-// resolveOrder computes the order in which package-level objects
-// must be type-checked.
-//
-// Interface types appear first in the list, sorted topologically
-// by dependencies on embedded interfaces that are also declared
-// in this package, followed by all other objects sorted in source
-// order.
-//
-// TODO(gri) Consider sorting all types by dependencies here, and
-// in the process check _and_ report type cycles. This may simplify
-// the full type-checking phase.
-//
-func (check *Checker) resolveOrder() []Object {
-	var ifaces, others []Object
-
-	// collect interface types with their dependencies, and all other objects
-	for obj := range check.objMap {
-		if ityp := check.interfaceFor(obj); ityp != nil {
-			ifaces = append(ifaces, obj)
-			// determine dependencies on embedded interfaces
-			for _, f := range ityp.Methods.List {
-				if len(f.Names) == 0 {
-					// Embedded interface: The type must be a (possibly
-					// qualified) identifier denoting another interface.
-					// Imported interfaces are already fully resolved,
-					// so we can ignore qualified identifiers.
-					if ident, _ := f.Type.(*ast.Ident); ident != nil {
-						embedded := check.pkg.scope.Lookup(ident.Name)
-						if check.interfaceFor(embedded) != nil {
-							check.objMap[obj].addDep(embedded)
-						}
-					}
-				}
-			}
-		} else {
-			others = append(others, obj)
-		}
-	}
-
-	// final object order
-	var order []Object
-
-	// sort interface types topologically by dependencies,
-	// and in source order if there are no dependencies
-	sort.Sort(inSourceOrder(ifaces))
-	if debug {
-		for _, obj := range ifaces {
-			assert(check.objMap[obj].mark == 0)
-		}
-	}
-	for _, obj := range ifaces {
-		check.appendInPostOrder(&order, obj)
-	}
-
-	// sort everything else in source order
-	sort.Sort(inSourceOrder(others))
-
-	return append(order, others...)
-}
-
-// interfaceFor returns the AST interface denoted by obj, or nil.
-func (check *Checker) interfaceFor(obj Object) *ast.InterfaceType {
-	tname, _ := obj.(*TypeName)
-	if tname == nil {
-		return nil // not a type
-	}
-	d := check.objMap[obj]
-	if d == nil {
-		check.dump("%s: %s should have been declared", obj.Pos(), obj.Name())
-		unreachable()
-	}
-	if d.typ == nil {
-		return nil // invalid AST - ignore (will be handled later)
-	}
-	ityp, _ := d.typ.(*ast.InterfaceType)
-	return ityp
-}
-
-func (check *Checker) appendInPostOrder(order *[]Object, obj Object) {
-	d := check.objMap[obj]
-	if d.mark != 0 {
-		// We've already seen this object; either because it's
-		// already added to order, or because we have a cycle.
-		// In both cases we stop. Cycle errors are reported
-		// when type-checking types.
-		return
-	}
-	d.mark = 1
-
-	for _, obj := range orderedSetObjects(d.deps) {
-		check.appendInPostOrder(order, obj)
-	}
-
-	*order = append(*order, obj)
-}
-
-func orderedSetObjects(set map[Object]bool) []Object {
-	list := make([]Object, len(set))
-	i := 0
-	for obj := range set {
-		// we don't care about the map element value
-		list[i] = obj
-		i++
-	}
-	sort.Sort(inSourceOrder(list))
-	return list
-}
-
-// inSourceOrder implements the sort.Sort interface.
-type inSourceOrder []Object
-
-func (a inSourceOrder) Len() int           { return len(a) }
-func (a inSourceOrder) Less(i, j int) bool { return a[i].order() < a[j].order() }
-func (a inSourceOrder) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
diff --git a/third_party/gotools/go/types/package.go b/third_party/gotools/go/types/package.go
deleted file mode 100644
index 366ca39..0000000
--- a/third_party/gotools/go/types/package.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import "fmt"
-
-// A Package describes a Go package.
-type Package struct {
-	path     string
-	name     string
-	scope    *Scope
-	complete bool
-	imports  []*Package
-	fake     bool // scope lookup errors are silently dropped if package is fake (internal use only)
-}
-
-// NewPackage returns a new Package for the given package path and name;
-// the name must not be the blank identifier.
-// The package is not complete and contains no explicit imports.
-func NewPackage(path, name string) *Package {
-	if name == "_" {
-		panic("invalid package name _")
-	}
-	scope := NewScope(Universe, fmt.Sprintf("package %q", path))
-	return &Package{path: path, name: name, scope: scope}
-}
-
-// Path returns the package path.
-func (pkg *Package) Path() string { return pkg.path }
-
-// Name returns the package name.
-func (pkg *Package) Name() string { return pkg.name }
-
-// Scope returns the (complete or incomplete) package scope
-// holding the objects declared at package level (TypeNames,
-// Consts, Vars, and Funcs).
-func (pkg *Package) Scope() *Scope { return pkg.scope }
-
-// A package is complete if its scope contains (at least) all
-// exported objects; otherwise it is incomplete.
-func (pkg *Package) Complete() bool { return pkg.complete }
-
-// MarkComplete marks a package as complete.
-func (pkg *Package) MarkComplete() { pkg.complete = true }
-
-// Imports returns the list of packages explicitly imported by
-// pkg; the list is in source order. Package unsafe is excluded.
-func (pkg *Package) Imports() []*Package { return pkg.imports }
-
-// SetImports sets the list of explicitly imported packages to list.
-// It is the caller's responsibility to make sure list elements are unique.
-func (pkg *Package) SetImports(list []*Package) { pkg.imports = list }
-
-func (pkg *Package) String() string {
-	return fmt.Sprintf("package %s (%q)", pkg.name, pkg.path)
-}
diff --git a/third_party/gotools/go/types/predicates.go b/third_party/gotools/go/types/predicates.go
deleted file mode 100644
index b5c39d9..0000000
--- a/third_party/gotools/go/types/predicates.go
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements commonly used type predicates.
-
-package types
-
-import "sort"
-
-func isNamed(typ Type) bool {
-	if _, ok := typ.(*Basic); ok {
-		return ok
-	}
-	_, ok := typ.(*Named)
-	return ok
-}
-
-func isBoolean(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsBoolean != 0
-}
-
-func isInteger(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsInteger != 0
-}
-
-func isUnsigned(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsUnsigned != 0
-}
-
-func isFloat(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsFloat != 0
-}
-
-func isComplex(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsComplex != 0
-}
-
-func isNumeric(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsNumeric != 0
-}
-
-func isString(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsString != 0
-}
-
-func isTyped(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return !ok || t.info&IsUntyped == 0
-}
-
-func isUntyped(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsUntyped != 0
-}
-
-func isOrdered(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsOrdered != 0
-}
-
-func isConstType(typ Type) bool {
-	t, ok := typ.Underlying().(*Basic)
-	return ok && t.info&IsConstType != 0
-}
-
-// IsInterface reports whether typ is an interface type.
-func IsInterface(typ Type) bool {
-	_, ok := typ.Underlying().(*Interface)
-	return ok
-}
-
-// Comparable reports whether values of type T are comparable.
-func Comparable(T Type) bool {
-	switch t := T.Underlying().(type) {
-	case *Basic:
-		// assume invalid types to be comparable
-		// to avoid follow-up errors
-		return t.kind != UntypedNil
-	case *Pointer, *Interface, *Chan:
-		return true
-	case *Struct:
-		for _, f := range t.fields {
-			if !Comparable(f.typ) {
-				return false
-			}
-		}
-		return true
-	case *Array:
-		return Comparable(t.elem)
-	}
-	return false
-}
-
-// hasNil reports whether a type includes the nil value.
-func hasNil(typ Type) bool {
-	switch t := typ.Underlying().(type) {
-	case *Basic:
-		return t.kind == UnsafePointer
-	case *Slice, *Pointer, *Signature, *Interface, *Map, *Chan:
-		return true
-	}
-	return false
-}
-
-// Identical reports whether x and y are identical.
-func Identical(x, y Type) bool {
-	return identical(x, y, nil)
-}
-
-// An ifacePair is a node in a stack of interface type pairs compared for identity.
-type ifacePair struct {
-	x, y *Interface
-	prev *ifacePair
-}
-
-func (p *ifacePair) identical(q *ifacePair) bool {
-	return p.x == q.x && p.y == q.y || p.x == q.y && p.y == q.x
-}
-
-func identical(x, y Type, p *ifacePair) bool {
-	if x == y {
-		return true
-	}
-
-	switch x := x.(type) {
-	case *Basic:
-		// Basic types are singletons except for the rune and byte
-		// aliases, thus we cannot solely rely on the x == y check
-		// above.
-		if y, ok := y.(*Basic); ok {
-			return x.kind == y.kind
-		}
-
-	case *Array:
-		// Two array types are identical if they have identical element types
-		// and the same array length.
-		if y, ok := y.(*Array); ok {
-			return x.len == y.len && identical(x.elem, y.elem, p)
-		}
-
-	case *Slice:
-		// Two slice types are identical if they have identical element types.
-		if y, ok := y.(*Slice); ok {
-			return identical(x.elem, y.elem, p)
-		}
-
-	case *Struct:
-		// Two struct types are identical if they have the same sequence of fields,
-		// and if corresponding fields have the same names, and identical types,
-		// and identical tags. Two anonymous fields are considered to have the same
-		// name. Lower-case field names from different packages are always different.
-		if y, ok := y.(*Struct); ok {
-			if x.NumFields() == y.NumFields() {
-				for i, f := range x.fields {
-					g := y.fields[i]
-					if f.anonymous != g.anonymous ||
-						x.Tag(i) != y.Tag(i) ||
-						!f.sameId(g.pkg, g.name) ||
-						!identical(f.typ, g.typ, p) {
-						return false
-					}
-				}
-				return true
-			}
-		}
-
-	case *Pointer:
-		// Two pointer types are identical if they have identical base types.
-		if y, ok := y.(*Pointer); ok {
-			return identical(x.base, y.base, p)
-		}
-
-	case *Tuple:
-		// Two tuples types are identical if they have the same number of elements
-		// and corresponding elements have identical types.
-		if y, ok := y.(*Tuple); ok {
-			if x.Len() == y.Len() {
-				if x != nil {
-					for i, v := range x.vars {
-						w := y.vars[i]
-						if !identical(v.typ, w.typ, p) {
-							return false
-						}
-					}
-				}
-				return true
-			}
-		}
-
-	case *Signature:
-		// Two function types are identical if they have the same number of parameters
-		// and result values, corresponding parameter and result types are identical,
-		// and either both functions are variadic or neither is. Parameter and result
-		// names are not required to match.
-		if y, ok := y.(*Signature); ok {
-			return x.variadic == y.variadic &&
-				identical(x.params, y.params, p) &&
-				identical(x.results, y.results, p)
-		}
-
-	case *Interface:
-		// Two interface types are identical if they have the same set of methods with
-		// the same names and identical function types. Lower-case method names from
-		// different packages are always different. The order of the methods is irrelevant.
-		if y, ok := y.(*Interface); ok {
-			a := x.allMethods
-			b := y.allMethods
-			if len(a) == len(b) {
-				// Interface types are the only types where cycles can occur
-				// that are not "terminated" via named types; and such cycles
-				// can only be created via method parameter types that are
-				// anonymous interfaces (directly or indirectly) embedding
-				// the current interface. Example:
-				//
-				//    type T interface {
-				//        m() interface{T}
-				//    }
-				//
-				// If two such (differently named) interfaces are compared,
-				// endless recursion occurs if the cycle is not detected.
-				//
-				// If x and y were compared before, they must be equal
-				// (if they were not, the recursion would have stopped);
-				// search the ifacePair stack for the same pair.
-				//
-				// This is a quadratic algorithm, but in practice these stacks
-				// are extremely short (bounded by the nesting depth of interface
-				// type declarations that recur via parameter types, an extremely
-				// rare occurrence). An alternative implementation might use a
-				// "visited" map, but that is probably less efficient overall.
-				q := &ifacePair{x, y, p}
-				for p != nil {
-					if p.identical(q) {
-						return true // same pair was compared before
-					}
-					p = p.prev
-				}
-				if debug {
-					assert(sort.IsSorted(byUniqueMethodName(a)))
-					assert(sort.IsSorted(byUniqueMethodName(b)))
-				}
-				for i, f := range a {
-					g := b[i]
-					if f.Id() != g.Id() || !identical(f.typ, g.typ, q) {
-						return false
-					}
-				}
-				return true
-			}
-		}
-
-	case *Map:
-		// Two map types are identical if they have identical key and value types.
-		if y, ok := y.(*Map); ok {
-			return identical(x.key, y.key, p) && identical(x.elem, y.elem, p)
-		}
-
-	case *Chan:
-		// Two channel types are identical if they have identical value types
-		// and the same direction.
-		if y, ok := y.(*Chan); ok {
-			return x.dir == y.dir && identical(x.elem, y.elem, p)
-		}
-
-	case *Named:
-		// Two named types are identical if their type names originate
-		// in the same type declaration.
-		if y, ok := y.(*Named); ok {
-			return x.obj == y.obj
-		}
-
-	default:
-		unreachable()
-	}
-
-	return false
-}
-
-// defaultType returns the default "typed" type for an "untyped" type;
-// it returns the incoming type for all other types. The default type
-// for untyped nil is untyped nil.
-//
-func defaultType(typ Type) Type {
-	if t, ok := typ.(*Basic); ok {
-		switch t.kind {
-		case UntypedBool:
-			return Typ[Bool]
-		case UntypedInt:
-			return Typ[Int]
-		case UntypedRune:
-			return UniverseRune // use 'rune' name
-		case UntypedFloat:
-			return Typ[Float64]
-		case UntypedComplex:
-			return Typ[Complex128]
-		case UntypedString:
-			return Typ[String]
-		}
-	}
-	return typ
-}
diff --git a/third_party/gotools/go/types/resolver.go b/third_party/gotools/go/types/resolver.go
deleted file mode 100644
index 9aa9c78..0000000
--- a/third_party/gotools/go/types/resolver.go
+++ /dev/null
@@ -1,446 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import (
-	"errors"
-	"fmt"
-	"go/ast"
-	"go/token"
-	pathLib "path"
-	"strconv"
-	"strings"
-	"unicode"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-)
-
-// A declInfo describes a package-level const, type, var, or func declaration.
-type declInfo struct {
-	file  *Scope        // scope of file containing this declaration
-	lhs   []*Var        // lhs of n:1 variable declarations, or nil
-	typ   ast.Expr      // type, or nil
-	init  ast.Expr      // init expression, or nil
-	fdecl *ast.FuncDecl // func declaration, or nil
-
-	deps map[Object]bool // type and init dependencies; lazily allocated
-	mark int             // for dependency analysis
-}
-
-// hasInitializer reports whether the declared object has an initialization
-// expression or function body.
-func (d *declInfo) hasInitializer() bool {
-	return d.init != nil || d.fdecl != nil && d.fdecl.Body != nil
-}
-
-// addDep adds obj as a dependency to d.
-func (d *declInfo) addDep(obj Object) {
-	m := d.deps
-	if m == nil {
-		m = make(map[Object]bool)
-		d.deps = m
-	}
-	m[obj] = true
-}
-
-// arityMatch checks that the lhs and rhs of a const or var decl
-// have the appropriate number of names and init exprs. For const
-// decls, init is the value spec providing the init exprs; for
-// var decls, init is nil (the init exprs are in s in this case).
-func (check *Checker) arityMatch(s, init *ast.ValueSpec) {
-	l := len(s.Names)
-	r := len(s.Values)
-	if init != nil {
-		r = len(init.Values)
-	}
-
-	switch {
-	case init == nil && r == 0:
-		// var decl w/o init expr
-		if s.Type == nil {
-			check.errorf(s.Pos(), "missing type or init expr")
-		}
-	case l < r:
-		if l < len(s.Values) {
-			// init exprs from s
-			n := s.Values[l]
-			check.errorf(n.Pos(), "extra init expr %s", n)
-			// TODO(gri) avoid declared but not used error here
-		} else {
-			// init exprs "inherited"
-			check.errorf(s.Pos(), "extra init expr at %s", init.Pos())
-			// TODO(gri) avoid declared but not used error here
-		}
-	case l > r && (init != nil || r != 1):
-		n := s.Names[r]
-		check.errorf(n.Pos(), "missing init expr for %s", n)
-	}
-}
-
-func validatedImportPath(path string) (string, error) {
-	s, err := strconv.Unquote(path)
-	if err != nil {
-		return "", err
-	}
-	if s == "" {
-		return "", fmt.Errorf("empty string")
-	}
-	const illegalChars = `!"#$%&'()*,:;<=>?[\]^{|}` + "`\uFFFD"
-	for _, r := range s {
-		if !unicode.IsGraphic(r) || unicode.IsSpace(r) || strings.ContainsRune(illegalChars, r) {
-			return s, fmt.Errorf("invalid character %#U", r)
-		}
-	}
-	return s, nil
-}
-
-// declarePkgObj declares obj in the package scope, records its ident -> obj mapping,
-// and updates check.objMap. The object must not be a function or method.
-func (check *Checker) declarePkgObj(ident *ast.Ident, obj Object, d *declInfo) {
-	assert(ident.Name == obj.Name())
-
-	// spec: "A package-scope or file-scope identifier with name init
-	// may only be declared to be a function with this (func()) signature."
-	if ident.Name == "init" {
-		check.errorf(ident.Pos(), "cannot declare init - must be func")
-		return
-	}
-
-	check.declare(check.pkg.scope, ident, obj)
-	check.objMap[obj] = d
-	obj.setOrder(uint32(len(check.objMap)))
-}
-
-// filename returns a filename suitable for debugging output.
-func (check *Checker) filename(fileNo int) string {
-	file := check.files[fileNo]
-	if pos := file.Pos(); pos.IsValid() {
-		return check.fset.File(pos).Name()
-	}
-	return fmt.Sprintf("file[%d]", fileNo)
-}
-
-// collectObjects collects all file and package objects and inserts them
-// into their respective scopes. It also performs imports and associates
-// methods with receiver base type names.
-func (check *Checker) collectObjects() {
-	pkg := check.pkg
-
-	importer := check.conf.Import
-	if importer == nil {
-		if DefaultImport != nil {
-			importer = DefaultImport
-		} else {
-			// Panic if we encounter an import.
-			importer = func(map[string]*Package, string) (*Package, error) {
-				panic(`no Config.Import or DefaultImport (missing import _ "llvm.org/llgo/third_party/gotools/go/gcimporter"?)`)
-			}
-		}
-	}
-
-	// pkgImports is the set of packages already imported by any package file seen
-	// so far. Used to avoid duplicate entries in pkg.imports. Allocate and populate
-	// it (pkg.imports may not be empty if we are checking test files incrementally).
-	var pkgImports = make(map[*Package]bool)
-	for _, imp := range pkg.imports {
-		pkgImports[imp] = true
-	}
-
-	for fileNo, file := range check.files {
-		// The package identifier denotes the current package,
-		// but there is no corresponding package object.
-		check.recordDef(file.Name, nil)
-
-		fileScope := NewScope(check.pkg.scope, check.filename(fileNo))
-		check.recordScope(file, fileScope)
-
-		for _, decl := range file.Decls {
-			switch d := decl.(type) {
-			case *ast.BadDecl:
-				// ignore
-
-			case *ast.GenDecl:
-				var last *ast.ValueSpec // last ValueSpec with type or init exprs seen
-				for iota, spec := range d.Specs {
-					switch s := spec.(type) {
-					case *ast.ImportSpec:
-						// import package
-						var imp *Package
-						path, err := validatedImportPath(s.Path.Value)
-						if err != nil {
-							check.errorf(s.Path.Pos(), "invalid import path (%s)", err)
-							continue
-						}
-						if path == "C" && check.conf.FakeImportC {
-							// TODO(gri) shouldn't create a new one each time
-							imp = NewPackage("C", "C")
-							imp.fake = true
-						} else {
-							var err error
-							imp, err = importer(check.conf.Packages, path)
-							if imp == nil && err == nil {
-								err = errors.New("Config.Import returned nil but no error")
-							}
-							if err != nil {
-								check.errorf(s.Path.Pos(), "could not import %s (%s)", path, err)
-								continue
-							}
-						}
-
-						// add package to list of explicit imports
-						// (this functionality is provided as a convenience
-						// for clients; it is not needed for type-checking)
-						if !pkgImports[imp] {
-							pkgImports[imp] = true
-							if imp != Unsafe {
-								pkg.imports = append(pkg.imports, imp)
-							}
-						}
-
-						// local name overrides imported package name
-						name := imp.name
-						if s.Name != nil {
-							name = s.Name.Name
-							if name == "init" {
-								check.errorf(s.Name.Pos(), "cannot declare init - must be func")
-								continue
-							}
-						}
-
-						obj := NewPkgName(s.Pos(), pkg, name, imp)
-						if s.Name != nil {
-							// in a dot-import, the dot represents the package
-							check.recordDef(s.Name, obj)
-						} else {
-							check.recordImplicit(s, obj)
-						}
-
-						// add import to file scope
-						if name == "." {
-							// merge imported scope with file scope
-							for _, obj := range imp.scope.elems {
-								// A package scope may contain non-exported objects,
-								// do not import them!
-								if obj.Exported() {
-									// TODO(gri) When we import a package, we create
-									// a new local package object. We should do the
-									// same for each dot-imported object. That way
-									// they can have correct position information.
-									// (We must not modify their existing position
-									// information because the same package - found
-									// via Config.Packages - may be dot-imported in
-									// another package!)
-									check.declare(fileScope, nil, obj)
-									check.recordImplicit(s, obj)
-								}
-							}
-							// add position to set of dot-import positions for this file
-							// (this is only needed for "imported but not used" errors)
-							check.addUnusedDotImport(fileScope, imp, s.Pos())
-						} else {
-							// declare imported package object in file scope
-							check.declare(fileScope, nil, obj)
-						}
-
-					case *ast.ValueSpec:
-						switch d.Tok {
-						case token.CONST:
-							// determine which initialization expressions to use
-							switch {
-							case s.Type != nil || len(s.Values) > 0:
-								last = s
-							case last == nil:
-								last = new(ast.ValueSpec) // make sure last exists
-							}
-
-							// declare all constants
-							for i, name := range s.Names {
-								obj := NewConst(name.Pos(), pkg, name.Name, nil, exact.MakeInt64(int64(iota)))
-
-								var init ast.Expr
-								if i < len(last.Values) {
-									init = last.Values[i]
-								}
-
-								d := &declInfo{file: fileScope, typ: last.Type, init: init}
-								check.declarePkgObj(name, obj, d)
-							}
-
-							check.arityMatch(s, last)
-
-						case token.VAR:
-							lhs := make([]*Var, len(s.Names))
-							// If there's exactly one rhs initializer, use
-							// the same declInfo d1 for all lhs variables
-							// so that each lhs variable depends on the same
-							// rhs initializer (n:1 var declaration).
-							var d1 *declInfo
-							if len(s.Values) == 1 {
-								// The lhs elements are only set up after the for loop below,
-								// but that's ok because declareVar only collects the declInfo
-								// for a later phase.
-								d1 = &declInfo{file: fileScope, lhs: lhs, typ: s.Type, init: s.Values[0]}
-							}
-
-							// declare all variables
-							for i, name := range s.Names {
-								obj := NewVar(name.Pos(), pkg, name.Name, nil)
-								lhs[i] = obj
-
-								d := d1
-								if d == nil {
-									// individual assignments
-									var init ast.Expr
-									if i < len(s.Values) {
-										init = s.Values[i]
-									}
-									d = &declInfo{file: fileScope, typ: s.Type, init: init}
-								}
-
-								check.declarePkgObj(name, obj, d)
-							}
-
-							check.arityMatch(s, nil)
-
-						default:
-							check.invalidAST(s.Pos(), "invalid token %s", d.Tok)
-						}
-
-					case *ast.TypeSpec:
-						obj := NewTypeName(s.Name.Pos(), pkg, s.Name.Name, nil)
-						check.declarePkgObj(s.Name, obj, &declInfo{file: fileScope, typ: s.Type})
-
-					default:
-						check.invalidAST(s.Pos(), "unknown ast.Spec node %T", s)
-					}
-				}
-
-			case *ast.FuncDecl:
-				name := d.Name.Name
-				obj := NewFunc(d.Name.Pos(), pkg, name, nil)
-				if d.Recv == nil {
-					// regular function
-					if name == "init" {
-						// don't declare init functions in the package scope - they are invisible
-						obj.parent = pkg.scope
-						check.recordDef(d.Name, obj)
-						// init functions must have a body
-						if d.Body == nil {
-							check.softErrorf(obj.pos, "missing function body")
-						}
-					} else {
-						check.declare(pkg.scope, d.Name, obj)
-					}
-				} else {
-					// method
-					check.recordDef(d.Name, obj)
-					// Associate method with receiver base type name, if possible.
-					// Ignore methods that have an invalid receiver, or a blank _
-					// receiver name. They will be type-checked later, with regular
-					// functions.
-					if list := d.Recv.List; len(list) > 0 {
-						typ := list[0].Type
-						if ptr, _ := typ.(*ast.StarExpr); ptr != nil {
-							typ = ptr.X
-						}
-						if base, _ := typ.(*ast.Ident); base != nil && base.Name != "_" {
-							check.assocMethod(base.Name, obj)
-						}
-					}
-				}
-				info := &declInfo{file: fileScope, fdecl: d}
-				check.objMap[obj] = info
-				obj.setOrder(uint32(len(check.objMap)))
-
-			default:
-				check.invalidAST(d.Pos(), "unknown ast.Decl node %T", d)
-			}
-		}
-	}
-
-	// verify that objects in package and file scopes have different names
-	for _, scope := range check.pkg.scope.children /* file scopes */ {
-		for _, obj := range scope.elems {
-			if alt := pkg.scope.Lookup(obj.Name()); alt != nil {
-				if pkg, ok := obj.(*PkgName); ok {
-					check.errorf(alt.Pos(), "%s already declared through import of %s", alt.Name(), pkg.Imported())
-					check.reportAltDecl(pkg)
-				} else {
-					check.errorf(alt.Pos(), "%s already declared through dot-import of %s", alt.Name(), obj.Pkg())
-					// TODO(gri) dot-imported objects don't have a position; reportAltDecl won't print anything
-					check.reportAltDecl(obj)
-				}
-			}
-		}
-	}
-}
-
-// packageObjects typechecks all package objects in objList, but not function bodies.
-func (check *Checker) packageObjects(objList []Object) {
-	// add new methods to already type-checked types (from a prior Checker.Files call)
-	for _, obj := range objList {
-		if obj, _ := obj.(*TypeName); obj != nil && obj.typ != nil {
-			check.addMethodDecls(obj)
-		}
-	}
-
-	// pre-allocate space for type declaration paths so that the underlying array is reused
-	typePath := make([]*TypeName, 0, 8)
-
-	for _, obj := range objList {
-		check.objDecl(obj, nil, typePath)
-	}
-
-	// At this point we may have a non-empty check.methods map; this means that not all
-	// entries were deleted at the end of typeDecl because the respective receiver base
-	// types were not found. In that case, an error was reported when declaring those
-	// methods. We can now safely discard this map.
-	check.methods = nil
-}
-
-// functionBodies typechecks all function bodies.
-func (check *Checker) functionBodies() {
-	for _, f := range check.funcs {
-		check.funcBody(f.decl, f.name, f.sig, f.body)
-	}
-}
-
-// unusedImports checks for unused imports.
-func (check *Checker) unusedImports() {
-	// if function bodies are not checked, packages' uses are likely missing - don't check
-	if check.conf.IgnoreFuncBodies {
-		return
-	}
-
-	// spec: "It is illegal (...) to directly import a package without referring to
-	// any of its exported identifiers. To import a package solely for its side-effects
-	// (initialization), use the blank identifier as explicit package name."
-
-	// check use of regular imported packages
-	for _, scope := range check.pkg.scope.children /* file scopes */ {
-		for _, obj := range scope.elems {
-			if obj, ok := obj.(*PkgName); ok {
-				// Unused "blank imports" are automatically ignored
-				// since _ identifiers are not entered into scopes.
-				if !obj.used {
-					path := obj.imported.path
-					base := pathLib.Base(path)
-					if obj.name == base {
-						check.softErrorf(obj.pos, "%q imported but not used", path)
-					} else {
-						check.softErrorf(obj.pos, "%q imported but not used as %s", path, obj.name)
-					}
-				}
-			}
-		}
-	}
-
-	// check use of dot-imported packages
-	for _, unusedDotImports := range check.unusedDotImports {
-		for pkg, pos := range unusedDotImports {
-			check.softErrorf(pos, "%q imported but not used", pkg.path)
-		}
-	}
-}
diff --git a/third_party/gotools/go/types/resolver_test.go b/third_party/gotools/go/types/resolver_test.go
deleted file mode 100644
index 6ff8fae..0000000
--- a/third_party/gotools/go/types/resolver_test.go
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"sort"
-	"testing"
-
-	_ "llvm.org/llgo/third_party/gotools/go/gcimporter"
-	. "llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var sources = []string{
-	`
-	package p
-	import "fmt"
-	import "math"
-	const pi = math.Pi
-	func sin(x float64) float64 {
-		return math.Sin(x)
-	}
-	var Println = fmt.Println
-	`,
-	`
-	package p
-	import "fmt"
-	type errorStringer struct { fmt.Stringer; error }
-	func f() string {
-		_ = "foo"
-		return fmt.Sprintf("%d", g())
-	}
-	func g() (x int) { return }
-	`,
-	`
-	package p
-	import . "go/parser"
-	import "sync"
-	func h() Mode { return ImportsOnly }
-	var _, x int = 1, 2
-	func init() {}
-	type T struct{ *sync.Mutex; a, b, c int}
-	type I interface{ m() }
-	var _ = T{a: 1, b: 2, c: 3}
-	func (_ T) m() {}
-	func (T) _() {}
-	var i I
-	var _ = i.m
-	func _(s []int) { for i, x := range s { _, _ = i, x } }
-	func _(x interface{}) {
-		switch x := x.(type) {
-		case int:
-			_ = x
-		}
-		switch {} // implicit 'true' tag
-	}
-	`,
-	`
-	package p
-	type S struct{}
-	func (T) _() {}
-	func (T) _() {}
-	`,
-	`
-	package p
-	func _() {
-	L0:
-	L1:
-		goto L0
-		for {
-			goto L1
-		}
-		if true {
-			goto L2
-		}
-	L2:
-	}
-	`,
-}
-
-var pkgnames = []string{
-	"fmt",
-	"math",
-}
-
-func TestResolveIdents(t *testing.T) {
-	// parse package files
-	fset := token.NewFileSet()
-	var files []*ast.File
-	for i, src := range sources {
-		f, err := parser.ParseFile(fset, fmt.Sprintf("sources[%d]", i), src, parser.DeclarationErrors)
-		if err != nil {
-			t.Fatal(err)
-		}
-		files = append(files, f)
-	}
-
-	// resolve and type-check package AST
-	var conf Config
-	uses := make(map[*ast.Ident]Object)
-	defs := make(map[*ast.Ident]Object)
-	_, err := conf.Check("testResolveIdents", fset, files, &Info{Defs: defs, Uses: uses})
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// check that all packages were imported
-	for _, name := range pkgnames {
-		if conf.Packages[name] == nil {
-			t.Errorf("package %s not imported", name)
-		}
-	}
-
-	// check that qualified identifiers are resolved
-	for _, f := range files {
-		ast.Inspect(f, func(n ast.Node) bool {
-			if s, ok := n.(*ast.SelectorExpr); ok {
-				if x, ok := s.X.(*ast.Ident); ok {
-					obj := uses[x]
-					if obj == nil {
-						t.Errorf("%s: unresolved qualified identifier %s", fset.Position(x.Pos()), x.Name)
-						return false
-					}
-					if _, ok := obj.(*PkgName); ok && uses[s.Sel] == nil {
-						t.Errorf("%s: unresolved selector %s", fset.Position(s.Sel.Pos()), s.Sel.Name)
-						return false
-					}
-					return false
-				}
-				return false
-			}
-			return true
-		})
-	}
-
-	for id, obj := range uses {
-		if obj == nil {
-			t.Errorf("%s: Uses[%s] == nil", fset.Position(id.Pos()), id.Name)
-		}
-	}
-
-	// check that each identifier in the source is found in uses or defs or both
-	var both []string
-	for _, f := range files {
-		ast.Inspect(f, func(n ast.Node) bool {
-			if x, ok := n.(*ast.Ident); ok {
-				var objects int
-				if _, found := uses[x]; found {
-					objects |= 1
-					delete(uses, x)
-				}
-				if _, found := defs[x]; found {
-					objects |= 2
-					delete(defs, x)
-				}
-				if objects == 0 {
-					t.Errorf("%s: unresolved identifier %s", fset.Position(x.Pos()), x.Name)
-				} else if objects == 3 {
-					both = append(both, x.Name)
-				}
-				return false
-			}
-			return true
-		})
-	}
-
-	// check the expected set of idents that are simultaneously uses and defs
-	sort.Strings(both)
-	if got, want := fmt.Sprint(both), "[Mutex Stringer error]"; got != want {
-		t.Errorf("simultaneous uses/defs = %s, want %s", got, want)
-	}
-
-	// any left-over identifiers didn't exist in the source
-	for x := range uses {
-		t.Errorf("%s: identifier %s not present in source", fset.Position(x.Pos()), x.Name)
-	}
-	for x := range defs {
-		t.Errorf("%s: identifier %s not present in source", fset.Position(x.Pos()), x.Name)
-	}
-
-	// TODO(gri) add tests to check ImplicitObj callbacks
-}
diff --git a/third_party/gotools/go/types/return.go b/third_party/gotools/go/types/return.go
deleted file mode 100644
index df5a482..0000000
--- a/third_party/gotools/go/types/return.go
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements isTerminating.
-
-package types
-
-import (
-	"go/ast"
-	"go/token"
-)
-
-// isTerminating reports if s is a terminating statement.
-// If s is labeled, label is the label name; otherwise s
-// is "".
-func (check *Checker) isTerminating(s ast.Stmt, label string) bool {
-	switch s := s.(type) {
-	default:
-		unreachable()
-
-	case *ast.BadStmt, *ast.DeclStmt, *ast.EmptyStmt, *ast.SendStmt,
-		*ast.IncDecStmt, *ast.AssignStmt, *ast.GoStmt, *ast.DeferStmt,
-		*ast.RangeStmt:
-		// no chance
-
-	case *ast.LabeledStmt:
-		return check.isTerminating(s.Stmt, s.Label.Name)
-
-	case *ast.ExprStmt:
-		// the predeclared (possibly parenthesized) panic() function is terminating
-		if call, _ := unparen(s.X).(*ast.CallExpr); call != nil {
-			if id, _ := call.Fun.(*ast.Ident); id != nil {
-				if _, obj := check.scope.LookupParent(id.Name); obj != nil {
-					if b, _ := obj.(*Builtin); b != nil && b.id == _Panic {
-						return true
-					}
-				}
-			}
-		}
-
-	case *ast.ReturnStmt:
-		return true
-
-	case *ast.BranchStmt:
-		if s.Tok == token.GOTO || s.Tok == token.FALLTHROUGH {
-			return true
-		}
-
-	case *ast.BlockStmt:
-		return check.isTerminatingList(s.List, "")
-
-	case *ast.IfStmt:
-		if s.Else != nil &&
-			check.isTerminating(s.Body, "") &&
-			check.isTerminating(s.Else, "") {
-			return true
-		}
-
-	case *ast.SwitchStmt:
-		return check.isTerminatingSwitch(s.Body, label)
-
-	case *ast.TypeSwitchStmt:
-		return check.isTerminatingSwitch(s.Body, label)
-
-	case *ast.SelectStmt:
-		for _, s := range s.Body.List {
-			cc := s.(*ast.CommClause)
-			if !check.isTerminatingList(cc.Body, "") || hasBreakList(cc.Body, label, true) {
-				return false
-			}
-
-		}
-		return true
-
-	case *ast.ForStmt:
-		if s.Cond == nil && !hasBreak(s.Body, label, true) {
-			return true
-		}
-	}
-
-	return false
-}
-
-func (check *Checker) isTerminatingList(list []ast.Stmt, label string) bool {
-	n := len(list)
-	return n > 0 && check.isTerminating(list[n-1], label)
-}
-
-func (check *Checker) isTerminatingSwitch(body *ast.BlockStmt, label string) bool {
-	hasDefault := false
-	for _, s := range body.List {
-		cc := s.(*ast.CaseClause)
-		if cc.List == nil {
-			hasDefault = true
-		}
-		if !check.isTerminatingList(cc.Body, "") || hasBreakList(cc.Body, label, true) {
-			return false
-		}
-	}
-	return hasDefault
-}
-
-// TODO(gri) For nested breakable statements, the current implementation of hasBreak
-//	     will traverse the same subtree repeatedly, once for each label. Replace
-//           with a single-pass label/break matching phase.
-
-// hasBreak reports if s is or contains a break statement
-// referring to the label-ed statement or implicit-ly the
-// closest outer breakable statement.
-func hasBreak(s ast.Stmt, label string, implicit bool) bool {
-	switch s := s.(type) {
-	default:
-		unreachable()
-
-	case *ast.BadStmt, *ast.DeclStmt, *ast.EmptyStmt, *ast.ExprStmt,
-		*ast.SendStmt, *ast.IncDecStmt, *ast.AssignStmt, *ast.GoStmt,
-		*ast.DeferStmt, *ast.ReturnStmt:
-		// no chance
-
-	case *ast.LabeledStmt:
-		return hasBreak(s.Stmt, label, implicit)
-
-	case *ast.BranchStmt:
-		if s.Tok == token.BREAK {
-			if s.Label == nil {
-				return implicit
-			}
-			if s.Label.Name == label {
-				return true
-			}
-		}
-
-	case *ast.BlockStmt:
-		return hasBreakList(s.List, label, implicit)
-
-	case *ast.IfStmt:
-		if hasBreak(s.Body, label, implicit) ||
-			s.Else != nil && hasBreak(s.Else, label, implicit) {
-			return true
-		}
-
-	case *ast.CaseClause:
-		return hasBreakList(s.Body, label, implicit)
-
-	case *ast.SwitchStmt:
-		if label != "" && hasBreak(s.Body, label, false) {
-			return true
-		}
-
-	case *ast.TypeSwitchStmt:
-		if label != "" && hasBreak(s.Body, label, false) {
-			return true
-		}
-
-	case *ast.CommClause:
-		return hasBreakList(s.Body, label, implicit)
-
-	case *ast.SelectStmt:
-		if label != "" && hasBreak(s.Body, label, false) {
-			return true
-		}
-
-	case *ast.ForStmt:
-		if label != "" && hasBreak(s.Body, label, false) {
-			return true
-		}
-
-	case *ast.RangeStmt:
-		if label != "" && hasBreak(s.Body, label, false) {
-			return true
-		}
-	}
-
-	return false
-}
-
-func hasBreakList(list []ast.Stmt, label string, implicit bool) bool {
-	for _, s := range list {
-		if hasBreak(s, label, implicit) {
-			return true
-		}
-	}
-	return false
-}
diff --git a/third_party/gotools/go/types/scope.go b/third_party/gotools/go/types/scope.go
deleted file mode 100644
index 8ab0f64..0000000
--- a/third_party/gotools/go/types/scope.go
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements Scopes.
-
-package types
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"sort"
-	"strings"
-)
-
-// TODO(gri) Provide scopes with a name or other mechanism so that
-//           objects can use that information for better printing.
-
-// A Scope maintains a set of objects and links to its containing
-// (parent) and contained (children) scopes. Objects may be inserted
-// and looked up by name. The zero value for Scope is a ready-to-use
-// empty scope.
-type Scope struct {
-	parent   *Scope
-	children []*Scope
-	comment  string            // for debugging only
-	elems    map[string]Object // lazily allocated
-}
-
-// NewScope returns a new, empty scope contained in the given parent
-// scope, if any.  The comment is for debugging only.
-func NewScope(parent *Scope, comment string) *Scope {
-	s := &Scope{parent: parent, comment: comment}
-	// don't add children to Universe scope!
-	if parent != nil && parent != Universe {
-		parent.children = append(parent.children, s)
-	}
-	return s
-}
-
-// Parent returns the scope's containing (parent) scope.
-func (s *Scope) Parent() *Scope { return s.parent }
-
-// Len() returns the number of scope elements.
-func (s *Scope) Len() int { return len(s.elems) }
-
-// Names returns the scope's element names in sorted order.
-func (s *Scope) Names() []string {
-	names := make([]string, len(s.elems))
-	i := 0
-	for name := range s.elems {
-		names[i] = name
-		i++
-	}
-	sort.Strings(names)
-	return names
-}
-
-// NumChildren() returns the number of scopes nested in s.
-func (s *Scope) NumChildren() int { return len(s.children) }
-
-// Child returns the i'th child scope for 0 <= i < NumChildren().
-func (s *Scope) Child(i int) *Scope { return s.children[i] }
-
-// Lookup returns the object in scope s with the given name if such an
-// object exists; otherwise the result is nil.
-func (s *Scope) Lookup(name string) Object {
-	return s.elems[name]
-}
-
-// LookupParent follows the parent chain of scopes starting with s until
-// it finds a scope where Lookup(name) returns a non-nil object, and then
-// returns that scope and object. If no such scope exists, the result is (nil, nil).
-//
-// Note that obj.Parent() may be different from the returned scope if the
-// object was inserted into the scope and already had a parent at that
-// time (see Insert, below). This can only happen for dot-imported objects
-// whose scope is the scope of the package that exported them.
-func (s *Scope) LookupParent(name string) (*Scope, Object) {
-	for ; s != nil; s = s.parent {
-		if obj := s.elems[name]; obj != nil {
-			return s, obj
-		}
-	}
-	return nil, nil
-}
-
-// Insert attempts to insert an object obj into scope s.
-// If s already contains an alternative object alt with
-// the same name, Insert leaves s unchanged and returns alt.
-// Otherwise it inserts obj, sets the object's parent scope
-// if not already set, and returns nil.
-func (s *Scope) Insert(obj Object) Object {
-	name := obj.Name()
-	if alt := s.elems[name]; alt != nil {
-		return alt
-	}
-	if s.elems == nil {
-		s.elems = make(map[string]Object)
-	}
-	s.elems[name] = obj
-	if obj.Parent() == nil {
-		obj.setParent(s)
-	}
-	return nil
-}
-
-// WriteTo writes a string representation of the scope to w,
-// with the scope elements sorted by name.
-// The level of indentation is controlled by n >= 0, with
-// n == 0 for no indentation.
-// If recurse is set, it also writes nested (children) scopes.
-func (s *Scope) WriteTo(w io.Writer, n int, recurse bool) {
-	const ind = ".  "
-	indn := strings.Repeat(ind, n)
-
-	fmt.Fprintf(w, "%s%s scope %p {", indn, s.comment, s)
-	if len(s.elems) == 0 {
-		fmt.Fprintf(w, "}\n")
-		return
-	}
-
-	fmt.Fprintln(w)
-	indn1 := indn + ind
-	for _, name := range s.Names() {
-		fmt.Fprintf(w, "%s%s\n", indn1, s.elems[name])
-	}
-
-	if recurse {
-		for _, s := range s.children {
-			fmt.Fprintln(w)
-			s.WriteTo(w, n+1, recurse)
-		}
-	}
-
-	fmt.Fprintf(w, "%s}", indn)
-}
-
-// String returns a string representation of the scope, for debugging.
-func (s *Scope) String() string {
-	var buf bytes.Buffer
-	s.WriteTo(&buf, 0, false)
-	return buf.String()
-}
diff --git a/third_party/gotools/go/types/selection.go b/third_party/gotools/go/types/selection.go
deleted file mode 100644
index 1c70165..0000000
--- a/third_party/gotools/go/types/selection.go
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements Selections.
-
-package types
-
-import (
-	"bytes"
-	"fmt"
-)
-
-// SelectionKind describes the kind of a selector expression x.f
-// (excluding qualified identifiers).
-type SelectionKind int
-
-const (
-	FieldVal   SelectionKind = iota // x.f is a struct field selector
-	MethodVal                       // x.f is a method selector
-	MethodExpr                      // x.f is a method expression
-)
-
-// A Selection describes a selector expression x.f.
-// For the declarations:
-//
-//	type T struct{ x int; E }
-//	type E struct{}
-//	func (e E) m() {}
-//	var p *T
-//
-// the following relations exist:
-//
-//	Selector    Kind          Recv    Obj    Type               Index     Indirect
-//
-//	p.x         FieldVal      T       x      int                {0}       true
-//	p.m         MethodVal     *T      m      func (e *T) m()    {1, 0}    true
-//	T.m         MethodExpr    T       m      func m(_ T)        {1, 0}    false
-//
-type Selection struct {
-	kind     SelectionKind
-	recv     Type   // type of x
-	obj      Object // object denoted by x.f
-	index    []int  // path from x to x.f
-	indirect bool   // set if there was any pointer indirection on the path
-}
-
-// Kind returns the selection kind.
-func (s *Selection) Kind() SelectionKind { return s.kind }
-
-// Recv returns the type of x in x.f.
-func (s *Selection) Recv() Type { return s.recv }
-
-// Obj returns the object denoted by x.f; a *Var for
-// a field selection, and a *Func in all other cases.
-func (s *Selection) Obj() Object { return s.obj }
-
-// Type returns the type of x.f, which may be different from the type of f.
-// See Selection for more information.
-func (s *Selection) Type() Type {
-	switch s.kind {
-	case MethodVal:
-		// The type of x.f is a method with its receiver type set
-		// to the type of x.
-		sig := *s.obj.(*Func).typ.(*Signature)
-		recv := *sig.recv
-		recv.typ = s.recv
-		sig.recv = &recv
-		return &sig
-
-	case MethodExpr:
-		// The type of x.f is a function (without receiver)
-		// and an additional first argument with the same type as x.
-		// TODO(gri) Similar code is already in call.go - factor!
-		// TODO(gri) Compute this eagerly to avoid allocations.
-		sig := *s.obj.(*Func).typ.(*Signature)
-		arg0 := *sig.recv
-		sig.recv = nil
-		arg0.typ = s.recv
-		var params []*Var
-		if sig.params != nil {
-			params = sig.params.vars
-		}
-		sig.params = NewTuple(append([]*Var{&arg0}, params...)...)
-		return &sig
-	}
-
-	// In all other cases, the type of x.f is the type of x.
-	return s.obj.Type()
-}
-
-// Index describes the path from x to f in x.f.
-// The last index entry is the field or method index of the type declaring f;
-// either:
-//
-//	1) the list of declared methods of a named type; or
-//	2) the list of methods of an interface type; or
-//	3) the list of fields of a struct type.
-//
-// The earlier index entries are the indices of the embedded fields implicitly
-// traversed to get from (the type of) x to f, starting at embedding depth 0.
-func (s *Selection) Index() []int { return s.index }
-
-// Indirect reports whether any pointer indirection was required to get from
-// x to f in x.f.
-func (s *Selection) Indirect() bool { return s.indirect }
-
-func (s *Selection) String() string { return SelectionString(nil, s) }
-
-// SelectionString returns the string form of s.
-// Type names are printed package-qualified
-// only if they do not belong to this package.
-//
-// Examples:
-//	"field (T) f int"
-//	"method (T) f(X) Y"
-//	"method expr (T) f(X) Y"
-//
-func SelectionString(this *Package, s *Selection) string {
-	var k string
-	switch s.kind {
-	case FieldVal:
-		k = "field "
-	case MethodVal:
-		k = "method "
-	case MethodExpr:
-		k = "method expr "
-	default:
-		unreachable()
-	}
-	var buf bytes.Buffer
-	buf.WriteString(k)
-	buf.WriteByte('(')
-	WriteType(&buf, this, s.Recv())
-	fmt.Fprintf(&buf, ") %s", s.obj.Name())
-	if T := s.Type(); s.kind == FieldVal {
-		buf.WriteByte(' ')
-		WriteType(&buf, this, T)
-	} else {
-		WriteSignature(&buf, this, T.(*Signature))
-	}
-	return buf.String()
-}
diff --git a/third_party/gotools/go/types/self_test.go b/third_party/gotools/go/types/self_test.go
deleted file mode 100644
index bdadd1c..0000000
--- a/third_party/gotools/go/types/self_test.go
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"flag"
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"path/filepath"
-	"testing"
-	"time"
-
-	_ "llvm.org/llgo/third_party/gotools/go/gcimporter"
-	. "llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var benchmark = flag.Bool("b", false, "run benchmarks")
-
-func TestSelf(t *testing.T) {
-	fset := token.NewFileSet()
-	files, err := pkgFiles(fset, ".")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	_, err = Check("go/types", fset, files)
-	if err != nil {
-		// Importing go.tools/go/exact doensn't work in the
-		// build dashboard environment. Don't report an error
-		// for now so that the build remains green.
-		// TODO(gri) fix this
-		t.Log(err) // replace w/ t.Fatal eventually
-		return
-	}
-}
-
-func TestBenchmark(t *testing.T) {
-	if !*benchmark {
-		return
-	}
-
-	// We're not using testing's benchmarking mechanism directly
-	// because we want custom output.
-
-	for _, p := range []string{"types", "exact", "gcimporter"} {
-		path := filepath.Join("..", p)
-		runbench(t, path, false)
-		runbench(t, path, true)
-		fmt.Println()
-	}
-}
-
-func runbench(t *testing.T, path string, ignoreFuncBodies bool) {
-	fset := token.NewFileSet()
-	files, err := pkgFiles(fset, path)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	b := testing.Benchmark(func(b *testing.B) {
-		for i := 0; i < b.N; i++ {
-			conf := Config{IgnoreFuncBodies: ignoreFuncBodies}
-			conf.Check(path, fset, files, nil)
-		}
-	})
-
-	// determine line count
-	lines := 0
-	fset.Iterate(func(f *token.File) bool {
-		lines += f.LineCount()
-		return true
-	})
-
-	d := time.Duration(b.NsPerOp())
-	fmt.Printf(
-		"%s: %s for %d lines (%d lines/s), ignoreFuncBodies = %v\n",
-		filepath.Base(path), d, lines, int64(float64(lines)/d.Seconds()), ignoreFuncBodies,
-	)
-}
-
-func pkgFiles(fset *token.FileSet, path string) ([]*ast.File, error) {
-	filenames, err := pkgFilenames(path) // from stdlib_test.go
-	if err != nil {
-		return nil, err
-	}
-
-	var files []*ast.File
-	for _, filename := range filenames {
-		file, err := parser.ParseFile(fset, filename, nil, 0)
-		if err != nil {
-			return nil, err
-		}
-		files = append(files, file)
-	}
-
-	return files, nil
-}
diff --git a/third_party/gotools/go/types/sizes.go b/third_party/gotools/go/types/sizes.go
deleted file mode 100644
index 56fb310..0000000
--- a/third_party/gotools/go/types/sizes.go
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements Sizes.
-
-package types
-
-// Sizes defines the sizing functions for package unsafe.
-type Sizes interface {
-	// Alignof returns the alignment of a variable of type T.
-	// Alignof must implement the alignment guarantees required by the spec.
-	Alignof(T Type) int64
-
-	// Offsetsof returns the offsets of the given struct fields, in bytes.
-	// Offsetsof must implement the offset guarantees required by the spec.
-	Offsetsof(fields []*Var) []int64
-
-	// Sizeof returns the size of a variable of type T.
-	// Sizeof must implement the size guarantees required by the spec.
-	Sizeof(T Type) int64
-}
-
-// StdSizes is a convenience type for creating commonly used Sizes.
-// It makes the following simplifying assumptions:
-//
-//	- The size of explicitly sized basic types (int16, etc.) is the
-//	  specified size.
-//	- The size of strings and interfaces is 2*WordSize.
-//	- The size of slices is 3*WordSize.
-//	- The size of an array of n elements corresponds to the size of
-//	  a struct of n consecutive fields of the array's element type.
-//      - The size of a struct is the offset of the last field plus that
-//	  field's size. As with all element types, if the struct is used
-//	  in an array its size must first be aligned to a multiple of the
-//	  struct's alignment.
-//	- All other types have size WordSize.
-//	- Arrays and structs are aligned per spec definition; all other
-//	  types are naturally aligned with a maximum alignment MaxAlign.
-//
-// *StdSizes implements Sizes.
-//
-type StdSizes struct {
-	WordSize int64 // word size in bytes - must be >= 4 (32bits)
-	MaxAlign int64 // maximum alignment in bytes - must be >= 1
-}
-
-func (s *StdSizes) Alignof(T Type) int64 {
-	// For arrays and structs, alignment is defined in terms
-	// of alignment of the elements and fields, respectively.
-	switch t := T.Underlying().(type) {
-	case *Array:
-		// spec: "For a variable x of array type: unsafe.Alignof(x)
-		// is the same as unsafe.Alignof(x[0]), but at least 1."
-		return s.Alignof(t.elem)
-	case *Struct:
-		// spec: "For a variable x of struct type: unsafe.Alignof(x)
-		// is the largest of the values unsafe.Alignof(x.f) for each
-		// field f of x, but at least 1."
-		max := int64(1)
-		for _, f := range t.fields {
-			if a := s.Alignof(f.typ); a > max {
-				max = a
-			}
-		}
-		return max
-	}
-	a := s.Sizeof(T) // may be 0
-	// spec: "For a variable x of any type: unsafe.Alignof(x) is at least 1."
-	if a < 1 {
-		return 1
-	}
-	if a > s.MaxAlign {
-		return s.MaxAlign
-	}
-	return a
-}
-
-func (s *StdSizes) Offsetsof(fields []*Var) []int64 {
-	offsets := make([]int64, len(fields))
-	var o int64
-	for i, f := range fields {
-		a := s.Alignof(f.typ)
-		o = align(o, a)
-		offsets[i] = o
-		o += s.Sizeof(f.typ)
-	}
-	return offsets
-}
-
-var basicSizes = [...]byte{
-	Bool:       1,
-	Int8:       1,
-	Int16:      2,
-	Int32:      4,
-	Int64:      8,
-	Uint8:      1,
-	Uint16:     2,
-	Uint32:     4,
-	Uint64:     8,
-	Float32:    4,
-	Float64:    8,
-	Complex64:  8,
-	Complex128: 16,
-}
-
-func (s *StdSizes) Sizeof(T Type) int64 {
-	switch t := T.Underlying().(type) {
-	case *Basic:
-		assert(isTyped(T))
-		k := t.kind
-		if int(k) < len(basicSizes) {
-			if s := basicSizes[k]; s > 0 {
-				return int64(s)
-			}
-		}
-		if k == String {
-			return s.WordSize * 2
-		}
-	case *Array:
-		n := t.len
-		if n == 0 {
-			return 0
-		}
-		a := s.Alignof(t.elem)
-		z := s.Sizeof(t.elem)
-		return align(z, a)*(n-1) + z
-	case *Slice:
-		return s.WordSize * 3
-	case *Struct:
-		n := t.NumFields()
-		if n == 0 {
-			return 0
-		}
-		offsets := t.offsets
-		if t.offsets == nil {
-			// compute offsets on demand
-			offsets = s.Offsetsof(t.fields)
-			t.offsets = offsets
-		}
-		return offsets[n-1] + s.Sizeof(t.fields[n-1].typ)
-	case *Interface:
-		return s.WordSize * 2
-	}
-	return s.WordSize // catch-all
-}
-
-// stdSizes is used if Config.Sizes == nil.
-var stdSizes = StdSizes{8, 8}
-
-func (conf *Config) alignof(T Type) int64 {
-	if s := conf.Sizes; s != nil {
-		if a := s.Alignof(T); a >= 1 {
-			return a
-		}
-		panic("Config.Sizes.Alignof returned an alignment < 1")
-	}
-	return stdSizes.Alignof(T)
-}
-
-func (conf *Config) offsetsof(T *Struct) []int64 {
-	offsets := T.offsets
-	if offsets == nil && T.NumFields() > 0 {
-		// compute offsets on demand
-		if s := conf.Sizes; s != nil {
-			offsets = s.Offsetsof(T.fields)
-			// sanity checks
-			if len(offsets) != T.NumFields() {
-				panic("Config.Sizes.Offsetsof returned the wrong number of offsets")
-			}
-			for _, o := range offsets {
-				if o < 0 {
-					panic("Config.Sizes.Offsetsof returned an offset < 0")
-				}
-			}
-		} else {
-			offsets = stdSizes.Offsetsof(T.fields)
-		}
-		T.offsets = offsets
-	}
-	return offsets
-}
-
-// offsetof returns the offset of the field specified via
-// the index sequence relative to typ. All embedded fields
-// must be structs (rather than pointer to structs).
-func (conf *Config) offsetof(typ Type, index []int) int64 {
-	var o int64
-	for _, i := range index {
-		s := typ.Underlying().(*Struct)
-		o += conf.offsetsof(s)[i]
-		typ = s.fields[i].typ
-	}
-	return o
-}
-
-func (conf *Config) sizeof(T Type) int64 {
-	if s := conf.Sizes; s != nil {
-		if z := s.Sizeof(T); z >= 0 {
-			return z
-		}
-		panic("Config.Sizes.Sizeof returned a size < 0")
-	}
-	return stdSizes.Sizeof(T)
-}
-
-// align returns the smallest y >= x such that y % a == 0.
-func align(x, a int64) int64 {
-	y := x + a - 1
-	return y - y%a
-}
diff --git a/third_party/gotools/go/types/stdlib_test.go b/third_party/gotools/go/types/stdlib_test.go
deleted file mode 100644
index 2274934..0000000
--- a/third_party/gotools/go/types/stdlib_test.go
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file tests types.Check by using it to
-// typecheck the standard library and tests.
-
-package types_test
-
-import (
-	"fmt"
-	"go/ast"
-	"go/build"
-	"go/parser"
-	"go/scanner"
-	"go/token"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"testing"
-	"time"
-
-	_ "llvm.org/llgo/third_party/gotools/go/gcimporter"
-	. "llvm.org/llgo/third_party/gotools/go/types"
-)
-
-var (
-	pkgCount int // number of packages processed
-	start    = time.Now()
-)
-
-func TestStdlib(t *testing.T) {
-	walkDirs(t, filepath.Join(runtime.GOROOT(), "src"))
-	if testing.Verbose() {
-		fmt.Println(pkgCount, "packages typechecked in", time.Since(start))
-	}
-}
-
-// firstComment returns the contents of the first comment in
-// the given file, assuming there's one within the first KB.
-func firstComment(filename string) string {
-	f, err := os.Open(filename)
-	if err != nil {
-		return ""
-	}
-	defer f.Close()
-
-	var src [1 << 10]byte // read at most 1KB
-	n, _ := f.Read(src[:])
-
-	var s scanner.Scanner
-	s.Init(fset.AddFile("", fset.Base(), n), src[:n], nil, scanner.ScanComments)
-	for {
-		_, tok, lit := s.Scan()
-		switch tok {
-		case token.COMMENT:
-			// remove trailing */ of multi-line comment
-			if lit[1] == '*' {
-				lit = lit[:len(lit)-2]
-			}
-			return strings.TrimSpace(lit[2:])
-		case token.EOF:
-			return ""
-		}
-	}
-}
-
-func testTestDir(t *testing.T, path string, ignore ...string) {
-	files, err := ioutil.ReadDir(path)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	excluded := make(map[string]bool)
-	for _, filename := range ignore {
-		excluded[filename] = true
-	}
-
-	fset := token.NewFileSet()
-	for _, f := range files {
-		// filter directory contents
-		if f.IsDir() || !strings.HasSuffix(f.Name(), ".go") || excluded[f.Name()] {
-			continue
-		}
-
-		// get per-file instructions
-		expectErrors := false
-		filename := filepath.Join(path, f.Name())
-		if cmd := firstComment(filename); cmd != "" {
-			switch cmd {
-			case "skip", "compiledir":
-				continue // ignore this file
-			case "errorcheck":
-				expectErrors = true
-			}
-		}
-
-		// parse and type-check file
-		file, err := parser.ParseFile(fset, filename, nil, 0)
-		if err == nil {
-			_, err = Check(filename, fset, []*ast.File{file})
-		}
-
-		if expectErrors {
-			if err == nil {
-				t.Errorf("expected errors but found none in %s", filename)
-			}
-		} else {
-			if err != nil {
-				t.Error(err)
-			}
-		}
-	}
-}
-
-func TestStdTest(t *testing.T) {
-	testTestDir(t, filepath.Join(runtime.GOROOT(), "test"),
-		"cmplxdivide.go", // also needs file cmplxdivide1.go - ignore
-		"sigchld.go",     // don't work on Windows; testTestDir should consult build tags
-		"float_lit2.go",  // TODO(gri) enable for releases 1.4 and higher
-	)
-}
-
-func TestStdFixed(t *testing.T) {
-	testTestDir(t, filepath.Join(runtime.GOROOT(), "test", "fixedbugs"),
-		"bug248.go", "bug302.go", "bug369.go", // complex test instructions - ignore
-		"bug459.go",    // possibly incorrect test - see issue 6703 (pending spec clarification)
-		"issue3924.go", // possibly incorrect test - see issue 6671 (pending spec clarification)
-		"issue6889.go", // gc-specific test
-	)
-}
-
-func TestStdKen(t *testing.T) {
-	testTestDir(t, filepath.Join(runtime.GOROOT(), "test", "ken"))
-}
-
-// Package paths of excluded packages.
-var excluded = map[string]bool{
-	"builtin": true,
-}
-
-// typecheck typechecks the given package files.
-func typecheck(t *testing.T, path string, filenames []string) {
-	fset := token.NewFileSet()
-
-	// parse package files
-	var files []*ast.File
-	for _, filename := range filenames {
-		file, err := parser.ParseFile(fset, filename, nil, parser.AllErrors)
-		if err != nil {
-			// the parser error may be a list of individual errors; report them all
-			if list, ok := err.(scanner.ErrorList); ok {
-				for _, err := range list {
-					t.Error(err)
-				}
-				return
-			}
-			t.Error(err)
-			return
-		}
-
-		if testing.Verbose() {
-			if len(files) == 0 {
-				fmt.Println("package", file.Name.Name)
-			}
-			fmt.Println("\t", filename)
-		}
-
-		files = append(files, file)
-	}
-
-	// typecheck package files
-	var conf Config
-	conf.Error = func(err error) { t.Error(err) }
-	info := Info{Uses: make(map[*ast.Ident]Object)}
-	conf.Check(path, fset, files, &info)
-	pkgCount++
-
-	// Perform checks of API invariants.
-
-	// All Objects have a package, except predeclared ones.
-	errorError := Universe.Lookup("error").Type().Underlying().(*Interface).ExplicitMethod(0) // (error).Error
-	for id, obj := range info.Uses {
-		predeclared := obj == Universe.Lookup(obj.Name()) || obj == errorError
-		if predeclared == (obj.Pkg() != nil) {
-			posn := fset.Position(id.Pos())
-			if predeclared {
-				t.Errorf("%s: predeclared object with package: %s", posn, obj)
-			} else {
-				t.Errorf("%s: user-defined object without package: %s", posn, obj)
-			}
-		}
-	}
-}
-
-// pkgFilenames returns the list of package filenames for the given directory.
-func pkgFilenames(dir string) ([]string, error) {
-	ctxt := build.Default
-	ctxt.CgoEnabled = false
-	pkg, err := ctxt.ImportDir(dir, 0)
-	if err != nil {
-		if _, nogo := err.(*build.NoGoError); nogo {
-			return nil, nil // no *.go files, not an error
-		}
-		return nil, err
-	}
-	if excluded[pkg.ImportPath] {
-		return nil, nil
-	}
-	var filenames []string
-	for _, name := range pkg.GoFiles {
-		filenames = append(filenames, filepath.Join(pkg.Dir, name))
-	}
-	for _, name := range pkg.TestGoFiles {
-		filenames = append(filenames, filepath.Join(pkg.Dir, name))
-	}
-	return filenames, nil
-}
-
-// Note: Could use filepath.Walk instead of walkDirs but that wouldn't
-//       necessarily be shorter or clearer after adding the code to
-//       terminate early for -short tests.
-
-func walkDirs(t *testing.T, dir string) {
-	// limit run time for short tests
-	if testing.Short() && time.Since(start) >= 750*time.Millisecond {
-		return
-	}
-
-	fis, err := ioutil.ReadDir(dir)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-
-	// typecheck package in directory
-	files, err := pkgFilenames(dir)
-	if err != nil {
-		t.Error(err)
-		return
-	}
-	if files != nil {
-		typecheck(t, dir, files)
-	}
-
-	// traverse subdirectories, but don't walk into testdata
-	for _, fi := range fis {
-		if fi.IsDir() && fi.Name() != "testdata" {
-			walkDirs(t, filepath.Join(dir, fi.Name()))
-		}
-	}
-}
diff --git a/third_party/gotools/go/types/stmt.go b/third_party/gotools/go/types/stmt.go
deleted file mode 100644
index edc3cef..0000000
--- a/third_party/gotools/go/types/stmt.go
+++ /dev/null
@@ -1,732 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements typechecking of statements.
-
-package types
-
-import (
-	"fmt"
-	"go/ast"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-)
-
-func (check *Checker) funcBody(decl *declInfo, name string, sig *Signature, body *ast.BlockStmt) {
-	if trace {
-		if name == "" {
-			name = "<function literal>"
-		}
-		fmt.Printf("--- %s: %s {\n", name, sig)
-		defer fmt.Println("--- <end>")
-	}
-
-	// save/restore current context and setup function context
-	// (and use 0 indentation at function start)
-	defer func(ctxt context, indent int) {
-		check.context = ctxt
-		check.indent = indent
-	}(check.context, check.indent)
-	check.context = context{
-		decl:  decl,
-		scope: sig.scope,
-		sig:   sig,
-	}
-	check.indent = 0
-
-	check.stmtList(0, body.List)
-
-	if check.hasLabel {
-		check.labels(body)
-	}
-
-	if sig.results.Len() > 0 && !check.isTerminating(body, "") {
-		check.error(body.Rbrace, "missing return")
-	}
-
-	// spec: "Implementation restriction: A compiler may make it illegal to
-	// declare a variable inside a function body if the variable is never used."
-	// (One could check each scope after use, but that distributes this check
-	// over several places because CloseScope is not always called explicitly.)
-	check.usage(sig.scope)
-}
-
-func (check *Checker) usage(scope *Scope) {
-	for _, obj := range scope.elems {
-		if v, _ := obj.(*Var); v != nil && !v.used {
-			check.softErrorf(v.pos, "%s declared but not used", v.name)
-		}
-	}
-	for _, scope := range scope.children {
-		check.usage(scope)
-	}
-}
-
-// stmtContext is a bitset describing which
-// control-flow statements are permissible.
-type stmtContext uint
-
-const (
-	breakOk stmtContext = 1 << iota
-	continueOk
-	fallthroughOk
-)
-
-func (check *Checker) simpleStmt(s ast.Stmt) {
-	if s != nil {
-		check.stmt(0, s)
-	}
-}
-
-func (check *Checker) stmtList(ctxt stmtContext, list []ast.Stmt) {
-	ok := ctxt&fallthroughOk != 0
-	inner := ctxt &^ fallthroughOk
-	for i, s := range list {
-		inner := inner
-		if ok && i+1 == len(list) {
-			inner |= fallthroughOk
-		}
-		check.stmt(inner, s)
-	}
-}
-
-func (check *Checker) multipleDefaults(list []ast.Stmt) {
-	var first ast.Stmt
-	for _, s := range list {
-		var d ast.Stmt
-		switch c := s.(type) {
-		case *ast.CaseClause:
-			if len(c.List) == 0 {
-				d = s
-			}
-		case *ast.CommClause:
-			if c.Comm == nil {
-				d = s
-			}
-		default:
-			check.invalidAST(s.Pos(), "case/communication clause expected")
-		}
-		if d != nil {
-			if first != nil {
-				check.errorf(d.Pos(), "multiple defaults (first at %s)", first.Pos())
-			} else {
-				first = d
-			}
-		}
-	}
-}
-
-func (check *Checker) openScope(s ast.Stmt, comment string) {
-	scope := NewScope(check.scope, comment)
-	check.recordScope(s, scope)
-	check.scope = scope
-}
-
-func (check *Checker) closeScope() {
-	check.scope = check.scope.Parent()
-}
-
-func assignOp(op token.Token) token.Token {
-	// token_test.go verifies the token ordering this function relies on
-	if token.ADD_ASSIGN <= op && op <= token.AND_NOT_ASSIGN {
-		return op + (token.ADD - token.ADD_ASSIGN)
-	}
-	return token.ILLEGAL
-}
-
-func (check *Checker) suspendedCall(keyword string, call *ast.CallExpr) {
-	var x operand
-	var msg string
-	switch check.rawExpr(&x, call, nil) {
-	case conversion:
-		msg = "requires function call, not conversion"
-	case expression:
-		msg = "discards result of"
-	case statement:
-		return
-	default:
-		unreachable()
-	}
-	check.errorf(x.pos(), "%s %s %s", keyword, msg, &x)
-}
-
-func (check *Checker) caseValues(x operand /* copy argument (not *operand!) */, values []ast.Expr) {
-	// No duplicate checking for now. See issue 4524.
-	for _, e := range values {
-		var y operand
-		check.expr(&y, e)
-		if y.mode == invalid {
-			return
-		}
-		// TODO(gri) The convertUntyped call pair below appears in other places. Factor!
-		// Order matters: By comparing y against x, error positions are at the case values.
-		check.convertUntyped(&y, x.typ)
-		if y.mode == invalid {
-			return
-		}
-		check.convertUntyped(&x, y.typ)
-		if x.mode == invalid {
-			return
-		}
-		check.comparison(&y, &x, token.EQL)
-	}
-}
-
-func (check *Checker) caseTypes(x *operand, xtyp *Interface, types []ast.Expr, seen map[Type]token.Pos) (T Type) {
-L:
-	for _, e := range types {
-		T = check.typOrNil(e)
-		if T == Typ[Invalid] {
-			continue
-		}
-		// complain about duplicate types
-		// TODO(gri) use a type hash to avoid quadratic algorithm
-		for t, pos := range seen {
-			if T == nil && t == nil || T != nil && t != nil && Identical(T, t) {
-				// talk about "case" rather than "type" because of nil case
-				check.error(e.Pos(), "duplicate case in type switch")
-				check.errorf(pos, "\tprevious case %s", T) // secondary error, \t indented
-				continue L
-			}
-		}
-		seen[T] = e.Pos()
-		if T != nil {
-			check.typeAssertion(e.Pos(), x, xtyp, T)
-		}
-	}
-	return
-}
-
-// stmt typechecks statement s.
-func (check *Checker) stmt(ctxt stmtContext, s ast.Stmt) {
-	// statements cannot use iota in general
-	// (constant declarations set it explicitly)
-	assert(check.iota == nil)
-
-	// statements must end with the same top scope as they started with
-	if debug {
-		defer func(scope *Scope) {
-			// don't check if code is panicking
-			if p := recover(); p != nil {
-				panic(p)
-			}
-			assert(scope == check.scope)
-		}(check.scope)
-	}
-
-	inner := ctxt &^ fallthroughOk
-	switch s := s.(type) {
-	case *ast.BadStmt, *ast.EmptyStmt:
-		// ignore
-
-	case *ast.DeclStmt:
-		check.declStmt(s.Decl)
-
-	case *ast.LabeledStmt:
-		check.hasLabel = true
-		check.stmt(ctxt, s.Stmt)
-
-	case *ast.ExprStmt:
-		// spec: "With the exception of specific built-in functions,
-		// function and method calls and receive operations can appear
-		// in statement context. Such statements may be parenthesized."
-		var x operand
-		kind := check.rawExpr(&x, s.X, nil)
-		var msg string
-		switch x.mode {
-		default:
-			if kind == statement {
-				return
-			}
-			msg = "is not used"
-		case builtin:
-			msg = "must be called"
-		case typexpr:
-			msg = "is not an expression"
-		}
-		check.errorf(x.pos(), "%s %s", &x, msg)
-
-	case *ast.SendStmt:
-		var ch, x operand
-		check.expr(&ch, s.Chan)
-		check.expr(&x, s.Value)
-		if ch.mode == invalid || x.mode == invalid {
-			return
-		}
-		if tch, ok := ch.typ.Underlying().(*Chan); !ok || tch.dir == RecvOnly || !check.assignment(&x, tch.elem) {
-			if x.mode != invalid {
-				check.invalidOp(ch.pos(), "cannot send %s to channel %s", &x, &ch)
-			}
-		}
-
-	case *ast.IncDecStmt:
-		var op token.Token
-		switch s.Tok {
-		case token.INC:
-			op = token.ADD
-		case token.DEC:
-			op = token.SUB
-		default:
-			check.invalidAST(s.TokPos, "unknown inc/dec operation %s", s.Tok)
-			return
-		}
-		var x operand
-		Y := &ast.BasicLit{ValuePos: s.X.Pos(), Kind: token.INT, Value: "1"} // use x's position
-		check.binary(&x, s.X, Y, op)
-		if x.mode == invalid {
-			return
-		}
-		check.assignVar(s.X, &x)
-
-	case *ast.AssignStmt:
-		switch s.Tok {
-		case token.ASSIGN, token.DEFINE:
-			if len(s.Lhs) == 0 {
-				check.invalidAST(s.Pos(), "missing lhs in assignment")
-				return
-			}
-			if s.Tok == token.DEFINE {
-				check.shortVarDecl(s.TokPos, s.Lhs, s.Rhs)
-			} else {
-				// regular assignment
-				check.assignVars(s.Lhs, s.Rhs)
-			}
-
-		default:
-			// assignment operations
-			if len(s.Lhs) != 1 || len(s.Rhs) != 1 {
-				check.errorf(s.TokPos, "assignment operation %s requires single-valued expressions", s.Tok)
-				return
-			}
-			op := assignOp(s.Tok)
-			if op == token.ILLEGAL {
-				check.invalidAST(s.TokPos, "unknown assignment operation %s", s.Tok)
-				return
-			}
-			var x operand
-			check.binary(&x, s.Lhs[0], s.Rhs[0], op)
-			if x.mode == invalid {
-				return
-			}
-			check.assignVar(s.Lhs[0], &x)
-		}
-
-	case *ast.GoStmt:
-		check.suspendedCall("go", s.Call)
-
-	case *ast.DeferStmt:
-		check.suspendedCall("defer", s.Call)
-
-	case *ast.ReturnStmt:
-		res := check.sig.results
-		if res.Len() > 0 {
-			// function returns results
-			// (if one, say the first, result parameter is named, all of them are named)
-			if len(s.Results) == 0 && res.vars[0].name != "" {
-				// spec: "Implementation restriction: A compiler may disallow an empty expression
-				// list in a "return" statement if a different entity (constant, type, or variable)
-				// with the same name as a result parameter is in scope at the place of the return."
-				for _, obj := range res.vars {
-					if _, alt := check.scope.LookupParent(obj.name); alt != nil && alt != obj {
-						check.errorf(s.Pos(), "result parameter %s not in scope at return", obj.name)
-						check.errorf(alt.Pos(), "\tinner declaration of %s", obj)
-						// ok to continue
-					}
-				}
-			} else {
-				// return has results or result parameters are unnamed
-				check.initVars(res.vars, s.Results, s.Return)
-			}
-		} else if len(s.Results) > 0 {
-			check.error(s.Results[0].Pos(), "no result values expected")
-			check.use(s.Results...)
-		}
-
-	case *ast.BranchStmt:
-		if s.Label != nil {
-			check.hasLabel = true
-			return // checked in 2nd pass (check.labels)
-		}
-		switch s.Tok {
-		case token.BREAK:
-			if ctxt&breakOk == 0 {
-				check.error(s.Pos(), "break not in for, switch, or select statement")
-			}
-		case token.CONTINUE:
-			if ctxt&continueOk == 0 {
-				check.error(s.Pos(), "continue not in for statement")
-			}
-		case token.FALLTHROUGH:
-			if ctxt&fallthroughOk == 0 {
-				check.error(s.Pos(), "fallthrough statement out of place")
-			}
-		default:
-			check.invalidAST(s.Pos(), "branch statement: %s", s.Tok)
-		}
-
-	case *ast.BlockStmt:
-		check.openScope(s, "block")
-		defer check.closeScope()
-
-		check.stmtList(inner, s.List)
-
-	case *ast.IfStmt:
-		check.openScope(s, "if")
-		defer check.closeScope()
-
-		check.simpleStmt(s.Init)
-		var x operand
-		check.expr(&x, s.Cond)
-		if x.mode != invalid && !isBoolean(x.typ) {
-			check.error(s.Cond.Pos(), "non-boolean condition in if statement")
-		}
-		check.stmt(inner, s.Body)
-		if s.Else != nil {
-			check.stmt(inner, s.Else)
-		}
-
-	case *ast.SwitchStmt:
-		inner |= breakOk
-		check.openScope(s, "switch")
-		defer check.closeScope()
-
-		check.simpleStmt(s.Init)
-		var x operand
-		if s.Tag != nil {
-			check.expr(&x, s.Tag)
-		} else {
-			// spec: "A missing switch expression is
-			// equivalent to the boolean value true."
-			x.mode = constant
-			x.typ = Typ[Bool]
-			x.val = exact.MakeBool(true)
-			x.expr = &ast.Ident{NamePos: s.Body.Lbrace, Name: "true"}
-		}
-
-		check.multipleDefaults(s.Body.List)
-
-		for i, c := range s.Body.List {
-			clause, _ := c.(*ast.CaseClause)
-			if clause == nil {
-				check.invalidAST(c.Pos(), "incorrect expression switch case")
-				continue
-			}
-			if x.mode != invalid {
-				check.caseValues(x, clause.List)
-			}
-			check.openScope(clause, "case")
-			inner := inner
-			if i+1 < len(s.Body.List) {
-				inner |= fallthroughOk
-			}
-			check.stmtList(inner, clause.Body)
-			check.closeScope()
-		}
-
-	case *ast.TypeSwitchStmt:
-		inner |= breakOk
-		check.openScope(s, "type switch")
-		defer check.closeScope()
-
-		check.simpleStmt(s.Init)
-
-		// A type switch guard must be of the form:
-		//
-		//     TypeSwitchGuard = [ identifier ":=" ] PrimaryExpr "." "(" "type" ")" .
-		//
-		// The parser is checking syntactic correctness;
-		// remaining syntactic errors are considered AST errors here.
-		// TODO(gri) better factoring of error handling (invalid ASTs)
-		//
-		var lhs *ast.Ident // lhs identifier or nil
-		var rhs ast.Expr
-		switch guard := s.Assign.(type) {
-		case *ast.ExprStmt:
-			rhs = guard.X
-		case *ast.AssignStmt:
-			if len(guard.Lhs) != 1 || guard.Tok != token.DEFINE || len(guard.Rhs) != 1 {
-				check.invalidAST(s.Pos(), "incorrect form of type switch guard")
-				return
-			}
-
-			lhs, _ = guard.Lhs[0].(*ast.Ident)
-			if lhs == nil {
-				check.invalidAST(s.Pos(), "incorrect form of type switch guard")
-				return
-			}
-
-			if lhs.Name == "_" {
-				// _ := x.(type) is an invalid short variable declaration
-				check.softErrorf(lhs.Pos(), "no new variable on left side of :=")
-				lhs = nil // avoid declared but not used error below
-			} else {
-				check.recordDef(lhs, nil) // lhs variable is implicitly declared in each cause clause
-			}
-
-			rhs = guard.Rhs[0]
-
-		default:
-			check.invalidAST(s.Pos(), "incorrect form of type switch guard")
-			return
-		}
-
-		// rhs must be of the form: expr.(type) and expr must be an interface
-		expr, _ := rhs.(*ast.TypeAssertExpr)
-		if expr == nil || expr.Type != nil {
-			check.invalidAST(s.Pos(), "incorrect form of type switch guard")
-			return
-		}
-		var x operand
-		check.expr(&x, expr.X)
-		if x.mode == invalid {
-			return
-		}
-		xtyp, _ := x.typ.Underlying().(*Interface)
-		if xtyp == nil {
-			check.errorf(x.pos(), "%s is not an interface", &x)
-			return
-		}
-
-		check.multipleDefaults(s.Body.List)
-
-		var lhsVars []*Var               // list of implicitly declared lhs variables
-		seen := make(map[Type]token.Pos) // map of seen types to positions
-		for _, s := range s.Body.List {
-			clause, _ := s.(*ast.CaseClause)
-			if clause == nil {
-				check.invalidAST(s.Pos(), "incorrect type switch case")
-				continue
-			}
-			// Check each type in this type switch case.
-			T := check.caseTypes(&x, xtyp, clause.List, seen)
-			check.openScope(clause, "case")
-			// If lhs exists, declare a corresponding variable in the case-local scope.
-			if lhs != nil {
-				// spec: "The TypeSwitchGuard may include a short variable declaration.
-				// When that form is used, the variable is declared at the beginning of
-				// the implicit block in each clause. In clauses with a case listing
-				// exactly one type, the variable has that type; otherwise, the variable
-				// has the type of the expression in the TypeSwitchGuard."
-				if len(clause.List) != 1 || T == nil {
-					T = x.typ
-				}
-				obj := NewVar(lhs.Pos(), check.pkg, lhs.Name, T)
-				check.declare(check.scope, nil, obj)
-				check.recordImplicit(clause, obj)
-				// For the "declared but not used" error, all lhs variables act as
-				// one; i.e., if any one of them is 'used', all of them are 'used'.
-				// Collect them for later analysis.
-				lhsVars = append(lhsVars, obj)
-			}
-			check.stmtList(inner, clause.Body)
-			check.closeScope()
-		}
-
-		// If lhs exists, we must have at least one lhs variable that was used.
-		if lhs != nil {
-			var used bool
-			for _, v := range lhsVars {
-				if v.used {
-					used = true
-				}
-				v.used = true // avoid usage error when checking entire function
-			}
-			if !used {
-				check.softErrorf(lhs.Pos(), "%s declared but not used", lhs.Name)
-			}
-		}
-
-	case *ast.SelectStmt:
-		inner |= breakOk
-
-		check.multipleDefaults(s.Body.List)
-
-		for _, s := range s.Body.List {
-			clause, _ := s.(*ast.CommClause)
-			if clause == nil {
-				continue // error reported before
-			}
-
-			// clause.Comm must be a SendStmt, RecvStmt, or default case
-			valid := false
-			var rhs ast.Expr // rhs of RecvStmt, or nil
-			switch s := clause.Comm.(type) {
-			case nil, *ast.SendStmt:
-				valid = true
-			case *ast.AssignStmt:
-				if len(s.Rhs) == 1 {
-					rhs = s.Rhs[0]
-				}
-			case *ast.ExprStmt:
-				rhs = s.X
-			}
-
-			// if present, rhs must be a receive operation
-			if rhs != nil {
-				if x, _ := unparen(rhs).(*ast.UnaryExpr); x != nil && x.Op == token.ARROW {
-					valid = true
-				}
-			}
-
-			if !valid {
-				check.error(clause.Comm.Pos(), "select case must be send or receive (possibly with assignment)")
-				continue
-			}
-
-			check.openScope(s, "case")
-			if clause.Comm != nil {
-				check.stmt(inner, clause.Comm)
-			}
-			check.stmtList(inner, clause.Body)
-			check.closeScope()
-		}
-
-	case *ast.ForStmt:
-		inner |= breakOk | continueOk
-		check.openScope(s, "for")
-		defer check.closeScope()
-
-		check.simpleStmt(s.Init)
-		if s.Cond != nil {
-			var x operand
-			check.expr(&x, s.Cond)
-			if x.mode != invalid && !isBoolean(x.typ) {
-				check.error(s.Cond.Pos(), "non-boolean condition in for statement")
-			}
-		}
-		check.simpleStmt(s.Post)
-		// spec: "The init statement may be a short variable
-		// declaration, but the post statement must not."
-		if s, _ := s.Post.(*ast.AssignStmt); s != nil && s.Tok == token.DEFINE {
-			check.softErrorf(s.Pos(), "cannot declare in post statement")
-			check.use(s.Lhs...) // avoid follow-up errors
-		}
-		check.stmt(inner, s.Body)
-
-	case *ast.RangeStmt:
-		inner |= breakOk | continueOk
-		check.openScope(s, "for")
-		defer check.closeScope()
-
-		// check expression to iterate over
-		var x operand
-		check.expr(&x, s.X)
-
-		// determine key/value types
-		var key, val Type
-		if x.mode != invalid {
-			switch typ := x.typ.Underlying().(type) {
-			case *Basic:
-				if isString(typ) {
-					key = Typ[Int]
-					val = UniverseRune // use 'rune' name
-				}
-			case *Array:
-				key = Typ[Int]
-				val = typ.elem
-			case *Slice:
-				key = Typ[Int]
-				val = typ.elem
-			case *Pointer:
-				if typ, _ := typ.base.Underlying().(*Array); typ != nil {
-					key = Typ[Int]
-					val = typ.elem
-				}
-			case *Map:
-				key = typ.key
-				val = typ.elem
-			case *Chan:
-				key = typ.elem
-				val = Typ[Invalid]
-				if typ.dir == SendOnly {
-					check.errorf(x.pos(), "cannot range over send-only channel %s", &x)
-					// ok to continue
-				}
-				if s.Value != nil {
-					check.errorf(s.Value.Pos(), "iteration over %s permits only one iteration variable", &x)
-					// ok to continue
-				}
-			}
-		}
-
-		if key == nil {
-			check.errorf(x.pos(), "cannot range over %s", &x)
-			// ok to continue
-		}
-
-		// check assignment to/declaration of iteration variables
-		// (irregular assignment, cannot easily map to existing assignment checks)
-
-		// lhs expressions and initialization value (rhs) types
-		lhs := [2]ast.Expr{s.Key, s.Value}
-		rhs := [2]Type{key, val} // key, val may be nil
-
-		if s.Tok == token.DEFINE {
-			// short variable declaration; variable scope starts after the range clause
-			// (the for loop opens a new scope, so variables on the lhs never redeclare
-			// previously declared variables)
-			var vars []*Var
-			for i, lhs := range lhs {
-				if lhs == nil {
-					continue
-				}
-
-				// determine lhs variable
-				var obj *Var
-				if ident, _ := lhs.(*ast.Ident); ident != nil {
-					// declare new variable
-					name := ident.Name
-					obj = NewVar(ident.Pos(), check.pkg, name, nil)
-					check.recordDef(ident, obj)
-					// _ variables don't count as new variables
-					if name != "_" {
-						vars = append(vars, obj)
-					}
-				} else {
-					check.errorf(lhs.Pos(), "cannot declare %s", lhs)
-					obj = NewVar(lhs.Pos(), check.pkg, "_", nil) // dummy variable
-				}
-
-				// initialize lhs variable
-				if typ := rhs[i]; typ != nil {
-					x.mode = value
-					x.expr = lhs // we don't have a better rhs expression to use here
-					x.typ = typ
-					check.initVar(obj, &x, false)
-				} else {
-					obj.typ = Typ[Invalid]
-					obj.used = true // don't complain about unused variable
-				}
-			}
-
-			// declare variables
-			if len(vars) > 0 {
-				for _, obj := range vars {
-					check.declare(check.scope, nil /* recordDef already called */, obj)
-				}
-			} else {
-				check.error(s.TokPos, "no new variables on left side of :=")
-			}
-		} else {
-			// ordinary assignment
-			for i, lhs := range lhs {
-				if lhs == nil {
-					continue
-				}
-				if typ := rhs[i]; typ != nil {
-					x.mode = value
-					x.expr = lhs // we don't have a better rhs expression to use here
-					x.typ = typ
-					check.assignVar(lhs, &x)
-				}
-			}
-		}
-
-		check.stmt(inner, s.Body)
-
-	default:
-		check.error(s.Pos(), "invalid statement")
-	}
-}
diff --git a/third_party/gotools/go/types/testdata/blank.src b/third_party/gotools/go/types/testdata/blank.src
deleted file mode 100644
index 6a2507f..0000000
--- a/third_party/gotools/go/types/testdata/blank.src
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package _ /* ERROR invalid package name */
diff --git a/third_party/gotools/go/types/testdata/builtins.src b/third_party/gotools/go/types/testdata/builtins.src
deleted file mode 100644
index 9eb551d..0000000
--- a/third_party/gotools/go/types/testdata/builtins.src
+++ /dev/null
@@ -1,881 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// builtin calls
-
-package builtins
-
-import "unsafe"
-
-func f0() {}
-
-func append1() {
-	var b byte
-	var x int
-	var s []byte
-	_ = append() // ERROR not enough arguments
-	_ = append("foo" /* ERROR not a slice */ )
-	_ = append(nil /* ERROR not a slice */ , s)
-	_ = append(x /* ERROR not a slice */ , s)
-	_ = append(s)
-	append /* ERROR not used */ (s)
-
-	_ = append(s, b)
-	_ = append(s, x /* ERROR cannot pass argument x */ )
-	_ = append(s, s /* ERROR cannot pass argument s */ )
-	_ = append(s... /* ERROR can only use ... with matching parameter */ )
-	_ = append(s, b, s... /* ERROR can only use ... with matching parameter */ )
-	_ = append(s, 1, 2, 3)
-	_ = append(s, 1, 2, 3, x /* ERROR cannot pass argument x */ , 5, 6, 6)
-	_ = append(s, 1, 2, s... /* ERROR can only use ... with matching parameter */ )
-	_ = append([]interface{}(nil), 1, 2, "foo", x, 3.1425, false)
-
-	type S []byte
-	type T string
-	var t T
-	_ = append(s, "foo" /* ERROR cannot convert */ )
-	_ = append(s, "foo"...)
-	_ = append(S(s), "foo" /* ERROR cannot convert */ )
-	_ = append(S(s), "foo"...)
-	_ = append(s, t /* ERROR cannot pass argument t */ )
-	_ = append(s, t...)
-	_ = append(s, T("foo")...)
-	_ = append(S(s), t /* ERROR cannot pass argument t */ )
-	_ = append(S(s), t...)
-	_ = append(S(s), T("foo")...)
-	_ = append([]string{}, t /* ERROR cannot pass argument t */ , "foo")
-	_ = append([]T{}, t, "foo")
-}
-
-// from the spec
-func append2() {
-	s0 := []int{0, 0}
-	s1 := append(s0, 2)                // append a single element     s1 == []int{0, 0, 2}
-	s2 := append(s1, 3, 5, 7)          // append multiple elements    s2 == []int{0, 0, 2, 3, 5, 7}
-	s3 := append(s2, s0...)            // append a slice              s3 == []int{0, 0, 2, 3, 5, 7, 0, 0}
-	s4 := append(s3[3:6], s3[2:]...)   // append overlapping slice    s4 == []int{3, 5, 7, 2, 3, 5, 7, 0, 0}
-
-	var t []interface{}
-	t = append(t, 42, 3.1415, "foo")   //                             t == []interface{}{42, 3.1415, "foo"}
-
-	var b []byte
-	b = append(b, "bar"...)            // append string contents      b == []byte{'b', 'a', 'r' }
-
-	_ = s4
-}
-
-func append3() {
-	f1 := func() (s []int) { return }
-	f2 := func() (s []int, x int) { return }
-	f3 := func() (s []int, x, y int) { return }
-	f5 := func() (s []interface{}, x int, y float32, z string, b bool) { return }
-	ff := func() (int, float32) { return 0, 0 }
-	_ = append(f0 /* ERROR used as value */ ())
-	_ = append(f1())
-	_ = append(f2())
-	_ = append(f3())
-	_ = append(f5())
-	_ = append(ff /* ERROR not a slice */ ()) // TODO(gri) better error message
-}
-
-func cap1() {
-	var a [10]bool
-	var p *[20]int
-	var c chan string
-	_ = cap() // ERROR not enough arguments
-	_ = cap(1, 2) // ERROR too many arguments
-	_ = cap(42 /* ERROR invalid */)
-	const _3 = cap(a)
-	assert(_3 == 10)
-	const _4 = cap(p)
-	assert(_4 == 20)
-	_ = cap(c)
-	cap /* ERROR not used */ (c)
-
-	// issue 4744
-	type T struct{ a [10]int }
-	const _ = cap(((*T)(nil)).a)
-
-	var s [][]byte
-	_ = cap(s)
-	_ = cap(s... /* ERROR invalid use of \.\.\. */ )
-}
-
-func cap2() {
-	f1a := func() (a [10]int) { return }
-	f1s := func() (s []int) { return }
-	f2 := func() (s []int, x int) { return }
-	_ = cap(f0 /* ERROR used as value */ ())
-	_ = cap(f1a())
-	_ = cap(f1s())
-	_ = cap(f2()) // ERROR too many arguments
-}
-
-// test cases for issue 7387
-func cap3() {
-	var f = func() int { return 0 }
-	var x = f()
-	const (
-		_ = cap([4]int{})
-		_ = cap([4]int{x})
-		_ = cap /* ERROR not constant */ ([4]int{f()})
-		_ = cap /* ERROR not constant */ ([4]int{cap([]int{})})
-		_ = cap([4]int{cap([4]int{})})
-	)
-	var y float64
-	var z complex128
-	const (
-		_ = cap([4]float64{})
-		_ = cap([4]float64{y})
-		_ = cap([4]float64{real(2i)})
-		_ = cap /* ERROR not constant */ ([4]float64{real(z)})
-	)
-	var ch chan [10]int
-	const (
-		_ = cap /* ERROR not constant */ (<-ch)
-		_ = cap /* ERROR not constant */ ([4]int{(<-ch)[0]})
-	)
-}
-
-func close1() {
-	var c chan int
-	var r <-chan int
-	close() // ERROR not enough arguments
-	close(1, 2) // ERROR too many arguments
-	close(42 /* ERROR not a channel */)
-	close(r /* ERROR receive-only channel */)
-	close(c)
-	_ = close /* ERROR used as value */ (c)
-
-	var s []chan int
-	close(s... /* ERROR invalid use of \.\.\. */ )
-}
-
-func close2() {
-	f1 := func() (ch chan int) { return }
-	f2 := func() (ch chan int, x int) { return }
-	close(f0 /* ERROR used as value */ ())
-	close(f1())
-	close(f2()) // ERROR too many arguments
-}
-
-func complex1() {
-	var i32 int32
-	var f32 float32
-	var f64 float64
-	var c64 complex64
-	var c128 complex128
-	_ = complex() // ERROR not enough arguments
-	_ = complex(1) // ERROR not enough arguments
-	_ = complex(true /* ERROR invalid argument */ , 0)
-	_ = complex(i32 /* ERROR invalid argument */ , 0)
-	_ = complex("foo" /* ERROR invalid argument */ , 0)
-	_ = complex(c64 /* ERROR invalid argument */ , 0)
-	_ = complex(0, true /* ERROR invalid argument */ )
-	_ = complex(0, i32 /* ERROR invalid argument */ )
-	_ = complex(0, "foo" /* ERROR invalid argument */ )
-	_ = complex(0, c64 /* ERROR invalid argument */ )
-	_ = complex(f32, f32)
-	_ = complex(f32, 1)
-	_ = complex(f32, 1.0)
-	_ = complex(f32, 'a')
-	_ = complex(f64, f64)
-	_ = complex(f64, 1)
-	_ = complex(f64, 1.0)
-	_ = complex(f64, 'a')
-	_ = complex(f32 /* ERROR mismatched types */ , f64)
-	_ = complex(f64 /* ERROR mismatched types */ , f32)
-	_ = complex(1, 1)
-	_ = complex(1, 1.1)
-	_ = complex(1, 'a')
-	complex /* ERROR not used */ (1, 2)
-
-	var _ complex64 = complex(f32, f32)
-	var _ complex64 = complex /* ERROR cannot initialize */ (f64, f64)
-
-	var _ complex128 = complex /* ERROR cannot initialize */ (f32, f32)
-	var _ complex128 = complex(f64, f64)
-
-	// untyped constants
-	const _ int = complex(1, 0)
-	const _ float32 = complex(1, 0)
-	const _ complex64 = complex(1, 0)
-	const _ complex128 = complex(1, 0)
-
-	const _ int = complex /* ERROR int */ (1.1, 0)
-	const _ float32 = complex /* ERROR float32 */ (1, 2)
-
-	// untyped values
-	var s uint
-	_ = complex(1 /* ERROR integer */ <<s, 0)
-	const _ = complex /* ERROR not constant */ (1 /* ERROR integer */ <<s, 0)
-	var _ int = complex /* ERROR cannot initialize */ (1 /* ERROR integer */ <<s, 0)
-
-	// floating-point argument types must be identical
-	type F32 float32
-	type F64 float64
-	var x32 F32
-	var x64 F64
-	c64 = complex(x32, x32)
-	_ = complex(x32 /* ERROR mismatched types */ , f32)
-	_ = complex(f32 /* ERROR mismatched types */ , x32)
-	c128 = complex(x64, x64)
-	_ = c128
-	_ = complex(x64 /* ERROR mismatched types */ , f64)
-	_ = complex(f64 /* ERROR mismatched types */ , x64)
-
-	var t []float32
-	_ = complex(t... /* ERROR invalid use of \.\.\. */ )
-}
-
-func complex2() {
-	f1 := func() (x float32) { return }
-	f2 := func() (x, y float32) { return }
-	f3 := func() (x, y, z float32) { return }
-	_ = complex(f0 /* ERROR used as value */ ())
-	_ = complex(f1()) // ERROR not enough arguments
-	_ = complex(f2())
-	_ = complex(f3()) // ERROR too many arguments
-}
-
-func copy1() {
-	copy() // ERROR not enough arguments
-	copy("foo") // ERROR not enough arguments
-	copy([ /* ERROR copy expects slice arguments */ ...]int{}, []int{})
-	copy([ /* ERROR copy expects slice arguments */ ]int{}, [...]int{})
-	copy([ /* ERROR different element types */ ]int8{}, "foo")
-
-	// spec examples
-	var a = [...]int{0, 1, 2, 3, 4, 5, 6, 7}
-	var s = make([]int, 6)
-	var b = make([]byte, 5)
-	n1 := copy(s, a[0:])            // n1 == 6, s == []int{0, 1, 2, 3, 4, 5}
-	n2 := copy(s, s[2:])            // n2 == 4, s == []int{2, 3, 4, 5, 4, 5}
-	n3 := copy(b, "Hello, World!")  // n3 == 5, b == []byte("Hello")
-	_, _, _ = n1, n2, n3
-
-	var t [][]int
-	copy(t, t)
-	copy(t /* ERROR copy expects slice arguments */ , nil)
-	copy(nil /* ERROR copy expects slice arguments */ , t)
-	copy(nil /* ERROR copy expects slice arguments */ , nil)
-	copy(t... /* ERROR invalid use of \.\.\. */ )
-}
-
-func copy2() {
-	f1 := func() (a []int) { return }
-	f2 := func() (a, b []int) { return }
-	f3 := func() (a, b, c []int) { return }
-	copy(f0 /* ERROR used as value */ ())
-	copy(f1()) // ERROR not enough arguments
-	copy(f2())
-	copy(f3()) // ERROR too many arguments
-}
-
-func delete1() {
-	var m map[string]int
-	var s string
-	delete() // ERROR not enough arguments
-	delete(1) // ERROR not enough arguments
-	delete(1, 2, 3) // ERROR too many arguments
-	delete(m, 0 /* ERROR not assignable */)
-	delete(m, s)
-	_ = delete /* ERROR used as value */ (m, s)
-
-	var t []map[string]string
-	delete(t... /* ERROR invalid use of \.\.\. */ )
-}
-
-func delete2() {
-	f1 := func() (m map[string]int) { return }
-	f2 := func() (m map[string]int, k string) { return }
-	f3 := func() (m map[string]int, k string, x float32) { return }
-	delete(f0 /* ERROR used as value */ ())
-	delete(f1()) // ERROR not enough arguments
-	delete(f2())
-	delete(f3()) // ERROR too many arguments
-}
-
-func imag1() {
-	var f32 float32
-	var f64 float64
-	var c64 complex64
-	var c128 complex128
-	_ = imag() // ERROR not enough arguments
-	_ = imag(1, 2) // ERROR too many arguments
-	_ = imag(10 /* ERROR must be a complex number */)
-	_ = imag(2.7182818 /* ERROR must be a complex number */)
-	_ = imag("foo" /* ERROR must be a complex number */)
-	const _5 = imag(1 + 2i)
-	assert(_5 == 2)
-	f32 = _5
-	f64 = _5
-	const _6 = imag(0i)
-	assert(_6 == 0)
-	f32 = imag(c64)
-	f64 = imag(c128)
-	f32 = imag /* ERROR cannot assign */ (c128)
-	f64 = imag /* ERROR cannot assign */ (c64)
-	imag /* ERROR not used */ (c64)
-	_, _ = f32, f64
-
-	// complex type may not be predeclared
-	type C64 complex64
-	type C128 complex128
-	var x64 C64
-	var x128 C128
-	f32 = imag(x64)
-	f64 = imag(x128)
-
-	var s []complex64
-	_ = imag(s... /* ERROR invalid use of \.\.\. */ )
-}
-
-func imag2() {
-	f1 := func() (x complex128) { return }
-	f2 := func() (x, y complex128) { return }
-	_ = imag(f0 /* ERROR used as value */ ())
-	_ = imag(f1())
-	_ = imag(f2()) // ERROR too many arguments
-}
-
-func len1() {
-	const c = "foobar"
-	var a [10]bool
-	var p *[20]int
-	var m map[string]complex128
-	_ = len() // ERROR not enough arguments
-	_ = len(1, 2) // ERROR too many arguments
-	_ = len(42 /* ERROR invalid */)
-	const _3 = len(c)
-	assert(_3 == 6)
-	const _4 = len(a)
-	assert(_4 == 10)
-	const _5 = len(p)
-	assert(_5 == 20)
-	_ = len(m)
-	len /* ERROR not used */ (c)
-
-	// esoteric case
-	var t string
-	var hash map[interface{}][]*[10]int
-	const n = len /* ERROR not constant */ (hash[recover()][len(t)])
-	assert(n == 10) // ok because n has unknown value and no error is reported
-	var ch <-chan int
-	const nn = len /* ERROR not constant */ (hash[<-ch][len(t)])
-
-	// issue 4744
-	type T struct{ a [10]int }
-	const _ = len(((*T)(nil)).a)
-
-	var s [][]byte
-	_ = len(s)
-	_ = len(s... /* ERROR invalid use of \.\.\. */ )
-}
-
-func len2() {
-	f1 := func() (x []int) { return }
-	f2 := func() (x, y []int) { return }
-	_ = len(f0 /* ERROR used as value */ ())
-	_ = len(f1())
-	_ = len(f2()) // ERROR too many arguments
-}
-
-// test cases for issue 7387
-func len3() {
-	var f = func() int { return 0 }
-	var x = f()
-	const (
-		_ = len([4]int{})
-		_ = len([4]int{x})
-		_ = len /* ERROR not constant */ ([4]int{f()})
-		_ = len /* ERROR not constant */ ([4]int{len([]int{})})
-		_ = len([4]int{len([4]int{})})
-	)
-	var y float64
-	var z complex128
-	const (
-		_ = len([4]float64{})
-		_ = len([4]float64{y})
-		_ = len([4]float64{real(2i)})
-		_ = len /* ERROR not constant */ ([4]float64{real(z)})
-	)
-	var ch chan [10]int
-	const (
-		_ = len /* ERROR not constant */ (<-ch)
-		_ = len /* ERROR not constant */ ([4]int{(<-ch)[0]})
-	)
-}
-
-func make1() {
-	var n int
-	var m float32
-	var s uint
-
-	_ = make() // ERROR not enough arguments
-	_ = make(1 /* ERROR not a type */)
-	_ = make(int /* ERROR cannot make */)
-
-	// slices
-	_ = make/* ERROR arguments */ ([]int)
-	_ = make/* ERROR arguments */ ([]int, 2, 3, 4)
-	_ = make([]int, int /* ERROR not an expression */)
-	_ = make([]int, 10, float32 /* ERROR not an expression */)
-	_ = make([]int, "foo" /* ERROR cannot convert */)
-	_ = make([]int, 10, 2.3 /* ERROR truncated */)
-	_ = make([]int, 5, 10.0)
-	_ = make([]int, 0i)
-	_ = make([]int, 1.0)
-	_ = make([]int, 1.0<<s)
-	_ = make([]int, 1.1 /* ERROR int */ <<s)
-	_ = make([]int, - /* ERROR must not be negative */ 1, 10)
-	_ = make([]int, 0, - /* ERROR must not be negative */ 1)
-	_ = make([]int, - /* ERROR must not be negative */ 1, - /* ERROR must not be negative */ 1)
-	_ = make([]int, 1 /* ERROR overflows */ <<100, 1 /* ERROR overflows */ <<100)
-	_ = make([]int, 10 /* ERROR length and capacity swapped */ , 9)
-	_ = make([]int, 1 /* ERROR overflows */ <<100, 12345)
-	_ = make([]int, m /* ERROR must be integer */ )
-        _ = &make /* ERROR cannot take address */ ([]int, 0)
-
-	// maps
-	_ = make /* ERROR arguments */ (map[int]string, 10, 20)
-	_ = make(map[int]float32, int /* ERROR not an expression */)
-	_ = make(map[int]float32, "foo" /* ERROR cannot convert */)
-	_ = make(map[int]float32, 10)
-	_ = make(map[int]float32, n)
-	_ = make(map[int]float32, int64(n))
-	_ = make(map[string]bool, 10.0)
-	_ = make(map[string]bool, 10.0<<s)
-        _ = &make /* ERROR cannot take address */ (map[string]bool)
-
-	// channels
-	_ = make /* ERROR arguments */ (chan int, 10, 20)
-	_ = make(chan int, int /* ERROR not an expression */)
-	_ = make(chan<- int, "foo" /* ERROR cannot convert */)
-	_ = make(chan int, - /* ERROR must not be negative */ 10)
-	_ = make(<-chan float64, 10)
-	_ = make(chan chan int, n)
-	_ = make(chan string, int64(n))
-	_ = make(chan bool, 10.0)
-	_ = make(chan bool, 10.0<<s)
-        _ = &make /* ERROR cannot take address */ (chan bool)
-
-	make /* ERROR not used */ ([]int, 10)
-
-	var t []int
-	_ = make([]int, t[0], t[1])
-	_ = make([]int, t... /* ERROR invalid use of \.\.\. */ )
-}
-
-func make2() {
-	f1 /* ERROR not used */ := func() (x []int) { return }
-	_ = make(f0 /* ERROR not a type */ ())
-	_ = make(f1 /* ERROR not a type */ ())
-}
-
-func new1() {
-	_ = new() // ERROR not enough arguments
-	_ = new(1, 2) // ERROR too many arguments
-	_ = new("foo" /* ERROR not a type */)
-	p := new(float64)
-	_ = new(struct{ x, y int })
-	q := new(*float64)
-	_ = *p == **q
-	new /* ERROR not used */ (int)
-        _ = &new /* ERROR cannot take address */ (int)
-
-	_ = new(int... /* ERROR invalid use of \.\.\. */ )
-}
-
-func new2() {
-	f1 /* ERROR not used */ := func() (x []int) { return }
-	_ = new(f0 /* ERROR not a type */ ())
-	_ = new(f1 /* ERROR not a type */ ())
-}
-
-func panic1() {
-	panic() // ERROR not enough arguments
-	panic(1, 2) // ERROR too many arguments
-	panic(0)
-	panic("foo")
-	panic(false)
-	panic(1<<10)
-	panic(1 /* ERROR overflows */ <<1000)
-	_ = panic /* ERROR used as value */ (0)
-
-	var s []byte
-	panic(s)
-	panic(s... /* ERROR invalid use of \.\.\. */ )
-}
-
-func panic2() {
-	f1 := func() (x int) { return }
-	f2 := func() (x, y int) { return }
-	panic(f0 /* ERROR used as value */ ())
-	panic(f1())
-	panic(f2()) // ERROR too many arguments
-}
-
-func print1() {
-	print()
-	print(1)
-	print(1, 2)
-	print("foo")
-	print(2.718281828)
-	print(false)
-	print(1<<10)
-	print(1 /* ERROR overflows */ <<1000)
-	println(nil /* ERROR untyped nil */ )
-
-	var s []int
-	print(s... /* ERROR invalid use of \.\.\. */ )
-	_ = print /* ERROR used as value */ ()
-}
-
-func print2() {
-	f1 := func() (x int) { return }
-	f2 := func() (x, y int) { return }
-	f3 := func() (x int, y float32, z string) { return }
-	print(f0 /* ERROR used as value */ ())
-	print(f1())
-	print(f2())
-	print(f3())
-}
-
-func println1() {
-	println()
-	println(1)
-	println(1, 2)
-	println("foo")
-	println(2.718281828)
-	println(false)
-	println(1<<10)
-	println(1 /* ERROR overflows */ <<1000)
-	println(nil /* ERROR untyped nil */ )
-
-	var s []int
-	println(s... /* ERROR invalid use of \.\.\. */ )
-	_ = println /* ERROR used as value */ ()
-}
-
-func println2() {
-	f1 := func() (x int) { return }
-	f2 := func() (x, y int) { return }
-	f3 := func() (x int, y float32, z string) { return }
-	println(f0 /* ERROR used as value */ ())
-	println(f1())
-	println(f2())
-	println(f3())
-}
-
-func real1() {
-	var f32 float32
-	var f64 float64
-	var c64 complex64
-	var c128 complex128
-	_ = real() // ERROR not enough arguments
-	_ = real(1, 2) // ERROR too many arguments
-	_ = real(10 /* ERROR must be a complex number */)
-	_ = real(2.7182818 /* ERROR must be a complex number */)
-	_ = real("foo" /* ERROR must be a complex number */)
-	const _5 = real(1 + 2i)
-	assert(_5 == 1)
-	f32 = _5
-	f64 = _5
-	const _6 = real(0i)
-	assert(_6 == 0)
-	f32 = real(c64)
-	f64 = real(c128)
-	f32 = real /* ERROR cannot assign */ (c128)
-	f64 = real /* ERROR cannot assign */ (c64)
-	real /* ERROR not used */ (c64)
-
-	// complex type may not be predeclared
-	type C64 complex64
-	type C128 complex128
-	var x64 C64
-	var x128 C128
-	f32 = imag(x64)
-	f64 = imag(x128)
-
-	var s []complex64
-	_ = real(s... /* ERROR invalid use of \.\.\. */ )
-	_, _ = f32, f64
-}
-
-func real2() {
-	f1 := func() (x complex128) { return }
-	f2 := func() (x, y complex128) { return }
-	_ = real(f0 /* ERROR used as value */ ())
-	_ = real(f1())
-	_ = real(f2()) // ERROR too many arguments
-}
-
-func recover1() {
-	_ = recover()
-	_ = recover(10) // ERROR too many arguments
-	recover()
-
-	var s []int
-	recover(s... /* ERROR invalid use of \.\.\. */ )
-}
-
-func recover2() {
-	f1 := func() (x int) { return }
-	f2 := func() (x, y int) { return }
-	_ = recover(f0 /* ERROR used as value */ ())
-	_ = recover(f1()) // ERROR too many arguments
-	_ = recover(f2()) // ERROR too many arguments
-}
-
-// assuming types.DefaultPtrSize == 8
-type S0 struct{      // offset
-	a bool       //  0
-	b rune       //  4
-	c *int       //  8
-	d bool       // 16
-	e complex128 // 24
-}                    // 40
-
-type S1 struct{   // offset
-	x float32 //  0
-	y string  //  8
-	z *S1     // 24
-	S0        // 32
-}                 // 72
-
-type S2 struct{ // offset
-	*S1     //  0
-}               //  8
-
-type S3 struct { // offset
-	a int64  //  0
-	b int32  //  8
-}                // 12
-
-type S4 struct { // offset
-	S3       //  0
-	int32    // 12
-}                // 16
-
-type S5 struct {   // offset
-	a [3]int32 //  0
-	b int32    // 12
-}                  // 16
-
-func (S2) m() {}
-
-func Alignof1() {
-	var x int
-	_ = unsafe.Alignof() // ERROR not enough arguments
-	_ = unsafe.Alignof(1, 2) // ERROR too many arguments
-	_ = unsafe.Alignof(int /* ERROR not an expression */)
-	_ = unsafe.Alignof(42)
-	_ = unsafe.Alignof(new(struct{}))
-	_ = unsafe.Alignof(1<<10)
-	_ = unsafe.Alignof(1 /* ERROR overflows */ <<1000)
-	_ = unsafe.Alignof(nil /* ERROR "untyped nil */ )
-	unsafe /* ERROR not used */ .Alignof(x)
-
-	var y S0
-	assert(unsafe.Alignof(y.a) == 1)
-	assert(unsafe.Alignof(y.b) == 4)
-	assert(unsafe.Alignof(y.c) == 8)
-	assert(unsafe.Alignof(y.d) == 1)
-	assert(unsafe.Alignof(y.e) == 8)
-
-	var s []byte
-	_ = unsafe.Alignof(s)
-	_ = unsafe.Alignof(s... /* ERROR invalid use of \.\.\. */ )
-}
-
-func Alignof2() {
-	f1 := func() (x int32) { return }
-	f2 := func() (x, y int32) { return }
-	_ = unsafe.Alignof(f0 /* ERROR used as value */ ())
-	assert(unsafe.Alignof(f1()) == 4)
-	_ = unsafe.Alignof(f2()) // ERROR too many arguments
-}
-
-func Offsetof1() {
-	var x struct{ f int }
-	_ = unsafe.Offsetof() // ERROR not enough arguments
-	_ = unsafe.Offsetof(1, 2) // ERROR too many arguments
-	_ = unsafe.Offsetof(int /* ERROR not a selector expression */ )
-	_ = unsafe.Offsetof(x /* ERROR not a selector expression */ )
-	_ = unsafe.Offsetof(nil /* ERROR not a selector expression */ )
-	_ = unsafe.Offsetof(x.f)
-	_ = unsafe.Offsetof((x.f))
-	_ = unsafe.Offsetof((((((((x))).f)))))
-	unsafe /* ERROR not used */ .Offsetof(x.f)
-
-	var y0 S0
-	assert(unsafe.Offsetof(y0.a) == 0)
-	assert(unsafe.Offsetof(y0.b) == 4)
-	assert(unsafe.Offsetof(y0.c) == 8)
-	assert(unsafe.Offsetof(y0.d) == 16)
-	assert(unsafe.Offsetof(y0.e) == 24)
-
-	var y1 S1
-	assert(unsafe.Offsetof(y1.x) == 0)
-	assert(unsafe.Offsetof(y1.y) == 8)
-	assert(unsafe.Offsetof(y1.z) == 24)
-	assert(unsafe.Offsetof(y1.S0) == 32)
-
-	assert(unsafe.Offsetof(y1.S0.a) == 0) // relative to S0
-	assert(unsafe.Offsetof(y1.a) == 32)   // relative to S1
-	assert(unsafe.Offsetof(y1.b) == 36)   // relative to S1
-	assert(unsafe.Offsetof(y1.c) == 40)   // relative to S1
-	assert(unsafe.Offsetof(y1.d) == 48)   // relative to S1
-	assert(unsafe.Offsetof(y1.e) == 56)   // relative to S1
-
-	var y1p *S1
-	assert(unsafe.Offsetof(y1p.S0) == 32)
-
-	type P *S1
-	var p P = y1p
-	assert(unsafe.Offsetof(p.S0) == 32)
-
-	var y2 S2
-	assert(unsafe.Offsetof(y2.S1) == 0)
-	_ = unsafe.Offsetof(y2 /* ERROR embedded via a pointer */ .x)
-	_ = unsafe.Offsetof(y2 /* ERROR method value */ .m)
-
-	var s []byte
-	_ = unsafe.Offsetof(s... /* ERROR invalid use of \.\.\. */ )
-}
-
-func Offsetof2() {
-	f1 := func() (x int32) { return }
-	f2 := func() (x, y int32) { return }
-	_ = unsafe.Offsetof(f0 /* ERROR not a selector expression */ ())
-	_ = unsafe.Offsetof(f1 /* ERROR not a selector expression */ ())
-	_ = unsafe.Offsetof(f2 /* ERROR not a selector expression */ ())
-}
-
-func Sizeof1() {
-	var x int
-	_ = unsafe.Sizeof() // ERROR not enough arguments
-	_ = unsafe.Sizeof(1, 2) // ERROR too many arguments
-	_ = unsafe.Sizeof(int /* ERROR not an expression */)
-	_ = unsafe.Sizeof(42)
-	_ = unsafe.Sizeof(new(complex128))
-	_ = unsafe.Sizeof(1<<10)
-	_ = unsafe.Sizeof(1 /* ERROR overflows */ <<1000)
-	_ = unsafe.Sizeof(nil /* ERROR untyped nil */ )
-	unsafe /* ERROR not used */ .Sizeof(x)
-
-	// basic types have size guarantees
-	assert(unsafe.Sizeof(byte(0)) == 1)
-	assert(unsafe.Sizeof(uint8(0)) == 1)
-	assert(unsafe.Sizeof(int8(0)) == 1)
-	assert(unsafe.Sizeof(uint16(0)) == 2)
-	assert(unsafe.Sizeof(int16(0)) == 2)
-	assert(unsafe.Sizeof(uint32(0)) == 4)
-	assert(unsafe.Sizeof(int32(0)) == 4)
-	assert(unsafe.Sizeof(float32(0)) == 4)
-	assert(unsafe.Sizeof(uint64(0)) == 8)
-	assert(unsafe.Sizeof(int64(0)) == 8)
-	assert(unsafe.Sizeof(float64(0)) == 8)
-	assert(unsafe.Sizeof(complex64(0)) == 8)
-	assert(unsafe.Sizeof(complex128(0)) == 16)
-
-	var y0 S0
-	assert(unsafe.Sizeof(y0.a) == 1)
-	assert(unsafe.Sizeof(y0.b) == 4)
-	assert(unsafe.Sizeof(y0.c) == 8)
-	assert(unsafe.Sizeof(y0.d) == 1)
-	assert(unsafe.Sizeof(y0.e) == 16)
-	assert(unsafe.Sizeof(y0) == 40)
-
-	var y1 S1
-	assert(unsafe.Sizeof(y1) == 72)
-
-	var y2 S2
-	assert(unsafe.Sizeof(y2) == 8)
-
-	var y3 S3
-	assert(unsafe.Sizeof(y3) == 12)
-
-	var y4 S4
-	assert(unsafe.Sizeof(y4) == 16)
-
-	var y5 S5
-	assert(unsafe.Sizeof(y5) == 16)
-
-	var a3 [10]S3
-	assert(unsafe.Sizeof(a3) == 156)
-
-	// test case for issue 5670
-	type T struct {
-		a int32
-		_ int32
-		c int32
-	}
-	assert(unsafe.Sizeof(T{}) == 12)
-
-	var s []byte
-	_ = unsafe.Sizeof(s)
-	_ = unsafe.Sizeof(s... /* ERROR invalid use of \.\.\. */ )
-}
-
-func Sizeof2() {
-	f1 := func() (x int64) { return }
-	f2 := func() (x, y int64) { return }
-	_ = unsafe.Sizeof(f0 /* ERROR used as value */ ())
-	assert(unsafe.Sizeof(f1()) == 8)
-	_ = unsafe.Sizeof(f2()) // ERROR too many arguments
-}
-
-// self-testing only
-func assert1() {
-	var x int
-	assert() /* ERROR not enough arguments */
-	assert(1, 2) /* ERROR too many arguments */
-	assert("foo" /* ERROR boolean constant */ )
-	assert(x /* ERROR boolean constant */)
-	assert(true)
-	assert /* ERROR failed */ (false)
-	_ = assert(true)
-
-	var s []byte
-	assert(s... /* ERROR invalid use of \.\.\. */ )
-}
-
-func assert2() {
-	f1 := func() (x bool) { return }
-	f2 := func() (x bool) { return }
-	assert(f0 /* ERROR used as value */ ())
-	assert(f1 /* ERROR boolean constant */ ())
-	assert(f2 /* ERROR boolean constant */ ())
-}
-
-// self-testing only
-func trace1() {
-	// Uncomment the code below to test trace - will produce console output
-	// _ = trace /* ERROR no value */ ()
-	// _ = trace(1)
-	// _ = trace(true, 1.2, '\'', "foo", 42i, "foo" <= "bar")
-
-	var s []byte
-	trace(s... /* ERROR invalid use of \.\.\. */ )
-}
-
-func trace2() {
-	f1 := func() (x int) { return }
-	f2 := func() (x int, y string) { return }
-	f3 := func() (x int, y string, z []int) { return }
-	_ = f1
-	_ = f2
-	_ = f3
-	// Uncomment the code below to test trace - will produce console output
-	// trace(f0())
-	// trace(f1())
-	// trace(f2())
-	// trace(f3())
-	// trace(f0(), 1)
-	// trace(f1(), 1, 2)
-	// trace(f2(), 1, 2, 3)
-	// trace(f3(), 1, 2, 3, 4)
-}
diff --git a/third_party/gotools/go/types/testdata/const0.src b/third_party/gotools/go/types/testdata/const0.src
deleted file mode 100644
index c4419ab..0000000
--- a/third_party/gotools/go/types/testdata/const0.src
+++ /dev/null
@@ -1,282 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// constant declarations
-
-package const0
-
-// constants declarations must be initialized by constants
-var x = 0
-const c0 = x /* ERROR "not constant" */
-
-// typed constants must have constant types
-const _ interface /* ERROR invalid constant type */ {} = 0
-
-func _ () {
-	const _ interface /* ERROR invalid constant type */ {} = 0
-	for i := 0; i < 10; i++ {} // don't crash with non-nil iota here
-}
-
-// untyped constants
-const (
-	// boolean values
-	ub0 = false
-	ub1 = true
-	ub2 = 2 < 1
-	ub3 = ui1 == uf1
-	ub4 = true /* ERROR "cannot convert" */ == 0
-
-	// integer values
-	ui0 = 0
-	ui1 = 1
-	ui2 = 42
-	ui3 = 3141592653589793238462643383279502884197169399375105820974944592307816406286
-	ui4 = -10
-
-	ui5 = ui0 + ui1
-	ui6 = ui1 - ui1
-	ui7 = ui2 * ui1
-	ui8 = ui3 / ui3
-	ui9 = ui3 % ui3
-
-	ui10 = 1 / 0 /* ERROR "division by zero" */
-	ui11 = ui1 / 0 /* ERROR "division by zero" */
-	ui12 = ui3 / ui0 /* ERROR "division by zero" */
-	ui13 = 1 % 0 /* ERROR "division by zero" */
-	ui14 = ui1 % 0 /* ERROR "division by zero" */
-	ui15 = ui3 % ui0 /* ERROR "division by zero" */
-
-	ui16 = ui2 & ui3
-	ui17 = ui2 | ui3
-	ui18 = ui2 ^ ui3
-	ui19 = 1 /* ERROR "invalid operation" */ % 1.0
-
-	// floating point values
-	uf0 = 0.
-	uf1 = 1.
-	uf2 = 4.2e1
-	uf3 = 3.141592653589793238462643383279502884197169399375105820974944592307816406286
-	uf4 = 1e-1
-
-	uf5 = uf0 + uf1
-	uf6 = uf1 - uf1
-	uf7 = uf2 * uf1
-	uf8 = uf3 / uf3
-	uf9 = uf3 /* ERROR "not defined" */ % uf3
-
-	uf10 = 1 / 0 /* ERROR "division by zero" */
-	uf11 = uf1 / 0 /* ERROR "division by zero" */
-	uf12 = uf3 / uf0 /* ERROR "division by zero" */
-
-	uf16 = uf2 /* ERROR "not defined" */ & uf3
-	uf17 = uf2 /* ERROR "not defined" */ | uf3
-	uf18 = uf2 /* ERROR "not defined" */ ^ uf3
-
-	// complex values
-	uc0 = 0.i
-	uc1 = 1.i
-	uc2 = 4.2e1i
-	uc3 = 3.141592653589793238462643383279502884197169399375105820974944592307816406286i
-	uc4 = 1e-1i
-
-	uc5 = uc0 + uc1
-	uc6 = uc1 - uc1
-	uc7 = uc2 * uc1
-	uc8 = uc3 / uc3
-	uc9 = uc3 /* ERROR "not defined" */ % uc3
-
-	uc10 = 1 / 0 /* ERROR "division by zero" */
-	uc11 = uc1 / 0 /* ERROR "division by zero" */
-	uc12 = uc3 / uc0 /* ERROR "division by zero" */
-
-	uc16 = uc2 /* ERROR "not defined" */ & uc3
-	uc17 = uc2 /* ERROR "not defined" */ | uc3
-	uc18 = uc2 /* ERROR "not defined" */ ^ uc3
-)
-
-type (
-	mybool bool
-	myint int
-	myfloat float64
-	mycomplex complex128
-)
-
-// typed constants
-const (
-	// boolean values
-	tb0 bool = false
-	tb1 bool = true
-	tb2 mybool = 2 < 1
-	tb3 mybool = ti1 /* ERROR "mismatched types" */ == tf1
-
-	// integer values
-	ti0 int8 = ui0
-	ti1 int32 = ui1
-	ti2 int64 = ui2
-	ti3 myint = ui3 /* ERROR "overflows" */
-	ti4 myint = ui4
-
-	ti5 = ti0 /* ERROR "mismatched types" */ + ti1
-	ti6 = ti1 - ti1
-	ti7 = ti2 /* ERROR "mismatched types" */ * ti1
-	ti8 = ti3 / ti3
-	ti9 = ti3 % ti3
-
-	ti10 = 1 / 0 /* ERROR "division by zero" */
-	ti11 = ti1 / 0 /* ERROR "division by zero" */
-	ti12 = ti3 /* ERROR "mismatched types" */ / ti0
-	ti13 = 1 % 0 /* ERROR "division by zero" */
-	ti14 = ti1 % 0 /* ERROR "division by zero" */
-	ti15 = ti3 /* ERROR "mismatched types" */ % ti0
-
-	ti16 = ti2 /* ERROR "mismatched types" */ & ti3
-	ti17 = ti2 /* ERROR "mismatched types" */ | ti4
-	ti18 = ti2 ^ ti5 // no mismatched types error because the type of ti5 is unknown
-
-	// floating point values
-	tf0 float32 = 0.
-	tf1 float32 = 1.
-	tf2 float64 = 4.2e1
-	tf3 myfloat = 3.141592653589793238462643383279502884197169399375105820974944592307816406286
-	tf4 myfloat = 1e-1
-
-	tf5 = tf0 + tf1
-	tf6 = tf1 - tf1
-	tf7 = tf2 /* ERROR "mismatched types" */ * tf1
-	tf8 = tf3 / tf3
-	tf9 = tf3 /* ERROR "not defined" */ % tf3
-
-	tf10 = 1 / 0 /* ERROR "division by zero" */
-	tf11 = tf1 / 0 /* ERROR "division by zero" */
-	tf12 = tf3 /* ERROR "mismatched types" */ / tf0
-
-	tf16 = tf2 /* ERROR "mismatched types" */ & tf3
-	tf17 = tf2 /* ERROR "mismatched types" */ | tf3
-	tf18 = tf2 /* ERROR "mismatched types" */ ^ tf3
-
-	// complex values
-	tc0 = 0.i
-	tc1 = 1.i
-	tc2 = 4.2e1i
-	tc3 = 3.141592653589793238462643383279502884197169399375105820974944592307816406286i
-	tc4 = 1e-1i
-
-	tc5 = tc0 + tc1
-	tc6 = tc1 - tc1
-	tc7 = tc2 * tc1
-	tc8 = tc3 / tc3
-	tc9 = tc3 /* ERROR "not defined" */ % tc3
-
-	tc10 = 1 / 0 /* ERROR "division by zero" */
-	tc11 = tc1 / 0 /* ERROR "division by zero" */
-	tc12 = tc3 / tc0 /* ERROR "division by zero" */
-
-	tc16 = tc2 /* ERROR "not defined" */ & tc3
-	tc17 = tc2 /* ERROR "not defined" */ | tc3
-	tc18 = tc2 /* ERROR "not defined" */ ^ tc3
-)
-
-// initialization cycles
-const (
-	a /* ERROR "initialization cycle" */ = a
-	b /* ERROR "initialization cycle" */ , c /* ERROR "initialization cycle" */, d, e = e, d, c, b // TODO(gri) should only have one cycle error
-	f float64 = d
-)
-
-// multiple initialization
-const (
-	a1, a2, a3 = 7, 3.1415926, "foo"
-	b1, b2, b3 = b3, b1, 42
-	c1, c2, c3  /* ERROR "missing init expr for c3" */ = 1, 2
-	d1, d2, d3 = 1, 2, 3, 4 /* ERROR "extra init expr 4" */
-	_p0 = assert(a1 == 7)
-	_p1 = assert(a2 == 3.1415926)
-	_p2 = assert(a3 == "foo")
-	_p3 = assert(b1 == 42)
-	_p4 = assert(b2 == 42)
-	_p5 = assert(b3 == 42)
-)
-
-func _() {
-	const (
-		a1, a2, a3 = 7, 3.1415926, "foo"
-		b1, b2, b3 = b3, b1, 42
-		c1, c2, c3  /* ERROR "missing init expr for c3" */ = 1, 2
-		d1, d2, d3 = 1, 2, 3, 4 /* ERROR "extra init expr 4" */
-		_p0 = assert(a1 == 7)
-		_p1 = assert(a2 == 3.1415926)
-		_p2 = assert(a3 == "foo")
-		_p3 = assert(b1 == 42)
-		_p4 = assert(b2 == 42)
-		_p5 = assert(b3 == 42)
-	)
-}
-
-// iota
-const (
-	iota0 = iota
-	iota1 = iota
-	iota2 = iota*2
-	_a0 = assert(iota0 == 0)
-	_a1 = assert(iota1 == 1)
-	_a2 = assert(iota2 == 4)
-	iota6 = iota*3
-
-	iota7
-	iota8
-	_a3 = assert(iota7 == 21)
-	_a4 = assert(iota8 == 24)
-)
-
-const (
-	_b0 = iota
-	_b1 = assert(iota + iota2 == 5)
-	_b2 = len([iota]int{}) // iota may appear in a type!
-	_b3 = assert(_b2 == 2)
-	_b4 = len(A{})
-)
-
-type A [iota /* ERROR "cannot use iota" */ ]int
-
-// constant expressions with operands accross different
-// constant declarations must use the right iota values
-const (
-	_c0 = iota
-	_c1
-	_c2
-	_x = _c2 + _d1 + _e0 // 3
-)
-
-const (
-	_d0 = iota
-	_d1
-)
-
-const (
-	_e0 = iota
-)
-
-var _ = assert(_x == 3)
-
-// special cases
-const (
-	_n0 = nil /* ERROR "not constant" */
-	_n1 = [ /* ERROR "not constant" */ ]int{}
-)
-
-// iotas must not be usable in expressions outside constant declarations
-type _ [iota /* ERROR "iota outside constant decl" */ ]byte
-var _ = iota /* ERROR "iota outside constant decl" */
-func _() {
-	_ = iota /* ERROR "iota outside constant decl" */
-	const _ = iota
-	_ = iota /* ERROR "iota outside constant decl" */
-}
-
-func _() {
-	iota := 123
-	const x = iota /* ERROR "is not constant" */
-	var y = iota
-	_ = y
-}
diff --git a/third_party/gotools/go/types/testdata/const1.src b/third_party/gotools/go/types/testdata/const1.src
deleted file mode 100644
index 88e9fad..0000000
--- a/third_party/gotools/go/types/testdata/const1.src
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// constant conversions
-
-package const1
-
-const(
-	mi = ^int(0)
-	mu = ^uint(0)
-	mp = ^uintptr(0)
-
-	logSizeofInt     = uint(mi>>8&1 + mi>>16&1 + mi>>32&1)
-	logSizeofUint    = uint(mu>>8&1 + mu>>16&1 + mu>>32&1)
-	logSizeofUintptr = uint(mp>>8&1 + mp>>16&1 + mp>>32&1)
-)
-
-const (
-	minInt8 = -1<<(8<<iota - 1)
-	minInt16
-	minInt32
-	minInt64
-	minInt = -1<<(8<<logSizeofInt - 1)
-)
-
-const (
-	maxInt8 = 1<<(8<<iota - 1) - 1
-	maxInt16
-	maxInt32
-	maxInt64
-	maxInt = 1<<(8<<logSizeofInt - 1) - 1
-)
-
-const (
-	maxUint8 = 1<<(8<<iota) - 1
-	maxUint16
-	maxUint32
-	maxUint64
-	maxUint    = 1<<(8<<logSizeofUint) - 1
-	maxUintptr = 1<<(8<<logSizeofUintptr) - 1
-)
-
-const (
-	smallestFloat32 = 1.0 / (1<<(127 - 1 + 23))
-	smallestFloat64 = 1.0 / (1<<(1023 - 1 + 52))
-)
-
-const (
-	_ = assert(smallestFloat32 > 0)
-	_ = assert(smallestFloat64 > 0)
-)
-
-const (
-	maxFloat32 = 1<<127 * (1<<24 - 1) / (1.0<<23)
-	maxFloat64 = 1<<1023 * (1<<53 - 1) / (1.0<<52)
-)
-
-const (
-	_ int8 = minInt8 /* ERROR "overflows" */ - 1
-	_ int8 = minInt8
-	_ int8 = maxInt8
-	_ int8 = maxInt8 /* ERROR "overflows" */ + 1
-	_ int8 = smallestFloat64 /* ERROR "truncated" */
-
-	_ = int8(minInt8 /* ERROR "cannot convert" */ - 1)
-	_ = int8(minInt8)
-	_ = int8(maxInt8)
-	_ = int8(maxInt8 /* ERROR "cannot convert" */ + 1)
-	_ = int8(smallestFloat64 /* ERROR "cannot convert" */)
-)
-
-const (
-	_ int16 = minInt16 /* ERROR "overflows" */ - 1
-	_ int16 = minInt16
-	_ int16 = maxInt16
-	_ int16 = maxInt16 /* ERROR "overflows" */ + 1
-	_ int16 = smallestFloat64 /* ERROR "truncated" */
-
-	_ = int16(minInt16 /* ERROR "cannot convert" */ - 1)
-	_ = int16(minInt16)
-	_ = int16(maxInt16)
-	_ = int16(maxInt16 /* ERROR "cannot convert" */ + 1)
-	_ = int16(smallestFloat64 /* ERROR "cannot convert" */)
-)
-
-const (
-	_ int32 = minInt32 /* ERROR "overflows" */ - 1
-	_ int32 = minInt32
-	_ int32 = maxInt32
-	_ int32 = maxInt32 /* ERROR "overflows" */ + 1
-	_ int32 = smallestFloat64 /* ERROR "truncated" */
-
-	_ = int32(minInt32 /* ERROR "cannot convert" */ - 1)
-	_ = int32(minInt32)
-	_ = int32(maxInt32)
-	_ = int32(maxInt32 /* ERROR "cannot convert" */ + 1)
-	_ = int32(smallestFloat64 /* ERROR "cannot convert" */)
-)
-
-const (
-	_ int64 = minInt64 /* ERROR "overflows" */ - 1
-	_ int64 = minInt64
-	_ int64 = maxInt64
-	_ int64 = maxInt64 /* ERROR "overflows" */ + 1
-	_ int64 = smallestFloat64 /* ERROR "truncated" */
-
-	_ = int64(minInt64 /* ERROR "cannot convert" */ - 1)
-	_ = int64(minInt64)
-	_ = int64(maxInt64)
-	_ = int64(maxInt64 /* ERROR "cannot convert" */ + 1)
-	_ = int64(smallestFloat64 /* ERROR "cannot convert" */)
-)
-
-const (
-	_ int = minInt /* ERROR "overflows" */ - 1
-	_ int = minInt
-	_ int = maxInt
-	_ int = maxInt /* ERROR "overflows" */ + 1
-	_ int = smallestFloat64 /* ERROR "truncated" */
-
-	_ = int(minInt /* ERROR "cannot convert" */ - 1)
-	_ = int(minInt)
-	_ = int(maxInt)
-	_ = int(maxInt /* ERROR "cannot convert" */ + 1)
-	_ = int(smallestFloat64 /* ERROR "cannot convert" */)
-)
-
-const (
-	_ uint8 = 0 /* ERROR "overflows" */ - 1
-	_ uint8 = 0
-	_ uint8 = maxUint8
-	_ uint8 = maxUint8 /* ERROR "overflows" */ + 1
-	_ uint8 = smallestFloat64 /* ERROR "truncated" */
-
-	_ = uint8(0 /* ERROR "cannot convert" */ - 1)
-	_ = uint8(0)
-	_ = uint8(maxUint8)
-	_ = uint8(maxUint8 /* ERROR "cannot convert" */ + 1)
-	_ = uint8(smallestFloat64 /* ERROR "cannot convert" */)
-)
-
-const (
-	_ uint16 = 0 /* ERROR "overflows" */ - 1
-	_ uint16 = 0
-	_ uint16 = maxUint16
-	_ uint16 = maxUint16 /* ERROR "overflows" */ + 1
-	_ uint16 = smallestFloat64 /* ERROR "truncated" */
-
-	_ = uint16(0 /* ERROR "cannot convert" */ - 1)
-	_ = uint16(0)
-	_ = uint16(maxUint16)
-	_ = uint16(maxUint16 /* ERROR "cannot convert" */ + 1)
-	_ = uint16(smallestFloat64 /* ERROR "cannot convert" */)
-)
-
-const (
-	_ uint32 = 0 /* ERROR "overflows" */ - 1
-	_ uint32 = 0
-	_ uint32 = maxUint32
-	_ uint32 = maxUint32 /* ERROR "overflows" */ + 1
-	_ uint32 = smallestFloat64 /* ERROR "truncated" */
-
-	_ = uint32(0 /* ERROR "cannot convert" */ - 1)
-	_ = uint32(0)
-	_ = uint32(maxUint32)
-	_ = uint32(maxUint32 /* ERROR "cannot convert" */ + 1)
-	_ = uint32(smallestFloat64 /* ERROR "cannot convert" */)
-)
-
-const (
-	_ uint64 = 0 /* ERROR "overflows" */ - 1
-	_ uint64 = 0
-	_ uint64 = maxUint64
-	_ uint64 = maxUint64 /* ERROR "overflows" */ + 1
-	_ uint64 = smallestFloat64 /* ERROR "truncated" */
-
-	_ = uint64(0 /* ERROR "cannot convert" */ - 1)
-	_ = uint64(0)
-	_ = uint64(maxUint64)
-	_ = uint64(maxUint64 /* ERROR "cannot convert" */ + 1)
-	_ = uint64(smallestFloat64 /* ERROR "cannot convert" */)
-)
-
-const (
-	_ uint = 0 /* ERROR "overflows" */ - 1
-	_ uint = 0
-	_ uint = maxUint
-	_ uint = maxUint /* ERROR "overflows" */ + 1
-	_ uint = smallestFloat64 /* ERROR "truncated" */
-
-	_ = uint(0 /* ERROR "cannot convert" */ - 1)
-	_ = uint(0)
-	_ = uint(maxUint)
-	_ = uint(maxUint /* ERROR "cannot convert" */ + 1)
-	_ = uint(smallestFloat64 /* ERROR "cannot convert" */)
-)
-
-const (
-	_ uintptr = 0 /* ERROR "overflows" */ - 1
-	_ uintptr = 0
-	_ uintptr = maxUintptr
-	_ uintptr = maxUintptr /* ERROR "overflows" */ + 1
-	_ uintptr = smallestFloat64 /* ERROR "truncated" */
-
-	_ = uintptr(0 /* ERROR "cannot convert" */ - 1)
-	_ = uintptr(0)
-	_ = uintptr(maxUintptr)
-	_ = uintptr(maxUintptr /* ERROR "cannot convert" */ + 1)
-	_ = uintptr(smallestFloat64 /* ERROR "cannot convert" */)
-)
-
-const (
-	_ float32 = minInt64
-	_ float64 = minInt64
-	_ complex64 = minInt64
-	_ complex128 = minInt64
-
-	_ = float32(minInt64)
-	_ = float64(minInt64)
-	_ = complex64(minInt64)
-	_ = complex128(minInt64)
-)
-
-const (
-	_ float32 = maxUint64
-	_ float64 = maxUint64
-	_ complex64 = maxUint64
-	_ complex128 = maxUint64
-
-	_ = float32(maxUint64)
-	_ = float64(maxUint64)
-	_ = complex64(maxUint64)
-	_ = complex128(maxUint64)
-)
-
-// TODO(gri) find smaller deltas below
-
-const delta32 = maxFloat32/(1 << 23)
-
-const (
-	_ float32 = - /* ERROR "overflow" */ (maxFloat32 + delta32)
-	_ float32 = -maxFloat32
-	_ float32 = maxFloat32
-	_ float32 = maxFloat32 /* ERROR "overflow" */ + delta32
-
-	_ = float32(- /* ERROR "cannot convert" */ (maxFloat32 + delta32))
-	_ = float32(-maxFloat32)
-	_ = float32(maxFloat32)
-	_ = float32(maxFloat32 /* ERROR "cannot convert" */ + delta32)
-
-	_ = assert(float32(smallestFloat32) == smallestFloat32)
-	_ = assert(float32(smallestFloat32/2) == 0)
-	_ = assert(float32(smallestFloat64) == 0)
-	_ = assert(float32(smallestFloat64/2) == 0)
-)
-
-const delta64 = maxFloat64/(1 << 52)
-
-const (
-	_ float64 = - /* ERROR "overflow" */ (maxFloat64 + delta64)
-	_ float64 = -maxFloat64
-	_ float64 = maxFloat64
-	_ float64 = maxFloat64 /* ERROR "overflow" */ + delta64
-
-	_ = float64(- /* ERROR "cannot convert" */ (maxFloat64 + delta64))
-	_ = float64(-maxFloat64)
-	_ = float64(maxFloat64)
-	_ = float64(maxFloat64 /* ERROR "cannot convert" */ + delta64)
-
-	_ = assert(float64(smallestFloat32) == smallestFloat32)
-	_ = assert(float64(smallestFloat32/2) == smallestFloat32/2)
-	_ = assert(float64(smallestFloat64) == smallestFloat64)
-	_ = assert(float64(smallestFloat64/2) == 0)
-)
-
-const (
-	_ complex64 = - /* ERROR "overflow" */ (maxFloat32 + delta32)
-	_ complex64 = -maxFloat32
-	_ complex64 = maxFloat32
-	_ complex64 = maxFloat32 /* ERROR "overflow" */ + delta32
-
-	_ = complex64(- /* ERROR "cannot convert" */ (maxFloat32 + delta32))
-	_ = complex64(-maxFloat32)
-	_ = complex64(maxFloat32)
-	_ = complex64(maxFloat32 /* ERROR "cannot convert" */ + delta32)
-)
-
-const (
-	_ complex128 = - /* ERROR "overflow" */ (maxFloat64 + delta64)
-	_ complex128 = -maxFloat64
-	_ complex128 = maxFloat64
-	_ complex128 = maxFloat64 /* ERROR "overflow" */ + delta64
-
-	_ = complex128(- /* ERROR "cannot convert" */ (maxFloat64 + delta64))
-	_ = complex128(-maxFloat64)
-	_ = complex128(maxFloat64)
-	_ = complex128(maxFloat64 /* ERROR "cannot convert" */ + delta64)
-)
-
-// Initialization of typed constant and conversion are the same:
-const (
-	f32 = 1 + smallestFloat32
-	x32 float32 = f32
-	y32 = float32(f32)
-	_ = assert(x32 - y32 == 0)
-)
-
-const (
-	f64 = 1 + smallestFloat64
-	x64 float64 = f64
-	y64 = float64(f64)
-	_ = assert(x64 - y64 == 0)
-)
diff --git a/third_party/gotools/go/types/testdata/constdecl.src b/third_party/gotools/go/types/testdata/constdecl.src
deleted file mode 100644
index 6de9b13..0000000
--- a/third_party/gotools/go/types/testdata/constdecl.src
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package constdecl
-
-import "math"
-
-var v int
-
-// Const decls must be initialized by constants.
-const _ = v /* ERROR "not constant" */
-const _ = math /* ERROR "not constant" */ .Sin(0)
-const _ = int /* ERROR "not an expression" */
-
-func _() {
-	const _ = v /* ERROR "not constant" */
-	const _ = math /* ERROR "not constant" */ .Sin(0)
-	const _ = int /* ERROR "not an expression" */
-}
-
-// Identifier and expression arity must match.
-// The first error message is produced by the parser.
-// In a real-world scenario, the type-checker would not be run
-// in this case and the 2nd error message would not appear.
-const _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */
-const _ = 1, 2 /* ERROR "extra init expr 2" */
-
-const _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ int
-const _ int = 1, 2 /* ERROR "extra init expr 2" */
-
-const (
-	_ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */
-	_ = 1, 2 /* ERROR "extra init expr 2" */
-
-	_ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ int
-	_ int = 1, 2 /* ERROR "extra init expr 2" */
-)
-
-const (
-	_ = 1
-	_
-	_, _ /* ERROR "missing init expr for _" */
-	_
-)
-
-const (
-	_, _ = 1, 2
-	_, _
-	_ /* ERROR "extra init expr at" */
-	_, _
-	_, _, _ /* ERROR "missing init expr for _" */
-	_, _
-)
-
-func _() {
-	const _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */
-	const _ = 1, 2 /* ERROR "extra init expr 2" */
-
-	const _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ int
-	const _ int = 1, 2 /* ERROR "extra init expr 2" */
-
-	const (
-		_ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */
-		_ = 1, 2 /* ERROR "extra init expr 2" */
-
-		_ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ int
-		_ int = 1, 2 /* ERROR "extra init expr 2" */
-	)
-
-	const (
-		_ = 1
-		_
-		_, _ /* ERROR "missing init expr for _" */
-		_
-	)
-
-	const (
-		_, _ = 1, 2
-		_, _
-		_ /* ERROR "extra init expr at" */
-		_, _
-		_, _, _ /* ERROR "missing init expr for _" */
-		_, _
-	)
-}
-
-// Test case for constant with invalid initialization.
-// Caused panic because the constant value was not set up (gri - 7/8/2014).
-func _() {
-	const (
-	    x string = missing /* ERROR "undeclared name" */
-	    y = x + ""
-	)
-}
-
-// TODO(gri) move extra tests from testdata/const0.src into here
diff --git a/third_party/gotools/go/types/testdata/conversions.src b/third_party/gotools/go/types/testdata/conversions.src
deleted file mode 100644
index 4251424..0000000
--- a/third_party/gotools/go/types/testdata/conversions.src
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// conversions
-
-package conversions
-
-import "unsafe"
-
-// argument count
-var (
-	_ = int() /* ERROR "missing argument" */
-	_ = int(1, 2 /* ERROR "too many arguments" */ )
-)
-
-// numeric constant conversions are in const1.src.
-
-func string_conversions() {
-	const A = string(65)
-	assert(A == "A")
-	const E = string(-1)
-	assert(E == "\uFFFD")
-	assert(E == string(1234567890))
-
-	type myint int
-	assert(A == string(myint(65)))
-
-	type mystring string
-	const _ mystring = mystring("foo")
-
-	const _ = string(true /* ERROR "cannot convert" */ )
-	const _ = string(1.2 /* ERROR "cannot convert" */ )
-	const _ = string(nil /* ERROR "cannot convert" */ )
-}
-
-func interface_conversions() {
-	type E interface{}
-
-	type I1 interface{
-		m1()
-	}
-
-	type I2 interface{
-		m1()
-		m2(x int)
-	}
-
-	type I3 interface{
-		m1()
-		m2() int
-	}
-
-	var e E
-	var i1 I1
-	var i2 I2
-	var i3 I3
-
-	_ = E(0)
-	_ = E(nil)
-	_ = E(e)
-	_ = E(i1)
-	_ = E(i2)
-
-	_ = I1(0 /* ERROR "cannot convert" */ )
-	_ = I1(nil)
-	_ = I1(i1)
-	_ = I1(e /* ERROR "cannot convert" */ )
-	_ = I1(i2)
-
-	_ = I2(nil)
-	_ = I2(i1 /* ERROR "cannot convert" */ )
-	_ = I2(i2)
-	_ = I2(i3 /* ERROR "cannot convert" */ )
-
-	_ = I3(nil)
-	_ = I3(i1 /* ERROR "cannot convert" */ )
-	_ = I3(i2 /* ERROR "cannot convert" */ )
-	_ = I3(i3)
-
-	// TODO(gri) add more tests, improve error message
-}
-
-func issue6326() {
-	type T unsafe.Pointer
-	var x T
-	_ = uintptr(x) // see issue 6326
-}
diff --git a/third_party/gotools/go/types/testdata/cycles.src b/third_party/gotools/go/types/testdata/cycles.src
deleted file mode 100644
index 621d83c..0000000
--- a/third_party/gotools/go/types/testdata/cycles.src
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cycles
-
-type (
-	T0 int
-	T1 /* ERROR cycle */ T1
-	T2 *T2
-
-	T3 /* ERROR cycle */ T4
-	T4 T5
-	T5 T3
-
-	T6 T7
-	T7 *T8
-	T8 T6
-
-	// arrays
-	A0 /* ERROR cycle */ [10]A0
-	A1 [10]*A1
-
-	A2 /* ERROR cycle */ [10]A3
-	A3 [10]A4
-	A4 A2
-
-	A5 [10]A6
-	A6 *A5
-
-	// slices
-	L0 []L0
-
-	// structs
-	S0 /* ERROR cycle */ struct{ _ S0 }
-	S1 /* ERROR cycle */ struct{ S1 }
-	S2 struct{ _ *S2 }
-	S3 struct{ *S3 }
-
-	S4 /* ERROR cycle */ struct{ S5 }
-	S5 struct{ S6 }
-	S6 S4
-
-	// pointers
-	P0 *P0
-
-	// functions
-	F0 func(F0)
-	F1 func() F1
-	F2 func(F2) F2
-
-	// interfaces
-	I0 /* ERROR cycle */ interface{ I0 }
-
-	I1 interface{ I2 }
-	I2 interface{ I3 }
-	I3 /* ERROR cycle */ interface{ I1 }
-
-	I4 interface{ f(I4) }
-
-	// testcase for issue 5090
-	I5 interface{ f(I6) }
-	I6 interface{ I5 }
-
-	// maps
-	M0 map[M0 /* ERROR invalid map key */ ]M0
-
-	// channels
-	C0 chan C0
-)
-
-func _() {
-	type (
-		t1 /* ERROR cycle */ t1
-		t2 *t2
-
-		t3 t4 /* ERROR undeclared */
-		t4 t5 /* ERROR undeclared */
-		t5 t3
-
-		// arrays
-		a0 /* ERROR cycle */ [10]a0
-		a1 [10]*a1
-
-		// slices
-		l0 []l0
-
-		// structs
-		s0 /* ERROR cycle */ struct{ _ s0 }
-		s1 /* ERROR cycle */ struct{ s1 }
-		s2 struct{ _ *s2 }
-		s3 struct{ *s3 }
-
-		// pointers
-		p0 *p0
-
-		// functions
-		f0 func(f0)
-		f1 func() f1
-		f2 func(f2) f2
-
-		// interfaces
-		i0 /* ERROR cycle */ interface{ i0 }
-
-		// maps
-		m0 map[m0 /* ERROR invalid map key */ ]m0
-
-		// channels
-		c0 chan c0
-	)
-}
-
-// test cases for issue 6667
-
-type A [10]map[A /* ERROR invalid map key */ ]bool
-
-type S struct {
-	m map[S /* ERROR invalid map key */ ]bool
-}
-
-// test cases for issue 7236
-// (cycle detection must not be dependent on starting point of resolution)
-
-type (
-	P1 *T9
-	T9 /* ERROR cycle */ T9
-
-	T10 /* ERROR cycle */ T10
-	P2 *T10
-)
-
-func (T11) m() {}
-
-type T11 /* ERROR cycle */ struct{ T11 }
-
-type T12 /* ERROR cycle */ struct{ T12 }
-
-func (*T12) m() {}
-
-type (
-	P3 *T13
-	T13 /* ERROR cycle */ T13
-)
\ No newline at end of file
diff --git a/third_party/gotools/go/types/testdata/cycles1.src b/third_party/gotools/go/types/testdata/cycles1.src
deleted file mode 100644
index ae2b38e..0000000
--- a/third_party/gotools/go/types/testdata/cycles1.src
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package p
-
-type (
-	A interface {
-		a() interface {
-			ABC1
-		}
-	}
-	B interface {
-		b() interface {
-			ABC2
-		}
-	}
-	C interface {
-		c() interface {
-			ABC3
-		}
-	}
-
-	AB interface {
-		A
-		B
-	}
-	BC interface {
-		B
-		C
-	}
-
-	ABC1 interface {
-		A
-		B
-		C
-	}
-	ABC2 interface {
-		AB
-		C
-	}
-	ABC3 interface {
-		A
-		BC
-	}
-)
-
-var (
-	x1 ABC1
-	x2 ABC2
-	x3 ABC3
-)
-
-func _() {
-	// all types have the same method set
-	x1 = x2
-	x2 = x1
-
-	x1 = x3
-	x3 = x1
-
-	x2 = x3
-	x3 = x2
-
-	// all methods return the same type again
-	x1 = x1.a()
-	x1 = x1.b()
-	x1 = x1.c()
-
-	x2 = x2.a()
-	x2 = x2.b()
-	x2 = x2.c()
-
-	x3 = x3.a()
-	x3 = x3.b()
-	x3 = x3.c()
-}
diff --git a/third_party/gotools/go/types/testdata/cycles2.src b/third_party/gotools/go/types/testdata/cycles2.src
deleted file mode 100644
index 345ab56..0000000
--- a/third_party/gotools/go/types/testdata/cycles2.src
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package p
-
-import "unsafe"
-
-// Test case for issue 5090
-
-type t interface {
-	f(u)
-}
-
-type u interface {
-	t
-}
-
-func _() {
-	var t t
-	var u u
-
-	t.f(t)
-	t.f(u)
-	
-	u.f(t)
-	u.f(u)
-}
-
-
-// Test case for issue 6589.
-
-type A interface {
-	a() interface {
-		AB
-	}
-}
-
-type B interface {
-	a() interface {
-		AB
-	}
-}
-
-type AB interface {
-	a() interface {
-		A
-		B /* ERROR a redeclared */
-	}
-	b() interface {
-		A
-		B /* ERROR a redeclared */
-	}
-}
-
-var x AB
-var y interface {
-	A
-	B /* ERROR a redeclared */
-}
-var _ = x /* ERROR cannot compare */ == y
-
-
-// Test case for issue 6638.
-
-type T interface {
-	m() [T /* ERROR no value */ (nil).m()[0]]int
-}
-
-// Variations of this test case.
-
-type T1 interface {
-	m() [x1 /* ERROR no value */ .m()[0]]int
-}
-
-var x1 T1
-
-type T2 interface {
-	m() [len(x2 /* ERROR no value */ .m())]int
-}
-
-var x2 T2
-
-type T3 interface {
-	m() [unsafe.Sizeof(x3.m)]int
-}
-
-var x3 T3
-
-// The test case below should also report an error for
-// the cast inside the T4 interface (like it does for the
-// variable initialization). The reason why it does not is
-// that inside T4, the method x4.m depends on T4 which is not
-// fully set up yet. The x4.m method happens to have an empty
-// signature which is why the cast is permitted.
-// TODO(gri) Consider marking methods as incomplete and provide
-// a better error message in that case.
-
-type T4 interface {
-	m() [unsafe.Sizeof(cast4(x4.m))]int
-}
-
-var x4 T4
-var _ = cast4(x4 /* ERROR cannot convert */.m)
-
-type cast4 func()
-
-// This test is symmetric to the T4 case: Here the cast is
-// "correct", but it doesn't work inside the T5 interface.
-
-type T5 interface {
-	m() [unsafe.Sizeof(cast5(x5 /* ERROR cannot convert */ .m))]int
-}
-
-var x5 T5
-var _ = cast5(x5.m)
-
-type cast5 func() [0]int
diff --git a/third_party/gotools/go/types/testdata/cycles3.src b/third_party/gotools/go/types/testdata/cycles3.src
deleted file mode 100644
index 3da4fb5..0000000
--- a/third_party/gotools/go/types/testdata/cycles3.src
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package p
-
-import "unsafe"
-
-var (
-	_ A = A(nil).a().b().c().d().e().f()
-	_ A = A(nil).b().c().d().e().f()
-	_ A = A(nil).c().d().e().f()
-	_ A = A(nil).d().e().f()
-	_ A = A(nil).e().f()
-	_ A = A(nil).f()
-	_ A = A(nil)
-)
-
-type (
-	A interface {
-		a() B
-		B
-	}
-
-	B interface {
-		b() C
-		C
-	}
-
-	C interface {
-		c() D
-		D
-	}
-
-	D interface {
-		d() E
-		E
-	}
-
-	E interface {
-		e() F
-		F
-	}
-
-	F interface {
-		f() A
-	}
-)
-
-type (
-	U interface {
-		V
-	}
-
-	V interface {
-		v() [unsafe.Sizeof(u)]int
-	}
-)
-
-var u U
diff --git a/third_party/gotools/go/types/testdata/cycles4.src b/third_party/gotools/go/types/testdata/cycles4.src
deleted file mode 100644
index 445babc..0000000
--- a/third_party/gotools/go/types/testdata/cycles4.src
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package p
-
-// Check that all methods of T are collected before
-// determining the result type of m (which embeds
-// all methods of T).
-
-type T interface {
-	m() interface {T}
-	E
-}
-
-var _ = T.m(nil).m().e()
-
-type E interface {
-	e() int
-}
-
-// Check that unresolved forward chains are followed
-// (see also comment in resolver.go, checker.typeDecl).
-
-var _ = C.m(nil).m().e()
-
-type A B
-
-type B interface {
-	m() interface{C}
-	E
-}
-
-type C A
-
-// Check that interface type comparison for identity
-// does not recur endlessly.
-
-type T1 interface {
-	m() interface{T1}
-}
-
-type T2 interface {
-	m() interface{T2}
-}
-
-func _(x T1, y T2) {
-	// Checking for assignability of interfaces must check
-	// if all methods of x are present in y, and that they
-	// have identical signatures. The signatures recur via
-	// the result type, which is an interface that embeds
-	// a single method m that refers to the very interface
-	// that contains it. This requires cycle detection in
-	// identity checks for interface types.
-	x = y
-}
-
-type T3 interface {
-	m() interface{T4}
-}
-
-type T4 interface {
-	m() interface{T3}
-}
-
-func _(x T1, y T3) {
-	x = y
-}
-
-// Check that interfaces are type-checked in order of
-// (embedded interface) dependencies (was issue 7158).
-
-var x1 T5 = T7(nil)
-
-type T5 interface {
-	T6
-}
-
-type T6 interface {
-	m() T7
-}
-type T7 interface {
-	T5
-}
-
-// Actual test case from issue 7158.
-
-func wrapNode() Node {
-	return wrapElement()
-}
-
-func wrapElement() Element {
-	return nil
-}
-
-type EventTarget interface {
-	AddEventListener(Event)
-}
-
-type Node interface {
-	EventTarget
-}
-
-type Element interface {
-	Node
-}
-
-type Event interface {
-	Target() Element
-}
diff --git a/third_party/gotools/go/types/testdata/decls0.src b/third_party/gotools/go/types/testdata/decls0.src
deleted file mode 100644
index f1df3ea..0000000
--- a/third_party/gotools/go/types/testdata/decls0.src
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// type declarations
-
-package decls0
-
-import "unsafe"
-
-const pi = 3.1415
-
-type (
-	N undeclared /* ERROR "undeclared" */
-	B bool
-	I int32
-	A [10]P
-	T struct {
-		x, y P
-	}
-	P *T
-	R (*R)
-	F func(A) I
-	Y interface {
-		f(A) I
-	}
-	S [](((P)))
-	M map[I]F
-	C chan<- I
-
-	// blank types must be typechecked
-	_ pi /* ERROR "not a type" */
-	_ struct{}
-	_ struct{ pi /* ERROR "not a type" */ }
-)
-
-
-// declarations of init
-const _, init /* ERROR "cannot declare init" */ , _ = 0, 1, 2
-type init /* ERROR "cannot declare init" */ struct{}
-var _, init /* ERROR "cannot declare init" */ int
-
-func init() {}
-func init /* ERROR "missing function body" */ ()
-
-func _() { const init = 0 }
-func _() { type init int }
-func _() { var init int; _ = init }
-
-// invalid array types
-type (
-	iA0 [... /* ERROR "invalid use of '...'" */ ]byte
-	iA1 [1 /* ERROR "invalid array length" */ <<100]int
-	iA2 [- /* ERROR "invalid array length" */ 1]complex128
-	iA3 ["foo" /* ERROR "must be integer" */ ]string
-)
-
-
-type (
-	p1 pi /* ERROR "no field or method foo" */ .foo
-	p2 unsafe.Pointer
-)
-
-
-type (
-	Pi pi /* ERROR "not a type" */
-
-	a /* ERROR "illegal cycle" */ a
-	a /* ERROR "redeclared" */ int
-
-	// where the cycle error appears depends on the
-	// order in which declarations are processed
-	// (which depends on the order in which a map
-	// is iterated through)
-	b /* ERROR "illegal cycle" */ c
-	c d
-	d e
-	e b
-
-	t *t
-
-	U V
-	V *W
-	W U
-
-	P1 *S2
-	P2 P1
-
-	S0 struct {
-	}
-	S1 struct {
-		a, b, c int
-		u, v, a /* ERROR "redeclared" */ float32
-	}
-	S2 struct {
-		S0 // anonymous field
-		S0 /* ERROR "redeclared" */ int
-	}
-	S3 struct {
-		x S2
-	}
-	S4/* ERROR "illegal cycle" */ struct {
-		S4
-	}
-	S5 /* ERROR "illegal cycle" */ struct {
-		S6
-	}
-	S6 struct {
-		field S7
-	}
-	S7 struct {
-		S5
-	}
-
-	L1 []L1
-	L2 []int
-
-	A1 [10.0]int
-	A2 /* ERROR "illegal cycle" */ [10]A2
-	A3 /* ERROR "illegal cycle" */ [10]struct {
-		x A4
-	}
-	A4 [10]A3
-
-	F1 func()
-	F2 func(x, y, z float32)
-	F3 func(x, y, x /* ERROR "redeclared" */ float32)
-	F4 func() (x, y, x /* ERROR "redeclared" */ float32)
-	F5 func(x int) (x /* ERROR "redeclared" */ float32)
-	F6 func(x ...int)
-
-	I1 interface{}
-	I2 interface {
-		m1()
-	}
-	I3 interface {
-		m1()
-		m1 /* ERROR "redeclared" */ ()
-	}
-	I4 interface {
-		m1(x, y, x /* ERROR "redeclared" */ float32)
-		m2() (x, y, x /* ERROR "redeclared" */ float32)
-		m3(x int) (x /* ERROR "redeclared" */ float32)
-	}
-	I5 interface {
-		m1(I5)
-	}
-	I6 interface {
-		S0 /* ERROR "not an interface" */
-	}
-	I7 interface {
-		I1
-		I1
-	}
-	I8 /* ERROR "illegal cycle" */ interface {
-		I8
-	}
-	I9 interface {
-		I10
-	}
-	I10 interface {
-		I11
-	}
-	I11 /* ERROR "illegal cycle" */ interface {
-		I9
-	}
-
-	C1 chan int
-	C2 <-chan int
-	C3 chan<- C3
-	C4 chan C5
-	C5 chan C6
-	C6 chan C4
-
-	M1 map[Last]string
-	M2 map[string]M2
-
-	Last int
-)
-
-// cycles in function/method declarations
-// (test cases for issue 5217 and variants)
-func f1(x f1 /* ERROR "not a type" */ ) {}
-func f2(x *f2 /* ERROR "not a type" */ ) {}
-func f3() (x f3 /* ERROR "not a type" */ ) { return }
-func f4() (x *f4 /* ERROR "not a type" */ ) { return }
-
-func (S0) m1(x S0 /* ERROR "field or method" */ .m1) {}
-func (S0) m2(x *S0 /* ERROR "field or method" */ .m2) {}
-func (S0) m3() (x S0 /* ERROR "field or method" */ .m3) { return }
-func (S0) m4() (x *S0 /* ERROR "field or method" */ .m4) { return }
-
-// interfaces may not have any blank methods
-type BlankI interface {
-	_ /* ERROR "invalid method name" */ ()
-	_ /* ERROR "invalid method name" */ (float32) int
-	m()
-}
-
-// non-interface types may have multiple blank methods
-type BlankT struct{}
-
-func (BlankT) _() {}
-func (BlankT) _(int) {}
-func (BlankT) _() int { return 0 }
-func (BlankT) _(int) int { return 0}
diff --git a/third_party/gotools/go/types/testdata/decls1.src b/third_party/gotools/go/types/testdata/decls1.src
deleted file mode 100644
index 7855e46..0000000
--- a/third_party/gotools/go/types/testdata/decls1.src
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// variable declarations
-
-package decls1
-
-import (
-	"math"
-)
-
-// Global variables without initialization
-var (
-	a, b bool
-	c byte
-	d uint8
-	r rune
-	i int
-	j, k, l int
-	x, y float32
-	xx, yy float64
-	u, v complex64
-	uu, vv complex128
-	s, t string
-	array []byte
-	iface interface{}
-	
-	blank _ /* ERROR "cannot use _" */
-)
-
-// Global variables with initialization
-var (
-	s1 = i + j
-	s2 = i /* ERROR "mismatched types" */ + x
-	s3 = c + d
-	s4 = s + t
-	s5 = s /* ERROR "invalid operation" */ / t
-	s6 = array[t1]
-	s7 = array[x /* ERROR "integer" */]
-	s8 = &a
-	s10 = &42 /* ERROR "cannot take address" */
-	s11 = &v
-	s12 = -(u + *t11) / *&v
-	s13 = a /* ERROR "shifted operand" */ << d
-	s14 = i << j /* ERROR "must be unsigned" */ 
-	s18 = math.Pi * 10.0
-	s19 = s1 /* ERROR "cannot call" */ ()
- 	s20 = f0 /* ERROR "no value" */ ()
-	s21 = f6(1, s1, i)
-	s22 = f6(1, s1, uu /* ERROR "cannot pass argument" */ )
-	
-	t1 int = i + j
-	t2 int = i /* ERROR "mismatched types" */ + x
-	t3 int = c /* ERROR "cannot initialize" */ + d
-	t4 string = s + t
-	t5 string = s /* ERROR "invalid operation" */ / t
-	t6 byte = array[t1]
-	t7 byte = array[x /* ERROR "must be integer" */]
-	t8 *int = & /* ERROR "cannot initialize" */ a
-	t10 *int = &42 /* ERROR "cannot take address" */
-	t11 *complex64 = &v
-	t12 complex64 = -(u + *t11) / *&v
-	t13 int = a /* ERROR "shifted operand" */ << d
-	t14 int = i << j /* ERROR "must be unsigned" */ 
-	t15 math /* ERROR "not in selector" */
-	t16 math /* ERROR "not declared" */ .xxx
-	t17 math /* ERROR "not a type" */ .Pi
-	t18 float64 = math.Pi * 10.0
-	t19 int = t1 /* ERROR "cannot call" */ ()
-	t20 int = f0 /* ERROR "no value" */ ()
-	t21 int = a /* ERROR "cannot initialize" */
-)
-
-// Various more complex expressions
-var (
-	u1 = x /* ERROR "not an interface" */ .(int)
-	u2 = iface.([]int)
-	u3 = iface.(a /* ERROR "not a type" */ )
-	u4, ok = iface.(int)
-	u5, ok2, ok3 = iface /* ERROR "assignment count mismatch" */ .(int)
-)
-
-// Constant expression initializations
-var (
-	v1 = 1 /* ERROR "cannot convert" */ + "foo"
-	v2 = c + 255
-	v3 = c + 256 /* ERROR "overflows" */
-	v4 = r + 2147483647
-	v5 = r + 2147483648 /* ERROR "overflows" */
-	v6 = 42
-	v7 = v6 + 9223372036854775807
-	v8 = v6 + 9223372036854775808 /* ERROR "overflows" */
-	v9 = i + 1 << 10
-	v10 byte = 1024 /* ERROR "overflows" */
-	v11 = xx/yy*yy - xx
-	v12 = true && false
-	v13 = nil /* ERROR "use of untyped nil" */
-)
-
-// Multiple assignment expressions
-var (
-	m1a, m1b = 1, 2
-	m2a, m2b, m2c /* ERROR "missing init expr for m2c" */ = 1, 2
-	m3a, m3b = 1, 2, 3 /* ERROR "extra init expr 3" */
-)
-
-func _() {
-	var (
-		m1a, m1b = 1, 2
-		m2a, m2b, m2c /* ERROR "missing init expr for m2c" */ = 1, 2
-		m3a, m3b = 1, 2, 3 /* ERROR "extra init expr 3" */
-	)
-
-	_, _ = m1a, m1b
-	_, _, _ = m2a, m2b, m2c
-	_, _ = m3a, m3b
-}
-
-// Declaration of parameters and results
-func f0() {}
-func f1(a /* ERROR "not a type" */) {}
-func f2(a, b, c d /* ERROR "not a type" */) {}
-
-func f3() int { return 0 }
-func f4() a /* ERROR "not a type" */ { return 0 }
-func f5() (a, b, c d /* ERROR "not a type" */) { return }
-
-func f6(a, b, c int) complex128 { return 0 }
-
-// Declaration of receivers
-type T struct{}
-
-func (T) m0() {}
-func (*T) m1() {}
-func (x T) m2() {}
-func (x *T) m3() {}
-
-// Initialization functions
-func init() {}
-func /* ERROR "no arguments and no return values" */ init(int) {}
-func /* ERROR "no arguments and no return values" */ init() int { return 0 }
-func /* ERROR "no arguments and no return values" */ init(int) int { return 0 }
-func (T) init(int) int { return 0 }
diff --git a/third_party/gotools/go/types/testdata/decls2a.src b/third_party/gotools/go/types/testdata/decls2a.src
deleted file mode 100644
index bdbecd9..0000000
--- a/third_party/gotools/go/types/testdata/decls2a.src
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// method declarations
-
-package decls2
-
-import "time"
-import "unsafe"
-
-// T1 declared before its methods.
-type T1 struct{
-	f int
-}
-
-func (T1) m() {}
-func (T1) m /* ERROR "already declared" */ () {}
-func (x *T1) f /* ERROR "field and method" */ () {}
-
-// Conflict between embedded field and method name,
-// with the embedded field being a basic type.
-type T1b struct {
-	int
-}
-
-func (T1b) int /* ERROR "field and method" */ () {}
-
-type T1c struct {
-	time.Time
-}
-
-func (T1c) Time /* ERROR "field and method" */ () int { return 0 }
-
-// Disabled for now: LookupFieldOrMethod will find Pointer even though
-// it's double-declared (it would cost extra in the common case to verify
-// this). But the MethodSet computation will not find it due to the name
-// collision caused by the double-declaration, leading to an internal
-// inconsistency while we are verifying one computation against the other.
-// var _ = T1c{}.Pointer
-
-// T2's method declared before the type.
-func (*T2) f /* ERROR "field and method" */ () {}
-
-type T2 struct {
-	f int
-}
-
-// Methods declared without a declared type.
-func (undeclared /* ERROR "undeclared" */) m() {}
-func (x *undeclared /* ERROR "undeclared" */) m() {}
-
-func (pi /* ERROR "not a type" */) m1() {}
-func (x pi /* ERROR "not a type" */) m2() {}
-func (x *pi /* ERROR "not a type" */ ) m3() {}
-
-// Blank types.
-type _ struct { m int }
-type _ struct { m int }
-
-func (_ /* ERROR "cannot use _" */) m() {}
-func m(_ /* ERROR "cannot use _" */) {}
-
-// Methods with receiver base type declared in another file.
-func (T3) m1() {}
-func (*T3) m2() {}
-func (x T3) m3() {}
-func (x *T3) f /* ERROR "field and method" */ () {}
-
-// Methods of non-struct type.
-type T4 func()
-
-func (self T4) m() func() { return self }
-
-// Methods associated with an interface.
-type T5 interface {
-	m() int
-}
-
-func (T5 /* ERROR "invalid receiver" */ ) m1() {}
-func (T5 /* ERROR "invalid receiver" */ ) m2() {}
-
-// Methods associated with a named pointer type.
-type ptr *int
-func (ptr /* ERROR "invalid receiver" */ ) _() {}
-func (* /* ERROR "invalid receiver" */ ptr) _() {}
-
-// Methods with zero or multiple receivers.
-func ( /* ERROR "missing receiver" */ ) _() {}
-func (T3, * /* ERROR "exactly one receiver" */ T3) _() {}
-func (T3, T3, T3 /* ERROR "exactly one receiver" */ ) _() {}
-func (a, b /* ERROR "exactly one receiver" */ T3) _() {}
-func (a, b, c /* ERROR "exactly one receiver" */ T3) _() {}
-
-// Methods associated with non-local or unnamed types.
-func (int /* ERROR "invalid receiver" */ ) m() {}
-func ([ /* ERROR "invalid receiver" */ ]int) m() {}
-func (time /* ERROR "invalid receiver" */ .Time) m() {}
-func (* /* ERROR "invalid receiver" */ time.Time) m() {}
-func (x /* ERROR "invalid receiver" */ interface{}) m() {}
-
-// Unsafe.Pointer is treated like a pointer when used as receiver type.
-type UP unsafe.Pointer
-func (UP /* ERROR "invalid" */ ) m1() {}
-func (* /* ERROR "invalid" */ UP) m2() {}
-
-// Double declarations across package files
-const c_double = 0
-type t_double int
-var v_double int
-func f_double() {}
diff --git a/third_party/gotools/go/types/testdata/decls2b.src b/third_party/gotools/go/types/testdata/decls2b.src
deleted file mode 100644
index e7bc394..0000000
--- a/third_party/gotools/go/types/testdata/decls2b.src
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// method declarations
-
-package decls2
-
-import "io"
-
-const pi = 3.1415
-
-func (T1) m /* ERROR "already declared" */ () {}
-func (T2) m(io.Writer) {}
-
-type T3 struct {
-	f *T3
-}
-
-type T6 struct {
-	x int
-}
-
-func (t *T6) m1() int {
-	return t.x
-}
-
-func f() {
-	var t *T6
-	t.m1()
-}
-
-// Double declarations across package files
-const c_double /* ERROR "redeclared" */ = 0
-type t_double  /* ERROR "redeclared" */ int
-var v_double /* ERROR "redeclared" */ int
-func f_double /* ERROR "redeclared" */ () {}
-
-// Blank methods need to be type-checked.
-// Verify by checking that errors are reported.
-func (T /* ERROR "undeclared" */ ) _() {}
-func (T1) _(undeclared /* ERROR "undeclared" */ ) {}
-func (T1) _() int { return "foo" /* ERROR "cannot convert" */ }
-
-// Methods with undeclared receiver type can still be checked.
-// Verify by checking that errors are reported.
-func (Foo /* ERROR "undeclared" */ ) m() {}
-func (Foo /* ERROR "undeclared" */ ) m(undeclared /* ERROR "undeclared" */ ) {}
-func (Foo /* ERROR "undeclared" */ ) m() int { return "foo" /* ERROR "cannot convert" */ }
-
-func (Foo /* ERROR "undeclared" */ ) _() {}
-func (Foo /* ERROR "undeclared" */ ) _(undeclared /* ERROR "undeclared" */ ) {}
-func (Foo /* ERROR "undeclared" */ ) _() int { return "foo" /* ERROR "cannot convert" */ }
-
-// Receiver declarations are regular parameter lists;
-// receiver types may use parentheses, and the list
-// may have a trailing comma.
-type T7 struct {}
-
-func (T7) m1() {}
-func ((T7)) m2() {}
-func ((*T7)) m3() {}
-func (x *(T7),) m4() {}
-func (x (*(T7)),) m5() {}
-func (x ((*((T7)))),) m6() {}
diff --git a/third_party/gotools/go/types/testdata/decls3.src b/third_party/gotools/go/types/testdata/decls3.src
deleted file mode 100644
index 80d2bc8..0000000
--- a/third_party/gotools/go/types/testdata/decls3.src
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// embedded types
-
-package decls3
-
-import "unsafe"
-import "fmt"
-
-// fields with the same name at the same level cancel each other out
-
-func _() {
-	type (
-		T1 struct { X int }
-		T2 struct { X int }
-		T3 struct { T1; T2 } // X is embedded twice at the same level via T1->X, T2->X
-	)
-
-	var t T3
-	_ = t /* ERROR "ambiguous selector" */ .X
-}
-
-func _() {
-	type (
-		T1 struct { X int }
-		T2 struct { T1 }
-		T3 struct { T1 }
-		T4 struct { T2; T3 } // X is embedded twice at the same level via T2->T1->X, T3->T1->X
-	)
-
-	var t T4
-	_ = t /* ERROR "ambiguous selector" */ .X
-}
-
-func issue4355() {
-	type (
-	    T1 struct {X int}
-	    T2 struct {T1}
-	    T3 struct {T2}
-	    T4 struct {T2}
-	    T5 struct {T3; T4} // X is embedded twice at the same level via T3->T2->T1->X, T4->T2->T1->X
-	)	
-
-	var t T5
-	_ = t /* ERROR "ambiguous selector" */ .X
-}
-
-func _() {
-	type State int
-	type A struct{ State }
-	type B struct{ fmt.State }
-	type T struct{ A; B }
-
-	var t T
-	_ = t /* ERROR "ambiguous selector" */ .State
-}
-
-// Embedded fields can be predeclared types.
-
-func _() {
-	type T0 struct{
-		int
-		float32
-		f int
-	}
-	var x T0
-	_ = x.int
-	_ = x.float32
-	_ = x.f
-
-	type T1 struct{
-		T0
-	}
-	var y T1
-	_ = y.int
-	_ = y.float32
-	_ = y.f
-}
-
-// Restrictions on embedded field types.
-
-func _() {
-	type I1 interface{}
-	type I2 interface{}
-	type P1 *int
-	type P2 *int
-	type UP unsafe.Pointer
-
-	type T1 struct {
-		I1
-		* /* ERROR "cannot be a pointer to an interface" */ I2
-		* /* ERROR "cannot be a pointer to an interface" */ error
-		P1 /* ERROR "cannot be a pointer" */
-		* /* ERROR "cannot be a pointer" */ P2
-	}
-
-	// unsafe.Pointers are treated like regular pointers when embedded
-	type T2 struct {
-		unsafe /* ERROR "cannot be unsafe.Pointer" */ .Pointer
-		*/* ERROR "cannot be unsafe.Pointer" */ unsafe.Pointer
-		UP /* ERROR "cannot be unsafe.Pointer" */
-		* /* ERROR "cannot be unsafe.Pointer" */ UP
-	}
-}
-
-// Named types that are pointers.
-
-type S struct{ x int }
-func (*S) m() {}
-type P *S
-
-func _() {
-	var s *S
-	_ = s.x
-	_ = s.m
-
-	var p P
-	_ = p.x
-	_ = p /* ERROR "no field or method" */ .m
-	_ = P /* ERROR "no field or method" */ .m
-}
-
-// Borrowed from the FieldByName test cases in reflect/all_test.go.
-
-type D1 struct {
-	d int
-}
-type D2 struct {
-	d int
-}
-
-type S0 struct {
-	A, B, C int
-	D1
-	D2
-}
-
-type S1 struct {
-	B int
-	S0
-}
-
-type S2 struct {
-	A int
-	*S1
-}
-
-type S1x struct {
-	S1
-}
-
-type S1y struct {
-	S1
-}
-
-type S3 struct {
-	S1x
-	S2
-	D, E int
-	*S1y
-}
-
-type S4 struct {
-	*S4
-	A int
-}
-
-// The X in S6 and S7 annihilate, but they also block the X in S8.S9.
-type S5 struct {
-	S6
-	S7
-	S8
-}
-
-type S6 struct {
-	X int
-}
-
-type S7 S6
-
-type S8 struct {
-	S9
-}
-
-type S9 struct {
-	X int
-	Y int
-}
-
-// The X in S11.S6 and S12.S6 annihilate, but they also block the X in S13.S8.S9.
-type S10 struct {
-	S11
-	S12
-	S13
-}
-
-type S11 struct {
-	S6
-}
-
-type S12 struct {
-	S6
-}
-
-type S13 struct {
-	S8
-}
-
-func _() {
-	_ = struct /* ERROR "no field or method" */ {}{}.Foo
-	_ = S0{}.A
-	_ = S0 /* ERROR "no field or method" */ {}.D
-	_ = S1{}.A
-	_ = S1{}.B
-	_ = S1{}.S0
-	_ = S1{}.C
-	_ = S2{}.A
-	_ = S2{}.S1
-	_ = S2{}.B
-	_ = S2{}.C
-	_ = S2 /* ERROR "no field or method" */ {}.D
-	_ = S3 /* ERROR "ambiguous selector" */ {}.S1
-	_ = S3{}.A
-	_ = S3 /* ERROR "ambiguous selector" */ {}.B
-	_ = S3{}.D
-	_ = S3{}.E
-	_ = S4{}.A
-	_ = S4 /* ERROR "no field or method" */ {}.B
-	_ = S5 /* ERROR "ambiguous selector" */ {}.X
-	_ = S5{}.Y
-	_ = S10 /* ERROR "ambiguous selector" */ {}.X
-	_ = S10{}.Y
-}
-
-// Borrowed from the FieldByName benchmark in reflect/all_test.go.
-
-type R0 struct {
-	*R1
-	*R2
-	*R3
-	*R4
-}
-
-type R1 struct {
-	*R5
-	*R6
-	*R7
-	*R8
-}
-
-type R2 R1
-type R3 R1
-type R4 R1
-
-type R5 struct {
-	*R9
-	*R10
-	*R11
-	*R12
-}
-
-type R6 R5
-type R7 R5
-type R8 R5
-
-type R9 struct {
-	*R13
-	*R14
-	*R15
-	*R16
-}
-
-type R10 R9
-type R11 R9
-type R12 R9
-
-type R13 struct {
-	*R17
-	*R18
-	*R19
-	*R20
-}
-
-type R14 R13
-type R15 R13
-type R16 R13
-
-type R17 struct {
-	*R21
-	*R22
-	*R23
-	*R24
-}
-
-type R18 R17
-type R19 R17
-type R20 R17
-
-type R21 struct {
-	X int
-}
-
-type R22 R21
-type R23 R21
-type R24 R21
-
-var _ = R0 /* ERROR "ambiguous selector" */ {}.X
\ No newline at end of file
diff --git a/third_party/gotools/go/types/testdata/errors.src b/third_party/gotools/go/types/testdata/errors.src
deleted file mode 100644
index 45bd45a..0000000
--- a/third_party/gotools/go/types/testdata/errors.src
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package errors
-
-// Testing precise operand formatting in error messages
-// (matching messages are regular expressions, hence the \'s).
-func f(x int, m map[string]int) {
-	// no values
-	_ = f /* ERROR "f\(0, m\) \(no value\) used as value" */ (0, m)
-
-	// built-ins
-	_ = println /* ERROR "println \(built-in\) must be called" */
-
-	// types
-	_ = complex128 /* ERROR "complex128 \(type\) is not an expression" */
-
-	// constants
-	const c1 = 991
-	const c2 float32 = 0.5
-	0 /* ERROR "0 \(untyped int constant\) is not used" */
-	c1 /* ERROR "c1 \(untyped int constant 991\) is not used" */
-	c2 /* ERROR "c2 \(constant 1/2 of type float32\) is not used" */
-	c1 /* ERROR "c1 \+ c2 \(constant 1983/2 of type float32\) is not used" */ + c2
-
-	// variables
-	x /* ERROR "x \(variable of type int\) is not used" */
-
-	// values
-	x /* ERROR "x != x \(untyped bool value\) is not used" */ != x
-	x /* ERROR "x \+ x \(value of type int\) is not used" */ + x
-
-	// value, ok's
-	const s = "foo"
-	m /* ERROR "m\[s\] \(map index expression of type int\) is not used" */ [s]
-}
-
-// Valid ERROR comments can have a variety of forms.
-func _() {
-	0 /* ERROR "0 .* is not used" */
-	0 /* ERROR 0 .* is not used */
-	0 // ERROR "0 .* is not used"
-	0 // ERROR 0 .* is not used
-}
-
-// Don't report spurious errors as a consequence of earlier errors.
-// Add more tests as needed.
-func _() {
-	if err := foo /* ERROR undeclared */ (); err != nil /* no error here */ {}
-}
-
-// Use unqualified names for package-local objects.
-type T struct{}
-var _ int = T /* ERROR value of type T */ {} // use T in error message rather then errors.T
diff --git a/third_party/gotools/go/types/testdata/expr0.src b/third_party/gotools/go/types/testdata/expr0.src
deleted file mode 100644
index 5afb5d7..0000000
--- a/third_party/gotools/go/types/testdata/expr0.src
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// unary expressions
-
-package expr0 
-
-type mybool bool
-
-var (
-	// bool
-	b0 = true
-	b1 bool = b0
-	b2 = !true
-	b3 = !b1
-	b4 bool = !true
-	b5 bool = !b4
-	b6 = +b0 /* ERROR "not defined" */
-	b7 = -b0 /* ERROR "not defined" */
-	b8 = ^b0 /* ERROR "not defined" */
-	b9 = *b0 /* ERROR "cannot indirect" */
-	b10 = &true /* ERROR "cannot take address" */
-	b11 = &b0
-	b12 = <-b0 /* ERROR "cannot receive" */
-	b13 = & & /* ERROR "cannot take address" */ b0
-
-	// int
-	i0 = 1
-	i1 int = i0
-	i2 = +1
-	i3 = +i0
-	i4 int = +1
-	i5 int = +i4
-	i6 = -1
-	i7 = -i0
-	i8 int = -1
-	i9 int = -i4
-	i10 = !i0 /* ERROR "not defined" */
-	i11 = ^1
-	i12 = ^i0
-	i13 int = ^1
-	i14 int = ^i4
-	i15 = *i0 /* ERROR "cannot indirect" */
-	i16 = &i0
-	i17 = *i16
-	i18 = <-i16 /* ERROR "cannot receive" */
-
-	// uint
-	u0 = uint(1)
-	u1 uint = u0
-	u2 = +1
-	u3 = +u0
-	u4 uint = +1
-	u5 uint = +u4
-	u6 = -1
-	u7 = -u0
-	u8 uint = - /* ERROR "overflows" */ 1
-	u9 uint = -u4
-	u10 = !u0 /* ERROR "not defined" */
-	u11 = ^1
-	u12 = ^i0
-	u13 uint = ^ /* ERROR "overflows" */ 1
-	u14 uint = ^u4
-	u15 = *u0 /* ERROR "cannot indirect" */
-	u16 = &u0
-	u17 = *u16
-	u18 = <-u16 /* ERROR "cannot receive" */
-	u19 = ^uint(0)
-
-	// float64
-	f0 = float64(1)
-	f1 float64 = f0
-	f2 = +1
-	f3 = +f0
-	f4 float64 = +1
-	f5 float64 = +f4
-	f6 = -1
-	f7 = -f0
-	f8 float64 = -1
-	f9 float64 = -f4
-	f10 = !f0 /* ERROR "not defined" */
-	f11 = ^1
-	f12 = ^i0
-	f13 float64 = ^1
-	f14 float64 = ^f4 /* ERROR "not defined" */
-	f15 = *f0 /* ERROR "cannot indirect" */
-	f16 = &f0
-	f17 = *u16
-	f18 = <-u16 /* ERROR "cannot receive" */
-
-	// complex128
-	c0 = complex128(1)
-	c1 complex128 = c0
-	c2 = +1
-	c3 = +c0
-	c4 complex128 = +1
-	c5 complex128 = +c4
-	c6 = -1
-	c7 = -c0
-	c8 complex128 = -1
-	c9 complex128 = -c4
-	c10 = !c0 /* ERROR "not defined" */
-	c11 = ^1
-	c12 = ^i0
-	c13 complex128 = ^1
-	c14 complex128 = ^c4 /* ERROR "not defined" */
-	c15 = *c0 /* ERROR "cannot indirect" */
-	c16 = &c0
-	c17 = *u16
-	c18 = <-u16 /* ERROR "cannot receive" */
-
-	// string
-	s0 = "foo"
-	s1 = +"foo" /* ERROR "not defined" */
-	s2 = -s0 /* ERROR "not defined" */
-	s3 = !s0 /* ERROR "not defined" */
-	s4 = ^s0 /* ERROR "not defined" */
-	s5 = *s4
-	s6 = &s4
-	s7 = *s6
-	s8 = <-s7
-
-	// channel
-	ch chan int
-	rc <-chan float64
-	sc chan <- string
-	ch0 = +ch /* ERROR "not defined" */
-	ch1 = -ch /* ERROR "not defined" */
-	ch2 = !ch /* ERROR "not defined" */
-	ch3 = ^ch /* ERROR "not defined" */
-	ch4 = *ch /* ERROR "cannot indirect" */
-	ch5 = &ch
-	ch6 = *ch5
-	ch7 = <-ch
-	ch8 = <-rc
-	ch9 = <-sc /* ERROR "cannot receive" */
-	ch10, ok = <-ch
-	// ok is of type bool
-	ch11, myok = <-ch
-	_ mybool = myok /* ERROR "cannot initialize" */
-)
-
-// address of composite literals
-type T struct{x, y int}
-
-func f() T { return T{} }
-
-var (
-	_ = &T{1, 2}
-	_ = &[...]int{}
-	_ = &[]int{}
-	_ = &[]int{}
-	_ = &map[string]T{}
-	_ = &(T{1, 2})
-	_ = &((((T{1, 2}))))
-	_ = &f /* ERROR "cannot take address" */ ()
-)
-
-// recursive pointer types
-type P *P
-
-var (
-	p1 P = new(P)
-	p2 P = *p1
-	p3 P = &p2
-)
-
diff --git a/third_party/gotools/go/types/testdata/expr1.src b/third_party/gotools/go/types/testdata/expr1.src
deleted file mode 100644
index 8ef0aed..0000000
--- a/third_party/gotools/go/types/testdata/expr1.src
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// binary expressions
-
-package expr1
diff --git a/third_party/gotools/go/types/testdata/expr2.src b/third_party/gotools/go/types/testdata/expr2.src
deleted file mode 100644
index 31dc5f0..0000000
--- a/third_party/gotools/go/types/testdata/expr2.src
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// comparisons
-
-package expr2
-
-func _bool() {
-	const t = true == true
-	const f = true == false
-	_ = t /* ERROR "cannot compare" */ < f
-	_ = 0 /* ERROR "cannot convert" */ == t
-	var b bool
-	var x, y float32
-	b = x < y
-	_ = b
-	_ = struct{b bool}{x < y}
-}
-
-// corner cases
-var (
-	v0 = nil /* ERROR "cannot compare" */ == nil
-)
-
-func arrays() {
-	// basics
-	var a, b [10]int
-	_ = a == b
-	_ = a != b
-	_ = a /* ERROR < not defined */ < b
-	_ = a == nil /* ERROR cannot convert */
-
-	type C [10]int
-	var c C
-	_ = a == c
-
-	type D [10]int
-	var d D
-	_ = c /* ERROR mismatched types */ == d
-
-	var e [10]func() int
-	_ = e /* ERROR == not defined */ == e
-}
-
-func structs() {
-	// basics
-	var s, t struct {
-		x int
-		a [10]float32
-		_ bool
-	}
-	_ = s == t
-	_ = s != t
-	_ = s /* ERROR < not defined */ < t
-	_ = s == nil /* ERROR cannot convert */
-
-	type S struct {
-		x int
-		a [10]float32
-		_ bool
-	}
-	type T struct {
-		x int
-		a [10]float32
-		_ bool
-	}
-	var ss S
-	var tt T
-	_ = s == ss
-	_ = ss /* ERROR mismatched types */ == tt
-
-	var u struct {
-		x int
-		a [10]map[string]int
-	}
-	_ = u /* ERROR cannot compare */ == u
-}
-
-func pointers() {
-	// nil
-	_ = nil /* ERROR == not defined */ == nil
-	_ = nil /* ERROR != not defined */ != nil
-	_ = nil /* ERROR < not defined */ < nil
-	_ = nil /* ERROR <= not defined */ <= nil
-	_ = nil /* ERROR > not defined */ > nil
-	_ = nil /* ERROR >= not defined */ >= nil
-
-	// basics
-	var p, q *int
-	_ = p == q
-	_ = p != q
-
-	_ = p == nil
-	_ = p != nil
-	_ = nil == q
-	_ = nil != q
-
-	_ = p /* ERROR < not defined */ < q
-	_ = p /* ERROR <= not defined */ <= q
-	_ = p /* ERROR > not defined */ > q
-	_ = p /* ERROR >= not defined */ >= q
-
-	// various element types
-	type (
-		S1 struct{}
-		S2 struct{}
-		P1 *S1
-		P2 *S2
-	)
-	var (
-		ps1 *S1
-		ps2 *S2
-		p1 P1
-		p2 P2
-	)
-	_ = ps1 == ps1
-	_ = ps1 /* ERROR mismatched types */ == ps2
-	_ = ps2 /* ERROR mismatched types */ == ps1
-
-	_ = p1 == p1
-	_ = p1 /* ERROR mismatched types */ == p2
-
-	_ = p1 == ps1
-}
-
-func channels() {
-	// basics
-	var c, d chan int
-	_ = c == d
-	_ = c != d
-	_ = c == nil
-	_ = c /* ERROR < not defined */ < d
-
-	// various element types (named types)
-	type (
-		C1 chan int
-		C1r <-chan int
-		C1s chan<- int
-		C2 chan float32
-	)
-	var (
-		c1 C1
-		c1r C1r
-		c1s C1s
-		c1a chan int
-		c2 C2
-	)
-	_ = c1 == c1
-	_ = c1 /* ERROR mismatched types */ == c1r
-	_ = c1 /* ERROR mismatched types */ == c1s
-	_ = c1r /* ERROR mismatched types */ == c1s
-	_ = c1 == c1a
-	_ = c1a == c1
-	_ = c1 /* ERROR mismatched types */ == c2
-	_ = c1a /* ERROR mismatched types */ == c2
-
-	// various element types (unnamed types)
-	var (
-		d1 chan int
-		d1r <-chan int
-		d1s chan<- int
-		d1a chan<- int
-		d2 chan float32
-	)
-	_ = d1 == d1
-	_ = d1 == d1r
-	_ = d1 == d1s
-	_ = d1r /* ERROR mismatched types */ == d1s
-	_ = d1 == d1a
-	_ = d1a == d1
-	_ = d1 /* ERROR mismatched types */ == d2
-	_ = d1a /* ERROR mismatched types */ == d2
-}
-
-// for interfaces test
-type S1 struct{}
-type S11 struct{}
-type S2 struct{}
-func (*S1) m() int
-func (*S11) m() int
-func (*S11) n()
-func (*S2) m() float32
-
-func interfaces() {
-	// basics
-	var i, j interface{ m() int }
-	_ = i == j
-	_ = i != j
-	_ = i == nil
-	_ = i /* ERROR < not defined */ < j
-
-	// various interfaces
-	var ii interface { m() int; n() }
-	var k interface { m() float32 }
-	_ = i == ii
-	_ = i /* ERROR mismatched types */ == k
-
-	// interfaces vs values
-	var s1 S1
-	var s11 S11
-	var s2 S2
-
-	_ = i == 0 /* ERROR cannot convert */
-	_ = i /* ERROR mismatched types */ == s1
-	_ = i == &s1
-	_ = i == &s11
-
-	_ = i /* ERROR mismatched types */ == s2
-	_ = i /* ERROR mismatched types */ == &s2
-}
-
-func slices() {
-	// basics
-	var s []int
-	_ = s == nil
-	_ = s != nil
-	_ = s /* ERROR < not defined */ < nil
-
-	// slices are not otherwise comparable
-	_ = s /* ERROR == not defined */ == s
-	_ = s /* ERROR < not defined */ < s
-}
-
-func maps() {
-	// basics
-	var m map[string]int
-	_ = m == nil
-	_ = m != nil
-	_ = m /* ERROR < not defined */ < nil
-
-	// maps are not otherwise comparable
-	_ = m /* ERROR == not defined */ == m
-	_ = m /* ERROR < not defined */ < m
-}
-
-func funcs() {
-	// basics
-	var f func(int) float32
-	_ = f == nil
-	_ = f != nil
-	_ = f /* ERROR < not defined */ < nil
-
-	// funcs are not otherwise comparable
-	_ = f /* ERROR == not defined */ == f
-	_ = f /* ERROR < not defined */ < f
-}
diff --git a/third_party/gotools/go/types/testdata/expr3.src b/third_party/gotools/go/types/testdata/expr3.src
deleted file mode 100644
index 5772095..0000000
--- a/third_party/gotools/go/types/testdata/expr3.src
+++ /dev/null
@@ -1,534 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package expr3
-
-import "time"
-
-func indexes() {
-	_ = 1 /* ERROR "cannot index" */ [0]
-	_ = indexes /* ERROR "cannot index" */ [0]
-	_ = ( /* ERROR "cannot slice" */ 12 + 3)[1:2]
-
-	var a [10]int
-	_ = a[true /* ERROR "cannot convert" */ ]
-	_ = a["foo" /* ERROR "cannot convert" */ ]
-	_ = a[1.1 /* ERROR "truncated" */ ]
-	_ = a[1.0]
-	_ = a[- /* ERROR "negative" */ 1]
-	_ = a[- /* ERROR "negative" */ 1 :]
-	_ = a[: - /* ERROR "negative" */ 1]
-	_ = a[: /* ERROR "2nd index required" */ : /* ERROR "3rd index required" */ ]
-	_ = a[0: /* ERROR "2nd index required" */ : /* ERROR "3rd index required" */ ]
-	_ = a[0: /* ERROR "2nd index required" */ :10]
-	_ = a[:10:10]
-
-	var a0 int
-	a0 = a[0]
-	_ = a0
-	var a1 int32
-	a1 = a /* ERROR "cannot assign" */ [1]
-	_ = a1
-
-	_ = a[9]
-	_ = a[10 /* ERROR "index .* out of bounds" */ ]
-	_ = a[1 /* ERROR "overflows" */ <<100]
-	_ = a[10:]
-	_ = a[:10]
-	_ = a[10:10]
-	_ = a[11 /* ERROR "index .* out of bounds" */ :]
-	_ = a[: 11 /* ERROR "index .* out of bounds" */ ]
-	_ = a[: 1 /* ERROR "overflows" */ <<100]
-	_ = a[:10:10]
-	_ = a[:11 /* ERROR "index .* out of bounds" */ :10]
-	_ = a[:10:11 /* ERROR "index .* out of bounds" */ ]
-	_ = a[10:0:10] /* ERROR "invalid slice indices" */
-	_ = a[0:10:0] /* ERROR "invalid slice indices" */
-	_ = a[10:0:0] /* ERROR "invalid slice indices" */
-	_ = &a /* ERROR "cannot take address" */ [:10]
-
-	pa := &a
-	_ = pa[9]
-	_ = pa[10 /* ERROR "index .* out of bounds" */ ]
-	_ = pa[1 /* ERROR "overflows" */ <<100]
-	_ = pa[10:]
-	_ = pa[:10]
-	_ = pa[10:10]
-	_ = pa[11 /* ERROR "index .* out of bounds" */ :]
-	_ = pa[: 11 /* ERROR "index .* out of bounds" */ ]
-	_ = pa[: 1 /* ERROR "overflows" */ <<100]
-	_ = pa[:10:10]
-	_ = pa[:11 /* ERROR "index .* out of bounds" */ :10]
-	_ = pa[:10:11 /* ERROR "index .* out of bounds" */ ]
-	_ = pa[10:0:10] /* ERROR "invalid slice indices" */
-	_ = pa[0:10:0] /* ERROR "invalid slice indices" */
-	_ = pa[10:0:0] /* ERROR "invalid slice indices" */
-	_ = &pa /* ERROR "cannot take address" */ [:10]
-
-	var b [0]int
-	_ = b[0 /* ERROR "index .* out of bounds" */ ]
-	_ = b[:]
-	_ = b[0:]
-	_ = b[:0]
-	_ = b[0:0]
-	_ = b[0:0:0]
-	_ = b[1 /* ERROR "index .* out of bounds" */ :0:0]
-
-	var s []int
-	_ = s[- /* ERROR "negative" */ 1]
-	_ = s[- /* ERROR "negative" */ 1 :]
-	_ = s[: - /* ERROR "negative" */ 1]
-	_ = s[0]
-	_ = s[1:2]
-	_ = s[2:1] /* ERROR "invalid slice indices" */
-	_ = s[2:]
-	_ = s[: 1 /* ERROR "overflows" */ <<100]
-	_ = s[1 /* ERROR "overflows" */ <<100 :]
-	_ = s[1 /* ERROR "overflows" */ <<100 : 1 /* ERROR "overflows" */ <<100]
-	_ = s[: /* ERROR "2nd index required" */ :  /* ERROR "3rd index required" */ ]
-	_ = s[:10:10]
-	_ = s[10:0:10] /* ERROR "invalid slice indices" */
-	_ = s[0:10:0] /* ERROR "invalid slice indices" */
-	_ = s[10:0:0] /* ERROR "invalid slice indices" */
-	_ = &s /* ERROR "cannot take address" */ [:10]
-
-	var m map[string]int
-	_ = m[0 /* ERROR "cannot convert" */ ]
-	_ = m /* ERROR "cannot slice" */ ["foo" : "bar"]
-	_ = m["foo"]
-	// ok is of type bool
-	type mybool bool
-	var ok mybool
-	_, ok = m["bar"]
-	_ = ok
-
-	var t string
-	_ = t[- /* ERROR "negative" */ 1]
-	_ = t[- /* ERROR "negative" */ 1 :]
-	_ = t[: - /* ERROR "negative" */ 1]
-	_ = t /* ERROR "3-index slice of string" */ [1:2:3]
-	_ = "foo" /* ERROR "3-index slice of string" */ [1:2:3]
-	var t0 byte
-	t0 = t[0]
-	_ = t0
-	var t1 rune
-	t1 = t /* ERROR "cannot assign" */ [2]
-	_ = t1
-	_ = ("foo" + "bar")[5]
-	_ = ("foo" + "bar")[6 /* ERROR "index .* out of bounds" */ ]
-
-	const c = "foo"
-	_ = c[- /* ERROR "negative" */ 1]
-	_ = c[- /* ERROR "negative" */ 1 :]
-	_ = c[: - /* ERROR "negative" */ 1]
-	var c0 byte
-	c0 = c[0]
-	_ = c0
-	var c2 float32
-	c2 = c /* ERROR "cannot assign" */ [2]
-	_ = c[3 /* ERROR "index .* out of bounds" */ ]
-	_ = ""[0 /* ERROR "index .* out of bounds" */ ]
-	_ = c2
-
-	_ = s[1<<30] // no compile-time error here
-
-	// issue 4913
-	type mystring string
-	var ss string
-	var ms mystring
-	var i, j int
-	ss = "foo"[1:2]
-	ss = "foo"[i:j]
-	ms = "foo" /* ERROR "cannot assign" */ [1:2]
-	ms = "foo" /* ERROR "cannot assign" */ [i:j]
-	_, _ = ss, ms
-}
-
-type T struct {
-	x int
-	y func()
-}
-
-func (*T) m() {}
-
-func method_expressions() {
-	_ = T /* ERROR "no field or method" */ .a
-	_ = T /* ERROR "has no method" */ .x
-	_ = T /* ERROR "not in method set" */ .m
-	_ = (*T).m
-
-	var f func(*T) = T /* ERROR "not in method set" */ .m
-	var g func(*T) = (*T).m
-	_, _ = f, g
-
-	_ = T /* ERROR "has no method" */ .y
-	_ = ( /* ERROR "has no method" */ *T).y
-}
-
-func struct_literals() {
-	type T0 struct {
-		a, b, c int
-	}
-
-	type T1 struct {
-		T0
-		a, b int
-		u float64
-		s string
-	}
-
-	// keyed elements
-	_ = T1{}
-	_ = T1{a: 0, 1 /* ERROR "mixture of .* elements" */ }
-	_ = T1{aa /* ERROR "unknown field" */ : 0}
-	_ = T1{1 /* ERROR "invalid field name" */ : 0}
-	_ = T1{a: 0, s: "foo", u: 0, a /* ERROR "duplicate field" */: 10}
-	_ = T1{a: "foo" /* ERROR "cannot convert" */ }
-	_ = T1{c /* ERROR "unknown field" */ : 0}
-	_ = T1{T0: { /* ERROR "missing type" */ }} // struct literal element type may not be elided
-	_ = T1{T0: T0{}}
-	_ = T1{T0 /* ERROR "invalid field name" */ .a: 0}
-
-	// unkeyed elements
-	_ = T0{1, 2, 3}
-	_ = T0{1, b /* ERROR "mixture" */ : 2, 3}
-	_ = T0{1, 2} /* ERROR "too few values" */
-	_ = T0{1, 2, 3, 4  /* ERROR "too many values" */ }
-	_ = T0{1, "foo" /* ERROR "cannot convert" */, 3.4  /* ERROR "truncated" */}
-
-	// invalid type
-	type P *struct{
-		x int
-	}
-	_ = P /* ERROR "invalid composite literal type" */ {}
-
-	// unexported fields
-	_ = time.Time{}
-	_ = time.Time{sec /* ERROR "unknown field" */ : 0}
-	_ = time.Time{
-		0 /* ERROR implicit assignment to unexported field sec in time.Time literal */,
-		0 /* ERROR implicit assignment */ ,
-		nil /* ERROR implicit assignment */ ,
-	}
-}
-
-func array_literals() {
-	type A0 [0]int
-	_ = A0{}
-	_ = A0{0 /* ERROR "index .* out of bounds" */}
-	_ = A0{0 /* ERROR "index .* out of bounds" */ : 0}
-
-	type A1 [10]int
-	_ = A1{}
-	_ = A1{0, 1, 2}
-	_ = A1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
-	_ = A1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /* ERROR "index .* out of bounds" */ }
-	_ = A1{- /* ERROR "negative" */ 1: 0}
-	_ = A1{8: 8, 9}
-	_ = A1{8: 8, 9, 10 /* ERROR "index .* out of bounds" */ }
-	_ = A1{0, 1, 2, 0 /* ERROR "duplicate index" */ : 0, 3: 3, 4}
-	_ = A1{5: 5, 6, 7, 3: 3, 4}
-	_ = A1{5: 5, 6, 7, 3: 3, 4, 5 /* ERROR "duplicate index" */ }
-	_ = A1{10 /* ERROR "index .* out of bounds" */ : 10, 10 /* ERROR "index .* out of bounds" */ : 10}
-	_ = A1{5: 5, 6, 7, 3: 3, 1 /* ERROR "overflows" */ <<100: 4, 5 /* ERROR "duplicate index" */ }
-	_ = A1{5: 5, 6, 7, 4: 4, 1 /* ERROR "overflows" */ <<100: 4}
-	_ = A1{2.0}
-	_ = A1{2.1 /* ERROR "truncated" */ }
-	_ = A1{"foo" /* ERROR "cannot convert" */ }
-
-	// indices must be integer constants
-	i := 1
-	const f = 2.1
-	const s = "foo"
-	_ = A1{i /* ERROR "index i must be integer constant" */ : 0}
-	_ = A1{f /* ERROR "truncated" */ : 0}
-	_ = A1{s /* ERROR "cannot convert" */ : 0}
-
-	a0 := [...]int{}
-	assert(len(a0) == 0)
-
-	a1 := [...]int{0, 1, 2}
-	assert(len(a1) == 3)
-	var a13 [3]int
-	var a14 [4]int
-	a13 = a1
-	a14 = a1 /* ERROR "cannot assign" */
-	_, _ = a13, a14
-
-	a2 := [...]int{- /* ERROR "negative" */ 1: 0}
-	_ = a2
-
-	a3 := [...]int{0, 1, 2, 0 /* ERROR "duplicate index" */ : 0, 3: 3, 4}
-	assert(len(a3) == 5) // somewhat arbitrary
-
-	a4 := [...]complex128{0, 1, 2, 1<<10-2: -1i, 1i, 400: 10, 12, 14}
-	assert(len(a4) == 1024)
-
-	// composite literal element types may be elided
-	type T []int
-	_ = [10]T{T{}, {}, 5: T{1, 2, 3}, 7: {1, 2, 3}}
-	a6 := [...]T{T{}, {}, 5: T{1, 2, 3}, 7: {1, 2, 3}}
-	assert(len(a6) == 8)
-
-	// recursively so
-	_ = [10][10]T{{}, [10]T{{}}, {{1, 2, 3}}}
-
-	// from the spec
-	type Point struct { x, y float32 }
-	_ = [...]Point{Point{1.5, -3.5}, Point{0, 0}}
-	_ = [...]Point{{1.5, -3.5}, {0, 0}}
-	_ = [][]int{[]int{1, 2, 3}, []int{4, 5}}
-	_ = [][]int{{1, 2, 3}, {4, 5}}
-	_ = [...]*Point{&Point{1.5, -3.5}, &Point{0, 0}}
-	_ = [...]*Point{{1.5, -3.5}, {0, 0}}
-}
-
-func slice_literals() {
-	type S0 []int
-	_ = S0{}
-	_ = S0{0, 1, 2}
-	_ = S0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
-	_ = S0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
-	_ = S0{- /* ERROR "negative" */ 1: 0}
-	_ = S0{8: 8, 9}
-	_ = S0{8: 8, 9, 10}
-	_ = S0{0, 1, 2, 0 /* ERROR "duplicate index" */ : 0, 3: 3, 4}
-	_ = S0{5: 5, 6, 7, 3: 3, 4}
-	_ = S0{5: 5, 6, 7, 3: 3, 4, 5 /* ERROR "duplicate index" */ }
-	_ = S0{10: 10, 10 /* ERROR "duplicate index" */ : 10}
-	_ = S0{5: 5, 6, 7, 3: 3, 1 /* ERROR "overflows" */ <<100: 4, 5 /* ERROR "duplicate index" */ }
-	_ = S0{5: 5, 6, 7, 4: 4, 1 /* ERROR "overflows" */ <<100: 4}
-	_ = S0{2.0}
-	_ = S0{2.1 /* ERROR "truncated" */ }
-	_ = S0{"foo" /* ERROR "cannot convert" */ }
-
-	// indices must be resolved correctly
-	const index1 = 1
-	_ = S0{index1: 1}
-	_ = S0{index2: 2}
-	_ = S0{index3 /* ERROR "undeclared name" */ : 3}
-
-	// indices must be integer constants
-	i := 1
-	const f = 2.1
-	const s = "foo"
-	_ = S0{i /* ERROR "index i must be integer constant" */ : 0}
-	_ = S0{f /* ERROR "truncated" */ : 0}
-	_ = S0{s /* ERROR "cannot convert" */ : 0}
-
-	// composite literal element types may be elided
-	type T []int
-	_ = []T{T{}, {}, 5: T{1, 2, 3}, 7: {1, 2, 3}}
-	_ = [][]int{{1, 2, 3}, {4, 5}}
-
-	// recursively so
-	_ = [][]T{{}, []T{{}}, {{1, 2, 3}}}
-}
-
-const index2 int = 2
-
-type N int
-func (N) f() {}
-
-func map_literals() {
-	type M0 map[string]int
-	type M1 map[bool]int
-	type M2 map[*int]int
-
-	_ = M0{}
-	_ = M0{1 /* ERROR "missing key" */ }
-	_ = M0{1 /* ERROR "cannot convert" */ : 2}
-	_ = M0{"foo": "bar" /* ERROR "cannot convert" */ }
-	_ = M0{"foo": 1, "bar": 2, "foo" /* ERROR "duplicate key" */ : 3 }
-
-	_ = map[interface{}]int{2: 1, 2 /* ERROR "duplicate key" */ : 1}
-	_ = map[interface{}]int{int(2): 1, int16(2): 1}
-	_ = map[interface{}]int{int16(2): 1, int16 /* ERROR "duplicate key" */ (2): 1}
-
-	type S string
-
-	_ = map[interface{}]int{"a": 1, "a" /* ERROR "duplicate key" */ : 1}
-	_ = map[interface{}]int{"a": 1, S("a"): 1}
-	_ = map[interface{}]int{S("a"): 1, S /* ERROR "duplicate key" */ ("a"): 1}
-
-	type I interface {
-		f()
-	}
-
-	_ = map[I]int{N(0): 1, N(2): 1}
-	_ = map[I]int{N(2): 1, N /* ERROR "duplicate key" */ (2): 1}
-
-	// map keys must be resolved correctly
-	key1 := "foo"
-	_ = M0{key1: 1}
-	_ = M0{key2: 2}
-	_ = M0{key3 /* ERROR "undeclared name" */ : 2}
-
-	var value int
-	_ = M1{true: 1, false: 0}
-	_ = M2{nil: 0, &value: 1}
-
-	// composite literal element types may be elided
-	type T [2]int
-	_ = map[int]T{0: T{3, 4}, 1: {5, 6}}
-
-	// recursively so
-	_ = map[int][]T{0: {}, 1: {{}, T{1, 2}}}
-
-	// composite literal key types may be elided
-	_ = map[T]int{T{3, 4}: 0, {5, 6}: 1}
-
-	// recursively so
-	_ = map[[2]T]int{{}: 0, {{}}: 1, [2]T{{}}: 2, {T{1, 2}}: 3}
-
-	// composite literal element and key types may be elided
-	_ = map[T]T{{}: {}, {1, 2}: T{3, 4}, T{4, 5}: {}}
-	_ = map[T]M0{{} : {}, T{1, 2}: M0{"foo": 0}, {1, 3}: {"foo": 1}}
-
-	// recursively so
-	_ = map[[2]T][]T{{}: {}, {{}}: {{}, T{1, 2}}, [2]T{{}}: nil, {T{1, 2}}: {{}, {}}}
-
-	// from the spec
-	type Point struct { x, y float32 }
-	_ = map[string]Point{"orig": {0, 0}}
-	_ = map[*Point]string{{0, 0}: "orig"}
-}
-
-var key2 string = "bar"
-
-type I interface {
-	m()
-}
-
-type I2 interface {
-	m(int)
-}
-
-type T1 struct{}
-type T2 struct{}
-
-func (T2) m(int) {}
-
-type mybool bool
-
-func type_asserts() {
-	var x int
-	_ = x /* ERROR "not an interface" */ .(int)
-
-	var e interface{}
-	var ok bool
-	x, ok = e.(int)
-	_ = ok
-
-	// ok value is of type bool
-	var myok mybool
-	_, myok = e.(int)
-	_ = myok
-
-	var t I
-	_ = t /* ERROR "use of .* outside type switch" */ .(type)
-	_ = t /* ERROR "missing method m" */ .(T)
-	_ = t.(*T)
-	_ = t /* ERROR "missing method m" */ .(T1)
-	_ = t /* ERROR "wrong type for method m" */ .(T2)
-	_ = t /* STRICT "wrong type for method m" */ .(I2) // only an error in strict mode (issue 8561)
-
-	// e doesn't statically have an m, but may have one dynamically.
-	_ = e.(I2)
-}
-
-func f0() {}
-func f1(x int) {}
-func f2(u float32, s string) {}
-func fs(s []byte) {}
-func fv(x ...int) {}
-func fi(x ... interface{}) {}
-func (T) fm(x ...int)
-
-func g0() {}
-func g1() int { return 0}
-func g2() (u float32, s string) { return }
-func gs() []byte { return nil }
-
-func _calls() {
-	var x int
-	var y float32
-	var s []int
-
-	f0()
-	_ = f0 /* ERROR "used as value" */ ()
-	f0(g0 /* ERROR "too many arguments" */ )
-
-	f1(0)
-	f1(x)
-	f1(10.0)
-	f1() /* ERROR "too few arguments" */
-	f1(x, y /* ERROR "too many arguments" */ )
-	f1(s /* ERROR "cannot pass" */ )
-	f1(x ... /* ERROR "cannot use ..." */ )
-	f1(g0 /* ERROR "used as value" */ ())
-	f1(g1())
-	// f1(g2()) // TODO(gri) missing position in error message
-
-	f2() /* ERROR "too few arguments" */
-	f2(3.14) /* ERROR "too few arguments" */
-	f2(3.14, "foo")
-	f2(x /* ERROR "cannot pass" */ , "foo")
-	f2(g0 /* ERROR "used as value" */ ())
-	f2(g1 /* ERROR "cannot pass" */ ()) /* ERROR "too few arguments" */
-	f2(g2())
-
-	fs() /* ERROR "too few arguments" */
-	fs(g0 /* ERROR "used as value" */ ())
-	fs(g1 /* ERROR "cannot pass" */ ())
-	fs(g2 /* ERROR "cannot pass" */ /* ERROR "too many arguments" */ ())
-	fs(gs())
-
-	fv()
-	fv(1, 2.0, x)
-	fv(s /* ERROR "cannot pass" */ )
-	fv(s...)
-	fv(x /* ERROR "cannot use" */ ...)
-	fv(1, s... /* ERROR "can only use ... with matching parameter" */ )
-	fv(gs /* ERROR "cannot pass" */ ())
-	fv(gs /* ERROR "cannot pass" */ ()...)
-
-	var t T
-	t.fm()
-	t.fm(1, 2.0, x)
-	t.fm(s /* ERROR "cannot pass" */ )
-	t.fm(g1())
-	t.fm(1, s... /* ERROR "can only use ... with matching parameter" */ )
-	t.fm(gs /* ERROR "cannot pass" */ ())
-	t.fm(gs /* ERROR "cannot pass" */ ()...)
-
-	T.fm(t, )
-	T.fm(t, 1, 2.0, x)
-	T.fm(t, s /* ERROR "cannot pass" */ )
-	T.fm(t, g1())
-	T.fm(t, 1, s... /* ERROR "can only use ... with matching parameter" */ )
-	T.fm(t, gs /* ERROR "cannot pass" */ ())
-	T.fm(t, gs /* ERROR "cannot pass" */ ()...)
-
-	var i interface{ fm(x ...int) } = t
-	i.fm()
-	i.fm(1, 2.0, x)
-	i.fm(s /* ERROR "cannot pass" */ )
-	i.fm(g1())
-	i.fm(1, s... /* ERROR "can only use ... with matching parameter" */ )
-	i.fm(gs /* ERROR "cannot pass" */ ())
-	i.fm(gs /* ERROR "cannot pass" */ ()...)
-
-	fi()
-	fi(1, 2.0, x, 3.14, "foo")
-	fi(g2())
-	fi(0, g2)
-	fi(0, g2 /* ERROR "2-valued expression" */ ())
-}
-
-func issue6344() {
-	type T []interface{}
-	var x T
-	fi(x...) // ... applies also to named slices
-}
diff --git a/third_party/gotools/go/types/testdata/gotos.src b/third_party/gotools/go/types/testdata/gotos.src
deleted file mode 100644
index 0c7ee44..0000000
--- a/third_party/gotools/go/types/testdata/gotos.src
+++ /dev/null
@@ -1,560 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file is a modified copy of $GOROOT/test/goto.go.
-
-package gotos
-
-var (
-	i, n int
-	x    []int
-	c    chan int
-	m    map[int]int
-	s    string
-)
-
-// goto after declaration okay
-func _() {
-	x := 1
-	goto L
-L:
-	_ = x
-}
-
-// goto before declaration okay
-func _() {
-	goto L
-L:
-	x := 1
-	_ = x
-}
-
-// goto across declaration not okay
-func _() {
-	goto L /* ERROR "goto L jumps over variable declaration at line 36" */
-	x := 1
-	_ = x
-L:
-}
-
-// goto across declaration in inner scope okay
-func _() {
-	goto L
-	{
-		x := 1
-		_ = x
-	}
-L:
-}
-
-// goto across declaration after inner scope not okay
-func _() {
-	goto L /* ERROR "goto L jumps over variable declaration at line 58" */
-	{
-		x := 1
-		_ = x
-	}
-	x := 1
-	_ = x
-L:
-}
-
-// goto across declaration in reverse okay
-func _() {
-L:
-	x := 1
-	_ = x
-	goto L
-}
-
-func _() {
-L: L1:
-	x := 1
-	_ = x
-	goto L
-	goto L1
-}
-
-// error shows first offending variable
-func _() {
-	goto L /* ERROR "goto L jumps over variable declaration at line 84" */
-	x := 1
-	_ = x
-	y := 1
-	_ = y
-L:
-}
-
-// goto not okay even if code path is dead
-func _() {
-	goto L /* ERROR "goto L jumps over variable declaration" */
-	x := 1
-	_ = x
-	y := 1
-	_ = y
-	return
-L:
-}
-
-// goto into outer block okay
-func _() {
-	{
-		goto L
-	}
-L:
-}
-
-func _() {
-	{
-		goto L
-		goto L1
-	}
-L: L1:
-}
-
-// goto backward into outer block okay
-func _() {
-L:
-	{
-		goto L
-	}
-}
-
-func _() {
-L: L1:
-	{
-		goto L
-		goto L1
-	}
-}
-
-// goto into inner block not okay
-func _() {
-	goto L /* ERROR "goto L jumps into block" */
-	{
-	L:
-	}
-}
-
-func _() {
-	goto L /* ERROR "goto L jumps into block" */
-	goto L1 /* ERROR "goto L1 jumps into block" */
-	{
-	L: L1:
-	}
-}
-
-// goto backward into inner block still not okay
-func _() {
-	{
-	L:
-	}
-	goto L /* ERROR "goto L jumps into block" */
-}
-
-func _() {
-	{
-	L: L1:
-	}
-	goto L /* ERROR "goto L jumps into block" */
-	goto L1 /* ERROR "goto L1 jumps into block" */
-}
-
-// error shows first (outermost) offending block
-func _() {
-	goto L /* ERROR "goto L jumps into block" */
-	{
-		{
-			{
-			L:
-			}
-		}
-	}
-}
-
-// error prefers block diagnostic over declaration diagnostic
-func _() {
-	goto L /* ERROR "goto L jumps into block" */
-	x := 1
-	_ = x
-	{
-	L:
-	}
-}
-
-// many kinds of blocks, all invalid to jump into or among,
-// but valid to jump out of
-
-// if
-
-func _() {
-L:
-	if true {
-		goto L
-	}
-}
-
-func _() {
-L:
-	if true {
-		goto L
-	} else {
-	}
-}
-
-func _() {
-L:
-	if false {
-	} else {
-		goto L
-	}
-}
-
-func _() {
-	goto L /* ERROR "goto L jumps into block" */
-	if true {
-	L:
-	}
-}
-
-func _() {
-	goto L /* ERROR "goto L jumps into block" */
-	if true {
-	L:
-	} else {
-	}
-}
-
-func _() {
-	goto L /* ERROR "goto L jumps into block" */
-	if true {
-	} else {
-	L:
-	}
-}
-
-func _() {
-	if false {
-	L:
-	} else {
-		goto L /* ERROR "goto L jumps into block" */
-	}
-}
-
-func _() {
-	if true {
-		goto L /* ERROR "goto L jumps into block" */
-	} else {
-	L:
-	}
-}
-
-func _() {
-	if true {
-		goto L /* ERROR "goto L jumps into block" */
-	} else if false {
-	L:
-	}
-}
-
-func _() {
-	if true {
-		goto L /* ERROR "goto L jumps into block" */
-	} else if false {
-	L:
-	} else {
-	}
-}
-
-func _() {
-	if true {
-		goto L /* ERROR "goto L jumps into block" */
-	} else if false {
-	} else {
-	L:
-	}
-}
-
-func _() {
-	if true {
-		goto L /* ERROR "goto L jumps into block" */
-	} else {
-		L:
-	}
-}
-
-func _() {
-	if true {
-		L:
-	} else {
-		goto L /* ERROR "goto L jumps into block" */
-	}
-}
-
-// for
-
-func _() {
-	for {
-		goto L
-	}
-L:
-}
-
-func _() {
-	for {
-		goto L
-	L:
-	}
-}
-
-func _() {
-	for {
-	L:
-	}
-	goto L /* ERROR "goto L jumps into block" */
-}
-
-func _() {
-	for {
-		goto L
-	L1:
-	}
-L:
-	goto L1 /* ERROR "goto L1 jumps into block" */
-}
-
-func _() {
-	for i < n {
-	L:
-	}
-	goto L /* ERROR "goto L jumps into block" */
-}
-
-func _() {
-	for i = 0; i < n; i++ {
-	L:
-	}
-	goto L /* ERROR "goto L jumps into block" */
-}
-
-func _() {
-	for i = range x {
-	L:
-	}
-	goto L /* ERROR "goto L jumps into block" */
-}
-
-func _() {
-	for i = range c {
-	L:
-	}
-	goto L /* ERROR "goto L jumps into block" */
-}
-
-func _() {
-	for i = range m {
-	L:
-	}
-	goto L /* ERROR "goto L jumps into block" */
-}
-
-func _() {
-	for i = range s {
-	L:
-	}
-	goto L /* ERROR "goto L jumps into block" */
-}
-
-// switch
-
-func _() {
-L:
-	switch i {
-	case 0:
-		goto L
-	}
-}
-
-func _() {
-L:
-	switch i {
-	case 0:
-
-	default:
-		goto L
-	}
-}
-
-func _() {
-	switch i {
-	case 0:
-
-	default:
-	L:
-		goto L
-	}
-}
-
-func _() {
-	switch i {
-	case 0:
-
-	default:
-		goto L
-	L:
-	}
-}
-
-func _() {
-	switch i {
-	case 0:
-		goto L
-	L:
-		;
-	default:
-	}
-}
-
-func _() {
-	goto L /* ERROR "goto L jumps into block" */
-	switch i {
-	case 0:
-	L:
-	}
-}
-
-func _() {
-	goto L /* ERROR "goto L jumps into block" */
-	switch i {
-	case 0:
-	L:
-		;
-	default:
-	}
-}
-
-func _() {
-	goto L /* ERROR "goto L jumps into block" */
-	switch i {
-	case 0:
-	default:
-	L:
-	}
-}
-
-func _() {
-	switch i {
-	default:
-		goto L /* ERROR "goto L jumps into block" */
-	case 0:
-	L:
-	}
-}
-
-func _() {
-	switch i {
-	case 0:
-	L:
-		;
-	default:
-		goto L /* ERROR "goto L jumps into block" */
-	}
-}
-
-// select
-// different from switch.  the statement has no implicit block around it.
-
-func _() {
-L:
-	select {
-	case <-c:
-		goto L
-	}
-}
-
-func _() {
-L:
-	select {
-	case c <- 1:
-
-	default:
-		goto L
-	}
-}
-
-func _() {
-	select {
-	case <-c:
-
-	default:
-	L:
-		goto L
-	}
-}
-
-func _() {
-	select {
-	case c <- 1:
-
-	default:
-		goto L
-	L:
-	}
-}
-
-func _() {
-	select {
-	case <-c:
-		goto L
-	L:
-		;
-	default:
-	}
-}
-
-func _() {
-	goto L /* ERROR "goto L jumps into block" */
-	select {
-	case c <- 1:
-	L:
-	}
-}
-
-func _() {
-	goto L /* ERROR "goto L jumps into block" */
-	select {
-	case c <- 1:
-	L:
-		;
-	default:
-	}
-}
-
-func _() {
-	goto L /* ERROR "goto L jumps into block" */
-	select {
-	case <-c:
-	default:
-	L:
-	}
-}
-
-func _() {
-	select {
-	default:
-		goto L /* ERROR "goto L jumps into block" */
-	case <-c:
-	L:
-	}
-}
-
-func _() {
-	select {
-	case <-c:
-	L:
-		;
-	default:
-		goto L /* ERROR "goto L jumps into block" */
-	}
-}
diff --git a/third_party/gotools/go/types/testdata/importdecl0a.src b/third_party/gotools/go/types/testdata/importdecl0a.src
deleted file mode 100644
index 463dcd0..0000000
--- a/third_party/gotools/go/types/testdata/importdecl0a.src
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package importdecl0
-
-import ()
-
-import (
-	// we can have multiple blank imports (was bug)
-	_ "math"
-	_ "net/rpc"
-	init /* ERROR "cannot declare init" */ "fmt"
-	// reflect defines a type "flag" which shows up in the gc export data
-	"reflect"
-	. /* ERROR "imported but not used" */ "reflect"
-)
-
-import "math" /* ERROR "imported but not used" */
-import m /* ERROR "imported but not used as m" */ "math"
-import _ "math"
-
-import (
-	"math/big" /* ERROR "imported but not used" */
-	b /* ERROR "imported but not used" */ "math/big"
-	_ "math/big"
-)
-
-import "fmt"
-import f1 "fmt"
-import f2 "fmt"
-
-// reflect.flag must not be visible in this package
-type flag int
-type _ reflect /* ERROR "not exported" */ .flag
-
-// imported package name may conflict with local objects
-type reflect /* ERROR "reflect already declared" */ int
-
-// dot-imported exported objects may conflict with local objects
-type Value /* ERROR "Value already declared through dot-import of package reflect" */ struct{}
-
-var _ = fmt.Println // use "fmt"
-
-func _() {
-	f1.Println() // use "fmt"
-}
-
-func _() {
-	_ = func() {
-		f2.Println() // use "fmt"
-	}
-}
diff --git a/third_party/gotools/go/types/testdata/importdecl0b.src b/third_party/gotools/go/types/testdata/importdecl0b.src
deleted file mode 100644
index 6844e70..0000000
--- a/third_party/gotools/go/types/testdata/importdecl0b.src
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package importdecl0
-
-import "math"
-import m "math"
-
-import . "testing" // declares T in file scope
-import . /* ERROR "imported but not used" */ "unsafe"
-import . "fmt"     // declares Println in file scope
-
-import (
-	// TODO(gri) At the moment, 2 errors are reported because both go/parser
-	// and the type checker report it. Eventually, this test should not be
-	// done by the parser anymore.
-	"" /* ERROR invalid import path */ /* ERROR invalid import path */
-	"a!b" /* ERROR invalid import path */ /* ERROR invalid import path */
-	"abc\xffdef" /* ERROR invalid import path */ /* ERROR invalid import path */
-)
-
-// using "math" in this file doesn't affect its use in other files
-const Pi0 = math.Pi
-const Pi1 = m.Pi
-
-type _ T // use "testing"
-
-func _() func() interface{} {
-	return func() interface{} {
-		return Println // use "fmt"
-	}
-}
diff --git a/third_party/gotools/go/types/testdata/importdecl1a.src b/third_party/gotools/go/types/testdata/importdecl1a.src
deleted file mode 100644
index 8301820..0000000
--- a/third_party/gotools/go/types/testdata/importdecl1a.src
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test case for issue 8969.
-
-package importdecl1
-
-import . "unsafe"
-
-var _ Pointer // use dot-imported package unsafe
diff --git a/third_party/gotools/go/types/testdata/importdecl1b.src b/third_party/gotools/go/types/testdata/importdecl1b.src
deleted file mode 100644
index f24bb9a..0000000
--- a/third_party/gotools/go/types/testdata/importdecl1b.src
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package importdecl1
-
-import . /* ERROR "imported but not used" */ "unsafe"
diff --git a/third_party/gotools/go/types/testdata/init0.src b/third_party/gotools/go/types/testdata/init0.src
deleted file mode 100644
index ef0349c..0000000
--- a/third_party/gotools/go/types/testdata/init0.src
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// initialization cycles
-
-package init0
-
-// initialization cycles (we don't know the types)
-const (
-	s0 /* ERROR initialization cycle */ = s0
-
-	x0 /* ERROR initialization cycle */ = y0
-	y0 = x0
-
-	a0 = b0
-	b0 /* ERROR initialization cycle */ = c0
-	c0 = d0
-	d0 = b0
-)
-
-var (
-	s1 /* ERROR initialization cycle */ = s1
-
-	x1 /* ERROR initialization cycle */ = y1
-	y1 = x1
-
-	a1 = b1
-	b1 /* ERROR initialization cycle */ = c1
-	c1 = d1
-	d1 = b1
-)
-
-// initialization cycles (we know the types)
-const (
-	s2 /* ERROR initialization cycle */ int = s2
-
-	x2 /* ERROR initialization cycle */ int = y2
-	y2 = x2
-
-	a2 = b2
-	b2 /* ERROR initialization cycle */ int = c2
-	c2 = d2
-	d2 = b2
-)
-
-var (
-	s3 /* ERROR initialization cycle */ int = s3
-
-	x3 /* ERROR initialization cycle */ int = y3
-	y3 = x3
-
-	a3 = b3
-	b3 /* ERROR initialization cycle */ int = c3
-	c3 = d3
-	d3 = b3
-)
-
-// cycles via struct fields
-
-type S1 struct {
-	f int
-}
-const cx3 S1 /* ERROR invalid constant type */ = S1{cx3.f}
-var vx3 /* ERROR initialization cycle */ S1 = S1{vx3.f}
-
-// cycles via functions
-
-var x4 = x5
-var x5 /* ERROR initialization cycle */ = f1()
-func f1() int { return x5*10 }
-
-var x6, x7 /* ERROR initialization cycle */ = f2()
-var x8 = x7
-func f2() (int, int) { return f3() + f3(), 0 }
-func f3() int { return x8 }
-
-// cycles via closures
-
-var x9 /* ERROR initialization cycle */ = func() int { return x9 }()
-
-var x10 /* ERROR initialization cycle */ = f4()
-
-func f4() int {
-	_ = func() {
-		_ = x10
-	}
-	return 0
-}
-
-// cycles via method expressions
-
-type T1 struct{}
-
-func (T1) m() bool { _ = x11; return false }
-
-var x11 /* ERROR initialization cycle */ = T1.m(T1{})
-
-// cycles via method values
-
-type T2 struct{}
-
-func (T2) m() bool { _ = x12; return false }
-
-var t1 T2
-var x12 /* ERROR initialization cycle */ = t1.m
diff --git a/third_party/gotools/go/types/testdata/init1.src b/third_party/gotools/go/types/testdata/init1.src
deleted file mode 100644
index 39ca314..0000000
--- a/third_party/gotools/go/types/testdata/init1.src
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// initialization cycles
-
-package init1
-
-// issue 6683 (marked as WorkingAsIntended)
-
-type T0 struct{}
-
-func (T0) m() int { return y0 }
-
-var x0 = T0{}
-
-var y0 /* ERROR initialization cycle */ = x0.m()
-
-type T1 struct{}
-
-func (T1) m() int { return y1 }
-
-var x1 interface {
-	m() int
-} = T1{}
-
-var y1 = x1.m() // no cycle reported, x1 is of interface type
-
-// issue 6703 (modified)
-
-var x2 /* ERROR initialization cycle */ = T2.m
-
-var y2 = x2
-
-type T2 struct{}
-
-func (T2) m() int {
-	_ = y2
-	return 0
-}
-
-var x3 /* ERROR initialization cycle */ = T3.m(T3{}) // <<<< added (T3{})
-
-var y3 = x3
-
-type T3 struct{}
-
-func (T3) m() int {
-	_ = y3
-	return 0
-}
-
-var x4 /* ERROR initialization cycle */ = T4{}.m // <<<< added {}
-
-var y4 = x4
-
-type T4 struct{}
-
-func (T4) m() int {
-	_ = y4
-	return 0
-}
-
-var x5 /* ERROR initialization cycle */ = T5{}.m() // <<<< added ()
-
-var y5 = x5
-
-type T5 struct{}
-
-func (T5) m() int {
-	_ = y5
-	return 0
-}
-
-// issue 4847
-// simplified test case
-
-var x6 = f6
-var y6 /* ERROR initialization cycle */ = f6
-func f6() { _ = y6 }
-
-// full test case
-
-type (
-      E int
-      S int
-)
-
-type matcher func(s *S) E
-
-func matchList(s *S) E { return matcher(matchAnyFn)(s) }
-
-var foo = matcher(matchList)
-
-var matchAny /* ERROR initialization cycle */ = matcher(matchList)
-
-func matchAnyFn(s *S) (err E) { return matchAny(s) }
\ No newline at end of file
diff --git a/third_party/gotools/go/types/testdata/init2.src b/third_party/gotools/go/types/testdata/init2.src
deleted file mode 100644
index 614db6c..0000000
--- a/third_party/gotools/go/types/testdata/init2.src
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// initialization cycles
-
-package init2
-
-// cycles through functions
-
-func f1() int { _ = x1; return 0 }
-var x1 /* ERROR initialization cycle */ = f1
-
-func f2() int { _ = x2; return 0 }
-var x2 /* ERROR initialization cycle */ = f2()
-
-// cycles through method expressions
-
-type T3 int
-func (T3) m() int { _ = x3; return 0 }
-var x3 /* ERROR initialization cycle */ = T3.m
-
-type T4 int
-func (T4) m() int { _ = x4; return 0 }
-var x4 /* ERROR initialization cycle */ = T4.m(0)
-
-type T3p int
-func (*T3p) m() int { _ = x3p; return 0 }
-var x3p /* ERROR initialization cycle */ = (*T3p).m
-
-type T4p int
-func (*T4p) m() int { _ = x4p; return 0 }
-var x4p /* ERROR initialization cycle */ = (*T4p).m(nil)
-
-// cycles through method expressions of embedded methods
-
-type T5 struct { E5 }
-type E5 int
-func (E5) m() int { _ = x5; return 0 }
-var x5 /* ERROR initialization cycle */ = T5.m
-
-type T6 struct { E6 }
-type E6 int
-func (E6) m() int { _ = x6; return 0 }
-var x6 /* ERROR initialization cycle */ = T6.m(T6{0})
-
-type T5p struct { E5p }
-type E5p int
-func (*E5p) m() int { _ = x5p; return 0 }
-var x5p /* ERROR initialization cycle */ = (*T5p).m
-
-type T6p struct { E6p }
-type E6p int
-func (*E6p) m() int { _ = x6p; return 0 }
-var x6p /* ERROR initialization cycle */ = (*T6p).m(nil)
-
-// cycles through method values
-
-type T7 int
-func (T7) m() int { _ = x7; return 0 }
-var x7 /* ERROR initialization cycle */ = T7(0).m
-
-type T8 int
-func (T8) m() int { _ = x8; return 0 }
-var x8 /* ERROR initialization cycle */ = T8(0).m()
-
-type T7p int
-func (*T7p) m() int { _ = x7p; return 0 }
-var x7p /* ERROR initialization cycle */ = new(T7p).m
-
-type T8p int
-func (*T8p) m() int { _ = x8p; return 0 }
-var x8p /* ERROR initialization cycle */ = new(T8p).m()
-
-type T7v int
-func (T7v) m() int { _ = x7v; return 0 }
-var x7var T7v
-var x7v /* ERROR initialization cycle */ = x7var.m
-
-type T8v int
-func (T8v) m() int { _ = x8v; return 0 }
-var x8var T8v
-var x8v /* ERROR initialization cycle */ = x8var.m()
-
-type T7pv int
-func (*T7pv) m() int { _ = x7pv; return 0 }
-var x7pvar *T7pv
-var x7pv /* ERROR initialization cycle */ = x7pvar.m
-
-type T8pv int
-func (*T8pv) m() int { _ = x8pv; return 0 }
-var x8pvar *T8pv
-var x8pv /* ERROR initialization cycle */ = x8pvar.m()
-
-// cycles through method values of embedded methods
-
-type T9 struct { E9 }
-type E9 int
-func (E9) m() int { _ = x9; return 0 }
-var x9 /* ERROR initialization cycle */ = T9{0}.m
-
-type T10 struct { E10 }
-type E10 int
-func (E10) m() int { _ = x10; return 0 }
-var x10 /* ERROR initialization cycle */ = T10{0}.m()
-
-type T9p struct { E9p }
-type E9p int
-func (*E9p) m() int { _ = x9p; return 0 }
-var x9p /* ERROR initialization cycle */ = new(T9p).m
-
-type T10p struct { E10p }
-type E10p int
-func (*E10p) m() int { _ = x10p; return 0 }
-var x10p /* ERROR initialization cycle */ = new(T10p).m()
-
-type T9v struct { E9v }
-type E9v int
-func (E9v) m() int { _ = x9v; return 0 }
-var x9var T9v
-var x9v /* ERROR initialization cycle */ = x9var.m
-
-type T10v struct { E10v }
-type E10v int
-func (E10v) m() int { _ = x10v; return 0 }
-var x10var T10v
-var x10v /* ERROR initialization cycle */ = x10var.m()
-
-type T9pv struct { E9pv }
-type E9pv int
-func (*E9pv) m() int { _ = x9pv; return 0 }
-var x9pvar *T9pv
-var x9pv /* ERROR initialization cycle */ = x9pvar.m
-
-type T10pv struct { E10pv }
-type E10pv int
-func (*E10pv) m() int { _ = x10pv; return 0 }
-var x10pvar *T10pv
-var x10pv /* ERROR initialization cycle */ = x10pvar.m()
diff --git a/third_party/gotools/go/types/testdata/issues.src b/third_party/gotools/go/types/testdata/issues.src
deleted file mode 100644
index d08e0fd..0000000
--- a/third_party/gotools/go/types/testdata/issues.src
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package issues
-
-import "fmt"
-
-func issue7035() {
-	type T struct{ X int }
-	_ = func() {
-		fmt.Println() // must refer to imported fmt rather than the fmt below
-	}
-	fmt := new(T)
-	_ = fmt.X
-}
-
-func issue8066() {
-	const (
-		// TODO(gri) Enable test below for releases 1.4 and higher
-		// _ = float32(340282356779733661637539395458142568447)
-		_ = float32(340282356779733661637539395458142568448 /* ERROR cannot convert */ )
-	)
-}
-
-// Check that a missing identifier doesn't lead to a spurious error cascade.
-func issue8799a() {
-	x, ok := missing /* ERROR undeclared */ ()
-	_ = !ok
-	_ = x
-}
-
-func issue8799b(x int, ok bool) {
-	x, ok = missing /* ERROR undeclared */ ()
-	_ = !ok
-	_ = x
-}
-
-func issue9182() {
-	type Point C /* ERROR undeclared */ .Point
-	// no error for composite literal based on unknown type
-	_ = Point{x: 1, y: 2}
-}
-
-func f0() (a []int)         { return }
-func f1() (a []int, b int)  { return }
-func f2() (a, b []int)      { return }
-
-func append_([]int, ...int) {}
-
-func issue9473(a []int, b ...int) {
-	// variadic builtin function
-	_ = append(f0())
-	_ = append(f0(), f0()...)
-	_ = append(f1())
-	_ = append(f2 /* ERROR cannot pass argument */ ())
-	_ = append(f2()... /* ERROR cannot use ... */ )
-	_ = append(f0(), f1 /* ERROR 2-valued expression */ ())
-	_ = append(f0(), f2 /* ERROR 2-valued expression */ ())
-	_ = append(f0(), f1()... /* ERROR cannot use ... */ )
-	_ = append(f0(), f2()... /* ERROR cannot use ... */ )
-
-	// variadic user-defined function
-	append_(f0())
-	append_(f0(), f0()...)
-	append_(f1())
-	append_(f2 /* ERROR cannot pass argument */ ())
-	append_(f2()... /* ERROR cannot use ... */ )
-	append_(f0(), f1 /* ERROR 2-valued expression */ ())
-	append_(f0(), f2 /* ERROR 2-valued expression */ ())
-	append_(f0(), f1()... /* ERROR cannot use */ )
-	append_(f0(), f2()... /* ERROR cannot use */ )
-}
diff --git a/third_party/gotools/go/types/testdata/labels.src b/third_party/gotools/go/types/testdata/labels.src
deleted file mode 100644
index 102ffc7..0000000
--- a/third_party/gotools/go/types/testdata/labels.src
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file is a modified concatenation of the files
-// $GOROOT/test/label.go and $GOROOT/test/label1.go.
-
-package labels
-
-var x int
-
-func f0() {
-L1 /* ERROR "label L1 declared but not used" */ :
-	for {
-	}
-L2 /* ERROR "label L2 declared but not used" */ :
-	select {
-	}
-L3 /* ERROR "label L3 declared but not used" */ :
-	switch {
-	}
-L4 /* ERROR "label L4 declared but not used" */ :
-	if true {
-	}
-L5 /* ERROR "label L5 declared but not used" */ :
-	f0()
-L6:
-	f0()
-L6 /* ERROR "label L6 already declared" */ :
-	f0()
-	if x == 20 {
-		goto L6
-	}
-
-L7:
-	for {
-		break L7
-		break L8 /* ERROR "invalid break label L8" */
-	}
-
-// A label must be directly associated with a switch, select, or
-// for statement; it cannot be the label of a labeled statement.
-
-L7a /* ERROR "declared but not used" */ : L7b:
-	for {
-		break L7a /* ERROR "invalid break label L7a" */
-		continue L7a /* ERROR "invalid continue label L7a" */
-		continue L7b
-	}
-
-L8:
-	for {
-		if x == 21 {
-			continue L8
-			continue L7 /* ERROR "invalid continue label L7" */
-		}
-	}
-
-L9:
-	switch {
-	case true:
-		break L9
-	defalt /* ERROR "label defalt declared but not used" */ :
-	}
-
-L10:
-	select {
-	default:
-		break L10
-		break L9 /* ERROR "invalid break label L9" */
-	}
-
-	goto L10a
-L10a: L10b:
-	select {
-	default:
-		break L10a /* ERROR "invalid break label L10a" */
-		break L10b
-		continue L10b /* ERROR "invalid continue label L10b" */
-	}
-}
-
-func f1() {
-L1:
-	for {
-		if x == 0 {
-			break L1
-		}
-		if x == 1 {
-			continue L1
-		}
-		goto L1
-	}
-
-L2:
-	select {
-	default:
-		if x == 0 {
-			break L2
-		}
-		if x == 1 {
-			continue L2 /* ERROR "invalid continue label L2" */
-		}
-		goto L2
-	}
-
-L3:
-	switch {
-	case x > 10:
-		if x == 11 {
-			break L3
-		}
-		if x == 12 {
-			continue L3 /* ERROR "invalid continue label L3" */
-		}
-		goto L3
-	}
-
-L4:
-	if true {
-		if x == 13 {
-			break L4 /* ERROR "invalid break label L4" */
-		}
-		if x == 14 {
-			continue L4 /* ERROR "invalid continue label L4" */
-		}
-		if x == 15 {
-			goto L4
-		}
-	}
-
-L5:
-	f1()
-	if x == 16 {
-		break L5 /* ERROR "invalid break label L5" */
-	}
-	if x == 17 {
-		continue L5 /* ERROR "invalid continue label L5" */
-	}
-	if x == 18 {
-		goto L5
-	}
-
-	for {
-		if x == 19 {
-			break L1 /* ERROR "invalid break label L1" */
-		}
-		if x == 20 {
-			continue L1 /* ERROR "invalid continue label L1" */
-		}
-		if x == 21 {
-			goto L1
-		}
-	}
-}
-
-// Additional tests not in the original files.
-
-func f2() {
-L1 /* ERROR "label L1 declared but not used" */ :
-	if x == 0 {
-		for {
-			continue L1 /* ERROR "invalid continue label L1" */
-		}
-	}
-}
-
-func f3() {
-L1:
-L2:
-L3:
-	for {
-		break L1 /* ERROR "invalid break label L1" */
-		break L2 /* ERROR "invalid break label L2" */
-		break L3
-		continue L1 /* ERROR "invalid continue label L1" */
-		continue L2 /* ERROR "invalid continue label L2" */
-		continue L3
-		goto L1
-		goto L2
-		goto L3
-	}
-}
-
-// Blank labels are never declared.
-
-func f4() {
-_:
-_: // multiple blank labels are ok
-	goto _ /* ERROR "label _ not declared" */
-}
-
-func f5() {
-_:
-	for {
-		break _ /* ERROR "invalid break label _" */
-		continue _ /* ERROR "invalid continue label _" */
-	}
-}
-
-func f6() {
-_:
-	switch {
-	default:
-		break _ /* ERROR "invalid break label _" */
-	}
-}
diff --git a/third_party/gotools/go/types/testdata/methodsets.src b/third_party/gotools/go/types/testdata/methodsets.src
deleted file mode 100644
index 8921146..0000000
--- a/third_party/gotools/go/types/testdata/methodsets.src
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package methodsets
-
-type T0 struct {}
-
-func (T0) v0() {}
-func (*T0) p0() {}
-
-type T1 struct {} // like T0 with different method names
-
-func (T1) v1() {}
-func (*T1) p1() {}
-
-type T2 interface {
-	v2()
-	p2()
-}
-
-type T3 struct {
-	T0
-	*T1
-	T2
-}
-
-// Method expressions
-func _() {
-	var (
-		_ func(T0) = T0.v0
-		_ = T0 /* ERROR "not in method set" */ .p0
-
-		_ func (*T0) = (*T0).v0
-		_ func (*T0) = (*T0).p0
-
-		// T1 is like T0
-
-		_ func(T2) = T2.v2
-		_ func(T2) = T2.p2
-
-		_ func(T3) = T3.v0
-		_ func(T3) = T3 /* ERROR "not in method set" */ .p0
-		_ func(T3) = T3.v1
-		_ func(T3) = T3.p1
-		_ func(T3) = T3.v2
-		_ func(T3) = T3.p2
-
-		_ func(*T3) = (*T3).v0
-		_ func(*T3) = (*T3).p0
-		_ func(*T3) = (*T3).v1
-		_ func(*T3) = (*T3).p1
-		_ func(*T3) = (*T3).v2
-		_ func(*T3) = (*T3).p2
-	)
-}
-
-// Method values with addressable receivers
-func _() {
-	var (
-		v0 T0
-		_ func() = v0.v0
-		_ func() = v0.p0
-	)
-
-	var (
-		p0 *T0
-		_ func() = p0.v0
-		_ func() = p0.p0
-	)
-
-	// T1 is like T0
-
-	var (
-		v2 T2
-		_ func() = v2.v2
-		_ func() = v2.p2
-	)
-
-	var (
-		v4 T3
-		_ func() = v4.v0
-		_ func() = v4.p0
-		_ func() = v4.v1
-		_ func() = v4.p1
-		_ func() = v4.v2
-		_ func() = v4.p2
-	)
-
-	var (
-		p4 *T3
-		_ func() = p4.v0
-		_ func() = p4.p0
-		_ func() = p4.v1
-		_ func() = p4.p1
-		_ func() = p4.v2
-		_ func() = p4.p2
-	)
-}
-
-// Method calls with addressable receivers
-func _() {
-	var v0 T0
-	v0.v0()
-	v0.p0()
-
-	var p0 *T0
-	p0.v0()
-	p0.p0()
-
-	// T1 is like T0
-
-	var v2 T2
-	v2.v2()
-	v2.p2()
-
-	var v4 T3
-	v4.v0()
-	v4.p0()
-	v4.v1()
-	v4.p1()
-	v4.v2()
-	v4.p2()
-
-	var p4 *T3
-	p4.v0()
-	p4.p0()
-	p4.v1()
-	p4.p1()
-	p4.v2()
-	p4.p2()
-}
-
-// Method values with value receivers
-func _() {
-	var (
-		_ func() = T0{}.v0
-		_ func() = T0 /* ERROR "not in method set" */ {}.p0
-
-		_ func() = (&T0{}).v0
-		_ func() = (&T0{}).p0
-
-		// T1 is like T0
-
-		// no values for T2
-
-		_ func() = T3{}.v0
-		_ func() = T3 /* ERROR "not in method set" */ {}.p0
-		_ func() = T3{}.v1
-		_ func() = T3{}.p1
-		_ func() = T3{}.v2
-		_ func() = T3{}.p2
-
-		_ func() = (&T3{}).v0
-		_ func() = (&T3{}).p0
-		_ func() = (&T3{}).v1
-		_ func() = (&T3{}).p1
-		_ func() = (&T3{}).v2
-		_ func() = (&T3{}).p2
-	)
-}
-
-// Method calls with value receivers
-func _() {
-	T0{}.v0()
-	T0 /* ERROR "not in method set" */ {}.p0()
-
-	(&T0{}).v0()
-	(&T0{}).p0()
-
-	// T1 is like T0
-
-	// no values for T2
-
-	T3{}.v0()
-	T3 /* ERROR "not in method set" */ {}.p0()
-	T3{}.v1()
-	T3{}.p1()
-	T3{}.v2()
-	T3{}.p2()
-
-	(&T3{}).v0()
-	(&T3{}).p0()
-	(&T3{}).v1()
-	(&T3{}).p1()
-	(&T3{}).v2()
-	(&T3{}).p2()
-}
-
-// *T has no methods if T is an interface type
-func issue5918() {
-	var (
-		err error
-		_ = err.Error()
-		_ func() string = err.Error
-		_ func(error) string = error.Error
-
-		perr = &err
-		_ = perr /* ERROR "no field or method" */ .Error()
-		_ func() string = perr /* ERROR "no field or method" */ .Error
-		_ func(*error) string = ( /* ERROR "no field or method" */ *error).Error
-	)
-
-	type T *interface{ m() int }
-	var (
-		x T
-		_ = (*x).m()
-		_ = (*x).m
-
-		_ = x /* ERROR "no field or method" */ .m()
-		_ = x /* ERROR "no field or method" */ .m
-		_ = T /* ERROR "no field or method" */ .m
-	)
-}
diff --git a/third_party/gotools/go/types/testdata/shifts.src b/third_party/gotools/go/types/testdata/shifts.src
deleted file mode 100644
index 7f8ed06..0000000
--- a/third_party/gotools/go/types/testdata/shifts.src
+++ /dev/null
@@ -1,321 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package shifts
-
-func shifts0() {
-	// basic constant shifts
-	const (
-		s = 10
-		_ = 0<<0
-		_ = 1<<s
-		_ = 1<<- /* ERROR "stupid shift" */ 1
-		_ = 1<<1075 /* ERROR "stupid shift" */
-		_ = 2.0<<1
-
-		_ int = 2<<s
-		_ float32 = 2<<s
-		_ complex64 = 2<<s
-
-		_ int = 2.0<<s
-		_ float32 = 2.0<<s
-		_ complex64 = 2.0<<s
-
-		_ int = 'a'<<s
-		_ float32 = 'a'<<s
-		_ complex64 = 'a'<<s
-	)
-}
-
-func shifts1() {
-	// basic non-constant shifts
-	var (
-		i int
-		u uint
-
-		_ = 1<<0
-		_ = 1<<i /* ERROR "must be unsigned" */
-		_ = 1<<u
-		_ = 1<<"foo" /* ERROR "cannot convert" */
-		_ = i<<0
-		_ = i<<- /* ERROR "must not be negative" */ 1
-		_ = 1 /* ERROR "overflows" */ <<100
-
-		_ uint = 1 << 0
-		_ uint = 1 << u
-		_ float32 = 1 /* ERROR "must be integer" */ << u
-	)
-}
-
-func shifts2() {
-	// from the spec
-	var (
-		s uint = 33
-		i = 1<<s           // 1 has type int
-		j int32 = 1<<s     // 1 has type int32; j == 0
-		k = uint64(1<<s)   // 1 has type uint64; k == 1<<33
-		m int = 1.0<<s     // 1.0 has type int
-		n = 1.0<<s != i    // 1.0 has type int; n == false if ints are 32bits in size
-		o = 1<<s == 2<<s   // 1 and 2 have type int; o == true if ints are 32bits in size
-		p = 1<<s == 1<<33  // illegal if ints are 32bits in size: 1 has type int, but 1<<33 overflows int
-		u = 1.0 /* ERROR "must be integer" */ <<s         // illegal: 1.0 has type float64, cannot shift
-		u1 = 1.0 /* ERROR "must be integer" */ <<s != 0   // illegal: 1.0 has type float64, cannot shift
-		u2 = 1 /* ERROR "must be integer" */ <<s != 1.0   // illegal: 1 has type float64, cannot shift
-		v float32 = 1 /* ERROR "must be integer" */ <<s   // illegal: 1 has type float32, cannot shift
-		w int64 = 1.0<<33  // 1.0<<33 is a constant shift expression
-	)
-	_, _, _, _, _, _, _, _, _, _, _, _ = i, j, k, m, n, o, p, u, u1, u2, v, w
-}
-
-func shifts3(a int16, b float32) {
-	// random tests
-	var (
-		s uint = 11
-		u = 1 /* ERROR "must be integer" */ <<s + 1.0
-		v complex128 = 1 /* ERROR "must be integer" */ << s + 1.0 /* ERROR "must be integer" */ << s + 1
-	)
-	x := 1.0 /* ERROR "must be integer" */ <<s + 1
-	shifts3(1.0 << s, 1 /* ERROR "must be integer" */ >> s)
-	_, _, _ = u, v, x
-}
-
-func shifts4() {
-	// shifts in comparisons w/ untyped operands
-	var s uint
-
-	_ = 1<<s == 1
-	_ = 1 /* ERROR "integer" */ <<s == 1.
-	_ = 1. /* ERROR "integer" */ <<s == 1
-	_ = 1. /* ERROR "integer" */ <<s == 1.
-
-	_ = 1<<s + 1 == 1
-	_ = 1 /* ERROR "integer" */ <<s + 1 == 1.
-	_ = 1 /* ERROR "integer" */ <<s + 1. == 1
-	_ = 1 /* ERROR "integer" */ <<s + 1. == 1.
-	_ = 1. /* ERROR "integer" */ <<s + 1 == 1
-	_ = 1. /* ERROR "integer" */ <<s + 1 == 1.
-	_ = 1. /* ERROR "integer" */ <<s + 1. == 1
-	_ = 1. /* ERROR "integer" */ <<s + 1. == 1.
-
-	_ = 1<<s == 1<<s
-	_ = 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s
-	_ = 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s
-	_ = 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s
-
-	_ = 1<<s + 1<<s == 1
-	_ = 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1.
-	_ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1
-	_ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1.
-	_ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1
-	_ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1.
-	_ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1
-	_ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1.
-
-	_ = 1<<s + 1<<s == 1<<s + 1<<s
-	_ = 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
-	_ = 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
-	_ = 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
-	_ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
-	_ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
-	_ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
-	_ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
-	_ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
-	_ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
-	_ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
-	_ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
-	_ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
-	_ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
-	_ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
-	_ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
-}
-
-func shifts5() {
-	// shifts in comparisons w/ typed operands
-	var s uint
-	var x int
-
-	_ = 1<<s == x
-	_ = 1.<<s == x
-	_ = 1.1 /* ERROR "int" */ <<s == x
-
-	_ = 1<<s + x == 1
-	_ = 1<<s + x == 1.
-	_ = 1<<s + x == 1.1 /* ERROR "int" */
-	_ = 1.<<s + x == 1
-	_ = 1.<<s + x == 1.
-	_ = 1.<<s + x == 1.1 /* ERROR "int" */
-	_ = 1.1 /* ERROR "int" */ <<s + x == 1
-	_ = 1.1 /* ERROR "int" */ <<s + x == 1.
-	_ = 1.1 /* ERROR "int" */ <<s + x == 1.1
-
-	_ = 1<<s == x<<s
-	_ = 1.<<s == x<<s
-	_ = 1.1  /* ERROR "int" */ <<s == x<<s
-}
-
-func shifts6() {
-	// shifts as operands in non-arithmetic operations and as arguments
-	var a [10]int
-	var s uint
-
-	_ = a[1<<s]
-	_ = a[1.0]
-	_ = a[1.0<<s]
-
-	_ = make([]int, 1.0)
-	_ = make([]int, 1.0<<s)
-	_ = make([]int, 1.1 /* ERROR "must be integer" */ <<s)
-
-	_ = float32(1)
-	_ = float32(1 /* ERROR "must be integer" */ <<s)
-	_ = float32(1.0)
-	_ = float32(1.0 /* ERROR "must be integer" */ <<s)
-	_ = float32(1.1 /* ERROR "must be integer" */ <<s)
-
-	var b []int
-	_ = append(b, 1<<s)
-	_ = append(b, 1.0<<s)
-	_ = append(b, 1.1 /* ERROR "must be integer" */ <<s)
-
-	_ = append(b, 1<<s)
-	_ = append(b, 1.0<<s) // should fail - see TODO in append code
-	_ = append(b, 1.1 /* ERROR "must be integer" */ <<s)
-
-	_ = complex(1.0 /* ERROR "must be integer" */ <<s, 0)
-	_ = complex(1.1 /* ERROR "must be integer" */ <<s, 0)
-	_ = complex(0, 1.0 /* ERROR "must be integer" */ <<s)
-	_ = complex(0, 1.1 /* ERROR "must be integer" */ <<s)
-
-	// TODO(gri) The delete below is not type-checked correctly yet.
-	// var m1 map[int]string
-	// delete(m1, 1<<s)
-}
-
-func shifts7() {
-	// shifts of shifts
-	var s uint
-	var x int
-	_ = x
-
-	_ = 1<<(1<<s)
-	_ = 1<<(1.<<s)
-	_ = 1. /* ERROR "integer" */ <<(1<<s)
-	_ = 1. /* ERROR "integer" */ <<(1.<<s)
-
-	x = 1<<(1<<s)
-	x = 1<<(1.<<s)
-	x = 1.<<(1<<s)
-	x = 1.<<(1.<<s)
-
-	_ = (1<<s)<<(1<<s)
-	_ = (1<<s)<<(1.<<s)
-	_ = ( /* ERROR "integer" */ 1.<<s)<<(1<<s)
-	_ = ( /* ERROR "integer" */ 1.<<s)<<(1.<<s)
-
-	x = (1<<s)<<(1<<s)
-	x = (1<<s)<<(1.<<s)
-	x = ( /* ERROR "integer" */ 1.<<s)<<(1<<s)
-	x = ( /* ERROR "integer" */ 1.<<s)<<(1.<<s)
-}
-
-func shifts8() {
-	// shift examples from shift discussion: better error messages
-	var s uint
-	_ = 1.0 /* ERROR "shifted operand 1.0 \(type float64\) must be integer" */ <<s == 1
-	_ = 1.0 /* ERROR "shifted operand 1.0 \(type float64\) must be integer" */ <<s == 1.0
-	_ = 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s == 1.0
-	_ = 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s + 1.0 == 1
-	_ = 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s + 1.1 == 1
-	_ = 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s + 1 == 1.0
-
-	// additional cases
-	_ = complex(1.0 /* ERROR "shifted operand 1.0 \(type float64\) must be integer" */ <<s, 1)
-	_ = complex(1.0, 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s)
-
-	_ = int(1.<<s)
-	_ = int(1.1 /* ERROR "shifted operand .* must be integer" */ <<s)
-	_ = float32(1 /* ERROR "shifted operand .* must be integer" */ <<s)
-	_ = float32(1. /* ERROR "shifted operand .* must be integer" */ <<s)
-	_ = float32(1.1 /* ERROR "shifted operand .* must be integer" */ <<s)
-	// TODO(gri) the error messages for these two are incorrect - disabled for now
-	// _ = complex64(1<<s)
-	// _ = complex64(1.<<s)
-	_ = complex64(1.1 /* ERROR "shifted operand .* must be integer" */ <<s)
-}
-
-func shifts9() {
-	// various originally failing snippets of code from the std library
-	// from src/compress/lzw/reader.go:90
-	{
-		var d struct {
-			bits     uint32
-			width    uint
-		}
-		_ = uint16(d.bits & (1<<d.width - 1))
-	}
-
-	// from src/debug/dwarf/buf.go:116
-	{
-		var ux uint64
-		var bits uint
-		x := int64(ux)
-		if x&(1<<(bits-1)) != 0 {}
-	}
-
-	// from src/encoding/asn1/asn1.go:160
-	{
-		var bytes []byte
-		if bytes[len(bytes)-1]&((1<<bytes[0])-1) != 0 {}
-	}
-
-	// from src/math/big/rat.go:140
-	{
-		var exp int
-		var mantissa uint64
-		shift := uint64(-1022 - (exp - 1)) // [1..53)
-		_ = mantissa & (1<<shift - 1)
-	}
-
-	// from src/net/interface.go:51
-	{
-		type Flags uint
-		var f Flags
-		var i int
-		if f&(1<<uint(i)) != 0 {}
-	}
-
-	// from src/runtime/softfloat64.go:234
-	{
-		var gm uint64
-		var shift uint
-		_ = gm & (1<<shift - 1)
-	}
-
-	// from src/strconv/atof.go:326
-	{
-		var mant uint64
-		var mantbits uint
-		if mant == 2<<mantbits {}
-	}
-
-	// from src/route_bsd.go:82
-	{
-		var Addrs int32
-		const rtaRtMask = 1
-		var i uint
-		if Addrs&rtaRtMask&(1<<i) == 0 {}
-	}
-
-	// from src/text/scanner/scanner.go:540
-	{
-		var s struct { Whitespace uint64 }
-		var ch rune
-		for s.Whitespace&(1<<uint(ch)) != 0 {}
-	}
-}
-
-func issue5895() {
-	var x = 'a' << 1 // type of x must be rune
-	var _ rune = x
-}
diff --git a/third_party/gotools/go/types/testdata/stmt0.src b/third_party/gotools/go/types/testdata/stmt0.src
deleted file mode 100644
index fd1ddba..0000000
--- a/third_party/gotools/go/types/testdata/stmt0.src
+++ /dev/null
@@ -1,833 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// statements
-
-package stmt0
-
-func assignments0() (int, int) {
-	var a, b, c int
-	var ch chan int
-	f0 := func() {}
-	f1 := func() int { return 1 }
-	f2 := func() (int, int) { return 1, 2 }
-	f3 := func() (int, int, int) { return 1, 2, 3 }
-
-	a, b, c = 1, 2, 3
-	a, b, c = 1 /* ERROR "assignment count mismatch" */ , 2
-	a, b, c = 1 /* ERROR "assignment count mismatch" */ , 2, 3, 4
-	_, _, _ = a, b, c
-
-	a = f0 /* ERROR "used as value" */ ()
-	a = f1()
-	a = f2 /* ERROR "assignment count mismatch" */ ()
-	a, b = f2()
-	a, b, c = f2 /* ERROR "assignment count mismatch" */ ()
-	a, b, c = f3()
-	a, b = f3 /* ERROR "assignment count mismatch" */ ()
-
-	a, b, c = <- /* ERROR "assignment count mismatch" */ ch
-
-	return /* ERROR "wrong number of return values" */
-	return /* ERROR "wrong number of return values" */ 1
-	return 1, 2
-	return /* ERROR "wrong number of return values" */ 1, 2, 3
-}
-
-func assignments1() {
-	b, i, f, c, s := false, 1, 1.0, 1i, "foo"
-	b = i /* ERROR "cannot assign" */
-	i = f /* ERROR "cannot assign" */
-	f = c /* ERROR "cannot assign" */
-	c = s /* ERROR "cannot assign" */
-	s = b /* ERROR "cannot assign" */
-
-	v0, v1, v2 := 1 /* ERROR "mismatch" */ , 2, 3, 4
-	_, _, _ = v0, v1, v2
-
-	b = true
-
-	i += 1
-	i += "foo" /* ERROR "cannot convert.*int" */
-
-	f -= 1
-	f /= 0
-	f = float32(0)/0 /* ERROR "division by zero" */
-	f -= "foo" /* ERROR "cannot convert.*float64" */
-
-	c *= 1
-	c /= 0
-
-	s += "bar"
-	s += 1 /* ERROR "cannot convert.*string" */
-
-	var u64 uint64
-	u64 += 1<<u64
-
-	undeclared /* ERROR "undeclared" */ = 991
-
-	// test cases for issue 5800
-	var (
-		_ int = nil /* ERROR "untyped nil value" */
-		_ [10]int = nil /* ERROR "untyped nil value" */
-		_ []byte = nil
-		_ struct{} = nil /* ERROR "untyped nil value" */
-		_ func() = nil
-		_ map[int]string = nil
-		_ chan int = nil
-	)
-
-	// test cases for issue 5500
-	_ = func() (int, bool) {
-		var m map[int]int
-		return /* ERROR "wrong number of return values" */ m[0]
-	}
-
-	g := func(int, bool){}
-	var m map[int]int
-	g(m[0]) /* ERROR "too few arguments" */
-
-	// assignments to _
-	_ = nil /* ERROR "use of untyped nil" */
-	_ = 1 /* ERROR overflow */ <<1000
-	(_) = 0
-}
-
-func assignments2() {
-	type mybool bool
-	var m map[string][]bool
-	var s []bool
-	var b bool
-	var d mybool
-	_ = s
-	_ = b
-	_ = d
-
-	// assignments to map index expressions are ok
-	s, b = m["foo"]
-	_, d = m["bar"]
-	m["foo"] = nil
-	m["foo"] = nil /* ERROR assignment count mismatch */ , false
-	_ = append(m["foo"])
-	_ = append(m["foo"], true)
-
-	var c chan int
-	_, b = <-c
-	_, d = <-c
-	<- /* ERROR cannot assign */ c = 0
-	<-c = 0 /* ERROR assignment count mismatch */ , false
-
-	var x interface{}
-	_, b = x.(int)
-	x /* ERROR cannot assign */ .(int) = 0
-	x.(int) = 0 /* ERROR assignment count mismatch */ , false
-
-	assignments2 /* ERROR used as value */ () = nil
-	int /* ERROR not an expression */ = 0
-}
-
-func issue6487() {
-	type S struct{x int}
-	_ = &S /* ERROR "cannot take address" */ {}.x
-	_ = &( /* ERROR "cannot take address" */ S{}.x)
-	_ = (&S{}).x
-	S /* ERROR "cannot assign" */ {}.x = 0
-	(&S{}).x = 0
-
-	type M map[string]S
-	var m M
-	m /* ERROR "cannot assign" */ ["foo"].x = 0
-	_ = &( /* ERROR "cannot take address" */ m["foo"].x)
-	_ = &m /* ERROR "cannot take address" */ ["foo"].x
-}
-
-func issue6766a() {
-	a, a /* ERROR redeclared */ := 1, 2
-	_ = a
-	a, b, b /* ERROR redeclared */ := 1, 2, 3
-	_ = b
-	c, c /* ERROR redeclared */, b := 1, 2, 3
-	_ = c
-	a, b := /* ERROR no new variables */ 1, 2
-}
-
-func shortVarDecls1() {
-	const c = 0
-	type d int
-	a, b, c /* ERROR "cannot assign" */ , d /* ERROR "cannot assign" */  := 1, "zwei", 3.0, 4
-	var _ int = a // a is of type int
-	var _ string = b // b is of type string
-}
-
-func incdecs() {
-	const c = 3.14
-	c /* ERROR "cannot assign" */ ++
-	s := "foo"
-	s /* ERROR "cannot convert" */ --
-	3.14 /* ERROR "cannot assign" */ ++
-	var (
-		x int
-		y float32
-		z complex128
-	)
-	x++
-	y--
-	z++
-}
-
-func sends() {
-	var ch chan int
-	var rch <-chan int
-	var x int
-	x /* ERROR "cannot send" */ <- x
-	rch /* ERROR "cannot send" */ <- x
-	ch <- "foo" /* ERROR "cannot convert" */
-	ch <- x
-}
-
-func selects() {
-	select {}
-	var (
-		ch chan int
-		sc chan <- bool
-	)
-	select {
-	case <-ch:
-	case (<-ch):
-	case t := <-ch:
-		_ = t
-	case t := (<-ch):
-		_ = t
-	case t, ok := <-ch:
-		_, _ = t, ok
-	case t, ok := (<-ch):
-		_, _ = t, ok
-	case <-sc /* ERROR "cannot receive from send-only channel" */ :
-	}
-	select {
-	default:
-	default /* ERROR "multiple defaults" */ :
-	}
-	select {
-	case a, b := <-ch:
-		_, b = a, b
-	case x /* ERROR send or receive */ :
-	case a /* ERROR send or receive */ := ch:
-	}
-
-	// test for issue 9570: ch2 in second case falsely resolved to
-	// ch2 declared in body of first case
-	ch1 := make(chan int)
-	ch2 := make(chan int)
-	select {
-	case <-ch1:
-		var ch2 /* ERROR ch2 declared but not used */ chan bool
-	case i := <-ch2:
-		print(i + 1)
-	}
-}
-
-func gos() {
-	go 1 /* ERROR HERE "function must be invoked" */
-	go int /* ERROR "go requires function call, not conversion" */ (0)
-	go gos()
-	var c chan int
-	go close(c)
-	go len /* ERROR "go discards result" */ (c)
-}
-
-func defers() {
-	defer 1 /* ERROR HERE "function must be invoked" */
-	defer int /* ERROR "defer requires function call, not conversion" */ (0)
-	defer defers()
-	var c chan int
-	defer close(c)
-	defer len /* ERROR "defer discards result" */ (c)
-}
-
-func breaks() {
-	var x, y int
-
-	break /* ERROR "break" */
-	{
-		break /* ERROR "break" */
-	}
-	if x < y {
-		break /* ERROR "break" */
-	}
-
-	switch x {
-	case 0:
-		break
-	case 1:
-		if x == y {
-			break
-		}
-	default:
-		break
-		break
-	}
-
-	var z interface{}
-	switch z.(type) {
-	case int:
-		break
-	}
-
-	for {
-		break
-	}
-
-	var a []int
-	for _ = range a {
-		break
-	}
-
-	for {
-		if x == y {
-			break
-		}
-	}
-
-	var ch chan int
-	select {
-	case <-ch:
-		break
-	}
-
-	select {
-	case <-ch:
-		if x == y {
-			break
-		}
-	default:
-		break
-	}
-}
-
-func continues() {
-	var x, y int
-
-	continue /* ERROR "continue" */
-	{
-		continue /* ERROR "continue" */
-	}
-
-	if x < y {
-		continue /* ERROR "continue" */
-	}
-
-	switch x {
-	case 0:
-		continue /* ERROR "continue" */
-	}
-
-	var z interface{}
-	switch z.(type) {
-	case int:
-		continue /* ERROR "continue" */
-	}
-
-	var ch chan int
-	select {
-	case <-ch:
-		continue /* ERROR "continue" */
-	}
-
-	for i := 0; i < 10; i++ {
-		continue
-		if x < y {
-			continue
-			break
-		}
-		switch x {
-		case y:
-			continue
-		default:
-			break
-		}
-		select {
-		case <-ch:
-			continue
-		}
-	}
-
-	var a []int
-	for _ = range a {
-		continue
-		if x < y {
-			continue
-			break
-		}
-		switch x {
-		case y:
-			continue
-		default:
-			break
-		}
-		select {
-		case <-ch:
-			continue
-		}
-	}
-}
-
-func returns0() {
-	return
-	return 0 /* ERROR no result values expected */
-}
-
-func returns1(x float64) (int, *float64) {
-	return 0, &x
-	return /* ERROR wrong number of return values */
-	return "foo" /* ERROR "cannot convert" */, x /* ERROR "cannot return" */
-	return /* ERROR wrong number of return values */ 0, &x, 1
-}
-
-func returns2() (a, b int) {
-	return
-	return 1, "foo" /* ERROR cannot convert */
-	return /* ERROR wrong number of return values */ 1, 2, 3
-	{
-		type a int
-		return 1, 2
-		return /* ERROR a not in scope at return */
-	}
-}
-
-func returns3() (_ int) {
-	return
-	{
-		var _ int // blank (_) identifiers never shadow since they are in no scope
-		return
-	}
-}
-
-func switches0() {
-	var x int
-
-	switch x {
-	}
-
-	switch x {
-	default:
-	default /* ERROR "multiple defaults" */ :
-	}
-
-	switch {
-	case 1  /* ERROR "cannot convert" */ :
-	}
-
-	true := "false"
-	_ = true
-	// A tagless switch is equivalent to the bool 
-        // constant true, not the identifier 'true'.
-	switch {
-	case "false" /* ERROR "cannot convert" */:
-	}
-
-	switch int32(x) {
-	case 1, 2:
-	case x /* ERROR "cannot compare" */ :
-	}
-
-	switch x {
-	case 1 /* ERROR "overflows" */ << 100:
-	}
-
-	switch x {
-	case 1:
-	case 1 /* DISABLED "duplicate case" */ :
-	case 2, 3, 4:
-	case 1 /* DISABLED "duplicate case" */ :
-	}
-
-	switch uint64(x) {
-	case 1 /* DISABLED duplicate case */ <<64-1:
-	case 1 /* DISABLED duplicate case */ <<64-1:
-	}
-}
-
-func switches1() {
-	fallthrough /* ERROR "fallthrough statement out of place" */
-
-	var x int
-	switch x {
-	case 0:
-		fallthrough /* ERROR "fallthrough statement out of place" */
-		break
-	case 1:
-		fallthrough
-	case 2:
-	default:
-		fallthrough
-	case 3:
-		fallthrough /* ERROR "fallthrough statement out of place" */
-	}
-
-	var y interface{}
-	switch y.(type) {
-	case int:
-		fallthrough /* ERROR "fallthrough statement out of place" */
-	default:
-	}
-
-	switch x {
-	case 0:
-		if x == 0 {
-			fallthrough /* ERROR "fallthrough statement out of place" */
-		}
-	}
-
-	switch x {
-	case 0:
-		goto L1
-		L1: fallthrough
-	case 1:
-		goto L2
-		goto L3
-		goto L4
-		L2: L3: L4: fallthrough
-	default:
-	}
-
-	switch x {
-	case 0:
-		goto L5
-		L5: fallthrough
-	default:
-		goto L6
-		goto L7
-		goto L8
-		L6: L7: L8: fallthrough /* ERROR "fallthrough statement out of place" */
-	}
-
-	switch x {
-	case 0:
-		{
-			fallthrough /* ERROR "fallthrough statement out of place" */
-		}
-	default:
-	}
-}
-
-type I interface {
-	m()
-}
-
-type I2 interface {
-	m(int)
-}
-
-type T struct{}
-type T1 struct{}
-type T2 struct{}
-
-func (T) m() {}
-func (T2) m(int) {}
-
-func typeswitches() {
-	var i int
-	var x interface{}
-
-	switch x.(type) {}
-	switch (x /* ERROR "outside type switch" */ .(type)) {}
-
-	switch x.(type) {
-	default:
-	default /* ERROR "multiple defaults" */ :
-	}
-
-	switch x /* ERROR "declared but not used" */ := x.(type) {}
-	switch _ /* ERROR "no new variable on left side of :=" */ := x.(type) {}
-
-	switch x := x.(type) {
-	case int:
-		var y int = x
-		_ = y
-	}
-
-	switch x := i /* ERROR "not an interface" */ .(type) {}
-
-	switch t := x.(type) {
-	case nil:
-		var v bool = t /* ERROR "cannot initialize" */
-		_ = v
-	case int:
-		var v int = t
-		_ = v
-	case float32, complex64:
-		var v float32 = t /* ERROR "cannot initialize" */
-		_ = v
-	default:
-		var v float32 = t /* ERROR "cannot initialize" */
-		_ = v
-	}
-
-	var t I
-	switch t.(type) {
-	case T:
-	case T1 /* ERROR "missing method m" */ :
-	case T2 /* ERROR "wrong type for method m" */ :
-	case I2 /* STRICT "wrong type for method m" */ : // only an error in strict mode (issue 8561)
-	}
-}
-
-// Test that each case clause uses the correct type of the variable
-// declared by the type switch (issue 5504).
-func typeswitch0() {
-	switch y := interface{}(nil).(type) {
-	case int:
-		func() int { return y + 0 }()
-	case float32:
-		func() float32 { return y }()
-	}
-}
-
-// Test correct scope setup.
-// (no redeclaration errors expected in the type switch)
-func typeswitch1() {
-	var t I
-	switch t := t; t := t.(type) {
-	case nil:
-		var _ I = t
-	case T:
-		var _ T = t
-	default:
-		var _ I = t
-	}
-}
-
-// Test correct typeswitch against interface types.
-type A interface { a() }
-type B interface { b() }
-type C interface { a(int) }
-
-func typeswitch2() {
-	switch A(nil).(type) {
-	case A:
-	case B:
-	case C /* STRICT "cannot have dynamic type" */: // only an error in strict mode (issue 8561)
-	}
-}
-
-func typeswitch3(x interface{}) {
-	switch x.(type) {
-	case int:
-	case float64:
-	case int /* ERROR duplicate case */ :
-	}
-
-	switch x.(type) {
-	case nil:
-	case int:
-	case nil /* ERROR duplicate case */ , nil /* ERROR duplicate case */ :
-	}
-
-	type F func(int)
-	switch x.(type) {
-	case nil:
-	case int, func(int):
-	case float32, func /* ERROR duplicate case */ (x int):
-	case F:
-	}
-}
-
-func fors1() {
-	for {}
-	var i string
-	_ = i
-	for i := 0; i < 10; i++ {}
-	for i := 0; i < 10; j /* ERROR cannot declare */ := 0 {}
-}
-
-func rangeloops1() {
-	var (
-		x int
-		a [10]float32
-		b []string
-		p *[10]complex128
-		pp **[10]complex128
-		s string
-		m map[int]bool
-		c chan int
-		sc chan<- int
-		rc <-chan int
-	)
-
-	for range x /* ERROR "cannot range over" */ {}
-	for _ = range x /* ERROR "cannot range over" */ {}
-	for i := range x /* ERROR "cannot range over" */ {}
-
-	for range a {}
-	for i := range a {
-		var ii int
-		ii = i
-		_ = ii
-	}
-	for i, x := range a {
-		var ii int
-		ii = i
-		_ = ii
-		var xx float64
-		xx = x /* ERROR "cannot assign" */
-		_ = xx
-	}
-	var ii int
-	var xx float32
-	for ii, xx = range a {}
-	_, _ = ii, xx
-
-	for range b {}
-	for i := range b {
-		var ii int
-		ii = i
-		_ = ii
-	}
-	for i, x := range b {
-		var ii int
-		ii = i
-		_ = ii
-		var xx string
-		xx = x
-		_ = xx
-	}
-
-	for range s {}
-	for i := range s {
-		var ii int
-		ii = i
-		_ = ii
-	}
-	for i, x := range s {
-		var ii int
-		ii = i
-		_ = ii
-		var xx rune
-		xx = x
-		_ = xx
-	}
-
-	for range p {}
-	for _, x := range p {
-		var xx complex128
-		xx = x
-		_ = xx
-	}
-
-	for range pp /* ERROR "cannot range over" */ {}
-	for _, x := range pp /* ERROR "cannot range over" */ {}
-
-	for range m {}
-	for k := range m {
-		var kk int32
-		kk = k /* ERROR "cannot assign" */
-		_ = kk
-	}
-	for k, v := range m {
-		var kk int
-		kk = k
-		_ = kk
-		if v {}
-	}
-
-	for range c {}
-	for _, _ /* ERROR "only one iteration variable" */ = range c {}
-	for e := range c {
-		var ee int
-		ee = e
-		_ = ee
-	}
-	for _ = range sc /* ERROR "cannot range over send-only channel" */ {}
-	for _ = range rc {}
-
-	// constant strings
-	const cs = "foo"
-	for range cs {}
-	for range "" {}
-	for i, x := range cs { _, _ = i, x }
-	for i, x := range "" {
-		var ii int
-		ii = i
-		_ = ii
-		var xx rune
-		xx = x
-		_ = xx
-	}
-}
-
-func rangeloops2() {
-	type I int
-	type R rune
-
-	var a [10]int
-	var i I
-	_ = i
-	for i /* ERROR cannot assign */ = range a {}
-	for i /* ERROR cannot assign */ = range &a {}
-	for i /* ERROR cannot assign */ = range a[:] {}
-
-	var s string
-	var r R
-	_ = r
-	for i /* ERROR cannot assign */ = range s {}
-	for i /* ERROR cannot assign */ = range "foo" {}
-	for _, r /* ERROR cannot assign */ = range s {}
-	for _, r /* ERROR cannot assign */ = range "foo" {}
-}
-
-func issue6766b() {
-	for _ := /* ERROR no new variables */ range "" {}
-	for a, a /* ERROR redeclared */ := range "" { _ = a }
-	var a int
-	_ = a
-	for a, a /* ERROR redeclared */ := range []int{1, 2, 3} { _ = a }
-}
-
-// Test that despite errors in the range clause,
-// the loop body is still type-checked (and thus
-// errors reported).
-func issue10148() {
-	for y /* ERROR declared but not used */ := range "" {
-		_ = "" /* ERROR cannot convert */ + 1
-	}
-	for range 1 /* ERROR cannot range over 1 */ {
-		_ = "" /* ERROR cannot convert */ + 1
-	}
-	for y := range 1 /* ERROR cannot range over 1 */ {
-		_ = "" /* ERROR cannot convert */ + 1
-	}
-}
-
-func labels0() {
-	goto L0
-	goto L1
-	L0:
-	L1:
-	L1 /* ERROR "already declared" */ :
-	if true {
-		goto L2		
-		L2:
-		L0 /* ERROR "already declared" */ :
-	}
-	_ = func() {
-		goto L0
-		goto L1
-		goto L2
-		L0:
-		L1:
-		L2:
-	}
-}
-
-func expression_statements(ch chan int) {
-	expression_statements(ch)
-	<-ch
-	println()
-
-	0 /* ERROR "not used" */
-	1 /* ERROR "not used" */ +2
-	cap /* ERROR "not used" */ (ch)
-	println /* ERROR "must be called" */
-}
diff --git a/third_party/gotools/go/types/testdata/stmt1.src b/third_party/gotools/go/types/testdata/stmt1.src
deleted file mode 100644
index a2955e6..0000000
--- a/third_party/gotools/go/types/testdata/stmt1.src
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// terminating statements
-
-package stmt1
-
-func _() {}
-
-func _() int {} /* ERROR "missing return" */
-
-func _() int { panic(0) }
-func _() int { (panic(0)) }
-
-// block statements
-func _(x, y int) (z int) {
-	{
-		return
-	}
-}
-
-func _(x, y int) (z int) {
-	{
-	}
-} /* ERROR "missing return" */
-
-// if statements
-func _(x, y int) (z int) {
-	if x < y { return }
-	return 1
-}
-
-func _(x, y int) (z int) {
-	if x < y { return }
-} /* ERROR "missing return" */
-
-func _(x, y int) (z int) {
-	if x < y {
-	} else { return 1
-	}
-} /* ERROR "missing return" */
-
-func _(x, y int) (z int) {
-	if x < y { return
-	} else { return
-	}
-}
-
-// for statements
-func _(x, y int) (z int) {
-	for x < y {
-		return
-	}
-} /* ERROR "missing return" */
-
-func _(x, y int) (z int) {
-	for {
-		return
-	}
-}
-
-func _(x, y int) (z int) {
-	for {
-		return
-		break
-	}
-} /* ERROR "missing return" */
-
-func _(x, y int) (z int) {
-	for {
-		for { break }
-		return
-	}
-}
-
-func _(x, y int) (z int) {
-L:	for {
-		for { break L }
-		return
-	}
-} /* ERROR "missing return" */
-
-// switch statements
-func _(x, y int) (z int) {
-	switch x {
-	case 0: return
-	default: return
-	}
-}
-
-func _(x, y int) (z int) {
-	switch x {
-	case 0: return
-	}
-} /* ERROR "missing return" */
-
-func _(x, y int) (z int) {
-	switch x {
-	case 0: return
-	case 1: break
-	}
-} /* ERROR "missing return" */
-
-func _(x, y int) (z int) {
-	switch x {
-	case 0: return
-	default:
-		switch y {
-		case 0: break
-		}
-		panic(0)
-	}
-}
-
-func _(x, y int) (z int) {
-L:	switch x {
-	case 0: return
-	default:
-		switch y {
-		case 0: break L
-		}
-		panic(0)
-	}
-} /* ERROR "missing return" */
-
-// select statements
-func _(ch chan int) (z int) {
-	select {}
-} // nice!
-
-func _(ch chan int) (z int) {
-	select {
-	default: break
-	}
-} /* ERROR "missing return" */
-
-func _(ch chan int) (z int) {
-	select {
-	case <-ch: return
-	default: break
-	}
-} /* ERROR "missing return" */
-
-func _(ch chan int) (z int) {
-	select {
-	case <-ch: return
-	default:
-		for i := 0; i < 10; i++ {
-			break
-		}
-		return
-	}
-}
-
-func _(ch chan int) (z int) {
-L:	select {
-	case <-ch: return
-	default:
-		for i := 0; i < 10; i++ {
-			break L
-		}
-		return
-	}
-} /* ERROR "missing return" */
diff --git a/third_party/gotools/go/types/testdata/vardecl.src b/third_party/gotools/go/types/testdata/vardecl.src
deleted file mode 100644
index fb6b5f7..0000000
--- a/third_party/gotools/go/types/testdata/vardecl.src
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package vardecl
-
-// Prerequisites.
-import "math"
-func f() {}
-func g() (x, y int) { return }
-var m map[string]int
-
-// Var decls must have a type or an initializer.
-var _ int
-var _, _ int
-
-// The first error message is produced by the parser.
-// In a real-world scenario, the type-checker would not be run
-// in this case and the 2nd error message would not appear.
-var _ /* ERROR "missing variable type" */ /* ERROR "missing type or init expr" */
-var _ /* ERROR "missing variable type" */ /* ERROR "missing type or init expr" */, _
-var _ /* ERROR "missing variable type" */ /* ERROR "missing type or init expr" */, _, _
-
-// The initializer must be an expression.
-var _ = int /* ERROR "not an expression" */
-var _ = f /* ERROR "used as value" */ ()
-
-// Identifier and expression arity must match.
-var _, _ = 1, 2
-var _ = 1, 2 /* ERROR "extra init expr 2" */
-var _, _ = 1 /* ERROR "assignment count mismatch" */
-var _, _, _ /* ERROR "missing init expr for _" */ = 1, 2
-
-var _ = g /* ERROR "2-valued expr" */ ()
-var _, _ = g()
-var _, _, _ = g /* ERROR "assignment count mismatch" */ ()
-
-var _ = m["foo"]
-var _, _ = m["foo"]
-var _, _, _ = m  /* ERROR "assignment count mismatch" */ ["foo"]
-
-var _, _ int = 1, 2
-var _ int = 1, 2 /* ERROR "extra init expr 2" */
-var _, _ int = 1 /* ERROR "assignment count mismatch" */
-var _, _, _ /* ERROR "missing init expr for _" */ int = 1, 2
-
-var (
-	_, _ = 1, 2
-	_ = 1, 2 /* ERROR "extra init expr 2" */
-	_, _ = 1 /* ERROR "assignment count mismatch" */
-	_, _, _ /* ERROR "missing init expr for _" */ = 1, 2
-
-	_ = g /* ERROR "2-valued expr" */ ()
-	_, _ = g()
-	_, _, _ = g /* ERROR "assignment count mismatch" */ ()
-
-	_ = m["foo"]
-	_, _ = m["foo"]
-	_, _, _ = m /* ERROR "assignment count mismatch" */ ["foo"]
-
-	_, _ int = 1, 2
-	_ int = 1, 2 /* ERROR "extra init expr 2" */
-	_, _ int = 1 /* ERROR "assignment count mismatch" */
-	_, _, _ /* ERROR "missing init expr for _" */ int = 1, 2
-)
-
-// Variables declared in function bodies must be 'used'.
-type T struct{}
-func (r T) _(a, b, c int) (u, v, w int) {
-	var x1 /* ERROR "declared but not used" */ int
-	var x2 /* ERROR "declared but not used" */ int
-	x1 = 1
-	(x2) = 2
-
-	y1 /* ERROR "declared but not used" */ := 1
-	y2 /* ERROR "declared but not used" */ := 2
-	y1 = 1
-	(y1) = 2
-
-	{
-		var x1 /* ERROR "declared but not used" */ int
-		var x2 /* ERROR "declared but not used" */ int
-		x1 = 1
-		(x2) = 2
-
-		y1 /* ERROR "declared but not used" */ := 1
-		y2 /* ERROR "declared but not used" */ := 2
-		y1 = 1
-		(y1) = 2
-	}
-
-	if x /* ERROR "declared but not used" */ := 0; a < b {}
-
-	switch x /* ERROR "declared but not used" */, y := 0, 1; a {
-	case 0:
-		_ = y
-	case 1:
-		x /* ERROR "declared but not used" */ := 0
-	}
-
-	var t interface{}
-	switch t /* ERROR "declared but not used" */ := t.(type) {}
-
-	switch t /* ERROR "declared but not used" */ := t.(type) {
-	case int:
-	}
-
-	switch t /* ERROR "declared but not used" */ := t.(type) {
-	case int:
-	case float32, complex64:
-		t = nil
-	}
-
-	switch t := t.(type) {
-	case int:
-	case float32, complex64:
-		_ = t
-	}
-
-	switch t := t.(type) {
-	case int:
-	case float32:
-	case string:
-		_ = func() string {
-			return t
-		}
-	}
-
-	switch t := t; t /* ERROR "declared but not used" */ := t.(type) {}
-
-	var z1 /* ERROR "declared but not used" */ int
-	var z2 int
-	_ = func(a, b, c int) (u, v, w int) {
-		z1 = a
-		(z1) = b
-		a = z2
-		return
-	}
-
-	var s []int
-	var i /* ERROR "declared but not used" */ , j int
-	for i, j = range s {
-		_ = j
-	}
-
-	for i, j /* ERROR "declared but not used" */ := range s {
-		_ = func() int {
-			return i
-		}
-	}
-	return
-}
-
-// Invalid (unused) expressions must not lead to spurious "declared but not used errors"
-func _() {
-	var a, b, c int
-	var x, y int
-	x, y = a /* ERROR assignment count mismatch */ , b, c
-	_ = x
-	_ = y
-}
-
-func _() {
-	var x int
-	return x /* ERROR no result values expected */
-	return math /* ERROR no result values expected */ .Sin(0)
-}
-
-func _() int {
-	var x, y int
-	return /* ERROR wrong number of return values */ x, y
-}
-
-// Short variable declarations must declare at least one new non-blank variable.
-func _() {
-	_ := /* ERROR no new variables */ 0
-	_, a := 0, 1
-	_, a := /* ERROR no new variables */ 0, 1
-	_, a, b := 0, 1, 2
-	_, _, _ := /* ERROR no new variables */ 0, 1, 2
-
-	_ = a
-	_ = b
-}
-
-// TODO(gri) consolidate other var decl checks in this file
\ No newline at end of file
diff --git a/third_party/gotools/go/types/token_test.go b/third_party/gotools/go/types/token_test.go
deleted file mode 100644
index 705bb29..0000000
--- a/third_party/gotools/go/types/token_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file checks invariants of token.Token ordering that we rely on
-// since package go/token doesn't provide any guarantees at the moment.
-
-package types
-
-import (
-	"go/token"
-	"testing"
-)
-
-var assignOps = map[token.Token]token.Token{
-	token.ADD_ASSIGN:     token.ADD,
-	token.SUB_ASSIGN:     token.SUB,
-	token.MUL_ASSIGN:     token.MUL,
-	token.QUO_ASSIGN:     token.QUO,
-	token.REM_ASSIGN:     token.REM,
-	token.AND_ASSIGN:     token.AND,
-	token.OR_ASSIGN:      token.OR,
-	token.XOR_ASSIGN:     token.XOR,
-	token.SHL_ASSIGN:     token.SHL,
-	token.SHR_ASSIGN:     token.SHR,
-	token.AND_NOT_ASSIGN: token.AND_NOT,
-}
-
-func TestZeroTok(t *testing.T) {
-	// zero value for token.Token must be token.ILLEGAL
-	var zero token.Token
-	if token.ILLEGAL != zero {
-		t.Errorf("%s == %d; want 0", token.ILLEGAL, zero)
-	}
-}
-
-func TestAssignOp(t *testing.T) {
-	// there are fewer than 256 tokens
-	for i := 0; i < 256; i++ {
-		tok := token.Token(i)
-		got := assignOp(tok)
-		want := assignOps[tok]
-		if got != want {
-			t.Errorf("for assignOp(%s): got %s; want %s", tok, got, want)
-		}
-	}
-}
diff --git a/third_party/gotools/go/types/type.go b/third_party/gotools/go/types/type.go
deleted file mode 100644
index 4b4e5f6..0000000
--- a/third_party/gotools/go/types/type.go
+++ /dev/null
@@ -1,452 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types
-
-import "sort"
-
-// TODO(gri) Revisit factory functions - make sure they have all relevant parameters.
-
-// A Type represents a type of Go.
-// All types implement the Type interface.
-type Type interface {
-	// Underlying returns the underlying type of a type.
-	Underlying() Type
-
-	// String returns a string representation of a type.
-	String() string
-}
-
-// BasicKind describes the kind of basic type.
-type BasicKind int
-
-const (
-	Invalid BasicKind = iota // type is invalid
-
-	// predeclared types
-	Bool
-	Int
-	Int8
-	Int16
-	Int32
-	Int64
-	Uint
-	Uint8
-	Uint16
-	Uint32
-	Uint64
-	Uintptr
-	Float32
-	Float64
-	Complex64
-	Complex128
-	String
-	UnsafePointer
-
-	// types for untyped values
-	UntypedBool
-	UntypedInt
-	UntypedRune
-	UntypedFloat
-	UntypedComplex
-	UntypedString
-	UntypedNil
-
-	// aliases
-	Byte = Uint8
-	Rune = Int32
-)
-
-// BasicInfo is a set of flags describing properties of a basic type.
-type BasicInfo int
-
-// Properties of basic types.
-const (
-	IsBoolean BasicInfo = 1 << iota
-	IsInteger
-	IsUnsigned
-	IsFloat
-	IsComplex
-	IsString
-	IsUntyped
-
-	IsOrdered   = IsInteger | IsFloat | IsString
-	IsNumeric   = IsInteger | IsFloat | IsComplex
-	IsConstType = IsBoolean | IsNumeric | IsString
-)
-
-// A Basic represents a basic type.
-type Basic struct {
-	kind BasicKind
-	info BasicInfo
-	name string
-}
-
-// Kind returns the kind of basic type b.
-func (b *Basic) Kind() BasicKind { return b.kind }
-
-// Info returns information about properties of basic type b.
-func (b *Basic) Info() BasicInfo { return b.info }
-
-// Name returns the name of basic type b.
-func (b *Basic) Name() string { return b.name }
-
-// An Array represents an array type.
-type Array struct {
-	len  int64
-	elem Type
-}
-
-// NewArray returns a new array type for the given element type and length.
-func NewArray(elem Type, len int64) *Array { return &Array{len, elem} }
-
-// Len returns the length of array a.
-func (a *Array) Len() int64 { return a.len }
-
-// Elem returns element type of array a.
-func (a *Array) Elem() Type { return a.elem }
-
-// A Slice represents a slice type.
-type Slice struct {
-	elem Type
-}
-
-// NewSlice returns a new slice type for the given element type.
-func NewSlice(elem Type) *Slice { return &Slice{elem} }
-
-// Elem returns the element type of slice s.
-func (s *Slice) Elem() Type { return s.elem }
-
-// A Struct represents a struct type.
-type Struct struct {
-	fields []*Var
-	tags   []string // field tags; nil if there are no tags
-	// TODO(gri) access to offsets is not threadsafe - fix this
-	offsets []int64 // field offsets in bytes, lazily initialized
-}
-
-// NewStruct returns a new struct with the given fields and corresponding field tags.
-// If a field with index i has a tag, tags[i] must be that tag, but len(tags) may be
-// only as long as required to hold the tag with the largest index i. Consequently,
-// if no field has a tag, tags may be nil.
-func NewStruct(fields []*Var, tags []string) *Struct {
-	var fset objset
-	for _, f := range fields {
-		if f.name != "_" && fset.insert(f) != nil {
-			panic("multiple fields with the same name")
-		}
-	}
-	if len(tags) > len(fields) {
-		panic("more tags than fields")
-	}
-	return &Struct{fields: fields, tags: tags}
-}
-
-// NumFields returns the number of fields in the struct (including blank and anonymous fields).
-func (s *Struct) NumFields() int { return len(s.fields) }
-
-// Field returns the i'th field for 0 <= i < NumFields().
-func (s *Struct) Field(i int) *Var { return s.fields[i] }
-
-// Tag returns the i'th field tag for 0 <= i < NumFields().
-func (s *Struct) Tag(i int) string {
-	if i < len(s.tags) {
-		return s.tags[i]
-	}
-	return ""
-}
-
-// A Pointer represents a pointer type.
-type Pointer struct {
-	base Type // element type
-}
-
-// NewPointer returns a new pointer type for the given element (base) type.
-func NewPointer(elem Type) *Pointer { return &Pointer{base: elem} }
-
-// Elem returns the element type for the given pointer p.
-func (p *Pointer) Elem() Type { return p.base }
-
-// A Tuple represents an ordered list of variables; a nil *Tuple is a valid (empty) tuple.
-// Tuples are used as components of signatures and to represent the type of multiple
-// assignments; they are not first class types of Go.
-type Tuple struct {
-	vars []*Var
-}
-
-// NewTuple returns a new tuple for the given variables.
-func NewTuple(x ...*Var) *Tuple {
-	if len(x) > 0 {
-		return &Tuple{x}
-	}
-	return nil
-}
-
-// Len returns the number variables of tuple t.
-func (t *Tuple) Len() int {
-	if t != nil {
-		return len(t.vars)
-	}
-	return 0
-}
-
-// At returns the i'th variable of tuple t.
-func (t *Tuple) At(i int) *Var { return t.vars[i] }
-
-// A Signature represents a (non-builtin) function or method type.
-type Signature struct {
-	scope    *Scope // function scope, always present
-	recv     *Var   // nil if not a method
-	params   *Tuple // (incoming) parameters from left to right; or nil
-	results  *Tuple // (outgoing) results from left to right; or nil
-	variadic bool   // true if the last parameter's type is of the form ...T (or string, for append built-in only)
-}
-
-// NewSignature returns a new function type for the given receiver, parameters,
-// and results, either of which may be nil. If variadic is set, the function
-// is variadic, it must have at least one parameter, and the last parameter
-// must be of unnamed slice type.
-func NewSignature(scope *Scope, recv *Var, params, results *Tuple, variadic bool) *Signature {
-	// TODO(gri) Should we rely on the correct (non-nil) incoming scope
-	//           or should this function allocate and populate a scope?
-	if variadic {
-		n := params.Len()
-		if n == 0 {
-			panic("types.NewSignature: variadic function must have at least one parameter")
-		}
-		if _, ok := params.At(n - 1).typ.(*Slice); !ok {
-			panic("types.NewSignature: variadic parameter must be of unnamed slice type")
-		}
-	}
-	return &Signature{scope, recv, params, results, variadic}
-}
-
-// Recv returns the receiver of signature s (if a method), or nil if a
-// function.
-//
-// For an abstract method, Recv returns the enclosing interface either
-// as a *Named or an *Interface.  Due to embedding, an interface may
-// contain methods whose receiver type is a different interface.
-func (s *Signature) Recv() *Var { return s.recv }
-
-// Params returns the parameters of signature s, or nil.
-func (s *Signature) Params() *Tuple { return s.params }
-
-// Results returns the results of signature s, or nil.
-func (s *Signature) Results() *Tuple { return s.results }
-
-// Variadic reports whether the signature s is variadic.
-func (s *Signature) Variadic() bool { return s.variadic }
-
-// An Interface represents an interface type.
-type Interface struct {
-	methods   []*Func  // ordered list of explicitly declared methods
-	embeddeds []*Named // ordered list of explicitly embedded types
-
-	allMethods []*Func // ordered list of methods declared with or embedded in this interface (TODO(gri): replace with mset)
-}
-
-// NewInterface returns a new interface for the given methods and embedded types.
-func NewInterface(methods []*Func, embeddeds []*Named) *Interface {
-	typ := new(Interface)
-
-	var mset objset
-	for _, m := range methods {
-		if mset.insert(m) != nil {
-			panic("multiple methods with the same name")
-		}
-		// set receiver
-		// TODO(gri) Ideally, we should use a named type here instead of
-		// typ, for less verbose printing of interface method signatures.
-		m.typ.(*Signature).recv = NewVar(m.pos, m.pkg, "", typ)
-	}
-	sort.Sort(byUniqueMethodName(methods))
-
-	if embeddeds == nil {
-		sort.Sort(byUniqueTypeName(embeddeds))
-	}
-
-	typ.methods = methods
-	typ.embeddeds = embeddeds
-	return typ
-}
-
-// NumExplicitMethods returns the number of explicitly declared methods of interface t.
-func (t *Interface) NumExplicitMethods() int { return len(t.methods) }
-
-// ExplicitMethod returns the i'th explicitly declared method of interface t for 0 <= i < t.NumExplicitMethods().
-// The methods are ordered by their unique Id.
-func (t *Interface) ExplicitMethod(i int) *Func { return t.methods[i] }
-
-// NumEmbeddeds returns the number of embedded types in interface t.
-func (t *Interface) NumEmbeddeds() int { return len(t.embeddeds) }
-
-// Embedded returns the i'th embedded type of interface t for 0 <= i < t.NumEmbeddeds().
-// The types are ordered by the corresponding TypeName's unique Id.
-func (t *Interface) Embedded(i int) *Named { return t.embeddeds[i] }
-
-// NumMethods returns the total number of methods of interface t.
-func (t *Interface) NumMethods() int { return len(t.allMethods) }
-
-// Method returns the i'th method of interface t for 0 <= i < t.NumMethods().
-// The methods are ordered by their unique Id.
-func (t *Interface) Method(i int) *Func { return t.allMethods[i] }
-
-// Empty returns true if t is the empty interface.
-func (t *Interface) Empty() bool { return len(t.allMethods) == 0 }
-
-// Complete computes the interface's method set. It must be called by users of
-// NewInterface after the interface's embedded types are fully defined and
-// before using the interface type in any way other than to form other types.
-// Complete returns the receiver.
-func (t *Interface) Complete() *Interface {
-	if t.allMethods != nil {
-		return t
-	}
-
-	var allMethods []*Func
-	if t.embeddeds == nil {
-		if t.methods == nil {
-			allMethods = make([]*Func, 0, 1)
-		} else {
-			allMethods = t.methods
-		}
-	} else {
-		allMethods = append(allMethods, t.methods...)
-		for _, et := range t.embeddeds {
-			it := et.Underlying().(*Interface)
-			it.Complete()
-			for _, tm := range it.allMethods {
-				// Make a copy of the method and adjust its receiver type.
-				newm := *tm
-				newmtyp := *tm.typ.(*Signature)
-				newm.typ = &newmtyp
-				newmtyp.recv = NewVar(newm.pos, newm.pkg, "", t)
-				allMethods = append(allMethods, &newm)
-			}
-		}
-		sort.Sort(byUniqueMethodName(allMethods))
-	}
-	t.allMethods = allMethods
-
-	return t
-}
-
-// A Map represents a map type.
-type Map struct {
-	key, elem Type
-}
-
-// NewMap returns a new map for the given key and element types.
-func NewMap(key, elem Type) *Map {
-	return &Map{key, elem}
-}
-
-// Key returns the key type of map m.
-func (m *Map) Key() Type { return m.key }
-
-// Elem returns the element type of map m.
-func (m *Map) Elem() Type { return m.elem }
-
-// A Chan represents a channel type.
-type Chan struct {
-	dir  ChanDir
-	elem Type
-}
-
-// A ChanDir value indicates a channel direction.
-type ChanDir int
-
-// The direction of a channel is indicated by one of the following constants.
-const (
-	SendRecv ChanDir = iota
-	SendOnly
-	RecvOnly
-)
-
-// NewChan returns a new channel type for the given direction and element type.
-func NewChan(dir ChanDir, elem Type) *Chan {
-	return &Chan{dir, elem}
-}
-
-// Dir returns the direction of channel c.
-func (c *Chan) Dir() ChanDir { return c.dir }
-
-// Elem returns the element type of channel c.
-func (c *Chan) Elem() Type { return c.elem }
-
-// A Named represents a named type.
-type Named struct {
-	obj        *TypeName // corresponding declared object
-	underlying Type      // possibly a *Named during setup; never a *Named once set up completely
-	methods    []*Func   // methods declared for this type (not the method set of this type)
-}
-
-// NewNamed returns a new named type for the given type name, underlying type, and associated methods.
-// The underlying type must not be a *Named.
-func NewNamed(obj *TypeName, underlying Type, methods []*Func) *Named {
-	if _, ok := underlying.(*Named); ok {
-		panic("types.NewNamed: underlying type must not be *Named")
-	}
-	typ := &Named{obj: obj, underlying: underlying, methods: methods}
-	if obj.typ == nil {
-		obj.typ = typ
-	}
-	return typ
-}
-
-// TypeName returns the type name for the named type t.
-func (t *Named) Obj() *TypeName { return t.obj }
-
-// NumMethods returns the number of explicit methods whose receiver is named type t.
-func (t *Named) NumMethods() int { return len(t.methods) }
-
-// Method returns the i'th method of named type t for 0 <= i < t.NumMethods().
-func (t *Named) Method(i int) *Func { return t.methods[i] }
-
-// SetUnderlying sets the underlying type and marks t as complete.
-// TODO(gri) determine if there's a better solution rather than providing this function
-func (t *Named) SetUnderlying(underlying Type) {
-	if underlying == nil {
-		panic("types.Named.SetUnderlying: underlying type must not be nil")
-	}
-	if _, ok := underlying.(*Named); ok {
-		panic("types.Named.SetUnderlying: underlying type must not be *Named")
-	}
-	t.underlying = underlying
-}
-
-// AddMethod adds method m unless it is already in the method list.
-// TODO(gri) find a better solution instead of providing this function
-func (t *Named) AddMethod(m *Func) {
-	if i, _ := lookupMethod(t.methods, m.pkg, m.name); i < 0 {
-		t.methods = append(t.methods, m)
-	}
-}
-
-// Implementations for Type methods.
-
-func (t *Basic) Underlying() Type     { return t }
-func (t *Array) Underlying() Type     { return t }
-func (t *Slice) Underlying() Type     { return t }
-func (t *Struct) Underlying() Type    { return t }
-func (t *Pointer) Underlying() Type   { return t }
-func (t *Tuple) Underlying() Type     { return t }
-func (t *Signature) Underlying() Type { return t }
-func (t *Interface) Underlying() Type { return t }
-func (t *Map) Underlying() Type       { return t }
-func (t *Chan) Underlying() Type      { return t }
-func (t *Named) Underlying() Type     { return t.underlying }
-
-func (t *Basic) String() string     { return TypeString(nil, t) }
-func (t *Array) String() string     { return TypeString(nil, t) }
-func (t *Slice) String() string     { return TypeString(nil, t) }
-func (t *Struct) String() string    { return TypeString(nil, t) }
-func (t *Pointer) String() string   { return TypeString(nil, t) }
-func (t *Tuple) String() string     { return TypeString(nil, t) }
-func (t *Signature) String() string { return TypeString(nil, t) }
-func (t *Interface) String() string { return TypeString(nil, t) }
-func (t *Map) String() string       { return TypeString(nil, t) }
-func (t *Chan) String() string      { return TypeString(nil, t) }
-func (t *Named) String() string     { return TypeString(nil, t) }
diff --git a/third_party/gotools/go/types/typestring.go b/third_party/gotools/go/types/typestring.go
deleted file mode 100644
index 9a537e8..0000000
--- a/third_party/gotools/go/types/typestring.go
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements printing of types.
-
-package types
-
-import (
-	"bytes"
-	"fmt"
-)
-
-// If GcCompatibilityMode is set, printing of types is modified
-// to match the representation of some types in the gc compiler:
-//
-//	- byte and rune lose their alias name and simply stand for
-//	  uint8 and int32 respectively
-//	- embedded interfaces get flattened (the embedding info is lost,
-//	  and certain recursive interface types cannot be printed anymore)
-//
-// This makes it easier to compare packages computed with the type-
-// checker vs packages imported from gc export data.
-//
-// Caution: This flag affects all uses of WriteType, globally.
-// It is only provided for testing in conjunction with
-// gc-generated data. It may be removed at any time.
-var GcCompatibilityMode bool
-
-// TypeString returns the string representation of typ.
-// Named types are printed package-qualified if they
-// do not belong to this package.
-func TypeString(this *Package, typ Type) string {
-	var buf bytes.Buffer
-	WriteType(&buf, this, typ)
-	return buf.String()
-}
-
-// WriteType writes the string representation of typ to buf.
-// Named types are printed package-qualified if they
-// do not belong to this package.
-func WriteType(buf *bytes.Buffer, this *Package, typ Type) {
-	writeType(buf, this, typ, make([]Type, 8))
-}
-
-func writeType(buf *bytes.Buffer, this *Package, typ Type, visited []Type) {
-	// Theoretically, this is a quadratic lookup algorithm, but in
-	// practice deeply nested composite types with unnamed component
-	// types are uncommon. This code is likely more efficient than
-	// using a map.
-	for _, t := range visited {
-		if t == typ {
-			fmt.Fprintf(buf, "○%T", typ) // cycle to typ
-			return
-		}
-	}
-	visited = append(visited, typ)
-
-	switch t := typ.(type) {
-	case nil:
-		buf.WriteString("<nil>")
-
-	case *Basic:
-		if t.kind == UnsafePointer {
-			buf.WriteString("unsafe.")
-		}
-		if GcCompatibilityMode {
-			// forget the alias names
-			switch t.kind {
-			case Byte:
-				t = Typ[Uint8]
-			case Rune:
-				t = Typ[Int32]
-			}
-		}
-		buf.WriteString(t.name)
-
-	case *Array:
-		fmt.Fprintf(buf, "[%d]", t.len)
-		writeType(buf, this, t.elem, visited)
-
-	case *Slice:
-		buf.WriteString("[]")
-		writeType(buf, this, t.elem, visited)
-
-	case *Struct:
-		buf.WriteString("struct{")
-		for i, f := range t.fields {
-			if i > 0 {
-				buf.WriteString("; ")
-			}
-			if !f.anonymous {
-				buf.WriteString(f.name)
-				buf.WriteByte(' ')
-			}
-			writeType(buf, this, f.typ, visited)
-			if tag := t.Tag(i); tag != "" {
-				fmt.Fprintf(buf, " %q", tag)
-			}
-		}
-		buf.WriteByte('}')
-
-	case *Pointer:
-		buf.WriteByte('*')
-		writeType(buf, this, t.base, visited)
-
-	case *Tuple:
-		writeTuple(buf, this, t, false, visited)
-
-	case *Signature:
-		buf.WriteString("func")
-		writeSignature(buf, this, t, visited)
-
-	case *Interface:
-		// We write the source-level methods and embedded types rather
-		// than the actual method set since resolved method signatures
-		// may have non-printable cycles if parameters have anonymous
-		// interface types that (directly or indirectly) embed the
-		// current interface. For instance, consider the result type
-		// of m:
-		//
-		//     type T interface{
-		//         m() interface{ T }
-		//     }
-		//
-		buf.WriteString("interface{")
-		if GcCompatibilityMode {
-			// print flattened interface
-			// (useful to compare against gc-generated interfaces)
-			for i, m := range t.allMethods {
-				if i > 0 {
-					buf.WriteString("; ")
-				}
-				buf.WriteString(m.name)
-				writeSignature(buf, this, m.typ.(*Signature), visited)
-			}
-		} else {
-			// print explicit interface methods and embedded types
-			for i, m := range t.methods {
-				if i > 0 {
-					buf.WriteString("; ")
-				}
-				buf.WriteString(m.name)
-				writeSignature(buf, this, m.typ.(*Signature), visited)
-			}
-			for i, typ := range t.embeddeds {
-				if i > 0 || len(t.methods) > 0 {
-					buf.WriteString("; ")
-				}
-				writeType(buf, this, typ, visited)
-			}
-		}
-		buf.WriteByte('}')
-
-	case *Map:
-		buf.WriteString("map[")
-		writeType(buf, this, t.key, visited)
-		buf.WriteByte(']')
-		writeType(buf, this, t.elem, visited)
-
-	case *Chan:
-		var s string
-		var parens bool
-		switch t.dir {
-		case SendRecv:
-			s = "chan "
-			// chan (<-chan T) requires parentheses
-			if c, _ := t.elem.(*Chan); c != nil && c.dir == RecvOnly {
-				parens = true
-			}
-		case SendOnly:
-			s = "chan<- "
-		case RecvOnly:
-			s = "<-chan "
-		default:
-			panic("unreachable")
-		}
-		buf.WriteString(s)
-		if parens {
-			buf.WriteByte('(')
-		}
-		writeType(buf, this, t.elem, visited)
-		if parens {
-			buf.WriteByte(')')
-		}
-
-	case *Named:
-		s := "<Named w/o object>"
-		if obj := t.obj; obj != nil {
-			if pkg := obj.pkg; pkg != nil && pkg != this {
-				buf.WriteString(pkg.path)
-				buf.WriteByte('.')
-			}
-			// TODO(gri): function-local named types should be displayed
-			// differently from named types at package level to avoid
-			// ambiguity.
-			s = obj.name
-		}
-		buf.WriteString(s)
-
-	default:
-		// For externally defined implementations of Type.
-		buf.WriteString(t.String())
-	}
-}
-
-func writeTuple(buf *bytes.Buffer, this *Package, tup *Tuple, variadic bool, visited []Type) {
-	buf.WriteByte('(')
-	if tup != nil {
-		for i, v := range tup.vars {
-			if i > 0 {
-				buf.WriteString(", ")
-			}
-			if v.name != "" {
-				buf.WriteString(v.name)
-				buf.WriteByte(' ')
-			}
-			typ := v.typ
-			if variadic && i == len(tup.vars)-1 {
-				if s, ok := typ.(*Slice); ok {
-					buf.WriteString("...")
-					typ = s.elem
-				} else {
-					// special case:
-					// append(s, "foo"...) leads to signature func([]byte, string...)
-					if t, ok := typ.Underlying().(*Basic); !ok || t.kind != String {
-						panic("internal error: string type expected")
-					}
-					writeType(buf, this, typ, visited)
-					buf.WriteString("...")
-					continue
-				}
-			}
-			writeType(buf, this, typ, visited)
-		}
-	}
-	buf.WriteByte(')')
-}
-
-// WriteSignature writes the representation of the signature sig to buf,
-// without a leading "func" keyword.
-// Named types are printed package-qualified if they
-// do not belong to this package.
-func WriteSignature(buf *bytes.Buffer, this *Package, sig *Signature) {
-	writeSignature(buf, this, sig, make([]Type, 8))
-}
-
-func writeSignature(buf *bytes.Buffer, this *Package, sig *Signature, visited []Type) {
-	writeTuple(buf, this, sig.params, sig.variadic, visited)
-
-	n := sig.results.Len()
-	if n == 0 {
-		// no result
-		return
-	}
-
-	buf.WriteByte(' ')
-	if n == 1 && sig.results.vars[0].name == "" {
-		// single unnamed result
-		writeType(buf, this, sig.results.vars[0].typ, visited)
-		return
-	}
-
-	// multiple or named result(s)
-	writeTuple(buf, this, sig.results, false, visited)
-}
diff --git a/third_party/gotools/go/types/typestring_test.go b/third_party/gotools/go/types/typestring_test.go
deleted file mode 100644
index 682eeb2..0000000
--- a/third_party/gotools/go/types/typestring_test.go
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package types_test
-
-import (
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"testing"
-
-	_ "llvm.org/llgo/third_party/gotools/go/gcimporter"
-	. "llvm.org/llgo/third_party/gotools/go/types"
-)
-
-const filename = "<src>"
-
-func makePkg(t *testing.T, src string) (*Package, error) {
-	fset := token.NewFileSet()
-	file, err := parser.ParseFile(fset, filename, src, parser.DeclarationErrors)
-	if err != nil {
-		return nil, err
-	}
-	// use the package name as package path
-	return Check(file.Name.Name, fset, []*ast.File{file})
-}
-
-type testEntry struct {
-	src, str string
-}
-
-// dup returns a testEntry where both src and str are the same.
-func dup(s string) testEntry {
-	return testEntry{s, s}
-}
-
-// types that don't depend on any other type declarations
-var independentTestTypes = []testEntry{
-	// basic types
-	dup("int"),
-	dup("float32"),
-	dup("string"),
-
-	// arrays
-	dup("[10]int"),
-
-	// slices
-	dup("[]int"),
-	dup("[][]int"),
-
-	// structs
-	dup("struct{}"),
-	dup("struct{x int}"),
-	{`struct {
-		x, y int
-		z float32 "foo"
-	}`, `struct{x int; y int; z float32 "foo"}`},
-	{`struct {
-		string
-		elems []complex128
-	}`, `struct{string; elems []complex128}`},
-
-	// pointers
-	dup("*int"),
-	dup("***struct{}"),
-	dup("*struct{a int; b float32}"),
-
-	// functions
-	dup("func()"),
-	dup("func(x int)"),
-	{"func(x, y int)", "func(x int, y int)"},
-	{"func(x, y int, z string)", "func(x int, y int, z string)"},
-	dup("func(int)"),
-	{"func(int, string, byte)", "func(int, string, byte)"},
-
-	dup("func() int"),
-	{"func() (string)", "func() string"},
-	dup("func() (u int)"),
-	{"func() (u, v int, w string)", "func() (u int, v int, w string)"},
-
-	dup("func(int) string"),
-	dup("func(x int) string"),
-	dup("func(x int) (u string)"),
-	{"func(x, y int) (u string)", "func(x int, y int) (u string)"},
-
-	dup("func(...int) string"),
-	dup("func(x ...int) string"),
-	dup("func(x ...int) (u string)"),
-	{"func(x, y ...int) (u string)", "func(x int, y ...int) (u string)"},
-
-	// interfaces
-	dup("interface{}"),
-	dup("interface{m()}"),
-	dup(`interface{String() string; m(int) float32}`),
-
-	// maps
-	dup("map[string]int"),
-	{"map[struct{x, y int}][]byte", "map[struct{x int; y int}][]byte"},
-
-	// channels
-	dup("chan<- chan int"),
-	dup("chan<- <-chan int"),
-	dup("<-chan <-chan int"),
-	dup("chan (<-chan int)"),
-	dup("chan<- func()"),
-	dup("<-chan []func() int"),
-}
-
-// types that depend on other type declarations (src in TestTypes)
-var dependentTestTypes = []testEntry{
-	// interfaces
-	dup(`interface{io.Reader; io.Writer}`),
-	dup(`interface{m() int; io.Writer}`),
-	{`interface{m() interface{T}}`, `interface{m() interface{p.T}}`},
-}
-
-func TestTypeString(t *testing.T) {
-	var tests []testEntry
-	tests = append(tests, independentTestTypes...)
-	tests = append(tests, dependentTestTypes...)
-
-	for _, test := range tests {
-		src := `package p; import "io"; type _ io.Writer; type T ` + test.src
-		pkg, err := makePkg(t, src)
-		if err != nil {
-			t.Errorf("%s: %s", src, err)
-			continue
-		}
-		typ := pkg.Scope().Lookup("T").Type().Underlying()
-		if got := typ.String(); got != test.str {
-			t.Errorf("%s: got %s, want %s", test.src, got, test.str)
-		}
-	}
-}
-
-func TestQualifiedTypeString(t *testing.T) {
-	p, _ := pkgFor("p.go", "package p; type T int", nil)
-	q, _ := pkgFor("q.go", "package q", nil)
-
-	pT := p.Scope().Lookup("T").Type()
-	for _, test := range []struct {
-		typ  Type
-		this *Package
-		want string
-	}{
-		{pT, nil, "p.T"},
-		{pT, p, "T"},
-		{pT, q, "p.T"},
-		{NewPointer(pT), p, "*T"},
-		{NewPointer(pT), q, "*p.T"},
-	} {
-		if got := TypeString(test.this, test.typ); got != test.want {
-			t.Errorf("TypeString(%s, %s) = %s, want %s",
-				test.this, test.typ, got, test.want)
-		}
-	}
-}
diff --git a/third_party/gotools/go/types/typeutil/example_test.go b/third_party/gotools/go/types/typeutil/example_test.go
deleted file mode 100644
index 3d73775..0000000
--- a/third_party/gotools/go/types/typeutil/example_test.go
+++ /dev/null
@@ -1,64 +0,0 @@
-package typeutil_test
-
-import (
-	"fmt"
-	"sort"
-
-	"go/ast"
-	"go/parser"
-	"go/token"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-)
-
-func ExampleMap() {
-	const source = `package P
-
-var X []string
-var Y []string
-
-const p, q = 1.0, 2.0
-
-func f(offset int32) (value byte, ok bool)
-func g(rune) (uint8, bool)
-`
-
-	// Parse and type-check the package.
-	fset := token.NewFileSet()
-	f, err := parser.ParseFile(fset, "P.go", source, 0)
-	if err != nil {
-		panic(err)
-	}
-	pkg, err := new(types.Config).Check("P", fset, []*ast.File{f}, nil)
-	if err != nil {
-		panic(err)
-	}
-
-	scope := pkg.Scope()
-
-	// Group names of package-level objects by their type.
-	var namesByType typeutil.Map // value is []string
-	for _, name := range scope.Names() {
-		T := scope.Lookup(name).Type()
-
-		names, _ := namesByType.At(T).([]string)
-		names = append(names, name)
-		namesByType.Set(T, names)
-	}
-
-	// Format, sort, and print the map entries.
-	var lines []string
-	namesByType.Iterate(func(T types.Type, names interface{}) {
-		lines = append(lines, fmt.Sprintf("%s   %s", names, T))
-	})
-	sort.Strings(lines)
-	for _, line := range lines {
-		fmt.Println(line)
-	}
-
-	// Output:
-	// [X Y]   []string
-	// [f g]   func(offset int32) (value byte, ok bool)
-	// [p q]   untyped float
-}
diff --git a/third_party/gotools/go/types/typeutil/imports.go b/third_party/gotools/go/types/typeutil/imports.go
deleted file mode 100644
index b9b96ed..0000000
--- a/third_party/gotools/go/types/typeutil/imports.go
+++ /dev/null
@@ -1,27 +0,0 @@
-package typeutil
-
-import "llvm.org/llgo/third_party/gotools/go/types"
-
-// Dependencies returns all dependencies of the specified packages.
-//
-// Dependent packages appear in topological order: if package P imports
-// package Q, Q appears earlier than P in the result.
-// The algorithm follows import statements in the order they
-// appear in the source code, so the result is a total order.
-//
-func Dependencies(pkgs ...*types.Package) []*types.Package {
-	var result []*types.Package
-	seen := make(map[*types.Package]bool)
-	var visit func(pkgs []*types.Package)
-	visit = func(pkgs []*types.Package) {
-		for _, p := range pkgs {
-			if !seen[p] {
-				seen[p] = true
-				visit(p.Imports())
-				result = append(result, p)
-			}
-		}
-	}
-	visit(pkgs)
-	return result
-}
diff --git a/third_party/gotools/go/types/typeutil/imports_test.go b/third_party/gotools/go/types/typeutil/imports_test.go
deleted file mode 100644
index 4a1383e..0000000
--- a/third_party/gotools/go/types/typeutil/imports_test.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package typeutil_test
-
-import (
-	"fmt"
-	"go/ast"
-	"go/parser"
-	"go/token"
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-)
-
-func TestDependencies(t *testing.T) {
-	packages := make(map[string]*types.Package)
-	conf := types.Config{
-		Packages: packages,
-		Import: func(_ map[string]*types.Package, path string) (*types.Package, error) {
-			return packages[path], nil
-		},
-	}
-	fset := token.NewFileSet()
-
-	// All edges go to the right.
-	//  /--D--B--A
-	// F    \_C_/
-	//  \__E_/
-	for i, content := range []string{
-		`package A`,
-		`package C; import (_ "A")`,
-		`package B; import (_ "A")`,
-		`package E; import (_ "C")`,
-		`package D; import (_ "B"; _ "C")`,
-		`package F; import (_ "D"; _ "E")`,
-	} {
-		f, err := parser.ParseFile(fset, fmt.Sprintf("%d.go", i), content, 0)
-		if err != nil {
-			t.Fatal(err)
-		}
-		pkg, err := conf.Check(f.Name.Name, fset, []*ast.File{f}, nil)
-		if err != nil {
-			t.Fatal(err)
-		}
-		packages[pkg.Path()] = pkg
-	}
-
-	for _, test := range []struct {
-		roots, want string
-	}{
-		{"A", "A"},
-		{"B", "AB"},
-		{"C", "AC"},
-		{"D", "ABCD"},
-		{"E", "ACE"},
-		{"F", "ABCDEF"},
-
-		{"BE", "ABCE"},
-		{"EB", "ACEB"},
-		{"DE", "ABCDE"},
-		{"ED", "ACEBD"},
-		{"EF", "ACEBDF"},
-	} {
-		var pkgs []*types.Package
-		for _, r := range test.roots {
-			pkgs = append(pkgs, conf.Packages[string(r)])
-		}
-		var got string
-		for _, p := range typeutil.Dependencies(pkgs...) {
-			got += p.Path()
-		}
-		if got != test.want {
-			t.Errorf("Dependencies(%q) = %q, want %q", test.roots, got, test.want)
-		}
-	}
-}
diff --git a/third_party/gotools/go/types/typeutil/map.go b/third_party/gotools/go/types/typeutil/map.go
deleted file mode 100644
index 4c650dd..0000000
--- a/third_party/gotools/go/types/typeutil/map.go
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package typeutil defines various utilities for types, such as Map,
-// a mapping from types.Type to interface{} values.
-package typeutil // import "llvm.org/llgo/third_party/gotools/go/types/typeutil"
-
-import (
-	"bytes"
-	"fmt"
-	"reflect"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-)
-
-// Map is a hash-table-based mapping from types (types.Type) to
-// arbitrary interface{} values.  The concrete types that implement
-// the Type interface are pointers.  Since they are not canonicalized,
-// == cannot be used to check for equivalence, and thus we cannot
-// simply use a Go map.
-//
-// Just as with map[K]V, a nil *Map is a valid empty map.
-//
-// Not thread-safe.
-//
-type Map struct {
-	hasher Hasher             // shared by many Maps
-	table  map[uint32][]entry // maps hash to bucket; entry.key==nil means unused
-	length int                // number of map entries
-}
-
-// entry is an entry (key/value association) in a hash bucket.
-type entry struct {
-	key   types.Type
-	value interface{}
-}
-
-// SetHasher sets the hasher used by Map.
-//
-// All Hashers are functionally equivalent but contain internal state
-// used to cache the results of hashing previously seen types.
-//
-// A single Hasher created by MakeHasher() may be shared among many
-// Maps.  This is recommended if the instances have many keys in
-// common, as it will amortize the cost of hash computation.
-//
-// A Hasher may grow without bound as new types are seen.  Even when a
-// type is deleted from the map, the Hasher never shrinks, since other
-// types in the map may reference the deleted type indirectly.
-//
-// Hashers are not thread-safe, and read-only operations such as
-// Map.Lookup require updates to the hasher, so a full Mutex lock (not a
-// read-lock) is require around all Map operations if a shared
-// hasher is accessed from multiple threads.
-//
-// If SetHasher is not called, the Map will create a private hasher at
-// the first call to Insert.
-//
-func (m *Map) SetHasher(hasher Hasher) {
-	m.hasher = hasher
-}
-
-// Delete removes the entry with the given key, if any.
-// It returns true if the entry was found.
-//
-func (m *Map) Delete(key types.Type) bool {
-	if m != nil && m.table != nil {
-		hash := m.hasher.Hash(key)
-		bucket := m.table[hash]
-		for i, e := range bucket {
-			if e.key != nil && types.Identical(key, e.key) {
-				// We can't compact the bucket as it
-				// would disturb iterators.
-				bucket[i] = entry{}
-				m.length--
-				return true
-			}
-		}
-	}
-	return false
-}
-
-// At returns the map entry for the given key.
-// The result is nil if the entry is not present.
-//
-func (m *Map) At(key types.Type) interface{} {
-	if m != nil && m.table != nil {
-		for _, e := range m.table[m.hasher.Hash(key)] {
-			if e.key != nil && types.Identical(key, e.key) {
-				return e.value
-			}
-		}
-	}
-	return nil
-}
-
-// Set sets the map entry for key to val,
-// and returns the previous entry, if any.
-func (m *Map) Set(key types.Type, value interface{}) (prev interface{}) {
-	if m.table != nil {
-		hash := m.hasher.Hash(key)
-		bucket := m.table[hash]
-		var hole *entry
-		for i, e := range bucket {
-			if e.key == nil {
-				hole = &bucket[i]
-			} else if types.Identical(key, e.key) {
-				prev = e.value
-				bucket[i].value = value
-				return
-			}
-		}
-
-		if hole != nil {
-			*hole = entry{key, value} // overwrite deleted entry
-		} else {
-			m.table[hash] = append(bucket, entry{key, value})
-		}
-	} else {
-		if m.hasher.memo == nil {
-			m.hasher = MakeHasher()
-		}
-		hash := m.hasher.Hash(key)
-		m.table = map[uint32][]entry{hash: {entry{key, value}}}
-	}
-
-	m.length++
-	return
-}
-
-// Len returns the number of map entries.
-func (m *Map) Len() int {
-	if m != nil {
-		return m.length
-	}
-	return 0
-}
-
-// Iterate calls function f on each entry in the map in unspecified order.
-//
-// If f should mutate the map, Iterate provides the same guarantees as
-// Go maps: if f deletes a map entry that Iterate has not yet reached,
-// f will not be invoked for it, but if f inserts a map entry that
-// Iterate has not yet reached, whether or not f will be invoked for
-// it is unspecified.
-//
-func (m *Map) Iterate(f func(key types.Type, value interface{})) {
-	if m != nil {
-		for _, bucket := range m.table {
-			for _, e := range bucket {
-				if e.key != nil {
-					f(e.key, e.value)
-				}
-			}
-		}
-	}
-}
-
-// Keys returns a new slice containing the set of map keys.
-// The order is unspecified.
-func (m *Map) Keys() []types.Type {
-	keys := make([]types.Type, 0, m.Len())
-	m.Iterate(func(key types.Type, _ interface{}) {
-		keys = append(keys, key)
-	})
-	return keys
-}
-
-func (m *Map) toString(values bool) string {
-	if m == nil {
-		return "{}"
-	}
-	var buf bytes.Buffer
-	fmt.Fprint(&buf, "{")
-	sep := ""
-	m.Iterate(func(key types.Type, value interface{}) {
-		fmt.Fprint(&buf, sep)
-		sep = ", "
-		fmt.Fprint(&buf, key)
-		if values {
-			fmt.Fprintf(&buf, ": %q", value)
-		}
-	})
-	fmt.Fprint(&buf, "}")
-	return buf.String()
-}
-
-// String returns a string representation of the map's entries.
-// Values are printed using fmt.Sprintf("%v", v).
-// Order is unspecified.
-//
-func (m *Map) String() string {
-	return m.toString(true)
-}
-
-// KeysString returns a string representation of the map's key set.
-// Order is unspecified.
-//
-func (m *Map) KeysString() string {
-	return m.toString(false)
-}
-
-////////////////////////////////////////////////////////////////////////
-// Hasher
-
-// A Hasher maps each type to its hash value.
-// For efficiency, a hasher uses memoization; thus its memory
-// footprint grows monotonically over time.
-// Hashers are not thread-safe.
-// Hashers have reference semantics.
-// Call MakeHasher to create a Hasher.
-type Hasher struct {
-	memo map[types.Type]uint32
-}
-
-// MakeHasher returns a new Hasher instance.
-func MakeHasher() Hasher {
-	return Hasher{make(map[types.Type]uint32)}
-}
-
-// Hash computes a hash value for the given type t such that
-// Identical(t, t') => Hash(t) == Hash(t').
-func (h Hasher) Hash(t types.Type) uint32 {
-	hash, ok := h.memo[t]
-	if !ok {
-		hash = h.hashFor(t)
-		h.memo[t] = hash
-	}
-	return hash
-}
-
-// hashString computes the Fowler–Noll–Vo hash of s.
-func hashString(s string) uint32 {
-	var h uint32
-	for i := 0; i < len(s); i++ {
-		h ^= uint32(s[i])
-		h *= 16777619
-	}
-	return h
-}
-
-// hashFor computes the hash of t.
-func (h Hasher) hashFor(t types.Type) uint32 {
-	// See Identical for rationale.
-	switch t := t.(type) {
-	case *types.Basic:
-		return uint32(t.Kind())
-
-	case *types.Array:
-		return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem())
-
-	case *types.Slice:
-		return 9049 + 2*h.Hash(t.Elem())
-
-	case *types.Struct:
-		var hash uint32 = 9059
-		for i, n := 0, t.NumFields(); i < n; i++ {
-			f := t.Field(i)
-			if f.Anonymous() {
-				hash += 8861
-			}
-			hash += hashString(t.Tag(i))
-			hash += hashString(f.Name()) // (ignore f.Pkg)
-			hash += h.Hash(f.Type())
-		}
-		return hash
-
-	case *types.Pointer:
-		return 9067 + 2*h.Hash(t.Elem())
-
-	case *types.Signature:
-		var hash uint32 = 9091
-		if t.Variadic() {
-			hash *= 8863
-		}
-		return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results())
-
-	case *types.Interface:
-		var hash uint32 = 9103
-		for i, n := 0, t.NumMethods(); i < n; i++ {
-			// See go/types.identicalMethods for rationale.
-			// Method order is not significant.
-			// Ignore m.Pkg().
-			m := t.Method(i)
-			hash += 3*hashString(m.Name()) + 5*h.Hash(m.Type())
-		}
-		return hash
-
-	case *types.Map:
-		return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem())
-
-	case *types.Chan:
-		return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem())
-
-	case *types.Named:
-		// Not safe with a copying GC; objects may move.
-		return uint32(reflect.ValueOf(t.Obj()).Pointer())
-
-	case *types.Tuple:
-		return h.hashTuple(t)
-	}
-	panic(t)
-}
-
-func (h Hasher) hashTuple(tuple *types.Tuple) uint32 {
-	// See go/types.identicalTypes for rationale.
-	n := tuple.Len()
-	var hash uint32 = 9137 + 2*uint32(n)
-	for i := 0; i < n; i++ {
-		hash += 3 * h.Hash(tuple.At(i).Type())
-	}
-	return hash
-}
diff --git a/third_party/gotools/go/types/typeutil/map_test.go b/third_party/gotools/go/types/typeutil/map_test.go
deleted file mode 100644
index bcbfba6..0000000
--- a/third_party/gotools/go/types/typeutil/map_test.go
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package typeutil_test
-
-// TODO(adonovan):
-// - test use of explicit hasher across two maps.
-// - test hashcodes are consistent with equals for a range of types
-//   (e.g. all types generated by type-checking some body of real code).
-
-import (
-	"testing"
-
-	"llvm.org/llgo/third_party/gotools/go/types"
-	"llvm.org/llgo/third_party/gotools/go/types/typeutil"
-)
-
-var (
-	tStr      = types.Typ[types.String]             // string
-	tPStr1    = types.NewPointer(tStr)              // *string
-	tPStr2    = types.NewPointer(tStr)              // *string, again
-	tInt      = types.Typ[types.Int]                // int
-	tChanInt1 = types.NewChan(types.RecvOnly, tInt) // <-chan int
-	tChanInt2 = types.NewChan(types.RecvOnly, tInt) // <-chan int, again
-)
-
-func checkEqualButNotIdentical(t *testing.T, x, y types.Type, comment string) {
-	if !types.Identical(x, y) {
-		t.Errorf("%s: not equal: %s, %s", comment, x, y)
-	}
-	if x == y {
-		t.Errorf("%s: identical: %v, %v", comment, x, y)
-	}
-}
-
-func TestAxioms(t *testing.T) {
-	checkEqualButNotIdentical(t, tPStr1, tPStr2, "tPstr{1,2}")
-	checkEqualButNotIdentical(t, tChanInt1, tChanInt2, "tChanInt{1,2}")
-}
-
-func TestMap(t *testing.T) {
-	var tmap *typeutil.Map
-
-	// All methods but Set are safe on on (*T)(nil).
-	tmap.Len()
-	tmap.At(tPStr1)
-	tmap.Delete(tPStr1)
-	tmap.KeysString()
-	tmap.String()
-
-	tmap = new(typeutil.Map)
-
-	// Length of empty map.
-	if l := tmap.Len(); l != 0 {
-		t.Errorf("Len() on empty Map: got %d, want 0", l)
-	}
-	// At of missing key.
-	if v := tmap.At(tPStr1); v != nil {
-		t.Errorf("At() on empty Map: got %v, want nil", v)
-	}
-	// Deletion of missing key.
-	if tmap.Delete(tPStr1) {
-		t.Errorf("Delete() on empty Map: got true, want false")
-	}
-	// Set of new key.
-	if prev := tmap.Set(tPStr1, "*string"); prev != nil {
-		t.Errorf("Set() on empty Map returned non-nil previous value %s", prev)
-	}
-
-	// Now: {*string: "*string"}
-
-	// Length of non-empty map.
-	if l := tmap.Len(); l != 1 {
-		t.Errorf("Len(): got %d, want 1", l)
-	}
-	// At via insertion key.
-	if v := tmap.At(tPStr1); v != "*string" {
-		t.Errorf("At(): got %q, want \"*string\"", v)
-	}
-	// At via equal key.
-	if v := tmap.At(tPStr2); v != "*string" {
-		t.Errorf("At(): got %q, want \"*string\"", v)
-	}
-	// Iteration over sole entry.
-	tmap.Iterate(func(key types.Type, value interface{}) {
-		if key != tPStr1 {
-			t.Errorf("Iterate: key: got %s, want %s", key, tPStr1)
-		}
-		if want := "*string"; value != want {
-			t.Errorf("Iterate: value: got %s, want %s", value, want)
-		}
-	})
-
-	// Setion with key equal to present one.
-	if prev := tmap.Set(tPStr2, "*string again"); prev != "*string" {
-		t.Errorf("Set() previous value: got %s, want \"*string\"", prev)
-	}
-
-	// Setion of another association.
-	if prev := tmap.Set(tChanInt1, "<-chan int"); prev != nil {
-		t.Errorf("Set() previous value: got %s, want nil", prev)
-	}
-
-	// Now: {*string: "*string again", <-chan int: "<-chan int"}
-
-	want1 := "{*string: \"*string again\", <-chan int: \"<-chan int\"}"
-	want2 := "{<-chan int: \"<-chan int\", *string: \"*string again\"}"
-	if s := tmap.String(); s != want1 && s != want2 {
-		t.Errorf("String(): got %s, want %s", s, want1)
-	}
-
-	want1 = "{*string, <-chan int}"
-	want2 = "{<-chan int, *string}"
-	if s := tmap.KeysString(); s != want1 && s != want2 {
-		t.Errorf("KeysString(): got %s, want %s", s, want1)
-	}
-
-	// Keys().
-	I := types.Identical
-	switch k := tmap.Keys(); {
-	case I(k[0], tChanInt1) && I(k[1], tPStr1): // ok
-	case I(k[1], tChanInt1) && I(k[0], tPStr1): // ok
-	default:
-		t.Errorf("Keys(): got %v, want %s", k, want2)
-	}
-
-	if l := tmap.Len(); l != 2 {
-		t.Errorf("Len(): got %d, want 1", l)
-	}
-	// At via original key.
-	if v := tmap.At(tPStr1); v != "*string again" {
-		t.Errorf("At(): got %q, want \"*string again\"", v)
-	}
-	hamming := 1
-	tmap.Iterate(func(key types.Type, value interface{}) {
-		switch {
-		case I(key, tChanInt1):
-			hamming *= 2 // ok
-		case I(key, tPStr1):
-			hamming *= 3 // ok
-		}
-	})
-	if hamming != 6 {
-		t.Errorf("Iterate: hamming: got %d, want %d", hamming, 6)
-	}
-
-	if v := tmap.At(tChanInt2); v != "<-chan int" {
-		t.Errorf("At(): got %q, want \"<-chan int\"", v)
-	}
-	// Deletion with key equal to present one.
-	if !tmap.Delete(tChanInt2) {
-		t.Errorf("Delete() of existing key: got false, want true")
-	}
-
-	// Now: {*string: "*string again"}
-
-	if l := tmap.Len(); l != 1 {
-		t.Errorf("Len(): got %d, want 1", l)
-	}
-	// Deletion again.
-	if !tmap.Delete(tPStr2) {
-		t.Errorf("Delete() of existing key: got false, want true")
-	}
-
-	// Now: {}
-
-	if l := tmap.Len(); l != 0 {
-		t.Errorf("Len(): got %d, want %d", l, 0)
-	}
-	if s := tmap.String(); s != "{}" {
-		t.Errorf("Len(): got %q, want %q", s, "")
-	}
-}
diff --git a/third_party/gotools/go/types/typeutil/ui.go b/third_party/gotools/go/types/typeutil/ui.go
deleted file mode 100644
index 081aa85..0000000
--- a/third_party/gotools/go/types/typeutil/ui.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package typeutil
-
-// This file defines utilities for user interfaces that display types.
-
-import "llvm.org/llgo/third_party/gotools/go/types"
-
-// IntuitiveMethodSet returns the intuitive method set of a type, T.
-//
-// The result contains MethodSet(T) and additionally, if T is a
-// concrete type, methods belonging to *T if there is no identically
-// named method on T itself.  This corresponds to user intuition about
-// method sets; this function is intended only for user interfaces.
-//
-// The order of the result is as for types.MethodSet(T).
-//
-func IntuitiveMethodSet(T types.Type, msets *types.MethodSetCache) []*types.Selection {
-	var result []*types.Selection
-	mset := msets.MethodSet(T)
-	if _, ok := T.Underlying().(*types.Interface); ok {
-		for i, n := 0, mset.Len(); i < n; i++ {
-			result = append(result, mset.At(i))
-		}
-	} else {
-		pmset := msets.MethodSet(types.NewPointer(T))
-		for i, n := 0, pmset.Len(); i < n; i++ {
-			meth := pmset.At(i)
-			if m := mset.Lookup(meth.Obj().Pkg(), meth.Obj().Name()); m != nil {
-				meth = m
-			}
-			result = append(result, meth)
-		}
-	}
-	return result
-}
diff --git a/third_party/gotools/go/types/typexpr.go b/third_party/gotools/go/types/typexpr.go
deleted file mode 100644
index 40c43bd..0000000
--- a/third_party/gotools/go/types/typexpr.go
+++ /dev/null
@@ -1,721 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements type-checking of identifiers and type expressions.
-
-package types
-
-import (
-	"go/ast"
-	"go/token"
-	"sort"
-	"strconv"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-)
-
-// ident type-checks identifier e and initializes x with the value or type of e.
-// If an error occurred, x.mode is set to invalid.
-// For the meaning of def and path, see check.typ, below.
-//
-func (check *Checker) ident(x *operand, e *ast.Ident, def *Named, path []*TypeName) {
-	x.mode = invalid
-	x.expr = e
-
-	scope, obj := check.scope.LookupParent(e.Name)
-	if obj == nil {
-		if e.Name == "_" {
-			check.errorf(e.Pos(), "cannot use _ as value or type")
-		} else {
-			check.errorf(e.Pos(), "undeclared name: %s", e.Name)
-		}
-		return
-	}
-	check.recordUse(e, obj)
-
-	check.objDecl(obj, def, path)
-	typ := obj.Type()
-	assert(typ != nil)
-
-	// The object may be dot-imported: If so, remove its package from
-	// the map of unused dot imports for the respective file scope.
-	// (This code is only needed for dot-imports. Without them,
-	// we only have to mark variables, see *Var case below).
-	if pkg := obj.Pkg(); pkg != check.pkg && pkg != nil {
-		delete(check.unusedDotImports[scope], pkg)
-	}
-
-	switch obj := obj.(type) {
-	case *PkgName:
-		check.errorf(e.Pos(), "use of package %s not in selector", obj.name)
-		return
-
-	case *Const:
-		check.addDeclDep(obj)
-		if typ == Typ[Invalid] {
-			return
-		}
-		if obj == universeIota {
-			if check.iota == nil {
-				check.errorf(e.Pos(), "cannot use iota outside constant declaration")
-				return
-			}
-			x.val = check.iota
-		} else {
-			x.val = obj.val
-		}
-		assert(x.val != nil)
-		x.mode = constant
-
-	case *TypeName:
-		x.mode = typexpr
-		// check for cycle
-		// (it's ok to iterate forward because each named type appears at most once in path)
-		for i, prev := range path {
-			if prev == obj {
-				check.errorf(obj.pos, "illegal cycle in declaration of %s", obj.name)
-				// print cycle
-				for _, obj := range path[i:] {
-					check.errorf(obj.Pos(), "\t%s refers to", obj.Name()) // secondary error, \t indented
-				}
-				check.errorf(obj.Pos(), "\t%s", obj.Name())
-				// maintain x.mode == typexpr despite error
-				typ = Typ[Invalid]
-				break
-			}
-		}
-
-	case *Var:
-		if obj.pkg == check.pkg {
-			obj.used = true
-		}
-		check.addDeclDep(obj)
-		if typ == Typ[Invalid] {
-			return
-		}
-		x.mode = variable
-
-	case *Func:
-		check.addDeclDep(obj)
-		x.mode = value
-
-	case *Builtin:
-		x.id = obj.id
-		x.mode = builtin
-
-	case *Nil:
-		x.mode = value
-
-	default:
-		unreachable()
-	}
-
-	x.typ = typ
-}
-
-// typExpr type-checks the type expression e and returns its type, or Typ[Invalid].
-// If def != nil, e is the type specification for the named type def, declared
-// in a type declaration, and def.underlying will be set to the type of e before
-// any components of e are type-checked. Path contains the path of named types
-// referring to this type.
-//
-func (check *Checker) typExpr(e ast.Expr, def *Named, path []*TypeName) (T Type) {
-	if trace {
-		check.trace(e.Pos(), "%s", e)
-		check.indent++
-		defer func() {
-			check.indent--
-			check.trace(e.Pos(), "=> %s", T)
-		}()
-	}
-
-	T = check.typExprInternal(e, def, path)
-	assert(isTyped(T))
-	check.recordTypeAndValue(e, typexpr, T, nil)
-
-	return
-}
-
-func (check *Checker) typ(e ast.Expr) Type {
-	return check.typExpr(e, nil, nil)
-}
-
-// funcType type-checks a function or method type and returns its signature.
-func (check *Checker) funcType(sig *Signature, recvPar *ast.FieldList, ftyp *ast.FuncType) *Signature {
-	scope := NewScope(check.scope, "function")
-	check.recordScope(ftyp, scope)
-
-	recvList, _ := check.collectParams(scope, recvPar, false)
-	params, variadic := check.collectParams(scope, ftyp.Params, true)
-	results, _ := check.collectParams(scope, ftyp.Results, false)
-
-	if recvPar != nil {
-		// recv parameter list present (may be empty)
-		// spec: "The receiver is specified via an extra parameter section preceeding the
-		// method name. That parameter section must declare a single parameter, the receiver."
-		var recv *Var
-		switch len(recvList) {
-		case 0:
-			check.error(recvPar.Pos(), "method is missing receiver")
-			recv = NewParam(0, nil, "", Typ[Invalid]) // ignore recv below
-		default:
-			// more than one receiver
-			check.error(recvList[len(recvList)-1].Pos(), "method must have exactly one receiver")
-			fallthrough // continue with first receiver
-		case 1:
-			recv = recvList[0]
-		}
-		// spec: "The receiver type must be of the form T or *T where T is a type name."
-		// (ignore invalid types - error was reported before)
-		if t, _ := deref(recv.typ); t != Typ[Invalid] {
-			var err string
-			if T, _ := t.(*Named); T != nil {
-				// spec: "The type denoted by T is called the receiver base type; it must not
-				// be a pointer or interface type and it must be declared in the same package
-				// as the method."
-				if T.obj.pkg != check.pkg {
-					err = "type not defined in this package"
-				} else {
-					// TODO(gri) This is not correct if the underlying type is unknown yet.
-					switch u := T.underlying.(type) {
-					case *Basic:
-						// unsafe.Pointer is treated like a regular pointer
-						if u.kind == UnsafePointer {
-							err = "unsafe.Pointer"
-						}
-					case *Pointer, *Interface:
-						err = "pointer or interface type"
-					}
-				}
-			} else {
-				err = "basic or unnamed type"
-			}
-			if err != "" {
-				check.errorf(recv.pos, "invalid receiver %s (%s)", recv.typ, err)
-				// ok to continue
-			}
-		}
-		sig.recv = recv
-	}
-
-	sig.scope = scope
-	sig.params = NewTuple(params...)
-	sig.results = NewTuple(results...)
-	sig.variadic = variadic
-
-	return sig
-}
-
-// typExprInternal drives type checking of types.
-// Must only be called by typExpr.
-//
-func (check *Checker) typExprInternal(e ast.Expr, def *Named, path []*TypeName) Type {
-	switch e := e.(type) {
-	case *ast.BadExpr:
-		// ignore - error reported before
-
-	case *ast.Ident:
-		var x operand
-		check.ident(&x, e, def, path)
-
-		switch x.mode {
-		case typexpr:
-			typ := x.typ
-			def.setUnderlying(typ)
-			return typ
-		case invalid:
-			// ignore - error reported before
-		case novalue:
-			check.errorf(x.pos(), "%s used as type", &x)
-		default:
-			check.errorf(x.pos(), "%s is not a type", &x)
-		}
-
-	case *ast.SelectorExpr:
-		var x operand
-		check.selector(&x, e)
-
-		switch x.mode {
-		case typexpr:
-			typ := x.typ
-			def.setUnderlying(typ)
-			return typ
-		case invalid:
-			// ignore - error reported before
-		case novalue:
-			check.errorf(x.pos(), "%s used as type", &x)
-		default:
-			check.errorf(x.pos(), "%s is not a type", &x)
-		}
-
-	case *ast.ParenExpr:
-		return check.typExpr(e.X, def, path)
-
-	case *ast.ArrayType:
-		if e.Len != nil {
-			typ := new(Array)
-			def.setUnderlying(typ)
-			typ.len = check.arrayLength(e.Len)
-			typ.elem = check.typExpr(e.Elt, nil, path)
-			return typ
-
-		} else {
-			typ := new(Slice)
-			def.setUnderlying(typ)
-			typ.elem = check.typ(e.Elt)
-			return typ
-		}
-
-	case *ast.StructType:
-		typ := new(Struct)
-		def.setUnderlying(typ)
-		check.structType(typ, e, path)
-		return typ
-
-	case *ast.StarExpr:
-		typ := new(Pointer)
-		def.setUnderlying(typ)
-		typ.base = check.typ(e.X)
-		return typ
-
-	case *ast.FuncType:
-		typ := new(Signature)
-		def.setUnderlying(typ)
-		check.funcType(typ, nil, e)
-		return typ
-
-	case *ast.InterfaceType:
-		typ := new(Interface)
-		def.setUnderlying(typ)
-		check.interfaceType(typ, e, def, path)
-		return typ
-
-	case *ast.MapType:
-		typ := new(Map)
-		def.setUnderlying(typ)
-
-		typ.key = check.typ(e.Key)
-		typ.elem = check.typ(e.Value)
-
-		// spec: "The comparison operators == and != must be fully defined
-		// for operands of the key type; thus the key type must not be a
-		// function, map, or slice."
-		//
-		// Delay this check because it requires fully setup types;
-		// it is safe to continue in any case (was issue 6667).
-		check.delay(func() {
-			if !Comparable(typ.key) {
-				check.errorf(e.Key.Pos(), "invalid map key type %s", typ.key)
-			}
-		})
-
-		return typ
-
-	case *ast.ChanType:
-		typ := new(Chan)
-		def.setUnderlying(typ)
-
-		dir := SendRecv
-		switch e.Dir {
-		case ast.SEND | ast.RECV:
-			// nothing to do
-		case ast.SEND:
-			dir = SendOnly
-		case ast.RECV:
-			dir = RecvOnly
-		default:
-			check.invalidAST(e.Pos(), "unknown channel direction %d", e.Dir)
-			// ok to continue
-		}
-
-		typ.dir = dir
-		typ.elem = check.typ(e.Value)
-		return typ
-
-	default:
-		check.errorf(e.Pos(), "%s is not a type", e)
-	}
-
-	typ := Typ[Invalid]
-	def.setUnderlying(typ)
-	return typ
-}
-
-// typeOrNil type-checks the type expression (or nil value) e
-// and returns the typ of e, or nil.
-// If e is neither a type nor nil, typOrNil returns Typ[Invalid].
-//
-func (check *Checker) typOrNil(e ast.Expr) Type {
-	var x operand
-	check.rawExpr(&x, e, nil)
-	switch x.mode {
-	case invalid:
-		// ignore - error reported before
-	case novalue:
-		check.errorf(x.pos(), "%s used as type", &x)
-	case typexpr:
-		return x.typ
-	case value:
-		if x.isNil() {
-			return nil
-		}
-		fallthrough
-	default:
-		check.errorf(x.pos(), "%s is not a type", &x)
-	}
-	return Typ[Invalid]
-}
-
-func (check *Checker) arrayLength(e ast.Expr) int64 {
-	var x operand
-	check.expr(&x, e)
-	if x.mode != constant {
-		if x.mode != invalid {
-			check.errorf(x.pos(), "array length %s must be constant", &x)
-		}
-		return 0
-	}
-	if !x.isInteger() {
-		check.errorf(x.pos(), "array length %s must be integer", &x)
-		return 0
-	}
-	n, ok := exact.Int64Val(x.val)
-	if !ok || n < 0 {
-		check.errorf(x.pos(), "invalid array length %s", &x)
-		return 0
-	}
-	return n
-}
-
-func (check *Checker) collectParams(scope *Scope, list *ast.FieldList, variadicOk bool) (params []*Var, variadic bool) {
-	if list == nil {
-		return
-	}
-
-	var named, anonymous bool
-	for i, field := range list.List {
-		ftype := field.Type
-		if t, _ := ftype.(*ast.Ellipsis); t != nil {
-			ftype = t.Elt
-			if variadicOk && i == len(list.List)-1 {
-				variadic = true
-			} else {
-				check.invalidAST(field.Pos(), "... not permitted")
-				// ignore ... and continue
-			}
-		}
-		typ := check.typ(ftype)
-		// The parser ensures that f.Tag is nil and we don't
-		// care if a constructed AST contains a non-nil tag.
-		if len(field.Names) > 0 {
-			// named parameter
-			for _, name := range field.Names {
-				if name.Name == "" {
-					check.invalidAST(name.Pos(), "anonymous parameter")
-					// ok to continue
-				}
-				par := NewParam(name.Pos(), check.pkg, name.Name, typ)
-				check.declare(scope, name, par)
-				params = append(params, par)
-			}
-			named = true
-		} else {
-			// anonymous parameter
-			par := NewParam(ftype.Pos(), check.pkg, "", typ)
-			check.recordImplicit(field, par)
-			params = append(params, par)
-			anonymous = true
-		}
-	}
-
-	if named && anonymous {
-		check.invalidAST(list.Pos(), "list contains both named and anonymous parameters")
-		// ok to continue
-	}
-
-	// For a variadic function, change the last parameter's type from T to []T.
-	if variadic && len(params) > 0 {
-		last := params[len(params)-1]
-		last.typ = &Slice{elem: last.typ}
-	}
-
-	return
-}
-
-func (check *Checker) declareInSet(oset *objset, pos token.Pos, obj Object) bool {
-	if alt := oset.insert(obj); alt != nil {
-		check.errorf(pos, "%s redeclared", obj.Name())
-		check.reportAltDecl(alt)
-		return false
-	}
-	return true
-}
-
-func (check *Checker) interfaceType(iface *Interface, ityp *ast.InterfaceType, def *Named, path []*TypeName) {
-	// empty interface: common case
-	if ityp.Methods == nil {
-		return
-	}
-
-	// The parser ensures that field tags are nil and we don't
-	// care if a constructed AST contains non-nil tags.
-
-	// use named receiver type if available (for better error messages)
-	var recvTyp Type = iface
-	if def != nil {
-		recvTyp = def
-	}
-
-	// Phase 1: Collect explicitly declared methods, the corresponding
-	//          signature (AST) expressions, and the list of embedded
-	//          type (AST) expressions. Do not resolve signatures or
-	//          embedded types yet to avoid cycles referring to this
-	//          interface.
-
-	var (
-		mset       objset
-		signatures []ast.Expr // list of corresponding method signatures
-		embedded   []ast.Expr // list of embedded types
-	)
-	for _, f := range ityp.Methods.List {
-		if len(f.Names) > 0 {
-			// The parser ensures that there's only one method
-			// and we don't care if a constructed AST has more.
-			name := f.Names[0]
-			pos := name.Pos()
-			// spec: "As with all method sets, in an interface type,
-			// each method must have a unique non-blank name."
-			if name.Name == "_" {
-				check.errorf(pos, "invalid method name _")
-				continue
-			}
-			// Don't type-check signature yet - use an
-			// empty signature now and update it later.
-			// Since we know the receiver, set it up now
-			// (required to avoid crash in ptrRecv; see
-			// e.g. test case for issue 6638).
-			// TODO(gri) Consider marking methods signatures
-			// as incomplete, for better error messages. See
-			// also the T4 and T5 tests in testdata/cycles2.src.
-			sig := new(Signature)
-			sig.recv = NewVar(pos, check.pkg, "", recvTyp)
-			m := NewFunc(pos, check.pkg, name.Name, sig)
-			if check.declareInSet(&mset, pos, m) {
-				iface.methods = append(iface.methods, m)
-				iface.allMethods = append(iface.allMethods, m)
-				signatures = append(signatures, f.Type)
-				check.recordDef(name, m)
-			}
-		} else {
-			// embedded type
-			embedded = append(embedded, f.Type)
-		}
-	}
-
-	// Phase 2: Resolve embedded interfaces. Because an interface must not
-	//          embed itself (directly or indirectly), each embedded interface
-	//          can be fully resolved without depending on any method of this
-	//          interface (if there is a cycle or another error, the embedded
-	//          type resolves to an invalid type and is ignored).
-	//          In particular, the list of methods for each embedded interface
-	//          must be complete (it cannot depend on this interface), and so
-	//          those methods can be added to the list of all methods of this
-	//          interface.
-
-	for _, e := range embedded {
-		pos := e.Pos()
-		typ := check.typExpr(e, nil, path)
-		named, _ := typ.(*Named)
-		if named == nil {
-			if typ != Typ[Invalid] {
-				check.invalidAST(pos, "%s is not named type", typ)
-			}
-			continue
-		}
-		// determine underlying (possibly incomplete) type
-		// by following its forward chain
-		u := underlying(named)
-		embed, _ := u.(*Interface)
-		if embed == nil {
-			if u != Typ[Invalid] {
-				check.errorf(pos, "%s is not an interface", named)
-			}
-			continue
-		}
-		iface.embeddeds = append(iface.embeddeds, named)
-		// collect embedded methods
-		for _, m := range embed.allMethods {
-			if check.declareInSet(&mset, pos, m) {
-				iface.allMethods = append(iface.allMethods, m)
-			}
-		}
-	}
-
-	// Phase 3: At this point all methods have been collected for this interface.
-	//          It is now safe to type-check the signatures of all explicitly
-	//          declared methods, even if they refer to this interface via a cycle
-	//          and embed the methods of this interface in a parameter of interface
-	//          type.
-
-	for i, m := range iface.methods {
-		expr := signatures[i]
-		typ := check.typ(expr)
-		sig, _ := typ.(*Signature)
-		if sig == nil {
-			if typ != Typ[Invalid] {
-				check.invalidAST(expr.Pos(), "%s is not a method signature", typ)
-			}
-			continue // keep method with empty method signature
-		}
-		// update signature, but keep recv that was set up before
-		old := m.typ.(*Signature)
-		sig.recv = old.recv
-		*old = *sig // update signature (don't replace it!)
-	}
-
-	// TODO(gri) The list of explicit methods is only sorted for now to
-	// produce the same Interface as NewInterface. We may be able to
-	// claim source order in the future. Revisit.
-	sort.Sort(byUniqueMethodName(iface.methods))
-
-	// TODO(gri) The list of embedded types is only sorted for now to
-	// produce the same Interface as NewInterface. We may be able to
-	// claim source order in the future. Revisit.
-	sort.Sort(byUniqueTypeName(iface.embeddeds))
-
-	sort.Sort(byUniqueMethodName(iface.allMethods))
-}
-
-// byUniqueTypeName named type lists can be sorted by their unique type names.
-type byUniqueTypeName []*Named
-
-func (a byUniqueTypeName) Len() int           { return len(a) }
-func (a byUniqueTypeName) Less(i, j int) bool { return a[i].obj.Id() < a[j].obj.Id() }
-func (a byUniqueTypeName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-
-// byUniqueMethodName method lists can be sorted by their unique method names.
-type byUniqueMethodName []*Func
-
-func (a byUniqueMethodName) Len() int           { return len(a) }
-func (a byUniqueMethodName) Less(i, j int) bool { return a[i].Id() < a[j].Id() }
-func (a byUniqueMethodName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-
-func (check *Checker) tag(t *ast.BasicLit) string {
-	if t != nil {
-		if t.Kind == token.STRING {
-			if val, err := strconv.Unquote(t.Value); err == nil {
-				return val
-			}
-		}
-		check.invalidAST(t.Pos(), "incorrect tag syntax: %q", t.Value)
-	}
-	return ""
-}
-
-func (check *Checker) structType(styp *Struct, e *ast.StructType, path []*TypeName) {
-	list := e.Fields
-	if list == nil {
-		return
-	}
-
-	// struct fields and tags
-	var fields []*Var
-	var tags []string
-
-	// for double-declaration checks
-	var fset objset
-
-	// current field typ and tag
-	var typ Type
-	var tag string
-	// anonymous != nil indicates an anonymous field.
-	add := func(field *ast.Field, ident *ast.Ident, anonymous *TypeName, pos token.Pos) {
-		if tag != "" && tags == nil {
-			tags = make([]string, len(fields))
-		}
-		if tags != nil {
-			tags = append(tags, tag)
-		}
-
-		name := ident.Name
-		fld := NewField(pos, check.pkg, name, typ, anonymous != nil)
-		// spec: "Within a struct, non-blank field names must be unique."
-		if name == "_" || check.declareInSet(&fset, pos, fld) {
-			fields = append(fields, fld)
-			check.recordDef(ident, fld)
-		}
-		if anonymous != nil {
-			check.recordUse(ident, anonymous)
-		}
-	}
-
-	for _, f := range list.List {
-		typ = check.typExpr(f.Type, nil, path)
-		tag = check.tag(f.Tag)
-		if len(f.Names) > 0 {
-			// named fields
-			for _, name := range f.Names {
-				add(f, name, nil, name.Pos())
-			}
-		} else {
-			// anonymous field
-			name := anonymousFieldIdent(f.Type)
-			pos := f.Type.Pos()
-			t, isPtr := deref(typ)
-			switch t := t.(type) {
-			case *Basic:
-				if t == Typ[Invalid] {
-					// error was reported before
-					continue
-				}
-				// unsafe.Pointer is treated like a regular pointer
-				if t.kind == UnsafePointer {
-					check.errorf(pos, "anonymous field type cannot be unsafe.Pointer")
-					continue
-				}
-				add(f, name, Universe.Lookup(t.name).(*TypeName), pos)
-
-			case *Named:
-				// spec: "An embedded type must be specified as a type name
-				// T or as a pointer to a non-interface type name *T, and T
-				// itself may not be a pointer type."
-				switch u := t.underlying.(type) {
-				case *Basic:
-					// unsafe.Pointer is treated like a regular pointer
-					if u.kind == UnsafePointer {
-						check.errorf(pos, "anonymous field type cannot be unsafe.Pointer")
-						continue
-					}
-				case *Pointer:
-					check.errorf(pos, "anonymous field type cannot be a pointer")
-					continue
-				case *Interface:
-					if isPtr {
-						check.errorf(pos, "anonymous field type cannot be a pointer to an interface")
-						continue
-					}
-				}
-				add(f, name, t.obj, pos)
-
-			default:
-				check.invalidAST(pos, "anonymous field type %s must be named", typ)
-			}
-		}
-	}
-
-	styp.fields = fields
-	styp.tags = tags
-}
-
-func anonymousFieldIdent(e ast.Expr) *ast.Ident {
-	switch e := e.(type) {
-	case *ast.Ident:
-		return e
-	case *ast.StarExpr:
-		return anonymousFieldIdent(e.X)
-	case *ast.SelectorExpr:
-		return e.Sel
-	}
-	return nil // invalid anonymous field
-}
diff --git a/third_party/gotools/go/types/universe.go b/third_party/gotools/go/types/universe.go
deleted file mode 100644
index dc1a1a5..0000000
--- a/third_party/gotools/go/types/universe.go
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file implements the universe and unsafe package scopes.
-
-package types
-
-import (
-	"go/token"
-	"strings"
-
-	"llvm.org/llgo/third_party/gotools/go/exact"
-)
-
-var (
-	Universe     *Scope
-	Unsafe       *Package
-	universeIota *Const
-	UniverseByte *Basic // uint8 alias, but has name "byte"
-	UniverseRune *Basic // int32 alias, but has name "rune"
-)
-
-var Typ = [...]*Basic{
-	Invalid: {Invalid, 0, "invalid type"},
-
-	Bool:          {Bool, IsBoolean, "bool"},
-	Int:           {Int, IsInteger, "int"},
-	Int8:          {Int8, IsInteger, "int8"},
-	Int16:         {Int16, IsInteger, "int16"},
-	Int32:         {Int32, IsInteger, "int32"},
-	Int64:         {Int64, IsInteger, "int64"},
-	Uint:          {Uint, IsInteger | IsUnsigned, "uint"},
-	Uint8:         {Uint8, IsInteger | IsUnsigned, "uint8"},
-	Uint16:        {Uint16, IsInteger | IsUnsigned, "uint16"},
-	Uint32:        {Uint32, IsInteger | IsUnsigned, "uint32"},
-	Uint64:        {Uint64, IsInteger | IsUnsigned, "uint64"},
-	Uintptr:       {Uintptr, IsInteger | IsUnsigned, "uintptr"},
-	Float32:       {Float32, IsFloat, "float32"},
-	Float64:       {Float64, IsFloat, "float64"},
-	Complex64:     {Complex64, IsComplex, "complex64"},
-	Complex128:    {Complex128, IsComplex, "complex128"},
-	String:        {String, IsString, "string"},
-	UnsafePointer: {UnsafePointer, 0, "Pointer"},
-
-	UntypedBool:    {UntypedBool, IsBoolean | IsUntyped, "untyped bool"},
-	UntypedInt:     {UntypedInt, IsInteger | IsUntyped, "untyped int"},
-	UntypedRune:    {UntypedRune, IsInteger | IsUntyped, "untyped rune"},
-	UntypedFloat:   {UntypedFloat, IsFloat | IsUntyped, "untyped float"},
-	UntypedComplex: {UntypedComplex, IsComplex | IsUntyped, "untyped complex"},
-	UntypedString:  {UntypedString, IsString | IsUntyped, "untyped string"},
-	UntypedNil:     {UntypedNil, IsUntyped, "untyped nil"},
-}
-
-var aliases = [...]*Basic{
-	{Byte, IsInteger | IsUnsigned, "byte"},
-	{Rune, IsInteger, "rune"},
-}
-
-func defPredeclaredTypes() {
-	for _, t := range Typ {
-		def(NewTypeName(token.NoPos, nil, t.name, t))
-	}
-	for _, t := range aliases {
-		def(NewTypeName(token.NoPos, nil, t.name, t))
-	}
-
-	// Error has a nil package in its qualified name since it is in no package
-	res := NewVar(token.NoPos, nil, "", Typ[String])
-	sig := &Signature{results: NewTuple(res)}
-	err := NewFunc(token.NoPos, nil, "Error", sig)
-	typ := &Named{underlying: NewInterface([]*Func{err}, nil).Complete()}
-	sig.recv = NewVar(token.NoPos, nil, "", typ)
-	def(NewTypeName(token.NoPos, nil, "error", typ))
-}
-
-var predeclaredConsts = [...]struct {
-	name string
-	kind BasicKind
-	val  exact.Value
-}{
-	{"true", UntypedBool, exact.MakeBool(true)},
-	{"false", UntypedBool, exact.MakeBool(false)},
-	{"iota", UntypedInt, exact.MakeInt64(0)},
-}
-
-func defPredeclaredConsts() {
-	for _, c := range predeclaredConsts {
-		def(NewConst(token.NoPos, nil, c.name, Typ[c.kind], c.val))
-	}
-}
-
-func defPredeclaredNil() {
-	def(&Nil{object{name: "nil", typ: Typ[UntypedNil]}})
-}
-
-// A builtinId is the id of a builtin function.
-type builtinId int
-
-const (
-	// universe scope
-	_Append builtinId = iota
-	_Cap
-	_Close
-	_Complex
-	_Copy
-	_Delete
-	_Imag
-	_Len
-	_Make
-	_New
-	_Panic
-	_Print
-	_Println
-	_Real
-	_Recover
-
-	// package unsafe
-	_Alignof
-	_Offsetof
-	_Sizeof
-
-	// testing support
-	_Assert
-	_Trace
-)
-
-var predeclaredFuncs = [...]struct {
-	name     string
-	nargs    int
-	variadic bool
-	kind     exprKind
-}{
-	_Append:  {"append", 1, true, expression},
-	_Cap:     {"cap", 1, false, expression},
-	_Close:   {"close", 1, false, statement},
-	_Complex: {"complex", 2, false, expression},
-	_Copy:    {"copy", 2, false, statement},
-	_Delete:  {"delete", 2, false, statement},
-	_Imag:    {"imag", 1, false, expression},
-	_Len:     {"len", 1, false, expression},
-	_Make:    {"make", 1, true, expression},
-	_New:     {"new", 1, false, expression},
-	_Panic:   {"panic", 1, false, statement},
-	_Print:   {"print", 0, true, statement},
-	_Println: {"println", 0, true, statement},
-	_Real:    {"real", 1, false, expression},
-	_Recover: {"recover", 0, false, statement},
-
-	_Alignof:  {"Alignof", 1, false, expression},
-	_Offsetof: {"Offsetof", 1, false, expression},
-	_Sizeof:   {"Sizeof", 1, false, expression},
-
-	_Assert: {"assert", 1, false, statement},
-	_Trace:  {"trace", 0, true, statement},
-}
-
-func defPredeclaredFuncs() {
-	for i := range predeclaredFuncs {
-		id := builtinId(i)
-		if id == _Assert || id == _Trace {
-			continue // only define these in testing environment
-		}
-		def(newBuiltin(id))
-	}
-}
-
-// DefPredeclaredTestFuncs defines the assert and trace built-ins.
-// These built-ins are intended for debugging and testing of this
-// package only.
-func DefPredeclaredTestFuncs() {
-	if Universe.Lookup("assert") != nil {
-		return // already defined
-	}
-	def(newBuiltin(_Assert))
-	def(newBuiltin(_Trace))
-}
-
-func init() {
-	Universe = NewScope(nil, "universe")
-	Unsafe = NewPackage("unsafe", "unsafe")
-	Unsafe.complete = true
-
-	defPredeclaredTypes()
-	defPredeclaredConsts()
-	defPredeclaredNil()
-	defPredeclaredFuncs()
-
-	universeIota = Universe.Lookup("iota").(*Const)
-	UniverseByte = Universe.Lookup("byte").(*TypeName).typ.(*Basic)
-	UniverseRune = Universe.Lookup("rune").(*TypeName).typ.(*Basic)
-}
-
-// Objects with names containing blanks are internal and not entered into
-// a scope. Objects with exported names are inserted in the unsafe package
-// scope; other objects are inserted in the universe scope.
-//
-func def(obj Object) {
-	name := obj.Name()
-	if strings.Index(name, " ") >= 0 {
-		return // nothing to do
-	}
-	// fix Obj link for named types
-	if typ, ok := obj.Type().(*Named); ok {
-		typ.obj = obj.(*TypeName)
-	}
-	// exported identifiers go into package unsafe
-	scope := Universe
-	if obj.Exported() {
-		scope = Unsafe.scope
-		// set Pkg field
-		switch obj := obj.(type) {
-		case *TypeName:
-			obj.pkg = Unsafe
-		case *Builtin:
-			obj.pkg = Unsafe
-		default:
-			unreachable()
-		}
-	}
-	if scope.Insert(obj) != nil {
-		panic("internal error: double declaration")
-	}
-}
diff --git a/third_party/gotools/go/vcs/discovery.go b/third_party/gotools/go/vcs/discovery.go
deleted file mode 100644
index c4b0e3d..0000000
--- a/third_party/gotools/go/vcs/discovery.go
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package vcs
-
-import (
-	"encoding/xml"
-	"fmt"
-	"io"
-	"strings"
-)
-
-// charsetReader returns a reader for the given charset. Currently
-// it only supports UTF-8 and ASCII. Otherwise, it returns a meaningful
-// error which is printed by go get, so the user can find why the package
-// wasn't downloaded if the encoding is not supported. Note that, in
-// order to reduce potential errors, ASCII is treated as UTF-8 (i.e. characters
-// greater than 0x7f are not rejected).
-func charsetReader(charset string, input io.Reader) (io.Reader, error) {
-	switch strings.ToLower(charset) {
-	case "ascii":
-		return input, nil
-	default:
-		return nil, fmt.Errorf("can't decode XML document using charset %q", charset)
-	}
-}
-
-// parseMetaGoImports returns meta imports from the HTML in r.
-// Parsing ends at the end of the <head> section or the beginning of the <body>.
-func parseMetaGoImports(r io.Reader) (imports []metaImport, err error) {
-	d := xml.NewDecoder(r)
-	d.CharsetReader = charsetReader
-	d.Strict = false
-	var t xml.Token
-	for {
-		t, err = d.Token()
-		if err != nil {
-			if err == io.EOF {
-				err = nil
-			}
-			return
-		}
-		if e, ok := t.(xml.StartElement); ok && strings.EqualFold(e.Name.Local, "body") {
-			return
-		}
-		if e, ok := t.(xml.EndElement); ok && strings.EqualFold(e.Name.Local, "head") {
-			return
-		}
-		e, ok := t.(xml.StartElement)
-		if !ok || !strings.EqualFold(e.Name.Local, "meta") {
-			continue
-		}
-		if attrValue(e.Attr, "name") != "go-import" {
-			continue
-		}
-		if f := strings.Fields(attrValue(e.Attr, "content")); len(f) == 3 {
-			imports = append(imports, metaImport{
-				Prefix:   f[0],
-				VCS:      f[1],
-				RepoRoot: f[2],
-			})
-		}
-	}
-}
-
-// attrValue returns the attribute value for the case-insensitive key
-// `name', or the empty string if nothing is found.
-func attrValue(attrs []xml.Attr, name string) string {
-	for _, a := range attrs {
-		if strings.EqualFold(a.Name.Local, name) {
-			return a.Value
-		}
-	}
-	return ""
-}
diff --git a/third_party/gotools/go/vcs/env.go b/third_party/gotools/go/vcs/env.go
deleted file mode 100644
index e846f5b..0000000
--- a/third_party/gotools/go/vcs/env.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package vcs
-
-import (
-	"os"
-	"strings"
-)
-
-// envForDir returns a copy of the environment
-// suitable for running in the given directory.
-// The environment is the current process's environment
-// but with an updated $PWD, so that an os.Getwd in the
-// child will be faster.
-func envForDir(dir string) []string {
-	env := os.Environ()
-	// Internally we only use rooted paths, so dir is rooted.
-	// Even if dir is not rooted, no harm done.
-	return mergeEnvLists([]string{"PWD=" + dir}, env)
-}
-
-// mergeEnvLists merges the two environment lists such that
-// variables with the same name in "in" replace those in "out".
-func mergeEnvLists(in, out []string) []string {
-NextVar:
-	for _, inkv := range in {
-		k := strings.SplitAfterN(inkv, "=", 2)[0]
-		for i, outkv := range out {
-			if strings.HasPrefix(outkv, k) {
-				out[i] = inkv
-				continue NextVar
-			}
-		}
-		out = append(out, inkv)
-	}
-	return out
-}
diff --git a/third_party/gotools/go/vcs/http.go b/third_party/gotools/go/vcs/http.go
deleted file mode 100644
index 9618818..0000000
--- a/third_party/gotools/go/vcs/http.go
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package vcs
-
-import (
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	"net/http"
-	"net/url"
-)
-
-// httpClient is the default HTTP client, but a variable so it can be
-// changed by tests, without modifying http.DefaultClient.
-var httpClient = http.DefaultClient
-
-// httpGET returns the data from an HTTP GET request for the given URL.
-func httpGET(url string) ([]byte, error) {
-	resp, err := httpClient.Get(url)
-	if err != nil {
-		return nil, err
-	}
-	defer resp.Body.Close()
-	if resp.StatusCode != 200 {
-		return nil, fmt.Errorf("%s: %s", url, resp.Status)
-	}
-	b, err := ioutil.ReadAll(resp.Body)
-	if err != nil {
-		return nil, fmt.Errorf("%s: %v", url, err)
-	}
-	return b, nil
-}
-
-// httpsOrHTTP returns the body of either the importPath's
-// https resource or, if unavailable, the http resource.
-func httpsOrHTTP(importPath string) (urlStr string, body io.ReadCloser, err error) {
-	fetch := func(scheme string) (urlStr string, res *http.Response, err error) {
-		u, err := url.Parse(scheme + "://" + importPath)
-		if err != nil {
-			return "", nil, err
-		}
-		u.RawQuery = "go-get=1"
-		urlStr = u.String()
-		if Verbose {
-			log.Printf("Fetching %s", urlStr)
-		}
-		res, err = httpClient.Get(urlStr)
-		return
-	}
-	closeBody := func(res *http.Response) {
-		if res != nil {
-			res.Body.Close()
-		}
-	}
-	urlStr, res, err := fetch("https")
-	if err != nil || res.StatusCode != 200 {
-		if Verbose {
-			if err != nil {
-				log.Printf("https fetch failed.")
-			} else {
-				log.Printf("ignoring https fetch with status code %d", res.StatusCode)
-			}
-		}
-		closeBody(res)
-		urlStr, res, err = fetch("http")
-	}
-	if err != nil {
-		closeBody(res)
-		return "", nil, err
-	}
-	// Note: accepting a non-200 OK here, so people can serve a
-	// meta import in their http 404 page.
-	if Verbose {
-		log.Printf("Parsing meta tags from %s (status code %d)", urlStr, res.StatusCode)
-	}
-	return urlStr, res.Body, nil
-}
diff --git a/third_party/gotools/go/vcs/vcs.go b/third_party/gotools/go/vcs/vcs.go
deleted file mode 100644
index d950a78..0000000
--- a/third_party/gotools/go/vcs/vcs.go
+++ /dev/null
@@ -1,754 +0,0 @@
-// Copyright 2012 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package vcs // import "llvm.org/llgo/third_party/gotools/go/vcs"
-
-import (
-	"bytes"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"regexp"
-	"strconv"
-	"strings"
-)
-
-// Verbose enables verbose operation logging.
-var Verbose bool
-
-// ShowCmd controls whether VCS commands are printed.
-var ShowCmd bool
-
-// A Cmd describes how to use a version control system
-// like Mercurial, Git, or Subversion.
-type Cmd struct {
-	Name string
-	Cmd  string // name of binary to invoke command
-
-	CreateCmd   string // command to download a fresh copy of a repository
-	DownloadCmd string // command to download updates into an existing repository
-
-	TagCmd         []TagCmd // commands to list tags
-	TagLookupCmd   []TagCmd // commands to lookup tags before running tagSyncCmd
-	TagSyncCmd     string   // command to sync to specific tag
-	TagSyncDefault string   // command to sync to default tag
-
-	LogCmd string // command to list repository changelogs in an XML format
-
-	Scheme  []string
-	PingCmd string
-}
-
-// A TagCmd describes a command to list available tags
-// that can be passed to Cmd.TagSyncCmd.
-type TagCmd struct {
-	Cmd     string // command to list tags
-	Pattern string // regexp to extract tags from list
-}
-
-// vcsList lists the known version control systems
-var vcsList = []*Cmd{
-	vcsHg,
-	vcsGit,
-	vcsSvn,
-	vcsBzr,
-}
-
-// ByCmd returns the version control system for the given
-// command name (hg, git, svn, bzr).
-func ByCmd(cmd string) *Cmd {
-	for _, vcs := range vcsList {
-		if vcs.Cmd == cmd {
-			return vcs
-		}
-	}
-	return nil
-}
-
-// vcsHg describes how to use Mercurial.
-var vcsHg = &Cmd{
-	Name: "Mercurial",
-	Cmd:  "hg",
-
-	CreateCmd:   "clone -U {repo} {dir}",
-	DownloadCmd: "pull",
-
-	// We allow both tag and branch names as 'tags'
-	// for selecting a version.  This lets people have
-	// a go.release.r60 branch and a go1 branch
-	// and make changes in both, without constantly
-	// editing .hgtags.
-	TagCmd: []TagCmd{
-		{"tags", `^(\S+)`},
-		{"branches", `^(\S+)`},
-	},
-	TagSyncCmd:     "update -r {tag}",
-	TagSyncDefault: "update default",
-
-	LogCmd: "log --encoding=utf-8 --limit={limit} --template={template}",
-
-	Scheme:  []string{"https", "http", "ssh"},
-	PingCmd: "identify {scheme}://{repo}",
-}
-
-// vcsGit describes how to use Git.
-var vcsGit = &Cmd{
-	Name: "Git",
-	Cmd:  "git",
-
-	CreateCmd:   "clone {repo} {dir}",
-	DownloadCmd: "pull --ff-only",
-
-	TagCmd: []TagCmd{
-		// tags/xxx matches a git tag named xxx
-		// origin/xxx matches a git branch named xxx on the default remote repository
-		{"show-ref", `(?:tags|origin)/(\S+)$`},
-	},
-	TagLookupCmd: []TagCmd{
-		{"show-ref tags/{tag} origin/{tag}", `((?:tags|origin)/\S+)$`},
-	},
-	TagSyncCmd:     "checkout {tag}",
-	TagSyncDefault: "checkout master",
-
-	Scheme:  []string{"git", "https", "http", "git+ssh"},
-	PingCmd: "ls-remote {scheme}://{repo}",
-}
-
-// vcsBzr describes how to use Bazaar.
-var vcsBzr = &Cmd{
-	Name: "Bazaar",
-	Cmd:  "bzr",
-
-	CreateCmd: "branch {repo} {dir}",
-
-	// Without --overwrite bzr will not pull tags that changed.
-	// Replace by --overwrite-tags after http://pad.lv/681792 goes in.
-	DownloadCmd: "pull --overwrite",
-
-	TagCmd:         []TagCmd{{"tags", `^(\S+)`}},
-	TagSyncCmd:     "update -r {tag}",
-	TagSyncDefault: "update -r revno:-1",
-
-	Scheme:  []string{"https", "http", "bzr", "bzr+ssh"},
-	PingCmd: "info {scheme}://{repo}",
-}
-
-// vcsSvn describes how to use Subversion.
-var vcsSvn = &Cmd{
-	Name: "Subversion",
-	Cmd:  "svn",
-
-	CreateCmd:   "checkout {repo} {dir}",
-	DownloadCmd: "update",
-
-	// There is no tag command in subversion.
-	// The branch information is all in the path names.
-
-	LogCmd: "log --xml --limit={limit}",
-
-	Scheme:  []string{"https", "http", "svn", "svn+ssh"},
-	PingCmd: "info {scheme}://{repo}",
-}
-
-func (v *Cmd) String() string {
-	return v.Name
-}
-
-// run runs the command line cmd in the given directory.
-// keyval is a list of key, value pairs.  run expands
-// instances of {key} in cmd into value, but only after
-// splitting cmd into individual arguments.
-// If an error occurs, run prints the command line and the
-// command's combined stdout+stderr to standard error.
-// Otherwise run discards the command's output.
-func (v *Cmd) run(dir string, cmd string, keyval ...string) error {
-	_, err := v.run1(dir, cmd, keyval, true)
-	return err
-}
-
-// runVerboseOnly is like run but only generates error output to standard error in verbose mode.
-func (v *Cmd) runVerboseOnly(dir string, cmd string, keyval ...string) error {
-	_, err := v.run1(dir, cmd, keyval, false)
-	return err
-}
-
-// runOutput is like run but returns the output of the command.
-func (v *Cmd) runOutput(dir string, cmd string, keyval ...string) ([]byte, error) {
-	return v.run1(dir, cmd, keyval, true)
-}
-
-// run1 is the generalized implementation of run and runOutput.
-func (v *Cmd) run1(dir string, cmdline string, keyval []string, verbose bool) ([]byte, error) {
-	m := make(map[string]string)
-	for i := 0; i < len(keyval); i += 2 {
-		m[keyval[i]] = keyval[i+1]
-	}
-	args := strings.Fields(cmdline)
-	for i, arg := range args {
-		args[i] = expand(m, arg)
-	}
-
-	_, err := exec.LookPath(v.Cmd)
-	if err != nil {
-		fmt.Fprintf(os.Stderr,
-			"go: missing %s command. See http://golang.org/s/gogetcmd\n",
-			v.Name)
-		return nil, err
-	}
-
-	cmd := exec.Command(v.Cmd, args...)
-	cmd.Dir = dir
-	cmd.Env = envForDir(cmd.Dir)
-	if ShowCmd {
-		fmt.Printf("cd %s\n", dir)
-		fmt.Printf("%s %s\n", v.Cmd, strings.Join(args, " "))
-	}
-	var buf bytes.Buffer
-	cmd.Stdout = &buf
-	cmd.Stderr = &buf
-	err = cmd.Run()
-	out := buf.Bytes()
-	if err != nil {
-		if verbose || Verbose {
-			fmt.Fprintf(os.Stderr, "# cd %s; %s %s\n", dir, v.Cmd, strings.Join(args, " "))
-			os.Stderr.Write(out)
-		}
-		return nil, err
-	}
-	return out, nil
-}
-
-// Ping pings the repo to determine if scheme used is valid.
-// This repo must be pingable with this scheme and VCS.
-func (v *Cmd) Ping(scheme, repo string) error {
-	return v.runVerboseOnly(".", v.PingCmd, "scheme", scheme, "repo", repo)
-}
-
-// Create creates a new copy of repo in dir.
-// The parent of dir must exist; dir must not.
-func (v *Cmd) Create(dir, repo string) error {
-	return v.run(".", v.CreateCmd, "dir", dir, "repo", repo)
-}
-
-// CreateAtRev creates a new copy of repo in dir at revision rev.
-// The parent of dir must exist; dir must not.
-// rev must be a valid revision in repo.
-func (v *Cmd) CreateAtRev(dir, repo, rev string) error {
-	if err := v.Create(dir, repo); err != nil {
-		return err
-	}
-	return v.run(dir, v.TagSyncCmd, "tag", rev)
-}
-
-// Download downloads any new changes for the repo in dir.
-// dir must be a valid VCS repo compatible with v.
-func (v *Cmd) Download(dir string) error {
-	return v.run(dir, v.DownloadCmd)
-}
-
-// Tags returns the list of available tags for the repo in dir.
-// dir must be a valid VCS repo compatible with v.
-func (v *Cmd) Tags(dir string) ([]string, error) {
-	var tags []string
-	for _, tc := range v.TagCmd {
-		out, err := v.runOutput(dir, tc.Cmd)
-		if err != nil {
-			return nil, err
-		}
-		re := regexp.MustCompile(`(?m-s)` + tc.Pattern)
-		for _, m := range re.FindAllStringSubmatch(string(out), -1) {
-			tags = append(tags, m[1])
-		}
-	}
-	return tags, nil
-}
-
-// TagSync syncs the repo in dir to the named tag,
-// which either is a tag returned by tags or is v.TagDefault.
-// dir must be a valid VCS repo compatible with v and the tag must exist.
-func (v *Cmd) TagSync(dir, tag string) error {
-	if v.TagSyncCmd == "" {
-		return nil
-	}
-	if tag != "" {
-		for _, tc := range v.TagLookupCmd {
-			out, err := v.runOutput(dir, tc.Cmd, "tag", tag)
-			if err != nil {
-				return err
-			}
-			re := regexp.MustCompile(`(?m-s)` + tc.Pattern)
-			m := re.FindStringSubmatch(string(out))
-			if len(m) > 1 {
-				tag = m[1]
-				break
-			}
-		}
-	}
-	if tag == "" && v.TagSyncDefault != "" {
-		return v.run(dir, v.TagSyncDefault)
-	}
-	return v.run(dir, v.TagSyncCmd, "tag", tag)
-}
-
-// Log logs the changes for the repo in dir.
-// dir must be a valid VCS repo compatible with v.
-func (v *Cmd) Log(dir, logTemplate string) ([]byte, error) {
-	if err := v.Download(dir); err != nil {
-		return []byte{}, err
-	}
-
-	const N = 50 // how many revisions to grab
-	return v.runOutput(dir, v.LogCmd, "limit", strconv.Itoa(N), "template", logTemplate)
-}
-
-// LogAtRev logs the change for repo in dir at the rev revision.
-// dir must be a valid VCS repo compatible with v.
-// rev must be a valid revision for the repo in dir.
-func (v *Cmd) LogAtRev(dir, rev, logTemplate string) ([]byte, error) {
-	if err := v.Download(dir); err != nil {
-		return []byte{}, err
-	}
-
-	// Append revision flag to LogCmd.
-	logAtRevCmd := v.LogCmd + " --rev=" + rev
-	return v.runOutput(dir, logAtRevCmd, "limit", strconv.Itoa(1), "template", logTemplate)
-}
-
-// A vcsPath describes how to convert an import path into a
-// version control system and repository name.
-type vcsPath struct {
-	prefix string                              // prefix this description applies to
-	re     string                              // pattern for import path
-	repo   string                              // repository to use (expand with match of re)
-	vcs    string                              // version control system to use (expand with match of re)
-	check  func(match map[string]string) error // additional checks
-	ping   bool                                // ping for scheme to use to download repo
-
-	regexp *regexp.Regexp // cached compiled form of re
-}
-
-// FromDir inspects dir and its parents to determine the
-// version control system and code repository to use.
-// On return, root is the import path
-// corresponding to the root of the repository
-// (thus root is a prefix of importPath).
-func FromDir(dir, srcRoot string) (vcs *Cmd, root string, err error) {
-	// Clean and double-check that dir is in (a subdirectory of) srcRoot.
-	dir = filepath.Clean(dir)
-	srcRoot = filepath.Clean(srcRoot)
-	if len(dir) <= len(srcRoot) || dir[len(srcRoot)] != filepath.Separator {
-		return nil, "", fmt.Errorf("directory %q is outside source root %q", dir, srcRoot)
-	}
-
-	for len(dir) > len(srcRoot) {
-		for _, vcs := range vcsList {
-			if fi, err := os.Stat(filepath.Join(dir, "."+vcs.Cmd)); err == nil && fi.IsDir() {
-				return vcs, dir[len(srcRoot)+1:], nil
-			}
-		}
-
-		// Move to parent.
-		ndir := filepath.Dir(dir)
-		if len(ndir) >= len(dir) {
-			// Shouldn't happen, but just in case, stop.
-			break
-		}
-		dir = ndir
-	}
-
-	return nil, "", fmt.Errorf("directory %q is not using a known version control system", dir)
-}
-
-// RepoRoot represents a version control system, a repo, and a root of
-// where to put it on disk.
-type RepoRoot struct {
-	VCS *Cmd
-
-	// repo is the repository URL, including scheme
-	Repo string
-
-	// root is the import path corresponding to the root of the
-	// repository
-	Root string
-}
-
-// RepoRootForImportPath analyzes importPath to determine the
-// version control system, and code repository to use.
-func RepoRootForImportPath(importPath string, verbose bool) (*RepoRoot, error) {
-	rr, err := RepoRootForImportPathStatic(importPath, "")
-	if err == errUnknownSite {
-		rr, err = RepoRootForImportDynamic(importPath, verbose)
-
-		// RepoRootForImportDynamic returns error detail
-		// that is irrelevant if the user didn't intend to use a
-		// dynamic import in the first place.
-		// Squelch it.
-		if err != nil {
-			if Verbose {
-				log.Printf("import %q: %v", importPath, err)
-			}
-			err = fmt.Errorf("unrecognized import path %q", importPath)
-		}
-	}
-
-	if err == nil && strings.Contains(importPath, "...") && strings.Contains(rr.Root, "...") {
-		// Do not allow wildcards in the repo root.
-		rr = nil
-		err = fmt.Errorf("cannot expand ... in %q", importPath)
-	}
-	return rr, err
-}
-
-var errUnknownSite = errors.New("dynamic lookup required to find mapping")
-
-// RepoRootForImportPathStatic attempts to map importPath to a
-// RepoRoot using the commonly-used VCS hosting sites in vcsPaths
-// (github.com/user/dir), or from a fully-qualified importPath already
-// containing its VCS type (foo.com/repo.git/dir)
-//
-// If scheme is non-empty, that scheme is forced.
-func RepoRootForImportPathStatic(importPath, scheme string) (*RepoRoot, error) {
-	if strings.Contains(importPath, "://") {
-		return nil, fmt.Errorf("invalid import path %q", importPath)
-	}
-	for _, srv := range vcsPaths {
-		if !strings.HasPrefix(importPath, srv.prefix) {
-			continue
-		}
-		m := srv.regexp.FindStringSubmatch(importPath)
-		if m == nil {
-			if srv.prefix != "" {
-				return nil, fmt.Errorf("invalid %s import path %q", srv.prefix, importPath)
-			}
-			continue
-		}
-
-		// Build map of named subexpression matches for expand.
-		match := map[string]string{
-			"prefix": srv.prefix,
-			"import": importPath,
-		}
-		for i, name := range srv.regexp.SubexpNames() {
-			if name != "" && match[name] == "" {
-				match[name] = m[i]
-			}
-		}
-		if srv.vcs != "" {
-			match["vcs"] = expand(match, srv.vcs)
-		}
-		if srv.repo != "" {
-			match["repo"] = expand(match, srv.repo)
-		}
-		if srv.check != nil {
-			if err := srv.check(match); err != nil {
-				return nil, err
-			}
-		}
-		vcs := ByCmd(match["vcs"])
-		if vcs == nil {
-			return nil, fmt.Errorf("unknown version control system %q", match["vcs"])
-		}
-		if srv.ping {
-			if scheme != "" {
-				match["repo"] = scheme + "://" + match["repo"]
-			} else {
-				for _, scheme := range vcs.Scheme {
-					if vcs.Ping(scheme, match["repo"]) == nil {
-						match["repo"] = scheme + "://" + match["repo"]
-						break
-					}
-				}
-			}
-		}
-		rr := &RepoRoot{
-			VCS:  vcs,
-			Repo: match["repo"],
-			Root: match["root"],
-		}
-		return rr, nil
-	}
-	return nil, errUnknownSite
-}
-
-// RepoRootForImportDynamic finds a *RepoRoot for a custom domain that's not
-// statically known by RepoRootForImportPathStatic.
-//
-// This handles "vanity import paths" like "name.tld/pkg/foo".
-func RepoRootForImportDynamic(importPath string, verbose bool) (*RepoRoot, error) {
-	slash := strings.Index(importPath, "/")
-	if slash < 0 {
-		return nil, errors.New("import path doesn't contain a slash")
-	}
-	host := importPath[:slash]
-	if !strings.Contains(host, ".") {
-		return nil, errors.New("import path doesn't contain a hostname")
-	}
-	urlStr, body, err := httpsOrHTTP(importPath)
-	if err != nil {
-		return nil, fmt.Errorf("http/https fetch: %v", err)
-	}
-	defer body.Close()
-	imports, err := parseMetaGoImports(body)
-	if err != nil {
-		return nil, fmt.Errorf("parsing %s: %v", importPath, err)
-	}
-	metaImport, err := matchGoImport(imports, importPath)
-	if err != nil {
-		if err != errNoMatch {
-			return nil, fmt.Errorf("parse %s: %v", urlStr, err)
-		}
-		return nil, fmt.Errorf("parse %s: no go-import meta tags", urlStr)
-	}
-	if verbose {
-		log.Printf("get %q: found meta tag %#v at %s", importPath, metaImport, urlStr)
-	}
-	// If the import was "uni.edu/bob/project", which said the
-	// prefix was "uni.edu" and the RepoRoot was "evilroot.com",
-	// make sure we don't trust Bob and check out evilroot.com to
-	// "uni.edu" yet (possibly overwriting/preempting another
-	// non-evil student).  Instead, first verify the root and see
-	// if it matches Bob's claim.
-	if metaImport.Prefix != importPath {
-		if verbose {
-			log.Printf("get %q: verifying non-authoritative meta tag", importPath)
-		}
-		urlStr0 := urlStr
-		urlStr, body, err = httpsOrHTTP(metaImport.Prefix)
-		if err != nil {
-			return nil, fmt.Errorf("fetch %s: %v", urlStr, err)
-		}
-		imports, err := parseMetaGoImports(body)
-		if err != nil {
-			return nil, fmt.Errorf("parsing %s: %v", importPath, err)
-		}
-		if len(imports) == 0 {
-			return nil, fmt.Errorf("fetch %s: no go-import meta tag", urlStr)
-		}
-		metaImport2, err := matchGoImport(imports, importPath)
-		if err != nil || metaImport != metaImport2 {
-			return nil, fmt.Errorf("%s and %s disagree about go-import for %s", urlStr0, urlStr, metaImport.Prefix)
-		}
-	}
-
-	if !strings.Contains(metaImport.RepoRoot, "://") {
-		return nil, fmt.Errorf("%s: invalid repo root %q; no scheme", urlStr, metaImport.RepoRoot)
-	}
-	rr := &RepoRoot{
-		VCS:  ByCmd(metaImport.VCS),
-		Repo: metaImport.RepoRoot,
-		Root: metaImport.Prefix,
-	}
-	if rr.VCS == nil {
-		return nil, fmt.Errorf("%s: unknown vcs %q", urlStr, metaImport.VCS)
-	}
-	return rr, nil
-}
-
-// metaImport represents the parsed <meta name="go-import"
-// content="prefix vcs reporoot" /> tags from HTML files.
-type metaImport struct {
-	Prefix, VCS, RepoRoot string
-}
-
-// errNoMatch is returned from matchGoImport when there's no applicable match.
-var errNoMatch = errors.New("no import match")
-
-// matchGoImport returns the metaImport from imports matching importPath.
-// An error is returned if there are multiple matches.
-// errNoMatch is returned if none match.
-func matchGoImport(imports []metaImport, importPath string) (_ metaImport, err error) {
-	match := -1
-	for i, im := range imports {
-		if !strings.HasPrefix(importPath, im.Prefix) {
-			continue
-		}
-		if match != -1 {
-			err = fmt.Errorf("multiple meta tags match import path %q", importPath)
-			return
-		}
-		match = i
-	}
-	if match == -1 {
-		err = errNoMatch
-		return
-	}
-	return imports[match], nil
-}
-
-// expand rewrites s to replace {k} with match[k] for each key k in match.
-func expand(match map[string]string, s string) string {
-	for k, v := range match {
-		s = strings.Replace(s, "{"+k+"}", v, -1)
-	}
-	return s
-}
-
-// vcsPaths lists the known vcs paths.
-var vcsPaths = []*vcsPath{
-	// go.googlesource.com
-	{
-		prefix: "go.googlesource.com",
-		re:     `^(?P<root>go\.googlesource\.com/[A-Za-z0-9_.\-]+/?)$`,
-		vcs:    "git",
-		repo:   "https://{root}",
-		check:  noVCSSuffix,
-	},
-
-	// Google Code - new syntax
-	{
-		prefix: "code.google.com/",
-		re:     `^(?P<root>code\.google\.com/[pr]/(?P<project>[a-z0-9\-]+)(\.(?P<subrepo>[a-z0-9\-]+))?)(/[A-Za-z0-9_.\-]+)*$`,
-		repo:   "https://{root}",
-		check:  googleCodeVCS,
-	},
-
-	// Google Code - old syntax
-	{
-		re:    `^(?P<project>[a-z0-9_\-.]+)\.googlecode\.com/(git|hg|svn)(?P<path>/.*)?$`,
-		check: oldGoogleCode,
-	},
-
-	// Github
-	{
-		prefix: "github.com/",
-		re:     `^(?P<root>github\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`,
-		vcs:    "git",
-		repo:   "https://{root}",
-		check:  noVCSSuffix,
-	},
-
-	// Bitbucket
-	{
-		prefix: "bitbucket.org/",
-		re:     `^(?P<root>bitbucket\.org/(?P<bitname>[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`,
-		repo:   "https://{root}",
-		check:  bitbucketVCS,
-	},
-
-	// Launchpad
-	{
-		prefix: "launchpad.net/",
-		re:     `^(?P<root>launchpad\.net/((?P<project>[A-Za-z0-9_.\-]+)(?P<series>/[A-Za-z0-9_.\-]+)?|~[A-Za-z0-9_.\-]+/(\+junk|[A-Za-z0-9_.\-]+)/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`,
-		vcs:    "bzr",
-		repo:   "https://{root}",
-		check:  launchpadVCS,
-	},
-
-	// General syntax for any server.
-	{
-		re:   `^(?P<root>(?P<repo>([a-z0-9.\-]+\.)+[a-z0-9.\-]+(:[0-9]+)?/[A-Za-z0-9_.\-/]*?)\.(?P<vcs>bzr|git|hg|svn))(/[A-Za-z0-9_.\-]+)*$`,
-		ping: true,
-	},
-}
-
-func init() {
-	// fill in cached regexps.
-	// Doing this eagerly discovers invalid regexp syntax
-	// without having to run a command that needs that regexp.
-	for _, srv := range vcsPaths {
-		srv.regexp = regexp.MustCompile(srv.re)
-	}
-}
-
-// noVCSSuffix checks that the repository name does not
-// end in .foo for any version control system foo.
-// The usual culprit is ".git".
-func noVCSSuffix(match map[string]string) error {
-	repo := match["repo"]
-	for _, vcs := range vcsList {
-		if strings.HasSuffix(repo, "."+vcs.Cmd) {
-			return fmt.Errorf("invalid version control suffix in %s path", match["prefix"])
-		}
-	}
-	return nil
-}
-
-var googleCheckout = regexp.MustCompile(`id="checkoutcmd">(hg|git|svn)`)
-
-// googleCodeVCS determines the version control system for
-// a code.google.com repository, by scraping the project's
-// /source/checkout page.
-func googleCodeVCS(match map[string]string) error {
-	if err := noVCSSuffix(match); err != nil {
-		return err
-	}
-	data, err := httpGET(expand(match, "https://code.google.com/p/{project}/source/checkout?repo={subrepo}"))
-	if err != nil {
-		return err
-	}
-
-	if m := googleCheckout.FindSubmatch(data); m != nil {
-		if vcs := ByCmd(string(m[1])); vcs != nil {
-			// Subversion requires the old URLs.
-			// TODO: Test.
-			if vcs == vcsSvn {
-				if match["subrepo"] != "" {
-					return fmt.Errorf("sub-repositories not supported in Google Code Subversion projects")
-				}
-				match["repo"] = expand(match, "https://{project}.googlecode.com/svn")
-			}
-			match["vcs"] = vcs.Cmd
-			return nil
-		}
-	}
-
-	return fmt.Errorf("unable to detect version control system for code.google.com/ path")
-}
-
-// oldGoogleCode is invoked for old-style foo.googlecode.com paths.
-// It prints an error giving the equivalent new path.
-func oldGoogleCode(match map[string]string) error {
-	return fmt.Errorf("invalid Google Code import path: use %s instead",
-		expand(match, "code.google.com/p/{project}{path}"))
-}
-
-// bitbucketVCS determines the version control system for a
-// Bitbucket repository, by using the Bitbucket API.
-func bitbucketVCS(match map[string]string) error {
-	if err := noVCSSuffix(match); err != nil {
-		return err
-	}
-
-	var resp struct {
-		SCM string `json:"scm"`
-	}
-	url := expand(match, "https://api.bitbucket.org/1.0/repositories/{bitname}")
-	data, err := httpGET(url)
-	if err != nil {
-		return err
-	}
-	if err := json.Unmarshal(data, &resp); err != nil {
-		return fmt.Errorf("decoding %s: %v", url, err)
-	}
-
-	if ByCmd(resp.SCM) != nil {
-		match["vcs"] = resp.SCM
-		if resp.SCM == "git" {
-			match["repo"] += ".git"
-		}
-		return nil
-	}
-
-	return fmt.Errorf("unable to detect version control system for bitbucket.org/ path")
-}
-
-// launchpadVCS solves the ambiguity for "lp.net/project/foo". In this case,
-// "foo" could be a series name registered in Launchpad with its own branch,
-// and it could also be the name of a directory within the main project
-// branch one level up.
-func launchpadVCS(match map[string]string) error {
-	if match["project"] == "" || match["series"] == "" {
-		return nil
-	}
-	_, err := httpGET(expand(match, "https://code.launchpad.net/{project}{series}/.bzr/branch-format"))
-	if err != nil {
-		match["root"] = expand(match, "launchpad.net/{project}")
-		match["repo"] = expand(match, "https://{root}")
-	}
-	return nil
-}
diff --git a/third_party/gotools/go/vcs/vcs_test.go b/third_party/gotools/go/vcs/vcs_test.go
deleted file mode 100644
index 226a3e4..0000000
--- a/third_party/gotools/go/vcs/vcs_test.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2013 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package vcs
-
-import (
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"reflect"
-	"strings"
-	"testing"
-)
-
-// Test that RepoRootForImportPath creates the correct RepoRoot for a given importPath.
-// TODO(cmang): Add tests for SVN and BZR.
-func TestRepoRootForImportPath(t *testing.T) {
-	tests := []struct {
-		path string
-		want *RepoRoot
-	}{
-		{
-			"code.google.com/p/go",
-			&RepoRoot{
-				VCS:  vcsHg,
-				Repo: "https://code.google.com/p/go",
-			},
-		},
-		{
-			"code.google.com/r/go",
-			&RepoRoot{
-				VCS:  vcsHg,
-				Repo: "https://code.google.com/r/go",
-			},
-		},
-		{
-			"github.com/golang/groupcache",
-			&RepoRoot{
-				VCS:  vcsGit,
-				Repo: "https://github.com/golang/groupcache",
-			},
-		},
-	}
-
-	for _, test := range tests {
-		got, err := RepoRootForImportPath(test.path, false)
-		if err != nil {
-			t.Errorf("RepoRootForImport(%q): %v", test.path, err)
-			continue
-		}
-		want := test.want
-		if got.VCS.Name != want.VCS.Name || got.Repo != want.Repo {
-			t.Errorf("RepoRootForImport(%q) = VCS(%s) Repo(%s), want VCS(%s) Repo(%s)", test.path, got.VCS, got.Repo, want.VCS, want.Repo)
-		}
-	}
-}
-
-// Test that FromDir correctly inspects a given directory and returns the right VCS.
-func TestFromDir(t *testing.T) {
-	type testStruct struct {
-		path string
-		want *Cmd
-	}
-
-	tests := make([]testStruct, len(vcsList))
-	tempDir, err := ioutil.TempDir("", "vcstest")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(tempDir)
-
-	for i, vcs := range vcsList {
-		tests[i] = testStruct{
-			filepath.Join(tempDir, vcs.Name, "."+vcs.Cmd),
-			vcs,
-		}
-	}
-
-	for _, test := range tests {
-		os.MkdirAll(test.path, 0755)
-		got, _, _ := FromDir(test.path, tempDir)
-		if got.Name != test.want.Name {
-			t.Errorf("FromDir(%q, %q) = %s, want %s", test.path, tempDir, got, test.want)
-		}
-		os.RemoveAll(test.path)
-	}
-}
-
-var parseMetaGoImportsTests = []struct {
-	in  string
-	out []metaImport
-}{
-	{
-		`<meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">`,
-		[]metaImport{{"foo/bar", "git", "https://github.com/rsc/foo/bar"}},
-	},
-	{
-		`<meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">
-		<meta name="go-import" content="baz/quux git http://github.com/rsc/baz/quux">`,
-		[]metaImport{
-			{"foo/bar", "git", "https://github.com/rsc/foo/bar"},
-			{"baz/quux", "git", "http://github.com/rsc/baz/quux"},
-		},
-	},
-	{
-		`<head>
-		<meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">
-		</head>`,
-		[]metaImport{{"foo/bar", "git", "https://github.com/rsc/foo/bar"}},
-	},
-	{
-		`<meta name="go-import" content="foo/bar git https://github.com/rsc/foo/bar">
-		<body>`,
-		[]metaImport{{"foo/bar", "git", "https://github.com/rsc/foo/bar"}},
-	},
-}
-
-func TestParseMetaGoImports(t *testing.T) {
-	for i, tt := range parseMetaGoImportsTests {
-		out, err := parseMetaGoImports(strings.NewReader(tt.in))
-		if err != nil {
-			t.Errorf("test#%d: %v", i, err)
-			continue
-		}
-		if !reflect.DeepEqual(out, tt.out) {
-			t.Errorf("test#%d:\n\thave %q\n\twant %q", i, out, tt.out)
-		}
-	}
-}
diff --git a/third_party/liner/COPYING b/third_party/liner/COPYING
deleted file mode 100644
index 9e8c9f2..0000000
--- a/third_party/liner/COPYING
+++ /dev/null
@@ -1,21 +0,0 @@
-Copyright © 2012 Peter Harris
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice (including the next
-paragraph) shall be included in all copies or substantial portions of the
-Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
diff --git a/third_party/liner/README.md b/third_party/liner/README.md
deleted file mode 100644
index 9148b24..0000000
--- a/third_party/liner/README.md
+++ /dev/null
@@ -1,100 +0,0 @@
-Liner
-=====
-
-Liner is a command line editor with history. It was inspired by linenoise;
-everything Unix-like is a VT100 (or is trying very hard to be). If your
-terminal is not pretending to be a VT100, change it. Liner also support
-Windows.
-
-Liner is released under the X11 license (which is similar to the new BSD
-license).
-
-Line Editing
-------------
-
-The following line editing commands are supported on platforms and terminals
-that Liner supports:
-
-Keystroke    | Action
----------    | ------
-Ctrl-A, Home | Move cursor to beginning of line
-Ctrl-E, End  | Move cursor to end of line
-Ctrl-B, Left | Move cursor one character left
-Ctrl-F, Right| Move cursor one character right
-Ctrl-Left, Alt-B    | Move cursor to previous word
-Ctrl-Right, Alt-F   | Move cursor to next word
-Ctrl-D, Del  | (if line is *not* empty) Delete character under cursor
-Ctrl-D       | (if line *is* empty) End of File - usually quits application
-Ctrl-C       | Reset input (create new empty prompt)
-Ctrl-L       | Clear screen (line is unmodified)
-Ctrl-T       | Transpose previous character with current character
-Ctrl-H, BackSpace | Delete character before cursor
-Ctrl-W       | Delete word leading up to cursor
-Ctrl-K       | Delete from cursor to end of line
-Ctrl-U       | Delete from start of line to cursor
-Ctrl-P, Up   | Previous match from history
-Ctrl-N, Down | Next match from history
-Ctrl-R       | Reverse Search history (Ctrl-S forward, Ctrl-G cancel)
-Ctrl-Y       | Paste from Yank buffer (Alt-Y to paste next yank instead)
-Tab          | Next completion
-Shift-Tab    | (after Tab) Previous completion
-
-Getting started
------------------
-
-```go
-package main
-
-import (
-	"log"
-	"os"
-	"path/filepath"
-	"strings"
-
-	"github.com/peterh/liner"
-)
-
-var (
-	history_fn = filepath.Join(os.TempDir(), ".liner_example_history")
-	names      = []string{"john", "james", "mary", "nancy"}
-)
-
-func main() {
-	line := liner.NewLiner()
-	defer line.Close()
-
-	line.SetCtrlCAborts(true)
-
-	line.SetCompleter(func(line string) (c []string) {
-		for _, n := range names {
-			if strings.HasPrefix(n, strings.ToLower(line)) {
-				c = append(c, n)
-			}
-		}
-		return
-	})
-
-	if f, err := os.Open(history_fn); err == nil {
-		line.ReadHistory(f)
-		f.Close()
-	}
-
-	if name, err := line.Prompt("What is your name? "); err == nil {
-		log.Print("Got: ", name)
-		line.AppendHistory(name)
-	} else if err == liner.ErrPromptAborted {
-		log.Print("Aborted")
-	} else {
-		log.Print("Error reading line: ", err)
-	}
-
-	if f, err := os.Create(history_fn); err != nil {
-		log.Print("Error writing history file: ", err)
-	} else {
-		line.WriteHistory(f)
-		f.Close()
-	}
-}
-```
-
-For documentation, see http://godoc.org/github.com/peterh/liner
diff --git a/third_party/liner/bsdinput.go b/third_party/liner/bsdinput.go
deleted file mode 100644
index 4b552d4..0000000
--- a/third_party/liner/bsdinput.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// +build openbsd freebsd netbsd
-
-package liner
-
-import "syscall"
-
-const (
-	getTermios = syscall.TIOCGETA
-	setTermios = syscall.TIOCSETA
-)
-
-const (
-	// Input flags
-	inpck  = 0x010
-	istrip = 0x020
-	icrnl  = 0x100
-	ixon   = 0x200
-
-	// Output flags
-	opost = 0x1
-
-	// Control flags
-	cs8 = 0x300
-
-	// Local flags
-	isig   = 0x080
-	icanon = 0x100
-	iexten = 0x400
-)
-
-type termios struct {
-	Iflag  uint32
-	Oflag  uint32
-	Cflag  uint32
-	Lflag  uint32
-	Cc     [20]byte
-	Ispeed int32
-	Ospeed int32
-}
diff --git a/third_party/liner/common.go b/third_party/liner/common.go
deleted file mode 100644
index 53b8f8f..0000000
--- a/third_party/liner/common.go
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
-Package liner implements a simple command line editor, inspired by linenoise
-(https://github.com/antirez/linenoise/). This package supports WIN32 in
-addition to the xterm codes supported by everything else.
-*/
-package liner
-
-import (
-	"bufio"
-	"bytes"
-	"container/ring"
-	"errors"
-	"fmt"
-	"io"
-	"strings"
-	"sync"
-	"unicode/utf8"
-)
-
-type commonState struct {
-	terminalSupported bool
-	outputRedirected  bool
-	inputRedirected   bool
-	history           []string
-	historyMutex      sync.RWMutex
-	completer         WordCompleter
-	columns           int
-	killRing          *ring.Ring
-	ctrlCAborts       bool
-	r                 *bufio.Reader
-	tabStyle          TabStyle
-	multiLineMode     bool
-	cursorRows        int
-	maxRows           int
-}
-
-// TabStyle is used to select how tab completions are displayed.
-type TabStyle int
-
-// Two tab styles are currently available:
-//
-// TabCircular cycles through each completion item and displays it directly on
-// the prompt
-//
-// TabPrints prints the list of completion items to the screen after a second
-// tab key is pressed. This behaves similar to GNU readline and BASH (which
-// uses readline)
-const (
-	TabCircular TabStyle = iota
-	TabPrints
-)
-
-// ErrPromptAborted is returned from Prompt or PasswordPrompt when the user presses Ctrl-C
-// if SetCtrlCAborts(true) has been called on the State
-var ErrPromptAborted = errors.New("prompt aborted")
-
-// ErrNotTerminalOutput is returned from Prompt or PasswordPrompt if the
-// platform is normally supported, but stdout has been redirected
-var ErrNotTerminalOutput = errors.New("standard output is not a terminal")
-
-// Max elements to save on the killring
-const KillRingMax = 60
-
-// HistoryLimit is the maximum number of entries saved in the scrollback history.
-const HistoryLimit = 1000
-
-// ReadHistory reads scrollback history from r. Returns the number of lines
-// read, and any read error (except io.EOF).
-func (s *State) ReadHistory(r io.Reader) (num int, err error) {
-	s.historyMutex.Lock()
-	defer s.historyMutex.Unlock()
-
-	in := bufio.NewReader(r)
-	num = 0
-	for {
-		line, part, err := in.ReadLine()
-		if err == io.EOF {
-			break
-		}
-		if err != nil {
-			return num, err
-		}
-		if part {
-			return num, fmt.Errorf("line %d is too long", num+1)
-		}
-		if !utf8.Valid(line) {
-			return num, fmt.Errorf("invalid string at line %d", num+1)
-		}
-		num++
-		s.history = append(s.history, string(line))
-		if len(s.history) > HistoryLimit {
-			s.history = s.history[1:]
-		}
-	}
-	return num, nil
-}
-
-// WriteHistory writes scrollback history to w. Returns the number of lines
-// successfully written, and any write error.
-//
-// Unlike the rest of liner's API, WriteHistory is safe to call
-// from another goroutine while Prompt is in progress.
-// This exception is to facilitate the saving of the history buffer
-// during an unexpected exit (for example, due to Ctrl-C being invoked)
-func (s *State) WriteHistory(w io.Writer) (num int, err error) {
-	s.historyMutex.RLock()
-	defer s.historyMutex.RUnlock()
-
-	for _, item := range s.history {
-		_, err := fmt.Fprintln(w, item)
-		if err != nil {
-			return num, err
-		}
-		num++
-	}
-	return num, nil
-}
-
-// AppendHistory appends an entry to the scrollback history. AppendHistory
-// should be called iff Prompt returns a valid command.
-func (s *State) AppendHistory(item string) {
-	s.historyMutex.Lock()
-	defer s.historyMutex.Unlock()
-
-	if len(s.history) > 0 {
-		if item == s.history[len(s.history)-1] {
-			return
-		}
-	}
-	s.history = append(s.history, item)
-	if len(s.history) > HistoryLimit {
-		s.history = s.history[1:]
-	}
-}
-
-// Returns the history lines starting with prefix
-func (s *State) getHistoryByPrefix(prefix string) (ph []string) {
-	for _, h := range s.history {
-		if strings.HasPrefix(h, prefix) {
-			ph = append(ph, h)
-		}
-	}
-	return
-}
-
-// Returns the history lines matching the inteligent search
-func (s *State) getHistoryByPattern(pattern string) (ph []string, pos []int) {
-	if pattern == "" {
-		return
-	}
-	for _, h := range s.history {
-		if i := strings.Index(h, pattern); i >= 0 {
-			ph = append(ph, h)
-			pos = append(pos, i)
-		}
-	}
-	return
-}
-
-// Completer takes the currently edited line content at the left of the cursor
-// and returns a list of completion candidates.
-// If the line is "Hello, wo!!!" and the cursor is before the first '!', "Hello, wo" is passed
-// to the completer which may return {"Hello, world", "Hello, Word"} to have "Hello, world!!!".
-type Completer func(line string) []string
-
-// WordCompleter takes the currently edited line with the cursor position and
-// returns the completion candidates for the partial word to be completed.
-// If the line is "Hello, wo!!!" and the cursor is before the first '!', ("Hello, wo!!!", 9) is passed
-// to the completer which may returns ("Hello, ", {"world", "Word"}, "!!!") to have "Hello, world!!!".
-type WordCompleter func(line string, pos int) (head string, completions []string, tail string)
-
-// SetCompleter sets the completion function that Liner will call to
-// fetch completion candidates when the user presses tab.
-func (s *State) SetCompleter(f Completer) {
-	if f == nil {
-		s.completer = nil
-		return
-	}
-	s.completer = func(line string, pos int) (string, []string, string) {
-		return "", f(line[:pos]), line[pos:]
-	}
-}
-
-// SetWordCompleter sets the completion function that Liner will call to
-// fetch completion candidates when the user presses tab.
-func (s *State) SetWordCompleter(f WordCompleter) {
-	s.completer = f
-}
-
-// SetTabCompletionStyle sets the behvavior when the Tab key is pressed
-// for auto-completion.  TabCircular is the default behavior and cycles
-// through the list of candidates at the prompt.  TabPrints will print
-// the available completion candidates to the screen similar to BASH
-// and GNU Readline
-func (s *State) SetTabCompletionStyle(tabStyle TabStyle) {
-	s.tabStyle = tabStyle
-}
-
-// ModeApplier is the interface that wraps a representation of the terminal
-// mode. ApplyMode sets the terminal to this mode.
-type ModeApplier interface {
-	ApplyMode() error
-}
-
-// SetCtrlCAborts sets whether Prompt on a supported terminal will return an
-// ErrPromptAborted when Ctrl-C is pressed. The default is false (will not
-// return when Ctrl-C is pressed). Unsupported terminals typically raise SIGINT
-// (and Prompt does not return) regardless of the value passed to SetCtrlCAborts.
-func (s *State) SetCtrlCAborts(aborts bool) {
-	s.ctrlCAborts = aborts
-}
-
-// SetMultiLineMode sets whether line is auto-wrapped. The default is false (single line).
-func (s *State) SetMultiLineMode(mlmode bool) {
-	s.multiLineMode = mlmode
-}
-
-func (s *State) promptUnsupported(p string) (string, error) {
-	if !s.inputRedirected || !s.terminalSupported {
-		fmt.Print(p)
-	}
-	linebuf, _, err := s.r.ReadLine()
-	if err != nil {
-		return "", err
-	}
-	return string(bytes.TrimSpace(linebuf)), nil
-}
diff --git a/third_party/liner/fallbackinput.go b/third_party/liner/fallbackinput.go
deleted file mode 100644
index d9eb79d..0000000
--- a/third_party/liner/fallbackinput.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// +build !windows,!linux,!darwin,!openbsd,!freebsd,!netbsd
-
-package liner
-
-import (
-	"bufio"
-	"errors"
-	"os"
-)
-
-// State represents an open terminal
-type State struct {
-	commonState
-}
-
-// Prompt displays p, and then waits for user input. Prompt does not support
-// line editing on this operating system.
-func (s *State) Prompt(p string) (string, error) {
-	return s.promptUnsupported(p)
-}
-
-// PasswordPrompt is not supported in this OS.
-func (s *State) PasswordPrompt(p string) (string, error) {
-	return "", errors.New("liner: function not supported in this terminal")
-}
-
-// NewLiner initializes a new *State
-//
-// Note that this operating system uses a fallback mode without line
-// editing. Patches welcome.
-func NewLiner() *State {
-	var s State
-	s.r = bufio.NewReader(os.Stdin)
-	return &s
-}
-
-// Close returns the terminal to its previous mode
-func (s *State) Close() error {
-	return nil
-}
-
-// TerminalSupported returns false because line editing is not
-// supported on this platform.
-func TerminalSupported() bool {
-	return false
-}
-
-type noopMode struct{}
-
-func (n noopMode) ApplyMode() error {
-	return nil
-}
-
-// TerminalMode returns a noop InputModeSetter on this platform.
-func TerminalMode() (ModeApplier, error) {
-	return noopMode{}, nil
-}
diff --git a/third_party/liner/input.go b/third_party/liner/input.go
deleted file mode 100644
index c80c85f..0000000
--- a/third_party/liner/input.go
+++ /dev/null
@@ -1,368 +0,0 @@
-// +build linux darwin openbsd freebsd netbsd
-
-package liner
-
-import (
-	"bufio"
-	"errors"
-	"os"
-	"os/signal"
-	"strconv"
-	"strings"
-	"syscall"
-	"time"
-)
-
-type nexter struct {
-	r   rune
-	err error
-}
-
-// State represents an open terminal
-type State struct {
-	commonState
-	origMode    termios
-	defaultMode termios
-	next        <-chan nexter
-	winch       chan os.Signal
-	pending     []rune
-	useCHA      bool
-}
-
-// NewLiner initializes a new *State, and sets the terminal into raw mode. To
-// restore the terminal to its previous state, call State.Close().
-//
-// Note if you are still using Go 1.0: NewLiner handles SIGWINCH, so it will
-// leak a channel every time you call it. Therefore, it is recommened that you
-// upgrade to a newer release of Go, or ensure that NewLiner is only called
-// once.
-func NewLiner() *State {
-	var s State
-	s.r = bufio.NewReader(os.Stdin)
-
-	s.terminalSupported = TerminalSupported()
-	if m, err := TerminalMode(); err == nil {
-		s.origMode = *m.(*termios)
-	} else {
-		s.inputRedirected = true
-	}
-	if _, err := getMode(syscall.Stdout); err != 0 {
-		s.outputRedirected = true
-	}
-	if s.inputRedirected && s.outputRedirected {
-		s.terminalSupported = false
-	}
-	if s.terminalSupported && !s.inputRedirected && !s.outputRedirected {
-		mode := s.origMode
-		mode.Iflag &^= icrnl | inpck | istrip | ixon
-		mode.Cflag |= cs8
-		mode.Lflag &^= syscall.ECHO | icanon | iexten
-		mode.ApplyMode()
-
-		winch := make(chan os.Signal, 1)
-		signal.Notify(winch, syscall.SIGWINCH)
-		s.winch = winch
-
-		s.checkOutput()
-	}
-
-	if !s.outputRedirected {
-		s.getColumns()
-		s.outputRedirected = s.columns <= 0
-	}
-
-	return &s
-}
-
-var errTimedOut = errors.New("timeout")
-
-func (s *State) startPrompt() {
-	if s.terminalSupported {
-		if m, err := TerminalMode(); err == nil {
-			s.defaultMode = *m.(*termios)
-			mode := s.defaultMode
-			mode.Lflag &^= isig
-			mode.ApplyMode()
-		}
-	}
-	s.restartPrompt()
-}
-
-func (s *State) restartPrompt() {
-	next := make(chan nexter)
-	go func() {
-		for {
-			var n nexter
-			n.r, _, n.err = s.r.ReadRune()
-			next <- n
-			// Shut down nexter loop when an end condition has been reached
-			if n.err != nil || n.r == '\n' || n.r == '\r' || n.r == ctrlC || n.r == ctrlD {
-				close(next)
-				return
-			}
-		}
-	}()
-	s.next = next
-}
-
-func (s *State) stopPrompt() {
-	if s.terminalSupported {
-		s.defaultMode.ApplyMode()
-	}
-}
-
-func (s *State) nextPending(timeout <-chan time.Time) (rune, error) {
-	select {
-	case thing, ok := <-s.next:
-		if !ok {
-			return 0, errors.New("liner: internal error")
-		}
-		if thing.err != nil {
-			return 0, thing.err
-		}
-		s.pending = append(s.pending, thing.r)
-		return thing.r, nil
-	case <-timeout:
-		rv := s.pending[0]
-		s.pending = s.pending[1:]
-		return rv, errTimedOut
-	}
-	// not reached
-	return 0, nil
-}
-
-func (s *State) readNext() (interface{}, error) {
-	if len(s.pending) > 0 {
-		rv := s.pending[0]
-		s.pending = s.pending[1:]
-		return rv, nil
-	}
-	var r rune
-	select {
-	case thing, ok := <-s.next:
-		if !ok {
-			return 0, errors.New("liner: internal error")
-		}
-		if thing.err != nil {
-			return nil, thing.err
-		}
-		r = thing.r
-	case <-s.winch:
-		s.getColumns()
-		return winch, nil
-	}
-	if r != esc {
-		return r, nil
-	}
-	s.pending = append(s.pending, r)
-
-	// Wait at most 50 ms for the rest of the escape sequence
-	// If nothing else arrives, it was an actual press of the esc key
-	timeout := time.After(50 * time.Millisecond)
-	flag, err := s.nextPending(timeout)
-	if err != nil {
-		if err == errTimedOut {
-			return flag, nil
-		}
-		return unknown, err
-	}
-
-	switch flag {
-	case '[':
-		code, err := s.nextPending(timeout)
-		if err != nil {
-			if err == errTimedOut {
-				return code, nil
-			}
-			return unknown, err
-		}
-		switch code {
-		case 'A':
-			s.pending = s.pending[:0] // escape code complete
-			return up, nil
-		case 'B':
-			s.pending = s.pending[:0] // escape code complete
-			return down, nil
-		case 'C':
-			s.pending = s.pending[:0] // escape code complete
-			return right, nil
-		case 'D':
-			s.pending = s.pending[:0] // escape code complete
-			return left, nil
-		case 'F':
-			s.pending = s.pending[:0] // escape code complete
-			return end, nil
-		case 'H':
-			s.pending = s.pending[:0] // escape code complete
-			return home, nil
-		case 'Z':
-			s.pending = s.pending[:0] // escape code complete
-			return shiftTab, nil
-		case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
-			num := []rune{code}
-			for {
-				code, err := s.nextPending(timeout)
-				if err != nil {
-					if err == errTimedOut {
-						return code, nil
-					}
-					return nil, err
-				}
-				switch code {
-				case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
-					num = append(num, code)
-				case ';':
-					// Modifier code to follow
-					// This only supports Ctrl-left and Ctrl-right for now
-					x, _ := strconv.ParseInt(string(num), 10, 32)
-					if x != 1 {
-						// Can't be left or right
-						rv := s.pending[0]
-						s.pending = s.pending[1:]
-						return rv, nil
-					}
-					num = num[:0]
-					for {
-						code, err = s.nextPending(timeout)
-						if err != nil {
-							if err == errTimedOut {
-								rv := s.pending[0]
-								s.pending = s.pending[1:]
-								return rv, nil
-							}
-							return nil, err
-						}
-						switch code {
-						case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
-							num = append(num, code)
-						case 'C', 'D':
-							// right, left
-							mod, _ := strconv.ParseInt(string(num), 10, 32)
-							if mod != 5 {
-								// Not bare Ctrl
-								rv := s.pending[0]
-								s.pending = s.pending[1:]
-								return rv, nil
-							}
-							s.pending = s.pending[:0] // escape code complete
-							if code == 'C' {
-								return wordRight, nil
-							}
-							return wordLeft, nil
-						default:
-							// Not left or right
-							rv := s.pending[0]
-							s.pending = s.pending[1:]
-							return rv, nil
-						}
-					}
-				case '~':
-					s.pending = s.pending[:0] // escape code complete
-					x, _ := strconv.ParseInt(string(num), 10, 32)
-					switch x {
-					case 2:
-						return insert, nil
-					case 3:
-						return del, nil
-					case 5:
-						return pageUp, nil
-					case 6:
-						return pageDown, nil
-					case 7:
-						return home, nil
-					case 8:
-						return end, nil
-					case 15:
-						return f5, nil
-					case 17:
-						return f6, nil
-					case 18:
-						return f7, nil
-					case 19:
-						return f8, nil
-					case 20:
-						return f9, nil
-					case 21:
-						return f10, nil
-					case 23:
-						return f11, nil
-					case 24:
-						return f12, nil
-					default:
-						return unknown, nil
-					}
-				default:
-					// unrecognized escape code
-					rv := s.pending[0]
-					s.pending = s.pending[1:]
-					return rv, nil
-				}
-			}
-		}
-
-	case 'O':
-		code, err := s.nextPending(timeout)
-		if err != nil {
-			if err == errTimedOut {
-				return code, nil
-			}
-			return nil, err
-		}
-		s.pending = s.pending[:0] // escape code complete
-		switch code {
-		case 'c':
-			return wordRight, nil
-		case 'd':
-			return wordLeft, nil
-		case 'H':
-			return home, nil
-		case 'F':
-			return end, nil
-		case 'P':
-			return f1, nil
-		case 'Q':
-			return f2, nil
-		case 'R':
-			return f3, nil
-		case 'S':
-			return f4, nil
-		default:
-			return unknown, nil
-		}
-	case 'b':
-		s.pending = s.pending[:0] // escape code complete
-		return altB, nil
-	case 'f':
-		s.pending = s.pending[:0] // escape code complete
-		return altF, nil
-	case 'y':
-		s.pending = s.pending[:0] // escape code complete
-		return altY, nil
-	default:
-		rv := s.pending[0]
-		s.pending = s.pending[1:]
-		return rv, nil
-	}
-
-	// not reached
-	return r, nil
-}
-
-// Close returns the terminal to its previous mode
-func (s *State) Close() error {
-	stopSignal(s.winch)
-	if !s.inputRedirected {
-		s.origMode.ApplyMode()
-	}
-	return nil
-}
-
-// TerminalSupported returns true if the current terminal supports
-// line editing features, and false if liner will use the 'dumb'
-// fallback for input.
-// Note that TerminalSupported does not check all factors that may
-// cause liner to not fully support the terminal (such as stdin redirection)
-func TerminalSupported() bool {
-	bad := map[string]bool{"": true, "dumb": true, "cons25": true}
-	return !bad[strings.ToLower(os.Getenv("TERM"))]
-}
diff --git a/third_party/liner/input_darwin.go b/third_party/liner/input_darwin.go
deleted file mode 100644
index 23c9c5d..0000000
--- a/third_party/liner/input_darwin.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// +build darwin
-
-package liner
-
-import "syscall"
-
-const (
-	getTermios = syscall.TIOCGETA
-	setTermios = syscall.TIOCSETA
-)
-
-const (
-	// Input flags
-	inpck  = 0x010
-	istrip = 0x020
-	icrnl  = 0x100
-	ixon   = 0x200
-
-	// Output flags
-	opost = 0x1
-
-	// Control flags
-	cs8 = 0x300
-
-	// Local flags
-	isig   = 0x080
-	icanon = 0x100
-	iexten = 0x400
-)
-
-type termios struct {
-	Iflag  uintptr
-	Oflag  uintptr
-	Cflag  uintptr
-	Lflag  uintptr
-	Cc     [20]byte
-	Ispeed uintptr
-	Ospeed uintptr
-}
diff --git a/third_party/liner/input_linux.go b/third_party/liner/input_linux.go
deleted file mode 100644
index 6ca8712..0000000
--- a/third_party/liner/input_linux.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// +build linux
-
-package liner
-
-import "syscall"
-
-const (
-	getTermios = syscall.TCGETS
-	setTermios = syscall.TCSETS
-)
-
-const (
-	icrnl  = syscall.ICRNL
-	inpck  = syscall.INPCK
-	istrip = syscall.ISTRIP
-	ixon   = syscall.IXON
-	opost  = syscall.OPOST
-	cs8    = syscall.CS8
-	isig   = syscall.ISIG
-	icanon = syscall.ICANON
-	iexten = syscall.IEXTEN
-)
-
-type termios struct {
-	syscall.Termios
-}
diff --git a/third_party/liner/input_test.go b/third_party/liner/input_test.go
deleted file mode 100644
index e515a48..0000000
--- a/third_party/liner/input_test.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// +build !windows
-
-package liner
-
-import (
-	"bufio"
-	"bytes"
-	"testing"
-)
-
-func (s *State) expectRune(t *testing.T, r rune) {
-	item, err := s.readNext()
-	if err != nil {
-		t.Fatalf("Expected rune '%c', got error %s\n", r, err)
-	}
-	if v, ok := item.(rune); !ok {
-		t.Fatalf("Expected rune '%c', got non-rune %v\n", r, v)
-	} else {
-		if v != r {
-			t.Fatalf("Expected rune '%c', got rune '%c'\n", r, v)
-		}
-	}
-}
-
-func (s *State) expectAction(t *testing.T, a action) {
-	item, err := s.readNext()
-	if err != nil {
-		t.Fatalf("Expected Action %d, got error %s\n", a, err)
-	}
-	if v, ok := item.(action); !ok {
-		t.Fatalf("Expected Action %d, got non-Action %v\n", a, v)
-	} else {
-		if v != a {
-			t.Fatalf("Expected Action %d, got Action %d\n", a, v)
-		}
-	}
-}
-
-func TestTypes(t *testing.T) {
-	input := []byte{'A', 27, 'B', 27, 91, 68, 27, '[', '1', ';', '5', 'D', 'e'}
-	var s State
-	s.r = bufio.NewReader(bytes.NewBuffer(input))
-
-	next := make(chan nexter)
-	go func() {
-		for {
-			var n nexter
-			n.r, _, n.err = s.r.ReadRune()
-			next <- n
-		}
-	}()
-	s.next = next
-
-	s.expectRune(t, 'A')
-	s.expectRune(t, 27)
-	s.expectRune(t, 'B')
-	s.expectAction(t, left)
-	s.expectAction(t, wordLeft)
-
-	s.expectRune(t, 'e')
-}
diff --git a/third_party/liner/input_windows.go b/third_party/liner/input_windows.go
deleted file mode 100644
index 9dcc311..0000000
--- a/third_party/liner/input_windows.go
+++ /dev/null
@@ -1,321 +0,0 @@
-package liner
-
-import (
-	"bufio"
-	"os"
-	"syscall"
-	"unsafe"
-)
-
-var (
-	kernel32 = syscall.NewLazyDLL("kernel32.dll")
-
-	procGetStdHandle               = kernel32.NewProc("GetStdHandle")
-	procReadConsoleInput           = kernel32.NewProc("ReadConsoleInputW")
-	procGetConsoleMode             = kernel32.NewProc("GetConsoleMode")
-	procSetConsoleMode             = kernel32.NewProc("SetConsoleMode")
-	procSetConsoleCursorPosition   = kernel32.NewProc("SetConsoleCursorPosition")
-	procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo")
-	procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW")
-)
-
-// These names are from the Win32 api, so they use underscores (contrary to
-// what golint suggests)
-const (
-	std_input_handle     = uint32(-10 & 0xFFFFFFFF)
-	std_output_handle    = uint32(-11 & 0xFFFFFFFF)
-	std_error_handle     = uint32(-12 & 0xFFFFFFFF)
-	invalid_handle_value = ^uintptr(0)
-)
-
-type inputMode uint32
-
-// State represents an open terminal
-type State struct {
-	commonState
-	handle      syscall.Handle
-	hOut        syscall.Handle
-	origMode    inputMode
-	defaultMode inputMode
-	key         interface{}
-	repeat      uint16
-}
-
-const (
-	enableEchoInput      = 0x4
-	enableInsertMode     = 0x20
-	enableLineInput      = 0x2
-	enableMouseInput     = 0x10
-	enableProcessedInput = 0x1
-	enableQuickEditMode  = 0x40
-	enableWindowInput    = 0x8
-)
-
-// NewLiner initializes a new *State, and sets the terminal into raw mode. To
-// restore the terminal to its previous state, call State.Close().
-func NewLiner() *State {
-	var s State
-	hIn, _, _ := procGetStdHandle.Call(uintptr(std_input_handle))
-	s.handle = syscall.Handle(hIn)
-	hOut, _, _ := procGetStdHandle.Call(uintptr(std_output_handle))
-	s.hOut = syscall.Handle(hOut)
-
-	s.terminalSupported = true
-	if m, err := TerminalMode(); err == nil {
-		s.origMode = m.(inputMode)
-		mode := s.origMode
-		mode &^= enableEchoInput
-		mode &^= enableInsertMode
-		mode &^= enableLineInput
-		mode &^= enableMouseInput
-		mode |= enableWindowInput
-		mode.ApplyMode()
-	} else {
-		s.inputRedirected = true
-		s.r = bufio.NewReader(os.Stdin)
-	}
-
-	s.getColumns()
-	s.outputRedirected = s.columns <= 0
-
-	return &s
-}
-
-// These names are from the Win32 api, so they use underscores (contrary to
-// what golint suggests)
-const (
-	focus_event              = 0x0010
-	key_event                = 0x0001
-	menu_event               = 0x0008
-	mouse_event              = 0x0002
-	window_buffer_size_event = 0x0004
-)
-
-type input_record struct {
-	eventType uint16
-	pad       uint16
-	blob      [16]byte
-}
-
-type key_event_record struct {
-	KeyDown         int32
-	RepeatCount     uint16
-	VirtualKeyCode  uint16
-	VirtualScanCode uint16
-	Char            int16
-	ControlKeyState uint32
-}
-
-// These names are from the Win32 api, so they use underscores (contrary to
-// what golint suggests)
-const (
-	vk_tab    = 0x09
-	vk_prior  = 0x21
-	vk_next   = 0x22
-	vk_end    = 0x23
-	vk_home   = 0x24
-	vk_left   = 0x25
-	vk_up     = 0x26
-	vk_right  = 0x27
-	vk_down   = 0x28
-	vk_insert = 0x2d
-	vk_delete = 0x2e
-	vk_f1     = 0x70
-	vk_f2     = 0x71
-	vk_f3     = 0x72
-	vk_f4     = 0x73
-	vk_f5     = 0x74
-	vk_f6     = 0x75
-	vk_f7     = 0x76
-	vk_f8     = 0x77
-	vk_f9     = 0x78
-	vk_f10    = 0x79
-	vk_f11    = 0x7a
-	vk_f12    = 0x7b
-	bKey      = 0x42
-	fKey      = 0x46
-	yKey      = 0x59
-)
-
-const (
-	shiftPressed     = 0x0010
-	leftAltPressed   = 0x0002
-	leftCtrlPressed  = 0x0008
-	rightAltPressed  = 0x0001
-	rightCtrlPressed = 0x0004
-
-	modKeys = shiftPressed | leftAltPressed | rightAltPressed | leftCtrlPressed | rightCtrlPressed
-)
-
-func (s *State) readNext() (interface{}, error) {
-	if s.repeat > 0 {
-		s.repeat--
-		return s.key, nil
-	}
-
-	var input input_record
-	pbuf := uintptr(unsafe.Pointer(&input))
-	var rv uint32
-	prv := uintptr(unsafe.Pointer(&rv))
-
-	for {
-		ok, _, err := procReadConsoleInput.Call(uintptr(s.handle), pbuf, 1, prv)
-
-		if ok == 0 {
-			return nil, err
-		}
-
-		if input.eventType == window_buffer_size_event {
-			xy := (*coord)(unsafe.Pointer(&input.blob[0]))
-			s.columns = int(xy.x)
-			return winch, nil
-		}
-		if input.eventType != key_event {
-			continue
-		}
-		ke := (*key_event_record)(unsafe.Pointer(&input.blob[0]))
-		if ke.KeyDown == 0 {
-			continue
-		}
-
-		if ke.VirtualKeyCode == vk_tab && ke.ControlKeyState&modKeys == shiftPressed {
-			s.key = shiftTab
-		} else if ke.VirtualKeyCode == bKey && (ke.ControlKeyState&modKeys == leftAltPressed ||
-			ke.ControlKeyState&modKeys == rightAltPressed) {
-			s.key = altB
-		} else if ke.VirtualKeyCode == fKey && (ke.ControlKeyState&modKeys == leftAltPressed ||
-			ke.ControlKeyState&modKeys == rightAltPressed) {
-			s.key = altF
-		} else if ke.VirtualKeyCode == yKey && (ke.ControlKeyState&modKeys == leftAltPressed ||
-			ke.ControlKeyState&modKeys == rightAltPressed) {
-			s.key = altY
-		} else if ke.Char > 0 {
-			s.key = rune(ke.Char)
-		} else {
-			switch ke.VirtualKeyCode {
-			case vk_prior:
-				s.key = pageUp
-			case vk_next:
-				s.key = pageDown
-			case vk_end:
-				s.key = end
-			case vk_home:
-				s.key = home
-			case vk_left:
-				s.key = left
-				if ke.ControlKeyState&(leftCtrlPressed|rightCtrlPressed) != 0 {
-					if ke.ControlKeyState&modKeys == ke.ControlKeyState&(leftCtrlPressed|rightCtrlPressed) {
-						s.key = wordLeft
-					}
-				}
-			case vk_right:
-				s.key = right
-				if ke.ControlKeyState&(leftCtrlPressed|rightCtrlPressed) != 0 {
-					if ke.ControlKeyState&modKeys == ke.ControlKeyState&(leftCtrlPressed|rightCtrlPressed) {
-						s.key = wordRight
-					}
-				}
-			case vk_up:
-				s.key = up
-			case vk_down:
-				s.key = down
-			case vk_insert:
-				s.key = insert
-			case vk_delete:
-				s.key = del
-			case vk_f1:
-				s.key = f1
-			case vk_f2:
-				s.key = f2
-			case vk_f3:
-				s.key = f3
-			case vk_f4:
-				s.key = f4
-			case vk_f5:
-				s.key = f5
-			case vk_f6:
-				s.key = f6
-			case vk_f7:
-				s.key = f7
-			case vk_f8:
-				s.key = f8
-			case vk_f9:
-				s.key = f9
-			case vk_f10:
-				s.key = f10
-			case vk_f11:
-				s.key = f11
-			case vk_f12:
-				s.key = f12
-			default:
-				// Eat modifier keys
-				// TODO: return Action(Unknown) if the key isn't a
-				// modifier.
-				continue
-			}
-		}
-
-		if ke.RepeatCount > 1 {
-			s.repeat = ke.RepeatCount - 1
-		}
-		return s.key, nil
-	}
-	return unknown, nil
-}
-
-// Close returns the terminal to its previous mode
-func (s *State) Close() error {
-	s.origMode.ApplyMode()
-	return nil
-}
-
-func (s *State) startPrompt() {
-	if m, err := TerminalMode(); err == nil {
-		s.defaultMode = m.(inputMode)
-		mode := s.defaultMode
-		mode &^= enableProcessedInput
-		mode.ApplyMode()
-	}
-}
-
-func (s *State) restartPrompt() {
-}
-
-func (s *State) stopPrompt() {
-	s.defaultMode.ApplyMode()
-}
-
-// TerminalSupported returns true because line editing is always
-// supported on Windows.
-func TerminalSupported() bool {
-	return true
-}
-
-func (mode inputMode) ApplyMode() error {
-	hIn, _, err := procGetStdHandle.Call(uintptr(std_input_handle))
-	if hIn == invalid_handle_value || hIn == 0 {
-		return err
-	}
-	ok, _, err := procSetConsoleMode.Call(hIn, uintptr(mode))
-	if ok != 0 {
-		err = nil
-	}
-	return err
-}
-
-// TerminalMode returns the current terminal input mode as an InputModeSetter.
-//
-// This function is provided for convenience, and should
-// not be necessary for most users of liner.
-func TerminalMode() (ModeApplier, error) {
-	var mode inputMode
-	hIn, _, err := procGetStdHandle.Call(uintptr(std_input_handle))
-	if hIn == invalid_handle_value || hIn == 0 {
-		return nil, err
-	}
-	ok, _, err := procGetConsoleMode.Call(hIn, uintptr(unsafe.Pointer(&mode)))
-	if ok != 0 {
-		err = nil
-	}
-	return mode, err
-}
diff --git a/third_party/liner/line.go b/third_party/liner/line.go
deleted file mode 100644
index daa66b9..0000000
--- a/third_party/liner/line.go
+++ /dev/null
@@ -1,1003 +0,0 @@
-// +build windows linux darwin openbsd freebsd netbsd
-
-package liner
-
-import (
-	"container/ring"
-	"errors"
-	"fmt"
-	"io"
-	"strings"
-	"unicode"
-	"unicode/utf8"
-)
-
-type action int
-
-const (
-	left action = iota
-	right
-	up
-	down
-	home
-	end
-	insert
-	del
-	pageUp
-	pageDown
-	f1
-	f2
-	f3
-	f4
-	f5
-	f6
-	f7
-	f8
-	f9
-	f10
-	f11
-	f12
-	altB
-	altF
-	altY
-	shiftTab
-	wordLeft
-	wordRight
-	winch
-	unknown
-)
-
-const (
-	ctrlA = 1
-	ctrlB = 2
-	ctrlC = 3
-	ctrlD = 4
-	ctrlE = 5
-	ctrlF = 6
-	ctrlG = 7
-	ctrlH = 8
-	tab   = 9
-	lf    = 10
-	ctrlK = 11
-	ctrlL = 12
-	cr    = 13
-	ctrlN = 14
-	ctrlO = 15
-	ctrlP = 16
-	ctrlQ = 17
-	ctrlR = 18
-	ctrlS = 19
-	ctrlT = 20
-	ctrlU = 21
-	ctrlV = 22
-	ctrlW = 23
-	ctrlX = 24
-	ctrlY = 25
-	ctrlZ = 26
-	esc   = 27
-	bs    = 127
-)
-
-const (
-	beep = "\a"
-)
-
-type tabDirection int
-
-const (
-	tabForward tabDirection = iota
-	tabReverse
-)
-
-func (s *State) refresh(prompt []rune, buf []rune, pos int) error {
-	if s.multiLineMode {
-		return s.refreshMultiLine(prompt, buf, pos)
-	} else {
-		return s.refreshSingleLine(prompt, buf, pos)
-	}
-}
-
-func (s *State) refreshSingleLine(prompt []rune, buf []rune, pos int) error {
-	s.cursorPos(0)
-	_, err := fmt.Print(string(prompt))
-	if err != nil {
-		return err
-	}
-
-	pLen := countGlyphs(prompt)
-	bLen := countGlyphs(buf)
-	pos = countGlyphs(buf[:pos])
-	if pLen+bLen < s.columns {
-		_, err = fmt.Print(string(buf))
-		s.eraseLine()
-		s.cursorPos(pLen + pos)
-	} else {
-		// Find space available
-		space := s.columns - pLen
-		space-- // space for cursor
-		start := pos - space/2
-		end := start + space
-		if end > bLen {
-			end = bLen
-			start = end - space
-		}
-		if start < 0 {
-			start = 0
-			end = space
-		}
-		pos -= start
-
-		// Leave space for markers
-		if start > 0 {
-			start++
-		}
-		if end < bLen {
-			end--
-		}
-		startRune := len(getPrefixGlyphs(buf, start))
-		line := getPrefixGlyphs(buf[startRune:], end-start)
-
-		// Output
-		if start > 0 {
-			fmt.Print("{")
-		}
-		fmt.Print(string(line))
-		if end < bLen {
-			fmt.Print("}")
-		}
-
-		// Set cursor position
-		s.eraseLine()
-		s.cursorPos(pLen + pos)
-	}
-	return err
-}
-
-func (s *State) refreshMultiLine(prompt []rune, buf []rune, pos int) error {
-	promptColumns := countMultiLineGlyphs(prompt, s.columns, 0)
-	totalColumns := countMultiLineGlyphs(buf, s.columns, promptColumns)
-	totalRows := (totalColumns + s.columns - 1) / s.columns
-	maxRows := s.maxRows
-	if totalRows > s.maxRows {
-		s.maxRows = totalRows
-	}
-	cursorRows := s.cursorRows
-	if cursorRows == 0 {
-		cursorRows = 1
-	}
-
-	/* First step: clear all the lines used before. To do so start by
-	* going to the last row. */
-	if maxRows-cursorRows > 0 {
-		s.moveDown(maxRows - cursorRows)
-	}
-
-	/* Now for every row clear it, go up. */
-	for i := 0; i < maxRows-1; i++ {
-		s.cursorPos(0)
-		s.eraseLine()
-		s.moveUp(1)
-	}
-
-	/* Clean the top line. */
-	s.cursorPos(0)
-	s.eraseLine()
-
-	/* Write the prompt and the current buffer content */
-	if _, err := fmt.Print(string(prompt)); err != nil {
-		return err
-	}
-	if _, err := fmt.Print(string(buf)); err != nil {
-		return err
-	}
-
-	/* If we are at the very end of the screen with our prompt, we need to
-	 * emit a newline and move the prompt to the first column. */
-	cursorColumns := countMultiLineGlyphs(buf[:pos], s.columns, promptColumns)
-	if cursorColumns == totalColumns && totalColumns%s.columns == 0 {
-		s.emitNewLine()
-		s.cursorPos(0)
-		totalRows++
-		if totalRows > s.maxRows {
-			s.maxRows = totalRows
-		}
-	}
-
-	/* Move cursor to right position. */
-	cursorRows = (cursorColumns + s.columns) / s.columns
-	if s.cursorRows > 0 && totalRows-cursorRows > 0 {
-		s.moveUp(totalRows - cursorRows)
-	}
-	/* Set column. */
-	s.cursorPos(cursorColumns % s.columns)
-
-	s.cursorRows = cursorRows
-	return nil
-}
-
-func (s *State) resetMultiLine(prompt []rune, buf []rune, pos int) {
-	columns := countMultiLineGlyphs(prompt, s.columns, 0)
-	columns = countMultiLineGlyphs(buf[:pos], s.columns, columns)
-	columns += 2 // ^C
-	cursorRows := (columns + s.columns) / s.columns
-	if s.maxRows-cursorRows > 0 {
-		for i := 0; i < s.maxRows-cursorRows; i++ {
-			fmt.Println() // always moves the cursor down or scrolls the window up as needed
-		}
-	}
-	s.maxRows = 1
-	s.cursorRows = 0
-}
-
-func longestCommonPrefix(strs []string) string {
-	if len(strs) == 0 {
-		return ""
-	}
-	longest := strs[0]
-
-	for _, str := range strs[1:] {
-		for !strings.HasPrefix(str, longest) {
-			longest = longest[:len(longest)-1]
-		}
-	}
-	// Remove trailing partial runes
-	longest = strings.TrimRight(longest, "\uFFFD")
-	return longest
-}
-
-func (s *State) circularTabs(items []string) func(tabDirection) (string, error) {
-	item := -1
-	return func(direction tabDirection) (string, error) {
-		if direction == tabForward {
-			if item < len(items)-1 {
-				item++
-			} else {
-				item = 0
-			}
-		} else if direction == tabReverse {
-			if item > 0 {
-				item--
-			} else {
-				item = len(items) - 1
-			}
-		}
-		return items[item], nil
-	}
-}
-
-func calculateColumns(screenWidth int, items []string) (numColumns, numRows, maxWidth int) {
-	for _, item := range items {
-		if len(item) >= screenWidth {
-			return 1, len(items), screenWidth - 1
-		}
-		if len(item) >= maxWidth {
-			maxWidth = len(item) + 1
-		}
-	}
-
-	numColumns = screenWidth / maxWidth
-	numRows = len(items) / numColumns
-	if len(items)%numColumns > 0 {
-		numRows++
-	}
-
-	if len(items) <= numColumns {
-		maxWidth = 0
-	}
-
-	return
-}
-
-func (s *State) printedTabs(items []string) func(tabDirection) (string, error) {
-	numTabs := 1
-	prefix := longestCommonPrefix(items)
-	return func(direction tabDirection) (string, error) {
-		if len(items) == 1 {
-			return items[0], nil
-		}
-
-		if numTabs == 2 {
-			if len(items) > 100 {
-				fmt.Printf("\nDisplay all %d possibilities? (y or n) ", len(items))
-				for {
-					next, err := s.readNext()
-					if err != nil {
-						return prefix, err
-					}
-
-					if key, ok := next.(rune); ok {
-						if unicode.ToLower(key) == 'n' {
-							return prefix, nil
-						} else if unicode.ToLower(key) == 'y' {
-							break
-						}
-					}
-				}
-			}
-			fmt.Println("")
-
-			numColumns, numRows, maxWidth := calculateColumns(s.columns, items)
-
-			for i := 0; i < numRows; i++ {
-				for j := 0; j < numColumns*numRows; j += numRows {
-					if i+j < len(items) {
-						if maxWidth > 0 {
-							fmt.Printf("%-*.[1]*s", maxWidth, items[i+j])
-						} else {
-							fmt.Printf("%v ", items[i+j])
-						}
-					}
-				}
-				fmt.Println("")
-			}
-		} else {
-			numTabs++
-		}
-		return prefix, nil
-	}
-}
-
-func (s *State) tabComplete(p []rune, line []rune, pos int) ([]rune, int, interface{}, error) {
-	if s.completer == nil {
-		return line, pos, rune(esc), nil
-	}
-	head, list, tail := s.completer(string(line), pos)
-	if len(list) <= 0 {
-		return line, pos, rune(esc), nil
-	}
-	hl := utf8.RuneCountInString(head)
-	if len(list) == 1 {
-		s.refresh(p, []rune(head+list[0]+tail), hl+utf8.RuneCountInString(list[0]))
-		return []rune(head + list[0] + tail), hl + utf8.RuneCountInString(list[0]), rune(esc), nil
-	}
-
-	direction := tabForward
-	tabPrinter := s.circularTabs(list)
-	if s.tabStyle == TabPrints {
-		tabPrinter = s.printedTabs(list)
-	}
-
-	for {
-		pick, err := tabPrinter(direction)
-		if err != nil {
-			return line, pos, rune(esc), err
-		}
-		s.refresh(p, []rune(head+pick+tail), hl+utf8.RuneCountInString(pick))
-
-		next, err := s.readNext()
-		if err != nil {
-			return line, pos, rune(esc), err
-		}
-		if key, ok := next.(rune); ok {
-			if key == tab {
-				direction = tabForward
-				continue
-			}
-			if key == esc {
-				return line, pos, rune(esc), nil
-			}
-		}
-		if a, ok := next.(action); ok && a == shiftTab {
-			direction = tabReverse
-			continue
-		}
-		return []rune(head + pick + tail), hl + utf8.RuneCountInString(pick), next, nil
-	}
-	// Not reached
-	return line, pos, rune(esc), nil
-}
-
-// reverse intelligent search, implements a bash-like history search.
-func (s *State) reverseISearch(origLine []rune, origPos int) ([]rune, int, interface{}, error) {
-	p := "(reverse-i-search)`': "
-	s.refresh([]rune(p), origLine, origPos)
-
-	line := []rune{}
-	pos := 0
-	foundLine := string(origLine)
-	foundPos := origPos
-
-	getLine := func() ([]rune, []rune, int) {
-		search := string(line)
-		prompt := "(reverse-i-search)`%s': "
-		return []rune(fmt.Sprintf(prompt, search)), []rune(foundLine), foundPos
-	}
-
-	history, positions := s.getHistoryByPattern(string(line))
-	historyPos := len(history) - 1
-
-	for {
-		next, err := s.readNext()
-		if err != nil {
-			return []rune(foundLine), foundPos, rune(esc), err
-		}
-
-		switch v := next.(type) {
-		case rune:
-			switch v {
-			case ctrlR: // Search backwards
-				if historyPos > 0 && historyPos < len(history) {
-					historyPos--
-					foundLine = history[historyPos]
-					foundPos = positions[historyPos]
-				} else {
-					fmt.Print(beep)
-				}
-			case ctrlS: // Search forward
-				if historyPos < len(history)-1 && historyPos >= 0 {
-					historyPos++
-					foundLine = history[historyPos]
-					foundPos = positions[historyPos]
-				} else {
-					fmt.Print(beep)
-				}
-			case ctrlH, bs: // Backspace
-				if pos <= 0 {
-					fmt.Print(beep)
-				} else {
-					n := len(getSuffixGlyphs(line[:pos], 1))
-					line = append(line[:pos-n], line[pos:]...)
-					pos -= n
-
-					// For each char deleted, display the last matching line of history
-					history, positions := s.getHistoryByPattern(string(line))
-					historyPos = len(history) - 1
-					if len(history) > 0 {
-						foundLine = history[historyPos]
-						foundPos = positions[historyPos]
-					} else {
-						foundLine = ""
-						foundPos = 0
-					}
-				}
-			case ctrlG: // Cancel
-				return origLine, origPos, rune(esc), err
-
-			case tab, cr, lf, ctrlA, ctrlB, ctrlD, ctrlE, ctrlF, ctrlK,
-				ctrlL, ctrlN, ctrlO, ctrlP, ctrlQ, ctrlT, ctrlU, ctrlV, ctrlW, ctrlX, ctrlY, ctrlZ:
-				fallthrough
-			case 0, ctrlC, esc, 28, 29, 30, 31:
-				return []rune(foundLine), foundPos, next, err
-			default:
-				line = append(line[:pos], append([]rune{v}, line[pos:]...)...)
-				pos++
-
-				// For each keystroke typed, display the last matching line of history
-				history, positions = s.getHistoryByPattern(string(line))
-				historyPos = len(history) - 1
-				if len(history) > 0 {
-					foundLine = history[historyPos]
-					foundPos = positions[historyPos]
-				} else {
-					foundLine = ""
-					foundPos = 0
-				}
-			}
-		case action:
-			return []rune(foundLine), foundPos, next, err
-		}
-		s.refresh(getLine())
-	}
-}
-
-// addToKillRing adds some text to the kill ring. If mode is 0 it adds it to a
-// new node in the end of the kill ring, and move the current pointer to the new
-// node. If mode is 1 or 2 it appends or prepends the text to the current entry
-// of the killRing.
-func (s *State) addToKillRing(text []rune, mode int) {
-	// Don't use the same underlying array as text
-	killLine := make([]rune, len(text))
-	copy(killLine, text)
-
-	// Point killRing to a newNode, procedure depends on the killring state and
-	// append mode.
-	if mode == 0 { // Add new node to killRing
-		if s.killRing == nil { // if killring is empty, create a new one
-			s.killRing = ring.New(1)
-		} else if s.killRing.Len() >= KillRingMax { // if killring is "full"
-			s.killRing = s.killRing.Next()
-		} else { // Normal case
-			s.killRing.Link(ring.New(1))
-			s.killRing = s.killRing.Next()
-		}
-	} else {
-		if s.killRing == nil { // if killring is empty, create a new one
-			s.killRing = ring.New(1)
-			s.killRing.Value = []rune{}
-		}
-		if mode == 1 { // Append to last entry
-			killLine = append(s.killRing.Value.([]rune), killLine...)
-		} else if mode == 2 { // Prepend to last entry
-			killLine = append(killLine, s.killRing.Value.([]rune)...)
-		}
-	}
-
-	// Save text in the current killring node
-	s.killRing.Value = killLine
-}
-
-func (s *State) yank(p []rune, text []rune, pos int) ([]rune, int, interface{}, error) {
-	if s.killRing == nil {
-		return text, pos, rune(esc), nil
-	}
-
-	lineStart := text[:pos]
-	lineEnd := text[pos:]
-	var line []rune
-
-	for {
-		value := s.killRing.Value.([]rune)
-		line = make([]rune, 0)
-		line = append(line, lineStart...)
-		line = append(line, value...)
-		line = append(line, lineEnd...)
-
-		pos = len(lineStart) + len(value)
-		s.refresh(p, line, pos)
-
-		next, err := s.readNext()
-		if err != nil {
-			return line, pos, next, err
-		}
-
-		switch v := next.(type) {
-		case rune:
-			return line, pos, next, nil
-		case action:
-			switch v {
-			case altY:
-				s.killRing = s.killRing.Prev()
-			default:
-				return line, pos, next, nil
-			}
-		}
-	}
-
-	return line, pos, esc, nil
-}
-
-// Prompt displays p and returns a line of user input, not including a trailing
-// newline character. An io.EOF error is returned if the user signals end-of-file
-// by pressing Ctrl-D. Prompt allows line editing if the terminal supports it.
-func (s *State) Prompt(prompt string) (string, error) {
-	if s.inputRedirected || !s.terminalSupported {
-		return s.promptUnsupported(prompt)
-	}
-	if s.outputRedirected {
-		return "", ErrNotTerminalOutput
-	}
-
-	s.historyMutex.RLock()
-	defer s.historyMutex.RUnlock()
-
-	s.startPrompt()
-	defer s.stopPrompt()
-	s.getColumns()
-
-	fmt.Print(prompt)
-	p := []rune(prompt)
-	var line []rune
-	pos := 0
-	historyEnd := ""
-	prefixHistory := s.getHistoryByPrefix(string(line))
-	historyPos := len(prefixHistory)
-	historyAction := false // used to mark history related actions
-	killAction := 0        // used to mark kill related actions
-mainLoop:
-	for {
-		next, err := s.readNext()
-	haveNext:
-		if err != nil {
-			return "", err
-		}
-
-		historyAction = false
-		switch v := next.(type) {
-		case rune:
-			switch v {
-			case cr, lf:
-				if s.multiLineMode {
-					s.resetMultiLine(p, line, pos)
-				}
-				fmt.Println()
-				break mainLoop
-			case ctrlA: // Start of line
-				pos = 0
-				s.refresh(p, line, pos)
-			case ctrlE: // End of line
-				pos = len(line)
-				s.refresh(p, line, pos)
-			case ctrlB: // left
-				if pos > 0 {
-					pos -= len(getSuffixGlyphs(line[:pos], 1))
-					s.refresh(p, line, pos)
-				} else {
-					fmt.Print(beep)
-				}
-			case ctrlF: // right
-				if pos < len(line) {
-					pos += len(getPrefixGlyphs(line[pos:], 1))
-					s.refresh(p, line, pos)
-				} else {
-					fmt.Print(beep)
-				}
-			case ctrlD: // del
-				if pos == 0 && len(line) == 0 {
-					// exit
-					return "", io.EOF
-				}
-
-				// ctrlD is a potential EOF, so the rune reader shuts down.
-				// Therefore, if it isn't actually an EOF, we must re-startPrompt.
-				s.restartPrompt()
-
-				if pos >= len(line) {
-					fmt.Print(beep)
-				} else {
-					n := len(getPrefixGlyphs(line[pos:], 1))
-					line = append(line[:pos], line[pos+n:]...)
-					s.refresh(p, line, pos)
-				}
-			case ctrlK: // delete remainder of line
-				if pos >= len(line) {
-					fmt.Print(beep)
-				} else {
-					if killAction > 0 {
-						s.addToKillRing(line[pos:], 1) // Add in apend mode
-					} else {
-						s.addToKillRing(line[pos:], 0) // Add in normal mode
-					}
-
-					killAction = 2 // Mark that there was a kill action
-					line = line[:pos]
-					s.refresh(p, line, pos)
-				}
-			case ctrlP: // up
-				historyAction = true
-				if historyPos > 0 {
-					if historyPos == len(prefixHistory) {
-						historyEnd = string(line)
-					}
-					historyPos--
-					line = []rune(prefixHistory[historyPos])
-					pos = len(line)
-					s.refresh(p, line, pos)
-				} else {
-					fmt.Print(beep)
-				}
-			case ctrlN: // down
-				historyAction = true
-				if historyPos < len(prefixHistory) {
-					historyPos++
-					if historyPos == len(prefixHistory) {
-						line = []rune(historyEnd)
-					} else {
-						line = []rune(prefixHistory[historyPos])
-					}
-					pos = len(line)
-					s.refresh(p, line, pos)
-				} else {
-					fmt.Print(beep)
-				}
-			case ctrlT: // transpose prev glyph with glyph under cursor
-				if len(line) < 2 || pos < 1 {
-					fmt.Print(beep)
-				} else {
-					if pos == len(line) {
-						pos -= len(getSuffixGlyphs(line, 1))
-					}
-					prev := getSuffixGlyphs(line[:pos], 1)
-					next := getPrefixGlyphs(line[pos:], 1)
-					scratch := make([]rune, len(prev))
-					copy(scratch, prev)
-					copy(line[pos-len(prev):], next)
-					copy(line[pos-len(prev)+len(next):], scratch)
-					pos += len(next)
-					s.refresh(p, line, pos)
-				}
-			case ctrlL: // clear screen
-				s.eraseScreen()
-				s.refresh(p, line, pos)
-			case ctrlC: // reset
-				fmt.Println("^C")
-				if s.multiLineMode {
-					s.resetMultiLine(p, line, pos)
-				}
-				if s.ctrlCAborts {
-					return "", ErrPromptAborted
-				}
-				line = line[:0]
-				pos = 0
-				fmt.Print(prompt)
-				s.restartPrompt()
-			case ctrlH, bs: // Backspace
-				if pos <= 0 {
-					fmt.Print(beep)
-				} else {
-					n := len(getSuffixGlyphs(line[:pos], 1))
-					line = append(line[:pos-n], line[pos:]...)
-					pos -= n
-					s.refresh(p, line, pos)
-				}
-			case ctrlU: // Erase line before cursor
-				if killAction > 0 {
-					s.addToKillRing(line[:pos], 2) // Add in prepend mode
-				} else {
-					s.addToKillRing(line[:pos], 0) // Add in normal mode
-				}
-
-				killAction = 2 // Mark that there was some killing
-				line = line[pos:]
-				pos = 0
-				s.refresh(p, line, pos)
-			case ctrlW: // Erase word
-				if pos == 0 {
-					fmt.Print(beep)
-					break
-				}
-				// Remove whitespace to the left
-				var buf []rune // Store the deleted chars in a buffer
-				for {
-					if pos == 0 || !unicode.IsSpace(line[pos-1]) {
-						break
-					}
-					buf = append(buf, line[pos-1])
-					line = append(line[:pos-1], line[pos:]...)
-					pos--
-				}
-				// Remove non-whitespace to the left
-				for {
-					if pos == 0 || unicode.IsSpace(line[pos-1]) {
-						break
-					}
-					buf = append(buf, line[pos-1])
-					line = append(line[:pos-1], line[pos:]...)
-					pos--
-				}
-				// Invert the buffer and save the result on the killRing
-				var newBuf []rune
-				for i := len(buf) - 1; i >= 0; i-- {
-					newBuf = append(newBuf, buf[i])
-				}
-				if killAction > 0 {
-					s.addToKillRing(newBuf, 2) // Add in prepend mode
-				} else {
-					s.addToKillRing(newBuf, 0) // Add in normal mode
-				}
-				killAction = 2 // Mark that there was some killing
-
-				s.refresh(p, line, pos)
-			case ctrlY: // Paste from Yank buffer
-				line, pos, next, err = s.yank(p, line, pos)
-				goto haveNext
-			case ctrlR: // Reverse Search
-				line, pos, next, err = s.reverseISearch(line, pos)
-				s.refresh(p, line, pos)
-				goto haveNext
-			case tab: // Tab completion
-				line, pos, next, err = s.tabComplete(p, line, pos)
-				goto haveNext
-			// Catch keys that do nothing, but you don't want them to beep
-			case esc:
-				// DO NOTHING
-			// Unused keys
-			case ctrlG, ctrlO, ctrlQ, ctrlS, ctrlV, ctrlX, ctrlZ:
-				fallthrough
-			// Catch unhandled control codes (anything <= 31)
-			case 0, 28, 29, 30, 31:
-				fmt.Print(beep)
-			default:
-				if pos == len(line) && !s.multiLineMode && countGlyphs(p)+countGlyphs(line) < s.columns-1 {
-					line = append(line, v)
-					fmt.Printf("%c", v)
-					pos++
-				} else {
-					line = append(line[:pos], append([]rune{v}, line[pos:]...)...)
-					pos++
-					s.refresh(p, line, pos)
-				}
-			}
-		case action:
-			switch v {
-			case del:
-				if pos >= len(line) {
-					fmt.Print(beep)
-				} else {
-					n := len(getPrefixGlyphs(line[pos:], 1))
-					line = append(line[:pos], line[pos+n:]...)
-				}
-			case left:
-				if pos > 0 {
-					pos -= len(getSuffixGlyphs(line[:pos], 1))
-				} else {
-					fmt.Print(beep)
-				}
-			case wordLeft, altB:
-				if pos > 0 {
-					var spaceHere, spaceLeft, leftKnown bool
-					for {
-						pos--
-						if pos == 0 {
-							break
-						}
-						if leftKnown {
-							spaceHere = spaceLeft
-						} else {
-							spaceHere = unicode.IsSpace(line[pos])
-						}
-						spaceLeft, leftKnown = unicode.IsSpace(line[pos-1]), true
-						if !spaceHere && spaceLeft {
-							break
-						}
-					}
-				} else {
-					fmt.Print(beep)
-				}
-			case right:
-				if pos < len(line) {
-					pos += len(getPrefixGlyphs(line[pos:], 1))
-				} else {
-					fmt.Print(beep)
-				}
-			case wordRight, altF:
-				if pos < len(line) {
-					var spaceHere, spaceLeft, hereKnown bool
-					for {
-						pos++
-						if pos == len(line) {
-							break
-						}
-						if hereKnown {
-							spaceLeft = spaceHere
-						} else {
-							spaceLeft = unicode.IsSpace(line[pos-1])
-						}
-						spaceHere, hereKnown = unicode.IsSpace(line[pos]), true
-						if spaceHere && !spaceLeft {
-							break
-						}
-					}
-				} else {
-					fmt.Print(beep)
-				}
-			case up:
-				historyAction = true
-				if historyPos > 0 {
-					if historyPos == len(prefixHistory) {
-						historyEnd = string(line)
-					}
-					historyPos--
-					line = []rune(prefixHistory[historyPos])
-					pos = len(line)
-				} else {
-					fmt.Print(beep)
-				}
-			case down:
-				historyAction = true
-				if historyPos < len(prefixHistory) {
-					historyPos++
-					if historyPos == len(prefixHistory) {
-						line = []rune(historyEnd)
-					} else {
-						line = []rune(prefixHistory[historyPos])
-					}
-					pos = len(line)
-				} else {
-					fmt.Print(beep)
-				}
-			case home: // Start of line
-				pos = 0
-			case end: // End of line
-				pos = len(line)
-			case winch: // Window change
-				if s.multiLineMode {
-					if s.maxRows-s.cursorRows > 0 {
-						s.moveDown(s.maxRows - s.cursorRows)
-					}
-					for i := 0; i < s.maxRows-1; i++ {
-						s.cursorPos(0)
-						s.eraseLine()
-						s.moveUp(1)
-					}
-					s.maxRows = 1
-					s.cursorRows = 1
-				}
-			}
-			s.refresh(p, line, pos)
-		}
-		if !historyAction {
-			prefixHistory = s.getHistoryByPrefix(string(line))
-			historyPos = len(prefixHistory)
-		}
-		if killAction > 0 {
-			killAction--
-		}
-	}
-	return string(line), nil
-}
-
-// PasswordPrompt displays p, and then waits for user input. The input typed by
-// the user is not displayed in the terminal.
-func (s *State) PasswordPrompt(prompt string) (string, error) {
-	if !s.terminalSupported {
-		return "", errors.New("liner: function not supported in this terminal")
-	}
-	if s.inputRedirected {
-		return s.promptUnsupported(prompt)
-	}
-	if s.outputRedirected {
-		return "", ErrNotTerminalOutput
-	}
-
-	s.startPrompt()
-	defer s.stopPrompt()
-	s.getColumns()
-
-	fmt.Print(prompt)
-	p := []rune(prompt)
-	var line []rune
-	pos := 0
-
-mainLoop:
-	for {
-		next, err := s.readNext()
-		if err != nil {
-			return "", err
-		}
-
-		switch v := next.(type) {
-		case rune:
-			switch v {
-			case cr, lf:
-				if s.multiLineMode {
-					s.resetMultiLine(p, line, pos)
-				}
-				fmt.Println()
-				break mainLoop
-			case ctrlD: // del
-				if pos == 0 && len(line) == 0 {
-					// exit
-					return "", io.EOF
-				}
-
-				// ctrlD is a potential EOF, so the rune reader shuts down.
-				// Therefore, if it isn't actually an EOF, we must re-startPrompt.
-				s.restartPrompt()
-			case ctrlL: // clear screen
-				s.eraseScreen()
-				s.refresh(p, []rune{}, 0)
-			case ctrlH, bs: // Backspace
-				if pos <= 0 {
-					fmt.Print(beep)
-				} else {
-					n := len(getSuffixGlyphs(line[:pos], 1))
-					line = append(line[:pos-n], line[pos:]...)
-					pos -= n
-				}
-			case ctrlC:
-				fmt.Println("^C")
-				if s.multiLineMode {
-					s.resetMultiLine(p, line, pos)
-				}
-				if s.ctrlCAborts {
-					return "", ErrPromptAborted
-				}
-				line = line[:0]
-				pos = 0
-				fmt.Print(prompt)
-				s.restartPrompt()
-			// Unused keys
-			case esc, tab, ctrlA, ctrlB, ctrlE, ctrlF, ctrlG, ctrlK, ctrlN, ctrlO, ctrlP, ctrlQ, ctrlR, ctrlS,
-				ctrlT, ctrlU, ctrlV, ctrlW, ctrlX, ctrlY, ctrlZ:
-				fallthrough
-			// Catch unhandled control codes (anything <= 31)
-			case 0, 28, 29, 30, 31:
-				fmt.Print(beep)
-			default:
-				line = append(line[:pos], append([]rune{v}, line[pos:]...)...)
-				pos++
-			}
-		}
-	}
-	return string(line), nil
-}
diff --git a/third_party/liner/line_test.go b/third_party/liner/line_test.go
deleted file mode 100644
index 42aeb2f..0000000
--- a/third_party/liner/line_test.go
+++ /dev/null
@@ -1,137 +0,0 @@
-package liner
-
-import (
-	"bytes"
-	"fmt"
-	"strings"
-	"testing"
-)
-
-func TestAppend(t *testing.T) {
-	var s State
-	s.AppendHistory("foo")
-	s.AppendHistory("bar")
-
-	var out bytes.Buffer
-	num, err := s.WriteHistory(&out)
-	if err != nil {
-		t.Fatal("Unexpected error writing history", err)
-	}
-	if num != 2 {
-		t.Fatalf("Expected 2 history entries, got %d", num)
-	}
-
-	s.AppendHistory("baz")
-	num, err = s.WriteHistory(&out)
-	if err != nil {
-		t.Fatal("Unexpected error writing history", err)
-	}
-	if num != 3 {
-		t.Fatalf("Expected 3 history entries, got %d", num)
-	}
-
-	s.AppendHistory("baz")
-	num, err = s.WriteHistory(&out)
-	if err != nil {
-		t.Fatal("Unexpected error writing history", err)
-	}
-	if num != 3 {
-		t.Fatalf("Expected 3 history entries after duplicate append, got %d", num)
-	}
-
-	s.AppendHistory("baz")
-
-}
-
-func TestHistory(t *testing.T) {
-	input := `foo
-bar
-baz
-quux
-dingle`
-
-	var s State
-	num, err := s.ReadHistory(strings.NewReader(input))
-	if err != nil {
-		t.Fatal("Unexpected error reading history", err)
-	}
-	if num != 5 {
-		t.Fatal("Wrong number of history entries read")
-	}
-
-	var out bytes.Buffer
-	num, err = s.WriteHistory(&out)
-	if err != nil {
-		t.Fatal("Unexpected error writing history", err)
-	}
-	if num != 5 {
-		t.Fatal("Wrong number of history entries written")
-	}
-	if strings.TrimSpace(out.String()) != input {
-		t.Fatal("Round-trip failure")
-	}
-
-	// Test reading with a trailing newline present
-	var s2 State
-	num, err = s2.ReadHistory(&out)
-	if err != nil {
-		t.Fatal("Unexpected error reading history the 2nd time", err)
-	}
-	if num != 5 {
-		t.Fatal("Wrong number of history entries read the 2nd time")
-	}
-
-	num, err = s.ReadHistory(strings.NewReader(input + "\n\xff"))
-	if err == nil {
-		t.Fatal("Unexpected success reading corrupted history", err)
-	}
-	if num != 5 {
-		t.Fatal("Wrong number of history entries read the 3rd time")
-	}
-}
-
-func TestColumns(t *testing.T) {
-	list := []string{"foo", "food", "This entry is quite a bit longer than the typical entry"}
-
-	output := []struct {
-		width, columns, rows, maxWidth int
-	}{
-		{80, 1, 3, len(list[2]) + 1},
-		{120, 2, 2, len(list[2]) + 1},
-		{800, 14, 1, 0},
-		{8, 1, 3, 7},
-	}
-
-	for i, o := range output {
-		col, row, max := calculateColumns(o.width, list)
-		if col != o.columns {
-			t.Fatalf("Wrong number of columns, %d != %d, in TestColumns %d\n", col, o.columns, i)
-		}
-		if row != o.rows {
-			t.Fatalf("Wrong number of rows, %d != %d, in TestColumns %d\n", row, o.rows, i)
-		}
-		if max != o.maxWidth {
-			t.Fatalf("Wrong column width, %d != %d, in TestColumns %d\n", max, o.maxWidth, i)
-		}
-	}
-}
-
-// This example demonstrates a way to retrieve the current
-// history buffer without using a file.
-func ExampleState_WriteHistory() {
-	var s State
-	s.AppendHistory("foo")
-	s.AppendHistory("bar")
-
-	buf := new(bytes.Buffer)
-	_, err := s.WriteHistory(buf)
-	if err == nil {
-		history := strings.Split(strings.TrimSpace(buf.String()), "\n")
-		for i, line := range history {
-			fmt.Println("History entry", i, ":", line)
-		}
-	}
-	// Output:
-	// History entry 0 : foo
-	// History entry 1 : bar
-}
diff --git a/third_party/liner/output.go b/third_party/liner/output.go
deleted file mode 100644
index 049273b..0000000
--- a/third_party/liner/output.go
+++ /dev/null
@@ -1,75 +0,0 @@
-// +build linux darwin openbsd freebsd netbsd
-
-package liner
-
-import (
-	"fmt"
-	"os"
-	"strings"
-	"syscall"
-	"unsafe"
-)
-
-func (s *State) cursorPos(x int) {
-	if s.useCHA {
-		// 'G' is "Cursor Character Absolute (CHA)"
-		fmt.Printf("\x1b[%dG", x+1)
-	} else {
-		// 'C' is "Cursor Forward (CUF)"
-		fmt.Print("\r")
-		if x > 0 {
-			fmt.Printf("\x1b[%dC", x)
-		}
-	}
-}
-
-func (s *State) eraseLine() {
-	fmt.Print("\x1b[0K")
-}
-
-func (s *State) eraseScreen() {
-	fmt.Print("\x1b[H\x1b[2J")
-}
-
-func (s *State) moveUp(lines int) {
-	fmt.Printf("\x1b[%dA", lines)
-}
-
-func (s *State) moveDown(lines int) {
-	fmt.Printf("\x1b[%dB", lines)
-}
-
-func (s *State) emitNewLine() {
-	fmt.Print("\n")
-}
-
-type winSize struct {
-	row, col       uint16
-	xpixel, ypixel uint16
-}
-
-func (s *State) getColumns() {
-	var ws winSize
-	ok, _, _ := syscall.Syscall(syscall.SYS_IOCTL, uintptr(syscall.Stdout),
-		syscall.TIOCGWINSZ, uintptr(unsafe.Pointer(&ws)))
-	if ok < 0 {
-		s.columns = 80
-	}
-	s.columns = int(ws.col)
-}
-
-func (s *State) checkOutput() {
-	// xterm is known to support CHA
-	if strings.Contains(strings.ToLower(os.Getenv("TERM")), "xterm") {
-		s.useCHA = true
-		return
-	}
-
-	// The test for functional ANSI CHA is unreliable (eg the Windows
-	// telnet command does not support reading the cursor position with
-	// an ANSI DSR request, despite setting TERM=ansi)
-
-	// Assume CHA isn't supported (which should be safe, although it
-	// does result in occasional visible cursor jitter)
-	s.useCHA = false
-}
diff --git a/third_party/liner/output_windows.go b/third_party/liner/output_windows.go
deleted file mode 100644
index 45cd978..0000000
--- a/third_party/liner/output_windows.go
+++ /dev/null
@@ -1,72 +0,0 @@
-package liner
-
-import (
-	"unsafe"
-)
-
-type coord struct {
-	x, y int16
-}
-type smallRect struct {
-	left, top, right, bottom int16
-}
-
-type consoleScreenBufferInfo struct {
-	dwSize              coord
-	dwCursorPosition    coord
-	wAttributes         int16
-	srWindow            smallRect
-	dwMaximumWindowSize coord
-}
-
-func (s *State) cursorPos(x int) {
-	var sbi consoleScreenBufferInfo
-	procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi)))
-	procSetConsoleCursorPosition.Call(uintptr(s.hOut),
-		uintptr(int(x)&0xFFFF|int(sbi.dwCursorPosition.y)<<16))
-}
-
-func (s *State) eraseLine() {
-	var sbi consoleScreenBufferInfo
-	procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi)))
-	var numWritten uint32
-	procFillConsoleOutputCharacter.Call(uintptr(s.hOut), uintptr(' '),
-		uintptr(sbi.dwSize.x-sbi.dwCursorPosition.x),
-		uintptr(int(sbi.dwCursorPosition.x)&0xFFFF|int(sbi.dwCursorPosition.y)<<16),
-		uintptr(unsafe.Pointer(&numWritten)))
-}
-
-func (s *State) eraseScreen() {
-	var sbi consoleScreenBufferInfo
-	procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi)))
-	var numWritten uint32
-	procFillConsoleOutputCharacter.Call(uintptr(s.hOut), uintptr(' '),
-		uintptr(sbi.dwSize.x)*uintptr(sbi.dwSize.y),
-		0,
-		uintptr(unsafe.Pointer(&numWritten)))
-	procSetConsoleCursorPosition.Call(uintptr(s.hOut), 0)
-}
-
-func (s *State) moveUp(lines int) {
-	var sbi consoleScreenBufferInfo
-	procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi)))
-	procSetConsoleCursorPosition.Call(uintptr(s.hOut),
-		uintptr(int(sbi.dwCursorPosition.x)&0xFFFF|(int(sbi.dwCursorPosition.y)-lines)<<16))
-}
-
-func (s *State) moveDown(lines int) {
-	var sbi consoleScreenBufferInfo
-	procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi)))
-	procSetConsoleCursorPosition.Call(uintptr(s.hOut),
-		uintptr(int(sbi.dwCursorPosition.x)&0xFFFF|(int(sbi.dwCursorPosition.y)+lines)<<16))
-}
-
-func (s *State) emitNewLine() {
-	// windows doesn't need to omit a new line
-}
-
-func (s *State) getColumns() {
-	var sbi consoleScreenBufferInfo
-	procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi)))
-	s.columns = int(sbi.dwSize.x)
-}
diff --git a/third_party/liner/prefix_test.go b/third_party/liner/prefix_test.go
deleted file mode 100644
index c826d6c..0000000
--- a/third_party/liner/prefix_test.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// +build windows linux darwin openbsd freebsd netbsd
-
-package liner
-
-import "testing"
-
-type testItem struct {
-	list   []string
-	prefix string
-}
-
-func TestPrefix(t *testing.T) {
-	list := []testItem{
-		{[]string{"food", "foot"}, "foo"},
-		{[]string{"foo", "foot"}, "foo"},
-		{[]string{"food", "foo"}, "foo"},
-		{[]string{"food", "foe", "foot"}, "fo"},
-		{[]string{"food", "foot", "barbeque"}, ""},
-		{[]string{"cafeteria", "café"}, "caf"},
-		{[]string{"cafe", "café"}, "caf"},
-		{[]string{"cafè", "café"}, "caf"},
-		{[]string{"cafés", "café"}, "café"},
-		{[]string{"áéíóú", "áéíóú"}, "áéíóú"},
-		{[]string{"éclairs", "éclairs"}, "éclairs"},
-		{[]string{"éclairs are the best", "éclairs are great", "éclairs"}, "éclairs"},
-		{[]string{"éclair", "éclairs"}, "éclair"},
-		{[]string{"éclairs", "éclair"}, "éclair"},
-		{[]string{"éclair", "élan"}, "é"},
-	}
-
-	for _, test := range list {
-		lcp := longestCommonPrefix(test.list)
-		if lcp != test.prefix {
-			t.Errorf("%s != %s for %+v", lcp, test.prefix, test.list)
-		}
-	}
-}
diff --git a/third_party/liner/race_test.go b/third_party/liner/race_test.go
deleted file mode 100644
index e320849..0000000
--- a/third_party/liner/race_test.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// +build race
-
-package liner
-
-import (
-	"io/ioutil"
-	"os"
-	"sync"
-	"testing"
-)
-
-func TestWriteHistory(t *testing.T) {
-	oldout := os.Stdout
-	defer func() { os.Stdout = oldout }()
-	oldin := os.Stdout
-	defer func() { os.Stdin = oldin }()
-
-	newinr, newinw, err := os.Pipe()
-	if err != nil {
-		t.Fatal(err)
-	}
-	os.Stdin = newinr
-	newoutr, newoutw, err := os.Pipe()
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer newoutr.Close()
-	os.Stdout = newoutw
-
-	var wait sync.WaitGroup
-	wait.Add(1)
-	s := NewLiner()
-	go func() {
-		s.AppendHistory("foo")
-		s.AppendHistory("bar")
-		s.Prompt("")
-		wait.Done()
-	}()
-
-	s.WriteHistory(ioutil.Discard)
-
-	newinw.Close()
-	wait.Wait()
-}
diff --git a/third_party/liner/signal.go b/third_party/liner/signal.go
deleted file mode 100644
index 0cba79e..0000000
--- a/third_party/liner/signal.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// +build go1.1,!windows
-
-package liner
-
-import (
-	"os"
-	"os/signal"
-)
-
-func stopSignal(c chan<- os.Signal) {
-	signal.Stop(c)
-}
diff --git a/third_party/liner/signal_legacy.go b/third_party/liner/signal_legacy.go
deleted file mode 100644
index fa3672d..0000000
--- a/third_party/liner/signal_legacy.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// +build !go1.1,!windows
-
-package liner
-
-import (
-	"os"
-)
-
-func stopSignal(c chan<- os.Signal) {
-	// signal.Stop does not exist before Go 1.1
-}
diff --git a/third_party/liner/unixmode.go b/third_party/liner/unixmode.go
deleted file mode 100644
index 9838923..0000000
--- a/third_party/liner/unixmode.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// +build linux darwin freebsd openbsd netbsd
-
-package liner
-
-import (
-	"syscall"
-	"unsafe"
-)
-
-func (mode *termios) ApplyMode() error {
-	_, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(syscall.Stdin), setTermios, uintptr(unsafe.Pointer(mode)))
-
-	if errno != 0 {
-		return errno
-	}
-	return nil
-}
-
-// TerminalMode returns the current terminal input mode as an InputModeSetter.
-//
-// This function is provided for convenience, and should
-// not be necessary for most users of liner.
-func TerminalMode() (ModeApplier, error) {
-	mode, errno := getMode(syscall.Stdin)
-
-	if errno != 0 {
-		return nil, errno
-	}
-	return mode, nil
-}
-
-func getMode(handle int) (*termios, syscall.Errno) {
-	var mode termios
-	_, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(handle), getTermios, uintptr(unsafe.Pointer(&mode)))
-
-	return &mode, errno
-}
diff --git a/third_party/liner/width.go b/third_party/liner/width.go
deleted file mode 100644
index d8984aa..0000000
--- a/third_party/liner/width.go
+++ /dev/null
@@ -1,79 +0,0 @@
-package liner
-
-import "unicode"
-
-// These character classes are mostly zero width (when combined).
-// A few might not be, depending on the user's font. Fixing this
-// is non-trivial, given that some terminals don't support
-// ANSI DSR/CPR
-var zeroWidth = []*unicode.RangeTable{
-	unicode.Mn,
-	unicode.Me,
-	unicode.Cc,
-	unicode.Cf,
-}
-
-var doubleWidth = []*unicode.RangeTable{
-	unicode.Han,
-	unicode.Hangul,
-	unicode.Hiragana,
-	unicode.Katakana,
-}
-
-// countGlyphs considers zero-width characters to be zero glyphs wide,
-// and members of Chinese, Japanese, and Korean scripts to be 2 glyphs wide.
-func countGlyphs(s []rune) int {
-	n := 0
-	for _, r := range s {
-		switch {
-		case unicode.IsOneOf(zeroWidth, r):
-		case unicode.IsOneOf(doubleWidth, r):
-			n += 2
-		default:
-			n++
-		}
-	}
-	return n
-}
-
-func countMultiLineGlyphs(s []rune, columns int, start int) int {
-	n := start
-	for _, r := range s {
-		switch {
-		case unicode.IsOneOf(zeroWidth, r):
-		case unicode.IsOneOf(doubleWidth, r):
-			n += 2
-			// no room for a 2-glyphs-wide char in the ending
-			// so skip a column and display it at the beginning
-			if n%columns == 1 {
-				n++
-			}
-		default:
-			n++
-		}
-	}
-	return n
-}
-
-func getPrefixGlyphs(s []rune, num int) []rune {
-	p := 0
-	for n := 0; n < num && p < len(s); p++ {
-		if !unicode.IsOneOf(zeroWidth, s[p]) {
-			n++
-		}
-	}
-	for p < len(s) && unicode.IsOneOf(zeroWidth, s[p]) {
-		p++
-	}
-	return s[:p]
-}
-
-func getSuffixGlyphs(s []rune, num int) []rune {
-	p := len(s)
-	for n := 0; n < num && p > 0; p-- {
-		if !unicode.IsOneOf(zeroWidth, s[p-1]) {
-			n++
-		}
-	}
-	return s[p:]
-}
diff --git a/third_party/liner/width_test.go b/third_party/liner/width_test.go
deleted file mode 100644
index add779c..0000000
--- a/third_party/liner/width_test.go
+++ /dev/null
@@ -1,102 +0,0 @@
-package liner
-
-import (
-	"strconv"
-	"testing"
-)
-
-func accent(in []rune) []rune {
-	var out []rune
-	for _, r := range in {
-		out = append(out, r)
-		out = append(out, '\u0301')
-	}
-	return out
-}
-
-type testCase struct {
-	s      []rune
-	glyphs int
-}
-
-var testCases = []testCase{
-	{[]rune("query"), 5},
-	{[]rune("私"), 2},
-	{[]rune("hello世界"), 9},
-}
-
-func TestCountGlyphs(t *testing.T) {
-	for _, testCase := range testCases {
-		count := countGlyphs(testCase.s)
-		if count != testCase.glyphs {
-			t.Errorf("ASCII count incorrect. %d != %d", count, testCase.glyphs)
-		}
-		count = countGlyphs(accent(testCase.s))
-		if count != testCase.glyphs {
-			t.Errorf("Accent count incorrect. %d != %d", count, testCase.glyphs)
-		}
-	}
-}
-
-func compare(a, b []rune, name string, t *testing.T) {
-	if len(a) != len(b) {
-		t.Errorf(`"%s" != "%s" in %s"`, string(a), string(b), name)
-		return
-	}
-	for i := range a {
-		if a[i] != b[i] {
-			t.Errorf(`"%s" != "%s" in %s"`, string(a), string(b), name)
-			return
-		}
-	}
-}
-
-func TestPrefixGlyphs(t *testing.T) {
-	for _, testCase := range testCases {
-		for i := 0; i <= len(testCase.s); i++ {
-			iter := strconv.Itoa(i)
-			out := getPrefixGlyphs(testCase.s, i)
-			compare(out, testCase.s[:i], "ascii prefix "+iter, t)
-			out = getPrefixGlyphs(accent(testCase.s), i)
-			compare(out, accent(testCase.s[:i]), "accent prefix "+iter, t)
-		}
-		out := getPrefixGlyphs(testCase.s, 999)
-		compare(out, testCase.s, "ascii prefix overflow", t)
-		out = getPrefixGlyphs(accent(testCase.s), 999)
-		compare(out, accent(testCase.s), "accent prefix overflow", t)
-
-		out = getPrefixGlyphs(testCase.s, -3)
-		if len(out) != 0 {
-			t.Error("ascii prefix negative")
-		}
-		out = getPrefixGlyphs(accent(testCase.s), -3)
-		if len(out) != 0 {
-			t.Error("accent prefix negative")
-		}
-	}
-}
-
-func TestSuffixGlyphs(t *testing.T) {
-	for _, testCase := range testCases {
-		for i := 0; i <= len(testCase.s); i++ {
-			iter := strconv.Itoa(i)
-			out := getSuffixGlyphs(testCase.s, i)
-			compare(out, testCase.s[len(testCase.s)-i:], "ascii suffix "+iter, t)
-			out = getSuffixGlyphs(accent(testCase.s), i)
-			compare(out, accent(testCase.s[len(testCase.s)-i:]), "accent suffix "+iter, t)
-		}
-		out := getSuffixGlyphs(testCase.s, 999)
-		compare(out, testCase.s, "ascii suffix overflow", t)
-		out = getSuffixGlyphs(accent(testCase.s), 999)
-		compare(out, accent(testCase.s), "accent suffix overflow", t)
-
-		out = getSuffixGlyphs(testCase.s, -3)
-		if len(out) != 0 {
-			t.Error("ascii suffix negative")
-		}
-		out = getSuffixGlyphs(accent(testCase.s), -3)
-		if len(out) != 0 {
-			t.Error("accent suffix negative")
-		}
-	}
-}
diff --git a/update_third_party.sh b/update_third_party.sh
deleted file mode 100755
index 9b9daed..0000000
--- a/update_third_party.sh
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/bin/sh -e
-
-scriptpath=$(readlink -f "$0")
-llgosrcdir=$(dirname "$scriptpath")
-cd $llgosrcdir
-
-gofrontendrepo=https://go.googlesource.com/gofrontend
-gofrontendrev=81eb6a3f425b2158c67ee32c0cc973a72ce9d6be
-
-gccrepo=svn://gcc.gnu.org/svn/gcc/trunk
-gccrev=219477
-
-gotoolsrepo=https://go.googlesource.com/tools
-gotoolsrev=d4e70101500b43ffe705d4c45e50dd4f1c8e3b2e
-
-linerrepo=https://github.com/peterh/liner.git
-linerrev=4d47685ab2fd2dbb46c66b831344d558bc4be5b9
-
-tempdir=$(mktemp -d /tmp/update_third_party.XXXXXX)
-gofrontenddir=$tempdir/gofrontend
-gotoolsdir=$tempdir/go.tools
-linerdir=third_party/liner
-
-rm -rf third_party
-mkdir -p third_party/gofrontend third_party/gotools
-
-git_clone() {
-    repo=$1
-    dir=$2
-    rev=$3
-    git clone $repo $dir
-    (
-        cd $dir
-        git checkout $rev
-        rm -fr .git
-    )
-}
-
-# --------------------- gofrontend ---------------------
-
-git_clone $gofrontendrepo $gofrontenddir $gofrontendrev
-
-cp -r $gofrontenddir/LICENSE $gofrontenddir/libgo third_party/gofrontend
-
-# Apply a diff that eliminates use of the unnamed struct extension beyond what
-# -fms-extensions supports.
-(cd third_party/gofrontend && patch -p1) < libgo-noext.diff
-# Apply a diff that disables testing of packages known to fail.
-(cd third_party/gofrontend && patch -p1) < libgo-check-failures.diff
-find third_party/gofrontend -name '*.orig' -exec rm \{\} \;
-
-# Remove GPL licensed files.
-rm \
-  third_party/gofrontend/libgo/testsuite/libgo.testmain/testmain.exp \
-  third_party/gofrontend/libgo/testsuite/lib/libgo.exp \
-  third_party/gofrontend/libgo/testsuite/config/default.exp
-
-# --------------------- gcc ---------------------
-
-# Some dependencies are stored in the gcc repository.
-# TODO(pcc): Ask iant about mirroring these dependencies into gofrontend.
-
-for f in config-ml.in depcomp install-sh ltmain.sh missing ; do
-  svn cat -r $gccrev $gccrepo/$f > third_party/gofrontend/$f
-done
-
-mkdir -p third_party/gofrontend/include third_party/gofrontend/libgcc
-
-# Copy in our versions of GCC files.
-cp include/dwarf2.h third_party/gofrontend/include/
-cp include/filenames.h third_party/gofrontend/include/
-cp include/unwind-pe.h third_party/gofrontend/libgcc/
-
-# Note: this expects the llgo source tree to be located at llvm/tools/llgo.
-cp ../../cmake/config.guess third_party/gofrontend/
-cp autoconf/config.sub third_party/gofrontend/
-
-for d in libbacktrace libffi ; do
-  svn export -r $gccrev $gccrepo/$d third_party/gofrontend/$d
-done
-
-# Remove GPL licensed files, and files that confuse our license check.
-rm \
-  third_party/gofrontend/libffi/ChangeLog \
-  third_party/gofrontend/libffi/doc/libffi.texi \
-  third_party/gofrontend/libffi/msvcc.sh \
-  third_party/gofrontend/libffi/testsuite/config/default.exp \
-  third_party/gofrontend/libffi/testsuite/libffi.call/call.exp \
-  third_party/gofrontend/libffi/testsuite/libffi.complex/complex.exp \
-  third_party/gofrontend/libffi/testsuite/libffi.go/go.exp \
-  third_party/gofrontend/libffi/testsuite/libffi.special/special.exp \
-  third_party/gofrontend/libffi/testsuite/lib/libffi.exp \
-  third_party/gofrontend/libffi/testsuite/lib/target-libpath.exp \
-  third_party/gofrontend/libffi/testsuite/lib/wrapper.exp
-
-# The build requires these files to exist.
-touch \
-  third_party/gofrontend/include/dwarf2.def \
-  third_party/gofrontend/libffi/doc/libffi.texi
-
-# --------------------- go.tools ---------------------
-
-git_clone $gotoolsrepo $gotoolsdir $gotoolsrev
-
-cp -r $gotoolsdir/LICENSE $gotoolsdir/go third_party/gotools
-
-# Vendor the go.tools repository.
-find third_party/gotools -name '*.go' | xargs sed -i -e \
-  's,"golang.org/x/tools/,"llvm.org/llgo/third_party/gotools/,g'
-
-# --------------------- peterh/liner -----------------
-
-git_clone $linerrepo $linerdir $linerrev
-
-# --------------------- license check ---------------------
-
-# We don't want any GPL licensed code without an autoconf/libtool
-# exception, or any GPLv3 licensed code.
-
-for i in `grep -lr 'General Public License' third_party` ; do
-  if grep -q 'configuration script generated by Autoconf, you may include it under' $i || \
-     grep -q 'is built using GNU Libtool, you may include this file under the' $i ; then
-    :
-  else
-    echo "$i: license check failed"
-    exit 1
-  fi
-done
-
-if grep -qr GPLv3 third_party ; then
-  echo "`grep -lr GPLv3 third_party`: license check failed"
-  exit 1
-fi
-
-rm -rf $tempdir
diff --git a/utils/benchcomp/README b/utils/benchcomp/README
deleted file mode 100644
index 38a8a59..0000000
--- a/utils/benchcomp/README
+++ /dev/null
@@ -1,20 +0,0 @@
-These are some quick and dirty tools for measuring the performance impact
-of a change to llgo by sampling the results of running the libgo benchmark
-suite. They can be used to calculate the geo-mean and 95% confidence interval
-using the Student's t-test. The benchcomp program massages the output of the
-Go benchmark tools into a form that can be read by the R program analyze.R
-which runs the statistics.
-
-To use, clpatch this into gofrontend:
-https://codereview.appspot.com/103550047/
-
-then run:
-
-make
-make -C workdir/gofrontend_build/libgo-stage1 bench 2>&1 | tee before.out
-# make changes
-make
-make -C workdir/gofrontend_build/libgo-stage1 bench 2>&1 | tee after.out
-utils/benchcomp/benchcomp benchns before.out after.out | R -f utils/benchcomp/analyze.R
-
-The results should be displayed on stdout.
diff --git a/utils/benchcomp/analyze.R b/utils/benchcomp/analyze.R
deleted file mode 100644
index 2efa787..0000000
--- a/utils/benchcomp/analyze.R
+++ /dev/null
@@ -1,15 +0,0 @@
-sc <- read.table(file('stdin'))
-scratio <- sc$V2 / sc$V3
-scratio <- scratio[scratio > 0]
-
-# Take the log of the ratio. Our null hypothesis is a normal distribution
-# around zero.
-tt <- t.test(log(scratio))
-tt
-
-# This gives us the geo-mean as we are taking the exponent of the linear mean
-# of logarithms.
-1 - 1/exp(tt$estimate)
-
-# Likewise for the confidence interval.
-1 - 1/exp(tt$conf.int)
diff --git a/utils/benchcomp/main.go b/utils/benchcomp/main.go
deleted file mode 100644
index 69eb6d1..0000000
--- a/utils/benchcomp/main.go
+++ /dev/null
@@ -1,192 +0,0 @@
-package main
-
-import (
-	"bufio"
-	"debug/elf"
-	"debug/macho"
-	"fmt"
-	"os"
-	"path/filepath"
-	"sort"
-	"strconv"
-	"strings"
-)
-
-func symsizes(path string) map[string]float64 {
-	m := make(map[string]float64)
-	f, err := elf.Open(path)
-	if err != nil {
-		panic(err.Error())
-	}
-	syms, err := f.Symbols()
-	if err != nil {
-		panic(err.Error())
-	}
-	for _, sym := range syms {
-		if sym.Section < elf.SectionIndex(len(f.Sections)) && strings.HasPrefix(f.Sections[sym.Section].Name, ".text") {
-			m[sym.Name] = float64(sym.Size)
-		}
-	}
-	return m
-}
-
-type bySectionThenOffset []macho.Symbol
-
-func (syms bySectionThenOffset) Len() int {
-	return len(syms)
-}
-
-func (syms bySectionThenOffset) Less(i, j int) bool {
-	if syms[i].Sect < syms[j].Sect {
-		return true
-	}
-	if syms[i].Sect > syms[j].Sect {
-		return false
-	}
-	return syms[i].Value < syms[j].Value
-}
-
-func (syms bySectionThenOffset) Swap(i, j int) {
-	syms[i], syms[j] = syms[j], syms[i]
-}
-
-func macho_symsizes(path string) map[string]float64 {
-	m := make(map[string]float64)
-	f, err := macho.Open(path)
-	if err != nil {
-		panic(err.Error())
-	}
-	syms := make([]macho.Symbol, len(f.Symtab.Syms))
-	copy(syms, f.Symtab.Syms)
-	sort.Sort(bySectionThenOffset(syms))
-	for i, sym := range syms {
-		if sym.Sect == 0 {
-			continue
-		}
-		var nextOffset uint64
-		if i == len(syms)-1 || syms[i+1].Sect != sym.Sect {
-			nextOffset = f.Sections[sym.Sect-1].Size
-		} else {
-			nextOffset = syms[i+1].Value
-		}
-		m[sym.Name] = float64(nextOffset - sym.Value)
-	}
-	return m
-}
-
-func benchnums(path, stat string) map[string]float64 {
-	m := make(map[string]float64)
-
-	fh, err := os.Open(path)
-	if err != nil {
-		panic(err.Error())
-	}
-
-	scanner := bufio.NewScanner(fh)
-	for scanner.Scan() {
-		elems := strings.Split(scanner.Text(), "\t")
-		if !strings.HasPrefix(elems[0], "Benchmark") || len(elems) < 3 {
-			continue
-		}
-		var s string
-		for _, elem := range elems[2:] {
-			selems := strings.Split(strings.TrimSpace(elem), " ")
-			if selems[1] == stat {
-				s = selems[0]
-			}
-		}
-		if s != "" {
-			ns, err := strconv.ParseFloat(s, 64)
-			if err != nil {
-				panic(scanner.Text() + " ---- " + err.Error())
-			}
-			m[elems[0]] = ns
-		}
-	}
-
-	if err := scanner.Err(); err != nil {
-		panic(err)
-	}
-
-	return m
-}
-
-func ninja_logs(path string) map[string]float64 {
-	m := make(map[string]float64)
-
-	fh, err := os.Open(path)
-	if err != nil {
-		panic(err.Error())
-	}
-
-	scanner := bufio.NewScanner(fh)
-	for scanner.Scan() {
-		elems := strings.Split(scanner.Text(), "\t")
-		if len(elems) < 4 {
-			continue
-		}
-		begin, err := strconv.ParseInt(elems[0], 10, 64)
-		if err != nil {
-			continue
-		}
-		end, err := strconv.ParseInt(elems[1], 10, 64)
-		if err != nil {
-			panic(err.Error())
-		}
-		m[elems[3]] = float64(end-begin)
-	}
-
-	return m
-}
-
-func filesizes(root string) map[string]float64 {
-	m := make(map[string]float64)
-
-	err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
-		if info.Mode().IsRegular() {
-			m[path[len(root):]] = float64(info.Size())
-		}
-		return nil
-	})
-	if err != nil {
-		panic(err.Error())
-	}
-
-	return m
-}
-
-func main() {
-	var cmp func(string) map[string]float64
-	switch os.Args[1] {
-	case "symsizes":
-		cmp = symsizes
-
-	case "macho_symsizes":
-		cmp = macho_symsizes
-
-	case "benchns":
-		cmp = func(path string) map[string]float64 {
-			return benchnums(path, "ns/op")
-		}
-
-	case "benchallocs":
-		cmp = func(path string) map[string]float64 {
-			return benchnums(path, "allocs/op")
-		}
-
-	case "ninja_logs":
-		cmp = ninja_logs
-
-	case "filesizes":
-		cmp = filesizes
-	}
-
-	syms1 := cmp(os.Args[2])
-	syms2 := cmp(os.Args[3])
-
-	for n, z1 := range syms1 {
-		if z2, ok := syms2[n]; ok && z2 != 0 {
-			fmt.Printf("%s %f %f %f\n", n, z1, z2, z1/z2)
-		}
-	}
-}